saods9/000755 000765 000000 00000000000 12634602261 012366 5ustar00joyewheel000000 000000 saods9/COPYING000644 000765 000000 00000077330 12061452202 013423 0ustar00joyewheel000000 000000 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 saods9/copyright000644 000765 000000 00000001604 12634112672 014324 0ustar00joyewheel000000 000000 Copyright (C) 1999-2015 Smithsonian Astrophysical Observatory, Cambridge, MA, USA This program is free software: you can 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 . Correspondence concerning SAOImage DS9 should be addressed as follows: William Joye Smithsonian Astrophysical Observatory 60 Garden St. Cambridge, MA 02138 USA wjoye@cfa.harvard.edu http://ds9.si.edu/ saods9/ds9/000755 000765 000000 00000000000 12634602226 013066 5ustar00joyewheel000000 000000 saods9/macosx/000755 000765 000000 00000000000 12634602227 013662 5ustar00joyewheel000000 000000 saods9/make.include000644 000765 000000 00000024602 12632613067 014660 0ustar00joyewheel000000 000000 include ./make.pkgs #--------------------------dirs DIRS = bin lib include man share dist #--------------------------cvs stuff CVSFILES = admin \ compilers \ COPYING \ copyright \ ds9 \ macosx \ make.include \ make.pkgs \ mods \ notes.txt \ README \ tclcheckdns1.1 \ tcliis1.0 \ tclsignal1.4 \ tclzvfs1.0 \ tests \ tkblt3.0 \ tkhtml1.0 \ tkmacosx1.0 \ tkmpeg1.0 \ tksao1.0 \ tkwin1.0 \ unix \ win #--------------------------main .NOTPARALLEL : .PHONY : all dirs ds9 tclcheckdns tcliis tclsignal tclxml tclzvfs .PHONY : tkblt tkcon tkhtml tkimg libtiff tkmpeg tksao tktable xmlrpc xpa all : saods9 dirs : @echo "" @echo "*** Install $@ ***" @for d in $(DIRS); do if [ ! -d $$d ]; then mkdir $$d; fi done ds9 : scrub $(DS9DIR)/$(OS)/Makefile @echo "" @echo "*** Installing $(DS9DIR) ***" $(MAKE) -C $(DS9DIR)/$(OS) debug : scrub $(DS9DIR)/$(OS)/Makefile @echo "" @echo "*** Installing $(DS9DIR) ***" $(MAKE) -C $(DS9DIR)/$(OS) debug $(DS9DIR)/$(OS)/Makefile : @echo "" @echo "*** Configure $(DS9DIR) ***" cd $(DS9DIR)/$(OS); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --enable-symbols \ --config-cache --cache-file=../../config.cache tclcheckdns : $(TCLCHECKDNSDIR)/Makefile @echo "" @echo "*** Install $(TCLCHECKDNSDIR) ***" $(MAKE) -C $(TCLCHECKDNSDIR) -j $(JOBS) install $(TCLCHECKDNSDIR)/Makefile : @echo "" @echo "*** Configure $(TCLCHECKDNSDIR) ***" cd $(TCLCHECKDNSDIR); \ ./configure \ $(WITHTCL) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tcliis : $(TCLIISDIR)/Makefile @echo "" @echo "*** Install $(TCLIISDIR) ***" $(MAKE) -C $(TCLIISDIR) -j $(JOBS) install $(TCLIISDIR)/Makefile : @echo "" @echo "*** Configure $(TCLIISDIR) ***" cd $(TCLIISDIR); \ ./configure \ $(WITHTCL) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tclsignal: $(TCLSIGNALDIR)/Makefile @echo "" @echo "*** Install $(TCLSIGNALDIR) ***" $(MAKE) -C $(TCLSIGNALDIR) install $(TCLSIGNALDIR)/Makefile : @echo "" @echo "*** Configure $(TCLSIGNALDIR) ***" cd $(TCLSIGNALDIR); \ ./configure \ $(WITHTCL) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache # no parallel tclxml : $(TCLXMLDIR)/Makefile @echo "" @echo "*** Install $(TCLXMLDIR) ***" $(MAKE) -C $(TCLXMLDIR) install $(TCLXMLDIR)/Makefile : @echo "" @echo "*** Configure $(TCLXMLDIR) ***" cd $(TCLXMLDIR); \ ./configure \ $(WITHTCL) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tclzvfs : $(TCLZVFSDIR)/Makefile @echo "" @echo "*** Install $(TCLZVFSDIR) ***" $(MAKE) -C $(TCLZVFSDIR) install $(TCLZVFSDIR)/Makefile : @echo "" @echo "*** Configure $(TCLZVFSDIR) ***" cd $(TCLZVFSDIR); \ ./configure \ $(WITHTCL) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tkblt : $(TKBLTDIR)/Makefile @echo "" @echo "*** Install $(TKBLTDIR) ***" $(MAKE) -C $(TKBLTDIR) -j $(JOBS) install $(TKBLTDIR)/Makefile : @echo "" @echo "*** Configure $(TKBLTDIR) ***" cd $(TKBLTDIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tkcon : @echo "" @echo "*** Install $@ ***" $(RM) -r lib/$(TKCONVER) mkdir lib/$(TKCONVER) cp $(TKCONDIR)/*.tcl lib/$(TKCONVER) # no parallel tkhtml : $(TKHTMLDIR)/Makefile @echo "" @echo "*** Install $(TKHTMLDIR) ***" $(MAKE) -C $(TKHTMLDIR) install $(TKHTMLDIR)/Makefile : @echo "" @echo "*** Configure $(TKHTMLDIR) ***" cd $(TKHTMLDIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tkimg : libtiff $(TKIMGDIR)/Makefile @echo "" @echo "*** Install $(TKIMGDIR) ***" $(MAKE) -C $(TKIMGDIR) -j $(JOBS) install # no config.cache $(TKIMGDIR)/Makefile : @echo "" @echo "*** Configure $(TKIMGDIR) ***" cd $(TKIMGDIR); \ ./configure CFLAGS='-DPNG_NO_WRITE_gAMA' \ $(WITHTK) $(TKIMGFLAGS) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols libtiff : $(TKIMGDIR)/compat/libtiff/Makefile @echo "" @echo "*** Install $(TKIMGDIR)/compat/libtiff ***" $(MAKE) -C $(TKIMGDIR)/compat/libtiff -j $(JOBS) install # no enable-symbols $(TKIMGDIR)/compat/libtiff/Makefile : @echo "" @echo "*** Configure $(TKIMGDIR)/compat/libtiff ***" cd $(TKIMGDIR)/compat/libtiff; \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared tkmpeg : $(TKMPEGDIR)/Makefile @echo "" @echo "*** Install $(TKMPEGDIR) ***" $(MAKE) -C $(TKMPEGDIR) -j $(JOBS) install $(TKMPEGDIR)/Makefile : @echo "" @echo "*** Configure $(TKMPEGDIR) ***" cd $(TKMPEGDIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache tksao : $(TKSAODIR)/Makefile @echo "" @echo "*** Install $(TKSAODIR) ***" $(MAKE) -C $(TKSAODIR) -j $(JOBS) install $(TKSAODIR)/Makefile : @echo "" @echo "*** Configure $(TKSAODIR) ***" cd $(TKSAODIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache \ ASTDIR=$(ASTDIR) FUNTOOLSDIR=$(FUNTOOLSDIR) # no parallel tktable : $(TKTABLEDIR)/Makefile @echo "" @echo "*** Install $(TKTABLEDIR) ***" $(MAKE) -C $(TKTABLEDIR) install $(TKTABLEDIR)/Makefile : @echo "" @echo "*** Configure $(TKTABLEDIR) ***" cd $(TKTABLEDIR); \ ./configure \ $(WITHTK) $(TKTABLEFLAGS) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../config.cache xmlrpc : @echo "" @echo "*** Install $@ ***" $(RM) -r lib/$(XMLRPCVER) mkdir lib/$(XMLRPCVER) cp $(XMLRPCDIR)/xmlrpc.tcl lib/$(XMLRPCVER) # no config.cache xpa : $(XPADIR)/Makefile @echo "" @echo "*** Install $(XPADIR) ***" $(MAKE) -C $(XPADIR) -j $(JOBS) install $(XPADIR)/Makefile : @echo "" @echo "*** Configure $(XPADIR) ***" cd $(XPADIR); \ ./configure \ $(WITHTCL) $(XPAFLAGS) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --with-x=disabled --enable-posix_spawn #--------------------------language .PHONY : language language: cd ds9; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl da iso8859-1; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl de iso8859-1; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl es iso8859-1; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl fr iso8859-1; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl pt iso8859-1; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl cs iso8859-2; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl ja euc-jp; \ grep 'msgcat::mc' library/*.tcl | tclsh8.6 util/mergedict.tcl zh big5 #--------------------------scrub .PHONY : scrub scrub : find . -name "*[~#]" -exec rm {} \; #--------------------------clean .PHONY : clean .PHONY : dirsclean ds9clean localclean .PHONY : tclclean tclcheckdnsclean tcliisclean tclsignalclean .PHONY : tclxmlclean tclzvfsclean .PHONY : tkclean tkbltclean tkhtmlclean tkimgclean libtiffclean .PHONY : tkmpegclean tksaoclean tktableclean xpaclean clean : dirsclean tclclean tkclean \ tclcheckdnsclean tcliisclean tclsignalclean \ tclzvfsclean tclxmlclean xpaclean \ tkbltclean tktableclean tkimgclean \ tkmpegclean tkhtmlclean \ tk$(OS)clean \ tksaoclean ds9clean \ localclean dirsclean : @for d in $(DIRS); do rm -rf $$d; done ds9clean : $(MAKE) -C $(DS9DIR)/$(OS) clean localclean : -rm -f core *~ *# tclclean : $(MAKE) -C $(TCLDIR)/$(OS) clean tclcheckdnsclean : $(MAKE) -C $(TCLCHECKDNSDIR) clean tcliisclean : $(MAKE) -C $(TCLIISDIR) clean tclsignalclean : $(MAKE) -C $(TCLSIGNALDIR) clean tclxmlclean: $(MAKE) -C $(TCLXMLDIR) clean tclzvfsclean: $(MAKE) -C $(TCLZVFSDIR) clean tkclean : $(MAKE) -C $(TKDIR)/$(OS) clean tkbltclean: $(MAKE) -C $(TKBLTDIR) clean tkhtmlclean: $(MAKE) -C $(TKHTMLDIR) clean tkimgclean: libtiffclean rm -fr $(TKIMGDIR)/Img/* rm -fr lib/Img1.* $(MAKE) -C $(TKIMGDIR) clean libtiffclean: $(MAKE) -C $(TKIMGDIR)/compat/libtiff clean tkmpegclean: $(MAKE) -C $(TKMPEGDIR) clean tksaoclean : $(MAKE) -C $(TKSAODIR) clean tktableclean: $(MAKE) -C $(TKTABLEDIR) clean xpaclean : $(MAKE) -C $(XPADIR) clean #--------------------------distclean .PHONY : dirsdistclean ds9distclean localdistclean .PHONY : tcldistclean tclcheckdnsdistclean tcliisdistclean tclsignaldistclean .PHONY : tclxmldistclean tclzvfsdistclean .PHONY : tkdistclean tkbltdistclean tkhtmldistclean tkimgdistclean .PHONY : libtiffdistclean tkmpegdistclean tksaodistclean .PHONY : tktabledistclean xpadistclean distclean : tcldistclean tkdistclean \ tclcheckdnsdistclean tcliisdistclean tclsignaldistclean \ tclzvfsdistclean tclxmldistclean xpadistclean \ tkbltdistclean tktabledistclean tkimgdistclean \ tkmpegdistclean tkhtmldistclean \ tk$(OS)distclean \ tksaodistclean ds9distclean \ dirsdistclean localdistclean dirsdistclean: @for d in $(DIRS); do rm -rf $$d; done ds9distclean : $(MAKE) -C $(DS9DIR)/$(OS) distclean localdistclean : localclean -rm -f config.log config.status config.cache Makefile tcldistclean : $(MAKE) -C $(TCLDIR)/$(OS) distclean tclcheckdnsdistclean : $(MAKE) -C $(TCLCHECKDNSDIR) distclean tcliisdistclean : $(MAKE) -C $(TCLIISDIR) distclean tclsignaldistclean : $(MAKE) -C $(TCLSIGNALDIR) distclean tclxmldistclean: $(MAKE) -C $(TCLXMLDIR) distclean tclzvfsdistclean: $(MAKE) -C $(TCLZVFSDIR) distclean tkdistclean : $(MAKE) -C $(TKDIR)/$(OS) distclean tkbltdistclean: $(MAKE) -C $(TKBLTDIR) distclean tkhtmldistclean: $(MAKE) -C $(TKHTMLDIR) distclean tkimgdistclean: libtiffdistclean rm -fr $(TKIMGDIR)/Img/* rm -fr lib/Img1.* $(MAKE) -C $(TKIMGDIR) distclean libtiffdistclean: $(MAKE) -C $(TKIMGDIR)/compat/libtiff distclean tkmpegdistclean: $(MAKE) -C $(TKMPEGDIR) distclean tksaodistclean : $(MAKE) -C $(TKSAODIR) distclean tktabledistclean: $(MAKE) -C $(TKTABLEDIR) distclean xpadistclean : $(MAKE) -C $(XPADIR) distclean #--------------------------cvs .PHONY : commit update commit : scrub cvs commit -m "" $(CVSFILES) update : scrub cvs update $(CVSFILES) saods9/make.pkgs000644 000765 000000 00000001433 12632624340 014172 0ustar00joyewheel000000 000000 #--------------------------basic DS9VERSION=7.4 XPAVERSION=2.1.14 #--------------------------version TCLVER=tcl8.6 TKVER=tk8.6 TCLLIBVER=tcllib1.15 TCLXMLVER=Tclxml3.2 TKCONVER=tkcon2.5 TKIMGVER=Img1.4 TKTABLEVER=Tktable2.10 XMLRPCVER=xmlrpc0.3 #--------------------------dir DS9DIR=ds9 ASTDIR=ast-8.0.2 FUNTOOLSDIR=funtools-1.4.5 TCLCHECKDNSDIR=tclcheckdns1.1 TCLDIR=tcl8.6.4 TCLIISDIR=tcliis1.0 TCLLIBDIR=tcllib-1.15 TCLSIGNALDIR=tclsignal1.4 TCLXMLDIR=tclxml-3.2 TCLZVFSDIR=tclzvfs1.0 TKBLTDIR=tkblt3.0 TKCONDIR=tkcon-2.5 TKDIR=tk8.6.4 TKHTMLDIR=tkhtml1.0 TKIMGDIR=tkimg1.4 TKMACOSXDIR=tkmacosx1.0 TKMPEGDIR=tkmpeg1.0 TKSAODIR=tksao1.0 TKTABLEDIR=tktable2.10 TKWINDIR=tkwin1.0 XMLRPCDIR=xmlrpc-0.3 XPADIR=xpa-2.1.14 #--------------------------compilers TCC=tcc-0.9.25-win32-bin.zip saods9/mods/000755 000765 000000 00000000000 12634602227 013332 5ustar00joyewheel000000 000000 saods9/notes.txt000644 000765 000000 00000047351 12634563034 014275 0ustar00joyewheel000000 000000 Ports: kendall MacOSX 10.8 Mountainlion (12.6.0) wonderland MacOSX 10.9 Mavericks (13.4.0) riverside MacOSX 10.10 Yosemite (14.3.0) bokhara CentOS-6.x 64bit mond CentOS-5.x 64bit quango CentOS-5.x 32bit Website: bokhara:/proj/web-ds9 ds9:/var/log/httpd Source: ast http://starlink.eao.hawaii.edu/starlink/AST rm ast/cminpack/.deps rm ast/f77.h rm ast/object.h rm ast/ast_link_adam wcssubs ftp://cfa-ftp.harvard.edu/pub/gsc/WCSTools wcslib http://www.atnf.csiro.au/people/Mark.Calabretta/WCS/ funtools /data/mmti/CVSROOT pcc http://pcc.ludd.ltu.se/ http://pcc.ludd.ltu.se/ftp/pub/pcc/ http://pcc.ludd.ltu.se/ftp/pub/pcc-libs/ tcc http://bellard.org/tcc/ Build: # cvs- back out changes cvs update -j 1.5 -j 1.4 foo.c # reset sticky tag cvs update -A HTML Comment: Future: MacOSX printing XPAInfo WCS Editor/Astrometry.net Documentation/Tutorials Catalog To Image/3d cube Editing (add/delete) GUI editor Button/Keystroke 1D SpecFrame CDS HIPS MocServer: http://alasky.unistra.fr/MocServer/query VO Image Archive VO/Chandra Footprint server FOV (http://aladin.u-strasbg.fr/java/FOVs.xml) Illustrate mode Non-Model File Browser FITS structure viewer 2D surface plot List -7.4 block() wfpc2 don't reset crop commandline section,block blockToFit mosaic blockToFit crop Save Fits RGB (load *.fits, save RGBImage) Spectrum plot tool change current slice from plot fitting new photometry region ipac irass gator catalogs? http://irsa.ipac.caltech.edu/docs/howto/gator_prog_interface.html filename[params] tests fits[params] bintable[params] hpxtable[params] array[params] pthread 3d (frame3d.h) bin? cleanup Base::IRAFOrientation() masks bin table: block in/out slice mosaic slice mosaicimagewfpc2 crop() save fits keywords (wcs,iraf) mosaic namespaces itcl catalogs markers win32 app print filter tclcheckdns tcliis ciao regions fix box rotation Elliptannuls ciao parser EPanda CiaoList tests SECTOR tests fix regions/ds9.fits.reg,ds9.reg.fits add ciao.fits to regions test keychain patches (Ole Streicher) DPI patch (Jeremy Sanders) wcs conversion? (Jouni Ryno) zvfs namespace admin grepfits Makefile shmload Makefile tksao .so tkstub bltstub macosx print tkimg upgrade fix blt line render proc tile prefs grid mode grid direction ime clear frame, load image change 3d slice, update stats, hist, radial, plot2d buttons (statscircle,etc) change task, change cursor for all frames without data update edit params dialog(s) xpa analysis regions select task select position change params dump text,plot tcl incrtcl for markers analysis var for each markers var for each rm updatestatic clean up ProcessRealizeDs9/RealizeDS9/UpdateDs9 -Users Requests Alexey- init file Alexey- redshift units (see email) Diab- bin center from data if no TLMIN/MAX Bringfried- RGB frame saveimage fits as fits data cube -Bugs [ds9|?]parser.Y allow 1e-01" and 1e-01' for vvalue toggle frame (with mosaics) infobox blinks out Fix updating graphs while rotate/zoom/pan Panzoom- update dialog while rotate/zoom/pan small pixel problem (Alexander Menshchikov) make sure image server dialogs are below when saveas rgb, current blue, cut paste regions display header mosaic (one line if all the same) -3D regions compass arrows numerics fix contours shift in magnifier wcszoom for point regions Magnifier- bitbit off by .5? magnifier cursor lock frame (pan problem) panner/widget blank issue while rotating: only at vp=0,0 and depth=1 mosaics (wcs/iraf) macros $url() | $image(3d) zoom[0]!=zoom[1] fix 3d play/next in wcs (3d-5.fits) cleanup frame.C vs frame3d.C -Analysis Imexam/FWHM/surface plot (Paul Weissman) return which button from xpa analysis message ProcessAnalysisCmd- tests/analysis.sh group macro expansion add/replace mouse button analysis bindings. $web(http:chandra-ed.harvard.edu/rebin.html?$XPA_METHOD) marker analysis support($region (select)) sort param variables to fix $sub vs $subimage problem $(shell variable) macro -Backup restore from dss saved image enable regions with plot3d set masks (per context: filename,color,mark) problem alloc/channel/socket/var loads mecube mosaicimage iraf/wfpc2 mosaic iraf -Binning if no TLMIN/MAX, scan data 3rd axis reset after apply dialog specify buffersize dialog specify weight col bin from dialog, option to ignore bin center (Diab) (disregard TDMIN/TDMAX checkbox) Diab binning center with bin<1 DS9_BINKEY rm cols restriction or define DS9_FILTER bin data cube- auto title why scan each time bin? can we save min/max? bin add x:diminsion,y:diminsion to parser (ciao like syntax) -Blink blink mode with fast flash select which frames to blink non-modal dialog (simular to ximtool) -Catalog NonFK5 sky_in sky_out ICRS Comments --- ------ ------- ---- -------- NED yes yes no SIMBAD yes yes yes CDS yes yes no (no ecl) CXC no no no SKYBOT no no no match unique closest error cols histogram plot clear/delete frame, close all catalogs load catalog via stdin filter local catalog at load -Contours parser to handle \r\n from load dos files dashed for neg clip contours to mosaic segment clip overlay contours to image boundries -Crop recal LTM/V, DATASEC keywords regions over crop only fix -crop x y w h wcs galatic arcsec issue -Cube reorder mosaic cubes add slice mosaicimagewcs mosaicimageiraf mosaicimagewfpc2 mosaicwcs mosaiciraf array nrrd -CYGWIN compile warnings segv at startup without window adjust (in panner parser) startup window size changes tiff/jpeg/gif/png load iconify io.sh photo (XPA Stdin/Stdout) nrrd (XPA Stdout) rgbarray (XPA Stdout) cubearray (XPA Stdout) array (XPA Stdout) iraf windows problem (return filename in cygwin format) fonts fk5 unicode (lack of deep .ttf fonts?) marker times italic (lack of .ttf font) -IExamine only works for files -Fits gzip/compress/pack- use magic number instead of file ext gzip fits in/out (buffer size?) hduname support TNULLn ascii/binary tables FITS compression long long Problem cfitio gz files img_20131103_210146_2_10.0s_c1.fits.fz rice ZTILE2>1 -Graphs (Horz/Vert) horz/vert cut across mosaic MacOSX print Windows print postscript print set range limits don't clip numbers on ends large numbers (500000 verse 5e5) -Grid grid publication bug (Kshitiz Mallick) -GUI buttons reorder menus params via shortcuts language textvariable color (plot.tcl) dlabel,clabel,dist,system,sky,skyformat get panner to generate 'EnterPanner' events during blink annotate frames with user specified name prefs 2/3 button mouse -HV back goes to top of page upgrade tkhtml? meta http-equiv="refresh" http://tkhtml.tcl.tk/index.html history/clear history multipart mime- push no terminating str ftp soft links textarea with scrollbars print -IRAF/IIS update iis.c (imexam, unix domain name) problem with 'display dev$pix 1 select_frame-' imexamine problem with frames 10-16 -MacOSX compile warnings pcc lion mountainlion mavericks yosemite pcc upgrade to 1.0 fix saveas image fix saveas mpeg -Masks photo -MPEG x264/FFMpeg? fix quality gcc mpeg -O segv's -NRRD hex ascii bz2 wcs -Printing Annotate prints with title/footnotes -Plot crosshairs in plot display coord, value symbol size errorbar cap size bar outline color width -Radio data BUNIT (JY/BEAM, MJy/sr?, K?, W/m^2-sr?) BMAJ-major BMIN-minor BPA-angle or HISTORY AIPS CLEAN BMAJ= 1.2500E-02 BMIN= 1.2500E-02 BPA= 0.00 take average of 3rd axis/area=JY/BEAM C2200P80.fits CenA-13cm.fits I2200P80.fits m82rad.fits nvss.fits q128.fits radio.fits ~/3data/lofar/* -Regions compass region issue (Gabrial Bihanin) scale compass with zoom add compass length to dialog regions dialog default coord sys prefs (Warren) line/vector/projection/ruler- coordinates diffs,angle,length clip to image renderXText- clip to widget regions tests for -format/-system/-sky projection region- add bin size option new copy/paste regions: copy into tcl var (both physical and wcs) regions std dialog send/receive samp votable votable- composite ds9parser- parse (hh mm ss [+-]dd mm ss) projection delete/composite undelete/desolve no update default coordinate systems for plots specify method accross mosaics FITS Regions add HDUCLAS1 add MFORM1 support add WCS support gz fits use current properties XPA/SAMP control over existing regions change colors/properties change default shape sizes return ids when create select last region created groups- new/delete xy,saoimage,ciao-- use current shape,color,properties Tests point region # pointsize= composite # composite = 1 text # textrotate = yes -Scale Lupton (2004) (STIFF program within the ASTROMATIC package) -Structure update install page merge macosx/win into saotk absolute dir for mount point tcl/tk lib encodings help fov source ?.tcl (ds9.tcl) 64 bit FITS Fitsy++ fits keywords (test64bit.fits) clean up configure mods (use autoreconf) html tclxml tcllib move filter strings from file.C to fitsimage.C image[ext][sec] table[ext][filter][slicefilter] -Template segv for dss images -Tksao fonts (colorbar, panner, frame) Tk_PostscriptFont TK_CONFIG_FONT -UNIX compile warnings vfs mount point /tmp? (alexeys problem with ssh mounted disks, can we use /tmp?) -Windows (mingw32?) ::ttk::checkbutton vo.tcl (tri state check) clip regions glob? screen aspect ratio print dpi (for text) variable dashed lines display print $ds9 -url 'ftp://sao-ftp/foo.fits' analysis tasks will not abort start on other drives than C:/flash drives -WCS ast getWCScrpix getWCScrval getWCScdelt getWCSrotation getWCSorientation TAB WCS add RADESYS: FK4-NO-E/GAPPT/SUPERGALACTIC/HELIOECLIPTIC menus solar SOLX/SOLY,HPLN/HPLT,HGLN/HGLT,HRLN/HRLT wcs editor- astrometry.net header define keywords ----- ------ -------- TAN old SCAMP PVx_y TPV new SCAMP PVx_y xxx generic PVx_y xxx autoastrom QVx_y ZPX IRAF WATx_ TNX IRAF WATx_ TAN-SIP SIP A_x_y,B_x_y,AP_x_y,BP_x_y,A_ORDER,B_ORDER AP_ORDER,BP_ORDER,A_DMAX,B_DMAX TAN SAO Plate COx_y Problem FITS WCS Files wcssubs ast wcslib ------- --- ------ COD/COE/COO/COP (bad, yes, yes) HPX (HEALPix) (no, yes, yes) DSS (SAO) (yes, yes, no) TNX (NOAO TAN + params) (yes , yes, no) ZPX (NOAO ZPN + params) (yes , yes, no) TAN---RA-SIP (SIRTF) (yes, yes, no) SCAMP (SAO TAN + PV) (yes, yes(PV->QV), no) TPV (NOAO TAN + PV) (yes, yes(PV->QV), no) AUTOASTROM (xxx + QV) (no, yes, no) WCSDEP (yes, no, no) STScI DSS wcen.fits.gz OLD SCAMP (PVx_30) ac42227_00_01ww_tnx.fits ngc6819.fits TAN+PV (PVx_20) paucam_0_0_t7_0_science.fits TAN+ PV2_1=0 PV2_2=0 IC2395_ch1_merged.fits IC2395_ch2_merged.fits IC2395_ch3_merged.fits IC2395_ch4_merged.fits SAGE_LMC_MIPS24_E12.fits g180p00r45b120pm.fits a68.fits n132d_s18_7_LL_Cont_15mic.fits ZPN+PV (PV2_1,PV2_3,PV2_5) ABELL0586.0750.fits D4.0705.fits EGS1.1193.fits LSSTtest.2124.fits UKIDDS_K_3219_606_17_67_3.fits rcs2_m3.2540.fits TNX (WATx_yyy) 30s_01.fits cal000277b.fits mscred.fits obj094.fits obj269z.fits westphal_Rs.wcs.fits -bad badTNX.fits.gz ZPX (WATx_yyy) E5.3090.fits E5.3075.fits TAN-SIP (A_,B_,AP_,BP) sst.fits mos8.fits (no reverse) SAO PLT (COx_13) ac.fits crts_short.fits (bad?) WCSDEP ngc6819.fits HPX wmap_ilc_3yr_v2-HPX.fits TAB sparse.fits GLON-ZEA South_galactic.fits g000p00r2.fits North_galactic.fits -bad SFD_dust_4096_ngp.fits RA-CAR CAR_model.fits car_01.fits -bad CHIPASS_Equ.fits GLON-CAR GLM_00350+0115_mosaic_I4_cutout_14706.fits GLM_03350+0000_mosaic_I1_cutout_10617.fits GP_343.5_+0.0_A.fits fermi_counts_gps_bin_1.00.fits gc_energybin07_fadapt10_smajor030.fits gc_energybin07_fadapt10_smajor100.fits msxmapA-1a.fits msxmapA-2.fits eta.fits rmon_msxmapA.fits iras_hires_band3.fits msx327p5.fits msxmapA-1.fits -old style (linear wcs) Wco_DHT2001.fits total_hi.fits xLON/xLAT- bad worldtopo.multi.fits 'TLON-CAR' IRAF obj011.fits oct12_096.4.fits CROTA1 AXJ165420_GAIA.fits SKYBOT ggg.fits.gz ***MSGS*** Languages: Dansk Allan Hornstrup allan@dsri.dk Espaol Manuel Perez Torres mpereztorres@cfa Portuguese Alberto Krone-Martins krone@obs.u-bordeaux1.fr Japanese Masahiro Tsujimoto tsujimot@astro.psu.edu Chinese Junfeng Wang jwang@head.cfa.harvard.edu Chinese Albert Kong akong@space.mit.edu Franais (a-c) Jean-Baptiste Marquette marquett@iap.fr Franais (d-h) Jean-Francois Sygnet sygnet@iap.fr Franais (i-m) Elaine Fortin elaine_fortin@harvard.edu Franais (n-p) Anne Lemiere alemiere@head.cfa.harvard.edu Franais *(q-t) Jean-Francois Sygnet sygnet@iap.fr Franais *(u-z) Ilana Harrus imh@milkyway.gsfc.nasa.gov ***MACOSX*** run on compiled on 10.6 10.7 10.8 10.9 10.6 (snowleopard) yes yes yes yes 10.7 (lion) no yes yes yes 10.8 (mountainlion) no no yes yes 10.9 (mavericks) no no yes yes ***CYGWIN*** install req core X11 Devel Editors Utils Archive lib/xslt-devel ***MACPORTS*** for build (installs cvs,autoconfig,automake,pkgconfig...) % sudo port install cvs for lion,mountainlion,yosemite,elcapitan % sudo port install pkgconfig % sudo port install xft2 for truetype fonts % PKG_CONFIG_PATH=$HOME/lib/pkgconfig:/opt/X11/lib/pkgconfig % cat > lib/pkgconfig/xft.pc prefix=/opt/X11 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: Xft Description: X FreeType library Version: 2.2.0 Requires: xproto, xrender, fontconfig, freetype2 Requires.private: xrender, fontconfig, freetype2 Cflags: -I${includedir} Libs: -L${libdir} -lXft (ok) -gui TkDefaultFont (ok) -ps size*parent->getDisplayRatio() (ok) -saotk $ds9(times) $ds9(helvetica) $ds9(courier) ( ) -blt $ds9(times) $ds9(helvetica) $ds9(courier) ***LOAD*** base->loadFitsxxxCmd() FitsImage* img = new FitsImageFitsxxx(); loadDone(currentContext->load()); base->loadDone() updateColorScale() updateMatrix() context->load() FitsImage* next = new FitsImageFitsNextxxx(); loadFinish() context->loadFinish() reorderAxes() block() processKeywordsFitsSection() analysis() context->bin() fitsimage->bin() FitsImage* next = new FitsImageFitsNextHist(); resetScanMode() updateClip() context->setAxesOrder() loadFinish() context->block() fitsimage->block() resetScanMode() processMosaicKeywords() context->analysis() fitsimage->analysis() updateClip() FitsImageFitsxxx:: FitsFile* fits_ = newFitsFitsxxx(); process() FitsImageFitsNextxxx:: FitsFile* fits_ = newFitsFitsNextxxx(); process() fitsimage->process() load() initNRRD() load() initENVI() load() initCompress() load() initHPX() load() initBin() nextBin() fitsimage->load() base_ = post_ = hpx_ = hist_ = fits_ image_ = analysis_ = block_ = base_ data_ = analysisdata_ = blockdata_ = basedata_ = new FitsDatam() fitsimage->bin() nextbin() fitsimage->nextBin() load() fitsimage->hpx() fitsimage->compress() fitsimage->envi() fitsimage->initHPX() fitsimage->block() resetWCS processKeywordsPhysical processKeywordsParams analysis_ = block_ analysisdata_ = blockdata_ fitsimage->analysis() image_ = analysis_ data_ = analysisdata_ ***MEMEORY*** Types (*no save, **no save,no alloc) fits sfits** rgbimage rgbcube srgbcube** mecube multiframe* mosaicimagewcs mosaicimageiraf* mosaicimagewfpc* mosaicwcs mosaiciraf* smosaicwcs** smosaiciraf** array rgbarray nrrd gif jpeg tiff png envi Fitsy++ Memory modes strm (alloc) allocgz channel (socket) socketgz map (mmap) share var smap smmap sshare mapincr mmapincr ***FUNTOOLS*** LAUNCH_ROUTINE: V f|F p|P FILTER_PTYPE: c ***IRAF*** IRAF Keywords ampsec/ampsize- ccd to amplifier atm/atv- ccd to amplifier biassec- image ccdsec/ccdsize- ccd ccdsum- blocking factor datasec- image coord detsec/detsize- ccd to detector dtm/dtv- ccd to dectector ltm/ltv- ccd to image origsec- ccd trimsec- image IRAF Graphcap :DD=node!imtool,fifo\:/dev/imt1i\:/dev/imt1o,512,512:tc=iism70: :DD=node!imtool,inet\:5137,512,512:tc=iism70: :DD=node!imtool,unix\:/tmp/.IMT%d,512,512:tc=iism70: IRAF Colors: 0 = background (white) 1 - 200 data values (1 lowerlimit, 200 upperlimit) 201 = cursor (white) 202 = black 203 = white 204 = red 205 = green 206 = blue 207 = yellow 208 = cyan 209 = magenta 210 = coral (255 127 80) 211 = maroon (176 48 96) 212 = orange (255 165 0) 213 = khaki (240 230 140) 214 = orchid (218 112 214) 215 = turquoise (64 224 208) 216 = violet (238 130 238) 217 = wheat (245 222 179) 218-254 = reserved for use by other windows 255 = black (sunview foreground color) ***ARCH*** ***i386 char 1 short 2 int 4 long int 4 long 4 long long 8 void* 4 ***x86_64 char 1 short 2 int 4 long int 8 long 8 long long 8 void* 8 ***solaris char 1 short 2 int 4 long int 4 long 4 long long 8 void* 4 ***solaris64 char 1 short 2 int 4 long int 8 long 8 long long 8 void* 8 ***ppc char 1 short 2 int 4 long int 4 long 4 long long 8 void* 4 ***pcc64 char 1 short 2 int 4 long int 8 long 8 long long 8 void* 8 ***WCS*** WCS Keywords WCSNAME WCSNAMEa TWCSn TWCSna CTYPEi CTYPEia TCTYPn TCTYna CUNITi CUNITia TCUNIn TCUNna CRPIXi CRPIXia TCRPXn TCRPna CRVALi CRVALia TCRVLn TCRVna CDELTi CDELTia TCDLTn TCDEna CROTAi CROTAia TCROTn PCi_j PCi_ja TPn_k TPn_ka CDi_j CDi_ja TCn_k TCn_ka PVi_m PVi_ma TVn_m TVn_ma PSi_m PSi_ma TSn_m TSn_ma ***URL*** AST David Berry GPLv2 http://starlink.jach.hawaii.edu/starlink/AST BLT George A Howlett OpenSource www.sourceforge.net/projects/blt/files CheckDNS SAO GPLv2 http://hea-www.harvard.edu/RD/ds9/ FunTools SAO LGPLv2.1 https://www.cfa.harvard.edu/~john/funtools/ HCompress Richard White/STScI OpenSource/NASA http://www.stsci.edu/software/hcompress.html HTMLWidget D. Richard Hipp GPLv2 http://www.hwaci.com/drh/ IIS NOAO OpenSource/IRAF PLIO NOAO OpenSource/IRAF RICE Richard White/STScI OpenSource/NASA SAOtk SAO GPLv2 http://hea-www.harvard.edu/RD/ds9/ Signal_Ext Michael Schwartz OpenSource http://www.nyx.net/~mschwart Tcl University of California/Sun Microsystems/Scripts OpenSource http://sourceforge.net/projects/tcl/files/Tcl/ Tcllib Ajuba Solutions and other parties OpenSource http://tcllib.sourceforge.net/ tclxml ANU/CSIRO/Zveno Pty Ltd/Explain OpenSource http://www.explain.com.au/ Tk University of California/Sun Microsystems/Scripts OpenSource http://sourceforge.net/projects/tcl/files/Tk/ TkCon Jeffrey Hobbs OpenSource TKIMG Various Authors OpenSource http://sourceforge.net/projects/tkimg/ ezMPEG Ingo Oppermann GPLv2 tkmpeg SAO GPLv2 http://hea-www.harvard.edu/RD/ds9/ TkTable Jeffrey Hobbs GPLv2 http://sourceforge.net/projects/tktable/ WCSTools SAO LGPLv2.1 http://tdc-www.cfa.harvard.edu/wcstools/ xmlrpc Eric Yeh GPLv2 xpa SAO LGPLv2.1 http://hea-www.harvard.edu/RD/ds9/ zlib Jean-loup Gailly and Mark Adler OpenSource http://zlib.net/ zvfs Richard Hipp OpenSource http://www.hwaci.com/drh/ saods9/README000644 000765 000000 00000001170 12562460062 013246 0ustar00joyewheel000000 000000 *************************** Welcome to SAOImage DS9 *************************** Please Note: The build instructions have changed! Quick Instructions for those who hate to read instructions. After installation, ds9 can be located in saods9/bin/ds9. To build DS9, just cut and paste the following commands: *************************** For Linux/X11 MacOSX/Cygwin *************************** cd saods9 unix/configure make *************************** For Aqua MacOSX *************************** cd saods9 macosx/configure make *************************** For Windows *************************** cd saods9 windows/configure make saods9/tclcheckdns1.1/000755 000765 000000 00000000000 12634602232 015071 5ustar00joyewheel000000 000000 saods9/tcliis1.0/000755 000765 000000 00000000000 12634602232 014072 5ustar00joyewheel000000 000000 saods9/tests/000755 000765 000000 00000000000 12634602243 013530 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/000755 000765 000000 00000000000 12634602245 014112 5ustar00joyewheel000000 000000 saods9/tkmpeg1.0/000755 000765 000000 00000000000 12634602251 014073 5ustar00joyewheel000000 000000 saods9/tksao1.0/000755 000765 000000 00000000000 12634602261 013726 5ustar00joyewheel000000 000000 saods9/unix/000755 000765 000000 00000000000 12634602261 013351 5ustar00joyewheel000000 000000 saods9/win/000755 000765 000000 00000000000 12634602261 013163 5ustar00joyewheel000000 000000 saods9/win/aclocal.m4000755 000765 000000 00000000223 12562710432 015023 0ustar00joyewheel000000 000000 # # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # saods9/win/configure000755 000765 000000 00000254553 12562710432 015110 0ustar00joyewheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for saods9 7.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='saods9' PACKAGE_TARNAME='saods9' PACKAGE_VERSION='7.4' PACKAGE_STRING='saods9 7.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS TKTABLEFLAGS XPAFLAGS ROOT ARCH OS PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_arch ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures saods9 7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/saods9] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of saods9 7.4:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-arch build name Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF saods9 configure 7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Check whether --with-arch was given. if test "${with_arch+set}" = set; then : withval=$with_arch; else with_arch=unknown fi source make.pkgs OS="win" ARCH=$with_arch ROOT=$ac_pwd XPAFLAGS="--with-tcl=$ROOT/$TCLDIR/win" TKTABLEFLAGS="--with-tclinclude=$ROOT/$TCLDIR/generic --with-tkinclude=$ROOT/$TKDIR/generic" ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ saods9 config.status 7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi saods9/win/configure.in000755 000765 000000 00000001243 12562710432 015477 0ustar00joyewheel000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT([saods9], [7.4]) TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) AC_ARG_WITH([arch],AC_HELP_STRING([--with-arch],[build name]),[],[with_arch=unknown]) source make.pkgs OS="win" AC_SUBST(OS) ARCH=$with_arch AC_SUBST(ARCH) ROOT=$ac_pwd AC_SUBST(ROOT) XPAFLAGS="--with-tcl=$ROOT/$TCLDIR/win" AC_SUBST(XPAFLAGS) TKTABLEFLAGS="--with-tclinclude=$ROOT/$TCLDIR/generic --with-tkinclude=$ROOT/$TKDIR/generic" AC_SUBST(TKTABLEFLAGS) AC_OUTPUT([Makefile]) saods9/win/Makefile.in000644 000765 000000 00000003244 12601047072 015230 0ustar00joyewheel000000 000000 OS = @OS@ ARCH = @ARCH@ ROOT = @ROOT@ EXEEXT = @EXEEXT@ XPAFLAGS= @XPAFLAGS@ TKTABLEFLAGS = @TKTABLEFLAGS@ JOBS = 1 include ./make.include #--------------------------build .PHONY : saods9 tcl tk tkwin saods9 : dirs tcl tk \ tclxml xmlrpc xpa \ tkblt tktable tkimg \ tkmpeg tkhtml tkcon \ tkwin \ tksao ds9 # gcc- tclxml xpa tktable tkimg # posix- tclcheckdns tcliis tclsignal # no parallel tcl : $(TCLDIR)/win/Makefile @echo "" @echo "*** Install $(TCLDIR) ***" $(MAKE) -C $(TCLDIR)/win install $(TCLDIR)/win/Makefile : @echo "" @echo "*** Configure $(TCLDIR) ***" cd $(TCLDIR)/win; \ ./configure \ --prefix $(ROOT) -exec-prefix $(ROOT) \ --disable-shared --enable-symbols # no parallel tk : $(TKDIR)/win/Makefile @echo "" @echo "*** Install $(TKDIR) ***" $(MAKE) -C $(TKDIR)/win install $(TKDIR)/win/Makefile : @echo "" @echo "*** Configure $(TKDIR) ***" cd $(TKDIR)/win; \ ./configure \ $(TKFLAGS) \ --prefix $(ROOT) -exec-prefix $(ROOT) \ --disable-shared --enable-symbols tkwin: $(TKWINDIR)/Makefile @echo "" @echo "*** Installing $(TKWINDIR) ***" $(MAKE) -C $(TKWINDIR) -j $(JOBS) install $(TKWINDIR)/Makefile : @echo "" @echo "*** Configure $(TKWINDIR) ***" cd $(TKWINDIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols #--------------------------clean .PHONY : tkwinclean tkwinclean : $(MAKE) -C $(TKWINDIR) clean #--------------------------distclean .PHONY : tkwindistclean tkwindistclean : $(MAKE) -C $(TKWINDIR) distclean #--------------------------distribution .PHONY : dist dist : all cd bin; tar cvf - ds9$(EXEEXT) $(ZIPFILE) | gzip > dist/ds9.$(ARCH).$(DS9VERSION).tar.gz saods9/win/tclconfig/000755 000765 000000 00000000000 12634602261 015133 5ustar00joyewheel000000 000000 saods9/win/tclconfig/ChangeLog000644 000765 000000 00000106605 12562710432 016715 0ustar00joyewheel000000 000000 2013-07-04 Jan Nijtmans * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C://AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 * tcl.m4: Added FreeBSD clause. 2001-01-03 * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. saods9/win/tclconfig/install-sh000755 000765 000000 00000033054 12562710432 017144 0ustar00joyewheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: saods9/win/tclconfig/README.txt000644 000765 000000 00000001454 12562710432 016635 0ustar00joyewheel000000 000000 These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. saods9/win/tclconfig/tcl.m4000644 000765 000000 00000404642 12562710432 016171 0ustar00joyewheel000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: saods9/unix/aclocal.m4000755 000765 000000 00000000223 12562674267 015230 0ustar00joyewheel000000 000000 # # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # saods9/unix/configure000755 000765 000000 00000256525 12562707334 015306 0ustar00joyewheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for saods9 7.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='saods9' PACKAGE_TARNAME='saods9' PACKAGE_VERSION='7.4' PACKAGE_STRING='saods9 7.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS TKIMGFLAGS TKFLAGS TKTABLEFLAGS XPAFLAGS ROOT ARCH OS PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_arch ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures saods9 7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/saods9] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of saods9 7.4:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-arch build name Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF saods9 configure 7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Check whether --with-arch was given. if test "${with_arch+set}" = set; then : withval=$with_arch; else with_arch=unknown fi source make.pkgs OS="unix" ARCH=$with_arch ROOT=$ac_pwd XPAFLAGS="--with-tcl=$ROOT/$TCLDIR/unix" TKTABLEFLAGS="--with-tclinclude=$ROOT/$TCLDIR/generic --with-tkinclude=$ROOT/$TKDIR/generic" { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version case $system in Darwin* ) TKFLAGS="--disable-corefoundation" ;; CYGWIN* ) ;; Linux* ) TKIMGFLAGS="tcl_cv_cc_visibility_hidden=no" ;; *) ;; esac ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ saods9 config.status 7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi saods9/unix/configure.in000755 000765 000000 00000001610 12562707335 015673 0ustar00joyewheel000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT([saods9], [7.4]) TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) AC_ARG_WITH([arch],AC_HELP_STRING([--with-arch],[build name]),[],[with_arch=unknown]) source make.pkgs OS="unix" AC_SUBST(OS) ARCH=$with_arch AC_SUBST(ARCH) ROOT=$ac_pwd AC_SUBST(ROOT) XPAFLAGS="--with-tcl=$ROOT/$TCLDIR/unix" AC_SUBST(XPAFLAGS) TKTABLEFLAGS="--with-tclinclude=$ROOT/$TCLDIR/generic --with-tkinclude=$ROOT/$TKDIR/generic" AC_SUBST(TKTABLEFLAGS) TEA_CONFIG_SYSTEM case $system in Darwin* ) TKFLAGS="--disable-corefoundation" AC_SUBST(TKFLAGS) ;; CYGWIN* ) ;; Linux* ) TKIMGFLAGS="tcl_cv_cc_visibility_hidden=no" AC_SUBST(TKIMGFLAGS) ;; *) ;; esac AC_OUTPUT([Makefile]) saods9/unix/Makefile.in000644 000765 000000 00000002706 12632345556 015434 0ustar00joyewheel000000 000000 OS = @OS@ ARCH = @ARCH@ ROOT = @ROOT@ EXEEXT = @EXEEXT@ TKFLAGS = @TKFLAGS@ XPAFLAGS= @XPAFLAGS@ TKIMGFLAGS = @TKIMGFLAGS@ TKTABLEFLAGS = @TKTABLEFLAGS@ JOBS = 4 include ./make.include #--------------------------build .PHONY : saods9 tcl tk saods9 : dirs tcl tk \ tclcheckdns tcliis tclsignal \ tclzvfs tclxml xmlrpc xpa \ tkblt tktable tkimg \ tkmpeg tkhtml tkcon \ tksao ds9 tcl : $(TCLDIR)/unix/Makefile @echo "" @echo "*** Install $(TCLDIR) ***" $(MAKE) -C $(TCLDIR)/unix -j $(JOBS) install $(TCLDIR)/unix/Makefile : @echo "" @echo "*** Configure $(TCLDIR) ***" cd $(TCLDIR)/unix; \ ./configure \ --prefix $(ROOT) -exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../../config.cache tk : $(TKDIR)/unix/Makefile @echo "" @echo "*** Install $(TKDIR) ***" $(MAKE) -C $(TKDIR)/unix -j $(JOBS) install $(TKDIR)/unix/Makefile : @echo "" @echo "*** Configure $(TKDIR) ***" cd $(TKDIR)/unix; \ ./configure \ $(TKFLAGS) \ --prefix $(ROOT) -exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../../config.cache #--------------------------clean .PHONY : tkunixclean tkunixclean : #--------------------------distclean .PHONY : tkunixdistclean tkunixdistclean : #--------------------------distribution .PHONY : dist dist : cd bin; tar cvf - ds9* | gzip > ../dist/ds9.$(ARCH).$(DS9VERSION).tar.gz cd bin; tar cvf - xpa* | gzip > ../dist/xpa.$(ARCH).$(XPAVERSION).tar.gz saods9/unix/tclconfig/000755 000765 000000 00000000000 12634602261 015321 5ustar00joyewheel000000 000000 saods9/unix/tclconfig/ChangeLog000644 000765 000000 00000106605 12560425054 017104 0ustar00joyewheel000000 000000 2013-07-04 Jan Nijtmans * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C://AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 * tcl.m4: Added FreeBSD clause. 2001-01-03 * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. saods9/unix/tclconfig/install-sh000755 000765 000000 00000033054 12560425055 017334 0ustar00joyewheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: saods9/unix/tclconfig/README.txt000644 000765 000000 00000001454 12560425055 017025 0ustar00joyewheel000000 000000 These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. saods9/unix/tclconfig/tcl.m4000644 000765 000000 00000404642 12560425055 016361 0ustar00joyewheel000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: saods9/tksao1.0/aclocal.m4000755 000765 000000 00000000266 12553532373 015603 0ustar00joyewheel000000 000000 # # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # builtin(include,tclconfig/img.m4) saods9/tksao1.0/colorbar/000755 000765 000000 00000000000 12634602255 015534 5ustar00joyewheel000000 000000 saods9/tksao1.0/configure000755 000765 000000 00001152016 12560223436 015644 0ustar00joyewheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tksao 1.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tksao' PACKAGE_TARNAME='tksao' PACKAGE_VERSION='1.0' PACKAGE_STRING='tksao 1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS subdirs WISH_PROG TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS XMKMF TK_XLIB_DIR_NATIVE TK_TOP_DIR_NATIVE TK_INCLUDES TCL_INCLUDES FUNTOOLSDIR ASTDIR PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP ac_ct_CXX CXXFLAGS CXX TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL PATCHLEVEL MINOR_VERSION MAJOR_VERSION _STUB_LIB_PATH _BUILD_STUB_LIB_PATH _STUB_LIB_SPEC _BUILD_STUB_LIB_SPEC _LIB_SPEC _BUILD_LIB_SPEC' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tk with_tclinclude with_tkinclude with_x enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP ASTDIR FUNTOOLSDIR XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tksao 1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tksao] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tksao 1.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-tkinclude directory containing the public Tk header files --with-x use the X Window System --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor ASTDIR Name of AST subdirectory FUNTOOLSDIR Name of Funtools subdirectory XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tksao configure 1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tksao $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars=" saotk.C colorbar/cbgrid.C colorbar/colorbar.C colorbar/colorbarbase.C colorbar/colorbarrgb.C colorbar/colorbarrgbtruecolor.C colorbar/colorbarrgbtruecolor16.C colorbar/colorbarrgbtruecolor24.C colorbar/colorbarrgbtruecolor8.C colorbar/colorbartrue.C colorbar/colorbartruecolor.C colorbar/colorbartruecolor16.C colorbar/colorbartruecolor24.C colorbar/colorbartruecolor8.C colorbar/colormap.C colorbar/colortag.C colorbar/default.C colorbar/lex.C colorbar/lut.C colorbar/lutlex.C colorbar/lutparser.C colorbar/parser.C colorbar/sao.C colorbar/saolex.C colorbar/saoparser.C fitsy++/alloc.C fitsy++/allocgz.C fitsy++/analysis.C fitsy++/block.C fitsy++/card.C fitsy++/channel.C fitsy++/column.C fitsy++/compress.C fitsy++/envi.C fitsy++/envilex.C fitsy++/enviparser.C fitsy++/file.C fitsy++/gzip.C fitsy++/hcompress.C fitsy++/hdecompress.c fitsy++/hdu.C fitsy++/head.C fitsy++/hist.C fitsy++/hpx.C fitsy++/iis.C fitsy++/lex.C fitsy++/map.C fitsy++/mapincr.C fitsy++/mmap.C fitsy++/mmapincr.C fitsy++/nrrd.C fitsy++/nrrdgzip.C fitsy++/nrrdlex.C fitsy++/nrrdparser.C fitsy++/order.C fitsy++/outchannel.C fitsy++/outfile.C fitsy++/outfits.C fitsy++/outsocket.C fitsy++/parser.C fitsy++/photo.C fitsy++/plio.C fitsy++/pliocomp.c fitsy++/rice.C fitsy++/ricecomp.c fitsy++/savefits.C fitsy++/share.C fitsy++/smap.C fitsy++/smmap.C fitsy++/socket.C fitsy++/socketgz.C fitsy++/sshare.C fitsy++/strm.C fitsy++/var.C frame/annulus.C frame/base.C frame/basebox.C frame/basecommand.C frame/baseellipse.C frame/baseline.C frame/basemarker.C frame/basepanda.C frame/box.C frame/boxannulus.C frame/bpanda.C frame/callback.C frame/ciaolex.C frame/ciaoparser.C frame/circle.C frame/colorscale.C frame/colorscalergb.C frame/colorscaletrue16.C frame/colorscaletrue24.C frame/colorscaletrue32.C frame/colorscaletrue8.C frame/compass.C frame/composite.C frame/context.C frame/contour.C frame/coord.C frame/cpanda.C frame/ds9lex.C frame/ds9parser.C frame/ellipse.C frame/ellipseannulus.C frame/epanda.C frame/fitsanalysis.C frame/fitsbin.C frame/fitsblock.C frame/fitscompress.C frame/fitsdata.C frame/fitsenvi.C frame/fitshealpix.C frame/fitsimage.C frame/fitsmap.C frame/fitsmask.C frame/fitsnrrd.C frame/fr3dcommand.C frame/fr3dmap.C frame/frame.C frame/frame3d.C frame/frame3dbase.C frame/frame3dtrue.C frame/frame3dtruecolor.C frame/frame3dtruecolor16.C frame/frame3dtruecolor24.C frame/frame3dtruecolor8.C frame/framebase.C frame/framergb.C frame/framergbtruecolor.C frame/framergbtruecolor16.C frame/framergbtruecolor24.C frame/framergbtruecolor8.C frame/frametrue.C frame/frametruecolor.C frame/frametruecolor16.C frame/frametruecolor24.C frame/frametruecolor8.C frame/frblt.C frame/frcommand.C frame/frload.C frame/frmap.C frame/frmarker.C frame/frmarkerxml.C frame/frsave.C frame/frscale.C frame/fvcontour.C frame/grid.C frame/grid25d.C frame/grid2d.C frame/grid3d.C frame/inversescale.C frame/lex.C frame/line.C frame/marker.C frame/parser.C frame/point.C frame/polygon.C frame/projection.C frame/proslex.C frame/prosparser.C frame/raytrace.C frame/ruler.C frame/saolex.C frame/saoparser.C frame/segment.C frame/tag.C frame/text.C frame/tnglex.C frame/tngparser.C frame/vect.C frame/xylex.C frame/xyparser.C list/list.C magnifier/lex.C magnifier/magnifier.C magnifier/magnifiertrue.C magnifier/parser.C panner/lex.C panner/panner.C panner/pannertrue.C panner/parser.C util/attribute.C util/grf.C util/grf3d.C util/grid25dbase.C util/grid2dbase.C util/grid3dbase.C util/gridbase.C util/ps.C util/smooth.C util/util.C vector/vector.C vector/vector3d.C wcssubs/cel.c wcssubs/distort.c wcssubs/dsspos.c wcssubs/hget.c wcssubs/hput.c wcssubs/iget.c wcssubs/lin.c wcssubs/platepos.c wcssubs/poly.c wcssubs/proj.c wcssubs/sph.c wcssubs/tnxpos.c wcssubs/wcs.c wcssubs/wcscon.c wcssubs/wcsinit.c wcssubs/wcslib.c wcssubs/wcstrig.c wcssubs/worldpos.c wcssubs/zpxpos.c widget/truecolor16.C widget/truecolor24.C widget/truecolor8.C widget/widget.C " for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir # i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="-I. -I./colorbar -I./fitsy++ -I./frame -I./list -I./magnifier -I./panner -I./util -I./vector -I./wcssubs -I./widget -I../include -I$FUNTOOLSDIR/filter -I$FUNTOOLSDIR/fitsy -I$FUNTOOLSDIR/util -I$ASTDIR -I/usr/include/libxml2" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="$FUNTOOLSDIR/libfuntools.a $ASTDIR/libast.a $ASTDIR/libast_err.a $ASTDIR/libast_pal.a -lstdc++" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done for ac_header in sys/shm.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" if test "x$ac_cv_header_sys_shm_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_SHM_H 1 _ACEOF fi done #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk private include files" >&5 $as_echo_n "checking for Tk private include files... " >&6; } TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then as_fn_error $? "Cannot find private header tkInt.h in ${TK_SRC_DIR}" "$LINENO" 5 fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${result}" >&5 $as_echo "${result}" >&6; } if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else not_really_there="yes" fi rm -f conftest.err conftest.i conftest.$ac_ext else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } found_xincludes="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : found_xincludes="yes" else found_xincludes="no" fi rm -f conftest.err conftest.i conftest.$ac_ext if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: couldn't find any!" >&5 $as_echo "couldn't find any!" >&6; } fi if test "$no_x" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 libraries" >&5 $as_echo_n "checking for X11 libraries... " >&6; } XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCreateWindow in -lXwindow" >&5 $as_echo_n "checking for XCreateWindow in -lXwindow... " >&6; } if ${ac_cv_lib_Xwindow_XCreateWindow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXwindow $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XCreateWindow (); int main () { return XCreateWindow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xwindow_XCreateWindow=yes else ac_cv_lib_Xwindow_XCreateWindow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xwindow_XCreateWindow" >&5 $as_echo "$ac_cv_lib_Xwindow_XCreateWindow" >&6; } if test "x$ac_cv_lib_Xwindow_XCreateWindow" = xyes; then : XLIBSW=-lXwindow fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find any! Using -lX11." >&5 $as_echo "could not find any! Using -lX11." >&6; } XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi fi #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wish" >&5 $as_echo_n "checking for wish... " >&6; } if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WISH_PROG}" >&5 $as_echo "${WISH_PROG}" >&6; } #----------------------------------------------------------------------- # All relevant packages are configuration subdirectories. #----------------------------------------------------------------------- CC=`echo $CC | sed -e 's/ .*$//'` tea_sub_configure_args= tea_prev= for tea_arg in $ac_configure_args; do if test -n "$tea_prev"; then tea_prev= continue fi case "$tea_arg" in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) tea_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) tea_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; *) tea_sub_configure_args="$tea_sub_configure_args $tea_arg" ;; esac done tea_config_dir="$FUNTOOLSDIR" tea_config_arguments="--with-wcslib=../lib/libwcs.a --with-zlib=../lib/libz.a" subdirs="$subdirs $tea_config_dir" # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. if test ! -d $srcdir/$tea_config_dir; then continue fi echo configuring in $tea_config_dir case "$srcdir" in .) ;; *) if test -d ./$tea_config_dir || mkdir -p ./$tea_config_dir; then :; else { echo "configure: error: can not create `pwd`/$tea_config_dir" 1>&2; exit 1; } fi ;; esac tea_popdir=`pwd` cd $tea_config_dir # A "../" for each directory in /$tea_config_dir. tea_dots=`echo $tea_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` case "$srcdir" in .) # No --srcdir option. We are building in place. tea_sub_srcdir=$srcdir ;; /*) # Absolute path. tea_sub_srcdir=$srcdir/$tea_config_dir ;; *) # Relative path. tea_sub_srcdir=$tea_dots$srcdir/$tea_config_dir ;; esac # Check for guested configure; otherwise get Cygnus style configure. if test -f $tea_sub_srcdir/configure; then tea_sub_configure=$tea_sub_srcdir/configure elif test -f $tea_sub_srcdir/configure.in; then tea_sub_configure=$tea_configure else echo "configure: warning: no configuration information is in $tea_config_dir" 1>&2 tea_sub_configure= fi # The recursion is here. if test -n "$tea_sub_configure"; then # Force usage of a cache file. if test "X$cache_file" = "X/dev/null" ; then cache_file=config.cache fi # Make the cache file name correct relative to the subdirectory. case "$cache_file" in /*) tea_sub_cache_file=$cache_file ;; *) # Relative path. tea_sub_cache_file="$tea_dots$cache_file" ;; esac echo "running ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments" # The eval makes quoting arguments work. if eval ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments then : else { echo "configure: error: $tea_sub_configure failed for $tea_config_dir" 1>&2; exit 1; } fi fi cd $tea_popdir tea_config_dir="$ASTDIR" tea_config_arguments="--enable-shared=no star_cv_cnf_trail_type=long" subdirs="$subdirs $tea_config_dir" # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. if test ! -d $srcdir/$tea_config_dir; then continue fi echo configuring in $tea_config_dir case "$srcdir" in .) ;; *) if test -d ./$tea_config_dir || mkdir -p ./$tea_config_dir; then :; else { echo "configure: error: can not create `pwd`/$tea_config_dir" 1>&2; exit 1; } fi ;; esac tea_popdir=`pwd` cd $tea_config_dir # A "../" for each directory in /$tea_config_dir. tea_dots=`echo $tea_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` case "$srcdir" in .) # No --srcdir option. We are building in place. tea_sub_srcdir=$srcdir ;; /*) # Absolute path. tea_sub_srcdir=$srcdir/$tea_config_dir ;; *) # Relative path. tea_sub_srcdir=$tea_dots$srcdir/$tea_config_dir ;; esac # Check for guested configure; otherwise get Cygnus style configure. if test -f $tea_sub_srcdir/configure; then tea_sub_configure=$tea_sub_srcdir/configure elif test -f $tea_sub_srcdir/configure.in; then tea_sub_configure=$tea_configure else echo "configure: warning: no configuration information is in $tea_config_dir" 1>&2 tea_sub_configure= fi # The recursion is here. if test -n "$tea_sub_configure"; then # Force usage of a cache file. if test "X$cache_file" = "X/dev/null" ; then cache_file=config.cache fi # Make the cache file name correct relative to the subdirectory. case "$cache_file" in /*) tea_sub_cache_file=$cache_file ;; *) # Relative path. tea_sub_cache_file="$tea_dots$cache_file" ;; esac echo "running ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments" # The eval makes quoting arguments work. if eval ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments then : else { echo "configure: error: $tea_sub_configure failed for $tea_config_dir" 1>&2; exit 1; } fi fi cd $tea_popdir #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tksao $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tksao config.status 1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi saods9/tksao1.0/configure.in000755 000765 000000 00000030013 12560223436 016240 0ustar00joyewheel000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_ # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([tksao], [1.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([ saotk.C colorbar/cbgrid.C colorbar/colorbar.C colorbar/colorbarbase.C colorbar/colorbarrgb.C colorbar/colorbarrgbtruecolor.C colorbar/colorbarrgbtruecolor16.C colorbar/colorbarrgbtruecolor24.C colorbar/colorbarrgbtruecolor8.C colorbar/colorbartrue.C colorbar/colorbartruecolor.C colorbar/colorbartruecolor16.C colorbar/colorbartruecolor24.C colorbar/colorbartruecolor8.C colorbar/colormap.C colorbar/colortag.C colorbar/default.C colorbar/lex.C colorbar/lut.C colorbar/lutlex.C colorbar/lutparser.C colorbar/parser.C colorbar/sao.C colorbar/saolex.C colorbar/saoparser.C fitsy++/alloc.C fitsy++/allocgz.C fitsy++/analysis.C fitsy++/block.C fitsy++/card.C fitsy++/channel.C fitsy++/column.C fitsy++/compress.C fitsy++/envi.C fitsy++/envilex.C fitsy++/enviparser.C fitsy++/file.C fitsy++/gzip.C fitsy++/hcompress.C fitsy++/hdecompress.c fitsy++/hdu.C fitsy++/head.C fitsy++/hist.C fitsy++/hpx.C fitsy++/iis.C fitsy++/lex.C fitsy++/map.C fitsy++/mapincr.C fitsy++/mmap.C fitsy++/mmapincr.C fitsy++/nrrd.C fitsy++/nrrdgzip.C fitsy++/nrrdlex.C fitsy++/nrrdparser.C fitsy++/order.C fitsy++/outchannel.C fitsy++/outfile.C fitsy++/outfits.C fitsy++/outsocket.C fitsy++/parser.C fitsy++/photo.C fitsy++/plio.C fitsy++/pliocomp.c fitsy++/rice.C fitsy++/ricecomp.c fitsy++/savefits.C fitsy++/share.C fitsy++/smap.C fitsy++/smmap.C fitsy++/socket.C fitsy++/socketgz.C fitsy++/sshare.C fitsy++/strm.C fitsy++/var.C frame/annulus.C frame/base.C frame/basebox.C frame/basecommand.C frame/baseellipse.C frame/baseline.C frame/basemarker.C frame/basepanda.C frame/box.C frame/boxannulus.C frame/bpanda.C frame/callback.C frame/ciaolex.C frame/ciaoparser.C frame/circle.C frame/colorscale.C frame/colorscalergb.C frame/colorscaletrue16.C frame/colorscaletrue24.C frame/colorscaletrue32.C frame/colorscaletrue8.C frame/compass.C frame/composite.C frame/context.C frame/contour.C frame/coord.C frame/cpanda.C frame/ds9lex.C frame/ds9parser.C frame/ellipse.C frame/ellipseannulus.C frame/epanda.C frame/fitsanalysis.C frame/fitsbin.C frame/fitsblock.C frame/fitscompress.C frame/fitsdata.C frame/fitsenvi.C frame/fitshealpix.C frame/fitsimage.C frame/fitsmap.C frame/fitsmask.C frame/fitsnrrd.C frame/fr3dcommand.C frame/fr3dmap.C frame/frame.C frame/frame3d.C frame/frame3dbase.C frame/frame3dtrue.C frame/frame3dtruecolor.C frame/frame3dtruecolor16.C frame/frame3dtruecolor24.C frame/frame3dtruecolor8.C frame/framebase.C frame/framergb.C frame/framergbtruecolor.C frame/framergbtruecolor16.C frame/framergbtruecolor24.C frame/framergbtruecolor8.C frame/frametrue.C frame/frametruecolor.C frame/frametruecolor16.C frame/frametruecolor24.C frame/frametruecolor8.C frame/frblt.C frame/frcommand.C frame/frload.C frame/frmap.C frame/frmarker.C frame/frmarkerxml.C frame/frsave.C frame/frscale.C frame/fvcontour.C frame/grid.C frame/grid25d.C frame/grid2d.C frame/grid3d.C frame/inversescale.C frame/lex.C frame/line.C frame/marker.C frame/parser.C frame/point.C frame/polygon.C frame/projection.C frame/proslex.C frame/prosparser.C frame/raytrace.C frame/ruler.C frame/saolex.C frame/saoparser.C frame/segment.C frame/tag.C frame/text.C frame/tnglex.C frame/tngparser.C frame/vect.C frame/xylex.C frame/xyparser.C list/list.C magnifier/lex.C magnifier/magnifier.C magnifier/magnifiertrue.C magnifier/parser.C panner/lex.C panner/panner.C panner/pannertrue.C panner/parser.C util/attribute.C util/grf.C util/grf3d.C util/grid25dbase.C util/grid2dbase.C util/grid3dbase.C util/gridbase.C util/ps.C util/smooth.C util/util.C vector/vector.C vector/vector3d.C wcssubs/cel.c wcssubs/distort.c wcssubs/dsspos.c wcssubs/hget.c wcssubs/hput.c wcssubs/iget.c wcssubs/lin.c wcssubs/platepos.c wcssubs/poly.c wcssubs/proj.c wcssubs/sph.c wcssubs/tnxpos.c wcssubs/wcs.c wcssubs/wcscon.c wcssubs/wcsinit.c wcssubs/wcslib.c wcssubs/wcstrig.c wcssubs/worldpos.c wcssubs/zpxpos.c widget/truecolor16.C widget/truecolor24.C widget/truecolor8.C widget/widget.C ]) AC_ARG_VAR(ASTDIR,[Name of AST subdirectory]) AC_ARG_VAR(FUNTOOLSDIR,[Name of Funtools subdirectory]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([-I. -I./colorbar -I./fitsy++ -I./frame -I./list -I./magnifier -I./panner -I./util -I./vector -I./wcssubs -I./widget -I../include -I$FUNTOOLSDIR/filter -I$FUNTOOLSDIR/fitsy -I$FUNTOOLSDIR/util -I$ASTDIR -I/usr/include/libxml2]) TEA_ADD_LIBS([$FUNTOOLSDIR/libfuntools.a $ASTDIR/libast.a $ASTDIR/libast_err.a $ASTDIR/libast_pal.a -lstdc++]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) AC_CHECK_HEADERS(sys/shm.h) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS TEA_PUBLIC_TK_HEADERS TEA_PRIVATE_TK_HEADERS TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- TEA_PROG_TCLSH TEA_PROG_WISH #----------------------------------------------------------------------- # All relevant packages are configuration subdirectories. #----------------------------------------------------------------------- CC=`echo $CC | sed -e 's/ .*$//'` TEA_CONFIG_COLLECT TEA_CONFIG_SUBDIR($FUNTOOLSDIR, [--with-wcslib=../lib/libwcs.a --with-zlib=../lib/libz.a]) TEA_CONFIG_SUBDIR($ASTDIR, [--enable-shared=no star_cv_cnf_trail_type=long]) #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile pkgIndex.tcl]) saods9/tksao1.0/fitsy++/000755 000765 000000 00000000000 12634602255 015215 5ustar00joyewheel000000 000000 saods9/tksao1.0/frame/000755 000765 000000 00000000000 12634602255 015023 5ustar00joyewheel000000 000000 saods9/tksao1.0/list/000755 000765 000000 00000000000 12634602260 014700 5ustar00joyewheel000000 000000 saods9/tksao1.0/magnifier/000755 000765 000000 00000000000 12634602260 015666 5ustar00joyewheel000000 000000 saods9/tksao1.0/Makefile.in000755 000765 000000 00000045506 12614733371 016015 0ustar00joyewheel000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ ASTDIR = @ASTDIR@ FUNTOOLSDIR = @FUNTOOLSDIR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = libfuntools.a libast.a libast_err.a libast_pal.a $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL_OPTIONS = INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS} INSTALL_DATA_DIR = ${INSTALL} -d -m 755 INSTALL_PROGRAM = ${INSTALL} -m 555 INSTALL_DATA = ${INSTALL} -m 444 INSTALL_SCRIPT = ${INSTALL_PROGRAM} INSTALL_LIBRARY = ${INSTALL} -m 644 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ #TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ #TK_BIN_DIR = @TK_BIN_DIR@ #TK_SRC_DIR = @TK_SRC_DIR@ # Not used, but retained for reference of what libs Tcl required #TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) #EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) TCLLIBPATH = $(top_builddir) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(TCLLIBPATH)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG) #WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` #WISH_PROG = @WISH_PROG@ #WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG) SHARED_BUILD = @SHARED_BUILD@ #INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) DEFS = @DEFS@ $(PKG_CFLAGS) # Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl CLEANFILES = @CLEANFILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) .SUFFIXES: .c .C .$(OBJEXT) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target includes executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries #doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) libraries: $(PKG_OBJECTS) : $(ASTDIR)/ast.h libfuntools.a : $(MAKE) -C $(FUNTOOLSDIR) lib cd $(FUNTOOLSDIR); cp $@ ../. libast.a : $(ASTDIR)/ast.h $(MAKE) -C $(ASTDIR) libast.la cd $(ASTDIR)/.libs; cp $@ ../../. libast_err.a : $(ASTDIR)/ast.h $(MAKE) -C $(ASTDIR) libast_err.la cd $(ASTDIR)/.libs; cp $@ ../../. libast_pal.a : $(ASTDIR)/ast.h $(MAKE) -C $(ASTDIR) libast_pal.la cd $(ASTDIR)/.libs; cp $@ ../../. $(ASTDIR)/ast.h: $(MAKE) -C $(ASTDIR) ast.h parsers : cbparsers fitsyparsers frparsers magparsers panparsers cbparsers : cbparser cblutparser cbsaoparser fitsyparsers : fitsyparser nrrdparser enviparser frparsers : parser ciaoparser ds9parser prosparser saoparser tngparser xyparser magparsers : magparser panparsers : panparser cbparser : bison -d -p cb -o colorbar/parser.C colorbar/parser.Y flex -Pcb -ocolorbar/lex.C colorbar/lex.L cblutparser: bison -d -p rgb -o colorbar/lutparser.C colorbar/lutparser.Y flex -Prgb -ocolorbar/lutlex.C colorbar/lutlex.L cbsaoparser: bison -d -p li -o colorbar/saoparser.C colorbar/saoparser.Y flex -Pli -ocolorbar/saolex.C colorbar/saolex.L fitsyparser : bison -d -p ff -o fitsy++/parser.C fitsy++/parser.Y flex -Pff -ofitsy++/lex.C fitsy++/lex.L nrrdparser : bison -d -p nrrd -o fitsy++/nrrdparser.C fitsy++/nrrdparser.Y flex -Pnrrd -ofitsy++/nrrdlex.C fitsy++/nrrdlex.L enviparser : bison -d -p envi -o fitsy++/enviparser.C fitsy++/enviparser.Y flex -Penvi -ofitsy++/envilex.C fitsy++/envilex.L ciaoparser : bison -d -p ciao -o frame/ciaoparser.C frame/ciaoparser.Y flex -Pciao -oframe/ciaolex.C frame/ciaolex.L ds9parser : bison -d -p mk -o frame/ds9parser.C frame/ds9parser.Y flex -Pmk -oframe/ds9lex.C frame/ds9lex.L parser : bison -d -p fr -o frame/parser.C frame/parser.Y flex -Pfr -oframe/lex.C frame/lex.L prosparser : bison -d -p pros -o frame/prosparser.C frame/prosparser.Y flex -Ppros -oframe/proslex.C frame/proslex.L saoparser : bison -d -p sao -o frame/saoparser.C frame/saoparser.Y flex -Psao -oframe/saolex.C frame/saolex.L tngparser : bison -d -p tng -o frame/tngparser.C frame/tngparser.Y flex -Ptng -oframe/tnglex.C frame/tnglex.L xyparser : bison -d -p xy -o frame/xyparser.C frame/xyparser.Y flex -Pxy -oframe/xylex.C frame/xylex.L magparser : bison -d -p mg -o magnifier/parser.C magnifier/parser.Y flex -Pmg -omagnifier/lex.C magnifier/lex.L panparser : bison -d -p pn -o panner/parser.C panner/parser.Y flex -Ppn -opanner/lex.C panner/lex.L #======================================================================== # Your doc target should differentiate from doc builds (by the developer) # and doc installs (see install-doc), which just install the docs on the # end user machine when building from source. #======================================================================== doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries #install-doc install-binaries: binaries install-lib-binaries install-bin-binaries #======================================================================== # This rule installs platform-independent files, such as header files. # The list=...; for p in $$list handles the empty list case x-platform. #======================================================================== install-libraries: libraries @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @list='$(PKG_HEADERS)'; for i in $$list; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann @echo "Installing documentation in $(DESTDIR)$(mandir)" @list='$(srcdir)/doc/*.n'; for i in $$list; do \ echo "Installing $$i"; \ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]" shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \ --leak-check=yes --show-reachable=yes -v valgrind: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) valgrindshell: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ .C.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean $(INSTALL_DATA_DIR) $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in for i in $(srcdir)/*.[ch]; do \ if [ -f $$i ]; then \ cp -p $$i $(DIST_DIR)/ ; \ fi; \ done; $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: $(MAKE) -C $(FUNTOOLSDIR) clean $(MAKE) -C $(ASTDIR) clean -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f $(PKG_OBJECTS) *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean $(MAKE) -C $(FUNTOOLSDIR) distclean $(MAKE) -C $(ASTDIR) distclean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done @if test "x$(SHARED_BUILD)" = "x1"; then \ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # 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: saods9/tksao1.0/panner/000755 000765 000000 00000000000 12634602260 015210 5ustar00joyewheel000000 000000 saods9/tksao1.0/pkgIndex.tcl.in000755 000765 000000 00000000220 12540607755 016616 0ustar00joyewheel000000 000000 # # Tcl package index file # package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] saods9/tksao1.0/saotk.C000644 000765 000000 00000006014 12547533672 015170 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include extern int FrameTrueColor8_Init(Tcl_Interp*); extern int FrameTrueColor16_Init(Tcl_Interp*); extern int FrameTrueColor24_Init(Tcl_Interp*); extern int FrameRGBTrueColor8_Init(Tcl_Interp*); extern int FrameRGBTrueColor16_Init(Tcl_Interp*); extern int FrameRGBTrueColor24_Init(Tcl_Interp*); extern int Frame3dTrueColor8_Init(Tcl_Interp*); extern int Frame3dTrueColor16_Init(Tcl_Interp*); extern int Frame3dTrueColor24_Init(Tcl_Interp*); extern int ColorbarTrueColor8_Init(Tcl_Interp*); extern int ColorbarTrueColor16_Init(Tcl_Interp*); extern int ColorbarTrueColor24_Init(Tcl_Interp*); extern int ColorbarRGBTrueColor8_Init(Tcl_Interp*); extern int ColorbarRGBTrueColor16_Init(Tcl_Interp*); extern int ColorbarRGBTrueColor24_Init(Tcl_Interp*); extern int PannerTrueColor_Init(Tcl_Interp*); extern int MagnifierTrueColor_Init(Tcl_Interp*); extern "C" { int Tksao_Init(Tcl_Interp* interp); int SaotkCmd(ClientData data, Tcl_Interp *interp, int argc, const char* argv[]); } int Tksao_Init(Tcl_Interp* interp) { if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; if (Tk_InitStubs(interp, TK_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; if (FrameTrueColor8_Init(interp) == TCL_ERROR) return TCL_ERROR; if (FrameTrueColor16_Init(interp) == TCL_ERROR) return TCL_ERROR; if (FrameTrueColor24_Init(interp) == TCL_ERROR) return TCL_ERROR; if (FrameRGBTrueColor8_Init(interp) == TCL_ERROR) return TCL_ERROR; if (FrameRGBTrueColor16_Init(interp) == TCL_ERROR) return TCL_ERROR; if (FrameRGBTrueColor24_Init(interp) == TCL_ERROR) return TCL_ERROR; if (Frame3dTrueColor8_Init(interp) == TCL_ERROR) return TCL_ERROR; if (Frame3dTrueColor16_Init(interp) == TCL_ERROR) return TCL_ERROR; if (Frame3dTrueColor24_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarTrueColor8_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarTrueColor16_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarTrueColor24_Init(interp) == TCL_ERROR) return TCL_ERROR; if (PannerTrueColor_Init(interp) == TCL_ERROR) return TCL_ERROR; if (MagnifierTrueColor_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarRGBTrueColor8_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarRGBTrueColor16_Init(interp) == TCL_ERROR) return TCL_ERROR; if (ColorbarRGBTrueColor24_Init(interp) == TCL_ERROR) return TCL_ERROR; // dummy command // needed for auto_load, since all of our real work are canvas widgets, // tcl commands Tcl_CreateCommand(interp, "saotk", (Tcl_CmdProc* )SaotkCmd, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) return TCL_ERROR; return TCL_OK; } int SaotkCmd(ClientData data, Tcl_Interp *interp, int argc, const char* argv[]) { return TCL_OK; } saods9/tksao1.0/tclconfig/000755 000765 000000 00000000000 12634602260 015675 5ustar00joyewheel000000 000000 saods9/tksao1.0/util/000755 000765 000000 00000000000 12634602260 014702 5ustar00joyewheel000000 000000 saods9/tksao1.0/vector/000755 000765 000000 00000000000 12634602260 015227 5ustar00joyewheel000000 000000 saods9/tksao1.0/widget/000755 000765 000000 00000000000 12634602261 015211 5ustar00joyewheel000000 000000 saods9/tksao1.0/widget/truecolor16.C000644 000765 000000 00000007004 12464214760 017507 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "truecolor16.h" #include "util.h" TrueColor16::TrueColor16(Visual* visual) { #if !(_WIN32) rx_ = visual->red_mask; gx_ = visual->green_mask; bx_ = visual->blue_mask; #endif #if _WIN32 // windows masks are plain wrong rx_ = 0x7C00; gx_ = 0x03E0; bx_ = 0x001F; #endif rm_ = decodeMask((unsigned short)rx_, &rs_); gm_ = decodeMask((unsigned short)gx_, &gs_); bm_ = decodeMask((unsigned short)bx_, &bs_); } unsigned short TrueColor16::decodeMask(unsigned short mask, int* s) { // first calc ffs for mask unsigned short m1 = mask; int m1s; for (m1s=0; m1s<16; m1s++) { if (m1 & 0x1) break; m1 >>= 1; } // then shift mask to mask a char for (int i=0; i<16; i++) { if (mask & 0x8000) break; mask <<= 1; } mask >>= 8; // now calc ffs for new mask unsigned short m2 = mask; int m2s; for (m2s=0; m2s<16; m2s++) { if (m2 & 0x1) break; m2 >>= 1; } *s = m1s-m2s; return mask; } void TrueColor16::encodeTrueColor(XColor* src, char* dest, XImage* ximage) { if (!ximage) return; int msb = ximage->byte_order; unsigned short r = (unsigned char)src->red; unsigned short g = (unsigned char)src->green; unsigned short b = (unsigned char)src->blue; unsigned short v = 0; v |= rs_>0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); v |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); v |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); if ((!msb && lsb()) || (msb && !lsb())) memcpy(dest, &v, 2); else { unsigned char* rr = (unsigned char*)(&v); *(dest) = *(rr+1); *(dest+1) = *(rr); } } void TrueColor16::decodeTrueColor(char* src, XColor* dest, XImage* ximage) { if (!ximage) return; int msb = ximage->byte_order; unsigned short v = 0; if ((!msb && lsb()) || (msb && !lsb())) memcpy(dest, &v, 2); else { unsigned char* rr = (unsigned char*)(&v); *(rr+1) = *(src+0); *(rr+0) = *(src+1); } dest->red = (unsigned short)((v & rx_) >> rs_); dest->green = (unsigned short)((v & gx_) >> gs_); dest->blue = (unsigned short)((v & bx_) >> bs_); } void TrueColor16::encodeTrueColor(unsigned char* src, XImage* ximage) { int& width = ximage->width; int& height = ximage->height; char* data = ximage->data; int msb = ximage->byte_order; const unsigned char* ptr = src; if ((!msb && lsb()) || (msb && !lsb())) { for (int jj=0; jjbytes_per_line; // may be padded at the end for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); v |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); v |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); memcpy(dest, &v, 2); } } } else { for (int jj=0; jjbytes_per_line; for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); v |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); v |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&v); *(dest) = *(rr+1); *(dest+1) = *(rr); } } } } saods9/tksao1.0/widget/truecolor16.h000644 000765 000000 00000001441 12464214760 017553 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __truecolor16_h__ #define __truecolor16_h__ #include #include #include #include using namespace std; #include class TrueColor16 { protected: unsigned long rx_; unsigned long gx_; unsigned long bx_; unsigned short rm_; unsigned short gm_; unsigned short bm_; int rs_; int gs_; int bs_; private: unsigned short decodeMask(unsigned short, int*); protected: void decodeTrueColor(char*, XColor*, XImage*); void encodeTrueColor(XColor*, char*, XImage*); void encodeTrueColor(unsigned char*, XImage*); public: TrueColor16(Visual*); }; #endif saods9/tksao1.0/widget/truecolor24.C000644 000765 000000 00000014433 12540621044 017502 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "truecolor24.h" #include "util.h" TrueColor24::TrueColor24(Visual* visual) { #if !(_WIN32 || MAC_OSX_TK) ax_ = 0; rx_ = visual->red_mask; gx_ = visual->green_mask; bx_ = visual->blue_mask; #endif #if MAC_OSX_TK ax_ = 0xFF000000; rx_ = 0x00FF0000; gx_ = 0x0000FF00; bx_ = 0x000000FF; #endif #if _WIN32 // windows masks are plain wrong ax_ = 0; rx_ = 0x00FF0000; gx_ = 0x0000FF00; bx_ = 0x000000FF; #endif rs_ = decodeMask((unsigned long)rx_); gs_ = decodeMask((unsigned long)gx_); bs_ = decodeMask((unsigned long)bx_); as_ = decodeMask((unsigned long)ax_); } int TrueColor24::decodeMask(unsigned long mask) { switch (mask) { case 0: return 0; case 0xff: return 0; case 0xff00: return 8; case 0xff0000: return 16; case 0xff000000: return 24; } return 0; } void TrueColor24::encodeTrueColor(XColor* src, char* dest, XImage* ximage) { if (!ximage) return; switch (ximage->bits_per_pixel) { case 24: encodeTrueColor24(src, dest, ximage); break; case 32: encodeTrueColor32(src, dest, ximage); break; } } void TrueColor24::decodeTrueColor(char* src, XColor* dest, XImage* ximage) { if (!ximage) return; switch (ximage->bits_per_pixel) { case 24: decodeTrueColor24(src, dest, ximage); break; case 32: decodeTrueColor32(src, dest, ximage); break; } } void TrueColor24::encodeTrueColor24(XColor* src, char* dest, XImage* ximage) { int msb = ximage->byte_order; unsigned int r = (unsigned char)src->red; unsigned int g = (unsigned char)src->green; unsigned int b = (unsigned char)src->blue; unsigned int v = 0; v |= r << rs_; v |= g << gs_; v |= b << bs_; if ((!msb && lsb()) || (msb && !lsb())) memcpy(dest, &v, 3); else { unsigned char* rr = (unsigned char*)(&v); *(dest+0) = *(rr+3); *(dest+1) = *(rr+2); *(dest+2) = *(rr+1); } } void TrueColor24::decodeTrueColor24(char* src, XColor* dest, XImage* ximage) { int msb = ximage->byte_order; unsigned int v = 0; if ((!msb && lsb()) || (msb && !lsb())) memcpy(&v, src, 3); else { unsigned char* rr = (unsigned char*)(&v); *(rr+3) = *(src+0); *(rr+2) = *(src+1); *(rr+1) = *(src+2); } dest->red = (unsigned short)((v & rx_) >> rs_); dest->green = (unsigned short)((v & gx_) >> gs_); dest->blue = (unsigned short)((v & bx_) >> bs_); } void TrueColor24::encodeTrueColor32(XColor* src, char* dest, XImage* ximage) { int msb = ximage->byte_order; unsigned int r = (unsigned char)src->red; unsigned int g = (unsigned char)src->green; unsigned int b = (unsigned char)src->blue; unsigned int v = 0; #ifdef MAC_OSX_TK unsigned int a = 0xff; v |= a << as_; #endif v |= r << rs_; v |= g << gs_; v |= b << bs_; if ((!msb && lsb()) || (msb && !lsb())) memcpy(dest, &v, 4); else { unsigned char* rr = (unsigned char*)(&v); *(dest+0) = *(rr+3); *(dest+1) = *(rr+2); *(dest+2) = *(rr+1); *(dest+3) = *(rr+0); } } void TrueColor24::decodeTrueColor32(char* src, XColor* dest, XImage* ximage) { int msb = ximage->byte_order; unsigned int v = 0; if ((!msb && lsb()) || (msb && !lsb())) memcpy(dest, &v, 4); else { unsigned char* rr = (unsigned char*)(&v); *(rr+3) = *(src); *(rr+2) = *(src+1); *(rr+1) = *(src+2); *(rr+0) = *(src+3); } dest->red = (unsigned short)((v & rx_) >> rs_); dest->green = (unsigned short)((v & gx_) >> gs_); dest->blue = (unsigned short)((v & bx_) >> bs_); } void TrueColor24::encodeTrueColor(unsigned char* src, XImage* ximage) { if (!ximage) return; switch (ximage->bits_per_pixel) { case 24: encodeTrueColor24(src, ximage); break; case 32: encodeTrueColor32(src, ximage); break; } } void TrueColor24::encodeTrueColor24(unsigned char* src, XImage* ximage) { int& width = ximage->width; int& height = ximage->height; char* data = ximage->data; int bytesPerPixel = ximage->bits_per_pixel/8; int msb = ximage->byte_order; const unsigned char* ptr = src; if ((!msb && lsb()) || (msb && !lsb())) { for (int jj=0; jjbytes_per_line; for (int ii=0; iibytes_per_line; for (int ii=0; iiwidth; int& height = ximage->height; char* data = ximage->data; int bytesPerPixel = ximage->bits_per_pixel/8; int msb = ximage->byte_order; const unsigned char* ptr = src; if ((!msb && lsb()) || (msb && !lsb())) { for (int jj=0; jjbytes_per_line; for (int ii=0; iibytes_per_line; for (int ii=0; ii #include #include #include using namespace std; #include class TrueColor24 { protected: unsigned long rx_; unsigned long gx_; unsigned long bx_; unsigned long ax_; int rs_; int gs_; int bs_; int as_; private: int decodeMask(unsigned long); void decodeTrueColor24(char*, XColor*, XImage*); void decodeTrueColor32(char*, XColor*, XImage*); void encodeTrueColor24(XColor*, char*, XImage*); void encodeTrueColor24(unsigned char*, XImage*); void encodeTrueColor32(XColor*, char*, XImage*); void encodeTrueColor32(unsigned char*, XImage*); protected: void decodeTrueColor(char*, XColor*, XImage*); void encodeTrueColor(XColor*, char*, XImage*); void encodeTrueColor(unsigned char*, XImage*); public: TrueColor24(Visual*); }; #endif saods9/tksao1.0/widget/truecolor8.C000644 000765 000000 00000003232 12464214760 017427 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "truecolor8.h" #include "util.h" TrueColor8::TrueColor8(Visual* visual) { #if !(_WIN32) rx_ = visual->red_mask; gx_ = visual->green_mask; bx_ = visual->blue_mask; #endif #if _WIN32 // windows masks are plain wrong rx_ = 0xE0; gx_ = 0x18; bx_ = 0x07; #endif rm_ = decodeMask((unsigned char)rx_, &rs_); gm_ = decodeMask((unsigned char)rx_, &gs_); bm_ = decodeMask((unsigned char)rx_, &bs_); } unsigned char TrueColor8::decodeMask(unsigned char mask, int* s) { *s=0; for (int i=0; i<8; i++, (*s)++) { if (mask & 0x80) break; mask <<= 1; } return mask; } void TrueColor8::encodeTrueColor(XColor* src, char* dest, XImage* ximage) { *dest = ((((unsigned char)src->blue) & bm_) >> bs_) | ((((unsigned char)src->green) & gm_) >> gs_) | ((((unsigned char)src->red) & rm_) >> rs_); } void TrueColor8::decodeTrueColor(char* src, XColor* dest, XImage* ximage) { dest->red = (unsigned short)((*src & rx_) >> rs_); dest->green = (unsigned short)((*src & gx_) >> gs_); dest->blue = (unsigned short)((*src & bx_) >> bs_); } void TrueColor8::encodeTrueColor(unsigned char* src, XImage* ximage) { int& width = ximage->width; int& height = ximage->height; char* data = ximage->data; const unsigned char* ptr = src; for (int j=0; jbytes_per_line; for (int i=0; i> rs_) | ((ptr[1] & gm_) >> gs_) | ((ptr[2] & bm_) >> bs_); } } saods9/tksao1.0/widget/truecolor8.h000644 000765 000000 00000001430 12464214760 017472 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __truecolor8_h__ #define __truecolor8_h__ #include #include #include #include using namespace std; #include class TrueColor8 { protected: unsigned long rx_; unsigned long gx_; unsigned long bx_; unsigned char rm_; unsigned char gm_; unsigned char bm_; int rs_; int gs_; int bs_; private: unsigned char decodeMask(unsigned char, int*); protected: void decodeTrueColor(char*, XColor*, XImage*); void encodeTrueColor(XColor*, char*, XImage*); void encodeTrueColor(unsigned char*, XImage*); public: TrueColor8(Visual*); }; #endif saods9/tksao1.0/widget/widget.C000644 000765 000000 00000046413 12621175537 016617 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "widget.h" #include "util.h" // Tk Canvas Widget Functions Declaration int WidgetConfigProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[], int flags) { return WIDGET(item).configure(argc, (const char**)argv, flags); } int WidgetCoordProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { return WIDGET(item).coordProc(argc, (char**)argv); } void WidgetDeleteProc(Tk_Canvas canvas, Tk_Item* item, Display* display) { delete ((WidgetOptions*)item)->widget; } void WidgetDisplayProc(Tk_Canvas canvas, Tk_Item* item, Display* display, Drawable draw, int x, int y, int width, int height) { WIDGET(item).displayProc(draw, x, y, width, height); } double WidgetPointProc(Tk_Canvas canvas, Tk_Item* item, double* point) { return WIDGET(item).pointProc(point); } int WidgetAreaProc(Tk_Canvas canvas, Tk_Item* item, double* bbox) { return WIDGET(item).areaProc(bbox); } int WidgetPostscriptProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int prepass) { return WIDGET(item).postscriptProc(prepass); } void WidgetScaleProc(Tk_Canvas canvas, Tk_Item* item, double Ox, double Oy , double Sx, double Sy) { WIDGET(item).scaleProc(Ox, Oy, Sx, Sy); } void WidgetTranslateProc(Tk_Canvas canvas, Tk_Item* item, double x, double y) { WIDGET(item).translateProc(x, y); } int WidgetIndexProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, char indexString, int* indexPtr) { WIDGET(item).indexProc(indexString, indexPtr); return 1; } void WidgetICursorProc(Tk_Canvas canvas, Tk_Item* item, int index) { WIDGET(item).icursorProc(index); } int WidgetSelectionProc(Tk_Canvas canvas, Tk_Item* item, int offset, char* buffer, int maxBytes) { WIDGET(item).selectionProc(offset, buffer, maxBytes); return 1; } void WidgetInsertProc(Tk_Canvas canvas, Tk_Item* item, int index, char* string) { WIDGET(item).insertProc(index, string); } void WidgetDCharsProc(Tk_Canvas canvas, Tk_Item* item, int first, int last) { WIDGET(item).dcharsProc(first, last); } int WidgetParse(ClientData widget, Tcl_Interp* interp, int argc, const char** argv) { int result; Tcl_Preserve(widget); if (argc >= 2 && !strncmp(argv[1],"config",6)) result = ((Widget*)widget)->configCmd(argc-2, argv+2); else { istringstream istr(ios::in|ios::out); ostream ostr(istr.rdbuf()); for (int i=1; iparse(istr); } Tcl_Release(widget); return result; } // Member Functions Widget::Widget(Tcl_Interp* interp_, Tk_Canvas canvas_, Tk_Item* item) : interp(interp_), canvas(canvas_) { // initialize item ptr to this. This is the method the canvas widget procs // know how to call member functions. ((WidgetOptions*)item)->widget = this; // init members options = (WidgetOptions*)item; configSpecs = NULL; tkwin = Tk_CanvasTkwin(canvas); display = Tk_Display(tkwin); screenNumber = Tk_ScreenNumber(tkwin); visual = Tk_Visual(tkwin); depth = Tk_Depth(tkwin); pixmap = 0; visible = True; originX = 0; originY = 0; // this is needed because of a problem with Tk_ConfigureWidget options->cmdName = NULL; options->helvetica = NULL; options->courier = NULL; options->times = NULL; cmd = NULL; result = TCL_OK; // create GC for pixmap XGCValues values; gc = Tk_GetGC(tkwin, 0, &values); // postscript psLevel = 2; psResolution = 300; psColorSpace = RGB; } Widget::~Widget() { // free the options Tk_FreeOptions(configSpecs, (char*)this->options, display, 0); // clean up tcl command if (cmd) { Tcl_DeleteCommand(interp, cmd); delete [] cmd; } // clean up pixmap resources if (pixmap) Tk_FreePixmap(display, pixmap); if (gc) Tk_FreeGC(display, gc); } void Widget::error(const char* m) { Tcl_AppendResult(interp, m, NULL); result = TCL_ERROR; } void Widget::msg(const char* m) { Tcl_AppendResult(interp, m, NULL); } int Widget::configure(int argc, const char** argv, int flags) { if (Tk_ConfigureWidget(interp, tkwin, configSpecs, argc, argv, (char*)this->options, flags) != TCL_OK) return TCL_ERROR; if (flags != TK_CONFIG_ARGV_ONLY) { // create command createCommand(); updateBBox(); invalidPixmap(); } else { // configure command if (configSpecs[CONFIGCOMMAND].specFlags & TK_CONFIG_OPTION_SPECIFIED) createCommand(); if ((configSpecs[CONFIGX].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGY].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGWIDTH].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGHEIGHT].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGANCHOR].specFlags & TK_CONFIG_OPTION_SPECIFIED)) updateBBox(); if ((configSpecs[CONFIGWIDTH].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGHEIGHT].specFlags & TK_CONFIG_OPTION_SPECIFIED)) invalidPixmap(); if ((configSpecs[CONFIGX].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGY].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGWIDTH].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGHEIGHT].specFlags & TK_CONFIG_OPTION_SPECIFIED) || (configSpecs[CONFIGANCHOR].specFlags & TK_CONFIG_OPTION_SPECIFIED)) redraw(); } return TCL_OK; } // Required Canvas Functions int Widget::coordProc(int argc, char** argv) { char xStr[TCL_DOUBLE_SPACE], yStr[TCL_DOUBLE_SPACE]; switch (argc) { // print the current values case 0: Tcl_PrintDouble(interp, options->x, xStr); Tcl_PrintDouble(interp, options->y, yStr); Tcl_AppendResult(interp, xStr, " ", yStr, NULL); return TCL_OK; // set current x&y to new values case 2: { double x0, y0; if ((Tk_CanvasGetCoord(interp, canvas, argv[0], &x0) != TCL_OK) || (Tk_CanvasGetCoord(interp, canvas, argv[1], &y0) != TCL_OK)) return TCL_ERROR; options->x = (int)x0; options->y = (int)y0; updateBBox(); return TCL_OK; } // else, error message default: Tcl_AppendResult(interp, "wrong # coordinates: expected 0 or 2", NULL); return TCL_ERROR; } } // Widget Display Procedure. It takes the contents of the pixmap and // after clipping, copies it into the drawable. void Widget::displayProc(Drawable draw, int clipX, int clipY, int clipWidth, int clipHeight) { if (visible == False) return; // create bbox BBox bb(clipX, clipY, clipX+clipWidth, clipY+clipHeight); // update the pixmap from ximage/graphics if (updatePixmap(bb) != TCL_OK) return; // something is wrong, bail out // define pixmap clip region // NOTE: it appears that the canvas coord system is 1 to n, width/height = n // with the original of value 1,1 located at upper left corner int pmX, pmY, pmWidth, pmHeight; if (clipX > options->item.x1) { pmX = clipX - options->item.x1; pmWidth = options->item.x2 - clipX; } else { pmX = 0; if ((clipX + clipWidth) < options->item.x2) pmWidth = clipX + clipWidth - options->item.x1; else pmWidth = options->item.x2 - options->item.x1; } if (clipY > options->item.y1) { pmY = clipY - options->item.y1; pmHeight = options->item.y2 - clipY; } else { pmY = 0; if ((clipY + clipHeight) < options->item.y2) pmHeight = clipY + clipHeight - options->item.y1; else pmHeight = options->item.y2 - options->item.y1; } // convert to canvas coords short drawX, drawY; Tk_CanvasDrawableCoords(canvas, (double)(options->item.x1 + pmX), (double)(options->item.y1 + pmY), &drawX, &drawY); // set the clip region and copy the pixmap into the drawable XSetClipOrigin(display, gc, drawX - pmX, drawY - pmY); XCopyArea(display, pixmap, draw, gc, pmX, pmY, (unsigned int) pmWidth, (unsigned int) pmHeight, drawX, drawY); } double Widget::pointProc(double* point) { double xdiff, ydiff; if (point[0] < options->item.x1) xdiff = options->item.x1 - point[0]; else if (point[0] > options->item.x2) xdiff = point[0] - options->item.x2; else xdiff = 0; if (point[1] < options->item.y1) ydiff = options->item.y1 - point[1]; else if (point[1] > options->item.y2) ydiff = point[1] - options->item.y2; else ydiff = 0; return hypot(xdiff, ydiff); } int Widget::areaProc(double* bbox) { if ((bbox[2] <= options->item.x1) || (bbox[0] >= options->item.x2) || (bbox[3] <= options->item.y1) || (bbox[1] >= options->item.y2)) return -1; // item is outside bbox if ((bbox[0] <= options->item.x1) && (bbox[1] <= options->item.y1) && (bbox[2] >= options->item.x2) && (bbox[3] >= options->item.y2)) return 1; // item is inside bbox return 0; // item overlaps bbox } int Widget::postscriptProc(int prepass) { return TCL_OK; } void Widget::scaleProc(double Ox, double Oy, double Sx, double Sy) { // translate to (Ox,Oy), scale by (Sx,Sy), translate back from (Ox,Oy) options->x = (int)(Ox + (Sx * (options->x - Ox))); options->y = (int)(Oy + (Sy * (options->y - Oy))); options->width = (int)(options->width * Sx); options->height = (int)(options->height * Sy); updateBBox(); invalidPixmap(); // width and height have changed } void Widget::translateProc(double deltaX, double deltaY) { options->x += (int)deltaX; options->y += (int)deltaY; updateBBox(); } // Subcommand Functions int Widget::configCmd(int argc, const char** argv) { switch (argc) { case 0: return Tk_ConfigureInfo(interp, tkwin, configSpecs, (char*)this->options, NULL, 0); case 1: return Tk_ConfigureInfo(interp, tkwin, configSpecs, (char*)this->options, argv[0],0); default: return configure(argc, argv, TK_CONFIG_ARGV_ONLY); } } void Widget::getHeightCmd() { ostringstream str; str << options->height << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Widget::getWidthCmd() { ostringstream str; str << options->width << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Widget::hideCmd() { visible = False; redraw(); } void Widget::queryCursorCmd() { Window root, child; int rootx,rooty,winx,winy; unsigned int msk; XQueryPointer(display,Tk_WindowId(tkwin),&root,&child, &rootx,&rooty,&winx,&winy,&msk); #ifdef MAC_OSX_TK // XQueryPointer: Only a partial implementation // only rootx,rooty are valid int xx,yy; Tk_GetRootCoords(tkwin,&xx,&yy); winx = rootx-xx; winy = rooty-yy; #endif #ifdef _WIN32 win_x = *root_x_return; win_y = *root_y_return; #endif ostringstream str; str << winx << ' ' << winy << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Widget::resetCmd() { reset(); invalidPixmap(); redraw(); } void Widget::showCmd() { visible = True; redraw(); } // Private Member Functions void Widget::createCommand() { if (cmd) { Tcl_DeleteCommand(interp, cmd); if (cmd) delete [] cmd; } cmd = new char[strlen(options->cmdName)+1]; strcpy(cmd, options->cmdName); Tcl_CreateCommand(interp, cmd, WidgetParse, (ClientData)this, NULL); } int Widget::checkArgs(int should, int argc, char** argv) { // if should is negative, don't check if (should >= 0) { if (should != argc) { ostringstream str; str << should << '\0'; Tcl_AppendResult(interp, "wrong # args: requires ", str.str().c_str(), " args.", NULL); return TCL_ERROR; } else return TCL_OK; } return TCL_OK; } double Widget::getDisplayRatio() { return 25.4/72 * DisplayWidth(display, screenNumber) / DisplayWidthMM(display, screenNumber); } void Widget::invalidPixmap() { if (pixmap) Tk_FreePixmap(display, pixmap); pixmap = 0; } void Widget::redraw() { Tk_CanvasEventuallyRedraw(canvas, options->item.x1, options->item.y1, options->item.x2, options->item.y2); } void Widget::redraw(BBox bb) { // bb in canvas coords // we need to expand by 1, i don't know why Tk_CanvasEventuallyRedraw(canvas, (int)bb.ll[0], (int)bb.ll[1], (int)bb.ur[0]+1, (int)bb.ur[1]+1); } void Widget::redrawNow() { Tk_CanvasEventuallyRedraw(canvas, options->item.x1, options->item.y1, options->item.x2, options->item.y2); Tcl_DoOneEvent(TCL_IDLE_EVENTS); } void Widget::redrawNow(BBox bb) { // bb in canvas coords // we need to expand by 1, i don't know why Tk_CanvasEventuallyRedraw(canvas, (int)bb.ll[0], (int)bb.ll[1], (int)bb.ur[0]+1, (int)bb.ur[1]+1); Tcl_DoOneEvent(TCL_IDLE_EVENTS); } void Widget::forceUpdate() { Tcl_DoOneEvent(TCL_IDLE_EVENTS); } // Update Bounding Box. For image at (n,n) with size (m,m), // bbox is defined from (n,n) to (n+m,n+m) void Widget::updateBBox() { originX = options->x; originY = options->y; int& ww = options->width; int& hh = options->height; // Modify position point using anchor information. switch (options->anchor) { case TK_ANCHOR_N: originX -= ww/2; break; case TK_ANCHOR_NE: originX -= ww; break; case TK_ANCHOR_E: originX -= ww; originY -= hh/2; break; case TK_ANCHOR_SE: originX -= ww; originY -= hh; break; case TK_ANCHOR_S: originX -= ww/2; originY -= hh; break; case TK_ANCHOR_SW: originY -= hh; break; case TK_ANCHOR_W: originY -= hh/2; break; case TK_ANCHOR_NW: break; case TK_ANCHOR_CENTER: originX -= ww/2; originY -= hh/2; break; } // Update item item options->item.x1 = originX; options->item.y1 = originY; options->item.x2 = originX + options->width; options->item.y2 = originY + options->height; } int Widget::getColor(const char* str) { XColor* cc= NULL; // starting with tk8.6, colors are W3C based, not X11 if (!strncmp(str,"green",5) || !strncmp(str,"GREEN",5)) cc = Tk_GetColor(interp, tkwin, "lime"); else cc = Tk_GetColor(interp, tkwin, str); return cc ? cc->pixel : 0; } XColor* Widget::getXColor(const char* str) { // note: Tk_GetColor can return an XColor without valid red,green,blue // if common colorname is used. (uses XAllocNamedColor). // force an hash string instead (uses XAllocColor). XColor* cc=NULL; if (!strncmp(str,"white",5)) cc = Tk_GetColor(interp, tkwin, "#ffffff"); else if (!strncmp(str,"black",5)) cc = Tk_GetColor(interp, tkwin, "#000000"); else if (!strncmp(str,"red",3)) cc = Tk_GetColor(interp, tkwin, "#ff0000"); else if (!strncmp(str,"green",5)) cc = Tk_GetColor(interp, tkwin, "#00ff00"); else if (!strncmp(str,"blue",4)) cc = Tk_GetColor(interp, tkwin, "#0000ff"); else if (!strncmp(str,"cyan",4)) cc = Tk_GetColor(interp, tkwin, "#00ffff"); else if (!strncmp(str,"magenta",7)) cc = Tk_GetColor(interp, tkwin, "#ff00ff"); else if (!strncmp(str,"yellow",6)) cc = Tk_GetColor(interp, tkwin, "#ffff00"); else cc = Tk_GetColor(interp, tkwin, str); return cc ? cc : Tk_GetColor(interp, tkwin, "white"); } void Widget::warp(Vector& vv) { #if !(_WIN32 || MAC_OSX_TK) XWarpPointer(display, None, None, 0, 0, 0, 0, vv[0], vv[1]); #endif #ifdef MAC_OSX_TK XXWarpPointer(display, None, None, 0, 0, 0, 0, vv[0], vv[1]); #endif #ifdef _WIN32 Window root, child; int rootx,rooty,winx,winy; unsigned int msk; XQueryPointer(display,Tk_WindowId(tkwin),&root,&child, &rootx,&rooty,&winx,&winy,&msk); XWarpPointer(display, None, Tk_WindowId(tkwin), 0, 0, 0, 0, winx+vv[0], winy+vv[1]); #endif } void Widget::warpTo(Vector& vv) { #if !(MAC_OSX_TK) XWarpPointer(display, None, Tk_WindowId(tkwin), 0, 0, 0, 0, vv[0], vv[1]); #endif #ifdef MAC_OSX_TK XXWarpPointer(display, None, Tk_WindowId(tkwin), 0, 0, 0, 0, vv[0], vv[1]); #endif } void Widget::psHead1(int width, int height) { ostringstream str; switch (psColorSpace) { case BW: case GRAY: str << "/picstr " << dec << width << " string def" << endl << width << ' ' << height << " 8 matrix" << endl << "{currentfile picstr readhexstring pop}" << endl << "image" << endl; break; case RGB: case CMYK: str << "/picstr " << dec << width*3 << " string def" << endl << width << ' ' << height << " 8 matrix" << endl << "{currentfile picstr readhexstring pop}" << endl << "false 3 colorimage" << endl; break; } str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Widget::psHead2(int width, int height, const char* compress, const char* decode) { ostringstream str; switch (psColorSpace) { case BW: case GRAY: str << "/DeviceGray setcolorspace" << endl; break; case RGB: str << "/DeviceRGB setcolorspace" << endl; break; case CMYK: str << "/DeviceCMYK setcolorspace" << endl; break; } str << "<<" << endl << "/ImageType 1" << endl << "/Width " << dec << width << endl << "/Height " << dec << height << endl << "/BitsPerComponent 8" << endl; switch (psColorSpace) { case BW: case GRAY: str << "/Decode [0 1]" << endl; break; case RGB: str << "/Decode [0 1 0 1 0 1]" << endl; break; case CMYK: str << "/Decode [0 1 0 1 0 1 0 1]" << endl; break; } // << "/ASCIIHexDecode filter" << endl // << "/ASCII85Decode filter" << endl // << "/RunLengthDecode filter" << endl // << "/FlateDecode filter" << endl str << "/ImageMatrix matrix" << endl << "/DataSource currentfile" << endl; if (decode) str << "/" << decode << "Decode filter" << endl; if (compress) str << "/" << compress << "Decode filter" << endl; str << ">>" << endl << "image" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } // compute coordinates of lower-left corner of the image // taking into account the anchor position for the image. // this mapping is different than in widget.c, due to postscript origin // (y is flipped) Vector Widget::psOrigin() { double xx = options->x; double yy = Tk_CanvasPsY(canvas, options->y); double ww = options->width; double hh = options->height; switch (options->anchor) { case TK_ANCHOR_N: xx -= ww/2; yy -= hh; break; case TK_ANCHOR_NE: xx -= ww; yy -= hh; break; case TK_ANCHOR_E: xx -= ww; yy -= hh/2; break; case TK_ANCHOR_SE: xx -= ww; break; case TK_ANCHOR_S: xx -= ww/2; break; case TK_ANCHOR_SW: break; case TK_ANCHOR_W: yy -= hh/2; break; case TK_ANCHOR_NW: yy -= hh; break; case TK_ANCHOR_CENTER: xx -= ww/2; yy -= hh/2; break; } return Vector(xx,yy); } // this routine attemps a work around for a problems with level 2 postscript // and other software such as dvips and assemble void Widget::psFix(ostringstream& ostr) { string str = ostr.str(); const char* buf = str.c_str(); int size = str.length(); char* a = (char*)buf; while (*a && a #include #include #include #include #include #include #include using namespace std; #include #include #include "vector.h" class Attribute; extern float psScale; // General Defines #define WIDGET(x) (*(((WidgetOptions*)(x))->widget)) // Widget ConfigSpecs Defines #define CONFIGX 1 #define CONFIGY 2 #define CONFIGWIDTH 3 #define CONFIGHEIGHT 4 #define CONFIGANCHOR 5 #define CONFIGCOMMAND 6 #define CONFIGHELVETICA 7 #define CONFIGCOURIER 8 #define CONFIGTIMES 9 // Tk Canvas Widget Function Declarations extern int WidgetConfigProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const [],int); extern int WidgetCoordProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); extern void WidgetDeleteProc(Tk_Canvas, Tk_Item*, Display*); extern void WidgetDisplayProc(Tk_Canvas, Tk_Item*, Display*, Drawable, int, int, int, int); extern double WidgetPointProc(Tk_Canvas, Tk_Item*, double*); extern int WidgetAreaProc(Tk_Canvas, Tk_Item*, double*); extern int WidgetPostscriptProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int); extern void WidgetScaleProc(Tk_Canvas, Tk_Item*, double, double, double, double); extern void WidgetTranslateProc(Tk_Canvas, Tk_Item*, double, double); extern int WidgetIndexProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, char, int*); extern void WidgetICursorProc(Tk_Canvas, Tk_Item*, int); extern int WidgetSelectionProc(Tk_Canvas, Tk_Item*, int, char*, int); extern void WidgetInsertProc(Tk_Canvas, Tk_Item*, int, char*); extern void WidgetDCharsProc(Tk_Canvas, Tk_Item*, int, int); extern int WidgetParse(ClientData, Tcl_Interp*, int, char**); class Widget; // this structure is returned by each Canvas Function Proc struct WidgetOptions { Tk_Item item; // required by tk int x, y; // Coordinates of positioning point on canvas int width; // widget width int height; // widget height Tk_Anchor anchor; // Where to anchor widget relative to x,y char* cmdName; // Suggested Tcl command name char* helvetica; // name of X11 font char* courier; // name of X11 font char* times; // name of X11 font Widget* widget; // pointer to widget class }; // Widget Class class Widget { friend class Attribute; public: enum PSColorSpace {BW, GRAY, RGB, CMYK}; Tcl_Interp* interp; // Tcl interp protected: WidgetOptions* options; // Pointer to Tk Options Tk_ConfigSpec* configSpecs; // configure specs Tk_Canvas canvas; // handle to canvas Tk_Window tkwin; // Tk window id Display* display; // display of canvas Visual* visual; // visual of canvas int depth; // depth of canvas int screenNumber; // screen number of canvas Pixmap pixmap; // size of canvas item GC gc; // gc for pixmap XCopyArea int visible; // redraw when true int originX; // widget upper left origin int originY; // widget upper left origin char* cmd; // actual command name used int result; // result of TCL command int psResolution; // postscript resolution int psLevel; // postscript level PSColorSpace psColorSpace; // postscript color space protected: virtual int updatePixmap(const BBox&) =0; // render into pixmap virtual void invalidPixmap(); // pixmap is invalid virtual void reset() {}; // reset widget void createCommand(); // create tcl command void updateBBox(); // update item bounding box int checkArgs(int, int, char**); // check args utility void psHead1(int, int); void psHead2(int, int, const char*, const char*); Vector psOrigin(); void psFix(ostringstream& ostr); public: Widget(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Widget(); Tcl_Interp* getInterp() {return interp;} void redraw(); // ping tk to redraw this widget void redraw(BBox); // ping tk to redraw this bbox void redrawNow(); // force update now this widget void redrawNow(BBox); // force update now this bbox void forceUpdate(); // only force update virtual int parse(istringstream&) =0; // parse subcommands virtual int configure(int, const char**, int); // parse config options void error(const char*); // parse error function void msg(const char*); // parse msg function Tk_Window getTkwin() {return tkwin;} Display* getDisplay() {return display;} double getDisplayRatio(); Visual* getVisual() {return visual;} int getWidth() {return options->width;} int getHeight() {return options->height;} int getDepth() {return depth;} int getScreenNumber() {return screenNumber;} Tk_Canvas getCanvas() {return canvas;} int getColor(const char* str); XColor* getXColor(const char*); void warp(Vector&); void warpTo(Vector&); // Required Canvas Functions int coordProc(int, char**); void displayProc(Drawable, int, int, int, int); double pointProc(double*); int areaProc(double*); virtual int postscriptProc(int); void scaleProc(double, double, double, double); void translateProc(double, double); virtual int indexProc(char indexString, int* indexPtr) {return TCL_OK;} virtual void icursorProc(int index) {} virtual int selectionProc(int offset, char* buffer, int maxBytes) {return maxBytes;} virtual void insertProc(int index, char* string) {} virtual void dcharsProc(int first, int last) {} // Subcommand Functions int configCmd(int, const char**); // configure command void getHeightCmd(); // return height of widget void getWidthCmd(); // return width of widget void hideCmd(); // hide item command void queryCursorCmd(); // get cursor coords void resetCmd(); // reset item command void showCmd(); // show item command // Postscript Commands void psLevelCmd(int l) {psLevel = l;} void psResolutionCmd(int r) {psResolution = r;} void psColorSpaceCmd(PSColorSpace c) {psColorSpace = c;} void psScaleCmd(float s) {psScale = s;} #ifdef MAC_OSX_TK virtual void macsosxPrintCmd() {} #endif }; #endif saods9/tksao1.0/vector/vector.C000644 000765 000000 00000013313 12464214757 016651 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "vector.h" #include "vector3d.h" #include "fuzzy.h" // Vector Vector::Vector(const Vector3d& a) { v[0]=a.v[0]; v[1]=a.v[1]; v[2]=1; } Vector& Vector::operator=(const Vector3d& a) { v[0]=a.v[0]; v[1]=a.v[1]; v[2]=1; return *this; } Vector& Vector::clip(const BBox& bb) { Vector ll=bb.ll; Vector ur=bb.ur; if (v[0]ur[0]) v[0]=ur[0]; if (v[1]ur[1]) v[1]=ur[1]; return *this; } Vector Vector::TkCanvasPs(void* canvas) { return Vector(v[0], Tk_CanvasPsY((Tk_Canvas)canvas, v[1])); } ostream& operator<<(ostream& s, const Vector& v) { s << ' ' << v.v[0] << ' ' << v.v[1] << ' '; return s; } istream& operator>>(istream& s, Vector& v) { s >> v.v[0] >> v.v[1]; return s; } // Vertex ostream& operator<<(ostream& s, const Vertex& v) { s << v.vector; return s; } // Matrix Matrix& Matrix::operator*=(const Matrix& a) { Matrix r; for (int i=0; i<3; i++) for (int j=0; j<3; j++) r.m[i][j] = m[i][0]*a.m[0][j] + m[i][1]*a.m[1][j] + m[i][2]*a.m[2][j]; return *this=r; } Matrix Matrix::invert() { Matrix cc = this->cofactor(); Matrix aa = cc.adjoint(); double dd = m[0][0]*aa.m[0][0] + m[0][1]*aa.m[1][0] + m[0][2]*aa.m[2][0]; Matrix rr; for (int ii=0; ii<3; ii++ ) for (int jj=0; jj<3; jj++) rr.m[ii][jj] = aa.m[ii][jj]/dd; return rr; } Matrix Matrix::cofactor() { Matrix rr; rr.m[0][0] = +(m[1][1]*m[2][2]-m[1][2]*m[2][1]); rr.m[0][1] = -(m[1][0]*m[2][2]-m[1][2]*m[2][0]); rr.m[0][2] = +(m[1][0]*m[2][1]-m[1][1]*m[2][0]); rr.m[1][0] = -(m[0][1]*m[2][2]-m[0][2]*m[2][1]); rr.m[1][1] = +(m[0][0]*m[2][2]-m[0][2]*m[2][0]); rr.m[1][2] = -(m[0][0]*m[2][1]-m[0][1]*m[2][0]); rr.m[2][0] = +(m[0][1]*m[1][2]-m[0][2]*m[1][1]); rr.m[2][1] = -(m[0][0]*m[1][2]-m[0][2]*m[1][0]); rr.m[2][2] = +(m[0][0]*m[1][1]-m[0][1]*m[1][0]); return rr; } double Matrix::det() { return + m[0][0]*(m[1][1]*m[2][2]-m[1][2]*m[2][1]) - m[0][1]*(m[1][0]*m[2][2]-m[1][2]*m[2][0]) + m[0][2]*(m[1][0]*m[2][1]-m[1][1]*m[2][0]); } Matrix Matrix::adjoint() { Matrix rr; for (int ii=0; ii<3; ii++) for (int jj=0; jj<3; jj++) rr.m[jj][ii] = m[ii][jj]; return rr; } ostream& operator<<(ostream& s, const Matrix& m) { s << ' '; for (int i=0; i<3; i++) for (int j=0; j<2; j++) s << m.m[i][j] << ' '; return s; } istream& operator>>(istream& s, Matrix& m) { for (int i=0; i<3; i++ ) for (int j=0; j<2; j++) s >> m.m[i][j]; return s; } // Translate ostream& operator<<(ostream& s, const Translate& m) { s << ' ' << m.m[2][0] << ' ' << m.m[2][1] << ' '; return s; } istream& operator>>(istream& s, Translate& m) { s >> m.m[2][0] >> m.m[2][1]; return s; } // Scale ostream& operator<<(ostream& s, const Scale& m) { s << ' ' << m.m[0][0] << ' ' << m.m[1][1] << ' '; return s; } istream& operator>>(istream& s, Scale& m) { s >> m.m[0][0] >> m.m[1][1]; return s; } // Rotate Rotate::Rotate(double a) : Matrix() { // note: signs reverse for X-Windows (origin is upper left) m[0][0] = cos(a); m[0][1] = -sin(a); m[1][0] = sin(a); m[1][1] = cos(a); // this fixes a problem with numbers too small and tring to invert the matrix tzero(&m[0][0]); tzero(&m[0][1]); tzero(&m[1][0]); tzero(&m[1][1]); } ostream& operator<<(ostream& s, const Rotate& m) { s << ' ' << m.m[0][0] << ' ' << m.m[0][1] << ' ' << m.m[1][0] << ' ' << m.m[1][1] << ' '; return s; } istream& operator>>(istream& s, Rotate& m) { s >> m.m[0][0] >> m.m[0][1] >> m.m[1][0] >> m.m[1][1]; return s; } // BBox BBox::BBox(double a, double b, double c, double d) { // we want a 'positive' box ll.v[0] = a < c ? a : c; ll.v[1] = b < d ? b : d; ur.v[0] = a < c ? c : a; ur.v[1] = b < d ? d : b; } BBox::BBox(const Vector& l, const Vector& h) { // we want a 'positive' box ll.v[0] = l.v[0] < h.v[0] ? l.v[0] : h.v[0]; ll.v[1] = l.v[1] < h.v[1] ? l.v[1] : h.v[1]; ur.v[0] = l.v[0] < h.v[0] ? h.v[0] : l.v[0]; ur.v[1] = l.v[1] < h.v[1] ? h.v[1] : l.v[1]; } int BBox::isIn(const Vector& v) const { return !(v.v[0] < ll.v[0] || v.v[1] < ll.v[1] || v.v[0] > ur.v[0] || v.v[1] > ur.v[1]); } int BBox::isIn(const BBox& bb) const { // return 0 if outside, > 0 if intersection // = 4 if inside BBox b = bb; return isIn(b.ll) + isIn(b.ur) + isIn(b.ul()) + isIn(b.lr()); } BBox& BBox::bound(const Vector& v) { if (v.v[0] < ll[0]) ll[0] = v.v[0]; if (v.v[1] < ll[1]) ll[1] = v.v[1]; if (v.v[0] > ur[0]) ur[0] = v.v[0]; if (v.v[1] > ur[1]) ur[1] = v.v[1]; return *this; } BBox& BBox::bound(BBox b) { this->bound(b.ll); this->bound(b.lr()); this->bound(b.ur); this->bound(b.ul()); return *this; } BBox intersect(const BBox& a, const BBox& b) { // test for obvious int ab = a.isIn(b); int ba = b.isIn(a); // no intersection? if (ab==0 && ba == 0) { // maybe they are just crossed, check the centers int abc = a.isIn(((BBox&)b).center()); int bac = b.isIn(((BBox&)a).center()); if (abc==0 && bac==0) return BBox(); } if (ab == 4) // b is inside a return b; if (ba == 4) // a is inside b return a; // else, there seems to be some overlap BBox r; r.ll.v[0] = (a.ll.v[0] > b.ll.v[0]) ? a.ll.v[0] : b.ll.v[0]; r.ll.v[1] = (a.ll.v[1] > b.ll.v[1]) ? a.ll.v[1] : b.ll.v[1]; r.ur.v[0] = (a.ur.v[0] < b.ur.v[0]) ? a.ur.v[0] : b.ur.v[0]; r.ur.v[1] = (a.ur.v[1] < b.ur.v[1]) ? a.ur.v[1] : b.ur.v[1]; return r; } ostream& operator<<(ostream& s, const BBox& b) { s << b.ll << b.ur; return s; } saods9/tksao1.0/vector/vector.h000644 000765 000000 00000020347 12464214757 016723 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __vector_h__ #define __vector_h__ #include #include #include using namespace std; class Vector3d; class Matrix; class BBox; class Vector { public: double v[3]; public: Vector() {v[0]=0; v[1]=0; v[2]=1;} Vector(double* f) {v[0]=f[0]; v[1]=f[1]; v[2]=1;} Vector(double x, double y) {v[0]=x; v[1]=y; v[2]=1;} Vector(const Vector& a) {v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2];} Vector& operator=(const Vector& a) {v[0]=a.v[0]; v[1]=a.v[1]; v[2]=a.v[2]; return *this;} Vector(const Vector3d&); Vector& operator=(const Vector3d&); double& operator[](int i) {return v[i];} // return element double* vv() {return v;} // return vector Vector& operator+=(const Vector& a) // addition {v[0]+=a.v[0]; v[1]+=a.v[1]; return *this;} Vector& operator-=(const Vector& a) // subtraction {v[0]-=a.v[0]; v[1]-=a.v[1]; return *this;} Vector& operator*=(double f) // scalar multipy {v[0]*=f; v[1]*=f; return *this;} Vector& operator/=(double f) // scalar division {v[0]/=f; v[1]/=f; return *this;} Vector& operator*=(const Matrix& m); // vector multipy Vector abs() {return Vector(fabs(v[0]),fabs(v[1]));} double angle() {return atan2(v[1],v[0]);} Vector ceil() {return Vector(::ceil(v[0]),::ceil(v[1]));} Vector floor() {return Vector(::floor(v[0]),::floor(v[1]));} Vector invert() {return Vector(1/v[0],1/v[1]);} double length() {return sqrt(v[0]*v[0]+v[1]*v[1]);} double area() {return v[0]*v[1];} Vector round() {return Vector((int)(v[0]+.5),(int)(v[1]+.5));} Vector normalize() {double d = sqrt(v[0]*v[0]+v[1]*v[1]); return d ? Vector(v[0]/d,v[1]/d) : Vector();} Vector& clip(const BBox&); Vector TkCanvasPs(void* canvas); }; ostream& operator<<(ostream&, const Vector&); istream& operator>>(istream&, Vector&); inline Vector operator-(const Vector& a) {return Vector(-a.v[0],-a.v[1]);} inline Vector operator+(const Vector& a, const Vector& b) {return Vector(a) +=b;} inline Vector operator-(const Vector& a, const Vector& b) {return Vector(a) -=b;} inline Vector operator*(const Vector& a, double b) {return Vector(a) *=b;} inline Vector operator/(const Vector& a, double b) {return Vector(a) /=b;} inline Vector operator*(const Vector& v, const Matrix& m) {return Vector(v) *=m;} inline double operator*(const Vector& a, const Vector& b) // dot product {double r =0; r+=a.v[0]*b.v[0]; r+=a.v[1]*b.v[1]; return r;} class Vertex { public: Vector vector; private: Vertex* next_; Vertex* previous_; public: Vertex() {next_=NULL; previous_=NULL;} Vertex(double x, double y) {vector=Vector(x,y); next_=NULL; previous_=NULL;} Vertex(const Vector& a) {vector=a; next_=NULL; previous_=NULL;} Vertex(const Vertex& a) {vector=a.vector; next_=a.next_; previous_=a.previous_;} Vertex& operator=(const Vertex& a) {vector=a.vector; next_=a.next_; previous_=a.previous_; return *this;} Vertex* next() {return next_;} Vertex* previous() {return previous_;} void setNext(Vertex* v) {next_=v;} void setPrevious(Vertex* v) {previous_=v;} }; ostream& operator<<(ostream&, const Vertex&); class Matrix { public: double m[3][3]; public: Matrix() { m[0][0]=1; m[0][1]=0; m[0][2]=0; m[1][0]=0; m[1][1]=1; m[1][2]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1;} Matrix(double a, double b, double c, double d, double e, double f) { m[0][0]=a; m[0][1]=b; m[0][2]=0; m[1][0]=c; m[1][1]=d; m[1][2]=0; m[2][0]=e; m[2][1]=f; m[2][2]=1;} Matrix(double a, double b, double c, double d, double e, double f, double g, double h, double i) { m[0][0]=a; m[0][1]=b; m[0][2]=c; m[1][0]=d; m[1][1]=e; m[1][2]=f; m[2][0]=g; m[2][1]=h; m[2][2]=i;} Matrix(const Matrix& a) { m[0][0]=a.m[0][0]; m[0][1]=a.m[0][1]; m[0][2]=a.m[0][2]; m[1][0]=a.m[1][0]; m[1][1]=a.m[1][1]; m[1][2]=a.m[1][2]; m[2][0]=a.m[2][0]; m[2][1]=a.m[2][1]; m[2][2]=a.m[2][2];} Matrix& operator=(const Matrix& a) { m[0][0]=a.m[0][0]; m[0][1]=a.m[0][1]; m[0][2]=a.m[0][2]; m[1][0]=a.m[1][0]; m[1][1]=a.m[1][1]; m[1][2]=a.m[1][2]; m[2][0]=a.m[2][0]; m[2][1]=a.m[2][1]; m[2][2]=a.m[2][2]; return *this;} double matrix(int i, int j) // return element {return m[i][j];} Vector operator[](int i) // return row {return Vector(m[i]);} double* mm() const // return matrix {return (double*)m;} Matrix& identity() { m[0][0]=1; m[0][1]=0; m[0][2]=0; m[1][0]=0; m[1][1]=1; m[1][2]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1; return *this;} Matrix& operator*=(const Matrix&); // matrix multiply Matrix invert(); Matrix cofactor(); Matrix adjoint(); double det(); }; ostream& operator<<(ostream&, const Matrix&); istream& operator>>(istream&, Matrix&); inline Matrix operator*(const Matrix& a, const Matrix& b) {return Matrix(a) *= b;} inline Vector& Vector::operator*=(const Matrix& m) { double vv[3]; double* mm = (double*)(m.m); vv[0] = v[0]*mm[0] + v[1]*mm[3] + v[2]*mm[6]; vv[1] = v[0]*mm[1] + v[1]*mm[4] + v[2]*mm[7]; vv[2] = v[0]*mm[2] + v[1]*mm[5] + v[2]*mm[8]; v[0] = vv[0]; v[1] = vv[1]; v[2] = vv[2]; return *this; } class Translate : public Matrix { public: Translate() {}; Translate(double x, double y) {m[2][0]=x; m[2][1]=y;} Translate(const Vector& v) {m[2][0]=v.v[0]; m[2][1]=v.v[1];} Translate(const Matrix& a) {m[2][0] = a.m[2][0]; m[2][1] = a.m[2][1];} }; ostream& operator<<(ostream&, const Translate&); istream& operator>>(istream&, Translate&); class Scale : public Matrix { public: Scale() {}; Scale(double a) {m[0][0]=a; m[1][1]=a;} Scale(double a, double b) {m[0][0]=a; m[1][1]=b;} Scale(const Vector& v) {m[0][0]=v.v[0]; m[1][1]=v.v[1];} Scale(const Matrix& a) {m[0][0] = a.m[0][0]; m[1][1] = a.m[1][1];} }; ostream& operator<<(ostream&, const Scale&); istream& operator>>(istream&, Scale&); class FlipX : public Matrix { public: FlipX() {m[0][0] = -1;} }; class FlipY : public Matrix { public: FlipY() {m[1][1] = -1;} }; class FlipXY : public Matrix { public: FlipXY() {m[0][0] = -1; m[1][1] = -1;} }; class Rotate : public Matrix { public: Rotate() {}; Rotate(double); Rotate(double a, double b, double c, double d) {m[0][0] = a; m[0][1] = b; m[1][0] = c; m[1][1] = d;} Rotate(const Matrix& a) { m[0][0]=a.m[0][0]; m[0][1]=a.m[0][1]; m[1][0]=a.m[1][0]; m[1][1]=a.m[1][1];} }; ostream& operator<<(ostream&, const Rotate&); istream& operator>>(istream&, Rotate&); class BBox { public: Vector ll; Vector ur; public: BBox() {} BBox(double w, double h) {ll.v[0] = 0; ll.v[1] = 0; ur.v[0] = w; ur.v[1] = h;} BBox(const Vector& v) {ll=v; ur=v;} BBox(double, double, double, double); BBox(const Vector&, const Vector&); BBox(const BBox& a) {ll=a.ll; ur=a.ur;} BBox& operator=(const BBox& a) {ll=a.ll; ur=a.ur; return *this;} Vector lr() {return Vector(ur[0],ll[1]);} Vector ul() {return Vector(ll[0],ur[1]);} BBox& operator+=(const Vector& v) // addition {ll+=v; ur+=v; return *this;} BBox& operator-=(const Vector& a) // subtraction {ll-=a; ur-=a; return *this;} BBox& operator*=(const Matrix& m) // multiply {ll*=m; ur*=m; return *this;} Vector center() {return (ur-ll)/2 + ll;} Vector size() {return ur - ll;} int isEmpty() const {Vector v = ur-ll; return (v[0]==0 && v[1]==0);} int isIn(const Vector&) const; int isIn(const BBox&) const; BBox& expand(double a) {ll-=Vector(a,a); ur+=Vector(a,a); return *this;} BBox& expand(const Vector& v) {ll-=v; ur+=v; return *this;} BBox& shrink(double a) {ll+=Vector(a,a); ur-=Vector(a,a); return *this;} BBox& shrink(const Vector& v) {ll+=v; ur-=v; return *this;} BBox& bound(BBox); BBox& bound(const Vector&); }; ostream& operator<<(ostream&, const BBox&); inline BBox operator+(const BBox& b, const Vector& v) {return BBox(b) += v;} inline BBox operator-(const BBox& b, const Vector& v) {return BBox(b) -= v;} inline BBox operator*(const BBox& b, const Matrix& m) {return BBox(b) *= m;} BBox intersect(const BBox&, const BBox&); #endif saods9/tksao1.0/vector/vector3d.C000644 000765 000000 00000023367 12464214757 017112 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "vector3d.h" #include "vector.h" #include "fuzzy.h" // Vector3d Vector3d::Vector3d(const Vector& a) { v[0]=a.v[0]; v[1]=a.v[1]; v[2]=0; v[3]=1; } Vector3d::Vector3d(const Vector& a, double z) { v[0]=a.v[0]; v[1]=a.v[1]; v[2]=z; v[3]=1; } Vector3d& Vector3d::operator=(const Vector& a) { v[0]=a.v[0]; v[1]=a.v[1]; v[2]=0; v[3]=1; return *this; } Vector Vector3d::TkCanvasPs(void* canvas) { return Vector(v[0], Tk_CanvasPsY((Tk_Canvas)canvas, v[1])); } ostream& operator<<(ostream& s, const Vector3d& v) { s << ' ' << v.v[0] << ' ' << v.v[1] << ' ' << v.v[2]; return s; } istream& operator>>(istream& s, Vector3d& v) { s >> v.v[0] >> v.v[1] >> v.v[2]; return s; } // Vertex3d ostream& operator<<(ostream& s, const Vertex3d& v) { s << v.vector; return s; } // Matrix3d Matrix3d& Matrix3d::operator*=(const Matrix3d& a) { Matrix3d r; for (int ii=0; ii<4; ii++) for (int jj=0; jj<4; jj++) r.m[ii][jj] = m[ii][0]*a.m[0][jj] + m[ii][1]*a.m[1][jj] + m[ii][2]*a.m[2][jj] + m[ii][3]*a.m[3][jj]; return *this=r; } Matrix3d::Matrix3d(const Matrix& a) { m[0][0]=a.m[0][0]; m[0][1]=a.m[0][1]; m[0][2]=0; m[0][3]=0; m[1][0]=a.m[1][0]; m[1][1]=a.m[1][1]; m[1][2]=0; m[1][3]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1; m[2][3]=0; m[3][0]=a.m[2][0]; m[3][1]=a.m[2][1]; m[3][2]=0; m[3][3]=1; } Matrix3d Matrix3d::invert() { Matrix3d cc = this->cofactor(); Matrix3d aa = cc.adjoint(); double dd = m[0][0]*aa.m[0][0] + m[0][1]*aa.m[1][0] + m[0][2]*aa.m[2][0] + m[0][3]*aa.m[3][0]; Matrix3d rr; for (int ii=0; ii<4; ii++ ) for (int jj=0; jj<4; jj++) rr.m[ii][jj] = aa.m[ii][jj]/dd; return rr; } Matrix3d Matrix3d::cofactor() { Matrix3d rr; rr.m[0][0] = +det2d(m[1][1],m[1][2],m[1][3], m[2][1],m[2][2],m[2][3], m[3][1],m[3][2],m[3][3]); rr.m[0][1] = -det2d(m[1][0],m[1][2],m[1][3], m[2][0],m[2][2],m[2][3], m[3][0],m[3][2],m[3][3]); rr.m[0][2] = +det2d(m[1][0],m[1][1],m[1][3], m[2][0],m[2][1],m[2][3], m[3][0],m[3][1],m[3][3]); rr.m[0][3] = -det2d(m[1][0],m[1][1],m[1][2], m[2][0],m[2][1],m[2][2], m[3][0],m[3][1],m[3][2]); rr.m[1][0] = -det2d(m[0][1],m[0][2],m[0][3], m[2][1],m[2][2],m[2][3], m[3][1],m[3][2],m[3][3]); rr.m[1][1] = +det2d(m[0][0],m[0][2],m[0][3], m[2][0],m[2][2],m[2][3], m[3][0],m[3][2],m[3][3]); rr.m[1][2] = -det2d(m[0][0],m[0][1],m[0][3], m[2][0],m[2][1],m[2][3], m[3][0],m[3][1],m[3][3]); rr.m[1][3] = +det2d(m[0][0],m[0][1],m[0][2], m[2][0],m[2][1],m[2][2], m[3][0],m[3][1],m[3][2]); rr.m[2][0] = +det2d(m[0][1],m[0][2],m[0][3], m[1][1],m[1][2],m[1][3], m[3][1],m[3][2],m[3][3]); rr.m[2][1] = -det2d(m[0][0],m[0][2],m[0][3], m[1][0],m[1][2],m[1][3], m[3][0],m[3][2],m[3][3]); rr.m[2][2] = +det2d(m[0][0],m[0][1],m[0][3], m[1][0],m[1][1],m[1][3], m[3][0],m[3][1],m[3][3]); rr.m[2][3] = -det2d(m[0][0],m[0][1],m[0][2], m[1][0],m[1][1],m[1][2], m[3][0],m[3][1],m[3][2]); rr.m[3][0] = -det2d(m[0][1],m[0][2],m[0][3], m[1][1],m[1][2],m[1][3], m[2][1],m[2][2],m[2][3]); rr.m[3][1] = +det2d(m[0][0],m[0][2],m[0][3], m[1][0],m[1][2],m[1][3], m[2][0],m[2][2],m[2][3]); rr.m[3][2] = -det2d(m[0][0],m[0][1],m[0][3], m[1][0],m[1][1],m[1][3], m[2][0],m[2][1],m[2][3]); rr.m[3][3] = +det2d(m[0][0],m[0][1],m[0][2], m[1][0],m[1][1],m[1][2], m[2][0],m[2][1],m[2][2]); return rr; } Matrix3d Matrix3d::adjoint() { Matrix3d rr; for (int ii=0; ii<4; ii++) for (int jj=0; jj<4; jj++) rr.m[jj][ii] = m[ii][jj]; return rr; } double Matrix3d::det() { Matrix3d cc = this->cofactor(); Matrix3d aa = cc.adjoint(); return m[0][0]*aa.m[0][0] + m[0][1]*aa.m[1][0] + m[0][2]*aa.m[2][0] + m[0][3]*aa.m[3][0]; } void Matrix3d::dump() { for (int ii=0; ii<4; ii++) { for (int jj=0; jj<4; jj++) cerr << m[ii][jj] << ' '; cerr << endl; } cerr << endl; } ostream& operator<<(ostream& s, const Matrix3d& m) { s << ' '; for (int ii=0; ii<4; ii++) for (int jj=0; jj<3; jj++) s << m.m[ii][jj] << ' '; return s; } istream& operator>>(istream& s, Matrix3d& m) { for (int ii=0; ii<4; ii++ ) for (int jj=0; jj<3; jj++) s >> m.m[ii][jj]; return s; } // Translate3d Translate3d::Translate3d(const Vector& v) { m[3][0]=v.v[0]; m[3][1]=v.v[1]; m[3][2]=0; } Translate3d::Translate3d(const Vector& v, double z) { m[3][0]=v.v[0]; m[3][1]=v.v[1]; m[3][2]=z; } ostream& operator<<(ostream& s, const Translate3d& m) { s << ' ' << m.m[3][0] << ' ' << m.m[3][1] << ' ' << m.m[3][2] << ' '; return s; } istream& operator>>(istream& s, Translate3d& m) { s >> m.m[3][0] >> m.m[3][1] >> m.m[3][2]; return s; } // Scale3d Scale3d::Scale3d(const Vector& v) { m[0][0]=v.v[0]; m[1][1]=v.v[1]; m[2][2]=1; } Scale3d::Scale3d(const Vector& v, double c) { m[0][0]=v.v[0]; m[1][1]=v.v[1]; m[2][2]=c; } ostream& operator<<(ostream& s, const Scale3d& m) { s << ' ' << m.m[0][0] << ' ' << m.m[1][1] << ' ' << m.m[2][2] << ' '; return s; } istream& operator>>(istream& s, Scale3d& m) { s >> m.m[0][0] >> m.m[1][1] >> m.m[2][2]; return s; } // RotateX3d RotateX3d::RotateX3d(double a) : Matrix3d() { m[1][1] = cos(a); m[1][2] = sin(a); m[2][1] = -sin(a); m[2][2] = cos(a); // this fixes a problem with numbers too small and tring to invert the matrix tzero(&m[1][1]); tzero(&m[1][2]); tzero(&m[2][1]); tzero(&m[2][2]); } ostream& operator<<(ostream& s, const RotateX3d& m) { s << ' ' << m.m[1][1] << ' ' << m.m[1][2] << ' ' << m.m[2][1] << ' ' << m.m[2][2] << ' '; return s; } istream& operator>>(istream& s, RotateX3d& m) { s >> m.m[1][1] >> m.m[1][2] >> m.m[2][1] >> m.m[2][2]; return s; } // RotateY3d RotateY3d::RotateY3d(double a) : Matrix3d() { m[0][0] = cos(a); m[0][2] = -sin(a); m[2][0] = sin(a); m[2][2] = cos(a); // this fixes a problem with numbers too small and tring to invert the matrix tzero(&m[0][0]); tzero(&m[0][2]); tzero(&m[2][0]); tzero(&m[2][2]); } ostream& operator<<(ostream& s, const RotateY3d& m) { s << ' ' << m.m[0][0] << ' ' << m.m[0][2] << ' ' << m.m[2][0] << ' ' << m.m[2][2] << ' '; return s; } istream& operator>>(istream& s, RotateY3d& m) { s >> m.m[0][0] >> m.m[0][2] >> m.m[2][0] >> m.m[2][2]; return s; } // RotateZ3d RotateZ3d::RotateZ3d(double a) : Matrix3d() { m[0][0] = cos(a); m[0][1] = sin(a); m[1][0] = -sin(a); m[1][1] = cos(a); // this fixes a problem with numbers too small and tring to invert the matrix tzero(&m[0][0]); tzero(&m[0][1]); tzero(&m[1][0]); tzero(&m[1][1]); } ostream& operator<<(ostream& s, const RotateZ3d& m) { s << ' ' << m.m[0][0] << ' ' << m.m[0][1] << ' ' << m.m[1][0] << ' ' << m.m[1][1] << ' '; return s; } istream& operator>>(istream& s, RotateZ3d& m) { s >> m.m[0][0] >> m.m[0][1] >> m.m[1][0] >> m.m[1][1]; return s; } // BBox3d BBox3d::BBox3d(double a, double b, double c, double d, double e, double f) { // we want a 'positive' cube ll.v[0] = a < d ? a : d; ll.v[1] = b < e ? b : e; ll.v[2] = c < f ? c : f; ur.v[0] = a < d ? d : a; ur.v[1] = b < e ? e : b; ur.v[2] = c < f ? f : c; } BBox3d::BBox3d(const Vector3d& l, const Vector3d& h) { // we want a 'positive' cube ll.v[0] = l.v[0] < h.v[0] ? l.v[0] : h.v[0]; ll.v[1] = l.v[1] < h.v[1] ? l.v[1] : h.v[1]; ll.v[2] = l.v[2] < h.v[2] ? l.v[2] : h.v[2]; ur.v[0] = l.v[0] < h.v[0] ? h.v[0] : l.v[0]; ur.v[1] = l.v[1] < h.v[1] ? h.v[1] : l.v[1]; ur.v[2] = l.v[2] < h.v[2] ? h.v[2] : l.v[2]; } int BBox3d::isIn(const Vector3d& v) const { return !(v.v[0] < ll.v[0] || v.v[1] < ll.v[1] || v.v[2] < ll.v[2] || v.v[0] > ur.v[0] || v.v[1] > ur.v[1] || v.v[2] > ur.v[2]); } BBox3d& BBox3d::bound(const Vector3d& v) { if (v.v[0] < ll[0]) ll[0] = v.v[0]; if (v.v[1] < ll[1]) ll[1] = v.v[1]; if (v.v[2] < ll[2]) ll[2] = v.v[2]; if (v.v[0] > ur[0]) ur[0] = v.v[0]; if (v.v[1] > ur[1]) ur[1] = v.v[1]; if (v.v[2] > ur[2]) ur[2] = v.v[2]; return *this; } BBox3d& BBox3d::clip(const Vector3d& v) { if (ll[0]<0) ll[0] = 0; if (ll[1]<0) ll[1] = 0; if (ll[2]<0) ll[2] = 0; if (ur[0]<0) ur[0] = 0; if (ur[1]<0) ur[1] = 0; if (ur[2]<0) ur[2] = 0; if (ll[0]>v.v[0]) ll[0] = v.v[0]; if (ll[1]>v.v[1]) ll[1] = v.v[1]; if (ll[2]>v.v[2]) ll[2] = v.v[2]; if (ur[0]>v.v[0]) ur[0] = v.v[0]; if (ur[1]>v.v[1]) ur[1] = v.v[1]; if (ur[2]>v.v[2]) ur[2] = v.v[2]; return *this; } ostream& operator<<(ostream& s, const BBox3d& b) { s << b.ll << b.ur; return s; } // WorldToView Matrix3d WorldToView3d(const Vector3d& cop, const Vector3d& vpn, const Vector3d& vup) { Vector3d zv = ((Vector3d)vpn).normalize(); Vector3d xv = cross(zv,(Vector3d&)vup).normalize(); Vector3d yv = cross(xv,zv).normalize(); return Translate3d(-cop) * Matrix3d(xv[0],yv[0],zv[0], xv[1],yv[1],zv[1], xv[2],yv[2],zv[2], 0, 0, 0); } Matrix3d WorldToView3d(const Vector3d& cop, double head, double pitch, double bank) { return Translate3d(-cop) * RotateY3d(head) * RotateX3d(pitch) * RotateZ3d(bank) * Scale3d(1,1,-1); } Matrix3d WorldToView3d(const Vector3d& cop, const Vector3d& vpn, double bank) { Vector3d zv = -((Vector3d)vpn).normalize(); double l=sqrt(zv[0]*zv[0]+zv[2]*zv[2]); return Translate3d(-cop) * RotateY3d(zv[2]/l,zv[0]/l,-zv[0]/l,zv[2]/l) * RotateX3d(l,zv[1],-zv[1],l) * RotateZ3d(bank) * Scale3d(1,1,-1); } saods9/tksao1.0/vector/vector3d.h000644 000765 000000 00000027260 12464214757 017153 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __vector3d_h__ #define __vector3d_h__ #include #include #include using namespace std; class Vector; class Matrix; class Matrix3d; class Vector3d { public: double v[4]; public: Vector3d() {v[0]=0;v[1]=0;v[2]=0;v[3]=1;} Vector3d(double* f) {v[0]=f[0]; v[1]=f[1]; v[2]=f[2]; v[3]=1;} Vector3d(double x, double y) {v[0]=x;v[1]=y;v[2]=0;v[3]=1;} Vector3d(double x, double y, double z) {v[0]=x;v[1]=y;v[2]=z;v[3]=1;} Vector3d(const Vector&); Vector3d(const Vector&, double); Vector3d& operator=(const Vector&); Vector3d(const Vector3d& a) {v[0]=a.v[0];v[1]=a.v[1];v[2]=a.v[2];v[3]=a.v[3];} Vector3d& operator=(const Vector3d& a) {v[0]=a.v[0];v[1]=a.v[1];v[2]=a.v[2];v[3]=a.v[3]; return *this;} double& operator[](int i) {return v[i];} // return element double* vv() {return v;} // return vector Vector3d& operator+=(const Vector3d& a) // addition {v[0]+=a.v[0]; v[1]+=a.v[1]; v[2]+=a.v[2]; return *this;} Vector3d& operator-=(const Vector3d& a) // subtraction {v[0]-=a.v[0]; v[1]-=a.v[1]; v[2]-=a.v[2]; return *this;} Vector3d& operator*=(double f) // scalar multiply {v[0]*=f; v[1]*=f; v[2]*=f; return *this;} Vector3d& operator/=(double f) // scalar division {v[0]/=f; v[1]/=f; v[2]/=f; return *this;} Vector3d& operator*=(const Matrix3d&); // vector multiply Vector3d abs() {return Vector3d(fabs(v[0]),fabs(v[1]),fabs(v[2]));} double angleX() {return atan2(v[2],v[1]);} double angleY() {return atan2(v[0],v[2]);} double angleZ() {return atan2(v[1],v[0]);} Vector3d ceil() {return Vector3d(::ceil(v[0]),::ceil(v[1]),::ceil(v[2]));} Vector3d floor() {return Vector3d(::floor(v[0]),::floor(v[1]),::floor(v[2]));} Vector3d invert() {return Vector3d(1/v[0],1/v[1],1/v[2]);} double length() {return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);} double volume() {return v[0]*v[1]*v[2];} Vector3d round() {return Vector3d((int)(v[0]+.5),(int)(v[1]+.5),(int)(v[2]+.5));} Vector3d normalize() {double d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); return d ? Vector3d(v[0]/d,v[1]/d,v[2]/d) : Vector3d();} Vector3d project() {return (v[3]!=1) ? Vector3d(v[0]/v[3],v[1]/v[3],v[2]/v[3]) : *this;} Vector TkCanvasPs(void* canvas); }; ostream& operator<<(ostream&, const Vector3d&); istream& operator>>(istream&, Vector3d&); inline Vector3d operator-(const Vector3d& a) {return Vector3d(-a.v[0],-a.v[1],-a.v[2]);} inline Vector3d operator+(const Vector3d& a, const Vector3d& b) {return Vector3d(a) +=b;} inline Vector3d operator-(const Vector3d& a, const Vector3d& b) {return Vector3d(a) -=b;} inline Vector3d operator*(const Vector3d& a, double b) {return Vector3d(a) *=b;} inline Vector3d operator/(const Vector3d& a, double b) {return Vector3d(a) /=b;} inline Vector3d operator*(const Vector3d& v, const Matrix3d& m) {return Vector3d(v) *=m;} inline double operator*(const Vector3d& a, const Vector3d& b) // dot product {double r=0; r+=a.v[0]*b.v[0]; r+=a.v[1]*b.v[1]; r+=a.v[2]*b.v[2]; return r;} inline Vector3d cross(Vector3d& a, Vector3d& b) // cross product {return Vector3d(a[1]*b[2]-b[1]*a[2],a[2]*b[0]-b[2]*a[0],a[0]*b[1]-b[0]*a[1]);} class Vertex3d { public: Vector3d vector; private: Vertex3d* next_; Vertex3d* previous_; public: Vertex3d() {next_=NULL; previous_=NULL;} Vertex3d(double x, double y, double z) {vector=Vector3d(x,y,z); next_=NULL; previous_=NULL;} Vertex3d(const Vector3d& a) {vector=a; next_=NULL; previous_=NULL;} Vertex3d(const Vertex3d& a) {vector=a.vector; next_=a.next_; previous_=a.previous_;} Vertex3d& operator=(const Vertex3d& a) {vector=a.vector; next_=a.next_; previous_=a.previous_; return *this;} Vertex3d* next() {return next_;} Vertex3d* previous() {return previous_;} void setNext(Vertex3d* v) {next_ = v;} void setPrevious(Vertex3d* v) {previous_ = v;} }; ostream& operator<<(ostream&, const Vertex3d&); class Matrix3d { public: double m[4][4]; public: Matrix3d() { m[0][0]=1; m[0][1]=0; m[0][2]=0; m[0][3]=0; m[1][0]=0; m[1][1]=1; m[1][2]=0; m[1][3]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1; m[2][3]=0; m[3][0]=0; m[3][1]=0; m[3][2]=0; m[3][3]=1; } Matrix3d(double a, double b, double c, double d, double e, double f, double g, double h, double i, double j, double k, double l) { m[0][0]=a; m[0][1]=b; m[0][2]=c; m[0][3]=0; m[1][0]=d; m[1][1]=e; m[1][2]=f; m[1][3]=0; m[2][0]=g; m[2][1]=h; m[2][2]=i; m[2][3]=0; m[3][0]=j; m[3][1]=k; m[3][2]=l; m[3][3]=1; } Matrix3d(Vector3d& x, Vector3d& y, Vector3d& z) { m[0][0]=x[0]; m[0][1]=y[0]; m[0][2]=z[0]; m[0][3]=0; m[1][0]=x[1]; m[1][1]=y[1]; m[1][2]=z[1]; m[1][3]=0; m[2][0]=x[2]; m[2][1]=y[2]; m[2][2]=z[2]; m[2][3]=0; m[3][0]=0; m[3][1]=0; m[3][2]=0; m[3][3]=1; } Matrix3d(const Matrix3d& a) { m[0][0]=a.m[0][0];m[0][1]=a.m[0][1];m[0][2]=a.m[0][2];m[0][3]=a.m[0][3]; m[1][0]=a.m[1][0];m[1][1]=a.m[1][1];m[1][2]=a.m[1][2];m[1][3]=a.m[1][3]; m[2][0]=a.m[2][0];m[2][1]=a.m[2][1];m[2][2]=a.m[2][2];m[2][3]=a.m[2][3]; m[3][0]=a.m[3][0];m[3][1]=a.m[3][1];m[3][2]=a.m[3][2];m[3][3]=a.m[3][3]; } Matrix3d& operator=(const Matrix3d& a) { m[0][0]=a.m[0][0];m[0][1]=a.m[0][1];m[0][2]=a.m[0][2];m[0][3]=a.m[0][3]; m[1][0]=a.m[1][0];m[1][1]=a.m[1][1];m[1][2]=a.m[1][2];m[1][3]=a.m[1][3]; m[2][0]=a.m[2][0];m[2][1]=a.m[2][1];m[2][2]=a.m[2][2];m[2][3]=a.m[2][3]; m[3][0]=a.m[3][0];m[3][1]=a.m[3][1];m[3][2]=a.m[3][2];m[3][3]=a.m[3][3]; return *this;} Matrix3d(const Matrix& a); double matrix(int i, int j) {return m[i][j];} // return element Vector3d operator[](int i) {return Vector3d(m[i]);} // return row double* mm() {return (double*)m;} // return matrix Matrix3d& identity() { m[0][0]=1; m[0][1]=0; m[0][2]=0; m[0][3]=0; m[1][0]=0; m[1][1]=1; m[1][2]=0; m[1][3]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1; m[2][3]=0; m[3][0]=0; m[3][1]=0; m[3][2]=0; m[3][3]=1; return *this;} Matrix3d& operator*=(const Matrix3d&); // matrix multiply Matrix3d invert(); Matrix3d cofactor(); Matrix3d adjoint(); double det(); double det2d(double& a, double& b, double& c, double& d, double& e, double& f, double& g, double& h, double& i) {return a*(e*i-f*h) - b*(d*i-f*g) + c*(d*h-e*g);} void dump(); }; ostream& operator<<(ostream&, const Matrix3d&); istream& operator>>(istream&, Matrix3d&); inline Matrix3d operator*(const Matrix3d& a, const Matrix3d& b) {return Matrix3d(a) *= b;} inline Vector3d& Vector3d::operator*=(const Matrix3d& m) { double vv[4]; double* mm = (double*)(m.m); vv[0] = v[0]*mm[0] + v[1]*mm[4] + v[2]*mm[8] + v[3]*mm[12]; vv[1] = v[0]*mm[1] + v[1]*mm[5] + v[2]*mm[9] + v[3]*mm[13]; vv[2] = v[0]*mm[2] + v[1]*mm[6] + v[2]*mm[10] + v[3]*mm[14]; vv[3] = v[0]*mm[3] + v[1]*mm[7] + v[2]*mm[11] + v[3]*mm[15]; v[0] = vv[0]; v[1] = vv[1]; v[2] = vv[2]; v[3] = vv[3]; return *this; } class Translate3d : public Matrix3d { public: Translate3d() {}; Translate3d(double x, double y, double z) {m[3][0]=x; m[3][1]=y; m[3][2]=z;} Translate3d(const Vector3d& v) {m[3][0]=v.v[0]; m[3][1]=v.v[1]; m[3][2]=v.v[2];} Translate3d(const Vector& v); Translate3d(const Vector& v, double z); Translate3d(const Matrix3d& a) {m[3][0] = a.m[3][0]; m[3][1] = a.m[3][1]; m[3][2] = a.m[3][2];} }; ostream& operator<<(ostream&, const Translate3d&); istream& operator>>(istream&, Translate3d&); class Scale3d : public Matrix3d { public: Scale3d() {}; Scale3d(double a) {m[0][0]=a; m[1][1]=a; m[2][2]=a;} Scale3d(double a, double b) {m[0][0]=a; m[1][1]=a; m[2][2]=b;} Scale3d(double a, double b, double c) {m[0][0]=a; m[1][1]=b; m[2][2]=c;} Scale3d(const Vector& v); Scale3d(const Vector& v, double c); Scale3d(const Vector3d& v) {m[0][0]=v.v[0]; m[1][1]=v.v[1]; m[2][2]=v.v[2];} Scale3d(const Matrix3d& a) {m[0][0] = a.m[0][0]; m[1][1] = a.m[1][1]; m[2][2] = a.m[2][2];} }; ostream& operator<<(ostream&, const Scale3d&); istream& operator>>(istream&, Scale3d&); class FlipX3d : public Matrix3d { public: FlipX3d() {m[0][0] = -1;} }; class FlipY3d : public Matrix3d { public: FlipY3d() {m[1][1] = -1;} }; class FlipZ3d : public Matrix3d { public: FlipZ3d() {m[2][2] = -1;} }; class FlipXY3d : public Matrix3d { public: FlipXY3d() {m[0][0] = -1; m[1][1] = -1;} }; class FlipXYZ3d : public Matrix3d { public: FlipXYZ3d() {m[0][0] = -1; m[1][1] = -1; m[2][2] = -1;} }; class RotateX3d : public Matrix3d { public: RotateX3d() {}; RotateX3d(double); RotateX3d(double a, double b, double c, double d) {m[1][1] = a; m[1][2] = b; m[2][1] = c; m[2][2] = d;} }; ostream& operator<<(ostream&, const RotateX3d&); istream& operator>>(istream&, RotateX3d&); class RotateY3d : public Matrix3d { public: RotateY3d() {}; RotateY3d(double); RotateY3d(double a, double b, double c, double d) {m[0][0] = a; m[0][2] = b; m[2][0] = c; m[2][2] = d;} }; ostream& operator<<(ostream&, const RotateY3d&); istream& operator>>(istream&, RotateY3d&); class RotateZ3d : public Matrix3d { public: RotateZ3d() {}; RotateZ3d(double); RotateZ3d(double a, double b, double c, double d) {m[0][0] = a; m[0][1] = b; m[1][0] = c; m[1][1] = d;} }; ostream& operator<<(ostream&, const RotateZ3d&); istream& operator>>(istream&, RotateZ3d&); class Shear3d : public Matrix3d { public: Shear3d(double x, double y, double dist) {m[2][0] = -x/dist; m[2][1] = -y/dist;} }; class Perspective3d : public Matrix3d { public: Perspective3d(double front, double back, double dist) { m[2][2] = back/(back-front); m[2][3] = 1; m[3][2] = -front*back/(dist*(back-front)); m[3][3] = 0;} }; class BBox3d { public: Vector3d ll; Vector3d ur; public: BBox3d() {} BBox3d(double w, double h, double d) {ll.v[0]=0; ll.v[1]=0; ll.v[2]=0; ur.v[0]=w; ur.v[1]=h; ur.v[2]=d;} BBox3d(const Vector3d& v) {ll=v; ur=v;} BBox3d(double, double, double, double, double, double); BBox3d(const Vector3d&, const Vector3d&); BBox3d(const BBox3d& a) {ll=a.ll; ur=a.ur;} BBox3d& operator=(const BBox3d& a) {ll=a.ll; ur=a.ur; return *this;} BBox3d& operator+=(const Vector3d& v) // addition {ll+=v; ur+=v; return *this;} BBox3d& operator-=(const Vector3d& a) // subtraction {ll-=a; ur-=a; return *this;} BBox3d& operator*=(const Matrix3d& m) // multiplication {ll*=m; ur*=m; return *this;} Vector3d center() {return (ur-ll)/2 + ll;} Vector3d size() {return ur - ll;} int isEmpty() const {Vector3d v = ur-ll; return (v[0]==0 && v[1]==0 && v[2]==0);} int isIn(const Vector3d&) const; BBox3d& expand(double a) {ll-=Vector3d(a,a,a); ur+=Vector3d(a,a,a); return *this;} BBox3d& expand(const Vector3d& v) {ll-=v; ur+=v; return *this;} BBox3d& shrink(double a) {ll+=Vector3d(a,a,a); ur-=Vector3d(a,a,a); return *this;} BBox3d& shrink(const Vector3d& v) {ll+=v; ur-=v; return *this;} BBox3d& bound(const Vector3d&); BBox3d& clip(const Vector3d&); }; ostream& operator<<(ostream&, const BBox3d&); inline BBox3d operator+(const BBox3d& b, const Vector3d& v) {return BBox3d(b) += v;} inline BBox3d operator-(const BBox3d& b, const Vector3d& v) {return BBox3d(b) -= v;} inline BBox3d operator*(const BBox3d& b, const Matrix3d& m) {return BBox3d(b) *= m;} // WorldToView Matrix3d WorldToView3d(const Vector3d& cop, const Vector3d& vpn, const Vector3d& vup); Matrix3d WorldToView3d(const Vector3d& cop, double head, double pitch, double bank); Matrix3d WorldToView3d(const Vector3d& cop, const Vector3d& vpn, double bank); #endif saods9/tksao1.0/vector/vectorold.C000644 000765 000000 00000033543 12464214757 017357 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "vector.h" // Vector Vector operator-(const Vector& a) { return Vector(-a.v[0], -a.v[1]); } Vector& Vector::operator+=(const Vector& a) { v[0]+=a.v[0]; v[1]+=a.v[1]; return *this; } Vector operator+(const Vector& a, const Vector& b) { Vector r=a; r+=b; return r; } Vector& Vector::operator-=(const Vector& a) { v[0]-=a.v[0]; v[1]-=a.v[1]; return *this; } Vector operator-(const Vector& a, const Vector& b) { Vector r=a; r-=b; return r; } Vector& Vector::operator*=(double f) { v[0]*=f; v[1]*=f; return *this; } Vector operator*(const Vector& a, double b) { Vector r=a; r*=b; return r; } Vector& Vector::operator/=(double f) { v[0]/=f; v[1]/=f; return *this; } Vector operator/(const Vector& a, double b) { Vector r=a; r/=b; return r; } double operator*(const Vector& a, const Vector& b) // 2D dot product { double r = 0; for (int i=0; i<2; i++) r += a.v[i]*b.v[i]; return r; } Vector Vector::normalize() // 2D normalize { Vector r = *this; double d = sqrt(v[0]*v[0]+v[1]*v[1]); if (d) { r[0] /= d; r[1] /= d; } else { r[0] = 0; r[1] = 0; } return r; } Vector Vector::abs() // absolute value { Vector r; r[0] = fabs(v[0]); r[1] = fabs(v[1]); r[2] = 1; return r; } double Vector::length() { return sqrt(v[0]*v[0] + v[1]*v[1]); } double Vector::angle() { return atan2(v[1],v[0]); } double Vector::avg() { return (v[0]+v[1])/2; } double Vector::max() { return v[0]>v[1]?v[0]:v[1]; } double Vector::min() { return v[0]>(istream& s, Vector& v) { s >> v.v[0] >> v.v[1]; return s; } Vector cross(Vector& a, Vector& b) { return Vector(a[1]*b[2]-b[1]*a[2], a[2]*b[0]-b[2]*a[0], a[0]*b[1]-b[0]*a[1]); } // the following are not valid for 2D graphics: Vector& Vector::div(double f) { v[0]/=f; v[1]/=f; v[2]/=f; return *this; } Vector& Vector::minus(const Vector& a) { v[0]-=a.v[0]; v[1]-=a.v[1]; v[2]-=a.v[2]; return *this; } Vector mult(const Vector& a, double f) { Vector r = a; r.v[0]*= f; r.v[1]*= f; r.v[2]*= f; return r; } Vector& Vector::operator*=(const Vector& b) { v[0]*=b.v[0]; v[1]*=b.v[1]; v[2]=1; return *this; } Vector& Vector::operator/=(const Vector& b) { v[0]/=b.v[0]; v[1]/=b.v[1]; v[2]=1; return *this; } // Vertex Vertex::Vertex() { next_ = NULL; previous_ = NULL; } Vertex::Vertex(double x, double y) { vector = Vector(x,y); next_ = NULL; previous_ = NULL; } Vertex::Vertex(const Vector& a) { vector = a; next_ = NULL; previous_ = NULL; } ostream& operator<<(ostream& s, const Vertex& v) { s << v.vector; return s; } // Matrix Matrix::Matrix() { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] = (i==j ? 1 : 0); } Matrix::Matrix(const Matrix& a) { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] = a.m[i][j]; } Matrix& Matrix::operator=(const Matrix& a) { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] = a.m[i][j]; return *this; } Matrix::Matrix(const Vector& v0, const Vector& v1, const Vector& v2) { int i; for (i=0; i<3; i++) m[0][i] = v0.v[i]; for (i=0; i<3; i++) m[1][i] = v1.v[i]; for (i=0; i<3; i++) m[2][i] = v2.v[i]; } Matrix::Matrix(double a, double b, double c, double d, double e, double f) { m[0][0]=a; m[0][1]=b; m[0][2]=0; m[1][0]=c; m[1][1]=d; m[1][2]=0; m[2][0]=e; m[2][1]=f; m[2][2]=1; } Matrix& Matrix::identity() { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] = (i==j ? 1 : 0); return *this; } int Matrix::isIdentity() { return ((m[0][0]==1) && (m[0][1]==0) && (m[0][2]==0) && (m[1][0]==0) && (m[1][1]==1) && (m[1][2]==0) && (m[2][0]==0) && (m[2][1]==0) && (m[2][2]==1)); } Matrix Matrix::abs() { Matrix r; r.m[0][0] = fabs(m[0][0]); r.m[1][1] = fabs(m[1][1]); return r; } Matrix& Matrix::operator*=(double a) { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] *= a; return *this; } Matrix& Matrix::operator/=(double a) { for (int i=0; i<3; i++) for (int j=0; j<3; j++) m[i][j] /= a; return *this; } Matrix& Matrix::operator*=(const Matrix& a) { Matrix r; for (int i=0; i<3; i++) for (int j=0; j<3; j++) r.m[i][j] = m[i][0]*a.m[0][j] + m[i][1]*a.m[1][j] + m[i][2]*a.m[2][j]; return *this=r; } Matrix Matrix::invert() { // Method of Row Reduction-- Calculus and Analylic Geometry, A-13 Matrix r; // identy matrix Vector m0 = m[0]; Vector m1 = m[1]; Vector m2 = m[2]; Vector r0 = r[0]; Vector r1 = r[1]; Vector r2 = r[2]; // check for 0 in m[0], swap rows 0 and 1 if so. // this seems to be a problem only in the case of rotation of 90/270 degress if ((m0[0]==0) || (m0[0]>0 && m0[0]-DBL_EPSILON)) { Vector tm0 = m0; Vector tr0 = r0; m0 = m1; r0 = r1; m1 = tm0; r1 = tr0; } // scale first row by 1/m0[0] r0.div(m0[0]); m0.div(m0[0]); // zero out m1[0] and m2[0] r1.minus(mult(r0,m1[0])); m1.minus(mult(m0,m1[0])); r2.minus(mult(r0,m2[0])); m2.minus(mult(m0,m2[0])); // scale second row by 1/m1[1] r1.div(m1[1]); m1.div(m1[1]); // zero out m0[1] and m2[1] r0.minus(mult(r1,m0[1])); m0.minus(mult(m1,m0[1])); r2.minus(mult(r1,m2[1])); m2.minus(mult(m1,m2[1])); // scale third row by 1/m[2] r2.div(m2[2]); m2.div(m2[2]); // and zero out m0[2] and m1[2] r0.minus(mult(r2,m0[2])); m0.minus(mult(m2,m0[2])); r1.minus(mult(r2,m1[2])); m2.minus(mult(m2,m1[2])); return Matrix(r0,r1,r2); } Matrix Matrix::invert2() { Matrix cc = this->cofactor(); Matrix aa = cc.adjoint(); double det = m[0][0]*aa.m[0][0] + m[0][1]*aa.m[1][0] + m[0][2]*aa.m[2][0]; Matrix rr; for (int ii=0; ii<3; ii++ ) for (int jj=0; jj<3; jj++) rr.m[ii][jj] = aa.m[ii][jj]/det; return rr; } Matrix Matrix::cofactor() { Matrix rr; rr.m[0][0] = +(m[1][1]*m[2][2]-m[1][2]*m[2][1]); rr.m[0][1] = -(m[1][0]*m[2][2]-m[1][2]*m[2][0]); rr.m[0][2] = +(m[1][0]*m[2][1]-m[1][1]*m[2][0]); rr.m[1][0] = -(m[0][1]*m[2][2]-m[0][2]*m[2][1]); rr.m[1][1] = +(m[0][0]*m[2][2]-m[0][2]*m[2][0]); rr.m[1][2] = -(m[0][0]*m[2][1]-m[0][1]*m[2][0]); rr.m[2][0] = +(m[0][1]*m[1][2]-m[0][2]*m[1][1]); rr.m[2][1] = -(m[0][0]*m[1][2]-m[0][2]*m[1][0]); rr.m[2][2] = +(m[0][0]*m[1][1]-m[0][1]*m[1][0]); return rr; } Matrix Matrix::adjoint() { Matrix rr; for (int ii=0; ii<3; ii++) for (int jj=0; jj<3; jj++) rr.m[jj][ii] = m[ii][jj]; return rr; } Matrix operator*(const Matrix& a, double b) { Matrix r=a; return r*=b; } Matrix operator/(const Matrix& a, double b) { Matrix r=a; return r/=b; } Matrix operator*(const Matrix& a, const Matrix& b) { Matrix r=a; return r*=b; } Vector Matrix::operator[](int i) { return Vector(m[i]); } ostream& operator<<(ostream& s, const Matrix& m) { s << ' '; for (int i=0; i<3; i++) for (int j=0; j<2; j++) s << m.m[i][j] << ' '; return s; } istream& operator>>(istream& s, Matrix& m) { for (int i=0; i<3; i++ ) for (int j=0; j<2; j++) s >> m.m[i][j]; return s; } // Translate Translate::Translate(double x, double y) : Matrix() { m[2][0]=x; m[2][1]=y; } Translate::Translate(const Vector& v) : Matrix() { m[2][0]=v.v[0]; m[2][1]=v.v[1]; } Translate::Translate(const Matrix& a) : Matrix() { m[2][0] = a.m[2][0]; m[2][1] = a.m[2][1]; } Translate& Translate::operator=(const Matrix& a) { m[2][0] = a.m[2][0]; m[2][1] = a.m[2][1]; return *this; } ostream& operator<<(ostream& s, const Translate& m) { s << ' ' << m.m[2][0] << ' ' << m.m[2][1] << ' '; return s; } istream& operator>>(istream& s, Translate& m) { s >> m.m[2][0] >> m.m[2][1]; return s; } // Rotate Rotate::Rotate(double a) : Matrix() { // note: signs reverse for X-Windows (origin is upper left) m[0][0] = cos(a); m[0][1] = -sin(a); m[1][0] = sin(a); m[1][1] = cos(a); // this fixes a problem with numbers too small and tring to invert the matrix if ((m[0][0]>0 && m[0][0]-DBL_EPSILON)) m[0][0] = 0; if ((m[0][1]>0 && m[0][1]-DBL_EPSILON)) m[0][1] = 0; if ((m[1][0]>0 && m[1][0]-DBL_EPSILON)) m[1][0] = 0; if ((m[1][1]>0 && m[1][1]-DBL_EPSILON)) m[1][1] = 0; } Rotate::Rotate(double a, double b, double c, double d) : Matrix() { m[0][0] = a; m[0][1] = b; m[1][0] = c; m[1][1] = d; } Rotate::Rotate(const Matrix& a) : Matrix() { for (int i=0; i<2; i++) for (int j=0; j<2; j++) m[i][j] = a.m[i][j]; } Rotate& Rotate::operator=(const Matrix& a) { for (int i=0; i<2; i++) for (int j=0; j<2; j++) m[i][j] = a.m[i][j]; return *this; } ostream& operator<<(ostream& s, const Rotate& m) { s << ' ' << m.m[0][0] << ' ' << m.m[0][1] << ' ' << m.m[1][0] << ' ' << m.m[1][1] << ' '; return s; } istream& operator>>(istream& s, Rotate& m) { s >> m.m[0][0] >> m.m[0][1] >> m.m[1][0] >> m.m[1][1]; return s; } // Scale Scale::Scale(double a) : Matrix() { m[0][0]=a; m[1][1]=a; } Scale::Scale(double a, double b) : Matrix() { m[0][0]=a; m[1][1]=b; } Scale::Scale(const Vector& v) : Matrix() { m[0][0]=v.v[0]; m[1][1]=v.v[1]; } Scale::Scale(const Matrix& a) : Matrix() { m[0][0] = a.m[0][0]; m[1][1] = a.m[1][1]; } Scale& Scale::operator=(const Matrix& a) { m[0][0] = a.m[0][0]; m[1][1] = a.m[1][1]; return *this; } ostream& operator<<(ostream& s, const Scale& m) { s << ' ' << m.m[0][0] << ' ' << m.m[1][1] << ' '; return s; } istream& operator>>(istream& s, Scale& m) { s >> m.m[0][0] >> m.m[1][1]; return s; } // Flip FlipX::FlipX() : Matrix() { m[0][0] = -1; } FlipY::FlipY() : Matrix() { m[1][1] = -1; } FlipXY::FlipXY() : Matrix() { m[0][0] = -1; m[1][1] = -1; } // BBox BBox::BBox(double a, double b, double c, double d) { // we want a 'positive' box ll.v[0] = a < c ? a : c; ll.v[1] = b < d ? b : d; ur.v[0] = a < c ? c : a; ur.v[1] = b < d ? d : b; } BBox::BBox(double w, double h) { ll.v[0] = 0; ll.v[1] = 0; ur.v[0] = w; ur.v[1] = h; } BBox::BBox(const Vector& l, const Vector& h) { // we want a 'positive' box ll.v[0] = l.v[0] < h.v[0] ? l.v[0] : h.v[0]; ll.v[1] = l.v[1] < h.v[1] ? l.v[1] : h.v[1]; ur.v[0] = l.v[0] < h.v[0] ? h.v[0] : l.v[0]; ur.v[1] = l.v[1] < h.v[1] ? h.v[1] : l.v[1]; } BBox::BBox(const Vector& v) { ll = v; ur = v; } BBox& BBox::operator+=(const Vector& v) { ll+=v; ur+=v; return *this; } BBox operator+(const BBox& b, const Vector& v) { BBox r=b; r+=v; return r; } BBox& BBox::operator-=(const Vector& a) { ll-=a; ur-=a; return *this; } BBox operator-(const BBox& b, const Vector& v) { BBox r=b; r-=v; return r; } int BBox::isIn(const Vector& v) const { if (v.v[0] < ll.v[0] || v.v[1] < ll.v[1] || v.v[0] > ur.v[0] || v.v[1] > ur.v[1]) return 0; else return 1; } int BBox::isIn(const BBox& bb) const { // return 0 if outside, > 0 if intersection // = 4 if inside BBox b = bb; return isIn(b.ll) + isIn(b.ur) + isIn(b.ul()) + isIn(b.lr()); } int BBox::isEmpty() const { Vector v = ur-ll; return (v[0]==0 && v[1]==0); } Vector BBox::center() { return (ur-ll)/2 + ll; } Vector BBox::size() { return ur - ll; } BBox& BBox::operator*=(const Matrix& m) { ll *= m; ur *= m; return *this; } BBox operator*(const BBox& bb, const Matrix& m) { BBox r = bb; r*=m; return r; } BBox& BBox::expand(double a) { ll -= Vector(a,a); ur += Vector(a,a); return *this; } BBox& BBox::expand(const Vector& v) { ll -= v; ur += v; return *this; } BBox& BBox::shrink(double a) { ll += Vector(a,a); ur -= Vector(a,a); return *this; } BBox& BBox::shrink(const Vector& v) { ll += v; ur -= v; return *this; } BBox& BBox::bound(const Vector& v) { if (v.v[0] < ll[0]) ll[0] = v.v[0]; if (v.v[1] < ll[1]) ll[1] = v.v[1]; if (v.v[0] > ur[0]) ur[0] = v.v[0]; if (v.v[1] > ur[1]) ur[1] = v.v[1]; return *this; } BBox& BBox::bound(BBox b) { this->bound(b.ll); this->bound(b.lr()); this->bound(b.ur); this->bound(b.ul()); return *this; } BBox intersect(const BBox& a, const BBox& b) { // test for obvious int ab = a.isIn(b); int ba = b.isIn(a); // we are missing a case here! two bbox's that cross if (ab==0 && ba == 0) // outside each other return BBox(); if (ab == 4) // b is inside a return b; if (ba == 4) // a is inside b return a; // else, there seems to be some overlap BBox r; r.ll.v[0] = (a.ll.v[0] > b.ll.v[0]) ? a.ll.v[0] : b.ll.v[0]; r.ll.v[1] = (a.ll.v[1] > b.ll.v[1]) ? a.ll.v[1] : b.ll.v[1]; r.ur.v[0] = (a.ur.v[0] < b.ur.v[0]) ? a.ur.v[0] : b.ur.v[0]; r.ur.v[1] = (a.ur.v[1] < b.ur.v[1]) ? a.ur.v[1] : b.ur.v[1]; return r; } ostream& operator<<(ostream& s, const BBox& b) { s << b.ll << b.ur; return s; } saods9/tksao1.0/vector/vectorold.h000644 000765 000000 00000015502 12464214760 017411 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __vector_h__ #define __vector_h__ #include #include #include using namespace std; #include class Vector; class Vertex; class Matrix; class Translate; class Rotate; class Scale; class FlipX; class FlipY; class FlipXY; class BBox; class Vector { friend class Matrix; friend class Translate; friend class Scale; friend class BBox; public: double v[3]; public: Vector() {v[0]=0;v[1]=0;v[2]=1;} // constructor Vector(double* f) {v[0]=f[0];v[1]=f[1];v[2]=f[2];} // constructor Vector(double x, double y) {v[0]=x;v[1]=y;v[2]=1;} // constructor Vector(double x, double y, double z) {v[0]=x;v[1]=y;v[2]=z;} // constructor Vector(const Vector& a) {v[0]=a.v[0];v[1]=a.v[1];v[2]=a.v[2];} // copy Vector& operator=(const Vector& a) {v[0]=a.v[0];v[1]=a.v[1];v[2]=a.v[2];return *this;} double& operator[](int i) {return v[i];} Vector abs(); double length(); double angle(); double avg(); double max(); double min(); Vector round(); Vector floor(); Vector ceil(); Vector invert(); Vector normalize(); Vector TkCanvasPs(Tk_Canvas); friend Vector operator-(const Vector&); // unary minus friend Vector operator*(const Vector&, const Matrix&); // vector/matrix mult friend double operator*(const Vector&, const Vector&); // dot product friend ostream& operator<<(ostream&, const Vector&); friend istream& operator>>(istream&, Vector&); Vector& operator+=(const Vector&); // addition Vector& operator-=(const Vector&); // subtraction Vector& operator*=(double); // scalar multipy Vector& operator/=(double); // scalar division Vector& operator*=(const Matrix&); // vector multiply friend BBox intersect(const BBox&, const BBox&); // the following are not valid for 2D graphics: Vector& div(double); Vector& minus(const Vector&); friend Vector mult(const Vector&, double); Vector& operator*=(const Vector&); Vector& operator/=(const Vector&); }; Vector operator+(const Vector&, const Vector&); // addition Vector operator-(const Vector&, const Vector&); // subtration Vector operator*(const Vector&, double); // scalar multiply Vector operator/(const Vector&, double); // scalar division Vector cross(Vector&, Vector&); class Vertex { public: Vector vector; private: Vertex* next_; Vertex* previous_; public: Vertex(); Vertex(double, double); Vertex(const Vector&); Vertex* next() {return next_;} Vertex* previous() {return previous_;} void setNext(Vertex* v) {next_ = v;} void setPrevious(Vertex* v) {previous_ = v;} friend ostream& operator<<(ostream&, const Vertex&); }; class Matrix { friend class Vector; friend class Translate; friend class Rotate; friend class Scale; protected: double m[3][3]; public: Matrix(); // constructor Matrix(const Vector&, const Vector&, const Vector&); // constructor Matrix(double, double, double, double, double, double); Matrix(const Matrix&); // copy constructor Matrix& operator=(const Matrix&); // assignment Vector operator[](int); // return row double matrix(int i, int j) {return m[i][j];} // return element Matrix& operator*=(double); // scalar multiply Matrix& operator/=(double); // scalar division Matrix& operator*=(const Matrix&); // matrix multiply Matrix invert(); // matrix inverse Matrix invert2(); Matrix cofactor(); Matrix adjoint(); Matrix abs(); // returns abs with no translation Matrix& identity(); // sets to identity matrix; int isIdentity(); double* mm() {return (double*)m;} friend Vector operator*(const Vector&, const Matrix&); // vector/matrix mult friend ostream& operator<<(ostream&, const Matrix&); friend istream& operator>>(istream&, Matrix&); }; Matrix operator*(const Matrix&, double); // scalar multiply Matrix operator/(const Matrix&, double); // scalar division Matrix operator*(const Matrix&, const Matrix&); // matrix multiply class Translate : public Matrix { public: Translate() {}; // constructor Translate(double, double); // constructor Translate(const Vector&); // constructor Translate(const Matrix&); // copy constructor Translate& operator=(const Matrix&); // assignment friend ostream& operator<<(ostream&, const Translate&); friend istream& operator>>(istream&, Translate&); }; class Rotate : public Matrix { public: Rotate() {}; // constructor Rotate(double); // constructor Rotate(double, double, double, double); // constructor Rotate(const Matrix&); // copy constructor Rotate& operator=(const Matrix&); // assignment friend ostream& operator<<(ostream&, const Rotate&); friend istream& operator>>(istream&, Rotate&); }; class Scale : public Matrix { public: Scale() {}; // constructor Scale(double); // constructor Scale(double, double); // constructor Scale(const Vector&); // constructor Scale(const Matrix&); // copy constructor Scale& operator=(const Matrix&); // assignment friend ostream& operator<<(ostream&, const Scale&); friend istream& operator>>(istream&, Scale&); }; class FlipX : public Matrix { public: FlipX(); // constructor }; class FlipY : public Matrix { public: FlipY(); // constructor }; class FlipXY : public Matrix { public: FlipXY(); // constructor }; class BBox { public: Vector ll; Vector ur; public: BBox() {} BBox(const Vector&, const Vector&); BBox(const Vector&); BBox(double, double); BBox(double, double, double, double); BBox& operator+=(const Vector&); // addition BBox& operator-=(const Vector&); // subtraction BBox& operator*=(const Matrix&); // multiplication int isIn(const Vector&) const; int isIn(const BBox&) const; int isEmpty() const; Vector center(); Vector size(); Vector lr() {return Vector(ur[0],ll[1]);} Vector ul() {return Vector(ll[0],ur[1]);} BBox& expand(double); BBox& expand(const Vector&); BBox& shrink(double); BBox& shrink(const Vector&); BBox& bound(const Vector&); BBox& bound(BBox); friend ostream& operator<<(ostream&, const BBox&); }; BBox operator+(const BBox&, const Vector&); // addition BBox operator-(const BBox&, const Vector&); // subtraction BBox operator*(const BBox&, const Matrix&); BBox intersect(const BBox&, const BBox&); #endif saods9/tksao1.0/util/attribute.C000644 000765 000000 00000011061 12540621044 017005 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "attribute.h" #include "util.h" #include "widget.h" Attribute::Attribute(Widget* p) : parent(p) { style_ = SOLID; width_ = 1; font_ = 2; // helvetica normal roman size_ = 10; tkfont_ = NULL; psfont_ = NULL; initFonts(); colour_ = 0xffffff; // white colorName_ = dupstr("white"); color_ = parent->getColor("white"); } Attribute::~Attribute() { if (tkfont_) Tk_FreeFont(tkfont_); if (psfont_) Tk_FreeFont(psfont_); if (colorName_) delete [] colorName_; } void Attribute::setStyle(double v) { switch ((int)v) { case SOLID: case DASH: break; default: return; } style_ = (Style)((int)v); } void Attribute::setWidth(double v) { if (v>0) width_ = v; else width_ = 1; } void Attribute::setSize(double v) { if (v >= 1) { #ifdef MAC_OSX_TK size_ = int(v*parent->getDisplayRatio()); #else size_ = (int)v; #endif initFonts(); } } void Attribute::setFont(double v) { font_ = (int)v; initFonts(); } void Attribute::initFonts() { if (tkfont_) Tk_FreeFont(tkfont_); tkfont_ = NULL; if (psfont_) Tk_FreeFont(psfont_); psfont_ = NULL; WidgetOptions* opts = parent->options; ostringstream fstr; ostringstream pstr; switch (font_) { case 0: case 2: case 3: fstr << '{' << opts->helvetica << '}' << ' ' << size_ << " normal roman" << ends; pstr << "helvetica " << size_ << " normal roman" << ends; break; case 1: fstr << '{' << opts->times << '}' << ' ' << size_ << " normal roman" << ends; pstr << "times " << size_ << " normal roman" << ends; break; case 4: fstr << '{' << opts->courier << '}' << ' ' << size_ << " normal roman" << ends; pstr << "courier " << size_ << " normal roman" << ends; break; case 10: case 12: case 13: fstr << '{' << opts->helvetica << '}' << ' ' << size_ << " bold roman" << ends; pstr << "helvetica " << size_ << " bold roman" << ends; break; case 11: fstr << '{' << opts->times << '}' << ' ' << size_ << " bold roman" << ends; pstr << "times " << size_ << " bold roman" << ends; break; case 14: fstr << '{' << opts->courier << '}' << ' ' << size_ << " bold roman" << ends; pstr << "courier " << size_ << " bold roman" << ends; break; case 20: case 22: case 23: fstr << '{' << opts->helvetica << '}' << ' ' << size_ << " normal italic" << ends; pstr << "helvetica " << size_ << " normal italic" << ends; break; case 21: fstr << '{' << opts->times << '}' << ' ' << size_ << " normal italic" << ends; pstr << "times " << size_ << " normal italic" << ends; break; case 24: fstr << '{' << opts->courier << '}' << ' ' << size_ << " normal italic" << ends; pstr << "courier " << size_ << " normal italic" << ends; break; case 30: case 32: case 33: fstr << '{' << opts->helvetica << '}' << ' ' << size_ << " bold italic" << ends; pstr << "helvetica " << size_ << " bold italic" << ends; break; case 31: fstr << '{' << opts->times << '}' << ' ' << size_ << " bold italic" << ends; pstr << "times " << size_ << " bold italic" << ends; break; case 34: fstr << '{' << opts->courier << '}' << ' ' << size_ << " bold italic" << ends; pstr << "courier " << size_ << " bold italic" << ends; break; default: fstr << '{' << opts->helvetica << '}' << ' ' << size_ << " normal roman" << ends; pstr << "helvetica " << size_ << " normal roman" << ends; font_ = 2; break; } tkfont_ = Tk_GetFont(parent->getInterp(), parent->getTkwin(), fstr.str().c_str()); psfont_ = Tk_GetFont(parent->getInterp(), parent->getTkwin(), pstr.str().c_str()); } void Attribute::setColour(double v) { if (v == colour_) return; if (colorName_) delete [] colorName_; colorName_ = NULL; // still provide backward compatibility for old color scheme if (v==1) colour_ = (int)0xffffff; // white else if (v==2) colour_ = (int)0xff0000; // red else if (v==3) colour_ = (int)0x00ff00; // green else if (v==4) colour_ = (int)0x0000ff; // blue else if (v==5) colour_ = (int)0x00ffff; // cyan else if (v==6) colour_ = (int)0xff00ff; // magneta else if (v==7) colour_ = (int)0xffff00; // yellow else colour_ = (int)v; ostringstream str; str << '#' << setw(6) << setfill('0') << hex << colour_ << ends; colorName_ = dupstr(str.str().c_str()); color_ = parent->getColor(str.str().c_str()); } saods9/tksao1.0/util/attribute.h000644 000765 000000 00000002151 12464214757 017070 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __attribute_h__ #define __attribute_h__ #include #include "vector.h" class Widget; class Attribute { public: enum Style {SOLID,DASH}; enum Colour {BLACK,WHITE,RED,GREEN,BLUE,CYAN,MAGENTA,YELLOW}; private: Widget* parent; Style style_; float width_; int font_; int size_; Tk_Font tkfont_; Tk_Font psfont_; unsigned long colour_; char* colorName_; unsigned long color_; private: void initFonts(); public: Attribute(Widget*); ~Attribute(); void setStyle(double); void setWidth(double); void setSize(double); void setFont(double); void setColour(double); Style style() {return style_;} float width() {return width_;} int size() {return size_;} int font() {return font_;} Tk_Font tkfont() {return tkfont_;} Tk_Font psfont() {return psfont_;} unsigned long colour() {return colour_;} char* colorName() {return colorName_;} unsigned long color() {return color_;} }; #endif saods9/tksao1.0/util/fdstream.hpp000644 000765 000000 00000011234 07611565102 017223 0ustar00joyewheel000000 000000 /* The following code declares classes to read from and write to * file descriptore or file handles. * * See * http://www.josuttis.com/cppcode * for details and the latest version. * * - open: * - integrating BUFSIZ on some systems? * - optimized reading of multiple characters * - stream for reading AND writing * - i18n * * (C) Copyright Nicolai M. Josuttis 2001. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. * * Version: Jul 28, 2002 * History: * Jul 28, 2002: bugfix memcpy() => memmove() * fdinbuf::underflow(): cast for return statements * Aug 05, 2001: first public version */ #ifndef BOOST_FDSTREAM_HPP #define BOOST_FDSTREAM_HPP #include #include #include // for EOF: #include // for memmove(): #include // low-level read and write functions #ifdef _MSC_VER # include #else # include //extern "C" { // int write (int fd, const char* buf, int num); // int read (int fd, char* buf, int num); //} #endif // BEGIN namespace BOOST namespace boost { /************************************************************ * fdostream * - a stream that writes on a file descriptor ************************************************************/ class fdoutbuf : public std::streambuf { protected: int fd; // file descriptor public: // constructor fdoutbuf (int _fd) : fd(_fd) { } protected: // write one character virtual int_type overflow (int_type c) { if (c != EOF) { char z = c; if (write (fd, &z, 1) != 1) { return EOF; } } return c; } // write multiple characters virtual std::streamsize xsputn (const char* s, std::streamsize num) { return write(fd,s,num); } }; class fdostream : public std::ostream { protected: fdoutbuf buf; public: fdostream (int fd) : std::ostream(0), buf(fd) { rdbuf(&buf); } }; /************************************************************ * fdistream * - a stream that reads on a file descriptor ************************************************************/ class fdinbuf : public std::streambuf { protected: int fd; // file descriptor protected: /* data buffer: * - at most, pbSize characters in putback area plus * - at most, bufSize characters in ordinary read buffer */ static const int pbSize = 4; // size of putback area static const int bufSize = 1024; // size of the data buffer char buffer[bufSize+pbSize]; // data buffer public: /* constructor * - initialize file descriptor * - initialize empty data buffer * - no putback area * => force underflow() */ fdinbuf (int _fd) : fd(_fd) { setg (buffer+pbSize, // beginning of putback area buffer+pbSize, // read position buffer+pbSize); // end position } protected: // insert new characters into the buffer virtual int_type underflow () { #ifndef _MSC_VER using std::memmove; #endif // is read position before end of buffer? if (gptr() < egptr()) { return traits_type::to_int_type(*gptr()); } /* process size of putback area * - use number of characters read * - but at most size of putback area */ int numPutback; numPutback = gptr() - eback(); if (numPutback > pbSize) { numPutback = pbSize; } /* copy up to pbSize characters previously read into * the putback area */ memmove (buffer+(pbSize-numPutback), gptr()-numPutback, numPutback); // read at most bufSize new characters int num; num = read (fd, buffer+pbSize, bufSize); if (num <= 0) { // ERROR or EOF return EOF; } // reset buffer pointers setg (buffer+(pbSize-numPutback), // beginning of putback area buffer+pbSize, // read position buffer+pbSize+num); // end of buffer // return next character return traits_type::to_int_type(*gptr()); } }; class fdistream : public std::istream { protected: fdinbuf buf; public: fdistream (int fd) : std::istream(0), buf(fd) { rdbuf(&buf); } }; } // END namespace boost #endif /*BOOST_FDSTREAM_HPP*/ saods9/tksao1.0/util/FlexLexer.h000644 000765 000000 00000014163 12032640000 016740 0ustar00joyewheel000000 000000 // -*-C++-*- // FlexLexer.h -- define interfaces for lexical analyzer classes generated // by flex // Copyright (c) 1993 The Regents of the University of California. // All rights reserved. // // This code is derived from software contributed to Berkeley by // Kent Williams and Tom Epperly. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // Neither the name of the University nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE. // This file defines FlexLexer, an abstract class which specifies the // external interface provided to flex C++ lexer objects, and yyFlexLexer, // which defines a particular lexer class. // // If you want to create multiple lexer classes, you use the -P flag // to rename each yyFlexLexer to some other xxFlexLexer. You then // include in your other sources once per lexer class: // // #undef yyFlexLexer // #define yyFlexLexer xxFlexLexer // #include // // #undef yyFlexLexer // #define yyFlexLexer zzFlexLexer // #include // ... #ifndef __FLEX_LEXER_H // Never included before - need to define base class. #define __FLEX_LEXER_H #include # ifndef FLEX_STD # define FLEX_STD std:: # endif extern "C++" { struct yy_buffer_state; typedef int yy_state_type; class FlexLexer { public: virtual ~FlexLexer() { } const char* YYText() const { return yytext; } size_t YYLeng() const { return yyleng; } virtual void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0; virtual struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ) = 0; virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0; virtual void yyrestart( FLEX_STD istream* s ) = 0; virtual int yylex() = 0; // Call yylex with new input/output sources. int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ) { switch_streams( new_in, new_out ); return yylex(); } // Switch to new input/output streams. A nil stream pointer // indicates "keep the current one". virtual void switch_streams( FLEX_STD istream* new_in = 0, FLEX_STD ostream* new_out = 0 ) = 0; int lineno() const { return yylineno; } int debug() const { return yy_flex_debug; } void set_debug( int flag ) { yy_flex_debug = flag; } protected: char* yytext; size_t yyleng; int yylineno; // only maintained if you use %option yylineno int yy_flex_debug; // only has effect with -d or "%option debug" }; } #endif // FLEXLEXER_H #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce) // Either this is the first time through (yyFlexLexerOnce not defined), // or this is a repeated include to define a different flavor of // yyFlexLexer, as discussed in the flex manual. #define yyFlexLexerOnce extern "C++" { class yyFlexLexer : public FlexLexer { public: // arg_yyin and arg_yyout default to the cin and cout, but we // only make that assignment when initializing in yylex(). yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 ); virtual ~yyFlexLexer(); void yy_switch_to_buffer( struct yy_buffer_state* new_buffer ); struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size ); void yy_delete_buffer( struct yy_buffer_state* b ); void yyrestart( FLEX_STD istream* s ); void yypush_buffer_state( struct yy_buffer_state* new_buffer ); void yypop_buffer_state(); virtual int yylex(); virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 ); virtual int yywrap(); void begin(int,int); protected: virtual size_t LexerInput( char* buf, size_t max_size ); virtual void LexerOutput( const char* buf, size_t size ); virtual void LexerError( const char* msg ); void yyunput( int c, char* buf_ptr ); int yyinput(); void yy_load_buffer_state(); void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s ); void yy_flush_buffer( struct yy_buffer_state* b ); int yy_start_stack_ptr; int yy_start_stack_depth; int* yy_start_stack; void yy_push_state( int new_state ); void yy_pop_state(); int yy_top_state(); yy_state_type yy_get_previous_state(); yy_state_type yy_try_NUL_trans( yy_state_type current_state ); int yy_get_next_buffer(); FLEX_STD istream* yyin; // input source for default LexerInput FLEX_STD ostream* yyout; // output sink for default LexerOutput // yy_hold_char holds the character lost when yytext is formed. char yy_hold_char; // Number of characters read into yy_ch_buf. size_t yy_n_chars; // Points to current character in buffer. char* yy_c_buf_p; int yy_init; // whether we need to initialize int yy_start; // start state number // Flag which is used to allow yywrap()'s to do buffer switches // instead of setting up a fresh yyin. A bit of a hack ... int yy_did_buffer_switch_on_eof; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */ void yyensure_buffer_stack(void); // The following are not always needed, but may be depending // on use of certain flex features (like REJECT or yymore()). yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; yy_state_type* yy_state_buf; yy_state_type* yy_state_ptr; char* yy_full_match; int* yy_full_state; int yy_full_lp; int yy_lp; int yy_looking_for_trail_begin; int yy_more_flag; int yy_more_len; int yy_more_offset; int yy_prev_more_offset; }; } #endif // yyFlexLexer || ! yyFlexLexerOnce saods9/tksao1.0/util/fuzzy.h000644 000765 000000 00000002004 12464214757 016251 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fuzzy_h__ #define __fuzzy_h__ #include #include #include using namespace std; #include inline void tzero(double* ff, const double epsilon= DBL_EPSILON) {if (*ff>=-epsilon && *ff<=epsilon) *ff = 0;} inline bool teq(const double f1, const double f2, const double epsilon= DBL_EPSILON) {return f1-f2 >= -epsilon && f1-f2 <= epsilon;} inline bool tlt(const double f1, const double f2, const double epsilon= DBL_EPSILON) {return f1-f2 < -epsilon;} inline bool tle(const double f1, const double f2, const double epsilon= DBL_EPSILON) {return f1-f2 <= -epsilon; } inline bool tgt(const double f1, const double f2, const double epsilon= DBL_EPSILON) {return f1-f2 > epsilon;} inline bool tge(const double f1, const double f2, const double epsilon= DBL_EPSILON) {return f1-f2 >= epsilon;} #endif saods9/tksao1.0/util/grf.C000644 000765 000000 00000052300 12547273626 015601 0ustar00joyewheel000000 000000 extern "C" { #include "grf.h" } #include "grid2dbase.h" #include "grid25dbase.h" extern Grid2dBase* astGrid2dPtr; extern Grid25dBase* astGrid25dPtr; /* * Name: * astGFlush * * Purpose: * Flush all pending graphics to the output device * * Synopsis: * #include "grf.h" * int astGFlush( void ) * * Description: * This function ensures that the display device is up-to-date, * by flushing any pending graphics to the output device. * * Parameters: * None * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise */ int astGFlush(void) { if (astGrid2dPtr) return astGrid2dPtr->gFlush(); else if (astGrid25dPtr) return astGrid25dPtr->gFlush(); return 0; } /* * Name: * astGLine * * Purpose: * Draw a polyline (i.e. a set of connected lines) * * Synopsis: * #include "grf.h" * int astGLine( int n, const float *x, const float *y ) * * Description: * This function displays lines joining the given positions * * Parameters: * n * The number of positions to be joined together * x * A pointer to an array holding the "n" x values * y * A pointer to an array holding the "n" y values * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise * * Notes: * - Nothing is done if "n" is less than 2, or if a NULL pointer is * given for either "x" or "y" */ int astGLine(int n, const float *x, const float *y) { if (astGrid2dPtr) return astGrid2dPtr->gLine(n, (float*)x, (float*)y); else if (astGrid25dPtr) return astGrid25dPtr->gLine(n, (float*)x, (float*)y); return 0; } /* * Name: * astGQch * * Purpose: * Return the character height in world cooridnates * * Synopsis: * #include "grf.h" * int astGQch( float *chv, float *chh ) * * Description: * This function returns the heights of characters drawn vertically and * horizontally in world coordinates * * Parameters: * chv * A pointer to the double which is to receive the height of * characters drawn vertically. This will be an increment in the X * axis * chh * A pointer to the double which is to receive the height of * characters drawn vertically. This will be an increment in the Y * axis * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise */ int astGQch(float *chv, float *chh) { if (astGrid2dPtr) return astGrid2dPtr->gQch(chv, chh); else if (astGrid25dPtr) return astGrid25dPtr->gQch(chv, chh); return 0; } /* * Name: * astGMark * * Purpose: * Draw a set of markers * * Synopsis: * #include "grf.h" * int astGMark( int n, const float *x, const float *y, int type ) * * Description: * This function displays markers at the given positions * * Parameters: * n * The number of markers to draw * x * A pointer to an array holding the "n" x values * y * A pointer to an array holding the "n" y values * type * An integer which can be used to indicate the type of marker symbol * required * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise * * Notes: * - Nothing is done if "n" is less than 1, or if a NULL pointer is * given for either "x" or "y" * */ int astGMark(int n, const float *x, const float *y, int type) { if (astGrid2dPtr) return astGrid2dPtr->gMark(n, x, y, type); else if (astGrid25dPtr) return astGrid25dPtr->gMark(n, x, y, type); return 0; } /* * Name: * astGText * * Purpose: * Draw a character string * * Synopsis: * #include "grf.h" * int astGText( const char *text, float x, float y, const char *just, * float upx, float upy ) * * Description: * This function displays a character string at a given position * using a specified justification and up-vector * * Parameters: * text * Pointer to a null-terminated character string to be displayed * x * The reference x coordinate * y * The reference y coordinate * just * A character string which specifies the location within the * text string which is to be placed at the reference position * given by x and y. The first character may be 'T' for "top", * 'C' for "centre", or 'B' for "bottom", and specifies the * vertical location of the reference position. Note, "bottom" * corresponds to the base-line of normal text. Some characters * (eg "y", "g", "p", etc) descend below the base-line. The second * character may be 'L' for "left", 'C' for "centre", or 'R' * for "right", and specifies the horizontal location of the * reference position. If the string has less than 2 characters * then 'C' is used for the missing characters * upx * The x component of the up-vector for the text, in graphics world * coordinates. If necessary the supplied value should be negated * to ensure that positive values always refer to displacements from * left to right on the screen * upy * The y component of the up-vector for the text, in graphics world * coordinates. If necessary the supplied value should be negated * to ensure that positive values always refer to displacements from * bottom to top on the screen * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise * * Notes: * - Any graphics within the rotated box enclosing the text are erased * - A NULL value for "just" causes a value of "CC" to be used * - Both "upx" and "upy" being zero causes an error * - Any unrecognised character in "just" causes an error */ int astGText(const char *text, float x, float y, const char *just, float upx, float upy) { if (astGrid2dPtr) return astGrid2dPtr->gText(text, x ,y, just, upx, upy); else if (astGrid25dPtr) return astGrid25dPtr->gText(text, x ,y, just, upx, upy); return 0; } /* * Name: * astGTxExt * * Purpose: * Get the extent of a character string * * Synopsis: * #include "grf.h" * int astGTxExt( const char *text, float x, float y, const char *just, * float upx, float upy, float *xb, float *yb ) * * Description: * This function returns the corners of a box which would enclose the * supplied character string if it were displayed using astGText * * The returned box INCLUDES any leading or trailing spaces * * Parameters: * text * Pointer to a null-terminated character string to be displayed * x * The reference x coordinate * y * The reference y coordinate * just * A character string which specifies the location within the * text string which is to be placed at the reference position * given by x and y. The first character may be 'T' for "top", * 'C' for "centre", or 'B' for "bottom", and specifies the * vertical location of the reference position. Note, "bottom" * corresponds to the base-line of normal text. Some characters * (eg "y", "g", "p", etc) descend below the base-line. The second * character may be 'L' for "left", 'C' for "centre", or 'R' * for "right", and specifies the horizontal location of the * reference position. If the string has less than 2 characters * then 'C' is used for the missing characters * upx * The x component of the up-vector for the text, in graphics world * coordinates. If necessary the supplied value should be negated * to ensure that positive values always refer to displacements from * left to right on the screen * upy * The y component of the up-vector for the text, in graphics world * coordinates. If necessary the supplied value should be negated * to ensure that positive values always refer to displacements from * bottom to top on the screen * xb * An array of 4 elements in which to return the x coordinate of * each corner of the bounding box * yb * An array of 4 elements in which to return the y coordinate of * each corner of the bounding box * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise * * Notes: * - The order of the corners is anti-clockwise (in world coordinates) * starting at the bottom left * - A NULL value for "just" causes a value of "CC" to be used * - Both "upx" and "upy" being zero causes an error * - Any unrecognised character in "just" causes an error * - Zero is returned for all bounds of the box if an error occurs */ int astGTxExt(const char *text, float x, float y, const char *just, float upx, float upy, float *xb, float *yb) { if (astGrid2dPtr) return astGrid2dPtr->gTxExt(text, x, y, just, upx, upy, xb, yb); else if (astGrid25dPtr) return astGrid25dPtr->gTxExt(text, x, y, just, upx, upy, xb, yb); return 0; } /* * Name: * astGAttr * * Purpose: * Enquire or set a graphics attribute value * * Synopsis: * #include "grf.h" * int int astGAttr( int attr, double value, double *old_value, int prim ) * * Description: * This function returns the current value of a specified graphics * attribute, and optionally establishes a new value. The supplied * value is converted to an integer value if necessary before use * * Parameters: * attr * An integer value identifying the required attribute. The * following symbolic values are defined in grf.h: * * GRF__STYLE - Line style * GRF__WIDTH - Line width * GRF__SIZE - Character and marker size scale factor * GRF__FONT - Character font * GRF__COLOUR - Colour index * value * A new value to store for the attribute. If this is AST__BAD * no value is stored * old_value * A pointer to a double in which to return the attribute value * If this is NULL, no value is returned * prim * The sort of graphics primative to be drawn with the new attribute * Identified by the following values defined in grf.h: * GRF__LINE * GRF__MARK * GRF__TEXT * * Returned Value: * A value of 0 is returned if an error occurrs, and 1 is returned * otherwise * * Notes: */ int astGAttr(int attr, double value, double *old, int prim) { if (astGrid2dPtr) return astGrid2dPtr->gAttr(attr, value, old, prim); else if (astGrid25dPtr) return astGrid25dPtr->gAttr(attr, value, old, prim); return 0; } /* * Name: * astGScales * * Purpose: * Get the axis scales. * * Synopsis: * #include "grf.h" * int astGScales( float *alpha, float *beta ) * * Description: * This function returns two values (one for each axis) which scale * increments on the corresponding axis into a "normal" coordinate * system in which: * 1 - The axes have equal scale in terms of (for instance) * millimetres per unit distance. * 2 - X values increase from left to right. * 3 - Y values increase from bottom to top. * * Parameters: * alpha * A pointer to the location at which to return the scale for the * X axis (i.e. Xnorm = alpha*Xworld). * beta * A pointer to the location at which to return the scale for the * Y axis (i.e. Ynorm = beta*Yworld). * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. */ int astGScales(float *alpha, float *beta) { if (astGrid2dPtr) return astGrid2dPtr->gScales(alpha,beta); else if (astGrid25dPtr) return astGrid25dPtr->gScales(alpha,beta); return 0; } /* * Name: * astGCap * * Purpose: * Indicate if this grf module has a given capability. * * Synopsis: * #include "grf.h" * int astGCap( int cap, int value ) * * Description: * This function is called by the AST Plot class to determine if the * grf module has a given capability, as indicated by the "cap" * argument. * * Parameters: * cap * The capability being inquired about. This will be one of the * following constants defined in grf.h: * * GRF__SCALES: This function should return a non-zero value if * it implements the astGScales function, and zero otherwise. The * supplied "value" argument should be ignored. * * GRF__MJUST: This function should return a non-zero value if * the astGText and astGTxExt functions recognise "M" as a * character in the justification string. If the first character of * a justification string is "M", then the text should be justified * with the given reference point at the bottom of the bounding box. * This is different to "B" justification, which requests that the * reference point be put on the baseline of the text, since some * characters hang down below the baseline. If the astGText or * astGTxExt function cannot differentiate between "M" and "B", * then this function should return zero, in which case "M" * justification will never be requested by Plot. The supplied * "value" argument should be ignored. * * GRF__ESC: This function should return a non-zero value if the * astGText and astGTxExt functions can recognise and interpret * graphics escape sequences within the supplied string. These * escape sequences are described below. Zero should be returned * if escape sequences cannot be interpreted (in which case the * Plot class will interpret them itself if needed). The supplied * "value" argument should be ignored only if escape sequences cannot * be interpreted by astGText and astGTxExt. Otherwise, "value" * indicates whether astGText and astGTxExt should interpret escape * sequences in subsequent calls. If "value" is non-zero then * escape sequences should be interpreted by astGText and * astGTxExt. Otherwise, they should be drawn as literal text. * * Returned Value: * The return value, as described above. Zero should be returned if * the supplied capability is not recognised. * * Escape Sequences: * Escape sequences are introduced into the text string by a percent * "%" character. The following escape sequences are currently recognised * ("..." represents a string of one or more decimal digits): * * %% - Print a literal "%" character (type GRF__ESPER ). * * %^...+ - Draw subsequent characters as super-scripts. The digits * "..." give the distance from the base-line of "normal" * text to the base-line of the super-script text, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESSUP ). * %^+ - Draw subsequent characters with the normal base-line. * * %v...+ - Draw subsequent characters as sub-scripts. The digits * "..." give the distance from the base-line of "normal" * text to the base-line of the sub-script text, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESSUB ). * * %v+ - Draw subsequent characters with the normal base-line * (equivalent to %^+). * * %>...+ - Leave a gap before drawing subsequent characters. * The digits "..." give the size of the gap, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESGAP ). * * %<...+ - Move backwards before drawing subsequent characters. * The digits "..." give the size of the movement, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF_ESBAC). * * %s...+ - Change the Size attribute for subsequent characters. The * digits "..." give the new Size as a fraction of the * "normal" Size, scaled so that a value of "100" corresponds * to 1.0 (type GRF__ESSIZ ). * * %s+ - Reset the Size attribute to its "normal" value. * * %w...+ - Change the Width attribute for subsequent characters. The * digits "..." give the new width as a fraction of the * "normal" Width, scaled so that a value of "100" corresponds * to 1.0 (type GRF__ESWID ). * * %w+ - Reset the Size attribute to its "normal" value. * * %f...+ - Change the Font attribute for subsequent characters. The * digits "..." give the new Font value (type GRF__ESFON ). * * %f+ - Reset the Font attribute to its "normal" value. * * %c...+ - Change the Colour attribute for subsequent characters. The * digits "..." give the new Colour value (type GRF__ESCOL ). * * %c+ - Reset the Colour attribute to its "normal" value. * * %t...+ - Change the Style attribute for subsequent characters. The * digits "..." give the new Style value (type GRF__ESSTY ). * * %t+ - Reset the Style attribute to its "normal" value. * * %- - Push the current graphics attribute values onto the top of * the stack - see "%+" (type GRF__ESPSH). * * %+ - Pop attributes values of the top the stack - see "%-". If * the stack is empty, "normal" attribute values are restored * (type GRF__ESPOP). * * The astFindEscape function (in libast.a) can be used to locate escape * sequences within a text string. It has the following signature: * * #include "plot.h" * int astFindEscape( const char *text, int *type, int *value, int *nc ) * * Parameters: * text * Pointer to the string to be checked. * type * Pointer to a location at which to return the type of escape * sequence. Each type is identified by a symbolic constant defined * in grf.h and is indicated in the above section. The returned value * is undefined if the supplied text does not begin with an escape * sequence. * value * Pointer to a lcation at which to return the integer value * associated with the escape sequence. All usable values will be * positive. Zero is returned if the escape sequence has no associated * integer. A value of -1 indicates that the attribute identified by * "type" should be reset to its "normal" value (as established using * the astGAttr function, etc). The returned value is undefined if * the supplied text does not begin with an escape sequence. * nc * Pointer to a location at which to return the number of * characters read by this call. If the text starts with an escape * sequence, the returned value will be the number of characters in * the escape sequence. Otherwise, the returned value will be the * number of characters prior to the first escape sequence, or the * length of the supplied text if no escape sequence is found. * * Returned Value: * A non-zero value is returned if the supplied text starts with a * graphics escape sequence, and zero is returned otherwise. */ int astGCap(int cap, int value) { if (astGrid2dPtr) return astGrid2dPtr->gCap(cap,value); else if (astGrid25dPtr) return astGrid25dPtr->gCap(cap,value); return 0; } /* * Name: * astGBBuf * * Purpose: * Start a new graphics buffering context. * * Synopsis: * #include "grf.h" * int astGBBuf( void ) * * Description: * This function begins saving graphical output commands in an * internal buffer; the commands are held until a matching astGEBuf * call (or until the buffer is emptied by astGFlush). This can * greatly improve the efficiency of some graphics systems. astGBBuf * increments an internal counter, while astGEBuf decrements this * counter and flushes the buffer to the output device when the * counter drops to zero. astGBBuf and astGEBuf calls should always * be paired. * * Parameters: * None. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * */ int astGBBuf(void) { return 1; } /* * Name: * astGEBuf * * Purpose: * End a graphics buffering context. * * Synopsis: * #include "grf.h" * int astGEBuf( void ) * * Description: * This function marks the end of a batch of graphical output begun * with the last call of astGBBuf. astGBBuf and astGEBUF calls should * always be paired. Each call to astGBBuf increments a counter, while * each call to astGEBuf decrements the counter. When the counter * reaches 0, the batch of output is written on the output device. * * Parameters: * None. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * */ int astGEBuf(void) { return 1; } saods9/tksao1.0/util/grf3d.C000644 000765 000000 00000043142 12545015743 016024 0ustar00joyewheel000000 000000 extern "C" { #include "grf3d.h" } #include "grid3dbase.h" extern Grid3dBase* astGrid3dPtr; /* * Name: * astG3DCap * * Purpose: * Indicate if this grf3d module has a given capability. * * Synopsis: * #include "grf3d.h" * int astG3DCap( int cap, int value ) * * Description: * This function is called by the AST Plot class to determine if the * grf3d module has a given capability, as indicated by the "cap" * argument. * * Parameters: * cap * The capability being inquired about. This will be one of the * following constants defined in grf3d.h: * * GRF3D__ESC: This function should return a non-zero value if the * astG3DText and astG3DTxExt functions can recognise and interpret * graphics escape sequences within the supplied string. These * escape sequences are described below. Zero should be returned * if escape sequences cannot be interpreted (in which case the * Plot class will interpret them itself if needed). The supplied * "value" argument should be ignored only if escape sequences cannot * be interpreted by astG3DText and astG3DTxExt. Otherwise, "value" * indicates whether astG3DText and astG3DTxExt should interpret escape * sequences in subsequent calls. If "value" is non-zero then * escape sequences should be interpreted by astG3DText and * astG3DTxExt. Otherwise, they should be drawn as literal text. * * Returned Value: * The return value, as described above. Zero should be returned if * the supplied capability is not recognised. * * Escape Sequences: * Escape sequences are introduced into the text string by a percent * "%" character. The following escape sequences are currently recognised * ("..." represents a string of one or more decimal digits): * * %% - Print a literal "%" character (type GRF__ESPER ). * * %^...+ - Draw subsequent characters as super-scripts. The digits * "..." give the distance from the base-line of "normal" * text to the base-line of the super-script text, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESSUP ). * %^+ - Draw subsequent characters with the normal base-line. * * %v...+ - Draw subsequent characters as sub-scripts. The digits * "..." give the distance from the base-line of "normal" * text to the base-line of the sub-script text, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESSUB ). * * %v+ - Draw subsequent characters with the normal base-line * (equivalent to %^+). * * %>...+ - Leave a gap before drawing subsequent characters. * The digits "..." give the size of the gap, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF__ESGAP ). * * %<...+ - Move backwards before drawing subsequent characters. * The digits "..." give the size of the movement, scaled * so that a value of "100" corresponds to the height of * "normal" text (type GRF_ESBAC). * * %s...+ - Change the Size attribute for subsequent characters. The * digits "..." give the new Size as a fraction of the * "normal" Size, scaled so that a value of "100" corresponds * to 1.0 (type GRF__ESSIZ ). * * %s+ - Reset the Size attribute to its "normal" value. * * %w...+ - Change the Width attribute for subsequent characters. The * digits "..." give the new width as a fraction of the * "normal" Width, scaled so that a value of "100" corresponds * to 1.0 (type GRF__ESWID ). * * %w+ - Reset the Size attribute to its "normal" value. * * %f...+ - Change the Font attribute for subsequent characters. The * digits "..." give the new Font value (type GRF__ESFON ). * * %f+ - Reset the Font attribute to its "normal" value. * * %c...+ - Change the Colour attribute for subsequent characters. The * digits "..." give the new Colour value (type GRF__ESCOL ). * * %c+ - Reset the Colour attribute to its "normal" value. * * %t...+ - Change the Style attribute for subsequent characters. The * digits "..." give the new Style value (type GRF__ESSTY ). * * %t+ - Reset the Style attribute to its "normal" value. * * %- - Push the current graphics attribute values onto the top of * the stack - see "%+" (type GRF__ESPSH). * * %+ - Pop attributes values of the top the stack - see "%-". If * the stack is empty, "normal" attribute values are restored * (type GRF__ESPOP). * * The astFindEscape function (in libast.a) can be used to locate escape * sequences within a text string. It has the following signature: * * #include "plot.h" * int astFindEscape( const char *text, int *type, int *value, int *nc ) * * Parameters: * text * Pointer to the string to be checked. * type * Pointer to a location at which to return the type of escape * sequence. Each type is identified by a symbolic constant defined * in grf.h and is indicated in the above section. The returned value * is undefined if the supplied text does not begin with an escape * sequence. * value * Pointer to a lcation at which to return the integer value * associated with the escape sequence. All usable values will be * positive. Zero is returned if the escape sequence has no associated * integer. A value of -1 indicates that the attribute identified by * "type" should be reset to its "normal" value (as established using * the astG3DAttr function, etc). The returned value is undefined if * the supplied text does not begin with an escape sequence. * nc * Pointer to a location at which to return the number of * characters read by this call. If the text starts with an escape * sequence, the returned value will be the number of characters in * the escape sequence. Otherwise, the returned value will be the * number of characters prior to the first escape sequence, or the * length of the supplied text if no escape sequence is found. * * Returned Value: * A non-zero value is returned if the supplied text starts with a * graphics escape sequence, and zero is returned otherwise. * */ int astG3DCap(int cap, int value) { if (astGrid3dPtr) return astGrid3dPtr->gCap(cap, value); return 0; } /* * Name: * astG3DFlush * * Purpose: * Flush all pending graphics to the output device. * * Synopsis: * #include "grf3d.h" * int astG3DFlush( void ) * * Description: * This function ensures that the display device is up-to-date, * by flushing any pending graphics to the output device. * * Parameters: * None. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * */ int astG3DFlush(void) { if (astGrid3dPtr) return astGrid3dPtr->gFlush(); return 0; } /* * Name: * astG3DLine * * Purpose: * Draw a polyline (i.e. a set of connected lines). * * Synopsis: * #include "grf3d.h" * int astG3DLine( int n, float *x, float *y, float *z ) * * Description: * This function displays lines joining the given positions. * * Parameters: * n * The number of positions to be joined together. * x * A pointer to an array holding the "n" x values. * y * A pointer to an array holding the "n" y values. * z * A pointer to an array holding the "n" z values. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * - A camera must have been established prior to calling this * function using either astG3DSetCamera or astG3DAutoCamera. * - Nothing is done if "n" is less than 2, or if a NULL pointer is * given for either "x", "y" or "z". * */ int astG3DLine(int n, float *x, float *y, float *z) { if (astGrid3dPtr) return astGrid3dPtr->gLine(n, x, y, z); return 0; } /* * Name: * astG3DQch * * Purpose: * Return the character height in world coordinates. * * Synopsis: * #include "grf3d.h" * int astG3DQch( float *ch ) * * Description: * This function returns the height of characters drawn using astG3DText. * * Parameters: * ch * A pointer to the double which is to receive the height of * characters drawn with astG3DText. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * - Since the 3D world coordinate axes are assumed to be equally * scaled, the height of text in world coordinate units is independent * of the orientation of the text. Therefore, this function returns * only one height value, unlike the equivalent 2D astGQch function * that returns two heights. */ int astG3DQch(float *ch) { if (astGrid3dPtr) return astGrid3dPtr->gQch(ch); return 0; } /* * Name: * astG3DMark * * Purpose: * Draw a set of markers. * * Synopsis: * #include "grf.h" * int astG3DMark( int n, float *x, float *y, float *z, int type, * float norm[3] ) * * Description: * This function draws markers centred at the given positions, on a * plane with a specified normal vector. * * Parameters: * n * The number of markers to draw. * x * A pointer to an array holding the "n" x values. * y * A pointer to an array holding the "n" y values. * z * A pointer to an array holding the "n" z values. * type * An integer which can be used to indicate the type of marker symbol * required. See the description of routine PGPT in the PGPLOT manual. * norm * The (x,y,z) components of a vector that is normal to the plane * containing the marker. The given vector passes through the marker * from the back to the front. If all components of this vector are * zero, then a normal vector pointing from the position of the * first marker towards the camera eye is used. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * - Nothing is done if "n" is less than 1, or if a NULL pointer is * given for "x", "y" or "z". * */ int astG3DMark(int n, float *x, float *y, float *z, int type, float norm[3]) { if (astGrid3dPtr) return astGrid3dPtr->gMark(n, x, y, z, type, norm); return 0; } /* * Name: * astG3DText * * Purpose: * Draw a character string. * * Synopsis: * #include "grf3d.h" * int astG3DText( const char *text, float ref[3], const char *just, * float up[3], float norm[3] ) * * Description: * This function displays a character string at a given position * on a given plane in 3D world coords, using a specified * justification and up-vector. * * Parameters: * text * Pointer to a null-terminated character string to be displayed. * ref * The reference (x,y,z) coordinates. * just * A character string which specifies the location within the * text string which is to be placed at the reference position * given by x and y. The first character may be 'T' for "top", * 'C' for "centre", or 'B' for "bottom", and specifies the * vertical location of the reference position. Note, "bottom" * corresponds to the base-line of normal text. Some characters * (eg "y", "g", "p", etc) descend below the base-line. The second * character may be 'L' for "left", 'C' for "centre", or 'R' * for "right", and specifies the horizontal location of the * reference position. If the string has less than 2 characters * then 'C' is used for the missing characters. * up * The (x,y,z) up-vector for the text. The actual up vector used is * the projection of the supplied vector onto the plane specified by * "norm". * norm * The (x,y,z) components of a vector that is normal to the plane * containing the text. The given vector passes through the text * from the back to the front. If all components of this vector are * zero, then a normal vector pointing towards the camera eye is used. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * - This routine does not recognise PGPLOT escape sequences. * - A NULL value for "just" causes a value of "CC" to be used. */ int astG3DText(const char *text, float ref[3], const char *just, float up[3], float norm[3] ) { if (astGrid3dPtr) return astGrid3dPtr->gText(text, ref, just, up, norm); return 0; } /* * Name: * astG3DTxExt * * Purpose: * Get the extent of a character string. * * Synopsis: * #include "grf3d.h" * int astG3DTxExt( const char *text, float ref[3], const char *just, * float up[3], float norm[3], float *xb, float *yb, * float *zb, float bl[3] ) * * Description: * This function returns the corners of a box which would enclose the * supplied character string if it were displayed using astG3DText. * * The returned box INCLUDES any leading or trailing spaces. * * Parameters: * text * Pointer to a null-terminated character string to be displayed. * ref * The reference (x,y,z) coordinates. * just * A character string which specifies the location within the * text string which is to be placed at the reference position * given by x and y. The first character may be 'T' for "top", * 'C' for "centre", 'B' for "baseline", or "M" for "bottom", and * specifies the vertical location of the reference position. Note, * "baseline" corresponds to the base-line of normal text. Some * characters (eg "y", "g", "p", etc) descend below the base-line, * and so "M" and "B" will produce different effects for such * characters. The second character may be 'L' for "left", 'C' for * "centre", or 'R' for "right", and specifies the horizontal * location of the reference position. If the string has less than * 2 characters then 'C' is used for the missing characters. * up * The (x,y,z) up-vector for the text. The actual up vector used is * the projection of the supplied vector onto the plane specified by * "norm". * norm * The (x,y,z) components of a vector that is normal to the plane * containing the text. The given vector passes through the text * from the back to the front. If all components of this vector are * zero, then a normal vector pointing towards the camera eye is used. * xb * An array of 4 elements in which to return the x coordinate of * each corner of the bounding box. * yb * An array of 4 elements in which to return the y coordinate of * each corner of the bounding box. * zb * An array of 4 elements in which to return the z coordinate of * each corner of the bounding box. * bl * The 3D world coordinates at the left hand end of the text * baseline. * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * - The order of the corners is anti-clockwise starting at the * bottom left when viewing the text normally (i.e. face on). * - This routine does not recognise PGPLOT escape sequences. * - A NULL value for "just" causes a value of "CC" to be used. */ int astG3DTxExt(const char *text, float ref[3], const char *just, float up[3], float norm[3], float *xb, float *yb, float *zb, float bl[3]) { if (astGrid3dPtr) return astGrid3dPtr->gTxExt(text, ref, just, up, norm, xb, yb, zb, bl); return 0; } /* * Name: * astG3DAttr * * Purpose: * Enquire or set a 3D graphics attribute value. * * Synopsis: * #include "grf3d.h" * int int astG3DAttr( int attr, double value, double *old_value, int prim ) * * Description: * This function returns the current value of a specified 3D graphics * attribute, and optionally establishes a new value. The supplied * value is converted to an integer value if necessary before use. * * Parameters: * attr * An integer value identifying the required attribute. The * following symbolic values are defined in grf3d.h: * * GRF__STYLE - Line style. * GRF__WIDTH - Line width. * GRF__SIZE - Character and marker size scale factor. * GRF__FONT - Character font. * GRF__COLOUR - Colour index. * value * A new value to store for the attribute. If this is AST__BAD * no value is stored. * old_value * A pointer to a double in which to return the attribute value. * If this is NULL, no value is returned. * prim * The sort of graphics primitive to be drawn with the new attribute. * Identified by the following values defined in grf.h: * GRF__LINE * GRF__MARK * GRF__TEXT * * Returned Value: * A value of 0 is returned if an error occurs, and 1 is returned * otherwise. * * Notes: * */ int astG3DAttr(int attr, double value, double *old_value, int prim) { if (astGrid3dPtr) return astGrid3dPtr->gAttr(attr, value, old_value, prim); return 0; } saods9/tksao1.0/util/grid25dbase.C000644 000765 000000 00000007000 12545015743 017103 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid25dbase.h" #include "attribute.h" #include "widget.h" #include "frame3dbase.h" extern "C" { #include "ast.h" #include "grf.h" } Grid25dBase* astGrid25dPtr = NULL; Grid25dBase::Grid25dBase(Widget* p) : GridBase(p) {} Grid25dBase::Grid25dBase(Widget* p, const char* o) : GridBase(p,o) {} Grid25dBase::~Grid25dBase() {} int Grid25dBase::gLine(int n, float* x, float* y) { Frame3dBase* pp = (Frame3dBase*)parent_; float xx[n]; float yy[n]; for (int ii=0; iimapFromRef(Vector(x[ii],y[ii]),Coord::WIDGET); xx[ii] = vv[0]; yy[ii] = vv[1]; } switch (renderMode_) { case X11: x11Line(n,xx,yy); break; case PS: psLine(n,xx,yy); break; case MACOSX: #ifdef MAC_OSX_TK macosxLine(n,xx,yy); #endif break; case GWIN32: #ifdef __WIN32 win32Line(n,xx,yy); #endif break; } return 1; } int Grid25dBase::gQch(float* chv, float* chh) { Tk_Font font =NULL; switch (renderMode_) { case X11: font = text_->tkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (font) { Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); *chv = (float)metrics.linespace; *chh = (float)metrics.linespace; return 1; } else { *chv = *chh = 0; return 0; } } int Grid25dBase::gText(const char* txt, float x, float y, const char* just, float upx, float upy) { if (!(txt && txt[0] && just && just[0] && just[1])) return 0; Frame3dBase* pp = (Frame3dBase*)parent_; Vector vv = pp->mapFromRef(Vector(x,y),Coord::WIDGET); switch (renderMode_) { case X11: return x11Text(txt,vv[0],vv[1],just,Vector(0,1)); case PS: return psText(txt,vv[0],vv[1],just,Vector(0,1)); case MACOSX: #ifdef MAC_OSX_TK return macosxText(txt,vv[0],vv[1],just,Vector(0,1)); #endif break; case GWIN32: #ifdef __WIN32 return win32Text(txt,vv[0],vv[1],just,Vector(0,1)); #endif break; } return 0; } int Grid25dBase::gTxExt(const char* txt, float x, float y, const char* just, float upx, float upy, float* xb, float* yb) { if (!(txt && txt[0] && just)) { xb[0] = xb[1] = xb[2] = xb[3] = 0; yb[0] = yb[1] = yb[2] = yb[3] = 0; return 0; } Tk_Font font =NULL; switch (renderMode_) { case X11: font = text_->tkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (!font) return 0; Frame3dBase* pp = (Frame3dBase*)parent_; Vector vv = pp->mapFromRef(Vector(x,y),Coord::WIDGET); double angle = 0; Vector cc = vv * calcTextPos(vv, angle, txt, just, Vector(0, 1), font); Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); int width = Tk_TextWidth(font, txt, strlen(txt)); BBox nn = BBox(Vector(0,-metrics.descent), Vector(width,metrics.ascent)); BBox bb = nn * Rotate(angle) * Translate(cc); xb[0] = bb.ll[0]; yb[0] = bb.ll[1]; xb[1] = bb.ur[0]; yb[1] = bb.ll[1]; xb[2] = bb.ur[0]; yb[2] = bb.ur[1]; xb[3] = bb.ll[0]; yb[3] = bb.ur[1]; return 1; } int Grid25dBase::gScales(float* alpha, float* beta) { return 1; } saods9/tksao1.0/util/grid25dbase.h000644 000765 000000 00000001356 12464214757 017166 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid25dbase_h__ #define __grid25dbase_h__ #include "gridbase.h" class Grid25dBase : public GridBase { public: Grid25dBase(Widget*); Grid25dBase(Widget*, const char*); virtual ~Grid25dBase(); int gLine(int n, float* x, float* y); int gQch(float*, float*); int gMark(int, const float*, const float*, int) {return 1;} int gText(const char* txt, float x, float y, const char* just, float upx, float upy); int gTxExt(const char*, float, float, const char*, float, float, float*, float*); int gScales(float *alpha, float *beta); }; #endif saods9/tksao1.0/util/grid2dbase.C000644 000765 000000 00000006141 12544546070 017024 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid2dbase.h" #include "attribute.h" #include "widget.h" extern "C" { #include "ast.h" #include "grf.h" } Grid2dBase* astGrid2dPtr = NULL; Grid2dBase::Grid2dBase(Widget* p) : GridBase(p) {} Grid2dBase::Grid2dBase(Widget* p, const char* o) : GridBase(p,o) {} Grid2dBase::~Grid2dBase() {} int Grid2dBase::gLine(int n, float* x, float* y) { switch (renderMode_) { case X11: x11Line(n,x,y); break; case PS: psLine(n,x,y); break; case MACOSX: #ifdef MAC_OSX_TK macosxLine(n,x,y); #endif break; case GWIN32: #ifdef __WIN32 win32Line(n,x,y); #endif break; } return 1; } int Grid2dBase::gQch(float* chv, float* chh) { Tk_Font font =NULL; switch (renderMode_) { case X11: font = text_->tkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (font) { Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); *chv = (float)metrics.linespace; *chh = (float)metrics.linespace; return 1; } else { *chv = *chh = 0; return 0; } } int Grid2dBase::gText(const char* txt, float x, float y, const char* just, float upx, float upy) { if (!(txt && txt[0] && just && just[0] && just[1])) return 0; switch (renderMode_) { case X11: return x11Text(txt,x,y,just,Vector(upx,upy)); case PS: return psText(txt,x,y,just,Vector(upx,upy)); case MACOSX: #ifdef MAC_OSX_TK return macosxText(txt,x,y,just,Vector(upx,upy)); #endif break; case GWIN32: #ifdef __WIN32 return win32Text(txt,x,y,just,Vector(upx,upy)); #endif break; } return 0; } int Grid2dBase::gTxExt(const char* txt, float x, float y, const char* just, float upx, float upy, float* xb, float* yb) { if (!(txt && txt[0] && just)) { xb[0] = xb[1] = xb[2] = xb[3] = 0; yb[0] = yb[1] = yb[2] = yb[3] = 0; return 0; } Tk_Font font =NULL; switch (renderMode_) { case X11: font = text_->tkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (!font) return 0; Vector vv = Vector(x,y); double angle = calcTextAngle(just, Vector(upx, upy)); Vector cc = vv * calcTextPos(vv, angle, txt, just, Vector(upx, upy), font); Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); int width = Tk_TextWidth(font, txt, strlen(txt)); BBox nn = BBox(Vector(0,-metrics.descent), Vector(width,metrics.ascent)); BBox bb = nn * Rotate(angle) * Translate(cc); xb[0] = bb.ll[0]; yb[0] = bb.ll[1]; xb[1] = bb.ur[0]; yb[1] = bb.ll[1]; xb[2] = bb.ur[0]; yb[2] = bb.ur[1]; xb[3] = bb.ll[0]; yb[3] = bb.ur[1]; return 1; } int Grid2dBase::gScales(float* alpha, float* beta) { return 1; } saods9/tksao1.0/util/grid2dbase.h000644 000765 000000 00000001346 12464214757 017100 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid2dbase_h__ #define __grid2dbase_h__ #include "gridbase.h" class Grid2dBase : public GridBase { public: Grid2dBase(Widget*); Grid2dBase(Widget*, const char*); virtual ~Grid2dBase(); int gLine(int n, float* x, float* y); int gQch(float*, float*); int gMark(int, const float*, const float*, int) {return 1;} int gText(const char* txt, float x, float y, const char* just, float upx, float upy); int gTxExt(const char*, float, float, const char*, float, float, float*, float*); int gScales(float *alpha, float *beta); }; #endif saods9/tksao1.0/util/grid3dbase.C000644 000765 000000 00000011033 12544546070 017021 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid3dbase.h" #include "attribute.h" #include "widget.h" extern "C" { #include "ast.h" #include "grf.h" } Grid3dBase* astGrid3dPtr = NULL; Grid3dBase::Grid3dBase(Widget* p) : GridBase(p) {} Grid3dBase::Grid3dBase(Widget* p, const char* o) : GridBase(p,o) {} Grid3dBase::~Grid3dBase() {} int Grid3dBase::gLine(int n, float* x, float* y, float* z) { float xx[n]; float yy[n]; for (int ii=0; iitkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (font) { Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); *ch = (float)metrics.linespace; return 1; } else { *ch = 0; return 0; } } int Grid3dBase::gText(const char* txt, float* ref, const char* just, float* up, float* norm) { if (!(txt && txt[0] && just && just[0] && just[1])) return 0; Vector3d vv = Vector3d(ref[0],ref[1],ref[2])*mx_; switch (renderMode_) { case X11: return x11Text(txt,vv[0],vv[1],just,Vector(0,1)); case PS: return psText(txt,vv[0],vv[1],just,Vector(0,1)); case MACOSX: #ifdef MAC_OSX_TK return macosxText(txt,vv[0],vv[1],just,Vector(0,1)); #endif break; case GWIN32: #ifdef __WIN32 return win32Text(txt,vv[0],vv[1],just,Vector(0,1)); #endif break; } return 0; } int Grid3dBase::gTxExt(const char* txt, float* ref, const char* just, float* up, float* norm, float* xb, float* yb, float* zb, float* bl) { if (!(txt && txt[0] && just)) { xb[0] = xb[1] = xb[2] = xb[3] = 0; yb[0] = yb[1] = yb[2] = yb[3] = 0; zb[0] = zb[1] = zb[2] = zb[3] = 0; return 0; } /* cerr << txt << Vector3d(ref[0],ref[1],ref[2]) << ' ' << just[0] << just[1] << Vector3d(up[0],up[1],up[2]) << Vector3d(norm[0],norm[1],norm[2]) << endl; */ Tk_Font font =NULL; switch (renderMode_) { case X11: font = text_->tkfont(); break; case PS: font = text_->psfont(); break; case MACOSX: #ifdef MAC_OSX_TK font = text_->tkfont(); #endif break; case GWIN32: #ifdef __WIN32 font = text_->tkfont(); #endif break; } if (!font) return 0; Vector3d vv = Vector3d(ref[0],ref[1],ref[2])*mx_; // cerr << " vv: " << vv << endl; Vector3d cc = vv * calcTextPos(vv, txt, just, font); // cerr << " cc: " << cc << endl; Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); int width = Tk_TextWidth(font, txt, strlen(txt)); BBox3d nn(Vector3d(0,-metrics.descent,0), Vector3d(width,metrics.ascent,0)); // cerr << " nn: " << nn << endl; Matrix3d mm = Translate3d(-nn.center()) * rx_ * Translate3d(nn.center()); // cerr << mm << endl; BBox3d bb = nn * mm * Translate3d(cc); // cerr << " bb: " << bb << endl; Vector3d ll = cc * mm; xb[0] = bb.ll[0]; yb[0] = bb.ll[1]; zb[0] = bb.ll[2]; xb[1] = bb.ur[0]; yb[1] = bb.ll[1]; zb[1] = bb.ll[2]; xb[2] = bb.ur[0]; yb[2] = bb.ur[1]; zb[2] = bb.ll[2]; xb[3] = bb.ll[0]; yb[3] = bb.ur[1]; zb[3] = bb.ll[2]; bl[0] = ll[0]; bl[1] = ll[1]; bl[2] = ll[2]; return 1; } Matrix3d Grid3dBase::calcTextPos(const Vector3d& vv, const char* txt, const char* just, Tk_Font font) { Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); int width = Tk_TextWidth(font, txt, strlen(txt)); Matrix3d m1,m2; switch (just[0]) { case 'T': break; case 'C': m1 = Translate3d(0,metrics.linespace/2,0); break; case 'B': m1 = Translate3d(0,metrics.ascent,0); break; case 'M': m1 = Translate3d(0,metrics.linespace,0); break; } switch (just[1]) { case 'L': break; case 'C': m2 = Translate3d(-width/2.,0,0); break; case 'R': m2 = Translate3d(-width,0,0); break; } return Translate3d(-vv) * m1 * m2 * Translate3d(vv); } saods9/tksao1.0/util/grid3dbase.h000644 000765 000000 00000001644 12464214757 017102 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid3dbase_h__ #define __grid3dbase_h__ #include #include "gridbase.h" #include "vector3d.h" class Grid3dBase : public GridBase { protected: Matrix3d mx_; Matrix3d rx_; Matrix3d calcTextPos(const Vector3d&, const char*, const char*, Tk_Font); public: Grid3dBase(Widget*); Grid3dBase(Widget*, const char*); virtual ~Grid3dBase(); int gLine(int n, float* x, float* y, float* z); int gQch(float* ch); int gMark(int n, float* x, float* y, float* z, int type, float* norm) {return 1;} int gText(const char* txt, float* ref, const char* just, float* up, float* norm); int gTxExt(const char* txt, float* ref, const char* just, float* up, float* norm, float* xb, float* yb, float* zb, float* bl); }; #endif saods9/tksao1.0/util/gridbase.C000644 000765 000000 00000023203 12545015743 016573 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "gridbase.h" #include "attribute.h" #include "widget.h" #include "util.h" EXTERN void TkDrawAngledChars(Display *display, Drawable drawable, GC gc, Tk_Font tkfont, const char *source, int numBytes, double x, double y, double angle); extern "C" { #include "ast.h" #include "grf.h" } GridBase::GridBase(Widget* p) : parent_(p) { option_ = NULL; renderMode_ = X11; line_ = new Attribute(parent_); text_ = new Attribute(parent_); gc_ = NULL; pixmap_ = 0; mode_ = Widget::RGB; } GridBase::GridBase(Widget* p, const char* o) : parent_(p) { option_ = dupstr(o); renderMode_ = X11; line_ = new Attribute(parent_); text_ = new Attribute(parent_); gc_ = NULL; pixmap_ = 0; mode_ = Widget::RGB; } GridBase::~GridBase() { if (option_) delete [] option_; if (line_) delete line_; if (text_) delete text_; } int GridBase::gAttr(int which, double value, double* old, int prim) { Attribute* attr; switch (prim) { case GRF__TEXT: attr = text_; switch (which) { case GRF__STYLE: break; case GRF__WIDTH: break; case GRF__SIZE: if (old) *old = attr->size(); if (value != AST__BAD) attr->setSize(value); break; case GRF__FONT: if (old) *old = attr->font(); if (value != AST__BAD) attr->setFont(value); break; case GRF__COLOUR: if (old) *old = attr->colour(); if (value != AST__BAD) attr->setColour(value); break; } break; case GRF__LINE: attr = line_; switch (which) { case GRF__STYLE: if (old) *old = attr->style(); if (value != AST__BAD) attr->setStyle(value); break; case GRF__WIDTH: if (old) *old = attr->width(); if (value != AST__BAD) attr->setWidth(value); break; case GRF__SIZE: break; case GRF__FONT: break; case GRF__COLOUR: if (old) *old = attr->colour(); if (value != AST__BAD) attr->setColour(value); break; } break; } return 1; } int GridBase::gCap(int cap, int value) { switch (cap) { case GRF__SCALES: return 0; case GRF__MJUST: return 1; case GRF__ESC: return 0; } return 0; } // X11 Render functions int GridBase::x11Line(int n, float* x, float* y) { if (n<2 || !x || !y) return 1; XSetForeground(parent_->getDisplay(), gc_, line_->color()); int w = (int)line_->width(); if (w<1) w = 1; switch (line_->style()) { case Attribute::SOLID: XSetLineAttributes(parent_->getDisplay(), gc_, w, LineSolid, CapButt, JoinMiter); break; case Attribute::DASH: XSetLineAttributes(parent_->getDisplay(), gc_, w, LineOnOffDash, CapButt, JoinMiter); char dlist[] = {8,3}; XSetDashes(parent_->getDisplay(), gc_, 0, dlist, 2); break; } for (int i=0; igetDisplay(), pixmap_, gc_, (int)s[0],(int)s[1],(int)e[0],(int)e[1]); } return 1; } int GridBase::x11Text(const char* txt, float x, float y, const char* just, Vector up) { XSetFont(parent_->getDisplay(), gc_, Tk_FontId(text_->tkfont())); XSetForeground(parent_->getDisplay(), gc_, text_->color()); Vector vv = Vector(x,y); double angle = calcTextAngle(just, up); Vector cc = vv * calcTextPos(vv, angle, txt, just, up, text_->tkfont()); TkDrawAngledChars(parent_->getDisplay(), pixmap_, gc_, text_->tkfont(), txt, strlen(txt), cc[0], cc[1], radToDeg(angle)); return 1; } // PS Render functions int GridBase::psLine(int n, float* x, float* y) { if (n<2 || !x || !y) return 1; psColor(line_); { ostringstream str; str << line_->width() << " setlinewidth" << endl << ends; Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); } { ostringstream str; switch (line_->style()) { case Attribute::SOLID: str << "[] 0 setdash" << endl << ends; break; case Attribute::DASH: str << "[8 3] 0 setdash" << endl << ends; break; } Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); } for (int i=0; igetCanvas()) << " moveto" << endl << ends; } else str << v.TkCanvasPs(parent_->getCanvas()) << " lineto" << endl << ends; Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); } ostringstream str; str << "stroke" << endl << ends; Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); return 1; } int GridBase::psText(const char* txt, float x, float y, const char* just, Vector up) { Tcl_DString psdstr; Tcl_DStringInit(&psdstr); Vector vv = Vector(x,y) * matrix_; double angle = calcTextAngle(just, up); Vector cc = vv * calcTextPos(vv, angle, txt, just, up, text_->psfont()); ostringstream str; const char* ff = Tk_NameOfFont(text_->psfont()); str << '/' << psFontName(ff) << " findfont " << int(psFontSize(ff)*parent_->getDisplayRatio()) << " scalefont setfont" << endl; psColor(text_); str << "gsave " << cc.TkCanvasPs(parent_->getCanvas()) << " moveto" << endl << radToDeg(angle) << " rotate " << '(' << psQuote(txt) << ')' << " show" << " grestore" << endl << ends; Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); return 1; } void GridBase::psColor(Attribute* attr) { ostringstream str; switch ((Widget::PSColorSpace)mode_) { case Widget::BW: case Widget::GRAY: psColorGray(parent_->getXColor(attr->colorName()), str); str << " setgray"; break; case Widget::RGB: psColorRGB(parent_->getXColor(attr->colorName()), str); str << " setrgbcolor"; break; case Widget::CMYK: psColorCMYK(parent_->getXColor(attr->colorName()), str); str << " setcmykcolor"; break; } str << endl << ends; Tcl_AppendResult(parent_->getInterp(), str.str().c_str(), NULL); } #ifdef MAC_OSX_TK int GridBase::macosxLine(int n, float* x, float* y) { if (n<2 || !x || !y) return 1; macosxColor(parent_->getXColor(line_->colorName())); macosxWidth(line_->width()); switch (line_->style()) { case Attribute::SOLID: macosxDash(NULL,0); break; case Attribute::DASH: float dlist[] = {8,3}; macosxDash(dlist,2); break; } Vector* v = new Vector[n]; for (int i=0; itkfont(), &psdstr); macosxFont(Tcl_DStringValue(&psdstr),psSize); Tcl_DStringFree(&psdstr); Vector vv = Vector(x,y) * matrix_; double angle = calcTextAngle(just, up); Vector cc = vv * calcTextPos(vv, angle, txt, just, up, text_->tkfont()); macosxColor(parent_->getXColor(text_->colorName())); macosxDrawText(cc, angle, txt); return 1; } #endif #ifdef __WIN32 int GridBase::win32Line(int n, float* x, float* y) { if (n<2 || !x || !y) return 1; win32Color(parent_->getXColor(line_->colorName())); win32Width(line_->width()); switch (line_->style()) { case Attribute::SOLID: win32Dash(NULL,0); break; case Attribute::DASH: float dlist[] = {8,3}; win32Dash(dlist,2); break; } Vector v[n]; for (int i=0; itkfont()); win32Color(parent_->getXColor(text_->colorName())); Vector vv = Vector(x,y) * matrix_; double angle = calcTextAngle(just, up);; Vector cc = vv * calcTextPos(vv, angle, txt, just, up, text_->tkfont()); win32DrawText(cc, angle, txt); return 1; } #endif // Support double GridBase::calcTextAngle(const char* just, Vector up) { double a = up.angle(); // our angle is 90 off from ast's, and the other direction double rr = -(a - M_PI_2); // special case for text rotated exactly 90 if (up[0]==-1 && up[1]==0) rr += M_PI; // normalize if (rr>0) while (rr>M_TWOPI) rr -= M_TWOPI; else while (rr<0) rr += M_TWOPI; return rr; } Matrix GridBase::calcTextPos(const Vector& vv, double angle, const char* txt, const char* just, Vector up, Tk_Font font) { Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); int width = Tk_TextWidth(font, txt, strlen(txt)); Matrix m1,m2; switch (just[0]) { case 'T': break; case 'C': m1 = Translate(0,metrics.linespace/2); break; case 'B': m1 = Translate(0,metrics.ascent); break; case 'M': m1 = Translate(0,metrics.linespace); break; } switch (just[1]) { case 'L': break; case 'C': m2 = Translate(-width/2.,0); break; case 'R': m2 = Translate(-width,0); break; } Matrix rr = Translate(-vv) * Rotate(-angle) * m1 * m2 * Rotate(angle) * Translate(vv); // special case for text rotated exactly 90 Matrix mm; if (up[0] == -1 && up[1] == 0) { Vector cc = vv*rr; mm = Translate(-cc) * Rotate(-angle) * Translate(-width/2.,metrics.linespace/2.) * FlipY() * Translate(width/2.,-metrics.linespace/2.) * Rotate(angle) * Translate(cc); } return rr*mm; } saods9/tksao1.0/util/gridbase.h000644 000765 000000 00000002647 12544546070 016652 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __gridbase_h__ #define __gridbase_h__ #include #include "vector.h" class Widget; class Attribute; class GridBase { public: enum RenderMode {X11, PS, MACOSX, GWIN32}; protected: Widget* parent_; char* option_; RenderMode renderMode_; Attribute* line_; Attribute* text_; GC gc_; Pixmap pixmap_; Matrix matrix_; int mode_; protected: int x11Line(int n, float* x, float* y); int x11Text(const char*, float, float, const char*, Vector); int psLine(int n, float* x, float* y); int psText(const char*, float, float, const char*, Vector); void psColor(Attribute*); #ifdef MAC_OSX_TK int macosxLine(int n, float* x, float* y); int macosxText(const char*, float, float, const char*, Vector); #endif #ifdef __WIN32 int win32Line(int n, float* x, float* y); int win32Text(const char*, float, float, const char*, Vector); #endif double calcTextAngle(const char*, Vector); Matrix calcTextPos(const Vector&, double, const char*, const char*, Vector, Tk_Font); public: GridBase(Widget*); GridBase(Widget*, const char*); virtual ~GridBase(); int gAttr(int attr, double value, double* old, int prim); int gCap(int, int); int gFlush() {return 1;} const char* option() {return option_;} }; #endif saods9/tksao1.0/util/ps.C000644 000765 000000 00000015037 12464214757 015451 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "ps.h" #include "util.h" Filter::Filter() { ptr = buf; } void Filter::flush(ostream& str) { cflush(); eflush(str); } // Compress void NoCompress::in(unsigned char c) { *ptr++ = c; } // RLE RLE::RLE() { state = 0; num = 0; } void RLE::in(unsigned char c) { current = c; switch (state) { case 0: // start state if (num == 0) // not enough info yet rle[num++] = current; else { if (current != rle[num-1]) { // looks like non repeating rle[num++] = current; state = 1; } else { // looks like repeating num++; state = 2; } } break; case 1: // non repeat state if (current != rle[num-1]) { rle[num++] = current; if (num >= RLESIZE) { // time to dump the rlefer dumpNonRepeat(); // dump the buffer num = 0; // and reset counter state = 0; } } else { num--; // decr dumpNonRepeat(); // dump the buffer state = 2; // repeat state rle[0] = current; // save repeat char num = 2; // we aready have two now } break; case 2: // repeat state if (current == rle[0]) { if (++num >= RLESIZE) { dumpRepeat(); // dump the repeat count state = 0; num = 0; } } else { dumpRepeat(); // dump the repeat count state = 1; // back to non repeat state rle[0] = current; // save first char num = 1; // we have one now } break; } } void RLE::dumpNonRepeat() { if (num) { *ptr++ = (unsigned char)(num-1); for (int i=0; inext_in = NULL; stream_->avail_in = 0; stream_->next_out = NULL; stream_->avail_out = 0; stream_->zalloc = NULL; stream_->zfree = NULL; stream_->opaque = NULL; if (deflateInit(stream_, Z_DEFAULT_COMPRESSION) != Z_OK) { if (DebugGZ) cerr << "deflateInit error" << endl; return; } stream_->next_out = gzip; stream_->avail_out = GZIPSIZE; } GZIP::~GZIP() { if (deflateEnd(stream_) != Z_OK) if (DebugGZ) cerr << "deflateEnd error" << endl; if (stream_) delete stream_; } void GZIP::in(unsigned char c) { stream_->next_in = &c; stream_->avail_in = 1; while (stream_->avail_in > 0 && deflategz(Z_NO_FLUSH) == Z_OK); // update crc crc = crc32(crc, (const Bytef *)&c, 1); } void GZIP::cflush() { // flush any pending output while (deflategz(Z_FINISH) == Z_OK); // output crc/length putlong(crc); putlong(stream_->total_in); } int GZIP::deflategz(int flush) { int result = deflate(stream_, flush); switch (result) { case Z_OK: if (DebugGZ) cerr << "deflate OK: avail_in " << stream_->avail_in << " avail_out " << stream_->avail_out << endl; break; case Z_STREAM_END: if (DebugGZ) cerr << "deflate STRM_END: avail_in " << stream_->avail_in << " avail_out " << stream_->avail_out << endl; break; default: if (DebugGZ) cerr << "deflate Error " << result << endl; return result; } if (stream_->avail_out == 0 || result != Z_OK) { int s = GZIPSIZE - stream_->avail_out; unsigned char* d = gzip; if (s>0) { if (ptr+s > buf+BUFSIZE) { cerr << "deflate buffer overflow " << stream_->avail_out << ' ' << result << endl; return result; } memcpy(ptr,d,s); ptr += s; if (DebugGZ) cerr << "deflate send " << s << ' ' << result << endl; } stream_->next_out = gzip; stream_->avail_out = GZIPSIZE; } return result; } void GZIP::putlong(unsigned long l) { // dump in LSB order for (int n = 0; n < 4; n++) { unsigned char foo = (int)(l & 0xff); memcpy(ptr,&foo,1); ptr++; l >>= 8; } } // Encode Encode::Encode(int l) { level = l; lineCount = 0; } // AsciiHex AsciiHex::AsciiHex(int l) : Encode(l) {} void AsciiHex::out(ostream& str) { unsigned char* p = buf; while (p < ptr) { unsigned short c = *p++; str << hex << setfill('0') << setw(2) << c; lineCount += 2; if (lineCount >= LINELIMIT) { str << endl; lineCount = 0; } } ptr = buf; // reset buffer } void AsciiHex::eflush(ostream& str) { out(str); switch (level) { case 1: str << endl << ends; break; case 2: case 3: str << endl << '>' << endl << ends; break; } } // Ascii85 Ascii85::Ascii85(int l) : Encode(l) { byteswap = (*(short *)"\001\000" & 0x0001); buf85.c = 0; index = 0; } int32_t Ascii85::swap(uint32_t* p) { int32_t r; swap4((char*)p, (char*)&r); return r; } void Ascii85::out(ostream& str) { unsigned char* p = buf; while (p < ptr) { buf85.b[index++] = *p++; if (index==4) { dump(str); } } ptr = buf; // reset buffer } void Ascii85::dump(ostream& str) { // all zeros? if (buf85.c == 0) { str << 'z'; if (++lineCount >= LINELIMIT) { str << endl; lineCount = 0; } } else { uint32_t b; if (!byteswap) b = buf85.c; else b = swap(&buf85.c); for (int ii=4; ii>=0 ; ii--) { uint32_t base = 1; for (int jj=0; jj= LINELIMIT) { str << endl; lineCount = 0; } } } index = 0; buf85.c = 0; } void Ascii85::eflush(ostream& str) { // dump the remainder out(str); // we can't have any z's here // also, only write index+1 chars if (index) { uint32_t b; if (!byteswap) b = buf85.c; else b = swap(&buf85.c); for (int ii=4; ii>=(4-index); ii--) { uint32_t base = 1; for (int jj=0; jj= LINELIMIT) { str << endl; lineCount = 0; } } } index = 0; buf85.c = 0; switch (level) { case 1: str << endl << ends; break; case 2: case 3: str << endl << "~>" << endl << ends; break; } } saods9/tksao1.0/util/ps.h000644 000765 000000 00000006107 12464214757 015514 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __ps_h__ #define __ps_h__ #include #include #include #include using namespace std; #include "zlib.h" extern int DebugGZ; // we need this large for gzip #define GZIPSIZE 65536 #define BUFSIZE GZIPSIZE*2 #define RLESIZE 128 #define LINELIMIT 80 // Filter Base Class class Filter { protected: unsigned char buf[BUFSIZE]; unsigned char* ptr; virtual void cflush() =0; virtual void eflush(ostream&) =0; public: Filter(); virtual void in(unsigned char) =0; virtual void out(ostream&) =0; void flush(ostream&); friend Filter& operator<<(Filter& f, unsigned char c) {f.in(c); return f;} friend ostream& operator<<(ostream& s, Filter& f) {f.out(s); return s;} }; // Compress Base Class class Compress : public virtual Filter { public: virtual void in(unsigned char) =0; virtual void cflush() =0; }; class NoCompress : public virtual Filter, public Compress { public: void in(unsigned char); void cflush() {} }; // RLE class RLE : public virtual Filter, public Compress { private: int state; unsigned char current; unsigned char rle[RLESIZE]; int num; void dumpNonRepeat(); void dumpRepeat(); public: RLE(); void in(unsigned char); void cflush(); }; // GZIP class GZIP : public virtual Filter, public Compress { private: z_stream* stream_; unsigned char gzip[GZIPSIZE]; unsigned long crc; int deflategz(int); void putlong(unsigned long); public: GZIP(); ~GZIP(); void in(unsigned char); void cflush(); }; // Encode Base Class class Encode : public virtual Filter { protected: int level; int lineCount; public: Encode(int); virtual void out(ostream&) =0; virtual void eflush(ostream&) =0; }; // AsciiHex class AsciiHex : public virtual Filter, public Encode { public: AsciiHex(int); void out(ostream&); void eflush(ostream&); }; // Ascii85 class Ascii85 : public virtual Filter, public Encode { private: int index; int byteswap; union { unsigned char b[4]; uint32_t c; } buf85; void dump(ostream&); int32_t swap(uint32_t* ptr); public: Ascii85(int); void out(ostream&); void eflush(ostream&); }; // PS Filters class NoCompressAsciiHex : public virtual Filter, public NoCompress, public AsciiHex { public: NoCompressAsciiHex(int l) : AsciiHex(l) {}; }; class NoCompressAscii85 : public virtual Filter, public NoCompress, public Ascii85 { public: NoCompressAscii85(int l) : Ascii85(l) {}; }; class RLEAsciiHex : public virtual Filter, public RLE, public AsciiHex { public: RLEAsciiHex(int l) : AsciiHex(l) {}; }; class RLEAscii85 : public virtual Filter, public RLE, public Ascii85 { public: RLEAscii85(int l) : Ascii85(l) {}; }; class GZIPAsciiHex : public virtual Filter, public GZIP, public AsciiHex { public: GZIPAsciiHex(int l) : AsciiHex(l) {}; }; class GZIPAscii85 : public virtual Filter, public GZIP, public Ascii85 { public: GZIPAscii85(int l) : Ascii85(l) {}; }; #endif saods9/tksao1.0/util/smooth.C000644 000765 000000 00000002307 12605531361 016322 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include #include "smooth.h" void boxcar(double* kernel, int r) { int rr = 2*r+1; int ksz = rr*rr; double* ptr = kernel; for (int jj=0; jj #include "util.h" // Error in mapping int maperr= 0; static char tobuf[1024]; int sexSign; // used by parser and lex to indicate sign of dms or hms void swap2(char* src, char* dest) { *(dest ) = *(src+1); *(dest+1) = *(src ); } void swap4(char* src, char* dest) { *(dest ) = *(src+3); *(dest+1) = *(src+2); *(dest+2) = *(src+1); *(dest+3) = *(src ); } void swap8(char* src, char* dest) { *(dest ) = *(src+7); *(dest+1) = *(src+6); *(dest+2) = *(src+5); *(dest+3) = *(src+4); *(dest+4) = *(src+3); *(dest+5) = *(src+2); *(dest+6) = *(src+1); *(dest+7) = *(src ); } int lsb() { return (*(short *)"\001\000" & 0x0001); } char* dupstr(const char* str) { char* copy; if (str) { copy=new char[strlen(str)+1]; strcpy(copy,str); } else copy=NULL; return copy; } char* trim(const char* str) { char* rr = dupstr(str); char* ptr = rr; while (ptr && *ptr) ptr++; ptr--; while (ptr && (*ptr == ' ')) ptr--; ptr++; *ptr = '\0'; return rr; } char* toLower(const char* str) { char* rr = dupstr(str); char* ptr = rr; while (*ptr) { *ptr = (char)(tolower(((int)(*ptr)))); ptr++; } return rr; } char* toUpper(const char* str) { char* rr = dupstr(str); char* ptr = rr; while (*ptr) { *ptr = (char)(toupper(((int)(*ptr)))); ptr++; } return rr; } char* toConstLower(const char* str) { strncpy(tobuf,str,1024); char* ptr = tobuf; while (*ptr) { *ptr = (char)(tolower(((int)(*ptr)))); ptr++; } return tobuf; } char* toConstUpper(const char* str) { strncpy(tobuf,str,1024); char* ptr = tobuf; while (*ptr) { *ptr = (char)(toupper(((int)(*ptr)))); ptr++; } return tobuf; } double zeroTWOPI(double aa) { double rr = aa; if (rr>0) while (rr>=M_TWOPI) rr -= M_TWOPI; else while (rr<0) rr += M_TWOPI; return rr; } double zero360(double aa) { double rr = aa; if (rr>=0) while (rr>360) rr -= 360; else while (rr<0) rr += 360; return rr; } double m180To180(double aa) { // incoming 0-360 double rr = aa; if (rr>180) rr -= 360; return rr; } double degToRad(double dd) { double rr = M_PI*dd/180.; return zeroTWOPI(rr); } double radToDeg(double rr) { double dd = 180.*rr/M_PI; return zero360(dd); } double dmsToDegree(int sign, int degree, int min, double sec) { // sign is needed because of -00 vs +00 return double(sign) * (abs(degree) + (min/60.) + (sec/60./60.)); } int parseSection(char* lbuf, Vector* v1, Vector* v2) { double x1, y1, x2, y2; char d1,d2,d3,d4,d5; // dummy char string x(lbuf); istringstream str(x); str >> d1 >> x1 >> d2 >> x2 >> d3 >> y1 >> d4 >> y2 >> d5; // verify input if (!(d1=='[' && d2==':' && d3==',' && d4==':' && d5==']')) return 0; // it looks ok *v1 = Vector(x1,y1); *v2 = Vector(x2,y2); return 1; } double parseSEXStr(const char* d) { char* dms = dupstr(d); // its going to get clobbered char* ptr = dms; int sign = 1; int degree = atoi(strtok(ptr,":")); int minute = atoi(strtok(NULL,":")); float sec = atof(strtok(NULL,":")); // assumes the minus sign is the first char if (degree != 0) sign = degree>0 ? 1 : -1; else sign = d[0] == '-' ? -1 : 1; delete [] dms; return dmsToDegree(sign,abs(degree),minute,sec); } double parseHMSStr(const char* str) { char* hms = dupstr(str); // its going to get clobbered char* ptr = hms; int sign = 1; int hour = atoi(strtok(ptr,"h")); int minute = atoi(strtok(NULL,"m")); float second = atof(strtok(NULL,"s")); // assumes the minus sign is the first char if (hour != 0) sign = hour>0 ? 1 : -1; else sign = str[0] == '-' ? -1 : 1; delete [] hms; return dmsToDegree(sign,abs(hour),minute,second)/24.*360.; } double parseDMSStr(const char* str) { char* dms = dupstr(str); // its going to get clobbered char* ptr = dms; int sign = 1; int degree = atoi(strtok(ptr,"d")); int minute = atoi(strtok(NULL,"m")); float sec = atof(strtok(NULL,"s")); // assumes the minus sign is the first char if (degree != 0) sign = degree>0 ? 1 : -1; else sign = str[0] == '-' ? -1 : 1; delete [] dms; return dmsToDegree(sign,abs(degree),minute,sec); } double RGB2Gray(double red, double green, double blue) { return 0.30*red + 0.59*green + 0.11*blue; } unsigned char RGB2Gray(unsigned char red, unsigned char green, unsigned char blue) { // we have a round off problem here, add FLT_EPSILON to kick it over return (unsigned char)(0.30*red + 0.59*green + 0.11*blue + FLT_EPSILON); } void RGB2CMYK(unsigned char red, unsigned char green, unsigned char blue, unsigned char* cyan, unsigned char* magenta, unsigned char* yellow, unsigned char* black) { // convert To CMY *cyan = UCHAR_MAX-red; *magenta = UCHAR_MAX-green; *yellow = UCHAR_MAX-blue; *black =0; // determine black *black = UCHAR_MAX; if (*cyan < *black) *black = *cyan; if (*magenta < *black) *black = *magenta; if (*yellow < *black) *black = *yellow; // substract out black *cyan -= *black; *magenta -= *black; *yellow -= *black; } void RGB2CMYK(unsigned short red, unsigned short green, unsigned short blue, unsigned short* cyan, unsigned short* magenta, unsigned short* yellow, unsigned short* black) { // convert To CMY *cyan = USHRT_MAX-red; *magenta = USHRT_MAX-green; *yellow = USHRT_MAX-blue; *black =0; // determine black *black = USHRT_MAX; if (*cyan < *black) *black = *cyan; if (*magenta < *black) *black = *magenta; if (*yellow < *black) *black = *yellow; // substract out black *cyan -= *black; *magenta -= *black; *yellow -= *black; } ostream& psColorGray(XColor* clr, ostream& str) { if (clr) { float red = clr->red/float(USHRT_MAX); float green = clr->green/float(USHRT_MAX); float blue = clr->blue/float(USHRT_MAX); str << dec << RGB2Gray(red,green,blue); } return str; } ostream& psColorRGB(XColor* clr, ostream& str) { if (clr) { float red = clr->red/float(USHRT_MAX); float green = clr->green/float(USHRT_MAX); float blue = clr->blue/float(USHRT_MAX); str << dec << red << ' ' << green << ' ' << blue; } return str; } ostream& psColorCMYK(XColor* clr, ostream& str) { if (clr) { unsigned short cyan; unsigned short magenta; unsigned short yellow; unsigned short black; RGB2CMYK(clr->red, clr->green, clr->blue, &cyan, &magenta, &yellow, &black); str << dec << cyan/float(USHRT_MAX) << ' ' << magenta/float(USHRT_MAX) << ' ' << yellow/float(USHRT_MAX) << ' ' << black/float(USHRT_MAX); } return str; } char* psStr = NULL; // psQuote returned string char* psQuote(const char* str) { // we must must quote '(', ')', and '\' if (psStr) delete [] psStr; psStr = new char[strlen(str)*2+1]; // worst case size char* out = psStr; const char* in = str; while (in && *in) { if (*in == '(' || *in == ')' || *in == '\\') *out++ = '\\'; *out++ = *in++; } *out++ = '\0'; // terminating char return psStr; } const char* psFontName(const char* font) { char* str = (char*)font; char* ff = str; while (*str && *str++ != ' '); // char* zz = str; while (*str && *str++ != ' '); char* ww = str; while (*str && *str++ != ' '); char* ss = str; if (ff && ww && ss) return psFontName(ff,ww,ss); else return psFonts[0]; } int psFontSize(const char* font) { char* str = (char*)font; while (*str && *str++ != ' '); return atoi(str); } const char* psFontName(const char* font, const char* weight, const char* slant) { int ptr = 0; if (!strncmp(font,"helvetica",4)) ptr = 0; else if (!strncmp(font,"times",4)) ptr = 4; else if (!strncmp(font,"courier",4)) ptr = 8; if (!strncmp(weight,"normal",4)) ; else if (!strncmp(weight,"bold",4)) ptr +=2; if (!strncmp(slant,"roman",4)) ; else if (!strncmp(slant,"italic",4)) ptr++; return psFonts[ptr]; } int fCompare(const void* a, const void* b) { float* aa = (float*)a; float* bb = (float*)b; if (*aa < *bb) return -1; if (*aa > *bb) return 1; return 0; } int dCompare(const void* a, const void* b) { double* aa = (double*)a; double* bb = (double*)b; if (*aa < *bb) return -1; if (*aa > *bb) return 1; return 0; } Vector mapLen(const Vector& v, const Matrix& mx) { // remove translation Vector t = Vector() * mx; Matrix sr = mx * Translate(-t); // remove rotation Vector r = Vector(1,0) * sr; Matrix s = sr * Rotate(r.angle()); // all that is left is Scaling return (v*s).abs(); } #if defined (MAC_OSX_TK) || (_WIN32) int XSetClipRectangles(Display *d, GC gc, int clip_x_origin, int clip_y_origin, XRectangle* rectangles, int n, int ordering) { TkRegion clipRgn = TkCreateRegion(); while (n--) { XRectangle rect = *rectangles; rect.x += clip_x_origin; rect.y += clip_y_origin; TkUnionRectWithRegion(&rect, clipRgn, clipRgn); rectangles++; } TkSetRegion(d, gc, clipRgn); TkDestroyRegion(clipRgn); return 1; } #endif saods9/tksao1.0/util/util.h000644 000765 000000 00000006263 12573624367 016055 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __util_h__ #define __util_h__ #include #include #include #include #include #include #include #include using namespace std; #include #include #include "fuzzy.h" #include "vector.h" #ifndef PATH_MAX #define PATH_MAX 1024 #endif #ifdef _WIN32 #include #endif #ifdef MAC_OSX_TK #include void XXWarpPointer(Display* display, Window src_w, Window dest_w, int src_x, int src_y, unsigned int src_width, unsigned int src_height, int dest_x, int dest_y); #endif #if defined (MAC_OSX_TK) || (_WIN32) int XSetClipRectangles(Display *d, GC gc, int clip_x_origin, int clip_y_origin, XRectangle* rectangles, int n, int ordering); #endif #define STRCMP(which,str,cnt) (!strncmp(toConstLower(which), str, cnt) && strlen(which)==cnt) static const char psFonts[12][32] = { {"Helvetica"}, {"Helvetica-Oblique"}, {"Helvetica-Bold"}, {"Helvetica-BoldOblique"}, {"Times-Roman"}, {"Times-Italic"}, {"Times-Bold"}, {"Times-BoldItalic"}, {"Courier"}, {"Courier-Oblique"}, {"Courier-Bold"}, {"Courier-BoldOblique"} }; #ifndef __CYGWIN__ static const double M_TWOPI = 2*M_PI; #endif static const double M_THREEPI = 3*M_PI; static const double M_FOURPI = 4*M_PI; extern int maperr; extern int lsb(); extern void swap2(char* src, char* dest); extern void swap4(char* src, char* dest); extern void swap8(char* src, char* dest); // defined in ds9.C extern void internalError(const char*); extern char* dupstr(const char*); extern char* trim(const char*); extern char* toLower(const char*); extern char* toUpper(const char*); extern char* toConstLower(const char*); extern char* toConstUpper(const char*); extern double zeroTWOPI(double); extern double zero360(double); extern double m180To180(double); extern double degToRad(double); extern double radToDeg(double); extern int parseSection(char*, Vector*, Vector*); extern double dmsToDegree(int, int, int, double); extern double parseSEXStr(const char*); extern double parseHMSStr(const char*); extern double parseDMSStr(const char*); extern double RGB2Gray(double, double, double); extern unsigned char RGB2Gray(unsigned char, unsigned char, unsigned char); extern void RGB2CMYK(unsigned char, unsigned char, unsigned char, unsigned char*, unsigned char*, unsigned char*, unsigned char*); extern void RGB2CMYK(unsigned short, unsigned short, unsigned short, unsigned short*, unsigned short*, unsigned short*, unsigned short*); extern ostream& psColorGray(XColor*, ostream&); extern ostream& psColorRGB(XColor*, ostream&); extern ostream& psColorCMYK(XColor*, ostream&); extern char* psQuote(const char*); extern const char* psFontName(const char*); extern int psFontSize(const char*); extern const char* psFontName(const char*, const char*, const char*); extern int fCompare(const void*, const void*); extern int dCompare(const void*, const void*); extern Vector mapLen(const Vector& v, const Matrix& mx); #endif saods9/tksao1.0/tclconfig/ChangeLog000644 000765 000000 00000106605 12540607755 017471 0ustar00joyewheel000000 000000 2013-07-04 Jan Nijtmans * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C://AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 * tcl.m4: Added FreeBSD clause. 2001-01-03 * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. saods9/tksao1.0/tclconfig/img.m4000644 000765 000000 00000013153 12553740622 016723 0ustar00joyewheel000000 000000 # # m4 configure macros specific to Img. # AC_DEFUN(IMG_SRCPATH, [ #-------------------------------------------------------------------- # Compute an absolute path to the src directory of module '$1' so # that we are able to find its headers even if they are not installed. #-------------------------------------------------------------------- case [$]$1_SRC_DIR in /*) $1_SRC_PATH=[$]$1_SRC_DIR ;; *) # SRC_DIR relative, splice with BUILD_PATH $1_SRC_PATH="`dirname [$]$1_BUILD_STUB_LIB_PATH`/[$]$1_SRC_DIR" esac $1_BUILD_PATH="`dirname [$]$1_BUILD_STUB_LIB_PATH`" if test "[$]{TEA_PLATFORM}" = "windows" ; then $1_SRC_PATH="`[$]CYGPATH [$]$1_SRC_PATH`" $1_BUILD_PATH="`[$]CYGPATH [$]$1_BUILD_PATH`" fi AC_SUBST($1_SRC_PATH) AC_SUBST($1_BUILD_PATH) ]) # # Add here whatever m4 macros you want to define for your package # AC_DEFUN(TEA_CONFIG_SUBDIR, [ tea_config_dir="$1" tea_config_arguments="$2" subdirs="$subdirs $tea_config_dir" AC_SUBST(subdirs) # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. if test ! -d $srcdir/$tea_config_dir; then continue fi echo configuring in $tea_config_dir case "$srcdir" in .) ;; *) if test -d ./$tea_config_dir || mkdir -p ./$tea_config_dir; then :; else { echo "configure: error: can not create `pwd`/$tea_config_dir" 1>&2; exit 1; } fi ;; esac tea_popdir=`pwd` cd $tea_config_dir # A "../" for each directory in /$tea_config_dir. tea_dots=`echo $tea_config_dir|sed -e 's%^\./%%' -e ['s%[^/]$%&/%'] -e ['s%[^/]*/%../%g']` case "$srcdir" in .) # No --srcdir option. We are building in place. tea_sub_srcdir=$srcdir ;; /*) # Absolute path. tea_sub_srcdir=$srcdir/$tea_config_dir ;; *) # Relative path. tea_sub_srcdir=$tea_dots$srcdir/$tea_config_dir ;; esac # Check for guested configure; otherwise get Cygnus style configure. if test -f $tea_sub_srcdir/configure; then tea_sub_configure=$tea_sub_srcdir/configure elif test -f $tea_sub_srcdir/configure.in; then tea_sub_configure=$tea_configure else echo "configure: warning: no configuration information is in $tea_config_dir" 1>&2 tea_sub_configure= fi # The recursion is here. if test -n "$tea_sub_configure"; then # Force usage of a cache file. if test "X$cache_file" = "X/dev/null" ; then cache_file=config.cache fi # Make the cache file name correct relative to the subdirectory. case "$cache_file" in /*) tea_sub_cache_file=$cache_file ;; *) # Relative path. tea_sub_cache_file="$tea_dots$cache_file" ;; esac echo "running ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments" # The eval makes quoting arguments work. if eval ${CONFIG_SHELL-/bin/sh} $tea_sub_configure $tea_sub_configure_args --cache-file=$tea_sub_cache_file --srcdir=$tea_sub_srcdir $tea_config_arguments then : else { echo "configure: error: $tea_sub_configure failed for $tea_config_dir" 1>&2; exit 1; } fi fi cd $tea_popdir ]) AC_DEFUN(TEA_CONFIG_COLLECT, [ tea_sub_configure_args= tea_prev= for tea_arg in $ac_configure_args; do if test -n "$tea_prev"; then tea_prev= continue fi case "$tea_arg" in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) tea_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) tea_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; *) tea_sub_configure_args="$tea_sub_configure_args $tea_arg" ;; esac done ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Subst the following vars: # #------------------------------------------------------------------------ AC_DEFUN(TEA_EXPORT_CONFIG, [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "[$]{TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) saods9/tksao1.0/tclconfig/install-sh000755 000765 000000 00000033054 12540607755 017720 0ustar00joyewheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: saods9/tksao1.0/tclconfig/README.txt000644 000765 000000 00000001454 12540607755 017411 0ustar00joyewheel000000 000000 These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. saods9/tksao1.0/tclconfig/tcl.m4000644 000765 000000 00000404643 12562732052 016737 0ustar00joyewheel000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir # i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: saods9/tksao1.0/panner/lex.C000644 000765 000000 00000140567 12553253032 016120 0ustar00joyewheel000000 000000 #line 2 "panner/lex.C" #line 4 "panner/lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer pnFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *pnalloc (yy_size_t ); void *pnrealloc (void *,yy_size_t ); void pnfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 38 #define YY_END_OF_BUFFER 39 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[144] = { 0, 0, 0, 39, 37, 36, 38, 37, 37, 32, 32, 37, 37, 37, 37, 37, 37, 37, 37, 37, 15, 37, 37, 37, 37, 37, 37, 37, 37, 30, 36, 0, 32, 34, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 18, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 35, 0, 0, 0, 0, 0, 6, 0, 8, 0, 0, 0, 0, 0, 0, 17, 19, 0, 0, 0, 0, 0, 0, 0, 28, 0, 31, 0, 34, 1, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 21, 22, 23, 0, 0, 27, 0, 2, 3, 0, 5, 7, 0, 0, 12, 0, 0, 20, 0, 0, 29, 0, 9, 0, 0, 14, 25, 0, 4, 0, 13, 26, 11, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 5, 1, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 1, 17, 18, 19, 20, 21, 1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 1, 1, 1, 1, 1, 31, 32, 33, 34, 35, 36, 37, 38, 39, 1, 1, 40, 41, 42, 43, 44, 1, 45, 46, 47, 48, 49, 50, 51, 52, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[54] = { 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[145] = { 0, 0, 0, 300, 320, 297, 320, 49, 51, 54, 57, 56, 50, 59, 53, 65, 62, 63, 58, 58, 60, 68, 75, 72, 70, 91, 91, 102, 107, 104, 296, 112, 115, 118, 135, 122, 0, 111, 118, 121, 125, 135, 134, 131, 125, 135, 146, 144, 132, 135, 320, 148, 320, 143, 140, 144, 135, 320, 144, 162, 154, 155, 155, 168, 166, 187, 191, 197, 0, 162, 179, 197, 185, 182, 320, 185, 320, 195, 198, 196, 200, 207, 200, 320, 320, 205, 192, 208, 209, 214, 200, 203, 320, 201, 320, 220, 229, 320, 222, 227, 242, 237, 240, 238, 320, 237, 243, 239, 237, 234, 320, 320, 320, 235, 244, 320, 246, 320, 320, 239, 320, 320, 239, 249, 320, 250, 248, 320, 256, 249, 320, 247, 320, 247, 276, 320, 320, 276, 320, 284, 320, 320, 320, 320, 295 } ; static yyconst flex_int16_t yy_def[145] = { 0, 143, 1, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 0, 143 } ; static yyconst flex_int16_t yy_nxt[374] = { 0, 4, 5, 6, 7, 8, 9, 10, 4, 11, 12, 13, 14, 15, 16, 17, 18, 4, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 4, 29, 4, 4, 11, 12, 13, 14, 15, 16, 17, 18, 4, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 4, 29, 4, 31, 32, 32, 33, 33, 34, 32, 32, 34, 32, 32, 37, 35, 39, 38, 35, 40, 41, 42, 43, 44, 45, 47, 48, 49, 46, 50, 51, 36, 53, 54, 55, 56, 52, 37, 35, 39, 38, 35, 40, 41, 42, 43, 44, 45, 47, 48, 49, 46, 50, 51, 36, 53, 54, 55, 56, 52, 57, 59, 58, 60, 61, 64, 62, 33, 33, 34, 32, 32, 63, 33, 33, 66, 35, 67, 67, 65, 69, 70, 71, 57, 59, 58, 60, 61, 64, 62, 33, 33, 72, 73, 74, 63, 35, 75, 76, 35, 77, 80, 65, 69, 70, 71, 78, 81, 82, 79, 83, 84, 85, 86, 87, 72, 73, 74, 88, 35, 75, 76, 89, 77, 80, 90, 91, 92, 93, 78, 81, 82, 79, 83, 84, 85, 86, 87, 94, 97, 95, 88, 96, 96, 98, 89, 67, 67, 90, 91, 92, 93, 67, 67, 99, 100, 101, 102, 103, 104, 105, 94, 97, 106, 107, 108, 109, 98, 110, 111, 112, 113, 114, 115, 116, 96, 96, 99, 100, 101, 102, 103, 104, 105, 96, 96, 106, 107, 108, 109, 117, 110, 111, 112, 113, 114, 115, 116, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 117, 133, 134, 135, 136, 137, 138, 139, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 140, 133, 134, 135, 136, 137, 138, 139, 141, 142, 68, 30, 30, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 140, 143, 143, 143, 143, 143, 143, 143, 141, 142, 3, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143 } ; static yyconst flex_int16_t yy_chk[374] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 9, 12, 11, 10, 12, 13, 14, 15, 16, 17, 18, 18, 19, 17, 20, 21, 9, 22, 23, 24, 24, 21, 11, 9, 12, 11, 10, 12, 13, 14, 15, 16, 17, 18, 18, 19, 17, 20, 21, 9, 22, 23, 24, 24, 21, 25, 26, 25, 27, 28, 29, 28, 31, 31, 32, 32, 32, 28, 33, 33, 35, 32, 35, 35, 33, 37, 38, 39, 25, 26, 25, 27, 28, 29, 28, 34, 34, 40, 41, 42, 28, 34, 43, 44, 32, 45, 47, 33, 37, 38, 39, 46, 48, 49, 46, 51, 53, 54, 55, 56, 40, 41, 42, 58, 34, 43, 44, 59, 45, 47, 60, 61, 62, 63, 46, 48, 49, 46, 51, 53, 54, 55, 56, 64, 69, 65, 58, 65, 65, 70, 59, 66, 66, 60, 61, 62, 63, 67, 67, 71, 72, 73, 75, 77, 78, 79, 64, 69, 80, 81, 82, 85, 70, 86, 87, 88, 89, 90, 91, 93, 95, 95, 71, 72, 73, 75, 77, 78, 79, 96, 96, 80, 81, 82, 85, 98, 86, 87, 88, 89, 90, 91, 93, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 113, 114, 116, 119, 122, 98, 123, 125, 126, 128, 129, 131, 133, 99, 100, 101, 102, 103, 105, 106, 107, 108, 109, 113, 114, 116, 119, 122, 134, 123, 125, 126, 128, 129, 131, 133, 137, 139, 144, 30, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 137, 139, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "panner/lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "panner/lex.L" #include #include #include #include "parser.H" extern YYSTYPE* pnlval; /* rules */ #line 550 "panner/lex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 26 "panner/lex.L" #line 653 "panner/lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 143 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 28 "panner/lex.L" {return BBOX_;} YY_BREAK case 2: YY_RULE_SETUP #line 29 "panner/lex.L" {return BEGIN_;} YY_BREAK case 3: YY_RULE_SETUP #line 30 "panner/lex.L" {return CLEAR_;} YY_BREAK case 4: YY_RULE_SETUP #line 31 "panner/lex.L" {return COMPASS_;} YY_BREAK case 5: YY_RULE_SETUP #line 32 "panner/lex.L" {return DEBUG_;} YY_BREAK case 6: YY_RULE_SETUP #line 33 "panner/lex.L" {return END_;} YY_BREAK case 7: YY_RULE_SETUP #line 34 "panner/lex.L" {return FALSE_;} YY_BREAK case 8: YY_RULE_SETUP #line 35 "panner/lex.L" {return GET_;} YY_BREAK case 9: YY_RULE_SETUP #line 36 "panner/lex.L" {return HEIGHT_;} YY_BREAK case 10: YY_RULE_SETUP #line 37 "panner/lex.L" {return HIDE_;} YY_BREAK case 11: YY_RULE_SETUP #line 38 "panner/lex.L" {return HIGHLITE_;} YY_BREAK case 12: YY_RULE_SETUP #line 39 "panner/lex.L" {return IMAGE_;} YY_BREAK case 13: YY_RULE_SETUP #line 40 "panner/lex.L" {return INVALID_;} YY_BREAK case 14: YY_RULE_SETUP #line 41 "panner/lex.L" {return MOTION_;} YY_BREAK case 15: YY_RULE_SETUP #line 42 "panner/lex.L" {return N_;} YY_BREAK case 16: YY_RULE_SETUP #line 43 "panner/lex.L" {return NO_;} YY_BREAK case 17: YY_RULE_SETUP #line 44 "panner/lex.L" {return OFF_;} YY_BREAK case 18: YY_RULE_SETUP #line 45 "panner/lex.L" {return ON_;} YY_BREAK case 19: YY_RULE_SETUP #line 46 "panner/lex.L" {return PAN_;} YY_BREAK case 20: YY_RULE_SETUP #line 47 "panner/lex.L" {return RESET_;} YY_BREAK case 21: YY_RULE_SETUP #line 48 "panner/lex.L" {return SHOW_;} YY_BREAK case 22: YY_RULE_SETUP #line 49 "panner/lex.L" {return SIZE_;} YY_BREAK case 23: YY_RULE_SETUP #line 50 "panner/lex.L" {return TRUE_;} YY_BREAK case 24: YY_RULE_SETUP #line 51 "panner/lex.L" {return TO_;} YY_BREAK case 25: YY_RULE_SETUP #line 52 "panner/lex.L" {return UPDATE_;} YY_BREAK case 26: YY_RULE_SETUP #line 53 "panner/lex.L" {return VERSION_;} YY_BREAK case 27: YY_RULE_SETUP #line 54 "panner/lex.L" {return WARP_;} YY_BREAK case 28: YY_RULE_SETUP #line 55 "panner/lex.L" {return WCS_;} YY_BREAK case 29: YY_RULE_SETUP #line 56 "panner/lex.L" {return WIDTH_;} YY_BREAK case 30: YY_RULE_SETUP #line 57 "panner/lex.L" {return Y_;} YY_BREAK case 31: YY_RULE_SETUP #line 58 "panner/lex.L" {return YES_;} YY_BREAK case 32: YY_RULE_SETUP #line 61 "panner/lex.L" { // Integer pnlval->integer = atoi(yytext); return INT; } YY_BREAK case 33: #line 67 "panner/lex.L" case 34: YY_RULE_SETUP #line 67 "panner/lex.L" { // Real Number pnlval->real = atof(yytext); return REAL; } YY_BREAK case 35: YY_RULE_SETUP #line 72 "panner/lex.L" { // Pointer pnlval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } YY_BREAK case 36: YY_RULE_SETUP #line 77 "panner/lex.L" { // White Spaces } YY_BREAK case 37: YY_RULE_SETUP #line 80 "panner/lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 38: YY_RULE_SETUP #line 84 "panner/lex.L" ECHO; YY_BREAK #line 931 "panner/lex.C" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; pnfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); pnfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ pnrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pnrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 143); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) pnalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) pnalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) pnfree((void *) b->yy_ch_buf ); pnfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)pnalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)pnrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) pnalloc(new_size ); else (yy_start_stack) = (int *) pnrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *pnalloc (yy_size_t size ) { return (void *) malloc( size ); } void *pnrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void pnfree (void * ptr ) { free( (char *) ptr ); /* see pnrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 84 "panner/lex.L" saods9/tksao1.0/panner/lex.L000644 000765 000000 00000002743 12464230774 016133 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "parser.H" extern YYSTYPE* pnlval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% bbox {return BBOX_;} begin {return BEGIN_;} clear {return CLEAR_;} compass {return COMPASS_;} debug {return DEBUG_;} end {return END_;} false {return FALSE_;} get {return GET_;} height {return HEIGHT_;} hide {return HIDE_;} highlite {return HIGHLITE_;} image {return IMAGE_;} invalid {return INVALID_;} motion {return MOTION_;} n {return N_;} no {return NO_;} off {return OFF_;} on {return ON_;} pan {return PAN_;} reset {return RESET_;} show {return SHOW_;} size {return SIZE_;} true {return TRUE_;} to {return TO_;} update {return UPDATE_;} version {return VERSION_;} warp {return WARP_;} wcs {return WCS_;} width {return WIDTH_;} y {return Y_;} yes {return YES_;} [+-]?{D}+ { // Integer pnlval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number pnlval->real = atof(yytext); return REAL; } 0[xX][0-9a-fA-F]+ { // Pointer pnlval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } [ \t]+ { // White Spaces } . { // Else, return the char return yytext[0]; } %% saods9/tksao1.0/panner/panner.C000644 000765 000000 00000022235 12573624367 016621 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include "panner.h" #include "util.h" // Parser Stuff #undef yyFlexLexer #define yyFlexLexer pnFlexLexer #include void* pnlval; extern int pnparse(Panner*, pnFlexLexer*); int pnlex(void* vval, pnFlexLexer* ll) { pnlval = vval; return ll ? ll->yylex() : 0; } void pnerror(Panner* pn, pnFlexLexer* ll, const char* m) { pn->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { pn->error(": "); pn->error(cmd); } } // Public Member Functions Panner::Panner(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Widget(i, c, item) { thumbnail = 0; highLite = 0; panning = 0; needsUpdate = 0; bboxGC = NULL; useBBox = 1; compassGC = NULL; threed = 0; useCompass = 1; validWCSCompass = 0; tkfont_ = NULL; } Panner::~Panner() { if (bboxGC) XFreeGC(display, bboxGC); if (compassGC) XFreeGC(display, compassGC); if (tkfont_) Tk_FreeFont(tkfont_); } int Panner::parse(istringstream& istr) { result = TCL_OK; pnFlexLexer* ll = new pnFlexLexer(&istr); pnparse(this, ll); delete ll; return result; } void Panner::update() { needsUpdate = 1; redraw(); } // Required Virtual Functions // UpdatePixmap. This function is responsable for creating a valid // pixmap the size of the current Panner int Panner::updatePixmap(const BBox& bb) { // bb is in canvas coords // create a valid pixmap if needed if (!pixmap) { if (!(pixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), options->width, options->height, depth))) { internalError("Panner: Unable to Create Pixmap"); return TCL_OK; } updateGCs(); } if (needsUpdate) { if (thumbnail) { XSetClipOrigin(display, gc, 0, 0); XCopyArea(display, thumbnail, pixmap, gc, 0, 0, options->width, options->height, 0, 0); if (useBBox) renderBBox(); if (useCompass) { renderImageCompass(); if (validWCSCompass) renderWCSCompass(); } } else clearPixmap(); needsUpdate = 0; } return TCL_OK; } void Panner::invalidPixmap() { Widget::invalidPixmap(); update(); } // Command Functions void Panner::getBBoxCmd() { Vector v = bbox[0]; for (int i=1; i<4; i++) v += bbox[i]; v /= 4; ostringstream str; str << v << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Panner::getSizeCmd() { ostringstream str; str << options->width << " " << options->height << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Panner::highLiteCmd(int which) { if (highLite != which) { highLite = !highLite; update(); } } void Panner::highLiteCmd(const Vector& v) { if (highLite != isInBBox(v)) { highLite = !highLite; update(); } } void Panner::panToCmd(const Vector& v) { for (int i=0; i<4; i++) bbox[i] = v; update(); } void Panner::panBeginCmd(const Vector& v) { if (useBBox && isInBBox(v)) { panStart = v; panning = 1; } } void Panner::panMotionCmd(const Vector& v) { if (panning && useBBox) { Vector diff = v - panStart; for (int i=0; i<4; i++) bbox[i] += diff; panStart = v; update(); } } void Panner::panEndCmd(const Vector& v) { if (panning && useBBox) { Vector diff = v - panStart; for (int i=0; i<4; i++) bbox[i] += diff; panning = 0; update(); } } void Panner::setCompassCmd(int w) { useCompass = w ? 1 : 0; update(); } void Panner::setBBoxCmd(int w) { useBBox = w ? 1 : 0; update(); } void Panner::updateCmd(void* p) { thumbnail = (Pixmap)p; update(); } void Panner::updateBBoxCmd(const Vector& ll, const Vector& lr, const Vector& ur, const Vector& ul) { bbox[0] = ll; bbox[1] = lr; bbox[2] = ur; bbox[3] = ul; update(); } void Panner::updateImageCompassCmd(Vector xx, Vector yy) { threed =0; imageX = xx; imageY = yy; update(); } void Panner::updateImageCompassCmd(Vector xx, Vector yy, Vector zz) { threed =1; imageX = xx; imageY = yy; imageZ = zz; update(); } void Panner::updateWCSCompassCmd() { validWCSCompass = 0; update(); } void Panner::updateWCSCompassCmd(const Vector& nn, const Vector& ee) { validWCSCompass = 1; wcsNorth = nn; wcsEast = ee; update(); } void Panner::warpCmd(const Vector& vv) { warp((Vector&)vv); } // Private Functions void Panner::updateGCs() { if (!bboxGC) { bboxGC = XCreateGC(display, pixmap, 0, NULL); XSetForeground(display, bboxGC, getColor("cyan")); } if (!tkfont_) { ostringstream fstr; #ifdef MAC_OSX_TK fstr << '{' << options->helvetica << '}' << ' ' << int(9*getDisplayRatio()) << " roman normal" << ends; #else fstr << '{' << options->helvetica << '}' << " 9 roman normal" << ends; #endif tkfont_ = Tk_GetFont(interp, tkwin, fstr.str().c_str()); if (tkfont_) Tk_GetFontMetrics(tkfont_, &metric); } if (!compassGC) { compassGC = XCreateGC(display, pixmap, 0, NULL); XSetLineAttributes(display, compassGC, 1, LineSolid, CapButt, JoinMiter); if (tkfont_) XSetFont(display, compassGC, Tk_FontId(tkfont_)); } } void Panner::renderBBox() { XSetLineAttributes(display, bboxGC, (highLite ? 2 : 1), LineSolid, CapButt,JoinMiter); for (int i=0; i<3; i++) XDrawLine(display, pixmap, bboxGC, (int)(bbox[i])[0], (int)(bbox[i])[1], (int)(bbox[i+1])[0], (int)(bbox[i+1])[1]); XDrawLine(display, pixmap, bboxGC, (int)(bbox[3])[0], (int)(bbox[3])[1], (int)(bbox[0])[0], (int)(bbox[0])[1]); } void Panner::renderImageCompass() { float length = (options->width/2 + options->height/2)/2 * .4; Vector center(options->width/2., options->height/2.); renderArm(int(length*imageX.length()), center, Rotate(-imageX.angle()), "X", getColor("green")); renderArm(int(length*imageY.length()), center, Rotate(-imageY.angle()), "Y", getColor("green")); if (threed) { renderArm(int(length*imageZ.length()), center, Rotate(-imageZ.angle()), "Z", getColor("green")); } } void Panner::renderWCSCompass() { float length = (options->width/2 + options->height/2)/2 * .25; Vector center(options->width/2., options->height/2.); renderArm(int(length*wcsEast.length()), center, Rotate(-wcsEast.angle()), "E", getColor("yellow")); renderArm(int(length*wcsNorth.length()), center, Rotate(-wcsNorth.angle()), "N", getColor("yellow")); } void Panner::renderArm(int length, Vector center, Rotate rot, const char* str, int color) { if (length<=0) return; // set GC XSetForeground(display, compassGC, color); const int textOffset = 15; // Text offset const int tip = 6; // length from end of line to tip of arrow const int tail = 2; // length from end of line to tails of arrow const int wc = 2; // width of arrow at end of line const int wt = 3; // width of arrow at tails // Arrow-- oriented on Y axis Vector arrow[6]; arrow[0] = Vector(0, tip); arrow[1] = Vector(-wc, 0); arrow[2] = Vector(-wt, -tail); arrow[3] = Vector(0, 0); arrow[4] = Vector(wt, -tail); arrow[5] = Vector(wc, 0); // Staff-- oriented on X axis XPoint arrowArray[6]; Matrix arrowMatrix = Rotate(M_PI_2) * Translate(length,0) * rot * Translate(center); for (int i=0; i<6; i++) { Vector r = (arrow[i] * arrowMatrix).round(); arrowArray[i].x = (int)r[0]; arrowArray[i].y = (int)r[1]; } Vector c = ((Vector&)center).round(); Vector end = (Vector(length, 0) * rot * Translate(center)).round(); XDrawLine(display, pixmap, compassGC, (int)c[0], (int)c[1], (int)end[0], (int)end[1]); XFillPolygon(display, pixmap, compassGC, arrowArray, 6, Nonconvex, CoordModeOrigin); if (tkfont_) { Vector et = Vector((length + textOffset), 0) * rot * Translate(center) * Translate(-Tk_TextWidth(tkfont_, str, 1)/2., metric.ascent/2.); Tk_DrawChars(display, pixmap, compassGC, tkfont_, str, 1, (int)et[0], (int)et[1]); } } int Panner::isInBBox(const Vector& v) { /* v[0]-- x value of point being tested v[1]-- y value of point being tested This algorithm is from "An Introduction to Ray Tracing", Academic Press, 1989, edited by Andrew Glassner, pg 53 -- a point lies in a polygon if a line is extended from the point to infinite in any direction and the number of intersections with the polygon is odd. This is valid for both concave and convex polygons. Points on a vertex are considered inside. Points on a edge are considered inside. */ int crossings = 0; // number of crossings Vector v1; Vector v2 = bbox[0] - v; int sign = ((v2[1])>=0) ? 1 : -1; // init sign // for all edges for (int i=1; i<4; i++) { // look at next two vertices v1 = v2; v2 = bbox[i] - v; int nextSign = (v2[1]>=0) ? 1 : -1; // sign holder for p2 if (sign != nextSign) { if (v1[0]>0 && v2[0]>0) crossings++; else if (v1[0]>0 || v2[0]>0) { if (v1[0]-(v1[1]*(v2[0]-v1[0])/(v2[1]-v1[1])) > 0) crossings++; } sign = nextSign; } } return fmod(float(crossings),float(2)) ? 1 : 0; // if odd, point is inside } saods9/tksao1.0/panner/panner.h000644 000765 000000 00000004516 12464214757 016665 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __panner_h__ #define __panner_h__ #include "widget.h" class Panner : public Widget { private: Pixmap thumbnail; // current frame thumbnail pixmap int highLite; // flag to highlite bbox int panning; // flag for panning status Vector panStart; // initial location of panning operation int needsUpdate; // flag to indicate refresh needed GC bboxGC; // bbox gc int useBBox; // flag to use BBox Vector bbox[4]; // current view GC compassGC; // compass gc Vector imageX; Vector imageY; Vector imageZ; int threed; // 2d or 3d compass int useCompass; // flag to use image/wcs compass Vector wcsNorth; Vector wcsEast; int validWCSCompass; // flag to indicate wcs data is valid Tk_Font tkfont_; // Tk font Tk_FontMetrics metric; // Tk font metric private: void update(); // use existing pixmap, just update void invalidPixmap(); // new pixmap, then update protected: virtual void clearPixmap() =0; // clear pixmap private: int updatePixmap(const BBox&); // renders image/graphics into pixmap void renderBBox(); int isInBBox(const Vector&); void renderImageCompass(); void renderWCSCompass(); void renderArm(int, Vector, Rotate, const char*, int); void updateGCs(); public: Panner(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Panner(); int parse(istringstream&); // parse subcommands // SubCommandFunctions void getBBoxCmd(); void getSizeCmd(); void highLiteCmd(int); void highLiteCmd(const Vector&); void panToCmd(const Vector&); void panBeginCmd(const Vector&); void panMotionCmd(const Vector&); void panEndCmd(const Vector&); void setCompassCmd(int); void setBBoxCmd(int); void updateCmd(void*); void updateBBoxCmd(const Vector&, const Vector&, const Vector&, const Vector&); void updateImageCompassCmd(Vector, Vector); void updateImageCompassCmd(Vector, Vector, Vector); void updateWCSCompassCmd(); void updateWCSCompassCmd(const Vector&, const Vector&); void warpCmd(const Vector&); }; #endif saods9/tksao1.0/panner/pannertrue.C000644 000765 000000 00000007553 12544335553 017521 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "pannertrue.h" #include "util.h" // Tk Canvas Widget Function Declarations int PannerTrueColorCreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // PannerTrueColor Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec pannerTrueColorSpecs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "panner", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "256", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "256", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType pannerTrueColorType = { (char*)"pannertruecolor", // name sizeof(WidgetOptions), // size PannerTrueColorCreateProc, // configProc pannerTrueColorSpecs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int PannerTrueColor_Init(Tcl_Interp* interp) { Tk_CreateItemType(&pannerTrueColorType); return TCL_OK; } int PannerTrueColorCreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { PannerTrueColor* panner = new PannerTrueColor(interp, canvas, item); // and set default configuration if (panner->configure(argc, (const char**)argv, 0) != TCL_OK) { delete panner; Tcl_AppendResult(interp, " error occured while creating pannerTrueColor.", NULL); return TCL_ERROR; } return TCL_OK; } PannerTrueColor::PannerTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Panner(i, c, item) { configSpecs = pannerTrueColorSpecs; // panner configure options } void PannerTrueColor::clearPixmap() { XImage* xmap = XGetImage(display, pixmap, 0, 0, options->width, options->height, AllPlanes, ZPixmap); if (!xmap) { internalError("Panner: Unable to Create XImage"); return; } memset(xmap->data, 255, xmap->bytes_per_line * xmap->height); TkPutImage(NULL, 0, display, pixmap, gc, xmap, 0, 0, 0, 0, options->width, options->height); XDestroyImage(xmap); } saods9/tksao1.0/panner/pannertrue.h000644 000765 000000 00000000601 12464214757 017554 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __pannertrue_h__ #define __pannertrue_h__ #include "panner.h" class PannerTrueColor : public Panner { private: void clearPixmap(); public: PannerTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); }; #endif saods9/tksao1.0/panner/parser.C000644 000765 000000 00000150025 12553253032 016612 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse pnparse #define yylex pnlex #define yyerror pnerror #define yylval pnlval #define yychar pnchar #define yydebug pndebug #define yynerrs pnnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, POINTER = 260, BBOX_ = 261, BEGIN_ = 262, CLEAR_ = 263, COMPASS_ = 264, DEBUG_ = 265, END_ = 266, FALSE_ = 267, GET_ = 268, HEIGHT_ = 269, HIDE_ = 270, HIGHLITE_ = 271, IMAGE_ = 272, INVALID_ = 273, MOTION_ = 274, N_ = 275, NO_ = 276, OFF_ = 277, ON_ = 278, PAN_ = 279, RESET_ = 280, SHOW_ = 281, SIZE_ = 282, TRUE_ = 283, TO_ = 284, UPDATE_ = 285, VERSION_ = 286, WARP_ = 287, WCS_ = 288, WIDTH_ = 289, Y_ = 290, YES_ = 291 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define POINTER 260 #define BBOX_ 261 #define BEGIN_ 262 #define CLEAR_ 263 #define COMPASS_ 264 #define DEBUG_ 265 #define END_ 266 #define FALSE_ 267 #define GET_ 268 #define HEIGHT_ 269 #define HIDE_ 270 #define HIGHLITE_ 271 #define IMAGE_ 272 #define INVALID_ 273 #define MOTION_ 274 #define N_ 275 #define NO_ 276 #define OFF_ 277 #define ON_ 278 #define PAN_ 279 #define RESET_ 280 #define SHOW_ 281 #define SIZE_ 282 #define TRUE_ 283 #define TO_ 284 #define UPDATE_ 285 #define VERSION_ 286 #define WARP_ 287 #define WCS_ 288 #define WIDTH_ 289 #define Y_ 290 #define YES_ 291 /* Copy the first part of user declarations. */ #line 10 "panner/parser.Y" #define YYDEBUG 1 #include #include "panner.h" #undef yyFlexLexer #define yyFlexLexer pnFlexLexer #include extern int pnlex(void*, pnFlexLexer*); extern void pnerror(Panner*, pnFlexLexer*, const char*); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 24 "panner/parser.Y" { float real; int integer; void* ptr; char str[1024]; } /* Line 193 of yacc.c. */ #line 197 "panner/parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 210 "panner/parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 57 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 118 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 37 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 12 /* YYNRULES -- Number of rules. */ #define YYNRULES 50 /* YYNRULES -- Number of states. */ #define YYNSTATES 93 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 291 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 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, 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, 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, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 6, 9, 11, 14, 18, 21, 23, 26, 29, 31, 33, 36, 38, 42, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 87, 89, 91, 95, 99, 103, 107, 109, 119, 123, 127, 132, 139, 144 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 38, 0, -1, 10, 40, -1, 6, 42, -1, 8, -1, 9, 41, -1, 17, 9, 41, -1, 13, 43, -1, 15, -1, 16, 44, -1, 24, 45, -1, 25, -1, 26, -1, 30, 46, -1, 31, -1, 32, 39, 39, -1, 33, 9, 41, -1, 4, -1, 3, -1, 23, -1, 22, -1, 3, -1, 36, -1, 35, -1, 23, -1, 28, -1, 21, -1, 20, -1, 22, -1, 12, -1, 23, -1, 22, -1, 6, -1, 14, -1, 27, -1, 34, -1, 39, 39, -1, 22, -1, 23, -1, 7, 39, 39, -1, 19, 39, 39, -1, 11, 39, 39, -1, 29, 39, 39, -1, 5, -1, 6, 39, 39, 39, 39, 39, 39, 39, 39, -1, 17, 9, 47, -1, 33, 9, 48, -1, 39, 39, 39, 39, -1, 39, 39, 39, 39, 39, 39, -1, 39, 39, 39, 39, -1, 18, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 72, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 89, 90, 93, 94, 97, 99, 100, 101, 102, 104, 105, 106, 107, 110, 111, 114, 115, 116, 117, 120, 121, 122, 125, 126, 127, 128, 131, 132, 136, 137, 140, 142, 147, 149 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "POINTER", "BBOX_", "BEGIN_", "CLEAR_", "COMPASS_", "DEBUG_", "END_", "FALSE_", "GET_", "HEIGHT_", "HIDE_", "HIGHLITE_", "IMAGE_", "INVALID_", "MOTION_", "N_", "NO_", "OFF_", "ON_", "PAN_", "RESET_", "SHOW_", "SIZE_", "TRUE_", "TO_", "UPDATE_", "VERSION_", "WARP_", "WCS_", "WIDTH_", "Y_", "YES_", "$accept", "command", "numeric", "debug", "yesno", "bbox", "get", "highLite", "pan", "update", "updateImageCompass", "updateWCSCompass", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 48, 48 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 2, 1, 2, 3, 2, 1, 2, 2, 1, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 1, 9, 3, 3, 4, 6, 4, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 11, 12, 0, 14, 0, 0, 0, 31, 30, 3, 21, 29, 27, 26, 28, 24, 25, 23, 22, 5, 20, 19, 2, 32, 33, 34, 35, 7, 18, 17, 37, 38, 0, 9, 0, 0, 0, 0, 0, 10, 43, 0, 0, 0, 13, 0, 0, 1, 36, 6, 0, 0, 0, 0, 0, 0, 0, 15, 16, 39, 41, 40, 42, 0, 0, 45, 50, 0, 46, 0, 0, 0, 0, 0, 0, 0, 47, 49, 0, 0, 0, 48, 44 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 16, 42, 32, 29, 19, 37, 43, 49, 54, 75, 78 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -37 static const yytype_int8 yypact[] = { 85, -12, -37, 61, -7, -5, -37, 1, 17, 6, -37, -37, -3, -37, 15, 18, 12, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, 15, -37, 61, 15, 15, 15, 15, -37, -37, 15, 27, 29, -37, 15, 61, -37, -37, -37, 15, 15, 15, 15, 15, 15, 3, -37, -37, -37, -37, -37, -37, 15, 15, -37, -37, 15, -37, 15, 15, 15, 15, 15, 15, 15, 15, -37, 15, 15, 15, -37, -37 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -37, -37, -14, -37, -36, -37, -37, -37, -37, -37, -37, -37 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 55, 33, 50, 51, 38, 39, 38, 39, 59, 34, 17, 18, 57, 45, 52, 30, 31, 46, 38, 39, 68, 76, 35, 40, 41, 47, 44, 56, 58, 36, 53, 60, 61, 62, 63, 48, 65, 64, 66, 0, 0, 67, 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, 77, 0, 0, 0, 0, 0, 0, 79, 80, 0, 0, 81, 20, 82, 83, 84, 85, 86, 87, 88, 89, 21, 90, 91, 92, 0, 0, 0, 0, 22, 23, 24, 25, 0, 0, 0, 0, 26, 0, 1, 0, 2, 3, 4, 27, 28, 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 0, 0, 12, 13, 14, 15 }; static const yytype_int8 yycheck[] = { 14, 6, 5, 6, 3, 4, 3, 4, 44, 14, 22, 23, 0, 7, 17, 22, 23, 11, 3, 4, 56, 18, 27, 22, 23, 19, 9, 9, 42, 34, 33, 45, 46, 47, 48, 29, 9, 51, 9, -1, -1, 55, -1, -1, -1, -1, 60, 61, 62, 63, 64, 65, 66, -1, -1, -1, -1, -1, -1, 73, 74, -1, -1, 77, 3, 79, 80, 81, 82, 83, 84, 85, 86, 12, 88, 89, 90, -1, -1, -1, -1, 20, 21, 22, 23, -1, -1, -1, -1, 28, -1, 6, -1, 8, 9, 10, 35, 36, 13, -1, 15, 16, 17, -1, -1, -1, -1, -1, -1, 24, 25, 26, -1, -1, -1, 30, 31, 32, 33 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 6, 8, 9, 10, 13, 15, 16, 17, 24, 25, 26, 30, 31, 32, 33, 38, 22, 23, 42, 3, 12, 20, 21, 22, 23, 28, 35, 36, 41, 22, 23, 40, 6, 14, 27, 34, 43, 3, 4, 22, 23, 39, 44, 9, 7, 11, 19, 29, 45, 5, 6, 17, 33, 46, 39, 9, 0, 39, 41, 39, 39, 39, 39, 39, 9, 9, 39, 41, 39, 39, 39, 39, 39, 39, 47, 18, 39, 48, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (pn, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, pn, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Panner* pn, pnFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, pn, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Panner* pn; pnFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (pn); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Panner* pn, pnFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, pn, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Panner* pn; pnFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, pn, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Panner* pn, pnFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, pn, ll) YYSTYPE *yyvsp; int yyrule; Panner* pn; pnFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , pn, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, pn, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Panner* pn, pnFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, pn, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Panner* pn; pnFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (pn); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Panner* pn, pnFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Panner* pn, pnFlexLexer* ll) #else int yyparse (pn, ll) Panner* pn; pnFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 4: #line 74 "panner/parser.Y" {pn->updateCmd(0);;} break; case 5: #line 75 "panner/parser.Y" {pn->setCompassCmd((yyvsp[(2) - (2)].integer));;} break; case 6: #line 76 "panner/parser.Y" {pn->setCompassCmd((yyvsp[(3) - (3)].integer));;} break; case 8: #line 78 "panner/parser.Y" {pn->hideCmd();;} break; case 11: #line 81 "panner/parser.Y" {pn->resetCmd();;} break; case 12: #line 82 "panner/parser.Y" {pn->showCmd();;} break; case 14: #line 84 "panner/parser.Y" {pn->msg("Panner 1.0");;} break; case 15: #line 85 "panner/parser.Y" {pn->warpCmd(Vector((yyvsp[(2) - (3)].real), (yyvsp[(3) - (3)].real)));;} break; case 16: #line 86 "panner/parser.Y" {pn->setCompassCmd((yyvsp[(3) - (3)].integer));;} break; case 17: #line 89 "panner/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 18: #line 90 "panner/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 19: #line 93 "panner/parser.Y" {yydebug=1;;} break; case 20: #line 94 "panner/parser.Y" {yydebug=0;;} break; case 21: #line 97 "panner/parser.Y" {(yyval.integer)=((yyvsp[(1) - (1)].integer) ? 1 : 0);;} break; case 22: #line 99 "panner/parser.Y" {(yyval.integer)=1;;} break; case 23: #line 100 "panner/parser.Y" {(yyval.integer)=1;;} break; case 24: #line 101 "panner/parser.Y" {(yyval.integer)=1;;} break; case 25: #line 102 "panner/parser.Y" {(yyval.integer)=1;;} break; case 26: #line 104 "panner/parser.Y" {(yyval.integer)=0;;} break; case 27: #line 105 "panner/parser.Y" {(yyval.integer)=0;;} break; case 28: #line 106 "panner/parser.Y" {(yyval.integer)=0;;} break; case 29: #line 107 "panner/parser.Y" {(yyval.integer)=0;;} break; case 30: #line 110 "panner/parser.Y" {pn->setBBoxCmd(1);;} break; case 31: #line 111 "panner/parser.Y" {pn->setBBoxCmd(0);;} break; case 32: #line 114 "panner/parser.Y" {pn->getBBoxCmd();;} break; case 33: #line 115 "panner/parser.Y" {pn->getHeightCmd();;} break; case 34: #line 116 "panner/parser.Y" {pn->getSizeCmd();;} break; case 35: #line 117 "panner/parser.Y" {pn->getWidthCmd();;} break; case 36: #line 120 "panner/parser.Y" {pn->highLiteCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 37: #line 121 "panner/parser.Y" {pn->highLiteCmd(0);;} break; case 38: #line 122 "panner/parser.Y" {pn->highLiteCmd(1);;} break; case 39: #line 125 "panner/parser.Y" {pn->panBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 40: #line 126 "panner/parser.Y" {pn->panMotionCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 41: #line 127 "panner/parser.Y" {pn->panEndCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 42: #line 128 "panner/parser.Y" {pn->panToCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 43: #line 131 "panner/parser.Y" {pn->updateCmd((yyvsp[(1) - (1)].ptr));;} break; case 44: #line 134 "panner/parser.Y" {pn->updateBBoxCmd(Vector((yyvsp[(2) - (9)].real),(yyvsp[(3) - (9)].real)),Vector((yyvsp[(4) - (9)].real),(yyvsp[(5) - (9)].real)), Vector((yyvsp[(6) - (9)].real),(yyvsp[(7) - (9)].real)),Vector((yyvsp[(8) - (9)].real),(yyvsp[(9) - (9)].real)));;} break; case 47: #line 141 "panner/parser.Y" {pn->updateImageCompassCmd(Vector((yyvsp[(1) - (4)].real),(yyvsp[(2) - (4)].real)),Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 48: #line 143 "panner/parser.Y" {pn->updateImageCompassCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)), Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)), Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 49: #line 148 "panner/parser.Y" {pn->updateWCSCompassCmd(Vector((yyvsp[(1) - (4)].real),(yyvsp[(2) - (4)].real)),Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 50: #line 149 "panner/parser.Y" {pn->updateWCSCompassCmd();;} break; /* Line 1267 of yacc.c. */ #line 1706 "panner/parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (pn, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (pn, ll, yymsg); } else { yyerror (pn, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, pn, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, pn, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (pn, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, pn, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, pn, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 152 "panner/parser.Y" saods9/tksao1.0/panner/parser.H000644 000765 000000 00000006553 12553253032 016625 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, POINTER = 260, BBOX_ = 261, BEGIN_ = 262, CLEAR_ = 263, COMPASS_ = 264, DEBUG_ = 265, END_ = 266, FALSE_ = 267, GET_ = 268, HEIGHT_ = 269, HIDE_ = 270, HIGHLITE_ = 271, IMAGE_ = 272, INVALID_ = 273, MOTION_ = 274, N_ = 275, NO_ = 276, OFF_ = 277, ON_ = 278, PAN_ = 279, RESET_ = 280, SHOW_ = 281, SIZE_ = 282, TRUE_ = 283, TO_ = 284, UPDATE_ = 285, VERSION_ = 286, WARP_ = 287, WCS_ = 288, WIDTH_ = 289, Y_ = 290, YES_ = 291 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define POINTER 260 #define BBOX_ 261 #define BEGIN_ 262 #define CLEAR_ 263 #define COMPASS_ 264 #define DEBUG_ 265 #define END_ 266 #define FALSE_ 267 #define GET_ 268 #define HEIGHT_ 269 #define HIDE_ 270 #define HIGHLITE_ 271 #define IMAGE_ 272 #define INVALID_ 273 #define MOTION_ 274 #define N_ 275 #define NO_ 276 #define OFF_ 277 #define ON_ 278 #define PAN_ 279 #define RESET_ 280 #define SHOW_ 281 #define SIZE_ 282 #define TRUE_ 283 #define TO_ 284 #define UPDATE_ 285 #define VERSION_ 286 #define WARP_ 287 #define WCS_ 288 #define WIDTH_ 289 #define Y_ 290 #define YES_ 291 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 24 "panner/parser.Y" { float real; int integer; void* ptr; char str[1024]; } /* Line 1529 of yacc.c. */ #line 128 "panner/parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/panner/parser.Y000644 000765 000000 00000005755 12464230774 016662 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Panner* pn} %lex-param {pnFlexLexer* ll} %parse-param {pnFlexLexer* ll} %{ #define YYDEBUG 1 #include #include "panner.h" #undef yyFlexLexer #define yyFlexLexer pnFlexLexer #include extern int pnlex(void*, pnFlexLexer*); extern void pnerror(Panner*, pnFlexLexer*, const char*); %} %union { float real; int integer; void* ptr; char str[1024]; } %type numeric %type yesno %token INT %token REAL %token POINTER %token BBOX_ %token BEGIN_ %token CLEAR_ %token COMPASS_ %token DEBUG_ %token END_ %token FALSE_ %token GET_ %token HEIGHT_ %token HIDE_ %token HIGHLITE_ %token IMAGE_ %token INVALID_ %token MOTION_ %token N_ %token NO_ %token OFF_ %token ON_ %token PAN_ %token RESET_ %token SHOW_ %token SIZE_ %token TRUE_ %token TO_ %token UPDATE_ %token VERSION_ %token WARP_ %token WCS_ %token WIDTH_ %token Y_ %token YES_ %% command : DEBUG_ debug | BBOX_ bbox | CLEAR_ {pn->updateCmd(0);} | COMPASS_ yesno {pn->setCompassCmd($2);} | IMAGE_ COMPASS_ yesno {pn->setCompassCmd($3);} | GET_ get | HIDE_ {pn->hideCmd();} | HIGHLITE_ highLite | PAN_ pan | RESET_ {pn->resetCmd();} | SHOW_ {pn->showCmd();} | UPDATE_ update | VERSION_ {pn->msg("Panner 1.0");} | WARP_ numeric numeric {pn->warpCmd(Vector($2, $3));} | WCS_ COMPASS_ yesno {pn->setCompassCmd($3);} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; yesno : INT {$$=($1 ? 1 : 0);} | YES_ {$$=1;} | Y_ {$$=1;} | ON_ {$$=1;} | TRUE_ {$$=1;} | NO_ {$$=0;} | N_ {$$=0;} | OFF_ {$$=0;} | FALSE_ {$$=0;} ; bbox : ON_ {pn->setBBoxCmd(1);} | OFF_ {pn->setBBoxCmd(0);} ; get : BBOX_ {pn->getBBoxCmd();} | HEIGHT_ {pn->getHeightCmd();} | SIZE_ {pn->getSizeCmd();} | WIDTH_ {pn->getWidthCmd();} ; highLite: numeric numeric {pn->highLiteCmd(Vector($1,$2));} | OFF_ {pn->highLiteCmd(0);} | ON_ {pn->highLiteCmd(1);} ; pan : BEGIN_ numeric numeric {pn->panBeginCmd(Vector($2,$3));} | MOTION_ numeric numeric {pn->panMotionCmd(Vector($2,$3));} | END_ numeric numeric {pn->panEndCmd(Vector($2,$3));} | TO_ numeric numeric {pn->panToCmd(Vector($2,$3));} ; update : POINTER {pn->updateCmd($1);} | BBOX_ numeric numeric numeric numeric numeric numeric numeric numeric {pn->updateBBoxCmd(Vector($2,$3),Vector($4,$5), Vector($6,$7),Vector($8,$9));} | IMAGE_ COMPASS_ updateImageCompass | WCS_ COMPASS_ updateWCSCompass ; updateImageCompass : numeric numeric numeric numeric {pn->updateImageCompassCmd(Vector($1,$2),Vector($3,$4));} | numeric numeric numeric numeric numeric numeric {pn->updateImageCompassCmd(Vector($1,$2), Vector($3,$4), Vector($5,$6));} ; updateWCSCompass : numeric numeric numeric numeric {pn->updateWCSCompassCmd(Vector($1,$2),Vector($3,$4));} | INVALID_ {pn->updateWCSCompassCmd();} ; %% saods9/tksao1.0/magnifier/lex.C000644 000765 000000 00000130610 12553253032 016562 0ustar00joyewheel000000 000000 #line 2 "magnifier/lex.C" #line 4 "magnifier/lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer mgFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *mgalloc (yy_size_t ); void *mgrealloc (void *,yy_size_t ); void mgfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 24 #define YY_END_OF_BUFFER 25 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[86] = { 0, 0, 0, 25, 23, 22, 24, 23, 20, 20, 23, 23, 23, 23, 23, 23, 10, 23, 23, 23, 23, 23, 23, 23, 18, 22, 20, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 5, 0, 0, 8, 0, 0, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 7, 0, 13, 14, 0, 0, 0, 2, 3, 4, 0, 12, 0, 0, 17, 6, 15, 0, 16, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 1, 1, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, 1, 1, 1, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 1, 16, 1, 17, 18, 19, 1, 20, 21, 22, 23, 24, 25, 26, 27, 1, 1, 1, 1, 1, 1, 1, 28, 29, 30, 31, 32, 33, 34, 35, 36, 1, 1, 37, 1, 38, 39, 40, 1, 41, 42, 43, 44, 45, 46, 47, 48, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[49] = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[87] = { 0, 0, 0, 159, 175, 154, 175, 44, 46, 48, 47, 40, 46, 51, 48, 49, 43, 50, 52, 51, 46, 49, 58, 55, 60, 153, 68, 0, 57, 83, 87, 81, 76, 84, 90, 175, 89, 175, 81, 85, 81, 95, 86, 97, 87, 0, 83, 103, 88, 91, 175, 100, 103, 175, 106, 111, 126, 132, 119, 119, 175, 175, 122, 130, 133, 131, 175, 124, 175, 175, 125, 133, 135, 175, 175, 175, 128, 175, 140, 134, 175, 175, 175, 136, 175, 175, 152 } ; static yyconst flex_int16_t yy_def[87] = { 0, 85, 1, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 85 } ; static yyconst flex_int16_t yy_nxt[224] = { 0, 4, 5, 6, 7, 8, 9, 4, 10, 11, 12, 4, 13, 14, 15, 4, 4, 16, 17, 4, 18, 19, 20, 21, 22, 23, 4, 24, 4, 10, 11, 12, 4, 13, 14, 15, 4, 4, 16, 17, 4, 18, 19, 20, 21, 22, 23, 4, 24, 26, 26, 26, 26, 26, 26, 28, 29, 30, 31, 32, 33, 35, 36, 38, 34, 39, 40, 37, 41, 42, 43, 44, 27, 26, 26, 46, 28, 29, 30, 31, 32, 33, 35, 36, 38, 34, 39, 40, 37, 41, 42, 43, 44, 27, 47, 48, 46, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 47, 48, 67, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 45, 25, 25, 68, 69, 85, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 3, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 } ; static yyconst flex_int16_t yy_chk[224] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 15, 19, 20, 17, 21, 22, 23, 24, 8, 26, 26, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 15, 19, 20, 17, 21, 22, 23, 24, 8, 29, 30, 28, 31, 32, 33, 34, 36, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52, 29, 30, 54, 31, 32, 33, 34, 36, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 51, 52, 55, 56, 54, 57, 58, 59, 62, 63, 64, 65, 67, 70, 71, 72, 76, 78, 79, 83, 86, 25, 5, 55, 56, 3, 57, 58, 59, 62, 63, 64, 65, 67, 70, 71, 72, 76, 78, 79, 83, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "magnifier/lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "magnifier/lex.L" #include #include #include #include "parser.H" extern YYSTYPE* mglval; /* rules */ #line 496 "magnifier/lex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 26 "magnifier/lex.L" #line 599 "magnifier/lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 86 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 85 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 28 "magnifier/lex.L" {return BBOX_;} YY_BREAK case 2: YY_RULE_SETUP #line 29 "magnifier/lex.L" {return CLEAR_;} YY_BREAK case 3: YY_RULE_SETUP #line 30 "magnifier/lex.L" {return DEBUG_;} YY_BREAK case 4: YY_RULE_SETUP #line 31 "magnifier/lex.L" {return FALSE_;} YY_BREAK case 5: YY_RULE_SETUP #line 32 "magnifier/lex.L" {return GET_;} YY_BREAK case 6: YY_RULE_SETUP #line 33 "magnifier/lex.L" {return HEIGHT_;} YY_BREAK case 7: YY_RULE_SETUP #line 34 "magnifier/lex.L" {return HIDE_;} YY_BREAK case 8: YY_RULE_SETUP #line 35 "magnifier/lex.L" {return OFF_;} YY_BREAK case 9: YY_RULE_SETUP #line 36 "magnifier/lex.L" {return ON_;} YY_BREAK case 10: YY_RULE_SETUP #line 37 "magnifier/lex.L" {return N_;} YY_BREAK case 11: YY_RULE_SETUP #line 38 "magnifier/lex.L" {return NO_;} YY_BREAK case 12: YY_RULE_SETUP #line 39 "magnifier/lex.L" {return RESET_;} YY_BREAK case 13: YY_RULE_SETUP #line 40 "magnifier/lex.L" {return SHOW_;} YY_BREAK case 14: YY_RULE_SETUP #line 41 "magnifier/lex.L" {return TRUE_;} YY_BREAK case 15: YY_RULE_SETUP #line 42 "magnifier/lex.L" {return UPDATE_;} YY_BREAK case 16: YY_RULE_SETUP #line 43 "magnifier/lex.L" {return VERSION_;} YY_BREAK case 17: YY_RULE_SETUP #line 44 "magnifier/lex.L" {return WIDTH_;} YY_BREAK case 18: YY_RULE_SETUP #line 45 "magnifier/lex.L" {return Y_;} YY_BREAK case 19: YY_RULE_SETUP #line 46 "magnifier/lex.L" {return YES_;} YY_BREAK case 20: YY_RULE_SETUP #line 48 "magnifier/lex.L" { // Integer mglval->integer = atoi(yytext); return INT; } YY_BREAK case 21: YY_RULE_SETUP #line 53 "magnifier/lex.L" { // Pointer mglval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } YY_BREAK case 22: YY_RULE_SETUP #line 58 "magnifier/lex.L" { // White Spaces } YY_BREAK case 23: YY_RULE_SETUP #line 61 "magnifier/lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 24: YY_RULE_SETUP #line 65 "magnifier/lex.L" ECHO; YY_BREAK #line 807 "magnifier/lex.C" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; mgfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); mgfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ mgrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) mgrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 86 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 86 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 85); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) mgalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) mgalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) mgfree((void *) b->yy_ch_buf ); mgfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)mgalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)mgrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) mgalloc(new_size ); else (yy_start_stack) = (int *) mgrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *mgalloc (yy_size_t size ) { return (void *) malloc( size ); } void *mgrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void mgfree (void * ptr ) { free( (char *) ptr ); /* see mgrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 65 "magnifier/lex.L" saods9/tksao1.0/magnifier/lex.L000644 000765 000000 00000002124 12464230774 016602 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "parser.H" extern YYSTYPE* mglval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% bbox {return BBOX_;} clear {return CLEAR_;} debug {return DEBUG_;} false {return FALSE_;} get {return GET_;} height {return HEIGHT_;} hide {return HIDE_;} off {return OFF_;} on {return ON_;} n {return N_;} no {return NO_;} reset {return RESET_;} show {return SHOW_;} true {return TRUE_;} update {return UPDATE_;} version {return VERSION_;} width {return WIDTH_;} y {return Y_;} yes {return YES_;} [+-]?{D}+ { // Integer mglval->integer = atoi(yytext); return INT; } 0[xX][0-9a-fA-F]+ { // Pointer mglval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } [ \t]+ { // White Spaces } . { // Else, return the char return yytext[0]; } %% saods9/tksao1.0/magnifier/magnifier.C000644 000765 000000 00000004137 12464214757 017753 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "magnifier.h" #include "util.h" // Parser Stuff #undef yyFlexLexer #define yyFlexLexer mgFlexLexer #include void* mglval; extern int mgparse(Magnifier*, mgFlexLexer*); int mglex(void* vval, mgFlexLexer* ll) { mglval = vval; return ll ? ll->yylex() : 0; } void mgerror(Magnifier* mg, mgFlexLexer* ll, const char* m) { mg->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { mg->error(": "); mg->error(cmd); } } // Public Member Functions Magnifier::Magnifier(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Widget(i, c, item) { thumbnail = 0; needsUpdate = 0; } int Magnifier::parse(istringstream& istr) { result = TCL_OK; mgFlexLexer* ll = new mgFlexLexer(&istr); mgparse(this, ll); delete ll; return result; } void Magnifier::update() { needsUpdate = 1; redrawNow(); } // Required Virtual Functions // UpdatePixmap. This function is responsable for creating a valid // pixmap the size of the current Magnifier int Magnifier::updatePixmap(const BBox& bb) { // create a valid pixmap if needed // bb is in canvas coords if (!pixmap) if (!(pixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), options->width, options->height, depth))) { internalError("Magnifier: Unable to Create Pixmap"); return TCL_OK; } if (needsUpdate) { if (thumbnail) { XSetClipOrigin(display, gc, 0, 0); XCopyArea(display, thumbnail, pixmap, gc, 0, 0, options->width, options->height, 0, 0); } else clearPixmap(); needsUpdate = 0; } return TCL_OK; } void Magnifier::invalidPixmap() { Widget::invalidPixmap(); update(); } // Command Functions void Magnifier::getBBoxCmd() { ostringstream str; str << options->width << " " << options->height << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Magnifier::updateCmd(void* p) { thumbnail = (Pixmap)p; update(); } saods9/tksao1.0/magnifier/magnifier.h000644 000765 000000 00000001771 12464214757 020021 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __magnifier_h__ #define __magnifier_h__ #include "widget.h" class Magnifier : public Widget { private: Pixmap thumbnail; // current gterm thumbnail pixmap double crosshairSize; // size of crosshair (diameter) double crosshairAngle; // angle of rotation (radians) GC crosshairGC; // gc for crosshairs int useCrosshair; // flag to render crosshair int needsUpdate; // flag to indicate update needed protected: virtual void clearPixmap() =0; private: int updatePixmap(const BBox&); // renders image/graphics into pixmap void update(); void invalidPixmap(); public: Magnifier(Tcl_Interp*, Tk_Canvas, Tk_Item*); int parse(istringstream&); // parse subcommands // SubCommandFunctions void crosshairCmd(int); void getBBoxCmd(); void updateCmd(void*); }; #endif saods9/tksao1.0/magnifier/magnifiertrue.C000644 000765 000000 00000007641 12544335553 020653 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "magnifiertrue.h" #include "util.h" // Tk Canvas Widget Function Declarations int MagnifierTrueColorCreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // MagnifierTrueColor Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec magnifierTrueColorSpecs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "magnifier", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "256", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "256", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType magnifierTrueColorType = { (char*)"magnifiertruecolor", // name sizeof(WidgetOptions), // size MagnifierTrueColorCreateProc, // configProc magnifierTrueColorSpecs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc (Tk_ItemCursorProc*)NULL, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int MagnifierTrueColor_Init(Tcl_Interp* interp) { Tk_CreateItemType(&magnifierTrueColorType); return TCL_OK; } int MagnifierTrueColorCreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { MagnifierTrueColor* magnifier = new MagnifierTrueColor(interp, canvas, item); // and set default configuration if (magnifier->configure(argc, (const char**)argv, 0) != TCL_OK) { delete magnifier; Tcl_AppendResult(interp, " error occured while creating magnifier.", NULL); return TCL_ERROR; } return TCL_OK; } MagnifierTrueColor::MagnifierTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Magnifier(i, c, item) { configSpecs = magnifierTrueColorSpecs; // magnifier configure options } void MagnifierTrueColor::clearPixmap() { XImage* xmap = XGetImage(display, pixmap, 0, 0, options->width, options->height, AllPlanes, ZPixmap); if (!xmap) { internalError("MagnifierTrueColor: Unable to Create XImage"); return; } memset(xmap->data, 255, xmap->bytes_per_line * xmap->height); TkPutImage(NULL, 0, display, pixmap, gc, xmap, 0, 0, 0, 0, options->width, options->height); XDestroyImage(xmap); } saods9/tksao1.0/magnifier/magnifiertrue.h000644 000765 000000 00000000622 12464214757 020713 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __magnifiertrue_h__ #define __magnifiertrue_h__ #include "magnifier.h" class MagnifierTrueColor : public Magnifier { private: void clearPixmap(); public: MagnifierTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); }; #endif saods9/tksao1.0/magnifier/parser.C000644 000765 000000 00000125667 12553253032 017306 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse mgparse #define yylex mglex #define yyerror mgerror #define yylval mglval #define yychar mgchar #define yydebug mgdebug #define yynerrs mgnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, POINTER = 259, BBOX_ = 260, CLEAR_ = 261, DEBUG_ = 262, FALSE_ = 263, GET_ = 264, HEIGHT_ = 265, HIDE_ = 266, OFF_ = 267, ON_ = 268, N_ = 269, NO_ = 270, RESET_ = 271, SHOW_ = 272, TRUE_ = 273, UPDATE_ = 274, VERSION_ = 275, WIDTH_ = 276, Y_ = 277, YES_ = 278 }; #endif /* Tokens. */ #define INT 258 #define POINTER 259 #define BBOX_ 260 #define CLEAR_ 261 #define DEBUG_ 262 #define FALSE_ 263 #define GET_ 264 #define HEIGHT_ 265 #define HIDE_ 266 #define OFF_ 267 #define ON_ 268 #define N_ 269 #define NO_ 270 #define RESET_ 271 #define SHOW_ 272 #define TRUE_ 273 #define UPDATE_ 274 #define VERSION_ 275 #define WIDTH_ 276 #define Y_ 277 #define YES_ 278 /* Copy the first part of user declarations. */ #line 10 "magnifier/parser.Y" #define YYDEBUG 1 #include #include "magnifier.h" #undef yyFlexLexer #define yyFlexLexer mgFlexLexer #include extern int mglex(void*, mgFlexLexer*); extern void mgerror(Magnifier*, mgFlexLexer*, const char*); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 24 "magnifier/parser.Y" { float real; int integer; void* ptr; char str[1024]; } /* Line 193 of yacc.c. */ #line 171 "magnifier/parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 184 "magnifier/parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 18 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 21 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 24 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 4 /* YYNRULES -- Number of rules. */ #define YYNRULES 14 /* YYNRULES -- Number of states. */ #define YYNSTATES 19 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 278 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 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, 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, 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, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 6, 8, 11, 13, 15, 17, 20, 22, 24, 26, 28, 30 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 25, 0, -1, 7, 26, -1, 6, -1, 9, 27, -1, 11, -1, 16, -1, 17, -1, 19, 4, -1, 20, -1, 13, -1, 12, -1, 5, -1, 10, -1, 21, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 56, 56, 57, 58, 59, 60, 61, 62, 63, 66, 67, 70, 71, 72 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "POINTER", "BBOX_", "CLEAR_", "DEBUG_", "FALSE_", "GET_", "HEIGHT_", "HIDE_", "OFF_", "ON_", "N_", "NO_", "RESET_", "SHOW_", "TRUE_", "UPDATE_", "VERSION_", "WIDTH_", "Y_", "YES_", "$accept", "command", "debug", "get", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 27, 27, 27 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 3, 0, 0, 5, 6, 7, 0, 9, 0, 11, 10, 2, 12, 13, 14, 4, 8, 1 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 9, 12, 16 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -12 static const yytype_int8 yypact[] = { 1, -12, -11, -5, -12, -12, -12, -1, -12, 4, -12, -12, -12, -12, -12, -12, -12, -12, -12 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -12, -12, -12, -12 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 13, 10, 11, 17, 18, 14, 0, 1, 2, 0, 3, 0, 4, 0, 0, 0, 15, 5, 6, 0, 7, 8 }; static const yytype_int8 yycheck[] = { 5, 12, 13, 4, 0, 10, -1, 6, 7, -1, 9, -1, 11, -1, -1, -1, 21, 16, 17, -1, 19, 20 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 6, 7, 9, 11, 16, 17, 19, 20, 25, 12, 13, 26, 5, 10, 21, 27, 4, 0 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (mg, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, mg, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Magnifier* mg, mgFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, mg, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Magnifier* mg; mgFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (mg); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Magnifier* mg, mgFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, mg, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Magnifier* mg; mgFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, mg, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Magnifier* mg, mgFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, mg, ll) YYSTYPE *yyvsp; int yyrule; Magnifier* mg; mgFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , mg, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, mg, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Magnifier* mg, mgFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, mg, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Magnifier* mg; mgFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (mg); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Magnifier* mg, mgFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Magnifier* mg, mgFlexLexer* ll) #else int yyparse (mg, ll) Magnifier* mg; mgFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 3: #line 57 "magnifier/parser.Y" {mg->updateCmd(0);;} break; case 5: #line 59 "magnifier/parser.Y" {mg->hideCmd();;} break; case 6: #line 60 "magnifier/parser.Y" {mg->resetCmd();;} break; case 7: #line 61 "magnifier/parser.Y" {mg->showCmd();;} break; case 8: #line 62 "magnifier/parser.Y" {mg->updateCmd((yyvsp[(2) - (2)].ptr));;} break; case 9: #line 63 "magnifier/parser.Y" {mg->msg("Magnifier 1.0");;} break; case 10: #line 66 "magnifier/parser.Y" {yydebug=1;;} break; case 11: #line 67 "magnifier/parser.Y" {yydebug=0;;} break; case 12: #line 70 "magnifier/parser.Y" {mg->getBBoxCmd();;} break; case 13: #line 71 "magnifier/parser.Y" {mg->getHeightCmd();;} break; case 14: #line 72 "magnifier/parser.Y" {mg->getWidthCmd();;} break; /* Line 1267 of yacc.c. */ #line 1451 "magnifier/parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (mg, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (mg, ll, yymsg); } else { yyerror (mg, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, mg, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, mg, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (mg, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, mg, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, mg, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 75 "magnifier/parser.Y" saods9/tksao1.0/magnifier/parser.H000644 000765 000000 00000005615 12553253032 017301 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, POINTER = 259, BBOX_ = 260, CLEAR_ = 261, DEBUG_ = 262, FALSE_ = 263, GET_ = 264, HEIGHT_ = 265, HIDE_ = 266, OFF_ = 267, ON_ = 268, N_ = 269, NO_ = 270, RESET_ = 271, SHOW_ = 272, TRUE_ = 273, UPDATE_ = 274, VERSION_ = 275, WIDTH_ = 276, Y_ = 277, YES_ = 278 }; #endif /* Tokens. */ #define INT 258 #define POINTER 259 #define BBOX_ 260 #define CLEAR_ 261 #define DEBUG_ 262 #define FALSE_ 263 #define GET_ 264 #define HEIGHT_ 265 #define HIDE_ 266 #define OFF_ 267 #define ON_ 268 #define N_ 269 #define NO_ 270 #define RESET_ 271 #define SHOW_ 272 #define TRUE_ 273 #define UPDATE_ 274 #define VERSION_ 275 #define WIDTH_ 276 #define Y_ 277 #define YES_ 278 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 24 "magnifier/parser.Y" { float real; int integer; void* ptr; char str[1024]; } /* Line 1529 of yacc.c. */ #line 102 "magnifier/parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/magnifier/parser.Y000644 000765 000000 00000002363 12464230774 017330 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Magnifier* mg} %lex-param {mgFlexLexer* ll} %parse-param {mgFlexLexer* ll} %{ #define YYDEBUG 1 #include #include "magnifier.h" #undef yyFlexLexer #define yyFlexLexer mgFlexLexer #include extern int mglex(void*, mgFlexLexer*); extern void mgerror(Magnifier*, mgFlexLexer*, const char*); %} %union { float real; int integer; void* ptr; char str[1024]; } %token INT %token POINTER %token BBOX_ %token CLEAR_ %token DEBUG_ %token FALSE_ %token GET_ %token HEIGHT_ %token HIDE_ %token OFF_ %token ON_ %token N_ %token NO_ %token RESET_ %token SHOW_ %token TRUE_ %token UPDATE_ %token VERSION_ %token WIDTH_ %token Y_ %token YES_ %% command : DEBUG_ debug | CLEAR_ {mg->updateCmd(0);} | GET_ get | HIDE_ {mg->hideCmd();} | RESET_ {mg->resetCmd();} | SHOW_ {mg->showCmd();} | UPDATE_ POINTER {mg->updateCmd($2);} | VERSION_ {mg->msg("Magnifier 1.0");} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; get : BBOX_ {mg->getBBoxCmd();} | HEIGHT_ {mg->getHeightCmd();} | WIDTH_ {mg->getWidthCmd();} ; %% saods9/tksao1.0/list/list.C000644 000765 000000 00000014276 12464214757 016004 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "list.h" #include "vector.h" #include "marker.h" #include "callback.h" #include "contour.h" #include "fitsmask.h" #include "sao.h" #include "lut.h" #include "colormap.h" #include "colortag.h" #include "raytrace.h" template List::List() { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; } template List::List(const List& aa) { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; List& a = (List&)aa; if (a.head()) do append(new T((T)(*(a.current_)))); while (a.next()); } // this is needed because of Marker virtual functions template <> List::List(const List& aa) { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; List& a = (List&)aa; if (a.head()) do append(a.current_->dup()); while (a.next()); } // this is needed because of ColorMapInfo virtual functions template <> List::List(const List& aa) { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; List& a = (List&)aa; if (a.head()) do append(a.current_->dup()); while (a.next()); } template List::~List() { T* ptr = head_; while (ptr) { T* tmp = ptr->next(); delete ptr; ptr = tmp; } } template List& List::operator=(const List& aa) { deleteAll(); List& a = (List&)aa; if (a.head()) do append(new T((T)(*(a.current_)))); while (a.next()); return *this; } // this is needed because of Marker virtual functions template <> List& List::operator=(const List& aa) { deleteAll(); List& a = (List&)aa; if (a.head()) do append(a.current_->dup()); while (a.next()); return *this; } // this is needed because of ColorMapInfo virtual functions template <> List& List::operator=(const List& aa) { deleteAll(); List& a = (List&)aa; if (a.head()) do append(a.current_->dup()); while (a.next()); return *this; } template void List::insertHead(T* t) { if (head_ && t) { t->setNext(head_); t->setPrevious(NULL); head_->setPrevious(t); head_ = t; } else { head_ = t; tail_ = t; } current_ = head_; count_++; } template void List::insert(int which, T* t) { head(); for (int i=0; inext(); t->setPrevious(current_); t->setNext(n); current_->setNext(t); if (n) n->setPrevious(t); else tail_ = t; count_++; } } template void List::insertNext(T* c, T* t) { if (c && t) { T* n = c->next(); t->setPrevious(c); t->setNext(n); c->setNext(t); if (n) n->setPrevious(t); else tail_ = t; count_++; } } template void List::insertPrev(T* c, T* t) { if (c && t) { T* p = c->previous(); t->setPrevious(p); t->setNext(c); c->setPrevious(t); if (p) p->setNext(t); else head_ = t; count_++; } } template void List::append(T* p) { if (tail_) { p->setPrevious(tail_); p->setNext(NULL); tail_->setNext(p); tail_ = p; } else { p->setPrevious(NULL); p->setNext(NULL); head_ = p; tail_ = p; } current_ = tail_; count_++; } template void List::deleteAll() { T* ptr = head_; while (ptr) { T* tmp = ptr->next(); delete ptr; ptr = tmp; } head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; } template T* List::pop() { if (tail_) { T* m = tail_; if (tail_ != head_) { T* p = tail_->previous(); p->setNext(NULL); tail_ = p; current_ = p; count_--; } else { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; } return m; } return NULL; } template T* List::fifo() { if (head_) { T* m = head_; if (tail_ != head_) { T* n = head_->next(); n->setPrevious(NULL); head_ = n; current_ = n; count_--; } else { head_ = NULL; tail_ = NULL; current_ = NULL; count_ = 0; } return m; } return NULL; } template T* List::extract() { T* ptr = current_; T* p = ptr->previous(); T* n = ptr->next(); if (p) p->setNext(n); if (n) n->setPrevious(p); if (head_ == ptr) head_ = n; if (tail_ == ptr) tail_ = p; current_ = NULL; count_--; ptr->setNext(NULL); ptr->setPrevious(NULL); return ptr; } template T* List::extractNext(T* ptr) { T* p = ptr->previous(); T* n = ptr->next(); if (p) p->setNext(n); if (n) n->setPrevious(p); if (head_ == ptr) head_ = n; if (tail_ == ptr) tail_ = p; current_ = NULL; count_--; ptr->setNext(NULL); ptr->setPrevious(NULL); return n; } template T* List::extractPrev(T* ptr) { T* p = ptr->previous(); T* n = ptr->next(); if (p) p->setNext(n); if (n) n->setPrevious(p); if (head_ == ptr) head_ = n; if (tail_ == ptr) tail_ = p; current_ = NULL; count_--; ptr->setNext(NULL); ptr->setPrevious(NULL); return p; } template T* List::operator[](int which) { head(); for (int i=0; i int List::index(T* t) { int cnt=0; head(); while (current_) { if (current_ == t) return cnt; cnt++; next(); } return -1; } template void List::transverse(void (*proc)(T*)) { if (head()) do proc(current_); while (next()); } template class List; template class List; template class List; template class List; template class List; template class List; template class List; template class List; template class List; template class List; template class List; saods9/tksao1.0/list/list.h000644 000765 000000 00000002277 12464214757 016047 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __list_h__ #define __list_h__ #include template class List { private: T* head_; T* tail_; int count_; T* current_; public: List(); List(const List&); ~List(); List& operator=(const List&); void insertHead(T*); void insert(int, T*); void insertNext(T*,T*); void insertPrev(T*,T*); void append(T*); T* pop(); T* fifo(); T* extract(); T* extractNext(T*); T* extractPrev(T*); void deleteAll(); T* begin() {return head_;} T* end() {return tail_;} T* head() {return current_ = head_;} T* tail() {return current_ = tail_;} T* next() {return current_ ? current_ = current_->next() : NULL;} int isNext() {return current_->next() ? 1 : 0;} T* previous() {return current_ ? current_ = current_->previous() : NULL;} int isPrevious() {return current_->previous() ? 1 : 0;} T* current() {return current_;} int count() {return count_;} int isEmpty() {return (count_==0) ? 1 : 0;} T* operator[](int i); int index(T*); void transverse(void (*proc)(T*)); }; #endif saods9/tksao1.0/frame/annulus.C000644 000765 000000 00000025272 12537642733 016633 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "annulus.h" #include "fitsimage.h" Annulus::Annulus(Base* p, const Vector& ctr, double r1, double r2, int rn) : BaseEllipse(p, ctr, 0) { numAnnuli_ = rn+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseEllipse(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseEllipse(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn; annuli_ = new Vector[numAnnuli_]; for (int i=0; ioptions->cmdName); addCallBack(CallBack::EDITCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisRadialCB_[1], parent->options->cmdName); } if (analysisRadial_ && !which) { deleteCallBack(CallBack::MOVECB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITCB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisRadialCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisRadialCB_[0]); deleteCallBack(CallBack::DELETECB, analysisRadialCB_[1]); } analysisRadial_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Annulus::analysisRadial(char* xname, char* yname, char* ename, Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; for (int ii=0; iimarkerAnalysisRadial(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, bb, sys); analysisXYEResult(xname, yname, ename, xx, yy, ee, num); } void Annulus::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Annulus::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i][0],sys); str << r; if (i!=numAnnuli_-1) str << ','; } str << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] <<','; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC); str << r << "\""; if (i!=numAnnuli_-1) str << ','; } str << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' ; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC); str << r << "\""; if (i!=numAnnuli_-1) str << ','; } str << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i][0],sys); str << r; if (i!=numAnnuli_-1) str << ','; } str << ')'; } } } listPost(str, conj, strip); } void Annulus::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadiusX(ptr,sys,annuli_,numAnnuli_); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Annulus::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); for (int i=0; imapLenFromRef(annuli_[i][0],Coord::PHYSICAL) << ',' << ptr->mapLenFromRef(annuli_[i+1][0],Coord::PHYSICAL) << ')'; listCiaoPost(str, strip); } } break; default: if (ptr->hasWCSCel(sys)) { char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCMIN) << '\'' << ',' << ptr->mapLenFromRef(annuli_[i+1][0],sys,Coord::ARCMIN) << '\'' << ')'; listCiaoPost(str, strip); } } } } void Annulus::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v; for (int i=0; imapLenFromRef(annuli_[i][0],Coord::IMAGE); str << r << ' '; } } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v[0] << "d " << v[1] <<"d"; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC); str << ' ' << r << '"'; } } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << ra << ' ' << dec; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC); str << ' ' << r << '"'; } } break; } } } listProsPost(str, strip); } void Annulus::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i][0],Coord::IMAGE); str << r; if (i!=numAnnuli_-1) str << ','; } str << ')'; listSAOimagePost(str, strip); } // special composite funtionallity void Annulus::setComposite(const Matrix& mx, double aa) { center *= mx; updateBBox(); } saods9/tksao1.0/frame/annulus.h000644 000765 000000 00000003235 12464214754 016670 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __annulus_h__ #define __annulus_h__ #include "baseellipse.h" class Annulus : public BaseEllipse { public: Annulus(Base* p, const Vector& ctr, double inner, double outer, int num); Annulus(Base* p, const Vector& ctr, double inner, double outer, int num, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Annulus(Base* p, const Vector& ctr, int rn, double* r, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Annulus(const Annulus&); Marker* dup() {return new Annulus(*this);} void edit(const Vector&, int); void editEnd(); int addAnnuli(const Vector&); void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} void analysis(AnalysisTask, int); void analysisRadial(char*, char*, char*, Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listCiao(ostream&, Coord::CoordSystem, int); void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void listSAOimage(ostream&, int); // special composite funtionality void setComposite(const Matrix&, double); }; #endif saods9/tksao1.0/frame/base.C000644 000765 000000 00000151674 12634563034 016060 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "base.h" #include "context.h" #include "fitsimage.h" #include "marker.h" #include "ps.h" #include "tkpostscript.h" #include "circle.h" #include "ellipse.h" #include "box.h" #include "annulus.h" #include "point.h" #include "vect.h" // Debug int DebugAST= 0; int DebugBin= 0; int DebugBlock= 0; int DebugCompress= 0; int DebugCrop= 0; int DebugGZ= 0; int DebugMosaic= 0; int DebugPerf= 0; int DebugRGB= 0; int DebugWCS= 0; // Parser Stuff #undef yyFlexLexer #define yyFlexLexer frFlexLexer #include void* frlval; extern int frparse(Base*, frFlexLexer*); int frlex(void* vval, frFlexLexer* ll) { frlval = vval; return ll ? ll->yylex() : 0; } void frerror(Base* fr, frFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // Base Member Functions Base::Base(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Widget(i, c, item) { nthreads_ = 8; baseXImage = NULL; basePixmap = 0; needsUpdate = NOUPDATE; syncUpdate = 0; currentContext = NULL; keyContext = NULL; keyContextSet =0; orientation = Coord::NORMAL; zoom_ = Vector(1,1); rotation = 0; rotateRotation = 0; preservePan = 0; panPM = 0; panGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); rotateGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); pannerPixmap = 0; pannerXImage = NULL; pannerWidth = 0; pannerHeight = 0; pannerName[0] = '\0'; usePanner = 0; pannerGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetLineAttributes(display, pannerGC, 1, LineSolid, CapButt, JoinMiter); magnifierPixmap = 0; magnifierXImage = NULL; magnifierWidth = 0; magnifierHeight = 0; magnifierZoom_ = 4; magnifierName[0] = '\0'; useMagnifier = 0; useMagnifierGraphics = 1; useMagnifierCursor = 1; magnifierColorName = dupstr("white"); wcsSystem_ = Coord::WCS; wcsSky_ = Coord::FK5; wcsSkyFormat_ = Coord::DEGREES; wcsAlign_ = 0; xySystem_ = Coord::IMAGE; xySky_ = Coord::FK5; wcsOrientation = Coord::NORMAL; wcsRotation = 0; irafAlign_ =1; irafOrientation_ = (Coord::Orientation)-1; maskColorName = dupstr("red"); maskAlpha = 1; maskMark = 1; invert = 0; useHighlite = 0; highliteGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetLineAttributes(display, highliteGC, 2, LineSolid, CapButt, JoinMiter); XSetForeground(display, highliteGC, getColor("blue")); useCrosshair = 0; markerEpsilon = 3; showMarkers = 1; showMarkersText = 1; centroidAuto = 0; centroidIteration = 5; centroidRadius = 10; preserveMarkers = 0; markerGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); markerGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetForeground(display, markerGCXOR, getColor("white")); selectGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetForeground(display, selectGCXOR, getColor("white")); grid = NULL; gridGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); contourGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetLineAttributes(display, contourGC, 1, LineSolid, CapButt, JoinMiter); bgColorName = dupstr("white"); bgColor = getXColor("white"); memset(bgTrueColor_,255,4); nanColorName = dupstr("white"); nanColor = getXColor("white"); memset(nanTrueColor_,255,4); dlist[0] = 8; dlist[1] = 3; colorbartag =NULL; markers = &userMarkers; undoMarkers = &undoUserMarkers; pasteMarkers = &pasteUserMarkers; undoMarkerType = NONE; editMarker = NULL; rotateMarker = NULL; compositeMarker = NULL; imageToData = Translate(-.5, -.5); dataToImage = Translate( .5, .5); inverseScale = NULL; } Base::~Base() { if (basePixmap) Tk_FreePixmap(display, basePixmap); if (baseXImage) XDestroyImage(baseXImage); if (pannerPixmap) Tk_FreePixmap(display, pannerPixmap); if (pannerXImage) XDestroyImage(pannerXImage); if (panPM) Tk_FreePixmap(display, panPM); if (panGCXOR) XFreeGC(display, panGCXOR); if (rotateGCXOR) XFreeGC(display, rotateGCXOR); if (pannerGC) XFreeGC(display, pannerGC); if (magnifierPixmap) Tk_FreePixmap(display, magnifierPixmap); if (magnifierXImage) XDestroyImage(magnifierXImage); if (highliteGC) XFreeGC(display, highliteGC); if (maskColorName) delete [] maskColorName; if (markerGC) XFreeGC(display, markerGC); if (markerGCXOR) XFreeGC(display, markerGCXOR); if (selectGCXOR) XFreeGC(display, selectGCXOR); if (grid) delete grid; if (gridGC) XFreeGC(display, gridGC); if (contourGC) XFreeGC(display, contourGC); if (bgColorName) delete [] bgColorName; if (nanColorName) delete [] nanColorName; if (colorbartag) delete [] colorbartag; if (magnifierColorName) delete [] magnifierColorName; if (inverseScale) delete inverseScale; } void Base::alignIRAF() { if (irafAlign_) { switch (irafOrientation_) { case Coord::NORMAL: irafMatrix_.identity(); break; case Coord::XX: irafMatrix_ = FlipX(); break; case Coord::YY: irafMatrix_ = FlipY(); break; case Coord::XY: irafMatrix_ = FlipXY(); break; default: irafMatrix_.identity(); } } else irafMatrix_.identity(); } void Base::alignWCS() { if (!wcsAlign_ || !context->cfits || !hasWCS(wcsSystem_)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; return; } calcAlignWCS(context->cfits, wcsSystem_, wcsSky_, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation); } void Base::alignWCS(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!wcsAlign_ || !context->cfits || !hasWCS(sys)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; return; } calcAlignWCS(context->cfits, sys, sky, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation); } void Base::alignWCS(FitsImage* ptr, Coord::CoordSystem sys) { if (!wcsAlign_ || !ptr || !context->cfits || !hasWCS(wcsSystem_)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; return; } calcAlignWCS(ptr, context->cfits, sys, wcsSystem_, wcsSky_, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation, &zoom_); } void Base::calcAlignWCS(FitsImage* fits1, Coord::CoordSystem sys1, Coord::SkyFrame sky, Coord::Orientation* orientation, Matrix* oo, double* rotation) { // init *orientation = Coord::NORMAL; oo->identity(); *rotation = 0; if (!fits1 || !fits1->hasWCS(sys1)) return; // orientation *orientation = fits1->getWCSOrientation(sys1,sky); switch (*orientation) { case Coord::NORMAL: oo->identity(); break; case Coord::XX: *oo = FlipX(); break; default: // na break; } // rotation *rotation = fits1->getWCSRotation(sys1,sky); } void Base::calcAlignWCS(FitsImage* fits1, FitsImage* fits2, Coord::CoordSystem sys1, Coord::CoordSystem sys2, Coord::SkyFrame sky, Coord::Orientation* orientation, Matrix* oo, double* rotation, Vector* zoom) { // init *orientation = Coord::NORMAL; oo->identity(); *rotation = 0; if ((!fits1 || !fits2) || (fits1 == fits2) || !(fits1->hasWCS(sys1)) || !(fits2->hasWCS(sys2))) return; Vector org1 = fits1->center(); Vector orval1 = fits1->pix2wcs(org1,sys1,sky); // orientation *orientation = fits2->getWCSOrientation(sys2,sky); switch (*orientation) { case Coord::NORMAL: oo->identity(); break; case Coord::XX: *oo = FlipX(); break; default: // na break; } // rotation Vector orpix = fits2->wcs2pix(orval1, sys2, sky); Vector delta = fits2->getWCScdelt(sys2).abs(); Vector npix = fits2->wcs2pix(Vector(orval1[0],orval1[1]+delta[1]),sys2,sky); Vector north = (npix-orpix).normalize(); Vector epix = fits2->wcs2pix(Vector(orval1[0]+delta[0],orval1[1]),sys2,sky); Vector east = (epix-orpix).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) { *rotation = 0; *orientation = Coord::NORMAL; oo->identity(); return; } if ((fits2->getWCS(sys2))->imflip) *rotation = (north.angle()-M_PI_2); else *rotation = -(north.angle()-M_PI_2); // zoom Vector cd1 = fits1->getWCScdelt(sys1); Vector cd2 = fits2->getWCScdelt(sys2); *zoom = Vector((*zoom)[0]/fabs(cd1[0]/cd2[0]), (*zoom)[1]/fabs(cd1[1]/cd2[1])); } Matrix Base::calcAlignWCS(FitsImage* fits1, FitsImage* fits2, Coord::CoordSystem sys1, Coord::CoordSystem sys2, Coord::SkyFrame sky) { if ((!fits1 || !fits2) || (fits1 == fits2) || !(fits1->hasWCS(sys1)) || !(fits2->hasWCS(sys2))) return Matrix(); Vector org1 = fits1->center(); Vector orval1 = fits1->pix2wcs(org1,sys1,sky); Vector org2 = fits2->center(); Vector orval2 = fits2->pix2wcs(org2,sys2,sky); // orientation Coord::Orientation orientation =Coord::NORMAL; { Coord::Orientation o1 = fits1->getWCSOrientation(sys1,sky); Coord::Orientation o2 = fits2->getWCSOrientation(sys2,sky); switch (o1) { case Coord::NORMAL: { switch (o2) { case Coord::NORMAL: orientation = Coord::NORMAL; break; case Coord::XX: orientation = Coord::XX; break; default: // na break; } } break; case Coord::XX: { switch (o2) { case Coord::NORMAL: orientation = Coord::XX; break; case Coord::XX: orientation = Coord::NORMAL; break; default: // na break; } } break; default: // na break; } } // zoom Vector zoom =Vector(1,1); { Vector cd1 = fits1->getWCScdelt(sys1); Vector cd2 = fits2->getWCScdelt(sys2); zoom = Vector(cd2[0]/cd1[0], cd2[1]/cd1[1]).abs(); } // rotation double rotation =0; { double r1 =0; { Vector orpix = fits1->wcs2pix(orval1, sys1, sky); Vector delta = fits1->getWCScdelt(sys1).abs(); Vector npix = fits1->wcs2pix(Vector(orval1[0],orval1[1]+delta[1]),sys1,sky); Vector north = (npix-orpix).normalize(); Vector epix = fits1->wcs2pix(Vector(orval1[0]+delta[0],orval1[1]),sys1,sky); Vector east = (epix-orpix).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) return Matrix(); if ((fits1->getWCS(sys1))->imflip) r1 = (north.angle()-M_PI_2); else r1 = -(north.angle()-M_PI_2); } double r2 =0; { Vector orpix = fits2->wcs2pix(orval1, sys2, sky); Vector delta = fits2->getWCScdelt(sys2).abs(); Vector npix = fits2->wcs2pix(Vector(orval1[0],orval1[1]+delta[1]),sys2,sky); Vector north = (npix-orpix).normalize(); Vector epix = fits2->wcs2pix(Vector(orval1[0]+delta[0],orval1[1]),sys2,sky); Vector east = (epix-orpix).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) return Matrix(); if ((fits2->getWCS(sys2))->imflip) r2 = north.angle()-M_PI_2; else r2 = -(north.angle()-M_PI_2); } if ((fits1->getWCS(sys1))->imflip) rotation = -(r1-r2); else rotation = r1-r2; } // origin Vector origin; { Vector orpix1 = fits1->wcs2pix(orval2,sys1,sky) * imageToData; Vector orpix2 = fits2->wcs2pix(orval2,sys2,sky) * imageToData; origin = orpix1 - orpix2; } // matrix { Matrix flip; switch (orientation) { case Coord::NORMAL: break; case Coord::XX: flip = FlipX(); break; default: // na break; } Vector orpix2 = fits2->wcs2pix(orval2,sys2,sky) * imageToData; return Translate(-orpix2) * flip * Scale(zoom) * Rotate(rotation) * Translate(orpix2) * Translate(origin); } } double Base::calcZoom(Vector src, Vector dest) { // we need to calculate the width and height of the rotated image // so we can derived a zoom factor to shrink it to fit the requested size Vector cc = src/2.; Vector ll; Vector lr(src[0],0); Vector ur(src); Vector ul(0,src[1]); Matrix mm = Translate(-cc) * Rotate(wcsRotation) * Rotate(rotation); BBox bb(ll*mm); bb.bound(lr*mm); bb.bound(ur*mm); bb.bound(ul*mm); Vector bs = bb.size(); double r0 = dest[0]/bs[0]; double r1 = dest[1]/bs[1]; return r0>r1 ? r1:r0; } void Base::centerImage() { if (!keyContext->fits) { cursor = Vector(); return; } // This is here because we need mapToRef to be up-to-date updateMatrices(); updatePannerMatrices(); // imageCenter is in IMAGE coords Vector aa = imageCenter(keyContext->frScale.scanMode()); // always center to center of pixel, even for even sized image Vector bb = (aa*Translate(.5,.5)).floor(); // cursor is in REF coords cursor = keyContext->fits->mapToRef(bb,Coord::IMAGE,Coord::FK5); } void Base::coordToTclArray(FitsImage* ptr, const Vector3d& vv, Coord::CoordSystem out, Precision pp, const char* var, const char* base) { Vector rr = ptr->mapFromRef(vv, out); doubleToTclArray(rr[0], pp, var, base, "x"); doubleToTclArray(rr[1], pp, var, base, "y"); } void Base::coord3ToTclArray(FitsImage* ptr, const Vector3d& vv, Coord::CoordSystem out, Precision pp, const char* var, const char* base) { double ss = ptr->mapFromRef3axis(((Vector3d&)vv)[2],out,2); doubleToTclArray(ss, pp, var, base, "z"); } int Base::doRender() { return context->cfits ? 1 : 0; } void Base::doubleToTclArray(double d, Precision p, const char* var, const char* base, const char* mod) { ostringstream str; str << base << "," << mod << ends; ostringstream vstr; switch (p) { case DEFAULT: vstr << d << ends; break; case FIXED: vstr << setiosflags(ios::fixed) << setw(9) << setprecision(3) << d << ends; break; case SCIENTIFIC: vstr << setiosflags(ios::scientific) << setprecision(8) << d << ends; break; case INTEGER: vstr << (int)d << ends; break; } Tcl_SetVar2(interp, (char*)var, str.str().c_str(), vstr.str().c_str(), 0); } FitsImage* Base::findFits() { return keyContext->fits; } FitsImage* Base::findFits(Coord::CoordSystem sys, const Vector& vv) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: return findFits(vv); default: if (keyContext->fits && keyContext->fits->hasWCSCel(sys)) return keyContext->fits; else return findFits(vv); } } FitsImage* Base::findFits(const Vector& vv) { FitsImage* ptr = keyContext->fits; while (ptr) { Vector img = vv * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (img[0]>=params->xmin && img[0]xmax && img[1]>=params->ymin && img[1]ymax) return ptr; ptr = ptr->nextMosaic(); } return keyContext->fits; } FitsImage* Base::findFits(int which) { FitsImage* ptr = keyContext->fits; for (int ii=1; iinextMosaic(); return (ptr ? ptr : keyContext->fits); } int Base::findFits(FitsImage* p) { FitsImage* ptr = keyContext->fits; int rr = 0; while (ptr) { rr++; if (ptr == p) return rr; ptr = ptr->nextMosaic(); } return rr; } FitsImage* Base::findAllFits(int which) { // modified for medatacube FitsImage* rr = NULL; FitsImage* ptr = currentContext->fits; while (ptr && which) { FitsImage* sptr = ptr; while (sptr && which) { which--; if (!which) { rr = sptr; break; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } return rr; } int Base::fitsCount() { return currentContext->fitsCount(); } void Base::getInfoClearName(char* var) { Tcl_SetVar2(interp,var,"filename","",0); Tcl_SetVar2(interp,var,"object","",0); Tcl_SetVar2(interp,var,"min","",0); Tcl_SetVar2(interp,var,"max","",0); Tcl_SetVar2(interp,var,"low","",0); Tcl_SetVar2(interp,var,"high","",0); } void Base::getInfoClearValue(char* var) { Tcl_SetVar2(interp,var,"value","",0); Tcl_SetVar2(interp,var,"value,red","",0); Tcl_SetVar2(interp,var,"value,green","",0); Tcl_SetVar2(interp,var,"value,blue","",0); Tcl_SetVar2(interp,var,"image,x","",0); Tcl_SetVar2(interp,var,"image,y","",0); Tcl_SetVar2(interp,var,"image,z","",0); Tcl_SetVar2(interp,var,"physical,x","",0); Tcl_SetVar2(interp,var,"physical,y","",0); Tcl_SetVar2(interp,var,"physical,z","",0); Tcl_SetVar2(interp,var,"amplifier,x","",0); Tcl_SetVar2(interp,var,"amplifier,y","",0); Tcl_SetVar2(interp,var,"amplifier,z","",0); Tcl_SetVar2(interp,var,"detector,x","",0); Tcl_SetVar2(interp,var,"detector,y","",0); Tcl_SetVar2(interp,var,"detector,z","",0); } void Base::getInfoClearWCS(char* var) { for (int ii=0; iirefToData; for (int ii=0; iipix2wcs(uu, www, wcsSky_, wcsSkyFormat_, buff, 128); int argc; const char** argv; Tcl_SplitList(interp, buff, &argc, &argv); if (argc > 0 && argv && argv[0]) Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",x"),argv[0],0); else Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",x"),"",0); if (argc > 1 && argv && argv[1]) Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",y"),argv[1],0); else Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",y"),"",0); // use first slice coord3ToTclArray(ptr,rr,www,FIXED,var,"wcs"); char* wcsname = (char*)sptr->getWCSName(www); if (wcsname) Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",sys"),wcsname,0); else if (argc > 2 && argv && argv[2]) Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",sys"),argv[2],0); else Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",sys"),"",0); Tcl_Free((char*)argv); } else { Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",x"),"",0); Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",y"),"",0); Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",z"),"",0); Tcl_SetVar2(interp,var,varcat(buf,(char*)"wcs",ww,(char*)",sys"),"",0); } } } int Base::hasATMV() { return currentContext->cfits && currentContext->cfits->hasATMV(); } int Base::hasContour() { return currentContext->hasContour(); } int Base::hasContourAux() { return currentContext->hasContourAux(); } int Base::hasDTMV() { return currentContext->cfits && currentContext->cfits->hasDTMV(); } int Base::hasLTMV() { return currentContext->cfits && currentContext->cfits->hasLTMV(); } int Base::hasWCS(Coord::CoordSystem sys) { return currentContext->cfits && currentContext->cfits->hasWCS(sys); } int Base::hasWCSEqu(Coord::CoordSystem sys) { return currentContext->cfits && currentContext->cfits->hasWCSEqu(sys); } int Base::hasWCSCel(Coord::CoordSystem sys) { return currentContext->cfits && currentContext->cfits->hasWCSCel(sys); } int Base::hasWCSx(Coord::CoordSystem sys) { return currentContext->cfits && currentContext->cfits->hasWCSx(sys,2); } Vector Base::imageCenter(FrScale::ScanMode mode) { return imageBBox(mode).center(); } Vector Base::imageSize(FrScale::ScanMode mode) { return imageBBox(mode).size(); } BBox Base::imageBBox(FrScale::ScanMode mode) { // returns imageBBox in IMAGE coords // params are in DATA coords and extends edge to edge BBox rr; int first=1; FitsImage* ptr = context->fits; while (ptr) { FitsBound* params = ptr->getDataParams(mode); Matrix mm = ptr->wcsToRef() * dataToImage; Vector aa = Vector(params->xmin,params->ymin) * mm; if (first) { rr = BBox(aa,aa); first = 0; } else rr.bound(aa); rr.bound(Vector(params->xmax,params->ymin) * mm); rr.bound(Vector(params->xmax,params->ymax) * mm); rr.bound(Vector(params->xmin,params->ymax) * mm); ptr = ptr->nextMosaic(); } return rr; } int Base::isIIS() { return 0; } int Base::isCube() { return currentContext->isCube(); } int Base::isBinTable() { return (currentContext->fits && currentContext->fits->isBinTable()) ? 1 : 0; } int Base::isMosaic() { return currentContext->isMosaic(); } FitsImage* Base::isInFits(const Vector& vv, Coord::InternalSystem ref, Vector* rv) { Vector ss = mapToRef(vv,ref); FitsImage* ptr = currentContext->fits; while (ptr) { Vector rr = ss * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (rr[0]>=params->xmin && rr[0]xmax && rr[1]>=params->ymin && rr[1]ymax) { if (rv) *rv = rr; return ptr; } ptr = ptr->nextMosaic(); } return NULL; } FitsImage* Base::isInCFits(const Vector& vv, Coord::InternalSystem ref, Vector* rv) { Vector ss = mapToRef(vv,ref); FitsImage* ptr = currentContext->cfits; while (ptr) { Vector rr = ss * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (rr[0]>=params->xmin && rr[0]xmax && rr[1]>=params->ymin && rr[1]ymax) { if (rv) *rv = rr; return ptr; } ptr = ptr->nextMosaic(); } return NULL; } void Base::invalidPixmap() { Widget::invalidPixmap(); if (basePixmap) Tk_FreePixmap(display, basePixmap); basePixmap = 0; if (baseXImage) XDestroyImage(baseXImage); baseXImage = NULL; needsUpdate = MATRIX; } Coord::Orientation Base::IRAFOrientation(Coord::Orientation oo) { if (irafOrientation_ == (Coord::Orientation)-1) { irafOrientation_ = oo; alignIRAF(); } return irafOrientation_; } int Base::parse(istringstream& istr) { result = TCL_OK; frFlexLexer* ll = new frFlexLexer(&istr); frparse(this, ll); delete ll; return result; } int Base::postscriptProc(int prepass) { if (!visible) return TCL_OK; if (prepass) return TCL_OK; ps(); switch (psLevel) { case 1: switch (psColorSpace) { case BW: case GRAY: if (grid) grid->ps(GRAY); psContours(GRAY); if (showMarkers) { psMarkers(&catalogMarkers, GRAY); psMarkers(&userMarkers, GRAY); } psMarkers(&analysisMarkers, GRAY); psCrosshair(GRAY); psGraphics(GRAY); break; case RGB: case CMYK: if (grid) grid->ps(RGB); psContours(RGB); if (showMarkers) { psMarkers(&catalogMarkers, RGB); psMarkers(&userMarkers, RGB); } psMarkers(&analysisMarkers, RGB); psCrosshair(RGB); psGraphics(RGB); break; } break; case 2: case 3: if (grid) grid->ps(psColorSpace); psContours(psColorSpace); if (showMarkers) { psMarkers(&catalogMarkers, psColorSpace); psMarkers(&userMarkers, psColorSpace); } psMarkers(&analysisMarkers, psColorSpace); psCrosshair(psColorSpace); psGraphics(psColorSpace); break; } return TCL_OK; } void Base::printCoordSystem(Coord::CoordSystem sys) { Tcl_AppendResult(interp, coord.coordSystemStr(sys), NULL); } void Base::printDouble(double d, Precision p) { ostringstream str; switch (p) { case DEFAULT: str << d << ends; break; case FIXED: str << setiosflags(ios::fixed) << setw(9) << setprecision(3) << d << ends; break; case SCIENTIFIC: str << setiosflags(ios::scientific) << setprecision(8) << d << ends; break; case INTEGER: str << (int)d << ends; break; } Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::printInteger(int i) { ostringstream str; str << i << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::printSkyFrame(Coord::SkyFrame sky) { Tcl_AppendResult(interp, coord.skyFrameStr(sky), NULL); } void Base::printSkyFormat(Coord::SkyFormat format) { Tcl_AppendResult(interp, coord.skyFormatStr(format), NULL); } void Base::printSkyDist(Coord::SkyDist dist) { Tcl_AppendResult(interp, coord.skyDistStr(dist), NULL); } void Base::printVector(const Vector& v, Precision p) { ostringstream str; switch (p) { case DEFAULT: str << setprecision(8) << v << ends; break; case FIXED: str << setiosflags(ios::fixed) << setw(9) << setprecision(3) << v << ends; break; case SCIENTIFIC: str << setiosflags(ios::scientific) << setprecision(8) << v << ends; break; case INTEGER: { Vector z = v; str << z.round() << ends; break; } } Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::printVector(const Vector3d& v, Precision p) { ostringstream str; switch (p) { case DEFAULT: str << setprecision(8) << v << ends; break; case FIXED: str << setiosflags(ios::fixed) << setw(9) << setprecision(3) << v << ends; break; case SCIENTIFIC: str << setiosflags(ios::scientific) << setprecision(8) << v << ends; break; case INTEGER: { Vector z = v; str << z.round() << ends; break; } } Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::printFromRef(FitsImage* ptr, const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Precision p) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: printVector(ptr->mapFromRef(v, sys, sky), p); return; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: printVector(ptr->mapFromRef(v, sys, sky), p); break; case Coord::SEXAGESIMAL: { char buf[64]; buf[0] = '\0'; ptr->mapFromRef(v, sys, sky, format, buf, 64); // grap only the first two items char* ptr = buf; while (*ptr) ptr++; while (*ptr != ' ' && ptr >= buf) ptr--; *ptr = '\0'; Tcl_AppendResult(interp, buf, " ", NULL); } break; } } else printVector(ptr->mapFromRef(v, sys), p); } else printVector(Vector(),p); return; } } void Base::ps() { Vector org = psOrigin(); if (currentContext->fits) { Tcl_AppendResult(interp, "gsave\n", NULL); TkPostscriptInfo* psInfo = (TkPostscriptInfo*)(((TkCanvas*)canvas)->psInfo); double ss = psInfo->scale * psResolution / 72.; int ww = options->width*ss; int hh = options->height*ss; { ostringstream str; str << org[0] << ' ' << org[1] << " translate" << endl << setprecision(12) << 1/ss << ' ' << 1/ss << " scale" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } switch (psLevel) { case 1: { psHead1(ww, hh); NoCompressAsciiHex filter(psLevel); psImage(filter, psColorSpace, ww, hh, ss); } break; case 2: { psHead2(ww, hh, "RunLength", "ASCII85"); RLEAscii85 filter(psLevel); psImage(filter, psColorSpace, ww, hh, ss); } break; case 3: { psHead2(ww, hh, "Flate", "ASCII85"); GZIPAscii85 filter(psLevel); psImage(filter, psColorSpace, ww, hh, ss); } break; } Tcl_AppendResult(interp, "grestore\n", NULL); } // Markers & Contours & Grids clip path { ostringstream str; str << org[0] << ' ' << org[1] << ' ' << options->width << ' ' << options->height << " rectclip" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::psContours(PSColorSpace cs) { // render back to front // aux contours Contour* ptr=currentContext->auxcontours.tail(); while (ptr) { ptr->ps(cs); ptr=ptr->previous(); } // main contour if (hasContour()) currentContext->contour->ps(cs); } void Base::psCrosshair(PSColorSpace mode) { if (!useCrosshair) return; Vector rr = mapFromRef(crosshair, Coord::WIDGET); Vector aa = Vector(rr[0],1) * widgetToCanvas; Vector bb = Vector(rr[0],options->height) * widgetToCanvas; Vector cc = Vector(1,rr[1]) * widgetToCanvas; Vector dd = Vector(options->width,rr[1]) * widgetToCanvas; { ostringstream str; switch ((PSColorSpace)mode) { case BW: case GRAY: psColorGray(getXColor("green"), str); str << " setgray"; break; case RGB: psColorRGB(getXColor("green"), str); str << " setrgbcolor"; break; case CMYK: psColorCMYK(getXColor("green"), str); str << " setcmykcolor"; break; } str << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } { ostringstream str; str << 1 << " setlinewidth" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } { ostringstream str; str << "newpath " << aa.TkCanvasPs(canvas) << "moveto" << bb.TkCanvasPs(canvas) << "lineto" << " stroke" << endl << "newpath " << cc.TkCanvasPs(canvas) << "moveto" << dd.TkCanvasPs(canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::psImage(Filter& filter, PSColorSpace mode, int width, int height, float scale) { pushPSMatrices(scale, width, height); unsigned char* img = fillImage(width, height, Coord::PS); if (!img) return; unsigned char* ptr = img; for (long jj=0; jjfits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMatrices(rgbToRef, refToUser, userToWidget, widgetToCanvas, canvasToWindow); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Base::pushMagnifierMatrices() { FitsImage* ptr = context->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMagnifierMatrices(refToMagnifier); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Base::pushPannerMatrices() { FitsImage* ptr = context->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updatePannerMatrices(refToPanner); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Base::pushPSMatrices(float scale, int width, int height) { Matrix mx = psMatrix(scale, width, height); FitsImage* ptr = context->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updatePS(mx); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Base::reset() { if (!preservePan) centerImage(); crosshair = cursor; invert = 0; orientation = Coord::NORMAL; orientationMatrix.identity(); zoom_ = Vector(1,1); rotation = 0; wcsAlign_ = 0; wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; unselectMarkers(&userMarkers); unselectMarkers(&catalogMarkers); unselectMarkers(&analysisMarkers); update(MATRIX); } FrScale::ScanMode Base::scanMode() { return currentContext->frScale.scanMode(); } void Base::resetScanMode() { currentContext->frScale.resetScanMode(); } void Base::setScanMode(FrScale::ScanMode mode) { currentContext->frScale.setScanMode(mode); } // backward compatibility void Base::setScanModeIncr(LoadMethod lm) { switch (lm) { case LOADALL: // do nothing (leave the current setting), will use incr end to reset break; case INCR: currentContext->frScale.setScanMode(FrScale::CROPSEC); break; } } void Base::setSlice(int id, int ss) { // real work done in derived classes updateMarkers(&userMarkers); updateMarkers(&catalogMarkers); updateMarkers(&analysisMarkers); // execute any update callbacks updateCBMarkers(&userMarkers); updateCBMarkers(&catalogMarkers); updateCBMarkers(&analysisMarkers); } void Base::unloadAllFits() { unloadFits(); } void Base::unloadFits() { if (DebugPerf) cerr << "Base::unloadFits()" << endl; if (!preserveMarkers) { // delete markers userMarkers.deleteAll(); undoUserMarkers.deleteAll(); pasteUserMarkers.deleteAll(); } catalogMarkers.deleteAll(); undoCatalogMarkers.deleteAll(); pasteCatalogMarkers.deleteAll(); analysisMarkers.deleteAll(); undoAnalysisMarkers.deleteAll(); pasteAnalysisMarkers.deleteAll(); if (grid) delete grid; grid = NULL; irafOrientation_ = (Coord::Orientation)-1; irafMatrix_.identity(); updateColorScale(); } void Base::update(UpdateType flag) { if (DebugPerf) cerr << "Base::update(" << flag << ')' << endl; // Be careful, someone may have already set the flag at a lower level // therefor, only change the flag if we need more to be done if (flag < needsUpdate) needsUpdate = flag; redraw(); } void Base::update(UpdateType flag, BBox bb) { if (DebugPerf) cerr << "Base::update(" << flag << ' ' << bb << ')' << endl; // bb is in canvas coords if (flag < needsUpdate) needsUpdate = flag; redraw(bb); } void Base::updateBase() { if (DebugPerf) cerr << "Base::updateBase()..."; int& width = options->width; int& height = options->height; if (!basePixmap) { if (!(basePixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), width, height, depth))){ internalError("Unable to Create Pixmap"); return; } // Geometry has changed, redefine our marker GCs including clip regions updateGCs(); } if (!baseXImage) { if (!(baseXImage = XGetImage(display, basePixmap, 0, 0, width, height, AllPlanes, ZPixmap))) { internalError("Unable to Create XImage"); return; } // we have to wait until now, since the encodings depend on baseXImage encodeTrueColor(baseXImage->byte_order, baseXImage->bits_per_pixel); encodeTrueColor(bgColor, bgTrueColor_); encodeTrueColor(nanColor, nanTrueColor_); // we have a race condition. Some Truecolor ColorScales need to know the // bytes per pixel, RGB masks, and byte order, from XImage struct. // yet, we receive colormap commands well before we render to the // screen and have a valid XImage. // So, we put off creating a colorscale until we are ready to render. if (!validColorScale()) updateColorScale(); } if (doRender()) ximageToPixmap(basePixmap, baseXImage, Coord::WIDGET); else { XSetForeground(display, gc, getColor(bgColorName)); XFillRectangle(display, basePixmap, gc, 0,0,options->width,options->height); } if (DebugPerf) cerr << "end" << endl; } void Base::updateBin(const Matrix& mx) { if (keyContext->fits && (keyContext->fits == currentContext->fits)) { crosshair *= mx; currentContext->updateContours(mx); updateMarkerCoords(&userMarkers, mx); updateMarkerCoords(&catalogMarkers, mx); updateMarkerCoords(&analysisMarkers, mx); } alignWCS(); updateColorScale(); updateNow(MATRIX); // because we have changed zoom // update markers call backs // wait til matrices have been updated so that any dialogs will print // the correct coords updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::updateBlock(const Vector& vv) { Scale mx(vv); if (keyContext->fits && (keyContext->fits == currentContext->fits)) { cursor *= mx; crosshair *= mx; currentContext->updateContours(mx); updateMarkerCoords(&userMarkers, mx); updateMarkerCoords(&catalogMarkers, mx); updateMarkerCoords(&analysisMarkers, mx); } alignWCS(); updateColorScale(); updateNow(MATRIX); // update markers call backs // wait til matrices have been updated so that any dialogs will print // the correct coords updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::updateGCs() { // widget clip region BBox bbWidget = BBox(0, 0, options->width, options->height); Vector sizeWidget = bbWidget.size(); rectWidget[0].x = (int)bbWidget.ll[0]; rectWidget[0].y = (int)bbWidget.ll[1]; rectWidget[0].width = (int)sizeWidget[0]; rectWidget[0].height = (int)sizeWidget[1]; // window clip region BBox bbWindow = bbWidget * widgetToWindow; Vector sizeWindow = bbWindow.size(); rectWindow[0].x = (int)bbWindow.ll[0]; rectWindow[0].y = (int)bbWindow.ll[1]; rectWindow[0].width = (int)sizeWindow[0]; rectWindow[0].height = (int)sizeWindow[1]; // highliteGC XSetClipRectangles(display, highliteGC, 0, 0, rectWidget, 1, Unsorted); // panGCXOR XSetClipRectangles(display, panGCXOR, 0, 0, rectWindow, 1, Unsorted); // rotateGCXOR XSetClipRectangles(display, rotateGCXOR, 0, 0, rectWindow, 1, Unsorted); // markerGC XSetClipRectangles(display, markerGC, 0, 0, rectWidget, 1, Unsorted); XSetClipRectangles(display, markerGCXOR, 0, 0, rectWindow, 1, Unsorted); // selectGC x11Dash(selectGCXOR,1); XSetClipRectangles(display, selectGCXOR, 0, 0, rectWindow, 1, Unsorted); // gridGC XSetClipRectangles(display, gridGC, 0, 0, rectWidget, 1, Unsorted); // contourGC XSetClipRectangles(display, contourGC, 0, 0, rectWidget, 1, Unsorted); } void Base::updateMagnifier() { updateMagnifier(magnifierCursor); } void Base::updateMagnifier(const Vector& vv) { // vv is in CANVAS coords // save it, we may need it later magnifierCursor = vv; if (!(magnifierXImage && magnifierPixmap)) return; if (useMagnifier) { updateMagnifierMatrices(); if (doRender()) { ximageToPixmapMagnifier(); if (useMagnifierGraphics) { // render markers // markers bounding box is in canvas coords // map the magnifier to a bounding box in canvas coords Matrix mm = magnifierToRef * refToCanvas; Vector ll = Vector(0,0) * mm; Vector ur = Vector(magnifierWidth,magnifierHeight) * mm; BBox bb = BBox(vv,vv); bb.bound(ll); bb.bound(ur); if (showMarkers) { x11MagnifierMarkers(&userMarkers, bb); x11MagnifierMarkers(&catalogMarkers, bb); } x11MagnifierMarkers(&analysisMarkers, bb); // render crosshair if (useCrosshair) x11Crosshair(magnifierPixmap, Coord::MAGNIFIER, magnifierWidth, magnifierHeight); // render contours x11Contours(magnifierPixmap, Coord::MAGNIFIER, magnifierWidth, magnifierHeight); } // render cursor if (useMagnifierCursor) x11MagnifierCursor(vv); } else { XSetForeground(display, gc, getColor(bgColorName)); XFillRectangle(display, magnifierPixmap, gc, 0, 0, magnifierXImage->width, magnifierXImage->height); } // notify the magnifier widget ostringstream str; str << magnifierName << " update " << (void*)magnifierPixmap << ends; Tcl_Eval(interp, str.str().c_str()); } } void Base::updateMatrices() { // refToUser // flip y axis for X Windows refToUser = Translate(-cursor) * FlipY() * irafMatrix_; userToRef = refToUser.invert(); // userToWidget userToWidget = wcsOrientationMatrix * // flip x/y axis about center orientationMatrix * // flip x/y axis about cursor position Rotate(wcsRotation) * // rotate about center position Rotate(rotation) * // rotate about cursor position Scale(zoom_) * // scale about cursor position // must be int to align with screen pixels Translate((int)(options->width/2.), (int)(options->height/2.)); widgetToUser = userToWidget.invert(); // widgetToCanvas widgetToCanvas = Translate(originX, originY); canvasToWidget = widgetToCanvas.invert(); // canvasToWindow short xx, yy; Tk_CanvasWindowCoords(canvas, 0, 0, &xx, &yy); canvasToWindow = Translate(xx, yy); windowToCanvas = canvasToWindow.invert(); // These are derived Transformation Matrices refToWidget = refToUser * userToWidget; widgetToRef = refToWidget.invert(); refToCanvas = refToWidget * widgetToCanvas; canvasToRef = refToCanvas.invert(); refToWindow = refToCanvas * canvasToWindow; windowToRef = refToWindow.invert(); userToCanvas = userToWidget * widgetToCanvas; canvasToUser = userToCanvas.invert(); widgetToWindow = widgetToCanvas * canvasToWindow; windowToWidget = widgetToWindow.invert(); // Markers updateMarkers(&userMarkers); updateMarkers(&catalogMarkers); updateMarkers(&analysisMarkers); pushMatrices(); } void Base::updateMagnifierMatrices() { // magnifierCursor is in CANVAS Vector ww = magnifierCursor*canvasToRef; // refToUser Matrix refToUser; refToUser = Translate(-ww) * FlipY() * irafMatrix_; // userToMagnifier userToMagnifier = wcsOrientationMatrix * // flip x/y axis about center orientationMatrix * // flip x/y axis about cursor position Rotate(wcsRotation) * // rotate about center position Rotate(rotation) * // rotate about cursor position Scale(zoom_) * // scale about cursor position Scale(magnifierZoom_) * // scale // must be int to align with screen pixels Translate((int)(magnifierWidth/2.), (int)(magnifierHeight/2.)); magnifierToUser = userToMagnifier.invert(); refToMagnifier = refToUser * userToMagnifier; magnifierToRef = refToMagnifier.invert(); magnifierToWidget = magnifierToUser * userToWidget; widgetToMagnifier = magnifierToWidget.invert(); pushMagnifierMatrices(); } void Base::updatePannerMatrices() { Vector center = imageCenter(FrScale::IMGSEC) * imageToData; // refToUser Matrix refToUser; refToUser = Translate(-center) * FlipY() * irafMatrix_; userToRef = refToUser.invert(); // userToPanner userToPanner = wcsOrientationMatrix * // flip x/y axis about center orientationMatrix * // flip x/y axis about cursor position Rotate(wcsRotation) * // rotate about center position Rotate(rotation) * // rotate about cursor position Scale(calcZoomPanner()) * // must be int to align with screen pixels Translate((int)(pannerWidth/2.), (int)(pannerHeight/2.)); pannerToUser = userToPanner.invert(); refToPanner = refToUser * userToPanner; pannerToRef = refToPanner.invert(); pannerToWidget = pannerToRef * refToWidget; widgetToPanner = pannerToWidget.invert(); pushPannerMatrices(); } void Base::updateNow(UpdateType flag) { if (DebugPerf) cerr << "Base::updateNow(" << flag << ')' << endl; if (flag < needsUpdate) needsUpdate = flag; redrawNow(); } void Base::updateNow(UpdateType flag, BBox bb) { if (DebugPerf) cerr << "Base::updateNow(" << flag << ',' << bb << ')' << endl; // bb is in canvas coords if (flag < needsUpdate) needsUpdate = flag; redrawNow(bb); } void Base::updatePanner() { if (usePanner) { if (doRender()) ximageToPixmap(pannerPixmap, pannerXImage, Coord::PANNER); else { XSetForeground(display, pannerGC, getColor(bgColorName)); XFillRectangle(display, pannerPixmap, pannerGC, 0, 0, pannerWidth, pannerHeight); } } } int Base::updatePixmap(const BBox& bb) { // bbox is in canvas coords // Note: lack of breaks-- on purpose. // If Matrices are update, both Base and Pixmap // also need to be updated. Same for Base-- ie, pixmap is also updated. switch (needsUpdate) { case NOUPDATE: break; case MATRIX: updateMatrices(); updatePannerMatrices(); case BASE: updateBase(); updatePanner(); case PIXMAP: updatePM(bb); break; } needsUpdate = NOUPDATE; return TCL_OK; } void Base::updatePM(const BBox& bbox) { // bbox is in Canvas Coords if (DebugPerf) cerr << "Base::updatePM()..."; int& width = options->width; int& height = options->height; if (!pixmap) { if (!(pixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), width, height, depth))) { internalError("Unable to Create Pixmap"); return; } } if (!bbox.isEmpty()) { BBox bb = bbox * canvasToWidget; int x0 = (int)bb.ll[0] > 0 ? (int)bb.ll[0] : 0; int y0 = (int)bb.ll[1] > 0 ? (int)bb.ll[1] : 0; int x1 = (int)bb.ur[0] < width ? (int)bb.ur[0] : width; int y1 = (int)bb.ur[1] < height ? (int)bb.ur[1] : height; int sx = x1-x0; int sy = y1-y0; if (DebugPerf) cerr << ' ' << x0 << ' ' << y0 << ' ' << x1 << ' ' << y1 << ' '; XCopyArea(display, basePixmap, pixmap, gc, x0, y0, sx, sy, x0, y0); } // grid if (grid) grid->x11(); // contours x11Contours(pixmap, Coord::WIDGET, options->width, options->height); // markers if (showMarkers) { x11Markers(&catalogMarkers, bbox); x11Markers(&userMarkers, bbox); } x11Markers(&analysisMarkers, bbox); // crosshair x11Crosshair(pixmap, Coord::WIDGET, options->width, options->height); // highlite bbox x11Graphics(); if (DebugPerf) cerr << "end" << endl; } char* Base::varcat(char* buf, char* base, char id, char* mod) { int ll = strlen(base); strcpy(buf,base); buf[ll++] = id; buf[ll++] = '\0'; strcat(buf,mod); return buf; } void Base::x11Contours(Pixmap pm, Coord::InternalSystem sys, int width, int height) { // render from back to front // aux contours Contour* ptr=currentContext->auxcontours.tail(); while (ptr) { ptr->render(pm, sys, width, height); ptr=ptr->previous(); } // main contour if (hasContour()) currentContext->contour->render(pm, sys, width, height); } void Base::x11Crosshair(Pixmap pm, Coord::InternalSystem sys, int width, int height) { if (useCrosshair) { Vector rr = mapFromRef(crosshair,sys); XSetForeground(display, gc, getColor("green")); if (rr[0]>=0 && rr[0]=0 && rr[1]width-2, options->height-2); } void Base::ximageToPixmap(Pixmap pmap, XImage* xmap, Coord::InternalSystem sys) { buildXImage(xmap, sys); TkPutImage(NULL, 0, display, pmap, gc, xmap, 0, 0, 0, 0, xmap->width, xmap->height); } void Base::ximageToPixmapMagnifier() { ximageToPixmap (magnifierPixmap, magnifierXImage, Coord::MAGNIFIER); } #ifdef MAC_OSX_TK void Base::macosx() { // clip rect XRectangle* rr = rectWidget; Vector v1 = Vector(rr->x, rr->y) * widgetToCanvas; Vector v2 = Vector(rr->x+rr->width, rr->y+rr->height) * widgetToCanvas; macosxClip(v1,v2-v1); if (currentContext->fits) { // scale double scale = 150 / 72.; int width = options->width*scale; int height = options->height*scale; // image macosxImage(scale, width, height, v1, v2-v1); } } void Base::macosxContours() { // render back to front // aux contours Contour* ptr=currentContext->auxcontours.tail(); while (ptr) { ptr->macosx(); ptr=ptr->previous(); } // main contour if (hasContour()) currentContext->contour->macosx(); } void Base::macosxCrosshair() { if (!useCrosshair) return; Vector rr = mapFromRef(crosshair,Coord::WIDGET); Vector aa = Vector(rr[0],1) * widgetToCanvas; Vector bb = Vector(rr[0],options->height) * widgetToCanvas; Vector cc = Vector(1,rr[1]) * widgetToCanvas; Vector dd = Vector(options->width,rr[1]) * widgetToCanvas; macosxColor(getXColor("green")); macosxWidth(1); macosxDrawLine(aa,bb); macosxDrawLine(cc,dd); } void Base::macosxImage(float scale, int width, int height, const Vector& v, const Vector& s) { // we need a colorScale before we can render if (!validColorScale()) return; pushPSMatrices(scale, width, height); // source unsigned char* src = fillImage(width, height, Coord::PS); if (!src) return; // destination unsigned char* dst = new unsigned char[width*height*4]; if (!dst) return; unsigned char* sptr = src; unsigned char* dptr = dst; for (int ii=0; iimacosx(); // contours macosxContours(); // markers if (showMarkers) { macosxMarkers(&catalogMarkers); macosxMarkers(&userMarkers); } macosxMarkers(&analysisMarkers); macosxCrosshair(); macosxGraphics(); // cleanup macosxEnd(); } #endif #ifdef __WIN32 void Base::win32() { // clip rect XRectangle* rr = rectWidget; Vector v1 = Vector(rr->x, rr->y) * widgetToCanvas; Vector v2 = Vector(rr->x+rr->width, rr->y+rr->height) * widgetToCanvas; win32Clip(v1,v2-v1); if (currentContext->fits) { // scale double scale = 1.0; int width = options->width*scale; int height = options->height*scale; // image win32Image(scale, width, height, v1, v2-v1); } } void Base::win32Contours() { // render back to front // aux contours Contour* ptr=currentContext->auxcontours.tail(); while (ptr) { ptr->win32(); ptr=ptr->previous(); } // main contour if (hasContour()) currentContext->contour->win32(); } void Base::win32Crosshair() { if (!useCrosshair) return; Vector rr = mapFromRef(crosshair,Coord::WIDGET); Vector aa = Vector(rr[0],1) * widgetToCanvas; Vector bb = Vector(rr[0],options->height) * widgetToCanvas; Vector cc = Vector(1,rr[1]) * widgetToCanvas; Vector dd = Vector(options->width,rr[1]) * widgetToCanvas; win32Color(getXColor("green")); win32Width(1); win32Dash(NULL,0); win32DrawLine(aa,bb); win32DrawLine(cc,dd); } void Base::win32Image(float scale, int width, int height, const Vector& v, const Vector& s) { // we need a colorScale before we can render if (!validColorScale()) return; pushPSMatrices(scale, width, height); // source unsigned char* src = fillImage(width, height, Coord::PS); if (!src) return; // destination (width must be aligned on 4-byte DWORD boundary) int jjwidth=(((width+3)/4)*4); // extra alignment padding which we have to skip over for each row int jjpad=(jjwidth-width)*3; unsigned char* dst = new unsigned char[jjwidth*height*3]; if (!dst) return; memset(dst, '\0', jjwidth*height*3); unsigned char* sptr = src; unsigned char* dptr = dst; unsigned char red, green, blue; for (int jj=0; jjwin32(); // contours win32Contours(); // markers if (showMarkers) { win32Markers(&userMarkers); win32Markers(&catalogMarkers); } win32Markers(&AnalysisMarkers); win32Crosshair(); win32Graphics(); // cleanup win32End(); } #endif saods9/tksao1.0/frame/base.h000644 000765 000000 00000205460 12631357025 016114 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __base_h__ #define __base_h__ #include "widget.h" #include "vector3d.h" #include "callback.h" #include "fvcontour.h" #include "frscale.h" #include "grid2d.h" #include "grid25d.h" #include "grid3d.h" #include "hist.h" #include "inversescale.h" #include "list.h" #include "tag.h" #include "util.h" #include "point.h" extern int DebugAST; extern int DebugMosaic; extern int DebugPerf; extern int DebugWCS; extern int DebugBin; extern int DebugBlock; extern int DebugCompress; extern int DebugCrop; extern int DebugGZ; extern int DebugRGB; #define DEFAULTLOW 0 #define DEFAULTHIGH 100 #define HISTEQUSIZE 16384 // WCS ' ','A' to 'Z', WCS0 #define MULTWCS 27 #define MULTWCSA 28 #define SCALESIZE 16384 class Attribute; class BaseBox; class BaseEllipse; class BaseMarker; class Composite; class Context; class Contour; class Filter; class FitsImage; class FitsMask; class FVContour; class Grid; class Grid2d; class Grid25d; class Grid3d; class Marker; class Annulus; class Box; class BoxAnnulus; class Bpanda; class Circle; class Compass; class Contour; class Cpanda; class Ellipse; class EllipseAnnulus; class Epanda; class Line; class Point; class Projection; class Polygon; class Ruler; class Segment; class Text; class Vect; class Base : public Widget { friend class Attribute; friend class BaseBox; friend class BaseEllipse; friend class BaseLine; friend class BaseMarker; friend class Composite; friend class Context; friend class Contour; friend class FitsImage; friend class FitsMask; friend class FVContour; friend class Grid; friend class Grid2d; friend class Grid25d; friend class Grid3d; friend class Marker; friend class Annulus; friend class Box; friend class BoxAnnulus; friend class Bpanda; friend class Circle; friend class Compass; friend class Cpanda; friend class Ellipse; friend class EllipseAnnulus; friend class Epanda; friend class Line; friend class Point; friend class Projection; friend class Polygon; friend class Ruler; friend class Segment; friend class Text; friend class Vect; public: enum CompressType {NOCOMPRESS, GZ}; enum FileNameType {ROOTBASE, FULLBASE, ROOT, FULL}; enum MarkerFormat {DS9, XML, CIAO, SAOTNG, SAOIMAGE, PROS, RAWXY}; enum MarkerLayer {USER, TEMPLATE, CATALOG, ANALYSIS}; enum ShmType {SHMID,KEY}; enum UndoMarkerType {NONE, MOVE, EDIT, DELETE}; enum UpdateType {MATRIX, BASE, PIXMAP, NOUPDATE}; enum MemType {ALLOC, ALLOCGZ, CHANNEL, MMAP, SMMAP, MMAPINCR, SHARE, SSHARE, SOCKET, SOCKETGZ, VAR, HIST, POST, PHOTO}; enum MosaicType {NOMOSAIC, IRAF, WCSMOSAIC, WFPC2}; enum LayerType {IMG, MASK}; enum LoadMethod {LOADALL, INCR}; enum Precision {DEFAULT, FIXED, SCIENTIFIC, INTEGER}; private: InverseScale* inverseScale; protected: Context* context; int nthreads_; List* markers; // pointer to current marker stack List* undoMarkers; // pointer to current marker stack List* pasteMarkers;// pointer to current marker stack List userMarkers; // foreground marker stack List undoUserMarkers; // remember marker to undo List pasteUserMarkers; // cut/copy/paste List catalogMarkers; // background marker stack List undoCatalogMarkers; // remember marker to undo List pasteCatalogMarkers; // cut/copy/paste List analysisMarkers; // background marker stack List undoAnalysisMarkers; // remember marker to undo List pasteAnalysisMarkers; // cut/copy/paste UndoMarkerType undoMarkerType; // type Vector markerBegin; // marker move begin in image coords Marker* editMarker; // pointer to marker currently being edited Marker* rotateMarker; // pointer to marker currently being rotated Vector regionBegin; // select region begin in canvas coords Vector regionEnd; // select region end in canvas coords Composite* compositeMarker; // pointer to current composite marker Vector cursor; // current cursor position in REF coords Vector crosshair; // crosshair location in REF coords XImage* baseXImage; // ximage of image Pixmap basePixmap; // pixmap of image UpdateType needsUpdate; // updateFlags int syncUpdate; // update 3d syncronously Context* currentContext; Context* keyContext; int keyContextSet; Coord::Orientation orientation; // current image orientation Matrix orientationMatrix; // current image orientation matrix double rotation; // current image rotation angle double rotateRotation; // tmp cursor for interactive rotation int preservePan; // flag to indicate preserve between loads Vector zoom_; // current image zoom value Pixmap panPM; // tmp pixmap for pan motion Vector panCursor; // cursor for interactive panning GC panGCXOR; // GC for interactive panning GC rotateGCXOR; // GC for interactive rotation Pixmap pannerPixmap; // pixmap for panner XImage* pannerXImage; // ximage for panner int pannerWidth; // panner width int pannerHeight; // panner height char pannerName[32]; // panner widget name int usePanner; // panner status GC pannerGC; Pixmap magnifierPixmap; // pixmap for magnifier XImage* magnifierXImage; // ximage for magnifier int magnifierWidth; // magnifier width int magnifierHeight; // magnifier height double magnifierZoom_; // magnifier zoom factor char magnifierName[32]; // magnifer widget name int useMagnifier; // magnifer status int useMagnifierGraphics; // magnifer marker status int useMagnifierCursor; // magnifier cursor status Vector magnifierCursor; // we need to save the last cursor used char* magnifierColorName; Vector cropBegin; Vector cropEnd; Coord::CoordSystem wcsSystem_; Coord::SkyFrame wcsSky_; Coord::SkyFormat wcsSkyFormat_; int wcsAlign_; // flag to indicate wcs alignment Coord::CoordSystem xySystem_; // default marker sys (RAWXY) Coord::SkyFrame xySky_; // default marker sky (RAWXY) Coord::Orientation wcsOrientation; // wcs image orientation Matrix wcsOrientationMatrix; // wcs image orientation matrix double wcsRotation; // wcs image rotation angle int irafAlign_; Coord::Orientation irafOrientation_; // orientation of first iraf segment Matrix irafMatrix_; // orientation matrix for iraf mosaic char* maskColorName; float maskAlpha; int maskMark; int invert; int useHighlite; GC highliteGC; XRectangle rectWidget[1]; XRectangle rectWindow[1]; int useCrosshair; int markerEpsilon; // mouse tolerance for select/edit int showMarkers; int showMarkersText; int centroidAuto; int centroidIteration; float centroidRadius; int preserveMarkers; // flag to indicate preserve between loads GC markerGC; // marker gc GC markerGCXOR; // marker xor gc GC selectGCXOR; // select gc Grid* grid; GC gridGC; GC contourGC; char* bgColorName; XColor* bgColor; char bgTrueColor_[4]; // color encoded char* nanColorName; XColor* nanColor; char nanTrueColor_[4]; // color encoded float dlist[2]; char* colorbartag; Matrix dataToImage; Matrix imageToData; Matrix refToUser; Matrix userToRef; Matrix refToWidget; Matrix widgetToRef; Matrix refToCanvas; Matrix canvasToRef; Matrix refToWindow; Matrix windowToRef; Matrix userToWidget; Matrix widgetToUser; Matrix userToCanvas; Matrix canvasToUser; Matrix widgetToCanvas; Matrix canvasToWidget; Matrix widgetToWindow; Matrix windowToWidget; Matrix canvasToWindow; Matrix windowToCanvas; Matrix refToMagnifier; Matrix magnifierToRef; Matrix userToMagnifier; Matrix magnifierToUser; Matrix widgetToMagnifier; Matrix magnifierToWidget; Matrix refToPanner; Matrix pannerToRef; Matrix userToPanner; Matrix pannerToUser; Matrix widgetToPanner; Matrix pannerToWidget; private: void bltHist(char*, char*); // frblt.C void getInfoClearName(char*); void getInfoClearValue(char*); void getInfoClearWCS(char*); void getInfoWCS(char*, const Vector3d&, FitsImage*, FitsImage*); void invalidPixmap(); int updatePixmap(const BBox&); protected: void alignIRAF(); virtual void alignWCS(); virtual void alignWCS(Coord::CoordSystem, Coord::SkyFrame); virtual void alignWCS(FitsImage*, Coord::CoordSystem); void analysisMarkersInit(); void bltCut(char*, char*, Coord::Orientation, const Vector&); void bltCutFits(double*, double*, int, Coord::Orientation, const Vector&); virtual void buildXImage(XImage*, Coord::InternalSystem) =0; double calcZoom(Vector,Vector); virtual double calcZoomPanner() =0; virtual void cancelDetach() =0; virtual void centerImage(); void coordToTclArray(FitsImage*, const Vector3d&, Coord::CoordSystem, Precision, const char*, const char*); void coord3ToTclArray(FitsImage*, const Vector3d&, Coord::CoordSystem, Precision, const char*, const char*); void createMarker(Marker*); void createTemplate(const Vector&, istream&); virtual int doRender(); void doubleToTclArray(double, Precision, const char*, const char*, const char*); virtual void encodeTrueColor(int, int) =0; virtual void encodeTrueColor(XColor*, char*) =0; virtual void encodeTrueColor(unsigned char*, XImage*) =0; virtual unsigned char* fillImage(int, int, Coord::InternalSystem) =0; Coord::Orientation getOrientation() {return orientation;} double getRotation() {return rotation + wcsRotation;} Coord::Orientation getWCSOrientation() {return wcsOrientation;} int hasATMV(); int hasContour(); int hasContourAux(); int hasDTMV(); int hasLTMV(); int hasWCS(Coord::CoordSystem); int hasWCSEqu(Coord::CoordSystem); int hasWCSCel(Coord::CoordSystem); int hasWCSx(Coord::CoordSystem); virtual BBox imageBBox(FrScale::ScanMode); Vector imageCenter(FrScale::ScanMode); Vector imageSize(FrScale::ScanMode); virtual int isIIS(); FitsImage* isInFits(const Vector&, Coord::InternalSystem, Vector*); FitsImage* isInCFits(const Vector&, Coord::InternalSystem, Vector*); virtual int isAzElZero() {return 1;} virtual int isFrame() {return 0;} virtual int isFrame3d() {return 0;} virtual int isFrameRGB() {return 0;} void loadDone(int, LayerType); void markerAnalysisHistogram(Marker*, double**, double**, const BBox&, int); int markerAnalysisPlot2d(Marker*, double**, double**, double**, double**, Vector&, Vector&, int, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod); int markerAnalysisPlot3d(Marker*, double**, double**, const BBox&, Coord::CoordSystem, Marker::AnalysisMethod); int markerAnalysisRadial(Marker*, double**, double**, double**, int, Vector*, BBox*, Coord::CoordSystem); int markerAnalysisPanda(Marker*, double**, double**, double**, int, Vector*, int, double*, BBox*, Coord::CoordSystem); int markerAnalysisStats1(Marker*, FitsImage*, ostream&, Coord::CoordSystem, Coord::SkyFrame); void markerAnalysisStats2(FitsImage*, ostream&, Coord::CoordSystem, int, int, double, int); void markerAnalysisStats3(ostream&); void markerAnalysisStats4(ostream&, int, int, double, double, double, double, double); void markerAnalysisStats(Marker*, ostream&, const BBox&, Coord::CoordSystem, Coord::SkyFrame); void markerAnalysisStats(Marker*, ostream&, int, BBox*, Coord::CoordSystem, Coord::SkyFrame); void markerAnalysisStats(Marker*, ostream&, int, int, BBox*, Coord::CoordSystem, Coord::SkyFrame); double mapDistFromRef(const Vector&, const Vector&, Coord::InternalSystem); double mapLenFromRef(double, Coord::InternalSystem); Vector mapLenFromRef(const Vector&, Coord::InternalSystem); double mapLenToRef(double, Coord::InternalSystem); Vector mapLenToRef(const Vector&, Coord::InternalSystem); void markerListHeader(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void markerListXMLHeader(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void markerListXMLFooter(ostream&); void markerListCiaoHeader(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void markerListSAOtngHeader(ostream&,Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void markerPrintCoord(const Vector&, Coord::InternalSystem); void markerPrintCoord(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void markerPrintDouble(double, Coord::InternalSystem); void markerPrintDouble(const Vector&, double, Coord::CoordSystem, Coord::SkyDist); void markerPrintDouble(const Vector&, const Vector&, Coord::InternalSystem); void markerPrintDouble(const Vector&, const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerPrintVector(const Vector&,Coord::InternalSystem); void markerPrintVector(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerUndo(Marker*, UndoMarkerType); void parseMarker(MarkerFormat,istream&); int postscriptProc(int prepass); void printCoordSystem(Coord::CoordSystem); void printDouble(double, Precision); void printFromRef(FitsImage*, const Vector&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision); void printInteger(int); void printSkyFrame(Coord::SkyFrame); void printSkyFormat(Coord::SkyFormat); void printSkyDist(Coord::SkyDist); void printVector(const Vector&, Precision); void printVector(const Vector3d&, Precision); void ps(); void psContours(PSColorSpace); void psCrosshair(PSColorSpace); virtual void psGraphics(PSColorSpace) {} void psImage(Filter&, PSColorSpace, int, int, float); void psMarkers(List*, int); Matrix psMatrix(float scale, int width, int height); virtual void pushMatrices(); virtual void pushMagnifierMatrices(); virtual void pushPannerMatrices(); virtual void pushPSMatrices(float, int, int); virtual void reset(); void resetScanMode(); virtual void setBinCursor() =0; void setClip(); FrScale::ScanMode scanMode(); void setScanMode(FrScale::ScanMode); void setScanModeIncr(LoadMethod); virtual void setSlice(int,int); void unhighliteMarkers(); void unselectMarkers(List*); void update(UpdateType); void update(UpdateType,BBox); void updateMarkers(List*); void updateMarkerCBs(List*); void updateMarkerCoords(List*, const Matrix&); virtual void unloadFits(); virtual void unloadAllFits(); void updateBase(); virtual void updateBin(const Matrix&); virtual void updateBlock(const Vector&); void updateCBMarkers(List*); virtual void updateColorScale() =0; virtual void updateGCs(); void updateMagnifier(); void updateMagnifier(const Vector&); virtual void updateMatrices(); virtual void updateMagnifierMatrices(); virtual void updatePannerMatrices(); void updateNow(UpdateType); void updateNow(UpdateType,BBox); virtual void updatePanner(); void updatePM(const BBox&); char* varcat(char*, char*, char, char*); virtual int validColorScale() =0; void x11Contours(Pixmap, Coord::InternalSystem, int, int); void x11Crosshair(Pixmap, Coord::InternalSystem, int, int); void x11Dash(GC, int); virtual void x11Graphics(); virtual void x11MagnifierCursor(const Vector&) {} void x11MagnifierMarkers(List*, const BBox& bb); void x11Markers(List*, const BBox&); void x11MarkerXOR(Marker*); void xmlParse(istream&); void xmlParseFIELD(void*, int*, char**, char**, char**, char**, int); void xmlParseTR(char**, int*, char**, char**, char**, char**, int); void xmlSetProps(unsigned short*, unsigned short, char*); int xmlCount(const char*); Vector xmlPoint(FitsImage*, const char* x, const char* y, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int which=0); List* xmlVertex(FitsImage*, const char*, const char*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); double xmlAngle(const char*, int, double, Coord::AngleFormat, Coord::CoordSystem, Coord::SkyFrame); double* xmlAngles(const char*, int, double, int, Coord::AngleFormat, Coord::CoordSystem, Coord::SkyFrame); double* xmlDistance(FitsImage*, const char*, int, Coord::CoordSystem, Coord::SkyDist); Vector* xmlDistance(FitsImage*, const char*, const char*, int, Coord::CoordSystem, Coord::SkyDist); void ximageToPixmap(Pixmap pmap, XImage* xmap, Coord::InternalSystem); virtual void ximageToPixmapMagnifier(); Vector zoom() {return zoom_;} #ifdef MAC_OSX_TK void macosx(); void macosxContours(); void macosxCrosshair(); virtual void macosxGraphics() {} void macosxImage(float, int, int, const Vector&, const Vector&); void macosxMarkers(List* ml); #endif #ifdef __WIN32 void win32(); void win32Contours(); void win32Crosshair(); virtual void win32Graphics() {} void win32Image(float, int, int, const Vector&, const Vector&); void win32Markers(List* ml); #endif public: Base(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item); virtual ~Base(); void calcAlignWCS(FitsImage*, Coord::CoordSystem, Coord::SkyFrame, Coord::Orientation*, Matrix*, double*); void calcAlignWCS(FitsImage*, FitsImage*, Coord::CoordSystem, Coord::CoordSystem, Coord::SkyFrame, Coord::Orientation*, Matrix*, double*, Vector*); Matrix calcAlignWCS(FitsImage*, FitsImage*, Coord::CoordSystem, Coord::CoordSystem, Coord::SkyFrame); Vector centroid(const Vector&); FitsImage* findFits(); FitsImage* findFits(Coord::CoordSystem, const Vector&); FitsImage* findFits(const Vector&); FitsImage* findFits(int); int findFits(FitsImage*); FitsImage* findAllFits(int); int fitsCount(); Coord::Orientation IRAFOrientation(Coord::Orientation); int isMosaic(); int isCube(); int isBinTable(); virtual Vector mapFromRef(const Vector&, Coord::InternalSystem) =0; virtual Vector3d mapFromRef3d(const Vector&, Coord::InternalSystem) =0; virtual Vector mapToRef(const Vector&, Coord::InternalSystem) =0; virtual Vector3d mapToRef3d(const Vector&, Coord::InternalSystem) =0; double mapAngleFromRef(double, Coord::CoordSystem, Coord::SkyFrame =Coord::FK5); double mapAngleToRef(double, Coord::CoordSystem, Coord::SkyFrame =Coord::FK5); int parse(istringstream&); void resetCompositeMarker() {compositeMarker = NULL;} Coord::CoordSystem wcsSystem() {return wcsSystem_;} Coord::SkyFrame wcsSky() {return wcsSky_;} Coord::SkyFormat wcsSkyFormat() {return wcsSkyFormat_;} Coord::CoordSystem xySystem() {return xySystem_;} Coord::SkyFrame xySky() {return xySky_;} void matchCmd(const char* xxname1, const char* yyname1, Coord::CoordSystem sys1, Coord::SkyFrame sky1, const char* xxname2, const char* yyname2, Coord::CoordSystem sys2, Coord::SkyFrame sky2, double rad, Coord::CoordSystem sys, Coord::SkyDist dist, const char* rr); // IME Analysis Commands void analysisMarkersResetCmd(); void analysisMarkersSelectCmd(const char*, const Vector&); // Axes Order void axesOrderCmd(int); void getAxesOrderCmd(); // Background Commands void bgColorCmd(const char*); void getBgColorCmd(); // Bin Commands void binCmd(const Vector&, const char*, const char*, const char*); void binCmd(const Vector&, const Vector&, const char*, const char*, const char*); void binCmd(const Vector&, int, const Vector&, const char*, const char*, const char*, const char*); void binCmd(const Vector&, int, const Vector&, const Vector&, const char*, const char*, const char*, const char*); void binAboutCmd(); void binAboutCmd(const Vector&); void binColsCmd(const char*, const char*, const char*); void binDepthCmd(int); void binFactorCmd(const Vector&); void binFactorAboutCmd(const Vector&, const Vector&); void binFactorToCmd(const Vector&); void binFactorToAboutCmd(const Vector&, const Vector&); void binFunctionCmd(FitsHist::Function); void binBufferSizeCmd(int); void binFilterCmd(const char*); virtual void binToFitCmd() =0; void getBinDepthCmd(); void getBinFactorCmd(); void getBinFunctionCmd(); void getBinBufferSizeCmd(); void getBinCursorCmd(); void getBinFilterCmd(); void getBinColsCmd(); void getBinColsMinMaxCmd(const char*); void getBinColsDimCmd(const char*); void getBinListCmd(); void hasBinColCmd(const char*); // Block Commands void blockCmd(const Vector&); void blockToCmd(const Vector&); virtual void blockToFitCmd() =0; void getBlockCmd(); // Clip Commands void clipMinMaxModeCmd(FrScale::MinMaxMode); void clipModeCmd(float); void clipModeCmd(FrScale::ClipMode); void clipPreserveCmd(int); virtual void clipScopeCmd(FrScale::ClipScope); void clipUserCmd(double, double); void clipUserLowCmd(double); void clipUserHighCmd(double); void clipZScaleContrastCmd(float); void clipZScaleSampleCmd(int); void clipZScaleLineCmd(int); void getClipCmd(); void getClipCmd(float); void getClipCmd(FrScale::ClipMode); void getClipMinMaxModeCmd(); void getClipMinMaxSampleCmd(); void getClipModeCmd(); void getClipPreserveCmd(); void getClipScopeCmd(); void getClipUserCmd(); void getClipZScaleContrastCmd(); void getClipZScaleSampleCmd(); void getClipZScaleLineCmd(); void getHistogramCmd(char*, char*, int); void getMinMaxCmd(); void hasDATAMINCmd(); void hasIRAFMINCmd(); // Colormap Commands void colorbarTagCmd(const char*); virtual void colormapCmd(int, float, float, int, unsigned short*, unsigned char*, int) {} virtual void colormapCmd(float, float, float, float, float, float, int, unsigned char*, int) {} virtual void colormapBeginCmd() {} virtual void colormapEndCmd() {} virtual void colormapMotionCmd(int, float, float, int, unsigned short*, unsigned char*, int) {} virtual void colormapMotionCmd(float, float, float, float, float, float, int, unsigned char*, int) {} virtual void getColorbarCmd() =0; void getColorbarTagCmd(); // Contour Commands void contourAuxHeadCmd(); void contourAuxNextCmd(); void contourAuxSaveCmd(const char*, Coord::CoordSystem, Coord::SkyFrame); void contourCopyCmd(Coord::CoordSystem, Coord::SkyFrame); void contourCreateCmd(const char*, int, int, FVContour::Method, int, int, FrScale::ColorScaleType, float, float, Vector, const char*); void contourDeleteCmd(); void contourDeleteAllCmd(); void contourLoadCmd(const char*, int, int, const char*, Coord::CoordSystem,Coord::SkyFrame); void contourPasteCmd(const char*, int, int, void*, Coord::CoordSystem, Coord::SkyFrame); void contourSaveCmd(const char*, Coord::CoordSystem, Coord::SkyFrame); void contourSetDashCmd(int); void contourSetColorCmd(const char*); void contourSetLineWidthCmd(int); void getContourAuxColorNameCmd(); void getContourAuxDashCmd(); void getContourAuxLineWidthCmd(); void getContourCmd(Coord::CoordSystem sys, Coord::SkyFrame sky); void getContourClipCmd(); void getContourClipModeCmd(); void getContourColorNameCmd(); void getContourDashCmd(); void getContourLevelCmd(); void getContourLineWidthCmd(); void getContourMethodCmd(); void getContourNumLevelCmd(); void getContourScaleCmd(); void getContourScaleLogCmd(); void getContourSmoothCmd(); void hasContourCmd(); void hasContourAuxCmd(); // Coordinate Commands void getWCSCmd(); void wcsCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getWCSNameCmd(Coord::CoordSystem); void getWCSAlignPointerCmd(); void getCoordCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getCoord3axisCmd(double, Coord::CoordSystem, Coord::CoordSystem, int); virtual void getCursorCmd(Coord::InternalSystem) =0; virtual void getCursorCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision) =0; void hasSystemCmd(Coord::CoordSystem); void hasAmplifierCmd(); void hasDetectorCmd(); void hasPhysicalCmd(); void hasWCSAltCmd(); void hasWCSCmd(Coord::CoordSystem); void hasWCSEquCmd(Coord::CoordSystem); void hasWCSCelCmd(Coord::CoordSystem); void hasWCSxCmd(Coord::CoordSystem); // Crop Commands void cropCmd(); void cropCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void cropCenterCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame, const Vector&, Coord::CoordSystem, Coord::SkyDist); void cropBeginCmd(const Vector&); void cropMotionCmd(const Vector&); void cropEndCmd(const Vector&); void crop3dCmd(); void crop3dCmd(double, double, Coord::CoordSystem); virtual void crop3dBeginCmd(const Vector&, int) {} virtual void crop3dMotionCmd(const Vector&, int) {} virtual void crop3dEndCmd(const Vector&, int) {} void getCropCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getCropCenterCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Coord::CoordSystem, Coord::SkyDist); void getCrop3dCmd(Coord::CoordSystem); void hasCropCmd(); // CrossHair Commands void crosshairCmd(int); void crosshairCmd(const Vector&, Coord::InternalSystem); void crosshairCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame =Coord::FK5); void crosshairWarpCmd(const Vector&); void getCrosshairCmd(Coord::InternalSystem); void getCrosshairCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision); void getCrosshairStatusCmd(); // DATASEC Commands void DATASECCmd(int); void getDATASECCmd(); void hasDATASECCmd(); // Data Values void getDataValuesCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyFrame, const Vector&, char*); void getDataValuesCmd(const Vector&, Coord::InternalSystem, const Vector&); // Fits Commands void getBitpixCmd(); void getFitsNAxesCmd(); void getFitsCountCmd(); void getFitsCenterCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision); void getFitsDepthCmd(int); void getFitsExtCmd(int); void getFitsExtCmd(const Vector&, Coord::InternalSystem); void getFitsFileNameCmd(FileNameType); void getFitsFileNameCmd(int, FileNameType); void getFitsFileNameCmd(const Vector&, Coord::InternalSystem, FileNameType); void getFitsHeaderCmd(int); void getFitsHeaderWCSCmd(int); void getFitsHeaderKeywordCmd(int,const char*); void getFitsObjectNameCmd(); void getFitsSizeCmd(); void getFitsSizeCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyDist, Precision); void getFitsSliceCmd(int id); void getFitsSliceCmd(int id, Coord::CoordSystem sys); void hasFitsCmd(); void hasFitsHPXCmd(); void hasFitsBinCmd(); void hasFitsCubeCmd(); void hasFitsMosaicCmd(); void loadFitsAllocCmd(const char*, const char*, LayerType); void loadFitsAllocGZCmd(const char*, const char*, LayerType); void loadFitsChannelCmd(const char*, const char*, LayerType); void loadFitsMMapCmd(const char*, LoadMethod, LayerType); void loadFitsSMMapCmd(const char*, const char*, LoadMethod,LayerType); void loadFitsMMapIncrCmd(const char*, LoadMethod, LayerType); void loadFitsShareCmd(ShmType, int, const char*, LoadMethod, LayerType); void loadFitsSShareCmd(ShmType, int, int, const char*, LoadMethod,LayerType); void loadFitsSocketCmd(int, const char*, LayerType); void loadFitsSocketGZCmd(int, const char*, LayerType); void loadFitsVarCmd(const char*, const char*, LoadMethod, LayerType); void loadArrAllocCmd(const char*, const char*, LayerType); void loadArrAllocGZCmd(const char*, const char*, LayerType); void loadArrChannelCmd(const char*, const char*, LayerType); void loadArrMMapCmd(const char*, LayerType); void loadArrMMapIncrCmd(const char*, LayerType); void loadArrShareCmd(ShmType, int, const char*, LayerType); void loadArrSocketCmd(int, const char*, LayerType); void loadArrSocketGZCmd(int, const char*, LayerType); void loadArrVarCmd(const char*, const char*, LayerType); void loadENVISMMapCmd(const char*, const char*); void loadNRRDAllocCmd(const char*, const char*, LayerType); void loadNRRDChannelCmd(const char*, const char*, LayerType); void loadNRRDMMapCmd(const char*, LayerType); void loadNRRDShareCmd(ShmType, int, const char*, LayerType); void loadNRRDSocketCmd(int, const char*, LayerType); void loadNRRDVarCmd(const char*, const char*, LayerType); virtual void loadPhotoCmd(const char*, const char*); virtual void loadSlicePhotoCmd(const char*, const char*); void loadExtCubeAllocCmd(const char*, const char*); void loadExtCubeAllocGZCmd(const char*, const char*); void loadExtCubeChannelCmd(const char*, const char*); void loadExtCubeMMapCmd(const char*, LoadMethod); void loadExtCubeMMapIncrCmd(const char*, LoadMethod); void loadExtCubeShareCmd(ShmType, int, const char*, LoadMethod); void loadExtCubeSocketCmd(int, const char*); void loadExtCubeSocketGZCmd(int, const char*); void loadExtCubeVarCmd(const char*, const char*, LoadMethod); void loadSliceAllocCmd(const char*, const char*); void loadSliceAllocGZCmd(const char*, const char*); void loadSliceChannelCmd(const char*, const char*); void loadSliceMMapCmd(const char*, LoadMethod); void loadSliceSMMapCmd(const char*, const char*, LoadMethod); void loadSliceMMapIncrCmd(const char*, LoadMethod); void loadSliceShareCmd(ShmType, int, const char*, LoadMethod); void loadSliceSShareCmd(ShmType, int, int, const char*, LoadMethod); void loadSliceSocketCmd(int, const char*); void loadSliceSocketGZCmd(int, const char*); void loadSliceVarCmd(const char*, const char*, LoadMethod); void loadMosaicImageAllocCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicImageAllocGZCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicImageChannelCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicImageMMapCmd(MosaicType, Coord::CoordSystem, const char*, LoadMethod, LayerType); void loadMosaicImageMMapIncrCmd(MosaicType, Coord::CoordSystem, const char*, LoadMethod, LayerType); void loadMosaicImageShareCmd(MosaicType, Coord::CoordSystem, ShmType, int, const char*, LoadMethod, LayerType); void loadMosaicImageSocketCmd(MosaicType, Coord::CoordSystem, int, const char*, LayerType); void loadMosaicImageSocketGZCmd(MosaicType, Coord::CoordSystem, int, const char*, LayerType); void loadMosaicImageVarCmd(MosaicType, Coord::CoordSystem, const char*,const char*, LoadMethod, LayerType); void loadMosaicAllocCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicAllocGZCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicChannelCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LayerType); void loadMosaicMMapCmd(MosaicType, Coord::CoordSystem, const char*, LoadMethod, LayerType); void loadMosaicSMMapCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LoadMethod, LayerType); void loadMosaicMMapIncrCmd(MosaicType, Coord::CoordSystem, const char*, LoadMethod, LayerType); void loadMosaicShareCmd(MosaicType, Coord::CoordSystem, ShmType, int, const char*, LoadMethod, LayerType); void loadMosaicSShareCmd(MosaicType, Coord::CoordSystem, ShmType, int, int, const char*, LoadMethod, LayerType); void loadMosaicSocketCmd(MosaicType, Coord::CoordSystem, int, const char*, LayerType); void loadMosaicSocketGZCmd(MosaicType, Coord::CoordSystem, int, const char*, LayerType); void loadMosaicVarCmd(MosaicType, Coord::CoordSystem, const char*, const char*, LoadMethod, LayerType); void loadMosaicImageWFPC2AllocCmd(const char*, const char*); void loadMosaicImageWFPC2AllocGZCmd(const char*, const char*); void loadMosaicImageWFPC2ChannelCmd(const char*, const char*); void loadMosaicImageWFPC2MMapCmd(const char*, LoadMethod); void loadMosaicImageWFPC2MMapIncrCmd(const char*, LoadMethod); void loadMosaicImageWFPC2ShareCmd(ShmType, int, const char*,LoadMethod); void loadMosaicImageWFPC2SocketCmd(int, const char*); void loadMosaicImageWFPC2SocketGZCmd(int, const char*); void loadMosaicImageWFPC2VarCmd(const char*, const char*, LoadMethod); // Fits RGB virtual void loadRGBCubeAllocCmd(const char*, const char*) {} virtual void loadRGBCubeAllocGZCmd(const char*, const char*) {} virtual void loadRGBCubeChannelCmd(const char*, const char*) {} virtual void loadRGBCubeMMapCmd(const char*, LoadMethod) {} virtual void loadRGBCubeSMMapCmd(const char*, const char*, LoadMethod) {} virtual void loadRGBCubeMMapIncrCmd(const char*, LoadMethod) {} virtual void loadRGBCubeShareCmd(ShmType, int, const char*, LoadMethod) {} virtual void loadRGBCubeSShareCmd(ShmType,int,int,const char*,LoadMethod) {} virtual void loadRGBCubeSocketCmd(int, const char*) {} virtual void loadRGBCubeSocketGZCmd(int, const char*) {} virtual void loadRGBCubeVarCmd(const char*, const char*, LoadMethod) {} virtual void loadRGBImageAllocCmd(const char*, const char*) {} virtual void loadRGBImageAllocGZCmd(const char*, const char*) {} virtual void loadRGBImageChannelCmd(const char*, const char*) {} virtual void loadRGBImageMMapCmd(const char*, LoadMethod) {} virtual void loadRGBImageMMapIncrCmd(const char*, LoadMethod) {} virtual void loadRGBImageShareCmd(ShmType, int, const char*, LoadMethod) {} virtual void loadRGBImageSocketCmd(int, const char*) {} virtual void loadRGBImageSocketGZCmd(int, const char*) {} virtual void loadRGBImageVarCmd(const char*, const char*, LoadMethod) {} virtual void loadArrayRGBCubeAllocCmd(const char*, const char*) {} virtual void loadArrayRGBCubeAllocGZCmd(const char*, const char*) {} virtual void loadArrayRGBCubeChannelCmd(const char*, const char*) {} virtual void loadArrayRGBCubeMMapCmd(const char*) {} virtual void loadArrayRGBCubeMMapIncrCmd(const char*) {} virtual void loadArrayRGBCubeShareCmd(ShmType, int, const char*) {} virtual void loadArrayRGBCubeSocketCmd(int, const char*) {} virtual void loadArrayRGBCubeSocketGZCmd(int, const char*) {} virtual void loadArrayRGBCubeVarCmd(const char*, const char*) {} virtual void savePhotoCmd(const char*) {} void saveFits(OutFitsStream&); void saveFitsFileCmd(const char*); void saveFitsChannelCmd(const char*); void saveFitsSocketCmd(int); void saveFitsTable(OutFitsStream&); void saveFitsTableFileCmd(const char*); void saveFitsTableChannelCmd(const char*); void saveFitsTableSocketCmd(int); void saveFitsSlice(OutFitsStream&); void saveFitsSliceFileCmd(const char*); void saveFitsSliceChannelCmd(const char*); void saveFitsSliceSocketCmd(int); void saveFitsExtCube(OutFitsStream&); void saveFitsExtCubeFileCmd(const char*); void saveFitsExtCubeChannelCmd(const char*); void saveFitsExtCubeSocketCmd(int); void saveFitsMosaic(OutFitsStream&, int); void saveFitsMosaicFileCmd(const char*, int); void saveFitsMosaicChannelCmd(const char*, int); void saveFitsMosaicSocketCmd(int, int); void saveFitsMosaicImage(OutFitsStream&); void saveFitsMosaicImageFileCmd(const char*); void saveFitsMosaicImageChannelCmd(const char*); void saveFitsMosaicImageSocketCmd(int); virtual void saveFitsRGBImage(OutFitsStream&) {} virtual void saveFitsRGBImageFileCmd(const char*) {} virtual void saveFitsRGBImageChannelCmd(const char*) {} virtual void saveFitsRGBImageSocketCmd(int) {} virtual void saveFitsRGBCube(OutFitsStream&) {} virtual void saveFitsRGBCubeFileCmd(const char*) {} virtual void saveFitsRGBCubeChannelCmd(const char*) {} virtual void saveFitsRGBCubeSocketCmd(int) {} virtual void saveFitsResampleFileCmd(const char*) {} virtual void saveFitsResampleChannelCmd(const char*) {} virtual void saveFitsResampleSocketCmd(int) {} void saveArray(OutFitsStream&, FitsFile::ArchType); void saveArrayFileCmd(const char*, FitsFile::ArchType); void saveArrayChannelCmd(const char*, FitsFile::ArchType); void saveArraySocketCmd(int, FitsFile::ArchType); virtual void saveArrayRGBCube(OutFitsStream&, FitsFile::ArchType) {} virtual void saveArrayRGBCubeFileCmd(const char*, FitsFile::ArchType) {} virtual void saveArrayRGBCubeChannelCmd(const char*, FitsFile::ArchType) {} virtual void saveArrayRGBCubeSocketCmd(int, FitsFile::ArchType) {} void saveNRRD(OutFitsStream&, FitsFile::ArchType); void saveNRRDFileCmd(const char*, FitsFile::ArchType); void saveNRRDChannelCmd(const char*, FitsFile::ArchType); void saveNRRDSocketCmd(int, FitsFile::ArchType); void saveENVI(ostream&, OutFitsStream&, FitsFile::ArchType); void saveENVIFileCmd(const char*, const char*, FitsFile::ArchType); void sliceCmd(int, int); void sliceCmd(int, double, Coord::CoordSystem); void updateFitsCmd(int); void updateFitsCmd(int, BBox, int); void unloadFitsCmd(); // Fitsy Commands void fitsyHasExtCmd(const char*); // Frame Commands void clearCmd(); void getFitsHeightCmd(); virtual void getTypeCmd() =0; void getFitsWidthCmd(); void highliteCmd(int); void warpCmd(const Vector&); void warpToCmd(const Vector&); // Graph Commands void getHorzCutCmd(char*, char*, const Vector&, Coord::InternalSystem); void getVertCutCmd(char*, char*, const Vector&, Coord::InternalSystem); // Grid Commands virtual void gridCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Grid::GridType, const char*, const char*) =0; void gridDeleteCmd(); void getGridCmd(); void getGridOptionCmd(); void getGridVarsCmd(); void hasGridCmd(); // IIS Commands virtual void iisCmd(int, int) {} virtual void iisCursorModeCmd(int) {} virtual void iisEraseCmd() {} virtual void iisGetCmd(char*, int, int, int, int) {} virtual void iisGetCursorCmd() {} virtual void iisGetFileNameCmd() {} virtual void iisGetFileNameCmd(int) {} virtual void iisGetFileNameCmd(const Vector&) {} virtual void iisMessageCmd(const char*) {} virtual void iisSetCmd(const char*, int, int, int, int) {} virtual void iisSetCursorCmd(const Vector&, Coord::InternalSystem) {} virtual void iisSetCursorCmd(const Vector&, Coord::CoordSystem) {} virtual void iisSetFileNameCmd(const char*) {} virtual void iisSetFileNameCmd(const char*,int) {} virtual void iisUpdateCmd() {} virtual void iisWCSCmd(const Matrix&, const Vector&, int) {} void hasIISCmd(); // Info Commands void getInfoCmd(char*); virtual void getInfoCmd(const Vector&, Coord::InternalSystem, char*); void getInfoClipCmd(); void getValueCmd(const Vector&, Coord::InternalSystem); // loadIncr is only used by LICK OBS // maintained for backward compatibility void loadIncrDataCmd(int, int, int, int, int); void loadIncrMinMaxCmd(int, int, int, int, int); void loadIncrEndCmd(); // Magnifier Commands void magnifierCmd(char*, int, int); void magnifierCmd(int); void magnifierGraphicsCmd(int); void magnifierCursorCmd(int); void magnifierZoomCmd(double); void magnifierColorCmd(const char*); void updateMagnifierCmd(const Vector& v); // Marker Commands // Basic Regions void createCircleCmd(const Vector&, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createEllipseCmd(const Vector&, const Vector&, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createBoxCmd(const Vector&, const Vector&, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createPolygonCmd(const Vector&, const Vector&, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createPolygonCmd(const List&, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createContourPolygonCmd(const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createSegmentCmd(const Vector&, const Vector&, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createSegmentCmd(const List&, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createLineCmd(const Vector&, const Vector&, int, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createVectCmd(const Vector&, const Vector&, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createVectCmd(const Vector&, double mag, double ang, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createTextCmd(const Vector&, double, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createPointCmd(const Vector&, Point::PointShape, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); // Measurement Regions void createRulerCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame, Coord::CoordSystem, Coord::SkyDist, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createCompassCmd(const Vector&, double, const char*, const char*, int, int, Coord::CoordSystem, Coord::SkyFrame, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createProjectionCmd(const Vector&, const Vector&, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); // Annulus Regions void createAnnulusCmd(const Vector&, double, double, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createAnnulusCmd(const Vector&, int, double*, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createEllipseAnnulusCmd(const Vector&, const Vector&, const Vector&, int, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createEllipseAnnulusCmd(const Vector&, int, Vector*, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createBoxAnnulusCmd(const Vector&, const Vector&, const Vector&, int, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createBoxAnnulusCmd(const Vector&, int, Vector*, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); // Panda Regions void createCpandaCmd(const Vector&, double, double, int, double, double, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createCpandaCmd(const Vector&, int, double*, int, double*, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createEpandaCmd(const Vector&, double, double, int, const Vector&, const Vector&, int, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createEpandaCmd(const Vector&, int, double*, int, Vector*, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createBpandaCmd(const Vector&, double, double, int, const Vector&, const Vector&, int, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createBpandaCmd(const Vector&, int, double*, int, Vector*, double, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); // Composite Regions void createCompositeCmd(const Vector&, double, int, const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); void createCompositeCmd( const char*, int*, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); // Template Regions void createTemplateCmd(const Vector&, const char*); void createTemplateCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame, const char*); void createTemplateVarCmd(const Vector&, const char* var); void getMarkerAnalysisHistogramCmd(char*, char*, int); void getMarkerAnalysisHistogramCmd(int, char*, char*, int); void getMarkerAnalysisPlot2dCmd(char*, char*, char*, char*, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod); void getMarkerAnalysisPlot2dCmd(int, char*, char*, char*, char*, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod); void getMarkerAnalysisPlot3dCmd(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void getMarkerAnalysisPlot3dCmd(int, char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void getMarkerAnalysisPandaCmd(Coord::CoordSystem); void getMarkerAnalysisPandaCmd(int, Coord::CoordSystem); void getMarkerAnalysisRadialCmd(char*, char*, char*, Coord::CoordSystem); void getMarkerAnalysisRadialCmd(int, char*, char*, char*, Coord::CoordSystem); void getMarkerAnalysisStatsCmd(Coord::CoordSystem, Coord::SkyFrame); void getMarkerAnalysisStatsCmd(int, Coord::CoordSystem, Coord::SkyFrame); void getMarkerAngleCmd(int); void getMarkerAngleCmd(int, Coord::CoordSystem, Coord::SkyFrame); void getMarkerAnnulusRadiusCmd(int, Coord::InternalSystem); void getMarkerAnnulusRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerBoxAnnulusRadiusCmd(int, Coord::InternalSystem); void getMarkerBoxAnnulusRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerBoxRadiusCmd(int, Coord::InternalSystem); void getMarkerBoxRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerBpandaAnglesCmd(int); void getMarkerBpandaAnglesCmd(int, Coord::CoordSystem, Coord::SkyFrame); void getMarkerBpandaRadiusCmd(int, Coord::InternalSystem); void getMarkerBpandaRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerCenterCmd(int, Coord::InternalSystem); void getMarkerCenterCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getMarkerCentroidAutoCmd(); void getMarkerCentroidRadiusCmd(); void getMarkerCentroidIterationCmd(); void getMarkerCentroidOptionCmd(); void getMarkerCircleRadiusCmd(int, Coord::InternalSystem); void getMarkerCircleRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerColorCmd(); void getMarkerColorCmd(const char*); void getMarkerColorCmd(int); void getMarkerCompassArrowCmd(int); void getMarkerCompassLabelCmd(int); void getMarkerCompassRadiusCmd(int, Coord::InternalSystem); void getMarkerCompassRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerCompassSystemCmd(int); void getMarkerCompositeCmd(int); void getMarkerCpandaAnglesCmd(int); void getMarkerCpandaAnglesCmd(int, Coord::CoordSystem, Coord::SkyFrame); void getMarkerCpandaRadiusCmd(int, Coord::InternalSystem); void getMarkerCpandaRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerEllipseRadiusCmd(int, Coord::InternalSystem); void getMarkerEllipseRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerEllipseAnnulusRadiusCmd(int, Coord::InternalSystem); void getMarkerEllipseAnnulusRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerEpandaAnglesCmd(int); void getMarkerEpandaAnglesCmd(int, Coord::CoordSystem, Coord::SkyFrame); void getMarkerEpandaRadiusCmd(int, Coord::InternalSystem); void getMarkerEpandaRadiusCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerEpsilonCmd(); void getMarkerFontCmd(); void getMarkerFontCmd(const char*); void getMarkerFontCmd(int); void getMarkerIdCmd(const char*); void getMarkerIdCmd(const Vector&); void getMarkerIdAllCmd(); void getMarkerLineCmd(int, Coord::InternalSystem); void getMarkerLineCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getMarkerLineArrowCmd(int); void getMarkerLineLengthCmd(int, Coord::InternalSystem); void getMarkerLineLengthCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerLineWidthCmd(); void getMarkerLineWidthCmd(int); void getMarkerMapLenFromRefCmd(int, double, Coord::CoordSystem, Coord::SkyDist); void getMarkerNumberCmd(); void getMarkerPointShapeCmd(int); void getMarkerPointSizeCmd(int); void getMarkerPolygonSegmentCmd(const Vector&); void getMarkerPreserveCmd(); void getMarkerProjectionPointsCmd(int, Coord::InternalSystem); void getMarkerProjectionPointsCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getMarkerProjectionLengthCmd(int, Coord::InternalSystem); void getMarkerProjectionLengthCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerProjectionMethodCmd(int); void getMarkerProjectionWidthCmd(int, Coord::InternalSystem); void getMarkerProjectionWidthCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerPropertyCmd(unsigned short); void getMarkerPropertyCmd(const char*, unsigned short); void getMarkerPropertyCmd(int, unsigned short); void getMarkerRulerLengthCmd(int, Coord::InternalSystem); void getMarkerRulerLengthCmd(int, Coord::CoordSystem, Coord::SkyDist); void getMarkerRulerPointCmd(int, Coord::InternalSystem); void getMarkerRulerPointCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getMarkerRulerSystemCmd(int); void getMarkerSegmentSegmentCmd(const Vector&); void getMarkerSelectedCmd(); void getMarkerSelectedCmd(int); void getMarkerSelectedCmd(const Vector&); void getMarkerSelectedNumberCmd(); void getMarkerShowCmd(); void getMarkerShowTextCmd(); void getMarkerHandleCmd(const Vector&); void getMarkerHighlitedCmd(); void getMarkerHighlitedCmd(int); void getMarkerHighlitedCmd(const Vector&); void getMarkerHighlitedNumberCmd(); void getMarkerTagCmd(const char*); void getMarkerTagCmd(int); void getMarkerTagCmd(int,int); void getMarkerTagDefaultNameCmd(); void getMarkerTagNumberCmd(const char*); void getMarkerTagsCmd(); void getMarkerTextCmd(int); void getMarkerTextRotateCmd(int); void getMarkerTypeCmd(int); void getMarkerVectorCmd(int, Coord::InternalSystem); void getMarkerVectorCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void getMarkerVectorArrowCmd(int); void getMarkerVectorLengthCmd(int, Coord::InternalSystem); void getMarkerVectorLengthCmd(int, Coord::CoordSystem, Coord::SkyDist); void hasMarkerHighlitedCmd(); void hasMarkerPasteCmd(); void hasMarkerSelectedCmd(); void hasMarkerUndoCmd(); void markerLayerCmd(MarkerLayer); void markerAnalysisCmd(int, Marker::AnalysisTask, int); void markerAngleCmd(int, double); void markerAngleCmd(int, double, Coord::CoordSystem, Coord::SkyFrame); void markerAnnulusCreateRadiusCmd(int, const Vector&); void markerAnnulusDeleteRadiusCmd(int, int); void markerAnnulusRadiusCmd(int, double, double, int, Coord::InternalSystem); void markerAnnulusRadiusCmd(int, double, double, int, Coord::CoordSystem, Coord::SkyDist); void markerAnnulusRadiusCmd(int, const char*, Coord::CoordSystem, Coord::SkyDist); void markerBackCmd(); void markerBackCmd(const char*); void markerBackCmd(int); void markerBoxAnnulusRadiusCmd(int, const Vector&, const Vector&, int, Coord::InternalSystem); void markerBoxAnnulusRadiusCmd(int, const Vector&, const Vector&, int, Coord::CoordSystem, Coord::SkyDist); void markerBoxAnnulusRadiusCmd(int, const char*, Coord::CoordSystem, Coord::SkyDist); void markerBoxAnnulusCreateRadiusCmd(int, const Vector&); void markerBoxAnnulusDeleteRadiusCmd(int, int); void markerBoxRadiusCmd(int, const Vector&, Coord::InternalSystem); void markerBoxRadiusCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerBpandaCreateAnglesCmd(int, const Vector&); void markerBpandaCreateRadiusCmd(int, const Vector&); void markerBpandaDeleteCmd(int, int); void markerBpandaEditCmd(int, double, double, int, const Vector&, const Vector&, int); void markerBpandaEditCmd(int, double, double, int, const Vector&, const Vector&, int, Coord::CoordSystem, Coord::SkyFrame); void markerBpandaEditCmd(int, const char*, const char*, Coord::CoordSystem, Coord::SkyFrame, Coord::CoordSystem, Coord::SkyDist); void markerCallBackCmd(int, CallBack::Type, const char*, const char*); void markerCentroidCmd(); void markerCentroidCmd(const char*); void markerCentroidCmd(int); void markerCentroidAutoCmd(int); void markerCentroidRadiusCmd(float); void markerCentroidIterationCmd(int); void markerCircleRadiusCmd(int, double, Coord::InternalSystem); void markerCircleRadiusCmd(int, double, Coord::CoordSystem, Coord::SkyDist); void markerColorCmd(const char*); void markerColorCmd(const char*, const char*); void markerColorCmd(int, const char*); void markerCompassArrowCmd(int, int, int); void markerCompassLabelCmd(int, const char*, const char*); void markerCompassRadiusCmd(int, double, Coord::InternalSystem); void markerCompassRadiusCmd(int, double, Coord::CoordSystem, Coord::SkyDist); void markerCompassSystemCmd(int, Coord::CoordSystem, Coord::SkyFrame); void markerCompositeCmd(int, int); void markerCompositeDeleteCmd(); void markerCommandCmd(MarkerFormat, const char*); void markerCommandVarCmd(MarkerFormat, const char*); void markerCopyCmd(); void markerCopyCmd(const char*); void markerCpandaCreateAnglesCmd(int, const Vector&); void markerCpandaCreateRadiusCmd(int, const Vector&); void markerCpandaDeleteCmd(int, int); void markerCpandaEditCmd(int, double, double, int, double, double, int); void markerCpandaEditCmd(int, double, double, int, double, double, int, Coord::CoordSystem, Coord::SkyFrame); void markerCpandaEditCmd(int, const char*, const char*, Coord::CoordSystem, Coord::SkyFrame,Coord::CoordSystem, Coord::SkyDist); void markerCutCmd(); void markerCutCmd(const char*); void markerDeleteCmd(); void markerDeleteCmd(const char*); void markerDeleteCmd(int); void markerDeleteAllCmd(); void markerDeleteLastCmd(); void markerDeleteCallBackCmd(int, CallBack::Type, const char*); void markerDeleteTagCmd(int); void markerDeleteTagCmd(int, const char*); void markerDeleteTagCmd(int, int); void markerEditBeginCmd(int, int); void markerEditBeginCmd(const Vector&, int); void markerEditMotionCmd(const Vector&, int); void markerEditEndCmd(); void markerEllipseRadiusCmd(int, const Vector&, Coord::InternalSystem); void markerEllipseRadiusCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerEllipseAnnulusRadiusCmd(int, const Vector&, const Vector&, int, Coord::InternalSystem); void markerEllipseAnnulusRadiusCmd(int, const Vector&, const Vector&, int, Coord::CoordSystem, Coord::SkyDist); void markerEllipseAnnulusRadiusCmd(int, const char*, Coord::CoordSystem, Coord::SkyDist); void markerEllipseAnnulusCreateRadiusCmd(int, const Vector&); void markerEllipseAnnulusDeleteRadiusCmd(int, int); void markerEpandaCreateAnglesCmd(int, const Vector&); void markerEpandaCreateRadiusCmd(int, const Vector&); void markerEpandaDeleteCmd(int, int); void markerEpandaEditCmd(int, double, double, int, const Vector&, const Vector&, int); void markerEpandaEditCmd(int, double, double, int, const Vector&, const Vector&, int, Coord::CoordSystem, Coord::SkyFrame); void markerEpandaEditCmd(int, const char*, const char*, Coord::CoordSystem, Coord::SkyFrame, Coord::CoordSystem, Coord::SkyDist); void markerEpsilonCmd(int ee) {markerEpsilon = ee;} void markerFontCmd(const char*); void markerFontCmd(const char*, const char*); void markerFontCmd(int, const char*); void markerFrontCmd(); void markerFrontCmd(const char*); void markerFrontCmd(int); void markerHighliteAllCmd(); // not used void markerHighliteCmd(int); // not used void markerHighliteCmd(const char*); // not used void markerHighliteToggleCmd(const Vector&); void markerHighliteOnlyCmd(int); void markerHighliteOnlyCmd(const char*); // not used void markerHighliteOnlyCmd(const Vector&); // not used void markerKeyCmd(); void markerKeyCmd(const Vector&); void markerLineCmd(int, const Vector&, const Vector&, Coord::InternalSystem); void markerLineCmd(int, const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void markerLineArrowCmd(int, int, int); void markerLineWidthCmd(int); void markerLineWidthCmd(int, int); void markerListCmd(MarkerFormat, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int strip, int select, unsigned short, unsigned short, List&); void markerLoadCmd(MarkerFormat,const char*); void markerLoadCmd(MarkerFormat,const char*,Coord::CoordSystem,Coord::SkyFrame); void markerLoadCmd(MarkerFormat,int); void markerLoadCmd(MarkerFormat,int,Coord::CoordSystem,Coord::SkyFrame); void markerLoadFitsCmd(const char*, const char*, int*, int, const char*); void markerMoveCmd(const Vector&); void markerMoveCmd(const char*, const Vector&); void markerMoveCmd(int id, const Vector&); void markerMoveBeginCmd(const Vector&); void markerMoveBeginCmd(int, const Vector&); void markerMoveMotionCmd(const Vector&); void markerMoveMotionCmd(int, const Vector&); void markerMoveEndCmd(); void markerMoveEndCmd(int); void markerMoveToCmd(const Vector&, Coord::InternalSystem); void markerMoveToCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame); void markerMoveToCmd(const char*, const Vector&, Coord::InternalSystem); void markerMoveToCmd(const char*, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void markerMoveToCmd(int, const Vector&, Coord::InternalSystem); void markerMoveToCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void markerPasteCmd(); void markerPasteCmd(Coord::CoordSystem, Coord::CoordSystem); void markerPointShapeCmd(int, Point::PointShape); void markerPointSizeCmd(int, int); void markerPolygonCreateVertexCmd(int, int, const Vector&); void markerPolygonDeleteVertexCmd(int, int); void markerPolygonResetCmd(int, const Vector&, Coord::InternalSystem); void markerPolygonResetCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerPreserveCmd(int r) {preserveMarkers = r;} void markerPropertyCmd(unsigned short, int); void markerPropertyCmd(const char*, unsigned short, int); void markerPropertyCmd(int, unsigned short, int); void markerPropertyCmd(unsigned short, int, const Vector&); void markerProjectionCmd(int, const Vector&, const Vector&, Coord::InternalSystem, double); void markerProjectionCmd(int, const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame, double, Coord::CoordSystem, Coord::SkyDist); void markerRotateBeginCmd(int); void markerRotateBeginCmd(const Vector&); void markerRotateMotionCmd(const Vector&, int h); void markerRotateEndCmd(); void markerRulerPointCmd(int, const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void markerRulerPointCmd(int, const Vector&, const Vector&, Coord::InternalSystem); void markerRulerSystemCmd(int, Coord::CoordSystem, Coord::SkyFrame, Coord::CoordSystem, Coord::SkyDist); void markerSaveCmd(const char*, MarkerFormat, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int strip); void markerSaveTemplateCmd(const char*); void markerSegmentCreateVertexCmd(int, int, const Vector&); void markerSegmentDeleteVertexCmd(int, int); void markerSegmentResetCmd(int, const Vector&, Coord::InternalSystem); void markerSegmentResetCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyDist); void markerSelectAllCmd(); void markerSelectCmd(int); // not used void markerSelectCmd(const char*); void markerSelectToggleCmd(); void markerSelectToggleCmd(const Vector&); void markerSelectOnlyCmd(int); void markerSelectOnlyCmd(const char*); void markerSelectOnlyCmd(const Vector&); void markerShowCmd(int); void markerShowTextCmd(int); void markerTagCmd(const char*); void markerTagCmd(int, const char*); void markerTagEditCmd(const char*, const char*); void markerTagDeleteCmd(const char*); void markerTagDeleteAllCmd(); void markerTagUpdateCmd(const char*); void markerTextCmd(int, const char*); void markerTextRotateCmd(int, int); void markerUndoCmd(); void markerUnhighliteAllCmd(); void markerUnhighliteCmd(int); // not used void markerUnhighliteCmd(const char*); void markerUnselectAllCmd(); void markerUnselectCmd(int); // not used void markerUnselectCmd(const char*); // not used void markerVectorCmd(int, const Vector&, Coord::InternalSystem, double, double); void markerVectorCmd(int, const Vector&, Coord::CoordSystem, Coord::SkyFrame, double, Coord::CoordSystem, Coord::SkyDist, double); void markerVectorArrowCmd(int, int); void regionHighliteBeginCmd(const Vector& v) {regionSelectBeginCmd(v);} void regionHighliteMotionCmd(const Vector& v) {regionSelectMotionCmd(v);} void regionHighliteEndCmd(); void regionHighliteShiftEndCmd(); void regionSelectBeginCmd(const Vector&); void regionSelectMotionCmd(const Vector&); void regionSelectEndCmd(); void regionSelectShiftEndCmd(); // Mask Commands void getMaskColorCmd(); void getMaskMarkCmd(); void getMaskTransparencyCmd(); void maskColorCmd(const char*); void maskClearCmd(); void maskMarkCmd(int m) {maskMark=m;} void maskTransparencyCmd(float); // NaN Commands void getNANColorCmd(); void nanColorCmd(const char*); // Pan Zoom Rotate Orient Commands void centerCmd(); void getOrientCmd(); void getRotateCmd(Precision); void getPanPreserveCmd(); void getZoomCmd(Precision); void orientCmd(Coord::Orientation); virtual void panCmd(const Vector&) =0; virtual void panCmd(const Vector&, const Vector&) =0; virtual void panCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame) =0; virtual void panToCmd(const Vector&) =0; virtual void panToCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame) =0; void panBeginCmd(const Vector&); void panMotionCmd(const Vector&); virtual void panEndCmd(const Vector&) =0; virtual void panBBoxCmd(const Vector&) =0; void panPreserveCmd(int r) {preservePan = r;} void rotateCmd(double); virtual void rotateBeginCmd() {} virtual void rotateMotionCmd(double) {} virtual void rotateEndCmd() {} void rotateToCmd(double); void getIRAFAlignCmd(); void irafAlignCmd(int); void getWCSAlignCmd(); void wcsAlignCmd(int); // used by backup void wcsAlignCmd(int, Coord::CoordSystem, Coord::SkyFrame); void wcsAlignCmd(int, FitsImage*, Coord::CoordSystem, Coord::SkyFrame); void zoomCmd(const Vector&); void zoomToCmd(const Vector&); virtual void zoomAboutCmd(const Vector&, const Vector&) =0; virtual void zoomAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame) =0; virtual void zoomToAboutCmd(const Vector&, const Vector&) =0; virtual void zoomToAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame) =0; virtual void zoomToFitCmd(double) =0; // Panner Commands void pannerCmd(int); void pannerCmd(char*, int, int); void updatePannerCmd(); // backward compatiblity void pannerCmd(Coord::CoordSystem, Coord::SkyFrame) {} // Pixel Table Commands void getPixelTableCmd(const Vector&, Coord::InternalSystem, int, int, char*); // Print Commands #ifdef MAC_OSX_TK void macosxPrintCmd(); #endif #ifdef __WIN32 void win32PrintCmd(); #endif // Scale Commands void colorScaleCmd(FrScale::ColorScaleType); void colorScaleLogCmd(double); void getColorMapLevelCmd(int); void getColorMapLevelCmd(int, double, double, FrScale::ColorScaleType, float); void getColorMapLevelCmd(int, const Vector&, Coord::InternalSystem); void getColorScaleCmd(); void getColorScaleLevelCmd(int, double, double, FrScale::ColorScaleType, float); void getColorScaleLogCmd(); // Smooth Commands void getSmoothFunctionCmd(); void getSmoothRadiusCmd(); void hasSmoothCmd(); void smoothCmd(int, int); void smoothDeleteCmd(); // Threads Commands void getThreadsCmd(); void threadsCmd(int); // WCS void wcsAppendCmd(int, int); void wcsAppendCmd(int, const char*); void wcsAppendTxtCmd(int, const char*); void wcsReplaceCmd(int, int); void wcsReplaceCmd(int, const char*); void wcsReplaceTxtCmd(int, const char*); void wcsResetCmd(int); // RGB Commands virtual void getRGBChannelCmd() =0; virtual void getRGBViewCmd() =0; virtual void getRGBSystemCmd() =0; virtual void setRGBChannelCmd(const char*) {} virtual void setRGBViewCmd(int, int, int) {} virtual void setRGBSystemCmd(Coord::CoordSystem) {} // 3d virtual void get3dBorderCmd() =0; virtual void get3dBorderColorCmd() =0; virtual void get3dCompassCmd() =0; virtual void get3dCompassColorCmd() =0; virtual void get3dHighliteCmd() =0; virtual void get3dHighliteColorCmd() =0; virtual void get3dScaleCmd() =0; virtual void get3dViewCmd() =0; virtual void get3dViewPointCmd() =0; virtual void get3dRenderMethodCmd() =0; virtual void get3dRenderBackgroundCmd() =0; virtual void set3dBorderCmd(int) {} virtual void set3dBorderColorCmd(const char*) {} virtual void set3dCompassCmd(int) {} virtual void set3dCompassColorCmd(const char*) {} virtual void set3dHighliteCmd(int) {} virtual void set3dHighliteColorCmd(const char*) {} virtual void set3dScaleCmd(double) {} virtual void set3dViewCmd(float, float) {} virtual void set3dViewPointCmd(const Vector3d&, const Vector&) {} virtual void set3dRenderMethodCmd(int) {} virtual void set3dRenderBackgroundCmd(int) {} virtual void set3dPreserveCmd() {} virtual void view3dBeginCmd(float, float) {} virtual void view3dMotionCmd(float, float) {} virtual void view3dEndCmd(float, float) {} }; #endif saods9/tksao1.0/frame/basebox.C000644 000765 000000 00000017354 12544546070 016566 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "basebox.h" #include "fitsimage.h" BaseBox::BaseBox(Base* p, const Vector& ctr, double ang) : BaseMarker(p, ctr, ang) { numPoints_ = 5; vertices_ = NULL; } BaseBox::BaseBox(Base* p, const Vector& ctr, double ang, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb) : BaseMarker(p, ctr, ang, clr, dsh, w, f, t, prop, c, tag, cb) { numPoints_ = 5; vertices_ = NULL; } BaseBox::BaseBox(const BaseBox& a) : BaseMarker(a) { numPoints_ = a.numPoints_; vertices_ = NULL; } BaseBox::~BaseBox() { deleteVertices(); } void BaseBox::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); newVertices(); for (int ii=0; iimapFromRef(vertices_[ii][jj],sys); pp[jj].x = (short)v[0]; pp[jj].y = (short)v[1]; } XDrawLines(display, drawable, lgc, pp, numPoints_, CoordModeOrigin); delete [] pp; } deleteVertices(); } void BaseBox::renderPS(int mode) { renderPSGC(mode); newVertices(); for (int ii=0; iimapFromRef(vertices_[ii][jj],Coord::CANVAS); ostringstream str; if (jj==0) str << "newpath " << endl << v.TkCanvasPs(parent->canvas) << " moveto" << endl << ends; else str << v.TkCanvasPs(parent->canvas) << " lineto" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } ostringstream str; str << "stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } deleteVertices(); } #ifdef MAC_OSX_TK void BaseBox::renderMACOSX() { renderMACOSXGC(); newVertices(); for (int ii=0; iimapFromRef(vertices_[ii][jj],Coord::CANVAS); macosxDrawLines(vv, numPoints_); delete [] vv; } deleteVertices(); } #endif #ifdef __WIN32 void BaseBox::renderWIN32() { renderWIN32GC(); newVertices(); for (int ii=0; iimapFromRef(vertices_[ii][jj],Coord::CANVAS); win32DrawLines(vv, numPoints_); delete [] vv; } deleteVertices(); } #endif // Support void BaseBox::updateHandles() { // handles are in canvas coords // we can't garantee that the radii have been sorted yet // also, annuli[i] could be negative if (handle) delete [] handle; handle = new Vector[numHandle]; Vector max; for(int ii=0; ii1) for (int ii=0; ii=ss[0]/2 || pp[1]<=-ss[1]/2 || pp[1]>ss[1]/2) return 0; else return 1; } Vector BaseBox::intersect(Vector rr, double aa) { // special cases if (!rr[0] || !rr[1]) return Vector(); double ang = zeroTWOPI(aa); double phi = rr.angle(); if (ang >= 0 && ang < phi) return Vector(rr[0],-rr[0]*tan(ang)); else if (ang >= phi && ang < M_PI-phi) return Vector(rr[1]/tan(ang),-rr[1]); else if (ang >= M_PI-phi && ang < M_PI+phi) return Vector(-rr[0],rr[0]*tan(ang)); else if (ang >= M_PI+phi && ang < M_TWOPI-phi) return Vector(-rr[1]/tan(ang),rr[1]); else return Vector(rr[0],-rr[0]*tan(ang)); } void BaseBox::newVertices() { if (vertices_) deleteVertices(); if (teq(startAng_,stopAng_-M_TWOPI,FLT_EPSILON)) newVerticesA(); else newVerticesB(); } void BaseBox::newVerticesA() { Matrix mm = fwdMatrix(); numPoints_ = 5; vertices_ = new Vector*[numAnnuli_+1]; for (int i=0; i=b1) && (a1b1) && (a2<=b2)) *s2 =1; if (((*s1) && (!(*s2))) || ((*s1) && (*s2))) vertBPrep(a1,a2,b1,b2,ii,cnt); if (*s1&&*s2) *s1=*s2=0; } void BaseBox::vertBPrep(double a1, double a2, double ll, double ul, int ii, int* cnt) { if (!(a1 >= ll) && (a1 <= ul)) a1 = ll; if (!(a2 >= ll) && (a2 <= ul)) a2 = ul; if (a1 > a2) { vertBSeg(ll,a2,ii,cnt); vertBSeg(a1,ul,ii,cnt); } else vertBSeg(a1,a2,ii,cnt); } void BaseBox::vertBSeg(double ang1, double ang2, int ii, int* cnt) { Vector rr = (annuli_[ii]/2).abs(); Matrix mm = fwdMatrix(); vertices_[ii][(*cnt)++] = intersect(rr,ang1)*mm; vertices_[ii][(*cnt)] = intersect(rr,ang2)*mm; } void BaseBox::deleteVertices() { if (vertices_) { for (int i=0; i& tag, const List& cb); BaseBox(const BaseBox&); virtual ~BaseBox(); virtual Marker* dup() =0; int isIn(const Vector& vv) {return isIn(vv, Coord::CANVAS);} int isIn(const Vector& vv, Coord::InternalSystem sys) {return isIn(vv,sys,numAnnuli_-1);} int isIn(const Vector& vv, Coord::InternalSystem sys, int nn) {return isInRef(bckMap(vv,sys),nn);} // valid for non-fixed only int isIn(const Vector& vv, const Matrix& bck) {return isIn(vv,bck,numAnnuli_-1);} int isIn(const Vector& vv, const Matrix& bck, int nn) {return isInRef(vv*bck,nn);} }; #endif saods9/tksao1.0/frame/basecommand.C000644 000765 000000 00000223751 12631357025 017411 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fdstream.hpp" #include #include "base.h" #include "context.h" #include "fitsimage.h" #include "mmap.h" #include "outfile.h" #include "outchannel.h" #include "outsocket.h" #include "sigbus.h" void Base::axesOrderCmd(int order) { currentContext->setAxesOrder(order); if (currentContext->fits) { if (!preserveMarkers) { // delete markers userMarkers.deleteAll(); undoUserMarkers.deleteAll(); pasteUserMarkers.deleteAll(); } catalogMarkers.deleteAll(); undoCatalogMarkers.deleteAll(); pasteCatalogMarkers.deleteAll(); analysisMarkers.deleteAll(); undoAnalysisMarkers.deleteAll(); pasteAnalysisMarkers.deleteAll(); currentContext->clearContour(); currentContext->auxcontours.deleteAll(); // don't clear the grid, we can reconstruct a new grid // if (grid) // delete grid; // grid = NULL; loadDone(1,IMG); } } void Base::bgColorCmd(const char* color) { if (bgColorName) delete [] bgColorName; bgColorName = dupstr(color); bgColor = getXColor(bgColorName); update(BASE); } void Base::binCmd(const Vector& b, const Vector& vv, const char* x, const char* y, const char* filter) { currentContext->setBinToFactor(b); currentContext->setBinDepth(1); if (currentContext->fits) { currentContext->fits->setBinX(x); currentContext->fits->setBinY(y); currentContext->fits->setBinFilter(filter); } Matrix mm = currentContext->bin(vv); updateBin(mm); } void Base::binCmd(const Vector& b, const char* x, const char* y, const char* filter) { currentContext->setBinToFactor(b); currentContext->setBinDepth(1); if (currentContext->fits) { currentContext->fits->setBinX(x); currentContext->fits->setBinY(y); currentContext->fits->setBinFilter(filter); } Matrix mm = currentContext->binCenter(); updateBin(mm); } void Base::binCmd(const Vector& b, int d, const Vector& lim, const Vector& vv, const char* x, const char* y, const char* z, const char* filter) { currentContext->setBinToFactor(b); currentContext->setBinDepth(d); if (currentContext->fits) { currentContext->fits->setBinX(x); currentContext->fits->setBinY(y); currentContext->fits->setBinZ(z); currentContext->fits->setBinFilter(filter); currentContext->fits->setBinColMinMax(z,lim); } Matrix mm = currentContext->bin(vv); updateBin(mm); } void Base::binCmd(const Vector& b, int d, const Vector& lim, const char* x, const char* y, const char* z, const char* filter) { currentContext->setBinToFactor(b); currentContext->setBinDepth(d); if (currentContext->fits) { currentContext->fits->setBinX(x); currentContext->fits->setBinY(y); currentContext->fits->setBinZ(z); currentContext->fits->setBinFilter(filter); currentContext->fits->setBinColMinMax(z,lim); } Matrix mm = currentContext->binCenter(); updateBin(mm); } void Base::binAboutCmd() { Matrix mm = currentContext->binCenter(); updateBin(mm); } void Base::binAboutCmd(const Vector& vv) { Matrix mm = currentContext->bin(vv); updateBin(mm); } void Base::binBufferSizeCmd(int size) { currentContext->setBinBufferSize(size); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binColsCmd(const char* x, const char* y, const char* z) { if (currentContext->fits) { currentContext->fits->setBinX(x); currentContext->fits->setBinY(y); currentContext->fits->setBinZ(z); } Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binDepthCmd(int d) { currentContext->setBinDepth(d); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binFactorCmd(const Vector& bb) { currentContext->setBinFactor(bb); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binFactorAboutCmd(const Vector& bb, const Vector& vv) { currentContext->setBinFactor(bb); Matrix mm = currentContext->bin(vv); updateBin(mm); } void Base::binFactorToCmd(const Vector& bb) { currentContext->setBinToFactor(bb); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binFactorToAboutCmd(const Vector& bb, const Vector& vv) { currentContext->setBinToFactor(bb); Matrix mm = currentContext->bin(vv); updateBin(mm); } void Base::binFunctionCmd(FitsHist::Function func) { currentContext->setBinFunction(func); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::binFilterCmd(const char* filter) { if (currentContext->fits) currentContext->fits->setBinFilter(filter); Matrix mm = currentContext->binCursor(); updateBin(mm); } void Base::blockCmd(const Vector& bb) { Vector vv = currentContext->setBlockFactor(bb); currentContext->block(); currentContext->analysis(); updateBlock(vv); } void Base::blockToCmd(const Vector& bb) { Vector vv = currentContext->setBlockToFactor(bb); currentContext->block(); currentContext->analysis(); updateBlock(vv); } void Base::centerCmd() { centerImage(); update(MATRIX); } void Base::clearCmd() { unloadAllFits(); reset(); } void Base::clipMinMaxModeCmd(FrScale::MinMaxMode mm) { if (currentContext->frScale.mmMode() != mm) { currentContext->frScale.setMMMode(mm); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipModeCmd(float per) { if (per == 100) { if (currentContext->frScale.clipMode() != FrScale::MINMAX) { currentContext->frScale.setClipMode(FrScale::MINMAX); currentContext->updateClip(); updateColorScale(); update(BASE); } } else { if (currentContext->frScale.clipMode() != FrScale::AUTOCUT || currentContext->frScale.autoCutPer() != per) { currentContext->frScale.setAutoCutPer(per); currentContext->frScale.setClipMode(FrScale::AUTOCUT); currentContext->updateClip(); updateColorScale(); update(BASE); } } } void Base::clipModeCmd(FrScale::ClipMode mm) { if (currentContext->frScale.clipMode() != mm) { currentContext->frScale.setClipMode(mm); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipPreserveCmd(int r) { // backward compatibility // used by backup } void Base::clipScopeCmd(FrScale::ClipScope ss) { currentContext->frScale.setClipScope(ss); currentContext->updateClip(); updateColorScale(); update(BASE); } void Base::clipUserCmd(double ll, double hh) { if (currentContext->frScale.uLow() != ll || currentContext->frScale.uHigh() != hh) { currentContext->frScale.setULow(ll); currentContext->frScale.setUHigh(hh); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipUserLowCmd(double ll) { if (currentContext->frScale.uLow() != ll) { currentContext->frScale.setULow(ll); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipUserHighCmd(double hh) { if (currentContext->frScale.uHigh() != hh) { currentContext->frScale.setUHigh(hh); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipZScaleContrastCmd(float cc) { if (currentContext->frScale.zContrast() != cc) { currentContext->frScale.setZContrast(cc); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipZScaleSampleCmd(int ss) { if (currentContext->frScale.zSample() != ss) { currentContext->frScale.setZSample(ss); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::clipZScaleLineCmd(int ll) { if (currentContext->frScale.zLine() != ll) { currentContext->frScale.setZLine(ll); currentContext->updateClip(); updateColorScale(); update(BASE); } } void Base::colorbarTagCmd(const char* str) { if (colorbartag) delete [] colorbartag; colorbartag = dupstr(str); } void Base::cropCmd() { currentContext->frScale.resetScanMode(); FitsImage* sptr = currentContext->fits; while (sptr) { sptr->setCropParams(currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } // used for Backup void Base::cropCmd(const Vector& aa, const Vector& bb, Coord::CoordSystem sys, Coord::SkyFrame sky) { FitsImage* ptr = currentContext->fits; if (!ptr) return; Vector ss = ptr->mapToRef(aa,sys,sky); Vector tt = ptr->mapToRef(bb,sys,sky); currentContext->frScale.setScanMode(FrScale::CROPSEC); FitsImage* sptr = ptr; while (sptr) { sptr->setCropParams(ss*sptr->refToData, tt*sptr->refToData, currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::cropCenterCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky, const Vector& wh, Coord::CoordSystem dsys, Coord::SkyDist dist) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // params are in DATA coords Vector cc = ptr->mapToRef(vv,sys,sky)*ptr->refToData; Vector dd = ptr->mapLenToImage(wh,dsys,dist); Vector ll = (cc-dd/2).round(); Vector ur = (cc+dd/2).round(); currentContext->frScale.setScanMode(FrScale::CROPSEC); FitsImage* sptr = ptr; while (sptr) { sptr->setCropParams(ll,ur,currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::cropBeginCmd(const Vector& vv) { cropBegin = vv; cropEnd = vv; } void Base::cropMotionCmd(const Vector& vv) { Vector ss = mapToRef(cropBegin, Coord::CANVAS); // erase if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { Vector tt = mapToRef(cropEnd, Coord::CANVAS); Vector ll = mapFromRef(ss, Coord::CANVAS); Vector lr = mapFromRef(Vector(tt[0],ss[1]), Coord::CANVAS); Vector ur = mapFromRef(tt, Coord::CANVAS); Vector ul = mapFromRef(Vector(ss[0],tt[1]), Coord::CANVAS); BBox bb(ll); bb.bound(lr); bb.bound(ur); bb.bound(ul); redrawNow(bb.expand(2)); } cropEnd = vv; // and draw to window { Vector tt = mapToRef(cropEnd, Coord::CANVAS); Vector ll = mapFromRef(ss, Coord::WINDOW); Vector lr = mapFromRef(Vector(tt[0],ss[1]), Coord::WINDOW); Vector ur = mapFromRef(tt, Coord::WINDOW); Vector ul = mapFromRef(Vector(ss[0],tt[1]), Coord::WINDOW); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ll[0],ll[1],lr[0],lr[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,lr[0],lr[1],ur[0],ur[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ur[0],ur[1],ul[0],ul[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ul[0],ul[1],ll[0],ll[1]); } } void Base::cropEndCmd(const Vector& vv) { Vector ss = mapToRef(cropBegin, Coord::CANVAS); // erase if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { Vector tt = mapToRef(cropEnd, Coord::CANVAS); Vector ll = mapFromRef(ss, Coord::CANVAS); Vector lr = mapFromRef(Vector(tt[0],ss[1]), Coord::CANVAS); Vector ur = mapFromRef(tt, Coord::CANVAS); Vector ul = mapFromRef(Vector(ss[0],tt[1]), Coord::CANVAS); BBox bb(ll); bb.bound(lr); bb.bound(ur); bb.bound(ul); redrawNow(bb.expand(2)); } // and crop cropEnd = vv; if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { Vector tt = mapToRef(cropEnd, Coord::CANVAS); if (!isMosaic()) { currentContext->frScale.setScanMode(FrScale::CROPSEC); FitsImage* sptr = currentContext->fits; while (sptr) { sptr->setCropParams(ss*sptr->refToData, tt*sptr->refToData, currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } } else { FitsImage* ptr1 =NULL; FitsImage* ptr2 =NULL; if ((ptr1=isInFits(cropBegin,Coord::CANVAS,NULL)) == (ptr2=isInFits(cropEnd,Coord::CANVAS,NULL))) { currentContext->frScale.setScanMode(FrScale::CROPSEC); // clear any previous params FitsImage* ptr = currentContext->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->setCropParams(currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } FitsImage* sptr = ptr1; while (sptr) { sptr->setCropParams(ss*sptr->refToData, tt*sptr->refToData, currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } } } else { currentContext->frScale.resetScanMode(); currentContext->setCrop3dParams(); FitsImage* sptr = currentContext->fits; while (sptr) { sptr->setCropParams(currentContext->frScale.datasec()); sptr = sptr->nextSlice(); } } currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::crop3dCmd() { currentContext->frScale.resetScanMode(); currentContext->setCrop3dParams(); currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::crop3dCmd(double z0, double z1, Coord::CoordSystem sys) { // use first slice FitsImage* ptr = currentContext->fits; if (!ptr) return; // ff/tt ranges 0-n double ff = ptr->mapToRef3axis(z0,sys,2); double tt = ptr->mapToRef3axis(z1,sys,2); // params is a BBOX in DATA coords 0-n currentContext->setCrop3dParams(ff-.5,tt+.5); // set current slice if needed // setSlice() IMAGE (ranges 1-n) // context->slice() IMAGE (ranges 1-n) double sl = currentContext->slice(2)-.5; if (sltt) setSlice(2,tt+.5); currentContext->frScale.setScanMode(FrScale::CROPSEC); currentContext->updateClip(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Base::crosshairCmd(int which) { useCrosshair = which ? 1 : 0; update(PIXMAP); } void Base::crosshairCmd(const Vector& vv, Coord::InternalSystem sys) { useCrosshair = 1; crosshair = mapToRef(vv, sys); update(PIXMAP); } void Base::crosshairCmd(const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky) { useCrosshair = 1; if (currentContext->cfits) crosshair = currentContext->cfits->mapToRef(v, sys, sky); update(PIXMAP); } void Base::crosshairWarpCmd(const Vector& vv) { useCrosshair = 1; // use matrix, not map() for 3d Vector rr = crosshair*refToCanvas; rr += vv; crosshair = rr*canvasToRef; update(PIXMAP); updateMagnifier(); } void Base::colorScaleCmd(FrScale::ColorScaleType s) { if (currentContext->frScale.colorScaleType() != s) { currentContext->frScale.setColorScaleType(s); updateColorScale(); update(BASE); } } void Base::colorScaleLogCmd(double exp) { if (currentContext->frScale.expo() != exp) { currentContext->frScale.setExpo(exp); if (currentContext->frScale.colorScaleType() == FrScale::LOGSCALE) { updateColorScale(); update(BASE); } } } void Base::contourAuxHeadCmd() { currentContext->contourAuxHead(); } void Base::contourAuxNextCmd() { currentContext->contourAuxNext(); } void Base::contourAuxSaveCmd(const char* fn, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (currentContext->cfits && hasContourAux()) { ofstream str(fn); if (str) { List& c = (List&)(currentContext->auxcontours.current()->contours()); if (c.head()) do { Vector v = c.current()->vector; if (v[0] != DBL_MAX) str << setiosflags(ios::scientific) << setprecision(8) << currentContext->cfits->mapFromRef(v, sys, sky); str << endl; } while (c.next()); } } } void Base::contourCopyCmd(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (currentContext->cfits && hasContour()) { List* v = new List(currentContext->contour->contours()); if (v->head()) do { Vector& w = v->current()->vector; if (w[0] != DBL_MAX) w = currentContext->cfits->mapFromRef(w, sys, sky); } while (v->next()); ostringstream str; str << hex << v << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::contourCreateCmd(const char* color, int width, int dash, FVContour::Method method, int numlevel, int smooth, FrScale::ColorScaleType colorScaleType, float expo, float clipMode, Vector limits, const char* level) { if (DebugPerf) cerr << "Base::contourCreate()" << endl; currentContext->clearContour(); InverseScale* scale =NULL; if (level && strlen(level)>0) { int cnt = 0; double levels[100]; string x(level); istringstream str(x); while ((cnt<100) && (str >> levels[cnt])) cnt++; scale = new InverseScale(cnt, levels); } else { switch (colorScaleType) { case FrScale::LINEARSCALE: scale = new LinearInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::LOGSCALE: scale = new LogInverseScale(numlevel, limits[0], limits[1], expo); break; case FrScale::POWSCALE: scale = new PowInverseScale(numlevel, limits[0], limits[1], expo); break; case FrScale::SQRTSCALE: scale = new SqrtInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::SQUAREDSCALE: scale = new SquaredInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::ASINHSCALE: scale = new AsinhInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::SINHSCALE: scale = new SinhInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::HISTEQUSCALE: scale = new HistEquInverseScale(numlevel, limits[0], limits[1], currentContext->histequ(), HISTEQUSIZE); break; case FrScale::IISSCALE: scale = new IISInverseScale(numlevel, limits[0], limits[1], currentContext->fits->iisz()); break; } } if (!isMosaic()) { if (currentContext->cfits) currentContext->setContour(new FVContour(this, currentContext->cfits, color, width, dash, method, numlevel, smooth, level, colorScaleType, expo, clipMode, limits, scale)); } else { if (currentContext->fits) { currentContext->setContour(new FVContour(this, currentContext->fits, color, width, dash, method, numlevel, smooth, level, colorScaleType, expo, clipMode, limits, scale)); FitsImage* ptr = currentContext->fits->nextMosaic(); while (ptr) { currentContext->contour->append(ptr); ptr = ptr->nextMosaic(); } } } update(PIXMAP); } void Base::contourDeleteCmd() { currentContext->clearContour(); update(PIXMAP); } void Base::contourDeleteAllCmd() { currentContext->clearContour(); currentContext->auxcontours.deleteAll(); update(PIXMAP); } void Base::contourLoadCmd(const char* color, int w, int d, const char* fn, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!currentContext->cfits) return; ifstream str(fn); if (str) { List c; while (!str.eof()) { Vertex* vv; char buf[64]; str.getline(buf,64,'\n'); if (strlen(buf) > 0) { Vector v; string x(buf); istringstream sstr(x); sstr >> v[0] >> v[1]; vv = new Vertex(currentContext->fits->mapToRef(v, sys, sky)); } else vv = new Vertex(Vector(DBL_MAX, DBL_MAX)); c.append(vv); } currentContext->auxcontours.append(new Contour(this, color, w, d, c)); } update(PIXMAP); } void Base::contourPasteCmd(const char* c, int w, int d, void* u, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!currentContext->cfits) return; List* v = (List*)u; if (v->head()) do { Vector& w = v->current()->vector; if (w[0] != DBL_MAX) w = currentContext->fits->mapToRef(w, sys, sky); } while (v->next()); currentContext->auxcontours.append(new Contour(this, c, w, d, *v)); delete v; update(PIXMAP); } void Base::contourSaveCmd(const char* fn, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (currentContext->cfits && hasContour()) { ofstream str(fn); if (str) { List& c = (List&)(currentContext->contour->contours()); if (c.head()) do { Vector v = (c.current())->vector; if (v[0] != DBL_MAX && v[1] != DBL_MAX) str << setiosflags(ios::scientific) << setprecision(8) << currentContext->cfits->mapFromRef(v, sys, sky) << endl; else str << endl; } while (c.next()); } } } void Base::contourSetColorCmd(const char* clr) { if (hasContour()) { currentContext->contour->setColor(clr); update(PIXMAP); } } void Base::contourSetDashCmd(int d) { if (hasContour()) { currentContext->contour->setDash(d); update(PIXMAP); } } void Base::contourSetLineWidthCmd(int w) { if (hasContour()) { currentContext->contour->setLineWidth(w); update(PIXMAP); } } void Base::DATASECCmd(int which) { currentContext->frScale.setDataSec(which); currentContext->frScale.resetScanMode(); currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); } void Base::fitsyHasExtCmd(const char* fn) { // verify that we have an ext specified if (fn && (fn[strlen(fn)-1] != ']')) { Tcl_AppendResult(interp, "0", NULL); return; } FitsFile* ext = new FitsFitsMMap(fn, FitsFile::EXACT); if (ext->isValid()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); delete ext; return; } void Base::getAxesOrderCmd() { printInteger(currentContext->axesOrder()); } void Base::getBgColorCmd() { Tcl_AppendResult(interp, bgColorName, NULL); } void Base::getBinCursorCmd() { if (currentContext->fits) printVector(currentContext->fits->getHistCursor(), DEFAULT); } void Base::getBinColsCmd() { if (currentContext->fits && currentContext->fits->isHist()) if (currentContext->binDepth()>1) Tcl_AppendResult(interp, currentContext->fits->getHistX(), " ", currentContext->fits->getHistY(), " ", currentContext->fits->getHistZ(), NULL); else Tcl_AppendResult(interp, currentContext->fits->getHistX(), " ", currentContext->fits->getHistY(), NULL); else Tcl_AppendResult(interp, "", NULL); } void Base::getBinColsMinMaxCmd(const char* col) { if (currentContext->fits && col && *col) printVector(currentContext->fits->getHistColMinMax(col), DEFAULT); } void Base::getBinColsDimCmd(const char* col) { if (currentContext->fits && col && *col) printVector(currentContext->fits->getHistColDim(col), DEFAULT); } void Base::getBinDepthCmd() { printDouble(currentContext->binDepth(), DEFAULT); } void Base::getBinFactorCmd() { printVector(currentContext->binFactor(), DEFAULT); } void Base::getBinFunctionCmd() { switch (currentContext->binFunction()) { case FitsHist::AVERAGE: Tcl_AppendResult(interp, "average", NULL); return; case FitsHist::SUM: Tcl_AppendResult(interp, "sum", NULL); return; } } void Base::getBinBufferSizeCmd() { printInteger(currentContext->binBufferSize()); } void Base::getBinFilterCmd() { if (currentContext->fits && currentContext->fits->isHist()) Tcl_AppendResult(interp, currentContext->fits->getHistFilter(), NULL); else Tcl_AppendResult(interp, "", NULL); } void Base::getBinListCmd() { if (currentContext->fits && currentContext->fits->isHist()) { char* cols = currentContext->fits->getHistList(); Tcl_AppendResult(interp, cols, NULL); delete [] cols; } else Tcl_AppendResult(interp, "", NULL); } void Base::getBitpixCmd() { if (currentContext->cfits) printInteger(currentContext->cfits->bitpix()); } void Base::getBlockCmd() { printVector(currentContext->blockFactor(), DEFAULT); } void Base::getClipCmd() { if (DebugPerf) cerr << "getClipCmd()" << endl; printVector(currentContext->getClip(), DEFAULT); } void Base::getClipCmd(float per) { if (DebugPerf) cerr << "getClipCmd(float)" << endl; FrScale::ClipMode cm = (per == 100) ? FrScale::MINMAX : FrScale::AUTOCUT; float ac = per; ostringstream str; str << currentContext->getClip(cm, ac) << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getClipCmd(FrScale::ClipMode cm) { if (DebugPerf) cerr << "getClipCmd(FrScale::ClipMode)" << endl; printVector(currentContext->getClip(cm, currentContext->frScale.autoCutPer()), DEFAULT); } void Base::getClipMinMaxModeCmd() { switch (currentContext->frScale.mmMode()) { case FrScale::SCAN: Tcl_AppendResult(interp, "scan", NULL); return; case FrScale::DATAMIN: Tcl_AppendResult(interp, "datamin", NULL); return; case FrScale::IRAFMIN: Tcl_AppendResult(interp, "irafmin", NULL); return; } } void Base::getClipMinMaxSampleCmd() { Tcl_AppendResult(interp, "1", NULL); } void Base::getClipModeCmd() { switch (currentContext->frScale.clipMode()) { case FrScale::MINMAX: Tcl_AppendResult(interp, "minmax", NULL); break; case FrScale::ZSCALE: Tcl_AppendResult(interp, "zscale", NULL); break; case FrScale::ZMAX: Tcl_AppendResult(interp, "zmax", NULL); break; case FrScale::AUTOCUT: printDouble(currentContext->frScale.autoCutPer(), DEFAULT); break; case FrScale::USERCLIP: Tcl_AppendResult(interp, "user", NULL); break; } } void Base::getClipPreserveCmd() { // backward compatibility // used by backup Tcl_AppendResult(interp, "0", NULL); } void Base::getClipScopeCmd() { switch (currentContext->frScale.clipScope()) { case FrScale::GLOBAL: Tcl_AppendResult(interp, "global", NULL); break; case FrScale::LOCAL: Tcl_AppendResult(interp, "local", NULL); break; } } void Base::getClipUserCmd() { printVector(Vector(currentContext->frScale.uLow(), currentContext->frScale.uHigh()), DEFAULT); } void Base::getClipZScaleContrastCmd() { ostringstream str; str << currentContext->frScale.zContrast() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getClipZScaleSampleCmd() { ostringstream str; str << currentContext->frScale.zSample() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getClipZScaleLineCmd() { ostringstream str; str << currentContext->frScale.zLine() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getColorbarTagCmd() { if (colorbartag) Tcl_AppendResult(interp, colorbartag, NULL); } void Base::getColorMapLevelCmd(int count) { if (currentContext->cfits) { getColorMapLevelCmd(count, currentContext->cfits->low(), currentContext->cfits->high(), currentContext->frScale.colorScaleType(), currentContext->frScale.expo()); } else getColorMapLevelCmd(count, currentContext->frScale.low(), currentContext->frScale.high(), currentContext->frScale.colorScaleType(), currentContext->frScale.expo()); } void Base::getColorMapLevelCmd(int count, const Vector& vv, Coord::InternalSystem ref) { if (currentContext->cfits) { if (FitsImage* ptr=isInCFits(vv,ref,NULL)) { getColorMapLevelCmd(count, ptr->low(), ptr->high(), currentContext->frScale.colorScaleType(), currentContext->frScale.expo()); return; } } getColorMapLevelCmd(count, currentContext->frScale.low(), currentContext->frScale.high(), currentContext->frScale.colorScaleType(), currentContext->frScale.expo()); } void Base::getColorMapLevelCmd(int count, double ll, double hh, FrScale::ColorScaleType scaleType, float expo) { if (inverseScale) delete inverseScale; inverseScale = NULL; switch (scaleType) { case FrScale::LINEARSCALE: inverseScale = new LinearInverseScale(count, ll, hh); break; case FrScale::LOGSCALE: inverseScale = new LogInverseScale(count, ll, hh, expo); break; case FrScale::POWSCALE: inverseScale = new PowInverseScale(count, ll, hh, expo); break; case FrScale::SQRTSCALE: inverseScale = new SqrtInverseScale(count, ll, hh); break; case FrScale::SQUAREDSCALE: inverseScale = new SquaredInverseScale(count, ll, hh); break; case FrScale::ASINHSCALE: inverseScale = new AsinhInverseScale(count, ll, hh); break; case FrScale::SINHSCALE: inverseScale = new SinhInverseScale(count, ll, hh); break; case FrScale::HISTEQUSCALE: inverseScale = new HistEquInverseScale(count, ll, hh, currentContext->histequ(), HISTEQUSIZE); break; case FrScale::IISSCALE: inverseScale = new IISInverseScale(count, ll, hh, currentContext->fits->iisz()); break; } if (inverseScale) { ostringstream str; str << inverseScale->size() << ' ' << inverseScale->level() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getColorScaleCmd() { switch (currentContext->frScale.colorScaleType()) { case FrScale::LINEARSCALE: Tcl_AppendResult(interp, "linear", NULL); break; case FrScale::LOGSCALE: Tcl_AppendResult(interp, "log", NULL); break; case FrScale::POWSCALE: Tcl_AppendResult(interp, "pow", NULL); break; case FrScale::SQRTSCALE: Tcl_AppendResult(interp, "sqrt", NULL); break; case FrScale::SQUAREDSCALE: Tcl_AppendResult(interp, "squared", NULL); break; case FrScale::ASINHSCALE: Tcl_AppendResult(interp, "asinh", NULL); break; case FrScale::SINHSCALE: Tcl_AppendResult(interp, "sinh", NULL); break; case FrScale::HISTEQUSCALE: Tcl_AppendResult(interp, "histequ", NULL); break; case FrScale::IISSCALE: Tcl_AppendResult(interp, "linear", NULL); break; } } void Base::getColorScaleLevelCmd(int count, double ll, double hh, FrScale::ColorScaleType scaleType, float expo) { InverseScale* scale; switch (scaleType) { case FrScale::LINEARSCALE: scale = new LinearInverseScale(count, ll, hh); break; case FrScale::LOGSCALE: scale = new LogInverseScale(count, ll, hh, expo); break; case FrScale::POWSCALE: scale = new PowInverseScale(count, ll, hh, expo); break; case FrScale::SQRTSCALE: scale = new SqrtInverseScale(count, ll, hh); break; case FrScale::SQUAREDSCALE: scale = new SquaredInverseScale(count, ll, hh); break; case FrScale::ASINHSCALE: scale = new AsinhInverseScale(count, ll, hh); break; case FrScale::SINHSCALE: scale = new SinhInverseScale(count, ll, hh); break; case FrScale::HISTEQUSCALE: scale = new HistEquInverseScale(count, ll, hh, currentContext->histequ(), HISTEQUSIZE); break; case FrScale::IISSCALE: scale = new IISInverseScale(count, ll, hh, currentContext->fits->iisz()); break; } ostringstream str; str << *scale << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); delete scale; } void Base::getColorScaleLogCmd() { ostringstream str; str << currentContext->frScale.expo() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getContourCmd(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (currentContext->cfits && hasContour()) { List& v = (List&)(currentContext->contour->contours()); if (v.head()) do { Vector w = v.current()->vector; if (w[0] != DBL_MAX) printVector(currentContext->cfits->mapFromRef(w, sys, sky),DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } while (v.next()); } } void Base::getContourMethodCmd() { if (hasContour()) Tcl_AppendResult(interp, currentContext->contour->methodName(), NULL); } void Base::getContourClipCmd() { if (hasContour()) printVector(currentContext->contour->limits(),DEFAULT); } void Base::getContourClipModeCmd() { if (hasContour()) { if (currentContext->contour->clipMode() == FrScale::MINMAX) Tcl_AppendResult(interp, "minmax", NULL); else if (currentContext->contour->clipMode() == FrScale::ZSCALE) Tcl_AppendResult(interp, "zscale", NULL); else if (currentContext->contour->clipMode() == FrScale::ZMAX) Tcl_AppendResult(interp, "zmax", NULL); else if (currentContext->contour->clipMode() == FrScale::USERCLIP) Tcl_AppendResult(interp, "user", NULL); else { ostringstream str; str << currentContext->contour->clipMode() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } } void Base::getContourColorNameCmd() { if (hasContour()) Tcl_AppendResult(interp, currentContext->contour->getColorName(), NULL); } void Base::getContourAuxColorNameCmd() { if (hasContourAux()) Tcl_AppendResult(interp, currentContext->auxcontours.current()->getColorName(), NULL); } void Base::getContourDashCmd() { if (hasContour() && currentContext->contour->getDash()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getContourAuxDashCmd() { if (hasContourAux() && currentContext->auxcontours.current()->getDash()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getContourLevelCmd() { if (hasContour()) Tcl_AppendResult(interp, currentContext->contour->level(), NULL); } void Base::getContourLineWidthCmd() { if (hasContour()) { ostringstream str; str << currentContext->contour->getLineWidth() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getContourAuxLineWidthCmd() { if (hasContourAux()) { ostringstream str; str << currentContext->auxcontours.current()->getLineWidth() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getContourNumLevelCmd() { if (hasContour()) { ostringstream str; str << currentContext->contour->numLevel() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getContourSmoothCmd() { if (hasContour()) { ostringstream str; str << currentContext->contour->smooth() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getContourScaleCmd() { if (hasContour()) switch (currentContext->contour->colorScaleType()) { case FrScale::LINEARSCALE: Tcl_AppendResult(interp, "linear", NULL); break; case FrScale::LOGSCALE: Tcl_AppendResult(interp, "log", NULL); break; case FrScale::POWSCALE: Tcl_AppendResult(interp, "pow", NULL); break; case FrScale::SQRTSCALE: Tcl_AppendResult(interp, "sqrt", NULL); break; case FrScale::SQUAREDSCALE: Tcl_AppendResult(interp, "squared", NULL); break; case FrScale::ASINHSCALE: Tcl_AppendResult(interp, "asinh", NULL); break; case FrScale::SINHSCALE: Tcl_AppendResult(interp, "sinh", NULL); break; case FrScale::HISTEQUSCALE: Tcl_AppendResult(interp, "histequ", NULL); break; case FrScale::IISSCALE: Tcl_AppendResult(interp, "linear", NULL); break; } } void Base::getContourScaleLogCmd() { if (hasContour()) { ostringstream str; str << currentContext->contour->expo() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getCoordCmd(const Vector& vv, Coord::CoordSystem out, Coord::SkyFrame sky, Coord::SkyFormat format) { if (FitsImage* ptr=isInCFits(vv,Coord::CANVAS,NULL)) printFromRef(ptr, mapToRef(vv,Coord::CANVAS), out, sky, format, DEFAULT); } void Base::getCoord3axisCmd(double vv, Coord::CoordSystem in, Coord::CoordSystem out, int ss) { if (currentContext->cfits) { if (in==out) printDouble(vv, DEFAULT); else { // use first slice double rr = currentContext->fits->mapToRef3axis(vv,in,ss); double tt = currentContext->fits->mapFromRef3axis(rr,out,ss); printDouble(tt, DEFAULT); } } else printDouble(0,DEFAULT); } // used for Backup void Base::getCropCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // params are in DATA coords FitsBound* params =ptr->getDataParams(currentContext->frScale.scanMode()); Vector ll = Vector(params->xmin,params->ymin); Vector ur = Vector(params->xmax,params->ymax); printFromRef(ptr, ll*ptr->dataToRef, sys, sky, format, DEFAULT); printFromRef(ptr, ur*ptr->dataToRef, sys, sky, format, DEFAULT); } void Base::getCropCenterCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Coord::CoordSystem dcoord, Coord::SkyDist dist) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // params are in DATA coords FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); Vector ll = Vector(params->xmin,params->ymin); Vector ur = Vector(params->xmax,params->ymax); Vector cc = (ur-ll)/2.+ll; Vector dd = ur-ll; printFromRef(ptr, cc*ptr->dataToRef , sys, sky, format, DEFAULT); printVector(ptr->mapLenFromImage(dd, dcoord, dist), DEFAULT); } void Base::getCrop3dCmd(Coord::CoordSystem sys) { // use first slice FitsImage* ptr = currentContext->fits; if (!ptr) return; FitsZBound* zparams = currentContext->getDataParams(currentContext->frScale.scanMode()); double ff = ptr->mapFromRef3axis(zparams->zmin+.5,sys,2); double tt = ptr->mapFromRef3axis(zparams->zmax-.5,sys,2); ostringstream str; str << ff << ' ' << tt << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getCrosshairCmd(Coord::InternalSystem sys) { printVector(mapFromRef(crosshair, sys), DEFAULT); } void Base::getCrosshairCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Precision pp) { if (currentContext->cfits) printFromRef(currentContext->cfits, crosshair, sys, sky, format, pp); else printVector(Vector(), DEFAULT); } void Base::getCrosshairStatusCmd() { if (useCrosshair) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getDATASECCmd() { if (currentContext->frScale.datasec()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getDataValuesCmd(const Vector& vv, Coord::InternalSystem ref, const Vector& ss) { Vector rr; FitsImage* ptr = isInCFits(vv, ref, &rr); if (!ptr) return; Vector ll = rr - Vector((((Vector&)ss)[0]-1)/2,(((Vector&)ss)[1]-1)/2); SETSIGBUS for (int jj=0; jj<((Vector&)ss)[1]; jj++) { for (int ii=0; ii<((Vector&)ss)[0]; ii++) { Vector dd = (ll+Vector(ii,jj)) * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (dd[0]>=params->xmin && dd[0]xmax && dd[1]>=params->ymin && dd[1]ymax) Tcl_AppendResult(interp, (char*)ptr->getValue(dd), " ", NULL); } } CLEARSIGBUS } void Base::getDataValuesCmd(int which, const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky, const Vector& dd, char* var) { // clear an previous values Tcl_UnsetVar(interp,var,0); // find anchor point FitsImage* base = currentContext->cfits; for (int ii=1; iinextMosaic(); if (!base) { Tcl_SetVar(interp,var,"",0); result = TCL_ERROR; return; } Vector ll = base->mapLenToRef(dd,sys,Coord::DEGREE); Vector bb = base->mapToRef(vv,sys,sky); SETSIGBUS for (int ii=0; iimapFromRef(rr,sys,sky); ostringstream str; str << setprecision(12) << in[0] << ',' << in[1] << ends; int found = 0; FitsImage* ptr = currentContext->fits; while (ptr) { Vector ss = rr * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (ss[0]>=params->xmin && ss[0]xmax && ss[1]>=params->ymin && ss[1]ymax) { Tcl_SetVar2(interp,var,str.str().c_str(),(char*)ptr->getValue(ss),0); found = 1; break; } ptr = ptr->nextMosaic(); } if (!found) Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } } CLEARSIGBUS } void Base::getFitsNAxesCmd() { printInteger(currentContext->naxes()); } void Base::getFitsCenterCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Precision pp) { if (keyContext && keyContext->fits) printFromRef(keyContext->fits, imageCenter(keyContext->frScale.scanMode())* keyContext->fits->imageToRef, sys, sky, format, pp); else printVector(Vector(), DEFAULT); } void Base::getFitsCountCmd() { printInteger(fitsCount()); } void Base::getFitsDepthCmd(int ii) { printInteger(currentContext->naxis(ii)); } void Base::getFitsExtCmd(int which) { which = abs(which); FitsImage* rr = findAllFits(which); if (rr) { ostringstream str; str << rr->ext() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } void Base::getFitsExtCmd(const Vector& vv, Coord::InternalSystem ref) { if (FitsImage* ptr=isInCFits(vv,ref,NULL)) { ostringstream str; str << ptr->ext() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } else { Tcl_AppendResult(interp, "", NULL); } } void Base::getFitsHeaderCmd(int which) { int prim = which < 0 ? 1:0; which = abs(which); // modified for medatacube FitsImage* rr = findAllFits(which); if (rr) { char* hh = !prim ? rr->displayHeader() : rr->displayPrimary(); Tcl_AppendResult(interp, hh, NULL); delete [] hh; } else result = TCL_ERROR; } void Base::getFitsHeaderKeywordCmd(int which, const char* key) { which = abs(which); FitsImage* rr = findAllFits(which); if (rr) { char* value = rr->getKeyword(key); if (value) { Tcl_AppendResult(interp, value, NULL); delete [] value; return; } } } void Base::getFitsHeaderWCSCmd(int which) { // no primary FitsImage* rr = findAllFits(which); if (rr) { char* hh = rr->displayWCS(); Tcl_AppendResult(interp, hh, NULL); delete [] hh; } else result = TCL_ERROR; } void Base::getFitsHeightCmd() { if (currentContext->cfits) printInteger(currentContext->cfits->height()); } void Base::getFitsFileNameCmd(FileNameType type) { if (currentContext->cfits) Tcl_AppendResult(interp, currentContext->cfits->getFileName(type), NULL); } void Base::getFitsFileNameCmd(int which, FileNameType type) { FitsImage* rr = findAllFits(which); if (rr) Tcl_AppendResult(interp, rr->getFileName(type), NULL); else result = TCL_ERROR; } void Base::getFitsFileNameCmd(const Vector& vv, Coord::InternalSystem ref, FileNameType type) { if (FitsImage* ptr=isInCFits(vv,ref,NULL)) Tcl_AppendResult(interp, ptr->getFileName(type), NULL); } void Base::getFitsObjectNameCmd() { if (currentContext->cfits) Tcl_AppendResult(interp, currentContext->cfits->objectKeyword(), NULL); } void Base::getFitsSizeCmd() { if (keyContext->fits) printVector(keyContext->fits->size(), DEFAULT); else printVector(Vector(), DEFAULT); } void Base::getFitsSizeCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyDist dist, Precision pp) { if (keyContext->fits) { if (!keyContext->fits->hasWCSCel(sys)) { printVector(Vector(), DEFAULT); return; } BBox bb = imageBBox(keyContext->frScale.scanMode()); Matrix mm = keyContext->fits->imageToRef; Vector ll = bb.ll * mm; Vector lr = bb.lr() * mm; Vector ur = bb.ur * mm; Vector ul = bb.ul() * mm; Vector ww[4]; ww[0] = keyContext->fits->mapFromRef(ll,sys,sky); ww[1] = keyContext->fits->mapFromRef(lr,sys,sky); ww[2] = keyContext->fits->mapFromRef(ur,sys,sky); ww[3] = keyContext->fits->mapFromRef(ul,sys,sky); // we need to check for the case of crossing 0 in ra // since ra is returned as 0 > ra > 360 { float min = 360; float max = 0; for (int ii=0; ii<4; ii++) { if (ww[ii][0]max) max=ww[ii][0]; } // ok, we have a problem if (max-min > 180) for (int ii=0; ii<4; ii++) if (ww[ii][0] > 180) ww[ii][0] -= 360; } BBox wbb(ww[0],ww[0]); for (int ii=1; ii<4; ii++) wbb.bound(ww[ii]); Vector ss(keyContext->fits->wcsdist(wbb.ll,wbb.lr(),sys), keyContext->fits->wcsdist(wbb.ll,wbb.ul(),sys)); switch (dist) { case Coord::DEGREE: break; case Coord::ARCMIN: ss *= 60; break; case Coord::ARCSEC: ss *= 60*60; break; } printVector(ss,pp); } else printVector(Vector(), DEFAULT); } void Base::getFitsSliceCmd(int id) { int ss = currentContext->slice(id); if (ss>1) printInteger(ss); else Tcl_AppendResult(interp, "1", NULL); } void Base::getFitsSliceCmd(int id, Coord::CoordSystem sys) { if (currentContext->fits) { int ss = currentContext->slice(id); double rr = currentContext->fits->mapFromRef3axis(ss,sys,id); printDouble(rr,DEFAULT); } else Tcl_AppendResult(interp, "1", NULL); } void Base::getFitsWidthCmd() { if (currentContext->cfits) printInteger(currentContext->cfits->width()); } void Base::getGridCmd() { if (grid) { Tcl_AppendElement(interp, coord.coordSystemStr((grid->system()))); Tcl_AppendElement(interp, coord.skyFrameStr((grid->sky()))); Tcl_AppendElement(interp, coord.skyFormatStr(grid->skyFormat())); switch (grid->type()) { case Grid::ANALYSIS: Tcl_AppendElement(interp, "analysis"); break; case Grid::PUBLICATION: Tcl_AppendElement(interp, "publication"); break; } } else Tcl_AppendResult(interp, "", NULL); } void Base::getGridOptionCmd() { if (grid) Tcl_AppendResult(interp, grid->option(), NULL); else Tcl_AppendResult(interp, "", NULL); } void Base::getGridVarsCmd() { if (grid) Tcl_AppendResult(interp, grid->vars(), NULL); else Tcl_AppendResult(interp, "", NULL); } void Base::getHistogramCmd(char* xName, char* yName, int num) { currentContext->bltHist(xName, yName, num); } void Base::getHorzCutCmd(char* xx, char* yy, const Vector& vv, Coord::InternalSystem ref) { Vector rr; if (isInCFits(vv, ref, &rr)) bltCut(xx, yy, Coord::XX, rr); } void Base::getInfoCmd(char* var) { if (currentContext->cfits) { Tcl_SetVar2(interp,var,"filename",(char*)currentContext->cfits->getFileName(ROOTBASE),0); Tcl_SetVar2(interp,var,"object", (char*)currentContext->cfits->objectKeyword(),0); Tcl_SetVar2(interp,var,"min",(char*)currentContext->cfits->getMin(),0); Tcl_SetVar2(interp,var,"max",(char*)currentContext->cfits->getMax(),0); Tcl_SetVar2(interp,var,"low",(char*)currentContext->cfits->getLow(),0); Tcl_SetVar2(interp,var,"high",(char*)currentContext->cfits->getHigh(),0); } else getInfoClearName(var); getInfoClearValue(var); getInfoClearWCS(var); } void Base::getInfoCmd(const Vector& vv, Coord::InternalSystem ref, char* var) { FitsBound* params; int mosaic; Vector3d rr = mapToRef3d(vv,ref); // make sure we have an image FitsImage* ptr = currentContext->cfits; FitsImage* sptr = currentContext->cfits; if (!ptr) goto noFits; mosaic = isMosaic(); params = sptr->getDataParams(currentContext->frScale.scanMode()); if (!mosaic) { Tcl_SetVar2(interp,var,"filename",(char*)sptr->getFileName(ROOTBASE),0); Tcl_SetVar2(interp,var,"object",(char*)sptr->objectKeyword(),0); Tcl_SetVar2(interp,var,"min",(char*)sptr->getMin(),0); Tcl_SetVar2(interp,var,"max",(char*)sptr->getMax(),0); Tcl_SetVar2(interp,var,"low",(char*)sptr->getLow(),0); Tcl_SetVar2(interp,var,"high",(char*)sptr->getHigh(),0); } if (((Vector&)vv)[0]<0 && ((Vector&)vv)[1]<0) goto noImage; // clear values Tcl_SetVar2(interp,var,"value","",0); Tcl_SetVar2(interp,var,"value,red","",0); Tcl_SetVar2(interp,var,"value,green","",0); Tcl_SetVar2(interp,var,"value,blue","",0); do { Vector img = Vector(rr) * sptr->refToData; if (img[0]>=params->xmin && img[0]xmax && img[1]>=params->ymin && img[1]ymax) { if (mosaic) { Tcl_SetVar2(interp,var,"filename",(char*)sptr->getFileName(ROOTBASE),0); Tcl_SetVar2(interp,var,"object",(char*)sptr->objectKeyword(),0); Tcl_SetVar2(interp,var,"min",(char*)sptr->getMin(),0); Tcl_SetVar2(interp,var,"max",(char*)sptr->getMax(),0); Tcl_SetVar2(interp,var,"low",(char*)sptr->getLow(),0); Tcl_SetVar2(interp,var,"high",(char*)sptr->getHigh(),0); } SETSIGBUS Tcl_SetVar2(interp,var,"value",(char*)sptr->getValue(img),0); CLEARSIGBUS coordToTclArray(sptr,rr,Coord::IMAGE,FIXED,var,"image"); // use first slice coord3ToTclArray(ptr,rr,Coord::IMAGE,FIXED,var,"image"); coordToTclArray(sptr,rr,Coord::PHYSICAL,FIXED,var,"physical"); // use first slice coord3ToTclArray(ptr,rr,Coord::PHYSICAL,FIXED,var,"physical"); if (hasATMV()) { coordToTclArray(sptr,rr,Coord::AMPLIFIER,FIXED,var,"amplifier"); // use first slice coord3ToTclArray(ptr,rr,Coord::AMPLIFIER,FIXED,var,"amplifier"); } else { Tcl_SetVar2(interp,var,"amplifier,x","",0); Tcl_SetVar2(interp,var,"amplifier,y","",0); Tcl_SetVar2(interp,var,"amplifier,z","",0); } if (hasDTMV()) { coordToTclArray(sptr,rr,Coord::DETECTOR,FIXED,var,"detector"); // use first slice coord3ToTclArray(ptr,rr,Coord::DETECTOR,FIXED,var,"detector"); } else { Tcl_SetVar2(interp,var,"detector,x","",0); Tcl_SetVar2(interp,var,"detector,y","",0); Tcl_SetVar2(interp,var,"detector,z","",0); } getInfoWCS(var,rr,ptr,sptr); return; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) params = sptr->getDataParams(currentContext->frScale.scanMode()); } else { getInfoWCS(var,rr,ptr,sptr); goto noImage; } } } while (mosaic && sptr); // mosaic gap getInfoWCS(var,rr,ptr,ptr); // else, return blanks noFits: getInfoClearName(var); noImage: getInfoClearValue(var); } void Base::getInfoClipCmd() { if (currentContext->cfits) { Tcl_AppendElement(interp, (char*)currentContext->cfits->getLow()); Tcl_AppendElement(interp, (char*)currentContext->cfits->getHigh()); } else { Tcl_AppendElement(interp, "0"); Tcl_AppendElement(interp, "0"); } } void Base::getIRAFAlignCmd() { Tcl_AppendResult(interp, (irafAlign_ ? "1" : "0"), NULL); } void Base::getMaskColorCmd() { Tcl_AppendResult(interp, maskColorName, NULL); } void Base::getMaskMarkCmd() { if (maskMark) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getMaskTransparencyCmd() { printDouble((1-maskAlpha)*100., DEFAULT); } void Base::getMinMaxCmd() { printVector(currentContext->getMinMax(), DEFAULT); } void Base::getNANColorCmd() { Tcl_AppendResult(interp, nanColorName, NULL); } void Base::getOrientCmd() { switch (orientation) { case Coord::NORMAL: Tcl_AppendResult(interp, "none", NULL); return; case Coord::XX: Tcl_AppendResult(interp, "x", NULL); return; case Coord::YY: Tcl_AppendResult(interp, "y", NULL); return; case Coord::XY: Tcl_AppendResult(interp, "xy", NULL); return; } } void Base::getPanPreserveCmd() { if (preservePan) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getPixelTableCmd(const Vector& vv, Coord::InternalSystem ref, int ww, int hh, char* var) { Vector rr; FitsImage* ptr = isInCFits(vv, ref, &rr); if (!ptr) { // else return blank for (int jj=0; jj<=hh; jj++) { for (int ii=0; ii<=ww; ii++) { ostringstream str; str << ii << ',' << jj << ends; Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } } return; } Vector half((ww-1)/2,(hh-1)/2); Vector ur = rr+half; Vector ll = rr-half; int ii,jj; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); // x (columns) for (ii=0,jj=0; ii=params->xmin && ll[0]xmax && ur[1]>=params->ymin && ll[1]ymax) { Vector pt = ((ll+Vector(ii,jj)) * dataToImage).round(); if (pt[0]>params->xmin && pt[0]<=params->xmax) { ostringstream lstr; lstr << pt[0] << ends; Tcl_SetVar2(interp,var,str.str().c_str(),lstr.str().c_str(),0); } else Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } else Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } // y (rows) for (ii=0,jj=0; jj=params->xmin && ll[0]xmax && ur[1]>=params->ymin && ll[1]ymax) { Vector pt = ((ll+Vector(ii,jj)) * dataToImage).round(); if (pt[1]>params->ymin && pt[1]<=params->ymax) { ostringstream lstr; lstr << pt[1] << ends; Tcl_SetVar2(interp,var,str.str().c_str(),lstr.str().c_str(),0); } else Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } else Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } // body SETSIGBUS for (jj=0; jj=params->xmin && pt[0]xmax && pt[1]>=params->ymin && pt[1]ymax) Tcl_SetVar2(interp,var,str.str().c_str(),(char*)ptr->getValue(pt),0); else Tcl_SetVar2(interp,var,str.str().c_str(),"",0); } } CLEARSIGBUS } void Base::getRotateCmd(Precision p) { printDouble(radToDeg(rotation), p); } void Base::getSmoothFunctionCmd() { switch (currentContext->smoothFunction()) { case Context::BOXCAR: Tcl_AppendResult(interp, "boxcar", NULL); return; case Context::TOPHAT: Tcl_AppendResult(interp, "tophat", NULL); return; case Context::GAUSSIAN: Tcl_AppendResult(interp, "gaussian", NULL); return; } } void Base::getSmoothRadiusCmd() { printInteger(currentContext->smoothRadius()); } void Base::getThreadsCmd() { ostringstream str; str << nthreads_ << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getValueCmd(const Vector& vv, Coord::InternalSystem sys) { Vector rr; SETSIGBUS if (FitsImage* ptr=isInCFits(vv,sys,&rr)) Tcl_AppendResult(interp, ptr->getValue(rr), NULL); CLEARSIGBUS } void Base::getVertCutCmd(char* xx, char* yy, const Vector& vv, Coord::InternalSystem ref) { Vector rr; if (isInCFits(vv, ref, &rr)) bltCut(xx, yy, Coord::YY, rr); } void Base::getWCSCmd() { Tcl_AppendResult(interp, coord.coordSystemStr(wcsSystem_), " ", coord.skyFrameStr(wcsSky_), " ", coord.skyFormatStr(wcsSkyFormat_), NULL); } void Base::getWCSAlignCmd() { Tcl_AppendResult(interp, (wcsAlign_ ? "1" : "0"), NULL); } void Base::getWCSAlignPointerCmd() { ostringstream str; if (keyContext->fits) str << (unsigned short*)keyContext->fits << ends; else str << (unsigned short*)NULL << ends; Tcl_AppendResult(interp, (wcsAlign_ ? "1" : "0"), " ", str.str().c_str(), " ", coord.coordSystemStr(wcsSystem_), " ", coord.skyFrameStr(wcsSky_), NULL); } void Base::getWCSNameCmd(Coord::CoordSystem sys) { if (currentContext->cfits && currentContext->cfits->hasWCS(sys)) { char* wcsname = (char*)currentContext->cfits->getWCSName(sys); if (wcsname) { Tcl_AppendResult(interp, wcsname, NULL); return; } } Tcl_AppendResult(interp, NULL); } void Base::getZoomCmd(Precision p) { printVector(zoom_, p); } void Base::gridDeleteCmd() { if (grid) delete grid; grid = NULL; update(PIXMAP); } void Base::hasAmplifierCmd() { if (hasATMV()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasBinColCmd(const char* str) { if (currentContext->fits) { if (currentContext->fits->hasBinCol(str)) { Tcl_AppendResult(interp, "1", NULL); return; } } Tcl_AppendResult(interp, "0", NULL); } void Base::hasContourCmd() { if (hasContour()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasContourAuxCmd() { if (hasContourAux()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasCropCmd() { switch (currentContext->frScale.scanMode()) { case FrScale::IMGSEC: case FrScale::DATASEC: Tcl_AppendResult(interp, "0", NULL); break; case FrScale::CROPSEC: Tcl_AppendResult(interp, "1", NULL); break; } } void Base::hasDATAMINCmd() { if (currentContext->cfits && currentContext->cfits->hasDATAMIN()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasDATASECCmd() { if (currentContext->cfits && currentContext->cfits->hasDATASEC()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasDetectorCmd() { if (hasDTMV()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasFitsCmd() { if (currentContext->fits) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasFitsHPXCmd() { if (currentContext->fits && currentContext->fits->isHPX()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasFitsBinCmd() { if (currentContext->fits && currentContext->fits->isHist()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasFitsCubeCmd() { if (isCube()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasFitsMosaicCmd() { if (isMosaic()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasGridCmd() { if (grid) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasIISCmd() { if (isIIS()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasIRAFMINCmd() { if (currentContext->cfits && currentContext->cfits->hasIRAFMIN()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasPhysicalCmd() { if (hasLTMV()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasSmoothCmd() { if (currentContext->hasSmooth()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasSystemCmd(Coord::CoordSystem sys) { switch (sys) { case Coord::IMAGE: Tcl_AppendResult(interp, "1", NULL); return; case Coord::PHYSICAL: hasPhysicalCmd(); return; case Coord::AMPLIFIER: hasAmplifierCmd(); return; case Coord::DETECTOR: hasDetectorCmd(); return; default: hasWCSCmd(sys); return; } } void Base::hasWCSCmd(Coord::CoordSystem sys) { Tcl_AppendResult(interp, (hasWCS(sys) ? "1" : "0"), NULL); } void Base::hasWCSAltCmd() { Tcl_AppendResult(interp, (currentContext->cfits && currentContext->cfits->wcsHeader() ? "1" : "0"), NULL); } void Base::hasWCSEquCmd(Coord::CoordSystem sys) { Tcl_AppendResult(interp, (hasWCSEqu(sys) ? "1" : "0"), NULL); } void Base::hasWCSCelCmd(Coord::CoordSystem sys) { Tcl_AppendResult(interp, (hasWCSCel(sys) ? "1" : "0"), NULL); } void Base::hasWCSxCmd(Coord::CoordSystem sys) { Tcl_AppendResult(interp, (hasWCSx(sys) ? "1" : "0"), NULL); } void Base::irafAlignCmd(int which) { irafAlign_ = which; alignIRAF(); update(MATRIX); } // loadIncr is only used by LICK OBS and MMT // maintained for backward compatibility void Base::loadIncrDataCmd(int which, int x0, int y0, int x1, int y1) { } void Base::loadIncrMinMaxCmd(int which, int x0, int y0, int x1, int y1) { } void Base::loadIncrEndCmd() { currentContext->frScale.resetScanMode(); currentContext->updateClip(); currentContext->updateContours(); updateColorScale(); update(MATRIX); } void Base::highliteCmd(int which) { useHighlite = which ? 1 : 0; update(PIXMAP); } void Base::magnifierCmd(int s) { useMagnifier = s; updateMagnifier(); } void Base::magnifierCmd(char* n, int w, int h) { strcpy(magnifierName,n); magnifierWidth = w; magnifierHeight = h; if (magnifierPixmap) Tk_FreePixmap(display, magnifierPixmap); magnifierPixmap = 0; if (magnifierXImage) XDestroyImage(magnifierXImage); magnifierXImage = NULL; if (magnifierWidth > 0 && magnifierHeight > 0) { magnifierPixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), magnifierWidth, magnifierHeight, depth); if (!magnifierPixmap) { internalError("Unable to Create Magnifier Pixmap"); return; } if (!magnifierXImage) { if (!(magnifierXImage = XGetImage(display, magnifierPixmap, 0, 0, magnifierWidth, magnifierHeight, AllPlanes, ZPixmap))){ internalError("Unable to Create Magnifier XImage"); return; } } } } void Base::magnifierCursorCmd(int which) { useMagnifierCursor = which; updateMagnifier(); } void Base::magnifierColorCmd(const char* color) { if (magnifierColorName) delete [] magnifierColorName; magnifierColorName = dupstr(color); updateMagnifier(); } void Base::magnifierGraphicsCmd(int which) { useMagnifierGraphics = which; updateMagnifier(); } void Base::magnifierZoomCmd(double z) { magnifierZoom_ = fabs(z); updateMagnifier(); } void Base::matchCmd(const char* xxname1, const char* yyname1, Coord::CoordSystem sys1, Coord::SkyFrame sky1, const char* xxname2, const char* yyname2, Coord::CoordSystem sys2, Coord::SkyFrame sky2, double rad, Coord::CoordSystem sys, Coord::SkyDist dist, const char* rrname) { if (keyContext && keyContext->fits) keyContext->fits->match(xxname1, yyname1, sys1, sky1, xxname2, yyname2, sys2, sky2, rad, sys, dist, rrname); } void Base::maskClearCmd() { currentContext->mask.deleteAll(); update(BASE); } void Base::maskColorCmd(const char* color) { if (maskColorName) delete [] maskColorName; maskColorName = dupstr(color); } void Base::maskTransparencyCmd(float t) { maskAlpha = 1-(t/100.); update(BASE); } void Base::nanColorCmd(const char* color) { if (nanColorName) delete [] nanColorName; nanColorName = dupstr(color); nanColor = getXColor(nanColorName); update(BASE); } void Base::orientCmd(Coord::Orientation which) { orientation = which; switch (orientation) { case Coord::NORMAL: orientationMatrix.identity(); break; case Coord::XX: orientationMatrix = FlipX(); break; case Coord::YY: orientationMatrix = FlipY(); break; case Coord::XY: orientationMatrix = FlipXY(); break; } update(MATRIX); } void Base::panBeginCmd(const Vector& vv) { // vv and panCursor are in CANVAS coords panCursor = vv; // copy tmp pixmap panPM = Tk_GetPixmap(display, Tk_WindowId(tkwin), options->width, options->height, depth); if (!panPM) { internalError("Unable to Create Pan Motion Pixmap"); return; } XCopyArea(display, pixmap, panPM, gc, 0, 0, options->width, options->height, 0,0); } void Base::panMotionCmd(const Vector& vv) { // vv and panCursor are in CANVAS coords // Clear Vector diff = (vv*canvasToWidget) - (panCursor*canvasToWidget); BBox hh,ww; if (diff[0]>0 && diff[1]>0) { hh = BBox(Vector(0,0), Vector(options->width, diff[1])); ww = BBox(Vector(0,0), Vector(diff[0], options->height)); } else if (diff[0]>0 && diff[1]<0) { hh = BBox(Vector(options->width,options->height), Vector(0,options->height+diff[1])); ww = BBox(Vector(0,0), Vector(diff[0], options->height)); } else if (diff[0]<0 && diff[1]>0) { hh = BBox(Vector(0,0), Vector(options->width, diff[1])); ww = BBox(Vector(options->width,options->height), Vector(options->width+diff[0], 0)); } else if (diff[0]<0 && diff[1]<0) { hh = BBox(Vector(options->width,options->height), Vector(0,options->height+diff[1])); ww = BBox(Vector(options->width,options->height), Vector(options->width+diff[0], 0)); } hh = hh * widgetToWindow; ww = ww * widgetToWindow; XSetForeground(display, gc, getColor(bgColorName)); Vector hs = hh.size(); XFillRectangle(display, Tk_WindowId(tkwin), gc, (int)hh.ll[0], (int)hh.ll[1], (int)hs[0], (int)hs[1]); Vector ws = ww.size(); XFillRectangle(display, Tk_WindowId(tkwin), gc, (int)ww.ll[0], (int)ww.ll[1], (int)ws[0], (int)ws[1]); // display tmp pixmap at new location Vector dd = ((vv * canvasToWidget) - (panCursor * canvasToWidget)) * widgetToWindow; XCopyArea(display, panPM, Tk_WindowId(tkwin), panGCXOR, 0, 0, options->width, options->height, dd[0], dd[1]); } void Base::pannerCmd(int s) { usePanner = s; updatePanner(); } void Base::pannerCmd(char* n, int w, int h) { strcpy(pannerName,n); pannerWidth = w; pannerHeight = h; if (pannerPixmap) Tk_FreePixmap(display, pannerPixmap); pannerPixmap = 0; if (pannerXImage) XDestroyImage(pannerXImage); pannerXImage = NULL; if (pannerWidth > 0 && pannerHeight > 0) { if (!(pannerPixmap = Tk_GetPixmap(display, Tk_WindowId(tkwin), pannerWidth, pannerHeight, depth))) { internalError("Unable to Create Panner Pixmap"); return; } if (!(pannerXImage = XGetImage(display, pannerPixmap, 0, 0, pannerWidth, pannerHeight, AllPlanes, ZPixmap))){ internalError("Unable to Create Panner XImage"); return; } } // update panner matrices update(MATRIX); } void Base::rotateCmd(double r) { rotation += r; update(MATRIX); } void Base::rotateToCmd(double r) { rotation = r; update(MATRIX); } void Base::saveFitsFileCmd(const char* fn) { OutFitsFile str(fn); saveFits(str); } void Base::saveFitsChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFits(str); } void Base::saveFitsSocketCmd(int ss) { OutFitsSocket str(ss); saveFits(str); } void Base::saveFitsTableFileCmd(const char* fn) { OutFitsFile str(fn); saveFitsTable(str); } void Base::saveFitsTableChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFitsTable(str); } void Base::saveFitsTableSocketCmd(int ss) { OutFitsSocket str(ss); saveFitsTable(str); } void Base::saveFitsSliceFileCmd(const char* fn) { OutFitsFile str(fn); saveFitsSlice(str); } void Base::saveFitsSliceChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFitsSlice(str); } void Base::saveFitsSliceSocketCmd(int ss) { OutFitsSocket str(ss); saveFitsSlice(str); } void Base::saveFitsExtCubeFileCmd(const char* fn) { OutFitsFile str(fn); saveFitsExtCube(str); } void Base::saveFitsExtCubeChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFitsExtCube(str); } void Base::saveFitsExtCubeSocketCmd(int ss) { OutFitsSocket str(ss); saveFitsExtCube(str); } void Base::saveFitsMosaicFileCmd(const char* fn, int which) { OutFitsFile str(fn); saveFitsMosaic(str, which); } void Base::saveFitsMosaicChannelCmd(const char* ch, int which) { OutFitsChannel str(interp, ch); saveFitsMosaic(str, which); } void Base::saveFitsMosaicSocketCmd(int ss, int which) { OutFitsSocket str(ss); saveFitsMosaic(str, which); } void Base::saveFitsMosaicImageFileCmd(const char* fn) { OutFitsFile str(fn); saveFitsMosaicImage(str); } void Base::saveFitsMosaicImageChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFitsMosaicImage(str); } void Base::saveFitsMosaicImageSocketCmd(int ss) { OutFitsSocket str(ss); saveFitsMosaicImage(str); } void Base::saveArrayFileCmd(const char* fn, FitsFile::ArchType endian) { if (currentContext->cfits) { OutFitsFile str(fn); saveArray(str, endian); } } void Base::saveArrayChannelCmd(const char* ch, FitsFile::ArchType endian) { OutFitsChannel str(interp, ch); saveArray(str, endian); } void Base::saveArraySocketCmd(int ss, FitsFile::ArchType endian) { OutFitsSocket str(ss); saveArray(str, endian); } void Base::saveNRRDFileCmd(const char* fn, FitsFile::ArchType endian) { OutFitsFile str(fn); saveNRRD(str, endian); } void Base::saveNRRDChannelCmd(const char* ch, FitsFile::ArchType endian) { OutFitsChannel str(interp, ch); saveNRRD(str, endian); } void Base::saveNRRDSocketCmd(int ss, FitsFile::ArchType endian) { OutFitsSocket str(ss); saveNRRD(str, endian); } void Base::saveENVIFileCmd(const char* hdr, const char* fn, FitsFile::ArchType endian) { ofstream str(hdr); OutFitsFile str2(fn); saveENVI(str, str2, endian); } void Base::sliceCmd(int id, int ss) { // IMAGE (ranges 1-n) setSlice(id,ss); updateMagnifier(); } void Base::sliceCmd(int id, double vv, Coord::CoordSystem sys) { double rr = currentContext->fits->mapToRef3axis(vv,sys,id); int ss = currentContext->fits->mapFromRef3axis(rr,Coord::IMAGE,id); // IMAGE (ranges 1-n) setSlice(id,ss); updateMagnifier(); } void Base::smoothCmd(int function, int radius) { currentContext->setSmooth(1, (Context::SmoothFunction)function, radius); currentContext->analysis(); updateColorScale(); // for 3d, rebuffer update(MATRIX); } void Base::smoothDeleteCmd() { currentContext->setSmooth(0); currentContext->analysis(); updateColorScale(); // for 3d, rebuffer update(MATRIX); } void Base::threadsCmd(int th) { if (th>=1) nthreads_ = th; } // not used // don't know if this is used by anyone else void Base::unloadFitsCmd() { unloadAllFits(); update(MATRIX); } void Base::updateFitsCmd(int now) { // for 3d, rebuffer if (now) { syncUpdate =1; updateNow(MATRIX); syncUpdate =0; } else update(MATRIX); } void Base::updateFitsCmd(int which, BBox bb, int now) { // Note: bb is in IMAGE coords FitsImage* ptr = currentContext->fits; if (which > 0) { for (int ii=0; ii<(which-1); ii++) { if (ptr) ptr = ptr->nextMosaic(); } } if (ptr) { BBox bbb = bb*ptr->imageToRef; Vector ll = mapFromRef(bbb.ll,Coord::CANVAS); Vector lr = mapFromRef(bbb.lr(),Coord::CANVAS); Vector ur = mapFromRef(bbb.ur,Coord::CANVAS); Vector ul = mapFromRef(bbb.ul(),Coord::CANVAS); BBox rr(ll); rr.bound(lr); rr.bound(ur); rr.bound(ul); if (now) { syncUpdate =1; updateNow(BASE, rr); syncUpdate =0; } else update(BASE, rr); } } void Base::updateMagnifierCmd(const Vector& v) { updateMagnifier(v); } void Base::updatePannerCmd() { updatePanner(); } void Base::warpCmd(const Vector& vv) { warp((Vector&)vv); } void Base::warpToCmd(const Vector& vv) { Vector rr = vv*canvasToWindow; warpTo(rr); } void Base::wcsCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { wcsSystem_ = sys; if (hasWCSEqu(sys)) { wcsSky_ = sky; wcsSkyFormat_ = format; } else if (hasWCSCel(sys)) { wcsSky_ = Coord::GALACTIC; wcsSkyFormat_ = format; } else { wcsSky_ = sky; wcsSkyFormat_ = format; } } void Base::wcsAlignCmd(int which) { wcsAlign_ = which; alignWCS(); update(MATRIX); } // used by backup void Base::wcsAlignCmd(int which, Coord::CoordSystem sys, Coord::SkyFrame sky) { wcsAlign_ = which; alignWCS(sys, sky); update(MATRIX); } void Base::wcsAlignCmd(int which, FitsImage* ptr, Coord::CoordSystem sys, Coord::SkyFrame sky) { wcsAlign_ = which; if (hasWCSEqu(sys)) wcsSky_ = sky; else if (hasWCSCel(sys)) wcsSky_ = Coord::GALACTIC; else wcsSky_ = sky; alignWCS(ptr, sys); update(MATRIX); } void Base::wcsAppendCmd(int which, int fd) { if (!currentContext->cfits) return; boost::fdistream str(fd); if (!str) { Tcl_AppendResult(interp, " unable to read wcs infomation", NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->appendWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::wcsAppendCmd(int which, const char* fn) { if (!currentContext->cfits) return; ifstream str(fn); if (!str) { Tcl_AppendResult(interp, " unable to load wcs file ", fn, NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->appendWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::wcsAppendTxtCmd(int which, const char* txt) { if (!currentContext->cfits) return; istringstream str(txt); if (!str) { Tcl_AppendResult(interp, " unable to process text", NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->appendWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::wcsResetCmd(int which) { if (!currentContext->cfits) return; FitsImage* rr = findAllFits(which); if (rr) while (rr) { rr->resetWCS(); rr=rr->nextSlice(); } else result = TCL_ERROR; } void Base::wcsReplaceCmd(int which, int fd) { if (!currentContext->cfits) return; boost::fdistream str(fd); if (!str) { Tcl_AppendResult(interp, " unable to read wcs infomation", NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->replaceWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::wcsReplaceCmd(int which, const char* fn) { if (!currentContext->cfits) return; ifstream str(fn); if (!str) { Tcl_AppendResult(interp, " unable to load wcs file ", fn, NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->replaceWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::wcsReplaceTxtCmd(int which, const char* txt) { if (!currentContext->cfits) return; istringstream str(txt); if (!str) { Tcl_AppendResult(interp, " unable to process text", NULL); result = TCL_ERROR; return; } FitsImage* rr = findAllFits(which); if (rr) { while (rr) { rr->replaceWCS(str); rr=rr->nextSlice(); } } else result = TCL_ERROR; } void Base::zoomCmd(const Vector& z) { Vector az = ((Vector&)z).abs(); zoom_[0] *= az[0]; zoom_[1] *= az[1]; update(MATRIX); } void Base::zoomToCmd(const Vector& z) { zoom_ = ((Vector&)z).abs(); update(MATRIX); } saods9/tksao1.0/frame/baseellipse.C000644 000765 000000 00000043615 12544546070 017432 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "baseellipse.h" #include "fitsimage.h" BaseEllipse::BaseEllipse(Base* p, const Vector& ctr, double ang) : BaseMarker(p, ctr, ang) { } BaseEllipse::BaseEllipse(Base* p, const Vector& ctr, double ang, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb) : BaseMarker(p, ctr, ang, clr, dsh, w, f, t, prop, c, tag, cb) { } BaseEllipse::BaseEllipse(const BaseEllipse& a) : BaseMarker(a) {} BaseEllipse::~BaseEllipse() { } void BaseEllipse::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { double ang = calcAngle(); Vector r = annuli_[numAnnuli_-1]; Vector z = parent->zoom(); int isOrient = parent->getOrientation() == Coord::NORMAL && parent->getWCSOrientation() == Coord::NORMAL; int isRound = r[0] == r[1]; int isScale = z[0] == z[1]; // int isAngle = teq(ang,0,FLT_EPSILON) || teq(ang,M_PI,FLT_EPSILON); if (isRound && isScale && isOrient && parent->isAzElZero()) renderXCircle(drawable, sys, ang, mode); else renderXEllipseCurve(drawable, sys, mode); } void BaseEllipse::renderXCircle(Drawable drawable, Coord::InternalSystem sys, double ang, RenderMode mode) { GC lgc = renderXGC(mode); // this routine is only valid for circles with equal zoom in x & y Vector cc = parent->mapFromRef(center,sys); for (int i=0; i=b1 && a1b1 && a2<=b2) s2 =1; if ((s1 && !s2) || (s1 && s2)) renderXEllipsePrep(drawable, sys, mode, a1,a2,b1,b2,r); if (s1&&s2) s1=s2=0; } } } void BaseEllipse::renderXEllipsePrep(Drawable drawable, Coord::InternalSystem sys, RenderMode mode, double a1, double a2, double b1, double b2, Vector& r) { if (!(a1 >= b1 && a1 <= b2)) a1 = b1; if (!(a2 >= b1 && a2 <= b2)) a2 = b2; if (a1>a2) { renderXEllipseArc(drawable, sys, mode, b1,a2,r); renderXEllipseArc(drawable, sys, mode, a1,b2,r); } else renderXEllipseArc(drawable, sys, mode, a1,a2,r); } void BaseEllipse::renderXEllipseArc(Drawable drawable, Coord::InternalSystem sys, RenderMode mode, double a1, double a2, Vector& rr) { // don't render if zero angle if (a1==a2) return; // don't render if zero length if (rr[0]==0 || rr[1]==0) return; // bezier curve, valid for arcs of getColor("red")); XDrawLine(display, drawable, lgc, r1[0], r1[1], r2[0], r2[1]); } } void BaseEllipse::renderPS(int mode) { Vector r = annuli_[numAnnuli_-1]; Vector z = parent->zoom(); int isOrient = parent->getOrientation() == Coord::NORMAL && parent->getWCSOrientation() == Coord::NORMAL; int isRound = r[0] == r[1]; int isScale = z[0] == z[1]; if (isRound && isScale && isOrient && parent->isAzElZero()) renderPSCircle(mode); else renderPSEllipseCurve(mode); } void BaseEllipse::renderPSCircle(int mode) { renderPSGC(mode); Vector cc = parent->mapFromRef(center,Coord::CANVAS); double ang = calcAngle(); for (int ii=0; iicanvas) << l << ' ' << a1 << ' ' << a2 << " arc stroke " << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } void BaseEllipse::renderPSEllipseCurve(int mode) { renderPSGC(mode); double a1 = startAng_; double a2 = stopAng_; if (a2<=a1) a2 += M_TWOPI; for (int ii=0; ii=b1 && a1b1 && a2<=b2) s2 =1; if ((s1 && !s2) || (s1 && s2)) renderPSEllipsePrep(a1,a2,b1,b2,r); if (s1&&s2) s1=s2=0; } } } void BaseEllipse::renderPSEllipsePrep(double a1, double a2, double b1, double b2, Vector& rr) { if (!(a1 >= b1 && a1 <= b2)) a1 = b1; if (!(a2 >= b1 && a2 <= b2)) a2 = b2; if (a1>a2) { renderPSEllipseArc(b1,a2,rr); renderPSEllipseArc(a1,b2,rr); } else renderPSEllipseArc(a1,a2,rr); } void BaseEllipse::renderPSEllipseArc(double a1, double a2, Vector& rr) { // don't render zero length arcs if (a1 == a2) return; if (!rr[0] || !rr[1]) return; // bezier curve, valid for arcs of canvas) << "moveto " << xx1.TkCanvasPs(parent->canvas) << xx2.TkCanvasPs(parent->canvas) << tt1.TkCanvasPs(parent->canvas) << " curveto stroke" << endl; str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } void BaseEllipse::renderPSInclude(int mode) { if (!(properties & INCLUDE)) { double theta = degToRad(45); Vector r1 = fwdMap(Vector(annuli_[numAnnuli_-1][0]*cos(theta), annuli_[numAnnuli_-1][1]*sin(theta)), Coord::CANVAS); Vector r2 = fwdMap(Vector(-annuli_[numAnnuli_-1][0]*cos(theta), -annuli_[numAnnuli_-1][1]*sin(theta)), Coord::CANVAS); renderPSColor(mode, parent->getXColor("red")); ostringstream str; str << "newpath " << r1.TkCanvasPs(parent->canvas) << "moveto" << r2.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } #ifdef MAC_OSX_TK void BaseEllipse::renderMACOSX() { Vector r = annuli_[numAnnuli_-1]; Vector z = parent->zoom(); int isOrient = parent->getOrientation() == Coord::NORMAL && parent->getWCSOrientation() == Coord::NORMAL; int isRound = r[0] == r[1]; int isScale = z[0] == z[1]; if (isRound && isScale && isOrient & parent->isAzElZero()) renderMACOSXCircle(); else renderMACOSXEllipseCurve(); } void BaseEllipse::renderMACOSXCircle() { renderMACOSXGC(); Vector cc = parent->mapFromRef(center,Coord::CANVAS); double ang = calcAngle(); for (int ii=0; ii=b1 && a1b1 && a2<=b2) s2 =1; if ((s1 && !s2) || (s1 && s2)) renderMACOSXEllipsePrep(a1,a2,b1,b2,r); if (s1&&s2) s1=s2=0; } } } void BaseEllipse::renderMACOSXEllipsePrep(double a1, double a2, double b1, double b2, Vector& rr) { if (!(a1 >= b1 && a1 <= b2)) a1 = b1; if (!(a2 >= b1 && a2 <= b2)) a2 = b2; if (a1>a2) { renderMACOSXEllipseArc(b1,a2,rr); renderMACOSXEllipseArc(a1,b2,rr); } else renderMACOSXEllipseArc(a1,a2,rr); } void BaseEllipse::renderMACOSXEllipseArc(double a1, double a2, Vector& rr) { // don't render zero length arcs if (a1 == a2) return; if (!rr[0] || !rr[1]) return; // bezier curve, valid for arcs of getXColor("red")); macosxDrawLine(r1,r2); } } #endif #ifdef __WIN32 void BaseEllipse::renderWIN32() { Vector r = annuli_[numAnnuli_-1]; Vector z = parent->zoom(); int isOrient = parent->getOrientation() == Coord::NORMAL && parent->getWCSOrientation() == Coord::NORMAL; int isRound = r[0] == r[1]; int isScale = z[0] == z[1]; if (isRound && isScale && isOrient && parent->isAzElZero()) renderWIN32Circle(); else renderWIN32EllipseCurve(); } void BaseEllipse::renderWIN32Circle() { renderWIN32GC(); Vector cc = parent->mapFromRef(center,Coord::CANVAS); double ang = calcAngle(); for (int i=0; i=b1 && a1b1 && a2<=b2) s2 =1; if ((s1 && !s2) || (s1 && s2)) renderWIN32EllipsePrep(a1,a2,b1,b2,r); if (s1&&s2) s1=s2=0; } } } void BaseEllipse::renderWIN32EllipsePrep(double a1, double a2, double b1, double b2, Vector& rr) { if (!(a1 >= b1 && a1 <= b2)) a1 = b1; if (!(a2 >= b1 && a2 <= b2)) a2 = b2; if (a1>a2) { renderWIN32EllipseArc(b1,a2,rr); renderWIN32EllipseArc(a1,b2,rr); } else renderWIN32EllipseArc(a1,a2,rr); } void BaseEllipse::renderWIN32EllipseArc(double a1, double a2, Vector& rr) { // don't render zero length arcs if (a1 == a2) return; if (!rr[0] || !rr[1]) return; // bezier curve, valid for arcs of getXColor("red")); win32DrawLine(r1,r2); } } #endif // Support void BaseEllipse::updateHandles() { // handles are in canvas coords // we can't garantee that the annuli_ have been sorted yet if (handle) delete [] handle; handle = new Vector[numHandle]; Vector max; for(int ii=0; ii1) for (int ii=0; ii0) ss = rr[0]*rr[1]/sqrt(tt); return Vector(ss*cos(aa),ss*sin(aa)); } void BaseEllipse::XDrawCurve(Drawable drawable, RenderMode mode, Vector& t1, Vector& x1, Vector& x2, Vector& t2) { // if dashed, fake it GC lgc; if ((properties & SOURCE) && !(properties & DASH)) lgc = renderXGC(mode); else { // set width, color, dash switch (mode) { case SRC: XSetForeground(display, gc, color); renderXLineNoDash(gc); lgc = gc; break; case XOR: renderXLineNoDash(gcxor); lgc = gcxor; break; } } float t1x = t1[0]; float t1y = t1[1]; float t2x = t2[0]; float t2y = t2[1]; float x1x = x1[0]; float x1y = x1[1]; float x2x = x2[0]; float x2y = x2[1]; float rx = t1x; float ry = t1y; Vector dd = (t2-t1).abs(); float max = dd[0]>dd[1] ? dd[0] : dd[1]; // calculate incr // this is a crude attempt to limit the number of iterations // we want a min for very small segments, but not that large for // high zoom or elongated curves float aa = int(log(max))*5; float incr = 1./(aa > 2 ? aa : 2); int dash=0; float tt = incr; while (tt<=1+FLT_EPSILON) { float xx = pow(tt,3)*(t2x+3*(x1x-x2x)-t1x) +3*pow(tt,2)*(t1x-2*x1x+x2x) +3*tt*(x1x-t1x)+t1x; float yy = pow(tt,3)*(t2y+3*(x1y-x2y)-t1y) +3*pow(tt,2)*(t1y-2*x1y+x2y) +3*tt*(x1y-t1y)+t1y; // crude attempt to clip unwanted drawlines // only works for SRC if ((properties & SOURCE) && !(properties & DASH)) XDrawLine(display, drawable, lgc, rx, ry, xx, yy); else { if (dash) XDrawLine(display, drawable, lgc, rx, ry, xx, yy); dash = !dash; } rx = xx; ry = yy; tt += incr; } } // this routine maps the desired angle to an angle to be used with XDrawArc double BaseEllipse::xyz(Vector rr, double aa) { // just in case if (!rr[0] || !rr[1]) return aa; int flip=0; while (aa>M_PI) { aa -= M_PI; flip++; } double tt = rr[1]*rr[1]*cos(aa)*cos(aa)+rr[0]*rr[0]*sin(aa)*sin(aa); double ss =0; if (tt>0) ss = 1./sqrt(tt); double bb = rr[1]*ss*cos(aa); return acos(bb)+M_PI*flip; } saods9/tksao1.0/frame/baseellipse.h000644 000765 000000 00000005240 12544546070 017467 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __baseellipse_h__ #define __baseellipse_h__ #include "basemarker.h" class BaseEllipse : public BaseMarker { private: double xyz(Vector rr, double ang); void XDrawCurve(Drawable, RenderMode, Vector&, Vector&, Vector&, Vector&); void renderXCircle(Drawable, Coord::InternalSystem, double, RenderMode); void renderXEllipseCurve(Drawable, Coord::InternalSystem, RenderMode); void renderXEllipsePrep(Drawable, Coord::InternalSystem, RenderMode, double, double, double, double, Vector&); void renderXEllipseArc(Drawable, Coord::InternalSystem, RenderMode, double, double, Vector&); void renderXInclude(Drawable, Coord::InternalSystem, RenderMode); void renderPSCircle(int); void renderPSEllipseCurve(int); void renderPSEllipsePrep(double, double, double, double, Vector&); void renderPSEllipseArc(double, double, Vector&); void renderPSInclude(int); #ifdef MAC_OSX_TK void renderMACOSXCircle(); void renderMACOSXEllipseCurve(); void renderMACOSXEllipsePrep(double, double, double, double, Vector&); void renderMACOSXEllipseArc(double, double, Vector&); void renderMACOSXInclude(); #endif #ifdef __WIN32 void renderWIN32Circle(); void renderWIN32EllipseCurve(); void renderWIN32EllipsePrep(double, double, double, double, Vector&); void renderWIN32EllipseArc(double, double, Vector&); void renderWIN32Include(); #endif protected: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif virtual void updateHandles(); Vector intersect(Vector, double); int isInRef(const Vector& vv, int); public: BaseEllipse(Base* p, const Vector& ctr, double a); BaseEllipse(Base* p, const Vector& ctr, double a, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb); BaseEllipse(const BaseEllipse&); virtual ~BaseEllipse(); virtual Marker* dup() =0; int isIn(const Vector& vv) {return isIn(vv, Coord::CANVAS);} int isIn(const Vector& vv, Coord::InternalSystem sys) {return isIn(vv,sys,numAnnuli_-1);} int isIn(const Vector& vv, Coord::InternalSystem sys, int nn) {return isInRef(bckMap(vv,sys),nn);} // valid for non-fixed only int isIn(const Vector& vv, const Matrix& bck) {return isIn(vv,bck,numAnnuli_-1);} int isIn(const Vector& vv, const Matrix& bck, int nn) {return isInRef(vv*bck,nn);} }; #endif saods9/tksao1.0/frame/baseline.C000644 000765 000000 00000004177 12464214755 016727 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "baseline.h" #include "fitsimage.h" BaseLine::BaseLine(Base* p, const Vector& ptr1, const Vector& ptr2) : Marker(p, ptr1, 0) { p1 = ptr1; p2 = ptr2; } BaseLine::BaseLine(Base* p, const Vector& ptr1, const Vector& ptr2, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ptr1, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { p1 = ptr1; p2 = ptr2; } BaseLine::BaseLine(const BaseLine& a) : Marker(a) { p1 = a.p1; p2 = a.p2; } void BaseLine::updateCoords(const Matrix& mx) { p1*=mx; p2*=mx; Marker::updateCoords(mx); } void BaseLine::centroid() { p1 = parent->centroid(p1); p2 = parent->centroid(p2); updateBBox(); doCallBack(CallBack::MOVECB); } void BaseLine::move(const Vector& v) { p1+=v; p2+=v; updateBBox(); doCallBack(CallBack::MOVECB); } void BaseLine::moveTo(const Vector& v) { // v is the new location of the center Vector diff = v - center; p1+=diff; p2+=diff; updateBBox(); doCallBack(CallBack::MOVECB); } int BaseLine::isIn(const Vector& v) { // do this in canvas coords, not ref coords Vector l1 = parent->mapFromRef(p1,Coord::CANVAS); Vector l2 = parent->mapFromRef(p2,Coord::CANVAS); double a = (l2-l1).angle(); Matrix m = Translate(-l1) * Rotate(a); Vector vv = v*m; Vector end = l2*m; return (vv[0]>0 && vv[0]-parent->markerEpsilon && vv[1]markerEpsilon); } void BaseLine::edit(const Vector& v, int h) { switch (h) { case 1: p1 = v; break; case 2: p2 = v; break; } updateBBox(); doCallBack(CallBack::EDITCB); } void BaseLine::setPoints(const Vector& v1, const Vector& v2) { p1 = v1; p2 = v2; updateBBox(); doCallBack(CallBack::EDITCB); } // special composite funtionallity void BaseLine::setComposite(const Matrix& mx, double aa) { p1 *= mx; p2 *= mx; updateBBox(); } saods9/tksao1.0/frame/baseline.h000644 000765 000000 00000002546 12544546070 016767 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __baseline_h__ #define __baseline_h__ #include "marker.h" class BaseLine : public Marker { protected: Vector p1; Vector p2; void renderXInclude(Drawable, Coord::InternalSystem, RenderMode) {} void renderPSInclude(int) {} #ifdef MAC_OSX_TK void renderMACOSXInclude() {} #endif #ifdef __WIN32 void renderWIN32Include() {} #endif void updateHandles() {} public: BaseLine(Base* p, const Vector& ptr1, const Vector& ptr2); BaseLine(Base* p, const Vector& ptr1, const Vector& ptr2, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); BaseLine(const BaseLine&); virtual void updateCoords(const Matrix&); virtual int isIn(const Vector&); void centroid(); void move(const Vector&); void moveTo(const Vector&); virtual void edit(const Vector&, int); void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} const Vector& getP1() {return p1;} const Vector& getP2() {return p2;} void setPoints(const Vector&, const Vector&); // special composite funtionality void setComposite(const Matrix&, double); }; #endif saods9/tksao1.0/frame/basemarker.C000644 000765 000000 00000010350 12464214755 017247 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "basemarker.h" #include "base.h" // Base Markers Public BaseMarker::BaseMarker(Base* p, const Vector& ctr, double ang) : Marker(p, ctr, ang) { startAng_ = 0; stopAng_ = M_TWOPI; numAnnuli_ = 0; annuli_ = NULL; } BaseMarker::BaseMarker(Base* p, const Vector& ctr, double ang, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb) : Marker(p, ctr, ang, clr, dsh, w, f, t, prop, c, tag, cb) { startAng_ = 0; stopAng_ = M_TWOPI; numAnnuli_ = 0; annuli_ = NULL; } BaseMarker::BaseMarker(const BaseMarker& a) : Marker(a) { startAng_ = a.startAng_; stopAng_ = a.stopAng_; numAnnuli_ = a.numAnnuli_; annuli_ = new Vector[a.numAnnuli_]; for (int i=0; i4) { int hh = h-4-1; if (numAnnuli_>2 && hhannuli_[j][0]) { Vector d = annuli_[i]; annuli_[i] = annuli_[j]; annuli_[j] = d; } } Matrix BaseMarker::fwdMatrix() { if (properties & FIXED) { Vector cc = center * parent->refToCanvas; return Rotate(calcAngle()) * Translate(cc) * parent->canvasToRef; } else return Marker::fwdMatrix(); } Matrix BaseMarker::bckMatrix() { if (properties & FIXED) { Vector cc = center * parent->refToCanvas; return parent->refToCanvas * Translate(-cc) * Rotate(-calcAngle()); } else return Marker::bckMatrix(); } Vector BaseMarker::fwdMap(const Vector& vv, Coord::InternalSystem sys) { if (properties & FIXED) { Vector cc = center * parent->refToCanvas; Vector dd = vv * Rotate(calcAngle()) * Translate(cc); Vector ee = dd*parent->canvasToRef; return parent->mapFromRef(ee,sys); } else return Marker::fwdMap(vv,sys); } Vector BaseMarker::bckMap(const Vector& vv, Coord::InternalSystem sys) { if (properties & FIXED) { Vector aa = parent->mapToRef(vv,sys); Vector bb = aa*parent->refToCanvas; Vector cc = center * parent->refToCanvas; return bb * Translate(-cc) * Rotate(-calcAngle()); } else return Marker::bckMap(vv,sys); } saods9/tksao1.0/frame/basemarker.h000644 000765 000000 00000002422 12536641574 017320 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __basemarker_h__ #define __basemarker_h__ #include "marker.h" #define MAXANNULI 512 #define MAXANGLES 720 class BaseMarker : public Marker { protected: Vector* annuli_; int numAnnuli_; double startAng_; double stopAng_; protected: void sortAnnuli(); int insertAnnuli(Vector); Matrix fwdMatrix(); Matrix bckMatrix(); Vector fwdMap(const Vector&, Coord::InternalSystem); Vector bckMap(const Vector&, Coord::InternalSystem); public: BaseMarker(Base*, const Vector&, double); BaseMarker(Base*, const Vector&, double, const char*, int* dsh, int, const char*, const char*, unsigned short, const char*, const List&, const List& cb); BaseMarker(const BaseMarker&); virtual ~BaseMarker(); virtual Marker* dup() =0; void updateCoords(const Matrix&); int numAnnuli() {return numAnnuli_;} Vector annuli(int i) {return annuli_[i];} void setAnnuli(const Vector&); void setAnnuli(const Vector&, const Vector&, int); void setAnnuli(const Vector*, int); virtual int addAnnuli(const Vector&) {return 0;} void deleteAnnuli(int h); }; #endif saods9/tksao1.0/frame/basepanda.C000644 000765 000000 00000005702 12464214755 017056 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "basepanda.h" #include "fitsimage.h" BasePanda::BasePanda(const BasePanda& a) { numAngles_ = a.numAngles_; angles_ = new double[numAngles_]; for (int ii=0; ii1 && angles_[0]==0 && angles_[numAngles_-1]==0) angles_[numAngles_-1] += M_TWOPI; } void BasePanda::setAngles(double a1, double a2, int an) { numAngles_ = an+1; if (angles_) delete [] angles_; angles_ = new double[numAngles_]; // yes this is really needed // for a2a1 very small if (teq(a2,a1,FLT_EPSILON)) { a1 = zeroTWOPI(a1); a2 = zeroTWOPI(a2); if (teq(a2,a1,FLT_EPSILON)) a2 += M_TWOPI; } for (int ii=0; ii=angles_[nn] && aa #include "box.h" #include "fitsimage.h" Box::Box(Base* p, const Vector& ctr, const Vector& seg, double ang) : BaseBox(p, ctr, ang) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = seg; strcpy(type_,"box"); numHandle = 4; updateBBox(); } Box::Box(Base* p, const Vector& ctr, const Vector& seg, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = seg; strcpy(type_,"box"); numHandle = 4; updateBBox(); } Box::Box(const Box& a) : BaseBox(a) {} void Box::editBegin(int h) { switch (h) { case 1: return; case 2: annuli_[0] = Vector(-annuli_[0][0],annuli_[0][1]); return; case 3: annuli_[0] = -annuli_[0]; return; case 4: annuli_[0] = Vector(annuli_[0][0],-annuli_[0][1]); return; } doCallBack(CallBack::EDITBEGINCB); } void Box::edit(const Vector& v, int h) { Matrix mm = bckMatrix(); Matrix nn = mm.invert(); // This annuli_s about the opposite node Vector ov = annuli_[0]/2 * nn; annuli_[0] = (annuli_[0]/2) - (v*mm); Vector nv = annuli_[0]/2 * nn; center -= nv-ov; updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); } void Box::editEnd() { annuli_[0] = annuli_[0].abs(); updateBBox(); doCallBack(CallBack::EDITENDCB); } void Box::analysis(AnalysisTask mm, int which) { switch (mm) { case HISTOGRAM: if (!analysisHistogram_ && which) { addCallBack(CallBack::MOVECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisHistogramCB_[1], parent->options->cmdName); } if (analysisHistogram_ && !which) { deleteCallBack(CallBack::MOVECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::EDITCB, analysisHistogramCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::DELETECB, analysisHistogramCB_[1]); } analysisHistogram_ = which; break; case PLOT3D: if (!analysisPlot3d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot3dCB_[1], parent->options->cmdName); } if (analysisPlot3d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot3dCB_[1]); } analysisPlot3d_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Box::analysisHistogram(char* xname, char* yname, int num) { double* x; double* y; Matrix mm = Rotate(angle) * Translate(center); // during resize, annuli_ can be negative Vector vv = annuli_[0].abs(); BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); parent->markerAnalysisHistogram(this, &x, &y, bb, num); analysisXYResult(xname, yname, x, y, num+1); } void Box::analysisPlot3d(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { double* x; double* y; Matrix mm = Rotate(angle) * Translate(center); // during resize, annuli_ can be negative Vector vv = annuli_[0].abs(); BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); int num = parent->markerAnalysisPlot3d(this, &x, &y, bb, sys, method); analysisXYResult(xname, yname, x, y, num); } void Box::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; Matrix mm = Rotate(angle) * Translate(center); // during resize, annuli_ can be negative Vector vv = annuli_[0].abs(); BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); parent->markerAnalysisStats(this, str, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Box::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << "\"" << ',' << r[1] << "\"" << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << r[0] << "\""<< ',' << r[1] << "\""<< ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void Box::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_[0]); XMLRowAng(sys,sky); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Box::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); listCiaoPre(str); // radius is always in image coords switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); Vector s = ptr->mapLenFromRef(annuli_[0],Coord::PHYSICAL); str << "rotbox(" << setprecision(8) << v[0] << ',' << v[1] << ',' << s[0] << ',' << s[1] << ',' << radToDeg(angle) << ')'; } break; default: if (ptr->hasWCSCel(sys)) { Vector s = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCMIN); char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << "rotbox(" << ra << ',' << dec << ',' << s[0] << '\'' << ',' << s[1] << '\'' << ',' << radToDeg(angle) << ')'; } } listCiaoPost(str, strip); } void Box::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); listSAOtngPre(str, strip); // radius is always in image coords switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::IMAGE); Vector s = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << s[0] << ',' << s[1] << ',' << radToDeg(angle) << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector s = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << s[0] << ',' << s[1] << ',' << radToDeg(angle) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); Vector s = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << s[0] << ',' << s[1] << ',' << radToDeg(angle) << ')'; } break; } } } listSAOtngPost(str,strip); } void Box::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); coord.listProsCoordSystem(str,sys,sky); str << "; "<< type_ << ' ' << setprecision(8) << v << r << radToDeg(angle); } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v[0] << "d " << v[1] << "d " << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << ra << ' ' << dec << ' ' << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); } break; } } } listProsPost(str, strip); } void Box::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[0][0] << ',' << annuli_[0][1] << ',' << radToDeg(angle) << ')'; listSAOimagePost(str, strip); } saods9/tksao1.0/frame/box.h000644 000765 000000 00000002633 12464214755 015775 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __box_h__ #define __box_h__ #include "basebox.h" class Box : public BaseBox { public: Box(Base* p, const Vector& ctr, const Vector& seg, double ang); Box(Base* p, const Vector& ctr, const Vector& seg, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Box(const Box&); virtual Marker* dup() {return new Box(*this);} void editBegin(int); void edit(const Vector&, int); void editEnd(); void analysis(AnalysisTask, int); void analysisHistogram(char*, char*, int); void analysisPlot3d(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); virtual void listCiao(ostream&, Coord::CoordSystem, int); virtual void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOimage(ostream&, int); }; #endif saods9/tksao1.0/frame/boxannulus.C000644 000765 000000 00000031071 12537642733 017336 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "boxannulus.h" #include "fitsimage.h" BoxAnnulus::BoxAnnulus(Base* p, const Vector& ctr, const Vector& s, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = s; strcpy(type_,"boxannulus"); numHandle = 4; updateBBox(); } BoxAnnulus::BoxAnnulus(Base* p, const Vector& ctr, const Vector& inner, const Vector& outer, int num, double ang) : BaseBox(p, ctr, ang) { numAnnuli_ = num+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = num+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = an; annuli_ = new Vector[numAnnuli_]; for (int i=0; ioptions->cmdName); addCallBack(CallBack::EDITCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisRadialCB_[1], parent->options->cmdName); } if (analysisRadial_ && !which) { deleteCallBack(CallBack::MOVECB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITCB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisRadialCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisRadialCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisRadialCB_[0]); deleteCallBack(CallBack::DELETECB, analysisRadialCB_[1]); } analysisRadial_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void BoxAnnulus::analysisRadial(char* xname, char* yname, char* ename, Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisRadial(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, bb, sys); analysisXYEResult(xname, yname, ename, xx, yy, ee, num); } void BoxAnnulus::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void BoxAnnulus::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << "box(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys); str << r[0] << ',' << r[1] << ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << "box(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << r[0] << "\"" << ',' << r[1] << "\"" << ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << "box(" << ra << ',' << dec << ',' ; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << r[0] << "\""<< ',' << r[1] << "\""<< ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << "box(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys); str << r[0] << ',' << r[1] << ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void BoxAnnulus::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_,numAnnuli_); XMLRowAng(sys,sky); XMLRowProps(ptr,sys); XMLRowEnd(str); } void BoxAnnulus::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); for (int i=0; imapLenFromRef(annuli_[i],Coord::IMAGE); str << "box " << setprecision(8) << v << r << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],Coord::IMAGE); str << " & !box " << setprecision(8) << v << r1 << radToDeg(angle); } listProsPost(str, strip); } } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << "box " << setprecision(8) << v[0] << "d " << v[1] << "d " << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); str << " & !box " << setprecision(8) << v[0] << "d " << v[1] << "d " << r1[0] << "\" " << r1[1] << "\" " << radToDeg(angle); } listProsPost(str, strip); } } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << "box " << ra << ' ' << dec << ' ' << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); str << " & !box " << ra << ' ' << dec << ' ' << r1[0] << "\" " << r1[1] << "\" " << radToDeg(angle); } listProsPost(str, strip); } } break; } } } } void BoxAnnulus::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); for (int i=0; imapFromRef(center,Coord::IMAGE); str << "box(" << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[i][0] << ',' << annuli_[i][1] << ',' << radToDeg(angle) << ')'; if (i!=0) str << " & !box(" << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[i-1][0] << ',' << annuli_[i-1][1] << ',' << radToDeg(angle) << ')'; listSAOimagePost(str, strip); } } saods9/tksao1.0/frame/boxannulus.h000644 000765 000000 00000003542 12523216651 017374 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __boxannulus_h__ #define __boxannulus_h__ #include "basebox.h" class BoxAnnulus : public BaseBox { public: BoxAnnulus(Base* p, const Vector& ctr, const Vector& s, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); BoxAnnulus(Base* p, const Vector& ctr, const Vector& inner, const Vector& outer, int num, double ang); BoxAnnulus(Base* p, const Vector& ctr, const Vector& inner, const Vector& outer, int num, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); BoxAnnulus(Base* p, const Vector& ctr, int an, Vector* s, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); BoxAnnulus(const BoxAnnulus&); Marker* dup() {return new BoxAnnulus(*this);} void editBegin(int); void edit(const Vector&, int); void editEnd(); int addAnnuli(const Vector&); void analysis(AnalysisTask, int); void analysisRadial(char*, char*, char*, Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void listSAOimage(ostream&, int); }; #endif saods9/tksao1.0/frame/bpanda.C000644 000765 000000 00000055510 12544546070 016364 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "bpanda.h" #include "fitsimage.h" Bpanda::Bpanda(const Bpanda& a) : BasePanda(a), BaseBox(a) {} Bpanda::Bpanda(Base* p, const Vector& ctr, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BasePanda(a1, a2, an), BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BasePanda(an, a), BaseBox(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn; annuli_ = new Vector[numAnnuli_]; for (int i=0; igetColor("red")); else if (ii == numAngles_-1) XSetForeground(display, gc, parent->getColor("blue")); else XSetForeground(display, gc, color); } else XSetForeground(display, gc, color); } XDrawLine(display, drawable, lgc, rr0[0], rr0[1], rr1[0], rr1[1]); } } void Bpanda::renderPS(int mode) { BaseBox::renderPS(mode); renderPSGC(mode); Vector r0 = annuli_[0]/2; Vector r1 = annuli_[numAnnuli_-1]/2; for (int ii=0; iicanvas) << "moveto" << rr1.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } #ifdef MAC_OSX_TK void Bpanda::renderMACOSX() { BaseBox::renderMACOSX(); renderMACOSXGC(); Vector r0 = annuli_[0]/2; Vector r1 = annuli_[numAnnuli_-1]/2; for (int ii=0; ii4) { int hh = h-4-1; if (numAnnuli_>2 && hh2 && hh<(numAnnuli_+numAngles_)) { hh -= numAnnuli_; deleteAngle(hh); } numHandle = 4 + numAnnuli_ + numAngles_; startAng_ = angles_[0]; stopAng_ = angles_[numAngles_-1]; updateBBox(); doCallBack(CallBack::EDITCB); } } int Bpanda::isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa) { Vector pp = bckMap(vv,sys); return BaseBox::isIn(vv,sys,nn) && BasePanda::isIn(pp,aa); } void Bpanda::analysis(AnalysisTask mm, int which) { switch (mm) { case PANDA: if (!analysisPanda_ && which) { addCallBack(CallBack::MOVECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPandaCB_[1], parent->options->cmdName); } if (analysisPanda_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisPandaCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisPandaCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisPandaCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPandaCB_[1]); } analysisPanda_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Bpanda::analysisPanda(Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisPanda(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, numAngles_-1, angles_, bb, sys); analysisXYEResult(xx, yy, ee, num); } void Bpanda::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, numAngles_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Bpanda::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { int regular = 1; if (numAngles_>2) { double delta; if (angles_[1] > angles_[0]) delta = angles_[1]-angles_[0]; else delta = angles_[1]+M_TWOPI-angles_[0]; for (int ii=2; ii angles_[ii-1]) diff = angles_[ii]-angles_[ii-1]; else diff = angles_[ii]+M_TWOPI-angles_[ii-1]; if (!teq(diff,delta,FLT_EPSILON)) { regular = 0; break; } } } if (numAnnuli_>2) { double delta = annuli_[1][0]-annuli_[0][0]; for (int i=2; ifindFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ',' << numAngles_-1 << ',' << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys,sky); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector r1 = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void Bpanda::listB(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # bpanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k],sys); str << r[0] << ' ' << r[1] << ((kmapAngleFromRef(angle,sys)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << '"' << ',' << r1[1] << '"' <<',' << r2[0] << '"' << ',' << r2[1] << '"' <<',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # bpanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k],sys,Coord::ARCSEC); str << r[0] << '"' << ' ' << r[1] << '"' << ((kmapAngleFromRef(angle,sys,sky)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # bpanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k],sys,Coord::ARCSEC); str << r[0] << '"' << ' ' << r[1] << '"' << ((kmapAngleFromRef(angle,sys,sky)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; } break; } else { Vector v = ptr->mapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # bpanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k],sys); str << r[0] << ' ' << r[1] << ((kmapAngleFromRef(angle,sys)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } } } } void Bpanda::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_,numAnnuli_); XMLRowAng(sys,sky); XMLRowAng(sys,sky,angles_,numAngles_); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/bpanda.h000644 000765 000000 00000003765 12544546070 016436 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __bpanda_h__ #define __bpanda_h__ #include "basepanda.h" #include "basebox.h" class Bpanda : public BasePanda, public BaseBox { private: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); void listA(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listB(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); public: Bpanda(const Bpanda&); Bpanda(Base* p, const Vector& ctr, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Bpanda(Base* p, const Vector& ctr, int an, double* a, int rn, Vector* r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Bpanda(*this);} int isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa); void editBegin(int); void edit(const Vector&, int); void editEnd(); int addAnnuli(const Vector&); int addAngles(const Vector&); void setAnglesAnnuli(double, double, int, Vector, Vector, int); void setAnglesAnnuli(const double*, int, const Vector*, int); void deleteAnglesAnnuli(int h); void analysis(AnalysisTask, int); void analysisPanda(Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/callback.C000644 000765 000000 00000001752 12464214755 016675 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "callback.h" CallBack::CallBack(const CallBack& a) { interp_ = a.interp_; type_ = a.type_; strcpy(proc_, a.proc_); strcpy(arg_, a.arg_); previous_ = NULL; next_ = NULL; } CallBack& CallBack::operator=(const CallBack& a) { interp_ = a.interp_; type_ = a.type_; strcpy(proc_, a.proc_); strcpy(arg_, a.arg_); previous_ = NULL; next_ = NULL; return *this; } CallBack::CallBack(Tcl_Interp* interp, Type type, const char* proc, const char* arg) { interp_ = interp; type_ = type; if (proc) strncpy(proc_, proc, 32); else proc_[0] = '\0'; if (arg) strncpy(arg_, arg, 64); else arg_[0] = '\0'; previous_ = NULL; next_ = NULL; } int CallBack::eval(const char* arg2) { return Tcl_VarEval(interp_, proc_, " ", arg_, " ", arg2, NULL); } saods9/tksao1.0/frame/callback.h000644 000765 000000 00000002154 12464214755 016737 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __callback_h__ #define __callback_h__ #include class CallBack { public: enum Type {SELECTCB, UNSELECTCB, HIGHLITECB, UNHIGHLITECB, EDITBEGINCB, EDITCB, EDITENDCB, MOVEBEGINCB, MOVECB, MOVEENDCB, ROTATEBEGINCB, ROTATECB, ROTATEENDCB, DELETECB, TEXTCB, COLORCB, LINEWIDTHCB, PROPERTYCB, FONTCB, KEYCB, UPDATECB}; private: Tcl_Interp* interp_; Type type_; char proc_[128]; char arg_[256]; CallBack* previous_; CallBack* next_; public: CallBack(const CallBack&); CallBack(Tcl_Interp*, Type, const char*, const char*); CallBack& operator=(const CallBack&); int eval(const char*); Type type() {return type_;} const char* proc() {return proc_;} const char* arg() {return arg_;} CallBack* previous() {return previous_;} void setPrevious(CallBack* cb) {previous_ = cb;} CallBack* next() {return next_;} void setNext(CallBack* cb) {next_ = cb;} }; #endif saods9/tksao1.0/frame/ciaolex.C000644 000765 000000 00000142100 12571403670 016551 0ustar00joyewheel000000 000000 #line 2 "frame/ciaolex.C" #line 4 "frame/ciaolex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer ciaoFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *ciaoalloc (yy_size_t ); void *ciaorealloc (void *,yy_size_t ); void ciaofree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 44 #define YY_END_OF_BUFFER 45 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[141] = { 0, 0, 0, 45, 43, 39, 42, 43, 38, 43, 43, 15, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 39, 41, 38, 0, 15, 17, 24, 20, 16, 15, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 40, 17, 26, 22, 16, 25, 21, 19, 0, 28, 18, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 27, 23, 30, 29, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 0, 0, 0, 0, 0, 4, 0, 10, 0, 0, 0, 0, 33, 32, 0, 0, 36, 0, 0, 34, 0, 3, 0, 0, 0, 12, 13, 0, 37, 35, 1, 5, 0, 11, 14, 0, 0, 0, 0, 0, 6, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 7, 1, 1, 1, 8, 1, 8, 9, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 1, 1, 1, 1, 1, 1, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 1, 21, 22, 23, 24, 25, 1, 26, 27, 28, 29, 30, 1, 31, 32, 1, 1, 33, 1, 1, 1, 1, 34, 35, 36, 37, 38, 39, 40, 41, 42, 1, 1, 43, 44, 45, 46, 47, 1, 48, 49, 50, 51, 52, 1, 53, 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[55] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[142] = { 0, 0, 0, 290, 291, 287, 291, 285, 0, 46, 277, 52, 35, 36, 44, 49, 45, 52, 50, 48, 57, 60, 54, 284, 291, 0, 270, 74, 95, 291, 272, 99, 0, 268, 265, 93, 264, 62, 77, 86, 100, 95, 100, 291, 102, 99, 93, 108, 97, 291, 141, 291, 266, 145, 291, 260, 291, 116, 291, 291, 117, 137, 256, 157, 143, 120, 291, 140, 129, 143, 291, 291, 143, 136, 156, 142, 145, 291, 258, 291, 291, 254, 179, 164, 186, 188, 156, 172, 182, 176, 174, 185, 180, 181, 186, 291, 199, 198, 165, 202, 121, 204, 181, 200, 291, 190, 291, 195, 189, 195, 206, 119, 115, 223, 227, 291, 234, 235, 291, 207, 291, 219, 224, 223, 291, 291, 224, 291, 291, 291, 291, 225, 291, 291, 226, 226, 238, 231, 236, 291, 291, 77 } ; static yyconst flex_int16_t yy_def[142] = { 0, 140, 1, 140, 140, 140, 140, 140, 141, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 140, 11, 140, 140, 140, 140, 11, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 0, 140 } ; static yyconst flex_int16_t yy_nxt[346] = { 0, 4, 5, 6, 7, 4, 8, 4, 9, 10, 11, 4, 12, 13, 14, 15, 16, 4, 4, 4, 4, 4, 4, 4, 17, 18, 19, 20, 4, 4, 21, 4, 4, 22, 12, 13, 14, 15, 16, 4, 4, 4, 4, 4, 4, 4, 17, 18, 19, 20, 4, 4, 21, 4, 4, 26, 27, 29, 37, 30, 38, 31, 32, 33, 39, 40, 41, 34, 35, 42, 44, 36, 46, 47, 45, 43, 48, 49, 25, 51, 37, 52, 38, 53, 27, 65, 39, 40, 41, 34, 35, 42, 44, 36, 46, 47, 45, 43, 48, 49, 54, 62, 55, 63, 29, 28, 30, 65, 66, 28, 56, 57, 67, 68, 59, 35, 69, 70, 71, 72, 73, 74, 75, 76, 81, 111, 82, 60, 83, 111, 66, 116, 56, 57, 67, 68, 59, 35, 69, 70, 71, 72, 73, 74, 75, 76, 77, 61, 78, 86, 51, 50, 52, 64, 87, 50, 56, 57, 88, 84, 59, 35, 51, 89, 52, 85, 90, 63, 91, 92, 93, 86, 94, 96, 97, 113, 87, 102, 56, 57, 88, 84, 59, 35, 77, 89, 78, 85, 90, 82, 91, 92, 93, 103, 94, 98, 99, 100, 101, 102, 104, 105, 106, 107, 108, 109, 110, 112, 97, 111, 119, 114, 99, 117, 101, 103, 120, 121, 122, 123, 124, 125, 104, 105, 106, 107, 108, 109, 110, 115, 126, 118, 119, 113, 129, 130, 131, 113, 120, 121, 122, 123, 124, 125, 116, 116, 132, 133, 134, 135, 127, 115, 126, 118, 115, 136, 129, 130, 131, 137, 138, 128, 118, 139, 82, 95, 63, 80, 132, 133, 134, 135, 127, 79, 64, 61, 115, 136, 60, 58, 50, 137, 138, 128, 118, 139, 23, 28, 24, 23, 140, 3, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140 } ; static yyconst flex_int16_t yy_chk[346] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 11, 12, 11, 13, 11, 11, 11, 14, 15, 16, 11, 11, 17, 18, 11, 19, 20, 18, 17, 21, 22, 141, 27, 12, 27, 13, 27, 27, 37, 14, 15, 16, 11, 11, 17, 18, 11, 19, 20, 18, 17, 21, 22, 28, 35, 28, 35, 31, 28, 31, 37, 38, 31, 28, 28, 39, 40, 31, 31, 41, 42, 44, 45, 45, 46, 47, 48, 57, 112, 57, 60, 60, 111, 38, 100, 28, 28, 39, 40, 31, 31, 41, 42, 44, 45, 45, 46, 47, 48, 50, 61, 50, 65, 53, 50, 53, 64, 67, 53, 50, 50, 68, 61, 53, 53, 63, 69, 63, 64, 72, 63, 73, 74, 75, 65, 76, 83, 83, 98, 67, 86, 50, 50, 68, 61, 53, 53, 82, 69, 82, 64, 72, 82, 73, 74, 75, 87, 76, 84, 84, 85, 85, 86, 88, 89, 90, 91, 92, 93, 94, 97, 97, 96, 102, 99, 99, 101, 101, 87, 103, 105, 105, 107, 108, 109, 88, 89, 90, 91, 92, 93, 94, 99, 110, 101, 102, 113, 119, 121, 122, 114, 103, 105, 105, 107, 108, 109, 116, 117, 123, 126, 131, 134, 113, 99, 110, 101, 114, 135, 119, 121, 122, 136, 137, 116, 117, 138, 81, 78, 62, 55, 123, 126, 131, 134, 113, 52, 36, 34, 114, 135, 33, 30, 26, 136, 137, 116, 117, 138, 23, 10, 7, 5, 3, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/ciaolex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/ciaolex.L" #include #include #include #include "util.h" #include "ciaoparser.H" extern YYSTYPE* ciaolval; /* rules */ #line 544 "frame/ciaolex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 27 "frame/ciaolex.L" #line 647 "frame/ciaolex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 141 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 140 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 29 "frame/ciaolex.L" {return ANNULUS_;} YY_BREAK case 2: YY_RULE_SETUP #line 30 "frame/ciaolex.L" {return BOX_;} YY_BREAK case 3: YY_RULE_SETUP #line 31 "frame/ciaolex.L" {return CIRCLE_;} YY_BREAK case 4: YY_RULE_SETUP #line 32 "frame/ciaolex.L" {return DEBUG_;} YY_BREAK case 5: YY_RULE_SETUP #line 33 "frame/ciaolex.L" {return ELLIPSE_;} YY_BREAK case 6: YY_RULE_SETUP #line 34 "frame/ciaolex.L" {return ELLIPTANNULUS_;} YY_BREAK case 7: YY_RULE_SETUP #line 35 "frame/ciaolex.L" {return OFF_;} YY_BREAK case 8: YY_RULE_SETUP #line 36 "frame/ciaolex.L" {return ON_;} YY_BREAK case 9: YY_RULE_SETUP #line 37 "frame/ciaolex.L" {return PIE_;} YY_BREAK case 10: YY_RULE_SETUP #line 38 "frame/ciaolex.L" {return POINT_;} YY_BREAK case 11: YY_RULE_SETUP #line 39 "frame/ciaolex.L" {return POLYGON_;} YY_BREAK case 12: YY_RULE_SETUP #line 40 "frame/ciaolex.L" {return ROTBOX_;} YY_BREAK case 13: YY_RULE_SETUP #line 41 "frame/ciaolex.L" {return PIE_;} YY_BREAK case 14: YY_RULE_SETUP #line 42 "frame/ciaolex.L" {return VERSION_;} YY_BREAK case 15: YY_RULE_SETUP #line 44 "frame/ciaolex.L" { // Integer ciaolval->integer = atoi(yytext); return INT; } YY_BREAK case 16: #line 50 "frame/ciaolex.L" case 17: YY_RULE_SETUP #line 50 "frame/ciaolex.L" { // Real Number ciaolval->real = atof(yytext); return REAL; } YY_BREAK case 18: #line 56 "frame/ciaolex.L" case 19: YY_RULE_SETUP #line 56 "frame/ciaolex.L" { // degrees yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ANGDEGREE; } YY_BREAK case 20: #line 63 "frame/ciaolex.L" case 21: #line 64 "frame/ciaolex.L" case 22: #line 65 "frame/ciaolex.L" case 23: YY_RULE_SETUP #line 65 "frame/ciaolex.L" { // minutes of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCMINUTE; } YY_BREAK case 24: #line 72 "frame/ciaolex.L" case 25: #line 73 "frame/ciaolex.L" case 26: #line 74 "frame/ciaolex.L" case 27: YY_RULE_SETUP #line 74 "frame/ciaolex.L" { // seconds of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCSECOND; } YY_BREAK case 28: #line 81 "frame/ciaolex.L" case 29: #line 82 "frame/ciaolex.L" case 30: #line 83 "frame/ciaolex.L" case 31: YY_RULE_SETUP #line 83 "frame/ciaolex.L" { // seconds of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCSECOND; } YY_BREAK case 32: #line 90 "frame/ciaolex.L" case 33: YY_RULE_SETUP #line 90 "frame/ciaolex.L" { // Sexagesimal int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 34: #line 98 "frame/ciaolex.L" case 35: YY_RULE_SETUP #line 98 "frame/ciaolex.L" { // HMS int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return HMSSTR; } YY_BREAK case 36: #line 106 "frame/ciaolex.L" case 37: YY_RULE_SETUP #line 106 "frame/ciaolex.L" { // DMS int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return DMSSTR; } YY_BREAK case 38: YY_RULE_SETUP #line 113 "frame/ciaolex.L" { // comment, eat it } YY_BREAK case 39: YY_RULE_SETUP #line 116 "frame/ciaolex.L" { // White Spaces } YY_BREAK case 40: YY_RULE_SETUP #line 119 "frame/ciaolex.L" { // fake line feed return '\n'; } YY_BREAK case 41: /* rule 41 can match eol */ YY_RULE_SETUP #line 123 "frame/ciaolex.L" { // windows line feed return '\n'; } YY_BREAK case 42: /* rule 42 can match eol */ YY_RULE_SETUP #line 127 "frame/ciaolex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): #line 131 "frame/ciaolex.L" { // eof return EOF_; } YY_BREAK case 43: YY_RULE_SETUP #line 135 "frame/ciaolex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 44: YY_RULE_SETUP #line 139 "frame/ciaolex.L" ECHO; YY_BREAK #line 959 "frame/ciaolex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; ciaofree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); ciaofree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ ciaorealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) ciaorealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 141 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 141 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 140); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) ciaoalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) ciaoalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) ciaofree((void *) b->yy_ch_buf ); ciaofree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)ciaoalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)ciaorealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) ciaoalloc(new_size ); else (yy_start_stack) = (int *) ciaorealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *ciaoalloc (yy_size_t size ) { return (void *) malloc( size ); } void *ciaorealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void ciaofree (void * ptr ) { free( (char *) ptr ); /* see ciaorealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 139 "frame/ciaolex.L" saods9/tksao1.0/frame/ciaolex.L000644 000765 000000 00000005242 12564705314 016571 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "ciaoparser.H" extern YYSTYPE* ciaolval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% annulus {return ANNULUS_;} box {return BOX_;} circle {return CIRCLE_;} debug {return DEBUG_;} ellipse {return ELLIPSE_;} elliptannulus {return ELLIPTANNULUS_;} off {return OFF_;} on {return ON_;} pie {return PIE_;} point {return POINT_;} polygon {return POLYGON_;} rotbox {return ROTBOX_;} sector {return PIE_;} version {return VERSION_;} [+-]?{D}+ { // Integer ciaolval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number ciaolval->real = atof(yytext); return REAL; } [+-]?{D}+"."?d | [+-]?{D}*"."{D}+d { // degrees yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ANGDEGREE; } {D}+"."?' | {D}*"."{D}+' | [+-]?{D}+"."?({E})?' | [+-]?{D}*"."{D}+({E})?' { // minutes of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCMINUTE; } {D}+"."?\" | {D}*"."{D}+\" | [+-]?{D}+"."?({E})?\" | [+-]?{D}*"."{D}+({E})?\" { // seconds of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCSECOND; } {D}+"."?\'\' | {D}*"."{D}+\'\' | [+-]?{D}+"."?({E})?\'\' | [+-]?{D}*"."{D}+({E})?\'\' { // seconds of arc yytext[yyleng-1] = '\0'; ciaolval->real = atof(yytext); return ARCSECOND; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return SEXSTR; } [+-]?{D}+h{D}+m{D}+"."?s | [+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return HMSSTR; } [+-]?{D}+d{D}+m{D}+"."?s | [+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS int ll = yyleng <(CIAOBUFSIZE-1) ? yyleng:(CIAOBUFSIZE-1); strncpy(ciaolval->str,yytext,ll); ciaolval->str[ll] = '\0'; return DMSSTR; } #.* { // comment, eat it } [ \t]+ { // White Spaces } \\n { // fake line feed return '\n'; } \r\n { // windows line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% saods9/tksao1.0/frame/ciaoparser.C000644 000765 000000 00000154463 12571403670 017274 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse ciaoparse #define yylex ciaolex #define yyerror ciaoerror #define yylval ciaolval #define yychar ciaochar #define yydebug ciaodebug #define yynerrs ciaonerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, ANGDEGREE = 260, ARCMINUTE = 261, ARCSECOND = 262, SEXSTR = 263, HMSSTR = 264, DMSSTR = 265, EOF_ = 266, ANNULUS_ = 267, BOX_ = 268, CIRCLE_ = 269, DEBUG_ = 270, ELLIPSE_ = 271, ELLIPTANNULUS_ = 272, OFF_ = 273, ON_ = 274, PIE_ = 275, POINT_ = 276, POLYGON_ = 277, ROTBOX_ = 278, VERSION_ = 279 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define ANGDEGREE 260 #define ARCMINUTE 261 #define ARCSECOND 262 #define SEXSTR 263 #define HMSSTR 264 #define DMSSTR 265 #define EOF_ 266 #define ANNULUS_ 267 #define BOX_ 268 #define CIRCLE_ 269 #define DEBUG_ 270 #define ELLIPSE_ 271 #define ELLIPTANNULUS_ 272 #define OFF_ 273 #define ON_ 274 #define PIE_ 275 #define POINT_ 276 #define POLYGON_ 277 #define ROTBOX_ 278 #define VERSION_ 279 /* Copy the first part of user declarations. */ #line 10 "frame/ciaoparser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer ciaoFlexLexer #include extern int ciaolex(void*, ciaoFlexLexer*); extern void ciaoerror(Base*, ciaoFlexLexer*, const char*); static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static unsigned short props; static List polylist; static List taglist; static List cblist; static void setProps(unsigned short* props, unsigned short prop, int value); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 43 "frame/ciaoparser.Y" { #define CIAOBUFSIZE 2048 double real; int integer; char str[CIAOBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 193 "frame/ciaoparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 206 "frame/ciaoparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 9 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 118 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 35 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 22 /* YYNRULES -- Number of rules. */ #define YYNRULES 52 /* YYNRULES -- Number of states. */ #define YYNSTATES 109 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 279 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 31, 2, 2, 2, 2, 27, 2, 33, 34, 26, 29, 32, 30, 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, 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, 28, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 10, 11, 14, 16, 20, 22, 24, 26, 27, 29, 31, 33, 35, 37, 40, 42, 44, 46, 48, 50, 52, 54, 56, 57, 59, 61, 63, 65, 67, 71, 75, 79, 81, 83, 85, 89, 93, 97, 103, 111, 119, 131, 137, 145, 149, 150, 155, 159, 161 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 36, 0, -1, 36, 37, 38, -1, 37, 38, -1, -1, 15, 41, -1, 24, -1, 45, 39, 53, -1, 44, -1, 25, -1, 11, -1, -1, 26, -1, 27, -1, 28, -1, 29, -1, 30, -1, 31, 26, -1, 31, -1, 4, -1, 3, -1, 19, -1, 18, -1, 32, -1, 33, -1, 34, -1, -1, 40, -1, 40, -1, 5, -1, 6, -1, 7, -1, 40, 42, 40, -1, 6, 42, 6, -1, 7, 42, 7, -1, 8, -1, 9, -1, 10, -1, 49, 42, 49, -1, 50, 42, 51, -1, 40, 42, 40, -1, 14, 43, 52, 42, 47, -1, 16, 43, 52, 42, 48, 42, 46, -1, 12, 43, 52, 42, 47, 42, 47, -1, 20, 43, 52, 42, 47, 42, 47, 42, 46, 42, 46, -1, 13, 43, 52, 42, 48, -1, 23, 43, 52, 42, 48, 42, 46, -1, 21, 43, 52, -1, -1, 22, 54, 43, 55, -1, 55, 42, 56, -1, 56, -1, 52, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 90, 90, 91, 94, 95, 96, 97, 100, 101, 102, 105, 106, 107, 108, 109, 110, 111, 112, 115, 116, 119, 120, 123, 126, 129, 132, 143, 146, 147, 148, 149, 152, 159, 166, 175, 178, 181, 184, 191, 198, 207, 212, 217, 222, 228, 234, 240, 244, 244, 249, 250, 253 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "ANGDEGREE", "ARCMINUTE", "ARCSECOND", "SEXSTR", "HMSSTR", "DMSSTR", "EOF_", "ANNULUS_", "BOX_", "CIRCLE_", "DEBUG_", "ELLIPSE_", "ELLIPTANNULUS_", "OFF_", "ON_", "PIE_", "POINT_", "POLYGON_", "ROTBOX_", "VERSION_", "'\\n'", "'*'", "'&'", "'|'", "'+'", "'-'", "'!'", "','", "'('", "')'", "$accept", "commands", "command", "terminator", "include", "numeric", "debug", "sp", "bp", "ep", "init", "angle", "value", "vvalue", "sexagesimal", "hms", "dms", "coord", "shape", "@1", "polyNodes", "polyNode", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 10, 42, 38, 124, 43, 45, 33, 44, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 35, 36, 36, 37, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 47, 47, 48, 48, 48, 49, 50, 51, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 55, 56 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 2, 0, 2, 1, 3, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 5, 7, 7, 11, 5, 7, 3, 0, 4, 3, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 26, 0, 6, 26, 0, 11, 22, 21, 5, 1, 0, 10, 9, 25, 3, 8, 12, 13, 14, 15, 16, 18, 0, 2, 17, 0, 0, 0, 0, 0, 0, 48, 0, 7, 24, 0, 0, 0, 0, 0, 0, 0, 0, 20, 19, 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 52, 49, 51, 0, 40, 38, 37, 39, 29, 30, 31, 28, 0, 0, 0, 0, 45, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 43, 33, 34, 32, 27, 42, 0, 46, 0, 0, 0, 44 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 3, 4, 14, 22, 47, 8, 59, 35, 15, 5, 102, 79, 83, 48, 49, 74, 67, 33, 41, 68, 69 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -90 static const yytype_int8 yypact[] = { 46, 44, -90, 35, 17, 82, -90, -90, -90, -90, 17, -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, -18, 69, -90, -90, -21, -21, -21, -21, -21, -21, -90, -21, -90, -90, 98, 98, 98, 98, 98, 98, -21, 98, -90, -90, -90, -90, -15, -15, -15, -15, -15, -15, -15, -15, -90, 98, -15, -90, 83, 6, 11, 111, 41, 111, 41, 111, -90, -15, -90, 41, -90, -90, -90, -90, -90, -90, -90, -90, -15, -15, -15, -15, -90, -90, -15, -15, 98, -15, 111, 21, 22, 83, 83, 111, -90, 83, -90, -90, -90, -90, -90, -90, -15, -90, 83, -15, 83, -90 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -90, -90, 36, 33, -90, -40, -90, -48, 47, -90, -90, -89, -53, -55, 4, -90, -90, 58, -90, -90, -90, -19 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -5 static const yytype_int8 yytable[] = { 60, 61, 62, 63, 64, 65, 66, 104, 24, 70, 85, 84, 34, 86, 45, 88, 106, 58, 108, 71, 87, 73, 78, 82, 78, 82, 78, 98, 11, 99, 82, 89, 90, 91, 92, 9, 97, 93, 94, 10, 96, 103, 12, 23, 43, 44, -4, 80, 81, 78, 1, 13, 100, 101, 78, 105, 101, -4, 107, 2, -4, 1, 6, 7, 72, 101, 0, 101, 95, -4, 2, -4, 0, 36, 37, 38, 39, 40, 0, 42, -4, 25, 26, 27, 0, 28, 43, 44, 56, 29, 30, 31, 32, 50, 51, 52, 53, 54, 55, 0, 57, 43, 44, 0, 0, 0, 45, 46, 16, 17, 18, 19, 20, 21, 43, 44, 75, 76, 77 }; static const yytype_int8 yycheck[] = { 48, 49, 50, 51, 52, 53, 54, 96, 26, 57, 65, 64, 33, 66, 8, 70, 105, 32, 107, 59, 68, 10, 62, 63, 64, 65, 66, 6, 11, 7, 70, 79, 80, 81, 82, 0, 89, 85, 86, 3, 88, 94, 25, 10, 3, 4, 11, 6, 7, 89, 15, 34, 92, 93, 94, 103, 96, 11, 106, 24, 25, 15, 18, 19, 60, 105, -1, 107, 87, 34, 24, 25, -1, 26, 27, 28, 29, 30, -1, 32, 34, 12, 13, 14, -1, 16, 3, 4, 41, 20, 21, 22, 23, 35, 36, 37, 38, 39, 40, -1, 42, 3, 4, -1, -1, -1, 8, 9, 26, 27, 28, 29, 30, 31, 3, 4, 5, 6, 7 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 15, 24, 36, 37, 45, 18, 19, 41, 0, 37, 11, 25, 34, 38, 44, 26, 27, 28, 29, 30, 31, 39, 38, 26, 12, 13, 14, 16, 20, 21, 22, 23, 53, 33, 43, 43, 43, 43, 43, 43, 54, 43, 3, 4, 8, 9, 40, 49, 50, 52, 52, 52, 52, 52, 52, 43, 52, 32, 42, 42, 42, 42, 42, 42, 42, 42, 52, 55, 56, 42, 40, 49, 10, 51, 5, 6, 7, 40, 47, 6, 7, 40, 48, 47, 48, 47, 42, 48, 42, 42, 42, 42, 42, 42, 56, 42, 47, 6, 7, 40, 40, 46, 47, 46, 42, 46, 42, 46 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, ciaoFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; ciaoFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, ciaoFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; ciaoFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, ciaoFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; ciaoFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, ciaoFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; ciaoFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, ciaoFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, ciaoFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; ciaoFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 6: #line 96 "frame/ciaoparser.Y" {cerr << "CIAO Regions File 1.0" << endl;;} break; case 10: #line 102 "frame/ciaoparser.Y" {YYACCEPT;;} break; case 16: #line 110 "frame/ciaoparser.Y" {setProps(&props, Marker::INCLUDE, 0);;} break; case 17: #line 111 "frame/ciaoparser.Y" {setProps(&props, Marker::INCLUDE, 0);;} break; case 18: #line 112 "frame/ciaoparser.Y" {setProps(&props, Marker::INCLUDE, 0);;} break; case 19: #line 115 "frame/ciaoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 20: #line 116 "frame/ciaoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 21: #line 119 "frame/ciaoparser.Y" {yydebug=1;;} break; case 22: #line 120 "frame/ciaoparser.Y" {yydebug=0;;} break; case 26: #line 132 "frame/ciaoparser.Y" { // reset maperr flag maperr =0; props = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; ;} break; case 27: #line 143 "frame/ciaoparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 28: #line 146 "frame/ciaoparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::PHYSICAL);;} break; case 29: #line 147 "frame/ciaoparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::WCS, Coord::DEGREE);;} break; case 30: #line 148 "frame/ciaoparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::WCS, Coord::ARCMIN);;} break; case 31: #line 149 "frame/ciaoparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::WCS, Coord::ARCSEC);;} break; case 32: #line 153 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::PHYSICAL); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 33: #line 160 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::WCS, Coord::ARCMIN); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 34: #line 167 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::WCS, Coord::ARCSEC); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 35: #line 175 "frame/ciaoparser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 36: #line 178 "frame/ciaoparser.Y" {(yyval.real) = parseHMSStr((yyvsp[(1) - (1)].str));;} break; case 37: #line 181 "frame/ciaoparser.Y" {(yyval.real) = parseDMSStr((yyvsp[(1) - (1)].str));;} break; case 38: #line 185 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real)*360./24.,(yyvsp[(3) - (3)].real)), Coord::WCS,Coord::FK5); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 39: #line 192 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::WCS,Coord::FK5); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 40: #line 199 "frame/ciaoparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::PHYSICAL); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 41: #line 208 "frame/ciaoparser.Y" {fr->createCircleCmd(Vector((yyvsp[(3) - (5)].vector)), (yyvsp[(5) - (5)].real), color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 42: #line 213 "frame/ciaoparser.Y" {fr->createEllipseCmd(Vector((yyvsp[(3) - (7)].vector)), Vector((yyvsp[(5) - (7)].vector)),(yyvsp[(7) - (7)].real), color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 43: #line 218 "frame/ciaoparser.Y" {fr->createAnnulusCmd(Vector((yyvsp[(3) - (7)].vector)), (yyvsp[(5) - (7)].real),(yyvsp[(7) - (7)].real),1, color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 44: #line 223 "frame/ciaoparser.Y" {fr->createCpandaCmd(Vector((yyvsp[(3) - (11)].vector)), (yyvsp[(9) - (11)].real),(yyvsp[(11) - (11)].real),1, (yyvsp[(5) - (11)].real),(yyvsp[(7) - (11)].real),1, color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 45: #line 229 "frame/ciaoparser.Y" {fr->createBoxCmd(Vector((yyvsp[(3) - (5)].vector)), Vector((yyvsp[(5) - (5)].vector)), 0, color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 46: #line 235 "frame/ciaoparser.Y" {fr->createBoxCmd(Vector((yyvsp[(3) - (7)].vector)), Vector((yyvsp[(5) - (7)].vector)), (yyvsp[(7) - (7)].real), color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 47: #line 241 "frame/ciaoparser.Y" {fr->createPointCmd(Vector((yyvsp[(3) - (3)].vector)), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 48: #line 244 "frame/ciaoparser.Y" {polylist.deleteAll();;} break; case 49: #line 245 "frame/ciaoparser.Y" {fr->createPolygonCmd(polylist, color,dash,1,font,text,props,NULL,taglist,cblist);;} break; case 52: #line 253 "frame/ciaoparser.Y" {polylist.append(new Vertex((yyvsp[(1) - (1)].vector)));;} break; /* Line 1267 of yacc.c. */ #line 1726 "frame/ciaoparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 256 "frame/ciaoparser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/ciaoparser.H000644 000765 000000 00000006035 12571403670 017270 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, ANGDEGREE = 260, ARCMINUTE = 261, ARCSECOND = 262, SEXSTR = 263, HMSSTR = 264, DMSSTR = 265, EOF_ = 266, ANNULUS_ = 267, BOX_ = 268, CIRCLE_ = 269, DEBUG_ = 270, ELLIPSE_ = 271, ELLIPTANNULUS_ = 272, OFF_ = 273, ON_ = 274, PIE_ = 275, POINT_ = 276, POLYGON_ = 277, ROTBOX_ = 278, VERSION_ = 279 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define ANGDEGREE 260 #define ARCMINUTE 261 #define ARCSECOND 262 #define SEXSTR 263 #define HMSSTR 264 #define DMSSTR 265 #define EOF_ 266 #define ANNULUS_ 267 #define BOX_ 268 #define CIRCLE_ 269 #define DEBUG_ 270 #define ELLIPSE_ 271 #define ELLIPTANNULUS_ 272 #define OFF_ 273 #define ON_ 274 #define PIE_ 275 #define POINT_ 276 #define POLYGON_ 277 #define ROTBOX_ 278 #define VERSION_ 279 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 43 "frame/ciaoparser.Y" { #define CIAOBUFSIZE 2048 double real; int integer; char str[CIAOBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 105 "frame/ciaoparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/ciaoparser.Y000644 000765 000000 00000012345 12571403670 017312 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {ciaoFlexLexer* ll} %parse-param {ciaoFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer ciaoFlexLexer #include extern int ciaolex(void*, ciaoFlexLexer*); extern void ciaoerror(Base*, ciaoFlexLexer*, const char*); static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static unsigned short props; static List polylist; static List taglist; static List cblist; static void setProps(unsigned short* props, unsigned short prop, int value); %} %union { #define CIAOBUFSIZE 2048 double real; int integer; char str[CIAOBUFSIZE]; double vector[3]; } %type numeric %type angle %type value %type vvalue %type sexagesimal %type hms %type dms %type coord %token INT %token REAL %token ANGDEGREE %token ARCMINUTE %token ARCSECOND %token SEXSTR %token HMSSTR %token DMSSTR %token EOF_ %token ANNULUS_ %token BOX_ %token CIRCLE_ %token DEBUG_ %token ELLIPSE_ %token ELLIPTANNULUS_ %token OFF_ %token ON_ %token PIE_ %token POINT_ %token POLYGON_ %token ROTBOX_ %token VERSION_ %% commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "CIAO Regions File 1.0" << endl;} | init include shape ; terminator: ep | '\n' | EOF_ {YYACCEPT;} ; include : /* empty */ | '*' /* AND */ | '&' /* AND */ | '|' /* OR */ | '+' /* OR */ | '-' /* NOT */ {setProps(&props, Marker::INCLUDE, 0);} | '!''*' /* NOT */ {setProps(&props, Marker::INCLUDE, 0);} | '!' /* NOT */ {setProps(&props, Marker::INCLUDE, 0);} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; sp : ',' ; bp : '(' ; ep : ')' ; init: { // reset maperr flag maperr =0; props = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; } ; angle : numeric {$$ = degToRad($1);} ; value : numeric {$$ = FITSPTR->mapLenToRef($1, Coord::PHYSICAL);} | ANGDEGREE {$$ = FITSPTR->mapLenToRef($1, Coord::WCS, Coord::DEGREE);} | ARCMINUTE {$$ = FITSPTR->mapLenToRef($1, Coord::WCS, Coord::ARCMIN);} | ARCSECOND {$$ = FITSPTR->mapLenToRef($1, Coord::WCS, Coord::ARCSEC);} ; vvalue : numeric sp numeric { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::PHYSICAL); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCMINUTE sp ARCMINUTE { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::WCS, Coord::ARCMIN); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCSECOND sp ARCSECOND { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::WCS, Coord::ARCSEC); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; hms : HMSSTR {$$ = parseHMSStr($1);} ; dms : DMSSTR {$$ = parseDMSStr($1);} ; coord : sexagesimal sp sexagesimal { Vector r = FITSPTR->mapToRef(Vector($1*360./24.,$3), Coord::WCS,Coord::FK5); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | hms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3), Coord::WCS,Coord::FK5); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3), Coord::PHYSICAL); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; shape : CIRCLE_ bp coord sp value {fr->createCircleCmd(Vector($3), $5, color,dash,1,font,text,props,NULL,taglist,cblist);} | ELLIPSE_ bp coord sp vvalue sp angle {fr->createEllipseCmd(Vector($3), Vector($5),$7, color,dash,1,font,text,props,NULL,taglist,cblist);} | ANNULUS_ bp coord sp value sp value {fr->createAnnulusCmd(Vector($3), $5,$7,1, color,dash,1,font,text,props,NULL,taglist,cblist);} | PIE_ bp coord sp value sp value sp angle sp angle {fr->createCpandaCmd(Vector($3), $9,$11,1, $5,$7,1, color,dash,1,font,text,props,NULL,taglist,cblist);} | BOX_ bp coord sp vvalue {fr->createBoxCmd(Vector($3), Vector($5), 0, color,dash,1,font,text,props,NULL,taglist,cblist);} | ROTBOX_ bp coord sp vvalue sp angle {fr->createBoxCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,props,NULL,taglist,cblist);} | POINT_ bp coord {fr->createPointCmd(Vector($3), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,props,NULL,taglist,cblist);} | POLYGON_ {polylist.deleteAll();} bp polyNodes {fr->createPolygonCmd(polylist, color,dash,1,font,text,props,NULL,taglist,cblist);} ; polyNodes : polyNodes sp polyNode | polyNode ; polyNode : coord {polylist.append(new Vertex($1));} ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/circle.C000644 000765 000000 00000024011 12537642733 016375 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "circle.h" #include "fitsimage.h" Circle::Circle(Base* p, const Vector& ctr, double r) : BaseEllipse(p, ctr, 0) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = Vector(r,r); strcpy(type_, "circle"); numHandle = 4; updateBBox(); } Circle::Circle(Base* p, const Vector& ctr, double r, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseEllipse(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = 1; annuli_ = new Vector[numAnnuli_]; annuli_[0] = Vector(r,r); strcpy(type_, "circle"); numHandle = 4; updateBBox(); } Circle::Circle(const Circle& a) : BaseEllipse(a) {} void Circle::edit(const Vector& v, int h) { Matrix mm = bckMatrix(); // calc dist between edge of circle and handle double d = annuli_[0].length() - annuli_[0][0]; double r = (v * mm).length() - d; annuli_[0] = Vector(r,r); updateBBox(); doCallBack(CallBack::EDITCB); } void Circle::analysis(AnalysisTask mm, int which) { switch (mm) { case HISTOGRAM: if (!analysisHistogram_ && which) { addCallBack(CallBack::MOVECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisHistogramCB_[1], parent->options->cmdName); } if (analysisHistogram_ && !which) { deleteCallBack(CallBack::MOVECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::EDITCB, analysisHistogramCB_[0]); deleteCallBack(CallBack::DELETECB, analysisHistogramCB_[1]); } analysisHistogram_ = which; break; case PLOT3D: if (!analysisPlot3d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot3dCB_[1], parent->options->cmdName); } if (analysisPlot3d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot3dCB_[1]); } analysisPlot3d_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Circle::analysisHistogram(char* xname, char* yname, int num) { double* x; double* y; Vector ll = -annuli_[0] * Translate(center); Vector ur = annuli_[0] * Translate(center); BBox bb(ll,ur) ; parent->markerAnalysisHistogram(this, &x, &y, bb, num); analysisXYResult(xname, yname, x, y, num+1); } void Circle::analysisPlot3d(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { double* x; double* y; Vector ll = -annuli_[0] * Translate(center); Vector ur = annuli_[0] * Translate(center); BBox bb(ll,ur) ; int num = parent->markerAnalysisPlot3d(this, &x, &y, bb, sys, method); analysisXYResult(xname, yname, x, y, num); } void Circle::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; Vector ll = -annuli_[0] * Translate(center); Vector ur = annuli_[0] * Translate(center); BBox bb(ll,ur) ; parent->markerAnalysisStats(this, str, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Circle::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); double r = ptr->mapLenFromRef(annuli_[0][0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); double r = ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] <<',' << r << '"' << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; double r = ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << r << '"' << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); double r = ptr->mapLenFromRef(annuli_[0][0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] <<',' << r << ')'; } } } listPost(str, conj, strip); } void Circle::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadiusX(ptr,sys,annuli_[0]); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Circle::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); listCiaoPre(str); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); double r = ptr->mapLenFromRef(annuli_[0][0],Coord::PHYSICAL); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r << ')'; } break; default: if (ptr->hasWCSCel(sys)) { double r = ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCMIN); char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << r << '\'' << ')'; } } listCiaoPost(str, strip); } void Circle::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); listSAOtngPre(str, strip); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::IMAGE); double r = ptr->mapLenFromRef(annuli_[0][0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); double r = ptr->mapLenFromRef(annuli_[0][0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); double r = ptr->mapLenFromRef(annuli_[0][0],Coord::IMAGE); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << r << ')'; } break; } } } listSAOtngPost(str,strip); } void Circle::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); double r = ptr->mapLenFromRef(annuli_[0][0],Coord::IMAGE); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v << r; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); double r = ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v[0] << "d " << v[1] << "d " << r << "\" "; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; double r = ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << ra << ' ' << dec << ' ' << r << "\" "; } break; } } } listProsPost(str, strip); } void Circle::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[0][0] << ')'; listSAOimagePost(str, strip); } // special composite funtionallity void Circle::setComposite(const Matrix& mx, double aa) { center *= mx; updateBBox(); } saods9/tksao1.0/frame/circle.h000644 000765 000000 00000002766 12464214755 016455 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __circle_h__ #define __circle_h__ #include "baseellipse.h" class Circle : public BaseEllipse { public: Circle(Base* p, const Vector& ctr, double r); Circle(Base* p, const Vector& ctr, double r, const char* clr, int *dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Circle(const Circle&); virtual Marker* dup() {return new Circle(*this);} void edit(const Vector&, int); void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} void analysis(AnalysisTask, int); void analysisHistogram(char*, char*, int); void analysisPlot3d(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); virtual void listCiao(ostream&, Coord::CoordSystem, int); virtual void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOimage(ostream&, int); // special composite funtionality void setComposite(const Matrix&, double); }; #endif saods9/tksao1.0/frame/colorscale.C000644 000765 000000 00000012236 12464214755 017266 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colorscale.h" ColorScale::ColorScale(int ss) { size_ = ss; psColors_ = new unsigned char[ss*3]; psIndex_ = new unsigned short[ss]; memset(psColors_, '0', size_*3); memset(psIndex_, '0', size_*sizeof(unsigned short)); } ColorScale::~ColorScale() { if (psColors_) delete [] psColors_; if (psIndex_) delete [] psIndex_; } LinearScale::LinearScale(int ss, unsigned short* indexCells, unsigned char* colorCells, int count) : ColorScale(ss) { for (int ii=0; ii=count) ll = count-1; psIndex_[ii] = indexCells[ll]; memcpy(psColors_+ii*3, colorCells+ll*3, 3); } } PowScale::PowScale(int ss, unsigned short* indexCells, unsigned char* colorCells, int count, double exp) : ColorScale(ss) { for (int ii=0; ii=count) ll = count-1; psIndex_[ii] = indexCells[ll]; memcpy(psColors_+ii*3, colorCells+ll*3, 3); } } SqrtScale::SqrtScale(int ss, unsigned short* indexCells, unsigned char* colorCells, int count) : ColorScale(ss) { for(int ii=0; ii=count) ll = count-1; psIndex_[ii] = indexCells[ll]; memcpy(psColors_+ii*3, colorCells+ll*3,3); } } SinhScale::SinhScale(int ss, unsigned short* indexCells, unsigned char* colorCells, int count) : ColorScale(ss) { for(int ii=0; ii=count) ll = count-1; psIndex_[ii] = indexCells[ll]; memcpy(psColors_+ii*3, colorCells+ll*3,3); } } HistEquScale::HistEquScale(int ss, unsigned short* indexCells, unsigned char* colorCells, int count, double* hist, int histsize) : ColorScale(ss) { // if no histogram, return linear distribution if (!hist) for (int ii=0; ii=count) ll = count-1; memcpy(psColors_+ii, colorCells+ll*3+jj,1); } } PowScaleRGB::PowScaleRGB(int jj, int ss, unsigned char* colorCells, int count, double exp) : ColorScaleRGB(ss) { for (int ii=0; ii=count) ll = count-1; memcpy(psColors_+ii, colorCells+ll*3+jj,1); } } SqrtScaleRGB::SqrtScaleRGB(int jj, int ss, unsigned char* colorCells, int count) : ColorScaleRGB(ss) { for(int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); memcpy(colors_+i*2, &a, 2); } } else { for (int i=0; i0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&a); *(colors_+i*2) = *(rr+1); *(colors_+i*2+1) = *(rr); } } } ColorScaleTrueColor16::~ColorScaleTrueColor16() { if (colors_) delete [] colors_; } LinearScaleTrueColor16::LinearScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(s), LinearScale(s, indexCells, colorCells, count), ColorScaleTrueColor16(s, visual, msb) {} LogScaleTrueColor16::LogScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double exp, Visual* visual, int msb) : ColorScale(s), LogScale(s, indexCells, colorCells, count, exp), ColorScaleTrueColor16(s, visual, msb) {} PowScaleTrueColor16::PowScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double exp, Visual* visual, int msb) : ColorScale(s), PowScale(s, indexCells, colorCells, count, exp), ColorScaleTrueColor16(s, visual, msb) {} SqrtScaleTrueColor16::SqrtScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(s), SqrtScale(s, indexCells, colorCells, count), ColorScaleTrueColor16(s, visual, msb) {} SquaredScaleTrueColor16::SquaredScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(s), SquaredScale(s,indexCells,colorCells,count), ColorScaleTrueColor16(s, visual, msb) {} AsinhScaleTrueColor16::AsinhScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(s), AsinhScale(s,indexCells,colorCells,count), ColorScaleTrueColor16(s, visual, msb) {} SinhScaleTrueColor16::SinhScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(s), SinhScale(s,indexCells,colorCells,count), ColorScaleTrueColor16(s, visual, msb) {} IISScaleTrueColor16::IISScaleTrueColor16(unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual, int msb) : ColorScale(IISSIZE), IISScale(indexCells, colorCells, count), ColorScaleTrueColor16(IISSIZE, visual, msb) {} HistEquScaleTrueColor16::HistEquScaleTrueColor16(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double* hist, int histsize, Visual* visual, int msb) : ColorScale(s), HistEquScale(s, indexCells, colorCells, count, hist, histsize), ColorScaleTrueColor16(s, visual, msb) {} saods9/tksao1.0/frame/colorscaletrue16.h000644 000765 000000 00000004610 12464214755 020377 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colorscaletrue16_h__ #define __colorscaletrue16_h__ #include "colorscale.h" #include "truecolor16.h" class ColorScaleTrueColor16 : public virtual ColorScale, public TrueColor16 { public: ColorScaleTrueColor16(int, Visual*, int); virtual ~ColorScaleTrueColor16(); }; class LinearScaleTrueColor16 : public virtual ColorScale, public LinearScale, public ColorScaleTrueColor16 { public: LinearScaleTrueColor16(int, unsigned short*, unsigned char*, int, Visual*, int); }; class LogScaleTrueColor16 : public virtual ColorScale, public LogScale, public ColorScaleTrueColor16 { public: LogScaleTrueColor16(int, unsigned short*, unsigned char*, int, double, Visual*, int); }; class PowScaleTrueColor16 : public virtual ColorScale, public PowScale, public ColorScaleTrueColor16 { public: PowScaleTrueColor16(int, unsigned short*, unsigned char*, int, double, Visual*, int); }; class SqrtScaleTrueColor16 : public virtual ColorScale, public SqrtScale, public ColorScaleTrueColor16 { public: SqrtScaleTrueColor16(int, unsigned short*, unsigned char*, int, Visual*, int); }; class SquaredScaleTrueColor16 : public virtual ColorScale, public SquaredScale, public ColorScaleTrueColor16 { public: SquaredScaleTrueColor16(int, unsigned short*, unsigned char*, int, Visual*, int); }; class AsinhScaleTrueColor16 : public virtual ColorScale, public AsinhScale, public ColorScaleTrueColor16 { public: AsinhScaleTrueColor16(int, unsigned short*, unsigned char*, int, Visual*, int); }; class SinhScaleTrueColor16 : public virtual ColorScale, public SinhScale, public ColorScaleTrueColor16 { public: SinhScaleTrueColor16(int, unsigned short*, unsigned char*, int, Visual*, int); }; class IISScaleTrueColor16 : public virtual ColorScale, public IISScale, public ColorScaleTrueColor16 { public: IISScaleTrueColor16(unsigned short*, unsigned char*, int, Visual*, int); }; class HistEquScaleTrueColor16 : public virtual ColorScale, public HistEquScale, public ColorScaleTrueColor16 { public: HistEquScaleTrueColor16(int, unsigned short*, unsigned char*, int, double*, int, Visual*, int); }; #endif saods9/tksao1.0/frame/colorscaletrue24.C000644 000765 000000 00000007542 12536635033 020334 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colorscaletrue24.h" ColorScaleTrueColor24::ColorScaleTrueColor24(int s, Visual* visual, int msb) : ColorScale(s), TrueColor24(visual) { colors_ = new unsigned char[s*3]; // we need to check to byteswap when we have cross platforms if ((!msb && lsb()) || (msb && !lsb())) { for (int i=0; i> bs_) | // blue ((psColors_[i*3+1] & gm_) >> gs_) | // green ((psColors_[i*3+2] & rm_) >> rs_); // red } ColorScaleTrueColor8::~ColorScaleTrueColor8() { if (colors_) delete [] colors_; } LinearScaleTrueColor8::LinearScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(s), LinearScale(s, indexCells, colorCells, count), ColorScaleTrueColor8(s, visual) {} LogScaleTrueColor8::LogScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double exp, Visual* visual) : ColorScale(s), LogScale(s, indexCells, colorCells, count, exp), ColorScaleTrueColor8(s, visual) {} PowScaleTrueColor8::PowScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double exp, Visual* visual) : ColorScale(s), PowScale(s, indexCells, colorCells, count, exp), ColorScaleTrueColor8(s, visual) {} SqrtScaleTrueColor8::SqrtScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(s), SqrtScale(s, indexCells, colorCells, count), ColorScaleTrueColor8(s, visual) {} SquaredScaleTrueColor8::SquaredScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(s), SquaredScale(s, indexCells, colorCells, count), ColorScaleTrueColor8(s, visual) {} AsinhScaleTrueColor8::AsinhScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(s), AsinhScale(s, indexCells, colorCells, count), ColorScaleTrueColor8(s, visual) {} SinhScaleTrueColor8::SinhScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(s), SinhScale(s, indexCells, colorCells, count), ColorScaleTrueColor8(s, visual) {} IISScaleTrueColor8::IISScaleTrueColor8(unsigned short* indexCells, unsigned char* colorCells, int count, Visual* visual) : ColorScale(IISSIZE), IISScale(indexCells, colorCells, count), ColorScaleTrueColor8(IISSIZE, visual) {} HistEquScaleTrueColor8::HistEquScaleTrueColor8(int s, unsigned short* indexCells, unsigned char* colorCells, int count, double* hist, int histsize, Visual* visual) : ColorScale(s), HistEquScale(s, indexCells, colorCells, count, hist, histsize), ColorScaleTrueColor8(s, visual) {} saods9/tksao1.0/frame/colorscaletrue8.h000644 000765 000000 00000004453 12464214755 020325 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colorscaletrue8_h__ #define __colorscaletrue8_h__ #include "colorscale.h" #include "truecolor8.h" class ColorScaleTrueColor8 : public virtual ColorScale, public TrueColor8 { public: ColorScaleTrueColor8(int, Visual*); virtual ~ColorScaleTrueColor8(); }; class LinearScaleTrueColor8 : public virtual ColorScale, public LinearScale, public ColorScaleTrueColor8 { public: LinearScaleTrueColor8(int, unsigned short*, unsigned char*, int, Visual*); }; class LogScaleTrueColor8 : public virtual ColorScale, public LogScale, public ColorScaleTrueColor8 { public: LogScaleTrueColor8(int, unsigned short*, unsigned char*, int, double, Visual*); }; class PowScaleTrueColor8 : public virtual ColorScale, public PowScale, public ColorScaleTrueColor8 { public: PowScaleTrueColor8(int, unsigned short*, unsigned char*, int, double, Visual*); }; class SqrtScaleTrueColor8 : public virtual ColorScale, public SqrtScale, public ColorScaleTrueColor8 { public: SqrtScaleTrueColor8(int, unsigned short*, unsigned char*, int, Visual*); }; class SquaredScaleTrueColor8 : public virtual ColorScale, public SquaredScale, public ColorScaleTrueColor8 { public: SquaredScaleTrueColor8(int, unsigned short*, unsigned char*, int, Visual*); }; class AsinhScaleTrueColor8 : public virtual ColorScale, public AsinhScale, public ColorScaleTrueColor8 { public: AsinhScaleTrueColor8(int, unsigned short*, unsigned char*, int, Visual*); }; class SinhScaleTrueColor8 : public virtual ColorScale, public SinhScale, public ColorScaleTrueColor8 { public: SinhScaleTrueColor8(int, unsigned short*, unsigned char*, int, Visual*); }; class IISScaleTrueColor8 : public virtual ColorScale, public IISScale, public ColorScaleTrueColor8 { public: IISScaleTrueColor8(unsigned short*, unsigned char*, int, Visual*); }; class HistEquScaleTrueColor8 : public virtual ColorScale, public HistEquScale, public ColorScaleTrueColor8 { public: HistEquScaleTrueColor8(int, unsigned short*, unsigned char*, int, double*, int, Visual*); }; #endif saods9/tksao1.0/frame/compass.C000644 000765 000000 00000040150 12544546070 016576 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "compass.h" #include "fitsimage.h" Compass::Compass(const Compass& a) : Marker(a) { p1 = a.p1; p2 = a.p2; pp1 = a.pp1; pp2 = a.pp2; radius = a.radius; coordSystem = a.coordSystem; skyFrame = a.skyFrame; northText = dupstr(a.northText); eastText = dupstr(a.eastText); northArrow = a.northArrow; eastArrow = a.eastArrow; } Compass::Compass(Base* p, const Vector& ctr, double r, const char* n, const char* e, int na, int ea, Coord::CoordSystem sys, Coord::SkyFrame sky, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb) : Marker(p, ctr, 0, clr, dsh, w, f, t, prop, c, tag, cb) { coordSystem = sys; skyFrame = sky; radius = r; northText = dupstr(n); eastText = dupstr(e); northArrow = na; eastArrow = ea; strcpy(type_,"compass"); handle = new Vector[3]; numHandle = 3; updateBBox(); } Compass::~Compass() { if (northText) delete [] northText; if (eastText) delete [] eastText; } void Compass::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector aa = parent->mapFromRef(center,sys); Vector bb = parent->mapFromRef(p1,sys); Vector cc = parent->mapFromRef(p2,sys); Vector dd = parent->mapFromRef(pp1,sys); Vector ee = parent->mapFromRef(pp2,sys); if (northArrow) { bb = modifyArrow(center,p1,sys); renderXArrow(drawable, center, p1, sys, lgc); } if (eastArrow) { cc = modifyArrow(center,p2,sys); renderXArrow(drawable, center, p2, sys, lgc); } XDrawLine(display, drawable, lgc, aa[0], aa[1], bb[0], bb[1]); XDrawLine(display, drawable, lgc, aa[0], aa[1], cc[0], cc[1]); if (tkfont_) { XSetFont(display, lgc, Tk_FontId(tkfont_)); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); if (northText) { float r1 = Tk_TextWidth(tkfont_, northText, strlen(northText))/2.; float r2 = metrics.linespace/2.; double angle = (bb-aa).angle(); Vector ddd = dd * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); Tk_DrawChars(display, drawable, lgc, tkfont_, northText, strlen(northText), ddd[0], ddd[1]); } if (eastText) { float r1 = Tk_TextWidth(tkfont_, eastText, strlen(eastText))/2.; float r2 = metrics.linespace/2.; double angle = (cc-aa).angle(); Vector eee = ee * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); Tk_DrawChars(display, drawable, lgc, tkfont_, eastText, strlen(eastText), eee[0], eee[1]); } } } GC Compass::renderXGC(RenderMode mode) { switch (mode) { case SRC: XSetForeground(display, gc, color); renderXLineNoDash(gc); return gc; case XOR: renderXLineDash(gcxor); return gcxor; } } void Compass::renderPS(int mode) { renderPSGC(mode); Vector aa = parent->mapFromRef(center,Coord::CANVAS); Vector bb = parent->mapFromRef(p1,Coord::CANVAS); Vector cc = parent->mapFromRef(p2,Coord::CANVAS); Vector dd = parent->mapFromRef(pp1,Coord::CANVAS); Vector ee = parent->mapFromRef(pp2,Coord::CANVAS); if (northArrow) { bb = modifyArrow(center,p1,Coord::CANVAS); renderPSArrow(center,p1,Coord::CANVAS); } if (eastArrow) { cc = modifyArrow(center,p2,Coord::CANVAS); renderPSArrow(center,p2,Coord::CANVAS); } { ostringstream str; str << "newpath " << aa.TkCanvasPs(parent->canvas) << "moveto" << bb.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl; str << "newpath " << aa.TkCanvasPs(parent->canvas) << "moveto" << cc.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl; str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } if (psfont_) { ostringstream str; const char* ff = Tk_NameOfFont(psfont_); str << '/' << psFontName(ff) << " findfont " << int(psFontSize(ff)*parent->getDisplayRatio()) << " scalefont setfont" << endl; if (northText) { double angle = (bb-aa).angle(); Vector ddd = dd.TkCanvasPs(parent->canvas); str << "gsave" << endl << "newpath " << endl << ddd << " moveto" << endl << '(' << psQuote(northText) << ')' << endl // bbox << "dup true charpath pathbbox " << endl << "closepath " << endl // text llx lly urx ury // dup bbox << "3 index 3 index 3 index 3 index " << endl // text llx lly urx ury llx lly urx ury // Translate(-r1,(metrics.ascent-metrics.descent)/2.) << "3 -1 roll sub 3.6 div neg " << endl << "3 1 roll sub 2 div exch " << endl // text llx lly urx ury Sx Sy // reorder << "6 1 roll 6 1 roll " << endl // text Sx Sy llx lly urx ury // Translate(r1*cos(angle),r2*sin(angle)) << "3 -1 roll sub 2 div neg " << endl << "3 1 roll sub 2 div exch " << endl << radToDeg(angle) << " sin mul exch " << endl << radToDeg(angle) << " cos mul neg exch " << endl // text Sx Sy Tx Ty // add << "3 -1 roll add " << endl << "3 1 roll add exch " << endl // text Fx Fy << ddd << " moveto rmoveto show " << endl << "grestore" << endl; } if (eastText) { double angle = (cc-aa).angle(); Vector eee = ee.TkCanvasPs(parent->canvas); str << "gsave" << endl << "newpath " << endl << eee << " moveto" << endl << '(' << psQuote(eastText) << ')' << endl << "dup true charpath pathbbox " << "closepath " << endl << "3 index 3 index 3 index 3 index " << endl << "3 -1 roll sub 3.6 div neg " << "3 1 roll sub 2 div exch " << endl << "6 1 roll 6 1 roll " << endl << "3 -1 roll sub 2 div neg " << "3 1 roll sub 2 div exch " << endl << radToDeg(angle) << " sin mul exch " << radToDeg(angle) << " cos mul neg exch " << endl << "3 -1 roll add " << "3 1 roll add exch " << endl << eee << " moveto rmoveto show " << endl << "grestore" << endl; } str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } void Compass::renderPSGC(int mode) { renderPSColor(mode, parent->getXColor(colorName)); renderPSLineNoDash(); } #ifdef MAC_OSX_TK void Compass::renderMACOSX() { renderMACOSXGC(); Vector aa = parent->mapFromRef(center,Coord::CANVAS); Vector bb = parent->mapFromRef(p1,Coord::CANVAS); Vector cc = parent->mapFromRef(p2,Coord::CANVAS); Vector dd = parent->mapFromRef(pp1,Coord::CANVAS); Vector ee = parent->mapFromRef(pp2,Coord::CANVAS); if (northArrow) { bb = modifyArrow(center,p1,Coord::CANVAS); renderMACOSXArrow(center,p1,Coord::CANVAS); } if (eastArrow) { cc = modifyArrow(center,p2,Coord::CANVAS); renderMACOSXArrow(center,p2,Coord::CANVAS); } macosxDrawLine(aa,bb); macosxDrawLine(aa,cc); if (psfont_) { Tcl_DString psdstr; Tcl_DStringInit(&psdstr); int psSize = Tk_PostscriptFontName(psfont_, &psdstr); macosxFont(Tcl_DStringValue(&psdstr), psSize); Tcl_DStringFree(&psdstr); Tk_FontMetrics metrics; Tk_GetFontMetrics(psfont_, &metrics); if (northText) { float r1 = Tk_TextWidth(psfont_, northText, strlen(northText))/2.; float r2 = metrics.linespace/2.; double angle = (bb-aa).angle(); Vector ddd = dd * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); macosxDrawText(ddd, 0, northText); } if (eastText) { float r1 = Tk_TextWidth(psfont_, eastText, strlen(eastText))/2.; float r2 = metrics.linespace/2.; double angle = (cc-aa).angle(); Vector eee = ee * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); macosxDrawText(eee, 0, eastText); } } } void Compass::renderMACOSXGC() { macosxColor(parent->getXColor(colorName)); renderMACOSXLineNoDash(); } #endif #ifdef __WIN32 void Compass::renderWIN32() { renderWIN32GC(); Vector aa = parent->mapFromRef(center,Coord::CANVAS); Vector bb = parent->mapFromRef(p1,Coord::CANVAS); Vector cc = parent->mapFromRef(p2,Coord::CANVAS); Vector dd = parent->mapFromRef(pp1,Coord::CANVAS); Vector ee = parent->mapFromRef(pp2,Coord::CANVAS); if (northArrow) { bb = modifyArrow(center,p1,Coord::CANVAS); renderWIN32Arrow(center,p1,Coord::CANVAS); } if (eastArrow) { cc = modifyArrow(center,p2,Coord::CANVAS); renderWIN32Arrow(center,p2,Coord::CANVAS); } win32DrawLine(aa,bb); win32DrawLine(aa,cc); if (tkfont_) { win32Font(tkfont_); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); if (northText) { float r1 = Tk_TextWidth(tkfont_, northText, strlen(northText))/2.; float r2 = metrics.linespace/2.; double angle = (bb-aa).angle(); Vector ddd = dd * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); win32DrawText(ddd, 0, northText); } if (eastText) { float r1 = Tk_TextWidth(tkfont_, eastText, strlen(eastText))/2.; float r2 = metrics.linespace/2.; double angle = (cc-aa).angle(); Vector eee = ee * Translate(r1*cos(angle),r2*sin(angle)) * Translate(-r1,(metrics.ascent-metrics.descent)/2.); win32DrawText(eee, 0, eastText); } } } void Compass::renderWIN32GC() { win32Color(parent->getXColor(colorName)); renderWIN32LineNoDash(); } #endif void Compass::updateHandles() { // calc p1, p2 FitsImage* ptr = parent->findFits(coordSystem,center); Vector orval = ptr->mapFromRef(center, coordSystem, skyFrame); double delta = ptr->mapLenFromRef(1, coordSystem); Vector npix = ptr->mapToRef(Vector(orval[0],orval[1]+delta), coordSystem, skyFrame); Vector epix = ptr->mapToRef(Vector(orval[0]+delta,orval[1]), coordSystem, skyFrame); Vector north = (npix - center).normalize(); Vector east = (epix - center).normalize(); // calc text points pp1,pp2 Matrix r = Scale(radius)*Scale(parent->zoom()).invert(); Matrix rr = Scale(5)*Scale(parent->zoom()).invert(); p1 = center + north*r; p2 = center + east*r; pp1 = p1 + north*rr; pp2 = p2 + east*rr; // generate handles handle[0] = parent->mapFromRef(center,Coord::CANVAS); handle[1] = parent->mapFromRef(p1,Coord::CANVAS); handle[2] = parent->mapFromRef(p2,Coord::CANVAS); } void Compass::calcAllBBox() { if (tkfont_) { // make room for text Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); Vector a = parent->mapFromRef(center,Coord::CANVAS); Vector b = parent->mapFromRef(p1,Coord::CANVAS); Vector c = parent->mapFromRef(p2,Coord::CANVAS); Vector bb = parent->mapFromRef(pp1,Coord::CANVAS); Vector cc = parent->mapFromRef(pp2,Coord::CANVAS); if (northText) { float r1 = Tk_TextWidth(tkfont_, northText, strlen(northText))/2.; float r2 = metrics.linespace/2.; double angle = (b-a).angle(); Vector bbb = bb * Translate(r1*cos(angle),r2*sin(angle)); bbox.bound(bbb * Translate(-r1,(metrics.ascent-metrics.descent)/2.)); bbox.bound(bbb * Translate(-r1,-metrics.ascent/2.-3*metrics.descent/2.)); bbox.bound(bbb * Translate(r1,(metrics.ascent-metrics.descent)/2.)); bbox.bound(bbb * Translate(r1,-metrics.ascent/2.-3*metrics.descent/2.)); } if (eastText) { float r1 = Tk_TextWidth(tkfont_, eastText, strlen(eastText))/2.; float r2 = metrics.linespace/2.; double angle = (c-a).angle(); Vector ccc = cc * Translate(r1*cos(angle),r2*sin(angle)); bbox.bound(ccc * Translate(-r1,(metrics.ascent-metrics.descent)/2.)); bbox.bound(ccc * Translate(-r1,-metrics.ascent/2.-3*metrics.descent/2.)); bbox.bound(ccc * Translate(r1,(metrics.ascent-metrics.descent)/2.)); bbox.bound(ccc * Translate(r1,-metrics.ascent/2.-3*metrics.descent/2.)); } } Marker::calcAllBBox(); } void Compass::edit(const Vector& v, int h) { radius = (v * Translate(-center) * Scale(parent->zoom())).length(); updateBBox(); doCallBack(CallBack::EDITCB); } int Compass::isIn(const Vector& vv) { /* v[0]-- x value of point being tested v[1]-- y value of point being tested This algorithm is from "An Introduction to Ray Tracing", Academic Press, 1989, edited by Andrew Glassner, pg 53 -- a point lies in a polygon if a line is extended from the point to infinite in any direction and the number of intersections with the polygon is odd. This is valid for both concave and convex polygons. Points on a vertex are considered inside. Points on a edge are considered inside. */ Vector v = parent->mapToRef(vv,Coord::CANVAS); int crossings = 0; // number of crossings Vector bb[4]; bb[0] = center - v; bb[1] = p1 - v; bb[2] = p2 - v; bb[3] = bb[0]; Vector v1; Vector v2 = bb[0]; int sign = ((v2[1])>=0) ? 1 : -1; // init sign // for all edges for (int j=1; j<4; j++) { // look at next two vertices v1 = v2; v2 = bb[j]; int nextSign = (v2[1]>=0) ? 1 : -1; // sign holder for p2 if (sign != nextSign) { if (v1[0]>0 && v2[0]>0) crossings++; else if (v1[0]>0 || v2[0]>0) { if (v1[0]-(v1[1]*(v2[0]-v1[0])/(v2[1]-v1[1])) > 0) crossings++; } sign = nextSign; } } return fmod(float(crossings),float(2)) ? 1 : 0; // if odd, point is inside } void Compass::setRadius(double r) { radius = r; updateBBox(); doCallBack(CallBack::EDITCB); } void Compass::setArrows(int n, int e) { northArrow = n; eastArrow = e; updateBBox(); doCallBack(CallBack::EDITCB); } void Compass::setLabels(const char* n, const char* e) { northText = dupstr(n); eastText = dupstr(e); updateBBox(); doCallBack(CallBack::EDITCB); } void Compass::setCoordSystem(Coord::CoordSystem sys, Coord::SkyFrame sky) { coordSystem = sys; skyFrame = sky; updateBBox(); } // list void Compass::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ptr->mapLenFromRef(radius,sys) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ptr->mapLenFromRef(radius,sys,Coord::ARCSEC) << '"' << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << ptr->mapLenFromRef(radius,sys,Coord::ARCSEC) << '"' << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ptr->mapLenFromRef(radius,sys) << ')'; } } } if (conj) str << " ||"; str << " compass="; coord.listCoordSystem(str, coordSystem, skyFrame, 1, ptr->hasWCSCel(coordSystem)); str << " {" << northText << "} {" << eastText << "} " << northArrow << ' ' << eastArrow; listProperties(str, 0); } } void Compass::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); double rr = ptr->mapLenFromRef(radius,sys,Coord::ARCSEC); ostringstream pstr; coord.listCoordSystem(pstr, coordSystem, skyFrame, 0, ptr->hasWCSCel(coordSystem)); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRow(XMLR,rr); XMLRow(XMLPARAM,(char*)(pstr.str().c_str())); XMLRow(XMLPARAM2,northText); XMLRow(XMLPARAM3,eastText); XMLRow(XMLPARAM4,northArrow); XMLRow(XMLPARAM5,eastArrow); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/compass.h000644 000765 000000 00000004225 12544546070 016646 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __compass_h__ #define __compass_h__ #include "marker.h" class Compass : public Marker { private: Vector p1; Vector p2; Vector pp1; Vector pp2; double radius; Coord::CoordSystem coordSystem; Coord::SkyFrame skyFrame; char* northText; char* eastText; int northArrow; int eastArrow; private: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderXInclude(Drawable, Coord::InternalSystem, RenderMode) {} GC renderXGC(RenderMode); void renderPS(int); void renderPSInclude(int) {} void renderPSGC(int); #ifdef MAC_OSX_TK void renderMACOSX(); void renderMACOSXInclude() {} void renderMACOSXGC(); #endif #ifdef __WIN32 void renderWIN32(); void renderWIN32Include() {} void renderWIN32GC(); #endif void updateHandles(); public: Compass(const Compass&); Compass(Base* parent, const Vector& ctr, double r, const char* n, const char* e, int na, int ea, Coord::CoordSystem, Coord::SkyFrame, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb); ~Compass(); Marker* dup() {return new Compass(*this);} void calcAllBBox(); void edit(const Vector&, int); void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} int isIn(const Vector&); double getRadius() {return radius;} void setRadius(double); void setCoordSystem(Coord::CoordSystem, Coord::SkyFrame); void setLabels(const char*, const char*); void setArrows(int,int); Coord::CoordSystem getSystem() {return coordSystem;} Coord::SkyFrame getSkyFrame() {return skyFrame;} const char* getNorthText() {return northText;} const char* getEastText() {return eastText;} int getNorthArrow() {return northArrow;} int getEastArrow() {return eastArrow;} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/composite.C000644 000765 000000 00000015535 12544546070 017144 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "composite.h" #include "fitsimage.h" Composite::Composite(const Composite& a) : Marker(a) { members = a.members; global = a.global; } Composite::Composite(Base* p, const Vector& ctr, double ang, int gl, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { strcpy(type_, "composite"); global = gl; handle = new Vector[4]; numHandle = 4; updateBBox(); } void Composite::x11(Drawable drawable, Coord::InternalSystem sys, int tt, RenderMode mode, HandleMode hh) { if (properties & HIDDEN) return; if (hh==HANDLES) renderXHandles(drawable); if (tt) renderXText(drawable, sys, mode); Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); if (global) m->setComposite(colorName, lineWidth, highlited); m->x11(drawable, sys, tt, mode, hh); delete m; mk=mk->next(); } } void Composite::ps(int mode, int tt) { if (tt) renderPSText(mode); Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); if (global) m->setComposite(colorName, lineWidth, highlited); m->ps(mode,tt); delete m; mk=mk->next(); } } #ifdef MAC_OSX_TK void Composite::macosx(int tt) { if (tt) renderMACOSXText(); Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); if (global) m->setComposite(colorName, lineWidth, highlited); m->macosx(tt); delete m; mk=mk->next(); } } #endif #ifdef __WIN32 void Composite::win32(int tt) { if (tt) renderWIN32Text(); Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); if (global) m->setComposite(colorName, lineWidth, highlited); m->win32(tt); delete m; mk=mk->next(); } } #endif // Support void Composite::updateHandles() { BBox bb(center * bckMatrix()); Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); for(int ii=0; iigetNumHandle(); ii++) bb.bound(bckMap(m->getHandle(ii),Coord::CANVAS)); delete m; mk=mk->next(); } bb.expand(3); // a little more room around the edges handle[0] = fwdMap(bb.ll,Coord::CANVAS); handle[1] = fwdMap(bb.lr(),Coord::CANVAS); handle[2] = fwdMap(bb.ur,Coord::CANVAS); handle[3] = fwdMap(bb.ul(),Coord::CANVAS); } void Composite::updateCoords(const Matrix& mx) { Marker* mk=members.head(); while (mk) { Vector cc = center; mk->setComposite(fwdMatrix(), angle); mk->updateCoords(mx); center = cc*mx; mk->setComposite(bckMatrix(), -angle); center = cc; mk=mk->next(); } Marker::updateCoords(mx); } int Composite::isIn(const Vector& v) { if (!bbox.isIn(v)) return 0; Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); if (m->isIn(v)) { delete m; return 1; } delete m; mk=mk->next(); } return 0; } void Composite::append(Marker* m) { m->setComposite(bckMatrix(), -angle); members.append(m); } Marker* Composite::extract() { Marker* mk=members.head(); if (mk) { members.extractNext(mk); mk->setComposite(fwdMatrix(), angle); } return mk; } // list void Composite::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } str << " ||"; str << " composite=" << global; listProperties(str, 0); } Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); mk=mk->next(); m->setComposite(fwdMatrix(), angle); m->list(str, sys, sky, format, (mk?1:0), strip); delete m; } } void Composite::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); mk=mk->next(); m->setComposite(fwdMatrix(), angle); m->listCiao(str, sys, strip); delete m; } } void Composite::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); m->listPros(str, sys, sky, format, strip); delete m; mk=mk->next(); } } void Composite::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); m->listSAOtng(str, sys, sky, format, strip); delete m; mk=mk->next(); } } void Composite::listSAOimage(ostream& str, int strip) { Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); m->listSAOimage(str, strip); delete m; mk=mk->next(); } } void Composite::listXY(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { Marker* mk=members.head(); while (mk) { Marker* m = mk->dup(); m->setComposite(fwdMatrix(), angle); m->listXY(str, sys, sky, format, strip); delete m; mk=mk->next(); } } saods9/tksao1.0/frame/composite.h000644 000765 000000 00000003411 12544546070 017177 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __composite_h__ #define __composite_h__ #include "marker.h" #include "list.h" class Composite : public Marker { private: List members; int global; void renderX(Drawable, Coord::InternalSystem, RenderMode) {} void renderPS(int mode) {} #ifdef MAC_OSX_TK void renderMACOSX() {} #endif #ifdef __WIN32 void renderWIN32() {} #endif protected: void updateHandles(); public: Composite(const Composite&); Composite(Base* p, const Vector& ctr, double ang, int gl, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Composite(*this);} void x11(Drawable, Coord::InternalSystem, int, RenderMode, HandleMode); void ps(int,int); #ifdef MAC_OSX_TK void macosx(int); #endif #ifdef __WIN32 void win32(int); #endif void updateCoords(const Matrix&); int isIn(const Vector& v); void append(Marker*); Marker* extract(); void setGlobal(int w) {global = w ? 1 : 0;} int getGlobal() {return global;} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat) {} void listCiao(ostream&, Coord::CoordSystem, int); void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void listSAOimage(ostream&, int); void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void listXY(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); }; #endif saods9/tksao1.0/frame/context.C000644 000765 000000 00000154270 12631357025 016623 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "fitsimage.h" #include "fvcontour.h" #include "alloc.h" #include "allocgz.h" #include "channel.h" #include "mmap.h" #include "mmapincr.h" #include "share.h" #include "sshare.h" #include "socket.h" #include "socketgz.h" #include "var.h" #include "head.h" extern "C" { #include "bltVector.h" } typedef struct { char* dest; char** sjv; int ww; int hh; int dd; int bz; int mm; } t_reorder_arg; ostream& operator<<(ostream& ss, const FitsZBound& bb) { ss << bb.zmin << ' ' << bb.zmax; return ss; } Context::Context() { parent_ = NULL; bfits_ =NULL; fits =NULL; cfits =NULL; shareWCS_ =0; manageAxes_ =0; axesOrder_ =123; loadInit(0, Base::NOMOSAIC, Coord::WCS); binFunction_ = FitsHist::SUM; binFactor_ = Vector(1,1); binBufferSize_ = 1024; binDepth_ = 1; blockFactor_ = Vector(1,1); doSmooth_ =0; smoothFunction_ =GAUSSIAN; smoothRadius_ =3; contour =NULL; thread_ =NULL; } Context::~Context() { if (contour) delete contour; } #ifdef __WIN32 void Context::analysis() { if (DebugPerf) cerr << "Context::analysis()" << endl; FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->analysis(doSmooth_); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } updateClip(); } #else void Context::analysis() { if (DebugPerf) cerr << "Context::analysis()" << endl; if (thread_) delete [] thread_; thread_ = new pthread_t[parent_->nthreads_]; t_smooth_arg* targ = new t_smooth_arg[parent_->nthreads_]; int cnt =0; FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->analysis(doSmooth_, &thread_[cnt], &targ[cnt]); cnt++; if (cnt == parent_->nthreads_) { if (doSmooth_) { for (int ii=0; iinextSlice(); } ptr = ptr->nextMosaic(); } if (doSmooth_) { for (int ii=0; iibin(vv); binFinish(); } return mm; } Matrix Context::binCenter() { Matrix mm; if (fits) { mm = fits->binCenter(); binFinish(); } return mm; } Matrix Context::binCursor() { Matrix mm; if (fits) { mm = fits->binCursor(); binFinish(); } return mm; } void Context::binFinish() { if (DebugPerf) cerr << "Context::binFinish()" << endl; if (!fits->isHist()) return; // delete any previous slices { FitsImage* ptr = fits->nextSlice(); fits->setNextSlice(NULL); while (ptr) { FitsImage* tmp = ptr->nextSlice(); delete ptr; ptr = tmp; } } // finish bin loadInit(1, Base::NOMOSAIC,Coord::WCS); cfits = fits; // bin data cube int bd = binDepth_; if (bd > 1) { naxis_[2] =1; // first shareWCS_ =1; FitsImage* ptr = fits; for (int ii=1; iiinterp, fits, ptr->baseFile(), ii+1); if (next->isValid()) { ptr->setNextSlice(next); ptr = next; naxis_[2]++; } else { delete next; break; } } } // fix z params (in data coords) iparams.set(0,naxis_[2]); cparams.set(0,naxis_[2]); frScale.resetScanMode(); loadFinish(); } #ifdef __WIN32 int Context::block() { if (DebugPerf) cerr << "Context::block()" << endl; // primary FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->block(); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } frScale.resetScanMode(); int rr =1; switch (mosaicType) { case Base::IRAF: case Base::WCSMOSAIC: rr = processMosaicKeywords(fits); break; default: break; } FitsMask* msk = mask.head(); if (msk) { FitsImage* ptr = msk->mask(); while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->block(); switch (mosaicType) { case Base::IRAF: case Base::WCSMOSAIC: rr &= processMosaicKeywords(ptr); break; default: break; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } msk = msk->next(); } return rr & blockMask(); } int Context::blockMask() { int rr =1; FitsMask* msk = mask.head(); if (msk) { FitsImage* ptr = msk->mask(); while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->block(); switch (mosaicType) { case Base::IRAF: case Base::WCSMOSAIC: rr &= processMosaicKeywords(ptr); break; default: break; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } msk = msk->next(); } return rr; } #else int Context::block() { if (DebugPerf) cerr << "Context::block()" << endl; int doBlock = (blockFactor_[0] != 1 && blockFactor_[1] != 1) ? 1 : 0; int rr =1; // primary if (thread_) delete [] thread_; thread_ = new pthread_t[parent_->nthreads_]; { int cnt =0; FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->block(&thread_[cnt]); cnt++; if (cnt == parent_->nthreads_) { if (doBlock) { for (int ii=0; iinextSlice(); } ptr = ptr->nextMosaic(); } if (doBlock) { for (int ii=0; iinthreads_]; { int cnt =0; FitsMask* msk = mask.head(); if (msk) { FitsImage* ptr = msk->mask(); while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->block(&thread_[cnt]); cnt++; if (cnt == parent_->nthreads_) { if (doBlock) { for (int ii=0; iinextSlice(); } ptr = ptr->nextMosaic(); } msk = msk->next(); } if (doBlock) { for (int ii=0; iimask(); while (ptr) { FitsImage* sptr = ptr; while (sptr) { switch (mosaicType) { case Base::IRAF: case Base::WCSMOSAIC: rr &= processMosaicKeywords(ptr); break; default: break; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } msk = msk->next(); } } return rr; } #endif void Context::bltHist(char* xname, char* yname, int num) { if (!fits) return; switch (frScale.clipScope()) { case FrScale::GLOBAL: frScale.histogram(fits,num); break; case FrScale::LOCAL: frScale.histogram(cfits,num); break; } int nn = num+1; double* x = frScale.histogramX(); double* y = frScale.histogramY(); Blt_Vector* xx; Blt_GetVector(parent_->interp, xname, &xx); Blt_ResetVector(xx, x, nn, nn*sizeof(double), TCL_VOLATILE); Blt_Vector* yy; Blt_GetVector(parent_->interp, yname, &yy); Blt_ResetVector(yy, y, nn, nn*sizeof(double), TCL_VOLATILE); } int Context::calcSlice() { int cnt =1; for (int jj=3; jjnextSlice(); while (sptr) { FitsImage* stmp = sptr->nextSlice(); delete sptr; sptr = stmp; } FitsImage* tmp = ptr->nextMosaic(); delete ptr; ptr = tmp; } } Vector Context::getClip() { return Vector(frScale.low(), frScale.high()); } Vector Context::getClip(FrScale::ClipMode cm, float ac) { if (DebugPerf) cerr << "Context::getClip()" << endl; // we already have the scale? if (frScale.clipMode() == cm && frScale.autoCutPer() == ac) return Vector(frScale.low(),frScale.high()); FrScale cl = frScale; cl.setClipMode(cm); cl.setAutoCutPer(ac); cl.clearHistogram(); cl.clearHistequ(); updateClip(&cl); // now reset updateClip(&frScale); return Vector(cl.low(),cl.high()); } FitsZBound* Context::getDataParams(FrScale::ScanMode which) { switch (which) { case FrScale::IMGSEC: case FrScale::DATASEC: return &iparams; case FrScale::CROPSEC: return &cparams; } } Vector Context::getMinMax() { return Vector(frScale.min(), frScale.max()); } int Context::load(Base::MemType which, const char* fn, FitsImage* img, Base::LayerType ll) { if (!img || !img->isValid()) { if (img) delete img; switch (ll) { case Base::IMG: unload(); return 0; case Base::MASK: return 0; } } switch (ll) { case Base::IMG: bfits_ = img; loadInit(1, Base::NOMOSAIC,Coord::WCS); for (int ii=2; iinaxis(ii); baxis_[ii] = nn ? nn : 1; } // fix z params (in data coords) // do it here because of fits section iparams.set(0,baxis_[2]); cparams.set(0,baxis_[2]); break; case Base::MASK: mask.append(new FitsMask(parent_, img, parent_->maskColorName, parent_->maskMark)); break; } if (img->isHist()) which = Base::HIST; else if (img->isPost()) which = Base::POST; if (img->nhdu() > 1) shareWCS_ =1; FitsImage* ptr = img; for (int ii=1; iinhdu(); ii++) { FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageFitsNextAlloc(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::ALLOCGZ: next = new FitsImageFitsNextAllocGZ(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::CHANNEL: next = new FitsImageFitsNextChannel(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::MMAP: next = new FitsImageFitsNextMMap(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::SMMAP: next = new FitsImageFitsNextSMMap(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::MMAPINCR: next = new FitsImageFitsNextMMapIncr(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::SHARE: next = new FitsImageFitsNextShare(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::SSHARE: next = new FitsImageFitsNextSShare(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::SOCKET: next = new FitsImageFitsNextSocket(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::SOCKETGZ: next = new FitsImageFitsNextSocketGZ(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::VAR: next = new FitsImageFitsNextVar(this, parent_->interp, fn, ptr->fitsFile(), ii+1); break; case Base::POST: next = new FitsImageFitsNextPost(this, parent_->interp, img, ptr->baseFile(), ii+1); break; case Base::PHOTO: next = new FitsImagePhotoCubeNext(this, parent_->interp, fn, ptr->baseFile(), ii+1); break; default: // na break; } if (next->isValid()) { ptr->setNextSlice(next); ptr = next; } else { delete next; break; } } // finish up img->close(); switch (ll) { case Base::IMG: loadFinish(); break; case Base::MASK: loadFinishMask(); break; } return 1; } int Context::loadExtCube(Base::MemType which, const char* fn, FitsImage* img) { if (!img || !img->isValid()) { if (img) delete img; unload(); return 0; } bfits_ = img; loadInit(1, Base::NOMOSAIC,Coord::WCS); // get the rest FitsImage* ptr = img; FitsImage* mptr = ptr; FitsImage* tmp =NULL; while (1) { FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageMosaicNextAlloc(this, parent_->interp, fn, ptr->fitsFile(), FitsFile::NOFLUSH ,1); break; case Base::ALLOCGZ: next = new FitsImageMosaicNextAllocGZ(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::NOFLUSH ,1); break; case Base::CHANNEL: next = new FitsImageMosaicNextChannel(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::NOFLUSH, 1); break; case Base::MMAP: next = new FitsImageMosaicNextMMap(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::MMAPINCR: next = new FitsImageMosaicNextMMapIncr(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SHARE: next = new FitsImageMosaicNextShare(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SOCKET: next = new FitsImageMosaicNextSocket(this, parent_->interp, fn,ptr->fitsFile(), FitsFile::FLUSH,1 ); break; case Base::SOCKETGZ: next =new FitsImageMosaicNextSocketGZ(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::FLUSH,1 ); break; case Base::VAR: next = new FitsImageMosaicNextVar(this, parent_->interp, fn, ptr->fitsFile(), 1); break; default: // na break; } // if previous was a unknown table, delete now, we're done with it if (tmp) { delete tmp; tmp =NULL; } // first check if fits_ is a known extension, aka we loaded something if (next->isImage() || next->isTable()) { // now check to see if it resolved into an image, no event tables // since any table can be a valid event table if (next->isValid() && !next->isHist()) { mptr->setNextSlice(next); ptr = next; mptr = ptr; baxis_[2]++; } else { // must be a unknown table, just ignore, and delete next time thru ptr = next; tmp = next; } } else { delete next; break; } } // finish up img->close(); // fix z params (in data coords) // must wait untill all loaded iparams.set(0,baxis_[2]); cparams.set(0,baxis_[2]); loadFinish(); return 1; } void Context::loadInit(int cnt, Base::MosaicType type, Coord::CoordSystem sys) { shareWCS_ =0; mosaicCount_ = cnt; mosaicType = type; mosaicSystem = sys; for (int ii=0; iiisValid()) { if (img) delete img; return 0; } switch (ll) { case Base::IMG: if (bfits_) { FitsImage* ptr = bfits_; while (ptr && ptr->nextMosaic()) ptr = ptr->nextMosaic(); ptr->setNextMosaic(img); mosaicCount_++; } else { bfits_ = img; loadInit(1, type,sys); for (int ii=2; iinaxis(ii); baxis_[ii] = nn ? nn : 1; } // fix z params (in data coords) // do it here because of fits section iparams.set(0,baxis_[2]); cparams.set(0,baxis_[2]); } break; case Base::MASK: FitsMask* msk = mask.tail(); if (msk) { FitsImage* mskimg = msk->mask(); while (mskimg && mskimg->nextMosaic()) mskimg = mskimg->nextMosaic(); mskimg->setNextMosaic(img); } else mask.append(new FitsMask(parent_, img, parent_->maskColorName, parent_->maskMark)); break; } if (img->isPost()) which = Base::POST; // get the rest of slices if (img->nhdu() > 1) shareWCS_ =1; FitsImage* sptr = img; for (int ii=1; iinhdu(); ii++) { FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageFitsNextAlloc(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::ALLOCGZ: next = new FitsImageFitsNextAllocGZ(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::CHANNEL: next = new FitsImageFitsNextChannel(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::MMAP: next = new FitsImageFitsNextMMap(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SMMAP: next = new FitsImageFitsNextSMMap(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::MMAPINCR: next = new FitsImageFitsNextMMapIncr(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SHARE: next = new FitsImageFitsNextShare(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SSHARE: next = new FitsImageFitsNextSShare(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SOCKET: next = new FitsImageFitsNextSocket(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SOCKETGZ: next = new FitsImageFitsNextSocketGZ(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::VAR: next = new FitsImageFitsNextVar(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::POST: next = new FitsImageFitsNextPost(this, parent_->interp, img, sptr->baseFile(), ii+1); break; case Base::PHOTO: next = new FitsImagePhotoCubeNext(this, parent_->interp, fn, sptr->baseFile(), ii+1); break; default: // na break; } if (next->isValid()) { sptr->setNextSlice(next); sptr = next; } else { delete next; break; } } // finish up img->close(); switch (ll) { case Base::IMG: loadFinishMosaic(fits); if (!loadFinish()) { unload(); return 0; } break; case Base::MASK: if (!loadFinishMosaicMask()) return 0; break; } return 1; } int Context::loadMosaicImage(Base::MemType which, const char* fn, FitsImage* img, Base::LayerType ll, Base::MosaicType type, Coord::CoordSystem sys) { if (!img || !img->isValid()) { if (img) delete img; switch (ll) { case Base::IMG: unload(); return 0; case Base::MASK: return 0; } } switch (ll) { case Base::IMG: bfits_ = img; loadInit(1, type,sys); for (int ii=2; iinaxis(ii); baxis_[ii] = nn ? nn : 1; } // fix z params (in data coords) // do it here because of fits section iparams.set(0,baxis_[2]); cparams.set(0,baxis_[2]); break; case Base::MASK: mask.append(new FitsMask(parent_, img, parent_->maskColorName, parent_->maskMark)); break; } Base::MemType sav = which; // get the rest of slices FitsImage* sptr = img; if (img->isPost()) which = Base::POST; if (img->nhdu() > 1) shareWCS_ =1; for (int ii=1; iinhdu(); ii++) { FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageFitsNextAlloc(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::ALLOCGZ: next = new FitsImageFitsNextAllocGZ(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::CHANNEL: next = new FitsImageFitsNextChannel(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::MMAP: next = new FitsImageFitsNextMMap(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SMMAP: next = new FitsImageFitsNextSMMap(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::MMAPINCR: next = new FitsImageFitsNextMMapIncr(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SHARE: next = new FitsImageFitsNextShare(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SSHARE: next = new FitsImageFitsNextSShare(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SOCKET: next = new FitsImageFitsNextSocket(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::SOCKETGZ: next = new FitsImageFitsNextSocketGZ(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::VAR: next = new FitsImageFitsNextVar(this, parent_->interp, fn, sptr->fitsFile(), ii+1); break; case Base::POST: next = new FitsImageFitsNextPost(this, parent_->interp, img, sptr->baseFile(), ii+1); break; default: // na break; } if (next->isValid()) { sptr->setNextSlice(next); sptr = next; } else { delete next; break; } } // get the rest of mosaic FitsImage* ptr = img; FitsImage* tmp =NULL; while (1) { // restore which which = sav; FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageMosaicNextAlloc(this, parent_->interp, fn, ptr->fitsFile(), FitsFile::NOFLUSH, 1); break; case Base::ALLOCGZ: next = new FitsImageMosaicNextAllocGZ(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::NOFLUSH, 1); break; case Base::CHANNEL: next = new FitsImageMosaicNextChannel(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::NOFLUSH, 1); break; case Base::MMAP: next = new FitsImageMosaicNextMMap(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::MMAPINCR: next = new FitsImageMosaicNextMMapIncr(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SHARE: next = new FitsImageMosaicNextShare(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SOCKET: next = new FitsImageMosaicNextSocket(this, parent_->interp, fn,ptr->fitsFile(), FitsFile::FLUSH, 1); break; case Base::SOCKETGZ: next = new FitsImageMosaicNextSocketGZ(this, parent_->interp,fn,ptr->fitsFile(), FitsFile::FLUSH, 1); break; case Base::VAR: next = new FitsImageMosaicNextVar(this, parent_->interp, fn, ptr->fitsFile(), 1); break; default: // na break; } // if previous was a unknown table, delete now, we're done with it if (tmp) { delete tmp; tmp =NULL; } // first check if fits_ is a known extension, aka we loaded something if (!next->isImage() && !next->isTable()) { // ok, we're done delete next; break; } // now check to see if it resolved into an image, no event tables // since any table can be a valid event table if (!next->isValid() || next->isHist()) { // must be a unknown table, just ignore, and delete next time thru ptr = next; tmp = next; } else { ptr->setNextMosaic(next); ptr = next; if (ll == Base::IMG) mosaicCount_++; if (img->isPost()) which = Base::POST; // get rest of slices for (int ii=1; iinhdu(); ii++) { FitsImage* snext = NULL; switch (which) { case Base::ALLOC: snext = new FitsImageFitsNextAlloc(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::ALLOCGZ: snext = new FitsImageFitsNextAllocGZ(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::CHANNEL: snext = new FitsImageFitsNextChannel(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::MMAP: snext = new FitsImageFitsNextMMap(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::SMMAP: snext = new FitsImageFitsNextSMMap(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::MMAPINCR: snext = new FitsImageFitsNextMMapIncr(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::SHARE: snext = new FitsImageFitsNextShare(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::SSHARE: snext = new FitsImageFitsNextSShare(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::SOCKET: snext = new FitsImageFitsNextSocket(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::SOCKETGZ: snext = new FitsImageFitsNextSocketGZ(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::VAR: snext = new FitsImageFitsNextVar(this, parent_->interp, fn, next->fitsFile(),ii+1); break; case Base::POST: snext = new FitsImageFitsNextPost(this, parent_->interp, ptr, next->baseFile(),ii+1); break; default: // na break; } if (snext->isValid()) { next->setNextSlice(snext); next = snext; } else { delete snext; break; } } } } // finish up img->close(); switch (ll) { case Base::IMG: loadFinishMosaic(fits); if (!loadFinish()) { unload(); return 0; } break; case Base::MASK: if (!loadFinishMosaicMask()) return 0; break; } return 1; } int Context::loadMosaicWFPC2(Base::MemType which, const char* fn, FitsImage* img) { if (!img || !img->isValid()) { if (img) delete img; unload(); return 0; } // Its legal, save it bfits_ = img; loadInit(1, Base::WFPC2,Coord::WCS); // remember in case of compress Base::MemType sav = which; if (img->isPost()) which = Base::POST; // get the rest { FitsImage* ptr = img; for (int i=1; i<4; i++) { FitsImage* next = NULL; switch (which) { case Base::ALLOC: next = new FitsImageFitsNextAlloc(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::ALLOCGZ: next = new FitsImageFitsNextAllocGZ(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::CHANNEL: next = new FitsImageFitsNextChannel(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::MMAP: next = new FitsImageFitsNextMMap(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::MMAPINCR: next = new FitsImageFitsNextMMapIncr(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SHARE: next = new FitsImageFitsNextShare(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SOCKET: next = new FitsImageFitsNextSocket(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::SOCKETGZ: next = new FitsImageFitsNextSocketGZ(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::VAR: next = new FitsImageFitsNextVar(this, parent_->interp, fn, ptr->fitsFile(), 1); break; case Base::POST: next = new FitsImageFitsNextPost(this, parent_->interp, img, ptr->baseFile(), 1); break; default: // na break; } if (next->isValid()) { ptr->setNextMosaic(next); ptr = next; mosaicCount_++; } else { delete next; break; } } } // restore which which = sav; // ok, do we have 4 images? if (mosaicCount_ != 4) { unload(); return 0; } // now, find WCS table FitsFile* table =NULL; switch (which) { case Base::ALLOC: table = new FitsMosaicNextAlloc(img->fitsFile(), FitsFile::NOFLUSH); break; case Base::ALLOCGZ: table = new FitsMosaicNextAllocGZ(img->fitsFile(), FitsFile::NOFLUSH); break; case Base::CHANNEL: table = new FitsMosaicNextChannel(img->fitsFile(), FitsFile::NOFLUSH); break; case Base::MMAP: table = new FitsMosaicNextMMap(img->fitsFile()); break; case Base::MMAPINCR: table = new FitsMosaicNextMMapIncr(img->fitsFile()); break; case Base::SHARE: table = new FitsMosaicNextShare(img->fitsFile()); break; case Base::SOCKET: table = new FitsMosaicNextSocket(img->fitsFile(), FitsFile::FLUSH); break; case Base::SOCKETGZ: table = new FitsMosaicNextSocketGZ(img->fitsFile(), FitsFile::FLUSH); break; case Base::VAR: table = new FitsMosaicNextVar(img->fitsFile()); break; default: // na break; } if (!table || !table->isValid() || !table->isAsciiTable()) { if (table) delete table; unload(); return 0; } // read WCS from table { FitsHead* th = table->head(); if (th->naxes() != 2) { if (table) delete table; unload(); return 0; } FitsTableHDU* thdu = (FitsTableHDU*)th->hdu(); FitsColumn* crval1 = thdu->find("CRVAL1"); FitsColumn* crval2 = thdu->find("CRVAL2"); FitsColumn* crpix1 = thdu->find("CRPIX1"); FitsColumn* crpix2 = thdu->find("CRPIX2"); FitsColumn* cd1_1 = thdu->find("CD1_1"); FitsColumn* cd1_2 = thdu->find("CD1_2"); FitsColumn* cd2_1 = thdu->find("CD2_1"); FitsColumn* cd2_2 = thdu->find("CD2_2"); FitsColumn* ctype1 = thdu->find("CTYPE1"); FitsColumn* ctype2 = thdu->find("CTYPE2"); char* tptr = (char*)table->data(); int rows = thdu->rows(); int rowlen = thdu->width(); if (rows != 4) { unload(); return 0; } FitsImage* ptr = bfits_; // reset count for processKeyWords() mosaicCount_ =0; for (int ii=0; iicancelDetach(); if (manageAxes_) { delete [] naxis_; deleteFits(fits); manageAxes_ =0; } fits = bfits_; naxis_ = baxis_; if (axesOrder_ != 123) reorderAxes(); for (int ii=0; iiprocessKeywordsFitsSection(); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } analysis(); return 1; } void Context::loadFinishMask() { FitsMask* msk = mask.tail(); if (msk) { FitsImage* mskimg = msk->mask(); mskimg->block(); } } void Context::loadFinishMosaic(FitsImage* ptr) { while (ptr && ptr->nextMosaic()) { int jj=0; FitsImage* sptr = ptr; while (sptr) { if (sptr->nextMosaic() == NULL) { // ok, let's figure out next inline FitsImage* mptr = ptr->nextMosaic(); for (int nn=0; nnnextSlice(); sptr->setNextMosaic(mptr); } jj++; sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } int Context::loadFinishMosaicMask() { FitsMask* msk = mask.tail(); if (msk) loadFinishMosaic(msk->mask()); return blockMask(); } int Context::loadSlice(Base::MemType which, const char* fn, FitsImage* img) { if (!img || !img->isValid()) { if (img) delete img; return 0; } if (bfits_) { FitsImage* ptr = bfits_; while (ptr && ptr->nextSlice()) ptr = ptr->nextSlice(); ptr->setNextSlice(img); baxis_[2]++; } else { bfits_ = img; loadInit(1, Base::NOMOSAIC,Coord::WCS); } // finish up img->close(); // fix z params (in data coords) // must wait untill all loaded iparams.set(0,baxis_[2]); cparams.set(0,baxis_[2]); loadFinish(); return 1; } int Context::naxes() { for (int ii=FTY_MAXAXES-1; ii>=2; ii--) { if (naxis_[ii]>1) return ii+1; } return 2; } int Context::nhdu() { int dd =1; for (int ii=2; ii1) dd *= naxis_[ii]; return dd; } int Context::processMosaicKeywords(FitsImage* ptr) { while (ptr) { FitsImage* sptr = ptr; while (sptr) { switch (mosaicType) { case Base::IRAF: if (!sptr->processKeywordsIRAF(fits)) return 0; break; case Base::WCSMOSAIC: { if (!sptr->hasWCS(mosaicSystem)) return 0; Matrix mm = parent_->calcAlignWCS(fits, sptr, mosaicSystem, mosaicSystem, Coord::FK5); sptr->setwcsToRef(mm); } break; default: // na break; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } return 1; } void* reorder132(void* tt) { t_reorder_arg* targ = (t_reorder_arg*)tt; char* dest = targ->dest; char** sjv = targ->sjv; int ww = targ->ww; // int hh = targ->hh; int dd = targ->dd; int bz = targ->bz; int jj = targ->mm; for (int kk=0; kkdest; char** sjv = targ->sjv; int ww = targ->ww; int hh = targ->hh; // int dd = targ->dd; int bz = targ->bz; int kk = targ->mm; for (int ii=0; iidest; char** sjv = targ->sjv; int ww = targ->ww; int hh = targ->hh; int dd = targ->dd; int bz = targ->bz; int ii = targ->mm; for (int kk=0; kkdest; char** sjv = targ->sjv; int ww = targ->ww; // int hh = targ->hh; int dd = targ->dd; int bz = targ->bz; int jj = targ->mm; for (int ii=0; iidest; char** sjv = targ->sjv; int ww = targ->ww; int hh = targ->hh; int dd = targ->dd; int bz = targ->bz; int ii = targ->mm; for (int jj=0; jjnthreads_) { for (int pp=0; pp<*cnt; pp++) { if (pthread_join(thread_[pp], NULL)) internalError("Unable to Join Thread"); } *cnt =0; } } } void Context::reorderAxis(char* data, char** sjv, int ww, int hh, int dd, size_t bz) { if (thread_) delete [] thread_; thread_ = new pthread_t[parent_->nthreads_]; t_reorder_arg* targ = new t_reorder_arg[parent_->nthreads_]; for (int ii=0; iinthreads_; ii++) { targ[ii].sjv = sjv; targ[ii].ww = ww; targ[ii].hh = hh; targ[ii].dd = dd; targ[ii].bz = bz; } int cnt =0; switch (axesOrder_) { case 123: return; case 132: naxis_[0] =ww; naxis_[1] =dd; naxis_[2] =hh; reorderThread(targ, data, reorder132, &cnt); break; case 213: naxis_[0] =hh; naxis_[1] =ww; naxis_[2] =dd; reorderThread(targ, data, reorder213, &cnt); break; case 231: naxis_[0] =hh; naxis_[1] =dd; naxis_[2] =ww; reorderThread(targ, data, reorder231, &cnt); break; case 312: naxis_[0] =dd; naxis_[1] =ww; naxis_[2] =hh; reorderThread(targ, data, reorder312, &cnt); break; case 321: naxis_[0] =dd; naxis_[1] =hh; naxis_[2] =ww; reorderThread(targ, data, reorder321, &cnt); break; } for (int pp=0; ppbaseFile()->head()->bitpix(); int bz = abs(bitpix)/8; int ww = bfits_->baseFile()->head()->naxis(0); int hh = bfits_->baseFile()->head()->naxis(1); int dd = baxis_[2]; size_t sz = (size_t)ww*hh*dd*bz; // Data char* data = new char[sz]; if (!data) return; memset(data,sz,0); naxis_ = new int[FTY_MAXAXES]; for (int ii=0; iibasedata(); if (sptr) sptr = sptr->nextSlice(); } reorderAxis(data, sjv, ww, hh, dd, bz); // Header FitsHead* hdr = new FitsHead(*(bfits_->baseFile()->head())); hdr->setInteger("NAXES", 3, ""); hdr->setInteger("NAXIS1", naxis_[0], ""); hdr->setInteger("NAXIS2", naxis_[1], ""); if (hdr->find("NAXIS3")) hdr->setInteger("NAXIS3", naxis_[2], ""); else { char* n2= hdr->find("NAXIS2"); hdr->insertInteger("NAXIS3", naxis_[2], "", n2); } for (int ii=0; iifind("CTYPE1") && hdr->find("CTYPE2")) { char* c2= hdr->find("CTYPE2"); hdr->insertString("CTYPE1", "LINEAR", "", c2); } else if (!hdr->find("CTYPE2") && hdr->find("CTYPE1")) { char* c1= hdr->find("CTYPE1"); hdr->insertString("CTYPE2", "LINEAR", "", c1); } // Load it fits = new FitsImageFitsOrder(this, parent_->interp, bfits_, hdr, data, sz, 1); FitsImage* ptr = fits; for (int ii=1; iiinterp, fits, ptr->fitsFile(), ii+1); if (next->isValid()) { ptr->setNextSlice(next); ptr = next; } else { delete next; break; } } // fix z params (in data coords) iparams.set(0,naxis_[2]); cparams.set(0,naxis_[2]); manageAxes_ =1; } void Context::reorderWCSi(FitsHead* hdr, char* kk, int ii, char ww) { char key[8]; strcpy(key,kk); key[ii+1] = ww; key[ii] = '1'; char* c1 = hdr->find(key); key[ii] = '2'; char* c2 = hdr->find(key); key[ii] = '3'; char* c3 = hdr->find(key); switch (axesOrder_) { case 123: return; case 132: { if (c1) { key[ii] = '1'; FitsCard(c1).setKey(key); } if (c2) { key[ii] = '3'; FitsCard(c2).setKey(key); } if (c3) { key[ii] = '2'; FitsCard(c3).setKey(key); } } break; case 213: { if (c1) { key[ii] = '2'; FitsCard(c1).setKey(key); } if (c2) { key[ii] = '1'; FitsCard(c2).setKey(key); } if (c3) { key[ii] = '3'; FitsCard(c3).setKey(key); } } break; case 231: { if (c1) { key[ii] = '3'; FitsCard(c1).setKey(key); } if (c2) { key[ii] = '1'; FitsCard(c2).setKey(key); } if (c3) { key[ii] = '2'; FitsCard(c3).setKey(key); } } break; case 312: { if (c1) { key[ii] = '2'; FitsCard(c1).setKey(key); } if (c2) { key[ii] = '3'; FitsCard(c2).setKey(key); } if (c3) { key[ii] = '1'; FitsCard(c3).setKey(key); } } break; case 321: { if (c1) { key[ii] = '3'; FitsCard(c1).setKey(key); } if (c2) { key[ii] = '2'; FitsCard(c2).setKey(key); } if (c3) { key[ii] = '1'; FitsCard(c3).setKey(key); } } break; } } void Context::reorderWCSij(FitsHead* hdr, char* kk, int ii, char ww) { char key[8]; strcpy(key,kk); key[ii+3] = ww; key[ii] = '1'; key[ii+2] = '1'; char* c11 = hdr->find(key); key[ii+2] = '2'; char* c12 = hdr->find(key); key[ii+2] = '3'; char* c13 = hdr->find(key); key[ii] = '2'; key[ii+2] = '1'; char* c21 = hdr->find(key); key[ii+2] = '2'; char* c22 = hdr->find(key); key[ii+2] = '3'; char* c23 = hdr->find(key); key[ii] = '3'; key[ii+2] = '1'; char* c31 = hdr->find(key); key[ii+2] = '2'; char* c32 = hdr->find(key); key[ii+2] = '3'; char* c33 = hdr->find(key); switch (axesOrder_) { case 123: return; case 132: { if (c11) { key[ii] = '1'; key[ii+2] = '1'; FitsCard(c11).setKey(key); } if (c12) { key[ii] = '1'; key[ii+2] = '3'; FitsCard(c12).setKey(key); } if (c13) { key[ii] = '1'; key[ii+2] = '2'; FitsCard(c13).setKey(key); } if (c21) { key[ii] = '3'; key[ii+2] = '1'; FitsCard(c21).setKey(key); } if (c22) { key[ii] = '3'; key[ii+2] = '3'; FitsCard(c22).setKey(key); } if (c23) { key[ii] = '3'; key[ii+2] = '2'; FitsCard(c23).setKey(key); } if (c31) { key[ii] = '2'; key[ii+2] = '1'; FitsCard(c31).setKey(key); } if (c32) { key[ii] = '2'; key[ii+2] = '3'; FitsCard(c32).setKey(key); } if (c33) { key[ii] = '2'; key[ii+2] = '2'; FitsCard(c33).setKey(key); } } break; case 213: { if (c11) { key[ii] = '2'; key[ii+2] = '2'; FitsCard(c11).setKey(key); } if (c12) { key[ii] = '2'; key[ii+2] = '1'; FitsCard(c12).setKey(key); } if (c13) { key[ii] = '2'; key[ii+2] = '3'; FitsCard(c13).setKey(key); } if (c21) { key[ii] = '1'; key[ii+2] = '2'; FitsCard(c21).setKey(key); } if (c22) { key[ii] = '1'; key[ii+2] = '1'; FitsCard(c22).setKey(key); } if (c23) { key[ii] = '1'; key[ii+2] = '3'; FitsCard(c23).setKey(key); } if (c31) { key[ii] = '3'; key[ii+2] = '2'; FitsCard(c31).setKey(key); } if (c32) { key[ii] = '3'; key[ii+2] = '1'; FitsCard(c32).setKey(key); } if (c33) { key[ii] = '3'; key[ii+2] = '3'; FitsCard(c33).setKey(key); } } break; case 231: { if (c11) { key[ii] = '3'; key[ii+2] = '3'; FitsCard(c11).setKey(key); } if (c12) { key[ii] = '3'; key[ii+2] = '1'; FitsCard(c12).setKey(key); } if (c13) { key[ii] = '3'; key[ii+2] = '2'; FitsCard(c13).setKey(key); } if (c21) { key[ii] = '1'; key[ii+2] = '3'; FitsCard(c21).setKey(key); } if (c22) { key[ii] = '1'; key[ii+2] = '1'; FitsCard(c22).setKey(key); } if (c23) { key[ii] = '1'; key[ii+2] = '2'; FitsCard(c23).setKey(key); } if (c31) { key[ii] = '2'; key[ii+2] = '3'; FitsCard(c31).setKey(key); } if (c32) { key[ii] = '2'; key[ii+2] = '1'; FitsCard(c32).setKey(key); } if (c33) { key[ii] = '2'; key[ii+2] = '2'; FitsCard(c33).setKey(key); } } break; case 312: { if (c11) { key[ii] = '2'; key[ii+2] = '2'; FitsCard(c11).setKey(key); } if (c12) { key[ii] = '2'; key[ii+2] = '3'; FitsCard(c12).setKey(key); } if (c13) { key[ii] = '2'; key[ii+2] = '1'; FitsCard(c13).setKey(key); } if (c21) { key[ii] = '3'; key[ii+2] = '2'; FitsCard(c21).setKey(key); } if (c22) { key[ii] = '3'; key[ii+2] = '3'; FitsCard(c22).setKey(key); } if (c23) { key[ii] = '3'; key[ii+2] = '1'; FitsCard(c23).setKey(key); } if (c31) { key[ii] = '1'; key[ii+2] = '2'; FitsCard(c31).setKey(key); } if (c32) { key[ii] = '1'; key[ii+2] = '3'; FitsCard(c32).setKey(key); } if (c33) { key[ii] = '1'; key[ii+2] = '1'; FitsCard(c33).setKey(key); } } break; case 321: { if (c11) { key[ii] = '3'; key[ii+2] = '3'; FitsCard(c11).setKey(key); } if (c12) { key[ii] = '3'; key[ii+2] = '2'; FitsCard(c12).setKey(key); } if (c13) { key[ii] = '3'; key[ii+2] = '1'; FitsCard(c13).setKey(key); } if (c21) { key[ii] = '2'; key[ii+2] = '3'; FitsCard(c21).setKey(key); } if (c22) { key[ii] = '2'; key[ii+2] = '2'; FitsCard(c22).setKey(key); } if (c23) { key[ii] = '2'; key[ii+2] = '1'; FitsCard(c23).setKey(key); } if (c31) { key[ii] = '1'; key[ii+2] = '3'; FitsCard(c31).setKey(key); } if (c32) { key[ii] = '1'; key[ii+2] = '2'; FitsCard(c32).setKey(key); } if (c33) { key[ii] = '1'; key[ii+2] = '1'; FitsCard(c33).setKey(key); } } break; } hdr->buildIndex(); } void Context::setAxesOrder(int order) { switch (order) { case 123: case 132: case 213: case 231: case 312: case 321: axesOrder_ = order; break; default: axesOrder_ = 123; break; } if (bfits_) loadFinish(); } void Context::setBinFactor(const Vector& b) { Vector bb = b; binFactor_[0] *= bb[0] <= 0 ? 1 : bb[0]; binFactor_[1] *= bb[1] <= 0 ? 1 : bb[1]; } void Context::setBinToFactor(const Vector& b) { Vector bb = b; binFactor_[0] = bb[0] <= 0 ? 1 : bb[0]; binFactor_[1] = bb[1] <= 0 ? 1 : bb[1]; } Vector Context::setBlockFactor(const Vector& b) { Vector bb = b; Vector old = blockFactor_; blockFactor_[0] *= bb[0] <= 0 ? 1 : bb[0]; blockFactor_[1] *= bb[1] <= 0 ? 1 : bb[1]; return Vector(old[0]/blockFactor_[0],old[1]/blockFactor_[1]); } Vector Context::setBlockToFactor(const Vector& b) { Vector bb = b; Vector old = blockFactor_; blockFactor_[0] = bb[0] <= 0 ? 1 : bb[0]; blockFactor_[1] = bb[1] <= 0 ? 1 : bb[1]; return Vector(old[0]/blockFactor_[0],old[1]/blockFactor_[1]); } void Context::setCrop3dParams() { // params is a BBOX in DATA coords 0-n cparams = iparams; } void Context::setCrop3dParams(double z0, double z1) { // params is a BBOX in DATA coords 0-n double zmin = z0; double zmax = z1; // always have at least 1 if (zmin+1>zmax) zmax = z0+1; // round to int cparams.set(int(zmin+.5), int(zmax+.5)); } void Context::setCrop3dParams(int z0, int z1) { // params is a BBOX in DATA coords 0-n if (z0z1) z1=z0+1; } if (z1>iparams.zmax) { z1=iparams.zmax; if (z0+1>z1) z0=z1-1; } cparams.set(z0,z1); } void Context::setContour(FVContour* cc) { if (contour) delete contour; contour = cc; } void Context::unload() { if (DebugPerf) cerr << "Context::unload()" << endl; deleteFits(bfits_); if (manageAxes_) { delete [] naxis_; deleteFits(fits); manageAxes_ =0; } bfits_ =NULL; fits =NULL; cfits =NULL; loadInit(0, Base::NOMOSAIC, Coord::WCS); mask.deleteAll(); if (contour) delete contour; contour = NULL; auxcontours.deleteAll(); frScale.resetScanMode(); updateClip(); } void Context::updateClip() { if (DebugPerf) cerr << "Context::updateClip()" << endl; frScale.clearHistogram(); frScale.clearHistequ(); updateClip(&frScale); } void Context::updateClip(FrScale* fr) { if (DebugPerf) cerr << "Context::updateClip(FrScale*)" << endl; // no fits if (!fits) { if (fr->clipMode() != FrScale::USERCLIP) { fr->setLow(DEFAULTLOW); fr->setHigh(DEFAULTHIGH); } else { fr->setLow(fr->uLow()); fr->setHigh(fr->uHigh()); } return; } // find min/max fr->setMin(DBL_MAX); fr->setMax(-DBL_MAX); fr->setLow(DBL_MAX); fr->setHigh(-DBL_MAX); switch (fr->clipScope()) { case FrScale::GLOBAL: { FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateClip(fr); // find over-all min/max if (fr->min() > sptr->min()) fr->setMin(sptr->min()); if (fr->max() < sptr->max()) fr->setMax(sptr->max()); // find low/high if (fr->low() > sptr->low()) fr->setLow(sptr->low()); if (fr->high() < sptr->high()) fr->setHigh(sptr->high()); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } // sanity check if (fr->min() == DBL_MAX && fr->max() == -DBL_MAX) { fr->setMin(NAN); fr->setMax(NAN); } if (fr->low() == DBL_MAX && fr->high() == -DBL_MAX) { fr->setLow(NAN); fr->setHigh(NAN); } ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->setClip(fr->low(), fr->high()); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } break; case FrScale::LOCAL: { FitsImage* ptr = cfits; while (ptr) { ptr->updateClip(fr); // find over-all min/max if (fr->min() > ptr->min()) fr->setMin(ptr->min()); if (fr->max() < ptr->max()) fr->setMax(ptr->max()); // find low/high if (fr->low() > ptr->low()) fr->setLow(ptr->low()); if (fr->high() < ptr->high()) fr->setHigh(ptr->high()); ptr = ptr->nextMosaic(); } } // sanity check if (fr->min() == DBL_MAX && fr->max() == -DBL_MAX) { fr->setMin(NAN); fr->setMax(NAN); } if (fr->low() == DBL_MAX && fr->high() == -DBL_MAX) { fr->setLow(NAN); fr->setHigh(NAN); } break; } if (DebugPerf) cerr << *fr << endl; } void Context::updateContours() { if (contour) contour->update(cfits); } void Context::updateContoursScale() { if (contour) { InverseScale* scale =NULL; int numlevel = contour->numLevel(); Vector limits(frScale.low(),frScale.high()); FrScale::ColorScaleType colorScaleType = (FrScale::ColorScaleType)contour->colorScaleType(); float expo = frScale.expo(); switch (colorScaleType) { case FrScale::LINEARSCALE: scale = new LinearInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::LOGSCALE: scale = new LogInverseScale(numlevel, limits[0], limits[1], expo); break; case FrScale::POWSCALE: scale = new PowInverseScale(numlevel, limits[0], limits[1], expo); break; case FrScale::SQRTSCALE: scale = new SqrtInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::SQUAREDSCALE: scale = new SquaredInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::ASINHSCALE: scale = new AsinhInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::SINHSCALE: scale = new SinhInverseScale(numlevel, limits[0], limits[1]); break; case FrScale::HISTEQUSCALE: scale = new HistEquInverseScale(numlevel, limits[0], limits[1], histequ(), HISTEQUSIZE); break; case FrScale::IISSCALE: scale = new IISInverseScale(numlevel, limits[0], limits[1], fits->iisz()); break; } ostringstream str; str << *scale << ends; contour->setLevel(str.str().c_str()); contour->setLimits(limits); contour->update(cfits,scale); } } void Context::updateContours(const Matrix& mx) { if (contour) contour->updateCoords(mx); Contour* ptr=auxcontours.head(); while (ptr) { ptr->updateCoords(mx); ptr=ptr->next(); } } void Context::updateSlice(int id, int ss) { // ranges 1-n if (!fits) return; // check bounds if (ss<1) ss = 1; else if (ss>naxis_[id]) ss = naxis_[id]; slice_[id] = ss; int cnt =slice_[2]; for (int jj=3; jjnextSlice(); } saods9/tksao1.0/frame/context.h000644 000765 000000 00000011601 12630356227 016660 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __context_h__ #define __context_h__ #ifndef __WIN32 #include #endif #include "base.h" #include "coord.h" #include "frscale.h" #include "list.h" #include "fitsmask.h" #include "fitsimage.h" #include "head.h" class FVContour; class FitsZBound { public: int zmin; int zmax; public: FitsZBound() {zmin= zmax=0;} FitsZBound(int z0, int z1) {zmin=z0; zmax=z1;} FitsZBound(const FitsZBound &bb) {zmin=bb.zmin; zmax=bb.zmax;} void set(int z0, int z1) {zmin=z0; zmax=z1;} }; ostream& operator<<(ostream&, const FitsZBound&); class Context { public: enum SmoothFunction {BOXCAR, TOPHAT, GAUSSIAN}; FitsImage* bfits_; FitsImage* fits; FitsImage* cfits; List mask; FVContour* contour; List auxcontours; FrScale frScale; private: Base* parent_; int shareWCS_; int manageAxes_; int axesOrder_; int baxis_[FTY_MAXAXES]; // the first two are ignored int* naxis_; // the first two are ignored int slice_[FTY_MAXAXES]; // the first two are ignored int mosaicCount_; Base::MosaicType mosaicType; Coord::CoordSystem mosaicSystem; FitsHist::Function binFunction_; Vector binFactor_; int binBufferSize_; int binDepth_; Vector blockFactor_; int doSmooth_; SmoothFunction smoothFunction_; int smoothRadius_; void reorderAxis(char*, char**, int, int, int, size_t); #ifndef __WIN32 void reorderThread(void*, char*, void* (void*), int*); #endif FitsZBound iparams; // image bbox FitsZBound cparams; // crop bbox private: void binFinish(); int blockMask(); int nhdu(); void loadFinishMask(); void loadFinishMosaic(FitsImage*); int loadFinishMosaicMask(); int processMosaicKeywords(FitsImage*); void updateClip(FrScale*); protected: #ifndef __WIN32 pthread_t* thread_; #endif public: Context(); ~Context(); int shareWCS() {return shareWCS_;} void analysis(); int axesOrder() {return axesOrder_;} Matrix bin(const Vector&); Matrix binCenter(); Matrix binCursor(); int block(); void bltHist(char*, char*, int); int calcSlice(); void clearContour(); void contourAuxHead() {auxcontours.head();} void contourAuxNext() {auxcontours.next();} void deleteFits(FitsImage*); int fitsCount(); Vector getClip(FrScale::ClipMode, float); Vector getClip(); FitsZBound* getDataParams(FrScale::ScanMode); // return bbox in IMAGE Vector getMinMax(); int hasContour() {return contour ? 1 : 0;} int hasContourAux() {return auxcontours.current() ? 1 : 0;} double* histequ() {return frScale.histequ(fits);} Coord::Orientation IRAFOrientation(Coord::Orientation oo) {return parent_->IRAFOrientation(oo);} int isMosaic() {return mosaicCount_>1 ? 1 : 0;} int isCube() {return nhdu()>1 ? 1 : 0;} int load(Base::MemType, const char*, FitsImage*, Base::LayerType); int loadExtCube(Base::MemType, const char*, FitsImage*); int loadSlice(Base::MemType, const char*, FitsImage*); int loadMosaic(Base::MemType, const char*, FitsImage*, Base::LayerType, Base::MosaicType, Coord::CoordSystem); int loadMosaicImage(Base::MemType, const char*, FitsImage*, Base::LayerType, Base::MosaicType, Coord::CoordSystem); int loadMosaicWFPC2(Base::MemType, const char*, FitsImage*); void loadInit(int, Base::MosaicType, Coord::CoordSystem); int loadFinish(); int naxis(int ii) {return naxis_[ii];} int naxes(); void parent(Base* pp) {parent_ = pp;} void reorderAxes(); void reorderWCSi(FitsHead*, char*, int, char); void reorderWCSij(FitsHead*, char*, int, char); void setContour(FVContour*); int slice(int ii) {return slice_[ii];} void setAxesOrder(int); void setBinFunction(FitsHist::Function f) {binFunction_ = f;} void setBinFactor(const Vector&); void setBinToFactor(const Vector&); void setBinBufferSize(int s) {binBufferSize_ = s;} void setBinDepth(int d) {binDepth_ = d < 1 ? 1 : d;} FitsHist::Function binFunction() {return binFunction_;} Vector binFactor() {return binFactor_;} int binBufferSize() {return binBufferSize_;} int binDepth() {return binDepth_;} Vector setBlockFactor(const Vector&); Vector setBlockToFactor(const Vector&); const Vector& blockFactor() {return blockFactor_;} void setCrop3dParams(); void setCrop3dParams(int,int); void setCrop3dParams(double, double); void setSmooth(int ss) {doSmooth_ =ss;} void setSmooth(int ss, SmoothFunction ff, int rr) {doSmooth_=ss; smoothFunction_=ff; smoothRadius_=rr;} int hasSmooth() {return doSmooth_;} SmoothFunction smoothFunction() {return smoothFunction_;} int smoothRadius() {return smoothRadius_;} void unload(); void updateBinFileNames(); void updateClip(); void updateContours(); void updateContours(const Matrix&); void updateContoursScale(); void updateSlice(int, int); }; #endif saods9/tksao1.0/frame/contour.C000644 000765 000000 00000012267 12544546070 016632 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "contour.h" #include "base.h" #include "context.h" Contour::Contour(Base* p, const char* c, int w, int d) : parent(p), lineWidth(w), dash(d) { colorName = dupstr(c); color = parent->getColor(colorName); previous_ = NULL; next_ = NULL; } Contour::Contour(Base* p, const char* c, int w, int d, const List& cont) : parent(p), lineWidth(w), dash(d) { contours_ = cont; colorName = dupstr(c); color = parent->getColor(colorName); previous_ = NULL; next_ = NULL; } Contour::~Contour() { if (colorName) delete [] colorName; } void Contour::render(Pixmap pmap, Coord::InternalSystem sys, int width, int height) { if (contours_.head()) { XSetForeground(parent->display, parent->contourGC, color); int ww = lineWidth>=1 ? lineWidth : 1; if (!dash) XSetLineAttributes(parent->display, parent->contourGC, ww, LineSolid, CapButt, JoinMiter); else { char dl[2]; #ifdef __WIN32 dl[0] = parent->dlist[0]/2; dl[1] = parent->dlist[1]/2; #else dl[0] = parent->dlist[0]; dl[1] = parent->dlist[1]; #endif XSetDashes(parent->display, parent->contourGC, 0, dl, 2); XSetLineAttributes(parent->display, parent->contourGC, ww, LineOnOffDash, CapButt, JoinMiter); } BBox bb = BBox(0, 0, width, height); Vector u1 = contours_.current()->vector; while (contours_.next()) { Vector u2 = contours_.current()->vector; if (u1[0] != DBL_MAX && u2[0] != DBL_MAX) { Vector v1 = parent->mapFromRef(u1,sys); Vector v2 = parent->mapFromRef(u2,sys); if (bb.isIn(v1) || bb.isIn(v2)) XDrawLine(parent->display, pmap, parent->contourGC, (int)v1[0], (int)v1[1], (int)v2[0], (int)v2[1]); } u1 = u2; } } } void Contour::ps(int mode) { if (contours_.head()) { { ostringstream str; switch ((Widget::PSColorSpace)mode) { case Widget::BW: case Widget::GRAY: psColorGray(parent->getXColor(colorName), str); str << " setgray"; break; case Widget::RGB: psColorRGB(parent->getXColor(colorName), str); str << " setrgbcolor"; break; case Widget::CMYK: psColorCMYK(parent->getXColor(colorName), str); str << " setcmykcolor"; break; } str << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } { ostringstream str; if (!dash) { str << lineWidth << " setlinewidth" << endl << "[] 0 setdash"; } else { str << lineWidth << " setlinewidth" << endl << '[' << parent->dlist[0] << ' ' << parent->dlist[1] << "] 0 setdash"; } str << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // output stroke paths do { Vector u = contours_.current()->vector; if (u[0] != DBL_MAX) { ostringstream str; Vector v = parent->mapFromRef(u,Coord::CANVAS); str << "newpath " << endl << v.TkCanvasPs(parent->canvas) << " moveto" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); while (contours_.next()) { Vector uu = contours_.current()->vector; if (uu[0] != DBL_MAX) { ostringstream str; Vector vv = parent->mapFromRef(uu,Coord::CANVAS); str << vv.TkCanvasPs(parent->canvas) << " lineto" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } else break; } Tcl_AppendResult(parent->interp, "stroke\n", NULL); } } while (contours_.next()); } } #ifdef MAC_OSX_TK void Contour::macosx() { if (contours_.head()) { // color, width, and dash macosxColor(parent->getXColor(colorName)); macosxWidth(lineWidth); if (dash) macosxDash(parent->dlist,2); else macosxDash(NULL,0); Vector u1 = contours_.current()->vector; while (contours_.next()) { Vector u2 = contours_.current()->vector; if (u1[0] != DBL_MAX && u2[0] != DBL_MAX) { Vector v1 = parent->mapFromRef(u1,Coord::CANVAS); Vector v2 = parent->mapFromRef(u2,Coord::CANVAS); macosxDrawLine(v1,v2); } u1 = u2; } } } #endif #ifdef __WIN32 void Contour::win32() { if (contours_.head()) { // color and width win32Color(parent->getXColor(colorName)); win32Width(lineWidth); if (dash) win32Dash(parent->dlist,2); else win32Dash(NULL,0); Vector u1 = contours_.current()->vector; while (contours_.next()) { Vector u2 = contours_.current()->vector; if (u1[0] != DBL_MAX && u2[0] != DBL_MAX) { Vector v1 = parent->mapFromRef(u1,Coord::CANVAS); Vector v2 = parent->mapFromRef(u2,Coord::CANVAS); win32DrawLine(v1,v2); } u1 = u2; } } } #endif void Contour::updateCoords(const Matrix& mx) { if (contours_.head()) do { Vector& v = contours_.current()->vector; if (v[0] != DBL_MAX) v *= mx; } while (contours_.next()); } void Contour::setLineWidth(int w) { lineWidth = w; } void Contour::setDash(int d) { dash = d; } void Contour::setColor(const char* clr) { if (colorName) delete [] colorName; colorName = dupstr(clr); color = parent->getColor(colorName); } saods9/tksao1.0/frame/contour.h000644 000765 000000 00000002433 12544546070 016671 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __contour_h__ #define __contour_h__ #include #include #include "vector.h" #include "vector3d.h" #include "list.h" #include "coord.h" class FitsImage; class Base; class Contour { protected: Base* parent; List contours_; char* colorName; unsigned long color; int lineWidth; int dash; Contour* previous_; Contour* next_; public: Contour(Base*, const char*, int, int); Contour(Base*, const char*, int, int, const List&); virtual ~Contour(); void render(Pixmap, Coord::InternalSystem, int, int); void ps(int); #ifdef MAC_OSX_TK void macosx(); #endif #ifdef __WIN32 void win32(); #endif const List& contours() {return contours_;} void updateCoords(const Matrix&); const char* getColorName() {return colorName;} void setColor(const char*); int getDash() {return dash;} void setDash(int); void setLineWidth(int); int getLineWidth() {return lineWidth;} Contour* previous() {return previous_;} void setPrevious(Contour* m) {previous_ = m;} Contour* next() {return next_;} void setNext(Contour* m) {next_ = m;} }; #endif saods9/tksao1.0/frame/coord.C000644 000765 000000 00000016500 12536642246 016244 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "coord.h" #include "util.h" Coord coord; static const char* coordSystemStr_[] = { "data", "image", "physical", "amplifier", "detector", "wcs", "wcsa", "wcsb", "wcsc", "wcsd", "wcse", "wcsf", "wcsg", "wcsh", "wcsi", "wcsj", "wcsk", "wcsl", "wcsm", "wcsn", "wcso", "wcsp", "wcsq", "wcsr", "wcss", "wcst", "wcsu", "wcsv", "wcsw", "wcsx", "wcsy", "wcsz", "wcs0" }; static const char* skyFrameStr_[] = { "fk4", "fk4-no-e", "fk5", "icrs", "galactic", "supergalactic", "ecliptic", "helioecliptic", "gappt" }; static const char* skyFormatStr_[] = { "degrees", "sexagesimal", }; static const char* skyDistStr_[] = { "degrees", "arcmin", "arcsec" }; const char* Coord::coordSystemStr(int ii) { return coordSystemStr_[ii]; } const char* Coord::skyFrameStr(int ii) { return skyFrameStr_[ii]; } const char* Coord::skyFormatStr(int ii) { return skyFormatStr_[ii]; } const char* Coord::skyDistStr(int ii) { return skyDistStr_[ii]; } void Coord::listCoordSystem(ostream& str, CoordSystem sys, SkyFrame sky, int wcs, int wcsequ) { switch (sys) { case IMAGE: str << "image"; return; case PHYSICAL: str << "physical"; return; case DETECTOR: str << "detector"; return; case AMPLIFIER: str << "amplifier"; return; default: { if (wcs) { if (sys == WCS0) str << "wcs0" << ';'; else if (sys == WCS && !wcsequ) str << "wcs" << ';'; else if (sys > WCS && !wcsequ) str << "wcs" << (char)(sys-WCS+'`') << ';'; } if (wcsequ) { switch (sky) { case FK4: str << "fk4"; return; case FK4_NO_E: str << "fk4-no-e"; return; case FK5: str << "fk5"; return; case ICRS: str << "icrs"; return; case GALACTIC: str << "galactic"; return; case SUPERGALACTIC: str << "supergalactic"; return; case ECLIPTIC: str << "ecliptic"; return; case HELIOECLIPTIC: str << "helioecliptic"; return; } } } } } void Coord::listDistSystem(ostream& str, CoordSystem sys, SkyDist format, int wcsequ) { switch (sys) { case IMAGE: str << "image"; return; case PHYSICAL: str << "physical"; return; case DETECTOR: str << "detector"; return; case AMPLIFIER: str << "amplifier"; return; default: if (wcsequ) switch (format) { case DEGREE: str << "degrees"; return; case ARCMIN: str << "arcmin"; return; case ARCSEC: str << "arcsec"; return; } else { str << "pixels"; return; } } } void Coord::listProsCoordSystem(ostream& str, CoordSystem sys, SkyFrame sky) { switch (sys) { case IMAGE: str << "logical"; return; case PHYSICAL: str << "physical"; return; case DETECTOR: str << "detector"; return; case AMPLIFIER: str << "amplifier"; return; default: switch (sky) { case FK4: str << "b1950"; return; case FK4_NO_E: str << "fk4-no-e"; return; case FK5: str << "j2000"; return; case ICRS: str << "icrs"; return; case GALACTIC: str << "galactic"; return; case SUPERGALACTIC: str << "supergalactic"; return; case ECLIPTIC: str << "ecliptic"; return; case HELIOECLIPTIC: str << "helioecliptic"; return; } } } void Coord::strToCoordSystem(const char* str, CoordSystem wcssys, CoordSystem* sys, SkyFrame* sky) { if (!str) { *sys = PHYSICAL; *sky = FK5; } else if (STRCMP(str,"image",5)) { *sys = IMAGE; *sky = FK5; } else if (STRCMP(str,"physical",8)) { *sys = PHYSICAL; *sky = FK5; } else if (STRCMP(str,"amplifier",9)) { *sys = AMPLIFIER; *sky = FK5; } else if (STRCMP(str,"detector",9)) { *sys = DETECTOR; *sky = FK5; } else if (STRCMP(str,"fk4-no-e",8)) { *sys = wcssys; *sky = FK4_NO_E; } else if (STRCMP(str,"fk4",3)) { *sys = wcssys; *sky = FK4; } else if (STRCMP(str,"fk5",3)) { *sys = wcssys; *sky = FK5; } else if (STRCMP(str,"icrs",4)) { *sys = wcssys; *sky = ICRS; } else if (STRCMP(str,"galactic",8)) { *sys = wcssys; *sky = GALACTIC; } else if (STRCMP(str,"supergalactic",12)) { *sys = wcssys; *sky = SUPERGALACTIC; } else if (STRCMP(str,"ecliptic",8)) { *sys = wcssys; *sky = ECLIPTIC; } else if (STRCMP(str,"helioecliptic",12)) { *sys = wcssys; *sky = HELIOECLIPTIC; } else if (STRCMP(str,"wcs",3)) { *sys = wcssys; *sky = FK5; } else if (STRCMP(str,"linear",6)) { *sys = wcssys; *sky = FK5; } else { *sys = PHYSICAL; *sky = FK5; } } void Coord::strToSkyFormat(const char* str, SkyFormat* format) { if (!str) *format = DEGREES; else if (STRCMP(str,"degrees",7)) *format = DEGREES; else if (STRCMP(str,"degree",6)) *format = DEGREES; else if (STRCMP(str,"deg",3)) *format = DEGREES; else if (STRCMP(str,"hms",3)) *format = SEXAGESIMAL; else if (STRCMP(str,"h:m:s",5)) *format = SEXAGESIMAL; else if (STRCMP(str,"\"h:m:s\"",7)) *format = SEXAGESIMAL; else if (STRCMP(str,"dms",3)) *format = SEXAGESIMAL; else if (STRCMP(str,"d:m:s",5)) *format = SEXAGESIMAL; else if (STRCMP(str,"\"d:m:s\"",7)) *format = SEXAGESIMAL; else *format = DEGREES; } void Coord::strToSkyDist(const char* str, SkyDist* dist) { if (!str) *dist = DEGREE; else if (STRCMP(str,"degrees",7)) *dist = DEGREE; else if (STRCMP(str,"degree",6)) *dist = DEGREE; else if (STRCMP(str,"deg",3)) *dist = DEGREE; else if (STRCMP(str,"arcminute",9)) *dist = ARCMIN; else if (STRCMP(str,"arcmin",6)) *dist = ARCMIN; else if (STRCMP(str,"arcsecond",9)) *dist = ARCSEC; else if (STRCMP(str,"arcsec",6)) *dist = ARCSEC; else *dist = DEGREE; } void Coord::strToAngleFormat(const char* str, AngleFormat* format) { if (!str) *format = DEG; else if (STRCMP(str,"degrees",7)) *format = DEG; else if (STRCMP(str,"degree",6)) *format = DEG; else if (STRCMP(str,"deg",3)) *format = DEG; else if (STRCMP(str,"radian",6)) *format = RAD; else if (STRCMP(str,"rad",3)) *format = RAD; else *format = DEG; } void Coord::strToDistSystem(const char* str, CoordSystem wcssys, CoordSystem* sys, SkyDist* dist) { if (!str) { *sys = PHYSICAL; *dist = DEGREE; } else if (STRCMP(str,"image",5)) { *sys = IMAGE; *dist = DEGREE; } else if (STRCMP(str,"physical",8)) { *sys = PHYSICAL; *dist = DEGREE; } else if (STRCMP(str,"amplifier",9)) { *sys = AMPLIFIER; *dist = DEGREE; } else if (STRCMP(str,"detector",8)) { *sys = DETECTOR; *dist = DEGREE; } else if (STRCMP(str,"degrees",7)) { *sys = wcssys; *dist = DEGREE; } else if (STRCMP(str,"arcmin",6)) { *sys = wcssys; *dist = ARCMIN; } else if (STRCMP(str,"arcsec",6)) { *sys = wcssys; *dist = ARCSEC; } else if (STRCMP(str,"pixels",6)) { *sys = PHYSICAL; *dist = DEGREE; } else { *sys = PHYSICAL; *dist = DEGREE; } } saods9/tksao1.0/frame/coord.h000644 000765 000000 00000003101 12536641574 016305 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __coord_h__ #define __coord_h__ #include #include #include #include using namespace std; class Coord { public: enum InternalSystem {WINDOW, CANVAS, WIDGET, USER, REF, PANNER, MAGNIFIER, PS}; enum CoordSystem {DATA, IMAGE, PHYSICAL, AMPLIFIER, DETECTOR, WCS, WCSA, WCSB, WCSC, WCSD, WCSE, WCSF, WCSG, WCSH, WCSI, WCSJ, WCSK, WCSL, WCSM, WCSN, WCSO, WCSP, WCSQ, WCSR, WCSS, WCST, WCSU, WCSV, WCSW, WCSX, WCSY, WCSZ, WCS0}; enum SkyFrame {FK4, FK4_NO_E, FK5, ICRS, GALACTIC, SUPERGALACTIC, ECLIPTIC, HELIOECLIPTIC}; enum SkyFormat {DEGREES, SEXAGESIMAL}; enum SkyDist {DEGREE, ARCMIN, ARCSEC}; enum AngleFormat {DEG, RAD}; enum Orientation {NORMAL, XX, YY, XY}; public: void listCoordSystem(ostream&, CoordSystem, SkyFrame, int, int); void listDistSystem(ostream&, CoordSystem, SkyDist, int); void listProsCoordSystem(ostream&, CoordSystem, SkyFrame); void strToCoordSystem(const char*, CoordSystem, CoordSystem*, SkyFrame*); void strToSkyFormat(const char*, SkyFormat*); void strToSkyDist(const char*, SkyDist*); void strToDistSystem(const char*, CoordSystem, CoordSystem*, SkyDist*); void strToAngleFormat(const char*, AngleFormat*); const char* coordSystemStr(int ii); const char* skyFrameStr(int ii); const char* skyFormatStr(int ii); const char* skyDistStr(int ii); }; extern Coord coord; #endif saods9/tksao1.0/frame/cpanda.C000644 000765 000000 00000054214 12544546070 016365 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "cpanda.h" #include "fitsimage.h" Cpanda::Cpanda(const Cpanda& a) : BasePanda(a), BaseEllipse(a) {} Cpanda::Cpanda(Base* p, const Vector& ctr, double a1, double a2, int an, double r1, double r2, int rn, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BasePanda(a1, a2, an), BaseEllipse(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn+1; annuli_ = new Vector[numAnnuli_]; for (int ii=0; ii& tg, const List& cb) : BasePanda(an, a), BaseEllipse(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn; annuli_ = new Vector[numAnnuli_]; for (int ii=0; iigetColor("red")); else if (ii == numAngles_-1) XSetForeground(display, gc, parent->getColor("blue")); else XSetForeground(display, gc, color); } else XSetForeground(display, gc, color); } XDrawLine(display, drawable, lgc, rr0[0], rr0[1], rr1[0], rr1[1]); } } void Cpanda::renderPS(int mode) { BaseEllipse::renderPS(mode); Vector r0 = annuli_[0]; Vector r1 = annuli_[numAnnuli_-1]; for (int ii=0; iicanvas) << "moveto" << rr1.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } #ifdef MAC_OSX_TK void Cpanda::renderMACOSX() { BaseEllipse::renderMACOSX(); Vector r0 = annuli_[0]; Vector r1 = annuli_[numAnnuli_-1]; for (int ii=0; ii4) { int hh = h-4-1; if (numAnnuli_>2 && hh2 && hh<(numAnnuli_+numAngles_)) { hh -= numAnnuli_; deleteAngle(hh); } numHandle = 4 + numAnnuli_ + numAngles_; startAng_ = angles_[0]; stopAng_ = angles_[numAngles_-1]; updateBBox(); doCallBack(CallBack::EDITCB); } } int Cpanda::isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa) { Vector pp = bckMap(vv,sys); return BaseEllipse::isIn(vv,sys,nn) && BasePanda::isIn(pp,aa); } void Cpanda::analysis(AnalysisTask mm, int which) { switch (mm) { case PANDA: if (!analysisPanda_ && which) { addCallBack(CallBack::MOVECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPandaCB_[1], parent->options->cmdName); } if (analysisPanda_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisPandaCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisPandaCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPandaCB_[1]); } analysisPanda_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Cpanda::analysisPanda(Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; for (int ii=0; iimarkerAnalysisPanda(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, numAngles_-1, angles_, bb, sys); analysisXYEResult(xx, yy, ee, num); } void Cpanda::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, numAngles_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Cpanda::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { int regular = 1; if (numAngles_>2) { double delta; if (angles_[1] > angles_[0]) delta = angles_[1]-angles_[0]; else delta = angles_[1]+M_TWOPI-angles_[0]; for (int ii=2; ii angles_[ii-1]) diff = angles_[ii]-angles_[ii-1]; else diff = angles_[ii]+M_TWOPI-angles_[ii-1]; if (!teq(diff,delta,FLT_EPSILON)) { regular = 0; break; } } } if (numAnnuli_>2) { double delta = annuli_[1][0]-annuli_[0][0]; for (int i=2; ifindFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ',' << numAngles_-1 << ',' << ptr->mapLenFromRef(annuli_[0][0],sys) << ',' << ptr->mapLenFromRef(annuli_[numAnnuli_-1][0],sys) << ',' << numAnnuli_-1 << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC) << '"' << ',' << ptr->mapLenFromRef(annuli_[numAnnuli_-1][0],sys,Coord::ARCSEC)<< '"'<<',' << numAnnuli_-1 << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; str << type_ << '(' << ra << ',' << dec << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << ptr->mapLenFromRef(annuli_[0][0],sys,Coord::ARCSEC) << '"' << ',' << ptr->mapLenFromRef(annuli_[numAnnuli_-1][0],sys,Coord::ARCSEC)<< '"'<<',' << numAnnuli_-1 << ')'; } break; } } else { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << ptr->mapLenFromRef(annuli_[0][0],sys) << ',' << ptr->mapLenFromRef(annuli_[numAnnuli_-1][0],sys)<< ',' << numAnnuli_-1 << ')'; } } } listPost(str, conj, strip); } void Cpanda::listB(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1][0],sys) << ',' << ptr->mapLenFromRef(annuli_[i][0],sys) << ",1)"; if (!strip) { if (conj) str << " ||"; str << " # panda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k][0],sys) << ((khasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1][0],sys,Coord::ARCSEC) << '"' <<',' << ptr->mapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC) << '"' <<",1)"; if (!strip) { if (conj) str << " ||"; str << " # panda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k][0],sys,Coord::ARCSEC) << '"' << ((kmapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1][0],sys,Coord::ARCSEC) << '"' <<',' << ptr->mapLenFromRef(annuli_[i][0],sys,Coord::ARCSEC) << '"' <<",1)"; if (!strip) { if (conj) str << " ||"; str << " # panda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k][0],sys,Coord::ARCSEC) << '"' << ((kmapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1][0],sys) <<',' << ptr->mapLenFromRef(annuli_[i][0],sys) <<",1)"; if (!strip) { if (conj) str << " ||"; str << " # panda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k][0],sys) << ((kfindFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadiusX(ptr,sys,annuli_,numAnnuli_); XMLRowAng(sys,sky,angles_,numAngles_); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Cpanda::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); for (int i=0; imapLenFromRef(annuli_[i][0],Coord::PHYSICAL) << ',' << ptr->mapLenFromRef(annuli_[i+1][0],Coord::PHYSICAL) << ',' << ang1 << ',' << ang2 << ')'; listCiaoPost(str, strip); } } break; default: if (ptr->hasWCSCel(sys)) { char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL, buf, 64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; for (int i=0; imapLenFromRef(annuli_[i][0],sys,Coord::ARCMIN) << '\'' << ',' << ptr->mapLenFromRef(annuli_[i+1][0],sys,Coord::ARCMIN) << '\'' << ',' << ang1 << ',' << ang2 << ')'; listCiaoPost(str, strip); } } } } // special composite funtionallity void Cpanda::setComposite(const Matrix& mx, double aa) { center *= mx; updateBBox(); } saods9/tksao1.0/frame/cpanda.h000644 000765 000000 00000004231 12544546070 016424 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __cpanda_h__ #define __cpanda_h__ #include "basepanda.h" #include "baseellipse.h" class Cpanda : public BasePanda, public BaseEllipse { private: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); void listA(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listB(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); int isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa); public: Cpanda(const Cpanda&); Cpanda(Base* p, const Vector& ctr, double a1, double a2, int an, double r1, double r2, int rn, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Cpanda(Base* p, const Vector& ctr, int an, double* a, int rn, double* r, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Cpanda(*this);} void edit(const Vector&, int); void editEnd(); void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} int addAnnuli(const Vector&); int addAngles(const Vector&); void setAnglesAnnuli(double, double, int, Vector, Vector, int); void setAnglesAnnuli(const double*, int, const Vector*, int); void deleteAnglesAnnuli(int h); void analysis(AnalysisTask, int); void analysisPanda(Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listCiao(ostream&, Coord::CoordSystem, int); // special composite funtionality void setComposite(const Matrix&, double); }; #endif saods9/tksao1.0/frame/ds9lex.C000644 000765 000000 00000354337 12553253014 016351 0ustar00joyewheel000000 000000 #line 2 "frame/ds9lex.C" #line 4 "frame/ds9lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer mkFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *mkalloc (yy_size_t ); void *mkrealloc (void *,yy_size_t ); void mkfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 153 #define YY_END_OF_BUFFER 154 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[540] = { 0, 0, 0, 2, 2, 154, 152, 148, 151, 152, 152, 152, 152, 152, 152, 116, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 54, 147, 147, 147, 147, 147, 147, 147, 147, 147, 113, 114, 152, 152, 2, 1, 148, 149, 0, 144, 0, 0, 145, 0, 116, 118, 131, 127, 117, 116, 0, 147, 119, 147, 147, 125, 123, 121, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 55, 147, 57, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 150, 0, 146, 2, 0, 118, 133, 129, 117, 119, 0, 0, 125, 123, 121, 132, 128, 120, 0, 126, 124, 122, 119, 0, 147, 0, 117, 147, 147, 147, 147, 147, 147, 147, 147, 11, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 33, 147, 147, 147, 147, 37, 39, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 49, 147, 147, 56, 147, 147, 60, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 73, 147, 147, 147, 147, 147, 147, 147, 147, 84, 147, 115, 141, 134, 130, 0, 117, 0, 0, 118, 0, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 22, 147, 147, 147, 147, 147, 147, 29, 147, 147, 147, 147, 147, 0, 40, 147, 147, 147, 147, 45, 147, 147, 147, 147, 51, 53, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 74, 77, 78, 147, 147, 147, 147, 147, 111, 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, 147, 0, 0, 0, 0, 135, 0, 147, 0, 147, 147, 147, 147, 147, 7, 8, 147, 10, 147, 147, 147, 147, 17, 147, 147, 147, 21, 147, 24, 147, 147, 147, 147, 147, 147, 147, 34, 35, 36, 0, 147, 147, 147, 147, 147, 48, 147, 50, 147, 58, 147, 147, 62, 147, 147, 147, 147, 147, 68, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 112, 0, 0, 0, 136, 135, 0, 0, 139, 0, 0, 137, 147, 147, 5, 6, 147, 147, 13, 147, 15, 147, 147, 20, 147, 147, 26, 147, 147, 147, 147, 32, 0, 147, 42, 147, 147, 46, 147, 52, 147, 61, 147, 147, 147, 66, 67, 147, 69, 71, 147, 147, 147, 147, 147, 81, 79, 147, 142, 139, 137, 140, 138, 147, 4, 147, 147, 147, 147, 18, 147, 147, 25, 147, 28, 147, 30, 0, 147, 147, 147, 47, 147, 63, 147, 147, 70, 147, 147, 147, 147, 147, 80, 0, 147, 147, 147, 14, 16, 147, 23, 27, 31, 38, 41, 147, 44, 59, 147, 65, 147, 147, 147, 147, 83, 0, 3, 147, 12, 19, 147, 147, 147, 75, 147, 147, 0, 9, 147, 64, 147, 76, 82, 0, 147, 147, 0, 147, 147, 143, 43, 72, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 6, 1, 1, 1, 7, 1, 1, 1, 8, 1, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, 17, 17, 18, 19, 1, 1, 1, 1, 1, 1, 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, 1, 46, 1, 1, 1, 1, 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, 1, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[75] = { 0, 1, 1, 2, 1, 3, 1, 3, 1, 1, 3, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1 } ; static yyconst flex_int16_t yy_base[558] = { 0, 0, 0, 181, 180, 179, 4306, 176, 4306, 167, 160, 0, 156, 65, 73, 87, 102, 162, 213, 140, 273, 331, 170, 211, 388, 113, 195, 201, 233, 266, 274, 429, 166, 305, 306, 489, 364, 372, 406, 244, 426, 80, 84, 0, 4306, 155, 4306, 151, 4306, 0, 148, 4306, 456, 549, 609, 4306, 4306, 669, 729, 489, 337, 789, 507, 516, 396, 425, 433, 536, 575, 804, 532, 629, 635, 586, 648, 691, 695, 758, 708, 805, 716, 864, 766, 815, 823, 830, 857, 840, 865, 892, 899, 872, 914, 921, 929, 937, 947, 960, 954, 970, 989, 978, 997, 1005, 582, 1016, 684, 1026, 1032, 1045, 1051, 1055, 1073, 1080, 1088, 1103, 1113, 1121, 1144, 1145, 1152, 1162, 1172, 1183, 1191, 1202, 1221, 4306, 80, 4306, 0, 0, 1250, 4306, 4306, 1264, 1276, 1287, 1295, 4306, 4306, 4306, 4306, 4306, 4306, 1306, 4306, 4306, 4306, 4306, 1314, 84, 1323, 1337, 1345, 1239, 1359, 1360, 1366, 1229, 1376, 1377, 1402, 1383, 1384, 1430, 1429, 1403, 1440, 1448, 1461, 1465, 1482, 1488, 1492, 1499, 1516, 1515, 1523, 1531, 1542, 1550, 1558, 1575, 1557, 1585, 1586, 1593, 1601, 1614, 1624, 1625, 1631, 1648, 1649, 1665, 1672, 1676, 1689, 1699, 1705, 1712, 1716, 1727, 1734, 1738, 1751, 1755, 1774, 1778, 1782, 1807, 1811, 1817, 1824, 1835, 1841, 1842, 1848, 1859, 1870, 1877, 1932, 1912, 1888, 0, 4306, 4306, 1994, 2016, 2024, 1912, 2047, 2033, 2056, 2074, 2088, 2089, 2095, 2105, 2099, 2120, 2127, 2144, 2150, 2160, 2154, 2177, 2181, 2187, 2204, 2212, 2232, 2233, 2248, 2255, 2259, 2263, 2282, 1895, 2288, 2295, 2306, 2324, 2330, 84, 2341, 2349, 2356, 2360, 2376, 2377, 2383, 2394, 2404, 2405, 2412, 2420, 2430, 2436, 2447, 2446, 2453, 2463, 2476, 2483, 2489, 2506, 2510, 2514, 2525, 2521, 2532, 2549, 2557, 2568, 2576, 2583, 2593, 2601, 2594, 2609, 2625, 2626, 2632, 2633, 2643, 2650, 2654, 2658, 2665, 2669, 2673, 2680, 2684, 2688, 2695, 2699, 2703, 2710, 2714, 2718, 2725, 2729, 2733, 2740, 2744, 2748, 0, 2766, 2775, 2002, 2793, 2064, 2802, 2783, 2811, 2825, 2826, 2832, 2836, 2755, 2849, 2864, 2865, 2881, 2889, 2897, 2905, 2915, 2916, 2932, 2933, 2950, 2954, 2958, 2969, 2979, 2980, 2995, 3003, 3016, 3024, 3031, 3042, 3046, 85, 3053, 3057, 3063, 3070, 3086, 3090, 3094, 3101, 3111, 3117, 3121, 3128, 3144, 3145, 3152, 3162, 3173, 3177, 3181, 3197, 3198, 3204, 3208, 3226, 3233, 3239, 3246, 3264, 3268, 3272, 3285, 0, 3306, 3324, 3296, 3334, 3342, 3352, 3367, 3380, 3388, 3368, 3403, 3404, 3414, 3420, 3427, 3433, 3444, 3452, 3465, 3471, 3484, 3488, 3492, 3503, 3509, 3510, 3527, 3528, 3535, 3548, 144, 3556, 3555, 3571, 3575, 3582, 3593, 3597, 3603, 3614, 3620, 3621, 3627, 3638, 3642, 3649, 3657, 3664, 3665, 3672, 3685, 3689, 3695, 3711, 3721, 3722, 0, 4306, 4306, 4306, 4306, 3729, 3747, 3751, 3755, 3762, 3766, 3783, 3789, 3790, 3796, 3807, 3815, 3826, 3830, 101, 3847, 3853, 3854, 3860, 3875, 3876, 3882, 3883, 3893, 3909, 3910, 3916, 3937, 3938, 3945, 0, 3964, 3965, 3971, 3975, 3981, 3992, 3998, 4002, 4008, 4306, 4019, 4025, 4026, 4032, 4042, 4049, 4050, 4067, 4068, 4074, 4085, 0, 4089, 4104, 4105, 4112, 4123, 4131, 4138, 4142, 4146, 4162, 0, 4161, 4169, 4185, 4191, 4195, 4202, 0, 4210, 4217, 0, 4218, 4234, 4306, 4241, 4242, 4306, 4283, 4287, 144, 4291, 4293, 4297, 4301, 132, 129, 127, 126, 125, 124, 123, 104, 92, 91, 89 } ; static yyconst flex_int16_t yy_def[558] = { 0, 539, 1, 540, 540, 539, 539, 539, 539, 539, 541, 542, 543, 539, 539, 544, 544, 544, 17, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 21, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 545, 546, 539, 539, 539, 541, 539, 547, 543, 539, 539, 539, 539, 539, 539, 539, 544, 539, 544, 544, 61, 61, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 545, 539, 546, 548, 54, 539, 539, 57, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 61, 539, 61, 61, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 549, 539, 539, 539, 539, 539, 539, 539, 539, 61, 61, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 550, 539, 539, 539, 539, 539, 61, 539, 61, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 551, 539, 539, 539, 539, 539, 539, 544, 539, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 552, 539, 539, 539, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 553, 544, 544, 544, 544, 544, 544, 544, 544, 544, 539, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 554, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 555, 544, 544, 544, 544, 544, 544, 556, 544, 544, 557, 544, 544, 539, 544, 544, 0, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539 } ; static yyconst flex_int16_t yy_nxt[4381] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 6, 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, 32, 41, 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, 32, 42, 6, 52, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 536, 56, 533, 530, 57, 58, 58, 58, 58, 58, 58, 58, 58, 59, 539, 523, 539, 61, 62, 539, 127, 63, 64, 234, 366, 539, 429, 539, 539, 65, 539, 66, 500, 100, 512, 490, 455, 398, 328, 539, 225, 67, 68, 131, 61, 62, 69, 127, 63, 64, 234, 366, 539, 429, 539, 49, 65, 539, 66, 500, 474, 129, 51, 48, 45, 129, 539, 80, 67, 68, 51, 81, 48, 69, 539, 82, 539, 46, 539, 539, 539, 70, 539, 539, 539, 45, 539, 539, 539, 71, 44, 44, 539, 72, 80, 539, 539, 92, 81, 539, 539, 539, 82, 73, 74, 539, 539, 539, 93, 539, 539, 539, 539, 539, 539, 539, 71, 539, 539, 539, 72, 539, 539, 539, 92, 539, 101, 539, 539, 539, 73, 74, 60, 539, 539, 93, 102, 539, 539, 539, 75, 539, 94, 539, 60, 539, 95, 539, 76, 539, 539, 539, 539, 101, 77, 78, 539, 79, 539, 539, 539, 539, 539, 102, 539, 539, 539, 75, 539, 94, 539, 60, 539, 95, 103, 76, 539, 539, 539, 539, 539, 77, 78, 539, 79, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 103, 83, 84, 539, 539, 105, 104, 539, 539, 539, 85, 539, 86, 106, 87, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 83, 84, 539, 539, 105, 104, 539, 539, 114, 85, 539, 86, 106, 87, 539, 539, 539, 112, 115, 539, 539, 539, 539, 113, 116, 539, 539, 539, 539, 88, 539, 539, 539, 539, 539, 114, 539, 89, 539, 90, 539, 539, 539, 91, 112, 115, 539, 539, 539, 539, 113, 116, 539, 539, 539, 539, 88, 539, 539, 539, 539, 539, 539, 539, 89, 539, 90, 539, 539, 539, 91, 539, 539, 539, 123, 121, 539, 122, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 96, 539, 539, 539, 97, 539, 539, 539, 539, 539, 98, 99, 539, 123, 121, 539, 122, 539, 124, 539, 539, 539, 539, 539, 125, 539, 539, 96, 539, 539, 539, 97, 539, 539, 539, 539, 539, 98, 99, 107, 126, 539, 539, 539, 539, 124, 108, 109, 539, 60, 539, 125, 539, 110, 539, 539, 111, 132, 132, 132, 132, 132, 132, 132, 132, 539, 107, 126, 539, 539, 539, 539, 539, 108, 109, 539, 60, 539, 539, 539, 110, 539, 539, 111, 539, 539, 539, 539, 539, 539, 150, 150, 150, 150, 150, 150, 150, 150, 539, 117, 539, 539, 539, 118, 539, 152, 152, 119, 153, 153, 153, 153, 153, 153, 153, 153, 120, 154, 154, 154, 154, 154, 154, 154, 154, 539, 117, 539, 539, 539, 118, 539, 539, 539, 119, 539, 539, 539, 539, 539, 159, 539, 539, 120, 133, 539, 134, 539, 539, 135, 53, 53, 53, 53, 53, 53, 53, 53, 59, 539, 539, 155, 136, 137, 539, 539, 138, 139, 539, 539, 539, 539, 539, 539, 140, 539, 141, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 155, 136, 137, 539, 539, 138, 139, 539, 539, 539, 156, 539, 539, 140, 539, 141, 142, 539, 143, 539, 539, 539, 54, 54, 54, 54, 54, 54, 54, 54, 539, 162, 539, 539, 144, 145, 539, 156, 539, 146, 539, 539, 539, 539, 539, 539, 147, 539, 148, 539, 539, 539, 539, 160, 539, 539, 539, 539, 162, 539, 539, 144, 145, 161, 539, 539, 146, 539, 539, 539, 163, 539, 539, 147, 539, 148, 55, 539, 56, 539, 160, 539, 54, 54, 54, 54, 54, 54, 54, 54, 161, 539, 539, 539, 149, 137, 539, 163, 539, 139, 539, 539, 539, 539, 539, 539, 140, 539, 141, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 149, 137, 539, 164, 539, 139, 539, 539, 539, 168, 539, 539, 140, 165, 141, 55, 539, 56, 539, 539, 57, 58, 58, 58, 58, 58, 58, 58, 58, 59, 164, 539, 539, 61, 62, 170, 168, 63, 64, 539, 165, 539, 539, 539, 539, 65, 539, 66, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 61, 62, 170, 539, 63, 64, 539, 175, 539, 539, 166, 167, 65, 539, 66, 539, 539, 539, 539, 539, 539, 151, 151, 151, 151, 151, 151, 151, 151, 539, 539, 539, 539, 539, 175, 539, 539, 166, 167, 539, 539, 539, 539, 539, 539, 539, 539, 157, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 169, 539, 158, 539, 539, 539, 539, 176, 539, 539, 539, 539, 177, 539, 157, 539, 539, 539, 539, 539, 539, 180, 178, 539, 539, 539, 539, 169, 539, 158, 539, 539, 539, 539, 176, 539, 539, 539, 539, 177, 539, 179, 539, 539, 539, 539, 171, 539, 180, 178, 539, 172, 539, 539, 539, 539, 173, 181, 539, 539, 539, 539, 539, 539, 174, 539, 186, 539, 179, 539, 539, 539, 539, 171, 539, 184, 185, 182, 172, 539, 539, 539, 539, 173, 181, 539, 539, 539, 539, 539, 539, 174, 539, 186, 539, 539, 183, 539, 539, 539, 539, 539, 539, 539, 182, 539, 187, 539, 539, 539, 539, 539, 539, 539, 539, 539, 188, 539, 539, 539, 539, 189, 539, 183, 190, 539, 539, 539, 539, 539, 539, 539, 539, 187, 539, 193, 539, 539, 539, 539, 539, 539, 539, 188, 539, 191, 539, 539, 189, 539, 539, 190, 539, 194, 192, 539, 539, 539, 539, 539, 539, 195, 193, 539, 539, 539, 539, 539, 539, 539, 539, 539, 191, 539, 539, 539, 539, 539, 539, 539, 194, 192, 539, 196, 539, 539, 539, 539, 539, 539, 539, 197, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 199, 539, 539, 539, 539, 198, 539, 539, 196, 539, 539, 539, 539, 539, 539, 539, 197, 539, 200, 539, 539, 539, 539, 539, 539, 539, 539, 199, 202, 539, 539, 539, 198, 539, 539, 201, 539, 539, 204, 539, 539, 205, 539, 539, 539, 200, 539, 203, 206, 539, 539, 539, 539, 539, 539, 202, 539, 539, 539, 539, 539, 539, 201, 539, 539, 204, 539, 539, 205, 539, 208, 207, 539, 209, 203, 206, 539, 539, 210, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 208, 207, 539, 209, 539, 211, 539, 539, 210, 213, 212, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 211, 539, 539, 539, 213, 212, 215, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 214, 539, 217, 539, 539, 216, 539, 539, 219, 539, 539, 539, 539, 218, 539, 539, 215, 539, 220, 539, 539, 539, 539, 539, 539, 539, 539, 214, 539, 217, 539, 539, 216, 221, 539, 219, 539, 539, 223, 539, 218, 539, 222, 539, 539, 220, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 241, 539, 221, 539, 539, 539, 539, 223, 539, 539, 226, 222, 227, 539, 224, 539, 132, 132, 132, 132, 132, 132, 132, 132, 133, 236, 134, 539, 539, 539, 132, 132, 132, 132, 132, 132, 132, 132, 539, 539, 539, 224, 228, 228, 228, 228, 228, 228, 228, 228, 152, 152, 236, 229, 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 539, 232, 232, 232, 232, 232, 232, 232, 232, 150, 150, 150, 150, 150, 150, 150, 150, 233, 229, 229, 229, 229, 229, 229, 229, 229, 133, 539, 134, 539, 539, 539, 153, 153, 153, 153, 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 235, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 238, 539, 539, 539, 539, 539, 239, 237, 240, 539, 539, 539, 235, 243, 242, 539, 539, 539, 539, 539, 539, 539, 539, 246, 245, 539, 539, 238, 539, 539, 539, 539, 244, 239, 237, 240, 539, 539, 539, 539, 243, 242, 539, 539, 539, 539, 249, 539, 539, 539, 246, 245, 539, 539, 539, 539, 539, 539, 539, 244, 247, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 248, 539, 249, 539, 539, 539, 539, 539, 539, 539, 250, 539, 539, 539, 539, 539, 247, 539, 539, 539, 539, 539, 539, 251, 539, 252, 539, 248, 539, 539, 539, 539, 539, 539, 539, 539, 539, 250, 539, 539, 539, 539, 253, 539, 539, 539, 539, 539, 539, 255, 251, 539, 252, 256, 539, 539, 254, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 257, 253, 539, 539, 539, 539, 539, 539, 255, 539, 539, 539, 256, 258, 539, 254, 539, 539, 539, 539, 260, 539, 539, 259, 539, 539, 539, 257, 539, 539, 539, 539, 539, 539, 539, 265, 539, 539, 539, 539, 258, 539, 539, 539, 261, 539, 539, 260, 539, 539, 259, 539, 539, 539, 539, 539, 539, 262, 263, 539, 539, 539, 539, 539, 539, 539, 539, 539, 264, 539, 539, 261, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 267, 539, 262, 263, 539, 539, 539, 539, 539, 268, 539, 539, 266, 264, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 267, 539, 269, 539, 539, 539, 539, 539, 539, 268, 539, 270, 266, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 271, 539, 272, 539, 539, 539, 269, 539, 539, 539, 539, 273, 539, 275, 539, 270, 539, 274, 539, 539, 539, 539, 539, 539, 539, 539, 539, 271, 539, 272, 539, 539, 539, 539, 539, 539, 539, 276, 273, 539, 539, 539, 539, 539, 274, 539, 539, 539, 539, 539, 277, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 276, 278, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 277, 539, 539, 539, 539, 539, 539, 539, 539, 539, 279, 280, 539, 539, 539, 278, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 281, 539, 539, 539, 539, 539, 539, 539, 285, 286, 279, 280, 539, 283, 539, 282, 539, 539, 539, 284, 539, 539, 539, 539, 539, 539, 539, 281, 539, 539, 539, 287, 539, 539, 539, 285, 286, 539, 539, 289, 283, 539, 282, 288, 539, 539, 284, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 287, 539, 539, 539, 539, 539, 539, 539, 289, 539, 291, 539, 288, 539, 539, 539, 539, 539, 539, 290, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 293, 539, 539, 291, 292, 539, 294, 539, 539, 539, 539, 295, 290, 296, 539, 539, 539, 539, 539, 539, 297, 539, 539, 539, 539, 539, 539, 293, 539, 539, 539, 292, 539, 294, 539, 539, 539, 539, 295, 539, 296, 539, 539, 539, 539, 539, 539, 297, 539, 539, 298, 539, 539, 539, 539, 539, 299, 539, 539, 539, 539, 539, 539, 539, 232, 232, 232, 232, 232, 232, 232, 232, 539, 539, 539, 539, 539, 298, 539, 539, 539, 539, 539, 299, 300, 60, 60, 60, 60, 60, 60, 60, 327, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 228, 228, 228, 228, 228, 228, 228, 228, 401, 401, 401, 401, 401, 401, 401, 401, 133, 539, 134, 539, 539, 329, 229, 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 331, 332, 332, 332, 332, 332, 332, 332, 332, 226, 329, 227, 539, 330, 539, 232, 232, 232, 232, 232, 232, 232, 232, 333, 334, 334, 334, 334, 334, 334, 334, 334, 403, 403, 403, 403, 403, 403, 403, 403, 330, 335, 336, 336, 336, 336, 336, 336, 336, 336, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 337, 539, 539, 539, 338, 539, 539, 339, 539, 539, 539, 539, 539, 340, 539, 342, 539, 539, 539, 539, 539, 539, 539, 539, 539, 341, 539, 337, 539, 539, 539, 338, 539, 539, 339, 539, 539, 343, 539, 539, 340, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 341, 539, 539, 539, 539, 539, 539, 347, 539, 344, 345, 539, 343, 539, 539, 346, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 347, 539, 344, 345, 539, 350, 348, 539, 346, 539, 539, 539, 539, 539, 539, 539, 349, 539, 539, 351, 539, 539, 539, 539, 539, 352, 539, 539, 539, 539, 539, 539, 350, 348, 539, 539, 539, 539, 539, 539, 539, 539, 539, 349, 539, 539, 351, 539, 353, 539, 539, 539, 352, 539, 539, 539, 539, 355, 539, 539, 539, 354, 539, 539, 539, 539, 539, 539, 539, 539, 356, 539, 539, 539, 539, 353, 539, 539, 539, 358, 539, 539, 539, 539, 355, 539, 539, 539, 354, 539, 539, 539, 357, 539, 539, 359, 539, 356, 539, 539, 539, 539, 539, 539, 539, 539, 358, 539, 539, 539, 539, 539, 539, 539, 539, 360, 362, 539, 539, 357, 539, 361, 359, 539, 539, 539, 539, 539, 363, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 360, 362, 539, 364, 539, 539, 361, 539, 539, 365, 539, 539, 539, 363, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 367, 539, 539, 364, 539, 368, 539, 539, 539, 365, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 369, 539, 539, 539, 367, 539, 539, 539, 539, 368, 539, 539, 539, 370, 539, 539, 539, 539, 539, 539, 539, 539, 374, 539, 372, 539, 371, 369, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 375, 539, 370, 539, 539, 539, 539, 539, 539, 539, 539, 539, 373, 372, 539, 371, 539, 539, 376, 539, 539, 539, 539, 539, 539, 539, 539, 375, 539, 539, 539, 539, 377, 539, 539, 539, 539, 539, 539, 373, 539, 539, 539, 539, 539, 376, 378, 380, 539, 539, 539, 539, 539, 379, 539, 381, 539, 539, 539, 377, 539, 539, 539, 539, 539, 539, 539, 539, 382, 539, 539, 539, 539, 378, 380, 539, 539, 539, 539, 539, 379, 539, 381, 539, 539, 539, 539, 539, 539, 539, 383, 384, 539, 539, 539, 382, 539, 539, 539, 539, 539, 539, 386, 539, 387, 539, 539, 539, 539, 539, 539, 385, 539, 539, 539, 388, 539, 383, 384, 539, 390, 539, 539, 539, 539, 539, 389, 539, 539, 386, 539, 387, 539, 539, 539, 539, 539, 391, 385, 539, 539, 539, 388, 539, 539, 539, 539, 390, 539, 539, 539, 539, 539, 389, 539, 539, 539, 539, 539, 539, 539, 539, 392, 539, 391, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 393, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 392, 394, 539, 539, 539, 539, 395, 539, 396, 539, 539, 539, 539, 393, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 394, 539, 539, 539, 539, 395, 539, 396, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 397, 333, 399, 399, 399, 399, 399, 399, 399, 399, 335, 400, 400, 400, 400, 400, 400, 400, 400, 406, 406, 406, 406, 406, 406, 406, 406, 397, 402, 332, 332, 332, 332, 332, 332, 332, 332, 404, 334, 334, 334, 334, 334, 334, 334, 334, 407, 336, 336, 336, 336, 336, 336, 336, 336, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 405, 539, 539, 539, 539, 539, 539, 539, 539, 408, 409, 539, 539, 539, 539, 539, 539, 539, 412, 539, 539, 539, 539, 539, 539, 411, 410, 405, 539, 539, 539, 539, 539, 539, 539, 539, 408, 409, 539, 539, 539, 539, 539, 539, 539, 412, 539, 539, 539, 539, 539, 539, 411, 410, 539, 539, 539, 539, 539, 539, 539, 413, 539, 539, 539, 539, 539, 539, 539, 415, 539, 539, 539, 539, 539, 539, 539, 416, 414, 539, 539, 539, 539, 539, 539, 539, 539, 539, 413, 417, 539, 539, 539, 539, 539, 539, 415, 539, 539, 539, 539, 539, 539, 539, 416, 414, 539, 539, 539, 539, 539, 539, 539, 420, 418, 539, 417, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 419, 539, 539, 539, 539, 539, 539, 539, 539, 539, 420, 418, 421, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 422, 539, 539, 539, 419, 539, 539, 539, 539, 539, 423, 539, 539, 539, 539, 539, 421, 539, 539, 539, 539, 539, 539, 539, 539, 539, 424, 422, 539, 539, 539, 539, 539, 539, 539, 425, 539, 423, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 426, 539, 428, 539, 424, 539, 539, 539, 539, 539, 539, 539, 427, 425, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 426, 539, 428, 539, 539, 539, 539, 539, 539, 539, 539, 539, 427, 539, 539, 539, 539, 539, 432, 431, 539, 539, 539, 430, 539, 539, 539, 539, 539, 433, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 434, 539, 539, 539, 432, 431, 539, 435, 539, 430, 539, 539, 539, 539, 539, 433, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 434, 539, 539, 539, 539, 539, 437, 435, 539, 539, 539, 436, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 438, 539, 539, 539, 437, 539, 539, 539, 440, 436, 539, 539, 539, 439, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 438, 539, 539, 539, 442, 539, 441, 539, 440, 539, 539, 539, 539, 439, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 443, 539, 539, 539, 442, 539, 441, 539, 446, 539, 444, 539, 539, 539, 447, 539, 539, 445, 539, 539, 539, 539, 539, 539, 539, 539, 539, 443, 539, 539, 539, 539, 539, 539, 539, 446, 539, 444, 539, 448, 539, 447, 539, 539, 445, 539, 450, 449, 539, 539, 451, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 448, 539, 452, 539, 539, 539, 539, 450, 449, 539, 539, 451, 539, 539, 539, 539, 539, 539, 539, 453, 454, 401, 401, 401, 401, 401, 401, 401, 401, 452, 404, 399, 399, 399, 399, 399, 399, 399, 399, 539, 539, 539, 539, 539, 539, 539, 453, 454, 407, 400, 400, 400, 400, 400, 400, 400, 400, 539, 456, 401, 401, 401, 401, 401, 401, 401, 401, 403, 403, 403, 403, 403, 403, 403, 403, 539, 457, 403, 403, 403, 403, 403, 403, 403, 403, 456, 539, 539, 539, 539, 539, 539, 539, 539, 458, 539, 539, 539, 539, 539, 539, 539, 539, 457, 456, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 458, 539, 539, 539, 539, 539, 539, 539, 539, 539, 456, 459, 539, 539, 539, 539, 539, 539, 539, 457, 539, 539, 539, 539, 460, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 461, 539, 539, 459, 539, 539, 539, 539, 539, 539, 539, 457, 539, 463, 539, 539, 460, 539, 539, 462, 539, 539, 539, 539, 539, 539, 539, 461, 539, 539, 539, 539, 464, 539, 539, 539, 539, 465, 539, 539, 463, 539, 539, 539, 539, 539, 462, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 464, 539, 539, 539, 539, 539, 539, 539, 466, 539, 539, 467, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 468, 539, 539, 539, 539, 539, 466, 539, 539, 467, 539, 469, 539, 539, 470, 539, 539, 539, 539, 539, 471, 539, 539, 539, 539, 539, 472, 468, 539, 473, 539, 539, 539, 539, 539, 539, 539, 539, 469, 539, 539, 470, 539, 539, 539, 539, 539, 471, 539, 539, 539, 539, 539, 472, 475, 539, 473, 539, 539, 539, 539, 539, 539, 476, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 475, 539, 539, 477, 539, 539, 478, 539, 539, 476, 539, 539, 479, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 477, 539, 539, 478, 539, 539, 539, 539, 539, 479, 539, 539, 480, 539, 539, 539, 539, 539, 539, 481, 539, 539, 539, 539, 539, 482, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 480, 539, 539, 539, 539, 484, 539, 481, 483, 539, 539, 539, 539, 482, 539, 539, 539, 539, 485, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 484, 539, 539, 483, 539, 488, 539, 539, 487, 539, 539, 539, 486, 485, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 488, 539, 539, 487, 539, 539, 539, 486, 539, 491, 539, 489, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 491, 539, 489, 539, 539, 539, 493, 539, 539, 495, 539, 492, 494, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 493, 539, 539, 495, 539, 492, 494, 539, 539, 539, 539, 539, 539, 539, 539, 496, 497, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 498, 539, 539, 539, 499, 539, 539, 539, 539, 539, 539, 496, 497, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 501, 539, 498, 539, 539, 539, 499, 539, 539, 503, 539, 539, 539, 539, 539, 502, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 501, 539, 539, 539, 539, 539, 539, 539, 539, 503, 504, 539, 539, 539, 505, 502, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 506, 539, 539, 539, 539, 539, 504, 539, 539, 509, 505, 539, 539, 507, 508, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 506, 539, 539, 539, 539, 539, 539, 539, 539, 509, 539, 510, 539, 507, 508, 539, 539, 539, 539, 539, 539, 539, 539, 511, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 510, 539, 539, 515, 539, 539, 514, 539, 539, 513, 539, 539, 511, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 516, 539, 539, 539, 539, 539, 515, 539, 539, 514, 539, 539, 513, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 516, 539, 539, 539, 539, 539, 539, 539, 539, 539, 517, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 519, 539, 539, 539, 539, 539, 518, 539, 539, 539, 517, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 520, 539, 539, 539, 539, 539, 519, 539, 539, 539, 539, 539, 518, 539, 539, 539, 521, 539, 539, 539, 539, 539, 522, 539, 539, 539, 539, 520, 539, 539, 539, 539, 539, 539, 539, 539, 524, 539, 539, 539, 539, 539, 539, 521, 539, 539, 539, 539, 539, 522, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 524, 539, 539, 539, 525, 539, 527, 539, 539, 539, 526, 539, 539, 539, 539, 539, 528, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 525, 529, 527, 539, 539, 539, 526, 539, 539, 539, 539, 539, 528, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 531, 539, 539, 539, 539, 529, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 532, 539, 539, 539, 539, 531, 539, 539, 534, 539, 537, 539, 539, 539, 539, 535, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 538, 532, 539, 539, 539, 539, 539, 539, 539, 534, 539, 537, 539, 539, 539, 539, 535, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 538, 43, 43, 43, 43, 47, 539, 47, 47, 50, 539, 50, 50, 60, 60, 128, 539, 128, 128, 130, 539, 130, 130, 5, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539 } ; static yyconst flex_int16_t yy_chk[4381] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 557, 15, 556, 555, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 554, 16, 15, 15, 16, 41, 15, 15, 151, 265, 25, 366, 25, 16, 15, 25, 15, 474, 25, 553, 552, 551, 550, 549, 25, 548, 16, 16, 547, 15, 15, 16, 41, 15, 15, 151, 265, 19, 366, 19, 542, 15, 19, 15, 474, 429, 128, 50, 47, 45, 42, 19, 19, 16, 16, 12, 19, 10, 16, 17, 19, 17, 9, 32, 17, 32, 17, 22, 32, 22, 7, 5, 22, 17, 17, 4, 3, 32, 17, 19, 0, 22, 22, 19, 0, 0, 0, 19, 17, 17, 0, 0, 26, 22, 26, 0, 0, 26, 27, 0, 27, 17, 0, 27, 0, 17, 26, 0, 23, 22, 23, 26, 27, 23, 0, 17, 17, 18, 0, 0, 22, 27, 23, 0, 0, 18, 0, 23, 0, 18, 28, 23, 28, 18, 0, 28, 0, 0, 26, 18, 18, 39, 18, 39, 28, 0, 39, 0, 27, 0, 0, 0, 18, 0, 23, 39, 18, 0, 23, 28, 18, 0, 0, 29, 0, 29, 18, 18, 29, 18, 20, 30, 20, 30, 0, 20, 30, 29, 0, 0, 0, 0, 0, 0, 20, 30, 28, 20, 20, 0, 0, 30, 29, 0, 0, 0, 20, 0, 20, 30, 20, 0, 33, 34, 33, 34, 0, 33, 34, 0, 0, 0, 0, 0, 20, 20, 33, 34, 30, 29, 0, 0, 34, 20, 0, 20, 30, 20, 21, 0, 21, 33, 34, 21, 60, 0, 60, 33, 34, 60, 0, 0, 21, 21, 0, 0, 0, 0, 60, 34, 0, 21, 0, 21, 0, 0, 0, 21, 33, 34, 0, 36, 0, 36, 33, 34, 36, 0, 0, 37, 21, 37, 0, 0, 37, 36, 0, 0, 21, 0, 21, 0, 0, 37, 21, 24, 0, 24, 37, 36, 24, 36, 0, 64, 0, 64, 0, 0, 64, 24, 0, 0, 24, 38, 0, 38, 24, 64, 38, 0, 0, 0, 24, 24, 0, 37, 36, 38, 36, 0, 38, 0, 65, 40, 65, 40, 38, 65, 40, 24, 66, 0, 66, 24, 0, 66, 65, 40, 0, 24, 24, 31, 40, 0, 66, 0, 0, 38, 31, 31, 0, 31, 0, 38, 0, 31, 0, 0, 31, 52, 52, 52, 52, 52, 52, 52, 52, 0, 31, 40, 0, 0, 0, 0, 0, 31, 31, 0, 31, 0, 0, 0, 31, 0, 0, 31, 35, 0, 35, 0, 0, 35, 59, 59, 59, 59, 59, 59, 59, 59, 35, 35, 0, 0, 0, 35, 0, 62, 62, 35, 62, 62, 62, 62, 62, 62, 62, 62, 35, 63, 63, 63, 63, 63, 63, 63, 63, 0, 35, 70, 0, 70, 35, 67, 70, 67, 35, 0, 67, 0, 0, 0, 70, 70, 0, 35, 53, 67, 53, 0, 0, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 67, 53, 53, 0, 0, 53, 53, 0, 0, 68, 0, 68, 0, 53, 68, 53, 104, 0, 104, 0, 73, 104, 73, 68, 0, 73, 0, 67, 53, 53, 104, 0, 53, 53, 73, 0, 0, 68, 0, 0, 53, 0, 53, 54, 0, 54, 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 0, 73, 0, 0, 54, 54, 71, 68, 71, 54, 0, 71, 72, 0, 72, 0, 54, 72, 54, 0, 71, 0, 0, 71, 0, 74, 72, 74, 73, 0, 74, 54, 54, 72, 0, 0, 54, 0, 0, 74, 74, 0, 0, 54, 0, 54, 57, 0, 57, 0, 71, 0, 57, 57, 57, 57, 57, 57, 57, 57, 72, 106, 0, 106, 57, 57, 106, 74, 75, 57, 75, 0, 76, 75, 76, 106, 57, 76, 57, 0, 0, 0, 75, 0, 0, 78, 76, 78, 0, 0, 78, 57, 57, 80, 75, 80, 57, 0, 80, 78, 78, 0, 0, 57, 76, 57, 58, 80, 58, 0, 0, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 75, 0, 0, 58, 58, 80, 78, 58, 58, 0, 76, 0, 0, 0, 77, 58, 77, 58, 0, 77, 0, 0, 82, 0, 82, 0, 0, 82, 77, 0, 58, 58, 80, 0, 58, 58, 82, 82, 0, 0, 77, 77, 58, 0, 58, 61, 0, 61, 0, 0, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 69, 79, 69, 79, 82, 69, 79, 77, 77, 0, 0, 83, 0, 83, 69, 79, 83, 69, 0, 84, 0, 84, 0, 0, 84, 83, 85, 0, 85, 0, 79, 85, 69, 84, 0, 0, 87, 83, 87, 0, 85, 87, 84, 0, 69, 0, 0, 0, 0, 0, 87, 87, 85, 86, 0, 86, 0, 79, 86, 69, 81, 88, 81, 88, 83, 81, 88, 86, 91, 84, 91, 86, 0, 91, 81, 88, 81, 0, 87, 85, 0, 81, 91, 0, 0, 0, 81, 88, 89, 0, 89, 0, 0, 89, 81, 90, 91, 90, 86, 0, 90, 0, 89, 81, 0, 90, 90, 89, 81, 90, 92, 0, 92, 81, 88, 92, 0, 93, 0, 93, 0, 81, 93, 91, 92, 94, 89, 94, 0, 0, 94, 93, 0, 95, 89, 95, 92, 0, 95, 94, 0, 0, 0, 96, 0, 96, 93, 95, 96, 0, 98, 94, 98, 89, 95, 98, 97, 96, 97, 0, 0, 97, 0, 92, 98, 98, 99, 0, 99, 0, 97, 99, 0, 93, 101, 96, 101, 0, 94, 101, 99, 95, 0, 99, 97, 100, 0, 100, 101, 0, 100, 100, 98, 102, 0, 102, 0, 0, 102, 100, 0, 103, 96, 103, 0, 0, 103, 102, 0, 0, 99, 97, 105, 101, 105, 103, 0, 105, 0, 0, 0, 102, 107, 0, 107, 0, 105, 107, 108, 0, 108, 0, 105, 108, 0, 0, 107, 103, 0, 0, 101, 109, 108, 109, 0, 0, 109, 110, 102, 110, 107, 111, 110, 111, 0, 109, 111, 0, 0, 105, 109, 110, 0, 0, 103, 111, 0, 108, 0, 112, 110, 112, 0, 110, 112, 0, 113, 107, 113, 109, 111, 113, 0, 112, 114, 0, 114, 109, 0, 114, 113, 0, 0, 0, 108, 0, 0, 110, 114, 115, 110, 115, 113, 112, 115, 114, 109, 111, 0, 116, 114, 116, 0, 115, 116, 0, 0, 117, 0, 117, 0, 0, 117, 116, 0, 0, 0, 0, 0, 113, 112, 117, 114, 0, 115, 0, 0, 114, 117, 116, 118, 119, 118, 119, 0, 118, 119, 0, 120, 0, 120, 0, 0, 120, 118, 119, 0, 0, 121, 0, 121, 115, 120, 121, 0, 117, 116, 119, 122, 0, 122, 0, 121, 122, 0, 0, 0, 0, 118, 123, 121, 123, 122, 120, 123, 0, 122, 124, 0, 124, 0, 121, 124, 123, 119, 0, 123, 0, 125, 0, 125, 124, 0, 125, 0, 118, 0, 121, 0, 0, 120, 123, 125, 122, 0, 0, 125, 126, 121, 126, 124, 0, 126, 123, 0, 159, 0, 159, 0, 0, 159, 126, 0, 0, 0, 155, 159, 155, 123, 159, 155, 0, 0, 125, 0, 0, 132, 124, 132, 155, 126, 0, 132, 132, 132, 132, 132, 132, 132, 132, 135, 155, 135, 0, 0, 0, 135, 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, 126, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 155, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 145, 145, 0, 145, 145, 145, 145, 145, 145, 145, 145, 150, 150, 150, 150, 150, 150, 150, 150, 150, 152, 152, 152, 152, 152, 152, 152, 152, 153, 0, 153, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 156, 157, 156, 157, 0, 156, 157, 158, 0, 158, 0, 0, 158, 154, 156, 157, 0, 160, 161, 160, 161, 158, 160, 161, 163, 164, 163, 164, 157, 163, 164, 160, 161, 0, 157, 156, 158, 0, 163, 164, 154, 161, 160, 162, 167, 162, 167, 0, 162, 167, 0, 164, 163, 0, 0, 157, 0, 162, 167, 0, 162, 157, 156, 158, 0, 0, 0, 0, 161, 160, 166, 165, 166, 165, 167, 166, 165, 0, 164, 163, 0, 168, 0, 168, 166, 165, 168, 162, 165, 169, 0, 169, 0, 0, 169, 168, 0, 0, 0, 166, 0, 167, 170, 169, 170, 0, 171, 170, 171, 168, 0, 171, 0, 0, 0, 165, 170, 0, 0, 0, 171, 0, 169, 172, 170, 172, 166, 0, 172, 173, 0, 173, 0, 174, 173, 174, 168, 172, 174, 0, 175, 171, 175, 173, 0, 175, 0, 174, 173, 169, 0, 170, 174, 0, 175, 172, 177, 176, 177, 176, 0, 177, 176, 0, 178, 0, 178, 175, 171, 178, 177, 176, 179, 0, 179, 173, 0, 179, 178, 174, 176, 0, 172, 180, 0, 180, 179, 178, 180, 0, 177, 181, 0, 181, 175, 0, 181, 180, 184, 182, 184, 182, 184, 184, 182, 181, 0, 176, 0, 0, 0, 180, 184, 182, 178, 0, 183, 177, 183, 0, 0, 183, 0, 0, 181, 182, 185, 186, 185, 186, 183, 185, 186, 0, 187, 183, 187, 0, 180, 187, 185, 186, 188, 0, 188, 0, 0, 188, 187, 187, 0, 181, 182, 0, 0, 189, 188, 189, 188, 0, 189, 186, 183, 0, 0, 190, 191, 190, 191, 189, 190, 191, 192, 0, 192, 0, 187, 192, 189, 190, 191, 0, 0, 0, 0, 188, 192, 190, 186, 193, 194, 193, 194, 0, 193, 194, 0, 0, 0, 191, 0, 192, 0, 193, 194, 189, 195, 0, 195, 0, 193, 195, 195, 196, 190, 196, 194, 197, 196, 197, 195, 0, 197, 0, 0, 0, 191, 196, 192, 0, 198, 197, 198, 0, 0, 198, 197, 193, 0, 0, 199, 0, 199, 194, 198, 199, 200, 0, 200, 198, 0, 200, 0, 201, 199, 201, 0, 202, 201, 202, 200, 0, 202, 197, 200, 0, 0, 201, 203, 0, 203, 202, 0, 203, 0, 204, 198, 204, 0, 205, 204, 205, 203, 0, 205, 0, 201, 203, 0, 204, 0, 200, 206, 205, 206, 0, 207, 206, 207, 0, 0, 207, 0, 204, 0, 0, 206, 0, 0, 0, 207, 207, 207, 201, 203, 208, 206, 208, 205, 209, 208, 209, 206, 210, 209, 210, 0, 0, 210, 208, 204, 0, 0, 209, 208, 0, 0, 210, 207, 207, 0, 0, 210, 206, 0, 205, 209, 0, 211, 206, 211, 0, 212, 211, 212, 0, 0, 212, 213, 0, 213, 208, 211, 213, 0, 214, 212, 214, 0, 210, 214, 212, 213, 209, 0, 0, 215, 0, 215, 214, 211, 215, 216, 217, 216, 217, 0, 216, 217, 218, 215, 218, 0, 0, 218, 215, 216, 217, 212, 214, 219, 216, 219, 218, 0, 219, 217, 211, 218, 0, 0, 220, 0, 220, 219, 219, 220, 0, 221, 0, 221, 0, 215, 221, 0, 220, 214, 0, 216, 224, 0, 224, 221, 217, 224, 218, 259, 0, 259, 0, 0, 259, 219, 224, 0, 220, 0, 0, 0, 0, 259, 221, 0, 223, 0, 223, 0, 0, 223, 231, 231, 231, 231, 231, 231, 231, 231, 223, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 221, 222, 222, 222, 222, 222, 222, 222, 222, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 228, 228, 228, 228, 228, 228, 228, 228, 331, 331, 331, 331, 331, 331, 331, 331, 229, 0, 229, 0, 0, 228, 229, 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 233, 233, 233, 233, 233, 233, 233, 233, 233, 232, 228, 232, 0, 230, 0, 232, 232, 232, 232, 232, 232, 232, 232, 234, 234, 234, 234, 234, 234, 234, 234, 234, 333, 333, 333, 333, 333, 333, 333, 333, 230, 235, 235, 235, 235, 235, 235, 235, 235, 235, 236, 237, 236, 237, 0, 236, 237, 238, 0, 238, 0, 240, 238, 240, 236, 237, 240, 239, 0, 239, 0, 238, 239, 236, 0, 240, 0, 237, 0, 0, 238, 239, 241, 0, 241, 0, 239, 241, 241, 242, 0, 242, 0, 0, 242, 0, 241, 0, 240, 0, 236, 0, 0, 242, 237, 0, 243, 238, 243, 0, 242, 243, 244, 239, 244, 0, 246, 244, 246, 0, 243, 246, 245, 0, 245, 240, 244, 245, 0, 0, 246, 0, 246, 0, 243, 244, 245, 242, 0, 247, 245, 247, 0, 248, 247, 248, 0, 0, 248, 249, 0, 249, 0, 247, 249, 0, 0, 248, 0, 246, 0, 243, 244, 249, 249, 247, 250, 245, 250, 0, 0, 250, 0, 0, 251, 248, 251, 0, 249, 251, 250, 0, 0, 0, 250, 0, 0, 0, 251, 0, 0, 249, 247, 0, 252, 253, 252, 253, 0, 252, 253, 0, 248, 0, 0, 249, 0, 251, 252, 253, 254, 250, 254, 0, 0, 254, 253, 255, 0, 255, 252, 256, 255, 256, 254, 257, 256, 257, 0, 254, 257, 255, 0, 0, 251, 256, 0, 0, 256, 257, 0, 0, 0, 253, 258, 0, 258, 252, 0, 258, 260, 255, 260, 0, 257, 260, 254, 261, 258, 261, 0, 0, 261, 0, 260, 256, 0, 0, 262, 0, 262, 261, 0, 262, 258, 261, 0, 0, 255, 0, 260, 257, 262, 0, 0, 0, 263, 262, 263, 0, 0, 263, 264, 0, 264, 0, 0, 264, 0, 0, 263, 258, 261, 266, 263, 266, 264, 260, 266, 0, 264, 267, 0, 267, 262, 0, 267, 266, 268, 0, 268, 0, 269, 268, 269, 267, 0, 269, 267, 0, 0, 263, 268, 268, 0, 0, 269, 264, 270, 271, 270, 271, 0, 270, 271, 272, 0, 272, 0, 0, 272, 269, 270, 271, 0, 267, 273, 0, 273, 272, 268, 273, 0, 0, 270, 0, 274, 275, 274, 275, 273, 274, 275, 275, 276, 273, 276, 272, 269, 276, 274, 275, 277, 0, 277, 0, 0, 277, 276, 276, 0, 270, 278, 0, 278, 0, 277, 278, 279, 0, 279, 274, 273, 279, 272, 0, 278, 278, 281, 280, 281, 280, 279, 281, 280, 282, 276, 282, 0, 0, 282, 279, 281, 280, 0, 283, 0, 283, 274, 282, 283, 0, 0, 0, 278, 280, 282, 0, 284, 283, 284, 0, 281, 284, 283, 285, 0, 285, 279, 0, 285, 286, 284, 286, 0, 0, 286, 284, 0, 285, 0, 0, 280, 282, 0, 286, 0, 0, 287, 281, 287, 283, 288, 287, 288, 0, 289, 288, 289, 285, 286, 289, 287, 291, 284, 291, 288, 290, 291, 290, 289, 288, 290, 289, 292, 0, 292, 291, 0, 292, 287, 290, 0, 0, 290, 0, 285, 286, 292, 292, 0, 293, 0, 293, 0, 291, 293, 0, 288, 294, 289, 294, 0, 0, 294, 293, 292, 287, 0, 0, 295, 290, 295, 294, 0, 295, 292, 0, 296, 0, 296, 0, 291, 296, 295, 297, 0, 297, 0, 0, 297, 295, 296, 292, 0, 298, 300, 298, 300, 297, 298, 300, 0, 299, 296, 299, 0, 0, 299, 298, 300, 301, 0, 301, 0, 0, 301, 299, 295, 297, 0, 0, 0, 0, 298, 301, 299, 302, 303, 302, 303, 296, 302, 303, 304, 305, 304, 305, 0, 304, 305, 302, 303, 0, 0, 306, 297, 306, 304, 305, 306, 298, 307, 299, 307, 0, 308, 307, 308, 306, 309, 308, 309, 0, 0, 309, 307, 310, 0, 310, 308, 311, 310, 311, 309, 312, 311, 312, 0, 0, 312, 310, 313, 0, 313, 311, 314, 313, 314, 312, 315, 314, 315, 0, 0, 315, 313, 316, 0, 316, 314, 317, 316, 317, 315, 318, 317, 318, 0, 0, 318, 316, 319, 0, 319, 317, 320, 319, 320, 318, 321, 320, 321, 0, 0, 321, 319, 322, 0, 322, 320, 323, 322, 323, 321, 324, 323, 324, 0, 0, 324, 322, 325, 0, 325, 323, 326, 325, 326, 324, 327, 326, 327, 0, 0, 327, 325, 341, 0, 341, 326, 0, 341, 0, 327, 0, 0, 0, 0, 0, 0, 341, 327, 329, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330, 330, 330, 330, 330, 335, 335, 335, 335, 335, 335, 335, 335, 327, 332, 332, 332, 332, 332, 332, 332, 332, 332, 334, 334, 334, 334, 334, 334, 334, 334, 334, 336, 336, 336, 336, 336, 336, 336, 336, 336, 337, 338, 337, 338, 0, 337, 338, 339, 0, 339, 334, 340, 339, 340, 337, 338, 340, 0, 0, 336, 337, 339, 0, 0, 342, 340, 342, 0, 340, 342, 0, 0, 0, 0, 0, 339, 338, 334, 342, 343, 344, 343, 344, 0, 343, 344, 336, 337, 0, 0, 0, 0, 0, 343, 344, 340, 345, 0, 345, 0, 0, 345, 339, 338, 346, 0, 346, 0, 0, 346, 345, 343, 347, 0, 347, 0, 0, 347, 346, 346, 348, 0, 348, 0, 0, 348, 347, 347, 345, 0, 349, 350, 349, 350, 348, 349, 350, 0, 343, 348, 0, 0, 0, 0, 349, 350, 346, 351, 352, 351, 352, 0, 351, 352, 347, 345, 0, 0, 0, 0, 0, 351, 352, 352, 350, 353, 348, 353, 0, 354, 353, 354, 0, 355, 354, 355, 0, 0, 355, 353, 351, 0, 0, 354, 356, 0, 356, 355, 0, 356, 352, 350, 354, 0, 357, 358, 357, 358, 356, 357, 358, 0, 0, 356, 0, 0, 0, 351, 357, 358, 359, 0, 359, 357, 0, 359, 0, 0, 360, 354, 360, 0, 0, 360, 359, 0, 0, 0, 0, 358, 356, 361, 360, 361, 0, 0, 361, 0, 359, 362, 357, 362, 0, 0, 362, 361, 363, 0, 363, 0, 0, 363, 360, 362, 362, 0, 358, 364, 0, 364, 363, 365, 364, 365, 361, 359, 365, 0, 367, 0, 367, 364, 368, 367, 368, 365, 0, 368, 369, 360, 369, 362, 367, 369, 0, 370, 368, 370, 0, 0, 370, 361, 369, 0, 0, 0, 0, 369, 368, 370, 0, 371, 367, 371, 0, 372, 371, 372, 370, 373, 372, 373, 0, 0, 373, 371, 374, 0, 374, 372, 371, 374, 0, 373, 369, 368, 375, 373, 375, 367, 374, 375, 376, 0, 376, 370, 377, 376, 377, 0, 375, 377, 0, 378, 0, 378, 376, 371, 378, 0, 377, 0, 0, 377, 373, 0, 0, 378, 375, 379, 380, 379, 380, 0, 379, 380, 0, 381, 0, 381, 0, 0, 381, 379, 380, 0, 378, 382, 0, 382, 377, 381, 382, 0, 381, 375, 0, 0, 383, 380, 383, 382, 384, 383, 384, 0, 385, 384, 385, 0, 0, 385, 383, 378, 0, 0, 384, 383, 0, 382, 385, 381, 386, 387, 386, 387, 380, 386, 387, 388, 0, 388, 0, 389, 388, 389, 386, 387, 389, 0, 384, 0, 0, 388, 383, 0, 382, 389, 388, 0, 386, 390, 0, 390, 389, 0, 390, 387, 391, 0, 391, 0, 0, 391, 392, 390, 392, 384, 0, 392, 0, 393, 391, 393, 0, 388, 393, 386, 392, 390, 0, 389, 0, 0, 387, 393, 392, 391, 0, 394, 393, 394, 0, 395, 394, 395, 0, 396, 395, 396, 0, 0, 396, 394, 0, 0, 390, 395, 394, 0, 397, 396, 397, 392, 391, 397, 0, 393, 0, 0, 0, 0, 0, 0, 397, 395, 396, 401, 401, 401, 401, 401, 401, 401, 401, 394, 399, 399, 399, 399, 399, 399, 399, 399, 399, 0, 0, 0, 0, 0, 0, 0, 395, 396, 400, 400, 400, 400, 400, 400, 400, 400, 400, 0, 399, 402, 402, 402, 402, 402, 402, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 0, 400, 404, 404, 404, 404, 404, 404, 404, 404, 399, 405, 408, 405, 408, 0, 405, 408, 0, 403, 0, 0, 0, 0, 0, 405, 408, 0, 400, 404, 406, 406, 406, 406, 406, 406, 406, 406, 407, 407, 407, 407, 407, 407, 407, 407, 403, 409, 410, 409, 410, 0, 409, 410, 0, 0, 404, 406, 411, 0, 411, 409, 410, 411, 412, 407, 412, 0, 0, 412, 409, 413, 411, 413, 0, 0, 413, 414, 412, 414, 0, 410, 414, 0, 406, 413, 0, 0, 415, 0, 415, 414, 407, 415, 414, 0, 416, 409, 416, 0, 413, 416, 415, 0, 0, 0, 0, 0, 410, 417, 416, 417, 0, 416, 417, 418, 0, 418, 417, 0, 418, 414, 0, 417, 0, 0, 0, 413, 419, 418, 419, 0, 420, 419, 420, 0, 421, 420, 421, 0, 416, 421, 419, 0, 0, 0, 420, 422, 418, 422, 421, 419, 422, 423, 424, 423, 424, 0, 423, 424, 0, 422, 0, 0, 0, 0, 0, 423, 424, 421, 0, 425, 426, 425, 426, 418, 425, 426, 419, 427, 422, 427, 0, 424, 427, 425, 426, 0, 0, 425, 0, 0, 428, 427, 428, 426, 421, 428, 427, 431, 430, 431, 430, 0, 431, 430, 428, 422, 0, 0, 424, 0, 0, 431, 430, 432, 425, 432, 0, 433, 432, 433, 426, 430, 433, 427, 434, 0, 434, 432, 0, 434, 432, 433, 0, 0, 0, 435, 0, 435, 434, 436, 435, 436, 0, 0, 436, 437, 0, 437, 430, 435, 437, 433, 0, 436, 435, 0, 438, 432, 438, 437, 437, 438, 439, 440, 439, 440, 0, 439, 440, 441, 438, 441, 0, 0, 441, 0, 439, 440, 433, 0, 442, 435, 442, 441, 443, 442, 443, 437, 0, 443, 439, 444, 0, 444, 442, 0, 444, 440, 443, 445, 0, 445, 0, 441, 445, 444, 446, 447, 446, 447, 0, 446, 447, 445, 448, 0, 448, 439, 0, 448, 446, 447, 447, 0, 440, 444, 0, 449, 448, 449, 441, 450, 449, 450, 0, 448, 450, 451, 0, 451, 0, 449, 451, 0, 0, 450, 0, 0, 0, 447, 0, 451, 444, 452, 451, 452, 0, 450, 452, 0, 0, 449, 448, 453, 454, 453, 454, 452, 453, 454, 0, 460, 0, 460, 0, 0, 460, 453, 454, 0, 0, 451, 0, 0, 450, 460, 0, 0, 449, 461, 460, 461, 454, 462, 461, 462, 0, 463, 462, 463, 0, 0, 463, 461, 464, 0, 464, 462, 465, 464, 465, 463, 0, 465, 0, 0, 0, 460, 464, 454, 0, 0, 465, 463, 0, 466, 465, 466, 462, 464, 466, 467, 468, 467, 468, 0, 467, 468, 469, 466, 469, 0, 0, 469, 0, 467, 468, 0, 0, 470, 463, 470, 469, 465, 470, 462, 464, 471, 0, 471, 0, 0, 471, 470, 0, 467, 468, 0, 472, 0, 472, 471, 473, 472, 473, 0, 0, 473, 0, 0, 0, 470, 472, 0, 0, 472, 473, 0, 0, 475, 0, 475, 467, 468, 475, 476, 477, 476, 477, 0, 476, 477, 478, 475, 478, 0, 475, 478, 470, 476, 477, 0, 472, 0, 0, 477, 478, 479, 480, 479, 480, 476, 479, 480, 481, 482, 481, 482, 0, 481, 482, 479, 480, 475, 0, 483, 0, 483, 481, 482, 483, 0, 477, 479, 0, 0, 0, 481, 476, 483, 0, 484, 485, 484, 485, 0, 484, 485, 486, 0, 486, 0, 0, 486, 482, 484, 485, 0, 0, 0, 479, 0, 486, 486, 481, 0, 0, 484, 485, 487, 488, 487, 488, 0, 487, 488, 0, 489, 0, 489, 0, 482, 489, 487, 488, 0, 0, 0, 0, 0, 486, 489, 487, 0, 484, 485, 491, 492, 491, 492, 0, 491, 492, 493, 488, 493, 0, 494, 493, 494, 491, 492, 494, 495, 0, 495, 0, 493, 495, 487, 0, 494, 493, 0, 496, 492, 496, 495, 491, 496, 497, 488, 497, 0, 498, 497, 498, 0, 496, 498, 499, 0, 499, 496, 497, 499, 0, 0, 498, 493, 0, 501, 492, 501, 499, 491, 501, 502, 503, 502, 503, 0, 502, 503, 504, 501, 504, 0, 0, 504, 496, 502, 503, 0, 505, 0, 505, 0, 504, 505, 502, 506, 507, 506, 507, 0, 506, 507, 505, 0, 0, 0, 0, 0, 0, 506, 507, 507, 0, 508, 509, 508, 509, 505, 508, 509, 510, 502, 510, 0, 0, 510, 0, 508, 509, 0, 0, 511, 508, 511, 510, 513, 511, 513, 507, 0, 513, 0, 0, 0, 505, 511, 0, 0, 509, 513, 514, 515, 514, 515, 510, 514, 515, 0, 516, 508, 516, 0, 0, 516, 514, 515, 0, 0, 514, 517, 0, 517, 516, 0, 517, 509, 0, 518, 0, 518, 0, 510, 518, 517, 519, 0, 519, 0, 520, 519, 520, 518, 521, 520, 521, 514, 0, 521, 519, 517, 0, 519, 520, 0, 0, 518, 521, 524, 522, 524, 522, 521, 524, 522, 0, 525, 0, 525, 0, 0, 525, 524, 522, 0, 0, 0, 517, 522, 519, 525, 0, 526, 518, 526, 0, 0, 526, 527, 521, 527, 0, 528, 527, 528, 0, 526, 528, 0, 529, 525, 529, 527, 0, 529, 522, 528, 531, 0, 531, 0, 0, 531, 529, 532, 534, 532, 534, 0, 532, 534, 531, 527, 0, 0, 0, 0, 525, 532, 534, 531, 535, 534, 535, 0, 0, 535, 532, 537, 538, 537, 538, 0, 537, 538, 535, 0, 0, 535, 527, 0, 0, 537, 538, 0, 0, 0, 531, 0, 534, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 535, 540, 540, 540, 540, 541, 0, 541, 541, 543, 0, 543, 543, 544, 544, 545, 0, 545, 545, 546, 0, 546, 546, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/ds9lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/ds9lex.L" #include #include #include #include "util.h" #include "ds9parser.H" extern YYSTYPE* mklval; extern mkFlexLexer* mklexx; /* rules */ #line 1568 "frame/ds9lex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 31 "frame/ds9lex.L" #line 1672 "frame/ds9lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 540 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 539 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 33 "frame/ds9lex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(mklval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 40 "frame/ds9lex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 48 "frame/ds9lex.L" {return AMPLIFIER_;} YY_BREAK case 4: YY_RULE_SETUP #line 49 "frame/ds9lex.L" {return ANNULUS_;} YY_BREAK case 5: YY_RULE_SETUP #line 50 "frame/ds9lex.L" {return ARCMIN_;} YY_BREAK case 6: YY_RULE_SETUP #line 51 "frame/ds9lex.L" {return ARCSEC_;} YY_BREAK case 7: YY_RULE_SETUP #line 52 "frame/ds9lex.L" {return ARROW_;} YY_BREAK case 8: YY_RULE_SETUP #line 53 "frame/ds9lex.L" {return B1950_;} YY_BREAK case 9: YY_RULE_SETUP #line 54 "frame/ds9lex.L" {return BACKGROUND_;} YY_BREAK case 10: YY_RULE_SETUP #line 55 "frame/ds9lex.L" {return BEGIN_;} YY_BREAK case 11: YY_RULE_SETUP #line 56 "frame/ds9lex.L" {return BOX_;} YY_BREAK case 12: YY_RULE_SETUP #line 57 "frame/ds9lex.L" {return BOXCIRCLE_;} YY_BREAK case 13: YY_RULE_SETUP #line 58 "frame/ds9lex.L" {return BPANDA_;} YY_BREAK case 14: YY_RULE_SETUP #line 59 "frame/ds9lex.L" {return CALLBACK_;} YY_BREAK case 15: YY_RULE_SETUP #line 60 "frame/ds9lex.L" {return CIRCLE_;} YY_BREAK case 16: YY_RULE_SETUP #line 61 "frame/ds9lex.L" {return CIRCLE3D_;} YY_BREAK case 17: YY_RULE_SETUP #line 62 "frame/ds9lex.L" {return COLOR_;} YY_BREAK case 18: YY_RULE_SETUP #line 63 "frame/ds9lex.L" {return COMPASS_;} YY_BREAK case 19: YY_RULE_SETUP #line 64 "frame/ds9lex.L" {return COMPOSITE_;} YY_BREAK case 20: YY_RULE_SETUP #line 65 "frame/ds9lex.L" {return CPANDA_;} YY_BREAK case 21: YY_RULE_SETUP #line 66 "frame/ds9lex.L" {return CROSS_;} YY_BREAK case 22: YY_RULE_SETUP #line 67 "frame/ds9lex.L" {return DASH_;} YY_BREAK case 23: YY_RULE_SETUP #line 68 "frame/ds9lex.L" {return DASHLIST_;} YY_BREAK case 24: YY_RULE_SETUP #line 69 "frame/ds9lex.L" {return DEBUG_;} YY_BREAK case 25: YY_RULE_SETUP #line 70 "frame/ds9lex.L" {return DEGREES_;} YY_BREAK case 26: YY_RULE_SETUP #line 71 "frame/ds9lex.L" {return DELETE_;} YY_BREAK case 27: YY_RULE_SETUP #line 72 "frame/ds9lex.L" {return DETECTOR_;} YY_BREAK case 28: YY_RULE_SETUP #line 73 "frame/ds9lex.L" {return DIAMOND_;} YY_BREAK case 29: YY_RULE_SETUP #line 74 "frame/ds9lex.L" {return EDIT_;} YY_BREAK case 30: YY_RULE_SETUP #line 75 "frame/ds9lex.L" {return ELLIPSE_;} YY_BREAK case 31: YY_RULE_SETUP #line 76 "frame/ds9lex.L" {return ECLIPTIC_;} YY_BREAK case 32: YY_RULE_SETUP #line 77 "frame/ds9lex.L" {return EPANDA_;} YY_BREAK case 33: YY_RULE_SETUP #line 78 "frame/ds9lex.L" {return END_;} YY_BREAK case 34: YY_RULE_SETUP #line 79 "frame/ds9lex.L" {return FALSE_;} YY_BREAK case 35: YY_RULE_SETUP #line 80 "frame/ds9lex.L" {return FIELD_;} YY_BREAK case 36: YY_RULE_SETUP #line 81 "frame/ds9lex.L" {return FIXED_;} YY_BREAK case 37: YY_RULE_SETUP #line 82 "frame/ds9lex.L" {return FK4_;} YY_BREAK case 38: YY_RULE_SETUP #line 83 "frame/ds9lex.L" {return FK4_NO_E_;} YY_BREAK case 39: YY_RULE_SETUP #line 84 "frame/ds9lex.L" {return FK5_;} YY_BREAK case 40: YY_RULE_SETUP #line 85 "frame/ds9lex.L" {return FONT_;} YY_BREAK case 41: YY_RULE_SETUP #line 86 "frame/ds9lex.L" {return GALACTIC_;} YY_BREAK case 42: YY_RULE_SETUP #line 87 "frame/ds9lex.L" {return GLOBAL_;} YY_BREAK case 43: YY_RULE_SETUP #line 88 "frame/ds9lex.L" {return HELIOECLIPTIC_;} YY_BREAK case 44: YY_RULE_SETUP #line 89 "frame/ds9lex.L" {return HIGHLITE_;} YY_BREAK case 45: YY_RULE_SETUP #line 90 "frame/ds9lex.L" {return ICRS_;} YY_BREAK case 46: YY_RULE_SETUP #line 91 "frame/ds9lex.L" {return IGNORE_;} YY_BREAK case 47: YY_RULE_SETUP #line 92 "frame/ds9lex.L" {return INCLUDE_;} YY_BREAK case 48: YY_RULE_SETUP #line 93 "frame/ds9lex.L" {return IMAGE_;} YY_BREAK case 49: YY_RULE_SETUP #line 94 "frame/ds9lex.L" {return KEY_;} YY_BREAK case 50: YY_RULE_SETUP #line 95 "frame/ds9lex.L" {return J2000_;} YY_BREAK case 51: YY_RULE_SETUP #line 96 "frame/ds9lex.L" {return LINE_;} YY_BREAK case 52: YY_RULE_SETUP #line 97 "frame/ds9lex.L" {return LINEAR_;} YY_BREAK case 53: YY_RULE_SETUP #line 98 "frame/ds9lex.L" {return MOVE_;} YY_BREAK case 54: YY_RULE_SETUP #line 99 "frame/ds9lex.L" {return N_;} YY_BREAK case 55: YY_RULE_SETUP #line 100 "frame/ds9lex.L" {return NO_;} YY_BREAK case 56: YY_RULE_SETUP #line 101 "frame/ds9lex.L" {return OFF_;} YY_BREAK case 57: YY_RULE_SETUP #line 102 "frame/ds9lex.L" {return ON_;} YY_BREAK case 58: YY_RULE_SETUP #line 103 "frame/ds9lex.L" {return CPANDA_;} YY_BREAK case 59: YY_RULE_SETUP #line 104 "frame/ds9lex.L" {return PHYSICAL_;} YY_BREAK case 60: YY_RULE_SETUP #line 105 "frame/ds9lex.L" {return PIE_;} YY_BREAK case 61: YY_RULE_SETUP #line 106 "frame/ds9lex.L" {return PIXELS_;} YY_BREAK case 62: YY_RULE_SETUP #line 107 "frame/ds9lex.L" {return POINT_;} YY_BREAK case 63: YY_RULE_SETUP #line 108 "frame/ds9lex.L" {return POLYGON_;} YY_BREAK case 64: YY_RULE_SETUP #line 109 "frame/ds9lex.L" {return PROJECTION_;} YY_BREAK case 65: YY_RULE_SETUP #line 110 "frame/ds9lex.L" {return PROPERTY_;} YY_BREAK case 66: YY_RULE_SETUP #line 111 "frame/ds9lex.L" {return ROTATE_;} YY_BREAK case 67: YY_RULE_SETUP #line 112 "frame/ds9lex.L" {return ROTBOX_;} YY_BREAK case 68: YY_RULE_SETUP #line 113 "frame/ds9lex.L" {return RULER_;} YY_BREAK case 69: YY_RULE_SETUP #line 114 "frame/ds9lex.L" {return SELECT_;} YY_BREAK case 70: YY_RULE_SETUP #line 115 "frame/ds9lex.L" {return SEGMENT_;} YY_BREAK case 71: YY_RULE_SETUP #line 116 "frame/ds9lex.L" {return SOURCE_;} YY_BREAK case 72: YY_RULE_SETUP #line 117 "frame/ds9lex.L" {return SUPERGALACTIC_;} YY_BREAK case 73: YY_RULE_SETUP #line 118 "frame/ds9lex.L" {return TAG_;} YY_BREAK case 74: YY_RULE_SETUP #line 119 "frame/ds9lex.L" {return TEXT_;} YY_BREAK case 75: YY_RULE_SETUP #line 120 "frame/ds9lex.L" {return TEXTANGLE_;} YY_BREAK case 76: YY_RULE_SETUP #line 121 "frame/ds9lex.L" {return TEXTROTATE_;} YY_BREAK case 77: YY_RULE_SETUP #line 122 "frame/ds9lex.L" {return TILE_;} YY_BREAK case 78: YY_RULE_SETUP #line 123 "frame/ds9lex.L" {return TRUE_;} YY_BREAK case 79: YY_RULE_SETUP #line 124 "frame/ds9lex.L" {return VECTOR_;} YY_BREAK case 80: YY_RULE_SETUP #line 125 "frame/ds9lex.L" {return VERSION_;} YY_BREAK case 81: YY_RULE_SETUP #line 126 "frame/ds9lex.L" {return UPDATE_;} YY_BREAK case 82: YY_RULE_SETUP #line 127 "frame/ds9lex.L" {return UNHIGHLITE_;} YY_BREAK case 83: YY_RULE_SETUP #line 128 "frame/ds9lex.L" {return UNSELECT_;} YY_BREAK case 84: YY_RULE_SETUP #line 129 "frame/ds9lex.L" {return WCS_;} YY_BREAK case 85: YY_RULE_SETUP #line 130 "frame/ds9lex.L" {return WCSA_;} YY_BREAK case 86: YY_RULE_SETUP #line 131 "frame/ds9lex.L" {return WCSB_;} YY_BREAK case 87: YY_RULE_SETUP #line 132 "frame/ds9lex.L" {return WCSC_;} YY_BREAK case 88: YY_RULE_SETUP #line 133 "frame/ds9lex.L" {return WCSD_;} YY_BREAK case 89: YY_RULE_SETUP #line 134 "frame/ds9lex.L" {return WCSE_;} YY_BREAK case 90: YY_RULE_SETUP #line 135 "frame/ds9lex.L" {return WCSF_;} YY_BREAK case 91: YY_RULE_SETUP #line 136 "frame/ds9lex.L" {return WCSG_;} YY_BREAK case 92: YY_RULE_SETUP #line 137 "frame/ds9lex.L" {return WCSH_;} YY_BREAK case 93: YY_RULE_SETUP #line 138 "frame/ds9lex.L" {return WCSI_;} YY_BREAK case 94: YY_RULE_SETUP #line 139 "frame/ds9lex.L" {return WCSJ_;} YY_BREAK case 95: YY_RULE_SETUP #line 140 "frame/ds9lex.L" {return WCSK_;} YY_BREAK case 96: YY_RULE_SETUP #line 141 "frame/ds9lex.L" {return WCSL_;} YY_BREAK case 97: YY_RULE_SETUP #line 142 "frame/ds9lex.L" {return WCSM_;} YY_BREAK case 98: YY_RULE_SETUP #line 143 "frame/ds9lex.L" {return WCSN_;} YY_BREAK case 99: YY_RULE_SETUP #line 144 "frame/ds9lex.L" {return WCSO_;} YY_BREAK case 100: YY_RULE_SETUP #line 145 "frame/ds9lex.L" {return WCSP_;} YY_BREAK case 101: YY_RULE_SETUP #line 146 "frame/ds9lex.L" {return WCSQ_;} YY_BREAK case 102: YY_RULE_SETUP #line 147 "frame/ds9lex.L" {return WCSR_;} YY_BREAK case 103: YY_RULE_SETUP #line 148 "frame/ds9lex.L" {return WCSS_;} YY_BREAK case 104: YY_RULE_SETUP #line 149 "frame/ds9lex.L" {return WCST_;} YY_BREAK case 105: YY_RULE_SETUP #line 150 "frame/ds9lex.L" {return WCSU_;} YY_BREAK case 106: YY_RULE_SETUP #line 151 "frame/ds9lex.L" {return WCSV_;} YY_BREAK case 107: YY_RULE_SETUP #line 152 "frame/ds9lex.L" {return WCSW_;} YY_BREAK case 108: YY_RULE_SETUP #line 153 "frame/ds9lex.L" {return WCSX_;} YY_BREAK case 109: YY_RULE_SETUP #line 154 "frame/ds9lex.L" {return WCSY_;} YY_BREAK case 110: YY_RULE_SETUP #line 155 "frame/ds9lex.L" {return WCSZ_;} YY_BREAK case 111: YY_RULE_SETUP #line 156 "frame/ds9lex.L" {return WCS0_;} YY_BREAK case 112: YY_RULE_SETUP #line 157 "frame/ds9lex.L" {return WIDTH_;} YY_BREAK case 113: YY_RULE_SETUP #line 158 "frame/ds9lex.L" {return X_;} YY_BREAK case 114: YY_RULE_SETUP #line 159 "frame/ds9lex.L" {return Y_;} YY_BREAK case 115: YY_RULE_SETUP #line 160 "frame/ds9lex.L" {return YES_;} YY_BREAK case 116: YY_RULE_SETUP #line 163 "frame/ds9lex.L" { // Integer mklval->integer = atoi(yytext); return INT; } YY_BREAK case 117: #line 169 "frame/ds9lex.L" case 118: YY_RULE_SETUP #line 169 "frame/ds9lex.L" { // Real Number mklval->real = atof(yytext); return REAL; } YY_BREAK case 119: #line 175 "frame/ds9lex.L" case 120: YY_RULE_SETUP #line 175 "frame/ds9lex.L" { // degrees yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ANGDEGREE; } YY_BREAK case 121: #line 182 "frame/ds9lex.L" case 122: YY_RULE_SETUP #line 182 "frame/ds9lex.L" { // radians yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ANGRADIAN; } YY_BREAK case 123: #line 189 "frame/ds9lex.L" case 124: YY_RULE_SETUP #line 189 "frame/ds9lex.L" { // physical coords yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return PHYCOORD; } YY_BREAK case 125: #line 196 "frame/ds9lex.L" case 126: YY_RULE_SETUP #line 196 "frame/ds9lex.L" { // image coords yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return IMGCOORD; } YY_BREAK case 127: #line 203 "frame/ds9lex.L" case 128: #line 204 "frame/ds9lex.L" case 129: #line 205 "frame/ds9lex.L" case 130: YY_RULE_SETUP #line 205 "frame/ds9lex.L" { // minutes of arc yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ARCMINUTE; } YY_BREAK case 131: #line 212 "frame/ds9lex.L" case 132: #line 213 "frame/ds9lex.L" case 133: #line 214 "frame/ds9lex.L" case 134: YY_RULE_SETUP #line 214 "frame/ds9lex.L" { // seconds of arc yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ARCSECOND; } YY_BREAK case 135: #line 221 "frame/ds9lex.L" case 136: YY_RULE_SETUP #line 221 "frame/ds9lex.L" { // Sexagesimal int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 137: #line 229 "frame/ds9lex.L" case 138: YY_RULE_SETUP #line 229 "frame/ds9lex.L" { // HMS int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return HMSSTR; } YY_BREAK case 139: #line 237 "frame/ds9lex.L" case 140: YY_RULE_SETUP #line 237 "frame/ds9lex.L" { // DMS int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return DMSSTR; } YY_BREAK case 141: YY_RULE_SETUP #line 244 "frame/ds9lex.L" { // 8 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } YY_BREAK case 142: YY_RULE_SETUP #line 251 "frame/ds9lex.L" { // 16 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } YY_BREAK case 143: YY_RULE_SETUP #line 258 "frame/ds9lex.L" { // 32 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } YY_BREAK case 144: #line 266 "frame/ds9lex.L" case 145: YY_RULE_SETUP #line 266 "frame/ds9lex.L" { // Quoted String int ll = (yyleng-2)<(MKBUFSIZE-1) ? (yyleng-2):(MKBUFSIZE-1); strncpy(mklval->str,yytext+1,ll); // skip the " " mklval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 146: YY_RULE_SETUP #line 273 "frame/ds9lex.L" { // Quoted String int ll = (yyleng-2)<(MKBUFSIZE-1) ? (yyleng-2):(MKBUFSIZE-1); strncpy(mklval->str,yytext+1,ll); // skip the '{' mklval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 147: YY_RULE_SETUP #line 280 "frame/ds9lex.L" { // General String int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } YY_BREAK case 148: YY_RULE_SETUP #line 287 "frame/ds9lex.L" { // White Spaces } YY_BREAK case 149: /* rule 149 can match eol */ YY_RULE_SETUP #line 290 "frame/ds9lex.L" { // windows line feed return '\n'; } YY_BREAK case 150: YY_RULE_SETUP #line 294 "frame/ds9lex.L" { // fake line feed return '\n'; } YY_BREAK case 151: /* rule 151 can match eol */ YY_RULE_SETUP #line 298 "frame/ds9lex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 302 "frame/ds9lex.L" { // eof return EOF_; } YY_BREAK case 152: YY_RULE_SETUP #line 306 "frame/ds9lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 153: YY_RULE_SETUP #line 310 "frame/ds9lex.L" ECHO; YY_BREAK #line 2576 "frame/ds9lex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; mkfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); mkfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ mkrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) mkrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 540 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 540 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 539); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) mkalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) mkalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) mkfree((void *) b->yy_ch_buf ); mkfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)mkalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)mkrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) mkalloc(new_size ); else (yy_start_stack) = (int *) mkrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *mkalloc (yy_size_t size ) { return (void *) malloc( size ); } void *mkrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void mkfree (void * ptr ) { free( (char *) ptr ); /* see mkrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 310 "frame/ds9lex.L" void mkDiscard(int doit) { if (mklexx) mklexx->begin(DISCARD, doit); } void mkFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/ds9lex.L000644 000765 000000 00000016104 12464230773 016355 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "ds9parser.H" extern YYSTYPE* mklval; extern mkFlexLexer* mklexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ H [0-9a-fA-F] /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(mklval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } amplifier {return AMPLIFIER_;} ann[u][l][u][s] {return ANNULUS_;} arcmin {return ARCMIN_;} arcsec {return ARCSEC_;} arrow {return ARROW_;} b1950 {return B1950_;} background {return BACKGROUND_;} begin {return BEGIN_;} box {return BOX_;} boxcircle {return BOXCIRCLE_;} bpanda {return BPANDA_;} callback {return CALLBACK_;} cir[c][l][e] {return CIRCLE_;} circle3d {return CIRCLE3D_;} color {return COLOR_;} compass {return COMPASS_;} composite {return COMPOSITE_;} cpanda {return CPANDA_;} cross {return CROSS_;} dash {return DASH_;} dashlist {return DASHLIST_;} debug {return DEBUG_;} degrees {return DEGREES_;} delete {return DELETE_;} detector {return DETECTOR_;} diamond {return DIAMOND_;} edit {return EDIT_;} ell[i][p][s][e] {return ELLIPSE_;} ecliptic {return ECLIPTIC_;} epanda {return EPANDA_;} end {return END_;} false {return FALSE_;} fie[l][d] {return FIELD_;} fixed {return FIXED_;} fk4 {return FK4_;} fk4-no-e {return FK4_NO_E_;} fk5 {return FK5_;} font {return FONT_;} galactic {return GALACTIC_;} global {return GLOBAL_;} helioecliptic {return HELIOECLIPTIC_;} highlite {return HIGHLITE_;} icrs {return ICRS_;} ignore {return IGNORE_;} include {return INCLUDE_;} image {return IMAGE_;} key {return KEY_;} j2000 {return J2000_;} lin[e] {return LINE_;} linear {return LINEAR_;} move {return MOVE_;} n {return N_;} no {return NO_;} off {return OFF_;} on {return ON_;} panda {return CPANDA_;} physical {return PHYSICAL_;} pie {return PIE_;} pixels {return PIXELS_;} poi[n][t] {return POINT_;} pol[y][g][o][n] {return POLYGON_;} projection {return PROJECTION_;} property {return PROPERTY_;} rotate {return ROTATE_;} rotbox {return ROTBOX_;} ruler {return RULER_;} select {return SELECT_;} segment {return SEGMENT_;} source {return SOURCE_;} supergalactic {return SUPERGALACTIC_;} tag {return TAG_;} text {return TEXT_;} textangle {return TEXTANGLE_;} textrotate {return TEXTROTATE_;} tile {return TILE_;} true {return TRUE_;} vector {return VECTOR_;} version {return VERSION_;} update {return UPDATE_;} unhighlite {return UNHIGHLITE_;} unselect {return UNSELECT_;} wcs {return WCS_;} wcsa {return WCSA_;} wcsb {return WCSB_;} wcsc {return WCSC_;} wcsd {return WCSD_;} wcse {return WCSE_;} wcsf {return WCSF_;} wcsg {return WCSG_;} wcsh {return WCSH_;} wcsi {return WCSI_;} wcsj {return WCSJ_;} wcsk {return WCSK_;} wcsl {return WCSL_;} wcsm {return WCSM_;} wcsn {return WCSN_;} wcso {return WCSO_;} wcsp {return WCSP_;} wcsq {return WCSQ_;} wcsr {return WCSR_;} wcss {return WCSS_;} wcst {return WCST_;} wcsu {return WCSU_;} wcsv {return WCSV_;} wcsw {return WCSW_;} wcsx {return WCSX_;} wcsy {return WCSY_;} wcsz {return WCSZ_;} wcs0 {return WCS0_;} width {return WIDTH_;} x {return X_;} y {return Y_;} yes {return YES_;} [+-]?{D}+ { // Integer mklval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number mklval->real = atof(yytext); return REAL; } [+-]?{D}+"."?d | [+-]?{D}*"."{D}+d { // degrees yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ANGDEGREE; } [+-]?{D}+"."?r | [+-]?{D}*"."{D}+r { // radians yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ANGRADIAN; } [+-]?{D}+"."?p | [+-]?{D}*"."{D}+p { // physical coords yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return PHYCOORD; } [+-]?{D}+"."?i | [+-]?{D}*"."{D}+i { // image coords yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return IMGCOORD; } {D}+"."?' | {D}*"."{D}+' | [+-]?{D}+"."?({E})?' | [+-]?{D}*"."{D}+({E})?' { // minutes of arc yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ARCMINUTE; } {D}+"."?\" | {D}*"."{D}+\" | [+-]?{D}+"."?({E})?\" | [+-]?{D}*"."{D}+({E})?\" { // seconds of arc yytext[yyleng-1] = '\0'; mklval->real = atof(yytext); return ARCSECOND; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return SEXSTR; } [+-]?{D}+h{D}+m{D}+"."?s | [+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return HMSSTR; } [+-]?{D}+d{D}+m{D}+"."?s | [+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return DMSSTR; } #({H}){3} { // 8 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } #({H}){6} { // 16 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } #({H}){12} { // 32 bit Hex Color int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } \"[^\"\n]*\" | \'[^\'\n]*\' { // Quoted String int ll = (yyleng-2)<(MKBUFSIZE-1) ? (yyleng-2):(MKBUFSIZE-1); strncpy(mklval->str,yytext+1,ll); // skip the " " mklval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}\n]*\} { // Quoted String int ll = (yyleng-2)<(MKBUFSIZE-1) ? (yyleng-2):(MKBUFSIZE-1); strncpy(mklval->str,yytext+1,ll); // skip the '{' mklval->str[ll] = '\0'; // Remove the '}' return STRING; } [0-9A-Za-z]+ { // General String int ll = yyleng <(MKBUFSIZE-1) ? yyleng:(MKBUFSIZE-1); strncpy(mklval->str,yytext,ll); mklval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \\n { // fake line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void mkDiscard(int doit) { if (mklexx) mklexx->begin(DISCARD, doit); } void mkFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/ds9parser.C000644 000765 000000 00000543164 12553253014 017053 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse mkparse #define yylex mklex #define yyerror mkerror #define yylval mklval #define yychar mkchar #define yydebug mkdebug #define yynerrs mknerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, COLOR = 261, ANGDEGREE = 262, ANGRADIAN = 263, ARCMINUTE = 264, ARCSECOND = 265, PHYCOORD = 266, IMGCOORD = 267, SEXSTR = 268, HMSSTR = 269, DMSSTR = 270, EOF_ = 271, AMPLIFIER_ = 272, ANNULUS_ = 273, ARCMIN_ = 274, ARCSEC_ = 275, ARROW_ = 276, B1950_ = 277, BACKGROUND_ = 278, BEGIN_ = 279, BOX_ = 280, BOXCIRCLE_ = 281, BPANDA_ = 282, CALLBACK_ = 283, CIRCLE_ = 284, CIRCLE3D_ = 285, COLOR_ = 286, COMPASS_ = 287, COMPOSITE_ = 288, CPANDA_ = 289, CROSS_ = 290, DASH_ = 291, DASHLIST_ = 292, DEBUG_ = 293, DEGREES_ = 294, DELETE_ = 295, DETECTOR_ = 296, DIAMOND_ = 297, ECLIPTIC_ = 298, EDIT_ = 299, ELLIPSE_ = 300, END_ = 301, EPANDA_ = 302, FALSE_ = 303, FIELD_ = 304, FIXED_ = 305, FK4_ = 306, FK4_NO_E_ = 307, FK5_ = 308, FONT_ = 309, GALACTIC_ = 310, GLOBAL_ = 311, HELIOECLIPTIC_ = 312, HIGHLITE_ = 313, ICRS_ = 314, IGNORE_ = 315, IMAGE_ = 316, INCLUDE_ = 317, J2000_ = 318, KEY_ = 319, LINE_ = 320, LINEAR_ = 321, MOVE_ = 322, N_ = 323, NO_ = 324, OFF_ = 325, ON_ = 326, PHYSICAL_ = 327, PIE_ = 328, PIXELS_ = 329, POINT_ = 330, POLYGON_ = 331, PROJECTION_ = 332, PROPERTY_ = 333, ROTATE_ = 334, ROTBOX_ = 335, RULER_ = 336, SEGMENT_ = 337, SELECT_ = 338, SOURCE_ = 339, SUPERGALACTIC_ = 340, TAG_ = 341, TEXT_ = 342, TEXTANGLE_ = 343, TEXTROTATE_ = 344, TILE_ = 345, TRUE_ = 346, VECTOR_ = 347, VERSION_ = 348, UNHIGHLITE_ = 349, UNSELECT_ = 350, UPDATE_ = 351, WCS_ = 352, WCSA_ = 353, WCSB_ = 354, WCSC_ = 355, WCSD_ = 356, WCSE_ = 357, WCSF_ = 358, WCSG_ = 359, WCSH_ = 360, WCSI_ = 361, WCSJ_ = 362, WCSK_ = 363, WCSL_ = 364, WCSM_ = 365, WCSN_ = 366, WCSO_ = 367, WCSP_ = 368, WCSQ_ = 369, WCSR_ = 370, WCSS_ = 371, WCST_ = 372, WCSU_ = 373, WCSV_ = 374, WCSW_ = 375, WCSX_ = 376, WCSY_ = 377, WCSZ_ = 378, WCS0_ = 379, WIDTH_ = 380, X_ = 381, Y_ = 382, YES_ = 383 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define COLOR 261 #define ANGDEGREE 262 #define ANGRADIAN 263 #define ARCMINUTE 264 #define ARCSECOND 265 #define PHYCOORD 266 #define IMGCOORD 267 #define SEXSTR 268 #define HMSSTR 269 #define DMSSTR 270 #define EOF_ 271 #define AMPLIFIER_ 272 #define ANNULUS_ 273 #define ARCMIN_ 274 #define ARCSEC_ 275 #define ARROW_ 276 #define B1950_ 277 #define BACKGROUND_ 278 #define BEGIN_ 279 #define BOX_ 280 #define BOXCIRCLE_ 281 #define BPANDA_ 282 #define CALLBACK_ 283 #define CIRCLE_ 284 #define CIRCLE3D_ 285 #define COLOR_ 286 #define COMPASS_ 287 #define COMPOSITE_ 288 #define CPANDA_ 289 #define CROSS_ 290 #define DASH_ 291 #define DASHLIST_ 292 #define DEBUG_ 293 #define DEGREES_ 294 #define DELETE_ 295 #define DETECTOR_ 296 #define DIAMOND_ 297 #define ECLIPTIC_ 298 #define EDIT_ 299 #define ELLIPSE_ 300 #define END_ 301 #define EPANDA_ 302 #define FALSE_ 303 #define FIELD_ 304 #define FIXED_ 305 #define FK4_ 306 #define FK4_NO_E_ 307 #define FK5_ 308 #define FONT_ 309 #define GALACTIC_ 310 #define GLOBAL_ 311 #define HELIOECLIPTIC_ 312 #define HIGHLITE_ 313 #define ICRS_ 314 #define IGNORE_ 315 #define IMAGE_ 316 #define INCLUDE_ 317 #define J2000_ 318 #define KEY_ 319 #define LINE_ 320 #define LINEAR_ 321 #define MOVE_ 322 #define N_ 323 #define NO_ 324 #define OFF_ 325 #define ON_ 326 #define PHYSICAL_ 327 #define PIE_ 328 #define PIXELS_ 329 #define POINT_ 330 #define POLYGON_ 331 #define PROJECTION_ 332 #define PROPERTY_ 333 #define ROTATE_ 334 #define ROTBOX_ 335 #define RULER_ 336 #define SEGMENT_ 337 #define SELECT_ 338 #define SOURCE_ 339 #define SUPERGALACTIC_ 340 #define TAG_ 341 #define TEXT_ 342 #define TEXTANGLE_ 343 #define TEXTROTATE_ 344 #define TILE_ 345 #define TRUE_ 346 #define VECTOR_ 347 #define VERSION_ 348 #define UNHIGHLITE_ 349 #define UNSELECT_ 350 #define UPDATE_ 351 #define WCS_ 352 #define WCSA_ 353 #define WCSB_ 354 #define WCSC_ 355 #define WCSD_ 356 #define WCSE_ 357 #define WCSF_ 358 #define WCSG_ 359 #define WCSH_ 360 #define WCSI_ 361 #define WCSJ_ 362 #define WCSK_ 363 #define WCSL_ 364 #define WCSM_ 365 #define WCSN_ 366 #define WCSO_ 367 #define WCSP_ 368 #define WCSQ_ 369 #define WCSR_ 370 #define WCSS_ 371 #define WCST_ 372 #define WCSU_ 373 #define WCSV_ 374 #define WCSW_ 375 #define WCSX_ 376 #define WCSY_ 377 #define WCSZ_ 378 #define WCS0_ 379 #define WIDTH_ 380 #define X_ 381 #define Y_ 382 #define YES_ 383 /* Copy the first part of user declarations. */ #line 10 "frame/ds9parser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits(globalTile)) #define DISCARD_(x) {yyclearin; mkDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #include "point.h" #undef yyFlexLexer #define yyFlexLexer mkFlexLexer #include extern int mklex(void*, mkFlexLexer*); extern void mkerror(Base*, mkFlexLexer*, const char*); extern void mkDiscard(int); static Coord::CoordSystem globalSystem; static Coord::CoordSystem globalWCS; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static int globalTile; static unsigned short globalProps; static unsigned short localProps; static int globalDash[2]; static int localDash[2]; static int globalWidth; static int localWidth; static char globalColor[16]; static char localColor[16]; static char globalFont[32]; static char localFont[32]; static char globalText[80]; static char localText[80]; static char localComment[80]; static int globalLine1; static int localLine1; static int globalLine2; static int localLine2; static int globalVector; static int localVector; static int globalComposite; static int localComposite; static int globalPoint; static int localPoint; static int globalPointSize; static int localPointSize; static double globalTextAngle; static double localTextAngle; static int globalTextRotate; static int localTextRotate; static Coord::CoordSystem globalRulerCoordSystem; static Coord::CoordSystem localRulerCoordSystem; static Coord::SkyFrame globalRulerSkyFrame; static Coord::SkyFrame localRulerSkyFrame; static Coord::CoordSystem globalRulerDistSystem; static Coord::CoordSystem localRulerDistSystem; static Coord::SkyDist globalRulerDistFormat; static Coord::SkyDist localRulerDistFormat; static Coord::CoordSystem globalCompassCoordSystem; static Coord::SkyFrame globalCompassSkyFrame; static char globalCompassNorth[80]; static char globalCompassEast[80]; static int globalCompassNArrow; static int globalCompassEArrow; static Coord::CoordSystem localCompassCoordSystem; static Coord::SkyFrame localCompassSkyFrame; static char localCompassNorth[80]; static char localCompassEast[80]; static int localCompassNArrow; static int localCompassEArrow; static int localCpanda; static int localEpanda; static int localBpanda; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aNumsao; static int aStatus; static int cStatus; static Vector aCenter; static double aAngles[MAXANGLES]; static int aAngNum; static double aAngle; static unsigned short aProps; static char aColor[16]; static int aWidth; static int aDash[2]; static char aFont[32]; static char aText[80]; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 135 "frame/ds9parser.Y" { #define MKBUFSIZE 2048 double real; int integer; char str[MKBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 493 "frame/ds9parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 506 "frame/ds9parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 2735 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 141 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 73 /* YYNRULES -- Number of rules. */ #define YYNRULES 326 /* YYNRULES -- Number of states. */ #define YYNSTATES 841 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 383 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 130, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 140, 2, 129, 2, 2, 139, 2, 133, 134, 2, 137, 132, 138, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 131, 2, 136, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 135, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 7, 11, 14, 15, 18, 20, 24, 27, 28, 32, 33, 37, 38, 42, 45, 49, 53, 55, 58, 61, 62, 65, 66, 67, 71, 73, 74, 79, 83, 84, 90, 92, 93, 97, 100, 101, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 139, 141, 142, 144, 145, 147, 148, 150, 153, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 178, 182, 186, 190, 194, 198, 202, 204, 206, 208, 212, 216, 220, 224, 228, 232, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 359, 361, 364, 367, 369, 372, 375, 377, 380, 382, 384, 386, 388, 390, 392, 394, 396, 400, 402, 406, 410, 415, 419, 423, 427, 429, 431, 433, 437, 442, 447, 451, 455, 459, 467, 471, 475, 479, 484, 487, 490, 493, 496, 499, 502, 504, 506, 509, 511, 513, 515, 516, 520, 522, 526, 530, 535, 539, 543, 547, 551, 557, 559, 561, 563, 567, 572, 577, 581, 585, 589, 597, 601, 605, 609, 613, 617, 622, 625, 628, 631, 634, 637, 640, 642, 644, 647, 649, 651, 653, 654, 662, 664, 665, 676, 678, 679, 690, 692, 693, 695, 697, 699, 701, 703, 705, 707, 709, 711, 722, 723, 731, 738, 747, 756, 767, 776, 785, 794, 803, 814, 825, 836, 837, 845, 846, 854, 863, 874, 881, 882, 892, 899, 907, 915, 923, 931, 939, 947, 955, 964, 973, 984, 995, 1008, 1021, 1034, 1049, 1064, 1083, 1096, 1111, 1126, 1145, 1164, 1185, 1206, 1217, 1230, 1243, 1249, 1258, 1262, 1264, 1266, 1270, 1272, 1274, 1278, 1280, 1282, 1286, 1288, 1292 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 142, 0, -1, 185, 143, 213, -1, 143, 144, 158, -1, 144, 158, -1, -1, 38, 160, -1, 93, -1, 56, 181, 150, -1, 90, 3, -1, -1, 175, 145, 150, -1, -1, 177, 146, 150, -1, -1, 66, 147, 150, -1, 196, 201, -1, 196, 198, 201, -1, 196, 129, 148, -1, 199, -1, 198, 199, -1, 90, 3, -1, -1, 149, 5, -1, -1, -1, 129, 151, 5, -1, 213, -1, -1, 129, 153, 5, 213, -1, 129, 186, 213, -1, -1, 129, 186, 154, 5, 213, -1, 213, -1, -1, 156, 5, 213, -1, 186, 213, -1, -1, 186, 157, 5, 213, -1, 130, -1, 131, -1, 16, -1, 4, -1, 3, -1, 71, -1, 70, -1, 3, -1, 128, -1, 127, -1, 71, -1, 91, -1, 69, -1, 68, -1, 70, -1, 48, -1, -1, 132, -1, -1, 133, -1, -1, 134, -1, -1, 135, -1, 135, 135, -1, -1, 167, -1, 159, -1, 7, -1, 8, -1, 159, -1, 11, -1, 12, -1, 7, -1, 9, -1, 10, -1, 159, 162, 159, -1, 11, 162, 11, -1, 12, 162, 12, -1, 7, 162, 7, -1, 9, 162, 9, -1, 10, 162, 10, -1, 68, 136, 3, -1, 13, -1, 14, -1, 15, -1, 171, 162, 171, -1, 172, 162, 173, -1, 173, 162, 173, -1, 159, 162, 159, -1, 7, 162, 7, -1, 12, 162, 12, -1, 11, 162, 11, -1, 61, -1, 72, -1, 41, -1, 17, -1, 176, -1, 97, -1, 98, -1, 99, -1, 100, -1, 101, -1, 102, -1, 103, -1, 104, -1, 105, -1, 106, -1, 107, -1, 108, -1, 109, -1, 110, -1, 111, -1, 112, -1, 113, -1, 114, -1, 115, -1, 116, -1, 117, -1, 118, -1, 119, -1, 120, -1, 121, -1, 122, -1, 123, -1, 124, -1, 51, -1, 22, -1, 52, -1, 53, -1, 63, -1, 59, -1, 55, -1, 85, -1, 43, -1, 57, -1, 39, -1, 19, -1, 20, -1, 83, -1, 58, -1, 36, -1, 50, -1, 44, -1, 67, -1, 79, -1, 40, -1, 62, -1, 84, -1, 83, -1, 95, -1, 58, -1, 94, -1, 24, 67, -1, 67, -1, 46, 67, -1, 24, 44, -1, 44, -1, 46, 44, -1, 24, 79, -1, 79, -1, 46, 79, -1, 40, -1, 87, -1, 31, -1, 125, -1, 78, -1, 54, -1, 64, -1, 96, -1, 181, 162, 182, -1, 182, -1, 179, 136, 161, -1, 31, 136, 5, -1, 37, 136, 3, 3, -1, 125, 136, 3, -1, 54, 136, 5, -1, 87, 136, 5, -1, 36, -1, 84, -1, 23, -1, 75, 136, 197, -1, 75, 136, 197, 3, -1, 65, 136, 3, 3, -1, 92, 136, 3, -1, 33, 136, 3, -1, 81, 136, 183, -1, 32, 136, 184, 5, 5, 3, 3, -1, 88, 136, 167, -1, 89, 136, 3, -1, 97, 136, 176, -1, 175, 177, 175, 178, -1, 175, 175, -1, 175, 178, -1, 177, 175, -1, 177, 178, -1, 66, 175, -1, 66, 178, -1, 178, -1, 74, -1, 175, 177, -1, 175, -1, 177, -1, 66, -1, -1, 186, 162, 187, -1, 187, -1, 179, 136, 161, -1, 31, 136, 5, -1, 37, 136, 3, 3, -1, 125, 136, 3, -1, 54, 136, 5, -1, 87, 136, 5, -1, 86, 136, 5, -1, 28, 136, 180, 5, 5, -1, 36, -1, 84, -1, 23, -1, 75, 136, 197, -1, 75, 136, 197, 3, -1, 65, 136, 3, 3, -1, 92, 136, 3, -1, 33, 136, 3, -1, 81, 136, 188, -1, 32, 136, 189, 5, 5, 3, 3, -1, 88, 136, 167, -1, 89, 136, 3, -1, 34, 136, 190, -1, 47, 136, 192, -1, 27, 136, 194, -1, 175, 177, 175, 178, -1, 175, 175, -1, 175, 178, -1, 177, 175, -1, 177, 178, -1, 66, 175, -1, 66, 178, -1, 178, -1, 74, -1, 175, 177, -1, 175, -1, 177, -1, 66, -1, -1, 191, 133, 209, 134, 133, 207, 134, -1, 60, -1, -1, 193, 133, 209, 134, 133, 211, 134, 133, 167, 134, -1, 60, -1, -1, 195, 133, 209, 134, 133, 211, 134, 133, 167, 134, -1, 60, -1, -1, 29, -1, 25, -1, 42, -1, 35, -1, 126, -1, 21, -1, 26, -1, 137, -1, 138, -1, 92, 163, 174, 162, 168, 162, 167, 164, 165, 155, -1, -1, 82, 200, 163, 205, 164, 165, 155, -1, 87, 163, 174, 164, 165, 155, -1, 81, 163, 174, 162, 174, 164, 165, 155, -1, 32, 163, 174, 162, 168, 164, 165, 155, -1, 77, 163, 174, 162, 174, 162, 168, 164, 165, 155, -1, 30, 163, 174, 162, 168, 164, 165, 155, -1, 33, 163, 174, 162, 166, 164, 165, 155, -1, 29, 163, 174, 162, 168, 164, 165, 152, -1, 30, 163, 174, 162, 168, 164, 165, 152, -1, 45, 163, 174, 162, 169, 162, 166, 164, 165, 152, -1, 25, 163, 174, 162, 169, 162, 166, 164, 165, 152, -1, 80, 163, 174, 162, 169, 162, 166, 164, 165, 152, -1, -1, 76, 202, 163, 205, 164, 165, 152, -1, -1, 82, 203, 163, 205, 164, 165, 152, -1, 65, 163, 174, 162, 174, 164, 165, 152, -1, 92, 163, 174, 162, 168, 162, 167, 164, 165, 152, -1, 87, 163, 174, 164, 165, 152, -1, -1, 87, 163, 174, 162, 5, 164, 204, 165, 152, -1, 75, 163, 174, 164, 165, 152, -1, 29, 75, 163, 174, 164, 165, 152, -1, 25, 75, 163, 174, 164, 165, 152, -1, 42, 75, 163, 174, 164, 165, 152, -1, 35, 75, 163, 174, 164, 165, 152, -1, 126, 75, 163, 174, 164, 165, 152, -1, 21, 75, 163, 174, 164, 165, 152, -1, 26, 75, 163, 174, 164, 165, 152, -1, 81, 163, 174, 162, 174, 164, 165, 152, -1, 32, 163, 174, 162, 168, 164, 165, 152, -1, 77, 163, 174, 162, 174, 162, 168, 164, 165, 152, -1, 18, 163, 174, 162, 168, 162, 168, 164, 165, 152, -1, 18, 163, 174, 162, 168, 162, 168, 162, 207, 164, 165, 152, -1, 18, 163, 174, 162, 168, 162, 168, 162, 170, 164, 165, 152, -1, 45, 163, 174, 162, 169, 162, 169, 162, 166, 164, 165, 152, -1, 45, 163, 174, 162, 169, 162, 169, 162, 170, 162, 166, 164, 165, 152, -1, 45, 163, 174, 162, 169, 162, 169, 162, 211, 162, 166, 164, 165, 152, -1, 45, 163, 174, 162, 169, 162, 166, 164, 139, 140, 45, 163, 174, 162, 169, 162, 166, 164, -1, 25, 163, 174, 162, 169, 162, 169, 162, 166, 164, 165, 152, -1, 25, 163, 174, 162, 169, 162, 169, 162, 211, 162, 166, 164, 165, 152, -1, 25, 163, 174, 162, 169, 162, 169, 162, 170, 162, 166, 164, 165, 152, -1, 25, 163, 174, 162, 169, 162, 166, 164, 139, 140, 25, 163, 174, 162, 169, 162, 166, 164, -1, 34, 163, 174, 162, 167, 162, 167, 162, 3, 162, 168, 162, 168, 162, 3, 164, 165, 152, -1, 47, 163, 174, 162, 167, 162, 167, 162, 3, 162, 169, 162, 169, 162, 3, 162, 166, 164, 165, 152, -1, 27, 163, 174, 162, 167, 162, 167, 162, 3, 162, 169, 162, 169, 162, 3, 162, 166, 164, 165, 152, -1, 73, 163, 174, 162, 167, 162, 167, 164, 165, 152, -1, 73, 163, 174, 162, 167, 162, 167, 162, 209, 164, 165, 152, -1, 73, 163, 174, 162, 167, 162, 167, 162, 170, 164, 165, 152, -1, 49, 163, 164, 165, 152, -1, 33, 163, 174, 162, 166, 164, 165, 152, -1, 205, 162, 206, -1, 206, -1, 174, -1, 207, 162, 208, -1, 208, -1, 168, -1, 209, 162, 210, -1, 210, -1, 167, -1, 211, 162, 212, -1, 212, -1, 168, 162, 168, -1, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 296, 296, 299, 300, 303, 304, 305, 307, 308, 310, 310, 311, 311, 312, 312, 314, 315, 316, 319, 320, 321, 322, 322, 325, 326, 326, 329, 330, 330, 331, 332, 332, 335, 336, 336, 337, 338, 338, 341, 342, 343, 346, 347, 350, 351, 354, 356, 357, 358, 359, 361, 362, 363, 364, 367, 368, 371, 372, 375, 376, 379, 380, 381, 384, 385, 388, 389, 390, 393, 394, 395, 396, 397, 398, 401, 408, 415, 422, 429, 436, 445, 448, 451, 454, 457, 470, 478, 486, 493, 501, 508, 516, 517, 518, 519, 520, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 565, 566, 567, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 605, 606, 609, 614, 619, 624, 625, 630, 635, 640, 645, 650, 651, 656, 661, 662, 666, 667, 676, 677, 678, 681, 688, 695, 702, 709, 716, 723, 730, 737, 746, 751, 756, 761, 768, 810, 811, 814, 815, 816, 821, 822, 823, 824, 825, 827, 828, 829, 831, 832, 833, 834, 835, 836, 837, 844, 845, 846, 847, 848, 851, 858, 865, 872, 879, 886, 893, 900, 907, 916, 921, 926, 931, 938, 938, 939, 942, 942, 944, 947, 947, 949, 952, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1010, 1011, 1014, 1022, 1022, 1029, 1036, 1045, 1055, 1063, 1071, 1080, 1087, 1095, 1118, 1141, 1150, 1150, 1157, 1157, 1165, 1173, 1181, 1188, 1188, 1196, 1203, 1210, 1217, 1224, 1231, 1238, 1245, 1252, 1261, 1271, 1279, 1286, 1296, 1304, 1314, 1324, 1336, 1344, 1354, 1366, 1376, 1385, 1407, 1431, 1456, 1457, 1458, 1460, 1462, 1471, 1472, 1475, 1478, 1479, 1482, 1489, 1490, 1493, 1500, 1501, 1504, 1508 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "STRING", "COLOR", "ANGDEGREE", "ANGRADIAN", "ARCMINUTE", "ARCSECOND", "PHYCOORD", "IMGCOORD", "SEXSTR", "HMSSTR", "DMSSTR", "EOF_", "AMPLIFIER_", "ANNULUS_", "ARCMIN_", "ARCSEC_", "ARROW_", "B1950_", "BACKGROUND_", "BEGIN_", "BOX_", "BOXCIRCLE_", "BPANDA_", "CALLBACK_", "CIRCLE_", "CIRCLE3D_", "COLOR_", "COMPASS_", "COMPOSITE_", "CPANDA_", "CROSS_", "DASH_", "DASHLIST_", "DEBUG_", "DEGREES_", "DELETE_", "DETECTOR_", "DIAMOND_", "ECLIPTIC_", "EDIT_", "ELLIPSE_", "END_", "EPANDA_", "FALSE_", "FIELD_", "FIXED_", "FK4_", "FK4_NO_E_", "FK5_", "FONT_", "GALACTIC_", "GLOBAL_", "HELIOECLIPTIC_", "HIGHLITE_", "ICRS_", "IGNORE_", "IMAGE_", "INCLUDE_", "J2000_", "KEY_", "LINE_", "LINEAR_", "MOVE_", "N_", "NO_", "OFF_", "ON_", "PHYSICAL_", "PIE_", "PIXELS_", "POINT_", "POLYGON_", "PROJECTION_", "PROPERTY_", "ROTATE_", "ROTBOX_", "RULER_", "SEGMENT_", "SELECT_", "SOURCE_", "SUPERGALACTIC_", "TAG_", "TEXT_", "TEXTANGLE_", "TEXTROTATE_", "TILE_", "TRUE_", "VECTOR_", "VERSION_", "UNHIGHLITE_", "UNSELECT_", "UPDATE_", "WCS_", "WCSA_", "WCSB_", "WCSC_", "WCSD_", "WCSE_", "WCSF_", "WCSG_", "WCSH_", "WCSI_", "WCSJ_", "WCSK_", "WCSL_", "WCSM_", "WCSN_", "WCSO_", "WCSP_", "WCSQ_", "WCSR_", "WCSS_", "WCST_", "WCSU_", "WCSV_", "WCSW_", "WCSX_", "WCSY_", "WCSZ_", "WCS0_", "WIDTH_", "X_", "Y_", "YES_", "'#'", "'\\n'", "';'", "','", "'('", "')'", "'|'", "'='", "'+'", "'-'", "'&'", "'!'", "$accept", "start", "commands", "command", "@1", "@2", "@3", "hash", "@4", "comment", "@5", "shapeComment", "@6", "@7", "nonshapeComment", "@8", "@9", "terminator", "numeric", "debug", "yesno", "sp", "bp", "ep", "conjuction", "optangle", "angle", "value", "vvalue", "numberof", "sexagesimal", "hms", "dms", "coord", "coordSystem", "wcsSystem", "skyFrame", "skyDist", "property", "callBack", "global", "globalProperty", "globalRuler", "globalCompass", "initGlobal", "local", "localProperty", "localRuler", "localCompass", "localCpanda", "@10", "localEpanda", "@11", "localBpanda", "@12", "initLocal", "pointShape", "include", "nonshape", "@13", "shape", "@14", "@15", "@16", "polyNodes", "polyNode", "aRads", "aRad", "aAngs", "aAng", "vRads", "vRad", "postLocal", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 35, 10, 59, 44, 40, 41, 124, 61, 43, 45, 38, 33 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 141, 142, 143, 143, 144, 144, 144, 144, 144, 145, 144, 146, 144, 147, 144, 144, 144, 144, 148, 148, 148, 149, 148, 150, 151, 150, 152, 153, 152, 152, 154, 152, 155, 156, 155, 155, 157, 155, 158, 158, 158, 159, 159, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 163, 163, 164, 164, 165, 165, 165, 166, 166, 167, 167, 167, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 170, 171, 172, 173, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, 184, 185, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 191, 190, 190, 193, 192, 192, 195, 194, 194, 196, 197, 197, 197, 197, 197, 197, 197, 198, 198, 199, 200, 199, 199, 199, 199, 199, 199, 199, 201, 201, 201, 201, 201, 202, 201, 203, 201, 201, 201, 201, 204, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 205, 205, 206, 207, 207, 208, 209, 209, 210, 211, 211, 212, 213 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 3, 2, 0, 2, 1, 3, 2, 0, 3, 0, 3, 0, 3, 2, 3, 3, 1, 2, 2, 0, 2, 0, 0, 3, 1, 0, 4, 3, 0, 5, 1, 0, 3, 2, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 3, 4, 3, 3, 3, 1, 1, 1, 3, 4, 4, 3, 3, 3, 7, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 0, 3, 1, 3, 3, 4, 3, 3, 3, 3, 5, 1, 1, 1, 3, 4, 4, 3, 3, 3, 7, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 0, 7, 1, 0, 10, 1, 0, 10, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 0, 7, 6, 8, 8, 10, 8, 8, 8, 8, 10, 10, 10, 0, 7, 0, 7, 8, 10, 6, 0, 9, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 10, 10, 12, 12, 12, 14, 14, 18, 12, 14, 14, 18, 18, 20, 20, 10, 12, 12, 5, 8, 3, 1, 1, 3, 1, 1, 3, 1, 1, 3, 1, 3, 0 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 203, 0, 251, 1, 95, 126, 0, 94, 133, 125, 127, 128, 131, 0, 134, 130, 92, 129, 14, 93, 132, 0, 7, 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, 251, 0, 10, 96, 12, 0, 45, 44, 6, 179, 0, 0, 0, 177, 0, 145, 142, 141, 0, 139, 146, 0, 143, 0, 144, 0, 138, 178, 0, 0, 0, 0, 0, 0, 0, 55, 170, 24, 9, 0, 2, 41, 39, 40, 4, 24, 24, 57, 0, 57, 0, 57, 57, 57, 57, 57, 57, 0, 0, 57, 57, 57, 57, 57, 57, 275, 57, 57, 57, 277, 57, 57, 0, 22, 259, 260, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 56, 8, 0, 15, 3, 11, 13, 58, 0, 57, 57, 0, 57, 0, 57, 0, 0, 0, 0, 0, 57, 57, 0, 0, 59, 0, 0, 0, 57, 0, 0, 0, 57, 0, 0, 57, 57, 57, 57, 57, 57, 262, 57, 0, 57, 18, 0, 0, 19, 17, 172, 202, 200, 201, 0, 184, 0, 175, 0, 257, 253, 258, 252, 255, 254, 256, 180, 136, 137, 135, 0, 198, 0, 0, 197, 185, 176, 43, 42, 67, 68, 66, 187, 188, 183, 189, 174, 46, 54, 52, 51, 53, 49, 50, 48, 47, 171, 0, 169, 55, 55, 55, 82, 83, 84, 55, 55, 55, 55, 55, 0, 0, 55, 0, 55, 0, 55, 55, 55, 55, 55, 0, 0, 55, 55, 60, 61, 55, 55, 59, 0, 55, 55, 55, 0, 59, 55, 0, 0, 0, 0, 0, 0, 57, 0, 21, 0, 23, 20, 199, 0, 173, 182, 181, 195, 196, 191, 0, 192, 193, 194, 26, 0, 0, 0, 0, 0, 0, 0, 0, 59, 59, 0, 59, 0, 59, 0, 0, 0, 64, 0, 59, 59, 0, 0, 62, 326, 0, 0, 61, 316, 55, 315, 0, 0, 0, 55, 0, 61, 0, 59, 55, 55, 55, 55, 55, 0, 59, 55, 0, 0, 89, 91, 90, 88, 85, 86, 87, 72, 73, 74, 70, 71, 69, 55, 61, 61, 55, 55, 55, 55, 55, 55, 55, 61, 55, 61, 59, 59, 59, 59, 65, 55, 61, 61, 55, 55, 63, 28, 312, 27, 59, 55, 326, 0, 61, 55, 55, 59, 61, 59, 326, 55, 61, 0, 0, 64, 0, 0, 59, 61, 0, 0, 190, 0, 326, 326, 0, 0, 0, 0, 0, 0, 64, 326, 0, 326, 61, 61, 61, 61, 0, 326, 326, 64, 0, 216, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 55, 205, 61, 0, 284, 314, 326, 0, 64, 61, 326, 282, 281, 0, 326, 59, 59, 59, 55, 59, 61, 326, 55, 186, 55, 290, 286, 78, 79, 80, 76, 77, 75, 67, 66, 59, 55, 291, 55, 285, 326, 326, 326, 326, 55, 288, 287, 59, 55, 55, 248, 0, 0, 0, 0, 242, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 30, 326, 55, 276, 59, 59, 326, 278, 61, 59, 289, 61, 61, 61, 0, 61, 326, 264, 0, 55, 33, 0, 0, 61, 61, 64, 0, 270, 271, 293, 313, 0, 61, 64, 0, 250, 228, 0, 0, 163, 161, 156, 0, 166, 150, 167, 153, 165, 159, 148, 162, 151, 149, 168, 164, 0, 207, 241, 239, 240, 0, 221, 244, 226, 0, 0, 247, 227, 0, 210, 0, 217, 0, 237, 0, 0, 236, 222, 212, 211, 224, 225, 220, 209, 29, 206, 326, 204, 279, 0, 61, 61, 61, 292, 326, 61, 326, 326, 326, 59, 326, 263, 326, 0, 36, 59, 0, 319, 59, 55, 318, 326, 0, 326, 72, 69, 59, 55, 55, 55, 324, 55, 55, 0, 326, 59, 55, 55, 55, 0, 155, 152, 158, 157, 154, 160, 0, 238, 0, 0, 208, 0, 219, 218, 234, 235, 230, 0, 231, 232, 233, 32, 322, 59, 59, 321, 326, 326, 326, 283, 326, 268, 266, 269, 61, 265, 35, 326, 61, 0, 61, 0, 61, 295, 0, 273, 61, 0, 64, 64, 0, 0, 0, 272, 61, 64, 64, 0, 55, 213, 0, 55, 55, 0, 61, 0, 61, 309, 294, 274, 280, 326, 38, 326, 81, 326, 317, 326, 57, 326, 325, 59, 59, 323, 55, 55, 57, 326, 59, 59, 55, 0, 0, 0, 0, 229, 326, 320, 326, 267, 261, 297, 296, 0, 302, 61, 61, 0, 0, 0, 298, 61, 61, 0, 0, 223, 0, 0, 311, 310, 55, 326, 326, 55, 55, 55, 326, 326, 55, 55, 55, 55, 0, 304, 303, 0, 0, 0, 299, 300, 0, 0, 0, 243, 0, 55, 55, 59, 55, 55, 0, 0, 64, 64, 61, 64, 64, 0, 0, 59, 59, 326, 59, 59, 249, 246, 305, 61, 306, 301, 61, 326, 326, 308, 307 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 51, 52, 96, 97, 88, 190, 191, 146, 242, 394, 462, 534, 553, 554, 639, 95, 250, 59, 241, 731, 153, 271, 331, 385, 386, 653, 378, 644, 251, 252, 253, 335, 53, 54, 55, 219, 463, 591, 86, 87, 220, 199, 2, 555, 465, 613, 596, 599, 600, 603, 604, 572, 573, 56, 211, 127, 193, 288, 128, 173, 177, 544, 336, 337, 645, 646, 690, 691, 655, 656, 395 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -679 static const yytype_int16 yypact[] = { -679, 40, 1717, -679, -679, -679, 99, -679, -679, -679, -679, -679, -679, 2582, -679, -679, -679, -679, -679, -679, -679, 51, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, 1475, 54, -679, -679, -679, 1667, -679, -679, -679, -679, -93, -77, -74, -36, -27, -679, -679, -679, -8, -679, -679, 5, -679, 26, -679, 45, -679, 52, 57, 68, 75, 86, 103, 115, 129, 127, -679, 4, -679, 54, -679, -679, -679, -679, -679, 4, 4, 109, 179, -44, 194, 109, -37, 109, 109, 109, 109, 196, 197, 109, 109, 109, 109, 109, 109, -679, 109, 109, 109, -679, 109, 109, 198, 267, -679, -679, 1250, -679, 265, 2156, 274, 275, 276, 279, 277, 1832, 280, 224, 281, 290, 2611, 292, 23, -679, -679, -679, 2582, -679, -679, -679, -679, -679, 603, 109, 109, 603, 109, 603, 109, 603, 603, 603, 603, 603, 109, 109, 603, 603, 162, 603, 603, 603, 109, 603, 603, 603, 109, 603, 603, 109, 109, 109, 109, 109, 109, -679, 109, 304, 109, -679, 303, 517, -679, -679, -679, -679, 485, -679, 305, -679, 306, -679, 310, -679, -679, -679, -679, -679, -679, -679, 311, -679, -679, -679, 2372, -679, 2048, 2372, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, 312, -679, 186, 186, 186, -679, -679, -679, 186, 186, 186, 186, 186, 603, 603, 186, 603, 186, 603, 186, 186, 186, 186, 186, 603, 603, 186, 186, -679, 185, 186, 186, 162, 603, 186, 186, 186, 603, 22, 186, 603, 603, 603, 603, 603, 603, 109, 603, -679, 603, -679, -679, -679, 317, -679, -679, -679, -679, -679, -679, 2480, -679, -679, -679, -679, 316, 313, 315, 195, 318, 314, 314, 551, 162, 162, 618, 162, 224, 162, 551, 551, 551, 224, 224, 162, 162, 618, 224, 190, 201, 603, 224, 185, -679, 106, -679, 603, 618, 603, 106, 328, 185, 551, 162, 186, 186, 186, 186, 186, 603, 162, 186, 331, 56, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, 186, 185, 185, 186, 186, 186, 186, 186, 186, 186, 185, 186, 185, 162, 162, 162, 162, -679, 186, 185, 185, 186, 186, -679, 2482, -679, -679, 162, 186, 201, 603, 185, 186, 186, 162, 185, 162, 201, 186, 185, 551, 551, 224, 603, 603, 112, 185, 551, 332, -679, 551, 201, 201, 330, 329, 333, 334, 327, 195, 357, 201, 224, 201, 185, 185, 185, 185, 224, 201, 201, 357, 224, -679, 205, 206, 210, 211, 214, 215, -36, 216, 217, 222, 234, 237, 238, 52, 239, 241, 244, 246, 252, 253, 387, 257, 82, -679, 185, 224, -679, -679, 201, 551, 224, 185, 201, -679, -679, 224, 201, 162, 162, 162, 186, 162, 185, 1595, 186, -679, 106, -679, -679, -679, -679, -679, -679, -679, -679, 10, 31, 162, 186, -679, 186, -679, 201, 201, 201, 201, 186, -679, -679, 162, 186, 186, 337, 1338, 389, 2264, 395, 339, 404, 348, 405, 406, 277, 1940, 408, 413, 224, 416, 418, 420, -679, 23, 419, 2482, -679, 201, 106, -679, 162, 162, 201, -679, 185, 162, -679, 185, 185, 185, 551, 185, 1595, -679, 424, 94, -679, 224, 38, 185, -67, 128, 427, -679, -679, -679, -679, 428, 13, 128, 429, -679, -679, 300, 130, -679, -679, -679, 136, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, 430, -679, -679, 485, -679, 433, -679, -679, -679, 307, 436, -679, -679, 309, -679, 441, 442, 2372, -679, 2048, 2372, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, -679, 104, 185, 185, 185, -679, 201, 185, 1595, 1595, 1595, 162, 1595, -679, -679, 443, -679, 162, 319, -679, 162, 106, -679, 201, 321, 201, 118, 145, 162, 186, 186, 186, -679, 186, 186, 324, 201, 162, 186, 186, 186, 224, -679, -679, -679, -679, -679, -679, 444, -679, 445, 224, -679, 224, -679, -679, -679, -679, -679, 2480, -679, -679, -679, -679, -679, 162, 21, -679, 201, 201, 201, -679, 201, -679, -679, -679, 185, -679, -679, -679, 185, 448, 185, 551, 185, -679, 421, -679, 185, 551, 224, 515, 618, 551, 422, -679, 185, 224, 515, 618, -81, -679, 450, -55, 15, 56, 185, 224, 185, -679, -679, -679, -679, 1595, -679, 1595, -679, 201, -679, 201, 109, 201, -679, 162, 162, -679, 186, 186, 109, 201, 162, 162, 186, 325, 462, 335, 342, -679, 201, -679, 201, -679, -679, -679, -679, 603, -679, 185, 185, 618, 551, 603, -679, 185, 185, 618, 551, -679, 551, 551, -679, -679, 186, 201, 201, 186, 186, 186, 201, 201, 186, 84, 111, 134, 618, -679, -679, 463, 467, 618, -679, -679, 473, 344, 551, -679, 346, 186, 186, 162, 186, 186, 224, 224, 224, 224, 185, 224, 224, 351, 352, 162, 162, 201, 162, 162, -679, -679, -679, 185, -679, -679, 185, 201, 201, -679, -679 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -679, -679, -679, 431, -679, -679, -679, -679, -679, 133, -679, 719, -679, -679, -531, -679, -679, 390, 62, -679, -46, -86, -99, 546, 616, -359, 7, 345, -282, -496, 177, -679, -79, 634, -97, 354, -100, -154, -3, -679, -679, 349, -679, -679, -679, 100, -35, -679, -679, -679, -679, -679, -679, -679, -679, -679, -25, 380, 320, -679, 378, -679, -679, -679, -247, 110, -274, -192, -458, -214, -560, -678, -49 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -327 static const yytype_int16 yytable[] = { 147, 156, 91, 158, 160, 161, 162, 163, 164, 663, 85, 167, 168, 169, 170, 171, 172, -55, 174, 175, 176, 637, 178, 179, -55, -55, 232, -55, -55, -55, 198, 155, 341, 197, -55, -55, 218, 749, 159, 217, 3, 222, 223, 129, 749, 363, 390, 364, 365, 366, 367, 145, 481, 757, 89, 255, 256, 402, 258, 130, 260, 300, 131, 303, 305, 654, 266, 267, 330, 499, 92, 233, 648, 662, 275, 212, 213, 145, 279, 759, 511, 282, 283, 284, 285, 286, 287, -31, 289, 152, 291, 234, 235, 236, 237, 214, 152, 294, -326, -37, -140, 697, 698, 699, 414, 701, 642, 222, 223, 132, -326, 224, 225, 541, 238, -55, -55, 302, 299, -55, 301, 304, -59, -55, -55, -55, -55, -55, 133, 689, 749, 222, 223, 144, -67, 650, 225, 364, 365, 366, 367, 134, 145, -24, 85, 227, 500, 145, 330, 760, 239, 240, 659, 145, 145, 270, 270, 512, 307, 308, 309, -66, 135, 145, 310, 311, 312, 313, 314, 57, 58, 317, 642, 319, 666, 321, 322, 323, 324, 325, 669, 136, 328, 329, 93, 94, 332, 333, -147, 351, 338, 339, 340, 137, 342, 344, 642, 667, 222, 223, 226, 418, 652, 670, 138, 355, 765, 724, 766, 668, 661, 139, -326, -326, 145, 671, 145, 727, 807, 728, 795, 148, 140, 797, -326, -326, 145, 222, 223, 150, 151, 224, 225, 361, 362, -59, -59, -59, 145, 141, 270, -59, 152, 145, 145, 809, 270, -67, -67, -67, 399, 142, -67, -67, 154, 399, 144, -24, -24, 145, 409, 410, 411, 412, 413, 143, 145, 416, 810, 157, 195, 165, 166, 180, -66, -66, -66, 200, 201, -66, -66, 202, 203, 419, 228, 221, 422, 423, 424, 425, 426, 427, 428, 229, 430, 231, 270, 181, 204, 182, 183, 436, 205, 206, 439, 440, 207, 290, 292, 296, 295, 467, 208, 297, 298, 471, 472, 306, 145, 209, 330, 477, 354, 356, 357, 392, 380, 358, 399, 249, 393, 247, 387, 405, 417, 487, 391, 491, 492, 495, 397, 514, 515, 493, 184, 494, 516, 517, 185, 186, 518, 519, 520, 521, 187, 747, 748, 188, 522, 189, 222, 223, 754, 755, 497, 225, 373, 374, 375, 376, 523, 612, 359, 524, 525, 526, 368, 527, 535, 377, 528, 226, 529, 368, 368, 368, 226, 226, 530, 531, 377, 226, 532, 533, 592, 226, 550, 571, 597, 598, 557, 377, 558, 210, 125, 126, 368, 601, 602, 606, 605, 422, 427, 614, 561, 536, 562, 595, 615, 617, 594, 618, 567, 619, 622, 611, 569, 570, 610, 638, 657, 658, 664, 665, 750, 672, 556, 502, 674, 676, 675, 756, 677, 508, 678, 679, 744, 513, 703, 725, 726, 740, 625, 758, 681, 705, 684, 686, 780, 825, 826, 710, 828, 829, 718, 781, 812, 752, 782, 535, 813, 368, 368, 226, 538, 783, 815, 816, 368, 817, 149, 368, 90, 620, 545, 830, 831, 621, 360, 496, 498, 789, 226, 464, 673, 230, 243, 794, 226, 607, 623, 498, 226, 556, 192, 194, 640, 5, 796, 469, 683, 680, 293, 682, 685, 742, 811, 763, 222, 223, 0, 814, 650, 225, 364, 365, 366, 367, 8, 226, 0, 0, 0, 368, 226, 616, 9, 10, 11, 226, 12, 0, 14, 0, 15, 0, 0, 181, 17, 182, 183, 0, 0, 0, 222, 223, 0, 0, 363, 707, 364, 365, 366, 367, 641, 0, 0, 713, 714, 715, 20, 716, 717, 687, 0, 761, 721, 722, 723, 0, 0, 0, 0, 556, 556, 556, 729, 556, 0, 702, 226, 0, 0, 0, 184, 0, 0, 0, 185, 186, 0, 0, 0, 0, 187, 0, 222, 223, 0, 189, 244, 0, 368, 0, 245, 246, 247, 248, 249, 226, 368, 222, 223, 651, 0, 372, 0, 373, 374, 375, 376, 651, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 0, 0, 0, 0, 775, 738, 0, 0, 0, 0, 369, 0, 0, 0, 0, 773, 774, 382, 383, 384, 0, 779, 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 688, 0, 688, 0, 0, 226, 556, 407, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 798, 0, 0, 801, 802, 803, 0, 0, 806, 808, 707, 808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 818, 819, 226, 821, 822, 0, 0, 0, 0, 0, 0, 0, 226, 688, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 480, 0, 0, 0, 0, 0, 486, 0, 0, 488, 0, 0, 0, 0, 368, 0, 0, 0, 0, 0, 368, 226, 651, 377, 368, 0, 0, 0, 226, 651, 377, 0, 254, 0, 0, 257, 0, 259, 226, 261, 262, 263, 264, 265, 0, 0, 268, 269, 0, 272, 273, 274, 0, 276, 277, 278, 0, 280, 281, 0, 0, 540, 0, 0, 0, 334, 0, 0, 823, 824, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 377, 368, 0, 0, 0, 0, 377, 368, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 377, 370, 371, 0, 379, 377, 381, 0, 0, 0, 368, 0, 388, 389, 0, 0, 0, 0, 226, 226, 226, 226, 400, 226, 226, 0, 0, 404, 0, 315, 316, 408, 318, 0, 320, 635, 0, 0, 415, 0, 326, 327, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, 352, 0, 353, 0, 0, 432, 433, 434, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 473, 398, 475, 0, 0, 0, 0, 0, 0, 0, 406, 484, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 401, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, 421, 0, 0, 0, 0, 0, 0, 0, 429, 0, 431, 0, 0, 0, 0, 0, 0, 437, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 474, 0, 0, 0, 478, 547, 548, 549, 0, 551, 0, 485, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 560, 482, 483, 504, 505, 506, 507, 643, 0, 0, 0, 0, 568, 746, 0, 0, 0, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 626, 0, 627, 628, 0, 542, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, 790, 0, 0, 0, 0, 0, 476, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 490, 0, 0, 0, 0, 0, 0, 0, 501, 0, 503, 0, 0, 0, 0, 0, 509, 510, 0, 0, 630, 0, 0, 632, 633, 634, 0, 636, 0, 0, 0, 0, 0, 0, 0, 647, 649, 0, 0, 0, 0, 700, 0, 0, 660, 0, 0, 704, 0, 539, 706, 708, 0, 543, 0, 0, 0, 546, 712, 0, 0, 0, 0, 0, 0, 0, 0, 720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, 564, 565, 566, 0, 0, 0, 0, 0, 0, 0, 0, 730, 732, 0, 0, 0, 0, 0, 692, 693, 694, 0, 0, 696, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 98, 0, 0, 99, 0, 0, 0, 100, 101, 102, 0, 103, 104, 0, 105, 106, 107, 108, 0, 0, 0, 0, 0, 0, 109, 771, 772, 110, 0, 111, 0, 112, 777, 778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 737, 0, 0, 0, 739, 0, 741, 114, 743, 115, 116, 117, 745, 0, 118, 119, 120, 0, 0, 0, 753, 121, 0, 0, 0, 0, 122, 0, 0, 0, 762, 0, 764, 695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 820, 0, 0, 574, 0, 0, 0, 709, 0, 711, 575, 0, 832, 833, 0, 835, 836, 123, 0, 576, 719, 0, 0, 577, 0, 578, 0, 0, 787, 788, 0, 0, 0, 579, 792, 793, 0, 580, 0, 0, 0, 0, 0, 581, 786, 0, 582, 0, 0, 0, 791, 0, 733, 734, 735, 0, 736, 583, 584, 0, 0, 0, 585, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 587, 588, 589, 0, 827, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 837, 0, 0, 838, 0, 0, 0, 0, 0, 0, 0, 767, 0, 768, 590, 770, 0, 0, 0, 0, 0, 0, 0, 776, 0, 0, -326, 0, 0, 0, 0, 0, 784, 0, 785, 0, 0, 0, 0, 0, 0, 0, -5, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 799, 800, 0, 0, 0, 804, 805, 6, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, 18, 0, 0, 0, 0, 834, 19, 0, 0, 0, 0, 0, 0, 0, 0, 839, 840, 0, 0, 20, 0, 0, 0, 0, 21, 0, 0, 22, 0, 0, 0, 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, -34, 0, 0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 442, 443, 0, 0, 444, 445, 446, 447, 0, 448, 449, 0, 0, 66, 0, 0, 0, 67, 0, 0, 450, 0, 0, 68, 0, 0, 0, 451, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 452, 0, 73, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 75, 0, 454, 0, 77, 455, 0, 456, 457, 458, 459, 98, 0, 460, 99, 0, 0, 0, 100, 101, 102, 0, 103, 104, 0, 105, 106, 107, 108, 0, 0, 0, 0, 0, 0, 109, 0, 0, 110, 0, 111, 0, 112, 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, -5, 4, 0, 0, 0, 0, 5, 114, 0, 115, 116, 117, 0, 0, 118, 119, 120, 0, 0, 0, 0, 121, 6, 0, 0, 7, 122, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 13, 14, 0, 15, 0, 16, 0, 17, 0, 0, 18, 0, 0, 0, 0, 0, 19, 0, 0, 0, 123, 0, 0, 124, 0, 0, 0, 0, 0, 20, 0, 125, 126, 0, 21, 0, 0, 22, 0, 0, 0, 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, 0, 0, 0, 0, 0, -5, -5, 4, 0, 212, 213, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 0, 215, 0, 0, 0, 0, 0, 19, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 212, 213, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 0, 608, 0, 0, 0, 0, 0, 19, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 212, 213, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 0, 196, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 0, 12, 0, 14, 0, 15, 0, 16, 0, 17, 0, 0, 593, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 212, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 442, 443, 0, 0, 444, 445, 446, 447, 0, 448, 449, 0, 7, 66, 0, 0, 0, 67, 0, 0, 450, 0, 0, 68, 0, 0, 0, 451, 0, 0, 0, 70, 16, 0, 0, 71, 0, 0, 452, 0, 73, 0, 0, 19, 0, 0, 0, 0, 453, 0, 0, 0, 75, 0, 454, 0, 77, 455, 0, 456, 457, 458, 459, 0, 0, 460, 0, 0, 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, 60, 0, 461, 0, 0, 0, 0, 0, 61, 62, 63, 0, 0, 64, 65, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 68, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 72, 0, 73, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 75, 0, 76, 0, 77, 78, 0, 0, 79, 80, 81, 0, 0, 82, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 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 }; static const yytype_int16 yycheck[] = { 86, 100, 51, 102, 103, 104, 105, 106, 107, 569, 13, 110, 111, 112, 113, 114, 115, 7, 117, 118, 119, 552, 121, 122, 3, 4, 3, 5, 7, 8, 130, 75, 279, 130, 3, 4, 136, 715, 75, 136, 0, 3, 4, 136, 722, 7, 328, 9, 10, 11, 12, 132, 411, 134, 3, 154, 155, 339, 157, 136, 159, 215, 136, 217, 218, 561, 165, 166, 135, 428, 16, 48, 139, 569, 173, 19, 20, 132, 177, 134, 439, 180, 181, 182, 183, 184, 185, 5, 187, 133, 189, 68, 69, 70, 71, 39, 133, 197, 16, 5, 136, 632, 633, 634, 351, 636, 68, 3, 4, 136, 16, 7, 8, 472, 91, 3, 4, 217, 215, 7, 217, 218, 16, 11, 12, 13, 14, 15, 136, 625, 808, 3, 4, 129, 16, 7, 8, 9, 10, 11, 12, 136, 132, 16, 147, 138, 428, 132, 135, 134, 127, 128, 139, 132, 132, 134, 134, 439, 244, 245, 246, 16, 136, 132, 250, 251, 252, 253, 254, 70, 71, 257, 68, 259, 44, 261, 262, 263, 264, 265, 44, 136, 268, 269, 130, 131, 272, 273, 136, 288, 276, 277, 278, 136, 280, 281, 68, 67, 3, 4, 138, 355, 561, 67, 136, 302, 737, 665, 739, 79, 569, 136, 130, 131, 132, 79, 132, 675, 134, 677, 780, 88, 136, 783, 130, 131, 132, 3, 4, 96, 97, 7, 8, 312, 313, 129, 130, 131, 132, 136, 134, 135, 133, 132, 132, 134, 134, 129, 130, 131, 336, 136, 134, 135, 75, 341, 129, 130, 131, 132, 346, 347, 348, 349, 350, 136, 132, 353, 134, 75, 5, 75, 75, 75, 129, 130, 131, 3, 3, 134, 135, 5, 3, 369, 3, 5, 372, 373, 374, 375, 376, 377, 378, 3, 380, 3, 134, 30, 21, 32, 33, 387, 25, 26, 390, 391, 29, 3, 5, 3, 5, 397, 35, 3, 3, 401, 402, 5, 132, 42, 135, 407, 5, 7, 11, 135, 319, 12, 414, 15, 129, 13, 325, 5, 3, 3, 329, 7, 9, 12, 333, 136, 136, 10, 77, 11, 136, 136, 81, 82, 136, 136, 136, 136, 87, 714, 715, 90, 136, 92, 3, 4, 721, 722, 7, 8, 9, 10, 11, 12, 136, 525, 310, 136, 136, 136, 314, 136, 464, 317, 136, 319, 136, 321, 322, 323, 324, 325, 136, 136, 328, 329, 5, 136, 5, 333, 482, 60, 3, 60, 486, 339, 488, 126, 137, 138, 344, 3, 60, 3, 5, 497, 498, 5, 500, 464, 502, 517, 5, 3, 517, 3, 508, 3, 5, 525, 512, 513, 525, 5, 3, 3, 3, 133, 716, 5, 485, 430, 5, 3, 133, 723, 133, 436, 3, 3, 25, 440, 5, 5, 5, 3, 538, 3, 608, 136, 610, 611, 133, 818, 819, 140, 821, 822, 140, 3, 3, 45, 133, 555, 3, 409, 410, 411, 467, 133, 3, 133, 416, 133, 90, 419, 51, 532, 477, 134, 134, 533, 311, 427, 428, 773, 430, 393, 594, 141, 147, 779, 436, 524, 535, 439, 440, 552, 124, 127, 555, 22, 782, 399, 610, 608, 192, 610, 611, 707, 798, 731, 3, 4, -1, 803, 7, 8, 9, 10, 11, 12, 43, 467, -1, -1, -1, 471, 472, 528, 51, 52, 53, 477, 55, -1, 57, -1, 59, -1, -1, 30, 63, 32, 33, -1, -1, -1, 3, 4, -1, -1, 7, 645, 9, 10, 11, 12, 557, -1, -1, 653, 654, 655, 85, 657, 658, 622, -1, 729, 662, 663, 664, -1, -1, -1, -1, 632, 633, 634, 683, 636, -1, 638, 528, -1, -1, -1, 77, -1, -1, -1, 81, 82, -1, -1, -1, -1, 87, -1, 3, 4, -1, 92, 7, -1, 550, -1, 11, 12, 13, 14, 15, 557, 558, 3, 4, 561, -1, 7, -1, 9, 10, 11, 12, 569, 625, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 744, -1, -1, -1, -1, -1, -1, -1, 752, 703, -1, -1, -1, -1, 314, -1, -1, -1, -1, 750, 751, 321, 322, 323, -1, 756, -1, 665, -1, -1, -1, -1, -1, -1, -1, -1, -1, 675, -1, 677, -1, -1, 625, 737, 344, 739, -1, -1, -1, -1, -1, -1, -1, -1, -1, 786, -1, -1, 789, 790, 791, -1, -1, 794, 795, 796, 797, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 811, 812, 665, 814, 815, -1, -1, -1, -1, -1, -1, -1, 675, 731, 677, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 409, 410, -1, -1, -1, -1, -1, 416, -1, -1, 419, -1, -1, -1, -1, 707, -1, -1, -1, -1, -1, 713, 714, 715, 716, 717, -1, -1, -1, 721, 722, 723, -1, 153, -1, -1, 156, -1, 158, 731, 160, 161, 162, 163, 164, -1, -1, 167, 168, -1, 170, 171, 172, -1, 174, 175, 176, -1, 178, 179, -1, -1, 471, -1, -1, -1, 274, -1, -1, 816, 817, -1, 280, -1, -1, -1, -1, -1, -1, -1, -1, 773, 774, -1, -1, -1, -1, 779, 780, -1, 782, 783, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 798, 315, 316, -1, 318, 803, 320, -1, -1, -1, 808, -1, 326, 327, -1, -1, -1, -1, 816, 817, 818, 819, 336, 821, 822, -1, -1, 341, -1, 255, 256, 345, 258, -1, 260, 550, -1, -1, 352, -1, 266, 267, -1, 558, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 282, 283, 284, 285, 286, 287, -1, 289, -1, 291, -1, -1, 382, 383, 384, 385, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 396, -1, -1, -1, -1, -1, -1, 403, 334, 405, -1, -1, -1, -1, -1, -1, -1, 343, 414, -1, -1, -1, -1, -1, 332, -1, -1, -1, -1, -1, 338, -1, 340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 370, 371, -1, -1, -1, -1, -1, -1, -1, 379, -1, 381, -1, -1, -1, -1, -1, -1, 388, 389, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, 404, -1, -1, -1, 408, 479, 480, 481, -1, 483, -1, 415, -1, -1, 488, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 499, 412, 413, 432, 433, 434, 435, 707, -1, -1, -1, -1, 511, 713, -1, -1, -1, 717, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 466, -1, 538, -1, 540, 541, -1, 473, -1, 545, -1, -1, -1, -1, -1, -1, -1, -1, 484, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 398, -1, 774, -1, -1, -1, -1, -1, 406, -1, 782, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 420, 421, -1, -1, -1, -1, -1, -1, -1, 429, -1, 431, -1, -1, -1, -1, -1, 437, 438, -1, -1, 544, -1, -1, 547, 548, 549, -1, 551, -1, -1, -1, -1, -1, -1, -1, 559, 560, -1, -1, -1, -1, 635, -1, -1, 568, -1, -1, 641, -1, 470, 644, 645, -1, 474, -1, -1, -1, 478, 652, -1, -1, -1, -1, -1, -1, -1, -1, 661, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 504, 505, 506, 507, -1, -1, -1, -1, -1, -1, -1, -1, 689, 690, -1, -1, -1, -1, -1, 626, 627, 628, -1, -1, 631, -1, -1, -1, -1, -1, -1, -1, -1, 537, -1, -1, -1, -1, 542, -1, -1, -1, -1, -1, -1, 18, -1, -1, 21, -1, -1, -1, 25, 26, 27, -1, 29, 30, -1, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 42, 747, 748, 45, -1, 47, -1, 49, 754, 755, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 700, -1, -1, -1, 704, -1, 706, 73, 708, 75, 76, 77, 712, -1, 80, 81, 82, -1, -1, -1, 720, 87, -1, -1, -1, -1, 92, -1, -1, -1, 730, -1, 732, 630, -1, -1, -1, -1, -1, -1, -1, -1, -1, 813, -1, -1, 24, -1, -1, -1, 647, -1, 649, 31, -1, 825, 826, -1, 828, 829, 126, -1, 40, 660, -1, -1, 44, -1, 46, -1, -1, 771, 772, -1, -1, -1, 54, 777, 778, -1, 58, -1, -1, -1, -1, -1, 64, 769, -1, 67, -1, -1, -1, 775, -1, 692, 693, 694, -1, 696, 78, 79, -1, -1, -1, 83, -1, -1, -1, 87, -1, -1, -1, -1, -1, -1, 94, 95, 96, -1, 820, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 833, -1, -1, 836, -1, -1, -1, -1, -1, -1, -1, 741, -1, 743, 125, 745, -1, -1, -1, -1, -1, -1, -1, 753, -1, -1, 0, -1, -1, -1, -1, -1, 762, -1, 764, -1, -1, -1, -1, -1, -1, -1, 16, 17, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, 787, 788, -1, -1, -1, 792, 793, 38, -1, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, 56, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, 827, 72, -1, -1, -1, -1, -1, -1, -1, -1, 837, 838, -1, -1, 85, -1, -1, -1, -1, 90, -1, -1, 93, -1, -1, -1, 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, 5, -1, -1, -1, -1, 130, 131, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, 27, 28, -1, -1, 31, 32, 33, 34, -1, 36, 37, -1, -1, 40, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, 58, -1, -1, -1, 62, -1, -1, 65, -1, 67, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, 79, -1, 81, -1, 83, 84, -1, 86, 87, 88, 89, 18, -1, 92, 21, -1, -1, -1, 25, 26, 27, -1, 29, 30, -1, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 42, -1, -1, 45, -1, 47, -1, 49, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 16, 17, -1, -1, -1, -1, 22, 73, -1, 75, 76, 77, -1, -1, 80, 81, 82, -1, -1, -1, -1, 87, 38, -1, -1, 41, 92, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, 56, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, -1, 72, -1, -1, -1, 126, -1, -1, 129, -1, -1, -1, -1, -1, 85, -1, 137, 138, -1, 90, -1, -1, 93, -1, -1, -1, 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, -1, -1, -1, -1, -1, 130, 131, 17, -1, 19, 20, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, -1, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, -1, 72, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, 19, 20, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, -1, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, -1, 72, -1, 74, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, 19, 20, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, -1, 57, -1, 59, -1, 61, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, -1, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, 43, -1, -1, -1, -1, -1, -1, -1, 51, 52, 53, -1, 55, -1, 57, -1, 59, -1, 61, -1, 63, -1, -1, 66, -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 61, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, 17, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, 27, 28, -1, -1, 31, 32, 33, 34, -1, 36, 37, -1, 41, 40, -1, -1, -1, 44, -1, -1, 47, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, 58, 61, -1, -1, 62, -1, -1, 65, -1, 67, -1, -1, 72, -1, -1, -1, -1, 75, -1, -1, -1, 79, -1, 81, -1, 83, 84, -1, 86, 87, 88, 89, -1, -1, 92, -1, -1, 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, 23, -1, 125, -1, -1, -1, -1, -1, 31, 32, 33, -1, -1, 36, 37, -1, -1, 40, -1, -1, -1, 44, -1, -1, -1, -1, -1, 50, -1, -1, -1, 54, -1, -1, -1, 58, -1, -1, -1, 62, -1, -1, 65, -1, 67, -1, -1, -1, -1, -1, -1, -1, 75, -1, -1, -1, 79, -1, 81, -1, 83, 84, -1, -1, 87, 88, 89, -1, -1, 92, -1, -1, -1, -1, 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, 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 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 142, 185, 0, 17, 22, 38, 41, 43, 51, 52, 53, 55, 56, 57, 59, 61, 63, 66, 72, 85, 90, 93, 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, 143, 144, 175, 176, 177, 196, 70, 71, 160, 23, 31, 32, 33, 36, 37, 40, 44, 50, 54, 58, 62, 65, 67, 75, 79, 81, 83, 84, 87, 88, 89, 92, 97, 125, 179, 181, 182, 147, 3, 144, 213, 16, 130, 131, 158, 145, 146, 18, 21, 25, 26, 27, 29, 30, 32, 33, 34, 35, 42, 45, 47, 49, 65, 73, 75, 76, 77, 80, 81, 82, 87, 92, 126, 129, 137, 138, 198, 201, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 129, 132, 150, 162, 150, 158, 150, 150, 133, 163, 75, 75, 163, 75, 163, 75, 163, 163, 163, 163, 163, 75, 75, 163, 163, 163, 163, 163, 163, 202, 163, 163, 163, 203, 163, 163, 75, 30, 32, 33, 77, 81, 82, 87, 90, 92, 148, 149, 198, 199, 201, 5, 66, 175, 177, 184, 3, 3, 5, 3, 21, 25, 26, 29, 35, 42, 126, 197, 19, 20, 39, 66, 74, 175, 177, 178, 183, 5, 3, 4, 7, 8, 159, 167, 3, 3, 176, 3, 3, 48, 68, 69, 70, 71, 91, 127, 128, 161, 151, 182, 7, 11, 12, 13, 14, 15, 159, 171, 172, 173, 174, 163, 163, 174, 163, 174, 163, 174, 174, 174, 174, 174, 163, 163, 174, 174, 134, 164, 174, 174, 174, 163, 174, 174, 174, 163, 174, 174, 163, 163, 163, 163, 163, 163, 200, 163, 3, 163, 5, 199, 177, 5, 3, 3, 3, 175, 178, 175, 177, 178, 175, 178, 5, 162, 162, 162, 162, 162, 162, 162, 162, 174, 174, 162, 174, 162, 174, 162, 162, 162, 162, 162, 174, 174, 162, 162, 135, 165, 162, 162, 164, 174, 205, 206, 162, 162, 162, 205, 162, 164, 162, 174, 174, 174, 174, 174, 174, 163, 174, 174, 5, 175, 7, 11, 12, 159, 171, 173, 173, 7, 9, 10, 11, 12, 159, 168, 164, 164, 7, 9, 10, 11, 12, 159, 169, 164, 167, 164, 168, 168, 168, 166, 167, 167, 164, 164, 169, 167, 135, 129, 152, 213, 174, 167, 165, 162, 164, 174, 169, 174, 164, 5, 165, 168, 164, 162, 162, 162, 162, 162, 205, 164, 162, 3, 178, 162, 165, 165, 162, 162, 162, 162, 162, 162, 162, 165, 162, 165, 164, 164, 164, 164, 162, 165, 165, 162, 162, 23, 27, 28, 31, 32, 33, 34, 36, 37, 47, 54, 65, 75, 81, 84, 86, 87, 88, 89, 92, 125, 153, 179, 186, 187, 164, 162, 152, 206, 165, 162, 162, 164, 165, 164, 152, 162, 165, 168, 168, 166, 174, 174, 164, 165, 168, 3, 168, 152, 152, 7, 9, 10, 11, 12, 159, 7, 159, 166, 169, 152, 167, 152, 165, 165, 165, 165, 167, 152, 152, 166, 169, 167, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 5, 136, 154, 162, 213, 165, 167, 152, 168, 166, 165, 152, 204, 167, 152, 164, 164, 164, 162, 164, 165, 155, 156, 186, 213, 162, 162, 164, 164, 162, 162, 152, 152, 152, 152, 162, 164, 162, 162, 60, 194, 195, 24, 31, 40, 44, 46, 54, 58, 64, 67, 78, 79, 83, 87, 94, 95, 96, 125, 180, 5, 66, 175, 177, 189, 3, 60, 190, 191, 3, 60, 192, 193, 5, 3, 197, 66, 74, 175, 177, 178, 188, 5, 5, 167, 3, 3, 3, 213, 161, 5, 187, 152, 162, 164, 164, 164, 152, 165, 164, 165, 165, 165, 168, 165, 155, 5, 157, 213, 167, 68, 168, 170, 207, 208, 165, 139, 165, 7, 159, 166, 168, 170, 211, 212, 3, 3, 139, 165, 166, 170, 211, 3, 133, 44, 67, 79, 44, 67, 79, 5, 177, 5, 133, 3, 133, 3, 3, 175, 178, 175, 177, 178, 175, 178, 213, 167, 170, 209, 210, 165, 165, 165, 152, 165, 155, 155, 155, 164, 155, 213, 5, 164, 136, 164, 162, 164, 152, 140, 152, 164, 162, 162, 162, 162, 162, 140, 152, 164, 162, 162, 162, 209, 5, 5, 209, 209, 175, 164, 162, 164, 152, 152, 152, 152, 165, 213, 165, 3, 165, 208, 165, 25, 165, 168, 166, 166, 212, 169, 168, 45, 165, 166, 166, 169, 134, 3, 134, 134, 178, 165, 210, 165, 155, 155, 152, 152, 163, 152, 164, 164, 162, 162, 163, 152, 164, 164, 162, 133, 3, 133, 133, 152, 152, 174, 165, 165, 169, 168, 174, 165, 165, 169, 211, 207, 211, 162, 152, 152, 162, 162, 162, 152, 152, 162, 134, 162, 134, 134, 169, 3, 3, 169, 3, 133, 133, 162, 162, 164, 162, 162, 167, 167, 166, 166, 165, 166, 166, 134, 134, 164, 164, 152, 164, 164, 165, 165, 152, 152 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, mkFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; mkFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, mkFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; mkFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, mkFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; mkFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, mkFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; mkFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, mkFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, mkFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; mkFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 7: #line 305 "frame/ds9parser.Y" {cerr << "DS9 Regions File 3.2" << endl;;} break; case 9: #line 308 "frame/ds9parser.Y" {globalTile = (yyvsp[(2) - (2)].integer);;} break; case 10: #line 310 "frame/ds9parser.Y" {globalSystem=(Coord::CoordSystem)(yyvsp[(1) - (1)].integer);;} break; case 12: #line 311 "frame/ds9parser.Y" {globalSystem=globalWCS; globalSky=(Coord::SkyFrame)(yyvsp[(1) - (1)].integer);;} break; case 14: #line 312 "frame/ds9parser.Y" {globalSystem=globalWCS; globalSky=Coord::FK5;;} break; case 21: #line 321 "frame/ds9parser.Y" {globalTile = (yyvsp[(2) - (2)].integer);;} break; case 22: #line 322 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 25: #line 326 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 28: #line 330 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 29: #line 330 "frame/ds9parser.Y" {strncpy(localComment,(yyvsp[(3) - (4)].str),80);;} break; case 31: #line 332 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 32: #line 332 "frame/ds9parser.Y" {strncpy(localComment,(yyvsp[(4) - (5)].str),80);;} break; case 34: #line 336 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 35: #line 336 "frame/ds9parser.Y" {strncpy(localComment,(yyvsp[(2) - (3)].str),80);;} break; case 37: #line 338 "frame/ds9parser.Y" {DISCARD_(1);;} break; case 38: #line 338 "frame/ds9parser.Y" {strncpy(localComment,(yyvsp[(3) - (4)].str),80);;} break; case 41: #line 343 "frame/ds9parser.Y" {YYACCEPT;;} break; case 42: #line 346 "frame/ds9parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 43: #line 347 "frame/ds9parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 44: #line 350 "frame/ds9parser.Y" {yydebug=1;;} break; case 45: #line 351 "frame/ds9parser.Y" {yydebug=0;;} break; case 46: #line 354 "frame/ds9parser.Y" {(yyval.integer)=((yyvsp[(1) - (1)].integer) ? 1 : 0);;} break; case 47: #line 356 "frame/ds9parser.Y" {(yyval.integer)=1;;} break; case 48: #line 357 "frame/ds9parser.Y" {(yyval.integer)=1;;} break; case 49: #line 358 "frame/ds9parser.Y" {(yyval.integer)=1;;} break; case 50: #line 359 "frame/ds9parser.Y" {(yyval.integer)=1;;} break; case 51: #line 361 "frame/ds9parser.Y" {(yyval.integer)=0;;} break; case 52: #line 362 "frame/ds9parser.Y" {(yyval.integer)=0;;} break; case 53: #line 363 "frame/ds9parser.Y" {(yyval.integer)=0;;} break; case 54: #line 364 "frame/ds9parser.Y" {(yyval.integer)=0;;} break; case 61: #line 379 "frame/ds9parser.Y" {cStatus = 0;;} break; case 62: #line 380 "frame/ds9parser.Y" {cStatus = 1;;} break; case 63: #line 381 "frame/ds9parser.Y" {cStatus = 1;;} break; case 64: #line 384 "frame/ds9parser.Y" {(yyval.real) = fr->mapAngleToRef(0,localSystem,localSky);;} break; case 65: #line 385 "frame/ds9parser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 66: #line 388 "frame/ds9parser.Y" {(yyval.real) = fr->mapAngleToRef(degToRad((yyvsp[(1) - (1)].real)),localSystem,localSky);;} break; case 67: #line 389 "frame/ds9parser.Y" {(yyval.real) = fr->mapAngleToRef(degToRad((yyvsp[(1) - (1)].real)),localSystem,localSky);;} break; case 68: #line 390 "frame/ds9parser.Y" {(yyval.real) = fr->mapAngleToRef((yyvsp[(1) - (1)].real),localSystem,localSky);;} break; case 69: #line 393 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), localSystem, Coord::DEGREE);;} break; case 70: #line 394 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::PHYSICAL);;} break; case 71: #line 395 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::IMAGE);;} break; case 72: #line 396 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::DEGREE);;} break; case 73: #line 397 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::ARCMIN);;} break; case 74: #line 398 "frame/ds9parser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::ARCSEC);;} break; case 75: #line 402 "frame/ds9parser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), localSystem, Coord::DEGREE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 76: #line 409 "frame/ds9parser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::PHYSICAL); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 77: #line 416 "frame/ds9parser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 78: #line 423 "frame/ds9parser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::DEGREE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 79: #line 430 "frame/ds9parser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::ARCMIN); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 80: #line 437 "frame/ds9parser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::ARCSEC); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 81: #line 445 "frame/ds9parser.Y" {(yyval.integer) = (yyvsp[(3) - (3)].integer);;} break; case 82: #line 448 "frame/ds9parser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 83: #line 451 "frame/ds9parser.Y" {(yyval.real) = parseHMSStr((yyvsp[(1) - (1)].str));;} break; case 84: #line 454 "frame/ds9parser.Y" {(yyval.real) = parseDMSStr((yyvsp[(1) - (1)].str));;} break; case 85: #line 458 "frame/ds9parser.Y" { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), sys, sky); else r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real)*360./24.,(yyvsp[(3) - (3)].real)), sys, sky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 86: #line 471 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 87: #line 479 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 88: #line 487 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), localSystem, localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 89: #line 494 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 90: #line 502 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 91: #line 509 "frame/ds9parser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::PHYSICAL); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; ;} break; case 92: #line 516 "frame/ds9parser.Y" {(yyval.integer) = Coord::IMAGE;;} break; case 93: #line 517 "frame/ds9parser.Y" {(yyval.integer) = Coord::PHYSICAL;;} break; case 94: #line 518 "frame/ds9parser.Y" {(yyval.integer) = Coord::DETECTOR;;} break; case 95: #line 519 "frame/ds9parser.Y" {(yyval.integer) = Coord::AMPLIFIER;;} break; case 96: #line 520 "frame/ds9parser.Y" {(yyval.integer) = (yyvsp[(1) - (1)].integer); globalWCS = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer);;} break; case 97: #line 523 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCS;;} break; case 98: #line 524 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSA;;} break; case 99: #line 525 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSB;;} break; case 100: #line 526 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSC;;} break; case 101: #line 527 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSD;;} break; case 102: #line 528 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSE;;} break; case 103: #line 529 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSF;;} break; case 104: #line 530 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSG;;} break; case 105: #line 531 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSH;;} break; case 106: #line 532 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSI;;} break; case 107: #line 533 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSJ;;} break; case 108: #line 534 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSK;;} break; case 109: #line 535 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSL;;} break; case 110: #line 536 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSM;;} break; case 111: #line 537 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSN;;} break; case 112: #line 538 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSO;;} break; case 113: #line 539 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSP;;} break; case 114: #line 540 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSQ;;} break; case 115: #line 541 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSR;;} break; case 116: #line 542 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSS;;} break; case 117: #line 543 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCST;;} break; case 118: #line 544 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSU;;} break; case 119: #line 545 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSV;;} break; case 120: #line 546 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSW;;} break; case 121: #line 547 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSX;;} break; case 122: #line 548 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSY;;} break; case 123: #line 549 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCSZ;;} break; case 124: #line 550 "frame/ds9parser.Y" {(yyval.integer) = Coord::WCS0;;} break; case 125: #line 553 "frame/ds9parser.Y" {(yyval.integer) = Coord::FK4;;} break; case 126: #line 554 "frame/ds9parser.Y" {(yyval.integer) = Coord::FK4;;} break; case 127: #line 555 "frame/ds9parser.Y" {(yyval.integer) = Coord::FK4_NO_E;;} break; case 128: #line 556 "frame/ds9parser.Y" {(yyval.integer) = Coord::FK5;;} break; case 129: #line 557 "frame/ds9parser.Y" {(yyval.integer) = Coord::FK5;;} break; case 130: #line 558 "frame/ds9parser.Y" {(yyval.integer) = Coord::ICRS;;} break; case 131: #line 559 "frame/ds9parser.Y" {(yyval.integer) = Coord::GALACTIC;;} break; case 132: #line 560 "frame/ds9parser.Y" {(yyval.integer) = Coord::SUPERGALACTIC;;} break; case 133: #line 561 "frame/ds9parser.Y" {(yyval.integer) = Coord::ECLIPTIC;;} break; case 134: #line 562 "frame/ds9parser.Y" {(yyval.integer) = Coord::HELIOECLIPTIC;;} break; case 135: #line 565 "frame/ds9parser.Y" {(yyval.integer)=Coord::DEGREE;;} break; case 136: #line 566 "frame/ds9parser.Y" {(yyval.integer)=Coord::ARCMIN;;} break; case 137: #line 567 "frame/ds9parser.Y" {(yyval.integer)=Coord::ARCSEC;;} break; case 138: #line 570 "frame/ds9parser.Y" {(yyval.integer) = Marker::SELECT;;} break; case 139: #line 571 "frame/ds9parser.Y" {(yyval.integer) = Marker::HIGHLITE;;} break; case 140: #line 572 "frame/ds9parser.Y" {(yyval.integer) = Marker::DASH;;} break; case 141: #line 573 "frame/ds9parser.Y" {(yyval.integer) = Marker::FIXED;;} break; case 142: #line 574 "frame/ds9parser.Y" {(yyval.integer) = Marker::EDIT;;} break; case 143: #line 575 "frame/ds9parser.Y" {(yyval.integer) = Marker::MOVE;;} break; case 144: #line 576 "frame/ds9parser.Y" {(yyval.integer) = Marker::ROTATE;;} break; case 145: #line 577 "frame/ds9parser.Y" {(yyval.integer) = Marker::DELETE;;} break; case 146: #line 578 "frame/ds9parser.Y" {(yyval.integer) = Marker::INCLUDE;;} break; case 147: #line 579 "frame/ds9parser.Y" {(yyval.integer) = Marker::SOURCE;;} break; case 148: #line 582 "frame/ds9parser.Y" {(yyval.integer) = CallBack::SELECTCB;;} break; case 149: #line 583 "frame/ds9parser.Y" {(yyval.integer) = CallBack::UNSELECTCB;;} break; case 150: #line 584 "frame/ds9parser.Y" {(yyval.integer) = CallBack::HIGHLITECB;;} break; case 151: #line 585 "frame/ds9parser.Y" {(yyval.integer) = CallBack::UNHIGHLITECB;;} break; case 152: #line 586 "frame/ds9parser.Y" {(yyval.integer) = CallBack::MOVEBEGINCB;;} break; case 153: #line 587 "frame/ds9parser.Y" {(yyval.integer) = CallBack::MOVECB;;} break; case 154: #line 588 "frame/ds9parser.Y" {(yyval.integer) = CallBack::MOVEENDCB;;} break; case 155: #line 589 "frame/ds9parser.Y" {(yyval.integer) = CallBack::EDITBEGINCB;;} break; case 156: #line 590 "frame/ds9parser.Y" {(yyval.integer) = CallBack::EDITCB;;} break; case 157: #line 591 "frame/ds9parser.Y" {(yyval.integer) = CallBack::EDITENDCB;;} break; case 158: #line 592 "frame/ds9parser.Y" {(yyval.integer) = CallBack::ROTATEBEGINCB;;} break; case 159: #line 593 "frame/ds9parser.Y" {(yyval.integer) = CallBack::ROTATECB;;} break; case 160: #line 594 "frame/ds9parser.Y" {(yyval.integer) = CallBack::ROTATEENDCB;;} break; case 161: #line 595 "frame/ds9parser.Y" {(yyval.integer) = CallBack::DELETECB;;} break; case 162: #line 596 "frame/ds9parser.Y" {(yyval.integer) = CallBack::TEXTCB;;} break; case 163: #line 597 "frame/ds9parser.Y" {(yyval.integer) = CallBack::COLORCB;;} break; case 164: #line 598 "frame/ds9parser.Y" {(yyval.integer) = CallBack::LINEWIDTHCB;;} break; case 165: #line 599 "frame/ds9parser.Y" {(yyval.integer) = CallBack::PROPERTYCB;;} break; case 166: #line 600 "frame/ds9parser.Y" {(yyval.integer) = CallBack::FONTCB;;} break; case 167: #line 601 "frame/ds9parser.Y" {(yyval.integer) = CallBack::KEYCB;;} break; case 168: #line 602 "frame/ds9parser.Y" {(yyval.integer) = CallBack::UPDATECB;;} break; case 171: #line 610 "frame/ds9parser.Y" { setProps(&globalProps,(yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer)); setProps(&localProps,(yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer)); ;} break; case 172: #line 615 "frame/ds9parser.Y" { strncpy(globalColor,(yyvsp[(3) - (3)].str),16); strncpy(localColor,(yyvsp[(3) - (3)].str),16); ;} break; case 173: #line 620 "frame/ds9parser.Y" { globalDash[0] = localDash[0] =(yyvsp[(3) - (4)].integer); globalDash[1] = localDash[1] =(yyvsp[(4) - (4)].integer); ;} break; case 174: #line 624 "frame/ds9parser.Y" {globalWidth = localWidth = (yyvsp[(3) - (3)].integer);;} break; case 175: #line 626 "frame/ds9parser.Y" { strncpy(globalFont,(yyvsp[(3) - (3)].str),32); strncpy(localFont,(yyvsp[(3) - (3)].str),32); ;} break; case 176: #line 631 "frame/ds9parser.Y" { strncpy(globalText,(yyvsp[(3) - (3)].str),80); strncpy(localText,(yyvsp[(3) - (3)].str),80); ;} break; case 177: #line 636 "frame/ds9parser.Y" { setProps(&globalProps,Marker::DASH,1); setProps(&localProps,Marker::DASH,1); ;} break; case 178: #line 641 "frame/ds9parser.Y" { setProps(&globalProps,Marker::SOURCE,1); setProps(&localProps,Marker::SOURCE,1); ;} break; case 179: #line 646 "frame/ds9parser.Y" { setProps(&globalProps,Marker::SOURCE,0); setProps(&localProps,Marker::SOURCE,0); ;} break; case 180: #line 650 "frame/ds9parser.Y" {globalPoint = localPoint = (yyvsp[(3) - (3)].integer);;} break; case 181: #line 652 "frame/ds9parser.Y" { globalPoint = localPoint = (yyvsp[(3) - (4)].integer); globalPointSize = localPointSize = (yyvsp[(4) - (4)].integer); ;} break; case 182: #line 657 "frame/ds9parser.Y" { globalLine1 = localLine1 = (yyvsp[(3) - (4)].integer); globalLine2 = localLine2 = (yyvsp[(4) - (4)].integer); ;} break; case 183: #line 661 "frame/ds9parser.Y" {globalVector = localVector = (yyvsp[(3) - (3)].integer);;} break; case 184: #line 663 "frame/ds9parser.Y" { globalComposite = localComposite = (yyvsp[(3) - (3)].integer); ;} break; case 185: #line 666 "frame/ds9parser.Y" {;} break; case 186: #line 668 "frame/ds9parser.Y" { strncpy(globalCompassNorth,(yyvsp[(4) - (7)].str),80); strncpy(globalCompassEast,(yyvsp[(5) - (7)].str),80); strncpy(localCompassNorth,(yyvsp[(4) - (7)].str),80); strncpy(localCompassEast,(yyvsp[(5) - (7)].str),80); globalCompassNArrow = localCompassNArrow = (yyvsp[(6) - (7)].integer); globalCompassEArrow = localCompassEArrow = (yyvsp[(7) - (7)].integer); ;} break; case 187: #line 676 "frame/ds9parser.Y" {globalTextAngle = localTextAngle = (yyvsp[(3) - (3)].real);;} break; case 188: #line 677 "frame/ds9parser.Y" {globalTextRotate = localTextRotate = (yyvsp[(3) - (3)].integer);;} break; case 189: #line 678 "frame/ds9parser.Y" {globalWCS = (Coord::CoordSystem)(yyvsp[(3) - (3)].integer);;} break; case 190: #line 682 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (4)].integer); globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(2) - (4)].integer); globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(3) - (4)].integer); globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)(yyvsp[(4) - (4)].integer); ;} break; case 191: #line 689 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; ;} break; case 192: #line 696 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 193: #line 703 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (2)].integer); globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; ;} break; case 194: #line 710 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (2)].integer); globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 195: #line 717 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; ;} break; case 196: #line 724 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 197: #line 731 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::IMAGE; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)(yyvsp[(1) - (1)].integer); ;} break; case 198: #line 738 "frame/ds9parser.Y" { globalRulerCoordSystem = localRulerCoordSystem = Coord::IMAGE; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::IMAGE; globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; ;} break; case 199: #line 747 "frame/ds9parser.Y" { globalCompassCoordSystem = localCompassCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); globalCompassSkyFrame = localCompassSkyFrame = (Coord::SkyFrame)(yyvsp[(2) - (2)].integer); ;} break; case 200: #line 752 "frame/ds9parser.Y" { globalCompassCoordSystem = localCompassCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer); globalCompassSkyFrame = localCompassSkyFrame = Coord::FK5; ;} break; case 201: #line 757 "frame/ds9parser.Y" { globalCompassCoordSystem = localCompassCoordSystem = Coord::WCS; globalCompassSkyFrame = localCompassSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (1)].integer); ;} break; case 202: #line 762 "frame/ds9parser.Y" { globalCompassCoordSystem = localCompassCoordSystem = Coord::WCS; globalCompassSkyFrame = localCompassSkyFrame = Coord::FK5; ;} break; case 203: #line 768 "frame/ds9parser.Y" { // global properties globalSystem = Coord::PHYSICAL; globalWCS = fr->wcsSystem(); globalSky = fr->wcsSky(); globalTile = 1; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; strcpy(globalColor,"green"); globalDash[0] = 8; globalDash[1] = 3; globalWidth = 1; strcpy(globalFont,"helvetica 10 normal roman"); strcpy(globalText,""); // unique properties globalLine1 = 0; globalLine2 = 0; globalVector = 1; globalComposite = 1; globalRulerCoordSystem = Coord::PHYSICAL; globalRulerSkyFrame = Coord::FK5; globalRulerDistSystem = Coord::PHYSICAL; globalRulerDistFormat = Coord::DEGREE; globalCompassCoordSystem = Coord::PHYSICAL; globalCompassSkyFrame = Coord::FK5; strcpy(globalCompassNorth,"N"); strcpy(globalCompassEast,"E"); globalCompassNArrow = 1; globalCompassEArrow = 1; globalPoint = Point::BOXCIRCLE; globalPointSize = POINTSIZE; globalTextAngle=0; globalTextRotate=1; aStatus = 0; cStatus = 0; ;} break; case 206: #line 814 "frame/ds9parser.Y" {setProps(&localProps,(yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 207: #line 815 "frame/ds9parser.Y" {strncpy(localColor,(yyvsp[(3) - (3)].str),16);;} break; case 208: #line 817 "frame/ds9parser.Y" { localDash[0] =(yyvsp[(3) - (4)].integer); localDash[1] =(yyvsp[(4) - (4)].integer); ;} break; case 209: #line 821 "frame/ds9parser.Y" {localWidth = (yyvsp[(3) - (3)].integer);;} break; case 210: #line 822 "frame/ds9parser.Y" {strncpy(localFont,(yyvsp[(3) - (3)].str),32);;} break; case 211: #line 823 "frame/ds9parser.Y" {strncpy(localText,(yyvsp[(3) - (3)].str),80);;} break; case 212: #line 824 "frame/ds9parser.Y" {taglist.append(new Tag((yyvsp[(3) - (3)].str)));;} break; case 213: #line 825 "frame/ds9parser.Y" {cblist.append( new CallBack(fr->getInterp(),(CallBack::Type)(yyvsp[(3) - (5)].integer),(yyvsp[(4) - (5)].str),(yyvsp[(5) - (5)].str)));;} break; case 214: #line 827 "frame/ds9parser.Y" {setProps(&localProps,Marker::DASH,1);;} break; case 215: #line 828 "frame/ds9parser.Y" {setProps(&localProps,Marker::SOURCE,1);;} break; case 216: #line 829 "frame/ds9parser.Y" {setProps(&localProps,Marker::SOURCE,0);;} break; case 217: #line 831 "frame/ds9parser.Y" {localPoint = (yyvsp[(3) - (3)].integer);;} break; case 218: #line 832 "frame/ds9parser.Y" {localPoint = (yyvsp[(3) - (4)].integer); localPointSize = (yyvsp[(4) - (4)].integer);;} break; case 219: #line 833 "frame/ds9parser.Y" {localLine1=(yyvsp[(3) - (4)].integer); localLine2=(yyvsp[(4) - (4)].integer);;} break; case 220: #line 834 "frame/ds9parser.Y" {localVector=(yyvsp[(3) - (3)].integer);;} break; case 221: #line 835 "frame/ds9parser.Y" {localComposite=(yyvsp[(3) - (3)].integer);;} break; case 223: #line 838 "frame/ds9parser.Y" { strncpy(localCompassNorth,(yyvsp[(4) - (7)].str),80); strncpy(localCompassEast,(yyvsp[(5) - (7)].str),80); localCompassNArrow = (yyvsp[(6) - (7)].integer); localCompassEArrow = (yyvsp[(7) - (7)].integer); ;} break; case 224: #line 844 "frame/ds9parser.Y" {localTextAngle=(yyvsp[(3) - (3)].real);;} break; case 225: #line 845 "frame/ds9parser.Y" {localTextRotate=(yyvsp[(3) - (3)].integer);;} break; case 229: #line 852 "frame/ds9parser.Y" { localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (4)].integer); localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(2) - (4)].integer); localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(3) - (4)].integer); localRulerDistFormat = (Coord::SkyDist)(yyvsp[(4) - (4)].integer); ;} break; case 230: #line 859 "frame/ds9parser.Y" { localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); localRulerSkyFrame = Coord::FK5; localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); localRulerDistFormat = Coord::DEGREE; ;} break; case 231: #line 866 "frame/ds9parser.Y" { localRulerCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 232: #line 873 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (2)].integer); localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); localRulerDistFormat = Coord::DEGREE; ;} break; case 233: #line 880 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (2)].integer); localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 234: #line 887 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = (Coord::CoordSystem)(yyvsp[(2) - (2)].integer); localRulerDistFormat = Coord::DEGREE; ;} break; case 235: #line 894 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)(yyvsp[(2) - (2)].integer); ;} break; case 236: #line 901 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::IMAGE; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)(yyvsp[(1) - (1)].integer); ;} break; case 237: #line 908 "frame/ds9parser.Y" { localRulerCoordSystem = Coord::IMAGE; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::IMAGE; localRulerDistFormat = Coord::DEGREE; ;} break; case 238: #line 917 "frame/ds9parser.Y" { localCompassCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); localCompassSkyFrame = (Coord::SkyFrame)(yyvsp[(2) - (2)].integer); ;} break; case 239: #line 922 "frame/ds9parser.Y" { localCompassCoordSystem = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer); localCompassSkyFrame = Coord::FK5; ;} break; case 240: #line 927 "frame/ds9parser.Y" { localCompassCoordSystem = Coord::WCS; localCompassSkyFrame = (Coord::SkyFrame)(yyvsp[(1) - (1)].integer); ;} break; case 241: #line 932 "frame/ds9parser.Y" { localCompassCoordSystem = Coord::WCS; localCompassSkyFrame = Coord::FK5; ;} break; case 242: #line 938 "frame/ds9parser.Y" {aNum=0; aAngNum=0;;} break; case 243: #line 938 "frame/ds9parser.Y" {localCpanda = 2;;} break; case 244: #line 939 "frame/ds9parser.Y" {localCpanda=0;;} break; case 245: #line 942 "frame/ds9parser.Y" {aNum=0; aAngNum=0, aAngle=0;;} break; case 246: #line 943 "frame/ds9parser.Y" {aAngle=(yyvsp[(9) - (10)].real);localEpanda=2;;} break; case 247: #line 944 "frame/ds9parser.Y" {localEpanda=0;;} break; case 248: #line 947 "frame/ds9parser.Y" {aNum=0; aAngNum=0, aAngle=0;;} break; case 249: #line 948 "frame/ds9parser.Y" {aAngle=(yyvsp[(9) - (10)].real);localBpanda=2;;} break; case 250: #line 949 "frame/ds9parser.Y" {localBpanda=0;;} break; case 251: #line 952 "frame/ds9parser.Y" { // reset maperr flag maperr = 0; // needed for annulus, ellipse annulus, and box annulus aNum = 2; // composite (previous conjuction found?) if (!cStatus) fr->resetCompositeMarker(); // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localColor,globalColor); localDash[0] = globalDash[0]; localDash[1] = globalDash[1]; localWidth = globalWidth; strcpy(localFont,globalFont); strcpy(localText,globalText); strcpy(localComment,""); taglist.deleteAll(); cblist.deleteAll(); // unique properties localLine1 = globalLine1; localLine2 = globalLine2; localVector = globalVector; localComposite = globalComposite; localPoint = globalPoint; localPointSize = globalPointSize; localRulerCoordSystem = globalRulerCoordSystem; localRulerSkyFrame = globalRulerSkyFrame; localRulerDistSystem = globalRulerDistSystem; localRulerDistFormat = globalRulerDistFormat; localCompassCoordSystem = globalCompassCoordSystem; localCompassSkyFrame = globalCompassSkyFrame; strcpy(localCompassNorth,globalCompassNorth); strcpy(localCompassEast,globalCompassEast); localCompassNArrow = globalCompassNArrow; localCompassEArrow = globalCompassEArrow; localTextAngle = globalTextAngle; localTextRotate = globalTextRotate; localCpanda = 1; localEpanda = 1; localBpanda = 1; ;} break; case 252: #line 1001 "frame/ds9parser.Y" {(yyval.integer) = Point::CIRCLE;;} break; case 253: #line 1002 "frame/ds9parser.Y" {(yyval.integer) = Point::BOX;;} break; case 254: #line 1003 "frame/ds9parser.Y" {(yyval.integer) = Point::DIAMOND;;} break; case 255: #line 1004 "frame/ds9parser.Y" {(yyval.integer) = Point::CROSS;;} break; case 256: #line 1005 "frame/ds9parser.Y" {(yyval.integer) = Point::EX;;} break; case 257: #line 1006 "frame/ds9parser.Y" {(yyval.integer) = Point::ARROW;;} break; case 258: #line 1007 "frame/ds9parser.Y" {(yyval.integer) = Point::BOXCIRCLE;;} break; case 259: #line 1010 "frame/ds9parser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 260: #line 1011 "frame/ds9parser.Y" {setProps(&localProps, Marker::INCLUDE, 0);;} break; case 261: #line 1015 "frame/ds9parser.Y" { fr->createVectCmd(Vector((yyvsp[(3) - (10)].vector)), (yyvsp[(5) - (10)].real),(yyvsp[(7) - (10)].real), localVector, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 262: #line 1022 "frame/ds9parser.Y" {polylist.deleteAll();;} break; case 263: #line 1024 "frame/ds9parser.Y" { fr->createSegmentCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 264: #line 1030 "frame/ds9parser.Y" { fr->createTextCmd(Vector((yyvsp[(3) - (6)].vector)), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 265: #line 1037 "frame/ds9parser.Y" { fr->createRulerCmd(Vector((yyvsp[(3) - (8)].vector)), Vector((yyvsp[(5) - (8)].vector)), localRulerCoordSystem, localRulerSkyFrame, localRulerDistSystem, localRulerDistFormat, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 266: #line 1046 "frame/ds9parser.Y" { fr->createCompassCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localCompassNorth, localCompassEast, localCompassNArrow, localCompassEArrow, localCompassCoordSystem, localCompassSkyFrame, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 267: #line 1056 "frame/ds9parser.Y" { fr->createProjectionCmd(Vector((yyvsp[(3) - (10)].vector)), Vector((yyvsp[(5) - (10)].vector)), (yyvsp[(7) - (10)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 268: #line 1064 "frame/ds9parser.Y" { // backward compatibility fr->createCircleCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 269: #line 1072 "frame/ds9parser.Y" { fr->createCompositeCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localComposite, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 270: #line 1081 "frame/ds9parser.Y" { fr->createCircleCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 271: #line 1088 "frame/ds9parser.Y" { // backwards compatibility fr->createCircleCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 272: #line 1096 "frame/ds9parser.Y" { // for ellipse annulus aStatus = 1; aCenter = Vector((yyvsp[(3) - (10)].vector)); aAngles[0] = (yyvsp[(7) - (10)].real); aVector[0] = Vector((yyvsp[(5) - (10)].vector)); aNumsao = 1; strncpy(aColor,localColor,16); aDash[0] = localDash[0]; aDash[1] = localDash[1]; aWidth = localWidth; strncpy(aFont,localFont,32); strncpy(aText,localText,80); strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector((yyvsp[(3) - (10)].vector)), Vector((yyvsp[(5) - (10)].vector)), (yyvsp[(7) - (10)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 273: #line 1119 "frame/ds9parser.Y" { // for box annulus aStatus = 3; aCenter = Vector((yyvsp[(3) - (10)].vector)); aAngles[0] = (yyvsp[(7) - (10)].real); aVector[0] = Vector((yyvsp[(5) - (10)].vector)); aNumsao = 1; strncpy(aColor,localColor,16); aDash[0] = localDash[0]; aDash[1] = localDash[1]; aWidth = localWidth; strncpy(aFont,localFont,32); strncpy(aText,localText,80); strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector((yyvsp[(3) - (10)].vector)), Vector((yyvsp[(5) - (10)].vector)), (yyvsp[(7) - (10)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 274: #line 1142 "frame/ds9parser.Y" { // backwards compatibility fr->createBoxCmd(Vector((yyvsp[(3) - (10)].vector)), Vector((yyvsp[(5) - (10)].vector)), (yyvsp[(7) - (10)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 275: #line 1150 "frame/ds9parser.Y" {polylist.deleteAll();;} break; case 276: #line 1152 "frame/ds9parser.Y" { fr->createPolygonCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 277: #line 1157 "frame/ds9parser.Y" {polylist.deleteAll();;} break; case 278: #line 1159 "frame/ds9parser.Y" { fr->createSegmentCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 279: #line 1166 "frame/ds9parser.Y" { fr->createLineCmd(Vector((yyvsp[(3) - (8)].vector)), Vector((yyvsp[(5) - (8)].vector)), localLine1,localLine2, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 280: #line 1174 "frame/ds9parser.Y" { fr->createVectCmd(Vector((yyvsp[(3) - (10)].vector)), (yyvsp[(5) - (10)].real),(yyvsp[(7) - (10)].real), localVector, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 281: #line 1182 "frame/ds9parser.Y" { fr->createTextCmd(Vector((yyvsp[(3) - (6)].vector)), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 282: #line 1188 "frame/ds9parser.Y" {strncpy(localText,(yyvsp[(5) - (6)].str),80);;} break; case 283: #line 1190 "frame/ds9parser.Y" { fr->createTextCmd(Vector((yyvsp[(3) - (9)].vector)), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 284: #line 1197 "frame/ds9parser.Y" { fr->createPointCmd(Vector((yyvsp[(3) - (6)].vector)), (Point::PointShape)localPoint, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 285: #line 1204 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::CIRCLE, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 286: #line 1211 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::BOX, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 287: #line 1218 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::DIAMOND, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 288: #line 1225 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::CROSS, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 289: #line 1232 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::EX, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 290: #line 1239 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::ARROW, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 291: #line 1246 "frame/ds9parser.Y" { // backwards compatibility fr->createPointCmd(Vector((yyvsp[(4) - (7)].vector)), Point::BOXCIRCLE, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 292: #line 1253 "frame/ds9parser.Y" { fr->createRulerCmd(Vector((yyvsp[(3) - (8)].vector)), Vector((yyvsp[(5) - (8)].vector)), localRulerCoordSystem, localRulerSkyFrame, localRulerDistSystem, localRulerDistFormat, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 293: #line 1262 "frame/ds9parser.Y" { fr->createCompassCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localCompassNorth, localCompassEast, localCompassNArrow, localCompassEArrow, localCompassCoordSystem, localCompassSkyFrame, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 294: #line 1272 "frame/ds9parser.Y" { fr->createProjectionCmd(Vector((yyvsp[(3) - (10)].vector)), Vector((yyvsp[(5) - (10)].vector)), (yyvsp[(7) - (10)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 295: #line 1280 "frame/ds9parser.Y" { fr->createAnnulusCmd(Vector((yyvsp[(3) - (10)].vector)), (yyvsp[(5) - (10)].real),(yyvsp[(7) - (10)].real),1, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 296: #line 1288 "frame/ds9parser.Y" { aAnnuli[0] = (yyvsp[(5) - (12)].real); aAnnuli[1] = (yyvsp[(7) - (12)].real); fr->createAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), aNum,aAnnuli, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 297: #line 1298 "frame/ds9parser.Y" { fr->createAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), (yyvsp[(5) - (12)].real),(yyvsp[(7) - (12)].real),(yyvsp[(9) - (12)].integer), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 298: #line 1306 "frame/ds9parser.Y" { // prefered syntax fr->createEllipseAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), Vector((yyvsp[(5) - (12)].vector)),Vector((yyvsp[(7) - (12)].vector)),1, (yyvsp[(9) - (12)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 299: #line 1316 "frame/ds9parser.Y" { // prefered syntax fr->createEllipseAnnulusCmd(Vector((yyvsp[(3) - (14)].vector)), Vector((yyvsp[(5) - (14)].vector)),Vector((yyvsp[(7) - (14)].vector)),(yyvsp[(9) - (14)].integer), (yyvsp[(11) - (14)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 300: #line 1326 "frame/ds9parser.Y" { // prefered syntax aVector[0] = Vector((yyvsp[(5) - (14)].vector)); aVector[1] = Vector((yyvsp[(7) - (14)].vector)); fr->createEllipseAnnulusCmd(Vector((yyvsp[(3) - (14)].vector)), aNum,aVector, (yyvsp[(11) - (14)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 301: #line 1338 "frame/ds9parser.Y" { // backwards compatibility // old saoimage syntax aStatus = 2; aVector[aNumsao++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 302: #line 1346 "frame/ds9parser.Y" { // prefered syntax fr->createBoxAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), Vector((yyvsp[(5) - (12)].vector)),Vector((yyvsp[(7) - (12)].vector)),1, (yyvsp[(9) - (12)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 303: #line 1356 "frame/ds9parser.Y" { // prefered syntax aVector[0] = Vector((yyvsp[(5) - (14)].vector)); aVector[1] = Vector((yyvsp[(7) - (14)].vector)); fr->createBoxAnnulusCmd(Vector((yyvsp[(3) - (14)].vector)), aNum,aVector, (yyvsp[(11) - (14)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 304: #line 1368 "frame/ds9parser.Y" { // prefered syntax fr->createBoxAnnulusCmd(Vector((yyvsp[(3) - (14)].vector)), Vector((yyvsp[(5) - (14)].vector)),Vector((yyvsp[(7) - (14)].vector)),(yyvsp[(9) - (14)].integer), (yyvsp[(11) - (14)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 305: #line 1378 "frame/ds9parser.Y" { // backwards compatibility // old saoimage syntax aStatus = 4; aVector[aNumsao++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 306: #line 1387 "frame/ds9parser.Y" { switch (localCpanda) { case 0: /* ignore it */ break; case 1: /* normal cpanda */ fr->createCpandaCmd(Vector((yyvsp[(3) - (18)].vector)), (yyvsp[(5) - (18)].real),(yyvsp[(7) - (18)].real),(yyvsp[(9) - (18)].integer), (yyvsp[(11) - (18)].real),(yyvsp[(13) - (18)].real),(yyvsp[(15) - (18)].integer), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createCpandaCmd(Vector((yyvsp[(3) - (18)].vector)), aAngNum,aAngles, aNum,aAnnuli, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } ;} break; case 307: #line 1409 "frame/ds9parser.Y" { switch (localEpanda) { case 0: /* ignore it */ break; case 1: /* normal epanda */ fr->createEpandaCmd(Vector((yyvsp[(3) - (20)].vector)), (yyvsp[(5) - (20)].real),(yyvsp[(7) - (20)].real),(yyvsp[(9) - (20)].integer), Vector((yyvsp[(11) - (20)].vector)),Vector((yyvsp[(13) - (20)].vector)),(yyvsp[(15) - (20)].integer), (yyvsp[(17) - (20)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createEpandaCmd(Vector((yyvsp[(3) - (20)].vector)), aAngNum,aAngles, aNum,aVector, aAngle, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } ;} break; case 308: #line 1433 "frame/ds9parser.Y" { switch (localBpanda) { case 0: /* ignore it */ break; case 1: /* normal bpanda */ fr->createBpandaCmd(Vector((yyvsp[(3) - (20)].vector)), (yyvsp[(5) - (20)].real),(yyvsp[(7) - (20)].real),(yyvsp[(9) - (20)].integer), Vector((yyvsp[(11) - (20)].vector)),Vector((yyvsp[(13) - (20)].vector)),(yyvsp[(15) - (20)].integer), (yyvsp[(17) - (20)].real), localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createBpandaCmd(Vector((yyvsp[(3) - (20)].vector)), aAngNum,aAngles, aNum,aVector, aAngle, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } ;} break; case 313: #line 1463 "frame/ds9parser.Y" { fr->createCompositeCmd(Vector((yyvsp[(3) - (8)].vector)), (yyvsp[(5) - (8)].real), localComposite, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); ;} break; case 316: #line 1475 "frame/ds9parser.Y" {polylist.append(new Vertex((yyvsp[(1) - (1)].vector)));;} break; case 319: #line 1483 "frame/ds9parser.Y" { if (aNum < MAXANNULI) aAnnuli[aNum++] = (yyvsp[(1) - (1)].real); ;} break; case 322: #line 1494 "frame/ds9parser.Y" { if (aAngNum < MAXANGLES) aAngles[aAngNum++] = (yyvsp[(1) - (1)].real); ;} break; case 325: #line 1504 "frame/ds9parser.Y" {aVector[aNum++] = Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 326: #line 1508 "frame/ds9parser.Y" { // old style annulus switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNumsao,aVector, aAngles[0], aColor,aDash,aWidth,aFont,aText,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNumsao,aVector, aAngles[0], aColor,aDash,aWidth,aFont,aText,aProps,aComment,taglist,cblist); break; } aStatus = 0; ;} break; /* Line 1267 of yacc.c. */ #line 4893 "frame/ds9parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 1535 "frame/ds9parser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/ds9parser.H000644 000765 000000 00000015736 12553253015 017060 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, COLOR = 261, ANGDEGREE = 262, ANGRADIAN = 263, ARCMINUTE = 264, ARCSECOND = 265, PHYCOORD = 266, IMGCOORD = 267, SEXSTR = 268, HMSSTR = 269, DMSSTR = 270, EOF_ = 271, AMPLIFIER_ = 272, ANNULUS_ = 273, ARCMIN_ = 274, ARCSEC_ = 275, ARROW_ = 276, B1950_ = 277, BACKGROUND_ = 278, BEGIN_ = 279, BOX_ = 280, BOXCIRCLE_ = 281, BPANDA_ = 282, CALLBACK_ = 283, CIRCLE_ = 284, CIRCLE3D_ = 285, COLOR_ = 286, COMPASS_ = 287, COMPOSITE_ = 288, CPANDA_ = 289, CROSS_ = 290, DASH_ = 291, DASHLIST_ = 292, DEBUG_ = 293, DEGREES_ = 294, DELETE_ = 295, DETECTOR_ = 296, DIAMOND_ = 297, ECLIPTIC_ = 298, EDIT_ = 299, ELLIPSE_ = 300, END_ = 301, EPANDA_ = 302, FALSE_ = 303, FIELD_ = 304, FIXED_ = 305, FK4_ = 306, FK4_NO_E_ = 307, FK5_ = 308, FONT_ = 309, GALACTIC_ = 310, GLOBAL_ = 311, HELIOECLIPTIC_ = 312, HIGHLITE_ = 313, ICRS_ = 314, IGNORE_ = 315, IMAGE_ = 316, INCLUDE_ = 317, J2000_ = 318, KEY_ = 319, LINE_ = 320, LINEAR_ = 321, MOVE_ = 322, N_ = 323, NO_ = 324, OFF_ = 325, ON_ = 326, PHYSICAL_ = 327, PIE_ = 328, PIXELS_ = 329, POINT_ = 330, POLYGON_ = 331, PROJECTION_ = 332, PROPERTY_ = 333, ROTATE_ = 334, ROTBOX_ = 335, RULER_ = 336, SEGMENT_ = 337, SELECT_ = 338, SOURCE_ = 339, SUPERGALACTIC_ = 340, TAG_ = 341, TEXT_ = 342, TEXTANGLE_ = 343, TEXTROTATE_ = 344, TILE_ = 345, TRUE_ = 346, VECTOR_ = 347, VERSION_ = 348, UNHIGHLITE_ = 349, UNSELECT_ = 350, UPDATE_ = 351, WCS_ = 352, WCSA_ = 353, WCSB_ = 354, WCSC_ = 355, WCSD_ = 356, WCSE_ = 357, WCSF_ = 358, WCSG_ = 359, WCSH_ = 360, WCSI_ = 361, WCSJ_ = 362, WCSK_ = 363, WCSL_ = 364, WCSM_ = 365, WCSN_ = 366, WCSO_ = 367, WCSP_ = 368, WCSQ_ = 369, WCSR_ = 370, WCSS_ = 371, WCST_ = 372, WCSU_ = 373, WCSV_ = 374, WCSW_ = 375, WCSX_ = 376, WCSY_ = 377, WCSZ_ = 378, WCS0_ = 379, WIDTH_ = 380, X_ = 381, Y_ = 382, YES_ = 383 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define COLOR 261 #define ANGDEGREE 262 #define ANGRADIAN 263 #define ARCMINUTE 264 #define ARCSECOND 265 #define PHYCOORD 266 #define IMGCOORD 267 #define SEXSTR 268 #define HMSSTR 269 #define DMSSTR 270 #define EOF_ 271 #define AMPLIFIER_ 272 #define ANNULUS_ 273 #define ARCMIN_ 274 #define ARCSEC_ 275 #define ARROW_ 276 #define B1950_ 277 #define BACKGROUND_ 278 #define BEGIN_ 279 #define BOX_ 280 #define BOXCIRCLE_ 281 #define BPANDA_ 282 #define CALLBACK_ 283 #define CIRCLE_ 284 #define CIRCLE3D_ 285 #define COLOR_ 286 #define COMPASS_ 287 #define COMPOSITE_ 288 #define CPANDA_ 289 #define CROSS_ 290 #define DASH_ 291 #define DASHLIST_ 292 #define DEBUG_ 293 #define DEGREES_ 294 #define DELETE_ 295 #define DETECTOR_ 296 #define DIAMOND_ 297 #define ECLIPTIC_ 298 #define EDIT_ 299 #define ELLIPSE_ 300 #define END_ 301 #define EPANDA_ 302 #define FALSE_ 303 #define FIELD_ 304 #define FIXED_ 305 #define FK4_ 306 #define FK4_NO_E_ 307 #define FK5_ 308 #define FONT_ 309 #define GALACTIC_ 310 #define GLOBAL_ 311 #define HELIOECLIPTIC_ 312 #define HIGHLITE_ 313 #define ICRS_ 314 #define IGNORE_ 315 #define IMAGE_ 316 #define INCLUDE_ 317 #define J2000_ 318 #define KEY_ 319 #define LINE_ 320 #define LINEAR_ 321 #define MOVE_ 322 #define N_ 323 #define NO_ 324 #define OFF_ 325 #define ON_ 326 #define PHYSICAL_ 327 #define PIE_ 328 #define PIXELS_ 329 #define POINT_ 330 #define POLYGON_ 331 #define PROJECTION_ 332 #define PROPERTY_ 333 #define ROTATE_ 334 #define ROTBOX_ 335 #define RULER_ 336 #define SEGMENT_ 337 #define SELECT_ 338 #define SOURCE_ 339 #define SUPERGALACTIC_ 340 #define TAG_ 341 #define TEXT_ 342 #define TEXTANGLE_ 343 #define TEXTROTATE_ 344 #define TILE_ 345 #define TRUE_ 346 #define VECTOR_ 347 #define VERSION_ 348 #define UNHIGHLITE_ 349 #define UNSELECT_ 350 #define UPDATE_ 351 #define WCS_ 352 #define WCSA_ 353 #define WCSB_ 354 #define WCSC_ 355 #define WCSD_ 356 #define WCSE_ 357 #define WCSF_ 358 #define WCSG_ 359 #define WCSH_ 360 #define WCSI_ 361 #define WCSJ_ 362 #define WCSK_ 363 #define WCSL_ 364 #define WCSM_ 365 #define WCSN_ 366 #define WCSO_ 367 #define WCSP_ 368 #define WCSQ_ 369 #define WCSR_ 370 #define WCSS_ 371 #define WCST_ 372 #define WCSU_ 373 #define WCSV_ 374 #define WCSW_ 375 #define WCSX_ 376 #define WCSY_ 377 #define WCSZ_ 378 #define WCS0_ 379 #define WIDTH_ 380 #define X_ 381 #define Y_ 382 #define YES_ 383 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 135 "frame/ds9parser.Y" { #define MKBUFSIZE 2048 double real; int integer; char str[MKBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 313 "frame/ds9parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/ds9parser.Y000644 000765 000000 00000117714 12464230773 017107 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {mkFlexLexer* ll} %parse-param {mkFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits(globalTile)) #define DISCARD_(x) {yyclearin; mkDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #include "point.h" #undef yyFlexLexer #define yyFlexLexer mkFlexLexer #include extern int mklex(void*, mkFlexLexer*); extern void mkerror(Base*, mkFlexLexer*, const char*); extern void mkDiscard(int); static Coord::CoordSystem globalSystem; static Coord::CoordSystem globalWCS; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static int globalTile; static unsigned short globalProps; static unsigned short localProps; static int globalDash[2]; static int localDash[2]; static int globalWidth; static int localWidth; static char globalColor[16]; static char localColor[16]; static char globalFont[32]; static char localFont[32]; static char globalText[80]; static char localText[80]; static char localComment[80]; static int globalLine1; static int localLine1; static int globalLine2; static int localLine2; static int globalVector; static int localVector; static int globalComposite; static int localComposite; static int globalPoint; static int localPoint; static int globalPointSize; static int localPointSize; static double globalTextAngle; static double localTextAngle; static int globalTextRotate; static int localTextRotate; static Coord::CoordSystem globalRulerCoordSystem; static Coord::CoordSystem localRulerCoordSystem; static Coord::SkyFrame globalRulerSkyFrame; static Coord::SkyFrame localRulerSkyFrame; static Coord::CoordSystem globalRulerDistSystem; static Coord::CoordSystem localRulerDistSystem; static Coord::SkyDist globalRulerDistFormat; static Coord::SkyDist localRulerDistFormat; static Coord::CoordSystem globalCompassCoordSystem; static Coord::SkyFrame globalCompassSkyFrame; static char globalCompassNorth[80]; static char globalCompassEast[80]; static int globalCompassNArrow; static int globalCompassEArrow; static Coord::CoordSystem localCompassCoordSystem; static Coord::SkyFrame localCompassSkyFrame; static char localCompassNorth[80]; static char localCompassEast[80]; static int localCompassNArrow; static int localCompassEArrow; static int localCpanda; static int localEpanda; static int localBpanda; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aNumsao; static int aStatus; static int cStatus; static Vector aCenter; static double aAngles[MAXANGLES]; static int aAngNum; static double aAngle; static unsigned short aProps; static char aColor[16]; static int aWidth; static int aDash[2]; static char aFont[32]; static char aText[80]; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); %} %union { #define MKBUFSIZE 2048 double real; int integer; char str[MKBUFSIZE]; double vector[3]; } %type numeric %type yesno %type angle %type optangle %type value %type vvalue %type sexagesimal %type hms %type dms %type coord %type coordSystem %type wcsSystem %type skyFrame %type skyDist %type property %type callBack %type pointShape %type numberof %token INT %token REAL %token STRING %token COLOR %token ANGDEGREE %token ANGRADIAN %token ARCMINUTE %token ARCSECOND %token PHYCOORD %token IMGCOORD %token SEXSTR %token HMSSTR %token DMSSTR %token EOF_ %token AMPLIFIER_ %token ANNULUS_ %token ARCMIN_ %token ARCSEC_ %token ARROW_ %token B1950_ %token BACKGROUND_ %token BEGIN_ %token BOX_ %token BOXCIRCLE_ %token BPANDA_ %token CALLBACK_ %token CIRCLE_ %token CIRCLE3D_ %token COLOR_ %token COMPASS_ %token COMPOSITE_ %token CPANDA_ %token CROSS_ %token DASH_ %token DASHLIST_ %token DEBUG_ %token DEGREES_ %token DELETE_ %token DETECTOR_ %token DIAMOND_ %token ECLIPTIC_ %token EDIT_ %token ELLIPSE_ %token END_ %token EPANDA_ %token FALSE_ %token FIELD_ %token FIXED_ %token FK4_ %token FK4_NO_E_ %token FK5_ %token FONT_ %token GALACTIC_ %token GLOBAL_ %token HELIOECLIPTIC_ %token HIGHLITE_ %token ICRS_ %token IGNORE_ %token IMAGE_ %token INCLUDE_ %token J2000_ %token KEY_ %token LINE_ %token LINEAR_ %token MOVE_ %token N_ %token NO_ %token OFF_ %token ON_ %token PHYSICAL_ %token PIE_ %token PIXELS_ %token POINT_ %token POLYGON_ %token PROJECTION_ %token PROPERTY_ %token ROTATE_ %token ROTBOX_ %token RULER_ %token SEGMENT_ %token SELECT_ %token SOURCE_ %token SUPERGALACTIC_ %token TAG_ %token TEXT_ %token TEXTANGLE_ %token TEXTROTATE_ %token TILE_ %token TRUE_ %token VECTOR_ %token VERSION_ %token UNHIGHLITE_ %token UNSELECT_ %token UPDATE_ %token WCS_ %token WCSA_ %token WCSB_ %token WCSC_ %token WCSD_ %token WCSE_ %token WCSF_ %token WCSG_ %token WCSH_ %token WCSI_ %token WCSJ_ %token WCSK_ %token WCSL_ %token WCSM_ %token WCSN_ %token WCSO_ %token WCSP_ %token WCSQ_ %token WCSR_ %token WCSS_ %token WCST_ %token WCSU_ %token WCSV_ %token WCSW_ %token WCSX_ %token WCSY_ %token WCSZ_ %token WCS0_ %token WIDTH_ %token X_ %token Y_ %token YES_ %% start : initGlobal commands postLocal ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "DS9 Regions File 3.2" << endl;} | GLOBAL_ global comment | TILE_ INT {globalTile = $2;} | coordSystem {globalSystem=(Coord::CoordSystem)$1;} comment | skyFrame {globalSystem=globalWCS; globalSky=(Coord::SkyFrame)$1;} comment | LINEAR_ {globalSystem=globalWCS; globalSky=Coord::FK5;} comment | initLocal shape | initLocal include shape | initLocal '#' hash ; hash : nonshape | include nonshape | TILE_ INT {globalTile = $2;} | {DISCARD_(1);} STRING ; comment : /* empty */ | '#' {DISCARD_(1);} STRING ; shapeComment : /* empty */ postLocal | '#' {DISCARD_(1);} STRING postLocal {strncpy(localComment,$3,80);} | '#' local postLocal | '#' local {DISCARD_(1);} STRING postLocal {strncpy(localComment,$4,80);} ; nonshapeComment : /* empty */ postLocal | {DISCARD_(1);} STRING postLocal {strncpy(localComment,$2,80);} | local postLocal | local {DISCARD_(1);} STRING postLocal {strncpy(localComment,$3,80);} ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; yesno : INT {$$=($1 ? 1 : 0);} | YES_ {$$=1;} | Y_ {$$=1;} | ON_ {$$=1;} | TRUE_ {$$=1;} | NO_ {$$=0;} | N_ {$$=0;} | OFF_ {$$=0;} | FALSE_ {$$=0;} ; sp : /* empty */ | ',' ; bp : /* empty */ | '(' ; ep : /* emtpy */ | ')' ; conjuction : /* empty */ {cStatus = 0;} | '|' {cStatus = 1;} | '|' '|' {cStatus = 1;} ; optangle: /* empty */ {$$ = fr->mapAngleToRef(0,localSystem,localSky);} | angle {$$ = $1;} ; angle : numeric {$$ = fr->mapAngleToRef(degToRad($1),localSystem,localSky);} | ANGDEGREE {$$ = fr->mapAngleToRef(degToRad($1),localSystem,localSky);} | ANGRADIAN {$$ = fr->mapAngleToRef($1,localSystem,localSky);} ; value : numeric {$$ = FITSPTR->mapLenToRef($1, localSystem, Coord::DEGREE);} | PHYCOORD {$$ = FITSPTR->mapLenToRef($1, Coord::PHYSICAL);} | IMGCOORD {$$ = FITSPTR->mapLenToRef($1, Coord::IMAGE);} | ANGDEGREE {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::DEGREE);} | ARCMINUTE {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::ARCMIN);} | ARCSECOND {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::ARCSEC);} ; vvalue : numeric sp numeric { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), localSystem, Coord::DEGREE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | PHYCOORD sp PHYCOORD { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::PHYSICAL); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | IMGCOORD sp IMGCOORD { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::DEGREE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCMINUTE sp ARCMINUTE { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::ARCMIN); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCSECOND sp ARCSECOND { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::ARCSEC); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; numberof: N_ '=' INT {$$ = $3;} ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; hms : HMSSTR {$$ = parseHMSStr($1);} ; dms : DMSSTR {$$ = parseDMSStr($1);} ; coord : sexagesimal sp sexagesimal { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector($1,$3), sys, sky); else r = FITSPTR->mapToRef(Vector($1*360./24.,$3), sys, sky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | hms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | dms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3), localSystem, localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | IMGCOORD sp IMGCOORD { Vector r = FITSPTR->mapToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | PHYCOORD sp PHYCOORD { Vector r = FITSPTR->mapToRef(Vector($1,$3), Coord::PHYSICAL); $$[0] = r[0]; $$[1] = r[1]; } ; coordSystem :IMAGE_ {$$ = Coord::IMAGE;} | PHYSICAL_ {$$ = Coord::PHYSICAL;} | DETECTOR_ {$$ = Coord::DETECTOR;} | AMPLIFIER_ {$$ = Coord::AMPLIFIER;} | wcsSystem {$$ = $1; globalWCS = (Coord::CoordSystem)$1;} ; wcsSystem : WCS_ {$$ = Coord::WCS;} | WCSA_ {$$ = Coord::WCSA;} | WCSB_ {$$ = Coord::WCSB;} | WCSC_ {$$ = Coord::WCSC;} | WCSD_ {$$ = Coord::WCSD;} | WCSE_ {$$ = Coord::WCSE;} | WCSF_ {$$ = Coord::WCSF;} | WCSG_ {$$ = Coord::WCSG;} | WCSH_ {$$ = Coord::WCSH;} | WCSI_ {$$ = Coord::WCSI;} | WCSJ_ {$$ = Coord::WCSJ;} | WCSK_ {$$ = Coord::WCSK;} | WCSL_ {$$ = Coord::WCSL;} | WCSM_ {$$ = Coord::WCSM;} | WCSN_ {$$ = Coord::WCSN;} | WCSO_ {$$ = Coord::WCSO;} | WCSP_ {$$ = Coord::WCSP;} | WCSQ_ {$$ = Coord::WCSQ;} | WCSR_ {$$ = Coord::WCSR;} | WCSS_ {$$ = Coord::WCSS;} | WCST_ {$$ = Coord::WCST;} | WCSU_ {$$ = Coord::WCSU;} | WCSV_ {$$ = Coord::WCSV;} | WCSW_ {$$ = Coord::WCSW;} | WCSX_ {$$ = Coord::WCSX;} | WCSY_ {$$ = Coord::WCSY;} | WCSZ_ {$$ = Coord::WCSZ;} | WCS0_ {$$ = Coord::WCS0;} ; skyFrame : FK4_ {$$ = Coord::FK4;} | B1950_ {$$ = Coord::FK4;} | FK4_NO_E_ {$$ = Coord::FK4_NO_E;} | FK5_ {$$ = Coord::FK5;} | J2000_ {$$ = Coord::FK5;} | ICRS_ {$$ = Coord::ICRS;} | GALACTIC_ {$$ = Coord::GALACTIC;} | SUPERGALACTIC_ {$$ = Coord::SUPERGALACTIC;} | ECLIPTIC_ {$$ = Coord::ECLIPTIC;} | HELIOECLIPTIC_ {$$ = Coord::HELIOECLIPTIC;} ; skyDist : DEGREES_ {$$=Coord::DEGREE;} | ARCMIN_ {$$=Coord::ARCMIN;} | ARCSEC_ {$$=Coord::ARCSEC;} ; property : SELECT_ {$$ = Marker::SELECT;} | HIGHLITE_ {$$ = Marker::HIGHLITE;} | DASH_ {$$ = Marker::DASH;} | FIXED_ {$$ = Marker::FIXED;} | EDIT_ {$$ = Marker::EDIT;} | MOVE_ {$$ = Marker::MOVE;} | ROTATE_ {$$ = Marker::ROTATE;} | DELETE_ {$$ = Marker::DELETE;} | INCLUDE_ {$$ = Marker::INCLUDE;} | SOURCE_ {$$ = Marker::SOURCE;} ; callBack : SELECT_ {$$ = CallBack::SELECTCB;} | UNSELECT_ {$$ = CallBack::UNSELECTCB;} | HIGHLITE_ {$$ = CallBack::HIGHLITECB;} | UNHIGHLITE_ {$$ = CallBack::UNHIGHLITECB;} | BEGIN_ MOVE_ {$$ = CallBack::MOVEBEGINCB;} | MOVE_ {$$ = CallBack::MOVECB;} | END_ MOVE_ {$$ = CallBack::MOVEENDCB;} | BEGIN_ EDIT_ {$$ = CallBack::EDITBEGINCB;} | EDIT_ {$$ = CallBack::EDITCB;} | END_ EDIT_ {$$ = CallBack::EDITENDCB;} | BEGIN_ ROTATE_ {$$ = CallBack::ROTATEBEGINCB;} | ROTATE_ {$$ = CallBack::ROTATECB;} | END_ ROTATE_ {$$ = CallBack::ROTATEENDCB;} | DELETE_ {$$ = CallBack::DELETECB;} | TEXT_ {$$ = CallBack::TEXTCB;} | COLOR_ {$$ = CallBack::COLORCB;} | WIDTH_ {$$ = CallBack::LINEWIDTHCB;} | PROPERTY_ {$$ = CallBack::PROPERTYCB;} | FONT_ {$$ = CallBack::FONTCB;} | KEY_ {$$ = CallBack::KEYCB;} | UPDATE_ {$$ = CallBack::UPDATECB;} ; global : global sp globalProperty | globalProperty ; globalProperty : property '=' yesno { setProps(&globalProps,$1,$3); setProps(&localProps,$1,$3); } | COLOR_ '=' STRING { strncpy(globalColor,$3,16); strncpy(localColor,$3,16); } | DASHLIST_ '=' INT INT { globalDash[0] = localDash[0] =$3; globalDash[1] = localDash[1] =$4; } | WIDTH_ '=' INT {globalWidth = localWidth = $3;} | FONT_ '=' STRING { strncpy(globalFont,$3,32); strncpy(localFont,$3,32); } | TEXT_ '=' STRING { strncpy(globalText,$3,80); strncpy(localText,$3,80); } | DASH_ { setProps(&globalProps,Marker::DASH,1); setProps(&localProps,Marker::DASH,1); } | SOURCE_ { setProps(&globalProps,Marker::SOURCE,1); setProps(&localProps,Marker::SOURCE,1); } | BACKGROUND_ { setProps(&globalProps,Marker::SOURCE,0); setProps(&localProps,Marker::SOURCE,0); } | POINT_ '=' pointShape {globalPoint = localPoint = $3;} | POINT_ '=' pointShape INT { globalPoint = localPoint = $3; globalPointSize = localPointSize = $4; } | LINE_ '=' INT INT { globalLine1 = localLine1 = $3; globalLine2 = localLine2 = $4; } | VECTOR_ '=' INT {globalVector = localVector = $3;} | COMPOSITE_ '=' INT { globalComposite = localComposite = $3; } | RULER_ '=' globalRuler {} | COMPASS_ '=' globalCompass STRING STRING INT INT { strncpy(globalCompassNorth,$4,80); strncpy(globalCompassEast,$5,80); strncpy(localCompassNorth,$4,80); strncpy(localCompassEast,$5,80); globalCompassNArrow = localCompassNArrow = $6; globalCompassEArrow = localCompassEArrow = $7; } | TEXTANGLE_ '=' angle {globalTextAngle = localTextAngle = $3;} | TEXTROTATE_ '=' INT {globalTextRotate = localTextRotate = $3;} | WCS_ '=' wcsSystem {globalWCS = (Coord::CoordSystem)$3;} ; globalRuler : coordSystem skyFrame coordSystem skyDist { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)$1; globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)$2; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)$3; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)$4; } | coordSystem coordSystem { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)$1; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)$2; globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; } | coordSystem skyDist { globalRulerCoordSystem = localRulerCoordSystem = (Coord::CoordSystem)$1; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)$2; } | skyFrame coordSystem { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)$1; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)$2; globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; } | skyFrame skyDist { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = (Coord::SkyFrame)$1; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)$2; } | LINEAR_ coordSystem { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = (Coord::CoordSystem)$2; globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; } | LINEAR_ skyDist { globalRulerCoordSystem = localRulerCoordSystem = Coord::WCS; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)$2; } | skyDist { globalRulerCoordSystem = localRulerCoordSystem = Coord::IMAGE; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::WCS; globalRulerDistFormat = localRulerDistFormat = (Coord::SkyDist)$1; } | PIXELS_ { globalRulerCoordSystem = localRulerCoordSystem = Coord::IMAGE; globalRulerSkyFrame = localRulerSkyFrame = Coord::FK5; globalRulerDistSystem = localRulerDistSystem = Coord::IMAGE; globalRulerDistFormat = localRulerDistFormat = Coord::DEGREE; } ; globalCompass : coordSystem skyFrame { globalCompassCoordSystem = localCompassCoordSystem = (Coord::CoordSystem)$1; globalCompassSkyFrame = localCompassSkyFrame = (Coord::SkyFrame)$2; } | coordSystem { globalCompassCoordSystem = localCompassCoordSystem = (Coord::CoordSystem)$1; globalCompassSkyFrame = localCompassSkyFrame = Coord::FK5; } | skyFrame { globalCompassCoordSystem = localCompassCoordSystem = Coord::WCS; globalCompassSkyFrame = localCompassSkyFrame = (Coord::SkyFrame)$1; } | LINEAR_ { globalCompassCoordSystem = localCompassCoordSystem = Coord::WCS; globalCompassSkyFrame = localCompassSkyFrame = Coord::FK5; } ; initGlobal:{ // global properties globalSystem = Coord::PHYSICAL; globalWCS = fr->wcsSystem(); globalSky = fr->wcsSky(); globalTile = 1; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; strcpy(globalColor,"green"); globalDash[0] = 8; globalDash[1] = 3; globalWidth = 1; strcpy(globalFont,"helvetica 10 normal roman"); strcpy(globalText,""); // unique properties globalLine1 = 0; globalLine2 = 0; globalVector = 1; globalComposite = 1; globalRulerCoordSystem = Coord::PHYSICAL; globalRulerSkyFrame = Coord::FK5; globalRulerDistSystem = Coord::PHYSICAL; globalRulerDistFormat = Coord::DEGREE; globalCompassCoordSystem = Coord::PHYSICAL; globalCompassSkyFrame = Coord::FK5; strcpy(globalCompassNorth,"N"); strcpy(globalCompassEast,"E"); globalCompassNArrow = 1; globalCompassEArrow = 1; globalPoint = Point::BOXCIRCLE; globalPointSize = POINTSIZE; globalTextAngle=0; globalTextRotate=1; aStatus = 0; cStatus = 0; } ; local : local sp localProperty | localProperty ; localProperty : property '=' yesno {setProps(&localProps,$1,$3);} | COLOR_ '=' STRING {strncpy(localColor,$3,16);} | DASHLIST_ '=' INT INT { localDash[0] =$3; localDash[1] =$4; } | WIDTH_ '=' INT {localWidth = $3;} | FONT_ '=' STRING {strncpy(localFont,$3,32);} | TEXT_ '=' STRING {strncpy(localText,$3,80);} | TAG_ '=' STRING {taglist.append(new Tag($3));} | CALLBACK_ '=' callBack STRING STRING {cblist.append( new CallBack(fr->getInterp(),(CallBack::Type)$3,$4,$5));} | DASH_ {setProps(&localProps,Marker::DASH,1);} | SOURCE_ {setProps(&localProps,Marker::SOURCE,1);} | BACKGROUND_ {setProps(&localProps,Marker::SOURCE,0);} | POINT_ '=' pointShape {localPoint = $3;} | POINT_ '=' pointShape INT {localPoint = $3; localPointSize = $4;} | LINE_ '=' INT INT {localLine1=$3; localLine2=$4;} | VECTOR_ '=' INT {localVector=$3;} | COMPOSITE_ '=' INT {localComposite=$3;} | RULER_ '=' localRuler | COMPASS_ '=' localCompass STRING STRING INT INT { strncpy(localCompassNorth,$4,80); strncpy(localCompassEast,$5,80); localCompassNArrow = $6; localCompassEArrow = $7; } | TEXTANGLE_ '=' angle {localTextAngle=$3;} | TEXTROTATE_ '=' INT {localTextRotate=$3;} | CPANDA_ '=' localCpanda | EPANDA_ '=' localEpanda | BPANDA_ '=' localBpanda ; localRuler : coordSystem skyFrame coordSystem skyDist { localRulerCoordSystem = (Coord::CoordSystem)$1; localRulerSkyFrame = (Coord::SkyFrame)$2; localRulerDistSystem = (Coord::CoordSystem)$3; localRulerDistFormat = (Coord::SkyDist)$4; } | coordSystem coordSystem { localRulerCoordSystem = (Coord::CoordSystem)$1; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = (Coord::CoordSystem)$2; localRulerDistFormat = Coord::DEGREE; } | coordSystem skyDist { localRulerCoordSystem = (Coord::CoordSystem)$1; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)$2; } | skyFrame coordSystem { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = (Coord::SkyFrame)$1; localRulerDistSystem = (Coord::CoordSystem)$2; localRulerDistFormat = Coord::DEGREE; } | skyFrame skyDist { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = (Coord::SkyFrame)$1; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)$2; } | LINEAR_ coordSystem { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = (Coord::CoordSystem)$2; localRulerDistFormat = Coord::DEGREE; } | LINEAR_ skyDist { localRulerCoordSystem = Coord::WCS; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)$2; } | skyDist { localRulerCoordSystem = Coord::IMAGE; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::WCS; localRulerDistFormat = (Coord::SkyDist)$1; } | PIXELS_ { localRulerCoordSystem = Coord::IMAGE; localRulerSkyFrame = Coord::FK5; localRulerDistSystem = Coord::IMAGE; localRulerDistFormat = Coord::DEGREE; } ; localCompass : coordSystem skyFrame { localCompassCoordSystem = (Coord::CoordSystem)$1; localCompassSkyFrame = (Coord::SkyFrame)$2; } | coordSystem { localCompassCoordSystem = (Coord::CoordSystem)$1; localCompassSkyFrame = Coord::FK5; } | skyFrame { localCompassCoordSystem = Coord::WCS; localCompassSkyFrame = (Coord::SkyFrame)$1; } | LINEAR_ { localCompassCoordSystem = Coord::WCS; localCompassSkyFrame = Coord::FK5; } ; localCpanda: {aNum=0; aAngNum=0;} '(' aAngs ')' '(' aRads ')' {localCpanda = 2;} | IGNORE_ {localCpanda=0;} ; localEpanda: {aNum=0; aAngNum=0, aAngle=0;} '(' aAngs ')' '(' vRads ')' '(' angle ')' {aAngle=$9;localEpanda=2;} | IGNORE_ {localEpanda=0;} ; localBpanda: {aNum=0; aAngNum=0, aAngle=0;} '(' aAngs ')' '(' vRads ')' '(' angle ')' {aAngle=$9;localBpanda=2;} | IGNORE_ {localBpanda=0;} ; initLocal : { // reset maperr flag maperr = 0; // needed for annulus, ellipse annulus, and box annulus aNum = 2; // composite (previous conjuction found?) if (!cStatus) fr->resetCompositeMarker(); // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localColor,globalColor); localDash[0] = globalDash[0]; localDash[1] = globalDash[1]; localWidth = globalWidth; strcpy(localFont,globalFont); strcpy(localText,globalText); strcpy(localComment,""); taglist.deleteAll(); cblist.deleteAll(); // unique properties localLine1 = globalLine1; localLine2 = globalLine2; localVector = globalVector; localComposite = globalComposite; localPoint = globalPoint; localPointSize = globalPointSize; localRulerCoordSystem = globalRulerCoordSystem; localRulerSkyFrame = globalRulerSkyFrame; localRulerDistSystem = globalRulerDistSystem; localRulerDistFormat = globalRulerDistFormat; localCompassCoordSystem = globalCompassCoordSystem; localCompassSkyFrame = globalCompassSkyFrame; strcpy(localCompassNorth,globalCompassNorth); strcpy(localCompassEast,globalCompassEast); localCompassNArrow = globalCompassNArrow; localCompassEArrow = globalCompassEArrow; localTextAngle = globalTextAngle; localTextRotate = globalTextRotate; localCpanda = 1; localEpanda = 1; localBpanda = 1; } ; pointShape : CIRCLE_ {$$ = Point::CIRCLE;} | BOX_ {$$ = Point::BOX;} | DIAMOND_ {$$ = Point::DIAMOND;} | CROSS_ {$$ = Point::CROSS;} | X_ {$$ = Point::EX;} | ARROW_ {$$ = Point::ARROW;} | BOXCIRCLE_ {$$ = Point::BOXCIRCLE;} ; include : '+' {setProps(&localProps, Marker::INCLUDE, 1);} | '-' {setProps(&localProps, Marker::INCLUDE, 0);} ; nonshape : VECTOR_ bp coord sp value sp angle ep conjuction nonshapeComment { fr->createVectCmd(Vector($3), $5,$7, localVector, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | SEGMENT_ {polylist.deleteAll();} bp polyNodes ep conjuction nonshapeComment { fr->createSegmentCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | TEXT_ bp coord ep conjuction nonshapeComment { fr->createTextCmd(Vector($3), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | RULER_ bp coord sp coord ep conjuction nonshapeComment { fr->createRulerCmd(Vector($3), Vector($5), localRulerCoordSystem, localRulerSkyFrame, localRulerDistSystem, localRulerDistFormat, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | COMPASS_ bp coord sp value ep conjuction nonshapeComment { fr->createCompassCmd(Vector($3), $5, localCompassNorth, localCompassEast, localCompassNArrow, localCompassEArrow, localCompassCoordSystem, localCompassSkyFrame, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | PROJECTION_ bp coord sp coord sp value ep conjuction nonshapeComment { fr->createProjectionCmd(Vector($3), Vector($5), $7, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | CIRCLE3D_ bp coord sp value ep conjuction nonshapeComment { // backward compatibility fr->createCircleCmd(Vector($3), $5, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | COMPOSITE_ bp coord sp optangle ep conjuction nonshapeComment { fr->createCompositeCmd(Vector($3), $5, localComposite, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } ; shape : CIRCLE_ bp coord sp value ep conjuction shapeComment { fr->createCircleCmd(Vector($3), $5, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | CIRCLE3D_ bp coord sp value ep conjuction shapeComment { // backwards compatibility fr->createCircleCmd(Vector($3), $5, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp optangle ep conjuction shapeComment { // for ellipse annulus aStatus = 1; aCenter = Vector($3); aAngles[0] = $7; aVector[0] = Vector($5); aNumsao = 1; strncpy(aColor,localColor,16); aDash[0] = localDash[0]; aDash[1] = localDash[1]; aWidth = localWidth; strncpy(aFont,localFont,32); strncpy(aText,localText,80); strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector($3), Vector($5), $7, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOX_ bp coord sp vvalue sp optangle ep conjuction shapeComment { // for box annulus aStatus = 3; aCenter = Vector($3); aAngles[0] = $7; aVector[0] = Vector($5); aNumsao = 1; strncpy(aColor,localColor,16); aDash[0] = localDash[0]; aDash[1] = localDash[1]; aWidth = localWidth; strncpy(aFont,localFont,32); strncpy(aText,localText,80); strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector($3), Vector($5), $7, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ROTBOX_ bp coord sp vvalue sp optangle ep conjuction shapeComment { // backwards compatibility fr->createBoxCmd(Vector($3), Vector($5), $7, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | POLYGON_ {polylist.deleteAll();} bp polyNodes ep conjuction shapeComment { fr->createPolygonCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | SEGMENT_ {polylist.deleteAll();} bp polyNodes ep conjuction shapeComment { fr->createSegmentCmd(polylist, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | LINE_ bp coord sp coord ep conjuction shapeComment { fr->createLineCmd(Vector($3), Vector($5), localLine1,localLine2, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | VECTOR_ bp coord sp value sp angle ep conjuction shapeComment { fr->createVectCmd(Vector($3), $5,$7, localVector, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | TEXT_ bp coord ep conjuction shapeComment { fr->createTextCmd(Vector($3), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | TEXT_ bp coord sp STRING ep {strncpy(localText,$5,80);} conjuction shapeComment { fr->createTextCmd(Vector($3), localTextAngle,localTextRotate, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | POINT_ bp coord ep conjuction shapeComment { fr->createPointCmd(Vector($3), (Point::PointShape)localPoint, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | CIRCLE_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::CIRCLE, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOX_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::BOX, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | DIAMOND_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::DIAMOND, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | CROSS_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::CROSS, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | X_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::EX, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ARROW_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::ARROW, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOXCIRCLE_ POINT_ bp coord ep conjuction shapeComment { // backwards compatibility fr->createPointCmd(Vector($4), Point::BOXCIRCLE, localPointSize, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | RULER_ bp coord sp coord ep conjuction shapeComment { fr->createRulerCmd(Vector($3), Vector($5), localRulerCoordSystem, localRulerSkyFrame, localRulerDistSystem, localRulerDistFormat, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | COMPASS_ bp coord sp value ep conjuction shapeComment { fr->createCompassCmd(Vector($3), $5, localCompassNorth, localCompassEast, localCompassNArrow, localCompassEArrow, localCompassCoordSystem, localCompassSkyFrame, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | PROJECTION_ bp coord sp coord sp value ep conjuction shapeComment { fr->createProjectionCmd(Vector($3), Vector($5), $7, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ANNULUS_ bp coord sp value sp value ep conjuction shapeComment { fr->createAnnulusCmd(Vector($3), $5,$7,1, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ANNULUS_ bp coord sp value sp value sp aRads ep conjuction shapeComment { aAnnuli[0] = $5; aAnnuli[1] = $7; fr->createAnnulusCmd(Vector($3), aNum,aAnnuli, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ANNULUS_ bp coord sp value sp value sp numberof ep conjuction shapeComment { fr->createAnnulusCmd(Vector($3), $5,$7,$9, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp vvalue sp optangle ep conjuction shapeComment { // prefered syntax fr->createEllipseAnnulusCmd(Vector($3), Vector($5),Vector($7),1, $9, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp vvalue sp numberof sp optangle ep conjuction shapeComment { // prefered syntax fr->createEllipseAnnulusCmd(Vector($3), Vector($5),Vector($7),$9, $11, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp vvalue sp vRads sp optangle ep conjuction shapeComment { // prefered syntax aVector[0] = Vector($5); aVector[1] = Vector($7); fr->createEllipseAnnulusCmd(Vector($3), aNum,aVector, $11, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp optangle ep '&' '!' ELLIPSE_ bp coord sp vvalue sp optangle ep { // backwards compatibility // old saoimage syntax aStatus = 2; aVector[aNumsao++] = Vector($5); } | BOX_ bp coord sp vvalue sp vvalue sp optangle ep conjuction shapeComment { // prefered syntax fr->createBoxAnnulusCmd(Vector($3), Vector($5),Vector($7),1, $9, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOX_ bp coord sp vvalue sp vvalue sp vRads sp optangle ep conjuction shapeComment { // prefered syntax aVector[0] = Vector($5); aVector[1] = Vector($7); fr->createBoxAnnulusCmd(Vector($3), aNum,aVector, $11, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOX_ bp coord sp vvalue sp vvalue sp numberof sp optangle ep conjuction shapeComment { // prefered syntax fr->createBoxAnnulusCmd(Vector($3), Vector($5),Vector($7),$9, $11, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } | BOX_ bp coord sp vvalue sp optangle ep '&' '!' BOX_ bp coord sp vvalue sp optangle ep { // backwards compatibility // old saoimage syntax aStatus = 4; aVector[aNumsao++] = Vector($5); } | CPANDA_ bp coord sp angle sp angle sp INT sp value sp value sp INT ep conjuction shapeComment { switch (localCpanda) { case 0: /* ignore it */ break; case 1: /* normal cpanda */ fr->createCpandaCmd(Vector($3), $5,$7,$9, $11,$13,$15, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createCpandaCmd(Vector($3), aAngNum,aAngles, aNum,aAnnuli, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } } | EPANDA_ bp coord sp angle sp angle sp INT sp vvalue sp vvalue sp INT sp optangle ep conjuction shapeComment { switch (localEpanda) { case 0: /* ignore it */ break; case 1: /* normal epanda */ fr->createEpandaCmd(Vector($3), $5,$7,$9, Vector($11),Vector($13),$15, $17, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createEpandaCmd(Vector($3), aAngNum,aAngles, aNum,aVector, aAngle, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } } | BPANDA_ bp coord sp angle sp angle sp INT sp vvalue sp vvalue sp INT sp optangle ep conjuction shapeComment { switch (localBpanda) { case 0: /* ignore it */ break; case 1: /* normal bpanda */ fr->createBpandaCmd(Vector($3), $5,$7,$9, Vector($11),Vector($13),$15, $17, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; case 2: /* one of our special pandas */ fr->createBpandaCmd(Vector($3), aAngNum,aAngles, aNum,aVector, aAngle, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); break; } } | PIE_ bp coord sp angle sp angle ep conjuction shapeComment | PIE_ bp coord sp angle sp angle sp aAngs ep conjuction shapeComment | PIE_ bp coord sp angle sp angle sp numberof ep conjuction shapeComment | FIELD_ bp ep conjuction shapeComment | COMPOSITE_ bp coord sp optangle ep conjuction shapeComment { fr->createCompositeCmd(Vector($3), $5, localComposite, localColor,localDash,localWidth,localFont, localText,localProps,localComment,taglist,cblist); } ; polyNodes : polyNodes sp polyNode | polyNode ; polyNode : coord {polylist.append(new Vertex($1));} ; aRads : aRads sp aRad | aRad ; aRad : value { if (aNum < MAXANNULI) aAnnuli[aNum++] = $1; } ; aAngs : aAngs sp aAng | aAng ; aAng : angle { if (aAngNum < MAXANGLES) aAngles[aAngNum++] = $1; } ; vRads : vRads sp vRad | vRad ; vRad : value sp value {aVector[aNum++] = Vector($1,$3);} ; postLocal : /* empty */ { // old style annulus switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNumsao,aVector, aAngles[0], aColor,aDash,aWidth,aFont,aText,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNumsao,aVector, aAngles[0], aColor,aDash,aWidth,aFont,aText,aProps,aComment,taglist,cblist); break; } aStatus = 0; } ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/ellipse.C000644 000765 000000 00000026426 12537642733 016605 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "ellipse.h" #include "fitsimage.h" Ellipse::Ellipse(Base* p, const Vector& ctr, const Vector& r, double ang) : BaseEllipse(p, ctr, ang) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = r; strcpy(type_,"ellipse"); numHandle = 4; updateBBox(); } Ellipse::Ellipse(Base* p, const Vector& ctr, const Vector& r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = r; strcpy(type_,"ellipse"); numHandle = 4; updateBBox(); } Ellipse::Ellipse(const Ellipse& a) : BaseEllipse(a) {} void Ellipse::edit(const Vector& v, int h) { Matrix mm = bckMatrix(); annuli_[0] = (v * mm).abs(); updateBBox(); doCallBack(CallBack::EDITCB); } void Ellipse::analysis(AnalysisTask mm, int which) { switch (mm) { case HISTOGRAM: if (!analysisHistogram_ && which) { addCallBack(CallBack::MOVECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisHistogramCB_[1], parent->options->cmdName); } if (analysisHistogram_ && !which) { deleteCallBack(CallBack::MOVECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::EDITCB, analysisHistogramCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::DELETECB, analysisHistogramCB_[1]); } analysisHistogram_ = which; break; case PLOT3D: if (!analysisPlot3d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot3dCB_[1], parent->options->cmdName); } if (analysisPlot3d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot3dCB_[1]); } analysisPlot3d_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Ellipse::analysisHistogram(char* xname, char* yname, int num) { double* x; double* y; Matrix mm = Rotate(angle) * Translate(center); Vector vv = annuli_[0]; BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); parent->markerAnalysisHistogram(this, &x, &y, bb, num); analysisXYResult(xname, yname, x, y, num+1); } void Ellipse::analysisPlot3d(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { double* x; double* y; Matrix mm = Rotate(angle) * Translate(center); Vector vv = annuli_[0]; BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); int num = parent->markerAnalysisPlot3d(this, &x, &y, bb, sys, method); analysisXYResult(xname, yname, x, y, num); } void Ellipse::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; Matrix mm = Rotate(angle) * Translate(center); Vector vv = annuli_[0]; BBox bb(-vv * mm); bb.bound( vv * mm); bb.bound(Vector( vv[0],-vv[1]) * mm); bb.bound(Vector(-vv[0], vv[1]) * mm); parent->markerAnalysisStats(this, str, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Ellipse::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << "\"" << ',' << r[1] << "\"" << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << r[0] << "\""<< ',' << r[1] << "\""<< ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void Ellipse::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_[0]); XMLRowAng(sys,sky); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Ellipse::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); listCiaoPre(str); // radius is always in image coords switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::PHYSICAL); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(angle) << ')'; } break; default: if (ptr->hasWCSCel(sys)) { Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCMIN); char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << r[0] << '\'' << ',' << r[1] << '\'' << ',' << radToDeg(angle) << ')'; } break; } listCiaoPost(str, strip); } void Ellipse::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); listSAOtngPre(str, strip); // radius is always in image coords switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::IMAGE); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(angle) << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << r[0] << ',' << r[1] << ',' << radToDeg(angle) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ',' << r[0] << ',' << r[1] << ',' << radToDeg(angle) << ')'; } break; } } } listSAOtngPost(str, strip); } void Ellipse::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); Vector r = ptr->mapLenFromRef(annuli_[0],Coord::IMAGE); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v << r << radToDeg(angle); } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << setprecision(8) << v[0] << "d " << v[1] << "d " << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; Vector r = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' ' << ra << ' ' << dec << ' ' << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); } break; } } } listProsPost(str, strip); } void Ellipse::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[0][0] << ',' << annuli_[0][1] << ',' << radToDeg(angle) << ')'; listSAOimagePost(str, strip); } saods9/tksao1.0/frame/ellipse.h000644 000765 000000 00000002604 12464214755 016640 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __ellipse_h__ #define __ellipse_h__ #include "baseellipse.h" class Ellipse : public BaseEllipse { public: Ellipse(Base* p, const Vector& ctr, const Vector& r, double ang); Ellipse(Base* p, const Vector& ctr, const Vector& r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Ellipse(const Ellipse&); virtual Marker* dup() {return new Ellipse(*this);} void edit(const Vector&, int); void analysis(AnalysisTask, int); void analysisHistogram(char*, char*, int); void analysisPlot3d(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); virtual void listCiao(ostream&, Coord::CoordSystem, int); virtual void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOimage(ostream&, int); }; #endif saods9/tksao1.0/frame/ellipseannulus.C000644 000765 000000 00000027546 12537642733 020217 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "ellipseannulus.h" #include "fitsimage.h" EllipseAnnulus::EllipseAnnulus(Base* p, const Vector& ctr, const Vector& r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = 1; annuli_ = new Vector[1]; annuli_[0] = r; strcpy(type_,"ellipseannulus"); numHandle = 4; updateBBox(); } EllipseAnnulus::EllipseAnnulus(Base* p, const Vector& ctr, const Vector& inner,const Vector& outer,int num, double ang) : BaseEllipse(p, ctr, ang) { numAnnuli_ = num+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = num+1; annuli_ = new Vector[numAnnuli_]; for (int i=0; i& tg, const List& cb) : BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = an; annuli_ = new Vector[numAnnuli_]; for (int i=0; ioptions->cmdName); addCallBack(CallBack::EDITCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisRadialCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisRadialCB_[1], parent->options->cmdName); } if (analysisRadial_ && !which) { deleteCallBack(CallBack::MOVECB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITCB, analysisRadialCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisRadialCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisRadialCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisRadialCB_[0]); deleteCallBack(CallBack::DELETECB, analysisRadialCB_[1]); } analysisRadial_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void EllipseAnnulus::analysisRadial(char* xname, char* yname, char* ename, Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisRadial(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, bb, sys); analysisXYEResult(xname, yname, ename, xx, yy, ee, num); } void EllipseAnnulus::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void EllipseAnnulus::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << "ellipse(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys); str << r[0] << ',' << r[1] << ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << "ellipse(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << r[0] << "\"" << ',' << r[1] << "\"" << ',' ; } str << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << "ellipse(" << ra << ',' << dec << ',' ; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << r[0] << "\""<< ',' << r[1] << "\""<< ','; } str << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << "ellipse(" << setprecision(8) << v[0] << ',' << v[1] << ','; for (int i=0; imapLenFromRef(annuli_[i],sys); str << r[0] << ',' << r[1] << ','; } str << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void EllipseAnnulus::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_,numAnnuli_); XMLRowAng(sys,sky); XMLRowProps(ptr,sys); XMLRowEnd(str); } void EllipseAnnulus::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { Vector v = ptr->mapFromRef(center,sys); for (int i=0; imapLenFromRef(annuli_[i],Coord::IMAGE); str << "ellipse " << setprecision(8) << v << r << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],Coord::IMAGE); str << " & !ellipse " << setprecision(8) << v << r1<hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << "ellipse " << setprecision(8) << v[0] << "d " << v[1]<<"d " << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); str << " & !ellipse " << setprecision(8) << v[0] << "d " << v[1] << "d " << r1[0] << "\" " << r1[1] << "\" " << radToDeg(angle); } listProsPost(str, strip); } } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char decc[16]; char *dec = decc; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') dec++; for (int i=0; imapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << "ellipse " << ra << ' ' << dec << ' ' << r[0] << "\" " << r[1] << "\" " << radToDeg(angle); if (i!=0) { Vector r1 = ptr->mapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); str << " & !ellipse " << ra << ' ' << dec << ' ' << r1[0] << "\" " << r1[1] << "\" " << radToDeg(angle); } listProsPost(str, strip); } } break; } } } } void EllipseAnnulus::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); for (int i=0; imapFromRef(center,Coord::IMAGE); str << "ellipse(" << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[i][0] << ',' << annuli_[i][1] << ',' << radToDeg(angle) << ')'; if (i!=0) str << " & !ellipse(" << setprecision(8) << v[0] << ',' << v[1] << ',' << annuli_[i-1][0] << ',' << annuli_[i-1][1] << ',' << radToDeg(angle) << ')'; listSAOimagePost(str, strip); } } saods9/tksao1.0/frame/ellipseannulus.h000644 000765 000000 00000003513 12523216651 020237 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __ellipseannulus_h__ #define __ellipseannulus_h__ #include "baseellipse.h" class EllipseAnnulus : public BaseEllipse { public: EllipseAnnulus(Base* p, const Vector& ctr, const Vector& r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); EllipseAnnulus(Base* p, const Vector& ctr, const Vector& inner, const Vector& outer, int num, double ang); EllipseAnnulus(Base* p, const Vector& ctr, const Vector& inner, const Vector& outer, int num, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); EllipseAnnulus(Base* p, const Vector& ctr, int an, Vector* r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); EllipseAnnulus(const EllipseAnnulus&); Marker* dup() {return new EllipseAnnulus(*this);} void edit(const Vector&, int); void editEnd(); int addAnnuli(const Vector&); void analysis(AnalysisTask, int); void analysisRadial(char*, char*, char*, Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); void listSAOimage(ostream&, int); }; #endif saods9/tksao1.0/frame/epanda.C000644 000765 000000 00000053571 12544546070 016374 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "epanda.h" #include "fitsimage.h" Epanda::Epanda(const Epanda& a) : BasePanda(a), BaseEllipse(a) {} Epanda::Epanda(Base* p, const Vector& ctr, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BasePanda(a1, a2, an), BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn+1; annuli_ = new Vector[numAnnuli_]; for (int ii=0; ii& tg, const List& cb) : BasePanda(an, a), BaseEllipse(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { numAnnuli_ = rn; annuli_ = new Vector[numAnnuli_]; for (int ii=0; iigetColor("red")); else if (ii == numAngles_-1) XSetForeground(display, gc, parent->getColor("blue")); else XSetForeground(display, gc, color); } else XSetForeground(display, gc, color); } XDrawLine(display, drawable, lgc, rr0[0], rr0[1], rr1[0], rr1[1]); } } void Epanda::renderPS(int mode) { BaseEllipse::renderPS(mode); renderPSGC(mode); Vector r0 = annuli_[0]; Vector r1 = annuli_[numAnnuli_-1]; for (int ii=0; iicanvas) << "moveto" << rr1.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } #ifdef MAC_OSX_TK void Epanda::renderMACOSX() { BaseEllipse::renderMACOSX(); renderMACOSXGC(); Vector r0 = annuli_[0]; Vector r1 = annuli_[numAnnuli_-1]; for (int ii=0; ii4) { int hh = h-4-1; if (numAnnuli_>2 && hh2 && hh<(numAnnuli_+numAngles_)) { hh -= numAnnuli_; deleteAngle(hh); } numHandle = 4 + numAnnuli_ + numAngles_; startAng_ = angles_[0]; stopAng_ = angles_[numAngles_-1]; updateBBox(); doCallBack(CallBack::EDITCB); } } int Epanda::isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa) { Vector pp = bckMap(vv,sys); return BaseEllipse::isIn(vv,sys,nn) && BasePanda::isIn(pp,aa); } void Epanda::analysis(AnalysisTask mm, int which) { switch (mm) { case PANDA: if (!analysisPanda_ && which) { addCallBack(CallBack::MOVECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisPandaCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPandaCB_[1], parent->options->cmdName); } if (analysisPanda_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPandaCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisPandaCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisPandaCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisPandaCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPandaCB_[1]); } analysisPanda_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITENDCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITENDCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Epanda::analysisPanda(Coord::CoordSystem sys) { double* xx; double* yy; double* ee; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisPanda(this, &xx, &yy, &ee, numAnnuli_-1, annuli_, numAngles_-1, angles_, bb, sys); analysisXYEResult(xx, yy, ee, num); } void Epanda::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox* bb = new BBox[numAnnuli_]; Matrix mm = Rotate(angle) * Translate(center); for (int ii=0; iimarkerAnalysisStats(this, str, numAnnuli_-1, numAngles_-1, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Epanda::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { int regular = 1; if (numAngles_>2) { double delta; if (angles_[1] > angles_[0]) delta = angles_[1]-angles_[0]; else delta = angles_[1]+M_TWOPI-angles_[0]; for (int ii=2; ii angles_[ii-1]) diff = angles_[ii]-angles_[ii-1]; else diff = angles_[ii]+M_TWOPI-angles_[ii-1]; if (!teq(diff,delta,FLT_EPSILON)) { regular = 0; break; } } } if (numAnnuli_>2) { double delta = annuli_[1][0]-annuli_[0][0]; for (int i=2; ifindFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ',' << numAngles_-1 << ',' << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys,sky); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector r1 = ptr->mapLenFromRef(annuli_[0],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; } break; } } else { double ang1 = radToDeg(parent->mapAngleFromRef(angles_[0],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[numAngles_-1],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; Vector v = ptr->mapFromRef(center,sys); Vector r1 = ptr->mapLenFromRef(annuli_[0],sys); Vector r2 = ptr->mapLenFromRef(annuli_[numAnnuli_-1],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 <<',' << numAngles_-1 << ',' << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << numAnnuli_-1 << ',' << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; } } } listPost(str, conj, strip); } void Epanda::listB(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # epanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k],sys); str << r[0] << ' ' << r[1] << ((kmapAngleFromRef(angle,sys)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << '"' << ',' << r1[1] << '"' << ',' << r2[0] << '"' << ',' << r2[1] << '"' << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # epanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k],sys,Coord::ARCSEC); str << r[0] << '"' << ' ' << r[1] << '"' << ((kmapAngleFromRef(angle,sys,sky)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; for (int j=1; jmapAngleFromRef(angles_[j-1],sys,sky)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys,sky)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys,Coord::ARCSEC); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys,Coord::ARCSEC); str << type_ << '(' << ra << ',' << dec << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << '"' << ',' << r1[1] << '"' <<',' << r2[0] << '"' << ',' << r2[1] << '"' <<',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys,sky)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # epanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys,sky)) << ((kmapLenFromRef(annuli_[k],sys,Coord::ARCSEC); str << r[0] << '"' << ' ' << r[1] << '"' << ((kmapAngleFromRef(angle,sys,sky)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } break; } break; } else { Vector v = ptr->mapFromRef(center,sys); for (int j=1; jmapAngleFromRef(angles_[j-1],sys)); double ang2 = radToDeg(parent->mapAngleFromRef(angles_[j],sys)); if (ang2<=ang1+FLT_EPSILON) ang2 += 360; for (int i=1; imapLenFromRef(annuli_[i-1],sys); Vector r2 = ptr->mapLenFromRef(annuli_[i],sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ',' << ang1 << ',' << ang2 << ",1," << r1[0] << ',' << r1[1] << ',' << r2[0] << ',' << r2[1] << ',' << "1," << radToDeg(parent->mapAngleFromRef(angle,sys)) << ')'; if (!strip) { if (conj) str << " ||"; str << " # epanda="; if (i==1 && j==1 && !strip) { str << '('; for (int k=0; kmapAngleFromRef(angles_[k],sys)) << ((kmapLenFromRef(annuli_[k],sys); str << r[0] << ' ' << r[1] << ((kmapAngleFromRef(angle,sys)) << ')'; listProps(str); } else str << "ignore"; str << (strip ? ';' : '\n'); } else { if (conj) str << "||"; else str << ";"; } } } } } } } void Epanda::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowRadius(ptr,sys,annuli_,numAnnuli_); XMLRowAng(sys,sky); XMLRowAng(sys,sky,angles_,numAngles_); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/epanda.h000644 000765 000000 00000003746 12544546070 016440 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __epanda_h__ #define __epanda_h__ #include "basepanda.h" #include "baseellipse.h" class Epanda : public BasePanda, public BaseEllipse { private: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); void listA(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listB(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); int isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa); public: Epanda(const Epanda&); Epanda(Base* p, const Vector& ctr, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Epanda(Base* p, const Vector& ctr, int an, double* a, int rn, Vector* r, double ang, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Epanda(*this);} void edit(const Vector&, int); void editEnd(); int addAnnuli(const Vector&); int addAngles(const Vector&); void setAnglesAnnuli(double, double, int, Vector, Vector, int); void setAnglesAnnuli(const double*, int, const Vector*, int); void deleteAnglesAnnuli(int h); void analysis(AnalysisTask, int); void analysisPanda(Coord::CoordSystem sys); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/fitsanalysis.C000644 000765 000000 00000010726 12621204750 017640 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fitsimage.h" #include "analysis.h" #include "smooth.h" #include "context.h" void* convolve(void* tt); #ifdef __WIN32 void FitsImage::analysis(int which) { if (DebugPerf) cerr << "FitsImage::analysis()" << endl; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; analysis_ = block_; analysisdata_ = blockdata_; if (which) { analysis_ = new FitsAnalysis(block_); if (analysis_->isValid()) { analysisdata_ = new FitsDatam(analysis_, interp_); smooth(); manageAnalysis_ =1; } else { delete analysis_; analysis_ = block_; } } image_ = analysis_; data_ = analysisdata_; } void FitsImage::smooth() { // radius int r = context_->smoothRadius(); int ww = analysis_->head()->naxis(0); int hh = analysis_->head()->naxis(1); // src double* src = new double[ww*hh]; double* ptr = src; for (long jj=0; jjgetValueDouble(jj*ww+ii); // dest double* dest = (double*)analysis_->data(); // kernel // create kernel int rr = 2*r+1; double* kernel = new double[rr*rr]; memset(kernel, 0, rr*rr*sizeof(double)); switch (context_->smoothFunction()) { case Context::BOXCAR: boxcar(kernel,r); break; case Context::TOPHAT: tophat(kernel,r); break; case Context::GAUSSIAN: gaussian(kernel,r); break; } // convolve t_smooth_arg* targ = new t_smooth_arg; targ->kernel = kernel; targ->src = src; targ->dest = dest; targ->width = ww; targ->height = hh; targ->radius = r; convolve(targ); // clean up if (targ->kernel) delete [] targ->kernel; if (targ->src) delete [] targ->src; if (targ) delete targ; } #else void FitsImage::analysis(int which, pthread_t* thread, t_smooth_arg* targ) { if (DebugPerf) cerr << "FitsImage::analysis()" << endl; targ->kernel =NULL; targ->src =NULL; targ->dest =NULL; targ->width =0; targ->height =0; targ->radius =0; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; analysis_ = block_; analysisdata_ = blockdata_; if (which) { analysis_ = new FitsAnalysis(block_); if (analysis_->isValid()) { analysisdata_ = new FitsDatam(analysis_, interp_); smooth(thread, targ); manageAnalysis_ =1; } else { delete analysis_; analysis_ = block_; } } image_ = analysis_; data_ = analysisdata_; } void FitsImage::smooth(pthread_t* thread, t_smooth_arg* targ) { // radius int r = context_->smoothRadius(); int ww = analysis_->head()->naxis(0); int hh = analysis_->head()->naxis(1); // src double* src = new double[ww*hh]; double* ptr = src; for (long jj=0; jjgetValueDouble(jj*ww+ii); // dest double* dest = (double*)analysis_->data(); // kernel // create kernel int rr = 2*r+1; double* kernel = new double[rr*rr]; memset(kernel, 0, rr*rr*sizeof(double)); switch (context_->smoothFunction()) { case Context::BOXCAR: boxcar(kernel,r); break; case Context::TOPHAT: tophat(kernel,r); break; case Context::GAUSSIAN: gaussian(kernel,r); break; } // convolve targ->kernel = kernel; targ->src = src; targ->dest = dest; targ->width = ww; targ->height = hh; targ->radius = r; int result = pthread_create(thread, NULL, convolve, targ); if (result) internalError("Unable to Create Thread"); } #endif void* convolve(void* tt) { t_smooth_arg* targ = (t_smooth_arg*)tt; double* kernel = targ->kernel; double* src = targ->src; double* dest = targ->dest; int width = targ->width; int height = targ->height; int r = targ->radius; int rr = 2*r+1; double* dptr = dest; for (int jj=0; jj=0 && nn=0 && mmhead(); if (head) { FitsTableHDU* hdu = (FitsTableHDU*)(head->hdu()); if (!hdu->width() || !hdu->rows()) return; } } // make sure we have cols to bin on if (!fits_->pBinX() || !fits_->pBinY()) { FitsHead* head = fits_->head(); if (head) { FitsTableHDU* hdu = (FitsTableHDU*)head->hdu(); // try for X and Y FitsColumn* x = hdu->find("X"); FitsColumn* y = hdu->find("Y"); // next, try for ra and dec if (!x) x = hdu->find("RA"); if (!y) y = hdu->find("DEC"); // last chance, try first and second column if (!x) x = hdu->find(0); if (!y) y = hdu->find(1); if (x) { char* str = trim(x->ttype()); fits_->setpBinX(str); delete [] str; } else return; if (y) { char* str = trim(y->ttype()); fits_->setpBinY(str); delete [] str; } else return; } } if (!fits_->pBinZ()) { FitsHead* head = fits_->head(); if (head) { FitsTableHDU* hdu = (FitsTableHDU*)head->hdu(); // try for TIME FitsColumn* z = hdu->find("TIME"); // last chance, try third column if (!z) z = hdu->find(2); if (z) { char* str = trim(z->ttype()); fits_->setpBinZ(str); delete [] str; } } } nextBin(getHistCenter()); } int FitsImage::hasBinCol(const char* str) { if (fits_) { FitsHead* head = fits_->head(); if (head) { FitsTableHDU* hdu = (FitsTableHDU*)head->hdu(); return hdu->find(str) ? 1 : 0; } } return 0; } void FitsImage::setBinCursor(const Vector& v) { histCursor = v * refToPhysical; } Matrix FitsImage::nextBin(const Vector& c) { if (hist_) delete hist_; hist_ = NULL; if (manageBlock_) { if (block_) delete block_; if (blockdata_) delete blockdata_; } manageBlock_ =0; block_ = base_; blockdata_ = basedata_; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; // cursor, c is in bin (physical) coords // remember where we are pointing histCursor = c; // Vector s = getHistDim()/binFactor_; Vector d = getHistDim(); Vector s; Vector binFactor = context_->binFactor(); s[0] = d[0]/binFactor[0]; s[1] = d[1]/binFactor[1]; // make sure that we have a width/height of at least 1 if (s[0]<1) s[0]=1; if (s[1]<1) s[1]=1; int bufferSize = context_->binBufferSize(); int width = (int)(s[0]binDepth(); Vector center = Vector(width, height)/2; if (DebugBin) { cerr << "width height: " << width << ' ' << height << endl; cerr << "center: " << center << endl; cerr << "center.ceil(): " << center.ceil() << endl; } if (binFactor[0]<1 || binFactor[1]<1) { actualHistCursor = histCursor; if (DebugBin) cerr << "histCursor: " << histCursor << endl; } else { // force to a bin boundary, then translate to center of bin cell // actualHistCursor = ((histCursor/binFactor_).floor() * binFactor_) + // Vector(.5,.5); actualHistCursor[0] = (floor(histCursor[0]/binFactor[0]) * binFactor[0]) + .5; actualHistCursor[1] = (floor(histCursor[1]/binFactor[1]) * binFactor[1]) + .5; // now, figure out any offset due to mod(lowerleft,binFactor_) FitsTableHDU* hdu = (FitsTableHDU*)(fits_->head())->hdu(); Vector xd = hdu->dimension(fits_->pBinX()); Vector yd = hdu->dimension(fits_->pBinY()); Vector ll(xd[0],yd[0]); // Vector a = ((ll/binFactor_).floor() * binFactor_) + Vector(.5,.5); Vector a; a[0] = (floor(ll[0]/binFactor[0]) * binFactor[0]) + .5; a[1] = (floor(ll[1]/binFactor[1]) * binFactor[1]) + .5; Vector offset = a-ll; actualHistCursor -= offset; if (DebugBin) { cerr << "histCursor: " << histCursor << endl; cerr << "actualHistCursor: " << actualHistCursor << endl; cerr << "ll: " << ll << endl; cerr << "offset: " << offset << endl; } } // new physicalToData Matrix mm = Translate(-actualHistCursor) * Scale(1./binFactor[0],1./binFactor[1]) * Translate(center.ceil()); if (DebugBin) cerr << "mm: " << mm << endl << endl; FitsHist::Function binFunction = context_->binFunction(); hist_ = new FitsHist(fits_, width, height, depth, mm, binFunction, binFactor); if (!hist_->isValid()) { reset(); return Matrix(); } load(); return refToPhysical * mm * dataToRef; } Vector FitsImage::getHistColMinMax(const char* col) { return fits_ ? fits_->getColMinMax(col) : Vector(); } Vector FitsImage::getHistColDim(const char* col) { return fits_ ? fits_->getColDim(col) : Vector(); } Vector FitsImage::getHistDim() { if (!isBinTable()) return Vector(); // assumes we aready have our columns FitsTableHDU* hdu = (FitsTableHDU*)(fits_->head())->hdu(); Vector xd = hdu->dimension(fits_->pBinX()); Vector yd = hdu->dimension(fits_->pBinY()); // if DBL_MAX, we will get nan Vector r(xd[1]-xd[0],yd[1]-yd[0]); if (isfinite(r[0]) && isfinite(r[1])) return r; else return Vector(DBL_MAX,DBL_MAX); } Vector FitsImage::getHistCenter() { // return bin (physical) coords if (!isBinTable()) return Vector(); // assumes we aready have our columns FitsTableHDU* hdu = (FitsTableHDU*)(fits_->head())->hdu(); Vector xd = hdu->dimension(fits_->pBinX()); Vector yd = hdu->dimension(fits_->pBinY()); // if DBL_MAX, we will get nan Vector r = Vector(xd[1]-xd[0],yd[1]-yd[0])/2 + Vector(xd[0],yd[0]); if (isfinite(r[0]) && isfinite(r[1])) return r; else return Vector(); } const char* FitsImage::getHistFilter() { return fits_ ? fits_->pFilter() : NULL; } const char* FitsImage::getHistX() { return fits_ ? fits_->pBinX() : NULL; } const char* FitsImage::getHistY() { return fits_ ? fits_->pBinY() : NULL; } const char* FitsImage::getHistZ() { return fits_ ? fits_->pBinZ() : NULL; } char* FitsImage::getHistList() { if (!isHist()) return NULL; FitsHead* head = fits_->head(); return ((FitsTableHDU*)head->hdu())->list(); } saods9/tksao1.0/frame/fitsblock.C000644 000765 000000 00000010036 12621204750 017101 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "block.h" #include "context.h" void* blockproc(void* tt); void FitsImage::block() { if (DebugPerf) cerr << "FitsImage::block()" << endl; if (manageBlock_) { if (block_) delete block_; if (blockdata_) delete blockdata_; } manageBlock_ =0; block_ = base_; blockdata_ = basedata_; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; Vector blockFactor = context_->blockFactor(); if (blockFactor[0] != 1 && blockFactor[1] != 1) { block_ = new FitsBlock(base_, blockFactor); if (block_->isValid()) { manageBlock_ =1; switch (block_->head()->bitpix()) { case -64: blockdata_ = new FitsDatam(block_, interp_); break; default: blockdata_ = new FitsDatam(block_, interp_); break; } t_block_arg* targ = new t_block_arg; targ->base = base_; targ->basedata = basedata_; targ->block = block_; targ->blockFactor = blockFactor; blockproc(targ); } else { delete block_; block_ = base_; return; } } analysis_ = block_; analysisdata_ = blockdata_; image_ = analysis_; data_ = analysisdata_; resetWCS(); processKeywordsPhysical(); processKeywordsParams(); } #ifndef __WIN32 void FitsImage::block(pthread_t* thread) { if (DebugPerf) cerr << "FitsImage::block(thread)" << endl; if (manageBlock_) { if (block_) delete block_; if (blockdata_) delete blockdata_; } manageBlock_ =0; block_ = base_; blockdata_ = basedata_; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; Vector blockFactor = context_->blockFactor(); if (blockFactor[0] != 1 && blockFactor[1] != 1) { block_ = new FitsBlock(base_, blockFactor); if (block_->isValid()) { manageBlock_ =1; switch (block_->head()->bitpix()) { case -64: blockdata_ = new FitsDatam(block_, interp_); break; default: blockdata_ = new FitsDatam(block_, interp_); break; } t_block_arg* targ = new t_block_arg; targ->base = base_; targ->basedata = basedata_; targ->block = block_; targ->blockFactor = blockFactor; int result = pthread_create(thread, NULL, blockproc, targ); if (result) internalError("Unable to Create Thread"); } else { delete block_; block_ = base_; return; } } analysis_ = block_; analysisdata_ = blockdata_; image_ = analysis_; data_ = analysisdata_; resetWCS(); processKeywordsPhysical(); processKeywordsParams(); } #endif void* blockproc(void* tt) { t_block_arg* targ = (t_block_arg*)tt; FitsFile* base = targ->base; FitsData* basedata = targ->basedata; FitsFile* block = targ->block; Vector blockFactor = targ->blockFactor; Matrix mm = Scale(1/blockFactor[0],1/blockFactor[1]); int srcw = base->head()->naxis(0); int srch = base->head()->naxis(1); int ww = block->head()->naxis(0); int hh = block->head()->naxis(1); switch (block->head()->bitpix()) { case -64: { double* dest=(double*)block->data(); for (int jj=0; jj=0 && cc[0]=0 && cc[1]getValueDouble(jj*srcw+ii); *(dest+(int(cc[1])*ww + int(cc[0]))) += vv; } } } } break; default: { float* dest=(float*)block->data(); for (int jj=0; jj=0 && cc[0]=0 && cc[1]getValueFloat(jj*srcw+ii); *(dest+(int(cc[1])*ww + int(cc[0]))) += vv; } } } } break; } return NULL; } saods9/tksao1.0/frame/fitscompress.C000644 000765 000000 00000005717 12551544115 017660 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "compress.h" #include "rice.h" #include "gzip.h" #include "hcompress.h" #include "plio.h" void FitsImage::initCompress() { int bitpix = fits_->getInteger("ZBITPIX",0); char* type = fits_->getString("ZCMPTYPE"); if (!bitpix || !type) { if (type) delete [] type; return ; } if (post_) delete post_; post_ = NULL; if (!strncmp(type,"RICE_1",6) || !(strncmp(type,"RICE_ONE",8))) switch (bitpix) { case 8: post_ = new FitsRicem(fits_); break; case 16: post_ = new FitsRicem(fits_); break; case -16: post_ = new FitsRicem(fits_); break; case 32: post_ = new FitsRicem(fits_); break; case 64: post_ = new FitsRicem(fits_); break; case -32: post_ = new FitsRicem(fits_); break; case -64: post_ = new FitsRicem(fits_); break; } else if (!strncmp(type,"GZIP_1",6) || !strncmp(type,"GZIP_2",6)) switch (bitpix) { case 8: post_ = new FitsGzipm(fits_); break; case 16: post_ = new FitsGzipm(fits_); break; case -16: post_ = new FitsGzipm(fits_); break; case 32: post_ = new FitsGzipm(fits_); break; case 64: post_ = new FitsGzipm(fits_); break; case -32: post_ = new FitsGzipm(fits_); break; case -64: post_ = new FitsGzipm(fits_); break; } else if (!strncmp(type,"PLIO_1",6)) switch (bitpix) { case 8: post_ = new FitsPliom(fits_); break; case 16: post_ = new FitsPliom(fits_); break; case -16: post_ = new FitsPliom(fits_); break; case 32: post_ = new FitsPliom(fits_); break; case 64: post_ = new FitsPliom(fits_); break; case -32: post_ = new FitsPliom(fits_); break; case -64: post_ = new FitsPliom(fits_); break; } else if (!strncmp(type,"HCOMPRESS_1",11)) switch (bitpix) { case 8: post_ = new FitsHcompressm(fits_); break; case 16: post_ = new FitsHcompressm(fits_); break; case -16: post_ = new FitsHcompressm(fits_); break; case 32: post_ = new FitsHcompressm(fits_); break; case 64: post_ = new FitsHcompressm(fits_); break; case -32: post_ = new FitsHcompressm(fits_); break; case -64: post_ = new FitsHcompressm(fits_); break; } else { ; // unknown compression type } if (type) delete [] type; return; } saods9/tksao1.0/frame/fitsdata.C000644 000765 000000 00000145203 12621204750 016725 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsdata.h" #include "sigbus.h" #ifdef INTERP #undef INTERP #endif #define INTERP interp_ // ZSCALE #define ZSMAX(a,b) ((a) > (b) ? (a) : (b)) #define ZSMIN(a,b) ((a) < (b) ? (a) : (b)) #define ZSMOD(a,b) ((a) % (b)) #define ZSNINT(a) ((int)(a + 0.5)) #define ZSINDEF 0 // smallest permissible sample #define ZSMIN_NPIXELS 5 // max frac. of pixels to be rejected #define ZSMAX_REJECT 0.5 // k-sigma pixel rejection factor #define ZSKREJ 2.5 // maximum number of fitline iterations #define ZSMAX_ITERATIONS 5 ostream& operator<<(ostream& ss, const FitsBound& fb) { ss << ' ' << fb.xmin << ' ' << fb.ymin << ' ' << fb.xmax << ' ' << fb.ymax; return ss; } // FitsData FitsData::FitsData(FitsFile* fits, Tcl_Interp* pp) { interp_ = pp; FitsImageHDU* hdu = (FitsImageHDU*)fits->head()->hdu(); width_ = hdu->naxis(0); height_ = hdu->naxis(1); buf_[0] = '\0'; byteswap_ = fits->byteswap(); bscale_ = hdu->bscale(); bzero_ = hdu->bzero(); blank_ = hdu->blank(); hasscaling_ = hdu->hasscaling(); switch (hdu->bitpix()) { case 8: case 16: case -16: case 32: case 64: hasblank_ = hdu->hasblank(); break; case -32: case -64: hasblank_ = 0; break; } min_ =0; max_ =0; low_ =0; high_ =0; zLow_ = zHigh_ = 0; aLow_ = aHigh_ = 0; uLow_ = uHigh_ = 0; scanValid_ = 0; zContrast_ = .5; zSample_ = 600; zLine_ = 5; zscaleValid_ = 0; autoCutValid_ = 0; autoCutPer_ = 0; clipMode_ = FrScale::MINMAX; mmMode_ = FrScale::SCAN; if (fits->find("DATAMIN") && fits->find("DATAMAX")) { hasdatamin_ = 1; datamin_ = fits->getReal("DATAMIN", 0); datamax_ = fits->getReal("DATAMAX", 0); } else { hasdatamin_ = 0; datamin_ = datamax_ = 0; } if (fits->find("IRAF-MIN") && fits->find("IRAF-MAX")) { hasirafmin_ = 1; irafmin_ = fits->getReal("IRAF-MIN", 0); irafmax_ = fits->getReal("IRAF-MAX", 0); } else { hasirafmin_ = 0; irafmin_ = irafmax_ = 0; } scanMode_ = FrScale::IMGSEC; } FitsData::~FitsData() { } const char* FitsData::getLow() { ostringstream str; str << low_ << ends; memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } const char* FitsData::getHigh() { ostringstream str; str << high_ << ends; memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } // AutoCut #define AUTOCUTSIZE 10240 void FitsData::autoCut(FitsBound* params) { double amin = min(); double amax = max(); // bin it up double hist[AUTOCUTSIZE]; memset(hist,0,sizeof(double)*AUTOCUTSIZE); bin(hist, AUTOCUTSIZE, amin, amax, params); // find total number of pixels int total = 0; for (int ii=0; ii cutoff) break; } for (hh=AUTOCUTSIZE-1,count=0; hh>ll+1; hh--) { count += hist[hh]; if (count > cutoff) break; } aLow_ = (amax-amin)/AUTOCUTSIZE*ll + amin; aHigh_ = (amax-amin)/AUTOCUTSIZE*hh + amin; } const char* FitsData::getMin() { ostringstream str; switch (mmMode_) { case FrScale::SCAN: str << min_ << ends; break; case FrScale::DATAMIN: if (hasdatamin_) str << datamin_ << ends; else str << ends; break; case FrScale::IRAFMIN: if (hasirafmin_) str << irafmin_ << ends; else str << ends; break; } memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } const char* FitsData::getMax() { ostringstream str; switch (mmMode_) { case FrScale::SCAN: str << max_ << ends; break; case FrScale::DATAMIN: if (hasdatamin_) str << datamax_ << ends; else str << ends; break; case FrScale::IRAFMIN: if (hasirafmin_) str << irafmax_ << ends; else str << ends; break; } memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } double FitsData::min() { switch (mmMode_) { case FrScale::SCAN: return min_; case FrScale::DATAMIN: if (hasdatamin_) return datamin_; else return 0; case FrScale::IRAFMIN: if (hasirafmin_) return irafmin_; else return 0; } } double FitsData::max() { switch (mmMode_) { case FrScale::SCAN: return max_; case FrScale::DATAMIN: if (hasdatamin_) return datamax_; else return 0; case FrScale::IRAFMIN: if (hasirafmin_) return irafmax_; return 0; } } // FitsDatam template FitsDatam::FitsDatam(FitsFile* fits, Tcl_Interp* pp) : FitsData(fits, pp) { data_ = (T*)fits->data(); } // swap (optimized) template <> unsigned char FitsDatam::swap(unsigned char* ptr) { return *ptr; } template <> short FitsDatam::swap(short* ptr) { const char* p = (const char*)ptr; union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; return u.s; } template <> unsigned short FitsDatam::swap(unsigned short* ptr) { const char* p = (const char*)ptr; union { char c[2]; unsigned short s; } u; u.c[1] = *p++; u.c[0] = *p; return u.s; } template <> int FitsDatam::swap(int* ptr) { const char* p = (const char*)ptr; union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.i; } template <> long long FitsDatam::swap(long long* ptr) { const char* p = (const char*)ptr; union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.i; } template <> float FitsDatam::swap(float* ptr) { const char* p = (const char*)ptr; union { char c[4]; float f; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.f; } template <> double FitsDatam::swap(double* ptr) { const char* p = (const char*)ptr; union { char c[8]; double d; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.d; } // Private/Protected // output template void FitsDatam::output(ostringstream& str, T value) { str << value << ends; } template <> void FitsDatam::output(ostringstream& str, unsigned char value) { str << (unsigned short)value << ends; } template <> void FitsDatam::output(ostringstream& str, unsigned short value) { str << (unsigned short)value << ends; } // updateMinMax template void FitsDatam::updateMinMax(FitsBound* params) { if (!scanValid_) { scan(params); scanValid_ = 1; } } // scan (optimized) template <> void FitsDatam::scan(FitsBound* params) { min_ = UCHAR_MAX; max_ = 0; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { unsigned char* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register unsigned char value = *ptr; if (hasblank_ && value == blank_) continue; // skip nan's if (value < min_) min_ = value; if (value > max_) max_ = value; } } CLEARSIGBUS // sanity check if (min_ == UCHAR_MAX && max_ == 0) { min_ =NAN; max_ =NAN; } else { if (hasscaling_) { min_ = min_*bscale_ + bzero_; max_ = max_*bscale_ + bzero_; } } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = SHRT_MAX; max_ = SHRT_MIN; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { short* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register short value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; value = u.s; } if (hasblank_ && value == blank_) continue; // skip nan's if (value < min_) min_ = value; if (value > max_) max_ = value; } } CLEARSIGBUS // sanity check if (min_ == SHRT_MAX && max_ == SHRT_MIN) { min_ =NAN; max_ =NAN; } else { if (hasscaling_) { min_ = min_*bscale_ + bzero_; max_ = max_*bscale_ + bzero_; } } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = USHRT_MAX; max_ = 0; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { unsigned short* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register unsigned short value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[2]; unsigned short s; } u; u.c[1] = *p++; u.c[0] = *p; value = u.s; } if (hasblank_ && value == blank_) continue; // skip nan's if (value < min_) min_ = value; if (value > max_) max_ = value; } } CLEARSIGBUS // sanity check if (min_ == USHRT_MAX && max_ == 0) { min_ =NAN; max_ =NAN; } else { if (hasscaling_) { min_ = min_*bscale_ + bzero_; max_ = max_*bscale_ + bzero_; } } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = INT_MAX; max_ = INT_MIN; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { int* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register int value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; value = u.i; } if (hasblank_ && value == blank_) continue; // skip nan's if (value < min_) min_ = value; if (value > max_) max_ = value; } } CLEARSIGBUS // sanity check if (min_ == INT_MAX && max_ == INT_MIN) { min_ =NAN; max_ =NAN; } else { if (hasscaling_) { min_ = min_*bscale_ + bzero_; max_ = max_*bscale_ + bzero_; } } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = LLONG_MAX; max_ = LLONG_MIN; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { long long* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register long long value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; value = u.i; } if (hasblank_ && value == blank_) continue; // skip nan's if (value < min_) min_ = value; if (value > max_) max_ = value; } } CLEARSIGBUS // sanity check if (min_ == LLONG_MAX && max_ == LLONG_MIN) { min_ =NAN; max_ =NAN; } else { if (hasscaling_) { min_ = min_*bscale_ + bzero_; max_ = max_*bscale_ + bzero_; } } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = FLT_MAX; max_ = -FLT_MAX; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { float* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register float value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[4]; float f; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; value = u.f; } if (isfinite(value)) { if (value < min_) min_ = value; if (value > max_) max_ = value; } } } CLEARSIGBUS // sanity check if (min_ == FLT_MAX && max_ == -FLT_MAX) { min_ =NAN; max_ =NAN; } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } template <> void FitsDatam::scan(FitsBound* params) { min_ = DBL_MAX; max_ = -DBL_MAX; if (DebugPerf) cerr << "FitsDatam::scan()..." << " (" << params->xmin << ',' << params->ymin << ") to (" << params->xmax << ',' << params->ymax << ") "; SETSIGBUS for (int j=params->ymin; jymax; j++) { double* ptr = data_ + j*long(width_) + long(params->xmin); for (int i=params->xmin; ixmax; i++, ptr++) { register double value; if (!byteswap_) value = *ptr; else { const char* p = (const char*)ptr; union { char c[8]; double d; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; value = u.d; } if (isfinite(value)) { if (value < min_) min_ = value; if (value > max_) max_ = value; } } } CLEARSIGBUS // sanity check if (min_ == DBL_MAX && max_ == -DBL_MAX) { min_ =NAN; max_ =NAN; } if (DebugPerf) { cerr << "end" << endl; cerr << "min: " << min_ << " max: " << max_ << endl; } } // Public // updateClip template void FitsDatam::updateClip(FrScale* fr, FitsBound* params) { if (DebugPerf) cerr << "FitsDatam::updateClip()" << endl; clipMode_ = fr->clipMode(); uLow_ = fr->uLow(); uHigh_ = fr->uHigh(); // DATASEC if (scanMode_ != fr->scanMode()) { scanValid_ = 0; zscaleValid_ = 0; autoCutValid_ = 0; } scanMode_ = fr->scanMode(); // MINMAX if (mmMode_ != fr->mmMode()) scanValid_ = 0; mmMode_ = fr->mmMode(); // ZSCALE if (zContrast_ != fr->zContrast() || zSample_ != fr->zSample() || zLine_ != fr->zLine()) zscaleValid_ = 0; zContrast_ = fr->zContrast(); zSample_ = fr->zSample(); zLine_ = fr->zLine(); // AUTOCUT if (mmMode_ != fr->mmMode() || autoCutPer_ != fr->autoCutPer()) autoCutValid_ = 0; autoCutPer_ = fr->autoCutPer(); // always update min/max because everyone needs it updateMinMax(params); switch (clipMode_) { case FrScale::MINMAX: low_ = min(); high_ = max(); break; case FrScale::ZSCALE: if (!zscaleValid_) { zscale(params); zscaleValid_ = 1; } low_ = zLow_; high_ = zHigh_; break; case FrScale::ZMAX: // set low via zscale, high via minmax if (!zscaleValid_) { zscale(params); zscaleValid_ = 1; } low_ = zLow_; high_ = max(); break; case FrScale::AUTOCUT: if (!autoCutValid_) { autoCut(params); autoCutValid_ = 1; } low_ = aLow_; high_ = aHigh_; break; case FrScale::USERCLIP: low_ = uLow_; high_ = uHigh_; break; } } // getValue template const char* FitsDatam::getValue(const Vector& vv) { Vector v(vv); long x = (long)v[0]; long y = (long)v[1]; ostringstream str; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register T value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (hasblank_ && value == blank_) str << "blank" << ends; else if (hasscaling_) str << value * bscale_ + bzero_ << ends; else output(str, value); } else str << ends; memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } template <> const char* FitsDatam::getValue(const Vector& vv) { Vector v(vv); long x = (long)v[0]; long y = (long)v[1]; ostringstream str; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register float value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isinf(value)) str << "inf" << ends; else if (isnan(value)) str << "nan" << ends; else if (hasscaling_) str << value * bscale_ + bzero_ << ends; else str << value << ends; } else str << ends; memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } template <> const char* FitsDatam::getValue(const Vector& vv) { Vector v(vv); long x = (long)v[0]; long y = (long)v[1]; ostringstream str; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register double value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isinf(value)) str << "inf" << ends; else if (isnan(value)) str << "nan" << ends; else if (hasscaling_) str << value * bscale_ + bzero_ << ends; else str << value << ends; } else str << ends; memcpy(buf_,str.str().c_str(),str.str().length()); return buf_; } // getValueFloat(long) (optimized) // no bounds checking, we need the speed template <> float FitsDatam::getValueFloat(long i) { if (!hasblank_ && !hasscaling_) return data_[i]; if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.s; if (hasblank_ && u.s == blank_) return NAN; else return hasscaling_ ? u.s * bscale_ + bzero_ : u.s; } } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[2]; unsigned short s; } u; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.s; if (hasblank_ && u.s == blank_) return NAN; else return hasscaling_ ? u.s * bscale_ + bzero_ : u.s; } } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.i; if (hasblank_ && u.i == blank_) return NAN; else return hasscaling_ ? u.i * bscale_ + bzero_ : u.i; } } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.i; if (hasblank_ && u.i == blank_) return NAN; else return hasscaling_ ? u.i * bscale_ + bzero_ : u.i; } } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_) if (isfinite(data_[i])) return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; else return NAN; else { const char* p = (const char*)(data_+i); union { char c[4]; float f; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (isfinite(u.f)) return hasscaling_ ? u.f * bscale_ + bzero_ : u.f; else return NAN; } } template <> float FitsDatam::getValueFloat(long i) { if (!byteswap_) if (isfinite(data_[i])) return hasscaling_ ? (float)data_[i] * bscale_ + bzero_ : (float)data_[i]; else return NAN; else { const char* p = (const char*)(data_+i); union { char c[8]; double d; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (isfinite(u.d)) return hasscaling_ ? (float)u.d * bscale_ + bzero_ : (float)u.d; else return NAN; } } // getValueFloat(const Vector&) template float FitsDatam::getValueFloat(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register T value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (hasblank_ && value == blank_) return NAN; return hasscaling_ ? value * bscale_ + bzero_ : value; } else return NAN; } template <> float FitsDatam::getValueFloat(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register float value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isfinite(value)) return hasscaling_ ? value * bscale_ + bzero_ : value; else return NAN; } else return NAN; } template <> float FitsDatam::getValueFloat(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register double value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isfinite(value)) return hasscaling_ ? (float)value * bscale_ + bzero_ : (float)value; else return NAN; } else return NAN; } // getValueDouble(long) (optimized) // no bounds checking, we need the speed template <> double FitsDatam::getValueDouble(long i) { if (!hasblank_ && !hasscaling_) return data_[i]; if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.s; if (hasblank_ && u.s == blank_) return NAN; else return hasscaling_ ? u.s * bscale_ + bzero_ : u.s; } } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[2]; unsigned short s; } u; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.s; if (hasblank_ && u.s == blank_) return NAN; else return hasscaling_ ? u.s * bscale_ + bzero_ : u.s; } } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.i; if (hasblank_ && u.i == blank_) return NAN; else return hasscaling_ ? u.i * bscale_ + bzero_ : u.i; } } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasblank_ && !hasscaling_) return data_[i]; if (!byteswap_) { if (hasblank_ && data_[i] == blank_) return NAN; else return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; } else { const char* p = (const char*)(data_+i); union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (!hasblank_ && !hasscaling_) return u.i; if (hasblank_ && u.i == blank_) return NAN; else return hasscaling_ ? u.i * bscale_ + bzero_ : u.i; } } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasscaling_) return (double)data_[i]; if (!byteswap_) { if (isfinite(data_[i])) return hasscaling_ ? (double)data_[i] * bscale_ + bzero_ : (double)data_[i]; else return NAN; } else { const char* p = (const char*)(data_+i); union { char c[4]; float f; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (isfinite(u.f)) return hasscaling_ ? (double)u.f * bscale_ + bzero_ : (double)u.f; else return NAN; } } template <> double FitsDatam::getValueDouble(long i) { if (!byteswap_ && !hasscaling_) return (double)data_[i]; if (!byteswap_) { if (isfinite(data_[i])) return hasscaling_ ? data_[i] * bscale_ + bzero_ : data_[i]; else return NAN; } else { const char* p = (const char*)(data_+i); union { char c[8]; double d; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; if (isfinite(u.d)) return hasscaling_ ? u.d * bscale_ + bzero_ : u.d; else return NAN; } } // getValueDouble(const Vector&) template double FitsDatam::getValueDouble(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register T value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (hasblank_ && value == blank_) return NAN; return hasscaling_ ? value * bscale_ + bzero_ : value; } else return NAN; } template <> double FitsDatam::getValueDouble(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register float value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isfinite(value)) return hasscaling_ ? (double)value * bscale_ + bzero_ : (double)value; else return NAN; } else return NAN; } template <> double FitsDatam::getValueDouble(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) { register double value = !byteswap_ ? data_[y*width_ + x] : swap(data_+(y*width_ + x)); if (isfinite(value)) return hasscaling_ ? value * bscale_ + bzero_ : value; else return NAN; } else return NAN; } // getValueMask template int FitsDatam::getValueMask(const Vector& v) { Vector r = v; long x = (long)r[0]; long y = (long)r[1]; if (x >= 0 && x < width_ && y >= 0 && y < height_) return data_[y*width_ + x] ? 1 : 0; else return 0; } template int FitsDatam::getValueMask(double xx, double yy) { long x = (long)xx; long y = (long)yy; if (x >= 0 && x < width_ && y >= 0 && y < height_) return data_[y*width_ + x] ? 1 : 0; else return 0; } template int FitsDatam::getValueMask(long i) { return data_[i] ? 1 : 0; } // bin template void FitsDatam::bin(double* arr, int length, double mn, double mx, FitsBound* params) { if (DebugPerf) cerr << "FitsDatam::bin()" << endl; double diff = mx-mn; int last = length-1; // special case: mx-mn=0 if (!diff) { arr[0] = (params->xmax-params->xmin)*(params->ymax-params->ymin); return; } SETSIGBUS for (int jj=params->ymin; jjymax; jj++) { T* ptr = data_ + jj*long(width_) + long(params->xmin); for (int ii=params->xmin; iixmax; ii++, ptr++) { register double value = !byteswap_ ? *ptr : swap(ptr); if (hasblank_ && value == blank_) continue; // skip nan's if (hasscaling_) value = value * bscale_ + bzero_; if (value>=mn && value <=mx) arr[(int)((value-mn)/diff*last+.5)]++; } } CLEARSIGBUS } template <> void FitsDatam::bin(double* arr, int length, double mn, double mx, FitsBound* params) { if (DebugPerf) cerr << "FitsDatam::bin()" << endl; double diff = mx-mn; // the last location is always 0 int last = length-2; // special case: mx-mn=0 if (!diff) { arr[0] = (params->xmax-params->xmin)*(params->ymax-params->ymin); return; } SETSIGBUS for (int jj=params->ymin; jjymax; jj++) { float* ptr = data_ + jj*long(width_) + long(params->xmin); for (int ii=params->xmin; iixmax; ii++, ptr++) { register double value = !byteswap_ ? *ptr : swap(ptr); if (!isfinite(value)) continue; // skip nan's if (hasscaling_) value = value * bscale_ + bzero_; if (value>=mn && value<=mx) arr[(int)((value-mn)/diff*last+.5)]++; } } CLEARSIGBUS } template <> void FitsDatam::bin(double* arr, int length, double mn, double mx, FitsBound* params) { if (DebugPerf) cerr << "FitsDatam::bin()" << endl; double diff = mx-mn; int last = length-1; // special case: mx-mn=0 if (!diff) { arr[0] = (params->xmax-params->xmin)*(params->ymax-params->ymin); return; } SETSIGBUS for (int jj=params->ymin; jjymax; jj++) { double* ptr = data_ + jj*long(width_) + long(params->xmin); for (int ii=params->xmin; iixmax; ii++, ptr++) { register double value = !byteswap_ ? *ptr : swap(ptr); if (!isfinite(value)) continue; // skip nan's if (hasscaling_) value = value * bscale_ + bzero_; if (value>=mn && value <=mx) arr[(int)((value-mn)/diff*last+.5)]++; } } CLEARSIGBUS } // ZSCALE // ZSCALE -- Compute the optimal Z1, Z2 (range of greyscale values to be // displayed) of an image. For efficiency a statistical subsample of an image // is used. The pixel sample evenly subsamples the image in x and y. The // entire image is used if the number of pixels in the image is smaller than // the desired sample. // // The sample is accumulated in a buffer and sorted by greyscale value. // The median value is the central value of the sorted array. The slope of a // straight line fitted to the sorted sample is a measure of the standard // deviation of the sample about the median value. Our algorithm is to sort // the sample and perform an iterative fit of a straight line to the sample, // using pixel rejection to omit gross deviants near the endpoints. The fitted // straight line is the transfer function used to map image Z into display Z. // If more than half the pixels are rejected the full range is used. The slope // of the fitted line is divided by the user-supplied contrast factor and the // final Z1 and Z2 are computed, taking the origin of the fitted line at the // median value. template void FitsDatam::zscale(FitsBound* params) { // Subsample the image float* sample; int npix = zSampleImage(&sample,params); int center_pixel = ZSMAX(1, (npix + 1) / 2); // Sort the sample, compute the minimum, maximum, and median pixel values qsort((void*)sample, npix, sizeof(float), fCompare); float zmin = *sample; float zmax = *(sample+ZSMAX(npix,1)-1); // The median value is the average of the two central values if there // are an even number of pixels in the sample. float* left = &(sample[center_pixel - 1]); float median; if (ZSMOD(npix, 2) == 1 || center_pixel >= npix) median = *left; else median = (*left + *(left+1)) / 2; // Fit a line to the sorted sample vector. If more than half of the // pixels in the sample are rejected give up and return the full range. // If the user-supplied contrast factor is not 1.0 adjust the scale // accordingly and compute zLow and zHigh, the y intercepts at indices 1 and // npix. int minpix = ZSMAX(ZSMIN_NPIXELS, (int)(npix * ZSMAX_REJECT)); int ngrow = ZSMAX(1, ZSNINT(npix * .01)); float zstart, zslope; int ngoodpix = zFitLine(sample, npix, &zstart, &zslope, ZSKREJ, ngrow, ZSMAX_ITERATIONS); if (ngoodpix < minpix) { zLow_ = zmin; zHigh_ = zmax; } else { if (zContrast_ > 0) zslope = zslope / zContrast_; zLow_ = ZSMAX(zmin, median - (center_pixel - 1) * zslope); zHigh_ = ZSMIN(zmax, median + (npix - center_pixel) * zslope); } delete [] sample; } // sampleImage -- Extract an evenly gridded subsample of the pixels from // a two-dimensional image into a one-dimensional vector. template int FitsDatam::zSampleImage(float** sample, FitsBound* params) { // Compute the number of pixels each line will contribute to the sample, // and the subsampling step size for a line. The sampling grid must // span the whole line on a uniform grid. int wd = params->xmax - params->xmin; int opt_npix_per_line = ZSMAX(1, ZSMIN(wd, zLine_)); int col_step = ZSMAX(2, (wd + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (wd + col_step-1) / col_step); /* int opt_npix_per_line = ZSMAX(1, ZSMIN(width, zLine)); int col_step = ZSMAX(2, (width + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (width + col_step-1) / col_step); */ // Compute the number of lines to sample and the spacing between lines. // We must ensure that the image is adequately sampled despite its // size, hence there is a lower limit on the number of lines in the // sample. We also want to minimize the number of lines accessed when // accessing a large image, because each disk seek and read is ex- // pensive. The number of lines extracted will be roughly the sample // size divided by zLine, possibly more if the lines are very // short. int hd = params->ymax-params->ymin; int min_nlines_in_sample = ZSMAX(1, zSample_ / zLine_); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(hd, (zSample_ + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, hd / opt_nlines_in_sample); int max_nlines_in_sample = (hd + line_step-1) / line_step; /* int min_nlines_in_sample = ZSMAX(1, zSample / zLine); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(height, (zSample + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, height / opt_nlines_in_sample); int max_nlines_in_sample = (height + line_step-1) / line_step; */ // Allocate space for the output vector. Buffer must be freed by our caller. int maxpix = npix_per_line * max_nlines_in_sample; *sample = new float[maxpix]; // float* row = new float[width]; float* row = new float[wd]; // Extract the vector int npix = 0; float* op = *sample; // for (int line = (line_step + 1)/2; line < height; line+=line_step) { for (int line = (line_step + 1)/2 + params->ymin; line < params->ymax; line+=line_step) { // Load a row of values from the image // for (int i=0; i < width; i++) { for (int i=0; ixmin); T value = !byteswap_ ? *ptr : swap(ptr); if (hasblank_ && (value == blank_)) row[i] = NAN; else row[i] = hasscaling_ ? value * bscale_ + bzero_ : value; } int got = zSubSample(row, op, npix_per_line, col_step); op += got; npix += got; if (npix >= maxpix) break; } delete [] row; return npix; } template <> int FitsDatam::zSampleImage(float** sample, FitsBound* params) { // Compute the number of pixels each line will contribute to the sample, // and the subsampling step size for a line. The sampling grid must // span the whole line on a uniform grid. int wd = params->xmax - params->xmin; int opt_npix_per_line = ZSMAX(1, ZSMIN(wd, zLine_)); int col_step = ZSMAX(2, (wd + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (wd + col_step-1) / col_step); /* int opt_npix_per_line = ZSMAX(1, ZSMIN(width, zLine)); int col_step = ZSMAX(2, (width + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (width + col_step-1) / col_step); */ // Compute the number of lines to sample and the spacing between lines. // We must ensure that the image is adequately sampled despite its // size, hence there is a lower limit on the number of lines in the // sample. We also want to minimize the number of lines accessed when // accessing a large image, because each disk seek and read is ex- // pensive. The number of lines extracted will be roughly the sample // size divided by zLine, possibly more if the lines are very // short. int hd = params->ymax-params->ymin; int min_nlines_in_sample = ZSMAX(1, zSample_ / zLine_); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(hd, (zSample_ + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, hd / opt_nlines_in_sample); int max_nlines_in_sample = (hd + line_step-1) / line_step; /* int min_nlines_in_sample = ZSMAX(1, zSample / zLine); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(height, (zSample + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, height / opt_nlines_in_sample); int max_nlines_in_sample = (height + line_step-1) / line_step; */ // Allocate space for the output vector. Buffer must be freed by our caller. int maxpix = npix_per_line * max_nlines_in_sample; *sample = new float[maxpix]; // float* row = new float[width]; float* row = new float[wd]; // Extract the vector int npix = 0; float* op = *sample; // for (int line = (line_step + 1)/2; line < height; line+=line_step) { for (int line = (line_step + 1)/2 + params->ymin; line < params->ymax; line+=line_step) { // Load a row of values from the image // for (int i=0; i < width; i++) { for (int i=0; ixmin); float value = !byteswap_ ? *ptr : swap(ptr); if (isfinite(value)) row[i] = hasscaling_ ? value * bscale_ + bzero_ : value; else row[i] = NAN; } int got = zSubSample(row, op, npix_per_line, col_step); op += got; npix += got; if (npix >= maxpix) break; } delete [] row; return npix; } template <> int FitsDatam::zSampleImage(float** sample, FitsBound* params) { // Compute the number of pixels each line will contribute to the sample, // and the subsampling step size for a line. The sampling grid must // span the whole line on a uniform grid. int wd = params->xmax - params->xmin; int opt_npix_per_line = ZSMAX(1, ZSMIN(wd, zLine_)); int col_step = ZSMAX(2, (wd + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (wd + col_step-1) / col_step); /* int opt_npix_per_line = ZSMAX(1, ZSMIN(width, zLine)); int col_step = ZSMAX(2, (width + opt_npix_per_line-1) / opt_npix_per_line); int npix_per_line = ZSMAX(1, (width + col_step-1) / col_step); */ // Compute the number of lines to sample and the spacing between lines. // We must ensure that the image is adequately sampled despite its // size, hence there is a lower limit on the number of lines in the // sample. We also want to minimize the number of lines accessed when // accessing a large image, because each disk seek and read is ex- // pensive. The number of lines extracted will be roughly the sample // size divided by zLine, possibly more if the lines are very // short. int hd = params->ymax-params->ymin; int min_nlines_in_sample = ZSMAX(1, zSample_ / zLine_); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(hd, (zSample_ + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, hd / opt_nlines_in_sample); int max_nlines_in_sample = (hd + line_step-1) / line_step; /* int min_nlines_in_sample = ZSMAX(1, zSample / zLine); int opt_nlines_in_sample = ZSMAX(min_nlines_in_sample, ZSMIN(height, (zSample + npix_per_line-1) / npix_per_line)); int line_step = ZSMAX(2, height / opt_nlines_in_sample); int max_nlines_in_sample = (height + line_step-1) / line_step; */ // Allocate space for the output vector. Buffer must be freed by our caller. int maxpix = npix_per_line * max_nlines_in_sample; *sample = new float[maxpix]; // float* row = new float[width]; float* row = new float[wd]; // Extract the vector int npix = 0; float* op = *sample; // for (int line = (line_step + 1)/2; line < height; line+=line_step) { for (int line = (line_step + 1)/2 + params->ymin; line < params->ymax; line+=line_step) { // Load a row of values from the image // for (int i=0; i < width; i++) { for (int i=0; ixmin); double value = !byteswap_ ? *ptr : swap(ptr); if (isfinite(value)) row[i] = hasscaling_ ? (float)value * bscale_ + bzero_ : (float)value; else row[i] = NAN; } int got = zSubSample(row, op, npix_per_line, col_step); op += got; npix += got; if (npix >= maxpix) break; } delete [] row; return npix; } // subSample -- Subsample an image line. Extract the first pixel and // every "step"th pixel thereafter for a total of npix pixels. int FitsData::zSubSample(float* a, float* b, int npix, int step) { if (step <= 1) step = 1; int got = 0; int ip = 0; for (int i=0; i 0) { double rowrat = sumx / sumxsqr; z0 = (sumz - rowrat * sumxz) / (ngoodpix - rowrat * sumx); dz = (sumxz - z0 * sumx) / sumxsqr; } if (ngoodpix >= last_ngoodpix || ngoodpix < minpix) break; } // Transform the line coefficients back to the X range [1:npix] *zstart = z0 - dz; *zslope = dz * xscale; delete [] flat; delete [] normx; delete [] badpix; return ngoodpix; } // flattenData -- Compute and subtract the fitted line from the data array, // returned the flattened data in FLAT. void FitsData::zFlattenData(float* sampleData, float* flat, float* x, int npix, float z0, float dz) { for (int i=0; i < npix; i++) flat[i] = sampleData[i] - (x[i] * dz + z0); } // computeSigma -- Compute the root mean square deviation from the // mean of a flattened array. Ignore rejected pixels. int FitsData::zComputeSigma(float* a, short* badpix, int npix, float* mean, float* sigma) { int ngoodpix = 0; double sum = 0.0; double sumsq = 0.0; // Accumulate sum and sum of squares for (int i=0; i < npix; i++) if (badpix[i] == GOOD_PIXEL) { float pixval = a[i]; ngoodpix = ngoodpix + 1; sum = sum + pixval; sumsq = sumsq + pixval * pixval; } // Compute mean and sigma switch (ngoodpix) { case 0: *mean = ZSINDEF; *sigma = ZSINDEF; break; case 1: *mean = sum; *sigma = ZSINDEF; break; default: *mean = sum / ngoodpix; double temp = sumsq / (ngoodpix-1) - (sum*sum) / (ngoodpix*(ngoodpix - 1)); if (temp < 0) // possible with roundoff error *sigma = 0.0; else *sigma = sqrt(temp); } return ngoodpix; } // rejectPixels -- Detect and reject pixels more than "threshold" greyscale // units from the fitted line. The residuals about the fitted line are given // by the "flat" array, while the raw data is in "data". Each time a pixel // is rejected subtract its contributions from the matrix sums and flag the // pixel as rejected. When a pixel is rejected reject its neighbors out to // a specified radius as well. This speeds up convergence considerably and // produces a more stringent rejection criteria which takes advantage of the // fact that bad pixels tend to be clumped. The number of pixels left in the // fit is returned as the function value. int FitsData::zRejectPixels(float* sampleData, float* flat, float *normx, short *badpix, int npix, double* sumxsqr, double* sumxz, double* sumx, double* sumz, float threshold, int ngrow) { int ngoodpix = npix; float lcut = -threshold; float hcut = threshold; for (int i=0; i < npix; i++) { if (badpix[i] == BAD_PIXEL) ngoodpix = ngoodpix - 1; else { float residual = flat[i]; if (residual < lcut || residual > hcut) { // Reject the pixel and its neighbors out to the growing // radius. We must be careful how we do this to avoid // directional effects. Do not turn off thresholding on // pixels in the forward direction; mark them for rejection // but do not reject until they have been thresholded. // If this is not done growing will not be symmetric. for (int j=ZSMAX(0,i-ngrow); j < ZSMIN(npix,i+ngrow); j++) { if (badpix[j] != BAD_PIXEL) { if (j <= i) { double x = normx[j]; double z = sampleData[j]; *sumxsqr = *sumxsqr - (x * x); *sumxz = *sumxz - z * x; *sumx = *sumx - x; *sumz = *sumz - z; badpix[j] = BAD_PIXEL; ngoodpix = ngoodpix - 1; } else badpix[j] = REJECT_PIXEL; } } } } } return ngoodpix; } template class FitsDatam; template class FitsDatam; template class FitsDatam; template class FitsDatam; template class FitsDatam; template class FitsDatam; template class FitsDatam; saods9/tksao1.0/frame/fitsdata.h000644 000765 000000 00000007521 12621204750 016772 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsdata_h__ #define __fitsdata_h__ #include "base.h" #include "file.h" class ColorScale; class FitsFile; class FitsBound { public: int xmin; int xmax; int ymin; int ymax; public: FitsBound() {xmin= xmax= ymin= ymax= 0;} FitsBound(int x0, int y0, int x1, int y1) {xmin=x0; xmax=x1; ymin=y0; ymax=y1;} FitsBound(const FitsBound &bb) {xmin=bb.xmin; xmax=bb.xmax; ymin=bb.ymin; ymax=bb.ymax;} void set(int x0, int y0, int x1, int y1) {xmin=x0; xmax=x1; ymin=y0; ymax=y1;} }; ostream& operator<<(ostream&, const FitsBound&); class FitsData { protected: Tcl_Interp* interp_; long width_; long height_; char buf_[32]; int byteswap_; double bscale_; double bzero_; int hasscaling_; int blank_; int hasblank_; double min_; // bscale applied double max_; // bscale applied double high_; // bscale applied double low_; // bscale applied float zHigh_; // bscale applied float zLow_; // bscale applied double aLow_; // bscale applied double aHigh_; // bscale applied double uLow_; // bscale applied double uHigh_; // bscale applied int scanValid_; float zContrast_; int zSample_; int zLine_; int zscaleValid_; int autoCutValid_; float autoCutPer_; FrScale::ClipMode clipMode_; FrScale::MinMaxMode mmMode_; FrScale::ScanMode scanMode_; double datamin_; // bscale applied double datamax_; // bscale applied int hasdatamin_; double irafmin_; // bscale applied double irafmax_; // bscale applied int hasirafmin_; // zscale constants enum PixelType {GOOD_PIXEL, BAD_PIXEL, REJECT_PIXEL}; int zSubSample(float*, float*, int, int); int zFitLine(float*, int, float*, float*, float, int, int); void zFlattenData (float*, float*, float*, int npix, float, float dz); int zComputeSigma (float*, short*, int npix, float*, float*); int zRejectPixels (float*, float*, float*, short*, int, double*, double*, double*, double*, float, int); protected: void autoCut(FitsBound*); public: FitsData(FitsFile*, Tcl_Interp*); virtual ~FitsData(); virtual void* data() =0; virtual const char* getValue(const Vector&) =0; virtual float getValueFloat(const Vector&) =0; virtual double getValueDouble(const Vector&) =0; virtual int getValueMask(const Vector&) =0; virtual int getValueMask(double,double) =0; virtual float getValueFloat(long) =0; virtual double getValueDouble(long) =0; virtual int getValueMask(long) =0; const char* getMin(); const char* getMax(); const char* getLow(); const char* getHigh(); double min(); double max(); double low() {return low_;} double high() {return high_;} void setClip(double ll, double hh) {low_ =ll; high_ =hh;} virtual void updateClip(FrScale*, FitsBound*) =0; int hasDATAMIN() {return hasdatamin_;} int hasIRAFMIN() {return hasirafmin_;} virtual void bin(double*,int,double,double,FitsBound*) =0; }; template class FitsDatam : public FitsData { private: T* data_; void updateMinMax(FitsBound*); void scan(FitsBound*); void output(ostringstream&, T); void zscale(FitsBound*); int zSampleImage(float**,FitsBound*); public: FitsDatam(FitsFile*, Tcl_Interp*); T swap(T*); void* data() {return data_;} const char* getValue(const Vector&); float getValueFloat(const Vector&); double getValueDouble(const Vector&); int getValueMask(const Vector&); int getValueMask(double, double); float getValueFloat(long i); double getValueDouble(long i); int getValueMask(long i); void updateClip(FrScale*, FitsBound*); void bin(double*, int, double, double, FitsBound*); }; #endif saods9/tksao1.0/frame/fitsenvi.C000644 000765 000000 00000003130 12537642733 016762 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "envi.h" void FitsImage::initENVI() { if (post_) delete post_; post_ = NULL; switch (fits_->pEncoding()) { case FitsFile::BSQ: // better not see this break; case FitsFile::BIL: switch (fits_->pBitpix()) { case 8: post_ = new FitsENVIBILm(fits_); break; case 16: post_ = new FitsENVIBILm(fits_); break; case -16: post_ = new FitsENVIBILm(fits_); break; case 32: post_ = new FitsENVIBILm(fits_); break; case 64: post_ = new FitsENVIBILm(fits_); break; case -32: post_ = new FitsENVIBILm(fits_); break; case -64: post_ = new FitsENVIBILm(fits_); break; } break; case FitsFile::BIP: switch (fits_->pBitpix()) { case 8: post_ = new FitsENVIBIPm(fits_); break; case 16: post_ = new FitsENVIBIPm(fits_); break; case -16: post_ = new FitsENVIBIPm(fits_); break; case 32: post_ = new FitsENVIBIPm(fits_); break; case 64: post_ = new FitsENVIBIPm(fits_); break; case -32: post_ = new FitsENVIBIPm(fits_); break; case -64: post_ = new FitsENVIBIPm(fits_); break; } break; default: // na break; } return; } saods9/tksao1.0/frame/fitshealpix.C000644 000765 000000 00000003335 12537605764 017465 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "hpx.h" void FitsImage::initHPX() { if (hpx_) delete hpx_; hpx_ = NULL; // make sure we have rows and cols FitsHead* head = fits_->head(); FitsTableHDU* hdu = NULL; if (head) { hdu = (FitsTableHDU*)(head->hdu()); if (!hdu->width() || !hdu->rows()) return; } // coordinate system identifier? FitsHPX::CoordSys coord = FitsHPX::UNKNOWN; if (fits_->pHPXSystem() >= 0) coord = (FitsHPX::CoordSys)fits_->pHPXSystem(); else { char* str = head->getString("COORDSYS"); if (str) { if (str[0] == 'G') coord = FitsHPX::GAL; else if (str[0] == 'E') coord = FitsHPX::ECL; else if (str[0] == 'C') coord = FitsHPX::EQU; else if (str[0] == 'Q') coord = FitsHPX::EQU; delete [] str; } } // Nested or ring order? FitsHPX::Order order = FitsHPX::RING; if (fits_->pHPXOrder() >=0) order = (FitsHPX::Order)fits_->pHPXOrder(); else { char* str = head->getString("ORDERING"); if (str) { if (str[0] == 'N') order = FitsHPX::NESTED; else if (str[0] == 'R') order = FitsHPX::RING; delete [] str; } } // Layout FitsHPX::Layout layout = FitsHPX::EQUATOR; if (fits_->pHPXLayout() >=0) layout = (FitsHPX::Layout)fits_->pHPXLayout(); // Col int col =0; if (fits_->pHPXColumn() >=0) col = fits_->pHPXColumn(); if (col<0) col =0; // Quad int quad = 0; if (fits_->pHPXQuad() >=0) quad = fits_->pHPXQuad(); if (quad<0 || quad>3) quad =0; hpx_ = new FitsHPX(fits_, order, coord, layout, col, quad); } saods9/tksao1.0/frame/fitsimage.C000644 000765 000000 00000275546 12631640531 017116 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "framebase.h" #include "context.h" #include "mmap.h" #include "smmap.h" #include "mmapincr.h" #include "alloc.h" #include "allocgz.h" #include "channel.h" #include "share.h" #include "sshare.h" #include "socket.h" #include "socketgz.h" #include "var.h" #include "order.h" #include "iis.h" #include "hist.h" #include "compress.h" #include "analysis.h" #include "photo.h" #include "colorscale.h" // this is kluge to speed up doug minks wcssubs 'ksearch' routine extern "C" { FitsHead* wcshead = NULL; FitsHead* wcsprim = NULL; char* ksearchh(char*, char*); char* findit(char* cards, char* key) { char* rr = NULL; if (wcshead) { if ((rr = wcshead->find(key))) return rr; if (wcsprim) if ((rr = wcsprim->find(key))) return rr; return NULL; } else return ksearchh(cards, key); } }; WCSx::WCSx() { for (int ii=0; iifitsFile(), hdr, data, sz); process(NULL,id); rootBaseFileName = dupstr(fi->rootBaseFileName); fullBaseFileName = dupstr(fi->fullBaseFileName); iisFileName = dupstr(fi->fullBaseFileName); } // Fits Next FitsImageFitsNextAlloc::FitsImageFitsNextAlloc(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextAlloc(prev); process(fn,id); } FitsImageFitsNextAllocGZ::FitsImageFitsNextAllocGZ(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextAllocGZ(prev); process(fn,id); } FitsImageFitsNextChannel::FitsImageFitsNextChannel(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextChannel(prev); process(fn,id); } FitsImageFitsNextMMap::FitsImageFitsNextMMap(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextMMap(prev); process(fn,id); } FitsImageFitsNextSMMap::FitsImageFitsNextSMMap(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextSMMap(prev); process(fn,id); } FitsImageFitsNextMMapIncr::FitsImageFitsNextMMapIncr(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextMMapIncr(prev); process(fn,id); } FitsImageFitsNextShare::FitsImageFitsNextShare(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextShare(prev); process(fn,id); } FitsImageFitsNextSShare::FitsImageFitsNextSShare(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextSShare(prev); process(fn,id); } FitsImageFitsNextSocket::FitsImageFitsNextSocket(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextSocket(prev); process(fn,id); } FitsImageFitsNextSocketGZ::FitsImageFitsNextSocketGZ(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextSocketGZ(prev); process(fn,id); } FitsImageFitsNextVar::FitsImageFitsNextVar(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsFitsNextVar(prev); process(fn,id); } FitsImageFitsNextHist::FitsImageFitsNextHist(Context* cx, Tcl_Interp* pp, FitsImage* fi, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsHistNext(prev); process(NULL,id); fits_->setpFilter(fi->getHistFilter()); fits_->setpBinX(fi->getHistX()); fits_->setpBinY(fi->getHistY()); fits_->setpBinZ(fi->getHistZ()); rootBaseFileName = dupstr(fi->rootBaseFileName); fullBaseFileName = dupstr(fi->fullBaseFileName); iisFileName = dupstr(fi->fullBaseFileName); } FitsImageFitsNextPost::FitsImageFitsNextPost(Context* cx, Tcl_Interp* pp, FitsImage* fi, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsPostNext(prev); process(NULL,id); rootBaseFileName = dupstr(fi->rootBaseFileName); fullBaseFileName = dupstr(fi->fullBaseFileName); iisFileName = dupstr(fi->fullBaseFileName); } FitsImageFitsNextOrder::FitsImageFitsNextOrder(Context* cx, Tcl_Interp* pp, FitsImage* fi, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsOrderNext(prev); process(NULL,id); rootBaseFileName = dupstr(fi->rootBaseFileName); fullBaseFileName = dupstr(fi->fullBaseFileName); iisFileName = dupstr(fi->fullBaseFileName); } // Array FitsImageArrAlloc::FitsImageArrAlloc(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsArrAlloc(ch, flush); process(fn,id); } FitsImageArrAllocGZ::FitsImageArrAllocGZ(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsArrAllocGZ(ch, flush); process(fn,id); } FitsImageArrChannel::FitsImageArrChannel(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsArrChannel(pp, ch, fn, flush); process(fn,id); } FitsImageArrMMap::FitsImageArrMMap(Context* cx, Tcl_Interp* pp, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsArrMMap(fn); process(fn,id); } FitsImageArrMMapIncr::FitsImageArrMMapIncr(Context* cx, Tcl_Interp* pp, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsArrMMapIncr(fn); process(fn,id); } FitsImageArrShare::FitsImageArrShare(Context* cx, Tcl_Interp* pp, Base::ShmType type, int sid, const char* fn, int id) : FitsImage(cx, pp) { switch (type) { case Base::SHMID: fits_ = new FitsArrShareID(sid, fn); break; case Base::KEY: fits_ = new FitsArrShareKey(sid, fn); break; } process(fn,id); } FitsImageArrSocket::FitsImageArrSocket(Context* cx, Tcl_Interp* pp, int s, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsArrSocket(s, fn, flush); process(fn,id); } FitsImageArrSocketGZ::FitsImageArrSocketGZ(Context* cx, Tcl_Interp* pp, int s, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsArrSocketGZ(s, fn, flush); process(fn,id); } FitsImageArrVar::FitsImageArrVar(Context* cx, Tcl_Interp* pp, const char* var, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsArrVar(pp, var, fn); process(fn,id); } // ENVI FitsImageENVISMMap::FitsImageENVISMMap(Context* cx, Tcl_Interp* pp, const char* hdr, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsENVISMMap(hdr,fn); process(fn,id); } // NRRD FitsImageNRRDAlloc::FitsImageNRRDAlloc(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsNRRDAlloc(ch, flush); process(fn,id); } FitsImageNRRDChannel::FitsImageNRRDChannel(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsNRRDChannel(pp, ch, fn, flush); process(fn,id); } FitsImageNRRDMMap::FitsImageNRRDMMap(Context* cx, Tcl_Interp* pp, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsNRRDMMap(fn); process(fn,id); } FitsImageNRRDShare::FitsImageNRRDShare(Context* cx, Tcl_Interp* pp, Base::ShmType type, int sid, const char* fn, int id) : FitsImage(cx, pp) { switch (type) { case Base::SHMID: fits_ = new FitsNRRDShareID(sid, fn); break; case Base::KEY: fits_ = new FitsNRRDShareKey(sid, fn); break; } process(fn,id); } FitsImageNRRDSocket::FitsImageNRRDSocket(Context* cx, Tcl_Interp* pp, int s, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsNRRDSocket(s, fn, flush); process(fn,id); } FitsImageNRRDVar::FitsImageNRRDVar(Context* cx, Tcl_Interp* pp, const char* var, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsNRRDVar(pp, var, fn); process(fn,id); } // Photo FitsImagePhoto::FitsImagePhoto(Context* cx, Tcl_Interp* pp, const char* ph, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsPhoto(pp, ph); process(fn,id); } FitsImagePhotoCube::FitsImagePhotoCube(Context* cx, Tcl_Interp* pp, const char* ph, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsPhotoCube(pp, ph); process(fn,id); } FitsImagePhotoCubeNext::FitsImagePhotoCubeNext(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsPhotoCubeNext(prev); process(fn,id); } // Mosaic FitsImageMosaicAlloc::FitsImageMosaicAlloc(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicAlloc(ch, flush); process(fn,id); } FitsImageMosaicAllocGZ::FitsImageMosaicAllocGZ(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicAllocGZ(ch, flush); process(fn,id); } FitsImageMosaicChannel::FitsImageMosaicChannel(Context* cx, Tcl_Interp* pp, const char* ch, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicChannel(pp, ch, flush); process(fn,id); } FitsImageMosaicMMap::FitsImageMosaicMMap(Context* cx, Tcl_Interp* pp, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicMMap(fn); process(fn,id); } FitsImageMosaicMMapIncr::FitsImageMosaicMMapIncr(Context* cx, Tcl_Interp* pp, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicMMapIncr(fn); process(fn,id); } FitsImageMosaicShare::FitsImageMosaicShare(Context* cx, Tcl_Interp* pp, Base::ShmType type, int sid, const char* fn, int id) : FitsImage(cx, pp) { switch (type) { case Base::SHMID: fits_ = new FitsMosaicShareID(sid); break; case Base::KEY: fits_ = new FitsMosaicShareKey(sid); break; } process(fn,id); } FitsImageMosaicSocket::FitsImageMosaicSocket(Context* cx, Tcl_Interp* pp, int s, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicSocket(s, flush); process(fn,id); } FitsImageMosaicSocketGZ::FitsImageMosaicSocketGZ(Context* cx, Tcl_Interp* pp, int s, const char* fn, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicSocketGZ(s, flush); process(fn,id); } FitsImageMosaicVar::FitsImageMosaicVar(Context* cx, Tcl_Interp* pp, const char* var, const char* fn, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicVar(pp, var, fn); process(fn,id); } // Mosaic Next FitsImageMosaicNextAlloc::FitsImageMosaicNextAlloc(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextAlloc(prev, flush); process(fn,id); } FitsImageMosaicNextAllocGZ::FitsImageMosaicNextAllocGZ(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextAllocGZ(prev, flush); process(fn,id); } FitsImageMosaicNextChannel::FitsImageMosaicNextChannel(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextChannel(prev, flush); process(fn,id); } FitsImageMosaicNextMMap::FitsImageMosaicNextMMap(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextMMap(prev); process(fn,id); } FitsImageMosaicNextMMapIncr::FitsImageMosaicNextMMapIncr(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextMMapIncr(prev); process(fn,id); } FitsImageMosaicNextShare::FitsImageMosaicNextShare(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextShare(prev); process(fn,id); } FitsImageMosaicNextSocket::FitsImageMosaicNextSocket(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextSocket(prev, flush); process(fn,id); } FitsImageMosaicNextSocketGZ::FitsImageMosaicNextSocketGZ(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, FitsFile::FlushMode flush, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextSocketGZ(prev, flush); process(fn,id); } FitsImageMosaicNextVar::FitsImageMosaicNextVar(Context* cx, Tcl_Interp* pp, const char* fn, FitsFile* prev, int id) : FitsImage(cx, pp) { fits_ = new FitsMosaicNextVar(prev); process(fn,id); } // IIS FitsImageIIS::FitsImageIIS(Context* cx, Tcl_Interp* pp, int w, int h) : FitsImage(cx, pp) { fits_ = new FitsIIS(w, h); process("",1); iisMode_ = 1; } void FitsImageIIS::iisErase() { ((FitsIIS*)fits_)->erase(); } char* FitsImageIIS::iisGet(int xx, int yy, int dx, int dy) { return ((FitsIIS*)fits_)->get(xx, yy, dx, dy); } void FitsImageIIS::iisSet(const char* src, int xx, int yy, int dx, int dy) { ((FitsIIS*)fits_)->set(src, xx, yy, dx, dy); } void FitsImageIIS::iisWCS(const Matrix& mm, const Vector& z, int zt) { Matrix& mx = (Matrix&)mm; double sx = mx[0][0]; double sy = mx[1][1]; double tx = mx[2][0]; double ty = mx[2][1]; imageToPhysical = Translate(0,-height()/2.) * FlipY() * Translate(0,height()/2.) * Translate(-1,0) * Scale(sx,sy) * Translate(tx,ty); physicalToImage = imageToPhysical.invert(); iisz_ = z; iiszt_ = zt; } // FitsImage void FitsImage::altWCS(istream& str) { FitsHead* hh = parseWCS(str); // Process OBJECT keyword if (objectKeyword_) delete [] objectKeyword_; objectKeyword_ = hh->getString("OBJECT"); // Process WCS keywords if (altHeader_) delete altHeader_; altHeader_ = hh; initWCS(); } void FitsImage::appendWCS(istream& str) { FitsHead* hh = parseWCS(str); // process OBJECT keyword char* obj = hh->getString("OBJECT"); if (obj) { if (objectKeyword_) delete [] objectKeyword_; objectKeyword_ = obj; } // Process WCS keywords FitsHead* head = image_->head(); // append wcs keywords to the end of the header int ll = head->headbytes()+hh->headbytes(); char* cards = new char[ll]; // copy default wcs memcpy(cards, head->cards(), head->headbytes()); // find first END and zero out for (int i=0; iheadbytes(); i+=80) if (!strncmp(cards+i,"END",3)) { memcpy(cards+i, " ",3); break; } // copy appended wcs memcpy(cards+head->headbytes(), hh->cards(), hh->headbytes()); delete hh; if (wcsHeader_) delete wcsHeader_; wcsHeader_ = new FitsHead(cards,ll,FitsHead::ALLOC); initWCS(); } char* FitsImage::display(FitsHead* head) { int size = head->ncard() * (FTY_CARDLEN+1); char* lbuf = new char[size+1]; char* lptr = lbuf; char* cptr = head->cards(); for (int i=0; incard(); i++,cptr+=FTY_CARDLEN) { memcpy(lptr, cptr, FTY_CARDLEN); lptr+=FTY_CARDLEN; *(lptr++) = '\n'; } lbuf[size] = '\0'; return lbuf; } char* FitsImage::displayHeader() { Vector blockFactor = context_->blockFactor(); if (blockFactor[0] != 1 && blockFactor[1] != 1) return display(image_->head()); if (DebugBin || DebugCompress) return display(image_->head()); else return display(fits_->head()); } char* FitsImage::displayPrimary() { return display(fits_->primary()); } char* FitsImage::displayWCS() { if (wcsHeader_) return display(wcsHeader_); else if (altHeader_) return display(altHeader_); else return display(image_->head()); } int FitsImage::findKeyword(const char* key) { return fits_->find(key); } FitsBound* FitsImage::getDataParams(FrScale::ScanMode which) { switch (which) { case FrScale::IMGSEC: return &iparams; case FrScale::DATASEC: return &dparams; case FrScale::CROPSEC: return &cparams; } } const char* FitsImage::getValue(const Vector& v) { if (!isIIS()) return data_->getValue(v); else { double val = data_->getValueDouble(v); ostringstream str; if (val == 0) str << ends; else if (val == 1) str << '<' << iisz_[0] << ends; else if (val == IISMAX) str << '>' << iisz_[1] << ends; else if (val > IISMAX) str << ends; else str << ((val-1) * (iisz_[1]-iisz_[0]))/(IISMAX-1) + iisz_[0] << ends; memcpy(buf,str.str().c_str(), str.str().length()); return buf; } } void FitsImage::iisSetFileName(const char* fn) { if (iisFileName) delete [] iisFileName; iisFileName = dupstr(fn); } void FitsImage::initWCS() { // free up wcs and ast arrays if (wcs_) { for (int ii=0; iishareWCS()) { FitsImage* ptr = context_->fits; while (ptr) { if (ptr == this) break; FitsImage* sptr = ptr->nextSlice(); while (sptr) { if (sptr == this) { for (int ii=0; iiwcs_[ii]; for (int ii=0; iiwcsx_[ii]; for (int ii=0; iiast_[ii]; initWCSPhysical(); manageWCS_ =0; return; } sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } // WCSx FitsHead* head =NULL; FitsHead* prim =NULL; if (wcsHeader_) head = wcsHeader_; else if (altHeader_) head = altHeader_; else { head = image_->head(); prim = image_->primary() && image_->inherit() ? image_->primary() : NULL; } // wcsinit is sloooowwww! so try to figure it out first // look first for default WCS. Let wcsinit figure it out since there can // be many different non-standard wcs's present wcshead = head; wcsprim = prim; wcs_[0] = wcsinit(head->cards()); wcshead = NULL; wcsprim = NULL; // now look for WCSA - WCSZ // we can take a short cut here, since only valid FITS wcs's are available for (int ii=1; iifind(str)) { wcshead = head; wcsprim = prim; wcs_[ii] = wcsinitc(head->cards(),str+6); wcshead = NULL; wcsprim = NULL; } } // finally, look for AST def if (!wcs_[0]) { char str[] = "BEGAST_A"; if (head->find(str)) { wcs_[0] = wcskinit(100, 100, (char*)"AST--WCS", (char*)"AST--WCS", 0, 0, 0, 0, NULL, 1, 1, 0, 2000, 0); wcs_[0]->longpole = 999; wcs_[0]->latpole = 999; } } // AST for (int ii=0; iifind("WCSDEP")) { char* str = head->getString("WCSDEP"); if (str) { for (int ii=1; iiwcsname) { if (!strncmp(str,wcs_[ii]->wcsname,strlen(wcs_[ii]->wcsname))) { if (ast_[0] && ast_[ii]) { AstFrameSet* dep = (AstFrameSet*)astCopy(ast_[ii]); astInvert(ast_[0]); astAddFrame(dep,2,astUnitMap(2,""),ast_[0]); astSetI(dep,"current",4); astAnnul(ast_[0]); ast_[0] = dep; } } } } } delete [] str; } } // WCSx char scrpix[] = "CRPIX "; char scrval[] = "CRVAL "; char scd[] = "CD _ "; char scdelt[] = "CDELT "; for (int ii=0; iifind(scrpix) && head->find(scrval)) { if (!wcsx_[ii]) wcsx_[ii] = new WCSx(); wcsx_[ii]->crpix[jj] = head->getReal(scrpix,0); wcsx_[ii]->crval[jj] = head->getReal(scrval,0); wcsx_[ii]->cd[jj] = head->getReal(scd,0); if (!wcsx_[ii]->cd[jj]) wcsx_[ii]->cd[jj] = head->getReal(scdelt,0); } } } initWCSPhysical(); if (DebugWCS) { for (int ii=0; iicd[jj]) { cerr << "wcsx" << (char)(!ii ? ' ' : '@'+ii) << "[" << ii << "]->crpix[" << jj << "]=" << wcsx_[ii]->crpix[jj] << endl; cerr << "wcsx" << (char)(!ii ? ' ' : '@'+ii) << "[" << ii << "]->crval[" << jj << "]=" << wcsx_[ii]->crval[jj] << endl; cerr << "wcsx" << (char)(!ii ? ' ' : '@'+ii) << "[" << ii << "]->cd[" << jj << "]=" << wcsx_[ii]->cd[jj] << endl; } } } } } } void FitsImage::initWCSPhysical() { // now see if we have a 'physical' wcs, if so, set LTMV keywords keyLTMV =0; for (int ii=1; iiwcsname && !strncmp(wcs_[ii]->wcsname, "PHYSICAL", 8)) { keyLTMV = 1; double ltm11 = wcs_[ii]->cd[0] != 0 ? 1/wcs_[ii]->cd[0] : 0; double ltm12 = wcs_[ii]->cd[1] != 0 ? 1/wcs_[ii]->cd[1] : 0; double ltm21 = wcs_[ii]->cd[2] != 0 ? 1/wcs_[ii]->cd[2] : 0; double ltm22 = wcs_[ii]->cd[3] != 0 ? 1/wcs_[ii]->cd[3] : 0; double ltv1 = wcs_[ii]->crpix[0] - wcs_[ii]->crval[0]*ltm11 - wcs_[ii]->crval[1]*ltm21; double ltv2 = wcs_[ii]->crpix[1] - wcs_[ii]->crval[0]*ltm12 - wcs_[ii]->crval[1]*ltm22; physicalToImage = Matrix(ltm11, ltm12, ltm21, ltm22, ltv1, ltv2); imageToPhysical = physicalToImage.invert(); } } } void FitsImage::initWCS0(const Vector& pix) { int ii = Coord::WCS0-Coord::WCS; if (wcs_[ii]) wcsfree(wcs_[ii]); wcs_[ii] = NULL; if (wcs_[0]) { Vector cc = mapFromRef(pix, Coord::IMAGE, Coord::FK5); WorldCoor* ww = wcs_[0]; wcs_[ii] = wcskinit(ww->nxpix, ww->nypix, (char*)"RA---TAN", (char*)"DEC--TAN", cc[0], cc[1], 0, 0, ww->cd, 0, 0, 0, 2000, 2000); wcs_[ii]->longpole = 999; wcs_[ii]->latpole = 999; if (ast_[ii]) astAnnul(ast_[ii]); ast_[ii] = NULL; astinit0(ii); if (DebugWCS) { if (wcs_[ii]) wcsShow(wcs_[ii]); } } } void FitsImage::load() { if (post_) base_ = post_; else if (hpx_) base_ = hpx_; else if (hist_) base_ = hist_; else base_ = fits_; if (basedata_) delete basedata_; switch (base_->head()->bitpix()) { case 8: basedata_ = new FitsDatam(base_, interp_); break; case 16: basedata_ = new FitsDatam(base_, interp_); break; case -16: basedata_ = new FitsDatam(base_, interp_); break; case 32: basedata_ = new FitsDatam(base_, interp_); break; case 64: basedata_ = new FitsDatam(base_, interp_); break; case -32: basedata_ = new FitsDatam(base_, interp_); break; case -64: basedata_ = new FitsDatam(base_, interp_); break; } // block block_ = base_; blockdata_ = basedata_; // analysis analysis_ = block_; analysisdata_ = blockdata_; // image image_ = analysis_; data_ = analysisdata_; } void FitsImage::match(const char* xxname1, const char* yyname1, Coord::CoordSystem sys1, Coord::SkyFrame sky1, const char* xxname2, const char* yyname2, Coord::CoordSystem sys2, Coord::SkyFrame sky2, double rad, Coord::CoordSystem sys, Coord::SkyDist dist, const char* rrname) { astClearStatus; // get lists Tcl_Obj* listxx1 = Tcl_GetVar2Ex(interp_, xxname1, NULL, TCL_LEAVE_ERR_MSG); Tcl_Obj* listyy1 = Tcl_GetVar2Ex(interp_, yyname1, NULL, TCL_LEAVE_ERR_MSG); Tcl_Obj* listxx2 = Tcl_GetVar2Ex(interp_, xxname2, NULL, TCL_LEAVE_ERR_MSG); Tcl_Obj* listyy2 = Tcl_GetVar2Ex(interp_, yyname2, NULL, TCL_LEAVE_ERR_MSG); // get objects int nxx1; Tcl_Obj **objxx1; Tcl_ListObjGetElements(interp_, listxx1, &nxx1, &objxx1); int nyy1; Tcl_Obj **objyy1; Tcl_ListObjGetElements(interp_, listyy1, &nyy1, &objyy1); int nxx2; Tcl_Obj **objxx2; Tcl_ListObjGetElements(interp_, listxx2, &nxx2, &objxx2); int nyy2; Tcl_Obj **objyy2; Tcl_ListObjGetElements(interp_, listyy2, &nyy2, &objyy2); // sanity check if (nxx1 != nyy1 || nxx2 != nyy2) return; // get doubles double* ixx1 = new double[nxx1]; for (int ii=0 ; ii=0 && ast_ && ast_[ss])) return; if (astIsASkyFrame(astGetFrame(ast_[0], AST__CURRENT))) { setAstSkyFrame(ast_[ss],sky1); for (int ii=0; ii=0 && ast_ && ast_[ss])) return; if (astIsASkyFrame(astGetFrame(ast_[ss], AST__CURRENT))) { setAstSkyFrame(ast_[ss],sky2); for (int ii=0; iihead(); FitsHead* rr = new FitsHead(head->naxis(0), head->naxis(1), head->naxis(2), head->bitpix()); // this works for both terminated (\n) and non-terminated (fits) headers while (!str.eof()) { char buf[256]; str.get(buf,81,'\n'); if (strlen(buf) > 0) { string x(buf); istringstream sstr(x); char keyword[32]; sstr >> keyword; if (strchr(buf,'=')) { char dummy; sstr >> dummy; } if (strchr(buf,'\'')) { char val[64]; char* ss = strchr(buf,'\'')+1; char* ee = strrchr(buf,'\''); int ll = ee-ss; if (ll<0 || ll>63) ll =0; strncpy(val,ss,ll); val[ll] = '\0'; rr->appendString(keyword, val, ""); } else { double val; sstr >> val; rr->appendReal(keyword, val, 15, ""); } if (strlen(buf) <= 80) { // eat the \n char b; str.get(b); } } else break; } return rr; } void FitsImage::process(const char* fn, int id) { if (!fits_->isValid()) { reset(); return; } if (fits_->isImage()) { switch (fits_->pEncoding()) { case FitsFile::RAW: case FitsFile::BSQ: break; case FitsFile::GZIP: initNRRD(); if (!post_ || !post_->isValid()) { reset(); return; } break; case FitsFile::BIL: case FitsFile::BIP: initENVI(); if (!post_ || !post_->isValid()) { reset(); return; } break; default: reset(); return; } load(); } else if (fits_->isBinTable()) { // Compress if (fits_->find("ZIMAGE")) { initCompress(); if (!post_ || !post_->isValid()) { reset(); return; } load(); } // HEALPIX else if ((fits_->find("PIXTYPE") && (!strncmp(fits_->getString("PIXTYPE"),"HEALPIX",4))) || fits_->find("NSIDE")) { initHPX(); if (!hpx_ || !hpx_->isValid()) { reset(); return; } load(); } else { // Bintable initBin(); if (!hist_ || !hist_->isValid()) { reset(); return; } } } else if (fits_->isAsciiTable()) { // HEALPIX if (fits_->find("NSIDE")) { initHPX(); if (!hpx_ || !hpx_->isValid()) { reset(); return; } load(); } } // set slice address for (int ii=1; iifind("LTM1_1") || image_->find("LTM1_2") || image_->find("LTM2_1") || image_->find("LTM2_2") || image_->find("LTV1") || image_->find("LTV2")) keyLTMV = 1; double ltm11 = image_->getReal("LTM1_1", 1); double ltm12 = image_->getReal("LTM1_2", 0); double ltm21 = image_->getReal("LTM2_1", 0); double ltm22 = image_->getReal("LTM2_2", 1); double ltv1 = image_->getReal("LTV1", 0); double ltv2 = image_->getReal("LTV2", 0); physicalToImage = Matrix(ltm11, ltm12, ltm21, ltm22, ltv1, ltv2); imageToPhysical = physicalToImage.invert(); } // CDD to Detector (DTM/DTV keywords) keyDTMV =0; if (image_->find("DTM1_1") || image_->find("DTM1_2") || image_->find("DTM2_1") || image_->find("DTM2_2") || image_->find("DTV1") || image_->find("DTV2")) keyDTMV = 1; double dtm11 = image_->getReal("DTM1_1", 1); double dtm12 = image_->getReal("DTM1_2", 0); double dtm21 = image_->getReal("DTM2_1", 0); double dtm22 = image_->getReal("DTM2_2", 1); double dtv1 = image_->getReal("DTV1", 0); double dtv2 = image_->getReal("DTV2", 0); physicalToDetector = Matrix(dtm11, dtm12, dtm21, dtm22, dtv1, dtv2); detectorToPhysical = physicalToDetector.invert(); // Physical to Amplifier (ATM/ATV keywords) keyATMV =0; if (image_->find("ATM1_1") || image_->find("ATM1_2") || image_->find("ATM2_1") || image_->find("ATM2_2") || image_->find("ATV1") || image_->find("ATV2")) keyATMV = 1; double atm11 = image_->getReal("ATM1_1", 1); double atm12 = image_->getReal("ATM1_2", 0); double atm21 = image_->getReal("ATM2_1", 0); double atm22 = image_->getReal("ATM2_2", 1); double atv1 = image_->getReal("ATV1", 0); double atv2 = image_->getReal("ATV2", 0); physicalToAmplifier = Matrix(atm11, atm12, atm21, atm22, atv1, atv2); amplifierToPhysical = physicalToAmplifier.invert(); if (DebugMosaic) { cerr << endl; cerr << "ATM/V: " << physicalToAmplifier << endl; cerr << "ATM/V-1: " << amplifierToPhysical << endl; cerr << "DTM/V: " << physicalToDetector << endl; cerr << "DTM/V-1: " << detectorToPhysical << endl; cerr << "LTM/V: " << physicalToImage << endl; cerr << "LTM/V-1: " << imageToPhysical << endl; } /* // Radio data? char* bunit = image_->getString("BUNIT"); double cdelt1 = fabs(image_->getReal("CDELT1",0)); char* cunit1 = image_->getString("CUNIT1"); double cdelt2 = fabs(image_->getReal("CDELT2",0)); char* cunit2 = image_->getString("CUNIT2"); double bmaj = image_->getReal("BMAJ",0); double bmin = image_->getReal("BMIN",0); // ok we have a radio map #define GFACTOR (2.0*sqrt(2.0*log(2.0))) if (!strncmp(bunit,"JY/BEAM",7) && cdelt1 && cdelt2 && bmaj && bmin) { // convert from deg to arcsec? cdelt1 *= 3600; cdelt2 *= 3600; bmaj *= 3600; bmin *= 3600; jyBeam_ = (2*M_PI*bmaj*bmin)/(GFACTOR*GFACTOR*cdelt1*cdelt2); } if (bunit) delete [] bunit; if (cunit1) delete [] cunit1; if (cunit2) delete [] cunit2; */ } void FitsImage::processKeywordsParams() { // iparams is a BBOX in DATA coords 0-n iparams.set(0, 0, width(), height()); { char* datstr = image_->getString("DATASEC"); // default Vector v1(1,1); Vector v2(size()); keyDATASEC =0; if (datstr && *datstr && parseSection(datstr,&v1,&v2)) { // additional check if (v1[0]<1 || v1[1]<1 || v1[1]>width() || v2[1]>height() || v1[0]>v2[0] || v1[1]>v2[1]) { // default v1 = Vector(1,1); v2 = Vector(size()); keyDATASEC = 0; } else keyDATASEC = 1; } // dparams is a BBOX in DATA coords 0-n datasec = BBox(v1,v2); v1 -= Vector(1,1); dparams.set(v1[0],v1[1],v2[0],v2[1]); if (datstr) delete [] datstr; } // DEBUG if (DebugCrop) { cerr << "iparams " << iparams << endl; cerr << "dparams " << dparams << endl; } } void FitsImage::processKeywordsFitsSection() { Vector ll(dparams.xmin,dparams.ymin); Vector ur(dparams.xmax,dparams.ymax); if (fits_->pcoord() && fits_->pxvalid() && fits_->pyvalid()) { ll[0] = fits_->pxmin(); ur[0] = fits_->pxmax(); ll[1] = fits_->pymin(); ur[1] = fits_->pymax(); ll = ll*physicalToImage*Translate(-1,-1); ur = ur*physicalToImage; context_->frScale.setScanMode(FrScale::CROPSEC); } if (!fits_->pcoord() && fits_->pxvalid()) { ll[0] = fits_->pxmin()-1; ur[0] = fits_->pxmax(); context_->frScale.setScanMode(FrScale::CROPSEC); } if (!fits_->pcoord() && fits_->pyvalid()) { ll[1] = fits_->pymin()-1; ur[1] = fits_->pymax(); context_->frScale.setScanMode(FrScale::CROPSEC); } // params is a BBOX in DATA coords 0-n setCropParams(ll,ur,0); // DEBUG if (DebugCrop) cerr << "cparams " << cparams << endl; if (fits_->pzvalid()) { int zmin = fits_->pzmin()-1; int zmax = fits_->pzmax(); context_->frScale.setScanMode(FrScale::CROPSEC); context_->setCrop3dParams(zmin,zmax); } } int FitsImage::processKeywordsIRAF(FitsImage* fits) { // DETSEC Coord::Orientation orientation = Coord::NORMAL; char* detstr = image_->getString("DETSEC"); Vector dv1,dv2; if (!(detstr && *detstr && parseSection(detstr,&dv1,&dv2))) { if (detstr) delete [] detstr; return 0; } delete [] detstr; BBox detsec = BBox(dv1,dv2); int xx = (dv1[0] < dv2[0]); int yy = (dv1[1] < dv2[1]); if (xx && yy) orientation = Coord::NORMAL; else if (!xx && yy) orientation = Coord::XX; else if (!xx && !yy) orientation = Coord::XY; else if (xx && !yy) orientation = Coord::YY; // DETSIZE char* sizestr = image_->getString("DETSIZE"); Vector sv1(1,1); Vector sv2(10000,10000); if (sizestr && *sizestr) { if (!(parseSection(sizestr,&sv1,&sv2))) { delete [] sizestr; return 0; } } if (sizestr) delete [] sizestr; BBox detsize = BBox(sv1,sv2); // CCDSUM Vector ccdsum(1,1); char* ccdstr = image_->getString("CCDSUM"); if (ccdstr && *ccdstr) { double Ns, Np, Ns1, Np1; string x(ccdstr); istringstream str(x); str >> Ns >> Np >> Ns1 >> Np1; ccdsum = Vector(1/Ns, 1/Np); } if (ccdstr) delete [] ccdstr; // origin Vector origin = detsec.ll * Scale(ccdsum) * Translate(-datasec.ll); // matrix // if the segment is flipped, we can have a discontinuity at // the edges, due to round off errors, so we 'nudge' it Matrix flip; switch (orientation) { case Coord::NORMAL: break; case Coord::XX: flip = FlipX(); break; case Coord::YY: flip = FlipY(); break; case Coord::XY: flip = FlipXY(); break; } // internal flip Matrix mflip; switch (context_->IRAFOrientation(orientation)) { case Coord::NORMAL: break; case Coord::XX: mflip = FlipX(); break; case Coord::YY: mflip = FlipY(); break; case Coord::XY: mflip = FlipXY(); break; } Vector center = datasec.center() * imageToData; Vector mcenter = detsize.center() * imageToData * Scale(ccdsum); wcsToRef_ = Translate(-center) * flip * Translate(center) * Translate(origin) * Translate(-mcenter) * mflip * Translate(mcenter); // we do this to shift the origin to the middle of the image to match // the wcs case. Needed by imageBBox() // first? reset wcsToRef if (fits == this) { irafToRef = wcsToRef_.invert(); wcsToRef_ = Matrix(); } else wcsToRef_ *= fits->irafToRef; if (DebugMosaic) { cerr << "ProcessKeywordsIRAF" << endl << " datasec: " << datasec << endl << " ccdsum : " << ccdsum << endl << " detsize: " << detsize << endl << " detsec : " << detsec << endl << " matrix : " << wcsToRef_ << endl; } return 1; } void FitsImage::replaceWCS(istream& str) { FitsHead* hh = parseWCS(str); // Process OBJECT keyword if (objectKeyword_) delete [] objectKeyword_; objectKeyword_ = hh->getString("OBJECT"); // Process WCS keywords if (wcsHeader_) delete wcsHeader_; wcsHeader_ = hh; initWCS(); } void FitsImage::reset() { if (fits_) delete fits_; fits_ =NULL; if (post_) delete post_; post_ =NULL; if (hpx_) delete hpx_; hpx_ =NULL; if (hist_) delete hist_; hist_ =NULL; base_ =NULL; if (basedata_) delete basedata_; basedata_ =NULL; if (manageBlock_) { if (block_) delete block_; if (blockdata_) delete blockdata_; } manageBlock_ =0; block_ =NULL; blockdata_ =NULL; if (manageAnalysis_) { if (analysis_) delete analysis_; if (analysisdata_) delete analysisdata_; } manageAnalysis_ =0; analysis_ =NULL; analysisdata_ =NULL; image_ =NULL; data_ =NULL; } void FitsImage::resetWCS() { // Process OBJECT keyword if (objectKeyword_) delete [] objectKeyword_; objectKeyword_ = image_->getString("OBJECT"); // Process WCS keywords if (wcsHeader_) delete wcsHeader_; wcsHeader_ = NULL; initWCS(); } void FitsImage::resetWCS0() { int ii = Coord::WCS0-Coord::WCS; if (wcs_[ii]) wcsfree(wcs_[ii]); wcs_[ii] = NULL; if (ast_[ii]) astAnnul(ast_[ii]); ast_[ii] = NULL; } char* FitsImage::root(const char* fn) { if (fn) { const char* ptr = fn; // init the ptr while(*ptr++); // walk it forward to end of string ptr--; // backup one while(*ptr != '/' && ptr != fn) // walk it backward til last / or beginning ptr--; if (*ptr == '/') // step it over the last '/' ptr++; return dupstr(ptr); // got it! } else return NULL; } void FitsImage::setCropParams(int datasec) { if (!datasec) cparams = iparams; else cparams = dparams; } void FitsImage::setCropParams(const Vector& ss, const Vector& tt, int datasec) { // Coord are in DATA Vector ll = ss; Vector ur = tt; int xmin = ll[0]; int xmax = ur[0]; int ymin = ll[1]; int ymax = ur[1]; if (xmin>xmax) { xmin = ur[0]; xmax = ll[0]; } if (ymin>ymax) { ymin = ur[1]; ymax = ll[1]; } setCropParams(xmin,ymin,xmax,ymax,datasec); } void FitsImage::setCropParams(int x0, int y0, int x1, int y1, int datasec) { FitsBound* params; if (!datasec) params = &iparams; else params = &dparams; // Coords are in DATA if (x0xmin) x0=params->xmin; if (x0>params->xmax) x0=params->xmax; if (x1xmin) x1=params->xmin; if (x1>params->xmax) x1=params->xmax; if (y0ymin) y0=params->ymin; if (y0>params->ymax) y0=params->ymax; if (y1ymin) y1=params->ymin; if (y1>params->ymax) y1=params->ymax; cparams.set(x0,y0,x1,y1); } void FitsImage::setFileName(const char* fn) { if (fileName) delete [] fileName; fileName = NULL; if (rootBaseFileName) delete [] rootBaseFileName; rootBaseFileName = NULL; if (fullBaseFileName) delete [] fullBaseFileName; fullBaseFileName = NULL; if (iisFileName) delete [] iisFileName; iisFileName = NULL; // no filename to set if (!fn) return; // strip any '[]' char* ffn = strip(fn); FitsFile* ptr = post_ ? post_ : fits_; if (!ptr) return; const char* ext = ptr->extname(); if (ext) { { ostringstream str; str << ffn << '[' << ext << ']' << ends; fullBaseFileName = dupstr(str.str().c_str()); } { char* m = root(ffn); ostringstream str; str << m << '[' << ext << ']' << ends; rootBaseFileName = dupstr(str.str().c_str()); delete [] m; } } else if (ptr->ext()) { { ostringstream str; str << ffn << '[' << ptr->ext() << ']' << ends; fullBaseFileName = dupstr(str.str().c_str()); } { char* m = root(ffn); ostringstream str; str << m << '[' << ptr->ext() << ']' << ends; rootBaseFileName = dupstr(str.str().c_str()); delete [] m; } } else { fullBaseFileName = dupstr(ffn); rootBaseFileName = root(ffn); } // by default, iisFileName is fullBaseFileName if (fullBaseFileName) iisFileName = dupstr(fullBaseFileName); delete [] ffn; } void FitsImage::setObjectKeyword(const char* obj) { if (objectKeyword_) delete [] objectKeyword_; objectKeyword_ = dupstr(obj); } char* FitsImage::strip(const char* fn) { if (fn) { char* r = dupstr(fn); // dup the string char* ptr = r; // init the ptr while(*ptr != '[' && *ptr) // walk it forward til '[' or end ptr++; *ptr = '\0'; // zero out rest return r; // got it! } else return NULL; } int FitsImage::nhdu() { int dd =1; for (int ii=2; iiupdateClip(fr,getDataParams(fr->scanMode())); } const char* FitsImage::getFileName(Base::FileNameType type) { switch (type) { case Base::ROOTBASE: return rootBaseFileName; case Base::FULLBASE: return fullBaseFileName; case Base::ROOT: case Base::FULL: // clear the buffer if (fileName) delete [] fileName; fileName =NULL; // generate filename // if FITS bin table cube, be sure to check the first slice if (context_->fits->isHist()) return updateFileNameBin(type); else return updateFileNameImage(type); } } const char* FitsImage::updateFileNameImage(Base::FileNameType type) { // 2d/3d section char* sec =NULL; switch (context_->frScale.scanMode()) { case FrScale::IMGSEC: case FrScale::DATASEC: { Vector blockFactor = context_->blockFactor(); if (blockFactor[0] != 1) { ostringstream str; str << "*," << blockFactor[0] << ends; sec = dupstr(str.str().c_str()); } } break; case FrScale::CROPSEC: { FitsBound* params =getDataParams(FrScale::CROPSEC); // params is a BBOX in DATA coords 0-n // xlate to 1-n Vector ll= Vector(params->xmin,params->ymin) * Translate(1,1); Vector ur(params->xmax,params->ymax); Vector blockFactor = context_->blockFactor(); if (blockFactor[0] != 1) { ostringstream str; str << ll[0] << ':' << ur[0] << ',' << ll[1] << ':' << ur[1] << ',' << blockFactor[0] << ends; sec = dupstr(str.str().c_str()); } else { ostringstream str; str << ll[0] << ':' << ur[0] << ',' << ll[1] << ':' << ur[1] << ends; sec = dupstr(str.str().c_str()); } } break; } // address char* add =NULL; { int doAdd =0; ostringstream str; int jj; for (jj=FTY_MAXAXES-1; jj>=2; jj--) { if (address[jj]!=1) break; } jj++; for (int ii=2; ii=" << ll[0] << ',' << fits_->pBinX() << "<=" << ur[0] << ',' << fits_->pBinY() << ">=" << ll[1] << ',' << fits_->pBinY() << "<=" << ur[1] << ends; sec = dupstr(str.str().c_str()); } break; } } // z filter char* slice =NULL; { char* zcol = (char*)fits_->pBinZ(); int bd = context_->binDepth(); if (bd>1 && zcol) { // only the first slice will have this FitsImage* first = context_->fits; if (first) { Vector zlim = first->fits_->getColMinMax(zcol); double zlen = zlim[1]-zlim[0]; double zdelta = zlen/bd; double zptr = zlim[0] + (address[2]-1)*zdelta; ostringstream str; str << zcol << ">=" << zptr << '&' << zcol << '<' << zptr+zdelta <coorflip) return Vector(wcs_[ii]->crpix[0], wcs_[ii]->crpix[1]); else return Vector(wcs_[ii]->crpix[1], wcs_[ii]->crpix[0]); } else return Vector(); } Vector FitsImage::getWCScrval(Coord::CoordSystem sys) { if (hasWCS(sys)) { int ii = sys-Coord::WCS; if (!wcs_[ii]->coorflip) return Vector(wcs_[ii]->crval[0], wcs_[ii]->crval[1]); else return Vector(wcs_[ii]->crval[1], wcs_[ii]->crval[0]); } else return Vector(); } Vector FitsImage::getWCScdelt(Coord::CoordSystem sys) { if (hasWCS(sys)) { int ii = sys-Coord::WCS; if (wcs_[ii]->pc[0] == 1) { if (!wcs_[ii]->coorflip) return Vector(wcs_[ii]->cdelt[0], wcs_[ii]->cdelt[1]); else return Vector(wcs_[ii]->cdelt[1], wcs_[ii]->cdelt[0]); } else { // great, we got PC terms. The scaling factor could be encoded in // pc or cdelt or both if (!wcs_[ii]->coorflip) return Vector(wcs_[ii]->cdelt[0]*wcs_[ii]->pc[0], wcs_[ii]->cdelt[1]*wcs_[ii]->pc[3]); else return Vector(wcs_[ii]->cdelt[1]*wcs_[ii]->pc[3], wcs_[ii]->cdelt[0]*wcs_[ii]->pc[0]); } } else return Vector(); } Coord::Orientation FitsImage::getWCSOrientation(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (hasWCS(sys)) { Vector orpix = center(); Vector orval = pix2wcs(orpix, sys, sky); Vector delta = getWCScdelt(sys).abs(); Vector npix = wcs2pix(Vector(orval[0],orval[1]+delta[1]), sys, sky); Vector north = (npix-orpix).normalize(); Vector epix = wcs2pix(Vector(orval[0]+delta[0],orval[1]), sys, sky); Vector east = (epix-orpix).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) return Coord::NORMAL; // take the cross product and see which way the 3rd axis is pointing double w = east[0]*north[1]-east[1]*north[0]; if (!hasWCSCel(sys)) return w>0 ? Coord::NORMAL : Coord::XX; else return w<0 ? Coord::NORMAL : Coord::XX; } return Coord::NORMAL; } double FitsImage::getWCSRotation(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (hasWCS(sys)) { Vector orpix = center(); Vector orval = pix2wcs(orpix, sys, sky); // Vector pix = wcs2pix(orval, sys, sky); Vector delta = getWCScdelt(sys).abs(); Vector npix = wcs2pix(Vector(orval[0],orval[1]+delta[1]), sys, sky); Vector north = (npix-orpix).normalize(); Vector epix = wcs2pix(Vector(orval[0]+delta[0],orval[1]), sys, sky); Vector east = (epix-orpix).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) return 0; if (wcs_[sys-Coord::WCS]->imflip) return (north.angle()-M_PI_2); else return -(north.angle()-M_PI_2); } return 0; } // AST Vector FitsImage::ASTpix2wcs(Vector in, Coord::CoordSystem sys, Coord::SkyFrame sky) { astClearStatus; int ii = sys-Coord::WCS; if (ii>=0 && ast_ && ast_[ii]) { double xx =0; double yy =0; if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { setAstSkyFrame(ast_[ii],sky); astTran2(ast_[ii], 1, in.v, in.v+1, 1, &xx, &yy); if (astOK) if (checkAst(xx,yy)) return Vector(radToDeg(xx),yy*180./M_PI); } else { astTran2(ast_[ii], 1, in.v, in.v+1, 1, &xx, &yy); if (astOK) if (checkAst(xx,yy)) return Vector(xx,yy); } } maperr =1; return Vector(); } Vector* FitsImage::ASTpix2wcs(Vector* in, int num, Coord::CoordSystem sys, Coord::SkyFrame sky) { astClearStatus; double xin[num]; double yin[num]; double xout[num]; double yout[num]; Vector* out = new Vector[num]; for (int ii=0; ii=0 && ast_ && ast_[ii]) { if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { setAstSkyFrame(ast_[ii],sky); astTran2(ast_[ii], num, xin, yin, 1, xout, yout); if (astOK) { for (int ii=0; ii=0 && ast_ && ast_[ii]) { double xx =0; double yy =0; ostringstream str; if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { setAstSkyFrame(ast_[ii],sky); astTran2(ast_[ii], 1, in.v, in.v+1, 1, &xx, &yy); if (!astOK || !checkAst(xx,yy)) { maperr =1; lbuf[0] = '\0'; return lbuf; } switch (format) { case Coord::DEGREES: xx =radToDeg(xx); // 0 to 360 yy *=180./M_PI; str << setprecision(8) << xx << ' ' << yy << ' ' << coord.skyFrameStr(sky) << ends; break; case Coord::SEXAGESIMAL: switch (sky) { case Coord::FK4: case Coord::FK4_NO_E: case Coord::FK5: case Coord::ICRS: xx = zeroTWOPI(xx); setAstFormat(ast_[ii],1,"hms.3"); setAstFormat(ast_[ii],2,"+dms.2"); break; case Coord::GALACTIC: case Coord::SUPERGALACTIC: case Coord::ECLIPTIC: case Coord::HELIOECLIPTIC: xx = zeroTWOPI(xx); setAstFormat(ast_[ii],1,"+dms.3"); setAstFormat(ast_[ii],2,"+dms.3"); break; } str << astFormat(ast_[ii], 1, xx) << ' ' << astFormat(ast_[ii], 2, yy) << ' ' << coord.skyFrameStr(sky) << ends; break; } } else { astTran2(ast_[ii], 1, in.v, in.v+1, 1, &xx, &yy); if (!astOK || !checkAst(xx,yy)) { maperr =1; return lbuf; } str << setprecision(8) << xx << ' ' << yy << ends; } strncpy(lbuf, str.str().c_str(), str.str().length()); } return lbuf; } Vector FitsImage::ASTwcs2pix(Vector in, Coord::CoordSystem sys, Coord::SkyFrame sky) { astClearStatus; int ii = sys-Coord::WCS; if (ii>=0 && ast_ && ast_[ii]) { double xx =0; double yy =0; if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { setAstSkyFrame(ast_[ii],sky); Vector rr = in*M_PI/180.; astTran2(ast_[ii], 1, rr.v, &(rr[1]), 0, &xx, &yy); if (astOK) if (checkAst(xx,yy)) return Vector(xx,yy); } else { astTran2(ast_[ii], 1, in.v, in.v+1, 0, &xx, &yy); if (astOK) if (checkAst(xx,yy)) return Vector(xx,yy); } } maperr =1; return Vector(); } Vector* FitsImage::ASTwcs2pix(Vector* in, int num, Coord::CoordSystem sys, Coord::SkyFrame sky) { astClearStatus; double xin[num]; double yin[num]; double xout[num]; double yout[num]; Vector* out = new Vector[num]; for (int ii=0; ii=0 && ast_ && ast_[ii]) { if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { setAstSkyFrame(ast_[ii],sky); for (int ii=0; ii=0 && ast_ && ast_[ii]) { if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { Vector aa = a*M_PI/180.; Vector bb = b*M_PI/180.; rr = astDistance(ast_[ii], aa.v, bb.v) *180./M_PI; } else rr = astDistance(ast_[ii], a.v, b.v); if (!astOK) { maperr =1; return 0; } } return rr; } // WCSSUB int FitsImage::hasWCS(Coord::CoordSystem sys) { int ii = sys-Coord::WCS; return (sys>=Coord::WCS && ast_ && ast_[ii]) ? 1 : 0; } int FitsImage::hasWCSEqu(Coord::CoordSystem sys) { astClearStatus; int ii = sys-Coord::WCS; if (ii>=0 && ast_ && ast_[ii]) if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) { // special case of xLON/xLAT char* bb = &(wcs_[ii]->c1type[1]); if (!strncmp(bb,"LON",3) || !strncmp(bb,"LAT",3)) { switch (wcs_[ii]->c1type[0]) { case 'G': case 'H': case 'E': case 'S': return 1; default: return 0; } } // special case of xyLN/xyLT char* cc = &(wcs_[ii]->c1type[2]); if (!strncmp(cc,"LN",2) || !strncmp(cc,"LT",2)) return 0; return 1; } return 0; } int FitsImage::hasWCSCel(Coord::CoordSystem sys) { astClearStatus; int ii = sys-Coord::WCS; if (ii>=0 && ast_ && ast_[ii]) if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) return 1; return 0; } // WCSX int FitsImage::hasWCSx(Coord::CoordSystem sys, int ss) { int ii = sys-Coord::WCS; return (ss>=2&&ss=Coord::WCS && wcsx_[ii]) ? 1 : 0; } double FitsImage::pix2wcsx(double in, Coord::CoordSystem sys, int ss) { if (hasWCSx(sys,ss)) { int ii = sys-Coord::WCS; return (in-wcsx_[ii]->crpix[ss])*wcsx_[ii]->cd[ss] + wcsx_[ii]->crval[ss]; } else return in; } double FitsImage::wcs2pixx(double in, Coord::CoordSystem sys, int ss) { if (hasWCSx(sys,ss)) { int ii = sys-Coord::WCS; return (in-wcsx_[ii]->crval[ss])/wcsx_[ii]->cd[ss] + wcsx_[ii]->crpix[ss]; } else return in; } // WCS/AST support void FitsImage::wcsShow(WorldCoor* ww) { if (!ww) return; int n = ww->naxes; int nn = n*n; cerr << "wcs->wcsname=" << (ww->wcsname ? ww->wcsname : "") << endl; cerr << "wcs->naxes=" << ww->naxes << endl; cerr << "wcs->naxis=" << ww->naxis << endl; cerr << "wcs->radecsys=" << ww->radecsys << endl; cerr << "wcs->equinox=" << ww->equinox << endl; cerr << "wcs->epoch=" << ww->epoch << endl; cerr << "wcs->ctype[0]=" << ww->ctype[0] << endl; cerr << "wcs->ctype[1]=" << ww->ctype[1] << endl; cerr << "wcs->c1type=" << ww->c1type << endl; cerr << "wcs->c2type=" << ww->c2type << endl; cerr << "wcs->ptype=" << ww->ptype << endl; for (int jj=0; jjcrpix[" << jj << "]=" << ww->crpix[jj] << endl; for (int jj=0; jjcrval[" << jj << "]=" << ww->crval[jj] << endl; for (int jj=0; jjcdelt[" << jj << "]=" << ww->cdelt[jj] << endl; for (int jj=0; jj<4; jj++) cerr << "wcs->cd[" << jj << "]=" << ww->cd[jj] << endl; for (int jj=0; jjpc[" << jj << "]=" << ww->pc[jj] << endl; cerr << "wcs->longpole=" << ww->longpole << endl; cerr << "wcs->latpole=" << ww->latpole << endl; cerr << "wcs->prjcode=" << ww->prjcode << endl; cerr << "wcs->rot=" << ww->rot << endl; cerr << "wcs->imrot=" << ww->imrot << endl; cerr << "wcs->imflip=" << ww->imflip << endl; cerr << "wcs->pa_north=" << ww->pa_north << endl; cerr << "wcs->pa_east=" << ww->pa_east << endl; cerr << "wcs->coorflip=" << ww->coorflip << endl; cerr << "wcs->syswcs=" << ww->syswcs << endl; cerr << "wcs->wcsproj=" << ww->wcsproj << endl; cerr << "wcs->distcode=" << ww->distcode << endl; } void FitsImage::astinit(int ii, FitsHead* head, FitsHead* prim) { if (!wcs_[ii]) { ast_[ii] = NULL; return; } // just in case if (!head) return; // DSS,PLT,LIN goes straight to AST // we can't send 3D directly to AST if (wcs_[ii]->prjcode==WCS_DSS || wcs_[ii]->prjcode==WCS_PLT || (wcs_[ii]->prjcode==WCS_LIN && !strncmp(wcs_[ii]->ptype,"HPX",3)) || (wcs_[ii]->prjcode==WCS_LIN && !strncmp(wcs_[ii]->ptype,"XPH",3)) || (wcs_[ii]->prjcode==WCS_LIN && !strncmp(wcs_[ii]->ptype,"TAB",3)) || (wcs_[ii]->prjcode==WCS_LIN && !strncmp(wcs_[ii]->c1type,"AST",3))) { ast_[ii] = fits2ast(head); } else ast_[ii] = buildast(ii, head, prim); if (!ast_[ii]) return; // set default skyframe if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) setAstSkyFrame(ast_[ii],Coord::FK5); if (DebugAST) astShow(ast_[ii]); } void FitsImage::astinit0(int ii) { if (!wcs_[ii]) { ast_[ii] = NULL; return; } ast_[ii] = buildast0(ii); if (!ast_[ii]) return; // set default skyframe if (astIsASkyFrame(astGetFrame(ast_[ii], AST__CURRENT))) setAstSkyFrame(ast_[ii],Coord::FK5); if (DebugAST) astShow(ast_[ii]); } int FitsImage::checkAst(double x, double y) { // check for reasonable values return (fabs(x) < FLT_MAX && fabs(y) < FLT_MAX) ? 1 : 0; } void FitsImage::setAstFormat(AstFrameSet* aa, int id, const char* format) { // is it already set? // ast is very slow when changing params { ostringstream str; str << "Format(" << id << ")" << ends; const char* out = astGetC(aa, str.str().c_str()); if (!strcmp(out,format)) return; } ostringstream str; str << "Format(" << id << ")=" << format << ends; astSet(aa, str.str().c_str()); } void FitsImage::setAstSkyFrame(AstFrameSet* aa, Coord::SkyFrame sky) { // is sky frame if (!astIsASkyFrame(astGetFrame(aa, AST__CURRENT))) return; // is it already set? // ast is very slow when changing system,equinox const char* str = astGetC(aa, "System"); // TLON/XLON and HPX will do this if (!strncmp(str,"Unknown",3)) return; switch (sky) { case Coord::FK4_NO_E: if (!strncmp(str,"FK4-NO-E",8)) return; astSet(aa, "System=FK4-NO-E, Equinox=B1950"); return; case Coord::FK4: if (!strncmp(str,"FK4",3)) return; astSet(aa, "System=FK4, Equinox=B1950"); return; case Coord::FK5: if (!strncmp(str,"FK5",3)) return; astSet(aa, "System=FK5, Equinox=J2000"); return; case Coord::ICRS: if (!strncmp(str,"ICRS",4)) return; astSet(aa, "System=ICRS"); return; case Coord::GALACTIC: if (!strncmp(str,"GALACTIC",8)) return; astSet(aa, "System=GALACTIC"); return; case Coord::SUPERGALACTIC: if (!strncmp(str,"SUPERGALACTIC",13)) return; astSet(aa, "System=SUPERGALACTIC"); return; case Coord::ECLIPTIC: if (!strncmp(str,"ECLIPTIC",8)) return; astSet(aa, "System=ECLIPTIC"); // get AST to agree with WCSSUBS astSetD(aa, "EQUINOX", astGetD(aa, "EPOCH")); return; case Coord::HELIOECLIPTIC: if (!strncmp(str,"HELIOECLIPTIC",13)) return; astSet(aa, "System=HELIOECLIPTIC"); return; } } AstFrameSet* FitsImage::fits2ast(FitsHead* head) { // we may have an error, just reset astClearStatus; // new fitschan AstFitsChan* chan = astFitsChan(NULL, NULL, ""); if (!astOK || chan == AST__NULL) return NULL; // no warning messages astClear(chan,"Warnings"); // fill up chan char* cards =NULL; int ncards =0; if (head) { cards = head->cards(); ncards = head->ncard(); } if (cards == NULL || ncards == 0) return NULL; for (int i=0; ifind("CTYPE1") && head->find("CTYPE2") && head->find("CRVAL1") && head->find("CRVAL2") && head->find("CRPIX1") && head->find("CRPIX2")) { wcs2ast(ii,head,prim,chan); fromwcs =1; } else header2ast(head,chan); // rewind chan astClear(chan, "Card"); // parse header AstFrameSet* frameSet = (AstFrameSet*)astRead(chan); // do we have anything? if (!astOK || frameSet == AST__NULL || strncmp(astGetC(frameSet,"Class"), "FrameSet", 8)) return NULL; if (fromwcs && wcs_[ii]->coorflip) { int orr[] = {2,1}; astPermAxes(frameSet,orr); } // cleanup astAnnul(chan); return frameSet; } AstFrameSet* FitsImage::buildast0(int ii) { if (DebugAST) cerr << endl << "buildast0()" << endl; // read wcs struct into astChannel // we may have an error, just reset astClearStatus; // new fitschan AstFitsChan* chan = astFitsChan(NULL, NULL, ""); if (!astOK || chan == AST__NULL) return NULL; // no warning messages astClear(chan,"Warnings"); // basics (needed by fitschan.c) putFitsCard(chan, "NAXIS1", (int)naxis(0)); putFitsCard(chan, "NAXIS2", (int)naxis(1)); wcs2ast0(ii,chan); // rewind chan astClear(chan, "Card"); // parse header AstFrameSet* frameSet = (AstFrameSet*)astRead(chan); // do we have anything? if (!astOK || frameSet == AST__NULL || strncmp(astGetC(frameSet,"Class"), "FrameSet", 8)) return NULL; if (wcs_[ii]->coorflip) { int orr[] = {2,1}; astPermAxes(frameSet,orr); } // cleanup astAnnul(chan); return frameSet; } void FitsImage::header2ast(FitsHead* head, void* chan) { if (DebugAST) cerr << endl << "header2ast()" << endl; for (int ii=0; iifind(key1) && !head->find(key2)) continue; char* ctype1 = head->getString(key1); char* ctype2 = head->getString(key2); if (ctype1 && !strncmp(ctype1,"GLON",4)) { if (!ctype2 || strncmp(ctype2,"GLAT",4)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype2 && !strncmp(ctype2,"GLON",4)) { if (!ctype1 || strncmp(ctype1,"GLAT",4)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype1 && !strncmp(ctype1,"GLAT",4)) { if (!ctype2 || strncmp(ctype2,"GLON",4)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype2 && !strncmp(ctype2,"GLAT",4)) { if (!ctype1 || strncmp(ctype1,"GLON",4)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype1 && !strncmp(ctype1,"RA",2)) { if (!ctype2 || strncmp(ctype2,"DEC",3)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype2 && !strncmp(ctype2,"RA",2)) { if (!ctype1 || strncmp(ctype1,"DEC",3)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype1 && !strncmp(ctype1,"DEC",3)) { if (!ctype2 || strncmp(ctype2,"RA",2)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else if (ctype2 && !strncmp(ctype2,"DEC",3)) { if (!ctype1 || strncmp(ctype1,"RA",2)) { ctype1 = (char*)linear; ctype2 = (char*)linear; } } else { if (!ctype1) ctype1 =(char*)linear; if (!ctype2) ctype2 =(char*)linear; } putFitsCard(chan, key1, ctype1); putFitsCard(chan, key2, ctype2); // CRPIX strcpy(key1, "CRPIX1 "); strcpy(key2, "CRPIX2 "); key1[6] = key2[6] = alt; putFitsCard(chan, key1, head->getReal(key1,0)); putFitsCard(chan, key2, head->getReal(key2,0)); // CRVAL strcpy(key1, "CRVAL1 "); strcpy(key2, "CRVAL2 "); key1[6] = key2[6] = alt; putFitsCard(chan, key1, head->getReal(key1,0)); putFitsCard(chan, key2, head->getReal(key2,0)); // CDELT/CD/PC strcpy(key1, "CDELT1 "); strcpy(key2, "CDELT2 "); key1[6] = key2[6] = alt; char pkey1[8]; char pkey2[8]; char pkey3[8]; char pkey4[8]; strcpy(pkey1, "PC1_1 "); strcpy(pkey2, "PC1_2 "); strcpy(pkey3, "PC2_1 "); strcpy(pkey4, "PC2_2 "); pkey1[5] = pkey2[5] = pkey3[5] = pkey4[5] = alt; char ckey1[8]; char ckey2[8]; char ckey3[8]; char ckey4[8]; strcpy(ckey1, "CD1_1 "); strcpy(ckey2, "CD1_2 "); strcpy(ckey3, "CD2_1 "); strcpy(ckey4, "CD2_2 "); ckey1[5] = ckey2[5] = ckey3[5] = ckey4[5] = alt; if (head->find(key1) || head->find(key2)) { putFitsCard(chan, key1, head->getReal(key1,1)); putFitsCard(chan, key2, head->getReal(key2,1)); if (head->find(pkey1) || head->find(pkey2) || head->find(pkey3) || head->find(pkey4)) { putFitsCard(chan, pkey1, head->getReal(pkey1,1)); putFitsCard(chan, pkey2, head->getReal(pkey2,1)); putFitsCard(chan, pkey3, head->getReal(pkey3,1)); putFitsCard(chan, pkey4, head->getReal(pkey4,1)); } } else if (head->find(ckey1) || head->find(ckey2) || head->find(ckey3) || head->find(ckey4)) { putFitsCard(chan, ckey1, head->getReal(ckey1,1)); putFitsCard(chan, ckey2, head->getReal(ckey2,0)); putFitsCard(chan, ckey3, head->getReal(ckey3,0)); putFitsCard(chan, ckey4, head->getReal(ckey4,1)); } } } void FitsImage::wcs2ast(int ww, FitsHead* head, FitsHead* prim, void* chan) { if (DebugAST) cerr << endl << "wcs2ast()" << endl; // Alt WCS char alt = (ww==0) ? ' ' : (char)('@'+ww); // CTYPE if ( // special case (reorder 3D cube) (!strncmp(wcs_[ww]->c1type,"GLON",4) && strncmp(wcs_[ww]->c2type,"GLAT",4)) || (strncmp(wcs_[ww]->c1type,"GLON",4) && !strncmp(wcs_[ww]->c2type,"GLAT",4)) || (!strncmp(wcs_[ww]->c1type,"GLAT",4) && strncmp(wcs_[ww]->c2type,"GLON",4)) || (strncmp(wcs_[ww]->c1type,"GLAT",4) && !strncmp(wcs_[ww]->c2type,"GLON",4)) || (!strncmp(wcs_[ww]->c1type,"RA",2) && strncmp(wcs_[ww]->c2type,"DEC",3)) || (strncmp(wcs_[ww]->c1type,"RA",2) && !strncmp(wcs_[ww]->c2type,"DEC",3)) || (!strncmp(wcs_[ww]->c1type,"DEC",3) && strncmp(wcs_[ww]->c2type,"RA",2)) || (strncmp(wcs_[ww]->c1type,"DEC",3) && !strncmp(wcs_[ww]->c2type,"RA",2))) { putFitsCard(chan, "CTYPE1", "LINEAR"); putFitsCard(chan, "CTYPE2", "LINEAR"); } else if (wcs_[ww]->prjcode == WCS_TAN && wcs_[ww]->distcode) { // SIP { ostringstream str; str << wcs_[ww]->ctype[0] << "-SIP" << ends; putFitsCard(chan, "CTYPE1", str.str().c_str()); } { ostringstream str; str << wcs_[ww]->ctype[1] << "-SIP" << ends; putFitsCard(chan, "CTYPE2", str.str().c_str()); } } else if ((wcs_[ww]->prjcode == WCS_LIN) && (strncmp(wcs_[ww]->ctype[0]+2,"LN",2)) && (strncmp(wcs_[ww]->ctype[0]+2,"LT",2)) && (strncmp(wcs_[ww]->ctype[0]+1,"LON",3)) && (strncmp(wcs_[ww]->ctype[0]+1,"LAT",3))) { // this is not a mistake putFitsCard(chan, "CTYPE1", wcs_[ww]->c1type); putFitsCard(chan, "CTYPE2", wcs_[ww]->c2type); } else if (wcs_[ww]->prjcode == WCS_PIX) { // this is not a mistake putFitsCard(chan, "CTYPE1", wcs_[ww]->c1type); putFitsCard(chan, "CTYPE2", wcs_[ww]->c2type); } else { putFitsCard(chan, "CTYPE1", wcs_[ww]->ctype[0]); putFitsCard(chan, "CTYPE2", wcs_[ww]->ctype[1]); } // CRPIX/CRVAL putFitsCard(chan, "CRPIX1", wcs_[ww]->crpix[0]); putFitsCard(chan, "CRPIX2", wcs_[ww]->crpix[1]); putFitsCard(chan, "CRVAL1", wcs_[ww]->crval[0]); putFitsCard(chan, "CRVAL2", wcs_[ww]->crval[1]); // CD/CDELT/PC // This is very complicated. AST is very, very, very picky as to which // keywords it use... { ostringstream cd; cd << "CD1_1" << alt << ends; ostringstream cdelt; cdelt << "CDELT1" << alt << ends; ostringstream pc; pc << "PC1_1" << alt << ends; if (head->find(cd.str().c_str()) || (prim && prim->find(cd.str().c_str()))) { // simple case CD // no rotation, no poles, no LIN, no inner cd values if (!wcs_[ww]->cd[1] && !wcs_[ww]->cd[2] && !wcs_[ww]->rot && !wcs_[ww]->imflip && !wcs_[ww]->coorflip && wcs_[ww]->latpole == 999 && wcs_[ww]->longpole == 999 && wcs_[ww]->prjcode != WCS_PIX && wcs_[ww]->prjcode != WCS_LIN) { putFitsCard(chan, "CDELT1", wcs_[ww]->cdelt[0]); putFitsCard(chan, "CDELT2", wcs_[ww]->cdelt[1]); } else { putFitsCard(chan, "CD1_1", wcs_[ww]->cd[0]); putFitsCard(chan, "CD1_2", wcs_[ww]->cd[1]); putFitsCard(chan, "CD2_1", wcs_[ww]->cd[2]); putFitsCard(chan, "CD2_2", wcs_[ww]->cd[3]); } } // CDELT else if (head->find(cdelt.str().c_str()) || (prim && prim->find(cdelt.str().c_str()))) { putFitsCard(chan, "CDELT1", wcs_[ww]->cdelt[0]); putFitsCard(chan, "CDELT2", wcs_[ww]->cdelt[1]); if (head->find(pc.str().c_str()) || (prim && prim->find(pc.str().c_str()))) { putFitsCard(chan, "PC1_1", wcs_[ww]->pc[0]); putFitsCard(chan, "PC1_2", wcs_[ww]->pc[1]); putFitsCard(chan, "PC2_1", wcs_[ww]->pc[2]); putFitsCard(chan, "PC2_2", wcs_[ww]->pc[3]); } else if (!ww && (head->find("PC001001") || (prim && prim->find("PC001001")))) { putFitsCard(chan, "PC001001", wcs_[ww]->pc[0]); putFitsCard(chan, "PC001002", wcs_[ww]->pc[1]); putFitsCard(chan, "PC002001", wcs_[ww]->pc[2]); putFitsCard(chan, "PC002002", wcs_[ww]->pc[3]); } else { if (!ww && (head->find("CROTA1") || (prim && prim->find("CROTA1")))) putFitsCard(chan, "CROTA1", wcs_[ww]->rot); if (!ww && (head->find("CROTA2") || (prim && head->find("CROTA2")))) putFitsCard(chan, "CROTA2", wcs_[ww]->rot); } } // sanity check else if (!wcs_[ww]->cd[0] && !wcs_[ww]->cd[1] && !wcs_[ww]->cd[2] && !wcs_[ww]->cd[3]) { putFitsCard(chan, "CDELT1", wcs_[ww]->cdelt[0]); putFitsCard(chan, "CDELT2", wcs_[ww]->cdelt[1]); putFitsCard(chan, "PC1_1", wcs_[ww]->pc[0]); putFitsCard(chan, "PC1_2", wcs_[ww]->pc[1]); putFitsCard(chan, "PC2_1", wcs_[ww]->pc[2]); putFitsCard(chan, "PC2_2", wcs_[ww]->pc[3]); } // fall back else { putFitsCard(chan, "CD1_1", wcs_[ww]->cd[0]); putFitsCard(chan, "CD1_2", wcs_[ww]->cd[1]); putFitsCard(chan, "CD2_1", wcs_[ww]->cd[2]); putFitsCard(chan, "CD2_2", wcs_[ww]->cd[3]); } } // equatorial keywords if (wcs_[ww]->prjcode>0 && wcs_[ww]->prjcode<34) { // equiniox putFitsCard(chan, "EQUINOX", wcs_[ww]->equinox); // from wcssub/wcsinit.c line 800 // wcs[ww]->epoch = 1900.0 + (mjd - 15019.81352) / 365.242198781; putFitsCard(chan, "MJD-OBS", (wcs_[ww]->epoch-1900)*365.242198781+15019.81352); ostringstream radesys; radesys << "RADESYS" << alt << ends; if (head->find(radesys.str().c_str())) { // if RADESYS present, use it putFitsCard(chan, "RADESYS", head->getString(radesys.str().c_str())); } else if (prim && prim->find(radesys.str().c_str())) { // if RADESYS present, use it putFitsCard(chan, "RADESYS", prim->getString(radesys.str().c_str())); } else if (head->find("RADECSYS")) { // look for old RADECSYS putFitsCard(chan, "RADESYS", head->getString("RADECSYS")); } else if (prim && prim->find("RADECSYS")) { // look for old RADECSYS putFitsCard(chan, "RADESYS", prim->getString("RADECSYS")); } else { // fall back on wcssubs if (!strncmp("RA",wcs_[ww]->ctype[0],2) || !strncmp("RA",wcs_[ww]->ctype[1],2)) { if (!strncmp("FK4",wcs_[ww]->radecsys,3) || !strncmp("FK4-NO-E",wcs_[ww]->radecsys,8) || !strncmp("FK5",wcs_[ww]->radecsys,3) || !strncmp("ICRS",wcs_[ww]->radecsys,4)) putFitsCard(chan, "RADESYS", wcs_[ww]->radecsys); } } } // ast is picky about latpole/longpole if ((wcs_[ww]->latpole == 999 && wcs_[ww]->longpole == 999) || (wcs_[ww]->latpole == 0 && wcs_[ww]->longpole == 0)) ; else { if (wcs_[ww]->latpole != 999) putFitsCard(chan, "LATPOLE", wcs_[ww]->latpole); if (wcs_[ww]->longpole != 999) putFitsCard(chan, "LONPOLE", wcs_[ww]->longpole); } // Projection parameters- PV, QV, WAT // TAN+PV (old SCAMP-backward compatibility) // TPV+PV (new SCAMP) // xxx+PV (ZPN generic) // xxx+QV (TAN AUTOASTROM) // TNX/ZPX+WAT (IRAF) // TAN/LIN-SIP (SIP) // PVx_y (old SCAMP, SCAMP, generic) // MAXPV defined in wcs.h for (int ii=1; ii<=2; ii++) { for (int mm=0; mm<=MAXPV; mm++) { ostringstream str,str2; str << "PV" << ii << '_' << mm << alt << ends; str2 << "PV" << ii << '_' << mm << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str2.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str2.str().c_str(), val); } } } // QVx_y (Autoastrom) for (int ii=1; ii<=2; ii++) { for (int mm=0; mm<=MAXPV; mm++) { ostringstream str,str2; str << "QV" << ii << '_' << mm << alt << ends; str2 << "QV" << ii << '_' << mm << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str2.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str2.str().c_str(), val); } } } // WATx_ (IRAF) (primary only) if ((wcs_[ww]->prjcode == WCS_TNX || wcs_[ww]->prjcode == WCS_ZPX) && !ww) { for (int jj=0; jj<=2; jj++) { for (int ii=1; ii<=9; ii++) { ostringstream str; str << "WAT" << jj << "_00" << ii << ends; if (head->find(str.str().c_str())) { char* val = head->getString(str.str().c_str()); if (val) { putFitsCard(chan, str.str().c_str(), val); delete [] val; } } else if (prim && prim->find(str.str().c_str())) { char* val = prim->getString(str.str().c_str()); if (val) { putFitsCard(chan, str.str().c_str(), val); delete [] val; } } } } } // SIP (TAN-SIP/LIN-SIP) (primary only) if ((wcs_[ww]->prjcode == WCS_TAN || wcs_[ww]->prjcode == WCS_LIN) && !ww && wcs_[ww]->distcode) { if (head->find("A_ORDER")) { int val = head->getInteger("A_ORDER",0); putFitsCard(chan, "A_ORDER", val); } else if (prim && prim->find("A_ORDER")) { int val = prim->getInteger("A_ORDER",0); putFitsCard(chan, "A_ORDER", val); } if (head->find("AP_ORDER")) { int val = head->getInteger("AP_ORDER",0); putFitsCard(chan, "AP_ORDER", val); } else if (prim && prim->find("AP_ORDER")) { int val = prim->getInteger("AP_ORDER",0); putFitsCard(chan, "AP_ORDER", val); } if (head->find("A_DMAX")) { double val = head->getReal("A_DMAX",0); putFitsCard(chan, "A_DMAX", val); } else if (prim && prim->find("A_DMAX")) { double val = prim->getReal("A_DMAX",0); putFitsCard(chan, "A_DMAX", val); } if (head->find("B_ORDER")) { int val = head->getInteger("B_ORDER",0); putFitsCard(chan, "B_ORDER", val); } else if (prim && prim->find("B_ORDER")) { int val = prim->getInteger("B_ORDER",0); putFitsCard(chan, "B_ORDER", val); } if (head->find("BP_ORDER")) { int val = head->getInteger("BP_ORDER",0); putFitsCard(chan, "BP_ORDER", val); } else if (prim && prim->find("BP_ORDER")) { int val = prim->getInteger("BP_ORDER",0); putFitsCard(chan, "BP_ORDER", val); } if (head->find("B_DMAX")) { double val = head->getReal("B_DMAX",0); putFitsCard(chan, "B_DMAX", val); } else if (prim && prim->find("B_DMAX")) { double val = prim->getReal("B_DMAX",0); putFitsCard(chan, "B_DMAX", val); } for (int jj=0; jj<=9; jj++) { for (int ii=0; ii<=9; ii++) { { ostringstream str; str << "A_" << jj << "_" << ii << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } } { ostringstream str; str << "AP_" << jj << "_" << ii << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } } { ostringstream str; str << "B_" << jj << "_" << ii << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } } { ostringstream str; str << "BP_" << jj << "_" << ii << ends; if (head->find(str.str().c_str())) { double val = head->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } else if (prim && prim->find(str.str().c_str())) { double val = prim->getReal(str.str().c_str(),0); putFitsCard(chan, str.str().c_str(), val); } } } } } } void FitsImage::wcs2ast0(int ww, void* chan) { if (DebugAST) cerr << endl << "wcs2ast0()" << endl; putFitsCard(chan, "CTYPE1", wcs_[ww]->ctype[0]); putFitsCard(chan, "CTYPE2", wcs_[ww]->ctype[1]); // CRPIX/CRVAL putFitsCard(chan, "CRPIX1", wcs_[ww]->crpix[0]); putFitsCard(chan, "CRPIX2", wcs_[ww]->crpix[1]); putFitsCard(chan, "CRVAL1", wcs_[ww]->crval[0]); putFitsCard(chan, "CRVAL2", wcs_[ww]->crval[1]); putFitsCard(chan, "CD1_1", wcs_[ww]->cd[0]); putFitsCard(chan, "CD1_2", wcs_[ww]->cd[1]); putFitsCard(chan, "CD2_1", wcs_[ww]->cd[2]); putFitsCard(chan, "CD2_2", wcs_[ww]->cd[3]); putFitsCard(chan, "EQUINOX", wcs_[ww]->equinox); // from wcssub/wcsinit.c line 800 // wcs[ww]->epoch = 1900.0 + (mjd - 15019.81352) / 365.242198781; putFitsCard(chan, "MJD-OBS", (wcs_[ww]->epoch-1900)*365.242198781+15019.81352); putFitsCard(chan, "RADESYS", wcs_[ww]->radecsys); } void FitsImage::putFitsCard(void* chan, const char* key, const char* value) { char buf[80]; memset(buf,'\0', 80); ostringstream str; str.setf(ios::left,ios::adjustfield); str.width(8); str << key << "= '" << value << "'"; memcpy(buf,str.str().c_str(),str.str().length()); astPutFits(chan, buf, 0); astClearStatus; if (DebugAST) cerr << str.str().c_str() << endl; } void FitsImage::putFitsCard(void* chan, const char* key, int value) { char buf[80]; memset(buf,'\0', 80); ostringstream str; str.setf(ios::left,ios::adjustfield); str.width(8); str << key << "= " << value; memcpy(buf,str.str().c_str(),str.str().length()); astPutFits(chan, buf, 0); astClearStatus; if (DebugAST) cerr << str.str().c_str() << endl; } void FitsImage::putFitsCard(void* chan, const char* key, double value) { char buf[80]; memset(buf,'\0', 80); ostringstream str; str.setf(ios::left,ios::adjustfield); str.setf(ios::scientific,ios::floatfield); str.width(8); str.precision(16); str << key << "= " << value; memcpy(buf,str.str().c_str(),str.str().length()); astPutFits(chan, buf, 0); astClearStatus; if (DebugAST) cerr << str.str().c_str() << endl; } saods9/tksao1.0/frame/fitsimage.h000644 000765 000000 00000061370 12631640531 017147 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsimage_h__ #define __fitsimage_h__ #include "vector.h" #include "vector3d.h" #include "fitsdata.h" #include "coord.h" #include "file.h" #include "wcs.h" #include "head.h" #include "smooth.h" typedef struct { double* kernel; double* src; double* dest; int width; int height; int radius; } t_smooth_arg; typedef struct { FitsFile* base; FitsData* basedata; FitsFile* block; Vector blockFactor; } t_block_arg; extern "C" { #include "ast.h" } class WCSx { public: double crpix[FTY_MAXAXES]; double crval[FTY_MAXAXES]; double cd[FTY_MAXAXES]; public: WCSx(); }; class FitsImage { protected: Context* context_; // pointer to context Tcl_Interp* interp_; char* objectKeyword_; // object keyword // native fits file FitsFile* fits_; FitsFile* post_; // fits post processing FitsFile* hist_; // fits bin FitsFile* hpx_; // healpix // base FitsFile* base_; FitsData* basedata_; // block int manageBlock_; FitsFile* block_; FitsData* blockdata_; // analysis int manageAnalysis_; FitsFile* analysis_; FitsData* analysisdata_; // final FitsFile* image_; FitsData* data_; Vector histCursor; // start point to bin about (physical coords) Vector actualHistCursor; // actual bin center (physical coords) char buf[32]; // tmp storage for returning strings // Mosaic items int keyLTMV; int keyATMV; int keyDTMV; int keyDATASEC; double jyBeam_; // beam area for radio maps BBox datasec; // DATASEC keyword int iisMode_; // flag to indicate if iis Vector iisz_; // z1 and z2 int iiszt_; // 0-Uniary, 1-Linear, 2-Log FitsImage* nextMosaic_; // next mosaic FitsImage* nextSlice_; // next slice int address[FTY_MAXAXES]; int manageWCS_; WorldCoor** wcs_; // wcs list WCSx** wcsx_; // xth Axis WCS AstFrameSet** ast_; // ast frameset; FitsHead* wcsHeader_; // alt wcs header FitsHead* altHeader_; // wcs header for wfpc2 Matrix wcsToRef_; // iraf/wcs matrix protected: void reset(); void process(const char*, int); void initCompress(); void initNRRD(); void initENVI(); void initBin(); void initHPX(); void initWCS(); void initWCSPhysical(); Vector getHistCenter(); char* root(const char*); char* strip(const char*); #ifdef __WIN32 void smooth(); #else void smooth(pthread_t*, t_smooth_arg*); #endif void wcsShow(WorldCoor*); void astinit(int, FitsHead*, FitsHead*); void astinit0(int); int checkAst(double, double); AstFrameSet* fits2ast(FitsHead*); AstFrameSet* buildast(int, FitsHead*, FitsHead*); AstFrameSet* buildast0(int); void wcs2ast(int, FitsHead*, FitsHead*, void*); void wcs2ast0(int, void*); void header2ast(FitsHead*, void*); void putFitsCard(void* chan, const char* key, const char* value); void putFitsCard(void* chan, const char* key, int value); void putFitsCard(void* chan, const char* key, double value); char* ASTpix2wcs(Vector, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, char*, int); Vector ASTpix2wcs(Vector, Coord::CoordSystem, Coord::SkyFrame); Vector* ASTpix2wcs(Vector*, int, Coord::CoordSystem, Coord::SkyFrame); Vector ASTwcs2pix(Vector, Coord::CoordSystem, Coord::SkyFrame); Vector* ASTwcs2pix(Vector*, int, Coord::CoordSystem, Coord::SkyFrame); double ASTwcsdist(Vector, Vector, Coord::CoordSystem); public: char* fileName; char* rootBaseFileName; char* fullBaseFileName; char* iisFileName; // alt file name for iis Matrix irafToRef; Matrix dataToImage; Matrix imageToData; Matrix dataToRef; Matrix refToData; Matrix dataToUser; Matrix userToData; Matrix dataToWidget; Matrix widgetToData; Matrix dataToCanvas; Matrix canvasToData; Matrix dataToWindow; Matrix windowToData; Matrix canvasToRef; Matrix refToCanvas; Matrix refToImage; Matrix imageToRef; Matrix refToPhysical; Matrix physicalToRef; Matrix refToDetector; Matrix detectorToRef; Matrix refToAmplifier; Matrix amplifierToRef; Matrix imageToWidget; Matrix widgetToImage; Matrix imageToPhysical; Matrix physicalToImage; Matrix imageToDetector; Matrix detectorToImage; Matrix imageToAmplifier; Matrix amplifierToImage; Matrix physicalToDetector; Matrix detectorToPhysical; Matrix physicalToAmplifier; Matrix amplifierToPhysical; Matrix3d dataToImage3d; Matrix3d imageToData3d; Matrix3d dataToRef3d; Matrix3d refToData3d; Matrix3d dataToUser3d; Matrix3d userToData3d; Matrix3d dataToWidget3d; Matrix3d widgetToData3d; Matrix3d dataToCanvas3d; Matrix3d canvasToData3d; Matrix3d dataToWindow3d; Matrix3d windowToData3d; Matrix magnifierToData; Matrix dataToMagnifier; Matrix3d magnifierToData3d; Matrix3d dataToMagnifier3d; Matrix pannerToData; Matrix dataToPanner; Matrix3d pannerToData3d; Matrix3d dataToPanner3d; Matrix psToData; Matrix dataToPS; Matrix3d psToData3d; Matrix3d dataToPS3d; FitsBound iparams; // image bbox FitsBound dparams; // DATASEC bbox FitsBound cparams; // crop bbox public: FitsImage(Context*, Tcl_Interp*); virtual ~FitsImage(); void setContext(Context* cx) {context_ = cx;} void load(); #ifdef __WIN32 void analysis(int); #else void analysis(int, pthread_t*, t_smooth_arg*); #endif void block(); #ifndef __WIN32 void block(pthread_t*); #endif Matrix bin(const Vector&); Matrix binCenter(); Matrix binCursor(); FitsImage* nextMosaic() {return nextMosaic_;} FitsImage* nextSlice() {return nextSlice_;} void setNextMosaic(FitsImage* n) {nextMosaic_ = n;} void setNextSlice(FitsImage* n) {nextSlice_ = n;} FitsFile* fitsFile() {return fits_;} FitsFile* baseFile() {return base_;} FitsFile* blockFile() {return block_;} FitsFile* analysisFile() {return analysis_;} FitsFile* imageFile() {return image_;} // we assume that 'data' is valid void* basedata() {return basedata_->data();} void* blockdata() {return blockdata_->data();} void* analysisdata() {return analysisdata_->data();} void* imagedata() {return data_->data();} // isValid() means "valid image found" int isValid() {return image_ ? 1 : 0;} int isPost() {return post_ ? 1 : 0;} int isHist() {return hist_ ? 1 : 0;} int isHPX() {return hpx_ ? 1 : 0;} int isImage() {return fits_ ? fits_->isImage() : 0;} int isTable() {return fits_ ? fits_->isTable() : 0;} int isAsciiTable() {return fits_ ? fits_->isAsciiTable() : 0;} int isBinTable() {return fits_ ? fits_->isBinTable() : 0;} void close() {if (fits_) fits_->done();} void match(const char* xxname1, const char* yyname1, Coord::CoordSystem sys1, Coord::SkyFrame sky1, const char* xxname2, const char* yyname2, Coord::CoordSystem sys2, Coord::SkyFrame sky2, double rad, Coord::CoordSystem sys, Coord::SkyDist dist, const char* rrname); FitsHead* parseWCS(istream&); Matrix nextBin(const Vector&); void calcHistSize(); Vector getHistDim(); Vector getHistColMinMax(const char*); Vector getHistColDim(const char*); Vector getHistCursor() {return actualHistCursor;} const char* getHistFilter(); const char* getHistX(); const char* getHistY(); const char* getHistZ(); char* getHistList(); void setBinCursor(const Vector&); void setBinX(const char* str) {if (fits_) fits_->setpBinX(str);} void setBinY(const char* str) {if (fits_) fits_->setpBinY(str);} void setBinZ(const char* str) {if (fits_) fits_->setpBinZ(str);} void setBinFilter(const char* fil) {if (fits_) fits_->setpFilter(fil);} void setBinSliceFilter(const char*); void setBinColMinMax(const char* str, const Vector& lim) {if (fits_) fits_->setColMinMax(str,lim);} int hasBinCol(const char*); const char* objectKeyword() {return objectKeyword_;} void setObjectKeyword(const char*); void setFileName(const char*); const char* getFileName(Base::FileNameType); const char* updateFileNameBin(Base::FileNameType); const char* updateFileNameImage(Base::FileNameType); const char* iisGetFileName() {return iisFileName;} void iisSetFileName(const char*); long naxis(int ii) {return image_->head()->naxis(ii);} long owidth() {return fits_->head()->naxis(0);} long oheight() {return fits_->head()->naxis(1);} Vector osize() {return Vector(owidth(),oheight());} Vector ocenter() {return Vector(owidth(),oheight())/2.;} long width() {return image_->head()->naxis(0);} long height() {return image_->head()->naxis(1);} long depth() {return naxis(2)>0 ? naxis(2) : 1;} Vector size() {return Vector(width(),height());} Vector center() {return Vector(width(),height())/2.;} int nhdu(); int bitpix() {return image_->head()->bitpix();} int ext() {return fits_->ext();} FitsBound* getDataParams(FrScale::ScanMode); // return bbox in IMAGE void setCropParams(int); void setCropParams(int,int,int,int,int); void setCropParams(const Vector&, const Vector&, int); int hasLTMV() {return keyLTMV;} int hasATMV() {return keyATMV;} int hasDTMV() {return keyDTMV;} FitsHead* wcsHeader() {return wcsHeader_;} WCSx** wcsx() {return wcsx_;} int isIIS() {return iisMode_;} Vector& iisz() {return iisz_;} char* pix2wcs(Vector in, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, char* lbuf, int len) {return ASTpix2wcs(in, sys, sky, format, lbuf, len);} Vector pix2wcs(Vector in, Coord::CoordSystem sys, Coord::SkyFrame sky) {return ASTpix2wcs(in, sys, sky);} Vector wcs2pix(Vector in, Coord::CoordSystem sys, Coord::SkyFrame sky) {return ASTwcs2pix(in, sys, sky);} double wcsdist(Vector aa, Vector bb, Coord::CoordSystem sys) {return ASTwcsdist(aa, bb, sys);} double pix2wcsx(double, Coord::CoordSystem, int); double wcs2pixx(double, Coord::CoordSystem, int); void altWCS(istream&); void appendWCS(istream&); void listWCS(ostream&, Coord::CoordSystem); void resetWCS(); void replaceWCS(istream&); void initWCS0(const Vector&); void resetWCS0(); void processKeywordsPhysical(); void processKeywordsParams(); void processKeywordsFitsSection(); int processKeywordsIRAF(FitsImage*); WorldCoor* getWCS(Coord::CoordSystem sys) {return (wcs_ && wcs_[sys-Coord::WCS]) ? wcs_[sys-Coord::WCS] : NULL;} const char* getWCSName(Coord::CoordSystem sys) {return (wcs_ && wcs_[sys-Coord::WCS]) ? wcs_[sys-Coord::WCS]->wcsname : NULL;} Coord::Orientation getWCSOrientation(Coord::CoordSystem, Coord::SkyFrame); double getWCSRotation(Coord::CoordSystem, Coord::SkyFrame); Vector getWCScdelt(Coord::CoordSystem); Vector getWCScrpix(Coord::CoordSystem); Vector getWCScrval(Coord::CoordSystem); void setAstSkyFrame(AstFrameSet*, Coord::SkyFrame); void setAstFormat(AstFrameSet*, int, const char*); AstFrameSet* getAST(Coord::CoordSystem sys) {return (ast_ && ast_[sys-Coord::WCS]) ? ast_[sys-Coord::WCS] : NULL;} int hasWCS(Coord::CoordSystem); int hasWCSx(Coord::CoordSystem, int); int hasWCSEqu(Coord::CoordSystem); int hasWCSCel(Coord::CoordSystem); void updateMatrices(Matrix&, Matrix&, Matrix&, Matrix&, Matrix&); void updateMatrices(Matrix3d&, Matrix3d&, Matrix3d&, Matrix3d&); void updatePannerMatrices(Matrix&); void updatePannerMatrices(Matrix3d&); void updateMagnifierMatrices(Matrix&); void updateMagnifierMatrices(Matrix3d&); void updatePS(Matrix); void updatePS(Matrix3d); Matrix& matrixToData(Coord::InternalSystem); Matrix& matrixFromData(Coord::InternalSystem sys); Matrix3d& matrixFromData3d(Coord::InternalSystem); Matrix3d& matrixToData3d(Coord::InternalSystem); Vector mapFromRef(const Vector&, Coord::CoordSystem, Coord::SkyFrame =Coord::FK5); void mapFromRef(const Vector&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, char*,int); Vector mapToRef(const Vector&, Coord::CoordSystem, Coord::SkyFrame =Coord::FK5); double mapFromRef3axis(double, Coord::CoordSystem, int); double mapToRef3axis(double, Coord::CoordSystem, int); double mapLenFromRef(double, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); Vector mapLenFromRef(const Vector&, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); double mapLenToRef(double, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); Vector mapLenToRef(const Vector&, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); Vector mapLenFromImage(const Vector&, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); Vector mapLenToImage(const Vector&, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); double mapDistFromRef(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyDist =Coord::DEGREE); const char* getValue(const Vector& v); float getValueFloat(const Vector& v) {return data_->getValueFloat(v);} double getValueDouble(const Vector& v) {return data_->getValueDouble(v);} int getValueMask(const Vector& v) {return data_->getValueMask(v);} int getValueMask(double x, double y) {return data_->getValueMask(x,y);} float getValueFloat(long i) {return data_->getValueFloat(i);} double getValueDouble(long i) {return data_->getValueDouble(i);} int getValueMask(long i) {return data_->getValueMask(i);} void setClip(double l, double h) {data_->setClip(l,h);} const char* getMin() {return data_ ? data_->getMin() : NULL;} const char* getMax() {return data_ ? data_->getMax() : NULL;} const char* getLow() {return data_ ? data_->getLow() : NULL;} const char* getHigh() {return data_ ? data_->getHigh() : NULL;} double min() {return data_ ? data_->min() : 0;} double max() {return data_ ? data_->max() : 0;} double low() {return data_ ? data_->low() : 0;} double high() {return data_ ? data_->high() : 0;} void updateClip(FrScale*); int hasDATAMIN() {return data_ ? data_->hasDATAMIN() : 0;} int hasDATASEC() {return keyDATASEC;} int hasIRAFMIN() {return data_ ? data_->hasIRAFMIN() : 0;} void bin(double* b, int l, double mn, double mx, FrScale::ScanMode ds) {data_->bin(b,l,mn,mx,getDataParams(ds));} char* display(FitsHead*); char* displayHeader(); char* displayPrimary(); char* displayWCS(); FitsHead* head() {return image_->head();} char* getKeyword(const char* key) {return fits_->getKeyword(key);} int findKeyword(const char*); int saveFitsPrimHeader(OutFitsStream& str) {return image_ ? image_->saveFitsPrimHeader(str) : 0;} int saveFitsXtHeader(OutFitsStream& str, int dd) {return image_ ? image_->saveFitsXtHeader(str, dd) : 0;} int saveFitsHeader(OutFitsStream& str, int dd) {return image_ ? image_->saveFitsHeader(str, dd) : 0;} int saveFits(OutFitsStream& str) {return image_ ? image_->saveFits(str) : 0;} int saveFitsPad(OutFitsStream& str, size_t cnt, char fil) {return image_ ? image_->saveFitsPad(str, cnt, fil) : 0;} int saveFitsTable(OutFitsStream& str) {return fits_ ? fits_->saveFitsTable(str) : 0;} int saveArray(OutFitsStream& str, FitsFile::ArchType endian) {return image_ ? image_->saveArray(str, endian) : 0;} int saveFitsIISHeader(OutFitsStream& str) {return image_ ? image_->saveFitsIISHeader(str) : 0;} int saveFitsIIS(OutFitsStream& str) {return image_ ? image_->saveFitsIIS(str,iisz_) : 0;} const Matrix& wcsToRef() {return wcsToRef_;} void setwcsToRef(Matrix mm) {wcsToRef_ = mm;} }; // Fits class FitsImageFitsAlloc : public FitsImage { public: FitsImageFitsAlloc(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageFitsAllocGZ : public FitsImage { public: FitsImageFitsAllocGZ(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageFitsChannel : public FitsImage { public: FitsImageFitsChannel(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageFitsMMap : public FitsImage { public: FitsImageFitsMMap(Context*, Tcl_Interp*, const char*, int); }; class FitsImageFitsSMMap : public FitsImage { public: FitsImageFitsSMMap(Context*, Tcl_Interp*, const char*, const char*, int); }; class FitsImageFitsMMapIncr : public FitsImage { public: FitsImageFitsMMapIncr(Context*, Tcl_Interp*, const char*, int); }; class FitsImageFitsShare : public FitsImage { public: FitsImageFitsShare(Context*, Tcl_Interp*, Base::ShmType, int, const char*, int); }; class FitsImageFitsSShare : public FitsImage { public: FitsImageFitsSShare(Context*, Tcl_Interp*, Base::ShmType, int, int, const char*, int); }; class FitsImageFitsSocket : public FitsImage { public: FitsImageFitsSocket(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageFitsSocketGZ : public FitsImage { public: FitsImageFitsSocketGZ(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageFitsVar : public FitsImage { public: FitsImageFitsVar(Context*, Tcl_Interp*, const char*, const char*, int); }; class FitsImageFitsOrder : public FitsImage { public: FitsImageFitsOrder(Context*, Tcl_Interp*, FitsImage*, FitsHead*, char*, size_t, int); }; // Fits Next class FitsImageFitsNextAlloc : public FitsImage { public: FitsImageFitsNextAlloc(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextAllocGZ : public FitsImage { public: FitsImageFitsNextAllocGZ(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextChannel : public FitsImage { public: FitsImageFitsNextChannel(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextMMap : public FitsImage { public: FitsImageFitsNextMMap(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextSMMap : public FitsImage { public: FitsImageFitsNextSMMap(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextMMapIncr : public FitsImage { public: FitsImageFitsNextMMapIncr(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextShare : public FitsImage { public: FitsImageFitsNextShare(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextSShare : public FitsImage { public: FitsImageFitsNextSShare(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextSocket : public FitsImage { public: FitsImageFitsNextSocket(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextSocketGZ : public FitsImage { public: FitsImageFitsNextSocketGZ(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextVar : public FitsImage { public: FitsImageFitsNextVar(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageFitsNextHist : public FitsImage { public: FitsImageFitsNextHist(Context*, Tcl_Interp*, FitsImage*, FitsFile*, int); }; class FitsImageFitsNextPost : public FitsImage { public: FitsImageFitsNextPost(Context*, Tcl_Interp*, FitsImage*, FitsFile*, int); }; class FitsImageFitsNextOrder : public FitsImage { public: FitsImageFitsNextOrder(Context*, Tcl_Interp*, FitsImage*, FitsFile*, int); }; // Array class FitsImageArrAlloc : public FitsImage { public: FitsImageArrAlloc(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageArrAllocGZ : public FitsImage { public: FitsImageArrAllocGZ(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageArrChannel : public FitsImage { public: FitsImageArrChannel(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageArrMMap : public FitsImage { public: FitsImageArrMMap(Context*, Tcl_Interp*, const char*, int); }; class FitsImageArrMMapIncr : public FitsImage { public: FitsImageArrMMapIncr(Context*, Tcl_Interp*, const char*, int); }; class FitsImageArrShare : public FitsImage { public: FitsImageArrShare(Context*, Tcl_Interp*, Base::ShmType, int, const char*, int); }; class FitsImageArrSocket : public FitsImage { public: FitsImageArrSocket(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageArrSocketGZ : public FitsImage { public: FitsImageArrSocketGZ(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageArrVar : public FitsImage { public: FitsImageArrVar(Context*, Tcl_Interp*, const char*, const char*, int); }; // ENVI class FitsImageENVISMMap : public FitsImage { public: FitsImageENVISMMap(Context*, Tcl_Interp*, const char*, const char*, int); }; // NRRD class FitsImageNRRDAlloc : public FitsImage { public: FitsImageNRRDAlloc(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageNRRDChannel : public FitsImage { public: FitsImageNRRDChannel(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageNRRDMMap : public FitsImage { public: FitsImageNRRDMMap(Context*, Tcl_Interp*, const char*, int); }; class FitsImageNRRDShare : public FitsImage { public: FitsImageNRRDShare(Context*, Tcl_Interp*, Base::ShmType, int, const char*, int); }; class FitsImageNRRDSocket : public FitsImage { public: FitsImageNRRDSocket(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageNRRDVar : public FitsImage { public: FitsImageNRRDVar(Context*, Tcl_Interp*, const char*, const char*, int); }; // Photo class FitsImagePhoto : public FitsImage { public: FitsImagePhoto(Context*, Tcl_Interp*, const char*, const char*, int); }; class FitsImagePhotoCube : public FitsImage { public: FitsImagePhotoCube(Context*, Tcl_Interp*, const char*, const char*, int); }; class FitsImagePhotoCubeNext : public FitsImage { public: FitsImagePhotoCubeNext(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; // Mosaic class FitsImageMosaicAlloc : public FitsImage { public: FitsImageMosaicAlloc(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageMosaicAllocGZ : public FitsImage { public: FitsImageMosaicAllocGZ(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageMosaicChannel : public FitsImage { public: FitsImageMosaicChannel(Context*, Tcl_Interp*, const char*, const char*, FitsFile::FlushMode, int); }; class FitsImageMosaicMMap : public FitsImage { public: FitsImageMosaicMMap(Context*, Tcl_Interp*, const char*, int); }; class FitsImageMosaicMMapIncr : public FitsImage { public: FitsImageMosaicMMapIncr(Context*, Tcl_Interp*, const char*, int); }; class FitsImageMosaicShare : public FitsImage { public: FitsImageMosaicShare(Context*, Tcl_Interp*, Base::ShmType, int, const char*, int); }; class FitsImageMosaicSocket : public FitsImage { public: FitsImageMosaicSocket(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageMosaicSocketGZ : public FitsImage { public: FitsImageMosaicSocketGZ(Context*, Tcl_Interp*, int, const char*, FitsFile::FlushMode, int); }; class FitsImageMosaicVar : public FitsImage { public: FitsImageMosaicVar(Context*, Tcl_Interp*, const char*, const char*, int); }; // Mosaic Next class FitsImageMosaicNextAlloc : public FitsImage { public: FitsImageMosaicNextAlloc(Context*, Tcl_Interp*, const char*, FitsFile*, FitsFile::FlushMode, int); }; class FitsImageMosaicNextAllocGZ : public FitsImage { public: FitsImageMosaicNextAllocGZ(Context*, Tcl_Interp*, const char*, FitsFile*, FitsFile::FlushMode, int); }; class FitsImageMosaicNextChannel : public FitsImage { public: FitsImageMosaicNextChannel(Context*, Tcl_Interp*, const char*, FitsFile*, FitsFile::FlushMode, int); }; class FitsImageMosaicNextMMap : public FitsImage { public: FitsImageMosaicNextMMap(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageMosaicNextMMapIncr : public FitsImage { public: FitsImageMosaicNextMMapIncr(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageMosaicNextShare : public FitsImage { public: FitsImageMosaicNextShare(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; class FitsImageMosaicNextSocket : public FitsImage { public: FitsImageMosaicNextSocket(Context*, Tcl_Interp*, const char*, FitsFile*, FitsFile::FlushMode, int); }; class FitsImageMosaicNextSocketGZ : public FitsImage { public: FitsImageMosaicNextSocketGZ(Context*, Tcl_Interp*, const char*, FitsFile*, FitsFile::FlushMode, int); }; class FitsImageMosaicNextVar : public FitsImage { public: FitsImageMosaicNextVar(Context*, Tcl_Interp*, const char*, FitsFile*, int); }; // IIS class FitsImageIIS : public FitsImage { public: FitsImageIIS(Context*, Tcl_Interp*, int, int); void iisErase(); char* iisGet(int xx, int yy, int dx, int dy); void iisSet(const char* src, int xx, int yy, int dx, int dy); void iisWCS(const Matrix&, const Vector&, int); }; #endif saods9/tksao1.0/frame/fitsmap.C000644 000765 000000 00000015071 12464214755 016603 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" // Map Point Vector FitsImage::mapFromRef(const Vector& vv, Coord::CoordSystem out, Coord::SkyFrame sky) { switch (out) { case Coord::IMAGE: return vv * refToImage; case Coord::PHYSICAL: return vv * refToPhysical; case Coord::AMPLIFIER: return vv * refToAmplifier; case Coord::DETECTOR: return vv * refToDetector; default: if (hasWCS(out)) return pix2wcs(vv * refToImage, out, sky); } maperr =1; return vv; } void FitsImage::mapFromRef(const Vector& vv, Coord::CoordSystem out, Coord::SkyFrame sky, Coord::SkyFormat format, char* buf, int length) { if (hasWCS(out)) { pix2wcs(vv * refToImage, out, sky, format, buf, length); return; } maperr =1; strcpy(buf,""); } Vector FitsImage::mapToRef(const Vector& vv, Coord::CoordSystem in, Coord::SkyFrame sky) { switch (in) { case Coord::IMAGE: return vv * imageToRef; case Coord::PHYSICAL: return vv * physicalToRef; case Coord::AMPLIFIER: return vv * amplifierToRef; case Coord::DETECTOR: return vv * detectorToRef; default: if (hasWCS(in)) return wcs2pix(vv, in, sky) * imageToRef; } maperr =1; return vv; } // Map Length double FitsImage::mapLenFromRef(double dd, Coord::CoordSystem sys, Coord::SkyDist dist) { Vector rr = mapLenFromRef(Vector(dd,0),sys,dist); return rr[0]; } Vector FitsImage::mapLenFromRef(const Vector& vv, Coord::CoordSystem sys, Coord::SkyDist dist) { // really from image coords switch (sys) { case Coord::IMAGE: return mapLen(vv,refToImage); case Coord::PHYSICAL: return mapLen(vv,refToPhysical); case Coord::AMPLIFIER: return mapLen(vv,refToPhysical * physicalToAmplifier); case Coord::DETECTOR: return mapLen(vv,refToPhysical * physicalToDetector); default: if (hasWCS(sys)) { Vector cd = getWCScdelt(sys); Vector in = mapLen(vv,refToImage); Vector out = Vector(in[0]*cd[0], in[1]*cd[1]).abs(); if (hasWCSCel(sys)) { switch (dist) { case Coord::DEGREE: break; case Coord::ARCMIN: out *= 60; break; case Coord::ARCSEC: out *=60*60; break; } } return out; } } maperr =1; return Vector(); } double FitsImage::mapLenToRef(double dd, Coord::CoordSystem sys, Coord::SkyDist dist) { Vector rr = mapLenToRef(Vector(dd,0), sys, dist); return rr[0]; } Vector FitsImage::mapLenToRef(const Vector& vv,Coord::CoordSystem sys, Coord::SkyDist dist) { switch (sys) { case Coord::IMAGE: return mapLen(vv,imageToRef); case Coord::PHYSICAL: return mapLen(vv,physicalToRef); case Coord::AMPLIFIER: return mapLen(vv,amplifierToPhysical * physicalToRef); case Coord::DETECTOR: return mapLen(vv,detectorToPhysical * physicalToRef); default: if (hasWCS(sys)) { Vector cd = getWCScdelt(sys); Vector in = mapLen(vv,refToImage); Vector out = Vector(in[0]/cd[0], in[1]/cd[1]).abs(); if (hasWCSCel(sys)) { switch (dist) { case Coord::DEGREE: break; case Coord::ARCMIN: out /= 60; break; case Coord::ARCSEC: out /= 60*60; break; } } return out; } } maperr =1; return Vector(); } Vector FitsImage::mapLenFromImage(const Vector& vv, Coord::CoordSystem sys, Coord::SkyDist dist) { switch (sys) { case Coord::IMAGE: return vv; case Coord::PHYSICAL: return mapLen(vv,imageToPhysical); case Coord::AMPLIFIER: return mapLen(vv,imageToPhysical * physicalToAmplifier); case Coord::DETECTOR: return mapLen(vv,imageToPhysical * physicalToDetector); default: if (hasWCS(sys)) { Vector cd = getWCScdelt(sys); Vector in = vv; Vector out = Vector(in[0]*cd[0], in[1]*cd[1]).abs(); if (hasWCSCel(sys)) { switch (dist) { case Coord::DEGREE: break; case Coord::ARCMIN: out *= 60; break; case Coord::ARCSEC: out *=60*60; break; } } return out; } } maperr =1; return Vector(); } Vector FitsImage::mapLenToImage(const Vector& vv,Coord::CoordSystem sys, Coord::SkyDist dist) { switch (sys) { case Coord::IMAGE: return vv; case Coord::PHYSICAL: return mapLen(vv,physicalToImage); case Coord::AMPLIFIER: return mapLen(vv,amplifierToPhysical * physicalToImage); case Coord::DETECTOR: return mapLen(vv,detectorToPhysical * physicalToImage); default: if (hasWCS(sys)) { Vector cd = getWCScdelt(sys); Vector in = vv; Vector out = Vector(in[0]/cd[0], in[1]/cd[1]).abs(); if (hasWCSCel(sys)) { switch (dist) { case Coord::DEGREE: break; case Coord::ARCMIN: out /= 60; break; case Coord::ARCSEC: out /= 60*60; break; } } return out; } } maperr =1; return Vector(); } // Map Distance double FitsImage::mapDistFromRef(const Vector& vv1, const Vector& vv2, Coord::CoordSystem sys, Coord::SkyDist dist) { switch (sys) { case Coord::IMAGE: { Vector v1 = vv1 * refToImage; Vector v2 = vv2 * refToImage; return (v2-v1).length(); } case Coord::PHYSICAL: { Vector v1 = vv1 * refToPhysical; Vector v2 = vv2 * refToPhysical; return (v2-v1).length(); } case Coord::AMPLIFIER: { Vector v1 = vv1 * refToPhysical * physicalToAmplifier; Vector v2 = vv2 * refToPhysical * physicalToAmplifier; return (v2-v1).length(); } case Coord::DETECTOR: { Vector v1 = vv1 * refToPhysical * physicalToDetector; Vector v2 = vv2 * refToPhysical * physicalToDetector; return (v2-v1).length(); } default: if (hasWCS(sys)) { Vector v1 = pix2wcs(vv1 * refToImage, sys, Coord::FK5); Vector v2 = pix2wcs(vv2 * refToImage, sys, Coord::FK5); if (hasWCSCel(sys)) { switch (dist) { case Coord::DEGREE: return wcsdist(v1,v2,sys); case Coord::ARCMIN: return wcsdist(v1,v2,sys)*60; case Coord::ARCSEC: return wcsdist(v1,v2,sys)*60*60; } } else return wcsdist(v1,v2,sys); } } maperr =1; return 0; } double FitsImage::mapFromRef3axis(double vv, Coord::CoordSystem out, int ss) { switch (out) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::AMPLIFIER: case Coord::DETECTOR: return vv+.5; default: return pix2wcsx(vv+.5,out,ss); } } double FitsImage::mapToRef3axis(double vv, Coord::CoordSystem in, int ss) { switch (in) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::AMPLIFIER: case Coord::DETECTOR: return vv-.5; default: return wcs2pixx(vv,in,ss) -.5; } } saods9/tksao1.0/frame/fitsmask.C000644 000765 000000 00000001772 12573614501 016756 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fitsmask.h" #include "base.h" #include "fitsimage.h" FitsMask::FitsMask(Base* p, FitsImage* fits, char* clr, int mrk) : parent_(p), mask_(fits) { current_ = mask_; mptr_ = current_; colorName_ = dupstr(clr); color_ = parent_->getXColor(colorName_); parent_->encodeTrueColor(color_, trueColor_); mark_ = mrk; next_ = NULL; previous_ = NULL; } FitsMask::~FitsMask() { if (colorName_) delete [] colorName_; FitsImage* ptr = mask_; while (ptr) { // better not have more that one slice FitsImage* sptr = ptr->nextSlice(); while (sptr) { FitsImage* stmp = sptr->nextSlice(); delete sptr; sptr = stmp; } FitsImage* tmp = ptr->nextMosaic(); delete ptr; ptr = tmp; } } void FitsMask::nextMosaic() { if (mptr_) mptr_ = mptr_->nextMosaic(); } saods9/tksao1.0/frame/fitsmask.h000644 000765 000000 00000002051 12464214755 017020 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsmask_h__ #define __fitsmask_h__ #include class Base; class FitsImage; class FitsMask { private: Base* parent_; FitsImage* mask_; FitsImage* current_; FitsImage* mptr_; char* colorName_; XColor* color_; char trueColor_[4]; int mark_; protected: FitsMask* previous_; FitsMask* next_; public: FitsMask(Base*, FitsImage*, char*, int); virtual ~FitsMask(); FitsImage* mask() {return mask_;} FitsImage* current() {return current_;} FitsImage* mptr() {return mptr_;} XColor* color() {return color_;} char* trueColor() {return trueColor_;} int mark() {return mark_;} void initMosaic() {mptr_ = current_;} void nextMosaic(); void nextSlice(); FitsMask* previous() {return previous_;} void setPrevious(FitsMask* m) {previous_ = m;} FitsMask* next() {return next_;} void setNext(FitsMask* m) {next_ = m;} }; #endif saods9/tksao1.0/frame/fitsnrrd.C000644 000765 000000 00000001751 12464214755 016773 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "fitsimage.h" #include "nrrdgzip.h" void FitsImage::initNRRD() { if (post_) delete post_; post_ = NULL; switch (fits_->pEncoding()) { case FitsFile::RAW: break; case FitsFile::GZIP: switch (fits_->pBitpix()) { case 8: post_ = new FitsNRRDGzipm(fits_); break; case 16: post_ = new FitsNRRDGzipm(fits_); break; case -16: post_ = new FitsNRRDGzipm(fits_); break; case 32: post_ = new FitsNRRDGzipm(fits_); break; case 64: post_ = new FitsNRRDGzipm(fits_); break; case -32: post_ = new FitsNRRDGzipm(fits_); break; case -64: post_ = new FitsNRRDGzipm(fits_); break; } break; default: break; } return; } saods9/tksao1.0/frame/fr3dcommand.C000644 000765 000000 00000034460 12614744316 017336 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dbase.h" #include "fitsimage.h" #include "context.h" #include "marker.h" #include "sigbus.h" void Frame3dBase::binToFitCmd() { if (!keyContext->fits) return; Vector3d dim(keyContext->fits->getHistDim(), keyContext->binDepth()); double bf = 1/calcZoom3d(dim, Vector(options->width,options->height)); // round up to next power of 2 if (bf < 1) keyContext->setBinToFactor(Vector(1,1)); else { int p=1; while (psetBinToFactor(Vector(p,p)); } Matrix mm = keyContext->binCursor(); updateBin(mm); } void Frame3dBase::blockToFitCmd() { if (!keyContext->fits) return; Vector3d ss(keyContext->fits->osize(),keyContext->naxis(2)); cerr << ss << endl; double bf = 1/calcZoom3d(ss, Vector(options->width,options->height)); // round down to next power of 2 Vector vv; if (bf < 1) vv = keyContext->setBlockToFactor(Vector(1,1)); else { int p=1; while (psetBlockToFactor(Vector(p,p)); } keyContext->block(); keyContext->analysis(); updateBlock(vv); } void Frame3dBase::crop3dBeginCmd(const Vector& vv, int which) { // which =0 (zmin) which =1 (zmax) if (!keyContext->fits) return; cropBegin = vv * Scale(zoom_).invert(); cropEnd = vv * Scale(zoom_).invert(); // params is a BBOX in DATA coords 0-n FitsZBound* zparams = keyContext->getDataParams(keyContext->frScale.scanMode()); if (!which) cropsl_ = zparams->zmin; else cropsl_ = zparams->zmax; } void Frame3dBase::crop3dMotionCmd(const Vector& vv, int which) { // which =0 (zmin) which =1 (zmax) if (!keyContext->fits) return; // params is a BBOX in DATA coords 0-n FitsBound* params = keyContext->fits->getDataParams(keyContext->frScale.scanMode()); FitsZBound* zparams = keyContext->getDataParams(keyContext->frScale.scanMode()); Vector ss(params->xmin,params->ymin); Vector tt(params->xmax,params->ymax); // erase if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { Vector ll = mapFromRef3d(ss,Coord::CANVAS,cropsl_); Vector lr = mapFromRef3d(Vector(tt[0],ss[1]),Coord::CANVAS,cropsl_); Vector ur = mapFromRef3d(tt,Coord::CANVAS,cropsl_); Vector ul = mapFromRef3d(Vector(ss[0],tt[1]),Coord::CANVAS,cropsl_); BBox bb(ll); bb.bound(lr); bb.bound(ur); bb.bound(ul); redrawNow(bb.expand(2)); } cropEnd = vv * Scale(zoom_).invert(); Vector diff = cropEnd-cropBegin; if (!which) cropsl_ = diff[0]+zparams->zmin; else cropsl_ = diff[0]+zparams->zmax; // this will be incorrect for multiple ext/file cubes double depth = keyContext->naxis(2); if (!which) { if (cropsl_<0) cropsl_ = 0; if (cropsl_>zparams->zmax-1) cropsl_ = zparams->zmax-1; } else { if (cropsl_zmin+1) cropsl_ = zparams->zmin+1; if (cropsl_>depth) cropsl_ = depth; } // and draw to window { Vector ll = mapFromRef3d(ss,Coord::WINDOW,cropsl_); Vector lr = mapFromRef3d(Vector(tt[0],ss[1]),Coord::WINDOW,cropsl_); Vector ur = mapFromRef3d(tt,Coord::WINDOW,cropsl_); Vector ul = mapFromRef3d(Vector(ss[0],tt[1]),Coord::WINDOW,cropsl_); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ll[0],ll[1],lr[0],lr[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,lr[0],lr[1],ur[0],ur[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ur[0],ur[1],ul[0],ul[1]); XDrawLine(display,Tk_WindowId(tkwin),selectGCXOR,ul[0],ul[1],ll[0],ll[1]); } } void Frame3dBase::crop3dEndCmd(const Vector& vv, int which) { // which =0 (zmin) which =1 (zmax) if (!keyContext->fits) return; // params is a BBOX in DATA coords 0-n FitsBound* params = keyContext->fits->getDataParams(keyContext->frScale.scanMode()); FitsZBound* zparams = keyContext->getDataParams(keyContext->frScale.scanMode()); Vector ss(params->xmin,params->ymin); Vector tt(params->xmax,params->ymax); // erase if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { Vector ll = mapFromRef3d(ss,Coord::CANVAS,cropsl_); Vector lr = mapFromRef3d(Vector(tt[0],ss[1]),Coord::CANVAS,cropsl_); Vector ur = mapFromRef3d(tt,Coord::CANVAS,cropsl_); Vector ul = mapFromRef3d(Vector(ss[0],tt[1]),Coord::CANVAS,cropsl_); BBox bb(ll); bb.bound(lr); bb.bound(ur); bb.bound(ul); redrawNow(bb.expand(2)); } cropEnd = vv * Scale(zoom_).invert(); Vector diff = cropEnd-cropBegin; if (!which) cropsl_ = diff[0]+zparams->zmin; else cropsl_ = diff[0]+zparams->zmax; // this will be incorrect for multiple ext/file cubes double depth = keyContext->naxis(2); if (!which) { if (cropsl_<0) cropsl_ = 0; if (cropsl_>zparams->zmax-1) cropsl_ = zparams->zmax-1; } else { if (cropsl_zmin+1) cropsl_ = zparams->zmin+1; if (cropsl_>depth) cropsl_ = depth; } if (cropBegin[0]!=cropEnd[0] || cropBegin[1]!=cropEnd[1]) { keyContext->frScale.setScanMode(FrScale::CROPSEC); // params is a BBOX in DATA coords 0-n if (!which) keyContext->setCrop3dParams(int(cropsl_+.5),zparams->zmax); else keyContext->setCrop3dParams(zparams->zmin,int(cropsl_+.5)); // set current slice if needed // setSlice() IMAGE (ranges 1-n) // context->slice() IMAGE (ranges 1-n) // cropsl_ ranges coords 0-n double sl = keyContext->slice(2)-.5; if (!which) { if (sl<=cropsl_) setSlice(2,int(cropsl_+1.5)); } else { if (sl>cropsl_) setSlice(2,int(cropsl_)); } } else { keyContext->frScale.resetScanMode(); keyContext->setCrop3dParams(); FitsImage* sptr = keyContext->fits; while (sptr) { sptr->setCropParams(keyContext->frScale.datasec()); sptr = sptr->nextSlice(); } } keyContext->updateClip(); keyContext->updateContours(); updateColorScale(); update(MATRIX); updateMarkerCBs(&userMarkers); updateMarkerCBs(&catalogMarkers); updateMarkerCBs(&analysisMarkers); } void Frame3dBase::get3dBorderCmd() { if (border_) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Frame3dBase::get3dBorderColorCmd() { Tcl_AppendResult(interp, borderColorName_, NULL); } void Frame3dBase::get3dCompassCmd() { if (compass_) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Frame3dBase::get3dCompassColorCmd() { Tcl_AppendResult(interp, compassColorName_, NULL); } void Frame3dBase::get3dHighliteCmd() { if (highlite_) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Frame3dBase::get3dHighliteColorCmd() { Tcl_AppendResult(interp, highliteColorName_, NULL); } void Frame3dBase::get3dRenderMethodCmd() { ostringstream str; switch (renderMethod_) { case MIP: str << "mip" << ends; break; case AIP: str << "aip" << ends; break; } Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::get3dScaleCmd() { ostringstream str; str << zscale_ << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::get3dViewCmd() { ostringstream str; str << m180To180(radToDeg(az_)) << ' ' << m180To180(radToDeg(el_)) << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::get3dViewPointCmd() { ostringstream str; str << vp_ << viewCursor_ << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::get3dRenderBackgroundCmd() { switch (render_) { case NONE: Tcl_AppendResult(interp, "none", NULL); break; case AZIMUTH: Tcl_AppendResult(interp, "azimuth", NULL); break; case ELEVATION: Tcl_AppendResult(interp, "elevation", NULL); break; } } void Frame3dBase::getCursorCmd(Coord::InternalSystem sys) { Vector aa = Vector(options->width,options->height)/2.; Vector bb = mapToRef(aa,Coord::WIDGET); Vector cc = mapFromRef(bb,sys); printVector(cc, DEFAULT); } void Frame3dBase::getCursorCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Precision pp) { if (keyContext->fits) { Vector aa = Vector(options->width,options->height)/2.; Vector bb = mapToRef(aa,Coord::WIDGET); printFromRef(keyContext->fits, bb, sys, sky, format, pp); } else printVector(Vector(), DEFAULT); } void Frame3dBase::gridCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Grid::GridType type, const char* ops, const char* vars) { if (grid) delete grid; switch (type) { case Grid::ANALYSIS: grid = new Grid25d(this, sys, sky, format, type, ops, vars); break; case Grid::PUBLICATION: grid = new Grid3d(this, sys, sky, format, type, ops, vars); break; } update(PIXMAP); } void Frame3dBase::panCmd(const Vector& v1, const Vector& v2) { viewCursor_ -= (v1-v2)*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panCmd(const Vector& vv) { viewCursor_ -= vv*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!keyContext->fits) return; Vector cc = Vector(options->width,options->height)/2.; Vector dd = mapToRef(cc,Coord::WIDGET); Vector uu = keyContext->fits->mapFromRef(dd, sys, sky); uu += vv; Vector ee = keyContext->fits->mapToRef(uu, sys, sky); Vector ff = mapFromRef(ee,Coord::WIDGET); viewCursor_ += (cc-ff)*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panToCmd(const Vector& vv) { Vector dd = Vector(options->width,options->height)/2. - vv*canvasToWidget; viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panToCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!keyContext->fits) return; Vector aa = keyContext->fits->mapToRef(vv, sys, sky); Vector dd = Vector(options->width,options->height)/2. - mapFromRef(aa,Coord::WIDGET); viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panBBoxCmd(const Vector& vv) { // vv is center of panBBox in panner coordinate Vector aa = vv*pannerToWidget3d; Vector dd = Vector(options->width,options->height)/2. - aa; viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::panEndCmd(const Vector& vv) { if (panPM) Tk_FreePixmap(display, panPM); panPM = 0; Vector dd = vv*canvasToWidget - panCursor*canvasToWidget; viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); update(MATRIX); } void Frame3dBase::rotateBeginCmd() { // save the current rotation rotateRotation = rotation; } void Frame3dBase::rotateMotionCmd(double angle) { rotation = rotateRotation + angle; update(MATRIX); } void Frame3dBase::rotateEndCmd() { update(MATRIX); } void Frame3dBase::set3dBorderCmd(int hh) { border_ = hh; update(PIXMAP); } void Frame3dBase::set3dBorderColorCmd(const char* clr) { if (borderColorName_) delete [] borderColorName_; borderColorName_ = dupstr(clr); if (threedGC) XSetForeground(display, threedGC, getColor(borderColorName_)); update(PIXMAP); } void Frame3dBase::set3dCompassCmd(int hh) { compass_ = hh; update(PIXMAP); } void Frame3dBase::set3dCompassColorCmd(const char* clr) { if (compassColorName_) delete [] compassColorName_; compassColorName_ = dupstr(clr); if (threedGC) XSetForeground(display, threedGC, getColor(compassColorName_)); update(PIXMAP); } void Frame3dBase::set3dHighliteCmd(int hh) { highlite_ = hh; update(PIXMAP); } void Frame3dBase::set3dHighliteColorCmd(const char* clr) { if (highliteColorName_) delete [] highliteColorName_; highliteColorName_ = dupstr(clr); if (threedGC) XSetForeground(display, threedGC, getColor(highliteColorName_)); update(PIXMAP); } void Frame3dBase::set3dRenderMethodCmd(int m) { RenderMethod mm = (RenderMethod)m; if (mm!=renderMethod_) { renderMethod_ = mm; update(MATRIX); } } void Frame3dBase::set3dScaleCmd(double ss) { if (zscale_ == ss) return; zscale_ = ss; // just in case if pending az/el preservecache_ =0; update(MATRIX); } void Frame3dBase::set3dViewCmd(float az, float el) { az_ = degToRad(az); el_ = degToRad(el); preservecache_ =1; update(MATRIX); } void Frame3dBase::set3dViewPointCmd(const Vector3d& vv, const Vector& cc) { vp_ = vv; viewCursor_ = cc; update(MATRIX); } void Frame3dBase::set3dRenderBackgroundCmd(int which) { if (which != render_) { render_ = (MotionType)which; cancelDetach(); preservecache_ =1; update(BASE); } } void Frame3dBase::set3dPreserveCmd() { preservecache_ =1; } void Frame3dBase::zoomAboutCmd(const Vector& zz, const Vector& vv) { Vector dd = Vector(options->width,options->height)/2. - vv*canvasToWidget; viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); Vector az = ((Vector&)zz).abs(); zoom_[0] *= az[0]; zoom_[1] *= az[1]; update(MATRIX); } void Frame3dBase::zoomAboutCmd(const Vector& zz, const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!keyContext->fits) return; Vector aa = keyContext->fits->mapToRef(vv, sys, sky); Vector dd = Vector(options->width,options->height)/2. - mapFromRef(aa,Coord::WIDGET); viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); Vector az = ((Vector&)zz).abs(); zoom_[0] *= az[0]; zoom_[1] *= az[1]; update(MATRIX); } void Frame3dBase::zoomToAboutCmd(const Vector& zz, const Vector& vv) { Vector dd = Vector(options->width,options->height)/2. - vv*canvasToWidget; viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); zoom_ = ((Vector&)zz).abs(); update(MATRIX); } void Frame3dBase::zoomToAboutCmd(const Vector& zz, const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!keyContext->fits) return; Vector aa = keyContext->fits->mapToRef(vv, sys, sky); Vector dd = Vector(options->width,options->height)/2. - mapFromRef(aa,Coord::WIDGET); viewCursor_ += dd*Scale(1/zoom_[0],1/zoom_[1]); zoom_ = ((Vector&)zz).abs(); update(MATRIX); } void Frame3dBase::zoomToFitCmd(double ss) { if (!keyContext->fits) return; centerImage(); Vector3d tt = imageSize3d(keyContext->frScale.scanMode()); double zz = calcZoom3d(tt,Vector(options->width,options->height)) * ss; zoom_ = Vector(zz,zz); update(MATRIX); } saods9/tksao1.0/frame/fr3dmap.C000644 000765 000000 00000004436 12537642733 016501 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "frame3dbase.h" #include "fitsimage.h" Vector3d Frame3dBase::mapFromRef3d(const Vector& vv, Coord::InternalSystem sys) { // context->slice() IMAGE (ranges 1-n) double sl = keyContext->slice(2)-.5; return mapFromRef3d(vv,sys,sl); } Vector3d Frame3dBase::mapFromRef3d(const Vector& vv, Coord::InternalSystem sys, double sl) { // note: sl is in REF=DATA coordinates Matrix3d mm; switch (sys) { case Coord::REF: return Vector3d(vv,sl); case Coord::USER: mm = refToUser3d; break; case Coord::WIDGET: mm = refToWidget3d; break; case Coord::CANVAS: mm = refToCanvas3d; break; case Coord::WINDOW: mm = refToWindow3d; break; case Coord::PANNER: mm = refToPanner3d; break; case Coord::MAGNIFIER: mm = refToMagnifier3d; break; default: // na break; } return Vector3d(vv,sl)*mm; } Vector3d Frame3dBase::mapToRef3d(const Vector& vv, Coord::InternalSystem sys) { // context->slice() IMAGE (ranges 1-n) double sl = keyContext->slice(2)-.5; return mapToRef3d(vv,sys,sl); } Vector3d Frame3dBase::mapToRef3d(const Vector& vv, Coord::InternalSystem sys, double sl) { switch (sys) { case Coord::REF: return Vector3d(vv,sl); case Coord::USER: return Vector3d(vv,sl)*userToRef3d; default: break; } // note: sl is in REF=DATA coordinates Vector3d xx = Vector3d(1,0,sl)*refToWidget3d; Vector3d yy = Vector3d(0,1,sl)*refToWidget3d; Vector3d zz = Vector3d(0,0,sl)*refToWidget3d; Vector3d ii=xx-zz; Vector3d jj=yy-zz; Vector3d nn = cross(jj,ii).normalize(); double& a = nn[0]; double& b = nn[1]; double& c = nn[2]; double d = -a*xx[0] -b*xx[1] -c*xx[2]; Vector ww; switch (sys) { case Coord::WIDGET: ww = vv; break; case Coord::CANVAS: ww = vv*canvasToWidget; break; case Coord::WINDOW: ww = vv*windowToWidget; break; case Coord::PANNER: ww = vv*pannerToWidget; break; case Coord::MAGNIFIER: ww = vv*magnifierToWidget; break; default: // na break; } double z = (-a*ww[0] -b*ww[1] -d)/c; return Vector3d(ww,z)*widgetToRef3d; } saods9/tksao1.0/frame/frame.C000644 000765 000000 00000020655 12621204750 016223 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame.h" #include "fitsimage.h" #include "ps.h" #include "sigbus.h" // Frame Member Functions Frame::Frame(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item) { context = new Context(); context->parent(this); currentContext = context; keyContext = context; keyContextSet =1; cmapID = 1; bias = 0.5; contrast = 1.0; colorCount = 0; colorScale = NULL; colorCells = NULL; indexCells = NULL; } Frame::~Frame() { if (context) delete context; if (colorScale) delete colorScale; if (colorCells) delete [] colorCells; if (indexCells) delete [] indexCells; } unsigned char* Frame::fillImage(int width, int height, Coord::InternalSystem sys) { // img unsigned char* img = new unsigned char[width*height*3]; { unsigned char* ptr = img; for (int jj=0; jjred; *ptr++ = (unsigned char)bgColor->green; *ptr++ = (unsigned char)bgColor->blue; } } if (!context->cfits) return img; // basics int length = colorScale->size() - 1; const unsigned char* table = colorScale->psColors(); FitsImage* sptr = context->cfits; int mosaic = isMosaic(); // variable double* mm = sptr->matrixToData(sys).mm(); FitsBound* params = sptr->getDataParams(context->frScale.scanMode()); int srcw = sptr->width(); double ll = sptr->low(); double hh = sptr->high(); double diff = hh - ll; // main loop unsigned char* dest = img; SETSIGBUS for (long jj=0; jjcfits; mm = sptr->matrixToData(sys).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { double value = sptr->getValueDouble(long(yy)*srcw + long(xx)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) { *(dest+2) = table[0]; *(dest+1) = table[1]; *dest = table[2]; } else if (value >= hh) { *(dest+2) = table[length*3]; *(dest+1) = table[length*3+1]; *dest = table[length*3+2]; } else { int l = (int)(((value - ll)/diff * length) + .5); *(dest+2) = table[l*3]; *(dest+1) = table[l*3+1]; *dest = table[l*3+2]; } } else { *(dest+2) = nanColor->blue; *(dest+1) = nanColor->green; *dest = nanColor->red; } break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(sys).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } } } } while (mosaic && sptr); } } CLEARSIGBUS return img; } int Frame::isIIS() { return context->cfits && context->cfits->isIIS(); } void Frame::reset() { cmapID = 1; bias = 0.5; contrast = 1.0; context->frScale.resetScanMode(); context->updateClip(); Base::reset(); } void Frame::updateColorCells(unsigned short* index, unsigned char* cells, int cnt) { // the colorbar widget will pass us a pointer to the indexCells colorCount = cnt; if (indexCells) delete [] indexCells; indexCells = new unsigned short[cnt]; if (!indexCells) { internalError("Unable to Alloc indexCells"); return; } memcpy(indexCells, index, cnt*sizeof(unsigned short)); // copy the rgb vales to the colorCells array (for postscript printing) if (colorCells) delete [] colorCells; colorCells = new unsigned char[cnt*3]; if (!colorCells) { internalError("Unable to Alloc colorCells"); return; } memcpy(colorCells, cells, cnt*3); } void Frame::unloadFits() { if (DebugPerf) cerr << "Frame::unloadFits()" << endl; // clean up from iis if needed if (isIIS()) { context->frScale.setClipMode(FrScale::MINMAX); context->frScale.setMMMode(FrScale::SCAN); context->frScale.setULow(DEFAULTLOW); context->frScale.setUHigh(DEFAULTHIGH); context->frScale.setColorScaleType(FrScale::LINEARSCALE); } context->unload(); FrameBase::unloadFits(); } // Commands void Frame::getColorbarCmd() { ostringstream str; str << cmapID << ' ' << bias << ' ' << contrast << ' ' << invert << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame::getRGBChannelCmd() { Tcl_AppendResult(interp, "red", NULL); } void Frame::getRGBViewCmd() { Tcl_AppendResult(interp, "1 1 1", NULL); } void Frame::getRGBSystemCmd() { Tcl_AppendResult(interp, "image", NULL); } void Frame::getTypeCmd() { Tcl_AppendResult(interp, "base", NULL); } void Frame::iisCmd(int width, int height) { unloadAllFits(); context->frScale.setClipMode(FrScale::USERCLIP); context->frScale.setMMMode(FrScale::SCAN); context->frScale.setULow(0); context->frScale.setUHigh(IISSIZE); context->frScale.setColorScaleType(FrScale::IISSCALE); FitsImage* img = new FitsImageIIS(currentContext, interp, width, height); loadDone(currentContext->load(ALLOC, "", img, IMG),IMG); } void Frame::iisEraseCmd() { if (context->cfits) ((FitsImageIIS*)context->cfits)->iisErase(); } void Frame::iisGetCmd(char* dest, int xx, int yy, int dx, int dy) { if (context->cfits) { char* buf = ((FitsImageIIS*)context->cfits)->iisGet(xx,yy,dx,dy); memcpy(dest, buf, dx*dy); delete [] buf; } } void Frame::iisSetCmd(const char* src, int xx, int yy, int dx, int dy) { if (context->cfits) ((FitsImageIIS*)context->cfits)->iisSet(src, xx, yy, dx, dy); } void Frame::iisWCSCmd(const Matrix& mx, const Vector& z, int zt) { if (context->cfits) ((FitsImageIIS*)context->cfits)->iisWCS(mx, z, zt); } void Frame::savePhotoCmd(const char* ph) { FitsImage* fits = currentContext->cfits; if (!fits) return; // basics int length = colorScale->size() - 1; const unsigned char* table = colorScale->psColors(); // variable FitsBound* params = fits->getDataParams(context->frScale.scanMode()); double ll = fits->low(); double hh = fits->high(); double diff = hh - ll; int width = params->xmax - params->xmin; int height = params->ymax - params->ymin; // photo if (*ph == '\0') { Tcl_AppendResult(interp, "bad image name ", NULL); return; } Tk_PhotoHandle photo = Tk_FindPhoto(interp, ph); if (!photo) { Tcl_AppendResult(interp, "bad image handle ", NULL); return; } if (Tk_PhotoSetSize(interp, photo, width, height) != TCL_OK) { Tcl_AppendResult(interp, "bad photo set size ", NULL); return; } Tk_PhotoBlank(photo); Tk_PhotoImageBlock block; if (!Tk_PhotoGetImage(photo,&block)) { Tcl_AppendResult(interp, "bad image block ", NULL); return; } if (block.pixelSize<4) { Tcl_AppendResult(interp, "bad pixel size ", NULL); return; } // main loop SETSIGBUS unsigned char* dest = block.pixelPtr; for (long jj=params->ymax-1; jj>=params->ymin; jj--) { for (long ii=params->xmin; iixmax; ii++, dest += block.pixelSize) { double value = fits->getValueDouble(Vector(ii,jj)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) { *(dest+block.offset[0]) = table[2]; *(dest+block.offset[1]) = table[1]; *(dest+block.offset[2]) = table[0]; *(dest+block.offset[3]) = 255; } else if (value >= hh) { *(dest+block.offset[0]) = table[length*3+2]; *(dest+block.offset[1]) = table[length*3+1]; *(dest+block.offset[2]) = table[length*3]; *(dest+block.offset[3]) = 255; } else { int l = (int)(((value - ll)/diff * length) + .5); *(dest+block.offset[0]) = table[l*3+2]; *(dest+block.offset[1]) = table[l*3+1]; *(dest+block.offset[2]) = table[l*3]; *(dest+block.offset[3]) = 255; } } else { *(dest+block.offset[0]) = nanColor->red; *(dest+block.offset[1]) = nanColor->green; *(dest+block.offset[2]) = nanColor->blue; *(dest+block.offset[3]) = 255; } } } CLEARSIGBUS if (Tk_PhotoPutBlock(interp, photo, &block, 0, 0, width, height, TK_PHOTO_COMPOSITE_SET) != TCL_OK) { Tcl_AppendResult(interp, "bad put block ", NULL); return; } } saods9/tksao1.0/frame/frame.h000644 000765 000000 00000002711 12464214756 016275 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame_h__ #define __frame_h__ #include "context.h" #include "framebase.h" #include "colorscale.h" // Frame class Frame : public virtual FrameBase { protected: int cmapID; // current colormap id float bias; // current colormap bias float contrast; // current colormap contrast int colorCount; // number of dynamic colors ColorScale* colorScale; // current color scale unsigned char* colorCells; // current color values unsigned short* indexCells; // current color indices private: int isIIS(); void reset(); void setKeyFits() {} void unloadFits(); protected: int isFrame() {return 1;} unsigned char* fillImage(int width, int height, Coord::InternalSystem); int validColorScale() {return colorScale ? 1 : 0;} void updateColorCells(unsigned short*, unsigned char*, int); public: Frame(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Frame(); void getColorbarCmd(); void getRGBChannelCmd(); void getRGBViewCmd(); void getRGBSystemCmd(); void getTypeCmd(); void iisCmd(int, int); void iisEraseCmd(); void iisGetCmd(char*, int, int, int, int); void iisSetCmd(const char*, int, int, int, int); void iisWCSCmd(const Matrix&, const Vector&, int); void savePhotoCmd(const char*); }; #endif saods9/tksao1.0/frame/frame3d.C000644 000765 000000 00000056725 12620173717 016470 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3d.h" #include "fitsimage.h" #include "ps.h" #include "sigbus.h" #include void render3dTimer(void* ptr) { int rr = ((Frame3d*)ptr)->processDetach(); if (rr) { Tcl_TimerToken tt = Tcl_CreateTimerHandler(125,render3dTimer,ptr); ((Frame3d*)ptr)->setTimer(tt); } else ((Frame3d*)ptr)->setTimer(0); } Frame3d::Frame3d(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i,c,item) { context = new Context(); context->parent(this); currentContext = context; keyContext = context; keyContextSet =1; cmapID = 1; bias = 0.5; contrast = 1.0; colorCount = 0; colorScale = NULL; colorCells = NULL; indexCells = NULL; thread_ =NULL; targ_ =NULL; status_ = 0; nrays_ =0; xid_ =NULL; yid_ =NULL; timer_ =0; rt_ =NULL; rtb_ =NULL; rtbcnt_ = 0; // scope is alway global keyContext->frScale.setClipScope(FrScale::GLOBAL); } Frame3d::~Frame3d() { if (context) delete context; if (colorScale) delete colorScale; if (colorCells) delete [] colorCells; if (indexCells) delete [] indexCells; if (thread_) delete [] thread_; if (targ_) delete [] targ_; if (xid_) delete [] xid_; if (yid_) delete [] yid_; if (rt_) delete rt_; if (rtb_) delete rtb_; } unsigned char* Frame3d::fillImage(int width, int height, Coord::InternalSystem sys) { float* zbuf =NULL; unsigned char* mkzbuf =NULL; unsigned char* img =NULL; switch (sys) { case Coord::WIDGET: if (syncUpdate) { if (!fillImageJoin(width, height, sys, &zbuf, &mkzbuf)) return NULL; img = fillImageColor(width, height, zbuf, mkzbuf); } else { if (!rt_) { // next see if we can find it in the cache RayTrace* ptr = findInCache(az_, el_); if (ptr) { // good, color it img = fillImageColor(width, height, ptr->zbuf(), ptr->mkzbuf()); // start background switch (render_) { case NONE: break; case AZIMUTH: case ELEVATION: if (timer_) { if (!status_) status_ = 2; } else { status_ = 2; render3dTimer(this); } break; } } else { // just in case if (thread_) cancelDetach(); rt_ = new RayTrace(az_,el_); // are we very small? BBox3d bb = imageBounds(width, height, context->fits->matrixToData3d(sys)); double vol = (bb.ur-bb.ll).volume(); if (vol < 2e7) { // yes, just do it if (!fillImageJoin(width, height, sys, &rt_->zbuf_, &rt_->mkzbuf_)) return NULL; img = fillImageColor(width, height, rt_->zbuf(), rt_->mkzbuf()); // cache cacheIt(&rt_); // start background switch (render_) { case NONE: break; case AZIMUTH: case ELEVATION: status_ = 2; if (!timer_) render3dTimer(this); break; } } else { // ok, start the build process if (!fillImageDetach(az_, el_, &rt_->zbuf_, &rt_->mkzbuf_)) return NULL; img = fillImageColor(width, height, rt_->zbuf(), rt_->mkzbuf()); // start primary status_ = 1; if (!timer_) render3dTimer(this); } } } else { // yep, show what we have so far img = fillImageColor(width, height, rt_->zbuf(), rt_->mkzbuf()); } } break; case Coord::PANNER: case Coord::MAGNIFIER: case Coord::PS: if (!fillImageJoin(width, height, sys, &zbuf, &mkzbuf)) return NULL; img = fillImageColor(width, height, zbuf, mkzbuf); break; default: // na break; } if (zbuf) delete [] zbuf; if (mkzbuf) delete [] mkzbuf; return img; } void* raytrace(void* arg) { t_arg* targ = (t_arg*)arg; Frame3dBase::RenderMethod renderMethod = targ->renderMethod; int width = targ->width; float* zbuf = targ->zbuf; unsigned char* mkzbuf = targ->mkzbuf; Context* context = targ->context; int* xid = targ->xid; int* yid = targ->yid; int start = targ->start; int stop = targ->stop; int zstart = targ->zstart; int zstop = targ->zstop; // this will be incorrect for multiple ext/file cubes int srcd = context->naxis(2); double* mm = targ->matrix.mm(); FitsImage* ptr = context->fits; // if more than 3 axes, walk it forward int num = context->calcSlice(); for (int ii=1; iinextSlice(); // slice jump vector FitsImage* sjv[srcd]; FitsImage* sptr = ptr; int ii=0; while (sptr) { sjv[ii++] = sptr; if (sptr) sptr = sptr->nextSlice(); } FitsBound* params = context->fits->getDataParams(context->frScale.scanMode()); FitsZBound* zparams = context->getDataParams(context->frScale.scanMode()); int srcw = context->fits->width(); targ->rays =0; for (int ll=start; ll<=stop; ll++, targ->rays++) { int& jj = yid[ll]; int& ii = xid[ll]; double ii0 = ii*mm[0]; double ii1 = ii*mm[1]; double ii2 = ii*mm[2]; double jj4 = jj*mm[4]; double jj5 = jj*mm[5]; double jj6 = jj*mm[6]; int cnt=0; float acc=0; float max = -FLT_MAX; int kks = zstart; int kkt = zstop; // good abort point if (targ->abort) { targ->done =1; return 0; } int inside =0; for (int kk=kks; kk=params->xmin && xxxmax && yy>=params->ymin && yyymax && zz>=zparams->zmin && zzzmax) { float value = sjv[int(zz)]->getValueDouble(long(yy)*srcw+long(xx)); inside =1; // ignore nan if (isfinite(value)) { if (value>max) max = value; cnt++; acc+=value; } } else { // early determination if (inside) break; } } if (cnt) { float* dest = zbuf + jj*width + ii; unsigned char* mkdest = mkzbuf + jj*width + ii; switch (renderMethod) { case Frame3dBase::MIP: *dest =max; break; case Frame3dBase::AIP: *dest =acc/cnt; break; } *mkdest=1; } } targ->done=1; return NULL; } int Frame3d::fillImageJoin(int width, int height, Coord::InternalSystem sys, float** zbuf, unsigned char** mkzbuf) { *zbuf = new float[width*height]; if (!(*zbuf)) { internalError("fillImageJoin Error"); return 0; } memset(*zbuf, 0, width*height*sizeof(float)); *mkzbuf = new unsigned char[width*height]; if (!(*mkzbuf)) { internalError("fillImageJoin Error"); return 0; } memset(*mkzbuf, 0, width*height); Matrix3d mm = context->fits->matrixToData3d(sys); BBox3d bb = imageBounds(width,height,mm); int ww = bb.ur[0]-bb.ll[0]; int hh = bb.ur[1]-bb.ll[1]; // local var overide int nrays = ww*hh; float incr = nrays/nthreads_; int* xid = new int[nrays]; int* yid = new int[nrays]; int x=bb.ll[0]+.5; // don't know why; int y=bb.ll[1]+.5; // don't know why // init array for (int jj=0; jjwidth; int& height = options->height; *zbuf = new float[width*height]; if (!(*zbuf)) { internalError("fillImageDetach Error"); return 0; } memset(*zbuf, 0, width*height*sizeof(float)); *mkzbuf = new unsigned char[width*height]; if (!(*mkzbuf)) { internalError("fillImageDetach Error"); return 0; } memset(*mkzbuf, 0, width*height); Matrix3d userToWidget3d = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az) * RotateX3d(el) * Translate3d(viewCursor_) * Scale3d(zoom_, zzoom_) * // must be int to align with screen pixels Translate3d((int)(options->width/2.), (int)(options->height/2.), (int)(zdepth_/2.)); Matrix3d refToWidget3d = refToUser3d * userToWidget3d; Matrix3d mm = (context->fits->dataToRef3d * refToWidget3d).invert(); BBox3d bb = imageBounds(width,height,mm); int ww = bb.ur[0]-bb.ll[0]; int hh = bb.ur[1]-bb.ll[1]; nrays_ = ww*hh; float incr = nrays_/nthreads_; if (xid_) delete [] xid_; xid_ = new int[nrays_]; if (yid_) delete [] yid_; yid_ = new int[nrays_]; int x=bb.ll[0]+.5; // don't know why int y=bb.ll[1]+.5; // don't know why // init array for (int jj=0; jj0; kk--) { int ll = rand() % (kk+1); // 0 <= ll <= kk if (ll!=kk) { int tx = xid_[kk]; int ty = yid_[kk]; xid_[kk]=xid_[ll]; yid_[kk]=yid_[ll]; xid_[ll]=tx; yid_[ll]=ty; } } // init threads thread_ = new pthread_t[nthreads_]; targ_ = new t_arg[nthreads_]; for (int ii=0; ii= max) { RayTrace* ptr = cache_.fifo(); if (ptr) delete ptr; } } else { if (*rt) delete *rt; } *rt =NULL; } void Frame3d::cancelDetach() { // this will only be called for fillImageDetach() // abort any threads if (thread_) { // set cancel flag for (int ii=0; ii180) org = org-360; int cnt =1; while (!((org+cnt)>180 && (org-cnt)<-180)) { if ((org+cnt)<=180) if (bkgDetach(degToRad(org+cnt),el_)) return 1; if ((org-cnt)>=-180) if (bkgDetach(degToRad(org-cnt),el_)) return 1; cnt++; } } break; case ELEVATION: { int org = floor(radToDeg(el_)); if (org>180) org = org-360; int cnt =1; while (!((org+cnt)>90 && (org-cnt)<-90)) { if ((org+cnt)<=90) if (bkgDetach(az_,degToRad(org+cnt))) return 1; if ((org-cnt)>=-90) if (bkgDetach(az_,degToRad(org-cnt))) return 1; cnt++; } } break; } status_ = 0; return 1; } case 3: // process background { // anything running? // should not see this if (!thread_) { status_ = 0; return 1; } // we done yet? int sum=0; for (int ii=0; iiaz(), rtb_->el(), &rtb_->zbuf_, &rtb_->mkzbuf_); status_ =3; return 1; } rtbcnt_++; return 0; } unsigned char* Frame3d::fillImageColor(int width, int height, float* zbuf, unsigned char* mkzbuf) { unsigned char* img = new unsigned char[width*height*3]; if (!img) return NULL; memset(img, 0, width*height*3); int length = colorScale->size() - 1; const unsigned char* table = colorScale->psColors(); double ll = keyContext->fits->low(); double hh = keyContext->fits->high(); double diff = hh - ll; register unsigned char red = (unsigned char)bgColor->red; register unsigned char green = (unsigned char)bgColor->green; register unsigned char blue = (unsigned char)bgColor->blue; unsigned char* dest = img; float* src = zbuf; unsigned char* mksrc = mkzbuf; for (int jj=0; jj= hh) { *(dest+2) = table[length*3]; *(dest+1) = table[length*3+1]; *dest = table[length*3+2]; } else { int l = (int)(((value - ll)/diff * length) + .5); *(dest+2) = table[l*3]; *(dest+1) = table[l*3+1]; *dest = table[l*3+2]; } } } } } return img; } RayTrace* Frame3d::findInCache(double az, double el) { double rr = degToRad(.5); RayTrace* ptr = cache_.head(); while (ptr) { double raz = ptr->az()-az; double rel = ptr->el()-el; if ((raz*raz + rel*rel) < rr*rr) return ptr; ptr=ptr->next(); } return NULL; } BBox3d Frame3d::imageBounds(int width, int height, Matrix3d mm) { Matrix3d mx = mm.invert() * Translate3d(.5,.5,.5); FitsBound* params = keyContext->fits->getDataParams(keyContext->frScale.scanMode()); FitsZBound* zparams = keyContext->getDataParams(keyContext->frScale.scanMode()); int& xmin = params->xmin; int& xmax = params->xmax; int& ymin = params->ymin; int& ymax = params->ymax; int& zmin = zparams->zmin; int& zmax = zparams->zmax; Vector3d llf = Vector3d(xmin,ymin,zmin) * mx; Vector3d lrf = Vector3d(xmax,ymin,zmin) * mx; Vector3d urf = Vector3d(xmax,ymax,zmin) * mx; Vector3d ulf = Vector3d(xmin,ymax,zmin) * mx; Vector3d llb = Vector3d(xmin,ymin,zmax) * mx; Vector3d lrb = Vector3d(xmax,ymin,zmax) * mx; Vector3d urb = Vector3d(xmax,ymax,zmax) * mx; Vector3d ulb = Vector3d(xmin,ymax,zmax) * mx; BBox3d bb(llf); bb.bound(lrf); bb.bound(urf); bb.bound(ulf); bb.bound(llb); bb.bound(lrb); bb.bound(urb); bb.bound(ulb); bb.clip(Vector3d(width,height,zdepth_)); return bb; } void Frame3d::reset() { cmapID = 1; bias = 0.5; contrast = 1.0; keyContext->frScale.resetScanMode(); keyContext->updateClip(); Base::reset(); } void Frame3d::updateColorCells(unsigned short* index, unsigned char* cells, int cnt) { // the colorbar widget will pass us a pointer to the indexCells colorCount = cnt; if (indexCells) delete [] indexCells; indexCells = new unsigned short[cnt]; if (!indexCells) { internalError("Unable to Alloc indexCells"); return; } memcpy(indexCells, index, cnt*sizeof(unsigned short)); // copy the rgb vales to the colorCells array (for postscript printing) if (colorCells) delete [] colorCells; colorCells = new unsigned char[cnt*3]; if (!colorCells) { internalError("Unable to Alloc colorCells"); return; } memcpy(colorCells, cells, cnt*3); } void Frame3d::pushMatrices() { Base::pushMatrices(); FitsImage* ptr = keyContext->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMatrices(refToUser3d, userToWidget3d, widgetToCanvas3d, canvasToWindow3d); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Frame3d::pushPannerMatrices() { Base::pushPannerMatrices(); FitsImage* ptr = keyContext->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updatePannerMatrices(refToPanner3d); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Frame3d::pushMagnifierMatrices() { Base::pushMagnifierMatrices(); FitsImage* ptr = keyContext->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMagnifierMatrices(refToMagnifier3d); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Frame3d::pushPSMatrices(float scale, int width, int height) { Base::pushPSMatrices(scale, width, height); Matrix3d mx = psMatrix(scale, width, height); FitsImage* ptr = keyContext->fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updatePS(mx); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } void Frame3d::unloadFits() { if (DebugPerf) cerr << "Frame3d::unloadFits()" << endl; // kill any active threads cancelDetach(); keyContext->unload(); Base::unloadFits(); } // Commands void Frame3d::getColorbarCmd() { ostringstream str; str << cmapID << ' ' << bias << ' ' << contrast << ' ' << invert << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3d::getRGBChannelCmd() { Tcl_AppendResult(interp, "red", NULL); } void Frame3d::getRGBViewCmd() { Tcl_AppendResult(interp, "1 1 1", NULL); } void Frame3d::getRGBSystemCmd() { Tcl_AppendResult(interp, "image", NULL); } void Frame3d::getTypeCmd() { Tcl_AppendResult(interp, "3d", NULL); } void Frame3d::savePhotoCmd(const char* ph) { FitsImage* fits = currentContext->cfits; if (!fits) return; // basics int length = colorScale->size() - 1; const unsigned char* table = colorScale->psColors(); // variable FitsBound* params = fits->getDataParams(context->frScale.scanMode()); double ll = fits->low(); double hh = fits->high(); double diff = hh - ll; int width = params->xmax - params->xmin; int height = params->ymax - params->ymin; // photo if (*ph == '\0') { Tcl_AppendResult(interp, "bad image name ", NULL); return; } Tk_PhotoHandle photo = Tk_FindPhoto(interp, ph); if (!photo) { Tcl_AppendResult(interp, "bad image handle ", NULL); return; } if (Tk_PhotoSetSize(interp, photo, width, height) != TCL_OK) { Tcl_AppendResult(interp, "bad photo set size ", NULL); return; } Tk_PhotoBlank(photo); Tk_PhotoImageBlock block; if (!Tk_PhotoGetImage(photo,&block)) { Tcl_AppendResult(interp, "bad image block ", NULL); return; } if (block.pixelSize<4) { Tcl_AppendResult(interp, "bad pixel size ", NULL); return; } // main loop SETSIGBUS unsigned char* dest = block.pixelPtr; for (long jj=params->ymax-1; jj>=params->ymin; jj--) { for (long ii=params->xmin; iixmax; ii++, dest += block.pixelSize) { double value = fits->getValueDouble(Vector(ii,jj)); if (isfinite(value)) { if (value <= ll) { *(dest+block.offset[0]) = table[2]; *(dest+block.offset[1]) = table[1]; *(dest+block.offset[2]) = table[0]; *(dest+block.offset[3]) = 255; } else if (value >= hh) { *(dest+block.offset[0]) = table[length*3+2]; *(dest+block.offset[1]) = table[length*3+1]; *(dest+block.offset[2]) = table[length*3]; *(dest+block.offset[3]) = 255; } else { int l = (int)(((value - ll)/diff * length) + .5); *(dest+block.offset[0]) = table[l*3+2]; *(dest+block.offset[1]) = table[l*3+1]; *(dest+block.offset[2]) = table[l*3]; *(dest+block.offset[3]) = 255; } } else { *(dest+block.offset[0]) = nanColor->red; *(dest+block.offset[1]) = nanColor->green; *(dest+block.offset[2]) = nanColor->blue; *(dest+block.offset[3]) = 255; } } } CLEARSIGBUS if (Tk_PhotoPutBlock(interp, photo, &block, 0, 0, width, height, TK_PHOTO_COMPOSITE_SET) != TCL_OK) { Tcl_AppendResult(interp, "bad put block ", NULL); return; } } saods9/tksao1.0/frame/frame3d.h000644 000765 000000 00000004405 12605541734 016522 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3d_h__ #define __frame3d_h__ #include "context.h" #include "frame3dbase.h" #include "colorscale.h" typedef struct { Frame3dBase::RenderMethod renderMethod; int width; float* zbuf; unsigned char* mkzbuf; Context* context; Matrix3d matrix; int* xid; int* yid; int start; int stop; int zstart; int zstop; int rays; int abort; int done; } t_arg; class Frame3d : public virtual Frame3dBase { protected: int cmapID; // current colormap id float bias; // current colormap bias float contrast; // current colormap contrast int colorCount; // number of dynamic colors ColorScale* colorScale; // current color scale unsigned char* colorCells; // current color values unsigned short* indexCells; // current color indices pthread_t* thread_; int status_; t_arg* targ_; int nrays_; int* xid_; int* yid_; Tcl_TimerToken timer_; RayTrace* rt_; RayTrace* rtb_; int rtbcnt_; private: void cancelDetach(); BBox3d imageBounds(int, int, Matrix3d); int fillImageJoin(int, int, Coord::InternalSystem, float**, unsigned char**); int fillImageDetach(float, float, float**, unsigned char**); unsigned char* fillImageColor(int, int, float*, unsigned char*); RayTrace* findInCache(double, double); void cacheIt(RayTrace**); void reset(); void setKeyFits() {} void pushMatrices(); void pushMagnifierMatrices(); void pushPannerMatrices(); void pushPSMatrices(float, int, int); void unloadFits(); int bkgDetach(double az, double el); protected: int isFrame3d() {return 1;} unsigned char* fillImage(int width, int height, Coord::InternalSystem); void updateColorCells(unsigned short*, unsigned char*, int); int validColorScale() {return colorScale ? 1 : 0;} public: Frame3d(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Frame3d(); void setTimer(Tcl_TimerToken tt) {timer_ = tt;} int processDetach(); void getColorbarCmd(); void getRGBChannelCmd(); void getRGBSystemCmd(); void getRGBViewCmd(); void getTypeCmd(); void savePhotoCmd(const char*); }; #endif saods9/tksao1.0/frame/frame3dbase.C000644 000765 000000 00000075016 12616470455 017321 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "frame3dbase.h" #include "fitsimage.h" #include "marker.h" #include "context.h" #include "ps.h" #include "sigbus.h" Frame3dBase::Frame3dBase(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Base(i, c, item) { zdepth_ =100000; zzoom_ =1; zscale_ =1; az_ =0; el_ =0; renderMethod_ = MIP; preservecache_ =0; render_ =NONE; threedGC = NULL; border_ =0; borderColorName_ = dupstr("blue"); compass_ =0; compassColorName_ = dupstr("green"); highlite_ =1; highliteColorName_ = dupstr("cyan"); cropsl_ =0; imageToData3d = Translate3d(-.5, -.5, -.5); dataToImage3d = Translate3d( .5, .5, .5); } Frame3dBase::~Frame3dBase() { if (threedGC) XFreeGC(display, threedGC); if (borderColorName_) delete [] borderColorName_; if (compassColorName_) delete [] compassColorName_; if (highliteColorName_) delete [] highliteColorName_; cache_.deleteAll(); } void Frame3dBase::calcBorder(Coord::InternalSystem sys, FrScale::ScanMode mode, Vector3d* vv, int* dd) { if (!keyContext->fits) return; FitsBound* params = keyContext->fits->getDataParams(mode); FitsZBound* zparams = keyContext->getDataParams(mode); Vector3d llf(params->xmin,params->ymin,zparams->zmin); Vector3d lrf(params->xmax,params->ymin,zparams->zmin); Vector3d urf(params->xmax,params->ymax,zparams->zmin); Vector3d ulf(params->xmin,params->ymax,zparams->zmin); Vector3d llb(params->xmin,params->ymin,zparams->zmax); Vector3d lrb(params->xmax,params->ymin,zparams->zmax); Vector3d urb(params->xmax,params->ymax,zparams->zmax); Vector3d ulb(params->xmin,params->ymax,zparams->zmax); Matrix3d& mm = keyContext->fits->matrixFromData3d(sys); vv[0] = llf * mm; vv[1] = lrf * mm; vv[2] = urf * mm; vv[3] = ulf * mm; vv[4] = llb * mm; vv[5] = lrb * mm; vv[6] = urb * mm; vv[7] = ulb * mm; // init for dash for (int ii=0; ii<12; ii++) dd[ii] =1; // front { Vector3d aa = vv[1]-vv[0]; Vector3d cc = vv[3]-vv[0]; Vector3d ff = cross(aa,cc); for (int ii=0; ii<4; ii++) dd[ii] &= ff[2]>0; } // right { Vector3d aa = vv[5]-vv[1]; Vector3d cc = vv[2]-vv[1]; Vector3d ff = cross(aa,cc); int ww = ff[2]>0; dd[1] &= ww; dd[9] &= ww; dd[5] &= ww; dd[10] &= ww; } // top { Vector3d aa = vv[6]-vv[2]; Vector3d cc = vv[3]-vv[2]; Vector3d ff = cross(aa,cc); int ww = ff[2]>0; dd[2] &= ww; dd[10] &= ww; dd[6] &= ww; dd[11] &= ww; } // left { Vector3d aa = vv[7]-vv[3]; Vector3d cc = vv[0]-vv[3]; Vector3d ff = cross(aa,cc); int ww = ff[2]>0; dd[3] &= ww; dd[8] &= ww; dd[7] &= ww; dd[11] &= ww; } // bottom { Vector3d aa = vv[4]-vv[0]; Vector3d cc = vv[1]-vv[0]; Vector3d ff = cross(aa,cc); int ww = ff[2]>0; dd[0] &= ww; dd[9] &= ww; dd[4] &= ww; dd[8] &= ww; } // back { Vector3d aa = vv[4]-vv[5]; Vector3d cc = vv[6]-vv[5]; Vector3d ff = cross(aa,cc); for (int ii=4; ii<8; ii++) dd[ii] &= ff[2]>0; } } void Frame3dBase::calcHighlite(Coord::InternalSystem sys, Vector* vv, int* rr) { if (!keyContext->fits) return; FitsBound* params = keyContext->fits->getDataParams(keyContext->frScale.scanMode()); Vector ss(params->xmin,params->ymin); Vector tt(params->xmax,params->ymax); Vector ll = mapFromRef3d(ss,sys); Vector lr = mapFromRef3d(Vector(tt[0],ss[1]),sys); Vector ur = mapFromRef3d(tt,sys); Vector ul = mapFromRef3d(Vector(ss[0],tt[1]),sys); // context->slice() IMAGE (ranges 1-n) double sl = keyContext->slice(2)-.5; Vector3d ll1 = mapFromRef3d(ss,sys); Vector3d lr1 = mapFromRef3d(Vector(tt[0],ss[1]),sys); Vector3d ur1 = mapFromRef3d(tt,sys); Vector3d ul1 = mapFromRef3d(Vector3d(ss[0],tt[1]),sys); Vector3d ll0 = mapFromRef3d(ss,sys,sl-1); Vector3d lr0 = mapFromRef3d(Vector3d(tt[0],ss[1]),sys,sl-1); Vector3d ur0 = mapFromRef3d(tt,sys,sl-1); Vector3d ul0 = mapFromRef3d(Vector3d(ss[0],tt[1]),sys,sl-1); Vector3d aa1 = (ll0-ll1).normalize(); Vector3d aa2 = (lr0-lr1).normalize(); Vector3d aa3 = (ur0-ur1).normalize(); Vector3d aa4 = (ul0-ul1).normalize(); Vector3d bb1 = (lr1-ll1).normalize(); Vector3d bb2 = (ur1-lr1).normalize(); Vector3d bb3 = (ul1-ur1).normalize(); Vector3d bb4 = (ll1-ul1).normalize(); Vector3d cc1 = cross(bb1,aa1); Vector3d cc2 = cross(bb2,aa2); Vector3d cc3 = cross(bb3,aa3); Vector3d cc4 = cross(bb4,aa4); vv[0] = ll; vv[1] = lr; vv[2] = ur; vv[3] = ul; rr[0] = cc1[2]>0; rr[1] = cc2[2]>0; rr[2] = cc3[2]>0; rr[3] = cc4[2]>0; } double Frame3dBase::calcZoom3d(Vector3d src, Vector dest) { Vector3d cc = src/2.; Vector3d llf(0,0,0); Vector3d lrf(0,src[1],0); Vector3d urf(src[0],src[1],0); Vector3d ulf(src[0],0,0); Vector3d llb(0,0,src[2]); Vector3d lrb(0,src[1],src[2]); Vector3d urb(src[0],src[1],src[2]); Vector3d ulb(src[0],0,src[2]); Matrix3d mx = Translate3d(-cc) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az_) * RotateX3d(el_); BBox3d bb(llf*mx); bb.bound(lrf*mx); bb.bound(urf*mx); bb.bound(ulf*mx); bb.bound(llb*mx); bb.bound(lrb*mx); bb.bound(urb*mx); bb.bound(ulb*mx); Vector3d bs = bb.size(); double r0 = dest[0]/bs[0]; double r1 = dest[1]/bs[1]; return r0>r1 ? r1:r0; } double Frame3dBase::calcZoomPanner() { if (!keyContext->fits) return 1; if (!pannerPixmap) return 1; Vector3d src = imageSize3d(keyContext->frScale.datasec() ? FrScale::DATASEC : FrScale::IMGSEC) * Scale3d(1,zscale_); Vector dest(pannerWidth,pannerHeight); Vector3d cc = src/2.; Vector3d llf = Vector3d(0,0,0); Vector3d lrf = Vector3d(0,src[1],0); Vector3d urf = Vector3d(src[0],src[1],0); Vector3d ulf = Vector3d(src[0],0,0); Vector3d llb = Vector3d(0,0,src[2]); Vector3d lrb = Vector3d(0,src[1],src[2]); Vector3d urb = Vector3d(src[0],src[1],src[2]); Vector3d ulb = Vector3d(src[0],0,src[2]); BBox3d bb; // 0, 0 Matrix3d m0000 = Translate3d(-cc) * RotateY3d(degToRad(0)) * RotateX3d(degToRad(0)); bb.bound(llf*m0000); bb.bound(llf*m0000); bb.bound(lrf*m0000); bb.bound(urf*m0000); bb.bound(ulf*m0000); bb.bound(llb*m0000); bb.bound(lrb*m0000); bb.bound(urb*m0000); bb.bound(ulb*m0000); // 0, 90 Matrix3d m0090 = Translate3d(-cc) * RotateY3d(degToRad(90)) * RotateX3d(degToRad(0)); bb.bound(llf*m0090); bb.bound(llf*m0090); bb.bound(lrf*m0090); bb.bound(urf*m0090); bb.bound(ulf*m0090); bb.bound(llb*m0090); bb.bound(lrb*m0090); bb.bound(urb*m0090); bb.bound(ulb*m0090); // 90, 0 Matrix3d m9000 = Translate3d(-cc) * RotateY3d(degToRad(0)) * RotateX3d(-degToRad(90)); bb.bound(llf*m9000); bb.bound(llf*m9000); bb.bound(lrf*m9000); bb.bound(urf*m9000); bb.bound(ulf*m9000); bb.bound(llb*m9000); bb.bound(lrb*m9000); bb.bound(urb*m9000); bb.bound(ulb*m9000); // 45, 45 Matrix3d m4545 = Translate3d(-cc) * RotateY3d(degToRad(45)) * RotateX3d(-degToRad(45)); bb.bound(llf*m4545); bb.bound(llf*m4545); bb.bound(lrf*m4545); bb.bound(urf*m4545); bb.bound(ulf*m4545); bb.bound(llb*m4545); bb.bound(lrb*m4545); bb.bound(urb*m4545); bb.bound(ulb*m4545); // 45, 90 Matrix3d m4590 = Translate3d(-cc) * RotateY3d(degToRad(90)) * RotateX3d(-degToRad(45)); bb.bound(llf*m4590); bb.bound(lrf*m4590); bb.bound(urf*m4590); bb.bound(ulf*m4590); bb.bound(llb*m4590); bb.bound(lrb*m4590); bb.bound(urb*m4590); bb.bound(ulb*m4590); // 90, 45 Matrix3d m9045 = Translate3d(-cc) * RotateY3d(degToRad(45)) * RotateX3d(-degToRad(90)); bb.bound(llf*m9045); bb.bound(lrf*m9045); bb.bound(urf*m9045); bb.bound(ulf*m9045); bb.bound(llb*m9045); bb.bound(lrb*m9045); bb.bound(urb*m9045); bb.bound(ulb*m9045); Vector3d bs = bb.size(); double ll = bs[0] > bs[1] ? bs[0] : bs[1]; double mm = dest[0] > dest[1] ? dest[0] : dest[1]; return 1/ll*mm; } void Frame3dBase::centerImage() { Base::centerImage(); viewCursor_ = Vector(); if (keyContext->fits) { // imageCenter is in IMAGE coords Vector3d aa = imageCenter3d(keyContext->frScale.scanMode()); // always center to center of pixel, even for even sized image Vector3d bb = (aa*Translate3d(.5,.5,.5)).floor(); // vp_ is in REF coords vp_ = bb*imageToData3d; } else vp_ = Vector(); } Vector3d Frame3dBase::imageCenter3d(FrScale::ScanMode mode) { if (!keyContext->fits) return Vector3d(); // params is a BBOX in DATA coords 0-n FitsBound* pp = keyContext->fits->getDataParams(mode); FitsZBound* zz = keyContext->getDataParams(mode); // Note: imageCenter() is in IMAGE coords return Vector3d((pp->xmax - pp->xmin)/2.+pp->xmin, (pp->ymax - pp->ymin)/2.+pp->ymin, (zz->zmax - zz->zmin)/2.+zz->zmin) * dataToImage3d; } Vector3d Frame3dBase::imageSize3d(FrScale::ScanMode mode ) { if (!keyContext->fits) return Vector3d(); // params is a BBOX in DATA coords 0-n FitsBound* params = keyContext->fits->getDataParams(mode); FitsZBound* zparams = keyContext->getDataParams(mode); // return in IMAGE coords and extends edge to edge return Vector3d(params->xmax-params->xmin, params->ymax-params->ymin, zparams->zmax-zparams->zmin); } void Frame3dBase::psColor(PSColorSpace mode, const char* color) { ostringstream str; switch (mode) { case BW: case GRAY: psColorGray(getXColor(color), str); str << " setgray"; break; case RGB: psColorRGB(getXColor(color), str); str << " setrgbcolor"; break; case CMYK: psColorCMYK(getXColor(color), str); str << " setcmykcolor"; break; } str << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::psLine(Vector& ss, Vector& tt, int dd) { ostringstream str; if (dd) str << '[' << dlist[0] << ' ' << dlist[1] << "] 0 setdash" << endl; else str << "[] 0 setdash" << endl; str << "newpath " << ss.TkCanvasPs(canvas) << " moveto" << endl << tt.TkCanvasPs(canvas) << " lineto stroke" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::psWidth(int dd) { ostringstream str; str << dd << " setlinewidth" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Frame3dBase::psGraphics(PSColorSpace mode) { if (!keyContext->fits) return; if (border_) psBorder(mode); if (compass_) psCompass(mode); if (highlite_) psHighlite(mode); } void Frame3dBase::psBorder(PSColorSpace mode) { Vector3d vv[8]; int dd[12]; calcBorder(Coord::WIDGET, keyContext->frScale.scanMode(), vv, dd); Vector uu[8]; for (int ii=0; ii<8; ii++) uu[ii] = Vector(vv[ii])*widgetToCanvas; psColor(mode, borderColorName_); psWidth(1); // front psLine(uu[0],uu[1],dd[0]); psLine(uu[1],uu[2],dd[1]); psLine(uu[2],uu[3],dd[2]); psLine(uu[3],uu[0],dd[3]); // back psLine(uu[4],uu[5],dd[4]); psLine(uu[5],uu[6],dd[5]); psLine(uu[6],uu[7],dd[6]); psLine(uu[7],uu[4],dd[7]); // other psLine(uu[0],uu[4],dd[8]); psLine(uu[1],uu[5],dd[9]); psLine(uu[2],uu[6],dd[10]); psLine(uu[3],uu[7],dd[11]); } void Frame3dBase::psCompass(PSColorSpace mode) { Matrix3d& mm = keyContext->fits->dataToWidget3d; double ss = 100./(zoom_[0]+zoom_[1]); Vector3d oo = vp_*mm; Vector3d xx = Vector3d(1,0,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d yy = Vector3d(0,1,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d zz = Vector3d(0,0,1) * Scale3d(ss) * Translate3d(vp_) * mm; Vector o = Vector(oo)*widgetToCanvas; Vector x = Vector(xx)*widgetToCanvas; Vector y = Vector(yy)*widgetToCanvas; Vector z = Vector(zz)*widgetToCanvas; psColor(mode, compassColorName_); psWidth(1); psLine(o,x,0); psLine(o,y,0); psLine(o,z,0); } void Frame3dBase::psHighlite(PSColorSpace mode) { Vector vv[4]; int rr[4]; calcHighlite(Coord::CANVAS,vv,rr); psColor(mode, highliteColorName_); psWidth(1); psLine(vv[0],vv[1],rr[0]); psLine(vv[1],vv[2],rr[1]); psLine(vv[2],vv[3],rr[2]); psLine(vv[3],vv[0],rr[3]); } Matrix3d Frame3dBase::psMatrix(float scale, int width, int height) { Matrix3d userToPS3d = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az_) * RotateX3d(el_) * Translate3d(viewCursor_) * Scale3d(zoom_, zzoom_) * Scale3d(scale,1) * FlipY3d() * Translate3d(width/2., height/2., zdepth_/2.); return refToUser3d*userToPS3d; } void Frame3dBase::setSlice(int id, int ss) { // IMAGE (ranges 1-n) currentContext->updateSlice(id, ss); if (id==2) { currentContext->updateContours(); update(BASE); } else { // load the next cube currentContext->updateClip(); currentContext->updateContoursScale(); updateColorScale(); update(MATRIX); } Base::setSlice(id,ss); } void Frame3dBase::updateBin(const Matrix& mx) { centerImage(); Base::updateBin(mx); } void Frame3dBase::updateBlock(const Vector& vv) { centerImage(); Base::updateBlock(vv); } void Frame3dBase::updateGCs() { Base::updateGCs(); // widget clip region BBox bbWidget = BBox(0, 0, options->width, options->height); Vector sizeWidget = bbWidget.size(); rectWidget[0].x = (int)bbWidget.ll[0]; rectWidget[0].y = (int)bbWidget.ll[1]; rectWidget[0].width = (int)sizeWidget[0]; rectWidget[0].height = (int)sizeWidget[1]; // window clip region BBox bbWindow = bbWidget * widgetToWindow; Vector sizeWindow = bbWindow.size(); rectWindow[0].x = (int)bbWindow.ll[0]; rectWindow[0].y = (int)bbWindow.ll[1]; rectWindow[0].width = (int)sizeWindow[0]; rectWindow[0].height = (int)sizeWindow[1]; // 3d highlite if (!threedGC) { threedGC = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetLineAttributes(display, threedGC, 1, LineSolid, CapButt, JoinMiter); } XSetClipRectangles(display, threedGC, 0, 0, rectWidget, 1, Unsorted); } void Frame3dBase::updateMatrices() { if (DebugPerf) cerr << "Frame3dBase::updateMatrices()..." << endl; zzoom_ = (zoom_[0]+zoom_[1])/2.; if (zzoom_<1) zzoom_ = 1; // if othogonal, reset zzoom if ((teq(az_,0,.001) || teq(fabs(az_),M_PI_2,.001) || teq(fabs(az_),M_PI,.001)) && (teq(el_,0,.001) || teq(fabs(el_),M_PI_2,.001))) zzoom_ =1; // These are the basic tranformation matrices // Note: imageCenter() is in IMAGE coords refToUser3d = Translate3d(-vp_) * Scale3d(1,zscale_) * FlipY3d(); userToRef3d = refToUser3d.invert(); // userToWidget3d userToWidget3d = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az_) * RotateX3d(el_) * Translate3d(viewCursor_) * Scale3d(zoom_, zzoom_) * // must be int to align with screen pixels Translate3d((int)(options->width/2.), (int)(options->height/2.), (int)(zdepth_/2.)); widgetToUser3d = userToWidget3d.invert(); // widgetToCanvas widgetToCanvas3d = Translate3d(originX, originY, 0); canvasToWidget3d = widgetToCanvas3d.invert(); // canvasToWindow short xx, yy; Tk_CanvasWindowCoords(canvas, 0, 0, &xx, &yy); canvasToWindow3d = Translate3d(xx, yy, 0); windowToCanvas3d = canvasToWindow3d.invert(); // These are derived Transformation Matrices refToWidget3d = refToUser3d * userToWidget3d; widgetToRef3d = refToWidget3d.invert(); refToCanvas3d = refToWidget3d * widgetToCanvas3d; canvasToRef3d = refToCanvas3d.invert(); refToWindow3d = refToCanvas3d * canvasToWindow3d; windowToRef3d = refToWindow3d.invert(); userToCanvas3d = userToWidget3d * widgetToCanvas3d; canvasToUser3d = userToCanvas3d.invert(); userToWindow3d = userToCanvas3d * canvasToWindow3d; windowToUser3d = userToWindow3d.invert(); widgetToWindow3d = widgetToCanvas3d * canvasToWindow3d; windowToWidget3d = widgetToWindow3d.invert(); Base::updateMatrices(); // delete current zbuffer since matrices have changed cancelDetach(); // preserve cache? if (!preservecache_) cache_.deleteAll(); preservecache_ =0; if (DebugPerf) cerr << "updateMatrices end" << endl; } void Frame3dBase::updateMagnifierMatrices() { // vv is in CANVAS coords Vector ww = magnifierCursor*canvasToRef; // refToUser3d Matrix3d refToUser3d = Translate3d(Vector3d(-ww,-vp_[2])) * FlipY3d(); // userToMagnifier userToMagnifier3d = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az_) * RotateX3d(el_) * Translate3d(viewCursor_) * Scale3d(zoom_, zzoom_) * Scale3d(magnifierZoom_,magnifierZoom_) * Translate3d((int)(magnifierWidth/2.), (int)(magnifierHeight/2.), (int)(zdepth_/2.)); magnifierToUser3d = userToMagnifier3d.invert(); refToMagnifier3d = refToUser3d * userToMagnifier3d; magnifierToRef3d = refToMagnifier3d.invert(); magnifierToWidget3d = magnifierToRef3d * refToWidget3d; widgetToMagnifier3d = magnifierToWidget3d.invert(); Base::updateMagnifierMatrices(); } void Frame3dBase::updatePannerMatrices() { Vector3d center = imageCenter3d(FrScale::IMGSEC) * imageToData3d; // refToUser3d Matrix3d refToUser3d = Translate3d(-center) * Scale3d(1,zscale_) * FlipY3d(); // userToPanner3d double pz = calcZoomPanner(); double zz = zzoom_*pz; if (zz<1) zz =1; userToPanner3d = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(-wcsRotation) * RotateZ3d(-rotation) * RotateY3d(az_) * RotateX3d(el_) * Scale3d(pz, zz) * Translate3d((int)(pannerWidth/2.), (int)(pannerHeight/2.), (int)(zdepth_/2.)); pannerToUser3d = userToPanner3d.invert(); refToPanner3d = refToUser3d * userToPanner3d; pannerToRef3d = refToPanner3d.invert(); pannerToWidget3d = pannerToRef3d * refToWidget3d; widgetToPanner3d = pannerToWidget3d.invert(); Base::updatePannerMatrices(); } void Frame3dBase::updatePanner() { // do this first Base::updatePanner(); // always render (to update panner background color) if (usePanner) { if (keyContext->fits) { XSetForeground(display, pannerGC, getColor("black")); x11Border(Coord::PANNER,FrScale::IMGSEC,pannerGC,pannerPixmap); } ostringstream str; str << pannerName << " update " << (void*)pannerPixmap << ";"; // calculate bbox Vector ll = Vector(0,0) * widgetToPanner3d; Vector lr = Vector(options->width,0) * widgetToPanner3d; Vector ur = Vector(options->width,options->height) * widgetToPanner3d; Vector ul = Vector(0,options->height) * widgetToPanner3d; str << pannerName << " update bbox " << ll << lr << ur << ul << ";"; // calculate image compass vectors Matrix3d mm = Matrix3d(wcsOrientationMatrix) * Matrix3d(orientationMatrix) * RotateZ3d(wcsRotation) * RotateZ3d(rotation) * RotateY3d(az_) * RotateX3d(-el_) * FlipY3d(); Vector xx = (Vector3d(1,0,0)*mm).normalize(); Vector yy = (Vector3d(0,1,0)*mm).normalize(); Vector zz = (Vector3d(0,0,1)*mm).normalize(); str << pannerName << " update image compass " << xx << yy << zz << ";"; if (keyContext->fits && keyContext->fits->hasWCS(wcsSystem_)) { Vector orpix = keyContext->fits->center(); Vector orval=keyContext->fits->pix2wcs(orpix, wcsSystem_, wcsSky_); Vector orpix2 = keyContext->fits->wcs2pix(orval, wcsSystem_,wcsSky_); Vector delta = keyContext->fits->getWCScdelt(wcsSystem_).abs(); // find normalized north Vector npix = keyContext->fits->wcs2pix(Vector(orval[0],orval[1]+delta[1]), wcsSystem_,wcsSky_); Vector north = (Vector3d(npix-orpix2)*mm).normalize(); // find normalized east Vector epix = keyContext->fits->wcs2pix(Vector(orval[0]+delta[0],orval[1]), wcsSystem_,wcsSky_); Vector east = (Vector3d(epix-orpix2)*mm).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) { north = (Vector3d(0,1)*mm).normalize(); east = (Vector3d(-1,0)*mm).normalize(); } // and update the panner str << pannerName << " update wcs compass " << north << east << ends; } else str << pannerName << " update wcs compass invalid" << ends; Tcl_Eval(interp, str.str().c_str()); } } void Frame3dBase::x11Graphics() { Base::x11Graphics(); if (!keyContext->fits) return; if (border_) { XSetForeground(display, threedGC, getColor(borderColorName_)); x11Border(Coord::WIDGET, keyContext->frScale.scanMode(), threedGC, pixmap); } if (compass_) x11Compass(); if (highlite_) x11Highlite(); } void Frame3dBase::x11Line(Vector ss, Vector tt, int dd, GC gc, Pixmap pm) { x11Dash(gc, dd); XDrawLine(display, pm, gc, ss[0], ss[1], tt[0], tt[1]); } void Frame3dBase::x11Border(Coord::InternalSystem sys, FrScale::ScanMode mode, GC gc, Pixmap pm) { Vector3d vv[8]; int dd[12]; calcBorder(sys, mode, vv, dd); // front x11Line(vv[0], vv[1], dd[0], gc, pm); x11Line(vv[1], vv[2], dd[1], gc, pm); x11Line(vv[2], vv[3], dd[2], gc, pm); x11Line(vv[3], vv[0], dd[3], gc, pm); // back x11Line(vv[4], vv[5], dd[4], gc, pm); x11Line(vv[5], vv[6], dd[5], gc, pm); x11Line(vv[6], vv[7], dd[6], gc, pm); x11Line(vv[7], vv[4], dd[7], gc, pm); // other x11Line(vv[0], vv[4], dd[8], gc, pm); x11Line(vv[1], vv[5], dd[9], gc, pm); x11Line(vv[2], vv[6], dd[10], gc, pm); x11Line(vv[3], vv[7], dd[11], gc, pm); } void Frame3dBase::x11Compass() { Matrix3d& mm = keyContext->fits->dataToWidget3d; double ss = 100./(zoom_[0]+zoom_[1]); Vector3d oo = vp_*mm; Vector3d xx = Vector3d(1,0,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d yy = Vector3d(0,1,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d zz = Vector3d(0,0,1) * Scale3d(ss) * Translate3d(vp_) * mm; x11Dash(threedGC, 0); XSetForeground(display, threedGC, getColor(compassColorName_)); XDrawLine(display, pixmap, threedGC, oo[0], oo[1], xx[0], xx[1]); XDrawLine(display, pixmap, threedGC, oo[0], oo[1], yy[0], yy[1]); XDrawLine(display, pixmap, threedGC, oo[0], oo[1], zz[0], zz[1]); } /* void Frame3dBase::renderArm(int length, Vector center, Rotate rot, const char* str, int color) { if (!tkfont_) { ostringstream fstr; fstr << '{' << options->helvetica << '}' << " 9 roman normal" << ends; tkfont_ = Tk_GetFont(interp, tkwin, fstr.str().c_str()); if (tkfont_) Tk_GetFontMetrics(tkfont_, &metric); } if (!compassGC) { compassGC = XCreateGC(display, pixmap, 0, NULL); XSetLineAttributes(display, compassGC, 1, LineSolid, CapButt, JoinMiter); if (tkfont_) XSetFont(display, compassGC, Tk_FontId(tkfont_)); } if (length<=0) return; // set GC XSetForeground(display, compassGC, color); const int textOffset = 15; // Text offset const int tip = 6; // length from end of line to tip of arrow const int tail = 2; // length from end of line to tails of arrow const int wc = 2; // width of arrow at end of line const int wt = 3; // width of arrow at tails // Arrow-- oriented on Y axis Vector arrow[6]; arrow[0] = Vector(0, tip); arrow[1] = Vector(-wc, 0); arrow[2] = Vector(-wt, -tail); arrow[3] = Vector(0, 0); arrow[4] = Vector(wt, -tail); arrow[5] = Vector(wc, 0); // Staff-- oriented on X axis XPoint arrowArray[6]; Matrix arrowMatrix = Rotate(M_PI_2) * Translate(length,0) * rot * Translate(center); for (int i=0; i<6; i++) { Vector r = (arrow[i] * arrowMatrix).round(); arrowArray[i].x = (int)r[0]; arrowArray[i].y = (int)r[1]; } Vector c = ((Vector&)center).round(); Vector end = (Vector(length, 0) * rot * Translate(center)).round(); XDrawLine(display, pixmap, compassGC, (int)c[0], (int)c[1], (int)end[0], (int)end[1]); XFillPolygon(display, pixmap, compassGC, arrowArray, 6, Nonconvex, CoordModeOrigin); if (useFont && tkfont_) { Vector et = Vector((length + textOffset), 0) * rot * Translate(center) * Translate(-Tk_TextWidth(tkfont_, str, 1)/2., metric.ascent/2.); Tk_DrawChars(display, pixmap, compassGC, tkfont_, str, 1, (int)et[0], (int)et[1]); } } */ void Frame3dBase::x11Highlite() { Vector vv[4]; int rr[4]; calcHighlite(Coord::WIDGET,vv,rr); XSetForeground(display, threedGC, getColor(highliteColorName_)); x11Line(vv[0], vv[1], rr[0], threedGC, pixmap); x11Line(vv[1], vv[2], rr[1], threedGC, pixmap); x11Line(vv[2], vv[3], rr[2], threedGC, pixmap); x11Line(vv[3], vv[0], rr[3], threedGC, pixmap); } void Frame3dBase::ximageToPixmapMagnifier() { if (!basePixmap || !baseXImage || !magnifierPixmap || !magnifierXImage) return; // magnifier int& ww = magnifierXImage->width; int& hh = magnifierXImage->height; Vector wh(ww,hh); Vector cc = magnifierCursor * canvasToWidget; Vector ll =cc-wh/2.; Vector ur =cc+wh/2.; // clip to base BBox bb(0,0,baseXImage->width,baseXImage->height); Vector uu(ll); Vector vv(ur); uu.clip(bb); vv.clip(bb); Vector zz = vv-uu; Vector oo = uu-ll; // sanity check if (zz[0]<=0 || zz[1]<=0) return; XImage* srcXImage = XGetImage(display, basePixmap, uu[0], uu[1], zz[0], zz[1], AllPlanes, ZPixmap); char* src = srcXImage->data; int srcBytesPerLine = srcXImage->bytes_per_line; char* dst = magnifierXImage->data; int dstBytesPerLine = magnifierXImage->bytes_per_line; int bytesPerPixel = magnifierXImage->bits_per_pixel/8; Matrix mx = Translate(-wh/2.) * Translate(oo) * Translate(-.5,-.5) * Scale(magnifierZoom_) * Translate(wh/2.); Matrix mm = mx.invert(); for (int jj=0; jj= 0 && vv[0] < zz[0] && vv[1] >= 0 && vv[1] < zz[1]) { // I really don't understand this #if MAC_OSX_TK char* sptr = src + ((int)vv[1])*srcBytesPerLine + ((int)vv[0])*bytesPerPixel; *(dest+0) = *(sptr+3); *(dest+1) = *(sptr+0); *(dest+2) = *(sptr+1); *(dest+3) = *(sptr+2); #else memcpy(dest, src + ((int)vv[1])*srcBytesPerLine + ((int)vv[0])*bytesPerPixel, bytesPerPixel); #endif } else memcpy(dest, bgTrueColor_, bytesPerPixel); } } TkPutImage(NULL, 0, display, magnifierPixmap, gc, magnifierXImage, 0, 0, 0, 0, magnifierXImage->width, magnifierXImage->height); if (srcXImage) XDestroyImage(srcXImage); } #ifdef MAC_OSX_TK void Frame3dBase::macosxLine(Vector& ss, Vector& tt, int dd) { if (dd) macosxDash(dlist,2); else macosxDash(NULL,0); macosxDrawLine(ss,tt); } void Frame3dBase::macosxGraphics() { if (!keyContext->fits) return; if (border_) macosxBorder(); if (compass_) macosxCompass(); if (highlite_) macosxHighlite(); } void Frame3dBase::macosxBorder() { Vector3d vv[8]; int dd[12]; calcBorder(Coord::WIDGET, keyContext->frScale.scanMode(), vv, dd); Vector uu[8]; for (int ii=0; ii<8; ii++) uu[ii] = Vector(vv[ii])*widgetToCanvas; macosxColor(getXColor(borderColorName_)); macosxWidth(1); // front macosxLine(uu[0],uu[1],dd[0]); macosxLine(uu[1],uu[2],dd[1]); macosxLine(uu[2],uu[3],dd[2]); macosxLine(uu[3],uu[0],dd[3]); // back macosxLine(uu[4],uu[5],dd[4]); macosxLine(uu[5],uu[6],dd[5]); macosxLine(uu[6],uu[7],dd[6]); macosxLine(uu[7],uu[4],dd[7]); // other macosxLine(uu[0],uu[4],dd[8]); macosxLine(uu[1],uu[5],dd[9]); macosxLine(uu[2],uu[6],dd[10]); macosxLine(uu[3],uu[7],dd[11]); } void Frame3dBase::macosxCompass() { Matrix3d& mm = keyContext->fits->dataToWidget3d; double ss = 100./(zoom_[0]+zoom_[1]); Vector3d oo = vp_*mm; Vector3d xx = Vector3d(1,0,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d yy = Vector3d(0,1,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d zz = Vector3d(0,0,1) * Scale3d(ss) * Translate3d(vp_) * mm; Vector o = Vector(oo)*widgetToCanvas; Vector x = Vector(xx)*widgetToCanvas; Vector y = Vector(yy)*widgetToCanvas; Vector z = Vector(zz)*widgetToCanvas; macosxColor(getXColor(compassColorName_)); macosxWidth(1); macosxLine(o,x,0); macosxLine(o,y,0); macosxLine(o,z,0); } void Frame3dBase::macosxHighlite() { Vector vv[4]; int rr[4]; calcHighlite(Coord::CANVAS,vv,rr); macosxColor(getXColor(highliteColorName_)); macosxWidth(1); macosxLine(vv[0],vv[1],rr[0]); macosxLine(vv[1],vv[2],rr[1]); macosxLine(vv[2],vv[3],rr[2]); macosxLine(vv[3],vv[0],rr[3]); } #endif #ifdef __WIN32 void Frame3dBase::win32Line(Vector& ss, Vector& tt, int dd) { if (dd) win32Dash(dlist,2); else win32Dash(NULL,0); win32DrawLine(ss,tt); } void Frame3dBase::win32Graphics() { if (!keyContext->fits) return; if (border_) win32Border(); if (compass_) win32Compass(); if (highlite_) win32Highlite(); } void Frame3dBase::win32Border() { Vector3d vv[8]; int dd[12]; calcBorder(Coord::WIDGET, keyContext->frScale.scanMode(), vv, dd); Vector uu[8]; for (int ii=0; ii<8; ii++) uu[ii] = Vector(vv[ii])*widgetToCanvas; win32Color(getXColor(borderColorName_)); win32Width(1); // front win32Line(uu[0],uu[1],dd[0]); win32Line(uu[1],uu[2],dd[1]); win32Line(uu[2],uu[3],dd[2]); win32Line(uu[3],uu[0],dd[3]); // back win32Line(uu[4],uu[5],dd[4]); win32Line(uu[5],uu[6],dd[5]); win32Line(uu[6],uu[7],dd[6]); win32Line(uu[7],uu[4],dd[7]); // other win32Line(uu[0],uu[4],dd[8]); win32Line(uu[1],uu[5],dd[9]); win32Line(uu[2],uu[6],dd[10]); win32Line(uu[3],uu[7],dd[11]); } void Frame3dBase::win32Compass() { Matrix3d& mm = keyContext->fits->dataToWidget3d; double ss = 100./(zoom_[0]+zoom_[1]); Vector3d oo = vp_*mm; Vector3d xx = Vector3d(1,0,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d yy = Vector3d(0,1,0) * Scale3d(ss) * Translate3d(vp_) * mm; Vector3d zz = Vector3d(0,0,1) * Scale3d(ss) * Translate3d(vp_) * mm; Vector o = Vector(oo)*widgetToCanvas; Vector x = Vector(xx)*widgetToCanvas; Vector y = Vector(yy)*widgetToCanvas; Vector z = Vector(zz)*widgetToCanvas; win32Color(getXColor(compassColorName_)); win32Width(1); win32Line(o,x,0); win32Line(o,y,0); win32Line(o,z,0); } void Frame3dBase::win32Highlite() { Vector vv[4]; int rr[4]; calcHighlite(Coord::CANVAS,vv,rr); win32Color(getXColor(highliteColorName_)); win32Width(1); win32Line(vv[0],vv[1],rr[0]); win32Line(vv[1],vv[2],rr[1]); win32Line(vv[2],vv[3],rr[2]); win32Line(vv[3],vv[0],rr[3]); } #endif saods9/tksao1.0/frame/frame3dbase.h000644 000765 000000 00000013777 12616222264 017365 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3dbase_h__ #define __frame3dbase_h__ #include "base.h" #include "raytrace.h" class Grid3d; class Frame3dBase : public Base { friend class Grid3d; public: enum RenderMethod {MIP,AIP}; enum MotionType {NONE,AZIMUTH,ELEVATION}; protected: int zdepth_; double zzoom_; double zscale_; Vector3d vp_; Vector viewCursor_; float az_; float el_; RenderMethod renderMethod_; List cache_; int preservecache_; MotionType render_; // enable background rendering GC threedGC; int border_; char* borderColorName_; int compass_; char* compassColorName_; int highlite_; char* highliteColorName_; double cropsl_; Matrix3d dataToImage3d; Matrix3d imageToData3d; Matrix3d refToUser3d; Matrix3d userToRef3d; Matrix3d refToWidget3d; Matrix3d widgetToRef3d; Matrix3d refToCanvas3d; Matrix3d canvasToRef3d; Matrix3d refToWindow3d; Matrix3d windowToRef3d; Matrix3d userToWidget3d; Matrix3d widgetToUser3d; Matrix3d userToCanvas3d; Matrix3d canvasToUser3d; Matrix3d userToWindow3d; Matrix3d windowToUser3d; Matrix3d widgetToCanvas3d; Matrix3d canvasToWidget3d; Matrix3d widgetToWindow3d; Matrix3d windowToWidget3d; Matrix3d canvasToWindow3d; Matrix3d windowToCanvas3d; Matrix3d refToMagnifier3d; Matrix3d magnifierToRef3d; Matrix3d userToMagnifier3d; Matrix3d magnifierToUser3d; Matrix3d widgetToMagnifier3d; Matrix3d magnifierToWidget3d; Matrix3d refToPanner3d; Matrix3d pannerToRef3d; Matrix3d userToPanner3d; Matrix3d pannerToUser3d; Matrix3d widgetToPanner3d; Matrix3d pannerToWidget3d; private: void calcBorder(Coord::InternalSystem, FrScale::ScanMode mode, Vector3d* vv, int* dd); void calcHighlite(Coord::InternalSystem, Vector*, int*); protected: double calcZoomPanner(); double calcZoom3d(Vector3d, Vector); virtual void cancelDetach() =0; void centerImage(); int isAzElZero() {return !az_ && !el_;} Vector3d imageCenter3d(FrScale::ScanMode); Vector3d imageSize3d(FrScale::ScanMode); void psColor(PSColorSpace, const char*); void psLine(Vector&, Vector&, int); void psWidth(int); void psGraphics(PSColorSpace mode); void psBorder(PSColorSpace mode); void psCompass(PSColorSpace mode); void psHighlite(PSColorSpace mode); Matrix3d psMatrix(float scale, int width, int height); void setBinCursor() {} void updateBin(const Matrix&); void updateBlock(const Vector&); void updateGCs(); void updateMagnifierMatrices(); void updatePannerMatrices(); void updateMatrices(); void updatePanner(); void x11Line(Vector, Vector, int, GC, Pixmap); void x11Graphics(); void x11Border(Coord::InternalSystem, FrScale::ScanMode, GC, Pixmap); void x11Compass(); void x11Highlite(); void ximageToPixmapMagnifier(); public: Frame3dBase(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Frame3dBase(); void setSlice(int,int); Vector mapFromRef(const Vector& vv, Coord::InternalSystem sys) {return mapFromRef3d(vv,sys);} Vector3d mapFromRef3d(const Vector&, Coord::InternalSystem); Vector3d mapFromRef3d(const Vector&, Coord::InternalSystem, double); Vector mapToRef(const Vector& vv, Coord::InternalSystem sys) {return mapToRef3d(vv,sys);} Vector3d mapToRef3d(const Vector&, Coord::InternalSystem); Vector3d mapToRef3d(const Vector&, Coord::InternalSystem, double); // Bin Commands void binToFitCmd(); // Block Commands void blockToFitCmd(); // Clip Commands void clipScopeCmd(FrScale::ClipScope) {} // scope is always GLOBAL // Coordinate Commands void getCursorCmd(Coord::InternalSystem); void getCursorCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision); // Crop Commands void crop3dBeginCmd(const Vector&, int); void crop3dMotionCmd(const Vector&, int); void crop3dEndCmd(const Vector&, int); // Grid Commands void gridCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Grid::GridType, const char*, const char*); // Pan Zoom Rotate Orient Commands void panCmd(const Vector&); void panCmd(const Vector&, const Vector&); void panCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame); void panToCmd(const Vector&); void panToCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame); void panBBoxCmd(const Vector&); void panEndCmd(const Vector&); void rotateBeginCmd(); void rotateMotionCmd(double); void rotateEndCmd(); void zoomAboutCmd(const Vector&, const Vector&); void zoomAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void zoomToAboutCmd(const Vector&, const Vector&); void zoomToAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void zoomToFitCmd(double); // 3d Commands void get3dBorderCmd(); void get3dBorderColorCmd(); void get3dCompassCmd(); void get3dCompassColorCmd(); void get3dHighliteCmd(); void get3dHighliteColorCmd(); void get3dRenderMethodCmd(); void get3dRenderBackgroundCmd(); void get3dScaleCmd(); void get3dViewCmd(); void get3dViewPointCmd(); void set3dBorderCmd(int); void set3dBorderColorCmd(const char*); void set3dCompassCmd(int); void set3dCompassColorCmd(const char*); void set3dHighliteCmd(int); void set3dHighliteColorCmd(const char*); void set3dRenderMethodCmd(int); void set3dRenderBackgroundCmd(int); void set3dPreserveCmd(); void set3dScaleCmd(double); void set3dViewCmd(float, float); void set3dViewPointCmd(const Vector3d&, const Vector&); void view3dMotionCmd(float az, float el) {set3dViewCmd(az,el);} void view3dEndCmd(float az, float el) {set3dViewCmd(az,el);} #ifdef MAC_OSX_TK void macosxLine(Vector&, Vector&, int); void macosxGraphics(); void macosxBorder(); void macosxCompass(); void macosxHighlite(); #endif #ifdef __WIN32 void win32Line(Vector&, Vector&, int); void win32Graphics(); void win32Border(); void win32Compass(); void win32Highlite(); #endif }; #endif saods9/tksao1.0/frame/frame3dtrue.C000644 000765 000000 00000000560 12464214756 017357 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dtrue.h" Frame3dTrue::Frame3dTrue(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i, c, item) { byteorder_ = 0; bitsperpixel_ = 0; } Frame3dTrue::~Frame3dTrue() { } saods9/tksao1.0/frame/frame3dtrue.h000644 000765 000000 00000001201 12464214756 017415 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametrue_h__ #define __frametrue_h__ #include "frame3dbase.h" class Frame3dTrue : public virtual Frame3dBase { protected: int byteorder_; int bitsperpixel_; protected: void encodeTrueColor(int oo, int bb) {byteorder_ = oo; bitsperpixel_ = bb;} virtual void encodeTrueColor(XColor*, char*) =0; virtual void encodeTrueColor(unsigned char*, XImage*) =0; public: Frame3dTrue(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Frame3dTrue(); }; #endif saods9/tksao1.0/frame/frame3dtruecolor.C000644 000765 000000 00000002207 12464214756 020416 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dtruecolor.h" #include "fitsimage.h" #include "ps.h" Frame3dTrueColor::Frame3dTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i,c,item), Frame3d(i,c,item), Frame3dTrue(i,c,item) { colormapData = NULL; } Frame3dTrueColor::~Frame3dTrueColor() { if (colormapData) delete [] colormapData; } void Frame3dTrueColor::buildXImage(XImage* ximage, Coord::InternalSystem sys) { // we need a colorScale before we can render if (!validColorScale()) return; unsigned char* img = fillImage(ximage->width, ximage->height, sys); if (img) { encodeTrueColor(img, ximage); delete [] img; } } // Commands void Frame3dTrueColor::colormapCmd(int id, float b, float c, int i, unsigned short* index, unsigned char* cells, int cnt) { cmapID = id; bias = b; contrast = c; invert = i; updateColorCells(index, cells, cnt); updateColorScale(); update(BASE); } void Frame3dTrueColor::colormapEndCmd() { update(BASE); } saods9/tksao1.0/frame/frame3dtruecolor.h000644 000765 000000 00000001461 12464214756 020464 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3dtruecolor_h__ #define __frame3dtruecolor_h__ #include "frame3d.h" #include "frame3dtrue.h" class Frame3dTrueColor : public Frame3d, public Frame3dTrue { protected: long* colormapData; private: void buildXImage(XImage*, Coord::InternalSystem); public: Frame3dTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Frame3dTrueColor(); void colormapCmd(int, float, float, int, unsigned short*, unsigned char*, int); void colormapEndCmd(); void colormapMotionCmd(int id, float b, float c, int i, unsigned short* index, unsigned char* cells, int cnt) {colormapCmd(id,b,c,i,index,cells,cnt);} }; #endif saods9/tksao1.0/frame/frame3dtruecolor16.C000644 000765 000000 00000012741 12464214756 020571 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dtruecolor16.h" #include "colorscaletrue16.h" #include "util.h" // Tk Canvas Widget Function Declarations int Frame3dTrueColor16CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // Frame3dTrueColor16 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frame3dTrueColor16Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame3d", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frame3dTrueColor16Type = { (char*)"frame3dtruecolor16", // name sizeof(WidgetOptions), // item size Frame3dTrueColor16CreateProc, // configProc frame3dTrueColor16Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int Frame3dTrueColor16_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frame3dTrueColor16Type); return TCL_OK; } int Frame3dTrueColor16CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { Frame3dTrueColor16* frame = new Frame3dTrueColor16(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // Frame3dTrueColor16 Member Functions Frame3dTrueColor16::Frame3dTrueColor16(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i,c,item), Frame3dTrueColor(i,c,item), TrueColor16(visual) { configSpecs = frame3dTrueColor16Specs; // frame configure options } Frame3dTrueColor16::~Frame3dTrueColor16() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void Frame3dTrueColor16::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells) return; if (colorScale) delete colorScale; switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor16(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor16(indexCells, colorCells, colorCount, visual, byteorder_); break; } } saods9/tksao1.0/frame/frame3dtruecolor16.h000644 000765 000000 00000001310 12464214756 020624 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3dtruecolor16_h__ #define __frame3dtruecolor16_h__ #include "frame3dtruecolor.h" #include "truecolor16.h" class Frame3dTrueColor16 : public Frame3dTrueColor, public TrueColor16 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor16::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor16::encodeTrueColor(src, ximage);} void updateColorScale(); public: Frame3dTrueColor16(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~Frame3dTrueColor16(); }; #endif saods9/tksao1.0/frame/frame3dtruecolor24.C000644 000765 000000 00000016622 12464214756 020572 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dtruecolor24.h" #include "colorscaletrue24.h" #include "colorscaletrue32.h" // Tk Canvas Widget Function Declarations int Frame3dTrueColor24CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // Frame3dTrueColor24 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frame3dTrueColor24Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame3d", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frame3dTrueColor24Type = { (char*)"frame3dtruecolor24", // name sizeof(WidgetOptions), // item size Frame3dTrueColor24CreateProc, // configProc frame3dTrueColor24Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int Frame3dTrueColor24_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frame3dTrueColor24Type); return TCL_OK; } int Frame3dTrueColor24CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { Frame3dTrueColor24* frame = new Frame3dTrueColor24(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // Frame3dTrueColor24 Member Functions Frame3dTrueColor24::Frame3dTrueColor24(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i,c,item), Frame3dTrueColor(i,c,item), TrueColor24(visual) { configSpecs = frame3dTrueColor24Specs; // frame configure options } Frame3dTrueColor24::~Frame3dTrueColor24() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void Frame3dTrueColor24::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells || !bitsperpixel_) return; if (colorScale) delete colorScale; // determine if we have 3 bytes or 4 bytes per pixel switch (bitsperpixel_) { case 24: updateColorScale24(); break; case 32: updateColorScale32(); break; } } void Frame3dTrueColor24::updateColorScale24() { switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor24(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor24(indexCells, colorCells, colorCount, visual, byteorder_); break; } } void Frame3dTrueColor24::updateColorScale32() { switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor32(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor32(indexCells, colorCells, colorCount, visual, byteorder_); break; } } saods9/tksao1.0/frame/frame3dtruecolor24.h000644 000765 000000 00000001402 12464214756 020625 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3dtruecolor24_h__ #define __frame3dtruecolor24_h__ #include "frame3dtruecolor.h" #include "truecolor24.h" class Frame3dTrueColor24 : public Frame3dTrueColor, public TrueColor24 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor24::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor24::encodeTrueColor(src, ximage);} void updateColorScale(); void updateColorScale24(); void updateColorScale32(); public: Frame3dTrueColor24(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~Frame3dTrueColor24(); }; #endif saods9/tksao1.0/frame/frame3dtruecolor8.C000644 000765 000000 00000012571 12464214756 020513 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frame3dtruecolor8.h" #include "colorscaletrue8.h" // Tk Canvas Widget Function Declarations int Frame3dTrueColor8CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // Frame3dTrueColor8 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frame3dTrueColor8Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame3d", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frame3dTrueColor8Type = { (char*)"frame3dtruecolor8", // name sizeof(WidgetOptions), // item size Frame3dTrueColor8CreateProc, // configProc frame3dTrueColor8Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int Frame3dTrueColor8_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frame3dTrueColor8Type); return TCL_OK; } int Frame3dTrueColor8CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { Frame3dTrueColor8* frame = new Frame3dTrueColor8(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // Frame3dTrueColor8 Member Functions Frame3dTrueColor8::Frame3dTrueColor8(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Frame3dBase(i,c,item), Frame3dTrueColor(i,c,item), TrueColor8(visual) { configSpecs = frame3dTrueColor8Specs; // frame configure options } Frame3dTrueColor8::~Frame3dTrueColor8() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void Frame3dTrueColor8::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells) return; if (colorScale) delete colorScale; switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor8(colorCount, indexCells, colorCells, colorCount, visual); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor8(indexCells, colorCells, colorCount, visual); break; } } saods9/tksao1.0/frame/frame3dtruecolor8.h000644 000765 000000 00000001300 12464214756 020544 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frame3dtruecolor8_h__ #define __frame3dtruecolor8_h__ #include "frame3dtruecolor.h" #include "truecolor8.h" class Frame3dTrueColor8 : public Frame3dTrueColor, public TrueColor8 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor8::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor8::encodeTrueColor(src, ximage);} void updateColorScale(); public: Frame3dTrueColor8(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~Frame3dTrueColor8(); }; #endif saods9/tksao1.0/frame/framebase.C000644 000765 000000 00000011374 12616470455 017067 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "framebase.h" #include "fitsimage.h" #include "marker.h" #include "context.h" #include "ps.h" #include "sigbus.h" // Public FrameBase::FrameBase(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Base(i, c, item) { rotateSrcXM = NULL; rotateDestXM = NULL; rotatePM = 0; } FrameBase::~FrameBase() { } double FrameBase::calcZoomPanner() { if (!(keyContext->fits && pannerPixmap)) return 1; Vector src = imageSize(keyContext->frScale.datasec() ? FrScale::DATASEC : FrScale::IMGSEC); return calcZoom(src, Vector(pannerWidth,pannerHeight)); } void FrameBase::x11MagnifierCursor(const Vector& vv) { // first, the inner color'd box Vector uu = vv * canvasToUser; Matrix mm = Translate(-uu) * Rotate(wcsRotation) * Rotate(rotation) * Scale(zoom_) * Scale(magnifierZoom_) * Translate(magnifierWidth/2., magnifierHeight/2.); Vector c[5]; c[0] = (uu + Vector(-.5,-.5)) * mm; c[1] = (uu + Vector( .5,-.5)) * mm; c[2] = (uu + Vector( .5, .5)) * mm; c[3] = (uu + Vector(-.5, .5)) * mm; c[4] = c[0]; XPoint pts[5]; for (int ii=0; ii<5; ii++) { Vector z = c[ii].round(); pts[ii].x = (short)z[0]; pts[ii].y = (short)z[1]; } XSetForeground(display, gc, getColor(magnifierColorName)); XDrawLines(display, magnifierPixmap, gc, pts, 5, CoordModeOrigin); // now, the outer black box Matrix nn = Translate(-(uu * mm)) * Rotate(-rotation) * Rotate(-wcsRotation); Matrix oo = nn.invert(); Vector dd[5]; for (int ii=0; ii<5; ii++) dd[ii] = c[ii] * nn; dd[0]+=Vector(-1,-1); dd[1]+=Vector( 1,-1); dd[2]+=Vector( 1, 1); dd[3]+=Vector(-1, 1); dd[4]=dd[0]; for (int ii=0; ii<5; ii++) { dd[ii] = dd[ii] * oo; Vector zz = dd[ii].round(); pts[ii].x = (int)zz[0]; pts[ii].y = (int)zz[1]; } XSetForeground(display, gc, getColor("black")); XDrawLines(display, magnifierPixmap, gc, pts, 5, CoordModeOrigin); } void FrameBase::setBinCursor() { if (context->cfits) context->cfits->setBinCursor(cursor); } void FrameBase::setSlice(int id, int ss) { // IMAGE (ranges 1-n) currentContext->updateSlice(id, ss); switch (currentContext->frScale.clipScope()) { case FrScale::GLOBAL: currentContext->updateContours(); break; case FrScale::LOCAL: currentContext->updateClip(); currentContext->updateContoursScale(); break; } updateColorScale(); update(MATRIX); Base::setSlice(id,ss); } void FrameBase::updateBin(const Matrix& mx) { // Note: cursor is in REF coords, imageCenter() in IMAGE coords cursor = imageCenter(FrScale::IMGSEC); Base::updateBin(mx); } void FrameBase::updatePanner() { Base::updatePanner(); if (usePanner) { ostringstream str; str << pannerName << " update " << (void*)pannerPixmap << ";"; // calculate bbox Vector ll = Vector(0,0) * widgetToPanner; Vector lr = Vector(options->width,0) * widgetToPanner; Vector ur = Vector(options->width,options->height) * widgetToPanner; Vector ul = Vector(0,options->height) * widgetToPanner; str << pannerName << " update bbox " << ll << lr << ur << ul << ";"; // calculate image compass vectors Matrix mm = FlipY() * irafMatrix_ * wcsOrientationMatrix * Rotate(wcsRotation) * orientationMatrix * Rotate(rotation); Vector xx = (Vector(1,0)*mm).normalize(); Vector yy = (Vector(0,1)*mm).normalize(); str << pannerName << " update image compass " << xx << yy << ";"; if (keyContext->fits && keyContext->fits->hasWCS(wcsSystem_)) { Vector orpix = keyContext->fits->center(); Vector orval=keyContext->fits->pix2wcs(orpix, wcsSystem_, wcsSky_); Vector orpix2 = keyContext->fits->wcs2pix(orval, wcsSystem_,wcsSky_); Vector delta = keyContext->fits->getWCScdelt(wcsSystem_).abs(); Vector npix = keyContext->fits->wcs2pix(Vector(orval[0],orval[1]+delta[1]), wcsSystem_,wcsSky_); Vector north = ((npix-orpix2)*mm).normalize(); Vector epix = keyContext->fits->wcs2pix(Vector(orval[0]+delta[0],orval[1]), wcsSystem_,wcsSky_); Vector east = ((epix-orpix2)*mm).normalize(); // sanity check Vector diff = (north-east).abs(); if ((north[0]==0 && north[1]==0) || (east[0]==0 && east[1]==0) || (diff[0]<.01 && diff[1]<.01)) { north = (Vector(0,1)*mm).normalize(); east = (Vector(-1,0)*mm).normalize(); } str << pannerName << " update wcs compass " << north << east << ends; } else str << pannerName << " update wcs compass invalid" << ends; Tcl_Eval(interp, str.str().c_str()); } } saods9/tksao1.0/frame/framebase.h000644 000765 000000 00000006435 12616222264 017127 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framebase_h__ #define __framebase_h__ #include "base.h" class FrameBase : public Base { protected: XImage* rotateSrcXM; // rotate src ximage XImage* rotateDestXM; // rotate dest ximage Pixmap rotatePM; // rotate pixmap Vector iisLastCursor; // iis cursor state info protected: double calcZoomPanner(); void cancelDetach() {}; virtual void rotateMotion() =0; void saveFitsResampleFits(OutFitsStream&); void saveFitsResampleKeyword(OutFitsStream&, FitsHead&); void setBinCursor(); virtual void updateBin(const Matrix&); void updatePanner(); void x11MagnifierCursor(const Vector&); public: FrameBase(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~FrameBase(); void setSlice(int,int); Vector mapFromRef(const Vector&, Coord::InternalSystem); Vector3d mapFromRef3d(const Vector& vv, Coord::InternalSystem sys) {return mapFromRef(vv,sys);} Vector mapToRef(const Vector&, Coord::InternalSystem); Vector3d mapToRef3d(const Vector& vv, Coord::InternalSystem sys) {return mapToRef(vv,sys);} // Bin Commands void binToFitCmd(); // Block Commands void blockToFitCmd(); // Coordinate Commands void getCursorCmd(Coord::InternalSystem); void getCursorCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Precision); // Grid Commands void gridCmd(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Grid::GridType, const char*, const char*); // Fits Commands void saveFitsResample(OutFitsStream&); void saveFitsResampleFileCmd(const char*); void saveFitsResampleChannelCmd(const char*); void saveFitsResampleSocketCmd(int); // IIS Commands void iisCursorModeCmd(int); void iisGetCursorCmd(); void iisGetFileNameCmd(); void iisGetFileNameCmd(int); void iisGetFileNameCmd(const Vector&); void iisMessageCmd(const char*); void iisSetCursorCmd(const Vector&, Coord::InternalSystem); void iisSetCursorCmd(const Vector&, Coord::CoordSystem); void iisSetFileNameCmd(const char*); void iisSetFileNameCmd(const char*,int); void iisUpdateCmd() {updateNow(MATRIX);} // Pan Zoom Rotate Orient Commands void panCmd(const Vector&); void panCmd(const Vector&, const Vector&); void panCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame); void panToCmd(const Vector&); void panToCmd(const Vector&, Coord::CoordSystem, Coord::SkyFrame); void panBBoxCmd(const Vector&); void panEndCmd(const Vector&); void rotateBeginCmd(); void rotateMotionCmd(double); void rotateEndCmd(); void zoomAboutCmd(const Vector&, const Vector&); void zoomAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void zoomToAboutCmd(const Vector&, const Vector&); void zoomToAboutCmd(const Vector&, const Vector&, Coord::CoordSystem, Coord::SkyFrame); void zoomToFitCmd(double); // 3d void get3dBorderCmd(); void get3dBorderColorCmd(); void get3dCompassCmd(); void get3dCompassColorCmd(); void get3dHighliteCmd(); void get3dHighliteColorCmd(); void get3dScaleCmd(); void get3dViewCmd(); void get3dViewPointCmd(); void get3dRenderMethodCmd(); void get3dRenderBackgroundCmd(); }; #endif saods9/tksao1.0/frame/framergb.C000644 000765 000000 00000110144 12621204750 016707 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "framergb.h" #include "fitsimage.h" #include "ps.h" #include "outfile.h" #include "outchannel.h" #include "outsocket.h" #include "sigbus.h" // Frame Member Functions FrameRGB::FrameRGB(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item) { context = new Context[3]; context[0].parent(this); context[1].parent(this); context[2].parent(this); channel = 0; rgbSystem = Coord::WCS; for (int ii=0; ii<3; ii++) { view[ii] = 1; bias[ii] = .5; contrast[ii] = 1.0; colorScale[ii] = NULL; } colorCount = 0; colorCells = NULL; currentContext = &context[channel]; keyContext = &context[channel]; keyContextSet =0; } FrameRGB::~FrameRGB() { if (context) delete [] context; for (int ii=0; ii<3; ii++) { if (colorScale[ii]) delete colorScale[ii]; } if (colorCells) delete [] colorCells; } void FrameRGB::alignWCS() { if (!wcsAlign_ || !(keyContext->fits) || !keyContext->fits->hasWCS(wcsSystem_)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; } else calcAlignWCS(keyContext->fits, wcsSystem_, wcsSky_, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation); updateRGBMatrices(); } void FrameRGB::alignWCS(Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!wcsAlign_ || !(keyContext->fits) || !keyContext->fits->hasWCS(sys)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; } else calcAlignWCS(keyContext->fits, sys, sky, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation); updateRGBMatrices(); } void FrameRGB::alignWCS(FitsImage* ptr, Coord::CoordSystem sys) { if (!wcsAlign_ || !(keyContext->fits) || !ptr || !keyContext->fits->hasWCS(wcsSystem_)) { wcsOrientation = Coord::NORMAL; wcsOrientationMatrix.identity(); wcsRotation = 0; } else calcAlignWCS(ptr, keyContext->fits, wcsSystem_, sys, wcsSky_, &wcsOrientation, &wcsOrientationMatrix, &wcsRotation, &zoom_); updateRGBMatrices(); } int FrameRGB::doRender() { return ((context[0].fits&&view[0]) || (context[1].fits&&view[1]) || (context[2].fits&&view[2])); } unsigned char* FrameRGB::fillImage(int width, int height, Coord::InternalSystem sys) { // img unsigned char* img = new unsigned char[width*height*3]; memset(img,0,width*height*3); // mk char* mk = new char[width*height]; memset(mk,0,width*height); SETSIGBUS // one channel at a time for (int kk=0; kk<3; kk++) { if (!view[kk] || !context[kk].fits) continue; // basics int length = colorScale[kk]->size() - 1; const unsigned char* table = colorScale[kk]->psColors(); FitsImage* sptr = context[kk].cfits; int mosaic = context[kk].isMosaic(); // variable double* mm = sptr->matrixToData(sys).mm(); FitsBound* params = sptr->getDataParams(context[kk].frScale.scanMode()); int srcw = sptr->width(); double ll = sptr->low(); double hh = sptr->high(); double diff = hh - ll; // main loop unsigned char* dest = img; char* mkptr = mk; for (long jj=0; jjmatrixToData(sys).mm(); params = sptr->getDataParams(context[kk].frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { double value = sptr->getValueDouble(long(yy)*srcw + long(xx)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) *(dest+kk) = *table; else if (value >= hh) *(dest+kk) = *(table+length); else *(dest+kk) = *(table+((int)(((value - ll)/diff * length) +.5))); *mkptr =2; } else if (*mkptr < 2) *mkptr =1; break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(sys).mm(); params = sptr->getDataParams(context[kk].frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } } } } while (mosaic && sptr); } } } // now fill in bg { unsigned char* dest = img; char* mkptr = mk; for (int jj=0; jjred; *(dest+1) = (unsigned char)nanColor->green; *(dest+2) = (unsigned char)nanColor->blue; } else { // bg *dest = (unsigned char)bgColor->red; *(dest+1) = (unsigned char)bgColor->green; *(dest+2) = (unsigned char)bgColor->blue; } } } CLEARSIGBUS // clean up delete [] mk; return img; } BBox FrameRGB::imageBBox(FrScale::ScanMode mode) { // returns imageBBox in IMAGE coords // and extends edge to edge updateRGBMatrices(); BBox rr; int first=1; for (int ii=0; ii<3; ii++) { if (context[ii].fits) { FitsImage* ptr = context[ii].fits; while (ptr) { FitsBound* params = ptr->getDataParams(mode); Matrix mm = ptr->wcsToRef() * rgb[ii] * dataToImage; Vector aa = Vector(params->xmin,params->ymin) * mm; if (first) { rr = BBox(aa,aa); first = 0; } else rr.bound(aa); rr.bound(Vector(params->xmax,params->ymin) * mm); rr.bound(Vector(params->xmax,params->ymax) * mm); rr.bound(Vector(params->xmin,params->ymax) * mm); ptr = ptr->nextMosaic(); } } } return rr; } void FrameRGB::loadRGBCube(MemType which, const char* fn, FitsImage* img) { if (!img || !img->isValid() || !(img->isImage() || img->isPost()) || (img->depth() != 3)) goto error; context[0].bfits_ = img; if (img->isPost()) which = POST; switch (which) { case ALLOC: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextAlloc(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextAlloc(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case ALLOCGZ: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextAllocGZ(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextAllocGZ(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case CHANNEL: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextChannel(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextChannel(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case MMAP: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextMMap(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextMMap(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case SMMAP: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextSMMap(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextSMMap(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case MMAPINCR: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextMMapIncr(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextMMapIncr(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case SHARE: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextShare(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextShare(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case SSHARE: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextSShare(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextSShare(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case SOCKET: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextSocket(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextSocket(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case SOCKETGZ: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextSocketGZ(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextSocketGZ(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case VAR: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextVar(&context[1], interp, fn, context[0].bfits_->fitsFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextVar(&context[2], interp, fn, context[1].bfits_->fitsFile(),3); break; case POST: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImageFitsNextPost(&context[1], interp, img, context[0].bfits_->baseFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImageFitsNextPost(&context[2], interp, img, context[1].bfits_->baseFile(),3); break; case PHOTO: if (context[0].bfits_ && context[0].bfits_->isValid()) context[1].bfits_ = new FitsImagePhotoCubeNext(&context[1], interp, fn, context[0].bfits_->baseFile(),2); if (context[1].bfits_ && context[1].bfits_->isValid()) context[2].bfits_ = new FitsImagePhotoCubeNext(&context[2], interp, fn, context[1].bfits_->baseFile(),3); break; default: // na break; } // is everything ok? if (context[0].bfits_ && context[0].bfits_->isValid() && (context[0].bfits_->isImage() || context[0].bfits_->isPost()) && context[1].bfits_ && context[1].bfits_->isValid() && (context[1].bfits_->isImage() || context[1].bfits_->isPost()) && context[2].bfits_ && context[2].bfits_->isValid() && (context[2].bfits_->isImage() || context[2].bfits_->isPost())) { loadRGBFinish(); return; } error: context[0].unload(); context[1].unload(); context[2].unload(); reset(); updateColorScale(); Tcl_AppendResult(interp, "Unable to load rgb cube file", NULL); result = TCL_ERROR; return; } void FrameRGB::loadRGBImage(MemType which, const char* fn, FitsImage* img) { FitsImage* r = img; FitsImage* g = NULL; FitsImage* b = NULL; if (!img || !img->isValid() || !(img->isImage() || img->isPost())) goto error; switch (which) { case ALLOC: if (r && r->isValid()) g = new FitsImageMosaicNextAlloc(&context[1], interp, fn, r->fitsFile(), FitsFile::NOFLUSH,1); if (g && g->isValid()) b = new FitsImageMosaicNextAlloc(&context[2], interp, fn, g->fitsFile(), FitsFile::NOFLUSH,1); break; case ALLOCGZ: if (r && r->isValid()) g = new FitsImageMosaicNextAllocGZ(&context[1], interp, fn, r->fitsFile(), FitsFile::NOFLUSH,1); if (g && g->isValid()) b = new FitsImageMosaicNextAllocGZ(&context[2], interp, fn, g->fitsFile(), FitsFile::NOFLUSH,1); break; case CHANNEL: if (r && r->isValid()) g = new FitsImageMosaicNextChannel(&context[1], interp, fn, r->fitsFile(), FitsFile::NOFLUSH,1); if (g && g->isValid()) b = new FitsImageMosaicNextChannel(&context[2], interp, fn, g->fitsFile(), FitsFile::NOFLUSH,1); break; case MMAP: if (r && r->isValid()) g = new FitsImageMosaicNextMMap(&context[1], interp, fn, r->fitsFile(),1); if (g && g->isValid()) b = new FitsImageMosaicNextMMap(&context[2], interp, fn, g->fitsFile(),1); break; case MMAPINCR: if (r && r->isValid()) g = new FitsImageMosaicNextMMapIncr(&context[1], interp, fn, r->fitsFile(),1); if (g && g->isValid()) b = new FitsImageMosaicNextMMapIncr(&context[2], interp, fn, g->fitsFile(),1); break; case SHARE: if (r && r->isValid()) g = new FitsImageMosaicNextShare(&context[1], interp, fn, r->fitsFile(),1); if (g && g->isValid()) b = new FitsImageMosaicNextShare(&context[2], interp, fn, g->fitsFile(),1); break; case SOCKET: if (r && r->isValid()) g = new FitsImageMosaicNextSocket(&context[1], interp, fn, r->fitsFile(), FitsFile::FLUSH,1); if (g && g->isValid()) b = new FitsImageMosaicNextSocket(&context[2], interp, fn,g->fitsFile(), FitsFile::FLUSH,1); break; case SOCKETGZ: if (r && r->isValid()) g = new FitsImageMosaicNextSocketGZ(&context[1], interp, fn, r->fitsFile(), FitsFile::FLUSH,1); if (g && g->isValid()) b = new FitsImageMosaicNextSocketGZ(&context[2], interp, fn, g->fitsFile(), FitsFile::FLUSH,1); break; case VAR: if (r && r->isValid()) g = new FitsImageMosaicNextVar(&context[1], interp, fn, r->fitsFile(),1); if (g && g->isValid()) b = new FitsImageMosaicNextVar(&context[2], interp, fn, g->fitsFile(),1); break; default: // na break; } // ok, figure out which is which channel context[0].bfits_ = context[1].bfits_ = context[2].bfits_ = NULL; { const char* ext = r->fitsFile()->extname(); if (ext) { if (!strncmp(ext,"RED",3)) context[0].bfits_ = r; else if (!strncmp(ext,"GREEN",3)) { context[1].bfits_ = r; r->setContext(&context[1]); } else if (!strncmp(ext,"BLUE",3)) { context[2].bfits_ = r; r->setContext(&context[2]); } else context[0].bfits_ = r; } else context[0].bfits_ = r; } { const char* ext = g->fitsFile()->extname(); if (ext) { if (!strncmp(ext,"RED",3)) { context[0].bfits_ = g; g->setContext(&context[0]); } else if (!strncmp(ext,"GREEN",3)) context[1].bfits_ = g; else if (!strncmp(ext,"BLUE",3)) { context[2].bfits_ = g; g->setContext(&context[3]); } else context[1].bfits_ = g; } else context[1].bfits_ = g; } { const char* ext = b->fitsFile()->extname(); if (ext) { if (!strncmp(ext,"RED",3)) { context[0].bfits_ = b; b->setContext(&context[0]); } else if (!strncmp(ext,"GREEN",3)) { context[1].bfits_ = b; b->setContext(&context[1]); } else if (!strncmp(ext,"BLUE",3)) context[2].bfits_ = b; else context[2].bfits_ = b; } else context[2].bfits_ = b; } // is everything ok? if (context[0].bfits_ && context[0].bfits_->isValid() && (context[0].bfits_->isImage() || context[0].bfits_->isPost()) && context[1].bfits_ && context[1].bfits_->isValid() && (context[1].bfits_->isImage() || context[1].bfits_->isPost()) && context[2].bfits_ && context[2].bfits_->isValid() && (context[2].bfits_->isImage() || context[2].bfits_->isPost())) { loadRGBFinish(); return; } error: context[0].unload(); context[1].unload(); context[2].unload(); reset(); updateColorScale(); Tcl_AppendResult(interp, "Unable to load rgb image file", NULL); result = TCL_ERROR; return; } void FrameRGB::loadRGBFinish() { for (int ii=0; ii<3; ii++) { context[ii].loadInit(1,NOMOSAIC,Coord::WCS); context[ii].loadFinish(); } channel = 0; currentContext = &context[channel]; keyContext = &context[channel]; keyContextSet =1; alignWCS(); if (!preservePan) { centerImage(); // cursor is in REF, crosshair in REF crosshair = cursor; } updateColorScale(); update(MATRIX); } void FrameRGB::pushMatrices() { for (int ii=0; ii<3; ii++) { FitsImage* ptr = context[ii].fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMatrices(rgb[ii], refToUser, userToWidget, widgetToCanvas, canvasToWindow); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } } void FrameRGB::pushMagnifierMatrices() { for (int ii=0; ii<3; ii++) { FitsImage* ptr = context[ii].fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updateMagnifierMatrices(refToMagnifier); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } } void FrameRGB::pushPannerMatrices() { for (int ii=0; ii<3; ii++) { FitsImage* ptr = context[ii].fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->updatePannerMatrices(refToPanner); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } } void FrameRGB::pushPSMatrices(float scale, int width, int height) { Matrix mx = psMatrix(scale, width, height); for (int kk=0; kk<3; kk++) if (context[kk].fits) { FitsImage* ptr = context[kk].cfits; while (ptr) { ptr->updatePS(mx); ptr = ptr->nextMosaic(); } } } void FrameRGB::reset() { for (int ii=0; ii<3; ii++) { bias[ii] = 0.5; contrast[ii] = 1.0; context[ii].frScale.resetScanMode(); context[ii].updateClip(); } Base::reset(); } void FrameRGB::rgbAlignWCS(int ii) { if (keyContext->fits && keyContext->fits->hasWCS(rgbSystem)) rgb[ii] = calcAlignWCS(keyContext->fits, context[ii].fits, rgbSystem, rgbSystem, Coord::FK5); if (DebugRGB) cerr << "rgbAlignWCS " << rgb[ii] << endl; } void FrameRGB::saveFitsRGBImageFileCmd(const char* fn) { if (keyContext->fits) { OutFitsFile str(fn); saveFitsRGBImage(str); } } void FrameRGB::saveFitsRGBImageChannelCmd(const char* ch) { if (keyContext->fits) { OutFitsChannel str(interp, ch); saveFitsRGBImage(str); } } void FrameRGB::saveFitsRGBImageSocketCmd(int ss) { if (keyContext->fits) { OutFitsSocket str(ss); saveFitsRGBImage(str); } } void FrameRGB::saveFitsRGBCubeFileCmd(const char* fn) { if (keyContext->fits) { OutFitsFile str(fn); saveFitsRGBCube(str); } } void FrameRGB::saveFitsRGBCubeChannelCmd(const char* ch) { if (keyContext->fits) { OutFitsChannel str(interp, ch); saveFitsRGBCube(str); } } void FrameRGB::saveFitsRGBCubeSocketCmd(int ss) { if (keyContext->fits) { OutFitsSocket str(ss); saveFitsRGBCube(str); } } void FrameRGB::saveArrayRGBCubeFileCmd(const char* fn, FitsFile::ArchType endian) { if (keyContext->fits) { OutFitsFile str(fn); saveArrayRGBCube(str, endian); } } void FrameRGB::saveArrayRGBCubeChannelCmd(const char* ch, FitsFile::ArchType endian) { if (keyContext->fits) { OutFitsChannel str(interp, ch); saveArrayRGBCube(str, endian); } } void FrameRGB::saveArrayRGBCubeSocketCmd(int ss, FitsFile::ArchType endian) { if (keyContext->fits) { OutFitsSocket str(ss); saveArrayRGBCube(str, endian); } } void FrameRGB::savePhotoCmd(const char* ph) { // need to determine size from key context FitsImage* fits = keyContext->fits; if (!fits) return; // check size FitsBound* params = fits->getDataParams(context->frScale.scanMode()); for (int kk=0; kk<3; kk++) { if (!view[kk] || !context[kk].fits) continue; FitsImage* ptr = context[kk].fits; FitsBound* pptr = ptr->getDataParams(context[kk].frScale.scanMode()); if (params->xmin != pptr->xmin || params->xmax != pptr->xmax || params->ymin != pptr->ymin || params->ymax != pptr->ymax) { internalError("All channels need to be same size."); return; } } // width,height int width = params->xmax - params->xmin; int height = params->ymax - params->ymin; // photo if (*ph == '\0') { Tcl_AppendResult(interp, "bad image name ", NULL); return; } Tk_PhotoHandle photo = Tk_FindPhoto(interp, ph); if (!photo) { Tcl_AppendResult(interp, "bad image handle ", NULL); return; } if (Tk_PhotoSetSize(interp, photo, width, height) != TCL_OK) { Tcl_AppendResult(interp, "bad photo set size ", NULL); return; } Tk_PhotoBlank(photo); Tk_PhotoImageBlock block; if (!Tk_PhotoGetImage(photo,&block)) { Tcl_AppendResult(interp, "bad image block ", NULL); return; } if (block.pixelSize<4) { Tcl_AppendResult(interp, "bad pixel size ", NULL); return; } // clear, set alpha channel unsigned char* dest = block.pixelPtr; for (long jj=0; jjsize() - 1; const unsigned char* table = colorScale[kk]->psColors(); // variable FitsImage* fits = context[kk].cfits; double ll = fits->low(); double hh = fits->high(); double diff = hh - ll; unsigned char* dest = block.pixelPtr; for (long jj=params->ymax-1; jj>=params->ymin; jj--) { for (long ii=params->xmin; iixmax; ii++, dest+=block.pixelSize) { double value = fits->getValueDouble(Vector(ii,jj)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) *(dest+block.offset[kk]) = table[0]; else if (value >= hh) *(dest+block.offset[kk]) = table[length]; else *(dest+block.offset[kk]) = table[(int)(((value - ll)/diff * length) + .5)]; } } } } CLEARSIGBUS if (Tk_PhotoPutBlock(interp, photo, &block, 0, 0, width, height, TK_PHOTO_COMPOSITE_SET) != TCL_OK) { Tcl_AppendResult(interp, "bad put block ", NULL); return; } } void FrameRGB::setBinCursor() { for (int ii=0; ii<3; ii++) if (context[ii].fits) context[ii].fits->setBinCursor(cursor); } void FrameRGB::updateColorCells(unsigned char* cells, int cnt) { if (DebugRGB) cerr << "updateColorCells" << endl; // the colorbar widget will pass us a pointer to the indexCells colorCount = cnt; // copy the rgb vales to the colorCells array (for postscript printing) if (colorCells) delete [] colorCells; colorCells = new unsigned char[cnt*3]; if (!colorCells) { internalError("Unable to Alloc colorCells"); return; } memcpy(colorCells, cells, cnt*3); } void FrameRGB::updateColorScale() { // we need colors before we can construct a scale if (!colorCells) return; if (DebugRGB) cerr << "updateColorScale" << endl; for (int ii=0; ii<3; ii++) { if (colorScale[ii]) delete colorScale[ii]; switch (context[ii].frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale[ii] = new LinearScaleRGB(ii, colorCount, colorCells, colorCount); break; case FrScale::LOGSCALE: colorScale[ii] = new LogScaleRGB(ii, SCALESIZE, colorCells, colorCount, context[ii].frScale.expo()); break; case FrScale::POWSCALE: colorScale[ii] = new PowScaleRGB(ii, SCALESIZE, colorCells, colorCount, context[ii].frScale.expo()); break; case FrScale::SQRTSCALE: colorScale[ii] = new SqrtScaleRGB(ii, SCALESIZE, colorCells, colorCount); break; case FrScale::SQUAREDSCALE: colorScale[ii] = new SquaredScaleRGB(ii, SCALESIZE, colorCells, colorCount); break; case FrScale::ASINHSCALE: colorScale[ii] = new AsinhScaleRGB(ii, SCALESIZE, colorCells, colorCount); break; case FrScale::SINHSCALE: colorScale[ii] = new SinhScaleRGB(ii, SCALESIZE, colorCells, colorCount); break; case FrScale::HISTEQUSCALE: colorScale[ii] = new HistEquScaleRGB(ii, SCALESIZE, colorCells, colorCount, context[ii].histequ(), HISTEQUSIZE); break; case FrScale::IISSCALE: // na break; } } } void FrameRGB::updateRGBMatrices() { // image,pysical,amplifier,detector are ok, check for wcs if (rgbSystem >= Coord::WCS) { for (int ii=0; ii<3; ii++) { if (context[ii].fits && !context[ii].fits->hasWCS(rgbSystem)) { // ok, don't have requested coordinate system // down grade to image rgbSystem = Coord::IMAGE; break; } } } // rgb align for (int ii=0; ii<3; ii++) { rgb[ii].identity(); if (context[ii].fits && keyContext->fits) { switch (rgbSystem) { case Coord::IMAGE: // nothing to do here break; case Coord::PHYSICAL: if (context[ii].fits != keyContext->fits) rgb[ii] = context[ii].fits->imageToPhysical * keyContext->fits->physicalToImage; break; case Coord::AMPLIFIER: if (context[ii].fits != keyContext->fits) rgb[ii] = context[ii].fits->imageToAmplifier * keyContext->fits->amplifierToImage; break; case Coord::DETECTOR: if (context[ii].fits != keyContext->fits) rgb[ii] = context[ii].fits->imageToDetector * keyContext->fits->detectorToImage; break; default: rgbAlignWCS(ii); break; } } if (DebugRGB) cerr << "rgb[" << ii << "] " << rgb[ii] << endl; } } void FrameRGB::unloadAllFits() { if (DebugPerf) cerr << "FrameRGB::unloadAllFits()" << endl; for (int ii=0; ii<3; ii++) { rgb[ii].identity(); context[ii].unload(); // always (for HISTEQU and LOG) updateColorScale(); } channel =0; currentContext = &context[channel]; keyContext = &context[channel]; keyContextSet =0; FrameBase::unloadFits(); } void FrameRGB::unloadFits() { if (DebugPerf) cerr << "FrameRGB::unloadFits()" << endl; rgb[channel].identity(); context[channel].unload(); // always (for HISTEQU and LOG) updateColorScale(); } // Commands void FrameRGB::getColorbarCmd() { ostringstream str; str << "rgb " << setiosflags(ios::fixed); for (int ii=0; ii<3; ii++) str << bias[ii] << ' '; for (int ii=0; ii<3; ii++) str << contrast[ii] << ' '; str << invert << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void FrameRGB::getInfoCmd(const Vector& vv, Coord::InternalSystem ref, char* var) { FrameBase::getInfoCmd(vv, ref, var); if (!currentContext->cfits) return; const char* array[3] = {"value,red","value,green","value,blue"}; SETSIGBUS for (int ii=0; ii<3; ii++) { // make sure we have an image FitsImage* sptr = context[ii].cfits; if (!sptr) continue; int mosaic = context[ii].isMosaic(); FitsBound* params = sptr->getDataParams(context[ii].frScale.scanMode()); do { Vector3d rr = mapToRef3d(vv,ref); Vector img = Vector(rr) * sptr->refToData; if (img[0]>=params->xmin && img[0]xmax && img[1]>=params->ymin && img[1]ymax) { Tcl_SetVar2(interp,var,array[ii],(char*)sptr->getValue(img),0); break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) params = sptr->getDataParams(context[ii].frScale.scanMode()); } } } while (mosaic && sptr); } CLEARSIGBUS } void FrameRGB::getRGBChannelCmd() { switch (channel) { case 0: Tcl_AppendResult(interp, "red", NULL); return; case 1: Tcl_AppendResult(interp, "green", NULL); return; case 2: Tcl_AppendResult(interp, "blue", NULL); return; } } void FrameRGB::getRGBSystemCmd() { printCoordSystem(rgbSystem); } void FrameRGB::getRGBViewCmd() { for (int ii=0; ii<3; ii++) Tcl_AppendElement(interp, view[ii] ? "1" : "0"); } void FrameRGB::getTypeCmd() { Tcl_AppendResult(interp, "rgb", NULL); } // RGBCube FITS void FrameRGB::loadRGBCubeAllocCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageFitsAlloc(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(ALLOC,fn,img); } void FrameRGB::loadRGBCubeAllocGZCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageFitsAllocGZ(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(ALLOCGZ,fn,img); } void FrameRGB::loadRGBCubeChannelCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageFitsChannel(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(CHANNEL,fn,img); } void FrameRGB::loadRGBCubeMMapCmd(const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsMMap(&context[0], interp, fn, 1); setScanModeIncr(lm); loadRGBCube(MMAP,fn,img); } void FrameRGB::loadRGBCubeSMMapCmd(const char* hdr, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsSMMap(&context[0], interp, hdr, fn, 1); setScanModeIncr(lm); loadRGBCube(SMMAP,fn,img); } void FrameRGB::loadRGBCubeMMapIncrCmd(const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsMMapIncr(&context[0], interp, fn, 1); setScanModeIncr(lm); loadRGBCube(MMAPINCR,fn,img); } void FrameRGB::loadRGBCubeShareCmd(ShmType type, int id, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsShare(&context[0], interp, type, id, fn, 1); setScanModeIncr(lm); loadRGBCube(SHARE,fn,img); } void FrameRGB::loadRGBCubeSShareCmd(ShmType type, int hdr, int id, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsSShare(&context[0], interp, type, hdr, id, fn, 1); setScanModeIncr(lm); loadRGBCube(SSHARE,fn,img); } void FrameRGB::loadRGBCubeSocketCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageFitsSocket(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBCube(SOCKET,fn,img); } void FrameRGB::loadRGBCubeSocketGZCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageFitsSocketGZ(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBCube(SOCKETGZ,fn,img); } void FrameRGB::loadRGBCubeVarCmd(const char* ch, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageFitsVar(&context[0], interp, ch, fn, 1); setScanModeIncr(lm); loadRGBCube(VAR,fn,img); } // RGBImage FITS void FrameRGB::loadRGBImageAllocCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageMosaicAlloc(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBImage(ALLOC,fn,img); } void FrameRGB::loadRGBImageAllocGZCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageMosaicAllocGZ(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBImage(ALLOCGZ,fn,img); } void FrameRGB::loadRGBImageChannelCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageMosaicChannel(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBImage(CHANNEL,fn,img); } void FrameRGB::loadRGBImageMMapCmd(const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageMosaicMMap(&context[0], interp, fn, 1); setScanModeIncr(lm); loadRGBImage(MMAP,fn,img); } void FrameRGB::loadRGBImageMMapIncrCmd(const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageMosaicMMapIncr(&context[0], interp, fn, 1); setScanModeIncr(lm); loadRGBImage(MMAPINCR,fn,img); } void FrameRGB::loadRGBImageShareCmd(ShmType type, int id, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageMosaicShare(&context[0], interp, type, id, fn, 1); setScanModeIncr(lm); loadRGBImage(SHARE,fn,img); } void FrameRGB::loadRGBImageSocketCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageMosaicSocket(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBImage(SOCKET,fn,img); } void FrameRGB::loadRGBImageSocketGZCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageMosaicSocketGZ(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBImage(SOCKETGZ,fn,img); } void FrameRGB::loadRGBImageVarCmd(const char* ch, const char* fn, LoadMethod lm) { unloadAllFits(); FitsImage* img = new FitsImageMosaicVar(&context[0], interp, ch, fn, 1); setScanModeIncr(lm); loadRGBImage(VAR,fn,img); } // RGBCube Array void FrameRGB::loadArrayRGBCubeAllocCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrAlloc(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(ALLOC,fn,img); } void FrameRGB::loadArrayRGBCubeAllocGZCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrAllocGZ(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(ALLOCGZ,fn,img); } void FrameRGB::loadArrayRGBCubeChannelCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrChannel(&context[0], interp, ch, fn, FitsFile::NOFLUSH, 1); loadRGBCube(CHANNEL,fn,img); } void FrameRGB::loadArrayRGBCubeMMapCmd(const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrMMap(&context[0], interp, fn, 1); loadRGBCube(MMAP,fn,img); } void FrameRGB::loadArrayRGBCubeMMapIncrCmd(const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrMMapIncr(&context[0], interp, fn, 1); loadRGBCube(MMAPINCR,fn,img); } void FrameRGB::loadArrayRGBCubeShareCmd(ShmType type, int id, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrShare(&context[0], interp, type, id, fn, 1); loadRGBCube(SHARE,fn,img); } void FrameRGB::loadArrayRGBCubeSocketCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrSocket(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBCube(SOCKET,fn,img); } void FrameRGB::loadArrayRGBCubeSocketGZCmd(int s, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrSocketGZ(&context[0], interp, s, fn, FitsFile::FLUSH, 1); loadRGBCube(SOCKETGZ,fn,img); } void FrameRGB::loadArrayRGBCubeVarCmd(const char* ch, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImageArrVar(&context[0], interp, ch, fn, 1); loadRGBCube(VAR,fn,img); } // RGBPhoto void FrameRGB::loadPhotoCmd(const char* ph, const char* fn) { unloadAllFits(); FitsImage* img = new FitsImagePhotoCube(&context[0], interp, ph, fn, 1); loadRGBCube(ALLOC,fn,img); } void FrameRGB::setRGBChannelCmd(const char* c) { if (!strncmp(c,"red",3)) channel = 0; else if (!strncmp(c,"gre",3)) channel = 1; else if (!strncmp(c,"blu",3)) channel = 2; else channel = 0; currentContext = &context[channel]; // execute any update callbacks updateCBMarkers(&userMarkers); updateCBMarkers(&catalogMarkers); updateCBMarkers(&analysisMarkers); // always update update(BASE); } void FrameRGB::setRGBSystemCmd(Coord::CoordSystem sys) { rgbSystem = sys; // save current matrix Matrix old[3]; for (int ii=0; ii<3; ii++) old[ii] = rgb[ii]; alignWCS(); // fix any contours for(int ii=0; ii<3; ii++) if (context[ii].contour) { Matrix mm = old[ii].invert() * rgb[ii]; context[ii].contour->updateCoords(mm); } update(MATRIX); } void FrameRGB::setRGBViewCmd(int r, int g, int b) { view[0] = r ? 1 : 0; view[1] = g ? 1 : 0; view[2] = b ? 1 : 0; update(BASE); // always update } saods9/tksao1.0/frame/framergb.h000644 000765 000000 00000011174 12464214756 016773 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framergb_h__ #define __framergb_h__ #include "context.h" #include "framebase.h" #include "colorscalergb.h" // Frame class FrameRGB : public virtual FrameBase { protected: int channel; // current channel Coord::CoordSystem rgbSystem; // alignment coordinate system Matrix rgb[3]; // rgb matrix int view[3]; // visible channels float bias[3]; // current colormap bias float contrast[3]; // current colormap contrast ColorScaleRGB* colorScale[3]; // current color scale int colorCount; // number of dynamic colors unsigned char* colorCells; // current color values private: void alignWCS(); void alignWCS(Coord::CoordSystem, Coord::SkyFrame); void alignWCS(FitsImage*, Coord::CoordSystem); int doRender(); BBox imageBBox(FrScale::ScanMode); void loadRGBCube(MemType, const char*, FitsImage*); void loadRGBImage(MemType, const char*, FitsImage*); void loadRGBFinish(); void reset(); void rgbAlignWCS(int); void setBinCursor(); void setKeyFits(); void unloadFits(); void pushMatrices(); void pushMagnifierMatrices(); void pushPannerMatrices(); void pushPSMatrices(float, int, int); void updateRGBMatrices(); protected: int isFrameRGB() {return 1;} unsigned char* fillImage(int, int, Coord::InternalSystem); void updateColorCells(unsigned char*, int); void updateColorScale(); void unloadAllFits(); int validColorScale() {return colorScale[0] && colorScale[1] && colorScale[2];} public: FrameRGB(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~FrameRGB(); void getColorbarCmd(); void getInfoCmd(const Vector&, Coord::InternalSystem, char*); void getRGBChannelCmd(); void getRGBSystemCmd(); void getRGBViewCmd(); void getTypeCmd(); void iisCmd(int, int) {} void iisEraseCmd() {} void iisGetCmd(char*, int, int, int, int) {} void iisSetCmd(const char*, int, int, int, int) {} void iisWCSCmd(const Matrix&, const Vector&, int) {} void loadPhotoCmd(const char*, const char*); void loadSlicePhotoCmd(const char*, const char*) {} void loadRGBCubeAllocCmd(const char*, const char*); void loadRGBCubeAllocGZCmd(const char*, const char*); void loadRGBCubeChannelCmd(const char*, const char*); void loadRGBCubeMMapCmd(const char*, LoadMethod); void loadRGBCubeSMMapCmd(const char*, const char*, LoadMethod); void loadRGBCubeMMapIncrCmd(const char*, LoadMethod); void loadRGBCubeShareCmd(ShmType, int, const char*, LoadMethod); void loadRGBCubeSShareCmd(ShmType, int, int, const char*, LoadMethod); void loadRGBCubeSocketCmd(int, const char*); void loadRGBCubeSocketGZCmd(int, const char*); void loadRGBCubeVarCmd(const char*, const char*, LoadMethod); void loadRGBImageAllocCmd(const char*, const char*); void loadRGBImageAllocGZCmd(const char*, const char*); void loadRGBImageChannelCmd(const char*, const char*); void loadRGBImageMMapCmd(const char*, LoadMethod); void loadRGBImageMMapIncrCmd(const char*, LoadMethod); void loadRGBImageShareCmd(ShmType, int, const char*, LoadMethod); void loadRGBImageSocketCmd(int, const char*); void loadRGBImageSocketGZCmd(int, const char*); void loadRGBImageVarCmd(const char*, const char*, LoadMethod); void loadArrayRGBCubeAllocCmd(const char*, const char*); void loadArrayRGBCubeAllocGZCmd(const char*, const char*); void loadArrayRGBCubeChannelCmd(const char*, const char*); void loadArrayRGBCubeMMapCmd(const char*); void loadArrayRGBCubeMMapIncrCmd(const char*); void loadArrayRGBCubeShareCmd(ShmType, int, const char*); void loadArrayRGBCubeSocketCmd(int, const char*); void loadArrayRGBCubeSocketGZCmd(int, const char*); void loadArrayRGBCubeVarCmd(const char*, const char*); void saveFitsRGBImage(OutFitsStream&); void saveFitsRGBImageFileCmd(const char*); void saveFitsRGBImageChannelCmd(const char*); void saveFitsRGBImageSocketCmd(int); void saveFitsRGBCube(OutFitsStream&); void saveFitsRGBCubeFileCmd(const char*); void saveFitsRGBCubeChannelCmd(const char*); void saveFitsRGBCubeSocketCmd(int); void saveArrayRGBCube(OutFitsStream&, FitsFile::ArchType); void saveArrayRGBCubeFileCmd(const char*, FitsFile::ArchType); void saveArrayRGBCubeChannelCmd(const char*, FitsFile::ArchType); void saveArrayRGBCubeSocketCmd(int, FitsFile::ArchType); void savePhotoCmd(const char*); void setRGBChannelCmd(const char*); void setRGBViewCmd(int, int, int); void setRGBSystemCmd(Coord::CoordSystem); }; #endif saods9/tksao1.0/frame/framergbtruecolor.C000644 000765 000000 00000016071 12620173717 020661 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "framergbtruecolor.h" #include "fitsimage.h" #include "ps.h" #include "sigbus.h" FrameRGBTrueColor::FrameRGBTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameRGB(i,c,item), FrameTrue(i,c,item) { for (int kk=0; kk<3; kk++) colormapData[kk] = NULL; } FrameRGBTrueColor::~FrameRGBTrueColor() { for (int kk=0; kk<3; kk++) if (colormapData[kk]) delete [] colormapData[kk]; } void FrameRGBTrueColor::buildXImage(XImage* ximage, Coord::InternalSystem sys) { // we need a colorScale before we can render if (!validColorScale()) return; unsigned char* img = fillImage(ximage->width, ximage->height, sys); if (img) { encodeTrueColor(img, ximage); delete [] img; } } // Commands void FrameRGBTrueColor::colormapCmd(float rb, float gb, float bb, float rc, float gc, float bc, int i, unsigned char* cells, int cnt) { bias[0] = rb; bias[1] = gb; bias[2] = bb; contrast[0] = rc; contrast[1] = gc; contrast[2] = bc; invert = i; updateColorCells(cells, cnt); updateColorScale(); update(BASE); } void FrameRGBTrueColor::colormapBeginCmd() { // we need a colorScale before we can render if (!validColorScale()) return; // we need some fits data // we assume the colorScale length will not change during motion calls if (!context[0].fits && !context[1].fits && !context[2].fits) return; int width = options->width; int height = options->height; // Create XImage if (!(colormapXM = XGetImage(display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap))) { internalError("Unable to Create Colormap XImage"); return; } // Create Pixmap colormapPM = Tk_GetPixmap(display, Tk_WindowId(tkwin), width, height, depth); if (!colormapPM) { internalError("Unable to Create Colormap Pixmap"); return; } // colormapGCXOR colormapGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); // Create table index array for (int kk=0; kk<3; kk++) { if (colormapData[kk]) delete [] colormapData[kk]; colormapData[kk] = new long[width*height]; if (!colormapData[kk]) { internalError("Unable to alloc tmp data array"); return; } } SETSIGBUS // fill data array for (int kk=0; kk<3; kk++) { if (!view[kk] || !context[kk].fits) continue; // basics int length = colorScale[kk]->size() - 1; FitsImage* sptr = context[kk].cfits; int mosaic = context[kk].isMosaic(); // variable double* mm = sptr->matrixToData(Coord::WIDGET).mm(); FitsBound* params = sptr->getDataParams(context[kk].frScale.scanMode()); int srcw = sptr->width(); double ll = sptr->low(); double hh = sptr->high(); double diff = hh - ll; // main loop long* dest = colormapData[kk]; for (long jj=0; jjmatrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(context[kk].frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { double value = sptr->getValueDouble(long(yy)*srcw + long(xx)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) *dest = 0; else if (value >= hh) *dest = length; else *dest = (int)(((value - ll)/diff * length) + .5); } else *dest = -1; // nan break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(context[kk].frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } } } } while (mosaic && sptr); } } } CLEARSIGBUS } void FrameRGBTrueColor::colormapEndCmd() { if (colormapXM) { XDestroyImage(colormapXM); colormapXM = NULL; } if (colormapPM) { Tk_FreePixmap(display, colormapPM); colormapPM = 0; } if (colormapGCXOR) { XFreeGC(display, colormapGCXOR); colormapGCXOR = 0; } for (int kk=0; kk<3; kk++) if (colormapData[kk]) { delete [] colormapData[kk]; colormapData[kk] = NULL; } update(BASE); // always update } void FrameRGBTrueColor::colormapMotionCmd(float rb, float gb, float bb, float rc, float gc, float bc, int i, unsigned char* cells, int cnt) { // we need a colorScale before we can render if (!validColorScale()) return; // first check for change if (bias[0] == rb && bias[1] == gb && bias[2] == bb && contrast[0] == rc && contrast[1] == gc && contrast[2] == bc && invert == i && colorCells) return; // we got a change bias[0] = rb; bias[1] = gb; bias[2] = bb; contrast[0] = rc; contrast[1] = gc; contrast[2] = bc; invert = i; updateColorCells(cells, cnt); updateColorScale(); // special case if ((!view[0] || !context[0].fits) && (!view[1] || !context[1].fits) && (!view[2] || !context[2].fits)) return; int& width = colormapXM->width; int& height = colormapXM->height; // create img unsigned char* img = new unsigned char[width*height*3]; memset(img, 0, width*height*3); char* mk = new char[width*height]; memset(mk, 0, width*height); for (int kk=0; kk<3; kk++) { if (!view[kk] || !context[kk].fits) continue; const unsigned char* table = colorScale[kk]->psColors(); long* src = colormapData[kk]; unsigned char* dest = img; char* mptr = mk; for (long jj=0; jj= 0) { memcpy(dest+kk, table+(*src), 1); *mptr = 2; } else if (*src == -1 && *mptr < 2) *mptr = 1; } // set remainder to bg { unsigned char* dest = img; char* mptr = mk; for (long jj=0; jjred; *(dest+1) = (unsigned char)nanColor->green; *(dest+2) = (unsigned char)nanColor->blue; } else { // bg *(dest ) = (unsigned char)bgColor->red; *(dest+1) = (unsigned char)bgColor->green; *(dest+2) = (unsigned char)bgColor->blue; } } // build colormapXM encodeTrueColor((unsigned char*)img, colormapXM); // clean up if (img) delete [] img; if (mk) delete [] mk; // XImage to Pixmap TkPutImage(NULL, 0, display, colormapPM, Widget::gc, colormapXM, 0, 0, 0, 0, width, height); // Display Pixmap Vector dd = Vector() * widgetToWindow; XCopyArea(display, colormapPM, Tk_WindowId(tkwin), colormapGCXOR, 0, 0, width, height, dd[0], dd[1]); // update panner updatePanner(); } saods9/tksao1.0/frame/framergbtruecolor.h000644 000765 000000 00000001512 12464214756 020725 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framergbtruecolor_h__ #define __framergbtruecolor_h__ #include "framergb.h" #include "frametrue.h" class FrameRGBTrueColor : public virtual FrameBase, public FrameRGB, public FrameTrue { protected: long* colormapData[3]; // preextract data private: void buildXImage(XImage*, Coord::InternalSystem); public: FrameRGBTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~FrameRGBTrueColor(); void colormapCmd(float, float, float, float, float, float, int, unsigned char*, int); void colormapBeginCmd(); void colormapEndCmd(); void colormapMotionCmd(float, float, float, float, float, float, int, unsigned char*, int); }; #endif saods9/tksao1.0/frame/framergbtruecolor16.C000644 000765 000000 00000007322 12464214756 021034 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "framergbtruecolor16.h" #include "fitsimage.h" // Tk Canvas Widget Function Declarations int FrameRGBTrueColor16CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameRGBTrueColor16 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameRGBTrueColor16Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "framergb", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameRGBTrueColor16Type = { (char*)"framergbtruecolor16", // name sizeof(WidgetOptions), // item size FrameRGBTrueColor16CreateProc, // configProc frameRGBTrueColor16Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameRGBTrueColor16_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameRGBTrueColor16Type); return TCL_OK; } int FrameRGBTrueColor16CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameRGBTrueColor16* frame = new FrameRGBTrueColor16(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameRGBTrueColor16 Member Functions FrameRGBTrueColor16::FrameRGBTrueColor16(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameRGBTrueColor(i,c,item), TrueColor16(visual) { configSpecs = frameRGBTrueColor16Specs; // frame configure options } FrameRGBTrueColor16::~FrameRGBTrueColor16() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } saods9/tksao1.0/frame/framergbtruecolor16.h000644 000765 000000 00000001324 12464214756 021075 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framergbtruecolor16_h__ #define __framergbtruecolor16_h__ #include "framergbtruecolor.h" #include "truecolor16.h" class FrameRGBTrueColor16 : public virtual FrameBase, public FrameRGBTrueColor, public TrueColor16 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor16::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor16::encodeTrueColor(src, ximage);} public: FrameRGBTrueColor16(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameRGBTrueColor16(); }; #endif saods9/tksao1.0/frame/framergbtruecolor24.C000644 000765 000000 00000007324 12464214756 021035 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "framergbtruecolor24.h" #include "fitsimage.h" // Tk Canvas Widget Function Declarations int FrameRGBTrueColor24CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameRGBTrueColor24 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameRGBTrueColor24Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "framergb", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameRGBTrueColor24Type = { (char*)"framergbtruecolor24", // name sizeof(WidgetOptions), // item size FrameRGBTrueColor24CreateProc, // configProc frameRGBTrueColor24Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameRGBTrueColor24_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameRGBTrueColor24Type); return TCL_OK; } int FrameRGBTrueColor24CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameRGBTrueColor24* frame = new FrameRGBTrueColor24(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameRGBTrueColor24 Member Functions FrameRGBTrueColor24::FrameRGBTrueColor24(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameRGBTrueColor(i, c, item), TrueColor24(visual) { configSpecs = frameRGBTrueColor24Specs; // frame configure options } FrameRGBTrueColor24::~FrameRGBTrueColor24() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } saods9/tksao1.0/frame/framergbtruecolor24.h000644 000765 000000 00000001324 12464214756 021074 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framergbtruecolor24_h__ #define __framergbtruecolor24_h__ #include "framergbtruecolor.h" #include "truecolor24.h" class FrameRGBTrueColor24 : public virtual FrameBase, public FrameRGBTrueColor, public TrueColor24 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor24::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor24::encodeTrueColor(src, ximage);} public: FrameRGBTrueColor24(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameRGBTrueColor24(); }; #endif saods9/tksao1.0/frame/framergbtruecolor8.C000644 000765 000000 00000007275 12464214756 020764 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "framergbtruecolor8.h" #include "fitsimage.h" // Tk Canvas Widget Function Declarations int FrameRGBTrueColor8CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameRGBTrueColor8 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameRGBTrueColor8Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "framergb", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameRGBTrueColor8Type = { (char*)"framergbtruecolor8", // name sizeof(WidgetOptions), // item size FrameRGBTrueColor8CreateProc, // configProc frameRGBTrueColor8Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameRGBTrueColor8_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameRGBTrueColor8Type); return TCL_OK; } int FrameRGBTrueColor8CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameRGBTrueColor8* frame = new FrameRGBTrueColor8(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameRGBTrueColor8 Member Functions FrameRGBTrueColor8::FrameRGBTrueColor8(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameRGBTrueColor(i,c,item), TrueColor8(visual) { configSpecs = frameRGBTrueColor8Specs; // frame configure options } FrameRGBTrueColor8::~FrameRGBTrueColor8() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } saods9/tksao1.0/frame/framergbtruecolor8.h000644 000765 000000 00000001313 12464214756 021014 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __framergbtruecolor8_h__ #define __framergbtruecolor8_h__ #include "framergbtruecolor.h" #include "truecolor8.h" class FrameRGBTrueColor8 : public virtual FrameBase, public FrameRGBTrueColor, public TrueColor8 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor8::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor8::encodeTrueColor(src, ximage);} public: FrameRGBTrueColor8(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameRGBTrueColor8(); }; #endif saods9/tksao1.0/frame/frametrue.C000644 000765 000000 00000004126 12544335553 017130 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "frametrue.h" FrameTrue::FrameTrue(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i, c, item) { colormapXM = NULL; colormapPM = 0; colormapGCXOR = 0; byteorder_ = 0; bitsperpixel_ = 0; } FrameTrue::~FrameTrue() { if (colormapXM) XDestroyImage(colormapXM); if (colormapPM) Tk_FreePixmap(display, colormapPM); if (colormapGCXOR) XFreeGC(display, colormapGCXOR); } void FrameTrue::rotateMotion() { // Rotate from src to dest Vector cc = Vector(options->width,options->height)/2; Matrix m = (Translate(-cc) * Rotate(rotation-rotateRotation) * Translate(cc)).invert(); double* mm = m.mm(); int& width = options->width; int& height = options->height; char* src = rotateSrcXM->data; int bytesPerPixel = rotateDestXM->bits_per_pixel/8; for (int j=0; jdata + j*rotateDestXM->bytes_per_line; memset(dest,0,rotateDestXM->bytes_per_line); for (int i=0; i= 0 && x < width && y >= 0 && y < height) { #if MAC_OSX_TK // I really don't understand this char* sptr = src + ((int)y)*rotateDestXM->bytes_per_line+ ((int)x)*bytesPerPixel; *(dest+0) = *(sptr+3); *(dest+1) = *(sptr+0); *(dest+2) = *(sptr+1); *(dest+3) = *(sptr+2); #else memcpy(dest, src + ((int)y)*rotateDestXM->bytes_per_line + ((int)x)*bytesPerPixel, bytesPerPixel); #endif } else memcpy(dest, bgTrueColor_, bytesPerPixel); } } // XImage to Pixmap TkPutImage(NULL, 0, display, rotatePM, gc, rotateDestXM, 0, 0, 0, 0, options->width, options->height); // Display Pixmap Vector dd = Vector() * widgetToWindow; XCopyArea(display, rotatePM, Tk_WindowId(tkwin), rotateGCXOR, 0, 0, options->width, options->height, dd[0], dd[1]); } saods9/tksao1.0/frame/frametrue.h000644 000765 000000 00000001446 12464214756 017201 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametrue_h__ #define __frametrue_h__ #include "framebase.h" class FrameTrue : public virtual FrameBase { protected: XImage* colormapXM; // rotate dest ximage Pixmap colormapPM; // rotate pixmap GC colormapGCXOR; // GC for interactive rotation int byteorder_; int bitsperpixel_; protected: void encodeTrueColor(int oo, int bb) {byteorder_ = oo; bitsperpixel_ = bb;} virtual void encodeTrueColor(XColor*, char*) =0; virtual void encodeTrueColor(unsigned char*, XImage*) =0; void rotateMotion(); public: FrameTrue(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~FrameTrue(); }; #endif saods9/tksao1.0/frame/frametruecolor.C000644 000765 000000 00000024132 12620173717 020163 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "frametruecolor.h" #include "fitsimage.h" #include "ps.h" #include "sigbus.h" FrameTrueColor::FrameTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), Frame(i,c,item), FrameTrue(i,c,item) { colormapData =NULL; } FrameTrueColor::~FrameTrueColor() { if (colormapData) delete [] colormapData; } unsigned char* FrameTrueColor::blend(unsigned char* src, unsigned char* msk, int width, int height) { unsigned char* sptr = src; // 3 component unsigned char* mptr = msk; // 4 component, premultiplied for (int jj=0; jjwidth, ximage->height, sys); if (img) { encodeTrueColor(img, ximage); delete [] img; } } void FrameTrueColor::colormapCmd(int id, float b, float c, int i, unsigned short* index, unsigned char* cells, int cnt) { cmapID = id; bias = b; contrast = c; invert = i; updateColorCells(index, cells, cnt); updateColorScale(); update(BASE); } void FrameTrueColor::colormapBeginCmd() { // we need a colorScale before we can render if (!validColorScale()) return; // we need some fits data // we assume the colorScale length will not change during motion calls if (!context->cfits) return; int width = options->width; int height = options->height; // Create XImage if (!(colormapXM = XGetImage(display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap))) { internalError("Unable to Create Colormap XImage"); return; } // Create Pixmap colormapPM = Tk_GetPixmap(display, Tk_WindowId(tkwin), width, height, depth); if (!colormapPM) { internalError("Unable to Create Colormap Pixmap"); return; } // colormapGCXOR colormapGCXOR = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); // Create table index array if (colormapData) delete [] colormapData; colormapData = new long[width*height]; if (!colormapData) { internalError("Unable to alloc tmp data array"); return; } // fill data array // basics int bytesPerPixel = colormapXM->bits_per_pixel/8; int length = colorScale->size() - 1; int last = length * bytesPerPixel; FitsImage* sptr = context->cfits; int mosaic = isMosaic(); long* dest = colormapData; // variable double* mm = sptr->matrixToData(Coord::WIDGET).mm(); FitsBound* params = sptr->getDataParams(context->frScale.scanMode()); int srcw = sptr->width(); double ll = sptr->low(); double hh = sptr->high(); double diff = hh - ll; // main loop SETSIGBUS for (long jj=0; jjcfits; mm = sptr->matrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { double value = sptr->getValueDouble(long(yy)*srcw + long(xx)); if (isfinite(diff) && isfinite(value)) { if (value <= ll) *dest = 0; else if (value >= hh) *dest = last; else *dest = (int)(((value - ll)/diff * length) + .5)*bytesPerPixel; } else *dest = -1; break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); ll = sptr->low(); hh = sptr->high(); diff = hh - ll; } } } } while (mosaic && sptr); } } CLEARSIGBUS } void FrameTrueColor::colormapMotionCmd(int id, float b, float c, int i, unsigned short* index, unsigned char* cells, int cnt) { // we need a colorScale before we can render if (!validColorScale()) return; // first check for change if (cmapID == id && bias == b && contrast == c && invert == i && colorCells) return; // we got a change cmapID = id; bias = b; contrast = c; invert = i; updateColorCells(index, cells, cnt); updateColorScale(); // if we have no data, stop now if (!context->cfits) return; // clear ximage int& width = colormapXM->width; int& height = colormapXM->height; char* data = colormapXM->data; int bytesPerPixel = colormapXM->bits_per_pixel/8; int& bytesPerLine = colormapXM->bytes_per_line; const unsigned char* table = colorScale->colors(); long* src = colormapData; for (long jj=0; jjmask.head()) { FitsMask* mptr = context->mask.tail(); while (mptr) { unsigned char* msk = fillMask(mptr, width, height, sys); blend(img,msk,width,height); delete [] msk; mptr = mptr->previous(); } } } return img; } unsigned char* FrameTrueColor::fillMask(FitsMask* msk, int width, int height, Coord::InternalSystem sys) { FitsImage* currentMsk = msk->current(); XColor* maskColor = msk->color(); int mark = msk->mark(); // img unsigned char* img = new unsigned char[width*height*4]; memset(img,0,width*height*4); if (!currentMsk) return img; // basics FitsImage* sptr = currentMsk; int mosaic = isMosaic(); // variable double* mm = sptr->matrixToData(sys).mm(); FitsBound* params = sptr->getDataParams(context->frScale.scanMode()); int srcw = sptr->width(); // main loop unsigned char* dest = img; SETSIGBUS for (long jj=0; jjmatrixToData(sys).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); } do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { int value = sptr->getValueMask(long(yy)*srcw + long(xx)); if ((mark && value) || (!mark && !value)) { *dest = ((unsigned char)maskColor->red)*maskAlpha; *(dest+1) = ((unsigned char)maskColor->green)*maskAlpha; *(dest+2) = ((unsigned char)maskColor->blue)*maskAlpha; *(dest+3) = 1; } break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(sys).mm(); params = sptr->getDataParams(context->frScale.scanMode()); srcw = sptr->width(); } } } } while (mosaic && sptr); } } CLEARSIGBUS return img; } void FrameTrueColor::pushMatrices() { Base::pushMatrices(); // alway identity Matrix rgbToRef; // now any masks FitsMask* msk = currentContext->mask.tail(); while (msk) { FitsImage* mskimg = msk->mask(); while (mskimg) { FitsImage* sptr = mskimg; while (sptr) { sptr->updateMatrices(rgbToRef, refToUser, userToWidget, widgetToCanvas, canvasToWindow); sptr = sptr->nextSlice(); } mskimg = mskimg->nextMosaic(); } msk = msk->previous(); } } void FrameTrueColor::pushMagnifierMatrices() { Base::pushMagnifierMatrices(); FitsMask* msk = context->mask.tail(); while (msk) { FitsImage* mskimg = msk->mask(); while (mskimg) { FitsImage* sptr = mskimg; while (sptr) { sptr->updateMagnifierMatrices(refToMagnifier); sptr = sptr->nextSlice(); } mskimg = mskimg->nextMosaic(); } msk = msk->previous(); } } void FrameTrueColor::pushPannerMatrices() { Base::pushPannerMatrices(); FitsMask* msk = context->mask.tail(); while (msk) { FitsImage* mskimg = msk->mask(); while (mskimg) { FitsImage* sptr = mskimg; while (sptr) { sptr->updatePannerMatrices(refToPanner); sptr = sptr->nextSlice(); } mskimg = mskimg->nextMosaic(); } msk = msk->previous(); } } void FrameTrueColor::pushPSMatrices(float scale, int width, int height) { Base::pushPSMatrices(scale, width, height); Matrix mx = psMatrix(scale, width, height); FitsMask* msk = context->mask.tail(); while (msk) { FitsImage* ptr = msk->current(); while (ptr) { ptr->updatePS(mx); ptr = ptr->nextMosaic(); } msk = msk->previous(); } } saods9/tksao1.0/frame/frametruecolor.h000644 000765 000000 00000002126 12464214756 020234 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametruecolor_h__ #define __frametruecolor_h__ #include "frame.h" #include "frametrue.h" class FrameTrueColor : public virtual FrameBase, public Frame, public FrameTrue { protected: long* colormapData; private: unsigned char* blend(unsigned char*, unsigned char*, int, int); void buildXImage(XImage*, Coord::InternalSystem); unsigned char* fillImage(int, int, Coord::InternalSystem); unsigned char* fillMask(FitsMask*, int, int, Coord::InternalSystem); void pushMatrices(); void pushMagnifierMatrices(); void pushPannerMatrices(); void pushPSMatrices(float, int, int); public: FrameTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~FrameTrueColor(); void colormapCmd(int, float, float, int, unsigned short*, unsigned char*, int); void colormapBeginCmd(); void colormapMotionCmd(int, float, float, int, unsigned short*, unsigned char*, int); void colormapEndCmd(); }; #endif saods9/tksao1.0/frame/frametruecolor16.C000644 000765 000000 00000012635 12464214756 020344 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frametruecolor16.h" #include "colorscaletrue16.h" // Tk Canvas Widget Function Declarations int FrameTrueColor16CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameTrueColor16 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameTrueColor16Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameTrueColor16Type = { (char*)"frametruecolor16", // name sizeof(WidgetOptions), // item size FrameTrueColor16CreateProc, // configProc frameTrueColor16Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameTrueColor16_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameTrueColor16Type); return TCL_OK; } int FrameTrueColor16CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameTrueColor16* frame = new FrameTrueColor16(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameTrueColor16 Member Functions FrameTrueColor16::FrameTrueColor16(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameTrueColor(i,c,item), TrueColor16(visual) { configSpecs = frameTrueColor16Specs; // frame configure options } FrameTrueColor16::~FrameTrueColor16() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void FrameTrueColor16::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells) return; if (colorScale) delete colorScale; switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor16(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor16(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor16(indexCells, colorCells, colorCount, visual, byteorder_); break; } } saods9/tksao1.0/frame/frametruecolor16.h000644 000765 000000 00000001327 12464214756 020405 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametruecolor16_h__ #define __frametruecolor16_h__ #include "frametruecolor.h" #include "truecolor16.h" class FrameTrueColor16 : public virtual FrameBase, public FrameTrueColor, public TrueColor16 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor16::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor16::encodeTrueColor(src, ximage);} void updateColorScale(); public: FrameTrueColor16(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameTrueColor16(); }; #endif saods9/tksao1.0/frame/frametruecolor24.C000644 000765 000000 00000016511 12464214756 020340 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frametruecolor24.h" #include "colorscaletrue24.h" #include "colorscaletrue32.h" // Tk Canvas Widget Function Declarations int FrameTrueColor24CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameTrueColor24 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameTrueColor24Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameTrueColor24Type = { (char*)"frametruecolor24", // name sizeof(WidgetOptions), // item size FrameTrueColor24CreateProc, // configProc frameTrueColor24Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameTrueColor24_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameTrueColor24Type); return TCL_OK; } int FrameTrueColor24CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameTrueColor24* frame = new FrameTrueColor24(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameTrueColor24 Member Functions FrameTrueColor24::FrameTrueColor24(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameTrueColor(i,c,item), TrueColor24(visual) { configSpecs = frameTrueColor24Specs; // frame configure options } FrameTrueColor24::~FrameTrueColor24() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void FrameTrueColor24::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells || !bitsperpixel_) return; if (colorScale) delete colorScale; // determine if we have 3 bytes or 4 bytes per pixel switch (bitsperpixel_) { case 24: updateColorScale24(); break; case 32: updateColorScale32(); break; } } void FrameTrueColor24::updateColorScale24() { switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor24(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor24(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor24(indexCells, colorCells, colorCount, visual, byteorder_); break; } } void FrameTrueColor24::updateColorScale32() { switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor32(colorCount, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual, byteorder_); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, visual, byteorder_); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor32(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual, byteorder_); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor32(indexCells, colorCells, colorCount, visual, byteorder_); break; } } saods9/tksao1.0/frame/frametruecolor24.h000644 000765 000000 00000001421 12464214756 020377 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametruecolor24_h__ #define __frametruecolor24_h__ #include "frametruecolor.h" #include "truecolor24.h" class FrameTrueColor24 : public virtual FrameBase, public FrameTrueColor, public TrueColor24 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor24::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor24::encodeTrueColor(src, ximage);} void updateColorScale(); void updateColorScale24(); void updateColorScale32(); public: FrameTrueColor24(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameTrueColor24(); }; #endif saods9/tksao1.0/frame/frametruecolor8.C000644 000765 000000 00000012473 12464214756 020265 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frametruecolor8.h" #include "colorscaletrue8.h" // Tk Canvas Widget Function Declarations int FrameTrueColor8CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // FrameTrueColor8 Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec frameTrueColor8Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "frame", Tk_Offset(WidgetOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(WidgetOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(WidgetOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(WidgetOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "512", Tk_Offset(WidgetOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(WidgetOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(WidgetOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(WidgetOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(WidgetOptions, times), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType frameTrueColor8Type = { (char*)"frametruecolor8", // name sizeof(WidgetOptions), // item size FrameTrueColor8CreateProc, // configProc frameTrueColor8Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc WidgetICursorProc, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int FrameTrueColor8_Init(Tcl_Interp* interp) { Tk_CreateItemType(&frameTrueColor8Type); return TCL_OK; } int FrameTrueColor8CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { FrameTrueColor8* frame = new FrameTrueColor8(interp, canvas, item); // and set default configuration if (frame->configure(argc, (const char**)argv, 0) != TCL_OK) { delete frame; Tcl_AppendResult(interp, " error occured while creating frame.", NULL); return TCL_ERROR; } return TCL_OK; } // FrameTrueColor8 Member Functions FrameTrueColor8::FrameTrueColor8(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : FrameBase(i,c,item), FrameTrueColor(i,c,item), TrueColor8(visual) { configSpecs = frameTrueColor8Specs; // frame configure options } FrameTrueColor8::~FrameTrueColor8() { // we must do this at this level, because updateColorScale is called unloadAllFits(); } void FrameTrueColor8::updateColorScale() { // we need colors before we can construct a scale if (!indexCells || !colorCells) return; if (colorScale) delete colorScale; switch (context->frScale.colorScaleType()) { case FrScale::LINEARSCALE: colorScale = new LinearScaleTrueColor8(colorCount, indexCells, colorCells, colorCount, visual); break; case FrScale::LOGSCALE: colorScale = new LogScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual); break; case FrScale::POWSCALE: colorScale = new PowScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->frScale.expo(), visual); break; case FrScale::SQRTSCALE: colorScale = new SqrtScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::SQUAREDSCALE: colorScale = new SquaredScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::ASINHSCALE: colorScale = new AsinhScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::SINHSCALE: colorScale = new SinhScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, visual); break; case FrScale::HISTEQUSCALE: colorScale = new HistEquScaleTrueColor8(SCALESIZE, indexCells, colorCells, colorCount, context->histequ(), HISTEQUSIZE, visual); break; case FrScale::IISSCALE: colorScale = new IISScaleTrueColor8(indexCells, colorCells, colorCount, visual); break; } } saods9/tksao1.0/frame/frametruecolor8.h000644 000765 000000 00000001315 12464214756 020323 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frametruecolor8_h__ #define __frametruecolor8_h__ #include "frametruecolor.h" #include "truecolor8.h" class FrameTrueColor8 : public virtual FrameBase, public FrameTrueColor, public TrueColor8 { private: void encodeTrueColor(XColor* src, char* dest) {TrueColor8::encodeTrueColor(src,dest,baseXImage);} void encodeTrueColor(unsigned char* src, XImage* ximage) {TrueColor8::encodeTrueColor(src, ximage);} void updateColorScale(); public: FrameTrueColor8(Tcl_Interp*, Tk_Canvas, Tk_Item*); ~FrameTrueColor8(); }; #endif saods9/tksao1.0/frame/frblt.C000644 000765 000000 00000062150 12620173717 016245 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "base.h" #include "context.h" #include "fitsimage.h" #include "projection.h" extern "C" { #include "bltVector.h" } #include "sigbus.h" void Base::markerAnalysisHistogram(Marker* pp, double** x, double** y, const BBox& bb, int num) { // does not extend across mosaic boundries // uses currentContext FitsImage* ptr = isInCFits(pp->getCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double min =DBL_MAX; double max =-DBL_MAX; // take the bbox and extend to lower/upper pixel boundaries Vector ll = (bb.ll*ptr->refToData).floor(); Vector ur = (bb.ur*ptr->refToData).ceil(); int msize = int(ur[1]-ll[1])*int(ur[0]-ll[0]); double* marr = new double[msize]; int* mask = new int[msize]; memset(marr,0,msize*sizeof(double)); memset(mask,0,msize*sizeof(int)); // main loop SETSIGBUS int cnt =0; for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { marr[cnt] =val; mask[cnt] =1; if (valmax) max =val; } } } } } CLEARSIGBUS // sanity check if (num<1) num = 1; // we need one extra max,0 value at the end int nn = num+1; *x = (double*)malloc(nn*sizeof(double)); *y = (double*)malloc(nn*sizeof(double)); memset(*x,0,nn*sizeof(double)); memset(*y,0,nn*sizeof(double)); double diff = max-min; int last = num-1; double* xx = *x; double* yy = *y; if (diff>0) { for (int ii=0; ii=min && val<=max) yy[(int)((val-min)/diff*last+.5)]++; } } } else { for (int ii=0; iigetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); Vector vv = p2-p1; int num = vv.length() +1; Vector s = vv.normalize(); int cnt[num]; *x = (double*)malloc(num*sizeof(double)); *y = (double*)malloc(num*sizeof(double)); *xc = (double*)malloc(num*sizeof(double)); *yc = (double*)malloc(num*sizeof(double)); // main loop SETSIGBUS for (long ii=0; iimapFromRef(t, sys, sky); (*xc)[ii] = tv[0]; (*yc)[ii] = tv[1]; Vector z = t * ptr->refToData; if (z[0]>=params->xmin && z[0]xmax && z[1]>=params->ymin && z[1]ymax) { // check for nan double v = ptr->getValueDouble(z); if (isfinite(v)) { (*y)[ii] = v; cnt[ii] = 1; } Vector ss = Vector(-s[1],s[0]); for (long jj=1; jjrefToData; if (zz[0]>=params->xmin && zz[0]xmax && zz[1]>=params->ymin && zz[1]ymax) { double vvalue = ptr->getValueDouble(zz); // check for nan if (isfinite(vvalue)) { (*y)[ii] += vvalue; cnt[ii]++; } } } } } // average if needed if (method == Marker::AVERAGE) for (long ii=0; iigetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->fits; // if more than 3 axes, walk it forward int num = currentContext->calcSlice(); for (int ii=1; iinextSlice(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); FitsZBound* zparams = currentContext->getDataParams(currentContext->frScale.scanMode()); int srcw = ptr->width(); int srcd = zparams->zmax - zparams->zmin; // slice jump vector FitsImage* sjv[srcd]; FitsImage* sptr = ptr; for (int ii=0; iizmin; ii++) sptr = sptr->nextSlice(); for (int ii=0; iinextSlice(); } // init *x = (double*)malloc(srcd*sizeof(double)); *y = (double*)malloc(srcd*sizeof(double)); memset(*x,0,srcd*sizeof(double)); memset(*y,0,srcd*sizeof(double)); int* cnt = new int[srcd]; memset(cnt,0,srcd*sizeof(int)); // take the bbox and extend to lower/upper pixel boundaries Vector ll = (bb.ll*ptr->refToData).floor(); Vector ur = (bb.ur*ptr->refToData).ceil(); // mask int ss = (ur[0]-ll[0])*(ur[1]-ll[1]); bool* msk = new bool[ss]; long* idx = new long[ss]; memset(msk,0,ss*sizeof(bool)); memset(idx,0,ss*sizeof(long)); bool* mptr=msk; long* iptr=idx; if (!pp->isFixed()) { Matrix bck = pp->bckMatrix(); for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); if (pp->isIn(rr*ptr->dataToRef,bck)) { *mptr=1; *iptr=long(jj)*srcw+long(ii); } } } } } else { for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); if (pp->isIn(rr*ptr->dataToRef,Coord::REF)) { *mptr=1; *iptr=long(jj)*srcw+long(ii); } } } } } // main loop SETSIGBUS for (int kk=0; kkmapFromRef3axis(kk+.5+zparams->zmin, sys, 2); bool* mptr=msk; long* iptr=idx; for (int ll=0; llgetValueDouble(*iptr); // check for nan if (isfinite(val)) { (*y)[kk] += val; cnt[kk]++; } } } } CLEARSIGBUS // average if needed if (method == Marker::AVERAGE) for (long kk=0; kkgetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double sum[num]; memset(sum,0,num*sizeof(double)); int cnt[num]; memset(cnt,0,num*sizeof(int)); for (int kk=0; kkrefToData).floor(); Vector ur = (bb[kk+1].ur*ptr->refToData).ceil(); // main loop SETSIGBUS for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF,kk+1) && !pp->isIn(ss,Coord::REF,kk)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { sum[kk] += val; cnt[kk]++; } } } } } CLEARSIGBUS } *x = (double*)malloc(num*sizeof(double)); *y = (double*)malloc(num*sizeof(double)); *e = (double*)malloc(num*sizeof(double)); int unit; Vector cdelt; double xaxis =1; if (ptr->hasWCS(sys)) if (ptr->hasWCSCel(sys)) { unit =1; cdelt= ptr->getWCScdelt(sys); xaxis = fabs(cdelt[0]*60*60); } else { unit =2; cdelt= ptr->getWCScdelt(sys); xaxis = fabs(cdelt[0]); } else { unit =0; xaxis =1; } for (int kk=0; kkgetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double sum[num][aa]; memset(sum,0,num*aa*sizeof(double)); int cnt[num][aa]; memset(cnt,0,num*aa*sizeof(int)); for (int kk=0; kkrefToData).floor(); Vector ur = (bb[kk+1].ur*ptr->refToData).ceil(); // main loop SETSIGBUS for (int qq=0; qq=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF,kk+1,qq) && !pp->isIn(ss,Coord::REF,kk,qq)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { sum[kk][qq] += val; cnt[kk][qq]++; } } } } } } CLEARSIGBUS } *x = (double*)malloc(num*aa*sizeof(double)); *y = (double*)malloc(num*aa*sizeof(double)); *e = (double*)malloc(num*aa*sizeof(double)); int unit; Vector cdelt; double xaxis =1; if (ptr->hasWCS(sys)) if (ptr->hasWCSCel(sys)) { unit =1; cdelt= ptr->getWCScdelt(sys); xaxis = fabs(cdelt[0]*60*60); } else { unit =2; cdelt= ptr->getWCScdelt(sys); xaxis = fabs(cdelt[0]); } else { unit =0; xaxis =1; } for (int qq=0; qqgetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double sum =0; double sum2 =0; int cnt =0; double min =DBL_MAX; double max =-DBL_MAX; // take the bbox and extend to lower/upper pixel boundaries Vector ll = (bb.ll*ptr->refToData).floor(); Vector ur = (bb.ur*ptr->refToData).ceil(); int msize = int(ur[1]-ll[1])*int(ur[0]-ll[0]); double* marr = new double[msize]; memset(marr,0,msize*sizeof(double)); // main loop SETSIGBUS for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { sum += val; sum2 += val*val; if (cntmax) max =val; cnt++; } } } } } CLEARSIGBUS qsort((void*)marr,cnt,sizeof(double),dCompare); double median = marr[int(cnt/2.)]; if (marr) delete [] marr; int unit = markerAnalysisStats1(pp,ptr,str,sys,sky); markerAnalysisStats2(ptr,str,sys,0,cnt,sum,unit); markerAnalysisStats3(str); markerAnalysisStats4(str,0,cnt,sum,sum2,median,min,max); } // for annulus regions void Base::markerAnalysisStats(Marker* pp, ostream& str, int num, BBox* bb, Coord::CoordSystem sys, Coord::SkyFrame sky) { // does not extend across mosaic boundries // uses currentContext FitsImage* ptr = isInCFits(pp->getCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double sum[num]; memset(sum,0,num*sizeof(double)); double sum2[num]; memset(sum2,0,num*sizeof(double)); int cnt[num]; memset(cnt,0,num*sizeof(int)); double min[num]; double max[num]; for (int ii=0; iirefToData).floor(); Vector ur = (bb[kk+1].ur*ptr->refToData).ceil(); int msize = int(ur[1]-ll[1])*int(ur[0]-ll[0]); double* marr = new double[msize]; memset(marr,0,msize*sizeof(double)); // main loop SETSIGBUS for (int jj=ll[1]; jj=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF,kk+1) && !pp->isIn(ss,Coord::REF,kk)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { sum[kk] += val; sum2[kk] += val*val; if (cnt[kk]max[kk]) max[kk] =val; cnt[kk]++; } } } } } CLEARSIGBUS qsort((void*)marr,cnt[kk],sizeof(double),dCompare); median[kk] = marr[int(cnt[kk]/2.)]; if (marr) delete [] marr; } int unit = markerAnalysisStats1(pp,ptr,str,sys,sky); for (int kk=0; kkgetCenter(),Coord::REF,NULL); if (!ptr) ptr = currentContext->cfits; int srcw = ptr->width(); FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); double sum[num][aa]; memset(sum,0,num*aa*sizeof(double)); double sum2[num][aa]; memset(sum2,0,num*aa*sizeof(double)); int cnt[num][aa]; memset(cnt,0,num*aa*sizeof(int)); double min[num][aa]; double max[num][aa]; for (int ii=0; iirefToData).floor(); Vector ur = (bb[kk+1].ur*ptr->refToData).ceil(); int msize = int(ur[1]-ll[1])*int(ur[0]-ll[0]); double* marr = new double[msize]; // main loop SETSIGBUS for (int qq=0; qq=params->xmin && iixmax && jj>=params->ymin && jjymax) { // shift to center of pixel in DATA Vector rr = Vector(ii,jj)+Vector(.5,.5); Vector ss = rr*ptr->dataToRef; if (pp->isIn(ss,Coord::REF,kk+1,qq) && !pp->isIn(ss,Coord::REF,kk,qq)) { double val =ptr->getValueDouble(long(jj)*srcw+long(ii)); // check for nan if (isfinite(val)) { sum[kk][qq] += val; sum2[kk][qq] += val*val; if (cnt[kk][qq]max[kk][qq]) max[kk][qq] = val; cnt[kk][qq]++; } } } } } qsort((void*)marr,cnt[kk][qq],sizeof(double),dCompare); median[kk][qq] = marr[int(cnt[kk][qq]/2.)]; } CLEARSIGBUS if (marr) delete [] marr; } int unit = markerAnalysisStats1(pp,ptr,str,sys,sky); for (int kk=0; kkhasWCS(sys)) { if (ptr->hasWCSCel(sys)) { unit =1; Vector cdelt= ptr->getWCScdelt(sys); str << "center=" << setprecision(8) << ptr->mapFromRef(pp->getCenter(),sys,sky); coord.listCoordSystem(str,sys,sky,0,1); str << endl; str << "1 pixel = "<< fabs(cdelt[0]*60*60) << " arcsec" << endl << endl; str << "reg\t" << "sum\t" << "error\t\t" << "area\t\t" << "surf_bri\t\t" << "surf_err" << endl << "\t" << "\t" << "\t\t" << "(arcsec**2)\t\t" << "(sum/arcsec**2)\t" << "(sum/arcsec**2)" << endl << "---\t" << "---\t" << "-----\t\t" << "-----------\t\t" << "---------------\t" << "---------------" << endl; } else { unit =2; Vector cdelt= ptr->getWCScdelt(sys); str << "center=" << setprecision(8) << ptr->mapFromRef(pp->getCenter(),sys,sky); coord.listCoordSystem(str,sys,sky,0,1); str << endl; str << "1 pixel = "<< fabs(cdelt[0]) << endl << endl; str << "reg\t" << "sum\t" << "error\t\t" << "area\t\t" << "surf_bri\t\t" << "surf_err" << endl << "\t" << "\t" << "\t\t" << "(pix**2)\t\t" << "(sum/pix**2)\t\t" << "(sum/pix**2)" << endl << "---\t" << "---\t" << "-----\t\t" << "--------\t\t" << "------------\t\t" << "------------" << endl; } } else { unit =0; str << "center=" << setprecision(8) << ptr->mapFromRef(pp->getCenter(),sys,sky); coord.listCoordSystem(str,sys,sky,0,1); str << endl; str << endl << endl; str << "reg\t" << "sum\t" << "error\t\t" << "area\t\t" << "surf_bri\t\t" << "surf_err" << endl << "\t" << "\t" << "\t\t" << "(pix**2)\t\t" << "(sum/pix**2)\t\t" << "(sum/pix**2)" << endl << "---\t" << "---\t" << "-----\t\t" << "--------\t\t" << "------------\t\t" << "------------" << endl; } return unit; } void Base::markerAnalysisStats2(FitsImage* ptr, ostream& str, Coord::CoordSystem sys, int kk, int cnt, double sum, int unit) { double area =0; switch (unit) { case 0: // pixels area = cnt; break; case 1: { // Cel WCS Vector cdelt= ptr->getWCScdelt(sys); area = fabs(cdelt[0]*cdelt[1]*60*60*60*60*cnt); } break; case 2: { // Linear WCS Vector cdelt= ptr->getWCScdelt(sys); area = fabs(cdelt[0]*cdelt[1]*cnt); } break; } double err = sqrt(fabs(sum)); double bri = sum/area; double brierr = err/area; str << kk+1 << '\t' << sum << '\t' << err << "\t\t" << area << "\t\t" << bri << "\t\t" << brierr << endl; } void Base::markerAnalysisStats3(ostream& str) { str << endl << "reg\t" << "sum\t" << "npix\t" << "mean\t" << "median\t" << "min\t" << "max\t" << "var\t" << "stddev\t" << "rms\t" << endl << "---\t" << "---\t" << "----\t" << "----\t" << "------\t" << "---\t" << "---\t" << "---\t" << "------\t" << "---\t" << endl; } void Base::markerAnalysisStats4(ostream& str, int kk, int cnt, double sum, double sum2, double median, double min, double max) { double mean =0; double std =0; double var =0; double rms =0; if (cnt) { mean = sum/cnt; var = fabs(sum2/cnt - (sum*sum)/(cnt*cnt)); std = sqrt(var); rms = sqrt(sum2/cnt); } str << kk+1 << '\t' << sum << '\t' << cnt << '\t' << mean << '\t' << median << '\t' << min << '\t' << max << '\t' << var << '\t' << std << '\t' << rms << '\t' << endl; } void Base::bltCut(char* xname, char* yname, Coord::Orientation axis, const Vector& rr) { int size; if (axis == Coord::XX) size = options->width; else size = options->height; long length = (size+1) * 2; double* xx = (double*)malloc(sizeof(double)*length); double* yy = (double*)malloc(sizeof(double)*length); // check for data or undefined low()/high() if (!currentContext->cfits || !isfinite(currentContext->frScale.low())) { for (int ii=0; ii<=size; ii++) { xx[ii*2] = ii; xx[ii*2+1] = ii; yy[ii*2] = 0; yy[ii*2+1] = 0; } } else bltCutFits(xx, yy, size, axis, rr); Blt_Vector* xv; if (Blt_GetVector(interp, xname, &xv) != TCL_OK) goto error; if (Blt_ResetVector(xv, xx, length, length*sizeof(double), TCL_DYNAMIC) != TCL_OK) goto error; Blt_Vector* yv; if (Blt_GetVector(interp, yname, &yv) != TCL_OK) goto error; if (Blt_ResetVector(yv, yy, length, length*sizeof(double), TCL_DYNAMIC) != TCL_OK) goto error; return; error: result = TCL_ERROR; return; } void Base::bltCutFits(double* xx, double* yy, int size, Coord::Orientation axis, const Vector& r) { // Widget Vector rr = r * refToWidget; // basics FitsImage* sptr = currentContext->cfits; int mosaic = isMosaic(); // variable FitsBound* params = sptr->getDataParams(currentContext->frScale.scanMode()); double prev = currentContext->frScale.low(); // main loop SETSIGBUS for (int ii=0; ii<=size; ii++) { double vv = currentContext->frScale.low(); if (mosaic) { sptr = currentContext->cfits; params = sptr->getDataParams(currentContext->frScale.scanMode()); } do { Vector img; if (axis == Coord::XX) img = Vector(1+ii,rr[1]) * sptr->widgetToData; else img = Vector(rr[0],1+ii) * sptr->widgetToData; if (img[0]>=params->xmin && img[0]xmax && img[1]>=params->ymin && img[1]ymax) { double value = sptr->getValueDouble(img); if (isfinite(value)) vv = value; break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) params = sptr->getDataParams(currentContext->frScale.scanMode()); } } } while (mosaic && sptr); xx[2*ii] = ii; xx[2*ii +1] = ii; yy[2*ii] = prev; yy[2*ii +1] = vv; prev = vv; } CLEARSIGBUS } saods9/tksao1.0/frame/frcommand.C000644 000765 000000 00000024073 12614200571 017074 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fdstream.hpp" #include #include "framebase.h" #include "fitsimage.h" #include "context.h" #include "marker.h" #include "outfile.h" #include "outchannel.h" #include "outsocket.h" #include "sigbus.h" void FrameBase::binToFitCmd() { if (currentContext->fits) { double bf = 1/calcZoom(currentContext->fits->getHistDim(), Vector(options->width,options->height)); // round up to next power of 2 if (bf < 1) currentContext->setBinToFactor(Vector(1,1)); else { int p=1; while (psetBinToFactor(Vector(p,p)); } } Matrix mm = currentContext->binCursor(); updateBin(mm); } void FrameBase::blockToFitCmd() { if (currentContext->fits) { double bf = 1/calcZoom(currentContext->fits->osize(), Vector(options->width,options->height)); // round up to next power of 2 Vector vv; if (bf < 1) vv = currentContext->setBlockToFactor(Vector(1,1)); else { int p=1; while (psetBlockToFactor(Vector(p,p)); } currentContext->block(); currentContext->analysis(); updateBlock(vv); } } void FrameBase::get3dBorderCmd() { Tcl_AppendResult(interp, "1", NULL); } void FrameBase::get3dBorderColorCmd() { Tcl_AppendResult(interp, "blue", NULL); } void FrameBase::get3dCompassCmd() { Tcl_AppendResult(interp, "1", NULL); } void FrameBase::get3dCompassColorCmd() { Tcl_AppendResult(interp, "green", NULL); } void FrameBase::get3dHighliteCmd() { Tcl_AppendResult(interp, "1", NULL); } void FrameBase::get3dHighliteColorCmd() { Tcl_AppendResult(interp, "cyan", NULL); } void FrameBase::get3dRenderMethodCmd() { Tcl_AppendResult(interp, "mip", NULL); } void FrameBase::get3dScaleCmd() { Tcl_AppendResult(interp, "1", NULL); } void FrameBase::get3dViewCmd() { Tcl_AppendResult(interp, "0 0", NULL); } void FrameBase::get3dViewPointCmd() { Tcl_AppendResult(interp, "0 0 0 0 0", NULL); } void FrameBase::get3dRenderBackgroundCmd() { Tcl_AppendResult(interp, "none", NULL); } void FrameBase::getCursorCmd(Coord::InternalSystem sys) { printVector(mapFromRef(cursor,sys), DEFAULT); } void FrameBase::getCursorCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Precision pp) { if (currentContext->cfits) printFromRef(currentContext->cfits, cursor, sys, sky, format, pp); else printVector(Vector(), DEFAULT); } void FrameBase::gridCmd(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Grid::GridType type, const char* ops, const char* vars) { if (grid) delete grid; grid = new Grid2d(this, sys, sky, format, type, ops, vars); update(PIXMAP); } void FrameBase::iisCursorModeCmd(int state) { if (state) { // set iisLastCursor if first time thru if (iisLastCursor[0] == 0 && iisLastCursor[1] == 0) iisLastCursor = Vector(options->width,options->height)/2; // and move to last cursor position Vector rr = iisLastCursor * widgetToWindow; warpTo(rr); } } void FrameBase::iisGetCursorCmd() { printVector(iisLastCursor,DEFAULT); } void FrameBase::iisGetFileNameCmd() { FitsImage* ptr = currentContext->fits; while (ptr && ptr->nextMosaic()) ptr = ptr->nextMosaic(); if (ptr) Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL); } void FrameBase::iisGetFileNameCmd(int which) { FitsImage* ptr = currentContext->fits; for (int i=0; i<(which-1); i++) { if (ptr) ptr = ptr->nextMosaic(); } if (ptr) Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL); } void FrameBase::iisGetFileNameCmd(const Vector& vv) { if (FitsImage* ptr = isInCFits(vv, Coord::CANVAS, NULL)) Tcl_AppendResult(interp, ptr->iisGetFileName(), NULL); } void FrameBase::iisMessageCmd(const char* ptr) { if (!currentContext->cfits) return; // do we have something? if (!(ptr && *ptr)) return; // filename // note: the file name is the second value passed char fn[PATH_MAX]; string x(ptr); istringstream str(x); str >> fn >> fn; currentContext->cfits->setFileName(fn); // object name // first go to end char* sptr = (char*)ptr; while (*sptr) sptr++; // now work backwards to last '-' while (sptr != ptr) { if (*sptr == '-') break; sptr--; } // is it good? if (sptr != ptr) { // go forward 2 sptr += 2; currentContext->cfits->setObjectKeyword(sptr); } } void FrameBase::iisSetCursorCmd(const Vector& v, Coord::InternalSystem sys) { // assume canvas if (!currentContext->cfits) return; iisLastCursor = v * canvasToWidget; Vector rr = iisLastCursor * widgetToWindow; warpTo(rr); } void FrameBase::iisSetCursorCmd(const Vector& v, Coord::CoordSystem sys) { if (!currentContext->cfits) return; iisLastCursor = currentContext->cfits->mapToRef(v,sys) * refToWidget; Vector rr = iisLastCursor * widgetToWindow; warpTo(rr); } void FrameBase::iisSetFileNameCmd(const char* fn) { FitsImage* ptr = currentContext->fits; while (ptr && ptr->nextMosaic()) ptr = ptr->nextMosaic(); if (ptr) ptr->iisSetFileName(fn); } void FrameBase::iisSetFileNameCmd(const char* fn, int which) { FitsImage* ptr = currentContext->fits; for (int i=0; i<(which-1); i++) { if (ptr) ptr = ptr->nextMosaic(); } if (ptr) ptr->iisSetFileName(fn); } void FrameBase::panCmd(const Vector& v1, const Vector& v2) { Vector start = mapToRef(v1,Coord::CANVAS); Vector stop = mapToRef(v2,Coord::CANVAS); cursor -= stop - start; setBinCursor(); update(MATRIX); } void FrameBase::panCmd(const Vector& vv) { Vector uu = mapFromRef(cursor,Coord::CANVAS); uu += vv; cursor = mapToRef(uu,Coord::CANVAS); setBinCursor(); update(MATRIX); } void FrameBase::panCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!currentContext->cfits) return; Vector uu = currentContext->cfits->mapFromRef(cursor, sys, sky); uu += vv; cursor = currentContext->cfits->mapToRef(uu, sys, sky); setBinCursor(); update(MATRIX); } void FrameBase::panToCmd(const Vector& vv) { cursor = mapToRef(vv,Coord::CANVAS); setBinCursor(); update(MATRIX); } void FrameBase::panToCmd(const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { if (!currentContext->cfits) return; cursor = currentContext->cfits->mapToRef(vv, sys, sky); setBinCursor(); update(MATRIX); } void FrameBase::panBBoxCmd(const Vector& vv) { if (!currentContext->cfits) return; // we want to round to nearest pixel center Vector rr = vv * currentContext->cfits->pannerToData; cursor = (rr.floor() + Vector(.5,.5)) * currentContext->cfits->dataToRef; setBinCursor(); update(MATRIX); } void FrameBase::panEndCmd(const Vector& vv) { // vv and panCursor are in Coord::CANVAS coords // delete tmp pixmap if (panPM) Tk_FreePixmap(display, panPM); panPM = 0; // use matrix, not map() for 3d? Vector start = panCursor * canvasToRef; Vector stop = vv * canvasToRef; cursor -= stop - start; setBinCursor(); update(MATRIX); } void FrameBase::rotateBeginCmd() { // save the current rotation rotateRotation = rotation; // Create src XImage if (!(rotateSrcXM = XGetImage(display, pixmap, 0, 0, options->width, options->height, AllPlanes, ZPixmap))) { internalError("Unable to Create Rotate XImage"); return; } // Create dest XImage if (!(rotateDestXM = XGetImage(display, pixmap, 0, 0, options->width, options->height, AllPlanes, ZPixmap))) { internalError("Unable to Create Rotate XImage"); return; } // Create dest Pixmap rotatePM = Tk_GetPixmap(display, Tk_WindowId(tkwin), options->width, options->height, depth); if (!rotatePM) { internalError("Unable to Create Rotate Motion Pixmap"); return; } } void FrameBase::rotateMotionCmd(double angle) { rotation = rotateRotation + angle; rotateMotion(); } void FrameBase::rotateEndCmd() { // Clean up if (rotateSrcXM) XDestroyImage(rotateSrcXM); if (rotateDestXM) XDestroyImage(rotateDestXM); if (rotatePM) Tk_FreePixmap(display, rotatePM); update(MATRIX); } void FrameBase::saveFitsResampleFileCmd(const char* fn) { OutFitsFile str(fn); saveFitsResample(str); } void FrameBase::saveFitsResampleChannelCmd(const char* ch) { OutFitsChannel str(interp, ch); saveFitsResample(str); } void FrameBase::saveFitsResampleSocketCmd(int ss) { OutFitsSocket str(ss); saveFitsResample(str); } void FrameBase::zoomAboutCmd(const Vector& zz, const Vector& vv) { Vector az = ((Vector&)zz).abs(); zoom_[0] *= az[0]; zoom_[1] *= az[1]; cursor = mapToRef(vv,Coord::CANVAS); setBinCursor(); update(MATRIX); } void FrameBase::zoomAboutCmd(const Vector& z, const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { Vector az = ((Vector&)z).abs(); zoom_[0] *= az[0]; zoom_[1] *= az[1]; if (currentContext->cfits) { cursor = currentContext->cfits->mapToRef(vv, sys, sky); setBinCursor(); } update(MATRIX); } void FrameBase::zoomToAboutCmd(const Vector& z, const Vector& vv) { zoom_ = ((Vector&)z).abs(); cursor = mapToRef(vv,Coord::CANVAS); setBinCursor(); update(MATRIX); } void FrameBase::zoomToAboutCmd(const Vector& z, const Vector& vv, Coord::CoordSystem sys, Coord::SkyFrame sky) { zoom_ = ((Vector&)z).abs(); if (currentContext->cfits) { cursor = currentContext->cfits->mapToRef(vv, sys, sky); setBinCursor(); } update(MATRIX); } void FrameBase::zoomToFitCmd(double ss) { // will center image on center of pixel // with even number pixels, it will be shifted if (keyContext->fits) { centerImage(); Vector tt = imageSize(keyContext->frScale.scanMode()); // adjust image size to be odd (see above) double dd; // dummy if (!modf(tt[0]/2,&dd)) tt[0] +=1; if (!modf(tt[1]/2,&dd)) tt[1] +=1; double zz = calcZoom(tt,Vector(options->width,options->height)) * ss; zoom_ = Vector(zz,zz); update(MATRIX); } } saods9/tksao1.0/frame/frload.C000644 000765 000000 00000056277 12621204750 016411 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "fitsimage.h" #include "alloc.h" #include "allocgz.h" #include "channel.h" #include "mmap.h" #include "mmapincr.h" #include "share.h" #include "sshare.h" #include "socket.h" #include "socketgz.h" #include "var.h" // *** Fits *** void Base::loadFitsAllocCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(ALLOC, fn, img, ll),ll); } void Base::loadFitsAllocGZCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(ALLOCGZ, fn, img, ll),ll); } void Base::loadFitsChannelCmd(const char* ch, const char* fn,LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(CHANNEL, fn, img, ll),ll); } void Base::loadFitsMMapCmd(const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(MMAP, fn, img, ll),ll); } void Base::loadFitsSMMapCmd(const char* hdr, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsSMMap(currentContext, interp, hdr, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(SMMAP, fn, img, ll),ll); } void Base::loadFitsMMapIncrCmd(const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(MMAPINCR, fn, img, ll),ll); } void Base::loadFitsShareCmd(ShmType stype, int id, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(SHARE, fn, img, ll),ll); } void Base::loadFitsSShareCmd(ShmType stype, int hdr, int id, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsSShare(currentContext, interp, stype, hdr, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(SSHARE, fn, img, ll),ll); } void Base::loadFitsSocketCmd(int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsSocket(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->load(SOCKET, fn, img, ll),ll); } void Base::loadFitsSocketGZCmd(int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsSocketGZ(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->load(SOCKETGZ, fn, img, ll),ll); } void Base::loadFitsVarCmd(const char* ch, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageFitsVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->load(VAR, fn, img, ll),ll); } // *** Array *** void Base::loadArrAllocCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(ALLOC, fn, img, ll),ll); } void Base::loadArrAllocGZCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(ALLOCGZ, fn, img, ll),ll); } void Base::loadArrChannelCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(CHANNEL, fn, img, ll),ll); } void Base::loadArrMMapCmd(const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrMMap(currentContext, interp, fn, 1); loadDone(currentContext->load(MMAP, fn, img, ll),ll); } void Base::loadArrMMapIncrCmd(const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrMMapIncr(currentContext, interp, fn, 1); loadDone(currentContext->load(MMAPINCR, fn, img, ll),ll); } void Base::loadArrShareCmd(ShmType stype, int id, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrShare(currentContext, interp, stype, id, fn, 1); loadDone(currentContext->load(SHARE, fn, img, ll),ll); } void Base::loadArrSocketCmd(int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrSocket(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->load(SOCKET, fn, img, ll),ll); } void Base::loadArrSocketGZCmd(int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrSocketGZ(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->load(SOCKETGZ, fn, img, ll),ll); } void Base::loadArrVarCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageArrVar(currentContext, interp, ch, fn, 1); loadDone(currentContext->load(VAR, fn, img, ll),ll); } // *** ENVI *** void Base::loadENVISMMapCmd(const char* hdr, const char* fn) { unloadFits(); FitsImage* img = new FitsImageENVISMMap(currentContext, interp, hdr, fn, 1); loadDone(currentContext->load(SMMAP, fn, img, IMG), IMG); } // *** NRRD *** void Base::loadNRRDAllocCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(ALLOC, fn, img, ll),ll); } void Base::loadNRRDChannelCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->load(CHANNEL, fn, img, ll),ll); } void Base::loadNRRDMMapCmd(const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDMMap(currentContext, interp, fn, 1); loadDone(currentContext->load(MMAP, fn, img, ll),ll); } void Base::loadNRRDShareCmd(ShmType stype, int id, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDShare(currentContext, interp, stype, id, fn, 1); loadDone(currentContext->load(SHARE, fn, img, ll),ll); } void Base::loadNRRDSocketCmd(int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDSocket(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->load(SOCKET, fn, img, ll),ll); } void Base::loadNRRDVarCmd(const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageNRRDVar(currentContext, interp, ch, fn, 1); loadDone(currentContext->load(VAR, fn, img, ll),ll); } // *** Photo *** void Base::loadPhotoCmd(const char* ph, const char* fn) { unloadFits(); FitsImage* img = new FitsImagePhoto(currentContext, interp, ph, fn, 1); loadDone(currentContext->load(PHOTO, fn, img, IMG), IMG); } void Base::loadSlicePhotoCmd(const char* ph, const char* fn) { FitsImage* img = new FitsImagePhoto(currentContext, interp, ph, fn, 1); loadDone(currentContext->loadSlice(PHOTO, fn, img), IMG); } // *** Data Cube *** void Base::loadExtCubeAllocCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadExtCube(ALLOC, fn, img), IMG); } void Base::loadExtCubeAllocGZCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadExtCube(ALLOCGZ, fn, img), IMG); } void Base::loadExtCubeChannelCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadExtCube(CHANNEL, fn, img), IMG); } void Base::loadExtCubeMMapCmd(const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadExtCube(MMAP, fn, img), IMG); } void Base::loadExtCubeMMapIncrCmd(const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadExtCube(MMAPINCR, fn, img), IMG); } void Base::loadExtCubeShareCmd(ShmType stype, int id, const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadExtCube(SHARE, fn, img), IMG); } void Base::loadExtCubeSocketCmd(int s, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsSocket(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadExtCube(SOCKET, fn, img), IMG); } void Base::loadExtCubeSocketGZCmd(int s, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsSocketGZ(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadExtCube(SOCKETGZ, fn, img), IMG); } void Base::loadExtCubeVarCmd(const char* ch, const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadExtCube(VAR, fn, img), IMG); } // *** Slice *** void Base::loadSliceAllocCmd(const char* ch, const char* fn) { FitsImage* img = new FitsImageFitsAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadSlice(ALLOC, fn, img), IMG); } void Base::loadSliceAllocGZCmd(const char* ch, const char* fn) { FitsImage* img = new FitsImageFitsAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadSlice(ALLOCGZ, fn, img), IMG); } void Base::loadSliceChannelCmd(const char* ch, const char* fn) { FitsImage* img = new FitsImageFitsChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadSlice(CHANNEL, fn, img), IMG); } void Base::loadSliceMMapCmd(const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(MMAP, fn, img), IMG); } void Base::loadSliceSMMapCmd(const char* hdr, const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsSMMap(currentContext, interp, hdr, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(MMAP, fn, img), IMG); } void Base::loadSliceMMapIncrCmd(const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(MMAPINCR, fn, img), IMG); } void Base::loadSliceShareCmd(ShmType stype, int id, const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(SHARE, fn, img), IMG); } void Base::loadSliceSShareCmd(ShmType stype, int hdr, int id, const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsSShare(currentContext, interp, stype, hdr, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(SSHARE, fn, img), IMG); } void Base::loadSliceSocketCmd(int s, const char* fn) { FitsImage* img = new FitsImageFitsSocket(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->loadSlice(SOCKET, fn, img), IMG); } void Base::loadSliceSocketGZCmd(int s, const char* fn) { FitsImage* img = new FitsImageFitsSocketGZ(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->loadSlice(SOCKETGZ, fn, img), IMG); } void Base::loadSliceVarCmd(const char* ch, const char* fn, LoadMethod lm) { FitsImage* img = new FitsImageFitsVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadSlice(VAR, fn, img), IMG); } // *** Mosaic Image *** void Base::loadMosaicImageAllocCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicImage(ALLOC, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageAllocGZCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicImage(ALLOCGZ, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageChannelCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicImage(CHANNEL, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageMMapCmd(MosaicType type, Coord::CoordSystem sys, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicImage(MMAP, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageMMapIncrCmd(MosaicType type, Coord::CoordSystem sys, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicImage(MMAPINCR, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageShareCmd(MosaicType type, Coord::CoordSystem sys, ShmType stype, int id, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicImage(SHARE, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageSocketCmd(MosaicType type, Coord::CoordSystem sys, int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicSocket(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicImage(SOCKET, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageSocketGZCmd(MosaicType type, Coord::CoordSystem sys, int s, const char* fn, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicSocketGZ(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicImage(SOCKETGZ, fn, img, ll,type,sys),ll); } void Base::loadMosaicImageVarCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LoadMethod lm, LayerType ll) { if (ll == IMG) unloadFits(); FitsImage* img = new FitsImageMosaicVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicImage(VAR, fn, img, ll,type,sys),ll); } // *** Mosaic *** void Base::loadMosaicAllocCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { FitsImage* img = new FitsImageFitsAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaic(ALLOC, fn, img, ll,type,sys),ll); } void Base::loadMosaicAllocGZCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { FitsImage* img = new FitsImageFitsAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaic(ALLOCGZ, fn, img, ll,type,sys),ll); } void Base::loadMosaicChannelCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LayerType ll) { FitsImage* img = new FitsImageFitsChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaic(CHANNEL, fn, img, ll,type,sys),ll); } void Base::loadMosaicMMapCmd(MosaicType type, Coord::CoordSystem sys, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(MMAP, fn, img, ll,type,sys),ll); } void Base::loadMosaicSMMapCmd(MosaicType type, Coord::CoordSystem sys, const char* hdr, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsSMMap(currentContext, interp, hdr, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(MMAP, fn, img, ll,type,sys),ll); } void Base::loadMosaicMMapIncrCmd(MosaicType type, Coord::CoordSystem sys, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(MMAPINCR, fn, img, ll,type,sys),ll); } void Base::loadMosaicShareCmd(MosaicType type, Coord::CoordSystem sys, ShmType stype, int id, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(SHARE, fn, img, ll,type,sys),ll); } void Base::loadMosaicSShareCmd(MosaicType type, Coord::CoordSystem sys, ShmType stype, int hdr, int id, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsSShare(currentContext, interp, stype, hdr, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(SSHARE, fn, img, ll,type,sys),ll); } void Base::loadMosaicSocketCmd(MosaicType type, Coord::CoordSystem sys, int s, const char* fn, LayerType ll) { FitsImage* img = new FitsImageFitsSocket(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->loadMosaic(SOCKET, fn, img, ll,type,sys),ll); } void Base::loadMosaicSocketGZCmd(MosaicType type, Coord::CoordSystem sys, int s, const char* fn, LayerType ll) { FitsImage* img = new FitsImageFitsSocketGZ(currentContext, interp, s, fn, FitsFile::FLUSH, 1); loadDone(currentContext->loadMosaic(SOCKETGZ, fn, img, ll,type,sys),ll); } void Base::loadMosaicVarCmd(MosaicType type, Coord::CoordSystem sys, const char* ch, const char* fn, LoadMethod lm, LayerType ll) { FitsImage* img = new FitsImageFitsVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaic(VAR, fn, img, ll,type,sys),ll); } // *** Mosaic Image WFPC2 *** void Base::loadMosaicImageWFPC2AllocCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsAlloc(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicWFPC2(ALLOC, fn, img), IMG); } void Base::loadMosaicImageWFPC2AllocGZCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsAllocGZ(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicWFPC2(ALLOCGZ, fn, img), IMG); } void Base::loadMosaicImageWFPC2ChannelCmd(const char* ch, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsChannel(currentContext, interp, ch, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicWFPC2(CHANNEL, fn, img), IMG); } void Base::loadMosaicImageWFPC2MMapCmd(const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsMMap(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicWFPC2(MMAP, fn, img), IMG); } void Base::loadMosaicImageWFPC2MMapIncrCmd(const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsMMapIncr(currentContext, interp, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicWFPC2(MMAPINCR, fn, img), IMG); } void Base::loadMosaicImageWFPC2ShareCmd(ShmType stype, int id, const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsShare(currentContext, interp, stype, id, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicWFPC2(SHARE, fn, img), IMG); } void Base::loadMosaicImageWFPC2SocketCmd(int s, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsSocket(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicWFPC2(SOCKET, fn, img), IMG); } void Base::loadMosaicImageWFPC2SocketGZCmd(int s, const char* fn) { unloadFits(); FitsImage* img = new FitsImageFitsSocketGZ(currentContext, interp, s, fn, FitsFile::NOFLUSH, 1); loadDone(currentContext->loadMosaicWFPC2(SOCKETGZ, fn, img), IMG); } void Base::loadMosaicImageWFPC2VarCmd(const char* ch, const char* fn, LoadMethod lm) { unloadFits(); FitsImage* img = new FitsImageFitsVar(currentContext, interp, ch, fn, 1); setScanModeIncr(lm); loadDone(currentContext->loadMosaicWFPC2(VAR, fn, img), IMG); } // *** void Base::loadDone(int rr, LayerType ll) { if (rr) { if (ll == IMG) { if (!keyContextSet) { keyContext = currentContext; keyContextSet =1; } } alignWCS(); if (!preservePan) { centerImage(); crosshair = cursor; } } else { reset(); Tcl_AppendResult(interp, "Unable to load file", NULL); result = TCL_ERROR; } // adjust current slice if needed if (currentContext->fits && isCube() && currentContext->frScale.scanMode()==FrScale::CROPSEC) { // context->slice() IMAGE (ranges 1-n) // params are in DATA coords, edge to edge // setSlice() IMAGE (ranges 1-n) double sl = currentContext->slice(2)-.5; FitsZBound* zparams = currentContext->getDataParams(currentContext->frScale.scanMode()); double ff = zparams->zmin+.5; double tt = zparams->zmax-.5; if (sltt) setSlice(2,tt+.5); } updateColorScale(); update(MATRIX); } saods9/tksao1.0/frame/frmap.C000644 000765 000000 00000006621 12537642733 016250 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "framebase.h" #include "fitsimage.h" double Base::mapAngleFromRef(double angle, Coord::CoordSystem sys, Coord::SkyFrame sky) { double r = angle; FitsImage* ptr = currentContext->cfits; if (!ptr) return 0; switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: break; default: switch (ptr->getWCSOrientation(sys,sky)) { case Coord::NORMAL: r = angle + ptr->getWCSRotation(sys,sky); break; case Coord::XX: r = -angle + ptr->getWCSRotation(sys,sky) + M_PI; break; case Coord::YY: case Coord::XY: break; } } return zeroTWOPI(r); } double Base::mapAngleToRef(double angle, Coord::CoordSystem sys, Coord::SkyFrame sky) { double r = angle; FitsImage* ptr = currentContext->cfits; if (!ptr) return 0; switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: break; default: switch (ptr->getWCSOrientation(sys,sky)) { case Coord::NORMAL: r = angle - ptr->getWCSRotation(sys,sky); break; case Coord::XX: r = -angle + ptr->getWCSRotation(sys,sky) + M_PI; break; case Coord::YY: case Coord::XY: break; } } return zeroTWOPI(r); } double Base::mapDistFromRef(const Vector& v1, const Vector& v2, Coord::InternalSystem sys) { switch (sys) { case Coord::CANVAS: return (v2*refToCanvas - v1*refToCanvas).length(); case Coord::PANNER: return (v2*refToPanner - v1*refToPanner).length(); default: // na return 0; } } double Base::mapLenFromRef(double d, Coord::InternalSystem sys) { Vector r = mapLenFromRef(Vector(d,0),sys); return r[0]; } Vector Base::mapLenFromRef(const Vector& v, Coord::InternalSystem sys) { switch (sys) { case Coord::CANVAS: return mapLen(v,refToCanvas); case Coord::PANNER: return mapLen(v,refToPanner); default: return Vector(); } } double Base::mapLenToRef(double d, Coord::InternalSystem sys) { Vector r = mapLenToRef(Vector(d,0),sys); return r[0]; } Vector Base::mapLenToRef(const Vector& v, Coord::InternalSystem sys) { switch (sys) { case Coord::CANVAS: return mapLen(v,canvasToRef); case Coord::PANNER: return mapLen(v,pannerToRef); default: return Vector(); } } Vector FrameBase::mapFromRef(const Vector& vv, Coord::InternalSystem sys) { switch (sys) { case Coord::REF: return vv; case Coord::USER: return vv * refToUser; case Coord::WIDGET: return vv * refToWidget; case Coord::CANVAS: return vv * refToCanvas; case Coord::WINDOW: return vv * refToWindow; case Coord::PANNER: return vv * refToPanner; case Coord::MAGNIFIER: return vv * refToMagnifier; default: return Vector(); } } Vector FrameBase::mapToRef(const Vector& vv, Coord::InternalSystem sys) { switch (sys) { case Coord::REF: return vv; case Coord::USER: return vv * userToRef; case Coord::WIDGET: return vv * widgetToRef; case Coord::CANVAS: return vv * canvasToRef; case Coord::WINDOW: return vv * windowToRef; case Coord::PANNER: return vv * pannerToRef; case Coord::MAGNIFIER: return vv * magnifierToRef; default: return Vector(); } } saods9/tksao1.0/frame/frmarker.C000644 000765 000000 00000453112 12621204750 016740 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fdstream.hpp" #include "context.h" #include "base.h" #include "fitsimage.h" #include "fvcontour.h" #include "marker.h" #include "basemarker.h" #include "sigbus.h" #include "circle.h" #include "ellipse.h" #include "box.h" #include "polygon.h" #include "line.h" #include "vect.h" #include "projection.h" #include "segment.h" #include "text.h" #include "point.h" #include "ruler.h" #include "compass.h" #include "annulus.h" #include "ellipseannulus.h" #include "boxannulus.h" #include "cpanda.h" #include "epanda.h" #include "bpanda.h" #include "composite.h" #define LISTBUFSIZE 8192 // NOTE: all marker traversal routines use a local ptr as opposed to the // list current() because marker call backs may invoke another traversal // routine or the event loop, which may process pending events // DS9/Funtools Marker Parser Stuff // Parser Stuff #undef yyFlexLexer #define yyFlexLexer mkFlexLexer #include void* mklval; mkFlexLexer* mklexx; extern int mkparse(Base*, mkFlexLexer*); int mklex(void* vval, mkFlexLexer* ll) { mklval = vval; mklexx = ll; return ll ? ll->yylex() : 0; } void mkerror(Base* fr, mkFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // CIAO Marker Parser Stuff #undef yyFlexLexer #define yyFlexLexer ciaoFlexLexer #include void* ciaolval; extern int ciaoparse(Base*, ciaoFlexLexer*); int ciaolex(void* vval, ciaoFlexLexer* ll) { ciaolval = vval; return ll ? ll->yylex() : 0; } void ciaoerror(Base* fr, ciaoFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // PROS Marker Parser Stuff #undef yyFlexLexer #define yyFlexLexer prosFlexLexer #include void* proslval; prosFlexLexer* proslexx; extern int prosparse(Base*, prosFlexLexer*); int proslex(void* vval, prosFlexLexer* ll) { proslval = vval; proslexx = ll; return ll ? ll->yylex() : 0; } void proserror(Base* fr, prosFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // TNG Marker Parser Stuff #undef yyFlexLexer #define yyFlexLexer tngFlexLexer #include void* tnglval; tngFlexLexer* tnglexx; extern int tngparse(Base*, tngFlexLexer*); int tnglex(void* vval, tngFlexLexer* ll) { tnglval = vval; tnglexx = ll; return ll ? ll->yylex() : 0; } void tngerror(Base* fr, tngFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // SAO Marker Parser Stuff #undef yyFlexLexer #define yyFlexLexer saoFlexLexer #include void* saolval; saoFlexLexer* saolexx; extern int saoparse(Base*, saoFlexLexer*); int saolex(void* vval, saoFlexLexer* ll) { saolval = vval; saolexx = ll; return ll ? ll->yylex() : 0; } void saoerror(Base* fr, saoFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // XY Marker Parser Stuff #undef yyFlexLexer #define yyFlexLexer xyFlexLexer #include void* xylval; extern int xyparse(Base*, xyFlexLexer*); int xylex(void* vval, xyFlexLexer* ll) { xylval = vval; return ll ? ll->yylex() : 0; } void xyerror(Base* fr, xyFlexLexer* ll, const char* m) { fr->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { fr->error(": "); fr->error(cmd); } } // IME Analysis Commands void Base::analysisMarkersInit() { Vector cc; double rr =20; Vector ss(40,20); double ang =0; double mag =20; double in =0; double out =20; int num =10; Vector vin(0,0); Vector vout(40,20); analysisMarkers.append(new Circle(this, cc, rr)); analysisMarkers.append(new Box(this, cc, ss, ang)); analysisMarkers.append(new Ellipse(this, cc, ss, ang)); analysisMarkers.append(new Polygon(this, cc, ss)); analysisMarkers.append(new Point(this, cc)); analysisMarkers.append(new Vect(this, cc, mag, ang)); analysisMarkers.append(new Annulus(this, cc, in, out, num)); analysisMarkers.append(new EllipseAnnulus(this, cc, vin, vout, num, ang)); analysisMarkers.append(new BoxAnnulus(this, cc, vin, vout, num, ang)); Marker* mm = analysisMarkers.head(); while (mm) { mm->setProperty(Marker::SELECT, 1); mm->setProperty(Marker::EDIT, 1); mm->setProperty(Marker::ROTATE, 1); mm = mm->next(); } } void Base::analysisMarkersResetCmd() { if (analysisMarkers.isEmpty()) analysisMarkersInit(); Marker* mm = analysisMarkers.head(); while (mm) { mm->setProperty(Marker::HIDDEN, 1); mm = mm->next(); } } void Base::analysisMarkersSelectCmd(const char* which, const Vector& cc) { // reset analysisMarkersResetCmd(); Marker* mm = analysisMarkers.head(); while (mm) { if (!strcmp(mm->getType(),which)) { mm->setProperty(Marker::HIDDEN, 0); mm->moveTo(cc); update(PIXMAP); return; } mm = mm->next(); } } // Basic Regions void Base::createCircleCmd(const Vector& center, double radius, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Circle(this, center, radius, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createEllipseCmd(const Vector& center, const Vector& radius, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag,const List& cb) { createMarker(new Ellipse(this,center, radius, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createBoxCmd(const Vector& center, const Vector& size, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Box(this, center, size, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createPolygonCmd(const Vector& center, const Vector& bb, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Polygon(this, center, bb, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createPolygonCmd(const List& list, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Polygon(this, list, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createContourPolygonCmd( const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { // only create in the USER layer markerLayerCmd(USER); // main contour if (hasContour()) { List& c = (List&)(currentContext->contour->contours()); // build from back to front if (c.tail()) { List list; while (c.previous()) { if (c.current()->vector[0] != DBL_MAX) list.append(new Vertex(c.current()->vector)); else { if (list.count()>0) createMarker(new Polygon(this, list, color, dash, width, font, text, prop, NULL, tag, cb)); list.deleteAll(); } } if (list.count()>0) createMarker(new Polygon(this, list, color, dash, width, font, text, prop, comment, tag, cb)); } } // aux contours Contour* cptr = currentContext->auxcontours.head(); while (cptr) { List& c = (List&)(cptr->contours()); // build from back to front if (c.tail()) { List list; while (c.previous()) { if (c.current()->vector[0] != DBL_MAX) list.append(new Vertex(c.current()->vector)); else { if (list.count()>0) createMarker(new Polygon(this, list, color, dash, width, font, text, prop, NULL, tag, cb)); list.deleteAll(); } } if (list.count()>0) createMarker(new Polygon(this, list, color, dash, width, font, text, prop, comment, tag, cb)); } cptr = cptr->next(); } } void Base::createSegmentCmd(const Vector& center, const Vector& bb, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Segment(this, center, bb, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createSegmentCmd(const List& list, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Segment(this, list, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createLineCmd(const Vector& center, const Vector& p2, int arrow1, int arrow2, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Line(this, center, p2, arrow1, arrow2, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createVectCmd(const Vector& center, const Vector& p2, int arrow, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Vect(this, center, p2, arrow, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createVectCmd(const Vector& center, double mag, double ang, int arrow, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Vect(this, center, mag, ang, arrow, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createTextCmd(const Vector& center, double angle, int rotate, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Text(this, center, angle, rotate, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createPointCmd(const Vector& center, Point::PointShape shape, int size, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Point(this, center, shape, size, color, dash, width, font, text, prop, comment, tag, cb)); } // Measurement Regions void Base::createRulerCmd(const Vector& center, const Vector& p2, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem distsys, Coord::SkyDist distdist, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Ruler(this, center, p2, sys, sky, distsys, distdist, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createCompassCmd(const Vector& center, double r, const char* north, const char* east, int na, int ea, Coord::CoordSystem sys, Coord::SkyFrame sky, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Compass(this, center, r, north, east, na, ea, sys, sky, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createProjectionCmd(const Vector& center, const Vector& p2, double w, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Projection(this, center, p2, w, color, dash, width, font, text, prop, comment, tag, cb)); } // Annulus Regions void Base::createAnnulusCmd(const Vector& center, double start, double stop, int num, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag,const List& cb) { createMarker(new Annulus(this, center, start, stop, num, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createAnnulusCmd(const Vector& center, int num, double* radii, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag,const List& cb) { createMarker(new Annulus(this, center, num, radii, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createEllipseAnnulusCmd(const Vector& center, const Vector& inner, const Vector& outer, int num, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new EllipseAnnulus(this, center, inner, outer, num, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createEllipseAnnulusCmd(const Vector& center, int num, Vector* radii, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new EllipseAnnulus(this, center, num, radii, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createBoxAnnulusCmd(const Vector& center, const Vector& inner, const Vector& outer, int num, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new BoxAnnulus(this, center, inner, outer, num, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createBoxAnnulusCmd(const Vector& center, int num, Vector* size, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new BoxAnnulus(this, center, num, size, angle, color, dash, width, font, text, prop, comment, tag, cb)); } // Panda Regions void Base::createCpandaCmd(const Vector& center, double ang1, double ang2, int an, double rad1, double rad2, int rn, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Cpanda(this, center, ang1, ang2, an, rad1, rad2, rn, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createCpandaCmd(const Vector& center, int an, double* a, int rn, double* r, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Cpanda(this, center, an, a, rn, r, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createEpandaCmd(const Vector& center, double ang1, double ang2, int an, const Vector& rad1, const Vector& rad2, int rn, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Epanda(this, center, ang1, ang2, an, rad1, rad2, rn, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createEpandaCmd(const Vector& center, int an, double* a, int rn, Vector* r, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Epanda(this, center, an, a, rn, r, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createBpandaCmd(const Vector& center, double ang1, double ang2, int an, const Vector& rad1, const Vector& rad2, int rn, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Bpanda(this, center, ang1, ang2, an, rad1, rad2, rn, angle, color, dash, width, font, text, prop, comment, tag, cb)); } void Base::createBpandaCmd(const Vector& center, int an, double* a, int rn, Vector* r, double angle, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { createMarker(new Bpanda(this, center, an, a, rn, r, angle, color, dash, width, font, text, prop, comment, tag, cb)); } // Composite Regions void Base::createCompositeCmd(const Vector& center, double angle, int global, const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { Composite* m = new Composite(this, center, angle, global, color, dash, width, font, text, prop, comment, tag, cb); createMarker(m); compositeMarker = m; } void Base::createCompositeCmd( const char* color, int* dash, int width, const char* font, const char* text, unsigned short prop, const char* comment, const List& tag, const List& cb) { // find center Vector cc; int cnt=0; Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && strncmp(mm->getType(),"composite", 9)) { cc += mm->getCenter(); cnt++; } mm=mm->next(); } cc /= cnt; // create composite Composite* mk = new Composite(this, cc, 0, 1, color, dash, width, font, text, prop, comment, tag, cb); createMarker(mk); // append members mm=markers->head(); while (mm) { if (mm->isSelected() && strncmp(mm->getType(),"composite",9)) { mm->unselect(); Marker* next = markers->extractNext(mm); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); mk->append(mm); mm = next; } else mm=mm->next(); } // all done mk->updateBBox(); mk->select(); update(PIXMAP); } // Template Regions void Base::createTemplateCmd(const Vector& center, const char* fn) { ifstream str(fn); if (!str) { result = TCL_ERROR; return; } createTemplate(center,str); } void Base::createTemplateCmd(const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky, const char* fn) { ifstream str(fn); if (!str) { result = TCL_ERROR; return; } createTemplate(currentContext->cfits->mapToRef(v, sys, sky),str); } void Base::createTemplateVarCmd(const Vector& center, const char* var) { Tcl_Obj* obj = Tcl_GetVar2Ex(interp, (char*)var, NULL, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG); if (!obj) return; // just in case Tcl_ConvertToType(interp, obj, Tcl_GetObjType("bytearray")); typedef struct ByteArray { int used; /* The number of bytes used in the byte * array. */ int allocated; /* The amount of space actually allocated * minus 1 byte. */ unsigned char bytes[4]; /* The array of bytes. The actual size of * this field depends on the 'allocated' field * above. */ } ByteArray; Tcl_IncrRefCount(obj); // only make command string as long as needed // or the rest will be processed as garbage ByteArray* ba = (ByteArray*)(obj->internalRep.otherValuePtr); int len = ba->used+2; char* buf = new char[len]; memcpy(buf, (char*)ba->bytes, ba->used); Tcl_DecrRefCount(obj); // add terminator to make parser happy buf[len-2] = '\n'; buf[len-1] = '\0'; string x(buf); istringstream istr(x); createTemplate(center,istr); delete [] buf; } void Base::createTemplate(const Vector& center, istream& str) { FitsImage* ptr = keyContext->fits; while (ptr) { ptr->initWCS0(center); ptr = ptr->nextMosaic(); } mkFlexLexer* ll = new mkFlexLexer(&str); mkparse(this, ll); delete ll; Marker* mk = compositeMarker; resetCompositeMarker(); ptr = keyContext->fits; while (ptr) { ptr->resetWCS0(); ptr = ptr->nextMosaic(); } if (mk) { mk->moveTo(center); update(PIXMAP, mk->getAllBBox()); // and return id printInteger(mk->getId()); } } // Support void Base::createMarker(Marker* m) { if (maperr) { Tcl_SetVar2(interp, "ds9", "msg", "Bad Coordinate mapping, unable to create some region(s).", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "ds9", "msg,level", "warning", TCL_GLOBAL_ONLY); delete m; return; } if (compositeMarker) { compositeMarker->append(m); compositeMarker->updateBBox(); } else { markers->append(m); // now update new marker update(PIXMAP, m->getAllBBox()); // can't do this for windows, threads are weird // parser.Y and ds9parser.Y are not thread safe // *bad* exectute any Edit CallBacks // m->doCallBack(CallBack::EDITCB); // and return id printInteger(m->getId()); } } Vector Base::centroid(const Vector& vv) { FitsImage* ptr = currentContext->cfits; while (ptr) { Vector img = vv * ptr->refToData; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); if (img[0]>=params->xmin && img[0]xmax && img[1]>=params->ymin && img[1]ymax) break; ptr = ptr->nextMosaic(); } if (!ptr) return vv; FitsBound* params = ptr->getDataParams(currentContext->frScale.scanMode()); // int srcw = ptr->width(); Vector cd = vv * ptr->refToData; float rr = centroidRadius; float rr2 = rr*rr; // main loop SETSIGBUS for (int kk=0; kk=params->xmin && aa[0]xmax && aa[1]>=params->ymin && aa[1]ymax) { if (ii*ii+jj*jj <= rr2) { double val = ptr->getValueDouble(aa); // check for nan if (isfinite(val)) { sum += aa*val; weight += val; } } } } } if (weight>0) cd = sum/weight; else break; } CLEARSIGBUS return cd * ptr->dataToRef; } void Base::getMarkerAnalysisHistogramCmd(char* xname, char* yname, int num) { Marker* mm = markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisHistogram(xname, yname, num); return; } mm=mm->next(); } } void Base::getMarkerAnalysisHistogramCmd(int id, char* xname, char* yname, int num) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisHistogram(xname, yname, num); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPlot2dCmd(char* xname, char* yname, char* xcname, char* ycname, Coord::CoordSystem sys, Coord::SkyFrame sky, Marker::AnalysisMethod method) { Marker* mm=markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisPlot2d(xname, yname, xcname, ycname, sys, sky, method); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPlot2dCmd(int id, char* xname, char* yname, char* xcname, char* ycname, Coord::CoordSystem sys, Coord::SkyFrame sky, Marker::AnalysisMethod method) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisPlot2d(xname, yname, xcname, ycname, sys, sky, method); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPlot3dCmd(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { Marker* mm=markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisPlot3d(xname, yname, sys, method); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPlot3dCmd(int id, char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisPlot3d(xname, yname, sys, method); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPandaCmd(Coord::CoordSystem sys) { Marker* mm=markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisPanda(sys); return; } mm=mm->next(); } } void Base::getMarkerAnalysisPandaCmd(int id, Coord::CoordSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisPanda(sys); return; } mm=mm->next(); } } void Base::getMarkerAnalysisRadialCmd(char* xname, char* yname, char* yename, Coord::CoordSystem sys) { Marker* mm=markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisRadial(xname, yname, yename, sys); return; } mm=mm->next(); } } void Base::getMarkerAnalysisRadialCmd(int id, char* xname, char* yname, char* yename, Coord::CoordSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisRadial(xname, yname, yename, sys); return; } mm=mm->next(); } } void Base::getMarkerAnalysisStatsCmd(Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (!mm->getProperty(Marker::HIDDEN)) { mm->analysisStats(sys,sky); return; } mm=mm->next(); } } void Base::getMarkerAnalysisStatsCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysisStats(sys,sky); return; } mm=mm->next(); } } void Base::getMarkerAngleCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { printDouble(radToDeg(mm->getAngle()), DEFAULT); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerAngleCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { printDouble(radToDeg(mapAngleFromRef(mm->getAngle(), sys, sky)), DEFAULT); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerAnnulusRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Annulus*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintDouble(r[0], sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerAnnulusRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Annulus*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintDouble(mm->getCenter(), r[0], sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBoxAnnulusRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((BoxAnnulus*)mm)->numAnnuli(); for (int i=0; iannuli(i), sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBoxAnnulusRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((BoxAnnulus*)mm)->numAnnuli(); for (int i=0; igetCenter(), ((BoxAnnulus*)mm)->annuli(i), sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBoxRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintVector(((Box*)mm)->annuli(0), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBoxRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintVector(mm->getCenter(), ((Box*)mm)->annuli(0), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBpandaAnglesCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Bpanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } } void Base::getMarkerBpandaAnglesCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Bpanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii),sys,sky)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } } void Base::getMarkerBpandaRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Bpanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintVector(((EllipseAnnulus*)mm)->annuli(i), sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerBpandaRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Bpanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintVector(mm->getCenter(), ((EllipseAnnulus*)mm)->annuli(i), sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCenterCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), sys); return; } mm=mm->next(); } } void Base::getMarkerCenterCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), mm->getCenter(), sys, sky, format); return; } mm=mm->next(); } } void Base::getMarkerCircleRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Vector r = ((Circle*)mm)->annuli(0); markerPrintDouble(r[0],sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCircleRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Vector r = ((Circle*)mm)->annuli(0); markerPrintDouble(mm->getCenter(),r[0],sys,dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCpandaAnglesCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Cpanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCpandaAnglesCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Cpanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii),sys,sky)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCpandaRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Cpanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintDouble(r[0], sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCpandaRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Cpanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintDouble(mm->getCenter(), r[0], sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerColorCmd() { // return first found Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { Tcl_AppendResult(interp, mm->getColorName(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerColorCmd(const char* tag) { // return first found Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { Tcl_AppendResult(interp, mm->getColorName(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerColorCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, mm->getColorName(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompassArrowCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (((Compass*)mm)->getNorthArrow()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); if (((Compass*)mm)->getEastArrow()) Tcl_AppendResult(interp, " 1", NULL); else Tcl_AppendResult(interp, " 0", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompassLabelCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendElement(interp, ((Compass*)mm)->getNorthText()); Tcl_AppendElement(interp, ((Compass*)mm)->getEastText()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompassRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { // double r = ((Compass*)mm)->getRadius(); markerPrintDouble(((Compass*)mm)->getRadius(), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompassRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(),((Compass*)mm)->getRadius(),sys,dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompassSystemCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { printCoordSystem(((Compass*)mm)->getSystem()); Tcl_AppendResult(interp, " ", NULL); printSkyFrame(((Compass*)mm)->getSkyFrame()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerCompositeCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (((Composite*)mm)->getGlobal()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } } void Base::getMarkerEllipseRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintVector(((Ellipse*)mm)->annuli(0),sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEllipseRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintVector(mm->getCenter(),((Ellipse*)mm)->annuli(0),sys,dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEllipseAnnulusRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((EllipseAnnulus*)mm)->numAnnuli(); for (int i=0; iannuli(i), sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEllipseAnnulusRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((EllipseAnnulus*)mm)->numAnnuli(); for (int i=0; igetCenter(), ((EllipseAnnulus*)mm)->annuli(i), sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEpandaAnglesCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Epanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } } void Base::getMarkerEpandaAnglesCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Epanda*)mm)->numAngles(); double first=0; for (int ii=0; iiangles(ii),sys,sky)); if (!ii) first = ang; else if (ang<=first+FLT_EPSILON) ang += 360; printDouble(ang, DEFAULT); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } } void Base::getMarkerEpandaRadiusCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Epanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintVector(((EllipseAnnulus*)mm)->annuli(i), sys); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEpandaRadiusCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { int cnt = ((Epanda*)mm)->numAnnuli(); for (int i=0; iannuli(i); markerPrintVector(mm->getCenter(), ((EllipseAnnulus*)mm)->annuli(i), sys, dist); Tcl_AppendResult(interp, "\n", NULL); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerEpsilonCmd() { ostringstream str; str << markerEpsilon << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getMarkerFontCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { Tcl_AppendResult(interp, mm->getFont(), NULL); return; } mm=mm->next(); } } void Base::getMarkerFontCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { Tcl_AppendResult(interp, mm->getFont(), NULL); return; } mm=mm->next(); } } void Base::getMarkerFontCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, mm->getFont(), NULL); return; } mm=mm->next(); } } void Base::getMarkerHandleCmd(const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { int h = mm->onHandle(v); if (h) { ostringstream str; str << mm->getId() << ' ' << h << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } } mm=mm->next(); } Tcl_AppendResult(interp, "0 0", NULL); } void Base::getMarkerIdCmd(const char* tag) { // return first found Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { printInteger(mm->getId()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerIdCmd(const Vector& v) { // v is in canvas coords Marker* mm=markers->head(); while (mm) { if (mm->isIn(v)) { printInteger(mm->getId()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerIdAllCmd() { Marker* mm=markers->head(); while (mm) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); mm=mm->next(); } } void Base::getMarkerLineCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(((Line*)mm)->getP1(), sys); markerPrintCoord(((Line*)mm)->getP2(), sys); return; } mm=mm->next(); } } void Base::getMarkerLineCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), ((Line*)mm)->getP1(), sys, sky, format); markerPrintCoord(mm->getCenter(), ((Line*)mm)->getP2(), sys, sky, format); return; } mm=mm->next(); } } void Base::getMarkerLineArrowCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (((Line*)mm)->getP1Arrow()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); if (((Line*)mm)->getP2Arrow()) Tcl_AppendResult(interp, " 1", NULL); else Tcl_AppendResult(interp, " 0", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerLineLengthCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(((Line*)mm)->getP2(),((Line*)mm)->getP1(), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerLineLengthCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(),((Line*)mm)->getP2(),((Line*)mm)->getP1(), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerLineWidthCmd() { // return first found Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { ostringstream str; str << mm->getLineWidth() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerLineWidthCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { ostringstream str; str << mm->getLineWidth() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerMapLenFromRefCmd(int id, double d, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { FitsImage* ptr = findFits(sys,mm->getCenter()); printDouble(ptr->mapLenFromRef(d,sys,dist), DEFAULT); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerPointShapeCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, ((Point*)mm)->shape(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerPointSizeCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { printInteger(((Point*)mm)->size()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerPolygonSegmentCmd(const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { int s = mm->getSegment(v); if (s) { ostringstream str; str << mm->getId() << ' ' << s << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } } mm=mm->next(); } Tcl_AppendResult(interp, "0 0", NULL); } void Base::getMarkerPreserveCmd() { if (preserveMarkers) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerProjectionPointsCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(((Projection*)mm)->getP1(), sys); markerPrintCoord(((Projection*)mm)->getP2(), sys); return; } mm=mm->next(); } } void Base::getMarkerProjectionPointsCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), ((Projection*)mm)->getP1(), sys, sky, format); markerPrintCoord(mm->getCenter(), ((Projection*)mm)->getP2(), sys, sky, format); return; } mm=mm->next(); } } void Base::getMarkerProjectionLengthCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(((Projection*)mm)->getP2(), ((Projection*)mm)->getP1(), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerProjectionLengthCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(), ((Projection*)mm)->getP2(), ((Projection*)mm)->getP1(), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerProjectionWidthCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(((Projection*)mm)->getWidth(), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerProjectionWidthCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(), ((Projection*)mm)->getWidth(), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerPropertyCmd(unsigned short which) { // return first selected found Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { mm->getProperty(which) ? Tcl_AppendResult(interp, "1", NULL): Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } // else, return 'off' Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerPropertyCmd(const char* tag, unsigned short which) { // return first selected found Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { mm->getProperty(which) ? Tcl_AppendResult(interp, "1", NULL): Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } // else, return 'off' Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerPropertyCmd(int id, unsigned short which) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->getProperty(which) ? Tcl_AppendResult(interp, "1", NULL): Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } // else, return 'off' Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerRulerLengthCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(((Ruler*)mm)->getP2(),((Ruler*)mm)->getP1(),sys); Tcl_AppendResult(interp, " ", NULL); markerPrintDouble(((Ruler*)mm)->getP3(),((Ruler*)mm)->getP1(),sys); Tcl_AppendResult(interp, " ", NULL); markerPrintDouble(((Ruler*)mm)->getP3(),((Ruler*)mm)->getP2(),sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerRulerLengthCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(), ((Ruler*)mm)->getP2(), ((Ruler*)mm)->getP1(), sys, dist); Tcl_AppendResult(interp, " ", NULL); markerPrintDouble(mm->getCenter(), ((Ruler*)mm)->getP3(), ((Ruler*)mm)->getP1(), sys, dist); Tcl_AppendResult(interp, " ", NULL); markerPrintDouble(mm->getCenter(), ((Ruler*)mm)->getP3(), ((Ruler*)mm)->getP2(), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerRulerPointCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(((Ruler*)mm)->getP1(), sys); markerPrintCoord(((Ruler*)mm)->getP2(), sys); return; } mm=mm->next(); } } void Base::getMarkerRulerPointCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), ((Ruler*)mm)->getP1(), sys, sky, format); markerPrintCoord(mm->getCenter(), ((Ruler*)mm)->getP2(), sys, sky, format); return; } mm=mm->next(); } } void Base::getMarkerRulerSystemCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { printCoordSystem(((Ruler*)mm)->getSystem()); Tcl_AppendResult(interp, " ", NULL); printSkyFrame(((Ruler*)mm)->getSkyFrame()); Tcl_AppendResult(interp, " ", NULL); printCoordSystem(((Ruler*)mm)->getDistSystem()); Tcl_AppendResult(interp, " ", NULL); printSkyDist(((Ruler*)mm)->getDistDist()); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerSegmentSegmentCmd(const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { int s = mm->getSegment(v); if (s) { ostringstream str; str << mm->getId() << ' ' << s << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } } mm=mm->next(); } Tcl_AppendResult(interp, "0 0", NULL); } void Base::getMarkerSelectedCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } mm=mm->next(); } } void Base::getMarkerSelectedCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->isSelected()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } } void Base::getMarkerSelectedCmd(const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->isIn(v) && mm->isSelected()) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerNumberCmd() { int count=0; Marker* mm=markers->head(); while (mm) { count++; mm=mm->next(); } printInteger(count); } void Base::getMarkerSelectedNumberCmd() { int count=0; Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) count++; mm=mm->next(); } printInteger(count); } void Base::getMarkerHighlitedCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isHighlited()) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } mm=mm->next(); } } void Base::getMarkerHighlitedCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->isHighlited()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } } void Base::getMarkerHighlitedCmd(const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->isIn(v) && mm->isHighlited()) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerHighlitedNumberCmd() { int count=0; Marker* mm=markers->head(); while (mm) { if (mm->isHighlited()) count++; mm=mm->next(); } printInteger(count); } void Base::getMarkerShowCmd() { if (showMarkers) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerShowTextCmd() { if (showMarkersText) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerCentroidAutoCmd() { if (centroidAuto) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::getMarkerCentroidRadiusCmd() { ostringstream str; str << centroidRadius << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getMarkerCentroidIterationCmd() { ostringstream str; str << centroidIteration << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } // backup compatibility void Base::getMarkerCentroidOptionCmd() { ostringstream str; str << centroidIteration << centroidRadius << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getMarkerTagCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { ostringstream str; str << mm->getId() << ' ' << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } mm=mm->next(); } } void Base::getMarkerTagCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { const char* r = mm->getTag(); while (r) { Tcl_AppendElement(interp, r); r = mm->getNextTag(); } return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerTagCmd(int id, int num) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, mm->getTag(num), NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerTagDefaultNameCmd() { int cnt = 1; again: ostringstream str; str << "Group " << cnt << ends; Marker* mm = markers->head(); while (mm) { if (mm->hasTag(str.str().c_str())) { cnt++; goto again; } mm=mm->next(); } Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Base::getMarkerTagNumberCmd(const char* tag) { // return number of markers with tag int count=0; Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) count++; mm=mm->next(); } printInteger(count); } void Base::getMarkerTagsCmd() { // return all tags List tags; // loop thru all markers Marker* mm=markers->head(); while (mm) { // loop thru all tags in markers const char* t = mm->getTag(); while (t) { // loop thru our current list int found = 0; Tag* tt = tags.head(); while (tt) { if (!strcmp(tt->tag(), t)) { found =1; break; } tt = tt->next(); } // didn't find it, add it to the list if (!found) { tags.append(new Tag(t)); } t=mm->getNextTag(); } mm=mm->next(); } // now sort // ok, dump the tags Tag* tt = tags.head(); while (tt) { Tcl_AppendElement(interp, tt->tag()); tt=tt->next(); } } void Base::getMarkerTextCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, mm->getText(), NULL); return; } mm=mm->next(); } } void Base::getMarkerTextRotateCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (((Text*)mm)->getRotate()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerTypeCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { Tcl_AppendResult(interp, mm->getType(), NULL); return; } mm=mm->next(); } } void Base::getMarkerVectorCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(((Line*)mm)->getP1(), sys); return; } mm=mm->next(); } } void Base::getMarkerVectorCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintCoord(mm->getCenter(), ((Line*)mm)->getP1(), sys, sky, format); return; } mm=mm->next(); } } void Base::getMarkerVectorArrowCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (((Vect*)mm)->getArrow()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerVectorLengthCmd(int id, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(((Vect*)mm)->getP2(), ((Vect*)mm)->getP1(), sys); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::getMarkerVectorLengthCmd(int id, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { markerPrintDouble(mm->getCenter(), ((Vect*)mm)->getP2(), ((Vect*)mm)->getP1(), sys, dist); return; } mm=mm->next(); } Tcl_AppendResult(interp, "", NULL); } void Base::hasMarkerHighlitedCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isHighlited()) { Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::hasMarkerPasteCmd() { if (!pasteMarkers->isEmpty()) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::hasMarkerSelectedCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::hasMarkerUndoCmd() { if (!undoMarkers->isEmpty()) switch (undoMarkerType) { case MOVE: Tcl_AppendResult(interp, "move", NULL); return; case EDIT: Tcl_AppendResult(interp, "edit", NULL); return; case DELETE: Tcl_AppendResult(interp, "delete", NULL); return; default: Tcl_AppendResult(interp, "", NULL); return; } else Tcl_AppendResult(interp, "", NULL); } void Base::markerLayerCmd(MarkerLayer layer) { switch (layer) { case USER: markers = &userMarkers; undoMarkers = &undoUserMarkers; pasteMarkers = &pasteUserMarkers; break; case CATALOG: markers = &catalogMarkers; undoMarkers = &undoCatalogMarkers; pasteMarkers = &pasteCatalogMarkers; break; case ANALYSIS: markers = &analysisMarkers; undoMarkers = &undoAnalysisMarkers; pasteMarkers = &pasteAnalysisMarkers; break; default: // na break; } } void Base::markerAnalysisCmd(int id, Marker::AnalysisTask aa, int which) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->analysis(aa,which); return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAngleCmd(int id, double angle) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canRotate()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); mm->setAngle(angle); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAngleCmd(int id, double angle, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canRotate()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); mm->setAngle(mapAngleToRef(angle,sys,sky)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAnnulusCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Annulus*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAnnulusDeleteRadiusCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Annulus*)mm)->deleteAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerAnnulusRadiusCmd(int id, double inner, double outer, int num, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); double r1 = mapLenToRef(inner,sys); double r2 = mapLenToRef(outer,sys); ((Annulus*)mm)->setAnnuli(Vector(r1,r1),Vector(r2,r2),num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAnnulusRadiusCmd(int id, double inner, double outer, int num, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); double r1 = ptr->mapLenToRef(inner, sys, dist); double r2 = ptr->mapLenToRef(outer, sys, dist); ((Annulus*)mm)->setAnnuli(Vector(r1,r1),Vector(r2,r2),num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerAnnulusRadiusCmd(int id, const char* lev, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int cnt = 0; Vector radii[MAXANNULI]; string x(lev); istringstream str(x); while ((cnt> radii[cnt][0])) { radii[cnt][1] = radii[cnt][0]; ++cnt; } FitsImage* ptr = findFits(sys,mm->getCenter()); for (int i=0; imapLenToRef(radii[i], sys, dist); ((Annulus*)mm)->setAnnuli(radii,cnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBackCmd() { Marker* mm = markers->tail(); while (mm) { if (mm->isSelected()) { Marker* prev = markers->extractPrev(mm); markers->append(mm); update(PIXMAP, mm->getAllBBox()); mm = prev; } else mm=mm->previous(); } } void Base::markerBackCmd(const char* tag) { Marker* mm = markers->tail(); while (mm) { if (mm->hasTag(tag)) { Marker* prev = markers->extractPrev(mm); markers->append(mm); update(PIXMAP, mm->getAllBBox()); mm = prev; } else mm=mm->previous(); } } void Base::markerBackCmd(int id) { Marker* mm = markers->tail(); while (mm) { if (mm->getId() == id) { markers->extractPrev(mm); markers->append(mm); update(PIXMAP, mm->getAllBBox()); return; } else mm=mm->previous(); } } void Base::markerBoxAnnulusRadiusCmd(int id, const Vector& inner, const Vector& outer, int num, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); Vector s1 = mapLenToRef(inner, sys); Vector s2 = mapLenToRef(outer, sys); ((BoxAnnulus*)(mm))->setAnnuli(s1,s2,num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBoxAnnulusRadiusCmd(int id, const Vector& inner, const Vector& outer, int num, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); Vector s1 = ptr->mapLenToRef(inner, sys, dist); Vector s2 = ptr->mapLenToRef(outer, sys, dist); ((BoxAnnulus*)(mm))->setAnnuli(s1,s2,num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBoxAnnulusRadiusCmd(int id,const char* lev, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int cnt = 0; Vector size[MAXANNULI]; string x(lev); istringstream str(x); while ((cnt> size[cnt][0])) str >> size[cnt++][1]; // verify proper ratios for (int i=0; igetCenter()); for (int i=0; imapLenToRef(size[i], sys, dist); ((BoxAnnulus*)mm)->setAnnuli(size,cnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBoxAnnulusCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((BoxAnnulus*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBoxAnnulusDeleteRadiusCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((BoxAnnulus*)mm)->deleteAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerBoxRadiusCmd(int id, const Vector& size, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Box*)(mm))->setAnnuli(mapLenToRef(size, sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBoxRadiusCmd(int id, const Vector& size, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Box*)(mm))->setAnnuli(ptr->mapLenToRef(size, sys, dist)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBpandaCreateAnglesCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Bpanda*)mm)->addAngles(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBpandaCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Bpanda*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBpandaDeleteCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Bpanda*)mm)->deleteAnglesAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerBpandaEditCmd(int id, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Bpanda*)mm)->setAnglesAnnuli(a1,a2,an,r1,r2,rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBpandaEditCmd(int id, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Bpanda*)mm)->setAnglesAnnuli(mapAngleToRef(a1,sys,sky), mapAngleToRef(a2,sys,sky),an,r1,r2,rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerBpandaEditCmd(int id, const char* a, const char* r, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem rsys, Coord::SkyDist rdist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int acnt = 0; double angles[MAXANGLES]; { string x(a); istringstream astr(x); while ((acnt> angles[acnt])) ++acnt; } for (int i=0; i> radii[rcnt][0])) rstr >> radii[rcnt++][1]; } // verify proper ratios for (int i=0; igetCenter()); for (int i=0; imapLenToRef(radii[i], rsys, rdist); ((Bpanda*)mm)->setAnglesAnnuli(angles,acnt,radii,rcnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCallBackCmd(int id, CallBack::Type cb, const char* p, const char* a) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { result = mm->addCallBack(cb, p, a); return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCentroidCmd() { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); mm->centroid(); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerCentroidCmd(const char* tag) { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->canMove() && mm->hasTag(tag)) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); mm->centroid(); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerCentroidCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) { markerUndo(mm, MOVE); update(PIXMAP, mm->getAllBBox()); mm->centroid(); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerCentroidAutoCmd(int which) { centroidAuto = which; } void Base::markerCentroidRadiusCmd(float rad) { centroidRadius = rad; } void Base::markerCentroidIterationCmd(int iter) { centroidIteration = iter; } void Base::markerCircleRadiusCmd(int id, double radius, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); double r = mapLenToRef(radius, sys); ((Circle*)mm)->setAnnuli(Vector(r,r)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCircleRadiusCmd(int id, double radius, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); double r = ptr->mapLenToRef(radius, sys, dist); ((Circle*)mm)->setAnnuli(Vector(r,r)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerColorCmd(const char* clr) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { mm->setColor(clr); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerColorCmd(const char* tag, const char* clr) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { mm->setColor(clr); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerColorCmd(int id, const char* clr) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->setColor(clr); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerCommandCmd(MarkerFormat fm, const char* ccmd) { // only make command string as long as needed // or the rest will be processed as garbage int len = strlen(ccmd)+2; char* buf = new char[len]; memcpy(buf, ccmd, len); // add terminator to make parser happy buf[len-2] = '\n'; buf[len-1] = '\0'; string x(buf); istringstream istr(x); parseMarker(fm, istr); delete [] buf; } void Base::markerCommandVarCmd(MarkerFormat fm, const char* var) { const char* ccmd = Tcl_GetVar(interp, var, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG); if (!ccmd) { result = TCL_ERROR; return; } // only make command string as long as needed // or the rest will be processed as garbage int len = strlen(ccmd)+2; char* buf = new char[len]; memcpy(buf, ccmd, len); // add terminator to make parser happy buf[len-2] = '\n'; buf[len-1] = '\0'; string x(buf); istringstream istr(x); parseMarker(fm, istr); delete [] buf; } void Base::markerCompassArrowCmd(int id, int n, int e) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { ((Compass*)(mm))->setArrows(n, e); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompassLabelCmd(int id, const char* n, const char* e) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { // it may shrink update(PIXMAP, mm->getAllBBox()); ((Compass*)(mm))->setLabels(n, e); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompassRadiusCmd(int id, double r, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); double rr = mapLenToRef(r, sys); ((Compass*)mm)->setRadius(rr); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompassRadiusCmd(int id, double r, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); double rr = ptr->mapLenToRef(r, sys, dist); ((Compass*)mm)->setRadius(rr); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompassSystemCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { // it may shrink update(PIXMAP, mm->getAllBBox()); ((Compass*)(mm))->setCoordSystem(sys, sky); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompositeCmd(int id, int gl) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { ((Composite*)(mm))->setGlobal(gl); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCompositeDeleteCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && !strncmp(mm->getType(),"composite",9)) { Marker* nn = ((Composite*)mm)->extract(); while (nn) { markers->append(nn); nn = ((Composite*)mm)->extract(); } Marker* next = markers->extractNext(mm); delete mm; mm = next; update(PIXMAP); } else mm=mm->next(); } } void Base::markerCopyCmd() { undoMarkers->deleteAll(); pasteMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->isSelected()) pasteMarkers->append(mm->dup()); mm=mm->next(); } } void Base::markerCopyCmd(const char* tag) { undoMarkers->deleteAll(); pasteMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->hasTag(tag)) pasteMarkers->append(mm->dup()); mm=mm->next(); } } void Base::markerCpandaCreateAnglesCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Cpanda*)mm)->addAngles(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCpandaCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Cpanda*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCpandaDeleteCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Cpanda*)mm)->deleteAnglesAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerCpandaEditCmd(int id, double a1, double a2, int an, double r1, double r2, int rn) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Cpanda*)mm)->setAnglesAnnuli(a1,a2,an,Vector(r1,r1),Vector(r2,r2),rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCpandaEditCmd(int id, double a1, double a2, int an, double r1, double r2, int rn, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Cpanda*)mm)->setAnglesAnnuli(mapAngleToRef(a1,sys,sky), mapAngleToRef(a2,sys,sky), an, Vector(r1,r1),Vector(r2,r2),rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCpandaEditCmd(int id, const char* a, const char* r, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem rsys, Coord::SkyDist rdist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int acnt = 0; double angles[MAXANGLES]; { string x(a); istringstream astr(x); while ((acnt> angles[acnt])) ++acnt; } { for (int i=0; i> radii[rcnt][0])) { radii[rcnt][1] = radii[rcnt][0]; ++rcnt; } } { FitsImage* ptr = findFits(sys,mm->getCenter()); for (int i=0; imapLenToRef(radii[i], rsys, rdist); } ((Cpanda*)mm)->setAnglesAnnuli(angles,acnt,radii,rcnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerCutCmd() { undoMarkers->deleteAll(); pasteMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->isSelected() && mm->canDelete()) { Marker* next = markers->extractNext(mm); update(PIXMAP); pasteMarkers->append(mm); mm->doCallBack(CallBack::DELETECB); mm->disableCB(); mm = next; } else mm=mm->next(); } } void Base::markerCutCmd(const char* tag) { undoMarkers->deleteAll(); pasteMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->canDelete() && mm->hasTag(tag)) { Marker* next = markers->extractNext(mm); update(PIXMAP); pasteMarkers->append(mm); mm->doCallBack(CallBack::DELETECB); mm->disableCB(); mm = next; } else mm=mm->next(); } } void Base::markerDeleteCallBackCmd(int id, CallBack::Type cb, const char* p) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { result = mm->deleteCallBack(cb, p); return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerDeleteCmd() { undoMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->isSelected() && mm->canDelete()) { Marker* next = markers->extractNext(mm); update(PIXMAP); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); undoMarkers->append(mm); undoMarkerType = DELETE; mm = next; } else mm=mm->next(); } } void Base::markerDeleteCmd(const char* tag) { undoMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->canDelete() && mm->hasTag(tag)) { Marker* next = markers->extractNext(mm); update(PIXMAP); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); undoMarkers->append(mm); undoMarkerType = DELETE; mm = next; } else mm=mm->next(); } } void Base::markerDeleteCmd(int id) { undoMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canDelete()) { markers->extractNext(mm); update(PIXMAP); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); undoMarkers->append(mm); undoMarkerType = DELETE; } return; } else mm=mm->next(); } } void Base::markerDeleteAllCmd() { undoMarkers->deleteAll(); Marker* mm = markers->head(); while (mm) { if (mm->canDelete()) { update(PIXMAP); Marker* next = markers->extractNext(mm); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); undoMarkers->append(mm); undoMarkerType = DELETE; mm = next; } else mm=mm->next(); } } void Base::markerDeleteLastCmd() { undoMarkers->deleteAll(); Marker* mm=markers->tail(); if (mm && mm->canDelete()) { markers->extractNext(mm); update(PIXMAP); mm->doCallBack(CallBack::DELETECB); mm->deleteCBs(); undoMarkers->append(mm); undoMarkerType = DELETE; return; } } void Base::markerDeleteTagCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canDelete()) mm->deleteTags(); return; } mm=mm->next(); } } void Base::markerDeleteTagCmd(int id, const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canDelete()) mm->deleteTag(tag); return; } mm=mm->next(); } } void Base::markerDeleteTagCmd(int id, int which) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canDelete()) mm->deleteTag(which); return; } mm=mm->next(); } } void Base::markerEditBeginCmd(int id, int h) { // remember which marker is being edited Marker* mm=markers->head(); while (mm) { if (mm->getId() == id && mm->canEdit()) { markerUndo(mm, EDIT); editMarker = mm; editMarker->editBegin(h); return; } mm=mm->next(); } editMarker = NULL; } void Base::markerEditBeginCmd(const Vector& v, int h) { // remember which marker is being edited Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canEdit()) { markerUndo(mm, EDIT); editMarker = mm; editMarker->editBegin(h); return; } mm=mm->next(); } editMarker = NULL; } void Base::markerEditMotionCmd(const Vector& vv, int hh) { if (editMarker) { // erase current marker now redraw(editMarker->getAllBBox()); forceUpdate(); editMarker->edit(mapToRef(vv,Coord::CANVAS), hh); x11MarkerXOR(editMarker); } } void Base::markerEditEndCmd() { if (editMarker) editMarker->editEnd(); editMarker = NULL; update(PIXMAP); } void Base::markerEllipseRadiusCmd(int id, const Vector& radius, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); Vector r = mapLenToRef(radius, sys); ((Ellipse*)mm)->setAnnuli(r); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseRadiusCmd(int id, const Vector& radius, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); Vector r = ptr->mapLenToRef(radius, sys, dist); ((Ellipse*)mm)->setAnnuli(r); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseAnnulusRadiusCmd(int id, const Vector& inner, const Vector& outer, int num, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); Vector r1 = mapLenToRef(inner, sys); Vector r2 = mapLenToRef(outer, sys); ((EllipseAnnulus*)(mm))->setAnnuli(r1,r2,num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseAnnulusRadiusCmd(int id, const Vector& inner, const Vector& outer, int num, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); Vector r1 = ptr->mapLenToRef(inner, sys, dist); Vector r2 = ptr->mapLenToRef(outer, sys, dist); ((EllipseAnnulus*)(mm))->setAnnuli(r1,r2,num); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseAnnulusRadiusCmd(int id, const char* lev, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int cnt = 0; Vector radii[MAXANNULI]; string x(lev); istringstream str(x); while ((cnt> radii[cnt][0])) str >> radii[cnt++][1]; // verify proper ratios for (int i=0; igetCenter()); for (int i=0; imapLenToRef(radii[i], sys, dist); ((EllipseAnnulus*)(mm))->setAnnuli(radii,cnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseAnnulusCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((EllipseAnnulus*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEllipseAnnulusDeleteRadiusCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((EllipseAnnulus*)mm)->deleteAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerEpandaCreateAnglesCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Epanda*)mm)->addAngles(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEpandaCreateRadiusCmd(int id, const Vector& vv) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); printInteger(((Epanda*)mm)->addAnnuli(mapToRef(vv,Coord::CANVAS))); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEpandaDeleteCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Epanda*)mm)->deleteAnglesAnnuli(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerEpandaEditCmd(int id, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Epanda*)mm)->setAnglesAnnuli(a1,a2,an,r1,r2,rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEpandaEditCmd(int id, double a1, double a2, int an, const Vector& r1, const Vector& r2, int rn, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Epanda*)mm)->setAnglesAnnuli(mapAngleToRef(a1,sys,sky), mapAngleToRef(a2,sys,sky),an,r1,r2,rn); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerEpandaEditCmd(int id, const char* a, const char* r, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem rsys, Coord::SkyDist rdist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); int acnt = 0; double angles[MAXANGLES]; { string x(a); istringstream astr(x); while ((acnt> angles[acnt])) ++acnt; } for (int i=0; i> radii[rcnt][0])) rstr >> radii[rcnt++][1]; } // verify proper ratios for (int i=0; igetCenter()); for (int i=0; imapLenToRef(radii[i], rsys, rdist); ((Epanda*)mm)->setAnglesAnnuli(angles,acnt,radii,rcnt); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerHighliteAllCmd() { Marker* mm=markers->head(); while (mm) { if (mm->canHighlite()) { mm->highlite(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerHighliteCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->getId() == id) { mm->highlite(); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerHighliteCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->hasTag(tag)) { mm->highlite(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerHighliteToggleCmd(const Vector& v) { // toggle the highlite of the first found Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->isIn(v)) { mm->toggleHighlite(); update(PIXMAP, mm->getBBox()); Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::markerHighliteOnlyCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->getId() == id) { if (!mm->isHighlited()) { mm->highlite(); update(PIXMAP, mm->getBBox()); } } else { if (mm->isHighlited()) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); } } mm=mm->next(); } } void Base::markerHighliteOnlyCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->hasTag(tag)) { if (!mm->isHighlited()) { mm->highlite(); update(PIXMAP, mm->getBBox()); } else { if (mm->isHighlited()) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); } } } mm=mm->next(); } } void Base::markerHighliteOnlyCmd(const Vector& v) { // first, check to see if we clicked on an already highlited marker Marker* mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->isIn(v) && mm->isHighlited()) { Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } // ok, now highlite the first found, and unhighlite the rest int found = 0; mm=markers->head(); while (mm) { if (mm->canHighlite() && mm->isIn(v) && !found) { if (!mm->isHighlited()) { mm->highlite(); update(PIXMAP, mm->getBBox()); } found = 1; } else { if (mm->isHighlited()) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); } } mm=mm->next(); } if (found) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::markerFontCmd(const char* f) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { // things can shrink, so do before and after update(PIXMAP, mm->getAllBBox()); mm->setFont(f); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerFontCmd(const char* tag, const char* f) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { // things can shrink, so do before and after update(PIXMAP, mm->getAllBBox()); mm->setFont(f); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerFontCmd(int id, const char* f) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { // things can shrink, so do before and after update(PIXMAP, mm->getAllBBox()); mm->setFont(f); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerFrontCmd() { Marker* mm = markers->head(); while (mm) { if (mm->isSelected()) { Marker* next = markers->extractNext(mm); markers->insertHead(mm); update(PIXMAP, mm->getAllBBox()); mm = next; } else mm=mm->next(); } } void Base::markerFrontCmd(const char* tag) { Marker* mm = markers->head(); while (mm) { if (mm->hasTag(tag)) { Marker* next = markers->extractNext(mm); markers->insertHead(mm); update(PIXMAP, mm->getAllBBox()); mm = next; } else mm=mm->next(); } } void Base::markerFrontCmd(int id) { Marker* mm = markers->head(); while (mm) { if (mm->getId() == id) { markers->extractNext(mm); markers->insertHead(mm); update(PIXMAP, mm->getAllBBox()); return; } else mm=mm->next(); } } void Base::markerKeyCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) mm->key(); mm=mm->next(); } } void Base::markerKeyCmd(const Vector& v) { // v is in canvas coords Marker* mm=markers->head(); while (mm) { if (mm->isIn(v)) mm->key(); mm=mm->next(); } } void Base::markerLineCmd(int id, const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Line*)(mm))->setPoints(mapToRef(p1,sys),mapToRef(p2,sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerLineCmd(int id, const Vector& p1, const Vector& p2, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Line*)(mm))->setPoints(ptr->mapToRef(p1,sys,sky), ptr->mapToRef(p2,sys,sky)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerLineArrowCmd(int id, int p1, int p2) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { ((Line*)(mm))->setArrows(p1, p2); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerLineWidthCmd(int w) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { mm->setLineWidth(w); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerLineWidthCmd(int id, int w) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->setLineWidth(w); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerListCmd(MarkerFormat type, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip, int select, unsigned short mask, unsigned short value, List& tags) { int doSys = 1; switch (type) { case DS9: { ostringstream str; markerListHeader(str, sys, sky, format, strip); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } break; case XML: { ostringstream str; markerListXMLHeader(str, sys, sky, format); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } break; case CIAO: { ostringstream str; markerListCiaoHeader(str, sys, sky, format, strip); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } break; case SAOTNG: { ostringstream str; markerListSAOtngHeader(str, sys, sky, format, strip); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } break; case PROS: break; case SAOIMAGE: break; case RAWXY: break; } Marker* mm=markers->head(); while (mm) { ostringstream str; Tag* t; // selected if (select) { if (!mm->isSelected()) goto next; } // properties if (mask) { if (!((mm->getProperty() & mask) == value)) goto next; } // tags if ((t=tags.head())) { while (t) { if (!mm->hasTag(t->tag())) goto next; t=t->next(); } } // ok, its passed the tests! switch (type) { case DS9: if (doSys) { coord.listCoordSystem(str, sys, sky, 1, keyContext->fits->hasWCSCel(sys)); str << (strip ? ';' : '\n'); doSys = 0; } mm->list(str, sys, sky, format, 0, strip); break; case XML: mm->listXML(str, sys, sky, format); break; case CIAO: mm->listCiao(str, sys, strip); break; case SAOTNG: mm->listSAOtng(str, sys, sky, format, strip); break; case SAOIMAGE: mm->listSAOimage(str, strip); break; case PROS: mm->listPros(str, sys, sky, format, strip); break; case RAWXY: mm->listXY(str, sys, sky, format, strip); break; } str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); next: mm=mm->next(); } switch (type) { case DS9: break; case XML: { ostringstream str; markerListXMLFooter(str); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } break; case CIAO: break; case SAOTNG: break; case PROS: break; case SAOIMAGE: break; case RAWXY: break; } } void Base::markerLoadCmd(MarkerFormat fm, const char* fn) { ifstream str(fn); if (!str) { result = TCL_ERROR; return; } parseMarker(fm, str); } void Base::markerLoadCmd(MarkerFormat fm, const char* fn, Coord::CoordSystem sys, Coord::SkyFrame sky) { xySystem_ = sys; xySky_ = sky; markerLoadCmd(fm,fn); } void Base::markerLoadCmd(MarkerFormat fm, int fd) { boost::fdistream str(fd); if (!str) { result = TCL_ERROR; return; } parseMarker(fm, str); } void Base::markerLoadCmd(MarkerFormat fm, int fd, Coord::CoordSystem sys, Coord::SkyFrame sky) { xySystem_ = sys; xySky_ = sky; markerLoadCmd(fm,fd); } void Base::markerLoadFitsCmd(const char* fn, const char* color, int* dash, int width, const char* font) { if (!keyContext->fits) return; // verify that we have an ext specified if (fn && (fn[strlen(fn)-1] != ']')) { result = TCL_ERROR; return; } // do we have a WCS? FitsImage* mkfits = NULL; { mkfits = new FitsImageFitsMMap(currentContext, interp, fn, 1); if (!mkfits || !mkfits->isValid() || !mkfits->isBinTable()) { if (mkfits) delete mkfits; result = TCL_ERROR; return; } } // recenter if (keyContext->fits) { FitsImage* ptr = keyContext->fits; mkfits->nextBin(ptr->getHistCursor()); } FitsFile* mk = mkfits->fitsFile(); FitsHead* mkh = mk->head(); FitsTableHDU* mkhdu = (FitsTableHDU*)mkh->hdu(); // determine x and y column names // if image, hard code 'x' and 'y' // however, if table, find out the columns used to bin FitsColumn* x; FitsColumn* y; if (keyContext->fits) { FitsImage* ptr = keyContext->fits; if (ptr->isHist()) { x = mkhdu->find(ptr->getHistX()); y = mkhdu->find(ptr->getHistY()); } else { x = mkhdu->find("x"); y = mkhdu->find("y"); } } else { x = mkhdu->find("x"); y = mkhdu->find("y"); } FitsColumn* shape = mkhdu->find("shape"); FitsColumn* r = mkhdu->find("r"); FitsColumn* ang = mkhdu->find("rotang"); // manatory columns x and y if (!x || !y) { if (mkfits) delete mkfits; result = TCL_ERROR; return; } // and width should be the same if (((FitsBinColumn*)x)->repeat() != ((FitsBinColumn*)y)->repeat()) { if (mkfits) delete mkfits; result = TCL_ERROR; return; } int repeat = ((FitsBinColumn*)x)->repeat(); char* ptr = (char*)mk->data(); int rows = mkhdu->rows(); int rowlen = mkhdu->width(); char text[] = ""; List taglist; List cblist; for (int i=0; istr(ptr)); else { s1 = new char[7]; strcpy(s1,"POINT "); } // look for '!', which sets include/exclude char* s2 = s1; unsigned short props = Marker::SELECT | Marker::HIGHLITE | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::SOURCE; if (s2[0]=='!') s2++; else props |= Marker::INCLUDE; Vector center(x->value(ptr,0),y->value(ptr,0)); if (!strncmp(s2, "CIRCLE", 6) && r) { Vector rr(r->value(ptr),0); createCircleCmd(keyContext->fits->mapToRef(center, Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr[0], Coord::PHYSICAL), color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "ANNULU", 6) && r) { Vector rr0(r->value(ptr,0),0); Vector rr1(r->value(ptr,1),0); createAnnulusCmd(keyContext->fits->mapToRef(center ,Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr0[0], Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr1[0], Coord::PHYSICAL), 1, color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "BOX ", 6) && r) { Vector rr(r->value(ptr,0),r->value(ptr,1)); createBoxCmd(keyContext->fits->mapToRef(center, Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr, Coord::PHYSICAL), 0, color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "ROTBOX", 6) && r && ang) { Vector rr(r->value(ptr,0),r->value(ptr,1)); createBoxCmd(keyContext->fits->mapToRef(center, Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr, Coord::PHYSICAL), degToRad(ang->value(ptr)), color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "RECTAN", 6)) { Vector v1(center); Vector v2(x->value(ptr,1), y->value(ptr,1)); Vector d = v2-v1; Vector c = d/2 + v1; createBoxCmd(keyContext->fits->mapToRef(c,Coord::PHYSICAL), keyContext->fits->mapLenToRef(d,Coord::PHYSICAL), 0, color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "ROTREC", 6) && ang) { Vector v1(center); Vector v2(x->value(ptr,1), y->value(ptr,1)); Vector d = v2-v1; Vector c = d/2 + v1; createBoxCmd(keyContext->fits->mapToRef(c,Coord::PHYSICAL), keyContext->fits->mapLenToRef(d,Coord::PHYSICAL), degToRad(ang->value(ptr)), color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "ELLIPSE", 7) && r && ang) { Vector rr(r->value(ptr,0),r->value(ptr,1)); createEllipseCmd(keyContext->fits->mapToRef(center, Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr, Coord::PHYSICAL), degToRad(ang->value(ptr)), color, dash, width, font, text, props, NULL, taglist,cblist); } else if ((!strncmp(s2,"PIE",3) || !strncmp(s2,"SECTOR",6)) && r && ang) { Vector rr0(r->value(ptr,0),0); Vector rr1(r->value(ptr,1),0); createCpandaCmd(keyContext->fits->mapToRef(center,Coord::PHYSICAL), degToRad(ang->value(ptr,0)),degToRad(ang->value(ptr,1)),1, keyContext->fits->mapLenToRef(rr0[0],Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr1[0],Coord::PHYSICAL), 1, color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2,"ELLIPTANN",9) && r && ang) { Vector rr0(r->value(ptr,0),r->value(ptr,1)); Vector rr1(r->value(ptr,2),r->value(ptr,3)); createEpandaCmd(keyContext->fits->mapToRef(center,Coord::PHYSICAL), degToRad(ang->value(ptr,0)),degToRad(ang->value(ptr,1)),1, keyContext->fits->mapLenToRef(rr0,Coord::PHYSICAL), keyContext->fits->mapLenToRef(rr1,Coord::PHYSICAL), 1, 0, color, dash, width, font, text, props, NULL, taglist,cblist); } else if (!strncmp(s2, "POINT ", 6)) createPointCmd(keyContext->fits->mapToRef(center,Coord::PHYSICAL), Point::BOXCIRCLE, POINTSIZE, color, dash, width, font, text, props, NULL, taglist,cblist); else if (!strncmp(s2, "POLYGO", 6)) { List list; for (int ii=0; iivalue(ptr,ii), y->value(ptr,ii)); Vertex* n = new Vertex(keyContext->fits->mapToRef(vv, Coord::PHYSICAL)); if (ii+1 < repeat) { // check for endpoints matching or endpoints NULL after first if ((ii>0) && ( (x->value(ptr,ii) == x->value(ptr,0) && y->value(ptr,ii) == y->value(ptr,0)) || (x->value(ptr,ii) == 0 && y->value(ptr,ii) == 0))) { delete n; break; } list.append(n); } else { // check for last point equals first point if (x->value(ptr,ii) != x->value(ptr,0) || y->value(ptr,ii) != y->value(ptr,0)) list.append(n); else delete n; } } if (!list.isEmpty()) createPolygonCmd(list, color, dash, width, font, text, props, NULL, taglist,cblist); } delete [] s1; } if (mkfits) delete mkfits; } void Base::markerMoveCmd(const Vector& v) { // use matrix, not map() undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; Vector c = mm->getCenter() * refToCanvas; update(PIXMAP, mm->getAllBBox()); mm->moveTo((c + v) * canvasToRef); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveCmd(const char* tag, const Vector& v) { // use matrix, not map() undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->canMove() && mm->hasTag(tag)) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; Vector c = mm->getCenter() * refToCanvas; update(PIXMAP, mm->getAllBBox()); mm->moveTo((c + v) * canvasToRef); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveCmd(int id, const Vector& v) { // use matrix, not map() Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) { markerUndo(mm, MOVE); Vector c = mm->getCenter() * refToCanvas; update(PIXMAP, mm->getAllBBox()); mm->moveTo((c + v) * canvasToRef); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerMoveBeginCmd(const Vector& v) { markerBegin = mapToRef(v,Coord::CANVAS); undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; mm->moveBegin(); } mm=mm->next(); } } void Base::markerMoveBeginCmd(int id, const Vector& v) { markerBegin = mapToRef(v,Coord::CANVAS); undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; mm->moveBegin(); } return; } mm=mm->next(); } } void Base::markerMoveMotionCmd(const Vector& v) { // first, accumulate erase markers Marker* mm=markers->head(); if (mm) { while (mm) { if (mm->isSelected() && mm->canMove()) redraw(mm->getAllBBox()); mm=mm->next(); } // and erase now forceUpdate(); // ok, now draw selected markers in new location Vector markerEnd = mapToRef(v,Coord::CANVAS); Vector diff = markerEnd - markerBegin; markerBegin = markerEnd; mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { mm->move(diff); x11MarkerXOR(mm); } mm=mm->next(); } } } void Base::markerMoveMotionCmd(int id, const Vector& v) { // first, accumulate erase markers Marker* mm=markers->head(); if (mm) { while (mm) { if (mm->getId() && mm->canMove()) { redraw(mm->getAllBBox()); break; } mm=mm->next(); } if (!mm) return; // can't find it Marker *ptr = mm; // and erase now forceUpdate(); // ok, now draw selected markers in new location Vector markerEnd = mapToRef(v,Coord::CANVAS); Vector diff = markerEnd - markerBegin; markerBegin = markerEnd; ptr->move(diff); x11MarkerXOR(ptr); } } void Base::markerMoveEndCmd() { Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) mm->moveEnd(); mm=mm->next(); } // update widget since we don't know where the selected markers came from update(PIXMAP); } void Base::markerMoveEndCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) mm->moveEnd(); return; } mm=mm->next(); } // update widget since we don't know where the selected markers came from update(PIXMAP); } void Base::markerMoveToCmd(const Vector& v, Coord::InternalSystem sys) { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); mm->moveTo(mapToRef(v,sys)); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveToCmd(const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky) { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canMove()) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); mm->moveTo(ptr->mapToRef(v,sys,sky)); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveToCmd(const char* tag, const Vector& v, Coord::InternalSystem sys) { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->canMove() && mm->hasTag(tag)) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); mm->moveTo(mapToRef(v,sys)); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveToCmd(const char* tag, const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky) { undoMarkers->deleteAll(); Marker* mm=markers->head(); while (mm) { if (mm->canMove() && mm->hasTag(tag)) { undoMarkers->append(mm->dup()); undoMarkerType = MOVE; update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); mm->moveTo(ptr->mapToRef(v,sys,sky)); update(PIXMAP, mm->getAllBBox()); } mm=mm->next(); } } void Base::markerMoveToCmd(int id, const Vector& v, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) { markerUndo(mm, MOVE); update(PIXMAP, mm->getAllBBox()); mm->moveTo(mapToRef(v, sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerMoveToCmd(int id, const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canMove()) { markerUndo(mm, MOVE); update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); mm->moveTo(ptr->mapToRef(v,sys,sky)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerPasteCmd() { // unselect markers { Marker* mm=markers->head(); while (mm) { mm->unselect(); mm=mm->next(); } } undoMarkers->deleteAll(); Marker* mm=pasteMarkers->head(); while (mm) { Marker* nn = mm->dup(); nn->newIdentity(); markers->append(nn); mm = mm->next(); } update(PIXMAP); } void Base::markerPasteCmd(Coord::CoordSystem from, Coord::CoordSystem to) { // sys is the coordinate system to specified in the header // use wcsSystem for markers // MarkerFormat type = DS9; Coord::SkyFrame sky = Coord::FK5; Coord::SkyFormat format = Coord::DEGREES; { ostringstream str; markerListHeader(str, to, sky, format, 0); coord.listCoordSystem(str,to,sky,1,1); str << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } Marker* mm=pasteMarkers->head(); while (mm) { ostringstream str; mm->list(str, from, sky, format, 0, 0); str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); mm=mm->next(); } } void Base::markerPointShapeCmd(int id, Point::PointShape shape) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Point*)mm)->setShape(shape); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerPointSizeCmd(int id, int size) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Point*)mm)->setSize(size); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerPolygonCreateVertexCmd(int id, int seg, const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); ((Polygon*)(mm))->createVertex(seg, mapToRef(v,Coord::CANVAS)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerPolygonDeleteVertexCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Polygon*)(mm))->deleteVertex(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerPolygonResetCmd(int id, const Vector& size, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Polygon*)(mm))->reset(mapLenToRef(size, sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerPolygonResetCmd(int id, const Vector& size, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Polygon*)(mm))->reset(ptr->mapLenToRef(size, sys, dist)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerProjectionCmd(int id,const Vector& p1,const Vector& p2, Coord::InternalSystem sys,double width) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Projection*)(mm))->set(mapToRef(p1,sys), mapToRef(p2,sys), mapLenToRef(width,sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerProjectionCmd(int id, const Vector& p1, const Vector& p2, Coord::CoordSystem sys, Coord::SkyFrame sky, double width, Coord::CoordSystem wdsys, Coord::SkyDist wddist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Projection*)(mm))->set(ptr->mapToRef(p1,sys,sky), ptr->mapToRef(p2,sys,sky), ptr->mapLenToRef(width, wdsys, wddist)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerPropertyCmd(unsigned short prop, int value) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) { if (prop == Marker::DASH || prop == Marker::FIXED || prop == Marker::INCLUDE || prop == Marker::SOURCE) { // marker will change bbox, so get before and after update(PIXMAP, mm->getAllBBox()); mm->setProperty(prop, value); update(PIXMAP, mm->getAllBBox()); } else mm->setProperty(prop, value); } mm=mm->next(); } } void Base::markerPropertyCmd(const char* tag, unsigned short prop, int value) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { if (prop == Marker::DASH || prop == Marker::FIXED || prop == Marker::INCLUDE || prop == Marker::SOURCE) { // marker will change bbox, so get before and after update(PIXMAP, mm->getAllBBox()); mm->setProperty(prop, value); update(PIXMAP, mm->getAllBBox()); } else mm->setProperty(prop, value); } mm=mm->next(); } } void Base::markerPropertyCmd(unsigned short prop, int value, const Vector& v) { // v is in canvas coords Marker* mm=markers->head(); while (mm) { if (mm->isIn(v)) { if (prop == Marker::DASH || prop == Marker::FIXED || prop == Marker::INCLUDE || prop == Marker::SOURCE) { // marker will change bbox, so get before and after update(PIXMAP, mm->getAllBBox()); mm->setProperty(prop, value); update(PIXMAP, mm->getAllBBox()); } else mm->setProperty(prop, value); } mm=mm->next(); } } void Base::markerPropertyCmd(int id, unsigned short prop, int value) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (prop == Marker::DASH || prop == Marker::FIXED || prop == Marker::INCLUDE || prop == Marker::SOURCE) { // marker will change bbox, so get before and after update(PIXMAP, mm->getAllBBox()); mm->setProperty(prop, value); update(PIXMAP, mm->getAllBBox()); } else mm->setProperty(prop, value); return; } mm=mm->next(); } } void Base::markerRotateBeginCmd(int id) { // remember which marker is being edited Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canRotate()) { markerUndo(mm, EDIT); rotateMarker = mm; rotateMarker->rotateBegin(); } return; } mm=mm->next(); } rotateMarker = NULL; } void Base::markerRotateBeginCmd(const Vector& v) { // remember which marker is being edited Marker* mm=markers->head(); while (mm) { if (mm->isSelected() && mm->canRotate()) { markerUndo(mm, EDIT); rotateMarker = mm; rotateMarker->rotateBegin(); return; } mm=mm->next(); } rotateMarker = NULL; } void Base::markerRotateMotionCmd(const Vector& vv, int hh) { if (rotateMarker) { // erase current marker now redraw(rotateMarker->getAllBBox()); forceUpdate(); rotateMarker->rotate(mapToRef(vv,Coord::CANVAS), hh); x11MarkerXOR(rotateMarker); } } void Base::markerRotateEndCmd() { if (rotateMarker) rotateMarker->rotateEnd(); rotateMarker = NULL; update(PIXMAP); } void Base::markerRulerPointCmd(int id, const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Ruler*)(mm))->setPoints(mapToRef(p1,sys),mapToRef(p2,sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerRulerPointCmd(int id, const Vector& p1, const Vector& p2, Coord::CoordSystem sys, Coord::SkyFrame sky) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Ruler*)(mm))->setPoints(ptr->mapToRef(p1,sys,sky), ptr->mapToRef(p2,sys,sky)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerRulerSystemCmd(int id, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem dsys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { // it may shrink update(PIXMAP, mm->getAllBBox()); ((Ruler*)(mm))->setCoordSystem(sys, sky, dsys, dist); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerSaveCmd(const char* fileName, MarkerFormat type, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { int doSys = 1; ofstream fn(fileName); if (fn) { switch (type) { case DS9: markerListHeader(fn, sys, sky, format, strip); break; case XML: markerListXMLHeader(fn, sys, sky, format); break; case CIAO: markerListCiaoHeader(fn, sys, sky, format, strip); break; case SAOTNG: markerListSAOtngHeader(fn, sys, sky, format, strip); break; case SAOIMAGE: break; case PROS: break; case RAWXY: break; } Marker* mm=markers->head(); while (mm) { switch (type) { case DS9: if (doSys) { coord.listCoordSystem(fn, sys, sky, 1, keyContext->fits->hasWCSCel(sys)); fn << (strip ? ';' : '\n'); doSys = 0; } mm->list(fn, sys, sky, format, 0, strip); break; case XML: mm->listXML(fn, sys, sky, format); break; case CIAO: mm->listCiao(fn, sys, strip); break; case SAOTNG: mm->listSAOtng(fn, sys, sky, format, strip); break; case SAOIMAGE: mm->listSAOimage(fn, strip); break; case PROS: mm->listPros(fn, sys, sky, format, strip); break; case RAWXY: mm->listXY(fn, sys, sky, format, strip); break; } mm=mm->next(); } switch (type) { case DS9: break; case XML: markerListXMLFooter(fn); break; case CIAO: break; case SAOTNG: break; case SAOIMAGE: break; case PROS: break; case RAWXY: break; } } else { Tcl_AppendResult(interp, "Unable to open file ", fileName, NULL); result = TCL_ERROR; } } void Base::markerSaveTemplateCmd(const char* fileName) { Marker* mm=markers->head(); if (keyContext->fits && mm) { ofstream fn(fileName); if (fn) { FitsImage* ptr = keyContext->fits; while (ptr) { ptr->initWCS0(mm->getCenter()); ptr = ptr->nextMosaic(); } markerListHeader(fn, Coord::WCS0, Coord::FK5, Coord::DEGREES, 0); coord.listCoordSystem(fn, Coord::WCS0, Coord::FK5, 1, keyContext->fits->hasWCSCel(Coord::WCS0)); fn << endl; while (mm) { mm->list(fn, Coord::WCS0, Coord::FK5, Coord::DEGREES, 0, 0); mm=mm->next(); } ptr = keyContext->fits; while (ptr) { ptr->resetWCS0(); ptr = ptr->nextMosaic(); } } else { Tcl_AppendResult(interp, "Unable to open file ", fileName, NULL); result = TCL_ERROR; } } } void Base::markerSegmentCreateVertexCmd(int id, int seg, const Vector& v) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); ((Segment*)(mm))->createVertex(seg, mapToRef(v,Coord::CANVAS)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerSegmentDeleteVertexCmd(int id, int h) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Segment*)(mm))->deleteVertex(h); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } } void Base::markerSegmentResetCmd(int id, const Vector& size, Coord::InternalSystem sys) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Segment*)(mm))->reset(mapLenToRef(size, sys)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerSegmentResetCmd(int id, const Vector& size, Coord::CoordSystem sys, Coord::SkyDist dist) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Segment*)(mm))->reset(ptr->mapLenToRef(size, sys, dist)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerSelectAllCmd() { Marker* mm=markers->head(); while (mm) { if (mm->canSelect()) { mm->select(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerSelectCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->getId() == id) { mm->select(); update(PIXMAP, mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerSelectCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->hasTag(tag)) { mm->select(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerSelectToggleCmd() { // toggle the select of the first found Marker* mm=markers->head(); while (mm) { if (mm->canSelect()) { mm->toggleSelect(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerSelectToggleCmd(const Vector& v) { // toggle the select of the first found Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->isIn(v)) { mm->toggleSelect(); update(PIXMAP, mm->getBBox()); Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } Tcl_AppendResult(interp, "0", NULL); } void Base::markerSelectOnlyCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->getId() == id) { if (!mm->isSelected()) { mm->select(); update(PIXMAP, mm->getBBox()); } } else { if (mm->isSelected()) { mm->unselect(); update(PIXMAP, mm->getBBox()); } } mm=mm->next(); } } void Base::markerSelectOnlyCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->hasTag(tag)) { if (!mm->isSelected()) { mm->select(); update(PIXMAP, mm->getBBox()); } else { if (mm->isSelected()) { mm->unselect(); update(PIXMAP, mm->getBBox()); } } } mm=mm->next(); } } void Base::markerSelectOnlyCmd(const Vector& v) { // first, check to see if we clicked on an already selected marker Marker* mm=markers->head(); while (mm) { if (mm->canSelect() && mm->isIn(v) && mm->isSelected()) { Tcl_AppendResult(interp, "1", NULL); return; } mm=mm->next(); } // ok, now select the first found, and unselect the rest int found = 0; mm=markers->head(); while (mm) { if (mm->canSelect() && mm->isIn(v) && !found) { if (!mm->isSelected()) { mm->select(); update(PIXMAP, mm->getBBox()); } found = 1; } else { if (mm->isSelected()) { mm->unselect(); update(PIXMAP, mm->getBBox()); } } mm=mm->next(); } if (found) Tcl_AppendResult(interp, "1", NULL); else Tcl_AppendResult(interp, "0", NULL); } void Base::markerShowCmd(int which) { showMarkers = which; update(PIXMAP); } void Base::markerShowTextCmd(int which) { showMarkersText = which; update(PIXMAP); } void Base::markerTagCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->isSelected()) mm->addTag(tag); mm=mm->next(); } } void Base::markerTagCmd(int id, const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->addTag(tag); return; } mm=mm->next(); } } void Base::markerTagEditCmd(const char* from, const char* to) { Marker* mm=markers->head(); while (mm) { mm->editTag(from, to); mm=mm->next(); } } void Base::markerTagDeleteCmd(const char* t) { Marker* mm=markers->head(); while (mm) { mm->deleteTag(t); mm=mm->next(); } } void Base::markerTagDeleteAllCmd() { Marker* mm=markers->head(); while (mm) { mm->deleteTags(); mm=mm->next(); } } void Base::markerTagUpdateCmd(const char* t) { markerTagDeleteCmd(t); markerTagCmd(t); } void Base::markerTextCmd(int id, const char* text) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { // things can shrink, so do before and after update(PIXMAP,mm->getAllBBox()); mm->setText(text); update(PIXMAP,mm->getAllBBox()); return; } mm=mm->next(); } } void Base::markerTextRotateCmd(int id, int rot) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { ((Text*)(mm))->setRotate(rot); update(PIXMAP); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerUndoCmd() { Marker* nn=undoMarkers->head(); while (nn) { Marker* next = nn->next(); undoMarkers->extractPrev(nn); switch (undoMarkerType) { case NONE: break; case DELETE: markers->append(nn); nn->updateBBox(); update(PIXMAP,nn->getAllBBox()); break; case EDIT: case MOVE: { Marker* mm=markers->head(); while (mm) { if (mm->getId() == nn->getId()) { nn->enableCB(); mm->updateBBox(); update(PIXMAP,mm->getAllBBox()); markers->insertNext(mm,nn); markers->extractNext(mm); nn->updateBBox(); update(PIXMAP,nn->getAllBBox()); switch (undoMarkerType) { case EDIT: nn->doCallBack(CallBack::EDITCB); break; case MOVE: nn->doCallBack(CallBack::MOVECB); break; default: // na break; } mm->disableCB(); delete mm; break; } mm=mm->next(); } } break; } nn=next; } undoMarkerType = NONE; } void Base::markerUnhighliteAllCmd() { Marker* mm=markers->head(); while (mm) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); mm=mm->next(); } } void Base::markerUnhighliteCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); return; } mm=mm->next(); } } void Base::markerUnhighliteCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { mm->unhighlite(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerUnselectAllCmd() { Marker* mm=markers->head(); while (mm) { mm->unselect(); update(PIXMAP, mm->getBBox()); mm=mm->next(); } } void Base::markerUnselectCmd(int id) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { mm->unselect(); update(PIXMAP, mm->getBBox()); return; } mm=mm->next(); } } void Base::markerUnselectCmd(const char* tag) { Marker* mm=markers->head(); while (mm) { if (mm->hasTag(tag)) { mm->unselect(); update(PIXMAP, mm->getBBox()); } mm=mm->next(); } } void Base::markerVectorCmd(int id, const Vector& p, Coord::InternalSystem sys, double mag, double ang) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); ((Vect*)(mm))->setPoints(mapToRef(p,sys),mapLenToRef(mag,sys),ang); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerVectorCmd(int id, const Vector& p, Coord::CoordSystem sys, Coord::SkyFrame sky, double mag, Coord::CoordSystem dsys, Coord::SkyDist dist, double ang) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { markerUndo(mm, EDIT); // it may shrink update(PIXMAP, mm->getAllBBox()); FitsImage* ptr = findFits(sys,mm->getCenter()); ((Vect*)(mm))->setPoints(ptr->mapToRef(p,sys,sky), ptr->mapLenToRef(mag,dsys,dist), mapAngleToRef(ang,sys,sky)); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::markerVectorArrowCmd(int id, int p) { Marker* mm=markers->head(); while (mm) { if (mm->getId() == id) { if (mm->canEdit()) { ((Vect*)(mm))->setArrow(p); update(PIXMAP, mm->getAllBBox()); } return; } mm=mm->next(); } result = TCL_ERROR; } void Base::regionHighliteEndCmd() { BBox bb(regionBegin, regionEnd); Marker* mm=markers->head(); while (mm) { if (bb.isIn(mm->getBBox())==4 && mm->canHighlite()) mm->highlite(); else mm->unhighlite(); mm=mm->next(); } update(PIXMAP, bb.expand(2)); } void Base::regionHighliteShiftEndCmd() { BBox bb(regionBegin, regionEnd); Marker* mm=markers->head(); while (mm) { if (bb.isIn(mm->getBBox())==4 && mm->canHighlite()) mm->highlite(); mm=mm->next(); } update(PIXMAP, bb.expand(2)); } void Base::regionSelectBeginCmd(const Vector& vv) { regionBegin = vv; regionEnd = vv; } void Base::regionSelectMotionCmd(const Vector& vv) { // erase redrawNow((BBox(regionBegin, regionEnd)).expand(2)); // and draw to window regionEnd = vv; BBox cc = BBox(regionBegin, regionEnd) * canvasToWindow; Vector size = cc.size(); XDrawRectangle(display, Tk_WindowId(tkwin), selectGCXOR, cc.ll[0], cc.ll[1], size[0], size[1]); } void Base::regionSelectEndCmd() { BBox bb(regionBegin, regionEnd); Marker* mm=markers->head(); while (mm) { if (bb.isIn(mm->getBBox())==4 && mm->canSelect()) mm->select(); else mm->unselect(); mm=mm->next(); } update(PIXMAP, bb.expand(2)); } void Base::regionSelectShiftEndCmd() { BBox bb(regionBegin, regionEnd); Marker* mm=markers->head(); while (mm) { if (bb.isIn(mm->getBBox())==4 && mm->canSelect()) mm->select(); mm=mm->next(); } update(PIXMAP, bb.expand(2)); } // Marker Support void Base::markerListCiaoHeader(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { // no comments for semicolons if (!strip) str << "# Region file format: CIAO version 1.0" << endl; } void Base::markerListHeader(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { // no comments for semicolons if (!strip) { // header str << "# Region file format: DS9 version 4.1" << endl; // don't output filename anymore // if (keyContext->fits) // str << "# Filename: " << keyContext->fits->getFullBaseFileName() << endl; str << "global color=green dashlist=8 3 width=1 font=\"helvetica 10 normal roman\" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1" << endl; } } void Base::markerListSAOtngHeader(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { // no comments for semicolons if (strip) return; // don't output filename anymore // if (keyContext->fits) // str << "# filename: " << keyContext->fits->getRootFileName() << endl; switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::AMPLIFIER: case Coord::DETECTOR: str << "# format: pixels (physical)" << endl; break; default: str << "# format: "; switch (sky) { case Coord::FK4: case Coord::FK4_NO_E: case Coord::FK5: case Coord::ICRS: case Coord::GALACTIC: case Coord::SUPERGALACTIC: case Coord::ECLIPTIC: case Coord::HELIOECLIPTIC: switch (format) { case Coord::DEGREES: str << "degrees ("; break; case Coord::SEXAGESIMAL: str << "hms ("; break; } switch (sky) { case Coord::FK4: str << "fk4"; break; case Coord::FK4_NO_E: str << "fk4-no-e"; break; case Coord::FK5: str << "fk5"; break; case Coord::ICRS: str << "icrs"; break; case Coord::GALACTIC: str << "galactic"; break; case Coord::SUPERGALACTIC: str << "supergalactic"; break; case Coord::ECLIPTIC: str << "ecliptic"; break; case Coord::HELIOECLIPTIC: str << "helioecliptic"; break; } str << ')' << endl; break; } } } void Base::markerPrintCoord(const Vector& v, Coord::InternalSystem sys) { printVector(mapFromRef(v, sys), DEFAULT); } void Base::markerPrintCoord(const Vector& c, const Vector& v, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = findFits(sys,c); printFromRef(ptr, v, sys, sky, format, DEFAULT); } void Base::markerPrintDouble(double d, Coord::InternalSystem sys) { printDouble(mapLenFromRef(d,sys), DEFAULT); } void Base::markerPrintDouble(const Vector& c, double d, Coord::CoordSystem sys, Coord::SkyDist dist) { FitsImage* ptr = findFits(sys,c); printDouble(ptr->mapLenFromRef(d,sys,dist), DEFAULT); } void Base::markerPrintDouble(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { printDouble(mapDistFromRef(p1,p2,sys), DEFAULT); } void Base::markerPrintDouble(const Vector& c, const Vector& p1, const Vector& p2, Coord::CoordSystem sys, Coord::SkyDist dist) { FitsImage* ptr = findFits(sys,c); printDouble(ptr->mapDistFromRef(p1,p2,sys,dist), DEFAULT); } void Base::markerPrintVector(const Vector& v, Coord::InternalSystem sys) { printVector(mapLenFromRef(v,sys), DEFAULT); } void Base::markerPrintVector(const Vector& c, const Vector& v, Coord::CoordSystem sys, Coord::SkyDist dist) { FitsImage* ptr = findFits(sys,c); printVector(ptr->mapLenFromRef((Vector&)v,sys,dist), DEFAULT); } void Base::markerUndo(Marker* m, UndoMarkerType t) { undoMarkers->deleteAll(); undoMarkers->append(m->dup()); undoMarkerType = t; } void Base::parseMarker(MarkerFormat fm, istream& str) { switch (fm) { case DS9: { mkFlexLexer* ll = new mkFlexLexer(&str); mkparse(this, ll); delete ll; resetCompositeMarker(); } break; case XML: xmlParse(str); break; case CIAO: { ciaoFlexLexer* ll = new ciaoFlexLexer(&str); ciaoparse(this, ll); delete ll; } break; case PROS: { prosFlexLexer* ll = new prosFlexLexer(&str); prosparse(this, ll); delete ll; } break; case SAOTNG: { tngFlexLexer* ll = new tngFlexLexer(&str); tngparse(this, ll); delete ll; } break; case SAOIMAGE: { saoFlexLexer* ll = new saoFlexLexer(&str); saoparse(this, ll); delete ll; } break; case RAWXY: { xyFlexLexer* ll = new xyFlexLexer(&str); xyparse(this, ll); delete ll; } break; } } void Base::psMarkers(List* ml, int mode) { // render from back to front // bbox is in canvas coords const BBox bb = BBox(0, 0, options->width-1, options->height-1) * widgetToCanvas; Marker* mm=ml->tail(); while (mm) { if (mm->isVisible(bb)) mm->ps(mode, showMarkersText); mm=mm->previous(); } } void Base::x11MagnifierMarkers(List* ml, const BBox& bb) { // render from back to front // bbox is in canvas coords Marker* mm=ml->tail(); while (mm) { if (mm->isVisible(bb)) mm->x11(magnifierPixmap, Coord::MAGNIFIER, showMarkersText, Marker::SRC, Marker::NOHANDLES); mm=mm->previous(); } } void Base::x11Markers(List* ml, const BBox& bb) { // render from back to front // bbox is in canvas coords Marker* mm=ml->tail(); while (mm) { if (mm->isVisible(bb)) mm->x11(pixmap, Coord::WIDGET, showMarkersText, Marker::SRC, Marker::HANDLES); mm=mm->previous(); } } void Base::x11MarkerXOR(Marker* ptr) { if (ptr) ptr->x11(Tk_WindowId(tkwin), Coord::WINDOW, showMarkersText, Marker::XOR, Marker::NOHANDLES); } void Base::unselectMarkers(List* ml) { Marker* mm=ml->head(); while (mm) { mm->unselect(); mm=mm->next(); } } void Base::unhighliteMarkers() { Marker* mm=markers->head(); while (mm) { mm->unhighlite(); mm=mm->next(); } } void Base::updateCBMarkers(List* ml) { Marker* mm=ml->head(); while (mm) { mm->doCallBack(CallBack::UPDATECB); mm=mm->next(); } } void Base::updateMarkers(List* ml) { Marker* mm=ml->head(); while (mm) { mm->updateBBox(); mm=mm->next(); } } void Base::updateMarkerCoords(List* ml, const Matrix& mx) { Marker* mm=ml->head(); while (mm) { mm->updateCoords(mx); mm=mm->next(); } } void Base::updateMarkerCBs(List* ml) { Marker* mm=ml->head(); while (mm) { mm->doCallBack(CallBack::MOVECB); mm->doCallBack(CallBack::EDITCB); mm->doCallBack(CallBack::ROTATECB); mm=mm->next(); } } #ifdef MAC_OSX_TK void Base::macosxMarkers(List* ml) { // render from back to front // bbox is in canvas coords const BBox bb = BBox(0, 0, options->width-1, options->height-1) * widgetToCanvas; Marker* mm=ml->tail(); while (mm) { if (mm->isVisible(bb)) mm->macosx(showMarkersText); mm=mm->previous(); } } #endif #ifdef __WIN32 void Base::win32Markers(List* ml) { // render from back to front // bbox is in canvas coords const BBox bb = BBox(0, 0, options->width-1, options->height-1) * widgetToCanvas; Marker* mm=ml->tail(); while (mm) { if (mm->isVisible(bb)) mm->win32(showMarkersText); mm=mm->previous(); } } #endif saods9/tksao1.0/frame/frmarkerxml.C000644 000765 000000 00000103555 12537642733 017501 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "fdstream.hpp" #include #include "context.h" #include "framebase.h" #include "fitsimage.h" static int xmlRead (void * context, char * buffer, int len) { istream* str=(istream*)context; str->read(buffer,len); return str->gcount(); } static int xmlClose (void * context) { return 1; } void Base::xmlParse(istream& str) { xmlTextReaderPtr reader = xmlReaderForIO(xmlRead, xmlClose, (void*)(&str), "", NULL, 0); if (reader) { char** cols=NULL; int colcnt=0; int id[128]; char* unit[128]; char* ref[128]; char* axis[128]; char* dir[128]; for (int ii=0; ii<128; ii++) { id[ii]=0; unit[ii]=NULL; ref[ii]=NULL; dir[ii]=NULL; } int cnt=0; int state=0; int ret = xmlTextReaderRead(reader); while (ret == 1) { int nodeType = xmlTextReaderNodeType(reader); char* key = (char*)xmlTextReaderConstName(reader); if (!strncmp(key,"VOTABLE",7) && (nodeType==1)) { } else if (!strncmp(key,"VOTABLE",7) && (nodeType==15)) { } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==1)) { } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==15)) { } else if (!strncmp(key,"COOSYS",6) && (nodeType==1)) { } else if (!strncmp(key,"COOSYS",6) && (nodeType==15)) { } else if (!strncmp(key,"RESOURCE",8) && (nodeType==1)) { } else if (!strncmp(key,"RESOURCE",8) && (nodeType==15)) { } else if (!strncmp(key,"TABLE",5) && (nodeType==1)) { } else if (!strncmp(key,"TABLE",5) && (nodeType==15)) { } else if (!strncmp(key,"FIELD",5) && (nodeType==1)) { xmlParseFIELD(reader,id,unit,ref,axis,dir,colcnt); state = 2; colcnt++; } else if (!strncmp(key,"FIELD",5) && (nodeType==15)) { state = 0; } else if (!strncmp(key,"DATA",4) && (nodeType==1)) { state = 0; } else if (!strncmp(key,"DATA",4) && (nodeType==15)) { } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==1)) { state = 0; } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==15)) { } else if (!strncmp(key,"TR",2) && (nodeType==1)) { if (cols) { for (int ii=0; ii taglist; // params char* param =NULL; char* param2 =NULL; char* param3 =NULL; char* param4 =NULL; char* param5 =NULL; // comment char* comment=NULL; List cblist; // build it for (int ii=0; iimapLenToRef(atof(r), rsys, rdist), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "ellipse", 7)) { createEllipseCmd(xmlPoint(ptr, x, y, sys, sky, format), ptr->mapLenToRef(Vector(atof(r),atof(r2)), rsys, rdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "box", 3) || STRCMP(shape, "rotbox", 6)) { createBoxCmd(xmlPoint(ptr, x, y, sys, sky, format), ptr->mapLenToRef(Vector(atof(r),atof(r2)), rsys, rdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "rectang", 6) || STRCMP(shape, "rotrec", 6)) { Vector v1 = xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 0); Vector v2 = xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 1); Vector d = v2-v1; Vector c = d/2 + v1; createBoxCmd(c,d, xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "polygon", 7)) { List* list = xmlVertex(ptr, xv, yv, vsys, vsky, vformat); createPolygonCmd(*list, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "line", 4)) { int arrow1 =1; int arrow2 =1; if (!param) arrow1 = atoi(param); if (!param2) arrow2 = atoi(param2); createLineCmd(xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 0), xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 1), arrow1, arrow2, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "vector", 6)) { int arrow =1; if (!param) arrow = atoi(param); createVectCmd(xmlPoint(ptr, x, y, sys, sky, format), ptr->mapLenToRef(atof(r), rsys, rdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), arrow, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "projection", 10)) { createProjectionCmd(xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 0), xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 1), ptr->mapLenToRef(atof(r), rsys, rdist), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "segment", 7)) { List* list = xmlVertex(ptr, xv, yv, vsys, vsky, vformat); createSegmentCmd(*list, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "text", 4)) { int rotate = 1; if (!param) rotate = atoi(param); createTextCmd(xmlPoint(ptr, x, y, sys, sky, format), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), rotate, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "point", 5)) { const char* def = "circle"; Point::PointShape shape = Point::CIRCLE; if (!param) param = (char*)def; int size = 11; if (param2) size = atoi(param2); if (STRCMP(param, "circle", 6)) shape = Point::CIRCLE; else if (STRCMP(param, "box", 3)) shape = Point::BOX; else if (STRCMP(param, "diamond", 7)) shape = Point::DIAMOND; else if (STRCMP(param, "cross", 5)) shape = Point::CROSS; else if (STRCMP(param, "x", 1)) shape = Point::EX; else if (STRCMP(param, "arrow", 5)) shape = Point::ARROW; else if (STRCMP(param,"boxcircle",9)) shape = Point::BOXCIRCLE; createPointCmd(xmlPoint(ptr, x, y, sys, sky, format), shape, size, color, dash, width, font, text, props, comment, taglist, cblist); } // Measurement Regions else if (STRCMP(shape, "ruler", 5)) { Coord::CoordSystem rsys; Coord::SkyFrame rsky; coord.strToCoordSystem(param, wcsSystem_, &rsys, &rsky); Coord::CoordSystem dsys; Coord::SkyDist ddist; coord.strToDistSystem(param2, wcsSystem_, &dsys, &ddist); createRulerCmd(xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 0), xmlPoint(ptr, xv, yv, vsys, vsky, vformat, 1), rsys, rsky, dsys, ddist, color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "compass", 7)) { Coord::CoordSystem csys; Coord::SkyFrame csky; coord.strToCoordSystem(param, wcsSystem_, &csys, &csky); const char* param2def = "N"; if (!param2) param2 = (char*)param2def; const char* param3def = "E"; if (!param3) param3 = (char*)param3def; int arrow1 =1; if (!param4) arrow1 = atoi(param4); int arrow2 =1; if (!param5) arrow2 = atoi(param5); createCompassCmd(xmlPoint(ptr, x, y, sys, sky, format), ptr->mapLenToRef(atof(r), rsys, rdist), param2, param3, arrow1, arrow2, csys, csky, color, dash, width, font, text, props, comment, taglist, cblist); } // Annulus Regions else if (STRCMP(shape, "annulus", 7)) { int num = xmlCount(rv); createAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format), num, xmlDistance(ptr, rv, num, rvsys, rvdist), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "ellipseannulus", 14)) { int num = xmlCount(rv); createEllipseAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format), num, xmlDistance(ptr, rv, rv2, num, rvsys, rvdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "boxannulus", 10)) { int num = xmlCount(rv); createBoxAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format), num, xmlDistance(ptr, rv, rv2, num, rvsys, rvdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } // Panda Regions else if (STRCMP(shape, "panda", 5) || STRCMP(shape, "pie", 3)) { int anum = xmlCount(angv); int rnum = xmlCount(rv); createCpandaCmd(xmlPoint(ptr, x, y, sys, sky, format), anum, xmlAngles(angv, angvsign, angvoffset, anum, angvformat, sys, sky), rnum, xmlDistance(ptr, rv, rnum, rvsys, rvdist), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "epanda", 6)) { int anum = xmlCount(angv); int rnum = xmlCount(rv); createEpandaCmd(xmlPoint(ptr, x, y, sys, sky, format), anum, xmlAngles(angv, angvsign, angoffset, anum, angvformat, sys, sky), rnum, xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } else if (STRCMP(shape, "bpanda", 6)) { int anum = xmlCount(angv); int rnum = xmlCount(rv); createBpandaCmd(xmlPoint(ptr, x, y, sys, sky, format), anum, xmlAngles(angv, angvsign, angvoffset, anum, angvformat, sys, sky), rnum, xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist), xmlAngle(ang, angsign, angoffset, angformat, sys, sky), color, dash, width, font, text, props, comment, taglist, cblist); } } void Base::xmlSetProps(unsigned short* props, unsigned short prop, char* str) { if (atoi(str)) *props |= prop; else *props &= ~prop; } int Base::xmlCount(const char* col) { int cnt=0; char* cc = dupstr(col); char* tok = strtok(cc, " "); while (tok) { cnt++; tok = strtok(NULL, " "); } delete [] cc; return cnt; } Vector Base::xmlPoint(FitsImage* ptr, const char* xstr, const char* ystr, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int which) { if (!xstr || !ystr) return Vector(); char* x =NULL; char* y =NULL; char* xcc =NULL; char* ycc =NULL; if (which>0) { xcc = dupstr(xstr); x = strtok(xcc, " "); for (int ii=0; iimapToRef(Vector(atof(x),atof(y)), sys); break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: rr = ptr->mapToRef(Vector(atof(x),atof(y)), sys, sky); break; case Coord::SEXAGESIMAL: { double xx=parseSEXStr(x); double yy=parseSEXStr(y); switch (sky) { case Coord::FK4: case Coord::FK4_NO_E: case Coord::FK5: case Coord::ICRS: xx = xx/24.*360.; break; case Coord::GALACTIC: case Coord::SUPERGALACTIC: case Coord::ECLIPTIC: case Coord::HELIOECLIPTIC: break; } rr = ptr->mapToRef(Vector(xx,yy), sys, sky); } } } else rr = ptr->mapToRef(Vector(atof(x),atof(y)), sys); } if (which>0) { if (xcc) delete [] xcc; if (ycc) delete [] ycc; } return rr; } List* Base::xmlVertex(FitsImage* ptr, const char* x, const char* y, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { List* list = new List; int cnt= xmlCount(x); for (int ii=0; iiappend(n); } return list; } double* Base::xmlDistance(FitsImage* ptr, const char* r, int cnt, Coord::CoordSystem sys, Coord::SkyDist dist) { double* rr = new double[cnt]; char* cc = dupstr(r); char* tok = strtok(cc, " "); for (int ii=0; iimapLenToRef(rr[ii], sys, dist); return rr; } Vector* Base::xmlDistance(FitsImage* ptr, const char* r, const char* r2, int cnt, Coord::CoordSystem sys, Coord::SkyDist dist) { Vector* vv = new Vector[cnt]; { char* cc = dupstr(r); char* tok = strtok(cc, " "); for (int ii=0; iimapLenToRef(vv[ii], sys, dist); return vv; } double Base::xmlAngle(const char* angle, int sign, double offset, Coord::AngleFormat format, Coord::CoordSystem sys, Coord::SkyFrame sky) { switch (format) { case Coord::DEG: return mapAngleToRef(sign*degToRad(atof(angle))+offset, sys, sky); case Coord::RAD: return mapAngleToRef(sign*atof(angle)+offset, sys, sky); } } double* Base::xmlAngles(const char* angle, int sign, double offset, int cnt, Coord::AngleFormat format, Coord::CoordSystem sys, Coord::SkyFrame sky) { double* ang = new double[cnt]; char* cc = dupstr(angle); char* tok = strtok(cc, " "); for (int ii=0; ii" << endl << "" << endl << "" << endl << "" << endl << "" << endl << "" << endl << "" << endl << "" << endl << "DS9 version 4.1" << endl; str << "" << endl; switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; break; default: if (keyContext->fits->hasWCS(sys)) { if (keyContext->fits->hasWCSCel(sys)) { // determine ucd char* xucd=NULL; char* yucd=NULL; switch (sky) { case Coord::FK4: case Coord::FK4_NO_E: case Coord::FK5: case Coord::ICRS: xucd = dupstr("pos.eq.ra;meta.main"); yucd = dupstr("pos.eq.dec;meta.main"); break; case Coord::GALACTIC: case Coord::SUPERGALACTIC: xucd = dupstr("pos.galactic.lon;meta.main"); yucd = dupstr("pos.galactic.lat;meta.main"); break; case Coord::ECLIPTIC: case Coord::HELIOECLIPTIC: xucd = dupstr("pos.ecliptic.lon;meta.main"); yucd = dupstr("pos.ecliptic.lat;meta.main"); break; } switch (format) { case Coord::DEGREES: str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; break; case Coord::SEXAGESIMAL: str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; break; } str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; } else { str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; } } } str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl; str << "" << endl << "" << endl; } void Base::markerListXMLFooter(ostream& str) { str << "" << endl << "" << endl << "
" << endl << "
" << endl << "
" << endl; } saods9/tksao1.0/frame/frsave.C000644 000765 000000 00000031406 12600033722 016407 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "framebase.h" #include "framergb.h" #include "fitsimage.h" #include "outfile.h" #include "outchannel.h" #include "outsocket.h" #include "sigbus.h" void Base::saveFits(OutFitsStream& str) { FitsImage* ptr = currentContext->fits; if (!ptr) return; int dd = currentContext->naxis(2); if (!ptr->isIIS()) { ptr->saveFitsHeader(str,dd); size_t cnt =0; FitsImage* sptr = ptr; while (sptr) { cnt += sptr->saveFits(str); sptr = sptr->nextSlice(); } ptr->saveFitsPad(str,cnt,'\0'); } else { ptr->saveFitsIISHeader(str); size_t cnt = ptr->saveFitsIIS(str); ptr->saveFitsPad(str,cnt,'\0'); } } void Base::saveFitsTable(OutFitsStream& str) { FitsImage* ptr = currentContext->fits; if (ptr) { if (ptr->isTable()) ptr->saveFitsTable(str); else { Tcl_AppendResult(interp, " not a fits table", NULL); result = TCL_ERROR; } } } void Base::saveFitsSlice(OutFitsStream& str) { FitsImage* ptr = currentContext->cfits; if (!ptr) return; ptr->saveFitsHeader(str,0); size_t cnt = ptr->saveFits(str); ptr->saveFitsPad(str,cnt,'\0'); } void Base::saveFitsExtCube(OutFitsStream& str) { FitsImage* ptr = currentContext->fits; if (!ptr) return; ptr->saveFitsPrimHeader(str); while (ptr) { ptr->saveFitsXtHeader(str, 0); size_t cnt = ptr->saveFits(str); ptr->saveFitsPad(str,cnt,'\0'); ptr = ptr->nextSlice(); } } void Base::saveFitsMosaic(OutFitsStream& str, int which) { FitsImage* ptr = currentContext->fits; int dd = currentContext->naxis(2); // which 1 to n which--; while (ptr && which) { ptr = ptr->nextMosaic(); which--; } if (!ptr) return; ptr->saveFitsHeader(str,dd); size_t cnt =0; FitsImage* sptr = ptr; while (sptr) { cnt += sptr->saveFits(str); sptr = sptr->nextSlice(); } ptr->saveFitsPad(str,cnt,'\0'); } void Base::saveFitsMosaicImage(OutFitsStream& str) { FitsImage* ptr = currentContext->fits; if (!ptr) return; int dd = currentContext->naxis(2); ptr->saveFitsPrimHeader(str); while (ptr) { ptr->saveFitsXtHeader(str,dd); size_t cnt =0; FitsImage* sptr = ptr; while (sptr) { cnt += sptr->saveFits(str); sptr = sptr->nextSlice(); } ptr->saveFitsPad(str,cnt,'\0'); ptr = ptr->nextMosaic(); } } void FrameRGB::saveFitsRGBImage(OutFitsStream& str) { FitsImage* ptr = keyContext->fits; if (!ptr) return; // fake primary header ptr->saveFitsPrimHeader(str); for (int ii=0; ii<3; ii++) { if (context[ii].fits) { context[ii].fits->saveFitsXtHeader(str,0); size_t cnt = context[ii].fits->saveFits(str); context[ii].fits->saveFitsPad(str,cnt,'\0'); } } } void FrameRGB::saveFitsRGBCube(OutFitsStream& str) { FitsImage* ptr = keyContext->fits; if (!ptr) return; int ss =0; for (int ii=0; ii<3; ii++) if (context[ii].fits) ss++; ptr->saveFitsHeader(str,ss); size_t cnt =0; for (int ii=0; ii<3; ii++) if (context[ii].fits) cnt += context[ii].fits->saveFits(str); ptr->saveFitsPad(str,cnt,'\0'); } void Base::saveArray(OutFitsStream& str, FitsFile::ArchType endian) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // set endian if needed if (endian == FitsFile::NATIVE) { if (lsb()) endian = FitsFile::LITTLE; else endian = FitsFile::BIG; } // dump each slice while (ptr) { ptr->saveArray(str,endian); ptr = ptr->nextSlice(); } } void FrameRGB::saveArrayRGBCube(OutFitsStream& str, FitsFile::ArchType endian) { FitsImage* ptr = keyContext->fits; if (!ptr) return; // set endian if needed if (endian == FitsFile::NATIVE) { if (lsb()) endian = FitsFile::LITTLE; else endian = FitsFile::BIG; } for (int ii=0; ii<3; ii++) if (context[ii].fits) context[ii].fits->saveArray(str,endian); } void Base::saveNRRD(OutFitsStream& str, FitsFile::ArchType endian) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // set endian if needed if (endian == FitsFile::NATIVE) { if (lsb()) endian = FitsFile::LITTLE; else endian = FitsFile::BIG; } // dump header ostringstream hstr; hstr << "NRRD0002" << endl; if (currentContext->naxis(2)>1) { hstr << "dimension: 3" << endl; hstr << "sizes: " << ptr->naxis(0) << ' ' << ptr->naxis(1) << ' ' << currentContext->naxis(2) << endl; } else { hstr << "dimension: 2" << endl; hstr << "sizes: " << ptr->naxis(0) << ' ' << ptr->naxis(1) << endl; } switch (ptr->bitpix()) { case 8: hstr << "type: char" << endl; break; case 16: hstr << "type: short" << endl; break; case 32: hstr << "type: int" << endl; break; case 64: hstr << "type: longlong" << endl; break; case -32: hstr << "type: float" << endl; break; case -64: hstr << "type: double" << endl; break; } if (abs(ptr->bitpix()) > 8) { switch (endian) { case FitsFile::LITTLE: hstr << "endian: little" << endl; break; case FitsFile::BIG: hstr << "endian: big" << endl; break; default: // na break; } } hstr << "encoding: raw" << endl; // very important hstr << endl; char* ll = (char*)hstr.str().c_str(); str.write(ll, strlen(ll)); // now dump each slice while (ptr) { ptr->saveArray(str,endian); ptr = ptr->nextSlice(); } } void Base::saveENVI(ostream& hstr, OutFitsStream& fstr, FitsFile::ArchType endian) { FitsImage* ptr = currentContext->fits; if (!ptr) return; // set endian if needed if (endian == FitsFile::NATIVE) { if (lsb()) endian = FitsFile::LITTLE; else endian = FitsFile::BIG; } // header hstr << "ENVI" << endl; hstr << "description = {}" << endl; hstr << "samples = " << ptr->naxis(0) << endl; hstr << "lines = " << ptr->naxis(1) << endl; if (currentContext->naxis(2)>1) { hstr << "bands = " << currentContext->naxis(2) << endl; } hstr << "header offset = 0" << endl; hstr << "file type = ENVI Standard" << endl; hstr << "data type = "; switch (ptr->bitpix()) { case 8: hstr << "1" << endl; break; case 16: hstr << "2" << endl; break; case -16: hstr << "12" << endl; break; case 32: hstr << "3" << endl; break; case 64: hstr << "14" << endl; break; case -32: hstr << "4" << endl; break; case -64: hstr << "5" << endl; break; } hstr << "interleave = bsq" << endl; hstr << "byte order = "; switch (endian) { case FitsFile::LITTLE: hstr << "0" << endl; break; case FitsFile::BIG: hstr << "1" << endl; break; default: // na break; } // now dump each slice while (ptr) { ptr->saveArray(fstr,endian); ptr = ptr->nextSlice(); } } void FrameBase::saveFitsResample(OutFitsStream& str) { int& width = options->width; int& height = options->height; int bitpix_ = -32; int datapixels_ = width*height; int realbytes_ = datapixels_ * (abs(bitpix_)/8); int datablocks_ = (realbytes_ + (FTY_BLOCK-1))/FTY_BLOCK; int databytes_ = datablocks_ * FTY_BLOCK; // create header FitsHead hd(width, height, 1, bitpix_); // write keywords saveFitsResampleKeyword(str, hd); // write header str.write(hd.cards(), hd.headbytes()); // write data saveFitsResampleFits(str); // pad rest of block { int diff = databytes_ - realbytes_; char buf[diff]; memset(buf,'\0',diff); str.write(buf, diff); } } void FrameBase::saveFitsResampleKeyword(OutFitsStream& str, FitsHead& dst) { FitsHead* src = currentContext->fits->head(); Vector center = Vector(options->width, options->height)/2.; // OBJECT char* object = src->getString("OBJECT"); if (object) { dst.appendString("OBJECT", object, NULL); delete [] object; } // DATE-OBS char* date = src->getString("DATE"); if (date) { dst.appendString("DATE", date, NULL); delete [] date; } char* dateobs = src->getString("DATE-OBS"); if (dateobs) { dst.appendString("DATE-OBS", dateobs, NULL); delete [] dateobs; } char* timeobs = src->getString("TIME-OBS"); if (timeobs) { dst.appendString("TIME-OBS", timeobs, NULL); delete [] timeobs; } char* dateend = src->getString("DATE-END"); if (dateend) { dst.appendString("DATE-END", dateend, NULL); delete [] dateend; } char* timeend = src->getString("TIME-END"); if (timeend) { dst.appendString("TIME-END", timeend, NULL); delete [] timeend; } // LTMV,DTMV if (!isMosaic()) { if (currentContext->fits->hasLTMV()) { Matrix ltmv = currentContext->fits->physicalToRef * refToWidget * Translate(-center) * Translate(1,0) * FlipY() * Translate(center); dst.appendReal("LTM1_1", ltmv[0][0], 9, NULL); dst.appendReal("LTM1_2", ltmv[0][1], 9, NULL); dst.appendReal("LTM2_1", ltmv[1][0], 9, NULL); dst.appendReal("LTM2_2", ltmv[1][1], 9, NULL); dst.appendReal("LTV1", ltmv[2][0], 9, NULL); dst.appendReal("LTV2", ltmv[2][1], 9, NULL); } } else { if (currentContext->fits->hasDTMV()) { Matrix dtmv = currentContext->fits->detectorToRef * refToWidget * Translate(-center) * Translate(1,0) * FlipY() * Translate(center); dst.appendReal("DTM1_1", dtmv[0][0], 9, NULL); dst.appendReal("DTM1_2", dtmv[0][1], 9, NULL); dst.appendReal("DTM2_1", dtmv[1][0], 9, NULL); dst.appendReal("DTM2_2", dtmv[1][1], 9, NULL); dst.appendReal("DTV1", dtmv[2][0], 9, NULL); dst.appendReal("DTV2", dtmv[2][1], 9, NULL); } } // WCS if (currentContext->fits->hasWCS(Coord::WCS)) { WorldCoor* wcs = currentContext->fits->getWCS(Coord::WCS); // abort if this is a DSS, ZPN, TNX if (!strncmp(wcs->ptype,"DSS",3) || !strncmp(wcs->ptype,"ZPN",3) || !strncmp(wcs->ptype,"TNX",3)) return; dst.appendString("RADESYS", wcs->radecsys, NULL); dst.appendReal("EQUINOX", wcs->equinox, 9, NULL); dst.appendString("CTYPE1", wcs->ctype[0], NULL); dst.appendString("CTYPE2", wcs->ctype[1], NULL); dst.appendReal("CRVAL1", wcs->crval[0], 9, NULL); dst.appendReal("CRVAL2", wcs->crval[1], 9, NULL); char* cunit1 = src->getString("CUNIT1"); if (cunit1) { dst.appendString("CUNIT1", cunit1, NULL); delete [] cunit1; } char* cunit2 = src->getString("CUNIT2"); if (cunit2) { dst.appendString("CUNIT2", cunit2, NULL); delete [] cunit2; } // crpix Vector crpix = Vector(wcs->crpix[0],wcs->crpix[1]) * currentContext->fits->imageToWidget * Translate(-center) * Translate(1,0) * FlipY() * Translate(center); dst.appendReal("CRPIX1", crpix[0], 9, NULL); dst.appendReal("CRPIX2", crpix[1], 9, NULL); // cd matrix Matrix cd = Matrix(wcs->cd[0],wcs->cd[1],wcs->cd[2],wcs->cd[3],0,0) * currentContext->fits->imageToRef * refToUser * wcsOrientationMatrix * Rotate(wcsRotation) * orientationMatrix * Scale(zoom_.invert()) * Rotate(rotation) * Translate(center) * Translate(-center) * Translate(1,0) * FlipY() * Translate(center); dst.appendReal("CD1_1", cd.matrix(0,0), 9, NULL); dst.appendReal("CD1_2", cd.matrix(0,1), 9, NULL); dst.appendReal("CD2_1", cd.matrix(1,0), 9, NULL); dst.appendReal("CD2_2", cd.matrix(1,1), 9, NULL); } } void FrameBase::saveFitsResampleFits(OutFitsStream& str) { int& width = options->width; int& height = options->height; // basics FitsImage* sptr = currentContext->fits; int mosaic = isMosaic(); // variable double* mm = sptr->matrixToData(Coord::WIDGET).mm(); FitsBound* params = sptr->getDataParams(currentContext->frScale.scanMode()); int srcw = sptr->width(); // main loop SETSIGBUS for (int jj=height-1; jj>=0; jj--) { for (int ii=0; iifits; mm = sptr->matrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(currentContext->frScale.scanMode()); srcw = sptr->width(); } float v = NAN; do { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx>=params->xmin && xxxmax && yy>=params->ymin && yyymax) { v = sptr->getValueFloat(long(yy)*srcw + long(xx)); break; } else { if (mosaic) { sptr = sptr->nextMosaic(); if (sptr) { mm = sptr->matrixToData(Coord::WIDGET).mm(); params = sptr->getDataParams(currentContext->frScale.scanMode()); srcw = sptr->width(); } } } } while (mosaic && sptr); if (lsb()) str.writeSwap((char*)(&v), 4, -32); else str.write((char*)(&v), 4); } } CLEARSIGBUS } saods9/tksao1.0/frame/frscale.C000644 000765 000000 00000013737 12616732024 016557 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "frscale.h" #include "fitsimage.h" FrScale::FrScale() { colorScaleType_ = LINEARSCALE; clipScope_ = LOCAL; clipMode_ = MINMAX; mmMode_ = SCAN; low_ = 1; high_ = 100; min_ = 1; max_ = 100; uLow_ = 1; uHigh_ = 100; expo_ = 1000; zContrast_ = .25; zSample_ = 600; zLine_ = 120; autoCutPer_ = 1; scanMode_ = IMGSEC; histequ_ = NULL; histequSize_ = 0; histogramX_ = NULL; histogramY_ = NULL; histogramSize_ = 0; datasec_ = 1; } FrScale::~FrScale() { if (histequ_) delete [] histequ_; if (histogramX_) free(histogramX_); if (histogramY_) free(histogramY_); } FrScale::FrScale(const FrScale& a) { colorScaleType_ = a.colorScaleType_; clipScope_ = a.clipScope_; clipMode_ = a.clipMode_; mmMode_ = a.mmMode_; low_ = a.low_; high_ = a.high_; min_ = a.min_; max_ = a.max_; uLow_ = a.uLow_; uHigh_ = a.uHigh_; expo_ = a.expo_; zContrast_ = a.zContrast_; zSample_ = a.zSample_; zLine_ = a.zLine_; autoCutPer_ = a.autoCutPer_; scanMode_ = a.scanMode_; if (a.histequ_) { histequ_ = new double[a.histequSize_]; memcpy(histequ_,a.histequ_,a.histequSize_*sizeof(double)); } else histequ_ = NULL; histequSize_ = a.histequSize_; if (a.histogramX_) { histogramX_ = (double*)calloc(a.histogramSize_, sizeof(double)); memcpy(histogramX_,a.histogramX_,a.histogramSize_*sizeof(double)); } else histogramX_ = NULL; if (a.histogramY_) { histogramY_ = (double*)calloc(a.histogramSize_, sizeof(double)); memcpy(histogramY_,a.histogramY_,a.histogramSize_*sizeof(double)); } else histogramY_ = NULL; histogramSize_ = a.histogramSize_; } FrScale& FrScale::operator=(const FrScale& a) { colorScaleType_ = a.colorScaleType_; clipScope_ = a.clipScope_; clipMode_ = a.clipMode_; mmMode_ = a.mmMode_; low_ = a.low_; high_ = a.high_; min_ = a.min_; max_ = a.max_; uLow_ = a.uLow_; uHigh_ = a.uHigh_; expo_ = a.expo_; zContrast_ = a.zContrast_; zSample_ = a.zSample_; zLine_ = a.zLine_; autoCutPer_ = a.autoCutPer_; scanMode_ = a.scanMode_; if (histequ_) delete histequ_; histequ_ = NULL; if (a.histequ_) { histequ_ = new double[a.histequSize_]; memcpy(histequ_,a.histequ_,a.histequSize_*sizeof(double)); } histequSize_ = a.histequSize_; if (histogramX_) free(histogramX_); histogramX_ = NULL; if (a.histogramX_) { histogramX_ = (double*)calloc(a.histogramSize_, sizeof(double)); memcpy(histogramX_,a.histogramX_,a.histogramSize_*sizeof(double)); } if (histogramY_) free(histogramY_); histogramY_ = NULL; if (a.histogramY_) { histogramY_ = (double*)calloc(a.histogramSize_, sizeof(double)); memcpy(histogramY_,a.histogramY_,a.histogramSize_*sizeof(double)); } histogramSize_ = a.histogramSize_; return *this; } double* FrScale::histequ(FitsImage* fits) { if (DebugPerf) cerr << "FrScale::histequ()" << endl; // if we don't have any data, bail if (!fits) return NULL; // if we already have it, bail if (histequ_) return histequ_; // create pdf or histogram double* pdf = new double[HISTEQUSIZE]; memset(pdf,0,HISTEQUSIZE*sizeof(double)); FitsImage* ptr = fits; while (ptr) { FitsImage* sptr = ptr; while (sptr) { sptr->bin(pdf, HISTEQUSIZE, low_, high_, scanMode_); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } // find a total/average double total, average; { total = 0; for (int ii=0; ii=average && color0) { for (int ii=0; iibin(histogramY_, nn, min_, max_, scanMode_); sptr = sptr->nextSlice(); } ptr = ptr->nextMosaic(); } } break; case LOCAL: { FitsImage* ptr = fits; while (ptr) { ptr->bin(histogramY_, nn, min_, max_, scanMode_); ptr = ptr->nextMosaic(); } } break; } } } void FrScale::clearHistogram() { if (DebugPerf) cerr << "FrScale::clearHistogram" << endl; if (histogramX_) free(histogramX_); histogramX_ = NULL; if (histogramY_) free(histogramY_); histogramY_ = NULL; histogramSize_ = 0; } ostream& operator<<(ostream& s, FrScale& fr) { s << "scope: " << fr.clipScope() << endl; s << "mode: " << fr.clipMode() << endl; s << "low: " << fr.low() << endl; s << "high: " << fr.high() << endl; s << "min: " << fr.min() << endl; s << "max: " << fr.max() << endl; return s; } saods9/tksao1.0/frame/frscale.h000644 000765 000000 00000007140 12616732024 016613 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __frscale_h__ #define __frscale_h__ #include #include #include using namespace std; class FitsImage; class FrScale { public: enum ColorScaleType {LINEARSCALE, LOGSCALE, POWSCALE, SQRTSCALE, SQUAREDSCALE, ASINHSCALE, SINHSCALE, HISTEQUSCALE, IISSCALE}; enum ClipScope {GLOBAL, LOCAL}; enum ClipMode {MINMAX, ZSCALE, ZMAX, AUTOCUT, USERCLIP}; enum MinMaxMode {SCAN, DATAMIN, IRAFMIN}; enum ScanMode {IMGSEC, DATASEC, CROPSEC}; private: ColorScaleType colorScaleType_; // color scale type ClipScope clipScope_; // color scale clip scope ClipMode clipMode_; // color scale clip mode MinMaxMode mmMode_; // method to use for determining minmax double low_; // low cut level for all data double high_; // high cut level for all data double min_; // min for all data double max_; // max for all data double uLow_; // low cut via user for all data double uHigh_; // high cut via user for all data float expo_; // log scale exponent float zContrast_; // zscale slope transfer function int zSample_; // zscale optimal sample size int zLine_; // zscale number of lines to sample float autoCutPer_; // autoCut percentage ScanMode scanMode_; // use keyword DATASEC double* histequ_; // image histogram equalization xfer function int histequSize_; double* histogramX_; // scale histogram double* histogramY_; // scale histogram int histogramSize_; int datasec_; public: FrScale(); ~FrScale(); FrScale(const FrScale&); FrScale& operator=(const FrScale&); ColorScaleType colorScaleType() {return colorScaleType_;} ClipScope clipScope() {return clipScope_;} ClipMode clipMode() {return clipMode_;} MinMaxMode mmMode() {return mmMode_;} double low() {return low_;} double high() {return high_;} double min() {return min_;} double max() {return max_;} double uLow() {return uLow_;} double uHigh() {return uHigh_;} float expo() {return expo_;} float zContrast() {return zContrast_;} int zSample() {return zSample_;} int zLine() {return zLine_;} float autoCutPer() {return autoCutPer_;} ScanMode scanMode() {return scanMode_;} double* histogramX() {return histogramX_;} double* histogramY() {return histogramY_;} int datasec() {return datasec_;} void setColorScaleType(ColorScaleType v) {colorScaleType_ = v;} void setClipScope(ClipScope v) {clipScope_ = v;} void setClipMode(ClipMode v) {clipMode_ = v;} void setMMMode(MinMaxMode v) {mmMode_ = v;} void setLow(double v) {low_ = v;} void setHigh(double v) {high_ = v;} void setMin(double v) {min_ = v;} void setMax(double v) {max_ = v;} void setULow(double v) {uLow_ = v;} void setUHigh(double v) {uHigh_ = v;} void setExpo(float e) {expo_ = e>10 ? e : 10;} void setZContrast(float v) {zContrast_ = v;} void setZSample(int v) {zSample_ = v;} void setZLine(int v) {zLine_ = v;} void setAutoCutPer(float v) {autoCutPer_ = v;} void setScanMode(ScanMode v) {scanMode_ = v;} void resetScanMode() {scanMode_ = datasec_ ? DATASEC : IMGSEC;} void setDataSec(int d) {datasec_ = d;} double* histequ(FitsImage*); void clearHistequ(); void histogram(FitsImage*, int); void clearHistogram(); }; ostream& operator<<(ostream&, FrScale&); #endif saods9/tksao1.0/frame/fvcontour.C000644 000765 000000 00000023703 12616470455 017166 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "context.h" #include "base.h" #include "fitsimage.h" #include "fvcontour.h" #include "sigbus.h" #ifdef INTERP #undef INTERP #endif #define INTERP (((Base*)parent)->interp) static const char* methodName_[] = { "smooth", "block" }; // It is a modified version of contour code found in Fv 2.4 // Fv may be obtained from the HEASARC (High Energy Astrophysics Science // Archive Research Center) FTOOLS Web site at: // http://heasarc.gsfc.nasa.gov/ftools/fv.html // The original author is unknown. FVContour::FVContour(Base* pp, FitsImage* fits, const char* cc, int ww, int dd, Method mm, int nn, int rr, const char* ll, FrScale::ColorScaleType sc, float exp, float cm, Vector lim, InverseScale* ss) : Contour(pp, cc, ww, dd) { method_ = mm; level_ = dupstr(ll); numLevel_ = nn; smooth_ = rr; colorScaleType_ = sc; expo_ = exp; clipMode_ = cm; limits_ = lim; scale = ss; append(fits); } FVContour::~FVContour() { if (level_) delete [] level_; if (scale) delete scale; } void FVContour::update(FitsImage* fits) { contours_.deleteAll(); append(fits); } void FVContour::update(FitsImage* fits, InverseScale* ss) { if (scale) delete scale; scale = ss; contours_.deleteAll(); append(fits); } void FVContour::setLevel(const char* ll) { if (level_) delete [] level_; level_ = dupstr(ll); } const char* FVContour::methodName() { return methodName_[method_]; } void FVContour::append(FitsImage* fits) { if (smooth_ == 1) unity(fits); else switch (method_) { case SMOOTH: nobin(fits); break; case BLOCK: bin(fits); break; } } void FVContour::unity(FitsImage* fits) { FitsBound* params = fits->getDataParams(((Base*)parent)->currentContext->frScale.scanMode()); long width = fits->width(); long height = fits->height(); // blank img long size = width*height; double* img = new double[size]; if (!img) { internalError("FVContour could not allocate enough memory"); return; } for (long ii=0; iiymin; jjymax; jj++) { for(long ii=params->xmin; iixmax; ii++) { long kk = jj*width + ii; double vv = fits->getValueDouble(kk); if (isfinite(vv)) img[kk] = vv; } } CLEARSIGBUS // do contours int status = build(width, height, img, fits->dataToRef); // clean up delete [] img; if (status) internalError("Unknown FVContour error"); } void FVContour::nobin(FitsImage* fits) { long width = fits->width(); long height = fits->height(); // blank img long size = width*height; double* img = new double[size]; if (!img) { internalError("FVContour could not allocate enough memory"); return; } for (long ii=0; iidataToRef); // cleanup delete kernal; delete img; if (status) internalError("Unknown FVContour error"); } void FVContour::convolve(FitsImage* fits, double* kernal, double* dest, int r) { FitsBound* params = fits->getDataParams(((Base*)parent)->currentContext->frScale.scanMode()); long width = fits->width(); int rr = 2*r+1; SETSIGBUS for (long jj=params->ymin; jjymax; jj++) { for (long ii=params->xmin; iixmax; ii++) { long ir = ii-r; long irr = ii+r; long jr = jj-r; long jrr = jj+r; for (long n=jr, nn=0; n<=jrr; n++, nn++) { if (n>=params->ymin && nymax) { for (long m=ir, mm=0; m<=irr; m++, mm++) { if (m>=params->xmin && mxmax) { double vv = fits->getValueDouble(n*width+m); if (isfinite(vv)) { double kk = kernal[nn*rr+mm]; double* ptr = dest+(jj*width+ii); if (*ptr == FLT_MIN) *ptr = vv*kk; else *ptr += vv*kk; } } } } } } } CLEARSIGBUS } double* FVContour::tophat(int r) { int rr = 2*r+1; int ksz = rr*rr; double* kernal = new double[ksz]; memset(kernal, 0, ksz*sizeof(double)); double kt = 0; for (int yy=-r; yy<=r; yy++) { for (int xx=-r; xx<=r; xx++) { if ((xx*xx + yy*yy) <= r*r) { kernal[(yy+r)*rr+(xx+r)] = 1; kt++; } } } // normalize kernal for (int aa=0; aagetDataParams(((Base*)parent)->currentContext->frScale.scanMode()); long width = fits->width(); long height = fits->height(); int rr = smooth_; long w2 = (long)(width/rr); long h2 = (long)(height/rr); Matrix m = Translate((Vector(-width,-height)/2).floor()) * Scale(1./rr) * Translate((Vector(w2,h2)/2).floor()); Matrix n = m.invert(); double* mm = m.mm(); double* img = new double[w2 * h2]; { for (long jj=0; jjymin; jjymax; jj++) { for (long ii=params->xmin; iixmax; ii++) { double xx = ii*mm[0] + jj*mm[3] + mm[6]; double yy = ii*mm[1] + jj*mm[4] + mm[7]; if (xx >= 0 && xx < w2 && yy >= 0 && yy < h2) { long kk = (long(yy)*w2 + long(xx)); double v = fits->getValueDouble(jj*width + ii); if (isfinite(v)) { if (count[kk]) img[kk] += v; else img[kk] = v; count[kk]++; } } } } for (long kk=0; kkdataToRef; int status = build(w2, h2, img, w); delete [] img; if (status) internalError("Unknown FVContour error"); } int FVContour::build(long xdim, long ydim, double *image, Matrix& mx) { int status = 0; long nelem = xdim*ydim; char* usedGrid = new char[nelem]; if (!usedGrid) return 1; double** rows = new double*[ydim]; if (!rows) return 1; for (long jj=0; jjsize() && !status; c++) { double cntour = scale->level(c); for (long elem=0; elem=0 && !status; ii--) if (rows[jj][ii+1]=0 && !status; jj--) if (rows[jj+1][ii]=xdim-1 || (jj<0 && jj>=ydim-1)); while (!done) { int flag = 0; double a = rows[jj][ii]; double b = rows[jj][ii+1]; double c = rows[jj+1][ii+1]; double d = rows[jj+1][ii]; double X, Y; if (init) { init = 0; switch (side) { case top: X = (cntr-a) / (b-a) + ii; Y = jj; break; case right: X = ii+1; Y = (cntr-b) / (c-b) + jj; break; case bottom: X = (cntr-c) / (d-c) + ii; Y = jj+1; break; case left: X = ii; Y = (cntr-a) / (d-a) + jj; break; } } else { if (side==top) usedGrid[jj*xdim + ii] = 1; do { if (++side == none) side = top; switch (side) { case top: if (a>=cntr && cntr>b) { flag = 1; X = (cntr-a) / (b-a) + ii; Y = jj; jj--; } break; case right: if( b>=cntr && cntr>c ) { flag = 1; X = ii+1; Y = (cntr-b) / (c-b) + jj; ii++; } break; case bottom: if( c>=cntr && cntr>d ) { flag = 1; X = (cntr-d) / (c-d) + ii; Y = jj+1; jj++; } break; case left: if( d>=cntr && cntr>a ) { flag = 1; X = ii; Y = (cntr-a) / (d-a) + jj; ii--; } break; } } while (!flag); if (++side == none) side = top; if (++side == none) side = top; if (ii==xCell && jj==yCell && side==origSide) done = 1; if (ii<0 || ii>=xdim-1 || jj<0 || jj>=ydim-1) done = 1; } contours_.append(new Vertex(Vector(X+.5,Y+.5)*mx)); if (done) contours_.append(new Vertex(DBL_MAX, DBL_MAX)); } return 0; } saods9/tksao1.0/frame/fvcontour.h000644 000765 000000 00000003667 12616470455 017242 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fvcontour_h__ #define __fvcontour_h__ #include "vector.h" #include "contour.h" #include "frscale.h" #include "inversescale.h" class FVContour : public Contour { public: enum Method {SMOOTH, BLOCK}; private: enum {top, right, bottom, left, none}; Method method_; char* level_; int numLevel_; int smooth_; FrScale::ColorScaleType colorScaleType_; float expo_; float clipMode_; Vector limits_; InverseScale* scale; void unity(FitsImage*); void bin(FitsImage*); void nobin(FitsImage*); void convolve(FitsImage*, double*, double*, int); double* tophat(int); double* gaussian(int); int build(long xdim, long ydim, double *image, Matrix&); int trace(long xdim, long ydim, double cntr, long xCell, long yCell, int side, double** rows, char* useGrid, Matrix&); public: FVContour(Base*, FitsImage*, const char*, int, int, Method, int, int, const char*, FrScale::ColorScaleType, float, float, Vector, InverseScale*); ~FVContour(); void append(FitsImage*); void update(FitsImage*); void update(FitsImage*, InverseScale*); int method() {return method_;} const char* methodName(); char* level() {return level_;} int numLevel() {return numLevel_;} int smooth() {return smooth_;} int colorScaleType() {return colorScaleType_;} float expo() {return expo_;} float clipMode() {return clipMode_;} Vector limits() {return limits_;} void setMethod(Method mm) {method_ = mm;} void setLevel(const char*); void setNumLevel(int num) {numLevel_ = num;} void setSmooth(int ss) {smooth_ = ss;} void setColorScaleType(FrScale::ColorScaleType tt) {colorScaleType_ = tt;} void setExpo(float xx) {expo_ = xx;} void setClipMode(float mm) {clipMode_ = mm;} void setLimits(const Vector& ll) {limits_ = ll;} }; #endif saods9/tksao1.0/frame/grid.C000644 000765 000000 00000001012 12540070070 016034 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid.h" #include "context.h" #include "fitsimage.h" extern "C" { #include "ast.h" } Grid::Grid(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, GridType type, const char* v) : type_(type), system_(sys), sky_(sky), skyFormat_(format) { vars_ = dupstr(v); } Grid::~Grid() { if (vars_) delete [] vars_; } saods9/tksao1.0/frame/grid.h000644 000765 000000 00000001674 12544546070 016133 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid_h__ #define __grid_h__ #include "coord.h" class Grid { public: enum GridType {ANALYSIS,PUBLICATION}; protected: GridType type_; Coord::CoordSystem system_; Coord::SkyFrame sky_; Coord::SkyFormat skyFormat_; char* vars_; public: Grid(Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, GridType, const char*); virtual ~Grid(); virtual const char* option() =0; virtual void x11() =0; virtual void ps(int) =0; #ifdef MAC_OSX_TK virtual void macosx() =0; #endif #ifdef __WIN32 virtual void win32() =0; #endif GridType type() {return type_;} Coord::CoordSystem system() {return system_;} Coord::SkyFrame sky() {return sky_;} Coord::SkyFormat skyFormat() {return skyFormat_;} const char* vars() {return vars_;} }; #endif saods9/tksao1.0/frame/grid25d.C000644 000765 000000 00000007345 12537642733 016407 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid25d.h" #include "context.h" #include "frame3dbase.h" #include "fitsimage.h" extern "C" { #include "ast.h" } extern Grid25dBase* astGrid25dPtr; Grid25d::Grid25d(Widget* p, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, GridType t, const char* o, const char* v) : Grid(sys, sky, format, t, v), Grid25dBase(p,o) {} Grid25d::~Grid25d() {} int Grid25d::doit(RenderMode rm) { Frame3dBase* pp = (Frame3dBase*)parent_; matrix_ = pp->widgetToCanvas; gc_ = pp->gridGC; pixmap_ = pp->pixmap; renderMode_ = rm; Context* context = pp->keyContext; FitsImage* fits = context->fits; if (!fits) return 1; // int width = fits->width(); // int height = fits->height(); astClearStatus; // just to make sure astBegin; // start memory management AstFrameSet* frameSet = NULL; FitsBound* params = fits->getDataParams(context->frScale.scanMode()); switch (system_) { case Coord::IMAGE: frameSet = (AstFrameSet*)matrixMap(fits->refToImage,"Domain=IMAGE"); break; case Coord::PHYSICAL: frameSet = (AstFrameSet*)matrixMap(fits->refToPhysical,"Domain=PHYSICAL"); break; case Coord::AMPLIFIER: frameSet = (AstFrameSet*)matrixMap(fits->refToAmplifier,"Domain=AMPLIFIER"); break; case Coord::DETECTOR: frameSet = (AstFrameSet*)matrixMap(fits->refToDetector,"Domain=DETECTOR"); default: { // imageToData frame/map double ss[] = {-.5, -.5}; AstShiftMap *sm = astShiftMap(2, ss, " "); AstFrame *df = astFrame(2, "Domain=DATA"); // Get 2D SkyFrame AstFrameSet* wcs = (AstFrameSet*)astCopy(fits->getAST(system_)); if (astIsASkyFrame(astGetFrame(wcs, AST__CURRENT))) fits->setAstSkyFrame(wcs, sky_); // astShow(wcs); // Record the index of the current Frame int isky = astGetI(wcs, "Current"); // Add the new DATA Frame into the FrameSet, using the ShiftMap to // connect it to the existing IMAGE Frame. astAddFrame(wcs, AST__BASE, sm, df); // The above call to astAddFrame will have changed the current Frame // in the FrameSet to be the new DATA Frame. First record the index of // the DATA Frame, and then re-instate the original current Frame (i.e. // the SKY Frame). int idata = astGetI(wcs, "Current"); astSetI(wcs, "Current", isky); // make the DATA Frame the new base Frame astSetI(wcs, "Base", idata); frameSet = wcs; } } if (!frameSet) return 0; astSet(frameSet,"Title=%s", " "); // create astPlot float gbox[4]; double pbox[4]; Vector ll = Vector(params->xmin,params->ymin); Vector ur = Vector(params->xmax,params->ymax); // Vector gll = ll * fits->dataToWidget; // Vector gur = ur * fits->dataToWidget; pbox[0] = gbox[0] = ll[0]; pbox[1] = gbox[1] = ll[1]; pbox[2] = gbox[2] = ur[0]; pbox[3] = gbox[3] = ur[1]; // and now create astGrid astGrid25dPtr = this; AstPlot* plot = astPlot(frameSet, gbox, pbox, option_); astGrid(plot); astEnd; // now, clean up memory astGrid25dPtr =NULL; return 1; } void* Grid25d::matrixMap(Matrix& mx, const char* str) { double ss[] = {mx.matrix(0,0),mx.matrix(1,0), mx.matrix(0,1),mx.matrix(1,1)}; double tt[] = {mx.matrix(2,0),mx.matrix(2,1)}; AstMatrixMap* mm = astMatrixMap(2, 2, 0, ss, ""); AstShiftMap* sm = astShiftMap(2, tt, ""); AstCmpMap* cmap = astCmpMap(mm, sm, 1, ""); AstFrame* in = astFrame(2,"Domain=REF"); AstFrame* out = astFrame(2,str); AstFrameSet* frameSet = astFrameSet(in,""); astAddFrame(frameSet,AST__CURRENT,cmap,out); return frameSet; } saods9/tksao1.0/frame/grid25d.h000644 000765 000000 00000001425 12544546070 016440 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid25d_h__ #define __grid25d_h__ #include "grid.h" #include "grid25dbase.h" #include "coord.h" class Grid25d : public Grid, public Grid25dBase { private: void* matrixMap(Matrix&, const char*); int doit(RenderMode); public: Grid25d(Widget*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, GridType, const char*, const char*); ~Grid25d(); const char* option() {return GridBase::option();} void x11() {doit(X11);} void ps(int mode) {mode_=mode; doit(PS);} #ifdef MAC_OSX_TK void macosx() {doit(MACOSX);} #endif #ifdef __WIN32 void win32() {doit(GWIN32);} #endif }; #endif saods9/tksao1.0/frame/grid2d.C000644 000765 000000 00000007073 12537642733 016320 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid2d.h" #include "context.h" #include "framebase.h" #include "fitsimage.h" extern "C" { #include "ast.h" } extern Grid2dBase* astGrid2dPtr; Grid2d::Grid2d(Widget* p, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, GridType t, const char* o, const char* v) : Grid(sys, sky, format, t, v), Grid2dBase(p,o) {} Grid2d::~Grid2d() {} int Grid2d::doit(RenderMode rm) { FrameBase* pp = (FrameBase*)parent_; matrix_ = pp->widgetToCanvas; gc_ = pp->gridGC; pixmap_ = pp->pixmap; renderMode_ = rm; Context* context = pp->keyContext; FitsImage* fits = context->fits; if (!fits) return 1; // int width = fits->width(); // int height = fits->height(); astClearStatus; // just to make sure astBegin; // start memory management AstFrameSet* frameSet = NULL; AstPlot* plot = NULL; if (!(frameSet = astFrameSet(astFrame(2,"Domain=WIDGET"),""))) { astEnd; return 0; } // map from Widget to Image matrixMap(frameSet,fits->widgetToImage,"Domain=IMAGE"); switch (system_) { case Coord::IMAGE: break; case Coord::PHYSICAL: matrixMap(frameSet,fits->imageToPhysical,"Domain=PHYSICAL"); break; case Coord::AMPLIFIER: matrixMap(frameSet,fits->imageToAmplifier,"Domain=AMPLIFIER"); break; case Coord::DETECTOR: matrixMap(frameSet,fits->imageToDetector,"Domain=DETECTOR"); break; default: { AstFrameSet* wcsfs = (AstFrameSet*)astCopy(fits->getAST(system_)); // set desired skyformat if (astIsASkyFrame(astGetFrame(wcsfs, AST__CURRENT))) fits->setAstSkyFrame(wcsfs, sky_); // add wcs to frameset // this will link frame 2 of frameset to frame 3 wcs with unitMap // set the current of frameset to last astInvert(wcsfs); astAddFrame(frameSet,2,astUnitMap(2,""),wcsfs); astSetI(frameSet,"current",astGetI(frameSet,"nframe")); } } astSet(frameSet,"Title=%s", " "); // create astPlot float gbox[4]; double pbox[4]; switch (type_) { case ANALYSIS: { gbox[0] = pbox[0] = 0; gbox[1] = pbox[1] = 0; gbox[2] = pbox[2] = pp->options->width-1; gbox[3] = pbox[3] = pp->options->height-1; } break; case PUBLICATION: { Matrix mm = fits->imageToWidget; BBox b = pp->imageBBox(pp->context->frScale.scanMode()); Vector ll = b.ll * mm; Vector lr = b.lr() * mm; Vector ur = b.ur * mm; Vector ul = b.ul() * mm; BBox bb(ll,ll); bb.bound(lr); bb.bound(ur); bb.bound(ul); gbox[0] = pbox[0] = bb.ll[0]; gbox[1] = pbox[1] = bb.ll[1]; gbox[2] = pbox[2] = bb.ur[0]; gbox[3] = pbox[3] = bb.ur[1]; } break; } // and now create astGrid astGrid2dPtr = this; plot = astPlot(frameSet, gbox, pbox, option_); astGrid(plot); astEnd; // now, clean up memory astGrid2dPtr =NULL; return 1; } int Grid2d::matrixMap(void* fs, Matrix& mx, const char* str) { AstFrameSet* frameSet = (AstFrameSet*)fs; double ss[] = {mx.matrix(0,0),mx.matrix(1,0), mx.matrix(0,1),mx.matrix(1,1)}; double tt[] = {mx.matrix(2,0),mx.matrix(2,1)}; AstMatrixMap* mm; if (!(mm= astMatrixMap(2, 2, 0, ss, ""))) return 0; AstShiftMap* sm; if (!(sm = astShiftMap(2, tt, ""))) return 0; AstCmpMap* cmp; if (!(cmp = astCmpMap(mm, sm, 1, ""))) return 0; astAddFrame(frameSet, AST__CURRENT, cmp, astFrame(2, str)); return 1; } saods9/tksao1.0/frame/grid2d.h000644 000765 000000 00000001421 12544546070 016347 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid2d_h__ #define __grid2d_h__ #include "grid.h" #include "grid2dbase.h" #include "coord.h" class Grid2d : public Grid, public Grid2dBase { private: int matrixMap(void*, Matrix&, const char*); int doit(RenderMode); public: Grid2d(Widget*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, GridType, const char*, const char*); ~Grid2d(); const char* option() {return GridBase::option();} void x11() {doit(X11);} void ps(int mode) {mode_=mode; doit(PS);} #ifdef MAC_OSX_TK void macosx() {doit(MACOSX);} #endif #ifdef __WIN32 void win32() {doit(GWIN32);} #endif }; #endif saods9/tksao1.0/frame/grid3d.C000644 000765 000000 00000014113 12620716173 016303 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "grid3d.h" #include "context.h" #include "frame3dbase.h" #include "fitsimage.h" extern "C" { #include "ast.h" } static FitsImage* foobar; void bar(AstMapping* that, int npoint, int ncoord_in, const double* ptr_in[], int forward, int ncoord_out, double* ptr_out[]) { WCSx** wcsx = foobar->wcsx(); if (forward) { for (int ii=0; iicrpix[2]) * wcsx[0]->cd[2] + wcsx[0]->crval[2]; } else { for (int ii=0; iicrval[2]) / wcsx[0]->cd[2] + wcsx[0]->crpix[2] -.5; } } extern Grid3dBase* astGrid3dPtr; Grid3d::Grid3d(Widget* p, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, GridType t, const char* o, const char* v) : Grid(sys, sky, format, t, v), Grid3dBase(p,o) {} Grid3d::~Grid3d() {} int Grid3d::doit(RenderMode rm) { Frame3dBase* pp = (Frame3dBase*)parent_; mx_ = pp->refToWidget3d; rx_ = Matrix3d(pp->wcsOrientationMatrix) * Matrix3d(pp->orientationMatrix) * RotateZ3d(-pp->wcsRotation) * RotateZ3d(-pp->rotation) * RotateY3d(pp->az_) * RotateX3d(pp->el_); matrix_ = pp->widgetToCanvas; gc_ = pp->gridGC; pixmap_ = pp->pixmap; renderMode_ = rm; Context* context = pp->keyContext; FitsImage* fits = context->fits; foobar = fits; if (!fits) return 1; // int width = fits->width(); // int height = fits->height(); astClearStatus; // just to make sure astBegin; // start memory management AstFrameSet* frameSet = NULL; AstPlot3D* plot = NULL; FitsBound* params = fits->getDataParams(context->frScale.scanMode()); FitsZBound* zparams = context->getDataParams(context->frScale.scanMode()); switch (system_) { case Coord::IMAGE: frameSet = (AstFrameSet*)matrixMap(fits->refToImage,"Domain=IMAGE"); break; case Coord::PHYSICAL: frameSet = (AstFrameSet*)matrixMap(fits->refToPhysical,"Domain=PHYSICAL"); break; case Coord::AMPLIFIER: frameSet = (AstFrameSet*)matrixMap(fits->refToAmplifier,"Domain=AMPLIFIER"); break; case Coord::DETECTOR: frameSet = (AstFrameSet*)matrixMap(fits->refToDetector,"Domain=DETECTOR"); break; default: { // imageToData frame/map double ss[] = {-.5, -.5}; AstShiftMap *sm = astShiftMap(2, ss, " "); AstFrame *df = astFrame(2, "Domain=DATA"); // Get 2D SkyFrame AstFrameSet* wcs = (AstFrameSet*)astCopy(fits->getAST(system_)); if (astIsASkyFrame(astGetFrame(wcs, AST__CURRENT))) fits->setAstSkyFrame(wcs, sky_); // Record the index of the current Frame int isky = astGetI(wcs, "Current"); // Add the new DATA Frame into the FrameSet, using the ShiftMap to // connect it to the existing IMAGE Frame. astAddFrame(wcs, AST__BASE, sm, df); // The above call to astAddFrame will have changed the current Frame // in the FrameSet to be the new DATA Frame. First record the index of // the DATA Frame, and then re-instate the original current Frame (i.e. // the SKY Frame). int idata = astGetI(wcs, "Current"); astSetI(wcs, "Current", isky); // make the DATA Frame the new base Frame astSetI(wcs, "Base", idata); // Create two 1D Frames and a 1D Mapping describing the third axis AstFrame* zbase = astFrame(1,""); AstFrame* zcurr = astFrame(1,""); AstMapping* zmap; if (fits->hasWCSx(system_,2)) { astIntraReg("foo",1,1,bar,0,"testing","me","you"); if (!(zmap = (AstMapping*)astIntraMap("foo",1,1,""))) return 0; } else zmap = (AstMapping*)astUnitMap(1,""); // Use astGetFrame and astGetMapping to get the base and current // Frames from the 2D FrameSet, and the base->current Mapping. AstFrame* wcsbase = (AstFrame*)astGetFrame(wcs,AST__BASE); AstFrame* wcscurr = (AstFrame*)astGetFrame(wcs,AST__CURRENT); AstMapping* wcsmap = (AstMapping*)astGetMapping(wcs,AST__BASE,AST__CURRENT); // Combine the 2D and 1D base Frames into a 3D CmpFrame // Likewise, combine the 2D and 1D current Frames into a 3D CmpFrame AstCmpFrame* cmpwcsbase = astCmpFrame(wcsbase,zbase,""); AstCmpFrame* cmpwcscurr = astCmpFrame(wcscurr,zcurr,""); // Combine the 2D and 1D Mappings into a 3D CmpMap AstCmpMap* cmpwcsmap = astCmpMap(wcsmap,zmap,0,""); // Construct the 3D FrameSet from the new 3D Frames and Mapping frameSet = astFrameSet(cmpwcsbase,""); astAddFrame(frameSet, AST__CURRENT, cmpwcsmap, cmpwcscurr); } } if (!frameSet) return 0; astSet(frameSet,"Title=%s", " "); // create astPlot float gbox[6]; double pbox[6]; // params is a BBOX in DATA coords 0-n Vector3d ll = Vector3d(params->xmin,params->ymin,zparams->zmin); Vector3d ur = Vector3d(params->xmax,params->ymax,zparams->zmax); pbox[0] = gbox[0] = ll[0]; pbox[1] = gbox[1] = ll[1]; pbox[2] = gbox[2] = ll[2]; pbox[3] = gbox[3] = ur[0]; pbox[4] = gbox[4] = ur[1]; pbox[5] = gbox[5] = ur[2]; // and now create astGrid astGrid3dPtr = this; renderMode_ = rm; plot = astPlot3D(frameSet, gbox, pbox, option_); // astShow(plot); astGrid(plot); astEnd; // now, clean up memory astGrid3dPtr =NULL; return 1; } void* Grid3d::matrixMap(Matrix& mx, const char* str) { double ss[] = {mx.matrix(0,0),mx.matrix(1,0), mx.matrix(0,1),mx.matrix(1,1)}; AstMatrixMap* mm; if (!(mm= astMatrixMap(2,2,0,ss,""))) return NULL; double tt[] = {mx.matrix(2,0),mx.matrix(2,1)}; AstShiftMap* sm; if (!(sm = astShiftMap(2,tt,""))) return NULL; AstCmpMap* mapxy; if (!(mapxy = astCmpMap(mm,sm,1,""))) return NULL; AstFrame* in = astFrame(3,"Domain=REF"); AstFrame* out = astFrame(3,str); double uu =.5; AstShiftMap* mapz = astShiftMap(1,&uu,""); AstCmpMap* cmap = astCmpMap(mapxy,mapz,0,""); AstFrameSet* frameSet = astFrameSet(in,""); astAddFrame(frameSet,AST__CURRENT,cmap,out); return frameSet; } saods9/tksao1.0/frame/grid3d.h000644 000765 000000 00000001414 12544546070 016352 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __grid3d_h__ #define __grid3d_h__ #include "grid.h" #include "grid3dbase.h" #include "coord.h" class Grid3d : public Grid, public Grid3dBase { private: void* matrixMap(Matrix&, const char*); int doit(RenderMode); public: Grid3d(Widget*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, GridType, const char*, const char*); ~Grid3d(); const char* option() {return GridBase::option();} void x11() {doit(X11);} void ps(int mode) {mode_=mode; doit(PS);} #ifdef MAC_OSX_TK void macosx() {doit(MACOSX);} #endif #ifdef __WIN32 void win32() {doit(GWIN32);} #endif }; #endif saods9/tksao1.0/frame/inversescale.C000644 000765 000000 00000010045 12464214757 017621 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "inversescale.h" #include "framebase.h" #include "colorscale.h" InverseScale::InverseScale(int ss) : size_(ss) { level_ = new double[size_]; for (int ii=0; iivv) break; jj++; } double aa = double(jj)/histsize; level_[ii] = aa*dd +low; } } } IISInverseScale::IISInverseScale(int ss, double low, double high, Vector& iisz) : InverseScale(ss) { if (size_==1) { level_[0] = high; return; } double dd = high-low; for (int ii=0; ii IISMAX) level_[ii] = iisz[1]; else level_[ii] = ((vv-1) * (iisz[1]-iisz[0]))/(IISMAX-1) + iisz[0]; } } saods9/tksao1.0/frame/inversescale.h000644 000765 000000 00000003043 12464214757 017666 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __inversescale_h__ #define __inversescale_h__ #include using namespace std; #include "vector.h" class InverseScale { protected: double* level_; int size_; public: InverseScale(int); InverseScale(int, double*); virtual ~InverseScale(); int size() {return size_;} double* level() {return level_;} double level(int ii) {return level_[ii];} friend ostream& operator<<(ostream&, const InverseScale&); }; class LinearInverseScale : public InverseScale { public: LinearInverseScale(int, double, double); }; class LogInverseScale : public InverseScale { public: LogInverseScale(int, double, double, double); }; class PowInverseScale : public InverseScale { public: PowInverseScale(int, double, double, double); }; class SqrtInverseScale : public InverseScale { public: SqrtInverseScale(int, double, double); }; class SquaredInverseScale : public InverseScale { public: SquaredInverseScale(int, double, double); }; class AsinhInverseScale : public InverseScale { public: AsinhInverseScale(int, double, double); }; class SinhInverseScale : public InverseScale { public: SinhInverseScale(int, double, double); }; class HistEquInverseScale : public InverseScale { public: HistEquInverseScale(int, double, double, double*, int); }; class IISInverseScale : public InverseScale { public: IISInverseScale(int, double, double, Vector&); }; #endif saods9/tksao1.0/frame/lex.C000644 000765 000000 00000377202 12553253015 015726 0ustar00joyewheel000000 000000 #line 2 "frame/lex.C" #line 4 "frame/lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer frFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *fralloc (yy_size_t ); void *frrealloc (void *,yy_size_t ); void frfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 353 #define YY_END_OF_BUFFER 354 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[1269] = { 0, 0, 0, 354, 352, 351, 353, 352, 352, 352, 352, 352, 333, 333, 333, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 351, 350, 0, 350, 347, 0, 350, 348, 350, 333, 335, 334, 333, 350, 337, 350, 350, 350, 273, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 30, 350, 350, 350, 350, 350, 43, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 128, 350, 350, 350, 350, 350, 142, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 190, 350, 350, 350, 350, 197, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 277, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 328, 350, 350, 350, 350, 0, 350, 349, 347, 348, 335, 334, 339, 338, 350, 337, 350, 350, 350, 334, 350, 336, 350, 2, 350, 6, 7, 350, 350, 350, 350, 350, 350, 350, 350, 18, 350, 20, 350, 350, 350, 350, 350, 350, 350, 350, 31, 33, 350, 350, 350, 37, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 78, 350, 350, 350, 350, 350, 350, 350, 350, 350, 92, 93, 350, 350, 350, 350, 99, 350, 350, 350, 350, 350, 105, 350, 350, 350, 110, 350, 114, 116, 350, 350, 350, 350, 350, 350, 123, 350, 350, 350, 350, 130, 350, 350, 350, 350, 350, 350, 350, 350, 143, 350, 350, 350, 350, 350, 350, 350, 153, 350, 350, 350, 350, 350, 350, 350, 350, 165, 166, 350, 350, 170, 350, 350, 350, 350, 350, 350, 177, 350, 350, 350, 350, 350, 350, 185, 350, 350, 188, 350, 350, 192, 350, 350, 350, 196, 350, 350, 350, 201, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 216, 350, 350, 350, 350, 350, 350, 350, 350, 350, 231, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 245, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 265, 350, 350, 350, 269, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 289, 350, 350, 350, 350, 296, 350, 350, 350, 327, 329, 350, 350, 350, 349, 340, 350, 335, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 19, 350, 22, 350, 350, 25, 27, 28, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 51, 350, 350, 54, 79, 350, 60, 350, 350, 350, 350, 350, 69, 350, 350, 350, 71, 350, 76, 350, 80, 82, 350, 350, 350, 350, 350, 350, 350, 350, 98, 350, 350, 100, 350, 350, 350, 350, 350, 350, 108, 350, 111, 350, 350, 117, 350, 119, 350, 350, 350, 350, 350, 126, 127, 350, 131, 350, 350, 135, 136, 350, 350, 141, 350, 350, 146, 147, 350, 150, 350, 350, 350, 350, 350, 350, 160, 162, 350, 163, 350, 350, 350, 171, 173, 350, 350, 350, 350, 178, 180, 350, 350, 183, 184, 350, 350, 189, 191, 193, 350, 350, 198, 350, 350, 350, 350, 350, 350, 206, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 221, 350, 350, 350, 350, 350, 350, 350, 350, 232, 350, 350, 350, 350, 350, 238, 350, 240, 350, 350, 350, 350, 350, 350, 350, 350, 350, 251, 252, 253, 350, 350, 350, 350, 350, 260, 350, 350, 350, 350, 350, 350, 350, 271, 350, 350, 350, 350, 350, 280, 281, 282, 350, 350, 350, 350, 287, 350, 350, 350, 350, 290, 295, 323, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 350, 350, 350, 330, 332, 350, 350, 341, 350, 350, 350, 350, 1, 5, 3, 350, 350, 10, 350, 350, 350, 350, 15, 16, 17, 350, 350, 24, 350, 29, 350, 350, 35, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 53, 55, 350, 350, 350, 350, 350, 350, 350, 350, 70, 350, 350, 72, 350, 350, 350, 350, 85, 350, 350, 350, 89, 350, 350, 350, 350, 350, 350, 350, 350, 104, 350, 107, 350, 112, 113, 350, 118, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 144, 350, 350, 350, 350, 152, 350, 155, 350, 157, 350, 350, 164, 350, 350, 350, 169, 350, 350, 350, 350, 350, 350, 350, 187, 350, 350, 350, 350, 202, 350, 350, 205, 207, 350, 209, 350, 350, 212, 350, 350, 350, 217, 350, 350, 350, 223, 350, 350, 350, 350, 350, 229, 350, 350, 234, 350, 350, 350, 239, 350, 242, 350, 350, 350, 247, 350, 249, 250, 254, 255, 350, 350, 350, 350, 350, 263, 350, 350, 350, 268, 350, 275, 350, 350, 350, 350, 350, 350, 350, 350, 350, 288, 350, 350, 350, 350, 324, 325, 326, 350, 342, 341, 350, 350, 345, 350, 350, 343, 350, 350, 350, 350, 12, 13, 14, 350, 350, 350, 350, 34, 36, 350, 39, 350, 41, 42, 350, 45, 350, 350, 48, 350, 350, 52, 350, 350, 350, 61, 350, 350, 350, 350, 350, 350, 350, 73, 74, 350, 77, 350, 350, 350, 350, 350, 88, 350, 350, 350, 350, 350, 101, 350, 350, 106, 109, 350, 350, 350, 350, 124, 350, 129, 132, 133, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 156, 161, 158, 167, 350, 172, 350, 175, 176, 350, 181, 182, 186, 194, 195, 199, 200, 203, 204, 350, 210, 211, 350, 350, 350, 350, 350, 350, 350, 224, 225, 226, 350, 350, 350, 233, 235, 350, 237, 350, 350, 244, 350, 248, 256, 257, 259, 350, 350, 264, 350, 267, 350, 350, 350, 278, 279, 350, 350, 283, 350, 286, 291, 350, 293, 350, 331, 346, 344, 4, 350, 350, 11, 21, 23, 350, 350, 350, 350, 350, 46, 350, 350, 50, 350, 350, 350, 350, 62, 63, 350, 350, 66, 350, 350, 350, 350, 83, 84, 87, 86, 350, 91, 350, 350, 96, 102, 350, 350, 350, 350, 350, 350, 350, 350, 138, 350, 350, 145, 148, 151, 350, 154, 350, 350, 174, 350, 350, 213, 214, 350, 350, 350, 350, 350, 227, 350, 350, 350, 350, 243, 350, 350, 261, 262, 350, 350, 272, 350, 350, 350, 350, 292, 350, 350, 9, 350, 350, 350, 350, 44, 350, 49, 56, 57, 350, 350, 350, 65, 67, 350, 350, 81, 90, 94, 350, 350, 350, 115, 120, 121, 122, 125, 350, 137, 350, 350, 350, 350, 350, 179, 208, 350, 218, 350, 220, 350, 228, 350, 236, 350, 350, 258, 350, 270, 350, 350, 350, 285, 294, 8, 350, 32, 350, 40, 350, 350, 350, 64, 350, 75, 95, 350, 350, 350, 139, 350, 149, 350, 168, 350, 350, 350, 350, 350, 350, 350, 274, 350, 350, 26, 38, 47, 58, 59, 350, 350, 103, 350, 140, 350, 215, 219, 350, 230, 241, 350, 350, 350, 284, 68, 350, 350, 350, 222, 246, 350, 350, 350, 350, 159, 350, 276, 350, 134, 266, 97, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 4, 4, 4, 4, 6, 4, 4, 4, 7, 4, 8, 9, 4, 10, 11, 12, 13, 14, 15, 16, 16, 16, 17, 18, 4, 4, 4, 4, 4, 4, 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, 4, 4, 4, 4, 4, 4, 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, 4, 72, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[73] = { 0, 1, 1, 1, 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, 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 } ; static yyconst flex_int16_t yy_base[1276] = { 0, 0, 0, 433, 2928, 429, 2928, 0, 72, 77, 75, 83, 92, 69, 90, 141, 201, 250, 94, 295, 345, 146, 97, 390, 418, 96, 196, 295, 194, 300, 436, 83, 350, 483, 534, 91, 143, 243, 136, 103, 96, 364, 383, 0, 375, 391, 0, 371, 385, 0, 594, 603, 662, 702, 121, 611, 619, 636, 644, 742, 676, 141, 150, 244, 184, 253, 188, 361, 376, 237, 202, 209, 210, 354, 298, 232, 262, 0, 381, 288, 382, 304, 309, 0, 426, 395, 357, 438, 393, 336, 763, 415, 438, 479, 430, 809, 446, 353, 440, 452, 489, 489, 531, 468, 489, 485, 533, 531, 67, 524, 525, 532, 535, 521, 533, 675, 0, 605, 676, 723, 535, 536, 0, 538, 619, 760, 621, 618, 358, 627, 661, 665, 709, 758, 853, 645, 710, 681, 778, 839, 770, 795, 665, 673, 715, 725, 748, 742, 755, 843, 778, 813, 789, 799, 858, 875, 815, 827, 844, 885, 847, 885, 838, 898, 908, 912, 939, 907, 856, 929, 935, 939, 860, 901, 956, 889, 969, 960, 970, 974, 940, 909, 981, 925, 960, 991, 1003, 970, 974, 975, 980, 1009, 992, 0, 989, 1011, 1002, 1021, 269, 1057, 0, 2928, 2928, 1120, 1040, 0, 0, 1067, 0, 1080, 1093, 723, 1101, 1147, 0, 1004, 0, 1020, 1013, 0, 1043, 1070, 1071, 1080, 1097, 1091, 1106, 1089, 0, 1090, 0, 1104, 1104, 1113, 324, 1124, 1132, 1129, 1145, 1150, 0, 1140, 1154, 1154, 1164, 1145, 1156, 1154, 1146, 1168, 1165, 1151, 1158, 1158, 1171, 1174, 1160, 1166, 1189, 1174, 1169, 1187, 1181, 1193, 1195, 1210, 1198, 1207, 1199, 0, 1211, 1219, 1200, 1221, 1205, 1219, 1205, 1221, 1214, 0, 0, 1219, 1209, 1217, 1232, 0, 1233, 1242, 1248, 1257, 1240, 0, 1240, 1242, 1257, 1244, 1259, 330, 0, 1246, 1255, 1258, 1268, 1271, 1254, 0, 1272, 1277, 1271, 1274, 0, 1275, 1273, 1272, 1286, 1286, 1288, 1300, 1291, 0, 1304, 1300, 1298, 1309, 1309, 1298, 284, 1298, 1317, 1316, 1319, 1320, 1306, 1307, 1325, 1329, 0, 0, 1316, 1318, 0, 1322, 1332, 1342, 1327, 1346, 1347, 0, 1345, 1357, 1362, 1355, 1360, 1361, 0, 1358, 1363, 0, 1350, 1368, 0, 1370, 1373, 1371, 0, 1352, 1369, 1374, 1381, 1362, 1362, 1377, 1364, 1378, 1393, 1386, 1398, 1388, 1394, 0, 1396, 1402, 1409, 1405, 1400, 1411, 1413, 1414, 1432, 0, 1407, 1428, 1425, 1415, 1440, 1430, 1450, 1445, 1442, 1452, 1461, 0, 1466, 1452, 1463, 1462, 1449, 1466, 1472, 1475, 1478, 1465, 1470, 1464, 1463, 1484, 1486, 1469, 0, 1494, 1481, 1490, 0, 1494, 1492, 1511, 1511, 1510, 1510, 1505, 1515, 1516, 1507, 1514, 1509, 1521, 1528, 1512, 1510, 0, 1512, 1514, 1512, 1521, 1578, 1630, 1614, 279, 0, 0, 1611, 1623, 1636, 2928, 0, 1646, 1654, 1673, 1682, 1691, 1671, 1678, 1690, 1685, 1670, 1691, 1685, 1684, 1690, 1695, 1676, 1679, 1695, 0, 1703, 0, 1684, 228, 1699, 0, 0, 1693, 1694, 1700, 1699, 1706, 1698, 1738, 1710, 1710, 1714, 1742, 1732, 1726, 1741, 1734, 0, 1737, 1732, 0, 0, 1733, 0, 1739, 1752, 1765, 1740, 1752, 0, 1740, 1757, 1742, 0, 1744, 0, 1749, 1755, 1778, 1761, 1774, 1791, 1778, 1791, 1797, 1786, 1786, 0, 1802, 1788, 0, 1801, 1795, 1788, 1805, 1796, 1807, 0, 1808, 1789, 1811, 1802, 0, 1798, 0, 1799, 1817, 1813, 1834, 1835, 0, 0, 1835, 1843, 1841, 1835, 0, 1839, 1847, 1827, 0, 1849, 1834, 0, 0, 1849, 1844, 1858, 226, 1845, 1851, 1844, 1853, 1865, 0, 1855, 0, 1856, 1851, 1862, 1867, 0, 1876, 1886, 1880, 1898, 1891, 0, 1892, 1887, 0, 0, 1881, 1885, 0, 0, 0, 1900, 1903, 0, 1892, 1894, 1908, 1906, 1907, 1909, 0, 1900, 1907, 1905, 123, 1898, 1912, 1901, 1917, 1903, 1919, 1931, 0, 1930, 1922, 1950, 1937, 1952, 1941, 1935, 1944, 0, 1937, 1940, 1947, 1947, 1947, 0, 1958, 0, 1950, 1961, 1962, 1965, 1962, 1965, 1967, 1954, 1971, 0, 0, 0, 1971, 1972, 1971, 1994, 2000, 0, 1986, 1987, 1987, 1989, 2004, 2005, 1999, 0, 2001, 2020, 2003, 2015, 1999, 0, 0, 0, 2012, 2019, 2010, 2003, 0, 2019, 2011, 2018, 2046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 2020, 174, 0, 0, 2028, 2064, 2076, 2090, 2099, 2107, 2154, 0, 0, 2100, 2102, 2090, 0, 2089, 2107, 2098, 2110, 0, 0, 0, 2107, 2095, 0, 2098, 0, 2113, 2104, 0, 2111, 2116, 2113, 2114, 2158, 2142, 2160, 2143, 2148, 2144, 2147, 2151, 2162, 2163, 0, 2182, 2156, 2157, 2153, 2155, 2171, 2156, 2177, 2170, 0, 2179, 2176, 2174, 2165, 2202, 2203, 2208, 0, 2202, 2210, 2211, 0, 2197, 2204, 2199, 2200, 2203, 2222, 2209, 2210, 0, 2208, 0, 2210, 0, 0, 2214, 0, 2221, 2211, 2223, 2221, 2225, 2230, 2218, 2227, 2248, 2254, 2247, 2258, 2251, 0, 2263, 2263, 2260, 2250, 0, 2253, 0, 2264, 0, 2256, 2270, 0, 2252, 2271, 2260, 0, 2273, 2277, 2258, 2269, 2281, 2271, 2281, 0, 2269, 2268, 2285, 2285, 0, 2297, 2298, 0, 0, 2314, 0, 2314, 2315, 2315, 2306, 2319, 2305, 0, 2321, 2308, 2324, 0, 2316, 2310, 2316, 2329, 2317, 0, 2313, 2330, 0, 2331, 2336, 2331, 0, 2319, 0, 2326, 2331, 2352, 0, 2363, 0, 0, 0, 0, 2360, 2349, 2365, 2366, 2367, 0, 2354, 2367, 2362, 0, 2375, 0, 2374, 2371, 2375, 2361, 2366, 2376, 2381, 2381, 2382, 0, 2370, 2374, 2366, 2388, 0, 0, 0, 2387, 2127, 2427, 2435, 2443, 0, 2451, 2479, 0, 2427, 2446, 2447, 2438, 0, 0, 0, 2453, 2451, 2445, 2452, 0, 0, 2442, 0, 2461, 0, 0, 2462, 0, 2459, 2449, 0, 2459, 2457, 0, 2496, 2498, 2497, 0, 2497, 2483, 2494, 2485, 2487, 2487, 2493, 0, 0, 2507, 0, 2490, 2496, 2508, 2492, 2495, 0, 2500, 2512, 2508, 2509, 2514, 0, 2506, 2503, 0, 0, 156, 2507, 2540, 2549, 0, 2548, 0, 0, 0, 2549, 2533, 2533, 2537, 2542, 2552, 2540, 2545, 2551, 2557, 0, 0, 2557, 0, 2554, 0, 2559, 0, 0, 2562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2565, 0, 0, 2549, 2554, 2551, 2548, 2551, 2552, 2572, 0, 0, 0, 2569, 2589, 2582, 0, 0, 2596, 0, 2595, 2585, 0, 2587, 0, 0, 2600, 0, 2604, 2605, 0, 2609, 0, 2591, 2593, 2598, 0, 0, 2613, 2603, 0, 2613, 0, 0, 2603, 0, 2617, 0, 0, 0, 0, 2614, 2601, 0, 0, 0, 2600, 2621, 2611, 2612, 2614, 0, 2617, 2649, 0, 2636, 2639, 2655, 2656, 0, 0, 2638, 2640, 0, 2640, 2660, 2653, 2643, 0, 0, 0, 0, 2646, 0, 2662, 2651, 2666, 0, 2659, 2664, 2656, 2668, 2658, 2654, 2662, 2670, 0, 2675, 2657, 0, 0, 0, 2663, 0, 2691, 2701, 0, 2689, 2696, 0, 0, 2700, 2705, 2702, 2687, 2693, 0, 2709, 2706, 2711, 2711, 0, 2709, 2693, 0, 0, 2708, 2716, 0, 2710, 2705, 2715, 2705, 0, 2714, 2709, 0, 2714, 2715, 2709, 2752, 0, 2757, 0, 0, 0, 2747, 2757, 2756, 0, 0, 2742, 2745, 0, 0, 0, 2750, 2751, 2765, 0, 0, 0, 0, 0, 2758, 0, 2755, 2768, 2756, 2767, 2754, 0, 0, 2757, 0, 2759, 0, 2766, 0, 2761, 0, 2768, 2765, 0, 2778, 0, 2776, 2776, 2762, 0, 0, 0, 2805, 0, 2791, 0, 2799, 2807, 2808, 0, 2809, 0, 0, 2801, 2804, 2801, 0, 2806, 0, 2810, 0, 2800, 2807, 2807, 2809, 2821, 2824, 2823, 0, 2813, 2823, 0, 0, 0, 0, 0, 2810, 2809, 0, 2811, 0, 2831, 0, 0, 2819, 0, 0, 2822, 2841, 2859, 0, 0, 2851, 2855, 2851, 0, 0, 2857, 2842, 2847, 2866, 0, 2867, 0, 2852, 0, 0, 0, 2928, 74, 2915, 2917, 2919, 2921, 2923, 2925 } ; static yyconst flex_int16_t yy_def[1276] = { 0, 1268, 1, 1268, 1268, 1268, 1268, 1269, 1270, 1271, 1269, 1269, 1269, 12, 12, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1272, 1268, 1269, 1273, 1270, 1269, 1274, 1271, 1269, 1269, 12, 1269, 1269, 12, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1275, 1272, 1269, 1268, 1268, 1269, 203, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 59, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1268, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1268, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 0, 1268, 1268, 1268, 1268, 1268, 1268, 1268 } ; static yyconst flex_int16_t yy_nxt[3001] = { 0, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 13, 13, 13, 13, 7, 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, 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, 7, 44, 44, 44, 43, 46, 47, 47, 47, 297, 298, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 53, 54, 54, 54, 54, 54, 54, 54, 54, 55, 43, 60, 94, 56, 57, 117, 95, 58, 129, 118, 96, 157, 182, 119, 183, 194, 195, 184, 196, 120, 97, 43, 197, 59, 842, 843, 43, 60, 94, 56, 57, 117, 95, 58, 129, 118, 96, 157, 182, 119, 183, 194, 195, 184, 196, 120, 97, 43, 197, 59, 61, 185, 43, 1099, 112, 186, 192, 62, 113, 187, 63, 64, 65, 215, 66, 114, 67, 68, 193, 69, 70, 115, 71, 216, 72, 905, 61, 185, 43, 116, 112, 186, 192, 62, 113, 187, 63, 64, 65, 215, 66, 114, 67, 68, 193, 69, 70, 115, 71, 216, 72, 73, 139, 903, 130, 116, 140, 220, 131, 74, 75, 224, 132, 76, 231, 77, 141, 78, 133, 142, 79, 232, 143, 80, 81, 811, 233, 734, 139, 82, 130, 83, 140, 220, 131, 74, 75, 224, 132, 76, 231, 77, 141, 78, 133, 142, 79, 232, 143, 80, 81, 188, 233, 189, 237, 82, 190, 83, 84, 191, 217, 221, 85, 218, 229, 86, 87, 222, 230, 88, 89, 219, 90, 91, 223, 92, 238, 188, 93, 189, 237, 709, 190, 567, 84, 191, 217, 221, 85, 218, 229, 86, 87, 222, 230, 88, 89, 219, 90, 91, 223, 92, 238, 134, 93, 98, 99, 135, 235, 144, 242, 136, 245, 145, 100, 137, 101, 138, 102, 103, 104, 146, 246, 147, 236, 148, 105, 540, 477, 134, 453, 98, 99, 135, 235, 144, 242, 136, 245, 145, 100, 137, 101, 138, 102, 103, 104, 146, 246, 147, 236, 148, 105, 106, 198, 198, 198, 326, 158, 280, 234, 107, 159, 108, 160, 252, 202, 109, 257, 201, 110, 225, 161, 111, 42, 47, 47, 47, 162, 106, 49, 44, 44, 44, 158, 46, 226, 107, 159, 108, 160, 252, 227, 109, 257, 239, 110, 225, 161, 111, 121, 122, 240, 228, 162, 255, 123, 243, 241, 256, 124, 125, 226, 244, 250, 126, 251, 127, 227, 128, 42, 239, 1268, 264, 1268, 200, 121, 122, 240, 228, 1268, 255, 123, 243, 241, 256, 124, 125, 1268, 244, 250, 126, 251, 127, 149, 247, 253, 248, 150, 264, 265, 151, 152, 249, 278, 153, 270, 271, 154, 281, 266, 155, 1268, 254, 156, 1268, 279, 1268, 282, 1268, 149, 247, 253, 248, 150, 1268, 265, 151, 152, 249, 278, 153, 270, 271, 154, 281, 266, 155, 267, 254, 156, 163, 279, 164, 282, 165, 289, 290, 166, 167, 285, 283, 168, 169, 268, 170, 269, 171, 284, 172, 173, 174, 291, 1268, 267, 175, 1268, 163, 286, 164, 1268, 165, 289, 290, 166, 167, 285, 283, 168, 169, 268, 170, 269, 171, 284, 172, 173, 174, 291, 287, 1268, 175, 176, 292, 286, 299, 177, 300, 305, 178, 294, 301, 293, 302, 303, 306, 179, 288, 295, 180, 317, 318, 296, 304, 319, 287, 181, 1268, 176, 292, 1268, 299, 177, 300, 305, 178, 294, 301, 293, 302, 303, 306, 179, 288, 295, 180, 317, 318, 296, 304, 319, 1268, 181, 203, 203, 203, 203, 203, 203, 203, 203, 204, 51, 51, 51, 51, 51, 51, 51, 51, 209, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 210, 210, 210, 309, 320, 205, 324, 325, 310, 211, 211, 43, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 1268, 309, 320, 205, 324, 325, 310, 1268, 327, 43, 52, 52, 52, 52, 52, 52, 52, 52, 1268, 328, 344, 345, 206, 207, 210, 210, 210, 210, 210, 210, 210, 210, 307, 311, 327, 329, 1268, 1268, 348, 361, 308, 312, 362, 330, 313, 328, 344, 345, 206, 207, 52, 52, 52, 52, 52, 52, 52, 52, 307, 311, 1268, 329, 208, 57, 348, 361, 308, 312, 362, 330, 313, 212, 212, 212, 212, 212, 212, 212, 212, 331, 346, 363, 347, 314, 332, 333, 315, 364, 208, 57, 214, 214, 214, 214, 214, 214, 214, 214, 316, 214, 214, 214, 214, 214, 214, 331, 346, 363, 347, 314, 332, 333, 315, 364, 1268, 334, 365, 335, 366, 321, 367, 336, 322, 1268, 316, 214, 214, 214, 214, 214, 214, 258, 259, 260, 261, 262, 323, 337, 349, 1268, 263, 334, 365, 335, 366, 321, 367, 336, 322, 357, 358, 1268, 371, 350, 351, 1268, 352, 258, 259, 260, 261, 262, 323, 337, 349, 359, 263, 272, 1268, 374, 375, 273, 274, 383, 360, 357, 358, 275, 371, 350, 351, 276, 352, 1268, 372, 277, 1268, 1268, 384, 1268, 1268, 359, 1268, 272, 373, 374, 375, 273, 274, 383, 360, 1268, 1268, 275, 385, 389, 392, 276, 353, 354, 372, 277, 338, 368, 384, 355, 339, 369, 370, 356, 373, 409, 1268, 376, 416, 340, 377, 341, 342, 343, 385, 389, 392, 378, 353, 354, 380, 379, 338, 368, 381, 355, 339, 369, 370, 356, 382, 409, 386, 376, 416, 340, 377, 341, 342, 343, 390, 387, 417, 378, 388, 391, 380, 379, 420, 396, 381, 393, 1268, 394, 1268, 1268, 382, 397, 386, 399, 395, 407, 1268, 398, 400, 431, 390, 387, 417, 436, 388, 391, 401, 408, 420, 396, 402, 393, 412, 394, 403, 429, 410, 397, 411, 399, 395, 407, 404, 398, 400, 431, 405, 1268, 406, 436, 413, 414, 401, 408, 415, 430, 402, 1268, 412, 437, 403, 429, 410, 418, 411, 421, 419, 423, 404, 442, 422, 1268, 405, 425, 406, 427, 413, 414, 424, 432, 415, 430, 426, 433, 428, 437, 443, 434, 444, 418, 445, 421, 419, 423, 435, 442, 422, 438, 448, 425, 440, 427, 449, 439, 424, 432, 450, 446, 426, 433, 428, 451, 443, 434, 444, 441, 445, 447, 452, 460, 435, 461, 462, 438, 448, 1268, 440, 1268, 449, 439, 1268, 1268, 450, 446, 198, 198, 198, 451, 208, 57, 1268, 441, 1268, 447, 452, 460, 1268, 461, 462, 463, 455, 455, 205, 456, 456, 456, 456, 456, 456, 456, 456, 1268, 1268, 1268, 208, 57, 209, 209, 209, 209, 209, 209, 209, 209, 457, 463, 464, 465, 205, 210, 210, 210, 210, 210, 210, 210, 210, 212, 212, 212, 212, 212, 212, 212, 212, 466, 467, 472, 468, 473, 458, 470, 464, 465, 469, 200, 203, 203, 203, 203, 203, 203, 203, 203, 1268, 471, 474, 475, 206, 207, 476, 466, 467, 472, 468, 473, 458, 470, 1268, 478, 469, 479, 454, 213, 213, 213, 213, 213, 213, 213, 213, 471, 474, 475, 206, 207, 476, 480, 481, 482, 483, 484, 485, 488, 459, 478, 489, 479, 454, 486, 490, 487, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 1268, 480, 481, 482, 483, 484, 485, 488, 459, 504, 489, 506, 505, 486, 490, 487, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 507, 508, 509, 502, 510, 503, 511, 514, 504, 512, 506, 505, 513, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 501, 507, 508, 509, 502, 510, 503, 511, 514, 527, 512, 528, 529, 513, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 530, 531, 532, 533, 534, 535, 536, 538, 539, 527, 541, 528, 529, 542, 543, 544, 545, 546, 547, 550, 1268, 537, 551, 552, 553, 554, 530, 531, 532, 533, 534, 535, 536, 538, 539, 555, 541, 548, 556, 542, 543, 544, 545, 546, 547, 550, 549, 537, 551, 552, 553, 554, 557, 558, 559, 560, 561, 563, 564, 565, 566, 555, 562, 548, 556, 568, 569, 570, 571, 572, 573, 574, 549, 575, 576, 577, 578, 579, 557, 558, 559, 560, 561, 563, 564, 565, 566, 580, 562, 581, 582, 568, 569, 570, 571, 572, 573, 574, 583, 575, 576, 577, 578, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 580, 593, 581, 582, 594, 595, 596, 597, 598, 599, 600, 583, 603, 604, 605, 606, 601, 584, 585, 586, 587, 588, 589, 590, 591, 592, 602, 593, 607, 608, 594, 595, 596, 597, 598, 599, 600, 609, 603, 604, 605, 606, 601, 610, 611, 612, 613, 614, 618, 619, 615, 620, 602, 621, 607, 608, 616, 622, 626, 617, 627, 628, 629, 609, 623, 1268, 632, 1268, 624, 610, 611, 612, 613, 614, 618, 619, 615, 620, 625, 621, 630, 635, 616, 622, 626, 617, 627, 628, 629, 636, 623, 631, 632, 633, 624, 634, 637, 638, 639, 640, 642, 641, 643, 644, 625, 645, 630, 635, 646, 647, 648, 649, 650, 651, 652, 636, 653, 631, 654, 633, 655, 634, 637, 638, 639, 640, 642, 641, 643, 644, 656, 645, 657, 658, 646, 647, 648, 649, 650, 651, 652, 659, 653, 660, 654, 661, 655, 662, 663, 664, 665, 666, 667, 668, 669, 670, 656, 671, 657, 658, 672, 673, 674, 675, 676, 677, 678, 659, 679, 660, 1268, 661, 1268, 662, 663, 664, 665, 666, 667, 668, 669, 670, 1268, 671, 1268, 1268, 672, 673, 674, 675, 676, 677, 678, 1268, 679, 43, 43, 43, 43, 43, 43, 680, 43, 43, 43, 43, 43, 43, 43, 43, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 43, 43, 707, 708, 710, 711, 712, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 1268, 1268, 1268, 1268, 1268, 707, 708, 710, 711, 712, 713, 714, 714, 714, 714, 714, 714, 714, 714, 715, 716, 716, 716, 716, 716, 716, 716, 716, 717, 718, 718, 718, 718, 718, 718, 718, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 735, 736, 737, 738, 739, 740, 741, 1268, 744, 745, 746, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 735, 736, 737, 738, 739, 740, 741, 742, 744, 745, 746, 747, 748, 749, 750, 743, 752, 753, 754, 755, 756, 757, 1268, 761, 763, 1268, 762, 751, 764, 765, 766, 767, 768, 742, 758, 769, 772, 747, 748, 749, 750, 743, 752, 753, 754, 755, 756, 757, 759, 761, 763, 760, 762, 751, 764, 765, 766, 767, 768, 770, 758, 769, 772, 773, 774, 771, 775, 776, 777, 778, 779, 780, 781, 782, 759, 783, 784, 760, 785, 786, 787, 788, 789, 790, 791, 770, 792, 793, 794, 773, 774, 771, 775, 776, 777, 778, 779, 780, 781, 782, 795, 783, 784, 796, 785, 786, 787, 788, 789, 790, 791, 797, 792, 793, 794, 798, 799, 800, 801, 802, 803, 805, 806, 807, 808, 809, 795, 810, 812, 796, 804, 813, 814, 815, 816, 817, 818, 797, 819, 820, 821, 798, 799, 800, 801, 802, 803, 805, 806, 807, 808, 809, 822, 810, 812, 823, 804, 813, 814, 815, 816, 817, 818, 824, 819, 820, 821, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 822, 836, 837, 823, 838, 839, 840, 841, 844, 845, 846, 824, 847, 848, 849, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 850, 836, 837, 851, 838, 839, 840, 841, 844, 845, 846, 852, 847, 848, 849, 853, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 850, 865, 866, 851, 867, 868, 869, 870, 871, 854, 872, 852, 873, 874, 875, 853, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 876, 865, 866, 877, 867, 868, 869, 870, 871, 854, 872, 878, 873, 874, 875, 879, 880, 881, 882, 884, 883, 885, 886, 887, 888, 1268, 876, 891, 892, 877, 893, 894, 895, 889, 896, 897, 898, 878, 899, 900, 904, 879, 880, 881, 882, 884, 883, 885, 886, 887, 888, 890, 906, 891, 892, 1268, 893, 894, 895, 889, 896, 897, 898, 901, 899, 900, 904, 902, 907, 907, 907, 907, 907, 907, 907, 907, 1268, 890, 906, 908, 714, 714, 714, 714, 714, 714, 714, 714, 1268, 901, 1268, 1268, 1268, 902, 909, 909, 909, 909, 909, 909, 909, 909, 910, 716, 716, 716, 716, 716, 716, 716, 716, 912, 912, 912, 912, 912, 912, 912, 912, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 911, 907, 907, 907, 907, 907, 907, 907, 907, 1268, 926, 927, 928, 929, 930, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 911, 913, 718, 718, 718, 718, 718, 718, 718, 718, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 1268, 944, 945, 946, 914, 947, 1268, 948, 949, 950, 951, 952, 953, 954, 955, 941, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 942, 944, 945, 946, 914, 947, 943, 948, 949, 950, 951, 952, 953, 954, 955, 941, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 942, 966, 967, 968, 969, 970, 943, 971, 972, 973, 974, 975, 976, 977, 978, 979, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 980, 966, 967, 968, 969, 970, 981, 971, 972, 973, 974, 975, 976, 977, 978, 979, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 980, 992, 993, 994, 995, 996, 981, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 1006, 992, 993, 994, 995, 996, 1007, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1006, 1018, 1019, 1020, 1021, 1022, 1007, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1032, 1018, 1019, 1020, 1021, 1022, 1033, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1032, 1044, 1045, 1046, 1047, 1048, 1033, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1268, 1044, 1045, 1046, 1047, 1048, 1268, 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 907, 907, 907, 907, 907, 907, 907, 907, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 912, 912, 912, 912, 912, 912, 912, 912, 1268, 1268, 1060, 1058, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 911, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1059, 912, 912, 912, 912, 912, 912, 912, 912, 1060, 1058, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 911, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1059, 1075, 914, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1078, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1100, 1075, 914, 1076, 1077, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1078, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1127, 1128, 1129, 1130, 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267, 45, 45, 48, 48, 199, 199, 44, 44, 47, 47, 198, 198, 3, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268 } ; static yyconst flex_int16_t yy_chk[3001] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 1269, 8, 9, 9, 9, 108, 108, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 18, 12, 12, 22, 18, 12, 25, 22, 18, 31, 35, 22, 35, 39, 40, 35, 40, 22, 18, 14, 40, 12, 609, 609, 13, 14, 18, 12, 12, 22, 18, 12, 25, 22, 18, 31, 35, 22, 35, 39, 40, 35, 40, 22, 18, 14, 40, 12, 15, 36, 54, 972, 21, 36, 38, 15, 21, 36, 15, 15, 15, 61, 15, 21, 15, 15, 38, 15, 15, 21, 15, 62, 15, 709, 15, 36, 54, 21, 21, 36, 38, 15, 21, 36, 15, 15, 15, 61, 15, 21, 15, 15, 38, 15, 15, 21, 15, 62, 15, 16, 28, 707, 26, 21, 28, 64, 26, 16, 16, 66, 26, 16, 70, 16, 28, 16, 26, 28, 16, 71, 28, 16, 16, 567, 72, 477, 28, 16, 26, 16, 28, 64, 26, 16, 16, 66, 26, 16, 70, 16, 28, 16, 26, 28, 16, 71, 28, 16, 16, 37, 72, 37, 75, 16, 37, 16, 17, 37, 63, 65, 17, 63, 69, 17, 17, 65, 69, 17, 17, 63, 17, 17, 65, 17, 76, 37, 17, 37, 75, 447, 37, 326, 17, 37, 63, 65, 17, 63, 69, 17, 17, 65, 69, 17, 17, 63, 17, 17, 65, 17, 76, 27, 17, 19, 19, 27, 74, 29, 79, 27, 81, 29, 19, 27, 19, 27, 19, 19, 19, 29, 82, 29, 74, 29, 19, 297, 234, 27, 198, 19, 19, 27, 74, 29, 79, 27, 81, 29, 19, 27, 19, 27, 19, 19, 19, 29, 82, 29, 74, 29, 19, 20, 41, 41, 41, 128, 32, 97, 73, 20, 32, 20, 32, 86, 47, 20, 89, 44, 20, 67, 32, 20, 42, 48, 48, 48, 32, 20, 48, 45, 45, 45, 32, 45, 67, 20, 32, 20, 32, 86, 68, 20, 89, 78, 20, 67, 32, 20, 23, 23, 78, 68, 32, 88, 23, 80, 78, 88, 23, 23, 67, 80, 85, 23, 85, 23, 68, 24, 5, 78, 3, 91, 0, 41, 23, 23, 78, 68, 0, 88, 23, 80, 78, 88, 23, 23, 0, 80, 85, 23, 85, 23, 30, 84, 87, 84, 30, 91, 92, 30, 30, 84, 96, 30, 94, 94, 30, 98, 92, 30, 0, 87, 30, 0, 96, 0, 99, 0, 30, 84, 87, 84, 30, 0, 92, 30, 30, 84, 96, 30, 94, 94, 30, 98, 92, 30, 93, 87, 30, 33, 96, 33, 99, 33, 103, 104, 33, 33, 101, 100, 33, 33, 93, 33, 93, 33, 100, 33, 33, 33, 105, 0, 93, 33, 0, 33, 101, 33, 0, 33, 103, 104, 33, 33, 101, 100, 33, 33, 93, 33, 93, 33, 100, 33, 33, 33, 105, 102, 0, 33, 34, 106, 101, 109, 34, 110, 113, 34, 107, 111, 106, 111, 112, 114, 34, 102, 107, 34, 120, 121, 107, 112, 123, 102, 34, 0, 34, 106, 0, 109, 34, 110, 113, 34, 107, 111, 106, 111, 112, 114, 34, 102, 107, 34, 120, 121, 107, 112, 123, 0, 34, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 117, 124, 51, 126, 127, 117, 57, 57, 51, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 0, 117, 124, 51, 126, 127, 117, 0, 129, 51, 52, 52, 52, 52, 52, 52, 52, 52, 0, 130, 135, 135, 52, 52, 60, 60, 60, 60, 60, 60, 60, 60, 115, 118, 129, 131, 0, 0, 137, 142, 115, 118, 143, 131, 118, 130, 135, 135, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 115, 118, 0, 131, 53, 53, 137, 142, 115, 118, 143, 131, 118, 211, 211, 211, 211, 211, 211, 211, 211, 132, 136, 144, 136, 119, 132, 132, 119, 145, 53, 53, 59, 59, 59, 59, 59, 59, 59, 59, 119, 59, 59, 59, 59, 59, 59, 132, 136, 144, 136, 119, 132, 132, 119, 145, 0, 133, 146, 133, 147, 125, 148, 133, 125, 0, 119, 59, 59, 59, 59, 59, 59, 90, 90, 90, 90, 90, 125, 133, 138, 0, 90, 133, 146, 133, 147, 125, 148, 133, 125, 140, 140, 0, 150, 138, 138, 0, 138, 90, 90, 90, 90, 90, 125, 133, 138, 141, 90, 95, 0, 152, 153, 95, 95, 156, 141, 140, 140, 95, 150, 138, 138, 95, 138, 0, 151, 95, 0, 0, 157, 0, 0, 141, 0, 95, 151, 152, 153, 95, 95, 156, 141, 0, 0, 95, 158, 160, 162, 95, 139, 139, 151, 95, 134, 149, 157, 139, 134, 149, 149, 139, 151, 168, 0, 154, 172, 134, 154, 134, 134, 134, 158, 160, 162, 154, 139, 139, 155, 154, 134, 149, 155, 139, 134, 149, 149, 139, 155, 168, 159, 154, 172, 134, 154, 134, 134, 134, 161, 159, 173, 154, 159, 161, 155, 154, 175, 164, 155, 163, 0, 163, 0, 0, 155, 164, 159, 165, 163, 167, 0, 164, 165, 181, 161, 159, 173, 183, 159, 161, 165, 167, 175, 164, 165, 163, 170, 163, 166, 180, 169, 164, 169, 165, 163, 167, 166, 164, 165, 181, 166, 0, 166, 183, 170, 171, 165, 167, 171, 180, 165, 0, 170, 184, 166, 180, 169, 174, 169, 176, 174, 177, 166, 187, 176, 0, 166, 178, 166, 179, 170, 171, 177, 182, 171, 180, 178, 182, 179, 184, 188, 182, 189, 174, 190, 176, 174, 177, 182, 187, 176, 185, 192, 178, 186, 179, 194, 185, 177, 182, 195, 191, 178, 182, 179, 196, 188, 182, 189, 186, 190, 191, 197, 215, 182, 217, 218, 185, 192, 0, 186, 0, 194, 185, 0, 0, 195, 191, 199, 199, 199, 196, 204, 204, 0, 186, 0, 191, 197, 215, 0, 217, 218, 220, 207, 207, 204, 207, 207, 207, 207, 207, 207, 207, 207, 0, 0, 0, 204, 204, 209, 209, 209, 209, 209, 209, 209, 209, 209, 220, 221, 222, 204, 210, 210, 210, 210, 210, 210, 210, 210, 212, 212, 212, 212, 212, 212, 212, 212, 223, 224, 227, 225, 229, 210, 226, 221, 222, 225, 199, 203, 203, 203, 203, 203, 203, 203, 203, 0, 226, 231, 232, 203, 203, 233, 223, 224, 227, 225, 229, 210, 226, 0, 235, 225, 236, 203, 213, 213, 213, 213, 213, 213, 213, 213, 226, 231, 232, 203, 203, 233, 237, 238, 239, 241, 242, 243, 245, 213, 235, 246, 236, 203, 244, 247, 244, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 0, 237, 238, 239, 241, 242, 243, 245, 213, 259, 246, 260, 259, 244, 247, 244, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 261, 262, 263, 258, 264, 258, 265, 267, 259, 266, 260, 259, 266, 268, 270, 271, 272, 273, 274, 275, 276, 277, 278, 281, 282, 258, 261, 262, 263, 258, 264, 258, 265, 267, 283, 266, 284, 286, 266, 268, 270, 271, 272, 273, 274, 275, 276, 277, 278, 281, 282, 287, 288, 289, 290, 292, 293, 294, 295, 296, 283, 299, 284, 286, 300, 301, 302, 303, 304, 306, 308, 0, 294, 309, 311, 312, 313, 287, 288, 289, 290, 292, 293, 294, 295, 296, 314, 299, 307, 315, 300, 301, 302, 303, 304, 306, 308, 307, 294, 309, 311, 312, 313, 316, 317, 318, 320, 321, 322, 323, 324, 325, 314, 321, 307, 315, 327, 328, 329, 330, 331, 332, 333, 307, 334, 335, 338, 339, 341, 316, 317, 318, 320, 321, 322, 323, 324, 325, 342, 321, 343, 344, 327, 328, 329, 330, 331, 332, 333, 345, 334, 335, 338, 339, 341, 346, 348, 349, 350, 351, 352, 353, 355, 356, 342, 358, 343, 344, 359, 361, 362, 363, 365, 366, 367, 345, 369, 370, 371, 372, 368, 346, 348, 349, 350, 351, 352, 353, 355, 356, 368, 358, 373, 374, 359, 361, 362, 363, 365, 366, 367, 375, 369, 370, 371, 372, 368, 376, 377, 378, 380, 381, 383, 384, 382, 385, 368, 386, 373, 374, 382, 387, 390, 382, 391, 392, 393, 375, 388, 0, 395, 0, 388, 376, 377, 378, 380, 381, 383, 384, 382, 385, 388, 386, 394, 397, 382, 387, 390, 382, 391, 392, 393, 398, 388, 394, 395, 396, 388, 396, 399, 400, 402, 403, 404, 403, 405, 406, 388, 407, 394, 397, 408, 409, 410, 411, 412, 413, 414, 398, 415, 394, 416, 396, 417, 396, 399, 400, 402, 403, 404, 403, 405, 406, 419, 407, 420, 421, 408, 409, 410, 411, 412, 413, 414, 423, 415, 424, 416, 425, 417, 426, 427, 428, 429, 430, 431, 432, 433, 434, 419, 435, 420, 421, 436, 437, 438, 440, 441, 441, 442, 423, 443, 424, 0, 425, 0, 426, 427, 428, 429, 430, 431, 432, 433, 434, 0, 435, 0, 0, 436, 437, 438, 440, 441, 441, 442, 0, 443, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 445, 446, 450, 451, 452, 455, 455, 455, 455, 455, 455, 455, 455, 456, 456, 456, 456, 456, 456, 456, 456, 0, 0, 0, 0, 0, 445, 446, 450, 451, 452, 457, 457, 457, 457, 457, 457, 457, 457, 457, 458, 458, 458, 458, 458, 458, 458, 458, 458, 459, 459, 459, 459, 459, 459, 459, 459, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 474, 476, 478, 481, 482, 483, 484, 485, 486, 0, 488, 489, 490, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 474, 476, 478, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 487, 495, 497, 498, 501, 503, 504, 0, 506, 507, 0, 506, 494, 509, 510, 511, 513, 515, 487, 505, 516, 518, 491, 492, 493, 494, 487, 495, 497, 498, 501, 503, 504, 505, 506, 507, 505, 506, 494, 509, 510, 511, 513, 515, 517, 505, 516, 518, 519, 520, 517, 521, 522, 523, 524, 525, 527, 528, 530, 505, 531, 532, 505, 533, 534, 535, 537, 538, 539, 540, 517, 542, 544, 545, 519, 520, 517, 521, 522, 523, 524, 525, 527, 528, 530, 546, 531, 532, 547, 533, 534, 535, 537, 538, 539, 540, 548, 542, 544, 545, 551, 552, 553, 554, 556, 557, 558, 560, 561, 564, 565, 546, 566, 568, 547, 557, 569, 570, 571, 572, 574, 576, 548, 577, 578, 579, 551, 552, 553, 554, 556, 557, 558, 560, 561, 564, 565, 581, 566, 568, 582, 557, 569, 570, 571, 572, 574, 576, 583, 577, 578, 579, 584, 585, 587, 588, 591, 592, 596, 597, 599, 600, 601, 581, 602, 603, 582, 604, 606, 607, 608, 610, 611, 612, 583, 613, 614, 615, 584, 585, 587, 588, 591, 592, 596, 597, 599, 600, 601, 616, 602, 603, 618, 604, 606, 607, 608, 610, 611, 612, 619, 613, 614, 615, 620, 621, 622, 623, 624, 625, 627, 628, 629, 630, 631, 616, 633, 635, 618, 636, 637, 638, 639, 640, 620, 641, 619, 642, 643, 647, 620, 621, 622, 623, 624, 625, 627, 628, 629, 630, 631, 648, 633, 635, 649, 636, 637, 638, 639, 640, 620, 641, 650, 642, 643, 647, 651, 653, 654, 655, 656, 655, 657, 658, 659, 661, 0, 648, 663, 664, 649, 665, 669, 670, 662, 671, 672, 674, 650, 675, 676, 708, 651, 653, 654, 655, 656, 655, 657, 658, 659, 661, 662, 712, 663, 664, 0, 665, 669, 670, 662, 671, 672, 674, 677, 675, 676, 708, 677, 713, 713, 713, 713, 713, 713, 713, 713, 0, 662, 712, 714, 714, 714, 714, 714, 714, 714, 714, 714, 0, 677, 0, 0, 0, 677, 715, 715, 715, 715, 715, 715, 715, 715, 716, 716, 716, 716, 716, 716, 716, 716, 716, 717, 717, 717, 717, 717, 717, 717, 717, 721, 722, 723, 725, 726, 727, 728, 732, 733, 735, 737, 716, 907, 907, 907, 907, 907, 907, 907, 907, 0, 738, 740, 741, 742, 743, 721, 722, 723, 725, 726, 727, 728, 732, 733, 735, 737, 716, 718, 718, 718, 718, 718, 718, 718, 718, 718, 738, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 0, 756, 757, 758, 718, 759, 0, 760, 761, 762, 763, 765, 766, 767, 768, 755, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 755, 756, 757, 758, 718, 759, 755, 760, 761, 762, 763, 765, 766, 767, 768, 755, 769, 770, 771, 773, 774, 775, 777, 778, 779, 780, 755, 781, 782, 783, 784, 786, 755, 788, 791, 793, 794, 795, 796, 797, 798, 799, 769, 770, 771, 773, 774, 775, 777, 778, 779, 780, 800, 781, 782, 783, 784, 786, 801, 788, 791, 793, 794, 795, 796, 797, 798, 799, 802, 803, 804, 805, 807, 808, 809, 810, 812, 814, 800, 816, 817, 819, 820, 821, 801, 823, 824, 825, 826, 827, 828, 829, 831, 832, 802, 803, 804, 805, 807, 808, 809, 810, 812, 814, 833, 816, 817, 819, 820, 821, 834, 823, 824, 825, 826, 827, 828, 829, 831, 832, 836, 837, 840, 842, 843, 844, 845, 846, 847, 849, 833, 850, 851, 853, 854, 855, 834, 856, 857, 859, 860, 862, 863, 864, 866, 868, 836, 837, 840, 842, 843, 844, 845, 846, 847, 849, 869, 850, 851, 853, 854, 855, 870, 856, 857, 859, 860, 862, 863, 864, 866, 868, 872, 877, 878, 879, 880, 881, 883, 884, 885, 887, 869, 889, 890, 891, 892, 893, 870, 894, 895, 896, 897, 899, 900, 901, 902, 906, 872, 877, 878, 879, 880, 881, 883, 884, 885, 887, 0, 889, 890, 891, 892, 893, 0, 894, 895, 896, 897, 899, 900, 901, 902, 906, 908, 908, 908, 908, 908, 908, 908, 908, 909, 909, 909, 909, 909, 909, 909, 909, 910, 910, 910, 910, 910, 910, 910, 910, 912, 912, 912, 912, 912, 912, 912, 912, 0, 0, 915, 909, 916, 917, 918, 922, 923, 924, 925, 910, 928, 930, 933, 935, 936, 938, 939, 912, 913, 913, 913, 913, 913, 913, 913, 913, 915, 909, 916, 917, 918, 922, 923, 924, 925, 910, 928, 930, 933, 935, 936, 938, 939, 912, 941, 913, 942, 943, 945, 946, 947, 948, 949, 950, 951, 954, 956, 957, 958, 959, 943, 960, 962, 963, 964, 965, 966, 968, 969, 973, 941, 913, 942, 943, 945, 946, 947, 948, 949, 950, 951, 954, 956, 957, 958, 959, 943, 960, 962, 963, 964, 965, 966, 968, 969, 973, 974, 975, 977, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 993, 995, 997, 1000, 1010, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1023, 974, 975, 977, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 993, 995, 997, 1000, 1010, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1023, 1024, 1025, 1028, 1030, 1031, 1033, 1036, 1038, 1039, 1041, 1043, 1044, 1045, 1048, 1049, 1051, 1054, 1056, 1061, 1062, 1066, 1067, 1068, 1069, 1070, 1072, 1024, 1025, 1028, 1030, 1031, 1033, 1036, 1038, 1039, 1041, 1043, 1044, 1045, 1048, 1049, 1051, 1054, 1056, 1061, 1062, 1066, 1067, 1068, 1069, 1070, 1072, 1073, 1075, 1076, 1077, 1078, 1081, 1082, 1084, 1085, 1086, 1087, 1092, 1094, 1095, 1096, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1107, 1108, 1112, 1073, 1075, 1076, 1077, 1078, 1081, 1082, 1084, 1085, 1086, 1087, 1092, 1094, 1095, 1096, 1098, 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1107, 1108, 1112, 1114, 1115, 1117, 1118, 1121, 1122, 1123, 1124, 1125, 1127, 1128, 1129, 1130, 1132, 1133, 1136, 1137, 1139, 1140, 1141, 1142, 1144, 1145, 1147, 1148, 1149, 1114, 1115, 1117, 1118, 1121, 1122, 1123, 1124, 1125, 1127, 1128, 1129, 1130, 1132, 1133, 1136, 1137, 1139, 1140, 1141, 1142, 1144, 1145, 1147, 1148, 1149, 1150, 1152, 1156, 1157, 1158, 1161, 1162, 1166, 1167, 1168, 1174, 1176, 1177, 1178, 1179, 1180, 1183, 1185, 1187, 1189, 1191, 1192, 1194, 1196, 1197, 1198, 1150, 1152, 1156, 1157, 1158, 1161, 1162, 1166, 1167, 1168, 1174, 1176, 1177, 1178, 1179, 1180, 1183, 1185, 1187, 1189, 1191, 1192, 1194, 1196, 1197, 1198, 1202, 1204, 1206, 1207, 1208, 1210, 1213, 1214, 1215, 1217, 1219, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1229, 1230, 1236, 1237, 1239, 1241, 1244, 1247, 1202, 1204, 1206, 1207, 1208, 1210, 1213, 1214, 1215, 1217, 1219, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1229, 1230, 1236, 1237, 1239, 1241, 1244, 1247, 1248, 1249, 1252, 1253, 1254, 1257, 1258, 1259, 1260, 1262, 1264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1248, 1249, 1252, 1253, 1254, 1257, 1258, 1259, 1260, 1262, 1264, 1270, 1270, 1271, 1271, 1272, 1272, 1273, 1273, 1274, 1274, 1275, 1275, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/lex.L" #include #include #include #include #include "util.h" #include "parser.H" extern YYSTYPE* frlval; /* rules */ #line 1503 "frame/lex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 28 "frame/lex.L" #line 1606 "frame/lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1269 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 1268 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 30 "frame/lex.L" {return ABOUT_;} YY_BREAK case 2: YY_RULE_SETUP #line 31 "frame/lex.L" {return AIP_;} YY_BREAK case 3: YY_RULE_SETUP #line 32 "frame/lex.L" {return ALLOC_;} YY_BREAK case 4: YY_RULE_SETUP #line 33 "frame/lex.L" {return ALLOCGZ_;} YY_BREAK case 5: YY_RULE_SETUP #line 34 "frame/lex.L" {return ALIGN_;} YY_BREAK case 6: YY_RULE_SETUP #line 35 "frame/lex.L" {return ALL_;} YY_BREAK case 7: YY_RULE_SETUP #line 36 "frame/lex.L" {return ALT_;} YY_BREAK case 8: YY_RULE_SETUP #line 37 "frame/lex.L" {return AMPLIFIER_;} YY_BREAK case 9: YY_RULE_SETUP #line 38 "frame/lex.L" {return ANALYSIS_;} YY_BREAK case 10: YY_RULE_SETUP #line 39 "frame/lex.L" {return ANGLE_;} YY_BREAK case 11: YY_RULE_SETUP #line 40 "frame/lex.L" {return ANNULUS_;} YY_BREAK case 12: YY_RULE_SETUP #line 41 "frame/lex.L" {return APPEND_;} YY_BREAK case 13: YY_RULE_SETUP #line 42 "frame/lex.L" {return ARCMIN_;} YY_BREAK case 14: YY_RULE_SETUP #line 43 "frame/lex.L" {return ARCSEC_;} YY_BREAK case 15: YY_RULE_SETUP #line 44 "frame/lex.L" {return ARRAY_;} YY_BREAK case 16: YY_RULE_SETUP #line 45 "frame/lex.L" {return ARROW_;} YY_BREAK case 17: YY_RULE_SETUP #line 46 "frame/lex.L" {return ASINH_;} YY_BREAK case 18: YY_RULE_SETUP #line 47 "frame/lex.L" {return AST_;} YY_BREAK case 19: YY_RULE_SETUP #line 48 "frame/lex.L" {return AUTO_;} YY_BREAK case 20: YY_RULE_SETUP #line 49 "frame/lex.L" {return AUX_;} YY_BREAK case 21: YY_RULE_SETUP #line 50 "frame/lex.L" {return AVERAGE_;} YY_BREAK case 22: YY_RULE_SETUP #line 51 "frame/lex.L" {return AXES_;} YY_BREAK case 23: YY_RULE_SETUP #line 52 "frame/lex.L" {return AZIMUTH_;} YY_BREAK case 24: YY_RULE_SETUP #line 53 "frame/lex.L" {return B1950_;} YY_BREAK case 25: YY_RULE_SETUP #line 54 "frame/lex.L" {return BACK_;} YY_BREAK case 26: YY_RULE_SETUP #line 55 "frame/lex.L" {return BACKGROUND_;} YY_BREAK case 27: YY_RULE_SETUP #line 56 "frame/lex.L" {return BASE_;} YY_BREAK case 28: YY_RULE_SETUP #line 57 "frame/lex.L" {return BBOX_;} YY_BREAK case 29: YY_RULE_SETUP #line 58 "frame/lex.L" {return BEGIN_;} YY_BREAK case 30: YY_RULE_SETUP #line 59 "frame/lex.L" {return BG_;} YY_BREAK case 31: YY_RULE_SETUP #line 60 "frame/lex.L" {return BIGENDIAN_;} YY_BREAK case 32: YY_RULE_SETUP #line 61 "frame/lex.L" {return BIGENDIAN_;} YY_BREAK case 33: YY_RULE_SETUP #line 62 "frame/lex.L" {return BIN_;} YY_BREAK case 34: YY_RULE_SETUP #line 63 "frame/lex.L" {return BITPIX_;} YY_BREAK case 35: YY_RULE_SETUP #line 64 "frame/lex.L" {return BLOCK_;} YY_BREAK case 36: YY_RULE_SETUP #line 65 "frame/lex.L" {return BORDER_;} YY_BREAK case 37: YY_RULE_SETUP #line 66 "frame/lex.L" {return BOX_;} YY_BREAK case 38: YY_RULE_SETUP #line 67 "frame/lex.L" {return BOXANNULUS_;} YY_BREAK case 39: YY_RULE_SETUP #line 68 "frame/lex.L" {return BOXCAR_;} YY_BREAK case 40: YY_RULE_SETUP #line 69 "frame/lex.L" {return BOXCIRCLE_;} YY_BREAK case 41: YY_RULE_SETUP #line 70 "frame/lex.L" {return BPANDA_;} YY_BREAK case 42: YY_RULE_SETUP #line 71 "frame/lex.L" {return BUFFER_;} YY_BREAK case 43: YY_RULE_SETUP #line 72 "frame/lex.L" {return BW_;} YY_BREAK case 44: YY_RULE_SETUP #line 73 "frame/lex.L" {return CALLBACK_;} YY_BREAK case 45: YY_RULE_SETUP #line 74 "frame/lex.L" {return CANVAS_;} YY_BREAK case 46: YY_RULE_SETUP #line 75 "frame/lex.L" {return CATALOG_;} YY_BREAK case 47: YY_RULE_SETUP #line 76 "frame/lex.L" {return CELESTRIAL_;} YY_BREAK case 48: YY_RULE_SETUP #line 77 "frame/lex.L" {return CENTER_;} YY_BREAK case 49: YY_RULE_SETUP #line 78 "frame/lex.L" {return CENTROID_;} YY_BREAK case 50: YY_RULE_SETUP #line 79 "frame/lex.L" {return CHANNEL_;} YY_BREAK case 51: YY_RULE_SETUP #line 80 "frame/lex.L" {return CIAO_;} YY_BREAK case 52: YY_RULE_SETUP #line 81 "frame/lex.L" {return CIRCLE_;} YY_BREAK case 53: YY_RULE_SETUP #line 82 "frame/lex.L" {return CLEAR_;} YY_BREAK case 54: YY_RULE_SETUP #line 83 "frame/lex.L" {return CLIP_;} YY_BREAK case 55: YY_RULE_SETUP #line 84 "frame/lex.L" {return COLOR_;} YY_BREAK case 56: YY_RULE_SETUP #line 85 "frame/lex.L" {return COLORBAR_;} YY_BREAK case 57: YY_RULE_SETUP #line 86 "frame/lex.L" {return COLORMAP_;} YY_BREAK case 58: YY_RULE_SETUP #line 87 "frame/lex.L" {return COLORSCALE_;} YY_BREAK case 59: YY_RULE_SETUP #line 88 "frame/lex.L" {return COLORSPACE_;} YY_BREAK case 60: YY_RULE_SETUP #line 89 "frame/lex.L" {return COLS_;} YY_BREAK case 61: YY_RULE_SETUP #line 90 "frame/lex.L" {return COLUMN_;} YY_BREAK case 62: YY_RULE_SETUP #line 91 "frame/lex.L" {return COMMAND_;} YY_BREAK case 63: YY_RULE_SETUP #line 92 "frame/lex.L" {return COMPASS_;} YY_BREAK case 64: YY_RULE_SETUP #line 93 "frame/lex.L" {return COMPOSITE_;} YY_BREAK case 65: YY_RULE_SETUP #line 94 "frame/lex.L" {return COMPRESS_;} YY_BREAK case 66: YY_RULE_SETUP #line 95 "frame/lex.L" {return CONTOUR_;} YY_BREAK case 67: YY_RULE_SETUP #line 96 "frame/lex.L" {return CONTRAST_;} YY_BREAK case 68: YY_RULE_SETUP #line 97 "frame/lex.L" {return COORDINATES_;} YY_BREAK case 69: YY_RULE_SETUP #line 98 "frame/lex.L" {return COPY_;} YY_BREAK case 70: YY_RULE_SETUP #line 99 "frame/lex.L" {return COUNT_;} YY_BREAK case 71: YY_RULE_SETUP #line 100 "frame/lex.L" {return CROP_;} YY_BREAK case 72: YY_RULE_SETUP #line 101 "frame/lex.L" {return CROSS_;} YY_BREAK case 73: YY_RULE_SETUP #line 102 "frame/lex.L" {return CPANDA_;} YY_BREAK case 74: YY_RULE_SETUP #line 103 "frame/lex.L" {return CREATE_;} YY_BREAK case 75: YY_RULE_SETUP #line 104 "frame/lex.L" {return CROSSHAIR_;} YY_BREAK case 76: YY_RULE_SETUP #line 105 "frame/lex.L" {return CUBE_;} YY_BREAK case 77: YY_RULE_SETUP #line 106 "frame/lex.L" {return CURSOR_;} YY_BREAK case 78: YY_RULE_SETUP #line 107 "frame/lex.L" {return CUT_;} YY_BREAK case 79: YY_RULE_SETUP #line 108 "frame/lex.L" {return CMYK_;} YY_BREAK case 80: YY_RULE_SETUP #line 109 "frame/lex.L" {return DASH_;} YY_BREAK case 81: YY_RULE_SETUP #line 110 "frame/lex.L" {return DASHLIST_;} YY_BREAK case 82: YY_RULE_SETUP #line 111 "frame/lex.L" {return DATA_;} YY_BREAK case 83: YY_RULE_SETUP #line 112 "frame/lex.L" {return DATAMIN_;} YY_BREAK case 84: YY_RULE_SETUP #line 113 "frame/lex.L" {return DATASEC_;} YY_BREAK case 85: YY_RULE_SETUP #line 114 "frame/lex.L" {return DEBUG_;} YY_BREAK case 86: YY_RULE_SETUP #line 115 "frame/lex.L" {return DEGREES_;} YY_BREAK case 87: YY_RULE_SETUP #line 116 "frame/lex.L" {return DEFAULT_;} YY_BREAK case 88: YY_RULE_SETUP #line 117 "frame/lex.L" {return DELETE_;} YY_BREAK case 89: YY_RULE_SETUP #line 118 "frame/lex.L" {return DEPTH_;} YY_BREAK case 90: YY_RULE_SETUP #line 119 "frame/lex.L" {return DETECTOR_;} YY_BREAK case 91: YY_RULE_SETUP #line 120 "frame/lex.L" {return DIAMOND_;} YY_BREAK case 92: YY_RULE_SETUP #line 121 "frame/lex.L" {return DIM_;} YY_BREAK case 93: YY_RULE_SETUP #line 122 "frame/lex.L" {return DS9_;} YY_BREAK case 94: YY_RULE_SETUP #line 123 "frame/lex.L" {return ECLIPTIC_;} YY_BREAK case 95: YY_RULE_SETUP #line 124 "frame/lex.L" {return ELEVATION_;} YY_BREAK case 96: YY_RULE_SETUP #line 125 "frame/lex.L" {return ELLIPSE_;} YY_BREAK case 97: YY_RULE_SETUP #line 126 "frame/lex.L" {return ELLIPSEANNULUS_;} YY_BREAK case 98: YY_RULE_SETUP #line 127 "frame/lex.L" {return EDIT_;} YY_BREAK case 99: YY_RULE_SETUP #line 128 "frame/lex.L" {return END_;} YY_BREAK case 100: YY_RULE_SETUP #line 129 "frame/lex.L" {return ENVI_;} YY_BREAK case 101: YY_RULE_SETUP #line 130 "frame/lex.L" {return EPANDA_;} YY_BREAK case 102: YY_RULE_SETUP #line 131 "frame/lex.L" {return EPSILON_;} YY_BREAK case 103: YY_RULE_SETUP #line 132 "frame/lex.L" {return EQUATORIAL_;} YY_BREAK case 104: YY_RULE_SETUP #line 133 "frame/lex.L" {return ERASE_;} YY_BREAK case 105: YY_RULE_SETUP #line 134 "frame/lex.L" {return EXT_;} YY_BREAK case 106: YY_RULE_SETUP #line 135 "frame/lex.L" {return FACTOR_;} YY_BREAK case 107: YY_RULE_SETUP #line 136 "frame/lex.L" {return FALSE_;} YY_BREAK case 108: YY_RULE_SETUP #line 137 "frame/lex.L" {return FILE_;} YY_BREAK case 109: YY_RULE_SETUP #line 138 "frame/lex.L" {return FILTER_;} YY_BREAK case 110: YY_RULE_SETUP #line 139 "frame/lex.L" {return FIT_;} YY_BREAK case 111: YY_RULE_SETUP #line 140 "frame/lex.L" {return FITS_;} YY_BREAK case 112: YY_RULE_SETUP #line 141 "frame/lex.L" {return FITSY_;} YY_BREAK case 113: YY_RULE_SETUP #line 142 "frame/lex.L" {return FIXED_;} YY_BREAK case 114: YY_RULE_SETUP #line 143 "frame/lex.L" {return FK4_;} YY_BREAK case 115: YY_RULE_SETUP #line 144 "frame/lex.L" {return FK4_NO_E_;} YY_BREAK case 116: YY_RULE_SETUP #line 145 "frame/lex.L" {return FK5_;} YY_BREAK case 117: YY_RULE_SETUP #line 146 "frame/lex.L" {return FONT_;} YY_BREAK case 118: YY_RULE_SETUP #line 147 "frame/lex.L" {return FRONT_;} YY_BREAK case 119: YY_RULE_SETUP #line 148 "frame/lex.L" {return FULL_;} YY_BREAK case 120: YY_RULE_SETUP #line 149 "frame/lex.L" {return FUNCTION_;} YY_BREAK case 121: YY_RULE_SETUP #line 150 "frame/lex.L" {return GALACTIC_;} YY_BREAK case 122: YY_RULE_SETUP #line 151 "frame/lex.L" {return GAUSSIAN_;} YY_BREAK case 123: YY_RULE_SETUP #line 152 "frame/lex.L" {return GET_;} YY_BREAK case 124: YY_RULE_SETUP #line 153 "frame/lex.L" {return GLOBAL_;} YY_BREAK case 125: YY_RULE_SETUP #line 154 "frame/lex.L" {return GRAPHICS_;} YY_BREAK case 126: YY_RULE_SETUP #line 155 "frame/lex.L" {return GRAY_;} YY_BREAK case 127: YY_RULE_SETUP #line 156 "frame/lex.L" {return GRID_;} YY_BREAK case 128: YY_RULE_SETUP #line 157 "frame/lex.L" {return GZ_;} YY_BREAK case 129: YY_RULE_SETUP #line 158 "frame/lex.L" {return HANDLE_;} YY_BREAK case 130: YY_RULE_SETUP #line 159 "frame/lex.L" {return HAS_;} YY_BREAK case 131: YY_RULE_SETUP #line 160 "frame/lex.L" {return HEAD_;} YY_BREAK case 132: YY_RULE_SETUP #line 161 "frame/lex.L" {return HEADER_;} YY_BREAK case 133: YY_RULE_SETUP #line 162 "frame/lex.L" {return HEIGHT_;} YY_BREAK case 134: YY_RULE_SETUP #line 163 "frame/lex.L" {return HELIOECLIPTIC_;} YY_BREAK case 135: YY_RULE_SETUP #line 164 "frame/lex.L" {return HIDE_;} YY_BREAK case 136: YY_RULE_SETUP #line 165 "frame/lex.L" {return HIGH_;} YY_BREAK case 137: YY_RULE_SETUP #line 166 "frame/lex.L" {return HIGHLITE_;} YY_BREAK case 138: YY_RULE_SETUP #line 167 "frame/lex.L" {return HISTEQU_;} YY_BREAK case 139: YY_RULE_SETUP #line 168 "frame/lex.L" {return HISTOGRAM_;} YY_BREAK case 140: YY_RULE_SETUP #line 169 "frame/lex.L" {return HORIZONTAL_;} YY_BREAK case 141: YY_RULE_SETUP #line 170 "frame/lex.L" {return ICRS_;} YY_BREAK case 142: YY_RULE_SETUP #line 171 "frame/lex.L" {return ID_;} YY_BREAK case 143: YY_RULE_SETUP #line 172 "frame/lex.L" {return IIS_;} YY_BREAK case 144: YY_RULE_SETUP #line 173 "frame/lex.L" {return IMAGE_;} YY_BREAK case 145: YY_RULE_SETUP #line 174 "frame/lex.L" {return INCLUDE_;} YY_BREAK case 146: YY_RULE_SETUP #line 175 "frame/lex.L" {return INCR_;} YY_BREAK case 147: YY_RULE_SETUP #line 176 "frame/lex.L" {return INFO_;} YY_BREAK case 148: YY_RULE_SETUP #line 177 "frame/lex.L" {return INTEGER_;} YY_BREAK case 149: YY_RULE_SETUP #line 178 "frame/lex.L" {return ITERATION_;} YY_BREAK case 150: YY_RULE_SETUP #line 179 "frame/lex.L" {return IRAF_;} YY_BREAK case 151: YY_RULE_SETUP #line 180 "frame/lex.L" {return IRAFMIN_;} YY_BREAK case 152: YY_RULE_SETUP #line 181 "frame/lex.L" {return J2000_;} YY_BREAK case 153: YY_RULE_SETUP #line 182 "frame/lex.L" {return KEY_;} YY_BREAK case 154: YY_RULE_SETUP #line 183 "frame/lex.L" {return KEYWORD_;} YY_BREAK case 155: YY_RULE_SETUP #line 184 "frame/lex.L" {return LABEL_;} YY_BREAK case 156: YY_RULE_SETUP #line 185 "frame/lex.L" {return LENGTH_;} YY_BREAK case 157: YY_RULE_SETUP #line 186 "frame/lex.L" {return LEVEL_;} YY_BREAK case 158: YY_RULE_SETUP #line 187 "frame/lex.L" {return LITTLEENDIAN_;} YY_BREAK case 159: YY_RULE_SETUP #line 188 "frame/lex.L" {return LITTLEENDIAN_;} YY_BREAK case 160: YY_RULE_SETUP #line 189 "frame/lex.L" {return LINE_;} YY_BREAK case 161: YY_RULE_SETUP #line 190 "frame/lex.L" {return LINEAR_;} YY_BREAK case 162: YY_RULE_SETUP #line 191 "frame/lex.L" {return LIST_;} YY_BREAK case 163: YY_RULE_SETUP #line 192 "frame/lex.L" {return LOAD_;} YY_BREAK case 164: YY_RULE_SETUP #line 193 "frame/lex.L" {return LOCAL_;} YY_BREAK case 165: YY_RULE_SETUP #line 194 "frame/lex.L" {return LOG_;} YY_BREAK case 166: YY_RULE_SETUP #line 195 "frame/lex.L" {return LOW_;} YY_BREAK case 167: YY_RULE_SETUP #line 196 "frame/lex.L" {return MACOSX_;} YY_BREAK case 168: YY_RULE_SETUP #line 197 "frame/lex.L" {return MAGNIFIER_;} YY_BREAK case 169: YY_RULE_SETUP #line 198 "frame/lex.L" {return MATCH_;} YY_BREAK case 170: YY_RULE_SETUP #line 199 "frame/lex.L" {return MAP_;} YY_BREAK case 171: YY_RULE_SETUP #line 200 "frame/lex.L" {return MARK_;} YY_BREAK case 172: YY_RULE_SETUP #line 201 "frame/lex.L" {return MARKER_;} YY_BREAK case 173: YY_RULE_SETUP #line 202 "frame/lex.L" {return MASK_;} YY_BREAK case 174: YY_RULE_SETUP #line 203 "frame/lex.L" {return MESSAGE_;} YY_BREAK case 175: YY_RULE_SETUP #line 204 "frame/lex.L" {return METHOD_;} YY_BREAK case 176: YY_RULE_SETUP #line 205 "frame/lex.L" {return MINMAX_;} YY_BREAK case 177: YY_RULE_SETUP #line 206 "frame/lex.L" {return MIP_;} YY_BREAK case 178: YY_RULE_SETUP #line 207 "frame/lex.L" {return MMAP_;} YY_BREAK case 179: YY_RULE_SETUP #line 208 "frame/lex.L" {return MMAPINCR_;} YY_BREAK case 180: YY_RULE_SETUP #line 209 "frame/lex.L" {return MODE_;} YY_BREAK case 181: YY_RULE_SETUP #line 210 "frame/lex.L" {return MOSAIC_;} YY_BREAK case 182: YY_RULE_SETUP #line 211 "frame/lex.L" {return MOTION_;} YY_BREAK case 183: YY_RULE_SETUP #line 212 "frame/lex.L" {return MOVE_;} YY_BREAK case 184: YY_RULE_SETUP #line 213 "frame/lex.L" {return NAME_;} YY_BREAK case 185: YY_RULE_SETUP #line 214 "frame/lex.L" {return NAN_;} YY_BREAK case 186: YY_RULE_SETUP #line 215 "frame/lex.L" {return NATIVE_;} YY_BREAK case 187: YY_RULE_SETUP #line 216 "frame/lex.L" {return NAXES_;} YY_BREAK case 188: YY_RULE_SETUP #line 217 "frame/lex.L" {return NEW_;} YY_BREAK case 189: YY_RULE_SETUP #line 218 "frame/lex.L" {return NEXT_;} YY_BREAK case 190: YY_RULE_SETUP #line 219 "frame/lex.L" {return NO_;} YY_BREAK case 191: YY_RULE_SETUP #line 220 "frame/lex.L" {return NONE_;} YY_BREAK case 192: YY_RULE_SETUP #line 221 "frame/lex.L" {return NOW_;} YY_BREAK case 193: YY_RULE_SETUP #line 222 "frame/lex.L" {return NRRD_;} YY_BREAK case 194: YY_RULE_SETUP #line 223 "frame/lex.L" {return NUMBER_;} YY_BREAK case 195: YY_RULE_SETUP #line 224 "frame/lex.L" {return OBJECT_;} YY_BREAK case 196: YY_RULE_SETUP #line 225 "frame/lex.L" {return OFF_;} YY_BREAK case 197: YY_RULE_SETUP #line 226 "frame/lex.L" {return ON_;} YY_BREAK case 198: YY_RULE_SETUP #line 227 "frame/lex.L" {return ONLY_;} YY_BREAK case 199: YY_RULE_SETUP #line 228 "frame/lex.L" {return OPTION_;} YY_BREAK case 200: YY_RULE_SETUP #line 229 "frame/lex.L" {return ORIENT_;} YY_BREAK case 201: YY_RULE_SETUP #line 230 "frame/lex.L" {return PAN_;} YY_BREAK case 202: YY_RULE_SETUP #line 231 "frame/lex.L" {return CPANDA_;} YY_BREAK case 203: YY_RULE_SETUP #line 232 "frame/lex.L" {return PANNER_;} YY_BREAK case 204: YY_RULE_SETUP #line 233 "frame/lex.L" {return PARSER_;} YY_BREAK case 205: YY_RULE_SETUP #line 234 "frame/lex.L" {return PASTE_;} YY_BREAK case 206: YY_RULE_SETUP #line 235 "frame/lex.L" {return PERF_;} YY_BREAK case 207: YY_RULE_SETUP #line 236 "frame/lex.L" {return PHOTO_;} YY_BREAK case 208: YY_RULE_SETUP #line 237 "frame/lex.L" {return PHYSICAL_;} YY_BREAK case 209: YY_RULE_SETUP #line 238 "frame/lex.L" {return PIXEL_;} YY_BREAK case 210: YY_RULE_SETUP #line 239 "frame/lex.L" {return PLOT2D_;} YY_BREAK case 211: YY_RULE_SETUP #line 240 "frame/lex.L" {return PLOT3D_;} YY_BREAK case 212: YY_RULE_SETUP #line 241 "frame/lex.L" {return POINT_;} YY_BREAK case 213: YY_RULE_SETUP #line 242 "frame/lex.L" {return POINTER_;} YY_BREAK case 214: YY_RULE_SETUP #line 243 "frame/lex.L" {return POLYGON_;} YY_BREAK case 215: YY_RULE_SETUP #line 244 "frame/lex.L" {return POSTSCRIPT_;} YY_BREAK case 216: YY_RULE_SETUP #line 245 "frame/lex.L" {return POW_;} YY_BREAK case 217: YY_RULE_SETUP #line 246 "frame/lex.L" {return PRINT_;} YY_BREAK case 218: YY_RULE_SETUP #line 247 "frame/lex.L" {return PRESERVE_;} YY_BREAK case 219: YY_RULE_SETUP #line 248 "frame/lex.L" {return PROJECTION_;} YY_BREAK case 220: YY_RULE_SETUP #line 249 "frame/lex.L" {return PROPERTY_;} YY_BREAK case 221: YY_RULE_SETUP #line 250 "frame/lex.L" {return PROS_;} YY_BREAK case 222: YY_RULE_SETUP #line 251 "frame/lex.L" {return PUBLICATION_;} YY_BREAK case 223: YY_RULE_SETUP #line 252 "frame/lex.L" {return QUERY_;} YY_BREAK case 224: YY_RULE_SETUP #line 253 "frame/lex.L" {return RADIAL_;} YY_BREAK case 225: YY_RULE_SETUP #line 254 "frame/lex.L" {return RADIUS_;} YY_BREAK case 226: YY_RULE_SETUP #line 255 "frame/lex.L" {return REGION_;} YY_BREAK case 227: YY_RULE_SETUP #line 256 "frame/lex.L" {return REPLACE_;} YY_BREAK case 228: YY_RULE_SETUP #line 257 "frame/lex.L" {return RESAMPLE_;} YY_BREAK case 229: YY_RULE_SETUP #line 258 "frame/lex.L" {return RESET_;} YY_BREAK case 230: YY_RULE_SETUP #line 259 "frame/lex.L" {return RESOLUTION_;} YY_BREAK case 231: YY_RULE_SETUP #line 260 "frame/lex.L" {return RGB_;} YY_BREAK case 232: YY_RULE_SETUP #line 261 "frame/lex.L" {return ROOT_;} YY_BREAK case 233: YY_RULE_SETUP #line 262 "frame/lex.L" {return ROTATE_;} YY_BREAK case 234: YY_RULE_SETUP #line 263 "frame/lex.L" {return RULER_;} YY_BREAK case 235: YY_RULE_SETUP #line 264 "frame/lex.L" {return SAMPLE_;} YY_BREAK case 236: YY_RULE_SETUP #line 265 "frame/lex.L" {return SAOIMAGE_;} YY_BREAK case 237: YY_RULE_SETUP #line 266 "frame/lex.L" {return SAOTNG_;} YY_BREAK case 238: YY_RULE_SETUP #line 267 "frame/lex.L" {return SAVE_;} YY_BREAK case 239: YY_RULE_SETUP #line 268 "frame/lex.L" {return SCALE_;} YY_BREAK case 240: YY_RULE_SETUP #line 269 "frame/lex.L" {return SCAN_;} YY_BREAK case 241: YY_RULE_SETUP #line 270 "frame/lex.L" {return SCIENTIFIC_;} YY_BREAK case 242: YY_RULE_SETUP #line 271 "frame/lex.L" {return SCOPE_;} YY_BREAK case 243: YY_RULE_SETUP #line 272 "frame/lex.L" {return SEGMENT_;} YY_BREAK case 244: YY_RULE_SETUP #line 273 "frame/lex.L" {return SELECT_;} YY_BREAK case 245: YY_RULE_SETUP #line 274 "frame/lex.L" {return SET_;} YY_BREAK case 246: YY_RULE_SETUP #line 275 "frame/lex.L" {return SEXAGESIMAL_;} YY_BREAK case 247: YY_RULE_SETUP #line 276 "frame/lex.L" {return SHAPE_;} YY_BREAK case 248: YY_RULE_SETUP #line 277 "frame/lex.L" {return SHARED_;} YY_BREAK case 249: YY_RULE_SETUP #line 278 "frame/lex.L" {return SHIFT_;} YY_BREAK case 250: YY_RULE_SETUP #line 279 "frame/lex.L" {return SHMID_;} YY_BREAK case 251: YY_RULE_SETUP #line 280 "frame/lex.L" {return SHOW_;} YY_BREAK case 252: YY_RULE_SETUP #line 281 "frame/lex.L" {return SINH_;} YY_BREAK case 253: YY_RULE_SETUP #line 282 "frame/lex.L" {return SIZE_;} YY_BREAK case 254: YY_RULE_SETUP #line 283 "frame/lex.L" {return SLICE_;} YY_BREAK case 255: YY_RULE_SETUP #line 284 "frame/lex.L" {return SMMAP_;} YY_BREAK case 256: YY_RULE_SETUP #line 285 "frame/lex.L" {return SMOOTH_;} YY_BREAK case 257: YY_RULE_SETUP #line 286 "frame/lex.L" {return SOCKET_;} YY_BREAK case 258: YY_RULE_SETUP #line 287 "frame/lex.L" {return SOCKETGZ_;} YY_BREAK case 259: YY_RULE_SETUP #line 288 "frame/lex.L" {return SOURCE_;} YY_BREAK case 260: YY_RULE_SETUP #line 289 "frame/lex.L" {return SQRT_;} YY_BREAK case 261: YY_RULE_SETUP #line 290 "frame/lex.L" {return SQUARED_;} YY_BREAK case 262: YY_RULE_SETUP #line 291 "frame/lex.L" {return SSHARED_;} YY_BREAK case 263: YY_RULE_SETUP #line 292 "frame/lex.L" {return STATS_;} YY_BREAK case 264: YY_RULE_SETUP #line 293 "frame/lex.L" {return STATUS_;} YY_BREAK case 265: YY_RULE_SETUP #line 294 "frame/lex.L" {return SUM_;} YY_BREAK case 266: YY_RULE_SETUP #line 295 "frame/lex.L" {return SUPERGALACTIC_;} YY_BREAK case 267: YY_RULE_SETUP #line 296 "frame/lex.L" {return SYSTEM_;} YY_BREAK case 268: YY_RULE_SETUP #line 297 "frame/lex.L" {return TABLE_;} YY_BREAK case 269: YY_RULE_SETUP #line 298 "frame/lex.L" {return TAG_;} YY_BREAK case 270: YY_RULE_SETUP #line 299 "frame/lex.L" {return TEMPLATE_;} YY_BREAK case 271: YY_RULE_SETUP #line 300 "frame/lex.L" {return TEXT_;} YY_BREAK case 272: YY_RULE_SETUP #line 301 "frame/lex.L" {return THREADS_;} YY_BREAK case 273: YY_RULE_SETUP #line 302 "frame/lex.L" {return THREED_;} YY_BREAK case 274: YY_RULE_SETUP #line 303 "frame/lex.L" {return THRESHOLD_;} YY_BREAK case 275: YY_RULE_SETUP #line 304 "frame/lex.L" {return THICK_;} YY_BREAK case 276: YY_RULE_SETUP #line 305 "frame/lex.L" {return TRANSPARENCY_;} YY_BREAK case 277: YY_RULE_SETUP #line 306 "frame/lex.L" {return TO_;} YY_BREAK case 278: YY_RULE_SETUP #line 307 "frame/lex.L" {return TOGGLE_;} YY_BREAK case 279: YY_RULE_SETUP #line 308 "frame/lex.L" {return TOPHAT_;} YY_BREAK case 280: YY_RULE_SETUP #line 309 "frame/lex.L" {return TRUE_;} YY_BREAK case 281: YY_RULE_SETUP #line 310 "frame/lex.L" {return TYPE_;} YY_BREAK case 282: YY_RULE_SETUP #line 311 "frame/lex.L" {return UNDO_;} YY_BREAK case 283: YY_RULE_SETUP #line 312 "frame/lex.L" {return UNLOAD_;} YY_BREAK case 284: YY_RULE_SETUP #line 313 "frame/lex.L" {return UNHIGHLITE_;} YY_BREAK case 285: YY_RULE_SETUP #line 314 "frame/lex.L" {return UNSELECT_;} YY_BREAK case 286: YY_RULE_SETUP #line 315 "frame/lex.L" {return UPDATE_;} YY_BREAK case 287: YY_RULE_SETUP #line 316 "frame/lex.L" {return USER_;} YY_BREAK case 288: YY_RULE_SETUP #line 317 "frame/lex.L" {return VALUE_;} YY_BREAK case 289: YY_RULE_SETUP #line 318 "frame/lex.L" {return VAR_;} YY_BREAK case 290: YY_RULE_SETUP #line 319 "frame/lex.L" {return VIEW_;} YY_BREAK case 291: YY_RULE_SETUP #line 320 "frame/lex.L" {return VECTOR_;} YY_BREAK case 292: YY_RULE_SETUP #line 321 "frame/lex.L" {return VERSION_;} YY_BREAK case 293: YY_RULE_SETUP #line 322 "frame/lex.L" {return VERTEX_;} YY_BREAK case 294: YY_RULE_SETUP #line 323 "frame/lex.L" {return VERTICAL_;} YY_BREAK case 295: YY_RULE_SETUP #line 324 "frame/lex.L" {return WARP_;} YY_BREAK case 296: YY_RULE_SETUP #line 325 "frame/lex.L" {return WCS_;} YY_BREAK case 297: YY_RULE_SETUP #line 326 "frame/lex.L" {return WCSA_;} YY_BREAK case 298: YY_RULE_SETUP #line 327 "frame/lex.L" {return WCSB_;} YY_BREAK case 299: YY_RULE_SETUP #line 328 "frame/lex.L" {return WCSC_;} YY_BREAK case 300: YY_RULE_SETUP #line 329 "frame/lex.L" {return WCSD_;} YY_BREAK case 301: YY_RULE_SETUP #line 330 "frame/lex.L" {return WCSE_;} YY_BREAK case 302: YY_RULE_SETUP #line 331 "frame/lex.L" {return WCSF_;} YY_BREAK case 303: YY_RULE_SETUP #line 332 "frame/lex.L" {return WCSG_;} YY_BREAK case 304: YY_RULE_SETUP #line 333 "frame/lex.L" {return WCSH_;} YY_BREAK case 305: YY_RULE_SETUP #line 334 "frame/lex.L" {return WCSI_;} YY_BREAK case 306: YY_RULE_SETUP #line 335 "frame/lex.L" {return WCSJ_;} YY_BREAK case 307: YY_RULE_SETUP #line 336 "frame/lex.L" {return WCSK_;} YY_BREAK case 308: YY_RULE_SETUP #line 337 "frame/lex.L" {return WCSL_;} YY_BREAK case 309: YY_RULE_SETUP #line 338 "frame/lex.L" {return WCSM_;} YY_BREAK case 310: YY_RULE_SETUP #line 339 "frame/lex.L" {return WCSN_;} YY_BREAK case 311: YY_RULE_SETUP #line 340 "frame/lex.L" {return WCSO_;} YY_BREAK case 312: YY_RULE_SETUP #line 341 "frame/lex.L" {return WCSP_;} YY_BREAK case 313: YY_RULE_SETUP #line 342 "frame/lex.L" {return WCSQ_;} YY_BREAK case 314: YY_RULE_SETUP #line 343 "frame/lex.L" {return WCSR_;} YY_BREAK case 315: YY_RULE_SETUP #line 344 "frame/lex.L" {return WCSS_;} YY_BREAK case 316: YY_RULE_SETUP #line 345 "frame/lex.L" {return WCST_;} YY_BREAK case 317: YY_RULE_SETUP #line 346 "frame/lex.L" {return WCSU_;} YY_BREAK case 318: YY_RULE_SETUP #line 347 "frame/lex.L" {return WCSV_;} YY_BREAK case 319: YY_RULE_SETUP #line 348 "frame/lex.L" {return WCSW_;} YY_BREAK case 320: YY_RULE_SETUP #line 349 "frame/lex.L" {return WCSX_;} YY_BREAK case 321: YY_RULE_SETUP #line 350 "frame/lex.L" {return WCSY_;} YY_BREAK case 322: YY_RULE_SETUP #line 351 "frame/lex.L" {return WCSZ_;} YY_BREAK case 323: YY_RULE_SETUP #line 352 "frame/lex.L" {return WCS0_;} YY_BREAK case 324: YY_RULE_SETUP #line 353 "frame/lex.L" {return WFPC2_;} YY_BREAK case 325: YY_RULE_SETUP #line 354 "frame/lex.L" {return WIDTH_;} YY_BREAK case 326: YY_RULE_SETUP #line 355 "frame/lex.L" {return WIN32_;} YY_BREAK case 327: YY_RULE_SETUP #line 356 "frame/lex.L" {return XML_;} YY_BREAK case 328: YY_RULE_SETUP #line 357 "frame/lex.L" {return XY_;} YY_BREAK case 329: YY_RULE_SETUP #line 358 "frame/lex.L" {return YES_;} YY_BREAK case 330: YY_RULE_SETUP #line 359 "frame/lex.L" {return ZMAX_;} YY_BREAK case 331: YY_RULE_SETUP #line 360 "frame/lex.L" {return ZSCALE_;} YY_BREAK case 332: YY_RULE_SETUP #line 361 "frame/lex.L" {return ZOOM_;} YY_BREAK case 333: YY_RULE_SETUP #line 363 "frame/lex.L" { // Integer frlval->integer = atoi(yytext); return INT; } YY_BREAK case 334: #line 369 "frame/lex.L" case 335: YY_RULE_SETUP #line 369 "frame/lex.L" { // Real Number frlval->real = atof(yytext); return REAL; } YY_BREAK case 336: YY_RULE_SETUP #line 374 "frame/lex.L" { // Pointer frlval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } YY_BREAK case 337: #line 380 "frame/lex.L" case 338: YY_RULE_SETUP #line 380 "frame/lex.L" { // degrees yytext[yyleng-1] = '\0'; frlval->real = atof(yytext); return ANGDEGREE; } YY_BREAK case 339: #line 387 "frame/lex.L" case 340: YY_RULE_SETUP #line 387 "frame/lex.L" { // radians yytext[yyleng-1] = '\0'; frlval->real = atof(yytext); return ANGRADIAN; } YY_BREAK case 341: #line 394 "frame/lex.L" case 342: YY_RULE_SETUP #line 394 "frame/lex.L" { // sexagesimal int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 343: #line 402 "frame/lex.L" case 344: YY_RULE_SETUP #line 402 "frame/lex.L" { // HMS int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return HMSSTR; } YY_BREAK case 345: #line 410 "frame/lex.L" case 346: YY_RULE_SETUP #line 410 "frame/lex.L" { // DMS int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return DMSSTR; } YY_BREAK case 347: /* rule 347 can match eol */ #line 418 "frame/lex.L" case 348: /* rule 348 can match eol */ YY_RULE_SETUP #line 418 "frame/lex.L" { // Quoted String int ll = (yyleng-2)<(FRBUFSIZE-1) ? (yyleng-2):(FRBUFSIZE-1); strncpy(frlval->str,yytext+1,ll); // skip the " " frlval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 349: /* rule 349 can match eol */ YY_RULE_SETUP #line 425 "frame/lex.L" { // Quoted String int ll = (yyleng-2)<(FRBUFSIZE-1) ? (yyleng-2):(FRBUFSIZE-1); strncpy(frlval->str,yytext+1,ll); // skip the '{' frlval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 350: YY_RULE_SETUP #line 432 "frame/lex.L" { // General String-- at least 2 printable chars int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return STRING; } YY_BREAK case 351: YY_RULE_SETUP #line 439 "frame/lex.L" { // White Spaces } YY_BREAK case 352: YY_RULE_SETUP #line 442 "frame/lex.L" { // Else, return the char return toupper(yytext[0]); } YY_BREAK case 353: YY_RULE_SETUP #line 446 "frame/lex.L" ECHO; YY_BREAK #line 3482 "frame/lex.C" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; frfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); frfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ frrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) frrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1269 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1269 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 1268); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) fralloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) fralloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) frfree((void *) b->yy_ch_buf ); frfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)fralloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)frrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) fralloc(new_size ); else (yy_start_stack) = (int *) frrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *fralloc (yy_size_t size ) { return (void *) malloc( size ); } void *frrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void frfree (void * ptr ) { free( (char *) ptr ); /* see frrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 446 "frame/lex.L" saods9/tksao1.0/frame/lex.L000644 000765 000000 00000025122 12525206555 015734 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include #include "util.h" #include "parser.H" extern YYSTYPE* frlval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% about {return ABOUT_;} aip {return AIP_;} alloc {return ALLOC_;} allocgz {return ALLOCGZ_;} align {return ALIGN_;} all {return ALL_;} alt {return ALT_;} amplifier {return AMPLIFIER_;} analysis {return ANALYSIS_;} angle {return ANGLE_;} annulus {return ANNULUS_;} append {return APPEND_;} arcmin {return ARCMIN_;} arcsec {return ARCSEC_;} array {return ARRAY_;} arrow {return ARROW_;} asinh {return ASINH_;} ast {return AST_;} auto {return AUTO_;} aux {return AUX_;} average {return AVERAGE_;} axes {return AXES_;} azimuth {return AZIMUTH_;} b1950 {return B1950_;} back {return BACK_;} background {return BACKGROUND_;} base {return BASE_;} bbox {return BBOX_;} begin {return BEGIN_;} bg {return BG_;} big {return BIGENDIAN_;} bigendian {return BIGENDIAN_;} bin {return BIN_;} bitpix {return BITPIX_;} block {return BLOCK_;} border {return BORDER_;} box {return BOX_;} boxannulus {return BOXANNULUS_;} boxcar {return BOXCAR_;} boxcircle {return BOXCIRCLE_;} bpanda {return BPANDA_;} buffer {return BUFFER_;} bw {return BW_;} callback {return CALLBACK_;} canvas {return CANVAS_;} catalog {return CATALOG_;} celestrial {return CELESTRIAL_;} center {return CENTER_;} centroid {return CENTROID_;} channel {return CHANNEL_;} ciao {return CIAO_;} circle {return CIRCLE_;} clear {return CLEAR_;} clip {return CLIP_;} color {return COLOR_;} colorbar {return COLORBAR_;} colormap {return COLORMAP_;} colorscale {return COLORSCALE_;} colorspace {return COLORSPACE_;} cols {return COLS_;} column {return COLUMN_;} command {return COMMAND_;} compass {return COMPASS_;} composite {return COMPOSITE_;} compress {return COMPRESS_;} contour {return CONTOUR_;} contrast {return CONTRAST_;} coordinates {return COORDINATES_;} copy {return COPY_;} count {return COUNT_;} crop {return CROP_;} cross {return CROSS_;} cpanda {return CPANDA_;} create {return CREATE_;} crosshair {return CROSSHAIR_;} cube {return CUBE_;} cursor {return CURSOR_;} cut {return CUT_;} cmyk {return CMYK_;} dash {return DASH_;} dashlist {return DASHLIST_;} data {return DATA_;} datamin {return DATAMIN_;} datasec {return DATASEC_;} debug {return DEBUG_;} degrees {return DEGREES_;} default {return DEFAULT_;} delete {return DELETE_;} depth {return DEPTH_;} detector {return DETECTOR_;} diamond {return DIAMOND_;} dim {return DIM_;} ds9 {return DS9_;} ecliptic {return ECLIPTIC_;} elevation {return ELEVATION_;} ellipse {return ELLIPSE_;} ellipseannulus {return ELLIPSEANNULUS_;} edit {return EDIT_;} end {return END_;} envi {return ENVI_;} epanda {return EPANDA_;} epsilon {return EPSILON_;} equatorial {return EQUATORIAL_;} erase {return ERASE_;} ext {return EXT_;} factor {return FACTOR_;} false {return FALSE_;} file {return FILE_;} filter {return FILTER_;} fit {return FIT_;} fits {return FITS_;} fitsy {return FITSY_;} fixed {return FIXED_;} fk4 {return FK4_;} fk4-no-e {return FK4_NO_E_;} fk5 {return FK5_;} font {return FONT_;} front {return FRONT_;} full {return FULL_;} function {return FUNCTION_;} galactic {return GALACTIC_;} gaussian {return GAUSSIAN_;} get {return GET_;} global {return GLOBAL_;} graphics {return GRAPHICS_;} gray {return GRAY_;} grid {return GRID_;} gz {return GZ_;} handle {return HANDLE_;} has {return HAS_;} head {return HEAD_;} header {return HEADER_;} height {return HEIGHT_;} helioecliptic {return HELIOECLIPTIC_;} hide {return HIDE_;} high {return HIGH_;} highlite {return HIGHLITE_;} histequ {return HISTEQU_;} histogram {return HISTOGRAM_;} horizontal {return HORIZONTAL_;} icrs {return ICRS_;} id {return ID_;} iis {return IIS_;} image {return IMAGE_;} include {return INCLUDE_;} incr {return INCR_;} info {return INFO_;} integer {return INTEGER_;} iteration {return ITERATION_;} iraf {return IRAF_;} irafmin {return IRAFMIN_;} j2000 {return J2000_;} key {return KEY_;} keyword {return KEYWORD_;} label {return LABEL_;} length {return LENGTH_;} level {return LEVEL_;} little {return LITTLEENDIAN_;} littleendian {return LITTLEENDIAN_;} line {return LINE_;} linear {return LINEAR_;} list {return LIST_;} load {return LOAD_;} local {return LOCAL_;} log {return LOG_;} low {return LOW_;} macosx {return MACOSX_;} magnifier {return MAGNIFIER_;} match {return MATCH_;} map {return MAP_;} mark {return MARK_;} marker {return MARKER_;} mask {return MASK_;} message {return MESSAGE_;} method {return METHOD_;} minmax {return MINMAX_;} mip {return MIP_;} mmap {return MMAP_;} mmapincr {return MMAPINCR_;} mode {return MODE_;} mosaic {return MOSAIC_;} motion {return MOTION_;} move {return MOVE_;} name {return NAME_;} nan {return NAN_;} native {return NATIVE_;} naxes {return NAXES_;} new {return NEW_;} next {return NEXT_;} no {return NO_;} none {return NONE_;} now {return NOW_;} nrrd {return NRRD_;} number {return NUMBER_;} object {return OBJECT_;} off {return OFF_;} on {return ON_;} only {return ONLY_;} option {return OPTION_;} orient {return ORIENT_;} pan {return PAN_;} panda {return CPANDA_;} panner {return PANNER_;} parser {return PARSER_;} paste {return PASTE_;} perf {return PERF_;} photo {return PHOTO_;} physical {return PHYSICAL_;} pixel {return PIXEL_;} plot2d {return PLOT2D_;} plot3d {return PLOT3D_;} point {return POINT_;} pointer {return POINTER_;} polygon {return POLYGON_;} postscript {return POSTSCRIPT_;} pow {return POW_;} print {return PRINT_;} preserve {return PRESERVE_;} projection {return PROJECTION_;} property {return PROPERTY_;} pros {return PROS_;} publication {return PUBLICATION_;} query {return QUERY_;} radial {return RADIAL_;} radius {return RADIUS_;} region {return REGION_;} replace {return REPLACE_;} resample {return RESAMPLE_;} reset {return RESET_;} resolution {return RESOLUTION_;} rgb {return RGB_;} root {return ROOT_;} rotate {return ROTATE_;} ruler {return RULER_;} sample {return SAMPLE_;} saoimage {return SAOIMAGE_;} saotng {return SAOTNG_;} save {return SAVE_;} scale {return SCALE_;} scan {return SCAN_;} scientific {return SCIENTIFIC_;} scope {return SCOPE_;} segment {return SEGMENT_;} select {return SELECT_;} set {return SET_;} sexagesimal {return SEXAGESIMAL_;} shape {return SHAPE_;} shared {return SHARED_;} shift {return SHIFT_;} shmid {return SHMID_;} show {return SHOW_;} sinh {return SINH_;} size {return SIZE_;} slice {return SLICE_;} smmap {return SMMAP_;} smooth {return SMOOTH_;} socket {return SOCKET_;} socketgz {return SOCKETGZ_;} source {return SOURCE_;} sqrt {return SQRT_;} squared {return SQUARED_;} sshared {return SSHARED_;} stats {return STATS_;} status {return STATUS_;} sum {return SUM_;} supergalactic {return SUPERGALACTIC_;} system {return SYSTEM_;} table {return TABLE_;} tag {return TAG_;} template {return TEMPLATE_;} text {return TEXT_;} threads {return THREADS_;} 3d {return THREED_;} threshold {return THRESHOLD_;} thick {return THICK_;} transparency {return TRANSPARENCY_;} to {return TO_;} toggle {return TOGGLE_;} tophat {return TOPHAT_;} true {return TRUE_;} type {return TYPE_;} undo {return UNDO_;} unload {return UNLOAD_;} unhighlite {return UNHIGHLITE_;} unselect {return UNSELECT_;} update {return UPDATE_;} user {return USER_;} value {return VALUE_;} var {return VAR_;} view {return VIEW_;} vector {return VECTOR_;} version {return VERSION_;} vertex {return VERTEX_;} vertical {return VERTICAL_;} warp {return WARP_;} wcs {return WCS_;} wcsa {return WCSA_;} wcsb {return WCSB_;} wcsc {return WCSC_;} wcsd {return WCSD_;} wcse {return WCSE_;} wcsf {return WCSF_;} wcsg {return WCSG_;} wcsh {return WCSH_;} wcsi {return WCSI_;} wcsj {return WCSJ_;} wcsk {return WCSK_;} wcsl {return WCSL_;} wcsm {return WCSM_;} wcsn {return WCSN_;} wcso {return WCSO_;} wcsp {return WCSP_;} wcsq {return WCSQ_;} wcsr {return WCSR_;} wcss {return WCSS_;} wcst {return WCST_;} wcsu {return WCSU_;} wcsv {return WCSV_;} wcsw {return WCSW_;} wcsx {return WCSX_;} wcsy {return WCSY_;} wcsz {return WCSZ_;} wcs0 {return WCS0_;} wfpc2 {return WFPC2_;} width {return WIDTH_;} win32 {return WIN32_;} xml {return XML_;} xy {return XY_;} yes {return YES_;} zmax {return ZMAX_;} zscale {return ZSCALE_;} zoom {return ZOOM_;} [+-]?{D}+ { // Integer frlval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number frlval->real = atof(yytext); return REAL; } 0[xX][0-9a-fA-F]+ { // Pointer frlval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } [+-]?{D}+"."?d | [+-]?{D}*"."{D}+d { // degrees yytext[yyleng-1] = '\0'; frlval->real = atof(yytext); return ANGDEGREE; } [+-]{D}+"."?r | [+-]{D}*"."{D}+r { // radians yytext[yyleng-1] = '\0'; frlval->real = atof(yytext); return ANGRADIAN; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // sexagesimal int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return SEXSTR; } [+-]?{D}+h{D}+m{D}+"."?s | [+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return HMSSTR; } [+-]?{D}+d{D}+m{D}+"."?s | [+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return DMSSTR; } \"[^\"]*\" | \'[^\']*\' { // Quoted String int ll = (yyleng-2)<(FRBUFSIZE-1) ? (yyleng-2):(FRBUFSIZE-1); strncpy(frlval->str,yytext+1,ll); // skip the " " frlval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}]*\} { // Quoted String int ll = (yyleng-2)<(FRBUFSIZE-1) ? (yyleng-2):(FRBUFSIZE-1); strncpy(frlval->str,yytext+1,ll); // skip the '{' frlval->str[ll] = '\0'; // Remove the '}' return STRING; } [!-~][!-~]+ { // General String-- at least 2 printable chars int ll = yyleng <(FRBUFSIZE-1) ? yyleng:(FRBUFSIZE-1); strncpy(frlval->str,yytext,ll); frlval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } . { // Else, return the char return toupper(yytext[0]); } %% saods9/tksao1.0/frame/line.C000644 000765 000000 00000020044 12544546070 016060 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "line.h" #include "fitsimage.h" Line::Line(Base* p, const Vector& ptr1, const Vector& ptr2) : BaseLine(p, ptr1, ptr2) { p1Arrow = 0; p2Arrow = 0; strcpy(type_,"line"); handle = new Vector[2]; numHandle = 2; updateBBox(); } Line::Line(Base* p, const Vector& ptr1, const Vector& ptr2, int a1, int a2, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseLine(p, ptr1, ptr2, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { p1Arrow = a1; p2Arrow = a2; strcpy(type_,"line"); handle = new Vector[2]; numHandle = 2; updateBBox(); } Line::Line(const Line& a) : BaseLine(a) { p1Arrow = a.p1Arrow; p2Arrow = a.p2Arrow; } void Line::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector aa = parent->mapFromRef(p1,sys); Vector bb = parent->mapFromRef(p2,sys); if (p1Arrow) { aa = modifyArrow(p2,p1,sys); renderXArrow(drawable,p2,p1,sys,lgc); } if (p2Arrow) { bb = modifyArrow(p1,p2,sys); renderXArrow(drawable,p1,p2,sys,lgc); } XDrawLine(display, drawable, lgc, aa[0], aa[1], bb[0], bb[1]); } void Line::renderPS(int mode) { renderPSGC(mode); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); if (p1Arrow) { aa = modifyArrow(p2,p1,Coord::CANVAS); renderPSArrow(p2,p1,Coord::CANVAS); } if (p2Arrow) { bb = modifyArrow(p1,p2,Coord::CANVAS); renderPSArrow(p1,p2,Coord::CANVAS); } ostringstream str; str << "newpath " << aa.TkCanvasPs(parent->canvas) << "moveto" << bb.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } #ifdef MAC_OSX_TK void Line::renderMACOSX() { renderMACOSXGC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); if (p1Arrow) { aa = modifyArrow(p2,p1,Coord::CANVAS); renderMACOSXArrow(p2,p1,Coord::CANVAS); } if (p2Arrow) { bb = modifyArrow(p1,p2,Coord::CANVAS); renderMACOSXArrow(p1,p2,Coord::CANVAS); } macosxDrawLine(aa,bb); } #endif #ifdef __WIN32 void Line::renderWIN32() { renderWIN32GC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); if (p1Arrow) { aa = modifyArrow(p2,p1,Coord::CANVAS); renderWIN32Arrow(p2,p1,Coord::CANVAS); } if (p2Arrow) { bb = modifyArrow(p1,p2,Coord::CANVAS); renderWIN32Arrow(p1,p2,Coord::CANVAS); } win32DrawLine(aa,bb); } #endif // Support void Line::updateHandles() { center = (p2-p1)/2 + p1; angle = (p2-p1).angle(); // generate handles in Coord::CANVAS coords handle[0] = parent->mapFromRef(p1,Coord::CANVAS); handle[1] = parent->mapFromRef(p2,Coord::CANVAS); } void Line::setArrows(int w1, int w2) { p1Arrow = w1 ? 1 : 0; p2Arrow = w2 ? 1 : 0; updateBBox(); } void Line::analysis(AnalysisTask mm, int which) { switch (mm) { case PLOT2D: if (!analysisPlot2d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot2dCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot2dCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisPlot2dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot2dCB_[1], parent->options->cmdName); } if (analysisPlot2d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot2dCB_[1]); } analysisPlot2d_ = which; break; default: // na break; } } void Line::analysisPlot2d(char* xname, char* yname, char* xcname, char* ycname, Coord::CoordSystem sys, Coord::SkyFrame sky, Marker::AnalysisMethod method) { double* x; double* y; double* xc; double* yc; int num = parent->markerAnalysisPlot2d(this, &x, &y, &xc, &yc, p1, p2, 0, sys, sky, method); analysisXYEEResult(xname, yname, xcname, ycname, x, y, xc, yc, num); } // list void Line::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v1 = ptr->mapFromRef(p1,sys,sky); Vector v2 = ptr->mapFromRef(p2,sys,sky); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra1[16], ra2[16]; char dec1[16], dec2[16]; { ptr->mapFromRef(p1,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra1 >> dec1; } { ptr->mapFromRef(p2,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra2 >> dec2; } str << type_ << '(' << ra1 << ',' << dec1 << ',' << ra2 << ',' << dec2 << ')'; } break; } } else { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } } } listPost(str, conj, strip); } void Line::listPost(ostream& str, int conj, int strip) { // no props for semicolons if (!strip) { if (conj) str << " ||"; str << " # line=" << p1Arrow << ' ' << p2Arrow; listProperties(str, 0); } else { if (conj) str << "||"; else str << ';'; } } void Line::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); Vector vv[2]; vv[0] = p1; vv[1] = p2; XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowPoint(ptr,sys,sky,format,vv,2); XMLRow(XMLPARAM,p1Arrow); XMLRow(XMLPARAM2,p2Arrow); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Line::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); listSAOtngPre(str, strip); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v1 = ptr->mapFromRef(p1,Coord::IMAGE); Vector v2 = ptr->mapFromRef(p2,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v1 = ptr->mapFromRef(p1,sys,sky); Vector v2 = ptr->mapFromRef(p2,sys,sky); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra1[16], ra2[16]; char dec1[16], dec2[16]; { ptr->mapFromRef(p1,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra1 >> dec1; } { ptr->mapFromRef(p2,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra2 >> dec2; } str << type_ << '(' << ra1 << ',' << dec1 << ',' << ra2 << ',' << dec2 << ')'; } break; } } } listSAOtngPost(str, strip); } saods9/tksao1.0/frame/line.h000644 000765 000000 00000002763 12544546070 016135 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __line_h__ #define __line_h__ #include "baseline.h" class Line : public BaseLine { protected: int p1Arrow; int p2Arrow; protected: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); public: Line(Base* p, const Vector& ptr1, const Vector& ptr2); Line(Base* p, const Vector& ptr1, const Vector& ptr2, int a1, int a2, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Line(const Line&); virtual Marker* dup() {return new Line(*this);} void setArrows(int,int); int getP1Arrow() {return p1Arrow;} int getP2Arrow() {return p2Arrow;} void analysis(AnalysisTask, int); void analysisPlot2d(char*, char*, char*, char*, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod); virtual void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); virtual void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); virtual void listPost(ostream&, int, int); void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); }; #endif saods9/tksao1.0/frame/marker.C000644 000765 000000 00000121257 12632340523 016413 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "marker.h" #include "fitsimage.h" extern "C" { #include "bltVector.h" } static int markerSeqID = 1; // hard coded const char* Marker::analysisHistogramCB_[] = { "MarkerAnalysisHistogramCB", "MarkerAnalysisHistogramDeleteCB" }; const char* Marker::analysisPlot2dCB_[] = { "MarkerAnalysisPlot2dCB", "MarkerAnalysisPlot2dDeleteCB" }; const char* Marker::analysisPlot3dCB_[] = { "MarkerAnalysisPlot3dCB", "MarkerAnalysisPlot3dDeleteCB" }; const char* Marker::analysisPandaCB_[] = { "MarkerAnalysisPandaCB", "MarkerAnalysisPandaDeleteCB" }; const char* Marker::analysisRadialCB_[] = { "MarkerAnalysisRadialCB", "MarkerAnalysisRadialDeleteCB" }; const char* Marker::analysisStatsCB_[] = { "MarkerAnalysisStatsCB", "MarkerAnalysisStatsDeleteCB" }; // Marker Members Public Marker::Marker(Base* p, const Vector& ctr, double ang) { id = markerSeqID++; type_[0] = '\0'; parent = p; center = ctr; angle = ang; handle = NULL; numHandle = 0; colorName = dupstr("green"); color = parent->getColor(colorName); lineWidth = 1; properties = INCLUDE|SOURCE; selected = 0; highlited = 0; dlist[0] = 8; dlist[1] = 3; text = dupstr(""); tkfont_ =NULL; psfont_ =NULL; initFonts("helvetica 10 normal roman"); comment = dupstr(""); display = parent->display; gc = parent->markerGC; gcxor = parent->markerGCXOR; for (int ii=0; ii& tg, const List& cb) { id = markerSeqID++; type_[0] = '\0'; parent = p; center = ctr; angle = ang; handle = NULL; numHandle = 0; colorName = dupstr(clr); color = parent->getColor(colorName); lineWidth = w; properties = prop; selected = 0; highlited = 0; dlist[0] = dsh[0]; dlist[1] = dsh[1]; text = dupstr(t); tkfont_ =NULL; psfont_ =NULL; initFonts(f); comment = dupstr(c); display = parent->display; gc = parent->markerGC; gcxor = parent->markerGCXOR; for (int ii=0; iiinterp, parent->tkwin, Tk_NameOfFont(a.tkfont_)) : NULL; psfont_ = a.psfont_ ? Tk_GetFont(parent->interp, parent->tkwin, Tk_NameOfFont(a.psfont_)) : NULL; comment = dupstr(a.comment); display = a.display; gc = a.gc; gcxor = a.gcxor; for (int ii=0; iicanvasToWidget).round(); Vector ur = (handle[2]*parent->canvasToWidget).round(); if (mode==SRC) XSetForeground(display, gc, parent->getColor("red")); XDrawLine(display, drawable, lgc, ll[0], ll[1], ur[0], ur[1]); } } void Marker::renderXText(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { if (text && *text && tkfont_) { GC lgc; switch (mode) { case SRC: lgc = gc; XSetForeground(display, gc, color); break; case XOR: lgc = gcxor; break; } XSetFont(display, lgc, Tk_FontId(tkfont_)); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); int width = Tk_TextWidth(tkfont_, text, strlen(text)); Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector ll0 = bbox.ll*parent->canvasToRef; Vector ll = ll0*mm; Vector ur0 = bbox.ur*parent->canvasToRef; Vector ur = ur0*mm; BBox bb(ll,ur); Vector bbc = bb.center(); Vector tt = Vector(bbc[0], bb.ll[1]) * Translate(-width/2., -metrics.descent); Tk_DrawChars(display, drawable, lgc, tkfont_, text, strlen(text), tt[0], tt[1]); } } void Marker::renderXArrow(Drawable drawable, const Vector& p1, const Vector& p2, Coord::InternalSystem sys, GC lgc) { Vector* vv = arrow(p1,p2,sys); XPoint dd[6]; for (int ii=0; ii<6; ii++) { dd[ii].x = (short)vv[ii][0]; dd[ii].y = (short)vv[ii][1]; } XFillPolygon(display, drawable, lgc, dd, 6, Nonconvex, CoordModeOrigin); delete [] vv; } void Marker::renderXHandles(Drawable drawable) { // handles are of length 5 if (selected && canSelect()) { XSetForeground(display, gc, color); for (int ii=0; iicanvasToWidget - Vector(2,2)).round(); XFillRectangle(display, drawable, gc, vv[0], vv[1], 5, 5); } } } GC Marker::renderXGC(RenderMode mode) { // set width, color, dash switch (mode) { case SRC: XSetForeground(display, gc, color); if ((properties & SOURCE) && !(properties & DASH)) renderXLineNoDash(gc); else renderXLineDash(gc); return gc; case XOR: renderXLineDash(gcxor); return gcxor; } } void Marker::renderXLineDash(GC lgc) { char dl[2]; #ifdef __WIN32 dl[0] = dlist[0]/2; dl[1] = dlist[1]/2; #else dl[0] = dlist[0]; dl[1] = dlist[1]; #endif int ww = (highlited && canHighlite()) ? lineWidth*2 : lineWidth; XSetDashes(display, lgc, 0, dl, 2); XSetLineAttributes(display, lgc, ww, LineOnOffDash, CapButt, JoinMiter); } void Marker::renderXLineNoDash(GC lgc) { int ww = (highlited && canHighlite()) ? lineWidth*2 : lineWidth; XSetLineAttributes(display, lgc, ww, LineSolid, CapButt, JoinMiter); } void Marker::ps(int mode, int tt) { if (properties & HIDDEN) return; if (tt) renderPSText(mode); renderPS(mode); renderPSInclude(mode); } void Marker::renderPSInclude(int mode) { if (!(properties & INCLUDE)) { renderPSColor(mode, parent->getXColor("red")); Vector ll = handle[0]; Vector ur = handle[2]; ostringstream str; str << "newpath " << ll.TkCanvasPs(parent->canvas) << "moveto" << ur.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } void Marker::renderPSText(int mode) { if (text && *text && psfont_) { renderPSColor(mode, parent->getXColor(colorName)); ostringstream str; const char* ff = Tk_NameOfFont(psfont_); str << '/' << psFontName(ff) << " findfont " << int(psFontSize(ff)*parent->getDisplayRatio()) << " scalefont setfont" << endl; Vector bbc = bbox.center(); Vector tt = Vector(bbc[0], bbox.ll[1]).TkCanvasPs(parent->canvas); str << "gsave" << endl << "newpath " << endl << tt << " moveto" << endl << '(' << psQuote(text) << ')' << endl << "dup true charpath pathbbox " << endl << "closepath " << endl << "3 -1 roll sub 2.5 div " << endl << "3 1 roll sub 2 div exch " << endl << tt << " moveto rmoveto show " << endl << "grestore" << endl; str << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); } } void Marker::renderPSArrow(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Vector* vv = arrow(p1,p2,sys); ostringstream str; str << "newpath " << endl << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl; for (int ii=1; ii<6; ii++) str << vv[ii].TkCanvasPs(parent->canvas) << " lineto" << endl; str << "closepath fill" << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); delete [] vv; } void Marker::renderPSGC(int mode) { // set width, color, dash renderPSColor(mode, parent->getXColor(colorName)); if ((properties & SOURCE) && !(properties & DASH)) renderPSLineNoDash(); else renderPSLineDash(); } void Marker::renderPSLineDash() { ostringstream str; str << lineWidth << " setlinewidth" << endl << '[' << dlist[0] << ' ' << dlist[1] << "] 0 setdash" << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); } void Marker::renderPSLineNoDash() { ostringstream str; str << lineWidth << " setlinewidth" << endl << "[] 0 setdash" << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); } void Marker::renderPSColor(int mode, XColor* clr) { ostringstream str; switch ((Widget::PSColorSpace)mode) { case Widget::BW: case Widget::GRAY: psColorGray(clr, str); str << " setgray"; break; case Widget::RGB: psColorRGB(clr, str); str << " setrgbcolor"; break; case Widget::CMYK: psColorCMYK(clr, str); str << " setcmykcolor"; break; } str << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); } #ifdef MAC_OSX_TK void Marker::macosx(int tt) { if (properties & HIDDEN) return; if (tt) renderMACOSXText(); renderMACOSX(); renderMACOSXInclude(); } void Marker::renderMACOSXInclude() { if (!(properties & INCLUDE)) { macosxColor(parent->getXColor("red")); Vector ll = handle[0]; Vector ur = handle[2]; macosxDrawLine(ll,ur); } } void Marker::renderMACOSXText() { if (text && *text && psfont_) { macosxColor(parent->getXColor(colorName)); Tcl_DString psdstr; Tcl_DStringInit(&psdstr); int psSize = Tk_PostscriptFontName(psfont_, &psdstr); macosxFont(Tcl_DStringValue(&psdstr), psSize); Tcl_DStringFree(&psdstr); Tk_FontMetrics metrics; Tk_GetFontMetrics(psfont_, &metrics); int width = Tk_TextWidth(psfont_, text, strlen(text)); Vector bbc = bbox.center(); Vector tt = Vector(bbc[0], bbox.ll[1]) * Translate(-width/2., -metrics.descent); macosxDrawText(tt, 0, text); } } void Marker::renderMACOSXArrow(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Vector* vv = arrow(p1,p2,sys); Vector dd[6]; for (int ii=0; ii<6; ii++) dd[ii] = vv[ii]; macosxFillPolygon(dd,6); delete [] vv; } void Marker::renderMACOSXGC() { // set width, color, dash macosxColor(parent->getXColor(colorName)); if ((properties & SOURCE) && !(properties & DASH)) renderMACOSXLineNoDash(); else renderMACOSXLineDash(); } void Marker::renderMACOSXLineDash() { macosxWidth(lineWidth); macosxDash(dlist,2); } void Marker::renderMACOSXLineNoDash() { macosxWidth(lineWidth); macosxDash(NULL,0); } #endif #ifdef __WIN32 void Marker::win32(int tt) { if (properties & HIDDEN) return; if (tt) renderWIN32Text(); renderWIN32(); renderWIN32Include(); } void Marker::renderWIN32Include() { if (!(properties & INCLUDE)) { win32Color(parent->getXColor("red")); Vector ll = handle[0]; Vector ur = handle[2]; win32DrawLine(ll,ur); } } void Marker::renderWIN32Text() { if (text && *text && tkfont_) { win32Color(parent->getXColor(colorName)); win32Font(tkfont_); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); int width = Tk_TextWidth(tkfont_, text, strlen(text)); BBox bb = bbox; Vector bbc = bb.center(); Vector tt = Vector(bbc[0], bbox.ll[1]) * Translate(-width/2., -metrics.descent); win32DrawText(tt, 0, text); } } void Marker::renderWIN32Arrow(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Vector* vv = arrow(p1,p2,sys); Vector dd[6]; for (int ii=0; ii<6; ii++) dd[ii] = vv[ii]; win32FillPolygon(dd,6); delete [] vv; } void Marker::renderWIN32GC() { // set width, color, dash win32Color(parent->getXColor(colorName)); if ((properties & SOURCE) && !(properties & DASH)) renderWIN32LineNoDash(); else renderWIN32LineDash(); } void Marker::renderWIN32LineDash() { win32Width(lineWidth); win32Dash(dlist,2); } void Marker::renderWIN32LineNoDash() { win32Width(lineWidth); win32Dash(NULL,0); } #endif // Support void Marker::updateBBox() { // generate handles updateHandles(); // bound handles bbox = BBox(handle[0]); for (int ii=1; iicentroid(center); updateBBox(); doCallBack(CallBack::MOVECB); } void Marker::moveTo(const Vector& v) { center=v; updateBBox(); doCallBack(CallBack::MOVECB); } void Marker::moveBegin() { doCallBack(CallBack::MOVEBEGINCB); } void Marker::move(const Vector& v) { center+=v; updateBBox(); doCallBack(CallBack::MOVECB); } void Marker::moveEnd() { doCallBack(CallBack::MOVEENDCB); } void Marker::editBegin(int) { doCallBack(CallBack::EDITBEGINCB); } void Marker::edit(const Vector& v, int h) { doCallBack(CallBack::EDITCB); } void Marker::editEnd() { doCallBack(CallBack::EDITENDCB); } void Marker::rotateBegin() { doCallBack(CallBack::ROTATEBEGINCB); } void Marker::rotate(const Vector& v, int h) { // v is in ref coords // handles are in canvas coords double a = (v * Translate(-center) * FlipY()).angle(); double b = ((parent->mapToRef(handle[h-1],Coord::CANVAS) * Translate(-center) * FlipY())).angle(); angle -= a-b; updateBBox(); doCallBack(CallBack::ROTATECB); } void Marker::rotateEnd() { doCallBack(CallBack::ROTATEENDCB); } void Marker::select() { // only call the CB if not already selected if (!selected) doCallBack(CallBack::SELECTCB); selected = 1; } void Marker::unselect() { // only call the CB if already selected if (selected) doCallBack(CallBack::UNSELECTCB); selected = 0; } void Marker::toggleSelect() { selected = !selected; if (selected) doCallBack(CallBack::SELECTCB); else doCallBack(CallBack::UNSELECTCB); } void Marker::highlite() { // only call the CB if not already highlited if (!highlited) doCallBack(CallBack::HIGHLITECB); highlited = 1; } void Marker::unhighlite() { // only call the CB if already highlited if (highlited) doCallBack(CallBack::UNHIGHLITECB); highlited = 0; } void Marker::toggleHighlite() { highlited = !highlited; if (highlited) doCallBack(CallBack::HIGHLITECB); else doCallBack(CallBack::UNHIGHLITECB); } void Marker::key() { doCallBack(CallBack::KEYCB); } Vector Marker::getHandle(int h) { if (hgetColor(colorName); doCallBack(CallBack::COLORCB); } void Marker::setLineWidth(int w) { lineWidth = w; doCallBack(CallBack::LINEWIDTHCB); } void Marker::setFont(const char* f) { initFonts(f); updateBBox(); doCallBack(CallBack::FONTCB); } void Marker::initFonts(const char* ff) { if (tkfont_) Tk_FreeFont(tkfont_); tkfont_ = NULL; if (psfont_) Tk_FreeFont(psfont_); psfont_ = NULL; const char* dd = "helvetica 9 roman normal"; if (!ff) ff = dd; psfont_ = Tk_GetFont(parent->interp, parent->tkwin, ff); // determine tkfont from psfont string x(ff); istringstream str(x); char family[16] = ""; int size = 0; char weight[16] = ""; char slant[16] = ""; str >> family >> size >> weight >> slant; // old regions files will not have a slant if (strncmp(slant,"roma",4) && strncmp(slant,"ital",4)) strcpy(slant,"roman"); #ifdef MAC_OSX_TK size *= parent->getDisplayRatio(); #endif char* ptr =NULL; if (!strncmp(family,"helvetica",4)) ptr = parent->options->helvetica; else if (!strncmp(family,"times",4)) ptr = parent->options->times; else if (!strncmp(family,"courier",4)) ptr = parent->options->courier; else ptr = parent->options->helvetica; ostringstream fstr; fstr << '{' << ptr << '}' << ' ' << size << ' ' << weight << ' ' << slant << ends; tkfont_ = Tk_GetFont(parent->getInterp(), parent->getTkwin(), fstr.str().c_str()); } const char* Marker::getFont() { if (psfont_) return Tk_NameOfFont(psfont_); else return NULL; } void Marker::addTag(const char* tg) { Tag* t = new Tag(tg); tags.append(t); } void Marker::editTag(const char* from, const char* to) { // change any tags { Tag* t = tags.head(); while (t) { if (!strcmp(t->tag(),from)) { t->set(to); } t=t->next(); } } // now, remove duplicates { Tag* t = tags.head(); while (t) { Tag* tt=t->next(); while (tt) { if (!strcmp(t->tag(),tt->tag())) { Tag* ntt = tags.extractNext(tt); delete tt; tt = ntt; } else tt=tt->next(); } t=t->next(); } } } void Marker::deleteTags() { tags.deleteAll(); } void Marker::deleteTag(const char* tg) { Tag* t = tags.head(); while (t) { if (!strcmp(t->tag(),tg)) { tags.extractNext(t); delete t; return; } t = t->next(); } } void Marker::deleteTag(int w) { Tag* t = tags.head(); for (int i=0; inext(); else break; if (t) { tags.extractNext(t); delete t; } } const char* Marker::getTag() { Tag* t = tags.head(); if (t) return t->tag(); else return NULL; } const char* Marker::getNextTag() { Tag* t = tags.next(); if (t) return t->tag(); else return NULL; } const char* Marker::getTag(int w) { Tag* t = tags.head(); for (int i=0; inext(); else break; if (t) return t->tag(); else return NULL; } int Marker::hasTag(const char* tg) { Tag* t = tags.head(); while (t) { if (!strcmp(t->tag(),tg)) return 1; t = t->next(); } return 0; } int Marker::onHandle(const Vector& v) { // return handle number // work last to first for annuli for (int ii=numHandle-1; ii>=0; ii--) { BBox bb(handle[ii]); bb.expand(parent->markerEpsilon); if (bb.isIn(v)) return ii+1; } return 0; } int Marker::getProperty(unsigned short which) { return (properties & which) ? 1 : 0; } void Marker::setText(const char* str) { if (text) delete [] text; text = dupstr(str); updateBBox(); doCallBack(CallBack::TEXTCB); } void Marker::setProperty(unsigned short prop, int value) { if (value) properties |= prop; else properties &= ~prop; if (prop == FIXED) // bbox will change updateBBox(); doCallBack(CallBack::PROPERTYCB); } int Marker::addCallBack(CallBack::Type t, const char* proc, const char* arg) { CallBack* cb = new CallBack(parent->interp, t, proc, arg); if (cb) { callbacks.append(cb); return TCL_OK; } return TCL_ERROR; } void Marker::deleteCallBack(CallBack::Type t) { CallBack* cb = callbacks.head(); while (cb) { if (cb->type() == t) { CallBack* next = callbacks.extractNext(cb); delete cb; cb = next; } else cb = cb->next(); } } int Marker::deleteCallBack(CallBack::Type t, const char* proc) { CallBack* cb = callbacks.head(); while (cb) { if (cb->type() == t && (!strcmp(cb->proc(), proc))) { callbacks.extractNext(cb); delete cb; return TCL_OK; } else cb = cb->next(); } return TCL_ERROR; } int Marker::isIn(const Vector& vv, Coord::InternalSystem sys) { Vector rr = parent->mapToRef(vv,sys); Vector ss = parent->mapFromRef(rr,Coord::CANVAS); return bbox.isIn(ss); } // assume Coord::REF int Marker::isIn(const Vector& vv, const Matrix& bck) { Vector ss = parent->mapFromRef(vv,Coord::CANVAS); return bbox.isIn(ss); } int Marker::isVisible(const BBox& b) { // assume visible, prove otherwise // all coords are in canvas coords BBox bb(b); return !((allBBox.ur[0] < bb.ll[0]) || (allBBox.ll[0] > bb.ur[0]) || (allBBox.ur[1] < bb.ll[1]) || (allBBox.ll[1] > bb.ur[1])); } void Marker::doCallBack(CallBack::Type t) { if (!doCB) return; ostringstream str; str << id << ends; CallBack* cb=callbacks.head(); while (cb) { if (cb->type() == t) if (cb->eval(str.str().c_str())) { ostringstream estr; estr << "Unable to eval Marker CallBack " << cb->proc() << " : " << Tcl_GetStringResult(parent->interp) << ends; internalError(estr.str().c_str()); } cb=cb->next(); } } double Marker::calcAngle() { switch (parent->getOrientation()) { case Coord::NORMAL: case Coord::XY: return angle + parent->getRotation(); case Coord::XX: case Coord::YY: return -angle + parent->getRotation(); } } Vector Marker::modifyArrow(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { const int tip = 6; // length from end of line to tip of arrow Vector aa = parent->mapFromRef(p1,sys); Vector bb = parent->mapFromRef(p2,sys); Vector nn = (bb-aa).normalize(); double ll = (bb-aa).length(); return nn * Scale(ll-tip) * Translate(aa); } Vector* Marker::arrow(const Vector& p1, const Vector& p2, Coord::InternalSystem sys) { Vector p3; if (((p2-p1)[0]) == 0) p3 = p1+Vector(1,0); else p3 = p1+Vector(0,1); Vector3d aa = parent->mapFromRef3d(p1,sys); Vector3d bb = parent->mapFromRef3d(p2,sys); Vector3d cc = parent->mapFromRef3d(p3,sys); const int tip = 6; // length from end of line to tip of arrow const int tail = 2; // length from end of line to tails of arrow const int wc = 2; // width of arrow at end of line const int wt = 3; // width of arrow at tails // build in Y-Z plane, align on z axis Vector3d vv[6]; vv[0] = Vector3d(0,0,tip); vv[1] = Vector3d(0,-wc,0); vv[2] = Vector3d(0,-wt,-tail); vv[3] = Vector3d(0,0,0); vv[4] = Vector3d(0,wt,-tail); vv[5] = Vector3d(0,wc,0); Vector3d l1 = (aa-bb).normalize(); Vector3d l2 = (aa-cc).normalize(); Vector3d rz = -l1; Vector3d rx = (cross(l1,l2)).normalize(); Vector3d ry = cross(rz,rx); Matrix3d rr(rx,ry,rz); Matrix3d mm = Translate3d(0,0,-tip) * Scale3d(1.5) * rr.invert() * Translate3d(bb); Vector* ww = new Vector[6]; for (int ii=0; ii<6; ii++) ww[ii] = vv[ii]*mm; return ww; } void Marker::analysisXYEEResult(char* xname, char* yname, char* xcname, char* ycname, double* x, double* y, double* xc, double* yc, int num) { Blt_Vector* xx; Blt_GetVector(parent->getInterp(), xname, &xx); Blt_ResetVector(xx, x, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* yy; Blt_GetVector(parent->getInterp(), yname, &yy); Blt_ResetVector(yy, y, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* xxc; Blt_GetVector(parent->getInterp(), xcname, &xxc); Blt_ResetVector(xxc, xc, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* yyc; Blt_GetVector(parent->getInterp(), ycname, &yyc); Blt_ResetVector(yyc, yc, num, num*sizeof(double), TCL_DYNAMIC); } void Marker::analysisXYResult(char* xname, char* yname, double* x, double* y, int num) { Blt_Vector* xx; Blt_GetVector(parent->getInterp(), xname, &xx); Blt_ResetVector(xx, x, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* yy; Blt_GetVector(parent->getInterp(), yname, &yy); Blt_ResetVector(yy, y, num, num*sizeof(double), TCL_DYNAMIC); } void Marker::analysisXYEResult(char* xname, char* yname, char* ename, double* x, double* y, double* e, int num) { Blt_Vector* xx; Blt_GetVector(parent->getInterp(), xname, &xx); Blt_ResetVector(xx, x, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* yy; Blt_GetVector(parent->getInterp(), yname, &yy); Blt_ResetVector(yy, y, num, num*sizeof(double), TCL_DYNAMIC); Blt_Vector* ee; Blt_GetVector(parent->getInterp(), ename, &ee); Blt_ResetVector(ee, e, num, num*sizeof(double), TCL_DYNAMIC); } void Marker::analysisXYEResult(double* x, double* y, double* e, int num) { for (int ii=0; iiinterp, str.str().c_str(), NULL); } } Matrix Marker::fwdMatrix() { return Rotate(angle) * FlipY() * Translate(center); } Matrix Marker::bckMatrix() { return Translate(-center) * FlipY() * Rotate(-angle); } Vector Marker::fwdMap(const Vector& vv, Coord::InternalSystem sys) { return parent->mapFromRef(vv * Rotate(angle) * FlipY() * Translate(center),sys); } Vector Marker::bckMap(const Vector& vv, Coord::InternalSystem sys) { return parent->mapToRef(vv,sys) * Translate(-center) * FlipY() * Rotate(-angle); } void Marker::setMatrices(Coord::InternalSystem sys, Matrix* fwd, Matrix* bck) { switch (sys) { case Coord::WIDGET: *fwd = parent->refToWidget; *bck = parent->widgetToRef; break; case Coord::CANVAS: *fwd = parent->refToCanvas; *bck = parent->canvasToRef; break; case Coord::WINDOW: *fwd = parent->refToWindow; *bck = parent->windowToRef; break; case Coord::MAGNIFIER: *fwd = parent->refToMagnifier; *bck = parent->magnifierToRef; break; default: // na break; } } // list void Marker::listPre(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, FitsImage* ptr, int strip, int hash) { // no props for semicolons if (!strip) { FitsImage* fits = parent->findFits(); if (fits && fits->nextMosaic()) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: str << "# tile " << parent->findFits(ptr) << endl; break; default: if (!parent->findFits()->hasWCSCel(sys)) str << "# tile " << parent->findFits(ptr) << endl; } } if (hash) str << "# "; } if (!(properties&INCLUDE)) str << '-'; } void Marker::listPost(ostream& str, int conj, int strip) { // no props for semicolons if (!strip) { if (conj) str << " ||"; listProperties(str,1); } else { if (conj) str << "||"; else str << ';'; } } void Marker::listProperties(ostream& str, int hash) { if (strncmp("green",colorName,5) || dlist[0] != 8 || dlist[1] != 3 || (lineWidth != 1) || strncmp("helvetica 10 normal roman",getFont(),25) || text[0] || !(properties&SELECT) || !(properties&HIGHLITE) || (properties&DASH) || (properties&FIXED) || !(properties&EDIT) || !(properties&MOVE) || !(properties&ROTATE) || !(properties&DELETE) || !(properties&SOURCE) || (tags.count() > 0) || (comment && *comment)) { if (hash) str << " #"; listProps(str); } str << endl; } void Marker::listProps(ostream& str) { if (strncmp("green",colorName,5)) str << " color=" << colorName; if (dlist[0] != 8 || dlist[1] != 3) str << " dashlist=" << dlist[0] << ' ' << dlist[1]; if (lineWidth != 1) str << " width=" << lineWidth; if (strncmp("helvetica 10 normal roman", getFont(), 25)) str << " font=\"" << getFont() << '"'; if (text && *text) // only list text if there is something to list str << " text={" << text << '}'; if (!(properties&SELECT)) str << " select=0"; if (!(properties&HIGHLITE)) str << " highlite=0"; if (properties&DASH) str << " dash=1"; if (properties&FIXED) str << " fixed=1"; if (!(properties&EDIT)) str << " edit=0"; if (!(properties&MOVE)) str << " move=0"; if (!(properties&ROTATE)) str << " rotate=0"; if (!(properties&DELETE)) str << " delete=0"; if (!(properties&SOURCE)) str << " background"; // tags Tag* t = tags.head(); while (t) { str << " tag={" << t->tag() << '}'; t = t->next(); } if (comment && *comment) str << ' ' << comment; } void Marker::listCiaoPre(ostream& str) { if (!(properties&INCLUDE)) str << '-'; } void Marker::listCiaoPost(ostream& str, int strip) { str << (strip ? ';' : '\n'); } void Marker::listProsPost(ostream& str, int strip) { str << (strip ? ';' : '\n'); } void Marker::listSAOtngPre(ostream& str, int strip) { if (!strip && text[0]) str << '#' << text << endl; if (properties&INCLUDE) str << '+'; else str << '-'; } void Marker::listSAOtngPost(ostream& str, int strip) { if (!strip) { str << " # "; if (comment && *comment) str << comment; else if (!(properties&SOURCE)) str << "background"; else str << colorName; } str << (strip ? ';' : '\n'); } void Marker::listSAOimagePre(ostream& str) { if (!(properties&INCLUDE)) str << '-'; } void Marker::listSAOimagePost(ostream& str, int strip) { str << (strip ? ';' : '\n'); } void Marker::listXY(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: str << setprecision(8) << ptr->mapFromRef(center,sys); break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: str << setprecision(8) << ptr->mapFromRef(center,sys,sky); break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << ra << ' ' << dec; } break; } } else { str << setprecision(8) << ptr->mapFromRef(center,sys); } } break; } str << (strip ? ';' : '\n'); } void Marker::XMLRowInit() { for (int ii=0; iifindFits(); if (fits && fits->nextMosaic()) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: str << parent->findFits(ptr) << ends; break; default: if (!parent->findFits()->hasWCSCel(sys)) str << parent->findFits(ptr) << ends; break; } } if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(str.str().c_str()); } // color { XMLColName col = XMLCOLOR; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(colorName); } // width { ostringstream str; str << lineWidth << ends; XMLColName col = XMLWIDTH; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(str.str().c_str()); } // text if (text && *text) { XMLColName col = XMLTEXT; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(text); } // font { XMLColName col = XMLFONT; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(getFont()); } XMLRowProp(XMLSELECT,SELECT); XMLRowProp(XMLHIGHLITE,HIGHLITE); XMLRowProp(XMLEDIT,EDIT); XMLRowProp(XMLMOVE,MOVE); XMLRowProp(XMLROTATE,ROTATE); XMLRowProp(XMLDELETE,DELETE); XMLRowProp(XMLFIXED,FIXED); XMLRowProp(XMLINCLUDE,INCLUDE); XMLRowProp(XMLSOURCE,SOURCE); XMLRowProp(XMLDASH,DASH); // dashlist { ostringstream str; str << dlist[0] << ',' << dlist[1] << ends; XMLColName col = XMLDASHLIST; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(str.str().c_str()); } // tags { ostringstream str; Tag* start = tags.head(); Tag* ptr = start; while (ptr) { if (ptr != start) str << ' '; char* tag = (char*)ptr->tag(); while (*tag) { if (*tag == ' ') str << " "; else str << *tag; tag++; } ptr = ptr->next(); } str << ends; XMLColName col = XMLTAG; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(str.str().c_str()); } // comment if (comment && *comment) { XMLColName col = XMLCOMMENT; if (XMLCol[col]) delete [] XMLCol[col]; XMLCol[col] = dupstr(comment); } } void Marker::XMLRowEnd(ostream& str) { str << ""; for (int ii=0; ii"; if (XMLCol[ii]) { char* ss = XMLQuote(XMLCol[ii]); str << ss; delete [] XMLCol[ii]; delete [] ss; XMLCol[ii] = NULL; } str << ""; } str << "" << endl; } void Marker::XMLRowProp(XMLColName col, Property prop) { ostringstream str; if (properties & prop) str << "1"; else str << "0" << ends; XMLCol[col] = dupstr(str.str().c_str()); } void Marker::XMLRowPoint(FitsImage* ptr, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Vector vv) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(vv,sys); XMLRow(XMLX,v[0]); XMLRow(XMLY,v[1]); } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(vv,sys,sky); XMLRow(XMLX,v[0]); XMLRow(XMLY,v[1]); } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(vv,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; XMLRow(XMLX,ra); XMLRow(XMLY,dec); } break; } } else { Vector v = ptr->mapFromRef(vv,sys); XMLRow(XMLX,v[0]); XMLRow(XMLY,v[1]); } } } } void Marker::XMLRowPoint(FitsImage* ptr, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, Vector* vv, int cnt) { switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { double xx[cnt]; double yy[cnt]; for (int ii=0; iimapFromRef(vv[ii],sys); xx[ii] = v[0]; yy[ii] = v[1]; } XMLRow(XMLXV,xx,cnt); XMLRow(XMLYV,yy,cnt); } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { double xx[cnt]; double yy[cnt]; for (int ii=0; iimapFromRef(vv[ii],sys,sky); xx[ii] = v[0]; yy[ii] = v[1]; } XMLRow(XMLXV,xx,cnt); XMLRow(XMLYV,yy,cnt); } break; case Coord::SEXAGESIMAL: { char* xx[cnt]; char* yy[cnt]; for (int ii=0; iimapFromRef(vv[ii],sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; xx[ii] = dupstr(ra); yy[ii] = dupstr(dec); } XMLRow(XMLXV,xx,cnt); XMLRow(XMLYV,yy,cnt); for (int ii=0; iimapFromRef(vv[ii],sys); xx[ii] = v[0]; yy[ii] = v[1]; } XMLRow(XMLXV,xx,cnt); XMLRow(XMLYV,yy,cnt); } } } } void Marker::XMLRowRadiusX(FitsImage* ptr, Coord::CoordSystem sys, Vector vv) { double rr = ptr->mapLenFromRef(vv[0],sys,Coord::ARCSEC); XMLRow(XMLR,rr); } void Marker::XMLRowRadiusX(FitsImage* ptr, Coord::CoordSystem sys, Vector* vv, int cnt) { double rr[cnt]; for (int ii=0; iimapLenFromRef(vv[ii][0],sys,Coord::ARCSEC); XMLRow(XMLRV,rr,cnt); } void Marker::XMLRowRadius(FitsImage* ptr, Coord::CoordSystem sys, Vector vv) { Vector v = ptr->mapLenFromRef(vv,sys,Coord::ARCSEC); XMLRow(XMLR,v[0]); XMLRow(XMLR2,v[1]); } void Marker::XMLRowRadius(FitsImage* ptr, Coord::CoordSystem sys, Vector* vv, int cnt) { double rr[cnt]; double rr2[cnt]; for (int ii=0; iimapLenFromRef(vv[ii],sys,Coord::ARCSEC); rr[ii] = v[0]; rr2[ii] = v[1]; } XMLRow(XMLRV,rr,cnt); XMLRow(XMLRV2,rr2,cnt); } void Marker::XMLRowAng(Coord::CoordSystem sys, Coord::SkyFrame sky) { XMLRow(XMLANG, radToDeg(parent->mapAngleFromRef(angle,sys,sky))); } void Marker::XMLRowAng(Coord::CoordSystem sys, Coord::SkyFrame sky, double* ang, int cnt) { double aa[cnt]; for (int ii=0; iimapAngleFromRef(ang[ii],sys,sky)); XMLRow(XMLANGV,aa,cnt); } char* Marker::XMLQuote(char* src) { char* dest = new char[strlen(src)*7+1]; char* sptr = src; char* dptr = dest; while (sptr && *sptr) { if (*sptr == '&') { // special case, char entities if (*(sptr+1) == '#') { *dptr++ = *sptr; } else { memcpy(dptr,"&",5); dptr += 5; } } else if (*sptr == '<') { memcpy(dptr,"<",4); dptr += 4; } else if (*sptr == '>') { memcpy(dptr,">",4); dptr += 4; } else if (*sptr == '\'') { memcpy(dptr,"'",6); dptr += 6; } else if (*sptr == '"') { memcpy(dptr,""",6); dptr += 6; } else *dptr++ = *sptr; sptr++; } *dptr = '\0'; return dest; } // special composite funtionallity void Marker::setComposite(const Matrix& mx, double aa) { center *= mx; angle += aa; updateBBox(); } void Marker::setComposite(const char* clr, int w, int h) { lineWidth = w; if (colorName) delete [] colorName; colorName = dupstr(clr); color = parent->getColor(colorName); highlited = h; } saods9/tksao1.0/frame/marker.h000644 000765 000000 00000025676 12544546070 016477 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __marker_h__ #define __marker_h__ #include #include "vector.h" #include "vector3d.h" #include "callback.h" #include "list.h" #include "tag.h" #include "coord.h" #include "xml.h" #define POINTSIZE 11 class Base; class FitsImage; class Vector; class Marker { public: // Select-- user may select the marker // Highlite-- user may highlite the marker // Edit-- user may edit the marker // Move-- user may move the marker // Rotate-- user may rotate the marker // Delete-- user may delete the marker // Fixed-- marker is fixed in size (not scaled based on zoom) // Include-- marker is 'included' or 'excluded' ie '+' or '-' // Source-- marker is a 'source' or 'background' marker // Dash-- render with dashed line // Hide-- hidden marker enum Property {NONE=0, SELECT=1, HIGHLITE=2, EDIT=4, MOVE=8, ROTATE=16, DELETE=32, FIXED=64, INCLUDE=128, SOURCE=256, DASH=512, HIDDEN=1024}; enum RenderMode {SRC,XOR}; enum HandleMode {HANDLES,NOHANDLES}; enum AnalysisTask {STATS,PLOT2D,PLOT3D,RADIAL,PANDA,HISTOGRAM}; enum AnalysisMethod {SUM,AVERAGE}; protected: int id; char type_[64]; Base* parent; Vector center; // ref coordinates BBox bbox; // canvas coordinates BBox allBBox; // canvas coordinates double angle; // radians Vector* handle; // canvas coordinates int numHandle; char* colorName; unsigned long color; int lineWidth; unsigned short properties; int selected; int highlited; float dlist[2]; char* text; Tk_Font tkfont_; Tk_Font psfont_; char* comment; Display* display; GC gc; GC gcxor; int doCB; List tags; List callbacks; Marker* previous_; Marker* next_; Vector* arrow(const Vector&, const Vector&, Coord::InternalSystem); char* XMLCol[XMLNUMCOL]; int analysisHistogram_; static const char* analysisHistogramCB_[]; int analysisPlot2d_; static const char* analysisPlot2dCB_[]; int analysisPlot3d_; static const char* analysisPlot3dCB_[]; int analysisPanda_; static const char* analysisPandaCB_[]; int analysisRadial_; static const char* analysisRadialCB_[]; int analysisStats_; static const char* analysisStatsCB_[]; protected: virtual void renderX(Drawable, Coord::InternalSystem, RenderMode) =0; virtual void renderXInclude(Drawable drawable, Coord::InternalSystem, RenderMode mode); virtual void renderXText(Drawable, Coord::InternalSystem, RenderMode); void renderXArrow(Drawable, const Vector&, const Vector&, Coord::InternalSystem, GC); void renderXHandles(Drawable); virtual GC renderXGC(RenderMode); virtual void renderXLineDash(GC); void renderXLineNoDash(GC); virtual void renderPS(int mode) =0; virtual void renderPSInclude(int); virtual void renderPSText(int); void renderPSArrow(const Vector&, const Vector&, Coord::InternalSystem); virtual void renderPSGC(int); virtual void renderPSLineDash(); void renderPSLineNoDash(); void renderPSColor(int, XColor*); #ifdef MAC_OSX_TK virtual void renderMACOSX() =0; virtual void renderMACOSXInclude(); virtual void renderMACOSXText(); void renderMACOSXArrow(const Vector&, const Vector&, Coord::InternalSystem); virtual void renderMACOSXGC(); virtual void renderMACOSXLineDash(); void renderMACOSXLineNoDash(); #endif #ifdef __WIN32 virtual void renderWIN32() =0; virtual void renderWIN32Include(); virtual void renderWIN32Text(); void renderWIN32Arrow(const Vector&, const Vector&, Coord::InternalSystem); virtual void renderWIN32GC(); virtual void renderWIN32LineDash(); void renderWIN32LineNoDash(); #endif void analysisXYResult(char*, char*, double*, double*, int); void analysisXYEResult(char*, char*, char*, double*, double*, double*, int); void analysisXYEResult(double*, double*, double*, int); void analysisXYEEResult(char*, char*, char*, char*, double*, double*, double*, double*, int); void setMatrices(Coord::InternalSystem, Matrix*, Matrix*); double calcAngle(); Vector modifyArrow(const Vector&, const Vector&, Coord::InternalSystem); virtual void updateHandles() =0; virtual void calcAllBBox(); void initFonts(const char*); void listPre(ostream&, Coord::CoordSystem, Coord::SkyFrame, FitsImage*, int, int); virtual void listPost(ostream&, int, int); void listCiaoPre(ostream&); void listCiaoPost(ostream&, int); void listProsPost(ostream&, int); void listSAOtngPre(ostream&, int); void listSAOtngPost(ostream&, int); void listSAOimagePre(ostream&); void listSAOimagePost(ostream&, int); void listProps(ostream&); void listProperties(ostream&, int); void XMLRowInit(); void XMLRow(XMLColName,int); void XMLRow(XMLColName,int*,int); void XMLRow(XMLColName,double); void XMLRow(XMLColName,double*,int); void XMLRow(XMLColName,char*); void XMLRow(XMLColName,char**, int); void XMLRowProps(FitsImage*, Coord::CoordSystem); void XMLRowEnd(ostream&); void XMLRowProp(XMLColName, Property); void XMLRowCenter(FitsImage* fits, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) {XMLRowPoint(fits, sys, sky, format, center);} void XMLRowPoint(FitsImage*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Vector); void XMLRowPoint(FitsImage*, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, Vector*, int); void XMLRowRadiusX(FitsImage*, Coord::CoordSystem, Vector); void XMLRowRadiusX(FitsImage*, Coord::CoordSystem, Vector*, int); void XMLRowRadius(FitsImage*, Coord::CoordSystem, Vector); void XMLRowRadius(FitsImage*, Coord::CoordSystem, Vector*, int); void XMLRowAng(Coord::CoordSystem, Coord::SkyFrame); void XMLRowAng(Coord::CoordSystem, Coord::SkyFrame, double*, int); char* XMLQuote(char*); public: Marker(Base* p, const Vector& v, double ang); Marker(Base* p, const Vector& v, double ang, const char* clr, int* dsh, int w, const char* f, const char* t, unsigned short prop, const char* c, const List& tag, const List& cb); Marker(const Marker&); virtual ~Marker(); virtual Matrix fwdMatrix(); virtual Matrix bckMatrix(); virtual Vector fwdMap(const Vector&, Coord::InternalSystem); virtual Vector bckMap(const Vector&, Coord::InternalSystem); virtual void x11(Drawable, Coord::InternalSystem, int, RenderMode,HandleMode); virtual void ps(int,int); #ifdef MAC_OSX_TK virtual void macosx(int); #endif #ifdef __WIN32 virtual void win32(int); #endif virtual Marker* dup() =0; void newIdentity(); virtual void updateBBox(); virtual void updateCoords(const Matrix&); virtual void moveTo(const Vector& v); virtual void moveBegin(); virtual void move(const Vector& v); virtual void moveEnd(); virtual void centroid(); virtual void editBegin(int); virtual void edit(const Vector& v, int h); virtual void editEnd(); virtual void rotateBegin(); virtual void rotate(const Vector& v, int h); virtual void rotateEnd(); // assume Coord::CANVAS virtual int isIn(const Vector& vv) {return bbox.isIn(vv);} virtual int isIn(const Vector& vv, Coord::InternalSystem sys); virtual int isIn(const Vector& vv, Coord::InternalSystem sys, int nn) {return isIn(vv,sys);} virtual int isIn(const Vector& vv, Coord::InternalSystem sys, int nn, int aa) {return isIn(vv,sys);} // assume Coord::REF virtual int isIn(const Vector& vv, const Matrix& bck); virtual int isIn(const Vector& vv, const Matrix& bck, int nn) {return isIn(vv,bck);} virtual int isIn(const Vector& vv, const Matrix& bck, int nn, int aa) {return isIn(vv,bck);} void setAngle(double); double getAngle() {return angle;} int getNumHandle() {return numHandle;} Vector getHandle(int); virtual int getSegment(const Vector&) {return 0;} virtual void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int) =0; virtual void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat) {} virtual void listCiao(ostream&, Coord::CoordSystem, int) {} virtual void listSAOtng(ostream&,Coord::CoordSystem,Coord::SkyFrame,Coord::SkyFormat, int) {} virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int) {} virtual void listSAOimage(ostream&, int) {} virtual void listXY(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); const BBox& getBBox() {return bbox;} const BBox& getAllBBox() {return allBBox;} int isVisible(const BBox&); void select(); void unselect(); void toggleSelect(); int isSelected() {return selected;} void highlite(); void unhighlite(); void toggleHighlite(); int isHighlited() {return highlited;} void key(); void setColor(const char*); const char* getColorName() {return colorName;} void setLineWidth(int); int getLineWidth() {return lineWidth;} void setText(const char*); const char* getText() {return text;} void setFont(const char*); const char* getFont(); void addTag(const char*); void editTag(const char*, const char*); void deleteTags(); void deleteTag(int); void deleteTag(const char*); const char* getTag(); const char* getNextTag(); const char* getTag(int); int hasTag(const char*); int onHandle(const Vector& v); int getId() {return id;} const char* getType() {return type_;} Vector getCenter() {return center;} int canSelect() {return (properties & SELECT) ? 1:0;} int canHighlite() {return (properties & HIGHLITE) ? 1:0;} int canEdit() {return (properties & EDIT) ? 1:0;} int canMove() {return (properties & MOVE) ? 1:0;} int canRotate() {return (properties & ROTATE) ? 1:0;} int canDelete() {return (properties & DELETE) ? 1:0;} int isFixed() {return (properties & FIXED) ? 1:0;} void setProperty(unsigned short, int); int getProperty(unsigned short); unsigned short getProperty() {return properties;} int addCallBack(CallBack::Type, const char*, const char*); int deleteCallBack(CallBack::Type, const char*); void deleteCallBack(CallBack::Type); void doCallBack(CallBack::Type); Marker* previous() {return previous_;} void setPrevious(Marker* m) {previous_ = m;} Marker* next() {return next_;} void setNext(Marker* m) {next_ = m;} void enableCB() {doCB = 1;} void disableCB() {doCB = 0;} void deleteCBs(); virtual void analysis(AnalysisTask, int) {} virtual void analysisHistogram(char*, char*, int) {} virtual void analysisRadial(char*, char*, char*, Coord::CoordSystem) {} virtual void analysisStats(Coord::CoordSystem, Coord::SkyFrame) {} virtual void analysisPanda(Coord::CoordSystem) {} virtual void analysisPlot2d(char*, char*, char*, char*, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod) {} virtual void analysisPlot3d(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod) {} // special composite funtionality virtual void setComposite(const Matrix&, double); void setComposite(const char*, int, int); }; #endif saods9/tksao1.0/frame/parser.C000644 000765 000000 00001571522 12616732024 016436 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse frparse #define yylex frlex #define yyerror frerror #define yylval frlval #define yychar frchar #define yydebug frdebug #define yynerrs frnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, POINTER = 261, ANGDEGREE = 262, ANGRADIAN = 263, SEXSTR = 264, HMSSTR = 265, DMSSTR = 266, ABOUT_ = 267, AIP_ = 268, ALLOC_ = 269, ALLOCGZ_ = 270, ALIGN_ = 271, ALL_ = 272, ALT_ = 273, AMPLIFIER_ = 274, ANALYSIS_ = 275, ANGLE_ = 276, ANNULUS_ = 277, APPEND_ = 278, ARCMIN_ = 279, ARCSEC_ = 280, ARRAY_ = 281, ARROW_ = 282, ASINH_ = 283, AST_ = 284, AUTO_ = 285, AUX_ = 286, AVERAGE_ = 287, AXES_ = 288, AZIMUTH_ = 289, B1950_ = 290, BACK_ = 291, BACKGROUND_ = 292, BASE_ = 293, BBOX_ = 294, BEGIN_ = 295, BG_ = 296, BIG_ = 297, BIGENDIAN_ = 298, BIN_ = 299, BITPIX_ = 300, BLOCK_ = 301, BORDER_ = 302, BOX_ = 303, BOXANNULUS_ = 304, BOXCAR_ = 305, BOXCIRCLE_ = 306, BPANDA_ = 307, BUFFER_ = 308, BW_ = 309, CALLBACK_ = 310, CANVAS_ = 311, CATALOG_ = 312, CELESTRIAL_ = 313, CENTER_ = 314, CENTROID_ = 315, CHANNEL_ = 316, CIRCLE_ = 317, CIAO_ = 318, CLEAR_ = 319, CLIP_ = 320, COLOR_ = 321, COLORBAR_ = 322, COLORMAP_ = 323, COLORSCALE_ = 324, COLORSPACE_ = 325, COLS_ = 326, COLUMN_ = 327, COMMAND_ = 328, COMPASS_ = 329, COMPOSITE_ = 330, COMPRESS_ = 331, CONTOUR_ = 332, CONTRAST_ = 333, COORDINATES_ = 334, COPY_ = 335, COUNT_ = 336, CPANDA_ = 337, CREATE_ = 338, CROP_ = 339, CROSS_ = 340, CROSSHAIR_ = 341, CUBE_ = 342, CURSOR_ = 343, CUT_ = 344, CMYK_ = 345, DASH_ = 346, DASHLIST_ = 347, DATA_ = 348, DATAMIN_ = 349, DATASEC_ = 350, DEBUG_ = 351, DEGREES_ = 352, DEFAULT_ = 353, DELETE_ = 354, DEPTH_ = 355, DETECTOR_ = 356, DIAMOND_ = 357, DIM_ = 358, DS9_ = 359, EDIT_ = 360, ECLIPTIC_ = 361, ELEVATION_ = 362, ELLIPSE_ = 363, ELLIPSEANNULUS_ = 364, END_ = 365, ENVI_ = 366, EPANDA_ = 367, EPSILON_ = 368, EQUATORIAL_ = 369, ERASE_ = 370, EXT_ = 371, FACTOR_ = 372, FALSE_ = 373, FILE_ = 374, FILTER_ = 375, FIT_ = 376, FITS_ = 377, FITSY_ = 378, FIXED_ = 379, FK4_ = 380, FK4_NO_E_ = 381, FK5_ = 382, FONT_ = 383, FRONT_ = 384, FULL_ = 385, FUNCTION_ = 386, GALACTIC_ = 387, GAUSSIAN_ = 388, GET_ = 389, GLOBAL_ = 390, GRAPHICS_ = 391, GRAY_ = 392, GRID_ = 393, GZ_ = 394, HANDLE_ = 395, HAS_ = 396, HEAD_ = 397, HEADER_ = 398, HEIGHT_ = 399, HELIOECLIPTIC_ = 400, HIDE_ = 401, HIGH_ = 402, HIGHLITE_ = 403, HISTEQU_ = 404, HISTOGRAM_ = 405, HORIZONTAL_ = 406, ICRS_ = 407, ID_ = 408, IIS_ = 409, IMAGE_ = 410, INCLUDE_ = 411, INCR_ = 412, INFO_ = 413, INTEGER_ = 414, ITERATION_ = 415, IRAF_ = 416, IRAFMIN_ = 417, J2000_ = 418, KEY_ = 419, KEYWORD_ = 420, LABEL_ = 421, LENGTH_ = 422, LEVEL_ = 423, LITTLE_ = 424, LITTLEENDIAN_ = 425, LINE_ = 426, LINEAR_ = 427, LIST_ = 428, LOAD_ = 429, LOCAL_ = 430, LOG_ = 431, LOW_ = 432, MACOSX_ = 433, MAGNIFIER_ = 434, MATCH_ = 435, MAP_ = 436, MARK_ = 437, MARKER_ = 438, MASK_ = 439, MESSAGE_ = 440, METHOD_ = 441, MINMAX_ = 442, MIP_ = 443, MMAP_ = 444, MMAPINCR_ = 445, MOSAIC_ = 446, MODE_ = 447, MOTION_ = 448, MOVE_ = 449, NAME_ = 450, NAN_ = 451, NATIVE_ = 452, NAXES_ = 453, NEW_ = 454, NEXT_ = 455, NO_ = 456, NONE_ = 457, NOW_ = 458, NRRD_ = 459, NUMBER_ = 460, OBJECT_ = 461, OFF_ = 462, ON_ = 463, ONLY_ = 464, OPTION_ = 465, ORIENT_ = 466, PAN_ = 467, PANNER_ = 468, PARSER_ = 469, PASTE_ = 470, PERF_ = 471, PHOTO_ = 472, PHYSICAL_ = 473, PIXEL_ = 474, PLOT2D_ = 475, PLOT3D_ = 476, POINT_ = 477, POINTER_ = 478, POLYGON_ = 479, POSTSCRIPT_ = 480, POW_ = 481, PRINT_ = 482, PRESERVE_ = 483, PROJECTION_ = 484, PROPERTY_ = 485, PUBLICATION_ = 486, PROS_ = 487, QUERY_ = 488, RADIAL_ = 489, RADIUS_ = 490, REGION_ = 491, REPLACE_ = 492, RESAMPLE_ = 493, RESET_ = 494, RESOLUTION_ = 495, RGB_ = 496, ROOT_ = 497, ROTATE_ = 498, RULER_ = 499, SAMPLE_ = 500, SAOIMAGE_ = 501, SAOTNG_ = 502, SAVE_ = 503, SCALE_ = 504, SCAN_ = 505, SCIENTIFIC_ = 506, SCOPE_ = 507, SEGMENT_ = 508, SELECT_ = 509, SET_ = 510, SEXAGESIMAL_ = 511, SHAPE_ = 512, SHARED_ = 513, SHIFT_ = 514, SHMID_ = 515, SHOW_ = 516, SINH_ = 517, SIZE_ = 518, SLICE_ = 519, SMMAP_ = 520, SMOOTH_ = 521, SOCKET_ = 522, SOCKETGZ_ = 523, SOURCE_ = 524, SQRT_ = 525, SQUARED_ = 526, SSHARED_ = 527, STATS_ = 528, STATUS_ = 529, SUPERGALACTIC_ = 530, SUM_ = 531, SYSTEM_ = 532, TABLE_ = 533, TAG_ = 534, TEMPLATE_ = 535, TEXT_ = 536, THREADS_ = 537, THREED_ = 538, THRESHOLD_ = 539, THICK_ = 540, TRANSPARENCY_ = 541, TO_ = 542, TOGGLE_ = 543, TOPHAT_ = 544, TRUE_ = 545, TYPE_ = 546, UNDO_ = 547, UNHIGHLITE_ = 548, UNLOAD_ = 549, UNSELECT_ = 550, UPDATE_ = 551, USER_ = 552, VALUE_ = 553, VAR_ = 554, VIEW_ = 555, VECTOR_ = 556, VERSION_ = 557, VERTEX_ = 558, VERTICAL_ = 559, WARP_ = 560, WCS_ = 561, WCSA_ = 562, WCSB_ = 563, WCSC_ = 564, WCSD_ = 565, WCSE_ = 566, WCSF_ = 567, WCSG_ = 568, WCSH_ = 569, WCSI_ = 570, WCSJ_ = 571, WCSK_ = 572, WCSL_ = 573, WCSM_ = 574, WCSN_ = 575, WCSO_ = 576, WCSP_ = 577, WCSQ_ = 578, WCSR_ = 579, WCSS_ = 580, WCST_ = 581, WCSU_ = 582, WCSV_ = 583, WCSW_ = 584, WCSX_ = 585, WCSY_ = 586, WCSZ_ = 587, WCS0_ = 588, WFPC2_ = 589, WIDTH_ = 590, WIN32_ = 591, XML_ = 592, XY_ = 593, YES_ = 594, ZMAX_ = 595, ZSCALE_ = 596, ZOOM_ = 597 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define POINTER 261 #define ANGDEGREE 262 #define ANGRADIAN 263 #define SEXSTR 264 #define HMSSTR 265 #define DMSSTR 266 #define ABOUT_ 267 #define AIP_ 268 #define ALLOC_ 269 #define ALLOCGZ_ 270 #define ALIGN_ 271 #define ALL_ 272 #define ALT_ 273 #define AMPLIFIER_ 274 #define ANALYSIS_ 275 #define ANGLE_ 276 #define ANNULUS_ 277 #define APPEND_ 278 #define ARCMIN_ 279 #define ARCSEC_ 280 #define ARRAY_ 281 #define ARROW_ 282 #define ASINH_ 283 #define AST_ 284 #define AUTO_ 285 #define AUX_ 286 #define AVERAGE_ 287 #define AXES_ 288 #define AZIMUTH_ 289 #define B1950_ 290 #define BACK_ 291 #define BACKGROUND_ 292 #define BASE_ 293 #define BBOX_ 294 #define BEGIN_ 295 #define BG_ 296 #define BIG_ 297 #define BIGENDIAN_ 298 #define BIN_ 299 #define BITPIX_ 300 #define BLOCK_ 301 #define BORDER_ 302 #define BOX_ 303 #define BOXANNULUS_ 304 #define BOXCAR_ 305 #define BOXCIRCLE_ 306 #define BPANDA_ 307 #define BUFFER_ 308 #define BW_ 309 #define CALLBACK_ 310 #define CANVAS_ 311 #define CATALOG_ 312 #define CELESTRIAL_ 313 #define CENTER_ 314 #define CENTROID_ 315 #define CHANNEL_ 316 #define CIRCLE_ 317 #define CIAO_ 318 #define CLEAR_ 319 #define CLIP_ 320 #define COLOR_ 321 #define COLORBAR_ 322 #define COLORMAP_ 323 #define COLORSCALE_ 324 #define COLORSPACE_ 325 #define COLS_ 326 #define COLUMN_ 327 #define COMMAND_ 328 #define COMPASS_ 329 #define COMPOSITE_ 330 #define COMPRESS_ 331 #define CONTOUR_ 332 #define CONTRAST_ 333 #define COORDINATES_ 334 #define COPY_ 335 #define COUNT_ 336 #define CPANDA_ 337 #define CREATE_ 338 #define CROP_ 339 #define CROSS_ 340 #define CROSSHAIR_ 341 #define CUBE_ 342 #define CURSOR_ 343 #define CUT_ 344 #define CMYK_ 345 #define DASH_ 346 #define DASHLIST_ 347 #define DATA_ 348 #define DATAMIN_ 349 #define DATASEC_ 350 #define DEBUG_ 351 #define DEGREES_ 352 #define DEFAULT_ 353 #define DELETE_ 354 #define DEPTH_ 355 #define DETECTOR_ 356 #define DIAMOND_ 357 #define DIM_ 358 #define DS9_ 359 #define EDIT_ 360 #define ECLIPTIC_ 361 #define ELEVATION_ 362 #define ELLIPSE_ 363 #define ELLIPSEANNULUS_ 364 #define END_ 365 #define ENVI_ 366 #define EPANDA_ 367 #define EPSILON_ 368 #define EQUATORIAL_ 369 #define ERASE_ 370 #define EXT_ 371 #define FACTOR_ 372 #define FALSE_ 373 #define FILE_ 374 #define FILTER_ 375 #define FIT_ 376 #define FITS_ 377 #define FITSY_ 378 #define FIXED_ 379 #define FK4_ 380 #define FK4_NO_E_ 381 #define FK5_ 382 #define FONT_ 383 #define FRONT_ 384 #define FULL_ 385 #define FUNCTION_ 386 #define GALACTIC_ 387 #define GAUSSIAN_ 388 #define GET_ 389 #define GLOBAL_ 390 #define GRAPHICS_ 391 #define GRAY_ 392 #define GRID_ 393 #define GZ_ 394 #define HANDLE_ 395 #define HAS_ 396 #define HEAD_ 397 #define HEADER_ 398 #define HEIGHT_ 399 #define HELIOECLIPTIC_ 400 #define HIDE_ 401 #define HIGH_ 402 #define HIGHLITE_ 403 #define HISTEQU_ 404 #define HISTOGRAM_ 405 #define HORIZONTAL_ 406 #define ICRS_ 407 #define ID_ 408 #define IIS_ 409 #define IMAGE_ 410 #define INCLUDE_ 411 #define INCR_ 412 #define INFO_ 413 #define INTEGER_ 414 #define ITERATION_ 415 #define IRAF_ 416 #define IRAFMIN_ 417 #define J2000_ 418 #define KEY_ 419 #define KEYWORD_ 420 #define LABEL_ 421 #define LENGTH_ 422 #define LEVEL_ 423 #define LITTLE_ 424 #define LITTLEENDIAN_ 425 #define LINE_ 426 #define LINEAR_ 427 #define LIST_ 428 #define LOAD_ 429 #define LOCAL_ 430 #define LOG_ 431 #define LOW_ 432 #define MACOSX_ 433 #define MAGNIFIER_ 434 #define MATCH_ 435 #define MAP_ 436 #define MARK_ 437 #define MARKER_ 438 #define MASK_ 439 #define MESSAGE_ 440 #define METHOD_ 441 #define MINMAX_ 442 #define MIP_ 443 #define MMAP_ 444 #define MMAPINCR_ 445 #define MOSAIC_ 446 #define MODE_ 447 #define MOTION_ 448 #define MOVE_ 449 #define NAME_ 450 #define NAN_ 451 #define NATIVE_ 452 #define NAXES_ 453 #define NEW_ 454 #define NEXT_ 455 #define NO_ 456 #define NONE_ 457 #define NOW_ 458 #define NRRD_ 459 #define NUMBER_ 460 #define OBJECT_ 461 #define OFF_ 462 #define ON_ 463 #define ONLY_ 464 #define OPTION_ 465 #define ORIENT_ 466 #define PAN_ 467 #define PANNER_ 468 #define PARSER_ 469 #define PASTE_ 470 #define PERF_ 471 #define PHOTO_ 472 #define PHYSICAL_ 473 #define PIXEL_ 474 #define PLOT2D_ 475 #define PLOT3D_ 476 #define POINT_ 477 #define POINTER_ 478 #define POLYGON_ 479 #define POSTSCRIPT_ 480 #define POW_ 481 #define PRINT_ 482 #define PRESERVE_ 483 #define PROJECTION_ 484 #define PROPERTY_ 485 #define PUBLICATION_ 486 #define PROS_ 487 #define QUERY_ 488 #define RADIAL_ 489 #define RADIUS_ 490 #define REGION_ 491 #define REPLACE_ 492 #define RESAMPLE_ 493 #define RESET_ 494 #define RESOLUTION_ 495 #define RGB_ 496 #define ROOT_ 497 #define ROTATE_ 498 #define RULER_ 499 #define SAMPLE_ 500 #define SAOIMAGE_ 501 #define SAOTNG_ 502 #define SAVE_ 503 #define SCALE_ 504 #define SCAN_ 505 #define SCIENTIFIC_ 506 #define SCOPE_ 507 #define SEGMENT_ 508 #define SELECT_ 509 #define SET_ 510 #define SEXAGESIMAL_ 511 #define SHAPE_ 512 #define SHARED_ 513 #define SHIFT_ 514 #define SHMID_ 515 #define SHOW_ 516 #define SINH_ 517 #define SIZE_ 518 #define SLICE_ 519 #define SMMAP_ 520 #define SMOOTH_ 521 #define SOCKET_ 522 #define SOCKETGZ_ 523 #define SOURCE_ 524 #define SQRT_ 525 #define SQUARED_ 526 #define SSHARED_ 527 #define STATS_ 528 #define STATUS_ 529 #define SUPERGALACTIC_ 530 #define SUM_ 531 #define SYSTEM_ 532 #define TABLE_ 533 #define TAG_ 534 #define TEMPLATE_ 535 #define TEXT_ 536 #define THREADS_ 537 #define THREED_ 538 #define THRESHOLD_ 539 #define THICK_ 540 #define TRANSPARENCY_ 541 #define TO_ 542 #define TOGGLE_ 543 #define TOPHAT_ 544 #define TRUE_ 545 #define TYPE_ 546 #define UNDO_ 547 #define UNHIGHLITE_ 548 #define UNLOAD_ 549 #define UNSELECT_ 550 #define UPDATE_ 551 #define USER_ 552 #define VALUE_ 553 #define VAR_ 554 #define VIEW_ 555 #define VECTOR_ 556 #define VERSION_ 557 #define VERTEX_ 558 #define VERTICAL_ 559 #define WARP_ 560 #define WCS_ 561 #define WCSA_ 562 #define WCSB_ 563 #define WCSC_ 564 #define WCSD_ 565 #define WCSE_ 566 #define WCSF_ 567 #define WCSG_ 568 #define WCSH_ 569 #define WCSI_ 570 #define WCSJ_ 571 #define WCSK_ 572 #define WCSL_ 573 #define WCSM_ 574 #define WCSN_ 575 #define WCSO_ 576 #define WCSP_ 577 #define WCSQ_ 578 #define WCSR_ 579 #define WCSS_ 580 #define WCST_ 581 #define WCSU_ 582 #define WCSV_ 583 #define WCSW_ 584 #define WCSX_ 585 #define WCSY_ 586 #define WCSZ_ 587 #define WCS0_ 588 #define WFPC2_ 589 #define WIDTH_ 590 #define WIN32_ 591 #define XML_ 592 #define XY_ 593 #define YES_ 594 #define ZMAX_ 595 #define ZSCALE_ 596 #define ZOOM_ 597 /* Copy the first part of user declarations. */ #line 10 "frame/parser.Y" #define YYDEBUG 1 #include #include #include #include "base.h" #include "frame3d.h" #include "fitsimage.h" #include "marker.h" #undef yyFlexLexer #define yyFlexLexer frFlexLexer #include extern int frlex(void*, frFlexLexer*); extern void frerror(Base*, frFlexLexer*, const char*); static Coord::CoordSystem currentCoord = Coord::IMAGE; static Coord::SkyFrame currentSky = Coord::FK5; static unsigned short defaultProps = Marker::SELECT | Marker::HIGHLITE | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::INCLUDE | Marker::SOURCE; static unsigned short currentProps; static char currentColor[16]; static int currentWidth; static int currentDash[2]; static char currentFont[32]; static char currentText[80]; static List taglist; static List cblist; static unsigned short propQMask; static unsigned short propQValue; static void setProps(unsigned short* props, unsigned short prop, int value); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 51 "frame/parser.Y" { #define FRBUFSIZE 4096 char chr; char str[FRBUFSIZE]; void* ptr; int integer; double real; double vector[3]; int dash[2]; } /* Line 193 of yacc.c. */ #line 840 "frame/parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 853 "frame/parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 359 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 5885 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 347 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 218 /* YYNRULES -- Number of rules. */ #define YYNRULES 1291 /* YYNRULES -- Number of states. */ #define YYNSTATES 2838 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 597 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint16 yytranslate[] = { 0, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 346, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 344, 2, 2, 2, 2, 2, 2, 2, 2, 2, 345, 343, 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, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 6, 9, 12, 16, 19, 21, 23, 26, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 65, 68, 71, 75, 78, 81, 84, 87, 91, 94, 98, 101, 104, 107, 110, 113, 115, 119, 122, 125, 128, 130, 133, 136, 139, 141, 144, 146, 149, 152, 155, 158, 160, 162, 164, 166, 169, 172, 175, 178, 181, 184, 187, 190, 193, 196, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 218, 220, 222, 224, 226, 227, 230, 233, 235, 237, 238, 240, 242, 244, 246, 248, 250, 252, 255, 258, 261, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 351, 353, 355, 357, 359, 361, 363, 365, 367, 369, 371, 372, 374, 376, 377, 379, 381, 383, 385, 387, 389, 391, 393, 394, 396, 398, 399, 401, 403, 404, 406, 408, 409, 411, 413, 415, 417, 419, 421, 423, 424, 426, 428, 430, 432, 434, 436, 438, 439, 441, 443, 444, 446, 448, 450, 452, 454, 457, 460, 463, 466, 469, 472, 475, 477, 480, 482, 485, 487, 490, 492, 495, 498, 505, 509, 513, 517, 519, 522, 526, 530, 534, 538, 542, 546, 550, 554, 558, 561, 566, 569, 572, 575, 579, 582, 585, 587, 590, 592, 595, 600, 606, 609, 613, 619, 626, 628, 630, 632, 640, 652, 661, 674, 676, 679, 682, 684, 686, 689, 692, 695, 698, 701, 704, 707, 710, 713, 716, 718, 720, 722, 724, 726, 728, 730, 733, 736, 738, 740, 742, 744, 746, 749, 752, 755, 763, 774, 776, 779, 781, 789, 800, 802, 805, 808, 811, 815, 818, 821, 823, 826, 834, 842, 847, 850, 852, 854, 859, 872, 875, 877, 879, 880, 887, 896, 899, 903, 907, 911, 912, 916, 921, 926, 931, 935, 939, 941, 945, 951, 956, 961, 965, 968, 972, 975, 978, 981, 984, 987, 990, 993, 996, 999, 1002, 1005, 1008, 1011, 1014, 1016, 1019, 1022, 1027, 1035, 1038, 1041, 1044, 1046, 1050, 1053, 1056, 1058, 1061, 1070, 1073, 1076, 1079, 1081, 1084, 1086, 1091, 1099, 1102, 1105, 1107, 1109, 1111, 1114, 1116, 1118, 1121, 1123, 1124, 1127, 1130, 1132, 1134, 1136, 1138, 1141, 1144, 1147, 1149, 1150, 1152, 1154, 1156, 1158, 1160, 1162, 1164, 1166, 1168, 1170, 1171, 1173, 1176, 1178, 1183, 1189, 1190, 1193, 1195, 1201, 1204, 1207, 1210, 1212, 1214, 1216, 1219, 1221, 1224, 1226, 1228, 1230, 1232, 1234, 1235, 1237, 1238, 1240, 1246, 1253, 1258, 1262, 1269, 1272, 1274, 1279, 1281, 1283, 1285, 1290, 1297, 1305, 1311, 1313, 1315, 1320, 1326, 1328, 1332, 1333, 1335, 1338, 1340, 1346, 1348, 1351, 1353, 1356, 1360, 1363, 1365, 1368, 1370, 1376, 1379, 1381, 1383, 1387, 1389, 1392, 1396, 1399, 1400, 1402, 1404, 1409, 1412, 1413, 1415, 1417, 1420, 1421, 1423, 1425, 1427, 1429, 1431, 1433, 1435, 1437, 1439, 1441, 1443, 1445, 1448, 1451, 1454, 1457, 1459, 1461, 1463, 1464, 1466, 1467, 1469, 1470, 1472, 1473, 1475, 1476, 1479, 1482, 1483, 1485, 1487, 1490, 1492, 1499, 1505, 1507, 1509, 1511, 1514, 1517, 1519, 1521, 1523, 1525, 1528, 1530, 1532, 1534, 1537, 1539, 1541, 1544, 1547, 1550, 1551, 1553, 1554, 1556, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1573, 1576, 1578, 1581, 1585, 1587, 1590, 1593, 1598, 1605, 1607, 1618, 1620, 1623, 1627, 1631, 1634, 1637, 1640, 1643, 1646, 1649, 1652, 1657, 1662, 1667, 1671, 1675, 1681, 1686, 1691, 1696, 1700, 1704, 1708, 1712, 1715, 1718, 1723, 1727, 1731, 1735, 1739, 1744, 1749, 1754, 1759, 1765, 1770, 1777, 1785, 1790, 1795, 1801, 1804, 1808, 1812, 1816, 1819, 1823, 1827, 1831, 1835, 1840, 1844, 1850, 1857, 1861, 1865, 1870, 1874, 1878, 1882, 1886, 1890, 1896, 1900, 1904, 1909, 1913, 1916, 1919, 1921, 1925, 1930, 1935, 1940, 1945, 1950, 1957, 1962, 1967, 1973, 1978, 1983, 1988, 1993, 1999, 2004, 2011, 2019, 2024, 2029, 2035, 2041, 2047, 2053, 2059, 2065, 2073, 2079, 2085, 2092, 2098, 2104, 2110, 2116, 2123, 2129, 2137, 2146, 2152, 2158, 2165, 2169, 2173, 2177, 2181, 2185, 2191, 2195, 2199, 2204, 2208, 2212, 2216, 2220, 2225, 2229, 2235, 2242, 2246, 2250, 2255, 2259, 2263, 2267, 2271, 2275, 2281, 2285, 2289, 2294, 2299, 2304, 2308, 2314, 2319, 2324, 2327, 2331, 2338, 2345, 2347, 2349, 2351, 2354, 2357, 2360, 2364, 2368, 2371, 2384, 2387, 2390, 2392, 2396, 2401, 2404, 2405, 2409, 2411, 2413, 2416, 2419, 2422, 2425, 2428, 2433, 2438, 2443, 2447, 2452, 2458, 2466, 2475, 2482, 2491, 2501, 2508, 2515, 2523, 2534, 2546, 2559, 2569, 2575, 2581, 2588, 2592, 2598, 2604, 2610, 2617, 2623, 2628, 2638, 2649, 2661, 2671, 2678, 2685, 2692, 2699, 2706, 2713, 2720, 2727, 2734, 2742, 2750, 2753, 2758, 2763, 2768, 2773, 2779, 2784, 2789, 2795, 2801, 2805, 2810, 2815, 2820, 2827, 2835, 2844, 2854, 2861, 2872, 2884, 2897, 2907, 2911, 2914, 2918, 2924, 2931, 2939, 2944, 2948, 2952, 2959, 2966, 2973, 2981, 2988, 2996, 3001, 3006, 3013, 3023, 3028, 3032, 3039, 3047, 3055, 3058, 3062, 3066, 3070, 3075, 3078, 3081, 3086, 3094, 3105, 3109, 3111, 3115, 3118, 3121, 3124, 3127, 3131, 3137, 3142, 3148, 3151, 3159, 3163, 3166, 3169, 3173, 3176, 3179, 3182, 3186, 3189, 3193, 3198, 3202, 3206, 3212, 3219, 3224, 3227, 3231, 3234, 3237, 3242, 3246, 3250, 3253, 3257, 3259, 3263, 3265, 3268, 3271, 3274, 3276, 3278, 3280, 3282, 3285, 3287, 3290, 3293, 3295, 3298, 3301, 3303, 3306, 3308, 3310, 3312, 3314, 3316, 3318, 3320, 3322, 3323, 3325, 3328, 3331, 3334, 3338, 3344, 3352, 3360, 3367, 3374, 3381, 3388, 3394, 3401, 3408, 3415, 3422, 3429, 3436, 3443, 3454, 3462, 3470, 3478, 3488, 3498, 3509, 3522, 3535, 3538, 3541, 3545, 3550, 3555, 3560, 3563, 3568, 3573, 3575, 3577, 3579, 3581, 3583, 3585, 3587, 3589, 3592, 3594, 3596, 3598, 3602, 3606, 3611, 3618, 3629, 3637, 3645, 3651, 3656, 3663, 3674, 3682, 3690, 3696, 3699, 3702, 3706, 3711, 3716, 3722, 3727, 3733, 3738, 3744, 3748, 3753, 3759, 3764, 3770, 3774, 3780, 3785, 3791, 3794, 3798, 3802, 3807, 3813, 3817, 3821, 3825, 3830, 3836, 3841, 3847, 3852, 3858, 3863, 3869, 3873, 3878, 3884, 3889, 3895, 3898, 3901, 3905, 3911, 3916, 3923, 3930, 3934, 3938, 3943, 3950, 3956, 3961, 3967, 3970, 3974, 3980, 3985, 3992, 3996, 3999, 4002, 4006, 4009, 4013, 4016, 4020, 4026, 4031, 4038, 4041, 4044, 4047, 4049, 4054, 4059, 4061, 4064, 4067, 4070, 4073, 4076, 4079, 4082, 4086, 4089, 4093, 4096, 4100, 4102, 4104, 4106, 4108, 4110, 4111, 4114, 4115, 4118, 4119, 4121, 4122, 4123, 4125, 4127, 4129, 4131, 4133, 4141, 4150, 4153, 4158, 4161, 4166, 4173, 4176, 4178, 4180, 4184, 4188, 4190, 4194, 4199, 4202, 4204, 4208, 4212, 4217, 4221, 4225, 4229, 4231, 4233, 4235, 4237, 4239, 4241, 4243, 4245, 4247, 4249, 4251, 4253, 4255, 4257, 4260, 4261, 4262, 4265, 4267, 4271, 4273, 4277, 4279, 4282, 4285, 4287, 4291, 4292, 4293, 4296, 4299, 4301, 4305, 4311, 4313, 4316, 4319, 4322, 4324, 4326, 4328, 4330, 4335, 4338, 4342, 4346, 4349, 4353, 4356, 4359, 4362, 4366, 4370, 4374, 4377, 4381, 4383, 4387, 4391, 4393, 4396, 4399, 4402, 4405, 4407, 4409, 4411, 4413, 4416, 4419, 4423, 4427, 4429, 4432, 4436, 4440, 4442, 4445, 4447, 4449, 4451, 4453, 4455, 4458, 4461, 4466, 4468, 4471, 4474, 4477, 4481, 4483, 4485, 4487, 4490, 4493, 4496, 4499, 4502, 4506, 4510, 4514, 4518, 4522, 4526, 4530, 4532, 4535, 4538, 4541, 4545, 4548, 4552, 4556, 4559, 4562, 4565, 4568, 4571, 4574, 4577, 4580, 4583, 4586, 4589, 4592, 4595, 4598, 4602, 4606, 4610, 4613, 4616, 4619, 4622, 4625, 4628, 4631, 4634, 4637, 4640, 4643, 4646, 4650, 4654, 4658, 4663, 4666, 4668, 4670, 4672, 4674, 4675, 4681, 4683, 4690, 4694, 4696, 4699, 4702, 4706, 4709, 4713, 4717, 4720, 4723, 4726, 4729, 4732, 4735, 4739, 4742, 4745, 4749, 4751, 4755, 4760, 4762, 4765, 4771, 4778, 4785, 4788, 4790, 4793, 4796, 4802, 4809 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 348, 0, -1, 96, 350, -1, 20, 381, -1, 44, 383, -1, 41, 66, 5, -1, 46, 388, -1, 59, -1, 64, -1, 65, 390, -1, 67, 279, 5, -1, 68, 397, -1, 69, 399, -1, 77, 400, -1, 84, 404, -1, 86, 406, -1, 87, 407, -1, 95, 351, -1, 123, 408, -1, 134, 409, -1, 138, 455, -1, 141, 458, -1, 146, -1, 148, 351, -1, 154, 464, -1, 161, 16, 4, -1, 174, 467, -1, 178, 485, -1, 179, 486, -1, 180, 487, -1, 183, 503, 488, -1, 184, 522, -1, 196, 66, 5, -1, 211, 523, -1, 212, 524, -1, 213, 527, -1, 233, 88, -1, 225, 528, -1, 239, -1, 236, 503, 530, -1, 241, 535, -1, 243, 536, -1, 248, 538, -1, 261, -1, 266, 553, -1, 282, 4, -1, 283, 376, -1, 294, -1, 296, 555, -1, 302, -1, 305, 557, -1, 306, 558, -1, 336, 562, -1, 342, 563, -1, 3, -1, 4, -1, 208, -1, 207, -1, 29, 351, -1, 191, 351, -1, 214, 351, -1, 216, 351, -1, 306, 351, -1, 44, 351, -1, 46, 351, -1, 76, 351, -1, 84, 351, -1, 139, 351, -1, 241, 351, -1, 4, -1, 339, -1, 343, -1, 208, -1, 290, -1, 201, -1, 344, -1, 207, -1, 118, -1, -1, 98, -1, 124, -1, 251, -1, 159, -1, -1, 242, 38, -1, 130, 38, -1, 242, -1, 130, -1, -1, 355, -1, 349, -1, 7, -1, 8, -1, 9, -1, 10, -1, 11, -1, 356, 356, -1, 357, 358, -1, 358, 358, -1, 349, 349, -1, 155, -1, 218, -1, 101, -1, 19, -1, 361, -1, 306, -1, 307, -1, 308, -1, 309, -1, 310, -1, 311, -1, 312, -1, 313, -1, 314, -1, 315, -1, 316, -1, 317, -1, 318, -1, 319, -1, 320, -1, 321, -1, 322, -1, 323, -1, 324, -1, 325, -1, 326, -1, 327, -1, 328, -1, 329, -1, 330, -1, 331, -1, 332, -1, 333, -1, 56, -1, 213, -1, 172, -1, 176, -1, 226, -1, 270, -1, 271, -1, 28, -1, 262, -1, 149, -1, -1, 125, -1, 126, -1, 35, -1, 127, -1, 163, -1, 152, -1, 132, -1, 275, -1, 106, -1, 145, -1, -1, 97, -1, 256, -1, -1, 97, -1, 24, -1, 25, -1, 349, -1, 187, -1, 341, -1, 340, -1, 297, -1, -1, 260, -1, 164, -1, -1, 17, -1, 157, -1, -1, 155, -1, 184, -1, -1, 62, -1, 48, -1, 102, -1, 85, -1, 345, -1, 27, -1, 51, -1, -1, 4, -1, 82, -1, 150, -1, 220, -1, 221, -1, 234, -1, 273, -1, -1, 32, -1, 276, -1, -1, 197, -1, 42, -1, 43, -1, 169, -1, 170, -1, 300, 380, -1, 47, 377, -1, 74, 378, -1, 148, 379, -1, 186, 533, -1, 37, 534, -1, 249, 349, -1, 228, -1, 284, 349, -1, 351, -1, 66, 5, -1, 351, -1, 66, 5, -1, 351, -1, 66, 5, -1, 349, 349, -1, 222, 349, 349, 349, 349, 349, -1, 40, 349, 349, -1, 193, 349, 349, -1, 110, 349, 349, -1, 239, -1, 257, 382, -1, 62, 349, 349, -1, 108, 349, 349, -1, 48, 349, 349, -1, 224, 349, 349, -1, 222, 349, 349, -1, 301, 349, 349, -1, 22, 349, 349, -1, 109, 349, 349, -1, 49, 349, 349, -1, 12, 384, -1, 71, 5, 5, 5, -1, 100, 4, -1, 117, 385, -1, 131, 386, -1, 53, 263, 4, -1, 287, 387, -1, 120, 5, -1, 59, -1, 349, 349, -1, 349, -1, 349, 349, -1, 349, 12, 349, 349, -1, 349, 349, 12, 349, 349, -1, 287, 349, -1, 287, 349, 349, -1, 287, 349, 12, 349, 349, -1, 287, 349, 349, 12, 349, 349, -1, 32, -1, 276, -1, 121, -1, 349, 349, 12, 59, 5, 5, 5, -1, 349, 349, 4, 349, 349, 12, 59, 5, 5, 5, 5, -1, 349, 349, 12, 349, 349, 5, 5, 5, -1, 349, 349, 4, 349, 349, 12, 349, 349, 5, 5, 5, 5, -1, 349, -1, 349, 349, -1, 287, 389, -1, 121, -1, 349, -1, 349, 349, -1, 252, 392, -1, 192, 393, -1, 187, 394, -1, 297, 391, -1, 341, 396, -1, 228, 351, -1, 349, 349, -1, 177, 349, -1, 147, 349, -1, 135, -1, 175, -1, 349, -1, 187, -1, 341, -1, 340, -1, 297, -1, 192, 395, -1, 245, 4, -1, 30, -1, 250, -1, 245, -1, 94, -1, 162, -1, 78, 349, -1, 245, 4, -1, 171, 4, -1, 4, 349, 349, 4, 6, 6, 4, -1, 241, 349, 349, 349, 349, 349, 349, 4, 6, 4, -1, 40, -1, 193, 398, -1, 110, -1, 4, 349, 349, 4, 6, 6, 4, -1, 241, 349, 349, 349, 349, 349, 349, 4, 6, 4, -1, 363, -1, 176, 349, -1, 31, 401, -1, 66, 5, -1, 80, 360, 364, -1, 83, 402, -1, 91, 4, -1, 99, -1, 99, 17, -1, 174, 5, 4, 4, 5, 360, 364, -1, 215, 5, 4, 4, 6, 360, 364, -1, 248, 5, 360, 364, -1, 335, 4, -1, 142, -1, 200, -1, 248, 5, 360, 364, -1, 5, 4, 4, 403, 4, 4, 363, 349, 367, 349, 349, 5, -1, 224, 510, -1, 266, -1, 46, -1, -1, 349, 349, 349, 349, 360, 364, -1, 59, 359, 360, 364, 349, 349, 360, 366, -1, 283, 405, -1, 40, 349, 349, -1, 193, 349, 349, -1, 110, 349, 349, -1, -1, 349, 349, 360, -1, 40, 349, 349, 4, -1, 193, 349, 349, 4, -1, 110, 349, 349, 4, -1, 362, 349, 349, -1, 360, 364, 359, -1, 351, -1, 305, 349, 349, -1, 40, 193, 362, 349, 349, -1, 193, 362, 349, 349, -1, 40, 193, 360, 359, -1, 193, 360, 359, -1, 33, 4, -1, 141, 116, 5, -1, 41, 66, -1, 44, 410, -1, 46, 412, -1, 65, 413, -1, 68, 418, -1, 67, 417, -1, 69, 420, -1, 77, 422, -1, 79, 426, -1, 84, 427, -1, 86, 428, -1, 88, 430, -1, 87, 429, -1, 93, 431, -1, 95, -1, 122, 435, -1, 138, 441, -1, 150, 5, 5, 4, -1, 151, 89, 5, 5, 349, 349, 362, -1, 154, 433, -1, 158, 432, -1, 161, 16, -1, 187, -1, 183, 503, 497, -1, 184, 442, -1, 196, 66, -1, 211, -1, 212, 443, -1, 219, 278, 362, 349, 349, 4, 4, 5, -1, 241, 444, -1, 243, 445, -1, 266, 446, -1, 282, -1, 283, 447, -1, 291, -1, 298, 362, 349, 349, -1, 304, 89, 5, 5, 349, 349, 362, -1, 306, 452, -1, 342, 454, -1, 100, -1, 117, -1, 131, -1, 53, 263, -1, 88, -1, 120, -1, 71, 411, -1, 173, -1, -1, 187, 5, -1, 103, 5, -1, 117, -1, 414, -1, 252, -1, 192, -1, 187, 415, -1, 297, 168, -1, 341, 416, -1, 228, -1, -1, 349, -1, 187, -1, 341, -1, 340, -1, 297, -1, 192, -1, 245, -1, 78, -1, 245, -1, 171, -1, -1, 279, -1, 168, 419, -1, 4, -1, 4, 362, 349, 349, -1, 4, 349, 349, 363, 349, -1, -1, 168, 421, -1, 176, -1, 4, 349, 349, 363, 349, -1, 360, 364, -1, 31, 423, -1, 65, 424, -1, 66, -1, 91, -1, 168, -1, 205, 168, -1, 186, -1, 69, 425, -1, 266, -1, 335, -1, 66, -1, 91, -1, 335, -1, -1, 192, -1, -1, 176, -1, 349, 349, 360, 364, 365, -1, 362, 349, 349, 360, 364, 365, -1, 349, 360, 360, 4, -1, 360, 364, 365, -1, 59, 360, 364, 365, 360, 366, -1, 283, 360, -1, 362, -1, 360, 364, 365, 352, -1, 274, -1, 33, -1, 362, -1, 360, 364, 365, 352, -1, 360, 364, 359, 349, 349, 5, -1, 4, 360, 364, 359, 349, 349, 5, -1, 362, 349, 349, 4, 4, -1, 5, -1, 65, -1, 362, 349, 349, 5, -1, 6, 4, 4, 4, 4, -1, 88, -1, 119, 195, 434, -1, -1, 4, -1, 349, 349, -1, 198, -1, 59, 360, 364, 365, 352, -1, 81, -1, 100, 438, -1, 45, -1, 116, 436, -1, 119, 195, 439, -1, 143, 437, -1, 144, -1, 206, 195, -1, 263, -1, 263, 360, 364, 366, 352, -1, 264, 440, -1, 335, -1, 4, -1, 362, 349, 349, -1, 4, -1, 165, 5, -1, 4, 165, 5, -1, 306, 4, -1, -1, 4, -1, 353, -1, 353, 362, 349, 349, -1, 353, 4, -1, -1, 4, -1, 360, -1, 4, 360, -1, -1, 210, -1, 299, -1, 66, -1, 182, -1, 286, -1, 228, -1, 61, -1, 277, -1, 300, -1, 352, -1, 131, -1, 235, -1, 300, 451, -1, 47, 448, -1, 74, 449, -1, 148, 450, -1, 186, -1, 37, -1, 249, -1, -1, 66, -1, -1, 66, -1, -1, 66, -1, -1, 222, -1, -1, 16, 453, -1, 195, 361, -1, -1, 223, -1, 352, -1, 83, 456, -1, 99, -1, 360, 364, 365, 457, 5, 5, -1, 360, 364, 365, 457, 5, -1, 20, -1, 231, -1, 19, -1, 44, 459, -1, 77, 460, -1, 84, -1, 94, -1, 95, -1, 101, -1, 122, 461, -1, 138, -1, 154, -1, 162, -1, 183, 462, -1, 218, -1, 266, -1, 277, 360, -1, 306, 463, -1, 72, 5, -1, -1, 31, -1, -1, 44, -1, 87, -1, 191, -1, 148, -1, 254, -1, 215, -1, 292, -1, 360, -1, 114, 360, -1, 58, 360, -1, 18, -1, 283, 360, -1, 199, 4, 4, -1, 115, -1, 185, 5, -1, 88, 466, -1, 255, 119, 195, 465, -1, 255, 6, 4, 4, 4, 4, -1, 296, -1, 306, 349, 349, 349, 349, 349, 349, 349, 349, 4, -1, 5, -1, 5, 4, -1, 4, 4, 56, -1, 4, 4, 360, -1, 192, 351, -1, 26, 468, -1, 111, 470, -1, 122, 471, -1, 157, 484, -1, 204, 482, -1, 217, 483, -1, 5, 14, 5, 370, -1, 5, 15, 5, 370, -1, 5, 61, 5, 370, -1, 5, 189, 370, -1, 5, 190, 370, -1, 5, 258, 368, 4, 370, -1, 5, 267, 4, 370, -1, 5, 268, 4, 370, -1, 5, 299, 5, 370, -1, 241, 87, 469, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, -1, 5, 190, -1, 5, 258, 368, 4, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, -1, 5, 5, 265, -1, 5, 14, 5, 370, -1, 5, 15, 5, 370, -1, 5, 61, 5, 370, -1, 5, 189, 369, 370, -1, 5, 5, 265, 369, 370, -1, 5, 190, 369, 370, -1, 5, 258, 368, 4, 369, 370, -1, 5, 272, 368, 4, 4, 369, 370, -1, 5, 267, 4, 370, -1, 5, 268, 4, 370, -1, 5, 299, 5, 369, 370, -1, 264, 472, -1, 116, 87, 473, -1, 241, 155, 481, -1, 241, 87, 480, -1, 191, 474, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, 369, -1, 5, 5, 265, 369, -1, 5, 190, 369, -1, 5, 258, 368, 4, 369, -1, 5, 272, 368, 4, 4, 369, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, 369, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, 369, -1, 5, 190, 369, -1, 5, 258, 368, 4, 369, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, 369, -1, 155, 161, 475, -1, 161, 476, -1, 155, 477, -1, 478, -1, 155, 334, 479, -1, 5, 14, 5, 370, -1, 5, 15, 5, 370, -1, 5, 61, 5, 370, -1, 5, 189, 369, 370, -1, 5, 190, 369, 370, -1, 5, 258, 368, 4, 369, 370, -1, 5, 267, 4, 370, -1, 5, 268, 4, 370, -1, 5, 299, 5, 369, 370, -1, 5, 14, 5, 370, -1, 5, 15, 5, 370, -1, 5, 61, 5, 370, -1, 5, 189, 369, 370, -1, 5, 5, 265, 369, 370, -1, 5, 190, 369, 370, -1, 5, 258, 368, 4, 369, 370, -1, 5, 272, 368, 4, 4, 369, 370, -1, 5, 267, 4, 370, -1, 5, 268, 4, 370, -1, 5, 299, 5, 369, 370, -1, 361, 5, 14, 5, 370, -1, 361, 5, 15, 5, 370, -1, 361, 5, 61, 5, 370, -1, 361, 5, 189, 369, 370, -1, 361, 5, 190, 369, 370, -1, 361, 5, 258, 368, 4, 369, 370, -1, 361, 5, 267, 4, 370, -1, 361, 5, 268, 4, 370, -1, 361, 5, 299, 5, 369, 370, -1, 361, 5, 14, 5, 370, -1, 361, 5, 15, 5, 370, -1, 361, 5, 61, 5, 370, -1, 361, 5, 189, 369, 370, -1, 361, 5, 5, 265, 369, 370, -1, 361, 5, 190, 369, 370, -1, 361, 5, 258, 368, 4, 369, 370, -1, 361, 5, 272, 368, 4, 4, 369, 370, -1, 361, 5, 267, 4, 370, -1, 361, 5, 268, 4, 370, -1, 361, 5, 299, 5, 369, 370, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, 369, -1, 5, 190, 369, -1, 5, 258, 368, 4, 369, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, 369, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, 369, -1, 5, 5, 265, 369, -1, 5, 190, 369, -1, 5, 258, 368, 4, 369, -1, 5, 272, 368, 4, 4, 369, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, 369, -1, 5, 14, 5, -1, 5, 15, 5, -1, 5, 61, 5, -1, 5, 189, 369, -1, 5, 190, 369, -1, 5, 258, 368, 4, 369, -1, 5, 267, 4, -1, 5, 268, 4, -1, 5, 299, 5, 369, -1, 5, 14, 5, 370, -1, 5, 61, 5, 370, -1, 5, 189, 370, -1, 5, 258, 368, 4, 370, -1, 5, 267, 4, 370, -1, 5, 299, 5, 370, -1, 5, 5, -1, 264, 5, 5, -1, 93, 4, 4, 4, 4, 4, -1, 187, 4, 4, 4, 4, 4, -1, 110, -1, 227, -1, 351, -1, 136, 351, -1, 88, 351, -1, 66, 5, -1, 5, 4, 4, -1, 296, 349, 349, -1, 342, 349, -1, 5, 5, 361, 364, 5, 5, 361, 364, 349, 361, 366, 5, -1, 60, 491, -1, 66, 5, -1, 80, -1, 73, 496, 5, -1, 73, 496, 299, 5, -1, 75, 99, -1, -1, 83, 489, 492, -1, 89, -1, 99, -1, 99, 17, -1, 105, 495, -1, 113, 4, -1, 128, 5, -1, 148, 17, -1, 148, 209, 349, 349, -1, 148, 288, 349, 349, -1, 4, 20, 373, 351, -1, 4, 21, 355, -1, 4, 21, 355, 362, -1, 4, 21, 355, 360, 364, -1, 4, 22, 235, 349, 349, 4, 362, -1, 4, 22, 235, 349, 349, 4, 360, 366, -1, 4, 22, 235, 5, 360, 366, -1, 4, 49, 235, 349, 349, 349, 4, 362, -1, 4, 49, 235, 349, 349, 349, 4, 360, 366, -1, 4, 49, 235, 5, 360, 366, -1, 4, 48, 235, 349, 349, 362, -1, 4, 48, 235, 349, 349, 360, 366, -1, 4, 52, 105, 355, 355, 4, 349, 349, 349, 4, -1, 4, 52, 105, 355, 355, 4, 349, 349, 349, 4, 362, -1, 4, 52, 105, 355, 355, 4, 349, 349, 349, 4, 360, 364, -1, 4, 52, 105, 5, 5, 360, 364, 360, 366, -1, 4, 55, 490, 5, 5, -1, 4, 62, 235, 349, 362, -1, 4, 62, 235, 349, 360, 366, -1, 4, 66, 5, -1, 4, 74, 27, 351, 351, -1, 4, 74, 166, 5, 5, -1, 4, 74, 235, 349, 362, -1, 4, 74, 235, 349, 360, 366, -1, 4, 74, 277, 360, 364, -1, 4, 75, 135, 351, -1, 4, 82, 105, 355, 355, 4, 349, 349, 4, -1, 4, 82, 105, 355, 355, 4, 349, 349, 4, 362, -1, 4, 82, 105, 355, 355, 4, 349, 349, 4, 360, 364, -1, 4, 82, 105, 5, 5, 360, 364, 360, 366, -1, 4, 83, 22, 235, 349, 349, -1, 4, 83, 49, 235, 349, 349, -1, 4, 83, 52, 21, 349, 349, -1, 4, 83, 52, 235, 349, 349, -1, 4, 83, 109, 235, 349, 349, -1, 4, 83, 112, 21, 349, 349, -1, 4, 83, 112, 235, 349, 349, -1, 4, 83, 82, 21, 349, 349, -1, 4, 83, 82, 235, 349, 349, -1, 4, 83, 224, 303, 4, 349, 349, -1, 4, 83, 253, 303, 4, 349, 349, -1, 4, 99, -1, 4, 99, 22, 4, -1, 4, 99, 49, 4, -1, 4, 99, 52, 4, -1, 4, 99, 109, 4, -1, 4, 99, 55, 490, 5, -1, 4, 99, 112, 4, -1, 4, 99, 82, 4, -1, 4, 99, 224, 303, 4, -1, 4, 99, 253, 303, 4, -1, 4, 99, 279, -1, 4, 99, 279, 5, -1, 4, 99, 279, 4, -1, 4, 105, 40, 4, -1, 4, 108, 235, 349, 349, 362, -1, 4, 108, 235, 349, 349, 360, 366, -1, 4, 109, 235, 349, 349, 349, 4, 362, -1, 4, 109, 235, 349, 349, 349, 4, 360, 366, -1, 4, 109, 235, 5, 360, 366, -1, 4, 112, 105, 355, 355, 4, 349, 349, 349, 4, -1, 4, 112, 105, 355, 355, 4, 349, 349, 349, 4, 362, -1, 4, 112, 105, 355, 355, 4, 349, 349, 349, 4, 360, 364, -1, 4, 112, 105, 5, 5, 360, 364, 360, 366, -1, 4, 128, 5, -1, 4, 148, -1, 4, 148, 209, -1, 4, 171, 27, 351, 351, -1, 4, 171, 222, 362, 359, 359, -1, 4, 171, 222, 360, 364, 359, 359, -1, 4, 194, 349, 349, -1, 4, 194, 129, -1, 4, 194, 36, -1, 4, 194, 287, 362, 349, 349, -1, 4, 194, 287, 360, 364, 359, -1, 4, 224, 239, 349, 349, 362, -1, 4, 224, 239, 349, 349, 360, 366, -1, 4, 253, 239, 349, 349, 362, -1, 4, 253, 239, 349, 349, 360, 366, -1, 4, 222, 257, 371, -1, 4, 222, 263, 4, -1, 4, 229, 362, 359, 359, 349, -1, 4, 229, 360, 364, 359, 359, 349, 360, 366, -1, 4, 230, 509, 351, -1, 4, 243, 40, -1, 4, 244, 222, 362, 359, 359, -1, 4, 244, 222, 360, 364, 359, 359, -1, 4, 244, 277, 360, 364, 360, 366, -1, 4, 254, -1, 4, 254, 209, -1, 4, 279, 5, -1, 4, 281, 5, -1, 4, 281, 243, 351, -1, 4, 293, -1, 4, 295, -1, 4, 301, 27, 351, -1, 4, 301, 222, 362, 359, 349, 355, -1, 4, 301, 222, 360, 364, 359, 360, 366, 349, 355, -1, 4, 335, 4, -1, 164, -1, 164, 349, 349, -1, 173, 504, -1, 174, 505, -1, 194, 506, -1, 228, 351, -1, 230, 509, 351, -1, 230, 509, 351, 349, 349, -1, 243, 40, 349, 349, -1, 243, 193, 349, 349, 4, -1, 243, 110, -1, 248, 5, 496, 360, 364, 365, 351, -1, 248, 280, 5, -1, 254, 513, -1, 261, 514, -1, 5, 66, 5, -1, 5, 80, -1, 5, 99, -1, 5, 89, -1, 5, 128, 5, -1, 5, 148, -1, 5, 148, 209, -1, 5, 194, 349, 349, -1, 5, 194, 129, -1, 5, 194, 36, -1, 5, 194, 287, 362, 359, -1, 5, 194, 287, 360, 364, 359, -1, 5, 230, 509, 351, -1, 5, 254, -1, 5, 254, 209, -1, 5, 293, -1, 5, 295, -1, 279, 105, 5, 5, -1, 279, 99, 5, -1, 279, 99, 17, -1, 279, 5, -1, 279, 296, 5, -1, 215, -1, 215, 360, 360, -1, 292, -1, 293, 17, -1, 295, 17, -1, 335, 4, -1, 254, -1, 295, -1, 148, -1, 293, -1, 40, 194, -1, 194, -1, 110, 194, -1, 40, 105, -1, 105, -1, 110, 105, -1, 40, 243, -1, 243, -1, 110, 243, -1, 99, -1, 281, -1, 66, -1, 335, -1, 230, -1, 128, -1, 164, -1, 296, -1, -1, 4, -1, 30, 351, -1, 235, 349, -1, 160, 4, -1, 210, 4, 349, -1, 62, 349, 349, 349, 510, -1, 108, 349, 349, 349, 349, 354, 510, -1, 48, 349, 349, 349, 349, 354, 510, -1, 224, 349, 349, 349, 349, 510, -1, 253, 349, 349, 349, 349, 510, -1, 171, 349, 349, 349, 349, 510, -1, 301, 349, 349, 349, 349, 510, -1, 281, 349, 349, 354, 510, -1, 62, 222, 349, 349, 372, 510, -1, 48, 222, 349, 349, 372, 510, -1, 102, 222, 349, 349, 372, 510, -1, 85, 222, 349, 349, 372, 510, -1, 345, 222, 349, 349, 372, 510, -1, 27, 222, 349, 349, 372, 510, -1, 51, 222, 349, 349, 372, 510, -1, 244, 349, 349, 349, 349, 360, 364, 360, 366, 510, -1, 74, 349, 349, 349, 360, 364, 510, -1, 229, 349, 349, 349, 349, 349, 510, -1, 22, 349, 349, 349, 349, 4, 510, -1, 109, 349, 349, 349, 349, 349, 4, 354, 510, -1, 49, 349, 349, 349, 349, 349, 4, 354, 510, -1, 82, 349, 349, 355, 355, 4, 349, 349, 4, 510, -1, 112, 349, 349, 355, 355, 4, 349, 349, 349, 4, 354, 510, -1, 52, 349, 349, 355, 355, 4, 349, 349, 349, 4, 354, 510, -1, 75, 510, -1, 280, 493, -1, 5, 349, 349, -1, 299, 5, 349, 349, -1, 349, 349, 299, 5, -1, 5, 360, 364, 359, -1, 4, 4, -1, 40, 349, 349, 4, -1, 193, 349, 349, 4, -1, 110, -1, 104, -1, 337, -1, 63, -1, 247, -1, 246, -1, 232, -1, 338, -1, 60, 498, -1, 66, -1, 128, -1, 113, -1, 140, 349, 349, -1, 153, 349, 349, -1, 146, 20, 82, 360, -1, 146, 20, 150, 5, 5, 4, -1, 146, 20, 220, 5, 5, 5, 5, 360, 364, 374, -1, 146, 20, 221, 5, 5, 360, 374, -1, 146, 20, 234, 5, 5, 5, 360, -1, 146, 20, 273, 360, 364, -1, 4, 20, 82, 360, -1, 4, 20, 150, 5, 5, 4, -1, 4, 20, 220, 5, 5, 5, 5, 360, 364, 374, -1, 4, 20, 221, 5, 5, 360, 374, -1, 4, 20, 234, 5, 5, 5, 360, -1, 4, 20, 273, 360, 364, -1, 153, 17, -1, 4, 21, -1, 4, 21, 362, -1, 4, 21, 360, 364, -1, 4, 22, 235, 362, -1, 4, 22, 235, 360, 366, -1, 4, 49, 235, 362, -1, 4, 49, 235, 360, 366, -1, 4, 48, 235, 362, -1, 4, 48, 235, 360, 366, -1, 4, 52, 21, -1, 4, 52, 21, 362, -1, 4, 52, 21, 360, 364, -1, 4, 52, 235, 362, -1, 4, 52, 235, 360, 366, -1, 4, 59, 362, -1, 4, 59, 360, 364, 365, -1, 4, 62, 235, 362, -1, 4, 62, 235, 360, 366, -1, 4, 66, -1, 4, 74, 27, -1, 4, 74, 166, -1, 4, 74, 235, 362, -1, 4, 74, 235, 360, 366, -1, 4, 74, 277, -1, 4, 75, 135, -1, 4, 82, 21, -1, 4, 82, 21, 362, -1, 4, 82, 21, 360, 364, -1, 4, 82, 235, 362, -1, 4, 82, 235, 360, 366, -1, 4, 108, 235, 362, -1, 4, 108, 235, 360, 366, -1, 4, 109, 235, 362, -1, 4, 109, 235, 360, 366, -1, 4, 112, 21, -1, 4, 112, 21, 362, -1, 4, 112, 21, 360, 364, -1, 4, 112, 235, 362, -1, 4, 112, 235, 360, 366, -1, 4, 128, -1, 4, 148, -1, 4, 171, 27, -1, 4, 171, 167, 360, 366, -1, 4, 171, 222, 362, -1, 4, 171, 222, 360, 364, 365, -1, 4, 181, 167, 349, 360, 366, -1, 4, 222, 257, -1, 4, 222, 263, -1, 4, 229, 222, 362, -1, 4, 229, 222, 360, 364, 365, -1, 4, 229, 167, 360, 366, -1, 4, 229, 285, 362, -1, 4, 229, 285, 360, 366, -1, 4, 230, -1, 4, 230, 509, -1, 4, 244, 167, 360, 366, -1, 4, 244, 222, 362, -1, 4, 244, 222, 360, 364, 365, -1, 4, 244, 277, -1, 4, 254, -1, 4, 279, -1, 4, 279, 4, -1, 4, 281, -1, 4, 281, 243, -1, 4, 291, -1, 4, 301, 27, -1, 4, 301, 167, 360, 366, -1, 4, 301, 222, 362, -1, 4, 301, 222, 360, 364, 365, -1, 4, 335, -1, 148, 499, -1, 148, 205, -1, 205, -1, 224, 253, 349, 349, -1, 253, 253, 349, 349, -1, 228, -1, 230, 509, -1, 254, 500, -1, 254, 205, -1, 261, 501, -1, 5, 66, -1, 5, 128, -1, 5, 153, -1, 5, 230, 509, -1, 5, 279, -1, 5, 279, 205, -1, 279, 17, -1, 279, 98, 195, -1, 335, -1, 30, -1, 235, -1, 160, -1, 210, -1, -1, 349, 349, -1, -1, 349, 349, -1, -1, 281, -1, -1, -1, 223, -1, 236, -1, 297, -1, 57, -1, 20, -1, 496, 360, 364, 365, 351, 511, 517, -1, 254, 496, 360, 364, 365, 351, 511, 517, -1, 496, 5, -1, 496, 5, 360, 364, -1, 496, 4, -1, 496, 4, 360, 364, -1, 122, 5, 5, 494, 4, 5, -1, 349, 349, -1, 129, -1, 36, -1, 40, 349, 349, -1, 193, 349, 349, -1, 110, -1, 287, 362, 359, -1, 287, 360, 364, 359, -1, 507, 508, -1, 508, -1, 509, 346, 351, -1, 66, 346, 5, -1, 92, 346, 4, 4, -1, 335, 346, 4, -1, 128, 346, 5, -1, 281, 346, 5, -1, 520, -1, 521, -1, 202, -1, 254, -1, 148, -1, 91, -1, 124, -1, 105, -1, 194, -1, 243, -1, 99, -1, 156, -1, 269, -1, 502, -1, 502, 507, -1, -1, -1, 512, 515, -1, 17, -1, 209, 349, 349, -1, 288, -1, 288, 349, 349, -1, 351, -1, 281, 351, -1, 515, 516, -1, 516, -1, 509, 346, 351, -1, -1, -1, 518, 519, -1, 519, 520, -1, 520, -1, 279, 346, 5, -1, 55, 346, 490, 5, 5, -1, 64, -1, 66, 5, -1, 182, 4, -1, 286, 349, -1, 345, -1, 343, -1, 338, -1, 202, -1, 349, 349, 349, 349, -1, 349, 349, -1, 362, 349, 349, -1, 360, 364, 359, -1, 287, 525, -1, 39, 349, 349, -1, 193, 526, -1, 228, 351, -1, 349, 349, -1, 362, 349, 349, -1, 360, 364, 359, -1, 40, 349, 349, -1, 349, 349, -1, 110, 349, 349, -1, 351, -1, 306, 361, 364, -1, 5, 4, 4, -1, 296, -1, 70, 529, -1, 168, 4, -1, 240, 4, -1, 249, 349, -1, 54, -1, 137, -1, 241, -1, 90, -1, 148, 531, -1, 254, 532, -1, 40, 349, 349, -1, 193, 349, 349, -1, 110, -1, 259, 110, -1, 40, 349, 349, -1, 193, 349, 349, -1, 110, -1, 259, 110, -1, 188, -1, 13, -1, 202, -1, 34, -1, 107, -1, 61, 5, -1, 277, 360, -1, 300, 4, 4, 4, -1, 349, -1, 349, 97, -1, 193, 537, -1, 287, 349, -1, 287, 349, 97, -1, 40, -1, 349, -1, 110, -1, 26, 539, -1, 122, 541, -1, 204, 551, -1, 111, 552, -1, 217, 5, -1, 119, 5, 375, -1, 61, 5, 375, -1, 267, 4, 375, -1, 241, 87, 540, -1, 119, 5, 375, -1, 61, 5, 375, -1, 267, 4, 375, -1, 542, -1, 155, 542, -1, 278, 543, -1, 264, 544, -1, 116, 87, 545, -1, 191, 546, -1, 241, 155, 548, -1, 241, 87, 549, -1, 238, 550, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 155, 547, -1, 119, 5, 4, -1, 61, 5, 4, -1, 267, 4, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, -1, 61, 5, -1, 267, 4, -1, 119, 5, 375, -1, 61, 5, 375, -1, 267, 4, 375, -1, 119, 5, 5, 375, -1, 554, 4, -1, 99, -1, 50, -1, 133, -1, 289, -1, -1, 4, 349, 349, 349, 349, -1, 203, -1, 203, 4, 349, 349, 349, 349, -1, 122, 264, 556, -1, 4, -1, 349, 360, -1, 4, 4, -1, 4, 349, 360, -1, 349, 349, -1, 287, 349, 349, -1, 361, 364, 365, -1, 16, 561, -1, 239, 4, -1, 237, 560, -1, 23, 559, -1, 4, 4, -1, 4, 5, -1, 281, 4, 5, -1, 4, 4, -1, 4, 5, -1, 281, 4, 5, -1, 4, -1, 4, 361, 364, -1, 4, 6, 361, 364, -1, 227, -1, 349, 349, -1, 349, 349, 12, 349, 349, -1, 349, 349, 12, 362, 349, 349, -1, 349, 349, 12, 360, 364, 359, -1, 287, 564, -1, 121, -1, 121, 349, -1, 349, 349, -1, 349, 349, 12, 349, 349, -1, 349, 349, 12, 362, 349, 349, -1, 349, 349, 12, 360, 364, 359, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 448, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 502, 503, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 521, 523, 524, 525, 526, 528, 529, 530, 531, 534, 535, 536, 537, 538, 541, 542, 543, 544, 545, 548, 549, 552, 553, 554, 557, 560, 563, 566, 578, 585, 592, 600, 601, 602, 603, 604, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 637, 638, 641, 642, 643, 644, 645, 646, 647, 648, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 664, 665, 666, 669, 670, 671, 672, 675, 676, 677, 678, 679, 682, 683, 684, 687, 688, 689, 692, 693, 694, 697, 698, 699, 700, 701, 702, 703, 704, 707, 708, 711, 712, 713, 714, 715, 716, 719, 720, 721, 724, 725, 726, 727, 728, 729, 732, 733, 734, 735, 736, 737, 738, 739, 740, 744, 745, 748, 749, 752, 753, 756, 757, 759, 760, 761, 764, 765, 768, 770, 772, 774, 776, 778, 780, 782, 784, 788, 789, 790, 791, 792, 793, 794, 795, 798, 799, 802, 803, 804, 806, 808, 809, 810, 812, 816, 817, 820, 821, 823, 826, 828, 834, 835, 836, 839, 840, 841, 844, 845, 846, 847, 848, 849, 856, 857, 858, 861, 862, 865, 866, 867, 868, 869, 872, 873, 878, 879, 880, 884, 885, 888, 889, 890, 893, 896, 898, 899, 900, 903, 906, 910, 911, 914, 915, 916, 918, 919, 920, 921, 922, 924, 926, 928, 931, 932, 933, 937, 939, 944, 945, 948, 949, 952, 955, 956, 957, 958, 961, 962, 963, 964, 965, 968, 970, 972, 973, 975, 977, 979, 981, 985, 988, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1030, 1032, 1033, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1046, 1047, 1048, 1051, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1067, 1068, 1069, 1070, 1071, 1072, 1075, 1076, 1079, 1080, 1081, 1084, 1085, 1088, 1091, 1092, 1094, 1098, 1099, 1100, 1103, 1107, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1121, 1122, 1123, 1126, 1127, 1130, 1131, 1134, 1137, 1143, 1147, 1149, 1152, 1155, 1156, 1158, 1161, 1164, 1165, 1170, 1173, 1176, 1181, 1182, 1183, 1187, 1188, 1189, 1192, 1193, 1194, 1197, 1198, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1213, 1214, 1217, 1218, 1221, 1222, 1223, 1224, 1227, 1228, 1231, 1233, 1236, 1240, 1241, 1242, 1243, 1246, 1247, 1248, 1251, 1252, 1253, 1256, 1259, 1260, 1261, 1264, 1267, 1268, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1280, 1281, 1284, 1285, 1288, 1289, 1292, 1293, 1296, 1297, 1298, 1301, 1302, 1305, 1308, 1309, 1312, 1315, 1322, 1323, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1344, 1347, 1348, 1351, 1352, 1353, 1354, 1357, 1358, 1359, 1360, 1363, 1364, 1365, 1366, 1367, 1370, 1371, 1372, 1373, 1374, 1375, 1377, 1378, 1383, 1384, 1387, 1389, 1391, 1394, 1395, 1396, 1397, 1398, 1399, 1402, 1404, 1406, 1408, 1410, 1412, 1415, 1417, 1419, 1421, 1424, 1425, 1426, 1427, 1428, 1429, 1431, 1432, 1433, 1436, 1439, 1441, 1443, 1445, 1448, 1451, 1454, 1457, 1460, 1462, 1464, 1467, 1468, 1469, 1470, 1471, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1498, 1500, 1502, 1504, 1506, 1508, 1511, 1513, 1515, 1519, 1520, 1521, 1522, 1523, 1526, 1529, 1532, 1535, 1538, 1541, 1545, 1548, 1551, 1556, 1559, 1562, 1565, 1568, 1571, 1574, 1578, 1582, 1585, 1588, 1593, 1596, 1599, 1602, 1605, 1608, 1612, 1615, 1618, 1623, 1626, 1629, 1632, 1635, 1638, 1641, 1645, 1649, 1652, 1655, 1660, 1662, 1664, 1666, 1668, 1670, 1673, 1675, 1677, 1680, 1681, 1682, 1683, 1685, 1687, 1689, 1692, 1695, 1696, 1697, 1701, 1702, 1703, 1704, 1706, 1708, 1711, 1712, 1713, 1717, 1719, 1721, 1723, 1726, 1728, 1732, 1733, 1736, 1737, 1738, 1741, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1757, 1765, 1766, 1767, 1768, 1770, 1772, 1773, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1781, 1782, 1784, 1787, 1790, 1791, 1792, 1795, 1797, 1800, 1803, 1806, 1810, 1813, 1815, 1818, 1821, 1825, 1830, 1835, 1837, 1839, 1841, 1842, 1844, 1846, 1848, 1850, 1852, 1853, 1855, 1857, 1861, 1866, 1868, 1870, 1872, 1874, 1876, 1878, 1880, 1882, 1884, 1886, 1889, 1890, 1892, 1894, 1895, 1897, 1899, 1900, 1901, 1903, 1905, 1906, 1907, 1909, 1910, 1912, 1915, 1919, 1923, 1926, 1929, 1933, 1938, 1944, 1945, 1946, 1948, 1949, 1951, 1955, 1957, 1958, 1959, 1961, 1964, 1966, 1969, 1971, 1974, 1976, 1978, 1981, 1986, 1989, 1990, 1993, 1996, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2010, 2011, 2013, 2018, 2020, 2021, 2023, 2024, 2025, 2026, 2027, 2028, 2030, 2032, 2034, 2035, 2038, 2039, 2041, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2055, 2057, 2059, 2060, 2061, 2062, 2064, 2065, 2066, 2067, 2068, 2070, 2071, 2073, 2074, 2075, 2076, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2102, 2103, 2104, 2105, 2106, 2107, 2114, 2121, 2130, 2139, 2146, 2153, 2161, 2169, 2176, 2181, 2186, 2191, 2196, 2201, 2206, 2212, 2221, 2231, 2241, 2248, 2258, 2268, 2277, 2289, 2302, 2307, 2310, 2312, 2314, 2319, 2323, 2326, 2328, 2330, 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2342, 2343, 2344, 2345, 2346, 2347, 2349, 2351, 2353, 2355, 2357, 2359, 2362, 2364, 2366, 2368, 2370, 2372, 2375, 2376, 2377, 2378, 2380, 2382, 2385, 2387, 2389, 2391, 2393, 2394, 2395, 2397, 2399, 2402, 2404, 2407, 2409, 2411, 2412, 2413, 2414, 2416, 2418, 2419, 2420, 2421, 2422, 2424, 2426, 2428, 2430, 2432, 2434, 2437, 2438, 2439, 2441, 2443, 2445, 2446, 2447, 2448, 2450, 2452, 2455, 2459, 2460, 2461, 2463, 2466, 2469, 2471, 2473, 2474, 2475, 2477, 2479, 2482, 2483, 2485, 2486, 2487, 2488, 2489, 2491, 2492, 2494, 2496, 2499, 2500, 2501, 2502, 2503, 2505, 2507, 2508, 2509, 2510, 2512, 2514, 2515, 2516, 2517, 2518, 2519, 2521, 2522, 2524, 2527, 2528, 2529, 2530, 2533, 2534, 2537, 2538, 2541, 2542, 2545, 2558, 2559, 2563, 2564, 2568, 2569, 2572, 2577, 2584, 2586, 2589, 2591, 2594, 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2606, 2610, 2611, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2624, 2625, 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2637, 2638, 2641, 2642, 2642, 2645, 2646, 2647, 2648, 2651, 2652, 2655, 2656, 2659, 2663, 2664, 2664, 2667, 2668, 2671, 2674, 2678, 2679, 2680, 2681, 2684, 2685, 2686, 2687, 2690, 2692, 2693, 2698, 2700, 2701, 2702, 2703, 2706, 2707, 2712, 2716, 2717, 2718, 2721, 2722, 2727, 2728, 2731, 2733, 2734, 2735, 2738, 2739, 2740, 2741, 2744, 2745, 2748, 2750, 2752, 2753, 2756, 2758, 2759, 2760, 2763, 2764, 2767, 2768, 2769, 2772, 2773, 2774, 2777, 2778, 2779, 2780, 2781, 2784, 2785, 2786, 2789, 2790, 2791, 2792, 2793, 2796, 2798, 2800, 2802, 2805, 2807, 2809, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, 2820, 2823, 2824, 2825, 2828, 2829, 2830, 2833, 2834, 2835, 2838, 2839, 2840, 2843, 2844, 2845, 2846, 2849, 2850, 2851, 2854, 2855, 2856, 2859, 2860, 2861, 2864, 2865, 2866, 2869, 2871, 2873, 2877, 2881, 2882, 2885, 2886, 2887, 2890, 2891, 2893, 2894, 2896, 2899, 2900, 2901, 2902, 2905, 2906, 2909, 2911, 2912, 2913, 2914, 2917, 2918, 2919, 2922, 2923, 2924, 2927, 2928, 2933, 2940, 2947, 2948, 2950, 2955, 2958, 2961, 2962, 2963, 2964, 2966, 2971 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "REAL", "INT", "STRING", "POINTER", "ANGDEGREE", "ANGRADIAN", "SEXSTR", "HMSSTR", "DMSSTR", "ABOUT_", "AIP_", "ALLOC_", "ALLOCGZ_", "ALIGN_", "ALL_", "ALT_", "AMPLIFIER_", "ANALYSIS_", "ANGLE_", "ANNULUS_", "APPEND_", "ARCMIN_", "ARCSEC_", "ARRAY_", "ARROW_", "ASINH_", "AST_", "AUTO_", "AUX_", "AVERAGE_", "AXES_", "AZIMUTH_", "B1950_", "BACK_", "BACKGROUND_", "BASE_", "BBOX_", "BEGIN_", "BG_", "BIG_", "BIGENDIAN_", "BIN_", "BITPIX_", "BLOCK_", "BORDER_", "BOX_", "BOXANNULUS_", "BOXCAR_", "BOXCIRCLE_", "BPANDA_", "BUFFER_", "BW_", "CALLBACK_", "CANVAS_", "CATALOG_", "CELESTRIAL_", "CENTER_", "CENTROID_", "CHANNEL_", "CIRCLE_", "CIAO_", "CLEAR_", "CLIP_", "COLOR_", "COLORBAR_", "COLORMAP_", "COLORSCALE_", "COLORSPACE_", "COLS_", "COLUMN_", "COMMAND_", "COMPASS_", "COMPOSITE_", "COMPRESS_", "CONTOUR_", "CONTRAST_", "COORDINATES_", "COPY_", "COUNT_", "CPANDA_", "CREATE_", "CROP_", "CROSS_", "CROSSHAIR_", "CUBE_", "CURSOR_", "CUT_", "CMYK_", "DASH_", "DASHLIST_", "DATA_", "DATAMIN_", "DATASEC_", "DEBUG_", "DEGREES_", "DEFAULT_", "DELETE_", "DEPTH_", "DETECTOR_", "DIAMOND_", "DIM_", "DS9_", "EDIT_", "ECLIPTIC_", "ELEVATION_", "ELLIPSE_", "ELLIPSEANNULUS_", "END_", "ENVI_", "EPANDA_", "EPSILON_", "EQUATORIAL_", "ERASE_", "EXT_", "FACTOR_", "FALSE_", "FILE_", "FILTER_", "FIT_", "FITS_", "FITSY_", "FIXED_", "FK4_", "FK4_NO_E_", "FK5_", "FONT_", "FRONT_", "FULL_", "FUNCTION_", "GALACTIC_", "GAUSSIAN_", "GET_", "GLOBAL_", "GRAPHICS_", "GRAY_", "GRID_", "GZ_", "HANDLE_", "HAS_", "HEAD_", "HEADER_", "HEIGHT_", "HELIOECLIPTIC_", "HIDE_", "HIGH_", "HIGHLITE_", "HISTEQU_", "HISTOGRAM_", "HORIZONTAL_", "ICRS_", "ID_", "IIS_", "IMAGE_", "INCLUDE_", "INCR_", "INFO_", "INTEGER_", "ITERATION_", "IRAF_", "IRAFMIN_", "J2000_", "KEY_", "KEYWORD_", "LABEL_", "LENGTH_", "LEVEL_", "LITTLE_", "LITTLEENDIAN_", "LINE_", "LINEAR_", "LIST_", "LOAD_", "LOCAL_", "LOG_", "LOW_", "MACOSX_", "MAGNIFIER_", "MATCH_", "MAP_", "MARK_", "MARKER_", "MASK_", "MESSAGE_", "METHOD_", "MINMAX_", "MIP_", "MMAP_", "MMAPINCR_", "MOSAIC_", "MODE_", "MOTION_", "MOVE_", "NAME_", "NAN_", "NATIVE_", "NAXES_", "NEW_", "NEXT_", "NO_", "NONE_", "NOW_", "NRRD_", "NUMBER_", "OBJECT_", "OFF_", "ON_", "ONLY_", "OPTION_", "ORIENT_", "PAN_", "PANNER_", "PARSER_", "PASTE_", "PERF_", "PHOTO_", "PHYSICAL_", "PIXEL_", "PLOT2D_", "PLOT3D_", "POINT_", "POINTER_", "POLYGON_", "POSTSCRIPT_", "POW_", "PRINT_", "PRESERVE_", "PROJECTION_", "PROPERTY_", "PUBLICATION_", "PROS_", "QUERY_", "RADIAL_", "RADIUS_", "REGION_", "REPLACE_", "RESAMPLE_", "RESET_", "RESOLUTION_", "RGB_", "ROOT_", "ROTATE_", "RULER_", "SAMPLE_", "SAOIMAGE_", "SAOTNG_", "SAVE_", "SCALE_", "SCAN_", "SCIENTIFIC_", "SCOPE_", "SEGMENT_", "SELECT_", "SET_", "SEXAGESIMAL_", "SHAPE_", "SHARED_", "SHIFT_", "SHMID_", "SHOW_", "SINH_", "SIZE_", "SLICE_", "SMMAP_", "SMOOTH_", "SOCKET_", "SOCKETGZ_", "SOURCE_", "SQRT_", "SQUARED_", "SSHARED_", "STATS_", "STATUS_", "SUPERGALACTIC_", "SUM_", "SYSTEM_", "TABLE_", "TAG_", "TEMPLATE_", "TEXT_", "THREADS_", "THREED_", "THRESHOLD_", "THICK_", "TRANSPARENCY_", "TO_", "TOGGLE_", "TOPHAT_", "TRUE_", "TYPE_", "UNDO_", "UNHIGHLITE_", "UNLOAD_", "UNSELECT_", "UPDATE_", "USER_", "VALUE_", "VAR_", "VIEW_", "VECTOR_", "VERSION_", "VERTEX_", "VERTICAL_", "WARP_", "WCS_", "WCSA_", "WCSB_", "WCSC_", "WCSD_", "WCSE_", "WCSF_", "WCSG_", "WCSH_", "WCSI_", "WCSJ_", "WCSK_", "WCSL_", "WCSM_", "WCSN_", "WCSO_", "WCSP_", "WCSQ_", "WCSR_", "WCSS_", "WCST_", "WCSU_", "WCSV_", "WCSW_", "WCSX_", "WCSY_", "WCSZ_", "WCS0_", "WFPC2_", "WIDTH_", "WIN32_", "XML_", "XY_", "YES_", "ZMAX_", "ZSCALE_", "ZOOM_", "'Y'", "'N'", "'X'", "'='", "$accept", "command", "numeric", "debug", "yesno", "precision", "fileNameType", "optangle", "angle", "sexagesimal", "hms", "dms", "coord", "coordSystem", "wcsSystem", "internalSystem", "scaleType", "skyFrame", "skyFormat", "skyDist", "contourClipMode", "shmType", "incrLoad", "layerType", "pointShape", "pointSize", "analysisMethod", "analysisParam", "endian", "threed", "threedBorder", "threedCompass", "threedHighlite", "threedView", "analysis", "analysisShape", "bin", "binAbout", "binFactor", "binFunction", "binTo", "block", "blockTo", "clip", "clipUser", "clipScope", "clipMode", "clipMinMax", "clipMinMaxMode", "clipZScale", "colormap", "colormapMotion", "colorscale", "contour", "contourAux", "contourCreate", "contourmethod", "crop", "crop3d", "crosshair", "cube", "fitsy", "get", "getBin", "getBinCols", "getBlock", "getClip", "getClipLimits", "getClipMinMax", "getClipZScale", "getColorbar", "getColorMap", "getColorMapLevel", "getColorScale", "getColorScaleLevel", "getContour", "getContourAux", "getContourClip", "getContourColorScale", "getCoord", "getCrop", "getCrosshair", "getCube", "getCursor", "getData", "getInfo", "getiis", "getIISFileName", "getFits", "getFitsExt", "getFitsHeader", "getFitsDepth", "getFitsFileName", "getFitsSlice", "getGrid", "getMask", "getPan", "getRGB", "getRotate", "getSmooth", "getThreed", "getThreedBorder", "getThreedCompass", "getThreedHighlite", "getThreedView", "getWCS", "getWCSAlign", "getZoom", "grid", "gridCreate", "gridType", "has", "hasBin", "hasContour", "hasFits", "hasMarker", "hasWCS", "iis", "iisSetFileName", "iiscursor", "load", "loadArr", "loadArrayRGBCube", "loadENVI", "loadFits", "loadFitsSlice", "loadFitsExtCube", "loadFitsMosaic", "loadFitsMosaicImageIRAF", "loadFitsMosaicIRAF", "loadFitsMosaicImageWCS", "loadFitsMosaicWCS", "loadFitsMosaicImageWFPC2", "loadFitsRGBCube", "loadFitsRGBImage", "loadNRRD", "loadPhoto", "loadIncr", "macosx", "magnifier", "match", "marker", "@1", "markerCallBack", "markerCentroid", "markerCreate", "markerCreateTemplate", "markerDash", "markerEdit", "markerFormat", "markerGet", "markerGetCentroid", "markerGetHighlite", "markerGetSelect", "markerGetShow", "markerInitProp", "markerLayer", "markerList", "markerLoad", "markerMoveSelected", "markerProps", "markerProp", "markerProperty", "markerProperties", "markerQuery", "@2", "markerSelect", "markerShow", "queries", "query", "markerTags", "@3", "tags", "tag", "callback", "mask", "orient", "pan", "panTo", "panMotion", "panner", "postscript", "pscolorspace", "region", "regionHighlite", "regionSelect", "renderMethod", "renderBackground", "rgb", "rotate", "rotateMotion", "save", "saveArray", "saveArrayRGBCube", "saveFits", "saveFitsImage", "saveFitsTable", "saveFitsSlice", "saveFitsExtCube", "saveFitsMosaic", "saveFitsMosaicImage", "saveFitsRGBImage", "saveFitsRGBCube", "saveFitsResample", "saveNRRD", "saveENVI", "smooth", "smoothFunction", "update", "updateFitsSlice", "warp", "wcs", "wcsAppend", "wcsReplace", "wcsAlign", "win32", "zoom", "zoomTo", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 89, 78, 88, 61 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { 0, 347, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 349, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 353, 353, 353, 353, 353, 354, 354, 355, 355, 355, 356, 357, 358, 359, 359, 359, 359, 360, 360, 360, 360, 360, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 362, 362, 363, 363, 363, 363, 363, 363, 363, 363, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 366, 366, 366, 366, 367, 367, 367, 367, 367, 368, 368, 368, 369, 369, 369, 370, 370, 370, 371, 371, 371, 371, 371, 371, 371, 371, 372, 372, 373, 373, 373, 373, 373, 373, 374, 374, 374, 375, 375, 375, 375, 375, 375, 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, 377, 378, 378, 379, 379, 380, 380, 380, 380, 380, 381, 381, 382, 382, 382, 382, 382, 382, 382, 382, 382, 383, 383, 383, 383, 383, 383, 383, 383, 384, 384, 385, 385, 385, 385, 385, 385, 385, 385, 386, 386, 387, 387, 387, 387, 387, 388, 388, 388, 389, 389, 389, 390, 390, 390, 390, 390, 390, 391, 391, 391, 392, 392, 393, 393, 393, 393, 393, 394, 394, 395, 395, 395, 395, 395, 396, 396, 396, 397, 397, 397, 397, 397, 398, 398, 399, 399, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 401, 401, 401, 402, 402, 403, 403, 404, 404, 404, 404, 404, 404, 404, 405, 405, 405, 405, 405, 406, 406, 406, 406, 406, 406, 406, 406, 407, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 410, 410, 410, 410, 410, 410, 410, 410, 411, 411, 411, 412, 413, 413, 413, 413, 413, 413, 413, 414, 414, 414, 414, 414, 414, 415, 415, 416, 416, 416, 417, 417, 418, 419, 419, 419, 420, 420, 420, 421, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 423, 423, 423, 424, 424, 425, 425, 426, 426, 426, 427, 427, 427, 428, 428, 428, 429, 430, 430, 431, 431, 431, 432, 432, 432, 433, 433, 433, 434, 434, 434, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 436, 436, 437, 437, 437, 437, 438, 438, 439, 439, 439, 440, 440, 440, 440, 441, 441, 441, 442, 442, 442, 443, 444, 444, 444, 445, 446, 446, 447, 447, 447, 447, 447, 447, 447, 448, 448, 449, 449, 450, 450, 451, 451, 452, 452, 452, 453, 453, 454, 455, 455, 456, 456, 457, 457, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 459, 460, 460, 461, 461, 461, 461, 462, 462, 462, 462, 463, 463, 463, 463, 463, 464, 464, 464, 464, 464, 464, 464, 464, 465, 465, 466, 466, 466, 467, 467, 467, 467, 467, 467, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 469, 469, 469, 469, 469, 469, 469, 469, 469, 470, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 473, 473, 473, 473, 473, 473, 473, 473, 473, 474, 474, 474, 474, 474, 475, 475, 475, 475, 475, 475, 475, 475, 475, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 477, 477, 477, 477, 477, 477, 477, 477, 477, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 479, 479, 479, 479, 479, 479, 479, 479, 479, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 481, 481, 481, 481, 481, 481, 481, 481, 481, 482, 482, 482, 482, 482, 482, 483, 483, 484, 484, 484, 485, 486, 486, 486, 486, 486, 486, 486, 487, 488, 488, 488, 488, 488, 488, 489, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 491, 491, 491, 491, 491, 491, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 493, 493, 493, 493, 494, 495, 495, 495, 496, 496, 496, 496, 496, 496, 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498, 498, 499, 499, 500, 500, 501, 501, 502, 503, 503, 503, 503, 503, 503, 504, 504, 505, 505, 505, 505, 505, 506, 506, 506, 506, 506, 506, 506, 506, 507, 507, 508, 508, 508, 508, 508, 508, 508, 508, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 510, 510, 511, 512, 511, 513, 513, 513, 513, 514, 514, 515, 515, 516, 517, 518, 517, 519, 519, 520, 521, 522, 522, 522, 522, 523, 523, 523, 523, 524, 524, 524, 524, 524, 524, 524, 524, 525, 525, 525, 526, 526, 526, 527, 527, 527, 527, 528, 528, 528, 528, 529, 529, 529, 529, 530, 530, 531, 531, 531, 531, 532, 532, 532, 532, 533, 533, 534, 534, 534, 535, 535, 535, 536, 536, 536, 536, 536, 537, 537, 537, 538, 538, 538, 538, 538, 539, 539, 539, 539, 540, 540, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 542, 542, 543, 543, 543, 544, 544, 544, 545, 545, 545, 546, 546, 546, 546, 547, 547, 547, 548, 548, 548, 549, 549, 549, 550, 550, 550, 551, 551, 551, 552, 553, 553, 554, 554, 554, 555, 555, 555, 555, 555, 556, 556, 556, 556, 557, 557, 558, 558, 558, 558, 558, 559, 559, 559, 560, 560, 560, 561, 561, 561, 562, 563, 563, 563, 563, 563, 564, 564, 564, 564, 564, 564 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 2, 2, 3, 2, 1, 1, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 2, 2, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 6, 3, 3, 3, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 4, 2, 2, 2, 3, 2, 2, 1, 2, 1, 2, 4, 5, 2, 3, 5, 6, 1, 1, 1, 7, 11, 8, 12, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 7, 10, 1, 2, 1, 7, 10, 1, 2, 2, 2, 3, 2, 2, 1, 2, 7, 7, 4, 2, 1, 1, 4, 12, 2, 1, 1, 0, 6, 8, 2, 3, 3, 3, 0, 3, 4, 4, 4, 3, 3, 1, 3, 5, 4, 4, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 4, 7, 2, 2, 2, 1, 3, 2, 2, 1, 2, 8, 2, 2, 2, 1, 2, 1, 4, 7, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 0, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 1, 4, 5, 0, 2, 1, 5, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 0, 1, 0, 1, 5, 6, 4, 3, 6, 2, 1, 4, 1, 1, 1, 4, 6, 7, 5, 1, 1, 4, 5, 1, 3, 0, 1, 2, 1, 5, 1, 2, 1, 2, 3, 2, 1, 2, 1, 5, 2, 1, 1, 3, 1, 2, 3, 2, 0, 1, 1, 4, 2, 0, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 2, 0, 1, 1, 2, 1, 6, 5, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, 2, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 3, 1, 2, 2, 4, 6, 1, 10, 1, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 3, 3, 5, 4, 4, 4, 3, 3, 3, 3, 2, 2, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 6, 7, 4, 4, 5, 2, 3, 3, 3, 2, 3, 3, 3, 3, 4, 3, 5, 6, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 4, 3, 2, 2, 1, 3, 4, 4, 4, 4, 4, 6, 4, 4, 5, 4, 4, 4, 4, 5, 4, 6, 7, 4, 4, 5, 5, 5, 5, 5, 5, 7, 5, 5, 6, 5, 5, 5, 5, 6, 5, 7, 8, 5, 5, 6, 3, 3, 3, 3, 3, 5, 3, 3, 4, 3, 3, 3, 3, 4, 3, 5, 6, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, 3, 4, 4, 4, 3, 5, 4, 4, 2, 3, 6, 6, 1, 1, 1, 2, 2, 2, 3, 3, 2, 12, 2, 2, 1, 3, 4, 2, 0, 3, 1, 1, 2, 2, 2, 2, 2, 4, 4, 4, 3, 4, 5, 7, 8, 6, 8, 9, 6, 6, 7, 10, 11, 12, 9, 5, 5, 6, 3, 5, 5, 5, 6, 5, 4, 9, 10, 11, 9, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 2, 4, 4, 4, 4, 5, 4, 4, 5, 5, 3, 4, 4, 4, 6, 7, 8, 9, 6, 10, 11, 12, 9, 3, 2, 3, 5, 6, 7, 4, 3, 3, 6, 6, 6, 7, 6, 7, 4, 4, 6, 9, 4, 3, 6, 7, 7, 2, 3, 3, 3, 4, 2, 2, 4, 7, 10, 3, 1, 3, 2, 2, 2, 2, 3, 5, 4, 5, 2, 7, 3, 2, 2, 3, 2, 2, 2, 3, 2, 3, 4, 3, 3, 5, 6, 4, 2, 3, 2, 2, 4, 3, 3, 2, 3, 1, 3, 1, 2, 2, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 3, 5, 7, 7, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 10, 7, 7, 7, 9, 9, 10, 12, 12, 2, 2, 3, 4, 4, 4, 2, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 3, 4, 6, 10, 7, 7, 5, 4, 6, 10, 7, 7, 5, 2, 2, 3, 4, 4, 5, 4, 5, 4, 5, 3, 4, 5, 4, 5, 3, 5, 4, 5, 2, 3, 3, 4, 5, 3, 3, 3, 4, 5, 4, 5, 4, 5, 4, 5, 3, 4, 5, 4, 5, 2, 2, 3, 5, 4, 6, 6, 3, 3, 4, 6, 5, 4, 5, 2, 3, 5, 4, 6, 3, 2, 2, 3, 2, 3, 2, 3, 5, 4, 6, 2, 2, 2, 1, 4, 4, 1, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 1, 1, 1, 1, 1, 0, 2, 0, 2, 0, 1, 0, 0, 1, 1, 1, 1, 1, 7, 8, 2, 4, 2, 4, 6, 2, 1, 1, 3, 3, 1, 3, 4, 2, 1, 3, 3, 4, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2, 1, 3, 1, 3, 1, 2, 2, 1, 3, 0, 0, 2, 2, 1, 3, 5, 1, 2, 2, 2, 1, 1, 1, 1, 4, 2, 3, 3, 2, 3, 2, 2, 2, 3, 3, 3, 2, 3, 1, 3, 3, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 3, 3, 1, 2, 3, 3, 1, 2, 1, 1, 1, 1, 1, 2, 2, 4, 1, 2, 2, 2, 3, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 2, 1, 1, 1, 1, 0, 5, 1, 6, 3, 1, 2, 2, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 1, 3, 4, 1, 2, 5, 6, 6, 2, 1, 2, 2, 5, 6, 6 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 315, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 1074, 0, 0, 0, 0, 0, 0, 0, 1074, 38, 0, 0, 0, 43, 0, 0, 0, 47, 1255, 49, 0, 0, 0, 0, 0, 220, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 54, 55, 0, 256, 6, 0, 0, 0, 0, 0, 0, 9, 0, 0, 290, 292, 0, 0, 11, 140, 142, 135, 136, 137, 141, 138, 139, 295, 12, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 13, 0, 0, 0, 0, 322, 0, 14, 69, 103, 0, 133, 102, 77, 100, 0, 74, 76, 72, 134, 101, 73, 0, 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, 70, 71, 75, 329, 143, 104, 0, 15, 0, 16, 17, 0, 0, 0, 0, 0, 0, 0, 57, 56, 0, 0, 0, 0, 2, 0, 18, 0, 0, 0, 395, 406, 0, 412, 0, 0, 0, 0, 0, 0, 0, 351, 0, 487, 0, 0, 0, 0, 0, 1074, 0, 359, 0, 363, 0, 0, 0, 78, 0, 369, 0, 371, 0, 0, 515, 78, 19, 0, 522, 20, 527, 0, 544, 530, 531, 532, 533, 546, 535, 536, 537, 0, 539, 540, 0, 0, 21, 23, 0, 560, 0, 0, 0, 565, 0, 24, 0, 0, 0, 0, 0, 0, 0, 26, 719, 27, 0, 0, 0, 0, 0, 0, 720, 28, 0, 29, 1079, 1078, 1075, 1076, 1077, 0, 1137, 0, 0, 0, 31, 0, 1144, 1143, 1142, 1141, 33, 0, 0, 0, 0, 0, 143, 0, 34, 0, 1162, 0, 1159, 35, 0, 0, 0, 0, 37, 36, 0, 0, 0, 0, 40, 0, 0, 1189, 41, 0, 0, 0, 0, 0, 42, 1252, 1251, 1253, 1254, 44, 0, 45, 0, 0, 0, 0, 0, 207, 0, 0, 0, 46, 0, 0, 1257, 48, 0, 0, 50, 0, 0, 0, 0, 143, 51, 1280, 52, 0, 0, 53, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 5, 239, 0, 231, 0, 0, 233, 0, 241, 234, 238, 249, 250, 235, 251, 0, 237, 259, 260, 258, 257, 0, 0, 264, 274, 277, 276, 275, 273, 263, 267, 271, 272, 262, 0, 0, 0, 265, 0, 0, 0, 266, 10, 0, 0, 0, 291, 0, 296, 308, 309, 0, 297, 298, 143, 0, 1073, 300, 301, 303, 0, 0, 0, 307, 0, 93, 94, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 146, 152, 144, 145, 147, 150, 153, 149, 148, 151, 0, 0, 335, 58, 63, 64, 65, 66, 67, 59, 60, 61, 68, 62, 0, 337, 0, 384, 380, 376, 377, 381, 378, 383, 338, 387, 339, 397, 390, 394, 389, 400, 399, 398, 396, 340, 388, 407, 342, 0, 341, 0, 414, 343, 0, 430, 419, 432, 420, 421, 423, 0, 425, 426, 143, 344, 0, 0, 345, 0, 0, 143, 346, 442, 143, 440, 347, 443, 349, 143, 444, 348, 0, 143, 0, 350, 462, 0, 460, 478, 0, 0, 0, 466, 458, 0, 468, 483, 471, 352, 488, 489, 353, 0, 0, 0, 453, 0, 356, 449, 450, 0, 357, 358, 0, 490, 491, 492, 361, 362, 493, 364, 0, 494, 495, 496, 366, 79, 80, 82, 81, 497, 367, 498, 499, 368, 505, 507, 509, 511, 504, 506, 513, 370, 0, 0, 518, 0, 374, 520, 375, 143, 521, 0, 528, 545, 529, 547, 548, 549, 534, 550, 552, 551, 553, 538, 541, 557, 0, 0, 0, 554, 542, 0, 0, 562, 561, 0, 0, 0, 0, 25, 0, 0, 572, 0, 573, 0, 0, 0, 0, 0, 574, 0, 718, 0, 575, 0, 576, 0, 0, 577, 0, 723, 722, 721, 0, 726, 0, 0, 0, 908, 0, 0, 0, 730, 734, 736, 737, 0, 0, 0, 0, 844, 0, 0, 0, 881, 0, 0, 0, 0, 0, 0, 0, 883, 0, 0, 0, 30, 1138, 1139, 1140, 32, 0, 0, 0, 0, 1151, 1152, 0, 143, 0, 1149, 1146, 0, 0, 0, 143, 1167, 1170, 1168, 1169, 1163, 1164, 1165, 1166, 0, 0, 39, 1186, 1187, 0, 1194, 1196, 1195, 1191, 1192, 1190, 0, 0, 0, 0, 1197, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1198, 1209, 0, 0, 0, 1199, 1201, 1250, 1184, 1185, 1183, 205, 0, 209, 201, 0, 211, 202, 0, 213, 203, 1182, 1181, 204, 206, 208, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 1264, 1277, 1267, 0, 0, 1270, 0, 0, 1269, 1268, 154, 1286, 0, 1285, 1281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 236, 0, 245, 0, 242, 0, 261, 280, 283, 284, 282, 281, 278, 279, 270, 269, 268, 285, 287, 286, 0, 0, 0, 0, 0, 299, 0, 1116, 312, 0, 0, 143, 319, 99, 96, 97, 98, 143, 321, 320, 0, 0, 0, 0, 0, 0, 0, 334, 0, 330, 328, 327, 336, 379, 0, 0, 382, 401, 402, 391, 392, 403, 405, 404, 393, 409, 408, 0, 413, 427, 428, 429, 417, 431, 418, 433, 424, 422, 416, 0, 0, 0, 143, 439, 154, 154, 154, 143, 0, 0, 143, 479, 461, 472, 0, 463, 83, 474, 0, 0, 465, 467, 143, 484, 485, 470, 0, 0, 0, 455, 0, 0, 0, 0, 956, 958, 957, 0, 0, 1067, 0, 1046, 0, 1049, 0, 0, 1069, 1071, 0, 1062, 360, 0, 508, 501, 510, 502, 512, 503, 514, 500, 0, 0, 519, 516, 517, 154, 543, 556, 555, 558, 0, 571, 559, 0, 0, 0, 0, 0, 0, 172, 172, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 166, 0, 0, 0, 0, 0, 613, 637, 0, 0, 0, 609, 0, 0, 0, 0, 172, 166, 0, 0, 714, 0, 724, 725, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 786, 0, 0, 0, 0, 0, 810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 833, 0, 0, 838, 839, 0, 0, 0, 860, 862, 861, 0, 864, 0, 0, 872, 874, 875, 909, 0, 0, 0, 0, 728, 729, 950, 948, 953, 952, 951, 949, 954, 0, 733, 0, 738, 0, 947, 0, 739, 740, 741, 742, 0, 0, 0, 0, 0, 846, 0, 0, 847, 1089, 0, 1092, 1088, 0, 0, 0, 848, 0, 849, 1108, 1113, 1110, 1109, 1107, 1114, 1111, 1105, 1112, 1106, 1115, 0, 0, 854, 0, 0, 0, 1121, 0, 1123, 857, 0, 1125, 858, 879, 0, 0, 0, 884, 885, 886, 1150, 0, 0, 1157, 1153, 0, 0, 0, 1148, 1147, 1161, 1160, 0, 1175, 0, 0, 1171, 0, 1179, 0, 0, 1172, 0, 1193, 194, 194, 0, 194, 0, 1219, 0, 1218, 1210, 0, 0, 0, 0, 1214, 0, 0, 0, 1217, 0, 0, 0, 0, 0, 1212, 1220, 0, 0, 0, 1211, 194, 194, 194, 210, 212, 214, 0, 0, 0, 0, 215, 0, 55, 0, 1259, 0, 1265, 0, 143, 1271, 1272, 0, 1274, 1275, 0, 155, 156, 1266, 1287, 1288, 0, 228, 224, 230, 222, 223, 229, 226, 225, 227, 232, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 1117, 1096, 0, 1103, 1104, 0, 0, 306, 0, 0, 0, 0, 323, 0, 333, 0, 332, 386, 385, 0, 0, 0, 143, 0, 0, 154, 437, 78, 78, 0, 0, 0, 154, 0, 87, 86, 480, 464, 0, 475, 477, 157, 486, 354, 0, 0, 55, 0, 454, 0, 0, 974, 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 1027, 0, 1033, 1034, 1036, 1038, 0, 1043, 1054, 1055, 1056, 0, 1058, 1063, 1065, 1066, 1064, 955, 0, 0, 1045, 0, 1044, 973, 0, 0, 1050, 0, 1052, 0, 1051, 1072, 1053, 1060, 0, 0, 372, 0, 0, 569, 570, 0, 567, 563, 0, 172, 172, 172, 173, 174, 581, 582, 168, 167, 0, 172, 172, 172, 0, 587, 597, 169, 172, 172, 172, 170, 171, 172, 172, 0, 172, 172, 0, 169, 0, 610, 0, 0, 0, 636, 0, 635, 0, 0, 612, 0, 611, 0, 0, 0, 0, 169, 169, 166, 0, 0, 166, 0, 0, 0, 172, 172, 710, 0, 172, 172, 715, 0, 185, 186, 187, 188, 189, 190, 0, 91, 92, 90, 746, 0, 0, 0, 0, 0, 902, 900, 895, 0, 905, 889, 906, 892, 904, 898, 887, 901, 890, 888, 907, 903, 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 809, 811, 0, 0, 817, 816, 0, 0, 175, 0, 0, 143, 0, 0, 829, 0, 0, 0, 834, 835, 836, 0, 0, 0, 843, 859, 863, 865, 868, 867, 0, 0, 0, 873, 910, 912, 0, 911, 731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 0, 0, 0, 845, 0, 143, 0, 1084, 1082, 0, 0, 143, 0, 1087, 882, 850, 0, 0, 0, 856, 0, 0, 1126, 877, 878, 0, 880, 1156, 1158, 1155, 1154, 1145, 0, 0, 1176, 0, 0, 1180, 1188, 196, 197, 198, 199, 195, 1203, 1202, 0, 0, 0, 1205, 1204, 194, 0, 0, 0, 1213, 0, 0, 0, 0, 0, 1230, 0, 1244, 1243, 1245, 0, 0, 0, 1216, 0, 0, 0, 1215, 1225, 1224, 1226, 1222, 1221, 1223, 1247, 1246, 1248, 217, 219, 218, 0, 0, 55, 0, 1261, 0, 143, 1278, 1273, 1276, 0, 0, 143, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 310, 314, 313, 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, 0, 324, 326, 325, 143, 331, 0, 0, 0, 154, 436, 143, 0, 441, 445, 0, 0, 0, 78, 473, 85, 84, 482, 0, 476, 159, 160, 158, 78, 0, 0, 457, 451, 0, 0, 0, 0, 0, 0, 143, 975, 0, 0, 0, 983, 0, 143, 988, 0, 993, 994, 0, 997, 998, 999, 0, 0, 0, 1008, 0, 1015, 0, 0, 0, 1020, 1021, 0, 0, 0, 1028, 0, 0, 1032, 1035, 1037, 1039, 0, 0, 1057, 1059, 959, 0, 0, 0, 0, 0, 0, 1068, 960, 0, 0, 1070, 1061, 0, 0, 525, 526, 0, 0, 568, 0, 578, 579, 580, 172, 584, 585, 586, 0, 0, 0, 591, 592, 166, 0, 0, 0, 172, 598, 599, 600, 601, 603, 169, 606, 607, 0, 172, 0, 0, 0, 169, 169, 166, 0, 0, 0, 0, 634, 0, 638, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 166, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 166, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 166, 0, 0, 0, 0, 169, 169, 166, 0, 0, 0, 169, 614, 615, 616, 617, 619, 0, 622, 623, 0, 169, 0, 0, 708, 709, 172, 712, 713, 0, 745, 143, 747, 0, 0, 0, 0, 0, 0, 0, 894, 891, 897, 896, 893, 899, 0, 0, 0, 0, 0, 143, 770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787, 788, 789, 0, 793, 790, 792, 0, 0, 798, 797, 799, 0, 0, 0, 0, 0, 0, 143, 0, 143, 0, 815, 181, 177, 182, 176, 179, 178, 180, 824, 825, 0, 0, 0, 828, 143, 0, 143, 0, 837, 840, 143, 0, 143, 0, 866, 871, 913, 732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 939, 0, 0, 0, 0, 0, 743, 744, 143, 154, 0, 143, 143, 1090, 1091, 0, 1093, 0, 852, 0, 143, 1122, 1124, 876, 1173, 1174, 1177, 1178, 194, 194, 194, 1249, 1228, 1227, 1229, 1232, 1231, 1235, 1234, 1236, 1233, 1241, 1240, 1242, 1238, 1237, 1239, 0, 1256, 1263, 0, 1279, 0, 143, 0, 1282, 0, 0, 247, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1098, 0, 1101, 1135, 1102, 1100, 1097, 143, 143, 0, 316, 136, 0, 410, 0, 434, 154, 157, 0, 0, 448, 459, 0, 469, 0, 452, 967, 0, 0, 0, 0, 143, 976, 157, 977, 157, 981, 157, 979, 143, 984, 157, 986, 154, 157, 990, 157, 995, 143, 1000, 157, 1002, 157, 1004, 157, 1006, 143, 1009, 157, 1011, 157, 143, 1017, 0, 157, 143, 1022, 157, 1025, 157, 143, 1030, 157, 143, 1041, 961, 0, 0, 0, 0, 143, 1047, 1048, 0, 0, 524, 564, 0, 583, 588, 589, 590, 0, 594, 595, 596, 602, 172, 169, 608, 625, 626, 627, 628, 629, 0, 631, 632, 169, 0, 0, 0, 169, 169, 166, 0, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 0, 0, 0, 0, 169, 169, 166, 0, 0, 0, 169, 172, 172, 172, 172, 172, 0, 172, 172, 0, 169, 169, 172, 172, 172, 172, 172, 0, 172, 172, 0, 169, 169, 688, 689, 690, 691, 693, 0, 696, 697, 0, 169, 699, 700, 701, 702, 703, 0, 705, 706, 169, 618, 169, 0, 624, 0, 0, 711, 0, 748, 157, 0, 0, 157, 0, 0, 0, 761, 157, 762, 765, 766, 157, 767, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 791, 794, 795, 0, 157, 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 88, 0, 0, 945, 946, 154, 0, 0, 0, 1085, 1083, 1094, 851, 853, 154, 1207, 1206, 1208, 0, 1258, 1289, 0, 0, 1284, 1283, 248, 0, 0, 0, 288, 0, 0, 0, 0, 0, 1099, 304, 305, 157, 411, 415, 435, 438, 0, 446, 481, 355, 0, 0, 0, 0, 972, 978, 982, 980, 985, 987, 989, 991, 996, 1001, 1003, 1005, 1007, 1010, 1012, 1016, 154, 157, 1024, 154, 1026, 1029, 154, 1040, 154, 0, 0, 0, 0, 966, 0, 373, 523, 0, 593, 604, 172, 169, 633, 172, 172, 172, 172, 172, 0, 172, 172, 169, 679, 680, 681, 682, 683, 0, 685, 686, 169, 172, 172, 172, 172, 172, 0, 172, 172, 169, 172, 648, 649, 650, 651, 653, 169, 656, 657, 0, 172, 172, 668, 669, 670, 671, 673, 169, 676, 677, 0, 172, 692, 169, 0, 698, 169, 707, 620, 169, 716, 717, 143, 751, 0, 157, 755, 754, 0, 143, 0, 763, 768, 143, 0, 775, 776, 777, 778, 782, 783, 779, 780, 781, 0, 0, 157, 800, 804, 0, 143, 0, 0, 813, 819, 818, 157, 820, 0, 826, 0, 830, 157, 157, 822, 0, 0, 870, 0, 183, 183, 0, 0, 183, 0, 183, 1073, 0, 0, 183, 183, 0, 0, 0, 0, 0, 0, 0, 0, 940, 0, 0, 0, 1073, 89, 0, 183, 0, 1119, 944, 0, 0, 216, 1291, 1290, 0, 0, 252, 0, 293, 0, 0, 0, 1136, 317, 447, 968, 0, 191, 0, 1018, 1019, 1023, 1031, 1042, 962, 0, 191, 0, 365, 0, 605, 630, 639, 640, 641, 642, 643, 169, 645, 646, 172, 169, 687, 659, 660, 661, 662, 663, 169, 665, 666, 172, 652, 172, 169, 658, 672, 172, 169, 678, 694, 169, 704, 621, 0, 157, 749, 756, 0, 0, 0, 0, 0, 784, 785, 801, 0, 0, 0, 814, 821, 0, 831, 832, 823, 157, 841, 0, 184, 1073, 1073, 88, 0, 1073, 0, 1073, 914, 143, 0, 1073, 1073, 88, 0, 0, 1073, 1073, 0, 0, 1073, 943, 941, 942, 921, 1073, 1073, 1119, 1130, 0, 1086, 855, 0, 0, 254, 0, 0, 0, 0, 192, 193, 970, 971, 0, 964, 965, 0, 172, 647, 684, 172, 667, 654, 172, 674, 172, 695, 0, 750, 157, 752, 157, 0, 157, 0, 157, 802, 157, 0, 157, 0, 1073, 927, 923, 1073, 0, 928, 0, 922, 1073, 0, 925, 924, 1073, 0, 0, 919, 917, 1073, 143, 918, 920, 926, 1130, 1080, 0, 0, 1120, 1128, 0, 0, 0, 289, 162, 165, 164, 163, 161, 0, 143, 143, 566, 644, 664, 655, 675, 157, 753, 760, 0, 774, 771, 803, 808, 0, 827, 0, 932, 916, 88, 0, 930, 0, 915, 88, 0, 931, 0, 1081, 1132, 1134, 0, 1127, 0, 0, 294, 0, 191, 191, 0, 757, 143, 772, 805, 842, 1073, 0, 0, 1073, 0, 157, 1133, 1129, 253, 0, 0, 969, 963, 727, 143, 758, 773, 143, 806, 934, 0, 1073, 933, 0, 1073, 255, 311, 759, 807, 88, 935, 88, 929, 1073, 1073, 937, 936 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 53, 438, 181, 160, 586, 1284, 2550, 2551, 439, 440, 441, 442, 161, 162, 163, 94, 465, 1215, 1710, 2754, 1373, 1386, 1369, 1951, 2647, 1433, 2687, 1600, 340, 765, 768, 771, 782, 56, 369, 66, 373, 379, 383, 386, 71, 389, 78, 407, 403, 399, 393, 824, 411, 85, 416, 95, 106, 422, 427, 1670, 113, 449, 164, 166, 183, 223, 489, 868, 491, 500, 501, 871, 876, 503, 505, 878, 508, 880, 520, 884, 886, 888, 523, 527, 531, 533, 536, 540, 567, 563, 1296, 554, 907, 912, 904, 1285, 917, 557, 573, 576, 581, 587, 590, 598, 945, 947, 949, 951, 603, 955, 605, 226, 607, 1779, 243, 609, 611, 615, 620, 627, 252, 1362, 630, 260, 639, 1378, 641, 647, 999, 1394, 994, 1820, 1400, 1398, 995, 1822, 1403, 1405, 653, 656, 651, 262, 270, 272, 694, 1076, 1459, 1065, 1554, 1996, 2338, 1081, 1074, 942, 1336, 1341, 1349, 1351, 839, 278, 1090, 1093, 1101, 1248, 1249, 1250, 840, 2674, 2675, 1124, 1127, 2743, 2744, 2740, 2741, 2785, 1251, 1252, 283, 289, 297, 708, 703, 302, 307, 718, 724, 1151, 1156, 774, 762, 313, 317, 731, 323, 738, 1605, 751, 752, 1187, 1182, 1611, 1172, 1617, 1629, 1625, 1176, 756, 740, 328, 329, 344, 1202, 347, 353, 792, 795, 789, 355, 358, 800 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -2272 static const yytype_int16 yypact[] = { 4536, -79, 44, 498, 21, -2272, -2272, 825, -220, 468, 728, 43, 196, 4155, 103, 139, 1874, 4, 5543, 93, 947, -2272, 139, 1253, 154, 792, -33, 33, 200, 7, 140, 372, 347, 1085, 11, 514, 295, 7, -2272, -31, 18, 799, -2272, 41, 205, 1714, -2272, 488, -2272, 79, 1403, 247, 128, 500, -2272, 508, -2272, 539, 143, 283, 569, 572, 134, 575, -9, 176, -2272, -2272, -2272, 499, 742, -2272, 253, 29, 139, 0, 766, -10, -2272, 582, 742, -2272, -2272, 31, 742, -2272, -2272, -2272, -2272, 742, -2272, -2272, -2272, -2272, -2272, -2272, 306, 596, 5250, 125, 618, 619, 642, 647, 665, 744, -2272, 742, 1238, 742, 742, 832, 742, -2272, -2272, -2272, 559, -2272, -2272, -2272, -2272, 5015, -2272, -2272, -2272, -2272, -2272, -2272, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1175, -2272, 742, -2272, 763, -2272, -2272, 139, 139, 139, 139, 139, 139, 139, -2272, -2272, 139, 139, 139, 139, -2272, 668, -2272, 762, 1387, 715, 225, 568, 683, 363, 4578, 194, 5066, 4987, 845, 5015, 3534, -2272, 448, -108, 869, 791, 84, 57, 870, 7, 62, -2272, 850, -2272, 705, 660, 116, 591, -34, -2272, 386, -2272, 565, 851, 76, 591, -2272, 5250, -2272, -2272, -2272, 873, 922, -2272, -2272, -2272, -2272, 794, -2272, -2272, -2272, -59, -2272, -2272, 5250, 4636, -2272, -2272, 153, -2272, 950, 953, 119, -2272, 742, -2272, 968, 47, 971, 34, 515, 973, 9, -2272, -2272, -2272, 982, 984, 139, 139, 742, 742, -2272, -2272, 992, -2272, -2272, -2272, -2272, -2272, -2272, 2790, -2272, 996, 1002, 742, -2272, 1003, -2272, -2272, -2272, -2272, -2272, 742, 1136, 139, 2877, 742, 1175, 742, -2272, 1011, -2272, 5218, -2272, -2272, 770, 1017, 1031, 742, -2272, -2272, -99, 1032, 5250, 1036, -2272, 1148, 742, 952, -2272, 452, 933, 1325, 393, 1059, -2272, -2272, -2272, -2272, -2272, -2272, 1068, -2272, 481, 53, 75, 92, 54, -2272, 742, 742, 600, -2272, 742, 811, 1074, -2272, 742, 742, -2272, 1088, 22, 46, 1107, 1175, -2272, -2272, -2272, 516, 742, -2272, -2272, 742, 742, 742, 742, 742, 742, 742, 742, 742, -2272, -2272, -2272, 742, -2272, 1119, 1120, -2272, 742, 841, -2272, -2272, -2272, -2272, -2272, -2272, 742, -2272, -2272, 742, -2272, -2272, 434, 1127, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 742, 742, -2272, 742, 1138, 1140, -2272, -2272, 742, 742, 742, -2272, 742, -2272, -2272, -2272, 1150, -2272, -2272, 1175, 1152, -2272, -2272, -2272, -2272, 1156, 1158, 5250, -2272, 742, -2272, -2272, -2272, 742, 1144, 1153, 1153, 5250, 742, 742, 742, 742, 742, 742, -2272, 742, 5015, 1238, 742, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1238, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1166, -2272, 915, -2, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 574, -2272, -2272, -2272, 1005, -2272, 495, -2272, -2272, -2272, -2272, -2272, 1176, -2272, 1183, -2272, -2272, -20, 987, -2272, 1021, -2272, -2272, -2272, 1038, -2272, -2272, 1175, -2272, 1918, 742, -2272, 5250, 5250, 1175, -2272, -2272, 1175, -2272, -2272, -2272, -2272, 1175, -2272, -2272, 5250, 1175, 742, -2272, -2272, 5250, -2272, 1196, 71, 1028, 3, -2272, -2272, 1037, 5250, 4074, -2272, -2272, -2272, -2272, -2272, 1207, 1233, 1235, -2272, 1048, -2272, -2272, -2272, 742, -2272, -2272, 609, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 565, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1179, 1184, 1188, -2272, -2272, 1040, -2272, 742, 1252, 1043, 5218, -2272, -2272, -2272, 1175, -2272, 1255, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 5250, 5250, 5250, -2272, -2272, 1263, 139, -2272, -2272, 1264, 1267, 1078, 742, -2272, 798, 1202, -2272, 1278, -2272, 466, 1203, 5102, 52, 1287, -2272, 1289, -2272, 1291, -2272, -5, -2272, 1299, 1301, -2272, 1305, -2272, -2272, -2272, 742, -2272, 5218, 4950, 1195, 395, 1307, 421, 1211, -2272, -2272, -2272, 1302, 713, 1312, 1316, 30, 742, 489, 343, 276, 5250, 139, 1682, 748, 5, 36, 113, -1, -2272, 1308, 1309, 1318, -2272, -2272, -2272, -2272, -2272, 742, 742, 742, 742, -2272, -2272, 742, 1175, 742, -2272, 742, 1238, 742, 1320, 1175, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 435, 513, -2272, -2272, -2272, 1333, -2272, -2272, -2272, -2272, 1232, -2272, 1340, 1342, 1261, 1347, -2272, 1349, -2272, 1351, 1273, 1356, 460, 405, 475, 67, 480, 1367, 524, -2272, -2272, 1368, 1369, 1371, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1372, -2272, -2272, 1374, -2272, -2272, 1377, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 742, 742, 742, 742, -2272, 742, 793, 742, 742, -2272, 4221, -2272, 964, 1383, -2272, 989, 1384, -2272, -2272, -24, 742, 742, -2272, 1408, 742, 742, 742, 742, 742, 742, 742, 742, 742, -2272, -2272, 1416, 1083, 742, 1411, 538, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1420, 742, 742, 742, 5250, -2272, 1423, 2539, -2272, 1424, 1425, 1175, -2272, -2272, -2272, -2272, -2272, 1175, -2272, -2272, 742, 742, 742, 5250, 742, 1238, 742, -2272, 742, -2272, -2272, -2272, -2272, -2272, 1426, 1428, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 194, -2272, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 5250, 5250, 742, 1175, -2272, -24, -24, -24, 1175, 1238, 742, 1175, -2272, -2272, -2272, 742, -2272, -60, 1265, 1434, 1439, -2272, -2272, 1175, 5250, -2272, -2272, 1441, 1442, 1444, 1064, 742, 4955, 511, 674, -2272, -2272, -2272, 742, 1431, 183, 1067, -2272, 1193, -2272, 1682, 1204, 603, 1172, 722, -2272, -2272, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 1450, -2272, -2272, -2272, -24, -2272, -2272, -2272, -2272, 5134, -2272, -2272, 1455, 1456, 742, 1457, 1459, 1460, -22, -22, -64, 1462, 1463, 1464, 1465, 1206, 1208, 1467, 1469, 1471, 70, 70, -64, 1473, 1474, -64, 1476, 1477, 5189, 1481, 1486, -2272, -2272, 1487, 1489, 597, -2272, 1491, 1493, 1494, 1495, -22, -64, 1497, 1500, -2272, 1501, -2272, -2272, 1175, 761, 1213, 1274, 1275, 1276, 1363, 433, 1277, 1509, 224, 1378, 1393, 998, 910, 1475, 1284, 1285, 1397, 1516, 1314, 449, 108, 558, 1286, 5015, 1682, 1484, -104, 1288, 1321, 1529, 23, -2272, -2272, 477, 1532, 1545, -2272, -2272, -2272, 1550, 1328, 145, 1682, 1348, -2272, -2272, -2272, 139, 1552, 1554, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -3, -2272, 1572, -2272, 742, -2272, 742, -2272, -2272, -2272, -2272, 742, 742, 742, 421, 5250, -2272, 1559, 1111, -2272, -2272, 742, -2272, -2272, 742, 5015, 742, -2272, 5250, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 139, 742, -2272, 742, 421, 1560, -2272, 742, 742, -2272, 139, -2272, -2272, -2272, 621, 1565, 1566, -2272, -2272, -2272, -2272, 742, 742, -2272, -2272, 1238, 742, 742, -2272, -2272, -2272, -2272, 742, -2272, 742, 1466, -2272, 742, -2272, 742, 1468, -2272, 1570, -2272, 51, 51, 525, 51, 1574, -2272, 601, -2272, -2272, 1575, 1576, 604, 1571, -2272, 1577, 1578, 1573, -2272, 652, 670, 1581, 1585, 1587, -2272, -2272, 1590, 1591, 1593, -2272, 51, 51, 51, -2272, -2272, -2272, 742, 742, 742, 742, -2272, 742, 920, 5250, -2272, 742, -2272, 5218, 1175, -2272, -2272, 1595, -2272, -2272, 1599, -2272, -2272, -2272, -2272, 1586, 2877, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 1594, 742, 742, 742, 863, 1601, 1604, 742, 742, 1175, 121, 1268, 1269, 1270, 1271, 1272, 1279, 1280, 2539, -2272, 1281, -2272, -2272, 1608, 1603, -2272, 742, 1615, 1618, 1624, -2272, 5250, -2272, 742, -2272, -2272, -2272, 742, 742, 742, 1175, 1625, 5250, -24, -2272, 591, 591, 1238, 742, 1626, -24, 742, 1597, 1598, 512, -2272, 1627, -2272, -2272, 949, -2272, -2272, 742, 1629, 1631, 742, -2272, 1632, 1035, 5015, 1406, 1409, 1410, 42, 5015, 1415, -2272, 232, 1524, 187, 1430, 1433, 192, -2272, -2272, 301, 1496, 583, 738, 1682, 690, -2272, 1656, 1432, -2272, 478, -2272, -2272, -2272, -2272, 1682, 1461, -2272, -2272, -2272, -2272, -2272, 742, 1149, -2272, 742, -2272, -2272, 742, 742, -2272, 742, -2272, 742, -2272, -2272, -2272, -2272, 1478, 742, -2272, 742, 100, -2272, -2272, 1665, 1667, -2272, 742, -22, -22, -22, -2272, -2272, -2272, -2272, -2272, -2272, 1672, -22, -22, -22, 868, -2272, -2272, 70, -22, -22, -22, -2272, -2272, -22, -22, 1673, -22, -22, 1675, 70, 916, -2272, 1677, 1678, 1681, -2272, 627, -2272, 703, 746, -2272, 1012, -2272, 1427, 1683, 1684, 1685, 70, 70, -64, 1687, 1691, -64, 1692, 1694, 1695, -22, -22, -2272, 1696, -22, -22, -2272, 1697, -2272, -2272, -2272, -2272, -2272, -2272, 139, -2272, -2272, -2272, 5015, 1124, 742, 1165, 1095, -28, -2272, -2272, -2272, 786, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1698, 742, -2272, 139, 1699, 742, 5250, 139, 1327, 1470, 1502, 193, 202, 1504, 228, 1405, 1437, 1738, 1740, 1741, 433, 1742, 1743, 1744, 1446, 1451, 1116, 1749, 742, 1200, 1359, -2272, -2272, 139, 5015, -2272, -2272, 5015, 742, -7, 1751, 742, 1175, 1238, 139, -2272, 5015, 5250, 742, -2272, -2272, -2272, 139, 139, 5015, -2272, -2272, -2272, -2272, -2272, -2272, 5015, 742, 139, -2272, -2272, -2272, 742, -2272, -2272, 1752, 742, 1536, 149, 742, 1537, 742, 186, 742, -2272, 742, 1538, 1540, 742, 742, 742, 742, 742, 742, 742, 742, 14, 742, 742, 1541, -2272, 742, 742, 742, 742, -2272, 5250, 1175, 1759, 5250, 5250, 742, 742, 1175, 1238, -2272, -2272, 742, 742, 742, 5250, -2272, 742, 742, -2272, -2272, -2272, 1760, -2272, -2272, -2272, -2272, -2272, -2272, 742, 742, -2272, 742, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1761, 1764, 1772, -2272, -2272, 51, 1779, 1780, 1773, -2272, 1782, 1785, 1786, 1787, 1789, -2272, 1790, -2272, -2272, -2272, 1792, 1793, 1791, -2272, 1794, 1795, 1798, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 742, 1803, 5250, -2272, 742, 1175, -2272, -2272, -2272, 2877, 742, 1175, 742, 742, 742, -2272, 742, 742, 1799, 742, 1690, 1784, 742, 742, -2272, -2272, -2272, 1801, 433, 1802, 1804, 1805, 1806, 1807, 1809, -2272, 139, 5250, 5250, 742, -2272, -2272, -2272, 1175, -2272, 887, 742, 887, -24, -2272, 1175, 5250, -2272, -2272, 742, 742, 1810, 591, -2272, -2272, -2272, -2272, 742, -2272, -2272, -2272, -2272, 591, 742, 1813, -2272, -2272, 5250, 1814, 1816, 1817, 1818, 5250, 1175, -2272, 5015, 5015, 5015, 5015, 5015, 1175, -2272, 5015, -2272, -2272, 5015, -2272, -2272, 5015, 5015, 5015, 5015, 5015, 5015, -2272, 5250, 5015, 742, -2272, -2272, 5250, 5015, 5015, -2272, 5250, 5015, -2272, -2272, -2272, -2272, 5250, 5015, -2272, -2272, -2272, 5250, 1819, 1821, 1826, 1827, 5250, -2272, -2272, 742, 742, -2272, -2272, 1829, 742, -2272, -2272, 1830, 1832, -2272, 742, -2272, -2272, -2272, -22, -2272, -2272, -2272, 1835, 1836, 1838, -2272, -2272, -64, 1833, 1840, 1841, -22, -2272, -2272, -2272, -2272, -2272, 70, -2272, -2272, 1845, -22, 1849, 1850, 1851, 70, 70, -64, 1853, 1854, 1855, 1018, -2272, 1029, -2272, 1047, 1553, 1856, 1858, 1859, 70, 70, -64, 1861, 1862, -64, 1864, 1569, 1865, 1866, 1867, 70, 70, -64, 1863, 1870, -64, 1872, 1610, 1875, 1876, 1877, 70, 70, -64, 1879, 1883, -64, 1884, 1886, 1887, 1888, 70, 70, -64, 1890, 1893, 1896, 70, -2272, -2272, -2272, -2272, -2272, 1895, -2272, -2272, 1898, 70, 1900, 1911, -2272, -2272, -22, -2272, -2272, 1914, -2272, 1175, -2272, 5250, 742, 742, 5250, 742, 1919, 1213, -2272, -2272, -2272, -2272, -2272, -2272, 1921, 5015, 139, 1922, 5015, 1175, -2272, 1923, 1213, 742, 742, 742, 742, 742, 742, 742, 742, 742, 1912, 1926, -2272, -2272, -2272, 1927, -2272, -2272, -2272, 1930, 1931, -2272, -2272, -2272, 742, 5250, 742, 1934, 1213, 139, 1175, 1238, 1175, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 1238, 1238, -2272, 1175, 1238, 1175, 742, -2272, -2272, 1175, 1238, 1175, 1238, -2272, -2272, -2272, -2272, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, -2272, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 1918, 1935, 742, -2272, 742, 742, 742, 1937, 1939, -2272, -2272, 1175, -24, 1940, 1175, 1175, -2272, -2272, 1238, -2272, 742, -2272, 1941, 1175, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 51, 51, 51, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, -2272, -2272, 742, -2272, 742, 1175, 742, -2272, 1238, 742, -2272, 742, -2272, 1847, 1943, 1947, 1942, 1873, 742, 742, 1949, 1950, -2272, 1953, -2272, -2272, -2272, -2272, -2272, 1175, 1175, 5250, -2272, -2272, 742, -2272, 742, -2272, -24, 949, 742, 1954, -2272, -2272, 742, -2272, 565, -2272, -2272, 1955, 1956, 1957, 1959, 1175, -2272, 949, -2272, 949, -2272, 949, -2272, 1175, -2272, 949, -2272, -24, 949, -2272, 949, -2272, 1175, -2272, 949, -2272, 949, -2272, 949, -2272, 1175, -2272, 949, -2272, 949, 1175, -2272, 5250, 949, 1175, -2272, 949, -2272, 949, 1175, -2272, 949, 1175, -2272, -2272, 1961, 1972, 1985, 1987, 1175, -2272, -2272, 1993, 565, 1994, -2272, 742, -2272, -2272, -2272, -2272, 1996, -2272, -2272, -2272, -2272, -22, 70, -2272, -2272, -2272, -2272, -2272, -2272, 1997, -2272, -2272, 70, 1998, 2000, 2001, 70, 70, -64, 2003, 2004, 2005, 2006, 2007, 2010, 70, 70, -64, 2012, 2013, 2015, 2016, 2018, 2019, 70, 70, -64, 2014, 2021, 2022, 70, -22, -22, -22, -22, -22, 2024, -22, -22, 2025, 70, 70, -22, -22, -22, -22, -22, 2026, -22, -22, 2027, 70, 70, -2272, -2272, -2272, -2272, -2272, 2028, -2272, -2272, 2029, 70, -2272, -2272, -2272, -2272, -2272, 2030, -2272, -2272, 70, -2272, 70, 2031, -2272, 2032, 2033, -2272, 5218, -2272, 949, 2036, 5015, 949, 742, 5250, 2037, -2272, 949, -2272, -2272, -2272, 949, -2272, -2272, 5250, 2039, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, -2272, -2272, -2272, 5015, 949, 742, 5250, 2041, -2272, 1238, 1238, 1238, 742, 5015, 1238, 742, 1238, 1238, 5250, 5015, 1238, 742, 1238, -2272, 742, 742, 742, 742, 742, 742, 1213, 742, 742, 742, 1213, 742, 742, 742, 742, 1213, 742, 742, 742, 742, 742, 742, 1175, 742, 1655, 1213, 742, 742, -2272, -2272, -24, 139, 2043, 2044, -2272, -2272, -2272, -2272, -2272, -24, -2272, -2272, -2272, 742, -2272, -2272, 1238, 742, -2272, -2272, -2272, 980, 2045, 2047, -2272, 2049, 742, 2051, 887, 2052, -2272, -2272, -2272, 949, -2272, -2272, -2272, -2272, 2055, -2272, -2272, -2272, 2057, 2058, 5250, 2059, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -24, 949, -2272, -24, -2272, -2272, -24, -2272, -24, 2062, 2063, 5250, 2064, -2272, 2065, -2272, -2272, 742, -2272, -2272, -22, 70, -2272, -22, -22, -22, -22, -22, 2067, -22, -22, 70, -2272, -2272, -2272, -2272, -2272, 2071, -2272, -2272, 70, -22, -22, -22, -22, -22, 2073, -22, -22, 70, -22, -2272, -2272, -2272, -2272, -2272, 70, -2272, -2272, 2074, -22, -22, -2272, -2272, -2272, -2272, -2272, 70, -2272, -2272, 2075, -22, -2272, 70, 2079, -2272, 70, -2272, -2272, 70, -2272, -2272, 1175, -2272, 5015, 949, -2272, -2272, 2081, 1175, 742, -2272, -2272, 1175, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 742, 742, 949, -2272, -2272, 2083, 1175, 742, 1238, -2272, -2272, -2272, 949, -2272, 742, -2272, 1238, -2272, 949, 949, -2272, 5250, 1213, -2272, 742, 2085, 2085, 742, 742, 2085, 1213, 2085, -2272, 5250, 1213, 2085, 2085, 742, 742, 1213, 742, 742, 742, 742, 742, -2272, 1238, 742, 2086, -2272, -2272, 742, 2085, 139, 40, -2272, 2087, 139, -2272, -2272, -2272, 2088, 742, -2272, 2089, -2272, 2091, 1892, 742, -2272, -2272, -2272, -2272, 2092, 49, 5250, -2272, -2272, -2272, -2272, -2272, -2272, 2093, 49, 5250, -2272, 742, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 70, -2272, -2272, -22, 70, -2272, -2272, -2272, -2272, -2272, -2272, 70, -2272, -2272, -22, -2272, -22, 70, -2272, -2272, -22, 70, -2272, -2272, 70, -2272, -2272, 742, 949, -2272, -2272, 5015, 5250, 742, 5250, 742, -2272, -2272, -2272, 5015, 5250, 742, -2272, -2272, 5250, -2272, -2272, -2272, 949, -2272, 2095, -2272, -2272, -2272, 1213, 742, -2272, 2096, -2272, -2272, 1175, 2097, -2272, -2272, 1213, 742, 2098, -2272, -2272, 742, 5250, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 40, 1644, 1682, -2272, -2272, 2099, 2104, -2272, 2020, 2106, 39, 5250, -2272, -2272, -2272, -2272, 5250, -2272, -2272, 2108, -22, -2272, -2272, -22, -2272, -2272, -22, -2272, -22, -2272, 5218, -2272, 949, -2272, 949, 742, 949, 2112, 949, -2272, 949, 742, 949, 742, -2272, -2272, -2272, -2272, 2114, -2272, 742, -2272, -2272, 742, -2272, -2272, -2272, 2116, 742, -2272, -2272, -2272, 1175, -2272, -2272, -2272, 1644, -2272, 1723, 1710, 1682, -2272, 2117, 2118, 2120, -2272, -2272, -2272, -2272, -2272, -2272, 742, 1175, 1175, -2272, -2272, -2272, -2272, -2272, 949, -2272, -2272, 2121, -2272, 5015, -2272, -2272, 2122, -2272, 1213, -2272, -2272, 1213, 742, -2272, 742, -2272, 1213, 742, -2272, 5250, -2272, 1723, -2272, 139, -2272, 2123, 2124, -2272, 742, 49, 49, 2125, 5015, 1175, -2272, 5015, -2272, -2272, 742, 2127, -2272, 742, 949, -2272, -2272, -2272, 2128, 2129, -2272, -2272, -2272, 1175, -2272, -2272, 1175, -2272, -2272, 2131, -2272, -2272, 2133, -2272, -2272, -2272, -2272, -2272, 1213, -2272, 1213, -2272, -2272, -2272, -2272, -2272 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -2272, -2272, -4, -2272, 317, -221, -2272, -1621, -930, 1623, -2272, 706, -184, 1654, -44, 1161, -1685, 1871, -733, 1508, -2272, -954, 1894, 1050, -2272, -1355, -2272, -2160, -1074, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -1419, -2272, -2272, -2272, -2272, -2272, -668, -2272, -2272, -2272, -2272, -2272, -2272, 418, -2272, -2272, -2272, -2272, 819, -671, 277, -570, -2272, -2272, -2272, -2272, -622, -612, -2272, -2272, -2271, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, 1388, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272, -2272 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1263 static const yytype_int16 yytable[] = { 70, 604, 1528, 2078, 1128, 2080, 352, 909, 112, 1002, 1119, 1089, 1092, 1115, 654, 114, 298, 67, 68, 1993, 1944, 67, 68, 381, 67, 68, 790, 273, 1510, 294, 310, 1388, 67, 68, 1391, 414, 316, 114, 263, 642, -1118, 1945, 67, 68, 1946, 346, 881, 1084, 357, 722, 793, 1422, 637, 1121, 372, 1947, 1003, 114, 378, 79, 1924, 385, 564, 1726, 274, 388, 390, 772, 408, 398, 1282, 882, 406, 1213, 96, 905, 413, 1895, 1948, 114, 417, 2685, 67, 68, 1437, 418, 1601, 1384, 1606, 616, 560, 324, 601, 1595, 1596, 1949, 114, 588, 1129, 264, 1371, 866, 555, 434, 1130, 443, 444, 448, 450, 97, 57, 67, 68, 117, 1636, 1637, 1638, 114, 1505, 763, 1777, 265, 565, 98, 454, 633, 99, 117, 570, 119, 425, 67, 68, 1367, 100, 401, 165, 67, 68, 996, 325, 766, 101, 114, 1494, 182, 67, 68, 67, 68, 643, 119, 67, 68, 1177, 723, 617, 628, 769, 466, 54, 409, 1368, 1274, 1275, 1276, 1896, 1668, 910, 266, 253, 119, 561, 1506, 326, 402, 224, 578, 55, 67, 68, 1518, 1283, 499, 1004, 867, 67, 68, 521, 67, 68, 556, 225, 119, 261, 618, 1372, 67, 68, 67, 68, 589, 371, 562, 279, 271, 280, 997, 1736, 330, 119, 314, 122, 1740, 1912, 1897, 394, 102, 123, 124, 1597, 1598, 1178, 1914, 1357, 644, 2749, 1385, 67, 68, 275, 119, 1214, 619, 122, 410, 107, 1495, 634, 1085, 123, 124, 773, 276, 571, 1122, 311, 635, 1599, 1917, 117, 1462, 2065, 1005, 122, 108, 713, 119, 103, 1731, 123, 124, 1006, 661, 662, 1345, 1511, 382, 859, 312, 125, 602, 415, 655, 1519, 645, 122, 1727, 697, 67, 68, 862, 123, 124, 125, 1120, 699, 702, 638, 705, 709, 104, 711, 122, 1007, 1131, 1529, 384, 646, 123, 124, 127, 721, 791, 277, 315, 109, 299, 69, 911, 730, 732, 1094, 1994, 122, 883, 1095, 300, 1086, -1118, 123, 124, 281, 127, 1123, 2686, 395, 794, 1742, 267, 327, 1778, 167, 775, 776, 781, 2750, 783, 1950, 244, 122, 786, 787, 127, 269, 629, 123, 124, 572, 426, 157, 301, 799, 801, 158, 159, 802, 803, 804, 805, 806, 807, 808, 809, 810, 127, 345, 1503, 811, 396, 397, 1973, 157, 814, 816, 268, 158, 159, 105, 2751, 2752, 817, 127, 308, 818, 1522, 1096, 1669, 1339, 110, 1463, 400, 157, 579, 1125, 1496, 158, 159, 1732, 1060, 826, 827, 828, 127, 829, 1097, 1067, 125, 1978, 832, 833, 834, 492, 835, 157, 356, 580, 493, 158, 159, 1560, 377, 1737, 591, 2690, 1061, 282, 1741, 1913, 127, 844, 157, 1520, 592, 845, 158, 159, 1915, 284, 850, 851, 852, 853, 854, 855, 391, 856, 1068, 419, 860, 861, 1574, 157, 494, 753, 309, 158, 159, 1872, 1464, 593, 1875, 863, 1918, 819, 1091, 1168, 1733, 1743, 1098, 2786, 979, 80, 1442, 354, 1147, 1492, 495, 157, 111, 980, 981, 158, 159, 1067, 468, 469, 470, 471, 472, 473, 474, 341, 541, 475, 476, 477, 478, 392, 1443, 359, 1465, 67, 68, 1512, 1757, 420, 542, 81, 1734, 58, 1894, 754, 734, 2807, 759, 1704, 891, 893, 67, 68, 741, 496, 1744, 1169, 1068, 1143, 982, 820, 543, 360, 506, 1444, 2027, 594, 901, 1173, 1909, 1445, 507, 1694, 1179, 1233, 1446, 370, 1148, 374, 1700, 544, 285, 1234, 59, 1067, 1152, 421, 1062, 361, 362, 956, 1937, 1170, 1447, 922, 1099, 545, 497, 498, 546, 117, 60, 363, 735, 595, 873, 375, 1069, 376, 1327, 82, 743, 380, 1448, 659, 660, 303, 1184, 1602, 412, 760, 1070, 1071, 547, 548, 1068, 1174, 952, 821, 1449, 61, 1180, 993, 423, 1406, 67, 68, 1063, 67, 68, 648, 704, 342, 1407, 1408, 923, 924, 62, 364, 365, 63, 1012, 387, 117, 428, 1153, 569, 649, 1579, 1450, 1149, 64, 1064, 967, 1824, 2812, 2813, 596, 429, 798, 1580, 1328, 777, 1825, 1826, 1185, 1603, 1758, 549, 430, 1751, 764, 767, 770, 431, 1069, 550, 983, 984, 1011, 1409, 1760, 755, 83, 1608, 1451, 1329, 1614, 874, 1070, 1071, 925, 432, 1493, 1171, 1262, 1087, 926, 1452, 1100, 2569, 822, 1072, 1073, 304, 761, 823, 286, 597, 1453, 1827, 582, 287, 343, 288, 736, 1150, 1135, 1136, 1137, 1138, 1513, 1759, 1139, 650, 1141, 1332, 1142, 1154, 1144, 1835, 84, 778, 551, 552, 1622, 1454, 583, 1278, 1836, 1837, 737, 1609, 1069, 927, 1615, 985, 125, 1455, 749, 1456, 1457, 366, 1626, 367, 986, 987, 1070, 1071, 928, 988, 1352, 875, 1330, 1175, 1088, 1206, 67, 68, 1181, 433, 929, 584, 1846, 451, 1078, 305, 930, 86, 931, 1072, 1073, 1847, 1848, 932, 306, 1838, 989, 869, 467, 1458, 67, 68, 1623, 1155, 1194, 1195, 1196, 1197, 1198, 125, 1199, 1201, 1203, 1204, 553, 479, 65, 1410, 1411, 1116, 1627, 1331, 1186, 1604, 779, 1216, 1217, 67, 1200, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1227, 1849, 1347, 368, 1230, 1231, 968, 969, 933, 1498, 1828, 1829, 254, 870, 1353, 1499, 780, 1079, 714, 318, 1072, 1073, 480, 1236, 1237, 1238, 490, 934, 1333, 67, 68, 935, 612, 936, 1746, 2158, 585, 1427, 67, 68, 1747, 502, 1257, 1258, 1259, 504, 1261, 815, 1263, 1412, 1264, 1752, 1117, 970, 715, 2171, 937, 938, 1413, 1414, 67, 68, 1610, 1415, 939, 1616, 445, 1267, 558, 1269, 2208, 87, 532, 2211, 559, 613, 1790, 1791, 1334, 1830, 568, 2219, 940, 1272, 2222, 1898, 1839, 1840, 1831, 1832, 1416, 1279, 2230, 1833, 88, 2233, 1281, 255, 89, 1748, 1080, 716, 2240, 1335, 319, 1428, 1753, 404, 256, 86, 574, 1295, 1297, 1624, -1260, 320, 1661, 67, 1644, 1337, 1834, 1340, 1343, 1792, 1810, 1811, 1476, 575, 1348, 1850, 1851, 1628, 577, 1354, 600, 1118, 446, 405, 941, 608, 963, 1397, 1355, 257, 2345, 2346, 2347, 610, 90, 631, 1585, 632, 2081, 1477, 1749, 1841, 1478, 1363, 2259, 1479, 227, 1754, 1207, 1208, 1842, 1843, 636, 1707, 1708, 1844, 640, 1812, 652, 2269, 1899, 1429, 1430, 67, 68, 614, 657, 971, 972, 658, 91, 228, 1480, 1210, 1211, 1431, 258, 663, 92, 93, 1103, 695, 1845, 321, 1852, 1126, 696, 2288, 698, 259, 1436, 717, 72, 1853, 1854, 712, 322, 73, 1855, 1481, 1468, 719, 1482, 1750, 229, 447, 1857, 1858, 2720, 1900, 1497, 230, 2175, 2176, 1432, 720, 87, 725, 2729, 2562, 727, 231, 232, 2184, 2185, 1856, 1709, 1469, 233, 733, 1470, 1521, 739, 74, 1695, 1696, 973, 1793, 1794, 88, 1527, 2193, 2194, 2077, 757, 974, 975, 67, 1294, 234, 67, 68, 758, 1859, 1555, 784, 1556, 75, 785, 2177, 1471, 1557, 1558, 1559, 1342, 235, 67, 68, 67, 68, 2186, 1565, 788, 1697, 1566, 1229, 1569, 976, 67, 68, 1893, 236, 1434, 1435, 115, 1813, 1814, 1472, 2195, 237, 1473, 796, 1572, 90, 1573, 1563, 1564, 1715, 1576, 1577, 1930, 1931, 76, 812, 290, 813, 1795, 67, 68, 1888, 238, 825, 1583, 1584, 1483, 1796, 1797, 1586, 1587, 67, 68, 117, 830, 1588, 831, 1589, 847, 848, 1591, 91, 1592, 67, 68, 435, 2801, 836, 838, 92, 93, 2804, 841, 1648, 842, 1484, 437, 239, 77, 1798, 67, 68, 1891, 864, 2648, 872, 1815, 2651, 700, 2653, 865, 885, 877, 2657, 2658, 1816, 1817, 1716, 118, 879, 728, 1485, 1639, 1640, 1641, 1642, 296, 1643, 1645, 887, 2672, 1647, 903, 1860, 1861, 67, 68, 1934, 889, 2178, 2179, 2834, 455, 2835, 918, 240, 1653, 1818, 67, 68, 2187, 2188, 1434, 1435, 1474, 908, 241, 1656, 2425, 1658, 1659, 1660, 1662, 1763, 913, 1665, 1666, 2434, 2196, 2197, 919, 920, 120, 67, 68, 921, 2443, 944, 701, 435, 436, 437, 946, 1475, 1682, 242, 948, 1717, 1718, 953, 729, 1687, 958, 1049, 950, 1688, 1689, 1690, 954, 962, 964, 1719, 1862, 965, 2336, 966, 1698, 1050, 2180, 1701, 291, 1863, 1864, 456, 453, 978, 1051, 2181, 2182, 2189, 1711, 977, 990, 1713, 998, 1000, 1052, 1001, 2190, 2191, 125, 1764, 457, 458, 459, 126, 1008, 2198, 1009, 460, 1720, 1010, 1075, 1865, 1066, 292, 2199, 2200, 1082, 2183, 1955, 1077, 461, 1083, 1134, 1053, 1145, 1132, 1133, 462, 2192, 1158, 67, 68, 1908, 1762, 1434, 1435, 1769, 1157, 463, 1770, 1771, 245, 1772, 1054, 1773, 1159, 2201, 1160, 1161, 2371, 1775, 1162, 1776, 522, 1163, 530, 1164, 535, 539, 1782, 1165, 1166, 67, 68, 1936, 566, 1434, 1435, 246, 1765, 1766, 1183, 293, 1188, 1189, 1190, 2387, 1191, 1524, 1192, 599, 2531, 1193, 1767, 2012, 2535, 741, 1209, 1212, 1055, 2540, 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, 348, 1218, 1228, 1768, 1232, 1235, 1056, 349, 1240, 1253, 1254, 1286, 1265, 1571, 1266, 1889, 1890, 1892, 1436, 247, 1287, 481, 742, 1578, 1288, 743, 1291, 1344, 1292, 1293, 1057, 464, 1338, 248, 1350, 707, 1356, 1902, 1346, 482, 1360, 1905, 1361, 1364, 1436, 1365, 1366, 1374, 1375, 1441, 1376, 1377, 1379, 1381, 1380, 1382, 483, 1383, 1389, 1390, 2087, 744, 1392, 1393, 1933, 1935, 1436, 1399, 484, 1058, 2089, 1059, 1401, 1402, 1943, 1404, 1417, 1953, 1418, 1467, 1419, 1420, 1423, 1489, 1960, 485, 1424, 1425, 486, 249, 1438, 1439, 1440, 1460, 1466, 1461, 1486, 745, 1967, 487, 1487, 1488, 1490, 1969, 1491, 1504, 1500, 1971, 1507, 1974, 1975, 1508, 1977, 1979, 1980, 1509, 1982, 1514, 1517, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1995, 1997, 1998, 250, 1515, 2000, 2001, 2002, 2003, 1516, 1525, 1523, 1526, 251, 488, 2009, 2010, 746, 1562, 1575, 747, 2013, 2014, 2015, 1581, 1582, 2017, 2018, 1594, 1618, 1590, 1621, 1593, 1607, 1612, 1613, 1619, 1620, 2020, 2021, 1630, 2022, 2023, 748, 1631, 1632, 749, 2644, 1530, 1633, 1634, 1635, 1652, 1531, 1650, 2652, 2554, 750, 1651, 2656, 1657, 1663, 1664, 1681, 2661, 2558, 858, 1680, 1671, 1672, 1673, 1674, 1675, 1683, 1532, 1533, 1684, 1534, 1535, 1676, 1677, 1679, 1685, 1692, 1699, -456, 1706, 1712, 1536, 1702, 1703, 1714, 2043, 2044, 350, 1723, 351, 2046, 1724, 1725, 1537, 1538, 2048, 2051, 1730, 2053, 2054, 2055, 1539, 2056, 2057, 1540, 2059, 1735, 1755, 2062, 2063, 1745, 2577, 1738, 1761, 2579, 1739, 1780, 2580, 1781, 2581, 1774, 1541, 1756, 1786, 1805, 2075, 1808, 1542, 1543, 1819, 1821, 1544, 2079, 1823, 295, 1867, 1868, 1869, 1873, 1866, 2084, 2085, 1874, 2060, 1876, 1877, 1878, 1881, 2088, 1884, 1901, 1904, 1910, 906, 2090, 1919, 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, 1911, 943, 1916, 1920, 2129, 1921, 1545, 1922, 1923, 1925, 1926, 1927, 1928, 1885, 331, 424, 1932, 1929, 1952, 2291, 1970, 1972, 1976, 1983, 332, 1984, 1999, 2006, 2019, 2024, 2147, 2148, 2025, 2295, 2296, 2150, 1104, 2298, 452, 2026, 2030, 2153, 1903, 2302, 1105, 2304, 1907, 2028, 2029, 2031, 1106, 333, 2032, 2061, 2033, 2034, 2035, 2036, 2039, 1546, 2037, 2038, 2040, 2041, 1547, 2042, -1262, 2058, 2064, 1107, 2066, 2067, 1938, 2068, 2069, 2070, 2071, 2086, 1981, 1548, 2091, 2202, 2093, 1956, 2094, 2095, 2096, 2142, 1549, 2143, 2341, 1961, 1962, 1108, 2144, 2145, 2149, 2213, 2151, 2152, 2159, 1109, 1968, 2155, 2156, 2800, 2157, 2160, 519, 2161, 526, 529, 2164, 534, 538, 1550, 1551, 2166, 2167, 2168, 2172, 2173, 2356, 2174, 2203, 334, 2204, 2205, 2209, 2210, 2220, 2353, 2212, 2214, 2215, 2216, 1552, 2221, 2224, 1110, 2223, 606, 2360, 2225, 2226, 2227, 2231, 1111, 2254, 2255, 2232, 2257, 2234, 1436, 2235, 2236, 2237, 2241, 621, 626, 2242, 2682, 2245, 335, 2243, 2246, 168, 2248, 1436, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2249, 2279, 1553, 169, 2251, 170, 67, 68, -1131, 2258, 1112, 2260, 2264, 2268, 2284, 2280, 2286, 2281, 1436, 2282, 2283, 1113, 115, 2293, 2287, 2328, 2333, 336, 2334, 2337, 2343, 2359, 706, 2357, 2294, 171, 1114, 2358, 2363, 2549, 2364, 2300, 2365, 172, 2374, 2377, 2378, 2379, 337, 2380, 726, 2406, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2407, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, 2408, 2329, 2409, 2330, 2331, 2332, 2072, 2411, 338, 2413, 2415, 2418, 1245, 2420, 2742, 2421, 2422, 2426, 2427, 2342, 2428, 2429, 2430, 173, 339, 2431, 2435, 2436, 2444, 118, 2437, 2438, 1370, 2439, 2440, 2445, 2747, 2446, 2453, 2456, 2464, 2467, 2470, 2471, 2473, 2476, 2477, 2478, 1268, 2348, 2481, 2487, 2349, 2491, 2350, 2508, 2352, 2556, 2557, 2354, 2564, 2355, 2565, 2566, 1421, 2568, 2787, 2570, 2361, 2362, 2572, 2573, 846, 2574, 2576, 174, 2582, 1678, 2583, 2585, 2586, 2595, 2742, 120, 2369, 2599, 2370, 2606, 2612, 2616, 2373, 175, 176, 2619, 2375, 2626, 843, 2634, 177, 2646, 178, 2669, 2676, 2678, 2680, 2681, 849, 2684, 2689, 2717, 2723, 2726, 2731, 2739, 2745, 857, 2509, 2510, 2511, 2746, 2748, 2515, 2757, 2517, 2518, 179, 2767, 2522, 2775, 2524, 2780, 2788, 2789, 2790, 2791, 2796, 2799, 2784, 2809, 2810, 2814, 2822, 1167, 2826, 2827, 2830, 126, 2832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 710, 2560, 0, 0, 0, 0, 0, 0, 0, 892, 0, 0, 894, 895, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 899, 0, 0, 0, 0, 902, 0, 1502, 0, 0, 0, 0, 0, 0, 914, 916, 2479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2263, 0, 0, 797, 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, 0, 2485, 0, 2289, 0, 0, 0, 0, 1568, 0, 0, 0, 0, 0, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 959, 960, 961, 0, 0, 2506, 0, 0, 0, 0, 0, 0, 2512, 0, 0, 2516, 0, 0, 837, 0, 0, 2523, 0, 0, 2525, 2526, 2527, 2528, 2529, 2530, 1436, 2532, 2533, 2534, 1436, 2536, 2537, 2538, 2539, 1436, 2541, 2542, 2543, 2544, 2545, 2546, 0, 2548, 2637, 1436, 2552, 2553, 0, 0, 0, 0, 2640, 0, 0, 1102, 0, 0, 0, 0, 0, 0, 0, 2559, 0, 0, 0, 2561, 0, 0, 0, 2563, 0, 0, 0, 0, 2567, 0, 0, 0, 0, 0, 2667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 890, 0, 0, 0, 0, 0, 0, 896, 0, 0, 897, 0, 0, 0, 0, 898, 0, 0, 0, 900, 2587, 0, 0, 0, 1783, 1784, 1785, 0, 0, 0, 0, 0, 0, 0, 1787, 1788, 1789, 0, 0, 0, 0, 1800, 1801, 1802, 0, 0, 1803, 1804, 0, 1806, 1807, 0, 0, 0, 0, 1705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1722, 0, 0, 0, 0, 1729, 0, 0, 0, 1879, 1880, 0, 0, 1882, 1883, 0, 0, 957, 0, 0, 0, 0, 0, 2628, 0, 0, 0, 2630, 0, 0, 1239, 0, 0, 0, 0, 0, 0, 2631, 2632, 0, 0, 0, 0, 0, 2636, 0, 0, 0, 0, 1260, 0, 2639, 0, 0, 0, 0, 0, 0, 0, 1436, 0, 2645, 0, 0, 2649, 2650, 0, 1436, 0, 0, 0, 1436, 0, 0, 2659, 2660, 1436, 2662, 2663, 2664, 2665, 2666, 0, 0, 2668, 1270, 1271, 0, 2671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2679, 0, 0, 0, 0, 0, 2683, 0, 0, 0, 1290, 0, 0, 0, 0, 0, 0, 0, 1140, 0, 0, 0, 0, 0, 2692, 1146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1241, 0, 0, 0, 1887, 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1359, 0, 2703, 0, 0, 0, 0, 0, 2708, 0, 2710, 0, 0, 0, 1104, 1243, 2714, 0, 0, 0, 0, 0, 1105, 0, 0, 0, 0, 0, 1106, 1436, 2721, 0, 0, 0, 0, 0, 0, 2555, 1940, 1436, 2730, 1942, 0, 2762, 2734, 0, 0, 1107, 0, 0, 1958, 1244, 0, 0, 0, 0, 0, 0, 1964, 0, 0, 0, 0, 2753, 0, 1966, 0, 0, 0, 0, 0, 1108, 0, 0, 0, 1501, 0, 0, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 2765, 0, 0, 0, 0, 0, 2770, 0, 2772, 0, 1255, 0, 0, 0, 0, 2776, 1256, 0, 2778, 0, 0, 0, 0, 2781, 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, 0, 1111, 0, 1561, 0, 0, 0, 0, 0, 0, 2792, 0, 0, 1567, 0, 0, 1570, 0, 0, 0, 0, 0, 0, 0, 0, 1273, 0, 0, 1436, 0, 1277, 1436, 2802, 1280, 2803, 0, 1436, 2805, 0, 0, 0, 0, 1112, 0, 0, 1289, 0, 0, 2811, 0, 0, 0, 0, 1113, 664, 665, 0, 0, 2821, 0, 0, 2824, 0, 0, 0, 0, 0, 0, 1114, 0, 2654, 0, 0, 2050, 0, 0, 0, 0, 1245, 0, 1246, 0, 0, 0, 0, 0, 1436, 2670, 1436, 0, 0, 0, 0, 0, 0, 0, 2154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2162, 666, 0, 0, 0, 0, 1646, 667, 0, 0, 2165, 0, 0, 0, 668, 0, 669, 0, 0, 0, 0, 670, 2673, 1654, 671, 1247, 2677, 0, 0, 1387, 672, 67, 68, 0, 1426, 2100, 2102, 2104, 2106, 2108, 673, 0, 2111, 0, 0, 2113, 674, 115, 2115, 2117, 2119, 2121, 2123, 2125, 675, 0, 2128, 0, 0, 0, 0, 2132, 2134, 0, 0, 2137, 1686, 0, 0, 676, 0, 2140, 0, 0, 0, 2718, 2719, 1693, 0, 2722, 0, 2724, 2250, 0, 117, 2727, 2728, 0, 0, 677, 2732, 2733, 0, 0, 2736, 0, 0, 0, 0, 2737, 2738, 0, 0, 0, 1721, 678, 0, 0, 0, 1728, 0, 0, 0, 0, 679, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2773, 0, 0, 2774, 0, 0, 0, 0, 2777, 0, 0, 682, 2779, 0, 0, 0, 0, 2782, 0, 0, 0, 0, 0, 0, 683, 0, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 685, 0, 0, 0, 0, 686, 0, 0, 0, 0, 0, 687, 0, 0, 0, 0, 0, 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2262, 0, 0, 2266, 0, 0, 689, 0, 0, 0, 0, 0, 0, 0, 1649, 2820, 0, 0, 2823, 690, 691, 0, 692, 0, 0, 0, 0, 125, 1886, 0, 0, 0, 126, 0, 0, 0, 2831, 0, 0, 2833, 0, 2808, 0, 0, 0, 0, 0, 1667, 2836, 2837, 0, 0, 0, 0, 0, 0, 1906, 0, 0, 0, 0, 0, 693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, 0, 0, 0, 0, 1939, 0, 0, 1941, 0, 0, 0, 0, 0, 0, 0, 0, 1957, 1959, 0, 0, 0, 0, 0, 0, 1963, 0, 0, 0, 0, 0, 0, 1965, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 2416, 2004, 0, 0, 2007, 2008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2376, 0, 2448, 2449, 2450, 2451, 2452, 0, 2454, 2455, 0, 0, 0, 2459, 2460, 2461, 2462, 2463, 0, 2465, 2466, 0, 0, 1799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2045, 0, 0, 0, 0, 1870, 1871, 2049, 0, 0, 0, 0, 2412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2073, 2074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2092, 0, 0, 1954, 0, 2097, 0, 0, 2099, 2101, 2103, 2105, 2107, 0, 0, 2110, 0, 0, 2112, 0, 0, 2114, 2116, 2118, 2120, 2122, 2124, 0, 2126, 2127, 0, 0, 0, 2130, 2131, 2133, 0, 2135, 2136, 0, 0, 0, 0, 2138, 2139, 0, 0, 2483, 2141, 0, 0, 0, 0, 2146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2005, 0, 0, 0, 0, 0, 2011, 0, 0, 0, 0, 0, 0, 2504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2514, 0, 0, 0, 0, 0, 2521, 0, 0, 0, 0, 0, 2588, 0, 0, 2590, 2591, 2592, 2593, 2594, 0, 2596, 2597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2601, 2602, 2603, 2604, 2605, 0, 2607, 2608, 0, 2610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2613, 2614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2617, 2047, 0, 0, 0, 0, 0, 2052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 2253, 0, 0, 2256, 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 2261, 2076, 0, 2265, 0, 0, 0, 0, 2082, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2285, 0, 117, 2372, 2098, 0, 0, 0, 0, 0, 0, 2109, 0, 0, 0, 0, 0, 0, 0, 2382, 0, 2383, 0, 2384, 0, 0, 0, 2386, 0, 0, 2388, 0, 2389, 0, 0, 0, 2391, 0, 2392, 0, 2393, 0, 0, 0, 2395, 0, 2396, 118, 0, 0, 2399, 0, 0, 2401, 2624, 2402, 0, 0, 2404, 2327, 2694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2697, 0, 2698, 0, 0, 0, 2700, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2163, 0, 0, 0, 0, 0, 0, 0, 2169, 2170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2206, 2207, 0, 0, 0, 0, 0, 2368, 0, 0, 0, 2217, 2218, 0, 0, 0, 0, 0, 0, 0, 0, 2758, 2228, 2229, 2759, 125, 0, 2760, 0, 2761, 126, 0, 2238, 2239, 0, 2252, 0, 0, 2244, 2480, 0, 0, 2484, 0, 0, 0, 0, 2488, 2247, 0, 0, 2489, 0, 0, 0, 2267, 0, 0, 0, 0, 0, 2398, 0, 0, 0, 2706, 0, 0, 0, 0, 0, 2505, 0, 2712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2290, 0, 2292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2297, 0, 2299, 0, 0, 0, 2301, 0, 2303, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 2335, 2571, 0, 2339, 2340, 0, 0, 0, 0, 0, 0, 0, 2344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2578, 0, 0, 2482, 0, 0, 2486, 0, 0, 0, 0, 0, 0, 0, 2351, 0, 2490, 0, 0, 0, 0, 0, 2798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2503, 0, 0, 2507, 0, 0, 2366, 2367, 0, 0, 2513, 0, 0, 0, 0, 2519, 2520, 0, 0, 2816, 0, 0, 2819, 0, 0, 0, 0, 0, 0, 0, 2381, 0, 0, 0, 0, 0, 0, 0, 2385, 0, 0, 0, 0, 0, 0, 0, 0, 2390, 0, 0, 0, 0, 2625, 0, 0, 2394, 0, 0, 0, 0, 2397, 0, 0, 0, 2400, 0, 0, 0, 0, 2403, 0, 0, 2405, 2633, 0, 0, 0, 0, 0, 2410, 0, 0, 0, 2638, 0, 0, 0, 0, 0, 2641, 2642, 0, 0, 0, 0, 2575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2417, 0, 0, 0, 2584, 0, 0, 0, 0, 0, 2419, 0, 0, 0, 2423, 2424, 0, 0, 0, 0, 915, 0, 0, 2432, 2433, 0, 0, 0, 0, 0, 0, 0, 2441, 2442, 0, 115, 0, 0, 2447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2457, 2458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2468, 2469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2472, 0, 0, 2704, 0, 0, 0, 2623, 0, 2474, 0, 2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2716, 0, 0, 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 118, 2643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2655, 0, 0, 0, 0, 0, 0, 116, 0, 0, 2547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 2763, 0, 2764, 0, 2766, 0, 2768, 0, 2769, 0, 2771, 0, 0, 0, 1205, 0, 120, 2688, 0, 0, 0, 0, 0, 0, 0, 0, 2691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2795, 0, 0, 119, 0, 0, 0, 0, 0, 0, 2705, 2707, 0, 2709, 0, 0, 0, 0, 2711, 2713, 0, 0, 126, 2715, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 2589, 0, 2825, 0, 0, 0, 0, 2735, 0, 0, 2598, 0, 0, 0, 0, 0, 0, 0, 0, 2600, 0, 0, 0, 0, 0, 0, 2755, 0, 2609, 0, 0, 2756, 0, 0, 0, 2611, 121, 0, 2622, 0, 0, 0, 0, 0, 122, 2627, 2615, 0, 0, 2629, 123, 124, 2618, 0, 0, 2620, 125, 0, 2621, 0, 0, 126, 0, 0, 0, 0, 2635, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2806, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 2815, 0, 0, 2818, 0, 0, 0, 0, 0, 0, 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, 2693, 0, 0, 0, 2695, 157, 0, 0, 0, 158, 159, 2696, 0, 0, 0, 0, 0, 2699, 0, 0, 0, 2701, 0, 0, 2702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2725, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 115, 0, 0, 6, 7, 0, 8, 9, 10, 2783, 0, 0, 509, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 12, 0, 13, 14, 0, 0, 2793, 2794, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 510, 511, 0, 0, 512, 0, 0, 0, 0, 0, 0, 622, 115, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 2817, 513, 18, 0, 0, 0, 19, 0, 0, 20, 0, 118, 0, 0, 21, 0, 22, 0, 2828, 0, 0, 2829, 23, 0, 0, 0, 623, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 26, 27, 28, 0, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 120, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 514, 32, 33, 34, 624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 515, 0, 0, 0, 0, 36, 0, 0, 37, 0, 0, 38, 0, 39, 0, 40, 0, 0, 0, 516, 41, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 126, 42, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 47, 0, 0, 0, 0, 0, 48, 0, 0, 49, 50, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 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, 0, 518, 0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1013, 1014, 1015, 0, 0, 1298, 1299, 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1016, 1017, 0, 0, 1018, 1301, 1302, 1019, 115, 1303, 0, 0, 0, 0, 1020, 0, 1304, 0, 1021, 1305, 0, 0, 0, 1306, 0, 0, 1022, 1023, 0, 0, 0, 1307, 1308, 0, 1024, 1025, 115, 0, 0, 1309, 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 1026, 0, 0, 0, 0, 0, 1027, 0, 0, 1028, 1029, 0, 0, 1030, 1310, 1311, 0, 0, 1312, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 1031, 0, 0, 0, 0, 1313, 0, 115, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1032, 0, 0, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 1033, 0, 0, 0, 524, 1315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1316, 0, 0, 0, 0, 0, 120, 0, 1034, 0, 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 120, 0, 1035, 0, 1036, 0, 0, 1317, 0, 1037, 1038, 0, 0, 0, 1318, 1319, 0, 0, 0, 0, 1358, 0, 0, 1039, 1040, 0, 0, 0, 0, 1320, 125, 0, 0, 1041, 1042, 126, 0, 0, 0, 1321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 125, 1043, 0, 1044, 0, 126, 1322, 118, 1323, 0, 0, 0, 0, 0, 0, 1045, 0, 1046, 1324, 0, 0, 0, 0, 1047, 0, 0, 0, 0, 1325, 991, 0, 0, 0, 528, 0, 992, 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 1048, 0, 0, 0, 120, 1326, 0, 0, 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, 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, 525, 1395, 118, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 120, 0, 0, 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, 0, 0, 0, 0, 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, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1396, 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, 0, 0, 0, 0, 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, 184, 0, 0, 185, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 188, 189, 190, 0, 0, 0, 0, 0, 0, 0, 191, 0, 192, 0, 0, 0, 0, 193, 0, 194, 195, 196, 0, 0, 0, 0, 197, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, 0, 0, 203, 0, 0, 0, 204, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 207, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 211, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 213, 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 217, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 220, 0, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222 }; static const yytype_int16 yycheck[] = { 4, 222, 5, 1688, 5, 1690, 50, 4, 12, 14, 5, 679, 680, 684, 5, 4, 5, 3, 4, 5, 27, 3, 4, 32, 3, 4, 4, 20, 5, 33, 61, 985, 3, 4, 988, 4, 40, 4, 5, 5, 0, 48, 3, 4, 51, 49, 66, 17, 52, 148, 4, 1005, 5, 17, 58, 62, 61, 4, 62, 279, 1479, 65, 5, 21, 57, 69, 70, 13, 78, 73, 130, 91, 76, 97, 31, 4, 80, 105, 85, 4, 84, 32, 3, 4, 1014, 89, 1160, 17, 1162, 148, 6, 50, 16, 42, 43, 102, 4, 131, 99, 66, 164, 103, 210, 107, 105, 109, 110, 111, 112, 66, 66, 3, 4, 56, 1188, 1189, 1190, 4, 222, 66, 20, 88, 65, 80, 128, 6, 83, 56, 66, 118, 5, 3, 4, 155, 91, 135, 33, 3, 4, 87, 99, 66, 99, 4, 36, 141, 3, 4, 3, 4, 116, 118, 3, 4, 87, 254, 215, 4, 66, 163, 239, 171, 184, 896, 897, 898, 194, 46, 165, 136, 16, 118, 88, 277, 133, 175, 83, 61, 257, 3, 4, 36, 242, 187, 189, 187, 3, 4, 192, 3, 4, 299, 99, 118, 227, 254, 260, 3, 4, 3, 4, 235, 59, 119, 64, 5, 66, 155, 21, 4, 118, 193, 201, 21, 21, 243, 187, 174, 207, 208, 169, 170, 155, 21, 957, 191, 187, 157, 3, 4, 223, 118, 256, 292, 201, 245, 40, 129, 119, 209, 207, 208, 188, 236, 182, 209, 277, 251, 197, 21, 56, 27, 1671, 258, 201, 59, 300, 118, 215, 27, 207, 208, 267, 267, 268, 936, 243, 276, 452, 300, 213, 195, 241, 264, 129, 241, 201, 235, 282, 3, 4, 465, 207, 208, 213, 280, 290, 291, 241, 293, 294, 248, 296, 201, 299, 296, 299, 121, 264, 207, 208, 290, 306, 281, 297, 287, 110, 296, 287, 306, 314, 315, 36, 299, 201, 335, 40, 306, 288, 279, 207, 208, 182, 290, 288, 276, 297, 281, 27, 296, 289, 231, 15, 337, 338, 339, 297, 341, 345, 22, 201, 345, 346, 290, 27, 192, 207, 208, 286, 224, 339, 34, 356, 357, 343, 344, 360, 361, 362, 363, 364, 365, 366, 367, 368, 290, 287, 1038, 372, 340, 341, 222, 339, 377, 378, 342, 343, 344, 335, 340, 341, 385, 290, 88, 388, 1056, 110, 266, 205, 193, 166, 74, 339, 277, 281, 287, 343, 344, 166, 4, 404, 405, 406, 290, 408, 129, 63, 213, 222, 413, 414, 415, 187, 417, 339, 287, 300, 192, 343, 344, 1088, 287, 235, 37, 2584, 30, 286, 235, 235, 290, 434, 339, 287, 47, 438, 343, 344, 235, 66, 443, 444, 445, 446, 447, 448, 192, 450, 104, 142, 453, 454, 1119, 339, 228, 61, 37, 343, 344, 1412, 235, 74, 1415, 466, 235, 30, 122, 61, 235, 167, 193, 2741, 5, 4, 40, 227, 40, 27, 252, 339, 283, 14, 15, 343, 344, 63, 168, 169, 170, 171, 172, 173, 174, 4, 45, 177, 178, 179, 180, 245, 66, 0, 277, 3, 4, 27, 27, 200, 59, 40, 277, 12, 1441, 119, 61, 2785, 34, 4, 521, 522, 3, 4, 61, 297, 222, 119, 104, 710, 61, 94, 81, 22, 168, 99, 1607, 148, 539, 61, 1467, 105, 176, 1273, 61, 4, 110, 5, 110, 263, 1280, 100, 202, 12, 53, 63, 40, 248, 160, 48, 49, 602, 1489, 155, 128, 566, 287, 116, 340, 341, 119, 56, 71, 62, 119, 186, 78, 5, 232, 4, 66, 110, 119, 5, 148, 265, 266, 70, 61, 61, 5, 107, 246, 247, 143, 144, 104, 119, 599, 162, 164, 100, 119, 644, 5, 5, 3, 4, 210, 3, 4, 93, 292, 122, 14, 15, 4, 5, 117, 108, 109, 120, 663, 121, 56, 4, 110, 206, 110, 5, 194, 193, 131, 235, 635, 5, 2793, 2794, 249, 17, 121, 17, 128, 40, 14, 15, 119, 119, 167, 198, 5, 1319, 332, 333, 334, 5, 232, 206, 189, 190, 661, 61, 1330, 267, 193, 61, 230, 153, 61, 171, 246, 247, 60, 5, 222, 267, 857, 678, 66, 243, 681, 2363, 245, 337, 338, 168, 202, 250, 338, 300, 254, 61, 98, 343, 203, 345, 241, 259, 699, 700, 701, 702, 222, 222, 705, 187, 707, 30, 709, 193, 711, 5, 241, 110, 263, 264, 61, 281, 124, 900, 14, 15, 267, 119, 232, 113, 119, 258, 213, 293, 267, 295, 296, 222, 61, 224, 267, 268, 246, 247, 128, 272, 17, 245, 230, 267, 254, 788, 3, 4, 267, 4, 140, 159, 5, 193, 40, 240, 146, 28, 148, 337, 338, 14, 15, 153, 249, 61, 299, 192, 4, 335, 3, 4, 119, 259, 777, 778, 779, 780, 781, 213, 783, 784, 785, 786, 335, 116, 287, 189, 190, 40, 119, 279, 267, 267, 193, 798, 799, 3, 4, 802, 803, 804, 805, 806, 807, 808, 809, 810, 61, 205, 301, 814, 815, 14, 15, 205, 257, 189, 190, 26, 245, 98, 263, 222, 110, 54, 26, 337, 338, 66, 833, 834, 835, 117, 224, 160, 3, 4, 228, 44, 230, 257, 1795, 251, 82, 3, 4, 263, 279, 852, 853, 854, 168, 856, 12, 858, 258, 860, 167, 110, 61, 90, 1815, 253, 254, 267, 268, 3, 4, 267, 272, 261, 267, 40, 877, 5, 879, 1830, 149, 33, 1833, 89, 87, 14, 15, 210, 258, 16, 1841, 279, 893, 1844, 105, 189, 190, 267, 268, 299, 901, 1852, 272, 172, 1855, 906, 111, 176, 167, 193, 137, 1862, 235, 111, 150, 222, 147, 122, 28, 66, 921, 922, 267, 0, 122, 59, 3, 4, 929, 299, 931, 932, 61, 14, 15, 22, 228, 938, 189, 190, 267, 278, 943, 89, 193, 110, 177, 335, 72, 629, 991, 952, 157, 2024, 2025, 2026, 31, 226, 5, 1140, 4, 1691, 49, 222, 258, 52, 967, 1894, 55, 19, 277, 4, 5, 267, 268, 4, 24, 25, 272, 5, 61, 5, 1909, 194, 220, 221, 3, 4, 191, 4, 189, 190, 5, 262, 44, 82, 4, 5, 234, 204, 5, 270, 271, 683, 5, 299, 204, 258, 688, 4, 1937, 5, 217, 1014, 241, 187, 267, 268, 4, 217, 192, 272, 109, 22, 4, 112, 285, 77, 193, 14, 15, 2649, 243, 1034, 84, 14, 15, 273, 4, 149, 5, 2659, 59, 4, 94, 95, 14, 15, 299, 97, 49, 101, 97, 52, 1055, 119, 228, 1275, 1276, 258, 189, 190, 172, 1064, 14, 15, 176, 5, 267, 268, 3, 4, 122, 3, 4, 4, 61, 1078, 264, 1080, 252, 4, 61, 82, 1085, 1086, 1087, 17, 138, 3, 4, 3, 4, 61, 1095, 4, 1277, 1098, 12, 1100, 299, 3, 4, 5, 154, 7, 8, 19, 189, 190, 109, 61, 162, 112, 4, 1116, 226, 1118, 4, 5, 82, 1122, 1123, 4, 5, 297, 4, 39, 5, 258, 3, 4, 5, 183, 4, 1136, 1137, 224, 267, 268, 1141, 1142, 3, 4, 56, 4, 1147, 4, 1149, 440, 441, 1152, 262, 1154, 3, 4, 9, 2775, 5, 4, 270, 271, 2780, 4, 1205, 4, 253, 11, 218, 341, 299, 3, 4, 5, 5, 2527, 168, 258, 2530, 40, 2532, 263, 192, 4, 2536, 2537, 267, 268, 150, 101, 4, 40, 279, 1194, 1195, 1196, 1197, 33, 1199, 1200, 176, 2553, 1203, 4, 189, 190, 3, 4, 5, 168, 189, 190, 2830, 35, 2832, 5, 266, 1218, 299, 3, 4, 189, 190, 7, 8, 224, 195, 277, 1229, 2180, 1231, 1232, 1233, 1234, 82, 195, 1237, 1238, 2189, 189, 190, 5, 4, 155, 3, 4, 195, 2198, 66, 110, 9, 10, 11, 66, 253, 1256, 306, 66, 220, 221, 5, 110, 1263, 5, 66, 222, 1267, 1268, 1269, 223, 4, 4, 234, 258, 4, 2005, 195, 1278, 80, 258, 1281, 193, 267, 268, 106, 121, 5, 89, 267, 268, 258, 1292, 87, 87, 1295, 5, 4, 99, 4, 267, 268, 213, 150, 125, 126, 127, 218, 5, 258, 5, 132, 273, 4, 99, 299, 5, 228, 267, 268, 4, 299, 1502, 17, 145, 5, 4, 128, 4, 17, 17, 152, 299, 97, 3, 4, 5, 1337, 7, 8, 1340, 4, 163, 1343, 1344, 88, 1346, 148, 1348, 5, 299, 5, 87, 2082, 1354, 4, 1356, 192, 5, 194, 5, 196, 197, 1363, 87, 5, 3, 4, 5, 204, 7, 8, 115, 220, 221, 4, 287, 5, 5, 4, 2109, 5, 1061, 5, 219, 2311, 5, 234, 1568, 2315, 61, 4, 4, 194, 2320, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 16, 12, 5, 273, 12, 4, 230, 23, 4, 4, 4, 165, 5, 1115, 5, 1438, 1439, 1440, 1441, 185, 5, 53, 116, 1125, 4, 119, 4, 253, 5, 4, 254, 275, 20, 199, 281, 293, 5, 1460, 253, 71, 4, 1464, 5, 5, 1467, 5, 5, 4, 4, 105, 5, 5, 265, 5, 265, 5, 88, 5, 4, 4, 1700, 155, 5, 5, 1487, 1488, 1489, 5, 100, 293, 1710, 295, 5, 5, 1497, 5, 4, 1500, 4, 105, 5, 5, 4, 105, 1507, 117, 5, 5, 120, 255, 235, 235, 235, 235, 135, 5, 40, 191, 1521, 131, 235, 235, 5, 1526, 209, 40, 239, 1530, 239, 1532, 1533, 209, 1535, 1536, 1537, 5, 1539, 4, 209, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, 1551, 1552, 296, 5, 1555, 1556, 1557, 1558, 5, 4, 209, 4, 306, 173, 1565, 1566, 238, 5, 5, 241, 1571, 1572, 1573, 5, 5, 1576, 1577, 4, 4, 110, 4, 110, 5, 5, 5, 5, 5, 1588, 1589, 5, 1591, 1592, 264, 5, 4, 267, 2523, 22, 5, 5, 4, 12, 27, 5, 2531, 2335, 278, 5, 2535, 12, 6, 4, 6, 2540, 2344, 451, 5, 346, 346, 346, 346, 346, 4, 48, 49, 4, 51, 52, 346, 346, 346, 4, 4, 4, 0, 5, 4, 62, 38, 38, 5, 1642, 1643, 237, 235, 239, 1647, 235, 235, 74, 75, 1652, 1653, 235, 1655, 1656, 1657, 82, 1659, 1660, 85, 1662, 135, 4, 1665, 1666, 167, 2397, 235, 205, 2400, 235, 4, 2403, 4, 2405, 195, 102, 243, 4, 4, 1682, 4, 108, 109, 5, 5, 112, 1689, 5, 33, 5, 5, 5, 4, 265, 1697, 1698, 4, 6, 5, 4, 4, 4, 1705, 5, 5, 5, 235, 545, 1711, 303, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 235, 577, 235, 303, 1745, 4, 171, 4, 4, 4, 4, 4, 303, 1433, 37, 98, 4, 303, 4, 1940, 5, 222, 222, 222, 47, 222, 222, 5, 5, 5, 1771, 1772, 5, 1954, 1955, 1776, 91, 1958, 121, 4, 4, 1782, 1462, 1964, 99, 1966, 1466, 5, 5, 4, 105, 74, 4, 6, 5, 5, 4, 4, 4, 224, 5, 5, 5, 5, 229, 4, 0, 5, 4, 124, 5, 4, 1492, 5, 5, 5, 4, 4, 1538, 244, 4, 265, 5, 1503, 5, 5, 5, 5, 253, 5, 2011, 1511, 1512, 148, 5, 5, 4, 265, 5, 4, 4, 156, 1522, 5, 5, 2772, 5, 4, 191, 5, 193, 194, 4, 196, 197, 280, 281, 5, 5, 5, 4, 4, 12, 5, 5, 148, 5, 5, 4, 4, 4, 2052, 5, 5, 5, 5, 301, 4, 265, 194, 5, 224, 6, 5, 5, 5, 4, 202, 1889, 1890, 4, 1892, 5, 1894, 5, 5, 5, 4, 241, 242, 4, 6, 4, 186, 5, 4, 29, 4, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 4, 4, 345, 44, 5, 46, 3, 4, 279, 5, 243, 5, 5, 5, 1933, 4, 1935, 5, 1937, 4, 4, 254, 19, 1942, 5, 5, 4, 228, 4, 4, 4, 4, 293, 5, 1953, 76, 269, 5, 4, 299, 5, 1960, 4, 84, 5, 5, 5, 5, 249, 5, 311, 5, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 5, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 5, 1995, 5, 1997, 1998, 1999, 1679, 4, 284, 5, 4, 4, 279, 5, 2675, 5, 5, 4, 4, 2013, 5, 5, 5, 139, 300, 5, 4, 4, 4, 101, 5, 5, 972, 5, 5, 4, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 877, 2043, 4, 4, 2046, 4, 2048, 4, 2050, 4, 4, 2053, 5, 2055, 5, 4, 1004, 4, 346, 5, 2062, 2063, 5, 4, 439, 5, 5, 191, 4, 1248, 5, 5, 5, 4, 2743, 155, 2078, 4, 2080, 4, 4, 4, 2084, 207, 208, 4, 2088, 4, 432, 4, 214, 4, 216, 5, 5, 5, 5, 4, 442, 5, 5, 4, 4, 4, 4, 2673, 5, 451, 2290, 2291, 2292, 5, 4, 2295, 4, 2297, 2298, 241, 4, 2301, 4, 2303, 4, 2743, 5, 5, 4, 4, 4, 2739, 5, 5, 5, 4, 744, 5, 5, 4, 218, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2153, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 295, 2351, -1, -1, -1, -1, -1, -1, -1, 521, -1, -1, 524, 525, 306, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 537, -1, -1, -1, -1, 542, -1, 1037, -1, -1, -1, -1, -1, -1, 551, 552, 2251, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1903, -1, -1, 352, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, 2257, -1, 1938, -1, -1, -1, -1, 1099, -1, -1, -1, -1, -1, 2270, 2271, 2272, 2273, 2274, 2275, 2276, 2277, 2278, 2279, 2280, 623, 624, 625, -1, -1, 2286, -1, -1, -1, -1, -1, -1, 2293, -1, -1, 2296, -1, -1, 424, -1, -1, 2302, -1, -1, 2305, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, 2326, -1, 2328, 2509, 2330, 2331, 2332, -1, -1, -1, -1, 2517, -1, -1, 682, -1, -1, -1, -1, -1, -1, -1, 2348, -1, -1, -1, 2352, -1, -1, -1, 2356, -1, -1, -1, -1, 2361, -1, -1, -1, -1, -1, 2547, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 519, -1, -1, -1, -1, -1, -1, 526, -1, -1, 529, -1, -1, -1, -1, 534, -1, -1, -1, 538, 2414, -1, -1, -1, 1364, 1365, 1366, -1, -1, -1, -1, -1, -1, -1, 1374, 1375, 1376, -1, -1, -1, -1, 1381, 1382, 1383, -1, -1, 1386, 1387, -1, 1389, 1390, -1, -1, -1, -1, 1284, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1299, -1, -1, -1, -1, 1304, -1, -1, -1, 1419, 1420, -1, -1, 1423, 1424, -1, -1, 606, -1, -1, -1, -1, -1, 2487, -1, -1, -1, 2491, -1, -1, 836, -1, -1, -1, -1, -1, -1, 2501, 2502, -1, -1, -1, -1, -1, 2508, -1, -1, -1, -1, 855, -1, 2515, -1, -1, -1, -1, -1, -1, -1, 2523, -1, 2525, -1, -1, 2528, 2529, -1, 2531, -1, -1, -1, 2535, -1, -1, 2538, 2539, 2540, 2541, 2542, 2543, 2544, 2545, -1, -1, 2548, 891, 892, -1, 2552, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2563, -1, -1, -1, -1, -1, 2569, -1, -1, -1, 915, -1, -1, -1, -1, -1, -1, -1, 706, -1, -1, -1, -1, -1, 2587, 713, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, 1437, -1, -1, -1, -1, -1, -1, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 962, -1, 2622, -1, -1, -1, -1, -1, 2628, -1, 2630, -1, -1, -1, 91, 92, 2636, -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, 2649, 2650, -1, -1, -1, -1, -1, -1, 2336, 1493, 2659, 2660, 1496, -1, 2703, 2664, -1, -1, 124, -1, -1, 1505, 128, -1, -1, -1, -1, -1, -1, 1513, -1, -1, -1, -1, 2683, -1, 1520, -1, -1, -1, -1, -1, 148, -1, -1, -1, 1037, -1, -1, -1, 156, -1, -1, -1, -1, -1, -1, -1, -1, 2708, -1, -1, -1, -1, -1, 2714, -1, 2716, -1, 843, -1, -1, -1, -1, 2723, 849, -1, 2726, -1, -1, -1, -1, 2731, -1, -1, -1, -1, -1, 194, -1, -1, -1, -1, -1, -1, -1, 202, -1, 1089, -1, -1, -1, -1, -1, -1, 2754, -1, -1, 1099, -1, -1, 1102, -1, -1, -1, -1, -1, -1, -1, -1, 894, -1, -1, 2772, -1, 899, 2775, 2776, 902, 2778, -1, 2780, 2781, -1, -1, -1, -1, 243, -1, -1, 914, -1, -1, 2792, -1, -1, -1, -1, 254, 4, 5, -1, -1, 2802, -1, -1, 2805, -1, -1, -1, -1, -1, -1, 269, -1, 2533, -1, -1, 1652, -1, -1, -1, -1, 279, -1, 281, -1, -1, -1, -1, -1, 2830, 2550, 2832, -1, -1, -1, -1, -1, -1, -1, 1786, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1799, 60, -1, -1, -1, -1, 1201, 66, -1, -1, 1809, -1, -1, -1, 73, -1, 75, -1, -1, -1, -1, 80, 2554, 1218, 83, 335, 2558, -1, -1, 984, 89, 3, 4, -1, 1012, 1723, 1724, 1725, 1726, 1727, 99, -1, 1730, -1, -1, 1733, 105, 19, 1736, 1737, 1738, 1739, 1740, 1741, 113, -1, 1744, -1, -1, -1, -1, 1749, 1750, -1, -1, 1753, 1261, -1, -1, 128, -1, 1759, -1, -1, -1, 2647, 2648, 1272, -1, 2651, -1, 2653, 1881, -1, 56, 2657, 2658, -1, -1, 148, 2662, 2663, -1, -1, 2666, -1, -1, -1, -1, 2671, 2672, -1, -1, -1, 1299, 164, -1, -1, -1, 1304, -1, -1, -1, -1, 173, 174, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, 194, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2717, -1, -1, 2720, -1, -1, -1, -1, 2725, -1, -1, 215, 2729, -1, -1, -1, -1, 2734, -1, -1, -1, -1, -1, -1, 228, -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, 261, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1902, -1, -1, 1905, -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, 1206, 2801, -1, -1, 2804, 292, 293, -1, 295, -1, -1, -1, -1, 213, 1437, -1, -1, -1, 218, -1, -1, -1, 2822, -1, -1, 2825, -1, 2787, -1, -1, -1, -1, -1, 1239, 2834, 2835, -1, -1, -1, -1, -1, -1, 1465, -1, -1, -1, -1, -1, 335, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1270, -1, -1, -1, -1, -1, 1493, -1, -1, 1496, -1, -1, -1, -1, -1, -1, -1, -1, 1505, 1506, -1, -1, -1, -1, -1, -1, 1513, -1, -1, -1, -1, -1, -1, 1520, -1, -1, -1, -1, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, 2163, 1560, -1, -1, 1563, 1564, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1574, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2090, -1, 2203, 2204, 2205, 2206, 2207, -1, 2209, 2210, -1, -1, -1, 2214, 2215, 2216, 2217, 2218, -1, 2220, 2221, -1, -1, 1380, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1392, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1645, -1, -1, -1, -1, 1410, 1411, 1652, -1, -1, -1, -1, 2150, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1680, 1681, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1694, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1715, -1, -1, 1501, -1, 1720, -1, -1, 1723, 1724, 1725, 1726, 1727, -1, -1, 1730, -1, -1, 1733, -1, -1, 1736, 1737, 1738, 1739, 1740, 1741, -1, 1743, 1744, -1, -1, -1, 1748, 1749, 1750, -1, 1752, 1753, -1, -1, -1, -1, 1758, 1759, -1, -1, 2255, 1763, -1, -1, -1, -1, 1768, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1561, -1, -1, -1, -1, -1, 1567, -1, -1, -1, -1, -1, -1, 2284, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2294, -1, -1, -1, -1, -1, 2300, -1, -1, -1, -1, -1, 2417, -1, -1, 2420, 2421, 2422, 2423, 2424, -1, 2426, 2427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2438, 2439, 2440, 2441, 2442, -1, 2444, 2445, -1, 2447, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2457, 2458, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2468, 1648, -1, -1, -1, -1, -1, 1654, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, 1888, -1, -1, 1891, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, 1902, 1686, -1, 1905, -1, -1, -1, -1, 1693, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1934, -1, 56, 2083, 1721, -1, -1, -1, -1, -1, -1, 1728, -1, -1, -1, -1, -1, -1, -1, 2099, -1, 2101, -1, 2103, -1, -1, -1, 2107, -1, -1, 2110, -1, 2112, -1, -1, -1, 2116, -1, 2118, -1, 2120, -1, -1, -1, 2124, -1, 2126, 101, -1, -1, 2130, -1, -1, 2133, 2481, 2135, -1, -1, 2138, 1993, 2598, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2609, -1, 2611, -1, -1, -1, 2615, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1805, -1, -1, -1, -1, -1, -1, -1, 1813, 1814, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1828, 1829, -1, -1, -1, -1, -1, 2075, -1, -1, -1, 1839, 1840, -1, -1, -1, -1, -1, -1, -1, -1, 2693, 1850, 1851, 2696, 213, -1, 2699, -1, 2701, 218, -1, 1860, 1861, -1, 1886, -1, -1, 1866, 2253, -1, -1, 2256, -1, -1, -1, -1, 2261, 1876, -1, -1, 2265, -1, -1, -1, 1906, -1, -1, -1, -1, -1, 2129, -1, -1, -1, 2626, -1, -1, -1, -1, -1, 2285, -1, 2634, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1939, -1, 1941, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1957, -1, 1959, -1, -1, -1, 1963, -1, 1965, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, -1, -1, -1, -1, -1, 2004, 2368, -1, 2007, 2008, -1, -1, -1, -1, -1, -1, -1, 2016, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2398, -1, -1, 2255, -1, -1, 2258, -1, -1, -1, -1, -1, -1, -1, 2049, -1, 2268, -1, -1, -1, -1, -1, 2767, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2284, -1, -1, 2287, -1, -1, 2073, 2074, -1, -1, 2294, -1, -1, -1, -1, 2299, 2300, -1, -1, 2796, -1, -1, 2799, -1, -1, -1, -1, -1, -1, -1, 2097, -1, -1, -1, -1, -1, -1, -1, 2105, -1, -1, -1, -1, -1, -1, -1, -1, 2114, -1, -1, -1, -1, 2482, -1, -1, 2122, -1, -1, -1, -1, 2127, -1, -1, -1, 2131, -1, -1, -1, -1, 2136, -1, -1, 2139, 2503, -1, -1, -1, -1, -1, 2146, -1, -1, -1, 2513, -1, -1, -1, -1, -1, 2519, 2520, -1, -1, -1, -1, 2379, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2164, -1, -1, -1, 2408, -1, -1, -1, -1, -1, 2174, -1, -1, -1, 2178, 2179, -1, -1, -1, -1, 4, -1, -1, 2187, 2188, -1, -1, -1, -1, -1, -1, -1, 2196, 2197, -1, 19, -1, -1, 2202, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2212, 2213, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2223, 2224, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2234, -1, -1, 2623, -1, -1, -1, 2481, -1, 2243, -1, 2245, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2643, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, 101, 2522, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2534, -1, -1, -1, -1, -1, -1, 40, -1, -1, 2327, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, -1, 2705, -1, 2707, -1, 2709, -1, 2711, -1, 2713, -1, 2715, -1, -1, -1, 6, -1, 155, 2576, -1, -1, -1, -1, -1, -1, -1, -1, 2585, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2762, -1, -1, 118, -1, -1, -1, -1, -1, -1, 2626, 2627, -1, 2629, -1, -1, -1, -1, 2634, 2635, -1, -1, 218, 2639, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, -1, 2418, -1, 2806, -1, -1, -1, -1, 2665, -1, -1, 2428, -1, -1, -1, -1, -1, -1, -1, -1, 2437, -1, -1, -1, -1, -1, -1, 2684, -1, 2446, -1, -1, 2689, -1, -1, -1, 2453, 193, -1, 2479, -1, -1, -1, -1, -1, 201, 2486, 2464, -1, -1, 2490, 207, 208, 2470, -1, -1, 2473, 213, -1, 2476, -1, -1, 218, -1, -1, -1, -1, 2507, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2767, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2783, -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, 2796, -1, -1, 2799, -1, -1, -1, -1, -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 2595, -1, -1, -1, 2599, 339, -1, -1, -1, 343, 344, 2606, -1, -1, -1, -1, -1, 2612, -1, -1, -1, 2616, -1, -1, 2619, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2655, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, 44, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, 19, -1, -1, 64, 65, -1, 67, 68, 69, 2735, -1, -1, 31, -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, 84, -1, 86, 87, -1, -1, 2755, 2756, -1, -1, -1, 95, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, -1, 69, -1, -1, -1, -1, -1, -1, 18, 19, -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, -1, 2797, 91, 134, -1, -1, -1, 138, -1, -1, 141, -1, 101, -1, -1, 146, -1, 148, -1, 2815, -1, -1, 2818, 154, -1, -1, -1, 58, -1, -1, 161, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 174, -1, -1, -1, 178, 179, 180, -1, -1, 183, 184, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 196, 155, -1, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, 168, 211, 212, 213, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 225, -1, -1, 186, -1, -1, -1, -1, 233, -1, -1, 236, -1, -1, 239, -1, 241, -1, 243, -1, -1, -1, 205, 248, -1, -1, -1, -1, -1, -1, 155, -1, -1, -1, -1, 218, 261, -1, -1, -1, -1, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 282, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 294, -1, 296, -1, -1, -1, -1, -1, 302, -1, -1, 305, 306, -1, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 336, -1, -1, -1, -1, -1, 342, -1, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, 335, -1, -1, -1, -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 20, 21, 22, -1, -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, 49, -1, -1, 52, 48, 49, 55, 19, 52, -1, -1, -1, -1, 62, -1, 59, -1, 66, 62, -1, -1, -1, 66, -1, -1, 74, 75, -1, -1, -1, 74, 75, -1, 82, 83, 19, -1, -1, 82, -1, -1, -1, -1, -1, 56, -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, -1, -1, 108, 109, -1, -1, 112, 108, 109, -1, -1, 112, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, 128, -1, -1, -1, -1, 128, -1, 19, -1, -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, -1, 148, -1, -1, -1, -1, 148, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, -1, 171, -1, -1, -1, 59, 171, -1, -1, -1, -1, -1, -1, -1, -1, -1, 181, -1, -1, -1, -1, -1, 155, -1, 194, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, 155, -1, 222, -1, 224, -1, -1, 222, -1, 229, 230, -1, -1, -1, 229, 230, -1, -1, -1, -1, 56, -1, -1, 243, 244, -1, -1, -1, -1, 244, 213, -1, -1, 253, 254, 218, -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, -1, -1, -1, -1, -1, -1, 213, 279, -1, 281, -1, 218, 279, 101, 281, -1, -1, -1, -1, -1, -1, 293, -1, 295, 291, -1, -1, -1, -1, 301, -1, -1, -1, -1, 301, 155, -1, -1, -1, 274, -1, 161, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, 335, -1, -1, -1, 155, 335, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 283, 161, 101, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, -1, -1, -1, 155, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 41, -1, -1, 44, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, -1, 67, 68, 69, -1, -1, -1, -1, -1, -1, -1, 77, -1, 79, -1, -1, -1, -1, 84, -1, 86, 87, 88, -1, -1, -1, -1, 93, -1, 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 150, 151, -1, -1, 154, -1, -1, -1, 158, -1, -1, 161, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 183, 184, -1, -1, 187, -1, -1, -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 211, 212, -1, -1, -1, -1, -1, -1, 219, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 282, 283, -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, -1, -1, -1, -1, 298, -1, -1, -1, -1, -1, 304, -1, 306, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 342 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { 0, 20, 41, 44, 46, 59, 64, 65, 67, 68, 69, 77, 84, 86, 87, 95, 96, 123, 134, 138, 141, 146, 148, 154, 161, 174, 178, 179, 180, 183, 184, 196, 211, 212, 213, 225, 233, 236, 239, 241, 243, 248, 261, 266, 282, 283, 294, 296, 302, 305, 306, 336, 342, 348, 239, 257, 381, 66, 12, 53, 71, 100, 117, 120, 131, 287, 383, 3, 4, 287, 349, 388, 187, 192, 228, 252, 297, 341, 390, 279, 4, 40, 110, 193, 241, 397, 28, 149, 172, 176, 226, 262, 270, 271, 363, 399, 31, 66, 80, 83, 91, 99, 174, 215, 248, 335, 400, 40, 59, 110, 193, 283, 349, 404, 4, 19, 40, 56, 101, 118, 155, 193, 201, 207, 208, 213, 218, 290, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 339, 343, 344, 351, 360, 361, 362, 406, 33, 407, 351, 29, 44, 46, 76, 84, 139, 191, 207, 208, 214, 216, 241, 306, 350, 141, 408, 41, 44, 46, 65, 67, 68, 69, 77, 79, 84, 86, 87, 88, 93, 95, 122, 138, 150, 151, 154, 158, 161, 183, 184, 187, 196, 211, 212, 219, 241, 243, 266, 282, 283, 291, 298, 304, 306, 342, 409, 83, 99, 455, 19, 44, 77, 84, 94, 95, 101, 122, 138, 154, 162, 183, 218, 266, 277, 306, 458, 351, 88, 115, 185, 199, 255, 296, 306, 464, 16, 26, 111, 122, 157, 204, 217, 467, 227, 485, 5, 66, 88, 136, 296, 342, 351, 486, 5, 487, 20, 57, 223, 236, 297, 503, 64, 66, 182, 286, 522, 66, 202, 338, 343, 345, 523, 39, 193, 228, 287, 349, 360, 362, 524, 5, 296, 306, 351, 527, 70, 168, 240, 249, 528, 88, 503, 61, 277, 300, 535, 193, 287, 349, 536, 26, 111, 122, 204, 217, 538, 50, 99, 133, 289, 553, 554, 4, 37, 47, 74, 148, 186, 228, 249, 284, 300, 376, 4, 122, 203, 555, 287, 349, 557, 16, 23, 237, 239, 361, 558, 227, 562, 287, 349, 563, 0, 22, 48, 49, 62, 108, 109, 222, 224, 301, 382, 5, 59, 349, 384, 263, 5, 4, 287, 349, 385, 5, 32, 276, 386, 121, 349, 387, 121, 349, 389, 349, 192, 245, 394, 187, 297, 340, 341, 349, 393, 351, 135, 175, 392, 147, 177, 349, 391, 78, 171, 245, 396, 5, 349, 4, 241, 398, 349, 349, 142, 200, 248, 401, 5, 360, 5, 224, 402, 4, 17, 5, 5, 5, 4, 349, 9, 10, 11, 349, 356, 357, 358, 359, 349, 349, 40, 110, 193, 349, 405, 349, 193, 360, 362, 349, 35, 106, 125, 126, 127, 132, 145, 152, 163, 275, 364, 349, 4, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 116, 66, 53, 71, 88, 100, 117, 120, 131, 173, 410, 117, 412, 187, 192, 228, 252, 297, 340, 341, 349, 413, 414, 279, 417, 168, 418, 168, 176, 420, 31, 65, 66, 69, 91, 168, 186, 205, 266, 335, 360, 422, 349, 362, 426, 59, 283, 360, 427, 274, 360, 362, 428, 33, 429, 360, 362, 430, 4, 360, 362, 431, 45, 59, 81, 100, 116, 119, 143, 144, 198, 206, 263, 264, 335, 435, 210, 299, 441, 5, 89, 6, 88, 119, 433, 5, 65, 362, 432, 16, 503, 66, 182, 286, 442, 66, 228, 443, 278, 61, 277, 300, 444, 98, 124, 159, 251, 352, 445, 131, 235, 446, 37, 47, 74, 148, 186, 249, 300, 447, 362, 89, 16, 195, 452, 352, 454, 360, 456, 72, 459, 31, 460, 44, 87, 191, 461, 148, 215, 254, 292, 462, 360, 18, 58, 114, 283, 360, 463, 4, 192, 466, 5, 4, 6, 119, 349, 4, 5, 241, 468, 5, 470, 5, 116, 191, 241, 264, 471, 93, 110, 187, 484, 5, 482, 5, 264, 483, 4, 5, 351, 351, 349, 349, 5, 4, 5, 60, 66, 73, 75, 80, 83, 89, 99, 105, 113, 128, 148, 164, 173, 174, 194, 215, 228, 230, 243, 248, 254, 261, 279, 292, 293, 295, 335, 488, 5, 4, 349, 5, 349, 40, 110, 349, 526, 351, 349, 360, 362, 525, 349, 364, 349, 4, 361, 54, 90, 137, 241, 529, 4, 4, 349, 148, 254, 530, 5, 360, 4, 40, 110, 349, 537, 349, 97, 61, 119, 241, 267, 539, 119, 552, 61, 116, 119, 155, 191, 238, 241, 264, 267, 278, 541, 542, 61, 119, 267, 551, 5, 4, 34, 107, 202, 534, 66, 351, 377, 66, 351, 378, 66, 351, 379, 13, 188, 533, 349, 349, 40, 110, 193, 222, 349, 380, 349, 264, 4, 349, 349, 4, 561, 4, 281, 559, 4, 281, 560, 4, 364, 121, 349, 564, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 4, 5, 349, 12, 349, 349, 349, 30, 94, 162, 245, 250, 395, 4, 349, 349, 349, 349, 4, 4, 349, 349, 349, 349, 5, 364, 4, 502, 510, 4, 4, 360, 349, 349, 356, 358, 358, 360, 349, 349, 349, 349, 349, 349, 349, 360, 362, 359, 349, 349, 359, 349, 5, 263, 103, 187, 411, 192, 245, 415, 168, 78, 171, 245, 416, 4, 419, 4, 421, 66, 91, 335, 423, 192, 424, 176, 425, 168, 364, 349, 360, 349, 360, 360, 364, 364, 364, 360, 364, 349, 360, 4, 438, 4, 362, 436, 195, 4, 165, 306, 437, 195, 360, 4, 360, 440, 5, 5, 4, 195, 349, 4, 5, 60, 66, 113, 128, 140, 146, 148, 153, 205, 224, 228, 230, 253, 254, 261, 279, 335, 497, 362, 66, 448, 66, 449, 66, 450, 222, 451, 349, 5, 223, 453, 361, 364, 5, 360, 360, 360, 4, 351, 4, 4, 195, 349, 14, 15, 61, 189, 190, 258, 267, 268, 299, 87, 5, 5, 14, 15, 61, 189, 190, 258, 267, 268, 272, 299, 87, 155, 161, 361, 474, 478, 87, 155, 5, 472, 4, 4, 14, 61, 189, 258, 267, 299, 5, 5, 4, 349, 361, 20, 21, 22, 48, 49, 52, 55, 62, 66, 74, 75, 82, 83, 99, 105, 108, 109, 112, 128, 148, 171, 194, 222, 224, 229, 230, 243, 244, 253, 254, 279, 281, 293, 295, 301, 335, 66, 80, 89, 99, 128, 148, 194, 230, 254, 293, 295, 4, 30, 160, 210, 235, 491, 5, 63, 104, 232, 246, 247, 337, 338, 496, 99, 489, 17, 40, 110, 193, 495, 4, 5, 17, 209, 288, 349, 254, 496, 504, 122, 496, 505, 36, 40, 110, 129, 193, 287, 349, 506, 360, 351, 91, 99, 105, 124, 148, 156, 194, 202, 243, 254, 269, 509, 40, 110, 193, 5, 280, 17, 209, 288, 513, 281, 351, 514, 5, 99, 105, 296, 17, 17, 4, 349, 349, 349, 349, 349, 364, 349, 349, 359, 349, 4, 364, 40, 110, 193, 259, 531, 40, 110, 193, 259, 532, 4, 97, 5, 5, 87, 4, 5, 5, 87, 5, 542, 61, 119, 155, 267, 546, 61, 119, 267, 550, 87, 155, 61, 119, 267, 544, 4, 61, 119, 267, 543, 5, 5, 4, 5, 5, 5, 349, 349, 349, 349, 349, 349, 4, 349, 556, 349, 349, 6, 361, 4, 5, 4, 4, 5, 4, 97, 256, 365, 349, 349, 12, 349, 349, 349, 349, 349, 349, 349, 349, 349, 5, 12, 349, 349, 12, 4, 12, 4, 349, 349, 349, 360, 4, 55, 66, 92, 128, 279, 281, 335, 507, 508, 509, 520, 521, 4, 4, 364, 364, 349, 349, 349, 360, 349, 359, 349, 349, 5, 5, 349, 362, 349, 360, 360, 349, 364, 365, 365, 365, 364, 359, 349, 364, 349, 130, 242, 353, 439, 165, 5, 4, 364, 360, 4, 5, 4, 4, 349, 434, 349, 20, 21, 22, 48, 49, 52, 59, 62, 66, 74, 75, 82, 108, 109, 112, 128, 148, 171, 181, 222, 229, 230, 244, 254, 279, 281, 291, 301, 335, 66, 128, 153, 230, 279, 30, 160, 210, 235, 498, 349, 20, 205, 349, 499, 17, 349, 253, 509, 253, 205, 349, 500, 281, 501, 17, 98, 349, 349, 5, 365, 56, 360, 4, 5, 465, 349, 5, 5, 5, 155, 184, 370, 370, 164, 260, 368, 4, 4, 5, 5, 469, 265, 265, 5, 5, 5, 17, 157, 369, 369, 368, 4, 4, 368, 5, 5, 473, 161, 334, 361, 477, 5, 476, 5, 5, 480, 5, 481, 5, 14, 15, 61, 189, 190, 258, 267, 268, 272, 299, 4, 4, 5, 5, 370, 368, 4, 5, 5, 364, 82, 150, 220, 221, 234, 273, 373, 7, 8, 349, 355, 235, 235, 235, 105, 40, 66, 99, 105, 110, 128, 148, 164, 194, 230, 243, 254, 281, 293, 295, 296, 335, 490, 235, 5, 27, 166, 235, 277, 135, 105, 22, 49, 52, 82, 109, 112, 224, 253, 22, 49, 52, 55, 82, 109, 112, 224, 253, 279, 40, 235, 235, 105, 5, 209, 27, 222, 36, 129, 287, 349, 257, 263, 239, 360, 362, 509, 40, 222, 277, 239, 209, 5, 5, 243, 27, 222, 4, 5, 5, 209, 36, 129, 287, 349, 509, 209, 351, 4, 4, 349, 5, 299, 22, 27, 48, 49, 51, 52, 62, 74, 75, 82, 85, 102, 108, 109, 112, 171, 224, 229, 244, 253, 280, 281, 301, 345, 492, 349, 349, 349, 349, 349, 496, 360, 5, 4, 5, 349, 349, 360, 362, 349, 360, 351, 349, 349, 496, 5, 349, 349, 351, 5, 17, 5, 5, 349, 349, 359, 349, 349, 349, 349, 110, 349, 349, 110, 4, 42, 43, 169, 170, 197, 375, 375, 61, 119, 267, 540, 375, 5, 61, 119, 267, 545, 5, 5, 61, 119, 267, 547, 4, 5, 5, 4, 61, 119, 267, 549, 61, 119, 267, 548, 5, 5, 4, 5, 5, 4, 375, 375, 375, 349, 349, 349, 349, 349, 4, 349, 360, 349, 361, 364, 5, 5, 12, 349, 360, 362, 349, 12, 349, 349, 349, 59, 349, 6, 4, 349, 349, 364, 46, 266, 403, 346, 346, 346, 346, 346, 346, 346, 508, 346, 5, 6, 349, 4, 4, 4, 360, 349, 349, 349, 349, 364, 4, 360, 365, 352, 352, 359, 349, 4, 365, 349, 38, 38, 4, 362, 5, 24, 25, 97, 366, 349, 4, 349, 5, 82, 150, 220, 221, 234, 273, 360, 362, 235, 235, 235, 21, 235, 360, 362, 235, 27, 166, 235, 277, 135, 21, 235, 235, 235, 21, 235, 27, 167, 222, 167, 257, 263, 167, 222, 285, 509, 167, 222, 277, 4, 243, 27, 167, 222, 509, 205, 349, 82, 150, 220, 221, 234, 273, 349, 349, 349, 349, 349, 195, 349, 349, 20, 231, 457, 4, 4, 349, 370, 370, 370, 4, 370, 370, 370, 14, 15, 61, 189, 190, 258, 267, 268, 299, 369, 370, 370, 370, 370, 370, 4, 370, 370, 4, 369, 14, 15, 61, 189, 190, 258, 267, 268, 299, 5, 475, 5, 479, 5, 5, 14, 15, 61, 189, 190, 258, 267, 268, 272, 299, 5, 14, 15, 61, 189, 190, 258, 267, 268, 272, 299, 5, 14, 15, 61, 189, 190, 258, 267, 268, 272, 299, 14, 15, 61, 189, 190, 258, 267, 268, 299, 265, 5, 5, 5, 369, 369, 368, 4, 4, 368, 5, 4, 4, 370, 370, 4, 370, 370, 5, 351, 360, 362, 5, 349, 349, 5, 349, 5, 355, 105, 194, 243, 105, 194, 243, 5, 349, 351, 5, 349, 360, 351, 5, 355, 235, 235, 21, 235, 21, 235, 235, 21, 235, 303, 303, 4, 4, 4, 490, 4, 4, 4, 303, 303, 4, 5, 4, 349, 5, 349, 5, 355, 351, 360, 362, 360, 362, 349, 27, 48, 51, 62, 85, 102, 345, 371, 4, 349, 364, 359, 351, 360, 362, 360, 349, 351, 351, 360, 362, 360, 362, 349, 351, 349, 5, 349, 222, 222, 349, 349, 222, 349, 222, 349, 349, 510, 349, 222, 222, 349, 349, 349, 349, 349, 349, 349, 349, 5, 299, 349, 493, 349, 349, 222, 349, 349, 349, 349, 360, 364, 5, 360, 360, 349, 349, 364, 359, 349, 349, 349, 360, 349, 349, 5, 349, 349, 349, 349, 5, 5, 4, 375, 5, 5, 4, 4, 4, 5, 5, 4, 4, 5, 5, 4, 5, 5, 4, 349, 349, 360, 349, 364, 349, 360, 362, 349, 364, 349, 349, 349, 349, 349, 5, 349, 6, 6, 349, 349, 4, 490, 5, 4, 5, 5, 5, 4, 351, 360, 360, 349, 364, 176, 363, 349, 363, 365, 364, 360, 349, 349, 4, 352, 349, 352, 349, 4, 360, 5, 5, 5, 5, 360, 364, 360, 362, 360, 362, 360, 362, 360, 362, 360, 362, 364, 360, 362, 360, 362, 360, 362, 360, 362, 360, 362, 360, 362, 360, 362, 360, 362, 360, 360, 362, 349, 360, 360, 362, 360, 362, 360, 360, 362, 360, 360, 362, 360, 5, 5, 5, 5, 360, 349, 349, 4, 349, 5, 4, 349, 370, 5, 5, 5, 368, 4, 4, 5, 370, 369, 4, 370, 5, 5, 5, 369, 369, 368, 4, 4, 5, 14, 15, 61, 189, 190, 258, 267, 268, 299, 14, 15, 61, 189, 190, 258, 267, 268, 299, 14, 15, 61, 189, 190, 258, 267, 268, 299, 265, 5, 5, 5, 369, 369, 368, 4, 4, 368, 5, 265, 5, 5, 5, 369, 369, 368, 4, 4, 368, 5, 265, 5, 5, 5, 369, 369, 368, 4, 4, 368, 5, 5, 5, 5, 369, 369, 368, 4, 4, 5, 369, 4, 4, 369, 4, 4, 370, 5, 364, 360, 349, 349, 360, 349, 5, 355, 5, 360, 362, 351, 5, 360, 362, 364, 5, 355, 349, 349, 349, 349, 349, 349, 349, 349, 349, 4, 4, 5, 4, 4, 349, 360, 349, 5, 355, 351, 364, 359, 364, 349, 349, 359, 359, 364, 359, 364, 349, 364, 359, 364, 359, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 360, 5, 349, 349, 349, 349, 4, 4, 364, 365, 4, 494, 364, 364, 359, 349, 4, 364, 375, 375, 375, 349, 349, 349, 364, 349, 359, 349, 349, 12, 5, 5, 4, 6, 349, 349, 4, 5, 4, 364, 364, 360, 349, 349, 365, 366, 349, 5, 349, 362, 5, 5, 5, 5, 364, 366, 366, 366, 364, 366, 365, 366, 366, 364, 366, 366, 366, 364, 366, 366, 364, 360, 366, 364, 366, 366, 364, 366, 364, 5, 5, 5, 5, 364, 4, 362, 5, 349, 4, 370, 369, 4, 369, 5, 5, 5, 369, 369, 368, 4, 4, 5, 5, 5, 5, 369, 369, 368, 4, 4, 5, 5, 5, 5, 369, 369, 368, 4, 4, 5, 369, 370, 370, 370, 370, 370, 4, 370, 370, 4, 369, 369, 370, 370, 370, 370, 370, 4, 370, 370, 4, 369, 369, 4, 4, 369, 4, 369, 369, 4, 4, 4, 361, 366, 4, 360, 362, 366, 349, 360, 4, 366, 366, 360, 4, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 360, 362, 366, 349, 360, 4, 359, 359, 359, 349, 360, 362, 359, 349, 359, 359, 360, 360, 362, 359, 349, 359, 349, 349, 349, 349, 349, 349, 355, 349, 349, 349, 355, 349, 349, 349, 349, 355, 349, 349, 349, 349, 349, 349, 364, 349, 299, 354, 355, 349, 349, 365, 351, 4, 4, 365, 349, 359, 349, 59, 349, 5, 5, 4, 349, 4, 363, 5, 366, 5, 4, 5, 360, 5, 365, 366, 365, 365, 365, 4, 5, 360, 5, 5, 349, 370, 369, 370, 370, 370, 370, 370, 4, 370, 370, 369, 4, 369, 370, 370, 370, 370, 370, 4, 370, 370, 369, 370, 369, 4, 370, 370, 369, 4, 370, 369, 4, 369, 369, 364, 360, 362, 366, 4, 364, 349, 364, 349, 349, 349, 366, 4, 364, 349, 359, 366, 349, 359, 366, 366, 360, 355, 349, 4, 372, 372, 349, 349, 372, 355, 372, 510, 360, 355, 372, 372, 349, 349, 355, 349, 349, 349, 349, 349, 359, 349, 5, 510, 349, 372, 351, 511, 512, 5, 351, 5, 349, 5, 4, 6, 349, 5, 32, 276, 374, 360, 5, 374, 360, 349, 369, 370, 369, 369, 370, 370, 369, 370, 369, 369, 349, 366, 360, 362, 360, 349, 360, 349, 360, 362, 360, 349, 360, 366, 4, 510, 510, 354, 349, 510, 4, 510, 364, 4, 510, 510, 354, 349, 4, 510, 510, 349, 360, 510, 510, 510, 511, 517, 518, 509, 515, 516, 5, 5, 6, 4, 187, 297, 340, 341, 349, 367, 360, 360, 4, 370, 370, 370, 370, 361, 366, 366, 349, 366, 4, 366, 366, 349, 366, 349, 510, 510, 4, 349, 510, 349, 510, 4, 349, 510, 364, 517, 519, 520, 346, 516, 5, 5, 4, 349, 364, 364, 366, 4, 360, 362, 4, 355, 354, 349, 349, 354, 349, 360, 520, 351, 5, 5, 349, 374, 374, 5, 360, 362, 364, 360, 362, 510, 349, 4, 510, 349, 366, 5, 5, 364, 364, 4, 510, 4, 510, 354, 354, 510, 510 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, frFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; frFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, frFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; frFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, frFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; frFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, frFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; frFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, frFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, frFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; frFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 5: #line 451 "frame/parser.Y" {fr->bgColorCmd((yyvsp[(3) - (3)].str));;} break; case 7: #line 453 "frame/parser.Y" {fr->centerCmd();;} break; case 8: #line 454 "frame/parser.Y" {fr->clearCmd();;} break; case 10: #line 456 "frame/parser.Y" {fr->colorbarTagCmd((yyvsp[(3) - (3)].str));;} break; case 17: #line 463 "frame/parser.Y" {fr->DATASECCmd((yyvsp[(2) - (2)].integer));;} break; case 22: #line 468 "frame/parser.Y" {fr->hideCmd();;} break; case 23: #line 469 "frame/parser.Y" {fr->highliteCmd((yyvsp[(2) - (2)].integer));;} break; case 25: #line 471 "frame/parser.Y" {fr->irafAlignCmd((yyvsp[(3) - (3)].integer));;} break; case 32: #line 478 "frame/parser.Y" {fr->nanColorCmd((yyvsp[(3) - (3)].str));;} break; case 36: #line 482 "frame/parser.Y" {fr->queryCursorCmd();;} break; case 38: #line 484 "frame/parser.Y" {fr->resetCmd();;} break; case 43: #line 489 "frame/parser.Y" {fr->showCmd();;} break; case 45: #line 491 "frame/parser.Y" {fr->threadsCmd((yyvsp[(2) - (2)].integer));;} break; case 47: #line 493 "frame/parser.Y" {fr->unloadFitsCmd();;} break; case 49: #line 495 "frame/parser.Y" {fr->msg("Frame 1.0");;} break; case 54: #line 502 "frame/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 55: #line 503 "frame/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 56: #line 506 "frame/parser.Y" {yydebug=1;;} break; case 57: #line 507 "frame/parser.Y" {yydebug=0;;} break; case 58: #line 508 "frame/parser.Y" {DebugAST=(yyvsp[(2) - (2)].integer);;} break; case 59: #line 509 "frame/parser.Y" {DebugMosaic=(yyvsp[(2) - (2)].integer);;} break; case 60: #line 510 "frame/parser.Y" {yydebug=(yyvsp[(2) - (2)].integer);;} break; case 61: #line 511 "frame/parser.Y" {DebugPerf=(yyvsp[(2) - (2)].integer);;} break; case 62: #line 512 "frame/parser.Y" {DebugWCS=(yyvsp[(2) - (2)].integer);;} break; case 63: #line 513 "frame/parser.Y" {DebugBin=(yyvsp[(2) - (2)].integer);;} break; case 64: #line 514 "frame/parser.Y" {DebugBlock=(yyvsp[(2) - (2)].integer);;} break; case 65: #line 515 "frame/parser.Y" {DebugCompress=(yyvsp[(2) - (2)].integer);;} break; case 66: #line 516 "frame/parser.Y" {DebugCrop=(yyvsp[(2) - (2)].integer);;} break; case 67: #line 517 "frame/parser.Y" {DebugGZ=(yyvsp[(2) - (2)].integer);;} break; case 68: #line 518 "frame/parser.Y" {DebugRGB=(yyvsp[(2) - (2)].integer);;} break; case 69: #line 521 "frame/parser.Y" {(yyval.integer)=((yyvsp[(1) - (1)].integer) ? 1 : 0);;} break; case 70: #line 523 "frame/parser.Y" {(yyval.integer)=1;;} break; case 71: #line 524 "frame/parser.Y" {(yyval.integer)=1;;} break; case 72: #line 525 "frame/parser.Y" {(yyval.integer)=1;;} break; case 73: #line 526 "frame/parser.Y" {(yyval.integer)=1;;} break; case 74: #line 528 "frame/parser.Y" {(yyval.integer)=0;;} break; case 75: #line 529 "frame/parser.Y" {(yyval.integer)=0;;} break; case 76: #line 530 "frame/parser.Y" {(yyval.integer)=0;;} break; case 77: #line 531 "frame/parser.Y" {(yyval.integer)=0;;} break; case 78: #line 534 "frame/parser.Y" {(yyval.integer) = Base::DEFAULT;;} break; case 79: #line 535 "frame/parser.Y" {(yyval.integer) = Base::DEFAULT;;} break; case 80: #line 536 "frame/parser.Y" {(yyval.integer) = Base::FIXED;;} break; case 81: #line 537 "frame/parser.Y" {(yyval.integer) = Base::SCIENTIFIC;;} break; case 82: #line 538 "frame/parser.Y" {(yyval.integer) = Base::INTEGER;;} break; case 83: #line 541 "frame/parser.Y" {(yyval.integer) = Base::ROOTBASE;;} break; case 84: #line 542 "frame/parser.Y" {(yyval.integer) = Base::ROOTBASE;;} break; case 85: #line 543 "frame/parser.Y" {(yyval.integer) = Base::FULLBASE;;} break; case 86: #line 544 "frame/parser.Y" {(yyval.integer) = Base::ROOT;;} break; case 87: #line 545 "frame/parser.Y" {(yyval.integer) = Base::FULL;;} break; case 88: #line 548 "frame/parser.Y" {(yyval.real) = 0;;} break; case 89: #line 549 "frame/parser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 90: #line 552 "frame/parser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 91: #line 553 "frame/parser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 92: #line 554 "frame/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 93: #line 557 "frame/parser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 94: #line 560 "frame/parser.Y" {(yyval.real) = parseHMSStr((yyvsp[(1) - (1)].str));;} break; case 95: #line 563 "frame/parser.Y" {(yyval.real) = parseDMSStr((yyvsp[(1) - (1)].str));;} break; case 96: #line 567 "frame/parser.Y" { Vector r; if (currentSky == Coord::GALACTIC || currentSky == Coord::ECLIPTIC) r = Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)); else r = Vector((yyvsp[(1) - (2)].real)*360./24.,(yyvsp[(2) - (2)].real)); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 97: #line 579 "frame/parser.Y" { Vector r = Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 98: #line 586 "frame/parser.Y" { Vector r = Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 99: #line 593 "frame/parser.Y" { (yyval.vector)[0] = (yyvsp[(1) - (2)].real); (yyval.vector)[1] = (yyvsp[(2) - (2)].real); (yyval.vector)[2] = 1; ;} break; case 100: #line 600 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::IMAGE;;} break; case 101: #line 601 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::PHYSICAL;;} break; case 102: #line 602 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::DETECTOR;;} break; case 103: #line 603 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::AMPLIFIER;;} break; case 104: #line 604 "frame/parser.Y" {(yyval.integer) = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer);;} break; case 105: #line 607 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCS;;} break; case 106: #line 608 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSA;;} break; case 107: #line 609 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSB;;} break; case 108: #line 610 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSC;;} break; case 109: #line 611 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSD;;} break; case 110: #line 612 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSE;;} break; case 111: #line 613 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSF;;} break; case 112: #line 614 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSG;;} break; case 113: #line 615 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSH;;} break; case 114: #line 616 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSI;;} break; case 115: #line 617 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSJ;;} break; case 116: #line 618 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSK;;} break; case 117: #line 619 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSL;;} break; case 118: #line 620 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSM;;} break; case 119: #line 621 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSN;;} break; case 120: #line 622 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSO;;} break; case 121: #line 623 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSP;;} break; case 122: #line 624 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSQ;;} break; case 123: #line 625 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSR;;} break; case 124: #line 626 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSS;;} break; case 125: #line 627 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCST;;} break; case 126: #line 628 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSU;;} break; case 127: #line 629 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSV;;} break; case 128: #line 630 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSW;;} break; case 129: #line 631 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSX;;} break; case 130: #line 632 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSY;;} break; case 131: #line 633 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCSZ;;} break; case 132: #line 634 "frame/parser.Y" {(yyval.integer) = currentCoord = Coord::WCS0;;} break; case 133: #line 637 "frame/parser.Y" {(yyval.integer) = Coord::CANVAS;;} break; case 134: #line 638 "frame/parser.Y" {(yyval.integer) = Coord::PANNER;;} break; case 135: #line 641 "frame/parser.Y" {(yyval.integer) = FrScale::LINEARSCALE;;} break; case 136: #line 642 "frame/parser.Y" {(yyval.integer) = FrScale::LOGSCALE;;} break; case 137: #line 643 "frame/parser.Y" {(yyval.integer) = FrScale::POWSCALE;;} break; case 138: #line 644 "frame/parser.Y" {(yyval.integer) = FrScale::SQRTSCALE;;} break; case 139: #line 645 "frame/parser.Y" {(yyval.integer) = FrScale::SQUAREDSCALE;;} break; case 140: #line 646 "frame/parser.Y" {(yyval.integer) = FrScale::ASINHSCALE;;} break; case 141: #line 647 "frame/parser.Y" {(yyval.integer) = FrScale::SINHSCALE;;} break; case 142: #line 648 "frame/parser.Y" {(yyval.integer) = FrScale::HISTEQUSCALE;;} break; case 143: #line 651 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK5;;} break; case 144: #line 652 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK4;;} break; case 145: #line 653 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK4_NO_E;;} break; case 146: #line 654 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK4;;} break; case 147: #line 655 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK5;;} break; case 148: #line 656 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::FK5;;} break; case 149: #line 657 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::ICRS;;} break; case 150: #line 658 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::GALACTIC;;} break; case 151: #line 659 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::SUPERGALACTIC;;} break; case 152: #line 660 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::ECLIPTIC;;} break; case 153: #line 661 "frame/parser.Y" {(yyval.integer) = currentSky = Coord::HELIOECLIPTIC;;} break; case 154: #line 664 "frame/parser.Y" {(yyval.integer)=Coord::DEGREES;;} break; case 155: #line 665 "frame/parser.Y" {(yyval.integer)=Coord::DEGREES;;} break; case 156: #line 666 "frame/parser.Y" {(yyval.integer)=Coord::SEXAGESIMAL;;} break; case 157: #line 669 "frame/parser.Y" {(yyval.integer)=Coord::DEGREE;;} break; case 158: #line 670 "frame/parser.Y" {(yyval.integer)=Coord::DEGREE;;} break; case 159: #line 671 "frame/parser.Y" {(yyval.integer)=Coord::ARCMIN;;} break; case 160: #line 672 "frame/parser.Y" {(yyval.integer)=Coord::ARCSEC;;} break; case 161: #line 675 "frame/parser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 162: #line 676 "frame/parser.Y" {(yyval.real) = FrScale::MINMAX;;} break; case 163: #line 677 "frame/parser.Y" {(yyval.real) = FrScale::ZSCALE;;} break; case 164: #line 678 "frame/parser.Y" {(yyval.real) = FrScale::ZMAX;;} break; case 165: #line 679 "frame/parser.Y" {(yyval.real) = FrScale::USERCLIP;;} break; case 166: #line 682 "frame/parser.Y" {(yyval.integer) = Base::SHMID;;} break; case 167: #line 683 "frame/parser.Y" {(yyval.integer) = Base::SHMID;;} break; case 168: #line 684 "frame/parser.Y" {(yyval.integer) = Base::KEY;;} break; case 169: #line 687 "frame/parser.Y" {(yyval.integer) = Base::LOADALL;;} break; case 170: #line 688 "frame/parser.Y" {(yyval.integer) = Base::LOADALL;;} break; case 171: #line 689 "frame/parser.Y" {(yyval.integer) = Base::INCR;;} break; case 172: #line 692 "frame/parser.Y" {(yyval.integer) = Base::IMG;;} break; case 173: #line 693 "frame/parser.Y" {(yyval.integer) = Base::IMG;;} break; case 174: #line 694 "frame/parser.Y" {(yyval.integer) = Base::MASK;;} break; case 175: #line 697 "frame/parser.Y" {(yyval.integer) = Point::CIRCLE;;} break; case 176: #line 698 "frame/parser.Y" {(yyval.integer) = Point::CIRCLE;;} break; case 177: #line 699 "frame/parser.Y" {(yyval.integer) = Point::BOX;;} break; case 178: #line 700 "frame/parser.Y" {(yyval.integer) = Point::DIAMOND;;} break; case 179: #line 701 "frame/parser.Y" {(yyval.integer) = Point::CROSS;;} break; case 180: #line 702 "frame/parser.Y" {(yyval.integer) = Point::EX;;} break; case 181: #line 703 "frame/parser.Y" {(yyval.integer) = Point::ARROW;;} break; case 182: #line 704 "frame/parser.Y" {(yyval.integer) = Point::BOXCIRCLE;;} break; case 183: #line 707 "frame/parser.Y" {(yyval.integer) = POINTSIZE;;} break; case 184: #line 708 "frame/parser.Y" {(yyval.integer) = (yyvsp[(1) - (1)].integer);;} break; case 185: #line 711 "frame/parser.Y" {(yyval.integer) = Marker::PANDA;;} break; case 186: #line 712 "frame/parser.Y" {(yyval.integer) = Marker::HISTOGRAM;;} break; case 187: #line 713 "frame/parser.Y" {(yyval.integer) = Marker::PLOT2D;;} break; case 188: #line 714 "frame/parser.Y" {(yyval.integer) = Marker::PLOT3D;;} break; case 189: #line 715 "frame/parser.Y" {(yyval.integer) = Marker::RADIAL;;} break; case 190: #line 716 "frame/parser.Y" {(yyval.integer) = Marker::STATS;;} break; case 191: #line 719 "frame/parser.Y" {(yyval.integer) = Marker::AVERAGE;;} break; case 192: #line 720 "frame/parser.Y" {(yyval.integer) = Marker::AVERAGE;;} break; case 193: #line 721 "frame/parser.Y" {(yyval.integer) = Marker::SUM;;} break; case 194: #line 724 "frame/parser.Y" {(yyval.integer) = FitsFile::NATIVE;;} break; case 195: #line 725 "frame/parser.Y" {(yyval.integer) = FitsFile::NATIVE;;} break; case 196: #line 726 "frame/parser.Y" {(yyval.integer) = FitsFile::BIG;;} break; case 197: #line 727 "frame/parser.Y" {(yyval.integer) = FitsFile::BIG;;} break; case 198: #line 728 "frame/parser.Y" {(yyval.integer) = FitsFile::LITTLE;;} break; case 199: #line 729 "frame/parser.Y" {(yyval.integer) = FitsFile::LITTLE;;} break; case 204: #line 736 "frame/parser.Y" {fr->set3dRenderMethodCmd((yyvsp[(2) - (2)].integer));;} break; case 205: #line 737 "frame/parser.Y" {fr->set3dRenderBackgroundCmd((yyvsp[(2) - (2)].integer));;} break; case 206: #line 738 "frame/parser.Y" {fr->set3dScaleCmd((yyvsp[(2) - (2)].real));;} break; case 207: #line 739 "frame/parser.Y" {fr->set3dPreserveCmd();;} break; case 208: #line 741 "frame/parser.Y" {/* needed for compatibility with old version of backup */;} break; case 209: #line 744 "frame/parser.Y" {fr->set3dBorderCmd((yyvsp[(1) - (1)].integer));;} break; case 210: #line 745 "frame/parser.Y" {fr->set3dBorderColorCmd((yyvsp[(2) - (2)].str));;} break; case 211: #line 748 "frame/parser.Y" {fr->set3dCompassCmd((yyvsp[(1) - (1)].integer));;} break; case 212: #line 749 "frame/parser.Y" {fr->set3dCompassColorCmd((yyvsp[(2) - (2)].str));;} break; case 213: #line 752 "frame/parser.Y" {fr->set3dHighliteCmd((yyvsp[(1) - (1)].integer));;} break; case 214: #line 753 "frame/parser.Y" {fr->set3dHighliteColorCmd((yyvsp[(2) - (2)].str));;} break; case 215: #line 756 "frame/parser.Y" {fr->set3dViewCmd((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real));;} break; case 216: #line 758 "frame/parser.Y" {fr->set3dViewPointCmd(Vector3d((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 217: #line 759 "frame/parser.Y" {fr->view3dBeginCmd((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 218: #line 760 "frame/parser.Y" {fr->view3dMotionCmd((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 219: #line 761 "frame/parser.Y" {fr->view3dEndCmd((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 220: #line 764 "frame/parser.Y" {fr->analysisMarkersResetCmd();;} break; case 222: #line 769 "frame/parser.Y" {fr->analysisMarkersSelectCmd("circle", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 223: #line 771 "frame/parser.Y" {fr->analysisMarkersSelectCmd("ellipse", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 224: #line 773 "frame/parser.Y" {fr->analysisMarkersSelectCmd("box", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 225: #line 775 "frame/parser.Y" {fr->analysisMarkersSelectCmd("polygon", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 226: #line 777 "frame/parser.Y" {fr->analysisMarkersSelectCmd("point", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 227: #line 779 "frame/parser.Y" {fr->analysisMarkersSelectCmd("vector", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 228: #line 781 "frame/parser.Y" {fr->analysisMarkersSelectCmd("annulus", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 229: #line 783 "frame/parser.Y" {fr->analysisMarkersSelectCmd("ellipseannulus", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 230: #line 785 "frame/parser.Y" {fr->analysisMarkersSelectCmd("boxannulus", fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::CANVAS));;} break; case 232: #line 789 "frame/parser.Y" {fr->binColsCmd((yyvsp[(2) - (4)].str),(yyvsp[(3) - (4)].str),(yyvsp[(4) - (4)].str));;} break; case 233: #line 790 "frame/parser.Y" {fr->binDepthCmd((yyvsp[(2) - (2)].integer));;} break; case 236: #line 793 "frame/parser.Y" {fr->binBufferSizeCmd((yyvsp[(3) - (3)].integer));;} break; case 238: #line 795 "frame/parser.Y" {fr->binFilterCmd((yyvsp[(2) - (2)].str));;} break; case 239: #line 798 "frame/parser.Y" {fr->binAboutCmd();;} break; case 240: #line 799 "frame/parser.Y" {fr->binAboutCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 241: #line 802 "frame/parser.Y" {fr->binFactorCmd(Vector((yyvsp[(1) - (1)].real),(yyvsp[(1) - (1)].real)));;} break; case 242: #line 803 "frame/parser.Y" {fr->binFactorCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 243: #line 805 "frame/parser.Y" {fr->binFactorAboutCmd(Vector((yyvsp[(1) - (4)].real),(yyvsp[(1) - (4)].real)), Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 244: #line 807 "frame/parser.Y" {fr->binFactorAboutCmd(Vector((yyvsp[(1) - (5)].real),(yyvsp[(2) - (5)].real)), Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)));;} break; case 245: #line 808 "frame/parser.Y" {fr->binFactorToCmd(Vector((yyvsp[(2) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 246: #line 809 "frame/parser.Y" {fr->binFactorToCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 247: #line 811 "frame/parser.Y" {fr->binFactorToAboutCmd(Vector((yyvsp[(2) - (5)].real),(yyvsp[(2) - (5)].real)), Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)));;} break; case 248: #line 813 "frame/parser.Y" {fr->binFactorToAboutCmd(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)), Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 249: #line 816 "frame/parser.Y" {fr->binFunctionCmd(FitsHist::AVERAGE);;} break; case 250: #line 817 "frame/parser.Y" {fr->binFunctionCmd(FitsHist::SUM);;} break; case 251: #line 820 "frame/parser.Y" {fr->binToFitCmd();;} break; case 252: #line 822 "frame/parser.Y" {fr->binCmd(Vector((yyvsp[(1) - (7)].real),(yyvsp[(2) - (7)].real)), (yyvsp[(5) - (7)].str), (yyvsp[(6) - (7)].str), (yyvsp[(7) - (7)].str));;} break; case 253: #line 825 "frame/parser.Y" {fr->binCmd(Vector((yyvsp[(1) - (11)].real),(yyvsp[(2) - (11)].real)), (yyvsp[(3) - (11)].integer), Vector((yyvsp[(4) - (11)].real),(yyvsp[(5) - (11)].real)), (yyvsp[(8) - (11)].str), (yyvsp[(9) - (11)].str), (yyvsp[(10) - (11)].str), (yyvsp[(11) - (11)].str));;} break; case 254: #line 827 "frame/parser.Y" {fr->binCmd(Vector((yyvsp[(1) - (8)].real),(yyvsp[(2) - (8)].real)), Vector((yyvsp[(4) - (8)].real),(yyvsp[(5) - (8)].real)), (yyvsp[(6) - (8)].str), (yyvsp[(7) - (8)].str), (yyvsp[(8) - (8)].str));;} break; case 255: #line 830 "frame/parser.Y" {fr->binCmd(Vector((yyvsp[(1) - (12)].real),(yyvsp[(2) - (12)].real)), (yyvsp[(3) - (12)].integer), Vector((yyvsp[(4) - (12)].real),(yyvsp[(5) - (12)].real)), Vector((yyvsp[(7) - (12)].real),(yyvsp[(8) - (12)].real)), (yyvsp[(9) - (12)].str), (yyvsp[(10) - (12)].str), (yyvsp[(11) - (12)].str), (yyvsp[(12) - (12)].str));;} break; case 256: #line 834 "frame/parser.Y" {fr->blockCmd(Vector((yyvsp[(1) - (1)].real),(yyvsp[(1) - (1)].real)));;} break; case 257: #line 835 "frame/parser.Y" {fr->blockCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 259: #line 839 "frame/parser.Y" {fr->blockToFitCmd();;} break; case 260: #line 840 "frame/parser.Y" {fr->blockToCmd(Vector((yyvsp[(1) - (1)].real),(yyvsp[(1) - (1)].real)));;} break; case 261: #line 841 "frame/parser.Y" {fr->blockToCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 267: #line 850 "frame/parser.Y" { // backward compatibility with backup fr->clipPreserveCmd((yyvsp[(2) - (2)].integer)); ;} break; case 268: #line 856 "frame/parser.Y" {fr->clipUserCmd((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real));;} break; case 269: #line 857 "frame/parser.Y" {fr->clipUserLowCmd((yyvsp[(2) - (2)].real));;} break; case 270: #line 858 "frame/parser.Y" {fr->clipUserHighCmd((yyvsp[(2) - (2)].real));;} break; case 271: #line 861 "frame/parser.Y" {fr->clipScopeCmd(FrScale::GLOBAL);;} break; case 272: #line 862 "frame/parser.Y" {fr->clipScopeCmd(FrScale::LOCAL);;} break; case 273: #line 865 "frame/parser.Y" {fr->clipModeCmd((yyvsp[(1) - (1)].real));;} break; case 274: #line 866 "frame/parser.Y" {fr->clipModeCmd(FrScale::MINMAX);;} break; case 275: #line 867 "frame/parser.Y" {fr->clipModeCmd(FrScale::ZSCALE);;} break; case 276: #line 868 "frame/parser.Y" {fr->clipModeCmd(FrScale::ZMAX);;} break; case 277: #line 869 "frame/parser.Y" {fr->clipModeCmd(FrScale::USERCLIP);;} break; case 279: #line 873 "frame/parser.Y" { // backward compatibility ;} break; case 280: #line 878 "frame/parser.Y" {fr->clipMinMaxModeCmd(FrScale::SCAN);;} break; case 281: #line 879 "frame/parser.Y" {fr->clipMinMaxModeCmd(FrScale::SCAN);;} break; case 282: #line 880 "frame/parser.Y" { // backward compatibility fr->clipMinMaxModeCmd(FrScale::SCAN); ;} break; case 283: #line 884 "frame/parser.Y" {fr->clipMinMaxModeCmd(FrScale::DATAMIN);;} break; case 284: #line 885 "frame/parser.Y" {fr->clipMinMaxModeCmd(FrScale::IRAFMIN);;} break; case 285: #line 888 "frame/parser.Y" {fr->clipZScaleContrastCmd((yyvsp[(2) - (2)].real));;} break; case 286: #line 889 "frame/parser.Y" {fr->clipZScaleSampleCmd((yyvsp[(2) - (2)].integer));;} break; case 287: #line 890 "frame/parser.Y" {fr->clipZScaleLineCmd((yyvsp[(2) - (2)].integer));;} break; case 288: #line 894 "frame/parser.Y" {fr->colormapCmd((yyvsp[(1) - (7)].integer), (yyvsp[(2) - (7)].real), (yyvsp[(3) - (7)].real), (yyvsp[(4) - (7)].integer), (unsigned short*)(yyvsp[(5) - (7)].ptr), (unsigned char*)(yyvsp[(6) - (7)].ptr), (yyvsp[(7) - (7)].integer));;} break; case 289: #line 897 "frame/parser.Y" {fr->colormapCmd((yyvsp[(2) - (10)].real),(yyvsp[(3) - (10)].real),(yyvsp[(4) - (10)].real),(yyvsp[(5) - (10)].real),(yyvsp[(6) - (10)].real),(yyvsp[(7) - (10)].real),(yyvsp[(8) - (10)].integer),(unsigned char*)(yyvsp[(9) - (10)].ptr),(yyvsp[(10) - (10)].integer));;} break; case 290: #line 898 "frame/parser.Y" {fr->colormapBeginCmd();;} break; case 292: #line 900 "frame/parser.Y" {fr->colormapEndCmd();;} break; case 293: #line 904 "frame/parser.Y" {fr->colormapMotionCmd((yyvsp[(1) - (7)].integer), (yyvsp[(2) - (7)].real), (yyvsp[(3) - (7)].real), (yyvsp[(4) - (7)].integer), (unsigned short*)(yyvsp[(5) - (7)].ptr), (unsigned char*)(yyvsp[(6) - (7)].ptr), (yyvsp[(7) - (7)].integer));;} break; case 294: #line 907 "frame/parser.Y" {fr->colormapMotionCmd((yyvsp[(2) - (10)].real),(yyvsp[(3) - (10)].real),(yyvsp[(4) - (10)].real),(yyvsp[(5) - (10)].real),(yyvsp[(6) - (10)].real),(yyvsp[(7) - (10)].real),(yyvsp[(8) - (10)].integer), (unsigned char*)(yyvsp[(9) - (10)].ptr),(yyvsp[(10) - (10)].integer));;} break; case 295: #line 910 "frame/parser.Y" {fr->colorScaleCmd((FrScale::ColorScaleType)(yyvsp[(1) - (1)].integer));;} break; case 296: #line 911 "frame/parser.Y" {fr->colorScaleLogCmd((yyvsp[(2) - (2)].real));;} break; case 298: #line 915 "frame/parser.Y" {fr->contourSetColorCmd((yyvsp[(2) - (2)].str));;} break; case 299: #line 917 "frame/parser.Y" {fr->contourCopyCmd((Coord::CoordSystem)(yyvsp[(2) - (3)].integer), (Coord::SkyFrame)(yyvsp[(3) - (3)].integer));;} break; case 301: #line 919 "frame/parser.Y" {fr->contourSetDashCmd((yyvsp[(2) - (2)].integer));;} break; case 302: #line 920 "frame/parser.Y" {fr->contourDeleteCmd();;} break; case 303: #line 921 "frame/parser.Y" {fr->contourDeleteAllCmd();;} break; case 304: #line 923 "frame/parser.Y" {fr->contourLoadCmd((yyvsp[(2) - (7)].str), (yyvsp[(3) - (7)].integer), (yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].str), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyFrame)(yyvsp[(7) - (7)].integer));;} break; case 305: #line 925 "frame/parser.Y" {fr->contourPasteCmd((yyvsp[(2) - (7)].str), (yyvsp[(3) - (7)].integer), (yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].ptr), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyFrame)(yyvsp[(7) - (7)].integer));;} break; case 306: #line 927 "frame/parser.Y" {fr->contourSaveCmd((yyvsp[(2) - (4)].str), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer), (Coord::SkyFrame)(yyvsp[(4) - (4)].integer));;} break; case 307: #line 928 "frame/parser.Y" {fr->contourSetLineWidthCmd((yyvsp[(2) - (2)].integer));;} break; case 308: #line 931 "frame/parser.Y" {fr->contourAuxHeadCmd();;} break; case 309: #line 932 "frame/parser.Y" {fr->contourAuxNextCmd();;} break; case 310: #line 934 "frame/parser.Y" {fr->contourAuxSaveCmd((yyvsp[(2) - (4)].str), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer), (Coord::SkyFrame)(yyvsp[(4) - (4)].integer));;} break; case 311: #line 938 "frame/parser.Y" {fr->contourCreateCmd((yyvsp[(1) - (12)].str),(yyvsp[(2) - (12)].integer),(yyvsp[(3) - (12)].integer),(FVContour::Method)(yyvsp[(4) - (12)].integer),(yyvsp[(5) - (12)].integer),(yyvsp[(6) - (12)].integer),(FrScale::ColorScaleType)(yyvsp[(7) - (12)].integer),(yyvsp[(8) - (12)].real),(yyvsp[(9) - (12)].real),Vector((yyvsp[(10) - (12)].real),(yyvsp[(11) - (12)].real)),(yyvsp[(12) - (12)].str));;} break; case 312: #line 940 "frame/parser.Y" {fr->createContourPolygonCmd(currentColor,currentDash,currentWidth, currentFont, currentText, currentProps, NULL, taglist,cblist);;} break; case 313: #line 944 "frame/parser.Y" {(yyval.integer) = FVContour::SMOOTH;;} break; case 314: #line 945 "frame/parser.Y" {(yyval.integer) = FVContour::BLOCK;;} break; case 315: #line 948 "frame/parser.Y" {fr->cropCmd();;} break; case 316: #line 950 "frame/parser.Y" {fr->cropCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)), Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)), (Coord::CoordSystem)(yyvsp[(5) - (6)].integer), (Coord::SkyFrame)(yyvsp[(6) - (6)].integer));;} break; case 317: #line 953 "frame/parser.Y" {fr->cropCenterCmd(Vector((yyvsp[(2) - (8)].vector)), (Coord::CoordSystem)(yyvsp[(3) - (8)].integer), (Coord::SkyFrame)(yyvsp[(4) - (8)].integer), Vector((yyvsp[(5) - (8)].real),(yyvsp[(6) - (8)].real)), (Coord::CoordSystem)(yyvsp[(7) - (8)].integer), (Coord::SkyDist)(yyvsp[(8) - (8)].integer));;} break; case 319: #line 956 "frame/parser.Y" {fr->cropBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 320: #line 957 "frame/parser.Y" {fr->cropMotionCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 321: #line 958 "frame/parser.Y" {fr->cropEndCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 322: #line 961 "frame/parser.Y" {fr->crop3dCmd();;} break; case 323: #line 962 "frame/parser.Y" {fr->crop3dCmd((yyvsp[(1) - (3)].real), (yyvsp[(2) - (3)].real), (Coord::CoordSystem)(yyvsp[(3) - (3)].integer));;} break; case 324: #line 963 "frame/parser.Y" {fr->crop3dBeginCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].integer));;} break; case 325: #line 964 "frame/parser.Y" {fr->crop3dMotionCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].integer));;} break; case 326: #line 965 "frame/parser.Y" {fr->crop3dEndCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].integer));;} break; case 327: #line 969 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)), (Coord::InternalSystem)(yyvsp[(1) - (3)].integer));;} break; case 328: #line 971 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(3) - (3)].vector)), (Coord::CoordSystem)(yyvsp[(1) - (3)].integer), (Coord::SkyFrame)(yyvsp[(2) - (3)].integer));;} break; case 329: #line 972 "frame/parser.Y" {fr->crosshairCmd((yyvsp[(1) - (1)].integer));;} break; case 330: #line 973 "frame/parser.Y" {fr->crosshairWarpCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 331: #line 976 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)), (Coord::InternalSystem)(yyvsp[(3) - (5)].integer));;} break; case 332: #line 978 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)), (Coord::InternalSystem)(yyvsp[(2) - (4)].integer));;} break; case 333: #line 980 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(4) - (4)].vector)), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer));;} break; case 334: #line 982 "frame/parser.Y" {fr->crosshairCmd(Vector((yyvsp[(3) - (3)].vector)), (Coord::CoordSystem)(yyvsp[(2) - (3)].integer));;} break; case 335: #line 985 "frame/parser.Y" {fr->axesOrderCmd((yyvsp[(2) - (2)].integer));;} break; case 336: #line 988 "frame/parser.Y" {fr->fitsyHasExtCmd((yyvsp[(3) - (3)].str));;} break; case 337: #line 991 "frame/parser.Y" {fr->getBgColorCmd();;} break; case 351: #line 1005 "frame/parser.Y" {fr->getDATASECCmd();;} break; case 354: #line 1008 "frame/parser.Y" {fr->getHistogramCmd((yyvsp[(2) - (4)].str),(yyvsp[(3) - (4)].str),(yyvsp[(4) - (4)].integer));;} break; case 355: #line 1010 "frame/parser.Y" {fr->getHorzCutCmd((yyvsp[(3) - (7)].str),(yyvsp[(4) - (7)].str),Vector((yyvsp[(5) - (7)].real),(yyvsp[(6) - (7)].real)),(Coord::InternalSystem)(yyvsp[(7) - (7)].integer));;} break; case 358: #line 1013 "frame/parser.Y" {fr->getIRAFAlignCmd();;} break; case 359: #line 1014 "frame/parser.Y" {fr->getMinMaxCmd();;} break; case 362: #line 1017 "frame/parser.Y" {fr->getNANColorCmd();;} break; case 363: #line 1018 "frame/parser.Y" {fr->getOrientCmd();;} break; case 365: #line 1021 "frame/parser.Y" {fr->getPixelTableCmd(Vector((yyvsp[(4) - (8)].real),(yyvsp[(5) - (8)].real)), (Coord::InternalSystem)(yyvsp[(3) - (8)].integer), (yyvsp[(6) - (8)].integer), (yyvsp[(7) - (8)].integer), (yyvsp[(8) - (8)].str));;} break; case 369: #line 1025 "frame/parser.Y" {fr->getThreadsCmd();;} break; case 371: #line 1027 "frame/parser.Y" {fr->getTypeCmd();;} break; case 372: #line 1029 "frame/parser.Y" {fr->getValueCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)),(Coord::InternalSystem)(yyvsp[(2) - (4)].integer));;} break; case 373: #line 1031 "frame/parser.Y" {fr->getVertCutCmd((yyvsp[(3) - (7)].str),(yyvsp[(4) - (7)].str),Vector((yyvsp[(5) - (7)].real),(yyvsp[(6) - (7)].real)),(Coord::InternalSystem)(yyvsp[(7) - (7)].integer));;} break; case 376: #line 1036 "frame/parser.Y" {fr->getBinDepthCmd();;} break; case 377: #line 1037 "frame/parser.Y" {fr->getBinFactorCmd();;} break; case 378: #line 1038 "frame/parser.Y" {fr->getBinFunctionCmd();;} break; case 379: #line 1039 "frame/parser.Y" {fr->getBinBufferSizeCmd();;} break; case 380: #line 1040 "frame/parser.Y" {fr->getBinCursorCmd();;} break; case 381: #line 1041 "frame/parser.Y" {fr->getBinFilterCmd();;} break; case 383: #line 1043 "frame/parser.Y" {fr->getBinListCmd();;} break; case 384: #line 1046 "frame/parser.Y" {fr->getBinColsCmd();;} break; case 385: #line 1047 "frame/parser.Y" {fr->getBinColsMinMaxCmd((yyvsp[(2) - (2)].str));;} break; case 386: #line 1048 "frame/parser.Y" {fr->getBinColsDimCmd((yyvsp[(2) - (2)].str));;} break; case 387: #line 1051 "frame/parser.Y" {fr->getBlockCmd();;} break; case 389: #line 1055 "frame/parser.Y" {fr->getClipScopeCmd();;} break; case 390: #line 1056 "frame/parser.Y" {fr->getClipModeCmd();;} break; case 392: #line 1058 "frame/parser.Y" {fr->getClipUserCmd();;} break; case 394: #line 1061 "frame/parser.Y" { // backward compatibility with backup fr->getClipPreserveCmd(); ;} break; case 395: #line 1067 "frame/parser.Y" {fr->getClipCmd();;} break; case 396: #line 1068 "frame/parser.Y" {fr->getClipCmd((yyvsp[(1) - (1)].real));;} break; case 397: #line 1069 "frame/parser.Y" {fr->getClipCmd(FrScale::MINMAX);;} break; case 398: #line 1070 "frame/parser.Y" {fr->getClipCmd(FrScale::ZSCALE);;} break; case 399: #line 1071 "frame/parser.Y" {fr->getClipCmd(FrScale::ZMAX);;} break; case 400: #line 1072 "frame/parser.Y" {fr->getClipCmd(FrScale::USERCLIP);;} break; case 401: #line 1075 "frame/parser.Y" {fr->getClipMinMaxModeCmd();;} break; case 402: #line 1076 "frame/parser.Y" {fr->getClipMinMaxSampleCmd();;} break; case 403: #line 1079 "frame/parser.Y" {fr->getClipZScaleContrastCmd();;} break; case 404: #line 1080 "frame/parser.Y" {fr->getClipZScaleSampleCmd();;} break; case 405: #line 1081 "frame/parser.Y" {fr->getClipZScaleLineCmd();;} break; case 406: #line 1084 "frame/parser.Y" {fr->getColorbarCmd();;} break; case 407: #line 1085 "frame/parser.Y" {fr->getColorbarTagCmd();;} break; case 409: #line 1091 "frame/parser.Y" {fr->getColorMapLevelCmd((yyvsp[(1) - (1)].integer));;} break; case 410: #line 1093 "frame/parser.Y" {fr->getColorMapLevelCmd((yyvsp[(1) - (4)].integer),Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)),(Coord::InternalSystem)(yyvsp[(2) - (4)].integer));;} break; case 411: #line 1095 "frame/parser.Y" {fr->getColorMapLevelCmd((yyvsp[(1) - (5)].integer),(yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real),(FrScale::ColorScaleType)(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].real));;} break; case 412: #line 1098 "frame/parser.Y" {fr->getColorScaleCmd();;} break; case 414: #line 1100 "frame/parser.Y" {fr->getColorScaleLogCmd();;} break; case 415: #line 1104 "frame/parser.Y" {fr->getColorScaleLevelCmd((yyvsp[(1) - (5)].integer),(yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real),(FrScale::ColorScaleType)(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].real));;} break; case 416: #line 1108 "frame/parser.Y" {fr->getContourCmd((Coord::CoordSystem)(yyvsp[(1) - (2)].integer),(Coord::SkyFrame)(yyvsp[(2) - (2)].integer));;} break; case 419: #line 1111 "frame/parser.Y" {fr->getContourColorNameCmd();;} break; case 420: #line 1112 "frame/parser.Y" {fr->getContourDashCmd();;} break; case 421: #line 1113 "frame/parser.Y" {fr->getContourLevelCmd();;} break; case 422: #line 1114 "frame/parser.Y" {fr->getContourNumLevelCmd();;} break; case 423: #line 1115 "frame/parser.Y" {fr->getContourMethodCmd();;} break; case 425: #line 1117 "frame/parser.Y" {fr->getContourSmoothCmd();;} break; case 426: #line 1118 "frame/parser.Y" {fr->getContourLineWidthCmd();;} break; case 427: #line 1121 "frame/parser.Y" {fr->getContourAuxColorNameCmd();;} break; case 428: #line 1122 "frame/parser.Y" {fr->getContourAuxDashCmd();;} break; case 429: #line 1123 "frame/parser.Y" {fr->getContourAuxLineWidthCmd();;} break; case 430: #line 1126 "frame/parser.Y" {fr->getContourClipCmd();;} break; case 431: #line 1127 "frame/parser.Y" {fr->getContourClipModeCmd();;} break; case 432: #line 1130 "frame/parser.Y" {fr->getContourScaleCmd();;} break; case 433: #line 1131 "frame/parser.Y" {fr->getContourScaleLogCmd();;} break; case 434: #line 1135 "frame/parser.Y" {fr->getCoordCmd(Vector((yyvsp[(1) - (5)].real),(yyvsp[(2) - (5)].real)), (Coord::CoordSystem)(yyvsp[(3) - (5)].integer), (Coord::SkyFrame)(yyvsp[(4) - (5)].integer), (Coord::SkyFormat)(yyvsp[(5) - (5)].integer));;} break; case 435: #line 1138 "frame/parser.Y" { // backward compatibility fr->getCoordCmd(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer), (Coord::SkyFormat)(yyvsp[(6) - (6)].integer)); ;} break; case 436: #line 1144 "frame/parser.Y" {fr->getCoord3axisCmd((yyvsp[(1) - (4)].real), (Coord::CoordSystem)(yyvsp[(2) - (4)].integer), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer), (yyvsp[(4) - (4)].integer));;} break; case 437: #line 1148 "frame/parser.Y" {fr->getCropCmd((Coord::CoordSystem)(yyvsp[(1) - (3)].integer), (Coord::SkyFrame)(yyvsp[(2) - (3)].integer), (Coord::SkyFormat)(yyvsp[(3) - (3)].integer));;} break; case 438: #line 1150 "frame/parser.Y" {fr->getCropCenterCmd((Coord::CoordSystem)(yyvsp[(2) - (6)].integer), (Coord::SkyFrame)(yyvsp[(3) - (6)].integer), (Coord::SkyFormat)(yyvsp[(4) - (6)].integer), (Coord::CoordSystem)(yyvsp[(5) - (6)].integer), (Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 439: #line 1152 "frame/parser.Y" {fr->getCrop3dCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 440: #line 1155 "frame/parser.Y" {fr->getCrosshairCmd((Coord::InternalSystem)(yyvsp[(1) - (1)].integer));;} break; case 441: #line 1157 "frame/parser.Y" {fr->getCrosshairCmd((Coord::CoordSystem)(yyvsp[(1) - (4)].integer), (Coord::SkyFrame)(yyvsp[(2) - (4)].integer), (Coord::SkyFormat)(yyvsp[(3) - (4)].integer), (Base::Precision)(yyvsp[(4) - (4)].integer));;} break; case 442: #line 1158 "frame/parser.Y" {fr->getCrosshairStatusCmd();;} break; case 443: #line 1161 "frame/parser.Y" {fr->getAxesOrderCmd();;} break; case 444: #line 1164 "frame/parser.Y" {fr->getCursorCmd((Coord::InternalSystem)(yyvsp[(1) - (1)].integer));;} break; case 445: #line 1166 "frame/parser.Y" {fr->getCursorCmd((Coord::CoordSystem)(yyvsp[(1) - (4)].integer), (Coord::SkyFrame)(yyvsp[(2) - (4)].integer), (Coord::SkyFormat)(yyvsp[(3) - (4)].integer), (Base::Precision)(yyvsp[(4) - (4)].integer));;} break; case 446: #line 1171 "frame/parser.Y" {fr->getDataValuesCmd(1, Vector((yyvsp[(3) - (6)].vector)), (Coord::CoordSystem)(yyvsp[(1) - (6)].integer), (Coord::SkyFrame)(yyvsp[(2) - (6)].integer), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)), (yyvsp[(6) - (6)].str));;} break; case 447: #line 1174 "frame/parser.Y" {fr->getDataValuesCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(4) - (7)].vector)), (Coord::CoordSystem)(yyvsp[(2) - (7)].integer), (Coord::SkyFrame)(yyvsp[(3) - (7)].integer), Vector((yyvsp[(5) - (7)].real),(yyvsp[(6) - (7)].real)), (yyvsp[(7) - (7)].str));;} break; case 448: #line 1177 "frame/parser.Y" {fr->getDataValuesCmd(Vector((yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real)),(Coord::InternalSystem)(yyvsp[(1) - (5)].integer), Vector((yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].integer)));;} break; case 449: #line 1181 "frame/parser.Y" {fr->getInfoCmd((yyvsp[(1) - (1)].str));;} break; case 450: #line 1182 "frame/parser.Y" {fr->getInfoClipCmd();;} break; case 451: #line 1184 "frame/parser.Y" {fr->getInfoCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)), (Coord::InternalSystem)(yyvsp[(1) - (4)].integer), (yyvsp[(4) - (4)].str));;} break; case 452: #line 1187 "frame/parser.Y" {fr->iisGetCmd((char*)(yyvsp[(1) - (5)].ptr),(yyvsp[(2) - (5)].integer),(yyvsp[(3) - (5)].integer),(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].integer));;} break; case 453: #line 1188 "frame/parser.Y" {fr->iisGetCursorCmd();;} break; case 455: #line 1192 "frame/parser.Y" {fr->iisGetFileNameCmd();;} break; case 456: #line 1193 "frame/parser.Y" {fr->iisGetFileNameCmd((yyvsp[(1) - (1)].integer));;} break; case 457: #line 1194 "frame/parser.Y" {fr->iisGetFileNameCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 458: #line 1197 "frame/parser.Y" {fr->getFitsNAxesCmd();;} break; case 459: #line 1199 "frame/parser.Y" {fr->getFitsCenterCmd((Coord::CoordSystem)(yyvsp[(2) - (5)].integer),(Coord::SkyFrame)(yyvsp[(3) - (5)].integer),(Coord::SkyFormat)(yyvsp[(4) - (5)].integer), (Base::Precision)(yyvsp[(5) - (5)].integer));;} break; case 460: #line 1201 "frame/parser.Y" {fr->getFitsCountCmd();;} break; case 462: #line 1203 "frame/parser.Y" {fr->getBitpixCmd();;} break; case 466: #line 1207 "frame/parser.Y" {fr->getFitsHeightCmd();;} break; case 467: #line 1208 "frame/parser.Y" {fr->getFitsObjectNameCmd();;} break; case 468: #line 1209 "frame/parser.Y" {fr->getFitsSizeCmd();;} break; case 469: #line 1211 "frame/parser.Y" {fr->getFitsSizeCmd((Coord::CoordSystem)(yyvsp[(2) - (5)].integer),(Coord::SkyFrame)(yyvsp[(3) - (5)].integer),(Coord::SkyDist)(yyvsp[(4) - (5)].integer), (Base::Precision)(yyvsp[(5) - (5)].integer));;} break; case 471: #line 1214 "frame/parser.Y" {fr->getFitsWidthCmd();;} break; case 472: #line 1217 "frame/parser.Y" {fr->getFitsExtCmd((yyvsp[(1) - (1)].integer));;} break; case 473: #line 1219 "frame/parser.Y" {fr->getFitsExtCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)),(Coord::InternalSystem)(yyvsp[(1) - (3)].integer));;} break; case 474: #line 1221 "frame/parser.Y" {fr->getFitsHeaderCmd((yyvsp[(1) - (1)].integer));;} break; case 475: #line 1222 "frame/parser.Y" {fr->getFitsHeaderKeywordCmd(1,(yyvsp[(2) - (2)].str));;} break; case 476: #line 1223 "frame/parser.Y" {fr->getFitsHeaderKeywordCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 477: #line 1224 "frame/parser.Y" {fr->getFitsHeaderWCSCmd((yyvsp[(2) - (2)].integer));;} break; case 478: #line 1227 "frame/parser.Y" {fr->getFitsDepthCmd(2);;} break; case 479: #line 1228 "frame/parser.Y" {fr->getFitsDepthCmd((yyvsp[(1) - (1)].integer));;} break; case 480: #line 1232 "frame/parser.Y" {fr->getFitsFileNameCmd((Base::FileNameType)(yyvsp[(1) - (1)].integer));;} break; case 481: #line 1234 "frame/parser.Y" {fr->getFitsFileNameCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)), (Coord::InternalSystem)(yyvsp[(2) - (4)].integer), (Base::FileNameType)(yyvsp[(1) - (4)].integer));;} break; case 482: #line 1237 "frame/parser.Y" {fr->getFitsFileNameCmd((yyvsp[(2) - (2)].integer), (Base::FileNameType)(yyvsp[(1) - (2)].integer));;} break; case 483: #line 1240 "frame/parser.Y" {fr->getFitsSliceCmd(2);;} break; case 484: #line 1241 "frame/parser.Y" {fr->getFitsSliceCmd((yyvsp[(1) - (1)].integer));;} break; case 485: #line 1242 "frame/parser.Y" {fr->getFitsSliceCmd(2, (Coord::CoordSystem)(yyvsp[(1) - (1)].integer));;} break; case 486: #line 1243 "frame/parser.Y" {fr->getFitsSliceCmd((yyvsp[(1) - (2)].integer), (Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 487: #line 1246 "frame/parser.Y" {fr->getGridCmd();;} break; case 488: #line 1247 "frame/parser.Y" {fr->getGridOptionCmd();;} break; case 489: #line 1248 "frame/parser.Y" {fr->getGridVarsCmd();;} break; case 490: #line 1251 "frame/parser.Y" {fr->getMaskColorCmd();;} break; case 491: #line 1252 "frame/parser.Y" {fr->getMaskMarkCmd();;} break; case 492: #line 1253 "frame/parser.Y" {fr->getMaskTransparencyCmd();;} break; case 493: #line 1256 "frame/parser.Y" {fr->getPanPreserveCmd();;} break; case 494: #line 1259 "frame/parser.Y" {fr->getRGBChannelCmd();;} break; case 495: #line 1260 "frame/parser.Y" {fr->getRGBSystemCmd();;} break; case 496: #line 1261 "frame/parser.Y" {fr->getRGBViewCmd();;} break; case 497: #line 1264 "frame/parser.Y" {fr->getRotateCmd((Base::Precision)(yyvsp[(1) - (1)].integer));;} break; case 498: #line 1267 "frame/parser.Y" {fr->getSmoothFunctionCmd();;} break; case 499: #line 1268 "frame/parser.Y" {fr->getSmoothRadiusCmd();;} break; case 504: #line 1275 "frame/parser.Y" {fr->get3dRenderMethodCmd();;} break; case 505: #line 1276 "frame/parser.Y" {fr->get3dRenderBackgroundCmd();;} break; case 506: #line 1277 "frame/parser.Y" {fr->get3dScaleCmd();;} break; case 507: #line 1280 "frame/parser.Y" {fr->get3dBorderCmd();;} break; case 508: #line 1281 "frame/parser.Y" {fr->get3dBorderColorCmd();;} break; case 509: #line 1284 "frame/parser.Y" {fr->get3dCompassCmd();;} break; case 510: #line 1285 "frame/parser.Y" {fr->get3dCompassColorCmd();;} break; case 511: #line 1288 "frame/parser.Y" {fr->get3dHighliteCmd();;} break; case 512: #line 1289 "frame/parser.Y" {fr->get3dHighliteColorCmd();;} break; case 513: #line 1292 "frame/parser.Y" {fr->get3dViewCmd();;} break; case 514: #line 1293 "frame/parser.Y" {fr->get3dViewPointCmd();;} break; case 515: #line 1296 "frame/parser.Y" {fr->getWCSCmd();;} break; case 517: #line 1298 "frame/parser.Y" {fr->getWCSNameCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 518: #line 1301 "frame/parser.Y" {fr->getWCSAlignCmd();;} break; case 519: #line 1302 "frame/parser.Y" {fr->getWCSAlignPointerCmd();;} break; case 520: #line 1305 "frame/parser.Y" {fr->getZoomCmd((Base::Precision)(yyvsp[(1) - (1)].integer));;} break; case 522: #line 1309 "frame/parser.Y" {fr->gridDeleteCmd();;} break; case 523: #line 1313 "frame/parser.Y" {fr->gridCmd((Coord::CoordSystem)(yyvsp[(1) - (6)].integer), (Coord::SkyFrame)(yyvsp[(2) - (6)].integer), (Coord::SkyFormat)(yyvsp[(3) - (6)].integer), (Grid2d::GridType)(yyvsp[(4) - (6)].integer), (yyvsp[(5) - (6)].str), (yyvsp[(6) - (6)].str));;} break; case 524: #line 1316 "frame/parser.Y" { // backward compatibility with backup fr->gridCmd((Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (Coord::SkyFrame)(yyvsp[(2) - (5)].integer), (Coord::SkyFormat)(yyvsp[(3) - (5)].integer), (Grid2d::GridType)(yyvsp[(4) - (5)].integer), (yyvsp[(5) - (5)].str), ""); ;} break; case 525: #line 1322 "frame/parser.Y" {(yyval.integer)=Grid2d::ANALYSIS;;} break; case 526: #line 1323 "frame/parser.Y" {(yyval.integer)=Grid2d::PUBLICATION;;} break; case 527: #line 1326 "frame/parser.Y" {fr->hasAmplifierCmd();;} break; case 530: #line 1329 "frame/parser.Y" {fr->hasCropCmd();;} break; case 531: #line 1330 "frame/parser.Y" {fr->hasDATAMINCmd();;} break; case 532: #line 1331 "frame/parser.Y" {fr->hasDATASECCmd();;} break; case 533: #line 1332 "frame/parser.Y" {fr->hasDetectorCmd();;} break; case 535: #line 1334 "frame/parser.Y" {fr->hasGridCmd();;} break; case 536: #line 1335 "frame/parser.Y" {fr->hasIISCmd();;} break; case 537: #line 1336 "frame/parser.Y" {fr->hasIRAFMINCmd();;} break; case 539: #line 1338 "frame/parser.Y" {fr->hasPhysicalCmd();;} break; case 540: #line 1339 "frame/parser.Y" {fr->hasSmoothCmd();;} break; case 541: #line 1340 "frame/parser.Y" {fr->hasSystemCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 543: #line 1344 "frame/parser.Y" {fr->hasBinColCmd((yyvsp[(2) - (2)].str));;} break; case 544: #line 1347 "frame/parser.Y" {fr->hasContourCmd();;} break; case 545: #line 1348 "frame/parser.Y" {fr->hasContourAuxCmd();;} break; case 546: #line 1351 "frame/parser.Y" {fr->hasFitsCmd();;} break; case 547: #line 1352 "frame/parser.Y" {fr->hasFitsBinCmd();;} break; case 548: #line 1353 "frame/parser.Y" {fr->hasFitsCubeCmd();;} break; case 549: #line 1354 "frame/parser.Y" {fr->hasFitsMosaicCmd();;} break; case 550: #line 1357 "frame/parser.Y" {fr->hasMarkerHighlitedCmd();;} break; case 551: #line 1358 "frame/parser.Y" {fr->hasMarkerSelectedCmd();;} break; case 552: #line 1359 "frame/parser.Y" {fr->hasMarkerPasteCmd();;} break; case 553: #line 1360 "frame/parser.Y" {fr->hasMarkerUndoCmd();;} break; case 554: #line 1363 "frame/parser.Y" {fr->hasWCSCmd((Coord::CoordSystem)(yyvsp[(1) - (1)].integer));;} break; case 555: #line 1364 "frame/parser.Y" {fr->hasWCSEquCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 556: #line 1365 "frame/parser.Y" {fr->hasWCSCelCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 557: #line 1366 "frame/parser.Y" {fr->hasWCSAltCmd();;} break; case 558: #line 1367 "frame/parser.Y" {fr->hasWCSxCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 559: #line 1370 "frame/parser.Y" {fr->iisCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 560: #line 1371 "frame/parser.Y" {fr->iisEraseCmd();;} break; case 561: #line 1372 "frame/parser.Y" {fr->iisMessageCmd((yyvsp[(2) - (2)].str));;} break; case 564: #line 1376 "frame/parser.Y" {fr->iisSetCmd((const char*)(yyvsp[(2) - (6)].ptr),(yyvsp[(3) - (6)].integer),(yyvsp[(4) - (6)].integer),(yyvsp[(5) - (6)].integer),(yyvsp[(6) - (6)].integer));;} break; case 565: #line 1377 "frame/parser.Y" {fr->iisUpdateCmd();;} break; case 566: #line 1380 "frame/parser.Y" {fr->iisWCSCmd(Matrix((yyvsp[(2) - (10)].real),(yyvsp[(3) - (10)].real),(yyvsp[(4) - (10)].real),(yyvsp[(5) - (10)].real),(yyvsp[(6) - (10)].real),(yyvsp[(7) - (10)].real)),Vector((yyvsp[(8) - (10)].real),(yyvsp[(9) - (10)].real)),(yyvsp[(10) - (10)].integer));;} break; case 567: #line 1383 "frame/parser.Y" {fr->iisSetFileNameCmd((yyvsp[(1) - (1)].str));;} break; case 568: #line 1384 "frame/parser.Y" {fr->iisSetFileNameCmd((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].integer));;} break; case 569: #line 1388 "frame/parser.Y" {fr->iisSetCursorCmd(Vector((yyvsp[(1) - (3)].integer),(yyvsp[(2) - (3)].integer)),Coord::CANVAS);;} break; case 570: #line 1390 "frame/parser.Y" {fr->iisSetCursorCmd(Vector((yyvsp[(1) - (3)].integer),(yyvsp[(2) - (3)].integer)),(Coord::CoordSystem)(yyvsp[(3) - (3)].integer));;} break; case 571: #line 1391 "frame/parser.Y" {fr->iisCursorModeCmd((yyvsp[(2) - (2)].integer));;} break; case 578: #line 1403 "frame/parser.Y" {fr->loadArrAllocCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 579: #line 1405 "frame/parser.Y" {fr->loadArrAllocGZCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 580: #line 1407 "frame/parser.Y" {fr->loadArrChannelCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 581: #line 1409 "frame/parser.Y" {fr->loadArrMMapCmd((yyvsp[(1) - (3)].str), (Base::LayerType)(yyvsp[(3) - (3)].integer));;} break; case 582: #line 1411 "frame/parser.Y" {fr->loadArrMMapIncrCmd((yyvsp[(1) - (3)].str), (Base::LayerType)(yyvsp[(3) - (3)].integer));;} break; case 583: #line 1413 "frame/parser.Y" {fr->loadArrShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 584: #line 1416 "frame/parser.Y" {fr->loadArrSocketCmd((yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 585: #line 1418 "frame/parser.Y" {fr->loadArrSocketGZCmd((yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 586: #line 1420 "frame/parser.Y" {fr->loadArrVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 588: #line 1424 "frame/parser.Y" {fr->loadArrayRGBCubeAllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 589: #line 1425 "frame/parser.Y" {fr->loadArrayRGBCubeAllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 590: #line 1426 "frame/parser.Y" {fr->loadArrayRGBCubeChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 591: #line 1427 "frame/parser.Y" {fr->loadArrayRGBCubeMMapCmd((yyvsp[(1) - (2)].str));;} break; case 592: #line 1428 "frame/parser.Y" {fr->loadArrayRGBCubeMMapIncrCmd((yyvsp[(1) - (2)].str));;} break; case 593: #line 1430 "frame/parser.Y" {fr->loadArrayRGBCubeShareCmd((Base::ShmType)(yyvsp[(3) - (4)].integer), (yyvsp[(4) - (4)].integer), (yyvsp[(1) - (4)].str));;} break; case 594: #line 1431 "frame/parser.Y" {fr->loadArrayRGBCubeSocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 595: #line 1432 "frame/parser.Y" {fr->loadArrayRGBCubeSocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 596: #line 1433 "frame/parser.Y" {fr->loadArrayRGBCubeVarCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 597: #line 1436 "frame/parser.Y" {fr->loadENVISMMapCmd((yyvsp[(1) - (3)].str),(yyvsp[(2) - (3)].str));;} break; case 598: #line 1440 "frame/parser.Y" {fr->loadFitsAllocCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 599: #line 1442 "frame/parser.Y" {fr->loadFitsAllocGZCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 600: #line 1444 "frame/parser.Y" {fr->loadFitsChannelCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 601: #line 1446 "frame/parser.Y" {fr->loadFitsMMapCmd((yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 602: #line 1449 "frame/parser.Y" {fr->loadFitsSMMapCmd((yyvsp[(1) - (5)].str), (yyvsp[(2) - (5)].str),(Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 603: #line 1452 "frame/parser.Y" {fr->loadFitsMMapIncrCmd((yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 604: #line 1455 "frame/parser.Y" {fr->loadFitsShareCmd((Base::ShmType)(yyvsp[(3) - (6)].integer), (yyvsp[(4) - (6)].integer), (yyvsp[(1) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer),(Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 605: #line 1458 "frame/parser.Y" {fr->loadFitsSShareCmd((Base::ShmType)(yyvsp[(3) - (7)].integer), (yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].integer), (yyvsp[(1) - (7)].str), (Base::LoadMethod)(yyvsp[(6) - (7)].integer),(Base::LayerType)(yyvsp[(7) - (7)].integer));;} break; case 606: #line 1461 "frame/parser.Y" {fr->loadFitsSocketCmd((yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 607: #line 1463 "frame/parser.Y" {fr->loadFitsSocketGZCmd((yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 608: #line 1465 "frame/parser.Y" {fr->loadFitsVarCmd((yyvsp[(3) - (5)].str), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 614: #line 1475 "frame/parser.Y" {fr->loadSliceAllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 615: #line 1477 "frame/parser.Y" {fr->loadSliceAllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 616: #line 1479 "frame/parser.Y" {fr->loadSliceChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 617: #line 1481 "frame/parser.Y" {fr->loadSliceMMapCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 618: #line 1483 "frame/parser.Y" {fr->loadSliceSMMapCmd((yyvsp[(1) - (4)].str), (yyvsp[(2) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 619: #line 1485 "frame/parser.Y" {fr->loadSliceMMapIncrCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 620: #line 1487 "frame/parser.Y" {fr->loadSliceShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(5) - (5)].integer));;} break; case 621: #line 1489 "frame/parser.Y" {fr->loadSliceSShareCmd((Base::ShmType)(yyvsp[(3) - (6)].integer), (yyvsp[(4) - (6)].integer), (yyvsp[(5) - (6)].integer), (yyvsp[(1) - (6)].str), (Base::LoadMethod)(yyvsp[(6) - (6)].integer));;} break; case 622: #line 1491 "frame/parser.Y" {fr->loadSliceSocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 623: #line 1493 "frame/parser.Y" {fr->loadSliceSocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 624: #line 1495 "frame/parser.Y" {fr->loadSliceVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 625: #line 1499 "frame/parser.Y" {fr->loadExtCubeAllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 626: #line 1501 "frame/parser.Y" {fr->loadExtCubeAllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 627: #line 1503 "frame/parser.Y" {fr->loadExtCubeChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 628: #line 1505 "frame/parser.Y" {fr->loadExtCubeMMapCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 629: #line 1507 "frame/parser.Y" {fr->loadExtCubeMMapIncrCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 630: #line 1509 "frame/parser.Y" {fr->loadExtCubeShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(5) - (5)].integer));;} break; case 631: #line 1512 "frame/parser.Y" {fr->loadExtCubeSocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 632: #line 1514 "frame/parser.Y" {fr->loadExtCubeSocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 633: #line 1516 "frame/parser.Y" {fr->loadExtCubeVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 639: #line 1527 "frame/parser.Y" {fr->loadMosaicImageAllocCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 640: #line 1530 "frame/parser.Y" {fr->loadMosaicImageAllocGZCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str),(Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 641: #line 1533 "frame/parser.Y" {fr->loadMosaicImageChannelCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str),(Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 642: #line 1536 "frame/parser.Y" {fr->loadMosaicImageMMapCmd(Base::IRAF, Coord::WCS, (yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 643: #line 1539 "frame/parser.Y" {fr->loadMosaicImageMMapIncrCmd(Base::IRAF, Coord::WCS, (yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 644: #line 1542 "frame/parser.Y" {fr->loadMosaicImageShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)(yyvsp[(3) - (6)].integer), (yyvsp[(4) - (6)].integer), (yyvsp[(1) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer), (Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 645: #line 1546 "frame/parser.Y" {fr->loadMosaicImageSocketCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 646: #line 1549 "frame/parser.Y" {fr->loadMosaicImageSocketGZCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 647: #line 1552 "frame/parser.Y" {fr->loadMosaicImageVarCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (5)].str), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 648: #line 1557 "frame/parser.Y" {fr->loadMosaicAllocCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 649: #line 1560 "frame/parser.Y" {fr->loadMosaicAllocGZCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 650: #line 1563 "frame/parser.Y" {fr->loadMosaicChannelCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 651: #line 1566 "frame/parser.Y" {fr->loadMosaicMMapCmd(Base::IRAF, Coord::WCS, (yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 652: #line 1569 "frame/parser.Y" {fr->loadMosaicSMMapCmd(Base::IRAF, Coord::WCS, (yyvsp[(1) - (5)].str), (yyvsp[(2) - (5)].str),(Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 653: #line 1572 "frame/parser.Y" {fr->loadMosaicMMapIncrCmd(Base::IRAF, Coord::WCS, (yyvsp[(1) - (4)].str),(Base::LoadMethod)(yyvsp[(3) - (4)].integer), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 654: #line 1575 "frame/parser.Y" {fr->loadMosaicShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)(yyvsp[(3) - (6)].integer), (yyvsp[(4) - (6)].integer), (yyvsp[(1) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer), (Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 655: #line 1579 "frame/parser.Y" {fr->loadMosaicSShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)(yyvsp[(3) - (7)].integer), (yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].integer), (yyvsp[(1) - (7)].str), (Base::LoadMethod)(yyvsp[(6) - (7)].integer), (Base::LayerType)(yyvsp[(7) - (7)].integer));;} break; case 656: #line 1583 "frame/parser.Y" {fr->loadMosaicSocketCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 657: #line 1586 "frame/parser.Y" {fr->loadMosaicSocketGZCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 658: #line 1589 "frame/parser.Y" {fr->loadMosaicVarCmd(Base::IRAF, Coord::WCS, (yyvsp[(3) - (5)].str), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 659: #line 1594 "frame/parser.Y" {fr->loadMosaicImageAllocCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 660: #line 1597 "frame/parser.Y" {fr->loadMosaicImageAllocGZCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 661: #line 1600 "frame/parser.Y" {fr->loadMosaicImageChannelCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 662: #line 1603 "frame/parser.Y" {fr->loadMosaicImageMMapCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 663: #line 1606 "frame/parser.Y" {fr->loadMosaicImageMMapIncrCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 664: #line 1609 "frame/parser.Y" {fr->loadMosaicImageShareCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (7)].integer), (Base::ShmType)(yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].integer), (yyvsp[(2) - (7)].str), (Base::LoadMethod)(yyvsp[(6) - (7)].integer), (Base::LayerType)(yyvsp[(7) - (7)].integer));;} break; case 665: #line 1613 "frame/parser.Y" {fr->loadMosaicImageSocketCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 666: #line 1616 "frame/parser.Y" {fr->loadMosaicImageSocketGZCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 667: #line 1619 "frame/parser.Y" {fr->loadMosaicImageVarCmd(Base::WCSMOSAIC, (Coord::CoordSystem)(yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].str), (yyvsp[(2) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer), (Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 668: #line 1624 "frame/parser.Y" {fr->loadMosaicAllocCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 669: #line 1627 "frame/parser.Y" {fr->loadMosaicAllocGZCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 670: #line 1630 "frame/parser.Y" {fr->loadMosaicChannelCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].str), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 671: #line 1633 "frame/parser.Y" {fr->loadMosaicMMapCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 672: #line 1636 "frame/parser.Y" {fr->loadMosaicSMMapCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (6)].integer), (yyvsp[(2) - (6)].str), (yyvsp[(3) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer), (Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 673: #line 1639 "frame/parser.Y" {fr->loadMosaicMMapIncrCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LoadMethod)(yyvsp[(4) - (5)].integer), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 674: #line 1642 "frame/parser.Y" {fr->loadMosaicShareCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (7)].integer), (Base::ShmType)(yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].integer), (yyvsp[(2) - (7)].str), (Base::LoadMethod)(yyvsp[(6) - (7)].integer), (Base::LayerType)(yyvsp[(7) - (7)].integer));;} break; case 675: #line 1646 "frame/parser.Y" {fr->loadMosaicSShareCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (8)].integer), (Base::ShmType)(yyvsp[(4) - (8)].integer), (yyvsp[(5) - (8)].integer), (yyvsp[(6) - (8)].integer), (yyvsp[(2) - (8)].str), (Base::LoadMethod)(yyvsp[(7) - (8)].integer), (Base::LayerType)(yyvsp[(8) - (8)].integer));;} break; case 676: #line 1650 "frame/parser.Y" {fr->loadMosaicSocketCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 677: #line 1653 "frame/parser.Y" {fr->loadMosaicSocketGZCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(2) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 678: #line 1656 "frame/parser.Y" {fr->loadMosaicVarCmd((Base::WCSMOSAIC), (Coord::CoordSystem)(yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].str), (yyvsp[(2) - (6)].str), (Base::LoadMethod)(yyvsp[(5) - (6)].integer), (Base::LayerType)(yyvsp[(6) - (6)].integer));;} break; case 679: #line 1661 "frame/parser.Y" {fr->loadMosaicImageWFPC2AllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 680: #line 1663 "frame/parser.Y" {fr->loadMosaicImageWFPC2AllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 681: #line 1665 "frame/parser.Y" {fr->loadMosaicImageWFPC2ChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 682: #line 1667 "frame/parser.Y" {fr->loadMosaicImageWFPC2MMapCmd((yyvsp[(1) - (3)].str),(Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 683: #line 1669 "frame/parser.Y" {fr->loadMosaicImageWFPC2MMapIncrCmd((yyvsp[(1) - (3)].str),(Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 684: #line 1671 "frame/parser.Y" {fr->loadMosaicImageWFPC2ShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(5) - (5)].integer));;} break; case 685: #line 1674 "frame/parser.Y" {fr->loadMosaicImageWFPC2SocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 686: #line 1676 "frame/parser.Y" {fr->loadMosaicImageWFPC2SocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 687: #line 1678 "frame/parser.Y" {fr->loadMosaicImageWFPC2VarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 688: #line 1680 "frame/parser.Y" {fr->loadRGBCubeAllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 689: #line 1681 "frame/parser.Y" {fr->loadRGBCubeAllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 690: #line 1682 "frame/parser.Y" {fr->loadRGBCubeChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 691: #line 1684 "frame/parser.Y" {fr->loadRGBCubeMMapCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 692: #line 1686 "frame/parser.Y" {fr->loadRGBCubeSMMapCmd((yyvsp[(1) - (4)].str), (yyvsp[(2) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 693: #line 1688 "frame/parser.Y" {fr->loadRGBCubeMMapIncrCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 694: #line 1690 "frame/parser.Y" {fr->loadRGBCubeShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(5) - (5)].integer));;} break; case 695: #line 1693 "frame/parser.Y" {fr->loadRGBCubeSShareCmd((Base::ShmType)(yyvsp[(3) - (6)].integer), (yyvsp[(4) - (6)].integer), (yyvsp[(5) - (6)].integer), (yyvsp[(1) - (6)].str), (Base::LoadMethod)(yyvsp[(6) - (6)].integer));;} break; case 696: #line 1695 "frame/parser.Y" {fr->loadRGBCubeSocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 697: #line 1696 "frame/parser.Y" {fr->loadRGBCubeSocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 698: #line 1698 "frame/parser.Y" {fr->loadRGBCubeVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 699: #line 1701 "frame/parser.Y" {fr->loadRGBImageAllocCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 700: #line 1702 "frame/parser.Y" {fr->loadRGBImageAllocGZCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 701: #line 1703 "frame/parser.Y" {fr->loadRGBImageChannelCmd((yyvsp[(3) - (3)].str), (yyvsp[(1) - (3)].str));;} break; case 702: #line 1705 "frame/parser.Y" {fr->loadRGBImageMMapCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 703: #line 1707 "frame/parser.Y" {fr->loadRGBImageMMapIncrCmd((yyvsp[(1) - (3)].str), (Base::LoadMethod)(yyvsp[(3) - (3)].integer));;} break; case 704: #line 1709 "frame/parser.Y" {fr->loadRGBImageShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LoadMethod)(yyvsp[(5) - (5)].integer));;} break; case 705: #line 1711 "frame/parser.Y" {fr->loadRGBImageSocketCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 706: #line 1712 "frame/parser.Y" {fr->loadRGBImageSocketGZCmd((yyvsp[(3) - (3)].integer), (yyvsp[(1) - (3)].str));;} break; case 707: #line 1714 "frame/parser.Y" {fr->loadRGBImageVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LoadMethod)(yyvsp[(4) - (4)].integer));;} break; case 708: #line 1718 "frame/parser.Y" {fr->loadNRRDAllocCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 709: #line 1720 "frame/parser.Y" {fr->loadNRRDChannelCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 710: #line 1722 "frame/parser.Y" {fr->loadNRRDMMapCmd((yyvsp[(1) - (3)].str), (Base::LayerType)(yyvsp[(3) - (3)].integer));;} break; case 711: #line 1724 "frame/parser.Y" {fr->loadNRRDShareCmd((Base::ShmType)(yyvsp[(3) - (5)].integer), (yyvsp[(4) - (5)].integer), (yyvsp[(1) - (5)].str), (Base::LayerType)(yyvsp[(5) - (5)].integer));;} break; case 712: #line 1727 "frame/parser.Y" {fr->loadNRRDSocketCmd((yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 713: #line 1729 "frame/parser.Y" {fr->loadNRRDVarCmd((yyvsp[(3) - (4)].str), (yyvsp[(1) - (4)].str), (Base::LayerType)(yyvsp[(4) - (4)].integer));;} break; case 714: #line 1732 "frame/parser.Y" {fr->loadPhotoCmd((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str));;} break; case 715: #line 1733 "frame/parser.Y" {fr->loadSlicePhotoCmd((yyvsp[(2) - (3)].str),(yyvsp[(3) - (3)].str));;} break; case 716: #line 1736 "frame/parser.Y" {fr->loadIncrDataCmd((yyvsp[(2) - (6)].integer),(yyvsp[(3) - (6)].integer),(yyvsp[(4) - (6)].integer),(yyvsp[(5) - (6)].integer),(yyvsp[(6) - (6)].integer));;} break; case 717: #line 1737 "frame/parser.Y" {fr->loadIncrMinMaxCmd((yyvsp[(2) - (6)].integer),(yyvsp[(3) - (6)].integer),(yyvsp[(4) - (6)].integer),(yyvsp[(5) - (6)].integer),(yyvsp[(6) - (6)].integer));;} break; case 718: #line 1738 "frame/parser.Y" {fr->loadIncrEndCmd();;} break; case 719: #line 1741 "frame/parser.Y" { #ifdef MAC_OSX_TK fr->macosxPrintCmd(); #endif ;} break; case 720: #line 1748 "frame/parser.Y" {fr->magnifierCmd((yyvsp[(1) - (1)].integer));;} break; case 721: #line 1749 "frame/parser.Y" {fr->magnifierGraphicsCmd((yyvsp[(2) - (2)].integer));;} break; case 722: #line 1750 "frame/parser.Y" {fr->magnifierCursorCmd((yyvsp[(2) - (2)].integer));;} break; case 723: #line 1751 "frame/parser.Y" {fr->magnifierColorCmd((yyvsp[(2) - (2)].str));;} break; case 724: #line 1752 "frame/parser.Y" {fr->magnifierCmd((yyvsp[(1) - (3)].str), (yyvsp[(2) - (3)].integer), (yyvsp[(3) - (3)].integer));;} break; case 725: #line 1753 "frame/parser.Y" {fr->updateMagnifierCmd(Vector((yyvsp[(2) - (3)].real), (yyvsp[(3) - (3)].real)));;} break; case 726: #line 1754 "frame/parser.Y" {fr->magnifierZoomCmd((yyvsp[(2) - (2)].real));;} break; case 727: #line 1758 "frame/parser.Y" { fr->matchCmd((yyvsp[(1) - (12)].str),(yyvsp[(2) - (12)].str),(Coord::CoordSystem)(yyvsp[(3) - (12)].integer),(Coord::SkyFrame)(yyvsp[(4) - (12)].integer), (yyvsp[(5) - (12)].str),(yyvsp[(6) - (12)].str),(Coord::CoordSystem)(yyvsp[(7) - (12)].integer),(Coord::SkyFrame)(yyvsp[(8) - (12)].integer), (yyvsp[(9) - (12)].real),(Coord::CoordSystem)(yyvsp[(10) - (12)].integer),(Coord::SkyDist)(yyvsp[(11) - (12)].integer), (yyvsp[(12) - (12)].str)); ;} break; case 729: #line 1766 "frame/parser.Y" {fr->markerColorCmd((yyvsp[(2) - (2)].str));;} break; case 730: #line 1767 "frame/parser.Y" {fr->markerCopyCmd();;} break; case 731: #line 1769 "frame/parser.Y" {fr->markerCommandCmd((Base::MarkerFormat)(yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 732: #line 1771 "frame/parser.Y" {fr->markerCommandVarCmd((Base::MarkerFormat)(yyvsp[(2) - (4)].integer),(yyvsp[(4) - (4)].str));;} break; case 733: #line 1772 "frame/parser.Y" {fr->markerCompositeDeleteCmd();;} break; case 734: #line 1773 "frame/parser.Y" {maperr =0;;} break; case 736: #line 1774 "frame/parser.Y" {fr->markerCutCmd();;} break; case 737: #line 1775 "frame/parser.Y" {fr->markerDeleteCmd();;} break; case 738: #line 1776 "frame/parser.Y" {fr->markerDeleteAllCmd();;} break; case 740: #line 1778 "frame/parser.Y" {fr->markerEpsilonCmd((yyvsp[(2) - (2)].integer));;} break; case 741: #line 1779 "frame/parser.Y" {fr->markerFontCmd((yyvsp[(2) - (2)].str));;} break; case 742: #line 1781 "frame/parser.Y" {fr->markerHighliteAllCmd();;} break; case 743: #line 1783 "frame/parser.Y" {fr->markerHighliteOnlyCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 744: #line 1785 "frame/parser.Y" {fr->markerHighliteToggleCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 745: #line 1788 "frame/parser.Y" {fr->markerAnalysisCmd((yyvsp[(1) - (4)].integer), (Marker::AnalysisTask)(yyvsp[(3) - (4)].integer), (yyvsp[(4) - (4)].integer));;} break; case 746: #line 1790 "frame/parser.Y" {fr->markerAngleCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].real));;} break; case 747: #line 1791 "frame/parser.Y" {fr->markerAngleCmd((yyvsp[(1) - (4)].integer),(yyvsp[(3) - (4)].real));;} break; case 748: #line 1793 "frame/parser.Y" {fr->markerAngleCmd((yyvsp[(1) - (5)].integer),(yyvsp[(3) - (5)].real),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 749: #line 1796 "frame/parser.Y" {fr->markerAnnulusRadiusCmd((yyvsp[(1) - (7)].integer), (yyvsp[(4) - (7)].real), (yyvsp[(5) - (7)].real), (yyvsp[(6) - (7)].integer), (Coord::InternalSystem)(yyvsp[(7) - (7)].integer));;} break; case 750: #line 1798 "frame/parser.Y" {fr->markerAnnulusRadiusCmd((yyvsp[(1) - (8)].integer), (yyvsp[(4) - (8)].real), (yyvsp[(5) - (8)].real), (yyvsp[(6) - (8)].integer), (Coord::CoordSystem)(yyvsp[(7) - (8)].integer), (Coord::SkyDist)(yyvsp[(8) - (8)].integer));;} break; case 751: #line 1801 "frame/parser.Y" {fr->markerAnnulusRadiusCmd((yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].str),(Coord::CoordSystem)(yyvsp[(5) - (6)].integer),(Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 752: #line 1804 "frame/parser.Y" {fr->markerBoxAnnulusRadiusCmd((yyvsp[(1) - (8)].integer), Vector((yyvsp[(4) - (8)].real), (yyvsp[(5) - (8)].real)), Vector((yyvsp[(6) - (8)].real), (yyvsp[(6) - (8)].real)*(yyvsp[(5) - (8)].real)/(yyvsp[(4) - (8)].real)), (yyvsp[(7) - (8)].integer), (Coord::InternalSystem)(yyvsp[(8) - (8)].integer));;} break; case 753: #line 1808 "frame/parser.Y" {fr->markerBoxAnnulusRadiusCmd((yyvsp[(1) - (9)].integer), Vector((yyvsp[(4) - (9)].real), (yyvsp[(5) - (9)].real)), Vector((yyvsp[(6) - (9)].real), (yyvsp[(6) - (9)].real)*(yyvsp[(5) - (9)].real)/(yyvsp[(4) - (9)].real)), (yyvsp[(7) - (9)].integer), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 754: #line 1811 "frame/parser.Y" {fr->markerBoxAnnulusRadiusCmd((yyvsp[(1) - (6)].integer),(yyvsp[(4) - (6)].str),(Coord::CoordSystem)(yyvsp[(5) - (6)].integer),(Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 755: #line 1814 "frame/parser.Y" {fr->markerBoxRadiusCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)), (Coord::InternalSystem)(yyvsp[(6) - (6)].integer));;} break; case 756: #line 1816 "frame/parser.Y" {fr->markerBoxRadiusCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyDist)(yyvsp[(7) - (7)].integer));;} break; case 757: #line 1819 "frame/parser.Y" {fr->markerBpandaEditCmd((yyvsp[(1) - (10)].integer), (yyvsp[(4) - (10)].real), (yyvsp[(5) - (10)].real), (yyvsp[(6) - (10)].integer), Vector((yyvsp[(7) - (10)].real),(yyvsp[(8) - (10)].real)), Vector((yyvsp[(9) - (10)].real),(yyvsp[(9) - (10)].real)*(yyvsp[(8) - (10)].real)/(yyvsp[(7) - (10)].real)), (yyvsp[(10) - (10)].integer));;} break; case 758: #line 1823 "frame/parser.Y" {fr->markerBpandaEditCmd((yyvsp[(1) - (11)].integer), (yyvsp[(4) - (11)].real), (yyvsp[(5) - (11)].real), (yyvsp[(6) - (11)].integer), Vector((yyvsp[(7) - (11)].real),(yyvsp[(8) - (11)].real)), Vector((yyvsp[(9) - (11)].real),(yyvsp[(9) - (11)].real)*(yyvsp[(8) - (11)].real)/(yyvsp[(7) - (11)].real)), (yyvsp[(10) - (11)].integer));;} break; case 759: #line 1827 "frame/parser.Y" {fr->markerBpandaEditCmd((yyvsp[(1) - (12)].integer), (yyvsp[(4) - (12)].real), (yyvsp[(5) - (12)].real), (yyvsp[(6) - (12)].integer), Vector((yyvsp[(7) - (12)].real),(yyvsp[(8) - (12)].real)), Vector((yyvsp[(9) - (12)].real),(yyvsp[(9) - (12)].real)*(yyvsp[(8) - (12)].real)/(yyvsp[(7) - (12)].real)), (yyvsp[(10) - (12)].integer), (Coord::CoordSystem)(yyvsp[(11) - (12)].integer), (Coord::SkyFrame)(yyvsp[(12) - (12)].integer));;} break; case 760: #line 1832 "frame/parser.Y" {fr->markerBpandaEditCmd((yyvsp[(1) - (9)].integer), (yyvsp[(4) - (9)].str), (yyvsp[(5) - (9)].str), (Coord::CoordSystem)(yyvsp[(6) - (9)].integer), (Coord::SkyFrame)(yyvsp[(7) - (9)].integer), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 761: #line 1836 "frame/parser.Y" {fr->markerCallBackCmd((yyvsp[(1) - (5)].integer),(CallBack::Type)(yyvsp[(3) - (5)].integer),(yyvsp[(4) - (5)].str),(yyvsp[(5) - (5)].str));;} break; case 762: #line 1838 "frame/parser.Y" {fr->markerCircleRadiusCmd((yyvsp[(1) - (5)].integer), (yyvsp[(4) - (5)].real), (Coord::InternalSystem)(yyvsp[(5) - (5)].integer));;} break; case 763: #line 1840 "frame/parser.Y" {fr->markerCircleRadiusCmd((yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].real), (Coord::CoordSystem)(yyvsp[(5) - (6)].integer), (Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 764: #line 1841 "frame/parser.Y" {fr->markerColorCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 765: #line 1843 "frame/parser.Y" {fr->markerCompassArrowCmd((yyvsp[(1) - (5)].integer),(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].integer));;} break; case 766: #line 1845 "frame/parser.Y" {fr->markerCompassLabelCmd((yyvsp[(1) - (5)].integer),(yyvsp[(4) - (5)].str),(yyvsp[(5) - (5)].str));;} break; case 767: #line 1847 "frame/parser.Y" {fr->markerCompassRadiusCmd((yyvsp[(1) - (5)].integer),(yyvsp[(4) - (5)].real),(Coord::InternalSystem)(yyvsp[(5) - (5)].integer));;} break; case 768: #line 1849 "frame/parser.Y" {fr->markerCompassRadiusCmd((yyvsp[(1) - (6)].integer),(yyvsp[(4) - (6)].real),(Coord::CoordSystem)(yyvsp[(5) - (6)].integer),(Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 769: #line 1851 "frame/parser.Y" {fr->markerCompassSystemCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 770: #line 1852 "frame/parser.Y" {fr->markerCompositeCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 771: #line 1854 "frame/parser.Y" {fr->markerCpandaEditCmd((yyvsp[(1) - (9)].integer), (yyvsp[(4) - (9)].real), (yyvsp[(5) - (9)].real), (yyvsp[(6) - (9)].integer), (yyvsp[(7) - (9)].real), (yyvsp[(8) - (9)].real), (yyvsp[(9) - (9)].integer));;} break; case 772: #line 1856 "frame/parser.Y" {fr->markerCpandaEditCmd((yyvsp[(1) - (10)].integer), (yyvsp[(4) - (10)].real), (yyvsp[(5) - (10)].real), (yyvsp[(6) - (10)].integer), (yyvsp[(7) - (10)].real), (yyvsp[(8) - (10)].real), (yyvsp[(9) - (10)].integer));;} break; case 773: #line 1859 "frame/parser.Y" {fr->markerCpandaEditCmd((yyvsp[(1) - (11)].integer), (yyvsp[(4) - (11)].real), (yyvsp[(5) - (11)].real), (yyvsp[(6) - (11)].integer), (yyvsp[(7) - (11)].real), (yyvsp[(8) - (11)].real), (yyvsp[(9) - (11)].integer), (Coord::CoordSystem)(yyvsp[(10) - (11)].integer), (Coord::SkyFrame)(yyvsp[(11) - (11)].integer));;} break; case 774: #line 1863 "frame/parser.Y" {fr->markerCpandaEditCmd((yyvsp[(1) - (9)].integer), (yyvsp[(4) - (9)].str), (yyvsp[(5) - (9)].str), (Coord::CoordSystem)(yyvsp[(6) - (9)].integer), (Coord::SkyFrame)(yyvsp[(7) - (9)].integer), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 775: #line 1867 "frame/parser.Y" {fr->markerAnnulusCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 776: #line 1869 "frame/parser.Y" {fr->markerBoxAnnulusCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 777: #line 1871 "frame/parser.Y" {fr->markerBpandaCreateAnglesCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 778: #line 1873 "frame/parser.Y" {fr->markerBpandaCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 779: #line 1875 "frame/parser.Y" {fr->markerEllipseAnnulusCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 780: #line 1877 "frame/parser.Y" {fr->markerEpandaCreateAnglesCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 781: #line 1879 "frame/parser.Y" {fr->markerEpandaCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 782: #line 1881 "frame/parser.Y" {fr->markerCpandaCreateAnglesCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 783: #line 1883 "frame/parser.Y" {fr->markerCpandaCreateRadiusCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)));;} break; case 784: #line 1885 "frame/parser.Y" {fr->markerPolygonCreateVertexCmd((yyvsp[(1) - (7)].integer),(yyvsp[(5) - (7)].integer),Vector((yyvsp[(6) - (7)].real),(yyvsp[(7) - (7)].real)));;} break; case 785: #line 1887 "frame/parser.Y" {fr->markerSegmentCreateVertexCmd((yyvsp[(1) - (7)].integer),(yyvsp[(5) - (7)].integer),Vector((yyvsp[(6) - (7)].real),(yyvsp[(7) - (7)].real)));;} break; case 786: #line 1889 "frame/parser.Y" {fr->markerDeleteCmd((yyvsp[(1) - (2)].integer));;} break; case 787: #line 1891 "frame/parser.Y" {fr->markerAnnulusDeleteRadiusCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 788: #line 1893 "frame/parser.Y" {fr->markerBoxAnnulusDeleteRadiusCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 789: #line 1894 "frame/parser.Y" {fr->markerBpandaDeleteCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 790: #line 1896 "frame/parser.Y" {fr->markerEllipseAnnulusDeleteRadiusCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 791: #line 1898 "frame/parser.Y" {fr->markerDeleteCallBackCmd((yyvsp[(1) - (5)].integer),(CallBack::Type)(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].str));;} break; case 792: #line 1899 "frame/parser.Y" {fr->markerEpandaDeleteCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 793: #line 1900 "frame/parser.Y" {fr->markerCpandaDeleteCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 794: #line 1902 "frame/parser.Y" {fr->markerPolygonDeleteVertexCmd((yyvsp[(1) - (5)].integer),(yyvsp[(5) - (5)].integer));;} break; case 795: #line 1904 "frame/parser.Y" {fr->markerSegmentDeleteVertexCmd((yyvsp[(1) - (5)].integer),(yyvsp[(5) - (5)].integer));;} break; case 796: #line 1905 "frame/parser.Y" {fr->markerDeleteTagCmd((yyvsp[(1) - (3)].integer));;} break; case 797: #line 1906 "frame/parser.Y" {fr->markerDeleteTagCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].str));;} break; case 798: #line 1907 "frame/parser.Y" {fr->markerDeleteTagCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 799: #line 1909 "frame/parser.Y" {fr->markerEditBeginCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 800: #line 1911 "frame/parser.Y" {fr->markerEllipseRadiusCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(4) - (6)].real), (yyvsp[(5) - (6)].real)), (Coord::InternalSystem)(yyvsp[(6) - (6)].integer));;} break; case 801: #line 1913 "frame/parser.Y" {fr->markerEllipseRadiusCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(4) - (7)].real), (yyvsp[(5) - (7)].real)), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyDist)(yyvsp[(7) - (7)].integer));;} break; case 802: #line 1917 "frame/parser.Y" {fr->markerEllipseAnnulusRadiusCmd((yyvsp[(1) - (8)].integer), Vector((yyvsp[(4) - (8)].real),(yyvsp[(5) - (8)].real)), Vector((yyvsp[(6) - (8)].real),(yyvsp[(6) - (8)].real)*(yyvsp[(5) - (8)].real)/(yyvsp[(4) - (8)].real)), (yyvsp[(7) - (8)].integer), (Coord::InternalSystem)(yyvsp[(8) - (8)].integer));;} break; case 803: #line 1921 "frame/parser.Y" {fr->markerEllipseAnnulusRadiusCmd((yyvsp[(1) - (9)].integer), Vector((yyvsp[(4) - (9)].real),(yyvsp[(5) - (9)].real)), Vector((yyvsp[(6) - (9)].real),(yyvsp[(6) - (9)].real)*(yyvsp[(5) - (9)].real)/(yyvsp[(4) - (9)].real)), (yyvsp[(7) - (9)].integer), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 804: #line 1924 "frame/parser.Y" {fr->markerEllipseAnnulusRadiusCmd((yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].str), (Coord::CoordSystem)(yyvsp[(5) - (6)].integer), (Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 805: #line 1927 "frame/parser.Y" {fr->markerEpandaEditCmd((yyvsp[(1) - (10)].integer), (yyvsp[(4) - (10)].real), (yyvsp[(5) - (10)].real), (yyvsp[(6) - (10)].integer), Vector((yyvsp[(7) - (10)].real),(yyvsp[(8) - (10)].real)), Vector((yyvsp[(9) - (10)].real),(yyvsp[(9) - (10)].real)*(yyvsp[(8) - (10)].real)/(yyvsp[(7) - (10)].real)), (yyvsp[(10) - (10)].integer));;} break; case 806: #line 1931 "frame/parser.Y" {fr->markerEpandaEditCmd((yyvsp[(1) - (11)].integer), (yyvsp[(4) - (11)].real), (yyvsp[(5) - (11)].real), (yyvsp[(6) - (11)].integer), Vector((yyvsp[(7) - (11)].real),(yyvsp[(8) - (11)].real)), Vector((yyvsp[(9) - (11)].real),(yyvsp[(9) - (11)].real)*(yyvsp[(8) - (11)].real)/(yyvsp[(7) - (11)].real)), (yyvsp[(10) - (11)].integer));;} break; case 807: #line 1935 "frame/parser.Y" {fr->markerEpandaEditCmd((yyvsp[(1) - (12)].integer), (yyvsp[(4) - (12)].real), (yyvsp[(5) - (12)].real), (yyvsp[(6) - (12)].integer), Vector((yyvsp[(7) - (12)].real),(yyvsp[(8) - (12)].real)), Vector((yyvsp[(9) - (12)].real),(yyvsp[(9) - (12)].real)*(yyvsp[(8) - (12)].real)/(yyvsp[(7) - (12)].real)), (yyvsp[(10) - (12)].integer), (Coord::CoordSystem)(yyvsp[(11) - (12)].integer), (Coord::SkyFrame)(yyvsp[(12) - (12)].integer));;} break; case 808: #line 1940 "frame/parser.Y" {fr->markerEpandaEditCmd((yyvsp[(1) - (9)].integer), (yyvsp[(4) - (9)].str), (yyvsp[(5) - (9)].str), (Coord::CoordSystem)(yyvsp[(6) - (9)].integer), (Coord::SkyFrame)(yyvsp[(7) - (9)].integer), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 809: #line 1944 "frame/parser.Y" {fr->markerFontCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 810: #line 1945 "frame/parser.Y" {fr->markerHighliteCmd((yyvsp[(1) - (2)].integer));;} break; case 811: #line 1946 "frame/parser.Y" {fr->markerHighliteOnlyCmd((yyvsp[(1) - (3)].integer));;} break; case 812: #line 1948 "frame/parser.Y" {fr->markerLineArrowCmd((yyvsp[(1) - (5)].integer),(yyvsp[(4) - (5)].integer),(yyvsp[(5) - (5)].integer));;} break; case 813: #line 1950 "frame/parser.Y" {fr->markerLineCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(5) - (6)].vector)), Vector((yyvsp[(6) - (6)].vector)), (Coord::InternalSystem)(yyvsp[(4) - (6)].integer));;} break; case 814: #line 1952 "frame/parser.Y" {fr->markerLineCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(6) - (7)].vector)), Vector((yyvsp[(7) - (7)].vector)), (Coord::CoordSystem)(yyvsp[(4) - (7)].integer), (Coord::SkyFrame)(yyvsp[(5) - (7)].integer));;} break; case 815: #line 1956 "frame/parser.Y" {fr->markerMoveCmd((yyvsp[(1) - (4)].integer), Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 816: #line 1957 "frame/parser.Y" {fr->markerFrontCmd((yyvsp[(1) - (3)].integer));;} break; case 817: #line 1958 "frame/parser.Y" {fr->markerBackCmd((yyvsp[(1) - (3)].integer));;} break; case 818: #line 1960 "frame/parser.Y" {fr->markerMoveToCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)), (Coord::InternalSystem)(yyvsp[(4) - (6)].integer));;} break; case 819: #line 1962 "frame/parser.Y" {fr->markerMoveToCmd((yyvsp[(1) - (6)].integer),Vector((yyvsp[(6) - (6)].vector)),(Coord::CoordSystem)(yyvsp[(4) - (6)].integer),(Coord::SkyFrame)(yyvsp[(5) - (6)].integer));;} break; case 820: #line 1965 "frame/parser.Y" {fr->markerPolygonResetCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)),(Coord::InternalSystem)(yyvsp[(6) - (6)].integer));;} break; case 821: #line 1967 "frame/parser.Y" {fr->markerPolygonResetCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyDist)(yyvsp[(7) - (7)].integer));;} break; case 822: #line 1970 "frame/parser.Y" {fr->markerSegmentResetCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)),(Coord::InternalSystem)(yyvsp[(6) - (6)].integer));;} break; case 823: #line 1972 "frame/parser.Y" {fr->markerSegmentResetCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyDist)(yyvsp[(7) - (7)].integer));;} break; case 824: #line 1975 "frame/parser.Y" {fr->markerPointShapeCmd((yyvsp[(1) - (4)].integer),(Point::PointShape)(yyvsp[(4) - (4)].integer));;} break; case 825: #line 1976 "frame/parser.Y" {fr->markerPointSizeCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 826: #line 1979 "frame/parser.Y" {fr->markerProjectionCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(4) - (6)].vector)), Vector((yyvsp[(5) - (6)].vector)), (Coord::InternalSystem)(yyvsp[(3) - (6)].integer), (yyvsp[(6) - (6)].real));;} break; case 827: #line 1983 "frame/parser.Y" {fr->markerProjectionCmd((yyvsp[(1) - (9)].integer), Vector((yyvsp[(5) - (9)].vector)), Vector((yyvsp[(6) - (9)].vector)), (Coord::CoordSystem)(yyvsp[(3) - (9)].integer), (Coord::SkyFrame)(yyvsp[(4) - (9)].integer), (yyvsp[(7) - (9)].real), (Coord::CoordSystem)(yyvsp[(8) - (9)].integer), (Coord::SkyDist)(yyvsp[(9) - (9)].integer));;} break; case 828: #line 1987 "frame/parser.Y" {fr->markerPropertyCmd((yyvsp[(1) - (4)].integer),(yyvsp[(3) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 829: #line 1989 "frame/parser.Y" {fr->markerRotateBeginCmd((yyvsp[(1) - (3)].integer));;} break; case 830: #line 1991 "frame/parser.Y" {fr->markerRulerPointCmd((yyvsp[(1) - (6)].integer), Vector((yyvsp[(5) - (6)].vector)), Vector((yyvsp[(6) - (6)].vector)), (Coord::InternalSystem)(yyvsp[(4) - (6)].integer));;} break; case 831: #line 1994 "frame/parser.Y" {fr->markerRulerPointCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(6) - (7)].vector)), Vector((yyvsp[(7) - (7)].vector)), (Coord::CoordSystem)(yyvsp[(4) - (7)].integer), (Coord::SkyFrame)(yyvsp[(5) - (7)].integer));;} break; case 832: #line 1997 "frame/parser.Y" {fr->markerRulerSystemCmd((yyvsp[(1) - (7)].integer), (Coord::CoordSystem)(yyvsp[(4) - (7)].integer), (Coord::SkyFrame)(yyvsp[(5) - (7)].integer), (Coord::CoordSystem)(yyvsp[(6) - (7)].integer), (Coord::SkyDist)(yyvsp[(7) - (7)].integer));;} break; case 833: #line 2000 "frame/parser.Y" {fr->markerSelectCmd((yyvsp[(1) - (2)].integer));;} break; case 834: #line 2001 "frame/parser.Y" {fr->markerSelectOnlyCmd((yyvsp[(1) - (3)].integer));;} break; case 835: #line 2003 "frame/parser.Y" {fr->markerTagCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 836: #line 2004 "frame/parser.Y" {fr->markerTextCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 837: #line 2005 "frame/parser.Y" {fr->markerTextRotateCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 838: #line 2007 "frame/parser.Y" {fr->markerUnhighliteCmd((yyvsp[(1) - (2)].integer));;} break; case 839: #line 2008 "frame/parser.Y" {fr->markerUnselectCmd((yyvsp[(1) - (2)].integer));;} break; case 840: #line 2010 "frame/parser.Y" {fr->markerVectorArrowCmd((yyvsp[(1) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 841: #line 2012 "frame/parser.Y" {fr->markerVectorCmd((yyvsp[(1) - (7)].integer), Vector((yyvsp[(5) - (7)].vector)), (Coord::InternalSystem)(yyvsp[(4) - (7)].integer), (yyvsp[(6) - (7)].real), (yyvsp[(7) - (7)].real));;} break; case 842: #line 2015 "frame/parser.Y" {fr->markerVectorCmd((yyvsp[(1) - (10)].integer), Vector((yyvsp[(6) - (10)].vector)), (Coord::CoordSystem)(yyvsp[(4) - (10)].integer), (Coord::SkyFrame)(yyvsp[(5) - (10)].integer), (yyvsp[(9) - (10)].real), (Coord::CoordSystem)(yyvsp[(7) - (10)].integer), (Coord::SkyDist)(yyvsp[(8) - (10)].integer), (yyvsp[(10) - (10)].real));;} break; case 843: #line 2018 "frame/parser.Y" {fr->markerLineWidthCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 844: #line 2020 "frame/parser.Y" {fr->markerKeyCmd();;} break; case 845: #line 2021 "frame/parser.Y" {fr->markerKeyCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 849: #line 2026 "frame/parser.Y" {fr->markerPreserveCmd((yyvsp[(2) - (2)].integer));;} break; case 850: #line 2027 "frame/parser.Y" {fr->markerPropertyCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 851: #line 2029 "frame/parser.Y" {fr->markerPropertyCmd((yyvsp[(2) - (5)].integer),(yyvsp[(3) - (5)].integer),Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)));;} break; case 852: #line 2031 "frame/parser.Y" {fr->markerRotateBeginCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 853: #line 2033 "frame/parser.Y" {fr->markerRotateMotionCmd(Vector((yyvsp[(3) - (5)].real),(yyvsp[(4) - (5)].real)),(yyvsp[(5) - (5)].integer));;} break; case 854: #line 2034 "frame/parser.Y" {fr->markerRotateEndCmd();;} break; case 855: #line 2036 "frame/parser.Y" {fr->markerSaveCmd((yyvsp[(2) - (7)].str), (Base::MarkerFormat)(yyvsp[(3) - (7)].integer), (Coord::CoordSystem)(yyvsp[(4) - (7)].integer), (Coord::SkyFrame)(yyvsp[(5) - (7)].integer), (Coord::SkyFormat)(yyvsp[(6) - (7)].integer), (yyvsp[(7) - (7)].integer));;} break; case 856: #line 2038 "frame/parser.Y" {fr->markerSaveTemplateCmd((yyvsp[(3) - (3)].str));;} break; case 859: #line 2043 "frame/parser.Y" {fr->markerColorCmd((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str));;} break; case 860: #line 2044 "frame/parser.Y" {fr->markerCopyCmd((yyvsp[(1) - (2)].str));;} break; case 861: #line 2045 "frame/parser.Y" {fr->markerDeleteCmd((yyvsp[(1) - (2)].str));;} break; case 862: #line 2046 "frame/parser.Y" {fr->markerCutCmd((yyvsp[(1) - (2)].str));;} break; case 863: #line 2047 "frame/parser.Y" {fr->markerFontCmd((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str));;} break; case 864: #line 2048 "frame/parser.Y" {fr->markerHighliteCmd((yyvsp[(1) - (2)].str));;} break; case 865: #line 2049 "frame/parser.Y" {fr->markerHighliteOnlyCmd((yyvsp[(1) - (3)].str));;} break; case 866: #line 2050 "frame/parser.Y" {fr->markerMoveCmd((yyvsp[(1) - (4)].str),Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 867: #line 2051 "frame/parser.Y" {fr->markerFrontCmd((yyvsp[(1) - (3)].str));;} break; case 868: #line 2052 "frame/parser.Y" {fr->markerBackCmd((yyvsp[(1) - (3)].str));;} break; case 869: #line 2054 "frame/parser.Y" {fr->markerMoveToCmd((yyvsp[(1) - (5)].str),Vector((yyvsp[(5) - (5)].vector)),(Coord::InternalSystem)(yyvsp[(4) - (5)].integer));;} break; case 870: #line 2056 "frame/parser.Y" {fr->markerMoveToCmd((yyvsp[(1) - (6)].str),Vector((yyvsp[(6) - (6)].vector)),(Coord::CoordSystem)(yyvsp[(4) - (6)].integer),(Coord::SkyFrame)(yyvsp[(5) - (6)].integer));;} break; case 871: #line 2058 "frame/parser.Y" {fr->markerPropertyCmd((yyvsp[(1) - (4)].str),(yyvsp[(3) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 872: #line 2059 "frame/parser.Y" {fr->markerSelectCmd((yyvsp[(1) - (2)].str));;} break; case 873: #line 2060 "frame/parser.Y" {fr->markerSelectOnlyCmd((yyvsp[(1) - (3)].str));;} break; case 874: #line 2061 "frame/parser.Y" {fr->markerUnhighliteCmd((yyvsp[(1) - (2)].str));;} break; case 875: #line 2062 "frame/parser.Y" {fr->markerUnselectCmd((yyvsp[(1) - (2)].str));;} break; case 876: #line 2064 "frame/parser.Y" {fr->markerTagEditCmd((yyvsp[(3) - (4)].str),(yyvsp[(4) - (4)].str));;} break; case 877: #line 2065 "frame/parser.Y" {fr->markerTagDeleteCmd((yyvsp[(3) - (3)].str));;} break; case 878: #line 2066 "frame/parser.Y" {fr->markerTagDeleteAllCmd();;} break; case 879: #line 2067 "frame/parser.Y" {fr->markerTagCmd((yyvsp[(2) - (2)].str));;} break; case 880: #line 2068 "frame/parser.Y" {fr->markerTagUpdateCmd((yyvsp[(3) - (3)].str));;} break; case 881: #line 2070 "frame/parser.Y" {fr->markerPasteCmd();;} break; case 882: #line 2072 "frame/parser.Y" {fr->markerPasteCmd((Coord::CoordSystem)(yyvsp[(2) - (3)].integer), (Coord::CoordSystem)(yyvsp[(3) - (3)].integer));;} break; case 883: #line 2073 "frame/parser.Y" {fr->markerUndoCmd();;} break; case 884: #line 2074 "frame/parser.Y" {fr->markerUnhighliteAllCmd();;} break; case 885: #line 2075 "frame/parser.Y" {fr->markerUnselectAllCmd();;} break; case 886: #line 2076 "frame/parser.Y" {fr->markerLineWidthCmd((yyvsp[(2) - (2)].integer));;} break; case 887: #line 2079 "frame/parser.Y" {(yyval.integer) = CallBack::SELECTCB;;} break; case 888: #line 2080 "frame/parser.Y" {(yyval.integer) = CallBack::UNSELECTCB;;} break; case 889: #line 2081 "frame/parser.Y" {(yyval.integer) = CallBack::HIGHLITECB;;} break; case 890: #line 2082 "frame/parser.Y" {(yyval.integer) = CallBack::UNHIGHLITECB;;} break; case 891: #line 2083 "frame/parser.Y" {(yyval.integer) = CallBack::MOVEBEGINCB;;} break; case 892: #line 2084 "frame/parser.Y" {(yyval.integer) = CallBack::MOVECB;;} break; case 893: #line 2085 "frame/parser.Y" {(yyval.integer) = CallBack::MOVEENDCB;;} break; case 894: #line 2086 "frame/parser.Y" {(yyval.integer) = CallBack::EDITBEGINCB;;} break; case 895: #line 2087 "frame/parser.Y" {(yyval.integer) = CallBack::EDITCB;;} break; case 896: #line 2088 "frame/parser.Y" {(yyval.integer) = CallBack::EDITENDCB;;} break; case 897: #line 2089 "frame/parser.Y" {(yyval.integer) = CallBack::ROTATEBEGINCB;;} break; case 898: #line 2090 "frame/parser.Y" {(yyval.integer) = CallBack::ROTATECB;;} break; case 899: #line 2091 "frame/parser.Y" {(yyval.integer) = CallBack::ROTATEENDCB;;} break; case 900: #line 2092 "frame/parser.Y" {(yyval.integer) = CallBack::DELETECB;;} break; case 901: #line 2093 "frame/parser.Y" {(yyval.integer) = CallBack::TEXTCB;;} break; case 902: #line 2094 "frame/parser.Y" {(yyval.integer) = CallBack::COLORCB;;} break; case 903: #line 2095 "frame/parser.Y" {(yyval.integer) = CallBack::LINEWIDTHCB;;} break; case 904: #line 2096 "frame/parser.Y" {(yyval.integer) = CallBack::PROPERTYCB;;} break; case 905: #line 2097 "frame/parser.Y" {(yyval.integer) = CallBack::FONTCB;;} break; case 906: #line 2098 "frame/parser.Y" {(yyval.integer) = CallBack::KEYCB;;} break; case 907: #line 2099 "frame/parser.Y" {(yyval.integer) = CallBack::UPDATECB;;} break; case 908: #line 2102 "frame/parser.Y" {fr->markerCentroidCmd();;} break; case 909: #line 2103 "frame/parser.Y" {fr->markerCentroidCmd((yyvsp[(1) - (1)].integer));;} break; case 910: #line 2104 "frame/parser.Y" {fr->markerCentroidAutoCmd((yyvsp[(2) - (2)].integer));;} break; case 911: #line 2105 "frame/parser.Y" {fr->markerCentroidRadiusCmd((yyvsp[(2) - (2)].real));;} break; case 912: #line 2106 "frame/parser.Y" {fr->markerCentroidIterationCmd((yyvsp[(2) - (2)].integer));;} break; case 913: #line 2107 "frame/parser.Y" { fr->markerCentroidIterationCmd((yyvsp[(2) - (3)].integer)); fr->markerCentroidRadiusCmd((yyvsp[(3) - (3)].real)); ;} break; case 914: #line 2117 "frame/parser.Y" {fr->createCircleCmd(fr->mapToRef(Vector((yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real)),Coord::CANVAS), (yyvsp[(4) - (5)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 915: #line 2125 "frame/parser.Y" {fr->createEllipseCmd(fr->mapToRef(Vector((yyvsp[(2) - (7)].real),(yyvsp[(3) - (7)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)), (yyvsp[(6) - (7)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 916: #line 2134 "frame/parser.Y" {fr->createBoxCmd(fr->mapToRef(Vector((yyvsp[(2) - (7)].real),(yyvsp[(3) - (7)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)), (yyvsp[(6) - (7)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 917: #line 2142 "frame/parser.Y" {fr->createPolygonCmd(fr->mapToRef(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 918: #line 2149 "frame/parser.Y" {fr->createSegmentCmd(fr->mapToRef(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 919: #line 2156 "frame/parser.Y" {fr->createLineCmd(fr->mapToRef(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)),Coord::CANVAS), fr->mapToRef(Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)),Coord::CANVAS), 0, 0, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 920: #line 2164 "frame/parser.Y" {fr->createVectCmd(fr->mapToRef(Vector((yyvsp[(2) - (6)].real),(yyvsp[(3) - (6)].real)),Coord::CANVAS), fr->mapToRef(Vector((yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real)),Coord::CANVAS), 1, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 921: #line 2172 "frame/parser.Y" {fr->createTextCmd(fr->mapToRef(Vector((yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real)),Coord::CANVAS), (yyvsp[(4) - (5)].real), 1, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 922: #line 2177 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::CIRCLE, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 923: #line 2182 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::BOX, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 924: #line 2187 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::DIAMOND, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 925: #line 2192 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::CROSS, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 926: #line 2197 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::EX, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 927: #line 2202 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::ARROW, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 928: #line 2207 "frame/parser.Y" {fr->createPointCmd(fr->mapToRef(Vector((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real)),Coord::CANVAS), Point::BOXCIRCLE, (yyvsp[(5) - (6)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 929: #line 2216 "frame/parser.Y" {fr->createRulerCmd(fr->mapToRef(Vector((yyvsp[(2) - (10)].real),(yyvsp[(3) - (10)].real)),Coord::CANVAS), fr->mapToRef(Vector((yyvsp[(4) - (10)].real),(yyvsp[(5) - (10)].real)),Coord::CANVAS), (Coord::CoordSystem)(yyvsp[(6) - (10)].integer), (Coord::SkyFrame)(yyvsp[(7) - (10)].integer), (Coord::CoordSystem)(yyvsp[(8) - (10)].integer), (Coord::SkyDist)(yyvsp[(9) - (10)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 930: #line 2225 "frame/parser.Y" {fr->createCompassCmd(fr->mapToRef(Vector((yyvsp[(2) - (7)].real),(yyvsp[(3) - (7)].real)),Coord::CANVAS), (yyvsp[(4) - (7)].real), "N", "E", 1, 1, (Coord::CoordSystem)(yyvsp[(5) - (7)].integer), (Coord::SkyFrame)(yyvsp[(6) - (7)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 931: #line 2235 "frame/parser.Y" {fr->createProjectionCmd(fr->mapToRef(Vector((yyvsp[(2) - (7)].real),(yyvsp[(3) - (7)].real)),Coord::CANVAS), fr->mapToRef(Vector((yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real)),Coord::CANVAS), (yyvsp[(6) - (7)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 932: #line 2244 "frame/parser.Y" {fr->createAnnulusCmd(fr->mapToRef(Vector((yyvsp[(2) - (7)].real),(yyvsp[(3) - (7)].real)),Coord::CANVAS), (yyvsp[(4) - (7)].real),(yyvsp[(5) - (7)].real),(yyvsp[(6) - (7)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 933: #line 2252 "frame/parser.Y" {fr->createEllipseAnnulusCmd(fr->mapToRef(Vector((yyvsp[(2) - (9)].real),(yyvsp[(3) - (9)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (9)].real),(yyvsp[(5) - (9)].real)), Vector((yyvsp[(6) - (9)].real),(yyvsp[(6) - (9)].real)*(yyvsp[(4) - (9)].real)/(yyvsp[(5) - (9)].real)),(yyvsp[(7) - (9)].integer), (yyvsp[(8) - (9)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 934: #line 2262 "frame/parser.Y" {fr->createBoxAnnulusCmd(fr->mapToRef(Vector((yyvsp[(2) - (9)].real),(yyvsp[(3) - (9)].real)),Coord::CANVAS), Vector((yyvsp[(4) - (9)].real),(yyvsp[(5) - (9)].real)),Vector((yyvsp[(6) - (9)].real),(yyvsp[(6) - (9)].real)*(yyvsp[(4) - (9)].real)/(yyvsp[(5) - (9)].real)),(yyvsp[(7) - (9)].integer), (yyvsp[(8) - (9)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 935: #line 2272 "frame/parser.Y" {fr->createCpandaCmd(fr->mapToRef(Vector((yyvsp[(2) - (10)].real),(yyvsp[(3) - (10)].real)),Coord::CANVAS), (yyvsp[(4) - (10)].real),(yyvsp[(5) - (10)].real),(yyvsp[(6) - (10)].integer), (yyvsp[(7) - (10)].real),(yyvsp[(8) - (10)].real),(yyvsp[(9) - (10)].integer), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 936: #line 2282 "frame/parser.Y" {fr->createEpandaCmd(fr->mapToRef(Vector((yyvsp[(2) - (12)].real),(yyvsp[(3) - (12)].real)),Coord::CANVAS), (yyvsp[(4) - (12)].real),(yyvsp[(5) - (12)].real),(yyvsp[(6) - (12)].integer), Vector((yyvsp[(7) - (12)].real),(yyvsp[(8) - (12)].real)), Vector((yyvsp[(9) - (12)].real),(yyvsp[(9) - (12)].real)*(yyvsp[(7) - (12)].real)/(yyvsp[(8) - (12)].real)),(yyvsp[(10) - (12)].integer), (yyvsp[(11) - (12)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 937: #line 2294 "frame/parser.Y" {fr->createBpandaCmd(fr->mapToRef(Vector((yyvsp[(2) - (12)].real),(yyvsp[(3) - (12)].real)),Coord::CANVAS), (yyvsp[(4) - (12)].real),(yyvsp[(5) - (12)].real),(yyvsp[(6) - (12)].integer), Vector((yyvsp[(7) - (12)].real),(yyvsp[(8) - (12)].real)), Vector((yyvsp[(9) - (12)].real),(yyvsp[(9) - (12)].real)*(yyvsp[(7) - (12)].real)/(yyvsp[(8) - (12)].real)),(yyvsp[(10) - (12)].integer), (yyvsp[(11) - (12)].real), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 938: #line 2303 "frame/parser.Y" {fr->createCompositeCmd( currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);;} break; case 940: #line 2311 "frame/parser.Y" {fr->createTemplateCmd(fr->mapToRef(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)),Coord::CANVAS), (yyvsp[(1) - (3)].str));;} break; case 941: #line 2313 "frame/parser.Y" {fr->createTemplateVarCmd(fr->mapToRef(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)),Coord::CANVAS), (yyvsp[(2) - (4)].str));;} break; case 942: #line 2315 "frame/parser.Y" { // backward compatibility fr->createTemplateVarCmd(fr->mapToRef(Vector((yyvsp[(1) - (4)].real),(yyvsp[(2) - (4)].real)),Coord::CANVAS), (yyvsp[(4) - (4)].str)); ;} break; case 943: #line 2320 "frame/parser.Y" {fr->createTemplateCmd(Vector((yyvsp[(4) - (4)].vector)),(Coord::CoordSystem)(yyvsp[(2) - (4)].integer),(Coord::SkyFrame)(yyvsp[(3) - (4)].integer), (yyvsp[(1) - (4)].str));;} break; case 944: #line 2323 "frame/parser.Y" {(yyval.dash)[0] = (yyvsp[(1) - (2)].integer); (yyval.dash)[1] = (yyvsp[(2) - (2)].integer);;} break; case 945: #line 2327 "frame/parser.Y" {fr->markerEditBeginCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].integer));;} break; case 946: #line 2329 "frame/parser.Y" {fr->markerEditMotionCmd(Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].integer));;} break; case 947: #line 2330 "frame/parser.Y" {fr->markerEditEndCmd();;} break; case 948: #line 2333 "frame/parser.Y" {(yyval.integer) = Base::DS9;;} break; case 949: #line 2334 "frame/parser.Y" {(yyval.integer) = Base::XML;;} break; case 950: #line 2335 "frame/parser.Y" {(yyval.integer) = Base::CIAO;;} break; case 951: #line 2336 "frame/parser.Y" {(yyval.integer) = Base::SAOTNG;;} break; case 952: #line 2337 "frame/parser.Y" {(yyval.integer) = Base::SAOIMAGE;;} break; case 953: #line 2338 "frame/parser.Y" {(yyval.integer) = Base::PROS;;} break; case 954: #line 2339 "frame/parser.Y" {(yyval.integer) = Base::RAWXY;;} break; case 956: #line 2343 "frame/parser.Y" {fr->getMarkerColorCmd();;} break; case 957: #line 2344 "frame/parser.Y" {fr->getMarkerFontCmd();;} break; case 958: #line 2345 "frame/parser.Y" {fr->getMarkerEpsilonCmd();;} break; case 959: #line 2346 "frame/parser.Y" {fr->getMarkerHandleCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 960: #line 2347 "frame/parser.Y" {fr->getMarkerIdCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 961: #line 2350 "frame/parser.Y" {fr->getMarkerAnalysisPandaCmd((Coord::CoordSystem)(yyvsp[(4) - (4)].integer));;} break; case 962: #line 2352 "frame/parser.Y" {fr->getMarkerAnalysisHistogramCmd((yyvsp[(4) - (6)].str),(yyvsp[(5) - (6)].str),(yyvsp[(6) - (6)].integer));;} break; case 963: #line 2354 "frame/parser.Y" {fr->getMarkerAnalysisPlot2dCmd((yyvsp[(4) - (10)].str),(yyvsp[(5) - (10)].str),(yyvsp[(6) - (10)].str),(yyvsp[(7) - (10)].str),(Coord::CoordSystem)(yyvsp[(8) - (10)].integer), (Coord::SkyFrame)(yyvsp[(9) - (10)].integer), (Marker::AnalysisMethod)(yyvsp[(10) - (10)].integer));;} break; case 964: #line 2356 "frame/parser.Y" {fr->getMarkerAnalysisPlot3dCmd((yyvsp[(4) - (7)].str),(yyvsp[(5) - (7)].str),(Coord::CoordSystem)(yyvsp[(6) - (7)].integer),(Marker::AnalysisMethod)(yyvsp[(7) - (7)].integer));;} break; case 965: #line 2358 "frame/parser.Y" {fr->getMarkerAnalysisRadialCmd((yyvsp[(4) - (7)].str),(yyvsp[(5) - (7)].str),(yyvsp[(6) - (7)].str),(Coord::CoordSystem)(yyvsp[(7) - (7)].integer));;} break; case 966: #line 2360 "frame/parser.Y" {fr->getMarkerAnalysisStatsCmd((Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 967: #line 2363 "frame/parser.Y" {fr->getMarkerAnalysisPandaCmd((yyvsp[(1) - (4)].integer),(Coord::CoordSystem)(yyvsp[(4) - (4)].integer));;} break; case 968: #line 2365 "frame/parser.Y" {fr->getMarkerAnalysisHistogramCmd((yyvsp[(1) - (6)].integer),(yyvsp[(4) - (6)].str),(yyvsp[(5) - (6)].str),(yyvsp[(6) - (6)].integer));;} break; case 969: #line 2367 "frame/parser.Y" {fr->getMarkerAnalysisPlot2dCmd((yyvsp[(1) - (10)].integer),(yyvsp[(4) - (10)].str),(yyvsp[(5) - (10)].str),(yyvsp[(6) - (10)].str),(yyvsp[(7) - (10)].str),(Coord::CoordSystem)(yyvsp[(8) - (10)].integer), (Coord::SkyFrame)(yyvsp[(9) - (10)].integer), (Marker::AnalysisMethod)(yyvsp[(10) - (10)].integer));;} break; case 970: #line 2369 "frame/parser.Y" {fr->getMarkerAnalysisPlot3dCmd((yyvsp[(1) - (7)].integer),(yyvsp[(4) - (7)].str),(yyvsp[(5) - (7)].str),(Coord::CoordSystem)(yyvsp[(6) - (7)].integer),(Marker::AnalysisMethod)(yyvsp[(7) - (7)].integer));;} break; case 971: #line 2371 "frame/parser.Y" {fr->getMarkerAnalysisRadialCmd((yyvsp[(1) - (7)].integer),(yyvsp[(4) - (7)].str),(yyvsp[(5) - (7)].str),(yyvsp[(6) - (7)].str),(Coord::CoordSystem)(yyvsp[(7) - (7)].integer));;} break; case 972: #line 2373 "frame/parser.Y" {fr->getMarkerAnalysisStatsCmd((yyvsp[(1) - (5)].integer),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 973: #line 2375 "frame/parser.Y" {fr->getMarkerIdAllCmd();;} break; case 974: #line 2376 "frame/parser.Y" {fr->getMarkerAngleCmd((yyvsp[(1) - (2)].integer));;} break; case 975: #line 2377 "frame/parser.Y" {fr->getMarkerAngleCmd((yyvsp[(1) - (3)].integer));;} break; case 976: #line 2379 "frame/parser.Y" {fr->getMarkerAngleCmd((yyvsp[(1) - (4)].integer),(Coord::CoordSystem)(yyvsp[(3) - (4)].integer), (Coord::SkyFrame)(yyvsp[(4) - (4)].integer));;} break; case 977: #line 2381 "frame/parser.Y" {fr->getMarkerAnnulusRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 978: #line 2383 "frame/parser.Y" {fr->getMarkerAnnulusRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 979: #line 2386 "frame/parser.Y" {fr->getMarkerBoxAnnulusRadiusCmd((yyvsp[(1) - (4)].integer),(Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 980: #line 2388 "frame/parser.Y" {fr->getMarkerBoxAnnulusRadiusCmd((yyvsp[(1) - (5)].integer),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer),(Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 981: #line 2390 "frame/parser.Y" {fr->getMarkerBoxRadiusCmd((yyvsp[(1) - (4)].integer),(Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 982: #line 2392 "frame/parser.Y" {fr->getMarkerBoxRadiusCmd((yyvsp[(1) - (5)].integer),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 983: #line 2393 "frame/parser.Y" {fr->getMarkerBpandaAnglesCmd((yyvsp[(1) - (3)].integer));;} break; case 984: #line 2394 "frame/parser.Y" {fr->getMarkerBpandaAnglesCmd((yyvsp[(1) - (4)].integer));;} break; case 985: #line 2396 "frame/parser.Y" {fr->getMarkerBpandaAnglesCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 986: #line 2398 "frame/parser.Y" {fr->getMarkerBpandaRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 987: #line 2400 "frame/parser.Y" {fr->getMarkerBpandaRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 988: #line 2403 "frame/parser.Y" {fr->getMarkerCenterCmd((yyvsp[(1) - (3)].integer), (Coord::InternalSystem)(yyvsp[(3) - (3)].integer));;} break; case 989: #line 2405 "frame/parser.Y" {fr->getMarkerCenterCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(3) - (5)].integer), (Coord::SkyFrame)(yyvsp[(4) - (5)].integer), (Coord::SkyFormat)(yyvsp[(5) - (5)].integer));;} break; case 990: #line 2408 "frame/parser.Y" {fr->getMarkerCircleRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 991: #line 2410 "frame/parser.Y" {fr->getMarkerCircleRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 992: #line 2411 "frame/parser.Y" {fr->getMarkerColorCmd((yyvsp[(1) - (2)].integer));;} break; case 993: #line 2412 "frame/parser.Y" {fr->getMarkerCompassArrowCmd((yyvsp[(1) - (3)].integer));;} break; case 994: #line 2413 "frame/parser.Y" {fr->getMarkerCompassLabelCmd((yyvsp[(1) - (3)].integer));;} break; case 995: #line 2415 "frame/parser.Y" {fr->getMarkerCompassRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 996: #line 2417 "frame/parser.Y" {fr->getMarkerCompassRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 997: #line 2418 "frame/parser.Y" {fr->getMarkerCompassSystemCmd((yyvsp[(1) - (3)].integer));;} break; case 998: #line 2419 "frame/parser.Y" {fr->getMarkerCompositeCmd((yyvsp[(1) - (3)].integer));;} break; case 999: #line 2420 "frame/parser.Y" {fr->getMarkerCpandaAnglesCmd((yyvsp[(1) - (3)].integer));;} break; case 1000: #line 2421 "frame/parser.Y" {fr->getMarkerCpandaAnglesCmd((yyvsp[(1) - (4)].integer));;} break; case 1001: #line 2423 "frame/parser.Y" {fr->getMarkerCpandaAnglesCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 1002: #line 2425 "frame/parser.Y" {fr->getMarkerCpandaRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1003: #line 2427 "frame/parser.Y" {fr->getMarkerCpandaRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1004: #line 2429 "frame/parser.Y" {fr->getMarkerEllipseRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1005: #line 2431 "frame/parser.Y" {fr->getMarkerEllipseRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1006: #line 2433 "frame/parser.Y" {fr->getMarkerEllipseAnnulusRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1007: #line 2435 "frame/parser.Y" {fr->getMarkerEllipseAnnulusRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1008: #line 2437 "frame/parser.Y" {fr->getMarkerEpandaAnglesCmd((yyvsp[(1) - (3)].integer));;} break; case 1009: #line 2438 "frame/parser.Y" {fr->getMarkerEpandaAnglesCmd((yyvsp[(1) - (4)].integer));;} break; case 1010: #line 2440 "frame/parser.Y" {fr->getMarkerEpandaAnglesCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyFrame)(yyvsp[(5) - (5)].integer));;} break; case 1011: #line 2442 "frame/parser.Y" {fr->getMarkerEpandaRadiusCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1012: #line 2444 "frame/parser.Y" {fr->getMarkerEpandaRadiusCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1013: #line 2445 "frame/parser.Y" {fr->getMarkerFontCmd((yyvsp[(1) - (2)].integer));;} break; case 1014: #line 2446 "frame/parser.Y" {fr->getMarkerHighlitedCmd((yyvsp[(1) - (2)].integer));;} break; case 1015: #line 2447 "frame/parser.Y" {fr->getMarkerLineArrowCmd((yyvsp[(1) - (3)].integer));;} break; case 1016: #line 2449 "frame/parser.Y" {fr->getMarkerLineLengthCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1017: #line 2451 "frame/parser.Y" {fr->getMarkerLineCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1018: #line 2453 "frame/parser.Y" {fr->getMarkerLineCmd((yyvsp[(1) - (6)].integer), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer), (Coord::SkyFormat)(yyvsp[(6) - (6)].integer));;} break; case 1019: #line 2456 "frame/parser.Y" {fr->getMarkerMapLenFromRefCmd((yyvsp[(1) - (6)].integer), (yyvsp[(4) - (6)].real), (Coord::CoordSystem)(yyvsp[(5) - (6)].integer),(Coord::SkyDist)(yyvsp[(6) - (6)].integer));;} break; case 1020: #line 2459 "frame/parser.Y" {fr->getMarkerPointShapeCmd((yyvsp[(1) - (3)].integer));;} break; case 1021: #line 2460 "frame/parser.Y" {fr->getMarkerPointSizeCmd((yyvsp[(1) - (3)].integer));;} break; case 1022: #line 2462 "frame/parser.Y" {fr->getMarkerProjectionPointsCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1023: #line 2464 "frame/parser.Y" {fr->getMarkerProjectionPointsCmd((yyvsp[(1) - (6)].integer), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer), (Coord::SkyFormat)(yyvsp[(6) - (6)].integer));;} break; case 1024: #line 2467 "frame/parser.Y" {fr->getMarkerProjectionLengthCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1025: #line 2470 "frame/parser.Y" {fr->getMarkerProjectionWidthCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1026: #line 2472 "frame/parser.Y" {fr->getMarkerProjectionWidthCmd((yyvsp[(1) - (5)].integer),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer),(Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1027: #line 2473 "frame/parser.Y" {fr->getMarkerPropertyCmd((yyvsp[(1) - (2)].integer));;} break; case 1028: #line 2474 "frame/parser.Y" {fr->getMarkerPropertyCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 1029: #line 2476 "frame/parser.Y" {fr->getMarkerRulerLengthCmd((yyvsp[(1) - (5)].integer),(Coord::CoordSystem)(yyvsp[(4) - (5)].integer),(Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1030: #line 2478 "frame/parser.Y" {fr->getMarkerRulerPointCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1031: #line 2480 "frame/parser.Y" {fr->getMarkerRulerPointCmd((yyvsp[(1) - (6)].integer), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer), (Coord::SkyFormat)(yyvsp[(6) - (6)].integer));;} break; case 1032: #line 2482 "frame/parser.Y" {fr->getMarkerRulerSystemCmd((yyvsp[(1) - (3)].integer));;} break; case 1033: #line 2483 "frame/parser.Y" {fr->getMarkerSelectedCmd((yyvsp[(1) - (2)].integer));;} break; case 1034: #line 2485 "frame/parser.Y" {fr->getMarkerTagCmd((yyvsp[(1) - (2)].integer));;} break; case 1035: #line 2486 "frame/parser.Y" {fr->getMarkerTagCmd((yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 1036: #line 2487 "frame/parser.Y" {fr->getMarkerTextCmd((yyvsp[(1) - (2)].integer));;} break; case 1037: #line 2488 "frame/parser.Y" {fr->getMarkerTextRotateCmd((yyvsp[(1) - (3)].integer));;} break; case 1038: #line 2489 "frame/parser.Y" {fr->getMarkerTypeCmd((yyvsp[(1) - (2)].integer));;} break; case 1039: #line 2491 "frame/parser.Y" {fr->getMarkerVectorArrowCmd((yyvsp[(1) - (3)].integer));;} break; case 1040: #line 2493 "frame/parser.Y" {fr->getMarkerVectorLengthCmd((yyvsp[(1) - (5)].integer), (Coord::CoordSystem)(yyvsp[(4) - (5)].integer), (Coord::SkyDist)(yyvsp[(5) - (5)].integer));;} break; case 1041: #line 2495 "frame/parser.Y" {fr->getMarkerVectorCmd((yyvsp[(1) - (4)].integer), (Coord::InternalSystem)(yyvsp[(4) - (4)].integer));;} break; case 1042: #line 2497 "frame/parser.Y" {fr->getMarkerVectorCmd((yyvsp[(1) - (6)].integer), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer), (Coord::SkyFormat)(yyvsp[(6) - (6)].integer));;} break; case 1043: #line 2499 "frame/parser.Y" {fr->getMarkerLineWidthCmd((yyvsp[(1) - (2)].integer));;} break; case 1045: #line 2501 "frame/parser.Y" {fr->getMarkerHighlitedNumberCmd();;} break; case 1046: #line 2502 "frame/parser.Y" {fr->getMarkerNumberCmd();;} break; case 1047: #line 2504 "frame/parser.Y" {fr->getMarkerPolygonSegmentCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 1048: #line 2506 "frame/parser.Y" {fr->getMarkerSegmentSegmentCmd(Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 1049: #line 2507 "frame/parser.Y" {fr->getMarkerPreserveCmd();;} break; case 1050: #line 2508 "frame/parser.Y" {fr->getMarkerPropertyCmd((yyvsp[(2) - (2)].integer));;} break; case 1052: #line 2510 "frame/parser.Y" {fr->getMarkerSelectedNumberCmd();;} break; case 1054: #line 2514 "frame/parser.Y" {fr->getMarkerColorCmd((yyvsp[(1) - (2)].str));;} break; case 1055: #line 2515 "frame/parser.Y" {fr->getMarkerFontCmd((yyvsp[(1) - (2)].str));;} break; case 1056: #line 2516 "frame/parser.Y" {fr->getMarkerIdCmd((yyvsp[(1) - (2)].str));;} break; case 1057: #line 2517 "frame/parser.Y" {fr->getMarkerPropertyCmd((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].integer));;} break; case 1058: #line 2518 "frame/parser.Y" {fr->getMarkerTagCmd((yyvsp[(1) - (2)].str));;} break; case 1059: #line 2519 "frame/parser.Y" {fr->getMarkerTagNumberCmd((yyvsp[(1) - (3)].str));;} break; case 1060: #line 2521 "frame/parser.Y" {fr->getMarkerTagsCmd();;} break; case 1061: #line 2522 "frame/parser.Y" {fr->getMarkerTagDefaultNameCmd();;} break; case 1062: #line 2524 "frame/parser.Y" {fr->getMarkerLineWidthCmd();;} break; case 1063: #line 2527 "frame/parser.Y" {fr->getMarkerCentroidAutoCmd();;} break; case 1064: #line 2528 "frame/parser.Y" {fr->getMarkerCentroidRadiusCmd();;} break; case 1065: #line 2529 "frame/parser.Y" {fr->getMarkerCentroidIterationCmd();;} break; case 1066: #line 2530 "frame/parser.Y" {fr->getMarkerCentroidOptionCmd();;} break; case 1067: #line 2533 "frame/parser.Y" {fr->getMarkerHighlitedCmd();;} break; case 1068: #line 2534 "frame/parser.Y" {fr->getMarkerHighlitedCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1069: #line 2537 "frame/parser.Y" {fr->getMarkerSelectedCmd();;} break; case 1070: #line 2538 "frame/parser.Y" {fr->getMarkerSelectedCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1071: #line 2541 "frame/parser.Y" {fr->getMarkerShowCmd();;} break; case 1072: #line 2542 "frame/parser.Y" {fr->getMarkerShowTextCmd();;} break; case 1073: #line 2545 "frame/parser.Y" { strncpy(currentFont, "helvetica 10 normal roman", 32); strncpy(currentColor, "green", 16); currentDash[0] = 8; currentDash[1] = 3; currentWidth = 1; strncpy(currentText, "", 80); currentProps = defaultProps; taglist.deleteAll(); cblist.deleteAll(); ;} break; case 1074: #line 2558 "frame/parser.Y" {fr->markerLayerCmd(Base::USER);;} break; case 1075: #line 2559 "frame/parser.Y" { // backward compatibility fr->markerLayerCmd(Base::USER); ;} break; case 1076: #line 2563 "frame/parser.Y" {fr->markerLayerCmd(Base::USER);;} break; case 1077: #line 2564 "frame/parser.Y" { // backward compatibility fr->markerLayerCmd(Base::USER); ;} break; case 1078: #line 2568 "frame/parser.Y" {fr->markerLayerCmd(Base::CATALOG);;} break; case 1079: #line 2569 "frame/parser.Y" {fr->markerLayerCmd(Base::ANALYSIS);;} break; case 1080: #line 2574 "frame/parser.Y" {fr->markerListCmd((Base::MarkerFormat)(yyvsp[(1) - (7)].integer), (Coord::CoordSystem)(yyvsp[(2) - (7)].integer), (Coord::SkyFrame)(yyvsp[(3) - (7)].integer), (Coord::SkyFormat)(yyvsp[(4) - (7)].integer), (yyvsp[(5) - (7)].integer), 0, propQMask, propQValue, taglist);;} break; case 1081: #line 2579 "frame/parser.Y" {fr->markerListCmd((Base::MarkerFormat)(yyvsp[(2) - (8)].integer), (Coord::CoordSystem)(yyvsp[(3) - (8)].integer), (Coord::SkyFrame)(yyvsp[(4) - (8)].integer), (Coord::SkyFormat)(yyvsp[(5) - (8)].integer), (yyvsp[(6) - (8)].integer), 1, propQMask, propQValue, taglist);;} break; case 1082: #line 2585 "frame/parser.Y" {fr->markerLoadCmd((Base::MarkerFormat)(yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].str));;} break; case 1083: #line 2587 "frame/parser.Y" {fr->markerLoadCmd((Base::MarkerFormat)(yyvsp[(1) - (4)].integer),(yyvsp[(2) - (4)].str), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer),(Coord::SkyFrame)(yyvsp[(4) - (4)].integer));;} break; case 1084: #line 2590 "frame/parser.Y" {fr->markerLoadCmd((Base::MarkerFormat)(yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 1085: #line 2592 "frame/parser.Y" {fr->markerLoadCmd((Base::MarkerFormat)(yyvsp[(1) - (4)].integer),(yyvsp[(2) - (4)].integer), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer),(Coord::SkyFrame)(yyvsp[(4) - (4)].integer));;} break; case 1086: #line 2595 "frame/parser.Y" {fr->markerLoadFitsCmd((yyvsp[(2) - (6)].str), (yyvsp[(3) - (6)].str), (yyvsp[(4) - (6)].dash), (yyvsp[(5) - (6)].integer), (yyvsp[(6) - (6)].str));;} break; case 1087: #line 2598 "frame/parser.Y" {fr->markerMoveCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1088: #line 2599 "frame/parser.Y" {fr->markerFrontCmd();;} break; case 1089: #line 2600 "frame/parser.Y" {fr->markerBackCmd();;} break; case 1090: #line 2601 "frame/parser.Y" {fr->markerMoveBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1091: #line 2602 "frame/parser.Y" {fr->markerMoveMotionCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1092: #line 2603 "frame/parser.Y" {fr->markerMoveEndCmd();;} break; case 1093: #line 2605 "frame/parser.Y" {fr->markerMoveToCmd(Vector((yyvsp[(3) - (3)].vector)), (Coord::InternalSystem)(yyvsp[(2) - (3)].integer));;} break; case 1094: #line 2607 "frame/parser.Y" {fr->markerMoveToCmd(Vector((yyvsp[(4) - (4)].vector)), (Coord::CoordSystem)(yyvsp[(2) - (4)].integer), (Coord::SkyFrame)(yyvsp[(3) - (4)].integer));;} break; case 1097: #line 2614 "frame/parser.Y" {setProps(¤tProps,(yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 1098: #line 2615 "frame/parser.Y" {strncpy(currentColor,(yyvsp[(3) - (3)].str),16);;} break; case 1099: #line 2616 "frame/parser.Y" {currentDash[0]=(yyvsp[(3) - (4)].integer);currentDash[1]=(yyvsp[(4) - (4)].integer);;} break; case 1100: #line 2617 "frame/parser.Y" {currentWidth = (yyvsp[(3) - (3)].integer);;} break; case 1101: #line 2618 "frame/parser.Y" {strncpy(currentFont,(yyvsp[(3) - (3)].str),32);;} break; case 1102: #line 2619 "frame/parser.Y" {strncpy(currentText,(yyvsp[(3) - (3)].str),80);;} break; case 1105: #line 2624 "frame/parser.Y" {(yyval.integer) = Marker::NONE;;} break; case 1106: #line 2625 "frame/parser.Y" {(yyval.integer) = Marker::SELECT;;} break; case 1107: #line 2626 "frame/parser.Y" {(yyval.integer) = Marker::HIGHLITE;;} break; case 1108: #line 2627 "frame/parser.Y" {(yyval.integer) = Marker::DASH;;} break; case 1109: #line 2628 "frame/parser.Y" {(yyval.integer) = Marker::FIXED;;} break; case 1110: #line 2629 "frame/parser.Y" {(yyval.integer) = Marker::EDIT;;} break; case 1111: #line 2630 "frame/parser.Y" {(yyval.integer) = Marker::MOVE;;} break; case 1112: #line 2631 "frame/parser.Y" {(yyval.integer) = Marker::ROTATE;;} break; case 1113: #line 2632 "frame/parser.Y" {(yyval.integer) = Marker::DELETE;;} break; case 1114: #line 2633 "frame/parser.Y" {(yyval.integer) = Marker::INCLUDE;;} break; case 1115: #line 2634 "frame/parser.Y" {(yyval.integer) = Marker::SOURCE;;} break; case 1118: #line 2641 "frame/parser.Y" {propQMask=0;propQValue=0;;} break; case 1119: #line 2642 "frame/parser.Y" {propQMask=0;propQValue=0;;} break; case 1121: #line 2645 "frame/parser.Y" {fr->markerSelectAllCmd();;} break; case 1122: #line 2646 "frame/parser.Y" {fr->markerSelectOnlyCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1123: #line 2647 "frame/parser.Y" {fr->markerSelectToggleCmd();;} break; case 1124: #line 2648 "frame/parser.Y" {fr->markerSelectToggleCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1125: #line 2651 "frame/parser.Y" {fr->markerShowCmd((yyvsp[(1) - (1)].integer));;} break; case 1126: #line 2652 "frame/parser.Y" {fr->markerShowTextCmd((yyvsp[(2) - (2)].integer));;} break; case 1129: #line 2660 "frame/parser.Y" {propQMask |= (yyvsp[(1) - (3)].integer); setProps(&propQValue,(yyvsp[(1) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 1130: #line 2663 "frame/parser.Y" {taglist.deleteAll();;} break; case 1131: #line 2664 "frame/parser.Y" {taglist.deleteAll();;} break; case 1135: #line 2671 "frame/parser.Y" {taglist.append(new Tag((yyvsp[(3) - (3)].str)));;} break; case 1136: #line 2674 "frame/parser.Y" {cblist.append( new CallBack(fr->getInterp(),(CallBack::Type)(yyvsp[(3) - (5)].integer),(yyvsp[(4) - (5)].str),(yyvsp[(5) - (5)].str)));;} break; case 1137: #line 2678 "frame/parser.Y" {fr->maskClearCmd();;} break; case 1138: #line 2679 "frame/parser.Y" {fr->maskColorCmd((yyvsp[(2) - (2)].str));;} break; case 1139: #line 2680 "frame/parser.Y" {fr->maskMarkCmd((yyvsp[(2) - (2)].integer));;} break; case 1140: #line 2681 "frame/parser.Y" {fr->maskTransparencyCmd((yyvsp[(2) - (2)].real));;} break; case 1141: #line 2684 "frame/parser.Y" {fr->orientCmd(Coord::XX);;} break; case 1142: #line 2685 "frame/parser.Y" {fr->orientCmd(Coord::YY);;} break; case 1143: #line 2686 "frame/parser.Y" {fr->orientCmd(Coord::XY);;} break; case 1144: #line 2687 "frame/parser.Y" {fr->orientCmd(Coord::NORMAL);;} break; case 1145: #line 2691 "frame/parser.Y" {fr->panCmd(Vector((yyvsp[(1) - (4)].real),(yyvsp[(2) - (4)].real)),Vector((yyvsp[(3) - (4)].real),(yyvsp[(4) - (4)].real)));;} break; case 1146: #line 2692 "frame/parser.Y" {fr->panCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1147: #line 2694 "frame/parser.Y" { // backward compatibility fr->panCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real))); ;} break; case 1148: #line 2699 "frame/parser.Y" {fr->panCmd(Vector((yyvsp[(3) - (3)].vector)), (Coord::CoordSystem)(yyvsp[(1) - (3)].integer), (Coord::SkyFrame)(yyvsp[(2) - (3)].integer));;} break; case 1150: #line 2701 "frame/parser.Y" {fr->panBBoxCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1152: #line 2703 "frame/parser.Y" {fr->panPreserveCmd((yyvsp[(2) - (2)].integer));;} break; case 1153: #line 2706 "frame/parser.Y" {fr->panToCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1154: #line 2708 "frame/parser.Y" { // backward compatibility fr->panToCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real))); ;} break; case 1155: #line 2713 "frame/parser.Y" {fr->panToCmd(Vector((yyvsp[(3) - (3)].vector)), (Coord::CoordSystem)(yyvsp[(1) - (3)].integer), (Coord::SkyFrame)(yyvsp[(2) - (3)].integer));;} break; case 1156: #line 2716 "frame/parser.Y" {fr->panBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1157: #line 2717 "frame/parser.Y" {fr->panMotionCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1158: #line 2718 "frame/parser.Y" {fr->panEndCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1159: #line 2721 "frame/parser.Y" {fr->pannerCmd((yyvsp[(1) - (1)].integer));;} break; case 1160: #line 2723 "frame/parser.Y" { // backward compatibility fr->pannerCmd((Coord::CoordSystem)(yyvsp[(2) - (3)].integer),(Coord::SkyFrame)(yyvsp[(3) - (3)].integer)); ;} break; case 1161: #line 2727 "frame/parser.Y" {fr->pannerCmd((yyvsp[(1) - (3)].str), (yyvsp[(2) - (3)].integer), (yyvsp[(3) - (3)].integer));;} break; case 1162: #line 2728 "frame/parser.Y" {fr->updatePannerCmd();;} break; case 1163: #line 2732 "frame/parser.Y" {fr->psColorSpaceCmd((Widget::PSColorSpace)(yyvsp[(2) - (2)].integer));;} break; case 1164: #line 2733 "frame/parser.Y" {fr->psLevelCmd((yyvsp[(2) - (2)].integer));;} break; case 1165: #line 2734 "frame/parser.Y" {fr->psResolutionCmd((yyvsp[(2) - (2)].integer));;} break; case 1166: #line 2735 "frame/parser.Y" {fr->psScaleCmd((yyvsp[(2) - (2)].real));;} break; case 1167: #line 2738 "frame/parser.Y" {(yyval.integer) = Widget::BW;;} break; case 1168: #line 2739 "frame/parser.Y" {(yyval.integer) = Widget::GRAY;;} break; case 1169: #line 2740 "frame/parser.Y" {(yyval.integer) = Widget::RGB;;} break; case 1170: #line 2741 "frame/parser.Y" {(yyval.integer) = Widget::CMYK;;} break; case 1173: #line 2749 "frame/parser.Y" {fr->regionHighliteBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1174: #line 2751 "frame/parser.Y" {fr->regionHighliteMotionCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1175: #line 2752 "frame/parser.Y" {fr->regionHighliteEndCmd();;} break; case 1176: #line 2753 "frame/parser.Y" {fr->regionHighliteShiftEndCmd();;} break; case 1177: #line 2757 "frame/parser.Y" {fr->regionSelectBeginCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1178: #line 2758 "frame/parser.Y" {fr->regionSelectMotionCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1179: #line 2759 "frame/parser.Y" {fr->regionSelectEndCmd();;} break; case 1180: #line 2760 "frame/parser.Y" {fr->regionSelectShiftEndCmd();;} break; case 1181: #line 2763 "frame/parser.Y" {(yyval.integer) = Frame3dBase::MIP;;} break; case 1182: #line 2764 "frame/parser.Y" {(yyval.integer) = Frame3dBase::AIP;;} break; case 1183: #line 2767 "frame/parser.Y" {(yyval.integer) = Frame3dBase::NONE;;} break; case 1184: #line 2768 "frame/parser.Y" {(yyval.integer) = Frame3dBase::AZIMUTH;;} break; case 1185: #line 2769 "frame/parser.Y" {(yyval.integer) = Frame3dBase::ELEVATION;;} break; case 1186: #line 2772 "frame/parser.Y" {fr->setRGBChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1187: #line 2773 "frame/parser.Y" {fr->setRGBSystemCmd((Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 1188: #line 2774 "frame/parser.Y" {fr->setRGBViewCmd((yyvsp[(2) - (4)].integer),(yyvsp[(3) - (4)].integer),(yyvsp[(4) - (4)].integer));;} break; case 1189: #line 2777 "frame/parser.Y" {fr->rotateCmd(degToRad((yyvsp[(1) - (1)].real)));;} break; case 1190: #line 2778 "frame/parser.Y" {fr->rotateCmd(degToRad((yyvsp[(1) - (2)].real)));;} break; case 1192: #line 2780 "frame/parser.Y" {fr->rotateToCmd(degToRad((yyvsp[(2) - (2)].real)));;} break; case 1193: #line 2781 "frame/parser.Y" {fr->rotateToCmd(degToRad((yyvsp[(2) - (3)].real)));;} break; case 1194: #line 2784 "frame/parser.Y" {fr->rotateBeginCmd();;} break; case 1195: #line 2785 "frame/parser.Y" {fr->rotateMotionCmd(degToRad((yyvsp[(1) - (1)].real)));;} break; case 1196: #line 2786 "frame/parser.Y" {fr->rotateEndCmd();;} break; case 1201: #line 2793 "frame/parser.Y" {fr->savePhotoCmd((yyvsp[(2) - (2)].str));;} break; case 1202: #line 2797 "frame/parser.Y" {fr->saveArrayFileCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1203: #line 2799 "frame/parser.Y" {fr->saveArrayChannelCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1204: #line 2801 "frame/parser.Y" {fr->saveArraySocketCmd((yyvsp[(2) - (3)].integer), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1206: #line 2806 "frame/parser.Y" {fr->saveArrayRGBCubeFileCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1207: #line 2808 "frame/parser.Y" {fr->saveArrayRGBCubeChannelCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1208: #line 2810 "frame/parser.Y" {fr->saveArrayRGBCubeSocketCmd((yyvsp[(2) - (3)].integer), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1218: #line 2823 "frame/parser.Y" {fr->saveFitsFileCmd((yyvsp[(2) - (2)].str));;} break; case 1219: #line 2824 "frame/parser.Y" {fr->saveFitsChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1220: #line 2825 "frame/parser.Y" {fr->saveFitsSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1221: #line 2828 "frame/parser.Y" {fr->saveFitsTableFileCmd((yyvsp[(2) - (2)].str));;} break; case 1222: #line 2829 "frame/parser.Y" {fr->saveFitsTableChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1223: #line 2830 "frame/parser.Y" {fr->saveFitsTableSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1224: #line 2833 "frame/parser.Y" {fr->saveFitsSliceFileCmd((yyvsp[(2) - (2)].str));;} break; case 1225: #line 2834 "frame/parser.Y" {fr->saveFitsSliceChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1226: #line 2835 "frame/parser.Y" {fr->saveFitsSliceSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1227: #line 2838 "frame/parser.Y" {fr->saveFitsExtCubeFileCmd((yyvsp[(2) - (2)].str));;} break; case 1228: #line 2839 "frame/parser.Y" {fr->saveFitsExtCubeChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1229: #line 2840 "frame/parser.Y" {fr->saveFitsExtCubeSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1231: #line 2844 "frame/parser.Y" {fr->saveFitsMosaicFileCmd((yyvsp[(2) - (3)].str),(yyvsp[(3) - (3)].integer));;} break; case 1232: #line 2845 "frame/parser.Y" {fr->saveFitsMosaicChannelCmd((yyvsp[(2) - (3)].str),(yyvsp[(3) - (3)].integer));;} break; case 1233: #line 2846 "frame/parser.Y" {fr->saveFitsMosaicSocketCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 1234: #line 2849 "frame/parser.Y" {fr->saveFitsMosaicImageFileCmd((yyvsp[(2) - (2)].str));;} break; case 1235: #line 2850 "frame/parser.Y" {fr->saveFitsMosaicImageChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1236: #line 2851 "frame/parser.Y" {fr->saveFitsMosaicImageSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1237: #line 2854 "frame/parser.Y" {fr->saveFitsRGBImageFileCmd((yyvsp[(2) - (2)].str));;} break; case 1238: #line 2855 "frame/parser.Y" {fr->saveFitsRGBImageChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1239: #line 2856 "frame/parser.Y" {fr->saveFitsRGBImageSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1240: #line 2859 "frame/parser.Y" {fr->saveFitsRGBCubeFileCmd((yyvsp[(2) - (2)].str));;} break; case 1241: #line 2860 "frame/parser.Y" {fr->saveFitsRGBCubeChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1242: #line 2861 "frame/parser.Y" {fr->saveFitsRGBCubeSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1243: #line 2864 "frame/parser.Y" {fr->saveFitsResampleFileCmd((yyvsp[(2) - (2)].str));;} break; case 1244: #line 2865 "frame/parser.Y" {fr->saveFitsResampleChannelCmd((yyvsp[(2) - (2)].str));;} break; case 1245: #line 2866 "frame/parser.Y" {fr->saveFitsResampleSocketCmd((yyvsp[(2) - (2)].integer));;} break; case 1246: #line 2870 "frame/parser.Y" {fr->saveNRRDFileCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1247: #line 2872 "frame/parser.Y" {fr->saveNRRDChannelCmd((yyvsp[(2) - (3)].str), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1248: #line 2874 "frame/parser.Y" {fr->saveNRRDSocketCmd((yyvsp[(2) - (3)].integer), (FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 1249: #line 2878 "frame/parser.Y" {fr->saveENVIFileCmd((yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), (FitsFile::ArchType)(yyvsp[(4) - (4)].integer));;} break; case 1250: #line 2881 "frame/parser.Y" {fr->smoothCmd((Context::SmoothFunction)(yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 1251: #line 2882 "frame/parser.Y" {fr->smoothDeleteCmd();;} break; case 1252: #line 2885 "frame/parser.Y" {(yyval.integer) = Context::BOXCAR;;} break; case 1253: #line 2886 "frame/parser.Y" {(yyval.integer) = Context::GAUSSIAN;;} break; case 1254: #line 2887 "frame/parser.Y" {(yyval.integer) = Context::TOPHAT;;} break; case 1255: #line 2890 "frame/parser.Y" {fr->updateFitsCmd(0);;} break; case 1256: #line 2892 "frame/parser.Y" {fr->updateFitsCmd((yyvsp[(1) - (5)].integer),BBox((yyvsp[(2) - (5)].real),(yyvsp[(3) - (5)].real),(yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)),0);;} break; case 1257: #line 2893 "frame/parser.Y" {fr->updateFitsCmd(1);;} break; case 1258: #line 2895 "frame/parser.Y" {fr->updateFitsCmd((yyvsp[(2) - (6)].integer),BBox((yyvsp[(3) - (6)].real),(yyvsp[(4) - (6)].real),(yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real)),1);;} break; case 1260: #line 2899 "frame/parser.Y" {fr->sliceCmd(2, (yyvsp[(1) - (1)].integer));;} break; case 1261: #line 2900 "frame/parser.Y" {fr->sliceCmd(2, (yyvsp[(1) - (2)].real), (Coord::CoordSystem)(yyvsp[(2) - (2)].integer));;} break; case 1262: #line 2901 "frame/parser.Y" {fr->sliceCmd((yyvsp[(1) - (2)].integer), (yyvsp[(2) - (2)].integer));;} break; case 1263: #line 2902 "frame/parser.Y" {fr->sliceCmd((yyvsp[(1) - (3)].integer), (yyvsp[(2) - (3)].real), (Coord::CoordSystem)(yyvsp[(3) - (3)].integer));;} break; case 1264: #line 2905 "frame/parser.Y" {fr->warpCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1265: #line 2906 "frame/parser.Y" {fr->warpToCmd(Vector((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real)));;} break; case 1266: #line 2910 "frame/parser.Y" {fr->wcsCmd((Coord::CoordSystem)(yyvsp[(1) - (3)].integer), (Coord::SkyFrame)(yyvsp[(2) - (3)].integer), (Coord::SkyFormat)(yyvsp[(3) - (3)].integer));;} break; case 1268: #line 2912 "frame/parser.Y" {fr->wcsResetCmd((yyvsp[(2) - (2)].integer));;} break; case 1271: #line 2917 "frame/parser.Y" {fr->wcsAppendCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 1272: #line 2918 "frame/parser.Y" {fr->wcsAppendCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].str));;} break; case 1273: #line 2919 "frame/parser.Y" {fr->wcsAppendTxtCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 1274: #line 2922 "frame/parser.Y" {fr->wcsReplaceCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 1275: #line 2923 "frame/parser.Y" {fr->wcsReplaceCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].str));;} break; case 1276: #line 2924 "frame/parser.Y" {fr->wcsReplaceTxtCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].str));;} break; case 1277: #line 2927 "frame/parser.Y" {fr->wcsAlignCmd((yyvsp[(1) - (1)].integer));;} break; case 1278: #line 2929 "frame/parser.Y" { // used by backup fr->wcsAlignCmd((yyvsp[(1) - (3)].integer), (Coord::CoordSystem)(yyvsp[(2) - (3)].integer), (Coord::SkyFrame)(yyvsp[(3) - (3)].integer)); ;} break; case 1279: #line 2934 "frame/parser.Y" { fr->wcsAlignCmd((yyvsp[(1) - (4)].integer), (FitsImage*)(yyvsp[(2) - (4)].ptr), (Coord::CoordSystem)(yyvsp[(3) - (4)].integer), (Coord::SkyFrame)(yyvsp[(4) - (4)].integer)); ;} break; case 1280: #line 2940 "frame/parser.Y" { #ifdef __WIN32 fr->win32PrintCmd(); #endif ;} break; case 1281: #line 2947 "frame/parser.Y" {fr->zoomCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1282: #line 2949 "frame/parser.Y" {fr->zoomAboutCmd(Vector((yyvsp[(1) - (5)].real),(yyvsp[(2) - (5)].real)),Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)));;} break; case 1283: #line 2951 "frame/parser.Y" { // backward compatibility fr->zoomAboutCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real))); ;} break; case 1284: #line 2956 "frame/parser.Y" {fr->zoomAboutCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)),Vector((yyvsp[(6) - (6)].vector)), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer),(Coord::SkyFrame)(yyvsp[(5) - (6)].integer));;} break; case 1286: #line 2961 "frame/parser.Y" {fr->zoomToFitCmd(1);;} break; case 1287: #line 2962 "frame/parser.Y" {fr->zoomToFitCmd((yyvsp[(2) - (2)].real));;} break; case 1288: #line 2963 "frame/parser.Y" {fr->zoomToCmd(Vector((yyvsp[(1) - (2)].real),(yyvsp[(2) - (2)].real)));;} break; case 1289: #line 2965 "frame/parser.Y" {fr->zoomToAboutCmd(Vector((yyvsp[(1) - (5)].real),(yyvsp[(2) - (5)].real)),Vector((yyvsp[(4) - (5)].real),(yyvsp[(5) - (5)].real)));;} break; case 1290: #line 2967 "frame/parser.Y" { // backward compatibility fr->zoomToAboutCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)),Vector((yyvsp[(5) - (6)].real),(yyvsp[(6) - (6)].real))); ;} break; case 1291: #line 2972 "frame/parser.Y" {fr->zoomToAboutCmd(Vector((yyvsp[(1) - (6)].real),(yyvsp[(2) - (6)].real)), Vector((yyvsp[(6) - (6)].vector)), (Coord::CoordSystem)(yyvsp[(4) - (6)].integer), (Coord::SkyFrame)(yyvsp[(5) - (6)].integer));;} break; /* Line 1267 of yacc.c. */ #line 11148 "frame/parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 2976 "frame/parser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/parser.H000644 000765 000000 00000036257 12553253031 016437 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, POINTER = 261, ANGDEGREE = 262, ANGRADIAN = 263, SEXSTR = 264, HMSSTR = 265, DMSSTR = 266, ABOUT_ = 267, AIP_ = 268, ALLOC_ = 269, ALLOCGZ_ = 270, ALIGN_ = 271, ALL_ = 272, ALT_ = 273, AMPLIFIER_ = 274, ANALYSIS_ = 275, ANGLE_ = 276, ANNULUS_ = 277, APPEND_ = 278, ARCMIN_ = 279, ARCSEC_ = 280, ARRAY_ = 281, ARROW_ = 282, ASINH_ = 283, AST_ = 284, AUTO_ = 285, AUX_ = 286, AVERAGE_ = 287, AXES_ = 288, AZIMUTH_ = 289, B1950_ = 290, BACK_ = 291, BACKGROUND_ = 292, BASE_ = 293, BBOX_ = 294, BEGIN_ = 295, BG_ = 296, BIG_ = 297, BIGENDIAN_ = 298, BIN_ = 299, BITPIX_ = 300, BLOCK_ = 301, BORDER_ = 302, BOX_ = 303, BOXANNULUS_ = 304, BOXCAR_ = 305, BOXCIRCLE_ = 306, BPANDA_ = 307, BUFFER_ = 308, BW_ = 309, CALLBACK_ = 310, CANVAS_ = 311, CATALOG_ = 312, CELESTRIAL_ = 313, CENTER_ = 314, CENTROID_ = 315, CHANNEL_ = 316, CIRCLE_ = 317, CIAO_ = 318, CLEAR_ = 319, CLIP_ = 320, COLOR_ = 321, COLORBAR_ = 322, COLORMAP_ = 323, COLORSCALE_ = 324, COLORSPACE_ = 325, COLS_ = 326, COLUMN_ = 327, COMMAND_ = 328, COMPASS_ = 329, COMPOSITE_ = 330, COMPRESS_ = 331, CONTOUR_ = 332, CONTRAST_ = 333, COORDINATES_ = 334, COPY_ = 335, COUNT_ = 336, CPANDA_ = 337, CREATE_ = 338, CROP_ = 339, CROSS_ = 340, CROSSHAIR_ = 341, CUBE_ = 342, CURSOR_ = 343, CUT_ = 344, CMYK_ = 345, DASH_ = 346, DASHLIST_ = 347, DATA_ = 348, DATAMIN_ = 349, DATASEC_ = 350, DEBUG_ = 351, DEGREES_ = 352, DEFAULT_ = 353, DELETE_ = 354, DEPTH_ = 355, DETECTOR_ = 356, DIAMOND_ = 357, DIM_ = 358, DS9_ = 359, EDIT_ = 360, ECLIPTIC_ = 361, ELEVATION_ = 362, ELLIPSE_ = 363, ELLIPSEANNULUS_ = 364, END_ = 365, ENVI_ = 366, EPANDA_ = 367, EPSILON_ = 368, EQUATORIAL_ = 369, ERASE_ = 370, EXT_ = 371, FACTOR_ = 372, FALSE_ = 373, FILE_ = 374, FILTER_ = 375, FIT_ = 376, FITS_ = 377, FITSY_ = 378, FIXED_ = 379, FK4_ = 380, FK4_NO_E_ = 381, FK5_ = 382, FONT_ = 383, FRONT_ = 384, FULL_ = 385, FUNCTION_ = 386, GALACTIC_ = 387, GAUSSIAN_ = 388, GET_ = 389, GLOBAL_ = 390, GRAPHICS_ = 391, GRAY_ = 392, GRID_ = 393, GZ_ = 394, HANDLE_ = 395, HAS_ = 396, HEAD_ = 397, HEADER_ = 398, HEIGHT_ = 399, HELIOECLIPTIC_ = 400, HIDE_ = 401, HIGH_ = 402, HIGHLITE_ = 403, HISTEQU_ = 404, HISTOGRAM_ = 405, HORIZONTAL_ = 406, ICRS_ = 407, ID_ = 408, IIS_ = 409, IMAGE_ = 410, INCLUDE_ = 411, INCR_ = 412, INFO_ = 413, INTEGER_ = 414, ITERATION_ = 415, IRAF_ = 416, IRAFMIN_ = 417, J2000_ = 418, KEY_ = 419, KEYWORD_ = 420, LABEL_ = 421, LENGTH_ = 422, LEVEL_ = 423, LITTLE_ = 424, LITTLEENDIAN_ = 425, LINE_ = 426, LINEAR_ = 427, LIST_ = 428, LOAD_ = 429, LOCAL_ = 430, LOG_ = 431, LOW_ = 432, MACOSX_ = 433, MAGNIFIER_ = 434, MATCH_ = 435, MAP_ = 436, MARK_ = 437, MARKER_ = 438, MASK_ = 439, MESSAGE_ = 440, METHOD_ = 441, MINMAX_ = 442, MIP_ = 443, MMAP_ = 444, MMAPINCR_ = 445, MOSAIC_ = 446, MODE_ = 447, MOTION_ = 448, MOVE_ = 449, NAME_ = 450, NAN_ = 451, NATIVE_ = 452, NAXES_ = 453, NEW_ = 454, NEXT_ = 455, NO_ = 456, NONE_ = 457, NOW_ = 458, NRRD_ = 459, NUMBER_ = 460, OBJECT_ = 461, OFF_ = 462, ON_ = 463, ONLY_ = 464, OPTION_ = 465, ORIENT_ = 466, PAN_ = 467, PANNER_ = 468, PARSER_ = 469, PASTE_ = 470, PERF_ = 471, PHOTO_ = 472, PHYSICAL_ = 473, PIXEL_ = 474, PLOT2D_ = 475, PLOT3D_ = 476, POINT_ = 477, POINTER_ = 478, POLYGON_ = 479, POSTSCRIPT_ = 480, POW_ = 481, PRINT_ = 482, PRESERVE_ = 483, PROJECTION_ = 484, PROPERTY_ = 485, PUBLICATION_ = 486, PROS_ = 487, QUERY_ = 488, RADIAL_ = 489, RADIUS_ = 490, REGION_ = 491, REPLACE_ = 492, RESAMPLE_ = 493, RESET_ = 494, RESOLUTION_ = 495, RGB_ = 496, ROOT_ = 497, ROTATE_ = 498, RULER_ = 499, SAMPLE_ = 500, SAOIMAGE_ = 501, SAOTNG_ = 502, SAVE_ = 503, SCALE_ = 504, SCAN_ = 505, SCIENTIFIC_ = 506, SCOPE_ = 507, SEGMENT_ = 508, SELECT_ = 509, SET_ = 510, SEXAGESIMAL_ = 511, SHAPE_ = 512, SHARED_ = 513, SHIFT_ = 514, SHMID_ = 515, SHOW_ = 516, SINH_ = 517, SIZE_ = 518, SLICE_ = 519, SMMAP_ = 520, SMOOTH_ = 521, SOCKET_ = 522, SOCKETGZ_ = 523, SOURCE_ = 524, SQRT_ = 525, SQUARED_ = 526, SSHARED_ = 527, STATS_ = 528, STATUS_ = 529, SUPERGALACTIC_ = 530, SUM_ = 531, SYSTEM_ = 532, TABLE_ = 533, TAG_ = 534, TEMPLATE_ = 535, TEXT_ = 536, THREADS_ = 537, THREED_ = 538, THRESHOLD_ = 539, THICK_ = 540, TRANSPARENCY_ = 541, TO_ = 542, TOGGLE_ = 543, TOPHAT_ = 544, TRUE_ = 545, TYPE_ = 546, UNDO_ = 547, UNHIGHLITE_ = 548, UNLOAD_ = 549, UNSELECT_ = 550, UPDATE_ = 551, USER_ = 552, VALUE_ = 553, VAR_ = 554, VIEW_ = 555, VECTOR_ = 556, VERSION_ = 557, VERTEX_ = 558, VERTICAL_ = 559, WARP_ = 560, WCS_ = 561, WCSA_ = 562, WCSB_ = 563, WCSC_ = 564, WCSD_ = 565, WCSE_ = 566, WCSF_ = 567, WCSG_ = 568, WCSH_ = 569, WCSI_ = 570, WCSJ_ = 571, WCSK_ = 572, WCSL_ = 573, WCSM_ = 574, WCSN_ = 575, WCSO_ = 576, WCSP_ = 577, WCSQ_ = 578, WCSR_ = 579, WCSS_ = 580, WCST_ = 581, WCSU_ = 582, WCSV_ = 583, WCSW_ = 584, WCSX_ = 585, WCSY_ = 586, WCSZ_ = 587, WCS0_ = 588, WFPC2_ = 589, WIDTH_ = 590, WIN32_ = 591, XML_ = 592, XY_ = 593, YES_ = 594, ZMAX_ = 595, ZSCALE_ = 596, ZOOM_ = 597 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define POINTER 261 #define ANGDEGREE 262 #define ANGRADIAN 263 #define SEXSTR 264 #define HMSSTR 265 #define DMSSTR 266 #define ABOUT_ 267 #define AIP_ 268 #define ALLOC_ 269 #define ALLOCGZ_ 270 #define ALIGN_ 271 #define ALL_ 272 #define ALT_ 273 #define AMPLIFIER_ 274 #define ANALYSIS_ 275 #define ANGLE_ 276 #define ANNULUS_ 277 #define APPEND_ 278 #define ARCMIN_ 279 #define ARCSEC_ 280 #define ARRAY_ 281 #define ARROW_ 282 #define ASINH_ 283 #define AST_ 284 #define AUTO_ 285 #define AUX_ 286 #define AVERAGE_ 287 #define AXES_ 288 #define AZIMUTH_ 289 #define B1950_ 290 #define BACK_ 291 #define BACKGROUND_ 292 #define BASE_ 293 #define BBOX_ 294 #define BEGIN_ 295 #define BG_ 296 #define BIG_ 297 #define BIGENDIAN_ 298 #define BIN_ 299 #define BITPIX_ 300 #define BLOCK_ 301 #define BORDER_ 302 #define BOX_ 303 #define BOXANNULUS_ 304 #define BOXCAR_ 305 #define BOXCIRCLE_ 306 #define BPANDA_ 307 #define BUFFER_ 308 #define BW_ 309 #define CALLBACK_ 310 #define CANVAS_ 311 #define CATALOG_ 312 #define CELESTRIAL_ 313 #define CENTER_ 314 #define CENTROID_ 315 #define CHANNEL_ 316 #define CIRCLE_ 317 #define CIAO_ 318 #define CLEAR_ 319 #define CLIP_ 320 #define COLOR_ 321 #define COLORBAR_ 322 #define COLORMAP_ 323 #define COLORSCALE_ 324 #define COLORSPACE_ 325 #define COLS_ 326 #define COLUMN_ 327 #define COMMAND_ 328 #define COMPASS_ 329 #define COMPOSITE_ 330 #define COMPRESS_ 331 #define CONTOUR_ 332 #define CONTRAST_ 333 #define COORDINATES_ 334 #define COPY_ 335 #define COUNT_ 336 #define CPANDA_ 337 #define CREATE_ 338 #define CROP_ 339 #define CROSS_ 340 #define CROSSHAIR_ 341 #define CUBE_ 342 #define CURSOR_ 343 #define CUT_ 344 #define CMYK_ 345 #define DASH_ 346 #define DASHLIST_ 347 #define DATA_ 348 #define DATAMIN_ 349 #define DATASEC_ 350 #define DEBUG_ 351 #define DEGREES_ 352 #define DEFAULT_ 353 #define DELETE_ 354 #define DEPTH_ 355 #define DETECTOR_ 356 #define DIAMOND_ 357 #define DIM_ 358 #define DS9_ 359 #define EDIT_ 360 #define ECLIPTIC_ 361 #define ELEVATION_ 362 #define ELLIPSE_ 363 #define ELLIPSEANNULUS_ 364 #define END_ 365 #define ENVI_ 366 #define EPANDA_ 367 #define EPSILON_ 368 #define EQUATORIAL_ 369 #define ERASE_ 370 #define EXT_ 371 #define FACTOR_ 372 #define FALSE_ 373 #define FILE_ 374 #define FILTER_ 375 #define FIT_ 376 #define FITS_ 377 #define FITSY_ 378 #define FIXED_ 379 #define FK4_ 380 #define FK4_NO_E_ 381 #define FK5_ 382 #define FONT_ 383 #define FRONT_ 384 #define FULL_ 385 #define FUNCTION_ 386 #define GALACTIC_ 387 #define GAUSSIAN_ 388 #define GET_ 389 #define GLOBAL_ 390 #define GRAPHICS_ 391 #define GRAY_ 392 #define GRID_ 393 #define GZ_ 394 #define HANDLE_ 395 #define HAS_ 396 #define HEAD_ 397 #define HEADER_ 398 #define HEIGHT_ 399 #define HELIOECLIPTIC_ 400 #define HIDE_ 401 #define HIGH_ 402 #define HIGHLITE_ 403 #define HISTEQU_ 404 #define HISTOGRAM_ 405 #define HORIZONTAL_ 406 #define ICRS_ 407 #define ID_ 408 #define IIS_ 409 #define IMAGE_ 410 #define INCLUDE_ 411 #define INCR_ 412 #define INFO_ 413 #define INTEGER_ 414 #define ITERATION_ 415 #define IRAF_ 416 #define IRAFMIN_ 417 #define J2000_ 418 #define KEY_ 419 #define KEYWORD_ 420 #define LABEL_ 421 #define LENGTH_ 422 #define LEVEL_ 423 #define LITTLE_ 424 #define LITTLEENDIAN_ 425 #define LINE_ 426 #define LINEAR_ 427 #define LIST_ 428 #define LOAD_ 429 #define LOCAL_ 430 #define LOG_ 431 #define LOW_ 432 #define MACOSX_ 433 #define MAGNIFIER_ 434 #define MATCH_ 435 #define MAP_ 436 #define MARK_ 437 #define MARKER_ 438 #define MASK_ 439 #define MESSAGE_ 440 #define METHOD_ 441 #define MINMAX_ 442 #define MIP_ 443 #define MMAP_ 444 #define MMAPINCR_ 445 #define MOSAIC_ 446 #define MODE_ 447 #define MOTION_ 448 #define MOVE_ 449 #define NAME_ 450 #define NAN_ 451 #define NATIVE_ 452 #define NAXES_ 453 #define NEW_ 454 #define NEXT_ 455 #define NO_ 456 #define NONE_ 457 #define NOW_ 458 #define NRRD_ 459 #define NUMBER_ 460 #define OBJECT_ 461 #define OFF_ 462 #define ON_ 463 #define ONLY_ 464 #define OPTION_ 465 #define ORIENT_ 466 #define PAN_ 467 #define PANNER_ 468 #define PARSER_ 469 #define PASTE_ 470 #define PERF_ 471 #define PHOTO_ 472 #define PHYSICAL_ 473 #define PIXEL_ 474 #define PLOT2D_ 475 #define PLOT3D_ 476 #define POINT_ 477 #define POINTER_ 478 #define POLYGON_ 479 #define POSTSCRIPT_ 480 #define POW_ 481 #define PRINT_ 482 #define PRESERVE_ 483 #define PROJECTION_ 484 #define PROPERTY_ 485 #define PUBLICATION_ 486 #define PROS_ 487 #define QUERY_ 488 #define RADIAL_ 489 #define RADIUS_ 490 #define REGION_ 491 #define REPLACE_ 492 #define RESAMPLE_ 493 #define RESET_ 494 #define RESOLUTION_ 495 #define RGB_ 496 #define ROOT_ 497 #define ROTATE_ 498 #define RULER_ 499 #define SAMPLE_ 500 #define SAOIMAGE_ 501 #define SAOTNG_ 502 #define SAVE_ 503 #define SCALE_ 504 #define SCAN_ 505 #define SCIENTIFIC_ 506 #define SCOPE_ 507 #define SEGMENT_ 508 #define SELECT_ 509 #define SET_ 510 #define SEXAGESIMAL_ 511 #define SHAPE_ 512 #define SHARED_ 513 #define SHIFT_ 514 #define SHMID_ 515 #define SHOW_ 516 #define SINH_ 517 #define SIZE_ 518 #define SLICE_ 519 #define SMMAP_ 520 #define SMOOTH_ 521 #define SOCKET_ 522 #define SOCKETGZ_ 523 #define SOURCE_ 524 #define SQRT_ 525 #define SQUARED_ 526 #define SSHARED_ 527 #define STATS_ 528 #define STATUS_ 529 #define SUPERGALACTIC_ 530 #define SUM_ 531 #define SYSTEM_ 532 #define TABLE_ 533 #define TAG_ 534 #define TEMPLATE_ 535 #define TEXT_ 536 #define THREADS_ 537 #define THREED_ 538 #define THRESHOLD_ 539 #define THICK_ 540 #define TRANSPARENCY_ 541 #define TO_ 542 #define TOGGLE_ 543 #define TOPHAT_ 544 #define TRUE_ 545 #define TYPE_ 546 #define UNDO_ 547 #define UNHIGHLITE_ 548 #define UNLOAD_ 549 #define UNSELECT_ 550 #define UPDATE_ 551 #define USER_ 552 #define VALUE_ 553 #define VAR_ 554 #define VIEW_ 555 #define VECTOR_ 556 #define VERSION_ 557 #define VERTEX_ 558 #define VERTICAL_ 559 #define WARP_ 560 #define WCS_ 561 #define WCSA_ 562 #define WCSB_ 563 #define WCSC_ 564 #define WCSD_ 565 #define WCSE_ 566 #define WCSF_ 567 #define WCSG_ 568 #define WCSH_ 569 #define WCSI_ 570 #define WCSJ_ 571 #define WCSK_ 572 #define WCSL_ 573 #define WCSM_ 574 #define WCSN_ 575 #define WCSO_ 576 #define WCSP_ 577 #define WCSQ_ 578 #define WCSR_ 579 #define WCSS_ 580 #define WCST_ 581 #define WCSU_ 582 #define WCSV_ 583 #define WCSW_ 584 #define WCSX_ 585 #define WCSY_ 586 #define WCSZ_ 587 #define WCS0_ 588 #define WFPC2_ 589 #define WIDTH_ 590 #define WIN32_ 591 #define XML_ 592 #define XY_ 593 #define YES_ 594 #define ZMAX_ 595 #define ZSCALE_ 596 #define ZOOM_ 597 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 51 "frame/parser.Y" { #define FRBUFSIZE 4096 char chr; char str[FRBUFSIZE]; void* ptr; int integer; double real; double vector[3]; int dash[2]; } /* Line 1529 of yacc.c. */ #line 744 "frame/parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/parser.Y000644 000765 000000 00000302133 12616732025 016452 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {frFlexLexer* ll} %parse-param {frFlexLexer* ll} %{ #define YYDEBUG 1 #include #include #include #include "base.h" #include "frame3d.h" #include "fitsimage.h" #include "marker.h" #undef yyFlexLexer #define yyFlexLexer frFlexLexer #include extern int frlex(void*, frFlexLexer*); extern void frerror(Base*, frFlexLexer*, const char*); static Coord::CoordSystem currentCoord = Coord::IMAGE; static Coord::SkyFrame currentSky = Coord::FK5; static unsigned short defaultProps = Marker::SELECT | Marker::HIGHLITE | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::INCLUDE | Marker::SOURCE; static unsigned short currentProps; static char currentColor[16]; static int currentWidth; static int currentDash[2]; static char currentFont[32]; static char currentText[80]; static List taglist; static List cblist; static unsigned short propQMask; static unsigned short propQValue; static void setProps(unsigned short* props, unsigned short prop, int value); %} %union { #define FRBUFSIZE 4096 char chr; char str[FRBUFSIZE]; void* ptr; int integer; double real; double vector[3]; int dash[2]; } %type numeric %type yesno %type angle %type optangle %type precision %type sexagesimal %type hms %type dms %type coord %type coordSystem %type wcsSystem %type internalSystem %type skyFrame %type skyFormat %type skyDist %type markerProperty %type markerCallBack %type markerFormat %type markerLayer %type markerDash %type pscolorspace %type scaleType %type contourClipMode %type shmType %type contourmethod %type incrLoad %type layerType %type gridType %type fileNameType %type smoothFunction %type pointShape %type pointSize %type endian %type renderMethod %type renderBackground %type analysisMethod %type analysisParam %token REAL %token INT %token STRING %token POINTER %token ANGDEGREE %token ANGRADIAN %token SEXSTR %token HMSSTR %token DMSSTR %token ABOUT_ %token AIP_ %token ALLOC_ %token ALLOCGZ_ %token ALIGN_ %token ALL_ %token ALT_ %token AMPLIFIER_ %token ANALYSIS_ %token ANGLE_ %token ANNULUS_ %token APPEND_ %token ARCMIN_ %token ARCSEC_ %token ARRAY_ %token ARROW_ %token ASINH_ %token AST_ %token AUTO_ %token AUX_ %token AVERAGE_ %token AXES_ %token AZIMUTH_ %token B1950_ %token BACK_ %token BACKGROUND_ %token BASE_ %token BBOX_ %token BEGIN_ %token BG_ %token BIG_ %token BIGENDIAN_ %token BIN_ %token BITPIX_ %token BLOCK_ %token BORDER_ %token BOX_ %token BOXANNULUS_ %token BOXCAR_ %token BOXCIRCLE_ %token BPANDA_ %token BUFFER_ %token BW_ %token CALLBACK_ %token CANVAS_ %token CATALOG_ %token CELESTRIAL_ %token CENTER_ %token CENTROID_ %token CHANNEL_ %token CIRCLE_ %token CIAO_ %token CLEAR_ %token CLIP_ %token COLOR_ %token COLORBAR_ %token COLORMAP_ %token COLORSCALE_ %token COLORSPACE_ %token COLS_ %token COLUMN_ %token COMMAND_ %token COMPASS_ %token COMPOSITE_ %token COMPRESS_ %token CONTOUR_ %token CONTRAST_ %token COORDINATES_ %token COPY_ %token COUNT_ %token CPANDA_ %token CREATE_ %token CROP_ %token CROSS_ %token CROSSHAIR_ %token CUBE_ %token CURSOR_ %token CUT_ %token CMYK_ %token DASH_ %token DASHLIST_ %token DATA_ %token DATAMIN_ %token DATASEC_ %token DEBUG_ %token DEGREES_ %token DEFAULT_ %token DELETE_ %token DEPTH_ %token DETECTOR_ %token DIAMOND_ %token DIM_ %token DS9_ %token EDIT_ %token ECLIPTIC_ %token ELEVATION_ %token ELLIPSE_ %token ELLIPSEANNULUS_ %token END_ %token ENVI_ %token EPANDA_ %token EPSILON_ %token EQUATORIAL_ %token ERASE_ %token EXT_ %token FACTOR_ %token FALSE_ %token FILE_ %token FILTER_ %token FIT_ %token FITS_ %token FITSY_ %token FIXED_ %token FK4_ %token FK4_NO_E_ %token FK5_ %token FONT_ %token FRONT_ %token FULL_ %token FUNCTION_ %token GALACTIC_ %token GAUSSIAN_ %token GET_ %token GLOBAL_ %token GRAPHICS_ %token GRAY_ %token GRID_ %token GZ_ %token HANDLE_ %token HAS_ %token HEAD_ %token HEADER_ %token HEIGHT_ %token HELIOECLIPTIC_ %token HIDE_ %token HIGH_ %token HIGHLITE_ %token HISTEQU_ %token HISTOGRAM_ %token HORIZONTAL_ %token ICRS_ %token ID_ %token IIS_ %token IMAGE_ %token INCLUDE_ %token INCR_ %token INFO_ %token INTEGER_ %token ITERATION_ %token IRAF_ %token IRAFMIN_ %token J2000_ %token KEY_ %token KEYWORD_ %token LABEL_ %token LENGTH_ %token LEVEL_ %token LITTLE_ %token LITTLEENDIAN_ %token LINE_ %token LINEAR_ %token LIST_ %token LOAD_ %token LOCAL_ %token LOG_ %token LOW_ %token MACOSX_ %token MAGNIFIER_ %token MATCH_ %token MAP_ %token MARK_ %token MARKER_ %token MASK_ %token MESSAGE_ %token METHOD_ %token MINMAX_ %token MIP_ %token MMAP_ %token MMAPINCR_ %token MOSAIC_ %token MODE_ %token MOTION_ %token MOVE_ %token NAME_ %token NAN_ %token NATIVE_ %token NAXES_ %token NEW_ %token NEXT_ %token NO_ %token NONE_ %token NOW_ %token NRRD_ %token NUMBER_ %token OBJECT_ %token OFF_ %token ON_ %token ONLY_ %token OPTION_ %token ORIENT_ %token PAN_ %token PANNER_ %token PARSER_ %token PASTE_ %token PERF_ %token PHOTO_ %token PHYSICAL_ %token PIXEL_ %token PLOT2D_ %token PLOT3D_ %token POINT_ %token POINTER_ %token POLYGON_ %token POSTSCRIPT_ %token POW_ %token PRINT_ %token PRESERVE_ %token PROJECTION_ %token PROPERTY_ %token PUBLICATION_ %token PROS_ %token QUERY_ %token RADIAL_ %token RADIUS_ %token REGION_ %token REPLACE_ %token RESAMPLE_ %token RESET_ %token RESOLUTION_ %token RGB_ %token ROOT_ %token ROTATE_ %token RULER_ %token SAMPLE_ %token SAOIMAGE_ %token SAOTNG_ %token SAVE_ %token SCALE_ %token SCAN_ %token SCIENTIFIC_ %token SCOPE_ %token SEGMENT_ %token SELECT_ %token SET_ %token SEXAGESIMAL_ %token SHAPE_ %token SHARED_ %token SHIFT_ %token SHMID_ %token SHOW_ %token SINH_ %token SIZE_ %token SLICE_ %token SMMAP_ %token SMOOTH_ %token SOCKET_ %token SOCKETGZ_ %token SOURCE_ %token SQRT_ %token SQUARED_ %token SSHARED_ %token STATS_ %token STATUS_ %token SUPERGALACTIC_ %token SUM_ %token SYSTEM_ %token TABLE_ %token TAG_ %token TEMPLATE_ %token TEXT_ %token THREADS_ %token THREED_ %token THRESHOLD_ %token THICK_ %token TRANSPARENCY_ %token TO_ %token TOGGLE_ %token TOPHAT_ %token TRUE_ %token TYPE_ %token UNDO_ %token UNHIGHLITE_ %token UNLOAD_ %token UNSELECT_ %token UPDATE_ %token USER_ %token VALUE_ %token VAR_ %token VIEW_ %token VECTOR_ %token VERSION_ %token VERTEX_ %token VERTICAL_ %token WARP_ %token WCS_ %token WCSA_ %token WCSB_ %token WCSC_ %token WCSD_ %token WCSE_ %token WCSF_ %token WCSG_ %token WCSH_ %token WCSI_ %token WCSJ_ %token WCSK_ %token WCSL_ %token WCSM_ %token WCSN_ %token WCSO_ %token WCSP_ %token WCSQ_ %token WCSR_ %token WCSS_ %token WCST_ %token WCSU_ %token WCSV_ %token WCSW_ %token WCSX_ %token WCSY_ %token WCSZ_ %token WCS0_ %token WFPC2_ %token WIDTH_ %token WIN32_ %token XML_ %token XY_ %token YES_ %token ZMAX_ %token ZSCALE_ %token ZOOM_ %% command : DEBUG_ debug | ANALYSIS_ analysis | BIN_ bin | BG_ COLOR_ STRING {fr->bgColorCmd($3);} | BLOCK_ block | CENTER_ {fr->centerCmd();} | CLEAR_ {fr->clearCmd();} | CLIP_ clip | COLORBAR_ TAG_ STRING {fr->colorbarTagCmd($3);} | COLORMAP_ colormap | COLORSCALE_ colorscale | CONTOUR_ contour | CROP_ crop | CROSSHAIR_ crosshair | CUBE_ cube | DATASEC_ yesno {fr->DATASECCmd($2);} | FITSY_ fitsy | GET_ get | GRID_ grid | HAS_ has | HIDE_ {fr->hideCmd();} | HIGHLITE_ yesno {fr->highliteCmd($2);} | IIS_ iis | IRAF_ ALIGN_ INT {fr->irafAlignCmd($3);} | LOAD_ load | MACOSX_ macosx | MAGNIFIER_ magnifier | MATCH_ match | MARKER_ markerLayer marker | MASK_ mask | NAN_ COLOR_ STRING {fr->nanColorCmd($3);} | ORIENT_ orient | PAN_ pan | PANNER_ panner | QUERY_ CURSOR_ {fr->queryCursorCmd();} | POSTSCRIPT_ postscript | RESET_ {fr->resetCmd();} | REGION_ markerLayer region | RGB_ rgb | ROTATE_ rotate | SAVE_ save | SHOW_ {fr->showCmd();} | SMOOTH_ smooth | THREADS_ INT {fr->threadsCmd($2);} | THREED_ threed | UNLOAD_ {fr->unloadFitsCmd();} | UPDATE_ update | VERSION_ {fr->msg("Frame 1.0");} | WARP_ warp | WCS_ wcs | WIN32_ win32 | ZOOM_ zoom ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} | AST_ yesno {DebugAST=$2;} | MOSAIC_ yesno {DebugMosaic=$2;} | PARSER_ yesno {yydebug=$2;} | PERF_ yesno {DebugPerf=$2;} | WCS_ yesno {DebugWCS=$2;} | BIN_ yesno {DebugBin=$2;} | BLOCK_ yesno {DebugBlock=$2;} | COMPRESS_ yesno {DebugCompress=$2;} | CROP_ yesno {DebugCrop=$2;} | GZ_ yesno {DebugGZ=$2;} | RGB_ yesno {DebugRGB=$2;} ; yesno : INT {$$=($1 ? 1 : 0);} | YES_ {$$=1;} | 'Y' {$$=1;} | ON_ {$$=1;} | TRUE_ {$$=1;} | NO_ {$$=0;} | 'N' {$$=0;} | OFF_ {$$=0;} | FALSE_ {$$=0;} ; precision : /* empty */ {$$ = Base::DEFAULT;} | DEFAULT_ {$$ = Base::DEFAULT;} | FIXED_ {$$ = Base::FIXED;} | SCIENTIFIC_ {$$ = Base::SCIENTIFIC;} | INTEGER_ {$$ = Base::INTEGER;} ; fileNameType : /* empty */ {$$ = Base::ROOTBASE;} | ROOT_ BASE_ {$$ = Base::ROOTBASE;} | FULL_ BASE_ {$$ = Base::FULLBASE;} | ROOT_ {$$ = Base::ROOT;} | FULL_ {$$ = Base::FULL;} ; optangle : /* empty */ {$$ = 0;} | angle {$$ = $1;} ; angle : numeric {$$ = degToRad($1);} /* assume degree */ | ANGDEGREE {$$ = degToRad($1);} | ANGRADIAN {$$=$1;} ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; hms : HMSSTR {$$ = parseHMSStr($1);} ; dms : DMSSTR {$$ = parseDMSStr($1);} ; coord : sexagesimal sexagesimal { Vector r; if (currentSky == Coord::GALACTIC || currentSky == Coord::ECLIPTIC) r = Vector($1,$2); else r = Vector($1*360./24.,$2); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | hms dms { Vector r = Vector($1,$2); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | dms dms { Vector r = Vector($1,$2); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric numeric { $$[0] = $1; $$[1] = $2; $$[2] = 1; } ; coordSystem :IMAGE_ {$$ = currentCoord = Coord::IMAGE;} | PHYSICAL_ {$$ = currentCoord = Coord::PHYSICAL;} | DETECTOR_ {$$ = currentCoord = Coord::DETECTOR;} | AMPLIFIER_ {$$ = currentCoord = Coord::AMPLIFIER;} | wcsSystem {$$ = (Coord::CoordSystem)$1;} ; wcsSystem : WCS_ {$$ = currentCoord = Coord::WCS;} | WCSA_ {$$ = currentCoord = Coord::WCSA;} | WCSB_ {$$ = currentCoord = Coord::WCSB;} | WCSC_ {$$ = currentCoord = Coord::WCSC;} | WCSD_ {$$ = currentCoord = Coord::WCSD;} | WCSE_ {$$ = currentCoord = Coord::WCSE;} | WCSF_ {$$ = currentCoord = Coord::WCSF;} | WCSG_ {$$ = currentCoord = Coord::WCSG;} | WCSH_ {$$ = currentCoord = Coord::WCSH;} | WCSI_ {$$ = currentCoord = Coord::WCSI;} | WCSJ_ {$$ = currentCoord = Coord::WCSJ;} | WCSK_ {$$ = currentCoord = Coord::WCSK;} | WCSL_ {$$ = currentCoord = Coord::WCSL;} | WCSM_ {$$ = currentCoord = Coord::WCSM;} | WCSN_ {$$ = currentCoord = Coord::WCSN;} | WCSO_ {$$ = currentCoord = Coord::WCSO;} | WCSP_ {$$ = currentCoord = Coord::WCSP;} | WCSQ_ {$$ = currentCoord = Coord::WCSQ;} | WCSR_ {$$ = currentCoord = Coord::WCSR;} | WCSS_ {$$ = currentCoord = Coord::WCSS;} | WCST_ {$$ = currentCoord = Coord::WCST;} | WCSU_ {$$ = currentCoord = Coord::WCSU;} | WCSV_ {$$ = currentCoord = Coord::WCSV;} | WCSW_ {$$ = currentCoord = Coord::WCSW;} | WCSX_ {$$ = currentCoord = Coord::WCSX;} | WCSY_ {$$ = currentCoord = Coord::WCSY;} | WCSZ_ {$$ = currentCoord = Coord::WCSZ;} | WCS0_ {$$ = currentCoord = Coord::WCS0;} ; internalSystem : CANVAS_ {$$ = Coord::CANVAS;} | PANNER_ {$$ = Coord::PANNER;} ; scaleType: LINEAR_ {$$ = FrScale::LINEARSCALE;} | LOG_ {$$ = FrScale::LOGSCALE;} | POW_ {$$ = FrScale::POWSCALE;} | SQRT_ {$$ = FrScale::SQRTSCALE;} | SQUARED_ {$$ = FrScale::SQUAREDSCALE;} | ASINH_ {$$ = FrScale::ASINHSCALE;} | SINH_ {$$ = FrScale::SINHSCALE;} | HISTEQU_ {$$ = FrScale::HISTEQUSCALE;} ; skyFrame : /* empty */ {$$ = currentSky = Coord::FK5;} | FK4_ {$$ = currentSky = Coord::FK4;} | FK4_NO_E_ {$$ = currentSky = Coord::FK4_NO_E;} | B1950_ {$$ = currentSky = Coord::FK4;} | FK5_ {$$ = currentSky = Coord::FK5;} | J2000_ {$$ = currentSky = Coord::FK5;} | ICRS_ {$$ = currentSky = Coord::ICRS;} | GALACTIC_ {$$ = currentSky = Coord::GALACTIC;} | SUPERGALACTIC_ {$$ = currentSky = Coord::SUPERGALACTIC;} | ECLIPTIC_ {$$ = currentSky = Coord::ECLIPTIC;} | HELIOECLIPTIC_ {$$ = currentSky = Coord::HELIOECLIPTIC;} ; skyFormat : /* empty */ {$$=Coord::DEGREES;} | DEGREES_ {$$=Coord::DEGREES;} | SEXAGESIMAL_ {$$=Coord::SEXAGESIMAL;} ; skyDist : /* empty */ {$$=Coord::DEGREE;} | DEGREES_ {$$=Coord::DEGREE;} | ARCMIN_ {$$=Coord::ARCMIN;} | ARCSEC_ {$$=Coord::ARCSEC;} ; contourClipMode: numeric {$$ = $1;} | MINMAX_ {$$ = FrScale::MINMAX;} | ZSCALE_ {$$ = FrScale::ZSCALE;} | ZMAX_ {$$ = FrScale::ZMAX;} | USER_ {$$ = FrScale::USERCLIP;} ; shmType : /* empty */ {$$ = Base::SHMID;} | SHMID_ {$$ = Base::SHMID;} | KEY_ {$$ = Base::KEY;} ; incrLoad: /* empty */ {$$ = Base::LOADALL;} | ALL_ {$$ = Base::LOADALL;} | INCR_ {$$ = Base::INCR;} ; layerType : /* empty */ {$$ = Base::IMG;} | IMAGE_ {$$ = Base::IMG;} | MASK_ {$$ = Base::MASK;} ; pointShape: /* empty */ {$$ = Point::CIRCLE;} | CIRCLE_ {$$ = Point::CIRCLE;} | BOX_ {$$ = Point::BOX;} | DIAMOND_ {$$ = Point::DIAMOND;} | CROSS_ {$$ = Point::CROSS;} | 'X' {$$ = Point::EX;} | ARROW_ {$$ = Point::ARROW;} | BOXCIRCLE_ {$$ = Point::BOXCIRCLE;} ; pointSize: /* empty */ {$$ = POINTSIZE;} | INT {$$ = $1;} ; analysisMethod: CPANDA_ {$$ = Marker::PANDA;} | HISTOGRAM_ {$$ = Marker::HISTOGRAM;} | PLOT2D_ {$$ = Marker::PLOT2D;} | PLOT3D_ {$$ = Marker::PLOT3D;} | RADIAL_ {$$ = Marker::RADIAL;} | STATS_ {$$ = Marker::STATS;} ; analysisParam : /* emtpy */ {$$ = Marker::AVERAGE;} | AVERAGE_ {$$ = Marker::AVERAGE;} | SUM_ {$$ = Marker::SUM;} ; endian : /* empty */ {$$ = FitsFile::NATIVE;} | NATIVE_ {$$ = FitsFile::NATIVE;} | BIG_ {$$ = FitsFile::BIG;} | BIGENDIAN_ {$$ = FitsFile::BIG;} | LITTLE_ {$$ = FitsFile::LITTLE;} | LITTLEENDIAN_ {$$ = FitsFile::LITTLE;} ; threed : VIEW_ threedView | BORDER_ threedBorder | COMPASS_ threedCompass | HIGHLITE_ threedHighlite | METHOD_ renderMethod {fr->set3dRenderMethodCmd($2);} | BACKGROUND_ renderBackground {fr->set3dRenderBackgroundCmd($2);} | SCALE_ numeric {fr->set3dScaleCmd($2);} | PRESERVE_ {fr->set3dPreserveCmd();} | THRESHOLD_ numeric {/* needed for compatibility with old version of backup */} ; threedBorder : yesno {fr->set3dBorderCmd($1);} | COLOR_ STRING {fr->set3dBorderColorCmd($2);} ; threedCompass : yesno {fr->set3dCompassCmd($1);} | COLOR_ STRING {fr->set3dCompassColorCmd($2);} ; threedHighlite : yesno {fr->set3dHighliteCmd($1);} | COLOR_ STRING {fr->set3dHighliteColorCmd($2);} ; threedView : numeric numeric {fr->set3dViewCmd($1,$2);} | POINT_ numeric numeric numeric numeric numeric {fr->set3dViewPointCmd(Vector3d($2,$3,$4),Vector($5,$6));} | BEGIN_ numeric numeric {fr->view3dBeginCmd($2,$3);} | MOTION_ numeric numeric {fr->view3dMotionCmd($2,$3);} | END_ numeric numeric {fr->view3dEndCmd($2,$3);} ; analysis : RESET_ {fr->analysisMarkersResetCmd();} | SHAPE_ analysisShape ; analysisShape : CIRCLE_ numeric numeric {fr->analysisMarkersSelectCmd("circle", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | ELLIPSE_ numeric numeric {fr->analysisMarkersSelectCmd("ellipse", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | BOX_ numeric numeric {fr->analysisMarkersSelectCmd("box", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | POLYGON_ numeric numeric {fr->analysisMarkersSelectCmd("polygon", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | POINT_ numeric numeric {fr->analysisMarkersSelectCmd("point", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | VECTOR_ numeric numeric {fr->analysisMarkersSelectCmd("vector", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | ANNULUS_ numeric numeric {fr->analysisMarkersSelectCmd("annulus", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | ELLIPSEANNULUS_ numeric numeric {fr->analysisMarkersSelectCmd("ellipseannulus", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} | BOXANNULUS_ numeric numeric {fr->analysisMarkersSelectCmd("boxannulus", fr->mapToRef(Vector($2,$3), Coord::CANVAS));} ; bin : ABOUT_ binAbout | COLS_ STRING STRING STRING {fr->binColsCmd($2,$3,$4);} | DEPTH_ INT {fr->binDepthCmd($2);} | FACTOR_ binFactor | FUNCTION_ binFunction | BUFFER_ SIZE_ INT {fr->binBufferSizeCmd($3);} | TO_ binTo | FILTER_ STRING {fr->binFilterCmd($2);} ; binAbout : CENTER_ {fr->binAboutCmd();} | numeric numeric {fr->binAboutCmd(Vector($1,$2));} ; binFactor : numeric {fr->binFactorCmd(Vector($1,$1));} | numeric numeric {fr->binFactorCmd(Vector($1,$2));} | numeric ABOUT_ numeric numeric {fr->binFactorAboutCmd(Vector($1,$1), Vector($3,$4));} | numeric numeric ABOUT_ numeric numeric {fr->binFactorAboutCmd(Vector($1,$2), Vector($4,$5));} | TO_ numeric {fr->binFactorToCmd(Vector($2,$2));} | TO_ numeric numeric {fr->binFactorToCmd(Vector($2,$3));} | TO_ numeric ABOUT_ numeric numeric {fr->binFactorToAboutCmd(Vector($2,$2), Vector($4,$5));} | TO_ numeric numeric ABOUT_ numeric numeric {fr->binFactorToAboutCmd(Vector($2,$3), Vector($5,$6));} ; binFunction : AVERAGE_ {fr->binFunctionCmd(FitsHist::AVERAGE);} | SUM_ {fr->binFunctionCmd(FitsHist::SUM);} ; binTo : FIT_ {fr->binToFitCmd();} | numeric numeric ABOUT_ CENTER_ STRING STRING STRING {fr->binCmd(Vector($1,$2), $5, $6, $7);} | numeric numeric INT numeric numeric ABOUT_ CENTER_ STRING STRING STRING STRING {fr->binCmd(Vector($1,$2), $3, Vector($4,$5), $8, $9, $10, $11);} | numeric numeric ABOUT_ numeric numeric STRING STRING STRING {fr->binCmd(Vector($1,$2), Vector($4,$5), $6, $7, $8);} | numeric numeric INT numeric numeric ABOUT_ numeric numeric STRING STRING STRING STRING {fr->binCmd(Vector($1,$2), $3, Vector($4,$5), Vector($7,$8), $9, $10, $11, $12);} ; block : numeric {fr->blockCmd(Vector($1,$1));} | numeric numeric {fr->blockCmd(Vector($1,$2));} | TO_ blockTo ; blockTo : FIT_ {fr->blockToFitCmd();} | numeric {fr->blockToCmd(Vector($1,$1));} | numeric numeric {fr->blockToCmd(Vector($1,$2));} ; clip : SCOPE_ clipScope | MODE_ clipMode | MINMAX_ clipMinMax | USER_ clipUser | ZSCALE_ clipZScale | PRESERVE_ yesno { // backward compatibility with backup fr->clipPreserveCmd($2); } ; clipUser: numeric numeric {fr->clipUserCmd($1,$2);} | LOW_ numeric {fr->clipUserLowCmd($2);} | HIGH_ numeric {fr->clipUserHighCmd($2);} ; clipScope: GLOBAL_ {fr->clipScopeCmd(FrScale::GLOBAL);} | LOCAL_ {fr->clipScopeCmd(FrScale::LOCAL);} ; clipMode: numeric {fr->clipModeCmd($1);} | MINMAX_ {fr->clipModeCmd(FrScale::MINMAX);} | ZSCALE_ {fr->clipModeCmd(FrScale::ZSCALE);} | ZMAX_ {fr->clipModeCmd(FrScale::ZMAX);} | USER_ {fr->clipModeCmd(FrScale::USERCLIP);} ; clipMinMax : MODE_ clipMinMaxMode | SAMPLE_ INT { // backward compatibility } ; clipMinMaxMode : AUTO_ {fr->clipMinMaxModeCmd(FrScale::SCAN);} | SCAN_ {fr->clipMinMaxModeCmd(FrScale::SCAN);} | SAMPLE_ { // backward compatibility fr->clipMinMaxModeCmd(FrScale::SCAN); } | DATAMIN_ {fr->clipMinMaxModeCmd(FrScale::DATAMIN);} | IRAFMIN_ {fr->clipMinMaxModeCmd(FrScale::IRAFMIN);} ; clipZScale: CONTRAST_ numeric {fr->clipZScaleContrastCmd($2);} | SAMPLE_ INT {fr->clipZScaleSampleCmd($2);} | LINE_ INT {fr->clipZScaleLineCmd($2);} ; colormap : INT numeric numeric INT POINTER POINTER INT {fr->colormapCmd($1, $2, $3, $4, (unsigned short*)$5, (unsigned char*)$6, $7);} | RGB_ numeric numeric numeric numeric numeric numeric INT POINTER INT {fr->colormapCmd($2,$3,$4,$5,$6,$7,$8,(unsigned char*)$9,$10);} | BEGIN_ {fr->colormapBeginCmd();} | MOTION_ colormapMotion | END_ {fr->colormapEndCmd();} ; colormapMotion: INT numeric numeric INT POINTER POINTER INT {fr->colormapMotionCmd($1, $2, $3, $4, (unsigned short*)$5, (unsigned char*)$6, $7);} | RGB_ numeric numeric numeric numeric numeric numeric INT POINTER INT {fr->colormapMotionCmd($2,$3,$4,$5,$6,$7,$8, (unsigned char*)$9,$10);} colorscale : scaleType {fr->colorScaleCmd((FrScale::ColorScaleType)$1);} | LOG_ numeric {fr->colorScaleLogCmd($2);} ; contour : AUX_ contourAux | COLOR_ STRING {fr->contourSetColorCmd($2);} | COPY_ coordSystem skyFrame {fr->contourCopyCmd((Coord::CoordSystem)$2, (Coord::SkyFrame)$3);} | CREATE_ contourCreate | DASH_ INT {fr->contourSetDashCmd($2);} | DELETE_ {fr->contourDeleteCmd();} | DELETE_ ALL_ {fr->contourDeleteAllCmd();} | LOAD_ STRING INT INT STRING coordSystem skyFrame {fr->contourLoadCmd($2, $3, $4, $5, (Coord::CoordSystem)$6, (Coord::SkyFrame)$7);} | PASTE_ STRING INT INT POINTER coordSystem skyFrame {fr->contourPasteCmd($2, $3, $4, $5, (Coord::CoordSystem)$6, (Coord::SkyFrame)$7);} | SAVE_ STRING coordSystem skyFrame {fr->contourSaveCmd($2, (Coord::CoordSystem)$3, (Coord::SkyFrame)$4);} | WIDTH_ INT {fr->contourSetLineWidthCmd($2);} ; contourAux : HEAD_ {fr->contourAuxHeadCmd();} | NEXT_ {fr->contourAuxNextCmd();} | SAVE_ STRING coordSystem skyFrame {fr->contourAuxSaveCmd($2, (Coord::CoordSystem)$3, (Coord::SkyFrame)$4);} ; contourCreate : STRING INT INT contourmethod INT INT scaleType numeric contourClipMode numeric numeric STRING {fr->contourCreateCmd($1,$2,$3,(FVContour::Method)$4,$5,$6,(FrScale::ColorScaleType)$7,$8,$9,Vector($10,$11),$12);} | POLYGON_ markerProperties {fr->createContourPolygonCmd(currentColor,currentDash,currentWidth, currentFont, currentText, currentProps, NULL, taglist,cblist);} ; contourmethod : SMOOTH_ {$$ = FVContour::SMOOTH;} | BLOCK_ {$$ = FVContour::BLOCK;} ; crop : /* empty */ {fr->cropCmd();} | numeric numeric numeric numeric coordSystem skyFrame {fr->cropCmd(Vector($1,$2), Vector($3,$4), (Coord::CoordSystem)$5, (Coord::SkyFrame)$6);} | CENTER_ coord coordSystem skyFrame numeric numeric coordSystem skyDist {fr->cropCenterCmd(Vector($2), (Coord::CoordSystem)$3, (Coord::SkyFrame)$4, Vector($5,$6), (Coord::CoordSystem)$7, (Coord::SkyDist)$8);} | THREED_ crop3d | BEGIN_ numeric numeric {fr->cropBeginCmd(Vector($2,$3));} | MOTION_ numeric numeric {fr->cropMotionCmd(Vector($2,$3));} | END_ numeric numeric {fr->cropEndCmd(Vector($2,$3));} ; crop3d : /* empty */ {fr->crop3dCmd();} | numeric numeric coordSystem {fr->crop3dCmd($1, $2, (Coord::CoordSystem)$3);} | BEGIN_ numeric numeric INT {fr->crop3dBeginCmd(Vector($2,$3),$4);} | MOTION_ numeric numeric INT {fr->crop3dMotionCmd(Vector($2,$3),$4);} | END_ numeric numeric INT {fr->crop3dEndCmd(Vector($2,$3),$4);} ; crosshair: internalSystem numeric numeric {fr->crosshairCmd(Vector($2,$3), (Coord::InternalSystem)$1);} | coordSystem skyFrame coord {fr->crosshairCmd(Vector($3), (Coord::CoordSystem)$1, (Coord::SkyFrame)$2);} | yesno {fr->crosshairCmd($1);} | WARP_ numeric numeric {fr->crosshairWarpCmd(Vector($2,$3));} | BEGIN_ MOTION_ internalSystem numeric numeric {fr->crosshairCmd(Vector($4,$5), (Coord::InternalSystem)$3);} | MOTION_ internalSystem numeric numeric {fr->crosshairCmd(Vector($3,$4), (Coord::InternalSystem)$2);} | BEGIN_ MOTION_ coordSystem coord {fr->crosshairCmd(Vector($4), (Coord::CoordSystem)$3);} | MOTION_ coordSystem coord {fr->crosshairCmd(Vector($3), (Coord::CoordSystem)$2);} ; cube : AXES_ INT {fr->axesOrderCmd($2);} ; fitsy : HAS_ EXT_ STRING {fr->fitsyHasExtCmd($3);} ; get : BG_ COLOR_ {fr->getBgColorCmd();} | BIN_ getBin | BLOCK_ getBlock | CLIP_ getClip | COLORMAP_ getColorMap | COLORBAR_ getColorbar | COLORSCALE_ getColorScale | CONTOUR_ getContour | COORDINATES_ getCoord | CROP_ getCrop | CROSSHAIR_ getCrosshair | CURSOR_ getCursor | CUBE_ getCube | DATA_ getData | DATASEC_ {fr->getDATASECCmd();} | FITS_ getFits | GRID_ getGrid | HISTOGRAM_ STRING STRING INT {fr->getHistogramCmd($2,$3,$4);} | HORIZONTAL_ CUT_ STRING STRING numeric numeric internalSystem {fr->getHorzCutCmd($3,$4,Vector($5,$6),(Coord::InternalSystem)$7);} | IIS_ getiis | INFO_ getInfo | IRAF_ ALIGN_ {fr->getIRAFAlignCmd();} | MINMAX_ {fr->getMinMaxCmd();} | MARKER_ markerLayer markerGet | MASK_ getMask | NAN_ COLOR_ {fr->getNANColorCmd();} | ORIENT_ {fr->getOrientCmd();} | PAN_ getPan | PIXEL_ TABLE_ internalSystem numeric numeric INT INT STRING {fr->getPixelTableCmd(Vector($4,$5), (Coord::InternalSystem)$3, $6, $7, $8);} | RGB_ getRGB | ROTATE_ getRotate | SMOOTH_ getSmooth | THREADS_ {fr->getThreadsCmd();} | THREED_ getThreed | TYPE_ {fr->getTypeCmd();} | VALUE_ internalSystem numeric numeric {fr->getValueCmd(Vector($3,$4),(Coord::InternalSystem)$2);} | VERTICAL_ CUT_ STRING STRING numeric numeric internalSystem {fr->getVertCutCmd($3,$4,Vector($5,$6),(Coord::InternalSystem)$7);} | WCS_ getWCS | ZOOM_ getZoom ; getBin : DEPTH_ {fr->getBinDepthCmd();} | FACTOR_ {fr->getBinFactorCmd();} | FUNCTION_ {fr->getBinFunctionCmd();} | BUFFER_ SIZE_ {fr->getBinBufferSizeCmd();} | CURSOR_ {fr->getBinCursorCmd();} | FILTER_ {fr->getBinFilterCmd();} | COLS_ getBinCols | LIST_ {fr->getBinListCmd();} ; getBinCols : /* empty */ {fr->getBinColsCmd();} | MINMAX_ STRING {fr->getBinColsMinMaxCmd($2);} | DIM_ STRING {fr->getBinColsDimCmd($2);} ; getBlock : FACTOR_ {fr->getBlockCmd();} ; getClip : getClipLimits | SCOPE_ {fr->getClipScopeCmd();} | MODE_ {fr->getClipModeCmd();} | MINMAX_ getClipMinMax | USER_ LEVEL_ {fr->getClipUserCmd();} | ZSCALE_ getClipZScale | PRESERVE_ { // backward compatibility with backup fr->getClipPreserveCmd(); } ; getClipLimits: /* empty */ {fr->getClipCmd();} | numeric {fr->getClipCmd($1);} | MINMAX_ {fr->getClipCmd(FrScale::MINMAX);} | ZSCALE_ {fr->getClipCmd(FrScale::ZSCALE);} | ZMAX_ {fr->getClipCmd(FrScale::ZMAX);} | USER_ {fr->getClipCmd(FrScale::USERCLIP);} ; getClipMinMax : MODE_ {fr->getClipMinMaxModeCmd();} | SAMPLE_ {fr->getClipMinMaxSampleCmd();} ; getClipZScale: CONTRAST_ {fr->getClipZScaleContrastCmd();} | SAMPLE_ {fr->getClipZScaleSampleCmd();} | LINE_ {fr->getClipZScaleLineCmd();} ; getColorbar: /* empty */ {fr->getColorbarCmd();} | TAG_ {fr->getColorbarTagCmd();} ; getColorMap : LEVEL_ getColorMapLevel ; getColorMapLevel: INT {fr->getColorMapLevelCmd($1);} | INT internalSystem numeric numeric {fr->getColorMapLevelCmd($1,Vector($3,$4),(Coord::InternalSystem)$2);} | INT numeric numeric scaleType numeric {fr->getColorMapLevelCmd($1,$2,$3,(FrScale::ColorScaleType)$4,$5);} ; getColorScale : /* empty */ {fr->getColorScaleCmd();} | LEVEL_ getColorScaleLevel | LOG_ {fr->getColorScaleLogCmd();} ; getColorScaleLevel: INT numeric numeric scaleType numeric {fr->getColorScaleLevelCmd($1,$2,$3,(FrScale::ColorScaleType)$4,$5);} ; getContour: coordSystem skyFrame {fr->getContourCmd((Coord::CoordSystem)$1,(Coord::SkyFrame)$2);} | AUX_ getContourAux | CLIP_ getContourClip | COLOR_ {fr->getContourColorNameCmd();} | DASH_ {fr->getContourDashCmd();} | LEVEL_ {fr->getContourLevelCmd();} | NUMBER_ LEVEL_ {fr->getContourNumLevelCmd();} | METHOD_ {fr->getContourMethodCmd();} | COLORSCALE_ getContourColorScale | SMOOTH_ {fr->getContourSmoothCmd();} | WIDTH_ {fr->getContourLineWidthCmd();} ; getContourAux: COLOR_ {fr->getContourAuxColorNameCmd();} | DASH_ {fr->getContourAuxDashCmd();} | WIDTH_ {fr->getContourAuxLineWidthCmd();} ; getContourClip : /* empty */ {fr->getContourClipCmd();} | MODE_ {fr->getContourClipModeCmd();} ; getContourColorScale : /* empty */ {fr->getContourScaleCmd();} | LOG_ {fr->getContourScaleLogCmd();} ; getCoord : numeric numeric coordSystem skyFrame skyFormat {fr->getCoordCmd(Vector($1,$2), (Coord::CoordSystem)$3, (Coord::SkyFrame)$4, (Coord::SkyFormat)$5);} | internalSystem numeric numeric coordSystem skyFrame skyFormat { // backward compatibility fr->getCoordCmd(Vector($2,$3), (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6); } | numeric coordSystem coordSystem INT {fr->getCoord3axisCmd($1, (Coord::CoordSystem)$2, (Coord::CoordSystem)$3, $4);} ; getCrop : coordSystem skyFrame skyFormat {fr->getCropCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3);} | CENTER_ coordSystem skyFrame skyFormat coordSystem skyDist {fr->getCropCenterCmd((Coord::CoordSystem)$2, (Coord::SkyFrame)$3, (Coord::SkyFormat)$4, (Coord::CoordSystem)$5, (Coord::SkyDist)$6);} | THREED_ coordSystem {fr->getCrop3dCmd((Coord::CoordSystem)$2);} ; getCrosshair: internalSystem {fr->getCrosshairCmd((Coord::InternalSystem)$1);} | coordSystem skyFrame skyFormat precision {fr->getCrosshairCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3, (Base::Precision)$4);} | STATUS_ {fr->getCrosshairStatusCmd();} ; getCube : AXES_ {fr->getAxesOrderCmd();} ; getCursor : internalSystem {fr->getCursorCmd((Coord::InternalSystem)$1);} | coordSystem skyFrame skyFormat precision {fr->getCursorCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3, (Base::Precision)$4);} ; getData : coordSystem skyFrame coord numeric numeric STRING {fr->getDataValuesCmd(1, Vector($3), (Coord::CoordSystem)$1, (Coord::SkyFrame)$2, Vector($4,$5), $6);} | INT coordSystem skyFrame coord numeric numeric STRING {fr->getDataValuesCmd($1, Vector($4), (Coord::CoordSystem)$2, (Coord::SkyFrame)$3, Vector($5,$6), $7);} | internalSystem numeric numeric INT INT {fr->getDataValuesCmd(Vector($2,$3),(Coord::InternalSystem)$1, Vector($4,$5));} ; getInfo : STRING {fr->getInfoCmd($1);} | CLIP_ {fr->getInfoClipCmd();} | internalSystem numeric numeric STRING {fr->getInfoCmd(Vector($2,$3), (Coord::InternalSystem)$1, $4);} ; getiis : POINTER INT INT INT INT {fr->iisGetCmd((char*)$1,$2,$3,$4,$5);} | CURSOR_ {fr->iisGetCursorCmd();} | FILE_ NAME_ getIISFileName ; getIISFileName : /* empty */ {fr->iisGetFileNameCmd();} | INT {fr->iisGetFileNameCmd($1);} | numeric numeric {fr->iisGetFileNameCmd(Vector($1,$2));} ; getFits : NAXES_ /* empty */ {fr->getFitsNAxesCmd();} | CENTER_ coordSystem skyFrame skyFormat precision {fr->getFitsCenterCmd((Coord::CoordSystem)$2,(Coord::SkyFrame)$3,(Coord::SkyFormat)$4, (Base::Precision)$5);} | COUNT_ {fr->getFitsCountCmd();} | DEPTH_ getFitsDepth | BITPIX_ {fr->getBitpixCmd();} | EXT_ getFitsExt | FILE_ NAME_ getFitsFileName | HEADER_ getFitsHeader | HEIGHT_ {fr->getFitsHeightCmd();} | OBJECT_ NAME_ {fr->getFitsObjectNameCmd();} | SIZE_ {fr->getFitsSizeCmd();} | SIZE_ coordSystem skyFrame skyDist precision {fr->getFitsSizeCmd((Coord::CoordSystem)$2,(Coord::SkyFrame)$3,(Coord::SkyDist)$4, (Base::Precision)$5);} | SLICE_ getFitsSlice | WIDTH_ {fr->getFitsWidthCmd();} ; getFitsExt : INT {fr->getFitsExtCmd($1);} | internalSystem numeric numeric {fr->getFitsExtCmd(Vector($2,$3),(Coord::InternalSystem)$1);} getFitsHeader : INT {fr->getFitsHeaderCmd($1);} | KEYWORD_ STRING {fr->getFitsHeaderKeywordCmd(1,$2);} | INT KEYWORD_ STRING {fr->getFitsHeaderKeywordCmd($1,$3);} | WCS_ INT {fr->getFitsHeaderWCSCmd($2);} ; getFitsDepth : /* empty */ {fr->getFitsDepthCmd(2);} | INT {fr->getFitsDepthCmd($1);} ; getFitsFileName: fileNameType {fr->getFitsFileNameCmd((Base::FileNameType)$1);} | fileNameType internalSystem numeric numeric {fr->getFitsFileNameCmd(Vector($3,$4), (Coord::InternalSystem)$2, (Base::FileNameType)$1);} | fileNameType INT {fr->getFitsFileNameCmd($2, (Base::FileNameType)$1);} ; getFitsSlice : /* empty */ {fr->getFitsSliceCmd(2);} | INT {fr->getFitsSliceCmd($1);} | coordSystem {fr->getFitsSliceCmd(2, (Coord::CoordSystem)$1);} | INT coordSystem {fr->getFitsSliceCmd($1, (Coord::CoordSystem)$2);} ; getGrid : /* empty */ {fr->getGridCmd();} | OPTION_ {fr->getGridOptionCmd();} | VAR_ {fr->getGridVarsCmd();} ; getMask : COLOR_ {fr->getMaskColorCmd();} | MARK_ {fr->getMaskMarkCmd();} | TRANSPARENCY_{fr->getMaskTransparencyCmd();} ; getPan : PRESERVE_ {fr->getPanPreserveCmd();} ; getRGB : CHANNEL_ {fr->getRGBChannelCmd();} | SYSTEM_ {fr->getRGBSystemCmd();} | VIEW_ {fr->getRGBViewCmd();} ; getRotate : precision {fr->getRotateCmd((Base::Precision)$1);} ; getSmooth : FUNCTION_ {fr->getSmoothFunctionCmd();} | RADIUS_ {fr->getSmoothRadiusCmd();} ; getThreed : VIEW_ getThreedView | BORDER_ getThreedBorder | COMPASS_ getThreedCompass | HIGHLITE_ getThreedHighlite | METHOD_ {fr->get3dRenderMethodCmd();} | BACKGROUND_ {fr->get3dRenderBackgroundCmd();} | SCALE_ {fr->get3dScaleCmd();} ; getThreedBorder : {fr->get3dBorderCmd();} | COLOR_ {fr->get3dBorderColorCmd();} ; getThreedCompass : {fr->get3dCompassCmd();} | COLOR_ {fr->get3dCompassColorCmd();} ; getThreedHighlite : {fr->get3dHighliteCmd();} | COLOR_ {fr->get3dHighliteColorCmd();} ; getThreedView : {fr->get3dViewCmd();} | POINT_ {fr->get3dViewPointCmd();} ; getWCS : /* empty */ {fr->getWCSCmd();} | ALIGN_ getWCSAlign | NAME_ wcsSystem {fr->getWCSNameCmd((Coord::CoordSystem)$2);} ; getWCSAlign : /* empty */ {fr->getWCSAlignCmd();} | POINTER_ {fr->getWCSAlignPointerCmd();} ; getZoom : precision {fr->getZoomCmd((Base::Precision)$1);} ; grid : CREATE_ gridCreate | DELETE_ {fr->gridDeleteCmd();} ; gridCreate: coordSystem skyFrame skyFormat gridType STRING STRING {fr->gridCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3, (Grid2d::GridType)$4, $5, $6);} | coordSystem skyFrame skyFormat gridType STRING { // backward compatibility with backup fr->gridCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3, (Grid2d::GridType)$4, $5, ""); } ; gridType : ANALYSIS_ {$$=Grid2d::ANALYSIS;} | PUBLICATION_ {$$=Grid2d::PUBLICATION;} ; has : AMPLIFIER_ {fr->hasAmplifierCmd();} | BIN_ hasBin | CONTOUR_ hasContour | CROP_ {fr->hasCropCmd();} | DATAMIN_ {fr->hasDATAMINCmd();} | DATASEC_ {fr->hasDATASECCmd();} | DETECTOR_ {fr->hasDetectorCmd();} | FITS_ hasFits | GRID_ {fr->hasGridCmd();} | IIS_ {fr->hasIISCmd();} | IRAFMIN_ {fr->hasIRAFMINCmd();} | MARKER_ hasMarker | PHYSICAL_ {fr->hasPhysicalCmd();} | SMOOTH_ {fr->hasSmoothCmd();} | SYSTEM_ coordSystem {fr->hasSystemCmd((Coord::CoordSystem)$2);} | WCS_ hasWCS ; hasBin : COLUMN_ STRING {fr->hasBinColCmd($2);} ; hasContour : /* empty */ {fr->hasContourCmd();} | AUX_ {fr->hasContourAuxCmd();} ; hasFits : /* empty */ {fr->hasFitsCmd();} | BIN_ {fr->hasFitsBinCmd();} | CUBE_ {fr->hasFitsCubeCmd();} | MOSAIC_ {fr->hasFitsMosaicCmd();} ; hasMarker : HIGHLITE_ {fr->hasMarkerHighlitedCmd();} | SELECT_ {fr->hasMarkerSelectedCmd();} | PASTE_ {fr->hasMarkerPasteCmd();} | UNDO_ {fr->hasMarkerUndoCmd();} ; hasWCS : coordSystem {fr->hasWCSCmd((Coord::CoordSystem)$1);} | EQUATORIAL_ coordSystem {fr->hasWCSEquCmd((Coord::CoordSystem)$2);} | CELESTRIAL_ coordSystem {fr->hasWCSCelCmd((Coord::CoordSystem)$2);} | ALT_ {fr->hasWCSAltCmd();} | THREED_ coordSystem {fr->hasWCSxCmd((Coord::CoordSystem)$2);} ; iis : NEW_ INT INT {fr->iisCmd($2,$3);} | ERASE_ {fr->iisEraseCmd();} | MESSAGE_ STRING {fr->iisMessageCmd($2);} | CURSOR_ iiscursor | SET_ FILE_ NAME_ iisSetFileName | SET_ POINTER INT INT INT INT {fr->iisSetCmd((const char*)$2,$3,$4,$5,$6);} | UPDATE_ {fr->iisUpdateCmd();} | WCS_ numeric numeric numeric numeric numeric numeric numeric numeric INT {fr->iisWCSCmd(Matrix($2,$3,$4,$5,$6,$7),Vector($8,$9),$10);} ; iisSetFileName : STRING {fr->iisSetFileNameCmd($1);} | STRING INT {fr->iisSetFileNameCmd($1,$2);} ; iiscursor: INT INT CANVAS_ {fr->iisSetCursorCmd(Vector($1,$2),Coord::CANVAS);} | INT INT coordSystem {fr->iisSetCursorCmd(Vector($1,$2),(Coord::CoordSystem)$3);} | MODE_ yesno {fr->iisCursorModeCmd($2);} ; load : ARRAY_ loadArr | ENVI_ loadENVI | FITS_ loadFits | INCR_ loadIncr | NRRD_ loadNRRD | PHOTO_ loadPhoto ; loadArr : STRING ALLOC_ STRING layerType {fr->loadArrAllocCmd($3, $1, (Base::LayerType)$4);} | STRING ALLOCGZ_ STRING layerType {fr->loadArrAllocGZCmd($3, $1, (Base::LayerType)$4);} | STRING CHANNEL_ STRING layerType {fr->loadArrChannelCmd($3, $1, (Base::LayerType)$4);} | STRING MMAP_ layerType {fr->loadArrMMapCmd($1, (Base::LayerType)$3);} | STRING MMAPINCR_ layerType {fr->loadArrMMapIncrCmd($1, (Base::LayerType)$3);} | STRING SHARED_ shmType INT layerType {fr->loadArrShareCmd((Base::ShmType)$3, $4, $1, (Base::LayerType)$5);} | STRING SOCKET_ INT layerType {fr->loadArrSocketCmd($3, $1, (Base::LayerType)$4);} | STRING SOCKETGZ_ INT layerType {fr->loadArrSocketGZCmd($3, $1, (Base::LayerType)$4);} | STRING VAR_ STRING layerType {fr->loadArrVarCmd($3, $1, (Base::LayerType)$4);} | RGB_ CUBE_ loadArrayRGBCube ; loadArrayRGBCube : STRING ALLOC_ STRING {fr->loadArrayRGBCubeAllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadArrayRGBCubeAllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadArrayRGBCubeChannelCmd($3, $1);} | STRING MMAP_ {fr->loadArrayRGBCubeMMapCmd($1);} | STRING MMAPINCR_ {fr->loadArrayRGBCubeMMapIncrCmd($1);} | STRING SHARED_ shmType INT {fr->loadArrayRGBCubeShareCmd((Base::ShmType)$3, $4, $1);} | STRING SOCKET_ INT {fr->loadArrayRGBCubeSocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadArrayRGBCubeSocketGZCmd($3, $1);} | STRING VAR_ STRING {fr->loadArrayRGBCubeVarCmd($3, $1);} ; loadENVI : STRING STRING SMMAP_ {fr->loadENVISMMapCmd($1,$2);} ; loadFits: STRING ALLOC_ STRING layerType {fr->loadFitsAllocCmd($3, $1, (Base::LayerType)$4);} | STRING ALLOCGZ_ STRING layerType {fr->loadFitsAllocGZCmd($3, $1, (Base::LayerType)$4);} | STRING CHANNEL_ STRING layerType {fr->loadFitsChannelCmd($3, $1, (Base::LayerType)$4);} | STRING MMAP_ incrLoad layerType {fr->loadFitsMMapCmd($1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING STRING SMMAP_ incrLoad layerType {fr->loadFitsSMMapCmd($1, $2,(Base::LoadMethod)$4, (Base::LayerType)$5);} | STRING MMAPINCR_ incrLoad layerType {fr->loadFitsMMapIncrCmd($1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING SHARED_ shmType INT incrLoad layerType {fr->loadFitsShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5,(Base::LayerType)$6);} | STRING SSHARED_ shmType INT INT incrLoad layerType {fr->loadFitsSShareCmd((Base::ShmType)$3, $4, $5, $1, (Base::LoadMethod)$6,(Base::LayerType)$7);} | STRING SOCKET_ INT layerType {fr->loadFitsSocketCmd($3, $1, (Base::LayerType)$4);} | STRING SOCKETGZ_ INT layerType {fr->loadFitsSocketGZCmd($3, $1, (Base::LayerType)$4);} | STRING VAR_ STRING incrLoad layerType {fr->loadFitsVarCmd($3, $1, (Base::LoadMethod)$4, (Base::LayerType)$5);} | SLICE_ loadFitsSlice | EXT_ CUBE_ loadFitsExtCube | RGB_ IMAGE_ loadFitsRGBImage | RGB_ CUBE_ loadFitsRGBCube | MOSAIC_ loadFitsMosaic ; loadFitsSlice:STRING ALLOC_ STRING {fr->loadSliceAllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadSliceAllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadSliceChannelCmd($3, $1);} | STRING MMAP_ incrLoad {fr->loadSliceMMapCmd($1, (Base::LoadMethod)$3);} | STRING STRING SMMAP_ incrLoad {fr->loadSliceSMMapCmd($1, $2, (Base::LoadMethod)$4);} | STRING MMAPINCR_ incrLoad {fr->loadSliceMMapIncrCmd($1, (Base::LoadMethod)$3);} | STRING SHARED_ shmType INT incrLoad {fr->loadSliceShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5);} | STRING SSHARED_ shmType INT INT incrLoad {fr->loadSliceSShareCmd((Base::ShmType)$3, $4, $5, $1, (Base::LoadMethod)$6);} | STRING SOCKET_ INT {fr->loadSliceSocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadSliceSocketGZCmd($3, $1);} | STRING VAR_ STRING incrLoad {fr->loadSliceVarCmd($3, $1, (Base::LoadMethod)$4);} ; loadFitsExtCube: STRING ALLOC_ STRING {fr->loadExtCubeAllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadExtCubeAllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadExtCubeChannelCmd($3, $1);} | STRING MMAP_ incrLoad {fr->loadExtCubeMMapCmd($1, (Base::LoadMethod)$3);} | STRING MMAPINCR_ incrLoad {fr->loadExtCubeMMapIncrCmd($1, (Base::LoadMethod)$3);} | STRING SHARED_ shmType INT incrLoad {fr->loadExtCubeShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5);} | STRING SOCKET_ INT {fr->loadExtCubeSocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadExtCubeSocketGZCmd($3, $1);} | STRING VAR_ STRING incrLoad {fr->loadExtCubeVarCmd($3, $1, (Base::LoadMethod)$4);} ; loadFitsMosaic : IMAGE_ IRAF_ loadFitsMosaicImageIRAF | IRAF_ loadFitsMosaicIRAF | IMAGE_ loadFitsMosaicImageWCS | loadFitsMosaicWCS | IMAGE_ WFPC2_ loadFitsMosaicImageWFPC2 ; loadFitsMosaicImageIRAF : STRING ALLOC_ STRING layerType {fr->loadMosaicImageAllocCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING ALLOCGZ_ STRING layerType {fr->loadMosaicImageAllocGZCmd(Base::IRAF, Coord::WCS, $3, $1,(Base::LayerType)$4);} | STRING CHANNEL_ STRING layerType {fr->loadMosaicImageChannelCmd(Base::IRAF, Coord::WCS, $3, $1,(Base::LayerType)$4);} | STRING MMAP_ incrLoad layerType {fr->loadMosaicImageMMapCmd(Base::IRAF, Coord::WCS, $1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING MMAPINCR_ incrLoad layerType {fr->loadMosaicImageMMapIncrCmd(Base::IRAF, Coord::WCS, $1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING SHARED_ shmType INT incrLoad layerType {fr->loadMosaicImageShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5, (Base::LayerType)$6);} | STRING SOCKET_ INT layerType {fr->loadMosaicImageSocketCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING SOCKETGZ_ INT layerType {fr->loadMosaicImageSocketGZCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING VAR_ STRING incrLoad layerType {fr->loadMosaicImageVarCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LoadMethod)$4, (Base::LayerType)$5);} ; loadFitsMosaicIRAF : STRING ALLOC_ STRING layerType {fr->loadMosaicAllocCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING ALLOCGZ_ STRING layerType {fr->loadMosaicAllocGZCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING CHANNEL_ STRING layerType {fr->loadMosaicChannelCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING MMAP_ incrLoad layerType {fr->loadMosaicMMapCmd(Base::IRAF, Coord::WCS, $1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING STRING SMMAP_ incrLoad layerType {fr->loadMosaicSMMapCmd(Base::IRAF, Coord::WCS, $1, $2,(Base::LoadMethod)$4, (Base::LayerType)$5);} | STRING MMAPINCR_ incrLoad layerType {fr->loadMosaicMMapIncrCmd(Base::IRAF, Coord::WCS, $1,(Base::LoadMethod)$3, (Base::LayerType)$4);} | STRING SHARED_ shmType INT incrLoad layerType {fr->loadMosaicShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5, (Base::LayerType)$6);} | STRING SSHARED_ shmType INT INT incrLoad layerType {fr->loadMosaicSShareCmd(Base::IRAF, Coord::WCS, (Base::ShmType)$3, $4, $5, $1, (Base::LoadMethod)$6, (Base::LayerType)$7);} | STRING SOCKET_ INT layerType {fr->loadMosaicSocketCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING SOCKETGZ_ INT layerType {fr->loadMosaicSocketGZCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LayerType)$4);} | STRING VAR_ STRING incrLoad layerType {fr->loadMosaicVarCmd(Base::IRAF, Coord::WCS, $3, $1, (Base::LoadMethod)$4, (Base::LayerType)$5);} ; loadFitsMosaicImageWCS : wcsSystem STRING ALLOC_ STRING layerType {fr->loadMosaicImageAllocCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING ALLOCGZ_ STRING layerType {fr->loadMosaicImageAllocGZCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING CHANNEL_ STRING layerType {fr->loadMosaicImageChannelCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING MMAP_ incrLoad layerType {fr->loadMosaicImageMMapCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $2, (Base::LoadMethod)$4, (Base::LayerType)$5);} | wcsSystem STRING MMAPINCR_ incrLoad layerType {fr->loadMosaicImageMMapIncrCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $2, (Base::LoadMethod)$4, (Base::LayerType)$5);} | wcsSystem STRING SHARED_ shmType INT incrLoad layerType {fr->loadMosaicImageShareCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, (Base::ShmType)$4, $5, $2, (Base::LoadMethod)$6, (Base::LayerType)$7);} | wcsSystem STRING SOCKET_ INT layerType {fr->loadMosaicImageSocketCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING SOCKETGZ_ INT layerType {fr->loadMosaicImageSocketGZCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING VAR_ STRING incrLoad layerType {fr->loadMosaicImageVarCmd(Base::WCSMOSAIC, (Coord::CoordSystem)$1, $4, $2, (Base::LoadMethod)$5, (Base::LayerType)$6);} ; loadFitsMosaicWCS : wcsSystem STRING ALLOC_ STRING layerType {fr->loadMosaicAllocCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING ALLOCGZ_ STRING layerType {fr->loadMosaicAllocGZCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING CHANNEL_ STRING layerType {fr->loadMosaicChannelCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING MMAP_ incrLoad layerType {fr->loadMosaicMMapCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $2, (Base::LoadMethod)$4, (Base::LayerType)$5);} | wcsSystem STRING STRING SMMAP_ incrLoad layerType {fr->loadMosaicSMMapCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $2, $3, (Base::LoadMethod)$5, (Base::LayerType)$6);} | wcsSystem STRING MMAPINCR_ incrLoad layerType {fr->loadMosaicMMapIncrCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $2, (Base::LoadMethod)$4, (Base::LayerType)$5);} | wcsSystem STRING SHARED_ shmType INT incrLoad layerType {fr->loadMosaicShareCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, (Base::ShmType)$4, $5, $2, (Base::LoadMethod)$6, (Base::LayerType)$7);} | wcsSystem STRING SSHARED_ shmType INT INT incrLoad layerType {fr->loadMosaicSShareCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, (Base::ShmType)$4, $5, $6, $2, (Base::LoadMethod)$7, (Base::LayerType)$8);} | wcsSystem STRING SOCKET_ INT layerType {fr->loadMosaicSocketCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING SOCKETGZ_ INT layerType {fr->loadMosaicSocketGZCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LayerType)$5);} | wcsSystem STRING VAR_ STRING incrLoad layerType {fr->loadMosaicVarCmd((Base::WCSMOSAIC), (Coord::CoordSystem)$1, $4, $2, (Base::LoadMethod)$5, (Base::LayerType)$6);} ; loadFitsMosaicImageWFPC2 : STRING ALLOC_ STRING {fr->loadMosaicImageWFPC2AllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadMosaicImageWFPC2AllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadMosaicImageWFPC2ChannelCmd($3, $1);} | STRING MMAP_ incrLoad {fr->loadMosaicImageWFPC2MMapCmd($1,(Base::LoadMethod)$3);} | STRING MMAPINCR_ incrLoad {fr->loadMosaicImageWFPC2MMapIncrCmd($1,(Base::LoadMethod)$3);} | STRING SHARED_ shmType INT incrLoad {fr->loadMosaicImageWFPC2ShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5);} | STRING SOCKET_ INT {fr->loadMosaicImageWFPC2SocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadMosaicImageWFPC2SocketGZCmd($3, $1);} | STRING VAR_ STRING incrLoad {fr->loadMosaicImageWFPC2VarCmd($3, $1, (Base::LoadMethod)$4);} ; loadFitsRGBCube: STRING ALLOC_ STRING {fr->loadRGBCubeAllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadRGBCubeAllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadRGBCubeChannelCmd($3, $1);} | STRING MMAP_ incrLoad {fr->loadRGBCubeMMapCmd($1, (Base::LoadMethod)$3);} | STRING STRING SMMAP_ incrLoad {fr->loadRGBCubeSMMapCmd($1, $2, (Base::LoadMethod)$4);} | STRING MMAPINCR_ incrLoad {fr->loadRGBCubeMMapIncrCmd($1, (Base::LoadMethod)$3);} | STRING SHARED_ shmType INT incrLoad {fr->loadRGBCubeShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5);} | STRING SSHARED_ shmType INT INT incrLoad {fr->loadRGBCubeSShareCmd((Base::ShmType)$3, $4, $5, $1, (Base::LoadMethod)$6);} | STRING SOCKET_ INT {fr->loadRGBCubeSocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadRGBCubeSocketGZCmd($3, $1);} | STRING VAR_ STRING incrLoad {fr->loadRGBCubeVarCmd($3, $1, (Base::LoadMethod)$4);} ; loadFitsRGBImage: STRING ALLOC_ STRING {fr->loadRGBImageAllocCmd($3, $1);} | STRING ALLOCGZ_ STRING {fr->loadRGBImageAllocGZCmd($3, $1);} | STRING CHANNEL_ STRING {fr->loadRGBImageChannelCmd($3, $1);} | STRING MMAP_ incrLoad {fr->loadRGBImageMMapCmd($1, (Base::LoadMethod)$3);} | STRING MMAPINCR_ incrLoad {fr->loadRGBImageMMapIncrCmd($1, (Base::LoadMethod)$3);} | STRING SHARED_ shmType INT incrLoad {fr->loadRGBImageShareCmd((Base::ShmType)$3, $4, $1, (Base::LoadMethod)$5);} | STRING SOCKET_ INT {fr->loadRGBImageSocketCmd($3, $1);} | STRING SOCKETGZ_ INT {fr->loadRGBImageSocketGZCmd($3, $1);} | STRING VAR_ STRING incrLoad {fr->loadRGBImageVarCmd($3, $1, (Base::LoadMethod)$4);} ; loadNRRD : STRING ALLOC_ STRING layerType {fr->loadNRRDAllocCmd($3, $1, (Base::LayerType)$4);} | STRING CHANNEL_ STRING layerType {fr->loadNRRDChannelCmd($3, $1, (Base::LayerType)$4);} | STRING MMAP_ layerType {fr->loadNRRDMMapCmd($1, (Base::LayerType)$3);} | STRING SHARED_ shmType INT layerType {fr->loadNRRDShareCmd((Base::ShmType)$3, $4, $1, (Base::LayerType)$5);} | STRING SOCKET_ INT layerType {fr->loadNRRDSocketCmd($3, $1, (Base::LayerType)$4);} | STRING VAR_ STRING layerType {fr->loadNRRDVarCmd($3, $1, (Base::LayerType)$4);} ; loadPhoto: /* empty */ STRING STRING {fr->loadPhotoCmd($1,$2);} | SLICE_ STRING STRING {fr->loadSlicePhotoCmd($2,$3);} ; loadIncr: DATA_ INT INT INT INT INT {fr->loadIncrDataCmd($2,$3,$4,$5,$6);} | MINMAX_ INT INT INT INT INT {fr->loadIncrMinMaxCmd($2,$3,$4,$5,$6);} | END_ {fr->loadIncrEndCmd();} ; macosx : PRINT_ { #ifdef MAC_OSX_TK fr->macosxPrintCmd(); #endif } ; magnifier: yesno {fr->magnifierCmd($1);} | GRAPHICS_ yesno {fr->magnifierGraphicsCmd($2);} | CURSOR_ yesno {fr->magnifierCursorCmd($2);} | COLOR_ STRING {fr->magnifierColorCmd($2);} | STRING INT INT {fr->magnifierCmd($1, $2, $3);} | UPDATE_ numeric numeric {fr->updateMagnifierCmd(Vector($2, $3));} | ZOOM_ numeric {fr->magnifierZoomCmd($2);} ; match : STRING STRING wcsSystem skyFrame STRING STRING wcsSystem skyFrame numeric wcsSystem skyDist STRING { fr->matchCmd($1,$2,(Coord::CoordSystem)$3,(Coord::SkyFrame)$4, $5,$6,(Coord::CoordSystem)$7,(Coord::SkyFrame)$8, $9,(Coord::CoordSystem)$10,(Coord::SkyDist)$11, $12); } marker : CENTROID_ markerCentroid | COLOR_ STRING {fr->markerColorCmd($2);} | COPY_ {fr->markerCopyCmd();} | COMMAND_ markerFormat STRING {fr->markerCommandCmd((Base::MarkerFormat)$2,$3);} | COMMAND_ markerFormat VAR_ STRING {fr->markerCommandVarCmd((Base::MarkerFormat)$2,$4);} | COMPOSITE_ DELETE_ {fr->markerCompositeDeleteCmd();} | CREATE_ {maperr =0;} markerCreate | CUT_ {fr->markerCutCmd();} | DELETE_ {fr->markerDeleteCmd();} | DELETE_ ALL_ {fr->markerDeleteAllCmd();} | EDIT_ markerEdit | EPSILON_ INT {fr->markerEpsilonCmd($2);} | FONT_ STRING {fr->markerFontCmd($2);} | HIGHLITE_ ALL_ {fr->markerHighliteAllCmd();} | HIGHLITE_ ONLY_ numeric numeric {fr->markerHighliteOnlyCmd(Vector($3,$4));} | HIGHLITE_ TOGGLE_ numeric numeric {fr->markerHighliteToggleCmd(Vector($3,$4));} | INT ANALYSIS_ analysisMethod yesno {fr->markerAnalysisCmd($1, (Marker::AnalysisTask)$3, $4);} | INT ANGLE_ angle {fr->markerAngleCmd($1,$3);} | INT ANGLE_ angle internalSystem {fr->markerAngleCmd($1,$3);} | INT ANGLE_ angle coordSystem skyFrame {fr->markerAngleCmd($1,$3,(Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT ANNULUS_ RADIUS_ numeric numeric INT internalSystem {fr->markerAnnulusRadiusCmd($1, $4, $5, $6, (Coord::InternalSystem)$7);} | INT ANNULUS_ RADIUS_ numeric numeric INT coordSystem skyDist {fr->markerAnnulusRadiusCmd($1, $4, $5, $6, (Coord::CoordSystem)$7, (Coord::SkyDist)$8);} | INT ANNULUS_ RADIUS_ STRING coordSystem skyDist {fr->markerAnnulusRadiusCmd($1, $4,(Coord::CoordSystem)$5,(Coord::SkyDist)$6);} | INT BOXANNULUS_ RADIUS_ numeric numeric numeric INT internalSystem {fr->markerBoxAnnulusRadiusCmd($1, Vector($4, $5), Vector($6, $6*$5/$4), $7, (Coord::InternalSystem)$8);} | INT BOXANNULUS_ RADIUS_ numeric numeric numeric INT coordSystem skyDist {fr->markerBoxAnnulusRadiusCmd($1, Vector($4, $5), Vector($6, $6*$5/$4), $7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT BOXANNULUS_ RADIUS_ STRING coordSystem skyDist {fr->markerBoxAnnulusRadiusCmd($1,$4,(Coord::CoordSystem)$5,(Coord::SkyDist)$6);} | INT BOX_ RADIUS_ numeric numeric internalSystem {fr->markerBoxRadiusCmd($1, Vector($4,$5), (Coord::InternalSystem)$6);} | INT BOX_ RADIUS_ numeric numeric coordSystem skyDist {fr->markerBoxRadiusCmd($1, Vector($4,$5), (Coord::CoordSystem)$6, (Coord::SkyDist)$7);} | INT BPANDA_ EDIT_ angle angle INT numeric numeric numeric INT {fr->markerBpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10);} | INT BPANDA_ EDIT_ angle angle INT numeric numeric numeric INT internalSystem {fr->markerBpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10);} | INT BPANDA_ EDIT_ angle angle INT numeric numeric numeric INT coordSystem skyFrame {fr->markerBpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10, (Coord::CoordSystem)$11, (Coord::SkyFrame)$12);} | INT BPANDA_ EDIT_ STRING STRING coordSystem skyFrame coordSystem skyDist {fr->markerBpandaEditCmd($1, $4, $5, (Coord::CoordSystem)$6, (Coord::SkyFrame)$7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT CALLBACK_ markerCallBack STRING STRING {fr->markerCallBackCmd($1,(CallBack::Type)$3,$4,$5);} | INT CIRCLE_ RADIUS_ numeric internalSystem {fr->markerCircleRadiusCmd($1, $4, (Coord::InternalSystem)$5);} | INT CIRCLE_ RADIUS_ numeric coordSystem skyDist {fr->markerCircleRadiusCmd($1, $4, (Coord::CoordSystem)$5, (Coord::SkyDist)$6);} | INT COLOR_ STRING {fr->markerColorCmd($1,$3);} | INT COMPASS_ ARROW_ yesno yesno {fr->markerCompassArrowCmd($1,$4,$5);} | INT COMPASS_ LABEL_ STRING STRING {fr->markerCompassLabelCmd($1,$4,$5);} | INT COMPASS_ RADIUS_ numeric internalSystem {fr->markerCompassRadiusCmd($1,$4,(Coord::InternalSystem)$5);} | INT COMPASS_ RADIUS_ numeric coordSystem skyDist {fr->markerCompassRadiusCmd($1,$4,(Coord::CoordSystem)$5,(Coord::SkyDist)$6);} | INT COMPASS_ SYSTEM_ coordSystem skyFrame {fr->markerCompassSystemCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT COMPOSITE_ GLOBAL_ yesno {fr->markerCompositeCmd($1,$4);} | INT CPANDA_ EDIT_ angle angle INT numeric numeric INT {fr->markerCpandaEditCmd($1, $4, $5, $6, $7, $8, $9);} | INT CPANDA_ EDIT_ angle angle INT numeric numeric INT internalSystem {fr->markerCpandaEditCmd($1, $4, $5, $6, $7, $8, $9);} | INT CPANDA_ EDIT_ angle angle INT numeric numeric INT coordSystem skyFrame {fr->markerCpandaEditCmd($1, $4, $5, $6, $7, $8, $9, (Coord::CoordSystem)$10, (Coord::SkyFrame)$11);} | INT CPANDA_ EDIT_ STRING STRING coordSystem skyFrame coordSystem skyDist {fr->markerCpandaEditCmd($1, $4, $5, (Coord::CoordSystem)$6, (Coord::SkyFrame)$7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT CREATE_ ANNULUS_ RADIUS_ numeric numeric {fr->markerAnnulusCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ BOXANNULUS_ RADIUS_ numeric numeric {fr->markerBoxAnnulusCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ BPANDA_ ANGLE_ numeric numeric {fr->markerBpandaCreateAnglesCmd($1,Vector($5,$6));} | INT CREATE_ BPANDA_ RADIUS_ numeric numeric {fr->markerBpandaCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ ELLIPSEANNULUS_ RADIUS_ numeric numeric {fr->markerEllipseAnnulusCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ EPANDA_ ANGLE_ numeric numeric {fr->markerEpandaCreateAnglesCmd($1,Vector($5,$6));} | INT CREATE_ EPANDA_ RADIUS_ numeric numeric {fr->markerEpandaCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ CPANDA_ ANGLE_ numeric numeric {fr->markerCpandaCreateAnglesCmd($1,Vector($5,$6));} | INT CREATE_ CPANDA_ RADIUS_ numeric numeric {fr->markerCpandaCreateRadiusCmd($1,Vector($5,$6));} | INT CREATE_ POLYGON_ VERTEX_ INT numeric numeric {fr->markerPolygonCreateVertexCmd($1,$5,Vector($6,$7));} | INT CREATE_ SEGMENT_ VERTEX_ INT numeric numeric {fr->markerSegmentCreateVertexCmd($1,$5,Vector($6,$7));} | INT DELETE_ {fr->markerDeleteCmd($1);} | INT DELETE_ ANNULUS_ INT {fr->markerAnnulusDeleteRadiusCmd($1,$4);} | INT DELETE_ BOXANNULUS_ INT {fr->markerBoxAnnulusDeleteRadiusCmd($1,$4);} | INT DELETE_ BPANDA_ INT {fr->markerBpandaDeleteCmd($1,$4);} | INT DELETE_ ELLIPSEANNULUS_ INT {fr->markerEllipseAnnulusDeleteRadiusCmd($1,$4);} | INT DELETE_ CALLBACK_ markerCallBack STRING {fr->markerDeleteCallBackCmd($1,(CallBack::Type)$4,$5);} | INT DELETE_ EPANDA_ INT {fr->markerEpandaDeleteCmd($1,$4);} | INT DELETE_ CPANDA_ INT {fr->markerCpandaDeleteCmd($1,$4);} | INT DELETE_ POLYGON_ VERTEX_ INT {fr->markerPolygonDeleteVertexCmd($1,$5);} | INT DELETE_ SEGMENT_ VERTEX_ INT {fr->markerSegmentDeleteVertexCmd($1,$5);} | INT DELETE_ TAG_ {fr->markerDeleteTagCmd($1);} | INT DELETE_ TAG_ STRING {fr->markerDeleteTagCmd($1,$4);} | INT DELETE_ TAG_ INT {fr->markerDeleteTagCmd($1,$4);} | INT EDIT_ BEGIN_ INT {fr->markerEditBeginCmd($1,$4);} | INT ELLIPSE_ RADIUS_ numeric numeric internalSystem {fr->markerEllipseRadiusCmd($1, Vector($4, $5), (Coord::InternalSystem)$6);} | INT ELLIPSE_ RADIUS_ numeric numeric coordSystem skyDist {fr->markerEllipseRadiusCmd($1, Vector($4, $5), (Coord::CoordSystem)$6, (Coord::SkyDist)$7);} | INT ELLIPSEANNULUS_ RADIUS_ numeric numeric numeric INT internalSystem {fr->markerEllipseAnnulusRadiusCmd($1, Vector($4,$5), Vector($6,$6*$5/$4), $7, (Coord::InternalSystem)$8);} | INT ELLIPSEANNULUS_ RADIUS_ numeric numeric numeric INT coordSystem skyDist {fr->markerEllipseAnnulusRadiusCmd($1, Vector($4,$5), Vector($6,$6*$5/$4), $7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT ELLIPSEANNULUS_ RADIUS_ STRING coordSystem skyDist {fr->markerEllipseAnnulusRadiusCmd($1, $4, (Coord::CoordSystem)$5, (Coord::SkyDist)$6);} | INT EPANDA_ EDIT_ angle angle INT numeric numeric numeric INT {fr->markerEpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10);} | INT EPANDA_ EDIT_ angle angle INT numeric numeric numeric INT internalSystem {fr->markerEpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10);} | INT EPANDA_ EDIT_ angle angle INT numeric numeric numeric INT coordSystem skyFrame {fr->markerEpandaEditCmd($1, $4, $5, $6, Vector($7,$8), Vector($9,$9*$8/$7), $10, (Coord::CoordSystem)$11, (Coord::SkyFrame)$12);} | INT EPANDA_ EDIT_ STRING STRING coordSystem skyFrame coordSystem skyDist {fr->markerEpandaEditCmd($1, $4, $5, (Coord::CoordSystem)$6, (Coord::SkyFrame)$7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT FONT_ STRING {fr->markerFontCmd($1,$3);} | INT HIGHLITE_ {fr->markerHighliteCmd($1);} | INT HIGHLITE_ ONLY_{fr->markerHighliteOnlyCmd($1);} | INT LINE_ ARROW_ yesno yesno {fr->markerLineArrowCmd($1,$4,$5);} | INT LINE_ POINT_ internalSystem coord coord {fr->markerLineCmd($1, Vector($5), Vector($6), (Coord::InternalSystem)$4);} | INT LINE_ POINT_ coordSystem skyFrame coord coord {fr->markerLineCmd($1, Vector($6), Vector($7), (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT MOVE_ numeric numeric {fr->markerMoveCmd($1, Vector($3,$4));} | INT MOVE_ FRONT_ {fr->markerFrontCmd($1);} | INT MOVE_ BACK_ {fr->markerBackCmd($1);} | INT MOVE_ TO_ internalSystem numeric numeric {fr->markerMoveToCmd($1, Vector($5,$6), (Coord::InternalSystem)$4);} | INT MOVE_ TO_ coordSystem skyFrame coord {fr->markerMoveToCmd($1,Vector($6),(Coord::CoordSystem)$4,(Coord::SkyFrame)$5);} | INT POLYGON_ RESET_ numeric numeric internalSystem {fr->markerPolygonResetCmd($1, Vector($4,$5),(Coord::InternalSystem)$6);} | INT POLYGON_ RESET_ numeric numeric coordSystem skyDist {fr->markerPolygonResetCmd($1, Vector($4,$5), (Coord::CoordSystem)$6, (Coord::SkyDist)$7);} | INT SEGMENT_ RESET_ numeric numeric internalSystem {fr->markerSegmentResetCmd($1, Vector($4,$5),(Coord::InternalSystem)$6);} | INT SEGMENT_ RESET_ numeric numeric coordSystem skyDist {fr->markerSegmentResetCmd($1, Vector($4,$5), (Coord::CoordSystem)$6, (Coord::SkyDist)$7);} | INT POINT_ SHAPE_ pointShape {fr->markerPointShapeCmd($1,(Point::PointShape)$4);} | INT POINT_ SIZE_ INT {fr->markerPointSizeCmd($1,$4);} | INT PROJECTION_ internalSystem coord coord numeric {fr->markerProjectionCmd($1, Vector($4), Vector($5), (Coord::InternalSystem)$3, $6);} | INT PROJECTION_ coordSystem skyFrame coord coord numeric coordSystem skyDist {fr->markerProjectionCmd($1, Vector($5), Vector($6), (Coord::CoordSystem)$3, (Coord::SkyFrame)$4, $7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9);} | INT PROPERTY_ markerProperty yesno {fr->markerPropertyCmd($1,$3,$4);} | INT ROTATE_ BEGIN_ {fr->markerRotateBeginCmd($1);} | INT RULER_ POINT_ internalSystem coord coord {fr->markerRulerPointCmd($1, Vector($5), Vector($6), (Coord::InternalSystem)$4);} | INT RULER_ POINT_ coordSystem skyFrame coord coord {fr->markerRulerPointCmd($1, Vector($6), Vector($7), (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT RULER_ SYSTEM_ coordSystem skyFrame coordSystem skyDist {fr->markerRulerSystemCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::CoordSystem)$6, (Coord::SkyDist)$7);} | INT SELECT_ {fr->markerSelectCmd($1);} | INT SELECT_ ONLY_ {fr->markerSelectOnlyCmd($1);} | INT TAG_ STRING {fr->markerTagCmd($1,$3);} | INT TEXT_ STRING {fr->markerTextCmd($1,$3);} | INT TEXT_ ROTATE_ yesno {fr->markerTextRotateCmd($1,$4);} | INT UNHIGHLITE_ {fr->markerUnhighliteCmd($1);} | INT UNSELECT_ {fr->markerUnselectCmd($1);} | INT VECTOR_ ARROW_ yesno {fr->markerVectorArrowCmd($1,$4);} | INT VECTOR_ POINT_ internalSystem coord numeric angle {fr->markerVectorCmd($1, Vector($5), (Coord::InternalSystem)$4, $6, $7);} | INT VECTOR_ POINT_ coordSystem skyFrame coord coordSystem skyDist numeric angle {fr->markerVectorCmd($1, Vector($6), (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, $9, (Coord::CoordSystem)$7, (Coord::SkyDist)$8, $10);} | INT WIDTH_ INT {fr->markerLineWidthCmd($1,$3);} | KEY_ {fr->markerKeyCmd();} | KEY_ numeric numeric {fr->markerKeyCmd(Vector($2,$3));} | LIST_ markerList | LOAD_ markerLoad | MOVE_ markerMoveSelected | PRESERVE_ yesno {fr->markerPreserveCmd($2);} | PROPERTY_ markerProperty yesno {fr->markerPropertyCmd($2,$3);} | PROPERTY_ markerProperty yesno numeric numeric {fr->markerPropertyCmd($2,$3,Vector($4,$5));} | ROTATE_ BEGIN_ numeric numeric {fr->markerRotateBeginCmd(Vector($3,$4));} | ROTATE_ MOTION_ numeric numeric INT {fr->markerRotateMotionCmd(Vector($3,$4),$5);} | ROTATE_ END_ {fr->markerRotateEndCmd();} | SAVE_ STRING markerFormat coordSystem skyFrame skyFormat yesno {fr->markerSaveCmd($2, (Base::MarkerFormat)$3, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6, $7);} | SAVE_ TEMPLATE_ STRING {fr->markerSaveTemplateCmd($3);} | SELECT_ markerSelect | SHOW_ markerShow | STRING COLOR_ STRING {fr->markerColorCmd($1,$3);} | STRING COPY_ {fr->markerCopyCmd($1);} | STRING DELETE_ {fr->markerDeleteCmd($1);} | STRING CUT_ {fr->markerCutCmd($1);} | STRING FONT_ STRING {fr->markerFontCmd($1,$3);} | STRING HIGHLITE_ {fr->markerHighliteCmd($1);} | STRING HIGHLITE_ ONLY_ {fr->markerHighliteOnlyCmd($1);} | STRING MOVE_ numeric numeric {fr->markerMoveCmd($1,Vector($3,$4));} | STRING MOVE_ FRONT_ {fr->markerFrontCmd($1);} | STRING MOVE_ BACK_ {fr->markerBackCmd($1);} | STRING MOVE_ TO_ internalSystem coord {fr->markerMoveToCmd($1,Vector($5),(Coord::InternalSystem)$4);} | STRING MOVE_ TO_ coordSystem skyFrame coord {fr->markerMoveToCmd($1,Vector($6),(Coord::CoordSystem)$4,(Coord::SkyFrame)$5);} | STRING PROPERTY_ markerProperty yesno {fr->markerPropertyCmd($1,$3,$4);} | STRING SELECT_ {fr->markerSelectCmd($1);} | STRING SELECT_ ONLY_ {fr->markerSelectOnlyCmd($1);} | STRING UNHIGHLITE_ {fr->markerUnhighliteCmd($1);} | STRING UNSELECT_ {fr->markerUnselectCmd($1);} | TAG_ EDIT_ STRING STRING {fr->markerTagEditCmd($3,$4);} | TAG_ DELETE_ STRING {fr->markerTagDeleteCmd($3);} | TAG_ DELETE_ ALL_ {fr->markerTagDeleteAllCmd();} | TAG_ STRING {fr->markerTagCmd($2);} | TAG_ UPDATE_ STRING {fr->markerTagUpdateCmd($3);} | PASTE_ {fr->markerPasteCmd();} | PASTE_ coordSystem coordSystem {fr->markerPasteCmd((Coord::CoordSystem)$2, (Coord::CoordSystem)$3);} | UNDO_ {fr->markerUndoCmd();} | UNHIGHLITE_ ALL_ {fr->markerUnhighliteAllCmd();} | UNSELECT_ ALL_ {fr->markerUnselectAllCmd();} | WIDTH_ INT {fr->markerLineWidthCmd($2);} ; markerCallBack : SELECT_ {$$ = CallBack::SELECTCB;} | UNSELECT_ {$$ = CallBack::UNSELECTCB;} | HIGHLITE_ {$$ = CallBack::HIGHLITECB;} | UNHIGHLITE_ {$$ = CallBack::UNHIGHLITECB;} | BEGIN_ MOVE_ {$$ = CallBack::MOVEBEGINCB;} | MOVE_ {$$ = CallBack::MOVECB;} | END_ MOVE_ {$$ = CallBack::MOVEENDCB;} | BEGIN_ EDIT_ {$$ = CallBack::EDITBEGINCB;} | EDIT_ {$$ = CallBack::EDITCB;} | END_ EDIT_ {$$ = CallBack::EDITENDCB;} | BEGIN_ ROTATE_ {$$ = CallBack::ROTATEBEGINCB;} | ROTATE_ {$$ = CallBack::ROTATECB;} | END_ ROTATE_ {$$ = CallBack::ROTATEENDCB;} | DELETE_ {$$ = CallBack::DELETECB;} | TEXT_ {$$ = CallBack::TEXTCB;} | COLOR_ {$$ = CallBack::COLORCB;} | WIDTH_ {$$ = CallBack::LINEWIDTHCB;} | PROPERTY_ {$$ = CallBack::PROPERTYCB;} | FONT_ {$$ = CallBack::FONTCB;} | KEY_ {$$ = CallBack::KEYCB;} | UPDATE_ {$$ = CallBack::UPDATECB;} ; markerCentroid : /* empty */ {fr->markerCentroidCmd();} | INT {fr->markerCentroidCmd($1);} | AUTO_ yesno {fr->markerCentroidAutoCmd($2);} | RADIUS_ numeric {fr->markerCentroidRadiusCmd($2);} | ITERATION_ INT {fr->markerCentroidIterationCmd($2);} | OPTION_ INT numeric { fr->markerCentroidIterationCmd($2); fr->markerCentroidRadiusCmd($3); } ; markerCreate : CIRCLE_ numeric numeric numeric markerProperties {fr->createCircleCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | ELLIPSE_ numeric numeric numeric numeric optangle markerProperties {fr->createEllipseCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5), $6, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | BOX_ numeric numeric numeric numeric optangle markerProperties {fr->createBoxCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5), $6, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | POLYGON_ numeric numeric numeric numeric markerProperties {fr->createPolygonCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | SEGMENT_ numeric numeric numeric numeric markerProperties {fr->createSegmentCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5), currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | LINE_ numeric numeric numeric numeric markerProperties {fr->createLineCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), fr->mapToRef(Vector($4,$5),Coord::CANVAS), 0, 0, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | VECTOR_ numeric numeric numeric numeric markerProperties {fr->createVectCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), fr->mapToRef(Vector($4,$5),Coord::CANVAS), 1, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | TEXT_ numeric numeric optangle markerProperties {fr->createTextCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4, 1, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | CIRCLE_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::CIRCLE, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | BOX_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::BOX, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | DIAMOND_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::DIAMOND, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | CROSS_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::CROSS, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | 'X' POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::EX, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | ARROW_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::ARROW, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | BOXCIRCLE_ POINT_ numeric numeric pointSize markerProperties {fr->createPointCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), Point::BOXCIRCLE, $5, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | RULER_ numeric numeric numeric numeric coordSystem skyFrame coordSystem skyDist markerProperties {fr->createRulerCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), fr->mapToRef(Vector($4,$5),Coord::CANVAS), (Coord::CoordSystem)$6, (Coord::SkyFrame)$7, (Coord::CoordSystem)$8, (Coord::SkyDist)$9, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | COMPASS_ numeric numeric numeric coordSystem skyFrame markerProperties {fr->createCompassCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4, "N", "E", 1, 1, (Coord::CoordSystem)$5, (Coord::SkyFrame)$6, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | PROJECTION_ numeric numeric numeric numeric numeric markerProperties {fr->createProjectionCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), fr->mapToRef(Vector($4,$5),Coord::CANVAS), $6, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | ANNULUS_ numeric numeric numeric numeric INT markerProperties {fr->createAnnulusCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4,$5,$6, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | ELLIPSEANNULUS_ numeric numeric numeric numeric numeric INT optangle markerProperties {fr->createEllipseAnnulusCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5), Vector($6,$6*$4/$5),$7, $8, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | BOXANNULUS_ numeric numeric numeric numeric numeric INT optangle markerProperties {fr->createBoxAnnulusCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), Vector($4,$5),Vector($6,$6*$4/$5),$7, $8, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | CPANDA_ numeric numeric angle angle INT numeric numeric INT markerProperties {fr->createCpandaCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4,$5,$6, $7,$8,$9, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | EPANDA_ numeric numeric angle angle INT numeric numeric numeric INT optangle markerProperties {fr->createEpandaCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4,$5,$6, Vector($7,$8), Vector($9,$9*$7/$8),$10, $11, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | BPANDA_ numeric numeric angle angle INT numeric numeric numeric INT optangle markerProperties {fr->createBpandaCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $4,$5,$6, Vector($7,$8), Vector($9,$9*$7/$8),$10, $11, currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | COMPOSITE_ markerProperties {fr->createCompositeCmd( currentColor,currentDash,currentWidth,currentFont, currentText,currentProps,NULL,taglist,cblist);} | TEMPLATE_ markerCreateTemplate ; markerCreateTemplate : STRING numeric numeric {fr->createTemplateCmd(fr->mapToRef(Vector($2,$3),Coord::CANVAS), $1);} | VAR_ STRING numeric numeric {fr->createTemplateVarCmd(fr->mapToRef(Vector($3,$4),Coord::CANVAS), $2);} | numeric numeric VAR_ STRING { // backward compatibility fr->createTemplateVarCmd(fr->mapToRef(Vector($1,$2),Coord::CANVAS), $4); } | STRING coordSystem skyFrame coord {fr->createTemplateCmd(Vector($4),(Coord::CoordSystem)$2,(Coord::SkyFrame)$3, $1);} ; markerDash : INT INT {$$[0] = $1; $$[1] = $2;} ; markerEdit : BEGIN_ numeric numeric INT {fr->markerEditBeginCmd(Vector($2,$3),$4);} | MOTION_ numeric numeric INT {fr->markerEditMotionCmd(Vector($2,$3),$4);} | END_ {fr->markerEditEndCmd();} ; markerFormat : DS9_ {$$ = Base::DS9;} | XML_ {$$ = Base::XML;} | CIAO_ {$$ = Base::CIAO;} | SAOTNG_ {$$ = Base::SAOTNG;} | SAOIMAGE_ {$$ = Base::SAOIMAGE;} | PROS_ {$$ = Base::PROS;} | XY_ {$$ = Base::RAWXY;} ; markerGet : CENTROID_ markerGetCentroid | COLOR_ {fr->getMarkerColorCmd();} | FONT_ {fr->getMarkerFontCmd();} | EPSILON_ {fr->getMarkerEpsilonCmd();} | HANDLE_ numeric numeric {fr->getMarkerHandleCmd(Vector($2,$3));} | ID_ numeric numeric {fr->getMarkerIdCmd(Vector($2,$3));} | HIDE_ ANALYSIS_ CPANDA_ coordSystem {fr->getMarkerAnalysisPandaCmd((Coord::CoordSystem)$4);} | HIDE_ ANALYSIS_ HISTOGRAM_ STRING STRING INT {fr->getMarkerAnalysisHistogramCmd($4,$5,$6);} | HIDE_ ANALYSIS_ PLOT2D_ STRING STRING STRING STRING coordSystem skyFrame analysisParam {fr->getMarkerAnalysisPlot2dCmd($4,$5,$6,$7,(Coord::CoordSystem)$8, (Coord::SkyFrame)$9, (Marker::AnalysisMethod)$10);} | HIDE_ ANALYSIS_ PLOT3D_ STRING STRING coordSystem analysisParam {fr->getMarkerAnalysisPlot3dCmd($4,$5,(Coord::CoordSystem)$6,(Marker::AnalysisMethod)$7);} | HIDE_ ANALYSIS_ RADIAL_ STRING STRING STRING coordSystem {fr->getMarkerAnalysisRadialCmd($4,$5,$6,(Coord::CoordSystem)$7);} | HIDE_ ANALYSIS_ STATS_ coordSystem skyFrame {fr->getMarkerAnalysisStatsCmd((Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT ANALYSIS_ CPANDA_ coordSystem {fr->getMarkerAnalysisPandaCmd($1,(Coord::CoordSystem)$4);} | INT ANALYSIS_ HISTOGRAM_ STRING STRING INT {fr->getMarkerAnalysisHistogramCmd($1,$4,$5,$6);} | INT ANALYSIS_ PLOT2D_ STRING STRING STRING STRING coordSystem skyFrame analysisParam {fr->getMarkerAnalysisPlot2dCmd($1,$4,$5,$6,$7,(Coord::CoordSystem)$8, (Coord::SkyFrame)$9, (Marker::AnalysisMethod)$10);} | INT ANALYSIS_ PLOT3D_ STRING STRING coordSystem analysisParam {fr->getMarkerAnalysisPlot3dCmd($1,$4,$5,(Coord::CoordSystem)$6,(Marker::AnalysisMethod)$7);} | INT ANALYSIS_ RADIAL_ STRING STRING STRING coordSystem {fr->getMarkerAnalysisRadialCmd($1,$4,$5,$6,(Coord::CoordSystem)$7);} | INT ANALYSIS_ STATS_ coordSystem skyFrame {fr->getMarkerAnalysisStatsCmd($1,(Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | ID_ ALL_ {fr->getMarkerIdAllCmd();} | INT ANGLE_ {fr->getMarkerAngleCmd($1);} | INT ANGLE_ internalSystem {fr->getMarkerAngleCmd($1);} | INT ANGLE_ coordSystem skyFrame {fr->getMarkerAngleCmd($1,(Coord::CoordSystem)$3, (Coord::SkyFrame)$4);} | INT ANNULUS_ RADIUS_ internalSystem {fr->getMarkerAnnulusRadiusCmd($1, (Coord::InternalSystem)$4);} | INT ANNULUS_ RADIUS_ coordSystem skyDist {fr->getMarkerAnnulusRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT BOXANNULUS_ RADIUS_ internalSystem {fr->getMarkerBoxAnnulusRadiusCmd($1,(Coord::InternalSystem)$4);} | INT BOXANNULUS_ RADIUS_ coordSystem skyDist {fr->getMarkerBoxAnnulusRadiusCmd($1,(Coord::CoordSystem)$4,(Coord::SkyDist)$5);} | INT BOX_ RADIUS_ internalSystem {fr->getMarkerBoxRadiusCmd($1,(Coord::InternalSystem)$4);} | INT BOX_ RADIUS_ coordSystem skyDist {fr->getMarkerBoxRadiusCmd($1,(Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT BPANDA_ ANGLE_ {fr->getMarkerBpandaAnglesCmd($1);} | INT BPANDA_ ANGLE_ internalSystem {fr->getMarkerBpandaAnglesCmd($1);} | INT BPANDA_ ANGLE_ coordSystem skyFrame {fr->getMarkerBpandaAnglesCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT BPANDA_ RADIUS_ internalSystem {fr->getMarkerBpandaRadiusCmd($1, (Coord::InternalSystem)$4);} | INT BPANDA_ RADIUS_ coordSystem skyDist {fr->getMarkerBpandaRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT CENTER_ internalSystem {fr->getMarkerCenterCmd($1, (Coord::InternalSystem)$3);} | INT CENTER_ coordSystem skyFrame skyFormat {fr->getMarkerCenterCmd($1, (Coord::CoordSystem)$3, (Coord::SkyFrame)$4, (Coord::SkyFormat)$5);} | INT CIRCLE_ RADIUS_ internalSystem {fr->getMarkerCircleRadiusCmd($1, (Coord::InternalSystem)$4);} | INT CIRCLE_ RADIUS_ coordSystem skyDist {fr->getMarkerCircleRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT COLOR_ {fr->getMarkerColorCmd($1);} | INT COMPASS_ ARROW_ {fr->getMarkerCompassArrowCmd($1);} | INT COMPASS_ LABEL_ {fr->getMarkerCompassLabelCmd($1);} | INT COMPASS_ RADIUS_ internalSystem {fr->getMarkerCompassRadiusCmd($1, (Coord::InternalSystem)$4);} | INT COMPASS_ RADIUS_ coordSystem skyDist {fr->getMarkerCompassRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT COMPASS_ SYSTEM_ {fr->getMarkerCompassSystemCmd($1);} | INT COMPOSITE_ GLOBAL_ {fr->getMarkerCompositeCmd($1);} | INT CPANDA_ ANGLE_ {fr->getMarkerCpandaAnglesCmd($1);} | INT CPANDA_ ANGLE_ internalSystem {fr->getMarkerCpandaAnglesCmd($1);} | INT CPANDA_ ANGLE_ coordSystem skyFrame {fr->getMarkerCpandaAnglesCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT CPANDA_ RADIUS_ internalSystem {fr->getMarkerCpandaRadiusCmd($1, (Coord::InternalSystem)$4);} | INT CPANDA_ RADIUS_ coordSystem skyDist {fr->getMarkerCpandaRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT ELLIPSE_ RADIUS_ internalSystem {fr->getMarkerEllipseRadiusCmd($1, (Coord::InternalSystem)$4);} | INT ELLIPSE_ RADIUS_ coordSystem skyDist {fr->getMarkerEllipseRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT ELLIPSEANNULUS_ RADIUS_ internalSystem {fr->getMarkerEllipseAnnulusRadiusCmd($1, (Coord::InternalSystem)$4);} | INT ELLIPSEANNULUS_ RADIUS_ coordSystem skyDist {fr->getMarkerEllipseAnnulusRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT EPANDA_ ANGLE_ {fr->getMarkerEpandaAnglesCmd($1);} | INT EPANDA_ ANGLE_ internalSystem {fr->getMarkerEpandaAnglesCmd($1);} | INT EPANDA_ ANGLE_ coordSystem skyFrame {fr->getMarkerEpandaAnglesCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} | INT EPANDA_ RADIUS_ internalSystem {fr->getMarkerEpandaRadiusCmd($1, (Coord::InternalSystem)$4);} | INT EPANDA_ RADIUS_ coordSystem skyDist {fr->getMarkerEpandaRadiusCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT FONT_ {fr->getMarkerFontCmd($1);} | INT HIGHLITE_ {fr->getMarkerHighlitedCmd($1);} | INT LINE_ ARROW_ {fr->getMarkerLineArrowCmd($1);} | INT LINE_ LENGTH_ coordSystem skyDist {fr->getMarkerLineLengthCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT LINE_ POINT_ internalSystem {fr->getMarkerLineCmd($1, (Coord::InternalSystem)$4);} | INT LINE_ POINT_ coordSystem skyFrame skyFormat {fr->getMarkerLineCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6);} | INT MAP_ LENGTH_ numeric coordSystem skyDist {fr->getMarkerMapLenFromRefCmd($1, $4, (Coord::CoordSystem)$5,(Coord::SkyDist)$6);} | INT POINT_ SHAPE_ {fr->getMarkerPointShapeCmd($1);} | INT POINT_ SIZE_ {fr->getMarkerPointSizeCmd($1);} | INT PROJECTION_ POINT_ internalSystem {fr->getMarkerProjectionPointsCmd($1, (Coord::InternalSystem)$4);} | INT PROJECTION_ POINT_ coordSystem skyFrame skyFormat {fr->getMarkerProjectionPointsCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6);} | INT PROJECTION_ LENGTH_ coordSystem skyDist {fr->getMarkerProjectionLengthCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT PROJECTION_ THICK_ internalSystem {fr->getMarkerProjectionWidthCmd($1, (Coord::InternalSystem)$4);} | INT PROJECTION_ THICK_ coordSystem skyDist {fr->getMarkerProjectionWidthCmd($1,(Coord::CoordSystem)$4,(Coord::SkyDist)$5);} | INT PROPERTY_ {fr->getMarkerPropertyCmd($1);} | INT PROPERTY_ markerProperty {fr->getMarkerPropertyCmd($1,$3);} | INT RULER_ LENGTH_ coordSystem skyDist {fr->getMarkerRulerLengthCmd($1,(Coord::CoordSystem)$4,(Coord::SkyDist)$5);} | INT RULER_ POINT_ internalSystem {fr->getMarkerRulerPointCmd($1, (Coord::InternalSystem)$4);} | INT RULER_ POINT_ coordSystem skyFrame skyFormat {fr->getMarkerRulerPointCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6);} | INT RULER_ SYSTEM_ {fr->getMarkerRulerSystemCmd($1);} | INT SELECT_ {fr->getMarkerSelectedCmd($1);} | INT TAG_ {fr->getMarkerTagCmd($1);} | INT TAG_ INT {fr->getMarkerTagCmd($1,$3);} | INT TEXT_ {fr->getMarkerTextCmd($1);} | INT TEXT_ ROTATE_ {fr->getMarkerTextRotateCmd($1);} | INT TYPE_ {fr->getMarkerTypeCmd($1);} | INT VECTOR_ ARROW_ {fr->getMarkerVectorArrowCmd($1);} | INT VECTOR_ LENGTH_ coordSystem skyDist {fr->getMarkerVectorLengthCmd($1, (Coord::CoordSystem)$4, (Coord::SkyDist)$5);} | INT VECTOR_ POINT_ internalSystem {fr->getMarkerVectorCmd($1, (Coord::InternalSystem)$4);} | INT VECTOR_ POINT_ coordSystem skyFrame skyFormat {fr->getMarkerVectorCmd($1, (Coord::CoordSystem)$4, (Coord::SkyFrame)$5, (Coord::SkyFormat)$6);} | INT WIDTH_ {fr->getMarkerLineWidthCmd($1);} | HIGHLITE_ markerGetHighlite | HIGHLITE_ NUMBER_ {fr->getMarkerHighlitedNumberCmd();} | NUMBER_ {fr->getMarkerNumberCmd();} | POLYGON_ SEGMENT_ numeric numeric {fr->getMarkerPolygonSegmentCmd(Vector($3,$4));} | SEGMENT_ SEGMENT_ numeric numeric {fr->getMarkerSegmentSegmentCmd(Vector($3,$4));} | PRESERVE_ {fr->getMarkerPreserveCmd();} | PROPERTY_ markerProperty {fr->getMarkerPropertyCmd($2);} | SELECT_ markerGetSelect | SELECT_ NUMBER_ {fr->getMarkerSelectedNumberCmd();} | SHOW_ markerGetShow | STRING COLOR_ {fr->getMarkerColorCmd($1);} | STRING FONT_ {fr->getMarkerFontCmd($1);} | STRING ID_ {fr->getMarkerIdCmd($1);} | STRING PROPERTY_ markerProperty {fr->getMarkerPropertyCmd($1,$3);} | STRING TAG_ {fr->getMarkerTagCmd($1);} | STRING TAG_ NUMBER_ {fr->getMarkerTagNumberCmd($1);} | TAG_ ALL_ {fr->getMarkerTagsCmd();} | TAG_ DEFAULT_ NAME_ {fr->getMarkerTagDefaultNameCmd();} | WIDTH_ {fr->getMarkerLineWidthCmd();} ; markerGetCentroid : AUTO_ {fr->getMarkerCentroidAutoCmd();} | RADIUS_ {fr->getMarkerCentroidRadiusCmd();} | ITERATION_ {fr->getMarkerCentroidIterationCmd();} | OPTION_ {fr->getMarkerCentroidOptionCmd();} ; markerGetHighlite : /* empty */ {fr->getMarkerHighlitedCmd();} | numeric numeric {fr->getMarkerHighlitedCmd(Vector($1,$2));} ; markerGetSelect : /* empty */ {fr->getMarkerSelectedCmd();} | numeric numeric {fr->getMarkerSelectedCmd(Vector($1,$2));} ; markerGetShow : /* empty */ {fr->getMarkerShowCmd();} | TEXT_ {fr->getMarkerShowTextCmd();} ; markerInitProp : { strncpy(currentFont, "helvetica 10 normal roman", 32); strncpy(currentColor, "green", 16); currentDash[0] = 8; currentDash[1] = 3; currentWidth = 1; strncpy(currentText, "", 80); currentProps = defaultProps; taglist.deleteAll(); cblist.deleteAll(); } ; markerLayer : /* empty */ {fr->markerLayerCmd(Base::USER);} | POINTER_ { // backward compatibility fr->markerLayerCmd(Base::USER); } | REGION_ {fr->markerLayerCmd(Base::USER);} | USER_ { // backward compatibility fr->markerLayerCmd(Base::USER); } | CATALOG_ {fr->markerLayerCmd(Base::CATALOG);} | ANALYSIS_ {fr->markerLayerCmd(Base::ANALYSIS);} ; markerList : markerFormat coordSystem skyFrame skyFormat yesno markerQuery markerTags {fr->markerListCmd((Base::MarkerFormat)$1, (Coord::CoordSystem)$2, (Coord::SkyFrame)$3, (Coord::SkyFormat)$4, $5, 0, propQMask, propQValue, taglist);} | SELECT_ markerFormat coordSystem skyFrame skyFormat yesno markerQuery markerTags {fr->markerListCmd((Base::MarkerFormat)$2, (Coord::CoordSystem)$3, (Coord::SkyFrame)$4, (Coord::SkyFormat)$5, $6, 1, propQMask, propQValue, taglist);} ; markerLoad : markerFormat STRING {fr->markerLoadCmd((Base::MarkerFormat)$1,$2);} | markerFormat STRING coordSystem skyFrame {fr->markerLoadCmd((Base::MarkerFormat)$1,$2, (Coord::CoordSystem)$3,(Coord::SkyFrame)$4);} | markerFormat INT {fr->markerLoadCmd((Base::MarkerFormat)$1,$2);} | markerFormat INT coordSystem skyFrame {fr->markerLoadCmd((Base::MarkerFormat)$1,$2, (Coord::CoordSystem)$3,(Coord::SkyFrame)$4);} | FITS_ STRING STRING markerDash INT STRING {fr->markerLoadFitsCmd($2, $3, $4, $5, $6);} ; markerMoveSelected : numeric numeric {fr->markerMoveCmd(Vector($1,$2));} | FRONT_ {fr->markerFrontCmd();} | BACK_ {fr->markerBackCmd();} | BEGIN_ numeric numeric {fr->markerMoveBeginCmd(Vector($2,$3));} | MOTION_ numeric numeric {fr->markerMoveMotionCmd(Vector($2,$3));} | END_ {fr->markerMoveEndCmd();} | TO_ internalSystem coord {fr->markerMoveToCmd(Vector($3), (Coord::InternalSystem)$2);} | TO_ coordSystem skyFrame coord {fr->markerMoveToCmd(Vector($4), (Coord::CoordSystem)$2, (Coord::SkyFrame)$3);} ; markerProps : markerProps markerProp | markerProp ; markerProp : markerProperty '=' yesno {setProps(¤tProps,$1,$3);} | COLOR_ '=' STRING {strncpy(currentColor,$3,16);} | DASHLIST_ '=' INT INT {currentDash[0]=$3;currentDash[1]=$4;} | WIDTH_ '=' INT {currentWidth = $3;} | FONT_ '=' STRING {strncpy(currentFont,$3,32);} | TEXT_ '=' STRING {strncpy(currentText,$3,80);} | tag | callback ; markerProperty : NONE_ {$$ = Marker::NONE;} | SELECT_ {$$ = Marker::SELECT;} | HIGHLITE_ {$$ = Marker::HIGHLITE;} | DASH_ {$$ = Marker::DASH;} | FIXED_ {$$ = Marker::FIXED;} | EDIT_ {$$ = Marker::EDIT;} | MOVE_ {$$ = Marker::MOVE;} | ROTATE_ {$$ = Marker::ROTATE;} | DELETE_ {$$ = Marker::DELETE;} | INCLUDE_ {$$ = Marker::INCLUDE;} | SOURCE_ {$$ = Marker::SOURCE;} ; markerProperties : /* empty */ markerInitProp | markerInitProp markerProps ; markerQuery: /* empty */ {propQMask=0;propQValue=0;} | {propQMask=0;propQValue=0;} queries ; markerSelect : ALL_ {fr->markerSelectAllCmd();} | ONLY_ numeric numeric {fr->markerSelectOnlyCmd(Vector($2,$3));} | TOGGLE_ {fr->markerSelectToggleCmd();} | TOGGLE_ numeric numeric {fr->markerSelectToggleCmd(Vector($2,$3));} ; markerShow : yesno {fr->markerShowCmd($1);} | TEXT_ yesno {fr->markerShowTextCmd($2);} ; queries : queries query | query ; query : markerProperty '=' yesno {propQMask |= $1; setProps(&propQValue,$1,$3);} ; markerTags: /* empty */ {taglist.deleteAll();} | {taglist.deleteAll();} tags ; tags : tags tag | tag ; tag : TAG_ '=' STRING {taglist.append(new Tag($3));} ; callback : CALLBACK_ '=' markerCallBack STRING STRING {cblist.append( new CallBack(fr->getInterp(),(CallBack::Type)$3,$4,$5));} ; mask : CLEAR_ {fr->maskClearCmd();} | COLOR_ STRING {fr->maskColorCmd($2);} | MARK_ INT {fr->maskMarkCmd($2);} | TRANSPARENCY_ numeric {fr->maskTransparencyCmd($2);} ; orient : 'X' {fr->orientCmd(Coord::XX);} | 'Y' {fr->orientCmd(Coord::YY);} | XY_ {fr->orientCmd(Coord::XY);} | NONE_ {fr->orientCmd(Coord::NORMAL);} ; pan : numeric numeric numeric numeric {fr->panCmd(Vector($1,$2),Vector($3,$4));} | numeric numeric {fr->panCmd(Vector($1,$2));} | internalSystem numeric numeric { // backward compatibility fr->panCmd(Vector($2,$3)); } | coordSystem skyFrame coord {fr->panCmd(Vector($3), (Coord::CoordSystem)$1, (Coord::SkyFrame)$2);} | TO_ panTo | BBOX_ numeric numeric {fr->panBBoxCmd(Vector($2,$3));} | MOTION_ panMotion | PRESERVE_ yesno {fr->panPreserveCmd($2);} ; panTo : numeric numeric {fr->panToCmd(Vector($1,$2));} | internalSystem numeric numeric { // backward compatibility fr->panToCmd(Vector($2,$3)); } | coordSystem skyFrame coord {fr->panToCmd(Vector($3), (Coord::CoordSystem)$1, (Coord::SkyFrame)$2);} ; panMotion : BEGIN_ numeric numeric {fr->panBeginCmd(Vector($2,$3));} | numeric numeric {fr->panMotionCmd(Vector($1,$2));} | END_ numeric numeric {fr->panEndCmd(Vector($2,$3));} ; panner : yesno {fr->pannerCmd($1);} | WCS_ wcsSystem skyFrame { // backward compatibility fr->pannerCmd((Coord::CoordSystem)$2,(Coord::SkyFrame)$3); } | STRING INT INT {fr->pannerCmd($1, $2, $3);} | UPDATE_ {fr->updatePannerCmd();} ; postscript : COLORSPACE_ pscolorspace {fr->psColorSpaceCmd((Widget::PSColorSpace)$2);} | LEVEL_ INT {fr->psLevelCmd($2);} | RESOLUTION_ INT {fr->psResolutionCmd($2);} | SCALE_ numeric {fr->psScaleCmd($2);} ; pscolorspace : BW_ {$$ = Widget::BW;} | GRAY_ {$$ = Widget::GRAY;} | RGB_ {$$ = Widget::RGB;} | CMYK_ {$$ = Widget::CMYK;} ; region : HIGHLITE_ regionHighlite | SELECT_ regionSelect ; regionHighlite : BEGIN_ numeric numeric {fr->regionHighliteBeginCmd(Vector($2,$3));} | MOTION_ numeric numeric {fr->regionHighliteMotionCmd(Vector($2,$3));} | END_ {fr->regionHighliteEndCmd();} | SHIFT_ END_ {fr->regionHighliteShiftEndCmd();} ; regionSelect : BEGIN_ numeric numeric {fr->regionSelectBeginCmd(Vector($2,$3));} | MOTION_ numeric numeric {fr->regionSelectMotionCmd(Vector($2,$3));} | END_ {fr->regionSelectEndCmd();} | SHIFT_ END_ {fr->regionSelectShiftEndCmd();} ; renderMethod: MIP_ {$$ = Frame3dBase::MIP;} | AIP_ {$$ = Frame3dBase::AIP;} ; renderBackground: NONE_ {$$ = Frame3dBase::NONE;} | AZIMUTH_ {$$ = Frame3dBase::AZIMUTH;} | ELEVATION_ {$$ = Frame3dBase::ELEVATION;} ; rgb : CHANNEL_ STRING {fr->setRGBChannelCmd($2);} | SYSTEM_ coordSystem {fr->setRGBSystemCmd((Coord::CoordSystem)$2);} | VIEW_ INT INT INT {fr->setRGBViewCmd($2,$3,$4);} ; rotate : numeric {fr->rotateCmd(degToRad($1));} | numeric DEGREES_ {fr->rotateCmd(degToRad($1));} | MOTION_ rotateMotion | TO_ numeric {fr->rotateToCmd(degToRad($2));} | TO_ numeric DEGREES_ {fr->rotateToCmd(degToRad($2));} ; rotateMotion : BEGIN_ {fr->rotateBeginCmd();} | numeric {fr->rotateMotionCmd(degToRad($1));} | END_ {fr->rotateEndCmd();} ; save : ARRAY_ saveArray | FITS_ saveFits | NRRD_ saveNRRD | ENVI_ saveENVI | PHOTO_ STRING {fr->savePhotoCmd($2);} ; saveArray : FILE_ STRING endian {fr->saveArrayFileCmd($2, (FitsFile::ArchType)$3);} | CHANNEL_ STRING endian {fr->saveArrayChannelCmd($2, (FitsFile::ArchType)$3);} | SOCKET_ INT endian {fr->saveArraySocketCmd($2, (FitsFile::ArchType)$3);} | RGB_ CUBE_ saveArrayRGBCube ; saveArrayRGBCube : FILE_ STRING endian {fr->saveArrayRGBCubeFileCmd($2, (FitsFile::ArchType)$3);} | CHANNEL_ STRING endian {fr->saveArrayRGBCubeChannelCmd($2, (FitsFile::ArchType)$3);} | SOCKET_ INT endian {fr->saveArrayRGBCubeSocketCmd($2, (FitsFile::ArchType)$3);} saveFits: /* empty */ saveFitsImage | IMAGE_ saveFitsImage | TABLE_ saveFitsTable | SLICE_ saveFitsSlice | EXT_ CUBE_ saveFitsExtCube | MOSAIC_ saveFitsMosaic | RGB_ IMAGE_ saveFitsRGBImage | RGB_ CUBE_ saveFitsRGBCube | RESAMPLE_ saveFitsResample ; saveFitsImage : FILE_ STRING {fr->saveFitsFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsChannelCmd($2);} | SOCKET_ INT {fr->saveFitsSocketCmd($2);} ; saveFitsTable : FILE_ STRING {fr->saveFitsTableFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsTableChannelCmd($2);} | SOCKET_ INT {fr->saveFitsTableSocketCmd($2);} ; saveFitsSlice : FILE_ STRING {fr->saveFitsSliceFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsSliceChannelCmd($2);} | SOCKET_ INT {fr->saveFitsSliceSocketCmd($2);} ; saveFitsExtCube : FILE_ STRING {fr->saveFitsExtCubeFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsExtCubeChannelCmd($2);} | SOCKET_ INT {fr->saveFitsExtCubeSocketCmd($2);} ; saveFitsMosaic : IMAGE_ saveFitsMosaicImage | FILE_ STRING INT {fr->saveFitsMosaicFileCmd($2,$3);} | CHANNEL_ STRING INT {fr->saveFitsMosaicChannelCmd($2,$3);} | SOCKET_ INT INT {fr->saveFitsMosaicSocketCmd($2,$3);} ; saveFitsMosaicImage : FILE_ STRING {fr->saveFitsMosaicImageFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsMosaicImageChannelCmd($2);} | SOCKET_ INT {fr->saveFitsMosaicImageSocketCmd($2);} ; saveFitsRGBImage : FILE_ STRING {fr->saveFitsRGBImageFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsRGBImageChannelCmd($2);} | SOCKET_ INT {fr->saveFitsRGBImageSocketCmd($2);} ; saveFitsRGBCube : FILE_ STRING {fr->saveFitsRGBCubeFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsRGBCubeChannelCmd($2);} | SOCKET_ INT {fr->saveFitsRGBCubeSocketCmd($2);} ; saveFitsResample : FILE_ STRING {fr->saveFitsResampleFileCmd($2);} | CHANNEL_ STRING {fr->saveFitsResampleChannelCmd($2);} | SOCKET_ INT {fr->saveFitsResampleSocketCmd($2);} ; saveNRRD : FILE_ STRING endian {fr->saveNRRDFileCmd($2, (FitsFile::ArchType)$3);} | CHANNEL_ STRING endian {fr->saveNRRDChannelCmd($2, (FitsFile::ArchType)$3);} | SOCKET_ INT endian {fr->saveNRRDSocketCmd($2, (FitsFile::ArchType)$3);} ; saveENVI : FILE_ STRING STRING endian {fr->saveENVIFileCmd($2, $3, (FitsFile::ArchType)$4);} ; smooth : smoothFunction INT {fr->smoothCmd((Context::SmoothFunction)$1,$2);} | DELETE_ {fr->smoothDeleteCmd();} ; smoothFunction : BOXCAR_ {$$ = Context::BOXCAR;} | GAUSSIAN_ {$$ = Context::GAUSSIAN;} | TOPHAT_ {$$ = Context::TOPHAT;} ; update : /* empty */ {fr->updateFitsCmd(0);} | INT numeric numeric numeric numeric {fr->updateFitsCmd($1,BBox($2,$3,$4,$5),0);} | NOW_ {fr->updateFitsCmd(1);} | NOW_ INT numeric numeric numeric numeric {fr->updateFitsCmd($2,BBox($3,$4,$5,$6),1);} | FITS_ SLICE_ updateFitsSlice ; updateFitsSlice : INT {fr->sliceCmd(2, $1);} | numeric coordSystem {fr->sliceCmd(2, $1, (Coord::CoordSystem)$2);} | INT INT {fr->sliceCmd($1, $2);} | INT numeric coordSystem {fr->sliceCmd($1, $2, (Coord::CoordSystem)$3);} ; warp : numeric numeric {fr->warpCmd(Vector($1,$2));} | TO_ numeric numeric {fr->warpToCmd(Vector($2,$3));} ; wcs : wcsSystem skyFrame skyFormat {fr->wcsCmd((Coord::CoordSystem)$1, (Coord::SkyFrame)$2, (Coord::SkyFormat)$3);} | ALIGN_ wcsAlign | RESET_ INT {fr->wcsResetCmd($2);} | REPLACE_ wcsReplace | APPEND_ wcsAppend ; wcsAppend : INT INT {fr->wcsAppendCmd($1,$2);} | INT STRING {fr->wcsAppendCmd($1,$2);} | TEXT_ INT STRING {fr->wcsAppendTxtCmd($2,$3);} ; wcsReplace : INT INT {fr->wcsReplaceCmd($1,$2);} | INT STRING {fr->wcsReplaceCmd($1,$2);} | TEXT_ INT STRING {fr->wcsReplaceTxtCmd($2,$3);} ; wcsAlign : INT {fr->wcsAlignCmd($1);} | INT wcsSystem skyFrame { // used by backup fr->wcsAlignCmd($1, (Coord::CoordSystem)$2, (Coord::SkyFrame)$3); } | INT POINTER wcsSystem skyFrame { fr->wcsAlignCmd($1, (FitsImage*)$2, (Coord::CoordSystem)$3, (Coord::SkyFrame)$4); } ; win32 : PRINT_ { #ifdef __WIN32 fr->win32PrintCmd(); #endif } ; zoom : numeric numeric {fr->zoomCmd(Vector($1,$2));} | numeric numeric ABOUT_ numeric numeric {fr->zoomAboutCmd(Vector($1,$2),Vector($4,$5));} | numeric numeric ABOUT_ internalSystem numeric numeric { // backward compatibility fr->zoomAboutCmd(Vector($1,$2),Vector($5,$6)); } | numeric numeric ABOUT_ coordSystem skyFrame coord {fr->zoomAboutCmd(Vector($1,$2),Vector($6), (Coord::CoordSystem)$4,(Coord::SkyFrame)$5);} | TO_ zoomTo ; zoomTo : FIT_ {fr->zoomToFitCmd(1);} | FIT_ numeric {fr->zoomToFitCmd($2);} | numeric numeric {fr->zoomToCmd(Vector($1,$2));} | numeric numeric ABOUT_ numeric numeric {fr->zoomToAboutCmd(Vector($1,$2),Vector($4,$5));} | numeric numeric ABOUT_ internalSystem numeric numeric { // backward compatibility fr->zoomToAboutCmd(Vector($1,$2),Vector($5,$6)); } | numeric numeric ABOUT_ coordSystem skyFrame coord {fr->zoomToAboutCmd(Vector($1,$2), Vector($6), (Coord::CoordSystem)$4, (Coord::SkyFrame)$5);} ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/point.C000644 000765 000000 00000052514 12544546070 016271 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "point.h" #include "fitsimage.h" #define NUMSEG 16 Point::Point(Base* p, const Vector& ctr) : Marker(p, ctr, 0) { strcpy(type_, "point"); shape_ = CIRCLE; shapeStr(shape_); size_ = 11; handle = new Vector[4]; numHandle = 4; updateBBox(); } Point::Point(Base* p, const Vector& ctr, PointShape ss, int size, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { strcpy(type_, "point"); shape_ = ss; shapeStr(ss); size_ = size; handle = new Vector[4]; numHandle = 4; updateBBox(); } Point::Point(const Point& a) : Marker(a) { shape_ = a.shape_; shapestr_ = dupstr(a.shapestr_); size_ = a.size_; } Point::~Point() { if (shapestr_) delete [] shapestr_; } // X11 void Point::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector* vv = NULL; switch (shape_) { case CIRCLE: renderXCircle(drawable, sys, mode, size_); break; case BOX: renderXBox(drawable, sys, mode); break; case DIAMOND: vv = generateDiamond(sys); XDrawLine(display, drawable, lgc, vv[0][0], vv[0][1], vv[1][0], vv[1][1]); XDrawLine(display, drawable, lgc, vv[1][0], vv[1][1], vv[2][0], vv[2][1]); XDrawLine(display, drawable, lgc, vv[2][0], vv[2][1], vv[3][0], vv[3][1]); XDrawLine(display, drawable, lgc, vv[3][0], vv[3][1], vv[0][0], vv[0][1]); break; case CROSS: vv = generateCross(sys); XDrawLine(display, drawable, lgc, vv[0][0], vv[0][1], vv[1][0], vv[1][1]); XDrawLine(display, drawable, lgc, vv[2][0], vv[2][1], vv[3][0], vv[3][1]); break; case EX: vv = generateEx(sys); XDrawLine(display, drawable, lgc, vv[0][0], vv[0][1], vv[1][0], vv[1][1]); XDrawLine(display, drawable, lgc, vv[2][0], vv[2][1], vv[3][0], vv[3][1]); break; case ARROW: vv = generateArrow(sys); XDrawLine(display, drawable, lgc, vv[0][0], vv[0][1], vv[3][0], vv[3][1]); XDrawLine(display, drawable, lgc, vv[1][0], vv[1][1], vv[3][0], vv[3][1]); XDrawLine(display, drawable, lgc, vv[2][0], vv[2][1], vv[3][0], vv[3][1]); break; case BOXCIRCLE: renderXBox(drawable, sys, mode); renderXCircle(drawable, sys, mode, size_-2); break; } if (vv) delete [] vv; } void Point::renderXCircle(Drawable drawable, Coord::InternalSystem sys, RenderMode mode, int rr) { GC lgc = renderXGC(mode); if (parent->isAzElZero()) { Vector cc = parent->mapFromRef(center,sys); Vector v = cc*Translate(-Vector(rr,rr)/2); #ifndef __WIN32 XDrawArc(display, drawable, lgc, v[0], v[1], rr, rr, 0, 360*64); #else int ss = int(rr/2.+.5)*2; XDrawArc(display, drawable, lgc, v[0], v[1], ss, ss, 0, 360*64); #endif } else { Vector* vv = generateCircle(sys, rr); for (int ii=1; ii<=NUMSEG; ii++) XDrawLine(display, drawable, lgc, vv[ii-1][0], vv[ii-1][1], vv[ii][0], vv[ii][1]); delete [] vv; } } void Point::renderXBox(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector* vv = generateBox(sys); XDrawLine(display, drawable, lgc, vv[0][0], vv[0][1], vv[1][0], vv[1][1]); XDrawLine(display, drawable, lgc, vv[1][0], vv[1][1], vv[2][0], vv[2][1]); XDrawLine(display, drawable, lgc, vv[2][0], vv[2][1], vv[3][0], vv[3][1]); XDrawLine(display, drawable, lgc, vv[3][0], vv[3][1], vv[0][0], vv[0][1]); delete [] vv; } void Point::renderXLineDash(GC lgc) { char dl[2]; #ifdef __WIN32 dl[0] = dlist[0]/2; dl[1] = dlist[1]/2; #else dl[0] = ceil(dlist[0]/2.); dl[1] = ceil(dlist[1]/2.); #endif int ww = (highlited && canHighlite()) ? lineWidth*2 : lineWidth; XSetDashes(display, lgc, 0, dl, 2); XSetLineAttributes(display, lgc, ww, LineOnOffDash, CapButt, JoinMiter); } // PS void Point::renderPS(int mode) { renderPSGC(mode); Vector* vv =NULL; ostringstream str; switch (shape_) { case CIRCLE: renderPSCircle(mode, size_); break; case BOX: renderPSBox(mode); break; case DIAMOND: vv = generateDiamond(Coord::CANVAS); str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[1].TkCanvasPs(parent->canvas) << " lineto" << endl << vv[2].TkCanvasPs(parent->canvas) << " lineto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto" << endl << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); break; case CROSS: vv = generateCross(Coord::CANVAS); str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[1].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "newpath " << vv[2].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); break; case EX: vv = generateEx(Coord::CANVAS); str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[1].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "newpath " << vv[2].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); break; case ARROW: vv = generateArrow(Coord::CANVAS); str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "newpath " << vv[1].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << "newpath " << vv[2].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); break; case BOXCIRCLE: renderPSBox(mode); renderPSCircle(mode,size_-2); break; } if (vv) delete [] vv; } void Point::renderPSCircle(int mode, int ss) { if (parent->isAzElZero()) { Vector cc = parent->mapFromRef(center,Coord::CANVAS); ostringstream str; str << "newpath " << cc.TkCanvasPs(parent->canvas) << ss/2. << " 0 360 arc stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } else { Vector* vv = generateCircle(Coord::CANVAS,ss); ostringstream str; str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto " << endl; for (int ii=1; iicanvas) << " lineto" << endl; str << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); delete [] vv; } } void Point::renderPSBox(int mode) { Vector* vv = generateBox(Coord::CANVAS); ostringstream str; str << "newpath " << vv[0].TkCanvasPs(parent->canvas) << " moveto" << endl << vv[1].TkCanvasPs(parent->canvas) << " lineto" << endl << vv[2].TkCanvasPs(parent->canvas) << " lineto" << endl << vv[3].TkCanvasPs(parent->canvas) << " lineto" << endl << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); delete [] vv; } void Point::renderPSLineDash() { ostringstream str; str << lineWidth << " setlinewidth" << endl; str << '[' << dlist[0]/2. << ' ' << dlist[1]/2. << "] 0 setdash" << endl << ends; Tcl_AppendResult(parent->interp, (char*)str.str().c_str(), NULL); } // MacOSX #ifdef MAC_OSX_TK void Point::renderMACOSX() { renderMACOSXGC(); Vector* vv = NULL; switch (shape_) { case CIRCLE: renderMACOSXCircle(size_); break; case BOX: renderMACOSXBox(); break; case DIAMOND: vv = generateDiamond(Coord::CANVAS); macosxDrawLines(vv,5); break; case CROSS: vv = generateCross(Coord::CANVAS); macosxDrawLine(vv[0],vv[1]); macosxDrawLine(vv[2],vv[3]); break; case EX: vv = generateEx(Coord::CANVAS); macosxDrawLine(vv[0],vv[1]); macosxDrawLine(vv[2],vv[3]); break; case ARROW: vv = generateArrow(Coord::CANVAS); macosxDrawLine(vv[0],vv[3]); macosxDrawLine(vv[1],vv[3]); macosxDrawLine(vv[2],vv[3]); break; case BOXCIRCLE: renderMACOSXBox(); renderMACOSXCircle(size_-2); break; } if (vv) delete [] vv; } void Point::renderMACOSXCircle(int ss) { renderMACOSXGC(); if (parent->isAzElZero()) { Vector cc = parent->mapFromRef(center,Coord::CANVAS); macosxDrawArc(cc, ss/2., 0, M_TWOPI); } else { Vector* vv = generateCircle(Coord::CANVAS, ss); macosxDrawLines(vv,NUMSEG+1); delete [] vv; } } void Point::renderMACOSXBox() { renderMACOSXGC(); Vector* vv = generateBox(Coord::CANVAS); macosxDrawLines(vv,5); delete [] vv; } void Point::renderMACOSXLineDash() { macosxWidth(lineWidth); float dl[2]; dl[0] = dlist[0]/2.; dl[1] = dlist[1]/2.; macosxDash(dl,2); } #endif // WIN32 #ifdef __WIN32 void Point::renderWIN32() { renderWIN32GC(); Vector* vv = NULL; switch (shape_) { case CIRCLE: renderWIN32Circle(size_); break; case BOX: renderWIN32Box(); break; case DIAMOND: vv = generateDiamond(Coord::CANVAS); win32DrawLines(vv,5); break; case CROSS: vv = generateCross(Coord::CANVAS); win32DrawLine(vv[0],vv[1]); win32DrawLine(vv[2],vv[3]); break; case EX: vv = generateEx(Coord::CANVAS); win32DrawLine(vv[0],vv[1]); win32DrawLine(vv[2],vv[3]); break; case ARROW: vv = generateArrow(Coord::CANVAS); win32DrawLine(vv[0],vv[3]); win32DrawLine(vv[1],vv[3]); win32DrawLine(vv[2],vv[3]); break; case BOXCIRCLE: renderWIN32Box(); renderWIN32Circle(size_-2); break; } if (vv) delete [] vv; } void Point::renderWIN32Circle(int ss) { if (parent->isAzElZero()) { Vector cc = parent->mapFromRef(center,Coord::CANVAS); win32DrawArc(cc, ss/2., 0, M_TWOPI); } else { Vector* vv = generateCircle(Coord::CANVAS, ss); win32DrawLines(vv,NUMSEG+1); delete [] vv; } } void Point::renderWIN32Box() { Vector* vv = generateBox(Coord::CANVAS); win32DrawLines(vv,5); delete [] vv; } void Point::renderWIN32LineDash() { win32Width(lineWidth); float dl[2]; dl[0] = dlist[0]/2.; dl[1] = dlist[1]/2.; win32Dash(dl,2); } #endif // Support Vector* Point::generateCircle(Coord::InternalSystem sys, int ss) { Vector* vv = new Vector[NUMSEG+1]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector cc = center*mm; for (int ii=0; iimapFromRef(bb,sys); } vv[NUMSEG] = vv[0]; return vv; } Vector* Point::generateBox(Coord::InternalSystem sys) { Vector* vv = new Vector[5]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); double ss = size_/2; Vector cc = center*mm; Vector v1a = cc+Vector(-ss,-ss); Vector v1b = v1a*nn; vv[0] = parent->mapFromRef(v1b,sys); Vector v2a = cc+Vector(-ss,ss); Vector v2b = v2a*nn; vv[1] = parent->mapFromRef(v2b,sys); Vector v3a = cc+Vector(ss,ss); Vector v3b = v3a*nn; vv[2] = parent->mapFromRef(v3b,sys); Vector v4a = cc+Vector(ss,-ss); Vector v4b = v4a*nn; vv[3] = parent->mapFromRef(v4b,sys); vv[4] = vv[0]; return vv; } Vector* Point::generateDiamond(Coord::InternalSystem sys) { Vector* vv = new Vector[5]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector xx = Vector(size_-1,0)/2; Vector yy = Vector(0,size_-1)/2; Vector cc = center*mm; Vector v1a = cc-xx; Vector v1b = v1a*nn; vv[0] = parent->mapFromRef(v1b,sys); Vector v2a = cc-yy; Vector v2b = v2a*nn; vv[1] = parent->mapFromRef(v2b,sys); Vector v3a = cc+xx; Vector v3b = v3a*nn; vv[2] = parent->mapFromRef(v3b,sys); Vector v4a = cc+yy; Vector v4b = v4a*nn; vv[3] = parent->mapFromRef(v4b,sys); vv[4] = vv[0]; return vv; } Vector* Point::generateCross(Coord::InternalSystem sys) { Vector* vv = new Vector[4]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector xx = Vector(size_,0)/2; Vector yy = Vector(0,size_)/2; Vector cc = center*mm; Vector v1a = cc-xx; Vector v1b = v1a*nn; vv[0] = parent->mapFromRef(v1b,sys); Vector v2a = cc+xx; Vector v2b = v2a*nn; vv[1] = parent->mapFromRef(v2b,sys); Vector v3a = cc-yy; Vector v3b = v3a*nn; vv[2] = parent->mapFromRef(v3b,sys); Vector v4a = cc+yy; Vector v4b = v4a*nn; vv[3] = parent->mapFromRef(v4b,sys); return vv; } Vector* Point::generateEx(Coord::InternalSystem sys) { Vector* vv = new Vector[4]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector xy = Vector(-size_,-size_)/2; Vector yx = Vector( size_,-size_)/2; Vector cc = center*mm; Vector v1a = cc+xy; Vector v1b = v1a*nn; vv[0] = parent->mapFromRef(v1b,sys); Vector v2a = cc-xy; Vector v2b = v2a*nn; vv[1] = parent->mapFromRef(v2b,sys); Vector v3a = cc+yx; Vector v3b = v3a*nn; vv[2] = parent->mapFromRef(v3b,sys); Vector v4a = cc-yx; Vector v4b = v4a*nn; vv[3] = parent->mapFromRef(v4b,sys); return vv; } Vector* Point::generateArrow(Coord::InternalSystem sys) { Vector* vv = new Vector[4]; Matrix mm; Matrix nn; setMatrices(sys,&mm,&nn); Vector xx = Vector(-size_,0)/2; Vector yy = Vector(0,-size_)/2; Vector cc = center*mm; Vector v1a = cc+xx; Vector v1b = v1a*nn; vv[0] = parent->mapFromRef(v1b,sys); Vector v2a = cc+yy; Vector v2b = v2a*nn; vv[1] = parent->mapFromRef(v2b,sys); Vector v3a = cc+xx+yy; Vector v3b = v3a*nn; vv[2] = parent->mapFromRef(v3b,sys); Vector v4a = cc; Vector v4b = v4a*nn; vv[3] = parent->mapFromRef(v4b,sys); return vv; } void Point::shapeStr(PointShape ss) { switch (ss) { case CIRCLE: shapestr_ = dupstr("circle"); break; case BOX: shapestr_ = dupstr("box"); break; case DIAMOND: shapestr_ = dupstr("diamond"); break; case CROSS: shapestr_ = dupstr("cross"); break; case EX: shapestr_ = dupstr("x"); break; case ARROW: shapestr_ = dupstr("arrow"); break; case BOXCIRCLE: shapestr_ = dupstr("boxcircle"); break; } } void Point::setShape(PointShape ss) { shape_ = ss; shapeStr(ss); updateBBox(); doCallBack(CallBack::EDITCB); } void Point::setSize(int size) { size_ = size; updateBBox(); doCallBack(CallBack::EDITCB); } void Point::updateHandles() { // bound marker double ss = size_/2; Vector cc = center*parent->refToCanvas; Vector lla = cc+Vector(-ss,-ss); Vector llb = lla*parent->canvasToRef; Vector ll = parent->mapFromRef(llb,Coord::CANVAS); Vector lra = cc+Vector(-ss,ss); Vector lrb = lra*parent->canvasToRef; Vector lr = parent->mapFromRef(lrb,Coord::CANVAS); Vector ura = cc+Vector(ss,ss); Vector urb = ura*parent->canvasToRef; Vector ur = parent->mapFromRef(urb,Coord::CANVAS); Vector ula = cc+Vector(ss,-ss); Vector ulb = ula*parent->canvasToRef; Vector ul = parent->mapFromRef(ulb,Coord::CANVAS); handle[0] = ll; handle[1] = lr; handle[2] = ur; handle[3] = ul; } void Point::analysis(AnalysisTask mm, int which) { switch (mm) { case PLOT3D: if (!analysisPlot3d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot3dCB_[1], parent->options->cmdName); } if (analysisPlot3d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot3dCB_[1]); } analysisPlot3d_ = which; break; default: // na break; } } void Point::analysisPlot3d(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { double* x; double* y; Vector ll = -Vector(.5,.5) * Translate(center); Vector ur = Vector(.5,.5) * Translate(center); BBox bb(ll,ur); int num = parent->markerAnalysisPlot3d(this, &x, &y, bb, sys, method); analysisXYResult(xname, yname, x, y, num); } int Point::isInRef(const Vector& vv) { Vector& pp = (Vector&)vv; if (pp[0]<-.5 || pp[0]>=.5 || pp[1]<-.5 || pp[1]>=.5) return 0; else return 1; } // list void Point::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } } } listPost(str, conj, strip); } void Point::listPost(ostream& str, int conj, int strip) { // no props for semicolons if (!strip) { if (conj) str << " ||"; str << " # point=" << shapestr_; if (size_ != POINTSIZE) str << ' ' << size_; listProperties(str,0); } else { if (conj) str << "||"; else str << ';'; } } void Point::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRow(XMLPARAM,shapestr_); XMLRow(XMLPARAM2,size_); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Point::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); listCiaoPre(str); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::PHYSICAL); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; default: if (ptr->hasWCSCel(sys)) { char buf[64]; ptr->mapFromRef(center,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ')'; } break; } listCiaoPost(str, strip); } void Point::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { coord.listProsCoordSystem(str,sys,sky); str << "; "; Vector v = ptr->mapFromRef(center,sys); str << type_ << ' ' << setprecision(8) << v; } break; default: if (ptr->hasWCSCel(sys)) { coord.listProsCoordSystem(str,sys,sky); str << "; "; switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << ' ' << setprecision(8) << v[0] << "d " << v[1] << "d "; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') str << type_ << ' ' << ra << ' ' << dec+1; else str << type_ << ' ' << ra << ' ' << dec; } break; } } } listProsPost(str, strip); } void Point::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); listSAOtngPre(str, strip); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ')'; } break; } } } listSAOtngPost(str,strip); } void Point::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); // all coords are in image coords Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; listSAOimagePost(str, strip); } saods9/tksao1.0/frame/point.h000644 000765 000000 00000005566 12544546070 016343 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __point_h__ #define __point_h__ #include "marker.h" class Point : public Marker { public: enum PointShape {CIRCLE,BOX,DIAMOND,CROSS,EX,ARROW,BOXCIRCLE}; protected: PointShape shape_; char* shapestr_; int size_; Vector* generateCircle(Coord::InternalSystem, int); Vector* generateBox(Coord::InternalSystem); Vector* generateDiamond(Coord::InternalSystem); Vector* generateCross(Coord::InternalSystem); Vector* generateEx(Coord::InternalSystem); Vector* generateArrow(Coord::InternalSystem); void renderXCircle(Drawable, Coord::InternalSystem, RenderMode, int); void renderXBox(Drawable drawable, Coord::InternalSystem sys, RenderMode mode); void renderXLineDash(GC lgc); void renderPSCircle(int,int); void renderPSBox(int); void renderPSLineDash(); #ifdef MAC_OSX_TK void renderMACOSXCircle(int); void renderMACOSXBox(); void renderMACOSXLineDash(); #endif #ifdef __WIN32 void renderWIN32Circle(int); void renderWIN32Box(); void renderWIN32LineDash(); #endif void shapeStr(PointShape); void updateHandles(); int isInRef(const Vector&); public: Point(Base* p, const Vector& ctr); Point(Base* p, const Vector& ctr, PointShape shape, int size, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Point(const Point&); virtual ~Point(); virtual Marker* dup() {return new Point(*this);} void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int mode); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif const char* shape() {return shapestr_;} void setShape(PointShape); int size() {return size_;} void setSize(int); void editBegin(int) {} void edit(const Vector& v, int h) {} void editEnd() {} void rotateBegin() {} void rotate(const Vector& v, int h) {} void rotateEnd() {} void analysis(AnalysisTask, int); void analysisPlot3d(char*, char*, Coord::CoordSystem sys, Marker::AnalysisMethod); int isIn(const Vector& vv, Coord::InternalSystem sys) {return isInRef(bckMap(vv,sys));} int isIn(const Vector& vv, const Matrix& bck) {return isInRef(vv*bck);} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listPost(ostream&, int, int); virtual void listCiao(ostream&, Coord::CoordSystem, int); virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOimage(ostream&, int); }; #endif saods9/tksao1.0/frame/polygon.C000644 000765 000000 00000047043 12544546070 016630 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "polygon.h" #include "fitsimage.h" Polygon::Polygon(Base* p, const Vector& ctr, const Vector& b) : Marker(p, ctr, 0) { angle = 0; strcpy(type_, "polygon"); Vector bb = b; vertex.append(new Vertex(-bb[0],-bb[1])); vertex.append(new Vertex( bb[0],-bb[1])); vertex.append(new Vertex( bb[0], bb[1])); vertex.append(new Vertex(-bb[0], bb[1])); updateBBox(); } Polygon::Polygon(Base* p, const Vector& ctr, const Vector& b, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { angle = 0; strcpy(type_, "polygon"); Vector bb = b; vertex.append(new Vertex(-bb[0],-bb[1])); vertex.append(new Vertex( bb[0],-bb[1])); vertex.append(new Vertex( bb[0], bb[1])); vertex.append(new Vertex(-bb[0], bb[1])); updateBBox(); } Polygon::Polygon(Base* p, const List& v, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, Vector(0,0), 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { // Vertex list is in ref coords angle = 0; strcpy(type_, "polygon"); vertex = v; // check to see if the first and last node are the same if (vertex.head()->vector[0] == vertex.tail()->vector[0] && vertex.head()->vector[1] == vertex.tail()->vector[1]) delete vertex.pop(); // find center center = Vector(0,0); vertex.head(); do center += vertex.current()->vector; while (vertex.next()); center /= vertex.count(); // vertices are relative vertex.head(); do vertex.current()->vector *= Translate(-center) * FlipY(); // no rotation while (vertex.next()); updateBBox(); } Polygon::Polygon(const Polygon& a) : Marker(a) { vertex = a.vertex; } void Polygon::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,sys); int done = 0; do { if (!vertex.next()) { done = 1; vertex.head(); } v1 = v2; v2 = fwdMap(vertex.current()->vector,sys); XDrawLine(display, drawable, lgc, v1[0], v1[1], v2[0], v2[1]); } while (!done); } void Polygon::renderPS(int mode) { renderPSGC(mode); vertex.head(); int first = 1; do { ostringstream str; Vector v = fwdMap(vertex.current()->vector,Coord::CANVAS); if (first) { str << "newpath " << endl << v.TkCanvasPs(parent->canvas) << " moveto" << endl << ends; first = 0; } else str << v.TkCanvasPs(parent->canvas) << " lineto" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } while (vertex.next()); ostringstream str; str << "closepath stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } #ifdef MAC_OSX_TK void Polygon::renderMACOSX() { renderMACOSXGC(); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); int done = 0; do { if (!vertex.next()) { done = 1; vertex.head(); } v1 = v2; v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); macosxDrawLine(v1,v2); } while (!done); } #endif #ifdef __WIN32 void Polygon::renderWIN32() { renderWIN32GC(); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); int done = 0; do { if (!vertex.next()) { done = 1; vertex.head(); } v1 = v2; v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); win32DrawLine(v1,v2); } while (!done); } #endif // Support void Polygon::updateHandles() { // generate handles numHandle = 4 + vertex.count(); if (handle) delete [] handle; handle = new Vector[numHandle]; // the first four are our control handles BBox bb; vertex.head(); do bb.bound(vertex.current()->vector); while (vertex.next()); Vector zz = parent->zoom(); float r = 10/zz.length(); bb.expand(r); // give us more room handle[0] = fwdMap(bb.ll,Coord::CANVAS); handle[1] = fwdMap(bb.lr(),Coord::CANVAS); handle[2] = fwdMap(bb.ur,Coord::CANVAS); handle[3] = fwdMap(bb.ul(),Coord::CANVAS); // and the rest are vertices int i=4; vertex.head(); do handle[i++] = fwdMap(vertex.current()->vector,Coord::CANVAS); while (vertex.next()); } void Polygon::updateCoords(const Matrix& mx) { Scale s(mx); vertex.head(); do vertex.current()->vector *= s; while (vertex.next()); Marker::updateCoords(mx); } void Polygon::edit(const Vector& v, int h) { if (h < 5) { Vector s1 = v * bckMatrix(); Vector s2 = bckMap(handle[h-1],Coord::CANVAS); if (s1[0] != 0 && s1[1] != 0 && s2[0] != 0 && s2[1] != 0) { double a = fabs(s1[0]/s2[0]); double b = fabs(s1[1]/s2[1]); double s = a > b ? a : b; vertex.head(); do vertex.current()->vector *= Scale(s); while (vertex.next()); } updateBBox(); doCallBack(CallBack::EDITCB); } else { moveVertex(v,h); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } void Polygon::rotate(const Vector& v, int h) { if (h < 5) Marker::rotate(v,h); else { // we need to check this here, because we are really rotating if (canEdit()) { moveVertex(v,h); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } } void Polygon::reset(const Vector& b) { angle = 0; vertex.deleteAll(); Vector bb = b; vertex.append(new Vertex(-bb[0],-bb[1])); vertex.append(new Vertex( bb[0],-bb[1])); vertex.append(new Vertex( bb[0], bb[1])); vertex.append(new Vertex(-bb[0], bb[1])); updateBBox(); } int Polygon::isInRef(const Vector& v) { /* v[0]-- x value of point being tested v[1]-- y value of point being tested This algorithm is from "An Introduction to Ray Tracing", Academic Press, 1989, edited by Andrew Glassner, pg 53 -- a point lies in a polygon if a line is extended from the point to infinite in any direction and the number of intersections with the polygon is odd. This is valid for both concave and convex polygons. Points on a vertex are considered inside. Points on a edge are considered inside. */ int crossings = 0; // number of crossings vertex.head(); Vector v1; Vector v2 = vertex.current()->vector - v; int sign = ((v2[1])>=0) ? 1 : -1; // init sign // for all edges int done = 0; do { // look at next two vertices v1 = v2; if (!vertex.next()) { done = 1; vertex.head(); } v2 = vertex.current()->vector - v; int nextSign = (v2[1]>=0) ? 1 : -1; // sign holder for p2 if (sign != nextSign) { if (v1[0]>0 && v2[0]>0) crossings++; else if (v1[0]>0 || v2[0]>0) { if (v1[0]-(v1[1]*(v2[0]-v1[0])/(v2[1]-v1[1])) > 0) crossings++; } sign = nextSign; } } while (!done); return fmod(float(crossings),float(2)) ? 1 : 0; // if odd, point is inside } void Polygon::createVertex(int which, const Vector& v) { // which segment (1 to n) // v is in ref coords Matrix mm = bckMatrix(); int seg = which-1; if (seg>=0 && seg4) { int hh = h-4-1; if (vertex.count() > 3) { Vertex* v = vertex[hh]; if (v) { vertex.extractNext(v); delete v; recalcCenter(); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } } } int Polygon::getSegment(const Vector& v) { // v is in canvas coords Matrix mm = fwdMatrix(); vertex.head(); Vector v1; Vector v2 = vertex.current()->vector * mm; int done = 0; int ii = 1; do { v1 = v2; if (!vertex.next()) { vertex.head(); done = 1; } v2 = vertex.current()->vector * mm; Vector l1 = parent->mapFromRef(v1,Coord::CANVAS); Vector l2 = parent->mapFromRef(v2,Coord::CANVAS); double a = (l2-l1).angle(); Matrix mx = Translate(-l1) * FlipY() * Rotate(-a); Vector end = l2*mx; Vector vv = v*mx; if (vv[0]>0 && vv[0]-parent->markerEpsilon && vv[1]markerEpsilon) return ii; ii++; } while (!done); return 0; } void Polygon::moveVertex(const Vector& v, int h) { Matrix mm = bckMatrix(); if (vertex[h-5]) vertex.current()->vector = v * mm; recalcCenter(); } void Polygon::recalcCenter() { // recalculate center Vector nc; vertex.head(); do nc += vertex.current()->vector * Rotate(angle) * FlipY(); while (vertex.next()); nc /= vertex.count(); center += nc; // update all vertices vertex.head(); do vertex.current()->vector -= nc * FlipY() * Rotate(-angle); while (vertex.next()); } void Polygon::analysis(AnalysisTask mm, int which) { switch (mm) { case HISTOGRAM: if (!analysisHistogram_ && which) { addCallBack(CallBack::MOVECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisHistogramCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisHistogramCB_[1], parent->options->cmdName); } if (analysisHistogram_ && !which) { deleteCallBack(CallBack::MOVECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::EDITCB, analysisHistogramCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisHistogramCB_[0]); deleteCallBack(CallBack::DELETECB, analysisHistogramCB_[1]); } analysisHistogram_ = which; break; case PLOT3D: if (!analysisPlot3d_ && which) { addCallBack(CallBack::MOVECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot3dCB_[1], parent->options->cmdName); } if (analysisPlot3d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisPlot3dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot3dCB_[1]); } analysisPlot3d_ = which; break; case STATS: if (!analysisStats_ && which) { addCallBack(CallBack::MOVECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::EDITCB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::ROTATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisStatsCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisStatsCB_[1], parent->options->cmdName); } if (analysisStats_ && !which) { deleteCallBack(CallBack::MOVECB, analysisStatsCB_[0]); deleteCallBack(CallBack::EDITCB, analysisStatsCB_[0]); deleteCallBack(CallBack::ROTATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisStatsCB_[0]); deleteCallBack(CallBack::DELETECB, analysisStatsCB_[1]); } analysisStats_ = which; break; default: // na break; } } void Polygon::analysisHistogram(char* xname, char* yname, int num) { double* x; double* y; BBox bb(center); Matrix mm = Rotate(angle) * Translate(center); vertex.head(); do bb.bound(vertex.current()->vector * mm); while (vertex.next()); parent->markerAnalysisHistogram(this, &x, &y, bb, num); analysisXYResult(xname, yname, x, y, num+1); } void Polygon::analysisPlot3d(char* xname, char* yname, Coord::CoordSystem sys, Marker::AnalysisMethod method) { double* x; double* y; BBox bb(center); Matrix mm = Rotate(angle) * Translate(center); vertex.head(); do bb.bound(vertex.current()->vector * mm); while (vertex.next()); int num = parent->markerAnalysisPlot3d(this, &x, &y, bb, sys, method); analysisXYResult(xname, yname, x, y, num); } void Polygon::analysisStats(Coord::CoordSystem sys, Coord::SkyFrame sky) { ostringstream str; BBox bb(center); Matrix mm = Rotate(angle) * Translate(center); vertex.head(); do bb.bound(vertex.current()->vector * mm); while (vertex.next()); parent->markerAnalysisStats(this, str, bb, sys, sky); Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // list void Polygon::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 0); Matrix mm = fwdMatrix(); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys,sky); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra[16]; char dec[16]; str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; ptr->mapFromRef(vertex.current()->vector*mm,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << ra << ',' << dec; } while (vertex.next()); str << ')'; } break; } } else { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } } } listPost(str, conj, strip); } void Polygon::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); Matrix mm = fwdMatrix(); Vector* vv = new Vector[vertex.count()]; XMLRowInit(); XMLRow(XMLSHAPE,type_); vertex.head(); int cnt =0; do vv[cnt++] =vertex.current()->vector*mm; while (vertex.next()); XMLRowPoint(ptr,sys,sky,format,vv,vertex.count()); delete [] vv; XMLRowProps(ptr,sys); XMLRowEnd(str); } void Polygon::listCiao(ostream& str, Coord::CoordSystem sys, int strip) { FitsImage* ptr = parent->findFits(); Matrix mm = fwdMatrix(); listCiaoPre(str); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector * mm,Coord::PHYSICAL); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; default: if (ptr->hasWCSCel(sys)) { char buf[64]; char ra[16]; char dec[16]; str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; ptr->mapFromRef(vertex.current()->vector*mm,sys,Coord::FK5,Coord::SEXAGESIMAL,buf,64); string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << ra << ',' << dec; } while (vertex.next()); str << ')'; } } listCiaoPost(str, strip); } void Polygon::listPros(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); Matrix mm = fwdMatrix(); switch (sys) { case Coord::IMAGE: case Coord::DETECTOR: case Coord::AMPLIFIER: sys = Coord::IMAGE; case Coord::PHYSICAL: { coord.listProsCoordSystem(str,sys,sky); str << "; " << type_; vertex.head(); do { Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v; } while (vertex.next()); } break; default: if (ptr->hasWCSCel(sys)) { coord.listProsCoordSystem(str,sys,sky); str << "; " << type_ << ' '; switch (format) { case Coord::DEGREES: { vertex.head(); do { Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys,sky); str << setprecision(8) << v[0] << "d " << v[1] << "d "; } while (vertex.next()); } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra[16]; char dec[16]; vertex.head(); do { ptr->mapFromRef(vertex.current()->vector*mm,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra >> dec; if (dec[0]=='+') str << ' ' << ra << ' ' << dec+1; else str << ' ' << ra << ' ' << dec; } while (vertex.next()); } break; } } } listProsPost(str, strip); } void Polygon::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); Matrix mm = fwdMatrix(); listSAOtngPre(str, strip); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys,sky); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra[16]; char dec[16]; str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; ptr->mapFromRef(vertex.current()->vector*mm,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << ra << ',' << dec; } while (vertex.next()); str << ')'; } break; } } } listSAOtngPost(str, strip); } void Polygon::listSAOimage(ostream& str, int strip) { FitsImage* ptr = parent->findFits(); listSAOimagePre(str); Matrix mm = fwdMatrix(); str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,Coord::IMAGE); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; listSAOimagePost(str, strip); } saods9/tksao1.0/frame/polygon.h000644 000765 000000 00000004505 12544546070 016671 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __polygon_h__ #define __polygon_h__ #include "marker.h" #include "list.h" class Polygon : public Marker { protected: List vertex; void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); void moveVertex(const Vector&, int); void recalcCenter(); int isInRef(const Vector& v); public: Polygon(Base* p, const Vector& ctr, const Vector& b); Polygon(Base* p, const Vector& ctr, const Vector& b, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Polygon(Base* p, const List& v, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Polygon(const Polygon&); virtual Marker* dup() {return new Polygon(*this);} void updateCoords(const Matrix&); void edit(const Vector&, int); void rotate(const Vector&, int); void analysis(AnalysisTask, int); void analysisHistogram(char*, char*, int); void analysisPlot3d(char*, char*, Coord::CoordSystem, Marker::AnalysisMethod); void analysisStats(Coord::CoordSystem, Coord::SkyFrame sky); void createVertex(int, const Vector&); void deleteVertex(int); int getSegment(const Vector&); void reset(const Vector&); int isIn(const Vector& vv) {return isIn(vv, Coord::CANVAS);} int isIn(const Vector& vv, Coord::InternalSystem sys) {return isInRef(bckMap(vv,sys));} int isIn(const Vector& vv, const Matrix& bck) {return isInRef(vv*bck);} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); virtual void listCiao(ostream&, Coord::CoordSystem, int); virtual void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); virtual void listSAOimage(ostream&, int); virtual void listPros(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); }; #endif saods9/tksao1.0/frame/projection.C000644 000765 000000 00000023241 12544546070 017307 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "projection.h" #include "fitsimage.h" Projection::Projection(const Projection& a) : BaseLine(a) { width = a.width; p3 = a.p3; p4 = a.p4; } Projection::Projection(Base* p, const Vector& ptr1, const Vector& ptr2, double wd, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseLine(p, ptr1, ptr2, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { width = wd; strcpy(type_,"projection"); handle = new Vector[3]; numHandle = 3; // this causes a focus problem with MacOSX and X11? // analysis(PLOT2D,1); updateBBox(); } void Projection::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector aa = parent->mapFromRef(p1,sys); Vector bb = parent->mapFromRef(p2,sys); XDrawLine(display, drawable, lgc, aa[0], aa[1], bb[0], bb[1]); if (width>0) { renderXLineDash(lgc); Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector c = Vector(0,-width); Vector ll = fwdMap(a,sys); Vector lr = fwdMap(b,sys); Vector ul = fwdMap(a+c,sys); Vector ur = fwdMap(b+c,sys); XDrawLine(display, drawable, lgc, lr[0], lr[1], ur[0], ur[1]); XDrawLine(display, drawable, lgc, ur[0], ur[1], ul[0], ul[1]); XDrawLine(display, drawable, lgc, ul[0], ul[1], ll[0], ll[1]); } } GC Projection::renderXGC(RenderMode mode) { // set width, color, dash switch (mode) { case SRC: XSetForeground(display, gc, color); renderXLineNoDash(gc); return gc; case XOR: renderXLineDash(gcxor); return gcxor; } } void Projection::renderPS(int mode) { renderPSGC(mode); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); { ostringstream str; str << "newpath " << aa.TkCanvasPs(parent->canvas) << "moveto" << bb.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } if (width>0) { renderPSLineDash(); Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector c = Vector(0,-width); Vector ll = fwdMap(a,Coord::CANVAS); Vector lr = fwdMap(b,Coord::CANVAS); Vector ul = fwdMap(a+c,Coord::CANVAS); Vector ur = fwdMap(b+c,Coord::CANVAS); ostringstream str; str << "newpath " << lr.TkCanvasPs(parent->canvas) << "moveto" << ur.TkCanvasPs(parent->canvas) << "lineto" << ul.TkCanvasPs(parent->canvas) << "lineto" << ll.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } void Projection::renderPSGC(int mode) { renderPSColor(mode, parent->getXColor(colorName)); renderPSLineNoDash(); } #ifdef MAC_OSX_TK void Projection::renderMACOSX() { renderMACOSXGC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); macosxDrawLine(aa,bb); if (width>0) { renderMACOSXLineDash(); Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector c = Vector(0,-width); Vector ll = fwdMap(a,Coord::CANVAS); Vector lr = fwdMap(b,Coord::CANVAS); Vector ul = fwdMap(a+c,Coord::CANVAS); Vector ur = fwdMap(b+c,Coord::CANVAS); macosxDrawLine(lr,ur); macosxDrawLine(ur,ul); macosxDrawLine(ul,ll); } } void Projection::renderMACOSXGC() { macosxColor(parent->getXColor(colorName)); renderMACOSXLineNoDash(); } #endif #ifdef __WIN32 void Projection::renderWIN32() { renderWIN32GC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); win32DrawLine(aa,bb); if (width>0) { renderWIN32LineDash(); Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector c = Vector(0,-width); Vector ll = fwdMap(a,Coord::CANVAS); Vector lr = fwdMap(b,Coord::CANVAS); Vector ul = fwdMap(a+c,Coord::CANVAS); Vector ur = fwdMap(b+c,Coord::CANVAS); win32DrawLine(lr,ur); win32DrawLine(ur,ul); win32DrawLine(ul,ll); } } void Projection::renderWIN32GC() { win32Color(parent->getXColor(colorName)); renderWIN32LineNoDash(); } #endif // Support void Projection::updateHandles() { center = (p2-p1)/2 + p1; angle = (p2-p1).angle(); Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector c = Vector(0,-width); p3 = fwdMap(a+c,Coord::CANVAS); p4 = fwdMap(b+c,Coord::CANVAS); Vector hh = fwdMap(((b-a)/2+a)+c,Coord::CANVAS); // generate handles in Coord::CANVAS coords handle[0] = parent->mapFromRef(p1,Coord::CANVAS); handle[1] = parent->mapFromRef(p2,Coord::CANVAS); handle[2] = hh; } void Projection::calcAllBBox() { // p3/p4 are already in Coord::CANVAS coords bbox.bound(p3); bbox.bound(p4); Marker::calcAllBBox(); } void Projection::edit(const Vector& v, int h) { switch (h) { case 1: p1 = v; break; case 2: p2 = v; break; case 3: Matrix mm = bckMatrix(); width = -(v * mm)[1]; if (width<0) width = 0; break; } updateBBox(); doCallBack(CallBack::EDITCB); } int Projection::isIn(const Vector& v) { Vector zz = parent->zoom(); if (width * zz.length() > parent->markerEpsilon) { Matrix imm = bckMatrix(); Vector a = p1*imm; Vector b = p2*imm; Vector vv = -bckMap(v,Coord::CANVAS); return (vv[0]>a[0] && vv[0]0 && vv[1]options->cmdName); addCallBack(CallBack::EDITCB, analysisPlot2dCB_[0], parent->options->cmdName); addCallBack(CallBack::UPDATECB, analysisPlot2dCB_[0], parent->options->cmdName); addCallBack(CallBack::DELETECB, analysisPlot2dCB_[1], parent->options->cmdName); } if (analysisPlot2d_ && !which) { deleteCallBack(CallBack::MOVECB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::EDITCB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::UPDATECB, analysisPlot2dCB_[0]); deleteCallBack(CallBack::DELETECB, analysisPlot2dCB_[1]); } analysisPlot2d_ = which; break; default: // na break; } } void Projection::analysisPlot2d(char* xname, char* yname, char* xcname, char* ycname, Coord::CoordSystem sys, Coord::SkyFrame sky, Marker::AnalysisMethod method) { double* x; double* y; double* xc; double* yc; int num = parent->markerAnalysisPlot2d(this, &x, &y, &xc, &yc, p1, p2, width, sys, sky, method); analysisXYEEResult(xname, yname, xcname, ycname, x, y, xc, yc, num); } // list void Projection::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ',' << ptr->mapLenFromRef(width,sys) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSEqu(sys)) { switch (format) { case Coord::DEGREES: { Vector v1 = ptr->mapFromRef(p1,sys,sky); Vector v2 = ptr->mapFromRef(p2,sys,sky); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ',' << ptr->mapLenFromRef(width,sys,Coord::ARCSEC) << '"' << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra1[16], ra2[16]; char dec1[16], dec2[16]; { ptr->mapFromRef(p1,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra1 >> dec1; } { ptr->mapFromRef(p2,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra2 >> dec2; } str << type_ << '(' << ra1 << ',' << dec1 << ',' << ra2 << ',' << dec2 << ',' << ptr->mapLenFromRef(width,sys,Coord::ARCSEC) << '"' << ')'; } break; } } else { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ',' << ptr->mapLenFromRef(width,sys) << ')'; } } } if (conj) str << " ||"; listProperties(str, 0); } } void Projection::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); Vector vv[2]; vv[0] = p1; vv[1] = p2; double rr = ptr->mapLenFromRef(width,sys,Coord::ARCSEC); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowPoint(ptr,sys,sky,format,vv,2); XMLRow(XMLR,rr); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/projection.h000644 000765 000000 00000003074 12544546070 017356 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __projection_h__ #define __projection_h__ #include "baseline.h" class Projection : public BaseLine { private: double width; Vector p3; // used for bbox Vector p4; private: void renderX(Drawable, Coord::InternalSystem, RenderMode); GC renderXGC(RenderMode); void renderPS(int); void renderPSGC(int); #ifdef MAC_OSX_TK void renderMACOSX(); void renderMACOSXGC(); #endif #ifdef __WIN32 void renderWIN32(); void renderWIN32GC(); #endif void updateHandles(); void calcAllBBox(); public: Projection(const Projection&); Projection(Base* p, const Vector& ptr1, const Vector& ptr2, double wd, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Projection(*this);} int isIn(const Vector&); void updateCoords(const Matrix&); void edit(const Vector&, int); void analysis(AnalysisTask, int); void analysisPlot2d(char*, char*, char*, char*, Coord::CoordSystem, Coord::SkyFrame, Marker::AnalysisMethod); void set(const Vector&, const Vector&, double); void setWidth(double); double getWidth() {return width;} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/proslex.C000644 000765 000000 00000210203 12553253031 016613 0ustar00joyewheel000000 000000 #line 2 "frame/proslex.C" #line 4 "frame/proslex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer prosFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *prosalloc (yy_size_t ); void *prosrealloc (void *,yy_size_t ); void prosfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 52 #define YY_END_OF_BUFFER 53 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[198] = { 0, 0, 0, 2, 2, 53, 51, 47, 50, 51, 51, 51, 51, 51, 22, 46, 46, 46, 46, 46, 46, 46, 46, 46, 14, 46, 46, 46, 46, 51, 51, 2, 1, 47, 48, 0, 43, 0, 44, 0, 22, 24, 33, 29, 23, 22, 0, 46, 25, 46, 46, 27, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 16, 46, 46, 46, 46, 49, 0, 45, 2, 24, 35, 31, 23, 25, 0, 0, 27, 34, 30, 26, 0, 28, 25, 0, 46, 0, 23, 46, 46, 46, 5, 46, 46, 46, 46, 46, 46, 46, 46, 15, 46, 46, 46, 46, 46, 36, 32, 0, 23, 0, 0, 24, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, 37, 0, 46, 0, 46, 46, 4, 46, 7, 46, 46, 46, 46, 12, 46, 46, 18, 46, 46, 46, 0, 0, 38, 37, 0, 0, 41, 0, 0, 39, 46, 6, 46, 46, 46, 46, 46, 46, 46, 20, 46, 41, 39, 42, 40, 3, 46, 8, 46, 46, 13, 46, 19, 21, 9, 46, 11, 17, 46, 10, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 7, 1, 7, 8, 1, 9, 10, 11, 12, 12, 13, 12, 12, 12, 14, 15, 1, 1, 1, 1, 1, 1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 26, 38, 39, 26, 1, 40, 1, 1, 1, 1, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 26, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 26, 62, 63, 26, 64, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[66] = { 0, 1, 1, 2, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1 } ; static yyconst flex_int16_t yy_base[204] = { 0, 0, 0, 134, 131, 130, 1540, 123, 1540, 121, 116, 114, 58, 64, 74, 94, 98, 90, 121, 162, 127, 138, 150, 154, 166, 170, 187, 182, 214, 62, 52, 0, 1540, 114, 1540, 96, 1540, 86, 1540, 233, 255, 308, 1540, 1540, 361, 414, 239, 222, 467, 478, 270, 281, 286, 318, 330, 301, 342, 380, 385, 396, 489, 433, 495, 500, 438, 459, 520, 524, 528, 1540, 25, 1540, 0, 581, 1540, 1540, 634, 539, 553, 563, 1540, 1540, 1540, 1540, 595, 1540, 1540, 606, 621, 646, 105, 673, 656, 455, 573, 688, 692, 705, 709, 729, 733, 660, 745, 751, 756, 767, 771, 783, 787, 1540, 1540, 794, 818, 826, 838, 850, 857, 872, 880, 890, 894, 905, 811, 913, 918, 930, 942, 946, 961, 966, 972, 978, 986, 990, 1009, 1024, 863, 1033, 999, 1041, 1047, 1093, 1057, 1061, 1065, 1073, 1081, 1103, 1114, 1118, 1126, 1130, 1142, 1150, 1158, 1164, 1175, 1183, 1210, 1197, 1221, 1236, 1242, 1252, 1252, 1268, 1282, 1290, 1298, 1303, 1314, 1325, 1330, 1336, 1356, 1341, 1360, 1375, 1540, 1540, 1540, 1540, 1380, 1393, 1397, 1401, 1409, 1414, 1426, 1432, 1440, 1451, 1455, 1459, 1467, 1473, 1478, 1540, 1524, 1527, 1530, 78, 1533, 1536 } ; static yyconst flex_int16_t yy_def[204] = { 0, 197, 1, 198, 198, 197, 197, 197, 197, 197, 199, 200, 197, 197, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 202, 203, 197, 197, 197, 199, 197, 200, 197, 197, 197, 197, 197, 197, 197, 201, 197, 201, 201, 201, 49, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 202, 197, 203, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 49, 197, 49, 49, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 197, 197, 197, 197, 197, 197, 197, 49, 49, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 197, 197, 197, 197, 49, 197, 49, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 197, 197, 197, 197, 197, 201, 197, 197, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 197, 197, 197, 197, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 0, 197, 197, 197, 197, 197, 197 } ; static yyconst flex_int16_t yy_nxt[1606] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 14, 14, 14, 14, 6, 15, 16, 17, 18, 19, 20, 21, 20, 20, 22, 20, 23, 20, 24, 25, 26, 20, 27, 20, 20, 20, 28, 20, 20, 29, 15, 16, 17, 18, 19, 20, 21, 20, 20, 22, 23, 20, 24, 25, 26, 20, 27, 20, 20, 20, 28, 20, 20, 30, 6, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 43, 47, 44, 45, 45, 45, 45, 45, 45, 46, 71, 69, 38, 48, 49, 197, 197, 50, 197, 197, 197, 36, 197, 197, 197, 197, 197, 51, 53, 197, 74, 75, 197, 197, 55, 69, 33, 71, 48, 49, 38, 36, 50, 52, 34, 33, 197, 197, 54, 197, 197, 51, 197, 197, 32, 197, 197, 32, 197, 55, 197, 56, 197, 197, 197, 197, 197, 52, 197, 197, 197, 197, 54, 197, 60, 197, 197, 197, 197, 197, 197, 61, 197, 197, 197, 197, 56, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 60, 57, 197, 197, 197, 62, 197, 197, 197, 197, 58, 197, 63, 197, 197, 59, 197, 197, 197, 197, 64, 197, 197, 197, 197, 197, 57, 197, 197, 62, 197, 65, 197, 67, 58, 197, 197, 63, 66, 59, 197, 197, 197, 197, 64, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 68, 65, 67, 197, 197, 197, 197, 66, 73, 73, 73, 73, 73, 73, 87, 87, 87, 87, 87, 87, 197, 197, 197, 197, 197, 68, 74, 75, 197, 76, 40, 40, 40, 40, 40, 40, 46, 197, 197, 197, 77, 78, 197, 197, 79, 91, 91, 91, 91, 91, 91, 197, 197, 197, 80, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 77, 78, 197, 197, 79, 197, 197, 197, 197, 197, 197, 197, 197, 80, 81, 82, 92, 197, 41, 41, 41, 41, 41, 41, 197, 197, 197, 197, 83, 84, 197, 197, 197, 93, 197, 95, 197, 197, 197, 197, 92, 197, 85, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 83, 84, 197, 197, 197, 197, 95, 96, 197, 197, 197, 197, 197, 85, 42, 43, 94, 197, 41, 41, 41, 41, 41, 41, 197, 197, 197, 197, 86, 78, 197, 197, 96, 197, 197, 197, 197, 197, 197, 197, 94, 197, 80, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 86, 78, 97, 197, 197, 197, 197, 98, 197, 197, 197, 197, 197, 80, 42, 43, 197, 44, 45, 45, 45, 45, 45, 45, 46, 197, 97, 99, 48, 49, 197, 98, 50, 197, 197, 197, 197, 101, 197, 197, 197, 197, 51, 197, 197, 197, 197, 197, 197, 197, 197, 99, 197, 48, 49, 197, 197, 50, 197, 197, 197, 197, 197, 120, 197, 197, 51, 197, 197, 197, 197, 88, 88, 88, 88, 88, 88, 197, 197, 197, 89, 197, 90, 90, 90, 90, 90, 90, 197, 197, 197, 197, 197, 104, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 100, 102, 197, 197, 197, 103, 104, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 100, 197, 102, 197, 105, 197, 103, 106, 111, 111, 111, 111, 111, 111, 197, 197, 197, 197, 197, 107, 89, 108, 112, 112, 112, 112, 112, 112, 197, 105, 197, 106, 113, 113, 113, 113, 113, 113, 197, 197, 197, 197, 197, 107, 197, 108, 109, 110, 197, 197, 73, 73, 73, 73, 73, 73, 197, 197, 197, 197, 83, 84, 114, 197, 115, 115, 115, 115, 115, 115, 197, 197, 197, 197, 85, 87, 87, 87, 87, 87, 87, 116, 197, 197, 197, 83, 84, 197, 197, 197, 88, 88, 88, 88, 88, 88, 197, 197, 85, 74, 75, 197, 197, 73, 73, 73, 73, 73, 73, 117, 197, 197, 197, 86, 78, 112, 112, 112, 112, 112, 112, 197, 197, 197, 197, 197, 197, 80, 197, 127, 197, 197, 197, 117, 197, 197, 197, 197, 86, 78, 197, 197, 91, 91, 91, 91, 91, 91, 197, 197, 197, 80, 119, 197, 197, 197, 197, 197, 197, 197, 197, 118, 197, 197, 197, 197, 121, 197, 197, 197, 197, 197, 197, 197, 197, 197, 119, 197, 197, 197, 197, 197, 197, 197, 197, 118, 197, 197, 122, 123, 197, 121, 197, 124, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 125, 197, 197, 197, 126, 197, 197, 122, 197, 123, 197, 197, 197, 124, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 128, 125, 197, 197, 197, 126, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 129, 197, 197, 197, 128, 197, 130, 197, 197, 197, 132, 197, 197, 111, 111, 111, 111, 111, 111, 197, 131, 197, 197, 197, 129, 197, 197, 197, 197, 197, 130, 133, 134, 74, 75, 132, 197, 112, 112, 112, 112, 112, 112, 145, 131, 113, 113, 113, 113, 113, 113, 197, 197, 197, 197, 133, 134, 115, 115, 115, 115, 115, 115, 197, 135, 109, 110, 197, 145, 115, 115, 115, 115, 115, 115, 136, 137, 137, 137, 137, 137, 137, 159, 159, 159, 159, 159, 159, 135, 197, 138, 139, 139, 139, 139, 139, 139, 197, 140, 141, 141, 141, 141, 141, 141, 197, 197, 197, 197, 197, 197, 197, 197, 143, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 142, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 144, 197, 197, 197, 197, 197, 197, 197, 197, 142, 197, 197, 146, 197, 197, 197, 197, 147, 197, 197, 197, 197, 197, 150, 144, 197, 197, 197, 149, 197, 197, 197, 197, 148, 197, 197, 146, 197, 197, 197, 197, 147, 197, 197, 197, 197, 197, 151, 197, 197, 197, 197, 197, 149, 197, 197, 197, 148, 152, 197, 197, 197, 197, 197, 197, 197, 197, 197, 154, 197, 197, 197, 151, 197, 197, 153, 161, 161, 161, 161, 161, 161, 156, 152, 155, 138, 157, 157, 157, 157, 157, 157, 197, 154, 197, 197, 197, 197, 197, 153, 140, 158, 158, 158, 158, 158, 158, 156, 155, 160, 137, 137, 137, 137, 137, 137, 197, 162, 139, 139, 139, 139, 139, 139, 164, 164, 164, 164, 164, 164, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 163, 197, 197, 197, 197, 197, 197, 197, 197, 197, 168, 197, 197, 197, 197, 197, 197, 197, 167, 197, 197, 197, 197, 197, 163, 197, 165, 141, 141, 141, 141, 141, 141, 197, 197, 168, 197, 197, 197, 197, 197, 169, 167, 197, 197, 197, 197, 197, 197, 197, 197, 197, 166, 197, 197, 197, 197, 197, 197, 197, 197, 197, 170, 197, 197, 169, 197, 197, 197, 171, 197, 173, 197, 197, 197, 197, 166, 197, 172, 197, 197, 197, 197, 197, 197, 174, 170, 197, 197, 197, 197, 197, 197, 171, 197, 197, 173, 197, 197, 197, 197, 197, 172, 197, 197, 197, 197, 197, 197, 197, 174, 197, 197, 175, 197, 197, 162, 157, 157, 157, 157, 157, 157, 197, 197, 197, 197, 176, 197, 197, 177, 159, 159, 159, 159, 159, 159, 175, 197, 197, 197, 197, 178, 165, 158, 158, 158, 158, 158, 158, 197, 176, 197, 197, 177, 159, 159, 159, 159, 159, 159, 197, 197, 197, 197, 197, 178, 197, 197, 179, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 197, 197, 197, 197, 164, 164, 164, 164, 164, 164, 197, 179, 197, 180, 197, 197, 197, 197, 197, 178, 164, 164, 164, 164, 164, 164, 197, 197, 197, 181, 197, 197, 197, 197, 197, 197, 197, 180, 197, 197, 197, 197, 197, 178, 197, 179, 197, 197, 197, 197, 197, 197, 197, 181, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 182, 197, 179, 183, 197, 197, 197, 197, 197, 197, 184, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 182, 197, 197, 197, 183, 197, 186, 197, 197, 197, 185, 184, 197, 197, 197, 187, 197, 197, 197, 197, 197, 197, 189, 197, 188, 197, 197, 197, 197, 197, 197, 186, 197, 197, 185, 197, 197, 197, 197, 187, 197, 197, 197, 197, 197, 197, 189, 197, 197, 188, 197, 197, 197, 197, 197, 197, 190, 197, 197, 197, 197, 197, 197, 191, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 192, 197, 193, 190, 197, 197, 197, 197, 197, 197, 197, 191, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 192, 197, 193, 194, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 195, 197, 197, 197, 197, 197, 194, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 195, 197, 197, 197, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 196, 31, 31, 31, 35, 197, 35, 37, 197, 37, 70, 197, 70, 72, 197, 72, 5, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197 } ; static yyconst flex_int16_t yy_chk[1606] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 201, 14, 14, 14, 14, 14, 14, 14, 14, 70, 29, 37, 14, 14, 17, 17, 14, 17, 15, 15, 35, 15, 16, 16, 17, 16, 14, 16, 15, 90, 90, 90, 16, 17, 29, 33, 30, 14, 14, 11, 10, 14, 15, 9, 7, 18, 18, 16, 18, 5, 14, 20, 20, 4, 20, 18, 3, 0, 17, 0, 18, 20, 21, 21, 0, 21, 15, 0, 0, 0, 0, 16, 21, 21, 22, 22, 0, 22, 23, 23, 22, 23, 0, 0, 22, 18, 19, 19, 23, 19, 24, 24, 0, 24, 25, 25, 19, 25, 21, 19, 24, 0, 0, 23, 25, 0, 27, 27, 19, 27, 25, 26, 26, 19, 26, 0, 27, 0, 25, 0, 0, 26, 0, 0, 19, 0, 0, 23, 0, 26, 0, 27, 19, 0, 0, 25, 26, 19, 28, 28, 0, 28, 25, 0, 0, 0, 47, 47, 28, 47, 0, 0, 0, 28, 26, 27, 47, 0, 0, 0, 26, 39, 39, 39, 39, 39, 39, 46, 46, 46, 46, 46, 46, 0, 0, 0, 0, 0, 28, 40, 40, 0, 40, 40, 40, 40, 40, 40, 40, 40, 0, 0, 0, 40, 40, 0, 50, 40, 50, 50, 50, 50, 50, 50, 0, 51, 51, 40, 51, 0, 52, 52, 0, 52, 0, 51, 0, 0, 40, 40, 52, 0, 40, 0, 0, 55, 55, 0, 55, 0, 0, 40, 41, 41, 52, 55, 41, 41, 41, 41, 41, 41, 53, 53, 0, 53, 41, 41, 0, 0, 0, 53, 53, 55, 54, 54, 0, 54, 52, 0, 41, 0, 0, 0, 54, 0, 56, 56, 0, 56, 0, 41, 41, 0, 0, 0, 56, 55, 56, 0, 0, 0, 0, 0, 41, 44, 44, 54, 0, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 44, 44, 0, 0, 56, 57, 57, 0, 57, 0, 58, 58, 54, 58, 44, 57, 0, 0, 0, 0, 58, 59, 59, 0, 59, 44, 44, 57, 0, 0, 0, 59, 58, 0, 0, 0, 0, 0, 44, 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 45, 0, 57, 59, 45, 45, 0, 58, 45, 61, 61, 0, 61, 61, 64, 64, 0, 64, 45, 61, 0, 0, 0, 0, 64, 0, 0, 59, 0, 45, 45, 93, 93, 45, 93, 65, 65, 0, 65, 93, 0, 93, 45, 48, 48, 65, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 60, 60, 0, 60, 65, 0, 62, 62, 0, 62, 60, 63, 63, 0, 63, 0, 62, 0, 0, 0, 0, 63, 60, 62, 0, 0, 0, 63, 65, 0, 0, 66, 66, 0, 66, 67, 67, 0, 67, 68, 68, 66, 68, 0, 0, 67, 60, 0, 62, 68, 66, 0, 63, 66, 77, 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, 67, 78, 68, 78, 78, 78, 78, 78, 78, 0, 66, 0, 66, 79, 79, 79, 79, 79, 79, 94, 94, 0, 94, 0, 67, 0, 68, 73, 73, 94, 0, 73, 73, 73, 73, 73, 73, 0, 0, 0, 0, 73, 73, 84, 0, 84, 84, 84, 84, 84, 84, 0, 0, 0, 0, 73, 87, 87, 87, 87, 87, 87, 87, 0, 0, 0, 73, 73, 0, 88, 0, 88, 88, 88, 88, 88, 88, 0, 0, 73, 76, 76, 0, 0, 76, 76, 76, 76, 76, 76, 88, 0, 0, 0, 76, 76, 89, 89, 89, 89, 89, 89, 92, 92, 0, 92, 101, 101, 76, 101, 101, 0, 92, 0, 88, 0, 101, 0, 0, 76, 76, 91, 0, 91, 91, 91, 91, 91, 91, 0, 0, 0, 76, 92, 95, 95, 0, 95, 96, 96, 0, 96, 91, 0, 95, 0, 0, 95, 96, 0, 0, 97, 97, 0, 97, 98, 98, 92, 98, 0, 0, 97, 0, 0, 0, 98, 91, 0, 0, 96, 97, 0, 95, 0, 98, 99, 99, 0, 99, 100, 100, 0, 100, 0, 0, 99, 99, 0, 0, 100, 100, 102, 102, 96, 102, 97, 0, 103, 103, 98, 103, 102, 104, 104, 0, 104, 0, 103, 0, 0, 102, 99, 104, 105, 105, 100, 105, 106, 106, 0, 106, 0, 0, 105, 0, 0, 0, 106, 0, 107, 107, 104, 107, 108, 108, 102, 108, 105, 0, 107, 0, 107, 0, 108, 111, 111, 111, 111, 111, 111, 0, 106, 0, 0, 0, 104, 0, 122, 122, 0, 122, 105, 108, 111, 112, 112, 107, 122, 112, 112, 112, 112, 112, 112, 122, 106, 113, 113, 113, 113, 113, 113, 0, 0, 0, 0, 108, 111, 114, 114, 114, 114, 114, 114, 0, 113, 115, 115, 0, 122, 115, 115, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 136, 136, 136, 136, 136, 136, 113, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 0, 119, 120, 120, 0, 120, 120, 0, 119, 0, 0, 0, 120, 121, 121, 0, 121, 0, 0, 0, 119, 123, 123, 121, 123, 0, 124, 124, 0, 124, 0, 123, 0, 0, 0, 121, 124, 0, 125, 125, 0, 125, 0, 0, 119, 0, 0, 123, 125, 0, 126, 126, 124, 126, 127, 127, 0, 127, 127, 121, 126, 0, 0, 126, 127, 0, 0, 0, 125, 128, 128, 123, 128, 0, 129, 129, 124, 129, 0, 128, 130, 130, 128, 130, 129, 0, 131, 131, 126, 131, 130, 0, 125, 129, 132, 132, 131, 132, 133, 133, 0, 133, 0, 131, 132, 0, 0, 128, 133, 0, 130, 138, 138, 138, 138, 138, 138, 133, 129, 132, 134, 134, 134, 134, 134, 134, 134, 0, 131, 0, 0, 0, 0, 0, 130, 135, 135, 135, 135, 135, 135, 135, 133, 132, 137, 137, 137, 137, 137, 137, 137, 139, 139, 139, 139, 139, 139, 139, 139, 140, 140, 140, 140, 140, 140, 142, 142, 0, 142, 143, 143, 0, 143, 144, 144, 142, 144, 0, 139, 143, 0, 145, 145, 144, 145, 0, 0, 0, 144, 146, 146, 145, 146, 0, 0, 0, 142, 0, 0, 146, 0, 0, 139, 141, 141, 141, 141, 141, 141, 141, 141, 147, 147, 144, 147, 0, 0, 0, 0, 146, 142, 147, 148, 148, 0, 148, 149, 149, 0, 149, 141, 0, 148, 0, 150, 150, 149, 150, 151, 151, 147, 151, 0, 146, 150, 0, 0, 148, 151, 151, 152, 152, 0, 152, 141, 0, 149, 0, 153, 153, 152, 153, 0, 152, 147, 0, 154, 154, 153, 154, 0, 148, 155, 155, 151, 155, 154, 0, 0, 0, 149, 0, 155, 156, 156, 0, 156, 0, 152, 0, 0, 154, 0, 156, 157, 157, 157, 157, 157, 157, 157, 0, 0, 0, 0, 155, 0, 0, 156, 159, 159, 159, 159, 159, 159, 154, 0, 0, 0, 0, 157, 158, 158, 158, 158, 158, 158, 158, 0, 155, 0, 0, 156, 160, 160, 160, 160, 160, 160, 0, 0, 0, 0, 0, 157, 0, 0, 158, 161, 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 163, 163, 0, 163, 164, 164, 164, 164, 164, 164, 163, 158, 0, 161, 0, 0, 0, 0, 0, 162, 165, 165, 165, 165, 165, 165, 0, 0, 0, 164, 166, 166, 0, 166, 0, 0, 0, 161, 167, 167, 166, 167, 0, 162, 0, 165, 168, 168, 167, 168, 0, 169, 169, 164, 169, 0, 168, 0, 0, 0, 0, 169, 170, 170, 0, 170, 0, 167, 0, 165, 169, 0, 170, 171, 171, 0, 171, 170, 172, 172, 0, 172, 0, 171, 173, 173, 0, 173, 172, 175, 175, 167, 175, 0, 173, 169, 0, 172, 0, 175, 0, 171, 170, 0, 174, 174, 173, 174, 176, 176, 0, 176, 0, 175, 174, 174, 0, 0, 176, 0, 0, 0, 172, 177, 177, 171, 177, 0, 182, 182, 173, 182, 0, 177, 0, 0, 0, 175, 182, 0, 174, 183, 183, 0, 183, 184, 184, 177, 184, 185, 185, 183, 185, 0, 183, 184, 0, 186, 186, 185, 186, 0, 187, 187, 0, 187, 0, 186, 185, 0, 186, 177, 187, 0, 188, 188, 0, 188, 0, 183, 189, 189, 0, 189, 188, 0, 0, 0, 190, 190, 189, 190, 0, 185, 0, 186, 188, 0, 190, 191, 191, 0, 191, 192, 192, 0, 192, 193, 193, 191, 193, 0, 0, 192, 192, 194, 194, 193, 194, 0, 188, 195, 195, 0, 195, 194, 196, 196, 0, 196, 0, 195, 0, 0, 0, 0, 196, 0, 0, 192, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 198, 198, 198, 199, 0, 199, 200, 0, 200, 202, 0, 202, 203, 0, 203, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/proslex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/proslex.L" #include #include #include #include "util.h" #include "prosparser.H" extern YYSTYPE* proslval; extern prosFlexLexer* proslexx; /* rules */ #line 846 "frame/proslex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 30 "frame/proslex.L" #line 950 "frame/proslex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 198 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 197 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 32 "frame/proslex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(proslval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 39 "frame/proslex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 47 "frame/proslex.L" {return ANNULUS_;} YY_BREAK case 4: YY_RULE_SETUP #line 48 "frame/proslex.L" {return B1950_;} YY_BREAK case 5: YY_RULE_SETUP #line 49 "frame/proslex.L" {return BOX_;} YY_BREAK case 6: YY_RULE_SETUP #line 50 "frame/proslex.L" {return CIRCLE_;} YY_BREAK case 7: YY_RULE_SETUP #line 51 "frame/proslex.L" {return DEBUG_;} YY_BREAK case 8: YY_RULE_SETUP #line 52 "frame/proslex.L" {return ELLIPSE_;} YY_BREAK case 9: YY_RULE_SETUP #line 53 "frame/proslex.L" {return ECLIPTIC_;} YY_BREAK case 10: YY_RULE_SETUP #line 54 "frame/proslex.L" {return EQUATORIAL_;} YY_BREAK case 11: YY_RULE_SETUP #line 55 "frame/proslex.L" {return GALACTIC_;} YY_BREAK case 12: YY_RULE_SETUP #line 56 "frame/proslex.L" {return J2000_;} YY_BREAK case 13: YY_RULE_SETUP #line 57 "frame/proslex.L" {return LOGICAL_;} YY_BREAK case 14: YY_RULE_SETUP #line 58 "frame/proslex.L" {return N_;} YY_BREAK case 15: YY_RULE_SETUP #line 59 "frame/proslex.L" {return OFF_;} YY_BREAK case 16: YY_RULE_SETUP #line 60 "frame/proslex.L" {return ON_;} YY_BREAK case 17: YY_RULE_SETUP #line 61 "frame/proslex.L" {return PHYSICAL_;} YY_BREAK case 18: YY_RULE_SETUP #line 62 "frame/proslex.L" {return POINT_;} YY_BREAK case 19: YY_RULE_SETUP #line 63 "frame/proslex.L" {return POLYGON_;} YY_BREAK case 20: YY_RULE_SETUP #line 64 "frame/proslex.L" {return ROTBOX_;} YY_BREAK case 21: YY_RULE_SETUP #line 65 "frame/proslex.L" {return VERSION_;} YY_BREAK case 22: YY_RULE_SETUP #line 67 "frame/proslex.L" { // Integer proslval->integer = atoi(yytext); return INT; } YY_BREAK case 23: #line 73 "frame/proslex.L" case 24: YY_RULE_SETUP #line 73 "frame/proslex.L" { // Real Number proslval->real = atof(yytext); return REAL; } YY_BREAK case 25: #line 79 "frame/proslex.L" case 26: YY_RULE_SETUP #line 79 "frame/proslex.L" { // degrees yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ANGDEGREE; } YY_BREAK case 27: #line 86 "frame/proslex.L" case 28: YY_RULE_SETUP #line 86 "frame/proslex.L" { // radians yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ANGRADIAN; } YY_BREAK case 29: #line 93 "frame/proslex.L" case 30: #line 94 "frame/proslex.L" case 31: #line 95 "frame/proslex.L" case 32: YY_RULE_SETUP #line 95 "frame/proslex.L" { // minutes of arc yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ARCMINUTE; } YY_BREAK case 33: #line 102 "frame/proslex.L" case 34: #line 103 "frame/proslex.L" case 35: #line 104 "frame/proslex.L" case 36: YY_RULE_SETUP #line 104 "frame/proslex.L" { // seconds of arc yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ARCSECOND; } YY_BREAK case 37: #line 111 "frame/proslex.L" case 38: YY_RULE_SETUP #line 111 "frame/proslex.L" { // Sexagesimal int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 39: #line 119 "frame/proslex.L" case 40: YY_RULE_SETUP #line 119 "frame/proslex.L" { // HMS int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return HMSSTR; } YY_BREAK case 41: #line 127 "frame/proslex.L" case 42: YY_RULE_SETUP #line 127 "frame/proslex.L" { // DMS int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return DMSSTR; } YY_BREAK case 43: #line 135 "frame/proslex.L" case 44: YY_RULE_SETUP #line 135 "frame/proslex.L" { // Quoted String int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); strncpy(proslval->str,yytext+1,ll); // skip the " " proslval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 45: YY_RULE_SETUP #line 142 "frame/proslex.L" { // Quoted String int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); strncpy(proslval->str,yytext+1,ll); // skip the '{' proslval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 46: YY_RULE_SETUP #line 149 "frame/proslex.L" { // General String int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return STRING; } YY_BREAK case 47: YY_RULE_SETUP #line 156 "frame/proslex.L" { // White Spaces } YY_BREAK case 48: /* rule 48 can match eol */ YY_RULE_SETUP #line 159 "frame/proslex.L" { // windows line feed return '\n'; } YY_BREAK case 49: YY_RULE_SETUP #line 163 "frame/proslex.L" { // fake line feed return '\n'; } YY_BREAK case 50: /* rule 50 can match eol */ YY_RULE_SETUP #line 167 "frame/proslex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 171 "frame/proslex.L" { // eof return EOF_; } YY_BREAK case 51: YY_RULE_SETUP #line 175 "frame/proslex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 52: YY_RULE_SETUP #line 179 "frame/proslex.L" ECHO; YY_BREAK #line 1332 "frame/proslex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; prosfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); prosfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ prosrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) prosrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 198 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 198 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 197); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) prosalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) prosalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) prosfree((void *) b->yy_ch_buf ); prosfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)prosalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)prosrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) prosalloc(new_size ); else (yy_start_stack) = (int *) prosrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *prosalloc (yy_size_t size ) { return (void *) malloc( size ); } void *prosrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void prosfree (void * ptr ) { free( (char *) ptr ); /* see prosrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 179 "frame/proslex.L" void prosDiscard(int doit) { if (proslexx) proslexx->begin(DISCARD, doit); } void prosFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/proslex.L000644 000765 000000 00000007746 12464230774 016656 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "prosparser.H" extern YYSTYPE* proslval; extern prosFlexLexer* proslexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(proslval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return STRING; } annulus {return ANNULUS_;} b1950 {return B1950_;} box {return BOX_;} circle {return CIRCLE_;} debug {return DEBUG_;} ellipse {return ELLIPSE_;} ecliptic {return ECLIPTIC_;} equatorial {return EQUATORIAL_;} galactic {return GALACTIC_;} j2000 {return J2000_;} logical {return LOGICAL_;} n {return N_;} off {return OFF_;} on {return ON_;} physical {return PHYSICAL_;} point {return POINT_;} polygon {return POLYGON_;} rotbox {return ROTBOX_;} version {return VERSION_;} [+-]?{D}+ { // Integer proslval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number proslval->real = atof(yytext); return REAL; } [+-]?{D}+"."?d | [+-]?{D}*"."{D}+d { // degrees yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ANGDEGREE; } [+-]?{D}+"."?r | [+-]?{D}*"."{D}+r { // radians yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ANGRADIAN; } {D}+"."?' | {D}*"."{D}+' | [+-]?{D}+"."?({E})?' | [+-]?{D}*"."{D}+({E})?' { // minutes of arc yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ARCMINUTE; } {D}+"."?\" | {D}*"."{D}+\" | [+-]?{D}+"."?({E})?\" | [+-]?{D}*"."{D}+({E})?\" { // seconds of arc yytext[yyleng-1] = '\0'; proslval->real = atof(yytext); return ARCSECOND; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return SEXSTR; } [+-]?{D}+h{D}+m{D}+"."?s | [+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return HMSSTR; } [+-]?{D}+d{D}+m{D}+"."?s | [+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return DMSSTR; } \"[^\"\n]*\" | \'[^\'\n]*\' { // Quoted String int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); strncpy(proslval->str,yytext+1,ll); // skip the " " proslval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}\n]*\} { // Quoted String int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); strncpy(proslval->str,yytext+1,ll); // skip the '{' proslval->str[ll] = '\0'; // Remove the '}' return STRING; } [0-9A-Za-z]+ { // General String int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); strncpy(proslval->str,yytext,ll); proslval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \\n { // fake line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void prosDiscard(int doit) { if (proslexx) proslexx->begin(DISCARD, doit); } void prosFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/prosparser.C000644 000765 000000 00000205426 12553253031 017332 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse prosparse #define yylex proslex #define yyerror proserror #define yylval proslval #define yychar proschar #define yydebug prosdebug #define yynerrs prosnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, ANGDEGREE = 261, ARCMINUTE = 262, ARCSECOND = 263, ANGRADIAN = 264, SEXSTR = 265, HMSSTR = 266, DMSSTR = 267, EOF_ = 268, ANNULUS_ = 269, B1950_ = 270, BOX_ = 271, CIRCLE_ = 272, DEBUG_ = 273, ECLIPTIC_ = 274, ELLIPSE_ = 275, EQUATORIAL_ = 276, GALACTIC_ = 277, J2000_ = 278, LOGICAL_ = 279, N_ = 280, OFF_ = 281, ON_ = 282, PHYSICAL_ = 283, POINT_ = 284, POLYGON_ = 285, ROTBOX_ = 286, VERSION_ = 287 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define ANGDEGREE 261 #define ARCMINUTE 262 #define ARCSECOND 263 #define ANGRADIAN 264 #define SEXSTR 265 #define HMSSTR 266 #define DMSSTR 267 #define EOF_ 268 #define ANNULUS_ 269 #define B1950_ 270 #define BOX_ 271 #define CIRCLE_ 272 #define DEBUG_ 273 #define ECLIPTIC_ 274 #define ELLIPSE_ 275 #define EQUATORIAL_ 276 #define GALACTIC_ 277 #define J2000_ 278 #define LOGICAL_ 279 #define N_ 280 #define OFF_ 281 #define ON_ 282 #define PHYSICAL_ 283 #define POINT_ 284 #define POLYGON_ 285 #define ROTBOX_ 286 #define VERSION_ 287 /* Copy the first part of user declarations. */ #line 10 "frame/prosparser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; prosDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer prosFlexLexer #include extern int proslex(void*, prosFlexLexer*); extern void proserror(Base*, prosFlexLexer*, const char*); extern void prosDiscard(int); static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static unsigned short globalProps; static unsigned short localProps; static const char *color = "green"; static int dash[] ={8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static char localComment[80]; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aStatus; static Vector aCenter; static double aAngle; static unsigned short aProps; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 65 "frame/prosparser.Y" { #define PROSBUFSIZE 2048 double real; int integer; char str[PROSBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 231 "frame/prosparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 244 "frame/prosparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 215 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 44 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 41 /* YYNRULES -- Number of rules. */ #define YYNRULES 90 /* YYNRULES -- Number of states. */ #define YYNSTATES 187 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 287 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 33, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 2, 43, 2, 2, 41, 2, 36, 37, 2, 39, 35, 40, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 34, 2, 38, 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, 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, 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, 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, 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, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 7, 11, 14, 15, 18, 20, 21, 25, 26, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 51, 53, 54, 56, 57, 59, 60, 62, 64, 66, 68, 70, 72, 74, 76, 80, 84, 88, 92, 96, 98, 100, 102, 106, 110, 114, 118, 122, 124, 126, 129, 131, 133, 135, 137, 139, 141, 142, 143, 144, 146, 148, 156, 166, 167, 180, 192, 202, 221, 231, 241, 260, 266, 267, 274, 278, 280, 282, 286, 288, 290, 291, 292, 293, 297, 298, 302, 304, 305 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 45, 0, -1, 68, 46, 78, -1, 46, 47, 50, -1, 47, 50, -1, -1, 18, 52, -1, 32, -1, -1, 65, 48, 79, -1, -1, 66, 49, 79, -1, 69, 70, 71, -1, 81, -1, 33, -1, 34, -1, 13, -1, 4, -1, 3, -1, 27, -1, 26, -1, -1, 35, -1, -1, 36, -1, -1, 37, -1, -1, 57, -1, 51, -1, 6, -1, 9, -1, 51, -1, 6, -1, 7, -1, 8, -1, 51, 53, 51, -1, 6, 53, 6, -1, 7, 53, 7, -1, 8, 53, 8, -1, 25, 38, 3, -1, 10, -1, 11, -1, 12, -1, 61, 53, 61, -1, 62, 53, 63, -1, 63, 53, 63, -1, 51, 53, 51, -1, 6, 53, 6, -1, 24, -1, 28, -1, 21, 67, -1, 15, -1, 23, -1, 22, -1, 19, -1, 15, -1, 23, -1, -1, -1, -1, 39, -1, 40, -1, 17, 54, 64, 53, 58, 55, 83, -1, 14, 54, 64, 53, 58, 53, 58, 55, 83, -1, -1, 14, 54, 64, 53, 58, 53, 58, 53, 72, 76, 55, 83, -1, 14, 54, 64, 53, 58, 53, 58, 53, 60, 55, 83, -1, 20, 54, 64, 53, 59, 53, 56, 55, 83, -1, 20, 54, 64, 53, 59, 53, 56, 55, 41, 42, 20, 54, 64, 53, 59, 53, 56, 55, -1, 16, 54, 64, 53, 59, 53, 56, 55, 83, -1, 31, 54, 64, 53, 59, 53, 56, 55, 83, -1, 16, 54, 64, 53, 59, 53, 56, 55, 41, 42, 16, 54, 64, 53, 59, 53, 56, 55, -1, 29, 54, 64, 55, 83, -1, -1, 30, 73, 54, 74, 55, 83, -1, 74, 53, 75, -1, 75, -1, 64, -1, 76, 53, 77, -1, 77, -1, 58, -1, -1, -1, -1, 43, 80, 5, -1, -1, 43, 82, 5, -1, 78, -1, -1, 43, 84, 5, 78, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 125, 125, 128, 129, 132, 133, 134, 135, 135, 136, 136, 137, 138, 141, 142, 143, 146, 147, 150, 151, 154, 155, 158, 159, 162, 163, 166, 167, 170, 171, 172, 175, 176, 177, 178, 181, 188, 195, 202, 211, 214, 217, 220, 223, 236, 244, 252, 259, 269, 270, 273, 274, 275, 276, 277, 280, 281, 284, 295, 307, 308, 309, 313, 317, 321, 321, 330, 335, 351, 358, 374, 379, 386, 390, 390, 395, 396, 399, 402, 403, 406, 410, 437, 438, 438, 441, 441, 444, 445, 445 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "STRING", "ANGDEGREE", "ARCMINUTE", "ARCSECOND", "ANGRADIAN", "SEXSTR", "HMSSTR", "DMSSTR", "EOF_", "ANNULUS_", "B1950_", "BOX_", "CIRCLE_", "DEBUG_", "ECLIPTIC_", "ELLIPSE_", "EQUATORIAL_", "GALACTIC_", "J2000_", "LOGICAL_", "N_", "OFF_", "ON_", "PHYSICAL_", "POINT_", "POLYGON_", "ROTBOX_", "VERSION_", "'\\n'", "';'", "','", "'('", "')'", "'='", "'+'", "'-'", "'&'", "'!'", "'#'", "$accept", "start", "commands", "command", "@1", "@2", "terminator", "numeric", "debug", "sp", "bp", "ep", "optangle", "angle", "value", "vvalue", "numberof", "sexagesimal", "hms", "dms", "coord", "coordSystem", "skyFrame", "equatorial", "initGlobal", "initLocal", "include", "shape", "@3", "@4", "polyNodes", "polyNode", "aRads", "aRad", "processAnnulus", "comment", "@5", "generalComment", "@6", "shapeComment", "@7", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 10, 59, 44, 40, 41, 61, 43, 45, 38, 33, 35 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 44, 45, 46, 46, 47, 47, 47, 48, 47, 49, 47, 47, 47, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 61, 62, 63, 64, 64, 64, 64, 64, 65, 65, 66, 66, 66, 66, 66, 67, 67, 68, 69, 70, 70, 70, 71, 71, 72, 71, 71, 71, 71, 71, 71, 71, 71, 73, 71, 74, 74, 75, 76, 76, 77, 78, 79, 80, 79, 82, 81, 83, 84, 83 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 3, 2, 0, 2, 1, 0, 3, 0, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 7, 9, 0, 12, 11, 9, 18, 9, 9, 18, 5, 0, 6, 3, 1, 1, 3, 1, 1, 0, 0, 0, 3, 0, 3, 1, 0, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 58, 0, 59, 1, 52, 0, 55, 0, 54, 53, 49, 50, 7, 86, 59, 0, 8, 10, 60, 13, 20, 19, 6, 56, 57, 51, 0, 0, 2, 16, 14, 15, 4, 83, 83, 61, 62, 0, 87, 3, 84, 9, 11, 23, 23, 23, 23, 23, 74, 23, 12, 0, 24, 0, 0, 0, 0, 0, 23, 0, 85, 18, 17, 21, 41, 42, 43, 21, 21, 21, 21, 21, 21, 21, 21, 25, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 82, 78, 21, 77, 0, 48, 47, 44, 45, 46, 33, 34, 35, 32, 21, 21, 21, 21, 21, 21, 25, 21, 89, 88, 73, 0, 82, 21, 0, 0, 0, 0, 0, 27, 82, 27, 0, 76, 75, 27, 21, 37, 38, 39, 36, 30, 31, 29, 25, 28, 63, 25, 82, 25, 65, 82, 82, 82, 90, 82, 0, 25, 0, 64, 0, 70, 0, 68, 71, 0, 82, 81, 21, 80, 0, 0, 40, 67, 0, 82, 23, 23, 79, 66, 0, 0, 21, 21, 0, 0, 21, 21, 27, 27, 25, 25, 72, 69 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 14, 15, 33, 34, 32, 67, 22, 79, 53, 89, 137, 138, 160, 108, 150, 68, 69, 70, 90, 16, 17, 25, 2, 18, 37, 50, 151, 58, 91, 92, 161, 162, 112, 41, 51, 19, 26, 113, 125 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -92 static const yytype_int16 yypact[] = { -92, 2, 163, -92, -92, 17, -92, 19, -92, -92, -92, -92, -92, -92, 132, 7, -92, -92, 6, -92, -92, -92, -92, -92, -92, -92, 13, 7, -92, -92, -92, -92, -92, -36, -36, -92, -92, 72, -92, -92, -92, -92, -92, 12, 12, 12, 12, 12, -92, 12, -92, 48, -92, 197, 197, 197, 197, 197, 12, 197, -92, -92, -92, 32, -92, -92, -92, 32, 32, 32, 32, 32, 32, 32, 32, 33, 197, 32, -92, 63, 52, 65, 61, 61, 118, 207, 118, 207, -92, 40, -92, 155, -92, 207, -92, -92, -92, -92, -92, -92, -92, -92, -92, 32, 32, 32, 32, 32, 32, 33, 32, -92, -92, -92, 197, 40, 32, 118, 90, 91, 89, 52, 102, 40, 102, 105, -92, -92, 102, 155, -92, -92, -92, -92, -92, -92, -92, 33, -92, -92, 33, -92, 33, 82, 40, -19, -5, -92, 40, 74, 33, 118, -92, 73, -92, 75, -92, -92, 115, 40, -92, 155, -92, 107, 116, -92, -92, 118, 40, 12, 12, -92, -92, 197, 197, 32, 32, 207, 207, 32, 32, 102, 102, 33, 33, -92, -92 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -92, -92, -92, 121, -92, -92, 112, -8, -92, -42, -41, -90, -91, -92, -63, -78, -92, 59, -92, -25, -43, -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, 27, -92, -23, -14, 108, -92, -92, -92, -64, -92 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -83 static const yytype_int16 yytable[] = { 28, 115, 3, 54, 55, 56, 57, 40, 59, 110, 71, 72, 73, 74, 75, 116, 77, 76, 38, 123, 29, 103, 153, 109, 111, 80, 81, 82, 83, 84, 85, 86, 87, 140, 23, 93, 155, 142, 111, 144, 30, 31, 24, 20, 21, 35, 36, 145, 52, 114, 146, 127, 148, 60, 129, 61, 62, 97, 98, 139, 159, 117, 118, 119, 120, 121, 122, 78, 124, 94, 88, 168, 95, 66, 128, 64, 102, 107, 102, 107, 152, 154, 156, 111, 157, 107, 43, 143, 44, 45, 183, 184, 46, 185, 186, 166, 130, 132, 131, 179, 180, 47, 48, 49, 172, 61, 62, 149, 134, 102, 141, 135, 158, 133, 136, 163, 136, 164, 165, 167, 136, 61, 62, 169, 99, 100, 101, 147, 173, 174, 175, 176, -82, 177, 178, 27, 170, 181, 182, 39, 96, 126, 42, 102, 171, -5, 0, 4, 0, 0, 5, 6, 0, 7, 8, 9, 10, 0, 0, 102, 11, 0, 0, 0, 12, -5, -5, 0, -25, 107, 107, 0, 0, 136, 136, 13, -5, 0, 4, 0, 0, 5, 6, 0, 7, 8, 9, 10, -25, -25, 78, 11, 88, 0, 0, 12, -5, -5, -25, 0, 61, 62, 0, 63, 0, 0, 13, 64, 65, 66, 61, 62, 0, 104, 105, 106 }; static const yytype_int16 yycheck[] = { 14, 91, 0, 44, 45, 46, 47, 43, 49, 87, 53, 54, 55, 56, 57, 93, 59, 58, 5, 109, 13, 84, 41, 86, 43, 67, 68, 69, 70, 71, 72, 73, 74, 124, 15, 77, 41, 128, 43, 129, 33, 34, 23, 26, 27, 39, 40, 137, 36, 91, 140, 115, 142, 5, 117, 3, 4, 82, 83, 123, 150, 103, 104, 105, 106, 107, 108, 35, 110, 6, 37, 161, 80, 12, 116, 10, 84, 85, 86, 87, 144, 145, 146, 43, 148, 93, 14, 129, 16, 17, 181, 182, 20, 183, 184, 159, 6, 8, 7, 177, 178, 29, 30, 31, 168, 3, 4, 25, 6, 117, 5, 9, 38, 121, 122, 42, 124, 42, 3, 161, 128, 3, 4, 16, 6, 7, 8, 141, 169, 170, 173, 174, 0, 175, 176, 14, 20, 179, 180, 27, 81, 114, 34, 151, 167, 13, -1, 15, -1, -1, 18, 19, -1, 21, 22, 23, 24, -1, -1, 167, 28, -1, -1, -1, 32, 33, 34, -1, 13, 177, 178, -1, -1, 181, 182, 43, 13, -1, 15, -1, -1, 18, 19, -1, 21, 22, 23, 24, 33, 34, 35, 28, 37, -1, -1, 32, 33, 34, 43, -1, 3, 4, -1, 6, -1, -1, 43, 10, 11, 12, 3, 4, -1, 6, 7, 8 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 45, 68, 0, 15, 18, 19, 21, 22, 23, 24, 28, 32, 43, 46, 47, 65, 66, 69, 81, 26, 27, 52, 15, 23, 67, 82, 47, 78, 13, 33, 34, 50, 48, 49, 39, 40, 70, 5, 50, 43, 79, 79, 14, 16, 17, 20, 29, 30, 31, 71, 80, 36, 54, 54, 54, 54, 54, 73, 54, 5, 3, 4, 6, 10, 11, 12, 51, 61, 62, 63, 64, 64, 64, 64, 64, 54, 64, 35, 53, 53, 53, 53, 53, 53, 53, 53, 53, 37, 55, 64, 74, 75, 53, 6, 51, 61, 63, 63, 6, 7, 8, 51, 58, 6, 7, 8, 51, 59, 58, 59, 43, 78, 83, 53, 55, 59, 53, 53, 53, 53, 53, 53, 55, 53, 84, 75, 83, 53, 58, 6, 7, 8, 51, 6, 9, 51, 56, 57, 83, 56, 5, 56, 53, 55, 55, 55, 78, 55, 25, 60, 72, 83, 41, 83, 41, 83, 83, 38, 55, 58, 76, 77, 42, 42, 3, 83, 53, 55, 16, 20, 77, 83, 54, 54, 64, 64, 53, 53, 59, 59, 53, 53, 56, 56, 55, 55 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, prosFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; prosFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, prosFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; prosFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, prosFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; prosFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, prosFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; prosFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, prosFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, prosFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; prosFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 7: #line 134 "frame/prosparser.Y" {cerr << "PROS" << endl;;} break; case 8: #line 135 "frame/prosparser.Y" {globalSystem = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer);;} break; case 10: #line 136 "frame/prosparser.Y" {globalSystem = Coord::WCS; globalSky = (Coord::SkyFrame)(yyvsp[(1) - (1)].integer);;} break; case 16: #line 143 "frame/prosparser.Y" {YYACCEPT;;} break; case 17: #line 146 "frame/prosparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 18: #line 147 "frame/prosparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 19: #line 150 "frame/prosparser.Y" {yydebug=1;;} break; case 20: #line 151 "frame/prosparser.Y" {yydebug=0;;} break; case 27: #line 166 "frame/prosparser.Y" {(yyval.real) = 0;;} break; case 28: #line 167 "frame/prosparser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 29: #line 170 "frame/prosparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 30: #line 171 "frame/prosparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 31: #line 172 "frame/prosparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 32: #line 175 "frame/prosparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::IMAGE);;} break; case 33: #line 176 "frame/prosparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::DEGREE);;} break; case 34: #line 177 "frame/prosparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::ARCMIN);;} break; case 35: #line 178 "frame/prosparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), checkWCSSystem(), Coord::ARCSEC);;} break; case 36: #line 182 "frame/prosparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 37: #line 189 "frame/prosparser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::DEGREE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 38: #line 196 "frame/prosparser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::ARCMIN); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 39: #line 203 "frame/prosparser.Y" { Vector r=FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),checkWCSSystem(),Coord::ARCSEC); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 40: #line 211 "frame/prosparser.Y" {(yyval.integer) = (yyvsp[(3) - (3)].integer);;} break; case 41: #line 214 "frame/prosparser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 42: #line 217 "frame/prosparser.Y" {(yyval.real) = parseHMSStr((yyvsp[(1) - (1)].str));;} break; case 43: #line 220 "frame/prosparser.Y" {(yyval.real) = parseDMSStr((yyvsp[(1) - (1)].str));;} break; case 44: #line 224 "frame/prosparser.Y" { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), sys, sky); else r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real)*360./24.,(yyvsp[(3) - (3)].real)), sys, sky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 45: #line 237 "frame/prosparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 46: #line 245 "frame/prosparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 47: #line 253 "frame/prosparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), localSystem, localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 48: #line 260 "frame/prosparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 49: #line 269 "frame/prosparser.Y" {(yyval.integer) = Coord::IMAGE;;} break; case 50: #line 270 "frame/prosparser.Y" {(yyval.integer) = Coord::PHYSICAL;;} break; case 51: #line 273 "frame/prosparser.Y" {(yyval.integer) = (yyvsp[(2) - (2)].integer);;} break; case 52: #line 274 "frame/prosparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 53: #line 275 "frame/prosparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 54: #line 276 "frame/prosparser.Y" {(yyval.integer) = Coord::GALACTIC;;} break; case 55: #line 277 "frame/prosparser.Y" {(yyval.integer) = Coord::ECLIPTIC;;} break; case 56: #line 280 "frame/prosparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 57: #line 281 "frame/prosparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 58: #line 284 "frame/prosparser.Y" { // global properties globalSystem = Coord::IMAGE; globalSky = Coord::FK5; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; ;} break; case 59: #line 295 "frame/prosparser.Y" { // reset maperr flag maperr =0; // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localComment,""); ;} break; case 60: #line 307 "frame/prosparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 61: #line 308 "frame/prosparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 62: #line 309 "frame/prosparser.Y" {setProps(&localProps, Marker::INCLUDE, 0);;} break; case 63: #line 314 "frame/prosparser.Y" {fr->createCircleCmd(Vector((yyvsp[(3) - (7)].vector)), (yyvsp[(5) - (7)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 64: #line 318 "frame/prosparser.Y" {fr->createAnnulusCmd(Vector((yyvsp[(3) - (9)].vector)), (yyvsp[(5) - (9)].real),(yyvsp[(7) - (9)].real),1, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 65: #line 321 "frame/prosparser.Y" {aNum=2;;} break; case 66: #line 323 "frame/prosparser.Y" { aAnnuli[0] = (yyvsp[(5) - (12)].real); aAnnuli[1] = (yyvsp[(7) - (12)].real); fr->createAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), aNum,aAnnuli, color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 67: #line 331 "frame/prosparser.Y" {fr->createAnnulusCmd(Vector((yyvsp[(3) - (11)].vector)), (yyvsp[(5) - (11)].real),(yyvsp[(7) - (11)].real),(yyvsp[(9) - (11)].integer), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 68: #line 336 "frame/prosparser.Y" { // for ellipse annulus aStatus = 1; aCenter = Vector((yyvsp[(3) - (9)].vector)); aAngle = (yyvsp[(7) - (9)].real); aVector[0] = Vector((yyvsp[(5) - (9)].vector)); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 69: #line 353 "frame/prosparser.Y" { aStatus = 2; aVector[aNum++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 70: #line 359 "frame/prosparser.Y" { // for box annulus aStatus = 3; aCenter = Vector((yyvsp[(3) - (9)].vector)); aAngle = (yyvsp[(7) - (9)].real); aVector[0] = Vector((yyvsp[(5) - (9)].vector)); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 71: #line 375 "frame/prosparser.Y" {fr->createBoxCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 72: #line 381 "frame/prosparser.Y" { aStatus = 4; aVector[aNum++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 73: #line 387 "frame/prosparser.Y" {fr->createPointCmd(Vector((yyvsp[(3) - (5)].vector)), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 74: #line 390 "frame/prosparser.Y" {polylist.deleteAll();;} break; case 75: #line 391 "frame/prosparser.Y" {fr->createPolygonCmd(polylist, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 78: #line 399 "frame/prosparser.Y" {polylist.append(new Vertex((yyvsp[(1) - (1)].vector)));;} break; case 81: #line 406 "frame/prosparser.Y" {aAnnuli[aNum++] = (yyvsp[(1) - (1)].real);;} break; case 82: #line 410 "frame/prosparser.Y" { switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; } aStatus = 0; ;} break; case 84: #line 438 "frame/prosparser.Y" {DISCARD_(1);;} break; case 86: #line 441 "frame/prosparser.Y" {DISCARD_(1);;} break; case 89: #line 445 "frame/prosparser.Y" {DISCARD_(0);;} break; case 90: #line 446 "frame/prosparser.Y" {strncpy(localComment,(yyvsp[(3) - (4)].str),80);;} break; /* Line 1267 of yacc.c. */ #line 2090 "frame/prosparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 449 "frame/prosparser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/prosparser.H000644 000765 000000 00000006537 12553253031 017341 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, ANGDEGREE = 261, ARCMINUTE = 262, ARCSECOND = 263, ANGRADIAN = 264, SEXSTR = 265, HMSSTR = 266, DMSSTR = 267, EOF_ = 268, ANNULUS_ = 269, B1950_ = 270, BOX_ = 271, CIRCLE_ = 272, DEBUG_ = 273, ECLIPTIC_ = 274, ELLIPSE_ = 275, EQUATORIAL_ = 276, GALACTIC_ = 277, J2000_ = 278, LOGICAL_ = 279, N_ = 280, OFF_ = 281, ON_ = 282, PHYSICAL_ = 283, POINT_ = 284, POLYGON_ = 285, ROTBOX_ = 286, VERSION_ = 287 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define ANGDEGREE 261 #define ARCMINUTE 262 #define ARCSECOND 263 #define ANGRADIAN 264 #define SEXSTR 265 #define HMSSTR 266 #define DMSSTR 267 #define EOF_ 268 #define ANNULUS_ 269 #define B1950_ 270 #define BOX_ 271 #define CIRCLE_ 272 #define DEBUG_ 273 #define ECLIPTIC_ 274 #define ELLIPSE_ 275 #define EQUATORIAL_ 276 #define GALACTIC_ 277 #define J2000_ 278 #define LOGICAL_ 279 #define N_ 280 #define OFF_ 281 #define ON_ 282 #define PHYSICAL_ 283 #define POINT_ 284 #define POLYGON_ 285 #define ROTBOX_ 286 #define VERSION_ 287 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 65 "frame/prosparser.Y" { #define PROSBUFSIZE 2048 double real; int integer; char str[PROSBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 121 "frame/prosparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/prosparser.Y000644 000765 000000 00000024300 12537605764 017366 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {prosFlexLexer* ll} %parse-param {prosFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; prosDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer prosFlexLexer #include extern int proslex(void*, prosFlexLexer*); extern void proserror(Base*, prosFlexLexer*, const char*); extern void prosDiscard(int); static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static unsigned short globalProps; static unsigned short localProps; static const char *color = "green"; static int dash[] ={8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static char localComment[80]; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aStatus; static Vector aCenter; static double aAngle; static unsigned short aProps; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); %} %union { #define PROSBUFSIZE 2048 double real; int integer; char str[PROSBUFSIZE]; double vector[3]; } %type numeric %type angle %type optangle %type value %type vvalue %type sexagesimal %type hms %type dms %type coord %type coordSystem %type skyFrame %type equatorial %type numberof %token INT %token REAL %token STRING %token ANGDEGREE %token ARCMINUTE %token ARCSECOND %token ANGRADIAN %token SEXSTR %token HMSSTR %token DMSSTR %token EOF_ %token ANNULUS_ %token B1950_ %token BOX_ %token CIRCLE_ %token DEBUG_ %token ECLIPTIC_ %token ELLIPSE_ %token EQUATORIAL_ %token GALACTIC_ %token J2000_ %token LOGICAL_ %token N_ %token OFF_ %token ON_ %token PHYSICAL_ %token POINT_ %token POLYGON_ %token ROTBOX_ %token VERSION_ %% start : initGlobal commands processAnnulus ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "PROS" << endl;} | coordSystem {globalSystem = (Coord::CoordSystem)$1;} comment | skyFrame {globalSystem = Coord::WCS; globalSky = (Coord::SkyFrame)$1;} comment | initLocal include shape | generalComment ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; sp : /* empty */ | ',' ; bp : /* empty */ | '(' ; ep : /* emtpy */ | ')' ; optangle: /* empty */ {$$ = 0;} | angle {$$ = $1;} ; angle : numeric {$$ = degToRad($1);} /* assume degree */ | ANGDEGREE {$$ = degToRad($1);} | ANGRADIAN {$$=$1;} ; value : numeric {$$ = FITSPTR->mapLenToRef($1, Coord::IMAGE);} | ANGDEGREE {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::DEGREE);} | ARCMINUTE {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::ARCMIN);} | ARCSECOND {$$ = FITSPTR->mapLenToRef($1, checkWCSSystem(), Coord::ARCSEC);} ; vvalue : numeric sp numeric { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::DEGREE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCMINUTE sp ARCMINUTE { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::ARCMIN); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ARCSECOND sp ARCSECOND { Vector r=FITSPTR->mapLenToRef(Vector($1,$3),checkWCSSystem(),Coord::ARCSEC); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; numberof: N_ '=' INT {$$ = $3;} ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; hms : HMSSTR {$$ = parseHMSStr($1);} ; dms : DMSSTR {$$ = parseDMSStr($1);} ; coord : sexagesimal sp sexagesimal { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector($1,$3), sys, sky); else r = FITSPTR->mapToRef(Vector($1*360./24.,$3), sys, sky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | hms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | dms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3), localSystem, localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; coordSystem : LOGICAL_ {$$ = Coord::IMAGE;} | PHYSICAL_ {$$ = Coord::PHYSICAL;} ; skyFrame : EQUATORIAL_ equatorial {$$ = $2;} | B1950_ {$$ = Coord::FK4;} | J2000_ {$$ = Coord::FK5;} | GALACTIC_ {$$ = Coord::GALACTIC;} | ECLIPTIC_ {$$ = Coord::ECLIPTIC;} ; equatorial : B1950_ {$$ = Coord::FK4;} | J2000_ {$$ = Coord::FK5;} ; initGlobal:{ // global properties globalSystem = Coord::IMAGE; globalSky = Coord::FK5; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; } ; initLocal : { // reset maperr flag maperr =0; // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localComment,""); } ; include : /* empty */ {setProps(&localProps, Marker::INCLUDE, 1);} | '+' {setProps(&localProps, Marker::INCLUDE, 1);} | '-' {setProps(&localProps, Marker::INCLUDE, 0);} ; shape : CIRCLE_ bp coord sp value ep shapeComment {fr->createCircleCmd(Vector($3), $5, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ANNULUS_ bp coord sp value sp value ep shapeComment {fr->createAnnulusCmd(Vector($3), $5,$7,1, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ANNULUS_ bp coord sp value sp value sp {aNum=2;} aRads ep shapeComment { aAnnuli[0] = $5; aAnnuli[1] = $7; fr->createAnnulusCmd(Vector($3), aNum,aAnnuli, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ANNULUS_ bp coord sp value sp value sp numberof ep shapeComment {fr->createAnnulusCmd(Vector($3), $5,$7,$9, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ELLIPSE_ bp coord sp vvalue sp optangle ep shapeComment { // for ellipse annulus aStatus = 1; aCenter = Vector($3); aAngle = $7; aVector[0] = Vector($5); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp optangle ep '&' '!' ELLIPSE_ bp coord sp vvalue sp optangle ep { aStatus = 2; aVector[aNum++] = Vector($5); } | BOX_ bp coord sp vvalue sp optangle ep shapeComment { // for box annulus aStatus = 3; aCenter = Vector($3); aAngle = $7; aVector[0] = Vector($5); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ROTBOX_ bp coord sp vvalue sp optangle ep shapeComment {fr->createBoxCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | BOX_ bp coord sp vvalue sp optangle ep '&' '!' BOX_ bp coord sp vvalue sp optangle ep { aStatus = 4; aVector[aNum++] = Vector($5); } | POINT_ bp coord ep shapeComment {fr->createPointCmd(Vector($3), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | POLYGON_ {polylist.deleteAll();} bp polyNodes ep shapeComment {fr->createPolygonCmd(polylist, color,dash,1,font,text,localProps,localComment,taglist,cblist);} ; polyNodes : polyNodes sp polyNode | polyNode ; polyNode : coord {polylist.append(new Vertex($1));} ; aRads : aRads sp aRad | aRad ; aRad : value {aAnnuli[aNum++] = $1;} ; processAnnulus : /* empty */ { switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; } aStatus = 0; } ; comment : /* empty */ | '#' {DISCARD_(1);} STRING ; generalComment : '#' {DISCARD_(1);} STRING ; shapeComment : /* empty */ processAnnulus | '#' {DISCARD_(0);} STRING processAnnulus {strncpy(localComment,$3,80);} ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/raytrace.C000644 000765 000000 00000001036 12464214757 016750 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "raytrace.h" RayTrace::RayTrace() { az_ =0; el_ =0; zbuf_ =NULL; mkzbuf_ =NULL; next_ =NULL; previous_ =NULL; } RayTrace::RayTrace(double az, double el) { az_ = az; el_ = el; zbuf_ = NULL; mkzbuf_ = NULL; next_ =NULL; previous_ =NULL; } RayTrace::~RayTrace() { if (zbuf_) delete [] zbuf_; if (mkzbuf_) delete [] mkzbuf_; } saods9/tksao1.0/frame/raytrace.h000644 000765 000000 00000001361 12464214757 017016 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __raytrace_h__ #define __raytrace_h__ #include "list.h" class RayTrace { public: double az_; double el_; float* zbuf_; unsigned char* mkzbuf_; RayTrace* next_; RayTrace* previous_; public: RayTrace(); RayTrace(double, double); ~RayTrace(); double az() {return az_;} double el() {return el_;} float* zbuf() {return zbuf_;} unsigned char* mkzbuf() {return mkzbuf_;} RayTrace* previous() {return previous_;} void setPrevious(RayTrace* r) {previous_ = r;} RayTrace* next() {return next_;} void setNext(RayTrace* r) {next_ = r;} }; #endif saods9/tksao1.0/frame/ruler.C000644 000765 000000 00000032305 12544546070 016265 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "ruler.h" #include "fitsimage.h" Ruler::Ruler(const Ruler& a) : BaseLine(a) { p3 = a.p3; coordSystem = a.coordSystem; skyFrame = a.skyFrame; distSystem = a.distSystem; distDist = a.distDist; dist = a.dist; } Ruler::Ruler(Base* p, const Vector& ptr1, const Vector& ptr2, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem distsys, Coord::SkyDist distfor, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : BaseLine(p, ptr1, ptr2, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { coordSystem = sys; skyFrame = sky; distSystem = distsys; distDist = distfor; dist = 0; strcpy(type_,"ruler"); handle = new Vector[2]; numHandle = 2; updateBBox(); } void Ruler::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); Vector aa = parent->mapFromRef(p1,sys); Vector bb = parent->mapFromRef(p2,sys); Vector cc = parent->mapFromRef(p3,sys); Vector dd = modifyArrow(p2,p1,sys); Vector ee = modifyArrow(p1,p2,sys); // line XDrawLine(display, drawable, lgc, dd[0], dd[1], ee[0], ee[1]); renderXArrow(drawable, p2, p1, sys, lgc); renderXArrow(drawable, p1, p2, sys, lgc); // axes renderXLineDash(lgc); XDrawLine(display, drawable, lgc, aa[0], aa[1], cc[0], cc[1]); XDrawLine(display, drawable, lgc, bb[0], bb[1], cc[0], cc[1]); // dist ostringstream str; distToStr(str); if (tkfont_) { XSetFont(display, lgc, Tk_FontId(tkfont_)); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); char* buf = dupstr(str.str().c_str()); int width = Tk_TextWidth(tkfont_, buf, strlen(buf)); Vector tt = ((bb-aa)/2+aa) * Translate(-width/2.,-metrics.descent); Tk_DrawChars(display, drawable, lgc, tkfont_, buf, strlen(buf), tt[0], tt[1]); if (buf) delete [] buf; } } GC Ruler::renderXGC(RenderMode mode) { // set width, color, dash switch (mode) { case SRC: XSetForeground(display, gc, color); renderXLineNoDash(gc); return gc; case XOR: renderXLineDash(gcxor); return gcxor; } } void Ruler::renderPS(int mode) { renderPSGC(mode); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); Vector cc = parent->mapFromRef(p3,Coord::CANVAS); Vector dd = modifyArrow(p2,p1,Coord::CANVAS); Vector ee = modifyArrow(p1,p2,Coord::CANVAS); // line { ostringstream str; str << "newpath " << dd.TkCanvasPs(parent->canvas) << "moveto" << ee.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); renderPSArrow(p2,p1,Coord::CANVAS); renderPSArrow(p1,p2,Coord::CANVAS); } // axes renderPSLineDash(); { ostringstream str; str << "newpath " << aa.TkCanvasPs(parent->canvas) << "moveto" << cc.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl; str << "newpath " << bb.TkCanvasPs(parent->canvas) << "moveto" << cc.TkCanvasPs(parent->canvas) << "lineto" << " stroke" << endl; str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } // dist if (psfont_) { ostringstream vstr; ostringstream str; const char* ff = Tk_NameOfFont(psfont_); str << '/' << psFontName(ff) << " findfont " << int(psFontSize(ff)*parent->getDisplayRatio()) << " scalefont setfont" << endl; distToStr(vstr); char* buf = dupstr(vstr.str().c_str()); Vector tt = ((bb-aa)/2 + aa).TkCanvasPs(parent->canvas); str << "gsave" << endl << "newpath " << endl << tt << " moveto" << endl << '(' << psQuote(buf) << ')' << endl << "dup true charpath pathbbox " << endl << "closepath " << endl << "3 -1 roll sub 2.5 div " << endl << "3 1 roll sub 2 div exch " << endl << tt << " moveto rmoveto show " << endl << "grestore" << endl; str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); if (buf) delete buf; } } void Ruler::renderPSGC(int mode) { renderPSColor(mode, parent->getXColor(colorName)); renderPSLineNoDash(); } #ifdef MAC_OSX_TK void Ruler::renderMACOSX() { renderMACOSXGC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); Vector cc = parent->mapFromRef(p3,Coord::CANVAS); Vector dd = modifyArrow(p2,p1,Coord::CANVAS); Vector ee = modifyArrow(p1,p2,Coord::CANVAS); // line macosxDrawLine(dd,ee); renderMACOSXArrow(p2,p1,Coord::CANVAS); renderMACOSXArrow(p1,p2,Coord::CANVAS); // axes renderMACOSXLineDash(); macosxDrawLine(aa,cc); macosxDrawLine(bb,cc); // dist { ostringstream vstr; distToStr(vstr); if (psfont_) { Tcl_DString psdstr; Tcl_DStringInit(&psdstr); int psSize = Tk_PostscriptFontName(psfont_, &psdstr); macosxFont(Tcl_DStringValue(&psdstr), psSize); Tcl_DStringFree(&psdstr); Tk_FontMetrics metrics; Tk_GetFontMetrics(psfont_, &metrics); char* buf = dupstr(vstr.str().c_str()); int width = Tk_TextWidth(psfont_, buf, strlen(buf)); Vector tt = ((bb-aa)/2 + aa) * Translate(-width/2., -metrics.descent); macosxDrawText(tt, 0, buf); if (buf) delete buf; } } } void Ruler::renderMACOSXGC() { macosxColor(parent->getXColor(colorName)); renderMACOSXLineNoDash(); } #endif // WIN32 #ifdef __WIN32 void Ruler::renderWIN32() { renderWIN32GC(); Vector aa = parent->mapFromRef(p1,Coord::CANVAS); Vector bb = parent->mapFromRef(p2,Coord::CANVAS); Vector cc = parent->mapFromRef(p3,Coord::CANVAS); Vector dd = modifyArrow(p2,p1,Coord::CANVAS); Vector ee = modifyArrow(p1,p2,Coord::CANVAS); // line win32DrawLine(dd,ee); renderWIN32Arrow(p2,p1,Coord::CANVAS); renderWIN32Arrow(p1,p2,Coord::CANVAS); // axes renderWIN32LineDash(); win32DrawLine(aa,cc); win32DrawLine(bb,cc); // dist { ostringstream vstr; distToStr(vstr); if (tkfont_) { win32Font(tkfont_); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); char* buf = dupstr(vstr.str().c_str()); int width = Tk_TextWidth(tkfont_, buf, strlen(buf)); Vector tt = ((bb-aa)/2 + aa) * Translate(-width/2., -metrics.descent); win32DrawText(tt, 0, buf); if (buf) delete buf; } } } void Ruler::renderWIN32GC() { win32Color(parent->getXColor(colorName)); renderWIN32LineNoDash(); } #endif // Support void Ruler::updateHandles() { center = (p2-p1)/2 + p1; angle = (p2-p1).angle(); // calc p3, dist FitsImage* ptr = parent->findFits(coordSystem,center); Vector a = ptr->mapFromRef(p1,coordSystem,skyFrame); Vector b = ptr->mapFromRef(p2,coordSystem,skyFrame); p3 = ptr->mapToRef(Vector(b[0],a[1]),coordSystem,skyFrame); dist = ptr->mapDistFromRef(p2, p1, distSystem, distDist); // generate handles in canvas coords handle[0] = parent->mapFromRef(p1,Coord::CANVAS); handle[1] = parent->mapFromRef(p2,Coord::CANVAS); } void Ruler::calcAllBBox() { // P3 bbox.bound(parent->mapFromRef(p3,Coord::CANVAS)); // make room for text if (tkfont_) { Vector v = (p2-p1)/2 + p1; ostringstream str; distToStr(str); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); char* buf = dupstr(str.str().c_str()); int width = Tk_TextWidth(tkfont_, buf, strlen(buf)); Vector ll = parent->mapFromRef(v,Coord::CANVAS) * Translate(-width/2.,-metrics.descent); Vector ur = parent->mapFromRef(v,Coord::CANVAS) * Translate(width/2.,metrics.ascent); bbox.bound(ll); bbox.bound(ur); if (buf) delete [] buf; } Marker::calcAllBBox(); } void Ruler::updateCoords(const Matrix& mx) { p3*=mx; BaseLine::updateCoords(mx); } int Ruler::isOn(const Vector& v, const Vector& v1, const Vector& v2) { // v : canvas coords // v1: ref coords // v2: ref coords // do this in canvas coords, not ref coords Vector l1 = parent->mapFromRef(v1,Coord::CANVAS); Vector l2 = parent->mapFromRef(v2,Coord::CANVAS); double a = (l2-l1).angle(); Matrix m = Translate(-l1) * Rotate(a); Vector end = l2*m; Vector vv = v*m; return (vv[0]>0 && vv[0]-parent->markerEpsilon && vv[1]markerEpsilon); } int Ruler::isIn(const Vector& vv) { // test to see if point is on edge, if so, considered inside if (isOn(vv,p1,p2) || isOn(vv,p1,p3) || isOn(vv,p2,p3)) return 1; /* v[0]-- x value of point being tested v[1]-- y value of point being tested This algorithm is from "An Introduction to Ray Tracing", Academic Press, 1989, edited by Andrew Glassner, pg 53 -- a point lies in a polygon if a line is extended from the point to infinite in any direction and the number of intersections with the polygon is odd. This is valid for both concave and convex polygons. Points on a vertex are considered inside. Points on a edge are considered inside. */ // analysis in ref coords Vector v = parent->mapToRef(vv,Coord::CANVAS); int crossings = 0; // number of crossings int sign; // for all edges for (int i=0; i<3; i++) { Vector v1, v2; switch (i) { case 0: v1 = p1-v; v2 = p2-v; sign = ((v1[1])>=0) ? 1 : -1; // init sign break; case 1: v1 = p2-v; v2 = p3-v; break; case 2: v1 = p3-v; v2 = p1-v; break; } int nextSign = (v2[1]>=0) ? 1 : -1; // sign holder for p2 if (sign != nextSign) { if (v1[0]>0 && v2[0]>0) crossings++; else if (v1[0]>0 || v2[0]>0) { if (v1[0]-(v1[1]*(v2[0]-v1[0])/(v2[1]-v1[1])) > 0) crossings++; } sign = nextSign; } } return fmod(float(crossings),float(2)) ? 1 : 0; // if odd, point is inside } void Ruler::setCoordSystem(Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem dsys, Coord::SkyDist dist) { coordSystem = sys; skyFrame = sky; distSystem = dsys; distDist = dist; updateBBox(); } void Ruler::distToStr(ostringstream& str) { switch (distSystem) { case Coord::IMAGE: str << dist << " img"; break; case Coord::PHYSICAL: str << dist << " phy"; break; case Coord::AMPLIFIER: str << dist << " amp"; break; case Coord::DETECTOR: str << dist << " det"; break; default: if (parent->findFits()->hasWCSCel(distSystem)) switch (distDist) { case Coord::DEGREE: str << dist << " deg"; break; case Coord::ARCMIN: str << dist << '\''; break; case Coord::ARCSEC: str << dist << '"'; break; } else str << dist << " lin"; } } // list void Ruler::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v1 = ptr->mapFromRef(p1,sys,sky); Vector v2 = ptr->mapFromRef(p2,sys,sky); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra1[16], ra2[16]; char dec1[16], dec2[16]; { ptr->mapFromRef(p1,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra1 >> dec1; } { ptr->mapFromRef(p2,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra2 >> dec2; } str << type_ << '(' << ra1 << ',' << dec1 << ',' << ra2 << ',' << dec2 << ')'; } break; } } else { Vector v1 = ptr->mapFromRef(p1,sys); Vector v2 = ptr->mapFromRef(p2,sys); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << v2[0] << ',' << v2[1] << ')'; } } } if (conj) str << " ||"; str << " ruler="; coord.listCoordSystem(str, coordSystem, skyFrame, 1, ptr->hasWCSCel(coordSystem)); str << ' '; coord.listDistSystem(str, distSystem, distDist, ptr->hasWCSCel(distSystem)); listProperties(str, 0); } } void Ruler::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); Vector vv[2]; vv[0] = p1; vv[1] = p2; ostringstream sysstr; coord.listCoordSystem(sysstr,coordSystem,skyFrame,0,ptr->hasWCSCel(coordSystem)); ostringstream diststr; coord.listDistSystem(diststr,distSystem,distDist,ptr->hasWCSCel(distSystem)); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowPoint(ptr,sys,sky,format,vv,2); XMLRow(XMLPARAM,(char*)(sysstr.str().c_str())); XMLRow(XMLPARAM2,(char*)(diststr.str().c_str())); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/ruler.h000644 000765 000000 00000003573 12544546070 016337 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __ruler_h__ #define __ruler_h__ #include "baseline.h" class Ruler : public BaseLine { private: Vector p3; Coord::CoordSystem coordSystem; Coord::SkyFrame skyFrame; Coord::CoordSystem distSystem; Coord::SkyDist distDist; double dist; private: void renderX(Drawable, Coord::InternalSystem, RenderMode); GC renderXGC(RenderMode); void renderPS(int); void renderPSGC(int); #ifdef MAC_OSX_TK void renderMACOSX(); void renderMACOSXGC(); #endif #ifdef __WIN32 void renderWIN32(); void renderWIN32GC(); #endif void updateHandles(); void calcAllBBox(); int isOn(const Vector&, const Vector&, const Vector&); void distToStr(ostringstream&); public: Ruler(const Ruler&); Ruler(Base* p, const Vector& ptr1, const Vector& ptr2, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::CoordSystem distsys, Coord::SkyDist distfor, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Ruler(*this);} void updateCoords(const Matrix&); int isIn(const Vector&); const Vector& getP1() {return p1;} const Vector& getP2() {return p2;} const Vector& getP3() {return p3;} void setCoordSystem(Coord::CoordSystem, Coord::SkyFrame, Coord::CoordSystem, Coord::SkyDist); Coord::CoordSystem getSystem() {return coordSystem;} Coord::SkyFrame getSkyFrame() {return skyFrame;} Coord::CoordSystem getDistSystem() {return distSystem;} Coord::SkyDist getDistDist() {return distDist;} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/saolex.C000644 000765 000000 00000136710 12553253031 016424 0ustar00joyewheel000000 000000 #line 2 "frame/saolex.C" #line 4 "frame/saolex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer saoFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *saoalloc (yy_size_t ); void *saorealloc (void *,yy_size_t ); void saofree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 27 #define YY_END_OF_BUFFER 28 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[101] = { 0, 0, 0, 2, 2, 28, 26, 22, 25, 26, 26, 26, 26, 26, 15, 21, 21, 21, 21, 21, 21, 8, 21, 21, 21, 21, 26, 26, 2, 1, 22, 23, 0, 18, 0, 19, 0, 15, 17, 16, 15, 21, 21, 21, 21, 21, 21, 21, 21, 10, 21, 21, 21, 24, 0, 20, 2, 0, 0, 0, 16, 21, 4, 21, 21, 21, 9, 21, 21, 21, 21, 16, 0, 17, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 6, 21, 11, 21, 21, 21, 21, 5, 21, 21, 13, 21, 3, 7, 12, 14, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 7, 1, 7, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, 17, 19, 17, 20, 21, 22, 17, 23, 24, 25, 26, 27, 17, 28, 29, 17, 1, 30, 1, 1, 1, 1, 31, 32, 33, 34, 35, 36, 37, 17, 38, 17, 17, 39, 17, 40, 41, 42, 17, 43, 44, 45, 46, 47, 17, 48, 49, 17, 50, 1, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[52] = { 0, 1, 1, 2, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1 } ; static yyconst flex_int16_t yy_base[107] = { 0, 0, 0, 252, 246, 248, 266, 245, 266, 243, 240, 236, 44, 232, 46, 48, 49, 51, 50, 53, 232, 230, 58, 54, 55, 66, 47, 186, 0, 266, 233, 266, 229, 266, 226, 266, 222, 91, 68, 77, 99, 221, 102, 96, 89, 98, 107, 106, 112, 220, 111, 115, 120, 266, 176, 266, 0, 115, 124, 217, 75, 127, 213, 134, 130, 136, 203, 139, 143, 150, 144, 199, 195, 192, 147, 156, 154, 161, 169, 173, 157, 179, 176, 185, 182, 172, 163, 192, 177, 198, 199, 149, 201, 204, 124, 210, 94, 85, 71, 63, 266, 250, 253, 256, 62, 259, 262 } ; static yyconst flex_int16_t yy_def[107] = { 0, 100, 1, 101, 101, 100, 100, 100, 100, 100, 102, 103, 100, 100, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 100, 105, 106, 100, 100, 100, 102, 100, 103, 100, 100, 100, 100, 100, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 100, 105, 100, 106, 100, 100, 100, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 100, 100, 100, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, 100, 100, 100, 100, 100, 100 } ; static yyconst flex_int16_t yy_nxt[318] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 21, 22, 23, 24, 20, 20, 20, 25, 20, 20, 26, 15, 16, 17, 18, 19, 20, 20, 20, 20, 21, 22, 23, 24, 20, 20, 20, 25, 20, 20, 27, 6, 36, 37, 39, 40, 100, 100, 100, 100, 42, 100, 100, 100, 46, 41, 100, 53, 43, 45, 44, 100, 47, 48, 100, 50, 51, 38, 49, 100, 52, 42, 58, 100, 60, 46, 38, 53, 43, 45, 44, 57, 47, 100, 48, 50, 51, 100, 49, 39, 37, 52, 100, 58, 100, 57, 100, 39, 40, 59, 100, 60, 57, 42, 100, 100, 61, 62, 64, 100, 100, 63, 59, 100, 71, 65, 57, 66, 100, 67, 68, 72, 100, 73, 42, 100, 61, 62, 100, 64, 69, 63, 100, 70, 100, 65, 75, 100, 66, 67, 68, 100, 100, 74, 77, 100, 76, 100, 100, 78, 69, 80, 100, 70, 100, 100, 82, 75, 81, 100, 84, 100, 79, 74, 77, 83, 76, 100, 88, 78, 100, 100, 80, 85, 100, 100, 82, 100, 81, 87, 100, 84, 79, 100, 86, 83, 92, 89, 88, 91, 100, 73, 90, 85, 73, 94, 100, 100, 71, 100, 87, 100, 100, 93, 86, 97, 92, 89, 100, 95, 91, 100, 90, 96, 98, 94, 71, 55, 100, 100, 99, 38, 35, 93, 33, 30, 97, 55, 100, 95, 100, 38, 35, 96, 98, 33, 31, 30, 100, 29, 99, 28, 28, 28, 32, 29, 32, 34, 100, 34, 54, 100, 54, 56, 100, 56, 5, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 } ; static yyconst flex_int16_t yy_chk[318] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 14, 14, 15, 16, 18, 17, 14, 19, 23, 24, 18, 104, 22, 26, 15, 17, 16, 99, 19, 22, 25, 23, 24, 38, 22, 98, 25, 14, 38, 60, 60, 18, 39, 26, 15, 17, 16, 39, 19, 97, 22, 23, 24, 44, 22, 37, 37, 25, 96, 38, 43, 37, 45, 40, 40, 42, 42, 42, 39, 40, 47, 46, 43, 44, 46, 50, 48, 45, 57, 51, 57, 47, 37, 48, 52, 50, 50, 58, 94, 58, 40, 61, 43, 44, 64, 46, 51, 45, 63, 52, 65, 47, 63, 67, 48, 50, 50, 68, 70, 61, 65, 74, 64, 91, 69, 67, 51, 69, 76, 52, 75, 80, 74, 63, 70, 77, 76, 86, 68, 61, 65, 75, 64, 78, 80, 67, 85, 79, 69, 77, 82, 88, 74, 81, 70, 79, 84, 76, 68, 83, 78, 75, 85, 81, 80, 83, 87, 73, 82, 77, 72, 88, 89, 90, 71, 92, 79, 66, 93, 87, 78, 92, 85, 81, 95, 89, 83, 62, 82, 90, 93, 88, 59, 54, 49, 41, 95, 36, 34, 87, 32, 30, 92, 27, 21, 89, 20, 13, 11, 90, 93, 10, 9, 7, 5, 4, 95, 101, 101, 101, 102, 3, 102, 103, 0, 103, 105, 0, 105, 106, 0, 106, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/saolex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/saolex.L" #include #include #include #include "util.h" #include "saoparser.H" extern YYSTYPE* saolval; extern saoFlexLexer* saolexx; /* rules */ #line 528 "frame/saolex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 30 "frame/saolex.L" #line 632 "frame/saolex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 101 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 100 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 32 "frame/saolex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(saolval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 39 "frame/saolex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(saolval->str,yytext,ll); saolval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 47 "frame/saolex.L" {return ANNULUS_;} YY_BREAK case 4: YY_RULE_SETUP #line 48 "frame/saolex.L" {return BOX_;} YY_BREAK case 5: YY_RULE_SETUP #line 49 "frame/saolex.L" {return CIRCLE_;} YY_BREAK case 6: YY_RULE_SETUP #line 50 "frame/saolex.L" {return DEBUG_;} YY_BREAK case 7: YY_RULE_SETUP #line 51 "frame/saolex.L" {return ELLIPSE_;} YY_BREAK case 8: YY_RULE_SETUP #line 52 "frame/saolex.L" {return N_;} YY_BREAK case 9: YY_RULE_SETUP #line 53 "frame/saolex.L" {return OFF_;} YY_BREAK case 10: YY_RULE_SETUP #line 54 "frame/saolex.L" {return ON_;} YY_BREAK case 11: YY_RULE_SETUP #line 55 "frame/saolex.L" {return POINT_;} YY_BREAK case 12: YY_RULE_SETUP #line 56 "frame/saolex.L" {return POLYGON_;} YY_BREAK case 13: YY_RULE_SETUP #line 57 "frame/saolex.L" {return ROTBOX_;} YY_BREAK case 14: YY_RULE_SETUP #line 58 "frame/saolex.L" {return VERSION_;} YY_BREAK case 15: YY_RULE_SETUP #line 60 "frame/saolex.L" { // Integer saolval->integer = atoi(yytext); return INT; } YY_BREAK case 16: #line 66 "frame/saolex.L" case 17: YY_RULE_SETUP #line 66 "frame/saolex.L" { // Real Number saolval->real = atof(yytext); return REAL; } YY_BREAK case 18: #line 72 "frame/saolex.L" case 19: YY_RULE_SETUP #line 72 "frame/saolex.L" { // Quoted String int ll = (yyleng-2)<(SAOBUFSIZE-1)?(yyleng-2):(SAOBUFSIZE-1); strncpy(saolval->str,yytext+1,ll); // skip the " " saolval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 20: YY_RULE_SETUP #line 79 "frame/saolex.L" { // Quoted String int ll = (yyleng-2)<(SAOBUFSIZE-1)?(yyleng-2):(SAOBUFSIZE-1); strncpy(saolval->str,yytext+1,ll); // skip the '{' saolval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 21: YY_RULE_SETUP #line 86 "frame/saolex.L" { // General String int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(saolval->str,yytext,ll); saolval->str[ll] = '\0'; return STRING; } YY_BREAK case 22: YY_RULE_SETUP #line 93 "frame/saolex.L" { // White Spaces } YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 96 "frame/saolex.L" { // windows line feed return '\n'; } YY_BREAK case 24: YY_RULE_SETUP #line 100 "frame/saolex.L" { // fake line feed return '\n'; } YY_BREAK case 25: /* rule 25 can match eol */ YY_RULE_SETUP #line 104 "frame/saolex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 108 "frame/saolex.L" { // eof return EOF_; } YY_BREAK case 26: YY_RULE_SETUP #line 112 "frame/saolex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 27: YY_RULE_SETUP #line 116 "frame/saolex.L" ECHO; YY_BREAK #line 891 "frame/saolex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; saofree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); saofree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ saorealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) saorealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 101 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 101 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 100); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) saoalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) saoalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) saofree((void *) b->yy_ch_buf ); saofree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)saoalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)saorealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) saoalloc(new_size ); else (yy_start_stack) = (int *) saorealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *saoalloc (yy_size_t size ) { return (void *) malloc( size ); } void *saorealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void saofree (void * ptr ) { free( (char *) ptr ); /* see saorealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 116 "frame/saolex.L" void saoDiscard(int doit) { if (saolexx) saolexx->begin(DISCARD, doit); } void saoFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/saolex.L000644 000765 000000 00000004707 12464230774 016447 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "saoparser.H" extern YYSTYPE* saolval; extern saoFlexLexer* saolexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(saolval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(saolval->str,yytext,ll); saolval->str[ll] = '\0'; return STRING; } annulus {return ANNULUS_;} box {return BOX_;} circle {return CIRCLE_;} debug {return DEBUG_;} ellipse {return ELLIPSE_;} n {return N_;} off {return OFF_;} on {return ON_;} point {return POINT_;} polygon {return POLYGON_;} rotbox {return ROTBOX_;} version {return VERSION_;} [+-]?{D}+ { // Integer saolval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number saolval->real = atof(yytext); return REAL; } \"[^\"\n]*\" | \'[^\'\n]*\' { // Quoted String int ll = (yyleng-2)<(SAOBUFSIZE-1)?(yyleng-2):(SAOBUFSIZE-1); strncpy(saolval->str,yytext+1,ll); // skip the " " saolval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}\n]*\} { // Quoted String int ll = (yyleng-2)<(SAOBUFSIZE-1)?(yyleng-2):(SAOBUFSIZE-1); strncpy(saolval->str,yytext+1,ll); // skip the '{' saolval->str[ll] = '\0'; // Remove the '}' return STRING; } [0-9A-Za-z]+ { // General String int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(saolval->str,yytext,ll); saolval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \\n { // fake line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void saoDiscard(int doit) { if (saolexx) saolexx->begin(DISCARD, doit); } void saoFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/saoparser.C000644 000765 000000 00000162352 12553253032 017132 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse saoparse #define yylex saolex #define yyerror saoerror #define yylval saolval #define yychar saochar #define yydebug saodebug #define yynerrs saonerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, EOF_ = 261, ANNULUS_ = 262, BOX_ = 263, CIRCLE_ = 264, DEBUG_ = 265, ELLIPSE_ = 266, N_ = 267, OFF_ = 268, ON_ = 269, POINT_ = 270, POLYGON_ = 271, ROTBOX_ = 272, VERSION_ = 273 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define EOF_ 261 #define ANNULUS_ 262 #define BOX_ 263 #define CIRCLE_ 264 #define DEBUG_ 265 #define ELLIPSE_ 266 #define N_ 267 #define OFF_ 268 #define ON_ 269 #define POINT_ 270 #define POLYGON_ 271 #define ROTBOX_ 272 #define VERSION_ 273 /* Copy the first part of user declarations. */ #line 10 "frame/saoparser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; saoDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer saoFlexLexer #include extern int saolex(void*, saoFlexLexer*); extern void saoerror(Base*, saoFlexLexer*, const char*); extern void saoDiscard(int); static unsigned short globalProps; static unsigned short localProps; static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static char localComment[80]; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aStatus; static Vector aCenter; static double aAngle; static unsigned short aProps; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 59 "frame/saoparser.Y" { #define SAOBUFSIZE 2048 double real; int integer; char str[SAOBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 197 "frame/saoparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 210 "frame/saoparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 160 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 30 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 31 /* YYNRULES -- Number of rules. */ #define YYNRULES 59 /* YYNRULES -- Number of states. */ #define YYNSTATES 139 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 273 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 28, 2, 29, 2, 2, 27, 2, 22, 23, 2, 25, 21, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 2, 24, 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, 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, 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, 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, 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, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 11, 14, 15, 18, 20, 24, 26, 28, 30, 32, 34, 36, 38, 40, 41, 43, 44, 46, 47, 49, 50, 52, 54, 56, 60, 64, 68, 69, 70, 71, 73, 75, 83, 93, 94, 107, 119, 129, 148, 158, 168, 187, 193, 194, 201, 205, 207, 209, 213, 215, 217, 218, 219, 223, 225, 226 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 31, 0, -1, 46, 32, 56, -1, 32, 33, 34, -1, 33, 34, -1, -1, 10, 36, -1, 18, -1, 47, 48, 49, -1, 57, -1, 19, -1, 20, -1, 6, -1, 4, -1, 3, -1, 14, -1, 13, -1, -1, 21, -1, -1, 22, -1, -1, 23, -1, -1, 41, -1, 35, -1, 35, -1, 35, 37, 35, -1, 12, 24, 3, -1, 35, 37, 35, -1, -1, -1, -1, 25, -1, 26, -1, 9, 38, 45, 37, 42, 39, 59, -1, 7, 38, 45, 37, 42, 37, 42, 39, 59, -1, -1, 7, 38, 45, 37, 42, 37, 42, 37, 50, 54, 39, 59, -1, 7, 38, 45, 37, 42, 37, 42, 37, 44, 39, 59, -1, 11, 38, 45, 37, 43, 37, 40, 39, 59, -1, 11, 38, 45, 37, 43, 37, 40, 39, 27, 28, 11, 38, 45, 37, 43, 37, 40, 39, -1, 8, 38, 45, 37, 43, 37, 40, 39, 59, -1, 17, 38, 45, 37, 43, 37, 40, 39, 59, -1, 8, 38, 45, 37, 43, 37, 40, 39, 27, 28, 8, 38, 45, 37, 43, 37, 40, 39, -1, 15, 38, 45, 39, 59, -1, -1, 16, 51, 38, 52, 39, 59, -1, 52, 37, 53, -1, 53, -1, 45, -1, 54, 37, 55, -1, 55, -1, 42, -1, -1, -1, 29, 58, 5, -1, 56, -1, -1, 29, 60, 5, 56, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 97, 97, 100, 101, 104, 105, 106, 107, 108, 111, 112, 113, 116, 117, 120, 121, 124, 125, 128, 129, 132, 133, 136, 137, 140, 143, 146, 155, 158, 167, 175, 183, 184, 185, 188, 192, 196, 196, 205, 211, 227, 234, 250, 255, 262, 266, 266, 271, 272, 275, 278, 279, 282, 286, 313, 313, 316, 317, 317 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "STRING", "EOF_", "ANNULUS_", "BOX_", "CIRCLE_", "DEBUG_", "ELLIPSE_", "N_", "OFF_", "ON_", "POINT_", "POLYGON_", "ROTBOX_", "VERSION_", "'\\n'", "';'", "','", "'('", "')'", "'='", "'+'", "'-'", "'&'", "'!'", "'#'", "$accept", "start", "commands", "command", "terminator", "numeric", "debug", "sp", "bp", "ep", "optangle", "angle", "value", "vvalue", "numberof", "coord", "initGlobal", "initLocal", "include", "shape", "@1", "@2", "polyNodes", "polyNode", "aRads", "aRad", "processAnnulus", "generalComment", "@3", "shapeComment", "@4", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 10, 59, 44, 40, 41, 61, 43, 45, 38, 33, 35 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 30, 31, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 48, 49, 49, 50, 49, 49, 49, 49, 49, 49, 49, 49, 51, 49, 52, 52, 53, 54, 54, 55, 56, 58, 57, 59, 60, 59 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 3, 2, 0, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 3, 3, 3, 0, 0, 0, 1, 1, 7, 9, 0, 12, 11, 9, 18, 9, 9, 18, 5, 0, 6, 3, 1, 1, 3, 1, 1, 0, 0, 3, 1, 0, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 30, 0, 31, 1, 0, 7, 55, 31, 0, 32, 9, 16, 15, 6, 0, 0, 2, 12, 10, 11, 4, 33, 34, 0, 56, 3, 19, 19, 19, 19, 19, 46, 19, 8, 20, 0, 0, 0, 0, 0, 19, 0, 14, 13, 17, 17, 17, 17, 17, 21, 0, 17, 18, 0, 0, 0, 0, 0, 22, 54, 50, 21, 49, 0, 29, 26, 17, 17, 17, 21, 17, 58, 57, 45, 0, 54, 17, 0, 0, 23, 54, 23, 0, 48, 47, 23, 21, 27, 25, 21, 24, 35, 21, 54, 21, 37, 54, 54, 54, 59, 54, 0, 21, 0, 36, 0, 42, 0, 40, 43, 0, 54, 53, 21, 52, 0, 0, 28, 39, 0, 54, 19, 19, 51, 38, 0, 0, 17, 17, 0, 0, 17, 17, 23, 23, 21, 21, 44, 41 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 1, 7, 8, 20, 44, 13, 53, 35, 59, 89, 90, 112, 68, 102, 60, 2, 9, 23, 33, 103, 40, 61, 62, 113, 114, 72, 10, 14, 73, 82 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -71 static const yytype_int16 yypact[] = { -71, 21, 119, -71, 11, -71, -71, 116, 16, 31, -71, -71, -71, -71, 22, 16, -71, -71, -71, -71, -71, -71, -71, 135, -71, -71, 9, 9, 9, 9, 9, -71, 9, -71, -71, 69, 69, 69, 69, 69, 9, 69, -71, -71, 20, 20, 20, 20, 20, 26, 69, 20, -71, 69, 69, 69, 69, 69, -71, 33, -71, 56, -71, 69, -71, -71, 20, 20, 20, 26, 20, -71, -71, -71, 69, 33, 20, 69, 69, 69, 33, 69, 61, -71, -71, 69, 137, -71, -71, 26, -71, -71, 26, -71, 26, 58, 33, -1, 3, -71, 33, 52, 26, 69, -71, 50, -71, 53, -71, -71, 79, 33, -71, 56, -71, 75, 73, -71, -71, 69, 33, 9, 9, -71, -71, 69, 69, 20, 20, 69, 69, 20, 20, 69, 69, 26, 26, -71, -71 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -71, -71, -71, 80, 71, -10, -71, -28, -27, 19, -70, -71, -40, -2, -71, -29, -71, -71, -71, -71, -71, -71, -71, 15, -71, -21, -3, -71, -71, -46, -71 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -55 static const yytype_int16 yytable[] = { 36, 37, 38, 39, 16, 41, 45, 46, 47, 48, 49, 92, 51, 50, 66, 94, 69, 54, 55, 56, 57, 3, 17, 63, 11, 12, 105, 24, 71, 84, 107, 34, 71, 74, 91, 18, 19, 86, 77, 78, 79, 52, 81, 64, 65, 67, 65, 67, 85, 58, 104, 106, 108, 67, 109, 70, 21, 22, 95, -17, -17, 76, 71, 135, 136, 118, 93, 65, 87, 88, 101, 88, 42, 43, 124, 88, 110, 52, 115, 58, 75, 116, 117, 121, 122, 119, 25, 15, 80, 83, 99, 0, 0, 65, 125, 126, 127, 128, 123, 129, 130, 0, 0, 133, 134, 96, 0, 0, 97, 65, 0, 98, 0, 100, 0, 0, -54, 0, 0, 67, 67, 111, -5, 88, 88, -5, 4, 131, 132, 4, 0, 0, 120, 0, 5, -5, -5, 5, -5, -5, -17, -17, 26, 27, 28, 6, 29, 0, 6, -17, 30, 31, 32, 0, 137, 138, 0, 0, 52, 0, 58 }; static const yytype_int16 yycheck[] = { 27, 28, 29, 30, 7, 32, 35, 36, 37, 38, 39, 81, 41, 40, 54, 85, 56, 45, 46, 47, 48, 0, 6, 51, 13, 14, 27, 5, 29, 75, 27, 22, 29, 61, 80, 19, 20, 77, 66, 67, 68, 21, 70, 53, 54, 55, 56, 57, 76, 23, 96, 97, 98, 63, 100, 57, 25, 26, 86, 3, 4, 63, 29, 133, 134, 111, 5, 77, 78, 79, 12, 81, 3, 4, 120, 85, 24, 21, 28, 23, 61, 28, 3, 8, 11, 113, 15, 7, 69, 74, 93, -1, -1, 103, 121, 122, 125, 126, 119, 127, 128, -1, -1, 131, 132, 86, -1, -1, 89, 119, -1, 92, -1, 94, -1, -1, 0, -1, -1, 129, 130, 102, 6, 133, 134, 6, 10, 129, 130, 10, -1, -1, 113, -1, 18, 19, 20, 18, 19, 20, 3, 4, 7, 8, 9, 29, 11, -1, 29, 12, 15, 16, 17, -1, 135, 136, -1, -1, 21, -1, 23 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 31, 46, 0, 10, 18, 29, 32, 33, 47, 57, 13, 14, 36, 58, 33, 56, 6, 19, 20, 34, 25, 26, 48, 5, 34, 7, 8, 9, 11, 15, 16, 17, 49, 22, 38, 38, 38, 38, 38, 51, 38, 3, 4, 35, 45, 45, 45, 45, 45, 38, 45, 21, 37, 37, 37, 37, 37, 23, 39, 45, 52, 53, 37, 35, 35, 42, 35, 43, 42, 43, 29, 56, 59, 37, 39, 43, 37, 37, 37, 39, 37, 60, 53, 59, 37, 42, 35, 35, 40, 41, 59, 40, 5, 40, 37, 39, 39, 39, 56, 39, 12, 44, 50, 59, 27, 59, 27, 59, 59, 24, 39, 42, 54, 55, 28, 28, 3, 59, 37, 39, 8, 11, 55, 59, 38, 38, 45, 45, 37, 37, 43, 43, 37, 37, 40, 40, 39, 39 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, saoFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; saoFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, saoFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; saoFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, saoFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; saoFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, saoFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; saoFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, saoFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, saoFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; saoFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 7: #line 106 "frame/saoparser.Y" {cerr << "SAOimage" << endl;;} break; case 12: #line 113 "frame/saoparser.Y" {YYACCEPT;;} break; case 13: #line 116 "frame/saoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 14: #line 117 "frame/saoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 15: #line 120 "frame/saoparser.Y" {yydebug=1;;} break; case 16: #line 121 "frame/saoparser.Y" {yydebug=0;;} break; case 23: #line 136 "frame/saoparser.Y" {(yyval.real) = 0;;} break; case 24: #line 137 "frame/saoparser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 25: #line 140 "frame/saoparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 26: #line 143 "frame/saoparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real), Coord::IMAGE);;} break; case 27: #line 147 "frame/saoparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 28: #line 155 "frame/saoparser.Y" {(yyval.integer) = (yyvsp[(3) - (3)].integer);;} break; case 29: #line 159 "frame/saoparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 30: #line 167 "frame/saoparser.Y" { globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; ;} break; case 31: #line 175 "frame/saoparser.Y" { // reset maperr flag maperr =0; localProps = globalProps; ;} break; case 32: #line 183 "frame/saoparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 33: #line 184 "frame/saoparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 34: #line 185 "frame/saoparser.Y" {setProps(&localProps, Marker::INCLUDE, 0);;} break; case 35: #line 189 "frame/saoparser.Y" {fr->createCircleCmd(Vector((yyvsp[(3) - (7)].vector)), (yyvsp[(5) - (7)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 36: #line 193 "frame/saoparser.Y" {fr->createAnnulusCmd(Vector((yyvsp[(3) - (9)].vector)), (yyvsp[(5) - (9)].real),(yyvsp[(7) - (9)].real),1, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 37: #line 196 "frame/saoparser.Y" {aNum=2;;} break; case 38: #line 198 "frame/saoparser.Y" { aAnnuli[0] = (yyvsp[(5) - (12)].real); aAnnuli[1] = (yyvsp[(7) - (12)].real); fr->createAnnulusCmd(Vector((yyvsp[(3) - (12)].vector)), aNum,aAnnuli, color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 39: #line 206 "frame/saoparser.Y" {fr->createAnnulusCmd(Vector((yyvsp[(3) - (11)].vector)), (yyvsp[(5) - (11)].real),(yyvsp[(7) - (11)].real),(yyvsp[(9) - (11)].integer), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 40: #line 212 "frame/saoparser.Y" { // for ellipse annulus aStatus = 1; aCenter = Vector((yyvsp[(3) - (9)].vector)); aAngle = (yyvsp[(7) - (9)].real); aVector[0] = Vector((yyvsp[(5) - (9)].vector)); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 41: #line 229 "frame/saoparser.Y" { aStatus = 2; aVector[aNum++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 42: #line 235 "frame/saoparser.Y" { // for box annulus aStatus = 3; aCenter = Vector((yyvsp[(3) - (9)].vector)); aAngle = (yyvsp[(7) - (9)].real); aVector[0] = Vector((yyvsp[(5) - (9)].vector)); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist); ;} break; case 43: #line 251 "frame/saoparser.Y" {fr->createBoxCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 44: #line 257 "frame/saoparser.Y" { aStatus = 4; aVector[aNum++] = Vector((yyvsp[(5) - (18)].vector)); ;} break; case 45: #line 263 "frame/saoparser.Y" {fr->createPointCmd(Vector((yyvsp[(3) - (5)].vector)), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 46: #line 266 "frame/saoparser.Y" {polylist.deleteAll();;} break; case 47: #line 267 "frame/saoparser.Y" {fr->createPolygonCmd(polylist, color,dash,1,font,text,localProps,localComment,taglist,cblist);;} break; case 50: #line 275 "frame/saoparser.Y" {polylist.append(new Vertex((yyvsp[(1) - (1)].vector)));;} break; case 53: #line 282 "frame/saoparser.Y" {aAnnuli[aNum++] = (yyvsp[(1) - (1)].real);;} break; case 54: #line 286 "frame/saoparser.Y" { switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; } aStatus = 0; ;} break; case 55: #line 313 "frame/saoparser.Y" {DISCARD_(1);;} break; case 58: #line 317 "frame/saoparser.Y" {DISCARD_(0);;} break; case 59: #line 318 "frame/saoparser.Y" {strncpy(localComment,(yyvsp[(3) - (4)].str),80);;} break; /* Line 1267 of yacc.c. */ #line 1813 "frame/saoparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 321 "frame/saoparser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/saoparser.H000644 000765 000000 00000005416 12553253032 017134 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, EOF_ = 261, ANNULUS_ = 262, BOX_ = 263, CIRCLE_ = 264, DEBUG_ = 265, ELLIPSE_ = 266, N_ = 267, OFF_ = 268, ON_ = 269, POINT_ = 270, POLYGON_ = 271, ROTBOX_ = 272, VERSION_ = 273 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define EOF_ 261 #define ANNULUS_ 262 #define BOX_ 263 #define CIRCLE_ 264 #define DEBUG_ 265 #define ELLIPSE_ 266 #define N_ 267 #define OFF_ 268 #define ON_ 269 #define POINT_ 270 #define POLYGON_ 271 #define ROTBOX_ 272 #define VERSION_ 273 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 59 "frame/saoparser.Y" { #define SAOBUFSIZE 2048 double real; int integer; char str[SAOBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 93 "frame/saoparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/saoparser.Y000644 000765 000000 00000015404 12537605764 017172 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {saoFlexLexer* ll} %parse-param {saoFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; saoDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer saoFlexLexer #include extern int saolex(void*, saoFlexLexer*); extern void saoerror(Base*, saoFlexLexer*, const char*); extern void saoDiscard(int); static unsigned short globalProps; static unsigned short localProps; static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static char localComment[80]; static List polylist; static List taglist; static List cblist; static double aAnnuli[MAXANNULI]; static Vector aVector[MAXANNULI]; static int aNum; static int aStatus; static Vector aCenter; static double aAngle; static unsigned short aProps; static char aComment[80]; static void setProps(unsigned short* props, unsigned short prop, int value); %} %union { #define SAOBUFSIZE 2048 double real; int integer; char str[SAOBUFSIZE]; double vector[3]; } %type numeric %type angle %type optangle %type value %type vvalue %type coord %type numberof %token INT %token REAL %token STRING %token EOF_ %token ANNULUS_ %token BOX_ %token CIRCLE_ %token DEBUG_ %token ELLIPSE_ %token N_ %token OFF_ %token ON_ %token POINT_ %token POLYGON_ %token ROTBOX_ %token VERSION_ %% start : initGlobal commands processAnnulus ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "SAOimage" << endl;} | initLocal include shape | generalComment ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; sp : /* empty */ | ',' ; bp : /* empty */ | '(' ; ep : /* emtpy */ | ')' ; optangle: /* empty */ {$$ = 0;} | angle {$$ = $1;} ; angle : numeric {$$ = degToRad($1);} /* assume degree */ ; value : numeric {$$ = FITSPTR->mapLenToRef($1, Coord::IMAGE);} ; vvalue : numeric sp numeric { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; numberof: N_ '=' INT {$$ = $3;} ; coord : numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; initGlobal:{ globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; } ; initLocal : { // reset maperr flag maperr =0; localProps = globalProps; } ; include : /* empty */ {setProps(&localProps, Marker::INCLUDE, 1);} | '+' {setProps(&localProps, Marker::INCLUDE, 1);} | '-' {setProps(&localProps, Marker::INCLUDE, 0);} ; shape : CIRCLE_ bp coord sp value ep shapeComment {fr->createCircleCmd(Vector($3), $5, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ANNULUS_ bp coord sp value sp value ep shapeComment {fr->createAnnulusCmd(Vector($3), $5,$7,1, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ANNULUS_ bp coord sp value sp value sp {aNum=2;} aRads ep shapeComment { aAnnuli[0] = $5; aAnnuli[1] = $7; fr->createAnnulusCmd(Vector($3), aNum,aAnnuli, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ANNULUS_ bp coord sp value sp value sp numberof ep shapeComment {fr->createAnnulusCmd(Vector($3), $5,$7,$9, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | ELLIPSE_ bp coord sp vvalue sp optangle ep shapeComment { // for ellipse annulus aStatus = 1; aCenter = Vector($3); aAngle = $7; aVector[0] = Vector($5); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createEllipseCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ELLIPSE_ bp coord sp vvalue sp optangle ep '&' '!' ELLIPSE_ bp coord sp vvalue sp optangle ep { aStatus = 2; aVector[aNum++] = Vector($5); } | BOX_ bp coord sp vvalue sp optangle ep shapeComment { // for box annulus aStatus = 3; aCenter = Vector($3); aAngle = $7; aVector[0] = Vector($5); aNum = 1; strncpy(aComment,localComment,80); aProps = localProps; fr->createBoxCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist); } | ROTBOX_ bp coord sp vvalue sp optangle ep shapeComment {fr->createBoxCmd(Vector($3), Vector($5), $7, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | BOX_ bp coord sp vvalue sp optangle ep '&' '!' BOX_ bp coord sp vvalue sp optangle ep { aStatus = 4; aVector[aNum++] = Vector($5); } | POINT_ bp coord ep shapeComment {fr->createPointCmd(Vector($3), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text,localProps,localComment,taglist,cblist);} | POLYGON_ {polylist.deleteAll();} bp polyNodes ep shapeComment {fr->createPolygonCmd(polylist, color,dash,1,font,text,localProps,localComment,taglist,cblist);} ; polyNodes : polyNodes sp polyNode | polyNode ; polyNode : coord {polylist.append(new Vertex($1));} ; aRads : aRads sp aRad | aRad ; aRad : value {aAnnuli[aNum++] = $1;} ; processAnnulus : /* empty */ { switch (aStatus) { case 0: // do nothing break; case 1: // we found just an ellipse, do nothing break; case 2: // ok we have an ellipse annulus fr->markerDeleteLastCmd(); // delete the previous ellipse fr->createEllipseAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; case 3: // we found just a box, do nothing break; case 4: // ok, we have a box annulus fr->markerDeleteLastCmd(); // delete the previous box fr->createBoxAnnulusCmd(aCenter, aNum,aVector, aAngle, color,dash,1,font,text,aProps,aComment,taglist,cblist); break; } aStatus = 0; } ; generalComment : '#' {DISCARD_(1);} STRING ; shapeComment : /* empty */ processAnnulus | '#' {DISCARD_(0);} STRING processAnnulus {strncpy(localComment,$3,80);} ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } saods9/tksao1.0/frame/segment.C000644 000765 000000 00000022543 12544546070 016601 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "segment.h" #include "fitsimage.h" Segment::Segment(const Segment& a) : Marker(a) { vertex = a.vertex; } Segment::Segment(Base* p, const Vector& ctr, const Vector& b, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ctr, 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { angle = 0; strcpy(type_, "segment"); Vector bb = b; vertex.append(new Vertex(-bb[0],-bb[1])); vertex.append(new Vertex( bb[0], bb[1])); updateBBox(); } Segment::Segment(Base* p, const List& v, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, Vector(0,0), 0, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { // Vertex list is in ref coords angle = 0; strcpy(type_, "segment"); vertex = v; // find center center = Vector(0,0); vertex.head(); do center += vertex.current()->vector; while (vertex.next()); center /= vertex.count(); // vertices are relative vertex.head(); do vertex.current()->vector *= Translate(-center) * FlipY(); // no rotation while (vertex.next()); updateBBox(); } void Segment::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { GC lgc = renderXGC(mode); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,sys); vertex.next(); do { v1 = v2; v2 = fwdMap(vertex.current()->vector,sys); XDrawLine(display, drawable, lgc, v1[0], v1[1], v2[0], v2[1]); } while (vertex.next()); } void Segment::renderPS(int mode) { renderPSGC(mode); vertex.head(); int first = 1; do { ostringstream str; Vector v = fwdMap(vertex.current()->vector,Coord::CANVAS); if (first) { str << "newpath " << endl << v.TkCanvasPs(parent->canvas) << " moveto" << endl << ends; first = 0; } else str << v.TkCanvasPs(parent->canvas) << " lineto" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } while (vertex.next()); ostringstream str; str << "stroke" << endl << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } #ifdef MAC_OSX_TK void Segment::renderMACOSX() { renderMACOSXGC(); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); vertex.next(); do { v1 = v2; v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); macosxDrawLine(v1,v2); } while (vertex.next()); } #endif #ifdef __WIN32 void Segment::renderWIN32() { renderWIN32GC(); vertex.head(); Vector v1; Vector v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); vertex.next(); do { v1 = v2; v2 = fwdMap(vertex.current()->vector,Coord::CANVAS); win32DrawLine(v1,v2); } while (vertex.next()); } #endif // Support void Segment::updateHandles() { // generate handles numHandle = 4 + vertex.count(); if (handle) delete [] handle; handle = new Vector[numHandle]; // the first four are our control handles BBox bb; vertex.head(); do bb.bound(vertex.current()->vector); while (vertex.next()); Vector zz = parent->zoom(); float r = 10/zz.length(); bb.expand(r); // give us more room handle[0] = fwdMap(bb.ll,Coord::CANVAS); handle[1] = fwdMap(bb.lr(),Coord::CANVAS); handle[2] = fwdMap(bb.ur,Coord::CANVAS); handle[3] = fwdMap(bb.ul(),Coord::CANVAS); // and the rest are vertices int i=4; vertex.head(); do handle[i++] = fwdMap(vertex.current()->vector,Coord::CANVAS); while (vertex.next()); } void Segment::updateCoords(const Matrix& mx) { Scale s(mx); vertex.head(); do vertex.current()->vector *= s; while (vertex.next()); Marker::updateCoords(mx); } void Segment::edit(const Vector& v, int h) { if (h < 5) { Vector s1 = v * bckMatrix(); Vector s2 = bckMap(handle[h-1],Coord::CANVAS); if (s1[0] != 0 && s1[1] != 0 && s2[0] != 0 && s2[1] != 0) { double a = fabs(s1[0]/s2[0]); double b = fabs(s1[1]/s2[1]); double s = a > b ? a : b; vertex.head(); do vertex.current()->vector *= Scale(s); while (vertex.next()); } updateBBox(); doCallBack(CallBack::EDITCB); } else { moveVertex(v,h); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } void Segment::rotate(const Vector& v, int h) { if (h < 5) Marker::rotate(v,h); else { // we need to check this here, because we are really rotating if (canEdit()) { moveVertex(v,h); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } } void Segment::reset(const Vector& b) { angle = 0; vertex.deleteAll(); Vector bb = b; vertex.append(new Vertex(-bb[0],-bb[1])); vertex.append(new Vertex( bb[0], bb[1])); updateBBox(); } void Segment::createVertex(int which, const Vector& v) { // which segment (1 to n) // v is in ref coords Matrix mm = bckMatrix(); int seg = which-1; if (seg>=0 && seg4) { int hh = h-4-1; if (vertex.count() > 2) { Vertex* v = vertex[hh]; if (v) { vertex.extractNext(v); delete v; recalcCenter(); updateBBox(); doCallBack(CallBack::EDITCB); doCallBack(CallBack::MOVECB); // center can change } } } } int Segment::getSegment(const Vector& v) { // v is in canvas coords Matrix mm = fwdMatrix(); vertex.head(); Vector v1; Vector v2 = vertex.current()->vector * mm; vertex.next(); int ii = 1; do { v1 = v2; v2 = vertex.current()->vector * mm; Vector l1 = parent->mapFromRef(v1,Coord::CANVAS); Vector l2 = parent->mapFromRef(v2,Coord::CANVAS); double a = (l2-l1).angle(); Matrix mx = Translate(-l1) * FlipY() * Rotate(-a); Vector end = l2*mx; Vector vv = v*mx; if (vv[0]>0 && vv[0]-parent->markerEpsilon && vv[1]markerEpsilon) return ii; ii++; } while (vertex.next()); return 0; } void Segment::moveVertex(const Vector& v, int h) { Matrix mm = bckMatrix(); if (vertex[h-5]) vertex.current()->vector = v * mm; recalcCenter(); } void Segment::recalcCenter() { // recalculate center Vector nc; vertex.head(); do nc += vertex.current()->vector * Rotate(angle) * FlipY(); while (vertex.next()); nc /= vertex.count(); center += nc; // update all vertices vertex.head(); do vertex.current()->vector -= nc * FlipY() * Rotate(-angle); while (vertex.next()); } // list void Segment::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); Matrix mm = fwdMatrix(); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys,sky); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra[16]; char dec[16]; str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; ptr->mapFromRef(vertex.current()->vector*mm,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << ra << ',' << dec; } while (vertex.next()); str << ')'; } break; } } else { str << type_ << '('; int first=1; vertex.head(); do { if (!first) str << ','; first=0; Vector v = ptr->mapFromRef(vertex.current()->vector*mm,sys); str << setprecision(8) << v[0] << ',' << v[1]; } while (vertex.next()); str << ')'; } } } if (conj) str << " ||"; listProperties(str, 0); } } void Segment::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); Matrix mm = fwdMatrix(); Vector* vv = new Vector[vertex.count()]; XMLRowInit(); XMLRow(XMLSHAPE,type_); vertex.head(); int cnt =0; do vv[cnt++] =vertex.current()->vector*mm; while (vertex.next()); XMLRowPoint(ptr,sys,sky,format,vv,vertex.count()); delete [] vv; XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/segment.h000644 000765 000000 00000002766 12544546070 016653 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __segment_h__ #define __segment_h__ #include "marker.h" #include "list.h" class Segment : public Marker { protected: List vertex; void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderPS(int); #ifdef MAC_OSX_TK void renderMACOSX(); #endif #ifdef __WIN32 void renderWIN32(); #endif void updateHandles(); void moveVertex(const Vector&, int); void recalcCenter(); public: Segment(const Segment&); Segment(Base* p, const Vector& ctr, const Vector& b, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Segment(Base* p, const List& v, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); virtual Marker* dup() {return new Segment(*this);} void updateCoords(const Matrix&); void edit(const Vector&, int); void rotate(const Vector&, int); void createVertex(int, const Vector&); void deleteVertex(int); int getSegment(const Vector&); void reset(const Vector&); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); }; #endif saods9/tksao1.0/frame/sigbus.h000644 000765 000000 00000002070 12544546070 016471 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __sigbus_h__ #define __sigbus_h__ #ifdef __WIN32 #define INTERP #define SETSIGBUS #define CLEARSIGBUS #else // Signal Support #include #include static sigjmp_buf crashbuf; static struct sigaction sigact, osigbus, osigsegv; static void crashHandler(int dummy) { siglongjmp(crashbuf, 1); } #define INTERP interp #define SETSIGBUS \ if (sigsetjmp(crashbuf, 1)) { \ Tcl_SetVar2(INTERP, "ds9", "msg", "A SIGBUS or SIGSEGV error has been received.", TCL_GLOBAL_ONLY); \ Tcl_SetVar2(INTERP, "ds9", "msg,level", "error", TCL_GLOBAL_ONLY); \ } \ else { \ sigact.sa_handler = crashHandler; \ sigemptyset(&sigact.sa_mask); \ sigact.sa_flags = 0; \ sigaction(SIGSEGV, &sigact, &osigsegv); \ sigaction(SIGBUS, &sigact, &osigbus); #define CLEARSIGBUS \ } \ sigaction(SIGSEGV, &osigsegv, NULL); \ sigaction(SIGBUS, &osigbus, NULL); #endif #endif saods9/tksao1.0/frame/tag.C000644 000765 000000 00000001010 12464214757 015701 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "tag.h" #include "util.h" Tag::Tag(const Tag& t) { tag_ = dupstr(t.tag_); } Tag::Tag(const char* t) { tag_ = dupstr(t); } Tag& Tag::operator=(const Tag& t) { tag_ = dupstr(t.tag_); return *this; } Tag::~Tag() { if (tag_) delete [] tag_; } void Tag::set(const char* t) { if (tag_) delete tag_; tag_ = dupstr(t); } saods9/tksao1.0/frame/tag.h000644 000765 000000 00000001215 12464214757 015755 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __tag_h__ #define __tag_h__ #include #include #include using namespace std; class Tag { char* tag_; Tag* previous_; Tag* next_; public: Tag(const char*); Tag(const Tag&); Tag& operator=(const Tag&); ~Tag(); const char* tag() {return tag_;} void set(const char*); Tag* previous() {return previous_;} void setPrevious(Tag* t) {previous_ = t;} Tag* next() {return next_;} void setNext(Tag* t) {next_ = t;} }; #endif saods9/tksao1.0/frame/text.C000644 000765 000000 00000017742 12544546070 016130 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "text.h" #include "fitsimage.h" EXTERN void TkDrawAngledChars(Display *display, Drawable drawable, GC gc, Tk_Font tkfont, const char *source, int numBytes, double x, double y, double angle); Text::Text(const Text& a) : Marker(a) { rotate = a.rotate; } Text::Text(Base* p, const Vector& ctr, double ang, int rot, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Marker(p, ctr, ang, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { strcpy(type_,"text"); handle = new Vector[4]; numHandle = 4; rotate = rot; updateBBox(); } void Text::renderX(Drawable drawable, Coord::InternalSystem sys, RenderMode mode) { if (text && *text && tkfont_) { GC lgc = renderXGC(mode); XSetFont(display, lgc, Tk_FontId(tkfont_)); // origin is center of text Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); int width = Tk_TextWidth(tkfont_, text, strlen(text)); int delta = (metrics.ascent-metrics.descent)/2.; double ang = rotate ? calcAngle() : 0; Vector cc = parent->mapFromRef(center,sys); Matrix mm = Translate(-cc) * Translate(-width/2., delta) * Rotate(ang) * Translate(cc); Vector vv = cc * mm; TkDrawAngledChars(display, drawable, lgc, tkfont_, text, strlen(text), vv[0], vv[1], radToDeg(ang)); } } void Text::renderPS(int mode) { renderPSGC(mode); if (text && *text && psfont_) { ostringstream str; const char* ff = Tk_NameOfFont(psfont_); str << '/' << psFontName(ff) << " findfont " << int(psFontSize(ff)*parent->getDisplayRatio()) << " scalefont setfont" << endl; double ang = rotate ? calcAngle() : 0; Vector cc = (parent->mapFromRef(center,Coord::CANVAS)).TkCanvasPs(parent->canvas); str << "gsave" << endl << "newpath " << endl << cc << " moveto" << endl << '(' << psQuote(text) << ')' << endl << "dup true charpath pathbbox " << endl << "closepath " << endl << "3 -1 roll sub 3.6 div neg " << endl << "3 1 roll sub 2 div exch " << endl << cc << " moveto " << endl << radToDeg(ang) << " rotate " << endl << " rmoveto show" << endl << "grestore" << endl; str << ends; Tcl_AppendResult(parent->interp, str.str().c_str(), NULL); } } #ifdef MAC_OSX_TK void Text::renderMACOSX() { renderMACOSXGC(); if (text && *text && psfont_) { Tcl_DString psdstr; Tcl_DStringInit(&psdstr); int psSize = Tk_PostscriptFontName(psfont_, &psdstr); macosxFont(Tcl_DStringValue(&psdstr), psSize); Tcl_DStringFree(&psdstr); Tk_FontMetrics metrics; Tk_GetFontMetrics(psfont_, &metrics); int width = Tk_TextWidth(psfont_, text, strlen(text)); double ang = rotate ? calcAngle() : 0; Vector cc = parent->mapFromRef(center,Coord::CANVAS); Matrix mm = Translate(-cc) * Translate(-width/2.,metrics.descent) * Rotate(ang) * Translate(cc); macosxDrawText(cc*mm, 0, text); } } #endif #ifdef __WIN32 void Text::renderWIN32() { renderWIN32GC(); if (text && *text && tkfont_) { win32Font(tkfont_); Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); int width = Tk_TextWidth(tkfont_, text, strlen(text)); int delta = (metrics.ascent-metrics.descent)/2.; double ang = rotate ? calcAngle() : 0; Vector cc = parent->mapFromRef(center,Coord::CANVAS); Matrix mm = Translate(-cc) * Translate(-width/2., delta) * Rotate(ang) * Translate(cc); Vector vv = cc * mm; win32DrawText(vv, 0, text); } } #endif // Support void Text::updateHandles() { Vector cc = parent->mapFromRef(center,Coord::CANVAS); if (text && *text && tkfont_) { Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); int width = Tk_TextWidth(tkfont_, text, strlen(text)); Vector s(width, metrics.linespace); double ang = rotate ? calcAngle() : 0; Matrix mm = Rotate(ang) * Translate(cc); handle[0] = Vector(-s[0],-s[1])/2 * mm; handle[1] = Vector( s[0],-s[1])/2 * mm; handle[2] = Vector( s[0], s[1])/2 * mm; handle[3] = Vector(-s[0], s[1])/2 * mm; } else { Vector s(10,10); Matrix mm = Translate(cc); handle[0] = Vector(-s[0],-s[1])/2 * mm; handle[1] = Vector( s[0],-s[1])/2 * mm; handle[2] = Vector( s[0], s[1])/2 * mm; handle[3] = Vector(-s[0], s[1])/2 * mm; } } void Text::calcAllBBox() { allBBox = bbox; } int Text::isIn(const Vector& vv) { if (text && *text && tkfont_) { // origin is center of text Tk_FontMetrics metrics; Tk_GetFontMetrics(tkfont_, &metrics); float ww = Tk_TextWidth(tkfont_, text, strlen(text))/2./parent->zoom_[0]; float hh = metrics.linespace/2./parent->zoom_[1]; Vector pp = bckMap(vv,Coord::CANVAS); if (pp[0]<-ww || pp[0]>ww || pp[1]<-hh || pp[1]>hh) return 0; else return 1; } else return 0; } void Text::setRotate(int rot) { rotate = rot ? 1 : 0; updateBBox(); } // list void Text::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ')'; } break; } } else { Vector v = ptr->mapFromRef(center,sys); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ')'; } } } if (conj) str << " ||"; if (angle != 0) str << " textangle=" << radToDeg(parent->mapAngleFromRef(angle,sys,sky)); if (!rotate) str << " textrotate=" << 0; listProperties(str, 0); } } void Text::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowCenter(ptr,sys,sky,format); XMLRowAng(sys,sky); XMLRow(XMLPARAM,rotate); XMLRowProps(ptr,sys); XMLRowEnd(str); } void Text::listSAOtng(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int strip) { FitsImage* ptr = parent->findFits(); if (properties&INCLUDE) str << '+'; else str << '-'; switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v = ptr->mapFromRef(center,Coord::IMAGE); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] << ", \"" << text << "\")"; } break; default: if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v = ptr->mapFromRef(center,sys,sky); str << type_ << '(' << setprecision(8) << v[0] << ',' << v[1] <<", \"" << text << "\")"; } break; case Coord::SEXAGESIMAL: { char buf[64]; ptr->mapFromRef(center,sys,sky,format,buf,64); char ra[16]; char dec[16]; string x(buf); istringstream wcs(x); wcs >> ra >> dec; str << type_ << '(' << ra << ',' << dec << ", \"" << text << "\")"; } break; } } } listSAOtngPost(str, strip); } saods9/tksao1.0/frame/text.h000644 000765 000000 00000003071 12544546070 016163 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __text_h__ #define __text_h__ #include "marker.h" class Text : public Marker { private: int rotate; private: void renderX(Drawable, Coord::InternalSystem, RenderMode); void renderXText(Drawable, Coord::InternalSystem, RenderMode) {} void renderXInclude(Drawable, Coord::InternalSystem, RenderMode) {} void renderPS(int); void renderPSText(int) {} void renderPSInclude(int) {} #ifdef MAC_OSX_TK void renderMACOSX(); void renderMACOSXText() {} void renderMACOSXInclude() {} #endif #ifdef __WIN32 void renderWIN32(); void renderWIN32Text() {} void renderWIN32Include() {} #endif void updateHandles(); void calcAllBBox(); public: Text(const Text&); Text(Base* p, const Vector& ctr, double a, int r, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Marker* dup() {return new Text(*this);} int isIn(const Vector&); void editBegin(int) {} void edit(const Vector& v, int h) {} void editEnd() {} void setRotate(int); int getRotate() {return rotate;} void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int); }; #endif saods9/tksao1.0/frame/tnglex.C000644 000765 000000 00000201270 12553253032 016425 0ustar00joyewheel000000 000000 #line 2 "frame/tnglex.C" #line 4 "frame/tnglex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer tngFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *tngalloc (yy_size_t ); void *tngrealloc (void *,yy_size_t ); void tngfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 57 #define YY_END_OF_BUFFER 58 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[250] = { 0, 0, 0, 2, 2, 58, 56, 52, 55, 56, 56, 56, 56, 56, 41, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 56, 56, 2, 1, 52, 53, 0, 48, 0, 49, 0, 41, 43, 42, 41, 0, 51, 44, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 29, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 54, 0, 50, 2, 44, 0, 45, 0, 0, 0, 42, 51, 51, 51, 51, 5, 51, 51, 51, 51, 51, 51, 51, 51, 16, 18, 51, 51, 51, 51, 23, 51, 51, 51, 51, 28, 51, 51, 51, 51, 34, 51, 51, 51, 51, 51, 51, 42, 0, 43, 0, 51, 51, 51, 7, 51, 9, 10, 51, 51, 51, 51, 51, 0, 51, 51, 51, 51, 24, 51, 26, 51, 51, 51, 51, 51, 51, 51, 37, 51, 51, 51, 0, 46, 3, 51, 6, 51, 11, 51, 51, 51, 51, 0, 51, 51, 21, 51, 25, 51, 51, 51, 32, 51, 51, 51, 51, 39, 51, 47, 46, 51, 8, 51, 51, 51, 51, 0, 19, 51, 51, 51, 51, 31, 51, 35, 51, 51, 40, 51, 12, 51, 13, 51, 0, 51, 51, 27, 51, 33, 51, 38, 51, 14, 15, 17, 20, 51, 30, 51, 51, 51, 51, 4, 51, 51, 51, 51, 51, 51, 22, 36, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 5, 1, 1, 1, 1, 6, 1, 1, 1, 7, 1, 8, 9, 1, 10, 11, 12, 13, 14, 15, 13, 13, 13, 16, 17, 1, 1, 1, 1, 1, 1, 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, 34, 1, 43, 1, 1, 1, 1, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 34, 60, 61, 62, 63, 64, 65, 66, 67, 34, 68, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[70] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 3, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1 } ; static yyconst flex_int16_t yy_base[257] = { 0, 0, 0, 210, 208, 195, 1179, 187, 1179, 164, 155, 133, 61, 68, 76, 85, 90, 86, 87, 97, 104, 124, 148, 120, 137, 138, 154, 152, 168, 164, 165, 170, 193, 182, 199, 87, 58, 0, 1179, 118, 1179, 111, 1179, 109, 1179, 224, 239, 184, 221, 279, 260, 171, 205, 321, 208, 293, 302, 300, 248, 298, 288, 334, 249, 289, 338, 345, 339, 340, 354, 361, 364, 363, 377, 374, 368, 380, 250, 379, 392, 398, 405, 402, 395, 421, 425, 430, 426, 1179, 42, 1179, 0, 1179, 456, 1179, 481, 463, 488, 496, 442, 505, 506, 507, 268, 508, 510, 521, 522, 523, 525, 527, 528, 428, 305, 540, 547, 564, 554, 432, 557, 578, 575, 581, 585, 590, 591, 600, 602, 605, 607, 611, 618, 628, 621, 623, 660, 680, 687, 695, 637, 632, 703, 644, 704, 651, 668, 705, 706, 707, 708, 717, 94, 718, 729, 730, 728, 670, 733, 735, 747, 754, 756, 759, 760, 772, 773, 774, 786, 792, 785, 812, 835, 788, 820, 790, 843, 822, 844, 825, 847, 850, 118, 860, 861, 854, 864, 865, 867, 879, 884, 886, 896, 893, 897, 900, 902, 909, 923, 949, 934, 907, 933, 931, 958, 959, 102, 935, 961, 962, 968, 979, 964, 986, 981, 982, 993, 984, 1002, 1005, 1011, 1012, 1016, 360, 1025, 1018, 1027, 1032, 1037, 1039, 1042, 1043, 1046, 1049, 1179, 1053, 1058, 1060, 1063, 1069, 1076, 1079, 1074, 1080, 1086, 1089, 1095, 1109, 1110, 1096, 1105, 1179, 1156, 1160, 1164, 1166, 1170, 1174, 96 } ; static yyconst flex_int16_t yy_def[257] = { 0, 249, 1, 250, 250, 249, 249, 249, 249, 249, 251, 252, 249, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 254, 255, 249, 249, 249, 251, 249, 252, 249, 249, 249, 256, 256, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 254, 249, 255, 249, 249, 249, 249, 249, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 249, 249, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 249, 253, 253, 253, 253, 253, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 249, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 0, 249, 249, 249, 249, 249, 249, 249 } ; static yyconst flex_int16_t yy_nxt[1249] = { 0, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 6, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 15, 25, 26, 15, 27, 28, 15, 29, 30, 31, 15, 32, 33, 15, 34, 35, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 15, 25, 26, 15, 27, 28, 29, 30, 31, 15, 32, 33, 15, 34, 36, 6, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 48, 49, 49, 49, 49, 49, 49, 49, 50, 249, 249, 249, 52, 53, 249, 47, 54, 249, 249, 249, 60, 249, 249, 55, 61, 221, 89, 58, 249, 249, 44, 42, 62, 87, 56, 39, 249, 57, 52, 53, 180, 63, 89, 59, 249, 64, 60, 65, 249, 55, 61, 66, 249, 58, 44, 71, 249, 67, 62, 87, 56, 249, 249, 57, 72, 204, 180, 63, 59, 249, 249, 64, 249, 65, 68, 42, 249, 66, 249, 73, 249, 71, 40, 67, 249, 69, 249, 74, 249, 249, 75, 204, 249, 70, 249, 249, 249, 249, 76, 68, 249, 80, 249, 249, 39, 73, 249, 83, 77, 78, 249, 69, 81, 74, 249, 79, 75, 249, 82, 70, 93, 94, 85, 249, 76, 249, 38, 80, 38, 249, 84, 249, 249, 83, 77, 78, 86, 249, 81, 98, 249, 79, 249, 82, 249, 249, 93, 94, 85, 47, 47, 47, 47, 47, 47, 47, 84, 91, 92, 249, 249, 249, 86, 48, 46, 46, 46, 46, 46, 46, 46, 50, 249, 249, 249, 91, 92, 249, 249, 249, 249, 249, 249, 91, 92, 95, 95, 95, 95, 95, 95, 95, 249, 108, 249, 249, 249, 249, 103, 249, 249, 91, 92, 48, 49, 49, 49, 49, 49, 49, 49, 50, 249, 249, 249, 52, 53, 249, 249, 108, 249, 249, 249, 103, 249, 249, 249, 249, 99, 249, 249, 104, 249, 109, 249, 100, 249, 249, 249, 249, 105, 52, 53, 96, 96, 249, 97, 97, 97, 97, 97, 97, 97, 249, 99, 101, 102, 104, 249, 109, 249, 100, 249, 249, 249, 105, 249, 249, 106, 249, 249, 249, 249, 107, 111, 112, 249, 249, 249, 249, 101, 102, 110, 249, 114, 249, 249, 249, 249, 113, 249, 115, 249, 249, 106, 249, 249, 232, 249, 107, 249, 249, 119, 249, 249, 116, 249, 121, 110, 249, 114, 249, 249, 118, 113, 117, 249, 115, 122, 249, 120, 249, 249, 232, 249, 249, 249, 249, 249, 249, 249, 116, 249, 121, 249, 249, 123, 249, 118, 125, 117, 127, 126, 129, 122, 249, 120, 249, 124, 249, 249, 150, 249, 249, 249, 128, 249, 249, 249, 249, 249, 123, 249, 249, 249, 125, 249, 127, 126, 129, 133, 132, 138, 124, 249, 131, 249, 130, 96, 96, 128, 134, 134, 134, 134, 134, 134, 134, 95, 95, 95, 95, 95, 95, 95, 137, 133, 132, 249, 249, 131, 249, 130, 135, 135, 249, 136, 136, 136, 136, 136, 136, 136, 134, 134, 134, 134, 134, 134, 134, 249, 97, 97, 97, 97, 97, 97, 97, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 140, 249, 142, 141, 249, 249, 249, 139, 249, 249, 249, 249, 249, 249, 249, 143, 249, 144, 249, 249, 249, 249, 249, 249, 149, 147, 140, 148, 142, 141, 249, 249, 146, 139, 145, 249, 249, 249, 249, 152, 249, 143, 249, 144, 151, 249, 249, 249, 249, 249, 149, 147, 249, 148, 154, 249, 249, 146, 249, 145, 153, 249, 156, 249, 249, 152, 249, 155, 249, 249, 151, 157, 249, 249, 249, 249, 249, 158, 249, 249, 154, 249, 249, 249, 249, 249, 153, 160, 249, 249, 249, 249, 155, 249, 249, 249, 249, 157, 249, 249, 159, 249, 249, 158, 249, 161, 249, 164, 249, 249, 249, 249, 249, 160, 249, 249, 163, 249, 162, 249, 249, 171, 249, 249, 249, 159, 168, 249, 249, 165, 172, 161, 167, 164, 249, 249, 249, 249, 166, 249, 249, 163, 249, 162, 134, 134, 134, 134, 134, 134, 134, 249, 168, 249, 165, 249, 172, 167, 249, 249, 249, 249, 249, 166, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 169, 170, 170, 170, 170, 170, 170, 170, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 176, 175, 249, 173, 249, 174, 249, 249, 181, 249, 249, 249, 177, 178, 249, 185, 249, 249, 249, 249, 179, 182, 249, 249, 249, 249, 176, 175, 249, 173, 249, 174, 184, 183, 181, 249, 249, 249, 177, 178, 249, 249, 249, 249, 249, 249, 179, 182, 249, 249, 186, 249, 187, 249, 249, 249, 190, 188, 184, 183, 249, 249, 249, 249, 191, 249, 249, 249, 189, 249, 249, 249, 249, 249, 249, 249, 186, 249, 187, 249, 192, 249, 190, 188, 193, 249, 194, 249, 249, 195, 191, 249, 249, 189, 196, 196, 196, 196, 196, 196, 196, 249, 249, 249, 249, 192, 249, 249, 249, 249, 193, 249, 194, 249, 249, 195, 197, 170, 170, 170, 170, 170, 170, 170, 249, 249, 249, 198, 249, 249, 249, 249, 249, 249, 201, 249, 249, 199, 200, 249, 203, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 198, 249, 249, 202, 249, 249, 207, 201, 249, 249, 249, 199, 200, 249, 203, 249, 249, 205, 206, 209, 249, 249, 249, 249, 208, 249, 249, 249, 202, 249, 249, 249, 207, 249, 249, 212, 249, 249, 249, 249, 210, 213, 205, 206, 249, 209, 249, 249, 211, 208, 249, 249, 214, 196, 196, 196, 196, 196, 196, 196, 249, 212, 249, 249, 249, 210, 249, 213, 249, 215, 249, 249, 249, 249, 211, 249, 249, 218, 214, 196, 196, 196, 196, 196, 196, 196, 216, 249, 249, 217, 249, 249, 249, 249, 215, 249, 249, 249, 249, 249, 219, 249, 223, 218, 249, 249, 224, 222, 249, 220, 249, 249, 216, 249, 217, 249, 249, 225, 249, 249, 227, 249, 249, 249, 249, 249, 219, 249, 223, 249, 249, 249, 224, 222, 249, 220, 249, 226, 249, 249, 249, 249, 249, 225, 228, 249, 227, 249, 249, 249, 249, 230, 249, 249, 249, 249, 249, 249, 231, 249, 229, 249, 249, 226, 249, 233, 249, 234, 249, 249, 228, 249, 249, 249, 249, 249, 249, 230, 249, 249, 249, 235, 249, 249, 231, 229, 249, 249, 236, 249, 249, 233, 249, 234, 237, 249, 249, 249, 249, 249, 249, 239, 249, 249, 238, 249, 249, 235, 249, 249, 240, 249, 249, 249, 236, 249, 249, 249, 249, 242, 237, 249, 249, 249, 249, 249, 249, 239, 249, 241, 238, 249, 249, 249, 249, 245, 240, 243, 249, 249, 249, 246, 249, 244, 249, 242, 249, 249, 249, 247, 248, 249, 249, 249, 249, 241, 249, 249, 249, 249, 249, 245, 243, 249, 249, 249, 249, 246, 244, 249, 249, 249, 249, 249, 249, 247, 248, 37, 37, 37, 37, 41, 249, 41, 41, 43, 249, 43, 43, 51, 51, 88, 249, 88, 88, 90, 249, 90, 90, 5, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249 } ; static yyconst flex_int16_t yy_chk[1249] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 17, 18, 14, 14, 16, 256, 16, 15, 17, 18, 18, 19, 16, 16, 18, 204, 88, 17, 20, 19, 43, 41, 19, 35, 16, 39, 20, 16, 14, 14, 150, 19, 36, 17, 23, 20, 18, 20, 21, 16, 18, 20, 23, 17, 11, 23, 21, 21, 19, 35, 16, 24, 25, 16, 24, 180, 150, 19, 17, 24, 25, 20, 22, 20, 21, 10, 27, 20, 26, 25, 22, 23, 9, 21, 27, 22, 26, 26, 29, 30, 27, 180, 28, 22, 31, 51, 29, 30, 27, 21, 28, 29, 31, 51, 7, 25, 33, 31, 28, 28, 5, 22, 30, 26, 33, 28, 27, 32, 30, 22, 47, 47, 33, 34, 27, 32, 4, 29, 3, 52, 32, 34, 54, 31, 28, 28, 34, 52, 30, 54, 54, 28, 0, 30, 0, 0, 47, 47, 33, 45, 45, 45, 45, 45, 45, 45, 32, 48, 48, 0, 0, 0, 34, 46, 46, 46, 46, 46, 46, 46, 46, 46, 58, 62, 76, 46, 46, 0, 0, 0, 58, 62, 76, 48, 48, 50, 50, 50, 50, 50, 50, 50, 102, 62, 0, 0, 0, 0, 58, 0, 102, 46, 46, 49, 49, 49, 49, 49, 49, 49, 49, 49, 60, 63, 0, 49, 49, 55, 0, 62, 60, 63, 59, 58, 57, 55, 56, 0, 55, 112, 59, 59, 57, 63, 56, 56, 0, 112, 0, 0, 60, 49, 49, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 55, 56, 57, 59, 61, 63, 0, 56, 64, 66, 67, 60, 61, 0, 61, 65, 64, 66, 67, 61, 65, 65, 0, 65, 68, 0, 56, 57, 64, 0, 67, 69, 68, 71, 70, 66, 0, 68, 74, 69, 61, 71, 70, 221, 73, 61, 74, 72, 72, 77, 75, 69, 73, 74, 64, 72, 67, 77, 75, 71, 66, 70, 78, 68, 75, 82, 73, 0, 79, 221, 78, 0, 81, 82, 0, 80, 79, 69, 0, 74, 81, 0, 77, 80, 71, 79, 70, 80, 79, 82, 75, 83, 73, 0, 78, 84, 86, 111, 111, 83, 85, 81, 117, 84, 86, 0, 111, 77, 85, 0, 117, 79, 98, 80, 79, 82, 86, 85, 98, 78, 98, 84, 0, 83, 92, 92, 81, 92, 92, 92, 92, 92, 92, 92, 95, 95, 95, 95, 95, 95, 95, 95, 86, 85, 0, 0, 84, 0, 83, 94, 94, 0, 94, 94, 94, 94, 94, 94, 94, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 99, 100, 101, 103, 0, 104, 0, 0, 99, 100, 101, 103, 100, 104, 103, 101, 105, 106, 107, 99, 108, 0, 109, 110, 105, 106, 107, 104, 108, 105, 109, 110, 0, 0, 0, 113, 110, 108, 100, 109, 103, 101, 114, 113, 107, 99, 106, 0, 0, 116, 114, 114, 118, 104, 0, 105, 113, 116, 0, 115, 118, 0, 110, 108, 0, 109, 116, 115, 0, 107, 120, 106, 115, 119, 119, 0, 121, 114, 120, 118, 122, 119, 113, 120, 121, 123, 124, 0, 122, 121, 0, 0, 116, 123, 124, 125, 0, 126, 115, 124, 127, 0, 128, 125, 118, 126, 129, 0, 127, 120, 128, 0, 123, 130, 129, 121, 132, 125, 133, 129, 0, 130, 0, 131, 132, 124, 133, 139, 128, 0, 126, 131, 138, 138, 0, 139, 0, 123, 133, 141, 138, 130, 139, 125, 132, 129, 143, 141, 0, 0, 131, 0, 0, 128, 143, 126, 134, 134, 134, 134, 134, 134, 134, 144, 133, 155, 130, 0, 139, 132, 0, 144, 0, 155, 0, 131, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, 140, 142, 145, 146, 147, 148, 0, 0, 140, 142, 145, 146, 147, 148, 149, 151, 146, 145, 0, 140, 0, 142, 149, 151, 151, 154, 152, 153, 147, 148, 156, 156, 157, 154, 152, 153, 149, 152, 156, 0, 157, 0, 146, 145, 158, 140, 0, 142, 154, 153, 151, 159, 158, 160, 147, 148, 161, 162, 0, 159, 0, 160, 149, 152, 161, 162, 158, 0, 159, 163, 164, 165, 162, 160, 154, 153, 0, 163, 164, 165, 163, 0, 168, 166, 161, 171, 0, 173, 0, 167, 168, 166, 158, 171, 159, 173, 164, 167, 162, 160, 166, 0, 167, 0, 0, 168, 163, 0, 0, 161, 169, 169, 169, 169, 169, 169, 169, 172, 0, 175, 0, 164, 177, 0, 0, 172, 166, 175, 167, 0, 177, 168, 170, 170, 170, 170, 170, 170, 170, 170, 174, 176, 0, 172, 178, 0, 0, 179, 174, 176, 177, 183, 178, 174, 176, 179, 179, 181, 182, 183, 0, 184, 185, 0, 186, 181, 182, 0, 172, 184, 185, 178, 186, 0, 184, 177, 187, 0, 0, 174, 176, 188, 179, 189, 187, 181, 182, 187, 0, 188, 191, 189, 186, 190, 192, 0, 178, 193, 191, 194, 184, 190, 192, 191, 199, 193, 195, 194, 188, 192, 181, 182, 199, 187, 195, 0, 190, 186, 0, 0, 193, 196, 196, 196, 196, 196, 196, 196, 201, 191, 200, 198, 205, 188, 0, 192, 201, 195, 200, 198, 205, 0, 190, 0, 0, 201, 193, 197, 197, 197, 197, 197, 197, 197, 198, 202, 203, 200, 206, 207, 0, 210, 195, 202, 203, 208, 206, 207, 202, 210, 207, 201, 0, 208, 208, 206, 209, 203, 212, 213, 198, 215, 200, 211, 209, 209, 212, 213, 213, 215, 214, 211, 0, 0, 202, 0, 207, 0, 214, 216, 208, 206, 217, 203, 0, 211, 0, 216, 218, 219, 217, 209, 214, 220, 213, 223, 218, 219, 0, 218, 0, 220, 222, 223, 224, 0, 220, 0, 216, 225, 222, 211, 224, 222, 226, 223, 227, 225, 214, 228, 229, 0, 226, 230, 227, 218, 231, 228, 229, 225, 233, 230, 220, 216, 231, 234, 227, 235, 233, 222, 236, 223, 229, 234, 0, 235, 237, 0, 236, 236, 0, 240, 234, 238, 237, 225, 239, 241, 237, 240, 0, 238, 227, 242, 239, 241, 243, 239, 229, 0, 0, 242, 244, 247, 243, 236, 0, 238, 234, 0, 244, 247, 248, 243, 237, 241, 245, 246, 0, 244, 248, 242, 0, 239, 245, 246, 0, 245, 246, 0, 0, 0, 0, 238, 0, 0, 0, 0, 0, 243, 241, 0, 0, 0, 0, 244, 242, 0, 0, 0, 0, 0, 0, 245, 246, 250, 250, 250, 250, 251, 0, 251, 251, 252, 0, 252, 252, 253, 253, 254, 0, 254, 254, 255, 0, 255, 255, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/tnglex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/tnglex.L" #include #include #include #include "util.h" #include "tngparser.H" extern YYSTYPE* tnglval; extern tngFlexLexer* tnglexx; /* rules */ #line 781 "frame/tnglex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 30 "frame/tnglex.L" #line 885 "frame/tnglex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 250 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 249 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 32 "frame/tnglex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(tnglval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 39 "frame/tnglex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(TNGBUFSIZE-1) ? yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 47 "frame/tnglex.L" {return B1950_;} YY_BREAK case 4: YY_RULE_SETUP #line 48 "frame/tnglex.L" {return BACKGROUND_;} YY_BREAK case 5: YY_RULE_SETUP #line 49 "frame/tnglex.L" {return BOX_;} YY_BREAK case 6: YY_RULE_SETUP #line 50 "frame/tnglex.L" {return BLACK_;} YY_BREAK case 7: YY_RULE_SETUP #line 51 "frame/tnglex.L" {return BLUE_;} YY_BREAK case 8: YY_RULE_SETUP #line 52 "frame/tnglex.L" {return CIRCLE_;} YY_BREAK case 9: YY_RULE_SETUP #line 53 "frame/tnglex.L" {return CYAN_;} YY_BREAK case 10: YY_RULE_SETUP #line 54 "frame/tnglex.L" {return DATE_;} YY_BREAK case 11: YY_RULE_SETUP #line 55 "frame/tnglex.L" {return DEBUG_;} YY_BREAK case 12: YY_RULE_SETUP #line 56 "frame/tnglex.L" {return DEGREES_;} YY_BREAK case 13: YY_RULE_SETUP #line 57 "frame/tnglex.L" {return ELLIPSE_;} YY_BREAK case 14: YY_RULE_SETUP #line 58 "frame/tnglex.L" {return ECLIPTIC_;} YY_BREAK case 15: YY_RULE_SETUP #line 59 "frame/tnglex.L" {return FILENAME_;} YY_BREAK case 16: YY_RULE_SETUP #line 60 "frame/tnglex.L" {return FK4_;} YY_BREAK case 17: YY_RULE_SETUP #line 61 "frame/tnglex.L" {return FK4_NO_E_;} YY_BREAK case 18: YY_RULE_SETUP #line 62 "frame/tnglex.L" {return FK5_;} YY_BREAK case 19: YY_RULE_SETUP #line 63 "frame/tnglex.L" {return FORMAT_;} YY_BREAK case 20: YY_RULE_SETUP #line 64 "frame/tnglex.L" {return GALACTIC_;} YY_BREAK case 21: YY_RULE_SETUP #line 65 "frame/tnglex.L" {return GREEN_;} YY_BREAK case 22: YY_RULE_SETUP #line 66 "frame/tnglex.L" {return HELIOECLIPTIC_;} YY_BREAK case 23: YY_RULE_SETUP #line 67 "frame/tnglex.L" {return HMS_;} YY_BREAK case 24: YY_RULE_SETUP #line 68 "frame/tnglex.L" {return ICRS_;} YY_BREAK case 25: YY_RULE_SETUP #line 69 "frame/tnglex.L" {return J2000_;} YY_BREAK case 26: YY_RULE_SETUP #line 70 "frame/tnglex.L" {return LINE_;} YY_BREAK case 27: YY_RULE_SETUP #line 71 "frame/tnglex.L" {return MAGENTA_;} YY_BREAK case 28: YY_RULE_SETUP #line 72 "frame/tnglex.L" {return OFF_;} YY_BREAK case 29: YY_RULE_SETUP #line 73 "frame/tnglex.L" {return ON_;} YY_BREAK case 30: YY_RULE_SETUP #line 74 "frame/tnglex.L" {return PHYSICAL_;} YY_BREAK case 31: YY_RULE_SETUP #line 75 "frame/tnglex.L" {return PIXELS_;} YY_BREAK case 32: YY_RULE_SETUP #line 76 "frame/tnglex.L" {return POINT_;} YY_BREAK case 33: YY_RULE_SETUP #line 77 "frame/tnglex.L" {return POLYGON_;} YY_BREAK case 34: YY_RULE_SETUP #line 78 "frame/tnglex.L" {return RED_;} YY_BREAK case 35: YY_RULE_SETUP #line 79 "frame/tnglex.L" {return SOURCE_;} YY_BREAK case 36: YY_RULE_SETUP #line 80 "frame/tnglex.L" {return SUPERGALACTIC_;} YY_BREAK case 37: YY_RULE_SETUP #line 81 "frame/tnglex.L" {return TEXT_;} YY_BREAK case 38: YY_RULE_SETUP #line 82 "frame/tnglex.L" {return VERSION_;} YY_BREAK case 39: YY_RULE_SETUP #line 83 "frame/tnglex.L" {return WHITE_;} YY_BREAK case 40: YY_RULE_SETUP #line 84 "frame/tnglex.L" {return YELLOW_;} YY_BREAK case 41: YY_RULE_SETUP #line 86 "frame/tnglex.L" { // Integer tnglval->integer = atoi(yytext); return INT; } YY_BREAK case 42: #line 92 "frame/tnglex.L" case 43: YY_RULE_SETUP #line 92 "frame/tnglex.L" { // Real Number tnglval->real = atof(yytext); return REAL; } YY_BREAK case 44: #line 98 "frame/tnglex.L" case 45: YY_RULE_SETUP #line 98 "frame/tnglex.L" { // degrees yytext[yyleng-1] = '\0'; tnglval->real = atof(yytext); return ANGDEGREE; } YY_BREAK case 46: #line 105 "frame/tnglex.L" case 47: YY_RULE_SETUP #line 105 "frame/tnglex.L" { // Sexagesimal int ll = yyleng <(TNGBUFSIZE-1)?yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 48: #line 113 "frame/tnglex.L" case 49: YY_RULE_SETUP #line 113 "frame/tnglex.L" { // Quoted String int ll = (yyleng-2)<(TNGBUFSIZE-1)?(yyleng-2):(TNGBUFSIZE-1); strncpy(tnglval->str,yytext+1,yyleng-2); // skip the " " tnglval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 50: YY_RULE_SETUP #line 120 "frame/tnglex.L" { // Quoted String int ll = (yyleng-2)<(TNGBUFSIZE-1)?(yyleng-2):(TNGBUFSIZE-1); strncpy(tnglval->str,yytext+1,yyleng-2); // skip the '{' tnglval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 51: YY_RULE_SETUP #line 127 "frame/tnglex.L" { // General String int ll = yyleng <(TNGBUFSIZE-1) ? yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return STRING; } YY_BREAK case 52: YY_RULE_SETUP #line 134 "frame/tnglex.L" { // White Spaces } YY_BREAK case 53: /* rule 53 can match eol */ YY_RULE_SETUP #line 137 "frame/tnglex.L" { // windows line feed return '\n'; } YY_BREAK case 54: YY_RULE_SETUP #line 141 "frame/tnglex.L" { // fake line feed return '\n'; } YY_BREAK case 55: /* rule 55 can match eol */ YY_RULE_SETUP #line 145 "frame/tnglex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 149 "frame/tnglex.L" { // eof return EOF_; } YY_BREAK case 56: YY_RULE_SETUP #line 153 "frame/tnglex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 57: YY_RULE_SETUP #line 157 "frame/tnglex.L" ECHO; YY_BREAK #line 1297 "frame/tnglex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; tngfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); tngfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ tngrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) tngrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 250 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 250 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 249); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) tngalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) tngalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) tngfree((void *) b->yy_ch_buf ); tngfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)tngalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)tngrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) tngalloc(new_size ); else (yy_start_stack) = (int *) tngrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *tngalloc (yy_size_t size ) { return (void *) malloc( size ); } void *tngrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void tngfree (void * ptr ) { free( (char *) ptr ); /* see tngrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 157 "frame/tnglex.L" void tngDiscard(int doit) { if (tnglexx) tnglexx->begin(DISCARD, doit); } void tngFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/tnglex.L000644 000765 000000 00000006734 12464230774 016457 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "tngparser.H" extern YYSTYPE* tnglval; extern tngFlexLexer* tnglexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(tnglval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(TNGBUFSIZE-1) ? yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return STRING; } b1950 {return B1950_;} background {return BACKGROUND_;} box {return BOX_;} black {return BLACK_;} blue {return BLUE_;} circle {return CIRCLE_;} cyan {return CYAN_;} date {return DATE_;} debug {return DEBUG_;} degrees {return DEGREES_;} ellipse {return ELLIPSE_;} ecliptic {return ECLIPTIC_;} filename {return FILENAME_;} fk4 {return FK4_;} fk4-no-e {return FK4_NO_E_;} fk5 {return FK5_;} format {return FORMAT_;} galactic {return GALACTIC_;} green {return GREEN_;} helioecliptic {return HELIOECLIPTIC_;} hms {return HMS_;} icrs {return ICRS_;} j2000 {return J2000_;} lin[e] {return LINE_;} magenta {return MAGENTA_;} off {return OFF_;} on {return ON_;} physical {return PHYSICAL_;} pixels {return PIXELS_;} point {return POINT_;} polygon {return POLYGON_;} red {return RED_;} source {return SOURCE_;} supergalactic {return SUPERGALACTIC_;} text {return TEXT_;} version {return VERSION_;} white {return WHITE_;} yellow {return YELLOW_;} [+-]?{D}+ { // Integer tnglval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number tnglval->real = atof(yytext); return REAL; } [+-]?{D}+"."?d | [+-]?{D}*"."{D}+d { // degrees yytext[yyleng-1] = '\0'; tnglval->real = atof(yytext); return ANGDEGREE; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal int ll = yyleng <(TNGBUFSIZE-1)?yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return SEXSTR; } \"[^\"\n]*\" | \'[^\'\n]*\' { // Quoted String int ll = (yyleng-2)<(TNGBUFSIZE-1)?(yyleng-2):(TNGBUFSIZE-1); strncpy(tnglval->str,yytext+1,yyleng-2); // skip the " " tnglval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}\n]*\} { // Quoted String int ll = (yyleng-2)<(TNGBUFSIZE-1)?(yyleng-2):(TNGBUFSIZE-1); strncpy(tnglval->str,yytext+1,yyleng-2); // skip the '{' tnglval->str[ll] = '\0'; // Remove the '}' return STRING; } [0-9A-Za-z]+ { // General String int ll = yyleng <(TNGBUFSIZE-1) ? yyleng:(TNGBUFSIZE-1); strncpy(tnglval->str,yytext,ll); tnglval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \\n { // fake line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void tngDiscard(int doit) { if (tnglexx) tnglexx->begin(DISCARD, doit); } void tngFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/frame/tngparser.C000644 000765 000000 00000174455 12553253032 017147 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse tngparse #define yylex tnglex #define yyerror tngerror #define yylval tnglval #define yychar tngchar #define yydebug tngdebug #define yynerrs tngnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, ANGDEGREE = 261, SEXSTR = 262, EOF_ = 263, B1950_ = 264, BACKGROUND_ = 265, BOX_ = 266, BLACK_ = 267, BLUE_ = 268, CIRCLE_ = 269, CYAN_ = 270, DATE_ = 271, DEBUG_ = 272, DEGREES_ = 273, ECLIPTIC_ = 274, ELLIPSE_ = 275, FILENAME_ = 276, FK4_ = 277, FK4_NO_E_ = 278, FK5_ = 279, FORMAT_ = 280, GALACTIC_ = 281, GREEN_ = 282, HELIOECLIPTIC_ = 283, HMS_ = 284, ICRS_ = 285, J2000_ = 286, LINE_ = 287, MAGENTA_ = 288, OFF_ = 289, ON_ = 290, PHYSICAL_ = 291, PIXELS_ = 292, POINT_ = 293, POLYGON_ = 294, RED_ = 295, SOURCE_ = 296, SUPERGALACTIC_ = 297, TEXT_ = 298, VERSION_ = 299, WHITE_ = 300, YELLOW_ = 301 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define ANGDEGREE 261 #define SEXSTR 262 #define EOF_ 263 #define B1950_ 264 #define BACKGROUND_ 265 #define BOX_ 266 #define BLACK_ 267 #define BLUE_ 268 #define CIRCLE_ 269 #define CYAN_ 270 #define DATE_ 271 #define DEBUG_ 272 #define DEGREES_ 273 #define ECLIPTIC_ 274 #define ELLIPSE_ 275 #define FILENAME_ 276 #define FK4_ 277 #define FK4_NO_E_ 278 #define FK5_ 279 #define FORMAT_ 280 #define GALACTIC_ 281 #define GREEN_ 282 #define HELIOECLIPTIC_ 283 #define HMS_ 284 #define ICRS_ 285 #define J2000_ 286 #define LINE_ 287 #define MAGENTA_ 288 #define OFF_ 289 #define ON_ 290 #define PHYSICAL_ 291 #define PIXELS_ 292 #define POINT_ 293 #define POLYGON_ 294 #define RED_ 295 #define SOURCE_ 296 #define SUPERGALACTIC_ 297 #define TEXT_ 298 #define VERSION_ 299 #define WHITE_ 300 #define YELLOW_ 301 /* Copy the first part of user declarations. */ #line 10 "frame/tngparser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; tngDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer tngFlexLexer #include extern int tnglex(void*, tngFlexLexer*); extern void tngerror(Base*, tngFlexLexer*, const char*); extern void tngDiscard(int); static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static unsigned short globalProps; static unsigned short localProps; static char globalColor[16]; static char localColor[16]; static int dash[] = {8,3}; static char globalFont[32]; static char globalText[80]; static char localText[80]; static char localComment[80]; static List polylist; static List taglist; static List cblist; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 61 "frame/tngparser.Y" { #define TNGBUFSIZE 2048 double real; int integer; char str[TNGBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 255 "frame/tngparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 268 "frame/tngparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 155 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 56 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 33 /* YYNRULES -- Number of rules. */ #define YYNRULES 85 /* YYNRULES -- Number of states. */ #define YYNSTATES 148 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 301 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, 2, 50, 51, 2, 52, 49, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 55, 48, 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, 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, 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, 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, 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, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 6, 10, 13, 14, 17, 19, 23, 25, 27, 29, 31, 33, 35, 37, 39, 40, 42, 43, 45, 46, 48, 49, 51, 53, 55, 57, 61, 63, 67, 71, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 96, 97, 98, 100, 102, 110, 120, 130, 138, 144, 145, 154, 155, 162, 166, 168, 170, 175, 176, 182, 183, 189, 190, 194, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 226, 230, 233, 236, 238, 243, 244 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 57, 0, -1, 73, 58, -1, 58, 59, 60, -1, 59, 60, -1, -1, 17, 62, -1, 44, -1, 74, 75, 76, -1, 81, -1, 47, -1, 48, -1, 8, -1, 4, -1, 3, -1, 35, -1, 34, -1, -1, 49, -1, -1, 50, -1, -1, 51, -1, -1, 67, -1, 61, -1, 6, -1, 61, -1, 61, 63, 61, -1, 7, -1, 70, 63, 70, -1, 61, 63, 61, -1, 6, 63, 6, -1, 22, -1, 9, -1, 23, -1, 24, -1, 31, -1, 30, -1, 26, -1, 42, -1, 19, -1, 28, -1, -1, -1, -1, 52, -1, 53, -1, 14, 64, 71, 63, 68, 65, 85, -1, 20, 64, 71, 63, 69, 63, 66, 65, 85, -1, 11, 64, 71, 63, 69, 63, 66, 65, 85, -1, 32, 64, 71, 63, 71, 65, 85, -1, 38, 64, 71, 65, 85, -1, -1, 43, 64, 71, 63, 5, 65, 77, 85, -1, -1, 39, 78, 64, 79, 65, 85, -1, 79, 63, 80, -1, 80, -1, 71, -1, 54, 25, 55, 87, -1, -1, 54, 21, 55, 82, 5, -1, -1, 54, 16, 55, 83, 5, -1, -1, 54, 84, 5, -1, -1, 54, 45, -1, 54, 12, -1, 54, 40, -1, 54, 27, -1, 54, 13, -1, 54, 15, -1, 54, 33, -1, 54, 46, -1, 54, 41, -1, 54, 10, -1, -1, 54, 86, 5, -1, 29, 88, -1, 18, 88, -1, 37, -1, 37, 50, 36, 51, -1, -1, 50, 72, 51, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 130, 130, 133, 134, 137, 138, 139, 140, 141, 144, 145, 146, 149, 150, 153, 154, 157, 158, 161, 162, 165, 166, 169, 170, 173, 174, 177, 180, 189, 192, 206, 213, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 235, 249, 265, 266, 267, 270, 276, 283, 290, 297, 302, 302, 308, 308, 314, 315, 318, 321, 322, 322, 323, 323, 324, 324, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 341, 346, 346, 349, 350, 351, 352, 356, 360 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "STRING", "ANGDEGREE", "SEXSTR", "EOF_", "B1950_", "BACKGROUND_", "BOX_", "BLACK_", "BLUE_", "CIRCLE_", "CYAN_", "DATE_", "DEBUG_", "DEGREES_", "ECLIPTIC_", "ELLIPSE_", "FILENAME_", "FK4_", "FK4_NO_E_", "FK5_", "FORMAT_", "GALACTIC_", "GREEN_", "HELIOECLIPTIC_", "HMS_", "ICRS_", "J2000_", "LINE_", "MAGENTA_", "OFF_", "ON_", "PHYSICAL_", "PIXELS_", "POINT_", "POLYGON_", "RED_", "SOURCE_", "SUPERGALACTIC_", "TEXT_", "VERSION_", "WHITE_", "YELLOW_", "'\\n'", "';'", "','", "'('", "')'", "'+'", "'-'", "'#'", "':'", "$accept", "start", "commands", "command", "terminator", "numeric", "debug", "sp", "bp", "ep", "optangle", "angle", "value", "vvalue", "sexagesimal", "coord", "skyFrame", "initGlobal", "initLocal", "include", "shape", "@1", "@2", "polyNodes", "polyNode", "generalComment", "@3", "@4", "@5", "shapeComment", "@6", "tngFormat", "tngWCS", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 10, 59, 44, 40, 41, 43, 45, 35, 58 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 56, 57, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 74, 75, 75, 75, 76, 76, 76, 76, 76, 77, 76, 78, 76, 79, 79, 80, 81, 82, 81, 83, 81, 84, 81, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 85, 87, 87, 87, 87, 88, 88 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 3, 2, 0, 2, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 7, 9, 9, 7, 5, 0, 8, 0, 6, 3, 1, 1, 4, 0, 5, 0, 5, 0, 3, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 3, 2, 2, 1, 4, 0, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 43, 0, 44, 1, 0, 7, 65, 44, 0, 45, 9, 16, 15, 6, 0, 0, 0, 0, 0, 12, 10, 11, 4, 46, 47, 0, 63, 61, 0, 66, 3, 19, 19, 19, 19, 19, 55, 19, 8, 0, 0, 84, 84, 82, 60, 20, 0, 0, 0, 0, 0, 19, 0, 64, 62, 0, 81, 80, 0, 14, 13, 17, 29, 17, 17, 17, 17, 17, 17, 21, 0, 17, 34, 41, 33, 35, 36, 39, 42, 38, 37, 40, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 22, 67, 59, 17, 58, 0, 85, 83, 32, 31, 30, 17, 17, 27, 21, 17, 21, 78, 52, 0, 67, 21, 0, 23, 67, 23, 67, 77, 69, 72, 73, 71, 74, 70, 76, 68, 75, 0, 57, 56, 53, 28, 26, 25, 21, 24, 48, 21, 51, 79, 67, 67, 67, 54, 50, 49 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 7, 8, 22, 63, 13, 85, 46, 93, 136, 137, 106, 104, 64, 94, 82, 2, 9, 25, 38, 142, 51, 95, 96, 10, 40, 39, 17, 110, 129, 44, 56 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -108 static const yytype_int8 yypact[] = { -108, 2, -5, -108, -21, -108, 67, 0, -7, -46, -108, -108, -108, -108, -45, -30, -17, 40, -7, -108, -108, -108, -108, -108, -108, 105, -108, -108, -14, -108, -108, -4, -4, -4, -4, -4, -108, -4, -108, 45, 46, 3, 3, 11, -108, -108, 127, 127, 127, 127, 127, -4, 127, -108, -108, 87, -108, -108, 16, -108, -108, 15, -108, 15, 15, 15, 15, 15, 15, 14, 127, 15, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, 17, 18, -108, 70, 29, 78, 29, 29, 29, 127, -108, 32, -108, 8, -108, 82, -108, -108, -108, -108, -108, 15, 15, -108, 14, 15, 14, 62, -108, 127, 32, 14, 29, 117, 32, 117, 32, -108, -108, -108, -108, -108, -108, -108, -108, -108, -108, 85, -108, -108, -108, -108, -108, -108, 14, -108, -108, 14, -108, -108, 32, 32, 32, -108, -108, -108 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -108, -108, -108, 84, 75, 38, -108, -37, 47, -35, -23, -108, -108, 7, 12, -28, -108, -108, -108, -108, -108, -108, -108, -108, -11, -108, -108, -108, -108, -107, -108, -108, 63 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -22 static const yytype_int16 yytable[] = { -2, 19, 3, -5, 41, 131, 23, 24, -5, 138, 26, 140, 4, 11, 12, 42, -21, 4, 65, 66, 67, 68, 69, 43, 71, 27, 86, 87, 88, 89, 90, 91, 59, 60, 97, 145, 146, 147, 28, 5, 20, 21, -5, -5, 5, 29, 45, -5, -5, 6, 53, 54, 83, 55, 6, -21, -21, 84, 111, 92, 112, 58, -21, 108, 84, 92, 114, 115, 98, 99, 117, 116, 119, 118, 120, 121, 100, 122, 132, 47, 48, 49, 50, 14, 52, 62, 109, 113, 15, 123, 141, 18, 16, 30, 139, 124, 72, 107, 70, 102, 130, 143, 125, 126, 144, 57, 73, 127, 128, 74, 75, 76, 0, 77, 0, 78, 31, 79, 80, 32, 59, 60, 0, 134, 101, 33, 103, 105, 103, 81, 59, 60, 0, 61, 62, 0, 0, 34, 0, 0, 0, 0, 0, 35, 36, 0, 0, 0, 37, 0, 0, 0, 133, 135, 0, 135 }; static const yytype_int16 yycheck[] = { 0, 8, 0, 8, 18, 112, 52, 53, 8, 116, 55, 118, 17, 34, 35, 29, 8, 17, 46, 47, 48, 49, 50, 37, 52, 55, 63, 64, 65, 66, 67, 68, 3, 4, 71, 142, 143, 144, 55, 44, 47, 48, 47, 48, 44, 5, 50, 47, 48, 54, 5, 5, 36, 50, 54, 47, 48, 49, 95, 51, 95, 50, 54, 91, 49, 51, 103, 104, 51, 51, 107, 106, 10, 108, 12, 13, 6, 15, 113, 32, 33, 34, 35, 16, 37, 7, 54, 5, 21, 27, 5, 7, 25, 18, 117, 33, 9, 90, 51, 87, 111, 136, 40, 41, 139, 42, 19, 45, 46, 22, 23, 24, -1, 26, -1, 28, 11, 30, 31, 14, 3, 4, -1, 6, 86, 20, 88, 89, 90, 42, 3, 4, -1, 6, 7, -1, -1, 32, -1, -1, -1, -1, -1, 38, 39, -1, -1, -1, 43, -1, -1, -1, 114, 115, -1, 117 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 57, 73, 0, 17, 44, 54, 58, 59, 74, 81, 34, 35, 62, 16, 21, 25, 84, 59, 8, 47, 48, 60, 52, 53, 75, 55, 55, 55, 5, 60, 11, 14, 20, 32, 38, 39, 43, 76, 83, 82, 18, 29, 37, 87, 50, 64, 64, 64, 64, 64, 78, 64, 5, 5, 50, 88, 88, 50, 3, 4, 6, 7, 61, 70, 71, 71, 71, 71, 71, 64, 71, 9, 19, 22, 23, 24, 26, 28, 30, 31, 42, 72, 36, 49, 63, 63, 63, 63, 63, 63, 63, 51, 65, 71, 79, 80, 63, 51, 51, 6, 61, 70, 61, 69, 61, 68, 69, 71, 54, 85, 63, 65, 5, 63, 63, 65, 63, 65, 10, 12, 13, 15, 27, 33, 40, 41, 45, 46, 86, 80, 85, 65, 61, 6, 61, 66, 67, 85, 66, 85, 5, 77, 65, 65, 85, 85, 85 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, tngFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; tngFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, tngFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; tngFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, tngFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; tngFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, tngFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; tngFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, tngFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, tngFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; tngFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 7: #line 139 "frame/tngparser.Y" {cerr << "SAOtng" << endl;;} break; case 12: #line 146 "frame/tngparser.Y" {YYACCEPT;;} break; case 13: #line 149 "frame/tngparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 14: #line 150 "frame/tngparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 15: #line 153 "frame/tngparser.Y" {yydebug=1;;} break; case 16: #line 154 "frame/tngparser.Y" {yydebug=0;;} break; case 23: #line 169 "frame/tngparser.Y" {(yyval.real) = 0;;} break; case 24: #line 170 "frame/tngparser.Y" {(yyval.real) = (yyvsp[(1) - (1)].real);;} break; case 25: #line 173 "frame/tngparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 26: #line 174 "frame/tngparser.Y" {(yyval.real) = degToRad((yyvsp[(1) - (1)].real));;} break; case 27: #line 177 "frame/tngparser.Y" {(yyval.real) = FITSPTR->mapLenToRef((yyvsp[(1) - (1)].real),Coord::IMAGE);;} break; case 28: #line 181 "frame/tngparser.Y" { Vector r = FITSPTR->mapLenToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), Coord::IMAGE); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 29: #line 189 "frame/tngparser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 30: #line 193 "frame/tngparser.Y" { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), sys, sky); else r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real)*360./24.,(yyvsp[(3) - (3)].real)), sys, sky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 31: #line 207 "frame/tngparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), localSystem, localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 32: #line 214 "frame/tngparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)), checkWCSSystem(), checkWCSSky()); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 33: #line 223 "frame/tngparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 34: #line 224 "frame/tngparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 35: #line 225 "frame/tngparser.Y" {(yyval.integer) = Coord::FK4_NO_E;;} break; case 36: #line 226 "frame/tngparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 37: #line 227 "frame/tngparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 38: #line 228 "frame/tngparser.Y" {(yyval.integer) = Coord::ICRS;;} break; case 39: #line 229 "frame/tngparser.Y" {(yyval.integer) = Coord::GALACTIC;;} break; case 40: #line 230 "frame/tngparser.Y" {(yyval.integer) = Coord::SUPERGALACTIC;;} break; case 41: #line 231 "frame/tngparser.Y" {(yyval.integer) = Coord::ECLIPTIC;;} break; case 42: #line 232 "frame/tngparser.Y" {(yyval.integer) = Coord::HELIOECLIPTIC;;} break; case 43: #line 235 "frame/tngparser.Y" { // global properties globalSystem = Coord::IMAGE; globalSky = Coord::FK5; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; strcpy(globalColor,"green"); strcpy(globalFont,"helvetica 10 normal roman"); strcpy(globalText,""); ;} break; case 44: #line 249 "frame/tngparser.Y" { // reset maperr flag maperr =0; // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localColor,globalColor); strcpy(localText,globalText); strcpy(localComment,""); strcpy(globalText,""); ;} break; case 45: #line 265 "frame/tngparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 46: #line 266 "frame/tngparser.Y" {setProps(&localProps, Marker::INCLUDE, 1);;} break; case 47: #line 267 "frame/tngparser.Y" {setProps(&localProps, Marker::INCLUDE, 0);;} break; case 48: #line 271 "frame/tngparser.Y" {fr->createCircleCmd(Vector((yyvsp[(3) - (7)].vector)), (yyvsp[(5) - (7)].real), localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 49: #line 277 "frame/tngparser.Y" {fr->createEllipseCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 50: #line 284 "frame/tngparser.Y" {fr->createBoxCmd(Vector((yyvsp[(3) - (9)].vector)), Vector((yyvsp[(5) - (9)].vector)), (yyvsp[(7) - (9)].real), localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 51: #line 291 "frame/tngparser.Y" {fr->createLineCmd(Vector((yyvsp[(3) - (7)].vector)), Vector((yyvsp[(5) - (7)].vector)), 0,0, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 52: #line 298 "frame/tngparser.Y" {fr->createPointCmd(Vector((yyvsp[(3) - (5)].vector)), Point::BOXCIRCLE, POINTSIZE, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 53: #line 302 "frame/tngparser.Y" {strncpy(localText,(yyvsp[(5) - (6)].str),80);;} break; case 54: #line 303 "frame/tngparser.Y" {fr->createTextCmd(Vector((yyvsp[(3) - (8)].vector)), 0, 1, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 55: #line 308 "frame/tngparser.Y" {polylist.deleteAll();;} break; case 56: #line 309 "frame/tngparser.Y" {fr->createPolygonCmd(polylist, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);;} break; case 59: #line 318 "frame/tngparser.Y" {polylist.append(new Vertex((yyvsp[(1) - (1)].vector)));;} break; case 61: #line 322 "frame/tngparser.Y" {DISCARD_(0);;} break; case 63: #line 323 "frame/tngparser.Y" {DISCARD_(0);;} break; case 65: #line 324 "frame/tngparser.Y" {DISCARD_(1);;} break; case 66: #line 324 "frame/tngparser.Y" {strncpy(globalText,(yyvsp[(3) - (3)].str),80);;} break; case 68: #line 328 "frame/tngparser.Y" {strcpy(localColor,"white");;} break; case 69: #line 329 "frame/tngparser.Y" {strcpy(localColor,"black");;} break; case 70: #line 330 "frame/tngparser.Y" {strcpy(localColor,"red");;} break; case 71: #line 331 "frame/tngparser.Y" {strcpy(localColor,"green");;} break; case 72: #line 332 "frame/tngparser.Y" {strcpy(localColor,"blue");;} break; case 73: #line 333 "frame/tngparser.Y" {strcpy(localColor,"cyan");;} break; case 74: #line 334 "frame/tngparser.Y" {strcpy(localColor,"magenta");;} break; case 75: #line 335 "frame/tngparser.Y" {strcpy(localColor,"yellow");;} break; case 76: #line 337 "frame/tngparser.Y" { strcpy(localColor,"green"); setProps(&localProps,Marker::SOURCE,1); ;} break; case 77: #line 342 "frame/tngparser.Y" { strcpy(localColor,"red"); setProps(&localProps,Marker::SOURCE,0); ;} break; case 78: #line 346 "frame/tngparser.Y" {DISCARD_(1);;} break; case 79: #line 346 "frame/tngparser.Y" {strncpy(localComment,(yyvsp[(3) - (3)].str),80);;} break; case 82: #line 351 "frame/tngparser.Y" {globalSystem = localSystem = Coord::IMAGE;;} break; case 83: #line 352 "frame/tngparser.Y" {globalSystem = localSystem = Coord::IMAGE;;} break; case 84: #line 356 "frame/tngparser.Y" { globalSystem = localSystem = Coord::WCS; globalSky = localSky = Coord::FK5; ;} break; case 85: #line 361 "frame/tngparser.Y" { globalSystem = localSystem = Coord::WCS; globalSky = localSky = (Coord::SkyFrame)(yyvsp[(2) - (3)].integer); ;} break; /* Line 1267 of yacc.c. */ #line 2007 "frame/tngparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 367 "frame/tngparser.Y" static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/tngparser.H000644 000765 000000 00000007573 12553253032 017150 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, ANGDEGREE = 261, SEXSTR = 262, EOF_ = 263, B1950_ = 264, BACKGROUND_ = 265, BOX_ = 266, BLACK_ = 267, BLUE_ = 268, CIRCLE_ = 269, CYAN_ = 270, DATE_ = 271, DEBUG_ = 272, DEGREES_ = 273, ECLIPTIC_ = 274, ELLIPSE_ = 275, FILENAME_ = 276, FK4_ = 277, FK4_NO_E_ = 278, FK5_ = 279, FORMAT_ = 280, GALACTIC_ = 281, GREEN_ = 282, HELIOECLIPTIC_ = 283, HMS_ = 284, ICRS_ = 285, J2000_ = 286, LINE_ = 287, MAGENTA_ = 288, OFF_ = 289, ON_ = 290, PHYSICAL_ = 291, PIXELS_ = 292, POINT_ = 293, POLYGON_ = 294, RED_ = 295, SOURCE_ = 296, SUPERGALACTIC_ = 297, TEXT_ = 298, VERSION_ = 299, WHITE_ = 300, YELLOW_ = 301 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define ANGDEGREE 261 #define SEXSTR 262 #define EOF_ 263 #define B1950_ 264 #define BACKGROUND_ 265 #define BOX_ 266 #define BLACK_ 267 #define BLUE_ 268 #define CIRCLE_ 269 #define CYAN_ 270 #define DATE_ 271 #define DEBUG_ 272 #define DEGREES_ 273 #define ECLIPTIC_ 274 #define ELLIPSE_ 275 #define FILENAME_ 276 #define FK4_ 277 #define FK4_NO_E_ 278 #define FK5_ 279 #define FORMAT_ 280 #define GALACTIC_ 281 #define GREEN_ 282 #define HELIOECLIPTIC_ 283 #define HMS_ 284 #define ICRS_ 285 #define J2000_ 286 #define LINE_ 287 #define MAGENTA_ 288 #define OFF_ 289 #define ON_ 290 #define PHYSICAL_ 291 #define PIXELS_ 292 #define POINT_ 293 #define POLYGON_ 294 #define RED_ 295 #define SOURCE_ 296 #define SUPERGALACTIC_ 297 #define TEXT_ 298 #define VERSION_ 299 #define WHITE_ 300 #define YELLOW_ 301 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 61 "frame/tngparser.Y" { #define TNGBUFSIZE 2048 double real; int integer; char str[TNGBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 149 "frame/tngparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/tngparser.Y000644 000765 000000 00000020301 12540070042 017143 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {tngFlexLexer* ll} %parse-param {tngFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #define DISCARD_(x) {yyclearin; tngDiscard(x);} #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer tngFlexLexer #include extern int tnglex(void*, tngFlexLexer*); extern void tngerror(Base*, tngFlexLexer*, const char*); extern void tngDiscard(int); static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static unsigned short globalProps; static unsigned short localProps; static char globalColor[16]; static char localColor[16]; static int dash[] = {8,3}; static char globalFont[32]; static char globalText[80]; static char localText[80]; static char localComment[80]; static List polylist; static List taglist; static List cblist; static void setProps(unsigned short* props, unsigned short prop, int value); static Coord::CoordSystem checkWCSSystem(); static Coord::SkyFrame checkWCSSky(); %} %union { #define TNGBUFSIZE 2048 double real; int integer; char str[TNGBUFSIZE]; double vector[3]; } %type numeric %type angle %type optangle %type value %type vvalue %type sexagesimal %type coord %type skyFrame %token INT %token REAL %token STRING %token ANGDEGREE %token SEXSTR %token EOF_ %token B1950_ %token BACKGROUND_ %token BOX_ %token BLACK_ %token BLUE_ %token CIRCLE_ %token CYAN_ %token DATE_ %token DEBUG_ %token DEGREES_ %token ECLIPTIC_ %token ELLIPSE_ %token FILENAME_ %token FK4_ %token FK4_NO_E_ %token FK5_ %token FORMAT_ %token GALACTIC_ %token GREEN_ %token HELIOECLIPTIC_ %token HMS_ %token ICRS_ %token J2000_ %token LINE_ %token MAGENTA_ %token OFF_ %token ON_ %token PHYSICAL_ %token PIXELS_ %token POINT_ %token POLYGON_ %token RED_ %token SOURCE_ %token SUPERGALACTIC_ %token TEXT_ %token VERSION_ %token WHITE_ %token YELLOW_ %% start : initGlobal commands ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "SAOtng" << endl;} | initLocal include shape | generalComment ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; sp : /* empty */ | ',' ; bp : /* empty */ | '(' ; ep : /* emtpy */ | ')' ; optangle: /* empty */ {$$ = 0;} | angle {$$ = $1;} ; angle : numeric {$$ = degToRad($1);} /* assume degree */ | ANGDEGREE {$$ = degToRad($1);} ; value : numeric {$$ = FITSPTR->mapLenToRef($1,Coord::IMAGE);} ; vvalue : numeric sp numeric { Vector r = FITSPTR->mapLenToRef(Vector($1,$3), Coord::IMAGE); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; coord : sexagesimal sp sexagesimal { Vector r; Coord::CoordSystem sys = checkWCSSystem(); Coord::SkyFrame sky = checkWCSSky(); if (sky == Coord::GALACTIC || sky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector($1,$3), sys, sky); else r = FITSPTR->mapToRef(Vector($1*360./24.,$3), sys, sky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3), localSystem, localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r = FITSPTR->mapToRef(Vector($1,$3), checkWCSSystem(), checkWCSSky()); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; skyFrame : FK4_ {$$ = Coord::FK4;} | B1950_ {$$ = Coord::FK4;} | FK4_NO_E_ {$$ = Coord::FK4_NO_E;} | FK5_ {$$ = Coord::FK5;} | J2000_ {$$ = Coord::FK5;} | ICRS_ {$$ = Coord::ICRS;} | GALACTIC_ {$$ = Coord::GALACTIC;} | SUPERGALACTIC_ {$$ = Coord::SUPERGALACTIC;} | ECLIPTIC_ {$$ = Coord::ECLIPTIC;} | HELIOECLIPTIC_ {$$ = Coord::HELIOECLIPTIC;} ; initGlobal:{ // global properties globalSystem = Coord::IMAGE; globalSky = Coord::FK5; globalProps = Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE; strcpy(globalColor,"green"); strcpy(globalFont,"helvetica 10 normal roman"); strcpy(globalText,""); } ; initLocal : { // reset maperr flag maperr =0; // global properties localSystem = globalSystem; localSky = globalSky; localProps = globalProps; strcpy(localColor,globalColor); strcpy(localText,globalText); strcpy(localComment,""); strcpy(globalText,""); } ; include : /* empty */ {setProps(&localProps, Marker::INCLUDE, 1);} | '+' {setProps(&localProps, Marker::INCLUDE, 1);} | '-' {setProps(&localProps, Marker::INCLUDE, 0);} ; shape : CIRCLE_ bp coord sp value ep shapeComment {fr->createCircleCmd(Vector($3), $5, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | ELLIPSE_ bp coord sp vvalue sp optangle ep shapeComment {fr->createEllipseCmd(Vector($3), Vector($5), $7, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | BOX_ bp coord sp vvalue sp optangle ep shapeComment {fr->createBoxCmd(Vector($3), Vector($5), $7, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | LINE_ bp coord sp coord ep shapeComment {fr->createLineCmd(Vector($3), Vector($5), 0,0, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | POINT_ bp coord ep shapeComment {fr->createPointCmd(Vector($3), Point::BOXCIRCLE, POINTSIZE, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | TEXT_ bp coord sp STRING ep {strncpy(localText,$5,80);} shapeComment {fr->createTextCmd(Vector($3), 0, 1, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} | POLYGON_ {polylist.deleteAll();} bp polyNodes ep shapeComment {fr->createPolygonCmd(polylist, localColor,dash,1,globalFont,localText, localProps,localComment,taglist,cblist);} ; polyNodes : polyNodes sp polyNode | polyNode ; polyNode : coord {polylist.append(new Vertex($1));} ; generalComment : '#' FORMAT_ ':' tngFormat | '#' FILENAME_ ':' {DISCARD_(0);} STRING | '#' DATE_ ':' {DISCARD_(0);} STRING | '#' {DISCARD_(1);} STRING {strncpy(globalText,$3,80);} ; shapeComment : /* empty */ | '#' WHITE_ {strcpy(localColor,"white");} | '#' BLACK_ {strcpy(localColor,"black");} | '#' RED_ {strcpy(localColor,"red");} | '#' GREEN_ {strcpy(localColor,"green");} | '#' BLUE_ {strcpy(localColor,"blue");} | '#' CYAN_ {strcpy(localColor,"cyan");} | '#' MAGENTA_ {strcpy(localColor,"magenta");} | '#' YELLOW_ {strcpy(localColor,"yellow");} | '#' SOURCE_ { strcpy(localColor,"green"); setProps(&localProps,Marker::SOURCE,1); } | '#' BACKGROUND_ { strcpy(localColor,"red"); setProps(&localProps,Marker::SOURCE,0); } | '#' {DISCARD_(1);} STRING {strncpy(localComment,$3,80);} ; tngFormat : HMS_ tngWCS | DEGREES_ tngWCS | PIXELS_ {globalSystem = localSystem = Coord::IMAGE;} | PIXELS_ '(' PHYSICAL_ ')' {globalSystem = localSystem = Coord::IMAGE;} ; tngWCS : /* empty */ { globalSystem = localSystem = Coord::WCS; globalSky = localSky = Coord::FK5; } | '(' skyFrame ')' { globalSystem = localSystem = Coord::WCS; globalSky = localSky = (Coord::SkyFrame)$2; } ; %% static void setProps(unsigned short* props, unsigned short prop, int value) { if (value) *props |= prop; else *props &= ~prop; } static Coord::CoordSystem checkWCSSystem() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::WCS; default: return localSystem; } } static Coord::SkyFrame checkWCSSky() { switch (localSystem) { case Coord::IMAGE: case Coord::PHYSICAL: return Coord::FK5; default: return localSky; } } saods9/tksao1.0/frame/vect.C000644 000765 000000 00000007507 12540067774 016110 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "vect.h" #include "fitsimage.h" Vect::Vect(Base* p, const Vector& pt, double mag, double ang) : Line(p, pt, pt) { strcpy(type_,"vector"); p2 = Vector(mag,0) * Rotate(ang) * FlipY() * Translate(p1); updateBBox(); } Vect::Vect(Base* p, const Vector& pt, double mag, double ang, int arr, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Line(p, pt, pt, 0, arr, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { strcpy(type_,"vector"); p2 = Vector(mag,0) * Rotate(ang) * FlipY() * Translate(p1); updateBBox(); } Vect::Vect(Base* p, const Vector& ptr1, const Vector& ptr2, int arr, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb) : Line(p, ptr1, ptr2, 0, arr, clr, dsh, wth, fnt, txt, prop, cmt, tg, cb) { strcpy(type_,"vector"); } void Vect::setPoints(const Vector& pt, double mag, double ang) { p1 = pt; p2 = Vector(mag,0) * Rotate(ang) * FlipY() * Translate(p1); updateBBox(); doCallBack(CallBack::EDITCB); } // list void Vect::list(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format, int conj, int strip) { if (!strip) { FitsImage* ptr = parent->findFits(sys,center); listPre(str, sys, sky, ptr, strip, 1); switch (sys) { case Coord::IMAGE: case Coord::PHYSICAL: case Coord::DETECTOR: case Coord::AMPLIFIER: { Vector v1 = ptr->mapFromRef(p1,sys); double mag = (p2-p1).length(); double ang = (p2-p1).angle(); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << ptr->mapLenFromRef(mag,sys) << ',' << radToDeg(parent->mapAngleFromRef(ang,sys)) << ')'; } break; default: if (ptr->hasWCS(sys)) { if (ptr->hasWCSCel(sys)) { switch (format) { case Coord::DEGREES: { Vector v1 = ptr->mapFromRef(p1,sys,sky); double mag = (p2-p1).length(); double ang = (p2-p1).angle(); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << ptr->mapLenFromRef(mag,sys,Coord::ARCSEC) << "\"" << ',' << radToDeg(parent->mapAngleFromRef(ang,sys,sky)) << ')'; } break; case Coord::SEXAGESIMAL: { char buf[64]; char ra1[16]; char dec1[16]; double mag = (p2-p1).length(); double ang = (p2-p1).angle(); { ptr->mapFromRef(p1,sys,sky,format,buf,64); string x(buf); istringstream wcs(x); wcs >> ra1 >> dec1; } str << type_ << '(' << ra1 << ',' << dec1 << ',' << ptr->mapLenFromRef(mag,sys,Coord::ARCSEC) << "\"" << ',' << radToDeg(parent->mapAngleFromRef(ang,sys,sky)) << ')'; } break; } } else { Vector v1 = ptr->mapFromRef(p1,sys); double mag = (p2-p1).length(); double ang = (p2-p1).angle(); str << type_ << '(' << setprecision(8) << v1[0] << ',' << v1[1] << ',' << ptr->mapLenFromRef(mag,sys) << ',' << radToDeg(parent->mapAngleFromRef(ang,sys)) << ')'; } } } if (conj) str << " ||"; str << " vector=" << p2Arrow; listProperties(str, 0); } } void Vect::listXML(ostream& str, Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format) { FitsImage* ptr = parent->findFits(sys,center); double rr = ptr->mapLenFromRef((p2-p1).length(),sys,Coord::ARCSEC); XMLRowInit(); XMLRow(XMLSHAPE,type_); XMLRowPoint(ptr,sys,sky,format,p1); XMLRow(XMLR,rr); XMLRowAng(sys,sky); XMLRow(XMLPARAM,p2Arrow); XMLRowProps(ptr,sys); XMLRowEnd(str); } saods9/tksao1.0/frame/vect.h000644 000765 000000 00000002455 12464214757 016152 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __vect_h__ #define __vect_h__ #include "line.h" class Vect : public Line { public: Vect(Base* p, const Vector& pt, double mag, double ang); Vect(Base* p, const Vector& pt, double mag, double ang, int arr, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); Vect(Base* p, const Vector& ptr1, const Vector& ptr2, int arr, const char* clr, int* dsh, int wth, const char* fnt, const char* txt, unsigned short prop, const char* cmt, const List& tg, const List& cb); virtual Marker* dup() {return new Vect(*this);} int getArrow() {return p2Arrow;} void setArrow(int w) {p2Arrow = w ? 1 : 0;} void setPoints(const Vector& pt, double mag, double ang); void list(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int, int); void listXML(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat); void listSAOtng(ostream&, Coord::CoordSystem, Coord::SkyFrame, Coord::SkyFormat, int) {} }; #endif saods9/tksao1.0/frame/xml.h000644 000765 000000 00000001035 12464214757 016002 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __xml_h__ #define __xml_h__ #define XMLNUMCOL 34 enum XMLColName {XMLSHAPE,XMLX,XMLY,XMLXV,XMLYV,XMLR,XMLR2,XMLRV,XMLRV2,XMLANG,XMLANGV,XMLTILE,XMLCOLOR,XMLWIDTH,XMLTEXT,XMLFONT,XMLSELECT,XMLHIGHLITE,XMLEDIT,XMLMOVE,XMLROTATE,XMLDELETE,XMLFIXED,XMLINCLUDE,XMLSOURCE,XMLDASH,XMLDASHLIST,XMLTAG,XMLPARAM,XMLPARAM2,XMLPARAM3,XMLPARAM4,XMLPARAM5,XMLCOMMENT}; #endif saods9/tksao1.0/frame/xylex.C000644 000765 000000 00000157104 12553253032 016303 0ustar00joyewheel000000 000000 #line 2 "frame/xylex.C" #line 4 "frame/xylex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer xyFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *xyalloc (yy_size_t ); void *xyrealloc (void *,yy_size_t ); void xyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 61 #define YY_END_OF_BUFFER 62 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[197] = { 0, 0, 0, 62, 60, 59, 60, 57, 60, 59, 60, 48, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 58, 57, 0, 48, 50, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 3, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 21, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 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, 0, 51, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 13, 14, 0, 0, 0, 0, 52, 51, 0, 0, 55, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 54, 0, 0, 0, 0, 0, 0, 15, 0, 0, 20, 0, 5, 6, 8, 10, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 11, 19, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 1, 9, 10, 11, 12, 13, 14, 12, 12, 12, 15, 16, 6, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[69] = { 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int16_t yy_base[198] = { 0, 0, 0, 303, 615, 615, 300, 0, 61, 615, 68, 76, 64, 291, 75, 74, 79, 72, 84, 81, 84, 289, 73, 84, 81, 70, 87, 90, 615, 0, 132, 0, 139, 152, 165, 178, 191, 198, 78, 224, 91, 179, 84, 102, 127, 128, 123, 141, 212, 136, 146, 615, 128, 182, 182, 182, 215, 222, 235, 242, 256, 263, 230, 205, 615, 222, 239, 236, 211, 615, 245, 238, 244, 257, 163, 256, 615, 247, 262, 256, 302, 284, 301, 363, 371, 379, 370, 162, 373, 378, 366, 369, 381, 370, 615, 381, 161, 384, 379, 371, 381, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 398, 425, 405, 433, 440, 448, 442, 615, 615, 429, 430, 436, 433, 449, 615, 615, 454, 453, 450, 443, 466, 492, 501, 508, 615, 515, 542, 615, 457, 501, 508, 111, 509, 516, 509, 521, 522, 510, 615, 615, 520, 508, 525, 524, 527, 519, 615, 520, 521, 615, 544, 615, 615, 615, 615, 554, 615, 563, 615, 549, 563, 547, 548, 560, 561, 568, 569, 615, 615, 615, 116 } ; static yyconst flex_int16_t yy_def[198] = { 0, 196, 1, 196, 196, 196, 196, 197, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 196, 11, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 0, 196 } ; static yyconst flex_int16_t yy_nxt[684] = { 0, 4, 5, 6, 7, 8, 9, 8, 10, 11, 11, 11, 11, 11, 11, 11, 4, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 4, 22, 4, 4, 23, 24, 4, 4, 25, 4, 4, 26, 27, 4, 4, 4, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 4, 22, 4, 4, 23, 24, 4, 4, 25, 4, 4, 26, 27, 4, 4, 4, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 31, 31, 31, 31, 31, 31, 31, 34, 38, 40, 41, 35, 36, 42, 43, 37, 44, 45, 46, 49, 52, 50, 53, 54, 55, 62, 64, 67, 47, 51, 68, 69, 29, 170, 38, 40, 41, 35, 36, 42, 43, 37, 44, 45, 46, 49, 52, 50, 53, 54, 55, 62, 64, 67, 47, 51, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70, 71, 72, 73, 75, 56, 32, 32, 32, 32, 32, 32, 32, 76, 77, 142, 134, 96, 36, 57, 57, 57, 57, 57, 57, 57, 70, 71, 72, 73, 75, 56, 58, 58, 58, 58, 58, 58, 58, 76, 77, 59, 65, 59, 36, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 78, 66, 79, 80, 91, 87, 81, 74, 81, 65, 82, 82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 57, 83, 63, 78, 66, 79, 80, 58, 58, 58, 58, 58, 58, 58, 60, 60, 60, 60, 60, 60, 60, 86, 88, 89, 90, 92, 93, 84, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 94, 95, 97, 98, 99, 86, 88, 89, 90, 92, 93, 84, 100, 85, 82, 82, 82, 82, 82, 82, 82, 48, 39, 28, 196, 196, 94, 95, 97, 98, 99, 82, 82, 82, 82, 82, 82, 82, 100, 85, 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, 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, 128, 128, 128, 128, 128, 128, 129, 130, 130, 130, 130, 130, 130, 130, 131, 132, 132, 132, 132, 132, 132, 132, 133, 135, 136, 137, 138, 139, 140, 141, 143, 144, 145, 146, 147, 147, 147, 147, 147, 147, 147, 149, 149, 149, 149, 149, 149, 149, 133, 135, 136, 137, 138, 139, 140, 141, 143, 144, 145, 146, 148, 128, 128, 128, 128, 128, 128, 128, 150, 130, 130, 130, 130, 130, 130, 130, 152, 152, 152, 152, 152, 152, 152, 153, 132, 132, 132, 132, 132, 132, 132, 155, 156, 157, 158, 151, 159, 160, 161, 162, 163, 164, 147, 147, 147, 147, 147, 147, 147, 167, 154, 196, 196, 196, 196, 196, 196, 155, 156, 157, 158, 151, 159, 160, 161, 162, 163, 164, 147, 147, 147, 147, 147, 147, 147, 167, 154, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 152, 152, 152, 152, 152, 152, 152, 196, 168, 169, 171, 172, 165, 173, 174, 175, 176, 177, 178, 151, 179, 180, 181, 182, 183, 184, 166, 152, 152, 152, 152, 152, 152, 152, 168, 169, 171, 172, 165, 173, 174, 175, 176, 177, 178, 151, 179, 180, 181, 182, 183, 184, 166, 154, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 154, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 3, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196 } ; static yyconst flex_int16_t yy_chk[684] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 14, 15, 11, 11, 16, 17, 11, 18, 19, 20, 22, 24, 23, 25, 26, 27, 38, 40, 42, 20, 23, 43, 43, 197, 158, 12, 14, 15, 11, 11, 16, 17, 11, 18, 19, 20, 22, 24, 23, 25, 26, 27, 38, 40, 42, 20, 23, 30, 30, 30, 30, 30, 30, 30, 32, 32, 32, 32, 32, 32, 32, 44, 45, 46, 47, 49, 32, 33, 33, 33, 33, 33, 33, 33, 50, 52, 96, 87, 74, 33, 34, 34, 34, 34, 34, 34, 34, 44, 45, 46, 47, 49, 32, 35, 35, 35, 35, 35, 35, 35, 50, 52, 36, 41, 36, 33, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 53, 41, 54, 55, 68, 63, 56, 48, 56, 41, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 39, 53, 41, 54, 55, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 62, 65, 66, 67, 70, 71, 58, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 72, 73, 75, 77, 78, 62, 65, 66, 67, 70, 71, 58, 79, 61, 81, 81, 81, 81, 81, 81, 81, 21, 13, 6, 3, 0, 72, 73, 75, 77, 78, 82, 82, 82, 82, 82, 82, 82, 79, 61, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 86, 88, 89, 90, 91, 92, 93, 95, 97, 98, 99, 100, 127, 127, 127, 127, 127, 127, 127, 129, 129, 129, 129, 129, 129, 129, 86, 88, 89, 90, 91, 92, 93, 95, 97, 98, 99, 100, 128, 128, 128, 128, 128, 128, 128, 128, 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 133, 136, 137, 138, 130, 139, 140, 143, 144, 145, 146, 147, 147, 147, 147, 147, 147, 147, 155, 132, 0, 0, 0, 0, 0, 0, 133, 136, 137, 138, 130, 139, 140, 143, 144, 145, 146, 148, 148, 148, 148, 148, 148, 148, 155, 132, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 150, 150, 152, 152, 152, 152, 152, 152, 152, 0, 156, 157, 159, 160, 149, 161, 162, 163, 164, 167, 168, 150, 169, 170, 171, 172, 174, 175, 152, 153, 153, 153, 153, 153, 153, 153, 156, 157, 159, 160, 149, 161, 162, 163, 164, 167, 168, 150, 169, 170, 171, 172, 174, 175, 152, 153, 177, 182, 184, 186, 187, 188, 189, 190, 191, 192, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 177, 182, 184, 186, 187, 188, 189, 190, 191, 192, 193, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "frame/xylex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "frame/xylex.L" #include #include #include #include "util.h" #include "xyparser.H" extern YYSTYPE* xylval; /* rules */ #line 638 "frame/xylex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 27 "frame/xylex.L" #line 741 "frame/xylex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 197 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 196 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 29 "frame/xylex.L" {return AMPLIFIER_;} YY_BREAK case 2: YY_RULE_SETUP #line 30 "frame/xylex.L" {return B1950_;} YY_BREAK case 3: YY_RULE_SETUP #line 31 "frame/xylex.L" {return CCD_;} YY_BREAK case 4: YY_RULE_SETUP #line 32 "frame/xylex.L" {return DEBUG_;} YY_BREAK case 5: YY_RULE_SETUP #line 33 "frame/xylex.L" {return DETECTOR_;} YY_BREAK case 6: YY_RULE_SETUP #line 34 "frame/xylex.L" {return ECLIPTIC_;} YY_BREAK case 7: YY_RULE_SETUP #line 35 "frame/xylex.L" {return FK4_;} YY_BREAK case 8: YY_RULE_SETUP #line 36 "frame/xylex.L" {return FK4_NO_E_;} YY_BREAK case 9: YY_RULE_SETUP #line 37 "frame/xylex.L" {return FK5_;} YY_BREAK case 10: YY_RULE_SETUP #line 38 "frame/xylex.L" {return GALACTIC_;} YY_BREAK case 11: YY_RULE_SETUP #line 39 "frame/xylex.L" {return HELIOECLIPTIC_;} YY_BREAK case 12: YY_RULE_SETUP #line 40 "frame/xylex.L" {return ICRS_;} YY_BREAK case 13: YY_RULE_SETUP #line 41 "frame/xylex.L" {return IMAGE_;} YY_BREAK case 14: YY_RULE_SETUP #line 42 "frame/xylex.L" {return J2000_;} YY_BREAK case 15: YY_RULE_SETUP #line 43 "frame/xylex.L" {return LOGICAL_;} YY_BREAK case 16: YY_RULE_SETUP #line 44 "frame/xylex.L" {return OFF_;} YY_BREAK case 17: YY_RULE_SETUP #line 45 "frame/xylex.L" {return ON_;} YY_BREAK case 18: YY_RULE_SETUP #line 46 "frame/xylex.L" {return PHYSICAL_;} YY_BREAK case 19: YY_RULE_SETUP #line 47 "frame/xylex.L" {return SUPERGALACTIC_;} YY_BREAK case 20: YY_RULE_SETUP #line 48 "frame/xylex.L" {return VERSION_;} YY_BREAK case 21: YY_RULE_SETUP #line 49 "frame/xylex.L" {return WCS_;} YY_BREAK case 22: YY_RULE_SETUP #line 50 "frame/xylex.L" {return WCSA_;} YY_BREAK case 23: YY_RULE_SETUP #line 51 "frame/xylex.L" {return WCSB_;} YY_BREAK case 24: YY_RULE_SETUP #line 52 "frame/xylex.L" {return WCSC_;} YY_BREAK case 25: YY_RULE_SETUP #line 53 "frame/xylex.L" {return WCSD_;} YY_BREAK case 26: YY_RULE_SETUP #line 54 "frame/xylex.L" {return WCSE_;} YY_BREAK case 27: YY_RULE_SETUP #line 55 "frame/xylex.L" {return WCSF_;} YY_BREAK case 28: YY_RULE_SETUP #line 56 "frame/xylex.L" {return WCSG_;} YY_BREAK case 29: YY_RULE_SETUP #line 57 "frame/xylex.L" {return WCSH_;} YY_BREAK case 30: YY_RULE_SETUP #line 58 "frame/xylex.L" {return WCSI_;} YY_BREAK case 31: YY_RULE_SETUP #line 59 "frame/xylex.L" {return WCSJ_;} YY_BREAK case 32: YY_RULE_SETUP #line 60 "frame/xylex.L" {return WCSK_;} YY_BREAK case 33: YY_RULE_SETUP #line 61 "frame/xylex.L" {return WCSL_;} YY_BREAK case 34: YY_RULE_SETUP #line 62 "frame/xylex.L" {return WCSM_;} YY_BREAK case 35: YY_RULE_SETUP #line 63 "frame/xylex.L" {return WCSN_;} YY_BREAK case 36: YY_RULE_SETUP #line 64 "frame/xylex.L" {return WCSO_;} YY_BREAK case 37: YY_RULE_SETUP #line 65 "frame/xylex.L" {return WCSP_;} YY_BREAK case 38: YY_RULE_SETUP #line 66 "frame/xylex.L" {return WCSQ_;} YY_BREAK case 39: YY_RULE_SETUP #line 67 "frame/xylex.L" {return WCSR_;} YY_BREAK case 40: YY_RULE_SETUP #line 68 "frame/xylex.L" {return WCSS_;} YY_BREAK case 41: YY_RULE_SETUP #line 69 "frame/xylex.L" {return WCST_;} YY_BREAK case 42: YY_RULE_SETUP #line 70 "frame/xylex.L" {return WCSU_;} YY_BREAK case 43: YY_RULE_SETUP #line 71 "frame/xylex.L" {return WCSV_;} YY_BREAK case 44: YY_RULE_SETUP #line 72 "frame/xylex.L" {return WCSW_;} YY_BREAK case 45: YY_RULE_SETUP #line 73 "frame/xylex.L" {return WCSX_;} YY_BREAK case 46: YY_RULE_SETUP #line 74 "frame/xylex.L" {return WCSY_;} YY_BREAK case 47: YY_RULE_SETUP #line 75 "frame/xylex.L" {return WCSZ_;} YY_BREAK case 48: YY_RULE_SETUP #line 77 "frame/xylex.L" { // Integer xylval->integer = atoi(yytext); return INT; } YY_BREAK case 49: #line 83 "frame/xylex.L" case 50: YY_RULE_SETUP #line 83 "frame/xylex.L" { // Real Number xylval->real = atof(yytext); return REAL; } YY_BREAK case 51: #line 89 "frame/xylex.L" case 52: YY_RULE_SETUP #line 89 "frame/xylex.L" { // Sexagesimal int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return SEXSTR; } YY_BREAK case 53: #line 97 "frame/xylex.L" case 54: YY_RULE_SETUP #line 97 "frame/xylex.L" { // HMS int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return HMSSTR; } YY_BREAK case 55: #line 105 "frame/xylex.L" case 56: YY_RULE_SETUP #line 105 "frame/xylex.L" { // DMS int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return DMSSTR; } YY_BREAK case 57: YY_RULE_SETUP #line 112 "frame/xylex.L" { // comment, eat it } YY_BREAK case 58: /* rule 58 can match eol */ YY_RULE_SETUP #line 115 "frame/xylex.L" { // windows line feed return '\n'; } YY_BREAK case 59: /* rule 59 can match eol */ YY_RULE_SETUP #line 119 "frame/xylex.L" { // special chars return yytext[0]; } YY_BREAK case YY_STATE_EOF(INITIAL): #line 123 "frame/xylex.L" { // eof return EOF_; } YY_BREAK case 60: YY_RULE_SETUP #line 127 "frame/xylex.L" { // Else, eat it } YY_BREAK case 61: YY_RULE_SETUP #line 130 "frame/xylex.L" ECHO; YY_BREAK #line 1148 "frame/xylex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; xyfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); xyfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ xyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) xyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 197 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 197 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 196); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) xyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) xyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) xyfree((void *) b->yy_ch_buf ); xyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)xyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)xyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) xyalloc(new_size ); else (yy_start_stack) = (int *) xyrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *xyalloc (yy_size_t size ) { return (void *) malloc( size ); } void *xyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void xyfree (void * ptr ) { free( (char *) ptr ); /* see xyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 130 "frame/xylex.L" saods9/tksao1.0/frame/xylex.L000644 000765 000000 00000005073 12464230774 016322 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "xyparser.H" extern YYSTYPE* xylval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% amplifier {return AMPLIFIER_;} b1950 {return B1950_;} ccd {return CCD_;} debug {return DEBUG_;} detector {return DETECTOR_;} ecliptic {return ECLIPTIC_;} fk4 {return FK4_;} fk4-no-e {return FK4_NO_E_;} fk5 {return FK5_;} galactic {return GALACTIC_;} helioecliptic {return HELIOECLIPTIC_;} icrs {return ICRS_;} image {return IMAGE_;} j2000 {return J2000_;} logical {return LOGICAL_;} off {return OFF_;} on {return ON_;} physical {return PHYSICAL_;} supergalactic {return SUPERGALACTIC_;} version {return VERSION_;} wcs {return WCS_;} wcsa {return WCSA_;} wcsb {return WCSB_;} wcsc {return WCSC_;} wcsd {return WCSD_;} wcse {return WCSE_;} wcsf {return WCSF_;} wcsg {return WCSG_;} wcsh {return WCSH_;} wcsi {return WCSI_;} wcsj {return WCSJ_;} wcsk {return WCSK_;} wcsl {return WCSL_;} wcsm {return WCSM_;} wcsn {return WCSN_;} wcso {return WCSO_;} wcsp {return WCSP_;} wcsq {return WCSQ_;} wcsr {return WCSR_;} wcss {return WCSS_;} wcst {return WCST_;} wcsu {return WCSU_;} wcsv {return WCSV_;} wcsw {return WCSW_;} wcsx {return WCSX_;} wcsy {return WCSY_;} wcsz {return WCSZ_;} [+-]?{D}+ { // Integer xylval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number xylval->real = atof(yytext); return REAL; } [+-]?{D}+:{D}+:{D}+"."? | [+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return SEXSTR; } [+-]?{D}+h{D}+m{D}+"."?s | [+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return HMSSTR; } [+-]?{D}+d{D}+m{D}+"."?s | [+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS int ll = yyleng <(XYBUFSIZE-1) ? yyleng:(XYBUFSIZE-1); strncpy(xylval->str,yytext,ll); xylval->str[ll] = '\0'; return DMSSTR; } #.* { // comment, eat it } \r\n { // windows line feed return '\n'; } [\n;,] { // special chars return yytext[0]; } <> { // eof return EOF_; } . { // Else, eat it } %% saods9/tksao1.0/frame/xyparser.C000644 000765 000000 00000163632 12553253032 017012 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse xyparse #define yylex xylex #define yyerror xyerror #define yylval xylval #define yychar xychar #define yydebug xydebug #define yynerrs xynerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, ANGDEGREE = 260, SEXSTR = 261, HMSSTR = 262, DMSSTR = 263, EOF_ = 264, AMPLIFIER_ = 265, B1950_ = 266, CCD_ = 267, DEBUG_ = 268, DETECTOR_ = 269, ECLIPTIC_ = 270, FK4_ = 271, FK4_NO_E_ = 272, FK5_ = 273, GALACTIC_ = 274, HELIOECLIPTIC_ = 275, ICRS_ = 276, IMAGE_ = 277, J2000_ = 278, LOGICAL_ = 279, OFF_ = 280, ON_ = 281, PHYSICAL_ = 282, SUPERGALACTIC_ = 283, VERSION_ = 284, WCS_ = 285, WCSA_ = 286, WCSB_ = 287, WCSC_ = 288, WCSD_ = 289, WCSE_ = 290, WCSF_ = 291, WCSG_ = 292, WCSH_ = 293, WCSI_ = 294, WCSJ_ = 295, WCSK_ = 296, WCSL_ = 297, WCSM_ = 298, WCSN_ = 299, WCSO_ = 300, WCSP_ = 301, WCSQ_ = 302, WCSR_ = 303, WCSS_ = 304, WCST_ = 305, WCSU_ = 306, WCSV_ = 307, WCSW_ = 308, WCSX_ = 309, WCSY_ = 310, WCSZ_ = 311 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define ANGDEGREE 260 #define SEXSTR 261 #define HMSSTR 262 #define DMSSTR 263 #define EOF_ 264 #define AMPLIFIER_ 265 #define B1950_ 266 #define CCD_ 267 #define DEBUG_ 268 #define DETECTOR_ 269 #define ECLIPTIC_ 270 #define FK4_ 271 #define FK4_NO_E_ 272 #define FK5_ 273 #define GALACTIC_ 274 #define HELIOECLIPTIC_ 275 #define ICRS_ 276 #define IMAGE_ 277 #define J2000_ 278 #define LOGICAL_ 279 #define OFF_ 280 #define ON_ 281 #define PHYSICAL_ 282 #define SUPERGALACTIC_ 283 #define VERSION_ 284 #define WCS_ 285 #define WCSA_ 286 #define WCSB_ 287 #define WCSC_ 288 #define WCSD_ 289 #define WCSE_ 290 #define WCSF_ 291 #define WCSG_ 292 #define WCSH_ 293 #define WCSI_ 294 #define WCSJ_ 295 #define WCSK_ 296 #define WCSL_ 297 #define WCSM_ 298 #define WCSN_ 299 #define WCSO_ 300 #define WCSP_ 301 #define WCSQ_ 302 #define WCSR_ 303 #define WCSS_ 304 #define WCST_ 305 #define WCSU_ 306 #define WCSV_ 307 #define WCSW_ 308 #define WCSX_ 309 #define WCSY_ 310 #define WCSZ_ 311 /* Copy the first part of user declarations. */ #line 10 "frame/xyparser.Y" #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer xyFlexLexer #include extern int xylex(void*, xyFlexLexer*); extern void xyerror(Base*, xyFlexLexer*, const char*); static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static List taglist; static List cblist; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 44 "frame/xyparser.Y" { #define XYBUFSIZE 2048 double real; int integer; char str[XYBUFSIZE]; double vector[3]; } /* Line 193 of yacc.c. */ #line 258 "frame/xyparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 271 "frame/xyparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 126 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 60 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 20 /* YYNRULES -- Number of rules. */ #define YYNRULES 78 /* YYNRULES -- Number of states. */ #define YYNSTATES 91 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 311 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 57, 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, 59, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 58, 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, 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, 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, 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, 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, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 4, 7, 11, 14, 15, 18, 20, 22, 25, 26, 30, 31, 33, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 55, 57, 59, 61, 63, 67, 71, 75, 79, 83, 85, 87, 89, 91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153, 155, 157, 159, 161, 163, 165, 167, 169 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 61, 0, -1, -1, 62, 63, -1, 63, 64, 69, -1, 64, 69, -1, -1, 13, 71, -1, 29, -1, 77, -1, 77, 78, -1, -1, 65, 79, 66, -1, -1, 67, -1, 67, 68, -1, 68, -1, 70, -1, 57, -1, 58, -1, 9, -1, 4, -1, 3, -1, 26, -1, 25, -1, -1, 59, -1, 6, -1, 7, -1, 8, -1, 73, 72, 73, -1, 74, 72, 75, -1, 75, 72, 75, -1, 70, 72, 70, -1, 5, 72, 5, -1, 22, -1, 24, -1, 27, -1, 12, -1, 10, -1, 14, -1, 30, -1, 31, -1, 32, -1, 33, -1, 34, -1, 35, -1, 36, -1, 37, -1, 38, -1, 39, -1, 40, -1, 41, -1, 42, -1, 43, -1, 44, -1, 45, -1, 46, -1, 47, -1, 48, -1, 49, -1, 50, -1, 51, -1, 52, -1, 53, -1, 54, -1, 55, -1, 56, -1, 16, -1, 11, -1, 17, -1, 18, -1, 23, -1, 21, -1, 19, -1, 28, -1, 15, -1, 20, -1, 76, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 122, 122, 122, 128, 129, 132, 133, 134, 135, 136, 138, 138, 141, 142, 145, 146, 149, 152, 153, 154, 157, 158, 161, 162, 165, 166, 169, 172, 175, 178, 189, 196, 203, 210, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 266 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "ANGDEGREE", "SEXSTR", "HMSSTR", "DMSSTR", "EOF_", "AMPLIFIER_", "B1950_", "CCD_", "DEBUG_", "DETECTOR_", "ECLIPTIC_", "FK4_", "FK4_NO_E_", "FK5_", "GALACTIC_", "HELIOECLIPTIC_", "ICRS_", "IMAGE_", "J2000_", "LOGICAL_", "OFF_", "ON_", "PHYSICAL_", "SUPERGALACTIC_", "VERSION_", "WCS_", "WCSA_", "WCSB_", "WCSC_", "WCSD_", "WCSE_", "WCSF_", "WCSG_", "WCSH_", "WCSI_", "WCSJ_", "WCSK_", "WCSL_", "WCSM_", "WCSN_", "WCSO_", "WCSP_", "WCSQ_", "WCSR_", "WCSS_", "WCST_", "WCSU_", "WCSV_", "WCSW_", "WCSX_", "WCSY_", "WCSZ_", "'\\n'", "';'", "','", "$accept", "start", "@1", "commands", "command", "@2", "comment", "junks", "junk", "terminator", "numeric", "debug", "sp", "sexagesimal", "hms", "dms", "coord", "coordSystem", "skyFrame", "shape", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 10, 59, 44 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 60, 62, 61, 63, 63, 64, 64, 64, 64, 64, 65, 64, 66, 66, 67, 67, 68, 69, 69, 69, 70, 70, 71, 71, 72, 72, 73, 74, 75, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 3, 2, 0, 2, 1, 1, 2, 0, 3, 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 11, 1, 39, 38, 0, 40, 35, 36, 37, 8, 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, 11, 0, 0, 9, 24, 23, 7, 0, 20, 18, 19, 5, 22, 21, 25, 27, 28, 29, 25, 25, 25, 25, 78, 13, 69, 76, 68, 70, 71, 74, 77, 73, 72, 75, 10, 4, 26, 0, 0, 0, 0, 0, 12, 14, 16, 17, 34, 33, 30, 31, 32, 15 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 1, 2, 39, 40, 41, 81, 82, 83, 50, 84, 45, 76, 58, 59, 60, 61, 42, 73, 62 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -40 static const yytype_int8 yypact[] = { -40, 11, 50, -40, -40, -40, -18, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 0, 8, -2, 98, -40, -40, -40, 8, -40, -40, -40, -40, -40, -40, -36, -40, -40, -40, -36, -36, -36, -36, -40, 12, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, 21, 12, 22, 61, 61, -40, 12, -40, -40, -40, -40, -40, -40, -40, -40 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -40, -40, -40, -40, 31, -40, -40, -40, -11, 27, -16, -40, -39, -3, -40, -12, -40, -40, -40, -40 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -7 static const yytype_int8 yytable[] = { -3, 51, 52, 53, 54, 55, 56, 43, 44, -6, 4, 3, 5, 6, 7, 51, 52, 47, 77, 78, 79, 80, 8, 75, 9, 57, 85, 10, 54, 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, -6, -6, -6, 4, 86, 5, 6, 7, 48, 49, 88, 89, 56, 46, 90, 8, 74, 9, 87, 0, 10, 0, 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, -6, -6, 63, 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, 0, 71, 0, 0, 0, 0, 72 }; static const yytype_int8 yycheck[] = { 0, 3, 4, 5, 6, 7, 8, 25, 26, 9, 10, 0, 12, 13, 14, 3, 4, 9, 57, 58, 59, 60, 22, 59, 24, 41, 5, 27, 6, 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, 9, 10, 77, 12, 13, 14, 57, 58, 79, 80, 8, 39, 82, 22, 46, 24, 78, -1, 27, -1, 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, 11, -1, -1, -1, 15, 16, 17, 18, 19, 20, 21, -1, 23, -1, -1, -1, -1, 28 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 61, 62, 0, 10, 12, 13, 14, 22, 24, 27, 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, 63, 64, 65, 77, 25, 26, 71, 64, 9, 57, 58, 69, 3, 4, 5, 6, 7, 8, 70, 73, 74, 75, 76, 79, 11, 15, 16, 17, 18, 19, 20, 21, 23, 28, 78, 69, 59, 72, 72, 72, 72, 72, 66, 67, 68, 70, 5, 70, 73, 75, 75, 68 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (fr, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, fr, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, xyFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; xyFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (fr); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, Base* fr, xyFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, fr, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; Base* fr; xyFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, fr, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, Base* fr, xyFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, fr, ll) YYSTYPE *yyvsp; int yyrule; Base* fr; xyFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , fr, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, fr, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, Base* fr, xyFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, fr, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; Base* fr; xyFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (fr); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (Base* fr, xyFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (Base* fr, xyFlexLexer* ll) #else int yyparse (fr, ll) Base* fr; xyFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 122 "frame/xyparser.Y" { globalSystem = fr->xySystem(); globalSky = fr->xySky(); ;} break; case 8: #line 134 "frame/xyparser.Y" {cerr << "X Y Format 1.0" << endl;;} break; case 9: #line 135 "frame/xyparser.Y" {globalSystem = (Coord::CoordSystem)(yyvsp[(1) - (1)].integer);;} break; case 10: #line 137 "frame/xyparser.Y" {globalSystem = (Coord::CoordSystem)(yyvsp[(1) - (2)].integer); globalSky = (Coord::SkyFrame)(yyvsp[(2) - (2)].integer);;} break; case 11: #line 138 "frame/xyparser.Y" {localSystem = globalSystem; localSky = globalSky; maperr = 0;;} break; case 17: #line 149 "frame/xyparser.Y" {;} break; case 20: #line 154 "frame/xyparser.Y" {YYACCEPT;;} break; case 21: #line 157 "frame/xyparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 22: #line 158 "frame/xyparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 23: #line 161 "frame/xyparser.Y" {yydebug=1;;} break; case 24: #line 162 "frame/xyparser.Y" {yydebug=0;;} break; case 27: #line 169 "frame/xyparser.Y" {(yyval.real) = parseSEXStr((yyvsp[(1) - (1)].str));;} break; case 28: #line 172 "frame/xyparser.Y" {(yyval.real) = parseHMSStr((yyvsp[(1) - (1)].str));;} break; case 29: #line 175 "frame/xyparser.Y" {(yyval.real) = parseDMSStr((yyvsp[(1) - (1)].str));;} break; case 30: #line 179 "frame/xyparser.Y" { Vector r; if (localSky == Coord::GALACTIC || localSky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),localSystem,localSky); else r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real)*360./24.,(yyvsp[(3) - (3)].real)),localSystem,localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 31: #line 190 "frame/xyparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),localSystem,localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 32: #line 197 "frame/xyparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),localSystem,localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 33: #line 204 "frame/xyparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),localSystem,localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 34: #line 211 "frame/xyparser.Y" { Vector r = FITSPTR->mapToRef(Vector((yyvsp[(1) - (3)].real),(yyvsp[(3) - (3)].real)),localSystem,localSky); (yyval.vector)[0] = r[0]; (yyval.vector)[1] = r[1]; (yyval.vector)[2] = r[2]; ;} break; case 35: #line 219 "frame/xyparser.Y" {(yyval.integer) = Coord::IMAGE;;} break; case 36: #line 220 "frame/xyparser.Y" {(yyval.integer) = Coord::IMAGE;;} break; case 37: #line 221 "frame/xyparser.Y" {(yyval.integer) = Coord::PHYSICAL;;} break; case 38: #line 222 "frame/xyparser.Y" {(yyval.integer) = Coord::PHYSICAL;;} break; case 39: #line 223 "frame/xyparser.Y" {(yyval.integer) = Coord::AMPLIFIER;;} break; case 40: #line 224 "frame/xyparser.Y" {(yyval.integer) = Coord::DETECTOR;;} break; case 41: #line 225 "frame/xyparser.Y" {(yyval.integer) = Coord::WCS;;} break; case 42: #line 226 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSA;;} break; case 43: #line 227 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSB;;} break; case 44: #line 228 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSC;;} break; case 45: #line 229 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSD;;} break; case 46: #line 230 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSE;;} break; case 47: #line 231 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSF;;} break; case 48: #line 232 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSG;;} break; case 49: #line 233 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSH;;} break; case 50: #line 234 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSI;;} break; case 51: #line 235 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSJ;;} break; case 52: #line 236 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSK;;} break; case 53: #line 237 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSL;;} break; case 54: #line 238 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSM;;} break; case 55: #line 239 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSN;;} break; case 56: #line 240 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSO;;} break; case 57: #line 241 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSP;;} break; case 58: #line 242 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSQ;;} break; case 59: #line 243 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSR;;} break; case 60: #line 244 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSS;;} break; case 61: #line 245 "frame/xyparser.Y" {(yyval.integer) = Coord::WCST;;} break; case 62: #line 246 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSU;;} break; case 63: #line 247 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSV;;} break; case 64: #line 248 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSW;;} break; case 65: #line 249 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSX;;} break; case 66: #line 250 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSY;;} break; case 67: #line 251 "frame/xyparser.Y" {(yyval.integer) = Coord::WCSZ;;} break; case 68: #line 254 "frame/xyparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 69: #line 255 "frame/xyparser.Y" {(yyval.integer) = Coord::FK4;;} break; case 70: #line 256 "frame/xyparser.Y" {(yyval.integer) = Coord::FK4_NO_E;;} break; case 71: #line 257 "frame/xyparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 72: #line 258 "frame/xyparser.Y" {(yyval.integer) = Coord::FK5;;} break; case 73: #line 259 "frame/xyparser.Y" {(yyval.integer) = Coord::ICRS;;} break; case 74: #line 260 "frame/xyparser.Y" {(yyval.integer) = Coord::GALACTIC;;} break; case 75: #line 261 "frame/xyparser.Y" {(yyval.integer) = Coord::SUPERGALACTIC;;} break; case 76: #line 262 "frame/xyparser.Y" {(yyval.integer) = Coord::ECLIPTIC;;} break; case 77: #line 263 "frame/xyparser.Y" {(yyval.integer) = Coord::HELIOECLIPTIC;;} break; case 78: #line 266 "frame/xyparser.Y" {fr->createPointCmd(Vector((yyvsp[(1) - (1)].vector)), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text, Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE, "",taglist,cblist); ;} break; /* Line 1267 of yacc.c. */ #line 1934 "frame/xyparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (fr, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (fr, ll, yymsg); } else { yyerror (fr, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, fr, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, fr, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (fr, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, fr, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, fr, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 275 "frame/xyparser.Y" saods9/tksao1.0/frame/xyparser.H000644 000765 000000 00000010265 12553253032 017010 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, ANGDEGREE = 260, SEXSTR = 261, HMSSTR = 262, DMSSTR = 263, EOF_ = 264, AMPLIFIER_ = 265, B1950_ = 266, CCD_ = 267, DEBUG_ = 268, DETECTOR_ = 269, ECLIPTIC_ = 270, FK4_ = 271, FK4_NO_E_ = 272, FK5_ = 273, GALACTIC_ = 274, HELIOECLIPTIC_ = 275, ICRS_ = 276, IMAGE_ = 277, J2000_ = 278, LOGICAL_ = 279, OFF_ = 280, ON_ = 281, PHYSICAL_ = 282, SUPERGALACTIC_ = 283, VERSION_ = 284, WCS_ = 285, WCSA_ = 286, WCSB_ = 287, WCSC_ = 288, WCSD_ = 289, WCSE_ = 290, WCSF_ = 291, WCSG_ = 292, WCSH_ = 293, WCSI_ = 294, WCSJ_ = 295, WCSK_ = 296, WCSL_ = 297, WCSM_ = 298, WCSN_ = 299, WCSO_ = 300, WCSP_ = 301, WCSQ_ = 302, WCSR_ = 303, WCSS_ = 304, WCST_ = 305, WCSU_ = 306, WCSV_ = 307, WCSW_ = 308, WCSX_ = 309, WCSY_ = 310, WCSZ_ = 311 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define ANGDEGREE 260 #define SEXSTR 261 #define HMSSTR 262 #define DMSSTR 263 #define EOF_ 264 #define AMPLIFIER_ 265 #define B1950_ 266 #define CCD_ 267 #define DEBUG_ 268 #define DETECTOR_ 269 #define ECLIPTIC_ 270 #define FK4_ 271 #define FK4_NO_E_ 272 #define FK5_ 273 #define GALACTIC_ 274 #define HELIOECLIPTIC_ 275 #define ICRS_ 276 #define IMAGE_ 277 #define J2000_ 278 #define LOGICAL_ 279 #define OFF_ 280 #define ON_ 281 #define PHYSICAL_ 282 #define SUPERGALACTIC_ 283 #define VERSION_ 284 #define WCS_ 285 #define WCSA_ 286 #define WCSB_ 287 #define WCSC_ 288 #define WCSD_ 289 #define WCSE_ 290 #define WCSF_ 291 #define WCSG_ 292 #define WCSH_ 293 #define WCSI_ 294 #define WCSJ_ 295 #define WCSK_ 296 #define WCSL_ 297 #define WCSM_ 298 #define WCSN_ 299 #define WCSO_ 300 #define WCSP_ 301 #define WCSQ_ 302 #define WCSR_ 303 #define WCSS_ 304 #define WCST_ 305 #define WCSU_ 306 #define WCSV_ 307 #define WCSW_ 308 #define WCSX_ 309 #define WCSY_ 310 #define WCSZ_ 311 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 44 "frame/xyparser.Y" { #define XYBUFSIZE 2048 double real; int integer; char str[XYBUFSIZE]; double vector[3]; } /* Line 1529 of yacc.c. */ #line 169 "frame/xyparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/frame/xyparser.Y000644 000765 000000 00000012557 12537605764 017056 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {Base* fr} %lex-param {xyFlexLexer* ll} %parse-param {xyFlexLexer* ll} %{ #define YYDEBUG 1 #define FITSPTR (fr->findFits()) #include #include #include #include "base.h" #include "fitsimage.h" #include "basemarker.h" #undef yyFlexLexer #define yyFlexLexer xyFlexLexer #include extern int xylex(void*, xyFlexLexer*); extern void xyerror(Base*, xyFlexLexer*, const char*); static const char *color = "green"; static int dash[] = {8,3}; static const char *font = "helvetica 10 normal roman"; static const char *text = ""; static Coord::CoordSystem globalSystem; static Coord::SkyFrame globalSky; static Coord::CoordSystem localSystem; static Coord::SkyFrame localSky; static List taglist; static List cblist; %} %union { #define XYBUFSIZE 2048 double real; int integer; char str[XYBUFSIZE]; double vector[3]; } %type numeric %type sexagesimal %type hms %type dms %type coord %type coordSystem %type skyFrame %token INT %token REAL %token ANGDEGREE %token SEXSTR %token HMSSTR %token DMSSTR %token EOF_ %token AMPLIFIER_ %token B1950_ %token CCD_ %token DEBUG_ %token DETECTOR_ %token ECLIPTIC_ %token FK4_ %token FK4_NO_E_ %token FK5_ %token GALACTIC_ %token HELIOECLIPTIC_ %token ICRS_ %token IMAGE_ %token J2000_ %token LOGICAL_ %token OFF_ %token ON_ %token PHYSICAL_ %token SUPERGALACTIC_ %token VERSION_ %token WCS_ %token WCSA_ %token WCSB_ %token WCSC_ %token WCSD_ %token WCSE_ %token WCSF_ %token WCSG_ %token WCSH_ %token WCSI_ %token WCSJ_ %token WCSK_ %token WCSL_ %token WCSM_ %token WCSN_ %token WCSO_ %token WCSP_ %token WCSQ_ %token WCSR_ %token WCSS_ %token WCST_ %token WCSU_ %token WCSV_ %token WCSW_ %token WCSX_ %token WCSY_ %token WCSZ_ %% start : { globalSystem = fr->xySystem(); globalSky = fr->xySky(); } commands ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | VERSION_ {cerr << "X Y Format 1.0" << endl;} | coordSystem {globalSystem = (Coord::CoordSystem)$1;} | coordSystem skyFrame {globalSystem = (Coord::CoordSystem)$1; globalSky = (Coord::SkyFrame)$2;} | {localSystem = globalSystem; localSky = globalSky; maperr = 0;} shape comment ; comment : /* empty */ | junks ; junks : junks junk | junk ; junk : numeric {} ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; sp : /* empty */ | ',' ; sexagesimal: SEXSTR {$$ = parseSEXStr($1);} ; hms : HMSSTR {$$ = parseHMSStr($1);} ; dms : DMSSTR {$$ = parseDMSStr($1);} ; coord : sexagesimal sp sexagesimal { Vector r; if (localSky == Coord::GALACTIC || localSky == Coord::ECLIPTIC) r = FITSPTR->mapToRef(Vector($1,$3),localSystem,localSky); else r = FITSPTR->mapToRef(Vector($1*360./24.,$3),localSystem,localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | hms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3),localSystem,localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | dms sp dms { Vector r = FITSPTR->mapToRef(Vector($1,$3),localSystem,localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | numeric sp numeric { Vector r = FITSPTR->mapToRef(Vector($1,$3),localSystem,localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } | ANGDEGREE sp ANGDEGREE { Vector r = FITSPTR->mapToRef(Vector($1,$3),localSystem,localSky); $$[0] = r[0]; $$[1] = r[1]; $$[2] = r[2]; } ; coordSystem : IMAGE_ {$$ = Coord::IMAGE;} | LOGICAL_ {$$ = Coord::IMAGE;} | PHYSICAL_ {$$ = Coord::PHYSICAL;} | CCD_ {$$ = Coord::PHYSICAL;} | AMPLIFIER_ {$$ = Coord::AMPLIFIER;} | DETECTOR_ {$$ = Coord::DETECTOR;} | WCS_ {$$ = Coord::WCS;} | WCSA_ {$$ = Coord::WCSA;} | WCSB_ {$$ = Coord::WCSB;} | WCSC_ {$$ = Coord::WCSC;} | WCSD_ {$$ = Coord::WCSD;} | WCSE_ {$$ = Coord::WCSE;} | WCSF_ {$$ = Coord::WCSF;} | WCSG_ {$$ = Coord::WCSG;} | WCSH_ {$$ = Coord::WCSH;} | WCSI_ {$$ = Coord::WCSI;} | WCSJ_ {$$ = Coord::WCSJ;} | WCSK_ {$$ = Coord::WCSK;} | WCSL_ {$$ = Coord::WCSL;} | WCSM_ {$$ = Coord::WCSM;} | WCSN_ {$$ = Coord::WCSN;} | WCSO_ {$$ = Coord::WCSO;} | WCSP_ {$$ = Coord::WCSP;} | WCSQ_ {$$ = Coord::WCSQ;} | WCSR_ {$$ = Coord::WCSR;} | WCSS_ {$$ = Coord::WCSS;} | WCST_ {$$ = Coord::WCST;} | WCSU_ {$$ = Coord::WCSU;} | WCSV_ {$$ = Coord::WCSV;} | WCSW_ {$$ = Coord::WCSW;} | WCSX_ {$$ = Coord::WCSX;} | WCSY_ {$$ = Coord::WCSY;} | WCSZ_ {$$ = Coord::WCSZ;} ; skyFrame : FK4_ {$$ = Coord::FK4;} | B1950_ {$$ = Coord::FK4;} | FK4_NO_E_ {$$ = Coord::FK4_NO_E;} | FK5_ {$$ = Coord::FK5;} | J2000_ {$$ = Coord::FK5;} | ICRS_ {$$ = Coord::ICRS;} | GALACTIC_ {$$ = Coord::GALACTIC;} | SUPERGALACTIC_ {$$ = Coord::SUPERGALACTIC;} | ECLIPTIC_ {$$ = Coord::ECLIPTIC;} | HELIOECLIPTIC_ {$$ = Coord::HELIOECLIPTIC;} ; shape : coord {fr->createPointCmd(Vector($1), Point::BOXCIRCLE, POINTSIZE, color,dash,1,font,text, Marker::SELECT | Marker::EDIT | Marker::MOVE | Marker::ROTATE | Marker::DELETE | Marker::HIGHLITE | Marker::INCLUDE | Marker::SOURCE, "",taglist,cblist); } ; %% saods9/tksao1.0/fitsy++/alloc.C000644 000765 000000 00000001055 12464214754 016420 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "alloc.h" FitsAlloc::FitsAlloc(const char* fn) { parse(fn); if (!valid_) return; // we need the 'b' for windows... if (!strncmp(pName_, "stdin", 5) || !strncmp(pName_, "STDIN", 5) || !strncmp(pName_, "-", 1)) stream_ = fdopen(dup(fileno(stdin)), "rb"); else stream_ = fopen(pName_, "rb"); valid_ = stream_ ? 1 : 0; } saods9/tksao1.0/fitsy++/alloc.h000644 000765 000000 00000002635 12464214754 016472 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsalloc_h__ #define __fitsalloc_h__ #include "strm.h" class FitsAlloc : public virtual FitsStream { public: FitsAlloc(const char*); virtual ~FitsAlloc() {} }; class FitsFitsAlloc : public FitsAlloc, public FitsFitsStream { public: FitsFitsAlloc(const char* fn, ScanMode mode, FlushMode flush) : FitsAlloc(fn), FitsFitsStream(mode, flush) {} }; class FitsFitsNextAlloc : public FitsFitsNextStream { public: FitsFitsNextAlloc(FitsFile* prev) : FitsFitsNextStream(prev) {} }; class FitsArrAlloc : public FitsAlloc, FitsArrStream { public: FitsArrAlloc(const char* fn, FlushMode flush) : FitsAlloc(fn), FitsArrStream(flush) {} }; class FitsNRRDAlloc : public FitsAlloc, FitsNRRDStream { public: FitsNRRDAlloc(const char* fn, FlushMode flush) : FitsAlloc(fn), FitsNRRDStream(flush) {} }; class FitsMosaicAlloc : public FitsAlloc, FitsMosaicStream { public: FitsMosaicAlloc(const char* fn, FlushMode flush) : FitsAlloc(fn), FitsMosaicStream(flush) {} }; class FitsMosaicNextAlloc : public FitsMosaicNextStream { public: FitsMosaicNextAlloc(FitsFile* prev, FlushMode flush) : FitsMosaicNextStream(prev, flush) {} }; #endif saods9/tksao1.0/fitsy++/allocgz.C000644 000765 000000 00000001065 12464214754 016762 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "allocgz.h" FitsAllocGZ::FitsAllocGZ(const char* fn) { parse(fn); if (!valid_) return; // we need the 'b' for windows... if (!strncmp(pName_, "stdin", 5) || !strncmp(pName_, "STDIN", 5) || !strncmp(pName_, "-", 1)) stream_ = gzdopen(dup(STDIN_FILENO), "rb"); else stream_ = gzopen(pName_, "rb"); valid_ = stream_ ? 1 : 0; } saods9/tksao1.0/fitsy++/allocgz.h000644 000765 000000 00000002461 12464214754 017030 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsallocgz_h__ #define __fitsallocgz_h__ #include "strm.h" #include "zlib.h" class FitsAllocGZ : public virtual FitsStream { public: FitsAllocGZ(const char*); virtual ~FitsAllocGZ() {} }; class FitsFitsAllocGZ : public FitsAllocGZ, public FitsFitsStream { public: FitsFitsAllocGZ(const char* fn, ScanMode mode, FlushMode flush) : FitsAllocGZ(fn), FitsFitsStream(mode, flush) {} }; class FitsFitsNextAllocGZ : public FitsFitsNextStream { public: FitsFitsNextAllocGZ(FitsFile* prev) : FitsFitsNextStream(prev) {} }; class FitsArrAllocGZ : public FitsAllocGZ, FitsArrStream { public: FitsArrAllocGZ(const char* fn, FlushMode flush) : FitsAllocGZ(fn), FitsArrStream(flush) {} }; class FitsMosaicAllocGZ : public FitsAllocGZ, FitsMosaicStream { public: FitsMosaicAllocGZ(const char* fn, FlushMode flush) : FitsAllocGZ(fn), FitsMosaicStream(flush) {} }; class FitsMosaicNextAllocGZ : public FitsMosaicNextStream { public: FitsMosaicNextAllocGZ(FitsFile* prev, FlushMode flush) : FitsMosaicNextStream(prev, flush) {} }; #endif saods9/tksao1.0/fitsy++/analysis.C000644 000765 000000 00000002134 12464214754 017150 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "analysis.h" FitsAnalysis::FitsAnalysis(FitsFile* src) { primary_ = src->primary(); managePrimary_ = 0; head_ = new FitsHead(*(src->head())); manageHead_ = 1; ext_ = src->ext(); inherit_ = src->inherit(); // change bitpix to double head_->setInteger("BITPIX", -64, ""); // unset BZERO/BSCALE if present if (head_->find("BZERO")) head_->setReal("BZERO",0,2,NULL); if (head_->find("BSCALE")) head_->setReal("BSCALE",1,2,NULL); head_->updateHDU(); int width = head_->naxis(0); int height = head_->naxis(1); // alloc memory size_t size = (size_t)width*height; data_ = new double[size]; if (!data_) return; dataSize_ = size; dataSkip_ = 0; // clear memory memset(data_, 0, size*sizeof(double)); // made it this far, must be valid byteswap_ = 0; endian_ = lsb() ? LITTLE : BIG; valid_ = 1; } FitsAnalysis::~FitsAnalysis() { if (data_) delete [] (char*)data_; } saods9/tksao1.0/fitsy++/analysis.h000644 000765 000000 00000000532 12464214754 017215 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsanalysis_h__ #define __fitsanalysis_h__ #include "file.h" class FitsAnalysis : public FitsFile { public: FitsAnalysis(FitsFile*); ~FitsAnalysis(); }; #endif saods9/tksao1.0/fitsy++/block.C000644 000765 000000 00000015276 12516225422 016422 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "block.h" FitsBlock::FitsBlock(FitsFile* fits, Vector& block) { FitsHead* srcHead = fits->head(); width_ = srcHead->naxis(0)/block[0]; height_ = srcHead->naxis(1)/block[1]; if (width_<1) width_ = 1; if (height_<1) height_ = 1; size_ = (size_t)width_*height_; primary_ = fits->primary(); ext_ = fits->ext(); inherit_ = fits->inherit(); bitpix_ = srcHead->hdu()->bitpix(); switch (bitpix_) { case -64: if (!(data_ = new double[size_])) return; dataSize_ = size_*sizeof(double); break; default: bitpix_ = -32; if (!(data_ = new float[size_])) return; dataSize_ = size_*sizeof(float); break; } dataSkip_ = 0; memset(data_, 0, dataSize_); initHeader(fits, block); // made it this far, must be valid byteswap_ = 0; endian_ = lsb() ? LITTLE : BIG; valid_ = 1; } FitsBlock::~FitsBlock() { if (data_) delete [] (char*)data_; } void FitsBlock::initHeader(FitsFile* fits, Vector& block) { head_ = new FitsHead(*(fits->head())); // change bitpix switch (bitpix_) { case -64: head_->setInteger("BITPIX", -64, ""); break; default: head_->setInteger("BITPIX", -32, ""); break; } // change width/height head_->setInteger("NAXIS1", width_, ""); head_->setInteger("NAXIS2", height_, ""); // IRAF initLTMV(block); initCCDSUM(block); initKeySEC("BIASSEC",block); initKeySEC("DATASEC",block); initKeySEC("TRIMSEC",block); // WCS initWCS(block); // clear cards if (head_->find("BZERO")) head_->carddel("BZERO"); if (head_->find("BSCALE")) head_->carddel("BSCALE"); if (head_->find("DATASUM")) head_->carddel("DATASUM"); if (head_->find("CHECKSUM")) head_->carddel("CHECKSUM"); if (head_->find("DATAMIN")) head_->carddel("DATAMIN"); if (head_->find("DATAMAX")) head_->carddel("DATAMAX"); if (head_->find("DATAMEAN")) head_->carddel("DATAMEAN"); if (head_->find("GOODMIN")) head_->carddel("GOODMIN"); if (head_->find("GOODMAX")) head_->carddel("GOODMAX"); if (head_->find("IRAF-MIN")) head_->carddel("IRAF-MIN"); if (head_->find("IRAF-MAX")) head_->carddel("IRAF-MAX"); head_->updateHDU(); } void FitsBlock::initCCDSUM(Vector& block) { if (head_->find("CCDSUM")) { char* val = head_->getString("CCDSUM"); float xx,yy; istringstream istr(val); istr >> xx >> yy; xx *= block[0]; yy *= block[1]; ostringstream ostr; ostr << xx << ' ' << yy << ends; head_->setString("CCDSUM", ostr.str().c_str(), ""); } } void FitsBlock::initKeySEC(const char* key, Vector& block) { if (head_->find(key)) { char* sec = head_->getString(key); Vector ll,ur; parseSection(sec,&ll,&ur); Matrix mm = Translate(-1,-1) * Scale(1/block[0],1/block[1]) * Translate(1,1); Vector nll = ll*mm; Vector nur = ur*mm; ostringstream ostr; ostr << '[' << int(nll[0]) << ':' << int(nur[0]) << ',' << int(nll[1]) << ':' << int(nur[1]) << ']' << ends; head_->setString(key, ostr.str().c_str(), ""); } } void FitsBlock::initLTMV(Vector& block) { // always do LTMV double ltv1 = head_->getReal("LTV1", 0); double ltv2 = head_->getReal("LTV2", 0); double ltm11 = head_->getReal("LTM1_1", 1); double ltm12 = head_->getReal("LTM1_2", 0); double ltm21 = head_->getReal("LTM2_1", 0); double ltm22 = head_->getReal("LTM2_2", 1); Matrix mm(ltm11,ltm12,ltm21,ltm22,ltv1,ltv2); Matrix im = mm * Translate(-.5,-.5) * Scale(1./block[0],1./block[1]) * Translate(.5,.5); if (head_->find("LTV1")) head_->setReal("LTV1", im.matrix(2,0), 8, ""); else head_->appendReal("LTV1", im.matrix(2,0), 8, ""); if (head_->find("LTV2")) head_->setReal("LTV2", im.matrix(2,1), 8, ""); else head_->appendReal("LTV2", im.matrix(2,1), 8, ""); if (head_->find("LTM1_1")) head_->setReal("LTM1_1", ltm11/block[0], 8, ""); else head_->appendReal("LTM1_1", ltm11/block[0], 8, ""); if (head_->find("LTM1_2")) head_->setReal("LTM1_2", ltm12, 8, ""); else head_->appendReal("LTM1_2", ltm12, 8, ""); if (head_->find("LTM2_1")) head_->setReal("LTM2_1", ltm21, 8, ""); else head_->appendReal("LTM2_1", ltm21, 8, ""); if (head_->find("LTM2_2")) head_->setReal("LTM2_2", ltm22/block[1], 8, ""); else head_->appendReal("LTM2_2", ltm22/block[1], 8, ""); } void FitsBlock::initWCS(Vector& block) { // check for WCS if (!head_->find("CRPIX1") && !head_->find("CRPIX2")) return; double crpix1 = head_->getReal("CRPIX1", 0); double crpix2 = head_->getReal("CRPIX2", 0); Matrix pp = Matrix(1,0,0,1,crpix1,crpix2) * Translate(-.5,-.5) * Scale(1/block[0],1/block[1]) * Translate(.5,.5); if (head_->find("CRPIX1")) head_->setReal("CRPIX1", pp.matrix(2,0), 8, ""); else head_->appendReal("CRPIX1", pp.matrix(2,0), 8, ""); if (head_->find("CRPIX2")) head_->setReal("CRPIX2", pp.matrix(2,1), 8, ""); else head_->appendReal("CRPIX2", pp.matrix(2,1), 8, ""); // CD if (head_->find("CD1_1") || head_->find("CD1_2") || head_->find("CD2_1") || head_->find("CD2_2")) { double cd11 = head_->getReal("CD1_1", 1); double cd12 = head_->getReal("CD1_2", 0); double cd21 = head_->getReal("CD2_1", 0); double cd22 = head_->getReal("CD2_2", 1); Matrix mm = Matrix(cd11,cd12,cd21,cd22,0,0) * Scale(block[0],block[1]); if (head_->find("CD1_1")) head_->setReal("CD1_1", mm.matrix(0,0), 8, ""); else head_->appendReal("CD1_1", mm.matrix(0,0), 8, ""); if (head_->find("CD1_2")) head_->setReal("CD1_2", mm.matrix(0,1), 8, ""); else head_->appendReal("CD1_2", mm.matrix(0,1), 8, ""); if (head_->find("CD2_1")) head_->setReal("CD2_1", mm.matrix(1,0), 8, ""); else head_->appendReal("CD2_1", mm.matrix(1,0), 8, ""); if (head_->find("CD2_2")) head_->setReal("CD2_2", mm.matrix(1,1), 8, ""); else head_->appendReal("CD2_2", mm.matrix(1,1), 8, ""); } // CDELT else if (head_->find("CDELT1") || head_->find("CDELT2")) { double cdelt1 = head_->getReal("CDELT1", 1); double cdelt2 = head_->getReal("CDELT2", 0); Matrix mm = Matrix(cdelt1,0,0,cdelt2,0,0) * Scale(block[0],block[1]); if (head_->find("CDELT1")) head_->setReal("CDELT1", mm.matrix(0,0), 8, ""); else head_->appendReal("CDELT1", mm.matrix(0,0), 8, ""); if (head_->find("CDELT2")) head_->setReal("CDELT2", mm.matrix(1,1), 8, ""); else head_->appendReal("CDELT2", mm.matrix(1,1), 8, ""); } } saods9/tksao1.0/fitsy++/block.h000644 000765 000000 00000001123 12464214754 016461 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsblock_h__ #define __fitsblock_h__ #include "vector.h" #include "file.h" class FitsBlock : public FitsFile { protected: int width_; int height_; size_t size_; int bitpix_; void initHeader(FitsFile*, Vector&); void initCCDSUM(Vector&); void initKeySEC(const char*, Vector&); void initLTMV(Vector&); void initWCS(Vector&); public: FitsBlock(FitsFile*, Vector&); ~FitsBlock(); }; #endif saods9/tksao1.0/fitsy++/card.C000644 000765 000000 00000012432 12464214754 016240 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "card.h" FitsCard::FitsCard() { card_ = new char[FTY_CARDLEN]; managed = 1; } FitsCard::FitsCard(char* c) { card_ = c; managed = 0; } FitsCard::FitsCard(const FitsCard& a) { card_ = new char[FTY_CARDLEN]; managed = 1; memcpy(card_, a.card_, FTY_CARDLEN); } FitsCard::~FitsCard() { if (managed) delete [] card_; } FitsCard& FitsCard::operator=(const FitsCard& a) { memcpy(card_, a.card_, FTY_CARDLEN); return *this; } FitsCard& FitsCard::clear() { memset(card_, ' ', FTY_CARDLEN); return *this; } FitsCard& FitsCard::setKey(const char* name) { if (name) { memset(card_, ' ', 8); ostringstream str; str << name; memcpy(card_,str.str().c_str(),str.str().length()); } return *this; } FitsCard& FitsCard::setLogical(const char* name, int value, const char* comment) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= " << (value ? 'T' : 'F'); if (comment) str << " / " << comment; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } FitsCard& FitsCard::setInteger(const char* name, int value, const char* comment) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= " << setw(20) << value; if (comment) str << " / " << comment; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } FitsCard& FitsCard::setReal(const char* name, double value, int prec, const char* comment) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= " << setw(20) << setprecision(prec) << value; if (comment) str << " / " << comment; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } FitsCard& FitsCard::setComplex(const char* name, double real, double img, int prec, const char* comment) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= " << setw(20) << setprecision(prec) << real << img; if (comment) str << " / " << comment; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } FitsCard& FitsCard::setString(const char* name, const char* value, const char* comment) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= '" << value << '\''; if (comment) str << " / " << comment; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } FitsCard& FitsCard::setComment(const char* name, const char* value) { setKey(name); memset(card_+8, ' ', FTY_CARDLEN-8); ostringstream str; str << "= " << value; memcpy(card_+8,str.str().c_str(),str.str().length()); return *this; } int FitsCard::getLogical() { for (int i=10; i<80; i++) if (card_[i] != ' ') return (card_[i] == 'T' || card_[i] == 't'); return 0; } int FitsCard::getInteger() { string x(card_+10,FTY_CARDLEN-10); istringstream str(x); int r; str >> r; return r; } double FitsCard::getReal() { // support 'D' as well as 'E' format char buf[FTY_CARDLEN-10+1]; memcpy(buf, card_+10, FTY_CARDLEN-10); buf[FTY_CARDLEN-10] = '\0'; char* ptr = buf; while (*ptr && *ptr != '/') { if (*ptr == 'D' || *ptr == 'E') { *ptr = 'E'; break; } ptr++; } string x(buf,FTY_CARDLEN-10); istringstream str(x); double r; str >> r; return r; } void FitsCard::getComplex(double* r, double* i) { // support 'D' as well as 'E' format char buf[FTY_CARDLEN-10+1]; memcpy(buf, card_+10, FTY_CARDLEN-10); buf[FTY_CARDLEN-10] = '\0'; char* ptr = buf; while (*ptr && *ptr != '/') { if (*ptr == 'D' || *ptr == 'E') { *ptr = 'E'; } ptr++; } string x(buf,FTY_CARDLEN-10); istringstream str(x); str >> *r >> *i; } char* FitsCard::getString() { char value[FTY_CARDLEN]; value[0] = '\0'; value[FTY_CARDLEN-1] = '\0'; int i,j; // find first ' for (i=10; i #include #include #include using namespace std; class FitsCard { private: char* card_; int managed; public: FitsCard(); FitsCard(char*); FitsCard(const FitsCard&); ~FitsCard(); FitsCard& operator=(const FitsCard&); char* card() {return card_;} FitsCard& clear(); FitsCard& setKey(const char *name); FitsCard& setLogical(const char* name, int value, const char* comment); FitsCard& setLogical(int value, const char *comment) {return setLogical(NULL, value, comment);} FitsCard& setInteger(const char* name, int value, const char *comment); FitsCard& setInteger(int value, const char *comment) {return setInteger(NULL, value, comment);} FitsCard& setReal(const char* name, double value, int prec, const char *comment); FitsCard& setReal(double value, int prec, const char *comment) {return setReal(NULL, value, prec, comment);} FitsCard& setComplex(const char* name, double real, double img, int prec, const char *comment); FitsCard& setComplex(double real, double img, int prec, const char *comment) {return setComplex(NULL, real, img, prec, comment);} FitsCard& setString(const char* name, const char *value, const char *comm); FitsCard& setString(const char *value, const char *comment) {return setString(NULL, value, comment);} FitsCard& setComment(const char* name, const char* value); FitsCard& setComment(const char *value) {return setComment(NULL, value);} int getLogical(); int getInteger(); double getReal(); void getComplex(double*, double*); char* getString(); char* getComment(); char* getAsString(); }; #endif saods9/tksao1.0/fitsy++/channel.C000644 000765 000000 00000000664 12464214754 016743 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "channel.h" FitsChannel::FitsChannel(Tcl_Interp* interp, const char* ch, const char* ext) { parse(ext); if (!valid_) return; int tclMode; stream_ = Tcl_GetChannel(interp, (char*)ch, &tclMode); valid_ = stream_ ? 1 : 0; } saods9/tksao1.0/fitsy++/channel.h000644 000765 000000 00000003337 12464214754 017010 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitschannel_h__ #define __fitschannel_h__ #include "strm.h" class FitsChannel : public virtual FitsStream { public: FitsChannel(Tcl_Interp*, const char*, const char*); }; class FitsFitsChannel : public FitsChannel, public FitsFitsStream{ public: FitsFitsChannel(Tcl_Interp* interp, const char* ch, const char* ext, ScanMode mode, FlushMode flush) : FitsChannel(interp, ch, ext), FitsFitsStream(mode, flush) {} }; class FitsFitsNextChannel : public FitsFitsNextStream { public: FitsFitsNextChannel(FitsFile* prev) : FitsFitsNextStream(prev) {} }; class FitsArrChannel : public FitsChannel, FitsArrStream { public: FitsArrChannel(Tcl_Interp* interp, const char* ch, const char* ext, FlushMode flush) : FitsChannel(interp, ch, ext), FitsArrStream(flush) {} }; class FitsNRRDChannel : public FitsChannel, FitsNRRDStream { public: FitsNRRDChannel(Tcl_Interp* interp, const char* ch, const char* ext, FlushMode flush) : FitsChannel(interp, ch, ext), FitsNRRDStream(flush) {} }; class FitsMosaicChannel : public FitsChannel, FitsMosaicStream { public: FitsMosaicChannel(Tcl_Interp* interp, const char* ch, FlushMode flush) : FitsChannel(interp, ch, ""), FitsMosaicStream(flush) {} }; class FitsMosaicNextChannel : public FitsMosaicNextStream { public: FitsMosaicNextChannel(FitsFile* prev, FlushMode flush) : FitsMosaicNextStream(prev, flush) {} }; #endif saods9/tksao1.0/fitsy++/column.C000644 000765 000000 00000030307 12464522311 016614 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include #include #include #include #include #include using namespace std; #include "column.h" #include "file.h" #include "head.h" FitsColumn::FitsColumn(FitsHead* head, int i, int off) { index_ = i; width_ = 0; offset_ = off; type_ = ' '; tform_ = head->getString(keycat("TFORM",i)); ttype_ = head->getString(keycat("TTYPE",i)); tunit_ = head->getString(keycat("TUNIT",i)); tscal_ = head->getReal(keycat("TSCAL",i), 1); tzero_ = head->getReal(keycat("TZERO",i), 0); hastnull_ = head->find(keycat("TNULL",i)) ? 1:0; tnull_ = head->getInteger(keycat("TNULL",i), 0); char* td = head->find(keycat("TDMAX",i)); char* tl = head->find(keycat("TLMAX",i)); char* ta = head->find(keycat("TALEN",i)); char* ax = head->find(keycat("AXLEN",i)); // this provides backward compatibility if (td) { hastlmin_ = head->find(keycat("TDMIN",i)) ? 1:0; hastlmax_ = 1; tlmin_ = head->getReal(keycat("TDMIN",i), 0); tlmax_ = head->getReal(keycat("TDMAX",i), 0); } else if (tl) { hastlmin_ = head->find(keycat("TLMIN",i)) ? 1:0; hastlmax_ = 1; tlmin_ = head->getReal(keycat("TLMIN",i), 0); tlmax_ = head->getReal(keycat("TLMAX",i), 0); } else if (ta) { hastlmin_ = 0; hastlmax_ = 1; tlmin_ = 1; tlmax_ = head->getReal(keycat("TALEN",i), 0); } else if (ax) { hastlmin_ = 0; hastlmax_ = 1; tlmin_ = 1; tlmax_ = head->getReal(keycat("AXLEN",i), 0); } else { hastlmin_ = 0; hastlmax_ = 0; tlmin_ = 0; tlmax_ = 0; } // now, make sure they are valid if (tlmin_>tlmax_) { hastlmin_ = 0; hastlmax_ = 0; tlmin_ = 0; tlmax_ = 0; } // use tlmin/tlmax if available if (hastlmin_ || hastlmax_) { min_ = tlmin_; max_ = tlmax_; } else { min_ = -DBL_MAX; max_ = DBL_MAX; } } FitsColumn::~FitsColumn() { if (tform_) delete [] tform_; if (tunit_) delete [] tunit_; if (ttype_) delete [] ttype_; } char* FitsColumn::keycat(const char* name, int i) { ostringstream str; str << name << i << ends; memcpy(keybuf,str.str().c_str(),str.str().length()); return keybuf; } // FitsAsciiColumn FitsAsciiColumn::FitsAsciiColumn(FitsHead* head, int i, int offset) : FitsColumn(head, i, offset) { int tbcol = head->getInteger(keycat("TBCOL",i),0); if (tbcol) offset_ = tbcol-1; } char* FitsAsciiColumn::str(const char* ptr, int i) { strncpy(buf_, ptr+offset_, width_); buf_[width_] = '\0'; return buf_; } FitsAsciiColumnStr::FitsAsciiColumnStr(FitsHead* head, int i, int offset) : FitsAsciiColumn(head, i, offset) { if (tform_) { string x(tform_); istringstream str(x); str >> type_ >> width_; } } FitsAsciiColumnA::FitsAsciiColumnA(FitsHead* head, int i, int offset) : FitsAsciiColumn(head, i, offset) { prec_ = 0; if (tform_) { char s; string x(tform_); istringstream str(x); str >> type_ >> width_ >> s >> prec_; } } double FitsAsciiColumnA::value(const char* ptr, int i) { string x(ptr+offset_); istringstream str(x); double r; str >> r; return r; } template FitsAsciiColumnT::FitsAsciiColumnT(FitsHead* head, int i, int off) : FitsAsciiColumnA(head, i, off) {} template <> Vector FitsAsciiColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_,tlmax_) : Vector(INT_MIN,INT_MAX); } template <> Vector FitsAsciiColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_,tlmax_) : Vector(-FLT_MAX,FLT_MAX); } template <> Vector FitsAsciiColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_,tlmax_) : Vector(-DBL_MAX,DBL_MAX); } // FitsBinColumn FitsBinColumn::FitsBinColumn(FitsHead* head, int i, int offset) : FitsColumn(head, i, offset) { tdisp_ = head->getString(keycat("TDISP",i)); repeat_ = 1; if (tform_) { string x(tform_); istringstream str(x); if (isalpha(tform_[0])) str >> type_; else str >> repeat_ >> type_; } } FitsBinColumn::~FitsBinColumn() { if (tdisp_) delete [] tdisp_; } // FitsBinColumnStr FitsBinColumnStr::FitsBinColumnStr(FitsHead* head, int i, int offset) : FitsBinColumn(head, i, offset) { width_ = repeat_; } char* FitsBinColumnStr::str(const char* ptr, int i) { strncpy(buf_, ptr+offset_, width_); buf_[width_] = '\0'; return buf_; } // FitsBinColumnLogical FitsBinColumnLogical::FitsBinColumnLogical(FitsHead* head, int i, int offset) : FitsBinColumn(head, i, offset) { width_ = repeat_; } char* FitsBinColumnLogical::str(const char* ptr, int i) { strncpy(buf_, ptr+offset_+i, 1); buf_[width_] = '\0'; return buf_; } // FitsBinColumnArray FitsBinColumnArray::FitsBinColumnArray(FitsHead* head, int i, int offset) : FitsBinColumn(head, i, offset) { ptype_ = ' '; psize_ = 1; pmax_ = 1; abuf_ = NULL; byteswap_ = lsb(); if (tform_) { int rr; char tt; string x(tform_); istringstream str(x); if (isalpha(tform_[0])) str >> tt; else str >> rr >> tt; char s; str >> ptype_ >> s >> pmax_ >> s; switch (ptype_) { case 'L': psize_ = 1; break; case 'X': psize_ = 1; break; case 'B': psize_ = 1; break; case 'I': psize_ = 2; break; case 'J': psize_ = 4; break; case 'K': psize_ = 8; break; case 'A': psize_ = 1; break; case 'E': psize_ = 4; break; case 'D': psize_ = 8; break; case 'C': psize_ = 8; break; case 'M': psize_ = 16; break; default: internalError("Fitsy++ column unknown table column type."); return; } // sanity check pmax_ *= psize_; if (pmax_ > 0) abuf_ = new char[pmax_]; } } FitsBinColumnArray::~FitsBinColumnArray() { if (abuf_) delete [] abuf_; } void* FitsBinColumnArray::get(const char* heap, const char* ptr, int* cnt) { *cnt = swap(ptr,0); if (*cnt > pmax_) { // just in case internalError("Fitsy++ column variable array size greater than specified"); *cnt = pmax_; } size_t pp = swap(ptr,1); if (abuf_) { memset(abuf_,pmax_,0); memcpy(abuf_,heap+pp,(*cnt)*psize_); } return abuf_; } FitsBinColumnArrayP::FitsBinColumnArrayP(FitsHead* head, int i, int offset) : FitsBinColumnArray(head, i, offset) { width_ = 8; } int FitsBinColumnArrayP::swap(const char* ptr, int i) { const char* p = ptr+offset_+i*4; union { char c[4]; int i; } u; if (byteswap_) { u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,4); return u.i; } FitsBinColumnArrayQ::FitsBinColumnArrayQ(FitsHead* head, int i, int offset) : FitsBinColumnArray(head, i, offset) { width_ = 16; } int FitsBinColumnArrayQ::swap(const char* ptr, int i) { const char* p = ptr+offset_+i*8; union { char c[8]; long l; } u; if (byteswap_) { u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,8); return u.l; } // FitsbinColumnBit FitsBinColumnBit::FitsBinColumnBit(FitsHead* head, int i, int off) : FitsBinColumn(head, i, off) { width_ = (repeat_+7)/8; } // FitsBinColumnB FitsBinColumnB::FitsBinColumnB(FitsHead* head, int i, int offset) : FitsBinColumn(head, i, offset) { byteswap_ = lsb(); } // FitsBinColumnT template FitsBinColumnT::FitsBinColumnT(FitsHead* head, int i, int off) : FitsBinColumnB(head, i, off) { width_ = repeat_ * sizeof(T); } template <> double FitsBinColumnT::value(const char* ptr, int i) { return (unsigned char)(*(ptr+offset_+i)); } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*2; union { char c[2]; short s; } u; if (byteswap_) { u.c[1] = *p++; u.c[0] = *p; } else { u.c[0] = *p++; u.c[1] = *p; } return u.s; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*2; union { char c[2]; unsigned short s; } u; if (byteswap_) { u.c[1] = *p++; u.c[0] = *p; } else { u.c[0] = *p++; u.c[1] = *p; } return u.s; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*4; union { char c[4]; int i; } u; if (byteswap_) { u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,4); return u.i; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*4; union { char c[4]; unsigned int i; } u; if (byteswap_) { u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,4); return u.i; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*8; union { char c[8]; long long i; } u; if (byteswap_) { u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,8); return u.i; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*4; union { char c[4]; float f; } u; if (byteswap_) { u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,4); return u.f; } template <> double FitsBinColumnT::value(const char* ptr, int i) { const char* p = ptr+offset_+i*8; union { char c[8]; double d; } u; if (byteswap_) { u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; } else memcpy(u.c,p,8); return u.d; } template char* FitsBinColumnT::str(const char* ptr, int i) { ostringstream ost; ost << value(ptr,i) << ends; return (char*)ost.str().c_str(); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(0,UCHAR_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(SHRT_MIN,SHRT_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(0,USHRT_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(INT_MIN,INT_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(0,UINT_MAX); } // some older versions of gcc do not have LLONG #ifndef LLONG_MIN # ifdef LONG_LONG_MIN # define LLONG_MIN LONG_LONG_MIN # else # define LLONG_MIN LONG_MIN # endif #endif #ifndef LLONG_MAX # ifdef LONG_LONG_MAX # define LLONG_MAX LONG_LONG_MAX # else # define LLONG_MAX LONG_MAX # endif #endif template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_-.5,tlmax_+.5) : Vector(LLONG_MIN,LLONG_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_,tlmax_) : Vector(-FLT_MAX,FLT_MAX); } template <> Vector FitsBinColumnT::dimension() { return (hastlmin_ || hastlmax_) ? Vector(tlmin_,tlmax_) : Vector(-DBL_MAX,DBL_MAX); } template class FitsAsciiColumnT; template class FitsAsciiColumnT; template class FitsAsciiColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; template class FitsBinColumnT; saods9/tksao1.0/fitsy++/column.h000644 000765 000000 00000010014 12464522311 016652 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitscolumn_h__ #define __fitscolumn_h__ #include "vector.h" class FitsHead; class FitsColumn { protected: int index_; // col number 1 to n int width_; // overall width of field in chars int offset_; // offset in chars from start of row char type_; // type char* tform_; char* ttype_; char* tunit_; float tscal_; float tzero_; int tnull_; int hastnull_; float tlmin_; float tlmax_; int hastlmin_; int hastlmax_; double min_; double max_; int validmm_; char buf_[128]; char keybuf[9]; char* keycat(const char*, int); public: FitsColumn(FitsHead*, int, int); virtual ~FitsColumn(); int width() {return width_;} int offset() {return offset_;} int index() {return index_;} const char* tform() {return tform_;} const char* ttype() {return ttype_;} const char* tunit() {return tunit_;} float tscal() {return tscal_;} float tzero() {return tzero_;} int tnull() {return tnull_;} float tlmin() {return tlmin_;} float tlmax() {return tlmax_;} int hasscaling() {return tscal_ != 1 || tzero_ != 0;} int hastnull() {return hastnull_;} virtual double value(const char* ptr, int i =0) {return 0;} virtual char* str(const char* ptr, int i =0) {return NULL;} virtual Vector dimension() {return Vector();} virtual int repeat() {return 1;} void setMin(double m) {min_=m;} void setMax(double m) {max_=m;} double getMin() {return min_;} double getMax() {return max_;} int hasMinMax() {return min_ != -DBL_MAX ? 1 : 0;} int hasTLMinTLMax() {return hastlmin_ && hastlmax_;} }; // FitsAsciiColumn class FitsAsciiColumn : public FitsColumn { public: FitsAsciiColumn(FitsHead*, int, int); char* str(const char* ptr, int i =0); }; class FitsAsciiColumnStr : public FitsAsciiColumn { public: FitsAsciiColumnStr(FitsHead*, int, int); }; class FitsAsciiColumnA : public FitsAsciiColumn { private: int prec_; public: FitsAsciiColumnA(FitsHead*, int, int); double value(const char*, int i =0); }; template class FitsAsciiColumnT : public FitsAsciiColumnA { public: FitsAsciiColumnT(FitsHead*, int, int); Vector dimension(); }; // FitsBinColumn class FitsBinColumn : public FitsColumn { protected: char* tdisp_; int repeat_; // repeat count public: FitsBinColumn(FitsHead*, int, int); ~FitsBinColumn(); int repeat() {return repeat_;} }; class FitsBinColumnStr : public FitsBinColumn { public: FitsBinColumnStr(FitsHead*, int, int); char* str(const char* ptr, int i =0); }; class FitsBinColumnLogical : public FitsBinColumn { public: FitsBinColumnLogical(FitsHead*, int, int); double value(const char* ptr, int i =0) {return (*(ptr+offset_+i) == 'T') ? 1 : 0;} char* str(const char* ptr, int i =0); }; class FitsBinColumnArray : public FitsBinColumn { protected: int byteswap_; char ptype_; int psize_; int pmax_; char* abuf_; virtual int swap(const char* ptr, int i =0) =0; public: FitsBinColumnArray(FitsHead*, int, int); virtual ~FitsBinColumnArray(); virtual void* get(const char* heap, const char* ptr, int* cnt); }; class FitsBinColumnArrayP : public FitsBinColumnArray { protected: int swap(const char* ptr, int i =0); public: FitsBinColumnArrayP(FitsHead*, int, int); }; class FitsBinColumnArrayQ : public FitsBinColumnArray { protected: int swap(const char* ptr, int i =0); public: FitsBinColumnArrayQ(FitsHead*, int, int); }; class FitsBinColumnBit : public FitsBinColumn { public: FitsBinColumnBit(FitsHead*, int, int); }; class FitsBinColumnB : public FitsBinColumn { protected: int byteswap_; public: FitsBinColumnB(FitsHead*, int, int); }; template class FitsBinColumnT : public FitsBinColumnB { private: T swap(T*); public: FitsBinColumnT(FitsHead*, int, int); double value(const char*, int i =0); char* str(const char* ptr, int i =0); Vector dimension(); }; #endif saods9/tksao1.0/fitsy++/compress.C000644 000765 000000 00000045104 12552014473 017156 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "compress.h" #include "head.h" #include "zlib.h" #include "util.h" FitsCompress::FitsCompress(FitsFile* fits) { bitpix_ = fits->getInteger("ZBITPIX",0); type_ = fits->getString("ZCMPTYPE"); // int naxes = fits->getInteger("ZNAXIS",0); width_ = fits->getInteger("ZNAXIS1",0); height_ = fits->getInteger("ZNAXIS2",0); depth_ = fits->getInteger("ZNAXIS3",1); ww_ = fits->getInteger("ZTILE1",width_); hh_ = fits->getInteger("ZTILE2",1); dd_ = fits->getInteger("ZTILE3",1); bscale_ = fits->getReal("ZSCALE",1); bzero_ = fits->getReal("ZZERO",0); blank_ = fits->getInteger("ZBLANK",0); zmaskcmp_ = fits->getString("ZMASKCMP"); quantize_ = NODITHER; char keyword[] = "ZQUANTIZ"; if (fits->find(keyword)) { char* which = fits->getString(keyword); if (!strncmp(which,"NONE",4)) quantize_ = NODITHER; else if (!strncmp(which,"SUBTRACTIVE_DITHER_1",20)) quantize_ = SUBDITHER1; else if (!strncmp(which,"SUBTRACTIVE_DITHER_2",20)) quantize_ = SUBDITHER2; delete [] which; } quantOffset_ = fits->getInteger("ZDITHER0",1); tilesize_ = (size_t)ww_*hh_*dd_; size_ = (size_t)width_*height_*depth_; FitsHead* srcHead = fits->head(); FitsTableHDU* srcHDU = (FitsTableHDU*)(srcHead->hdu()); uncompress_ = srcHDU->find("UNCOMPRESSED_DATA"); gzcompress_ = srcHDU->find("GZIP_COMPRESSED_DATA"); compress_ = srcHDU->find("COMPRESSED_DATA"); zscale_ = srcHDU->find("ZSCALE"); zzero_ = srcHDU->find("ZZERO"); zblank_ = srcHDU->find("ZBLANK"); null_ = srcHDU->find("NULL_PIXEL_MASK"); hasScaling_ = (zscale_ && zzero_) || (fits->find("ZSCALE") && fits->find("ZZERO")) ? 1 : 0; hasBlank_ = zblank_ || fits->find("ZBLANK") ? 1 : 0; // Random seq double aa =16807; double mm =2147483647; double seed =1; numRandom_ =10000; random_ = new float[numRandom_]; for (int ii=0; iihead(); // FitsTableHDU* srcHDU = (FitsTableHDU*)(srcHead->hdu()); if (srcHead->find("ZTENSION")) { char* str = srcHead->getString("ZTENSION"); head_ = new FitsHead(width_, height_, depth_, bitpix_, str); delete [] str; } else head_ = new FitsHead(width_, height_, depth_, bitpix_); if (!head_->isValid()) return 0; char* ptr = srcHead->cards(); for (int ii=0; iincard(); ii++, ptr+=80) { char key[9]; key[8] = '\0'; memcpy(key,ptr,8); if (!strncmp(key,"ZIMAGE",6) || !strncmp(key,"ZCMPTYPE",8) || !strncmp(key,"ZBITPIX",7) || !strncmp(key,"ZNAXIS",6) || !strncmp(key,"ZTILE",5) || !strncmp(key,"ZNAME",5) || !strncmp(key,"ZVAL",4) || !strncmp(key,"ZMASKCMP",8) || !strncmp(key,"ZSIMPLE",7) || !strncmp(key,"ZTENSION",8) || !strncmp(key,"ZEXTEND",7) || !strncmp(key,"SIMPLE",6) || !strncmp(key,"BITPIX",6) || !strncmp(key,"NAXIS",5) || !strncmp(key,"END",3) || !strncmp(key,"XTENSION",8) || !strncmp(key,"PCOUNT",6) || !strncmp(key,"GCOUNT",6) || !strncmp(key,"EXTEND",6) || !strncmp(key,"CHECKSUM",8) || !strncmp(key,"DATASUM",7) || !strncmp(key,"TFIELDS",7) || !strncmp(key,"TBCOL",5) || !strncmp(key,"TFORM",5) || !strncmp(key,"TSCAL",5) || !strncmp(key,"TZERO",5) || !strncmp(key,"TNULL",5) || !strncmp(key,"TTYPE",5) || !strncmp(key,"TUNIT",5) || !strncmp(key,"TDISP",5) || !strncmp(key,"THEAP",5) || !strncmp(key,"TDIM",4)) continue; // eat this one if (!strncmp(key,"EXTNAME",7)) { FitsCard cc(ptr); char* str = cc.getString(); if (str) { if (!strncmp(str,"COMPRESSED_IMAGE",8)) { delete [] str; continue; } delete [] str; } } // substitute these if (!strncmp(key,"ZBLOCK",6)) { FitsCard cc(ptr); head_->appendInteger("BLOCK",cc.getInteger(),NULL); continue; } if (!strncmp(key,"ZPCOUNT",7)) { FitsCard cc(ptr); head_->appendInteger("PCOUNT",cc.getInteger(),NULL); continue; } if (!strncmp(key,"ZGCOUNT",7)) { FitsCard cc(ptr); head_->appendInteger("GCOUNT",cc.getInteger(),NULL); continue; } if (!strncmp(key,"ZHECKSUM",8)) { FitsCard cc(ptr); char* str = cc.getString(); if (str) { head_->appendString("CHECKSUM",str,NULL); delete [] str; continue; } } if (!strncmp(key,"ZDATASUM",8)) { FitsCard cc(ptr); char* str = cc.getString(); if (str) { head_->appendString("DATASUM",str,NULL); delete [] str; continue; } } // pass these unaltered head_->cardins(ptr,NULL); } // we added cards head_->updateHDU(); // other primary_ = fits->primary(); managePrimary_ = 0; inherit_ = head_->inherit(); return 1; } void FitsCompress::initRandom(int row) { row++; int rrow = row + quantOffset_-1; randSeed_ = (int)((rrow-1) % numRandom_); randNext_ = (int)(random_[randSeed_]*500); } double FitsCompress::unquantize(double val, double zs, double zz) { double rr = (val-random_[randNext_]+.5)*zs + zz; randNext_++; if (randNext_ == numRandom_) { randSeed_++; if (randSeed_ == numRandom_) randSeed_ = 0; randNext_ = (int)(random_[randSeed_]*500); } return rr; } #define ZERO_VALUE -2147483646 /* value used to represent zero-valued pixels */ double FitsCompress::unquantizeZero(double val, double zs, double zz) { double rr = (val == ZERO_VALUE) ? 0 : (val-random_[randNext_]+.5)*zs + zz; randNext_++; if (randNext_ == numRandom_) { randSeed_++; if (randSeed_ == numRandom_) randSeed_ = 0; randNext_ = (int)(random_[randSeed_]*500); } return rr; } template FitsCompressm::FitsCompressm(FitsFile* fits) : FitsCompress(fits) {} template void FitsCompressm::uncompress(FitsFile* fits) { if (!initHeader(fits)) return; if (!inflate(fits)) return; swapBytes(); // all done valid_ = 1; } template int FitsCompressm::inflate(FitsFile* fits) { FitsHead* srcHead = fits->head(); FitsTableHDU* srcHDU = (FitsTableHDU*)(srcHead->hdu()); if (null_) { internalError("Fitsy++ does not support NULL_PIXEL_MASK at this time."); return 0; } T* dest = new T[size_]; if (!dest) { internalError("Fitsy++ compress unable to allocate memory"); return 0; } // init image memset(dest, 0, size_*sizeof(T)); // src char* sdata = (char*)fits->data(); char* sptr = sdata; int heap = srcHDU->realbytes(); int rowlen = srcHDU->width(); int rows = srcHDU->rows(); // dest int iistart =0; int iistop =ww_; if (iistop > width_) iistop = width_; int jjstart =0; int jjstop =hh_; if (jjstop > height_) jjstop = height_; int kkstart =0; int kkstop =dd_; if (kkstop > depth_) kkstop = depth_; for (int rr=0; rrpage(sptr, rowlen); int ok=0; if (gzcompress_ && !ok) { if (gzcompressed(dest, sptr, sdata+heap, kkstart, kkstop, jjstart, jjstop, iistart, iistop)) { if (DebugCompress) cerr << 'z'; ok=1; } } if (compress_ && !ok) { initRandom(rr); if (compressed(dest, sptr, sdata+heap, kkstart, kkstop, jjstart, jjstop, iistart, iistop)) { if (DebugCompress) cerr << 'c'; ok=1; } } if (uncompress_ && !ok) { if (uncompressed(dest, sptr, sdata+heap, kkstart, kkstop, jjstart, jjstop, iistart, iistop)) { if (DebugCompress) cerr << 'u'; ok=1; } } if (!ok) return 0; // tiles may not be an even multiple of the image size iistart += ww_; iistop += ww_; if (iistop > width_) iistop = width_; if (iistart >= width_) { iistart = 0; iistop = ww_; if (iistop > width_) iistop = width_; jjstart += hh_; jjstop += hh_; if (jjstop > height_) jjstop = height_; if (jjstart >= height_) { jjstart = 0; jjstop = hh_; if (jjstop > height_) jjstop = height_; kkstart += dd_; kkstop += dd_; // we only do up to 3 dimensions if (kkstart >= depth_) break; } } } // we can't use incr paging due to the location of the heap // fits->resetpage(); data_ = dest; dataSize_ = size_; dataSkip_ = 0; return 1; } // uncompressed template int FitsCompressm::uncompressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { int ocnt=0; T* obuf = (T*)(((FitsBinColumnArray*)uncompress_)->get(heap, sptr, &ocnt)); // obuf can be NULL if (!obuf || !ocnt) return 0; int ll=0; for (int kk=kkstart; kk int FitsCompressm::gzcompressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { int icnt=0; unsigned char* ibuf = (unsigned char*)((FitsBinColumnArray*)gzcompress_)->get(heap, sptr, &icnt); // ibuf can be NULL if (!ibuf || !icnt) return 0; int ocnt = tilesize_; char obuf[ocnt*sizeof(T)]; z_stream zstrm; zstrm.next_in = NULL; zstrm.avail_in = 0; zstrm.zalloc = NULL; zstrm.zfree = NULL; zstrm.opaque = NULL; // look for both zlib and gzcompressed headers if (inflateInit2(&zstrm, MAX_WBITS+32) != Z_OK) { internalError("Fitsy++ gzcompressed inflateInit error"); return 0; } zstrm.avail_in = icnt; zstrm.next_in = ibuf; zstrm.avail_out = ocnt*sizeof(T); zstrm.next_out = (Bytef*)obuf; if (DebugCompress) cerr << " inflate START: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; int result = ::inflate(&zstrm, Z_FINISH); switch (result) { case Z_OK: if (DebugCompress) cerr << " inflate OK: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_STREAM_END: if (DebugCompress) cerr << " inflate STREAM_END: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_BUF_ERROR: if (DebugCompress) cerr << " inflate BUF_ERROR: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << endl; return 0; default: internalError("Fitsy++ gzcompressed inflate error"); return 0; } inflateEnd(&zstrm); int ll=0; for (int kk=kkstart; kk void FitsCompressm::swapBytes() { if (byteswap_) { T* dest = (T*)data_; for (int i=0; i unsigned char FitsCompressm::swap(unsigned char* ptr) { return *ptr; } template <> short FitsCompressm::swap(short* ptr) { const char* p = (const char*)ptr; union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; return u.s; } template <> unsigned short FitsCompressm::swap(unsigned short* ptr) { const char* p = (const char*)ptr; union { char c[2]; unsigned short s; } u; u.c[1] = *p++; u.c[0] = *p; return u.s; } template <> int FitsCompressm::swap(int* ptr) { const char* p = (const char*)ptr; union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.i; } template <> long long FitsCompressm::swap(long long* ptr) { const char* p = (const char*)ptr; union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.i; } template <> float FitsCompressm::swap(float* ptr) { const char* p = (const char*)ptr; union { char c[4]; float f; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.f; } template <> double FitsCompressm::swap(double* ptr) { const char* p = (const char*)ptr; union { char c[8]; double d; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; return u.d; } // getValue char template T FitsCompressm::getValue(char* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } template <> float FitsCompressm::getValue(char* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: case SUBDITHER2: return unquantize(*ptr,zs,zz); } } template <> double FitsCompressm::getValue(char* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: case SUBDITHER2: return unquantize(*ptr,zs,zz); } } // getValue short template T FitsCompressm::getValue(short* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } template <> float FitsCompressm::getValue(short* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: case SUBDITHER2: return unquantize(*ptr,zs,zz); } } template <> double FitsCompressm::getValue(short* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: case SUBDITHER2: return unquantize(*ptr,zs,zz); } } // getValue int template T FitsCompressm::getValue(int* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } template <> float FitsCompressm::getValue(int* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: return unquantize(*ptr,zs,zz); case SUBDITHER2: return unquantizeZero(*ptr,zs,zz); } } template <> double FitsCompressm::getValue(int* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: return unquantize(*ptr,zs,zz); case SUBDITHER2: return unquantizeZero(*ptr,zs,zz); } } // getValue long long template T FitsCompressm::getValue(long long* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } template <> float FitsCompressm::getValue(long long* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: return unquantize(*ptr,zs,zz); case SUBDITHER2: return unquantizeZero(*ptr,zs,zz); } } template <> double FitsCompressm::getValue(long long* ptr, double zs, double zz, int blank) { if (!hasBlank_ && !hasScaling_ && quantize_ != SUBDITHER1 && quantize_ != SUBDITHER2) return *ptr; if (hasBlank_ && *ptr == blank) return NAN; switch (quantize_) { case NODITHER: return hasScaling_ ? (*ptr)*zs + zz : *ptr; case SUBDITHER1: return unquantize(*ptr,zs,zz); case SUBDITHER2: return unquantizeZero(*ptr,zs,zz); } } // getValue float template T FitsCompressm::getValue(float* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } // getValue double template T FitsCompressm::getValue(double* ptr, double zs, double zz, int blank) { return hasScaling_ ? T((*ptr)*zs + zz) : *ptr; } template class FitsCompressm; template class FitsCompressm; template class FitsCompressm; template class FitsCompressm; template class FitsCompressm; template class FitsCompressm; template class FitsCompressm; FitsPostNext::FitsPostNext(FitsFile* p) { FitsCompress* prev = (FitsCompress*)p; primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = head_->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; return; } saods9/tksao1.0/fitsy++/compress.h000644 000765 000000 00000003616 12552003053 017215 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitscompress_h__ #define __fitscompress_h__ #include "file.h" class FitsCompress : public FitsFile { public: enum QuantMethod {NODITHER,SUBDITHER1,SUBDITHER2}; protected: int bitpix_; char* type_; int width_; int height_; int depth_; int ww_; int hh_; int dd_; double bscale_; double bzero_; unsigned int blank_; char* zmaskcmp_; size_t tilesize_; size_t size_; FitsColumn* gzcompress_; FitsColumn* compress_; FitsColumn* uncompress_; FitsColumn* zscale_; FitsColumn* zzero_; FitsColumn* zblank_; FitsColumn* null_; int hasScaling_; int hasBlank_; QuantMethod quantize_; int quantOffset_; int numRandom_; float* random_; int randSeed_; int randNext_; protected: int initHeader(FitsFile*); void initRandom(int); double unquantize(double, double, double); double unquantizeZero(double, double, double); public: FitsCompress(FitsFile*); virtual ~FitsCompress(); }; template class FitsCompressm : public FitsCompress { private: int inflate(FitsFile*); void swapBytes(); protected: T swap(T* ptr); protected: void uncompress(FitsFile* fits); int gzcompressed(T*, char*, char*, int, int, int, int, int, int); virtual int compressed(T*, char*, char*, int, int, int, int, int, int) =0; int uncompressed(T*, char*, char*, int, int, int, int, int, int); T getValue(char*, double, double, int); T getValue(short*, double, double, int); T getValue(int*, double, double, int); T getValue(long long*, double, double, int); T getValue(float*, double, double, int); T getValue(double*, double, double, int); public: FitsCompressm(FitsFile*); }; class FitsPostNext : public FitsFile { public: FitsPostNext(FitsFile* prev); }; #endif saods9/tksao1.0/fitsy++/envi.C000644 000765 000000 00000006364 12464214754 016277 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "envi.h" #include "head.h" FitsENVI::FitsENVI(FitsFile* fits) { byteswap_ = fits->byteswap(); endian_ = fits->endian(); pBitpix_ = fits->pBitpix(); pWidth_ = fits->pWidth(); pHeight_ = fits->pHeight(); pDepth_ = fits->pDepth(); pEncoding_ = FitsFile::BSQ; pCRPIX3_ = fits->pCRPIX3(); pCRVAL3_ = fits->pCRVAL3(); pCDELT3_ = fits->pCDELT3(); size_ = (size_t)pWidth_*pHeight_*pDepth_; } FitsENVI::~FitsENVI() { if (data_) delete [] (char*)data_; } int FitsENVI::initHeader(FitsFile* fits) { // simple check if (!pWidth_ || !pHeight_ || !pBitpix_) return 0; // create header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_); if (!head_->isValid()) return 0; // WCS? if (pCRPIX3_>0 || pCRVAL3_>0 || pCDELT3_!=1) { head_->appendString("CTYPE1","LINEAR", NULL); head_->appendReal("CRPIX1",1, 9, NULL); head_->appendReal("CRVAL1",1, 9, NULL); head_->appendReal("CDELT1",1, 9, NULL); head_->appendString("CTYPE2","LINEAR", NULL); head_->appendReal("CRPIX2",1, 9, NULL); head_->appendReal("CRVAL2",1, 9, NULL); head_->appendReal("CDELT2",1, 9, NULL); head_->appendString("CTYPE3","WAVELENGTH", NULL); head_->appendReal("CRPIX3",pCRPIX3_, 9, NULL); head_->appendReal("CRVAL3",pCRVAL3_, 9, NULL); head_->appendReal("CDELT3",pCDELT3_, 9, NULL); } // other primary_ = fits->primary(); managePrimary_ = 0; inherit_ = head_->inherit(); return 1; } template FitsENVIBIPm::FitsENVIBIPm(FitsFile* fits) : FitsENVI(fits) { if (!initHeader(fits)) return; T* dest = new T[size_]; if (!dest) { internalError("Fitsy++ envi unable to allocate memory"); return; } memset(dest, 0, size_*sizeof(T)); T* ptr = (T*)fits->data(); for (int jj=0; jj; template class FitsENVIBIPm; template class FitsENVIBIPm; template class FitsENVIBIPm; template class FitsENVIBIPm; template class FitsENVIBIPm; template class FitsENVIBIPm; template FitsENVIBILm::FitsENVIBILm(FitsFile* fits) : FitsENVI(fits) { if (!initHeader(fits)) return; T* dest = new T[size_]; if (!dest) { internalError("Fitsy++ envi unable to allocate memory"); return; } memset(dest, 0, size_*sizeof(T)); T* ptr = (T*)fits->data(); for (int jj=0; jj; template class FitsENVIBILm; template class FitsENVIBILm; template class FitsENVIBILm; template class FitsENVIBILm; template class FitsENVIBILm; template class FitsENVIBILm; saods9/tksao1.0/fitsy++/envi.h000644 000765 000000 00000001131 12464214754 016327 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsenvi_h__ #define __fitsenvi_h__ #include "file.h" class FitsENVI : public FitsFile { protected: size_t size_; protected: int initHeader(FitsFile*); public: FitsENVI(FitsFile*); virtual ~FitsENVI(); }; template class FitsENVIBILm : public FitsENVI { public: FitsENVIBILm(FitsFile*); }; template class FitsENVIBIPm : public FitsENVI { public: FitsENVIBIPm(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/envilex.C000644 000765 000000 00000173465 12553253013 017005 0ustar00joyewheel000000 000000 #line 2 "fitsy++/envilex.C" #line 4 "fitsy++/envilex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer enviFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *envialloc (yy_size_t ); void *envirealloc (void *,yy_size_t ); void envifree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 72 #define YY_END_OF_BUFFER 73 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[282] = { 0, 0, 0, 2, 2, 0, 0, 73, 71, 68, 70, 71, 71, 71, 64, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 3, 2, 1, 63, 61, 62, 63, 60, 59, 63, 56, 59, 4, 68, 69, 0, 64, 66, 65, 64, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 6, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, 61, 0, 56, 59, 56, 58, 57, 59, 0, 0, 0, 65, 67, 67, 11, 12, 13, 14, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 32, 67, 67, 7, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 59, 57, 65, 0, 66, 67, 9, 15, 17, 67, 67, 67, 16, 67, 22, 67, 23, 24, 67, 67, 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 40, 67, 67, 67, 67, 67, 67, 67, 48, 67, 67, 51, 67, 67, 67, 57, 0, 58, 67, 10, 5, 67, 67, 67, 21, 67, 67, 67, 67, 30, 31, 33, 34, 67, 37, 38, 67, 42, 67, 67, 45, 67, 67, 67, 67, 52, 53, 67, 67, 67, 67, 20, 25, 27, 67, 29, 35, 39, 67, 67, 67, 67, 47, 67, 50, 54, 67, 8, 18, 67, 67, 36, 67, 67, 44, 46, 49, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 28, 41, 67, 55, 19, 43, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 20, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 1, 62, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[63] = { 0, 1, 1, 2, 1, 1, 1, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1 } ; static yyconst flex_int16_t yy_base[287] = { 0, 0, 0, 806, 805, 62, 124, 807, 810, 800, 810, 788, 64, 781, 66, 78, 179, 781, 68, 69, 127, 71, 75, 128, 76, 77, 80, 150, 148, 132, 231, 144, 91, 83, 102, 810, 0, 810, 810, 786, 810, 88, 810, 92, 778, 141, 778, 810, 783, 810, 775, 187, 134, 190, 197, 775, 212, 153, 202, 201, 227, 200, 204, 226, 246, 228, 145, 210, 232, 236, 254, 255, 258, 274, 270, 282, 286, 278, 280, 772, 297, 289, 288, 296, 300, 311, 294, 303, 306, 316, 95, 327, 325, 322, 323, 330, 0, 776, 768, 349, 767, 351, 353, 359, 375, 365, 383, 765, 220, 369, 387, 765, 764, 763, 761, 371, 393, 379, 394, 386, 389, 398, 400, 397, 409, 402, 407, 404, 408, 427, 405, 428, 414, 760, 431, 429, 437, 446, 456, 443, 439, 458, 467, 451, 470, 453, 463, 465, 474, 475, 479, 477, 484, 505, 512, 757, 334, 514, 756, 751, 750, 494, 501, 750, 746, 518, 517, 519, 739, 520, 725, 523, 687, 684, 527, 528, 636, 530, 532, 531, 535, 537, 540, 562, 548, 544, 629, 565, 569, 577, 573, 584, 580, 550, 570, 587, 593, 558, 598, 596, 600, 544, 542, 541, 606, 541, 534, 604, 605, 588, 503, 603, 621, 610, 619, 491, 486, 454, 440, 624, 410, 626, 630, 370, 631, 644, 363, 649, 654, 652, 657, 356, 658, 659, 662, 651, 663, 347, 345, 341, 669, 338, 666, 268, 667, 674, 679, 685, 262, 683, 256, 238, 693, 216, 206, 689, 712, 174, 690, 715, 172, 156, 152, 719, 696, 589, 707, 716, 709, 721, 722, 734, 738, 736, 744, 133, 110, 741, 103, 97, 94, 810, 792, 796, 94, 800, 802 } ; static yyconst flex_int16_t yy_def[287] = { 0, 281, 1, 282, 282, 283, 283, 281, 281, 281, 281, 281, 281, 281, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 281, 285, 281, 281, 281, 281, 281, 281, 286, 281, 286, 286, 281, 281, 281, 281, 281, 281, 281, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285, 281, 281, 281, 286, 286, 281, 281, 286, 281, 281, 281, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 281, 281, 281, 286, 286, 281, 281, 281, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 281, 281, 281, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 0, 281, 281, 281, 281, 281 } ; static yyconst flex_int16_t yy_nxt[873] = { 0, 8, 9, 10, 11, 12, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 17, 17, 24, 25, 26, 27, 28, 17, 29, 30, 31, 32, 33, 34, 17, 17, 17, 15, 16, 17, 18, 19, 20, 21, 22, 23, 17, 24, 25, 26, 27, 28, 17, 29, 30, 31, 32, 33, 34, 17, 17, 17, 35, 8, 38, 39, 40, 38, 41, 42, 43, 44, 45, 50, 51, 53, 54, 281, 281, 63, 281, 56, 70, 64, 281, 281, 281, 281, 75, 281, 71, 77, 281, 65, 94, 74, 76, 98, 99, 55, 281, 98, 101, 281, 281, 63, 281, 56, 70, 64, 57, 281, 281, 95, 75, 93, 71, 77, 65, 281, 94, 74, 76, 147, 38, 47, 38, 39, 40, 38, 41, 42, 43, 44, 45, 57, 281, 281, 66, 95, 93, 281, 281, 84, 52, 72, 67, 85, 147, 106, 103, 101, 73, 281, 281, 68, 104, 281, 121, 281, 69, 281, 281, 91, 66, 281, 78, 81, 109, 84, 82, 72, 67, 85, 79, 106, 83, 73, 80, 92, 68, 281, 104, 281, 121, 69, 38, 47, 281, 91, 58, 59, 78, 81, 109, 82, 53, 51, 60, 79, 52, 83, 105, 80, 92, 105, 53, 54, 61, 281, 281, 281, 56, 281, 62, 281, 58, 59, 107, 281, 107, 281, 108, 111, 60, 281, 110, 114, 105, 281, 108, 105, 122, 61, 115, 281, 281, 281, 56, 62, 281, 281, 86, 123, 87, 281, 88, 281, 111, 112, 89, 110, 114, 113, 124, 281, 116, 122, 117, 115, 120, 90, 118, 281, 281, 281, 126, 281, 86, 123, 87, 281, 88, 125, 112, 119, 89, 281, 113, 281, 124, 116, 127, 281, 117, 120, 90, 281, 118, 281, 128, 281, 126, 130, 131, 281, 136, 281, 281, 125, 119, 135, 132, 281, 129, 281, 281, 127, 133, 281, 134, 137, 281, 139, 144, 281, 128, 143, 130, 131, 281, 140, 136, 138, 141, 281, 135, 142, 132, 129, 145, 281, 281, 133, 281, 134, 281, 137, 139, 281, 144, 150, 143, 281, 157, 151, 140, 281, 138, 141, 281, 149, 146, 142, 281, 145, 281, 148, 103, 99, 103, 101, 152, 102, 153, 281, 104, 150, 154, 102, 151, 107, 281, 107, 153, 158, 149, 146, 281, 281, 281, 155, 148, 156, 281, 157, 163, 152, 281, 159, 153, 159, 104, 160, 154, 281, 281, 161, 281, 167, 153, 162, 281, 281, 164, 166, 281, 281, 168, 281, 165, 281, 163, 281, 281, 170, 281, 281, 281, 281, 171, 174, 161, 281, 178, 167, 173, 162, 169, 175, 164, 166, 172, 176, 168, 165, 281, 281, 281, 180, 281, 170, 177, 179, 182, 171, 281, 174, 281, 281, 178, 173, 281, 169, 175, 281, 181, 172, 176, 187, 281, 184, 281, 281, 180, 281, 183, 281, 177, 179, 182, 185, 281, 186, 281, 188, 281, 190, 194, 281, 195, 181, 193, 281, 281, 187, 281, 184, 281, 189, 197, 183, 191, 281, 192, 281, 196, 185, 186, 200, 281, 188, 190, 281, 194, 204, 195, 193, 199, 198, 281, 155, 281, 155, 189, 201, 197, 191, 202, 192, 202, 196, 203, 281, 157, 200, 281, 281, 281, 281, 205, 204, 281, 199, 198, 206, 281, 281, 210, 281, 281, 281, 211, 281, 281, 209, 281, 208, 207, 281, 281, 203, 203, 281, 201, 205, 212, 281, 213, 281, 215, 206, 214, 216, 210, 217, 221, 281, 211, 218, 209, 281, 208, 207, 281, 228, 220, 219, 281, 281, 222, 212, 281, 213, 223, 215, 281, 214, 216, 281, 217, 221, 224, 281, 218, 225, 281, 281, 281, 226, 228, 220, 281, 219, 227, 281, 222, 281, 230, 281, 223, 232, 281, 281, 281, 281, 237, 229, 224, 281, 225, 270, 233, 234, 236, 226, 235, 231, 281, 227, 281, 238, 240, 281, 230, 281, 239, 232, 281, 281, 281, 237, 229, 244, 245, 281, 270, 233, 241, 234, 236, 235, 231, 281, 242, 243, 238, 240, 281, 246, 281, 281, 239, 281, 247, 249, 281, 281, 281, 244, 245, 281, 281, 241, 252, 281, 281, 253, 281, 242, 243, 254, 248, 281, 256, 246, 250, 251, 281, 255, 247, 249, 281, 281, 281, 257, 281, 258, 281, 281, 252, 262, 281, 253, 259, 281, 254, 248, 260, 266, 256, 250, 251, 261, 255, 269, 281, 263, 281, 264, 257, 281, 258, 265, 281, 281, 267, 262, 281, 259, 281, 281, 271, 260, 281, 266, 268, 275, 261, 273, 272, 269, 263, 281, 264, 281, 274, 281, 281, 265, 281, 277, 267, 281, 278, 281, 280, 271, 276, 281, 160, 160, 268, 275, 273, 272, 158, 201, 279, 281, 281, 274, 281, 281, 281, 158, 281, 277, 102, 97, 278, 281, 280, 276, 281, 52, 48, 281, 102, 97, 281, 52, 49, 279, 36, 36, 36, 36, 46, 46, 46, 46, 96, 48, 96, 96, 100, 100, 281, 37, 37, 7, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281 } ; static yyconst flex_int16_t yy_chk[873] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 12, 12, 14, 14, 18, 19, 18, 21, 14, 21, 18, 22, 24, 25, 15, 25, 26, 22, 26, 33, 19, 33, 24, 25, 41, 41, 284, 32, 43, 43, 280, 90, 18, 279, 14, 21, 18, 15, 34, 278, 34, 25, 32, 22, 26, 19, 276, 33, 24, 25, 90, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 15, 20, 23, 20, 34, 32, 29, 275, 29, 52, 23, 20, 29, 90, 52, 45, 45, 23, 31, 66, 20, 45, 28, 66, 27, 20, 262, 57, 31, 20, 261, 27, 28, 57, 29, 28, 23, 20, 29, 27, 52, 28, 23, 27, 31, 20, 260, 45, 257, 66, 20, 6, 6, 16, 31, 16, 16, 27, 28, 57, 28, 51, 51, 16, 27, 53, 28, 51, 27, 31, 53, 54, 54, 16, 61, 59, 58, 54, 62, 16, 254, 16, 16, 56, 67, 56, 56, 56, 59, 16, 253, 58, 61, 51, 108, 108, 53, 67, 16, 62, 63, 60, 65, 54, 16, 30, 68, 30, 68, 30, 69, 30, 251, 59, 60, 30, 58, 61, 60, 69, 64, 63, 67, 64, 62, 65, 30, 64, 70, 71, 250, 71, 72, 30, 68, 30, 248, 30, 70, 60, 64, 30, 243, 60, 74, 69, 63, 72, 73, 64, 65, 30, 77, 64, 78, 73, 75, 71, 74, 74, 76, 78, 82, 81, 70, 64, 77, 75, 86, 73, 83, 80, 72, 75, 84, 76, 80, 87, 82, 87, 88, 73, 86, 74, 74, 85, 83, 78, 81, 84, 89, 77, 85, 75, 73, 88, 93, 94, 75, 92, 76, 91, 80, 82, 95, 87, 93, 86, 156, 156, 94, 83, 241, 81, 84, 239, 92, 89, 85, 238, 88, 237, 91, 99, 99, 101, 101, 95, 102, 99, 231, 101, 93, 102, 103, 94, 105, 226, 105, 103, 105, 92, 89, 109, 223, 115, 104, 91, 104, 104, 104, 115, 95, 117, 106, 99, 106, 101, 106, 102, 119, 110, 109, 120, 119, 103, 110, 116, 118, 116, 118, 123, 121, 120, 122, 117, 125, 115, 127, 130, 122, 126, 128, 124, 220, 123, 126, 109, 132, 130, 119, 125, 110, 121, 127, 116, 118, 124, 128, 120, 117, 129, 131, 135, 132, 134, 122, 129, 131, 135, 123, 136, 126, 140, 218, 130, 125, 139, 121, 127, 137, 134, 124, 128, 140, 143, 137, 145, 217, 132, 138, 136, 141, 129, 131, 135, 138, 146, 139, 147, 141, 142, 143, 146, 144, 147, 134, 145, 148, 149, 140, 151, 137, 150, 142, 149, 136, 144, 152, 144, 216, 148, 138, 139, 152, 215, 141, 143, 161, 146, 161, 147, 145, 151, 150, 162, 153, 210, 153, 142, 153, 149, 144, 154, 144, 154, 148, 154, 157, 157, 152, 166, 165, 167, 169, 162, 161, 171, 151, 150, 165, 174, 175, 171, 177, 179, 178, 174, 206, 180, 169, 181, 167, 166, 182, 205, 203, 202, 185, 201, 162, 175, 184, 177, 193, 179, 165, 178, 180, 171, 181, 185, 197, 174, 182, 169, 183, 167, 166, 187, 193, 184, 183, 188, 194, 187, 175, 190, 177, 188, 179, 189, 178, 180, 192, 181, 185, 189, 191, 182, 190, 195, 209, 265, 191, 193, 184, 196, 183, 192, 199, 187, 198, 196, 200, 188, 199, 211, 207, 208, 204, 209, 195, 189, 213, 190, 265, 200, 204, 208, 191, 207, 198, 214, 192, 212, 211, 213, 219, 196, 221, 212, 199, 186, 222, 224, 209, 195, 222, 224, 176, 265, 200, 214, 204, 208, 207, 198, 225, 219, 221, 211, 213, 227, 225, 235, 229, 212, 228, 227, 229, 230, 232, 233, 222, 224, 234, 236, 214, 233, 242, 244, 234, 240, 219, 221, 235, 228, 245, 240, 225, 230, 232, 246, 236, 227, 229, 249, 173, 247, 242, 172, 244, 255, 258, 233, 249, 252, 234, 245, 264, 235, 228, 246, 258, 240, 230, 232, 247, 236, 264, 266, 252, 268, 255, 242, 256, 244, 256, 259, 267, 259, 249, 263, 245, 269, 270, 266, 246, 170, 258, 263, 270, 247, 268, 267, 264, 252, 271, 255, 273, 269, 272, 168, 256, 277, 272, 259, 274, 273, 164, 277, 266, 271, 163, 160, 159, 263, 270, 268, 267, 158, 155, 274, 133, 114, 269, 113, 112, 111, 107, 100, 272, 98, 97, 273, 79, 277, 271, 55, 50, 48, 46, 44, 39, 17, 13, 11, 274, 282, 282, 282, 282, 283, 283, 283, 283, 285, 9, 285, 285, 286, 286, 7, 4, 3, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "fitsy++/envilex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 11 "fitsy++/envilex.L" #include #include #include #include "util.h" #include "enviparser.H" extern YYSTYPE* envilval; extern enviFlexLexer* envilexx; /* rules */ #line 710 "fitsy++/envilex.C" #define INITIAL 0 #define DISCARD 1 #define BRACKET 2 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 30 "fitsy++/envilex.L" #line 815 "fitsy++/envilex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 282 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 281 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 32 "fitsy++/envilex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(envilval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 39 "fitsy++/envilex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 47 "fitsy++/envilex.L" { BEGIN BRACKET; return '{'; } YY_BREAK case 4: YY_RULE_SETUP #line 52 "fitsy++/envilex.L" { BEGIN INITIAL; return '}'; } YY_BREAK case 5: YY_RULE_SETUP #line 57 "fitsy++/envilex.L" {return DEBUG_;} YY_BREAK case 6: YY_RULE_SETUP #line 58 "fitsy++/envilex.L" {return ON_;} YY_BREAK case 7: YY_RULE_SETUP #line 59 "fitsy++/envilex.L" {return OFF_;} YY_BREAK case 8: YY_RULE_SETUP #line 61 "fitsy++/envilex.L" {return AVERAGE_;} YY_BREAK case 9: YY_RULE_SETUP #line 62 "fitsy++/envilex.L" {return BAND_;} YY_BREAK case 10: YY_RULE_SETUP #line 63 "fitsy++/envilex.L" {return BANDS_;} YY_BREAK case 11: YY_RULE_SETUP #line 64 "fitsy++/envilex.L" {return BBL_;} YY_BREAK case 12: YY_RULE_SETUP #line 65 "fitsy++/envilex.L" {return BIL_;} YY_BREAK case 13: YY_RULE_SETUP #line 66 "fitsy++/envilex.L" {return BIP_;} YY_BREAK case 14: YY_RULE_SETUP #line 67 "fitsy++/envilex.L" {return BSQ_;} YY_BREAK case 15: YY_RULE_SETUP #line 68 "fitsy++/envilex.L" {return BYTE_;} YY_BREAK case 16: YY_RULE_SETUP #line 69 "fitsy++/envilex.L" {return ENVI_;} YY_BREAK case 17: YY_RULE_SETUP #line 70 "fitsy++/envilex.L" {return DATA_;} YY_BREAK case 18: YY_RULE_SETUP #line 71 "fitsy++/envilex.L" {return DEFAULT_;} YY_BREAK case 19: YY_RULE_SETUP #line 72 "fitsy++/envilex.L" {return DESCRIPTION_;} YY_BREAK case 20: YY_RULE_SETUP #line 73 "fitsy++/envilex.L" {return FACTOR_;} YY_BREAK case 21: YY_RULE_SETUP #line 74 "fitsy++/envilex.L" {return FRAME_;} YY_BREAK case 22: YY_RULE_SETUP #line 75 "fitsy++/envilex.L" {return FILE_;} YY_BREAK case 23: YY_RULE_SETUP #line 76 "fitsy++/envilex.L" {return FWHM_;} YY_BREAK case 24: YY_RULE_SETUP #line 77 "fitsy++/envilex.L" {return GAIN_;} YY_BREAK case 25: YY_RULE_SETUP #line 78 "fitsy++/envilex.L" {return HEADER_;} YY_BREAK case 26: YY_RULE_SETUP #line 79 "fitsy++/envilex.L" {return INFO_;} YY_BREAK case 27: YY_RULE_SETUP #line 80 "fitsy++/envilex.L" {return IGNORE_;} YY_BREAK case 28: YY_RULE_SETUP #line 81 "fitsy++/envilex.L" {return INTERLEAVE_;} YY_BREAK case 29: YY_RULE_SETUP #line 82 "fitsy++/envilex.L" {return LIMITS_;} YY_BREAK case 30: YY_RULE_SETUP #line 83 "fitsy++/envilex.L" {return LINES_;} YY_BREAK case 31: YY_RULE_SETUP #line 84 "fitsy++/envilex.L" {return MAJOR_;} YY_BREAK case 32: YY_RULE_SETUP #line 85 "fitsy++/envilex.L" {return MAP_;} YY_BREAK case 33: YY_RULE_SETUP #line 86 "fitsy++/envilex.L" {return MINOR_;} YY_BREAK case 34: YY_RULE_SETUP #line 87 "fitsy++/envilex.L" {return NAMES_;} YY_BREAK case 35: YY_RULE_SETUP #line 88 "fitsy++/envilex.L" {return OFFSET_;} YY_BREAK case 36: YY_RULE_SETUP #line 89 "fitsy++/envilex.L" {return OFFSETS_;} YY_BREAK case 37: YY_RULE_SETUP #line 90 "fitsy++/envilex.L" {return ORDER_;} YY_BREAK case 38: YY_RULE_SETUP #line 91 "fitsy++/envilex.L" {return PIXEL_;} YY_BREAK case 39: YY_RULE_SETUP #line 92 "fitsy++/envilex.L" {return PIXELS_;} YY_BREAK case 40: YY_RULE_SETUP #line 93 "fitsy++/envilex.L" {return PLOT_;} YY_BREAK case 41: YY_RULE_SETUP #line 94 "fitsy++/envilex.L" {return PROJECTION_;} YY_BREAK case 42: YY_RULE_SETUP #line 95 "fitsy++/envilex.L" {return RANGE_;} YY_BREAK case 43: YY_RULE_SETUP #line 96 "fitsy++/envilex.L" {return REFLECTANCE_;} YY_BREAK case 44: YY_RULE_SETUP #line 97 "fitsy++/envilex.L" {return SAMPLES_;} YY_BREAK case 45: YY_RULE_SETUP #line 98 "fitsy++/envilex.L" {return SCALE_;} YY_BREAK case 46: YY_RULE_SETUP #line 99 "fitsy++/envilex.L" {return SCANNER_;} YY_BREAK case 47: YY_RULE_SETUP #line 100 "fitsy++/envilex.L" {return SENSOR_;} YY_BREAK case 48: YY_RULE_SETUP #line 101 "fitsy++/envilex.L" {return SIZE_;} YY_BREAK case 49: YY_RULE_SETUP #line 102 "fitsy++/envilex.L" {return STRETCH_;} YY_BREAK case 50: YY_RULE_SETUP #line 103 "fitsy++/envilex.L" {return TITLES_;} YY_BREAK case 51: YY_RULE_SETUP #line 104 "fitsy++/envilex.L" {return TYPE_;} YY_BREAK case 52: YY_RULE_SETUP #line 105 "fitsy++/envilex.L" {return UNITS_;} YY_BREAK case 53: YY_RULE_SETUP #line 106 "fitsy++/envilex.L" {return VALUE_;} YY_BREAK case 54: YY_RULE_SETUP #line 107 "fitsy++/envilex.L" {return VALUES_;} YY_BREAK case 55: YY_RULE_SETUP #line 108 "fitsy++/envilex.L" {return WAVELENGTH_;} YY_BREAK case 56: YY_RULE_SETUP #line 111 "fitsy++/envilex.L" { // Integer envilval->integer = atoi(yytext); return INT; } YY_BREAK case 57: #line 117 "fitsy++/envilex.L" case 58: YY_RULE_SETUP #line 117 "fitsy++/envilex.L" { // Real Number envilval->real = atof(yytext); return REAL; } YY_BREAK case 59: YY_RULE_SETUP #line 123 "fitsy++/envilex.L" { // General String int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } YY_BREAK case 60: YY_RULE_SETUP #line 130 "fitsy++/envilex.L" { return ','; } YY_BREAK case 61: YY_RULE_SETUP #line 134 "fitsy++/envilex.L" { // White Spaces } YY_BREAK case 62: /* rule 62 can match eol */ YY_RULE_SETUP #line 137 "fitsy++/envilex.L" { // linefeed } YY_BREAK case 63: YY_RULE_SETUP #line 140 "fitsy++/envilex.L" { // other chars, eat it } YY_BREAK case 64: YY_RULE_SETUP #line 143 "fitsy++/envilex.L" { // Integer envilval->integer = atoi(yytext); return INT; } YY_BREAK case 65: #line 149 "fitsy++/envilex.L" case 66: YY_RULE_SETUP #line 149 "fitsy++/envilex.L" { // Real Number envilval->real = atof(yytext); return REAL; } YY_BREAK case 67: YY_RULE_SETUP #line 155 "fitsy++/envilex.L" { // General String int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } YY_BREAK case 68: YY_RULE_SETUP #line 162 "fitsy++/envilex.L" { // White Spaces } YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP #line 165 "fitsy++/envilex.L" { // windows line feed return '\n'; } YY_BREAK case 70: /* rule 70 can match eol */ YY_RULE_SETUP #line 169 "fitsy++/envilex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): case YY_STATE_EOF(BRACKET): #line 173 "fitsy++/envilex.L" { // eof return EOF_; } YY_BREAK case 71: YY_RULE_SETUP #line 177 "fitsy++/envilex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 72: YY_RULE_SETUP #line 181 "fitsy++/envilex.L" ECHO; YY_BREAK #line 1311 "fitsy++/envilex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; envifree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); envifree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ envirealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) envirealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 282 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 282 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 281); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) envialloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) envialloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) envifree((void *) b->yy_ch_buf ); envifree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)envialloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)envirealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) envialloc(new_size ); else (yy_start_stack) = (int *) envirealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *envialloc (yy_size_t size ) { return (void *) malloc( size ); } void *envirealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void envifree (void * ptr ) { free( (char *) ptr ); /* see envirealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 181 "fitsy++/envilex.L" void enviDiscard(int doit) { if (envilexx) envilexx->begin(DISCARD, doit); } void enviFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/envilex.L000644 000765 000000 00000010235 12464230772 017007 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "enviparser.H" extern YYSTYPE* envilval; extern enviFlexLexer* envilexx; %} %x DISCARD %x BRACKET D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(envilval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } \{ { BEGIN BRACKET; return '{'; } \} { BEGIN INITIAL; return '}'; } debug {return DEBUG_;} on {return ON_;} off {return OFF_;} average {return AVERAGE_;} band {return BAND_;} bands {return BANDS_;} bbl {return BBL_;} bil {return BIL_;} bip {return BIP_;} bsq {return BSQ_;} byte {return BYTE_;} envi {return ENVI_;} data {return DATA_;} default {return DEFAULT_;} description {return DESCRIPTION_;} factor {return FACTOR_;} frame {return FRAME_;} file {return FILE_;} fwhm {return FWHM_;} gain {return GAIN_;} header {return HEADER_;} info {return INFO_;} ignore {return IGNORE_;} interleave {return INTERLEAVE_;} limits {return LIMITS_;} lines {return LINES_;} major {return MAJOR_;} map {return MAP_;} minor {return MINOR_;} names {return NAMES_;} offset {return OFFSET_;} offsets {return OFFSETS_;} order {return ORDER_;} pixel {return PIXEL_;} pixels {return PIXELS_;} plot {return PLOT_;} projection {return PROJECTION_;} range {return RANGE_;} reflectance {return REFLECTANCE_;} samples {return SAMPLES_;} scale {return SCALE_;} scanner {return SCANNER_;} sensor {return SENSOR_;} size {return SIZE_;} stretch {return STRETCH_;} titles {return TITLES_;} type {return TYPE_;} units {return UNITS_;} value {return VALUE_;} values {return VALUES_;} wavelength {return WAVELENGTH_;} [+-]?{D}+ { // Integer envilval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number envilval->real = atof(yytext); return REAL; } [0-9A-Za-z\-]+ { // General String int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } , { return ','; } [ \t]+ { // White Spaces } \n { // linefeed } . { // other chars, eat it } [+-]?{D}+ { // Integer envilval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number envilval->real = atof(yytext); return REAL; } [0-9A-Za-z]+ { // General String int ll = yyleng <(ENVIPARSERSIZE-1) ? yyleng:(ENVIPARSERSIZE-1); strncpy(envilval->str,yytext,ll); envilval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void enviDiscard(int doit) { if (envilexx) envilexx->begin(DISCARD, doit); } void enviFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/enviparser.C000644 000765 000000 00000164476 12553253014 017514 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse enviparse #define yylex envilex #define yyerror envierror #define yylval envilval #define yychar envichar #define yydebug envidebug #define yynerrs envinerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { EOF_ = 258, INT = 259, REAL = 260, STRING = 261, DEBUG_ = 262, ON_ = 263, OFF_ = 264, AVERAGE_ = 265, BAND_ = 266, BANDS_ = 267, BBL_ = 268, BIL_ = 269, BIP_ = 270, BSQ_ = 271, BYTE_ = 272, DATA_ = 273, DEFAULT_ = 274, DESCRIPTION_ = 275, ENVI_ = 276, FACTOR_ = 277, FRAME_ = 278, FILE_ = 279, FWHM_ = 280, GAIN_ = 281, HEADER_ = 282, INFO_ = 283, IGNORE_ = 284, INTERLEAVE_ = 285, LIMITS_ = 286, LINES_ = 287, MAJOR_ = 288, MAP_ = 289, MINOR_ = 290, NAMES_ = 291, OFFSET_ = 292, OFFSETS_ = 293, ORDER_ = 294, PIXEL_ = 295, PIXELS_ = 296, PLOT_ = 297, PROJECTION_ = 298, RANGE_ = 299, REFLECTANCE_ = 300, SAMPLES_ = 301, SCALE_ = 302, SCANNER_ = 303, SENSOR_ = 304, SIZE_ = 305, START_ = 306, STRETCH_ = 307, TITLES_ = 308, TYPE_ = 309, UNITS_ = 310, VALUE_ = 311, VALUES_ = 312, WAVELENGTH_ = 313 }; #endif /* Tokens. */ #define EOF_ 258 #define INT 259 #define REAL 260 #define STRING 261 #define DEBUG_ 262 #define ON_ 263 #define OFF_ 264 #define AVERAGE_ 265 #define BAND_ 266 #define BANDS_ 267 #define BBL_ 268 #define BIL_ 269 #define BIP_ 270 #define BSQ_ 271 #define BYTE_ 272 #define DATA_ 273 #define DEFAULT_ 274 #define DESCRIPTION_ 275 #define ENVI_ 276 #define FACTOR_ 277 #define FRAME_ 278 #define FILE_ 279 #define FWHM_ 280 #define GAIN_ 281 #define HEADER_ 282 #define INFO_ 283 #define IGNORE_ 284 #define INTERLEAVE_ 285 #define LIMITS_ 286 #define LINES_ 287 #define MAJOR_ 288 #define MAP_ 289 #define MINOR_ 290 #define NAMES_ 291 #define OFFSET_ 292 #define OFFSETS_ 293 #define ORDER_ 294 #define PIXEL_ 295 #define PIXELS_ 296 #define PLOT_ 297 #define PROJECTION_ 298 #define RANGE_ 299 #define REFLECTANCE_ 300 #define SAMPLES_ 301 #define SCALE_ 302 #define SCANNER_ 303 #define SENSOR_ 304 #define SIZE_ 305 #define START_ 306 #define STRETCH_ 307 #define TITLES_ 308 #define TYPE_ 309 #define UNITS_ 310 #define VALUE_ 311 #define VALUES_ 312 #define WAVELENGTH_ 313 /* Copy the first part of user declarations. */ #line 10 "fitsy++/enviparser.Y" #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; enviDiscard(x);} #include "file.h" #undef yyFlexLexer #define yyFlexLexer enviFlexLexer #include extern int envilex(void*, enviFlexLexer*); extern void envierror(FitsFile*, enviFlexLexer*, const char*); extern void enviDiscard(int); static int numWave; static float wave[MAXWAVES]; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 30 "fitsy++/enviparser.Y" { #define ENVIPARSERSIZE 1024 float real; int integer; char str[ENVIPARSERSIZE]; } /* Line 193 of yacc.c. */ #line 247 "fitsy++/enviparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 260 "fitsy++/enviparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 202 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 70 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 28 /* YYNRULES -- Number of rules. */ #define YYNRULES 77 /* YYNRULES -- Number of states. */ #define YYNSTATES 200 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 313 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 66, 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, 63, 64, 2, 2, 69, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 65, 2, 59, 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, 60, 61, 62, 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, 67, 2, 68, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 4, 7, 11, 14, 15, 18, 20, 22, 26, 30, 34, 38, 43, 49, 55, 56, 62, 67, 71, 72, 78, 83, 88, 93, 98, 103, 108, 113, 119, 125, 131, 137, 138, 145, 150, 155, 156, 161, 165, 169, 175, 181, 190, 191, 195, 197, 199, 201, 203, 205, 207, 209, 211, 213, 215, 217, 220, 224, 227, 229, 233, 237, 239, 243, 247, 249, 268, 269, 274, 277, 280, 284, 288, 291, 293 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 71, 0, -1, -1, 72, 73, -1, 73, 74, 81, -1, 74, 81, -1, -1, 7, 83, -1, 79, -1, 21, -1, 20, 59, 87, -1, 46, 59, 4, -1, 32, 59, 4, -1, 12, 59, 4, -1, 27, 37, 59, 4, -1, 33, 23, 38, 59, 91, -1, 35, 23, 38, 59, 91, -1, -1, 24, 54, 59, 75, 6, -1, 18, 54, 59, 84, -1, 30, 59, 85, -1, -1, 49, 54, 59, 76, 6, -1, 17, 39, 59, 86, -1, 60, 51, 59, 91, -1, 61, 51, 59, 91, -1, 34, 28, 59, 93, -1, 43, 28, 59, 87, -1, 19, 12, 59, 91, -1, 58, 55, 59, 6, -1, 45, 47, 22, 59, 82, -1, 62, 42, 44, 59, 89, -1, 62, 42, 10, 59, 89, -1, 62, 42, 53, 59, 87, -1, -1, 18, 29, 57, 59, 77, 6, -1, 40, 50, 59, 89, -1, 11, 36, 59, 87, -1, -1, 58, 59, 78, 95, -1, 25, 59, 87, -1, 13, 59, 87, -1, 18, 26, 57, 59, 89, -1, 18, 37, 57, 59, 89, -1, 48, 31, 63, 41, 64, 59, 4, 4, -1, -1, 65, 80, 6, -1, 66, -1, 3, -1, 5, -1, 4, -1, 8, -1, 9, -1, 4, -1, 16, -1, 15, -1, 14, -1, 4, -1, 67, 68, -1, 67, 88, 68, -1, 88, 6, -1, 6, -1, 67, 90, 68, -1, 90, 69, 82, -1, 82, -1, 67, 92, 68, -1, 92, 69, 4, -1, 4, -1, 67, 6, 69, 4, 69, 4, 69, 82, 69, 82, 69, 82, 69, 82, 69, 4, 94, 68, -1, -1, 69, 6, 69, 6, -1, 69, 6, -1, 67, 68, -1, 67, 96, 68, -1, 96, 69, 97, -1, 96, 69, -1, 97, -1, 82, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 102, 102, 102, 104, 105, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 145, 145, 148, 149, 152, 153, 156, 157, 160, 190, 191, 192, 195, 208, 209, 212, 213, 216, 219, 220, 223, 226, 227, 230, 233, 234, 235, 238, 244, 259, 260, 261, 264 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "EOF_", "INT", "REAL", "STRING", "DEBUG_", "ON_", "OFF_", "AVERAGE_", "BAND_", "BANDS_", "BBL_", "BIL_", "BIP_", "BSQ_", "BYTE_", "DATA_", "DEFAULT_", "DESCRIPTION_", "ENVI_", "FACTOR_", "FRAME_", "FILE_", "FWHM_", "GAIN_", "HEADER_", "INFO_", "IGNORE_", "INTERLEAVE_", "LIMITS_", "LINES_", "MAJOR_", "MAP_", "MINOR_", "NAMES_", "OFFSET_", "OFFSETS_", "ORDER_", "PIXEL_", "PIXELS_", "PLOT_", "PROJECTION_", "RANGE_", "REFLECTANCE_", "SAMPLES_", "SCALE_", "SCANNER_", "SENSOR_", "SIZE_", "START_", "STRETCH_", "TITLES_", "TYPE_", "UNITS_", "VALUE_", "VALUES_", "WAVELENGTH_", "'='", "'X'", "'Y'", "'Z'", "'('", "')'", "';'", "'\\n'", "'{'", "'}'", "','", "$accept", "start", "@1", "commands", "command", "@2", "@3", "@4", "@5", "comment", "@6", "terminator", "numeric", "debug", "bitpix", "encoding", "endian", "liststr", "strings", "listnum", "numerics", "listint", "ints", "listmap", "listmapopt", "listwave", "aWaves", "aWave", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 61, 88, 89, 90, 40, 41, 59, 10, 123, 125, 44 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 70, 72, 71, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 74, 74, 74, 76, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 77, 74, 74, 74, 78, 74, 74, 74, 74, 74, 74, 80, 79, 81, 81, 82, 82, 83, 83, 84, 85, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 3, 2, 0, 2, 1, 1, 3, 3, 3, 3, 4, 5, 5, 0, 5, 4, 3, 0, 5, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 0, 6, 4, 4, 0, 4, 3, 3, 5, 5, 8, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 3, 3, 1, 3, 3, 1, 18, 0, 4, 2, 2, 3, 3, 2, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 8, 51, 52, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 48, 47, 5, 0, 13, 0, 41, 0, 0, 0, 0, 0, 0, 10, 17, 40, 0, 56, 55, 54, 20, 12, 0, 0, 0, 0, 0, 0, 11, 0, 21, 0, 0, 0, 0, 0, 0, 0, 46, 4, 37, 61, 58, 0, 57, 23, 0, 34, 0, 53, 19, 0, 28, 0, 14, 0, 0, 26, 0, 0, 36, 27, 0, 0, 0, 29, 0, 39, 24, 25, 0, 0, 0, 60, 59, 42, 0, 43, 67, 0, 18, 15, 0, 16, 50, 49, 64, 0, 30, 0, 22, 72, 77, 0, 76, 32, 31, 33, 35, 65, 0, 0, 62, 0, 0, 73, 75, 66, 0, 63, 0, 74, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 71, 68, 0, 70 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 2, 32, 33, 122, 133, 145, 101, 34, 67, 71, 161, 37, 119, 89, 114, 75, 112, 129, 156, 121, 148, 126, 195, 136, 162, 163 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -126 static const yytype_int16 yypact[] = { -126, 24, 68, -126, -1, 1, -6, -3, 6, -14, 50, 40, -126, 12, 45, 46, 51, 53, 82, 81, 92, 69, 90, 73, 63, 93, 67, -9, 72, 74, 85, -126, 9, -2, -126, -126, -126, -126, 75, 127, 65, 76, 79, 80, 83, 84, 86, 65, 87, 65, 88, 62, 134, 101, 89, 103, 91, 94, 120, 140, 95, 96, 97, -126, 98, 100, 7, 143, -2, -126, -126, -126, 65, -126, 4, -126, 147, 102, 104, 105, 148, 99, -126, -126, -126, 150, -126, -126, -126, -126, -126, 106, 107, 108, 109, 65, 110, -126, 119, -126, 156, 111, 99, 99, 112, 113, 114, -126, -126, -126, -126, -126, 5, -126, -126, 109, -126, 109, -126, -126, 164, -126, 169, -126, 99, 171, -126, 99, 14, -126, -126, 14, 115, 174, -126, 0, -126, -126, -126, 109, 109, 65, -126, -126, -126, 175, -126, -126, -37, -126, -126, 116, -126, -126, -126, -126, 22, -126, 123, -126, -126, -126, 28, -126, -126, -126, -126, -126, -126, 166, 179, -126, 14, 180, -126, 14, -126, 117, -126, 183, -126, 184, -126, 121, 14, 122, 14, 124, 14, 125, 14, 126, 185, 128, 186, 130, 131, -126, 190, -126 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -126, -126, -126, -126, 167, -126, -126, -126, -126, -126, -126, 133, -125, -126, -126, -126, -126, -47, -126, -33, -126, -89, -126, -126, -126, -126, -126, 27 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -4 static const yytype_int16 yytable[] = { 82, 69, 84, 155, 153, 154, 157, 35, 36, -3, 110, 142, 42, 137, 138, 43, 4, 104, 153, 154, 5, 6, 7, 44, 3, 109, 8, 9, 10, 11, 12, 168, 169, 13, 14, 150, 15, 38, 152, 16, 45, 17, 18, 19, 20, 41, 62, 178, 130, 21, 63, 105, 22, 39, 23, 24, 40, 25, 26, 185, 106, 187, 46, 189, 70, 191, 48, 27, 160, 28, 29, 30, 111, 143, 31, 4, 86, 87, 88, 5, 6, 7, 144, 50, 146, 8, 9, 10, 11, 12, 171, 172, 13, 14, 166, 15, 174, 175, 16, 47, 17, 18, 19, 20, 49, 53, 164, 165, 21, 54, 51, 22, 52, 23, 24, 55, 25, 26, 57, 56, 58, 61, 59, 64, 60, 65, 27, 66, 28, 29, 30, 73, 74, 31, 72, 76, 77, 78, 90, 91, 79, 93, 96, 80, 97, 81, 83, 85, 92, 107, 94, 113, 118, 95, 123, 99, 100, 102, 98, 103, 132, 115, 134, 116, 117, 124, 120, 127, 147, 131, 176, 139, 140, 141, 125, 149, 128, 151, 135, 158, 159, 167, 173, 177, 179, 170, 181, 182, 183, 193, 184, 186, 196, 188, 190, 192, 199, 194, 197, 68, 198, 108, 180 }; static const yytype_uint8 yycheck[] = { 47, 3, 49, 128, 4, 5, 131, 8, 9, 0, 6, 6, 26, 102, 103, 29, 7, 10, 4, 5, 11, 12, 13, 37, 0, 72, 17, 18, 19, 20, 21, 68, 69, 24, 25, 124, 27, 36, 127, 30, 54, 32, 33, 34, 35, 39, 55, 172, 95, 40, 59, 44, 43, 59, 45, 46, 59, 48, 49, 184, 53, 186, 12, 188, 66, 190, 54, 58, 68, 60, 61, 62, 68, 68, 65, 7, 14, 15, 16, 11, 12, 13, 115, 37, 117, 17, 18, 19, 20, 21, 68, 69, 24, 25, 141, 27, 68, 69, 30, 59, 32, 33, 34, 35, 59, 23, 139, 140, 40, 28, 59, 43, 59, 45, 46, 23, 48, 49, 28, 50, 47, 54, 59, 51, 31, 51, 58, 42, 60, 61, 62, 4, 67, 65, 59, 59, 57, 57, 4, 38, 57, 38, 22, 59, 4, 59, 59, 59, 59, 6, 59, 4, 4, 59, 4, 59, 59, 59, 63, 59, 41, 59, 6, 59, 59, 59, 67, 59, 4, 59, 4, 59, 59, 59, 67, 6, 67, 6, 67, 64, 6, 6, 59, 4, 4, 69, 69, 4, 4, 4, 69, 69, 6, 69, 69, 69, 6, 69, 68, 32, 69, 68, 175 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 71, 72, 0, 7, 11, 12, 13, 17, 18, 19, 20, 21, 24, 25, 27, 30, 32, 33, 34, 35, 40, 43, 45, 46, 48, 49, 58, 60, 61, 62, 65, 73, 74, 79, 8, 9, 83, 36, 59, 59, 39, 26, 29, 37, 54, 12, 59, 54, 59, 37, 59, 59, 23, 28, 23, 50, 28, 47, 59, 31, 54, 55, 59, 51, 51, 42, 80, 74, 3, 66, 81, 59, 4, 67, 87, 59, 57, 57, 57, 59, 59, 87, 59, 87, 59, 14, 15, 16, 85, 4, 38, 59, 38, 59, 59, 22, 4, 63, 59, 59, 78, 59, 59, 10, 44, 53, 6, 81, 87, 6, 68, 88, 4, 86, 59, 59, 59, 4, 84, 67, 91, 75, 4, 59, 67, 93, 59, 67, 89, 87, 59, 41, 76, 6, 67, 95, 91, 91, 59, 59, 59, 6, 68, 89, 77, 89, 4, 92, 6, 91, 6, 91, 4, 5, 82, 90, 82, 64, 6, 68, 82, 96, 97, 89, 89, 87, 6, 68, 69, 69, 68, 69, 59, 68, 69, 4, 4, 82, 4, 97, 69, 4, 4, 69, 82, 69, 82, 69, 82, 69, 82, 69, 4, 69, 94, 6, 68, 69, 6 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (envi, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, envi, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* envi, enviFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, envi, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* envi; enviFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (envi); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* envi, enviFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, envi, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* envi; enviFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, envi, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, FitsFile* envi, enviFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, envi, ll) YYSTYPE *yyvsp; int yyrule; FitsFile* envi; enviFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , envi, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, envi, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, FitsFile* envi, enviFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, envi, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; FitsFile* envi; enviFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (envi); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (FitsFile* envi, enviFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (FitsFile* envi, enviFlexLexer* ll) #else int yyparse (envi, ll) FitsFile* envi; enviFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 102 "fitsy++/enviparser.Y" {envi->setpArch(FitsFile::BIG);} break; case 11: #line 113 "fitsy++/enviparser.Y" {envi->setpWidth((yyvsp[(3) - (3)].integer));;} break; case 12: #line 114 "fitsy++/enviparser.Y" {envi->setpHeight((yyvsp[(3) - (3)].integer));;} break; case 13: #line 115 "fitsy++/enviparser.Y" {envi->setpDepth((yyvsp[(3) - (3)].integer));;} break; case 14: #line 116 "fitsy++/enviparser.Y" {envi->setpSkip((yyvsp[(4) - (4)].integer));;} break; case 17: #line 119 "fitsy++/enviparser.Y" {DISCARD_(1);} break; case 21: #line 122 "fitsy++/enviparser.Y" {DISCARD_(1);} break; case 34: #line 134 "fitsy++/enviparser.Y" {DISCARD_(1);} break; case 38: #line 137 "fitsy++/enviparser.Y" {numWave=0;;} break; case 45: #line 145 "fitsy++/enviparser.Y" {DISCARD_(1);} break; case 48: #line 149 "fitsy++/enviparser.Y" {YYACCEPT;;} break; case 49: #line 152 "fitsy++/enviparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 50: #line 153 "fitsy++/enviparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 51: #line 156 "fitsy++/enviparser.Y" {yydebug=1;;} break; case 52: #line 157 "fitsy++/enviparser.Y" {yydebug=0;;} break; case 53: #line 161 "fitsy++/enviparser.Y" { switch((yyvsp[(1) - (1)].integer)) { case 1: {envi->setpBitpix(8);} break; case 2: {envi->setpBitpix(16);} break; case 12: {envi->setpBitpix(-16);} break; case 3: {envi->setpBitpix(32);} break; case 14: {envi->setpBitpix(64);} break; case 4: {envi->setpBitpix(-32);} break; case 5: {envi->setpBitpix(-64);} break; default: break; } ;} break; case 54: #line 190 "fitsy++/enviparser.Y" {envi->setpEncoding(FitsFile::BSQ);;} break; case 55: #line 191 "fitsy++/enviparser.Y" {envi->setpEncoding(FitsFile::BIP);;} break; case 56: #line 192 "fitsy++/enviparser.Y" {envi->setpEncoding(FitsFile::BIL);;} break; case 57: #line 196 "fitsy++/enviparser.Y" { switch((yyvsp[(1) - (1)].integer)) { case 0: {envi->setpArch(FitsFile::LITTLE);} break; case 1: {envi->setpArch(FitsFile::BIG);} break; } ;} break; case 72: #line 239 "fitsy++/enviparser.Y" { envi->setpCRPIX3(1); envi->setpCRVAL3(1); envi->setpCDELT3(1); ;} break; case 73: #line 245 "fitsy++/enviparser.Y" { if (numWave>=2) { envi->setpCRPIX3(1); envi->setpCRVAL3(wave[0]); envi->setpCDELT3((wave[numWave-1]-wave[0])/(numWave-1)); } else { envi->setpCRPIX3(1); envi->setpCRVAL3(1); envi->setpCDELT3(1); } ;} break; case 77: #line 265 "fitsy++/enviparser.Y" { if (numWave < MAXWAVES) wave[numWave++] = (yyvsp[(1) - (1)].real); ;} break; /* Line 1267 of yacc.c. */ #line 1802 "fitsy++/enviparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (envi, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (envi, ll, yymsg); } else { yyerror (envi, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, envi, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, envi, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (envi, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, envi, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, envi, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 271 "fitsy++/enviparser.Y" saods9/tksao1.0/fitsy++/enviparser.H000644 000765 000000 00000010446 12553253014 017504 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { EOF_ = 258, INT = 259, REAL = 260, STRING = 261, DEBUG_ = 262, ON_ = 263, OFF_ = 264, AVERAGE_ = 265, BAND_ = 266, BANDS_ = 267, BBL_ = 268, BIL_ = 269, BIP_ = 270, BSQ_ = 271, BYTE_ = 272, DATA_ = 273, DEFAULT_ = 274, DESCRIPTION_ = 275, ENVI_ = 276, FACTOR_ = 277, FRAME_ = 278, FILE_ = 279, FWHM_ = 280, GAIN_ = 281, HEADER_ = 282, INFO_ = 283, IGNORE_ = 284, INTERLEAVE_ = 285, LIMITS_ = 286, LINES_ = 287, MAJOR_ = 288, MAP_ = 289, MINOR_ = 290, NAMES_ = 291, OFFSET_ = 292, OFFSETS_ = 293, ORDER_ = 294, PIXEL_ = 295, PIXELS_ = 296, PLOT_ = 297, PROJECTION_ = 298, RANGE_ = 299, REFLECTANCE_ = 300, SAMPLES_ = 301, SCALE_ = 302, SCANNER_ = 303, SENSOR_ = 304, SIZE_ = 305, START_ = 306, STRETCH_ = 307, TITLES_ = 308, TYPE_ = 309, UNITS_ = 310, VALUE_ = 311, VALUES_ = 312, WAVELENGTH_ = 313 }; #endif /* Tokens. */ #define EOF_ 258 #define INT 259 #define REAL 260 #define STRING 261 #define DEBUG_ 262 #define ON_ 263 #define OFF_ 264 #define AVERAGE_ 265 #define BAND_ 266 #define BANDS_ 267 #define BBL_ 268 #define BIL_ 269 #define BIP_ 270 #define BSQ_ 271 #define BYTE_ 272 #define DATA_ 273 #define DEFAULT_ 274 #define DESCRIPTION_ 275 #define ENVI_ 276 #define FACTOR_ 277 #define FRAME_ 278 #define FILE_ 279 #define FWHM_ 280 #define GAIN_ 281 #define HEADER_ 282 #define INFO_ 283 #define IGNORE_ 284 #define INTERLEAVE_ 285 #define LIMITS_ 286 #define LINES_ 287 #define MAJOR_ 288 #define MAP_ 289 #define MINOR_ 290 #define NAMES_ 291 #define OFFSET_ 292 #define OFFSETS_ 293 #define ORDER_ 294 #define PIXEL_ 295 #define PIXELS_ 296 #define PLOT_ 297 #define PROJECTION_ 298 #define RANGE_ 299 #define REFLECTANCE_ 300 #define SAMPLES_ 301 #define SCALE_ 302 #define SCANNER_ 303 #define SENSOR_ 304 #define SIZE_ 305 #define START_ 306 #define STRETCH_ 307 #define TITLES_ 308 #define TYPE_ 309 #define UNITS_ 310 #define VALUE_ 311 #define VALUES_ 312 #define WAVELENGTH_ 313 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 30 "fitsy++/enviparser.Y" { #define ENVIPARSERSIZE 1024 float real; int integer; char str[ENVIPARSERSIZE]; } /* Line 1529 of yacc.c. */ #line 172 "fitsy++/enviparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/fitsy++/enviparser.Y000644 000765 000000 00000011472 12464230772 017534 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {FitsFile* envi} %lex-param {enviFlexLexer* ll} %parse-param {enviFlexLexer* ll} %{ #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; enviDiscard(x);} #include "file.h" #undef yyFlexLexer #define yyFlexLexer enviFlexLexer #include extern int envilex(void*, enviFlexLexer*); extern void envierror(FitsFile*, enviFlexLexer*, const char*); extern void enviDiscard(int); static int numWave; static float wave[MAXWAVES]; %} %union { #define ENVIPARSERSIZE 1024 float real; int integer; char str[ENVIPARSERSIZE]; } %type numeric // Basic %token EOF_ %token INT %token REAL %token STRING %token DEBUG_ %token ON_ %token OFF_ %token AVERAGE_ %token BAND_ %token BANDS_ %token BBL_ %token BIL_ %token BIP_ %token BSQ_ %token BYTE_ %token DATA_ %token DEFAULT_ %token DESCRIPTION_ %token ENVI_ %token FACTOR_ %token FRAME_ %token FILE_ %token FWHM_ %token GAIN_ %token HEADER_ %token INFO_ %token IGNORE_ %token INTERLEAVE_ %token LIMITS_ %token LINES_ %token MAJOR_ %token MAP_ %token MINOR_ %token NAMES_ %token OFFSET_ %token OFFSETS_ %token ORDER_ %token PIXEL_ %token PIXELS_ %token PLOT_ %token PROJECTION_ %token RANGE_ %token REFLECTANCE_ %token SAMPLES_ %token SCALE_ %token SCANNER_ %token SENSOR_ %token SIZE_ %token START_ %token STRETCH_ %token TITLES_ %token TYPE_ %token UNITS_ %token VALUE_ %token VALUES_ %token WAVELENGTH_ %% //start : {yydebug=1;} commands start : {envi->setpArch(FitsFile::BIG)} commands commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | comment | ENVI_ | DESCRIPTION_ '=' liststr | SAMPLES_ '=' INT {envi->setpWidth($3);} | LINES_ '=' INT {envi->setpHeight($3);} | BANDS_ '=' INT {envi->setpDepth($3);} | HEADER_ OFFSET_ '=' INT {envi->setpSkip($4);} | MAJOR_ FRAME_ OFFSETS_ '=' listint | MINOR_ FRAME_ OFFSETS_ '=' listint | FILE_ TYPE_ '=' {DISCARD_(1)} STRING | DATA_ TYPE_ '=' bitpix | INTERLEAVE_ '=' encoding | SENSOR_ TYPE_ '=' {DISCARD_(1)} STRING | BYTE_ ORDER_ '=' endian | 'X' START_ '=' listint | 'Y' START_ '=' listint | MAP_ INFO_ '=' listmap | PROJECTION_ INFO_ '=' liststr | DEFAULT_ BANDS_ '=' listint | WAVELENGTH_ UNITS_ '=' STRING | REFLECTANCE_ SCALE_ FACTOR_ '=' numeric | 'Z' PLOT_ RANGE_ '=' listnum | 'Z' PLOT_ AVERAGE_ '=' listnum | 'Z' PLOT_ TITLES_ '=' liststr | DATA_ IGNORE_ VALUES_ '=' {DISCARD_(1)} STRING | PIXEL_ SIZE_ '=' listnum | BAND_ NAMES_ '=' liststr | WAVELENGTH_ '=' {numWave=0;} listwave | FWHM_ '=' liststr | BBL_ '=' liststr | DATA_ GAIN_ VALUES_ '=' listnum | DATA_ OFFSET_ VALUES_ '=' listnum | SCANNER_ LIMITS_ '(' PIXELS_ ')' '=' INT INT ; comment : ';' {DISCARD_(1)} STRING ; terminator: '\n' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; bitpix : INT { switch($1) { case 1: {envi->setpBitpix(8);} break; case 2: {envi->setpBitpix(16);} break; case 12: {envi->setpBitpix(-16);} break; case 3: {envi->setpBitpix(32);} break; case 14: {envi->setpBitpix(64);} break; case 4: {envi->setpBitpix(-32);} break; case 5: {envi->setpBitpix(-64);} break; default: break; } } ; encoding : BSQ_ {envi->setpEncoding(FitsFile::BSQ);} | BIP_ {envi->setpEncoding(FitsFile::BIP);} | BIL_ {envi->setpEncoding(FitsFile::BIL);} ; endian : INT { switch($1) { case 0: {envi->setpArch(FitsFile::LITTLE);} break; case 1: {envi->setpArch(FitsFile::BIG);} break; } } ; liststr : '{' '}' | '{' strings '}' ; strings : strings STRING | STRING ; listnum : '{' numerics '}' ; numerics: numerics ',' numeric | numeric ; listint : '{' ints '}' ; ints : ints ',' INT | INT ; listmap : '{' STRING ',' INT ',' INT ',' numeric ',' numeric ',' numeric ',' numeric ',' INT listmapopt '}' ; listmapopt : /* empty */ | ',' STRING ',' STRING | ',' STRING ; listwave: '{' '}' { envi->setpCRPIX3(1); envi->setpCRVAL3(1); envi->setpCDELT3(1); } | '{' aWaves '}' { if (numWave>=2) { envi->setpCRPIX3(1); envi->setpCRVAL3(wave[0]); envi->setpCDELT3((wave[numWave-1]-wave[0])/(numWave-1)); } else { envi->setpCRPIX3(1); envi->setpCRVAL3(1); envi->setpCDELT3(1); } } ; aWaves : aWaves ',' aWave | aWaves ',' | aWave ; aWave : numeric { if (numWave < MAXWAVES) wave[numWave++] = $1; } ; %% saods9/tksao1.0/fitsy++/file.C000644 000765 000000 00000021105 12631401103 016221 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "file.h" // extention parser #undef yyFlexLexer #define yyFlexLexer ffFlexLexer #include void* fflval; ffFlexLexer* fflexx; extern int ffparse(FitsFile*, ffFlexLexer*); int fflex(void* vval, ffFlexLexer* ll) { fflval = vval; fflexx = ll; return ll ? ll->yylex() : 0; } void fferror(FitsFile* ff, ffFlexLexer* ll, const char* m) { ff->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') ff->error(cmd); } // nrrd parser #undef yyFlexLexer #define yyFlexLexer nrrdFlexLexer #include void* nrrdlval; nrrdFlexLexer* nrrdlexx; extern int nrrdparse(FitsFile*, nrrdFlexLexer*); int nrrdlex(void* vval, nrrdFlexLexer* ll) { nrrdlval = vval; nrrdlexx = ll; return ll ? ll->yylex() : 0; } void nrrderror(FitsFile* nrrd, nrrdFlexLexer* ll, const char* m) { nrrd->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') nrrd->error(cmd); } // envi parser #undef yyFlexLexer #define yyFlexLexer enviFlexLexer #include void* envilval; enviFlexLexer* envilexx; extern int enviparse(FitsFile*, enviFlexLexer*); int envilex(void* vval, enviFlexLexer* ll) { envilval = vval; envilexx = ll; return ll ? ll->yylex() : 0; } void envierror(FitsFile* envi, enviFlexLexer* ll, const char* m) { envi->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') envi->error(cmd); } FitsFile::FitsFile() { primary_ = NULL; managePrimary_ = 0; head_ = NULL; manageHead_ = 1; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; ext_ = 0; inherit_ = 0; byteswap_ = lsb(); endian_ = BIG; valid_ = 0; pName_ = NULL; pExt_ = NULL; pIndex_ = -1; pFilter_ = NULL; pBinX_ = NULL; pBinY_ = NULL; pBinZ_ = NULL; pBitpix_ =0; pWidth_ =0; pHeight_ =0; pDepth_ =1; pSkip_ =0; pArch_ =NATIVE; pEncoding_ =RAW; pHPXOrder_ =-1; pHPXSystem_ =-1; pHPXLayout_ =-1; pHPXColumn_ =-1; pHPXQuad_ =-1; pCRPIX3_ =1; pCRVAL3_ =1; pCDELT3_ =1; pcoord_ =0; pxvalid_ =0; pxmin_ =0; pxmax_ =0; pyvalid_ =0; pymin_ =0; pymax_ =0; pzvalid_ =0; pzmin_ =0; pzmax_ =0; pbvalid_ =0; pblock_ =1; } FitsFile::~FitsFile() { if (manageHead_ && head_) delete head_; if (managePrimary_ && primary_) delete primary_; if (pName_) delete [] pName_; if (pExt_) delete [] pExt_; if (pFilter_) delete [] pFilter_; if (pBinX_) delete [] pBinX_; if (pBinY_) delete [] pBinY_; if (pBinZ_) delete [] pBinZ_; } void FitsFile::parse(const char* fn) { if (fn) { string x(fn); istringstream str(x); valid_ = 1; ffFlexLexer* ll = new ffFlexLexer(&str); ffparse(this, ll); delete ll; } if (!pBinX_ && !pBinY_) { char *env; if ((env = getenv("DS9_BINKEY"))) { string x(env); istringstream str(x); valid_ = 1; ffFlexLexer* ll = new ffFlexLexer(&str); ffparse(this, ll); delete ll; } } if (!pWidth_ && !pHeight_ && !pBitpix_) { char *env; if ((env = getenv("DS9_ARRAY"))) { string x(env); istringstream str(x); valid_ = 1; ffFlexLexer* ll = new ffFlexLexer(&str); ffparse(this, ll); delete ll; } } } void FitsFile::error(const char* m) { valid_ = 0; // cerr << m << endl; } int FitsFile::findEnd(const char* blk) { for (int j=0; jhdu()); FitsColumn* col = hdu->find(name); if (col) { if (!col->hasMinMax()) { double zmin = DBL_MAX; double zmax = -DBL_MAX; int rowlen = hdu->width(); int numrow = hdu->rows(); char* ptr = (char*)data(); for (int i=0; ivalue(ptr); if (z < zmin) zmin = z; if (z > zmax) zmax = z; } // for memory models that support internal paging resetpage(); col->setMin(zmin); col->setMax(zmax); return Vector(zmin,zmax); } else return Vector(col->getMin(), col->getMax()); } } return Vector(); } void FitsFile::setColMinMax(const char* name, const Vector& lim) { if (isBinTable()) { FitsTableHDU* hdu = (FitsTableHDU*)(head()->hdu()); FitsColumn* col = hdu->find(name); if (col) { Vector ll=lim; col->setMin(ll[0]); col->setMax(ll[1]); } } } Vector FitsFile::getColDim(const char* name) { if (isBinTable()) { FitsTableHDU* hdu = (FitsTableHDU*)(head()->hdu()); FitsColumn* col = hdu->find(name); if (col) { if (col->hasTLMinTLMax()) { Vector lim = col->dimension(); col->setMin(lim[0]); col->setMax(lim[1]); return lim; } else return getColMinMax(name); } } return Vector(); } int FitsFile::validParams() { if (!pWidth_ || !pHeight_ || !pBitpix_) return 0; // check for valid bitpix switch (pBitpix_) { case 8: case 16: case -16: case 32: case 64: case -32: case -64: break; default: return 0; } return 1; } void FitsFile::setByteSwap() { switch (pArch_) { case BIG: endian_ = pArch_; byteswap_ = lsb(); break; case LITTLE: endian_ = pArch_; byteswap_ = !lsb(); break; case NATIVE: endian_ = lsb() ? LITTLE : BIG; byteswap_ = 0; break; } } void FitsFile::parseNRRD(istream& str) { valid_ = 1; nrrdFlexLexer* ll = new nrrdFlexLexer(&str); nrrdparse(this, ll); delete ll; } void FitsFile::parseENVI(istream& str) { valid_ = 1; enviFlexLexer* ll = new enviFlexLexer(&str); enviparse(this, ll); delete ll; } int FitsFile::find(const char* name) { if (head_) { if (head_->find(name)) return 1; else if (primary_ && inherit_) if (primary_->find(name)) return 1; } return 0; } int FitsFile::getLogical(const char* name, int def) { if (head_) { int r = head_->getLogical(name,def); if (r != def) return r; else if (primary_ && inherit_) return primary_->getLogical(name,def); } return def; } int FitsFile::getInteger(const char* name, int def) { if (head_) { int r = head_->getInteger(name,def); if (r != def) return r; else if (primary_ && inherit_) return primary_->getInteger(name,def); } return def; } double FitsFile::getReal(const char* name, double def) { if (head_) { double r = head_->getReal(name,def); if (r != def) return r; else if (primary_ && inherit_) return primary_->getReal(name,def); } return def; } void FitsFile::getComplex(const char* name, double* real, double* img, double rdef, double idef) { if (head_) { head_->getComplex(name, real, img, rdef, idef); if (*real != rdef || *img != idef) return; else if (primary_ && inherit_) { primary_->getComplex(name, real, img, rdef, idef); return; } } *real = rdef; *img = idef; } char* FitsFile::getString(const char* name) { if (head_) { char* r = head_->getString(name); if (r) return r; else if (primary_ && inherit_) return primary_->getString(name); } return NULL; } char* FitsFile::getComment(const char* name) { if (head_) { char* r = head_->getComment(name); if (r) return r; else if (primary_ && inherit_) return primary_->getComment(name); } return NULL; } char* FitsFile::getKeyword(const char* name) { if (head_) { char* r = head_->getKeyword(name); if (r) return r; else if (primary_ && inherit_) return primary_->getKeyword(name); } return NULL; } saods9/tksao1.0/fitsy++/file.h000644 000765 000000 00000015754 12631401103 016303 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsfile_h__ #define __fitsfile_h__ #include "head.h" #define B4KB 4096 #define B1MB 1048576 #define MAXWAVES 2048 extern int DebugGZ; extern int DebugCompress; class OutFitsStream; class FitsFile { public: enum FlushMode {NOFLUSH,FLUSH}; enum ScanMode {RELAX, EXACT}; enum ArchType {NATIVE,BIG,LITTLE}; enum EncodingType {RAW,ASCII,HEX,GZIP,BZ2,BIP,BIL,BSQ}; protected: FitsHead* primary_; // pointer to primary header int managePrimary_; // flag, true if we manage primary header FitsHead* head_; // pointer to header int manageHead_; // flag, true if we manage header void* data_; // pointer to raw data size_t dataSize_; // size of data memory segment size_t dataSkip_; // skip into data memory segment int ext_; // extension number int inherit_; // do we have inheritence? int byteswap_; // flag, true if byteswap is needed ArchType endian_; // endian of data int valid_; // flag, true if file is valid char* pName_; // parsed file name char* pExt_; // parsed ext name int pIndex_; // parsed ext number char* pFilter_; // unparsed filter spec char* pBinX_; // parsed bin table x col name char* pBinY_; // parsed bin table y col name char* pBinZ_; // parsed bin table z col name int pBitpix_; // parsed bitpix int pWidth_; // parsed width int pHeight_; // parsed height int pDepth_; // parsed depth size_t pSkip_; // parsed skip size ArchType pArch_; // parsed arch type EncodingType pEncoding_; // parsed encoding int pHPXOrder_; // parsed HPX params int pHPXSystem_; int pHPXLayout_; int pHPXColumn_; int pHPXQuad_; double pCRPIX3_; // WCS_3 axis params double pCRVAL3_; double pCDELT3_; int pcoord_; int pxvalid_; int pxmin_; int pxmax_; int pyvalid_; int pymin_; int pymax_; int pzvalid_; int pzmin_; int pzmax_; int pbvalid_; int pblock_; protected: void parse(const char*); void parseNRRD(istream&); void parseENVI(istream&); int validParams(); int findEnd(const char*); void setByteSwap(); public: FitsFile(); virtual ~FitsFile(); int manageHead() {return manageHead_;} virtual void done() {} virtual char* page(char* ptr, size_t r) {return ptr;} virtual void resetpage() {} void error(const char*); void* data() {return data_;} size_t dataSize() {return dataSize_;} size_t dataSkip() {return dataSkip_;} FitsHead* head() {return head_;} FitsHead* primary() {return primary_;} int ext() {return ext_;} const char* extname() {return head_ ? head_->extname() : NULL;} int inherit() {return inherit_;} void setValid(int vv) {valid_=vv;} int isValid() {return valid_;} int isImage() {return head_ ? head_->isImage() : 0;} int isTable() {return head_ ? head_->isTable() : 0;} int isAsciiTable() {return head_ ? head_->isAsciiTable() : 0;} int isBinTable() {return head_ ? head_->isBinTable() : 0;} int byteswap() {return byteswap_;} ArchType endian() {return endian_;} void setpName(const char*); void setpExt(const char*); void setpIndex(int i) {pIndex_ = i;} void setpFilter(const char*); void setpBinX(const char*); void setpBinY(const char*); void setpBinZ(const char*); void setpBinXY(const char* x, const char* y) {setpBinX(x); setpBinY(y);} void setpBinXYZ(const char* x, const char* y, const char* z) {setpBinX(x); setpBinY(y); setpBinZ(z);} const char* pName() {return pName_;} const char* pExt() {return pExt_;} int pIndex() {return pIndex_;} const char* pFilter() {return pFilter_;} const char* pBinX() {return pBinX_;} const char* pBinY() {return pBinY_;} const char* pBinZ() {return pBinZ_;} int pBitpix() {return pBitpix_;} int pWidth() {return pWidth_;} int pHeight() {return pHeight_;} int pDepth() {return pDepth_;} size_t pSkip() {return pSkip_;} ArchType pArch() {return pArch_;} void setpWidth(int i) {pWidth_ = i;} void setpHeight(int i) {pHeight_ = i;} void setpDepth(int i) {pDepth_ = i;} void setpBitpix(int b) {pBitpix_ = b;} void setpSkip(size_t s) {pSkip_ = s;} void setpArch(ArchType a) {pArch_ = a;} EncodingType pEncoding() {return pEncoding_;} void setpEncoding(EncodingType e) {pEncoding_ = e;} int pHPXOrder() {return pHPXOrder_;} int pHPXSystem() {return pHPXSystem_;} int pHPXLayout() {return pHPXLayout_;} int pHPXColumn() {return pHPXColumn_;} int pHPXQuad() {return pHPXQuad_;} void setpHPXOrder(int oo) {pHPXOrder_ = oo;} void setpHPXSystem(int ss) {pHPXSystem_ = ss;} void setpHPXLayout(int ll) {pHPXLayout_ = ll;} void setpHPXColumn(int cc) {pHPXColumn_ = cc-1;} void setpHPXQuad(int qq) {pHPXQuad_ = qq-1;} double pCRPIX3() {return pCRPIX3_;} double pCRVAL3() {return pCRVAL3_;} double pCDELT3() {return pCDELT3_;} void setpCRPIX3(double dd) {pCRPIX3_ = dd;} void setpCRVAL3(double dd) {pCRVAL3_ = dd;} void setpCDELT3(double dd) {pCDELT3_ = dd;} int pcoord() {return pcoord_;} int pxvalid() {return pxvalid_;} int pxmin() {return pxmin_;} int pxmax() {return pxmax_;} int pyvalid() {return pyvalid_;} int pymin() {return pymin_;} int pymax() {return pymax_;} int pzvalid() {return pzvalid_;} int pzmin() {return pzmin_;} int pzmax() {return pzmax_;} int pbvalid() {return pbvalid_;} int pblock() {return pblock_;} void setpcoord(int vv) {pcoord_ = vv;} void setpxvalid(int vv) {pxvalid_ = vv;} void setpxmin(int vv) {pxmin_ = vv;} void setpxmax(int vv) {pxmax_ = vv;} void setpyvalid(int vv) {pyvalid_ = vv;} void setpymin(int vv) {pymin_ = vv;} void setpymax(int vv) {pymax_ = vv;} void setpzvalid(int vv) {pzvalid_ = vv;} void setpzmin(int vv) {pzmin_ = vv;} void setpzmax(int vv) {pzmax_ = vv;} void setpbvalid(int vv) {pbvalid_ = vv;} void setpblock(int vv) {pblock_ = vv;} Vector getColMinMax(const char*); Vector getColDim(const char*); void setColMinMax(const char*, const Vector&); int find(const char* name); int getLogical(const char* name, int def); int getInteger(const char* name, int def); double getReal(const char* name, double def); void getComplex(const char* name, double* real, double* img, double rdef, double idef); char* getString(const char* name); char* getComment(const char* name); char* getKeyword(const char* name); int saveFitsPrimHeader(OutFitsStream&); int saveFitsHeader(OutFitsStream&, int); int saveFitsXtHeader(OutFitsStream&, int); int saveFits(OutFitsStream&); int saveFitsPad(OutFitsStream&, size_t, char); int saveFitsTable(OutFitsStream&); int saveFitsIISHeader(OutFitsStream&); int saveFitsIIS(OutFitsStream&, Vector&); int saveArray(OutFitsStream&, ArchType); }; #endif saods9/tksao1.0/fitsy++/gzip.C000644 000765 000000 00000017662 12552007725 016306 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "gzip.h" #include "zlib.h" #include "util.h" template FitsGzipm::FitsGzipm(FitsFile* fits) : FitsCompressm(fits) { FitsCompressm::uncompress(fits); } template int FitsGzipm::compressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { double zs = FitsCompressm::bscale_; if (FitsCompressm::zscale_) zs = FitsCompressm::zscale_->value(sptr,0); double zz = FitsCompressm::bzero_; if (FitsCompressm::zzero_) zz = FitsCompressm::zzero_->value(sptr,0); int blank = FitsCompressm::blank_; if (FitsCompressm::zblank_) blank = (int)FitsCompressm::zblank_->value(sptr,0); int icnt=0; unsigned char* ibuf = (unsigned char*)((FitsBinColumnArray*)FitsCompressm::compress_)->get(heap, sptr, &icnt); // ibuf can be NULL if (!ibuf || !icnt) return 0; int ocnt = FitsCompressm::tilesize_; char* obuf = new char[ocnt*sizeof(long long)]; if (!obuf) { internalError("Fitsy++ gzip unable to alloc."); return 0; } z_stream zstrm; zstrm.next_in = NULL; zstrm.avail_in = 0; zstrm.zalloc = NULL; zstrm.zfree = NULL; zstrm.opaque = NULL; // look for both zlib and gzip headers if (inflateInit2(&zstrm, MAX_WBITS+32) != Z_OK) { internalError("Fitsy++ gzip inflateInit error"); if (obuf) delete [] obuf; return 0; } zstrm.avail_in = icnt; zstrm.next_in = ibuf; zstrm.avail_out = ocnt*sizeof(int); zstrm.next_out = (Bytef*)obuf; if (DebugCompress) cerr << " inflate START: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; int result = ::inflate(&zstrm, Z_FINISH); switch (result) { case Z_OK: if (DebugCompress) cerr << " inflate OK: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_STREAM_END: if (DebugCompress) cerr << " inflate STREAM_END: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_BUF_ERROR: if (DebugCompress) cerr << " inflate BUF_ERROR: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << endl; if (obuf) delete [] obuf; return 0; default: internalError("Fitsy++ gzip inflate error"); if (obuf) delete [] obuf; return 0; } int bytepix = zstrm.total_out/FitsCompressm::tilesize_; inflateEnd(&zstrm); // GZIP_2- unshuffle if needed if (!strncmp(FitsCompressm::type_,"GZIP_2",6)) { switch (bytepix) { case 1: break; case 2: { int ll = ocnt*sizeof(short); char* nbuf = new char[ll]; if (!nbuf) { internalError("Fitsy++ gzip unable to alloc."); if (obuf) delete [] obuf; return 0; } char* optr = obuf+ll-1; char* nptr = nbuf+ll-1; for (int ii=0; ii::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; // very carefull about type conversions T val = FitsCompressm::getValue(obuf+ll,zs,zz,blank); dest[id] = val; } break; case 2: for (int kk=kkstart; kk::byteswap_) { const char* p = (const char*)((short*)obuf+ll); union { char c[2]; short s; } u; u.c[1] = *p++; u.c[0] = *p; *((short*)obuf+ll) = u.s; } // very carefull about type conversions size_t id = kk*FitsCompressm::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val = FitsCompressm::getValue((short*)obuf+ll,zs,zz,blank); dest[id] = val; } break; case 4: for (int kk=kkstart; kk::byteswap_) { const char* p = (const char*)((int*)obuf+ll); union { char c[4]; int i; } u; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; *((int*)obuf+ll) = u.i; } // very carefull about type conversions size_t id = kk*FitsCompressm::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val =0; switch (FitsCompressm::quantize_) { case FitsCompress::NODITHER: val = FitsCompressm::getValue((float*)obuf+ll,zs,zz,blank); break; case FitsCompress::SUBDITHER1: case FitsCompress::SUBDITHER2: val = FitsCompressm::getValue((int*)obuf+ll,zs,zz,blank); break; } dest[id] = val; } break; case 8: for (int kk=kkstart; kk::byteswap_) { const char* p = (const char*)((long long*)obuf+ll); union { char c[8]; long long i; } u; u.c[7] = *p++; u.c[6] = *p++; u.c[5] = *p++; u.c[4] = *p++; u.c[3] = *p++; u.c[2] = *p++; u.c[1] = *p++; u.c[0] = *p; *((long long*)obuf+ll) = u.i; } // very carefull about type conversions size_t id = kk*FitsCompressm::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val =0; switch (FitsCompressm::quantize_) { case FitsCompress::NODITHER: val = FitsCompressm::getValue((double*)obuf+ll,zs,zz,blank); break; case FitsCompress::SUBDITHER1: case FitsCompress::SUBDITHER2: val = FitsCompressm::getValue((long long*)obuf+ll,zs,zz,blank); break; } dest[id] = val; } break; default: internalError("Fitsy++ gzip illegal bytepix"); if (obuf) delete [] obuf; return 0; } if (obuf) delete [] obuf; return 1; } template class FitsGzipm; template class FitsGzipm; template class FitsGzipm; template class FitsGzipm; template class FitsGzipm; template class FitsGzipm; template class FitsGzipm; saods9/tksao1.0/fitsy++/gzip.h000644 000765 000000 00000000645 12464214754 016350 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsgzip_h__ #define __fitsgzip_h__ #include "compress.h" template class FitsGzipm : public FitsCompressm { private: int compressed(T*, char*, char*, int, int, int, int, int, int); public: FitsGzipm(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/hcompress.C000644 000765 000000 00000006716 12552005562 017333 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; // Note: currently, hcompress will not work with float or double data with // BLANK defined, due to the fact that the decompress code takes a int() and // not an unsigned int() #include "hcompress.h" #include "util.h" extern "C" { int fits_hdecompress(unsigned char *input, int smooth, int *a, int *ny, int *nx, int *scale, int *status); int fits_hdecompress64(unsigned char *input, int smooth, long long *a, int *ny, int *nx, int *scale, int *status); } template FitsHcompressm::FitsHcompressm(FitsFile* fits) : FitsCompressm(fits) { // hcompress parameters smooth_ = 0; char name[] = "ZNAME "; char val[] = "ZVAL "; for (int ii=0; ii<9; ii++) { name[5] = '0'+ii; val[4] = '0'+ii; if (fits->find(name)) { char* which = fits->getString(name); if (!strncmp(which,"SMOOTH",4)) smooth_ = fits->getInteger(val,4); delete [] which; } } FitsCompressm::uncompress(fits); } template int FitsHcompressm::compressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { double zs = FitsCompressm::bscale_; if (FitsCompressm::zscale_) zs = FitsCompressm::zscale_->value(sptr,0); double zz = FitsCompressm::bzero_; if (FitsCompressm::zzero_) zz = FitsCompressm::zzero_->value(sptr,0); int blank = FitsCompressm::blank_; if (FitsCompressm::zblank_) blank = (int)FitsCompressm::zblank_->value(sptr,0); int icnt=0; unsigned char* ibuf = (unsigned char*)((FitsBinColumnArray*)FitsCompressm::compress_)->get(heap, sptr, &icnt); // ibuf can be NULL if (!ibuf || !icnt) return 0; int ocnt = FitsCompressm::tilesize_; int nx,ny,scale; int status=0; int ll=0; switch (FitsCompressm::bitpix_) { case 8: case 16: { int* obuf = new int[ocnt]; if (fits_hdecompress(ibuf, smooth_, obuf, &nx, &ny, &scale, &status)) { internalError("Fitsy++ hcompress bad inflate result"); return 0; } for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii] = FitsCompressm::getValue(obuf+ll,zs,zz,blank); if (obuf) delete [] obuf; } break; case 32: case -32: case -64: { long long* obuf = new long long[ocnt]; if (fits_hdecompress64(ibuf, smooth_, obuf, &nx, &ny, &scale, &status)) { internalError("Fitsy++ hcompress bad inflate result"); return 0; } for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii] = FitsCompressm::getValue((int*)obuf+ll,zs,zz,blank); if (obuf) delete [] obuf; } break; } return 1; } template class FitsHcompressm; template class FitsHcompressm; template class FitsHcompressm; template class FitsHcompressm; template class FitsHcompressm; template class FitsHcompressm; template class FitsHcompressm; saods9/tksao1.0/fitsy++/hcompress.h000644 000765 000000 00000000725 12464214754 017401 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitshcompress_h__ #define __fitshcompress_h__ #include "compress.h" template class FitsHcompressm : public FitsCompressm { protected: int smooth_; private: int compressed(T*, char*, char*, int, int, int, int, int, int); public: FitsHcompressm(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/hdecompress.c000644 000765 000000 00000173503 12536624276 017716 0ustar00joyewheel000000 000000 /* ######################################################################### These routines to apply the H-compress decompression algorithm to a 2-D Fits image were written by R. White at the STScI and were obtained from the STScI at http://www.stsci.edu/software/hcompress.html This source file is a concatination of the following sources files in the original distribution hinv.c hsmooth.c undigitize.c decode.c dodecode.c qtree_decode.c qread.c bit_input.c The following modifications have been made to the original code: - commented out redundant "include" statements - added the nextchar global variable - changed all the 'extern' declarations to 'static', since all the routines are in the same source file - changed the first parameter in decode (and in lower level routines from a file stream to a char array - modified the myread routine, and lower level byte reading routines, to copy the input bytes to a char array, instead of reading them from a file stream - changed the function declarations to the more modern ANSI C style - changed calls to printf and perror to call the CFITSIO ffpmsg routine - replace "exit" statements with "return" statements ############################################################################ */ #include #include #include #include /*#include "fitsio2.h"*/ #define LONGLONG long long #define DATA_DECOMPRESSION_ERR 0 static void ffpmsg(const char* str) {} /* WDP added test to see if min and max are already defined */ #ifndef min #define min(a,b) (((a)<(b))?(a):(b)) #endif #ifndef max #define max(a,b) (((a)>(b))?(a):(b)) #endif static long nextchar; static int decode(unsigned char *infile, int *a, int *nx, int *ny, int *scale); static int decode64(unsigned char *infile, LONGLONG *a, int *nx, int *ny, int *scale); static int hinv(int a[], int nx, int ny, int smooth ,int scale); static int hinv64(LONGLONG a[], int nx, int ny, int smooth ,int scale); static void undigitize(int a[], int nx, int ny, int scale); static void undigitize64(LONGLONG a[], int nx, int ny, int scale); static void unshuffle(int a[], int n, int n2, int tmp[]); static void unshuffle64(LONGLONG a[], int n, int n2, LONGLONG tmp[]); static void hsmooth(int a[], int nxtop, int nytop, int ny, int scale); static void hsmooth64(LONGLONG a[], int nxtop, int nytop, int ny, int scale); static void qread(unsigned char *infile,char *a, int n); static int readint(unsigned char *infile); static LONGLONG readlonglong(unsigned char *infile); static int dodecode(unsigned char *infile, int a[], int nx, int ny, unsigned char nbitplanes[3]); static int dodecode64(unsigned char *infile, LONGLONG a[], int nx, int ny, unsigned char nbitplanes[3]); static int qtree_decode(unsigned char *infile, int a[], int n, int nqx, int nqy, int nbitplanes); static int qtree_decode64(unsigned char *infile, LONGLONG a[], int n, int nqx, int nqy, int nbitplanes); static void start_inputing_bits(); static int input_bit(unsigned char *infile); static int input_nbits(unsigned char *infile, int n); /* make input_nybble a separate routine, for added effiency */ /* #define input_nybble(infile) input_nbits(infile,4) */ static int input_nybble(unsigned char *infile); static int input_nnybble(unsigned char *infile, int n, unsigned char *array); static void qtree_expand(unsigned char *infile, unsigned char a[], int nx, int ny, unsigned char b[]); static void qtree_bitins(unsigned char a[], int nx, int ny, int b[], int n, int bit); static void qtree_bitins64(unsigned char a[], int nx, int ny, LONGLONG b[], int n, int bit); static void qtree_copy(unsigned char a[], int nx, int ny, unsigned char b[], int n); static void read_bdirect(unsigned char *infile, int a[], int n, int nqx, int nqy, unsigned char scratch[], int bit); static void read_bdirect64(unsigned char *infile, LONGLONG a[], int n, int nqx, int nqy, unsigned char scratch[], int bit); static int input_huffman(unsigned char *infile); /* ---------------------------------------------------------------------- */ int fits_hdecompress(unsigned char *input, int smooth, int *a, int *ny, int *nx, int *scale, int *status) { /* decompress the input byte stream using the H-compress algorithm input - input array of compressed bytes a - pre-allocated array to hold the output uncompressed image nx - returned X axis size ny - returned Y axis size NOTE: the nx and ny dimensions as defined within this code are reversed from the usual FITS notation. ny is the fastest varying dimension, which is usually considered the X axis in the FITS image display */ int stat; if (*status > 0) return(*status); /* decode the input array */ stat = decode(input, a, nx, ny, scale); *status = stat; if (stat) return(*status); /* * Un-Digitize */ undigitize(a, *nx, *ny, *scale); /* * Inverse H-transform */ stat = hinv(a, *nx, *ny, smooth, *scale); *status = stat; return(*status); } /* ---------------------------------------------------------------------- */ int fits_hdecompress64(unsigned char *input, int smooth, LONGLONG *a, int *ny, int *nx, int *scale, int *status) { /* decompress the input byte stream using the H-compress algorithm input - input array of compressed bytes a - pre-allocated array to hold the output uncompressed image nx - returned X axis size ny - returned Y axis size NOTE: the nx and ny dimensions as defined within this code are reversed from the usual FITS notation. ny is the fastest varying dimension, which is usually considered the X axis in the FITS image display */ int stat, *iarray, ii, nval; if (*status > 0) return(*status); /* decode the input array */ stat = decode64(input, a, nx, ny, scale); *status = stat; if (stat) return(*status); /* * Un-Digitize */ undigitize64(a, *nx, *ny, *scale); /* * Inverse H-transform */ stat = hinv64(a, *nx, *ny, smooth, *scale); *status = stat; /* pack the I*8 values back into an I*4 array */ iarray = (int *) a; nval = (*nx) * (*ny); for (ii = 0; ii < nval; ii++) iarray[ii] = (int) a[ii]; return(*status); } /* ############################################################################ */ /* ############################################################################ */ /* Copyright (c) 1993 Association of Universities for Research * in Astronomy. All rights reserved. Produced under National * Aeronautics and Space Administration Contract No. NAS5-26555. */ /* hinv.c Inverse H-transform of NX x NY integer image * * Programmer: R. White Date: 23 July 1993 */ /* ############################################################################ */ static int hinv(int a[], int nx, int ny, int smooth ,int scale) /* int smooth; 0 for no smoothing, else smooth during inversion int scale; used if smoothing is specified */ { int nmax, log2n, i, j, k; int nxtop,nytop,nxf,nyf,c; int oddx,oddy; int shift, bit0, bit1, bit2, mask0, mask1, mask2, prnd0, prnd1, prnd2, nrnd0, nrnd1, nrnd2, lowbit0, lowbit1; int h0, hx, hy, hc; int s10, s00; int *tmp; /* * log2n is log2 of max(nx,ny) rounded up to next power of 2 */ nmax = (nx>ny) ? nx : ny; log2n = (int) (log((float) nmax)/log(2.0)+0.5); if ( nmax > (1<> 1; prnd1 = bit1 >> 1; prnd2 = bit2 >> 1; nrnd0 = prnd0 - 1; nrnd1 = prnd1 - 1; nrnd2 = prnd2 - 1; /* * round h0 to multiple of bit2 */ a[0] = (a[0] + ((a[0] >= 0) ? prnd2 : nrnd2)) & mask2; /* * do log2n expansions * * We're indexing a as a 2-D array with dimensions (nx,ny). */ nxtop = 1; nytop = 1; nxf = nx; nyf = ny; c = 1<=0; k--) { /* * this somewhat cryptic code generates the sequence * ntop[k-1] = (ntop[k]+1)/2, where ntop[log2n] = n */ c = c>>1; nxtop = nxtop<<1; nytop = nytop<<1; if (nxf <= c) { nxtop -= 1; } else { nxf -= c; } if (nyf <= c) { nytop -= 1; } else { nyf -= c; } /* * double shift and fix nrnd0 (because prnd0=0) on last pass */ if (k == 0) { nrnd0 = 0; shift = 2; } /* * unshuffle in each dimension to interleave coefficients */ for (i = 0; i= 0) ? prnd1 : nrnd1)) & mask1; hy = (hy + ((hy >= 0) ? prnd1 : nrnd1)) & mask1; hc = (hc + ((hc >= 0) ? prnd0 : nrnd0)) & mask0; /* * propagate bit0 of hc to hx,hy */ lowbit0 = hc & bit0; hx = (hx >= 0) ? (hx - lowbit0) : (hx + lowbit0); hy = (hy >= 0) ? (hy - lowbit0) : (hy + lowbit0); /* * Propagate bits 0 and 1 of hc,hx,hy to h0. * This could be simplified if we assume h0>0, but then * the inversion would not be lossless for images with * negative pixels. */ lowbit1 = (hc ^ hx ^ hy) & bit1; h0 = (h0 >= 0) ? (h0 + lowbit0 - lowbit1) : (h0 + ((lowbit0 == 0) ? lowbit1 : (lowbit0-lowbit1))); /* * Divide sums by 2 (4 last time) */ a[s10+1] = (h0 + hx + hy + hc) >> shift; a[s10 ] = (h0 + hx - hy - hc) >> shift; a[s00+1] = (h0 - hx + hy - hc) >> shift; a[s00 ] = (h0 - hx - hy + hc) >> shift; s00 += 2; s10 += 2; } if (oddy) { /* * do last element in row if row length is odd * s00+1, s10+1 are off edge */ h0 = a[s00 ]; hx = a[s10 ]; hx = ((hx >= 0) ? (hx+prnd1) : (hx+nrnd1)) & mask1; lowbit1 = hx & bit1; h0 = (h0 >= 0) ? (h0 - lowbit1) : (h0 + lowbit1); a[s10 ] = (h0 + hx) >> shift; a[s00 ] = (h0 - hx) >> shift; } } if (oddx) { /* * do last row if column length is odd * s10, s10+1 are off edge */ s00 = ny*i; for (j = 0; j= 0) ? (hy+prnd1) : (hy+nrnd1)) & mask1; lowbit1 = hy & bit1; h0 = (h0 >= 0) ? (h0 - lowbit1) : (h0 + lowbit1); a[s00+1] = (h0 + hy) >> shift; a[s00 ] = (h0 - hy) >> shift; s00 += 2; } if (oddy) { /* * do corner element if both row and column lengths are odd * s00+1, s10, s10+1 are off edge */ h0 = a[s00 ]; a[s00 ] = h0 >> shift; } } /* * divide all the masks and rounding values by 2 */ bit2 = bit1; bit1 = bit0; bit0 = bit0 >> 1; mask1 = mask0; mask0 = mask0 >> 1; prnd1 = prnd0; prnd0 = prnd0 >> 1; nrnd1 = nrnd0; nrnd0 = prnd0 - 1; } free(tmp); return(0); } /* ############################################################################ */ static int hinv64(LONGLONG a[], int nx, int ny, int smooth ,int scale) /* int smooth; 0 for no smoothing, else smooth during inversion int scale; used if smoothing is specified */ { int nmax, log2n, i, j, k; int nxtop,nytop,nxf,nyf,c; int oddx,oddy; int shift; LONGLONG mask0, mask1, mask2, prnd0, prnd1, prnd2, bit0, bit1, bit2; LONGLONG nrnd0, nrnd1, nrnd2, lowbit0, lowbit1; LONGLONG h0, hx, hy, hc; int s10, s00; LONGLONG *tmp; /* * log2n is log2 of max(nx,ny) rounded up to next power of 2 */ nmax = (nx>ny) ? nx : ny; log2n = (int) (log((float) nmax)/log(2.0)+0.5); if ( nmax > (1<> 1; prnd1 = bit1 >> 1; prnd2 = bit2 >> 1; nrnd0 = prnd0 - 1; nrnd1 = prnd1 - 1; nrnd2 = prnd2 - 1; /* * round h0 to multiple of bit2 */ a[0] = (a[0] + ((a[0] >= 0) ? prnd2 : nrnd2)) & mask2; /* * do log2n expansions * * We're indexing a as a 2-D array with dimensions (nx,ny). */ nxtop = 1; nytop = 1; nxf = nx; nyf = ny; c = 1<=0; k--) { /* * this somewhat cryptic code generates the sequence * ntop[k-1] = (ntop[k]+1)/2, where ntop[log2n] = n */ c = c>>1; nxtop = nxtop<<1; nytop = nytop<<1; if (nxf <= c) { nxtop -= 1; } else { nxf -= c; } if (nyf <= c) { nytop -= 1; } else { nyf -= c; } /* * double shift and fix nrnd0 (because prnd0=0) on last pass */ if (k == 0) { nrnd0 = 0; shift = 2; } /* * unshuffle in each dimension to interleave coefficients */ for (i = 0; i= 0) ? prnd1 : nrnd1)) & mask1; hy = (hy + ((hy >= 0) ? prnd1 : nrnd1)) & mask1; hc = (hc + ((hc >= 0) ? prnd0 : nrnd0)) & mask0; /* * propagate bit0 of hc to hx,hy */ lowbit0 = hc & bit0; hx = (hx >= 0) ? (hx - lowbit0) : (hx + lowbit0); hy = (hy >= 0) ? (hy - lowbit0) : (hy + lowbit0); /* * Propagate bits 0 and 1 of hc,hx,hy to h0. * This could be simplified if we assume h0>0, but then * the inversion would not be lossless for images with * negative pixels. */ lowbit1 = (hc ^ hx ^ hy) & bit1; h0 = (h0 >= 0) ? (h0 + lowbit0 - lowbit1) : (h0 + ((lowbit0 == 0) ? lowbit1 : (lowbit0-lowbit1))); /* * Divide sums by 2 (4 last time) */ a[s10+1] = (h0 + hx + hy + hc) >> shift; a[s10 ] = (h0 + hx - hy - hc) >> shift; a[s00+1] = (h0 - hx + hy - hc) >> shift; a[s00 ] = (h0 - hx - hy + hc) >> shift; s00 += 2; s10 += 2; } if (oddy) { /* * do last element in row if row length is odd * s00+1, s10+1 are off edge */ h0 = a[s00 ]; hx = a[s10 ]; hx = ((hx >= 0) ? (hx+prnd1) : (hx+nrnd1)) & mask1; lowbit1 = hx & bit1; h0 = (h0 >= 0) ? (h0 - lowbit1) : (h0 + lowbit1); a[s10 ] = (h0 + hx) >> shift; a[s00 ] = (h0 - hx) >> shift; } } if (oddx) { /* * do last row if column length is odd * s10, s10+1 are off edge */ s00 = ny*i; for (j = 0; j= 0) ? (hy+prnd1) : (hy+nrnd1)) & mask1; lowbit1 = hy & bit1; h0 = (h0 >= 0) ? (h0 - lowbit1) : (h0 + lowbit1); a[s00+1] = (h0 + hy) >> shift; a[s00 ] = (h0 - hy) >> shift; s00 += 2; } if (oddy) { /* * do corner element if both row and column lengths are odd * s00+1, s10, s10+1 are off edge */ h0 = a[s00 ]; a[s00 ] = h0 >> shift; } } /* * divide all the masks and rounding values by 2 */ bit2 = bit1; bit1 = bit0; bit0 = bit0 >> 1; mask1 = mask0; mask0 = mask0 >> 1; prnd1 = prnd0; prnd0 = prnd0 >> 1; nrnd1 = nrnd0; nrnd0 = prnd0 - 1; } free(tmp); return(0); } /* ############################################################################ */ static void unshuffle(int a[], int n, int n2, int tmp[]) /* int a[]; array to shuffle int n; number of elements to shuffle int n2; second dimension int tmp[]; scratch storage */ { int i; int nhalf; int *p1, *p2, *pt; /* * copy 2nd half of array to tmp */ nhalf = (n+1)>>1; pt = tmp; p1 = &a[n2*nhalf]; /* pointer to a[i] */ for (i=nhalf; i= 0; i--) { *p1 = *p2; p2 -= n2; p1 -= (n2+n2); } /* * now distribute 2nd half of array (in tmp) to odd elements */ pt = tmp; p1 = &a[n2]; /* pointer to a[i] */ for (i=1; i>1; pt = tmp; p1 = &a[n2*nhalf]; /* pointer to a[i] */ for (i=nhalf; i= 0; i--) { *p1 = *p2; p2 -= n2; p1 -= (n2+n2); } /* * now distribute 2nd half of array (in tmp) to odd elements */ pt = tmp; p1 = &a[n2]; /* pointer to a[i] */ for (i=1; i> 1); if (smax <= 0) return; ny2 = ny << 1; /* * We're indexing a as a 2-D array with dimensions (nxtop,ny) of which * only (nxtop,nytop) are used. The coefficients on the edge of the * array are not adjusted (which is why the loops below start at 2 * instead of 0 and end at nxtop-2 instead of nxtop.) */ /* * Adjust x difference hx */ for (i = 2; i=0, dmin<=0. */ if (dmin < dmax) { diff = max( min(diff, dmax), dmin); /* * Compute change in slope limited to range +/- smax. * Careful with rounding negative numbers when using * shift for divide by 8. */ s = diff-(a[s10]<<3); s = (s>=0) ? (s>>3) : ((s+7)>>3) ; s = max( min(s, smax), -smax); a[s10] = a[s10]+s; } s00 += 2; s10 += 2; } } /* * Adjust y difference hy */ for (i = 0; i=0) ? (s>>3) : ((s+7)>>3) ; s = max( min(s, smax), -smax); a[s00+1] = a[s00+1]+s; } s00 += 2; s10 += 2; } } /* * Adjust curvature difference hc */ for (i = 2; i=0, dmin<=0. */ if (dmin < dmax) { diff = max( min(diff, dmax), dmin); /* * Compute change in slope limited to range +/- smax. * Careful with rounding negative numbers when using * shift for divide by 64. */ s = diff-(a[s10+1]<<6); s = (s>=0) ? (s>>6) : ((s+63)>>6) ; s = max( min(s, smax), -smax); a[s10+1] = a[s10+1]+s; } s00 += 2; s10 += 2; } } } /* ############################################################################ */ static void hsmooth64(LONGLONG a[], int nxtop, int nytop, int ny, int scale) /* LONGLONG a[]; array of H-transform coefficients int nxtop,nytop; size of coefficient block to use int ny; actual 1st dimension of array int scale; truncation scale factor that was used */ { int i, j; int ny2, s10, s00; LONGLONG hm, h0, hp, hmm, hpm, hmp, hpp, hx2, hy2, diff, dmax, dmin, s, smax, m1, m2; /* * Maximum change in coefficients is determined by scale factor. * Since we rounded during division (see digitize.c), the biggest * permitted change is scale/2. */ smax = (scale >> 1); if (smax <= 0) return; ny2 = ny << 1; /* * We're indexing a as a 2-D array with dimensions (nxtop,ny) of which * only (nxtop,nytop) are used. The coefficients on the edge of the * array are not adjusted (which is why the loops below start at 2 * instead of 0 and end at nxtop-2 instead of nxtop.) */ /* * Adjust x difference hx */ for (i = 2; i=0, dmin<=0. */ if (dmin < dmax) { diff = max( min(diff, dmax), dmin); /* * Compute change in slope limited to range +/- smax. * Careful with rounding negative numbers when using * shift for divide by 8. */ s = diff-(a[s10]<<3); s = (s>=0) ? (s>>3) : ((s+7)>>3) ; s = max( min(s, smax), -smax); a[s10] = a[s10]+s; } s00 += 2; s10 += 2; } } /* * Adjust y difference hy */ for (i = 0; i=0) ? (s>>3) : ((s+7)>>3) ; s = max( min(s, smax), -smax); a[s00+1] = a[s00+1]+s; } s00 += 2; s10 += 2; } } /* * Adjust curvature difference hc */ for (i = 2; i=0, dmin<=0. */ if (dmin < dmax) { diff = max( min(diff, dmax), dmin); /* * Compute change in slope limited to range +/- smax. * Careful with rounding negative numbers when using * shift for divide by 64. */ s = diff-(a[s10+1]<<6); s = (s>=0) ? (s>>6) : ((s+63)>>6) ; s = max( min(s, smax), -smax); a[s10+1] = a[s10+1]+s; } s00 += 2; s10 += 2; } } } /* ############################################################################ */ /* ############################################################################ */ /* Copyright (c) 1993 Association of Universities for Research * in Astronomy. All rights reserved. Produced under National * Aeronautics and Space Administration Contract No. NAS5-26555. */ /* undigitize.c undigitize H-transform * * Programmer: R. White Date: 9 May 1991 */ /* ############################################################################ */ static void undigitize(int a[], int nx, int ny, int scale) { int *p; /* * multiply by scale */ if (scale <= 1) return; for (p=a; p <= &a[nx*ny-1]; p++) *p = (*p)*scale; } /* ############################################################################ */ static void undigitize64(LONGLONG a[], int nx, int ny, int scale) { LONGLONG *p, scale64; /* * multiply by scale */ if (scale <= 1) return; scale64 = (LONGLONG) scale; /* use a 64-bit int for efficiency in the big loop */ for (p=a; p <= &a[nx*ny-1]; p++) *p = (*p)*scale64; } /* ############################################################################ */ /* ############################################################################ */ /* Copyright (c) 1993 Association of Universities for Research * in Astronomy. All rights reserved. Produced under National * Aeronautics and Space Administration Contract No. NAS5-26555. */ /* decode.c read codes from infile and construct array * * Programmer: R. White Date: 2 February 1994 */ static char code_magic[2] = { (char)0xDD, (char)0x99 }; /* ############################################################################ */ static int decode(unsigned char *infile, int *a, int *nx, int *ny, int *scale) /* char *infile; input file int *a; address of output array [nx][ny] int *nx,*ny; size of output array int *scale; scale factor for digitization */ { LONGLONG sumall; int nel, stat; unsigned char nbitplanes[3]; char tmagic[2]; /* initialize the byte read position to the beginning of the array */; nextchar = 0; /* * File starts either with special 2-byte magic code or with * FITS keyword "SIMPLE =" */ qread(infile, tmagic, sizeof(tmagic)); /* * check for correct magic code value */ if (memcmp(tmagic,code_magic,sizeof(code_magic)) != 0) { ffpmsg("bad file format"); return(DATA_DECOMPRESSION_ERR); } *nx =readint(infile); /* x size of image */ *ny =readint(infile); /* y size of image */ *scale=readint(infile); /* scale factor for digitization */ nel = (*nx) * (*ny); /* sum of all pixels */ sumall=readlonglong(infile); /* # bits in quadrants */ qread(infile, (char *) nbitplanes, sizeof(nbitplanes)); stat = dodecode(infile, a, *nx, *ny, nbitplanes); /* * put sum of all pixels back into pixel 0 */ a[0] = (int) sumall; return(stat); } /* ############################################################################ */ static int decode64(unsigned char *infile, LONGLONG *a, int *nx, int *ny, int *scale) /* char *infile; input file LONGLONG *a; address of output array [nx][ny] int *nx,*ny; size of output array int *scale; scale factor for digitization */ { int nel, stat; LONGLONG sumall; unsigned char nbitplanes[3]; char tmagic[2]; /* initialize the byte read position to the beginning of the array */; nextchar = 0; /* * File starts either with special 2-byte magic code or with * FITS keyword "SIMPLE =" */ qread(infile, tmagic, sizeof(tmagic)); /* * check for correct magic code value */ if (memcmp(tmagic,code_magic,sizeof(code_magic)) != 0) { ffpmsg("bad file format"); return(DATA_DECOMPRESSION_ERR); } *nx =readint(infile); /* x size of image */ *ny =readint(infile); /* y size of image */ *scale=readint(infile); /* scale factor for digitization */ nel = (*nx) * (*ny); /* sum of all pixels */ sumall=readlonglong(infile); /* # bits in quadrants */ qread(infile, (char *) nbitplanes, sizeof(nbitplanes)); stat = dodecode64(infile, a, *nx, *ny, nbitplanes); /* * put sum of all pixels back into pixel 0 */ a[0] = sumall; return(stat); } /* ############################################################################ */ /* ############################################################################ */ /* Copyright (c) 1993 Association of Universities for Research * in Astronomy. All rights reserved. Produced under National * Aeronautics and Space Administration Contract No. NAS5-26555. */ /* dodecode.c Decode stream of characters on infile and return array * * This version encodes the different quadrants separately * * Programmer: R. White Date: 9 May 1991 */ /* ############################################################################ */ static int dodecode(unsigned char *infile, int a[], int nx, int ny, unsigned char nbitplanes[3]) /* int a[]; int nx,ny; Array dimensions are [nx][ny] unsigned char nbitplanes[3]; Number of bit planes in quadrants */ { int i, nel, nx2, ny2, stat; nel = nx*ny; nx2 = (nx+1)/2; ny2 = (ny+1)/2; /* * initialize a to zero */ for (i=0; inqy) ? nqx : nqy; log2n = (int) (log((float) nqmax)/log(2.0)+0.5); if (nqmax > (1<= 0; bit--) { /* * Was bitplane was quadtree-coded or written directly? */ b = input_nybble(infile); if(b == 0) { /* * bit map was written directly */ read_bdirect(infile,a,n,nqx,nqy,scratch,bit); } else if (b != 0xf) { ffpmsg("qtree_decode: bad format code"); return(DATA_DECOMPRESSION_ERR); } else { /* * bitmap was quadtree-coded, do log2n expansions * * read first code */ scratch[0] = input_huffman(infile); /* * now do log2n expansions, reading codes from file as necessary */ nx = 1; ny = 1; nfx = nqx; nfy = nqy; c = 1<>1; nx = nx<<1; ny = ny<<1; if (nfx <= c) { nx -= 1; } else { nfx -= c; } if (nfy <= c) { ny -= 1; } else { nfy -= c; } qtree_expand(infile,scratch,nx,ny,scratch); } /* * now copy last set of 4-bit codes to bitplane bit of array a */ qtree_bitins(scratch,nqx,nqy,a,n,bit); } } free(scratch); return(0); } /* ############################################################################ */ static int qtree_decode64(unsigned char *infile, LONGLONG a[], int n, int nqx, int nqy, int nbitplanes) /* char *infile; LONGLONG a[]; a is 2-D array with dimensions (n,n) int n; length of full row in a int nqx; partial length of row to decode int nqy; partial length of column (<=n) int nbitplanes; number of bitplanes to decode */ { int log2n, k, bit, b, nqmax; int nx,ny,nfx,nfy,c; int nqx2, nqy2; unsigned char *scratch; /* * log2n is log2 of max(nqx,nqy) rounded up to next power of 2 */ nqmax = (nqx>nqy) ? nqx : nqy; log2n = (int) (log((float) nqmax)/log(2.0)+0.5); if (nqmax > (1<= 0; bit--) { /* * Was bitplane was quadtree-coded or written directly? */ b = input_nybble(infile); if(b == 0) { /* * bit map was written directly */ read_bdirect64(infile,a,n,nqx,nqy,scratch,bit); } else if (b != 0xf) { ffpmsg("qtree_decode64: bad format code"); return(DATA_DECOMPRESSION_ERR); } else { /* * bitmap was quadtree-coded, do log2n expansions * * read first code */ scratch[0] = input_huffman(infile); /* * now do log2n expansions, reading codes from file as necessary */ nx = 1; ny = 1; nfx = nqx; nfy = nqy; c = 1<>1; nx = nx<<1; ny = ny<<1; if (nfx <= c) { nx -= 1; } else { nfx -= c; } if (nfy <= c) { ny -= 1; } else { nfy -= c; } qtree_expand(infile,scratch,nx,ny,scratch); } /* * now copy last set of 4-bit codes to bitplane bit of array a */ qtree_bitins64(scratch,nqx,nqy,a,n,bit); } } free(scratch); return(0); } /* ############################################################################ */ /* * do one quadtree expansion step on array a[(nqx+1)/2,(nqy+1)/2] * results put into b[nqx,nqy] (which may be the same as a) */ static void qtree_expand(unsigned char *infile, unsigned char a[], int nx, int ny, unsigned char b[]) { int i; /* * first copy a to b, expanding each 4-bit value */ qtree_copy(a,nx,ny,b,ny); /* * now read new 4-bit values into b for each non-zero element */ for (i = nx*ny-1; i >= 0; i--) { if (b[i]) b[i] = input_huffman(infile); } } /* ############################################################################ */ /* * copy 4-bit values from a[(nx+1)/2,(ny+1)/2] to b[nx,ny], expanding * each value to 2x2 pixels * a,b may be same array */ static void qtree_copy(unsigned char a[], int nx, int ny, unsigned char b[], int n) /* int n; declared y dimension of b */ { int i, j, k, nx2, ny2; int s00, s10; /* * first copy 4-bit values to b * start at end in case a,b are same array */ nx2 = (nx+1)/2; ny2 = (ny+1)/2; k = ny2*(nx2-1)+ny2-1; /* k is index of a[i,j] */ for (i = nx2-1; i >= 0; i--) { s00 = 2*(n*i+ny2-1); /* s00 is index of b[2*i,2*j] */ for (j = ny2-1; j >= 0; j--) { b[s00] = a[k]; k -= 1; s00 -= 2; } } /* * now expand each 2x2 block */ for (i = 0; i>1) & 1; b[s00+1] = (b[s00]>>2) & 1; b[s00 ] = (b[s00]>>3) & 1; */ s00 += 2; s10 += 2; } if (j < ny) { /* * row size is odd, do last element in row * s00+1, s10+1 are off edge */ /* not worth converting this to use 16 case statements */ b[s10 ] = (b[s00]>>1) & 1; b[s00 ] = (b[s00]>>3) & 1; } } if (i < nx) { /* * column size is odd, do last row * s10, s10+1 are off edge */ s00 = n*i; for (j = 0; j>2) & 1; b[s00 ] = (b[s00]>>3) & 1; s00 += 2; } if (j < ny) { /* * both row and column size are odd, do corner element * s00+1, s10, s10+1 are off edge */ /* not worth converting this to use 16 case statements */ b[s00 ] = (b[s00]>>3) & 1; } } } /* ############################################################################ */ /* * Copy 4-bit values from a[(nx+1)/2,(ny+1)/2] to b[nx,ny], expanding * each value to 2x2 pixels and inserting into bitplane BIT of B. * A,B may NOT be same array (it wouldn't make sense to be inserting * bits into the same array anyway.) */ static void qtree_bitins(unsigned char a[], int nx, int ny, int b[], int n, int bit) /* int n; declared y dimension of b */ { int i, j, k; int s00; int plane_val; plane_val = 1 << bit; /* * expand each 2x2 block */ k = 0; /* k is index of a[i/2,j/2] */ for (i = 0; i>1) & 1) << bit; b[s00+1] |= ((a[k]>>2) & 1) << bit; b[s00 ] |= ((a[k]>>3) & 1) << bit; */ s00 += 2; /* s10 += 2; */ k += 1; } if (j < ny) { /* * row size is odd, do last element in row * s00+1, s10+1 are off edge */ switch (a[k]) { case(0): break; case(1): break; case(2): b[s00+n ] |= plane_val; break; case(3): b[s00+n ] |= plane_val; break; case(4): break; case(5): break; case(6): b[s00+n ] |= plane_val; break; case(7): b[s00+n ] |= plane_val; break; case(8): b[s00 ] |= plane_val; break; case(9): b[s00 ] |= plane_val; break; case(10): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(11): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(12): b[s00 ] |= plane_val; break; case(13): b[s00 ] |= plane_val; break; case(14): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(15): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; } /* b[s10 ] |= ((a[k]>>1) & 1) << bit; b[s00 ] |= ((a[k]>>3) & 1) << bit; */ k += 1; } } if (i < nx) { /* * column size is odd, do last row * s10, s10+1 are off edge */ s00 = n*i; for (j = 0; j>2) & 1) << bit; b[s00 ] |= ((a[k]>>3) & 1) << bit; */ s00 += 2; k += 1; } if (j < ny) { /* * both row and column size are odd, do corner element * s00+1, s10, s10+1 are off edge */ switch (a[k]) { case(0): break; case(1): break; case(2): break; case(3): break; case(4): break; case(5): break; case(6): break; case(7): break; case(8): b[s00 ] |= plane_val; break; case(9): b[s00 ] |= plane_val; break; case(10): b[s00 ] |= plane_val; break; case(11): b[s00 ] |= plane_val; break; case(12): b[s00 ] |= plane_val; break; case(13): b[s00 ] |= plane_val; break; case(14): b[s00 ] |= plane_val; break; case(15): b[s00 ] |= plane_val; break; } /* b[s00 ] |= ((a[k]>>3) & 1) << bit; */ k += 1; } } } /* ############################################################################ */ /* * Copy 4-bit values from a[(nx+1)/2,(ny+1)/2] to b[nx,ny], expanding * each value to 2x2 pixels and inserting into bitplane BIT of B. * A,B may NOT be same array (it wouldn't make sense to be inserting * bits into the same array anyway.) */ static void qtree_bitins64(unsigned char a[], int nx, int ny, LONGLONG b[], int n, int bit) /* int n; declared y dimension of b */ { int i, j, k; int s00; int plane_val; plane_val = 1 << bit; /* * expand each 2x2 block */ k = 0; /* k is index of a[i/2,j/2] */ for (i = 0; i>1) & 1) << bit; b[s00+1] |= ((((LONGLONG)a[k])>>2) & 1) << bit; b[s00 ] |= ((((LONGLONG)a[k])>>3) & 1) << bit; */ s00 += 2; /* s10 += 2; */ k += 1; } if (j < ny) { /* * row size is odd, do last element in row * s00+1, s10+1 are off edge */ switch (a[k]) { case(0): break; case(1): break; case(2): b[s00+n ] |= plane_val; break; case(3): b[s00+n ] |= plane_val; break; case(4): break; case(5): break; case(6): b[s00+n ] |= plane_val; break; case(7): b[s00+n ] |= plane_val; break; case(8): b[s00 ] |= plane_val; break; case(9): b[s00 ] |= plane_val; break; case(10): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(11): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(12): b[s00 ] |= plane_val; break; case(13): b[s00 ] |= plane_val; break; case(14): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; case(15): b[s00+n ] |= plane_val; b[s00 ] |= plane_val; break; } /* b[s10 ] |= ((((LONGLONG)a[k])>>1) & 1) << bit; b[s00 ] |= ((((LONGLONG)a[k])>>3) & 1) << bit; */ k += 1; } } if (i < nx) { /* * column size is odd, do last row * s10, s10+1 are off edge */ s00 = n*i; for (j = 0; j>2) & 1) << bit; b[s00 ] |= ((((LONGLONG)a[k])>>3) & 1) << bit; */ s00 += 2; k += 1; } if (j < ny) { /* * both row and column size are odd, do corner element * s00+1, s10, s10+1 are off edge */ switch (a[k]) { case(0): break; case(1): break; case(2): break; case(3): break; case(4): break; case(5): break; case(6): break; case(7): break; case(8): b[s00 ] |= plane_val; break; case(9): b[s00 ] |= plane_val; break; case(10): b[s00 ] |= plane_val; break; case(11): b[s00 ] |= plane_val; break; case(12): b[s00 ] |= plane_val; break; case(13): b[s00 ] |= plane_val; break; case(14): b[s00 ] |= plane_val; break; case(15): b[s00 ] |= plane_val; break; } /* b[s00 ] |= ((((LONGLONG)a[k])>>3) & 1) << bit; */ k += 1; } } } /* ############################################################################ */ static void read_bdirect(unsigned char *infile, int a[], int n, int nqx, int nqy, unsigned char scratch[], int bit) { /* * read bit image packed 4 pixels/nybble */ /* int i; for (i = 0; i < ((nqx+1)/2) * ((nqy+1)/2); i++) { scratch[i] = input_nybble(infile); } */ input_nnybble(infile, ((nqx+1)/2) * ((nqy+1)/2), scratch); /* * insert in bitplane BIT of image A */ qtree_bitins(scratch,nqx,nqy,a,n,bit); } /* ############################################################################ */ static void read_bdirect64(unsigned char *infile, LONGLONG a[], int n, int nqx, int nqy, unsigned char scratch[], int bit) { /* * read bit image packed 4 pixels/nybble */ /* int i; for (i = 0; i < ((nqx+1)/2) * ((nqy+1)/2); i++) { scratch[i] = input_nybble(infile); } */ input_nnybble(infile, ((nqx+1)/2) * ((nqy+1)/2), scratch); /* * insert in bitplane BIT of image A */ qtree_bitins64(scratch,nqx,nqy,a,n,bit); } /* ############################################################################ */ /* * Huffman decoding for fixed codes * * Coded values range from 0-15 * * Huffman code values (hex): * * 3e, 00, 01, 08, 02, 09, 1a, 1b, * 03, 1c, 0a, 1d, 0b, 1e, 3f, 0c * * and number of bits in each code: * * 6, 3, 3, 4, 3, 4, 5, 5, * 3, 5, 4, 5, 4, 5, 6, 4 */ static int input_huffman(unsigned char *infile) { int c; /* * get first 3 bits to start */ c = input_nbits(infile,3); if (c < 4) { /* * this is all we need * return 1,2,4,8 for c=0,1,2,3 */ return(1<>bits_to_go) & 1); } /* ############################################################################ */ /* INPUT N BITS (N must be <= 8) */ static int input_nbits(unsigned char *infile, int n) { /* AND mask for retreiving the right-most n bits */ static int mask[9] = {0, 1, 3, 7, 15, 31, 63, 127, 255}; if (bits_to_go < n) { /* * need another byte's worth of bits */ buffer2 = (buffer2<<8) | (int) infile[nextchar]; nextchar++; bits_to_go += 8; } /* * now pick off the first n bits */ bits_to_go -= n; /* there was a slight gain in speed by replacing the following line */ /* return( (buffer2>>bits_to_go) & ((1<>bits_to_go) & (*(mask+n)) ); } /* ############################################################################ */ /* INPUT 4 BITS */ static int input_nybble(unsigned char *infile) { if (bits_to_go < 4) { /* * need another byte's worth of bits */ buffer2 = (buffer2<<8) | (int) infile[nextchar]; nextchar++; bits_to_go += 8; } /* * now pick off the first 4 bits */ bits_to_go -= 4; return( (buffer2>>bits_to_go) & 15 ); } /* ############################################################################ */ /* INPUT array of 4 BITS */ static int input_nnybble(unsigned char *infile, int n, unsigned char array[]) { /* copy n 4-bit nybbles from infile to the lower 4 bits of array */ int ii, kk, shift1, shift2; /* forcing byte alignment doesn;t help, and even makes it go slightly slower if (bits_to_go != 8) input_nbits(infile, bits_to_go); */ if (n == 1) { array[0] = input_nybble(infile); return(0); } if (bits_to_go == 8) { /* already have 2 full nybbles in buffer2, so backspace the infile array to reuse last char */ nextchar--; bits_to_go = 0; } /* bits_to_go now has a value in the range 0 - 7. After adding */ /* another byte, bits_to_go effectively will be in range 8 - 15 */ shift1 = bits_to_go + 4; /* shift1 will be in range 4 - 11 */ shift2 = bits_to_go; /* shift2 will be in range 0 - 7 */ kk = 0; /* special case */ if (bits_to_go == 0) { for (ii = 0; ii < n/2; ii++) { /* * refill the buffer with next byte */ buffer2 = (buffer2<<8) | (int) infile[nextchar]; nextchar++; array[kk] = (int) ((buffer2>>4) & 15); array[kk + 1] = (int) ((buffer2) & 15); /* no shift required */ kk += 2; } } else { for (ii = 0; ii < n/2; ii++) { /* * refill the buffer with next byte */ buffer2 = (buffer2<<8) | (int) infile[nextchar]; nextchar++; array[kk] = (int) ((buffer2>>shift1) & 15); array[kk + 1] = (int) ((buffer2>>shift2) & 15); kk += 2; } } if (ii * 2 != n) { /* have to read last odd byte */ array[n-1] = input_nybble(infile); } return( (buffer2>>bits_to_go) & 15 ); } saods9/tksao1.0/fitsy++/hdu.C000644 000765 000000 00000016115 12536624276 016115 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include #include #include #include using namespace std; #include "hdu.h" #include "head.h" FitsHDU::FitsHDU(FitsHead* head) { extname_ = head->getString("EXTNAME"); // trim any spaces at end if (extname_) { for (int ii=strlen(extname_)-1; ii>=0; ii--) { if (extname_[ii] == ' ') extname_[ii] = '\0'; else break; } } extver_ = head->getInteger("EXTVER", 0); bitpix_ = head->getInteger("BITPIX", 0); naxes_ = head->getInteger("NAXIS", 0); if (naxes_>FTY_MAXAXES) naxes_ = FTY_MAXAXES; // init naxis_ for(int i=0; igetInteger(keycat("NAXIS",(i+1)), 0); // special case: 1D image if (naxis_[0]>0 && naxis_[1]==0) naxis_[1] = 1; realbytes_ = 0; heapbytes_ = head->getInteger("PCOUNT",0); allbytes_ = 0; padbytes_ = 0; databytes_ = 0; datablocks_ = 0; } FitsHDU::~FitsHDU() { if (extname_) delete [] extname_; } char* FitsHDU::keycat(const char* name, int i) { ostringstream str; str << name << i << ends; memcpy(keybuf,str.str().c_str(),str.str().length()); return keybuf; } void FitsHDU::updateCards(FitsHead* head) { head->setInteger("BITPIX", bitpix_, NULL); head->setInteger("NAXIS", naxes_, NULL); for (int i=1; i<=naxes_; i++) head->setInteger(keycat("NAXIS", i), naxis_[i-1], NULL); } // FitsImageHDU FitsImageHDU::FitsImageHDU(FitsHead* head) : FitsHDU(head) { size_t imgpixels = (size_t)naxis_[0]*naxis_[1]; imgbytes_ = imgpixels * (abs(bitpix_)/8); size_t realpixels; if (naxes_>0) { realpixels = 1; for (int i=0; igetReal("BZERO", 0.0); bscale_ = head->getReal("BSCALE", 1.0); hasblank_ = head->find("BLANK") ? 1:0; blank_ = head->getInteger("BLANK", 0); } void FitsImageHDU::updateCards(FitsHead* head) { FitsHDU::updateCards(head); if (blank_) if (bitpix_ > 0) head->setInteger("BLANK", blank_, NULL); if (bzero_) head->setReal("BZERO", bzero_ , 7, NULL); if (bscale_ != 1) head->setReal("BSCALE", bscale_, 7, NULL); } // FitsTableHDU FitsTableHDU::FitsTableHDU(FitsHead* head) : FitsHDU(head) { tfields_ = head->getInteger("TFIELDS", 0); cols_ = NULL; realbytes_ = (size_t)naxis_[0]*naxis_[1]; // number of rows * width of row in bytes allbytes_ = realbytes_ + heapbytes_; datablocks_ = (allbytes_ + (FTY_BLOCK-1))/FTY_BLOCK; databytes_ = datablocks_ * FTY_BLOCK; padbytes_ = databytes_ - allbytes_; } FitsTableHDU::~FitsTableHDU() { if (cols_) { for (int i=0; ittype() << ' '; str << ends; return dupstr(str.str().c_str()); } FitsColumn* FitsTableHDU::find(const char* name) { char* n = toUpper(name); // trim any spaces char* nn = n; while (*nn) nn++; nn--; while (*nn == ' ') *nn-- = '\0'; for (int i=0; ittype()); // trim any spaces char* tt=t; while (*tt) tt++; tt--; while (*tt == ' ') *tt-- = '\0'; if (!strncmp(n,t,strlen(n)) && strlen(n)==strlen(t)) { delete [] n; delete [] t; return cols_[i]; } delete [] t; } } delete [] n; return NULL; } FitsColumn* FitsTableHDU::find(int i) { if (i>=0 && idimension() : Vector(); } FitsAsciiTableHDU::FitsAsciiTableHDU(FitsHead* head) : FitsTableHDU(head) { cols_ = new FitsColumn*[tfields_]; size_t offset = 0; for (int i=0; igetString(keycat("TFORM",i+1)); char type = 'F'; if (tform) { string x(tform); istringstream str(x); str >> type; } switch (type) { case 'A': cols_[i] = new FitsAsciiColumnStr(head, i+1, offset); break; case 'I': cols_[i] = new FitsAsciiColumnT(head, i+1, offset); break; case 'F': cols_[i] = new FitsAsciiColumnT(head, i+1, offset); break; case 'E': cols_[i] = new FitsAsciiColumnT(head, i+1, offset); break; case 'D': cols_[i] = new FitsAsciiColumnT(head, i+1, offset); break; } delete [] tform; if (cols_[i]) offset += cols_[i]->width(); } } FitsBinTableHDU::FitsBinTableHDU(FitsHead* head) : FitsTableHDU(head) { cols_ = new FitsColumn*[tfields_]; int offset =0; for (int i=0; igetString(keycat("TFORM",i+1)); int repeat; char type = 'J'; if (tform) { string x(tform); istringstream str(x); if (isalpha(tform[0])) str >> type; else str >> repeat >> type; } switch (type) { case 'L': cols_[i] = new FitsBinColumnLogical(head, i+1, offset); break; case 'X': cols_[i] = new FitsBinColumnBit(head, i+1, offset); break; case 'B': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'I': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'U': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'J': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'V': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'K': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'A': cols_[i] = new FitsBinColumnStr(head, i+1, offset); break; case 'E': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'D': cols_[i] = new FitsBinColumnT(head, i+1, offset); break; case 'C': cols_[i] = NULL; internalError("Fitsy++ hdu single precision complex column type not supported"); break; case 'M': cols_[i] = NULL; internalError("Fitsy++ hdu double precision complex column type not supported"); break; case 'P': cols_[i] = new FitsBinColumnArrayP(head, i+1, offset); break; case 'Q': cols_[i] = new FitsBinColumnArrayQ(head, i+1, offset); break; default: cols_[i] = NULL; internalError("Fitsy++ hdu unknown table column type"); break; } delete [] tform; if (cols_[i]) offset += cols_[i]->width(); } } saods9/tksao1.0/fitsy++/hdu.h000644 000765 000000 00000005037 12464214754 016157 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitshdu_h__ #define __fitshdu_h__ #include #include "column.h" #define FTY_MAXAXES 10 class FitsHead; class FitsHDU { protected: char* extname_; // EXTNAME keyword int extver_; // EXTVER keyword int bitpix_; // BITPIX keyword int naxes_; // NAXIS keyword int naxis_[FTY_MAXAXES]; // NAXIS[i] keywords size_t realbytes_; // Number of real bytes size_t heapbytes_; // Number of heap bytes size_t allbytes_; // Number of real bytes + heap bytes size_t padbytes_; // Number of pad bytes size_t databytes_; // Number of total bytes (padded) size_t datablocks_; // Number of total blocks char keybuf[9]; char* keycat(const char*, int); public: FitsHDU(FitsHead*); virtual ~FitsHDU(); virtual void updateCards(FitsHead*); const char* extname() {return extname_;} int extver() {return extver_;} int bitpix() {return bitpix_;} int naxes() {return naxes_;} int naxis(int ii) {return naxis_[ii];} size_t realbytes() {return realbytes_;} size_t heapbytes() {return heapbytes_;} size_t allbytes() {return allbytes_;} size_t padbytes() {return padbytes_;} size_t databytes() {return databytes_;} size_t datablocks() {return datablocks_;} }; class FitsImageHDU : public FitsHDU { private: size_t imgbytes_; // number of image bytes double bscale_; double bzero_; int hasblank_; int blank_; public: FitsImageHDU(FitsHead*); void updateCards(FitsHead*); size_t imgbytes() {return imgbytes_;} void setScaling(double t,double z) {bscale_=t; bzero_=z;} double bscale() {return bscale_;} double bzero() {return bzero_;} int hasscaling() {return bscale_ != 1 || bzero_ != 0;} int hasblank() {return hasblank_;} int blank() {return blank_;} }; class FitsTableHDU : public FitsHDU { protected: int tfields_; FitsColumn** cols_; public: FitsTableHDU(FitsHead*); virtual ~FitsTableHDU(); int tfields() {return tfields_;} int rows() {return naxis_[1];} int cols() {return tfields_;} int width() {return naxis_[0];} char* list(); FitsColumn* find(const char*); FitsColumn* find(int); Vector dimension(const char*); }; class FitsBinTableHDU : public FitsTableHDU { public: FitsBinTableHDU(FitsHead*); }; class FitsAsciiTableHDU : public FitsTableHDU { public: FitsAsciiTableHDU(FitsHead*); }; #endif saods9/tksao1.0/fitsy++/head.C000644 000765 000000 00000027134 12601046407 016224 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include #include #ifndef __WIN32 #include #include #endif #include "file.h" #include "head.h" FitsHead::FitsHead(char* raw, size_t bytes, Memory mem) { cards_ = raw; mapdata_ = raw; mapsize_ = bytes; memory_ = mem; ncard_ = 0; acard_ = 0; index_ = NULL; valid_ = 0; inherit_ = 0; hdu_ = NULL; char* c; int i; for (c = cards_, i=0; c < cards_+bytes; c+=FTY_CARDLEN, i++) { // only compare 4 chars if (!strncmp(c, "END ", 4)) { ncard_ = i + 1; acard_ = ((ncard_+FTY_CARDS-1)/FTY_CARDS) * FTY_CARDS; valid_ = 1; buildIndex(); updateHDU(); return; } } } FitsHead::FitsHead(char* raw, size_t bytes, char* mm, size_t sz, Memory mem) { cards_ = raw; mapdata_ = mm; mapsize_ = sz; memory_ = mem; ncard_ = 0; acard_ = 0; index_ = NULL; valid_ = 0; inherit_ = 0; hdu_ = NULL; char* c; int i; for (c = cards_, i=0; c < cards_+bytes; c+=FTY_CARDLEN, i++) { // only compare 4 chars if (!strncmp(c, "END ", 4)) { ncard_ = i + 1; acard_ = ((ncard_+FTY_CARDS-1)/FTY_CARDS) * FTY_CARDS; valid_ = 1; buildIndex(); updateHDU(); return; } } } // Create Image FitsHead FitsHead::FitsHead(int width, int height, int depth, int bitpix, char* xtension) { cards_ = new char[FTY_BLOCK]; memset(cards_, ' ', FTY_BLOCK); memcpy(cards_, "END", 3); mapdata_ = NULL; mapsize_ = 0; memory_ = ALLOC; ncard_ = 1; acard_ = FTY_CARDS; index_ = NULL; if (!xtension) appendLogical("SIMPLE", 1, "Fits Standard"); else appendString("XTENSION", xtension, "Fits Standard"); appendInteger("BITPIX", bitpix, "Bits per pixel"); appendInteger("NAXIS", depth>1 ? 3 : 2, "Number of axes"); appendInteger("NAXIS1", width, "Axis Length"); appendInteger("NAXIS2", height, "Axis Length"); if (depth>1) appendInteger("NAXIS3", depth, "Axis Length"); valid_ = 1; inherit_ = 0; hdu_ = NULL; buildIndex(); updateHDU(); } FitsHead::FitsHead(int width, int height, int depth, int bitpix, char* mm, size_t sz, Memory mem) { cards_ = new char[FTY_BLOCK]; memset(cards_, ' ', FTY_BLOCK); memcpy(cards_, "END", 3); mapdata_ = mm; mapsize_ = sz; memory_ = mem; ncard_ = 1; acard_ = FTY_CARDS; index_ = NULL; appendLogical("SIMPLE", 1, "Fits Standard"); appendInteger("BITPIX", bitpix, "Bits per pixel"); appendInteger("NAXIS", depth==1 ? 2 : 3, "Number of axes"); appendInteger("NAXIS1", width, "Axis Length"); appendInteger("NAXIS2", height, "Axis Length"); if (depth>1) appendInteger("NAXIS3", depth, "Axis Length"); valid_ = 1; inherit_ = 0; hdu_ = NULL; buildIndex(); updateHDU(); } FitsHead::FitsHead(const FitsHead& a) { cards_ = new char[a.acard_*FTY_CARDLEN]; memmove(cards_, a.cards_, a.acard_*FTY_CARDLEN); mapdata_ = NULL; mapsize_ = 0; memory_ = ALLOC; index_ = NULL; acard_ = a.acard_; ncard_ = a.ncard_; valid_ = 1; inherit_ = 0; hdu_ = NULL; buildIndex(); updateHDU(); } FitsHead::~FitsHead() { if (index_) delete [] index_; if (hdu_) delete hdu_; switch (memory_) { case ALLOC: if (cards_) delete [] cards_; break; case MMAP: #ifndef __WIN32 if (mapdata_>0) munmap((caddr_t)mapdata_, mapsize_); #endif break; case SHARE: #ifndef __WIN32 if (mapdata_>0) shmdt(mapdata_); #endif case EXTERNAL: break; } } int FitsHead::isImage() { // just look for SIMPLE, if present it may be of value 'F' char* xtension = getString("XTENSION"); char* simple = find("SIMPLE"); int r = (simple || (xtension && !strncmp(xtension, "IMAGE", 5))) && naxes() > 0 && naxis(0) > 0 && naxis(1) > 0; delete [] xtension; return r; } int FitsHead::isTable() { char* xtension = getString("XTENSION"); int r = (xtension && (!strncmp(xtension, "TABLE", 5) || !strncmp(xtension, "BINTABLE", 8))); delete [] xtension; return r; } int FitsHead::isAsciiTable() { char* xtension = getString("XTENSION"); int r = (xtension && (!strncmp(xtension, "TABLE", 5))); delete [] xtension; return r; } int FitsHead::isBinTable() { char* xtension = getString("XTENSION"); int r = (xtension && (!strncmp(xtension, "BINTABLE", 8))); delete [] xtension; return r; } int FitsHead::isHeap() { return getInteger("PCOUNT",0) ? 1 : 0; } void FitsHead::updateHDU() { if (hdu_) delete hdu_; hdu_ = NULL; // just find simple, it might be present but of value 'F' char* simple = find("SIMPLE"); char* xtension = getString("XTENSION"); if (xtension) inherit_ = getLogical("INHERIT",0); if (simple || (xtension && !strncmp(xtension, "IMAGE", 5))) hdu_ = new FitsImageHDU(this); if (xtension && !strncmp(xtension, "TABLE", 5)) hdu_ = new FitsAsciiTableHDU(this); if (xtension && !strncmp(xtension, "BINTABLE", 8)) hdu_ = new FitsBinTableHDU(this); delete [] xtension; } int FitsHead::getLogical(const char* name, int def) { char* card = find(name); if (card) { FitsCard c(card); return c.getLogical(); } else return def; } int FitsHead::getInteger(const char* name, int def) { char* card = find(name); if (card) { FitsCard c(card); return c.getInteger(); } else return def; } double FitsHead::getReal(const char* name, double def) { char* card = find(name); if (card) { FitsCard c(card); return c.getReal(); } else return def; } void FitsHead::getComplex(const char* name, double* real, double* img, double rdef, double idef) { char* card = find(name); if (card) { FitsCard c(card); c.getComplex(real, img); } else { *real = rdef; *img = idef; } } char* FitsHead::getString(const char* name) { char* card = find(name); if (card) { FitsCard c(card); return c.getString(); } else return NULL; } char* FitsHead::getComment(const char* name) { char* card = find(name); if (card) { FitsCard c(card); return c.getComment(); } else return NULL; } char* FitsHead::getKeyword(const char* name) { char* card = find(name); if (card) { FitsCard c(card); return c.getAsString(); } else return NULL; } char* FitsHead::setKey(const char* name, const char* value) { char* card = find(name); if (card) FitsCard(card).setKey(value); buildIndex(); return card; } char* FitsHead::setLogical(const char* name, int value, const char* comm) { char* card = find(name); if (card) FitsCard(card).setLogical(value, comm); return card; } char* FitsHead::setInteger(const char* name, int value, const char* comm) { char* card = find(name); if (card) FitsCard(card).setInteger(value, comm); return card; } char* FitsHead::setReal(const char* name, double value, int prec, const char* comm) { char* card = find(name); if (card) FitsCard(card).setReal(value, prec, comm); return card; } char* FitsHead::setComplex(const char* name, double real, double img, int prec, const char* comm) { char* card = find(name); if (card) FitsCard(card).setComplex(real, img, prec, comm); return card; } char* FitsHead::setString(const char* name, const char* value, const char* comm) { char* card = find(name); if (card) FitsCard(card).setString(value, comm); return card; } char* FitsHead::setComment(const char* name, const char* value) { char* card = find(name); if (card) FitsCard(card).setComment(value); return card; } char* FitsHead::cardins(char* card, char* here) { // do we need to allocate another block? if (ncard_+1 > acard_) { switch (memory_) { case ALLOC: { char* old = cards_; int oldsz = acard_*FTY_CARDLEN; int sz = oldsz+FTY_BLOCK; acard_ = sz/FTY_CARDLEN; cards_ = new char[sz]; memset(cards_, ' ', sz); memcpy(cards_, old, oldsz); // don't forget to redirect here if needed if (here) { size_t diff = here-old; here = cards_+diff; } delete [] old; } break; case MMAP: case SHARE: case EXTERNAL: internalError("Fitsy++ head can't add card: readonly memory"); return NULL; } } char* where = here ? here : cards_+((ncard_-1)*FTY_CARDLEN); memmove(where+FTY_CARDLEN, where, (cards_+(ncard_*FTY_CARDLEN))-where); memmove(where, card, FTY_CARDLEN); ncard_++; buildIndex(); return where; } char* FitsHead::carddel(const char* name) { char* card = find(name); if (card) { char* next = card+FTY_CARDLEN; char* last = cards_+((ncard_-1)*FTY_CARDLEN); memmove(card, next, last-card); memset(last,' ', FTY_CARDLEN); } buildIndex(); return card; } char* FitsHead::cardclear(const char* name) { char* card = find(name); if (card) FitsCard(card).clear(); buildIndex(); return card; } char* FitsHead::insertLogical(const char* name, int value, const char* comm, const char* here) { FitsCard key; key.setLogical(name, value, comm); return cardins(key.card(), (char*)here); } char* FitsHead::insertInteger(const char* name, int value, const char* comm, const char* here) { FitsCard key; key.setInteger(name, value, comm); return cardins(key.card(), (char*)here); } char* FitsHead::insertReal(const char* name, double value, int prec, const char* comm, const char* here) { FitsCard key; key.setReal(name, value, prec, comm); return cardins(key.card(), (char*)here); } char* FitsHead::insertComplex(const char* name, double real, double img, int prec, const char* comm, const char* here) { FitsCard key; key.setComplex(name, real, img, prec, comm); return cardins(key.card(), (char*)here); } char* FitsHead::insertString(const char* name, const char* value, const char* comm, const char* here) { FitsCard key; key.setString(name, value, comm); return cardins(key.card(), (char*)here); } char* FitsHead::insertComment(const char* name, const char* value, const char* here) { FitsCard key; key.setComment(name, value); return cardins(key.card(), (char*)here); } char* FitsHead::find(const char* key) { if (index_) return findIndex(key); else return findSeq(key); } char* FitsHead::findSeq(const char* key) { if (key == NULL) return NULL; char k[8]; memset(k,' ',8); int len = strlen(key); // convert to uppercase int l = (len>8 ? 8 : len); for (int i=0; i8 ? 8 : len); for (int i=0; i 1) { int i = strncmp(k, base[cut], 8); if (!i) return base[cut]; if (i < 0) { hi = cut; cut = (lo+hi)/2; } else { lo = cut; cut = (lo+hi)/2; } } if (!strncmp(k, base[cut], 8)) return base[cut]; return NULL; } static int compare(const void* a, const void* b) { char** aa = (char**)a; char** bb = (char**)b; return strncmp(*aa, *bb, 8); } void FitsHead::buildIndex() { if (index_) delete [] index_; index_ = new char*[ncard_]; for (int i=0; iextname() : NULL;} int extver() {return hdu_ ? hdu_->extver() : 0;} int bitpix() {return hdu_ ? hdu_->bitpix() : 0;} int naxes() {return hdu_ ? hdu_->naxes() : 0;} int naxis(int ii) {return hdu_ ? hdu_->naxis(ii) : 0;} size_t realbytes() {return hdu_ ? hdu_->realbytes() : 0;} size_t heapbytes() {return hdu_ ? hdu_->heapbytes() : 0;} size_t allbytes() {return hdu_ ? hdu_->allbytes() : 0;} size_t padbytes() {return hdu_ ? hdu_->padbytes() : 0;} size_t databytes() {return hdu_ ? hdu_->databytes() : 0;} size_t datablocks() {return hdu_ ? hdu_->datablocks() : 0;} void buildIndex(); void updateHDU(); void updateCards() {if (hdu_) hdu_->updateCards(this);} char* find(const char* name); char* findSeq(const char* name); char* findIndex(const char* name); char* cardins(char* card, char* here); char* carddel(const char* card); char* cardclear(const char* card); char* setKey(const char* name, const char* value); char* setLogical(const char* name, int value, const char* comm); char* setInteger(const char* name, int value, const char* comm); char* setReal(const char* name, double value, int prec, const char* comm); char* setComplex(const char* name, double real, double img, int prec, const char* comm); char* setString(const char* name, const char* value, const char* comm); char* setComment(const char* name, const char* value); char* insertLogical(const char* name, int value, const char* comm, const char* here); char* insertInteger(const char* name, int value, const char* comm, const char* here); char* insertReal(const char* name, double value, int prec, const char* comm, const char* here); char* insertComplex(const char* name, double real, double img, int prec, const char* comm, const char* here); char* insertString(const char* name, const char* value, const char* comm, const char* here); char* insertComment(const char* name, const char* value, const char* here); char* appendLogical(const char* name, int value, const char* comm) {return insertLogical(name, value, comm, NULL);} char* appendInteger(const char* name, int value, const char* comm) {return insertInteger(name, value, comm, NULL);} char* appendReal(const char* name, double value, int prec, const char* comm) {return insertReal(name, value, prec, comm, NULL);} char* appendComplex(const char* name, double real, double img, int prec, const char* comm) {return insertComplex(name, real, img, prec, comm, NULL);} char* appendString(const char* name, const char* value, const char* comm) {return insertString(name, value, comm, NULL);} int getLogical(const char* name, int def); int getInteger(const char* name, int def); double getReal(const char* name, double def); void getComplex(const char* name, double* real, double* img, double rdef, double idef); char* getString(const char* name); char* getComment(const char* name); char* getKeyword(const char* name); }; #endif saods9/tksao1.0/fitsy++/hist.C000644 000765 000000 00000032441 12601045465 016272 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include #include #include using namespace std; #include "hist.h" #include "util.h" #include "fitsy.h" #ifndef __WIN32 #include "filter.h" #endif #ifdef __CYGWIN__ // limit size, cygwin pipe to 64K / (4 args x 4 bytes) #define FILTERSIZE 2048 #else #define FILTERSIZE 65536 #endif #define MULTWCS 27 char *gerrorstring(void); FitsHist::FitsHist(FitsFile* fits, int w, int h, int d, Matrix& m, Function func, Vector block) : width_(w), height_(h), depth_(d) { size_ = (size_t)width_*height_*depth_; xcol_ = NULL; ycol_ = NULL; zcol_ = NULL; fitsy_ = NULL; filter_ = NULL; valid_ = 0; if (!initHeader(fits)) return; // we need to translate by another .5 for the offset from Data to Image Matrix mm = m * Translate(.5,.5); initLTMV(mm); initWCS(fits, mm, block); initFilter(fits); bin(fits, m, func, block); if (byteswap_) swap(); deleteFilter(); valid_ = 1; } FitsHist::~FitsHist() { if (data_) delete [] (float*)data_; } int FitsHist::initHeader(FitsFile* fits) { FitsHead* srcHead = fits->head(); FitsTableHDU* srcHDU = (FitsTableHDU*)(srcHead->hdu()); // make sure we have a table with columns, X, Y if (!fits->isBinTable()) return 0; // make sure we have rows and cols if (!srcHDU->width() || !srcHDU->rows()) return 0; // get X column if (fits->pBinX()) xcol_ = srcHDU->find(fits->pBinX()); if (!xcol_) return 0; // get Y column if (fits->pBinY()) ycol_ = srcHDU->find(fits->pBinY()); if (!ycol_) return 0; // get Z column (if specified) if (fits->pBinZ() && depth_ > 1) zcol_ = srcHDU->find(fits->pBinZ()); else zcol_ = NULL; // create header head_ = new FitsHead(width_, height_, depth_, -32); if (!head_->isValid()) return 0; // OBJECT char* object = srcHead->getString("OBJECT"); if (object) { head_->appendString("OBJECT", object, NULL); delete [] object; } // DATE-OBS char* dateobs = srcHead->getString("DATE-OBS"); if (dateobs) { head_->appendString("DATE-OBS", dateobs, NULL); delete [] dateobs; } char* timeobs = srcHead->getString("TIME-OBS"); if (timeobs) { head_->appendString("TIME-OBS", timeobs, NULL); delete [] timeobs; } char* dateend = srcHead->getString("DATE-END"); if (dateend) { head_->appendString("DATE-END", dateend, NULL); delete [] dateend; } char* timeend = srcHead->getString("TIME-END"); if (timeend) { head_->appendString("TIME-END", timeend, NULL); delete [] timeend; } // we added cards head_->updateHDU(); return 1; } void FitsHist::initFilter(FitsFile* fits) { FitsHead* srcHead = fits->head(); const char* filtstr = fits->pFilter(); if (filtstr && *filtstr) { ostringstream str; str << "bincols=(" << fits->pBinX() << ',' << fits->pBinY() << ')'; if (byteswap_) str << ",convert=true"; str << ends; if (!(fitsy_ = ft_headinit(srcHead->cards(), srcHead->headbytes()))) internalError("Fitsy++ hist bad filter head"); else { #ifndef __WIN32 if (!(filter_ = FilterOpen((FITSHead)fitsy_, (char*)filtstr, (char*)str.str().c_str()))){ internalError("Fitsy++ hist unable to build filter"); } #else internalError("Fitsy++ filter not supported"); #endif } } } void FitsHist::deleteFilter() { #ifndef __WIN32 if (filter_) { FilterClose((Filter)filter_); filter_ = NULL; } #endif if (fitsy_) { ft_headfree((FITSHead)fitsy_,0); fitsy_ = NULL; } } void FitsHist::bin(FitsFile* fits, Matrix& m, Function func, Vector block) { FitsHead* srcHead = fits->head(); FitsTableHDU* srcHDU = (FitsTableHDU*)(srcHead->hdu()); // create image space float* dest = new float[size_]; memset(dest, 0, size_*sizeof(float)); // bin it up char* ptr = (char*)fits->data(); int rowlen = srcHDU->width(); int rows = srcHDU->rows(); // third dimension double zmin; double zlength; if (zcol_) { zmin = zcol_->getMin(); zlength = zcol_->getMax() - zcol_->getMin(); } // filter int goodincr = 0; int goodindex = FILTERSIZE; int* good = NULL; if (filter_) good = new int[FILTERSIZE]; // matrix register double m00 = m.matrix(0,0); register double m10 = m.matrix(1,0); register double m20 = m.matrix(2,0); register double m01 = m.matrix(0,1); register double m11 = m.matrix(1,1); register double m21 = m.matrix(2,1); for (int ii=0; ii=FILTERSIZE)) { // for memory models that support internal paging // need at lease FILTERSIZE rows ptr = fits->page(ptr, rowlen*FILTERSIZE); int diff = srcHDU->rows() - (goodincr * FILTERSIZE); #ifndef __WIN32 if (FilterEvents((Filter)filter_, ptr, srcHDU->width(), (diffpage(ptr, rowlen); } if (!good || (good && good[goodindex])) { register double x = xcol_->value(ptr); register double y = ycol_->value(ptr); register double X = x*m00 + y*m10 + m20; register double Y = x*m01 + y*m11 + m21; if (X >= 0 && X < width_ && Y >= 0 && Y < height_) { if (!zcol_) dest[((int)Y)*width_ + (int)X]++; else { int zz = (int)((zcol_->value(ptr)-zmin)/zlength*depth_); if (zz>=0 && zzresetpage(); // Average if (func==AVERAGE) for (int k=0; kappendReal("LTM1_1", m[0][0], 10, NULL); head_->appendReal("LTM1_2", m[0][1], 10, NULL); head_->appendReal("LTM2_1", m[1][0], 10, NULL); head_->appendReal("LTM2_2", m[1][1], 10, NULL); head_->appendReal("LTV1" , m[2][0], 10, NULL); head_->appendReal("LTV2" , m[2][1], 10, NULL); } void FitsHist::mapWCSString(FitsHead* head, char* w, const char* out, const char* prim) { ostringstream istr; istr << prim << xcol_->index() << w << ends; if (head->find(istr.str().c_str())) { char* cc = head->getString(istr.str().c_str()); head_->appendString(out, cc, NULL); delete [] cc; } } void FitsHist::mapWCSString(FitsHead* head, char* w, const char* out, const char* prim, const char* alt) { ostringstream istr1, istr2; if (!w[0]) { istr1 << prim << xcol_->index() << w << ends; istr2 << prim << ycol_->index() << w << ends; } else { istr1 << alt << xcol_->index() << w << ends; istr2 << alt << ycol_->index() << w << ends; } ostringstream ostr1, ostr2; ostr1 << out << "1" << w << ends; ostr2 << out << "2" << w << ends; if (head->find(istr1.str().c_str()) || head->find(istr2.str().c_str())) { char* cc1 = head->getString(istr1.str().c_str()); char* cc2 = head->getString(istr2.str().c_str()); head_->appendString(ostr1.str().c_str(), cc1, NULL); head_->appendString(ostr2.str().c_str(), cc2, NULL); delete [] cc1; delete [] cc2; } } void FitsHist::mapWCSReal(FitsHead* head, const char* out, const char* in) { ostringstream istr; istr << in << xcol_->index() << ends; if (head->find(istr.str().c_str())) { float cc = head->getReal(istr.str().c_str(), 0); head_->appendReal(out, cc, 10, NULL); } } void FitsHist::mapWCSReal(FitsHead* head, char* w, const char* out, const char* in) { ostringstream istr; istr << in << xcol_->index() << w << ends; if (head->find(istr.str().c_str())) { float cc = head->getReal(istr.str().c_str(), 0); head_->appendReal(out, cc, 10, NULL); } } void FitsHist::mapWCSReal(FitsHead* head, char* w, const char* out, const char* prim, const char* alt, Matrix mm) { ostringstream istr1, istr2; if (!w[0]) { istr1 << prim << xcol_->index() << w << ends; istr2 << prim << ycol_->index() << w << ends; } else { istr1 << alt << xcol_->index() << w << ends; istr2 << alt << ycol_->index() << w << ends; } ostringstream ostr1, ostr2; ostr1 << out << "1" << w << ends; ostr2 << out << "2" << w << ends; if (head->find(istr1.str().c_str()) || head->find(istr2.str().c_str())) { float cc1 = head->getReal(istr1.str().c_str(),0); float cc2 = head->getReal(istr2.str().c_str(),0); Vector cc = Vector(cc1,cc2) * mm; head_->appendReal(ostr1.str().c_str(), cc[0], 10, NULL); head_->appendReal(ostr2.str().c_str(), cc[1], 10, NULL); } } void FitsHist::mapWCSMatrix(FitsHead* head, char* w, const char* out, const char* in, Vector vv) { ostringstream istr1, istr2, istr3, istr4; istr1 << in << xcol_->index() << "_" << xcol_->index() << w << ends; istr2 << in << xcol_->index() << "_" << ycol_->index() << w << ends; istr3 << in << ycol_->index() << "_" << xcol_->index() << w << ends; istr4 << in << ycol_->index() << "_" << ycol_->index() << w << ends; ostringstream ostr1, ostr2, ostr3, ostr4; ostr1 << out << "1_1" << w << ends; ostr2 << out << "1_2" << w << ends; ostr3 << out << "2_1" << w << ends; ostr4 << out << "2_2" << w << ends; if (head->find(istr1.str().c_str()) || head->find(istr2.str().c_str()) || head->find(istr3.str().c_str()) || head->find(istr4.str().c_str())) { float cc11 = head->getReal(istr1.str().c_str(), 0); float cc12 = head->getReal(istr2.str().c_str(), 0); float cc21 = head->getReal(istr3.str().c_str(), 0); float cc22 = head->getReal(istr4.str().c_str(), 0); Matrix cc = Matrix(cc11*vv[0], cc12*vv[0], cc21*vv[1], cc22*vv[1], 0, 0); head_->appendReal(ostr1.str().c_str(), cc[0][0], 10, NULL); head_->appendReal(ostr2.str().c_str(), cc[0][1], 10, NULL); head_->appendReal(ostr3.str().c_str(), cc[1][0], 10, NULL); head_->appendReal(ostr4.str().c_str(), cc[1][1], 10, NULL); } } void FitsHist::mapWCSVector(FitsHead* head, char* w, const char* out, const char* in) { for (int ii=0; ii<=9; ii++) { ostringstream istr1, istr2; istr1 << in << xcol_->index() << "_" << ii << w << ends; istr2 << in << ycol_->index() << "_" << ii << w << ends; ostringstream ostr1, ostr2; ostr1 << out << "1_" << ii << ends; ostr2 << out << "2_" << ii << ends; if (head->find(istr1.str().c_str()) || head->find(istr2.str().c_str())) { float cc1 = head->getReal(istr1.str().c_str(), 0); float cc2 = head->getReal(istr2.str().c_str(), 0); head_->appendReal(ostr1.str().c_str(), cc1, 10, NULL); head_->appendReal(ostr2.str().c_str(), cc2, 10, NULL); } } } void FitsHist::initWCS(FitsFile* fits, Matrix& mm, Vector block) { FitsHead* srcHead = fits->head(); char w[2]; w[1] = '\0'; for (int i=0; ifind("EPOCH")) { char* cc = head_->getString("EPOCH"); head_->appendString("EPOCH", cc, NULL); delete [] cc; } } } FitsHistNext::FitsHistNext(FitsFile* prev) { primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = prev->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; return; } saods9/tksao1.0/fitsy++/hist.h000644 000765 000000 00000002776 12464214754 016355 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitshist_h__ #define __fitshist_h__ #include "vector.h" #include "file.h" class FitsHist : public FitsFile { public: enum Function {SUM, AVERAGE}; private: int width_; int height_; int depth_; size_t size_; FitsColumn* xcol_; FitsColumn* ycol_; FitsColumn* zcol_; void* fitsy_; void* filter_; int initHeader(FitsFile*); void initLTMV(Matrix&); void initWCS(FitsFile*, Matrix&, Vector); void mapWCSMatrix(FitsHead*, char* w, const char* out, const char* in, Vector); void mapWCSReal(FitsHead* head, const char* out, const char* in); void mapWCSReal(FitsHead* head, char* w, const char* out, const char* in); void mapWCSReal(FitsHead*, char* w, const char* out, const char* prim, const char* alt, Matrix); void mapWCSString(FitsHead*, char* w, const char* out, const char* prim); void mapWCSString(FitsHead*, char* w, const char* out, const char* prim, const char* alt); void mapWCSVector(FitsHead*, char* w, const char* out, const char* in); void initFilter(FitsFile*); void deleteFilter(); void bin(FitsFile*, Matrix&, Function, Vector); void swap(); public: FitsHist(FitsFile* src, int width, int height, int depth, Matrix& m, Function func, Vector block); ~FitsHist(); }; class FitsHistNext : public FitsFile { public: FitsHistNext(FitsFile* prev); }; #endif saods9/tksao1.0/fitsy++/hpx.C000644 000765 000000 00000037644 12536624276 016146 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" // This source has been modified from the original authored by // Dr. Mark Calabretta as distributed with WCSLIBS under GNU GPL version 3 // WCSLIB 4.7 - an implementation of the FITS WCS standard. // Copyright (C) 1995-2011, Mark Calabretta #include #include #include #include #include using namespace std; #include "hpx.h" #include "util.h" #include "fitsy.h" FitsHPX::FitsHPX(FitsFile* fits, Order oo, CoordSys ss, Layout ll, int cc, int qq) : order_(oo), coord_(ss), layout_(ll), quad_(qq) { FitsHead* head = fits->head(); FitsTableHDU* hdu = (FitsTableHDU*)(head->hdu()); col_ = (FitsBinColumn*)hdu->find(cc); if (!col_) return; int nrow = hdu->rows(); int nelem = col_->repeat(); nside_ = head->getInteger("NSIDE",0); long firstpix = head->getInteger("FIRSTPIX",-1); long lastpix = head->getInteger("LASTPIX",-1); if (!nside_) { // Deduce NSIDE if (lastpix >= 0) { // If LASTPIX is present without NSIDE we can only assume it's npix. nside_ = (int)(sqrt((double)((lastpix+1) / 12)) + 0.5); } else if (nrow) nside_ = (int)(sqrt((double)((nrow * nelem) / 12)) + 0.5); } long npix = 12*nside_*nside_; if (firstpix < 0) firstpix = 0; if (lastpix < 0) lastpix = npix - 1; build(fits); if (byteswap_) swap(); valid_ = 1; } FitsHPX::~FitsHPX() { if (data_) delete [] (float*)data_; } void FitsHPX::build(FitsFile* fits) { // Number of facets on a side of each layout const int NFACET[] = {5, 4, 4}; // Arrays that define the facet location and rotation for each recognised // layout. Bear in mind that these appear to be upside-down, i.e. the top // line contains facet numbers for the bottom row of the output image. // Facets numbered -1 are blank. // Equatorial (diagonal) facet layout. const int FACETS[][5][5] = {{{ 6, 9, -1, -1, -1}, { 1, 5, 8, -1, -1}, {-1, 0, 4, 11, -1}, {-1, -1, 3, 7, 10}, {-1, -1, -1, 2, 6}}, // North polar (X) facet layout. {{ 8, 4, 4, 11, -1}, { 5, 0, 3, 7, -1}, { 5, 1, 2, 7, -1}, { 9, 6, 6, 10, -1}, {-1, -1, -1, -1, -1}}, // South polar (X) facet layout. {{ 1, 6, 6, 2, -1}, { 5, 9, 10, 7, -1}, { 5, 8, 11, 7, -1}, { 0, 4, 4, 3, -1}, {-1, -1, -1, -1, -1}}}; // All facets of the equatorial layout are rotated by +45 degrees with // respect to the normal orientation, i.e. that with the equator running // horizontally. The rotation recorded for the polar facets is the number // of additional positive (anti-clockwise) 90 degree turns with respect to // the equatorial layout. // Equatorial (diagonal), no facet rotation. const int FROTAT[][5][5] = {{{ 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}}, // North polar (X) facet rotation. {{ 3, 3, 0, 0, 0}, { 3, 3, 0, 0, 0}, { 2, 2, 1, 1, 0}, { 2, 2, 1, 1, 0}, { 0, 0, 0, 0, 0}}, // South polar (X) facet rotation. {{ 1, 1, 2, 2, 0}, { 1, 1, 2, 2, 0}, { 0, 0, 3, 3, 0}, { 0, 0, 3, 3, 0}, { 0, 0, 0, 0, 0}}}; // Facet halving codes. 0: the facet is whole (or wholly blank), // 1: blanked bottom-right, 2: top-right, 3: top-left, 4: bottom-left. // Positive values mean that the diagonal is included, otherwise not. // Equatorial (diagonal), no facet halving. const int FHALVE[][5][5] = {{{ 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0}}, // North polar (X) facet halving. {{ 0, 1, -4, 0, 0}, {-3, 0, 0, 2, 0}, { 4, 0, 0, -1, 0}, { 0, -2, 3, 0, 0}, { 0, 0, 0, 0, 0}}, // South polar (X) facet halving. {{ 0, 1, -4, 0, 0}, {-3, 0, 0, 2, 0}, { 4, 0, 0, -1, 0}, { 0, -2, 3, 0, 0}, { 0, 0, 0, 0, 0}}}; FitsHead* head = fits->head(); FitsTableHDU* hdu = (FitsTableHDU*)(head->hdu()); int rowlen = hdu->width(); char* data = (char*)fits->data(); int nside = nside_; int layout = layout_; int nfacet = NFACET[layout]; pWidth_ = nfacet*nside; pHeight_ = pWidth_; // create image space size_t pSize = (size_t)pWidth_*pHeight_; float* dest = new float[pSize]; for (longlong ii=0; ii= 0) { if (facet <= 3) { facet += quad_; if (facet > 3) facet -= 4; } else if (facet <= 7) { facet += quad_; if (facet > 7) facet -= 4; } else { facet += quad_; if (facet > 11) facet -= 4; } } // Write out the data if (facet < 0) ; else { switch (order_) { case NESTED: NESTidx(nside, facet, rotn, jj, healidx); break; case RING: RINGidx(nside, facet, rotn, jj, healidx); break; } // Gather data into the output vector. long* healp = healidx; for (float* rowp = row; rowp < row+nside; rowp++) *rowp = col_->value(data+*(healp++)*rowlen,0); // Apply blanking to halved facets. if (halve) { int i1; int i2; if (abs(halve) == 1) { // Blank bottom-right. i1 = jj; i2 = nside; if (halve > 0) i1++; } else if (abs(halve) == 2) { // Blank top-right. i1 = nside - jj; i2 = nside; if (halve < 0) i1--; } else if (abs(halve) == 3) { // Blank top-left. i1 = 0; i2 = jj; if (halve < 0) i2++; } else { // Blank bottom-left. i1 = 0; i2 = nside - jj; if (halve > 0) i2--; } for (float* rowp = row+i1; rowp < row+i2; rowp++) *rowp = NAN; } // Write out this facet's contribution to this row of the map. memcpy(dest+fpixel-1, row, nside*sizeof(float)); } fpixel += nelem; } } } data_ = dest; dataSize_ = pSize; dataSkip_ = 0; } // (imap,jmap) are 0-relative pixel coordinates in the output map with origin // at the bottom-left corner of the specified facet which is rotated by // (45 + rotn * 90) degrees from its natural orientation; imap increases to // the right and jmap upwards. void FitsHPX::NESTidx(int nside, int facet, int rotn, int jmap, long *healidx) { // Nested index (0-relative) of the first pixel in this facet. int hh = facet*nside*nside; int nside1 = nside - 1; long* hp = healidx; for (int imap = 0; imap < nside; imap++, hp++) { // (ii,jj) are 0-relative pixel coordinates with origin in the southern // corner of the facet; i increases to the north-east and j to the // north-west. int ii =0; int jj =0; if (rotn == 0) { ii = nside1 - imap; jj = jmap; } else if (rotn == 1) { ii = nside1 - jmap; jj = nside1 - imap; } else if (rotn == 2) { ii = imap; jj = nside1 - jmap; } else if (rotn == 3) { ii = jmap; jj = imap; } *hp = 0; int bit = 1; while (ii || jj) { if (ii & 1) *hp |= bit; bit <<= 1; if (jj & 1) *hp |= bit; bit <<= 1; ii >>= 1; jj >>= 1; } *hp += hh; } } // (imap,jmap) pixel coordinates are as described above for NESTidx(). This // function computes the double-pixelisation index then converts it to the // regular ring index. void FitsHPX::RINGidx(int nside, int facet, int rotn, int jmap, long *healidx) { const int I0[] = { 1, 3, -3, -1, 0, 2, 4, -2, 1, 3, -3, -1}; const int J0[] = { 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, -1, -1}; int n2side = 2 * nside; int n8side = 8 * nside; // Double-pixelisation index of the last pixel in the north polar cap. */ int npole = (n2side - 1) * (n2side - 1) - 1; // Double-pixelisation pixel coordinates of the centre of the facet. */ int i0 = nside * I0[facet]; int j0 = nside * J0[facet]; int nside1 = nside - 1; long* hp = healidx; for (int imap = 0; imap < nside; imap++, hp++) { // (ii,jj) are 0-relative, double-pixelisation pixel coordinates. The // origin is at the intersection of the equator and prime meridian, // i increases to the east (N.B.) and j to the north. int ii =0; int jj =0; if (rotn == 0) { ii = i0 + nside1 - (jmap + imap); jj = j0 + jmap - imap; } else if (rotn == 1) { ii = i0 + imap - jmap; jj = j0 + nside1 - (imap + jmap); } else if (rotn == 2) { ii = i0 + (imap + jmap) - nside1; jj = j0 + imap - jmap; } else if (rotn == 3) { ii = i0 + jmap - imap; jj = j0 + jmap + imap - nside1; } // Convert i for counting pixels if (ii < 0) ii += n8side; ii++; if (jj > nside) { // North polar regime. if (jj == n2side) *hp = 0; else { // Number of pixels in a polar facet with this value of jj. int npj = 2 * (n2side - jj); // Index of the last pixel in the row above this. *hp = (npj - 1) * (npj - 1) - 1; // Number of pixels in this row in the polar facets before this. *hp += npj * (ii/n2side); // Pixel number in this polar facet. *hp += ii%n2side - (jj - nside) - 1; } } else if (jj >= -nside) { // Equatorial regime. *hp = npole + n8side * (nside - jj) + ii; } else { // South polar regime. *hp = 24 * nside * nside + 1; if (jj > -n2side) { // Number of pixels in a polar facet with this value of jj. int npj = 2 * (jj + n2side); // Total number of pixels in this row or below it. *hp -= (npj + 1) * (npj + 1); // Number of pixels in this row in the polar facets before this. *hp += npj * (ii/n2side); // Pixel number in this polar facet. *hp += ii%n2side + (nside + jj) - 1; } } // Convert double-pixelisation index to regular. *hp -= 1; *hp /= 2; } } void FitsHPX::initHeader(FitsFile* fits) { FitsHead* src = fits->head(); // create header head_ = new FitsHead(pWidth_, pHeight_, 1, -32); // OBJECT char* object = src->getString("OBJECT"); if (object) { head_->appendString("OBJECT", object, NULL); delete [] object; } // CRPIX1/2 float crpix1; switch (layout_) { case EQUATOR: crpix1 = (5 * nside_ + 1) / 2.; break; case NORTH: case SOUTH: crpix1 = (4 * nside_ + 1) / 2.; break; } float crpix2 = crpix1; head_->appendReal("CRPIX1", crpix1, 8, "Coordinate reference pixel"); head_->appendReal("CRPIX2", crpix2, 8, "Coordinate reference pixel"); // PCx_y float cos45 = sqrt(2.0) / 2.0; if (layout_ == EQUATOR) { head_->appendReal("PC1_1", cos45, 8, "Transformation matrix element"); head_->appendReal("PC1_2", cos45, 8, "Transformation matrix element"); head_->appendReal("PC2_1", -cos45, 8, "Transformation matrix element"); head_->appendReal("PC2_2", cos45, 8, "Transformation matrix element"); } // CDELT1/2 float cdelt1 = -90.0 / nside_ / sqrt(2.); float cdelt2 = -cdelt1; head_->appendReal("CDELT1", cdelt1, 8, "[deg] Coordinate increment"); head_->appendReal("CDELT2", cdelt2, 8, "[deg] Coordinate increment"); // CTYPE1/2 const char* pcode; switch (layout_) { case EQUATOR: pcode = "HPX"; break; case NORTH: case SOUTH: pcode = "XPH"; break; } const char* ctype1; const char* ctype2; const char* descr1; const char* descr2; switch (coord_) { case EQU: ctype1 = "RA--"; ctype2 = "DEC-"; descr1 = "Right ascension"; descr2 = "Declination"; break; case GAL: ctype1 = "GLON"; ctype2 = "GLAT"; descr1 = "Galactic longitude"; descr2 = "Galactic latitude"; break; case ECL: ctype1 = "ELON"; ctype2 = "ELAT"; descr1 = "Ecliptic longitude"; descr2 = "Ecliptic latitude"; break; case UNKNOWN: ctype1 = "XLON"; ctype2 = "XLAT"; descr1 = "Longitude"; descr2 = " Latitude"; } { ostringstream cval; cval << ctype1 << '-' << pcode << ends; ostringstream comm; comm << descr1 << " in an " << pcode << " projection" << ends; head_->appendString("CTYPE1", cval.str().c_str(), comm.str().c_str()); } { ostringstream cval; cval << ctype2 << '-' << pcode << ends; ostringstream comm; comm << descr2 << " in an " << pcode << " projection" << ends; head_->appendString("CTYPE2", cval.str().c_str(), comm.str().c_str()); } // CRVAL1/CRVAL2 float crval1 = 0. + 90.*quad_; float crval2; switch (layout_) { case EQUATOR: crval2 = 0.; break; case NORTH: crval1 += 180.; crval2 = 90.; break; case SOUTH: crval1 += 180.; crval2 = -90.; break; } if (360. < crval1) crval1 -= 360.; { ostringstream comm; comm << "[deg] " << descr1 << " at the reference point" << ends; head_->appendReal("CRVAL1", crval1, 8, comm.str().c_str()); } { ostringstream comm; comm << "[deg] " << descr2 << " at the reference point" << ends; head_->appendReal("CRVAL2", crval2, 8, comm.str().c_str()); } // PV2_1/2 switch (layout_) { case EQUATOR: head_->appendInteger("PV2_1", 4, "HPX H parameter (longitude)"); head_->appendInteger("PV2_2", 3, "HPX K parameter (latitude)"); break; case NORTH: case SOUTH: head_->appendReal("LONPOLE", 180., 8, "[deg] Native longitude of the celestial pole"); break; } // we added cards head_->updateHDU(); } void FitsHPX::swap() { if (!data_) return; // we now need to byteswap back to native form float* dest = (float*)data_; for (int ii=0; iiisValid()) return; // alloc memory size_t size = (size_t)width*height; data_ = new char[size]; if (!data_) return; dataSize_ = size; dataSkip_ = 0; // clear memory memset(data_, '\0', size); // made it this far, must be valid valid_ = 1; } FitsIIS::~FitsIIS() { if (data_) delete [] (char*)data_; } void FitsIIS::erase() { // clear memory FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); memset(data_, '\0', hdu->realbytes()); } char* FitsIIS::get(int xx, int yy, int dx, int dy) { // fill-in in reverse order int ll = dx*dy; char* dest = new char[ll]; int ww = head_->naxis(0); int hh = head_->naxis(1); char* dptr = dest; char* sptr = (char*)data_ + ((hh-1)-yy)*ww + xx; while (ll) { memcpy(dptr, sptr, ww); sptr -= ww; dptr += ww; ll -= ww; } return dest; } void FitsIIS::set(const char* src, int xx, int yy, int dx, int dy) { // fill-in in reverse order int ll = dx*dy; int ww = head_->naxis(0); int hh = head_->naxis(1); char* sptr = (char*)src; char* dptr = (char*)data_ + ((hh-1)-yy)*ww + xx; while (ll) { memcpy(dptr, sptr, ww); sptr += ww; dptr -= ww; ll -= ww; } } saods9/tksao1.0/fitsy++/iis.h000644 000765 000000 00000000673 12464214754 016164 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsiis_h__ #define __fitsiis_h__ #include "file.h" class FitsIIS : public FitsFile { public: FitsIIS(int, int); ~FitsIIS(); void erase(); char* get(int xx, int yy, int dx, int dy); void set(const char* src, int xx, int yy, int dx, int dy); }; #endif saods9/tksao1.0/fitsy++/lex.C000644 000765 000000 00000146752 12612461721 016125 0ustar00joyewheel000000 000000 #line 2 "fitsy++/lex.C" #line 4 "fitsy++/lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer ffFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *ffalloc (yy_size_t ); void *ffrealloc (void *,yy_size_t ); void fffree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 45 #define YY_END_OF_BUFFER 46 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[178] = { 0, 0, 0, 0, 0, 42, 42, 0, 0, 46, 1, 3, 1, 1, 2, 4, 41, 40, 45, 41, 39, 37, 37, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 42, 44, 44, 43, 1, 3, 1, 40, 36, 37, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 42, 43, 37, 37, 7, 9, 37, 13, 14, 37, 37, 37, 37, 20, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 5, 37, 37, 37, 37, 37, 15, 37, 37, 37, 37, 37, 37, 37, 37, 37, 27, 28, 29, 37, 37, 37, 33, 34, 35, 6, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 25, 26, 30, 37, 37, 37, 11, 10, 12, 37, 17, 37, 37, 21, 22, 24, 31, 37, 37, 37, 37, 37, 37, 32, 37, 16, 37, 19, 37, 8, 37, 37, 18, 37, 37, 23, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 10, 11, 12, 13, 14, 8, 15, 16, 17, 8, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 8, 29, 30, 31, 32, 33, 1, 34, 1, 8, 1, 35, 36, 37, 38, 39, 8, 40, 41, 42, 8, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 8, 54, 55, 56, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[58] = { 0, 1, 2, 3, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } ; static yyconst flex_int16_t yy_base[184] = { 0, 0, 3, 37, 0, 339, 336, 5, 6, 119, 0, 14, 0, 15, 381, 381, 381, 18, 381, 108, 381, 105, 0, 101, 70, 79, 75, 81, 87, 90, 87, 92, 90, 78, 77, 89, 117, 86, 100, 102, 103, 381, 0, 381, 26, 23, 0, 19, 22, 23, 22, 0, 21, 130, 129, 99, 125, 127, 134, 121, 132, 121, 122, 127, 131, 133, 146, 151, 141, 146, 137, 140, 150, 168, 172, 175, 0, 20, 178, 185, 182, 185, 175, 0, 173, 183, 184, 192, 194, 0, 183, 179, 180, 181, 195, 198, 197, 190, 188, 189, 197, 215, 219, 222, 0, 213, 224, 224, 233, 231, 0, 226, 240, 224, 240, 225, 235, 241, 240, 232, 0, 0, 0, 242, 245, 239, 0, 0, 0, 0, 249, 244, 234, 236, 241, 264, 267, 265, 267, 281, 283, 0, 0, 0, 277, 269, 282, 0, 0, 0, 283, 0, 276, 285, 0, 289, 0, 0, 283, 295, 294, 290, 296, 288, 0, 290, 0, 302, 0, 300, 0, 296, 299, 0, 308, 314, 0, 381, 360, 364, 368, 372, 24, 376 } ; static yyconst flex_int16_t yy_def[184] = { 0, 178, 178, 177, 3, 179, 179, 180, 180, 177, 181, 177, 181, 181, 177, 177, 177, 177, 177, 177, 177, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 177, 183, 177, 177, 177, 181, 177, 181, 177, 177, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 183, 177, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 0, 177, 177, 177, 177, 177, 177 } ; static yyconst flex_int16_t yy_nxt[439] = { 0, 177, 11, 12, 13, 11, 12, 13, 18, 18, 44, 44, 44, 44, 45, 45, 47, 47, 47, 48, 49, 47, 49, 47, 47, 49, 48, 49, 51, 77, 52, 50, 77, 14, 15, 77, 14, 15, 16, 17, 18, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 22, 22, 30, 31, 22, 32, 33, 22, 34, 35, 36, 22, 37, 22, 38, 39, 40, 41, 16, 24, 25, 26, 27, 28, 29, 22, 22, 30, 31, 22, 32, 33, 22, 34, 35, 36, 22, 37, 22, 38, 39, 40, 53, 54, 55, 56, 57, 60, 61, 62, 66, 64, 67, 68, 72, 58, 63, 52, 59, 65, 73, 52, 74, 75, 50, 83, 177, 53, 54, 55, 56, 57, 60, 61, 62, 66, 64, 67, 68, 72, 58, 63, 69, 59, 65, 73, 70, 74, 75, 78, 83, 80, 84, 85, 86, 71, 87, 81, 88, 89, 90, 91, 79, 82, 92, 93, 94, 69, 95, 96, 97, 70, 98, 99, 78, 100, 80, 84, 85, 86, 71, 87, 81, 88, 89, 90, 91, 79, 82, 92, 93, 94, 101, 95, 96, 97, 102, 98, 99, 103, 100, 104, 105, 106, 107, 109, 110, 111, 112, 113, 108, 114, 115, 116, 117, 118, 119, 101, 120, 121, 122, 102, 123, 124, 103, 125, 104, 105, 106, 107, 109, 110, 111, 112, 113, 108, 114, 115, 116, 117, 118, 119, 126, 120, 121, 122, 127, 123, 124, 128, 125, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 126, 145, 146, 147, 127, 148, 149, 128, 150, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 151, 145, 146, 147, 152, 148, 149, 153, 150, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 151, 170, 171, 172, 152, 173, 174, 153, 175, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 176, 170, 171, 172, 18, 173, 174, 18, 175, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 176, 10, 10, 10, 10, 42, 42, 42, 42, 43, 43, 43, 43, 46, 177, 46, 46, 76, 76, 177, 76, 9, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177 } ; static yyconst flex_int16_t yy_chk[439] = { 0, 0, 1, 1, 1, 2, 2, 2, 7, 8, 7, 8, 7, 8, 7, 8, 11, 13, 11, 13, 17, 47, 17, 47, 48, 49, 48, 49, 182, 77, 52, 50, 45, 1, 1, 44, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 24, 25, 26, 27, 28, 29, 30, 31, 33, 32, 34, 35, 37, 28, 31, 23, 28, 32, 38, 21, 39, 40, 19, 55, 9, 24, 25, 26, 27, 28, 29, 30, 31, 33, 32, 34, 35, 37, 28, 31, 36, 28, 32, 38, 36, 39, 40, 53, 55, 54, 56, 57, 58, 36, 59, 54, 60, 61, 62, 63, 53, 54, 64, 65, 66, 36, 67, 68, 69, 36, 70, 71, 53, 72, 54, 56, 57, 58, 36, 59, 54, 60, 61, 62, 63, 53, 54, 64, 65, 66, 73, 67, 68, 69, 74, 70, 71, 75, 72, 78, 79, 80, 81, 82, 84, 85, 86, 87, 81, 88, 90, 91, 92, 93, 94, 73, 95, 96, 97, 74, 98, 99, 75, 100, 78, 79, 80, 81, 82, 84, 85, 86, 87, 81, 88, 90, 91, 92, 93, 94, 101, 95, 96, 97, 102, 98, 99, 103, 100, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 119, 123, 124, 101, 125, 130, 131, 102, 132, 133, 103, 134, 105, 106, 107, 108, 109, 111, 112, 113, 114, 115, 116, 117, 118, 119, 123, 124, 135, 125, 130, 131, 136, 132, 133, 137, 134, 138, 139, 140, 144, 145, 146, 150, 152, 153, 155, 158, 159, 160, 161, 162, 163, 135, 165, 167, 169, 136, 171, 172, 137, 174, 138, 139, 140, 144, 145, 146, 150, 152, 153, 155, 158, 159, 160, 161, 162, 163, 175, 165, 167, 169, 6, 171, 172, 5, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 178, 178, 178, 178, 179, 179, 179, 179, 180, 180, 180, 180, 181, 0, 181, 181, 183, 183, 0, 183, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "fitsy++/lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 11 "fitsy++/lex.L" #include #include #include #include "util.h" #include "parser.H" extern YYSTYPE* fflval; extern ffFlexLexer* fflexx; extern char ff_filter[]; #define RET(x) {strcat(ff_filter,yytext);return x;} #define CLEARFILTER {ff_filter[0]='\0';} /* rules */ #line 584 "fitsy++/lex.C" #define INITIAL 0 #define EXT 1 #define FILTER 2 #define ARRAY 3 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 32 "fitsy++/lex.L" #line 690 "fitsy++/lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 178 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 177 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 34 "fitsy++/lex.L" { // File strcpy(fflval->str,yytext); return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 39 "fitsy++/lex.L" { // first bracket BEGIN EXT; CLEARFILTER return yytext[0]; } YY_BREAK case 3: YY_RULE_SETUP #line 45 "fitsy++/lex.L" { // White Spaces } YY_BREAK case 4: YY_RULE_SETUP #line 48 "fitsy++/lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 5: YY_RULE_SETUP #line 54 "fitsy++/lex.L" {RET(ARCH_)} YY_BREAK case 6: YY_RULE_SETUP #line 55 "fitsy++/lex.L" {RET(ARRAY_)} YY_BREAK case 7: YY_RULE_SETUP #line 56 "fitsy++/lex.L" {RET(BIG_)} YY_BREAK case 8: YY_RULE_SETUP #line 57 "fitsy++/lex.L" {RET(BIGENDIAN_)} YY_BREAK case 9: YY_RULE_SETUP #line 58 "fitsy++/lex.L" {RET(BIN_)} YY_BREAK case 10: YY_RULE_SETUP #line 59 "fitsy++/lex.L" {RET(BINKEY_)} YY_BREAK case 11: YY_RULE_SETUP #line 60 "fitsy++/lex.L" {RET(BINCOL_)} YY_BREAK case 12: YY_RULE_SETUP #line 61 "fitsy++/lex.L" {RET(BITPIX_)} YY_BREAK case 13: YY_RULE_SETUP #line 62 "fitsy++/lex.L" {RET(COL_)} YY_BREAK case 14: YY_RULE_SETUP #line 63 "fitsy++/lex.L" {RET(DIM_)} YY_BREAK case 15: YY_RULE_SETUP #line 64 "fitsy++/lex.L" {RET(DIMS_)} YY_BREAK case 16: YY_RULE_SETUP #line 65 "fitsy++/lex.L" {RET(ECLIPTIC_)} YY_BREAK case 17: YY_RULE_SETUP #line 66 "fitsy++/lex.L" {RET(ENDIAN_)} YY_BREAK case 18: YY_RULE_SETUP #line 67 "fitsy++/lex.L" {RET(EQUATORIAL_)} YY_BREAK case 19: YY_RULE_SETUP #line 68 "fitsy++/lex.L" {RET(GALACTIC_)} YY_BREAK case 20: YY_RULE_SETUP #line 69 "fitsy++/lex.L" {RET(KEY_)} YY_BREAK case 21: YY_RULE_SETUP #line 70 "fitsy++/lex.L" {RET(LAYOUT_)} YY_BREAK case 22: YY_RULE_SETUP #line 71 "fitsy++/lex.L" {RET(LITTLE_)} YY_BREAK case 23: YY_RULE_SETUP #line 72 "fitsy++/lex.L" {RET(LITTLEENDIAN_)} YY_BREAK case 24: YY_RULE_SETUP #line 73 "fitsy++/lex.L" {RET(NESTED_)} YY_BREAK case 25: YY_RULE_SETUP #line 74 "fitsy++/lex.L" {RET(NORTH_)} YY_BREAK case 26: YY_RULE_SETUP #line 75 "fitsy++/lex.L" {RET(ORDER_)} YY_BREAK case 27: YY_RULE_SETUP #line 76 "fitsy++/lex.L" {RET(QUAD_)} YY_BREAK case 28: YY_RULE_SETUP #line 77 "fitsy++/lex.L" {RET(RING_)} YY_BREAK case 29: YY_RULE_SETUP #line 78 "fitsy++/lex.L" {RET(SKIP_)} YY_BREAK case 30: YY_RULE_SETUP #line 79 "fitsy++/lex.L" {RET(SOUTH_)} YY_BREAK case 31: YY_RULE_SETUP #line 80 "fitsy++/lex.L" {RET(SYSTEM_)} YY_BREAK case 32: YY_RULE_SETUP #line 81 "fitsy++/lex.L" {RET(UNKNOWN_)} YY_BREAK case 33: YY_RULE_SETUP #line 82 "fitsy++/lex.L" {RET(XDIM_)} YY_BREAK case 34: YY_RULE_SETUP #line 83 "fitsy++/lex.L" {RET(YDIM_)} YY_BREAK case 35: YY_RULE_SETUP #line 84 "fitsy++/lex.L" {RET(ZDIM_)} YY_BREAK case 36: YY_RULE_SETUP #line 86 "fitsy++/lex.L" { // Integer fflval->integer = atoi(yytext); RET(INT) } YY_BREAK case 37: YY_RULE_SETUP #line 91 "fitsy++/lex.L" { // Extn/Col Name strcpy(fflval->str,yytext); RET(STRING) } YY_BREAK case 38: YY_RULE_SETUP #line 96 "fitsy++/lex.L" { // bracket CLEARFILTER return yytext[0]; } YY_BREAK case 39: YY_RULE_SETUP #line 101 "fitsy++/lex.L" { // comma CLEARFILTER return yytext[0]; } YY_BREAK case 40: YY_RULE_SETUP #line 106 "fitsy++/lex.L" { // White Spaces strcat(ff_filter,yytext); } YY_BREAK case 41: YY_RULE_SETUP #line 110 "fitsy++/lex.L" { // Else, return the char strcat(ff_filter,yytext); return yytext[0]; } YY_BREAK case 42: YY_RULE_SETUP #line 117 "fitsy++/lex.L" { // rest of Filter strcpy(fflval->str,yytext); fflval->str[yyleng-1] = '\0'; // Remove the ']' strcat(ff_filter,fflval->str); return STRING; } YY_BREAK case 43: YY_RULE_SETUP #line 126 "fitsy++/lex.L" { // Integer fflval->integer = atoi(yytext); return INT; } YY_BREAK case 44: YY_RULE_SETUP #line 131 "fitsy++/lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 45: YY_RULE_SETUP #line 137 "fitsy++/lex.L" ECHO; YY_BREAK #line 1036 "fitsy++/lex.C" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(EXT): case YY_STATE_EOF(FILTER): case YY_STATE_EOF(ARRAY): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; fffree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); fffree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ ffrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) ffrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 178 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 178 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 177); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) ffalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) ffalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) fffree((void *) b->yy_ch_buf ); fffree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)ffalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)ffrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) ffalloc(new_size ); else (yy_start_stack) = (int *) ffrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *ffalloc (yy_size_t size ) { return (void *) malloc( size ); } void *ffrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void fffree (void * ptr ) { free( (char *) ptr ); /* see ffrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 137 "fitsy++/lex.L" void ffFilter(int doit) { if (fflexx) fflexx->begin(FILTER, doit); } void ffArray(int doit) { if (fflexx) fflexx->begin(ARRAY, doit); } void ffFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/lex.L000644 000765 000000 00000004764 12612461721 016132 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "parser.H" extern YYSTYPE* fflval; extern ffFlexLexer* fflexx; extern char ff_filter[]; #define RET(x) {strcat(ff_filter,yytext);return x;} #define CLEARFILTER {ff_filter[0]='\0';} %} %x EXT %x FILTER %x ARRAY /* rules */ %% [^[\]\t]+ { // File strcpy(fflval->str,yytext); return STRING; } \[ { // first bracket BEGIN EXT; CLEARFILTER return yytext[0]; } [ \t]+ { // White Spaces } . { // Else, return the char return yytext[0]; } { arch {RET(ARCH_)} array {RET(ARRAY_)} big {RET(BIG_)} bigendian {RET(BIGENDIAN_)} bin {RET(BIN_)} binkey {RET(BINKEY_)} bincol {RET(BINCOL_)} bitpix {RET(BITPIX_)} col {RET(COL_)} dim {RET(DIM_)} dims {RET(DIMS_)} ecliptic {RET(ECLIPTIC_)} endian {RET(ENDIAN_)} equatorial {RET(EQUATORIAL_)} galactic {RET(GALACTIC_)} key {RET(KEY_)} layout {RET(LAYOUT_)} little {RET(LITTLE_)} littleendian {RET(LITTLEENDIAN_)} nested {RET(NESTED_)} north {RET(NORTH_)} order {RET(ORDER_)} quad {RET(QUAD_)} ring {RET(RING_)} skip {RET(SKIP_)} south {RET(SOUTH_)} system {RET(SYSTEM_)} unknown {RET(UNKNOWN_)} xdim {RET(XDIM_)} ydim {RET(YDIM_)} zdim {RET(ZDIM_)} [-+]?[0-9]+ { // Integer fflval->integer = atoi(yytext); RET(INT) } [0-9A-Za-z_.-]+ { // Extn/Col Name strcpy(fflval->str,yytext); RET(STRING) } \[ { // bracket CLEARFILTER return yytext[0]; } , { // comma CLEARFILTER return yytext[0]; } [ \t]+ { // White Spaces strcat(ff_filter,yytext); } . { // Else, return the char strcat(ff_filter,yytext); return yytext[0]; } } .* { // rest of Filter strcpy(fflval->str,yytext); fflval->str[yyleng-1] = '\0'; // Remove the ']' strcat(ff_filter,fflval->str); return STRING; } { [-+]?[0-9]+ { // Integer fflval->integer = atoi(yytext); return INT; } . { // Else, return the char return yytext[0]; } } %% void ffFilter(int doit) { if (fflexx) fflexx->begin(FILTER, doit); } void ffArray(int doit) { if (fflexx) fflexx->begin(ARRAY, doit); } void ffFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/map.C000644 000765 000000 00000020164 12612461721 016076 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "map.h" #include "head.h" FitsMap::FitsMap() { mapdata_ = NULL; mapsize_ = 0; } char* FitsMap::enddata() { // return the address of the first data byte pass the end of data return head_ ? (char*)data_+head_->databytes() : NULL; } size_t FitsMap::endsize() { // return the size - (header+data) return head_ ? (mapsize_ - (size_t)((char*)data_+head_->databytes()-mapdata_)) : 0; } void FitsMap::found(char* here) { data_ = here + head_->headbytes(); dataSize_ = mapsize_; dataSkip_ = here - mapdata_ + head_->headbytes(); inherit_ = head_->inherit(); valid_ = 1; } void FitsMap::error() { if (manageHead_ && head_) delete head_; head_ = NULL; if (managePrimary_ && primary_) delete primary_; primary_ = NULL; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; valid_ = 0; } FitsFitsMap::FitsFitsMap(ScanMode mode) { if (!valid_) return; if (mode == EXACT || pExt_ || pIndex_>-1) processExact(); else processRelax(); } void FitsFitsMap::processExact() { // find head and data for specified unit char* here = mapdata_; size_t size = mapsize_; // simple check for fits file if (strncmp(mapdata_,"SIMPLE ",8) && strncmp(mapdata_,"XTENSION",8)) { error(); return; } if (!(pExt_ || (pIndex_>0))) { // we are only looking for a primary image head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (head_->isValid()) { found(here); return; } } else { // we are looking for an extension // keep the primary header primary_ = new FitsHead(here, size, FitsHead::EXTERNAL); managePrimary_ = 1; if (!primary_->isValid()) { error(); return; } here += primary_->headbytes() + primary_->databytes(); size -= primary_->headbytes() + primary_->databytes(); if (pExt_) { while (size > 0) { head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (!head_->isValid()) { error(); return; } ext_++; if (head_->extname()) { char* a = toUpper(head_->extname()); char* b = toUpper(pExt_); if (!strncmp(a,b,strlen(b))) { delete [] a; delete [] b; found(here); return; } delete [] a; delete [] b; } here += head_->headbytes() + head_->databytes(); size -= head_->headbytes() + head_->databytes(); delete head_; head_ = NULL; } } else { for (int i=1; i0; i++) { head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (!head_->isValid()) { error(); return; } ext_++; here += head_->headbytes() + head_->databytes(); size -= head_->headbytes() + head_->databytes(); delete head_; head_ = NULL; } head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (head_->isValid()) { ext_++; found(here); return; } } } // Must have an error error(); } void FitsFitsMap::processRelax() { char* here = mapdata_; size_t size = mapsize_; // simple check for fits file if (strncmp(mapdata_,"SIMPLE ",8) && strncmp(mapdata_,"XTENSION",8)) { error(); return; } // check to see if there is an image in the primary head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (head_->isValid() && head_->naxes() > 0 && head_->naxis(0) > 0 && head_->naxis(1) > 0) { found(here); return; } // ok, no image, save primary and lets check extensions here += head_->headbytes() + head_->databytes(); size -= head_->headbytes() + head_->databytes(); primary_ = head_; managePrimary_ = 1; head_ = NULL; while (size > 0) { head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (!head_->isValid()) { error(); return; } ext_++; // check for image if (head_->isImage()) { found(here); return; } // else, check for compressed image if (head_->isBinTable() && head_->find("ZIMAGE")) { found(here); return; } // else, check for bin table named STDEVT, EVENTS, RAYEVENT if (head_->isBinTable() && head_->extname()) { char* a = toUpper(head_->extname()); if (!strncmp("STDEVT", a, 6) || !strncmp("EVENTS", a, 6) || !strncmp("RAYEVENT", a, 8)) { delete [] a; found(here); return; } } // else, check for bin table with keyword PIXTYPE = 'HEALPIX ' if (head_->isBinTable() && head_->find("PIXTYPE") && (!strncmp(head_->getString("PIXTYPE"),"HEALPIX",4))) { found(here); return; } // else, check for bin table with keyword NSIDE (also HEALPIX) if (head_->isBinTable() && head_->find("NSIDE")) { found(here); return; } here += head_->headbytes() + head_->databytes(); size -= head_->headbytes() + head_->databytes(); delete head_; head_ = NULL; } // did not find anything, bail out error(); } FitsFitsNextMap::FitsFitsNextMap(FitsFile* p) { FitsMap* prev = (FitsMap*)p; primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = prev->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; pcoord_ = prev->pcoord(); pxvalid_ = prev->pxvalid(); pxmin_ = prev->pxmin(); pxmax_ = prev->pxmax(); pyvalid_ = prev->pyvalid(); pymin_ = prev->pymin(); pymax_ = prev->pymax(); pzvalid_ = prev->pzvalid(); pzmin_ = prev->pzmin(); pzmax_ = prev->pzmax(); pbvalid_ = prev->pbvalid(); pblock_ = prev->pblock(); mapdata_ = prev->mapdata(); mapsize_ = prev->mapsize(); return; } FitsArrMap::FitsArrMap() { if (!valid_) return; // reset valid_ = 0; // check to see if we have a nonzero width, height, and bitpix if (!validParams()) return; // check to see if dimensions equal mapped space if (((size_t)pWidth_*pHeight_*pDepth_*abs(pBitpix_)/8)+pSkip_ > mapsize_) return; // skip to start of data data_ = mapdata_ + pSkip_; dataSize_ = mapsize_; dataSkip_ = pSkip_; // new header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_); if (!head_->isValid()) return; // do we byteswap? setByteSwap(); // made it this far, must be valid valid_ = 1; } FitsNRRDMap::FitsNRRDMap() { if (!valid_) return; // reset valid_ = 0; // header { char buf[1024]; char* dptr = buf; char* sptr = mapdata_; int cnt =0; do { *dptr++ = *sptr++; if (cnt>0 && (*sptr == '\n' && *(sptr-1) == '\n')) { pSkip_ = cnt+2; break; } cnt++; } while (cnt<1024); *dptr = '\0'; string x(buf); istringstream str(x); parseNRRD(str); if (!valid_) return; // reset valid_ =0; } // check to see if we have a nonzero width, height, and bitpix if (!validParams()) return; // skip to start of data data_ = mapdata_ + pSkip_; dataSize_ = mapsize_; dataSkip_ = pSkip_; // new header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_); if (!head_->isValid()) return; // do we byteswap? setByteSwap(); // so far, so good valid_ = 1; } FitsMosaicMap::FitsMosaicMap() { if (!valid_) return; char* here = mapdata_; size_t size = mapsize_; // keep the primary header primary_ = new FitsHead(here, size, FitsHead::EXTERNAL); managePrimary_ = 1; if (!primary_->isValid()) { error(); return; } here += primary_->headbytes() + primary_->databytes(); size -= primary_->headbytes() + primary_->databytes(); // first extension head_ = new FitsHead(here, size, FitsHead::EXTERNAL); if (!head_->isValid()) { error(); return; } ext_++; found(here); } FitsMosaicNextMap::FitsMosaicNextMap(FitsFile* p) { FitsMap* prev = (FitsMap*)p; primary_ = prev->primary(); managePrimary_ = 0; ext_ = prev->ext(); mapdata_ = prev->enddata(); mapsize_ = prev->endsize(); head_ = new FitsHead(mapdata_, mapsize_, FitsHead::EXTERNAL); if (!head_->isValid()) { error(); return; } ext_++; found(mapdata_); } saods9/tksao1.0/fitsy++/map.h000644 000765 000000 00000002063 12464214754 016150 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsmap_h__ #define __fitsmap_h__ #include "file.h" class FitsMap : public FitsFile { protected: char* mapdata_; size_t mapsize_; public: FitsMap(); virtual ~FitsMap() {} char* mapdata() {return mapdata_;} size_t mapsize() {return mapsize_;} void found(char*); void error(); char* enddata(); size_t endsize(); }; class FitsFitsMap : public virtual FitsMap { protected: void processExact(); void processRelax(); public: FitsFitsMap(ScanMode); }; class FitsFitsNextMap : public FitsMap { public: FitsFitsNextMap(FitsFile* prev); }; class FitsArrMap : public virtual FitsMap { public: FitsArrMap(); }; class FitsNRRDMap : public virtual FitsMap { public: FitsNRRDMap(); }; class FitsMosaicMap : public virtual FitsMap { public: FitsMosaicMap(); }; class FitsMosaicNextMap : public FitsMap { public: FitsMosaicNextMap(FitsFile* prev); }; #endif saods9/tksao1.0/fitsy++/mapincr.C000644 000765 000000 00000030126 12612461721 016751 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "mapincr.h" #ifndef __WIN32 #include #include #include #include #include #include #include "head.h" //#define PAGELIMIT 1073741824 #define PAGELIMIT 536870912 FitsMapIncr::FitsMapIncr() { mapdata_ = NULL; mapsize_ = 0; page_ = 0; filesize_ = 0; seek_ = 0; dseek_ = 0; nseek_ = 0; } FitsMapIncr::~FitsMapIncr() { if (mapdata_>0) munmap((caddr_t)mapdata_, mapsize_); } FitsHead* FitsMapIncr::headRead() { // NOTE: the hdu cleans up after the hdu, // here we only clean up after the data segment // mmap will return valid if seek_ is at end of file, so check first if (filesize_-seek_<=0) return NULL; // read first BLOCK // seek_ needs to be an increment of getpagesize int pagesize = getpagesize(); off_t mmseek = (seek_/pagesize)*pagesize; size_t offset = seek_ - mmseek; int fd = open(pName_, O_RDONLY); size_t mmsize = offset+FTY_BLOCK; char* mmdata = (char*)mmap(NULL, mmsize, PROT_READ, MAP_SHARED, fd, mmseek); close(fd); // are we valid? if ((long)mmdata == -1) return NULL; // simple test if (strncmp(mmdata+offset,"SIMPLE ",8) && strncmp(mmdata+offset,"XTENSION",8)) { munmap((caddr_t)mmdata, mmsize); return NULL; } // can we find 'END'? while (mmsize-offset-FTY_BLOCK < filesize_-seek_) { if (findEnd(mmdata+mmsize-FTY_BLOCK)) break; // add another BLOCK munmap((caddr_t)mmdata, mmsize); fd = open(pName_, O_RDONLY); mmdata = (char*)mmap(NULL, mmsize+FTY_BLOCK, PROT_READ, MAP_SHARED, fd, mmseek); close(fd); // are we valid? if ((long)mmdata == -1) return NULL; mmsize += FTY_BLOCK; } // do we have a header? FitsHead* hd = new FitsHead(mmdata+offset, mmsize-offset, mmdata, mmsize, FitsHead::MMAP); if (!hd || !hd->isValid()) { delete hd; return NULL; } seek_ += mmsize-offset; // success! return hd; } void FitsMapIncr::dataSkip(size_t bytes) { seek_ += bytes; } void FitsMapIncr::dataSkipBlock(size_t blk) { seek_ += blk*FTY_BLOCK; } void FitsMapIncr::found() { // at this point we mmap the data segment // must find a page boundary int pagesize = getpagesize(); off_t mmseek = (seek_/pagesize)*pagesize; size_t offset = seek_ - mmseek; int fd = open(pName_, O_RDONLY); // determine internal page mode if (!head_->isTable() || !head_->isAsciiTable() || head_->isHeap()) { // no internal paging mapsize_ = head_->databytes()+offset; page_ = 0; } else { // if mapsize_ will exceed our inernal page limit, turn on internal paging if (head_->databytes()+offset > PAGELIMIT) { mapsize_ = PAGELIMIT; page_ = 1; dseek_ = seek_; nseek_ = seek_-offset; } else { // small enough, no internal paging mapsize_ = head_->databytes()+offset; page_ = 0; } } mapdata_ = (char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, fd, mmseek); close(fd); // are we valid? (we'd better be!) if ((long)mapdata_ == -1) { mapsize_ = 0; mapdata_ = NULL; error(); return; } // seek to next hdu, even if we are internal paging seek_ += head_->databytes(); // data starts after any page boundary data_ = mapdata_+offset; dataSize_ = mapsize_; dataSkip_ = 0; inherit_ = head_->inherit(); valid_ = 1; } char* FitsMapIncr::page(char* ptr, size_t row) { if (!page_) // no paging, just return return ptr; else { // be sure that at least 'row' bytes are still available if (ptr <= mapdata_+mapsize_-row) // no problem yet return ptr; else { // how far did we get nseek_ += ptr-mapdata_; // unmap the old segment munmap((caddr_t)mapdata_, mapsize_); // next mmap segment int pagesize = getpagesize(); off_t mmseek = (nseek_/pagesize)*pagesize; size_t offset = nseek_ - mmseek; int fd = open(pName_, O_RDONLY); // calc next internal page size if (head_->databytes()+offset-(nseek_-dseek_) > PAGELIMIT) mapsize_ = PAGELIMIT; else mapsize_ = head_->databytes()+offset-(nseek_-dseek_); mapdata_ =(char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, fd, mmseek); close(fd); // are we valid? (we'd better be!) if ((long)mapdata_ == -1) { //*** what to do here? internalError("Fitsy++ mapincr page() error"); mapsize_ = 0; mapdata_ = NULL; } nseek_ -= offset; return mapdata_+offset; } } } void FitsMapIncr::resetpage() { if (page_) { // ok, get a new page munmap((caddr_t)mapdata_, mapsize_); // remap original page int pagesize = getpagesize(); off_t mmseek = (dseek_/pagesize)*pagesize; size_t offset = dseek_ - mmseek; int fd = open(pName_, O_RDONLY); if (head_->databytes()+offset > PAGELIMIT) mapsize_ = PAGELIMIT; else mapsize_ = head_->databytes()+offset; mapdata_ =(char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, fd, mmseek); close(fd); // are we valid? (we'd better be!) if ((long)mapdata_ == -1) { //*** what to do here? internalError("Fitsy++ mapincr resetpage() error"); mapsize_ = 0; mapdata_ = NULL; } // reset, we may have moved in memory // found the data, save it nseek_ = dseek_-offset; data_ = mapdata_+offset; dataSize_ = mapsize_; dataSkip_ = offset; } } void FitsMapIncr::error() { if (manageHead_ && head_) delete head_; head_ = NULL; if (managePrimary_ && primary_) delete primary_; primary_ = NULL; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; valid_ = 0; } FitsFitsMapIncr::FitsFitsMapIncr(ScanMode mode) { if (!valid_) return; if (mode == EXACT || pExt_ || pIndex_>-1) processExact(); else processRelax(); } void FitsFitsMapIncr::processExact() { // simple check for fits file if (!(pExt_ || (pIndex_>0))) { // we are only looking for a primary image head_ = headRead(); if (head_ && head_->isValid()) { found(); return; } } else { // we are looking for an extension // keep the primary header primary_ = headRead(); managePrimary_ = 1; if (!(primary_ && primary_->isValid())) { error(); return; } dataSkipBlock(primary_->datablocks()); if (pExt_) { while (seek_ < filesize_) { head_ = headRead(); if (!(head_ && head_->isValid())) { error(); return; } ext_++; if (head_->extname()) { char* a = toUpper(head_->extname()); char* b = toUpper(pExt_); if (!strncmp(a,b,strlen(b))) { delete [] a; delete [] b; found(); return; } delete [] a; delete [] b; } dataSkipBlock(head_->datablocks()); delete head_; head_ = NULL; } } else { for (int i=1; iisValid())) { error(); return; } ext_++; dataSkipBlock(head_->datablocks()); delete head_; head_ = NULL; } head_ = headRead(); if (head_ && head_->isValid()) { ext_++; found(); return; } } } // Must have an error error(); } void FitsFitsMapIncr::processRelax() { // check to see if there is an image in the primary head_ = headRead(); if (!(head_ && head_->isValid())) { error(); return; } if (head_ && head_->isValid() && head_->naxes() > 0 && head_->naxis(0) > 0 && head_->naxis(1) > 0) { found(); return; } // ok, no image, save primary and lets check extensions primary_ = head_; managePrimary_ = 1; dataSkipBlock(head_->datablocks()); head_ = NULL; while (seek_ < filesize_) { head_ = headRead(); if (!(head_ && head_->isValid())) { error(); return; } ext_++; // check for image if (head_->isImage()) { found(); return; } // else, check for compressed image if (head_->isBinTable() && head_->find("ZIMAGE")) { found(); return; } // else, check for bin table named STDEVT, EVENTS, RAYEVENT if (head_->isBinTable() && head_->extname()) { char* a = toUpper(head_->extname()); if (!strncmp("STDEVT", a, 6) || !strncmp("EVENTS", a, 6) || !strncmp("RAYEVENT", a, 8)) { delete [] a; found(); return; } else delete [] a; } // else, check for bin table with keyword PIXTYPE = 'HEALPIX ' if (head_->isBinTable() && head_->find("PIXTYPE") && (!strncmp(head_->getString("PIXTYPE"),"HEALPIX",4))) { found(); return; } // else, check for bin table with keyword NSIDE (also HEALPIX) if (head_->isBinTable() && head_->find("NSIDE")) { found(); return; } dataSkipBlock(head_->datablocks()); delete head_; head_ = NULL; } // did not find anything, bail out error(); } FitsFitsNextMapIncr::FitsFitsNextMapIncr(FitsFile* p) { FitsMapIncr* prev = (FitsMapIncr*)p; primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = prev->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; pcoord_ = prev->pcoord(); pxvalid_ = prev->pxvalid(); pxmin_ = prev->pxmin(); pxmax_ = prev->pxmax(); pyvalid_ = prev->pyvalid(); pymin_ = prev->pymin(); pymax_ = prev->pymax(); pzvalid_ = prev->pzvalid(); pzmin_ = prev->pzmin(); pzmax_ = prev->pzmax(); pbvalid_ = prev->pbvalid(); pblock_ = prev->pblock(); filesize_ = prev->filesize(); seek_ = prev->seek(); return; } FitsArrMapIncr::FitsArrMapIncr() { if (!valid_) return; // reset valid_ = 0; // check to see if we have a nonzero width, height, and bitpix if (!validParams()) return; // check to see if dimensions equal mapped space size_t mmsize = ((size_t)pWidth_*pHeight_*pDepth_*abs(pBitpix_)/8) + pSkip_; if (mmsize > filesize_) return; // skip to start of data int fd = open(pName_, O_RDONLY); char* mmdata = (char*)mmap(NULL, mmsize, PROT_READ, MAP_SHARED, fd, 0); close(fd); // are we valid? if ((long)mmdata == -1) return; // new header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_, mmdata, mmsize, FitsHead::ALLOC); if (!head_->isValid()) return; seek_ = mmsize; data_ = mmdata + pSkip_; dataSize_ = mapsize_; dataSkip_ = pSkip_; // do we byteswap? setByteSwap(); // made it this far, must be valid valid_ = 1; } FitsMosaicMapIncr::FitsMosaicMapIncr() { if (!valid_) return; // keep the primary header primary_ = headRead(); managePrimary_ = 1; if (!(primary_ && primary_->isValid())) { error(); return; } dataSkipBlock(primary_->datablocks()); // first extension head_ = headRead(); if (!(head_ && head_->isValid())) { error(); return; } ext_++; found(); } FitsMosaicNextMapIncr::FitsMosaicNextMapIncr(FitsFile* p) { FitsMapIncr* prev = (FitsMapIncr*)p; pName_ = dupstr(prev->pName()); filesize_ = prev->filesize(); seek_ = prev->seek(); primary_ = prev->primary(); managePrimary_ = 0; ext_ = prev->ext(); head_ = headRead(); if (!(head_ && head_->isValid())) { error(); return; } ext_++; found(); } #else FitsMapIncr::FitsMapIncr() { mapdata_ = NULL; mapsize_ = 0; } FitsMapIncr::~FitsMapIncr() {} FitsHead* FitsMapIncr::headRead() {} void FitsMapIncr::dataSkip(size_t bytes) {} void FitsMapIncr::dataSkipBlock(size_t blk) {} void FitsMapIncr::found() {} char* FitsMapIncr::page(char* ptr, size_t row) { return NULL; } void FitsMapIncr::resetpage() {} void FitsMapIncr::error() {} FitsFitsMapIncr::FitsFitsMapIncr(ScanMode mode) {} void FitsFitsMapIncr::processExact() {} void FitsFitsMapIncr::processRelax() {} FitsFitsNextMapIncr::FitsFitsNextMapIncr(FitsFile* p) {} FitsArrMapIncr::FitsArrMapIncr() {} FitsMosaicMapIncr::FitsMosaicMapIncr() {} FitsMosaicNextMapIncr::FitsMosaicNextMapIncr(FitsFile* p) {} #endif saods9/tksao1.0/fitsy++/mapincr.h000644 000765 000000 00000002645 12464214754 017032 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsmapincr_h__ #define __fitsmapincr_h__ #include "file.h" class FitsMapIncr : public FitsFile { protected: char* mapdata_; // mmap segment ptr size_t mapsize_; // mmap segment size int page_; // flag to indicate paging mode size_t filesize_; // size of the total segment size_t seek_; // offset into segment size_t dseek_; // offset to data segment size_t nseek_; // offset into next page data segment FitsHead* headRead(); void dataSkip(size_t); void dataSkipBlock(size_t); void found(); void error(); public: FitsMapIncr(); virtual ~FitsMapIncr(); char* page(char*, size_t); void resetpage(); size_t filesize() {return filesize_;} size_t seek() {return seek_;} }; class FitsFitsMapIncr : public virtual FitsMapIncr { protected: void processExact(); void processRelax(); public: FitsFitsMapIncr(ScanMode); }; class FitsFitsNextMapIncr : public FitsMapIncr { public: FitsFitsNextMapIncr(FitsFile* prev); }; class FitsArrMapIncr : public virtual FitsMapIncr { public: FitsArrMapIncr(); }; class FitsMosaicMapIncr : public virtual FitsMapIncr { public: FitsMosaicMapIncr(); }; class FitsMosaicNextMapIncr : public FitsMapIncr { public: FitsMosaicNextMapIncr(FitsFile* prev); }; #endif saods9/tksao1.0/fitsy++/mmap.C000644 000765 000000 00000002164 12601043447 016252 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "mmap.h" #ifndef __WIN32 #include #include #include #include #include FitsMMap::FitsMMap(const char* fn) { // parse the fn and options parse(fn); if (!valid_) return; // reset valid_ = 0; if (!pName_) return; // Map the file. int file = open(pName_, O_RDONLY); if (file == -1) return; struct stat info; if (fstat(file, &info) < 0) return; // check to see if we have something, we may have a small array if (info.st_size <= 0) return; // map it mapsize_ = info.st_size; mapdata_ = (char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, file, 0); // close the file close(file); // are we valid? if ((long)mapdata_ == -1) return; // so far, so good valid_ = 1; } FitsMMap::~FitsMMap() { if (mapdata_>0) munmap((caddr_t)mapdata_, mapsize_); } #else FitsMMap::FitsMMap(const char* fn) {} FitsMMap::~FitsMMap() {} #endif saods9/tksao1.0/fitsy++/mmap.h000644 000765 000000 00000002216 12464214754 016325 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsmmap_h__ #define __fitsmmap_h__ #include "map.h" class FitsMMap : public virtual FitsMap { public: FitsMMap(const char*); virtual ~FitsMMap(); }; class FitsFitsMMap : public FitsMMap, public FitsFitsMap { public: FitsFitsMMap(const char* fn, ScanMode mode) : FitsMMap(fn), FitsFitsMap(mode) {} }; class FitsFitsNextMMap : public FitsFitsNextMap { public: FitsFitsNextMMap(FitsFile* prev) : FitsFitsNextMap(prev) {} }; class FitsArrMMap : public FitsMMap, public FitsArrMap { public: FitsArrMMap(const char* fn) : FitsMMap(fn), FitsArrMap() {} }; class FitsNRRDMMap : public FitsMMap, public FitsNRRDMap { public: FitsNRRDMMap(const char* fn) : FitsMMap(fn), FitsNRRDMap() {} }; class FitsMosaicMMap : public FitsMMap, public FitsMosaicMap { public: FitsMosaicMMap(const char* fn) : FitsMMap(fn), FitsMosaicMap() {} }; class FitsMosaicNextMMap : public FitsMosaicNextMap { public: FitsMosaicNextMMap(FitsFile* prev) : FitsMosaicNextMap(prev) {} }; #endif saods9/tksao1.0/fitsy++/mmapincr.C000644 000765 000000 00000001552 12601043560 017122 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "mmapincr.h" #ifndef __WIN32 #include #include #include #include #include FitsMMapIncr::FitsMMapIncr(const char* fn) { // parse the fn and options parse(fn); if (!valid_) return; // reset valid_ =0; if (!pName_) return; // Map the file. int fd = open(pName_, O_RDONLY); if (fd == -1) return; struct stat info; if (fstat(fd, &info) < 0) return; close(fd); // check to see if we have something, we may have a small array if (info.st_size <= 0) return; filesize_ = info.st_size; // so far, so good valid_ = 1; } #else FitsMMapIncr::FitsMMapIncr(const char* fn) {} #endif saods9/tksao1.0/fitsy++/mmapincr.h000644 000765 000000 00000002160 12464214754 017177 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsmmapincr_h__ #define __fitsmmapincr_h__ #include "mapincr.h" class FitsMMapIncr : public virtual FitsMapIncr { public: FitsMMapIncr(const char*); }; class FitsFitsMMapIncr : public FitsMMapIncr, public FitsFitsMapIncr { public: FitsFitsMMapIncr(const char* fn, ScanMode mode) : FitsMMapIncr(fn), FitsFitsMapIncr(mode) {} }; class FitsFitsNextMMapIncr : public FitsFitsNextMapIncr { public: FitsFitsNextMMapIncr(FitsFile* prev) : FitsFitsNextMapIncr(prev) {} }; class FitsArrMMapIncr : public FitsMMapIncr, public FitsArrMapIncr { public: FitsArrMMapIncr(const char* fn) : FitsMMapIncr(fn), FitsArrMapIncr() {} }; class FitsMosaicMMapIncr : public FitsMMapIncr, public FitsMosaicMapIncr { public: FitsMosaicMMapIncr(const char* fn) : FitsMMapIncr(fn), FitsMosaicMapIncr() {} }; class FitsMosaicNextMMapIncr : public FitsMosaicNextMapIncr { public: FitsMosaicNextMMapIncr(FitsFile* prev) : FitsMosaicNextMapIncr(prev) {} }; #endif saods9/tksao1.0/fitsy++/nrrd.C000644 000765 000000 00000003153 12464214754 016274 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "nrrd.h" #include "head.h" FitsNRRD::FitsNRRD(FitsFile* fits) { byteswap_ = fits->byteswap(); endian_ = fits->endian(); pBitpix_ = fits->pBitpix(); pWidth_ = fits->pWidth(); pHeight_ = fits->pHeight(); pDepth_ = fits->pDepth(); size_ = (size_t)pWidth_*pHeight_*pDepth_; } FitsNRRD::~FitsNRRD() { if (data_) delete [] (char*)data_; } int FitsNRRD::initHeader(FitsFile* fits) { // simple check if (!pWidth_ || !pHeight_ || !pBitpix_) return 0; // create header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_); if (!head_->isValid()) return 0; // other primary_ = fits->primary(); managePrimary_ = 0; inherit_ = head_->inherit(); return 1; } template FitsNRRDm::FitsNRRDm(FitsFile* fits) : FitsNRRD(fits) { } template void FitsNRRDm::uncompress(FitsFile* fits) { if (!initHeader(fits)) return; T* dest = new T[size_]; if (!dest) { internalError("Fitsy++ nrrd unable to allocate memory"); return; } memset(dest, 0, size_*sizeof(T)); compressed(dest, (char*)fits->data(), fits->dataSize()-fits->dataSkip()); data_ = dest; dataSize_ = size_; dataSkip_ = 0; // all done valid_ = 1; } template class FitsNRRDm; template class FitsNRRDm; template class FitsNRRDm; template class FitsNRRDm; template class FitsNRRDm; template class FitsNRRDm; template class FitsNRRDm; saods9/tksao1.0/fitsy++/nrrd.h000644 000765 000000 00000001205 12464214754 016335 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsnrrd_h__ #define __fitsnrrd_h__ #include "file.h" class FitsNRRD : public FitsFile { protected: size_t size_; protected: int initHeader(FitsFile*); public: FitsNRRD(FitsFile*); virtual ~FitsNRRD(); }; template class FitsNRRDm : public FitsNRRD { private: void swapBytes(FitsFile::ArchType); protected: void uncompress(FitsFile* fits); virtual int compressed(T*, char*, size_t) =0; public: FitsNRRDm(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/nrrdgzip.C000644 000765 000000 00000004271 12464214754 017170 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "nrrdgzip.h" #include "zlib.h" #include "util.h" template FitsNRRDGzipm::FitsNRRDGzipm(FitsFile* fits) : FitsNRRDm(fits) { FitsNRRDm::uncompress(fits); } template int FitsNRRDGzipm::compressed(T* dest, char* src, size_t sz) { z_stream zstrm; zstrm.zalloc = NULL; zstrm.zfree = NULL; zstrm.opaque = NULL; zstrm.avail_in = sz; zstrm.next_in = (Bytef*)src; zstrm.avail_out = this->size_*sizeof(T); zstrm.next_out = (Bytef*)dest; // look for both zlib and gzip headers if (inflateInit2(&zstrm, MAX_WBITS+32) != Z_OK) { internalError("Fitsy++ gzip inflateInit error"); return 0; } if (DebugCompress) cerr << " inflate START: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; int result = ::inflate(&zstrm, Z_FINISH); switch (result) { case Z_OK: if (DebugCompress) cerr << " inflate OK: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_STREAM_END: if (DebugCompress) cerr << " inflate STREAM_END: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << " total_in " << zstrm.total_in << " total_out " << zstrm.total_out << endl; break; case Z_BUF_ERROR: if (DebugCompress) cerr << " inflate BUF_ERROR: avail_in " << zstrm.avail_in << " avail_out " << zstrm.avail_out << endl; return 0; default: internalError("Fitsy++ gzip inflate error"); return 0; } inflateEnd(&zstrm); return 1; } template class FitsNRRDGzipm; template class FitsNRRDGzipm; template class FitsNRRDGzipm; template class FitsNRRDGzipm; template class FitsNRRDGzipm; template class FitsNRRDGzipm; template class FitsNRRDGzipm; saods9/tksao1.0/fitsy++/nrrdgzip.h000644 000765 000000 00000000620 12464214754 017227 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsnrrdgzip_h__ #define __fitsnrrdgzip_h__ #include "nrrd.h" template class FitsNRRDGzipm : public FitsNRRDm { private: int compressed(T*, char*, size_t); public: FitsNRRDGzipm(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/nrrdlex.C000644 000765 000000 00000212654 12553253014 017004 0ustar00joyewheel000000 000000 #line 2 "fitsy++/nrrdlex.C" #line 4 "fitsy++/nrrdlex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer nrrdFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *nrrdalloc (yy_size_t ); void *nrrdrealloc (void *,yy_size_t ); void nrrdfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 105 #define YY_END_OF_BUFFER 106 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[359] = { 0, 0, 0, 2, 2, 106, 104, 100, 103, 104, 104, 104, 95, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 104, 104, 2, 1, 100, 101, 0, 95, 97, 96, 95, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 58, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 4, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 102, 0, 98, 2, 0, 0, 0, 96, 99, 99, 63, 99, 99, 60, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 57, 29, 99, 99, 99, 99, 99, 69, 67, 99, 99, 99, 99, 5, 66, 99, 53, 99, 99, 99, 99, 99, 99, 99, 99, 54, 99, 99, 99, 99, 99, 99, 99, 96, 0, 97, 99, 82, 99, 74, 99, 89, 99, 22, 99, 11, 99, 99, 99, 99, 99, 99, 99, 12, 99, 59, 99, 99, 99, 23, 99, 99, 72, 99, 40, 85, 83, 90, 91, 99, 99, 99, 99, 99, 99, 99, 50, 71, 99, 55, 99, 19, 99, 37, 99, 99, 99, 99, 99, 56, 99, 49, 99, 61, 99, 99, 3, 99, 99, 99, 99, 99, 99, 47, 30, 35, 42, 0, 93, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 28, 99, 79, 13, 99, 99, 25, 99, 26, 99, 14, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 48, 99, 62, 0, 0, 0, 24, 92, 99, 64, 99, 99, 76, 70, 68, 16, 77, 20, 99, 99, 38, 0, 99, 99, 99, 99, 32, 99, 99, 99, 99, 99, 87, 65, 99, 99, 99, 94, 99, 31, 36, 43, 99, 99, 99, 99, 99, 99, 0, 27, 33, 45, 99, 99, 86, 84, 99, 75, 99, 99, 99, 99, 52, 73, 41, 6, 7, 8, 9, 10, 99, 80, 99, 39, 0, 0, 99, 21, 51, 99, 18, 99, 99, 99, 81, 34, 46, 99, 88, 15, 17, 99, 44, 78, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 6, 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, 14, 1, 1, 1, 1, 1, 1, 1, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 25, 32, 33, 34, 35, 25, 36, 37, 38, 39, 1, 40, 1, 1, 41, 1, 42, 43, 44, 45, 46, 47, 48, 49, 50, 25, 51, 52, 53, 54, 55, 56, 25, 57, 58, 59, 60, 25, 61, 62, 63, 64, 65, 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[67] = { 0, 1, 1, 2, 1, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1 } ; static yyconst flex_int16_t yy_base[367] = { 0, 0, 0, 1080, 1073, 1060, 1098, 1055, 1098, 1051, 1047, 60, 70, 80, 81, 91, 106, 89, 82, 85, 83, 96, 1046, 104, 135, 147, 149, 141, 158, 204, 176, 218, 69, 985, 0, 1098, 1047, 1098, 270, 166, 81, 137, 280, 1042, 322, 174, 152, 169, 201, 101, 199, 205, 210, 215, 160, 223, 290, 310, 295, 292, 244, 291, 305, 314, 296, 306, 340, 346, 318, 347, 352, 345, 350, 351, 360, 1040, 358, 197, 356, 355, 382, 362, 377, 353, 383, 386, 385, 390, 389, 405, 411, 1098, 979, 1098, 0, 1039, 1038, 457, 467, 434, 429, 1036, 408, 195, 1035, 430, 477, 479, 482, 483, 484, 485, 486, 487, 489, 491, 488, 497, 490, 493, 492, 1034, 441, 496, 505, 510, 506, 522, 513, 516, 544, 546, 518, 551, 1032, 547, 554, 1026, 548, 549, 553, 552, 555, 571, 561, 578, 1023, 563, 572, 567, 574, 587, 581, 591, 640, 649, 658, 668, 585, 593, 579, 87, 1022, 669, 1021, 670, 1013, 671, 672, 673, 674, 675, 676, 678, 1012, 677, 1011, 86, 239, 259, 98, 679, 680, 681, 682, 698, 1010, 1009, 1008, 1005, 257, 702, 707, 704, 724, 699, 723, 729, 1004, 732, 955, 734, 949, 735, 438, 736, 738, 739, 741, 740, 889, 749, 747, 753, 841, 758, 755, 840, 768, 760, 769, 794, 782, 801, 837, 265, 267, 269, 391, 771, 775, 777, 804, 805, 297, 780, 807, 810, 812, 811, 700, 823, 697, 694, 816, 819, 693, 418, 381, 610, 691, 814, 832, 815, 828, 846, 847, 848, 852, 845, 853, 857, 872, 850, 690, 876, 639, 576, 833, 850, 1098, 637, 882, 635, 883, 618, 634, 633, 630, 626, 881, 624, 895, 874, 521, 859, 621, 354, 907, 905, 623, 909, 913, 885, 908, 915, 495, 453, 893, 920, 922, 436, 925, 1098, 1098, 1098, 923, 934, 975, 939, 930, 932, 899, 1098, 921, 929, 966, 947, 431, 425, 954, 422, 972, 951, 970, 983, 417, 348, 315, 311, 303, 301, 299, 261, 985, 255, 989, 1098, 964, 967, 996, 237, 231, 997, 181, 998, 1000, 1002, 172, 1098, 1098, 991, 163, 161, 109, 1001, 94, 88, 1098, 1061, 1065, 1067, 1074, 1081, 1084, 1089, 1092 } ; static yyconst flex_int16_t yy_def[367] = { 0, 358, 1, 359, 359, 358, 358, 358, 358, 358, 360, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 362, 363, 358, 358, 358, 358, 360, 364, 364, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 362, 358, 363, 365, 366, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 358, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 358, 358, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 358, 358, 361, 361, 361, 361, 361, 361, 358, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 358, 358, 361, 361, 361, 361, 361, 361, 361, 361, 361, 358, 358, 361, 361, 361, 361, 361, 361, 361, 0, 358, 358, 358, 358, 358, 358, 358, 358 } ; static yyconst flex_int16_t yy_nxt[1165] = { 0, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 22, 28, 29, 30, 31, 22, 22, 22, 22, 32, 6, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 22, 28, 29, 30, 31, 22, 22, 22, 22, 33, 6, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 358, 358, 358, 358, 44, 358, 358, 358, 358, 358, 214, 358, 91, 225, 358, 96, 358, 62, 358, 47, 59, 358, 48, 60, 358, 51, 358, 45, 52, 358, 44, 46, 58, 49, 50, 53, 54, 91, 61, 63, 55, 96, 64, 62, 56, 47, 59, 48, 60, 103, 57, 51, 45, 228, 52, 358, 46, 58, 49, 50, 53, 358, 54, 61, 63, 65, 55, 358, 64, 358, 56, 95, 358, 66, 103, 57, 73, 68, 358, 67, 358, 358, 74, 358, 75, 69, 41, 76, 77, 358, 100, 65, 358, 70, 358, 71, 358, 95, 72, 66, 95, 358, 73, 68, 67, 101, 99, 74, 110, 75, 83, 69, 76, 84, 77, 358, 100, 358, 70, 358, 71, 358, 104, 72, 358, 358, 95, 85, 86, 160, 358, 101, 99, 110, 78, 358, 83, 105, 358, 84, 108, 79, 80, 358, 81, 102, 106, 137, 107, 82, 87, 358, 85, 86, 111, 160, 88, 358, 109, 358, 78, 89, 226, 105, 358, 90, 108, 79, 80, 81, 102, 106, 137, 107, 82, 358, 87, 358, 234, 358, 111, 358, 88, 109, 227, 358, 89, 358, 119, 358, 90, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 358, 358, 358, 119, 44, 358, 358, 358, 275, 358, 267, 358, 268, 358, 269, 358, 358, 116, 117, 120, 358, 358, 112, 118, 358, 358, 113, 124, 358, 123, 44, 97, 358, 98, 98, 98, 98, 98, 98, 98, 98, 98, 114, 116, 117, 120, 121, 112, 118, 115, 358, 113, 122, 124, 123, 358, 358, 358, 358, 128, 358, 358, 358, 358, 358, 358, 358, 114, 358, 315, 358, 121, 358, 125, 115, 130, 134, 122, 126, 127, 129, 132, 133, 135, 128, 131, 136, 358, 138, 139, 142, 358, 358, 358, 144, 358, 358, 143, 125, 358, 358, 130, 134, 126, 127, 129, 132, 133, 140, 135, 131, 145, 136, 138, 139, 358, 142, 148, 358, 144, 147, 358, 149, 143, 146, 141, 285, 358, 358, 270, 159, 284, 358, 150, 140, 358, 151, 145, 153, 358, 358, 358, 152, 148, 358, 147, 358, 149, 358, 146, 141, 358, 247, 177, 270, 178, 159, 248, 179, 150, 180, 151, 157, 358, 153, 161, 158, 152, 154, 154, 154, 154, 154, 154, 154, 154, 154, 358, 98, 98, 98, 98, 98, 98, 98, 98, 98, 358, 157, 358, 161, 158, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 166, 358, 358, 358, 162, 170, 168, 169, 171, 175, 174, 358, 358, 163, 164, 181, 358, 165, 172, 358, 167, 173, 358, 176, 358, 182, 166, 358, 358, 162, 183, 170, 168, 169, 171, 175, 174, 190, 163, 164, 184, 181, 165, 172, 185, 167, 186, 173, 176, 187, 358, 182, 358, 358, 358, 358, 183, 358, 358, 358, 358, 358, 312, 190, 188, 184, 189, 358, 191, 358, 185, 186, 197, 358, 187, 192, 193, 358, 358, 194, 358, 195, 196, 202, 358, 358, 198, 358, 203, 199, 188, 358, 189, 358, 191, 200, 201, 358, 197, 358, 192, 204, 193, 205, 194, 208, 195, 196, 206, 202, 303, 198, 213, 211, 203, 199, 358, 207, 286, 212, 200, 209, 201, 287, 358, 308, 204, 358, 205, 358, 358, 208, 358, 206, 314, 303, 358, 213, 211, 358, 358, 358, 207, 358, 212, 358, 209, 154, 154, 154, 154, 154, 154, 154, 154, 154, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 215, 216, 219, 210, 217, 223, 222, 358, 358, 220, 358, 358, 218, 221, 358, 358, 358, 358, 230, 358, 232, 358, 224, 229, 358, 231, 215, 216, 219, 210, 217, 223, 222, 235, 236, 220, 233, 218, 221, 238, 358, 358, 237, 230, 240, 232, 358, 224, 229, 358, 231, 358, 358, 358, 241, 358, 358, 358, 358, 235, 236, 233, 239, 243, 358, 238, 358, 244, 237, 240, 358, 245, 358, 242, 252, 358, 254, 358, 246, 251, 241, 249, 250, 253, 255, 358, 358, 239, 358, 243, 257, 256, 358, 244, 358, 259, 245, 358, 242, 358, 252, 258, 254, 246, 251, 262, 249, 250, 253, 263, 255, 358, 260, 261, 272, 257, 256, 265, 358, 271, 259, 358, 358, 276, 358, 264, 258, 358, 358, 358, 262, 358, 358, 358, 263, 273, 358, 260, 261, 272, 358, 266, 280, 265, 271, 358, 274, 288, 276, 358, 278, 264, 279, 281, 358, 277, 282, 358, 358, 283, 290, 273, 358, 358, 358, 358, 266, 358, 280, 358, 358, 274, 289, 288, 358, 278, 291, 279, 304, 281, 277, 282, 293, 294, 283, 290, 292, 295, 298, 358, 297, 358, 299, 358, 301, 305, 296, 289, 358, 358, 358, 291, 358, 304, 313, 311, 358, 300, 293, 294, 358, 292, 358, 295, 298, 297, 302, 306, 299, 301, 305, 296, 358, 307, 358, 358, 358, 309, 310, 313, 358, 311, 358, 300, 323, 320, 317, 358, 358, 358, 358, 302, 358, 306, 337, 316, 358, 358, 307, 358, 321, 358, 309, 318, 310, 322, 358, 319, 326, 323, 320, 324, 317, 325, 358, 327, 358, 328, 358, 337, 316, 358, 358, 338, 335, 321, 336, 341, 318, 334, 322, 339, 319, 358, 326, 342, 324, 358, 325, 358, 327, 344, 358, 328, 329, 330, 331, 332, 333, 335, 358, 336, 358, 341, 334, 343, 358, 340, 358, 349, 345, 342, 350, 358, 358, 358, 344, 358, 358, 358, 347, 358, 358, 346, 356, 358, 358, 358, 358, 358, 358, 343, 340, 348, 349, 345, 351, 350, 358, 358, 358, 352, 353, 358, 354, 357, 347, 355, 346, 358, 356, 358, 358, 358, 155, 97, 93, 358, 348, 358, 36, 351, 93, 358, 38, 37, 352, 353, 36, 354, 357, 358, 355, 34, 34, 34, 34, 34, 34, 34, 39, 39, 43, 43, 43, 43, 92, 35, 92, 92, 92, 92, 92, 94, 35, 94, 94, 94, 94, 94, 40, 358, 40, 154, 358, 154, 156, 358, 156, 5, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358 } ; static yyconst flex_int16_t yy_chk[1165] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 14, 18, 20, 12, 19, 177, 161, 357, 17, 161, 15, 32, 177, 356, 40, 21, 20, 180, 14, 18, 49, 14, 18, 23, 15, 16, 13, 15, 354, 12, 13, 17, 14, 14, 15, 16, 32, 19, 21, 16, 40, 23, 20, 16, 14, 18, 14, 18, 49, 16, 15, 13, 180, 15, 24, 13, 17, 14, 14, 15, 27, 16, 19, 21, 24, 16, 25, 23, 26, 16, 41, 46, 24, 49, 16, 27, 25, 28, 24, 54, 353, 27, 352, 27, 25, 39, 27, 28, 47, 46, 24, 348, 26, 45, 26, 30, 41, 26, 24, 39, 344, 27, 25, 24, 47, 45, 27, 54, 27, 30, 25, 27, 30, 28, 103, 46, 77, 26, 50, 26, 48, 50, 26, 29, 51, 39, 30, 30, 103, 52, 47, 45, 54, 29, 53, 30, 50, 31, 30, 52, 29, 29, 55, 29, 48, 51, 77, 51, 29, 31, 342, 30, 30, 55, 103, 31, 341, 53, 178, 29, 31, 178, 50, 60, 31, 52, 29, 29, 29, 48, 51, 77, 51, 29, 335, 31, 190, 190, 179, 55, 333, 31, 53, 179, 225, 31, 226, 60, 227, 31, 38, 38, 38, 38, 38, 38, 38, 38, 38, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 56, 61, 59, 60, 42, 58, 64, 234, 234, 332, 225, 331, 226, 330, 227, 62, 65, 58, 58, 61, 57, 329, 56, 59, 63, 328, 56, 65, 68, 64, 42, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 57, 58, 58, 61, 62, 56, 59, 57, 66, 56, 63, 65, 64, 71, 67, 69, 327, 68, 72, 73, 70, 83, 287, 79, 78, 57, 76, 287, 74, 62, 81, 66, 57, 70, 73, 63, 66, 67, 69, 71, 72, 74, 68, 70, 76, 82, 78, 79, 81, 248, 80, 84, 83, 86, 85, 82, 66, 88, 87, 70, 73, 66, 67, 69, 71, 72, 80, 74, 70, 84, 76, 78, 79, 89, 81, 87, 102, 83, 86, 90, 88, 82, 85, 80, 248, 326, 247, 228, 102, 247, 321, 89, 80, 319, 89, 84, 90, 100, 105, 318, 89, 87, 99, 86, 301, 88, 204, 85, 80, 122, 204, 122, 228, 122, 102, 204, 122, 89, 122, 89, 99, 297, 90, 105, 100, 89, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 106, 99, 107, 105, 100, 108, 109, 110, 111, 112, 113, 116, 114, 118, 115, 120, 119, 110, 296, 123, 117, 106, 114, 112, 113, 115, 119, 118, 124, 126, 107, 108, 123, 125, 109, 116, 128, 111, 117, 129, 120, 132, 124, 110, 284, 127, 106, 125, 114, 112, 113, 115, 119, 118, 132, 107, 108, 126, 123, 109, 116, 127, 111, 128, 117, 120, 129, 130, 124, 131, 135, 138, 139, 125, 133, 141, 140, 136, 142, 284, 132, 130, 126, 131, 144, 133, 147, 127, 128, 141, 149, 129, 135, 136, 143, 148, 138, 150, 139, 140, 147, 145, 160, 142, 152, 148, 143, 130, 158, 131, 151, 133, 144, 145, 153, 141, 159, 135, 149, 136, 150, 138, 152, 139, 140, 150, 147, 267, 142, 160, 158, 148, 143, 249, 151, 249, 159, 144, 153, 145, 249, 275, 275, 149, 286, 150, 290, 281, 152, 279, 150, 286, 267, 278, 160, 158, 277, 276, 273, 151, 271, 159, 266, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, 156, 156, 156, 156, 157, 163, 165, 167, 168, 169, 170, 171, 172, 175, 173, 181, 182, 183, 184, 163, 165, 169, 157, 167, 173, 172, 264, 250, 170, 246, 243, 168, 171, 242, 185, 195, 240, 182, 191, 184, 193, 175, 181, 192, 183, 163, 165, 169, 157, 167, 173, 172, 191, 192, 170, 185, 168, 171, 193, 196, 194, 192, 182, 195, 184, 197, 175, 181, 199, 183, 201, 203, 205, 196, 206, 207, 209, 208, 191, 192, 185, 194, 199, 212, 193, 211, 199, 192, 195, 213, 201, 216, 197, 208, 215, 211, 219, 203, 207, 196, 205, 206, 209, 211, 218, 220, 194, 229, 199, 213, 212, 230, 199, 231, 216, 201, 235, 197, 222, 208, 215, 211, 203, 207, 219, 205, 206, 209, 220, 211, 221, 218, 218, 231, 213, 212, 222, 223, 230, 216, 232, 233, 235, 236, 221, 215, 237, 239, 238, 219, 251, 253, 244, 220, 232, 245, 218, 218, 231, 241, 223, 239, 222, 230, 254, 233, 251, 235, 252, 237, 221, 238, 241, 224, 236, 244, 217, 214, 245, 253, 232, 259, 255, 256, 257, 223, 263, 239, 258, 260, 233, 252, 251, 261, 237, 254, 238, 268, 241, 236, 244, 256, 257, 245, 253, 255, 258, 260, 262, 259, 283, 261, 265, 263, 269, 258, 252, 280, 272, 274, 254, 293, 268, 285, 283, 210, 262, 256, 257, 298, 255, 282, 258, 260, 259, 265, 272, 261, 263, 269, 258, 289, 274, 288, 294, 291, 280, 282, 285, 292, 283, 295, 262, 298, 293, 289, 299, 314, 300, 306, 265, 302, 272, 312, 288, 315, 310, 274, 311, 294, 307, 280, 291, 282, 295, 309, 292, 302, 298, 293, 299, 289, 300, 317, 306, 202, 307, 323, 312, 288, 320, 200, 314, 310, 294, 311, 317, 291, 309, 295, 315, 292, 316, 302, 320, 299, 324, 300, 322, 306, 323, 308, 307, 308, 308, 308, 308, 308, 310, 325, 311, 334, 317, 309, 322, 336, 316, 351, 338, 324, 320, 339, 340, 343, 345, 323, 346, 355, 347, 334, 198, 189, 325, 351, 188, 187, 186, 176, 174, 166, 322, 316, 336, 338, 324, 340, 339, 164, 162, 146, 343, 345, 137, 346, 355, 334, 347, 325, 134, 351, 121, 104, 101, 96, 95, 92, 75, 336, 43, 36, 340, 33, 22, 10, 9, 343, 345, 7, 346, 355, 5, 347, 359, 359, 359, 359, 359, 359, 359, 360, 360, 361, 361, 361, 361, 362, 4, 362, 362, 362, 362, 362, 363, 3, 363, 363, 363, 363, 363, 364, 0, 364, 365, 0, 365, 366, 0, 366, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "fitsy++/nrrdlex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 11 "fitsy++/nrrdlex.L" #include #include #include #include "util.h" #include "nrrdparser.H" extern YYSTYPE* nrrdlval; extern nrrdFlexLexer* nrrdlexx; /* rules */ #line 799 "fitsy++/nrrdlex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 29 "fitsy++/nrrdlex.L" #line 903 "fitsy++/nrrdlex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 359 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 358 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 31 "fitsy++/nrrdlex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(nrrdlval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 38 "fitsy++/nrrdlex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(NRRDPARSERSIZE-1) ? yyleng:(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext,ll); nrrdlval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 46 "fitsy++/nrrdlex.L" {return DEBUG_;} YY_BREAK case 4: YY_RULE_SETUP #line 47 "fitsy++/nrrdlex.L" {return ON_;} YY_BREAK case 5: YY_RULE_SETUP #line 48 "fitsy++/nrrdlex.L" {return OFF_;} YY_BREAK case 6: YY_RULE_SETUP #line 50 "fitsy++/nrrdlex.L" {return NRRD0001_;} YY_BREAK case 7: YY_RULE_SETUP #line 51 "fitsy++/nrrdlex.L" {return NRRD0002_;} YY_BREAK case 8: YY_RULE_SETUP #line 52 "fitsy++/nrrdlex.L" {return NRRD0003_;} YY_BREAK case 9: YY_RULE_SETUP #line 53 "fitsy++/nrrdlex.L" {return NRRD0004_;} YY_BREAK case 10: YY_RULE_SETUP #line 54 "fitsy++/nrrdlex.L" {return NRRD0005_;} YY_BREAK case 11: YY_RULE_SETUP #line 56 "fitsy++/nrrdlex.L" {return DATA_;} YY_BREAK case 12: YY_RULE_SETUP #line 57 "fitsy++/nrrdlex.L" {return FILE_;} YY_BREAK case 13: YY_RULE_SETUP #line 59 "fitsy++/nrrdlex.L" {return SPACE_;} YY_BREAK case 14: YY_RULE_SETUP #line 60 "fitsy++/nrrdlex.L" {return UNITS_;} YY_BREAK case 15: YY_RULE_SETUP #line 61 "fitsy++/nrrdlex.L" {return DIMENSIONS_;} YY_BREAK case 16: YY_RULE_SETUP #line 62 "fitsy++/nrrdlex.L" {return ORIGIN_;} YY_BREAK case 17: YY_RULE_SETUP #line 63 "fitsy++/nrrdlex.L" {return DIRECTIONS_;} YY_BREAK case 18: YY_RULE_SETUP #line 65 "fitsy++/nrrdlex.L" {return DIMENSION_;} YY_BREAK case 19: YY_RULE_SETUP #line 67 "fitsy++/nrrdlex.L" {return TYPE_;} YY_BREAK case 20: YY_RULE_SETUP #line 68 "fitsy++/nrrdlex.L" {return SIGNED_;} YY_BREAK case 21: YY_RULE_SETUP #line 69 "fitsy++/nrrdlex.L" {return UNSIGNED_;} YY_BREAK case 22: YY_RULE_SETUP #line 70 "fitsy++/nrrdlex.L" {return CHAR_;} YY_BREAK case 23: YY_RULE_SETUP #line 71 "fitsy++/nrrdlex.L" {return INT8_;} YY_BREAK case 24: YY_RULE_SETUP #line 72 "fitsy++/nrrdlex.L" {return INT8_T_;} YY_BREAK case 25: YY_RULE_SETUP #line 73 "fitsy++/nrrdlex.L" {return UCHAR_;} YY_BREAK case 26: YY_RULE_SETUP #line 74 "fitsy++/nrrdlex.L" {return UINT8_;} YY_BREAK case 27: YY_RULE_SETUP #line 75 "fitsy++/nrrdlex.L" {return UINT8_T_;} YY_BREAK case 28: YY_RULE_SETUP #line 76 "fitsy++/nrrdlex.L" {return SHORT_;} YY_BREAK case 29: YY_RULE_SETUP #line 77 "fitsy++/nrrdlex.L" {return INT_;} YY_BREAK case 30: YY_RULE_SETUP #line 78 "fitsy++/nrrdlex.L" {return INT16_;} YY_BREAK case 31: YY_RULE_SETUP #line 79 "fitsy++/nrrdlex.L" {return INT16_T_;} YY_BREAK case 32: YY_RULE_SETUP #line 80 "fitsy++/nrrdlex.L" {return USHORT_;} YY_BREAK case 33: YY_RULE_SETUP #line 81 "fitsy++/nrrdlex.L" {return UINT16_;} YY_BREAK case 34: YY_RULE_SETUP #line 82 "fitsy++/nrrdlex.L" {return UINT16_T_;} YY_BREAK case 35: YY_RULE_SETUP #line 83 "fitsy++/nrrdlex.L" {return INT32_;} YY_BREAK case 36: YY_RULE_SETUP #line 84 "fitsy++/nrrdlex.L" {return INT32_T_;} YY_BREAK case 37: YY_RULE_SETUP #line 85 "fitsy++/nrrdlex.L" {return UINT_;} YY_BREAK case 38: YY_RULE_SETUP #line 86 "fitsy++/nrrdlex.L" {return UINT32_;} YY_BREAK case 39: YY_RULE_SETUP #line 87 "fitsy++/nrrdlex.L" {return UINT32_T_;} YY_BREAK case 40: YY_RULE_SETUP #line 88 "fitsy++/nrrdlex.L" {return LONG_;} YY_BREAK case 41: YY_RULE_SETUP #line 89 "fitsy++/nrrdlex.L" {return LONGLONG_;} YY_BREAK case 42: YY_RULE_SETUP #line 90 "fitsy++/nrrdlex.L" {return INT64_;} YY_BREAK case 43: YY_RULE_SETUP #line 91 "fitsy++/nrrdlex.L" {return INT64_T_;} YY_BREAK case 44: YY_RULE_SETUP #line 92 "fitsy++/nrrdlex.L" {return ULONGLONG_;} YY_BREAK case 45: YY_RULE_SETUP #line 93 "fitsy++/nrrdlex.L" {return UINT64_;} YY_BREAK case 46: YY_RULE_SETUP #line 94 "fitsy++/nrrdlex.L" {return UINT64_T_;} YY_BREAK case 47: YY_RULE_SETUP #line 95 "fitsy++/nrrdlex.L" {return FLOAT_;} YY_BREAK case 48: YY_RULE_SETUP #line 96 "fitsy++/nrrdlex.L" {return DOUBLE_;} YY_BREAK case 49: YY_RULE_SETUP #line 98 "fitsy++/nrrdlex.L" {return BLOCK_;} YY_BREAK case 50: YY_RULE_SETUP #line 99 "fitsy++/nrrdlex.L" {return SIZE_;} YY_BREAK case 51: YY_RULE_SETUP #line 100 "fitsy++/nrrdlex.L" {return BLOCKSIZE_;} YY_BREAK case 52: YY_RULE_SETUP #line 102 "fitsy++/nrrdlex.L" {return ENCODING_;} YY_BREAK case 53: YY_RULE_SETUP #line 103 "fitsy++/nrrdlex.L" {return RAW_;} YY_BREAK case 54: YY_RULE_SETUP #line 104 "fitsy++/nrrdlex.L" {return TXT_;} YY_BREAK case 55: YY_RULE_SETUP #line 105 "fitsy++/nrrdlex.L" {return TEXT_;} YY_BREAK case 56: YY_RULE_SETUP #line 106 "fitsy++/nrrdlex.L" {return ASCII_;} YY_BREAK case 57: YY_RULE_SETUP #line 107 "fitsy++/nrrdlex.L" {return HEX_;} YY_BREAK case 58: YY_RULE_SETUP #line 108 "fitsy++/nrrdlex.L" {return GZ_;} YY_BREAK case 59: YY_RULE_SETUP #line 109 "fitsy++/nrrdlex.L" {return GZIP_;} YY_BREAK case 60: YY_RULE_SETUP #line 110 "fitsy++/nrrdlex.L" {return BZ2_;} YY_BREAK case 61: YY_RULE_SETUP #line 111 "fitsy++/nrrdlex.L" {return BZIP2_;} YY_BREAK case 62: YY_RULE_SETUP #line 113 "fitsy++/nrrdlex.L" {return ENDIAN_;} YY_BREAK case 63: YY_RULE_SETUP #line 114 "fitsy++/nrrdlex.L" {return BIG_;} YY_BREAK case 64: YY_RULE_SETUP #line 115 "fitsy++/nrrdlex.L" {return LITTLE_;} YY_BREAK case 65: YY_RULE_SETUP #line 117 "fitsy++/nrrdlex.L" {return CONTENT_;} YY_BREAK case 66: YY_RULE_SETUP #line 119 "fitsy++/nrrdlex.L" {return OLD_;} YY_BREAK case 67: YY_RULE_SETUP #line 120 "fitsy++/nrrdlex.L" {return MIN_;} YY_BREAK case 68: YY_RULE_SETUP #line 121 "fitsy++/nrrdlex.L" {return OLDMIN_;} YY_BREAK case 69: YY_RULE_SETUP #line 122 "fitsy++/nrrdlex.L" {return MAX_;} YY_BREAK case 70: YY_RULE_SETUP #line 123 "fitsy++/nrrdlex.L" {return OLDMAX_;} YY_BREAK case 71: YY_RULE_SETUP #line 125 "fitsy++/nrrdlex.L" {return SKIP_;} YY_BREAK case 72: YY_RULE_SETUP #line 126 "fitsy++/nrrdlex.L" {return LINE_;} YY_BREAK case 73: YY_RULE_SETUP #line 127 "fitsy++/nrrdlex.L" {return LINESKIP_;} YY_BREAK case 74: YY_RULE_SETUP #line 128 "fitsy++/nrrdlex.L" {return BYTE_;} YY_BREAK case 75: YY_RULE_SETUP #line 129 "fitsy++/nrrdlex.L" {return BYTESKIP_;} YY_BREAK case 76: YY_RULE_SETUP #line 131 "fitsy++/nrrdlex.L" {return NUMBER_;} YY_BREAK case 77: YY_RULE_SETUP #line 133 "fitsy++/nrrdlex.L" {return SAMPLE_;} YY_BREAK case 78: YY_RULE_SETUP #line 134 "fitsy++/nrrdlex.L" {return SAMPLEUNITS_;} YY_BREAK case 79: YY_RULE_SETUP #line 136 "fitsy++/nrrdlex.L" {return SIZES_;} YY_BREAK case 80: YY_RULE_SETUP #line 137 "fitsy++/nrrdlex.L" {return SPACINGS_;} YY_BREAK case 81: YY_RULE_SETUP #line 138 "fitsy++/nrrdlex.L" {return THICKNESSES_;} YY_BREAK case 82: YY_RULE_SETUP #line 139 "fitsy++/nrrdlex.L" {return AXIS_;} YY_BREAK case 83: YY_RULE_SETUP #line 140 "fitsy++/nrrdlex.L" {return MINS_;} YY_BREAK case 84: YY_RULE_SETUP #line 141 "fitsy++/nrrdlex.L" {return AXISMINS_;} YY_BREAK case 85: YY_RULE_SETUP #line 142 "fitsy++/nrrdlex.L" {return MAXS_;} YY_BREAK case 86: YY_RULE_SETUP #line 143 "fitsy++/nrrdlex.L" {return AXISMAXS_;} YY_BREAK case 87: YY_RULE_SETUP #line 144 "fitsy++/nrrdlex.L" {return CENTERS_;} YY_BREAK case 88: YY_RULE_SETUP #line 145 "fitsy++/nrrdlex.L" {return CENTERINGS_;} YY_BREAK case 89: YY_RULE_SETUP #line 146 "fitsy++/nrrdlex.L" {return CELL_;} YY_BREAK case 90: YY_RULE_SETUP #line 147 "fitsy++/nrrdlex.L" {return NODE_;} YY_BREAK case 91: YY_RULE_SETUP #line 148 "fitsy++/nrrdlex.L" {return NONE_;} YY_BREAK case 92: YY_RULE_SETUP #line 149 "fitsy++/nrrdlex.L" {return LABELS_;} YY_BREAK case 93: YY_RULE_SETUP #line 150 "fitsy++/nrrdlex.L" {return KINDS_;} YY_BREAK case 94: YY_RULE_SETUP #line 151 "fitsy++/nrrdlex.L" {return DOMAINS_;} YY_BREAK case 95: YY_RULE_SETUP #line 153 "fitsy++/nrrdlex.L" { // Integer nrrdlval->integer = atoi(yytext); return INT; } YY_BREAK case 96: #line 159 "fitsy++/nrrdlex.L" case 97: YY_RULE_SETUP #line 159 "fitsy++/nrrdlex.L" { // Real Number nrrdlval->real = atof(yytext); return REAL; } YY_BREAK case 98: YY_RULE_SETUP #line 165 "fitsy++/nrrdlex.L" { // Quoted String int ll = (yyleng-2)<(NRRDPARSERSIZE-1) ? (yyleng-2):(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext+1,ll); // skip the '{' nrrdlval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 99: YY_RULE_SETUP #line 172 "fitsy++/nrrdlex.L" { // General String int ll = yyleng <(NRRDPARSERSIZE-1) ? yyleng:(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext,ll); nrrdlval->str[ll] = '\0'; return STRING; } YY_BREAK case 100: YY_RULE_SETUP #line 179 "fitsy++/nrrdlex.L" { // White Spaces } YY_BREAK case 101: /* rule 101 can match eol */ YY_RULE_SETUP #line 182 "fitsy++/nrrdlex.L" { // windows line feed return '\n'; } YY_BREAK case 102: YY_RULE_SETUP #line 186 "fitsy++/nrrdlex.L" { // fake line feed return '\n'; } YY_BREAK case 103: /* rule 103 can match eol */ YY_RULE_SETUP #line 190 "fitsy++/nrrdlex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 194 "fitsy++/nrrdlex.L" { // eof return EOF_; } YY_BREAK case 104: YY_RULE_SETUP #line 198 "fitsy++/nrrdlex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 105: YY_RULE_SETUP #line 202 "fitsy++/nrrdlex.L" ECHO; YY_BREAK #line 1550 "fitsy++/nrrdlex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; nrrdfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); nrrdfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ nrrdrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) nrrdrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 359 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 359 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 358); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) nrrdalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) nrrdalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) nrrdfree((void *) b->yy_ch_buf ); nrrdfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)nrrdalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)nrrdrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) nrrdalloc(new_size ); else (yy_start_stack) = (int *) nrrdrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *nrrdalloc (yy_size_t size ) { return (void *) malloc( size ); } void *nrrdrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void nrrdfree (void * ptr ) { free( (char *) ptr ); /* see nrrdrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 202 "fitsy++/nrrdlex.L" void nrrdDiscard(int doit) { if (nrrdlexx) nrrdlexx->begin(DISCARD, doit); } void nrrdFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/nrrdlex.L000644 000765 000000 00000012005 12464230772 017010 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "util.h" #include "nrrdparser.H" extern YYSTYPE* nrrdlval; extern nrrdFlexLexer* nrrdlexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(nrrdlval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(NRRDPARSERSIZE-1) ? yyleng:(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext,ll); nrrdlval->str[ll] = '\0'; return STRING; } debug {return DEBUG_;} on {return ON_;} off {return OFF_;} NRRD0001 {return NRRD0001_;} NRRD0002 {return NRRD0002_;} NRRD0003 {return NRRD0003_;} NRRD0004 {return NRRD0004_;} NRRD0005 {return NRRD0005_;} data {return DATA_;} file {return FILE_;} space {return SPACE_;} units {return UNITS_;} dimentions {return DIMENSIONS_;} origin {return ORIGIN_;} directions {return DIRECTIONS_;} dimension {return DIMENSION_;} type {return TYPE_;} signed {return SIGNED_;} unsigned {return UNSIGNED_;} char {return CHAR_;} int8 {return INT8_;} int8_t {return INT8_T_;} uchar {return UCHAR_;} uint8 {return UINT8_;} uint8_t {return UINT8_T_;} short {return SHORT_;} int {return INT_;} int16 {return INT16_;} int16_t {return INT16_T_;} ushort {return USHORT_;} unint16 {return UINT16_;} unint16_t {return UINT16_T_;} int32 {return INT32_;} int32_t {return INT32_T_;} uint {return UINT_;} uint32 {return UINT32_;} uint32_t {return UINT32_T_;} long {return LONG_;} longlong {return LONGLONG_;} int64 {return INT64_;} int64_t {return INT64_T_;} unlonglong {return ULONGLONG_;} unint64 {return UINT64_;} unint64_t {return UINT64_T_;} float {return FLOAT_;} double {return DOUBLE_;} block {return BLOCK_;} size {return SIZE_;} blocksize {return BLOCKSIZE_;} encoding {return ENCODING_;} raw {return RAW_;} txt {return TXT_;} text {return TEXT_;} ascii {return ASCII_;} hex {return HEX_;} gz {return GZ_;} gzip {return GZIP_;} bz2 {return BZ2_;} bzip2 {return BZIP2_;} endian {return ENDIAN_;} big {return BIG_;} little {return LITTLE_;} content {return CONTENT_;} old {return OLD_;} min {return MIN_;} oldmin {return OLDMIN_;} max {return MAX_;} oldmax {return OLDMAX_;} skip {return SKIP_;} line {return LINE_;} lineskip {return LINESKIP_;} byte {return BYTE_;} byteskip {return BYTESKIP_;} number {return NUMBER_;} sample {return SAMPLE_;} sampleunits {return SAMPLEUNITS_;} sizes {return SIZES_;} spacings {return SPACINGS_;} thickness {return THICKNESSES_;} axis {return AXIS_;} mins {return MINS_;} axismins {return AXISMINS_;} maxs {return MAXS_;} axismaxs {return AXISMAXS_;} centers {return CENTERS_;} centerings {return CENTERINGS_;} cell {return CELL_;} node {return NODE_;} none {return NONE_;} labels {return LABELS_;} kinds {return KINDS_;} domains {return DOMAINS_;} [+-]?{D}+ { // Integer nrrdlval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number nrrdlval->real = atof(yytext); return REAL; } \{[^\}\n]*\} { // Quoted String int ll = (yyleng-2)<(NRRDPARSERSIZE-1) ? (yyleng-2):(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext+1,ll); // skip the '{' nrrdlval->str[ll] = '\0'; // Remove the '}' return STRING; } [0-9A-Za-z]+ { // General String int ll = yyleng <(NRRDPARSERSIZE-1) ? yyleng:(NRRDPARSERSIZE-1); strncpy(nrrdlval->str,yytext,ll); nrrdlval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \\n { // fake line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return yytext[0]; } %% void nrrdDiscard(int doit) { if (nrrdlexx) nrrdlexx->begin(DISCARD, doit); } void nrrdFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/fitsy++/nrrdparser.C000644 000765 000000 00000203706 12553253014 017506 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse nrrdparse #define yylex nrrdlex #define yyerror nrrderror #define yylval nrrdlval #define yychar nrrdchar #define yydebug nrrddebug #define yynerrs nrrdnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { EOF_ = 258, INT = 259, REAL = 260, STRING = 261, DEBUG_ = 262, ON_ = 263, OFF_ = 264, NRRD0001_ = 265, NRRD0002_ = 266, NRRD0003_ = 267, NRRD0004_ = 268, NRRD0005_ = 269, DATA_ = 270, FILE_ = 271, SPACE_ = 272, UNITS_ = 273, DIMENSIONS_ = 274, ORIGIN_ = 275, DIRECTIONS_ = 276, DIMENSION_ = 277, TYPE_ = 278, SIGNED_ = 279, UNSIGNED_ = 280, CHAR_ = 281, INT8_ = 282, INT8_T_ = 283, UCHAR_ = 284, UINT8_ = 285, UINT8_T_ = 286, SHORT_ = 287, INT_ = 288, INT16_ = 289, INT16_T_ = 290, USHORT_ = 291, UINT16_ = 292, UINT16_T_ = 293, INT32_ = 294, INT32_T_ = 295, UINT_ = 296, UINT32_ = 297, UINT32_T_ = 298, LONG_ = 299, LONGLONG_ = 300, INT64_ = 301, INT64_T_ = 302, ULONGLONG_ = 303, UINT64_ = 304, UINT64_T_ = 305, FLOAT_ = 306, DOUBLE_ = 307, BLOCK_ = 308, SIZE_ = 309, BLOCKSIZE_ = 310, ENCODING_ = 311, RAW_ = 312, TXT_ = 313, TEXT_ = 314, ASCII_ = 315, HEX_ = 316, GZ_ = 317, GZIP_ = 318, BZ2_ = 319, BZIP2_ = 320, ENDIAN_ = 321, BIG_ = 322, LITTLE_ = 323, CONTENT_ = 324, OLD_ = 325, MIN_ = 326, OLDMIN_ = 327, MAX_ = 328, OLDMAX_ = 329, SKIP_ = 330, LINE_ = 331, LINESKIP_ = 332, BYTE_ = 333, BYTESKIP_ = 334, NUMBER_ = 335, SAMPLE_ = 336, SAMPLEUNITS_ = 337, SIZES_ = 338, SPACINGS_ = 339, THICKNESSES_ = 340, AXIS_ = 341, MINS_ = 342, AXISMINS_ = 343, MAXS_ = 344, AXISMAXS_ = 345, CENTERS_ = 346, CENTERINGS_ = 347, CELL_ = 348, NODE_ = 349, NONE_ = 350, LABELS_ = 351, KINDS_ = 352, DOMAINS_ = 353 }; #endif /* Tokens. */ #define EOF_ 258 #define INT 259 #define REAL 260 #define STRING 261 #define DEBUG_ 262 #define ON_ 263 #define OFF_ 264 #define NRRD0001_ 265 #define NRRD0002_ 266 #define NRRD0003_ 267 #define NRRD0004_ 268 #define NRRD0005_ 269 #define DATA_ 270 #define FILE_ 271 #define SPACE_ 272 #define UNITS_ 273 #define DIMENSIONS_ 274 #define ORIGIN_ 275 #define DIRECTIONS_ 276 #define DIMENSION_ 277 #define TYPE_ 278 #define SIGNED_ 279 #define UNSIGNED_ 280 #define CHAR_ 281 #define INT8_ 282 #define INT8_T_ 283 #define UCHAR_ 284 #define UINT8_ 285 #define UINT8_T_ 286 #define SHORT_ 287 #define INT_ 288 #define INT16_ 289 #define INT16_T_ 290 #define USHORT_ 291 #define UINT16_ 292 #define UINT16_T_ 293 #define INT32_ 294 #define INT32_T_ 295 #define UINT_ 296 #define UINT32_ 297 #define UINT32_T_ 298 #define LONG_ 299 #define LONGLONG_ 300 #define INT64_ 301 #define INT64_T_ 302 #define ULONGLONG_ 303 #define UINT64_ 304 #define UINT64_T_ 305 #define FLOAT_ 306 #define DOUBLE_ 307 #define BLOCK_ 308 #define SIZE_ 309 #define BLOCKSIZE_ 310 #define ENCODING_ 311 #define RAW_ 312 #define TXT_ 313 #define TEXT_ 314 #define ASCII_ 315 #define HEX_ 316 #define GZ_ 317 #define GZIP_ 318 #define BZ2_ 319 #define BZIP2_ 320 #define ENDIAN_ 321 #define BIG_ 322 #define LITTLE_ 323 #define CONTENT_ 324 #define OLD_ 325 #define MIN_ 326 #define OLDMIN_ 327 #define MAX_ 328 #define OLDMAX_ 329 #define SKIP_ 330 #define LINE_ 331 #define LINESKIP_ 332 #define BYTE_ 333 #define BYTESKIP_ 334 #define NUMBER_ 335 #define SAMPLE_ 336 #define SAMPLEUNITS_ 337 #define SIZES_ 338 #define SPACINGS_ 339 #define THICKNESSES_ 340 #define AXIS_ 341 #define MINS_ 342 #define AXISMINS_ 343 #define MAXS_ 344 #define AXISMAXS_ 345 #define CENTERS_ 346 #define CENTERINGS_ 347 #define CELL_ 348 #define NODE_ 349 #define NONE_ 350 #define LABELS_ 351 #define KINDS_ 352 #define DOMAINS_ 353 /* Copy the first part of user declarations. */ #line 10 "fitsy++/nrrdparser.Y" #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; nrrdDiscard(x);} #include "file.h" #undef yyFlexLexer #define yyFlexLexer nrrdFlexLexer #include extern int nrrdlex(void*, nrrdFlexLexer*); extern void nrrderror(FitsFile*, nrrdFlexLexer*, const char*); extern void nrrdDiscard(int); int dim; /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "fitsy++/nrrdparser.Y" { #define NRRDPARSERSIZE 256 float real; int integer; char str[NRRDPARSERSIZE]; } /* Line 193 of yacc.c. */ #line 326 "fitsy++/nrrdparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 339 "fitsy++/nrrdparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 245 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 102 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 44 /* YYNRULES -- Number of rules. */ #define YYNRULES 152 /* YYNRULES -- Number of states. */ #define YYNSTATES 240 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 353 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 101, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 100, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 99, 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, 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, 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, 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, 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, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 4, 7, 11, 14, 15, 18, 20, 22, 27, 30, 34, 38, 40, 44, 48, 49, 54, 58, 62, 64, 66, 68, 70, 74, 78, 82, 86, 91, 95, 100, 104, 108, 112, 116, 120, 124, 126, 128, 130, 132, 134, 135, 139, 141, 143, 145, 147, 149, 151, 152, 156, 160, 161, 166, 167, 172, 173, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 205, 207, 209, 211, 214, 216, 218, 220, 223, 226, 230, 232, 234, 236, 239, 243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 265, 267, 270, 274, 278, 283, 285, 287, 289, 293, 298, 300, 302, 307, 311, 313, 315, 317, 319, 321, 323, 325, 327, 329, 331, 333, 338, 342, 347, 351, 356, 360, 365, 369, 372, 374, 376, 379, 381, 384, 386, 389, 391, 394, 396, 399, 401, 403, 405, 407, 410, 412, 415, 417, 420 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 103, 0, -1, -1, 104, 105, -1, 105, 106, 111, -1, 106, 111, -1, -1, 7, 113, -1, 108, -1, 109, -1, 15, 16, 99, 6, -1, 17, 114, -1, 22, 99, 4, -1, 23, 99, 119, -1, 128, -1, 56, 99, 129, -1, 66, 99, 130, -1, -1, 69, 99, 107, 6, -1, 71, 99, 112, -1, 73, 99, 112, -1, 131, -1, 132, -1, 133, -1, 134, -1, 80, 99, 6, -1, 83, 99, 135, -1, 84, 99, 137, -1, 85, 99, 138, -1, 86, 87, 99, 139, -1, 88, 99, 139, -1, 86, 89, 99, 140, -1, 90, 99, 140, -1, 91, 99, 141, -1, 92, 99, 141, -1, 96, 99, 143, -1, 18, 99, 144, -1, 97, 99, 145, -1, 10, -1, 11, -1, 12, -1, 13, -1, 14, -1, -1, 100, 110, 6, -1, 101, -1, 3, -1, 5, -1, 4, -1, 8, -1, 9, -1, -1, 99, 115, 6, -1, 22, 99, 4, -1, -1, 18, 99, 116, 6, -1, -1, 20, 99, 117, 6, -1, -1, 21, 99, 118, 6, -1, 120, -1, 121, -1, 122, -1, 123, -1, 124, -1, 125, -1, 126, -1, 127, -1, 51, -1, 52, -1, 53, -1, 26, -1, 24, 26, -1, 27, -1, 28, -1, 29, -1, 25, 26, -1, 30, -1, 31, -1, 32, -1, 32, 33, -1, 24, 32, -1, 24, 32, 33, -1, 34, -1, 35, -1, 36, -1, 25, 32, -1, 25, 32, 33, -1, 37, -1, 38, -1, 33, -1, 24, 33, -1, 39, -1, 40, -1, 41, -1, 25, 33, -1, 42, -1, 43, -1, 45, -1, 44, 44, -1, 44, 44, 33, -1, 24, 44, 44, -1, 24, 44, 44, 33, -1, 46, -1, 47, -1, 48, -1, 25, 44, 44, -1, 25, 44, 44, 33, -1, 49, -1, 50, -1, 53, 54, 99, 4, -1, 55, 99, 4, -1, 57, -1, 58, -1, 59, -1, 60, -1, 61, -1, 62, -1, 63, -1, 64, -1, 65, -1, 67, -1, 68, -1, 70, 71, 99, 112, -1, 72, 99, 112, -1, 70, 73, 99, 112, -1, 74, 99, 112, -1, 76, 75, 99, 4, -1, 77, 99, 4, -1, 78, 75, 99, 4, -1, 79, 99, 4, -1, 135, 136, -1, 136, -1, 4, -1, 137, 112, -1, 112, -1, 138, 112, -1, 112, -1, 139, 112, -1, 112, -1, 140, 112, -1, 112, -1, 141, 142, -1, 142, -1, 93, -1, 94, -1, 95, -1, 143, 6, -1, 6, -1, 144, 6, -1, 6, -1, 145, 6, -1, 6, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 168, 168, 168, 171, 172, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 208, 209, 210, 211, 212, 215, 215, 218, 219, 222, 223, 226, 227, 230, 230, 231, 232, 232, 233, 233, 234, 234, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 250, 251, 252, 253, 256, 257, 258, 259, 262, 263, 264, 265, 266, 267, 270, 271, 272, 273, 274, 277, 278, 279, 280, 283, 284, 285, 286, 289, 290, 291, 292, 293, 294, 295, 298, 299, 300, 301, 302, 305, 306, 309, 310, 311, 312, 313, 314, 315, 316, 317, 320, 321, 324, 325, 328, 329, 332, 333, 336, 337, 340, 341, 344, 361, 362, 365, 366, 369, 370, 373, 374, 377, 378, 381, 382, 383, 386, 387, 390, 391, 394, 395 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "EOF_", "INT", "REAL", "STRING", "DEBUG_", "ON_", "OFF_", "NRRD0001_", "NRRD0002_", "NRRD0003_", "NRRD0004_", "NRRD0005_", "DATA_", "FILE_", "SPACE_", "UNITS_", "DIMENSIONS_", "ORIGIN_", "DIRECTIONS_", "DIMENSION_", "TYPE_", "SIGNED_", "UNSIGNED_", "CHAR_", "INT8_", "INT8_T_", "UCHAR_", "UINT8_", "UINT8_T_", "SHORT_", "INT_", "INT16_", "INT16_T_", "USHORT_", "UINT16_", "UINT16_T_", "INT32_", "INT32_T_", "UINT_", "UINT32_", "UINT32_T_", "LONG_", "LONGLONG_", "INT64_", "INT64_T_", "ULONGLONG_", "UINT64_", "UINT64_T_", "FLOAT_", "DOUBLE_", "BLOCK_", "SIZE_", "BLOCKSIZE_", "ENCODING_", "RAW_", "TXT_", "TEXT_", "ASCII_", "HEX_", "GZ_", "GZIP_", "BZ2_", "BZIP2_", "ENDIAN_", "BIG_", "LITTLE_", "CONTENT_", "OLD_", "MIN_", "OLDMIN_", "MAX_", "OLDMAX_", "SKIP_", "LINE_", "LINESKIP_", "BYTE_", "BYTESKIP_", "NUMBER_", "SAMPLE_", "SAMPLEUNITS_", "SIZES_", "SPACINGS_", "THICKNESSES_", "AXIS_", "MINS_", "AXISMINS_", "MAXS_", "AXISMAXS_", "CENTERS_", "CENTERINGS_", "CELL_", "NODE_", "NONE_", "LABELS_", "KINDS_", "DOMAINS_", "':'", "'#'", "'\\n'", "$accept", "start", "@1", "commands", "command", "@2", "magic", "comment", "@3", "terminator", "numeric", "debug", "space", "@4", "@5", "@6", "@7", "type", "char", "uchar", "short", "ushort", "int", "uint", "long", "ulong", "block", "encoding", "endian", "oldmin", "oldmax", "lineskip", "byteskip", "sizes", "size", "spacings", "thicknesses", "axismins", "axismaxs", "centers", "center", "labels", "units", "kinds", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 58, 35, 10 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 102, 104, 103, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 107, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, 108, 108, 108, 108, 108, 110, 109, 111, 111, 112, 112, 113, 113, 115, 114, 114, 116, 114, 117, 114, 118, 114, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 124, 124, 124, 124, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, 136, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 142, 142, 142, 143, 143, 144, 144, 145, 145 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 0, 2, 3, 2, 0, 2, 1, 1, 4, 2, 3, 3, 1, 3, 3, 0, 4, 3, 3, 1, 1, 1, 1, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 0, 3, 3, 0, 4, 0, 4, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 3, 1, 1, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 3, 3, 4, 1, 1, 1, 3, 4, 1, 1, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 3, 4, 3, 4, 3, 4, 3, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 2, 0, 6, 1, 0, 38, 39, 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 8, 9, 14, 21, 22, 23, 24, 49, 50, 7, 0, 0, 0, 0, 0, 51, 11, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 45, 5, 0, 54, 56, 58, 0, 0, 150, 36, 12, 0, 0, 71, 73, 74, 75, 77, 78, 79, 90, 83, 84, 85, 88, 89, 92, 93, 94, 96, 97, 0, 98, 103, 104, 105, 108, 109, 68, 69, 70, 13, 60, 61, 62, 63, 64, 65, 66, 67, 0, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 15, 121, 122, 16, 0, 0, 0, 48, 47, 19, 124, 20, 126, 0, 128, 0, 130, 25, 133, 26, 132, 135, 27, 137, 28, 0, 0, 139, 30, 141, 32, 144, 145, 146, 33, 143, 34, 148, 35, 152, 37, 44, 4, 10, 0, 0, 0, 53, 52, 149, 72, 81, 91, 0, 76, 86, 95, 0, 80, 99, 110, 18, 123, 125, 127, 129, 131, 134, 136, 29, 31, 138, 140, 142, 147, 151, 55, 57, 59, 82, 101, 87, 106, 100, 102, 107 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 1, 2, 41, 42, 158, 43, 44, 90, 94, 181, 52, 59, 100, 198, 199, 200, 134, 135, 136, 137, 138, 139, 140, 141, 142, 45, 154, 157, 46, 47, 48, 49, 173, 174, 176, 178, 182, 184, 188, 189, 192, 102, 194 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -138 static const yytype_int16 yypact[] = { -138, 4, 145, -138, 79, -138, -138, -138, -138, -138, 52, -13, -36, -28, -16, 31, -4, -3, -2, -1, -25, 0, 2, 6, 8, 34, 12, 53, 16, 30, 35, 37, 41, -37, 42, 43, 46, 49, 50, 51, -138, 47, 3, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 62, 65, 66, 67, 70, -138, -138, 116, 142, -8, 71, 147, 17, 24, -138, 72, 73, 89, 89, 89, 89, 74, 170, 76, 172, 171, 174, 89, 89, 80, 81, 89, 89, -81, -81, 175, 176, 177, 3, -138, -138, -138, 178, -138, -138, -138, 181, 180, -138, 182, -138, 23, 40, -138, -138, -138, -138, -138, -138, 154, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 146, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 185, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 186, 89, 89, -138, -138, -138, -138, -138, -138, 187, -138, 189, -138, -138, -138, 174, -138, -138, 89, -138, 89, 89, 89, -138, 89, -138, 89, -138, -138, -138, -81, -138, -81, -138, 188, -138, 190, -138, -138, -138, 191, 193, 196, -138, -138, -138, -138, 162, -138, 159, -138, 173, -138, 160, -138, 179, -138, -138, -138, -138, -138, -138, -138, -138, -138, 89, 89, -138, -138, -138, -138, -138, -138, -138, -138, -138, 194, -138, 199, -138, -138, -138 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -138, -138, -138, -138, 164, -138, -138, -138, -138, 117, -70, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, -138, 36, -138, -138, 28, 33, 123, -137, -138, -138, -138 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -4 static const yytype_int16 yytable[] = { 163, 164, 165, 166, 3, 54, 92, 55, 56, 57, 175, 177, 185, 186, 187, 183, 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, 68, -3, 69, 204, 82, 227, 83, 227, 4, 205, 206, 5, 6, 7, 8, 9, 10, 60, 11, 12, 208, 207, 53, 13, 14, 61, 209, 210, 145, 146, 147, 148, 149, 150, 151, 152, 153, 62, 211, 63, 58, 50, 51, 216, 217, 155, 156, 161, 162, 64, 65, 66, 67, 70, 15, 71, 16, 17, 93, 72, 221, 73, 222, 74, 183, 75, 225, 18, 226, 77, 19, 20, 21, 22, 23, 24, 101, 25, 26, 27, 28, 29, 76, 78, 30, 31, 32, 33, 79, 34, 80, 35, 36, 37, 81, 84, 85, 38, 39, 86, 103, 40, 87, 88, 89, 144, 4, 225, 226, 5, 6, 7, 8, 9, 10, 95, 11, 12, 96, 97, 98, 13, 14, 99, 143, 159, 160, 167, 168, 169, 170, 171, 172, 179, 180, 191, 193, 195, 197, 201, 202, 212, 203, 214, 213, 218, 215, 219, 228, 233, 229, 230, 15, 231, 16, 17, 232, 234, 236, 91, 235, 223, 196, 220, 190, 18, 237, 224, 19, 20, 21, 22, 23, 24, 0, 25, 26, 27, 28, 29, 0, 238, 30, 31, 32, 33, 239, 34, 0, 35, 36, 37, 0, 0, 0, 38, 39, 0, 0, 40 }; static const yytype_int16 yycheck[] = { 70, 71, 72, 73, 0, 18, 3, 20, 21, 22, 80, 81, 93, 94, 95, 85, 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, 71, 0, 73, 26, 87, 188, 89, 190, 7, 32, 33, 10, 11, 12, 13, 14, 15, 99, 17, 18, 26, 44, 16, 22, 23, 99, 32, 33, 57, 58, 59, 60, 61, 62, 63, 64, 65, 99, 44, 54, 99, 8, 9, 159, 160, 67, 68, 4, 5, 99, 99, 99, 99, 99, 53, 99, 55, 56, 101, 99, 176, 99, 178, 75, 180, 99, 182, 66, 184, 99, 69, 70, 71, 72, 73, 74, 6, 76, 77, 78, 79, 80, 75, 99, 83, 84, 85, 86, 99, 88, 99, 90, 91, 92, 99, 99, 99, 96, 97, 99, 4, 100, 99, 99, 99, 4, 7, 223, 224, 10, 11, 12, 13, 14, 15, 99, 17, 18, 99, 99, 99, 22, 23, 99, 99, 99, 99, 99, 4, 99, 4, 6, 4, 99, 99, 6, 6, 6, 6, 4, 6, 33, 6, 4, 44, 4, 6, 4, 6, 33, 6, 6, 53, 6, 55, 56, 6, 44, 44, 41, 33, 179, 91, 173, 87, 66, 33, 180, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 33, 83, 84, 85, 86, 33, 88, -1, 90, 91, 92, -1, -1, -1, 96, 97, -1, -1, 100 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 103, 104, 0, 7, 10, 11, 12, 13, 14, 15, 17, 18, 22, 23, 53, 55, 56, 66, 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, 80, 83, 84, 85, 86, 88, 90, 91, 92, 96, 97, 100, 105, 106, 108, 109, 128, 131, 132, 133, 134, 8, 9, 113, 16, 18, 20, 21, 22, 99, 114, 99, 99, 99, 54, 99, 99, 99, 99, 71, 73, 99, 99, 99, 99, 75, 99, 75, 99, 99, 99, 99, 99, 87, 89, 99, 99, 99, 99, 99, 99, 110, 106, 3, 101, 111, 99, 99, 99, 99, 99, 115, 6, 144, 4, 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, 119, 120, 121, 122, 123, 124, 125, 126, 127, 99, 4, 57, 58, 59, 60, 61, 62, 63, 64, 65, 129, 67, 68, 130, 107, 99, 99, 4, 5, 112, 112, 112, 112, 99, 4, 99, 4, 6, 4, 135, 136, 112, 137, 112, 138, 99, 99, 112, 139, 112, 140, 93, 94, 95, 141, 142, 141, 6, 143, 6, 145, 6, 111, 6, 116, 117, 118, 4, 6, 6, 26, 32, 33, 44, 26, 32, 33, 44, 33, 44, 4, 6, 112, 112, 4, 4, 136, 112, 112, 139, 140, 112, 112, 142, 6, 6, 6, 6, 6, 33, 44, 33, 44, 33, 33, 33 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (nrrd, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, nrrd, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* nrrd, nrrdFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, nrrd, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* nrrd; nrrdFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (nrrd); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* nrrd, nrrdFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, nrrd, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* nrrd; nrrdFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, nrrd, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, FitsFile* nrrd, nrrdFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, nrrd, ll) YYSTYPE *yyvsp; int yyrule; FitsFile* nrrd; nrrdFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , nrrd, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, nrrd, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, FitsFile* nrrd, nrrdFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, nrrd, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; FitsFile* nrrd; nrrdFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (nrrd); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (FitsFile* nrrd, nrrdFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (FitsFile* nrrd, nrrdFlexLexer* ll) #else int yyparse (nrrd, ll) FitsFile* nrrd; nrrdFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 168 "fitsy++/nrrdparser.Y" {dim=0; nrrd->setpArch(FitsFile::BIG);;} break; case 17: #line 186 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 43: #line 215 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 46: #line 219 "fitsy++/nrrdparser.Y" {YYACCEPT;;} break; case 47: #line 222 "fitsy++/nrrdparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 48: #line 223 "fitsy++/nrrdparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 49: #line 226 "fitsy++/nrrdparser.Y" {yydebug=1;;} break; case 50: #line 227 "fitsy++/nrrdparser.Y" {yydebug=0;;} break; case 51: #line 230 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 54: #line 232 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 56: #line 233 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 58: #line 234 "fitsy++/nrrdparser.Y" {DISCARD_(1);} break; case 60: #line 237 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(8);;} break; case 61: #line 238 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(8);;} break; case 62: #line 239 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(16);;} break; case 63: #line 240 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(16);;} break; case 64: #line 241 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(32);;} break; case 65: #line 242 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(32);;} break; case 66: #line 243 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(64);;} break; case 67: #line 244 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(64);;} break; case 68: #line 245 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(-32);;} break; case 69: #line 246 "fitsy++/nrrdparser.Y" {nrrd->setpBitpix(-64);;} break; case 112: #line 309 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::RAW);;} break; case 113: #line 310 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::ASCII);;} break; case 114: #line 311 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::ASCII);;} break; case 115: #line 312 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::ASCII);;} break; case 116: #line 313 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::HEX);;} break; case 117: #line 314 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::GZIP);;} break; case 118: #line 315 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::GZIP);;} break; case 119: #line 316 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::BZ2);;} break; case 120: #line 317 "fitsy++/nrrdparser.Y" {nrrd->setpEncoding(FitsFile::BZ2);;} break; case 121: #line 320 "fitsy++/nrrdparser.Y" {nrrd->setpArch(FitsFile::BIG);;} break; case 122: #line 321 "fitsy++/nrrdparser.Y" {nrrd->setpArch(FitsFile::LITTLE);;} break; case 133: #line 345 "fitsy++/nrrdparser.Y" { switch (dim) { case 0: nrrd->setpWidth((yyvsp[(1) - (1)].integer)); break; case 1: nrrd->setpHeight((yyvsp[(1) - (1)].integer)); break; case 2: nrrd->setpDepth((yyvsp[(1) - (1)].integer)); break; } dim++; ;} break; /* Line 1267 of yacc.c. */ #line 1981 "fitsy++/nrrdparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (nrrd, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (nrrd, ll, yymsg); } else { yyerror (nrrd, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, nrrd, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, nrrd, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (nrrd, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, nrrd, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, nrrd, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 398 "fitsy++/nrrdparser.Y" saods9/tksao1.0/fitsy++/nrrdparser.H000644 000765 000000 00000013567 12553253014 017517 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { EOF_ = 258, INT = 259, REAL = 260, STRING = 261, DEBUG_ = 262, ON_ = 263, OFF_ = 264, NRRD0001_ = 265, NRRD0002_ = 266, NRRD0003_ = 267, NRRD0004_ = 268, NRRD0005_ = 269, DATA_ = 270, FILE_ = 271, SPACE_ = 272, UNITS_ = 273, DIMENSIONS_ = 274, ORIGIN_ = 275, DIRECTIONS_ = 276, DIMENSION_ = 277, TYPE_ = 278, SIGNED_ = 279, UNSIGNED_ = 280, CHAR_ = 281, INT8_ = 282, INT8_T_ = 283, UCHAR_ = 284, UINT8_ = 285, UINT8_T_ = 286, SHORT_ = 287, INT_ = 288, INT16_ = 289, INT16_T_ = 290, USHORT_ = 291, UINT16_ = 292, UINT16_T_ = 293, INT32_ = 294, INT32_T_ = 295, UINT_ = 296, UINT32_ = 297, UINT32_T_ = 298, LONG_ = 299, LONGLONG_ = 300, INT64_ = 301, INT64_T_ = 302, ULONGLONG_ = 303, UINT64_ = 304, UINT64_T_ = 305, FLOAT_ = 306, DOUBLE_ = 307, BLOCK_ = 308, SIZE_ = 309, BLOCKSIZE_ = 310, ENCODING_ = 311, RAW_ = 312, TXT_ = 313, TEXT_ = 314, ASCII_ = 315, HEX_ = 316, GZ_ = 317, GZIP_ = 318, BZ2_ = 319, BZIP2_ = 320, ENDIAN_ = 321, BIG_ = 322, LITTLE_ = 323, CONTENT_ = 324, OLD_ = 325, MIN_ = 326, OLDMIN_ = 327, MAX_ = 328, OLDMAX_ = 329, SKIP_ = 330, LINE_ = 331, LINESKIP_ = 332, BYTE_ = 333, BYTESKIP_ = 334, NUMBER_ = 335, SAMPLE_ = 336, SAMPLEUNITS_ = 337, SIZES_ = 338, SPACINGS_ = 339, THICKNESSES_ = 340, AXIS_ = 341, MINS_ = 342, AXISMINS_ = 343, MAXS_ = 344, AXISMAXS_ = 345, CENTERS_ = 346, CENTERINGS_ = 347, CELL_ = 348, NODE_ = 349, NONE_ = 350, LABELS_ = 351, KINDS_ = 352, DOMAINS_ = 353 }; #endif /* Tokens. */ #define EOF_ 258 #define INT 259 #define REAL 260 #define STRING 261 #define DEBUG_ 262 #define ON_ 263 #define OFF_ 264 #define NRRD0001_ 265 #define NRRD0002_ 266 #define NRRD0003_ 267 #define NRRD0004_ 268 #define NRRD0005_ 269 #define DATA_ 270 #define FILE_ 271 #define SPACE_ 272 #define UNITS_ 273 #define DIMENSIONS_ 274 #define ORIGIN_ 275 #define DIRECTIONS_ 276 #define DIMENSION_ 277 #define TYPE_ 278 #define SIGNED_ 279 #define UNSIGNED_ 280 #define CHAR_ 281 #define INT8_ 282 #define INT8_T_ 283 #define UCHAR_ 284 #define UINT8_ 285 #define UINT8_T_ 286 #define SHORT_ 287 #define INT_ 288 #define INT16_ 289 #define INT16_T_ 290 #define USHORT_ 291 #define UINT16_ 292 #define UINT16_T_ 293 #define INT32_ 294 #define INT32_T_ 295 #define UINT_ 296 #define UINT32_ 297 #define UINT32_T_ 298 #define LONG_ 299 #define LONGLONG_ 300 #define INT64_ 301 #define INT64_T_ 302 #define ULONGLONG_ 303 #define UINT64_ 304 #define UINT64_T_ 305 #define FLOAT_ 306 #define DOUBLE_ 307 #define BLOCK_ 308 #define SIZE_ 309 #define BLOCKSIZE_ 310 #define ENCODING_ 311 #define RAW_ 312 #define TXT_ 313 #define TEXT_ 314 #define ASCII_ 315 #define HEX_ 316 #define GZ_ 317 #define GZIP_ 318 #define BZ2_ 319 #define BZIP2_ 320 #define ENDIAN_ 321 #define BIG_ 322 #define LITTLE_ 323 #define CONTENT_ 324 #define OLD_ 325 #define MIN_ 326 #define OLDMIN_ 327 #define MAX_ 328 #define OLDMAX_ 329 #define SKIP_ 330 #define LINE_ 331 #define LINESKIP_ 332 #define BYTE_ 333 #define BYTESKIP_ 334 #define NUMBER_ 335 #define SAMPLE_ 336 #define SAMPLEUNITS_ 337 #define SIZES_ 338 #define SPACINGS_ 339 #define THICKNESSES_ 340 #define AXIS_ 341 #define MINS_ 342 #define AXISMINS_ 343 #define MAXS_ 344 #define AXISMAXS_ 345 #define CENTERS_ 346 #define CENTERINGS_ 347 #define CELL_ 348 #define NODE_ 349 #define NONE_ 350 #define LABELS_ 351 #define KINDS_ 352 #define DOMAINS_ 353 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "fitsy++/nrrdparser.Y" { #define NRRDPARSERSIZE 256 float real; int integer; char str[NRRDPARSERSIZE]; } /* Line 1529 of yacc.c. */ #line 252 "fitsy++/nrrdparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/fitsy++/nrrdparser.Y000644 000765 000000 00000015401 12464230772 017534 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {FitsFile* nrrd} %lex-param {nrrdFlexLexer* ll} %parse-param {nrrdFlexLexer* ll} %{ #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; nrrdDiscard(x);} #include "file.h" #undef yyFlexLexer #define yyFlexLexer nrrdFlexLexer #include extern int nrrdlex(void*, nrrdFlexLexer*); extern void nrrderror(FitsFile*, nrrdFlexLexer*, const char*); extern void nrrdDiscard(int); int dim; %} %union { #define NRRDPARSERSIZE 256 float real; int integer; char str[NRRDPARSERSIZE]; } %type numeric // Basic %token EOF_ %token INT %token REAL %token STRING %token DEBUG_ %token ON_ %token OFF_ // Magic %token NRRD0001_ %token NRRD0002_ %token NRRD0003_ %token NRRD0004_ %token NRRD0005_ // 3. Headers %token DATA_ %token FILE_ // 4. Space %token SPACE_ %token UNITS_ %token DIMENSIONS_ %token ORIGIN_ %token DIRECTIONS_ // 5.1 Dimension %token DIMENSION_ // 5.2 Type %token TYPE_ %token SIGNED_ %token UNSIGNED_ %token CHAR_ %token INT8_ %token INT8_T_ %token UCHAR_ %token UINT8_ %token UINT8_T_ %token SHORT_ %token INT_ %token INT16_ %token INT16_T_ %token USHORT_ %token UINT16_ %token UINT16_T_ %token INT32_ %token INT32_T_ %token UINT_ %token UINT32_ %token UINT32_T_ %token LONG_ %token LONGLONG_ %token INT64_ %token INT64_T_ %token ULONGLONG_ %token UINT64_ %token UINT64_T_ %token FLOAT_ %token DOUBLE_ // 5.3 Block %token BLOCK_ %token SIZE_ %token BLOCKSIZE_ // 5.4 ENCODING %token ENCODING_ %token RAW_ %token TXT_ %token TEXT_ %token ASCII_ %token HEX_ %token GZ_ %token GZIP_ %token BZ2_ %token BZIP2_ // 5.5 Endian %token ENDIAN_ %token BIG_ %token LITTLE_ // 5.6 Content %token CONTENT_ // 5.7 MinMax %token OLD_ %token MIN_ %token OLDMIN_ %token MAX_ %token OLDMAX_ // 5.8 Skip %token SKIP_ %token LINE_ %token LINESKIP_ %token BYTE_ %token BYTESKIP_ // 5.9 Number %token NUMBER_ // 5.10 Sample %token SAMPLE_ %token SAMPLEUNITS_ // 6 Per Axis %token SIZES_ %token SPACINGS_ %token THICKNESSES_ %token AXIS_ %token MINS_ %token AXISMINS_ %token MAXS_ %token AXISMAXS_ %token CENTERS_ %token CENTERINGS_ %token CELL_ %token NODE_ %token NONE_ %token LABELS_ %token KINDS_ %token DOMAINS_ %% start : {dim=0; nrrd->setpArch(FitsFile::BIG);} commands ; commands: commands command terminator | command terminator ; command : /* empty */ | DEBUG_ debug | magic | comment | DATA_ FILE_ ':' STRING | SPACE_ space | DIMENSION_ ':' INT | TYPE_ ':' type | block | ENCODING_ ':' encoding | ENDIAN_ ':' endian | CONTENT_ ':' {DISCARD_(1)} STRING | MIN_ ':' numeric | MAX_ ':' numeric | oldmin | oldmax | lineskip | byteskip | NUMBER_ ':' STRING | SIZES_ ':' sizes | SPACINGS_ ':' spacings | THICKNESSES_ ':' thicknesses | AXIS_ MINS_ ':' axismins | AXISMINS_ ':' axismins | AXIS_ MAXS_ ':' axismaxs | AXISMAXS_ ':' axismaxs | CENTERS_ ':' centers | CENTERINGS_ ':' centers | LABELS_ ':' labels | UNITS_ ':' units | KINDS_ ':' kinds ; magic : NRRD0001_ | NRRD0002_ | NRRD0003_ | NRRD0004_ | NRRD0005_ ; comment : '#' {DISCARD_(1)} STRING ; terminator: '\n' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; space : ':' {DISCARD_(1)} STRING | DIMENSION_ ':' INT | UNITS_ ':' {DISCARD_(1)} STRING | ORIGIN_ ':' {DISCARD_(1)} STRING | DIRECTIONS_ ':' {DISCARD_(1)} STRING ; type : char {nrrd->setpBitpix(8);} | uchar {nrrd->setpBitpix(8);} | short {nrrd->setpBitpix(16);} | ushort {nrrd->setpBitpix(16);} | int {nrrd->setpBitpix(32);} | uint {nrrd->setpBitpix(32);} | long {nrrd->setpBitpix(64);} | ulong {nrrd->setpBitpix(64);} | FLOAT_ {nrrd->setpBitpix(-32);} | DOUBLE_ {nrrd->setpBitpix(-64);} | BLOCK_ ; char : CHAR_ | SIGNED_ CHAR_ | INT8_ | INT8_T_ ; uchar : UCHAR_ | UNSIGNED_ CHAR_ | UINT8_ | UINT8_T_ ; short : SHORT_ | SHORT_ INT_ | SIGNED_ SHORT_ | SIGNED_ SHORT_ INT_ | INT16_ | INT16_T_ ; ushort : USHORT_ | UNSIGNED_ SHORT_ | UNSIGNED_ SHORT_ INT_ | UINT16_ | UINT16_T_ ; int : INT_ | SIGNED_ INT_ | INT32_ | INT32_T_ ; uint : UINT_ | UNSIGNED_ INT_ | UINT32_ | UINT32_T_ ; long : LONGLONG_ | LONG_ LONG_ | LONG_ LONG_ INT_ | SIGNED_ LONG_ LONG_ | SIGNED_ LONG_ LONG_ INT_ | INT64_ | INT64_T_ ; ulong : ULONGLONG_ | UNSIGNED_ LONG_ LONG_ | UNSIGNED_ LONG_ LONG_ INT_ | UINT64_ | UINT64_T_ ; block : BLOCK_ SIZE_ ':' INT | BLOCKSIZE_ ':' INT ; encoding : RAW_ {nrrd->setpEncoding(FitsFile::RAW);} | TXT_ {nrrd->setpEncoding(FitsFile::ASCII);} | TEXT_ {nrrd->setpEncoding(FitsFile::ASCII);} | ASCII_ {nrrd->setpEncoding(FitsFile::ASCII);} | HEX_ {nrrd->setpEncoding(FitsFile::HEX);} | GZ_ {nrrd->setpEncoding(FitsFile::GZIP);} | GZIP_ {nrrd->setpEncoding(FitsFile::GZIP);} | BZ2_ {nrrd->setpEncoding(FitsFile::BZ2);} | BZIP2_ {nrrd->setpEncoding(FitsFile::BZ2);} ; endian : BIG_ {nrrd->setpArch(FitsFile::BIG);} | LITTLE_ {nrrd->setpArch(FitsFile::LITTLE);} ; oldmin : OLD_ MIN_ ':' numeric | OLDMIN_ ':' numeric ; oldmax : OLD_ MAX_ ':' numeric | OLDMAX_ ':' numeric ; lineskip : LINE_ SKIP_ ':' INT | LINESKIP_ ':' INT ; byteskip : BYTE_ SKIP_ ':' INT | BYTESKIP_ ':' INT ; sizes : sizes size | size ; size : INT { switch (dim) { case 0: nrrd->setpWidth($1); break; case 1: nrrd->setpHeight($1); break; case 2: nrrd->setpDepth($1); break; } dim++; } ; spacings : spacings numeric | numeric ; thicknesses : thicknesses numeric | numeric ; axismins : axismins numeric | numeric ; axismaxs : axismaxs numeric | numeric ; centers : centers center | center ; center : CELL_ | NODE_ | NONE_ ; labels : labels STRING | STRING ; units : units STRING | STRING ; kinds : kinds STRING | STRING ; %% saods9/tksao1.0/fitsy++/order.C000644 000765 000000 00000011711 12502627444 016436 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "order.h" FitsOrder::FitsOrder(FitsFile* fits, FitsHead* hdr, char* data, size_t sz) { head_ = hdr; data_ = data; dataSize_ = sz; primary_ = fits->primary(); ext_ = fits->ext(); inherit_ = fits->inherit(); byteswap_ = fits->byteswap(); endian_ = fits->endian(); // just to make sure head_->updateHDU(); valid_ = 1; } FitsOrder::~FitsOrder() { if (data_) delete [] (char*)data_; } FitsOrderNext::FitsOrderNext(FitsFile* prev) { primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = prev->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; return; } /* FitsOrder::FitsOrder(FitsFile* fits, int order) { FitsHead* src = fits->head(); width_ = src->naxis(0); height_ = src->naxis(1); depth_ = src->naxis(2); if (width_<1) width_ = 1; if (height_<1) height_ = 1; if (depth_<1) depth_=1; size_ = (size_t)width_*height_*depth_; primary_ = fits->primary(); ext_ = fits->ext(); inherit_ = fits->inherit(); byteswap_ = fits->byteswap(); endian_ = fits->endian(); bitpix_ = src->hdu()->bitpix(); switch (bitpix_) { case 8: if (!(data_ = new char[size_])) return; dataSize_ = size_*sizeof(char); pixelSize_ = 1; break; case 16: if (!(data_ = new short[size_])) return; dataSize_ = size_*sizeof(short); pixelSize_ = 2; break; case -16: if (!(data_ = new unsigned short[size_])) return; dataSize_ = size_*sizeof(unsigned short); pixelSize_ = 2; break; case 32: if (!(data_ = new int[size_])) return; dataSize_ = size_*sizeof(int); pixelSize_ = 4; break; case -32: if (!(data_ = new float[size_])) return; dataSize_ = size_*sizeof(float); pixelSize_ = 4; break; case 64: if (!(data_ = new long long[size_])) return; dataSize_ = size_*sizeof(long long); pixelSize_ = 8; break; case -64: if (!(data_ = new double[size_])) return; dataSize_ = size_*sizeof(double); pixelSize_ = 8; break; } dataSkip_ = 0; memset(data_, 0, dataSize_); initHeader(fits, order); reorder(fits, order); // made it this far, must be valid valid_ = 1; } FitsOrder::~FitsOrder() { if (data_) delete [] (char*)data_; } void FitsOrder::initHeader(FitsFile* fits, int order) { head_ = new FitsHead(*(fits->head())); // NAXIS int a1 = head_->getInteger("NAXIS1",1); int a2 = head_->getInteger("NAXIS2",1); int a3 = head_->getInteger("NAXIS3",1); int n1,n2,n3; switch (order) { case 123: n1=a1; n2=a2; n3=a3; break; case 132: n1=a1; n2=a3; n3=a2; break; case 213: n1=a2; n2=a1; n3=a3; break; case 231: n1=a2; n2=a3; n3=a1; break; case 312: n1=a3; n2=a1; n3=a2; break; case 321: n1=a3; n2=a2; n3=a1; break; } head_->setInteger("NAXES", 3, ""); head_->setInteger("NAXIS1", n1, ""); head_->setInteger("NAXIS2", n2, ""); head_->setInteger("NAXIS3", n3, ""); head_->updateHDU(); } void FitsOrder::reorder(FitsFile* fits, int order) { char* src = (char*)fits->data(); char* dest = (char*)data_; char* dptr = dest; int s1 = pixelSize_; int s2 = width_*pixelSize_; int s3 = height_*width_*pixelSize_; switch (order) { case 123: // should not be used, but just in case memcpy(dest, src, dataSize_); break; case 132: for (int jj=0; jj #include "outchannel.h" OutFitsChannel::OutFitsChannel(Tcl_Interp* interp, const char* ch) { int tclMode; if ((ch_ = Tcl_GetChannel(interp, (char*)ch, &tclMode))) valid_ = 1; } int OutFitsChannel::write(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; do { r = Tcl_Write(ch_, where+rr, (ss>B1MB) ? B1MB : ss); ss -= r; rr += r; } while (r>0 && rr #include "outfile.h" OutFitsFile::OutFitsFile(const char* fn) { if ((fd_ = fopen(fn, "wb"))) valid_ = 1; } OutFitsFile::~OutFitsFile() { if (fd_) fclose(fd_); } int OutFitsFile::write(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; do { r = fwrite(where+rr, 1, (ss>B1MB) ? B1MB : ss, fd_); ss -= r; rr += r; } while (r>0 && rrB1MB) ? B1MB : ss); ss -= r; rr += r; } while (r>0 && rrB4KB) ? B4KB : ss; switch (bitpix) { case 8: memcpy(buf, where+rr, r); break; case 16: case -16: for (int ii=0; ii0 && rr #include #include "file.h" OutFitsSocket::OutFitsSocket(int s) { id_ = s; valid_ = 1; } int OutFitsSocket::write(char* where, size_t size) { // size_t size is unsigned long long ss = size; size_t rr =0; int r; do { r = (ss>B4KB) ? B4KB : ss; send(id_, where+rr, r, 0); if (r == -1) { internalError("Fitsy++ outsocket write error"); return -1; } ss -= r; rr += r; } while (r>0 && rrnext_in = NULL; stream_->avail_in = 0; stream_->next_out = NULL; stream_->avail_out = 0; stream_->zalloc = NULL; stream_->zfree = NULL; stream_->opaque = NULL; if (deflateInit2(stream_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) { internalError("Fitsy++ outsocket deflateInit error"); return; } // dump simple header char header[10] = {0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x03}; send(id_, header, 10, 0); stream_->next_out = buf_; stream_->avail_out = B4KB; valid_ = 1; } OutFitsSocketGZ::~OutFitsSocketGZ() { // flush any pending output while (deflategz(Z_FINISH) == Z_OK); // output crc/length putlong(crc_); putlong(stream_->total_in); if (deflateEnd(stream_) != Z_OK) internalError("Fitsy++ outsocket deflateEnd error"); if (stream_) delete stream_; if (buf_) delete [] buf_; } int OutFitsSocketGZ::write(char* where, size_t size) { stream_->next_in = (unsigned char*)where; stream_->avail_in = size; if (DebugGZ) cerr << "write " << size << endl; while (stream_->avail_in > 0 && deflategz(Z_NO_FLUSH) == Z_OK); // update crc crc_ = crc32(crc_, (const Bytef *)where, size); return size - stream_->avail_in; } int OutFitsSocketGZ::deflategz(int flush) { int result = deflate(stream_, flush); switch (result) { case Z_OK: if (DebugGZ) cerr << "deflate OK: avail_in " << stream_->avail_in << " avail_out " << stream_->avail_out << endl; break; case Z_STREAM_END: if (DebugGZ) cerr << "deflate STRM_END: avail_in " << stream_->avail_in << " avail_out " << stream_->avail_out << endl; break; default: if (DebugGZ) cerr << "deflate Error " << result << endl; return result; } if (stream_->avail_out == 0 || result != Z_OK) { int s = B4KB - stream_->avail_out; unsigned char* d = buf_; while (s>0) { int r = send(id_, d, s, 0); if (r == -1) { internalError("Fitsy++ outsocket deflate send error"); return Z_ERRNO; } if (DebugGZ) cerr << "deflate send " << r << " out of " << s << endl; s -= r; d += r; } stream_->next_out = buf_; stream_->avail_out = B4KB; } return result; } void OutFitsSocketGZ::putlong(unsigned long l) { // dump in LSB order for (int n = 0; n < 4; n++) { unsigned char foo = (int)(l & 0xff); send(id_, &foo, 1, 0); l >>= 8; } } #else OutFitsSocket::OutFitsSocket(int s) { id_ = s; valid_ = 0; } int OutFitsSocket::write(char* where, size_t size) { return 0; } OutFitsSocketGZ::OutFitsSocketGZ(int s) { id_ = s; valid_ = 0; } OutFitsSocketGZ::~OutFitsSocketGZ() {} int OutFitsSocketGZ::write(char* where, size_t size) { return 0; } int OutFitsSocketGZ::deflategz(int flush) { return 0; } void OutFitsSocketGZ::putlong(unsigned long l) {} #endif saods9/tksao1.0/fitsy++/outsocket.h000644 000765 000000 00000001272 12464214754 017414 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __outfitssocket_h__ #define __outfitssocket_h__ #include "outfits.h" #include "zlib.h" class OutFitsSocket : public virtual OutFitsStream { private: int id_; public: OutFitsSocket(int s); int write(char*, size_t); }; class OutFitsSocketGZ : public virtual OutFitsStream { private: int id_; z_stream* stream_; unsigned char* buf_; unsigned long crc_; int deflategz(int); void putlong(unsigned long); public: OutFitsSocketGZ(int); ~OutFitsSocketGZ(); int write(char*, size_t); }; #endif saods9/tksao1.0/fitsy++/parser.C000644 000765 000000 00000201354 12617220472 016620 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse ffparse #define yylex fflex #define yyerror fferror #define yylval fflval #define yychar ffchar #define yydebug ffdebug #define yynerrs ffnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, STRING = 259, ARCH_ = 260, ARRAY_ = 261, BIG_ = 262, BIGENDIAN_ = 263, BIN_ = 264, BINKEY_ = 265, BINCOL_ = 266, BITPIX_ = 267, COL_ = 268, DIM_ = 269, DIMS_ = 270, ECLIPTIC_ = 271, ENDIAN_ = 272, EQUATORIAL_ = 273, GALACTIC_ = 274, KEY_ = 275, LAYOUT_ = 276, LITTLE_ = 277, LITTLEENDIAN_ = 278, NESTED_ = 279, NORTH_ = 280, ORDER_ = 281, QUAD_ = 282, RING_ = 283, SKIP_ = 284, SOUTH_ = 285, SYSTEM_ = 286, UNKNOWN_ = 287, XDIM_ = 288, YDIM_ = 289, ZDIM_ = 290 }; #endif /* Tokens. */ #define INT 258 #define STRING 259 #define ARCH_ 260 #define ARRAY_ 261 #define BIG_ 262 #define BIGENDIAN_ 263 #define BIN_ 264 #define BINKEY_ 265 #define BINCOL_ 266 #define BITPIX_ 267 #define COL_ 268 #define DIM_ 269 #define DIMS_ 270 #define ECLIPTIC_ 271 #define ENDIAN_ 272 #define EQUATORIAL_ 273 #define GALACTIC_ 274 #define KEY_ 275 #define LAYOUT_ 276 #define LITTLE_ 277 #define LITTLEENDIAN_ 278 #define NESTED_ 279 #define NORTH_ 280 #define ORDER_ 281 #define QUAD_ 282 #define RING_ 283 #define SKIP_ 284 #define SOUTH_ 285 #define SYSTEM_ 286 #define UNKNOWN_ 287 #define XDIM_ 288 #define YDIM_ 289 #define ZDIM_ 290 /* Copy the first part of user declarations. */ #line 10 "fitsy++/parser.Y" #define YYDEBUG 1 #define GOTOFILT(x) {yyclearin; ffFilter(x);} #define GOTOARR(x) {yyclearin; ffArray(x);} #include "file.h" #include "hpx.h" #undef yyFlexLexer #define yyFlexLexer ffFlexLexer #include extern int fflex(void*, ffFlexLexer*); extern void fferror(FitsFile*, ffFlexLexer*, const char*); char ff_filter[512]; extern void ffFilter(int); extern void ffArray(int); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 32 "fitsy++/parser.Y" { float real; int integer; char str[256]; void* ptr; } /* Line 193 of yacc.c. */ #line 203 "fitsy++/parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 216 "fitsy++/parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 6 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 250 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 56 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 34 /* YYNRULES -- Number of rules. */ #define YYNRULES 121 /* YYNRULES -- Number of states. */ #define YYNSTATES 203 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 290 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 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, 38, 39, 45, 2, 40, 2, 55, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 43, 2, 2, 46, 2, 2, 44, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 37, 2, 2, 2, 2, 47, 2, 54, 2, 53, 2, 2, 50, 2, 2, 51, 2, 2, 2, 41, 2, 52, 48, 2, 49, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint16 yyprhs[] = { 0, 0, 3, 5, 8, 12, 15, 21, 25, 30, 35, 38, 42, 46, 52, 56, 61, 66, 69, 73, 77, 83, 86, 90, 94, 95, 104, 105, 109, 110, 112, 116, 120, 123, 126, 131, 135, 141, 147, 155, 159, 161, 165, 169, 175, 176, 178, 180, 184, 188, 190, 194, 198, 200, 206, 210, 214, 216, 218, 222, 226, 229, 231, 233, 235, 237, 243, 247, 255, 261, 265, 267, 271, 275, 277, 281, 285, 289, 293, 297, 301, 305, 309, 313, 315, 317, 319, 321, 323, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 350, 356, 357, 360, 361, 363, 365, 369, 373, 375, 379, 383, 387, 391, 395, 397, 399, 401, 403, 405, 407, 409, 411 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 57, 0, -1, 60, -1, 60, 61, -1, 60, 61, 63, -1, 60, 63, -1, 60, 36, 62, 64, 37, -1, 60, 61, 71, -1, 60, 61, 71, 63, -1, 60, 61, 63, 71, -1, 60, 71, -1, 60, 71, 63, -1, 60, 63, 71, -1, 60, 36, 62, 72, 37, -1, 60, 61, 84, -1, 60, 61, 84, 63, -1, 60, 61, 63, 84, -1, 60, 84, -1, 60, 84, 63, -1, 60, 63, 84, -1, 60, 36, 62, 84, 37, -1, 60, 75, -1, 60, 75, 63, -1, 60, 63, 75, -1, -1, 60, 36, 6, 58, 38, 79, 39, 37, -1, -1, 1, 59, 4, -1, -1, 4, -1, 36, 4, 37, -1, 36, 3, 37, -1, 4, 40, -1, 3, 40, -1, 36, 64, 65, 37, -1, 66, 40, 67, -1, 66, 40, 67, 40, 70, -1, 66, 40, 67, 40, 69, -1, 66, 40, 67, 40, 70, 40, 69, -1, 66, 40, 70, -1, 68, -1, 68, 40, 70, -1, 68, 40, 69, -1, 68, 40, 70, 40, 69, -1, -1, 41, -1, 42, -1, 3, 43, 3, -1, 3, 44, 3, -1, 45, -1, 3, 43, 3, -1, 3, 44, 3, -1, 45, -1, 3, 44, 3, 44, 3, -1, 3, 43, 3, -1, 3, 44, 3, -1, 45, -1, 3, -1, 36, 72, 37, -1, 73, 46, 74, -1, 73, 74, -1, 9, -1, 10, -1, 11, -1, 20, -1, 38, 4, 40, 4, 39, -1, 4, 40, 4, -1, 38, 4, 40, 4, 40, 4, 39, -1, 4, 40, 4, 40, 4, -1, 38, 4, 39, -1, 4, -1, 36, 76, 37, -1, 76, 40, 77, -1, 77, -1, 33, 46, 3, -1, 34, 46, 3, -1, 35, 46, 3, -1, 14, 46, 3, -1, 15, 46, 3, -1, 12, 46, 3, -1, 29, 46, 3, -1, 5, 46, 78, -1, 17, 46, 78, -1, 78, -1, 7, -1, 8, -1, 22, -1, 23, -1, 80, 81, 82, 83, -1, 47, -1, 48, -1, 49, -1, 50, -1, 51, -1, 52, -1, 53, -1, 54, -1, 3, -1, 3, 55, 3, -1, 3, 55, 3, 55, 3, -1, -1, 43, 3, -1, -1, 51, -1, 47, -1, 36, 85, 37, -1, 85, 40, 86, -1, 86, -1, 31, 46, 87, -1, 26, 46, 88, -1, 21, 46, 89, -1, 13, 46, 3, -1, 27, 46, 3, -1, 18, -1, 19, -1, 16, -1, 32, -1, 28, -1, 24, -1, 18, -1, 25, -1, 30, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 81, 81, 82, 83, 84, 85, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 106, 108, 108, 112, 113, 123, 124, 127, 128, 131, 133, 134, 135, 136, 137, 138, 139, 140, 141, 144, 145, 146, 149, 156, 158, 166, 168, 170, 173, 180, 182, 184, 187, 190, 192, 193, 196, 197, 198, 199, 202, 203, 204, 205, 206, 207, 210, 213, 214, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 229, 230, 231, 232, 235, 238, 239, 240, 241, 242, 243, 244, 245, 248, 249, 250, 254, 255, 258, 259, 260, 263, 266, 267, 270, 271, 272, 273, 274, 277, 278, 279, 280, 283, 284, 287, 288, 289 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "STRING", "ARCH_", "ARRAY_", "BIG_", "BIGENDIAN_", "BIN_", "BINKEY_", "BINCOL_", "BITPIX_", "COL_", "DIM_", "DIMS_", "ECLIPTIC_", "ENDIAN_", "EQUATORIAL_", "GALACTIC_", "KEY_", "LAYOUT_", "LITTLE_", "LITTLEENDIAN_", "NESTED_", "NORTH_", "ORDER_", "QUAD_", "RING_", "SKIP_", "SOUTH_", "SYSTEM_", "UNKNOWN_", "XDIM_", "YDIM_", "ZDIM_", "'['", "']'", "'('", "')'", "','", "'p'", "'P'", "':'", "'@'", "'*'", "'='", "'b'", "'s'", "'u'", "'i'", "'l'", "'r'", "'f'", "'d'", "'.'", "$accept", "command", "@1", "@2", "filename", "ext", "extb", "sect", "sectb", "physical", "rangex", "rangey", "rangexy", "rangez", "block", "bin", "binb", "binword", "binkey", "arrs", "arrsb", "arr", "endian", "array", "atype", "adims", "askip", "aendian", "hpxs", "hpxsb", "hpx", "hpxSystem", "hpxOrder", "hpxLayout", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 91, 93, 40, 41, 44, 112, 80, 58, 64, 42, 61, 98, 115, 117, 105, 108, 114, 102, 100, 46 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 57, 59, 57, 60, 60, 61, 61, 62, 62, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 69, 69, 69, 70, 71, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 85, 85, 86, 86, 86, 86, 86, 87, 87, 87, 87, 88, 88, 89, 89, 89 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 2, 3, 2, 5, 3, 4, 4, 2, 3, 3, 5, 3, 4, 4, 2, 3, 3, 5, 2, 3, 3, 0, 8, 0, 3, 0, 1, 3, 3, 2, 2, 4, 3, 5, 5, 7, 3, 1, 3, 3, 5, 0, 1, 1, 3, 3, 1, 3, 3, 1, 5, 3, 3, 1, 1, 3, 3, 2, 1, 1, 1, 1, 5, 3, 7, 5, 3, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 5, 0, 2, 0, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 26, 29, 0, 2, 0, 1, 0, 3, 5, 10, 21, 17, 27, 0, 0, 0, 24, 84, 85, 61, 62, 63, 0, 0, 0, 0, 0, 64, 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 49, 0, 44, 0, 40, 0, 0, 0, 73, 83, 0, 107, 0, 4, 7, 14, 0, 12, 23, 19, 0, 11, 22, 18, 31, 33, 0, 0, 30, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 46, 0, 0, 0, 58, 70, 0, 0, 60, 71, 0, 105, 0, 0, 9, 16, 8, 15, 47, 48, 81, 0, 79, 111, 77, 78, 82, 119, 120, 121, 110, 118, 117, 109, 112, 80, 115, 113, 114, 116, 108, 74, 75, 76, 6, 13, 20, 34, 57, 52, 35, 39, 57, 56, 42, 41, 0, 0, 59, 72, 106, 0, 89, 90, 91, 92, 93, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 66, 69, 0, 53, 0, 97, 100, 50, 51, 37, 36, 54, 55, 0, 43, 0, 0, 25, 0, 0, 102, 0, 68, 65, 0, 98, 101, 104, 103, 88, 38, 0, 0, 67, 99 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 3, 70, 5, 4, 8, 40, 9, 41, 91, 42, 140, 43, 144, 141, 10, 44, 45, 98, 11, 46, 47, 48, 160, 161, 174, 188, 197, 12, 49, 50, 130, 123, 120 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -114 static const yytype_int16 yypact[] = { 60, -114, -114, 10, -9, 44, -114, 8, 27, 29, 45, 45, 45, -114, 105, 49, 37, -114, -114, -114, -114, -114, -114, 55, 68, 82, 92, 94, -114, 119, -114, -114, 123, 132, 136, 137, 147, 148, 149, -114, 59, 75, 52, 156, 160, 36, 110, -114, -114, 139, -114, 46, 162, 45, 45, 98, -114, -114, -114, -1, -114, -114, -114, -114, -114, 196, 197, -114, -114, 77, 163, 199, 200, 201, 202, 77, 72, 102, 203, 204, 152, 205, 206, 207, 79, 67, 174, 175, 176, -114, -114, 177, 30, 33, -114, 178, 211, 20, -114, -114, 129, -114, 67, 146, -114, -114, -114, -114, -114, 172, -114, 138, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, -114, 117, -114, 179, -114, 131, -114, -114, 180, 213, 114, -114, -114, -114, 218, -114, -114, -114, -114, -114, -114, -114, -114, 183, 220, 221, 222, 33, 223, 224, 42, 188, -114, 225, -114, 193, 181, 189, -114, -114, -114, 191, -114, -114, 131, -114, 229, 141, -114, 231, 232, 88, 42, -114, -114, 233, 184, -114, -114, -114, -114, -114, 208, 235, -114, -114 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -114, -114, -114, -114, -114, -114, -114, -7, 209, -114, -114, -114, -114, -113, -93, 0, 210, -114, 143, 234, -114, 142, -43, -114, -114, -114, -114, -114, -2, -114, 144, -114, -114, -114 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -29 static const yytype_int16 yytable[] = { 145, 52, 84, 60, 61, 62, 54, 58, 53, 56, 6, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 95, 27, 110, 7, 28, 29, 30, 31, 116, 138, 32, 33, 142, 34, 88, 35, 95, 36, 37, 38, 39, 181, 106, 107, 13, 84, 105, 177, 104, 39, 182, 20, 21, 22, 96, 24, -28, 1, 84, 51, 2, 55, 28, 29, 20, 21, 22, 178, 32, 33, 96, 139, 198, 35, 143, 28, 24, 59, 97, 69, 18, 19, 67, 143, 29, 68, 117, 39, 92, 32, 33, 85, -28, 118, 35, 30, 31, 71, 119, 16, 39, 18, 19, 20, 21, 22, 23, 24, 25, 26, 72, 27, 89, 90, 28, 29, 30, 31, 65, 66, 32, 33, 121, 34, 73, 35, 122, 36, 37, 38, 16, 195, 18, 19, 74, 196, 75, 23, 63, 25, 26, 64, 27, 99, 65, 66, 100, 30, 31, 169, 170, 20, 21, 22, 34, 24, 162, 163, 36, 37, 38, 76, 28, 29, 126, 77, 127, 128, 32, 33, 165, 166, 101, 35, 78, 102, 191, 192, 79, 80, 129, 152, 153, 154, 155, 156, 157, 158, 159, 81, 82, 83, 93, 94, 103, 108, 109, 111, 112, 113, 114, 115, 124, 125, 131, 132, 133, 134, 135, 136, 137, 147, 151, 168, 146, 164, 167, 171, 172, 173, 175, 176, 179, 180, 183, 184, 185, 189, 187, 190, 193, 194, 186, 199, 202, 200, 148, 0, 149, 57, 0, 0, 150, 201, 0, 86, 87 }; static const yytype_int16 yycheck[] = { 93, 8, 3, 10, 11, 12, 8, 9, 8, 9, 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4, 17, 69, 36, 20, 21, 22, 23, 75, 3, 26, 27, 3, 29, 40, 31, 4, 33, 34, 35, 45, 3, 53, 54, 4, 3, 52, 164, 52, 45, 167, 9, 10, 11, 38, 13, 0, 1, 3, 36, 4, 36, 20, 21, 9, 10, 11, 164, 26, 27, 38, 45, 189, 31, 45, 20, 13, 36, 46, 46, 7, 8, 37, 45, 21, 40, 18, 45, 40, 26, 27, 36, 36, 25, 31, 22, 23, 46, 30, 5, 45, 7, 8, 9, 10, 11, 12, 13, 14, 15, 46, 17, 41, 42, 20, 21, 22, 23, 43, 44, 26, 27, 24, 29, 46, 31, 28, 33, 34, 35, 5, 47, 7, 8, 46, 51, 46, 12, 37, 14, 15, 40, 17, 37, 43, 44, 40, 22, 23, 39, 40, 9, 10, 11, 29, 13, 43, 44, 33, 34, 35, 46, 20, 21, 16, 46, 18, 19, 26, 27, 43, 44, 37, 31, 46, 40, 39, 40, 46, 46, 32, 47, 48, 49, 50, 51, 52, 53, 54, 46, 46, 46, 40, 37, 36, 3, 3, 38, 3, 3, 3, 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 4, 44, 4, 40, 40, 40, 3, 39, 3, 3, 3, 3, 3, 40, 4, 37, 40, 43, 4, 3, 3, 55, 4, 3, 55, 97, -1, 100, 9, -1, -1, 102, 39, -1, 40, 40 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 1, 4, 57, 60, 59, 0, 36, 61, 63, 71, 75, 84, 4, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 20, 21, 22, 23, 26, 27, 29, 31, 33, 34, 35, 45, 62, 64, 66, 68, 72, 73, 76, 77, 78, 85, 86, 36, 63, 71, 84, 36, 71, 75, 84, 36, 63, 63, 63, 37, 40, 43, 44, 37, 40, 46, 58, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 3, 36, 64, 72, 84, 41, 42, 65, 40, 40, 37, 4, 38, 46, 74, 37, 40, 37, 40, 36, 71, 84, 63, 63, 3, 3, 78, 38, 3, 3, 3, 3, 78, 18, 25, 30, 89, 24, 28, 88, 3, 3, 16, 18, 19, 32, 87, 3, 3, 3, 37, 37, 37, 37, 3, 45, 67, 70, 3, 45, 69, 70, 40, 4, 74, 77, 86, 44, 47, 48, 49, 50, 51, 52, 53, 54, 79, 80, 43, 44, 40, 43, 44, 40, 4, 39, 40, 3, 39, 3, 81, 3, 3, 69, 70, 3, 3, 3, 69, 40, 4, 37, 55, 43, 82, 40, 4, 39, 40, 3, 3, 47, 51, 83, 69, 4, 55, 39, 3 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (ff, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, ff, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* ff, ffFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, ff, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* ff; ffFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (ff); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, FitsFile* ff, ffFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, ff, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; FitsFile* ff; ffFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, ff, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, FitsFile* ff, ffFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, ff, ll) YYSTYPE *yyvsp; int yyrule; FitsFile* ff; ffFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , ff, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, ff, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, FitsFile* ff, ffFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, ff, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; FitsFile* ff; ffFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (ff); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (FitsFile* ff, ffFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (FitsFile* ff, ffFlexLexer* ll) #else int yyparse (ff, ll) FitsFile* ff; ffFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 24: #line 106 "fitsy++/parser.Y" {GOTOARR(0);} break; case 26: #line 108 "fitsy++/parser.Y" {GOTOFILT(0);} break; case 27: #line 109 "fitsy++/parser.Y" {ff->setValid(1);ff->setpFilter(ff_filter);;} break; case 29: #line 113 "fitsy++/parser.Y" {ff->setpName((yyvsp[(1) - (1)].str));;} break; case 30: #line 123 "fitsy++/parser.Y" {ff->setpExt((yyvsp[(2) - (3)].str));;} break; case 31: #line 124 "fitsy++/parser.Y" {ff->setpIndex((yyvsp[(2) - (3)].integer));;} break; case 32: #line 127 "fitsy++/parser.Y" {ff->setpExt((yyvsp[(1) - (2)].str));;} break; case 33: #line 128 "fitsy++/parser.Y" {ff->setpIndex((yyvsp[(1) - (2)].integer));;} break; case 44: #line 144 "fitsy++/parser.Y" {ff->setpcoord(0);;} break; case 45: #line 145 "fitsy++/parser.Y" {ff->setpcoord(1);;} break; case 46: #line 146 "fitsy++/parser.Y" {ff->setpcoord(1);;} break; case 47: #line 150 "fitsy++/parser.Y" { // this is not a mistake // need to fool parser into processing "xy0:xy1,block" ff->setpxmin((yyvsp[(1) - (3)].integer)); ff->setpxmax((yyvsp[(3) - (3)].integer)); ff->setpxvalid(1); ff->setpymin((yyvsp[(1) - (3)].integer)); ff->setpymax((yyvsp[(3) - (3)].integer)); ff->setpyvalid(1); ;} break; case 48: #line 157 "fitsy++/parser.Y" {ff->setpxmin((yyvsp[(3) - (3)].integer)-(yyvsp[(1) - (3)].integer)/2); ff->setpxmax((yyvsp[(3) - (3)].integer)+(yyvsp[(1) - (3)].integer)/2); ff->setpxvalid(1);;} break; case 49: #line 159 "fitsy++/parser.Y" { // this is not a mistake // need to fool parser into processing "*,block" ff->setpxvalid(0); ff->setpyvalid(0); ;} break; case 50: #line 167 "fitsy++/parser.Y" {ff->setpymin((yyvsp[(1) - (3)].integer)); ff->setpymax((yyvsp[(3) - (3)].integer)); ff->setpyvalid(1);;} break; case 51: #line 169 "fitsy++/parser.Y" {ff->setpymin((yyvsp[(3) - (3)].integer)-(yyvsp[(1) - (3)].integer)/2); ff->setpymax((yyvsp[(3) - (3)].integer)+(yyvsp[(1) - (3)].integer)/2); ff->setpyvalid(1);;} break; case 52: #line 170 "fitsy++/parser.Y" {ff->setpyvalid(0);;} break; case 53: #line 174 "fitsy++/parser.Y" { ff->setpxmin((yyvsp[(3) - (5)].integer)-(yyvsp[(1) - (5)].integer)/2); ff->setpxmax((yyvsp[(3) - (5)].integer)+(yyvsp[(1) - (5)].integer)/2); ff->setpxvalid(1); ff->setpymin((yyvsp[(5) - (5)].integer)-(yyvsp[(1) - (5)].integer)/2); ff->setpymax((yyvsp[(5) - (5)].integer)+(yyvsp[(1) - (5)].integer)/2); ff->setpyvalid(1); ;} break; case 54: #line 181 "fitsy++/parser.Y" {ff->setpzmin((yyvsp[(1) - (3)].integer)); ff->setpzmax((yyvsp[(3) - (3)].integer)); ff->setpzvalid(1);;} break; case 55: #line 183 "fitsy++/parser.Y" {ff->setpzmin((yyvsp[(3) - (3)].integer)-(yyvsp[(1) - (3)].integer)/2); ff->setpzmax((yyvsp[(3) - (3)].integer)+(yyvsp[(1) - (3)].integer)/2); ff->setpzvalid(1);;} break; case 56: #line 184 "fitsy++/parser.Y" {ff->setpzvalid(0);;} break; case 57: #line 187 "fitsy++/parser.Y" {ff->setpblock((yyvsp[(1) - (1)].integer)); ff->setpbvalid(1);;} break; case 65: #line 202 "fitsy++/parser.Y" {ff->setpBinXY((yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].str));;} break; case 66: #line 203 "fitsy++/parser.Y" {ff->setpBinXY((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].str));;} break; case 67: #line 204 "fitsy++/parser.Y" {ff->setpBinXYZ((yyvsp[(2) - (7)].str),(yyvsp[(4) - (7)].str),(yyvsp[(6) - (7)].str));;} break; case 68: #line 205 "fitsy++/parser.Y" {ff->setpBinXYZ((yyvsp[(1) - (5)].str),(yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].str));;} break; case 69: #line 206 "fitsy++/parser.Y" {ff->setpBinZ((yyvsp[(2) - (3)].str));;} break; case 70: #line 207 "fitsy++/parser.Y" {ff->setpBinZ((yyvsp[(1) - (1)].str));;} break; case 74: #line 217 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(3) - (3)].integer));;} break; case 75: #line 218 "fitsy++/parser.Y" {ff->setpHeight((yyvsp[(3) - (3)].integer));;} break; case 76: #line 219 "fitsy++/parser.Y" {ff->setpDepth((yyvsp[(3) - (3)].integer));;} break; case 77: #line 220 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(3) - (3)].integer));ff->setpHeight((yyvsp[(3) - (3)].integer));;} break; case 78: #line 221 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(3) - (3)].integer));ff->setpHeight((yyvsp[(3) - (3)].integer));;} break; case 79: #line 222 "fitsy++/parser.Y" {ff->setpBitpix((yyvsp[(3) - (3)].integer));;} break; case 80: #line 223 "fitsy++/parser.Y" {ff->setpSkip((yyvsp[(3) - (3)].integer));;} break; case 81: #line 224 "fitsy++/parser.Y" {ff->setpArch((FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 82: #line 225 "fitsy++/parser.Y" {ff->setpArch((FitsFile::ArchType)(yyvsp[(3) - (3)].integer));;} break; case 83: #line 226 "fitsy++/parser.Y" {ff->setpArch((FitsFile::ArchType)(yyvsp[(1) - (1)].integer));;} break; case 84: #line 229 "fitsy++/parser.Y" {(yyval.integer) = FitsFile::BIG;;} break; case 85: #line 230 "fitsy++/parser.Y" {(yyval.integer) = FitsFile::BIG;;} break; case 86: #line 231 "fitsy++/parser.Y" {(yyval.integer) = FitsFile::LITTLE;;} break; case 87: #line 232 "fitsy++/parser.Y" {(yyval.integer) = FitsFile::LITTLE;;} break; case 89: #line 238 "fitsy++/parser.Y" {ff->setpBitpix(8);;} break; case 90: #line 239 "fitsy++/parser.Y" {ff->setpBitpix(16);;} break; case 91: #line 240 "fitsy++/parser.Y" {ff->setpBitpix(-16);;} break; case 92: #line 241 "fitsy++/parser.Y" {ff->setpBitpix(32);;} break; case 93: #line 242 "fitsy++/parser.Y" {ff->setpBitpix(64);;} break; case 94: #line 243 "fitsy++/parser.Y" {ff->setpBitpix(-32);;} break; case 95: #line 244 "fitsy++/parser.Y" {ff->setpBitpix(-32);;} break; case 96: #line 245 "fitsy++/parser.Y" {ff->setpBitpix(-64);;} break; case 97: #line 248 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(1) - (1)].integer));ff->setpHeight((yyvsp[(1) - (1)].integer));;} break; case 98: #line 249 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(1) - (3)].integer));ff->setpHeight((yyvsp[(3) - (3)].integer));;} break; case 99: #line 251 "fitsy++/parser.Y" {ff->setpWidth((yyvsp[(1) - (5)].integer));ff->setpHeight((yyvsp[(3) - (5)].integer));ff->setpDepth((yyvsp[(5) - (5)].integer));;} break; case 101: #line 255 "fitsy++/parser.Y" {ff->setpSkip((yyvsp[(2) - (2)].integer));;} break; case 103: #line 259 "fitsy++/parser.Y" {ff->setpArch(FitsFile::LITTLE);;} break; case 104: #line 260 "fitsy++/parser.Y" {ff->setpArch(FitsFile::BIG);;} break; case 111: #line 273 "fitsy++/parser.Y" {ff->setpHPXColumn((yyvsp[(3) - (3)].integer));;} break; case 112: #line 274 "fitsy++/parser.Y" {ff->setpHPXQuad((yyvsp[(3) - (3)].integer));;} break; case 113: #line 277 "fitsy++/parser.Y" {ff->setpHPXSystem(FitsHPX::EQU);;} break; case 114: #line 278 "fitsy++/parser.Y" {ff->setpHPXSystem(FitsHPX::GAL);;} break; case 115: #line 279 "fitsy++/parser.Y" {ff->setpHPXSystem(FitsHPX::ECL);;} break; case 116: #line 280 "fitsy++/parser.Y" {ff->setpHPXSystem(FitsHPX::UNKNOWN);;} break; case 117: #line 283 "fitsy++/parser.Y" {ff->setpHPXOrder(FitsHPX::RING);;} break; case 118: #line 284 "fitsy++/parser.Y" {ff->setpHPXOrder(FitsHPX::NESTED);;} break; case 119: #line 287 "fitsy++/parser.Y" {ff->setpHPXLayout(FitsHPX::EQUATOR);;} break; case 120: #line 288 "fitsy++/parser.Y" {ff->setpHPXLayout(FitsHPX::NORTH);;} break; case 121: #line 289 "fitsy++/parser.Y" {ff->setpHPXLayout(FitsHPX::SOUTH);;} break; /* Line 1267 of yacc.c. */ #line 1979 "fitsy++/parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (ff, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (ff, ll, yymsg); } else { yyerror (ff, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, ff, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, ff, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (ff, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, ff, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, ff, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 292 "fitsy++/parser.Y" saods9/tksao1.0/fitsy++/parser.H000644 000765 000000 00000006622 12612461721 016625 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, STRING = 259, ARCH_ = 260, ARRAY_ = 261, BIG_ = 262, BIGENDIAN_ = 263, BIN_ = 264, BINKEY_ = 265, BINCOL_ = 266, BITPIX_ = 267, COL_ = 268, DIM_ = 269, DIMS_ = 270, ECLIPTIC_ = 271, ENDIAN_ = 272, EQUATORIAL_ = 273, GALACTIC_ = 274, KEY_ = 275, LAYOUT_ = 276, LITTLE_ = 277, LITTLEENDIAN_ = 278, NESTED_ = 279, NORTH_ = 280, ORDER_ = 281, QUAD_ = 282, RING_ = 283, SKIP_ = 284, SOUTH_ = 285, SYSTEM_ = 286, UNKNOWN_ = 287, XDIM_ = 288, YDIM_ = 289, ZDIM_ = 290 }; #endif /* Tokens. */ #define INT 258 #define STRING 259 #define ARCH_ 260 #define ARRAY_ 261 #define BIG_ 262 #define BIGENDIAN_ 263 #define BIN_ 264 #define BINKEY_ 265 #define BINCOL_ 266 #define BITPIX_ 267 #define COL_ 268 #define DIM_ 269 #define DIMS_ 270 #define ECLIPTIC_ 271 #define ENDIAN_ 272 #define EQUATORIAL_ 273 #define GALACTIC_ 274 #define KEY_ 275 #define LAYOUT_ 276 #define LITTLE_ 277 #define LITTLEENDIAN_ 278 #define NESTED_ 279 #define NORTH_ 280 #define ORDER_ 281 #define QUAD_ 282 #define RING_ 283 #define SKIP_ 284 #define SOUTH_ 285 #define SYSTEM_ 286 #define UNKNOWN_ 287 #define XDIM_ 288 #define YDIM_ 289 #define ZDIM_ 290 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 32 "fitsy++/parser.Y" { float real; int integer; char str[256]; void* ptr; } /* Line 1529 of yacc.c. */ #line 126 "fitsy++/parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/fitsy++/parser.Y000644 000765 000000 00000014467 12617214651 016657 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {FitsFile* ff} %lex-param {ffFlexLexer* ll} %parse-param {ffFlexLexer* ll} %{ #define YYDEBUG 1 #define GOTOFILT(x) {yyclearin; ffFilter(x);} #define GOTOARR(x) {yyclearin; ffArray(x);} #include "file.h" #include "hpx.h" #undef yyFlexLexer #define yyFlexLexer ffFlexLexer #include extern int fflex(void*, ffFlexLexer*); extern void fferror(FitsFile*, ffFlexLexer*, const char*); char ff_filter[512]; extern void ffFilter(int); extern void ffArray(int); %} %union { float real; int integer; char str[256]; void* ptr; } %type endian %token INT %token STRING %token ARCH_ %token ARRAY_ %token BIG_ %token BIGENDIAN_ %token BIN_ %token BINKEY_ %token BINCOL_ %token BITPIX_ %token COL_ %token DIM_ %token DIMS_ %token ECLIPTIC_ %token ENDIAN_ %token EQUATORIAL_ %token GALACTIC_ %token KEY_ %token LAYOUT_ %token LITTLE_ %token LITTLEENDIAN_ %token NESTED_ %token NORTH_ %token ORDER_ %token QUAD_ %token RING_ %token SKIP_ %token SOUTH_ %token SYSTEM_ %token UNKNOWN_ %token XDIM_ %token YDIM_ %token ZDIM_ %% //start: {yydebug=1;} command // assume any error is the start of a filter command : filename | filename ext | filename ext sect | filename sect | filename '[' extb sectb ']' | filename ext bin | filename ext bin sect | filename ext sect bin | filename bin | filename bin sect | filename sect bin | filename '[' extb binb ']' | filename ext hpxs | filename ext hpxs sect | filename ext sect hpxs | filename hpxs | filename hpxs sect | filename sect hpxs | filename '[' extb hpxs ']' | filename arrs | filename arrs sect | filename sect arrs | filename '[' ARRAY_ {GOTOARR(0)} '(' array ')' ']' | error {GOTOFILT(0)} STRING {ff->setValid(1);ff->setpFilter(ff_filter);} ; filename : /* empty */ | STRING {ff->setpName($1);} ; // we must do it this way so that a bare filter will be accepted //ext : '[' extb ']' // ; //extb : STRING {ff->setpExt($1);} // | INT {ff->setpIndex($1);} // ; ext : '[' STRING ']' {ff->setpExt($2);} | '[' INT ']' {ff->setpIndex($2);} ; extb : STRING ',' {ff->setpExt($1);} | INT ',' {ff->setpIndex($1);} ; sect : '[' sectb physical ']' sectb : rangex ',' rangey | rangex ',' rangey ',' block | rangex ',' rangey ',' rangez | rangex ',' rangey ',' block ',' rangez | rangex ',' block | rangexy | rangexy ',' block | rangexy ',' rangez | rangexy ',' block ',' rangez ; physical : /* empty */ {ff->setpcoord(0);} | 'p' {ff->setpcoord(1);} | 'P' {ff->setpcoord(1);} ; rangex : INT ':' INT { // this is not a mistake // need to fool parser into processing "xy0:xy1,block" ff->setpxmin($1); ff->setpxmax($3); ff->setpxvalid(1); ff->setpymin($1); ff->setpymax($3); ff->setpyvalid(1); } | INT '@' INT {ff->setpxmin($3-$1/2); ff->setpxmax($3+$1/2); ff->setpxvalid(1);} | '*' { // this is not a mistake // need to fool parser into processing "*,block" ff->setpxvalid(0); ff->setpyvalid(0); } ; rangey : INT ':' INT {ff->setpymin($1); ff->setpymax($3); ff->setpyvalid(1);} | INT '@' INT {ff->setpymin($3-$1/2); ff->setpymax($3+$1/2); ff->setpyvalid(1);} | '*' {ff->setpyvalid(0);} ; rangexy : INT '@' INT '@' INT { ff->setpxmin($3-$1/2); ff->setpxmax($3+$1/2); ff->setpxvalid(1); ff->setpymin($5-$1/2); ff->setpymax($5+$1/2); ff->setpyvalid(1); } ; rangez : INT ':' INT {ff->setpzmin($1); ff->setpzmax($3); ff->setpzvalid(1);} | INT '@' INT {ff->setpzmin($3-$1/2); ff->setpzmax($3+$1/2); ff->setpzvalid(1);} | '*' {ff->setpzvalid(0);} ; block : INT {ff->setpblock($1); ff->setpbvalid(1);} ; bin : '[' binb ']' binb : binword '=' binkey | binword binkey ; binword : BIN_ | BINKEY_ | BINCOL_ | KEY_ ; binkey : '(' STRING ',' STRING ')' {ff->setpBinXY($2,$4);} | STRING ',' STRING {ff->setpBinXY($1,$3);} | '(' STRING ',' STRING ',' STRING ')' {ff->setpBinXYZ($2,$4,$6);} | STRING ',' STRING ',' STRING {ff->setpBinXYZ($1,$3,$5);} | '(' STRING ')' {ff->setpBinZ($2);} | STRING {ff->setpBinZ($1);} ; arrs : '[' arrsb ']' ; arrsb : arrsb ',' arr | arr ; arr : XDIM_ '=' INT {ff->setpWidth($3);} | YDIM_ '=' INT {ff->setpHeight($3);} | ZDIM_ '=' INT {ff->setpDepth($3);} | DIM_ '=' INT {ff->setpWidth($3);ff->setpHeight($3);} | DIMS_ '=' INT {ff->setpWidth($3);ff->setpHeight($3);} | BITPIX_ '=' INT {ff->setpBitpix($3);} | SKIP_ '=' INT {ff->setpSkip($3);} | ARCH_ '=' endian {ff->setpArch((FitsFile::ArchType)$3);} | ENDIAN_ '=' endian {ff->setpArch((FitsFile::ArchType)$3);} | endian {ff->setpArch((FitsFile::ArchType)$1);} ; endian : BIG_ {$$ = FitsFile::BIG;} | BIGENDIAN_ {$$ = FitsFile::BIG;} | LITTLE_ {$$ = FitsFile::LITTLE;} | LITTLEENDIAN_ {$$ = FitsFile::LITTLE;} ; array : atype adims askip aendian ; atype : 'b' {ff->setpBitpix(8);} | 's' {ff->setpBitpix(16);} | 'u' {ff->setpBitpix(-16);} | 'i' {ff->setpBitpix(32);} | 'l' {ff->setpBitpix(64);} | 'r' {ff->setpBitpix(-32);} | 'f' {ff->setpBitpix(-32);} | 'd' {ff->setpBitpix(-64);} ; adims : INT {ff->setpWidth($1);ff->setpHeight($1);} | INT '.' INT {ff->setpWidth($1);ff->setpHeight($3);} | INT '.' INT '.' INT {ff->setpWidth($1);ff->setpHeight($3);ff->setpDepth($5);} ; askip : /* empty */ | ':' INT {ff->setpSkip($2);} ; aendian : /* empty */ | 'l' {ff->setpArch(FitsFile::LITTLE);} | 'b' {ff->setpArch(FitsFile::BIG);} ; hpxs : '[' hpxsb ']' ; hpxsb : hpxsb ',' hpx | hpx ; hpx : SYSTEM_ '=' hpxSystem | ORDER_ '=' hpxOrder | LAYOUT_ '=' hpxLayout | COL_ '=' INT {ff->setpHPXColumn($3);} | QUAD_ '=' INT {ff->setpHPXQuad($3);} ; hpxSystem : EQUATORIAL_ {ff->setpHPXSystem(FitsHPX::EQU);} | GALACTIC_ {ff->setpHPXSystem(FitsHPX::GAL);} | ECLIPTIC_ {ff->setpHPXSystem(FitsHPX::ECL);} | UNKNOWN_ {ff->setpHPXSystem(FitsHPX::UNKNOWN);} ; hpxOrder : RING_ {ff->setpHPXOrder(FitsHPX::RING);} | NESTED_ {ff->setpHPXOrder(FitsHPX::NESTED);} ; hpxLayout : EQUATORIAL_ {ff->setpHPXLayout(FitsHPX::EQUATOR);} | NORTH_ {ff->setpHPXLayout(FitsHPX::NORTH);} | SOUTH_ {ff->setpHPXLayout(FitsHPX::SOUTH);} ; %% saods9/tksao1.0/fitsy++/photo.C000644 000765 000000 00000006567 12464214754 016474 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include #include "photo.h" FitsPhoto::FitsPhoto(Tcl_Interp* interp, const char* ph) { // reset valid_ = 0; if (*ph == '\0') { Tcl_AppendResult(interp, "bad image name ", NULL); return; } Tk_PhotoHandle photo = Tk_FindPhoto(interp, ph); if (!photo) { Tcl_AppendResult(interp, "bad image handle ", NULL); return; } Tk_PhotoImageBlock block; if (!Tk_PhotoGetImage(photo,&block)) { Tcl_AppendResult(interp, "bad image block ", NULL); return; } int width =0; int height =0; Tk_PhotoGetSize(photo, &width, &height); // new header head_ = new FitsHead(width, height, 1, 8); if (!head_->isValid()) return; size_t size = (size_t)width*height; unsigned char* dest = new unsigned char[size]; data_ = dest; dataSize_ = size; dataSkip_ = 0; unsigned char* src = block.pixelPtr; for (int jj=height-1; jj>=0; jj--) for (int ii=0; iiisValid()) return; size_t size = (size_t)width*height*depth; unsigned char* dest = new unsigned char[size]; data_ = dest; dataSize_ = size; dataSkip_ = 0; unsigned char* src = block.pixelPtr; for (int kk=0; kk=0; jj--) { for (int ii=0; iiprimary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = head_->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; return; } saods9/tksao1.0/fitsy++/photo.h000644 000765 000000 00000001135 12464214754 016523 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsphoto_h__ #define __fitsphoto_h__ #include #include "vector.h" #include "file.h" class FitsPhoto : public FitsFile { public: FitsPhoto(Tcl_Interp* interp, const char*); ~FitsPhoto(); }; class FitsPhotoCube : public FitsFile { public: FitsPhotoCube(Tcl_Interp* interp, const char*); ~FitsPhotoCube(); }; class FitsPhotoCubeNext : public FitsFile { public: FitsPhotoCubeNext(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/plio.C000644 000765 000000 00000004317 12552005562 016266 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "plio.h" extern "C" { int pl_l2pi(short *ll_src, int xs, int *px_dst, int npix); } template FitsPliom::FitsPliom(FitsFile* fits) : FitsCompressm(fits) { FitsCompressm::uncompress(fits); } template int FitsPliom::compressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { double zs = FitsCompressm::bscale_; if (FitsCompressm::zscale_) zs = FitsCompressm::zscale_->value(sptr,0); double zz = FitsCompressm::bzero_; if (FitsCompressm::zzero_) zz = FitsCompressm::zzero_->value(sptr,0); int blank = FitsCompressm::blank_; if (FitsCompressm::zblank_) blank = (int)FitsCompressm::zblank_->value(sptr,0); int icnt=0; short* ibuf = (short*)((FitsBinColumnArray*)FitsCompressm::compress_)->get(heap, sptr, &icnt); // ibuf can be NULL if (!ibuf || !icnt) return 0; // swap if needed if (FitsCompressm::byteswap_) for (int ii=0; ii::tilesize_; int* obuf = new int[ocnt]; int cc = pl_l2pi(ibuf, 1, obuf, ocnt); if (cc != ocnt) { internalError("Fitsy++ plio error"); return 0; } int ll=0; for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii] = FitsCompressm::getValue(obuf+ll,zs,zz,blank); if (obuf) delete [] obuf; return 1; } template class FitsPliom; template class FitsPliom; template class FitsPliom; template class FitsPliom; template class FitsPliom; template class FitsPliom; template class FitsPliom; saods9/tksao1.0/fitsy++/plio.h000644 000765 000000 00000000645 12464214754 016342 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsplio_h__ #define __fitsplio_h__ #include "compress.h" template class FitsPliom : public FitsCompressm { private: int compressed(T*, char*, char*, int, int, int, int, int, int); public: FitsPliom(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/pliocomp.c000644 000765 000000 00000015654 10737246655 017230 0ustar00joyewheel000000 000000 /* stdlib is needed for the abs function */ #include /* The following prototype code was provided by Doug Tody, NRAO, for performing conversion between pixel arrays and line lists. The compression technique is used in IRAF. */ int pl_p2li (int *pxsrc, int xs, short *lldst, int npix); int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix); /* * PL_P2L -- Convert a pixel array to a line list. The length of the list is * returned as the function value. * * Translated from the SPP version using xc -f, f2c. 8Sep99 DCT. */ #ifndef min #define min(a,b) (((a)<(b))?(a):(b)) #endif #ifndef max #define max(a,b) (((a)>(b))?(a):(b)) #endif int pl_p2li (int *pxsrc, int xs, short *lldst, int npix) /* int *pxsrc; input pixel array */ /* int xs; starting index in pxsrc (?) */ /* short *lldst; encoded line list */ /* int npix; number of pixels to convert */ { /* System generated locals */ int ret_val, i__1, i__2, i__3; /* Local variables */ static int zero, v, x1, hi, ip, dv, xe, np, op, iz, nv, pv, nz; /* Parameter adjustments */ --lldst; --pxsrc; /* Function Body */ if (! (npix <= 0)) { goto L110; } ret_val = 0; goto L100; L110: lldst[3] = -100; lldst[2] = 7; lldst[1] = 0; lldst[6] = 0; lldst[7] = 0; xe = xs + npix - 1; op = 8; zero = 0; /* Computing MAX */ i__1 = zero, i__2 = pxsrc[xs]; pv = max(i__1,i__2); x1 = xs; iz = xs; hi = 1; i__1 = xe; for (ip = xs; ip <= i__1; ++ip) { if (! (ip < xe)) { goto L130; } /* Computing MAX */ i__2 = zero, i__3 = pxsrc[ip + 1]; nv = max(i__2,i__3); if (! (nv == pv)) { goto L140; } goto L120; L140: if (! (pv == 0)) { goto L150; } pv = nv; x1 = ip + 1; goto L120; L150: goto L131; L130: if (! (pv == 0)) { goto L160; } x1 = xe + 1; L160: L131: np = ip - x1 + 1; nz = x1 - iz; if (! (pv > 0)) { goto L170; } dv = pv - hi; if (! (dv != 0)) { goto L180; } hi = pv; if (! (abs(dv) > 4095)) { goto L190; } lldst[op] = (short) ((pv & 4095) + 4096); ++op; lldst[op] = (short) (pv / 4096); ++op; goto L191; L190: if (! (dv < 0)) { goto L200; } lldst[op] = (short) (-dv + 12288); goto L201; L200: lldst[op] = (short) (dv + 8192); L201: ++op; if (! (np == 1 && nz == 0)) { goto L210; } v = lldst[op - 1]; lldst[op - 1] = (short) (v | 16384); goto L91; L210: L191: L180: L170: if (! (nz > 0)) { goto L220; } L230: if (! (nz > 0)) { goto L232; } lldst[op] = (short) min(4095,nz); ++op; /* L231: */ nz += -4095; goto L230; L232: if (! (np == 1 && pv > 0)) { goto L240; } lldst[op - 1] = (short) (lldst[op - 1] + 20481); goto L91; L240: L220: L250: if (! (np > 0)) { goto L252; } lldst[op] = (short) (min(4095,np) + 16384); ++op; /* L251: */ np += -4095; goto L250; L252: L91: x1 = ip + 1; iz = x1; pv = nv; L120: ; } /* L121: */ lldst[4] = (short) ((op - 1) % 32768); lldst[5] = (short) ((op - 1) / 32768); ret_val = op - 1; goto L100; L100: return ret_val; } /* plp2li_ */ /* * PL_L2PI -- Translate a PLIO line list into an integer pixel array. * The number of pixels output (always npix) is returned as the function * value. * * Translated from the SPP version using xc -f, f2c. 8Sep99 DCT. */ int pl_l2pi (short *ll_src, int xs, int *px_dst, int npix) /* short *ll_src; encoded line list */ /* int xs; starting index in ll_src */ /* int *px_dst; output pixel array */ /* int npix; number of pixels to convert */ { /* System generated locals */ int ret_val, i__1, i__2; /* Local variables */ static int data, sw0001, otop, i__, lllen, i1, i2, x1, x2, ip, xe, np, op, pv, opcode, llfirt; static int skipwd; /* Parameter adjustments */ --px_dst; --ll_src; /* Function Body */ if (! (ll_src[3] > 0)) { goto L110; } lllen = ll_src[3]; llfirt = 4; goto L111; L110: lllen = (ll_src[5] << 15) + ll_src[4]; llfirt = ll_src[2] + 1; L111: if (! (npix <= 0 || lllen <= 0)) { goto L120; } ret_val = 0; goto L100; L120: xe = xs + npix - 1; skipwd = 0; op = 1; x1 = 1; pv = 1; i__1 = lllen; for (ip = llfirt; ip <= i__1; ++ip) { if (! skipwd) { goto L140; } skipwd = 0; goto L130; L140: opcode = ll_src[ip] / 4096; data = ll_src[ip] & 4095; sw0001 = opcode; goto L150; L160: x2 = x1 + data - 1; i1 = max(x1,xs); i2 = min(x2,xe); np = i2 - i1 + 1; if (! (np > 0)) { goto L170; } otop = op + np - 1; if (! (opcode == 4)) { goto L180; } i__2 = otop; for (i__ = op; i__ <= i__2; ++i__) { px_dst[i__] = pv; /* L190: */ } /* L191: */ goto L181; L180: i__2 = otop; for (i__ = op; i__ <= i__2; ++i__) { px_dst[i__] = 0; /* L200: */ } /* L201: */ if (! (opcode == 5 && i2 == x2)) { goto L210; } px_dst[otop] = pv; L210: L181: op = otop + 1; L170: x1 = x2 + 1; goto L151; L220: pv = (ll_src[ip + 1] << 12) + data; skipwd = 1; goto L151; L230: pv += data; goto L151; L240: pv -= data; goto L151; L250: pv += data; goto L91; L260: pv -= data; L91: if (! (x1 >= xs && x1 <= xe)) { goto L270; } px_dst[op] = pv; ++op; L270: ++x1; goto L151; L150: ++sw0001; if (sw0001 < 1 || sw0001 > 8) { goto L151; } switch ((int)sw0001) { case 1: goto L160; case 2: goto L220; case 3: goto L230; case 4: goto L240; case 5: goto L160; case 6: goto L160; case 7: goto L250; case 8: goto L260; } L151: if (! (x1 > xe)) { goto L280; } goto L131; L280: L130: ; } L131: i__1 = npix; for (i__ = op; i__ <= i__1; ++i__) { px_dst[i__] = 0; /* L290: */ } /* L291: */ ret_val = npix; goto L100; L100: return ret_val; } /* pll2pi_ */ saods9/tksao1.0/fitsy++/rice.C000644 000765 000000 00000010256 12552005562 016244 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include "rice.h" extern "C" { int fits_rdecomp (unsigned char *c, int clen, unsigned int array[], int nx, int nblock); int fits_rdecomp_short (unsigned char *c, int clen, unsigned short array[], int nx, int nblock); int fits_rdecomp_byte (unsigned char *c, int clen, unsigned char array[], int nx, int nblock); } template FitsRicem::FitsRicem(FitsFile* fits) : FitsCompressm(fits) { // rice parameters block_ = 32; bytepix_ = 4; noisebit_ = 4; char name[] = "ZNAME "; char val[] = "ZVAL "; for (int ii=0; ii<9; ii++) { name[5] = '0'+ii; val[4] = '0'+ii; if (fits->find(name)) { char* which = fits->getString(name); if (!strncmp(which,"BLOCK",4)) block_ = fits->getInteger(val,32); else if (!strncmp(which,"BYTEPIX",4)) bytepix_ = fits->getInteger(val,4); else if (!strncmp(which,"NOISEBIT",4)) noisebit_ = fits->getInteger(val,4); delete [] which; } } FitsCompressm::uncompress(fits); } template int FitsRicem::compressed(T* dest, char* sptr, char* heap, int kkstart, int kkstop, int jjstart, int jjstop, int iistart, int iistop) { double zs = FitsCompressm::bscale_; if (FitsCompressm::zscale_) zs = FitsCompressm::zscale_->value(sptr,0); double zz = FitsCompressm::bzero_; if (FitsCompressm::zzero_) zz = FitsCompressm::zzero_->value(sptr,0); int blank = FitsCompressm::blank_; if (FitsCompressm::zblank_) blank = (int)FitsCompressm::zblank_->value(sptr,0); int icnt=0; unsigned char* ibuf = (unsigned char*)((FitsBinColumnArray*)FitsCompressm::compress_)->get(heap, sptr, &icnt); // ibuf can be NULL if (!ibuf || !icnt) return 0; int ocnt = FitsCompressm::tilesize_; int ll=0; switch (bytepix_) { case 1: { char* obuf = new char[ocnt]; if (fits_rdecomp_byte(ibuf, icnt, (unsigned char*)obuf, ocnt, block_)) { internalError("Fitsy++ rice bad inflate result"); return 0; } for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val = FitsCompressm::getValue(obuf+ll,zs,zz,blank); dest[id] = val; } if (obuf) delete [] obuf; } break; case 2: { short* obuf = new short[ocnt]; if (fits_rdecomp_short(ibuf, icnt, (unsigned short*)obuf, ocnt, block_)) { internalError("Fitsy++ rice bad inflate result"); return 0; } for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val = FitsCompressm::getValue(obuf+ll,zs,zz,blank); dest[id] = val; } if (obuf) delete [] obuf; } break; case 4: { int* obuf = new int[ocnt]; if (fits_rdecomp(ibuf, icnt, (unsigned int*)obuf, ocnt, block_)) { internalError("Fitsy++ rice bad inflate result"); return 0; } for (int kk=kkstart; kk::width_*FitsCompressm::height_ + jj*FitsCompressm::width_ + ii; T val = FitsCompressm::getValue(obuf+ll,zs,zz,blank); dest[id] = val; } if (obuf) delete [] obuf; } break; } return 1; } template class FitsRicem; template class FitsRicem; template class FitsRicem; template class FitsRicem; template class FitsRicem; template class FitsRicem; template class FitsRicem; saods9/tksao1.0/fitsy++/rice.h000644 000765 000000 00000000741 12464214754 016316 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsrice_h__ #define __fitsrice_h__ #include "compress.h" template class FitsRicem : public FitsCompressm { protected: int block_; int bytepix_; int noisebit_; private: int compressed(T*, char*, char*, int, int, int, int, int, int); public: FitsRicem(FitsFile*); }; #endif saods9/tksao1.0/fitsy++/ricecomp.c000644 000765 000000 00000105613 12536577540 017201 0ustar00joyewheel000000 000000 /* The following code was written by Richard White at STScI and made available for use in CFITSIO in July 1999. These routines were originally contained in 2 source files: rcomp.c and rdecomp.c, and the 'include' file now called ricecomp.h was originally called buffer.h. */ /*----------------------------------------------------------*/ /* */ /* START OF SOURCE FILE ORIGINALLY CALLED rcomp.c */ /* */ /*----------------------------------------------------------*/ /* @(#) rcomp.c 1.5 99/03/01 12:40:27 */ /* rcomp.c Compress image line using * (1) Difference of adjacent pixels * (2) Rice algorithm coding * * Returns number of bytes written to code buffer or * -1 on failure */ #include #include #include static void ffpmsg(const char* str) {} typedef unsigned char Buffer_t; typedef struct { int bitbuffer; /* bit buffer */ int bits_to_go; /* bits to go in buffer */ Buffer_t *start; /* start of buffer */ Buffer_t *current; /* current position in buffer */ Buffer_t *end; /* end of buffer */ } Buffer; #define putcbuf(c,mf) ((*(mf->current)++ = c), 0) /*#include "fitsio2.h"*/ #define FFLOCK #define FFUNLOCK static void start_outputing_bits(Buffer *buffer); static int done_outputing_bits(Buffer *buffer); static int output_nbits(Buffer *buffer, int bits, int n); /* this routine used to be called 'rcomp' (WDP) */ /*---------------------------------------------------------------------------*/ int fits_rcomp(int a[], /* input array */ int nx, /* number of input pixels */ unsigned char *c, /* output buffer */ int clen, /* max length of output */ int nblock) /* coding block size */ { Buffer bufmem, *buffer = &bufmem; /* int bsize; */ int i, j, thisblock; int lastpix, nextpix, pdiff; int v, fs, fsmask, top, fsmax, fsbits, bbits; int lbitbuffer, lbits_to_go; unsigned int psum; double pixelsum, dpsum; unsigned int *diff; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 4; */ /* nblock = 32; now an input parameter*/ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return(-1); } */ /* move out of switch block, to tweak performance */ fsbits = 5; fsmax = 25; bbits = 1<start = c; buffer->current = c; buffer->end = c+clen; buffer->bits_to_go = 8; /* * array for differences mapped to non-negative values */ diff = (unsigned int *) malloc(nblock*sizeof(unsigned int)); if (diff == (unsigned int *) NULL) { ffpmsg("fits_rcomp: insufficient memory"); return(-1); } /* * Code in blocks of nblock pixels */ start_outputing_bits(buffer); /* write out first int value to the first 4 bytes of the buffer */ if (output_nbits(buffer, a[0], 32) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } lastpix = a[0]; /* the first difference will always be zero */ thisblock = nblock; for (i=0; i> 1; for (fs = 0; psum>0; fs++) psum >>= 1; /* * write the codes * fsbits ID bits used to indicate split level */ if (fs >= fsmax) { /* Special high entropy case when FS >= fsmax * Just write pixel difference values directly, no Rice coding at all. */ if (output_nbits(buffer, fsmax+1, fsbits) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } for (j=0; jbitbuffer; lbits_to_go = buffer->bits_to_go; for (j=0; j> fs; /* * top is coded by top zeros + 1 */ if (lbits_to_go >= top+1) { lbitbuffer <<= top+1; lbitbuffer |= 1; lbits_to_go -= top+1; } else { lbitbuffer <<= lbits_to_go; putcbuf(lbitbuffer & 0xff,buffer); for (top -= lbits_to_go; top>=8; top -= 8) { putcbuf(0, buffer); } lbitbuffer = 1; lbits_to_go = 7-top; } /* * bottom FS bits are written without coding * code is output_nbits, moved into this routine to reduce overheads * This code potentially breaks if FS>24, so I am limiting * FS to 24 by choice of FSMAX above. */ if (fs > 0) { lbitbuffer <<= fs; lbitbuffer |= v & fsmask; lbits_to_go -= fs; while (lbits_to_go <= 0) { putcbuf((lbitbuffer>>(-lbits_to_go)) & 0xff,buffer); lbits_to_go += 8; } } } /* check if overflowed output buffer */ if (buffer->current > buffer->end) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } buffer->bitbuffer = lbitbuffer; buffer->bits_to_go = lbits_to_go; } } done_outputing_bits(buffer); free(diff); /* * return number of bytes used */ return(buffer->current - buffer->start); } /*---------------------------------------------------------------------------*/ int fits_rcomp_short( short a[], /* input array */ int nx, /* number of input pixels */ unsigned char *c, /* output buffer */ int clen, /* max length of output */ int nblock) /* coding block size */ { Buffer bufmem, *buffer = &bufmem; /* int bsize; */ int i, j, thisblock; /* NOTE: in principle, the following 2 variable could be declared as 'short' but in fact the code runs faster (on 32-bit Linux at least) as 'int' */ int lastpix, nextpix; /* int pdiff; */ short pdiff; int v, fs, fsmask, top, fsmax, fsbits, bbits; int lbitbuffer, lbits_to_go; /* unsigned int psum; */ unsigned short psum; double pixelsum, dpsum; unsigned int *diff; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 2; */ /* nblock = 32; now an input parameter */ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return(-1); } */ /* move these out of switch block to further tweak performance */ fsbits = 4; fsmax = 14; bbits = 1<start = c; buffer->current = c; buffer->end = c+clen; buffer->bits_to_go = 8; /* * array for differences mapped to non-negative values */ diff = (unsigned int *) malloc(nblock*sizeof(unsigned int)); if (diff == (unsigned int *) NULL) { ffpmsg("fits_rcomp: insufficient memory"); return(-1); } /* * Code in blocks of nblock pixels */ start_outputing_bits(buffer); /* write out first short value to the first 2 bytes of the buffer */ if (output_nbits(buffer, a[0], 16) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } lastpix = a[0]; /* the first difference will always be zero */ thisblock = nblock; for (i=0; i> 1; */ psum = ((unsigned short) dpsum ) >> 1; for (fs = 0; psum>0; fs++) psum >>= 1; /* * write the codes * fsbits ID bits used to indicate split level */ if (fs >= fsmax) { /* Special high entropy case when FS >= fsmax * Just write pixel difference values directly, no Rice coding at all. */ if (output_nbits(buffer, fsmax+1, fsbits) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } for (j=0; jbitbuffer; lbits_to_go = buffer->bits_to_go; for (j=0; j> fs; /* * top is coded by top zeros + 1 */ if (lbits_to_go >= top+1) { lbitbuffer <<= top+1; lbitbuffer |= 1; lbits_to_go -= top+1; } else { lbitbuffer <<= lbits_to_go; putcbuf(lbitbuffer & 0xff,buffer); for (top -= lbits_to_go; top>=8; top -= 8) { putcbuf(0, buffer); } lbitbuffer = 1; lbits_to_go = 7-top; } /* * bottom FS bits are written without coding * code is output_nbits, moved into this routine to reduce overheads * This code potentially breaks if FS>24, so I am limiting * FS to 24 by choice of FSMAX above. */ if (fs > 0) { lbitbuffer <<= fs; lbitbuffer |= v & fsmask; lbits_to_go -= fs; while (lbits_to_go <= 0) { putcbuf((lbitbuffer>>(-lbits_to_go)) & 0xff,buffer); lbits_to_go += 8; } } } /* check if overflowed output buffer */ if (buffer->current > buffer->end) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } buffer->bitbuffer = lbitbuffer; buffer->bits_to_go = lbits_to_go; } } done_outputing_bits(buffer); free(diff); /* * return number of bytes used */ return(buffer->current - buffer->start); } /*---------------------------------------------------------------------------*/ int fits_rcomp_byte( signed char a[], /* input array */ int nx, /* number of input pixels */ unsigned char *c, /* output buffer */ int clen, /* max length of output */ int nblock) /* coding block size */ { Buffer bufmem, *buffer = &bufmem; /* int bsize; */ int i, j, thisblock; /* NOTE: in principle, the following 2 variable could be declared as 'short' but in fact the code runs faster (on 32-bit Linux at least) as 'int' */ int lastpix, nextpix; /* int pdiff; */ signed char pdiff; int v, fs, fsmask, top, fsmax, fsbits, bbits; int lbitbuffer, lbits_to_go; /* unsigned int psum; */ unsigned char psum; double pixelsum, dpsum; unsigned int *diff; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 1; */ /* nblock = 32; now an input parameter */ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return(-1); } */ /* move these out of switch block to further tweak performance */ fsbits = 3; fsmax = 6; bbits = 1<start = c; buffer->current = c; buffer->end = c+clen; buffer->bits_to_go = 8; /* * array for differences mapped to non-negative values */ diff = (unsigned int *) malloc(nblock*sizeof(unsigned int)); if (diff == (unsigned int *) NULL) { ffpmsg("fits_rcomp: insufficient memory"); return(-1); } /* * Code in blocks of nblock pixels */ start_outputing_bits(buffer); /* write out first byte value to the first byte of the buffer */ if (output_nbits(buffer, a[0], 8) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } lastpix = a[0]; /* the first difference will always be zero */ thisblock = nblock; for (i=0; i> 1; */ psum = ((unsigned char) dpsum ) >> 1; for (fs = 0; psum>0; fs++) psum >>= 1; /* * write the codes * fsbits ID bits used to indicate split level */ if (fs >= fsmax) { /* Special high entropy case when FS >= fsmax * Just write pixel difference values directly, no Rice coding at all. */ if (output_nbits(buffer, fsmax+1, fsbits) == EOF) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } for (j=0; jbitbuffer; lbits_to_go = buffer->bits_to_go; for (j=0; j> fs; /* * top is coded by top zeros + 1 */ if (lbits_to_go >= top+1) { lbitbuffer <<= top+1; lbitbuffer |= 1; lbits_to_go -= top+1; } else { lbitbuffer <<= lbits_to_go; putcbuf(lbitbuffer & 0xff,buffer); for (top -= lbits_to_go; top>=8; top -= 8) { putcbuf(0, buffer); } lbitbuffer = 1; lbits_to_go = 7-top; } /* * bottom FS bits are written without coding * code is output_nbits, moved into this routine to reduce overheads * This code potentially breaks if FS>24, so I am limiting * FS to 24 by choice of FSMAX above. */ if (fs > 0) { lbitbuffer <<= fs; lbitbuffer |= v & fsmask; lbits_to_go -= fs; while (lbits_to_go <= 0) { putcbuf((lbitbuffer>>(-lbits_to_go)) & 0xff,buffer); lbits_to_go += 8; } } } /* check if overflowed output buffer */ if (buffer->current > buffer->end) { ffpmsg("rice_encode: end of buffer"); free(diff); return(-1); } buffer->bitbuffer = lbitbuffer; buffer->bits_to_go = lbits_to_go; } } done_outputing_bits(buffer); free(diff); /* * return number of bytes used */ return(buffer->current - buffer->start); } /*---------------------------------------------------------------------------*/ /* bit_output.c * * Bit output routines * Procedures return zero on success, EOF on end-of-buffer * * Programmer: R. White Date: 20 July 1998 */ /* Initialize for bit output */ static void start_outputing_bits(Buffer *buffer) { /* * Buffer is empty to start with */ buffer->bitbuffer = 0; buffer->bits_to_go = 8; } /*---------------------------------------------------------------------------*/ /* Output N bits (N must be <= 32) */ static int output_nbits(Buffer *buffer, int bits, int n) { /* local copies */ int lbitbuffer; int lbits_to_go; /* AND mask for the right-most n bits */ static unsigned int mask[33] = {0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff}; /* * insert bits at end of bitbuffer */ lbitbuffer = buffer->bitbuffer; lbits_to_go = buffer->bits_to_go; if (lbits_to_go+n > 32) { /* * special case for large n: put out the top lbits_to_go bits first * note that 0 < lbits_to_go <= 8 */ lbitbuffer <<= lbits_to_go; /* lbitbuffer |= (bits>>(n-lbits_to_go)) & ((1<>(n-lbits_to_go)) & *(mask+lbits_to_go); putcbuf(lbitbuffer & 0xff,buffer); n -= lbits_to_go; lbits_to_go = 8; } lbitbuffer <<= n; /* lbitbuffer |= ( bits & ((1<>(-lbits_to_go)) & 0xff,buffer); lbits_to_go += 8; } buffer->bitbuffer = lbitbuffer; buffer->bits_to_go = lbits_to_go; return(0); } /*---------------------------------------------------------------------------*/ /* Flush out the last bits */ static int done_outputing_bits(Buffer *buffer) { if(buffer->bits_to_go < 8) { putcbuf(buffer->bitbuffer<bits_to_go,buffer); /* if (putcbuf(buffer->bitbuffer<bits_to_go,buffer) == EOF) return(EOF); */ } return(0); } /*---------------------------------------------------------------------------*/ /*----------------------------------------------------------*/ /* */ /* START OF SOURCE FILE ORIGINALLY CALLED rdecomp.c */ /* */ /*----------------------------------------------------------*/ /* @(#) rdecomp.c 1.4 99/03/01 12:38:41 */ /* rdecomp.c Decompress image line using * (1) Difference of adjacent pixels * (2) Rice algorithm coding * * Returns 0 on success or 1 on failure */ /* moved these 'includes' to the beginning of the file (WDP) #include #include */ /*---------------------------------------------------------------------------*/ /* this routine used to be called 'rdecomp' (WDP) */ int fits_rdecomp (unsigned char *c, /* input buffer */ int clen, /* length of input */ unsigned int array[], /* output array */ int nx, /* number of output pixels */ int nblock) /* coding block size */ { /* int bsize; */ int i, k, imax; int nbits, nzero, fs; unsigned char *cend, bytevalue; unsigned int b, diff, lastpix; int fsmax, fsbits, bbits; static int *nonzero_count = (int *)NULL; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 4; */ /* nblock = 32; now an input parameter */ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return 1; } */ /* move out of switch block, to tweak performance */ fsbits = 5; fsmax = 25; bbits = 1<=0; ) { for ( ; i>=k; i--) nonzero_count[i] = nzero; k = k/2; nzero--; } } FFUNLOCK; /* * Decode in blocks of nblock pixels */ /* first 4 bytes of input buffer contain the value of the first */ /* 4 byte integer value, without any encoding */ lastpix = 0; bytevalue = c[0]; lastpix = lastpix | (bytevalue<<24); bytevalue = c[1]; lastpix = lastpix | (bytevalue<<16); bytevalue = c[2]; lastpix = lastpix | (bytevalue<<8); bytevalue = c[3]; lastpix = lastpix | bytevalue; c += 4; cend = c + clen - 4; b = *c++; /* bit buffer */ nbits = 8; /* number of bits remaining in b */ for (i = 0; i> nbits) - 1; b &= (1< nx) imax = nx; if (fs<0) { /* low-entropy case, all zero differences */ for ( ; i= 0; k -= 8) { b = *c++; diff |= b<0) { b = *c++; diff |= b>>(-k); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } else { /* normal case, Rice coding */ for ( ; i>nbits); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } if (c > cend) { ffpmsg("decompression error: hit end of compressed byte stream"); return 1; } } if (c < cend) { ffpmsg("decompression warning: unused bytes at end of compressed buffer"); } return 0; } /*---------------------------------------------------------------------------*/ /* this routine used to be called 'rdecomp' (WDP) */ int fits_rdecomp_short (unsigned char *c, /* input buffer */ int clen, /* length of input */ unsigned short array[], /* output array */ int nx, /* number of output pixels */ int nblock) /* coding block size */ { int i, imax; /* int bsize; */ int k; int nbits, nzero, fs; unsigned char *cend, bytevalue; unsigned int b, diff, lastpix; int fsmax, fsbits, bbits; static int *nonzero_count = (int *)NULL; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 2; */ /* nblock = 32; now an input parameter */ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return 1; } */ /* move out of switch block, to tweak performance */ fsbits = 4; fsmax = 14; bbits = 1<=0; ) { for ( ; i>=k; i--) nonzero_count[i] = nzero; k = k/2; nzero--; } } FFUNLOCK; /* * Decode in blocks of nblock pixels */ /* first 2 bytes of input buffer contain the value of the first */ /* 2 byte integer value, without any encoding */ lastpix = 0; bytevalue = c[0]; lastpix = lastpix | (bytevalue<<8); bytevalue = c[1]; lastpix = lastpix | bytevalue; c += 2; cend = c + clen - 2; b = *c++; /* bit buffer */ nbits = 8; /* number of bits remaining in b */ for (i = 0; i> nbits) - 1; b &= (1< nx) imax = nx; if (fs<0) { /* low-entropy case, all zero differences */ for ( ; i= 0; k -= 8) { b = *c++; diff |= b<0) { b = *c++; diff |= b>>(-k); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } else { /* normal case, Rice coding */ for ( ; i>nbits); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } if (c > cend) { ffpmsg("decompression error: hit end of compressed byte stream"); return 1; } } if (c < cend) { ffpmsg("decompression warning: unused bytes at end of compressed buffer"); } return 0; } /*---------------------------------------------------------------------------*/ /* this routine used to be called 'rdecomp' (WDP) */ int fits_rdecomp_byte (unsigned char *c, /* input buffer */ int clen, /* length of input */ unsigned char array[], /* output array */ int nx, /* number of output pixels */ int nblock) /* coding block size */ { int i, imax; /* int bsize; */ int k; int nbits, nzero, fs; unsigned char *cend; unsigned int b, diff, lastpix; int fsmax, fsbits, bbits; static int *nonzero_count = (int *)NULL; /* * Original size of each pixel (bsize, bytes) and coding block * size (nblock, pixels) * Could make bsize a parameter to allow more efficient * compression of short & byte images. */ /* bsize = 1; */ /* nblock = 32; now an input parameter */ /* * From bsize derive: * FSBITS = # bits required to store FS * FSMAX = maximum value for FS * BBITS = bits/pixel for direct coding */ /* switch (bsize) { case 1: fsbits = 3; fsmax = 6; break; case 2: fsbits = 4; fsmax = 14; break; case 4: fsbits = 5; fsmax = 25; break; default: ffpmsg("rdecomp: bsize must be 1, 2, or 4 bytes"); return 1; } */ /* move out of switch block, to tweak performance */ fsbits = 3; fsmax = 6; bbits = 1<=0; ) { for ( ; i>=k; i--) nonzero_count[i] = nzero; k = k/2; nzero--; } } FFUNLOCK; /* * Decode in blocks of nblock pixels */ /* first byte of input buffer contain the value of the first */ /* byte integer value, without any encoding */ lastpix = c[0]; c += 1; cend = c + clen - 1; b = *c++; /* bit buffer */ nbits = 8; /* number of bits remaining in b */ for (i = 0; i> nbits) - 1; b &= (1< nx) imax = nx; if (fs<0) { /* low-entropy case, all zero differences */ for ( ; i= 0; k -= 8) { b = *c++; diff |= b<0) { b = *c++; diff |= b>>(-k); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } else { /* normal case, Rice coding */ for ( ; i>nbits); b &= (1<>1; } else { diff = ~(diff>>1); } array[i] = diff+lastpix; lastpix = array[i]; } } if (c > cend) { ffpmsg("decompression error: hit end of compressed byte stream"); return 1; } } if (c < cend) { ffpmsg("decompression warning: unused bytes at end of compressed buffer"); } return 0; } saods9/tksao1.0/fitsy++/savefits.C000644 000765 000000 00000022004 12554205371 017142 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include using namespace std; #include #include "file.h" #include "util.h" #include "outfile.h" #include "outchannel.h" #include "outsocket.h" int FitsFile::saveFitsPrimHeader(OutFitsStream& str) { // write fake primary header char buf[FTY_BLOCK]; memset(buf,' ',FTY_BLOCK); char* hdu = buf; memcpy(hdu,"SIMPLE = ",10); memcpy(hdu+32-3,"T /",3); hdu += FTY_CARDLEN; memcpy(hdu,"BITPIX = ",10); memcpy(hdu+32-3,"8 /",3); hdu += FTY_CARDLEN; memcpy(hdu,"NAXIS = ",10); memcpy(hdu+32-3,"0 /",3); hdu += FTY_CARDLEN; memcpy(hdu,"END",3); str.write(buf, FTY_BLOCK); return FTY_BLOCK; } int FitsFile::saveFitsHeader(OutFitsStream& str, int depth) { int cnt =0; char buf[FTY_CARDLEN]; memset(buf,' ',FTY_CARDLEN); memcpy(buf,"SIMPLE = ",10); memcpy(buf+32-3,"T /",3); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; char* ptr = head()->cards()+FTY_CARDLEN; char* end = head()->cards() + head()->headbytes(); while (ptrbitpix() == -16) { memset(buf,' ',FTY_CARDLEN); memcpy(buf,"BITPIX = ",10); memcpy(buf+32-4,"32 /",4); str.write(buf, FTY_CARDLEN); } else if (!strncmp(ptr,"NAXIS ",6)) { memset(buf,' ',FTY_CARDLEN); memcpy(buf,"NAXIS = ",10); if (depth>1) memcpy(buf+32-3,"3 /",3); else if (head()->naxis(1)>1) memcpy(buf+32-3,"2 /",3); else memcpy(buf+32-3,"1 /",3); str.write(buf, FTY_CARDLEN); } else if (!strncmp(ptr,"NAXIS2",6)) { str.write(ptr, FTY_CARDLEN); if (depth>1) { ostringstream ddstr; ddstr << depth << " /" << ends; const char* ddptr = ddstr.str().c_str(); int ll = strlen(ddptr); memset(buf,' ',FTY_CARDLEN); memcpy(buf,"NAXIS3 = ",10); memcpy(buf+32-ll, ddptr, ll); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; } } else if (!strncmp(ptr,"NAXIS3",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"NAXIS4",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"NAXIS5",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"PCOUNT",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"GCOUNT",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"END ",6)) { // skip cnt -= FTY_CARDLEN; } else str.write(ptr, FTY_CARDLEN); ptr+=FTY_CARDLEN; cnt += FTY_CARDLEN; } // final END memset(buf,' ',FTY_CARDLEN); memcpy(buf,"END",3); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; cnt += saveFitsPad(str,cnt,' '); return cnt; } int FitsFile::saveFitsXtHeader(OutFitsStream& str, int depth) { // write xtension header // the header may be an xtension, or primary, so lets force a // first line of 'SIMPLE' and then write the rest of the header int cnt =0; char buf[FTY_CARDLEN]; memset(buf,' ',FTY_CARDLEN); memcpy(buf,"XTENSION= 'IMAGE '",20); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; char* ptr = head()->cards()+FTY_CARDLEN; char* end = head()->cards() + head()->headbytes(); while (ptrbitpix() == -16) { memset(buf,' ',FTY_CARDLEN); memcpy(buf,"BITPIX = ",10); memcpy(buf+32-4,"32 /",4); str.write(buf, FTY_CARDLEN); } else if (!strncmp(ptr,"NAXIS ",6)) { memset(buf,' ',FTY_CARDLEN); memcpy(buf,"NAXIS = ",10); if (depth>1) memcpy(buf+32-3,"3 /",3); else if (head()->naxis(1)>1) memcpy(buf+32-3,"2 /",3); else memcpy(buf+32-3,"1 /",3); str.write(buf, FTY_CARDLEN); } else if (!strncmp(ptr,"NAXIS2",6)) { str.write(ptr, FTY_CARDLEN); if (depth>1) { ostringstream ddstr; ddstr << depth << " /" << ends; const char* ddptr = ddstr.str().c_str(); int ll = strlen(ddptr); memset(buf,' ',FTY_CARDLEN); memcpy(buf,"NAXIS3 = ",10); memcpy(buf+32-ll, ddptr, ll); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; } memset(buf,' ',FTY_CARDLEN); memcpy(buf,"PCOUNT = ",10); memcpy(buf+32-3,"0 /",3); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; memset(buf,' ',FTY_CARDLEN); memcpy(buf,"GCOUNT = ",10); memcpy(buf+32-3,"1 /",3); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; } else if (!strncmp(ptr,"NAXIS3",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"NAXIS4",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"NAXIS5",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"PCOUNT",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"GCOUNT",6)) { // skip cnt -= FTY_CARDLEN; } else if (!strncmp(ptr,"END ",6)) { // skip cnt -= FTY_CARDLEN; } else str.write(ptr, FTY_CARDLEN); ptr+=FTY_CARDLEN; cnt += FTY_CARDLEN; } // final END memset(buf,' ',FTY_CARDLEN); memcpy(buf,"END",3); str.write(buf, FTY_CARDLEN); cnt += FTY_CARDLEN; cnt += saveFitsPad(str,cnt,' '); return cnt; } int FitsFile::saveFits(OutFitsStream& str) { FitsImageHDU* hdu = (FitsImageHDU*)(head()->hdu()); if (hdu->bitpix() != -16) { switch (endian_) { case BIG: str.write((char*)data(), hdu->imgbytes()); break; case LITTLE: str.writeSwap((char*)data(), hdu->imgbytes(), head()->bitpix()); break; case NATIVE: break; } return hdu->imgbytes(); } // convert bitpix=-16 to bitpix=32 int nx = head()->naxis(0); int ny = head()->naxis(1); int ss = nx*ny; int* dest = new int[ss]; for(int jj=0; jj 0 ) str.write(buf, npad); return npad; } int FitsFile::saveFitsTable(OutFitsStream& str) { int cnt =0; // primary header str.write(primary()->cards(), primary()->headbytes()); cnt += primary()->headbytes(); // now, ext header str.write(head()->cards(), head()->headbytes()); cnt += head()->headbytes(); // write valid data // our data may be short (mmap or bad fits), so write valid data // then write the pad, becareful with arch, if array switch (endian_) { case BIG: str.write((char*)data(), head()->allbytes()); break; case LITTLE: str.writeSwap((char*)data(), head()->allbytes(), head()->bitpix()); break; case NATIVE: break; } cnt += head()->allbytes(); // we may need to add a buffer to round out to block size int diff = head()->padbytes(); if (diff>0) { char* buf = new char[diff]; memset(buf,'\0',diff); str.write(buf, diff); delete [] buf; } cnt += head()->padbytes(); return cnt; } int FitsFile::saveFitsIISHeader(OutFitsStream& str) { int cnt =0; char buf[FTY_CARDLEN]; char* ptr = head()->cards(); char* end = head()->cards() + head()->headbytes(); while (ptrhdu()); unsigned char* src = (unsigned char*)data(); int size = hdu->imgbytes(); float* dest = new float[size]; for (int ii=0; ii 200) dest[ii] = NAN; else dest[ii] = ((src[ii]-1) * (iisz[1]-iisz[0]))/199 + iisz[0]; if (!lsb()) str.write((char*)dest, size*sizeof(float)); else str.writeSwap((char*)dest, size*sizeof(float), -32); if (dest) delete [] dest; return size*sizeof(float); } int FitsFile::saveArray(OutFitsStream& str, ArchType which) { // only save one slice size_t size = head_->naxis(0)*head_->naxis(1)*abs(head_->bitpix()/8); int bitpix = head_->bitpix(); if (which == endian_) str.write((char*)data(), size); else str.writeSwap((char*)data(), size, bitpix); return size; } saods9/tksao1.0/fitsy++/share.C000644 000765 000000 00000003501 12601043274 016414 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "share.h" #if (HAVE_SYS_SHM_H && !__WIN32) #include #include #include FitsShareID::FitsShareID(int shmid, const char* filter) { parse(filter); if (!valid_) return; // reset valid_ =0; // find size struct shmid_ds info; if (shmctl(shmid, IPC_STAT, &info)) { internalError("Fitsy++ share shctl failed"); return; } mapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ share shctl failed"); return; } // so far, so good valid_ = 1; } FitsShareID::~FitsShareID() { shmdt(mapdata_); } FitsShareKey::FitsShareKey(int key, const char* filter) { parse(filter); if (!valid_) return; // reset valid_ =0; // get shmid int shmid; if ((shmid = shmget(key, 0, 0)) < 0) { internalError("Fitsy++ share shmget failed"); return; } // find size struct shmid_ds info; if (shmctl(shmid, IPC_STAT, &info)) { internalError("Fitsy++ share shctl failed"); return; } mapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ share shmat failed"); return; } // so far, so good valid_ = 1; } FitsShareKey::~FitsShareKey() { if (mapdata_>0) shmdt(mapdata_); } #else FitsShareID::FitsShareID(int shmid, const char* filter) { // shared memory not supported valid_ = 0; } FitsShareID::~FitsShareID() {} FitsShareKey::FitsShareKey(int key, const char* filter) { // shared memory not supported valid_ = 0; } FitsShareKey::~FitsShareKey() {} #endif saods9/tksao1.0/fitsy++/share.h000644 000765 000000 00000005226 12464214754 016501 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsshare_h__ #define __fitsshare_h__ #include "map.h" class FitsShareID : public virtual FitsMap { public: FitsShareID(int, const char*); virtual ~FitsShareID(); }; class FitsShareKey : public virtual FitsMap { public: FitsShareKey(int, const char*); virtual ~FitsShareKey(); }; class FitsFitsShare : public virtual FitsMap, public FitsFitsMap { public: FitsFitsShare(ScanMode mode) : FitsMap(), FitsFitsMap(mode) {} }; class FitsFitsNextShare : public FitsFitsNextMap { public: FitsFitsNextShare(FitsFile* prev) : FitsFitsNextMap(prev) {} }; class FitsArrShare : public virtual FitsMap, public FitsArrMap { public: FitsArrShare() : FitsMap(), FitsArrMap() {} }; class FitsNRRDShare : public virtual FitsMap, public FitsNRRDMap { public: FitsNRRDShare() : FitsMap(), FitsNRRDMap() {} }; class FitsMosaicShare : public virtual FitsMap, public FitsMosaicMap { public: FitsMosaicShare() : FitsMap(), FitsMosaicMap() {} }; class FitsMosaicNextShare : public FitsMosaicNextMap { public: FitsMosaicNextShare(FitsFile* prev) : FitsMosaicNextMap(prev) {} }; class FitsFitsShareID : public FitsShareID, public FitsFitsShare { public: FitsFitsShareID(int shmid, const char* filter, ScanMode mode) : FitsShareID(shmid, filter), FitsFitsShare(mode) {} }; class FitsFitsShareKey : public FitsShareKey, public FitsFitsShare { public: FitsFitsShareKey(int key, const char* filter, ScanMode mode) : FitsShareKey(key, filter), FitsFitsShare(mode) {} }; class FitsArrShareID : public FitsShareID, public FitsArrShare { public: FitsArrShareID(int shmid, const char* filter) : FitsShareID(shmid, filter), FitsArrShare() {} }; class FitsArrShareKey : public FitsShareKey, public FitsArrShare { public: FitsArrShareKey(int key, const char* filter) : FitsShareKey(key, filter), FitsArrShare() {} }; class FitsNRRDShareID : public FitsShareID, public FitsNRRDShare { public: FitsNRRDShareID(int shmid, const char* filter) : FitsShareID(shmid, filter), FitsNRRDShare() {} }; class FitsNRRDShareKey : public FitsShareKey, public FitsNRRDShare { public: FitsNRRDShareKey(int key, const char* filter) : FitsShareKey(key, filter), FitsNRRDShare() {} }; class FitsMosaicShareID : public FitsShareID, public FitsMosaicShare { public: FitsMosaicShareID(int shmid) : FitsShareID(shmid, ""), FitsMosaicShare() {} }; class FitsMosaicShareKey : public FitsShareKey, public FitsMosaicShare { public: FitsMosaicShareKey(int key) : FitsShareKey(key, ""), FitsMosaicShare() {} }; #endif saods9/tksao1.0/fitsy++/shmload.C000644 000765 000000 00000003314 12464214754 016755 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #include #include #include #include #include #include #include #include using namespace std; main(int argc, char* argv[]) { int q=0; // check for args if (argc != 2 && argc != 3){ cerr << "usage: shmload [-q] fits" << endl; exit(1); } if (!strncmp(argv[1],"-q",2)) q=1; // find the file char* fn = argv[1+q]; struct stat statb; if (stat(fn, &statb) < 0){ cerr << "can't find file: " << fn << endl; exit(1); } size_t fnsize = statb.st_size; if (!q) cerr << fn << " size " << fnsize << endl; // calculate shmsize size_t shmsize = ((fnsize/2880)+1)*2880; // get shmid int shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT|0666); if (shmid == -1) { // give up, its bad perror("shmid is bad"); exit(1); } if (!q) cerr << "shmid " << shmid << endl; else cout << shmid << endl; // get shm stats struct shmid_ds sbuf; if (shmctl(shmid, IPC_STAT, &sbuf)<0) { perror("shmctl is bad"); exit(1); } if (!q) cerr << "size of shared segment: " << sbuf.shm_segsz << endl; char* addr = (char*)shmat(shmid, NULL, 0); // if (addr == -1){ // perror("shmat failed"); // exit(1); // } // load image ifstream fd(fn); fd.read(addr,fnsize); if (!q) { cerr << fd.gcount() << " bytes read" << endl; if (fd.gcount() != fnsize) cerr << "File read error" << endl; else cerr << "success!" << endl; } } saods9/tksao1.0/fitsy++/smap.C000644 000765 000000 00000007137 12612461721 016266 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "smap.h" #include "head.h" FitsSMap::FitsSMap() { hmapdata_ = NULL; hmapsize_ = 0; mapdata_ = NULL; mapsize_ = 0; } FitsFitsSMap::FitsFitsSMap(FitsHead::Memory mem) { if (!valid_) return; // simple check for fits file if (strncmp(hmapdata_,"SIMPLE ",8) && strncmp(hmapdata_,"XTENSION",8)) { data_ = NULL; dataSize_ = 0; dataSkip_ = 0; valid_ = 0; } head_ = new FitsHead(hmapdata_, hmapsize_, mem); if (head_->isValid()) { data_ = mapdata_; dataSize_ = mapsize_; dataSkip_ = 0; inherit_ = head_->inherit(); valid_ = 1; return; } else { if (manageHead_ && head_) delete head_; head_ = NULL; if (managePrimary_ && primary_) delete primary_; primary_ = NULL; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; valid_ = 0; } } FitsENVISMap::FitsENVISMap() { if (!valid_) return; // reset valid_ = 0; if (hmapsize_<=0 || hmapsize_>32768) return; // header { char* buf = new char[hmapsize_+1]; char* dptr = buf; char* sptr = hmapdata_; int cnt =0; do { *dptr++ = *sptr++; cnt++; } while (cntparseENVI(str); delete [] buf; if (!valid_) return; // reset valid_ =0; } // check to see if we have a nonzero width, height, and bitpix if (!validParams()) return; size_t ss = (size_t)pWidth_*pHeight_*pDepth_*abs(pBitpix_)/8; // sometimes, offset is not correct if (pSkip_ == 0) { if (mapsize_ > ss) pSkip_ = mapsize_-ss; } // check to see if dimensions equal mapped space if (ss+pSkip_ > mapsize_) return; // skip to start of data data_ = mapdata_ + pSkip_; dataSize_ = mapsize_; dataSkip_ = pSkip_; // new header head_ = new FitsHead(pWidth_, pHeight_, pDepth_, pBitpix_); if (!head_->isValid()) return; // WCS? if (pCRPIX3_ || pCRVAL3_ || pCDELT3_) { head_->appendString("CTYPE1","LINEAR", NULL); head_->appendReal("CRPIX1",1, 9, NULL); head_->appendReal("CRVAL1",1, 9, NULL); head_->appendReal("CDELT1",1, 9, NULL); head_->appendString("CTYPE2","LINEAR", NULL); head_->appendReal("CRPIX2",1, 9, NULL); head_->appendReal("CRVAL2",1, 9, NULL); head_->appendReal("CDELT2",1, 9, NULL); head_->appendString("CTYPE3","WAVELENGTH", NULL); head_->appendReal("CRPIX3",pCRPIX3_, 9, NULL); head_->appendReal("CRVAL3",pCRVAL3_, 9, NULL); head_->appendReal("CDELT3",pCDELT3_, 9, NULL); } // do we byteswap? setByteSwap(); // so far, so good valid_ = 1; } FitsFitsNextSMap::FitsFitsNextSMap(FitsFile* p) { FitsSMap* prev = (FitsSMap*)p; primary_ = prev->primary(); managePrimary_ = 0; head_ = prev->head(); manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)head_->hdu(); data_ = (char*)prev->data() + hdu->imgbytes(); dataSize_ = 0; dataSkip_ = 0; ext_ = prev->ext(); inherit_ = prev->inherit(); byteswap_ = prev->byteswap(); endian_ = prev->endian(); valid_ = 1; pcoord_ = prev->pcoord(); pxvalid_ = prev->pxvalid(); pxmin_ = prev->pxmin(); pxmax_ = prev->pxmax(); pyvalid_ = prev->pyvalid(); pymin_ = prev->pymin(); pymax_ = prev->pymax(); pzvalid_ = prev->pzvalid(); pzmin_ = prev->pzmin(); pzmax_ = prev->pzmax(); pbvalid_ = prev->pbvalid(); pblock_ = prev->pblock(); mapdata_ = prev->mapdata(); mapsize_ = prev->mapsize(); return; } saods9/tksao1.0/fitsy++/smap.h000644 000765 000000 00000001371 12464214754 016334 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitssmap_h__ #define __fitssmap_h__ #include "file.h" class FitsSMap : public FitsFile { protected: char* hmapdata_; size_t hmapsize_; char* mapdata_; size_t mapsize_; public: FitsSMap(); virtual ~FitsSMap() {} char* mapdata() {return mapdata_;} size_t mapsize() {return mapsize_;} }; class FitsFitsSMap : public virtual FitsSMap { public: FitsFitsSMap(FitsHead::Memory); }; class FitsENVISMap : public virtual FitsSMap { public: FitsENVISMap(); }; class FitsFitsNextSMap : public FitsSMap { public: FitsFitsNextSMap(FitsFile* prev); }; #endif saods9/tksao1.0/fitsy++/smmap.C000644 000765 000000 00000003307 12601043274 016433 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "smmap.h" #ifndef __WIN32 #include #include #include #include #include FitsSMMap::FitsSMMap(const char* hdr, const char* fn) { // reset valid_ =0; // header { // Map the header. int file = open(hdr, O_RDONLY); if (file == -1) return; struct stat info; if (fstat(file, &info) < 0) return; // check for empty file if (info.st_size == 0) return; // map it hmapsize_ = info.st_size; hmapdata_ = (char*)mmap(NULL, hmapsize_, PROT_READ, MAP_SHARED, file, 0); // close the file close(file); // are we valid? if ((long)hmapdata_ == -1) return; } // data { // parse the fn and options parse(fn); if (!valid_) return; // reset valid_ =0; if (!pName_) return; // Map the file. int file = open(pName_, O_RDONLY); if (file == -1) return; struct stat info; if (fstat(file, &info) < 0) return; // check for empty file if (info.st_size == 0) return; // map it mapsize_ = info.st_size; mapdata_ = (char*)mmap(NULL, mapsize_, PROT_READ, MAP_SHARED, file, 0); // close the file close(file); // are we valid? if ((long)mapdata_ == -1) return; } // so far, so good valid_ = 1; } FitsSMMap::~FitsSMMap() { if (mapdata_>0) munmap((caddr_t)mapdata_, mapsize_); } #else FitsSMMap::FitsSMMap(const char* hdr, const char* fn) { valid_ =0; } FitsSMMap::~FitsSMMap() {} #endif saods9/tksao1.0/fitsy++/smmap.h000644 000765 000000 00000001503 12464214754 016506 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitssmmap_h__ #define __fitssmmap_h__ #include "smap.h" class FitsSMMap : public virtual FitsSMap { public: FitsSMMap(const char*, const char*); virtual ~FitsSMMap(); }; class FitsFitsSMMap : public FitsSMMap, public FitsFitsSMap { public: FitsFitsSMMap(const char* hdr, const char* fn) : FitsSMMap(hdr,fn), FitsFitsSMap(FitsHead::MMAP) {} }; class FitsENVISMMap : public FitsSMMap, public FitsENVISMap { public: FitsENVISMMap(const char* hdr, const char* fn) : FitsSMMap(hdr,fn), FitsENVISMap() {} }; class FitsFitsNextSMMap : public FitsFitsNextSMap { public: FitsFitsNextSMMap(FitsFile* prev) : FitsFitsNextSMap(prev) {} }; #endif saods9/tksao1.0/fitsy++/socket.C000644 000765 000000 00000000654 12601046407 016611 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "socket.h" #ifndef __WIN32 FitsSocket::FitsSocket(int s, const char* ext) { parse(ext); if (!valid_) return; stream_ = s; valid_ = stream_ ? 1 : 0; } #else FitsSocket::FitsSocket(int s, const char* ext) { valid_ = 0; } #endif saods9/tksao1.0/fitsy++/socket.h000644 000765 000000 00000002672 12464214754 016671 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitssocket_h__ #define __fitssocket_h__ #include "strm.h" class FitsSocket : public virtual FitsStream { public: FitsSocket(int, const char*); }; class FitsFitsSocket : public FitsSocket, public FitsFitsStream { public: FitsFitsSocket(int s, const char* ext, ScanMode mode, FlushMode flush) : FitsSocket(s, ext), FitsFitsStream(mode, flush) {} }; class FitsFitsNextSocket : public FitsFitsNextStream { public: FitsFitsNextSocket(FitsFile* prev) : FitsFitsNextStream(prev) {} }; class FitsArrSocket : public FitsSocket, public FitsArrStream { public: FitsArrSocket(int s, const char* ext, FlushMode flush) : FitsSocket(s, ext), FitsArrStream(flush) {} }; class FitsNRRDSocket : public FitsSocket, public FitsNRRDStream { public: FitsNRRDSocket(int s, const char* ext, FlushMode flush) : FitsSocket(s, ext), FitsNRRDStream(flush) {} }; class FitsMosaicSocket : public FitsSocket, public FitsMosaicStream { public: FitsMosaicSocket(int s, FlushMode flush) : FitsSocket(s, ""), FitsMosaicStream(flush) {} }; class FitsMosaicNextSocket : public FitsMosaicNextStream { public: FitsMosaicNextSocket(FitsFile* prev, FlushMode flush) : FitsMosaicNextStream(prev, flush) {} }; #endif saods9/tksao1.0/fitsy++/socketgz.C000644 000765 000000 00000006563 12601046407 017157 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "socketgz.h" #ifndef __WIN32 #include #include #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ FitsSocketGZ::FitsSocketGZ(int s, const char* ext) { parse(ext); if (!valid_) return; // reset valid_ =0; if (!s) return; stream_ = new gzStream_; stream_->id = s; stream_->transparent = 0; memset(stream_->header,'\0',2); stream_->useHeader = 0; stream_->buf = new unsigned char[B4KB]; // magic bytes if (recv(stream_->id , stream_->header, 2, 0) != 2) { internalError("Fitsy++ socketgz can't read magic bytes in header"); return; } if (stream_->header[0] != 0x1f || stream_->header[1] != 0x8b) { stream_->transparent = 1; stream_->useHeader = 1; } else { ((z_stream*)stream_)->next_in = NULL; ((z_stream*)stream_)->avail_in = 0; ((z_stream*)stream_)->zalloc = NULL; ((z_stream*)stream_)->zfree = NULL; ((z_stream*)stream_)->opaque = NULL; if (inflateInit2((z_stream*)stream_, -MAX_WBITS) != Z_OK) { internalError("Fitsy++ socketgz inflateInit error"); return; } unsigned char buf[128]; // method/flags if (recv(stream_->id , buf, 2, 0) != 2) { internalError("Fitsy++ socketgz can't read method/flags bytes in header"); return; } int method = buf[0]; int flags = buf[1]; if (method != Z_DEFLATED || (flags & RESERVED) != 0) { internalError("Fitsy++ socketgz bad method/flags"); return; } // Discard time, xflags and OS code if (recv(stream_->id , buf, 6, 0) != 6) { internalError("Fitsy++ socketgz can't read time/xflags/os bytes in header"); return; } // skip the extra field if ((flags & EXTRA_FIELD) != 0) { if (recv(stream_->id , buf, 2, 0) != 2) { internalError("Fitsy++ socketgz can't read extra field length bytes in header"); return; } int len = buf[0]; len += buf[1]<<8; if (recv(stream_->id , buf, len, 0) != len) { internalError("Fitsy++ socketgz can't read extra field bytes in header"); return; } } // skip the original file name if ((flags & ORIG_NAME) != 0) { while (recv(stream_->id , buf, 1, 0) == 1 && buf[0] != 0) ; } // skip the .gz file comment if ((flags & COMMENT) != 0) { while (recv(stream_->id , buf, 1, 0) == 1 && buf[0] != 0) ; } // skip the header crc if ((flags & HEAD_CRC) != 0) { if (recv(stream_->id , buf, 2, 0) != 2) { internalError("Fitsy++ socketgz can't read header crc bytes in header"); return; } } } if (DebugGZ) cerr << "inflateInt Complete" << endl; // so far, so good valid_ = 1; } FitsSocketGZ::~FitsSocketGZ() { if (stream_->buf) delete [] stream_->buf; if (stream_) delete stream_; stream_ = NULL; } #else FitsSocketGZ::FitsSocketGZ(int s, const char* ext) { valid_ =0; } FitsSocketGZ::~FitsSocketGZ() {} #endif saods9/tksao1.0/fitsy++/socketgz.h000644 000765 000000 00000002572 12464214754 017231 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitssocketgz_h__ #define __fitssocketgz_h__ #include "strm.h" class FitsSocketGZ : public virtual FitsStream { public: FitsSocketGZ(int, const char*); virtual ~FitsSocketGZ(); }; class FitsFitsSocketGZ : public FitsSocketGZ, public FitsFitsStream { public: FitsFitsSocketGZ(int s, const char* ext, ScanMode mode, FlushMode flush) : FitsSocketGZ(s, ext), FitsFitsStream(mode, flush) {} }; class FitsFitsNextSocketGZ : public FitsFitsNextStream { public: FitsFitsNextSocketGZ(FitsFile* prev) : FitsFitsNextStream(prev) {} }; class FitsArrSocketGZ : public FitsSocketGZ, public FitsArrStream { public: FitsArrSocketGZ(int s, const char* ext, FlushMode flush) : FitsSocketGZ(s, ext), FitsArrStream(flush) {} }; class FitsMosaicSocketGZ : public FitsSocketGZ, public FitsMosaicStream { public: FitsMosaicSocketGZ(int s, FlushMode flush) : FitsSocketGZ(s, ""), FitsMosaicStream(flush) {} }; class FitsMosaicNextSocketGZ : public FitsMosaicNextStream { public: FitsMosaicNextSocketGZ(FitsFile* prev, FlushMode flush) : FitsMosaicNextStream(prev, flush) {} }; #endif saods9/tksao1.0/fitsy++/sshare.C000644 000765 000000 00000005475 12601046407 016614 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "sshare.h" #if (HAVE_SYS_SHM_H && !__WIN32) #include #include #include FitsSShareID::FitsSShareID(int hdrid, int shmid, const char* filter) { // reset valid_ =0; { // find size struct shmid_ds info; if (shmctl(hdrid, IPC_STAT, &info)) { internalError("Fitsy++ sshare shctl failed"); return; } hmapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(hmapdata_ = (char*)shmat(hdrid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ sshare shmat failed"); return; } } { parse(filter); if (!valid_) return; // reset valid_ =0; // find size struct shmid_ds info; if (shmctl(shmid, IPC_STAT, &info)) { internalError("Fitsy++ sshare shctl failed"); return; } mapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ sshare shmat failed"); return; } } // so far so good valid_ = 1; } FitsSShareID::~FitsSShareID() { shmdt(mapdata_); } FitsSShareKey::FitsSShareKey(int hdr, int key, const char* filter) { // reset valid_ =0; { // get shmid int shmid; if ((shmid = shmget(hdr, 0, 0)) < 0) { internalError("Fitsy++ sshare shmget failed"); return; } // find size struct shmid_ds info; if (shmctl(shmid, IPC_STAT, &info)) { internalError("Fitsy++ sshare shctl failed"); return; } mapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ sshare shmat failed"); return; } } { parse(filter); if (!valid_) return; // reset valid_ =0; // get shmid int shmid; if ((shmid = shmget(key, 0, 0)) < 0) { internalError("Fitsy++ sshare shmget failed"); return; } // find size struct shmid_ds info; if (shmctl(shmid, IPC_STAT, &info)) { internalError("Fitsy++ sshare shmctl failed"); return; } mapsize_ = info.shm_segsz; // Attach the memory segment if ((long)(mapdata_ = (char*)shmat(shmid, 0, SHM_RDONLY)) == -1) { internalError("Fitsy++ sshare shmat failed"); return; } } // so far so good valid_ = 1; } FitsSShareKey::~FitsSShareKey() { shmdt(mapdata_); } #else FitsSShareID::FitsSShareID(int hdrid, int shmid, const char* filter) { valid_ = 0; } FitsSShareID::~FitsSShareID() {} FitsSShareKey::FitsSShareKey(int hdr, int key, const char* filter) { valid_ = 0; } FitsSShareKey::~FitsSShareKey() {} #endif saods9/tksao1.0/fitsy++/sshare.h000644 000765 000000 00000002237 12464214754 016663 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitssshare_h__ #define __fitssshare_h__ #include "smap.h" class FitsSShareID : public virtual FitsSMap { public: FitsSShareID(int, int, const char*); virtual ~FitsSShareID(); }; class FitsSShareKey : public virtual FitsSMap { public: FitsSShareKey(int, int, const char*); virtual ~FitsSShareKey(); }; class FitsFitsSShare : public virtual FitsSMap, public FitsFitsSMap { public: FitsFitsSShare() : FitsSMap(), FitsFitsSMap(FitsHead::SHARE) {} }; class FitsFitsNextSShare : public FitsFitsNextSMap { public: FitsFitsNextSShare(FitsFile* prev) : FitsFitsNextSMap(prev) {} }; class FitsFitsSShareID : public FitsSShareID, public FitsFitsSShare { public: FitsFitsSShareID(int hdrid, int shmid, const char* filter) : FitsSShareID(hdrid, shmid, filter), FitsFitsSShare() {} }; class FitsFitsSShareKey : public FitsSShareKey, public FitsFitsSShare { public: FitsFitsSShareKey(int hdr, int key, const char* filter) : FitsSShareKey(hdr, key, filter), FitsFitsSShare() {} }; #endif saods9/tksao1.0/fitsy++/strm.C000644 000765 000000 00000041772 12612461721 016316 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include #ifndef __WIN32 #include #endif #include #include "strm.h" #include "util.h" template FitsStream::FitsStream() { stream_ =0; flush_ = NOFLUSH; dataManage_ = 0; } template FitsStream::~FitsStream() { if (dataManage_ && data_) delete [] (T*)data_; } // FILE* template <> size_t FitsStream::read(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; do { r = fread(where+rr, 1, (ss>B1MB) ? B1MB : ss, stream_); ss -= r; rr += r; } while (r>0 && rr void FitsStream::close() { fclose(stream_); } // Socket #ifndef __WIN32 template <> size_t FitsStream::read(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr =0; int r; do { r = recv(stream_ , where+rr, (ss>B4KB) ? B4KB : ss, 0); ss -= r; rr += r; } while (r>0 && rr size_t FitsStream::read(char* where, size_t size) { return 0; } #endif template <> void FitsStream::close() {} // gzStream #ifndef __WIN32 template <> size_t FitsStream::read(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; if (stream_->transparent) { if (stream_->useHeader) { memcpy(where,stream_->header,2); ss -= 2; rr += 2; stream_->useHeader = 0; } do { r = recv(stream_->id , where+rr, (ss>B4KB) ? B4KB : ss, 0); ss -= r; rr += r; } while (r>0 && rravail_out = size; ((z_stream*)stream_)->next_out = (unsigned char*)where; if (DebugGZ) cerr << "***read init " << ((z_stream*)stream_)->avail_out << " bytes" << endl; do { if (((z_stream*)stream_)->avail_in == 0) { ((z_stream*)stream_)->next_in = stream_->buf; int aa = recv(stream_->id , stream_->buf, B4KB, 0); if (aa<0) return rr; ((z_stream*)stream_)->avail_in = aa; if (DebugGZ) cerr << " read from socket " << aa << " bytes" << endl; } if (DebugGZ) cerr << " inflate Start: avail_in " << ((z_stream*)stream_)->avail_in << " avail_out " << ((z_stream*)stream_)->avail_out << endl; int before = ((z_stream*)stream_)->avail_out; int result = inflate(((z_stream*)stream_), Z_NO_FLUSH); r = before - ((z_stream*)stream_)->avail_out; rr += r; switch (result) { case Z_OK: if (DebugGZ) cerr << " inflate OK: avail_in " << ((z_stream*)stream_)->avail_in << " avail_out " << ((z_stream*)stream_)->avail_out << endl; break; case Z_STREAM_END: if (DebugGZ) cerr << " inflate STRM_END: avail_in " << ((z_stream*)stream_)->avail_in << " avail_out " << ((z_stream*)stream_)->avail_out << " total_in " << ((z_stream*)stream_)->total_in << " total_out " << ((z_stream*)stream_)->total_out << endl; return rr; default: internalError("Fitsy++ strm inflate error"); return rr; } } while (r>0 && rr void FitsStream::close() { if (!stream_->transparent) { if (inflateEnd((z_stream*)stream_) != Z_OK) internalError("Fitsy++ strm inflateEnd error"); if (DebugGZ) cerr << "inflateEnd: avail_in " << ((z_stream*)stream_)->avail_in << " avail_out " << ((z_stream*)stream_)->avail_out << endl; } } #else template <> size_t FitsStream::read(char* where, size_t size) { return 0; } template <> void FitsStream::close() {} #endif // Tcl_Channel template <> size_t FitsStream::read(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; do { r = Tcl_Read(stream_, where+rr, (ss>B1MB) ? B1MB : ss); ss -= r; rr += r; } while (r>0 && rr void FitsStream::close() {} // gzFile template <> size_t FitsStream::read(char* where, size_t size) { // size_t size is unsigned long long ss =size; size_t rr = 0; int r = 0; do { r = gzread(stream_, where+rr, (ss>B1MB) ? B1MB : ss); ss -= r; rr += r; } while (r>0 && rr void FitsStream::close() { gzclose(stream_); } template FitsHead* FitsStream::headRead() { // read first block char* cards = new char[FTY_BLOCK]; if (!cards) return NULL; memset(cards, ' ', FTY_BLOCK); if (read(cards, FTY_BLOCK) != FTY_BLOCK) { delete [] cards; return NULL; } // simple FITS file check if (strncmp(cards, "SIMPLE =", 9) && strncmp(cards, "XTENSION=", 9)) { delete [] cards; return NULL; } // read remaining blocks int numblks = 1; char* current = cards; while (1) { if (findEnd(current)) break; // this is check // for TCL channels, the stream gets corrupted, so END is never found // so bail out after an extreme number of blocks have been read // // this does not work because some fits files have 100's or 1000's of // history/comments. lets hope a corrupted stream is caught below // if (numblks>10) { // delete [] cards; // return NULL; // } char* tmp = new char[(numblks+1)*FTY_BLOCK]; memcpy(tmp, cards, numblks*FTY_BLOCK); delete [] cards; cards = tmp; current = cards + numblks*FTY_BLOCK; memset(current, ' ', FTY_BLOCK); if (read(current, FTY_BLOCK) != FTY_BLOCK) { delete [] cards; return NULL; } numblks++; } // create header FitsHead* fits = new FitsHead(cards, numblks*FTY_BLOCK, FitsHead::ALLOC); if (!fits->isValid()) { delete fits; return NULL; } return fits; } template int FitsStream::dataRead(size_t bytes, int validate) { data_ = NULL; dataSize_ = 0; dataSkip_ = 0; dataManage_ = 0; if (!bytes) return 0; data_ = new char[bytes]; if (!data_) return 0; size_t rr = read((char*)data_, bytes); if (validate && rr != bytes) { delete (char*)data_; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; dataManage_ = 0; return 0; } dataSize_ = bytes; dataManage_ = 1; return 1; } template void FitsStream::dataSkip(size_t bytes) { // size_t bytes is unsigned if (bytes) { char block[FTY_BLOCK]; do { read(block, (bytes < FTY_BLOCK ? bytes : FTY_BLOCK)); if (bytes>FTY_BLOCK) bytes -= FTY_BLOCK; else break; } while (1); } } template void FitsStream::dataSkipBlock(size_t blk) { char block[FTY_BLOCK]; for (size_t ii=0; ii void FitsStream::skipEnd() { char block[FTY_BLOCK]; int bytes; do bytes = read(block, FTY_BLOCK); while (bytes > 0); } template void FitsStream::found() { // only read allbytes, since the data seg maybe short if (!this->dataRead(head_->allbytes())) { error(); return; } // read any dead space til next block if (head_->padbytes()>0) this->dataSkip(head_->padbytes()); inherit_ = head_->inherit(); valid_ = 1; if (flush_ == FLUSH) skipEnd(); } template void FitsStream::error() { // try to clean up if ((flush_ == FLUSH) && (head_ || primary_)) skipEnd(); if (manageHead_ && head_) delete head_; head_ = NULL; if (managePrimary_ && primary_) delete primary_; primary_ = NULL; data_ = NULL; dataSize_ = 0; dataSkip_ = 0; dataManage_ = 0; valid_ = 0; } template class FitsStream; template class FitsStream; template class FitsStream; template class FitsStream; template class FitsStream; template FitsFitsStream::FitsFitsStream(FitsFile::ScanMode mode, FitsFile::FlushMode f) { if (!this->valid_) return; this->flush_ = f; if (mode == this->EXACT || this->pExt_ || this->pIndex_>-1) processExact(); else processRelax(); } template void FitsFitsStream::processExact() { if (!(this->pExt_ || (this->pIndex_>0))) { // we are only looking for a primary image if ((this->head_ = this->headRead())) { this->found(); return; } } else { // we are looking for an extension // keep the primary header this->primary_ = this->headRead(); this->managePrimary_ = 1; if (!this->primary_) { this->error(); return; } this->dataSkipBlock(this->primary_->datablocks()); if (this->pExt_) { while (1) { if (!(this->head_ = this->headRead())) { this->error(); return; } this->ext_++; if (this->head_->extname()) { char* a = toUpper(this->head_->extname()); char* b = toUpper(this->pExt_); if (!strncmp(a,b,strlen(b))) { delete [] a; delete [] b; this->found(); return; } delete [] a; delete [] b; } this->dataSkipBlock(this->head_->datablocks()); delete this->head_; this->head_ = NULL; } } else { for (int i=1; ipIndex_; i++) { if (!(this->head_ = this->headRead())) { this->error(); return; } this->ext_++; this->dataSkipBlock(this->head_->datablocks()); delete this->head_; this->head_ = NULL; } if ((this->head_ = this->headRead())) { this->ext_++; this->found(); return; } } } // we must have an error this->error(); } template void FitsFitsStream::processRelax() { // check to see if there is an image in the primary if (!(this->head_ = this->headRead())) { this->error(); return; } else { if (this->head_->isValid() && this->head_->naxes() > 0 && this->head_->naxis(0) > 0 && this->head_->naxis(1) > 0) { this->found(); return; } } // ok, no image, save primary and lets check extensions this->primary_ = this->head_; this->managePrimary_ = 1; this->dataSkipBlock(this->head_->datablocks()); this->head_ = NULL; // ok, no image, lets check extensions while (1) { if (!(this->head_ = this->headRead())) { this->error(); return; } this->ext_++; if (this->head_->isImage()) { this->found(); return; } // else, check for compressed image if (this->head_->isBinTable() && this->head_->find("ZIMAGE")) { this->found(); return; } // else, check for bin table named STDEVT, EVENTS, RAYEVENT if (this->head_->isBinTable() && this->head_->extname()) { char* a = toUpper(this->head_->extname()); if (!strncmp("STDEVT", a, 6) || !strncmp("EVENTS", a, 6) || !strncmp("RAYEVENT", a, 8)) { delete [] a; this->found(); return; } else delete [] a; } // else, check for bin table with keyword PIXTYPE = 'HEALPIX ' if (this->head_->isBinTable() && this->head_->find("PIXTYPE") && (!strncmp(this->head_->getString("PIXTYPE"),"HEALPIX",4))) { this->found(); return; } // else, check for bin table with keyword NSIDE (also HEALPIX) if (this->head_->isBinTable() && this->head_->find("NSIDE")) { this->found(); return; } this->dataSkipBlock(this->head_->datablocks()); delete this->head_; this->head_ = NULL; } this->error(); } template class FitsFitsStream; template class FitsFitsStream; template class FitsFitsStream; template class FitsFitsStream; template class FitsFitsStream; template FitsFitsNextStream::FitsFitsNextStream(FitsFile* p) { FitsStream* prev = (FitsStream*)p; this->primary_ = prev->primary(); this->managePrimary_ = 0; this->head_ = prev->head(); this->manageHead_ = 0; FitsImageHDU* hdu = (FitsImageHDU*)this->head_->hdu(); this->data_ = (char*)prev->data() + hdu->imgbytes(); this->dataSize_ = 0; this->dataSkip_ = 0; this->ext_ = prev->ext(); this->inherit_ = prev->inherit(); this->byteswap_ = prev->byteswap(); this->endian_ = prev->endian(); this->valid_ = 1; this->pcoord_ = prev->pcoord(); this->pxvalid_ = prev->pxvalid(); this->pxmin_ = prev->pxmin(); this->pxmax_ = prev->pxmax(); this->pyvalid_ = prev->pyvalid(); this->pymin_ = prev->pymin(); this->pymax_ = prev->pymax(); this->pzvalid_ = prev->pzvalid(); this->pzmin_ = prev->pzmin(); this->pzmax_ = prev->pzmax(); this->pbvalid_ = prev->pbvalid(); this->pblock_ = prev->pblock(); this->stream_ = prev->stream(); this->flush_ = prev->flush(); this->dataManage_ = 0; } template class FitsFitsNextStream; template class FitsFitsNextStream; template class FitsFitsNextStream; template class FitsFitsNextStream; template class FitsFitsNextStream; template FitsArrStream::FitsArrStream(FitsFile::FlushMode f) { if (!this->valid_) return; this->flush_ = f; this->valid_=0; // check to see if we have a nonzero width, height, and bitpix if (!this->validParams()) { return; } // skip header if (this->pSkip_) this->dataSkip(this->pSkip_); // read data if (!this->dataRead((size_t)this->pWidth_*this->pHeight_*this->pDepth_*abs(this->pBitpix_)/8)) { if ((this->flush_ == this->FLUSH) && this->data_) this->skipEnd(); return; } // create blank header this->head_ = new FitsHead(this->pWidth_, this->pHeight_, this->pDepth_, this->pBitpix_); if (!this->head_->isValid()) { this->error(); return; } // do we need to byteswap? this->setByteSwap(); // made it this far, must be good this->valid_ = 1; if (this->flush_ == this->FLUSH) this->skipEnd(); } template class FitsArrStream; template class FitsArrStream; template class FitsArrStream; template class FitsArrStream; template class FitsArrStream; template FitsNRRDStream::FitsNRRDStream(FitsFile::FlushMode f) { if (!this->valid_) return; this->flush_ = f; this->valid_=0; // header { char buf[1024]; char* dptr = buf; int cnt =0; do { int cc = this->read(dptr,1); if (cc != 1 || (*dptr == '\n' && *(dptr-1) == '\n')) { break; } cnt++; dptr++; } while (cnt<1024); *dptr = '\0'; string x(buf); istringstream str(x); this->parseNRRD(str); } // check to see if we have a nonzero width, height, and bitpix if (!this->validParams()) return; // read data this->dataRead((size_t)this->pWidth_*this->pHeight_*this->pDepth_*abs(this->pBitpix_)/8, 0); // create blank header this->head_ = new FitsHead(this->pWidth_, this->pHeight_, this->pDepth_, this->pBitpix_); if (!this->head_->isValid()) { this->error(); return; } // do we need to byteswap? this->setByteSwap(); // made it this far, must be good this->valid_ = 1; if (this->flush_ == this->FLUSH) this->skipEnd(); } template class FitsNRRDStream; template class FitsNRRDStream; template class FitsNRRDStream; template class FitsNRRDStream; template class FitsNRRDStream; template FitsMosaicStream::FitsMosaicStream(FitsFile::FlushMode f) { if (!this->valid_) return; this->flush_ = f; this->primary_ = this->headRead(); this->managePrimary_ = 1; if (!(this->primary_ && this->primary_->isValid())) { this->error(); return; } this->dataSkipBlock(this->primary_->datablocks()); // first extension this->head_ = this->headRead(); if (!(this->head_ && this->head_->isValid())) { this->error(); return; } this->ext_++; // be sure to read all blocks, so that the next call starts on a boundary if (!this->dataRead(this->head_->datablocks()*FTY_BLOCK)) { this->error(); return; } // don't flush, more to come this->inherit_ = this->head_->inherit(); this->valid_ = 1; } template class FitsMosaicStream; template class FitsMosaicStream; template class FitsMosaicStream; template class FitsMosaicStream; template class FitsMosaicStream; template FitsMosaicNextStream::FitsMosaicNextStream(FitsFile* p, FitsFile::FlushMode f) { this->flush_ = f; FitsStream* prev = (FitsStream*)p; this->primary_ = prev->primary(); this->managePrimary_ = 0; this->stream_ = prev->stream(); this->ext_ = prev->ext(); this->head_ = this->headRead(); if (!(this->head_ && this->head_->isValid())) { this->error(); return; } this->ext_++; // be sure to read all blocks, so that the next call starts on a boundary if (!this->dataRead(this->head_->datablocks()*FTY_BLOCK)) { this->error(); return; } this->inherit_ = this->head_->inherit(); this->valid_ = 1; } template class FitsMosaicNextStream; template class FitsMosaicNextStream; template class FitsMosaicNextStream; template class FitsMosaicNextStream; template class FitsMosaicNextStream; saods9/tksao1.0/fitsy++/strm.h000644 000765 000000 00000003467 12464214754 016371 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsstream_h__ #define __fitsstream_h__ #include "file.h" #include "zlib.h" typedef struct gzStream_ { z_stream zstream; int id; int transparent; unsigned char header[2]; int useHeader; unsigned char* buf; } *gzStream; template class FitsStream : public FitsFile { protected: T stream_; FitsFile::FlushMode flush_; int dataManage_; // flag, true if we manage data FitsHead* headRead(); int dataRead(size_t bytes, int validate =1); void dataSkip(size_t); void dataSkipBlock(size_t); void skipEnd(); size_t read(char*, size_t); void close(); void found(); void error(); public: FitsStream(); virtual ~FitsStream(); T stream() {return stream_;} FitsFile::FlushMode flush() {return flush_;} int dataManage() {return dataManage_;} void done() {close();} }; template class FitsFitsStream : public virtual FitsStream { protected: void processExact(); void processRelax(); public: FitsFitsStream(FitsFile::ScanMode, FitsFile::FlushMode); }; template class FitsFitsNextStream : public FitsStream { public: FitsFitsNextStream(FitsFile* prev); }; template class FitsArrStream : public virtual FitsStream { public: FitsArrStream(FitsFile::FlushMode); }; template class FitsNRRDStream : public virtual FitsStream { public: FitsNRRDStream(FitsFile::FlushMode); }; template class FitsMosaicStream : public virtual FitsStream { public: FitsMosaicStream(FitsFile::FlushMode); }; template class FitsMosaicNextStream : public FitsStream { public: FitsMosaicNextStream(FitsFile* prev, FitsFile::FlushMode); }; #endif saods9/tksao1.0/fitsy++/var.C000644 000765 000000 00000002157 12464214754 016122 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "var.h" FitsVar::FitsVar(Tcl_Interp* interp, const char* var, const char* fn) { parse(fn); if (!valid_) return; // reset valid_ =0; obj = Tcl_GetVar2Ex(interp, (char*)var, NULL, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG); if (!obj) return; // just in case Tcl_ConvertToType(interp, obj, Tcl_GetObjType("bytearray")); typedef struct ByteArray { int used; /* The number of bytes used in the byte * array. */ int allocated; /* The amount of space actually allocated * minus 1 byte. */ unsigned char bytes[4]; /* The array of bytes. The actual size of * this field depends on the 'allocated' field * above. */ } ByteArray; ByteArray* ba = (ByteArray*)(obj->internalRep.otherValuePtr); mapsize_ = ba->used; mapdata_ = (char*)ba->bytes; Tcl_IncrRefCount(obj); // so far, so good valid_ = 1; } FitsVar::~FitsVar() { if (obj) Tcl_DecrRefCount(obj); } saods9/tksao1.0/fitsy++/var.h000644 000765 000000 00000002577 12464214754 016175 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __fitsvar_h__ #define __fitsvar_h__ #include "map.h" class FitsVar : public virtual FitsMap { Tcl_Obj* obj; public: FitsVar(Tcl_Interp*, const char*, const char*); virtual ~FitsVar(); }; class FitsFitsVar : public FitsVar, public FitsFitsMap { public: FitsFitsVar(Tcl_Interp* interp, const char* var, const char* fn, ScanMode mode) : FitsVar(interp, var, fn), FitsFitsMap(mode) {} }; class FitsFitsNextVar : public FitsFitsNextMap { public: FitsFitsNextVar(FitsFile* prev) : FitsFitsNextMap(prev) {} }; class FitsArrVar : public FitsVar, public FitsArrMap { public: FitsArrVar(Tcl_Interp* interp, const char* var, const char* fn) : FitsVar(interp, var, fn), FitsArrMap() {} }; class FitsNRRDVar : public FitsVar, public FitsNRRDMap { public: FitsNRRDVar(Tcl_Interp* interp, const char* var, const char* fn) : FitsVar(interp, var, fn), FitsNRRDMap() {} }; class FitsMosaicVar : public FitsVar, public FitsMosaicMap { public: FitsMosaicVar(Tcl_Interp* interp, const char* var, const char* fn) : FitsVar(interp, var, fn), FitsMosaicMap() {} }; class FitsMosaicNextVar : public FitsMosaicNextMap { public: FitsMosaicNextVar(FitsFile* prev) : FitsMosaicNextMap(prev) {} }; #endif saods9/tksao1.0/colorbar/cbgrid.C000644 000765 000000 00000011725 12544546067 017110 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "cbgrid.h" #include "colorbarbase.h" #include "util.h" extern "C" { #include "ast.h" } extern Grid2dBase* astGrid2dPtr; CBGrid::CBGrid(Widget* p, int cc, double* ll) : Grid2dBase(p), cnt_(cc), lut_(ll) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)(((ColorbarBase*)parent_)->options); ostringstream str; // basics str << "Grid=0, DrawAxes=0, MinTickLen(1)=0, MinTickLen(2)=0, Colour(ticks)=0, Width(ticks)=.5, Style(ticks)=0, Border=1, Colour(border)=0, Width(border)=.5, Style(border)=0, Labelling=exterior, Colour(numlab)=0, TextLab=0, DrawTitle=0"; if (!opts->orientation) { // horizontal str << ", Edge(1)=top, Edge(2)=left, LabelUp(1)=1, MajTickLen(1)=-.15, MajTickLen(2)=0, NumLab(1)=1, NumLab(2)=0, NumLabGap(1)=.5"; } else { // vertical str << ", Edge(1)=bottom, Edge(2)=right, LabelUp(2)=1, MajTickLen(1)=0, MajTickLen(2)=-.15, NumLab(1)=0, NumLab(2)=1, NumLabGap(2)=.5"; } // font { char* fn = opts->font; int fz = opts->fontSize; char* fw = opts->fontWeight; char* fs = opts->fontSlant; int ff; if (!(strncmp(fn,"times",4) || strncmp(fw,"normal",4) || strncmp(fs,"roman",4))) ff = 1; else if (!(strncmp(fn,"helvetica",4) || strncmp(fw,"normal",4) || strncmp(fs,"roman",4))) ff = 2; else if (!(strncmp(fn,"courier",4) || strncmp(fw,"normal",4) || strncmp(fs,"roman",4))) ff = 4; else if (!(strncmp(fn,"times",4) || strncmp(fw,"bold",4) || strncmp(fs,"roman",4))) ff = 11; else if (!(strncmp(fn,"helvetica",4) || strncmp(fw,"bold",4) || strncmp(fs,"roman",4))) ff = 12; else if (!(strncmp(fn,"courier",4) || strncmp(fw,"bold",4) || strncmp(fs,"roman",4))) ff = 14; else if (!(strncmp(fn,"times",4) || strncmp(fw,"normal",4) || strncmp(fs,"italic",4))) ff = 21; else if (!(strncmp(fn,"helvetica",4) || strncmp(fw,"normal",4) || strncmp(fs,"italic",4))) ff = 22; else if (!(strncmp(fn,"courier",4) || strncmp(fw,"normal",4) || strncmp(fs,"italic",4))) ff = 24; else if (!(strncmp(fn,"times",4) || strncmp(fw,"bold",4) || strncmp(fs,"italic",4))) ff = 31; else if (!(strncmp(fn,"helvetica",4) || strncmp(fw,"bold",4) || strncmp(fs,"italic",4))) ff = 32; else if (!(strncmp(fn,"courier",4) || strncmp(fw,"bold",4) || strncmp(fs,"italic",4))) ff = 34; else ff = 1; str << ", Font(numlab)=" << ff << ", Size(numlab)=" << fz << ends; } option_ = dupstr(str.str().c_str()); } int CBGrid::render() { gc_ = ((ColorbarBase*)parent_)->gc; pixmap_ = ((ColorbarBase*)parent_)->pixmap; return doit(X11); } int CBGrid::ps(int mode, int x, int y) { matrix_ = Translate(x,y); mode_ = mode; return doit(PS); } #ifdef MAC_OSX_TK int CBGrid::macosx(int x, int y) { matrix_ = Translate(x,y); return doit(MACOSX); } #endif #ifdef __WIN32 int CBGrid::win32(int x, int y) { matrix_ = Translate(x,y); return doit(GWIN32); } #endif int CBGrid::doit(RenderMode rm) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)(((ColorbarBase*)parent_)->options); astClearStatus; // just to make sure astBegin; // start memory management AstFrameSet* frameSet = NULL; AstCmpMap* cmp = NULL; AstLutMap* aa = NULL; AstUnitMap* bb = NULL; AstPlot* plot = NULL; if (!(frameSet = astFrameSet(astFrame(2,"Domain=WIDGET"),""))) goto error; if (!(bb = astUnitMap(1,""))) goto error; if (!opts->orientation) { if (!(aa = astLutMap(cnt_, lut_, 0, double(opts->width)/(cnt_-1), ""))) goto error; if (!(cmp = astCmpMap(aa, bb, 0, ""))) goto error; } else { if (!(aa = astLutMap(cnt_, lut_, 0, double(opts->height)/(cnt_-1), ""))) goto error; if (!(cmp = astCmpMap(bb, aa, 0, ""))) goto error; } astAddFrame(frameSet, AST__CURRENT, cmp, astFrame(2, "Domain=LUT")); astSet(frameSet,"Title=%s", " "); if (0) { int status = astStatus; astClearStatus; astShow(frameSet); astSetStatus(status); } // create astPlot float gbox[4]; double pbox[4]; int ww,hh,zz; if (!opts->orientation) { ww = opts->width; hh = opts->size; } else { ww = opts->size; hh = opts->height; } zz =0; switch (rm) { case X11: ww -= 1; hh -= 1; break; case PS: zz = 1; break; case MACOSX: break; case GWIN32: break; } if (!opts->orientation) { gbox[0] = pbox[0] = 0; gbox[1] = pbox[1] = zz; gbox[2] = pbox[2] = ww; gbox[3] = pbox[3] = hh; } else { gbox[0] = 0; gbox[1] = zz; gbox[2] = ww; gbox[3] = hh; pbox[0] = zz; pbox[1] = hh; pbox[2] = ww; pbox[3] = 0; } plot = astPlot(frameSet, gbox, pbox, option_); // and now create astGrid astGrid2dPtr = this; renderMode_ = rm; astGrid(plot); astEnd; // now, clean up memory return 1; error: astEnd; return 0; } saods9/tksao1.0/colorbar/cbgrid.h000644 000765 000000 00000001061 12544546067 017145 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __cbgrid_h__ #define __cbgrid_h__ #include #include "grid2dbase.h" #include "vector.h" class CBGrid : public Grid2dBase { private: int cnt_; double* lut_; int doit(RenderMode); public: CBGrid(Widget*, int, double*); int render(); int ps(int, int, int); #ifdef MAC_OSX_TK int macosx(int, int); #endif #ifdef __WIN32 int win32(int, int); #endif }; #endif saods9/tksao1.0/colorbar/colorbar.C000644 000765 000000 00000044554 12544546067 017467 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "colorbar.h" #include "util.h" #include "ps.h" #include "lut.h" #include "sao.h" #include "default.h" Colorbar::Colorbar(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item) { colorIndex = NULL; bias = .5; contrast = 1.0; tag =NULL; tagaction =NONE; taginit =0; } Colorbar::~Colorbar() { if (colorIndex) delete [] colorIndex; } void Colorbar::adjustCmd(float c, float b) { contrast = c; bias = b; updateColors(); } void Colorbar::getBiasCmd() { ostringstream str; str << bias << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Colorbar::getColorbarCmd() { if (cmaps.current()) { ostringstream str; str << cmaps.current()->getID() << ' ' << bias << ' ' << contrast << ' ' << invert << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } else result = TCL_ERROR; } void Colorbar::getColormapCmd() { if (cmaps.current()) { ostringstream str; str << cmaps.current()->getID() << ' ' << bias << ' ' << contrast << ' ' << invert << ' ' << colorIndex << ' ' << (unsigned short*)colorCells << ' ' << colorCount << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } else result = TCL_ERROR; } void Colorbar::getColormapNameCmd(int id) { ColorMapInfo* ptr = cmaps.begin(); while (ptr) { if (ptr->getID() == id) { Tcl_AppendResult(interp, (char*)ptr->getName(), NULL); return; } ptr = ptr->next(); } // if we got this far, we did not find it, bail out Tcl_AppendResult(interp, " colormap not found.", NULL); result = TCL_ERROR; } void Colorbar::getColormapFileNameCmd(int id) { ColorMapInfo* ptr = cmaps.begin(); while (ptr) { if (ptr->getID() == id) { Tcl_AppendResult(interp, (char*)ptr->getFileName(), NULL); return; } ptr = ptr->next(); } // if we got this far, we did not find it, bail out Tcl_AppendResult(interp, " colormap not found.", NULL); result = TCL_ERROR; } void Colorbar::getContrastCmd() { ostringstream str; str << contrast << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Colorbar::getCurrentIDCmd() { if (cmaps.current()) { ostringstream str; str << cmaps.current()->getID() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } else result = TCL_ERROR; } void Colorbar::getCurrentNameCmd() { if (cmaps.current()) Tcl_AppendElement(interp, (char*)cmaps.current()->getName()); else result = TCL_ERROR; } void Colorbar::getCurrentFileNameCmd() { if (cmaps.current()) Tcl_AppendElement(interp, (char*)cmaps.current()->getFileName()); else result = TCL_ERROR; } void Colorbar::getRGBChannelCmd() { Tcl_AppendResult(interp, "red", NULL); } void Colorbar::listIDCmd() { ColorMapInfo* ptr = cmaps.begin(); while (ptr) { ostringstream str; str << ptr->getID() << ends; Tcl_AppendElement(interp, str.str().c_str()); ptr = ptr->next(); } } void Colorbar::listNameCmd() { ColorMapInfo* ptr = cmaps.begin(); while (ptr) { Tcl_AppendElement(interp, (char*)ptr->getName()); ptr = ptr->next(); } } void Colorbar::loadCmd(const char* fn, const char* type) { ColorMapInfo* map = newColorMap(fn, type); if (map && map->load()) { // add new colormap to end of the list cmaps.append(map); reset(); } else { // something has gone wrong, clean up, and bail out delete map; Tcl_AppendResult(interp, " unable to load colormap: ", fn, NULL); result = TCL_ERROR; } } void Colorbar::loadCmd(const char* fn, const char* type, const char* var) { ColorMapInfo* map = newColorMap(fn, type); if (map && map->load(var)) { // add new colormap to end of the list cmaps.append(map); reset(); } else { // something has gone wrong, clean up, and bail out delete map; Tcl_AppendResult(interp, " unable to load colormap: ", fn, NULL); result = TCL_ERROR; } } void Colorbar::mapCmd(char* which) { char* a = toLower(which); cmaps.head(); do { char* b = toLower(cmaps.current()->getName()); if (!strcmp(a,b)) { reset(); delete [] a; delete [] b; return; } delete [] b; } while (cmaps.next()); // if we got this far, we did not find it, bail out cmaps.head(); delete [] a; result = TCL_ERROR; } void Colorbar::mapCmd(int id) { cmaps.head(); do { if (cmaps.current()->getID() == id) { reset(); return; } } while (cmaps.next()); // if we got this far, we did not find it, bail out cmaps.head(); result = TCL_ERROR; } void Colorbar::saveCmd(const char* fn) { cmaps.current()->save(fn); } void Colorbar::saveCmd(int id, const char* fn) { ColorMapInfo* ptr = cmaps.begin(); while (ptr) { if (ptr->getID() == id) { ptr->save(fn); return; } ptr = ptr->next(); } result = TCL_ERROR; } void Colorbar::setColorbarCmd(int id, float b, float c, int i) { cmaps.head(); while (cmaps.current()) { if (cmaps.current()->getID() == id) { bias = b; contrast = c; invert = i; updateColors(); return; } cmaps.next(); } // if we got this far, we did not find it, bail out cmaps.head(); result = TCL_ERROR; } void Colorbar::getTagCmd() { ostringstream str; ctags.head(); while (ctags.current()) { str << ctags.current()->start() << ' ' << ctags.current()->stop() << ' ' << ctags.current()->colorname() << ' '; ctags.next(); } str << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void Colorbar::getTagCmd(int xx, int yy) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int rr,ss; if (!opts->orientation) { rr = xx; ss = float(rr)/opts->width * colorCount; } else { rr = yy; ss = (1-float(rr)/opts->height) * colorCount; } ctags.head(); while (ctags.current()) { if (ss>ctags.current()->start() && ssstop()) { int startid = float(ctags.current()->start())/colorCount * cnt; int stopid = float(ctags.current()->stop())/colorCount * cnt; if (startid<0) startid = 0; if (startid>=cnt) startid = cnt-1; if (stopid<0) stopid = 0; if (stopid>=cnt) stopid = cnt-1; ostringstream str; str << ctags.current()->id() << ' ' << lut[startid] << ' ' << lut[stopid] << ' ' << ctags.current()->colorname() << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return; } ctags.next(); } } void Colorbar::tagCmd(const char* txt) { ctags.deleteAll(); istringstream str(txt); while (!str.eof()) { int aa =0; int bb =0; char color[32]; *color ='\0'; str >> aa >> bb >> color; if (aa && bb && *color) ctags.append(new ColorTag(this,aa,bb,color)); } updateColors(); } void Colorbar::tagCmd(int id, const Vector& v, const char* color) { Vector vv = v; int mm=0; int nn=0; ctags.head(); while (ctags.current()) { if (ctags.current()->id() == id) { // special case if (vv[0]>lut[cnt-1] && vv[1]>lut[cnt-1]) return; else if (vv[0]=0; ii--) if (vv[1]>lut[ii]) { nn=ii; break; } Vector rr = Vector(mm,nn)/cnt*colorCount; ctags.current()->set(rr[0],rr[1],color); updateColors(); return; } ctags.next(); } } void Colorbar::tagDeleteCmd() { ctags.deleteAll(); updateColors(); } void Colorbar::tagDeleteCmd(int xx, int yy) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int rr,ss; if (!opts->orientation) { rr = xx; ss = float(rr)/opts->width * colorCount; } else { rr = yy; ss = (1-float(rr)/opts->height) * colorCount; } ctags.head(); while (ctags.current()) { if (ss>ctags.current()->start() && ssstop()) { ColorTag* ct = ctags.extract(); if (ct) delete ct; updateColors(); return; } ctags.next(); } } void Colorbar::tagEditBeginCmd(int xx, int yy, const char* color) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; tag= NULL; tagaction =NONE; taginit =0; int rr,ss; if (!opts->orientation) { rr = xx; ss = float(rr)/opts->width * colorCount; } else { rr = yy; ss = (1-float(rr)/opts->height) * colorCount; } ctags.head(); while (ctags.current()) { int start = ctags.current()->start(); int stop = ctags.current()->stop(); if (ss>start && ssstop-10 && ssstart && ssorientation) { rr = xx; ss = float(rr)/opts->width * colorCount; tt = float(taginit)/opts->width *colorCount; } else { rr = yy; ss = (1-float(rr)/opts->height) * colorCount; tt = (1-float(taginit)/opts->height) *colorCount; } switch (tagaction) { case NONE: break; case CREATE: tagaction =STOP; tag->move(0,ss-tt); break; case START: tag->move(ss-tt,0); break; case STOP: tag->move(0,ss-tt); break; case MOVE: tag->move(ss-tt,ss-tt); break; } taginit = rr; updateColors(); } } void Colorbar::tagEditEndCmd(int xx, int yy) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; if (tag) { int rr,ss,tt; if (!opts->orientation) { rr = xx; ss = float(rr)/opts->width * colorCount; tt = float(taginit)/opts->width *colorCount; } else { rr = yy; ss = (1-float(rr)/opts->height) * colorCount; tt = (1-float(taginit)/opts->height) *colorCount; } switch (tagaction) { case NONE: break; case CREATE: tag->width(100); break; case START: break; case STOP: break; case MOVE: break; } updateColors(); } } void Colorbar::tagLoadCmd(const char* fn) { ifstream str(fn); if (str) { ctags.deleteAll(); while (!str.eof()) { int mm=0; int nn=0; double aa =0; double bb =0; char color[32]; *color ='\0'; str >> aa >> bb >> color; if (aa && bb && *color) { // special case if (aa>lut[cnt-1] && bb>lut[cnt-1]) continue; else if (aa=0; ii--) if (bb>lut[ii]) { nn=ii; break; } Vector rr = Vector(mm,nn)/cnt*colorCount; ctags.append(new ColorTag(this,rr[0],rr[1],color)); } } updateColors(); } } void Colorbar::tagSaveCmd(const char* fn) { ofstream str(fn); if (str) { ctags.head(); while (ctags.current()) { int startid = float(ctags.current()->start())/colorCount * cnt; int stopid = float(ctags.current()->stop())/colorCount * cnt; if (startid<0) startid = 0; if (startid>=cnt) startid = cnt-1; if (stopid<0) stopid = 0; if (stopid>=cnt) stopid = cnt-1; str << lut[startid] << ' ' << lut[stopid] << ' ' << ctags.current()->colorname() << endl; ctags.next(); } } } // private int Colorbar::calcContrastBias(int i) { // if default (contrast = 1.0 && bias = .5) return if (fabs(bias - 0.5) < 0.0001 && fabs(contrast - 1.0) < 0.0001) return i; // map i to range of 0 to 1.0 // shift by bias (if invert, bias = 1-bias) // multiply by contrast // shift to center of region // expand back to number of dynamic colors float b = invert ? 1-bias : bias; int r = (int)(((((float)i / colorCount) - b) * contrast + .5 ) * colorCount); // clip to bounds if out of range if (r < 0) return 0; else if (r >= colorCount) return colorCount-1; else return r; } void Colorbar::reset() { bias = 0.5; contrast = 1.0; invert = 0; updateColors(); } void Colorbar::loadDefaultCMaps() { cmaps.append(new GreyColorMap(this)); cmaps.append(new RedColorMap(this)); cmaps.append(new GreenColorMap(this)); cmaps.append(new BlueColorMap(this)); cmaps.append(new AColorMap(this)); cmaps.append(new BColorMap(this)); cmaps.append(new BBColorMap(this)); cmaps.append(new HEColorMap(this)); cmaps.append(new I8ColorMap(this)); cmaps.append(new AIPSColorMap(this)); cmaps.append(new SLSColorMap(this)); cmaps.append(new HSVColorMap(this)); cmaps.append(new HeatColorMap(this)); cmaps.append(new CoolColorMap(this)); cmaps.append(new RainbowColorMap(this)); cmaps.append(new StandardColorMap(this)); cmaps.append(new StaircaseColorMap(this)); cmaps.append(new ColorColorMap(this)); cmaps.head(); } ColorMapInfo* Colorbar::newColorMap(const char* fn, const char* type) { // determine colormap type char* tmp = dupstr(fn); // tmp memory, we will mangle it char* ptr = tmp; while (*ptr++); // walk forward till end of string ptr--; // backup one while (ptr != tmp && *ptr != '.') // march backward looking for '.' ptr--; if (ptr != tmp) { // are we at '.' or start of string *ptr = '\0'; // mark end of string at '.' ptr++; } // Create ColorMap ColorMapInfo* map = NULL; // if type specified, use it, otherwise, use file extension if (type) ptr = (char*)type; if (strncmp(ptr, "lut", 3) == 0) map = new LUTColorMap(this); else map = new SAOColorMap(this); // Bail out if we don't have a new ColorMap if (!map) return NULL; // Extract a name from the file name. Any extension has already been removed. ptr = tmp; while (*ptr++); // walk forward till end of string while (ptr != tmp && *ptr != '/') // march backward looking for '/' ptr--; if (ptr != tmp) // see if we found '/' or at begining of string ptr++; map->setName(ptr); map->setFileName(fn); delete [] tmp; // clean up return map; } void Colorbar::psHorz(Filter& filter, int width, int height) { for (int jj=0; jjorientation) { for (int jj=0; jjorientation) { for (int jj=0; jj cmaps; List ctags; unsigned short* colorIndex; float bias; float contrast; ColorTag* tag; ColorTagAction tagaction; int taginit; private: ColorMapInfo* newColorMap(const char*, const char*); void psHorz(Filter&, int, int); void psVert(Filter&, int, int); protected: void loadDefaultCMaps(); void reset(); int calcContrastBias(int); #ifdef MAC_OSX_TK void macosx(float, int, int, const Vector&, const Vector&); #endif #ifdef __WIN32 void win32(float, int, int, const Vector&, const Vector&); #endif public: Colorbar(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~Colorbar(); // commands void adjustCmd(float, float); void getBiasCmd(); void getColorbarCmd(); void getColormapCmd(); void getColormapNameCmd(int); void getColormapFileNameCmd(int); void getContrastCmd(); void getCurrentFileNameCmd(); void getCurrentIDCmd(); void getCurrentNameCmd(); void listIDCmd(); void listNameCmd(); void loadCmd(const char*, const char*); void loadCmd(const char*, const char*, const char*); void mapCmd(char*); void mapCmd(int); void saveCmd(const char*); void saveCmd(int, const char*); void setColorbarCmd(int, float, float, int); void getTagCmd(); void getTagCmd(int,int); void tagCmd(const char*); void tagCmd(int, const Vector&, const char*); void tagDeleteCmd(); void tagDeleteCmd(int,int); void tagEditBeginCmd(int,int,const char*); void tagEditMotionCmd(int,int); void tagEditEndCmd(int,int); void tagLoadCmd(const char*); void tagSaveCmd(const char*); void getRGBChannelCmd(); }; #endif saods9/tksao1.0/colorbar/colorbarbase.C000644 000765 000000 00000056561 12544546067 020323 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colorbarbase.h" #include "util.h" #include "tkpostscript.h" #include "cbgrid.h" #include "ps.h" #define TICKLEN 3 #define TICKGAP 7 // Parser Stuff #undef yyFlexLexer #define yyFlexLexer cbFlexLexer #include void* cblval; extern int cbparse(ColorbarBase*, cbFlexLexer*); int cblex(void* vval, cbFlexLexer* ll) { cblval = vval; return ll ? ll->yylex() : 0; } void cberror(ColorbarBase* cb, cbFlexLexer* ll, const char* m) { cb->error(m); const char* cmd = ll ? ll->YYText() : (const char*)NULL; if (cmd && cmd[0] != '\n') { cb->error(": "); cb->error(cmd); } } // Public Member Functions ColorbarBase::ColorbarBase(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : Widget(i,c,item) { // this is needed because of a problem with Tk_ConfigureWidget ((ColorbarBaseOptions*)options)->font = NULL; ((ColorbarBaseOptions*)options)->fontWeight = NULL; ((ColorbarBaseOptions*)options)->fontSlant = NULL; xmap = NULL; colorCells = NULL; colorCount = 0; grid = NULL; gc = NULL; cnt = 0; lut = NULL; invert = 0; ticktxt = NULL; tickcnt =0; skipcnt =0; } ColorbarBase::~ColorbarBase() { if (xmap) XDestroyImage(xmap); if (colorCells) delete [] colorCells; if (grid) delete grid; if (gc) XFreeGC(display, gc); if (lut) delete [] lut; if (ticktxt) { for (int ii=0; iiorientation) { // horizontal id = (int)(x/float(options->width) * cnt); } else { // vertical id = (int)((options->height -y)/float(options->height) * cnt); } if (id<0) id = 0; if (id>=cnt) id = cnt-1; str << lut[id] << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } else Tcl_AppendResult(interp, NULL); } void ColorbarBase::invalidPixmap() { Widget::invalidPixmap(); if (xmap) XDestroyImage(xmap); xmap = NULL; } void ColorbarBase::invertCmd(int ii) { invert = ii ? 1 : 0; updateColors(); } int ColorbarBase::parse(istringstream& istr) { result = TCL_OK; cbFlexLexer* ll = new cbFlexLexer(&istr); cbparse(this, ll); delete ll; return result; } Tk_Font ColorbarBase::getFont() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; ostringstream fstr; #ifdef MAC_OSX_TK int fz = int(opts->fontSize*getDisplayRatio()); #else int fz = opts->fontSize; #endif if (!strncmp(opts->font,"helvetica",4)) fstr << '{' << opts->helvetica << '}' << ' ' << fz << ' ' << opts->fontWeight << ' ' << opts->fontSlant << ends; else if (!strncmp(opts->font,"courier",4)) fstr << '{' << opts->courier << '}' << ' ' << fz << ' ' << opts->fontWeight << ' ' << opts->fontSlant << ends; else if (!strncmp(opts->font,"times",4)) fstr << '{' << opts->times << '}' << ' ' << fz << ' ' << opts->fontWeight << ' ' << opts->fontSlant << ends; else fstr << '{' << opts->helvetica << '}' << ' ' << fz << ' ' << opts->fontWeight << ' ' << opts->fontSlant << ends; return Tk_GetFont(interp, tkwin, fstr.str().c_str()); } void ColorbarBase::lutToText(Tk_Font font) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; // init if (ticktxt) for (int ii=0; iiticks; ticktxt = new char*[opts->ticks]; for (int ii=0; iiticks; ii++) ticktxt[ii] = NULL; skipcnt =0; // first estimate of prec int prec; { int aa = (int)(log10(fabs(lut[0]))); int bb = (int)(log10(fabs(lut[cnt-1]))); if (aa != bb) prec = aa>bb ? aa : bb; else prec = 1; } // up to three tries for (int jj=0; jj<3; jj++) { // render text for (int ii=0; iiticks; ii++) { int id = ii/double(opts->ticks-1)*cnt; // the last one will be one over if (id>=cnt) id = cnt-1; ostringstream str; if (prec < -2) str << scientific << setprecision(2+jj) << lut[id] << ends; else if (prec < 0) str << fixed << setprecision(abs(prec)+3+jj) << lut[id] << ends; else if (prec < 2) str << setprecision(2+jj) << lut[id] << ends; else if (prec < 5) str << fixed << setprecision(0+jj) << lut[id] << ends; else str << scientific << setprecision(2+jj) << lut[id] << ends; if (ticktxt[ii]) delete [] ticktxt[ii]; ticktxt[ii] = new char[strlen(str.str().c_str())+1]; strcpy(ticktxt[ii],str.str().c_str()); } // now see if all is unique int ok=1; for (int ii=1; iiticks; ii++) { if (!strcmp(ticktxt[ii-1],ticktxt[ii])) ok=0; } if (ok) break; } // determine skipcnt Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); if (!opts->orientation) { // horizontal int ww =0; for (int ii=0; iiticks; ii++) { if (ticktxt[ii]) { int aa = Tk_TextWidth(font, ticktxt[ii], strlen(ticktxt[ii])); if (aa>ww) ww = aa; } } skipcnt = (ww+2)*opts->ticks/opts->width; } else { // vertical int total = (metrics.linespace+1)*opts->ticks; skipcnt = total/opts->height; } } void ColorbarBase::setColormapLevelCmd() { if (lut) delete [] lut; lut = NULL; cnt = 0; invalidPixmap(); redraw(); } void ColorbarBase::setColormapLevelCmd(int cc, double* ff) { // check for the same if (cnt == cc) { int same = 1; for (int ii=0; iiwidth, options->height, depth))) { internalError("Colorbar: Unable to Create Pixmap"); return TCL_OK; } if (!gc) gc = XCreateGC(display, Tk_WindowId(tkwin), 0, NULL); XSetForeground(display, gc, getColor("white")); XFillRectangle(display, pixmap, gc, 0, 0, options->width,options->height); if (!opts->orientation) { if (!(xmap = XGetImage(display, pixmap, 1, 1, options->width-2, opts->size-2, AllPlanes, ZPixmap))){ internalError("Colorbar: Unable to Create XImage"); return TCL_OK; } } else { if (!(xmap = XGetImage(display, pixmap, 1, 1, opts->size-2, options->height-2, AllPlanes, ZPixmap))){ internalError("Colorbar: Unable to Create XImage"); return TCL_OK; } } ximageToPixmap(); if (opts->numerics && opts->space) { renderGridAST(); return TCL_OK; } // we want a border, even with no numerics renderGrid(); return TCL_OK; } void ColorbarBase::renderGrid() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; // box XSetForeground(display, gc, getColor("black")); if (!opts->orientation) XDrawRectangle(display, pixmap, gc, 0, 0, options->width-1, opts->size-1); else XDrawRectangle(display, pixmap, gc, 0, 0, opts->size-1, options->height-1); if (opts->numerics && lut) renderGridNumerics(); } void ColorbarBase::renderGridNumerics() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; // font Tk_Font font = getFont(); if (!font) return; // bad font, we're done Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); // set font XSetFont(display, gc, Tk_FontId(font)); // generate text lutToText(font); // tick marks int incrcnt=0; for (int ii=1; iiticks-1; ii++) { if (!opts->orientation) { // horizontal int ww = (int)(ii/double(opts->ticks-1)*opts->width); int h = opts->size-1; int hh = opts->size-1 + TICKLEN; XDrawLine(display, pixmap, gc, ww, h, ww, hh); if (!incrcnt) { int txtwidth = Tk_TextWidth(font, ticktxt[ii], strlen(ticktxt[ii])); int www = ww - txtwidth/2.; int hhh = hh + TICKGAP + metrics.ascent; Tk_DrawChars(display, pixmap, gc, font, ticktxt[ii], strlen(ticktxt[ii]), www, hhh); } } else { // vertical int w = opts->size-1; int ww = opts->size-1 + TICKLEN; int hh = opts->height - (int)(ii/double(opts->ticks-1)*opts->height); XDrawLine(display, pixmap, gc, w, hh, ww, hh); if (!incrcnt) { int www = ww + TICKGAP; int hhh = hh + (metrics.ascent-metrics.descent)/2.; Tk_DrawChars(display, pixmap, gc, font, ticktxt[ii], strlen(ticktxt[ii]), www, hhh); } } if (incrcnt1 && lut) { grid = new CBGrid(this, cnt, lut); if (grid) grid->render(); } } // PS int ColorbarBase::postscriptProc(int prepass) { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; if (!visible) return TCL_OK; if (prepass) return TCL_OK; // bar Tcl_AppendResult(interp, "gsave\n", NULL); ps(); Tcl_AppendResult(interp, "grestore\n", NULL); // numerics Tcl_AppendResult(interp, "gsave\n", NULL); if (opts->numerics && opts->space && grid) { psGridAST(); Tcl_AppendResult(interp, "grestore\n", NULL); return TCL_OK; } // we want a border, even if no numerics psGrid(); Tcl_AppendResult(interp, "grestore\n", NULL); return TCL_OK; } void ColorbarBase::ps() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int& width = options->width; int& height = options->height; int& size = opts->size; // image int ww,hh; Vector org = psOrigin(); if (!opts->orientation) { ww = width; hh = size; org += Vector(0,height-size); } else { ww = size; hh = height; } ostringstream str; str << org[0] << ' ' << org[1] << " translate" << endl << 1 << ' ' << 1 << " scale" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); switch (psLevel) { case 1: { psHead1(ww, hh); NoCompressAsciiHex filter(psLevel); psHV(filter, ww, hh); } break; case 2: { psHead2(ww, hh, "RunLength", "ASCII85"); RLEAscii85 filter(psLevel); psHV(filter, ww, hh); } break; case 3: { psHead2(ww, hh, "Flate", "ASCII85"); GZIPAscii85 filter(psLevel); psHV(filter, ww, hh); } break; } } void ColorbarBase::psHV(Filter& filter, int width, int height) { if (!((ColorbarBaseOptions*)options)->orientation) psHorz(filter, width, height); else psVert(filter, width, height); ostringstream str; filter.flush(str); psFix(str); Tcl_AppendResult(interp, str.str().c_str(), NULL); } void ColorbarBase::psGrid() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int& width = options->width; int& height = options->height; int& size = opts->size; // box int ww,hh; Vector org = psOrigin(); if (!opts->orientation) { ww = width; hh = size; org += Vector(0,height-size); } else { ww = size; hh = height; } Vector ll = Vector(0,0); Vector lr = Vector(ww,0); Vector ur = Vector(ww,hh); Vector ul = Vector(0,hh); ostringstream str; str << org[0] << ' ' << org[1] << " translate " << endl << "newpath " << endl << ll << "moveto " << endl << lr << "lineto " << endl << ur << "lineto " << endl << ul << "lineto " << endl << ll << "lineto " << endl << "closepath " << endl << .5 << " setlinewidth" << endl << " stroke" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); // numerics if (opts->numerics && lut) psGridNumerics(); } void ColorbarBase::psGridNumerics() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; // font Tk_Font font = NULL; { ostringstream fstr; fstr << opts->font << ' ' << opts->fontSize << ' ' << opts->fontWeight << ' ' << opts->fontSlant << ends; font = Tk_GetFont(interp, tkwin, fstr.str().c_str()); if (!font) return; // bad font, we're done } // set font { ostringstream str; str << '/' << psFontName(opts->font, opts->fontWeight, opts->fontSlant) << " findfont " << int(opts->fontSize*getDisplayRatio()) << " scalefont setfont" << endl; Tcl_AppendResult(interp, str.str().c_str(), NULL); } // generate text lutToText(font); // tick marks int incrcnt=0; for (int ii=0; iiticks; ii++) { if (!opts->orientation) { // horizontal int ww = (int)(ii/double(opts->ticks-1)*opts->width); int h = 0; int hh = h-TICKLEN; ostringstream str; str << "newpath " << endl << Vector(ww,h) << "moveto " << endl << Vector(ww,hh) << "lineto " << endl << "closepath " << endl << .5 << " setlinewidth" << endl << " stroke" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); if (!incrcnt) { ostringstream str; Vector tt = Vector(ww,hh-TICKGAP); str << "newpath " << endl << tt << " moveto" << endl << '(' << psQuote(ticktxt[ii]) << ')' << "dup true charpath pathbbox " << endl << "closepath " << endl << "3 -1 roll sub 1.2 mul neg " << endl << "3 1 roll sub 2 div exch " << endl << tt << " moveto rmoveto show " << endl; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } else { // vertical int w = opts->size; int ww = opts->size + TICKLEN; int hh = (int)(ii/double(opts->ticks-1)*opts->height); ostringstream str; str << "newpath " << endl << Vector(w,hh) << "moveto " << endl << Vector(ww,hh) << "lineto " << endl << "closepath " << endl << .5 << " setlinewidth" << endl << " stroke" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); if (!incrcnt) { ostringstream str; Vector tt = Vector(ww+TICKGAP,hh); str << "newpath " << endl << tt << " moveto" << endl << '(' << psQuote(ticktxt[ii]) << ')' << "dup true charpath pathbbox " << endl << "closepath " << endl << "3 -1 roll sub 2 div neg " << endl << "3 1 roll pop pop 0 exch " << endl << tt << " moveto rmoveto show " << endl; Tcl_AppendResult(interp, str.str().c_str(), NULL); } } if (incrcntwidth, options->height); float delta = 4*opts->fontSize; // clip rect (to remove ticks on inside) if (!opts->orientation) { oo += Vector(-delta,-.5); uu += Vector(2*delta,-.75); } else { oo += Vector(-.25,-delta); uu += Vector(0,2*delta); } Matrix mm = Translate(psOrigin()); Vector ll = oo*mm; Vector lr = Vector(uu[0],oo[1])*mm; Vector ur = uu*mm; Vector ul = Vector(oo[0],uu[1])*mm; ostringstream str; str << "newpath " << endl << ll << "moveto " << endl << lr << "lineto " << endl << ur << "lineto " << endl << ul << "lineto " << endl << ll << "lineto " << endl << "closepath clip" << endl << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); // grid if (grid) grid->ps(psColorSpace, originX, originY); } // MacOSX #ifdef MAC_OSX_TK void ColorbarBase::macosxPrintCmd() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; if (!visible) return; // init macosxBegin(); int ww,hh; if (!opts->orientation) { ww = options->width; hh = opts->size; } else { ww = opts->size; hh = options->height; } // image macosx(1, ww, hh, Vector(originX,originY), Vector(ww,hh)); // grid if (opts->numerics && opts->space && grid) { macosxGridAST(); macosxEnd(); return; } // we want a border, even if no numerics macosxGrid(); macosxEnd(); } void ColorbarBase::macosxGrid() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int& width = options->width; int& height = options->height; int& size = opts->size; Matrix mm = Translate(originX, originY); macosxColor(getXColor("black")); macosxDash(NULL,0); macosxWidth(.5); // Box int ww,hh; if (!opts->orientation) { ww = width; hh = size; } else { ww = size; hh = height; } Vector v[5]; v[0] = Vector(0,0) * mm; v[1] = Vector(ww,0) * mm; v[2] = Vector(ww,hh) * mm; v[3] = Vector(0,hh) * mm; v[4] = Vector(0,0) * mm; macosxDrawLines(v,5); // numerics if (opts->numerics && lut) macosxGridNumerics(); } void ColorbarBase::macosxGridNumerics() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; Matrix mm = Translate(originX, originY); // font Tk_Font font = getFont(); if (!font) return; // bad font, we're done Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); // set font Tcl_DString psFont; Tcl_DStringInit(&psFont); int psSize = Tk_PostscriptFontName(font, &psFont); macosxFont(Tcl_DStringValue(&psFont), psSize); Tcl_DStringFree(&psFont); // generate text lutToText(font); // tick marks int incrcnt=0; for (int ii=0; iiticks; ii++) { if (!opts->orientation) { // horizontal int ww = (int)(ii/double(opts->ticks-1)*opts->width); int h = opts->size; int hh = opts->size + TICKLEN; Vector vv[2]; vv[0] = Vector(ww,h)*mm; vv[1] = Vector(ww,hh)*mm; macosxDrawLines(vv,2); if (!incrcnt) { int txtwidth = Tk_TextWidth(font, ticktxt[ii], strlen(ticktxt[ii])); int www = ww - txtwidth/2.; int hhh = hh + TICKGAP + metrics.ascent; macosxDrawText(Vector(www,hhh)*mm, 0, ticktxt[ii]); } } else { // vertical int w = opts->size; int ww = opts->size + TICKLEN; int hh = opts->height - (int)(ii/double(opts->ticks-1)*opts->height); Vector vv[2]; vv[0] = Vector(w,hh)*mm; vv[1] = Vector(ww,hh)*mm; macosxDrawLines(vv,2); if (!incrcnt) { int www = ww + TICKGAP; int hhh = hh + (metrics.ascent-metrics.descent)/2.; macosxDrawText(Vector(www,hhh)*mm, 0, ticktxt[ii]); } } if (incrcntwidth, options->height); float delta = 4*opts->fontSize; if (!opts->orientation) { oo += Vector(-delta,-.2); uu += Vector(2*delta,-.2); } else { oo += Vector(-.2,-delta); uu += Vector(0,2*delta); } macosxClip(oo,uu); if (grid) grid->macosx(originX, originY); } #endif // WIN32 #ifdef __WIN32 void ColorbarBase::win32PrintCmd() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; if (!visible) return; // init win32Begin(); int ww,hh; if (!opts->orientation) { ww = options->width; hh = opts->size; } else { ww = opts->size; hh = options->height; } // image win32(1, ww, hh, Vector(originX,originY), Vector(ww,hh)); // grid if (opts->numerics && opts->space && grid) { win32GridAST(); win32End(); } // we want a border, even if no numerics win32Grid(); win32End(); } void ColorbarBase::win32Grid() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; int& width = options->width; int& height = options->height; int& size = opts->size; Matrix mm = Translate(originX, originY); win32Color(getXColor("black")); win32Dash(NULL,0); win32Width(.5); // box int ww,hh; if (!opts->orientation) { ww = width; hh = size; } else { ww = size; hh = height; } Vector v[5]; v[0] = Vector(0,0) * mm; v[1] = Vector(ww,0) * mm; v[2] = Vector(ww,hh) * mm; v[3] = Vector(0,hh) * mm; v[4] = Vector(0,0) * mm; win32DrawLines(v,5); // numerics if (opts->numerics && lut) win32GridNumerics(); } void ColorbarBase::win32GridNumerics() { ColorbarBaseOptions* opts = (ColorbarBaseOptions*)options; Matrix mm = Translate(originX, originY); // font Tk_Font font = getFont(); if (!font) return; // bad font, we're done Tk_FontMetrics metrics; Tk_GetFontMetrics(font, &metrics); win32Font(font); // generate text lutToText(font); // tick marks int incrcnt=0; for (int ii=0; iiticks; ii++) { if (!opts->orientation) { // horizontal int ww = ii/double(opts->ticks-1)*opts->width; int h = opts->size; int hh = opts->size + TICKLEN; Vector vv[2]; vv[0] = Vector(ww,h)*mm; vv[1] = Vector(ww,hh)*mm; win32DrawLines(vv,2); if (!incrcnt) { int txtwidth = Tk_TextWidth(font, ticktxt[ii], strlen(ticktxt[ii])); int www = ww - txtwidth/2.; int hhh = hh + TICKGAP + metrics.ascent; win32DrawText(Vector(www,hhh)*mm, 0, ticktxt[ii]); } } else { // vertical int w = opts->size; int ww = opts->size + TICKLEN; int hh = opts->height - (int)(ii/double(opts->ticks-1)*opts->height); Vector vv[2]; vv[0] = Vector(w,hh)*mm; vv[1] = Vector(ww,hh)*mm; win32DrawLines(vv,2); if (!incrcnt) { int www = ww + TICKGAP; int hhh = hh + (metrics.ascent-metrics.descent)/2.; win32DrawText(Vector(www,hhh)*mm, 0, ticktxt[ii]); } } if (incrcntwidth, options->height); float delta = 4*opts->fontSize; if (!opts->orientation) { oo += Vector(-delta,-.2); uu += Vector(2*delta,-.2); } else { oo += Vector(-.2,-delta); uu += Vector(0,2*delta); } win32Clip(oo,uu); if (grid) grid->win32(originX, originY); } #endif saods9/tksao1.0/colorbar/colorbarbase.h000644 000765 000000 00000011030 12544546067 020346 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colorbarbase_h__ #define __colorbarbase_h__ #include "widget.h" #include #include // Widget ConfigSpecs Defines #define CONFIGORIENTATION 7 #define CONFIGSIZE 8 #define CONFIGFONT 9 #define CONFIGFONTSTYLE 10 #define CONFIGFONTSIZE 11 #define CONFIGNUMERICS 12 #define CONFIGSPACE 13 #define CONFIGTICKS 14 // ColorbarBase class CBGrid; class Filter; class ColorTag; struct ColorbarBaseOptions { Tk_Item item; // required by tk int x, y; // Coordinates of positioning point on canvas int width; // widget width int height; // widget height Tk_Anchor anchor; // Where to anchor widget relative to x,y char* cmdName; // Suggested Tcl command name char* helvetica; // name of X11 font char* courier; // name of X11 font char* times; // name of X11 font Widget* widget; // pointer to widget class int orientation; // 0-horizontal, 1-vertical int size; char* font; int fontSize; char* fontWeight; char* fontSlant; int numerics; int space; // 0-distance (linear), 1-value (AST) int ticks; int colors; int minColors; int maxColors; int privateCmap; int privateColors; }; class ColorbarBase : public Widget { friend class CBGrid; friend class ColorTag; protected: XImage* xmap; unsigned char* colorCells; int colorCount; CBGrid* grid; GC gc; int cnt; double* lut; int invert; char** ticktxt; int tickcnt; int skipcnt; private: Tk_Font getFont(); void lutToText(Tk_Font); void renderGrid(); void renderGridNumerics(); void renderGridAST(); void ps(); void psHV(Filter&, int, int); void psGrid(); void psGridNumerics(); void psGridAST(); #ifdef MAC_OSX_TK void macosxGrid(); void macosxGridNumerics(); void macosxGridAST(); #endif #ifdef __WIN32 void win32Grid(); void win32GridNumerics(); void win32GridAST(); #endif protected: virtual int initColormap() =0; void invalidPixmap(); int postscriptProc(int); // generate postscript virtual void psHorz(Filter&, int, int) =0; virtual void psVert(Filter&, int, int) =0; virtual void reset() =0; virtual void updateColors() =0; int updatePixmap(const BBox&); virtual void ximageToPixmap() =0; #ifdef MAC_OSX_TK virtual void macosx(float, int, int, const Vector&, const Vector&) =0; #endif #ifdef __WIN32 virtual void win32(float, int, int, const Vector&, const Vector&) =0; #endif public: ColorbarBase(Tcl_Interp*, Tk_Canvas, Tk_Item*); virtual ~ColorbarBase(); virtual void adjustCmd(float, float) =0; int configure(int, const char* [], int); virtual void getBiasCmd() =0; virtual void getColorbarCmd() =0; virtual void getColormapCmd() =0; virtual void getColormapNameCmd(int) =0; virtual void getColormapFileNameCmd(int) =0; virtual void getContrastCmd() =0; virtual void getCurrentFileNameCmd() =0; virtual void getCurrentIDCmd() =0; virtual void getCurrentNameCmd() =0; void getInvertCmd(); void getNumericsCmd(); virtual void getRGBChannelCmd() =0; void getValueCmd(int,int); void invertCmd(int); virtual void listIDCmd() {} virtual void listNameCmd() {} virtual void loadCmd(const char*, const char*) {} virtual void loadCmd(const char*, const char*, const char*) {} virtual void mapCmd(char*) {} virtual void mapCmd(int) {} int parse(istringstream&); virtual void saveCmd(const char*) {} virtual void saveCmd(int, const char*) {} virtual void setColorbarCmd(int, float, float, int) {} virtual void setColorbarCmd(float, float, float, float, float, float, int) {} void setColormapLevelCmd(); void setColormapLevelCmd(int, double*); virtual void setColormapWindowCmd(char*) {} virtual void setRGBChannelCmd(const char*) {} virtual void getTagCmd() {} virtual void getTagCmd(int,int) {} virtual void tagCmd(const char*) {} virtual void tagCmd(int, const Vector&, const char*) {} virtual void tagDeleteCmd() {} virtual void tagDeleteCmd(int,int) {} virtual void tagEditBeginCmd(int,int,const char*) {} virtual void tagEditMotionCmd(int,int) {} virtual void tagEditEndCmd(int,int) {} virtual void tagLoadCmd(const char*) {} virtual void tagSaveCmd(const char*) {} #ifdef MAC_OSX_TK void macosxPrintCmd(); #endif #ifdef __WIN32 void win32PrintCmd(); #endif }; #endif saods9/tksao1.0/colorbar/colorbarrgb.C000644 000765 000000 00000025364 12544546067 020160 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colorbarrgb.h" #include "util.h" #include "ps.h" ColorbarRGB::ColorbarRGB(Tcl_Interp* i,Tk_Canvas c,Tk_Item* item) : ColorbarBase(i,c,item) { channel = 0; for (int i=0; i<3; i++) { bias[i] = .5; contrast[i] = 1.0; } } // Public Member Functions void ColorbarRGB::adjustCmd(float c, float b) { contrast[channel] = c; bias[channel] = b; updateColors(); } void ColorbarRGB::getBiasCmd() { ostringstream str; str << bias[channel] << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void ColorbarRGB::getColorbarCmd() { ostringstream str; str << "rgb "; for (int i=0; i<3; i++) str << bias[i] << ' '; for (int i=0; i<3; i++) str << contrast[i] << ' '; str << invert << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void ColorbarRGB::getColormapCmd() { // use fixed so that the frame parser will not be confused with an int // as the first number ostringstream str; str << "rgb " << setiosflags(ios::fixed); for (int i=0; i<3; i++) str << bias[i] << ' '; for (int i=0; i<3; i++) str << contrast[i] << ' '; str << invert << ' '; str << (unsigned short*)colorCells << ' ' << colorCount << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void ColorbarRGB::getColormapNameCmd(int id) { Tcl_AppendResult(interp, "rgb", NULL); } void ColorbarRGB::getColormapFileNameCmd(int id) { Tcl_AppendResult(interp, "rgb.rgb", NULL); } void ColorbarRGB::getContrastCmd() { ostringstream str; str << contrast[channel] << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); } void ColorbarRGB::getCurrentNameCmd() { Tcl_AppendResult(interp, "rgb", NULL); } void ColorbarRGB::getCurrentIDCmd() { Tcl_AppendResult(interp, "rgb", NULL); } void ColorbarRGB::getCurrentFileNameCmd() { Tcl_AppendResult(interp, "rgb", NULL); } void ColorbarRGB::getRGBChannelCmd() { switch (channel) { case 0: Tcl_AppendResult(interp, "red", NULL); return; case 1: Tcl_AppendResult(interp, "green", NULL); return; case 2: Tcl_AppendResult(interp, "blue", NULL); return; } } void ColorbarRGB::setColorbarCmd(float rb, float gb, float bb, float rc, float gc, float bc, int i) { bias[0] = rb; bias[1] = gb; bias[2] = bb; contrast[0] = rc; contrast[1] = gc; contrast[2] = bc; invert = i; updateColors(); } void ColorbarRGB::setRGBChannelCmd(const char* c) { if (!strncmp(c,"red",3)) channel = 0; else if (!strncmp(c,"gre",3)) channel = 1; else if (!strncmp(c,"blu",3)) channel = 2; else channel = 0; } // Private Member Functions void ColorbarRGB::reset() { for (int i=0; i<3; i++) { bias[i] = .5; contrast[i] = 1.0; } invert = 0; updateColors(); } int ColorbarRGB::calcContrastBias(int i, float bb, float cc) { if (fabs(bb - 0.5) < 0.0001 && fabs(cc - 1.0) < 0.0001) return i; // map i to range of 0 to 1.0 // shift by bias (if invert, bias = 1-bias) // multiply by contrast // shift to center of region // expand back to number of dynamic colors float b = invert ? 1-bb : bb; int r = (int)(((((float)i / colorCount) - b) * cc + .5 ) * colorCount); // clip to bounds if out of range if (r < 0) return 0; else if (r >= colorCount) return colorCount-1; else return r; } void ColorbarRGB::psHorz(Filter& filter, int width, int height) { // red for (int jj=0; jj<(int)(height/3.); jj++) { ostringstream str; for (int ii=0; iiorientation) { // blue for (int jj=0; jj<(int)(height/3.); jj++) for (int ii=0; iiorientation) { // blue for (int jj=0; jj<(int)(height/3.); jj++) { for (int ii=0; ii #include "colorbarrgbtruecolor.h" #include "util.h" ColorbarRGBTrueColor::ColorbarRGBTrueColor(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarRGB(i,c,item), ColorbarTrue(i,c,item) { colorCount = 0; } int ColorbarRGBTrueColor::initColormap() { colorCount = (((ColorbarBaseOptions*)options)->colors); colorCells = new unsigned char[colorCount*3]; // needed to initialize colorCells reset(); return TCL_OK; } void ColorbarRGBTrueColor::updateColorCells() { // fill rgb table // note: its filled bgr to match XImage // for(int i=0; iconfigure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarRGBTrueColor16 ColorbarRGBTrueColor16::ColorbarRGBTrueColor16(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarRGBTrueColor(i,c,item), TrueColor16(visual) { configSpecs = colorbarRGBTrueColor16Specs; // colorbar configure options } void ColorbarRGBTrueColor16::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; // if we have cross platforms, we need to byte swap unsigned char row[xmap->bytes_per_line]; if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { // red for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); memcpy(row+ii*2, &a, 2); } for (int jj=0; jj<(int)(height/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; ii0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); memcpy(row+ii*2, &a, 2); } for (int jj=(int)(height/3.); jj<(int)(height*2/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; ii0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); memcpy(row+ii*2, &a, 2); } for (int jj=(int)(height*2/3.); jjbytes_per_line), row, xmap->bytes_per_line); } else { // red for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); unsigned char* rr = (unsigned char*)(&a); *(row+ii*2) = *(rr+1); *(row+ii*2+1) = *(rr); } for (int jj=0; jj<(int)(height/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; ii0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); unsigned char* rr = (unsigned char*)(&a); *(row+ii*2) = *(rr+1); *(row+ii*2+1) = *(rr); } for (int jj=(int)(height/3.); jj<(int)(height*2/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; ii0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&a); *(row+ii*2) = *(rr+1); *(row+ii*2+1) = *(rr); } for (int jj=(int)(height*2/3.); jjbytes_per_line), row, xmap->bytes_per_line); } } void ColorbarRGBTrueColor16::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned short r = colorCells[((int)(double(jj)/height*colorCount))*3]; unsigned short a = 0; a |= rs_>0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); for (int ii=0; ii<(int)(width/3.); ii++) memcpy(data+ii*2, &a, 2); } // green { unsigned short g =colorCells[((int)(double(jj)/height*colorCount))*3+1]; unsigned short a = 0; a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) memcpy(data+ii*2, &a, 2); } // blue { unsigned short b =colorCells[((int)(double(jj)/height*colorCount))*3+2]; unsigned short a = 0; a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); for (int ii=(int)(width*2/3.); ii=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned short r = colorCells[((int)(double(jj)/height*colorCount))*3]; unsigned short a = 0; a |= rs_>0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); unsigned char* rr = (unsigned char*)(&a); for (int ii=0; ii<(int)(width/3.); ii++) { *(data+ii*2) = *(rr+1); *(data+ii*2+1) = *(rr); } } // green { unsigned short g =colorCells[((int)(double(jj)/height*colorCount))*3+1]; unsigned short a = 0; a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) { *(data+ii*2) = *(rr+1); *(data+ii*2+1) = *(rr); } } // blue { unsigned short b =colorCells[((int)(double(jj)/height*colorCount))*3+2]; unsigned short a = 0; a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width*2/3.); iiconfigure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarRGBTrueColor24 ColorbarRGBTrueColor24::ColorbarRGBTrueColor24(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarRGBTrueColor(i,c,item), TrueColor24(visual) { configSpecs = colorbarRGBTrueColor24Specs; // colorbar configure options } void ColorbarRGBTrueColor24::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; switch (xmap->bits_per_pixel) { case 32: updateColors32Horz(width, height, data); break; case 24: updateColors24Horz(width, height, data); break; default: internalError("Colorbar: bad bits/pixel"); return; } } void ColorbarRGBTrueColor24::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; switch (xmap->bits_per_pixel) { case 32: updateColors32Vert(width, height, data); break; case 24: updateColors24Vert(width, height, data); break; default: internalError("Colorbar: bad bits/pixel"); return; } } void ColorbarRGBTrueColor24::updateColors24Horz(int width, int height, char* data) { // if we have cross platforms, we need to byte swap unsigned char row[xmap->bytes_per_line]; if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { // red for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); } else { // red for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); } } void ColorbarRGBTrueColor24::updateColors24Vert(int width, int height, char* data) { // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; a |= r << rs_; for (int ii=0; ii<(int)(width/3.); ii++) memcpy(data+ii*3, &a, 3); } // green { unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int a = 0; a |= g << gs_; for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) memcpy(data+ii*3, &a, 3); } // blue { unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int a = 0; a |= b << bs_; for (int ii=(int)(width*2/3.); ii=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; a |= r << rs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=0; ii<(int)(width/3.); ii++) { *(data+ii*3) = *(rr+3); *(data+ii*3+1) = *(rr+2); *(data+ii*3+2) = *(rr+1); } } // green { unsigned int g = colorCells[(int)(double(jj)/width*colorCount)*3+1]; unsigned int a = 0; a |= g << gs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) { *(data+ii*3) = *(rr+3); *(data+ii*3+1) = *(rr+2); *(data+ii*3+2) = *(rr+1); } } // blue { unsigned int b = colorCells[(int)(double(jj)/width*colorCount)*3+2]; unsigned int a = 0; a |= b << bs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width*2/3.); iibytes_per_line]; if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { // red for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; iibytes_per_line), row, xmap->bytes_per_line); } else { // red for (int i=0; ibytes_per_line), row, xmap->bytes_per_line); // green for (int i=0; ibytes_per_line), row, xmap->bytes_per_line); // blue for (int i=0; ibytes_per_line), row, xmap->bytes_per_line); } } void ColorbarRGBTrueColor24::updateColors32Vert(int width, int height, char* data) { // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= r << rs_; for (int ii=0; ii<(int)(width/3.); ii++) memcpy(data+ii*4, &a, 4); } // green { unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= g << gs_; for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) memcpy(data+ii*4, &a, 4); } // blue { unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= b << bs_; for (int ii=(int)(width*2/3.); ii=0; jj--, data+=xmap->bytes_per_line) { // red { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= r << rs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=0; ii<(int)(width/3.); ii++) { *(data+ii*4) = *(rr+3); *(data+ii*4+1) = *(rr+2); *(data+ii*4+2) = *(rr+1); *(data+ii*4+3) = *(rr); } } // green { unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= g << gs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) { *(data+ii*4) = *(rr+3); *(data+ii*4+1) = *(rr+2); *(data+ii*4+2) = *(rr+1); *(data+ii*4+3) = *(rr); } } // blue { unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= b << bs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=(int)(width*2/3.); iiconfigure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarRGBTrueColor8 ColorbarRGBTrueColor8::ColorbarRGBTrueColor8(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarRGBTrueColor(i,c,item), TrueColor8(visual) { configSpecs = colorbarRGBTrueColor8Specs; // colorbar configure options } void ColorbarRGBTrueColor8::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; unsigned char row[xmap->bytes_per_line]; // red for (int ii=0; ii> rs_; } for (int jj=0; jj<(int)(height/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // green for (int ii=0; ii> gs_; } for (int jj=(int)(height/3.); jj<(int)(height*2/3.); jj++) memcpy(data+(jj*xmap->bytes_per_line), row, xmap->bytes_per_line); // blue for (int ii=0; ii> bs_; } for (int jj=(int)(height*2/3.); jjbytes_per_line), row, xmap->bytes_per_line); } void ColorbarRGBTrueColor8::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { // red { char r = colorCells[((int)(double(jj)/height*colorCount))*3]; char a = (r & rm_) >> rs_; for (int ii=0; ii<(int)(width/3.); ii++) data[ii] = a; } // green { char g = colorCells[((int)(double(jj)/height*colorCount))*3+1]; char a = (g & gm_) >> gs_; for (int ii=(int)(width/3.); ii<(int)(width*2/3.); ii++) data[ii] = a; } // blue { char b =colorCells[((int)(double(jj)/height*colorCount))*3+2]; char a = (b & bm_) >> bs_; for (int ii=(int)(width*2/3.); ii #include "colorbartrue.h" #include "util.h" ColorbarTrue::ColorbarTrue(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item) { } void ColorbarTrue::updateColors() { updateColorCells(); // fill in xmap // make sure we have a pixmap if (!pixmap || !xmap) return; if (!((ColorbarBaseOptions*)options)->orientation) { updateColorsHorz(); TkPutImage(NULL,0,display, pixmap, gc, xmap, 0, 0, 1, 1, options->width-2, ((ColorbarBaseOptions*)options)->size-2); } else { updateColorsVert(); TkPutImage(NULL,0,display, pixmap, gc, xmap, 0, 0, 1, 1, ((ColorbarBaseOptions*)options)->size-2, options->height-2); } redraw(); } saods9/tksao1.0/colorbar/colorbartrue.h000644 000765 000000 00000001057 12464214753 020416 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colorbartrue_h__ #define __colorbartrue_h__ #include "colorbar.h" class ColorbarTrue : public virtual ColorbarBase { protected: void updateColors(); virtual void updateColorCells() =0; virtual void updateColorsHorz() =0; virtual void updateColorsVert() =0; void ximageToPixmap() {updateColors();} public: ColorbarTrue(Tcl_Interp*, Tk_Canvas, Tk_Item*); }; #endif saods9/tksao1.0/colorbar/colorbartruecolor.C000644 000765 000000 00000002725 12464214753 021413 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "colorbartruecolor.h" #include "util.h" ColorbarTrueColor::ColorbarTrueColor(Tcl_Interp* i,Tk_Canvas c,Tk_Item* item) : ColorbarBase(i,c,item), Colorbar(i,c,item), ColorbarTrue(i,c,item) { colorCount = 0; } int ColorbarTrueColor::initColormap() { colorCount = (((ColorbarBaseOptions*)options)->colors); colorIndex = new unsigned short[colorCount]; for (int i=0; igetBlueChar(index, colorCount); colorCells[i*3+1] = cmaps.current()->getGreenChar(index, colorCount); colorCells[i*3+2] = cmaps.current()->getRedChar(index, colorCount); } ctags.head(); while (ctags.current()) { for (int ii=ctags.current()->start(); iistop(); ii++) { colorCells[ii*3] = ctags.current()->colorBlue(); colorCells[ii*3+1] = ctags.current()->colorGreen(); colorCells[ii*3+2] = ctags.current()->colorRed(); } ctags.next(); } } saods9/tksao1.0/colorbar/colorbartruecolor.h000644 000765 000000 00000001016 12464214753 021450 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colorbartruecolor_h__ #define __colorbartruecolor_h__ #include "colorbar.h" #include "colorbartrue.h" class ColorbarTrueColor : public virtual ColorbarBase, public Colorbar, public ColorbarTrue { private: int initColormap(); protected: void updateColorCells(); public: ColorbarTrueColor(Tcl_Interp*, Tk_Canvas, Tk_Item*); }; #endif saods9/tksao1.0/colorbar/colorbartruecolor16.C000644 000765 000000 00000017613 12464214753 021564 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colorbartruecolor16.h" #include "util.h" // Tk Canvas Widget Function Declarations int ColorbarTrueColor16CreateProc(Tcl_Interp*, Tk_Canvas, Tk_Item*, int, Tcl_Obj *const []); // Colorbar Specs static Tk_CustomOption tagsOption = { Tk_CanvasTagsParseProc, Tk_CanvasTagsPrintProc, NULL }; static Tk_ConfigSpec colorbarTrueColor16Specs[] = { {TK_CONFIG_STRING, (char*)"-command", NULL, NULL, "colorbar", Tk_Offset(ColorbarBaseOptions, cmdName), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-x", NULL, NULL, "1", Tk_Offset(ColorbarBaseOptions, x), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-y", NULL, NULL, "1", Tk_Offset(ColorbarBaseOptions, y), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-width", NULL, NULL, "512", Tk_Offset(ColorbarBaseOptions, width), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_INT, (char*)"-height", NULL, NULL, "22", Tk_Offset(ColorbarBaseOptions, height), TK_CONFIG_OPTION_SPECIFIED, NULL}, {TK_CONFIG_ANCHOR, (char*)"-anchor", NULL, NULL, "nw", Tk_Offset(ColorbarBaseOptions, anchor), 0, NULL}, {TK_CONFIG_CUSTOM, (char*)"-tags", NULL, NULL, NULL, 0, TK_CONFIG_NULL_OK, &tagsOption}, {TK_CONFIG_STRING, (char*)"-helvetica", NULL, NULL, "helvetica", Tk_Offset(ColorbarBaseOptions, helvetica), 0, NULL}, {TK_CONFIG_STRING, (char*)"-courier", NULL, NULL, "courier", Tk_Offset(ColorbarBaseOptions, courier), 0, NULL}, {TK_CONFIG_STRING, (char*)"-times", NULL, NULL, "times", Tk_Offset(ColorbarBaseOptions, times), 0, NULL}, {TK_CONFIG_BOOLEAN, (char*)"-orientation", NULL, NULL, "0", Tk_Offset(ColorbarBaseOptions, orientation), 0, NULL}, {TK_CONFIG_INT, (char*)"-size", NULL, NULL, "20", Tk_Offset(ColorbarBaseOptions, size), 0, NULL}, {TK_CONFIG_STRING, (char*)"-font", NULL, NULL, "helvetica", Tk_Offset(ColorbarBaseOptions, font), 0, NULL}, {TK_CONFIG_INT, (char*)"-fontsize", NULL, NULL, "10", Tk_Offset(ColorbarBaseOptions, fontSize), 0, NULL}, {TK_CONFIG_STRING, (char*)"-fontweight", "fontweight", NULL, "normal", Tk_Offset(ColorbarBaseOptions, fontWeight), 0, NULL}, {TK_CONFIG_SYNONYM, (char*)"-fontstyle", "fontweight", NULL, NULL, 0, 0}, {TK_CONFIG_STRING, (char*)"-fontslant", NULL, NULL, "roman", Tk_Offset(ColorbarBaseOptions, fontSlant), 0, NULL}, {TK_CONFIG_BOOLEAN, (char*)"-numerics", NULL, NULL, "1", Tk_Offset(ColorbarBaseOptions, numerics), 0, NULL}, {TK_CONFIG_BOOLEAN, (char*)"-space", NULL, NULL, "1", Tk_Offset(ColorbarBaseOptions, space), 0, NULL}, {TK_CONFIG_INT, (char*)"-ticks", NULL, NULL, "11", Tk_Offset(ColorbarBaseOptions, ticks), 0, NULL}, {TK_CONFIG_INT, (char*)"-colors", NULL, NULL, "1024", Tk_Offset(ColorbarBaseOptions, colors), 0, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL}, }; // Tk Static Structure static Tk_ItemType colorbarTrueColor16Type = { (char*)"colorbartruecolor16", // name sizeof(ColorbarBaseOptions), // size ColorbarTrueColor16CreateProc, // configProc colorbarTrueColor16Specs, // configSpecs WidgetConfigProc, // configProc WidgetCoordProc, // coordProc WidgetDeleteProc, // deleteProc WidgetDisplayProc, // displayProc 0, // alwaysRedraw WidgetPointProc, // pointProc WidgetAreaProc, // areaProc WidgetPostscriptProc, // postscriptProc WidgetScaleProc, // scaleProc WidgetTranslateProc, // translateProc (Tk_ItemIndexProc*)NULL, // indexProc (Tk_ItemCursorProc*)NULL, // icursorProc (Tk_ItemSelectionProc*)NULL, // selectionProc (Tk_ItemInsertProc*)NULL, // insertProc (Tk_ItemDCharsProc*)NULL, // dCharsProc (Tk_ItemType*)NULL // nextPtr }; // Non-Member Functions int ColorbarTrueColor16_Init(Tcl_Interp* interp) { Tk_CreateItemType(&colorbarTrueColor16Type); return TCL_OK; } int ColorbarTrueColor16CreateProc(Tcl_Interp* interp, Tk_Canvas canvas, Tk_Item* item, int argc, Tcl_Obj *const argv[]) { ColorbarTrueColor16* colorbar = new ColorbarTrueColor16(interp, canvas, item); // and set default configuration if (colorbar->configure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarTrueColor16 ColorbarTrueColor16::ColorbarTrueColor16(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarTrueColor(i,c,item), TrueColor16(visual) { configSpecs = colorbarTrueColor16Specs; // colorbar configure options loadDefaultCMaps(); } void ColorbarTrueColor16::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); memcpy(data+ii*2, &a, 2); } } else { for (int ii=0; ii0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&a); *(data+ii*2) = *(rr+1); *(data+ii*2+1) = *(rr); } } // --and duplicate for remaining rows for (int jj=1; jjbytes_per_line), data, xmap->bytes_per_line); } void ColorbarTrueColor16::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { unsigned short r = colorCells[((int)(double(jj)/height*colorCount))*3+2]; unsigned short g = colorCells[((int)(double(jj)/height*colorCount))*3+1]; unsigned short b = colorCells[((int)(double(jj)/height*colorCount))*3]; unsigned short a = 0; a |= rs_>0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); for (int ii=0; ii=0; jj--, data+=xmap->bytes_per_line) { unsigned short r = colorCells[((int)(double(jj)/height*colorCount))*3+2]; unsigned short g = colorCells[((int)(double(jj)/height*colorCount))*3+1]; unsigned short b = colorCells[((int)(double(jj)/height*colorCount))*3]; unsigned short a = 0; a |= rs_>0 ? ((r & rm_) << rs_) : ((r & rm_) >> -rs_); a |= gs_>0 ? ((g & gm_) << gs_) : ((g & gm_) >> -gs_); a |= bs_>0 ? ((b & bm_) << bs_) : ((b & bm_) >> -bs_); unsigned char* rr = (unsigned char*)(&a); for (int ii=0; iiconfigure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarTrueColor24 ColorbarTrueColor24::ColorbarTrueColor24(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarTrueColor(i,c,item), TrueColor24(visual) { configSpecs = colorbarTrueColor24Specs; // colorbar configure options loadDefaultCMaps(); } void ColorbarTrueColor24::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; switch (xmap->bits_per_pixel) { case 32: updateColors32Horz(width, height, data); break; case 24: updateColors24Horz(width, height, data); break; default: internalError("Colorbar: bad bits/pixel"); return; } } void ColorbarTrueColor24::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; switch (xmap->bits_per_pixel) { case 32: updateColors32Vert(width, height, data); break; case 24: updateColors24Vert(width, height, data); break; default: internalError("Colorbar: bad bits/pixel"); return; } } void ColorbarTrueColor24::updateColors24Horz(int width, int height, char* data) { // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int ii=0; iibytes_per_line), data, xmap->bytes_per_line); } void ColorbarTrueColor24::updateColors24Vert(int width, int height, char* data) { // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; a |= r << rs_; a |= g << gs_; a |= b << bs_; for (int ii=0; ii=0; jj--, data+=xmap->bytes_per_line) { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; a |= r << rs_; a |= g << gs_; a |= b << bs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=0; iibyte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int ii=0; iibytes_per_line), data, xmap->bytes_per_line); } void ColorbarTrueColor24::updateColors32Vert(int width, int height, char* data) { // if we have cross platforms, we need to byte swap if ((!xmap->byte_order && lsb()) || (xmap->byte_order && !lsb())) { for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= r << rs_; a |= g << gs_; a |= b << bs_; for (int ii=0; ii=0; jj--, data+=xmap->bytes_per_line) { unsigned int r = colorCells[(int)(double(jj)/height*colorCount)*3+2]; unsigned int g = colorCells[(int)(double(jj)/height*colorCount)*3+1]; unsigned int b = colorCells[(int)(double(jj)/height*colorCount)*3]; unsigned int a = 0; #ifdef MAC_OSX_TK a |= 0xff << 24; #endif a |= r << rs_; a |= g << gs_; a |= b << bs_; unsigned char* rr = (unsigned char*)(&a); for (int ii=0; iiconfigure(argc, (const char**)argv, 0) != TCL_OK) { delete colorbar; Tcl_AppendResult(interp, " error occured while creating colorbar.", NULL); return TCL_ERROR; } return TCL_OK; } // ColorbarTrueColor8 ColorbarTrueColor8::ColorbarTrueColor8(Tcl_Interp* i, Tk_Canvas c, Tk_Item* item) : ColorbarBase(i,c,item), ColorbarTrueColor(i,c,item), TrueColor8(visual) { configSpecs = colorbarTrueColor8Specs; // colorbar configure options loadDefaultCMaps(); } void ColorbarTrueColor8::updateColorsHorz() { int width = options->width-2; int height = ((ColorbarBaseOptions*)options)->size-2; char* data = xmap->data; for (int ii=0; ii> bs_) | ((colorCells[((int)(double(ii)/width*colorCount))*3+1] & gm_) >> gs_) | ((colorCells[((int)(double(ii)/width*colorCount))*3+2] & rm_) >> rs_); // --and duplicate for remaining rows for (int jj=1; jjbytes_per_line), data, xmap->bytes_per_line); } void ColorbarTrueColor8::updateColorsVert() { int width = ((ColorbarBaseOptions*)options)->size-2; int height = options->height-2; char* data = xmap->data; for (int jj=height-1; jj>=0; jj--, data+=xmap->bytes_per_line) { char a = ((colorCells[((int)(double(jj)/height*colorCount))*3] & bm_) >> bs_) | ((colorCells[((int)(double(jj)/height*colorCount))*3+1] & gm_) >> gs_) | ((colorCells[((int)(double(jj)/height*colorCount))*3+2] & rm_) >> rs_); for (int ii=0; ii #include #include #include #include #include #include using namespace std; class Colorbar; // ColorMapInfo class ColorMapInfo { protected: Colorbar* parent_; int id; char* name; char* fileName; ColorMapInfo* next_; ColorMapInfo* previous_; public: ColorMapInfo(Colorbar* p); virtual ~ColorMapInfo(); Colorbar* parent() {return parent_;} const char* getName() {return name;} int getID() {return id;} void setName(const char*); const char* getFileName() {return fileName;} void setFileName(const char*); ColorMapInfo* next() {return next_;} ColorMapInfo* previous() {return previous_;} void setNext(ColorMapInfo* n) {next_ = n;} void setPrevious(ColorMapInfo* p) {previous_=p;} virtual ColorMapInfo* dup() =0; virtual int load() =0; virtual int load(const char*) =0; virtual void save(const char*) =0; virtual unsigned char getRedChar(int, int) =0; virtual unsigned char getGreenChar(int, int) =0; virtual unsigned char getBlueChar(int, int) =0; virtual unsigned short getRedShrt(int, int) =0; virtual unsigned short getGreenShrt(int, int) =0; virtual unsigned short getBlueShrt(int, int) =0; }; #endif saods9/tksao1.0/colorbar/colortag.C000644 000765 000000 00000002523 12464214753 017457 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "colortag.h" #include "colorbar.h" #include "util.h" static int colorTagSeqID = 1; ColorTag::ColorTag(Colorbar* p, int b, int e, const char* clr) : parent_(p), start_(b), stop_(e) { id_ = colorTagSeqID++; colorname_ = dupstr(clr); color_ = parent_->getXColor(colorname_); next_ =NULL; previous_ =NULL; } ColorTag::~ColorTag() { if (colorname_) delete [] colorname_; } void ColorTag::move(int xx, int yy) { int aa = start_+xx; int bb = stop_+yy; if (aa>=bb-20) bb = aa+20; if (bb>parent_->colorCount) { bb = parent_->colorCount; aa = parent_->colorCount - (stop_-start_); } if (aa<0) { aa = 0; bb = stop_-start_; } start_ =aa; stop_ =bb; } void ColorTag::set(int start, int stop, const char* color) { start_ = start; stop_ = stop; if (colorname_) delete [] colorname_; colorname_ = dupstr(color); color_ = parent_->getXColor(colorname_); } void ColorTag::width(int size) { int aa = start_-size/2; int bb = stop_+size/2; if (bb>parent_->colorCount) { bb = parent_->colorCount; aa = parent_->colorCount - size; } if (aa<0) { aa = 0; bb = size; } start_ =aa; stop_ =bb; } saods9/tksao1.0/colorbar/colortag.h000644 000765 000000 00000002442 12464214753 017524 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __colortag_h__ #define __colortag_h__ #include #include #include #include #include #include #include using namespace std; #include #include class Colorbar; class ColorTag { protected: int id_; Colorbar* parent_; const char* colorname_; XColor* color_; int start_; int stop_; ColorTag* next_; ColorTag* previous_; public: ColorTag(Colorbar*, int, int, const char*); virtual ~ColorTag(); int id() {return id_;} Colorbar* parent() {return parent_;} int start() {return start_;} int stop() {return stop_;} const char* colorname() {return colorname_;} void move(int,int); void set(int,int,const char*); void width(int); unsigned short colorRed() {return color_ ? color_->red : 0;} unsigned short colorGreen() {return color_ ? color_->green : 0;} unsigned short colorBlue() {return color_ ? color_->blue : 0;} ColorTag* next() {return next_;} ColorTag* previous() {return previous_;} void setNext(ColorTag* n) {next_ = n;} void setPrevious(ColorTag* p) {previous_=p;} }; #endif saods9/tksao1.0/colorbar/default.C000644 000765 000000 00000053574 12464214753 017305 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include "default.h" #include "util.h" GreyColorMap::GreyColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("grey"); fileName = dupstr("grey.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(1,1)); } RedColorMap::RedColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("red"); fileName = dupstr("red.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(0,0)); blue.append(new LIColor(0,0)); blue.append(new LIColor(0,0)); } GreenColorMap::GreenColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("green"); fileName = dupstr("green.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(0,0)); green.append(new LIColor(0,0)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(0,0)); } BlueColorMap::BlueColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("blue"); fileName = dupstr("blue.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(0,0)); green.append(new LIColor(0,0)); green.append(new LIColor(0,0)); blue.append(new LIColor(0,0)); blue.append(new LIColor(1,1)); } AColorMap::AColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("a"); fileName = dupstr("a.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.25,0)); red.append(new LIColor(.5,1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.25,1)); green.append(new LIColor(.5,0)); green.append(new LIColor(.77,0)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.125,0)); blue.append(new LIColor(.5,1)); blue.append(new LIColor(.64,.5)); blue.append(new LIColor(.77,0)); blue.append(new LIColor(1,0)); } BColorMap::BColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("b"); fileName = dupstr("b.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.25,0)); red.append(new LIColor(.5,1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.5,0)); green.append(new LIColor(.75,1)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.25,1)); blue.append(new LIColor(.5,0)); blue.append(new LIColor(.75,0)); blue.append(new LIColor(1,1)); } BBColorMap::BBColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("bb"); fileName = dupstr("bb.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.5,1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.25,0)); green.append(new LIColor(.75,1)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.5,0)); blue.append(new LIColor(1,1)); } HEColorMap::HEColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("he"); fileName = dupstr("he.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.015,.5)); red.append(new LIColor(.25,.5)); red.append(new LIColor(.5,.75)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.065,0)); green.append(new LIColor(.125,.5)); green.append(new LIColor(.25,.75)); green.append(new LIColor(.5,.81)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.015,.125)); blue.append(new LIColor(.03,.375)); blue.append(new LIColor(.065,.625)); blue.append(new LIColor(.25,.25)); blue.append(new LIColor(1,1)); } I8ColorMap::I8ColorMap(Colorbar* p) : LUTColorMap(p) { name = dupstr("i8"); fileName = dupstr("i8.lut"); colors.append(new RGBColor(0,0,0)); colors.append(new RGBColor(0,1,0)); colors.append(new RGBColor(0,0,1)); colors.append(new RGBColor(0,1,1)); colors.append(new RGBColor(1,0,0)); colors.append(new RGBColor(1,1,0)); colors.append(new RGBColor(1,0,1)); colors.append(new RGBColor(1,1,1)); } AIPSColorMap::AIPSColorMap(Colorbar* p) : LUTColorMap(p) { name = dupstr("aips0"); fileName = dupstr("aips0.lut"); colors.append(new RGBColor(.196,.196,.196)); colors.append(new RGBColor(.475,.000,.608)); colors.append(new RGBColor(.000,.000,.785)); colors.append(new RGBColor(.373,.655,.925)); colors.append(new RGBColor(.000,.596,.000)); colors.append(new RGBColor(.000,.965,.000)); colors.append(new RGBColor(1.00,1.00,.000)); colors.append(new RGBColor(1.00,.694,.000)); colors.append(new RGBColor(1.00,.000,.000)); } HeatColorMap::HeatColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("heat"); fileName = dupstr("heat.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.34,1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.65,0)); blue.append(new LIColor(.98,1)); blue.append(new LIColor(1,1)); } CoolColorMap::CoolColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("cool"); fileName = dupstr("cool.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.29,0)); red.append(new LIColor(.76,.1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.22,0)); green.append(new LIColor(.96,1)); green.append(new LIColor(1,1)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.53,1)); blue.append(new LIColor(1,1)); } RainbowColorMap::RainbowColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("rainbow"); fileName = dupstr("rainbow.sao"); red.append(new LIColor(0,1)); red.append(new LIColor(.2,0)); red.append(new LIColor(.6,0)); red.append(new LIColor(.8,1)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.2,0)); green.append(new LIColor(.4,1)); green.append(new LIColor(.8,1)); green.append(new LIColor(1,0)); blue.append(new LIColor(0,1)); blue.append(new LIColor(.4,1)); blue.append(new LIColor(.6,0)); blue.append(new LIColor(1,0)); } StandardColorMap::StandardColorMap(Colorbar* p) : SAOColorMap(p) { name = dupstr("standard"); fileName = dupstr("standard.sao"); red.append(new LIColor(0,0)); red.append(new LIColor(.333,.3)); red.append(new LIColor(.333,0)); red.append(new LIColor(.666,.3)); red.append(new LIColor(.666,.3)); red.append(new LIColor(1,1)); green.append(new LIColor(0,0)); green.append(new LIColor(.333,.3)); green.append(new LIColor(.333,.3)); green.append(new LIColor(.666,1)); green.append(new LIColor(.666,0)); green.append(new LIColor(1,.3)); blue.append(new LIColor(0,0)); blue.append(new LIColor(.333,1)); blue.append(new LIColor(.333,0)); blue.append(new LIColor(.666,.3)); blue.append(new LIColor(.666,0)); blue.append(new LIColor(1,.3)); } StaircaseColorMap::StaircaseColorMap(Colorbar* p) : LUTColorMap(p) { name = dupstr("staircase"); fileName = dupstr("staircase.lut"); for (int ii=1; ii<=5; ii++) { float kk = ii/5.; colors.append(new RGBColor(kk*.3,kk*.3,kk*1)); } for (int ii=1; ii<=5; ii++) { float kk = ii/5.; colors.append(new RGBColor(kk*.3,kk*1,kk*.3)); } for (int ii=1; ii<=5; ii++) { float kk = ii/5.; colors.append(new RGBColor(kk*1,kk*.3,kk*.3)); } } ColorColorMap::ColorColorMap(Colorbar* p) : LUTColorMap(p) { name = dupstr("color"); fileName = dupstr("color.lut"); colors.append(new RGBColor(0,0,0)); colors.append(new RGBColor(0.18431, 0.18431, 0.18431)); colors.append(new RGBColor(0.37255, 0.37255, 0.37255)); colors.append(new RGBColor(0.56078, 0.56078, 0.56078)); colors.append(new RGBColor(0.74902, 0.74902, 0.74902)); colors.append(new RGBColor(0.93725, 0.93725, 0.93725)); colors.append(new RGBColor(0.00000, 0.18431, 0.93725)); colors.append(new RGBColor(0.00000, 0.37255, 0.74902)); colors.append(new RGBColor(0.00000, 0.49804, 0.49804)); colors.append(new RGBColor(0.00000, 0.74902, 0.30980)); colors.append(new RGBColor(0.00000, 0.93725, 0.00000)); colors.append(new RGBColor(0.30980, 0.62353, 0.00000)); colors.append(new RGBColor(0.49804, 0.49804, 0.00000)); colors.append(new RGBColor(0.62353, 0.30980, 0.00000)); colors.append(new RGBColor(0.93725, 0.00000, 0.00000)); colors.append(new RGBColor(0.74902, 0.00000, 0.30980)); } SLSColorMap::SLSColorMap(Colorbar* p) : LUTColorMap(p) { name = dupstr("sls"); fileName = dupstr("sls.lut"); colors.append(new RGBColor(0.000000, 0.000000, 0.000000)); colors.append(new RGBColor(0.043442, 0.000000, 0.052883)); colors.append(new RGBColor(0.086883, 0.000000, 0.105767)); colors.append(new RGBColor(0.130325, 0.000000, 0.158650)); colors.append(new RGBColor(0.173767, 0.000000, 0.211533)); colors.append(new RGBColor(0.217208, 0.000000, 0.264417)); colors.append(new RGBColor(0.260650, 0.000000, 0.317300)); colors.append(new RGBColor(0.304092, 0.000000, 0.370183)); colors.append(new RGBColor(0.347533, 0.000000, 0.423067)); colors.append(new RGBColor(0.390975, 0.000000, 0.475950)); colors.append(new RGBColor(0.434417, 0.000000, 0.528833)); colors.append(new RGBColor(0.477858, 0.000000, 0.581717)); colors.append(new RGBColor(0.521300, 0.000000, 0.634600)); colors.append(new RGBColor(0.506742, 0.000000, 0.640217)); colors.append(new RGBColor(0.492183, 0.000000, 0.645833)); colors.append(new RGBColor(0.477625, 0.000000, 0.651450)); colors.append(new RGBColor(0.463067, 0.000000, 0.657067)); colors.append(new RGBColor(0.448508, 0.000000, 0.662683)); colors.append(new RGBColor(0.433950, 0.000000, 0.668300)); colors.append(new RGBColor(0.419392, 0.000000, 0.673917)); colors.append(new RGBColor(0.404833, 0.000000, 0.679533)); colors.append(new RGBColor(0.390275, 0.000000, 0.685150)); colors.append(new RGBColor(0.375717, 0.000000, 0.690767)); colors.append(new RGBColor(0.361158, 0.000000, 0.696383)); colors.append(new RGBColor(0.346600, 0.000000, 0.702000)); colors.append(new RGBColor(0.317717, 0.000000, 0.712192)); colors.append(new RGBColor(0.288833, 0.000000, 0.722383)); colors.append(new RGBColor(0.259950, 0.000000, 0.732575)); colors.append(new RGBColor(0.231067, 0.000000, 0.742767)); colors.append(new RGBColor(0.202183, 0.000000, 0.752958)); colors.append(new RGBColor(0.173300, 0.000000, 0.763150)); colors.append(new RGBColor(0.144417, 0.000000, 0.773342)); colors.append(new RGBColor(0.115533, 0.000000, 0.783533)); colors.append(new RGBColor(0.086650, 0.000000, 0.793725)); colors.append(new RGBColor(0.057767, 0.000000, 0.803917)); colors.append(new RGBColor(0.028883, 0.000000, 0.814108)); colors.append(new RGBColor(0.000000, 0.000000, 0.824300)); colors.append(new RGBColor(0.000000, 0.019817, 0.838942)); colors.append(new RGBColor(0.000000, 0.039633, 0.853583)); colors.append(new RGBColor(0.000000, 0.059450, 0.868225)); colors.append(new RGBColor(0.000000, 0.079267, 0.882867)); colors.append(new RGBColor(0.000000, 0.099083, 0.897508)); colors.append(new RGBColor(0.000000, 0.118900, 0.912150)); colors.append(new RGBColor(0.000000, 0.138717, 0.926792)); colors.append(new RGBColor(0.000000, 0.158533, 0.941433)); colors.append(new RGBColor(0.000000, 0.178350, 0.956075)); colors.append(new RGBColor(0.000000, 0.198167, 0.970717)); colors.append(new RGBColor(0.000000, 0.217983, 0.985358)); colors.append(new RGBColor(0.000000, 0.237800, 1.000000)); colors.append(new RGBColor(0.000000, 0.268533, 1.000000)); colors.append(new RGBColor(0.000000, 0.299267, 1.000000)); colors.append(new RGBColor(0.000000, 0.330000, 1.000000)); colors.append(new RGBColor(0.000000, 0.360733, 1.000000)); colors.append(new RGBColor(0.000000, 0.391467, 1.000000)); colors.append(new RGBColor(0.000000, 0.422200, 1.000000)); colors.append(new RGBColor(0.000000, 0.452933, 1.000000)); colors.append(new RGBColor(0.000000, 0.483667, 1.000000)); colors.append(new RGBColor(0.000000, 0.514400, 1.000000)); colors.append(new RGBColor(0.000000, 0.545133, 1.000000)); colors.append(new RGBColor(0.000000, 0.575867, 1.000000)); colors.append(new RGBColor(0.000000, 0.606600, 1.000000)); colors.append(new RGBColor(0.000000, 0.631733, 0.975300)); colors.append(new RGBColor(0.000000, 0.656867, 0.950600)); colors.append(new RGBColor(0.000000, 0.682000, 0.925900)); colors.append(new RGBColor(0.000000, 0.707133, 0.901200)); colors.append(new RGBColor(0.000000, 0.732267, 0.876500)); colors.append(new RGBColor(0.000000, 0.757400, 0.851800)); colors.append(new RGBColor(0.000000, 0.782533, 0.827100)); colors.append(new RGBColor(0.000000, 0.807667, 0.802400)); colors.append(new RGBColor(0.000000, 0.832800, 0.777700)); colors.append(new RGBColor(0.000000, 0.857933, 0.753000)); colors.append(new RGBColor(0.000000, 0.883067, 0.728300)); colors.append(new RGBColor(0.000000, 0.908200, 0.703600)); colors.append(new RGBColor(0.000000, 0.901908, 0.676675)); colors.append(new RGBColor(0.000000, 0.895617, 0.649750)); colors.append(new RGBColor(0.000000, 0.889325, 0.622825)); colors.append(new RGBColor(0.000000, 0.883033, 0.595900)); colors.append(new RGBColor(0.000000, 0.876742, 0.568975)); colors.append(new RGBColor(0.000000, 0.870450, 0.542050)); colors.append(new RGBColor(0.000000, 0.864158, 0.515125)); colors.append(new RGBColor(0.000000, 0.857867, 0.488200)); colors.append(new RGBColor(0.000000, 0.851575, 0.461275)); colors.append(new RGBColor(0.000000, 0.845283, 0.434350)); colors.append(new RGBColor(0.000000, 0.838992, 0.407425)); colors.append(new RGBColor(0.000000, 0.832700, 0.380500)); colors.append(new RGBColor(0.000000, 0.832308, 0.354858)); colors.append(new RGBColor(0.000000, 0.831917, 0.329217)); colors.append(new RGBColor(0.000000, 0.831525, 0.303575)); colors.append(new RGBColor(0.000000, 0.831133, 0.277933)); colors.append(new RGBColor(0.000000, 0.830742, 0.252292)); colors.append(new RGBColor(0.000000, 0.830350, 0.226650)); colors.append(new RGBColor(0.000000, 0.829958, 0.201008)); colors.append(new RGBColor(0.000000, 0.829567, 0.175367)); colors.append(new RGBColor(0.000000, 0.829175, 0.149725)); colors.append(new RGBColor(0.000000, 0.828783, 0.124083)); colors.append(new RGBColor(0.000000, 0.828392, 0.098442)); colors.append(new RGBColor(0.000000, 0.828000, 0.072800)); colors.append(new RGBColor(0.033167, 0.834167, 0.066733)); colors.append(new RGBColor(0.066333, 0.840333, 0.060667)); colors.append(new RGBColor(0.099500, 0.846500, 0.054600)); colors.append(new RGBColor(0.132667, 0.852667, 0.048533)); colors.append(new RGBColor(0.165833, 0.858833, 0.042467)); colors.append(new RGBColor(0.199000, 0.865000, 0.036400)); colors.append(new RGBColor(0.232167, 0.871167, 0.030333)); colors.append(new RGBColor(0.265333, 0.877333, 0.024267)); colors.append(new RGBColor(0.298500, 0.883500, 0.018200)); colors.append(new RGBColor(0.331667, 0.889667, 0.012133)); colors.append(new RGBColor(0.364833, 0.895833, 0.006067)); colors.append(new RGBColor(0.398000, 0.902000, 0.000000)); colors.append(new RGBColor(0.430950, 0.902000, 0.000000)); colors.append(new RGBColor(0.463900, 0.902000, 0.000000)); colors.append(new RGBColor(0.496850, 0.902000, 0.000000)); colors.append(new RGBColor(0.529800, 0.902000, 0.000000)); colors.append(new RGBColor(0.562750, 0.902000, 0.000000)); colors.append(new RGBColor(0.595700, 0.902000, 0.000000)); colors.append(new RGBColor(0.628650, 0.902000, 0.000000)); colors.append(new RGBColor(0.661600, 0.902000, 0.000000)); colors.append(new RGBColor(0.694550, 0.902000, 0.000000)); colors.append(new RGBColor(0.727500, 0.902000, 0.000000)); colors.append(new RGBColor(0.760450, 0.902000, 0.000000)); colors.append(new RGBColor(0.793400, 0.902000, 0.000000)); colors.append(new RGBColor(0.810617, 0.897133, 0.003983)); colors.append(new RGBColor(0.827833, 0.892267, 0.007967)); colors.append(new RGBColor(0.845050, 0.887400, 0.011950)); colors.append(new RGBColor(0.862267, 0.882533, 0.015933)); colors.append(new RGBColor(0.879483, 0.877667, 0.019917)); colors.append(new RGBColor(0.896700, 0.872800, 0.023900)); colors.append(new RGBColor(0.913917, 0.867933, 0.027883)); colors.append(new RGBColor(0.931133, 0.863067, 0.031867)); colors.append(new RGBColor(0.948350, 0.858200, 0.035850)); colors.append(new RGBColor(0.965567, 0.853333, 0.039833)); colors.append(new RGBColor(0.982783, 0.848467, 0.043817)); colors.append(new RGBColor(1.000000, 0.843600, 0.047800)); colors.append(new RGBColor(0.995725, 0.824892, 0.051600)); colors.append(new RGBColor(0.991450, 0.806183, 0.055400)); colors.append(new RGBColor(0.987175, 0.787475, 0.059200)); colors.append(new RGBColor(0.982900, 0.768767, 0.063000)); colors.append(new RGBColor(0.978625, 0.750058, 0.066800)); colors.append(new RGBColor(0.974350, 0.731350, 0.070600)); colors.append(new RGBColor(0.970075, 0.712642, 0.074400)); colors.append(new RGBColor(0.965800, 0.693933, 0.078200)); colors.append(new RGBColor(0.961525, 0.675225, 0.082000)); colors.append(new RGBColor(0.957250, 0.656517, 0.085800)); colors.append(new RGBColor(0.952975, 0.637808, 0.089600)); colors.append(new RGBColor(0.948700, 0.619100, 0.093400)); colors.append(new RGBColor(0.952975, 0.600408, 0.085617)); colors.append(new RGBColor(0.957250, 0.581717, 0.077833)); colors.append(new RGBColor(0.961525, 0.563025, 0.070050)); colors.append(new RGBColor(0.965800, 0.544333, 0.062267)); colors.append(new RGBColor(0.970075, 0.525642, 0.054483)); colors.append(new RGBColor(0.974350, 0.506950, 0.046700)); colors.append(new RGBColor(0.978625, 0.488258, 0.038917)); colors.append(new RGBColor(0.982900, 0.469567, 0.031133)); colors.append(new RGBColor(0.987175, 0.450875, 0.023350)); colors.append(new RGBColor(0.991450, 0.432183, 0.015567)); colors.append(new RGBColor(0.995725, 0.413492, 0.007783)); colors.append(new RGBColor(1.000000, 0.394800, 0.000000)); colors.append(new RGBColor(0.998342, 0.361900, 0.000000)); colors.append(new RGBColor(0.996683, 0.329000, 0.000000)); colors.append(new RGBColor(0.995025, 0.296100, 0.000000)); colors.append(new RGBColor(0.993367, 0.263200, 0.000000)); colors.append(new RGBColor(0.991708, 0.230300, 0.000000)); colors.append(new RGBColor(0.990050, 0.197400, 0.000000)); colors.append(new RGBColor(0.988392, 0.164500, 0.000000)); colors.append(new RGBColor(0.986733, 0.131600, 0.000000)); colors.append(new RGBColor(0.985075, 0.098700, 0.000000)); colors.append(new RGBColor(0.983417, 0.065800, 0.000000)); colors.append(new RGBColor(0.981758, 0.032900, 0.000000)); colors.append(new RGBColor(0.980100, 0.000000, 0.000000)); colors.append(new RGBColor(0.955925, 0.000000, 0.000000)); colors.append(new RGBColor(0.931750, 0.000000, 0.000000)); colors.append(new RGBColor(0.907575, 0.000000, 0.000000)); colors.append(new RGBColor(0.883400, 0.000000, 0.000000)); colors.append(new RGBColor(0.859225, 0.000000, 0.000000)); colors.append(new RGBColor(0.835050, 0.000000, 0.000000)); colors.append(new RGBColor(0.810875, 0.000000, 0.000000)); colors.append(new RGBColor(0.786700, 0.000000, 0.000000)); colors.append(new RGBColor(0.762525, 0.000000, 0.000000)); colors.append(new RGBColor(0.738350, 0.000000, 0.000000)); colors.append(new RGBColor(0.714175, 0.000000, 0.000000)); colors.append(new RGBColor(0.690000, 0.000000, 0.000000)); colors.append(new RGBColor(0.715833, 0.083333, 0.083333)); colors.append(new RGBColor(0.741667, 0.166667, 0.166667)); colors.append(new RGBColor(0.767500, 0.250000, 0.250000)); colors.append(new RGBColor(0.793333, 0.333333, 0.333333)); colors.append(new RGBColor(0.819167, 0.416667, 0.416667)); colors.append(new RGBColor(0.845000, 0.500000, 0.500000)); colors.append(new RGBColor(0.870833, 0.583333, 0.583333)); colors.append(new RGBColor(0.896667, 0.666667, 0.666667)); colors.append(new RGBColor(0.922500, 0.750000, 0.750000)); colors.append(new RGBColor(0.948333, 0.833333, 0.833333)); colors.append(new RGBColor(0.974167, 0.916667, 0.916667)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); colors.append(new RGBColor(1.000000, 1.000000, 1.000000)); } HSVColorMap::HSVColorMap(Colorbar* p) : LUTColorMap(p) { /* HSV: hue varies uniformly from 270 to 360 and back to 270. * Value varies from zero to one using a cube root relation * which causes the value to approach 1.0 rapidly away from zero. * Saturation is zero near the endpoints, causing the curve * to range from black to white at the endpoints, but ranges * to 1.0 at the halfway point, causing nearly saturated colors * in the middle of the range. */ name = dupstr("hsv"); fileName = dupstr("hsv.lut"); int size = 200; for (int i=0; i= 360.0) h -= 360.0; h /= 60.0; int ii = (int)h; float f = h - ii; float p = v * (1 - s); float q = v * (1 - s*f); float t = v * (1 - s * (1.0 - f)); switch (ii) { case 0: colors.append(new RGBColor(v,t,p)); break; case 1: colors.append(new RGBColor(q,v,p)); break; case 2: colors.append(new RGBColor(p,v,t)); break; case 3: colors.append(new RGBColor(p,q,v)); break; case 4: colors.append(new RGBColor(t,p,v)); break; case 5: colors.append(new RGBColor(v,p,q)); break; } } } saods9/tksao1.0/colorbar/default.h000644 000765 000000 00000003301 12464214753 017331 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __default_h__ #define __default_h__ #include "sao.h" #include "lut.h" class Colorbar; class GreyColorMap : public SAOColorMap { public: GreyColorMap(Colorbar*); }; class RedColorMap : public SAOColorMap { public: RedColorMap(Colorbar*); }; class GreenColorMap : public SAOColorMap { public: GreenColorMap(Colorbar*); }; class BlueColorMap : public SAOColorMap { public: BlueColorMap(Colorbar*); }; class AColorMap : public SAOColorMap { public: AColorMap(Colorbar*); }; class BColorMap : public SAOColorMap { public: BColorMap(Colorbar*); }; class BBColorMap : public SAOColorMap { public: BBColorMap(Colorbar*); }; class HEColorMap : public SAOColorMap { public: HEColorMap(Colorbar*); }; class I8ColorMap : public LUTColorMap { public: I8ColorMap(Colorbar*); }; class AIPSColorMap : public LUTColorMap { public: AIPSColorMap(Colorbar*); }; class HeatColorMap : public SAOColorMap { public: HeatColorMap(Colorbar*); }; class CoolColorMap : public SAOColorMap { public: CoolColorMap(Colorbar*); }; class RainbowColorMap : public SAOColorMap { public: RainbowColorMap(Colorbar*); }; class StandardColorMap : public SAOColorMap { public: StandardColorMap(Colorbar*); }; class StaircaseColorMap : public LUTColorMap { public: StaircaseColorMap(Colorbar*); }; class ColorColorMap : public LUTColorMap { public: ColorColorMap(Colorbar*); }; class SLSColorMap : public LUTColorMap { public: SLSColorMap(Colorbar*); }; class HSVColorMap : public LUTColorMap { public: HSVColorMap(Colorbar*); }; #endif saods9/tksao1.0/colorbar/lex.C000644 000765 000000 00000161021 12553253013 016423 0ustar00joyewheel000000 000000 #line 2 "colorbar/lex.C" #line 4 "colorbar/lex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer cbFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *cballoc (yy_size_t ); void *cbrealloc (void *,yy_size_t ); void cbfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 64 #define YY_END_OF_BUFFER 65 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[244] = { 0, 0, 0, 65, 63, 62, 64, 63, 63, 63, 63, 63, 54, 54, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 31, 63, 63, 63, 63, 63, 63, 63, 63, 52, 63, 62, 61, 0, 61, 58, 0, 61, 59, 61, 54, 56, 55, 61, 61, 61, 61, 61, 4, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 22, 61, 61, 61, 61, 61, 61, 61, 61, 33, 61, 35, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 0, 61, 60, 58, 59, 61, 61, 55, 57, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 15, 61, 61, 16, 61, 61, 61, 61, 24, 61, 61, 61, 61, 29, 61, 61, 34, 61, 61, 61, 61, 41, 61, 61, 44, 61, 61, 47, 61, 61, 61, 53, 60, 61, 56, 61, 61, 3, 61, 6, 61, 61, 61, 61, 61, 14, 61, 19, 17, 61, 21, 61, 61, 26, 27, 61, 61, 32, 61, 61, 61, 61, 61, 42, 43, 45, 61, 61, 61, 61, 61, 61, 2, 61, 61, 61, 61, 12, 61, 18, 61, 61, 25, 61, 61, 61, 37, 38, 39, 61, 46, 61, 49, 50, 61, 1, 61, 61, 61, 61, 61, 11, 13, 20, 23, 28, 30, 61, 61, 61, 51, 5, 61, 61, 61, 61, 61, 61, 48, 8, 7, 61, 10, 61, 61, 61, 61, 61, 9, 36, 40, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 4, 4, 4, 4, 6, 4, 4, 4, 7, 4, 7, 8, 4, 9, 10, 11, 12, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 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, 4, 4, 4, 4, 4, 4, 4, 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, 4, 63, 4, 64, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[65] = { 0, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; static yyconst flex_int16_t yy_base[251] = { 0, 0, 0, 120, 587, 107, 587, 0, 64, 66, 65, 69, 74, 84, 71, 82, 80, 72, 82, 98, 85, 101, 105, 124, 121, 126, 131, 125, 71, 141, 141, 137, 152, 142, 151, 170, 104, 0, 92, 194, 0, 84, 196, 0, 194, 199, 203, 212, 221, 246, 178, 182, 204, 0, 205, 182, 222, 197, 226, 226, 233, 227, 229, 234, 254, 247, 253, 0, 236, 245, 245, 249, 268, 268, 250, 265, 0, 279, 0, 267, 278, 283, 270, 289, 275, 283, 292, 279, 289, 284, 301, 285, 24, 328, 0, 587, 587, 336, 226, 344, 0, 299, 312, 309, 323, 327, 324, 327, 329, 328, 345, 331, 0, 333, 349, 0, 331, 350, 353, 354, 0, 355, 341, 361, 351, 0, 358, 363, 0, 349, 356, 353, 373, 0, 382, 366, 0, 392, 377, 0, 380, 380, 401, 0, 587, 409, 418, 383, 390, 0, 396, 0, 393, 401, 405, 414, 406, 0, 423, 0, 0, 423, 0, 414, 421, 0, 0, 415, 422, 0, 419, 419, 415, 421, 430, 0, 0, 0, 438, 438, 440, 60, 434, 430, 0, 447, 467, 453, 442, 0, 465, 0, 451, 456, 0, 454, 467, 479, 0, 0, 0, 462, 0, 469, 0, 0, 464, 0, 476, 488, 489, 475, 473, 0, 0, 0, 0, 0, 0, 475, 477, 484, 0, 0, 481, 484, 501, 484, 501, 510, 0, 0, 0, 517, 0, 505, 511, 523, 510, 517, 0, 0, 0, 587, 67, 568, 571, 574, 577, 580, 583 } ; static yyconst flex_int16_t yy_def[251] = { 0, 243, 1, 243, 243, 243, 243, 244, 245, 246, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 247, 243, 244, 248, 245, 244, 249, 246, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 250, 247, 244, 243, 243, 244, 244, 244, 49, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, 243, 243, 243, 243, 243, 243, 243 } ; static yyconst flex_int16_t yy_nxt[652] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 7, 7, 23, 24, 25, 26, 27, 28, 29, 30, 31, 7, 32, 33, 7, 34, 14, 15, 16, 17, 18, 19, 20, 21, 22, 7, 7, 23, 24, 25, 26, 27, 28, 29, 30, 31, 7, 32, 33, 7, 34, 35, 7, 38, 38, 41, 41, 40, 37, 205, 43, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 45, 45, 45, 45, 50, 144, 58, 96, 48, 47, 45, 45, 45, 45, 95, 59, 51, 54, 48, 63, 52, 81, 55, 36, 56, 60, 36, 49, 61, 50, 57, 58, 64, 48, 53, 65, 62, 243, 67, 66, 59, 51, 54, 48, 63, 52, 81, 55, 68, 56, 60, 73, 49, 61, 69, 57, 75, 64, 70, 53, 65, 62, 71, 67, 66, 74, 77, 86, 72, 79, 76, 84, 80, 68, 78, 82, 73, 83, 85, 69, 90, 75, 88, 70, 87, 91, 89, 71, 92, 92, 74, 77, 86, 72, 79, 76, 84, 80, 243, 78, 82, 243, 83, 85, 243, 90, 243, 88, 243, 87, 91, 89, 38, 38, 41, 41, 40, 101, 102, 43, 46, 46, 46, 46, 47, 45, 45, 45, 45, 46, 46, 46, 46, 48, 103, 104, 105, 97, 46, 46, 46, 46, 101, 102, 108, 98, 48, 99, 99, 99, 99, 94, 99, 99, 99, 99, 243, 109, 48, 103, 104, 105, 97, 106, 111, 107, 112, 110, 113, 108, 114, 48, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 109, 115, 116, 117, 118, 119, 106, 111, 107, 112, 110, 113, 120, 114, 121, 122, 123, 126, 124, 100, 100, 100, 100, 100, 100, 127, 115, 116, 117, 118, 119, 125, 128, 129, 130, 131, 132, 120, 133, 121, 122, 123, 126, 124, 134, 135, 136, 137, 138, 140, 127, 143, 141, 243, 139, 243, 125, 128, 129, 130, 131, 132, 142, 133, 92, 92, 243, 147, 148, 134, 135, 136, 137, 138, 140, 149, 143, 141, 145, 139, 146, 146, 146, 146, 150, 151, 152, 142, 99, 99, 99, 99, 147, 148, 153, 154, 155, 156, 157, 158, 149, 159, 243, 160, 161, 162, 163, 164, 165, 150, 151, 152, 166, 167, 168, 169, 170, 171, 172, 153, 154, 155, 156, 157, 158, 173, 159, 94, 160, 161, 162, 163, 164, 165, 175, 174, 176, 166, 167, 168, 169, 170, 171, 172, 177, 178, 179, 180, 181, 183, 173, 184, 182, 146, 146, 146, 146, 185, 186, 175, 174, 176, 146, 146, 146, 146, 187, 188, 189, 177, 178, 179, 180, 190, 183, 191, 184, 182, 192, 193, 194, 195, 185, 186, 196, 197, 198, 199, 200, 201, 202, 187, 188, 189, 203, 204, 206, 207, 190, 208, 191, 212, 243, 192, 193, 194, 195, 213, 243, 196, 197, 198, 199, 200, 201, 202, 209, 214, 215, 203, 204, 206, 207, 216, 208, 217, 212, 210, 218, 219, 220, 221, 213, 211, 222, 223, 224, 225, 226, 227, 228, 209, 214, 215, 229, 230, 231, 232, 216, 233, 217, 234, 210, 218, 219, 220, 221, 235, 211, 222, 223, 224, 225, 226, 227, 228, 236, 237, 238, 229, 230, 231, 232, 239, 233, 240, 234, 241, 242, 243, 243, 243, 235, 243, 243, 243, 243, 243, 243, 243, 243, 236, 237, 238, 243, 243, 243, 243, 239, 243, 240, 243, 241, 242, 39, 243, 39, 42, 243, 42, 93, 243, 93, 38, 243, 38, 41, 243, 41, 92, 243, 92, 3, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243 } ; static yyconst flex_int16_t yy_chk[652] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 9, 9, 8, 244, 181, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 14, 92, 17, 41, 12, 13, 13, 13, 13, 13, 38, 18, 15, 16, 13, 20, 15, 28, 16, 36, 16, 18, 5, 12, 19, 14, 16, 17, 20, 12, 15, 21, 19, 3, 22, 21, 18, 15, 16, 13, 20, 15, 28, 16, 22, 16, 18, 24, 12, 19, 22, 16, 25, 20, 23, 15, 21, 19, 23, 22, 21, 24, 26, 31, 23, 27, 25, 30, 27, 22, 26, 29, 24, 29, 30, 22, 33, 25, 32, 23, 31, 34, 32, 23, 35, 35, 24, 26, 31, 23, 27, 25, 30, 27, 0, 26, 29, 0, 29, 30, 0, 33, 0, 32, 0, 31, 34, 32, 39, 39, 42, 42, 39, 50, 51, 42, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 45, 52, 54, 55, 46, 47, 47, 47, 47, 50, 51, 57, 48, 47, 48, 48, 48, 48, 35, 98, 98, 98, 98, 0, 58, 45, 52, 54, 55, 46, 56, 59, 56, 60, 58, 61, 57, 62, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 58, 63, 64, 65, 66, 68, 56, 59, 56, 60, 58, 61, 69, 62, 70, 71, 72, 74, 73, 49, 49, 49, 49, 49, 49, 75, 63, 64, 65, 66, 68, 73, 77, 79, 80, 81, 82, 69, 83, 70, 71, 72, 74, 73, 84, 85, 86, 87, 88, 89, 75, 91, 90, 0, 88, 0, 73, 77, 79, 80, 81, 82, 90, 83, 93, 93, 0, 101, 102, 84, 85, 86, 87, 88, 89, 103, 91, 90, 97, 88, 97, 97, 97, 97, 104, 105, 106, 90, 99, 99, 99, 99, 101, 102, 107, 108, 109, 110, 111, 113, 103, 114, 0, 116, 117, 118, 119, 121, 122, 104, 105, 106, 123, 124, 126, 127, 129, 130, 131, 107, 108, 109, 110, 111, 113, 132, 114, 93, 116, 117, 118, 119, 121, 122, 134, 132, 135, 123, 124, 126, 127, 129, 130, 131, 137, 138, 140, 141, 142, 147, 132, 148, 142, 145, 145, 145, 145, 150, 152, 134, 132, 135, 146, 146, 146, 146, 153, 154, 155, 137, 138, 140, 141, 156, 147, 158, 148, 142, 161, 163, 164, 167, 150, 152, 168, 170, 171, 172, 173, 174, 178, 153, 154, 155, 179, 180, 182, 183, 156, 185, 158, 187, 0, 161, 163, 164, 167, 188, 0, 168, 170, 171, 172, 173, 174, 178, 186, 190, 192, 179, 180, 182, 183, 193, 185, 195, 187, 186, 196, 197, 201, 203, 188, 186, 206, 208, 209, 210, 211, 212, 219, 186, 190, 192, 220, 221, 224, 225, 193, 226, 195, 227, 186, 196, 197, 201, 203, 228, 186, 206, 208, 209, 210, 211, 212, 219, 229, 233, 235, 220, 221, 224, 225, 236, 226, 237, 227, 238, 239, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 229, 233, 235, 0, 0, 0, 0, 236, 0, 237, 0, 238, 239, 245, 0, 245, 246, 0, 246, 247, 0, 247, 248, 0, 248, 249, 0, 249, 250, 0, 250, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "colorbar/lex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "colorbar/lex.L" #include #include #include #include "parser.H" extern YYSTYPE* cblval; /* rules */ #line 646 "colorbar/lex.C" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 26 "colorbar/lex.L" #line 749 "colorbar/lex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 244 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 243 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 28 "colorbar/lex.L" {return ADJUST_;} YY_BREAK case 2: YY_RULE_SETUP #line 29 "colorbar/lex.L" {return BEGIN_;} YY_BREAK case 3: YY_RULE_SETUP #line 30 "colorbar/lex.L" {return BIAS_;} YY_BREAK case 4: YY_RULE_SETUP #line 31 "colorbar/lex.L" {return BW_;} YY_BREAK case 5: YY_RULE_SETUP #line 32 "colorbar/lex.L" {return CHANNEL_;} YY_BREAK case 6: YY_RULE_SETUP #line 33 "colorbar/lex.L" {return CMYK_;} YY_BREAK case 7: YY_RULE_SETUP #line 34 "colorbar/lex.L" {return COLORMAP_;} YY_BREAK case 8: YY_RULE_SETUP #line 35 "colorbar/lex.L" {return COLORBAR_;} YY_BREAK case 9: YY_RULE_SETUP #line 36 "colorbar/lex.L" {return COLORSPACE_;} YY_BREAK case 10: YY_RULE_SETUP #line 37 "colorbar/lex.L" {return CONTRAST_;} YY_BREAK case 11: YY_RULE_SETUP #line 38 "colorbar/lex.L" {return CURSOR_;} YY_BREAK case 12: YY_RULE_SETUP #line 39 "colorbar/lex.L" {return DEBUG_;} YY_BREAK case 13: YY_RULE_SETUP #line 40 "colorbar/lex.L" {return DELETE_;} YY_BREAK case 14: YY_RULE_SETUP #line 41 "colorbar/lex.L" {return EDIT_;} YY_BREAK case 15: YY_RULE_SETUP #line 42 "colorbar/lex.L" {return END_;} YY_BREAK case 16: YY_RULE_SETUP #line 43 "colorbar/lex.L" {return GET_;} YY_BREAK case 17: YY_RULE_SETUP #line 44 "colorbar/lex.L" {return GRAY_;} YY_BREAK case 18: YY_RULE_SETUP #line 45 "colorbar/lex.L" {return FALSE_;} YY_BREAK case 19: YY_RULE_SETUP #line 46 "colorbar/lex.L" {return FILE_;} YY_BREAK case 20: YY_RULE_SETUP #line 47 "colorbar/lex.L" {return HEIGHT_;} YY_BREAK case 21: YY_RULE_SETUP #line 48 "colorbar/lex.L" {return HIDE_;} YY_BREAK case 22: YY_RULE_SETUP #line 49 "colorbar/lex.L" {return ID_;} YY_BREAK case 23: YY_RULE_SETUP #line 50 "colorbar/lex.L" {return INVERT_;} YY_BREAK case 24: YY_RULE_SETUP #line 51 "colorbar/lex.L" {return ITT_;} YY_BREAK case 25: YY_RULE_SETUP #line 52 "colorbar/lex.L" {return LEVEL_;} YY_BREAK case 26: YY_RULE_SETUP #line 53 "colorbar/lex.L" {return LIST_;} YY_BREAK case 27: YY_RULE_SETUP #line 54 "colorbar/lex.L" {return LOAD_;} YY_BREAK case 28: YY_RULE_SETUP #line 55 "colorbar/lex.L" {return MACOSX_;} YY_BREAK case 29: YY_RULE_SETUP #line 56 "colorbar/lex.L" {return MAP_;} YY_BREAK case 30: YY_RULE_SETUP #line 57 "colorbar/lex.L" {return MOTION_;} YY_BREAK case 31: YY_RULE_SETUP #line 58 "colorbar/lex.L" {return N_;} YY_BREAK case 32: YY_RULE_SETUP #line 59 "colorbar/lex.L" {return NAME_;} YY_BREAK case 33: YY_RULE_SETUP #line 60 "colorbar/lex.L" {return NO_;} YY_BREAK case 34: YY_RULE_SETUP #line 61 "colorbar/lex.L" {return OFF_;} YY_BREAK case 35: YY_RULE_SETUP #line 62 "colorbar/lex.L" {return ON_;} YY_BREAK case 36: YY_RULE_SETUP #line 63 "colorbar/lex.L" {return POSTSCRIPT_;} YY_BREAK case 37: YY_RULE_SETUP #line 64 "colorbar/lex.L" {return PRINT_;} YY_BREAK case 38: YY_RULE_SETUP #line 65 "colorbar/lex.L" {return QUERY_;} YY_BREAK case 39: YY_RULE_SETUP #line 66 "colorbar/lex.L" {return RESET_;} YY_BREAK case 40: YY_RULE_SETUP #line 67 "colorbar/lex.L" {return RESOLUTION_;} YY_BREAK case 41: YY_RULE_SETUP #line 68 "colorbar/lex.L" {return RGB_;} YY_BREAK case 42: YY_RULE_SETUP #line 69 "colorbar/lex.L" {return SAVE_;} YY_BREAK case 43: YY_RULE_SETUP #line 70 "colorbar/lex.L" {return SHOW_;} YY_BREAK case 44: YY_RULE_SETUP #line 71 "colorbar/lex.L" {return TAG_;} YY_BREAK case 45: YY_RULE_SETUP #line 72 "colorbar/lex.L" {return TRUE_;} YY_BREAK case 46: YY_RULE_SETUP #line 73 "colorbar/lex.L" {return VALUE_;} YY_BREAK case 47: YY_RULE_SETUP #line 74 "colorbar/lex.L" {return VAR_;} YY_BREAK case 48: YY_RULE_SETUP #line 75 "colorbar/lex.L" {return VERSION_;} YY_BREAK case 49: YY_RULE_SETUP #line 76 "colorbar/lex.L" {return WIDTH_;} YY_BREAK case 50: YY_RULE_SETUP #line 77 "colorbar/lex.L" {return WIN32_;} YY_BREAK case 51: YY_RULE_SETUP #line 78 "colorbar/lex.L" {return WINDOW_;} YY_BREAK case 52: YY_RULE_SETUP #line 79 "colorbar/lex.L" {return Y_;} YY_BREAK case 53: YY_RULE_SETUP #line 80 "colorbar/lex.L" {return YES_;} YY_BREAK case 54: YY_RULE_SETUP #line 82 "colorbar/lex.L" { // Integer cblval->integer = atoi(yytext); return INT; } YY_BREAK case 55: #line 88 "colorbar/lex.L" case 56: YY_RULE_SETUP #line 88 "colorbar/lex.L" { // Real Number cblval->real = atof(yytext); return REAL; } YY_BREAK case 57: YY_RULE_SETUP #line 93 "colorbar/lex.L" { // Pointer cblval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } YY_BREAK case 58: #line 99 "colorbar/lex.L" case 59: YY_RULE_SETUP #line 99 "colorbar/lex.L" { // Quoted String int ll = (yyleng-2)<(CBBUFSIZE-1) ? (yyleng-2):(CBBUFSIZE-1); strncpy(cblval->str,yytext+1,ll); // skip the " " cblval->str[ll] = '\0'; // Remove the '"' return STRING; } YY_BREAK case 60: YY_RULE_SETUP #line 106 "colorbar/lex.L" { // Quoted String int ll = (yyleng-2)<(CBBUFSIZE-1) ? (yyleng-2):(CBBUFSIZE-1); strncpy(cblval->str,yytext+1,ll); // skip the '{' cblval->str[ll] = '\0'; // Remove the '}' return STRING; } YY_BREAK case 61: YY_RULE_SETUP #line 113 "colorbar/lex.L" { // General String-- at least 2 printable chars int ll = yyleng <(CBBUFSIZE-1) ? yyleng:(CBBUFSIZE-1); strncpy(cblval->str,yytext,ll); cblval->str[ll] = '\0'; return STRING; } YY_BREAK case 62: YY_RULE_SETUP #line 120 "colorbar/lex.L" { // White Spaces } YY_BREAK case 63: YY_RULE_SETUP #line 123 "colorbar/lex.L" { // Else, return the char return yytext[0]; } YY_BREAK case 64: YY_RULE_SETUP #line 127 "colorbar/lex.L" ECHO; YY_BREAK #line 1169 "colorbar/lex.C" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; cbfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); cbfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ cbrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) cbrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 244 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 244 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 243); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) cballoc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) cballoc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) cbfree((void *) b->yy_ch_buf ); cbfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)cballoc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)cbrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) cballoc(new_size ); else (yy_start_stack) = (int *) cbrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *cballoc (yy_size_t size ) { return (void *) malloc( size ); } void *cbrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void cbfree (void * ptr ) { free( (char *) ptr ); /* see cbrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 127 "colorbar/lex.L" saods9/tksao1.0/colorbar/lex.L000644 000765 000000 00000005304 12464230772 016445 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include "parser.H" extern YYSTYPE* cblval; %} D [0-9] E [Ee][+-]?{D}+ /* rules */ %% adjust {return ADJUST_;} begin {return BEGIN_;} bias {return BIAS_;} bw {return BW_;} channel {return CHANNEL_;} cmyk {return CMYK_;} colormap {return COLORMAP_;} colorbar {return COLORBAR_;} colorspace {return COLORSPACE_;} contrast {return CONTRAST_;} cursor {return CURSOR_;} debug {return DEBUG_;} delete {return DELETE_;} edit {return EDIT_;} end {return END_;} get {return GET_;} gray {return GRAY_;} false {return FALSE_;} file {return FILE_;} height {return HEIGHT_;} hide {return HIDE_;} id {return ID_;} invert {return INVERT_;} itt {return ITT_;} level {return LEVEL_;} list {return LIST_;} load {return LOAD_;} macosx {return MACOSX_;} map {return MAP_;} motion {return MOTION_;} n {return N_;} name {return NAME_;} no {return NO_;} off {return OFF_;} on {return ON_;} postscript {return POSTSCRIPT_;} print {return PRINT_;} query {return QUERY_;} reset {return RESET_;} resolution {return RESOLUTION_;} rgb {return RGB_;} save {return SAVE_;} show {return SHOW_;} tag {return TAG_;} true {return TRUE_;} value {return VALUE_;} var {return VAR_;} version {return VERSION_;} width {return WIDTH_;} win32 {return WIN32_;} window {return WINDOW_;} y {return Y_;} yes {return YES_;} [+-]?{D}+ { // Integer cblval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number cblval->real = atof(yytext); return REAL; } 0[xX][0-9a-fA-F]+ { // Pointer cblval->ptr = (void*)strtoul(yytext,NULL,16); return POINTER; } \"[^\"\n]*\" | \'[^\'\n]*\' { // Quoted String int ll = (yyleng-2)<(CBBUFSIZE-1) ? (yyleng-2):(CBBUFSIZE-1); strncpy(cblval->str,yytext+1,ll); // skip the " " cblval->str[ll] = '\0'; // Remove the '"' return STRING; } \{[^\}\n]*\} { // Quoted String int ll = (yyleng-2)<(CBBUFSIZE-1) ? (yyleng-2):(CBBUFSIZE-1); strncpy(cblval->str,yytext+1,ll); // skip the '{' cblval->str[ll] = '\0'; // Remove the '}' return STRING; } [!-~][!-~]+ { // General String-- at least 2 printable chars int ll = yyleng <(CBBUFSIZE-1) ? yyleng:(CBBUFSIZE-1); strncpy(cblval->str,yytext,ll); cblval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } . { // Else, return the char return yytext[0]; } %% saods9/tksao1.0/colorbar/lut.C000644 000765 000000 00000007326 12233543631 016451 0ustar00joyewheel000000 000000 // Copyright (C) 1999-200 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "lut.h" #include "colorbar.h" // LUT Parser Stuf #undef yyFlexLexer #define yyFlexLexer rgbFlexLexer #include void* rgblval; rgbFlexLexer* rgblexx; extern int rgbparse(LUTColorMap*, rgbFlexLexer*); int rgblex(void* vval, rgbFlexLexer* ll) { rgblval = vval; rgblexx = ll; return ll ? ll->yylex() : 0; } void rgberror(LUTColorMap* cm, rgbFlexLexer* ll, const char* m) {} // RGBColor istream& operator>>(istream& str, RGBColor& cc) { str >> cc.red_ >> cc.green_ >> cc.blue_; return str; } ostream& operator<<(ostream& str, RGBColor& cc) { str.setf(ios::fixed, ios::floatfield); str << setw(8) << setprecision(6) << cc.red_ << " " << cc.green_ << " " << cc.blue_ << endl; return str; } // LUTColorMap LUTColorMap::LUTColorMap(Colorbar* p) : ColorMapInfo(p) { } void LUTColorMap::newRGBColor(float r, float g, float b) { colors.append(new RGBColor(r,g,b)); } int LUTColorMap::load() { ifstream str(fileName); if (!str) return 0; rgbFlexLexer* ll = new rgbFlexLexer(&str); rgbparse(this, ll); delete ll; if (colors.isEmpty()) return 0; // bailout else return 1; // we found at least one RGBColor } int LUTColorMap::load(const char* var) { const char* ccmd = Tcl_GetVar(parent_->getInterp(), var, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG); if (!ccmd) return 0; // only make command string as long as needed // or the rest will be processed as garbage int len = strlen(ccmd)+2; char* buf = new char[len]; memcpy(buf, ccmd, len); // add terminator to make parser happy buf[len-2] = '\n'; buf[len-1] = '\0'; string x(buf); istringstream istr(x); rgbFlexLexer* ll = new rgbFlexLexer(&istr); rgbparse(this, ll); delete ll; delete [] buf; if (colors.isEmpty()) return 0; // bailout else return 1; // we found at least one RGBColor } void LUTColorMap::save(const char* fn) { ofstream fstr(fn); if (!fstr) return; fstr << *this; } unsigned char LUTColorMap::getRedChar(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index>=0 && indexred() * UCHAR_MAX); else return 0; } unsigned char LUTColorMap::getGreenChar(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index>=0 && indexgreen() * UCHAR_MAX); else return 0; } unsigned char LUTColorMap::getBlueChar(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index>=0 && indexblue() * UCHAR_MAX); else return 0; } unsigned short LUTColorMap::getRedShrt(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index >=0 && index < size) return (unsigned short)(colors[index]->red() * USHRT_MAX); else return 0; } unsigned short LUTColorMap::getGreenShrt(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index>=0 && indexgreen() * USHRT_MAX); else return 0; } unsigned short LUTColorMap::getBlueShrt(int ii, int count) { int size = colors.count(); int index = (int)((ii*size/count) + .5); if (index>=0 && indexblue() * USHRT_MAX); else return 0; } ostream& operator<<(ostream& str, LUTColorMap& cc) { cc.colors.head(); do str << *cc.colors.current(); while (cc.colors.next()); return str; } saods9/tksao1.0/colorbar/lut.h000644 000765 000000 00000003317 12464214753 016520 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __lut_h__ #define __lut_h__ #include "colormap.h" #include "list.h" // RGBColor class RGBColor { private: float red_; float green_; float blue_; RGBColor* next_; RGBColor* previous_; public: RGBColor() {red_=green_=blue_=0;} RGBColor(float r, float g, float b) {red_=r; green_=g; blue_=b;} RGBColor(const RGBColor& a) { red_=a.red_; green_=a.green_; blue_=a.blue_; next_=a.next_; previous_=a.previous_; } RGBColor& operator=(const RGBColor& a) { red_=a.red_; green_=a.green_; blue_=a.blue_; next_=a.next_; previous_=a.previous_; return *this; } RGBColor* next() {return next_;} RGBColor* previous() {return previous_;} void setNext(RGBColor* n) {next_ = n;} void setPrevious(RGBColor* p) {previous_=p;} float red() {return red_;} float green() {return green_;} float blue() {return blue_;} friend istream& operator>>(istream&, RGBColor&); friend ostream& operator<<(ostream&, RGBColor&); }; // LUTColorMap class LUTColorMap : public ColorMapInfo { protected: List colors; public: LUTColorMap(Colorbar* p); ColorMapInfo* dup() {return new LUTColorMap(*this);} int load(); int load(const char* var); void save(const char*); unsigned char getRedChar(int, int); unsigned char getGreenChar(int, int); unsigned char getBlueChar(int, int); unsigned short getRedShrt(int, int); unsigned short getGreenShrt(int, int); unsigned short getBlueShrt(int, int); void newRGBColor(float,float,float); friend ostream& operator<<(ostream&, LUTColorMap&); }; #endif saods9/tksao1.0/colorbar/lutlex.C000644 000765 000000 00000127404 12553253013 017157 0ustar00joyewheel000000 000000 #line 2 "colorbar/lutlex.C" #line 4 "colorbar/lutlex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer rgbFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *rgballoc (yy_size_t ); void *rgbrealloc (void *,yy_size_t ); void rgbfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 18 #define YY_END_OF_BUFFER 19 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[57] = { 0, 0, 0, 2, 2, 19, 17, 14, 16, 17, 17, 17, 10, 13, 13, 13, 13, 13, 13, 13, 2, 1, 14, 15, 0, 10, 12, 11, 10, 13, 13, 13, 13, 5, 13, 7, 13, 13, 2, 0, 0, 0, 11, 13, 13, 6, 13, 9, 11, 0, 12, 13, 13, 8, 3, 4, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 6, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 10, 10, 10, 10, 15, 10, 16, 17, 10, 10, 18, 19, 20, 21, 10, 10, 10, 22, 10, 1, 1, 1, 1, 1, 1, 23, 24, 10, 25, 26, 27, 28, 10, 10, 10, 10, 29, 10, 30, 31, 10, 10, 32, 33, 34, 35, 10, 10, 10, 36, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[37] = { 0, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; static yyconst flex_int16_t yy_base[60] = { 0, 0, 0, 139, 138, 140, 143, 137, 143, 135, 31, 129, 33, 123, 35, 40, 36, 38, 37, 44, 0, 143, 124, 143, 117, 65, 50, 66, 68, 117, 76, 78, 80, 116, 83, 115, 58, 79, 0, 53, 83, 113, 93, 95, 98, 113, 99, 112, 108, 101, 96, 100, 101, 91, 60, 46, 143, 131, 46, 134 } ; static yyconst flex_int16_t yy_def[60] = { 0, 56, 1, 57, 57, 56, 56, 56, 56, 56, 56, 56, 58, 58, 58, 58, 58, 58, 58, 58, 59, 56, 56, 56, 56, 56, 56, 56, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 56, 56, 56, 58, 58, 58, 58, 58, 58, 56, 56, 56, 58, 58, 58, 58, 58, 0, 56, 56, 56 } ; static yyconst flex_int16_t yy_nxt[180] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 13, 15, 13, 13, 16, 17, 13, 13, 18, 13, 19, 13, 13, 14, 13, 15, 13, 13, 16, 17, 13, 13, 18, 13, 19, 24, 25, 27, 28, 56, 56, 56, 56, 30, 56, 31, 32, 29, 56, 34, 56, 33, 35, 36, 37, 26, 41, 30, 48, 31, 40, 32, 56, 34, 56, 33, 35, 36, 37, 27, 25, 26, 27, 28, 40, 39, 39, 46, 30, 41, 56, 42, 56, 56, 56, 43, 49, 56, 50, 39, 39, 46, 30, 44, 45, 56, 47, 56, 42, 56, 43, 50, 56, 56, 56, 56, 50, 44, 45, 53, 47, 55, 54, 48, 51, 52, 56, 56, 48, 56, 56, 56, 26, 53, 22, 55, 54, 56, 51, 52, 20, 20, 20, 38, 26, 38, 23, 22, 56, 21, 21, 5, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56 } ; static yyconst flex_int16_t yy_chk[180] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 12, 12, 14, 16, 18, 17, 12, 15, 14, 15, 58, 19, 17, 55, 16, 17, 18, 19, 26, 39, 12, 39, 14, 26, 15, 36, 17, 54, 16, 17, 18, 19, 25, 25, 27, 28, 28, 26, 25, 27, 36, 28, 30, 30, 30, 31, 37, 32, 31, 40, 34, 40, 25, 27, 36, 28, 32, 34, 53, 37, 42, 42, 43, 31, 50, 44, 46, 51, 52, 49, 32, 34, 46, 37, 52, 51, 48, 43, 44, 47, 45, 41, 35, 33, 29, 24, 46, 22, 52, 51, 13, 43, 44, 57, 57, 57, 59, 11, 59, 9, 7, 5, 4, 3, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "colorbar/lutlex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "colorbar/lutlex.L" #include #include #include #include #include "util.h" #include "lutparser.H" extern YYSTYPE* rgblval; extern rgbFlexLexer* rgblexx; /* rules */ #line 478 "colorbar/lutlex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 31 "colorbar/lutlex.L" #line 582 "colorbar/lutlex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 57 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 56 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 33 "colorbar/lutlex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(rgblval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 40 "colorbar/lutlex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(LUTBUFSIZE-1) ? yyleng:(LUTBUFSIZE-1); strncpy(rgblval->str,yytext,ll); rgblval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 48 "colorbar/lutlex.L" {return DEBUG_;} YY_BREAK case 4: YY_RULE_SETUP #line 49 "colorbar/lutlex.L" {return FALSE_;} YY_BREAK case 5: YY_RULE_SETUP #line 50 "colorbar/lutlex.L" {return NO_;} YY_BREAK case 6: YY_RULE_SETUP #line 51 "colorbar/lutlex.L" {return OFF_;} YY_BREAK case 7: YY_RULE_SETUP #line 52 "colorbar/lutlex.L" {return ON_;} YY_BREAK case 8: YY_RULE_SETUP #line 53 "colorbar/lutlex.L" {return TRUE_;} YY_BREAK case 9: YY_RULE_SETUP #line 54 "colorbar/lutlex.L" {return YES_;} YY_BREAK case 10: YY_RULE_SETUP #line 56 "colorbar/lutlex.L" { // Integer rgblval->integer = atoi(yytext); return INT; } YY_BREAK case 11: #line 62 "colorbar/lutlex.L" case 12: YY_RULE_SETUP #line 62 "colorbar/lutlex.L" { // Real Number rgblval->real = atof(yytext); return REAL; } YY_BREAK case 13: YY_RULE_SETUP #line 67 "colorbar/lutlex.L" { // General String int ll = yyleng <(LUTBUFSIZE-1) ? yyleng:(LUTBUFSIZE-1); strncpy(rgblval->str,yytext,ll); rgblval->str[ll] = '\0'; return STRING; } YY_BREAK case 14: YY_RULE_SETUP #line 74 "colorbar/lutlex.L" { // White Spaces } YY_BREAK case 15: /* rule 15 can match eol */ YY_RULE_SETUP #line 77 "colorbar/lutlex.L" { // windows line feed return '\n'; } YY_BREAK case 16: /* rule 16 can match eol */ YY_RULE_SETUP #line 81 "colorbar/lutlex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 85 "colorbar/lutlex.L" { // eof return EOF_; } YY_BREAK case 17: YY_RULE_SETUP #line 89 "colorbar/lutlex.L" { // Else, return the char return toupper(yytext[0]); } YY_BREAK case 18: YY_RULE_SETUP #line 93 "colorbar/lutlex.L" ECHO; YY_BREAK #line 787 "colorbar/lutlex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; rgbfree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); rgbfree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ rgbrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) rgbrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 57 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 57 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 56); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) rgballoc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) rgballoc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) rgbfree((void *) b->yy_ch_buf ); rgbfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)rgballoc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)rgbrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) rgballoc(new_size ); else (yy_start_stack) = (int *) rgbrealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *rgballoc (yy_size_t size ) { return (void *) malloc( size ); } void *rgbrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void rgbfree (void * ptr ) { free( (char *) ptr ); /* see rgbrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 93 "colorbar/lutlex.L" void rgbDiscard(int doit) { if (rgblexx) rgblexx->begin(DISCARD, doit); } void rgbFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/colorbar/lutlex.L000644 000765 000000 00000003475 12464230772 017201 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include #include "util.h" #include "lutparser.H" extern YYSTYPE* rgblval; extern rgbFlexLexer* rgblexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(rgblval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(LUTBUFSIZE-1) ? yyleng:(LUTBUFSIZE-1); strncpy(rgblval->str,yytext,ll); rgblval->str[ll] = '\0'; return STRING; } debug {return DEBUG_;} false {return FALSE_;} no {return NO_;} off {return OFF_;} on {return ON_;} true {return TRUE_;} yes {return YES_;} [+-]?{D}+ { // Integer rgblval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number rgblval->real = atof(yytext); return REAL; } [0-9A-Za-z]+ { // General String int ll = yyleng <(LUTBUFSIZE-1) ? yyleng:(LUTBUFSIZE-1); strncpy(rgblval->str,yytext,ll); rgblval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return toupper(yytext[0]); } %% void rgbDiscard(int doit) { if (rgblexx) rgblexx->begin(DISCARD, doit); } void rgbFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/colorbar/lutparser.C000644 000765 000000 00000124755 12553253013 017671 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse rgbparse #define yylex rgblex #define yyerror rgberror #define yylval rgblval #define yychar rgbchar #define yydebug rgbdebug #define yynerrs rgbnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, EOF_ = 261, DEBUG_ = 262, FALSE_ = 263, NO_ = 264, OFF_ = 265, ON_ = 266, TRUE_ = 267, YES_ = 268 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define EOF_ 261 #define DEBUG_ 262 #define FALSE_ 263 #define NO_ 264 #define OFF_ 265 #define ON_ 266 #define TRUE_ 267 #define YES_ 268 /* Copy the first part of user declarations. */ #line 10 "colorbar/lutparser.Y" #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; rgbDiscard(x);} #include #include #include "lut.h" #undef yyFlexLexer #define yyFlexLexer rgbFlexLexer #include extern int rgblex(void*, rgbFlexLexer*); extern void rgberror(LUTColorMap*, rgbFlexLexer*, const char*); extern void rgbDiscard(int); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "colorbar/lutparser.Y" { #define LUTBUFSIZE 4096 char str[LUTBUFSIZE]; int integer; float real; } /* Line 193 of yacc.c. */ #line 156 "colorbar/lutparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 169 "colorbar/lutparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 12 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 20 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 17 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 7 /* YYNRULES -- Number of rules. */ #define YYNRULES 14 /* YYNRULES -- Number of states. */ #define YYNSTATES 22 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 268 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 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, 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, 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, 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, 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, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 10, 13, 17, 18, 22, 24, 26, 28, 30, 32, 34 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 18, 0, -1, 18, 19, 21, -1, 19, 21, -1, 7, 23, -1, 22, 22, 22, -1, -1, 14, 20, 5, -1, 15, -1, 16, -1, 6, -1, 3, -1, 4, -1, 11, -1, 10, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 54, 54, 55, 58, 59, 60, 60, 63, 64, 65, 68, 69, 72, 73 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "REAL", "INT", "STRING", "EOF_", "DEBUG_", "FALSE_", "NO_", "OFF_", "ON_", "TRUE_", "YES_", "'#'", "'\\n'", "';'", "$accept", "commands", "command", "@1", "terminator", "numeric", "debug", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 35, 10, 59 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 17, 18, 18, 19, 19, 20, 19, 21, 21, 21, 22, 22, 23, 23 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 2, 2, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 11, 12, 0, 6, 0, 0, 0, 14, 13, 4, 0, 1, 0, 10, 8, 9, 3, 0, 7, 2, 5 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 5, 6, 11, 17, 7, 10 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -6 static const yytype_int8 yypact[] = { -2, -6, -6, 5, -6, 0, 3, 7, -6, -6, -6, 8, -6, 3, -6, -6, -6, -6, 7, -6, -6, -6 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -6, -6, 15, -6, -5, -1, -6 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 12, 1, 2, 1, 2, 3, 18, 3, 20, 14, 1, 2, 4, 19, 4, 8, 9, 21, 15, 16, 13 }; static const yytype_uint8 yycheck[] = { 0, 3, 4, 3, 4, 7, 7, 7, 13, 6, 3, 4, 14, 5, 14, 10, 11, 18, 15, 16, 5 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 4, 7, 14, 18, 19, 22, 10, 11, 23, 20, 0, 19, 6, 15, 16, 21, 22, 5, 21, 22 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (cm, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, cm, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, LUTColorMap* cm, rgbFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, cm, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; LUTColorMap* cm; rgbFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (cm); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, LUTColorMap* cm, rgbFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, cm, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; LUTColorMap* cm; rgbFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, cm, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, LUTColorMap* cm, rgbFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, cm, ll) YYSTYPE *yyvsp; int yyrule; LUTColorMap* cm; rgbFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , cm, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, cm, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, LUTColorMap* cm, rgbFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, cm, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; LUTColorMap* cm; rgbFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (cm); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (LUTColorMap* cm, rgbFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (LUTColorMap* cm, rgbFlexLexer* ll) #else int yyparse (cm, ll) LUTColorMap* cm; rgbFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 5: #line 59 "colorbar/lutparser.Y" {cm->newRGBColor((yyvsp[(1) - (3)].real),(yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 6: #line 60 "colorbar/lutparser.Y" {DISCARD_(1);} break; case 10: #line 65 "colorbar/lutparser.Y" {YYACCEPT;;} break; case 11: #line 68 "colorbar/lutparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 12: #line 69 "colorbar/lutparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 13: #line 72 "colorbar/lutparser.Y" {yydebug=1;;} break; case 14: #line 73 "colorbar/lutparser.Y" {yydebug=0;;} break; /* Line 1267 of yacc.c. */ #line 1417 "colorbar/lutparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (cm, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (cm, ll, yymsg); } else { yyerror (cm, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, cm, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, cm, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (cm, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, cm, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, cm, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 75 "colorbar/lutparser.Y" saods9/tksao1.0/colorbar/lutparser.H000644 000765 000000 00000005055 12553253013 017665 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, EOF_ = 261, DEBUG_ = 262, FALSE_ = 263, NO_ = 264, OFF_ = 265, ON_ = 266, TRUE_ = 267, YES_ = 268 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define EOF_ 261 #define DEBUG_ 262 #define FALSE_ 263 #define NO_ 264 #define OFF_ 265 #define ON_ 266 #define TRUE_ 267 #define YES_ 268 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "colorbar/lutparser.Y" { #define LUTBUFSIZE 4096 char str[LUTBUFSIZE]; int integer; float real; } /* Line 1529 of yacc.c. */ #line 82 "colorbar/lutparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/colorbar/lutparser.Y000644 000765 000000 00000002277 12464230772 017721 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {LUTColorMap* cm} %lex-param {rgbFlexLexer* ll} %parse-param {rgbFlexLexer* ll} %{ #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; rgbDiscard(x);} #include #include #include "lut.h" #undef yyFlexLexer #define yyFlexLexer rgbFlexLexer #include extern int rgblex(void*, rgbFlexLexer*); extern void rgberror(LUTColorMap*, rgbFlexLexer*, const char*); extern void rgbDiscard(int); %} %union { #define LUTBUFSIZE 4096 char str[LUTBUFSIZE]; int integer; float real; } %type numeric %token REAL %token INT %token STRING %token EOF_ %token DEBUG_ %token FALSE_ %token NO_ %token OFF_ %token ON_ %token TRUE_ %token YES_ %% commands: commands command terminator | command terminator ; command : DEBUG_ debug | numeric numeric numeric {cm->newRGBColor($1,$2,$3);} | '#' {DISCARD_(1)} STRING ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; %% saods9/tksao1.0/colorbar/parser.C000644 000765 000000 00000171453 12553253013 017141 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse cbparse #define yylex cblex #define yyerror cberror #define yylval cblval #define yychar cbchar #define yydebug cbdebug #define yynerrs cbnerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, POINTER = 261, ADJUST_ = 262, BEGIN_ = 263, BIAS_ = 264, BW_ = 265, CHANNEL_ = 266, CMYK_ = 267, COLORMAP_ = 268, COLORBAR_ = 269, COLORSPACE_ = 270, CONTRAST_ = 271, CURSOR_ = 272, DEBUG_ = 273, DELETE_ = 274, EDIT_ = 275, END_ = 276, GET_ = 277, GRAY_ = 278, FALSE_ = 279, FILE_ = 280, HEIGHT_ = 281, HIDE_ = 282, ID_ = 283, INVERT_ = 284, ITT_ = 285, LEVEL_ = 286, LIST_ = 287, LOAD_ = 288, MACOSX_ = 289, MAP_ = 290, MOTION_ = 291, N_ = 292, NAME_ = 293, NO_ = 294, OFF_ = 295, ON_ = 296, POSTSCRIPT_ = 297, PRINT_ = 298, QUERY_ = 299, RESET_ = 300, RESOLUTION_ = 301, RGB_ = 302, SAVE_ = 303, SHOW_ = 304, TAG_ = 305, TRUE_ = 306, VALUE_ = 307, VAR_ = 308, VERSION_ = 309, WIDTH_ = 310, WIN32_ = 311, WINDOW_ = 312, Y_ = 313, YES_ = 314 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define POINTER 261 #define ADJUST_ 262 #define BEGIN_ 263 #define BIAS_ 264 #define BW_ 265 #define CHANNEL_ 266 #define CMYK_ 267 #define COLORMAP_ 268 #define COLORBAR_ 269 #define COLORSPACE_ 270 #define CONTRAST_ 271 #define CURSOR_ 272 #define DEBUG_ 273 #define DELETE_ 274 #define EDIT_ 275 #define END_ 276 #define GET_ 277 #define GRAY_ 278 #define FALSE_ 279 #define FILE_ 280 #define HEIGHT_ 281 #define HIDE_ 282 #define ID_ 283 #define INVERT_ 284 #define ITT_ 285 #define LEVEL_ 286 #define LIST_ 287 #define LOAD_ 288 #define MACOSX_ 289 #define MAP_ 290 #define MOTION_ 291 #define N_ 292 #define NAME_ 293 #define NO_ 294 #define OFF_ 295 #define ON_ 296 #define POSTSCRIPT_ 297 #define PRINT_ 298 #define QUERY_ 299 #define RESET_ 300 #define RESOLUTION_ 301 #define RGB_ 302 #define SAVE_ 303 #define SHOW_ 304 #define TAG_ 305 #define TRUE_ 306 #define VALUE_ 307 #define VAR_ 308 #define VERSION_ 309 #define WIDTH_ 310 #define WIN32_ 311 #define WINDOW_ 312 #define Y_ 313 #define YES_ 314 /* Copy the first part of user declarations. */ #line 10 "colorbar/parser.Y" #define YYDEBUG 1 #include #include "colorbarbase.h" #undef yyFlexLexer #define yyFlexLexer cbFlexLexer #include extern int cblex(void*, cbFlexLexer*); extern void cberror(ColorbarBase*, cbFlexLexer*, const char*); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 25 "colorbar/parser.Y" { #define CBBUFSIZE 1024 float real; int integer; char str[CBBUFSIZE]; void* ptr; } /* Line 193 of yacc.c. */ #line 245 "colorbar/parser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 258 "colorbar/parser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 93 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 139 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 60 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 23 /* YYNRULES -- Number of rules. */ #define YYNRULES 96 /* YYNRULES -- Number of states. */ #define YYNSTATES 154 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 314 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 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, 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, 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, 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, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 6, 10, 13, 16, 19, 21, 24, 27, 30, 33, 36, 39, 42, 45, 47, 51, 54, 57, 59, 61, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 95, 104, 107, 110, 111, 114, 116, 118, 120, 122, 125, 129, 131, 133, 135, 137, 140, 143, 147, 150, 152, 153, 156, 158, 160, 161, 163, 165, 167, 170, 173, 175, 178, 181, 184, 187, 191, 193, 195, 197, 200, 203, 206, 208, 210, 212, 214, 217, 220, 223, 226, 231, 233, 234, 237, 242, 246, 250, 252, 255 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 61, 0, -1, 18, 63, -1, 7, 62, 62, -1, 14, 65, -1, 13, 66, -1, 22, 68, -1, 27, -1, 29, 64, -1, 30, 70, -1, 32, 71, -1, 33, 72, -1, 34, 74, -1, 35, 75, -1, 42, 76, -1, 44, 17, -1, 45, -1, 47, 11, 5, -1, 50, 78, -1, 48, 81, -1, 49, -1, 54, -1, 56, 82, -1, 4, -1, 3, -1, 41, -1, 40, -1, 3, -1, 59, -1, 58, -1, 41, -1, 51, -1, 39, -1, 37, -1, 40, -1, 24, -1, 3, 62, 62, 3, -1, 47, 62, 62, 62, 62, 62, 62, 3, -1, 31, 67, -1, 57, 5, -1, -1, 3, 6, -1, 9, -1, 14, -1, 13, -1, 16, -1, 25, 38, -1, 25, 38, 3, -1, 26, -1, 28, -1, 29, -1, 38, -1, 38, 3, -1, 47, 11, -1, 52, 3, 3, -1, 50, 69, -1, 55, -1, -1, 3, 3, -1, 5, -1, 3, -1, -1, 28, -1, 38, -1, 30, -1, 30, 28, -1, 30, 38, -1, 5, -1, 5, 5, -1, 53, 73, -1, 30, 5, -1, 5, 5, -1, 5, 5, 5, -1, 43, -1, 5, -1, 3, -1, 15, 77, -1, 31, 3, -1, 46, 3, -1, 10, -1, 23, -1, 47, -1, 12, -1, 19, 79, -1, 20, 80, -1, 33, 5, -1, 48, 5, -1, 3, 62, 62, 5, -1, 5, -1, -1, 3, 3, -1, 8, 3, 3, 5, -1, 36, 3, 3, -1, 21, 3, 3, -1, 5, -1, 3, 5, -1, 43, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 98, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 121, 122, 125, 126, 129, 131, 132, 133, 134, 136, 137, 138, 139, 142, 143, 147, 148, 151, 152, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 172, 173, 176, 177, 180, 181, 182, 183, 184, 185, 188, 189, 190, 191, 194, 195, 198, 205, 206, 209, 211, 212, 215, 216, 217, 218, 221, 222, 223, 224, 225, 226, 229, 230, 233, 234, 235, 238, 239, 242 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "INT", "REAL", "STRING", "POINTER", "ADJUST_", "BEGIN_", "BIAS_", "BW_", "CHANNEL_", "CMYK_", "COLORMAP_", "COLORBAR_", "COLORSPACE_", "CONTRAST_", "CURSOR_", "DEBUG_", "DELETE_", "EDIT_", "END_", "GET_", "GRAY_", "FALSE_", "FILE_", "HEIGHT_", "HIDE_", "ID_", "INVERT_", "ITT_", "LEVEL_", "LIST_", "LOAD_", "MACOSX_", "MAP_", "MOTION_", "N_", "NAME_", "NO_", "OFF_", "ON_", "POSTSCRIPT_", "PRINT_", "QUERY_", "RESET_", "RESOLUTION_", "RGB_", "SAVE_", "SHOW_", "TAG_", "TRUE_", "VALUE_", "VAR_", "VERSION_", "WIDTH_", "WIN32_", "WINDOW_", "Y_", "YES_", "$accept", "command", "numeric", "debug", "yesno", "colorbar", "colormap", "colormaplevel", "get", "getTag", "itt", "list", "load", "loadVar", "macosx", "map", "postscript", "pscolorspace", "tag", "tagdelete", "tagedit", "save", "win32", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 69, 69, 70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 74, 75, 75, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 2, 3, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 3, 2, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 8, 2, 2, 0, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 2, 3, 2, 1, 0, 2, 1, 1, 0, 1, 1, 1, 2, 2, 1, 2, 2, 2, 2, 3, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 4, 1, 0, 2, 4, 3, 3, 1, 2, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 0, 0, 7, 0, 0, 61, 0, 0, 0, 0, 0, 16, 0, 0, 20, 0, 21, 0, 0, 24, 23, 0, 40, 0, 5, 0, 0, 4, 26, 25, 2, 42, 44, 43, 45, 0, 48, 49, 50, 51, 0, 57, 0, 56, 6, 27, 35, 33, 32, 34, 30, 31, 29, 28, 8, 60, 59, 9, 62, 64, 63, 10, 67, 0, 0, 11, 73, 12, 75, 74, 13, 0, 0, 0, 14, 15, 0, 0, 94, 19, 0, 88, 89, 0, 0, 0, 18, 96, 22, 1, 3, 0, 38, 39, 0, 0, 46, 52, 53, 0, 55, 0, 65, 66, 68, 70, 0, 69, 79, 82, 80, 81, 76, 77, 78, 17, 95, 0, 0, 83, 0, 0, 0, 84, 85, 86, 41, 0, 0, 47, 58, 54, 71, 0, 90, 0, 0, 0, 36, 0, 72, 87, 0, 93, 92, 0, 91, 0, 0, 37 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 22, 25, 34, 58, 31, 28, 96, 48, 104, 61, 65, 69, 111, 71, 74, 78, 116, 90, 123, 127, 83, 92 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -41 static const yytype_int8 yypact[] = { 33, 15, -15, 5, 13, 84, -41, -2, 9, -21, -3, -40, 20, -5, -11, -41, 17, 67, -41, 10, -41, -19, 31, -41, -41, 15, 41, 56, -41, 15, 15, -41, -41, -41, -41, -41, -41, -41, -41, 26, -41, -41, -41, 68, 25, 73, 76, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -17, -41, -41, 79, 80, 81, -41, -41, -41, -41, -41, -41, 22, 85, 87, -41, -41, 86, 89, -41, -41, 15, -41, 92, 12, 94, 96, -41, -41, -41, -41, -41, 97, -41, -41, 15, 15, 99, -41, -41, 101, -41, 102, -41, -41, -41, -41, 103, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, 15, 108, -41, 111, 112, 113, -41, -41, -41, -41, 114, 15, -41, -41, -41, 115, 116, -41, 120, 122, 124, -41, 15, -41, -41, 123, -41, -41, 15, -41, 15, 126, -41 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -41, -41, -25, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, -41 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 94, 49, 66, 70, 98, 99, 79, 62, 29, 63, 75, 106, 59, 84, 60, 85, 26, 64, 23, 24, 124, 107, 50, 72, 91, 73, 76, 67, 80, 86, 87, 93, 112, 125, 113, 51, 102, 52, 53, 54, 1, 77, 27, 88, 95, 114, 2, 3, 126, 55, 68, 4, 30, 32, 33, 5, 56, 57, 89, 121, 6, 97, 7, 8, 100, 9, 10, 11, 12, 115, 81, 101, 82, 131, 132, 13, 103, 14, 15, 105, 16, 17, 18, 19, 108, 109, 110, 20, 117, 21, 118, 119, 0, 35, 120, 122, 137, 36, 37, 128, 38, 129, 133, 130, 134, 135, 0, 143, 136, 39, 40, 138, 41, 42, 139, 140, 141, 142, 149, 0, 144, 145, 43, 146, 151, 147, 152, 148, 150, 153, 0, 44, 0, 0, 45, 0, 46, 0, 0, 47 }; static const yytype_int16 yycheck[] = { 25, 3, 5, 43, 29, 30, 17, 28, 3, 30, 15, 28, 3, 3, 5, 5, 31, 38, 3, 4, 8, 38, 24, 3, 43, 5, 31, 30, 11, 19, 20, 0, 10, 21, 12, 37, 11, 39, 40, 41, 7, 46, 57, 33, 3, 23, 13, 14, 36, 51, 53, 18, 47, 40, 41, 22, 58, 59, 48, 84, 27, 5, 29, 30, 38, 32, 33, 34, 35, 47, 3, 3, 5, 98, 99, 42, 3, 44, 45, 3, 47, 48, 49, 50, 5, 5, 5, 54, 3, 56, 3, 5, -1, 9, 5, 3, 121, 13, 14, 5, 16, 5, 3, 6, 3, 3, -1, 132, 5, 25, 26, 3, 28, 29, 3, 3, 3, 3, 143, -1, 5, 5, 38, 3, 149, 3, 151, 3, 5, 3, -1, 47, -1, -1, 50, -1, 52, -1, -1, 55 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 7, 13, 14, 18, 22, 27, 29, 30, 32, 33, 34, 35, 42, 44, 45, 47, 48, 49, 50, 54, 56, 61, 3, 4, 62, 31, 57, 66, 3, 47, 65, 40, 41, 63, 9, 13, 14, 16, 25, 26, 28, 29, 38, 47, 50, 52, 55, 68, 3, 24, 37, 39, 40, 41, 51, 58, 59, 64, 3, 5, 70, 28, 30, 38, 71, 5, 30, 53, 72, 43, 74, 3, 5, 75, 15, 31, 46, 76, 17, 11, 3, 5, 81, 3, 5, 19, 20, 33, 48, 78, 43, 82, 0, 62, 3, 67, 5, 62, 62, 38, 3, 11, 3, 69, 3, 28, 38, 5, 5, 5, 73, 10, 12, 23, 47, 77, 3, 3, 5, 5, 62, 3, 79, 8, 21, 36, 80, 5, 5, 6, 62, 62, 3, 3, 3, 5, 62, 3, 3, 3, 3, 3, 62, 5, 5, 3, 3, 3, 62, 5, 62, 62, 3 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (cb, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, cb, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, ColorbarBase* cb, cbFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, cb, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; ColorbarBase* cb; cbFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (cb); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, ColorbarBase* cb, cbFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, cb, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; ColorbarBase* cb; cbFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, cb, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, ColorbarBase* cb, cbFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, cb, ll) YYSTYPE *yyvsp; int yyrule; ColorbarBase* cb; cbFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , cb, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, cb, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, ColorbarBase* cb, cbFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, cb, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; ColorbarBase* cb; cbFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (cb); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (ColorbarBase* cb, cbFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (ColorbarBase* cb, cbFlexLexer* ll) #else int yyparse (cb, ll) ColorbarBase* cb; cbFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 3: #line 99 "colorbar/parser.Y" {cb->adjustCmd((yyvsp[(2) - (3)].real),(yyvsp[(3) - (3)].real));;} break; case 7: #line 103 "colorbar/parser.Y" {cb->hideCmd();;} break; case 8: #line 104 "colorbar/parser.Y" {cb->invertCmd((yyvsp[(2) - (2)].integer) );;} break; case 15: #line 111 "colorbar/parser.Y" {cb->queryCursorCmd();;} break; case 16: #line 112 "colorbar/parser.Y" {cb->resetCmd();;} break; case 17: #line 113 "colorbar/parser.Y" {cb->setRGBChannelCmd((yyvsp[(3) - (3)].str));;} break; case 20: #line 116 "colorbar/parser.Y" {cb->showCmd();;} break; case 21: #line 117 "colorbar/parser.Y" {cb->msg("Colorbar 1.0");;} break; case 23: #line 121 "colorbar/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 24: #line 122 "colorbar/parser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 25: #line 125 "colorbar/parser.Y" {yydebug=1;;} break; case 26: #line 126 "colorbar/parser.Y" {yydebug=0;;} break; case 27: #line 129 "colorbar/parser.Y" {(yyval.integer)=((yyvsp[(1) - (1)].integer) ? 1 : 0);;} break; case 28: #line 131 "colorbar/parser.Y" {(yyval.integer)=1;;} break; case 29: #line 132 "colorbar/parser.Y" {(yyval.integer)=1;;} break; case 30: #line 133 "colorbar/parser.Y" {(yyval.integer)=1;;} break; case 31: #line 134 "colorbar/parser.Y" {(yyval.integer)=1;;} break; case 32: #line 136 "colorbar/parser.Y" {(yyval.integer)=0;;} break; case 33: #line 137 "colorbar/parser.Y" {(yyval.integer)=0;;} break; case 34: #line 138 "colorbar/parser.Y" {(yyval.integer)=0;;} break; case 35: #line 139 "colorbar/parser.Y" {(yyval.integer)=0;;} break; case 36: #line 142 "colorbar/parser.Y" {cb->setColorbarCmd((yyvsp[(1) - (4)].integer), (yyvsp[(2) - (4)].real), (yyvsp[(3) - (4)].real), (yyvsp[(4) - (4)].integer));;} break; case 37: #line 144 "colorbar/parser.Y" {cb->setColorbarCmd((yyvsp[(2) - (8)].real), (yyvsp[(3) - (8)].real), (yyvsp[(4) - (8)].real), (yyvsp[(5) - (8)].real), (yyvsp[(6) - (8)].real), (yyvsp[(7) - (8)].real), (yyvsp[(8) - (8)].integer));;} break; case 39: #line 148 "colorbar/parser.Y" {cb->setColormapWindowCmd((yyvsp[(2) - (2)].str));;} break; case 40: #line 151 "colorbar/parser.Y" {cb->setColormapLevelCmd();;} break; case 41: #line 152 "colorbar/parser.Y" {cb->setColormapLevelCmd((yyvsp[(1) - (2)].integer), (double*)(yyvsp[(2) - (2)].ptr));;} break; case 42: #line 155 "colorbar/parser.Y" {cb->getBiasCmd();;} break; case 43: #line 156 "colorbar/parser.Y" {cb->getColorbarCmd();;} break; case 44: #line 157 "colorbar/parser.Y" {cb->getColormapCmd();;} break; case 45: #line 158 "colorbar/parser.Y" {cb->getContrastCmd();;} break; case 46: #line 159 "colorbar/parser.Y" {cb->getCurrentFileNameCmd();;} break; case 47: #line 160 "colorbar/parser.Y" {cb->getColormapFileNameCmd((yyvsp[(3) - (3)].integer));;} break; case 48: #line 161 "colorbar/parser.Y" {cb->getHeightCmd();;} break; case 49: #line 162 "colorbar/parser.Y" {cb->getCurrentIDCmd();;} break; case 50: #line 163 "colorbar/parser.Y" {cb->getInvertCmd();;} break; case 51: #line 164 "colorbar/parser.Y" {cb->getCurrentNameCmd();;} break; case 52: #line 165 "colorbar/parser.Y" {cb->getColormapNameCmd((yyvsp[(2) - (2)].integer));;} break; case 53: #line 166 "colorbar/parser.Y" {cb->getRGBChannelCmd();;} break; case 54: #line 167 "colorbar/parser.Y" {cb->getValueCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 56: #line 169 "colorbar/parser.Y" {cb->getWidthCmd();;} break; case 57: #line 172 "colorbar/parser.Y" {cb->getTagCmd();;} break; case 58: #line 173 "colorbar/parser.Y" {cb->getTagCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 59: #line 176 "colorbar/parser.Y" {;} break; case 60: #line 177 "colorbar/parser.Y" {;} break; case 61: #line 180 "colorbar/parser.Y" {cb->listNameCmd();;} break; case 62: #line 181 "colorbar/parser.Y" {cb->listIDCmd();;} break; case 63: #line 182 "colorbar/parser.Y" {cb->listNameCmd();;} break; case 64: #line 183 "colorbar/parser.Y" {;} break; case 65: #line 184 "colorbar/parser.Y" {;} break; case 66: #line 185 "colorbar/parser.Y" {;} break; case 67: #line 188 "colorbar/parser.Y" {cb->loadCmd((yyvsp[(1) - (1)].str),NULL);;} break; case 68: #line 189 "colorbar/parser.Y" {cb->loadCmd((yyvsp[(1) - (2)].str),(yyvsp[(2) - (2)].str));;} break; case 70: #line 191 "colorbar/parser.Y" {;} break; case 71: #line 194 "colorbar/parser.Y" {cb->loadCmd((yyvsp[(1) - (2)].str),NULL,(yyvsp[(2) - (2)].str));;} break; case 72: #line 195 "colorbar/parser.Y" {cb->loadCmd((yyvsp[(1) - (3)].str),(yyvsp[(2) - (3)].str),(yyvsp[(3) - (3)].str));;} break; case 73: #line 198 "colorbar/parser.Y" { #ifdef MAC_OSX_TK cb->macosxPrintCmd(); #endif ;} break; case 74: #line 205 "colorbar/parser.Y" {cb->mapCmd((yyvsp[(1) - (1)].str));;} break; case 75: #line 206 "colorbar/parser.Y" {cb->mapCmd((yyvsp[(1) - (1)].integer));;} break; case 76: #line 210 "colorbar/parser.Y" {cb->psColorSpaceCmd((Widget::PSColorSpace)(yyvsp[(2) - (2)].integer));;} break; case 77: #line 211 "colorbar/parser.Y" {cb->psLevelCmd((yyvsp[(2) - (2)].integer));;} break; case 78: #line 212 "colorbar/parser.Y" {cb->psResolutionCmd((yyvsp[(2) - (2)].integer));;} break; case 79: #line 215 "colorbar/parser.Y" {(yyval.integer) = Widget::BW;;} break; case 80: #line 216 "colorbar/parser.Y" {(yyval.integer) = Widget::GRAY;;} break; case 81: #line 217 "colorbar/parser.Y" {(yyval.integer) = Widget::RGB;;} break; case 82: #line 218 "colorbar/parser.Y" {(yyval.integer) = Widget::CMYK;;} break; case 85: #line 223 "colorbar/parser.Y" {cb->tagLoadCmd((yyvsp[(2) - (2)].str));;} break; case 86: #line 224 "colorbar/parser.Y" {cb->tagSaveCmd((yyvsp[(2) - (2)].str));;} break; case 87: #line 225 "colorbar/parser.Y" {cb->tagCmd((yyvsp[(1) - (4)].integer),Vector((yyvsp[(2) - (4)].real),(yyvsp[(3) - (4)].real)),(yyvsp[(4) - (4)].str));;} break; case 88: #line 226 "colorbar/parser.Y" {cb->tagCmd((yyvsp[(1) - (1)].str));;} break; case 89: #line 229 "colorbar/parser.Y" {cb->tagDeleteCmd();;} break; case 90: #line 230 "colorbar/parser.Y" {cb->tagDeleteCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].integer));;} break; case 91: #line 233 "colorbar/parser.Y" {cb->tagEditBeginCmd((yyvsp[(2) - (4)].integer),(yyvsp[(3) - (4)].integer),(yyvsp[(4) - (4)].str));;} break; case 92: #line 234 "colorbar/parser.Y" {cb->tagEditMotionCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 93: #line 235 "colorbar/parser.Y" {cb->tagEditEndCmd((yyvsp[(2) - (3)].integer),(yyvsp[(3) - (3)].integer));;} break; case 94: #line 238 "colorbar/parser.Y" {cb->saveCmd((yyvsp[(1) - (1)].str));;} break; case 95: #line 239 "colorbar/parser.Y" {cb->saveCmd((yyvsp[(1) - (2)].integer),(yyvsp[(2) - (2)].str));;} break; case 96: #line 242 "colorbar/parser.Y" { #ifdef _WIN32 cb->win32PrintCmd(); #endif ;} break; /* Line 1267 of yacc.c. */ #line 2000 "colorbar/parser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (cb, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (cb, ll, yymsg); } else { yyerror (cb, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, cb, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, cb, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (cb, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, cb, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, cb, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 249 "colorbar/parser.Y" saods9/tksao1.0/colorbar/parser.H000644 000765 000000 00000010407 12553253013 017135 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { INT = 258, REAL = 259, STRING = 260, POINTER = 261, ADJUST_ = 262, BEGIN_ = 263, BIAS_ = 264, BW_ = 265, CHANNEL_ = 266, CMYK_ = 267, COLORMAP_ = 268, COLORBAR_ = 269, COLORSPACE_ = 270, CONTRAST_ = 271, CURSOR_ = 272, DEBUG_ = 273, DELETE_ = 274, EDIT_ = 275, END_ = 276, GET_ = 277, GRAY_ = 278, FALSE_ = 279, FILE_ = 280, HEIGHT_ = 281, HIDE_ = 282, ID_ = 283, INVERT_ = 284, ITT_ = 285, LEVEL_ = 286, LIST_ = 287, LOAD_ = 288, MACOSX_ = 289, MAP_ = 290, MOTION_ = 291, N_ = 292, NAME_ = 293, NO_ = 294, OFF_ = 295, ON_ = 296, POSTSCRIPT_ = 297, PRINT_ = 298, QUERY_ = 299, RESET_ = 300, RESOLUTION_ = 301, RGB_ = 302, SAVE_ = 303, SHOW_ = 304, TAG_ = 305, TRUE_ = 306, VALUE_ = 307, VAR_ = 308, VERSION_ = 309, WIDTH_ = 310, WIN32_ = 311, WINDOW_ = 312, Y_ = 313, YES_ = 314 }; #endif /* Tokens. */ #define INT 258 #define REAL 259 #define STRING 260 #define POINTER 261 #define ADJUST_ 262 #define BEGIN_ 263 #define BIAS_ 264 #define BW_ 265 #define CHANNEL_ 266 #define CMYK_ 267 #define COLORMAP_ 268 #define COLORBAR_ 269 #define COLORSPACE_ 270 #define CONTRAST_ 271 #define CURSOR_ 272 #define DEBUG_ 273 #define DELETE_ 274 #define EDIT_ 275 #define END_ 276 #define GET_ 277 #define GRAY_ 278 #define FALSE_ 279 #define FILE_ 280 #define HEIGHT_ 281 #define HIDE_ 282 #define ID_ 283 #define INVERT_ 284 #define ITT_ 285 #define LEVEL_ 286 #define LIST_ 287 #define LOAD_ 288 #define MACOSX_ 289 #define MAP_ 290 #define MOTION_ 291 #define N_ 292 #define NAME_ 293 #define NO_ 294 #define OFF_ 295 #define ON_ 296 #define POSTSCRIPT_ 297 #define PRINT_ 298 #define QUERY_ 299 #define RESET_ 300 #define RESOLUTION_ 301 #define RGB_ 302 #define SAVE_ 303 #define SHOW_ 304 #define TAG_ 305 #define TRUE_ 306 #define VALUE_ 307 #define VAR_ 308 #define VERSION_ 309 #define WIDTH_ 310 #define WIN32_ 311 #define WINDOW_ 312 #define Y_ 313 #define YES_ 314 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 25 "colorbar/parser.Y" { #define CBBUFSIZE 1024 float real; int integer; char str[CBBUFSIZE]; void* ptr; } /* Line 1529 of yacc.c. */ #line 175 "colorbar/parser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/colorbar/parser.Y000644 000765 000000 00000011231 12540621035 017151 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {ColorbarBase* cb} %lex-param {cbFlexLexer* ll} %parse-param {cbFlexLexer* ll} %{ #define YYDEBUG 1 #include #include "colorbarbase.h" #undef yyFlexLexer #define yyFlexLexer cbFlexLexer #include extern int cblex(void*, cbFlexLexer*); extern void cberror(ColorbarBase*, cbFlexLexer*, const char*); %} %union { #define CBBUFSIZE 1024 float real; int integer; char str[CBBUFSIZE]; void* ptr; } %type numeric %type yesno %type pscolorspace %token INT %token REAL %token STRING %token POINTER %token ADJUST_ %token BEGIN_ %token BIAS_ %token BW_ %token CHANNEL_ %token CMYK_ %token COLORMAP_ %token COLORBAR_ %token COLORSPACE_ %token CONTRAST_ %token CURSOR_ %token DEBUG_ %token DELETE_ %token EDIT_ %token END_ %token GET_ %token GRAY_ %token FALSE_ %token FILE_ %token HEIGHT_ %token HIDE_ %token ID_ %token INVERT_ %token ITT_ %token LEVEL_ %token LIST_ %token LOAD_ %token MACOSX_ %token MAP_ %token MOTION_ %token N_ %token NAME_ %token NO_ %token OFF_ %token ON_ %token POSTSCRIPT_ %token PRINT_ %token QUERY_ %token RESET_ %token RESOLUTION_ %token RGB_ %token SAVE_ %token SHOW_ %token TAG_ %token TRUE_ %token VALUE_ %token VAR_ %token VERSION_ %token WIDTH_ %token WIN32_ %token WINDOW_ %token Y_ %token YES_ %% command : DEBUG_ debug | ADJUST_ numeric numeric {cb->adjustCmd($2,$3);} | COLORBAR_ colorbar | COLORMAP_ colormap | GET_ get | HIDE_ {cb->hideCmd();} | INVERT_ yesno {cb->invertCmd($2 );} | ITT_ itt | LIST_ list | LOAD_ load | MACOSX_ macosx | MAP_ map | POSTSCRIPT_ postscript | QUERY_ CURSOR_ {cb->queryCursorCmd();} | RESET_ {cb->resetCmd();} | RGB_ CHANNEL_ STRING {cb->setRGBChannelCmd($3);} | TAG_ tag | SAVE_ save | SHOW_ {cb->showCmd();} | VERSION_ {cb->msg("Colorbar 1.0");} | WIN32_ win32 ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; yesno : INT {$$=($1 ? 1 : 0);} | YES_ {$$=1;} | Y_ {$$=1;} | ON_ {$$=1;} | TRUE_ {$$=1;} | NO_ {$$=0;} | N_ {$$=0;} | OFF_ {$$=0;} | FALSE_ {$$=0;} ; colorbar: INT numeric numeric INT {cb->setColorbarCmd($1, $2, $3, $4);} | RGB_ numeric numeric numeric numeric numeric numeric INT {cb->setColorbarCmd($2, $3, $4, $5, $6, $7, $8);} ; colormap: LEVEL_ colormaplevel | WINDOW_ STRING {cb->setColormapWindowCmd($2);} ; colormaplevel : /* empty */ {cb->setColormapLevelCmd();} | INT POINTER {cb->setColormapLevelCmd($1, (double*)$2);} ; get : BIAS_ {cb->getBiasCmd();} | COLORBAR_ {cb->getColorbarCmd();} | COLORMAP_ {cb->getColormapCmd();} | CONTRAST_ {cb->getContrastCmd();} | FILE_ NAME_ {cb->getCurrentFileNameCmd();} | FILE_ NAME_ INT {cb->getColormapFileNameCmd($3);} | HEIGHT_ {cb->getHeightCmd();} | ID_ {cb->getCurrentIDCmd();} | INVERT_ {cb->getInvertCmd();} | NAME_ {cb->getCurrentNameCmd();} | NAME_ INT {cb->getColormapNameCmd($2);} | RGB_ CHANNEL_ {cb->getRGBChannelCmd();} | VALUE_ INT INT {cb->getValueCmd($2,$3);} | TAG_ getTag | WIDTH_ {cb->getWidthCmd();} ; getTag : /* empty */ {cb->getTagCmd();} | INT INT {cb->getTagCmd($1,$2);} ; itt : STRING {} | INT {} ; list : /* empty */ {cb->listNameCmd();} | ID_ {cb->listIDCmd();} | NAME_ {cb->listNameCmd();} | ITT_ {} | ITT_ ID_ {} | ITT_ NAME_ {} ; load : STRING {cb->loadCmd($1,NULL);} | STRING STRING {cb->loadCmd($1,$2);} | VAR_ loadVar | ITT_ STRING {} ; loadVar : STRING STRING {cb->loadCmd($1,NULL,$2);} | STRING STRING STRING {cb->loadCmd($1,$2,$3);} ; macosx : PRINT_ { #ifdef MAC_OSX_TK cb->macosxPrintCmd(); #endif } ; map : STRING {cb->mapCmd($1);} | INT {cb->mapCmd($1);} ; postscript : COLORSPACE_ pscolorspace {cb->psColorSpaceCmd((Widget::PSColorSpace)$2);} | LEVEL_ INT {cb->psLevelCmd($2);} | RESOLUTION_ INT {cb->psResolutionCmd($2);} ; pscolorspace : BW_ {$$ = Widget::BW;} | GRAY_ {$$ = Widget::GRAY;} | RGB_ {$$ = Widget::RGB;} | CMYK_ {$$ = Widget::CMYK;} ; tag : DELETE_ tagdelete | EDIT_ tagedit | LOAD_ STRING {cb->tagLoadCmd($2);} | SAVE_ STRING {cb->tagSaveCmd($2);} | INT numeric numeric STRING {cb->tagCmd($1,Vector($2,$3),$4);} | STRING {cb->tagCmd($1);} ; tagdelete: /* empty */ {cb->tagDeleteCmd();} | INT INT {cb->tagDeleteCmd($1,$2);} ; tagedit : BEGIN_ INT INT STRING {cb->tagEditBeginCmd($2,$3,$4);} | MOTION_ INT INT {cb->tagEditMotionCmd($2,$3);} | END_ INT INT {cb->tagEditEndCmd($2,$3);} ; save : STRING {cb->saveCmd($1);} | INT STRING {cb->saveCmd($1,$2);} ; win32 : PRINT_ { #ifdef _WIN32 cb->win32PrintCmd(); #endif } ; %% saods9/tksao1.0/colorbar/sao.C000644 000765 000000 00000010772 12464214753 016434 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include "sao.h" #include "colorbar.h" SAOColorMap* cm; // SAO Parser Stuf #undef yyFlexLexer #define yyFlexLexer liFlexLexer #include void* lilval; liFlexLexer* lilexx; extern int liparse(SAOColorMap*, liFlexLexer*); int lilex(void* vval, liFlexLexer* ll) { lilval = vval; lilexx = ll; return ll ? ll->yylex() : 0; } void lierror(SAOColorMap* cm, liFlexLexer* ll, const char* m) {} // LIColor ostream& operator<<(ostream& s, LIColor& c) { s << "(" << c.x << "," << c.y << ")"; return s; } // SAOColorMap SAOColorMap::SAOColorMap(Colorbar* p) : ColorMapInfo(p) { current =&red; } void SAOColorMap::newLIColor(float aa, float bb) { current->append(new LIColor(aa,bb)); } void SAOColorMap::setChannel(ChannelType which) { switch (which) { case RED: current = &red; break; case GREEN: current = &green; break; case BLUE: current = &blue; break; } } int SAOColorMap::load() { ifstream str(fileName); if (!str) return 0; liFlexLexer* ll = new liFlexLexer(&str); liparse(this, ll); delete ll; if (red.isEmpty() || green.isEmpty() || blue.isEmpty()) return 0; // something is missing, bailout else return 1; // we found at least one LIColor for each RGB } int SAOColorMap::load(const char* var) { const char* ccmd = Tcl_GetVar(parent_->getInterp(), var, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG); if (!ccmd) return 0; // only make command string as long as needed // or the rest will be processed as garbage int len = strlen(ccmd)+2; char* buf = new char[len]; memcpy(buf, ccmd, len); // add terminator to make parser happy buf[len-2] = '\n'; buf[len-1] = '\0'; string x(buf); istringstream istr(x); liFlexLexer* ll = new liFlexLexer(&istr); liparse(this, ll); delete ll; delete [] buf; if (red.isEmpty() || green.isEmpty() || blue.isEmpty()) return 0; // something is missing, bailout else return 1; // we found at least one LIColor for each RGB } void SAOColorMap::save(const char* fn) { ofstream f(fn); if (!f) return; f << *this; } unsigned char SAOColorMap::getColorChar(int i, int count, List* cc) { float x = (float)i/count; LIColor* head = cc->head(); LIColor* tail = NULL; while (head && (head->getX() < x)) if (head) { tail = head; head = head->next(); } if (tail && head) { // interpolate between head and tail float m = (head->getY() - tail->getY()) / (head->getX() - tail->getX()); if (m) { float y = m * (x - tail->getX()) + tail->getY(); //point slope form return (unsigned char)(y * UCHAR_MAX); } else return (unsigned char)(head->getY() * UCHAR_MAX); } else if (!tail && head) // return first LIColor return (unsigned char)(head->getY() * UCHAR_MAX); else if (tail && !head) // return last LIColor return (unsigned char)(tail->getY() * UCHAR_MAX); else return 0; // there is something very wrong-- bail out } unsigned short SAOColorMap::getColorShrt(int i, int count, List* cc) { float x = (float)i/count; LIColor* head = cc->head(); LIColor* tail = NULL; while (head && (head->getX() < x)) if (head) { tail = head; head = head->next(); } if (tail && head) { // interpolate between head and tail float m = (head->getY() - tail->getY()) / (head->getX() - tail->getX()); if (m) { float y = m * (x - tail->getX()) + tail->getY(); //point slope form return (unsigned short)(y * USHRT_MAX); } else return (unsigned short)(head->getY() * USHRT_MAX); } else if (!tail && head) // return first LIColor return (unsigned short)(head->getY() * USHRT_MAX); else if (tail && !head) // return last LIColor return (unsigned short)(tail->getY() * USHRT_MAX); else return 0; // there is something very wrong-- bail out } ostream& operator<<(ostream& str, SAOColorMap& c) { str << "# SAOimage color table" << endl; str << "PSEUDOCOLOR" << endl; str << "RED:" << endl; c.red.head(); do str << *c.red.current(); while (c.red.next()); str << endl; str << "GREEN:" << endl; c.green.head(); do str << *c.green.current(); while (c.green.next()); str << endl; str << "BLUE:" << endl; c.blue.head(); do str << *c.blue.current(); while (c.blue.next()); str << endl; return str; } saods9/tksao1.0/colorbar/sao.h000644 000765 000000 00000004032 12464214753 016471 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __sao_h__ #define __sao_h__ #include "colormap.h" #include "list.h" class Colorbar; // LIColor class LIColor { private: float x; float y; LIColor* next_; LIColor* previous_; public: LIColor() {x=0; y=0; next_=NULL; previous_=NULL;} LIColor(float ll, float ii) {x=ll; y=ii, next_=NULL; previous_=NULL;} LIColor(const LIColor& a) {x=a.x; y=a.y; next_=a.next_; previous_=a.previous_;} LIColor& operator=(const LIColor& a) {x=a.x; y=a.y; next_=a.next_; previous_=a.previous_; return *this;} LIColor* next() {return next_;} LIColor* previous() {return previous_;} void setNext(LIColor* n) {next_ = n;} void setPrevious(LIColor* p) {previous_=p;} float getX() {return x;} float getY() {return y;} friend ostream& operator<<(ostream&, LIColor&); }; // SAOColorMap class SAOColorMap : public ColorMapInfo { public: enum ChannelType {RED,GREEN,BLUE}; protected: List red; List green; List blue; List* current; protected: unsigned char getColorChar(int, int, List*); unsigned short getColorShrt(int, int, List*); public: SAOColorMap(Colorbar* p); ColorMapInfo* dup() {return new SAOColorMap(*this);} int load(); int load(const char* var); void save(const char*); unsigned char getRedChar(int i, int c) {return getColorChar(i,c,&red);} unsigned char getGreenChar(int i, int c) {return getColorChar(i,c,&green);} unsigned char getBlueChar(int i, int c) {return getColorChar(i,c,&blue);} unsigned short getRedShrt(int i, int c) {return getColorShrt(i,c,&red);} unsigned short getGreenShrt(int i, int c) {return getColorShrt(i,c,&green);} unsigned short getBlueShrt(int i, int c) {return getColorShrt(i,c,&blue);} void setChannel(ChannelType); void newLIColor(float,float); friend ostream& operator<<(ostream&, SAOColorMap&); }; #endif saods9/tksao1.0/colorbar/saolex.C000644 000765 000000 00000133404 12553253013 017132 0ustar00joyewheel000000 000000 #line 2 "colorbar/saolex.C" #line 4 "colorbar/saolex.C" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 5 #define YY_FLEX_SUBMINOR_VERSION 35 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* The c++ scanner is a mess. The FlexLexer.h header file relies on the * following macro. This is required in order to pass the c++-multiple-scanners * test in the regression suite. We get reports that it breaks inheritance. * We will address this in a future release of flex, or omit the C++ scanner * altogether. */ #define yyFlexLexer liFlexLexer /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; typedef uint64_t flex_uint64_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; #endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ #include #include #include #include /* end standard C++ headers. */ #ifdef __cplusplus /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST #else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST #endif /* defined (__STDC__) */ #endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const #else #define yyconst #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #define YY_BUF_SIZE 16384 #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern yy_size_t yyleng; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { std::istream* yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ yy_size_t yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ yy_size_t yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] void *lialloc (yy_size_t ); void *lirealloc (void *,yy_size_t ); void lifree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define YY_SKIP_YYWRAP typedef unsigned char YY_CHAR; #define yytext_ptr yytext #include int yyFlexLexer::yywrap() { return 1; } /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (yy_size_t) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 23 #define YY_END_OF_BUFFER 24 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[84] = { 0, 0, 0, 2, 2, 24, 22, 19, 21, 22, 22, 22, 15, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 1, 19, 20, 0, 15, 17, 16, 15, 18, 18, 18, 18, 18, 18, 18, 8, 18, 10, 18, 18, 18, 18, 2, 0, 0, 0, 16, 18, 18, 18, 18, 18, 9, 18, 12, 18, 14, 16, 0, 17, 3, 18, 18, 18, 18, 18, 13, 4, 7, 5, 6, 18, 18, 18, 18, 18, 18, 11, 0 } ; static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 6, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 17, 18, 19, 20, 15, 21, 22, 23, 24, 15, 15, 15, 25, 15, 1, 1, 1, 1, 1, 1, 26, 27, 28, 29, 30, 31, 32, 15, 15, 15, 15, 33, 34, 35, 36, 37, 15, 38, 39, 40, 41, 15, 15, 15, 42, 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_int32_t yy_meta[43] = { 0, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; static yyconst flex_int16_t yy_base[87] = { 0, 0, 0, 217, 210, 212, 222, 209, 222, 206, 37, 200, 39, 200, 41, 42, 44, 47, 43, 53, 54, 52, 57, 69, 0, 222, 202, 222, 196, 80, 82, 84, 91, 196, 95, 84, 100, 99, 101, 107, 195, 98, 194, 110, 117, 114, 111, 0, 60, 119, 192, 124, 130, 128, 135, 137, 133, 189, 138, 186, 147, 184, 182, 158, 144, 143, 150, 155, 160, 152, 167, 142, 141, 77, 74, 71, 169, 166, 174, 175, 178, 177, 55, 222, 215, 53, 218 } ; static yyconst flex_int16_t yy_def[87] = { 0, 83, 1, 84, 84, 83, 83, 83, 83, 83, 83, 83, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 83, 83, 83, 83, 83, 83, 83, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 83, 83, 83, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 83, 83, 83, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 83, 83, 83 } ; static yyconst flex_int16_t yy_nxt[265] = { 0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 13, 15, 13, 16, 17, 13, 13, 13, 18, 19, 20, 21, 13, 22, 13, 23, 13, 14, 13, 15, 13, 16, 17, 13, 13, 18, 19, 20, 21, 13, 22, 13, 23, 28, 29, 31, 32, 83, 83, 83, 83, 34, 37, 83, 36, 38, 33, 35, 83, 83, 83, 83, 40, 83, 44, 50, 41, 62, 39, 34, 37, 42, 36, 38, 35, 83, 43, 83, 45, 40, 83, 46, 44, 83, 41, 39, 31, 29, 42, 30, 83, 30, 48, 43, 49, 45, 48, 31, 32, 46, 50, 83, 51, 34, 83, 83, 83, 83, 52, 53, 48, 57, 49, 83, 48, 54, 83, 83, 55, 56, 83, 34, 58, 83, 63, 52, 64, 53, 59, 57, 83, 51, 54, 61, 83, 55, 83, 56, 60, 83, 58, 83, 65, 83, 83, 69, 59, 83, 83, 83, 61, 64, 66, 83, 68, 60, 83, 67, 83, 71, 65, 83, 70, 69, 72, 64, 83, 73, 74, 66, 75, 68, 83, 83, 67, 83, 78, 71, 76, 70, 83, 83, 72, 83, 83, 73, 74, 75, 77, 62, 83, 80, 83, 79, 78, 83, 76, 81, 82, 62, 83, 83, 83, 30, 26, 77, 83, 30, 80, 27, 79, 26, 83, 25, 81, 82, 24, 24, 24, 47, 25, 47, 5, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83 } ; static yyconst flex_int16_t yy_chk[265] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 12, 12, 14, 15, 18, 16, 12, 16, 17, 15, 17, 85, 14, 21, 19, 20, 82, 18, 22, 21, 48, 19, 48, 17, 12, 16, 19, 15, 17, 14, 23, 20, 75, 22, 18, 74, 23, 21, 73, 19, 17, 29, 29, 19, 30, 35, 31, 29, 20, 30, 22, 31, 32, 32, 23, 34, 34, 34, 32, 41, 37, 36, 38, 35, 36, 29, 41, 30, 39, 31, 37, 43, 46, 38, 39, 45, 32, 43, 44, 49, 35, 49, 36, 44, 41, 51, 51, 37, 46, 53, 38, 52, 39, 45, 56, 43, 54, 52, 55, 58, 56, 44, 72, 71, 65, 46, 64, 53, 60, 55, 45, 66, 54, 69, 60, 52, 67, 58, 56, 66, 63, 68, 67, 68, 53, 69, 55, 77, 70, 54, 76, 77, 60, 70, 58, 78, 79, 66, 81, 80, 67, 68, 69, 76, 62, 61, 79, 59, 78, 77, 57, 70, 80, 81, 50, 42, 40, 33, 28, 26, 76, 13, 11, 79, 9, 78, 7, 5, 4, 80, 81, 84, 84, 84, 86, 3, 86, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "colorbar/saolex.L" /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ #line 12 "colorbar/saolex.L" #include #include #include #include #include "util.h" #include "saoparser.H" extern YYSTYPE* lilval; extern liFlexLexer* lilexx; /* rules */ #line 508 "colorbar/saolex.C" #define INITIAL 0 #define DISCARD 1 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO #define ECHO LexerOutput( yytext, yyleng ) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ \ if ( (result = LexerInput( (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) LexerError( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 #define YY_DECL int yyFlexLexer::yylex() #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { register yy_state_type yy_current_state; register char *yy_cp, *yy_bp; register int yy_act; #line 31 "colorbar/saolex.L" #line 612 "colorbar/saolex.C" if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = & std::cin; if ( ! yyout ) yyout = & std::cout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 84 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } while ( yy_current_state != 83 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 33 "colorbar/saolex.L" { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(lilval->str,""); // feed a blank string return STRING; } YY_BREAK case 2: YY_RULE_SETUP #line 40 "colorbar/saolex.L" { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(lilval->str,yytext,ll); lilval->str[ll] = '\0'; return STRING; } YY_BREAK case 3: YY_RULE_SETUP #line 48 "colorbar/saolex.L" {return BLUE_;} YY_BREAK case 4: YY_RULE_SETUP #line 49 "colorbar/saolex.L" {return DEBUG_;} YY_BREAK case 5: YY_RULE_SETUP #line 50 "colorbar/saolex.L" {return GAMMA_;} YY_BREAK case 6: YY_RULE_SETUP #line 51 "colorbar/saolex.L" {return GREEN_;} YY_BREAK case 7: YY_RULE_SETUP #line 52 "colorbar/saolex.L" {return FALSE_;} YY_BREAK case 8: YY_RULE_SETUP #line 53 "colorbar/saolex.L" {return NO_;} YY_BREAK case 9: YY_RULE_SETUP #line 54 "colorbar/saolex.L" {return OFF_;} YY_BREAK case 10: YY_RULE_SETUP #line 55 "colorbar/saolex.L" {return ON_;} YY_BREAK case 11: YY_RULE_SETUP #line 56 "colorbar/saolex.L" {return PSEUDOCOLOR_;} YY_BREAK case 12: YY_RULE_SETUP #line 57 "colorbar/saolex.L" {return RED_;} YY_BREAK case 13: YY_RULE_SETUP #line 58 "colorbar/saolex.L" {return TRUE_;} YY_BREAK case 14: YY_RULE_SETUP #line 59 "colorbar/saolex.L" {return YES_;} YY_BREAK case 15: YY_RULE_SETUP #line 61 "colorbar/saolex.L" { // Integer lilval->integer = atoi(yytext); return INT; } YY_BREAK case 16: #line 67 "colorbar/saolex.L" case 17: YY_RULE_SETUP #line 67 "colorbar/saolex.L" { // Real Number lilval->real = atof(yytext); return REAL; } YY_BREAK case 18: YY_RULE_SETUP #line 72 "colorbar/saolex.L" { // General String int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(lilval->str,yytext,ll); lilval->str[ll] = '\0'; return STRING; } YY_BREAK case 19: YY_RULE_SETUP #line 79 "colorbar/saolex.L" { // White Spaces } YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP #line 82 "colorbar/saolex.L" { // windows line feed return '\n'; } YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP #line 86 "colorbar/saolex.L" { // linefeed return '\n'; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(DISCARD): #line 90 "colorbar/saolex.L" { // eof return EOF_; } YY_BREAK case 22: YY_RULE_SETUP #line 94 "colorbar/saolex.L" { // Else, return the char return toupper(yytext[0]); } YY_BREAK case 23: YY_RULE_SETUP #line 98 "colorbar/saolex.L" ECHO; YY_BREAK #line 842 "colorbar/saolex.C" case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of yylex */ /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::yyFlexLexer( std::istream* arg_yyin, std::ostream* arg_yyout ) { yyin = arg_yyin; yyout = arg_yyout; yy_c_buf_p = 0; yy_init = 0; yy_start = 0; yy_flex_debug = 0; yylineno = 1; // this will only get updated if %option yylineno yy_did_buffer_switch_on_eof = 0; yy_looking_for_trail_begin = 0; yy_more_flag = 0; yy_more_len = 0; yy_more_offset = yy_prev_more_offset = 0; yy_start_stack_ptr = yy_start_stack_depth = 0; yy_start_stack = NULL; yy_buffer_stack = 0; yy_buffer_stack_top = 0; yy_buffer_stack_max = 0; yy_state_buf = 0; } /* The contents of this function are C++ specific, so the () macro is not used. */ yyFlexLexer::~yyFlexLexer() { delete [] yy_state_buf; lifree(yy_start_stack ); yy_delete_buffer( YY_CURRENT_BUFFER ); lifree(yy_buffer_stack ); } /* The contents of this function are C++ specific, so the () macro is not used. */ void yyFlexLexer::switch_streams( std::istream* new_in, std::ostream* new_out ) { if ( new_in ) { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( yy_create_buffer( new_in, YY_BUF_SIZE ) ); } if ( new_out ) yyout = new_out; } #ifdef YY_INTERACTIVE size_t yyFlexLexer::LexerInput( char* buf, size_t /* max_size */ ) #else size_t yyFlexLexer::LexerInput( char* buf, size_t max_size ) #endif { if ( yyin->eof() || yyin->fail() ) return 0; #ifdef YY_INTERACTIVE yyin->get( buf[0] ); if ( yyin->eof() ) return 0; if ( yyin->bad() ) return -1; return 1; #else (void) yyin->read( buf, max_size ); if ( yyin->bad() ) return -1; else return yyin->gcount(); #endif } void yyFlexLexer::LexerOutput( const char* buf, size_t size ) { (void) yyout->write( buf, size ); } /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ int yyFlexLexer::yy_get_next_buffer() { register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; register char *source = (yytext_ptr); register int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { yy_size_t num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { yy_size_t new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ lirealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = 0; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) lirealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ yy_state_type yyFlexLexer::yy_get_previous_state() { register yy_state_type yy_current_state; register char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 84 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ yy_state_type yyFlexLexer::yy_try_NUL_trans( yy_state_type yy_current_state ) { register int yy_is_jam; register char *yy_cp = (yy_c_buf_p); register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 84 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_is_jam = (yy_current_state == 83); return yy_is_jam ? 0 : yy_current_state; } void yyFlexLexer::yyunput( int c, register char* yy_bp) { register char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ register yy_size_t number_to_move = (yy_n_chars) + 2; register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; register char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } int yyFlexLexer::yyinput() { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyFlexLexer::yyrestart( std::istream* input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yyFlexLexer::yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } void yyFlexLexer::yy_load_buffer_state() { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yyFlexLexer::yy_create_buffer( std::istream* file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) lialloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) lialloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yyFlexLexer::yy_delete_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) lifree((void *) b->yy_ch_buf ); lifree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ void yyFlexLexer::yy_init_buffer( YY_BUFFER_STATE b, std::istream* file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yyFlexLexer::yy_flush_buffer( YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yyFlexLexer::yypush_buffer_state (YY_BUFFER_STATE new_buffer) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yyFlexLexer::yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ void yyFlexLexer::yyensure_buffer_stack(void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; (yy_buffer_stack) = (struct yy_buffer_state**)lialloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ int grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)lirealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } void yyFlexLexer::yy_push_state( int new_state ) { if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) ) { yy_size_t new_size; (yy_start_stack_depth) += YY_START_STACK_INCR; new_size = (yy_start_stack_depth) * sizeof( int ); if ( ! (yy_start_stack) ) (yy_start_stack) = (int *) lialloc(new_size ); else (yy_start_stack) = (int *) lirealloc((void *) (yy_start_stack),new_size ); if ( ! (yy_start_stack) ) YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); } (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START; BEGIN(new_state); } void yyFlexLexer::yy_pop_state() { if ( --(yy_start_stack_ptr) < 0 ) YY_FATAL_ERROR( "start-condition stack underflow" ); BEGIN((yy_start_stack)[(yy_start_stack_ptr)]); } int yyFlexLexer::yy_top_state() { return (yy_start_stack)[(yy_start_stack_ptr) - 1]; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif void yyFlexLexer::LexerError( yyconst char msg[] ) { std::cerr << msg << std::endl; exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { register int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { register int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *lialloc (yy_size_t size ) { return (void *) malloc( size ); } void *lirealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return (void *) realloc( (char *) ptr, size ); } void lifree (void * ptr ) { free( (char *) ptr ); /* see lirealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 98 "colorbar/saolex.L" void liDiscard(int doit) { if (lilexx) lilexx->begin(DISCARD, doit); } void liFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/colorbar/saolex.L000644 000765 000000 00000003665 12464230772 017160 0ustar00joyewheel000000 000000 /* Copyright (C) 1999-2015 * Smithsonian Astrophysical Observatory, Cambridge, MA, USA * For conditions of distribution and use, see copyright notice in "copyright" */ %option noyywrap %option caseless %option never-interactive %option c++ %{ #include #include #include #include #include "util.h" #include "saoparser.H" extern YYSTYPE* lilval; extern liFlexLexer* lilexx; %} %x DISCARD D [0-9] E [Ee][+-]?{D}+ /* rules */ %% [\n] { // special case-- #\n BEGIN INITIAL; yyless(0); // put back the terminator strcpy(lilval->str,""); // feed a blank string return STRING; } [^\n]* { // Discard reset of line BEGIN INITIAL; int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(lilval->str,yytext,ll); lilval->str[ll] = '\0'; return STRING; } blue {return BLUE_;} debug {return DEBUG_;} gamma {return GAMMA_;} green {return GREEN_;} false {return FALSE_;} no {return NO_;} off {return OFF_;} on {return ON_;} pseudocolor {return PSEUDOCOLOR_;} red {return RED_;} true {return TRUE_;} yes {return YES_;} [+-]?{D}+ { // Integer lilval->integer = atoi(yytext); return INT; } [+-]?{D}+"."?({E})? | [+-]?{D}*"."{D}+({E})? { // Real Number lilval->real = atof(yytext); return REAL; } [0-9A-Za-z]+ { // General String int ll = yyleng <(SAOBUFSIZE-1) ? yyleng:(SAOBUFSIZE-1); strncpy(lilval->str,yytext,ll); lilval->str[ll] = '\0'; return STRING; } [ \t]+ { // White Spaces } \r\n { // windows line feed return '\n'; } \n { // linefeed return '\n'; } <> { // eof return EOF_; } . { // Else, return the char return toupper(yytext[0]); } %% void liDiscard(int doit) { if (lilexx) lilexx->begin(DISCARD, doit); } void liFlexLexer::begin(int which, int doit) { BEGIN which; if (doit) yyless(0); } saods9/tksao1.0/colorbar/saoparser.C000644 000765 000000 00000130436 12553253013 017640 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton implementation for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.3" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse liparse #define yylex lilex #define yyerror lierror #define yylval lilval #define yychar lichar #define yydebug lidebug #define yynerrs linerrs /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, EOF_ = 261, BLUE_ = 262, DEBUG_ = 263, GAMMA_ = 264, GREEN_ = 265, FALSE_ = 266, NO_ = 267, OFF_ = 268, ON_ = 269, PSEUDOCOLOR_ = 270, RED_ = 271, TRUE_ = 272, YES_ = 273 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define EOF_ 261 #define BLUE_ 262 #define DEBUG_ 263 #define GAMMA_ 264 #define GREEN_ 265 #define FALSE_ 266 #define NO_ 267 #define OFF_ 268 #define ON_ 269 #define PSEUDOCOLOR_ 270 #define RED_ 271 #define TRUE_ 272 #define YES_ 273 /* Copy the first part of user declarations. */ #line 10 "colorbar/saoparser.Y" #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; liDiscard(x);} #include #include #include "sao.h" #undef yyFlexLexer #define yyFlexLexer liFlexLexer #include extern int lilex(void*, liFlexLexer*); extern void lierror(SAOColorMap*, liFlexLexer*, const char*); extern void liDiscard(int); /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "colorbar/saoparser.Y" { #define SAOBUFSIZE 4096 char str[SAOBUFSIZE]; int integer; float real; } /* Line 193 of yacc.c. */ #line 166 "colorbar/saoparser.C" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif /* Copy the second part of user declarations. */ /* Line 216 of yacc.c. */ #line 179 "colorbar/saoparser.C" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int i) #else static int YYID (i) int i; #endif { return i; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss; YYSTYPE yyvs; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack, Stack, yysize); \ Stack = &yyptr->Stack; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif /* YYFINAL -- State number of the termination state. */ #define YYFINAL 23 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 36 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 26 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 11 /* YYNRULES -- Number of rules. */ #define YYNRULES 24 /* YYNRULES -- Number of states. */ #define YYNSTATES 40 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 273 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 19, 2, 2, 2, 2, 21, 23, 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 20, 25, 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, 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, 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, 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, 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, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 7, 10, 13, 15, 17, 18, 22, 24, 28, 32, 36, 37, 40, 43, 45, 51, 53, 55, 57, 59, 61, 63 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 27, 0, -1, 27, 28, 34, -1, 28, 34, -1, 8, 36, -1, 30, -1, 15, -1, -1, 19, 29, 5, -1, 32, -1, 16, 20, 31, -1, 10, 20, 31, -1, 7, 20, 31, -1, -1, 9, 35, -1, 32, 33, -1, 33, -1, 21, 35, 22, 35, 23, -1, 24, -1, 25, -1, 6, -1, 3, -1, 4, -1, 14, -1, 13, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 59, 59, 60, 63, 64, 65, 66, 66, 67, 70, 71, 72, 75, 76, 79, 80, 83, 86, 87, 88, 91, 92, 95, 96 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "REAL", "INT", "STRING", "EOF_", "BLUE_", "DEBUG_", "GAMMA_", "GREEN_", "FALSE_", "NO_", "OFF_", "ON_", "PSEUDOCOLOR_", "RED_", "TRUE_", "YES_", "'#'", "':'", "'('", "','", "')'", "'\\n'", "';'", "$accept", "commands", "command", "@1", "color", "gamma", "lis", "li", "terminator", "numeric", "debug", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 35, 58, 40, 44, 41, 10, 59 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 26, 27, 27, 28, 28, 28, 29, 28, 28, 30, 30, 30, 31, 31, 32, 32, 33, 34, 34, 34, 35, 35, 36, 36 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 3, 2, 2, 1, 1, 0, 3, 1, 3, 3, 3, 0, 2, 2, 1, 5, 1, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 5, 9, 16, 13, 24, 23, 4, 13, 13, 0, 21, 22, 0, 1, 0, 20, 18, 19, 3, 15, 0, 12, 11, 10, 8, 0, 2, 14, 0, 17 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 8, 9, 19, 10, 31, 11, 12, 28, 22, 16 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -30 static const yytype_int8 yypact[] = { 10, -15, -11, 4, -30, 7, -30, 8, 0, -2, -30, -12, -30, 19, -30, -30, -30, 19, 19, 25, -30, -30, 11, -30, -2, -30, -30, -30, -30, -30, 8, -30, -30, -30, -30, 8, -30, -30, 9, -30 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -30, -30, 26, -30, -30, -4, -30, 24, 12, -29, -30 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 23, 37, 14, 15, 25, 13, 38, 1, 2, 7, 3, 20, 21, 32, 33, 4, 5, 1, 2, 6, 3, 7, 26, 27, 17, 4, 5, 18, 30, 6, 34, 7, 39, 35, 24, 29, 36 }; static const yytype_uint8 yycheck[] = { 0, 30, 13, 14, 6, 20, 35, 7, 8, 21, 10, 3, 4, 17, 18, 15, 16, 7, 8, 19, 10, 21, 24, 25, 20, 15, 16, 20, 9, 19, 5, 21, 23, 22, 8, 11, 24 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 7, 8, 10, 15, 16, 19, 21, 27, 28, 30, 32, 33, 20, 13, 14, 36, 20, 20, 29, 3, 4, 35, 0, 28, 6, 24, 25, 34, 33, 9, 31, 31, 31, 5, 22, 34, 35, 35, 23 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (cm, ll, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ #ifndef YY_LOCATION_PRINT # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL # define YY_LOCATION_PRINT(File, Loc) \ fprintf (File, "%d.%d-%d.%d", \ (Loc).first_line, (Loc).first_column, \ (Loc).last_line, (Loc).last_column) # else # define YY_LOCATION_PRINT(File, Loc) ((void) 0) # endif #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, ll) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, cm, ll); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, SAOColorMap* cm, liFlexLexer* ll) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, cm, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; SAOColorMap* cm; liFlexLexer* ll; #endif { if (!yyvaluep) return; YYUSE (cm); YYUSE (ll); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, SAOColorMap* cm, liFlexLexer* ll) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, cm, ll) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; SAOColorMap* cm; liFlexLexer* ll; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, cm, ll); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) #else static void yy_stack_print (bottom, top) yytype_int16 *bottom; yytype_int16 *top; #endif { YYFPRINTF (stderr, "Stack now"); for (; bottom <= top; ++bottom) YYFPRINTF (stderr, " %d", *bottom); YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, SAOColorMap* cm, liFlexLexer* ll) #else static void yy_reduce_print (yyvsp, yyrule, cm, ll) YYSTYPE *yyvsp; int yyrule; SAOColorMap* cm; liFlexLexer* ll; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { fprintf (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , cm, ll); fprintf (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, cm, ll); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into YYRESULT an error message about the unexpected token YYCHAR while in state YYSTATE. Return the number of bytes copied, including the terminating null byte. If YYRESULT is null, do not copy anything; just return the number of bytes that would be copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { int yyn = yypact[yystate]; if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) return 0; else { int yytype = YYTRANSLATE (yychar); YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; int yysize_overflow = 0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; int yyx; # if 0 /* This is so xgettext sees the translatable formats that are constructed on the fly. */ YY_("syntax error, unexpected %s"); YY_("syntax error, unexpected %s, expecting %s"); YY_("syntax error, unexpected %s, expecting %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s"); YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif char *yyfmt; char const *yyf; static char const yyunexpected[] = "syntax error, unexpected %s"; static char const yyexpecting[] = ", expecting %s"; static char const yyor[] = " or %s"; char yyformat[sizeof yyunexpected + sizeof yyexpecting - 1 + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) * (sizeof yyor - 1))]; char const *yyprefix = yyexpecting; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 1; yyarg[0] = yytname[yytype]; yyfmt = yystpcpy (yyformat, yyunexpected); for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; yyformat[sizeof yyunexpected - 1] = '\0'; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; yyfmt = yystpcpy (yyfmt, yyprefix); yyprefix = yyor; } yyf = YY_(yyformat); yysize1 = yysize + yystrlen (yyf); yysize_overflow |= (yysize1 < yysize); yysize = yysize1; if (yysize_overflow) return YYSIZE_MAXIMUM; if (yyresult) { /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ char *yyp = yyresult; int yyi = 0; while ((*yyp = *yyf) != '\0') { if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyf += 2; } else { yyp++; yyf++; } } } return yysize; } } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, SAOColorMap* cm, liFlexLexer* ll) #else static void yydestruct (yymsg, yytype, yyvaluep, cm, ll) const char *yymsg; int yytype; YYSTYPE *yyvaluep; SAOColorMap* cm; liFlexLexer* ll; #endif { YYUSE (yyvaluep); YYUSE (cm); YYUSE (ll); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (SAOColorMap* cm, liFlexLexer* ll); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (SAOColorMap* cm, liFlexLexer* ll) #else int yyparse (cm, ll) SAOColorMap* cm; liFlexLexer* ll; #endif #endif { /* The look-ahead symbol. */ int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; int yyn; int yyresult; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* Look-ahead token as an internal (translated) token number. */ int yytoken = 0; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif /* Three stacks and their tools: `yyss': related to states, `yyvs': related to semantic values, `yyls': related to locations. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss = yyssa; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) YYSIZE_T yystacksize = YYINITDEPTH; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss); YYSTACK_RELOCATE (yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a look-ahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to look-ahead token. */ yyn = yypact[yystate]; if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a look-ahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } if (yyn == YYFINAL) YYACCEPT; /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the look-ahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 7: #line 66 "colorbar/saoparser.Y" {DISCARD_(1);} break; case 10: #line 70 "colorbar/saoparser.Y" {cm->setChannel(SAOColorMap::RED);;} break; case 11: #line 71 "colorbar/saoparser.Y" {cm->setChannel(SAOColorMap::GREEN);;} break; case 12: #line 72 "colorbar/saoparser.Y" {cm->setChannel(SAOColorMap::BLUE);;} break; case 17: #line 83 "colorbar/saoparser.Y" {cm->newLIColor((yyvsp[(2) - (5)].real),(yyvsp[(4) - (5)].real));;} break; case 20: #line 88 "colorbar/saoparser.Y" {YYACCEPT;;} break; case 21: #line 91 "colorbar/saoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].real);;} break; case 22: #line 92 "colorbar/saoparser.Y" {(yyval.real)=(yyvsp[(1) - (1)].integer);;} break; case 23: #line 95 "colorbar/saoparser.Y" {yydebug=1;;} break; case 24: #line 96 "colorbar/saoparser.Y" {yydebug=0;;} break; /* Line 1267 of yacc.c. */ #line 1459 "colorbar/saoparser.C" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (cm, ll, YY_("syntax error")); #else { YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) { YYSIZE_T yyalloc = 2 * yysize; if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) yyalloc = YYSTACK_ALLOC_MAXIMUM; if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yyalloc); if (yymsg) yymsg_alloc = yyalloc; else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; } } if (0 < yysize && yysize <= yymsg_alloc) { (void) yysyntax_error (yymsg, yystate, yychar); yyerror (cm, ll, yymsg); } else { yyerror (cm, ll, YY_("syntax error")); if (yysize != 0) goto yyexhaustedlab; } } #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, cm, ll); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, cm, ll); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (cm, ll, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEOF && yychar != YYEMPTY) yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, cm, ll); /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, cm, ll); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } #line 98 "colorbar/saoparser.Y" saods9/tksao1.0/colorbar/saoparser.H000644 000765 000000 00000005361 12553253013 017643 0ustar00joyewheel000000 000000 /* A Bison parser, made by GNU Bison 2.3. */ /* Skeleton interface for Bison's Yacc-like parsers in C Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, INT = 259, STRING = 260, EOF_ = 261, BLUE_ = 262, DEBUG_ = 263, GAMMA_ = 264, GREEN_ = 265, FALSE_ = 266, NO_ = 267, OFF_ = 268, ON_ = 269, PSEUDOCOLOR_ = 270, RED_ = 271, TRUE_ = 272, YES_ = 273 }; #endif /* Tokens. */ #define REAL 258 #define INT 259 #define STRING 260 #define EOF_ 261 #define BLUE_ 262 #define DEBUG_ 263 #define GAMMA_ 264 #define GREEN_ 265 #define FALSE_ 266 #define NO_ 267 #define OFF_ 268 #define ON_ 269 #define PSEUDOCOLOR_ 270 #define RED_ 271 #define TRUE_ 272 #define YES_ 273 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 29 "colorbar/saoparser.Y" { #define SAOBUFSIZE 4096 char str[SAOBUFSIZE]; int integer; float real; } /* Line 1529 of yacc.c. */ #line 92 "colorbar/saoparser.H" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif saods9/tksao1.0/colorbar/saoparser.Y000644 000765 000000 00000003067 12464230772 017675 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" %pure-parser %parse-param {SAOColorMap* cm} %lex-param {liFlexLexer* ll} %parse-param {liFlexLexer* ll} %{ #define YYDEBUG 1 #define DISCARD_(x) {yyclearin; liDiscard(x);} #include #include #include "sao.h" #undef yyFlexLexer #define yyFlexLexer liFlexLexer #include extern int lilex(void*, liFlexLexer*); extern void lierror(SAOColorMap*, liFlexLexer*, const char*); extern void liDiscard(int); %} %union { #define SAOBUFSIZE 4096 char str[SAOBUFSIZE]; int integer; float real; } %type numeric %token REAL %token INT %token STRING %token EOF_ %token BLUE_ %token DEBUG_ %token GAMMA_ %token GREEN_ %token FALSE_ %token NO_ %token OFF_ %token ON_ %token PSEUDOCOLOR_ %token RED_ %token TRUE_ %token YES_ %% commands: commands command terminator | command terminator ; command : DEBUG_ debug | color | PSEUDOCOLOR_ | '#' {DISCARD_(1)} STRING | lis ; color : RED_ ':' gamma {cm->setChannel(SAOColorMap::RED);} | GREEN_ ':' gamma {cm->setChannel(SAOColorMap::GREEN);} | BLUE_ ':' gamma {cm->setChannel(SAOColorMap::BLUE);} ; gamma : /* empty */ | GAMMA_ numeric ; lis : lis li | li ; li : '(' numeric ',' numeric ')' {cm->newLIColor($2,$4);} ; terminator: '\n' | ';' | EOF_ {YYACCEPT;} ; numeric : REAL {$$=$1;} | INT {$$=$1;} ; debug : ON_ {yydebug=1;} | OFF_ {yydebug=0;} ; %% saods9/tkmpeg1.0/aclocal.m4000755 000765 000000 00000000223 12257355166 015746 0ustar00joyewheel000000 000000 # # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # saods9/tkmpeg1.0/configure000755 000765 000000 00001075403 12556466415 016031 0ustar00joyewheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tkmpeg 1.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tkmpeg' PACKAGE_TARNAME='tkmpeg' PACKAGE_VERSION='1.0' PACKAGE_STRING='tkmpeg 1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS WISH_PROG TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TK_INCLUDES TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP ac_ct_CXX CXXFLAGS CXX TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tk with_tclinclude with_tkinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tkmpeg 1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tkmpeg] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tkmpeg 1.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-tkinclude directory containing the public Tk header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tkmpeg configure 1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tkmpeg $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars=" ezmpeg.c tkmpeg.C " for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="-lstdc++" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h $as_echo "#define USE_TK_STUBS 1" >>confdefs.h #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wish" >&5 $as_echo_n "checking for wish... " >&6; } if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WISH_PROG}" >&5 $as_echo "${WISH_PROG}" >&6; } #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tkmpeg $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tkmpeg config.status 1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi saods9/tkmpeg1.0/configure.in000755 000765 000000 00000016553 12556466415 016436 0ustar00joyewheel000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_ # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([tkmpeg], [1.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([ ezmpeg.c tkmpeg.C ]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([-lstdc++]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- TEA_PROG_TCLSH TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile pkgIndex.tcl]) saods9/tkmpeg1.0/doc/000755 000765 000000 00000000000 12634602251 014640 5ustar00joyewheel000000 000000 saods9/tkmpeg1.0/ezmpeg.c000644 000765 000000 00000074250 11755241120 015533 0ustar00joyewheel000000 000000 //This file is part of ezMPEG //Copyright (C)2002 Ingo Oppermann ( ingo_opp@users.sourceforge.net / http://sourceforge.net/projects/ezmpeg/ ) // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either //version 2 of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // Version 0.1 #include #include #include #include #include "ezmpeg.h" #define c(i) (((i) == 0) ? 0.3535534 : 0.5) // 1 / (0.5 * sqrt(2)) #define LUMINANCE 1 #define CHROMINANCE 2 int zigzag[64] = {0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63}; // Quantisierungsmatrix float intraquant[64] = {8.0, 16.0, 19.0, 22.0, 26.0, 27.0, 29.0, 34.0, 16.0, 16.0, 22.0, 24.0, 27.0, 29.0, 34.0, 37.0, 19.0, 22.0, 26.0, 27.0, 29.0, 34.0, 34.0, 38.0, 22.0, 22.0, 26.0, 27.0, 29.0, 34.0, 37.0, 40.0, 22.0, 26.0, 27.0, 29.0, 32.0, 35.0, 40.0, 48.0, 26.0, 27.0, 29.0, 32.0, 35.0, 40.0, 48.0, 58.0, 26.0, 27.0, 29.0, 34.0, 38.0, 46.0, 56.0, 69.0, 27.0, 29.0, 35.0, 38.0, 46.0, 56.0, 69.0, 83.0}; // Cosinustabelle float fcostable[32]; // Macroblock Address Increment VLC (Tabelle B.1) int macroblock_address_increment_code[36] = {0x0, 0x1, 0x3, 0x2, 0x3, 0x2, 0x3, 0x2, 0x7, 0x6, 0xB, 0xA, 0x9, 0x8, 0x7, 0x6, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x23, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18, 0xF, 0x8}; int macroblock_address_increment_length[36] = {0, 1, 3, 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}; #define MACROBLOCK_STUFFING 34 #define MACROBLOCK_ESCAPE 35 // Index des Arrays ist size, von 0 bis 8 (Tabelle D.12) int diff_dc_size_codes_lum[9] = {0x4, 0x0, 0x1, 0x5, 0x6, 0xE, 0x1E, 0x3E, 0x7E}; int diff_dc_size_length_lum[9] = {3, 2, 2, 3, 3, 4, 5, 6, 7}; int diff_dc_size_codes_chrom[9] = {0x0, 0x1, 0x2, 0x6, 0xE, 0x1E, 0x3E, 0x7E, 0xFE}; int diff_dc_size_length_chrom[9] = {2, 2, 2, 3, 4, 5, 6, 7, 8}; // Index des Arrays ist size, von 0 bis 8 (Tabelle D.13) int diff_dc_add_codes_pos[9] = {0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; int diff_dc_add_codes_neg[9] = {0x0, 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F}; int diff_dc_add_length[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; // Tabelle D.15, der Index ist level ohne Vorzeichen, das muss noch extra hinzugefgt werden! // Bei Index==0 steht drin, wieviele Levels da sind int ac_codes_intra0[41] = {40, 3, 4, 5, 6, 38, 33, 10, 29, 24, 19, 16, 26, 25, 24, 23, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 24, 23, 22, 21, 20, 19, 18, 17, 16}; int ac_length_intra0[41] = {0, 2, 4, 5, 7, 8, 8, 10, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}; int ac_codes_intra1[19] = {18, 3, 6, 37, 12, 27, 22, 21, 31, 30, 29, 28, 27, 26, 25, 19, 18, 17, 16}; int ac_length_intra1[19] = {0, 3, 6, 8, 10, 12, 13, 13, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16}; int ac_codes_intra2[6] = {5, 5, 4, 11, 20, 20}; int ac_length_intra2[6] = {0, 4, 7, 10, 12, 13}; int ac_codes_intra3[5] = {4, 7, 36, 28, 19}; int ac_length_intra3[5] = {0, 5, 8, 12, 13}; int ac_codes_intra4[4] = {3, 6, 15, 18}; int ac_length_intra4[4] = {0, 5, 10, 12}; int ac_codes_intra5[4] = {3, 7, 9, 18}; int ac_length_intra5[4] = {0, 6, 10, 13}; int ac_codes_intra6[4] = {3, 5, 30, 20}; int ac_length_intra6[4] = {0, 6, 12, 16}; int ac_codes_intra7[3] = {2, 4, 21}; int ac_length_intra7[3] = {0, 6, 12}; int ac_codes_intra8[3] = {2, 7, 17}; int ac_length_intra8[3] = {0, 7, 12}; int ac_codes_intra9[3] = {2, 5, 17}; int ac_length_intra9[3] = {0, 7, 13}; int ac_codes_intra10[3] = {2, 39, 16}; int ac_length_intra10[3] = {0, 8, 13}; int ac_codes_intra11[3] = {2, 35, 26}; int ac_length_intra11[3] = {0, 8, 16}; int ac_codes_intra12[3] = {2, 34, 25}; int ac_length_intra12[3] = {0, 8, 16}; int ac_codes_intra13[3] = {2, 32, 24}; int ac_length_intra13[3] = {0, 8, 16}; int ac_codes_intra14[3] = {2, 14, 23}; int ac_length_intra14[3] = {0, 10, 16}; int ac_codes_intra15[3] = {2, 13, 22}; int ac_length_intra15[3] = {0, 10, 16}; int ac_codes_intra16[3] = {2, 8, 21}; int ac_length_intra16[3] = {0, 10, 16}; int ac_codes_intra17[2] = {1, 31}; int ac_length_intra17[2] = {0, 12}; int ac_codes_intra18[2] = {1, 26}; int ac_length_intra18[2] = {0, 12}; int ac_codes_intra19[2] = {1, 25}; int ac_length_intra19[2] = {0, 12}; int ac_codes_intra20[2] = {1, 23}; int ac_length_intra20[2] = {0, 12}; int ac_codes_intra21[2] = {1, 22}; int ac_length_intra21[2] = {0, 12}; int ac_codes_intra22[2] = {1, 31}; int ac_length_intra22[2] = {0, 13}; int ac_codes_intra23[2] = {1, 30}; int ac_length_intra23[2] = {0, 13}; int ac_codes_intra24[2] = {1, 29}; int ac_length_intra24[2] = {0, 13}; int ac_codes_intra25[2] = {1, 28}; int ac_length_intra25[2] = {0, 13}; int ac_codes_intra26[2] = {1, 27}; int ac_length_intra26[2] = {0, 13}; int ac_codes_intra27[2] = {1, 31}; int ac_length_intra27[2] = {0, 16}; int ac_codes_intra28[2] = {1, 30}; int ac_length_intra28[2] = {0, 16}; int ac_codes_intra29[2] = {1, 29}; int ac_length_intra29[2] = {0, 16}; int ac_codes_intra30[2] = {1, 28}; int ac_length_intra30[2] = {0, 16}; int ac_codes_intra31[2] = {1, 27}; int ac_length_intra31[2] = {0, 16}; int *ac_codes_intra[] = { ac_codes_intra0, ac_codes_intra1, ac_codes_intra2, ac_codes_intra3, ac_codes_intra4, ac_codes_intra5, ac_codes_intra6, ac_codes_intra7, ac_codes_intra8, ac_codes_intra9, ac_codes_intra10, ac_codes_intra11, ac_codes_intra12, ac_codes_intra13, ac_codes_intra14, ac_codes_intra15, ac_codes_intra16, ac_codes_intra17, ac_codes_intra18, ac_codes_intra19, ac_codes_intra20, ac_codes_intra21, ac_codes_intra22, ac_codes_intra23, ac_codes_intra24, ac_codes_intra25, ac_codes_intra26, ac_codes_intra27, ac_codes_intra28, ac_codes_intra29, ac_codes_intra30, ac_codes_intra31}; int *ac_length_intra[] = { ac_length_intra0, ac_length_intra1, ac_length_intra2, ac_length_intra3, ac_length_intra4, ac_length_intra5, ac_length_intra6, ac_length_intra7, ac_length_intra8, ac_length_intra9, ac_length_intra10, ac_length_intra11, ac_length_intra12, ac_length_intra13, ac_length_intra14, ac_length_intra15, ac_length_intra16, ac_length_intra17, ac_length_intra18, ac_length_intra19, ac_length_intra20, ac_length_intra21, ac_length_intra22, ac_length_intra23, ac_length_intra24, ac_length_intra25, ac_length_intra26, ac_length_intra27, ac_length_intra28, ac_length_intra29, ac_length_intra30, ac_length_intra31}; // Spezielle Codes int ac_codes_special[2] = {2, 1}; int ac_length_special[2] = {2, 6}; #define BLOCK_EOB 0 #define BLOCK_ESCAPE 1 int ezMPEG_Init(ezMPEGStream *ms, const char *outfile, int hsize, int vsize, int picture_rate, int gop_size, int q_scale) { int i, j; if(ms == NULL) return 0; if(outfile == NULL) { ezMPEG_SetError(ms, "ezMPEG_Init: Please specify an output filename"); return 0; } if(hsize < 16 || hsize > 768) { ezMPEG_SetError(ms, "ezMPEG_Init: Horizontal size should be between 16 and 768"); return 0; } if(vsize < 16 || vsize > 576) { ezMPEG_SetError(ms, "ezMPEG_Init: Vertical size should be between 16 and 576"); return 0; } if(picture_rate != 25) { ezMPEG_SetError(ms, "ezMPEG_Init: Picture rate should be 25 (for now)"); return 0; } if(gop_size == 0) { ezMPEG_SetError(ms, "ezMPEG_Init: GOP size should be 1 or greater"); return 0; } if(q_scale < 1 || q_scale > 31) { ezMPEG_SetError(ms, "ezMPEG_Init: Quantizer scale should be between 1 and 31"); return 0; } ms->outfile = (char *)malloc((strlen(outfile) + 1) * sizeof(char)); if(!ms->outfile) { ezMPEG_SetError(ms, "ezMPEG_Init: Couldn't allocate enough memory"); return 0; } strcpy(ms->outfile, outfile); ms->hsize = hsize / 16; ms->vsize = vsize / 16; ms->picture_rate = picture_rate; // picture_rate; ms->gop_size = gop_size; ms->dc_prev[0] = 128; ms->dc_prev[1] = 128; ms->dc_prev[2] = 128; ms->q_scale = (float)q_scale; // Versteckte Felder ms->picture_count = 0; ms->buffersize = 8192; ms->buffercount = 0; ms->buffer = (char *)malloc(ms->buffersize * sizeof(char)); if(!ms->buffer) { ezMPEG_SetError(ms, "ezMPEG_Init: Couldn't allocate enough memory"); return 0; } ms->error_code = 0; strcpy(ms->error_msg, ""); // Cosinustabelle fllen for(i = 0; i < 8; i++) { for(j = 0; j < 4; j++) { if((i % 2)) // ungerade fcostable[i * 4 + j] = cos((M_PI * (2.0 * (float)j + 1.0) / 16.0) + (M_PI * (float)((i - 1) / 2) * (2.0 * (float)j + 1.0) / 8.0)); else fcostable[i * 4 + j] = cos(M_PI * (float)(i / 2) * (2.0 * (float)j + 1.0) / 8.0); } } return 1; } int ezMPEG_Start(ezMPEGStream *ms) { if(ms == NULL) return 0; // Datei zum Reinschreiben aufmachen ms->out = fopen(ms->outfile, "wb"); if(ms->out == NULL) { ezMPEG_SetError(ms, "ezMPEG_Start: Couldn't open output file"); return 0; } // BitBuffer initialisieren ezMPEG_InitBitBuffer(ms); // MPEG Video Sequence Header schreiben ezMPEG_WriteSequenceHeader(ms); if(ms->error_code) return 0; return 1; } void ezMPEG_WriteSequenceHeader(ezMPEGStream *ms) { ezMPEG_ByteAlign(ms); ezMPEG_WriteBits(ms, 0x1B3, 32); // sequence_header_code ezMPEG_WriteBits(ms, ms->hsize & 0xFF, 8); // horizontal_size (in Macroblocks) ezMPEG_WriteBits(ms, (ms->hsize >> 8) & 0xF, 4); // ezMPEG_WriteBits(ms, ms->vsize & 0xFF, 8); // vertical_size (in Macroblocks) ezMPEG_WriteBits(ms, (ms->vsize >> 8) & 0xF, 4); // ezMPEG_WriteBits(ms, 1, 4); // pel_aspect_ratio (1:1) ezMPEG_WriteBits(ms, 3, 4); // picture_rate (25Hz) ezMPEG_WriteBits(ms, 0xFFFF, 16); // variable_length_bitrate (18x 1) ezMPEG_WriteBits(ms, 0x3, 2); // ezMPEG_WriteBits(ms, 1, 1); // marker_bit (1) ezMPEG_WriteBits(ms, 20, 10); // vbv_buffer_size (20) ezMPEG_WriteBits(ms, 1, 1); // constrained_parameter_flags (1) ezMPEG_WriteBits(ms, 0, 1); // load_intra_quantizer_matrix (0) ezMPEG_WriteBits(ms, 0, 1); // load_non_intra_quantizer_maxtrix (0) if(ms->error_code) strcpy(ms->error_msg, "ezMPEG_WriteSequenceHeader: Couldn't write sequence header"); return; } void ezMPEG_InitBitBuffer(ezMPEGStream *ms) { ezMPEG_WriteBits(ms, 0, -1); return; } void ezMPEG_ByteAlign(ezMPEGStream *ms) { ezMPEG_WriteBits(ms, 0, -2); return; } int ezMPEG_WriteBits(ezMPEGStream *ms, unsigned int value, int length) { int temp; if(length == -1) { ms->buf = 0; ms->pos = 0; return 1; } if(length == -2) { if(ms->pos == 0) return 1; length = 8 - ms->pos; value = 0; } do { if(length >= 8) { temp = value >> ((length - 8) + ms->pos); ms->buf += temp; ms->buffer[ms->buffercount++] = ms->buf; length -= (8 - ms->pos); ms->pos = 0; ms->buf = 0; } else { if(length + ms->pos < 8) { temp = value << (8 - length); temp = temp & 0xFF; temp = temp >> ms->pos; ms->buf += temp; ms->pos += length; length = 0; } else { temp = value << (8 - length); temp = temp & 0xFF; temp = temp >> ms->pos; ms->buf += temp; ms->buffer[ms->buffercount++] = ms->buf; length -= (8 - ms->pos); ms->buf = 0; ms->pos = 0; } } if(ms->buffercount >= ms->buffersize) { if(fwrite(ms->buffer, ms->buffercount, 1, ms->out) < 1) { ezMPEG_SetError(ms, "ezMPEG_WriteBits: Couldn't write buffer to file"); return 0; } ms->buffercount = 0; } }while(length != 0); return 1; } int ezMPEG_Add(ezMPEGStream *ms, unsigned char *picture) { int m; Macroblock mb; // Schauen, ob eine neue GOP angefangen werden muss if(ms->picture_count % ms->gop_size == 0) ezMPEG_WriteGOPHeader(ms); ezMPEG_WritePictureHeader(ms); for(m = 0; m < ms->hsize * ms->vsize; m++) { // Das Bild in Macroblocks und YCbCr umwandeln mb = ezMPEG_GetMacroblock(ms, picture, m /* Nummer */); // Das Bild transformieren und scalieren mb = ezMPEG_QuantizeMacroblock(ms, mb); // Macroblock codieren und schreiben ezMPEG_WriteMacroblock(ms, mb); } ms->picture_count++; if(ms->error_code) return 0; return 1; } void ezMPEG_WriteMacroblock(ezMPEGStream *ms, Macroblock mb) { int j, k, run, level, dc_diff; // Macroblock Header, macroblock_address_increment ezMPEG_WriteBits(ms, macroblock_address_increment_code[1], macroblock_address_increment_length[1]); if(ms->q_scale != 1.0) { ezMPEG_WriteBits(ms, 1, 2); // macroblock_type (I-Block, intra-q) ezMPEG_WriteBits(ms, (int)ms->q_scale, 5); // nochmals quantizer_scale wie im Slice } else ezMPEG_WriteBits(ms, 1, 1); // macroblock_type (I-Block, intra-d) // Ueber jeden Block in diesem Macroblock gehen (zuerst Luminance) for(j = 0; j < 4; j++) { // DC-Koeffizienten codieren mb.lum[j].a[0] += (mb.lum[j].a[0] > 0.0) ? 0.5 : -0.5; dc_diff = (int)mb.lum[j].a[0] - ms->dc_prev[0]; ezMPEG_EncodeDC(ms, dc_diff, LUMINANCE); ms->dc_prev[0] += dc_diff; // AC-Koeffizienten Runlength codieren run = 0; level = 0; for(k = 1; k < 64; k++) { mb.lum[j].a[zigzag[k]] += (mb.lum[j].a[zigzag[k]] > 0.0) ? 0.5 : -0.5; level = (int)mb.lum[j].a[zigzag[k]]; if(level != 0) { ezMPEG_EncodeAC(ms, run, level); run = 0; } else run++; } ezMPEG_WriteBits(ms, ac_codes_special[BLOCK_EOB], ac_length_special[BLOCK_EOB]); } // Ueber den Cb-Block gehen mb.chrom[0].a[0] += (mb.chrom[0].a[0] > 0.0) ? 0.5 : -0.5; dc_diff = (int)mb.chrom[0].a[0] - ms->dc_prev[1]; ezMPEG_EncodeDC(ms, dc_diff, CHROMINANCE); ms->dc_prev[1] += dc_diff; run = 0; level = 0; for(k = 1; k < 64; k++) { mb.chrom[0].a[zigzag[k]] += (mb.chrom[0].a[zigzag[k]] > 0.0) ? 0.5 : -0.5; level = (int)mb.chrom[0].a[zigzag[k]]; if(level != 0) { ezMPEG_EncodeAC(ms, run, level); run = 0; } else run++; } ezMPEG_WriteBits(ms, ac_codes_special[BLOCK_EOB], ac_length_special[BLOCK_EOB]); // Ueber den Cr-Block gehen mb.chrom[1].a[0] += (mb.chrom[1].a[0] > 0.0) ? 0.5 : -0.5; dc_diff = (int)mb.chrom[1].a[0] - ms->dc_prev[2]; ezMPEG_EncodeDC(ms, dc_diff, CHROMINANCE); ms->dc_prev[2] += dc_diff; run = 0; level = 0; for(k = 1; k < 64; k++) { mb.chrom[1].a[zigzag[k]] += (mb.chrom[1].a[zigzag[k]] > 0.0) ? 0.5 : -0.5; level = (int)mb.chrom[1].a[zigzag[k]]; if(level != 0) { ezMPEG_EncodeAC(ms, run, level); run = 0; } else run++; } ezMPEG_WriteBits(ms, ac_codes_special[BLOCK_EOB], ac_length_special[BLOCK_EOB]); return; } void ezMPEG_WriteGOPHeader(ezMPEGStream *ms) { ezMPEG_ByteAlign(ms); ezMPEG_WriteBits(ms, 0x1B8, 32); // group_start_code ezMPEG_WriteBits(ms, 0, 1); // time_code ezMPEG_WriteBits(ms, ((ms->picture_count / ms->picture_rate) / 60) / 24, 5); // Stunden ezMPEG_WriteBits(ms, ((ms->picture_count / ms->picture_rate) / 60) % 24, 6); // Minuten ezMPEG_WriteBits(ms, 1, 1); // ezMPEG_WriteBits(ms, (ms->picture_count / ms->picture_rate) % 60, 6); // Sekunden ezMPEG_WriteBits(ms, ms->picture_count % ms->picture_rate, 6); // picture_time_code ezMPEG_WriteBits(ms, 1, 1); // closed_gop (1) ezMPEG_WriteBits(ms, 0, 1); // broken_link (0) if(ms->error_code) ezMPEG_SetError(ms, "ezMPEG_WriteGOPHeader: Couldn't write GOP header"); return; } void ezMPEG_WritePictureHeader(ezMPEGStream *ms) { ezMPEG_ByteAlign(ms); ezMPEG_WriteBits(ms, 0x100, 32); // picture_start_code (0x100) // temporal_reference (0) wird bei jedem Bild in dieser GOP um 1 erhht // und fngt bei einer neuen GOP wieder bei 0 an ezMPEG_WriteBits(ms, ms->picture_count % ms->gop_size, 10); ezMPEG_WriteBits(ms, 1, 3); // picture_coding_type (1, I-Picture) ezMPEG_WriteBits(ms, 0, 16); // vbv_delay (0, kann irgendwas sein wenn variable Bitrate) ezMPEG_WriteBits(ms, 0, 1); // extra_bit_picture // Ein Slice pro Picture sollte reichen ezMPEG_ByteAlign(ms); ezMPEG_WriteBits(ms, 0x101, 32); // slice_start_code (vertikale Position diese Slices in Macroblockeinheiten) // horizontale Position gegeben durch macroblock_address(_increment) des ersten // Macroblocks in diesem Slice. Jeder Slice ist 16 Pels hoch // Reset der DC-Keoff. fr differential-Codierung // dc_lum_prev = 128, dc_cb_prev = 128, dc_cr_prev = 128 // slice_vertical_position = macroblock_row + 1; // quantize_scale, in jedem Macroblockheader muss macroblock_type=intra_q (01), oder intra_d (1) sein. // Wenn intra_q => macroblock_quant wird == 1 sein ezMPEG_WriteBits(ms, (int)ms->q_scale, 5); ezMPEG_WriteBits(ms, 0, 1); // extra_bit_slice ms->dc_prev[0] = 128; ms->dc_prev[1] = 128; ms->dc_prev[2] = 128; if(ms->error_code) ezMPEG_SetError(ms, "ezMPEG_WritePictureHeader: Couldn't write picture header"); return; } Macroblock ezMPEG_GetMacroblock(ezMPEGStream *ms, unsigned char *picture, int number) { int i, j, k, l, m; int mb_r[64], mb_g[64], mb_b[64]; int offset; Macroblock mb; i = number / ms->hsize; j = number % ms->hsize; offset = 3 * ms->hsize * 16; // 1. Block m = 0; for(k = i * 16; k < i * 16 + 8; k++) { for(l = j * 16 * 3; l < j * 16 * 3 + 24; l += 3) { mb.lum[0].a[m] = 0.299 * (float)picture[k * offset + l] + 0.587 * (float)picture[k * offset + l + 1] + 0.114 * (float)picture[k * offset + l + 2]; mb_r[m] = picture[k * offset + l]; mb_g[m] = picture[k * offset + l + 1]; mb_b[m] = picture[k * offset + l + 2]; m++; } } // 2. Block m = 0; for(k = i * 16; k < i * 16 + 8; k++) { for(l = j * 16 * 3 + 24; l < j * 16 * 3 + 48; l += 3) { mb.lum[1].a[m] = 0.299 * (float)picture[k * offset + l] + 0.587 * (float)picture[k * offset + l + 1] + 0.114 * (float)picture[k * offset + l + 2]; mb_r[m] += picture[k * offset + l]; mb_g[m] += picture[k * offset + l + 1]; mb_b[m] += picture[k * offset + l + 2]; m++; } } // 3. Block m = 0; for(k = i * 16 + 8; k < (i + 1) * 16; k++) { for(l = j * 16 * 3; l < j * 16 * 3 + 24; l += 3) { mb.lum[2].a[m] = 0.299 * (float)picture[k * offset + l] + 0.587 * (float)picture[k * offset + l + 1] + 0.114 * (float)picture[k * offset + l + 2]; mb_r[m] += picture[k * offset + l]; mb_g[m] += picture[k * offset + l + 1]; mb_b[m] += picture[k * offset + l + 2]; m++; } } // 4. Block m = 0; for(k = i * 16 + 8; k < (i + 1) * 16; k++) { for(l = j * 16 * 3 + 24; l < j * 16 * 3 + 48; l += 3) { mb.lum[3].a[m] = 0.299 * (float)picture[k * offset + l] + 0.587 * (float)picture[k * offset + l + 1] + 0.114 * (float)picture[k * offset + l + 2]; mb_r[m] += picture[k * offset + l]; mb_g[m] += picture[k * offset + l + 1]; mb_b[m] += picture[k * offset + l + 2]; m++; } } for(m = 0; m < 64; m++) { mb.chrom[0].a[m] = -0.1687 * (float)mb_r[m] * 0.25 - 0.3313 * (float)mb_g[m] * 0.25 + 0.5 * (float)mb_b[m] * 0.25 + 128.0; mb.chrom[1].a[m] = 0.5 * (float)mb_r[m] * 0.25 - 0.4187 * (float)mb_g[m] * 0.25 - 0.0813 * (float)mb_b[m] * 0.25 + 128.0; } return mb; } Macroblock ezMPEG_QuantizeMacroblock(ezMPEGStream *ms, Macroblock mb) { int i, j, l, p; float w[8]; Macroblock tempmb; // Ueber alle Luminanceblocks gehen for(l = 0; l < 4; l++) { // Ueber alle Eintrge im Block gehen for(i = 0; i < 8; i++) { for(j = 0; j < 8; j++) { for(p = 0; p < 8; p++) { // Koeffizienten mit FDCT berechnen w[p] = ezMPEG_1DFDCT(&mb.lum[l].a[p * 8], j); } tempmb.lum[l].a[i * 8 + j] = ezMPEG_1DFDCT(w, i) * c(i) * c(j); // Quantifizierung if(i == 0 && j == 0) tempmb.lum[l].a[i * 8 + j] /= 8.0; else // mit quantizer_scale (slice_header und macroblock_header beachten) tempmb.lum[l].a[i * 8 + j] *= 8.0 / (ms->q_scale * intraquant[i * 8 + j]); } } } // Ueber alle Chrominanceblocks gehen for(l = 0; l < 2; l++) { // Ueber alle Eintrge im Block gehen for(i = 0; i < 8; i++) { for(j = 0; j < 8; j++) { for(p = 0; p < 8; p++) { // Koeffizienten mit FDCT berechnen w[p] = ezMPEG_1DFDCT(&mb.chrom[l].a[p * 8], j); } tempmb.chrom[l].a[i * 8 + j] = ezMPEG_1DFDCT(w, i) * c(i) * c(j); // Quantifizierung if(i == 0 && j == 0) tempmb.chrom[l].a[i * 8 + j] /= 8.0; else // mit quantizer_scale tempmb.chrom[l].a[i * 8 + j] *= 8.0 / (ms->q_scale * intraquant[i * 8 + j]); } } } return tempmb; } float ezMPEG_1DFDCT(float *v, int i) { int n; float temp; temp = 0.0; if((i % 2)) { // i ungerade for(n = 0; n < 4; n++) temp += (v[n] - v[7 - n]) * fcostable[i * 4 + n]; } else { // i gerade for(n = 0; n < 4; n++) temp += (v[n] + v[7 - n]) * fcostable[i * 4 + n]; } return temp; } void ezMPEG_EncodeAC(ezMPEGStream *ms, int runlength, int level) { int level_abs; level_abs = level < 0 ? -level : level; // ac_codes_intra[runlength][0]: Dieser Wert dort gibt an, ob der entsprechende Level // direkt codiert werden kann: if((level_abs > ac_codes_intra[runlength][0]) || runlength > 31) { // Benutze ac_codes_special[BLOCK_ESCAPE] ezMPEG_WriteBits(ms, ac_codes_special[BLOCK_ESCAPE], ac_length_special[BLOCK_ESCAPE]); // Table D.16, Codierung der Runlenght, wenn runlength/level-Kombination in Tabel D.15 nicht vorkommt: ezMPEG_WriteBits(ms, runlength, 6); // Der Escape-Code wurde oben schon ausgegeben und es ist kein Array ntig, da die runlength direkt codiert wird // Hier kommet noch Tabelle D.17 zur Anwendung // Hier muss noch der Level codiert werden: if(level > 0) { if(level >= 1 && level < 128) ezMPEG_WriteBits(ms, level, 8); else ezMPEG_WriteBits(ms, level, 16); } else { if(level <= -1 && level > -128) { ezMPEG_WriteBits(ms, 256 + level, 8); } else { ezMPEG_WriteBits(ms, 32896 + (level + 128), 16); } } } else { // Table D.15 // code = ac_codes_intra[runlength][abs(level)]; // length = ac_length_intra[runlength][abs(level)]; ezMPEG_WriteBits(ms, ac_codes_intra[runlength][level_abs], ac_length_intra[runlength][level_abs]); // Und noch das Vorzeichen if(level < 0.0) { ezMPEG_WriteBits(ms, 1, 1); } else { ezMPEG_WriteBits(ms, 0, 1); } } if(ms->error_code) ezMPEG_SetError(ms, "ezMPEG_EncodeAC: Couldn't write ac codes"); return; } void ezMPEG_EncodeDC(ezMPEGStream *ms, int dc_diff, int type) { int dc_diff_abs; int code = 0, length = 0; dc_diff_abs = dc_diff < 0 ? -dc_diff : dc_diff; if(type == LUMINANCE) { if(dc_diff_abs == 0) { code = diff_dc_size_codes_lum[0]; length = diff_dc_size_length_lum[0]; } else if(dc_diff_abs == 1) { code = diff_dc_size_codes_lum[1]; length = diff_dc_size_length_lum[1]; } else if(dc_diff_abs >= 2 && dc_diff_abs <= 3) { code = diff_dc_size_codes_lum[2]; length = diff_dc_size_length_lum[2]; } else if(dc_diff_abs >= 4 && dc_diff_abs <= 7) { code = diff_dc_size_codes_lum[3]; length = diff_dc_size_length_lum[3]; } else if(dc_diff_abs >= 8 && dc_diff_abs <= 15) { code = diff_dc_size_codes_lum[4]; length = diff_dc_size_length_lum[4]; } else if(dc_diff_abs >= 16 && dc_diff_abs <= 31) { code = diff_dc_size_codes_lum[5]; length = diff_dc_size_length_lum[5]; } else if(dc_diff_abs >= 32 && dc_diff_abs <= 63) { code = diff_dc_size_codes_lum[6]; length = diff_dc_size_length_lum[6]; } else if(dc_diff_abs >= 64 && dc_diff_abs <= 127) { code = diff_dc_size_codes_lum[7]; length = diff_dc_size_length_lum[7]; } else if(dc_diff_abs >= 128 && dc_diff_abs <= 255) { code = diff_dc_size_codes_lum[8]; length = diff_dc_size_length_lum[8]; } else { ezMPEG_SetError(ms, "ezMPEG_EncodeDC: FATAL! absolute dc difference > 255 (Luminance)"); } } else if(type == CHROMINANCE) { if(dc_diff_abs == 0) { code = diff_dc_size_codes_chrom[0]; length = diff_dc_size_length_chrom[0]; } else if(dc_diff_abs == 1) { code = diff_dc_size_codes_chrom[1]; length = diff_dc_size_length_chrom[1]; } else if(dc_diff_abs >= 2 && dc_diff_abs <= 3) { code = diff_dc_size_codes_chrom[2]; length = diff_dc_size_length_chrom[2]; } else if(dc_diff_abs >= 4 && dc_diff_abs <= 7) { code = diff_dc_size_codes_chrom[3]; length = diff_dc_size_length_chrom[3]; } else if(dc_diff_abs >= 8 && dc_diff_abs <= 15) { code = diff_dc_size_codes_chrom[4]; length = diff_dc_size_length_chrom[4]; } else if(dc_diff_abs >= 16 && dc_diff_abs <= 31) { code = diff_dc_size_codes_chrom[5]; length = diff_dc_size_length_chrom[5]; } else if(dc_diff_abs >= 32 && dc_diff_abs <= 63) { code = diff_dc_size_codes_chrom[6]; length = diff_dc_size_length_chrom[6]; } else if(dc_diff_abs >= 64 && dc_diff_abs <= 127) { code = diff_dc_size_codes_chrom[7]; length = diff_dc_size_length_chrom[7]; } else if(dc_diff_abs >= 128 && dc_diff_abs <= 255) { code = diff_dc_size_codes_chrom[8]; length = diff_dc_size_length_chrom[8]; } else { ezMPEG_SetError(ms, "ezMPEG_EncodeDC: FATAL! absolute dc difference > 255 (Chrominance)"); } } else { ezMPEG_SetError(ms, "ezMPEG_EncodeDC: FATAL! Unknown coefficient type"); } ezMPEG_WriteBits(ms, code, length); if(dc_diff == 0) { return; } if(dc_diff < 0) { if(dc_diff == -1) { code = diff_dc_add_codes_neg[1]; length = diff_dc_add_length[1]; } else if(dc_diff <= -2 && dc_diff >= -3) { code = diff_dc_add_codes_neg[2] - (-2 - dc_diff); length = diff_dc_add_length[2]; } else if(dc_diff <= -4 && dc_diff >= -7) { code = diff_dc_add_codes_neg[3] - (-4 - dc_diff); length = diff_dc_add_length[3]; } else if(dc_diff <= -8 && dc_diff >= -15) { code = diff_dc_add_codes_neg[4] - (-8 - dc_diff); length = diff_dc_add_length[4]; } else if(dc_diff <= -16 && dc_diff >= -31) { code = diff_dc_add_codes_neg[5] - (-16 - dc_diff); length = diff_dc_add_length[5]; } else if(dc_diff <= -32 && dc_diff >= -63) { code = diff_dc_add_codes_neg[6] - (-32 - dc_diff); length = diff_dc_add_length[6]; } else if(dc_diff <= -64 && dc_diff >= -127) { code = diff_dc_add_codes_neg[7] - (-64 - dc_diff); length = diff_dc_add_length[7]; } else if(dc_diff <= -128 && dc_diff >= -255) { code = diff_dc_add_codes_neg[8] - (-128 - dc_diff); length = diff_dc_add_length[8]; } else { ezMPEG_SetError(ms, "ezMPEG_EncodeDC: FATAL! dc difference < -255"); } } else { if(dc_diff == 1) { code = diff_dc_add_codes_pos[1]; length = diff_dc_add_length[1]; } else if(dc_diff >= 2 && dc_diff <= 3) { code = diff_dc_add_codes_pos[2] + (dc_diff - 2); length = diff_dc_add_length[2]; } else if(dc_diff >= 4 && dc_diff <= 7) { code = diff_dc_add_codes_pos[3] + (dc_diff - 4); length = diff_dc_add_length[3]; } else if(dc_diff >= 8 && dc_diff <= 15) { code = diff_dc_add_codes_pos[4] + (dc_diff - 8); length = diff_dc_add_length[4]; } else if(dc_diff >= 16 && dc_diff <= 31) { code = diff_dc_add_codes_pos[5] + (dc_diff - 16); length = diff_dc_add_length[5]; } else if(dc_diff >= 32 && dc_diff <= 63) { code = diff_dc_add_codes_pos[6] + (dc_diff - 32); length = diff_dc_add_length[6]; } else if(dc_diff >= 64 && dc_diff <= 127) { code = diff_dc_add_codes_pos[7] + (dc_diff - 64); length = diff_dc_add_length[7]; } else if(dc_diff >= 128 && dc_diff <= 255) { code = diff_dc_add_codes_pos[8] + (dc_diff - 128); length = diff_dc_add_length[8]; } else { ezMPEG_SetError(ms, "ezMPEG_EncodeDC: FATAL! dc difference > 255"); } } ezMPEG_WriteBits(ms, code, length); return; } int ezMPEG_Finalize(ezMPEGStream *ms) { // Den Stream mit dem entsprechenden Code beenden // und den Buffer flushen ezMPEG_ByteAlign(ms); ezMPEG_WriteBits(ms, 0x01B7, 32); // sequence_end_code ezMPEG_FlushBuffer(ms); // ms->out schliessen fclose(ms->out); // Speicher freigeben free(ms->outfile); free(ms->buffer); if(ms->error_code) return 0; return 1; } void ezMPEG_FlushBuffer(ezMPEGStream *ms) { if(fwrite(ms->buffer, ms->buffercount, 1, ms->out) < 1) ezMPEG_SetError(ms, "ezMPEG_FlushBuffer: Couldn't write buffer to file"); ms->buffercount = 0; return; } void ezMPEG_SetError(ezMPEGStream *ms, const char *error_msg) { if(ms != NULL && error_msg != NULL) { ms->error_code = 1; strcpy(ms->error_msg, error_msg); } return; } char *ezMPEG_GetLastError(ezMPEGStream *ms) { ms->error_code = 0; return ms->error_msg; } void ezMPEG_Resize(ezMPEGStream *ms, unsigned char *outbild, unsigned char *inbild, int x, int y, int u, int v) { float hor, ver; int a, b, c, d, e, f, g, h; if(outbild == NULL || inbild == NULL) ezMPEG_SetError(ms, "ezMPEG_Resize: Nullpointer"); if(x <= 0 || y <= 0 || u <= 0 || v <= 0) ezMPEG_SetError(ms, "ezMPEG_Resize: Dimensions must be greater than 0"); if(ms->error_code) return; hor = (float)u / (float)x; ver = (float)v / (float)y; c = y; d = x; if(ver > 1.0) { c = v; } if(hor > 1.0) { d = u; } for(a = 0; a < c; a++) { for(b = 0; b < d; b++) { if(ver > 1.0) { e = a * u; g = (int)((float)a / ver) * x; } else { e = (int)((float)a * ver) * u; g = a * x; } if(hor > 1.0) { f = b; h = (int)((float)b / hor); } else { f = (int)((float)b * hor); h = b; } outbild[e * 3 + f * 3] = inbild[g * 3 + h * 3]; outbild[e * 3 + f * 3 + 1] = inbild[g * 3 + h * 3 + 1]; outbild[e * 3 + f * 3 + 2] = inbild[g * 3 + h * 3 + 2]; } } return; } saods9/tkmpeg1.0/ezmpeg.h000644 000765 000000 00000004663 10035565556 015555 0ustar00joyewheel000000 000000 //This file is part of ezMPEG //Copyright (C)2002 Ingo Oppermann ( ingo_opp@users.sourceforge.net / http://sourceforge.net/projects/ezmpeg/ ) // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either //version 2 of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // Version 0.1 typedef struct ezMPEGStream { char *outfile; FILE *out; int hsize; int vsize; int picture_rate; int gop_size; int dc_prev[3]; double q_scale; int picture_count; int buffersize; int buffercount; char *buffer; int buf; int pos; short error_code; char error_msg[256]; } ezMPEGStream; typedef struct Block { float a[64]; } Block; typedef struct Macroblock { Block lum[4]; Block chrom[2]; } Macroblock; // Prototypes // 'sichtbare' Funktionen. Nur diese 5 Funktionen werden direkt benutzt int ezMPEG_Init(ezMPEGStream *ms, const char *outfile, int hsize, int vsize, int picture_rate, int gop_size, int q_scale); int ezMPEG_Start(ezMPEGStream *ms); int ezMPEG_Add(ezMPEGStream *ms, unsigned char *picture); int ezMPEG_Finalize(ezMPEGStream *ms); void ezMPEG_Resize(ezMPEGStream *ms, unsigned char *outbild, unsigned char *inbild, int x, int y, int u, int v); char *ezMPEG_GetLastError(ezMPEGStream *ms); // 'unsichtbare' Funktionen void ezMPEG_InitBitBuffer(ezMPEGStream *ms); void ezMPEG_ByteAlign(ezMPEGStream *ms); int ezMPEG_WriteBits(ezMPEGStream *ms, unsigned int value, int length); void ezMPEG_WriteSequenceHeader(ezMPEGStream *ms); void ezMPEG_WriteGOPHeader(ezMPEGStream *ms); void ezMPEG_WritePictureHeader(ezMPEGStream *ms); Macroblock ezMPEG_GetMacroblock(ezMPEGStream *ms, unsigned char *picture, int number); Macroblock ezMPEG_QuantizeMacroblock(ezMPEGStream *ms, Macroblock mb); void ezMPEG_WriteMacroblock(ezMPEGStream *ms, Macroblock mb); float ezMPEG_1DFDCT(float *v, int i); void ezMPEG_EncodeDC(ezMPEGStream *ms, int dc_diff, int type); void ezMPEG_EncodeAC(ezMPEGStream *ms, int runlength, int level); void ezMPEG_FlushBuffer(ezMPEGStream *ms); void ezMPEG_SetError(ezMPEGStream *ms, const char *error_msg); saods9/tkmpeg1.0/Makefile.in000755 000765 000000 00000040251 12562730524 016152 0ustar00joyewheel000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL_OPTIONS = INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS} INSTALL_DATA_DIR = ${INSTALL} -d -m 755 INSTALL_PROGRAM = ${INSTALL} -m 555 INSTALL_DATA = ${INSTALL} -m 444 INSTALL_SCRIPT = ${INSTALL_PROGRAM} INSTALL_LIBRARY = ${INSTALL} -m 644 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ #TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ #TK_BIN_DIR = @TK_BIN_DIR@ #TK_SRC_DIR = @TK_SRC_DIR@ # Not used, but retained for reference of what libs Tcl required #TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) #EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) TCLLIBPATH = $(top_builddir) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(TCLLIBPATH)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG) #WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` #WISH_PROG = @WISH_PROG@ #WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG) SHARED_BUILD = @SHARED_BUILD@ #INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) DEFS = @DEFS@ $(PKG_CFLAGS) # Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl CLEANFILES = @CLEANFILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) .SUFFIXES: .c .C .$(OBJEXT) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target includes executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries #doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) libraries: #======================================================================== # Your doc target should differentiate from doc builds (by the developer) # and doc installs (see install-doc), which just install the docs on the # end user machine when building from source. #======================================================================== doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries #install-doc install-binaries: binaries install-lib-binaries install-bin-binaries #======================================================================== # This rule installs platform-independent files, such as header files. # The list=...; for p in $$list handles the empty list case x-platform. #======================================================================== install-libraries: libraries @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @list='$(PKG_HEADERS)'; for i in $$list; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann @echo "Installing documentation in $(DESTDIR)$(mandir)" @list='$(srcdir)/doc/*.n'; for i in $$list; do \ echo "Installing $$i"; \ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]" shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \ --leak-check=yes --show-reachable=yes -v valgrind: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) valgrindshell: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ .C.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean $(INSTALL_DATA_DIR) $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in for i in $(srcdir)/*.[ch]; do \ if [ -f $$i ]; then \ cp -p $$i $(DIST_DIR)/ ; \ fi; \ done; $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done @if test "x$(SHARED_BUILD)" = "x1"; then \ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # 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: saods9/tkmpeg1.0/pkgIndex.tcl.in000755 000765 000000 00000000220 12535332216 016753 0ustar00joyewheel000000 000000 # # Tcl package index file # package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] saods9/tkmpeg1.0/tclconfig/000755 000765 000000 00000000000 12634602251 016043 5ustar00joyewheel000000 000000 saods9/tkmpeg1.0/tkmpeg.C000644 000765 000000 00000010431 12547267111 015472 0ustar00joyewheel000000 000000 // Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include #include using namespace std; #include #include #include "tkmpeg.h" extern "C" { int Tkmpeg_Init(Tcl_Interp* interp); int TkmpegCmd(ClientData data, Tcl_Interp *interp, int argc, const char* argv[]); } TkMPEG* tkmpeg=NULL; int Tkmpeg_Init(Tcl_Interp* interp) { if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; if (Tk_InitStubs(interp, TK_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; Tcl_CreateCommand(interp, "mpeg", TkmpegCmd, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) return TCL_ERROR; tkmpeg = new TkMPEG(interp); if (tkmpeg) return TCL_OK; else return TCL_ERROR; } int TkmpegCmd(ClientData data,Tcl_Interp *interp,int argc,const char* argv[]) { if (argc>=2) { if (!strncmp(argv[1], "create", 3)) return tkmpeg->create(argc, argv); else if (!strncmp(argv[1], "add", 3)) return tkmpeg->add(argc, argv); else if (!strncmp(argv[1], "close", 3)) return tkmpeg->close(argc, argv); else { Tcl_AppendResult(interp, "tkmpeg: unknown command: ", argv[1], NULL); return TCL_ERROR; } } else { Tcl_AppendResult(interp, "usage: tkmpeg ?create?close?add?", NULL); return TCL_ERROR; } } TkMPEG::TkMPEG(Tcl_Interp* intp) { interp = intp; width = 512; height = 512; quality = 2; } int TkMPEG::create(int argc, const char* argv[]) { if (argc == 8) { if (argv[2] == '\0') { Tcl_AppendResult(interp, "bad filename", NULL); return TCL_ERROR; } { string s(argv[3]); istringstream str(s); str >> width; } { string s(argv[4]); istringstream str(s); str >> height; } { string s(argv[5]); istringstream str(s); str >> fps; } { string s(argv[6]); istringstream str(s); str >> gop; } { string s(argv[7]); istringstream str(s); str >> quality; } // width and height must be a multiple of 16 int ww = int(width/16.+1)*16; int hh = int(height/16.+1)*16; if(!ezMPEG_Init(&ms, argv[2], ww, hh, fps, gop, quality)) { Tcl_AppendResult(interp, "ezMPEG_Init ", ezMPEG_GetLastError(&ms), NULL); return TCL_ERROR; } if(!ezMPEG_Start(&ms)) { Tcl_AppendResult(interp, "ezMPEG_Start ", ezMPEG_GetLastError(&ms),NULL); return TCL_ERROR; } } else { Tcl_AppendResult(interp, "usage: tkmpeg create ", NULL); return TCL_ERROR; } return TCL_OK; } int TkMPEG::add(int argc, const char* argv[]) { if (argv[2] == '\0') { Tcl_AppendResult(interp, "bad image name", NULL); return TCL_ERROR; } Tk_PhotoHandle photo = Tk_FindPhoto(interp, argv[2]); if (!photo) { Tcl_AppendResult(interp, "bad image handle", NULL); return TCL_ERROR; } Tk_PhotoImageBlock block; if (!Tk_PhotoGetImage(photo,&block)) { Tcl_AppendResult(interp, "bad image block", NULL); return TCL_ERROR; } int ww = ms.hsize*16; int hh = ms.vsize*16; unsigned char* pict = new unsigned char[ww*hh*3]; if (!pict) { Tcl_AppendResult(interp, "unable to alloc memory", NULL); return TCL_ERROR; } memset(pict,0,ww*hh*3); unsigned char* src = block.pixelPtr; unsigned char* dst = pict; for (int jj=0; jj * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C://AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 * tcl.m4: Added FreeBSD clause. 2001-01-03 * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. saods9/tkmpeg1.0/tclconfig/install-sh000755 000765 000000 00000033054 12257355167 020070 0ustar00joyewheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: saods9/tkmpeg1.0/tclconfig/README.txt000644 000765 000000 00000001454 12257355167 017561 0ustar00joyewheel000000 000000 These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. saods9/tkmpeg1.0/tclconfig/tcl.m4000644 000765 000000 00000404642 12562730524 017106 0ustar00joyewheel000000 000000 # tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include ], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include ], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include #include int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include #include int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include #include ], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include ], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include ], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include ], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include ], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include ], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include #include ],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include ],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include ],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tclPort.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tkPort.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: saods9/tkmpeg1.0/doc/license-GER.txt000644 000765 000000 00000043741 10036567764 017464 0ustar00joyewheel000000 000000 GNU General Public License Deutsche bersetzung der Version 2, Juni 1991 Copyright 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA Diese bersetzung ist kein rechtskrftiger Ersatz fr die englischsprachige Originalversion! Vorwort Die meisten Softwarelizenzen sind daraufhin entworfen worden, Ihnen die Freiheit zu nehmen, die Software weiterzugeben und zu verndern. Im Gegensatz dazu soll Ihnen die GNU General Public License , die Allgemeine ffentliche GNU-Lizenz, ebendiese Freiheit garantieren. Sie soll sicherstellen, da die Software fr alle Benutzer frei ist. Diese Lizenz gilt fr den Groteil der von der Free Software Foundation herausgegebenen Software und fr alle anderen Programme, deren Autoren ihr Datenwerk dieser Lizenz unterstellt haben. Auch Sie knnen diese Mglichkeit der Lizenzierung fr Ihre Programme anwenden. (Ein anderer Teil der Software der Free Software Foundation unterliegt stattdessen der GNU Library General Public License , der Allgemeinen ffentlichen GNU-Lizenz fr Bibliotheken.) [Mittlerweile wurde die GNU Library Public License von der GNU Lesser Public License abgelst - Anmerkung des bersetzers.] Die Bezeichnung ,,freie`` Software bezieht sich auf Freiheit, nicht auf den Preis. Unsere Lizenzen sollen Ihnen die Freiheit garantieren, Kopien freier Software zu verbreiten (und etwas fr diesen Service zu berechnen, wenn Sie mchten), die Mglichkeit, die Software im Quelltext zu erhalten oder den Quelltext auf Wunsch zu bekommen. Die Lizenzen sollen garantieren, da Sie die Software ndern oder Teile davon in neuen freien Programmen verwenden drfen - und da Sie wissen, da Sie dies alles tun drfen. Um Ihre Rechte zu schtzen, mssen wir Einschrnkungen machen, die es jedem verbieten, Ihnen diese Rechte zu verweigern oder Sie aufzufordern, auf diese Rechte zu verzichten. Aus diesen Einschrnkungen folgen bestimmte Verantwortlichkeiten fr Sie, wenn Sie Kopien der Software verbreiten oder sie verndern. Beispielsweise mssen Sie den Empfngern alle Rechte gewhren, die Sie selbst haben, wenn Sie - kostenlos oder gegen Bezahlung - Kopien eines solchen Programms verbreiten. Sie mssen sicherstellen, da auch die Empfnger den Quelltext erhalten bzw. erhalten knnen. Und Sie mssen ihnen diese Bedingungen zeigen, damit sie ihre Rechte kennen. Wir schtzen Ihre Rechte in zwei Schritten: (1) Wir stellen die Software unter ein Urheberrecht (Copyright), und (2) wir bieten Ihnen diese Lizenz an, die Ihnen das Recht gibt, die Software zu vervielfltigen, zu verbreiten und/oder zu verndern. Um die Autoren und uns zu schtzen, wollen wir darberhinaus sicherstellen, da jeder erfhrt, da fr diese freie Software keinerlei Garantie besteht. Wenn die Software von jemand anderem modifiziert und weitergegeben wird, mchten wir, da die Empfnger wissen, da sie nicht das Original erhalten haben, damit irgendwelche von anderen verursachte Probleme nicht den Ruf des ursprnglichen Autors schdigen. Schlielich und endlich ist jedes freie Programm permanent durch Software-Patente bedroht. Wir mchten die Gefahr ausschlieen, da Distributoren eines freien Programms individuell Patente lizensieren - mit dem Ergebnis, da das Programm proprietr wrde. Um dies zu verhindern, haben wir klargestellt, da jedes Patent entweder fr freie Benutzung durch jedermann lizenziert werden mu oder berhaupt nicht lizenziert werden darf. Es folgen die genauen Bedingungen fr die Vervielfltigung, Verbreitung und Bearbeitung: Allgemeine ffentliche GNU-Lizenz Bedingungen fr die Vervielfltigung, Verbreitung und Bearbeitung 0. Diese Lizenz gilt fr jedes Programm und jedes andere Datenwerk, in dem ein entsprechender Vermerk des Copyright-Inhabers darauf hinweist, da das Datenwerk unter den Bestimmungen dieser General Public License verbreitet werden darf. Im folgenden wird jedes derartige Programm oder Datenwerk als ,,das Programm`` bezeichnet; die Formulierung ,,auf dem Programm basierendes Datenwerk`` bezeichnet das Programm sowie jegliche Bearbeitung des Programms im urheberrechtlichen Sinne, also ein Datenwerk, welches das Programm, auch auszugsweise, sei es unverndert oder verndert und/oder in eine andere Sprache bersetzt, enthlt. (Im folgenden wird die bersetzung ohne Einschrnkung als ,,Bearbeitung`` eingestuft.) Jeder Lizenznehmer wird im folgenden als ,,Sie`` angesprochen. Andere Handlungen als Vervielfltigung, Verbreitung und Bearbeitung werden von dieser Lizenz nicht berhrt; sie fallen nicht in ihren Anwendungsbereich. Der Vorgang der Ausfhrung des Programms wird nicht eingeschrnkt, und die Ausgaben des Programms unterliegen dieser Lizenz nur, wenn der Inhalt ein auf dem Programm basierendes Datenwerk darstellt (unabhngig davon, da die Ausgabe durch die Ausfhrung des Programmes erfolgte). Ob dies zutrifft, hngt von den Funktionen des Programms ab. 1. Sie drfen auf beliebigen Medien unvernderte Kopien des Quelltextes des Programms, wie sie ihn erhalten haben, anfertigen und verbreiten. Voraussetzung hierfr ist, da Sie mit jeder Kopie einen entsprechenden Copyright-Vermerk sowie einen Haftungsausschlu verffentlichen, alle Vermerke, die sich auf diese Lizenz und das Fehlen einer Garantie beziehen, unverndert lassen und desweiteren allen anderen Empfngern des Programms zusammen mit dem Programm eine Kopie dieser Lizenz zukommen lassen. Sie drfen fr den eigentlichen Kopiervorgang eine Gebhr verlangen. Wenn Sie es wnschen, drfen Sie auch gegen Entgeld eine Garantie fr das Programm anbieten. 2. Sie drfen Ihre Kopie(n) des Programms oder eines Teils davon verndern, wodurch ein auf dem Programm basierendes Datenwerk entsteht; Sie drfen derartige Bearbeitungen unter den Bestimmungen von Paragraph 1 vervielfltigen und verbreiten, vorausgesetzt, da zustzlich alle im folgenden genannten Bedingungen erfllt werden: 1. Sie mssen die vernderten Dateien mit einem aufflligen Vermerk versehen, der auf die von Ihnen vorgenommene Modifizierung und das Datum jeder nderung hinweist. 2. Sie mssen dafr sorgen, da jede von Ihnen verbreitete oder verffentlichte Arbeit, die ganz oder teilweise von dem Programm oder Teilen davon abgeleitet ist, Dritten gegenber als Ganzes unter den Bedingungen dieser Lizenz ohne Lizenzgebhren zur Verfgung gestellt wird. 3. Wenn das vernderte Programm normalerweise bei der Ausfhrung interaktiv Kommandos einliest, mssen Sie dafr sorgen, da es, wenn es auf dem blichsten Wege fr solche interaktive Nutzung gestartet wird, eine Meldung ausgibt oder ausdruckt, die einen geeigneten Copyright-Vermerk enthlt sowie einen Hinweis, da es keine Gewhrleistung gibt (oder anderenfalls, da Sie Garantie leisten), und da die Benutzer das Programm unter diesen Bedingungen weiter verbreiten drfen. Auch mu der Benutzer darauf hingewiesen werden, wie er eine Kopie dieser Lizenz ansehen kann. (Ausnahme: Wenn das Programm selbst interaktiv arbeitet, aber normalerweise keine derartige Meldung ausgibt, mu Ihr auf dem Programm basierendes Datenwerk auch keine solche Meldung ausgeben). Diese Anforderungen gelten fr das bearbeitete Datenwerk als Ganzes. Wenn identifizierbare Teile des Datenwerkes nicht von dem Programm abgeleitet sind und vernnftigerweise als unabhngige und eigenstndige Datenwerke fr sich selbst zu betrachten sind, dann gelten diese Lizenz und ihre Bedingungen nicht fr die betroffenen Teile, wenn Sie diese als eigenstndige Datenwerke weitergeben. Wenn Sie jedoch dieselben Abschnitte als Teil eines Ganzen weitergeben, das ein auf dem Programm basierendes Datenwerk darstellt, dann mu die Weitergabe des Ganzen nach den Bedingungen dieser Lizenz erfolgen, deren Bedingungen fr weitere Lizenznehmer somit auf das gesamte Ganze ausgedehnt werden - und somit auf jeden einzelnen Teil, unabhngig vom jeweiligen Autor. Somit ist es nicht die Absicht dieses Abschnittes, Rechte fr Datenwerke in Anspruch zu nehmen oder Ihnen die Rechte fr Datenwerke streitig zu machen, die komplett von Ihnen geschrieben wurden; vielmehr ist es die Absicht, die Rechte zur Kontrolle der Verbreitung von Datenwerken, die auf dem Programm basieren oder unter seiner auszugsweisen Verwendung zusammengestellt worden sind, auszuben. Ferner bringt auch das einfache Zusammenlegen eines anderen Datenwerkes, das nicht auf dem Programm basiert, mit dem Programm oder einem auf dem Programm basierenden Datenwerk auf ein- und demselben Speicher- oder Vertriebsmedium dieses andere Datenwerk nicht in den Anwendungsbereich dieser Lizenz. 3. Sie drfen das Programm (oder ein darauf basierendes Datenwerk gem Paragraph 2) als Objectcode oder in ausfhrbarer Form unter den Bedingungen der Paragraphen 1 und 2 kopieren und weitergeben - vorausgesetzt, da Sie auerdem eine der folgenden Leistungen erbringen: 1. Liefern Sie das Programm zusammen mit dem vollstndigen zugehrigen maschinenlesbaren Quelltext auf einem fr den Datenaustausch blichen Medium aus, wobei die Verteilung unter den Bedingungen der Paragraphen 1 und 2 erfolgen mu. Oder: 2. Liefern Sie das Programm zusammen mit einem mindestens drei Jahre lang gltigen schriftlichen Angebot aus, jedem Dritten eine vollstndige maschinenlesbare Kopie des Quelltextes zur Verfgung zu stellen - zu nicht hheren Kosten als denen, die durch den physikalischen Kopiervorgang anfallen -, wobei der Quelltext unter den Bedingungen der Paragraphen 1 und 2 auf einem fr den Datenaustausch blichen Medium weitergegeben wird. Oder: 3. Liefern Sie das Programm zusammen mit dem schriftlichen Angebot der Zurverfgungstellung des Quelltextes aus, das Sie selbst erhalten haben. (Diese Alternative ist nur fr nicht-kommerzielle Verbreitung zulssig und nur, wenn Sie das Programm als Objectcode oder in ausfhrbarer Form mit einem entsprechenden Angebot gem Absatz b erhalten haben.) Unter dem Quelltext eines Datenwerkes wird diejenige Form des Datenwerkes verstanden, die fr Bearbeitungen vorzugsweise verwendet wird. Fr ein ausfhrbares Programm bedeutet ,,der komplette Quelltext``: Der Quelltext aller im Programm enthaltenen Module einschlielich aller zugehrigen Modulschnittstellen-Definitionsdateien sowie der zur Compilation und Installation verwendeten Skripte. Als besondere Ausnahme jedoch braucht der verteilte Quelltext nichts von dem zu enthalten, was blicherweise (entweder als Quelltext oder in binrer Form) zusammen mit den Hauptkomponenten des Betriebssystems (Kernel, Compiler usw.) geliefert wird, unter dem das Programm luft - es sei denn, diese Komponente selbst gehrt zum ausfhrbaren Programm. Wenn die Verbreitung eines ausfhrbaren Programms oder von Objectcode dadurch erfolgt, da der Kopierzugriff auf eine dafr vorgesehene Stelle gewhrt wird, so gilt die Gewhrung eines gleichwertigen Zugriffs auf den Quelltext als Verbreitung des Quelltextes, auch wenn Dritte nicht dazu gezwungen sind, den Quelltext zusammen mit dem Objectcode zu kopieren. 4. Sie drfen das Programm nicht vervielfltigen, verndern, weiter lizenzieren oder verbreiten, sofern es nicht durch diese Lizenz ausdrcklich gestattet ist. Jeder anderweitige Versuch der Vervielfltigung, Modifizierung, Weiterlizenzierung und Verbreitung ist nichtig und beendet automatisch Ihre Rechte unter dieser Lizenz. Jedoch werden die Lizenzen Dritter, die von Ihnen Kopien oder Rechte unter dieser Lizenz erhalten haben, nicht beendet, solange diese die Lizenz voll anerkennen und befolgen. 5. Sie sind nicht verpflichtet, diese Lizenz anzunehmen, da Sie sie nicht unterzeichnet haben. Jedoch gibt Ihnen nichts anderes die Erlaubnis, das Programm oder von ihm abgeleitete Datenwerke zu verndern oder zu verbreiten. Diese Handlungen sind gesetzlich verboten, wenn Sie diese Lizenz nicht anerkennen. Indem Sie das Programm (oder ein darauf basierendes Datenwerk) verndern oder verbreiten, erklren Sie Ihr Einverstndnis mit dieser Lizenz und mit allen ihren Bedingungen bezglich der Vervielfltigung, Verbreitung und Vernderung des Programms oder eines darauf basierenden Datenwerks. 6. Jedesmal, wenn Sie das Programm (oder ein auf dem Programm basierendes Datenwerk) weitergeben, erhlt der Empfnger automatisch vom ursprnglichen Lizenzgeber die Lizenz, das Programm entsprechend den hier festgelegten Bestimmungen zu vervielfltigen, zu verbreiten und zu verndern. Sie drfen keine weiteren Einschrnkungen der Durchsetzung der hierin zugestandenen Rechte des Empfngers vornehmen. Sie sind nicht dafr verantwortlich, die Einhaltung dieser Lizenz durch Dritte durchzusetzen. 7. Sollten Ihnen infolge eines Gerichtsurteils, des Vorwurfs einer Patentverletzung oder aus einem anderen Grunde (nicht auf Patentfragen begrenzt) Bedingungen (durch Gerichtsbeschlu, Vergleich oder anderweitig) auferlegt werden, die den Bedingungen dieser Lizenz widersprechen, so befreien Sie diese Umstnde nicht von den Bestimmungen dieser Lizenz. Wenn es Ihnen nicht mglich ist, das Programm unter gleichzeitiger Beachtung der Bedingungen in dieser Lizenz und Ihrer anderweitigen Verpflichtungen zu verbreiten, dann drfen Sie als Folge das Programm berhaupt nicht verbreiten. Wenn zum Beispiel ein Patent nicht die gebhrenfreie Weiterverbreitung des Programms durch diejenigen erlaubt, die das Programm direkt oder indirekt von Ihnen erhalten haben, dann besteht der einzige Weg, sowohl das Patentrecht als auch diese Lizenz zu befolgen, darin, ganz auf die Verbreitung des Programms zu verzichten. Sollte sich ein Teil dieses Paragraphen als ungltig oder unter bestimmten Umstnden nicht durchsetzbar erweisen, so soll dieser Paragraph seinem Sinne nach angewandt werden; im brigen soll dieser Paragraph als Ganzes gelten. Zweck dieses Paragraphen ist nicht, Sie dazu zu bringen, irgendwelche Patente oder andere Eigentumsansprche zu verletzen oder die Gltigkeit solcher Ansprche zu bestreiten; dieser Paragraph hat einzig den Zweck, die Integritt des Verbreitungssystems der freien Software zu schtzen, das durch die Praxis ffentlicher Lizenzen verwirklicht wird. Viele Leute haben grozgige Beitrge zu dem groen Angebot der mit diesem System verbreiteten Software im Vertrauen auf die konsistente Anwendung dieses Systems geleistet; es liegt am Autor/Geber, zu entscheiden, ob er die Software mittels irgendeines anderen Systems verbreiten will; ein Lizenznehmer hat auf diese Entscheidung keinen Einflu. Dieser Paragraph ist dazu gedacht, deutlich klarzustellen, was als Konsequenz aus dem Rest dieser Lizenz betrachtet wird. 8. Wenn die Verbreitung und/oder die Benutzung des Programms in bestimmten Staaten entweder durch Patente oder durch urheberrechtlich geschtzte Schnittstellen eingeschrnkt ist, kann der Urheberrechtsinhaber, der das Programm unter diese Lizenz gestellt hat, eine explizite geographische Begrenzung der Verbreitung angeben, in der diese Staaten ausgeschlossen werden, so da die Verbreitung nur innerhalb und zwischen den Staaten erlaubt ist, die nicht ausgeschlossen sind. In einem solchen Fall beinhaltet diese Lizenz die Beschrnkung, als wre sie in diesem Text niedergeschrieben. 9. Die Free Software Foundation kann von Zeit zu Zeit berarbeitete und/oder neue Versionen der General Public License verffentlichen. Solche neuen Versionen werden vom Grundprinzip her der gegenwrtigen entsprechen, knnen aber im Detail abweichen, um neuen Problemen und Anforderungen gerecht zu werden. Jede Version dieser Lizenz hat eine eindeutige Versionsnummer. Wenn in einem Programm angegeben wird, da es dieser Lizenz in einer bestimmten Versionsnummer oder ,,jeder spteren Version`` (``any later version'') unterliegt, so haben Sie die Wahl, entweder den Bestimmungen der genannten Version zu folgen oder denen jeder beliebigen spteren Version, die von der Free Software Foundation verffentlicht wurde. Wenn das Programm keine Versionsnummer angibt, knnen Sie eine beliebige Version whlen, die je von der Free Software Foundation verffentlicht wurde. 10. Wenn Sie den Wunsch haben, Teile des Programms in anderen freien Programmen zu verwenden, deren Bedingungen fr die Verbreitung anders sind, schreiben Sie an den Autor, um ihn um die Erlaubnis zu bitten. Fr Software, die unter dem Copyright der Free Software Foundation steht, schreiben Sie an die Free Software Foundation ; wir machen zu diesem Zweck gelegentlich Ausnahmen. Unsere Entscheidung wird von den beiden Zielen geleitet werden, zum einen den freien Status aller von unserer freien Software abgeleiteten Datenwerke zu erhalten und zum anderen das gemeinschaftliche Nutzen und Wiederverwenden von Software im allgemeinen zu frdern. Keine Gewhrleistung 11. Da das Programm ohne jegliche Kosten lizenziert wird, besteht keinerlei Gewhrleistung fr das Programm, soweit dies gesetzlich zulssig ist. Sofern nicht anderweitig schriftlich besttigt, stellen die Copyright-Inhaber und/oder Dritte das Programm so zur Verfgung, ,,wie es ist``, ohne irgendeine Gewhrleistung, weder ausdrcklich noch implizit, einschlielich - aber nicht begrenzt auf - Marktreife oder Verwendbarkeit fr einen bestimmten Zweck. Das volle Risiko bezglich Qualitt und Leistungsfhigkeit des Programms liegt bei Ihnen. Sollte sich das Programm als fehlerhaft herausstellen, liegen die Kosten fr notwendigen Service, Reparatur oder Korrektur bei Ihnen. 12. In keinem Fall, auer wenn durch geltendes Recht gefordert oder schriftlich zugesichert, ist irgendein Copyright-Inhaber oder irgendein Dritter, der das Programm wie oben erlaubt modifiziert oder verbreitet hat, Ihnen gegenber fr irgendwelche Schden haftbar, einschlielich jeglicher allgemeiner oder spezieller Schden, Schden durch Seiteneffekte (Nebenwirkungen) oder Folgeschden, die aus der Benutzung des Programms oder der Unbenutzbarkeit des Programms folgen (einschlielich - aber nicht beschrnkt auf - Datenverluste, fehlerhafte Verarbeitung von Daten, Verluste, die von Ihnen oder anderen getragen werden mssen, oder dem Unvermgen des Programms, mit irgendeinem anderen Programm zusammenzuarbeiten), selbst wenn ein Copyright-Inhaber oder Dritter ber die Mglichkeit solcher Schden unterrichtet worden war. Ende der Bedingungen saods9/tkmpeg1.0/doc/license.txt000644 000765 000000 00000035173 10036567765 017052 0ustar00joyewheel000000 000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS saods9/tkmpeg1.0/doc/readme.txt000644 000765 000000 00000002336 10036567765 016660 0ustar00joyewheel000000 000000 ezMPEG Copyright (C)2002 Ingo Oppermann (ingo_opp@users.sourceforge.net) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ----------------------------------------------------------------------------- Welcome to ezMPEG http://sourceforge.net/projects/ezmpeg ezMPEG is an easy-to-use and easy-to-understand MPEG1 video encoder API The documentation of the API is still in development and incomplete. It can be found in 'doc/ezmpeg.txt' To use the API just include 'ezmpeg.h' in your files and compile with gcc yourfile.c ezmpeg.c -o yourfile -lm You are free to use any other C compiler than gccsaods9/tkhtml1.0/aclocal.m4000755 000765 000000 00000000223 12546552047 015760 0ustar00joyewheel000000 000000 # # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # saods9/tkhtml1.0/configure000755 000765 000000 00001101346 12547026610 016026 0ustar00joyewheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tkhtml 1.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tkhtml' PACKAGE_TARNAME='tkhtml' PACKAGE_VERSION='1.0' PACKAGE_STRING='tkhtml 1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS WISH_PROG TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS XMKMF TK_INCLUDES TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tk with_tclinclude with_tkinclude with_x enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tkhtml 1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tkhtml] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tkhtml 1.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-tkinclude directory containing the public Tk header files --with-x use the X Window System --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tkhtml configure 1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tkhtml $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars=" src/htmlcmd.c src/htmldraw.c src/htmlform.c src/htmlimage.c src/htmlindex.c src/htmllayout.c src/htmlparse.c src/htmlsizer.c src/htmltable.c src/htmltest.c src/htmlurl.c src/htmlwidget.c src/htmlexts.c src/htmltokens.c " for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir # i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="-I./src" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS -DUSE_INTERP_RESULT" vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- CLEANFILES="$CLEANFILES src/makeheaders" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi #TEA_PRIVATE_TK_HEADERS if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else not_really_there="yes" fi rm -f conftest.err conftest.i conftest.$ac_ext else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } found_xincludes="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : found_xincludes="yes" else found_xincludes="no" fi rm -f conftest.err conftest.i conftest.$ac_ext if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: couldn't find any!" >&5 $as_echo "couldn't find any!" >&6; } fi if test "$no_x" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 libraries" >&5 $as_echo_n "checking for X11 libraries... " >&6; } XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCreateWindow in -lXwindow" >&5 $as_echo_n "checking for XCreateWindow in -lXwindow... " >&6; } if ${ac_cv_lib_Xwindow_XCreateWindow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXwindow $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XCreateWindow (); int main () { return XCreateWindow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xwindow_XCreateWindow=yes else ac_cv_lib_Xwindow_XCreateWindow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xwindow_XCreateWindow" >&5 $as_echo "$ac_cv_lib_Xwindow_XCreateWindow" >&6; } if test "x$ac_cv_lib_Xwindow_XCreateWindow" = xyes; then : XLIBSW=-lXwindow fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find any! Using -lX11." >&5 $as_echo "could not find any! Using -lX11." >&6; } XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi fi #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h $as_echo "#define USE_TK_STUBS 1" >>confdefs.h #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wish" >&5 $as_echo_n "checking for wish... " >&6; } if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${WISH_PROG}" >&5 $as_echo "${WISH_PROG}" >&6; } #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tkhtml $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tkhtml config.status 1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi saods9/tkhtml1.0/configure.in000755 000765 000000 00000017103 12547026610 016427 0ustar00joyewheel000000 000000 #!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_ # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([tkhtml], [1.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([ src/htmlcmd.c src/htmldraw.c src/htmlform.c src/htmlimage.c src/htmlindex.c src/htmllayout.c src/htmlparse.c src/htmlsizer.c src/htmltable.c src/htmltest.c src/htmlurl.c src/htmlwidget.c src/htmlexts.c src/htmltokens.c ]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([-I./src]) TEA_ADD_LIBS([]) TEA_ADD_CFLAGS([-DUSE_INTERP_RESULT]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- CLEANFILES="$CLEANFILES src/makeheaders" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- TEA_PROG_TCLSH TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile pkgIndex.tcl]) saods9/tkhtml1.0/doc/000755 000765 000000 00000000000 12634602245 014657 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/Makefile.in000755 000765 000000 00000041301 12547027253 016164 0ustar00joyewheel000000 000000 # Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL_OPTIONS = INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS} INSTALL_DATA_DIR = ${INSTALL} -d -m 755 INSTALL_PROGRAM = ${INSTALL} -m 555 INSTALL_DATA = ${INSTALL} -m 444 INSTALL_SCRIPT = ${INSTALL_PROGRAM} INSTALL_LIBRARY = ${INSTALL} -m 644 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ #TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ #TK_BIN_DIR = @TK_BIN_DIR@ #TK_SRC_DIR = @TK_SRC_DIR@ # Not used, but retained for reference of what libs Tcl required #TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) #EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) TCLLIBPATH = $(top_builddir) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(TCLLIBPATH)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG) #WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` #WISH_PROG = @WISH_PROG@ #WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG) SHARED_BUILD = @SHARED_BUILD@ #INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) DEFS = @DEFS@ $(PKG_CFLAGS) # Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl CLEANFILES = @CLEANFILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) .SUFFIXES: .c .$(OBJEXT) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target includes executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries #doc headers: src/makeheaders src/htmltokens.c cd src; \ ./makeheaders htmlcmd.c:htmlcmd.h htmldraw.c:htmldraw.h htmlform.c:htmlform.h htmlimage.c:htmlimage.h htmlindex.c:htmlindex.h htmllayout.c:htmllayout.h htmlparse.c:htmlparse.h htmlsizer.c:htmlsizer.h htmltable.c:htmltable.h htmltest.c:htmltest.h htmlurl.c:htmlurl.h htmlwidget.c:htmlwidget.h htmlexts.c:htmlexts.h htmltokens.c html.h src/makeheaders: tools/makeheaders.c $(COMPILE) $< -o $@ src/htmltokens.c: src/tokenlist.txt tools/maketokens.tcl $(TCLSH) tools/maketokens.tcl src/tokenlist.txt > src/htmltokens.c #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) libraries: #======================================================================== # Your doc target should differentiate from doc builds (by the developer) # and doc installs (see install-doc), which just install the docs on the # end user machine when building from source. #======================================================================== doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries #install-doc install-binaries: binaries install-lib-binaries install-bin-binaries #======================================================================== # This rule installs platform-independent files, such as header files. # The list=...; for p in $$list handles the empty list case x-platform. #======================================================================== install-libraries: libraries @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @list='$(PKG_HEADERS)'; for i in $$list; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann @echo "Installing documentation in $(DESTDIR)$(mandir)" @list='$(srcdir)/doc/*.n'; for i in $$list; do \ echo "Installing $$i"; \ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]" shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \ --leak-check=yes --show-reachable=yes -v valgrind: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) valgrindshell: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean $(INSTALL_DATA_DIR) $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in for i in $(srcdir)/*.[ch]; do \ if [ -f $$i ]; then \ cp -p $$i $(DIST_DIR)/ ; \ fi; \ done; $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f $(PKG_OBJECTS) *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done @if test "x$(SHARED_BUILD)" = "x1"; then \ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # 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: saods9/tkhtml1.0/pkgIndex.tcl.in000755 000765 000000 00000000220 12546552047 016777 0ustar00joyewheel000000 000000 # # Tcl package index file # package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] saods9/tkhtml1.0/src/000755 000765 000000 00000000000 12634602245 014701 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/tclconfig/000755 000765 000000 00000000000 12634602245 016062 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/tests/000755 000765 000000 00000000000 12634602245 015254 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/tools/000755 000765 000000 00000000000 12634602245 015252 5ustar00joyewheel000000 000000 saods9/tkhtml1.0/tools/getpage.c000644 000765 000000 00000010045 07504443354 017036 0ustar00joyewheel000000 000000 /* ** This is a simple program used to retrieve an HTML document using ** HTTP. The program also fetches all images that the document ** references. */ #include #include #include "getpage.h" #define stricmp strcasecmp /* ** Each image to be loaded is an instance of the following structure. */ typedef struct Image Image; struct Image { char *zUrl; /* The URL for this image */ char *zLocal; /* The local filename */ Image *pNext; /* Next in a list of them all */ }; static FILE *html; /* Html output to this file. */ static int nImage = 0; /* Number of images loaded so far */ static Image *pImage; /* List of all images */ static global_nErr = 0; /* System wide errors */ static char baseUrl[1000];/* The base URL */ static int quiet = 0; /* The quiet flag */ /* ** Make sure the given URL is loaded as a local file. Return the ** name of the local file. */ static char *GetImage(char *zUrl){ Image *p; for(p=pImage; p; p=p->pNext){ if( strcmp(p->zUrl,zUrl)==0 ){ return p->zLocal; } } p = malloc( sizeof(*p) + strlen(zUrl) + 100 ); p->zUrl = (char*)&p[1]; strcpy(p->zUrl, zUrl); p->zLocal = &p->zUrl[strlen(zUrl)+1]; sprintf(p->zLocal,"image%d", ++nImage); p->pNext = pImage; pImage = p; HttpFetch(zUrl, p->zLocal, quiet, 0, 0); return p->zLocal; } /* ** Print a usage comment and exit */ void usage(char *argv0){ fprintf(stderr,"Usage: %s URL\n",argv0); exit(1); } /* ** Handle anything that isn't markup */ static void WordHandler(const char *zText, void *notUsed){ fprintf(html, zText); } /* ** Handle all markup that we don't care about. */ static void DefaultMarkup(int argc, const char **argv, void *notUsed){ int i; fprintf(html,"<%s",argv[0]); for(i=1; i"); } /* ** Handler for markup */ static void ImageMarkup(int argc, const char **argv, void *notUsed){ int i; for(i=1; i (%s)\n",baseUrl, azUrl[0], zResolved); } argv[i+1] = GetImage(zResolved); /* printf("%s -> %s -> argv[i+1]\n",argv[i+1], zResolved); */ free(zResolved); } } DefaultMarkup(argc, argv, 0); } /* ** Handler for markup */ static void BaseMarkup(int argc, const char **argv, void *notUsed){ int i; for(i=1; i #include #include #include #include #include "httpget.h" #define strnicmp strncasecmp /* ** Get a URL using HTTP. Return the result code. If a Location: field ** appears in the header, write it into zLocation[]. Location[] should ** be at least 200 characters in size. */ static int HttpTryOnce(char *zUrl, char *zLocalFile, int quiet, char *zLocation){ int i, j; int nErr = 0; /* Number of errors */ char *zPath; /* Pathname to send as second argument to GET */ int iPort; /* TCP port for the server */ struct hostent *pHost; /* Name information */ int s; /* The main communications socket */ int c; /* A character read from the remote side */ int n; /* Number of characters in header */ int rc = 200; /* The result code */ FILE *sock; /* FILE corresponding to file descriptor s */ FILE *out; /* Write output here */ int last_was_nl; /* TRUE if last character received was '\n' */ struct sockaddr_in addr; /* The address structure */ int nByte = 0; char zIpAddr[400]; /* The IP address of the server to print */ char zMsg[1000]; /* Space to hold error messages */ char zLine[1000]; /* A single line of the header */ out = fopen(zLocalFile, "w"); if( out==0 ){ sprintf(zMsg, "can't open output fule \"%.100s\"", zLocalFile); perror(zMsg); return 1; } i = 0; if( strnicmp(zUrl,"http:",5)==0 ){ i = 5; } while( zUrl[i]=='/' ){ i++; } j = 0; while( zUrl[i] && zUrl[i]!=':' && zUrl[i]!='/' ){ if( jh_addr_list[0],pHost->h_length); if( !quiet ){ fprintf(stderr,"Address resolution: %s -> %d.%d.%d.%d\n",zIpAddr, pHost->h_addr_list[0][0]&0xff, pHost->h_addr_list[0][1]&0xff, pHost->h_addr_list[0][2]&0xff, pHost->h_addr_list[0][3]&0xff); } } s = socket(AF_INET,SOCK_STREAM,0); if( s<0 ){ sprintf(zMsg,"can't open socket to %.100s", zIpAddr); perror(zMsg); fclose(out); return 1; } if( connect(s,(struct sockaddr*)&addr,sizeof(addr))<0 ){ sprintf(zMsg,"can't connect to host %.100s", zIpAddr); perror(zMsg); fclose(out); return 1; } sock = fdopen(s,"r+"); if( *zPath==0 ) zPath = "/"; fprintf(sock,"GET %s HTTP/1.0\r\n",zPath); fprintf(sock,"User-Agent: Mozilla/2.0 (X11; U; Linux 0.99p17 i486)\r\n"); if( iPort!=80 ){ fprintf(sock,"Host: %s:%d\r\n", zIpAddr, iPort); }else{ fprintf(sock,"Host: %s\r\n", zIpAddr); } fprintf(sock,"Accept: image/gif, image/x-xbitmap, image/jpeg, */*\r\n"); fprintf(sock,"\r\n"); fflush(sock); n = 0; rc = 0; while( (c=getc(sock))!=EOF && (c!='\n' || !last_was_nl) ){ if( c=='\r' ) continue; last_was_nl = (c=='\n'); if( last_was_nl ){ zLine[n] = 0; if( strncmp(zLine,"Location:",9)==0 && zLocation ){ int j, k; for(j=9; isspace(zLine[j]); j++){} k = 0; while( zLine[j] && !isspace(zLine[j]) && k<199 ){ zLocation[k++] = zLine[j++]; } zLocation[k] = 0; if( !quiet ) fprintf(stderr,"Location: %s\n", zLocation); }else if( rc==0 ){ sscanf(zLine,"HTTP/%*d.%*d %d ",&rc); if( !quiet ) fprintf(stderr,"Status: %d\n", rc); } } if( n %s\n", zUrl, zLocalFile); rc = HttpTryOnce(zUrl, zLocalFile, quiet, zLocation); if( rc==301 || rc==302 ){ char *z; const char *az[2]; az[0] = zLocation; az[1] = 0; z = ResolveUrl(zUrl, az); if( zUrl!=zOriginalUrl ){ free(zUrl); } zUrl = z; }else{ break; } } if( nActual>0 && zActual!=0 ){ sprintf(zActual, "%.*s", nActual, zUrl); } if( zUrl!=zOriginalUrl ){ free(zUrl); } return rc; } saods9/tkhtml1.0/tools/makeheaders.c000644 000765 000000 00000261113 12547267112 017676 0ustar00joyewheel000000 000000 /* ** This program scans C and C++ source files and automatically generates ** appropriate header files. ** %Z% %P% %I% %G% %Z% */ #include #include #include #include #include #include #ifndef WIN32 # include #else # include #endif /* ** Macros for debugging. */ #ifdef DEBUG static int debugMask = 0; # define debug0(F,M) if( (F)&debugMask ){ fprintf(stderr,M); } # define debug1(F,M,A) if( (F)&debugMask ){ fprintf(stderr,M,A); } # define debug2(F,M,A,B) if( (F)&debugMask ){ fprintf(stderr,M,A,B); } # define debug3(F,M,A,B,C) if( (F)&debugMask ){ fprintf(stderr,M,A,B,C); } # define PARSER 0x00000001 # define DECL_DUMP 0x00000002 # define TOKENIZER 0x00000004 #else # define debug0(Flags, Format) # define debug1(Flags, Format, A) # define debug2(Flags, Format, A, B) # define debug3(Flags, Format, A, B, C) #endif /* ** The following macros are purely for the purpose of testing this ** program on itself. They don't really contribute to the code. */ #define INTERFACE 1 #define EXPORT_INTERFACE 1 #define EXPORT /* ** Each token in a source file is represented by an instance of ** the following structure. Tokens are collected onto a list. */ typedef struct Token Token; struct Token { const char *zText; /* The text of the token */ int nText; /* Number of characters in the token's text */ int eType; /* The type of this token */ int nLine; /* The line number on which the token starts */ Token *pComment; /* Most recent block comment before this token */ Token *pNext; /* Next token on the list */ Token *pPrev; /* Previous token on the list */ }; /* ** During tokenization, information about the state of the input ** stream is held in an instance of the following structure */ typedef struct InStream InStream; struct InStream { const char *z; /* Complete text of the input */ int i; /* Next character to read from the input */ int nLine; /* The line number for character z[i] */ }; /* ** Each declaration in the C or C++ source files is parsed out and stored as ** an instance of the following structure. ** ** A "forward declaration" is a declaration that an object exists that ** doesn't tell about the objects structure. A typical forward declaration ** is: ** ** struct Xyzzy; ** ** Not every object has a forward declaration. If it does, thought, the ** forward declaration will be contained in the zFwd field for C and ** the zFwdCpp for C++. The zDecl field contains the complete ** declaration text. */ typedef struct Decl Decl; struct Decl { char *zName; /* Name of the object being declared. The appearance ** of this name is a source file triggers the declaration ** to be added to the header for that file. */ char *zFile; /* File from which extracted. */ char *zIf; /* Surround the declaration with this #if */ char *zFwd; /* A forward declaration. NULL if there is none. */ char *zFwdCpp; /* Use this forward declaration for C++. */ char *zDecl; /* A full declaration of this object */ struct Include *pInclude; /* #includes that come before this declaration */ int flags; /* See the "Properties" below */ Token *pComment; /* A block comment associated with this declaration */ Token tokenCode; /* Implementation of functions and procedures */ Decl *pSameName; /* Next declaration with the same "zName" */ Decl *pSameHash; /* Next declaration with same hash but different zName */ Decl *pNext; /* Next declaration with a different name */ }; /* ** Properties associated with declarations. ** ** DP_Forward and DP_Declared are used during the generation of a single ** header file in order to prevent duplicate declarations and definitions. ** DP_Forward is set after the object has been given a forward declaration ** and DP_Declared is set after the object gets a full declarations. ** (Example: A forward declaration is "typedef struct Abc Abc;" and the ** full declaration is "struct Abc { int a; float b; };".) ** ** The DP_Export and DP_Local flags are more permanent. They mark objects ** that have EXPORT scope and LOCAL scope respectively. If both of these ** marks are missing, then the object has library scope. The meanings of ** the scopes are as follows: ** ** LOCAL scope The object is only usable within the file in ** which it is declared. ** ** library scope The object is visible and usable within other ** files in the same project. By if the project is ** a library, then the object is not visible to users ** of the library. (i.e. the object does not appear ** in the output when using the -H option.) ** ** EXPORT scope The object is visible and usable everywhere. ** ** The DP_Flag is a temporary use flag that is used during processing to ** prevent an infinite loop. It's use is localized. ** ** The DP_Cplusplus, DP_ExternCReqd and DP_ExternReqd flags are permanent ** and are used to specify what type of declaration the object requires. */ #define DP_Forward 0x001 /* Has a forward declaration in this file */ #define DP_Declared 0x002 /* Has a full declaration in this file */ #define DP_Export 0x004 /* Export this declaration */ #define DP_Local 0x008 /* Declare in its home file only */ #define DP_Flag 0x010 /* Use to mark a subset of a Decl list ** for special processing */ #define DP_Cplusplus 0x020 /* Has C++ linkage and cannot appear in a ** C header file */ #define DP_ExternCReqd 0x040 /* Prepend 'extern "C"' in a C++ header. ** Prepend nothing in a C header */ #define DP_ExternReqd 0x080 /* Prepend 'extern "C"' in a C++ header if ** DP_Cplusplus is not also set. If DP_Cplusplus ** is set or this is a C header then ** prepend 'extern' */ /* ** Convenience macros for dealing with declaration properties */ #define DeclHasProperty(D,P) (((D)->flags&(P))==(P)) #define DeclHasAnyProperty(D,P) (((D)->flags&(P))!=0) #define DeclSetProperty(D,P) (D)->flags |= (P) #define DeclClearProperty(D,P) (D)->flags &= ~(P) /* ** These are state properties of the parser. Each of the values is ** distinct from the DP_ values above so that both can be used in ** the same "flags" field. ** ** Be careful not to confuse PS_Export with DP_Export or ** PS_Local with DP_Local. Their names are similar, but the meanings ** of these flags are very different. */ #define PS_Extern 0x000800 /* "extern" has been seen */ #define PS_Export 0x001000 /* If between "#if EXPORT_INTERFACE" ** and "#endif" */ #define PS_Export2 0x002000 /* If "EXPORT" seen */ #define PS_Typedef 0x004000 /* If "typedef" has been seen */ #define PS_Static 0x008000 /* If "static" has been seen */ #define PS_Interface 0x010000 /* If within #if INTERFACE..#endif */ #define PS_Method 0x020000 /* If "::" token has been seen */ #define PS_Local 0x040000 /* If within #if LOCAL_INTERFACE..#endif */ #define PS_Local2 0x080000 /* If "LOCAL" seen. */ /* ** The following set of flags are ORed into the "flags" field of ** a Decl in order to identify what type of object is being ** declared. */ #define TY_Class 0x00100000 #define TY_Subroutine 0x00200000 #define TY_Macro 0x00400000 #define TY_Typedef 0x00800000 #define TY_Variable 0x01000000 #define TY_Structure 0x02000000 #define TY_Union 0x04000000 #define TY_Enumeration 0x08000000 #define TY_Defunct 0x10000000 /* Used to erase a declaration */ /* ** Each nested #if (or #ifdef or #ifndef) is stored in a stack of ** instances of the following structure. */ typedef struct Ifmacro Ifmacro; struct Ifmacro { int nLine; /* Line number where this macro occurs */ char *zCondition; /* Text of the condition for this macro */ Ifmacro *pNext; /* Next down in the stack */ int flags; /* Can hold PS_Export, PS_Interface or PS_Local flags */ }; /* ** When parsing a file, we need to keep track of what other files have ** be #include-ed. For each #include found, we create an instance of ** the following structure. */ typedef struct Include Include; struct Include { char *zFile; /* The name of file include. Includes "" or <> */ char *zIf; /* If not NULL, #include should be enclosed in #if */ char *zLabel; /* A unique label used to test if this #include has * appeared already in a file or not */ Include *pNext; /* Previous include file, or NULL if this is the first */ }; /* ** Identifiers found in a source file that might be used later to provoke ** the copying of a declaration into the corresponding header file are ** stored in a hash table as instances of the following structure. */ typedef struct Ident Ident; struct Ident { char *zName; /* The text of this identifier */ Ident *pCollide; /* Next identifier with the same hash */ Ident *pNext; /* Next identifier in a list of them all */ }; /* ** A complete table of identifiers is stored in an instance of ** the next structure. */ #define IDENT_HASH_SIZE 2237 typedef struct IdentTable IdentTable; struct IdentTable { Ident *pList; /* List of all identifiers in this table */ Ident *apTable[IDENT_HASH_SIZE]; /* The hash table */ }; /* ** The following structure holds all information for a single ** source file named on the command line of this program. */ typedef struct InFile InFile; struct InFile { char *zSrc; /* Name of input file */ char *zHdr; /* Name of the generated .h file for this input. ** Will be NULL if input is to be scanned only */ int flags; /* One or more DP_, PS_ and/or TY_ flags */ InFile *pNext; /* Next input file in the list of them all */ IdentTable idTable; /* All identifiers in this input file */ }; /* ** An unbounded string is able to grow without limit. We use these ** to construct large in-memory strings from lots of smaller components. */ typedef struct String String; struct String { int nAlloc; /* Number of bytes allocated */ int nUsed; /* Number of bytes used (not counting null terminator) */ char *zText; /* Text of the string */ }; /* ** The following structure contains a lot of state information used ** while generating a .h file. We put the information in this structure ** and pass around a pointer to this structure, rather than pass around ** all of the information separately. This helps reduce the number of ** arguments to generator functions. */ typedef struct GenState GenState; struct GenState { String *pStr; /* Write output to this string */ IdentTable *pTable; /* A table holding the zLabel of every #include that * has already been generated. Used to avoid * generating duplicate #includes. */ const char *zIf; /* If not NULL, then we are within a #if with * this argument. */ int nErr; /* Number of errors */ const char *zFilename; /* Name of the source file being scanned */ int flags; /* Various flags (DP_ and PS_ flags above) */ }; /* ** The following text line appears at the top of every file generated ** by this program. By recognizing this line, the program can be sure ** never to read a file that it generated itself. */ const char zTopLine[] = "/* \aThis file was automatically generated. Do not edit! */\n"; #define nTopLine (sizeof(zTopLine)-1) /* ** The name of the file currently being parsed. */ static char *zFilename; /* ** The stack of #if macros for the file currently being parsed. */ static Ifmacro *ifStack = 0; /* ** A list of all files that have been #included so far in a file being ** parsed. */ static Include *includeList = 0; /* ** The last block comment seen. */ static Token *blockComment = 0; /* ** The following flag is set if the -doc flag appears on the ** command line. */ static int doc_flag = 0; /* ** If the following flag is set, then makeheaders will attempt to ** generate prototypes for static functions and procedures. */ static int proto_static = 0; /* ** A list of all declarations. The list is held together using the ** pNext field of the Decl structure. */ static Decl *pDeclFirst; /* First on the list */ static Decl *pDeclLast; /* Last on the list */ /* ** A hash table of all declarations */ #define DECL_HASH_SIZE 3371 static Decl *apTable[DECL_HASH_SIZE]; /* ** The TEST macro must be defined to something. Make sure this is the ** case. */ #ifndef TEST # define TEST 0 #endif #ifdef NOT_USED /* ** We do our own assertion macro so that we can have more control ** over debugging. */ #define Assert(X) if(!(X)){ CantHappen(__LINE__); } #define CANT_HAPPEN CantHappen(__LINE__) static void CantHappen(int iLine){ fprintf(stderr,"Assertion failed on line %d\n",iLine); *(char*)1 = 0; /* Force a core-dump */ } #endif /* ** Memory allocation functions that are guaranteed never to return NULL. */ static void *SafeMalloc(int nByte){ void *p = malloc( nByte ); if( p==0 ){ fprintf(stderr,"Out of memory. Can't allocate %d bytes.\n",nByte); exit(1); } return p; } static void SafeFree(void *pOld){ if( pOld ){ free(pOld); } } static void *SafeRealloc(void *pOld, int nByte){ void *p; if( pOld==0 ){ p = SafeMalloc(nByte); }else{ p = realloc(pOld, nByte); if( p==0 ){ fprintf(stderr, "Out of memory. Can't enlarge an allocation to %d bytes\n",nByte); exit(1); } } return p; } static char *StrDup(const char *zSrc, int nByte){ char *zDest; if( nByte<=0 ){ nByte = strlen(zSrc); } zDest = SafeMalloc( nByte + 1 ); strncpy(zDest,zSrc,nByte); zDest[nByte] = 0; return zDest; } /* ** Return TRUE if the character X can be part of an identifier */ #define ISALNUM(X) ((X)=='_' || isalnum(X)) /* ** Routines for dealing with unbounded strings. */ static void StringInit(String *pStr){ pStr->nAlloc = 0; pStr->nUsed = 0; pStr->zText = 0; } static void StringReset(String *pStr){ SafeFree(pStr->zText); StringInit(pStr); } static void StringAppend(String *pStr, const char *zText, int nByte){ if( nByte<=0 ){ nByte = strlen(zText); } if( pStr->nUsed + nByte >= pStr->nAlloc ){ if( pStr->nAlloc==0 ){ pStr->nAlloc = nByte + 100; pStr->zText = SafeMalloc( pStr->nAlloc ); }else{ pStr->nAlloc = pStr->nAlloc*2 + nByte; pStr->zText = SafeRealloc(pStr->zText, pStr->nAlloc); } } strncpy(&pStr->zText[pStr->nUsed],zText,nByte); pStr->nUsed += nByte; pStr->zText[pStr->nUsed] = 0; } #define StringGet(S) ((S)->zText?(S)->zText:"") /* ** Compute a hash on a string. The number returned is a non-negative ** value between 0 and 2**31 - 1 */ static int Hash(const char *z, int n){ int h = 0; if( n<=0 ){ n = strlen(z); } while( n-- ){ h = h ^ (h<<5) ^ *z++; } if( h<0 ) h = -h; return h; } /* ** Given an identifier name, try to find a declaration for that ** identifier in the hash table. If found, return a pointer to ** the Decl structure. If not found, return 0. */ static Decl *FindDecl(const char *zName, int len){ int h; Decl *p; if( len<=0 ){ len = strlen(zName); } h = Hash(zName,len) % DECL_HASH_SIZE; p = apTable[h]; while( p && (strncmp(p->zName,zName,len)!=0 || p->zName[len]!=0) ){ p = p->pSameHash; } return p; } /* ** Install the given declaration both in the hash table and on ** the list of all declarations. */ static void InstallDecl(Decl *pDecl){ int h; Decl *pOther; h = Hash(pDecl->zName,0) % DECL_HASH_SIZE; pOther = apTable[h]; while( pOther && strcmp(pDecl->zName,pOther->zName)!=0 ){ pOther = pOther->pSameHash; } if( pOther ){ pDecl->pSameName = pOther->pSameName; pOther->pSameName = pDecl; }else{ pDecl->pSameName = 0; pDecl->pSameHash = apTable[h]; apTable[h] = pDecl; } pDecl->pNext = 0; if( pDeclFirst==0 ){ pDeclFirst = pDeclLast = pDecl; }else{ pDeclLast->pNext = pDecl; pDeclLast = pDecl; } } /* ** Look at the current ifStack. If anything declared at the current ** position must be surrounded with ** ** #if STUFF ** #endif ** ** Then this routine computes STUFF and returns a pointer to it. Memory ** to hold the value returned is obtained from malloc(). */ static char *GetIfString(void){ Ifmacro *pIf; char *zResult = 0; int hasIf = 0; String str; for(pIf = ifStack; pIf; pIf=pIf->pNext){ if( pIf->zCondition==0 || *pIf->zCondition==0 ) continue; if( !hasIf ){ hasIf = 1; StringInit(&str); }else{ StringAppend(&str," && ",4); } StringAppend(&str,pIf->zCondition,0); } if( hasIf ){ zResult = StrDup(StringGet(&str),0); StringReset(&str); }else{ zResult = 0; } return zResult; } /* ** Create a new declaration and put it in the hash table. Also ** return a pointer to it so that we can fill in the zFwd and zDecl ** fields, and so forth. */ static Decl *CreateDecl( const char *zName, /* Name of the object being declared. */ int nName /* Length of the name */ ){ Decl *pDecl; pDecl = SafeMalloc( sizeof(Decl) + nName + 1); memset(pDecl,0,sizeof(Decl)); pDecl->zName = (char*)&pDecl[1]; sprintf(pDecl->zName,"%.*s",nName,zName); pDecl->zFile = zFilename; pDecl->pInclude = includeList; pDecl->zIf = GetIfString(); InstallDecl(pDecl); return pDecl; } /* ** Insert a new identifier into an table of identifiers. Return TRUE if ** a new identifier was inserted and return FALSE if the identifier was ** already in the table. */ static int IdentTableInsert( IdentTable *pTable, /* The table into which we will insert */ const char *zId, /* Name of the identifiers */ int nId /* Length of the identifier name */ ){ int h; Ident *pId; if( nId<=0 ){ nId = strlen(zId); } h = Hash(zId,nId) % IDENT_HASH_SIZE; for(pId = pTable->apTable[h]; pId; pId=pId->pCollide){ if( strncmp(zId,pId->zName,nId)==0 && pId->zName[nId]==0 ){ /* printf("Already in table: %.*s\n",nId,zId); */ return 0; } } pId = SafeMalloc( sizeof(Ident) + nId + 1 ); pId->zName = (char*)&pId[1]; sprintf(pId->zName,"%.*s",nId,zId); pId->pNext = pTable->pList; pTable->pList = pId; pId->pCollide = pTable->apTable[h]; pTable->apTable[h] = pId; /* printf("Add to table: %.*s\n",nId,zId); */ return 1; } /* ** Check to see if the given value is in the given IdentTable. Return ** true if it is and false if it is not. */ static int IdentTableTest( IdentTable *pTable, /* The table in which to search */ const char *zId, /* Name of the identifiers */ int nId /* Length of the identifier name */ ){ int h; Ident *pId; if( nId<=0 ){ nId = strlen(zId); } h = Hash(zId,nId) % IDENT_HASH_SIZE; for(pId = pTable->apTable[h]; pId; pId=pId->pCollide){ if( strncmp(zId,pId->zName,nId)==0 && pId->zName[nId]==0 ){ return 1; } } return 0; } /* ** Remove every identifier from the given table. Reset the table to ** its initial state. */ static void IdentTableReset(IdentTable *pTable){ Ident *pId, *pNext; for(pId = pTable->pList; pId; pId = pNext){ pNext = pId->pNext; SafeFree(pId); } memset(pTable,0,sizeof(IdentTable)); } #ifdef DEBUG /* ** Print the name of every identifier in the given table, one per line */ static void IdentTablePrint(IdentTable *pTable, FILE *pOut){ Ident *pId; for(pId = pTable->pList; pId; pId = pId->pNext){ fprintf(pOut,"%s\n",pId->zName); } } #endif /* ** Read an entire file into memory. Return a pointer to the memory. ** ** The memory is obtained from SafeMalloc and must be freed by the ** calling function. ** ** If the read fails for any reason, 0 is returned. */ static char *ReadFile(const char *zFilename){ struct stat sStat; FILE *pIn; char *zBuf; int n; if( stat(zFilename,&sStat)!=0 #ifndef WIN32 || !S_ISREG(sStat.st_mode) #endif ){ return 0; } pIn = fopen(zFilename,"r"); if( pIn==0 ){ return 0; } zBuf = SafeMalloc( sStat.st_size + 1 ); n = fread(zBuf,1,sStat.st_size,pIn); zBuf[n] = 0; fclose(pIn); return zBuf; } /* ** Write the contents of a string into a file. Return the number of ** errors */ static int WriteFile(const char *zFilename, const char *zOutput){ FILE *pOut; pOut = fopen(zFilename,"w"); if( pOut==0 ){ return 1; } fwrite(zOutput,1,strlen(zOutput),pOut); fclose(pOut); return 0; } /* ** Major token types */ #define TT_Space 1 /* Contiguous white space */ #define TT_Id 2 /* An identifier */ #define TT_Preprocessor 3 /* Any C preprocessor directive */ #define TT_Comment 4 /* Either C or C++ style comment */ #define TT_Number 5 /* Any numeric constant */ #define TT_String 6 /* String or character constants. ".." or '.' */ #define TT_Braces 7 /* All text between { and a matching } */ #define TT_EOF 8 /* End of file */ #define TT_Error 9 /* An error condition */ #define TT_BlockComment 10 /* A C-Style comment at the left margin that * spans multple lines */ #define TT_Other 0 /* None of the above */ /* ** Get a single low-level token from the input file. Update the ** file pointer so that it points to the first character beyond the ** token. ** ** A "low-level token" is any token except TT_Braces. A TT_Braces token ** consists of many smaller tokens and is assembled by a routine that ** calls this one. ** ** The function returns the number of errors. An error is an ** unterminated string or character literal or an unterminated ** comment. ** ** Profiling shows that this routine consumes about half the ** CPU time on a typical run of makeheaders. */ static int GetToken(InStream *pIn, Token *pToken){ int i; const char *z; int cStart; int c; int startLine; /* Line on which a structure begins */ int nlisc = 0; /* True if there is a new-line in a ".." or '..' */ int nErr = 0; /* Number of errors seen */ z = pIn->z; i = pIn->i; pToken->nLine = pIn->nLine; pToken->zText = &z[i]; switch( z[i] ){ case 0: pToken->eType = TT_EOF; pToken->nText = 0; break; case '#': if( i==0 || z[i-1]=='\n' || (i>1 && z[i-1]=='\r' && z[i-2]=='\n')){ /* We found a preprocessor statement */ pToken->eType = TT_Preprocessor; i++; while( z[i]!=0 && z[i]!='\n' ){ if( z[i]=='\\' ){ i++; if( z[i]=='\n' ) pIn->nLine++; } i++; } pToken->nText = i - pIn->i; }else{ /* Just an operator */ pToken->eType = TT_Other; pToken->nText = 1; } break; case ' ': case '\t': case '\r': case '\f': case '\n': while( isspace(z[i]) ){ if( z[i]=='\n' ) pIn->nLine++; i++; } pToken->eType = TT_Space; pToken->nText = i - pIn->i; break; case '\\': pToken->nText = 2; pToken->eType = TT_Other; if( z[i+1]=='\n' ){ pIn->nLine++; pToken->eType = TT_Space; }else if( z[i+1]==0 ){ pToken->nText = 1; } break; case '\'': case '\"': cStart = z[i]; startLine = pIn->nLine; do{ i++; c = z[i]; if( c=='\n' ){ if( !nlisc ){ fprintf(stderr, "%s:%d: (warning) Newline in string or character literal.\n", zFilename, pIn->nLine); nlisc = 1; } pIn->nLine++; } if( c=='\\' ){ i++; c = z[i]; if( c=='\n' ){ pIn->nLine++; } }else if( c==cStart ){ i++; c = 0; }else if( c==0 ){ fprintf(stderr, "%s:%d: Unterminated string or character literal.\n", zFilename, startLine); nErr++; } }while( c ); pToken->eType = TT_String; pToken->nText = i - pIn->i; break; case '/': if( z[i+1]=='/' ){ /* C++ style comment */ while( z[i] && z[i]!='\n' ){ i++; } pToken->eType = TT_Comment; pToken->nText = i - pIn->i; }else if( z[i+1]=='*' ){ /* C style comment */ int isBlockComment = i==0 || z[i-1]=='\n'; i += 2; startLine = pIn->nLine; while( z[i] && (z[i]!='*' || z[i+1]!='/') ){ if( z[i]=='\n' ){ pIn->nLine++; if( isBlockComment ){ if( z[i+1]=='*' || z[i+2]=='*' ){ isBlockComment = 2; }else{ isBlockComment = 0; } } } i++; } if( z[i] ){ i += 2; }else{ isBlockComment = 0; fprintf(stderr,"%s:%d: Unterminated comment\n", zFilename, startLine); nErr++; } pToken->eType = isBlockComment==2 ? TT_BlockComment : TT_Comment; pToken->nText = i - pIn->i; }else{ /* A divide operator */ pToken->eType = TT_Other; pToken->nText = 1; } break; case '0': if( z[i+1]=='x' || z[i+1]=='X' ){ /* A hex constant */ i += 2; while( isxdigit(z[i]) ){ i++; } }else{ /* An octal constant */ while( isdigit(z[i]) ){ i++; } } pToken->eType = TT_Number; pToken->nText = i - pIn->i; break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': while( isdigit(z[i]) ){ i++; } if( (c=z[i])=='.' ){ i++; while( isdigit(z[i]) ){ i++; } c = z[i]; if( c=='e' || c=='E' ){ i++; if( ((c=z[i])=='+' || c=='-') && isdigit(z[i+1]) ){ i++; } while( isdigit(z[i]) ){ i++; } c = z[i]; } if( c=='f' || c=='F' || c=='l' || c=='L' ){ i++; } }else if( c=='e' || c=='E' ){ i++; if( ((c=z[i])=='+' || c=='-') && isdigit(z[i+1]) ){ i++; } while( isdigit(z[i]) ){ i++; } }else if( c=='L' || c=='l' ){ i++; c = z[i]; if( c=='u' || c=='U' ){ i++; } }else if( c=='u' || c=='U' ){ i++; c = z[i]; if( c=='l' || c=='L' ){ i++; } } pToken->eType = TT_Number; pToken->nText = i - pIn->i; break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': while( isalnum(z[i]) || z[i]=='_' ){ i++; }; pToken->eType = TT_Id; pToken->nText = i - pIn->i; break; default: pToken->eType = TT_Other; pToken->nText = 1; break; } pIn->i += pToken->nText; return nErr; } /* ** This routine recovers the next token from the input file which is ** not a space or a comment or any text between an "#if 0" and "#endif". ** ** This routine returns the number of errors encountered. An error ** is an unterminated token or unmatched "#if 0". ** ** Profiling shows that this routine uses about a quarter of the ** CPU time in a typical run. */ static int GetNonspaceToken(InStream *pIn, Token *pToken){ int nIf = 0; int inZero = 0; const char *z; int value; int startLine; int nErr = 0; startLine = pIn->nLine; while( 1 ){ nErr += GetToken(pIn,pToken); /* printf("%04d: Type=%d nIf=%d [%.*s]\n", pToken->nLine,pToken->eType,nIf,pToken->nText, pToken->eType!=TT_Space ? pToken->zText : ""); */ pToken->pComment = blockComment; switch( pToken->eType ){ case TT_Comment: case TT_Space: break; case TT_BlockComment: if( doc_flag ){ blockComment = SafeMalloc( sizeof(Token) ); *blockComment = *pToken; } break; case TT_EOF: if( nIf ){ fprintf(stderr,"%s:%d: Unterminated \"#if\"\n", zFilename, startLine); nErr++; } return nErr; case TT_Preprocessor: z = &pToken->zText[1]; while( *z==' ' || *z=='\t' ) z++; if( sscanf(z,"if %d",&value)==1 && value==0 ){ nIf++; inZero = 1; }else if( inZero ){ if( strncmp(z,"if",2)==0 ){ nIf++; }else if( strncmp(z,"endif",5)==0 ){ nIf--; if( nIf==0 ) inZero = 0; } }else{ return nErr; } break; default: if( !inZero ){ return nErr; } break; } } /* NOT REACHED */ } /* ** This routine looks for identifiers (strings of contiguous alphanumeric ** characters) within a preprocessor directive and adds every such string ** found to the given identifier table */ static void FindIdentifiersInMacro(Token *pToken, IdentTable *pTable){ Token sToken; InStream sIn; int go = 1; sIn.z = pToken->zText; sIn.i = 1; sIn.nLine = 1; while( go && sIn.i < pToken->nText ){ GetToken(&sIn,&sToken); switch( sToken.eType ){ case TT_Id: IdentTableInsert(pTable,sToken.zText,sToken.nText); break; case TT_EOF: go = 0; break; default: break; } } } /* ** This routine gets the next token. Everything contained within ** {...} is collapsed into a single TT_Braces token. Whitespace is ** omitted. ** ** If pTable is not NULL, then insert every identifier seen into the ** IdentTable. This includes any identifiers seen inside of {...}. ** ** The number of errors encountered is returned. An error is an ** unterminated token. */ static int GetBigToken(InStream *pIn, Token *pToken, IdentTable *pTable){ const char *z, *zStart; int iStart; int nBrace; int c; int nLine; int nErr; nErr = GetNonspaceToken(pIn,pToken); switch( pToken->eType ){ case TT_Id: if( pTable!=0 ){ IdentTableInsert(pTable,pToken->zText,pToken->nText); } return nErr; case TT_Preprocessor: if( pTable!=0 ){ FindIdentifiersInMacro(pToken,pTable); } return nErr; case TT_Other: if( pToken->zText[0]=='{' ) break; return nErr; default: return nErr; } z = pIn->z; iStart = pIn->i; zStart = pToken->zText; nLine = pToken->nLine; nBrace = 1; while( nBrace ){ nErr += GetNonspaceToken(pIn,pToken); /* printf("%04d: nBrace=%d [%.*s]\n",pToken->nLine,nBrace, pToken->nText,pToken->zText); */ switch( pToken->eType ){ case TT_EOF: fprintf(stderr,"%s:%d: Unterminated \"{\"\n", zFilename, nLine); nErr++; pToken->eType = TT_Error; return nErr; case TT_Id: if( pTable ){ IdentTableInsert(pTable,pToken->zText,pToken->nText); } break; case TT_Preprocessor: if( pTable!=0 ){ FindIdentifiersInMacro(pToken,pTable); } break; case TT_Other: if( (c = pToken->zText[0])=='{' ){ nBrace++; }else if( c=='}' ){ nBrace--; } break; default: break; } } pToken->eType = TT_Braces; pToken->nText = 1 + pIn->i - iStart; pToken->zText = zStart; pToken->nLine = nLine; return nErr; } /* ** This routine frees up a list of Tokens. The pComment tokens are ** not cleared by this. So we leak a little memory when using the -doc ** option. So what. */ static void FreeTokenList(Token *pList){ Token *pNext; while( pList ){ pNext = pList->pNext; SafeFree(pList); pList = pNext; } } /* ** Tokenize an entire file. Return a pointer to the list of tokens. ** ** Space for each token is obtained from a separate malloc() call. The ** calling function is responsible for freeing this space. ** ** If pTable is not NULL, then fill the table with all identifiers seen in ** the input file. */ static Token *TokenizeFile(const char *zFile, IdentTable *pTable){ InStream sIn; Token *pFirst = 0, *pLast = 0, *pNew; int nErr = 0; sIn.z = zFile; sIn.i = 0; sIn.nLine = 1; blockComment = 0; while( sIn.z[sIn.i]!=0 ){ pNew = SafeMalloc( sizeof(Token) ); nErr += GetBigToken(&sIn,pNew,pTable); debug3(TOKENIZER, "Token on line %d: [%.*s]\n", pNew->nLine, pNew->nText<50 ? pNew->nText : 50, pNew->zText); if( pFirst==0 ){ pFirst = pLast = pNew; pNew->pPrev = 0; }else{ pLast->pNext = pNew; pNew->pPrev = pLast; pLast = pNew; } if( pNew->eType==TT_EOF ) break; } if( pLast ) pLast->pNext = 0; blockComment = 0; if( nErr ){ FreeTokenList(pFirst); pFirst = 0; } return pFirst; } #if TEST==1 /* ** Use the following routine to test or debug the tokenizer. */ void main(int argc, char **argv){ char *zFile; Token *pList, *p; IdentTable sTable; if( argc!=2 ){ fprintf(stderr,"Usage: %s filename\n",*argv); exit(1); } memset(&sTable,0,sizeof(sTable)); zFile = ReadFile(argv[1]); if( zFile==0 ){ fprintf(stderr,"Can't read file \"%s\"\n",argv[1]); exit(1); } pList = TokenizeFile(zFile,&sTable); for(p=pList; p; p=p->pNext){ int j; switch( p->eType ){ case TT_Space: printf("%4d: Space\n",p->nLine); break; case TT_Id: printf("%4d: Id %.*s\n",p->nLine,p->nText,p->zText); break; case TT_Preprocessor: printf("%4d: Preprocessor %.*s\n",p->nLine,p->nText,p->zText); break; case TT_Comment: printf("%4d: Comment\n",p->nLine); break; case TT_BlockComment: printf("%4d: Block Comment\n",p->nLine); break; case TT_Number: printf("%4d: Number %.*s\n",p->nLine,p->nText,p->zText); break; case TT_String: printf("%4d: String %.*s\n",p->nLine,p->nText,p->zText); break; case TT_Other: printf("%4d: Other %.*s\n",p->nLine,p->nText,p->zText); break; case TT_Braces: for(j=0; jnText && j<30 && p->zText[j]!='\n'; j++){} printf("%4d: Braces %.*s...}\n",p->nLine,j,p->zText); break; case TT_EOF: printf("%4d: End of file\n",p->nLine); break; default: printf("%4d: type %d\n",p->nLine,p->eType); break; } } FreeTokenList(pList); SafeFree(zFile); IdentTablePrint(&sTable,stdout); } #endif #ifdef DEBUG /* ** For debugging purposes, write out a list of tokens. */ static void PrintTokens(Token *pFirst, Token *pLast){ int needSpace = 0; int c; pLast = pLast->pNext; while( pFirst!=pLast ){ switch( pFirst->eType ){ case TT_Preprocessor: printf("\n%.*s\n",pFirst->nText,pFirst->zText); needSpace = 0; break; case TT_Id: case TT_Number: printf("%s%.*s", needSpace ? " " : "", pFirst->nText, pFirst->zText); needSpace = 1; break; default: c = pFirst->zText[0]; printf("%s%.*s", (needSpace && (c=='*' || c=='{')) ? " " : "", pFirst->nText, pFirst->zText); needSpace = pFirst->zText[0]==','; break; } pFirst = pFirst->pNext; } } #endif /* ** Convert a sequence of tokens into a string and return a pointer ** to that string. Space to hold the string is obtained from malloc() ** and must be freed by the calling function. ** ** The characters ";\n" are always appended. */ static char *TokensToString(Token *pFirst, Token *pLast){ char *zReturn; String str; int needSpace = 0; int c; StringInit(&str); pLast = pLast->pNext; while( pFirst!=pLast ){ switch( pFirst->eType ){ case TT_Preprocessor: StringAppend(&str,"\n",1); StringAppend(&str,pFirst->zText,pFirst->nText); StringAppend(&str,"\n",1); needSpace = 0; break; case TT_Id: if( pFirst->nText==6 && pFirst->zText[0]=='E' && strncmp(pFirst->zText,"EXPORT",6)==0 ){ break; } /* Fall thru to the next case */ case TT_Number: if( needSpace ){ StringAppend(&str," ",1); } StringAppend(&str,pFirst->zText,pFirst->nText); needSpace = 1; break; default: c = pFirst->zText[0]; if( needSpace && (c=='*' || c=='{') ){ StringAppend(&str," ",1); } StringAppend(&str,pFirst->zText,pFirst->nText); /* needSpace = pFirst->zText[0]==','; */ needSpace = 0; break; } pFirst = pFirst->pNext; } StringAppend(&str,";\n",2); zReturn = StrDup(StringGet(&str),0); StringReset(&str); return zReturn; } /* ** This routine is called when we see one of the keywords "struct", ** "enum", "union" or "class". This might be the beginning of a ** type declaration. This routine will process the declaration and ** remove the declaration tokens from the input stream. ** ** If this is a type declaration that is immediately followed by a ** semicolon (in other words it isn't also a variable definition) ** then set *pReset to ';'. Otherwise leave *pReset at 0. The ** *pReset flag causes the parser to skip ahead to the next token ** that begins with the value placed in the *pReset flag, if that ** value is different from 0. */ static int ProcessTypeDecl(Token *pList, int flags, int *pReset){ Token *pName, *pEnd; Decl *pDecl; String str; int need_to_collapse = 1; *pReset = 0; if( pList==0 || pList->pNext==0 || pList->pNext->eType!=TT_Id ){ return 0; } pName = pList->pNext; /* Catch the case of "struct Foo;" and skip it. */ if( pName->pNext && pName->pNext->zText[0]==';' ){ *pReset = ';'; return 0; } for(pEnd=pName->pNext; pEnd && pEnd->eType!=TT_Braces; pEnd=pEnd->pNext){ switch( pEnd->zText[0] ){ case '(': case '*': case '[': case '=': case ';': return 0; } } if( pEnd==0 ){ return 0; } /* ** At this point, we know we have a type declaration that is bounded ** by pList and pEnd and has the name pName. */ /* ** If the braces are followed immedately by a semicolon, then we are ** dealing a type declaration only. There is not variable definition ** following the type declaration. So reset... */ if( pEnd->pNext==0 || pEnd->pNext->zText[0]==';' ){ *pReset = ';'; need_to_collapse = 0; }else{ need_to_collapse = 1; } if( proto_static==0 && (flags & (PS_Local|PS_Export|PS_Interface))==0 ){ /* Ignore these objects unless they are explicitly declared as interface, ** or unless the "-local" command line option was specified. */ *pReset = ';'; return 0; } #ifdef DEBUG if( debugMask & PARSER ){ printf("**** Found type: %.*s %.*s...\n", pList->nText, pList->zText, pName->nText, pName->zText); PrintTokens(pList,pEnd); printf(";\n"); } #endif pDecl = CreateDecl(pName->zText,pName->nText); if( (flags & PS_Static) || !(flags & (PS_Interface|PS_Export)) ){ DeclSetProperty(pDecl,DP_Local); } switch( *pList->zText ){ case 'c': DeclSetProperty(pDecl,TY_Class); break; case 's': DeclSetProperty(pDecl,TY_Structure); break; case 'e': DeclSetProperty(pDecl,TY_Enumeration); break; case 'u': DeclSetProperty(pDecl,TY_Union); break; default: /* Can't Happen */ break; } /* The object has a full declaration only if it is contained within ** "#if INTERFACE...#endif" or "#if EXPORT_INTERFACE...#endif" or ** "#if LOCAL_INTERFACE...#endif". Otherwise, we only give it a ** forward declaration. */ if( flags & (PS_Local | PS_Export | PS_Interface) ){ pDecl->zDecl = TokensToString(pList,pEnd); }else{ pDecl->zDecl = 0; } pDecl->pComment = pList->pComment; StringInit(&str); StringAppend(&str,"typedef ",0); StringAppend(&str,pList->zText,pList->nText); StringAppend(&str," ",0); StringAppend(&str,pName->zText,pName->nText); StringAppend(&str," ",0); StringAppend(&str,pName->zText,pName->nText); StringAppend(&str,";\n",2); pDecl->zFwd = StrDup(StringGet(&str),0); StringReset(&str); StringInit(&str); StringAppend(&str,pList->zText,pList->nText); StringAppend(&str," ",0); StringAppend(&str,pName->zText,pName->nText); StringAppend(&str,";\n",2); pDecl->zFwdCpp = StrDup(StringGet(&str),0); StringReset(&str); if( flags & PS_Export ){ DeclSetProperty(pDecl,DP_Export); }else if( flags & PS_Local ){ DeclSetProperty(pDecl,DP_Local); } /* Here's something weird. ANSI-C doesn't allow a forward declaration ** of an enumeration. So we have to build the typedef into the ** definition. */ if( pDecl->zDecl && DeclHasProperty(pDecl, TY_Enumeration) ){ StringInit(&str); StringAppend(&str,pDecl->zDecl,0); StringAppend(&str,pDecl->zFwd,0); SafeFree(pDecl->zDecl); SafeFree(pDecl->zFwd); pDecl->zFwd = 0; pDecl->zDecl = StrDup(StringGet(&str),0); StringReset(&str); } if( pName->pNext->zText[0]==':' ){ DeclSetProperty(pDecl,DP_Cplusplus); } if( pName->nText==5 && strncmp(pName->zText,"class",5)==0 ){ DeclSetProperty(pDecl,DP_Cplusplus); } /* ** Remove all but pList and pName from the input stream. */ if( need_to_collapse ){ while( pEnd!=pName ){ Token *pPrev = pEnd->pPrev; pPrev->pNext = pEnd->pNext; pEnd->pNext->pPrev = pPrev; SafeFree(pEnd); pEnd = pPrev; } } return 0; } /* ** Given a list of tokens that declare something (a function, procedure, ** variable or typedef) find the token which contains the name of the ** thing being declared. ** ** Algorithm: ** ** The name is: ** ** 1. The first identifier that is followed by a "[", or ** ** 2. The first identifier that is followed by a "(" where the ** "(" is followed by another identifier, or ** ** 3. The first identifier followed by "::", or ** ** 4. If none of the above, then the last identifier. ** ** In all of the above, certain reserved words (like "char") are ** not considered identifiers. */ static Token *FindDeclName(Token *pFirst, Token *pLast){ Token *pName = 0; Token *p; int c; if( pFirst==0 || pLast==0 ){ return 0; } pLast = pLast->pNext; for(p=pFirst; p && p!=pLast; p=p->pNext){ if( p->eType==TT_Id ){ static IdentTable sReserved; static int isInit = 0; static char *aWords[] = { "char", "class", "const", "double", "enum", "extern", "EXPORT", "ET_PROC", "float", "int", "long", "register", "static", "struct", "sizeof", "signed", "typedef", "union", "volatile", "virtual", "void", }; if( !isInit ){ int i; for(i=0; izText,p->nText) ){ pName = p; } }else if( p==pFirst ){ continue; }else if( (c=p->zText[0])=='[' && pName ){ break; }else if( c=='(' && p->pNext && p->pNext->eType==TT_Id && pName ){ break; }else if( c==':' && p->zText[1]==':' && pName ){ break; } } return pName; } /* ** This routine is called when we see a function or procedure definition. ** We make an entry in the declaration table that is a prototype for this ** function or procedure. */ static int ProcessProcedureDef(Token *pFirst, Token *pLast, int flags){ Token *pName; Decl *pDecl; Token *pCode; if( pFirst==0 || pLast==0 ){ return 0; } if( flags & PS_Method ){ return 0; } if( (flags & PS_Static)!=0 && !proto_static ){ return 0; } pCode = pLast; while( pLast && pLast!=pFirst && pLast->zText[0]!=')' ){ pLast = pLast->pPrev; } if( pLast==0 || pLast==pFirst || pFirst->pNext==pLast ){ fprintf(stderr,"%s:%d: Unrecognized syntax.\n", zFilename, pFirst->nLine); return 1; } if( flags & (PS_Interface|PS_Export|PS_Local) ){ fprintf(stderr,"%s:%d: Missing \"inline\" on function or procedure.\n", zFilename, pFirst->nLine); return 1; } pName = FindDeclName(pFirst,pLast); if( pName==0 ){ fprintf(stderr,"%s:%d: Malformed function or procedure definition.\n", zFilename, pFirst->nLine); return 1; } /* ** At this point we've isolated a procedure declaration between pFirst ** and pLast with the name pName. */ #ifdef DEBUG if( debugMask & PARSER ){ printf("**** Found routine: %.*s on line %d...\n", pName->nText, pName->zText, pFirst->nLine); PrintTokens(pFirst,pLast); printf(";\n"); } #endif pDecl = CreateDecl(pName->zText,pName->nText); pDecl->pComment = pFirst->pComment; if( pCode && pCode->eType==TT_Braces ){ pDecl->tokenCode = *pCode; } DeclSetProperty(pDecl,TY_Subroutine); pDecl->zDecl = TokensToString(pFirst,pLast); if( (flags & (PS_Static|PS_Local2))!=0 ){ DeclSetProperty(pDecl,DP_Local); }else if( (flags & (PS_Export2))!=0 ){ DeclSetProperty(pDecl,DP_Export); } if( flags & DP_Cplusplus ){ DeclSetProperty(pDecl,DP_Cplusplus); }else{ DeclSetProperty(pDecl,DP_ExternCReqd); } return 0; } /* ** This routine is called whenever we see the "inline" keyword. We ** need to seek-out the inline function or procedure and make a ** declaration out of the entire definition. */ static int ProcessInlineProc(Token *pFirst, int flags, int *pReset){ Token *pName; Token *pEnd; Decl *pDecl; for(pEnd=pFirst; pEnd; pEnd = pEnd->pNext){ if( pEnd->zText[0]=='{' || pEnd->zText[0]==';' ){ *pReset = pEnd->zText[0]; break; } } if( pEnd==0 ){ *pReset = ';'; fprintf(stderr,"%s:%d: incomplete inline procedure definition\n", zFilename, pFirst->nLine); return 1; } pName = FindDeclName(pFirst,pEnd); if( pName==0 ){ fprintf(stderr,"%s:%d: malformed inline procedure definition\n", zFilename, pFirst->nLine); return 1; } #ifdef DEBUG if( debugMask & PARSER ){ printf("**** Found inline routine: %.*s on line %d...\n", pName->nText, pName->zText, pFirst->nLine); PrintTokens(pFirst,pEnd); printf("\n"); } #endif pDecl = CreateDecl(pName->zText,pName->nText); pDecl->pComment = pFirst->pComment; DeclSetProperty(pDecl,TY_Subroutine); pDecl->zDecl = TokensToString(pFirst,pEnd); if( (flags & (PS_Static|PS_Local|PS_Local2)) ){ DeclSetProperty(pDecl,DP_Local); }else if( flags & (PS_Export|PS_Export2) ){ DeclSetProperty(pDecl,DP_Export); } if( flags & DP_Cplusplus ){ DeclSetProperty(pDecl,DP_Cplusplus); }else{ DeclSetProperty(pDecl,DP_ExternCReqd); } return 0; } /* ** Determine if the tokens between pFirst and pEnd form a variable ** definition or a function prototype. Return TRUE if we are dealing ** with a variable defintion and FALSE for a prototype. ** ** pEnd is the token that ends the object. It can be either a ';' or ** a '='. If it is '=', then assume we have a variable definition. ** ** If pEnd is ';', then the determination is more difficult. We have ** to search for an occurance of an ID followed immediately by '('. ** If found, we have a prototype. Otherwise we are dealing with a ** variable definition. */ static int isVariableDef(Token *pFirst, Token *pEnd){ if( pEnd && pEnd->zText[0]=='=' ){ return 1; } while( pFirst && pFirst!=pEnd && pFirst->pNext && pFirst->pNext!=pEnd ){ if( pFirst->eType==TT_Id && pFirst->pNext->zText[0]=='(' ){ return 0; } pFirst = pFirst->pNext; } return 1; } /* ** This routine is called whenever we encounter a ";" or "=". The stuff ** between pFirst and pLast constitutes either a typedef or a global ** variable definition. Do the right thing. */ static int ProcessDecl(Token *pFirst, Token *pEnd, int flags){ Token *pName; Decl *pDecl; int isLocal = 0; int isVar; int nErr = 0; if( pFirst==0 || pEnd==0 ){ return 0; } if( flags & PS_Typedef ){ if( (flags & (PS_Export2|PS_Local2))!=0 ){ fprintf(stderr,"%s:%d: \"EXPORT\" or \"LOCAL\" ignored before typedef.\n", zFilename, pFirst->nLine); nErr++; } if( (flags & (PS_Interface|PS_Export|PS_Local|DP_Cplusplus))==0 ){ /* It is illegal to duplicate a typedef in C (but OK in C++). ** So don't record typedefs that aren't within a C++ file or ** within #if INTERFACE..#endif */ return nErr; } if( (flags & (PS_Interface|PS_Export|PS_Local))==0 && proto_static==0 ){ /* Ignore typedefs that are not with "#if INTERFACE..#endif" unless ** the "-local" command line option is used. */ return nErr; } if( (flags & (PS_Interface|PS_Export))==0 ){ /* typedefs are always local, unless within #if INTERFACE..#endif */ isLocal = 1; } }else if( flags & (PS_Static|PS_Local2) ){ if( proto_static==0 && (flags & PS_Local2)==0 ){ /* Don't record static variables unless the "-local" command line ** option was specified or the "LOCAL" keyword is used. */ return nErr; } while( pFirst!=0 && pFirst->pNext!=pEnd && ((pFirst->nText==6 && strncmp(pFirst->zText,"static",6)==0) || (pFirst->nText==5 && strncmp(pFirst->zText,"LOCAL",6)==0)) ){ /* Lose the initial "static" or local from local variables. ** We'll prepend "extern" later. */ pFirst = pFirst->pNext; isLocal = 1; } if( pFirst==0 || !isLocal ){ return nErr; } }else if( flags & PS_Method ){ /* Methods are declared by their class. Don't declare separately. */ return nErr; } isVar = (flags & (PS_Typedef|PS_Method))==0 && isVariableDef(pFirst,pEnd); if( isVar && (flags & (PS_Interface|PS_Export|PS_Local))!=0 && (flags & PS_Extern)==0 ){ fprintf(stderr,"%s:%d: Can't define a variable in this context\n", zFilename, pFirst->nLine); nErr++; } pName = FindDeclName(pFirst,pEnd->pPrev); if( pName==0 ){ fprintf(stderr,"%s:%d: Can't find a name for the object declared here.\n", zFilename, pFirst->nLine); return nErr+1; } #ifdef DEBUG if( debugMask & PARSER ){ if( flags & PS_Typedef ){ printf("**** Found typedef %.*s at line %d...\n", pName->nText, pName->zText, pName->nLine); }else if( isVar ){ printf("**** Found variable %.*s at line %d...\n", pName->nText, pName->zText, pName->nLine); }else{ printf("**** Found prototype %.*s at line %d...\n", pName->nText, pName->zText, pName->nLine); } PrintTokens(pFirst,pEnd->pPrev); printf(";\n"); } #endif pDecl = CreateDecl(pName->zText,pName->nText); if( (flags & PS_Typedef) ){ DeclSetProperty(pDecl, TY_Typedef); }else if( isVar ){ DeclSetProperty(pDecl,DP_ExternReqd | TY_Variable); if( !(flags & DP_Cplusplus) ){ DeclSetProperty(pDecl,DP_ExternCReqd); } }else{ DeclSetProperty(pDecl, TY_Subroutine); if( !(flags & DP_Cplusplus) ){ DeclSetProperty(pDecl,DP_ExternCReqd); } } pDecl->pComment = pFirst->pComment; pDecl->zDecl = TokensToString(pFirst,pEnd->pPrev); if( isLocal || (flags & (PS_Local|PS_Local2))!=0 ){ DeclSetProperty(pDecl,DP_Local); }else if( flags & (PS_Export|PS_Export2) ){ DeclSetProperty(pDecl,DP_Export); } if( flags & DP_Cplusplus ){ DeclSetProperty(pDecl,DP_Cplusplus); } return nErr; } /* ** Push an if condition onto the if stack */ static void PushIfMacro( const char *zPrefix, /* A prefix, like "define" or "!" */ const char *zText, /* The condition */ int nText, /* Number of characters in zText */ int nLine, /* Line number where this macro occurs */ int flags /* Either 0, PS_Interface, PS_Export or PS_Local */ ){ Ifmacro *pIf; int nByte; nByte = sizeof(Ifmacro); if( zText ){ if( zPrefix ){ nByte += strlen(zPrefix) + 2; } nByte += nText + 1; } pIf = SafeMalloc( nByte ); if( zText ){ pIf->zCondition = (char*)&pIf[1]; if( zPrefix ){ sprintf(pIf->zCondition,"%s(%.*s)",zPrefix,nText,zText); }else{ sprintf(pIf->zCondition,"%.*s",nText,zText); } }else{ pIf->zCondition = 0; } pIf->nLine = nLine; pIf->flags = flags; pIf->pNext = ifStack; ifStack = pIf; } /* ** This routine is called to handle all preprocessor directives. ** ** This routine will recompute the value of *pPresetFlags to be the ** logical or of all flags on all nested #ifs. The #ifs that set flags ** are as follows: ** ** conditional flag set ** ------------------------ -------------------- ** #if INTERFACE PS_Interface ** #if EXPORT_INTERFACE PS_Export ** #if LOCAL_INTERFACE PS_Local ** ** For example, if after processing the preprocessor token given ** by pToken there is an "#if INTERFACE" on the preprocessor ** stack, then *pPresetFlags will be set to PS_Interface. */ static int ParsePreprocessor(Token *pToken, int flags, int *pPresetFlags){ const char *zCmd; int nCmd; const char *zArg; int nArg; int nErr = 0; Ifmacro *pIf; zCmd = &pToken->zText[1]; while( isspace(*zCmd) && *zCmd!='\n' ){ zCmd++; } if( !isalpha(*zCmd) ){ return 0; } nCmd = 1; while( isalpha(zCmd[nCmd]) ){ nCmd++; } if( nCmd==5 && strncmp(zCmd,"endif",5)==0 ){ /* ** Pop the if stack */ pIf = ifStack; if( pIf==0 ){ fprintf(stderr,"%s:%d: extra '#endif'.\n",zFilename,pToken->nLine); return 1; } ifStack = pIf->pNext; SafeFree(pIf); }else if( nCmd==6 && strncmp(zCmd,"define",6)==0 ){ /* ** Record a #define if we are in PS_Interface or PS_Export */ Decl *pDecl; if( !(flags & (PS_Local|PS_Interface|PS_Export)) ){ return 0; } zArg = &zCmd[6]; while( *zArg && isspace(*zArg) && *zArg!='\n' ){ zArg++; } if( *zArg==0 || *zArg=='\n' ){ return 0; } for(nArg=0; ISALNUM(zArg[nArg]); nArg++){} if( nArg==0 ){ return 0; } pDecl = CreateDecl(zArg,nArg); pDecl->pComment = pToken->pComment; DeclSetProperty(pDecl,TY_Macro); pDecl->zDecl = SafeMalloc( pToken->nText + 2 ); sprintf(pDecl->zDecl,"%.*s\n",pToken->nText,pToken->zText); if( flags & PS_Export ){ DeclSetProperty(pDecl,DP_Export); }else if( flags & PS_Local ){ DeclSetProperty(pDecl,DP_Local); } }else if( nCmd==7 && strncmp(zCmd,"include",7)==0 ){ /* ** Record an #include if we are in PS_Interface or PS_Export */ Include *pInclude; char *zIf; if( !(flags & (PS_Interface|PS_Export)) ){ return 0; } zArg = &zCmd[7]; while( *zArg && isspace(*zArg) ){ zArg++; } for(nArg=0; !isspace(zArg[nArg]); nArg++){} if( (zArg[0]=='"' && zArg[nArg-1]!='"') ||(zArg[0]=='<' && zArg[nArg-1]!='>') ){ fprintf(stderr,"%s:%d: malformed #include statement.\n", zFilename,pToken->nLine); return 1; } zIf = GetIfString(); if( zIf ){ pInclude = SafeMalloc( sizeof(Include) + nArg*2 + strlen(zIf) + 10 ); pInclude->zFile = (char*)&pInclude[1]; pInclude->zLabel = &pInclude->zFile[nArg+1]; sprintf(pInclude->zFile,"%.*s",nArg,zArg); sprintf(pInclude->zLabel,"%.*s:%s",nArg,zArg,zIf); pInclude->zIf = &pInclude->zLabel[nArg+1]; SafeFree(zIf); }else{ pInclude = SafeMalloc( sizeof(Include) + nArg + 1 ); pInclude->zFile = (char*)&pInclude[1]; sprintf(pInclude->zFile,"%.*s",nArg,zArg); pInclude->zIf = 0; pInclude->zLabel = pInclude->zFile; } pInclude->pNext = includeList; includeList = pInclude; }else if( nCmd==2 && strncmp(zCmd,"if",2)==0 ){ /* ** Push an #if. Watch for the special cases of INTERFACE ** and EXPORT_INTERFACE and LOCAL_INTERFACE */ zArg = &zCmd[2]; while( *zArg && isspace(*zArg) && *zArg!='\n' ){ zArg++; } if( *zArg==0 || *zArg=='\n' ){ return 0; } nArg = pToken->nText + (int)pToken->zText - (int)zArg; if( nArg==9 && strncmp(zArg,"INTERFACE",9)==0 ){ PushIfMacro(0,0,0,pToken->nLine,PS_Interface); }else if( nArg==16 && strncmp(zArg,"EXPORT_INTERFACE",16)==0 ){ PushIfMacro(0,0,0,pToken->nLine,PS_Export); }else if( nArg==15 && strncmp(zArg,"LOCAL_INTERFACE",15)==0 ){ PushIfMacro(0,0,0,pToken->nLine,PS_Local); }else{ PushIfMacro(0,zArg,nArg,pToken->nLine,0); } }else if( nCmd==5 && strncmp(zCmd,"ifdef",5)==0 ){ /* ** Push an #ifdef. */ zArg = &zCmd[5]; while( *zArg && isspace(*zArg) && *zArg!='\n' ){ zArg++; } if( *zArg==0 || *zArg=='\n' ){ return 0; } nArg = pToken->nText + (int)pToken->zText - (int)zArg; PushIfMacro("defined",zArg,nArg,pToken->nLine,0); }else if( nCmd==6 && strncmp(zCmd,"ifndef",6)==0 ){ /* ** Push an #ifndef. */ zArg = &zCmd[6]; while( *zArg && isspace(*zArg) && *zArg!='\n' ){ zArg++; } if( *zArg==0 || *zArg=='\n' ){ return 0; } nArg = pToken->nText + (int)pToken->zText - (int)zArg; PushIfMacro("!defined",zArg,nArg,pToken->nLine,0); }else if( nCmd==4 && strncmp(zCmd,"else",4)==0 ){ /* ** Invert the #if on the top of the stack */ if( ifStack==0 ){ fprintf(stderr,"%s:%d: '#else' without an '#if'\n",zFilename, pToken->nLine); return 1; } pIf = ifStack; if( pIf->zCondition ){ ifStack = ifStack->pNext; PushIfMacro("!",pIf->zCondition,strlen(pIf->zCondition),pIf->nLine,0); SafeFree(pIf); }else{ pIf->flags = 0; } }else{ /* ** This directive can be safely ignored */ return 0; } /* ** Recompute the preset flags */ *pPresetFlags = 0; for(pIf = ifStack; pIf; pIf=pIf->pNext){ *pPresetFlags |= pIf->flags; } return nErr; } /* ** Parse an entire file. Return the number of errors. ** ** pList is a list of tokens in the file. Whitespace tokens have been ** eliminated, and text with {...} has been collapsed into a ** single TT_Brace token. ** ** initFlags are a set of parse flags that should always be set for this ** file. For .c files this is normally 0. For .h files it is PS_Interface. */ static int ParseFile(Token *pList, int initFlags){ int nErr = 0; Token *pStart = 0; int flags = initFlags; int presetFlags = initFlags; int resetFlag = 0; includeList = 0; while( pList ){ switch( pList->eType ){ case TT_EOF: goto end_of_loop; case TT_Preprocessor: nErr += ParsePreprocessor(pList,flags,&presetFlags); pStart = 0; presetFlags |= initFlags; flags = presetFlags; break; case TT_Other: switch( pList->zText[0] ){ case ';': nErr += ProcessDecl(pStart,pList,flags); pStart = 0; flags = presetFlags; break; case '=': nErr += ProcessDecl(pStart,pList,flags); pStart = 0; while( pList && pList->zText[0]!=';' ){ pList = pList->pNext; } if( pList==0 ) goto end_of_loop; flags = presetFlags; break; case ':': if( pList->zText[1]==':' ){ flags |= PS_Method; } break; default: break; } break; case TT_Braces: nErr += ProcessProcedureDef(pStart,pList,flags); pStart = 0; flags = presetFlags; break; case TT_Id: if( pStart==0 ){ pStart = pList; flags = presetFlags; } resetFlag = 0; switch( pList->zText[0] ){ case 'c': if( pList->nText==5 && strncmp(pList->zText,"class",5)==0 ){ nErr += ProcessTypeDecl(pList,flags,&resetFlag); } break; case 'E': if( pList->nText==6 && strncmp(pList->zText,"EXPORT",6)==0 ){ flags |= PS_Export2; /* pStart = 0; */ } break; case 'e': if( pList->nText==4 && strncmp(pList->zText,"enum",4)==0 ){ if( pList->pNext && pList->pNext->eType==TT_Braces ){ pList = pList->pNext; }else{ nErr += ProcessTypeDecl(pList,flags,&resetFlag); } }else if( pList->nText==6 && strncmp(pList->zText,"extern",6)==0 ){ pList = pList->pNext; if( pList && pList->nText==3 && strncmp(pList->zText,"\"C\"",3)==0 ){ pList = pList->pNext; flags &= ~DP_Cplusplus; }else{ flags |= PS_Extern; } pStart = pList; } break; case 'i': if( pList->nText==6 && strncmp(pList->zText,"inline",6)==0 ){ nErr += ProcessInlineProc(pList,flags,&resetFlag); } break; case 'L': if( pList->nText==5 && strncmp(pList->zText,"LOCAL",5)==0 ){ flags |= PS_Local2; pStart = pList; } break; case 's': if( pList->nText==6 && strncmp(pList->zText,"struct",6)==0 ){ if( pList->pNext && pList->pNext->eType==TT_Braces ){ pList = pList->pNext; }else{ nErr += ProcessTypeDecl(pList,flags,&resetFlag); } }else if( pList->nText==6 && strncmp(pList->zText,"static",6)==0 ){ flags |= PS_Static; } break; case 't': if( pList->nText==7 && strncmp(pList->zText,"typedef",7)==0 ){ flags |= PS_Typedef; } break; case 'u': if( pList->nText==5 && strncmp(pList->zText,"union",5)==0 ){ if( pList->pNext && pList->pNext->eType==TT_Braces ){ pList = pList->pNext; }else{ nErr += ProcessTypeDecl(pList,flags,&resetFlag); } } break; default: break; } if( resetFlag!=0 ){ while( pList && pList->zText[0]!=resetFlag ){ pList = pList->pNext; } if( pList==0 ) goto end_of_loop; pStart = 0; flags = presetFlags; } break; case TT_Number: break; default: pStart = pList; flags = presetFlags; break; } pList = pList->pNext; } end_of_loop: /* Verify that all #ifs have a matching "#endif" */ while( ifStack ){ Ifmacro *pIf = ifStack; ifStack = pIf->pNext; fprintf(stderr,"%s:%d: This '#if' has no '#endif'\n",zFilename, pIf->nLine); SafeFree(pIf); } return nErr; } /* ** Reset the DP_Forward and DP_Declared flags on all Decl structures. ** Set both flags for anything that is tagged as local and isn't ** in the file zFilename so that it won't be printing in other files. */ static void ResetDeclFlags(char *zFilename){ Decl *pDecl; for(pDecl = pDeclFirst; pDecl; pDecl = pDecl->pNext){ DeclClearProperty(pDecl,DP_Forward|DP_Declared); if( DeclHasProperty(pDecl,DP_Local) && pDecl->zFile!=zFilename ){ DeclSetProperty(pDecl,DP_Forward|DP_Declared); } } } /* ** Forward declaration of the ScanText() function. */ static void ScanText(const char*, GenState *pState); /* ** The output in pStr is currently within an #if CONTEXT where context ** is equal to *pzIf. (*pzIf might be NULL to indicate that we are ** not within any #if at the moment.) We are getting ready to output ** some text that needs to be within the context of "#if NEW" where ** NEW is zIf. Make an appropriate change to the context. */ static void ChangeIfContext( const char *zIf, /* The desired #if context */ GenState *pState /* Current state of the code generator */ ){ if( zIf==0 ){ if( pState->zIf==0 ) return; StringAppend(pState->pStr,"#endif\n",0); pState->zIf = 0; }else{ if( pState->zIf ){ if( strcmp(zIf,pState->zIf)==0 ) return; StringAppend(pState->pStr,"#endif\n",0); pState->zIf = 0; } ScanText(zIf, pState); if( pState->zIf!=0 ){ StringAppend(pState->pStr,"#endif\n",0); } StringAppend(pState->pStr,"#if ",0); StringAppend(pState->pStr,zIf,0); StringAppend(pState->pStr,"\n",0); pState->zIf = zIf; } } /* ** Add to the string pStr a #include of every file on the list of ** include files pInclude. The table pTable contains all files that ** have already been #included at least once. Don't add any ** duplicates. Update pTable with every new #include that is added. */ static void AddIncludes( Include *pInclude, /* Write every #include on this list */ GenState *pState /* Current state of the code generator */ ){ if( pInclude ){ if( pInclude->pNext ){ AddIncludes(pInclude->pNext,pState); } if( IdentTableInsert(pState->pTable,pInclude->zLabel,0) ){ ChangeIfContext(pInclude->zIf,pState); StringAppend(pState->pStr,"#include ",0); StringAppend(pState->pStr,pInclude->zFile,0); StringAppend(pState->pStr,"\n",1); } } } /* ** Add to the string pStr a declaration for the object described ** in pDecl. ** ** If pDecl has already been declared in this file, detect that ** fact and abort early. Do not duplicate a declaration. ** ** If the needFullDecl flag is false and this object has a forward ** declaration, then supply the forward declaration only. A later ** call to CompleteForwardDeclarations() will finish the declaration ** for us. But if needFullDecl is true, we must supply the full ** declaration now. Some objects do not have a forward declaration. ** For those objects, we must print the full declaration now. ** ** Because it is illegal to duplicate a typedef in C, care is taken ** to insure that typedefs for the same identifier are only issued once. */ static void DeclareObject( Decl *pDecl, /* The thing to be declared */ GenState *pState, /* Current state of the code generator */ int needFullDecl /* Must have the full declaration. A forward * declaration isn't enough */ ){ Decl *p; /* The object to be declared */ int flag; int isCpp; /* True if generating C++ */ int doneTypedef = 0; /* True if a typedef has been done for this object */ /* ** For any object that has a forward declaration, go ahead and do the ** forward declaration first. */ isCpp = (pState->flags & DP_Cplusplus) != 0; for(p=pDecl; p; p=p->pSameName){ if( p->zFwd ){ if( !DeclHasProperty(p,DP_Forward) ){ DeclSetProperty(p,DP_Forward); if( strncmp(p->zFwd,"typedef",7)==0 ){ if( doneTypedef ) continue; doneTypedef = 1; } ChangeIfContext(p->zIf,pState); StringAppend(pState->pStr,isCpp ? p->zFwdCpp : p->zFwd,0); } } } /* ** Early out if everything is already suitably declared. ** ** This is a very important step because it prevents us from ** executing the code the follows in a recursive call to this ** function with the same value for pDecl. */ flag = needFullDecl ? DP_Declared|DP_Forward : DP_Forward; for(p=pDecl; p; p=p->pSameName){ if( !DeclHasProperty(p,flag) ) break; } if( p==0 ){ return; } /* ** Make sure we have all necessary #includes */ for(p=pDecl; p; p=p->pSameName){ AddIncludes(p->pInclude,pState); } /* ** Go ahead an mark everything as being declared, to prevent an ** infinite loop thru the ScanText() function. At the same time, ** we decide which objects need a full declaration and mark them ** with the DP_Flag bit. We are only able to use DP_Flag in this ** way because we know we'll never execute this far into this ** function on a recursive call with the same pDecl. Hence, recursive ** calls to this function (through ScanText()) can never change the ** value of DP_Flag out from under us. */ for(p=pDecl; p; p=p->pSameName){ if( !DeclHasProperty(p,DP_Declared) && (p->zFwd==0 || needFullDecl) && p->zDecl!=0 ){ DeclSetProperty(p,DP_Forward|DP_Declared|DP_Flag); }else{ DeclClearProperty(p,DP_Flag); } } /* ** Call ScanText() recusively (this routine is called from ScanText()) ** to include declarations required to come before these declarations. */ for(p=pDecl; p; p=p->pSameName){ if( DeclHasProperty(p,DP_Flag) ){ if( p->zDecl[0]=='#' ){ ScanText(&p->zDecl[1],pState); }else{ ScanText(p->zDecl,pState); } } } /* ** Output the declarations. Do this in two passes. First ** output everything that isn't a typedef. Then go back and ** get the typedefs by the same name. */ for(p=pDecl; p; p=p->pSameName){ if( DeclHasProperty(p,DP_Flag) && !DeclHasProperty(p,TY_Typedef) ){ if( DeclHasAnyProperty(p,TY_Enumeration) ){ if( doneTypedef ) continue; doneTypedef = 1; } ChangeIfContext(p->zIf,pState); if( !isCpp && DeclHasAnyProperty(p,DP_ExternReqd) ){ StringAppend(pState->pStr,"extern ",0); }else if( isCpp && DeclHasProperty(p,DP_Cplusplus|DP_ExternReqd) ){ StringAppend(pState->pStr,"extern ",0); }else if( isCpp && DeclHasAnyProperty(p,DP_ExternCReqd|DP_ExternReqd) ){ StringAppend(pState->pStr,"extern \"C\" ",0); } StringAppend(pState->pStr,p->zDecl,0); if( !isCpp && DeclHasProperty(p,DP_Cplusplus) ){ fprintf(stderr, "%s: C code ought not reference the C++ object \"%s\"\n", pState->zFilename, p->zName); pState->nErr++; } DeclClearProperty(p,DP_Flag); } } for(p=pDecl; p && !doneTypedef; p=p->pSameName){ if( DeclHasProperty(p,DP_Flag) ){ /* This has to be a typedef */ doneTypedef = 1; ChangeIfContext(p->zIf,pState); StringAppend(pState->pStr,p->zDecl,0); } } } /* ** This routine scans the input text given, and appends to the ** string in pState->pStr the text of any declarations that must ** occur before the text in zText. ** ** If an identifier in zText is immediately followed by '*', then ** only forward declarations are needed for that identifier. If the ** identifier name is not followed immediately by '*', we must supply ** a full declaration. */ static void ScanText( const char *zText, /* The input text to be scanned */ GenState *pState /* Current state of the code generator */ ){ int nextValid = 0; /* True is sNext contains valid data */ InStream sIn; /* The input text */ Token sToken; /* The current token being examined */ Token sNext; /* The next non-space token */ sIn.z = zText; sIn.i = 0; sIn.nLine = 1; while( sIn.z[sIn.i]!=0 ){ if( nextValid ){ sToken = sNext; nextValid = 0; }else{ GetNonspaceToken(&sIn,&sToken); } if( sToken.eType==TT_Id ){ int needFullDecl; /* True if we need to provide the full declaration, ** not just the forward declaration */ Decl *pDecl; /* The declaration having the name in sToken */ /* ** See if there is a declaration in the database with the name given ** by sToken. */ pDecl = FindDecl(sToken.zText,sToken.nText); if( pDecl==0 ) continue; /* ** If we get this far, we've found an identifier that has a ** declaration in the database. Now see if we the full declaration ** or just a forward declaration. */ GetNonspaceToken(&sIn,&sNext); if( sNext.zText[0]=='*' ){ needFullDecl = 0; }else{ needFullDecl = 1; nextValid = sNext.eType==TT_Id; } /* ** Generate the needed declaration. */ DeclareObject(pDecl,pState,needFullDecl); }else if( sToken.eType==TT_Preprocessor ){ sIn.i -= sToken.nText - 1; } } } /* ** Provide a full declaration to any object which so far has had only ** a foward declaration. */ static void CompleteForwardDeclarations(GenState *pState){ Decl *pDecl; int progress; do{ progress = 0; for(pDecl=pDeclFirst; pDecl; pDecl=pDecl->pNext){ if( DeclHasProperty(pDecl,DP_Forward) && !DeclHasProperty(pDecl,DP_Declared) ){ DeclareObject(pDecl,pState,1); progress = 1; assert( DeclHasProperty(pDecl,DP_Declared) ); } } }while( progress ); } /* ** Generate an include file for the given source file. Return the number ** of errors encountered. ** ** if nolocal_flag is true, then we do not generate declarations for ** objected marked DP_Local. */ static int MakeHeader(InFile *pFile, FILE *report, int nolocal_flag){ int nErr = 0; GenState sState; String outStr; IdentTable includeTable; Ident *pId; char *zNewVersion; char *zOldVersion; if( pFile->zHdr==0 || *pFile->zHdr==0 ) return 0; sState.pStr = &outStr; StringInit(&outStr); StringAppend(&outStr,zTopLine,nTopLine); sState.pTable = &includeTable; memset(&includeTable,0,sizeof(includeTable)); sState.zIf = 0; sState.nErr = 0; sState.zFilename = pFile->zSrc; sState.flags = pFile->flags & DP_Cplusplus; ResetDeclFlags(nolocal_flag ? "no" : pFile->zSrc); for(pId = pFile->idTable.pList; pId; pId=pId->pNext){ Decl *pDecl = FindDecl(pId->zName,0); if( pDecl ){ DeclareObject(pDecl,&sState,1); } } CompleteForwardDeclarations(&sState); ChangeIfContext(0,&sState); nErr += sState.nErr; zOldVersion = ReadFile(pFile->zHdr); zNewVersion = StringGet(&outStr); if( report ) fprintf(report,"%s: ",pFile->zHdr); if( zOldVersion==0 ){ if( report ) fprintf(report,"updated\n"); if( WriteFile(pFile->zHdr,zNewVersion) ){ fprintf(stderr,"%s: Can't write to file\n",pFile->zHdr); nErr++; } }else if( strncmp(zOldVersion,zTopLine,nTopLine)!=0 ){ if( report ) fprintf(report,"error!\n"); fprintf(stderr, "%s: Can't overwrite this file because it wasn't previously\n" "generated by 'makeheaders'.\n", pFile->zHdr); nErr++; }else if( strcmp(zOldVersion,zNewVersion)!=0 ){ if( report ) fprintf(report,"updated\n"); if( WriteFile(pFile->zHdr,zNewVersion) ){ fprintf(stderr,"%s: Can't write to file\n",pFile->zHdr); nErr++; } }else if( report ){ fprintf(report,"unchanged\n"); } SafeFree(zOldVersion); IdentTableReset(&includeTable); StringReset(&outStr); return nErr; } /* ** Generate a global header file -- a header file that contains all ** declarations. If the forExport flag is true, then only those ** objects that are exported are included in the header file. */ static int MakeGlobalHeader(int forExport){ GenState sState; String outStr; IdentTable includeTable; Decl *pDecl; sState.pStr = &outStr; StringInit(&outStr); /* StringAppend(&outStr,zTopLine,nTopLine); */ sState.pTable = &includeTable; memset(&includeTable,0,sizeof(includeTable)); sState.zIf = 0; sState.nErr = 0; sState.zFilename = "(all)"; sState.flags = 0; ResetDeclFlags(0); for(pDecl=pDeclFirst; pDecl; pDecl=pDecl->pNext){ if( forExport==0 || DeclHasProperty(pDecl,DP_Export) ){ DeclareObject(pDecl,&sState,1); } } ChangeIfContext(0,&sState); printf("%s",StringGet(&outStr)); IdentTableReset(&includeTable); StringReset(&outStr); return 0; } #ifdef DEBUG /* ** Return the number of characters in the given string prior to the ** first newline. */ static int ClipTrailingNewline(char *z){ int n = strlen(z); while( n>0 && (z[n-1]=='\n' || z[n-1]=='\r') ){ n--; } return n; } /* ** Dump the entire declaration list for debugging purposes */ static void DumpDeclList(void){ Decl *pDecl; for(pDecl = pDeclFirst; pDecl; pDecl=pDecl->pNext){ printf("**** %s from file %s ****\n",pDecl->zName,pDecl->zFile); if( pDecl->zIf ){ printf("If: [%.*s]\n",ClipTrailingNewline(pDecl->zIf),pDecl->zIf); } if( pDecl->zFwd ){ printf("Decl: [%.*s]\n",ClipTrailingNewline(pDecl->zFwd),pDecl->zFwd); } if( pDecl->zDecl ){ printf("Def: [%.*s]\n",ClipTrailingNewline(pDecl->zDecl),pDecl->zDecl); } if( pDecl->flags ){ static struct { int mask; char *desc; } flagSet[] = { { TY_Class, "class" }, { TY_Enumeration, "enum" }, { TY_Structure, "struct" }, { TY_Union, "union" }, { TY_Variable, "variable" }, { TY_Subroutine, "function" }, { TY_Typedef, "typedef" }, { TY_Macro, "macro" }, { DP_Export, "export" }, { DP_Local, "local" }, { DP_Cplusplus, "C++" }, }; int i; printf("flags:"); for(i=0; iflags ){ printf(" %s", flagSet[i].desc); } } printf("\n"); } if( pDecl->pInclude ){ Include *p; printf("includes:"); for(p=pDecl->pInclude; p; p=p->pNext){ printf(" %s",p->zFile); } printf("\n"); } } } #endif /* ** When the "-doc" command-line option is used, this routine is called ** to print all of the database information to standard output. */ static void DocumentationDump(void){ Decl *pDecl; static struct { int mask; char flag; } flagSet[] = { { TY_Class, 'c' }, { TY_Enumeration, 'e' }, { TY_Structure, 's' }, { TY_Union, 'u' }, { TY_Variable, 'v' }, { TY_Subroutine, 'f' }, { TY_Typedef, 't' }, { TY_Macro, 'm' }, { DP_Export, 'x' }, { DP_Local, 'l' }, { DP_Cplusplus, '+' }, }; for(pDecl = pDeclFirst; pDecl; pDecl=pDecl->pNext){ int i; int nLabel = 0; char *zDecl; char zLabel[50]; for(i=0; izDecl; if( zDecl==0 ) zDecl = pDecl->zFwd; printf("%s %s %s %d %d %d %d %d %d\n", pDecl->zName, zLabel, pDecl->zFile, (int)(pDecl->pComment ? (int)pDecl->pComment/sizeof(Token) : 0), (int)(pDecl->pComment ? pDecl->pComment->nText+1 : 0), (int)(pDecl->zIf ? strlen(pDecl->zIf)+1 : 0), (int)(zDecl ? strlen(zDecl) : 0), (int)(pDecl->pComment ? pDecl->pComment->nLine : 0), pDecl->tokenCode.nText ? pDecl->tokenCode.nText+1 : 0 ); if( pDecl->pComment ){ printf("%.*s\n",pDecl->pComment->nText, pDecl->pComment->zText); } if( pDecl->zIf ){ printf("%s\n",pDecl->zIf); } if( zDecl ){ printf("%s",zDecl); } if( pDecl->tokenCode.nText ){ printf("%.*s\n",pDecl->tokenCode.nText, pDecl->tokenCode.zText); } } } /* ** Given the complete text of an input file, this routine prints a ** documentation record for the header comment at the beginning of the ** file (if the file has a header comment.) */ void PrintModuleRecord(const char *zFile, const char *zFilename){ int i; static int addr = 5; while( isspace(*zFile) ){ zFile++; } if( *zFile!='/' || zFile[1]!='*' ) return; for(i=2; zFile[i] && (zFile[i-1]!='/' || zFile[i-2]!='*'); i++){} if( zFile[i]==0 ) return; printf("%s M %s %d %d 0 0 0\n%.*s\n", zFilename, zFilename, addr, i+1, i, zFile); addr += 4; } /* ** Given an input argument to the program, construct a new InFile ** object. */ static InFile *CreateInFile(char *zArg, int *pnErr){ int nSrc; char *zSrc; InFile *pFile; int i; /* ** Get the name of the input file to be scanned */ zSrc = zArg; for(nSrc=0; zSrc[nSrc] && zArg[nSrc]!=':'; nSrc++){} pFile = SafeMalloc( sizeof(InFile) ); memset(pFile,0,sizeof(InFile)); pFile->zSrc = StrDup(zSrc,nSrc); /* Figure out if we are dealing with C or C++ code. Assume any ** file with ".c" or ".h" is C code and all else is C++. */ if( nSrc>2 && zSrc[nSrc-2]=='.' && (zSrc[nSrc-1]=='c' || zSrc[nSrc-1]=='h')){ pFile->flags &= ~DP_Cplusplus; }else{ pFile->flags |= DP_Cplusplus; } /* ** If a separate header file is specified, use it */ if( zSrc[nSrc]==':' ){ int nHdr; char *zHdr; zHdr = &zSrc[nSrc+1]; for(nHdr=0; zHdr[nHdr] && zHdr[nHdr]!=':'; nHdr++){} pFile->zHdr = StrDup(zHdr,nHdr); } /* Look for any 'c' or 'C' in the suffix of the file name and change ** that character to 'h' or 'H' respectively. If no 'c' or 'C' is found, ** then assume we are dealing with a header. */ else{ int foundC = 0; pFile->zHdr = StrDup(zSrc,nSrc); for(i = nSrc-1; i>0 && pFile->zHdr[i]!='.'; i--){ if( pFile->zHdr[i]=='c' ){ foundC = 1; pFile->zHdr[i] = 'h'; }else if( pFile->zHdr[i]=='C' ){ foundC = 1; pFile->zHdr[i] = 'H'; } } if( !foundC ){ SafeFree(pFile->zHdr); pFile->zHdr = 0; } } /* ** If pFile->zSrc contains no 'c' or 'C' in its extension, it ** must be a header file. In that case, we need to set the ** PS_Interface flag. */ pFile->flags |= PS_Interface; for(i=nSrc-1; i>0 && zSrc[i]!='.'; i--){ if( zSrc[i]=='c' || zSrc[i]=='C' ){ pFile->flags &= ~PS_Interface; break; } } /* Done! */ return pFile; } /* MS-Windows and MS-DOS both have the following serious OS bug: the ** length of a command line is severely restricted. But this program ** occasionally requires long command lines. Hence the following ** work around. ** ** If the parameters "-f FILENAME" appear anywhere on the command line, ** then the named file is scanned for additional command line arguments. ** These arguments are substituted in place of the "FILENAME" argument ** in the original argument list. ** ** This first parameter to this routine is the index of the "-f" ** parameter in the argv[] array. The argc and argv are passed by ** pointer so that they can be changed. ** ** Parsing of the parameters in the file is very simple. Parameters ** can be separated by any amount of white-space (including newlines ** and carriage returns.) There are now quoting characters of any ** kind. The length of a token is limited to about 1000 characters. */ static void AddParameters(int index, int *pArgc, char ***pArgv){ int argc = *pArgc; /* The original argc value */ char **argv = *pArgv; /* The original argv value */ int newArgc; /* Value for argc after inserting new arguments */ char **zNew; /* The new argv after this routine is done */ char *zFile; /* Name of the input file */ int nNew = 0; /* Number of new entries in the argv[] file */ int nAlloc = 0; /* Space allocated for zNew[] */ int i; /* Loop counter */ int n; /* Number of characters in a new argument */ int c; /* Next character of input */ int startOfLine = 1; /* True if we are where '#' can start a comment */ FILE *in; /* The input file */ char zBuf[1000]; /* A single argument is accumulated here */ if( index+1==argc ) return; zFile = argv[index+1]; in = fopen(zFile,"r"); if( in==0 ){ fprintf(stderr,"Can't open input file \"%s\"\n",zFile); exit(1); } c = ' '; while( c!=EOF ){ while( c!=EOF && isspace(c) ){ if( c=='\n' ){ startOfLine = 1; } c = getc(in); if( startOfLine && c=='#' ){ while( c!=EOF && c!='\n' ){ c = getc(in); } } } n = 0; while( c!=EOF && !isspace(c) ){ if( n0 ){ nNew++; if( nNew + argc > nAlloc ){ if( nAlloc==0 ){ nAlloc = 100 + argc; zNew = malloc( sizeof(char*) * nAlloc ); }else{ nAlloc *= 2; zNew = realloc( zNew, sizeof(char*) * nAlloc ); } } if( zNew ){ int j = nNew + index; zNew[j] = malloc( n + 1 ); if( zNew[j] ){ strcpy( zNew[j], zBuf ); } } } } newArgc = argc + nNew - 1; for(i=0; i<=index; i++){ zNew[i] = argv[i]; } for(i=nNew + index + 1; ipNext = pFile; pTail = pFile; }else{ pFileList = pTail = pFile; } } } } if( h_flag && H_flag ){ h_flag = 0; } if( v_flag ){ report = (h_flag || H_flag) ? stderr : stdout; }else{ report = 0; } if( nErr>0 ){ return nErr; } for(pFile=pFileList; pFile; pFile=pFile->pNext){ char *zFile; zFilename = pFile->zSrc; if( zFilename==0 ) continue; zFile = ReadFile(zFilename); if( zFile==0 ){ fprintf(stderr,"Can't read input file \"%s\"\n",zFilename); nErr++; continue; } if( strncmp(zFile,zTopLine,nTopLine)==0 ){ pFile->zSrc = 0; }else{ if( report ) fprintf(report,"Reading %s...\n",zFilename); pList = TokenizeFile(zFile,&pFile->idTable); if( pList ){ nErr += ParseFile(pList,pFile->flags); FreeTokenList(pList); }else if( zFile[0]==0 ){ fprintf(stderr,"Input file \"%s\" is empty.\n", zFilename); nErr++; }else{ fprintf(stderr,"Errors while processing \"%s\"\n", zFilename); nErr++; } } if( !doc_flag ) SafeFree(zFile); if( doc_flag ) PrintModuleRecord(zFile,zFilename); } if( nErr>0 ){ return nErr; } #ifdef DEBUG if( debugMask & DECL_DUMP ){ DumpDeclList(); return nErr; } #endif if( doc_flag ){ DocumentationDump(); return nErr; } zFilename = "--internal--"; pList = TokenizeFile(zInit,0); if( pList==0 ){ return nErr+1; } ParseFile(pList,PS_Interface); FreeTokenList(pList); if( h_flag || H_flag ){ nErr += MakeGlobalHeader(H_flag); }else{ for(pFile=pFileList; pFile; pFile=pFile->pNext){ if( pFile->zSrc==0 ) continue; nErr += MakeHeader(pFile,report,0); } } return nErr; } #endif saods9/tkhtml1.0/tools/maketokens.tcl000644 000765 000000 00000004426 10423760215 020121 0ustar00joyewheel000000 000000 #!/bin/sh # This script is a replacement for the maketokens.sh shell script. # The shell script required GNU awk. This script should work with # any old version of tclsh. # \ exec tclsh "$0" ${1+"$@"} if {$argc!=1} { puts stderr "Usage: $argv0 tokenlist.txt >htmltokens.c" exit 1 } if {[catch {open [lindex $argv 0] r} f]} { puts stderr "$argv0: can not open \"[lindex $argv 0]\": $f" exit 1 } set tokenlist {} while {![eof $f]} { set line [string trim [gets $f]] if {$line==""} continue if {[string index $line 0]=="#"} continue if {[llength $line]!=2 && [llength $line]!=3} continue lappend tokenlist [lindex $line 0] lappend tokenlist [lindex $line 1] lappend tokenlist [lindex $line 2] } close $f global tcl_platform if {$tcl_platform(platform) == "windows"} { fconfigure stdout -translation lf } puts {/* DO NOT EDIT ** The code in this file was automatically generated. */ #include #include "htmltokens.h" #if INTERFACE struct HtmlTokenMap { char *zName; /* Name of a markup */ Html_16 type; /* Markup type code */ Html_16 extra; /* Extra space needed above HtmlBaseElement */ HtmlTokenMap *pCollide; /* Hash table collision chain */ }; #define Html_Text 1 #define Html_Space 2 #define Html_Unknown 3 #define Html_Block 4 #define HtmlIsMarkup(X) ((X)->base.type>Html_Block) } set count 5 set fmt {#define %-20s %d} foreach {name start end} $tokenlist { set upr [string toupper $name] puts [format $fmt Html_$upr $count] incr count if {$end!=""} { puts [format $fmt Html_End$upr $count] incr count } } puts [format $fmt Html_TypeCount [expr $count-1]] puts "#define HTML_MARKUP_HASH_SIZE [expr $count+11]" puts "#define HTML_MARKUP_COUNT [expr $count-5]" puts "#endif /* INTERFACE */" puts "HtmlTokenMap HtmlMarkupMap\[\] = {" set fmt " { %-15s %-25s %-30s }," foreach {name start end} $tokenlist { set upr [string toupper $name] set nm "\"$name\"," set val Html_$upr, if {$start=="0"} { set size "0," } else { set size "sizeof($start)," } puts [format $fmt $nm $val $size] if {$end==""} continue set nm "\"/$name\"," set val Html_End$upr, if {$end=="0"} { set size "0," } else { set size "sizeof($end)," } puts [format $fmt $nm $val $size] } puts "};" saods9/tkhtml1.0/tools/sgmlparse.c000644 000765 000000 00000012705 07504443354 017424 0ustar00joyewheel000000 000000 /* ** This file contains code used to tokenize SGML. */ #include #include #include #include #include #include "sgmlparse.h" #define stricmp strcasecmp /* These three pointers define certain special handlers. All whitespace ** is sent to xSpaceHandler. Non-whitespace is given to xWordHandler. ** Any markup that isn't specifically directed elsewhere is given ** to xDefaultMarkupHandlers. */ static void (*xSpaceHandler)(const char*,void*); static void (*xWordHandler)(const char*,void*); static void (*xCommentHandler)(const char*,void*); static void (*xDefaultMarkupHandler)(int, const char**, void*); /* Each handler is stored in a hash table as an instance of the ** following structure. */ typedef struct sgHandler Handler; struct sgHandler { char *zName; /* Name of markup to handle */ void (*xHandler)(int, const char**, void*); /* Routine to do the work */ Handler *pCollide; /* Next handler with same hash */ }; /* The size of the handler hash table. ** For best results, this should be a prime number which is larger than ** the number of markups in the hash table. */ #define SGML_HASH_SIZE 203 /* The handler hash table */ static Handler *apHandler[SGML_HASH_SIZE]; /* Hash a handler name */ static int SgmlHash(const char *zName){ int h = 0; char c; while( (c=*zName)!=0 ){ if( isupper(c) ) c = tolower(c); h = h<<5 ^ h ^ c; zName++; } if( h<0 ) h = -h; return h % SGML_HASH_SIZE; } /* Given a pointer to an input file, read and parse that file ** as if it were SGML. ** ** This is not a true SGML parser because it handles some unusual ** cases differently, and ignores the & operator completely. */ void SgmlParse(FILE *in, void *pArg){ int c; int i, j; int argc; Handler *pHandler; char *argv[100]; char zBuf[10000]; c = getc(in); while( c!=EOF ){ if( isspace(c) ){ /* Case 1: spaces */ zBuf[0] = c; i = 1; while( i' ) c = getc(in); zBuf[i] = 0; if( strncmp(zBuf,"

} $h token list 1.0 end } {0 {{Markup p} {Markup /p}}} ::tcltest::test html-3.4 {Check that entities are resolved} { set h [tkhtml_test_widget] $h clear $h parse {& <>H

} $h token list 1.0 end } {0 {{Text {& <>H}} {Markup p}}} ::tcltest::test html-3.5 {Check that spacing is recorded properly} { set h [tkhtml_test_widget] $h clear $h parse "

\n\tHi\tThere\n
" $h token list 1.0 end } {0 {{Markup pre} {Space 1 1} {Space 8 0} {Text Hi} {Space 6 0} {Text There} {Space 1 1} {Markup /pre}}} ::tcltest::test html-3.6 {Script markup should become a single token} { set h [tkhtml_test_widget] $h clear $h parse "\n" $h token list 1.0 end } {0 {{Markup script} {Space 1 1}}} ::tcltest::test html-3.6b {Style markup should become a single token} { set h [tkhtml_test_widget] $h clear $h parse "\n" $h token list 1.0 end } {0 {{Markup style} {Space 1 1}}} ::tcltest::test html-3.7 {All markup within listing is normal text} { set h [tkhtml_test_widget] $h clear $h parse "

Hello

\n" $h token list 1.0 end } {0 {{Markup listing} {Text

Hello} {Text

} {Markup /listing} {Space 1 1}}} ::tcltest::test html-3.8 {All markup within xmp is normal text} { set h [tkhtml_test_widget] $h clear $h parse "<p>Hello</p>\n" $h token list 1.0 end } {0 {{Markup xmp} {Text

Hello} {Text

} {Markup /xmp} {Space 1 1}}} ::tcltest::test html-3.9 {All markup within textarea is treated as normal text. This is not valid HTML, but it is what Netscape does.} { set h [tkhtml_test_widget] $h clear $h parse "\n" $h token list 1.0 end } {0 {{Markup textarea} {Text

Hello} {Text

} {Markup /textarea} {Space 1 1}}} ::tcltest::test html-3.10 {All markup after plaintext become normal text} { set h [tkhtml_test_widget] $h clear $h parse "<p>Hello</p></plaintext>\n" $h token list 1.0 end } {0 {{Markup plaintext} {Text <p>Hello} {Text </p>} {Text </plaintext>} {Space 1 1}}} ::tcltest::test html-3.11 {Unrecognized markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse "<unknown>Text\n" $h token list 1.0 end } {0 {{Text Text} {Space 1 1}}} ::tcltest::test html-3.12 {Entities are resolved within markup arguments} { set h [tkhtml_test_widget] $h clear $h parse {<p id="&lt;hi&gt;">} $h token list 1.0 end } {0 {{Markup p id <hi>}}} ::tcltest::test html-3.13 {Entites are resolved within markup arguments} { set h [tkhtml_test_widget] $h clear $h parse {<p id=&lt;hi&gt;>} $h token list 1.0 end } {0 {{Markup p id <hi>}}} ::tcltest::test html-3.14 {White space within markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse {<br >} $h token list 1.0 end } {0 {{Markup br}}} ::tcltest::test html-3.15 {Whitespace within markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse {<br id = 5>} $h token list 1.0 end } {0 {{Markup br id 5}}} ::tcltest::test html-3.16 {Whitespace in markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse {<br id = 5 >} $h token list 1.0 end } {0 {{Markup br id 5}}} ::tcltest::test html-3.17 {Whitespace in markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse {<br id =5>} $h token list 1.0 end } {0 {{Markup br id 5}}} ::tcltest::test html-3.18 {Whitespace in markup is ignored} { set h [tkhtml_test_widget] $h clear $h parse {<br id= 5 >} $h token list 1.0 end } {0 {{Markup br id 5}}} ::tcltest::test html-3.19 {Whitespace in markup is ignored, except when quoted} { set h [tkhtml_test_widget] $h clear $h parse {<br id= " 5 " >} $h token list 1.0 end } {0 {{Markup br id { 5 }}}} ::tcltest::test html-3.20 {Tabs in markup are treated like whitespace} { set h [tkhtml_test_widget] $h clear $h parse "<br id\t=\t' 5 '\t>" $h token list 1.0 end } {0 {{Markup br id { 5 }}}} ::tcltest::test html-3.21 {Newlines in markup are treated like whitespace} { set h [tkhtml_test_widget] $h clear $h parse "<br id\n=\n\" 5 \"\n>" $h token list 1.0 end } {0 {{Markup br id { 5 }}}} ::tcltest::test html-3.22 {Markup arguments without values} { set h [tkhtml_test_widget] $h clear $h parse "<br clear >" $h token list 1.0 end } {0 {{Markup br clear {}}}} ::tcltest::test html-3.23 {Markup arguments without values} { set h [tkhtml_test_widget] $h clear $h parse "<br clear id=9>" $h token list 1.0 end } {0 {{Markup br clear {} id 9}}} ::tcltest::test html-3.24 {XHTML style / at the end of markup} { set h [tkhtml_test_widget] $h clear $h parse {<br clear="both"/>} $h token list 1.0 end } {0 {{Markup br clear both}}} ::tcltest::test html-3.25 {XHTML style / at the end of markup} { set h [tkhtml_test_widget] $h clear $h parse {<br />} $h token list 1.0 end } {0 {{Markup br}}} ::tcltest::test html-3.26 {XHTML style / at the end of markup} { set h [tkhtml_test_widget] $h clear $h parse {<br/>} $h token list 1.0 end } {0 {{Markup br}}} ::tcltest::test html-3.27 {/ At the end of markup adds a second token} { set h [tkhtml_test_widget] $h clear $h parse {<p />} $h token list 1.0 end } {0 {{Markup p} {Markup /p}}} ::tcltest::test html-3.28 {/ at the end of markup adds a second token} { set h [tkhtml_test_widget] $h clear $h parse {<p/>} $h token list 1.0 end } {0 {{Markup p} {Markup /p}}} ::tcltest::test html-3.29 {/ not at the end of markup still work} { set h [tkhtml_test_widget] $h clear $h parse "<A href=\"\" /privacy.html=\"/privacy.html\">\n" $h token list 1.0 end } {0 {{Markup a href {} /privacy.html /privacy.html} {Space 1 1}}} ::tcltest::test html-3.30 {Incremental parsing} { set h [tkhtml_test_widget] $h clear set txt {<a href="" /privacy.html="none"/>Hello&amp;<p>} set len [string length $txt] for {set i 0} {$i<$len} {incr i} { $h parse [string index $txt $i] } $h token list 1.0 end } {0 {{Markup a href {} /privacy.html none} {Markup /a} {Text Hello&} {Markup p}}} ::tcltest::test html-3.31 {Searching for anchors} { set h [tkhtml_test_widget] $h clear $h parse { <a name="one">One</a> <a id="two">Two</a> <a href="three">Three</a> <a name="four" id="vier">Four</a> } update $h names } {0 {one two four}} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602245 016251� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602245 016252� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602245 016253� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602245 016254� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image1�����������������������������������������������������������������000644 �000765 �000000 �00000000052 07504443353 017342� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����������!����,��������;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image2�����������������������������������������������������������������000644 �000765 �000000 �00000034007 07504443353 017352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a<�*������!!!!)))))1Z11111R999BBBR9RRRcZcccsssss{Ɣ�)ޭ!�)tsu������������������������������������������������������������tsu! NETSCAPE2.0���!P�?�,����<���H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJ* (0`+KlCY(ʶkjU<0Kݦhնʷ* L8V\uqLk3v˹c̖CmӛEװ K1g*$³m7 r,sz9W }ν;70ξ=Qm 8{Z�U^y߁x t|.ZxmqU zaE!0n4PV}& -c~6)$�]oYddM9-IW9%`|T™%P %$&pNT[=@u|Z`j~&BƩhCZ~W>ZZh&zAVd]^۩)Ҩ*tj�ছ@*P}&$kJe}r1@Vyu`drBTT\@k|J䀃rVe@˪Ь@~&Oi+[sj l;lZ0IAhª@D�@[ D1C{[0-hh~b t4�(+.Vhbo \"!? t !,�]zh"3tt/-r0.VKLݴkm`17\v/if ݦx%pJWXd9j:͂@iZ(g5A(4Vh^'d 4k\;�\1u_5Jynǎp Ct~ ` J4A<ߞ72PqlY$g1) mz@ϞW~Ir\61t<v&UcW"v XPnKإg뱏Sc 0i {a\BЈe50na,,Av [<$[ ՓF-wVW`dn\2%O&6+5 is!DLF!X~}p\S!39/hh9U[rCB-#fKq4C%rh:2ԙ*{9=L!ZFa&+�[2m1#AFC_/QU|^(ܤU�Xƿz0"sa/òCfp\7DY�TBa=} g X44�`ުih\0GڥtD֢̭@ n`!_$YSI9KMcq= \9r2ZAP&ƒkb"eզq%l(_>4Az10qK@wE [([CUWL+&ߔÁ(Ԡp- yw&3bt4̚qfeJ-R=d *CA1tjߔ4ꓭ%PUWyVme%\@Ih:j؆U+&6^guՒ6~:_-=<ֱ[-5r"D5I�N ~@[Q#(p=nX%]m(ڜ9T<kFH >=L9) W[a"X`7J5"z-&,J;Ugh[Zwڷ/E',_2M(MLB$S>ө!|AP+mr*tij^6Fmqg,^bj Zǩ\F".-fF\}\`0)ZiO;Jf�D2>.؛3sS -hsLOL"dz.2T%0jOhlόHaRyƵ\!/Zv$uh:%RY\9Ltη(KL2\ xGNI$v$qAVa$E$>@a9&Y Z7!W0g$],Qf^sgCncMGv<﹩Clэ~'ZS~yMe{7H:ANh{tJv׷L&Shi{.v(2NxZI:ߗ>\ǒ�[ Oyʀo|ϼ;_|K2+Oz~J嫴T�2KOW=[k}<f_O,{}5o_C*`>zx|B==So Ѫt M] �9۟\eN%f~~tGV0c j1sth|9S)e3116E/F7y ��!�?�, ��5���H*\ȰÇ#JHŋ3jQ  @Ǔ(S\ɲ˗0cB,@A# 0`2 JѣH'x�DF) $$ʵׯ` <�۷p5`ԻPG-pS�r LEg@b KL Nl 8 زӨS0:obQ1KPAcsm]Mƒz+_μ0kPKqQDnν ZxЎwξ G.ϿĦDY6I߂ 6@|P„H ^d6BGICX[ H (@pJ p#}P72@V%(9 P>VWpLIV_BL`PL: &Pٟne#eXߐ8)T$FVjm١9"Pzŧtg@~PTx�%X[iX`Ф�<�ڬ@eE@檆 �@VIyv PA2脌jc 4)8~*Lf#"+P ,쇴}a]aafj i&ΉA|6,�{7[^T쬾r%4�*i Z # $u ,.h,Tj$ԃ Zس\m,RQJMgڵ�̆fZ)YV0m{]іi7B:Zsm@mq IK"@aE)jxATZk�MbZp{7 LhSnkb]hIP С c0,:~}K ʚQH- Faf <g/:gTp4u{rW$;**x* ' dz)lF98%4SfW:F #C\ae Kv0�`E-JdxQ 6 pg3D>pkB@QԞh=Q%8@“eq}E`h9C}5Kժf% HHW:rPFMf�p*}s0֘aa-ܲE8 G@Q+&!K 90�R!aI2+WdAR$�pHKNŤF"S"Ȧ'E oBCPrn&1R`B?&;NƔ$͏ ɯ*VPL<nTI]qۺ0h&Oz/\4m תXIQopTbqK�a'{ʋqweAPIlJ' dW+Z8iF@HmzҔ$� ک#vA**9p�l2H"ġ`8:5ܢCb� ,6q{)D 3�s*.U]:M`yT_V3UҚPRPDcR+ Q9 @TED>oFdK`Ӷ ą^ji|-124!5JmTg夭�3щ`IkfZ gsjCY%9.(]o$Zd S'jZj/F&K;M%Mq0d^щp;a0Z:UKzL:d6zcj@v�3 *p&#DZjҖ'4aB^aR !mgi礐hKGԋE$,]%a2다Ө6Iuⷔ4�@1VJs7 7G: D/ G@B@\:6T8MJ9FLiRr|;9a:7;\BOHe^huZ~ruۡi)ӺmZpu#qҾZ]n~H [> 5�V4nj BvB8].*Nԧ2V)֘$FZh|U]׿zIi[%6mw e7!czrKhZSuG:wAJhի-J>(#Vצs R&4kxmKdAkٴZr}j?MJfkgo9!,/0wXgkw,1|}_ku&�GK%}DrXofU\('\f�4FAa'zEQ9%GN/z&<Ϗ$<ȟC;˧v1v Vö^ҀHp�WlwH R6ctBXjX� R>K A0hGj'q#.@ @�Pj5hm!?qT18IH|;X`HpYptdbp*N8VJXjE:/A*w4h! 5q2TN1%�x~,|h*�',S!h!r�CVX(8nhR(a%"hq-xhj؉$FO֨&(Z'8k'x3�}qMX $Pbx#:؏h({X}Q{؏BϷSXrR. Tt ِi*a=~b t2Cұ��!x�?�,��7���8A*\ȰÇ#JHŋ3jȱǏ '6H1Bȓ(S\ɲ˗0cR, I8sɳϟ-8xѣH*]TaMJJU ,ZyٳhF̺UP6 ڻxMZP$ÈQD!p$TkML  nױ]̠C;�^ͺTESDٵ۸sMxWs N|#c]\Q uS3uW)W؝ly ;z5pPO˶8i_GVD~ ES| `d1`Mfryl ~ ^4X8eggQG!y>$ ~aXdטmP~Vr`HC>܍).GWAgNbWZ}iV$~#y`3"D~yYחrhcI֎bbhHݡ(9FJ׀z>e)h՚:f㦓)uvv颸zToY8+)XSykqjjRyըyfڹjeWT`X|cf+$]ǘjh�+�h+WZj J">- )jV,`y&%A y<aEpB:0Ⱦ{6 5,[,4D5 fQxkxN5c t̴TC>L`βߧeQ_]&ۧ}_`wm5*'k8z3j倊9k4ޓS+c"*vǞ%zD^f./o'7G/Wogw/o觯/o� �Hr/ ��!x�?�,�����B*\ȰÇ#JHŋ3jȱǏ CIA �R$$ɲ˗0cʜI͌R4�ϟ@ J(K)*]ʴӧP%Dg +y6hʨ`ÊKl=s T),:ʝKݏpM7Ww L,Ҷp]˶ǐ#< W;1K̹g ]ӨSwsqiYU˞Mk<M3YDM~ o+_­̣KrZW+^ëio{q-o>.ޞf}7A(QNp%B/! \ .m (b: \É0MaCvHpR: U !G !Ky1zUDe! T$%Ӑ ɤnGUv+Ћ#ĥFPڈUKMVX\Y&`26Vg]n1hg*'eg[*hz`MŖZȕA]Mfy&(q)z(qwjlAVA'm1JqI Q'V)8^66 2Id{.Iy=۴ERCr cmPܢ"} kvںIʐ8"di~p{/F&ʛeRZq+) d?Lqe('+ / %m]i-o2[Li0h8Nk s6,J]/@mB[/<qmF\`{@*N\dB 򚙋M3*Vnb4 hhkE\bk;zx1vTL%oP 7lTcy^Uky(}wirm+nrԶ"VW`wDJ4�B^hpST-/E_3 RBAf(zfUsA4 S {UWn/,~D;,ٗ4mF͚'@EN}+r7guvcntALɀ(K8# ;2jdg:݁P7 z tƄA*ajZZΕ)\dABEi}:Űx1+Җt#-YS =-d)%2v8;Iw:( 3Nvqp*#&<>\/Z]a/k +$F[Tvg08̙8f0sTVkZ1X#R}LyN>D P rx\%<iBN,b!nQ~@BFJg͘jQu*{2hyDE6П͍͋XQ;ecCX!+5tc#&=I1w2Ixg{,KTfWc.g"]hk#f[į2lF<(bē=[5 6cY b &[r: G&RњWSJ'Z ��!x�?�,�(�����H` Zh@Pa�V`@ *TЂŇ?I#ɓ(#XE *W2I)ldR'D>SYAъ-y֌bf A?҄ rKQzD]69ŕwD8v α A* RmM2m;kƱ λ$FkAB~2ֈbn,3R0`,+t9U�eev9+‡,7wK:8Qx~sџ7ȳzQ=p7u{ltze[=D7";5SK5t;QtO7[|n䠄]Q)_55pBnSrfU]K)i�GL[]NM|nȔU<.$xƖNeTY (Z 7 E~CmY`bn!U _qdf }# Xjb]erP8fbYf!ZYdEEހ0#"q|)qvJwY{piqU&*܈rvoU=(%qJZ] b2z$Iz\E6WXaHj+.D86.koJޫo,[H�!�?�,�(�� ���HP lpPA#‰ZȑĎ %"Ĩ1I+~4)* s!͎4Kn|I3-Y6О4eSiK;6p—((rڱ*äQ [*:RKkp+'ũ3j EM8B.Tl JŎn{fVu0cȈd( GYhi*_٪=֊JRlswVZvH3l.}]Ek;9;m [:ֹ3afS2w7تBZs!dZfx0QD~Ŵt}7fP`*Q(_k-XLawꥇ_~6 VJXV| .u^T<.!s5`v \*d񅢇}x|F*("u\D�NęQdLG)5iYBh>V*VXH#^yU`#e靋<mi^T xwcЩiiS5"^q~\ՓX\I1jzUc>R Jap:+^Gpן,=*銏rVg\vB_iź8f .T Ym&֬юkcG^mVG ﭒx\vVWu'{6ZUØ]Ƨv��!�?�,���<���H`A2HÇ#JHŋ3jȱǏ CII"0ȲK"d0I͛8sɳϊ (0xIh?*]ʴӧP?Z*AQjʵׯ)FPXie %]˶۷1 -˒xt F�ѷÈ0 0$KLSt![̹gjL2 |׈Q�6;۸َےB?@`“+_n35̣Kqqسko|`ON�= gϿ_ ߀�,T r@ F(SgB†v $h%,08Œ H#h7#9(DhdE"y$LJFdSXf\�j([`PSlf馌ORI# xygzv'|9蟂 z>JxF褗XC&k x4e ^*kzp&y䌙6:)Vꫡ +l;lB,h.붳r:&[5ڄ&ަK" )bۢhl�,LpYg ㊭ނ:kykSR$w(r0,4l8s+r08]0:gޤ` YMm:{,'24[вln o-t߭w|ݶc\5#N-u':$ub;n騧^yֈt%N &"4k+"jȯw˯l3CK.cw/_}o=}^3Ʌ+Xc\n .40ӫX㑴|j}CF|kI|#% Hj߸jTP -IihZS :ѩ@b8q &Etb lݥlXNb_TE ic߬N4?q1S">H:x̣? Yro.K nB T`U.)!I{{8D (Ǻ'q;՘t;._M"�!-\kd U$Ȣ=}J'b\HիZ7e!JXb6a@psn* )- NL':שvg9Nysħ<B1@Z�MBA2,|ЈZE7j; C#NA PQ?$q^JS%NӣҖt@ElU;1mhF4iTT,uXmbdc€XW0b)Zbַ,S1\W] ^ʒR"W5!JdEd`�W��!�?�,���<���H`4XȰÇ#JHŋ3jȱǏ C^a(S\ɲ˗0_&I͛8sS$ b JQ@\ʴӧPfիXHPׯ`ÊֳhӞ@۷pjPUݻD˷_f 2È+hcdžKLyrǘF̹緗Y&Ġdk~^ͺ)E8Dr voN|ĥ.DUuW"<9 'j8ݵw ްx_;yd~IEW/U٥�B t` d{Ahw9zl!І}H_ WaN@~(B5 J(6R-d$]] Dx>.gׂrFׇ1.Qf߉#裉0:"{K8zAd 9ha鞄 -YMJ6 q'Fxe}[ry$tzl}IWIvt(@:ޙBP])leg>VeI \>8{-zT2(<{Vt a�qhzZ*fj˪b:-N-B#P(7MݞV (|z $Br*zzmb ߶w} !'{+C 8߉9 \Y%Om?yRme!Iv٘.u]*ܗ&(-  "ʡq"R+=h'٥GsGQA;Mhlz1bUݓފ+2إi:-R QR֝PWbs}{WhX*5v8.z͘~yLk熦:aaM|i};8]nh0TWbFrwk'4_ۺy˞sxB$~5}nS$5]u+s (u}c+!.}cZn",ߟ\E�eDg1iukXFaDG;@ H"HL8 {mE+"$z5RH>v A^t%LW4^>1ݢTg" ϋS!" pEkKc 1b ԫjt "OHf9f �IbC񕰌%tOlS!E,dR&#p\2 ( Ru5Ou:6 D g,BR7(M,] "3x\&`Z#G R4W&rVPxD1GSK.YE_Όc n-JVOȆ*$"SS.%шjh:nR|UȄzʣ""U1b@[B<zDՐF4R6Y"g <GZf! _Ueˌ궛*2R'k7U�Q5 *$FAdZ֯0]3Ӛ |k3&p}+EH $\qMGtR-6*8 9TW3ȻFm6%/7iVBT >;V즫ChFHK%5ZoW;DUdbgbOӮJ^%m4M抯oC[ >0# {8 -\<v)^ u;vԀN{lZ3S-*ySo <ZZ{U%UWc{^ƣr2C+&QxKzٸx! %Vط-r:Y/>j�&S\95/|$)ćWUcCǩ rDN6kjjD�mH|SlmiϳTȇ 1{,HsH TX<b:kx%1lZR:(^&-]�21NI չ;LwZӰ2!>HjBv'' )gdFPMj5i  Aqi$x=.m+#|نr*r{9^G.Me[5o]{$G2?S,t~+t x[=:&zCK`9ȯzހ|ʨ-}sL _g,Β|o1m }狜SinBS6G9Z"h=iˇJ׻HS"qWm1U%1@JW8|E[⪓.ƫ2xw8ϳ;}s$W )6\ej"jݲ\p<OgggF{~!yQ,Q\?wb%&|x5awv1Vm !{觀i9.eQFJ3QK,CjI=ee1!&a25(8GJ#el?g1?x%hgRg!xw Hr[(r.kg*gQ/؆}h/e !2 Bh'&+ J�U$%rc<f*q ,)7nCB/Ӈ[q'gжUx&xŅ!aWQN5o䆰DV es A?T,UqBiI!&hn Mv Cl"13txhՁ@lF"{ DžqW~6Ci "J)1MPu@AX)�9Yy 1QUp5sIvqxlHhUFUv2 eJnI+VYx)׆ZmW{&{8gn**Q&z!4 @v9w}׸#R6&)UYIf'ܥ)rbg^2(i`xtb&s~ ,eK(lƉr&{2uԦqSw 1~/) @#푑H2EEr9x}ۓi H*c )i U ,,eץRp)yhj#uxXa YqA)H#iQѲ%TRhہ, ԧVPh!lQ5R'޸x23a%Y*IQPuR1n&T%fэ(a9"m{qXfV)##l"RYqByQP֩9XIobiʝ=w' I"[f U UHIZ AVMڜM:(HGYx)B9yPҕbIa110h eizmz}. /YU"pBiAqS9/(?9f**,,2uϑGKI)2/iTJک=pSģʊ;ꩬ=hDZ>zJ_FG]'V: JʪTqΊ&ڬZ;"XҚAj7zl;��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image3�����������������������������������������������������������������000644 �000765 �000000 �00000042526 07504443353 017360� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a,A������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,����,A���5K'?~g/"ȱǏ Cn̘`>}>}DʜI͛8sI=}ĄB>K~HbIUԋHjLŬJٳh6T4q潓_oӒ{'oǐ#K`>L�kDn늒䜄F|c˞="AeJ#;i3GOٴiJPߣ]"&l!cs #ck1�&V=TSӊ(bGRN<CTv>M 4N>؃WegGOAG "0 `9אcU,X0"@q/p�=sDi:>c |L2-u@(p{ VPf`$_R 4�p3N9ԃ%'jHd|ҖC�`Sj/~d0#ݬN;o{ބg5ysH4ה#aJFjFJT�HLJ-�ps;u_T!KNlsK0hN<TztکlL9RSJ.lbCG :TVU&kҀТFtrK/τsV+7[:Ve>b-����", p:#K s$KN H+7̳Y?M_>�,B �4C 6>SǮx?F1j 4hka}wM�c}Qcyر#@0LE&l AL85wntB?͠hp +4=K_ut {Ύt �C< �V,%� `G:a"/^ cg`�Ƞ K G`O*="�G;#P�3P` V��="Vpq#B㗰$,\2P򑏄YK T�Fx":瞉"9qc"a7W -`>qfڇDYvÈ_1ȑn:9*cR'1<QUي%*kDDF1�}A *�xZ! e "@D8vHD?i֐8HP/z?\;yF8E$B7aH:)DG=$r+>W;}cĈQ pa *c5h *i lADRXFA18- =q)Ԫ#t" �@0 �&%1 Bt�h�<ԱdZΫq+PR8 v` 6c i!@�E 7є{D?J%!yȑԨJ!ʇX?r - 6Qspn,*UQǽLSĤD$0 a`A!!t"KUmDz8(P f! ؂+��^1T8 8;*48ep pIb4 Ёvc"%ukf�KdvHQ:�'(890 sL%t P 3&œ,FS hAtZSҺl1 @8X�Y{A%HXNc88@JP 1x h `01t(?D D!F*|эI p<Ρ{OܴNG �<HD"$q^`#@>!LjD`߀G0DqA:0`c?f(j+Xn">xCv"EVI2Aų�qb݈El#N-=ڑp)~FjB8ع�nЇ=Pb�$P( l\i,IwsG<@a&!@V w#$`C4�?$.q( E \ ~B_d,a%|>241`P%?l btp%Wa{< b 8R"1C/�nq$Oh0GdbE+p`(C4[`qb]">)d�'`΀ զŠ ڀkfS 0 C0�3 |``pX  �   2xt�yWP@ P [i?{~ !~"p0R?z#z{" (`@+p� Ȱ j�<` @ {e00,tJur!� |P` � P 7 �@ bxv%t\G?Pt@P���G� x* 0 Pu/=`  0 EP�8@ p ` pPZ :V ypPs\p ` 0� �p T ��|ϐO��@sH @0 @035:�(@ cgXp{π8@ p WpV @ H@*G遡!p6-@P `� }u� `tRk "01C�@L4m I%p�f�6G`C8@@P0 VP�i @ pF$`� I@DpM��M�@P E�AP ` TF%3Q� @ ?�Z l#[F�%|x@  h`au-��C ° P ̰ .�@i� �C6L%1{�2@�|�ӐP�P [P ` Im � Y�x0 W��$  � �PH0%[o�pe M@80Sj 11�@ ~PnP  p�0@ ǰ y� � K  [p  � #9aq)V4@��D ! ` PAFc!xsHa0 p %��@p@  U Ep�[` ٠ T!#3( 0 p� }� ڠ@� �P pU@[gP p,��&zP@G ` 0o* j7 I*?Ѻ@ [ p w}`@ S�p5`�g` P�#P�7@p s`@p 7LY,']%$? `p0�gD C8?<D*q.i p gp p W0�0@ �M0 P 0 2IC,%Ր�@6`~OP]`  `p u ݰ fp@c!L( @?0�` uP`p�;0 �ٴ0 Pup aP.P @  p P {[`=> p�MP~ . P  0 @  ZP;0�P;; X@C P ~, kRrH zp0!P� A�@0 p ݀dkA^ubakmc?@� �^0 `0fb�w �p P0E.Po你gu � `0YJ�N&  mL @0CO@h�@��d ` �( spPP�" _�� � m8�@0G7  d� � <@�!�}Pw 0Wp i]  @ Hp�P 0P` zp�p0w6DNPfphi]R 5@ip0  YP)�Q!1f0'Lp p zP�@›  ?��l P�0  A�I 0 p]0D2 x m  l`s ޠ j@"ń U ` `v�2xP pҀ + p# ��ҀaS4���� �.n�q `e0l� @ w� ` _g p a* P_m�.�Up � 0i@KGPEpJ^@w@`C�aP w0�?�Tapn@q 0 P _.#`;`0VP �0  0cI`P PFPH@Zmz B(ﰳ,PaZ0 @ Pȍ4 3a p% E`#P 09�'P`` y�-P@ 0� @zP ` 0�vСp&نjp� �%:`` �J s @0 P�t # 09p�!Pĉ` k��8� `Ҡ�b#;@[P 8 pEJUQ0S`АR@ �0p�mR(pj` �b P e000@ vGP}^QS+^q/!cC�0pr@;\�RP� -�P�aǒ-l 9#<S LjKֱ;($l �X4$qӦݿ) 6{c)M@M@W7H]aHS`vKոJ)�Q↘4EA-$ȓZJXUlVѳ @ 1$%N<eh ?n|#N|؄ 7;|wZ7"@^OlirdII[jM̄8 %:%Ml-[%T:pʦ'|sk'@!@ɹ ��@tg/0X$<�p-2� C_&7"!zXx`�qDE cR| �֘':zp� `f)Qvy�JqP 1ʀ;ȃf PC 5Pd^$r:�t@&A$Bqbb�>ƹ^l!dZaX agjQF\bY`@aFҩxoǜw|ʉZ1 .@ :� d@$R&*@z%[LYU:d.hau'~@f:) �@��\`�t[�XpSZQ|Ty�2pB <$^N�`TDIX` `đ. B<L؃>" 08Î>AdǕ(9X#NrN�cE�H}‰n�>P9e&@�V8�eg�@ `p�&"* > $~p`i&%�G iPTiT&ICv T\8F) 9  NbH.<@Z$ 8K0(0-@H{pd>d2c(1n@  `.0 �`0L"� #[0`3 dBF`*h?vpF9l qԠ * 2 ?A�4h8Va�G87 #* |� p1Ke.iC (:$z1l1P��+șj z$50��pF  ��20F3>�P@,NO�(A- D0BpPt�8!R eH*HQ2   Y j( a3�[(�0�A%H'`ыh"!AzCp |xBp0.ha wC`j$ n@� ,!F>quxL0BP" O@ qh) qC}4"�B@Bbp, th �Kl\lC &XP@a p0+\ᐆ/.h�#P$q� L E,>-@k: &8@2x(-J8`85{� lth0E7,�x��TUI2g Y`7qS "@p@IL*�� 8S!`7@B R"ِ>! 2`9 \;.   _BԀV1�<�$ BphNDs9t D<F8ʡgBWB  �4E0q jP#0G<kdH1J"DB2  a<h *h0|@_@7.248(1qtc؂ P� H6y#v` Ƞ6ԡ"�5H( O(Afq@Q�5p$ZQ�LHC  3K8! 0@(8‡DdkH: Kp&>F��*ob &0-aX""W>w<Q eE7p0a dCpIPB�P7XȀ j 0҆4@ j-%L1rCЅ-0_4y*hQ i<x)(ч: '+h1 `=hBҠ+}4" �# MݰP�%C>2Fp6� �sPx2BXxsw@\ 0(k,� c6>�JXce(�C phx�/X3`Xyx��$`+H>B(E@E[8x8)`-x06X2SD#0;>ilmIJ(<:8�8hh /`AE8Am{IrmHpu` #P8ERpYHca�-P@{D7(-�i�8 h!h-?Wjqh}(Is>3�(^ـ`HXlx� �>Oh|0u@�)XBH1��:؇_h X�<R/\�p-H@�Hh%+80p9�Nx\yXj])u5 ` Ȃ2_[(�9 Pj x=@PTH �xFp7HЄU(T Іp"�%0.(aKP � ~)@0EWxvn9�pd0`� `?BPJW�fxI;yyv@mv'X8AV j8�QCȀ5HKKE Xi#� P��#-P`^CЁHp�@�!'�L�VC�Sw=`4m( x8P 0sP7� { �(.3�o 00'�x�&P6p1ghQf�2湀EXe�(H�1B9=�yX H�YQ`\{�qX)`4-`#hi(�(�E>�F�p2/EUHfU`sH(&G(KXT`asysp ^t|( z`l09K>Daht8s4ZH�BL@ HBHpk �"( �z(8L. ("`-�w4^9�Ro�|(+@C T'ZDc7� @nPY& Ʉk�$ଜ"� FH,H5\P6�8�qJH/0L(Am�8DlPEYw �7؅JH_qH�{2� P.HT8$�(PPZ&"0�`�P#@5�HF2"168�P NP`P5h} mh�5ir}Ȁ`<`>HU jpvTp(dXP9(L._؅^Vk0$��26%�&;�1{gh# x9x8F_JT(JW�ȃ:Jr~#`:h.(DNH@l8Ʉk8 0<�i(@5(,(&K"T$TN"&x;_0X�PP؅FqJHm؆BZwX!�*MXV\Hh�3Ї܀ ,w$(�7 dX,h�5 *3PʉY4pЁP\�h|1 P8[@gtx ~p_:0F8\880SwЇ.`LHC8=HQzh�MG` JThmj�WxH``05X,�2C*� =Ql_pX&3-02XcP xcu�;0L~ȄX|�!H7xfApP8]�GA`�-`� hnЃ�83x?ȂE#(*x`;`2<AH?,x٩U؅;8�3,xL �3 ry+ hIP<fX/ q;#@ـ (o!6>M$H�` �!A�) �{p�6 ۊo0 0xvxa(m 6sPqp#0Da�{Ȼxxxr8'HG�ar�og<-@^H88�hX#z"؁0.pb: :t ��}Ѕ%(�`9Iv[@(؂#{6]8LLpw%�m(@@.3 P~`\ (*�hp p� <79؃<P+xr(VPj6@tP%P�*SHX8H$;0< �2 0`�p:p?"ЅM$ЃZ<N%]\+V7`(!ytPfL|).h2`qY H$ؾt@+Jnz(U`�6x� XMjOe8,=�<V@IC� �`� x4_��2GU?0HV0� 38>b?8�XA FPh%xkVa+(8WHȀ&׀Hj8M7H�CLcHP!6Ȃ�h\p?�|;@HYZB#� 8^J- � � {R�@^  c|`Dp�u�&X+(��E|=hvk1n ؀*,0&`C(� h@؃WGh8{+`Ih@|(�?\q8A(ԡ4� @[~kHlH`08LYr�| ' M:`<�k�0��@.8Dg�X)b*\P=ddKGg~��|QqӎXN�(!)Y5QV.@Un@D=z<�6"",^|{ԢP`)s�O҅* 4P{Fთl�4{d `#c@AdA``1aK l( +\=Pw1Ub@Qyw @)!CM4&\rT+ɘ?S�|S$#<c= @ M4vA!,b(0Gk �B#؂Pp3#9��$Z(Pvl�@'|PK /$S @-qJ>@�� bN4{�`@8% i�P#3K#XW&a10&'0B�(AS �D?XHfP�@r2qfu҇D. 4PbE"�/r! ,K?,I"ip�>L6ŠрsTI/ӨO~9�( EQ -s�$A$ 3:'�1.d@p 8ӏ=I�&\ "V BcH!bF!xф5xR ,T�cH jP5� ?{�B3A/�y S̶T�H0�Rdr�ܐ(PL!a x @B�$dcM01 /P \S0@IlS,`RM7Š d0;<!P0@r805T@=8"!^",i4h hs )`@�UЃHD( E\A��~Q=`jh&pr*?G= Za ȑ�X!P2[dA(!< mc2H�XX%� ]H; Il �$@!6 k G;�`j" Q|b D4͉�ÙX  hC�@ 찇h)?a$ f� A7d^#7F17`q _d%8A% N<5эspD Ђ9!pҀ!7 gbȆ;Q; ʰ,3 E�5PF/Ā�8ADR ��C g]#p2�-DbH%|�� A4Q>cB:p \ jm#D np`A"DQfcE>vl#X|*0ыp]8?�AA�HpG{@}@ ƐIك$Ё t $4_*�0Tb8$%Id�a#N`A-P@%l [4U�A#|�_@ I��!(BT deJ/ p� Pb-D ��D*@2� Yc�6f0�ȅ '^D#p3PQj�� X@�GrpG9l(( *�\+h W, )� ( � pl4$3"Af" Lъ`X#~y0F.bD +�"ȃ&@P7ꑏ~\@>@%СpF6Q|cF"n�\ �[ X�#pO�4 G:�`> ڃ$�&ͪAІ;A 5p>8B�)ha A$`�C@UP9kXF"d! q f ` qC!*kW8b gI`P/zn b?V�V0�DX* cp) 0�R���J$�@A0�P X Xr�  gC� LVpLT$�@M4"z` h8q8f^U"h@ lhHX$P& B ay臆jB �Ox P"ڸ5Q f`"@19!pA{8C0P@L॑DD%@a /�<aX,B&B,hB؋HHtȁ"B,B18/T�V�H�h��� 0�  Hh�#`B,hC1ByP � h�Ѐ-^�LT  L�A(26.؁ ��@�lAA< 4� -$A0)P,T4 2h:^^=C:4,)|&`B` �(@�`('B4>?+0H#p.0C8<G9d.$B\9A u"9`7X*P@@A,�� $�(ȟH0@ @ �@"A `$AA` $$B%B/$-4B�@p Rȁ,B+C3T8<C2#AġE ��h�B fE@<@ <d&p A �A [ A&0`5l7&p�D @#,|B!A`xT%� *3<?>=ă;C;8\C3 .)#(VL AQ.(7=|L>0_#B!P#hB)�4C>=6@1Ă#TXtAD'8C:>C97B%A$|&�$G&B)<p(H! A!%"t!XL8S!|/08G9B$pAԁ$38t40C1,x A( @ t04Dm�sAA PA�T@XAA'`AJ@@F6$&Ȃ6d6x6(,lDttB*)&0ȡP@i@A' 8^d7T)'@,p"x.9>b/+�C6=}?C:x4-ž  $,,8C><=q5+ ( �B$/-n&8(18-&TB#,A $X'D=!8$BB A!,Bp@A>F¢2 3 H0Ȃ)PB $" D)4:;l1B-(p#$B!B"4" B 8, �Ax! À4K]h 8A p@ pAAAc"('1l:8`C2+l$,B& B-�Å2'H!x\@:vB/p:?螢>C<LqC4,k'X#\+RB)B2:;:7,n5t)U>C;4 .&H$8#0#L&x(1h9?C>50/(t#l',B2,Ă,؂,*4C1,&<Ў%|+Bg)p+B)(xB&*<nR! h7:4p*|B%,2"`$T(B]e'><$4-(D#4%P&\!!%X%l(|IB\ @0'@BF`z%@ x8;9h2*|% "0B!<B" {IC4 C-*B%8B"0$ pA%6tLt?C="z4,0*t&0"\(0T:h=tC5(C0�1<5�d?8B*B*B+,5;.8sz5(0B-B/2P6X4@C 10C5l6\4/*++$1C.32/T`2Hq*%d0]̾;8,2뺂iI*Bb0>?;C8XC3 +@b('B))B&T$`B)bB/B+'H 4Ah`J*31+V*)t&|B{4|<.03k+\Nc-B/07C97\30u)t$`D V*H98&)c?=8d3CU C9l5L,<|~dd:7./2D738<9l%3<5:8C7`C5\C͡96H2-/1D5X4T47|6345,CQ *U=p=9d4(/.Bo34x:CJo*2b541�bB+-B-?Y.43 .)TA B'^w68CC*),.++XV<x=C<6H20C.B0(C}k4;8p+'0ڶ<Z,P:@vdg>pjD) D<C720$41 4C<< 3G>=:;̃<D)n?l< 7dC5D368C< >78ǜ88;q+:ܭ;C#83]4TL-88:;299$8tw302C1&>p)C.u6P4PC�ۃ! ~<ǃ*:5@C1,34201HC7p:;6<C1B*|&@!A%782050C32H5: A<L_5<4dC8z<=o><Gx0*&̦�"/G6lv{ý6и6h=Yq<=~`=C̆7:J>"ڣ=~HMqs{?xъ|698C9C<̃;;<C;C< >e:xk7d'siFð <2?H<^s>w8z8H>v<=G[B5r*(K9Ѓ;|C7p6Xuwuw79Ñr=hߓ¿C˙Jn;30+((8G.~9^pm9@sGO%ܷO_>"'1bąՓ]yӷbE1̇_z;f͆Pk9/<w٣}1W?}cn];y5Nŋ'>e"DiSzIJkNl<U\y^yԍv dȒIţ.9t'F/zk_2O^veCFl1cɠaK'lɒ sE<y9N9u O(1NG8xMA#:QL)<;Yٷŧ>֯.)FIJ9b5~﨤+toQdz(z{XdQ*,n-?fm! , 6h:,OsɃK+Q:=ˊɦQ<N2I SO.uQ' c;hB(܊7|4ͅlKD|g|ix>:˂v8;.̉xvl\M)X5C}4P>JK^KR$E89(% Q)֤/t Xg %I{3VY8~߀63K`5X/gMXKm+1AtW/NO^Y=QP��;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image4�����������������������������������������������������������������000644 �000765 �000000 �00000000075 07504443353 017352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������!����,�������D�;�,�������L�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image5�����������������������������������������������������������������000644 �000765 �000000 �00000000311 07504443353 017344� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a������� 889YYZyy{������������������,������@~A 4ICR"ҡpp �(-P D@Jd *i{JFgԅ@BD^,Nu/i?\\VTCb*}c2a!�oBZ>8gtlJ1�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image6�����������������������������������������������������������������000644 �000765 �000000 �00000000326 07504443353 017353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a������� ,,)889PPRyy{������������,������@) RK!#DK�Pg1b&%m,/ϳ""I=V31`DA(!pA K)Ԋ$^qnL"d0P@aX-Ŵ_"sW([-FW*&e!k,gmW>Ag�}!�lnL1:�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image7�����������������������������������������������������������������000644 �000765 �000000 �00000000225 07504443353 017352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a������� 889yy{,������@b1eǔ*'6 捛%'r@ZQŋВRE 8)/S|OR#h-r rzEߞ�5+j$y �;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image8�����������������������������������������������������������������000644 �000765 �000000 �00000000313 07504443353 017351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������$$ DDA]]Z}}{������������������,������@A <I� aBH^®jo.NVDGD`{vEIpHFԡ2%Uf7*2XU`N^iB8X,RN+d%ua6np3;gp!l2zj�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page4/image9�����������������������������������������������������������������000644 �000765 �000000 �00000002740 07504443353 017360� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�+������333ff������f��3��33ff̙fff333������������������������������������������,�����+��` dihlp,tmx|?0:XcFSMp:ϧ(t:[8xup@ofIyqyyHwtRxlrj(np_@+M sh�{iQSsW/j"%#�%nLJjDpm'#l/jӽ&\&i{k�Wsm-] :j*x2ֻ']?Iu╰o#T1s`ȓ3,YUG�'.zL>|Iq%zj%P�(QTR5$,V}IAlVUέ[ 8@. Eke `XkLDEq'^ .(oр$ gE-YL>q߷cp2pg xi',p t�ZT5U,BP�FZMrb,9&G9rТo~>:D5^ϭd쉺"'g,tkm&'` (�$� w[� (B߭'Vl5,AZoekqW+@�38"̈׉<Xk 2ǂ#[p9Y(u]!4v@}_~iBgX,hJCGɣ|h7p nc%"�:z+ħ< `'v *4[v84Ii;J@X8jݡMV0.͢RbgIٝt*#n:B諪d%I"d9~hɸ~^}Tk $"6"މCrV .GVo )q:g6uNQ)j)!I_w"pG\+(HSUF  F?~*ц3*ԊVP9oQXYj@ @邀+ʩWj+wד^SX ugP#2lQǖg!˜ΰ`H-:2#BɖݭgP>>h<H,(ծ#֜kyٞ-&8 ^W vmy:C̾廉F3f]g3$ůjv5>`˚?M0/tۇFd <mZ�X� d\sҐ"c}j*H.M~C텅v+~JA)_Ȣ@eB( ued,@" @j�>+0V\̃:ta7ST c&H T "p!!J҈M$t9-x (GIRL*Wi��;��������������������������������saods9/tkhtml1.0/tests/page4/index.html�������������������������������������������������������������000644 �000765 �000000 �00000226756 07504443353 020276� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML="HTML" PUBLIC="PUBLIC" "-//W3C//DTD=""-//W3C//DTD" HTML="HTML" 4.0="4.0" Transitional//EN"="Transitional//EN""> <HTML> <HEAD> <TITLE>[fm] welcome to freshmeat.net</TITLE> <STYLE TYPE="text/css"><!-- A:link {text-decoration: none}A:visited{text-decoration:none}A:active{text-decoration:none}--></STYLE> </HEAD> <BODY MARGINWIDTH="0" MARGINHEIGHT="0" LEFTMARGIN="0" RIGHTMARGIN="0" TOPMARGIN="0" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#336699" VLINK="#336699" ALINK="#336699"> <BR><CENTER><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD WIDTH="1"><SCRIPT LANGUAGE="JAVASCRIPT"> <!-- now = new Date(); tail = now.getTime(); document.write("<IMG SRC='http://209.207.224.246/FreshMeat/Core/pc.gif?/index.php3," + tail + "' WIDTH=1 HEIGHT=1><BR>"); //--> </SCRIPT> <NOSCRIPT> <IMG SRC="image1" WIDTH="1" HEIGHT="1"><BR> </NOSCRIPT></TD></TR></TABLE> <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD WIDTH="468"><SCRIPT LANGUAGE="JAVASCRIPT"> <!-- now = new Date(); tail = now.getTime(); AltText = "\"Please click here.\""; document.write("<A HREF='http://ads.freshmeat.net/cgi-bin/ad_click.pl?index,tsof0001en'>") document.write("<IMG SRC='http://ads.freshmeat.net/tsof0001en.gif?" + tail + "' WIDTH=468 HEIGHT=60 ALT=" + AltText + "></A><BR>"); //--> </SCRIPT> <NOSCRIPT> <A HREF="http://ads.freshmeat.net/cgi-bin/ad_click.pl?index,tsof0001en"><IMG SRC="image2" WIDTH="468" HEIGHT="60" ALT="Please click here."></A><BR> </NOSCRIPT></TD></TR></TABLE> <TABLE CELLSPACING="0" CELLPADDING="2" BORDER="0" WIDTH="97%"><TR> <TD ALIGN="left" VALIGN="bottom"><A HREF="/"><IMG SRC="image3" BORDER="0" ALT="freshmeat.net" WIDTH="300" HEIGHT="65"></A></TD> <TD VALIGN="bottom" ALIGN="left" ROWSPAN="2"><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <FORM METHOD="get" ACTION="/search.php3"> <SMALL>find: <INPUT TYPE="text" SIZE="15" NAME="query"></SMALL></FORM></FONT></TD> <TD ALIGN="right" VALIGN="bottom"><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <A HREF="http://www.linux.com"><FONT COLOR="#000000"><B><SMALL>linux.com partner</SMALL></B></FONT></A><BR> <TABLE CELLSPACING="0" CELLPADDING="1" BORDER="0" WIDTH="100%"><TR> <TD ALIGN="right"><SMALL><NOBR><FONT FACE="Lucida,Verdana,Helvetica,Arial"><B><A HREF="/">news</A> |<BR> <A HREF="/appindex/">appindex</A> |<BR> <A HREF="/editorials/">editorials</A> |</B></FONT></NOBR></SMALL></TD> <TD ALIGN="right"><SMALL><NOBR><FONT FACE="Lucida,Verdana,Helvetica,Arial"><B><A HREF="/lounge/">lounge</A> |<BR> <A HREF="/contrib.php3">contribute</A> |<BR> <A HREF="/feedback.php3">feedback</A> |</B></FONT></NOBR></SMALL></TD> <TD ALIGN="right"><SMALL><NOBR><FONT FACE="Lucida,Verdana,Helvetica,Arial"><B><A HREF="/about.php3">about</A> |<BR> <A HREF="/awards.php3">awards</A> |<BR> <A HREF="/faq.php3">FAQ</A> |</B></FONT></NOBR></SMALL></TD> </TR></TABLE></TD> </TR></TABLE> <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"> <TR BGCOLOR="#000000"><TD><IMG SRC="image4" WIDTH="1" HEIGHT="2" ALT=""></TD></TR></TABLE> <TABLE CELLSPACING="0" CELLPADDING="3" BORDER="0" WIDTH="100%" BGCOLOR="#BBDDFF"> <TR><TD ALIGN="center" VALIGN="top"> <BR> <FONT FACE="Lucida,Verdana,Helvetica,Arial"> <SMALL><B>sort by: [ <A HREF="/news/2000/01/29/">date</A> | <A HREF="/news/list.php3?day=/2000/01/29/&orderby=name">name</A> | <A HREF="/news/list.php3?day=/2000/01/29/&orderby=urgency">urgency</A> ]</B></SMALL><BR></TD><TD>&nbsp;</TD></TR><TR><TD VALIGN="top" ALIGN="center"><FONT FACE="Lucida,Verdana,Helvetica,Arial"><TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">We should get this out of the door now</FONT></B><BR> <SMALL><B><A HREF="mailto:scoop@freshmeat.net">scoop</A> - January 29th 2000, 23:59 EST</B></SMALL> <P>Everyone else is talking about it, so we should announce it ourselves before you start to think it's a government hoax. <A HREF="http://server51.freshmeat.net/">Server 51</A> is our new hosting service for Open Source projects, based on Super Cool Space Alien Technology(TM). We hadn't planned to announce it quite so soon, and it's still in the alpha stage as we work day and night at integrating SCSAT with our terrestrial systems, but feel free to take a look around and see what's going on. When we're out of the testing stage and ready to make room for your project, we'll send word via your implants. Be listening. <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949208399.html">comments (8)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>Category: freshmeat </SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://server51.freshmeat.net"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">Is Linux for Crazies?</FONT></B><BR> <SMALL><B><A HREF="mailto:jeff.covey@pobox.com">jeff covey</A> - January 29th 2000, 23:59 EST</B></SMALL> <P>Ray Woodcock writes: "In terms relevant to Linux, this freshmeat editorial glances at the tendency of mainstream viewpoints to dismiss other viewpoints as 'fringe,' the propensity of dissident movements to splinter into factions before they can effectively counter their primary adversaries, and the difficulty of creating stability without squelching curiosity." <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949208340.html">comments (2), 2065 words in body</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>Category: Editorial </SMALL></B></FONT></FONT></TD><TD ALIGN="right"> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">RabbIT 2.0.2</FONT></B><BR> <SMALL><B><A HREF="mailto:d94-rol@nada.kth.se">Ernimril</A> - January 29th 2000, 18:29 EST</B></SMALL> <DIV ALIGN="justify"><P>RabbIt is the mutating, caching webproxy which is used to speed up surfing over slow links like modems. It does this by removing advertising and background images and scaling down images to low quality JPEGs. RabbIT is written in Java and should be able to run on any platform. It does depend upon an image converter if imagescaleing is on. The recommended image converter is "convert" from the ImageMagick package.</DIV> <P><B>Changes:</B> Fixes have been made for a few bugs concerning keep alive and the HTTP response header, a bug with NT and cache directories, a bug concerning requests without a response body, a bug in GZIPHandler that caused it to not gzip already compressed (gzip or compress) streams, a bug in HTTPHeader regarding response phrases that are multiline, and a few bugs in ImageHandler and NCache. GZIPHandler has been built as an intermediate(*) to FilterHandler (this means that it is possible to gzip text/plain, etc., without filtering those streams) uuencoding has been added to the Coder, RabbIT now uses HTTP/1.1, HTMLParser now compiles cleanly with Jikes, and GeneralHeader has been created to allow for HTTPFooter (which is useful when sending chunked data). <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949188564.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: freely distributable</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/daemons/proxy.html"><FONT COLOR="#FFFFFF">Daemons/Proxy</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/902659138/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/902659138/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/1998/08/09/902659138.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">nmpg 1.1.3</FONT></B><BR> <SMALL><B><A HREF="mailto:narkos@linuxmail.org">Joel Lindau</A> - January 29th 2000, 18:18 EST</B></SMALL> <DIV ALIGN="justify"><P>nmpg is a small command-driven frontend and network-jukebox for mpg123.</DIV> <P><B>Changes:</B> Bugfixes, better memory managment, a new .nmpgrc parser, and new options. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949187896.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: OpenSource</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/sound.html"><FONT COLOR="#FFFFFF">Console/Sound</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/935430877/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/935430877/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/935430877/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/08/23/935430877.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">mod_dtcl 0.7.3</FONT></B><BR> <SMALL><B><A HREF="mailto:davidw@prosa.it">David Welton</A> - January 29th 2000, 18:11 EST</B></SMALL> <DIV ALIGN="justify"><P>Mod_dtcl is a free/open source implementation of server-parsed Tcl under Apache. It allows you to tightly integrate HTML with Tcl, a widely-used scripting language with many years of development invested in it. There are also many external Tcl modules that you can load into mod_dtcl, to create images, access databases, etc.</DIV> <P><B>Changes:</B> A major overhaul of header handling and internal buffering, and the addition of the ability to handle binary data. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949187471.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/web/development.html"><FONT COLOR="#FFFFFF">Web/Development</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/917925309/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/917925309/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/917925309/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/02/01/917925309.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">CoreLinux++ 0.4.6</FONT></B><BR> <SMALL><B><A HREF="mailto:frankc@users.sourceforge.net">Frank V. Castellucci</A> - January 29th 2000, 18:07 EST</B></SMALL> <DIV ALIGN="justify"><P>CoreLinux++ is an initiative to normalize methods and conventions for OOA/OOD/C++ development for Linux, materialized in a set of Open Source C++ class libraries (libcorelinux++ and libcoreframework++) to support common patterns and exploit the C++ standards.</DIV> <P><B>Changes:</B> This release adds AbstractFactory and AssociativeIterator analysis, design, implementations, test code, a CVS daily tarball, a Patch Submission facility and updated FAQ, Web Pages, and defect reporting guidelines. <P><B>Urgency:</B> medium <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949187233.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: LGPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/development/libraries.html"><FONT COLOR="#FFFFFF">Development/Libraries</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/944077775/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/944077775/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/944077775/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/12/01/944077775.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">scribe 0.2</FONT></B><BR> <SMALL><B><A HREF="mailto:kahlage@logoncafe.net">ChromeBob</A> - January 29th 2000, 12:12 EST</B></SMALL> <DIV ALIGN="justify"><P>scribe writes functions prototypes for your C code, so you don't have to. It also compares unique functions between source code files and will 'extern' when appropriate. C++ methods support is also planned.</DIV> <P><B>Changes:</B> A fix for an fflush() bug and better documentation. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949165962.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/development/tools.html"><FONT COLOR="#FFFFFF">Development/Tools</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/946661656/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/946661656/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/1999/12/31/946661656.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">E theme updater 0.1</FONT></B><BR> <SMALL><B><A HREF="mailto:hallvar@ii.uib.no">Hallvar Helleseth</A> - January 29th 2000, 12:04 EST</B></SMALL> <DIV ALIGN="justify"><P>E theme Updater is a bash script to automatically update all of your Enlightenment themes from e.themes.org.</DIV> <P><B>Changes:</B> Initial release. <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949165472.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/misc.html"><FONT COLOR="#FFFFFF">Console/Misc</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/949164501/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/949164501/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/2000/01/29/949164501.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">Powertweak-Linux 0.1.7</FONT></B><BR> <SMALL><B><A HREF="mailto:dave@denial.force9.co.uk">Dave Jones</A> - January 29th 2000, 12:03 EST</B></SMALL> <DIV ALIGN="justify"><P>Powertweak-Linux is a port of the Microsoft Windows tool of the same name rewritten from the ground up. Its main function is to tune your system to its optimal performance settings. Currently, it tunes PCI chipsets and can set /proc/sys entries.</DIV> <P><B>Changes:</B> A major GUI overhaul, the ability to generate configuration files, extended PCI information tabs, extra information support for the Matrox G200, and numerous other bugfixes & improvements. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949165416.html">comments (2)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/system.html"><FONT COLOR="#FFFFFF">Console/System</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/930836224/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/930836224/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/930836224/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/07/01/930836224.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">Pexeso Beta</FONT></B><BR> <SMALL><B><A HREF="mailto:pavolkrigler@pobox.sk">Pavol Krigler</A> - January 29th 2000, 11:55 EST</B></SMALL> <DIV ALIGN="justify"><P>pexeso is a simple graphic card game for one or two players.</DIV> <P><B>Changes:</B> Initial public release. <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164956.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: Freeware</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/games.html"><FONT COLOR="#FFFFFF">Console/Games</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/949141436/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/949141436/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/2000/01/29/949141436.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">XZX 2.9.2</FONT></B><BR> <SMALL><B><A HREF="mailto:Erik.Kunze@fantasy.muc.de">E. Kunze</A> - January 29th 2000, 11:54 EST</B></SMALL> <DIV ALIGN="justify"><P>XZX is a portable emulator of ZX Spectrum 48K/128K/+3 (8-bit home computers made by Sir Clive Sinclair) and Pentagon/Scorpion (Spectrum clones made in Russia) for machines running UNIX and the X Window system. XZX is completely written in C and emulates Spectrum 48K, 128K, +2 and +3, Pentagon and Scorpion, Interface I with up to 8 microdrives, Multiface 128 and Multiface 3, BetaDisk 128 interface by Technology Research Ltd with 4 disk drives, +D interface by Miles Gordon Technology with 2 disk drives, Kempston mouse, Kempston joystick and built-in machine code monitor.</DIV> <P><B>Changes:</B> Lots of feature improvement and bug fixes. Most parts of the audio support has been rewritten for different UNICES. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164896.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: Shareware</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/x11/emulators.html"><FONT COLOR="#FFFFFF">X11/Emulators</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/936956384/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/936956384/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/936956384/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/09/10/936956384.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">DistroLib 0.4</FONT></B><BR> <SMALL><B><A HREF="mailto:phir@gcu-squad.org">PhiR</A> - January 29th 2000, 11:54 EST</B></SMALL> <DIV ALIGN="justify"><P>DistroLib is an abstraction library designed to make the development of distributed application easier. Its main target is currently compute-bound tasks based on a one server, many clients model (much like distributed.net), but it is quite generic and could be used for any client/server app. It is lightweight, easy-to-use, and relies heavily on threads.</DIV> <P><B>Changes:</B> Important bug fixes and command history support. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164869.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/development/libraries.html"><FONT COLOR="#FFFFFF">Development/Libraries</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/942588431/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/942588431/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/942588431/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/11/14/942588431.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">ToutDoux 1.1.7</FONT></B><BR> <SMALL><B><A HREF="mailto:yeupou@altern.org">yeupou</A> - January 29th 2000, 11:54 EST</B></SMALL> <DIV ALIGN="justify"><P>ToutDoux is a project manager which lets you design a plan of action using a tree structure, with translations in French and English.</DIV> <P><B>Changes:</B> A new menu and XML standard for save files. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164843.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/gnome/tools.html"><FONT COLOR="#FFFFFF">GNOME/Tools</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/944433411/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/944433411/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/1999/12/05/944433411.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">goMP 1.0.3</FONT></B><BR> <SMALL><B><A HREF="mailto:dioxine@poulet.org">Gautier</A> - January 29th 2000, 11:52 EST</B></SMALL> <DIV ALIGN="justify"><P>goMP is a set of CGI scripts that allows you to remotely control, via a Web browser, a computer acting as an MP3 jukebox. This program is very useful for someone who's got a dedicated computer with a lot of MP3 files but that doesn't have any output and input devices except network and sound card. It's main advantages are built-in cataloging, fast access to music, and no special software needed on the client side.</DIV> <P><B>Changes:</B> Bugfixes, a password-protected config page, basic search function, easier installation thanks to an install script, and relocation of HTML docs and CGIs to a subdirectory. <P><B>Urgency:</B> medium <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164772.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: Artistic</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/web/tools.html"><FONT COLOR="#FFFFFF">Web/Tools</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/948492962/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/948492962/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/948492962/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/2000/01/21/948492962.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">APSEND 1.40</FONT></B><BR> <SMALL><B><A HREF="mailto:sventek@gmx.net">M.K.</A> - January 29th 2000, 11:50 EST</B></SMALL> <DIV ALIGN="justify"><P>APSEND is a TCP/IP packet sender to test firewalls and other network applications. It also includes a syn flood option, the land DoS attack, and a DoS attack against tcpdump running on a UNIX-based system. Future updates will include support for a scripting language to construct TCP packets and a few more options and protocols like UDP and ICMP. A port of APSEND from Perl to C is planned as well.</DIV> <P><B>Changes:</B> The stream attack, bugfixes, and rewrites for parts of the code. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164633.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/networking.html"><FONT COLOR="#FFFFFF">Console/Networking</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/941654429/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/941654429/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/941654429/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/11/03/941654429.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">ecasound 1.6.12r10</FONT></B><BR> <SMALL><B><A HREF="mailto:kaiv@wakkanet.fi">Kai Vehmanen</A> - January 29th 2000, 11:48 EST</B></SMALL> <DIV ALIGN="justify"><P>Ecasound is a software package designed for multitrack audio processing. It can be used for simple tasks like audio playback, recording and format conversions, as well as for multitrack effect processing, mixing, recording and signal recycling. Ecasound supports a wide range of audio inputs, outputs and effect algorithms. Ecasound has a chain-based design that allows effects to be easily combined both in series and in parallel. Oscillators and MIDI-CCs can be used for controlling effect parameters. Includes a versatile console mode interface, a Qt-based X-interface and various command-line utils suitable for batch processing.</DIV> <P><B>Changes:</B> Support for 24- and 32-bit audio formats and for ALSA 0.5, multichannel noisegate, a new 2nd order lowpass filter, some ia-mode commands, and various bugfixes and low-level improvements. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164529.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/sound.html"><FONT COLOR="#FFFFFF">Console/Sound</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/931819147/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/931819147/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/931819147/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/07/12/931819147.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">SCEZ 20000129</FONT></B><BR> <SMALL><B><A HREF="mailto:m032@mbsks.franken.de">endergone Zwiebeltuete</A> - January 29th 2000, 11:46 EST</B></SMALL> <DIV ALIGN="justify"><P>SCEZ is a library that should make the handling of smart cards (not memory cards) and card readers as simple as possible and be at the same time small and easily portable. Currently supported are Dumb Mouse, CT-API and Towitoko readers and Schlumberger Cryptoflex, Gemplus GPK4000, GSM SIM and Telesec SigG cards. A PKCS#15 implementation is in the design phase. There are ports to PalmOS and MS-Windows available.</DIV> <P><B>Changes:</B> More card and reader drivers, and an application to read out GSM SIM card (phone book and SMS) and write it to the card. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164394.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: BSD type</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/development/libraries.html"><FONT COLOR="#FFFFFF">Development/Libraries</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/939677525/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/939677525/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/1999/10/11/939677525.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">Comicq 0.2.0</FONT></B><BR> <SMALL><B><A HREF="mailto:terminal6@submail.net">Terminal6</A> - January 29th 2000, 11:45 EST</B></SMALL> <DIV ALIGN="justify"><P>COMICQ is a command line ICQ messaging tool that allows a user to connect to ICQ using your UIN and password, then sends a message to the destination UIN.</DIV> <P><B>Changes:</B> Several bugfixes, icq99a compliance, and a new option --ip that allows you to get any user's IP by their UIN. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164350.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/communication.html"><FONT COLOR="#FFFFFF">Console/Communication</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/948389309/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/948389309/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="/appindex/2000/01/20/948389309.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">senv 0.2</FONT></B><BR> <SMALL><B><A HREF="mailto:kojak@ids.pl">Zbyszek Sobiecki</A> - January 29th 2000, 11:44 EST</B></SMALL> <DIV ALIGN="justify"><P>Senv allows you to run programs with a specified environment. It can set uid, gid, root directory, working directory, limits, and environment variables. It is useful in init scripts and as a shell for users for setting resource limits and environment variables. You can create sets of configurations and specify the one to use from command line.</DIV> <P><B>Changes:</B> Login shell limits and environment setting for users, permanent resource limits for specified groups of users and environment variables, and other minor bugfixes. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949164259.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: GPL</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/console/administration.html"><FONT COLOR="#FFFFFF">Console/Administration</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/944953892/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/changelog/944953892/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/12/11/944953892.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="97%" BORDER="0" BGCOLOR="#000000"><TR><TD COLSPAN="2"> <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#FFFFFF"> <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B><FONT SIZE="+2">XZX 2.9.2</FONT></B><BR> <SMALL><B><A HREF="mailto:Erik.Kunze@fantasy.muc.de">E. Kunze</A> - January 29th 2000, 10:55 EST</B></SMALL> <DIV ALIGN="justify"><P>XZX is a portable emulator of ZX Spectrum 48K/128K/+3 (8-bit home computers made by Sir Clive Sinclair) and Pentagon/Scorpion (Spectrum clones made in Russia) for machines running UNIX and the X Window system. XZX is completely written in C and emulates Spectrum 48K, 128K, +2 and +3, Pentagon and Scorpion, Interface I with up to 8 microdrives, Multiface 128 and Multiface 3, BetaDisk 128 interface by Technology Research Ltd with 4 disk drives, +D interface by Miles Gordon Technology with 2 disk drives, Kempston mouse, Kempston joystick and built-in machine code monitor.</DIV> <P><B>Changes:</B> Lots of feature improvement and bug fixes. Most parts of the audio support has been rewritten for different UNICES. <P><B>Urgency:</B> low <P ALIGN="right"><B>[ <A HREF="/news/2000/01/29/949161354.html">comments (0)</A> ]</B> </FONT></TD></TR></TABLE></TD></TR><TR><TD VALIGN="middle"> &nbsp;<FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#FFFFFF"><B><SMALL>License: Shareware</SMALL></B><BR> <B><SMALL>&nbsp;Category: <A HREF="/appindex/x11/emulators.html"><FONT COLOR="#FFFFFF">X11/Emulators</FONT></A></SMALL></B></FONT></FONT></TD><TD ALIGN="right"> <A HREF="http://apps.freshmeat.net/download/936956384/"><IMG SRC="image6" WIDTH="21" HEIGHT="21" BORDER="0" ALT="download"></A> <A HREF="http://apps.freshmeat.net/homepage/936956384/"><IMG SRC="image5" WIDTH="21" HEIGHT="21" BORDER="0" ALT="homepage"></A> <A HREF="http://apps.freshmeat.net/changelog/936956384/"><IMG SRC="image8" WIDTH="21" HEIGHT="21" BORDER="0" ALT="changelog"></A> <A HREF="/appindex/1999/09/10/936956384.html"><IMG SRC="image7" WIDTH="21" HEIGHT="21" BORDER="0" ALT="appindex record"></A> &nbsp; </TD></TR></TABLE> <HR WIDTH="0" SIZE="0"> <P><SMALL><CENTER><B>[ <A HREF="/news/2000/01/29/">full page for today</A> | <A HREF="/news/2000/01/28/">yesterday's edition</A> ]</SMALL></B></CENTER></FONT></TD><TD WIDTH="27%" VALIGN="top" ALIGN="center"><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">navigator</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/29/"><FONT COLOR="#000000">full page for today</FONT></A><BR> - <A HREF="/news/2000/01/28/"><FONT COLOR="#000000">yesterday's edition</FONT></A><BR> - <A HREF="news://news.freshmeat.net/"><FONT COLOR="#000000"><B>new:</B> fm news via NNTP</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">eye catcher</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <B>Free Shirts</B><BR>We give away a free freshmeat t-shirt every week for the best comment added to an application announcement or story posted on freshmeat. <P><B>#freshmeat</B><BR>If you want to chat about what's new on freshmeat and hang out with other fm lounge lizards and the fm staff, head over to #freshmeat on irc.freshmeat.net, part of <A HREF="http://openprojects.nu/">The Open Projects Network</A>. &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">site notes</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/29/949208399.html"><FONT COLOR="#000000">We should get this out of the door now (Jan 29th)</FONT></A><BR> - <A HREF="/news/2000/01/01/946704535.html"><FONT COLOR="#000000">freshmeat Y2K report (Jan 01st)</FONT></A><BR> - <A HREF="/news/1999/08/16/934862340.html"><FONT COLOR="#000000">Assorted freshmeat notes (Aug 16th)</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">recent editorials</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/29/949208340.html"><FONT COLOR="#000000">Is Linux for Crazies? (Jan 29th)</FONT></A><BR> - <A HREF="/news/2000/01/22/948603540.html"><FONT COLOR="#000000">A New Business Plan for Free Software (Jan 22nd)</FONT></A><BR> - <A HREF="/news/2000/01/15/947998740.html"><FONT COLOR="#000000">Is Linux Going to Reunite the UNIX Market? (Jan 15th)</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">andover.net</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> <BR><CENTER><A HREF="http://andover.net"><IMG SRC="image9" BORDER="0" WIDTH="150" HEIGHT="43" ALT="Mirror Logo"></A></CENTER><P> - <A HREF="http://www.animfactory.com/"><FONT COLOR="#000000">Animation Factory</FONT></A><BR> - <A HREF="http://www.davecentral.com/"><FONT COLOR="#000000">DaveCentral</FONT></A><BR> - <A HREF="http://www.freecode.com/"><FONT COLOR="#000000">FreeCode</FONT></A><BR> - <A HREF="http://www.InternetTrafficReport.com/"><FONT COLOR="#000000">Internet Traffic Report</FONT></A><BR> - <A HREF="http://www.ITManagersJournal.com/"><FONT COLOR="#000000">IT Manager's Journal</FONT></A><BR> - <A HREF="http://www.mediabuilder.com/"><FONT COLOR="#000000">MediaBuilder</FONT></A><BR> - <A HREF="http://slashdot.org/"><FONT COLOR="#000000">Slashdot</FONT></A><BR> - <A HREF="http://www.slaughterhouse.com/"><FONT COLOR="#000000">Slaughterhouse</FONT></A><BR> - <A HREF="http://www.techmailings.com/"><FONT COLOR="#000000">TechMailings</FONT></A><BR> - <A HREF="http://www.techsightings.com/"><FONT COLOR="#000000">TechSightings</FONT></A><BR> <BR><CENTER><B>E-Commerce</B></CENTER><P> - <A HREF="http://www.thinkgeek.com"><FONT COLOR="#000000">ThinkGeek (Stuff for smart masses)</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000">supported sites</FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://www.userfriendly.org"><FONT COLOR="#000000">Userfriendly.org</FONT></A><BR> - <A HREF="http://www.securityfocus.com"><FONT COLOR="#000000">SecurityFocus</FONT></A><BR> - <A HREF="http://copyleft.net"><FONT COLOR="#000000">copyleft</FONT></A><BR> - <A HREF="http://filewatcher.org"><FONT COLOR="#000000">Filewatcher</FONT></A><BR> - <A HREF="http://www.linux.com"><FONT COLOR="#000000">Linux.com</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org"><FONT COLOR="#000000">LinuxTelephony</FONT></A><BR> - <A HREF="http://www.linuxtoday.com"><FONT COLOR="#000000">LinuxToday</FONT></A><BR> - <A HREF="http://openprojects.nu/services/irc.html"><FONT COLOR="#000000">Openprojects</FONT></A><BR> - <A HREF="http://www.32bitsonline.com"><FONT COLOR="#000000">32bitsonline</FONT></A><BR> - <A HREF="http://www.gnu.org"><FONT COLOR="#000000">The GNU Project</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="/news/2000/01/29/"><font color="#000000">saturday</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/29/949208399.html"><FONT COLOR="#000000">We should get this out of the door now</FONT></A><BR> - <A HREF="/news/2000/01/29/949208340.html"><FONT COLOR="#000000">Is Linux for Crazies?</FONT></A><BR> - <A HREF="/news/2000/01/29/949188564.html"><FONT COLOR="#000000">RabbIT 2.0.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949187896.html"><FONT COLOR="#000000">nmpg 1.1.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949187471.html"><FONT COLOR="#000000">mod_dtcl 0.7.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949187233.html"><FONT COLOR="#000000">CoreLinux++ 0.4.6</FONT></A><BR> - <A HREF="/news/2000/01/29/949165962.html"><FONT COLOR="#000000">scribe 0.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949165472.html"><FONT COLOR="#000000">E theme updater 0.1</FONT></A><BR> - <A HREF="/news/2000/01/29/949165416.html"><FONT COLOR="#000000">Powertweak-Linux 0.1.7</FONT></A><BR> - <A HREF="/news/2000/01/29/949164956.html"><FONT COLOR="#000000">Pexeso Beta</FONT></A><BR> - <A HREF="/news/2000/01/29/949164896.html"><FONT COLOR="#000000">XZX 2.9.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949164869.html"><FONT COLOR="#000000">DistroLib 0.4</FONT></A><BR> - <A HREF="/news/2000/01/29/949164843.html"><FONT COLOR="#000000">ToutDoux 1.1.7</FONT></A><BR> - <A HREF="/news/2000/01/29/949164772.html"><FONT COLOR="#000000">goMP 1.0.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949164633.html"><FONT COLOR="#000000">APSEND 1.40</FONT></A><BR> - <A HREF="/news/2000/01/29/949164529.html"><FONT COLOR="#000000">ecasound 1.6.12r10</FONT></A><BR> - <A HREF="/news/2000/01/29/949164394.html"><FONT COLOR="#000000">SCEZ 20000129</FONT></A><BR> - <A HREF="/news/2000/01/29/949164350.html"><FONT COLOR="#000000">Comicq 0.2.0</FONT></A><BR> - <A HREF="/news/2000/01/29/949164259.html"><FONT COLOR="#000000">senv 0.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949161354.html"><FONT COLOR="#000000">XZX 2.9.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949161036.html"><FONT COLOR="#000000">log4j 0.7.5</FONT></A><BR> - <A HREF="/news/2000/01/29/949156343.html"><FONT COLOR="#000000">SQN Linux 1.6</FONT></A><BR> - <A HREF="/news/2000/01/29/949156277.html"><FONT COLOR="#000000">Limo 0.3.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949156237.html"><FONT COLOR="#000000">Fusion GS 1.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949145887.html"><FONT COLOR="#000000">MMR 1.5.4</FONT></A><BR> - <A HREF="/news/2000/01/29/949142835.html"><FONT COLOR="#000000">KUPS 0.3.4</FONT></A><BR> - <A HREF="/news/2000/01/29/949142815.html"><FONT COLOR="#000000">3DSE patch for XMMS 4</FONT></A><BR> - <A HREF="/news/2000/01/29/949139763.html"><FONT COLOR="#000000">Linux 2.3.41</FONT></A><BR> - <A HREF="/news/2000/01/29/949139751.html"><FONT COLOR="#000000">Free Code for Linux S/390</FONT></A><BR> - <A HREF="/news/2000/01/29/949135979.html"><FONT COLOR="#000000">CircleMUD 3.0 beta patchlevel 17</FONT></A><BR> - <A HREF="/news/2000/01/29/949135938.html"><FONT COLOR="#000000">NiL Isn't Liero 000128</FONT></A><BR> - <A HREF="/news/2000/01/29/949135913.html"><FONT COLOR="#000000">OpenSSH Unix Port 1.2.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949135889.html"><FONT COLOR="#000000">KBoxes! 1.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949135867.html"><FONT COLOR="#000000">phpLanParty 0.23</FONT></A><BR> - <A HREF="/news/2000/01/29/949135509.html"><FONT COLOR="#000000">DGen/SDL 1.20</FONT></A><BR> - <A HREF="/news/2000/01/29/949135482.html"><FONT COLOR="#000000">EdcomLib 1.0 alpha 5</FONT></A><BR> - <A HREF="/news/2000/01/29/949135309.html"><FONT COLOR="#000000">Etherboot 4.4.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949135205.html"><FONT COLOR="#000000">BLADE 0.18.0</FONT></A><BR> - <A HREF="/news/2000/01/29/949135115.html"><FONT COLOR="#000000">Sapphire 0.13.7</FONT></A><BR> - <A HREF="/news/2000/01/29/949135070.html"><FONT COLOR="#000000">ippl 1.99.3</FONT></A><BR> - <A HREF="/news/2000/01/29/949134977.html"><FONT COLOR="#000000">Saint 1.5patch1</FONT></A><BR> - <A HREF="/news/2000/01/29/949134943.html"><FONT COLOR="#000000">Zircon 1.18.232</FONT></A><BR> - <A HREF="/news/2000/01/29/949134927.html"><FONT COLOR="#000000">nmap 2.3BETA14</FONT></A><BR> - <A HREF="/news/2000/01/29/949134901.html"><FONT COLOR="#000000">xterm patch #124</FONT></A><BR> - <A HREF="/news/2000/01/29/949134817.html"><FONT COLOR="#000000">MyThreads-Links v0.5.2</FONT></A><BR> - <A HREF="/news/2000/01/29/949134633.html"><FONT COLOR="#000000">sudo 1.6.2p1</FONT></A><BR> - <A HREF="/news/2000/01/29/949134552.html"><FONT COLOR="#000000">MIT Photonic-Bands 0.10</FONT></A><BR> - <A HREF="/news/2000/01/29/949134246.html"><FONT COLOR="#000000">Launcher 0.86</FONT></A><BR> - <A HREF="/news/2000/01/29/949134179.html"><FONT COLOR="#000000">nano 0.8.1</FONT></A><BR> - <A HREF="/news/2000/01/29/949134103.html"><FONT COLOR="#000000">Gtk-- 1.1.8</FONT></A><BR> - <A HREF="/news/2000/01/29/949134049.html"><FONT COLOR="#000000">tkchooser 0.65</FONT></A><BR> - <A HREF="/news/2000/01/29/949133420.html"><FONT COLOR="#000000">XShipWars 1.33a</FONT></A><BR> - <A HREF="/news/2000/01/29/949133280.html"><FONT COLOR="#000000">Lamerpad 0.1</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="/news/2000/01/28/"><font color="#000000">friday</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/28/949117833.html"><FONT COLOR="#000000">fsv 0.9</FONT></A><BR> - <A HREF="/news/2000/01/28/949117711.html"><FONT COLOR="#000000">popsneaker 0.1.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949114716.html"><FONT COLOR="#000000">eyep-updater.sh 1.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949113240.html"><FONT COLOR="#000000">W3Mail 0.5.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949113214.html"><FONT COLOR="#000000">The Urgent Decision 0.9.9</FONT></A><BR> - <A HREF="/news/2000/01/28/949112269.html"><FONT COLOR="#000000">LTSP 1.02</FONT></A><BR> - <A HREF="/news/2000/01/28/949112198.html"><FONT COLOR="#000000">Production BASIC 0.2.12</FONT></A><BR> - <A HREF="/news/2000/01/28/949112123.html"><FONT COLOR="#000000">Postfix 19991231-pl03</FONT></A><BR> - <A HREF="/news/2000/01/28/949109732.html"><FONT COLOR="#000000">Mp3 Commander 0.7</FONT></A><BR> - <A HREF="/news/2000/01/28/949109324.html"><FONT COLOR="#000000">iManager 1.0.1b</FONT></A><BR> - <A HREF="/news/2000/01/28/949108399.html"><FONT COLOR="#000000">Eterm 0.9</FONT></A><BR> - <A HREF="/news/2000/01/28/949108308.html"><FONT COLOR="#000000">dqd_dirindex 1.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949108087.html"><FONT COLOR="#000000">Tidings 1.0.4</FONT></A><BR> - <A HREF="/news/2000/01/28/949108026.html"><FONT COLOR="#000000">localscan 2.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949107922.html"><FONT COLOR="#000000">WMKeyboard 0.3</FONT></A><BR> - <A HREF="/news/2000/01/28/949107834.html"><FONT COLOR="#000000">fcmp 1.0.2</FONT></A><BR> - <A HREF="/news/2000/01/28/949107767.html"><FONT COLOR="#000000">Akkord 0.3.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949107649.html"><FONT COLOR="#000000">HiM 0.1.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949106305.html"><FONT COLOR="#000000">cdrecord 1.8</FONT></A><BR> - <A HREF="/news/2000/01/28/949103400.html"><FONT COLOR="#000000">eMixer 0.05.5</FONT></A><BR> - <A HREF="/news/2000/01/28/949103187.html"><FONT COLOR="#000000">FreeVSD 1.4.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949103096.html"><FONT COLOR="#000000">Common C++ Libraries 0.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949095155.html"><FONT COLOR="#000000">Moonshine 1.0beta2</FONT></A><BR> - <A HREF="/news/2000/01/28/949095112.html"><FONT COLOR="#000000">swim 0.3.5</FONT></A><BR> - <A HREF="/news/2000/01/28/949095009.html"><FONT COLOR="#000000">Xmame/xmess 0.36b15.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949094448.html"><FONT COLOR="#000000">pcmcia-cs 3.1.9</FONT></A><BR> - <A HREF="/news/2000/01/28/949091509.html"><FONT COLOR="#000000">gPS 0.5.2</FONT></A><BR> - <A HREF="/news/2000/01/28/949091415.html"><FONT COLOR="#000000">Snort 1.5.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949090436.html"><FONT COLOR="#000000">Pygmy Linux 0.7 beta</FONT></A><BR> - <A HREF="/news/2000/01/28/949090237.html"><FONT COLOR="#000000">Intro to Bash Programming HOWTO 0.3</FONT></A><BR> - <A HREF="/news/2000/01/28/949084379.html"><FONT COLOR="#000000">GNU Pth 1.3b2</FONT></A><BR> - <A HREF="/news/2000/01/28/949084356.html"><FONT COLOR="#000000">Laonux 0.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949084304.html"><FONT COLOR="#000000">x-wvdial 0.12</FONT></A><BR> - <A HREF="/news/2000/01/28/949084188.html"><FONT COLOR="#000000">Intro to Bash Programming HOWTO 0.3</FONT></A><BR> - <A HREF="/news/2000/01/28/949084106.html"><FONT COLOR="#000000">Catalog 1.02</FONT></A><BR> - <A HREF="/news/2000/01/28/949084062.html"><FONT COLOR="#000000">harvest 1.5.20-kj-0.9</FONT></A><BR> - <A HREF="/news/2000/01/28/949068306.html"><FONT COLOR="#000000">wmseti 0.3.0a</FONT></A><BR> - <A HREF="/news/2000/01/28/949057272.html"><FONT COLOR="#000000">RIG 1.02</FONT></A><BR> - <A HREF="/news/2000/01/28/949057019.html"><FONT COLOR="#000000">FreeAddr 0.2</FONT></A><BR> - <A HREF="/news/2000/01/28/949056939.html"><FONT COLOR="#000000">GtkAda 1.2.5</FONT></A><BR> - <A HREF="/news/2000/01/28/949056664.html"><FONT COLOR="#000000">dot.conf 0.6.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949055099.html"><FONT COLOR="#000000">dep.pl 1.28.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949054980.html"><FONT COLOR="#000000">Prae's Scripts 1.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949044301.html"><FONT COLOR="#000000">Project Clock 0.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949044285.html"><FONT COLOR="#000000">Xtheater 0.2.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949040013.html"><FONT COLOR="#000000">i-no Chart 0.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949039945.html"><FONT COLOR="#000000">spliff 0.8.1</FONT></A><BR> - <A HREF="/news/2000/01/28/949038953.html"><FONT COLOR="#000000">Regexx 0.95</FONT></A><BR> - <A HREF="/news/2000/01/28/949038316.html"><FONT COLOR="#000000">RBook 0.5.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949036742.html"><FONT COLOR="#000000">RIG 1.01</FONT></A><BR> - <A HREF="/news/2000/01/28/949036714.html"><FONT COLOR="#000000">wchat 1.2.0</FONT></A><BR> - <A HREF="/news/2000/01/28/949036428.html"><FONT COLOR="#000000">PCCS MySQLDatabase Admin Tool 1.2.2</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="/news/2000/01/27/"><font color="#000000">thursday</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="/news/2000/01/27/949033332.html"><FONT COLOR="#000000">CADUBI 1.1b1</FONT></A><BR> - <A HREF="/news/2000/01/27/949032987.html"><FONT COLOR="#000000">Angus' Chess Clock 0.8.1</FONT></A><BR> - <A HREF="/news/2000/01/27/949032555.html"><FONT COLOR="#000000">MP3 Report Generator 1.0.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949032518.html"><FONT COLOR="#000000">4DOM 0.9.2</FONT></A><BR> - <A HREF="/news/2000/01/27/949032386.html"><FONT COLOR="#000000">4XSLT 0.8.2</FONT></A><BR> - <A HREF="/news/2000/01/27/949031346.html"><FONT COLOR="#000000">OpenNaken 1.10</FONT></A><BR> - <A HREF="/news/2000/01/27/949025747.html"><FONT COLOR="#000000">iManager 1.0b</FONT></A><BR> - <A HREF="/news/2000/01/27/949025168.html"><FONT COLOR="#000000">QuakeForge 0.1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949023271.html"><FONT COLOR="#000000">pylice 0.7.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949023250.html"><FONT COLOR="#000000">Solfege 0.6.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949023151.html"><FONT COLOR="#000000">xinetd 2.1.8.7p1</FONT></A><BR> - <A HREF="/news/2000/01/27/949022849.html"><FONT COLOR="#000000">jac 0.13</FONT></A><BR> - <A HREF="/news/2000/01/27/949022803.html"><FONT COLOR="#000000">Xmms 1.0.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949022319.html"><FONT COLOR="#000000">KSrnd 0.97</FONT></A><BR> - <A HREF="/news/2000/01/27/949021877.html"><FONT COLOR="#000000">getpg / UW-IMAP 0.54</FONT></A><BR> - <A HREF="/news/2000/01/27/949021849.html"><FONT COLOR="#000000">getpg 0.53</FONT></A><BR> - <A HREF="/news/2000/01/27/949021824.html"><FONT COLOR="#000000">setserial 2.17</FONT></A><BR> - <A HREF="/news/2000/01/27/949021250.html"><FONT COLOR="#000000">Pan 0.7.3</FONT></A><BR> - <A HREF="/news/2000/01/27/949021216.html"><FONT COLOR="#000000">jwhois 2.4.1</FONT></A><BR> - <A HREF="/news/2000/01/27/949021126.html"><FONT COLOR="#000000">Kmp3 1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949020964.html"><FONT COLOR="#000000">xPine 0.0.12</FONT></A><BR> - <A HREF="/news/2000/01/27/949019905.html"><FONT COLOR="#000000">Avenger's News System 2.1 Alpha</FONT></A><BR> - <A HREF="/news/2000/01/27/949019709.html"><FONT COLOR="#000000">RIG 1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949019321.html"><FONT COLOR="#000000">scroller 1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/949018347.html"><FONT COLOR="#000000">Perl EyeP Client 0.1</FONT></A><BR> - <A HREF="/news/2000/01/27/949017796.html"><FONT COLOR="#000000">sfront 0.54</FONT></A><BR> - <A HREF="/news/2000/01/27/949017631.html"><FONT COLOR="#000000">XFrisk 1.2</FONT></A><BR> - <A HREF="/news/2000/01/27/949016202.html"><FONT COLOR="#000000">Moffy 0.0.1</FONT></A><BR> - <A HREF="/news/2000/01/27/949015348.html"><FONT COLOR="#000000">Solid POP3 0.14</FONT></A><BR> - <A HREF="/news/2000/01/27/949014200.html"><FONT COLOR="#000000">php3guest 1.5</FONT></A><BR> - <A HREF="/news/2000/01/27/949013630.html"><FONT COLOR="#000000">crUD 01.27.2000</FONT></A><BR> - <A HREF="/news/2000/01/27/949013380.html"><FONT COLOR="#000000">crUD 01.27.2000</FONT></A><BR> - <A HREF="/news/2000/01/27/949012979.html"><FONT COLOR="#000000">Free Pascal Compiler 0.99.14</FONT></A><BR> - <A HREF="/news/2000/01/27/949012771.html"><FONT COLOR="#000000">gtk-font-hack 0.2-gtk-1.2.6</FONT></A><BR> - <A HREF="/news/2000/01/27/949009233.html"><FONT COLOR="#000000">Linux 2.2.15pre5</FONT></A><BR> - <A HREF="/news/2000/01/27/949005620.html"><FONT COLOR="#000000">krunseti 0.2.1</FONT></A><BR> - <A HREF="/news/2000/01/27/948996446.html"><FONT COLOR="#000000">CompuPic 5.0.1036</FONT></A><BR> - <A HREF="/news/2000/01/27/948995905.html"><FONT COLOR="#000000">gfontview 0.3.3</FONT></A><BR> - <A HREF="/news/2000/01/27/948995819.html"><FONT COLOR="#000000">authlocal 1.0.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948995600.html"><FONT COLOR="#000000">bigwig 1.1</FONT></A><BR> - <A HREF="/news/2000/01/27/948995501.html"><FONT COLOR="#000000">CAFire 0.0.11</FONT></A><BR> - <A HREF="/news/2000/01/27/948995429.html"><FONT COLOR="#000000">ANVLOGIN 2.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948994944.html"><FONT COLOR="#000000">sawmill.el 1.9</FONT></A><BR> - <A HREF="/news/2000/01/27/948994810.html"><FONT COLOR="#000000">Perlsh 20000127</FONT></A><BR> - <A HREF="/news/2000/01/27/948994776.html"><FONT COLOR="#000000">sitescooper 2.1.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948994691.html"><FONT COLOR="#000000">MHDns 1.4</FONT></A><BR> - <A HREF="/news/2000/01/27/948994419.html"><FONT COLOR="#000000">JChemPaint 0.5</FONT></A><BR> - <A HREF="/news/2000/01/27/948994364.html"><FONT COLOR="#000000">Filesystems HOWTO 0.7.3</FONT></A><BR> - <A HREF="/news/2000/01/27/948994343.html"><FONT COLOR="#000000">KSnes9x 1.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948993513.html"><FONT COLOR="#000000">Mozilla M13</FONT></A><BR> - <A HREF="/news/2000/01/27/948993439.html"><FONT COLOR="#000000">edna 0.3</FONT></A><BR> - <A HREF="/news/2000/01/27/948993409.html"><FONT COLOR="#000000">GMasqdialer 0.99.8</FONT></A><BR> - <A HREF="/news/2000/01/27/948993341.html"><FONT COLOR="#000000">spliff 0.8</FONT></A><BR> - <A HREF="/news/2000/01/27/948992808.html"><FONT COLOR="#000000">MultiSeti 0.3</FONT></A><BR> - <A HREF="/news/2000/01/27/948970667.html"><FONT COLOR="#000000">rude 0.50</FONT></A><BR> - <A HREF="/news/2000/01/27/948970605.html"><FONT COLOR="#000000">cgi-util++ 0.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948970479.html"><FONT COLOR="#000000">Cricket 0.72</FONT></A><BR> - <A HREF="/news/2000/01/27/948970458.html"><FONT COLOR="#000000">nuni 0.04</FONT></A><BR> - <A HREF="/news/2000/01/27/948970379.html"><FONT COLOR="#000000">Ksetiwatch 0.3.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948970358.html"><FONT COLOR="#000000">SiteMgrYAP 0.1.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948970322.html"><FONT COLOR="#000000">phpLanParty 0.21</FONT></A><BR> - <A HREF="/news/2000/01/27/948970285.html"><FONT COLOR="#000000">Glitter Newsreader 0.1</FONT></A><BR> - <A HREF="/news/2000/01/27/948970263.html"><FONT COLOR="#000000">Fastresolve 2.4</FONT></A><BR> - <A HREF="/news/2000/01/27/948970164.html"><FONT COLOR="#000000">ColdSync 1.1.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948970080.html"><FONT COLOR="#000000">DDD 3.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948970032.html"><FONT COLOR="#000000">X Northern Captain 4.2.1</FONT></A><BR> - <A HREF="/news/2000/01/27/948969919.html"><FONT COLOR="#000000">abcde 1.0.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948969659.html"><FONT COLOR="#000000">Gnapster 1.3.2</FONT></A><BR> - <A HREF="/news/2000/01/27/948969551.html"><FONT COLOR="#000000">xmix 1.0 Alpha</FONT></A><BR> - <A HREF="/news/2000/01/27/948969488.html"><FONT COLOR="#000000">gtktetcolor 0.3</FONT></A><BR> - <A HREF="/news/2000/01/27/948969412.html"><FONT COLOR="#000000">muttzilla 0.40</FONT></A><BR> - <A HREF="/news/2000/01/27/948969395.html"><FONT COLOR="#000000">muttzilla 0.40</FONT></A><BR> - <A HREF="/news/2000/01/27/948969337.html"><FONT COLOR="#000000">asp2php 0.73.6</FONT></A><BR> - <A HREF="/news/2000/01/27/948969217.html"><FONT COLOR="#000000">mod_ticket 1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948969078.html"><FONT COLOR="#000000">MegaHAL for Eggdrop .01</FONT></A><BR> - <A HREF="/news/2000/01/27/948968456.html"><FONT COLOR="#000000">Jetty 2.3.5</FONT></A><BR> - <A HREF="/news/2000/01/27/948968386.html"><FONT COLOR="#000000">xlpotdb 1.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948968341.html"><FONT COLOR="#000000">Koala Complete MUD Server 0.1.1a</FONT></A><BR> - <A HREF="/news/2000/01/27/948968255.html"><FONT COLOR="#000000">mcountd 0.4</FONT></A><BR> - <A HREF="/news/2000/01/27/948967933.html"><FONT COLOR="#000000">cdbackup 0.5.0</FONT></A><BR> - <A HREF="/news/2000/01/27/948967908.html"><FONT COLOR="#000000">The Java SSH/Telnet Application/Applet 2.0 RC1</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://slashdot.org"><font color="#000000">slashdot</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://slashdot.org/article.pl?sid=00/01/29/1534255"><FONT COLOR="#000000">Petition Apple for Linux QuickTime</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/29/1223249"><FONT COLOR="#000000">GNUstep 0.6.5 freeze</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/28/2324203"><FONT COLOR="#000000">YETI@Home</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/29/1024215"><FONT COLOR="#000000">Documents Unsealed in Microsoft/Caldera Case</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/29/0837235"><FONT COLOR="#000000">Who Bought Linux.Net?</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/24/1146250"><FONT COLOR="#000000">E-Mails from (Over?) The Edge</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/29/0834223"><FONT COLOR="#000000">Linux Kernel 2.3.41</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/28/2311232"><FONT COLOR="#000000">Congress Still Figuring Out E-Mail</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/22/1946244"><FONT COLOR="#000000">Sci Fi Literature 101?</FONT></A><BR> - <A HREF="http://slashdot.org/article.pl?sid=00/01/28/2318246"><FONT COLOR="#000000">Could Distributed.Net Help the Mars Polar Lander?</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://www.securityfocus.com"><font color="#000000">securityfocus</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.zdnet.com/zdnn/stories/news/0,4586,2429334,00.html?chkpt=zdnntop"><FONT COLOR="#000000">Win2000 security hole a 'major threat'</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.computerworld.com/home/print.nsf/all/000128e45a"><FONT COLOR="#000000">Visa acknowledges cracker break-ins</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.zdnet.com/sr/stories/column/0,4712,2429536,00.html"><FONT COLOR="#000000">What's Wrong With Microsoft Security?</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.zdnet.com/pcweek/stories/news/0,4153,2429334,00.html"><FONT COLOR="#000000">Microsoft posts first Win2K security patch</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=tools&id=1018"><FONT COLOR="#000000">Libnids 1.12</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.theregister.co.uk/000127-000005.html"><FONT COLOR="#000000">New hack attack is greater threat than imagined</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=news&id=http://www.mercurycenter.com/svtech/news/indepth/docs/hacker012700.htm"><FONT COLOR="#000000">Student charged with hacking</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=library&id=63"><FONT COLOR="#000000">Building and Managing Virtual Private Networks (book)</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=library&id=111"><FONT COLOR="#000000">Threats, Vulnerabilities and Real-Worl Responses: The Foundations of the TruSecure Process</FONT></A><BR> - <A HREF="http://www.securityfocus.com/level2/?go=library&id=1701"><FONT COLOR="#000000">The Hundredth Window : Protecting Your Privacy and Security in the Age of the Internet (boo</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://www.bebits.com"><font color="#000000">bebits</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://www.bebits.com/app/706/"><FONT COLOR="#000000">Pe 3.0a3</FONT></A><BR> - <A HREF="http://www.bebits.com/app/757/"><FONT COLOR="#000000">Rarscript 1.5</FONT></A><BR> - <A HREF="http://www.bebits.com/app/736/"><FONT COLOR="#000000">CD Manager 0.66a beta</FONT></A><BR> - <A HREF="http://www.bebits.com/app/174/"><FONT COLOR="#000000">TraX 1.1</FONT></A><BR> - <A HREF="http://www.bebits.com/app/785/"><FONT COLOR="#000000">BeMath 1.2.2</FONT></A><BR> - <A HREF="http://www.bebits.com/app/784/"><FONT COLOR="#000000">simple blackjack 1</FONT></A><BR> - <A HREF="http://www.bebits.com/app/758/"><FONT COLOR="#000000">HtmlTree 0.5.3</FONT></A><BR> - <A HREF="http://www.bebits.com/app/783/"><FONT COLOR="#000000">Yacp 0.1</FONT></A><BR> - <A HREF="http://www.bebits.com/app/222/"><FONT COLOR="#000000">TicTacToe 1.5</FONT></A><BR> - <A HREF="http://www.bebits.com/app/706/"><FONT COLOR="#000000">Pe 3.0a2</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://linuxtoday.com"><font color="#000000">linuxtoday</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://linuxtoday.com/story.php3?sn=15878"><FONT COLOR="#000000">Linux Journal: KDE--The Next Generation</FONT></A><BR> - <A HREF="http://linuxtoday.com/story.php3?sn=15876"><FONT COLOR="#000000">Kernel Cousin gimp-devel #11 Is Out</FONT></A><BR> - <A HREF="http://linuxtoday.com/story.php3?sn=15875"><FONT COLOR="#000000">Infoworld: Corel Linux OS ideal for the desktop</FONT></A><BR> - <A HREF="http://linuxtoday.com/story.php3?sn=15874"><FONT COLOR="#000000">Technology Evaluation: IBM Jumps on the Linux Bandwagon with Both Feet, Sort Of</FONT></A><BR> - <A HREF="http://linuxtoday.com/story.php3?sn=15873"><FONT COLOR="#000000">Tobias Hvekamp: European Union acknowledges</FONT></A><BR> - <A HREF=""><FONT COLOR="#000000">&</FONT></A><BR> - <A HREF=""><FONT COLOR="#000000">#34;Open Source Software</FONT></A><BR> - <A HREF=""><FONT COLOR="#000000">&</FONT></A><BR> - <A HREF=""><FONT COLOR="#000000">#34;</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://www.linuxtelephony.org"><font color="#000000">linuxtelephony</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=208&r=0"><FONT COLOR="#000000">Traverse Technologies releases NETspider-U in US</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=207&r=0"><FONT COLOR="#000000">Quicknet releases new GPL'd Linux Drivers!</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=206&r=0"><FONT COLOR="#000000">Natural Microsystems Delivers Carrier-Class Linux</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=205&r=0"><FONT COLOR="#000000">Quicknet is hiring programmers of all kinds!</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=204&r=0"><FONT COLOR="#000000">Babylon MLPPP Software Released under GPL</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=202&r=0"><FONT COLOR="#000000">Linux Telephony Server Project?</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=203&r=0"><FONT COLOR="#000000">Vovida Networks to Hire Telephony Software Engineers</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=200&r=0"><FONT COLOR="#000000">SPIRO-Linux Introduces Web-Enabled Phone Administration</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=199&r=0"><FONT COLOR="#000000">LinuxTelephony sponsors area at LinuxFest 2000</FONT></A><BR> - <A HREF="http://www.linuxtelephony.org/article.cgi?i=198&r=0"><FONT COLOR="#000000">GSM-Mobile Switching Center (MSC) with Linux-PC</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <TABLE BORDER="0" CELLPADDING="1" CELLSPACING="0" BGCOLOR="#000000" WIDTH="97%"><TR><TD> <TABLE WIDTH="100%" BORDER="0" CELLSPACING="1" CELLPADDING="3"> <TR><TD ALIGN="center" BGCOLOR="#EEEEEE"><B><FONT FACE="Lucida,Verdana,Helvetica,Arial"><FONT COLOR="#000000"><a href="http://www.32bitsonline.com"><font color="#000000">32bitsonline</font></a></FONT></FONT></B></TD></TR><TR><TD BGCOLOR="#FFFFFF"><SMALL><FONT FACE="Lucida,Verdana,Helvetica,Arial"> - <A HREF="http://www.32bitsonline.com/article.php3?file=issues/200001/homeworld&page=1 "><FONT COLOR="#000000">Game: Homeworld</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001271a&page=1 "><FONT COLOR="#000000">DVD Lawsuit Spreads Its Own 'Trade Secrets'</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001272&page=1 "><FONT COLOR="#000000">Register.com Adds 'One-step' Domain Registration</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/article.php3?file=issues/200001/webevent&page=1 "><FONT COLOR="#000000">WebEvent: Keeping you organized</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001273a&page=1 "><FONT COLOR="#000000">Y2K Officers Defend $100 Bil Investment</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/article.php3?file=issues/200001/jan2000_john_berger&page=1 "><FONT COLOR="#000000">DON'T BE FOOLED</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001274&page=1 "><FONT COLOR="#000000">Microsoft Scorns Think-Tank's Breakup Idea</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001275a&page=1 "><FONT COLOR="#000000">Yahoo Accused Of Stalking Internet Users</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/news.php3?news=news/200001/nb200001276a&page=1 "><FONT COLOR="#000000">eToys.com Settles Spat With Swiss Artist Group</FONT></A><BR> - <A HREF="http://www.32bitsonline.com/ "><FONT COLOR="#000000">[more articles/news]</FONT></A><BR> &nbsp;</FONT></SMALL></TD></TR></TABLE></TD></TR></TABLE><P> <BR><BR></FONT> </TD></TR></TABLE> <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"> <TR BGCOLOR="#000000"><TD><IMG SRC="image4" WIDTH="1" HEIGHT="2" ALT=""></TD></TR></TABLE> </CENTER> <TABLE CELLSPACING="0" CELLPADDING="2" WIDTH="100%" BORDER="0"><TR> <TD VALIGN="top" ALIGN="center"><FONT FACE="Lucida,Verdana,Helvetica,Arial"><SMALL>copyright 1997-2000 <A HREF="http://andover.net">Andover.Net</A> - icons courtesy of <A HREF="mailto:tigert@gimp.org">tigert@gimp.org</A> - code revision <A HREF="http://freshmeat.net/ChangeLog">20000101</A> - our <A HREF="http://www.andover.net/privacy.html">privacy policy</A></SMALL></FONT></TD> </TR></TABLE> </BODY> </HTML> ������������������saods9/tkhtml1.0/tests/page3/image1�����������������������������������������������������������������000644 �000765 �000000 �00000000161 07504443352 017341� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������!���,�������H�\MkNy'XN0,4ca'|~SB"$IzI)>QTT�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image10����������������������������������������������������������������000644 �000765 �000000 �00000011740 07504443352 017426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������0@0666>>>>R>H`HLdLVrVZvZ``ddfvfhhlllnnrr|||||���������������������������������������������������,�������@pH$Ȥrl:ШtJZezxL.znx" <| u  \csq]_j^»b _bq ' ՓdҒҘ�وAA u'K`jE ?jӤ1 CHNTet'sF.hrM'F*#v#eAq#6mSFsjb$WYv)ͪA^نt'xg"@׏]?&HPǐ#KL˘3k̹Ϡ1/2ӨS^ͺװc˞M۸s� Nȓ+_μУKG.wسkνwCNɇ7^8;!E_z}�ؗ_r }6u5 �| �aY^a$@}"bh8򇢊!�#r IBLF)tNGߔXf\Zv\~)hlp)tix&&矀*蠄jd&hw.5 餔'iVz)p+駠*ꨠ~0dzi+Gc -*묡 +檫ꫬ*짶Zp@ -G#J>,ZY ˂<~@&~][ܦɚG.g.qnˮ~{\^}x\!oۣ`$�18|Po~/Jܕ+̲qߊ-Ls"{; a)c/{1XpW,\B2$}9{\߅UC64)b2k:W`!c\uM0B G4p\ψt-&= Wx�b&maӊ{lx{,xa3}򅆷fRW?m~FndܹKaG}4^y{x;xĩ}G^16Fz}ncKء_<jw:/k0j<}D^g.:PFH6 |`79#%\ĢsI ͂0-8#O qp>]sC[CND&'Fv"հH2hL8T1Ga S7F)k<α| $;N!hD6G7TMԨ,rsrLIH)Тq$`Qw퐒<DQUv+L`f8Q1crdqv^G? qljCBdkLI8 Xd1P;ld@'"/>Zmn{(pI$j> OPv+ Ҟ=K?D@B%nb@hM hq\& 2Ҕew~Zς?_JcgA~p.ag Oj"AEӤQ0>%P IǏb3?^LO.S8N>%S&jkr Wʑe*jQWՈAqhZ:ٔ؉vX^vҪ $zaX˚6:5iWVm2]HQkm+kNvriOikV Ej'env*f.vov6`ͬt9!BϪҡ.ʤ9ў PmakhԨƢW"Zִ f0',Y =@4B%g4h \⪶T9&UCQCG[FuiҊ z,bˑ{ICqḇ>6Hr;}QOy<\fضå`:~iNwy|7~IW-.V.˲0:3yk ,,bJ1t|.ǯ.a]L7chb8`C'͆հ欧[Ѷ5s]Z>mr! \4 ψtvtv7MYւtt RԾDs 9WjakFf6ijcLk?8|ݮb!rU,ӫ k5m\YGK z9t+i{n MQH-#,yPqgnئ\ӕSs3ڲp`yJ9Y?B;_F;N#]{iqV}&<|6'Nk7Uilx#{]N"CltYm]Bj7w`6:֘l+[<՝|:=bb؁6ߞmOm܏^]݃^K2q\ nU*n>|Np.z۷ ?9 ϳWϵc_RHK'3B/w}*pc3CL%3sR7Pc}^;Tt(arr#ry$R�UA D<XuPFBgvW$E%v HKUqn%wi&y:Xypx>Z'Yy^h|!zbHdXthGjHwgF~v{فwZ;=%`81D}6aW2<308^wKnsr刃T`Tn%45_G; 667wvGa?X29,bGTLX7 *q5r:8dPt17ev-BdeVfIKGrAfaR2M*cfpւ Tgk"qFGvhGq'pyWxG{EAĈ$'UǥnB{Xnry^y$Ԇ,F.rzt62Cf"q2NWRS<-aFbi_ A=$pgVG=<S"Ӕ&\)(Z]#0&? b;q&>R#Wbc9tYvyxz|ٗ~ɗ#`&pi:#o$n)xXy#0J5]♜}DGIYyٛ9Y9it‘%9Yyؙڹٝ`~F깞ٞIF9PE"9*Y,̉ )jڟ:Fp�3Q"�j.Ud0�Z&zRٜ! (Z6*٣٠=7ZFzF9zzN8*Y)PZFIb)S |vaZ)czLzAebz+WV-֥T:Ep%I\JwZ*򩣏"igAJ َƨ�dښX5qOni}%*{8ըJ:& !@八8S*&uiGjVuA&hq5/?.@9]viȺҬBgRЪ#Cah@<.oCq{Va9< Ȏ:ꥱ R-@RUW7b`J+%99%ԁ 9ꨎ.Uc7G>ɮqo.360"o8C>>zJU~H'}Df)QHK2K%7K$JMO[|;bS8(c (D8˧:%Y'$mXr+(QS˦Zrz(||~de[E%Kj)۹[zh (1ٺ^򺰫%;Xrz &"PkNW%e9p5]^r"4b;RƼŵYE ;VW[{蛾eIb/t>uA۟*x aKn�|#|,&0\| "<$wk,#͙ܵ-<[z}DJ:|6,89Dʿ(-2EÇ2@P)ŒK"Zjb|I,'pnp|j<ۿuwyH| ,&0OZYI4 l"m># kXz%ȆWǀȁ$<ܵ!^XErX^HƑy30+뉺[ @6L|9to5JM ;;@)gьlf4D:3DPQqn@˓u̓sRcJs/\KsZG$:aһۨjzJׯ>\aj6@f/X"DE$}! R<,a_EK"̃<|=]_B Lg{ɣL̄ԹDGLIL5≠tT!Jiψ,Yik}\hP }<%duwv-R׀$=بׇI]،_9=ٔ]ٖ}٘F|$ǠڢBHAz$)3ySRH'u\۶}۸ۺۼ۾ܼ Z|}ȝʽܻ=4sd)=&]_r%ց� =]}ޤ�ޛ� `dP��>^~ -A��;��������������������������������saods9/tkhtml1.0/tests/page3/image11����������������������������������������������������������������000644 �000765 �000000 �00000010605 07504443352 017426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������0@0666>>>>R>H`HLdLVrVZvZ``ddfvfhhlllnnrr|||||������������������������,�������pH$Ȥrl:ШtJZezxL.znx" <| u  \csq]_j^»b _bq## . ՓdҒҘ�وA ݆.K`jE ?jӤ1 CHNTet'sF.hrM'F*#v#8eAq#6mSFsjb$WYv)ͪA^نt'xg"@׏]?&HP�ǐ#KL˘3k̹Ϡ1/2ӨS^ͺװc˞M۸s�  Nȓ+_μУKG.wسkνwCNɇ7^;F_z}�ؗ_r }6u5 �| �aY^a$@}bh8򇢊�#r IBLF)tNGߔXf\Zv\~)hlp)tix&+矀*蠄jd&hw.5 餔'iVziQpç*ꨤ C) 3꫟ :ڪ뮧z` 8+ ! y#< >v�z.:Xmy.Z&ܺ]&򋞿--aŷbp ),nk0~/W}#n~/J"W+Pv/ s `p Xr Í1~c83q=�s-6̢R-ܻB2$}&]߅]ohsoB|! 9kacauV7Ͷ8cL wG"W[ahdt[ޅ' et iwX隧מ95Mh}t];;ήwВcu_?,0k;OzNsB܅B w~<rknۏD=}|@PЇ= {sk 3O}5b ǝjr],#e ?8fB,6!Mp0wh/8 C41KԎCvE1:OO+bgQWE2zѨ+40 LT*7aD@AHD6ȏ$zyE G$Ȥ&7Nz (GIRL%*aT葃,$ BZ̥.w^ 0Ib Y2- $a@̦6iFH�4A)hRr N5oPPuT U z&9_`r$$49]lg<o`PvD'+}7g9_IXT�BpTegI)ҖSh Qu4T<E"T MJ_JԢrShMWJ t8BKP'5VM ,uKmMSf $ֶcESU W�vGJ˛I L�XLdI| ,Y;z¹lcQZӳ,h#:t=mjg{6լ\Jޞնln_+X[.n#UEt[\2Wt;x)-W^l^׺%fbӻ%mqk| וn9k  7\* 3 氈S^7ðWN+p^ǘ3No ;8 1}1KYBqld"Q d oUicj2rf*k6sjyisplg6㹾u,@xЄޮDZEqG9^!=fњLP|4MQǬ?]Xv]SkzQ!ta}l[vvhOوvakm۵`(+ѝߒ;nwm-iU[h]U}W[E 8ͪ'X>N))o |'nSԛ5U R}nlU3/7kt n9soʜ(�zi]rӢ<ymqԢ-x7>r{7G: @v]_6Wg tCx{n`ıӔཱི\ogzG@-;)|!C$0H3ߑ<4)?H eBOMR}콘(wNO-^3y0V8' @�1 {,Yg/;'Ľu5iPtAp?w`+?9|&Gv&|7XG}Gfŷ8=Fw} hgW}Q)(}ݷ}'0 ( '؃:}ӧ!G7VS6#'QH~+CQ}/gw';h>iCǁ3b4q4Ow9ȇ}Ñٷ~~w|h~(m§~'z7X"EG,)H%(&4{r&˜'83 |78h'7xԈ8&GwgwcrYyXz_XR瑊QQS׍(&LR2/|x|w:H}*B*d$%�} �IBx WLjǂE":쳂bL'}-iw:H~1\I=jUHL)3مY 2AhXh9(zH_I$Sǂ,c6x_1E)^u RBbzĘy|d]''(inY *yyImV9YyٚV zvՙٛy89xyHٜ H9{T9G@;P  3;#��p9B6ܩ@!rAY"ǘiJٝs@k=3;6ßyj JC7>S:ڒ;-6L ":$Z&z!:\Gq0d387(1\6Pḣ<y|I!!S18H)JLڤAjb})BW9yQYzbAws{6Pfzhjlڦnpr:tZmV[:ziOyw6¡ + jo$*vd@BzbSCN@U?U:* xq%(Zr}SEڪP*z:ק%zƊlDa:=ZzK ]ۈڨ*t8gw(fJץY!{䊪 J~ir)ZʭZǑ`2́~Z*\ 賏8;T;#9 K tieJJjS!#@䄫؝Ý t<FA @> 5'̪;ݣ XG#.v "$$ôg2;@k9EW>#?x(q<'T8$Y#29l ÊB@RY]C61W"56 C8s2[>Ҹ +B e['DUZ]9iAxF+ *'' d(9qҼ~" ^ )++&xcҽ%{[ZrzY0;[PJQ'xkH|+Z<Lr%SH1)U32 G:W[&|(*,.00 ; 2|8:<,C*B|HD\ĀtHGց� R<T\V|Ť�ś� `d`b_P�jhnpr<t\v|xz|m,A��;���������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image12����������������������������������������������������������������000644 �000765 �000000 �00000006773 07504443352 017442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������0@0666>>>>R>H`HLdLVrVZvZ``ddfvfhhlllnnrr|||||���������������������������,�������@pH$Ȥrl:ШtJZezxL.znx" <| u  \csq]_j^»b _bq## - ՓdҒҘ�وAA Ղ-K`jE ?jӤ1 CHNTet'sF.hrM'F*#v#8eAq#6mSFsjb$WYv)ͪA^نt'xg"@׏]?&HPǐ#KL˘3k̹Ϡ1/2ƌӨS^ͺװc˞M۸s� Nȓ+_μУKG.wسkνwCNɇ7^x;E_z}�ؗ_r }6u5 �| �aY^a$@}bbh8򇢊a�#r IBLF)tNGߔXf\Zv\~)hlp)tix&*矀*蠄jd&hw.5 餔'iVz)5駠*ꨤjCfܦ/`ꫯB**5Ԡ$ꫩ6jiH¹*Cy4j<5kzp@}ˤ_ ނ۝9»i$ꋞ[ܽv x%w{C>|'0qW"u̜*q' IP߅շ/n0pߊ\\%a]<\+h F,} >-p<}5lup \P^  ߅jgB%ӛ83SC-8X "3=g3J Bnwa5gۓ_2ٸ`_9m8˞_^iG!ʭmbjNx 0?^cHߖ;۴+:<.+a idG6n?ΣS_?ض!qO~-Bd|W ==0r3!7Y}Pfw~ۖ &%`ڡd蜛 W 84N3 ӡ y€PO$b5$.8s⿪p1_s/ah|̘6W :NIvX zh>fY KH=qtP!&&OjP !II,R]+ 2Nz (GIRL*WJU,e)ΐ$A ^%,Q@1p%I2T%T4IjZ& X`3##LPyĦ:`j27)I\j2%@>!O~~l@JPR 7z3)tm0 y2i|=%J �̨JWJMX"48 hBI&TeNwFX@iLrH%,O:u)3m]&X%,GiVJRmu80WhϪpxֵV^zV5l[Jأj]*=,pP"+d7[Pɾ T:XΚVLE{Yfegj[YmKVچ6`%fuK\֯]-pG+:׸tM.Q >Z=.bWz7.u_`׬ڝtZҾEox7T`{旾-o.} Uy\/`F80{o_WXM|~v)f.Y2^1b˒;nmY .V-U#w\(3 cyZ޲\0e63ll83tެs<יg@Xn&t\e+HyҔ&];Lu zцqO]RgխN5 kR˺«5V]h]K3}T^؆/hdvN-jiO[1nRj<6Yl{&Mdt[ݨew o֨,i|{wdk{̸/vΆS }qlZ�'Ar/&9t3~hA[8̫)S䈶5ks_9{s{eG#Wx('-˭Nk\Un]^+]Ju~F]Tv;wO{>xg{Ͼx7>z>WGz懾ywym>WyIz㯿x)>{~7x>߿w=|uwU5a^:PͺN}@T]~_v 48Bɏvpɥ}ZU?ٯFy_ Lr.mW($8*40җ1$X&x(/AGrr1$64H7-Ā_ƃ@XC>nAXʑFˁJ؄2RȄRX'eVT2H^-ax`X䱅15mcqhmh5eQ҇aD}PӁ!8q١ML|(c4a &`ԡÁ(**/x>C}"!d>h$#ȋظH芰x؊Xq؍SA 䍆89sEM)QI/(ȊH9-$b# F4s$3,3ڈ蒯*�GH&0(舋؎7I? 2:.2"8$2+s84Ÿ y[92ؕ999F8`$#3O33HرFcMyX恘"6y#%9I"r&�+(' (aYYAH 20؛@xyw:ʹٜ9YyˉG#0ٝ9ҹ4zT*i깞R؞لց� pٟ`� `dz-P�Zzڡ "*A��;�����saods9/tkhtml1.0/tests/page3/image13����������������������������������������������������������������000644 �000765 �000000 �00000011777 07504443352 017443� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������0@0666>>>>R>H`HLdLVrVZvZ``ddfvfhhlllnnrr|||||������������������������������������,�������pH$Ȥrl:ШtJZezxL.znx" <| u  \csq]_j^»b _bq## + ՓdҒҘ�وA 뵂݆+K`jE ?jӤ1 CHNTet'sF.hrM'F*#v#8eAq#6mSFsjb$WYv)ͪA^نt'xg"@׏]?&HP�ǐ#KL˘3k̹Ϡ1/2iFӨS^ͺװc˞M۸s�֌ Nȓ+_μУKG.wسkνwCNɇ7^;E_z}�ؗ_r }6u5 �| �aY^a$@}bh8򇢊�#r IBLF)tNGߔXf\Zv\~)hlp)tix&*矀*蠄jd&hw.5 餔'iVz)2駠*ꨠ0dn j y4髸暫ꫫ3jiH± Cy4�*IcM;kzp}ˤ_m ނ۝9»i$ꋞ[ܽc~/JܕA/W}#'/ 11 x%pp/lŷ",gs\`$�%`} ^X3�AfB2+_+u}Vgrf,HOm`5?$IuL\w=&?r}ԇcX *}4.Σ %X9|7Qv^R!u_n >55Z\zX5z"i idQߌ.iX7;.LS_7t6"^⼫{cGT?5Hr^&魏}Xw8#9ρSf vmk`I ;m#İp99�'IGoCv^8/>Gh9aLx?ˇdžct VWde1aKWH2нf,TqJ{bs7QI9X<αu wD\яoB +UH9Z`~ u _Җ=%�*IKiB$&i"smx-eIbIj[*fZVjDG 8IrL:v x228M7>[$]6E> tІ:a<V?(�U2MfEyQfԣ(EI):OK֓8+MLӣԥ% ipHӞ@ PJԢHMRԢli+_TG)ȪVծz` XJֲhM+X8tH׺xUUJ.R8r]Ex3`gXPPlbZ+KjQ{vl FR1@ X&=-fgK[jVR+UkU .iM[Zd[:XinOݫwM`IZ6 -pC;Z>UuڂVuw֖/h]]ʦ]/YNsW6!P'W+[=Io'a,w&-gYl`c46V Z� 3tE1:Kw8mEHRreXS锥eh9]nRse'Gary,5+걳tڜ֎<W$AP8eg%8|Έ\D7wg2z&7$BEzL[l I d+}̭ ΩAY'vTk=+[DYS 9̱h!#ή>$>ql#mit<R U} jو 5kd[״n\DtnOߎv~#"ҁ*2\p2.sn7(5t*\膳nŌDGg)pNuߡ3sN"yϙy[{g<ÞҺ<t9Odo~' mhlw09 O;񐏼'O[[ya {]{(6;g~5þ_=o)8X^ED?7V>sF=_??NF:-u`V5\?=?0Kc_k+\hǁ8XM:w[R03Bp!5#$?KS~2zHW. zB'xbs17z]7(б!zFb v7ƒ&PFxHJL؄NPR8TXMz71W؅^^My>^\_\__jnEYXb^[EX݅E\U^o؇`Gz9uZYu]إ]T4ZY\凔*qqs[^u[58,HtD]ZX؅X؊\UXE#B(.8\YfxxE 8+`dcq@(xŸ8)޸uDyXYFh7(#&qau'uJ'u=(uU'WvƋiiyZ7ly30cr3w:7<r?cd(h7uqrlsw7Cf#$1I71m'#OpsX{ؔxh:[<T3V6j??t;o%=mVi8lX )R܄l5VGAvl,s=~ZIQs>IcnpٔG1nH!SjzjtA}djÙ?yr1mc$rtkv-9 f0ɒc%HiU|)f+)Ie$ueqɛ9ל`B^r.` yxYi/Z2O9,@w9Yg-xOԟ�::NLҸ ڠlEĞ~GzwFڡ )":R& )(IY=D ¢w#x)=H%I$$r.IƆJQ8(Lg"K>C:45Wnt!iK#dbjȤqLД:JS3ӆ@voMdM0|ڧŹ O1O % s*6qO0)ץFY>ڠ,M ٩8򩺹!TڪKP&)Vګg`PZbc$p'@'?H":zຮ"/(pيnz"Q Y" گʪzU۰ "媭  +&@xg߸Ί* (/iJf겾$6+8K:<k?AkCE iG뤥KMkO/;ZyBLV>Kʰb \+s^ik[�8m˭drK{~zk}[ i#xuK" ( ˷k刴z;YKE+ K뇞Pao8:Rno [Kۅ {ˁ۲ۻ+ۺ{67[뽟@+JKfkߛ[;+aK{Xk`_gK`  R{x۽\&){r\Қd,� p;E3,ۯ3\.;L5;Ĵ%*Ĵė' RaVLĝ7*1<$\<el JrmL d5fcu|qǺ1ƴK10dA&x|d|zX&ITuV"9ɦ*\Ii̪Q*Da � $ʮ, M�N&`ʱ,N44IA"JI˿˯ \͙| �؜˲ @αl4V ʅlc;L&̯,Nz<,б̔9h٩h\8fU*`<l#�,=ҬlSw$ IL[|Ik,z)ҿ\,=N$w,|S9=/7;eS?wT|f ܁ֳ6 ןvj͔?}1vMdc ''n ԯ[0@Lx7Lm~BnQk^\]ڦ}ڨ- aŹ뼧ى%]RRHᏸ-&93!_rG@8ʽ=]*^y܁Gŭ)}ޓ* )ީ2  }M 7 f@kQ~l@]��>^~ !.�;�saods9/tkhtml1.0/tests/page3/image14����������������������������������������������������������������000644 �000765 �000000 �00000007023 07504443352 017431� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������0@0666>>>>R>H`HLdLVrVZvZ``ddfvfhhlllnnrr|||||���������������������������,�������@pH$Ȥrl:ШtJZezxL.znx" <| u  \csq]_j^»b _bq## - ՓdҒҘ�وAA Ղ-K`jE ?jӤ1 CHNTet'sF.hrM'F*#v#8eAq#6mSFsjb$WYv)ͪA^نt'xg"@׏]?&HPǐ#KL˘3k̹Ϡ1/2ƌӨS^ͺװc˞M۸s� Nȓ+_μУKG.wسkνwCNɇ7^x;E_z}�ؗ_r }6u5 �| �aY^a$@}bbh8򇢊a�#r IBLF)tNGߔXf\Zv\~)hlp)tix&*矀*蠄jd&hw.5 餔'iVziJW *ꨤjjC 2ꫣ§zj}ڪ뮤ʚ+j 5XY! ת Hycyi^�ޖǭy./z n/ݛJo/VX܆W"WpppW7qb5V|y\&{\2 Sqp({28lpq2l$�8L4 Zt078cq}/Ra<mItḶ 4Xc!4pC(qcީ:-vb~soL7g,xwa9qpHt>6nN2M.p|E"48iX.:{c/<p[5}Bo$@~F2_闫f$iotS/}S_(9e~sg@[ۇp1P؜G Ӂ!t8P^!它-1ġvdHo)1:HO3@ ᯂ.z` #+mD:ɏkD9At|#G<6} y(BuQ8d$'IJZ̤&7Nz $@RR#C񕰌,gQ% bpȶpieJ`*b L2IK[&-yJ7w&Y*n4&3Irʙ4KB ѐL Ps%<E| @jKҤTyeS۴SE7юҖ:E6ԧDyt�6'=aQ]APRΚf<yNzH(i 4I6Jժr'Vv4UJV/T0*CRWp=xY'+׾TgN]7`gMlY+V'}b'KVԮedJ"ղqB(MGAіty^UKێֵ?,[%[ޚnc.a5["W`ZѹnYVͩtK2m zKFհ/@z+.׻o}{_W�w{N\Vl^J8~f{a�g؝mᯆ#^oa8+i7.m^Xq{n8B-d%9qE.ٿ5q|dkY\n'6&2\0xlnqa1#9row2L3mݬf8 =9ŊoDXҔVL#Fs==MCxԤN]Jz]t]5\WMe]Ǖkue_ h> 6;/{FMl[zԮumhW{۱umYmI{߮nv[ʑVw}iη~?8-B[8q=p'W2洹-NPhCq$/oq}+˗9<ܶMp|7f</:kX2|:Է{|Jk\Y.pRfΫ]Wn~]c$v<|7U_~T?~+U|?W|yw^{>{껾z~ꯇz>{׾yu{~yS>|?x-|7_?x >}Wׯw}V5aonU]OHJJ)TOw!Z=ySDg(x2PTw~L,Ȁjx M8eT1+Ђ1@i)6x8:*idmHDxEqpNLKO8Tx-TH\օ`nC`hdxfxa!<":8Hl3Po/`r臀H!9ߑф!X&%Dሉ8(xR$$؈؀[p$CC&Ja&@8h،8s.hޡ(!>t9A=q˨ʨ؎h͘xȏaEr9H23(8848M9ai/8؋X&I2$BX :s$> ɨ&ʘXBْaA(�A+ a2# ip15s2H9EIxȖgIG))GɌA)xKy3_)x2)R4q6I%ɘR9,x%b♀.P(X(g'I91郳ٛ~rXؐ4TX51Ω_9ǩ>ڹٝ9YyF2ٞ9i/cƹ*ya؟مց� pE ڠ`� `dzP� $Z&z(*,ڢ.02*#A��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image2�����������������������������������������������������������������000644 �000765 �000000 �00000000112 07504443352 017336� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a� ������!���,����� ��!� sYӽbHgR)`rpD�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image3�����������������������������������������������������������������000644 �000765 �000000 �00000001251 07504443352 017344� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������� &&&(((,,,...222666888:::<<<>>>@@@BBBDDDHHHJJJLLLNNNTTTVTTVVVXXXZZZ\\\^^^```bbbdddhhhjjjlllnnnppprrrtttvvvxvvxxxzzz|||~~~���������������������������������������������������������������������������������������������������!��^�,�������^]?DC0>*$*'<^FD.4^].PNY)2..<$.M5R^Z:$R!C-[X.F,T^QD? ,-)%.Ղ.3+9^\U^L#-6^-.&8=\TSOH*-@^XH:+ V ` 8�#bT@F "l"/J4QPB%94` (`,4@�.4`F1%ɋD0@ @K�4K .n$2"D@ɝ;7�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image4�����������������������������������������������������������������000644 �000765 �000000 �00000005760 07504443352 017356� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������???���������!���,������H0I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.znq�@~}wq0�&)#" � Őṫtptmujg d a ^$ o0*oC,r0- wJ(Q! *F t)[l�2n3Mlhe0TXĘL):"-yI!RAƔʌ:M)3@-rG�WͬL"`m ;a4g!}2Q%N~fZ*Ҝ3:~KPOn`x&KI' ԒKiu0Ź㵬_{WWLQ@ƐKN0:g]~5t#SWcDSK=P-?G$U%%G5}_,u^}P̀q_, R I!!�g5 u 4XԳMa1YĔNKUt*t]8ۏxs\^Cޖ!qB UHЕ[c[qR/UiڅISE2aRVMJHd%ƕd'Onw꘣gM VQd4v*x�y'GBjW(bݝʼnxz`U^␪$>XfHI,U8GTu@kJPAjVL;ʹӆh^ * #)FqUQ nn=K)II- J>.Yy* DZR pe簀07.insat&8p/3<q >q2ˑA*X.h5 Y:sCM"uT#ihXk. 2?Mp#)U XR19!P|׸y}~%zW5Njýf;9n=Fv–l5嶈sUnP<XKe-q"(Xq"Y<cZb `S|<OfI'.pÈN6)T΁X~FP0y~+`'iVP  ]"X̼ZT96_,$c2h ܈V\יl�i*?0CJ`tbUM{B&6- DR9%QK8flI0zB,ڔ 0A4R6h mؖJjQh(m6D (ɚ2'I00adR $tR0 iA ҄KFHs#2XRJ ) <B.H?ibxS뗰J\)(FxYm#qXU- ߼.@,`/p.QaUƆ*`s1%Sl޸WMkm[L&Sk BiPTIgYZ!,7&dPڤB:elR"DE&yi3z_<dP#Q*TIu3qP TQERU49ljz?!"]]bPoH+ 7x̪bxMM_�Gh(>PCaЫ$P�Vn`+'I' Y*l.%[  b֨%Wk-JWJͭ 6"w-Bt ;lafιnXX]GwՁfA)Qn. WT0P'+:``I�@կ |3ucpq%EGa�ǖBň~x 5.``7F<^ƍn"ȓE@a34y0O0}JYn heXp'rv9 +yAr=9{l{@f Eme <iY@t kaLC=mQ ԤǝLT{"u]Jʴ^i ]kY5rkmIz5Q|ido\ݜb%PvLfl{�ҽ6=[&ku3H7=St6 <j|wSHe�w``mA. \zl�d$l%-#8W8KKCCcQG-5! + V#SVYD Cbq 8jZ$ a^z 9 %UѨϒucX6#Ѧ嵩{Ecro}~o5/CJzV66k}k*|Ju;%%hX:-U+dwVՁmk:Bhj~VX~.%9Xwl -KfE{'<{?.U(ݻJE͗ E|t6U'+Cg'w=9a >o[}Q^r/T}̭mU9~eB WigKrW~"#2wB8g^Hr8[47%qQG9M!:G)CQSӁmP88u?b6AC W0aDDX@$.Tw92>$;1:ibw+UCRs;NbFa$$7}q|{b)3PBvcRÅ-Cr X±'Kw D|hхAP.u%DB%v7<9CS9b dt<$$AÓSգ=8֓!=ƓF!q@,ٱ.Bp^=#=Q C-"878[#oRe[w ej$M@?dpy ِ9Yy] ��;����������������saods9/tkhtml1.0/tests/page3/image5�����������������������������������������������������������������000644 �000765 �000000 �00000004371 07504443352 017354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aw������???���������!���,����w��H0I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxLzn|NxW Pm�wy'>!<{:|:885c65^4YҸY2P3O1J0C1E��2|+ U}/Xy ,q5"G>&r�%UKrʻ05I ɚ8 '<�`̜V["=B5S>}>݈tˀE)&�4PY ĵ #Tt>m( ja @.AW*PQ٢%IG.6.p` p hY [YecEբYP ollkCza[d\{q̿#$aEQ5Rޞy dy2 %`H RUƟ�]8BpF_`"_h ۝UIhGPƓ3 -Tq8 >X A %^E u5אb)H�z^Pfs1yizxWՋ'$kTrUyY񆜈U'2evu hYɞrSވ!{-xiA?Yr:|d,j6ua*|`* e$.)kb䧝!bDrZAqD N2N^>kT2i Wu&n9m,6b )HӪ)\1KӒ1iB$ &q̂#0:(˜*мŌLBΑT ;A *;ƍ++͂)̅#KB,xQ1k'la;3i5vs=>fP׈y7"P.9|0>眓x"dFn:d5^WC4GQxP<.7P/=o0r[=+Qz.dEAg}oe�?p#B `9{2hA <8/88Ml!.= TBpPa^KvE^$!jǀ:oa"b-w\"he6d؅*bll ?8RL@Fqb0#+h-p,dX:*&!7Gډ I)$Ɂ>R l)J|rI# K'2)%H== /!rrH%&ClfYIJ\!-br+)N2P&:vQZ~7+- n٦b$t9+,iB(Jj^A8<| [$f] hP•AHi4*LBIL8h$2SVb \#X%2&$TJ1u'5'yn-Q)3 ]w4\(D& )AaS˅*JqzhfҪ$2z kZJUSժFM)Fp2K&gS]hY~ZTRKmI U44S;)@H fe,XAE ܦ+{-[&P5ݫ´w0Խ 8^IOJ]iŸ`3K ~Ҋ+[$ ǁB ͥ컜�WK>kr15|+W9LZ,E,t,fL6\~AUj:[Uڪ˼aYZyر`Jp0P4W`Z fpM/ T7Y;8>}x!M Kk'sіtfI ˒Qu8,%s -Y|Ω›c 3|JJ0+u^f͸�YtiOTtFKtabptn`BXdzk}!ᒑ~%?pڵJQUױ=Xc,Ϯ7-J\S8A6Ƈ2JN4eٟcԓNI-~F&Ey!<ɯL; ��;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image6�����������������������������������������������������������������000644 �000765 �000000 �00000000117 07504443352 017347� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a� ���8p������!���,����� �� i܁Tj:f!5& J'fp�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image7�����������������������������������������������������������������000644 �000765 �000000 �00000003115 07504443353 017352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�������???���������,�������H0I8ͻ`(dihzBp,t@vo:G T@qp Gp2+DmpEK# 3e}-3\ZqjJ6,WjQ#SK m2vUs&'=%l]# ;n.$M7(w=@fG)I#P -R\ttx^mi>͞Bo5۹"awu3"` BO`A{fFq-̂V$v+/p 8$92Ebs|8Ei b`A, XU<b17ȡrA;ZAIO h7&~ް[S@/lIb$H<5#,̗"*@ύu,Ljl:&')j3_Vrmq8ZaY)Tv6o�>5+|cIf 2$^,Wx7 1}V/,8,P-Eel؆zrY¡Ȝ'/c3w(Ǎ��a��<x�D9 y$LdVi唳%GXFj^Hf&Rf! Vf;rcqP_9՛y ;\]NRfxj :AQMf% '܉g[Xiq:f*f9*ktrr寫ꢒ*]$Z.iև"[mn (lJM&yn0Ko!FH֒RK ]kptasͽ̆6{Z .̮M˾mRwb:j:G#*< zA{#*K2mE\+O3X bj9黏9JIY?GVVrֆ1ZKi{Ot |-u9Y{BXG^ PG-I+yHi(b]0:%gnsKsA*wQU&582Py!2&SnuV=ٍkT ½au)N#U۟vDGO>D`~B-8gB{M?|$)0 2��S (@ 6Up~d'B%ևB~POK?{tD:Ca|$Ln4/Y|+BYv<f c 8F-#Fr`|8':ю#h>>Z{$9HBѐDԥHɫx$$7I@o  )MGDFjbYX 4eFkd,?)5?Ҕ- KBb 4KD*:&,%`.ʴ7�Dhb 3nFSc/9͋͑# 6 ŭ&I4-f_փF�:D8/u2a?0h")q.{ vt>'Gt@yQAۀQ$��;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image8�����������������������������������������������������������������000644 �000765 �000000 �00000001540 07504443353 017353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ag�������???���������,����g���H0I8ͻ`(dihlp,Ϝ`xn4:TEkaRZ )p2 5CHmL#ir4Azp|"Rr{^[l@M=zZny/38x27B[a S')OE L$U_YJ Týh!(Ė-ѭ˼.&Fd+7M~P w ^d`HE&?d ]rNdL֠/+fD{ViS33  I D&,e) ɫA|i*ƒ/VӐ{ʒuEMosvD߹^VA:慶FR!\r˗1,5ϝA=1ӧQxLzM�0 �֢]0L;.9%s5$ntp{$No+w]_#͗μD]SPK55"';ȧZyŁjT�>Wuf7!u j!sg@'Yy+؉=ZYU!9�p��eS.b؈f9ؑˏ-5Q)"BmaJȡ7`vN 類lgڙ" >x*N`"Z~PiF2RTQ&WLYX<D$&xVMYzi_~ʧ 蜆20Yl3BB(,̚]#9`Yk覫+C�;����������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/image9�����������������������������������������������������������������000644 �000765 �000000 �00000004513 07504443353 017357� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������???���������!���,������H0I8ͻ`(dihlp,tmߘ|P"r(h%Z AˍjxL.oty�l8n 7st3$~&|;Tb6 a@+8:ype /Ul4i,jc2{%7s'-̘dǬa(!׋ #!ahxcsA~gtr*嚧(0o>#8 F'px GZǕPOy:nKu>%|)$vgP<@ (R(xf,>ŴSnޯf*mwˣTmP_w^(۾n%ۺ�M#YτŸa~Yg`ҡLu@�y.:fʴm{KǗߕ֭y7ڹ�9;y.: \6 'rRxCF} H:Y^}p߯?Nzq-]s;X! ,tuTTǟr]ZtNq>(@G\'WURo$ Hȣ'\ @Gl[6v`(2_~qNiE.NU]-Ii}^"C>y\{ Ǒ5@ge`ՋebSo$[bH&罘|Sa+dXJZTTA!WdG|r8p`GZC^Ы]ˮ'uXOKAYTG@GEd,٨ۨG>#cIЛX toSIt*~I¿�,p(0pՎdq1&6*9Ak E%N;2*$� � �3.$64Jc Ou^uXZ\]]_wehSv^7 Ma']޺ڍ܆ ~]fu8g];NvzB8ےc:ȏjayxU_蛨F:G{0ki8H<O~:[.}?o}4;T+s>"u+s>JSo_>_nMF,_{2 .ZP� x3W=S6Y3) 9q!̢6A,00E3;! K p& S ꄇ@2Ȫ̟eDVi/ q0 ͦ]bR>]D@x.)2c◱X&)w2&$HpeIcC'(Aav D? #l4d[4;EFOcز ihĥN,c)9(RQX'NS fه@J%찲\<)B'7.@h86HwPzL`OT797ҕ&& V@g>O%,J ! u[jZ2BII D6#z&TRF336>f=JҒMML~&W)Ma)a祒TYj.X6x WJVժaY}Jԉl[IU)JWͅsֺжꐰ 9WNmc!֥u e# @L�gg3�@f]ZPCo LAkA ؒPlb�@#'s?ToG׸Rb+FW`u8m.xbW"\|'( RᝮPsRIK*υTڛ}~wƤuٯwzQylf.qC] {XF@pW�sxf0e(O&&1~k8mg0 &EW5%309)rc.sdL~K\.P| Sf<d9Y͞ i� gv\מD%yMc]*EC :Wje|Vm!XZ5u ;YIJѝ~{ZS5jWZפ5up ңpu;f2m.[.WzڴɣrXÝxmZmgIQ[tݹ[VbM kh^n}fVun]WvCM\J5]ռZmme:]bZ i6Wrs[;y|.HOB��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page3/index.html�������������������������������������������������������������000644 �000765 �000000 �00000322747 07504443352 020271� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<html><body bgcolor="white"> <hr> <h1 align="center">Embedding Tcl in C/C++ Applications</h1> <table width="100%"> <tr><td valign="top" align="left" width="46%"> <b>Presented At:</b> <blockquote> The&nbsp;Tcl2K&nbsp;Conference<br> Austin, Texas<br> <nobr>9:00am, February 15, 2000</nobr><br> </blockquote> </td> <td width="5%">&nbsp;</td> <td valign="top" align="left" width="46%"> <b>Instructor:</b> <blockquote> D. Richard Hipp<br> drh@hwaci.com<br> http://www.hwaci.com/drh/<br> 704.948.4565 </blockquote> </td></tr> </table><p> <center><table border="2"> <tr><td> <p align="center"> Copies of these notes, example source code,<br>and other resources related to this tutorial<br>are available online at <a href="http://www.hwaci.com/tcl2k/"> http://www.hwaci.com/tcl2k/</a></p> <p align="center"><small>$Id: index.html,v 1.1.1.1 2002/06/20 21:19:38 joye Exp $</small></p></td></tr> </table> </center> </p> <br clear="both"><p><hr></p> <h2 align="center">Tutorial Outline</h2> <p><ul><li>Introduction</li> <li>Building It Yourself</li> <ul><li>"Hello, World!" using Tcl</li> <li>Tcl scripts as C strings</li> <li>Adding new Tcl commands</li> <li>A tour of the Tcl API</li> <li>Tcl initialization scripts</li> <li>Adding Tk</li> </ul><li>Tools Survey</li> <li>Mktclapp</li> <ul><li>"Hello World" using mktclapp</li> <li>Adding C code</li> <li>Other Features</li> <li>Invoking Tcl from C</li> <li>Running mktclapp directly</li> <li>Real-world examples</li> </ul><li>Summary</li> </ul></p> <br clear="both"><p><hr></p> <h2 align="center">Embedding Tcl in C/C++ Applications</h2> <p><ul><li>You know how to program in Tcl/Tk</li></ul><ul><li>You know how to program in C/C++</li></ul><ul><li>This tutorial is about how to do both at the same time.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Why Mix C With Tcl/Tk?</h2> <p><ul><li>Use C for the things C is good at and Tcl for the things Tcl is good at.</li></ul><ul><li>Generate standalone executables. <ul><li>Eliminate the need to install Tcl/Tk.</li> <li>Prevent problems when the wrong version of Tcl/Tk is installed.</li> </ul></li></ul><ul><li>Prevent end users from changing the source code. <ul><li>Keeps users from creating new bugs.</li> <li>Protects proprietary code.</li> </ul></li></ul><ul><li>Office politics</li></ul><ul><li>Use Tcl/Tk as a portability layer for a large C program</li></ul><ul><li>Use Tcl as a testing interface</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Why Mix C With Tcl/Tk?</h2> <p><blockquote><big><b> "Use C for the things C is good at and use Tcl/Tk for the things Tcl/Tk is good at." </b></blockquote></p><p> <table width="100%"> <tr><td valign="top" align="left" width="46%"> <b>C is good at:</b> <ul> <li>Speed</li> <li>Complex data structures</li> <li>Computation</li> <li>Interacting with hardware</li> <li>Byte-by-byte data analysis</li> </ul> </td> <td width="5%">&nbsp;</td> <td valign="top" align="left" width="46%"> <b>Tcl/Tk is good at:</b> <ul> <li>Building a user interface</li> <li>Manipulation of strings</li> <li>Portability</li> <li>Opening sockets</li> <li>Handling events</li> </ul> </td></tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Programming Models</h2> <table width="100%"> <tr><td valign="top" width="49%"> <p><b>Mainstream Tcl Programming Model:</b></p> </td> <td width="2%">&nbsp;</td> <td valign="top" width="49%"> <p><b>Embedded Tcl Programming Model:&nbsp;&nbsp;</b></p> </td></tr> <tr><td valign="top" width="49%"> <ul><li>Add bits of C code to a large Tcl program</li></ul> </td> <td width="2%">&nbsp;</td> <td valign="top" width="49%"> <ul><li>Add bits of Tcl code to a large C program</li></ul> </td></tr> <tr><td valign="top" width="49%"> <ul><li>Main Tcl script loads extensions written in C</li></ul> </td> <td width="2%">&nbsp;</td> <td valign="top" width="49%"> <ul><li>Main C procedure invokes the Tcl interpreter</li></ul> </td></tr> <tr><td valign="top" width="49%"> <ul><li>Tcl/Tk is a programming language</li></ul> </td> <td width="2%">&nbsp;</td> <td valign="top" width="49%"> <ul><li>Tcl/Tk is a C library</li></ul> </td></tr> <tr><td valign="top" width="49%"> <center><img src="image1"><br> Most of the Tcl2K conference is about</center> </td> <td width="2%">&nbsp;</td> <td valign="top" width="49%"> <center><img src="image1"><br> This tutorial is about</center> </td></tr> </table> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using The Tcl Library</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h></tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Always include &lt;tcl.h></td> </tr> <tr><td valign="center"> <small><tt>int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Create a new Tcl interpreter</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;"puts&nbsp;{Hello,&nbsp;World!}");</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Execute a Tcl command.</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Compiling "Hello, World!"</h2> <p><p><b>Unix:</b></p> <blockquote><tt> $ gcc hello.c -ltcl -lm -ldl<br> $ ./a.out<br> Hello, World!</tt></blockquote> <p><b>Windows using Cygwin:</b></p> <blockquote><tt> C:> gcc hello.c -ltcl80 -lm<br> C:> a.exe<br> Hello, World!</tt></blockquote> <p><b>Windows using Mingw32:</b></p> <blockquote><tt> C:> gcc -mno-cygwin hello.c -ltcl82 -lm<br> </tt></blockquote> <table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>Also works with VC++</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">Where Does <tt>-ltcl</tt> Come From On Unix?</h2> <p><p>Build it yourself using these steps:</p></p><p> <p><ul><li>Get tcl8.2.2.tar.gz from Scriptics</li></ul><ul><li><tt>zcat tcl8.2.2.tar.gz | tar vx </tt></li></ul><ul><li><tt>cd tcl8.2.2/unix</tt></li></ul><ul><li><tt>./configure --disable-shared</tt></li></ul><ul><li><tt>make</tt></li></ul><ul><li>Move <b>libtcl8.2.a</b> to your lib directory.</li></ul><ul><li>Copy <b>../generic/tcl.h</b> into /usr/include.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">What Other Libraries Are Required For Unix?</h2> <p><ul><li>The sequence of <b>-l</b> options after <b>-ltcl</b> varies from system to system</li></ul><ul><li>Observe what libraries the TCL makefile inserts when it is building <b>tclsh</b></li></ul><ul><li>Examples in this talk are for RedHat Linux 6.0 for Intel</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">How To Compile Under Unix Without Installing Tcl</h2> <p><p>Specify the *.a file directly:</p> <blockquote><pre> $ gcc -I../tcl8.2.2/generic hello.c \ ../tcl8.2.2/unix/libtcl8.2.a -lm -ldl $ strip a.out $ ./a.out Hello, World!</pre></blockquote> <p>Or, tell the C compiler where to look for *.a files:</p> <blockquote><pre> $ gcc -I../tcl8.2.2/generic hello.c \ -L../tcl8.2.2/unix -ltcl -lm -ldl $ strip a.out $ ./a.out Hello, World!</pre></blockquote> <table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>The <tt>-I../tcl8.2.2</tt> argument tells the compiler where to find <tt>&lt;tcl.h&gt;</tt>.</p></b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">What's "Cygwin"?</h2> <p><ul><li>An implementation of GCC/G++ and all development tools for Windows95/98/NT/2000</li></ul><ul><li>Available for free download at <blockquote> <tt>http://sourceware.cygnus.com/cygwin/</tt> </blockquote></li></ul><ul><li>Also available shrink-wrapped at your local software retailer or online at <blockquote> <tt>http://www.cygnus.com/cygwin/index.html</tt> </blockquote></li></ul><ul><li>Programs compiled using Cygwin require a special DLL (<b>cygwin1.dll</b>) that provides a POSIX system API</li></ul><ul><li>Cygwin1.dll cannot be shipped with proprietary programs without purchasing a license from Cygnus.</li></ul><ul><li>Mingw32 is the same compiler as Cygwin, but generates binaries that do not use cygwin1.dll</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Where Does <tt>-ltcl82</tt> Come From On Windows?</h2> <p><p>Build it like this:</p></p><p> <p><ul><li>Get <b>tcl82.lib</b> and <b>tcl82.dll</b> from Scriptics.</li></ul><ul><li><tt>echo EXPORTS >tcl82.def</tt></li></ul><ul><li><tt>nm tcl82.lib | grep 'T _' | sed 's/.* T _//' >>tcl82.def</tt></li></ul><ul><li><tt>dlltool --def tcl82.def --dllname tcl82.dll --output-lib libtcl82.a</tt></li></ul><ul><li>Move <b>libtcl82.a</b> to the lib directory and <b>tcl82.dll</b> to the bin directory.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Where Does Your Code Go?</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Your&nbsp;application&nbsp;code&nbsp;goes&nbsp;here&nbsp;*/</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Insert C code here to do whatever it is your program is suppose to do</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Building A Simple TCLSH</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;char&nbsp;*z;<br> &nbsp;&nbsp;char&nbsp;zLine[2000];<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;while(&nbsp;fgets(zLine,sizeof(zLine),stdin)&nbsp;){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Get one line of input</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zLine);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Execute the input as Tcl.</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;=&nbsp;Tcl_GetStringResult(interp);<br> &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;z[0]&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("PX\n",&nbsp;z);<br> &nbsp;&nbsp;&nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Print result if not empty</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;}<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>What if user types more than 2000 characters?</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Building A Simple TCLSH</h2> <p>Use TCL to handle input. Allows input lines of unlimited length.</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> /*&nbsp;Tcl&nbsp;code&nbsp;to&nbsp;implement&nbsp;the<br> **&nbsp;input&nbsp;loop&nbsp;*/<br> static&nbsp;char&nbsp;zLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;"while&nbsp;{![eof&nbsp;stdin]}&nbsp;{\n"</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"&nbsp;&nbsp;set&nbsp;line&nbsp;[gets&nbsp;stdin]\n"</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Get one line of input</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"&nbsp;&nbsp;set&nbsp;result&nbsp;[eval&nbsp;$line]\n"</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Execute input as Tcl</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"&nbsp;&nbsp;if&nbsp;{$result!=\"\"}&nbsp;{puts&nbsp;$result}\n"</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Print result</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"}\n"<br> ;<br> &nbsp;<br> <br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zLoop);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Run the Tcl input loop</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>But what about commands that span multiple lines of input?</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Better Handling Of Command-Line Input</h2> <p>The file "input.tcl"</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>set&nbsp;line&nbsp;{}<br> while&nbsp;{![eof&nbsp;stdin]}&nbsp;{</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if&nbsp;{$line!=""}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;">&nbsp;"<br> &nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;"%&nbsp;"<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;flush&nbsp;stdout</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Prompt for user input. The prompt is normally &quot;%&quot; but changes to &quot;&gt;&quot; if the current line is a continuation.</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;append&nbsp;line&nbsp;[gets&nbsp;stdin]<br> &nbsp;&nbsp;if&nbsp;{[info&nbsp;complete&nbsp;$line]}&nbsp;{</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{[catch&nbsp;{uplevel&nbsp;#0&nbsp;$line}&nbsp;result]}&nbsp;{</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">If the command is complete, execute it.</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;stderr&nbsp;"Error:&nbsp;$result"<br> &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{$result!=""}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;$result<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;line&nbsp;{}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;append&nbsp;line&nbsp;\n<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">If the command is incomplete, append a newline and get another line of text.</td> </tr> <tr><td valign="center"> <small><tt>}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Better Handling Of Command-Line Input</h2> <p>The file "input.c"</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;"source&nbsp;input.tcl");</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Read and execute the input loop</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>But now the program is not standalone!</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Converting Scripts Into C Strings</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;"set&nbsp;line&nbsp;{}\n"<br> &nbsp;&nbsp;"while&nbsp;{![eof&nbsp;stdin]}&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;if&nbsp;{$line!=\"\"}&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;\">&nbsp;\"\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;}&nbsp;else&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;\"%&nbsp;\"\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;}\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;flush&nbsp;stdout\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;append&nbsp;line&nbsp;[gets&nbsp;stdin]\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;if&nbsp;{[info&nbsp;complete&nbsp;$line]}&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{[catch&nbsp;{uplevel&nbsp;#0&nbsp;$line}&nbsp;result]}&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;stderr&nbsp;\"Error:&nbsp;$result\"\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{$result!=\"\"}&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;$result\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;}\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;line&nbsp;{}\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;}&nbsp;else&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;append&nbsp;line&nbsp;\\n\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;}\n"<br> &nbsp;&nbsp;"}\n"<br> ;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Compile Tcl Scripts Into C Programs</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt><br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Actual&nbsp;code&nbsp;omitted&nbsp;*/<br> ;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Copy and paste the converted Tcl script here</td> </tr> <tr><td valign="center"> <small><tt><br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Execute the Tcl code</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Converting Scripts To Strings<br>Using SED Or TCLSH</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>sed&nbsp;-e&nbsp;'s/\\/\\\\/g'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Convert <b>\</b> into <b>\\</b></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'s/"/\\"/g'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Convert <b>"</b> into <b>\"</b></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'s/^/&nbsp;&nbsp;"/'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Add <b>"</b> to start of each line</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'s/$/\\n"/'&nbsp;input.tcl</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Add <b>\n"</b> to end of each line</td> </tr> <tr><td valign="center"> <small><tt><br> &nbsp;<br> <br> &nbsp;<br> <br> while&nbsp;{![eof&nbsp;stdin]}&nbsp;{<br> &nbsp;&nbsp;set&nbsp;line&nbsp;[gets&nbsp;stdin]</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;regsub&nbsp;-all&nbsp;{\}&nbsp;$line&nbsp;{&amp;&amp;}&nbsp;line</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Convert <b>\</b> into <b>\\</b></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;regsub&nbsp;-all&nbsp;{"}&nbsp;$line&nbsp;{\"}&nbsp;line</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Convert <b>"</b> into <b>\"</b></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;puts&nbsp;"\"$line\\n\""</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Add <b>"</b> in front and <b>\n"</b> at the end</td> </tr> <tr><td valign="center"> <small><tt>}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Converting Scripts Into C Strings</h2> <p>You may want to save space by removing comments and extra whitespace from scripts.</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;"set&nbsp;line&nbsp;{}\n"<br> &nbsp;&nbsp;"while&nbsp;{![eof&nbsp;stdin]}&nbsp;{\n"<br> &nbsp;&nbsp;"if&nbsp;{$line!=\"\"}&nbsp;{\n"<br> &nbsp;&nbsp;"puts&nbsp;-nonewline&nbsp;\">&nbsp;\"\n"<br> &nbsp;&nbsp;"}&nbsp;else&nbsp;{\n"<br> &nbsp;&nbsp;"puts&nbsp;-nonewline&nbsp;\"%&nbsp;\"\n"<br> &nbsp;&nbsp;"}\n"<br> &nbsp;&nbsp;"flush&nbsp;stdout\n"<br> &nbsp;&nbsp;"append&nbsp;line&nbsp;[gets&nbsp;stdin]\n"<br> &nbsp;&nbsp;"if&nbsp;{[info&nbsp;complete&nbsp;$line]}&nbsp;{\n"<br> &nbsp;&nbsp;"if&nbsp;{[catch&nbsp;{uplevel&nbsp;#0&nbsp;$line}&nbsp;result]}&nbsp;{\n"<br> &nbsp;&nbsp;"puts&nbsp;stderr&nbsp;\"Error:&nbsp;$result\"\n"<br> &nbsp;&nbsp;"}&nbsp;elseif&nbsp;{$result!=\"\"}&nbsp;{\n"<br> &nbsp;&nbsp;"puts&nbsp;$result\n"<br> &nbsp;&nbsp;"}\n"<br> &nbsp;&nbsp;"set&nbsp;line&nbsp;{}\n"<br> &nbsp;&nbsp;"}&nbsp;else&nbsp;{\n"<br> &nbsp;&nbsp;"append&nbsp;line&nbsp;\\n\n"<br> &nbsp;&nbsp;"}\n"<br> &nbsp;&nbsp;"}\n"<br> ;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Converting Scripts To Strings</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>sed&nbsp;-e&nbsp;'s/\\/\\\\/g'&nbsp;\&nbsp;<br> &nbsp;&nbsp;-e&nbsp;'s/"/\\"/g'&nbsp;\&nbsp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'/^&nbsp;*#/d'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Delete lines that begin with #</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'/^&nbsp;*$/d'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Delete blank lines</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'s/^&nbsp;*/&nbsp;&nbsp;"/'&nbsp;\&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Delete leading spaces</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;-e&nbsp;'s/$/\\n"/'&nbsp;input.tcl<br> &nbsp;<br> <br> &nbsp;<br> <br> &nbsp;<br> while&nbsp;{![eof&nbsp;stdin]}&nbsp;{<br> &nbsp;&nbsp;set&nbsp;line&nbsp;[gets&nbsp;stdin]</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;set&nbsp;line&nbsp;[string&nbsp;trimleft&nbsp;$line]</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Remove leading space</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if&nbsp;{$line==""}&nbsp;continue</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Delete blank lines</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if&nbsp;{[string&nbsp;index&nbsp;$line&nbsp;0]=="#"}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;continue<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Delete lines starting with #</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;regsub&nbsp;-all&nbsp;{\}&nbsp;$line&nbsp;{&amp;&amp;}&nbsp;line<br> &nbsp;&nbsp;regsub&nbsp;-all&nbsp;{"}&nbsp;$line&nbsp;{\"}&nbsp;line<br> &nbsp;&nbsp;puts&nbsp;"\"$line\\n\""<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Removing Comments Or Leading Space<br>Will Break Some Tcl Scripts!</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>image&nbsp;create&nbsp;bitmap&nbsp;smiley&nbsp;-data&nbsp;{</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>#define&nbsp;smile_width&nbsp;15<br> #define&nbsp;smile_height&nbsp;15</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">These lines begin with # but are not comment</td> </tr> <tr><td valign="center"> <small><tt>static&nbsp;unsigned&nbsp;char&nbsp;smile_bits[]&nbsp;=&nbsp;{<br> &nbsp;&nbsp;&nbsp;0xc0,&nbsp;0x01,&nbsp;0x30,&nbsp;0x06,&nbsp;0x0c,&nbsp;0x18,<br> &nbsp;&nbsp;&nbsp;0x04,&nbsp;0x10,&nbsp;0x22,&nbsp;0x22,&nbsp;0x52,&nbsp;0x25,<br> &nbsp;&nbsp;&nbsp;0x01,&nbsp;0x40,&nbsp;0x01,&nbsp;0x40,&nbsp;0x01,&nbsp;0x40,<br> &nbsp;&nbsp;&nbsp;0x12,&nbsp;0x24,&nbsp;0xe2,&nbsp;0x23,&nbsp;0x04,&nbsp;0x10,<br> &nbsp;&nbsp;&nbsp;0x0c,&nbsp;0x18,&nbsp;0x30,&nbsp;0x06,&nbsp;0xc0,&nbsp;0x01};<br> }<br> &nbsp;<br> <br> &nbsp;<br> text&nbsp;.t<br> pack&nbsp;.t<br> .t&nbsp;insert&nbsp;end&nbsp;[string&nbsp;trim&nbsp;{</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>She&nbsp;walks&nbsp;in&nbsp;beauty,&nbsp;like&nbsp;the&nbsp;night<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Of&nbsp;cloudless&nbsp;climes&nbsp;and&nbsp;starry&nbsp;skies;<br> And&nbsp;all&nbsp;that's&nbsp;best&nbsp;of&nbsp;dark&nbsp;and&nbsp;bright<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Meet&nbsp;in&nbsp;her&nbsp;aspect&nbsp;and&nbsp;her&nbsp;eyes;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Indentation is deleted on lines 2 and 4</td> </tr> <tr><td valign="center"> <small><tt>}]&nbsp;<br> &nbsp;<br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>Problems like these are rare</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Adding A "continue" Command</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>set&nbsp;line&nbsp;{}<br> while&nbsp;{![eof&nbsp;stdin]}&nbsp;{<br> &nbsp;&nbsp;if&nbsp;{$line!=""}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;">&nbsp;"<br> &nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;-nonewline&nbsp;"%&nbsp;"<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;flush&nbsp;stdout<br> &nbsp;&nbsp;append&nbsp;line&nbsp;[gets&nbsp;stdin]<br> &nbsp;&nbsp;if&nbsp;{[info&nbsp;complete&nbsp;$line]}&nbsp;{</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{[lindex&nbsp;$line&nbsp;0]=="continue"}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Break out of the loop if the command is "continue"</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{[catch&nbsp;{uplevel&nbsp;#0&nbsp;$line}&nbsp;result]}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;stderr&nbsp;"Error:&nbsp;$result"<br> &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{$result!=""}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;$result<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;line&nbsp;{}<br> &nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;append&nbsp;line&nbsp;\n<br> &nbsp;&nbsp;}<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Stop For Tcl Input At Various Points<br>In A C Program</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;Input&nbsp;loop&nbsp;as&nbsp;a&nbsp;C&nbsp;string&nbsp;*/<br> ;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Application&nbsp;C&nbsp;code&nbsp;*/</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Do some computation</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Stop for some Tcl input</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;More&nbsp;application&nbsp;C&nbsp;code&nbsp;*/</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Do more computation</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Stop for more Tcl input</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Finish&nbsp;up&nbsp;the&nbsp;application&nbsp;*/</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Finish the computation</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Using Tcl For Testing</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;Input&nbsp;loop&nbsp;as&nbsp;a&nbsp;C&nbsp;string&nbsp;*/<br> ;<br> &nbsp;<br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> #ifdef&nbsp;TESTING<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Create interpreter only if TESTING is defined</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();<br> #endif<br> &nbsp;&nbsp;/*&nbsp;Application&nbsp;C&nbsp;code&nbsp;*/</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>#ifdef&nbsp;TESTING<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> #endif</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Accept command-line input only if TESTING is defined</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;More&nbsp;application&nbsp;C&nbsp;code&nbsp;*/<br> #ifdef&nbsp;TESTING<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> #endif<br> &nbsp;&nbsp;/*&nbsp;Finish&nbsp;up&nbsp;the&nbsp;application&nbsp;*/<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Creating A New Tcl Command In C</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> int&nbsp;NewCmd(</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;void&nbsp;*clientData,<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp,<br> &nbsp;&nbsp;int&nbsp;argc,<br> &nbsp;&nbsp;char&nbsp;**argv</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">The Tcl command is implemented as a C function with four arguments.</td> </tr> <tr><td valign="center"> <small><tt>){<br> &nbsp;&nbsp;printf("Hello,&nbsp;World!\n");</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;TCL_OK;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Returns TCL_OK or TCL_ERROR</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;code&nbsp;omitted...&nbsp;*/<br> ;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_CreateCommand(interp,&nbsp;"helloworld",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewCmd,&nbsp;0,&nbsp;0);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Tell the interpreter which C function to call when the "helloworld" Tcl command is executed</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Linkage From Tcl To C</h2> <p><p align="center"><img src="image4"></p></p><p><ul><li>3rd parameter of Tcl_CreateCommand() is a pointer to the C subroutine that implements the command.</li></ul><ul><li>4th parameter to Tcl_CreateCommand() becomes the 1st parameter to the C routine whenever the Tcl command is executed.</li></ul><ul><li>1st parameter to Tcl_CreateCommand() must be a valid Tcl interpreter. The same pointer appears as the second parameter to the C routine whenever the Tcl command is executed.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Linkage From Tcl To C</h2> <p><p align="center"><img src="image5"></p></p><p><ul><li>5th parameter of Tcl_CreateCommand() is a pointer to the C subroutine that is called when the Tcl command is deleted.</li></ul><ul><li>4th parameter to Tcl_CreateCommand() becomes the 1st parameter to the C routine.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">When To Use A Delete Proc</h2> <p>Examples of where the delete proc is used in standard Tcl/Tk:</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>button&nbsp;.b&nbsp;-text&nbsp;Hello<br> pack&nbsp;.b</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>rename&nbsp;.b&nbsp;{}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Deleting the <b>.b</b> command causes the button to be destroyed</td> </tr> <tr><td valign="center"> <small><tt><br> &nbsp;<br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>image&nbsp;create&nbsp;photo&nbsp;smiley&nbsp;\&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;-file&nbsp;smiley.gif</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>rename&nbsp;smiley&nbsp;{}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Deleting the <b>smiley</b> command destroys the image and reclaims the memory used to hold the image</td> </tr> </table> <p><ul><li>Always use a delete proc if the clientData is a pointer to malloced memory or some other resource that needs freeing</li></ul><ul><li>Delete procs are never used in the Tcl core but are used extensively in Tk</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Linkage From Tcl To C</h2> <p>The <tt>argc</tt> and <tt>argv</tt> parameters work just like in <tt>main()</tt></p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>helloworld&nbsp;one&nbsp;{two&nbsp;three}&nbsp;four</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center"><tt>argc = 4<br> argv[0] = "helloworld"<br> argv[1] = "one"<br> argv[2] = "two three"<br> argv[3] = "four"<br> argv[4] = NULL</tt></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">A Short-Cut</h2> <p>In a program with many new Tcl commands implemented in C, it becomes tedious to type the same four parameters over and over again. So we define a short-cut.</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#define&nbsp;TCLARGS&nbsp;\&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*clientData,&nbsp;\&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;Tcl_Interp&nbsp;*interp,&nbsp;\&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;argc,&nbsp;\&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*argv</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Define TCLARGS once in a header file</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;<br> &nbsp;<br> &nbsp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>int&nbsp;NewCmd(TCLARGS){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Use the TCLARGS macro to define new C functions that implement Tcl commands.</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;/*&nbsp;implementation...&nbsp;*/<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>For brevity, we will use the TCLARGS macro during the rest of this talk.</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Returning A Value From C Back To Tcl</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>int&nbsp;NewCmd(TCLARGS){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Note that the C function returns an "int"</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;TCL_OK;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Return value is TCL_OK or TCL_ERROR</td> </tr> <tr><td valign="center"> <small><tt>}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><ul><li>TCL_OK and TCL_ERROR are defined in &lt;tcl.h&gt;</li></ul><ul><li>Other valid return values TCL_RETURN, TCL_BREAK and TCL_CONTINUE are rarely used</li></ul><ul><li>Common mistake: forgetting to return TCL_OK</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Returning A Value From C Back To Tcl</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>int&nbsp;NewCmd(TCLARGS){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_SetResult(interp,"Hello!",TCL_STATIC);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Set the result to "Hello!"</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;TCL_OK;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><ul><li>Result should be the text of an error message if you return TCL_ERROR.</li></ul><ul><li>3rd argument to Tcl_SetResult() can be TCL_STATIC, TCL_DYNAMIC, TCL_VOLATILE, or a function pointer.</li></ul><ul><li>Also consider using Tcl_AppendResult().</li></ul><ul><li>Direct access to <tt>interp->result</tt> is deprecated.</li></ul><ul><li>See the man pages for details.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">The Tcl_Obj Interface</h2> <p><ul><li>A new way to write Tcl commands in C code</li></ul><ul><li>First introduced in Tcl8.0</li></ul><ul><li>Can be much faster, especially for lists or numeric values.</li></ul><ul><li>Able to handle arbitrary binary data.</li></ul><ul><li>More difficult to program.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">The Tcl_Obj Interface</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>int&nbsp;NewObjCmd(<br> &nbsp;&nbsp;void&nbsp;*clientData,<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp,<br> &nbsp;&nbsp;int&nbsp;objc,</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Obj&nbsp;*const*&nbsp;objv</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">4th parameter is an array Tcl_Objs, not an array of strings</td> </tr> <tr><td valign="center"> <small><tt>){<br> &nbsp;&nbsp;/*&nbsp;Implementation...&nbsp;*/<br> &nbsp;&nbsp;return&nbsp;TCL_OK;<br> }<br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;code&nbsp;omitted...&nbsp;*/<br> ;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_CreateObjCommand(interp,&nbsp;"newcmd",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewObjCmd,&nbsp;0,&nbsp;0);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Use a different function to register the command</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">The Tcl_Obj Interface</h2> <p><ul><li>There are countless access methods for reading information from and placing information in Tcl_Objs. Always use the access methods.</li></ul><ul><li>Details provided at Lee Bernhard's talk this afternoon.</li></ul><ul><li>Definitely use Tcl_Objs if you are writing a new Tcl extension.</li></ul><ul><li>Tcl_Objs address some of the weaknesses of Tcl relative to C/C++. <ul> <li> Tcl_Objs are faster </li> <li> Tcl_Objs work with binary data </li> </ul> But C/C++ is faster still and better for working with binary data.</li></ul><ul><li>When mixing C/C++ with Tcl/Tk the benefits of Tcl_Objs are less important. Using Tcl_Objs in this context may not be worth the extra trouble.</li></ul><ul><li>This talk will focus on the string interface.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Nickel Tour Of The Tcl API</h2> <p><p><b>Memory allocation functions</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_Alloc<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_Free<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_Realloc<br> </tt></small></td> </table></center><p><b>Functions useful in the implementation of new Tcl commands</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_AppendElement<br> Tcl_AppendResult<br> Tcl_GetBoolean<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_GetDouble<br> Tcl_GetInt<br> Tcl_GetStringResult<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_ResetResult<br> Tcl_SetResult<br> </tt></small></td> </table></center><p><b>Functions for controlling the Tcl interpreter</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_CreateCommand<br> Tcl_CreateInterp<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_CreateObjCommand<br> Tcl_DeleteCommand<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_DeleteInterp<br> Tcl_Exit<br> </tt></small></td> </table></center></p> <br clear="both"><p><hr></p> <h2 align="center">Nickel Tour Of The Tcl API</h2> <p><p><b>I/O functions</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_Close<br> Tcl_Eof<br> Tcl_Flush<br> Tcl_GetChannel<br> Tcl_GetChannelMode<br> Tcl_GetChannelName<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_Gets<br> Tcl_OpenCommandChannel<br> Tcl_OpenFileChannel<br> Tcl_OpenTcpClient<br> Tcl_OpenTcpServer<br> Tcl_Read<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_Seek<br> Tcl_Tell<br> Tcl_Ungets<br> Tcl_Write<br> Tcl_WriteChars<br> </tt></small></td> </table></center><p><b>Names and meanings of system error codes</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_ErrnoId<br> Tcl_ErrnoMsg<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_GetErrno<br> Tcl_SetErrno<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_SignalId<br> Tcl_SignalMsg<br> </tt></small></td> </table></center></p> <br clear="both"><p><hr></p> <h2 align="center">Nickel Tour Of The Tcl API</h2> <p><p><b>General Operating System Calls</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_Access<br> Tcl_Chdir<br> Tcl_GetCwd<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_GetHostName<br> Tcl_GetNameOfExecutable<br> Tcl_Sleep<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_Stat<br> </tt></small></td> </table></center><p><b>String Manipulation And Comparison</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_Concat<br> Tcl_Merge<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_SplitList<br> Tcl_StringCaseMatch<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_StringMatch<br> </tt></small></td> </table></center><p><b>Dynamically Resizable Strings</b></p> <center><table width="90%"><tr> <td width="49%" valign="top"><small><tt> Tcl_DStringAppend<br> Tcl_DStringAppendElement<br> Tcl_DStringEndSublist<br> Tcl_DStringInit<br> Tcl_DStringLength<br> </tt></small></td> <td width="49%" valign="top"><small><tt> Tcl_DStringResult<br> Tcl_DStringSetLength<br> Tcl_DStringStartSublist<br> Tcl_DStringValue<br> </tt></small></td> </table></center></p> <br clear="both"><p><hr></p> <h2 align="center">Nickel Tour Of The Tcl API</h2> <p><p><b>Event Handlers</b></p> <center><table width="90%"><tr> <td width="49%" valign="top"><small><tt> Tcl_CancelIdleCall<br> Tcl_CreateChannelHandler<br> Tcl_CreateTimerHandler<br> Tcl_DeleteChannelHandler<br> </tt></small></td> <td width="49%" valign="top"><small><tt> Tcl_DeleteTimerHandler<br> Tcl_DoOneEvent<br> Tcl_DoWhenIdle<br> </tt></small></td> </table></center><p><b>Functions For Reading And Writing Tcl Variables</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_GetVar<br> Tcl_GetVar2<br> Tcl_LinkVar<br> Tcl_SetVar<br> Tcl_SetVar2<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_TraceVar<br> Tcl_TraceVar2<br> Tcl_UnlinkVar<br> Tcl_UnsetVar<br> Tcl_UnsetVar2<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_UntraceVar<br> Tcl_UntraceVar2<br> Tcl_UpdateLinkedVar<br> </tt></small></td> </table></center><p><b>Functions For Executing Tcl Code</b></p> <center><table width="90%"><tr> <td width="32%" valign="top"><small><tt> Tcl_Eval<br> Tcl_EvalFile<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_EvalObj<br> Tcl_GlobalEval<br> </tt></small></td> <td width="32%" valign="top"><small><tt> Tcl_GlobalEvalObj<br> Tcl_VarEval<br> </tt></small></td> </table></center></p> <br clear="both"><p><hr></p> <h2 align="center">Nickel Tour Of The Tcl API</h2> <p><p><b>Functions For Dealing With Unicode</b></p> <center><table width="90%"><tr> <td width="49%" valign="top"><small><tt> Tcl_NumUtfChars<br> Tcl_UniCharAtIndex<br> Tcl_UniCharIsAlnum<br> Tcl_UniCharIsAlpha<br> Tcl_UniCharIsControl<br> Tcl_UniCharIsDigit<br> Tcl_UniCharIsGraph<br> Tcl_UniCharIsLower<br> Tcl_UniCharIsPrint<br> Tcl_UniCharIsPunct<br> Tcl_UniCharIsSpace<br> Tcl_UniCharIsUpper<br> Tcl_UniCharIsWordChar<br> Tcl_UniCharLen<br> Tcl_UniCharNcmp<br> Tcl_UniCharToLower<br> Tcl_UniCharToTitle<br> </tt></small></td> <td width="49%" valign="top"><small><tt> Tcl_UniCharToUpper<br> Tcl_UniCharToUtf<br> Tcl_UniCharToUtfDString<br> Tcl_UtfAtIndex<br> Tcl_UtfBackslash<br> Tcl_UtfCharComplete<br> Tcl_UtfFindFirst<br> Tcl_UtfFindLast<br> Tcl_UtfNcasecmp<br> Tcl_UtfNcmp<br> Tcl_UtfNext<br> Tcl_UtfPrev<br> Tcl_UtfToLower<br> Tcl_UtfToTitle<br> Tcl_UtfToUniChar<br> Tcl_UtfToUniCharDString<br> Tcl_UtfToUpper<br> </tt></small></td> </table></center> <p><b>Functions For Dealing With Tcl_Objs</b></p> <blockquote><i>Too numerous to list...</i></blockquote></p> <br clear="both"><p><hr></p> <h2 align="center">Documentation Of The Tcl API</h2> <p><ul><li>Tcl comes with excellent man pages</li></ul><ul><li>"Use the source, Luke"</li></ul><ul><li>See <tt>tclDecl.h</tt> for a list of API functions</li></ul><ul><li>The header comments on the implementation of API functions usually gives a good description of what the function does and how it should be used.</li></ul><ul><li>Most API functions are used within Tcl and Tk. Use grep to locate examples.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Initialization Scripts</h2> <p><ul><li>Run the mini TCLSH implemented above and execute the <tt>parray</tt> command</li></ul><ul><li>It doesn't work! What's wrong? </p></li></li></ul><ul><li><tt>parray</tt> is really a Tcl proc that is read in when the interpreter is initialized. </p></li></li></ul><ul><li><tt>parray</tt> (and several other commands) are stored in a handful of &quot;Initialization Scripts&quot; </p></li></li></ul><ul><li>All the initialization scripts are stored in the &quot;Tcl Library&quot; - a directory on the host computer. </p></li></li></ul><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>Invoke the Tcl_Init() function to locate and read the Tcl initialization scripts.</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">The <tt>Tcl_Init()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;code&nbsp;omitted...&nbsp;*/<br> ;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Init(interp);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Locate and read the initialization scripts</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Call&nbsp;Tcl_CreateCommand()?&nbsp;*/<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>But Tcl_Init() can fail. We need to check its return value...</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">The <tt>Tcl_Init()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> static&nbsp;char&nbsp;zInputLoop[]&nbsp;=&nbsp;<br> &nbsp;&nbsp;/*&nbsp;Tcl&nbsp;code&nbsp;omitted...&nbsp;*/<br> ;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;Tcl_Init(interp)!=TCL_OK&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"Tcl_Init()&nbsp;failed:&nbsp;PX",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tcl_GetStringResult(interp));<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Print error message if Tcl_Init() fails</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Call&nbsp;Tcl_CreateCommand()?&nbsp;*/<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>But now the program is not standalone.</b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">How <tt>Tcl_Init()</tt> Works</h2> <p><ul><li>Computes the value of variable <tt>tcl_libPath</tt>.</li></ul><ul><li>Invokes the procedure named &quot;<tt>tclInit</tt>&quot;</li></ul><ul><li>A default <tt>tclInit</tt> procedure is built into Tcl. You can define an alternative <tt>tclInit</tt> procedure prior to calling <tt>Tcl_Init()</tt>.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">The Default <tt>initTcl</tt> Procedure</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>set&nbsp;errors&nbsp;{}<br> set&nbsp;dirs&nbsp;{}<br> if&nbsp;{[info&nbsp;exists&nbsp;tcl_library]}&nbsp;{<br> &nbsp;&nbsp;lappend&nbsp;dirs&nbsp;$tcl_library<br> }&nbsp;else&nbsp;{<br> &nbsp;&nbsp;if&nbsp;{[info&nbsp;exists&nbsp;env(TCL_LIBRARY)]}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;lappend&nbsp;dirs&nbsp;$env(TCL_LIBRARY)<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;lappend&nbsp;dirs&nbsp;$tclDefaultLibrary<br> &nbsp;&nbsp;unset&nbsp;tclDefaultLibrary<br> &nbsp;&nbsp;set&nbsp;dirs&nbsp;[concat&nbsp;$dirs&nbsp;$tcl_libPath]<br> }<br> foreach&nbsp;i&nbsp;$dirs&nbsp;{<br> &nbsp;&nbsp;set&nbsp;tcl_library&nbsp;$i<br> &nbsp;&nbsp;set&nbsp;tclfile&nbsp;[file&nbsp;join&nbsp;$i&nbsp;init.tcl]<br> &nbsp;&nbsp;if&nbsp;{[file&nbsp;exists&nbsp;$tclfile]}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{![catch&nbsp;{uplevel&nbsp;#0&nbsp;[list&nbsp;source&nbsp;$tclfile]}&nbsp;msg]}&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br> &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;append&nbsp;errors&nbsp;"$tclfile:&nbsp;$msg\n$errorInfo\n"<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;}<br> }<br> error&nbsp;"Can't&nbsp;find&nbsp;a&nbsp;usable&nbsp;init.tcl&nbsp;..."</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">The Default Initialization Sequence</h2> <p><ul><li>The <tt>tclInit</tt> procedure locates and sources the <tt>init.tcl</tt> script. The directory that contains <tt>init.tcl</tt> is stored in the <tt>tcl_library</tt> variable.</li></ul><ul><li>The <tt>init.tcl</tt> script creates an <tt>unknown</tt> procedure. The <tt>unknown</tt> procedure will run whenever Tcl encounters an unknown command.</li></ul><ul><li>The <tt>unknown</tt> procedure consults the file <tt>tclIndex</tt> in the <tt>tcl_library</tt> directory to see if the command is defined by one of the initialization scripts.</li></ul><ul><li>The <tt>unknown</tt> procedure sources any needed initialization scripts and retries the command.</li></ul><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>Commands defined in the initialization scripts are loaded on demand.</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">Standalone Initialization Techniques</h2> <p><p><b>Manually execute all initialization scripts</b></p> <ul><li>Convert all initialization scripts into C strings and put them in the executable.</li></ul><ul><li>Call <tt>Tcl_Eval()</tt> on each initialization script and omit the call to <tt>Tcl_Init()</tt></li></ul><ul><li>Or, redefine <tt>tclInit</tt> so that it does not attempt to source <tt>init.tcl</tt> then call <tt>Tcl_Eval()</tt> on each initialization script after <tt>Tcl_Init()</tt> returns.</li></ul><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>This approach is not recommended</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">Standalone Initialization Techniques</h2> <p><p><b>Redefining the builtin <tt>source</tt> command</b></p> <ul><li>Convert all initialization scripts into C strings and put them in the executable.</li></ul><ul><li>Create a new <tt>source</tt> command that calls <tt>Tcl_Eval()</tt> on the appropriate built-in string instead of reading from the disk.</li></ul><ul><li>Read from disk if the named file is not one that is built in.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Redefining <tt>source</tt></h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>static&nbsp;char&nbsp;zInitTcl[]&nbsp;=&nbsp;"...";<br> static&nbsp;char&nbsp;zParrayTcl[]&nbsp;=&nbsp;"...";</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Scripts <tt>init.tcl</tt> and <tt>parray.tcl</tt></td> </tr> <tr><td valign="center"> <small><tt><br> int&nbsp;NewSourceCmd(TCLARGS){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;!strcmp(argv[1],"/builtin/init.tcl")&nbsp;)<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Tcl_Eval(interp,&nbsp;zInitTcl);<br> &nbsp;&nbsp;if(&nbsp;!strcmp(argv[1],"/builtin/parray.tcl")&nbsp;)<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Tcl_Eval(interp,&nbsp;zParrayTcl);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Call <tt>Tcl_Eval()</tt> on builtin strings if the names match</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;Tcl_EvalFile(interp,&nbsp;argv[1]);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Call <tt>Tcl_EvalFile()</tt> if no match</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;setenv("TCL_LIBRARY","/builtin");</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Causes <tt>tclInit</tt> to look for <tt>init.tcl</tt> in <tt>/builtin</tt></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_CreateCommand(interp,&nbsp;"source",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewSourceCmd,&nbsp;0,&nbsp;0);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Redefine <tt>source</tt></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Init(interp);<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Redefining <tt>source</tt></h2> <p><ul><li>This approach works for all versions of Tcl and Tk.</li></ul><ul><li>Also need to redefine the "<tt>file exists</tt>" Tcl command since it too is used by <tt>tclInit</tt>.</li></ul><ul><li>To verify that the program is really standalone, remove the call to <tt>Tcl_EvalFile()</tt>.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Standalone Initialization Techniques</h2> <p><p><b>Use the <tt>Tcl</tt>*<tt>InsertProc()</tt> functions</b></p> <ul><li>Three routines that overload basic file I/O operations: <ul> <li> <tt>TclStatInsertProc()</tt> </li> <li> <tt>TclAccessInsertProc()</tt> </li> <li> <tt>TclOpenFileChannelInsertProc()</tt> </li> </ul></li></ul><ul><li>Allows us to implement a virtual filesystem that overlays the real filesystem.</li></ul><ul><li>The virtual filesystem contains all the initialization scripts as compiled-in strings. The initialization scripts look like they are resident on disk even though they are built in.</li></ul><ul><li>These functions first appeared in Tcl8.0.3. Presumably to support TclPro Wrapper.</li></ul><ul><li>The only documentation is comments on the code. See the Tcl source file <tt>generic/tclIOUtil.c</tt></li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">The <tt>TclStatInsertProc()</tt> Function</h2> <p><ul><li>Sole argument is a pointer to a function whose interface is the same as <tt>stat()</tt></li></ul><ul><li>Functions are stacked. Tcl tries each <tt>stat</tt> function on the list, beginning with the most recently inserted, until one succeeds.</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">The <tt>TclStatInsertProc()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tclInt.h></tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Rather than <tt>&lt;tcl.h&gt;</tt>!</td> </tr> <tr><td valign="center"> <small><tt><br> static&nbsp;int<br> BltinFileStat(char&nbsp;*path,struct&nbsp;stat&nbsp;*buf){<br> &nbsp;&nbsp;char&nbsp;*zData;<br> &nbsp;&nbsp;int&nbsp;nData;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;zData&nbsp;=&nbsp;FindBuiltinFile(path,&nbsp;0,&nbsp;&amp;nData);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Check if <tt>path</tt> is a builtin</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;zData==0&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Fail if <tt>path</tt> is not a builtin</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;memset(buf,&nbsp;0,&nbsp;sizeof(*buf));<br> &nbsp;&nbsp;buf->st_mode&nbsp;=&nbsp;0400;<br> &nbsp;&nbsp;buf->st_size&nbsp;=&nbsp;nData;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Success if it is builtin</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;TclStatInsertProc(BltinFileStat);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Register new <tt>stat</tt> function</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();<br> &nbsp;&nbsp;Tcl_Init(interp);<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">The <tt>TclAccessInsertProc()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tclInt.h></tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Rather than <tt>&lt;tcl.h&gt;</tt>!</td> </tr> <tr><td valign="center"> <small><tt><br> /*&nbsp;BltinFileStat()&nbsp;not&nbsp;shown...&nbsp;*/<br> &nbsp;<br> static&nbsp;int<br> BltinFileAccess(char&nbsp;*path,&nbsp;int&nbsp;mode){<br> &nbsp;&nbsp;char&nbsp;*zData;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;mode&nbsp;&amp;&nbsp;3&nbsp;)&nbsp;return&nbsp;-1;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">All builtins are read-only</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;zData&nbsp;=&nbsp;FindBuiltinFile(path,&nbsp;0,&nbsp;&amp;nData);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Check if <tt>path</tt> is a builtin</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;zData==0&nbsp;)&nbsp;return&nbsp;-1;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Fail if <tt>path</tt> is not a builtin</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;0;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Success if it is builtin</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;TclStatInsertProc(BltinFileStat);<br> &nbsp;&nbsp;TclAccessInsertProc(BltinFileAccess);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Register new <tt>stat</tt> and <tt>access</tt> functions</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();<br> &nbsp;&nbsp;Tcl_Init(interp);<br> &nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zInputLoop);<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">The <tt>TclOpenFileChannelInsertProc()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>static&nbsp;Tcl_Channel&nbsp;BuiltinFileOpen(<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp,&nbsp;&nbsp;&nbsp;/*&nbsp;The&nbsp;TCL&nbsp;interpreter&nbsp;doing&nbsp;the&nbsp;open&nbsp;*/<br> &nbsp;&nbsp;char&nbsp;*zFilename,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Name&nbsp;of&nbsp;the&nbsp;file&nbsp;to&nbsp;open&nbsp;*/<br> &nbsp;&nbsp;char&nbsp;*modeString,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Mode&nbsp;string&nbsp;for&nbsp;the&nbsp;open&nbsp;(ignored)&nbsp;*/<br> &nbsp;&nbsp;int&nbsp;permissions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Permissions&nbsp;for&nbsp;a&nbsp;newly&nbsp;created&nbsp;file&nbsp;(ignored)&nbsp;*/<br> ){<br> &nbsp;&nbsp;char&nbsp;*zData;<br> &nbsp;&nbsp;BuiltinFileStruct&nbsp;*p;<br> &nbsp;&nbsp;int&nbsp;nData;<br> &nbsp;&nbsp;char&nbsp;zName[50];<br> &nbsp;&nbsp;Tcl_Channel&nbsp;chan;<br> &nbsp;&nbsp;static&nbsp;int&nbsp;count&nbsp;=&nbsp;1;<br> &nbsp;<br> &nbsp;&nbsp;zData&nbsp;=&nbsp;FindBuiltinFile(zFilename,&nbsp;1,&nbsp;&amp;nData);<br> &nbsp;&nbsp;if(&nbsp;zData==0&nbsp;)&nbsp;return&nbsp;NULL;<br> &nbsp;&nbsp;p&nbsp;=&nbsp;(BuiltinFileStruct*)Tcl_Alloc(&nbsp;sizeof(BuiltinFileStruct)&nbsp;);<br> &nbsp;&nbsp;if(&nbsp;p==0&nbsp;)&nbsp;return&nbsp;NULL;<br> &nbsp;&nbsp;p->zData&nbsp;=&nbsp;zData;<br> &nbsp;&nbsp;p->nData&nbsp;=&nbsp;nData;<br> &nbsp;&nbsp;p->cursor&nbsp;=&nbsp;0;<br> &nbsp;&nbsp;sprintf(zName,"etbi_bffffc7c_8049b04",((int)BuiltinFileOpen)>>12,count++);<br> &nbsp;&nbsp;chan&nbsp;=&nbsp;Tcl_CreateChannel(&amp;builtinChannelType,&nbsp;zName,&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ClientData)p,&nbsp;TCL_READABLE);<br> &nbsp;&nbsp;return&nbsp;chan;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">The <tt>TclOpenFileChannelInsertProc()</tt> Function</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>static&nbsp;Tcl_ChannelType&nbsp;builtinChannelType&nbsp;=&nbsp;{<br> &nbsp;&nbsp;"builtin",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Type&nbsp;name.&nbsp;*/<br> &nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Always&nbsp;non-blocking.*/<br> &nbsp;&nbsp;BuiltinFileClose,&nbsp;&nbsp;&nbsp;/*&nbsp;Close&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;BuiltinFileInput,&nbsp;&nbsp;&nbsp;/*&nbsp;Input&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;BuiltinFileOutput,&nbsp;&nbsp;/*&nbsp;Output&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;BuiltinFileSeek,&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Seek&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Set&nbsp;option&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Get&nbsp;option&nbsp;proc.&nbsp;*/<br> &nbsp;&nbsp;BuiltinFileWatch,&nbsp;&nbsp;&nbsp;/*&nbsp;Watch&nbsp;for&nbsp;events&nbsp;on&nbsp;console.&nbsp;*/<br> &nbsp;&nbsp;BuiltinFileHandle,&nbsp;&nbsp;/*&nbsp;Get&nbsp;a&nbsp;handle&nbsp;from&nbsp;the&nbsp;device.&nbsp;*/<br> };</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p> <p>For additional information see:</p> <ul> <li>The man page for <tt>Tcl_CreateChannel()</tt></li> <li>Tk source code file <tt>generic/tkConsole.c</tt></li> </ul> </p> <br clear="both"><p><hr></p> <h2 align="center">Initializing Tk</h2> <p><ul><li>All the same initialization script issues as Tcl</li></ul><ul><li>Tk initialization scripts are in a different directory than the Tcl initialization scripts - the "Tk Library"</li></ul><ul><li>Call <tt>Tk_Init()</tt> after <tt>Tcl_Init()</tt></li></ul><ul><li>Must have an event loop or Tk will not work!</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Implementing An Event Loop</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>button&nbsp;.b&nbsp;-text&nbsp;Hello&nbsp;-command&nbsp;exit<br> pack&nbsp;.b</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Create a Tk interface</td> </tr> <tr><td valign="center"> <small><tt><br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>bind&nbsp;.&nbsp;&lt;Destroy>&nbsp;{<br> &nbsp;&nbsp;if&nbsp;{![winfo&nbsp;exists&nbsp;.]}&nbsp;exit<br> }</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Close the application when the main window is destroyed</td> </tr> <tr><td valign="center"> <small><tt><br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>while&nbsp;1&nbsp;{vwait&nbsp;forever}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">The event loop</td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using Tk</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tk.h><br> &nbsp;<br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>static&nbsp;char&nbsp;zHello[]&nbsp;=&nbsp;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">The application code</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"button&nbsp;.b&nbsp;"<br> &nbsp;&nbsp;&nbsp;&nbsp;"-text&nbsp;{Hello,&nbsp;World}&nbsp;"<br> &nbsp;&nbsp;&nbsp;&nbsp;"-command&nbsp;exit\n"<br> &nbsp;&nbsp;"pack&nbsp;.b\n";<br> &nbsp;<br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>static&nbsp;char&nbsp;zEventLoop[]&nbsp;=</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">The event loop</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;"bind&nbsp;.&nbsp;&lt;Destroy>&nbsp;{\n"<br> &nbsp;&nbsp;"&nbsp;&nbsp;if&nbsp;{![winfo&nbsp;exists&nbsp;.]}&nbsp;exit\n"<br> &nbsp;&nbsp;"}\n"<br> &nbsp;&nbsp;"while&nbsp;1&nbsp;{vwait&nbsp;forever}\n";<br> &nbsp;<br> <br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;Tcl_Interp&nbsp;*interp;<br> &nbsp;&nbsp;interp&nbsp;=&nbsp;Tcl_CreateInterp();</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Init(interp);<br> &nbsp;&nbsp;Tk_Init(interp);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">We really should check the return values of the init functions...</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zHello);</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_Eval(interp,&nbsp;zEventLoop);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">The event loop never returns</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*NOTREACHED*/<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Compiling "Hello, World!" For Tk</h2> <p><p><b>Unix:</b></p> <blockquote><pre> $ gcc hello.c -ltk -L/usr/X11R6/lib \ -lX11 -ltcl -lm -ldl $ ./a.out</pre></blockquote> <p><b>Windows using Cygwin:</b></p> <blockquote><pre> C:> gcc hello.c -mwindows -ltk80 -ltcl80 -lm C:> a.exe</pre></blockquote> <p><b>Windows using Mingw32:</b></p> <blockquote><pre> C:> gcc -mno-cygwin hello.c -mwindows \ -ltk82 -ltcl82 -lm C:> a.exe</pre></blockquote></p> <br clear="both"><p><hr></p> <h2 align="center">Making The Program Standalone</h2> <p><p>To make a Tcl application standalone you have to convert the following initialization scripts to C strings and compile them into the executable:</p> <table><tr> <td valign="top"><tt> &nbsp;&nbsp;auto.tcl<br> &nbsp;&nbsp;history.tcl<br> &nbsp;&nbsp;init.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;ldAout.tcl<br> &nbsp;&nbsp;package.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;parray.tcl<br> &nbsp;&nbsp;safe.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;tclIndex<br> &nbsp;&nbsp;word.tcl </tt></td> </tr></table> <p>To make a Tk application standalone requires these additional initialization scripts from the Tk Library:</p> <table><tr> <td valign="top"><tt> &nbsp;&nbsp;bgerror.tcl<br> &nbsp;&nbsp;button.tcl<br> &nbsp;&nbsp;clrpick.tcl<br> &nbsp;&nbsp;comdlg.tcl<br> &nbsp;&nbsp;console.tcl<br> &nbsp;&nbsp;dialog.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;entry.tcl<br> &nbsp;&nbsp;focus.tcl<br> &nbsp;&nbsp;listbox.tcl<br> &nbsp;&nbsp;menu.tcl<br> &nbsp;&nbsp;msgbox.tcl<br> &nbsp;&nbsp;optMenu.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;palette.tcl<br> &nbsp;&nbsp;safetk.tcl<br> &nbsp;&nbsp;scale.tcl<br> &nbsp;&nbsp;scrlbar.tcl<br> &nbsp;&nbsp;tclIndex<br> &nbsp;&nbsp;tearoff.tcl </tt></td> <td valign="top"><tt> &nbsp;&nbsp;text.tcl<br> &nbsp;&nbsp;tk.tcl<br> &nbsp;&nbsp;tkfbox.tcl<br> &nbsp;&nbsp;xmfbox.tcl </tt></td> </tr></table> <p>Total of about 13K lines and 400K bytes of text or 9K lines and 250K bytes if you strip comments and leading spaces</p></p> <br clear="both"><p><hr></p> <h2 align="center">A Review Of The Features We Want</h2> <p><ol type="A"> <li value="1"> Combine C/C++ with Tcl/Tk into a single executable.</dd> </li></ol> <ol type="A"> <li value="2"> The executable should be standalone. It must not depend on files not normally found on the system. </li></ol> <ol type="A"> <li value="3"> It should be difficult for end users to alter the program (and introduce bugs). </li></ol></p> <br clear="both"><p><hr></p> <h2 align="center">Available Programming Aids</h2> <p><p>Several tools are available. The chart below shows which tools help achieve which objectives.</p> <center><table border="2"> <tr> <td></td> <td colspan="3" align="center"> <b>Features The Tool Helps To Achieve</b></td> </tr> <tr> <td align="center"><b>Tool Name</b></td> <td align="center">Mix C and Tcl</td> <td align="center">Standalone</td> <td align="center">Hide Source</td> </tr> <tr> <td>SWIG</td> <td align="center"><img src="image6"></td> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>TclPro Wrapper</td> <td>&nbsp;</td> <td align="center"><img src="image6"></td> <td align="center"><img src="image6"></td> </tr> <tr> <td>FreeWrap</td> <td>&nbsp;</td> <td align="center"><img src="image6"></td> <td align="center"><img src="image6"></td> </tr> <tr> <td>Wrap</td> <td>&nbsp;</td> <td align="center"><img src="image6"></td> <td>&nbsp;</td> </tr> <tr> <td>mktclapp</td> <td align="center"><img src="image6"></td> <td align="center"><img src="image6"></td> <td align="center"><img src="image6"></td> </tr> </table></center></p> <br clear="both"><p><hr></p> <h2 align="center">SWIG</h2> <table><tr><td valign="top"><img src="image7"></td> <td valign="top"><p><ul><li>Creates an interface between an existing C/C++ library and a high-level programming language. Support for: <ul> <li> Tcl/Tk </li> <li> Perl </li> <li> Python </li> <li> Java </li> <li> Eiffel </li> <li> Guile </li> </ul></li></ul><ul><li>No changes required to C/C++ code. Can be used with legacy libraries.</li></ul><ul><li>Generates an extension, not a standalone binary</li></ul><ul><li>The tutorial on SWIG was yesterday afternoon.</li></ul><ul><li>http://www.swig.org/</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">Wrapper Programs</h2> <table><tr><td valign="top"><img src="image8"></td> <td valign="top"><p><ul><li>Convert a pure Tcl/Tk program into a standalone binary</li></ul><ul><li>Several wrapper programs are available: <ul> <li> TclPro Wrapper - http://www.scriptics.com/ </li> <li> FreeWrap - http://www.albany.net/~dlabelle/freewrap/freewrap.html </li> <li> Wrap - http://members1.chello.nl/~j.nijtmans/wrap.html </li> </ul></li></ul><ul><li>No C compiler required!</li></ul><ul><li>TclPro will convert Tcl script into bytecode so that it cannot be easily read by the end user. FreeWrap encrypts the scripts.</li></ul><ul><li>FreeWrap uses compression on its executable. Wrap uses compression on both the executable and on the bundled script files.</li></ul><ul><li>Usually include extensions like winico and/or BLT</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">mktclapp</h2> <table><tr><td valign="top"><img src="image9"></td> <td valign="top"><p><ul><li>Mix C/C++ with Tcl/Tk into a standalone binary</li></ul> <ul><li><tt>mktclapp</tt> generates an application initialization file that contains Tcl scripts as strings and makes all necessary calls to <tt>Tcl_Init</tt>, <tt>Tcl_CreateCommand</tt>, <tt>Tcl</tt>*<tt>InsertProc</tt>, etc.</li></ul><ul><li>Features to make it easier to write new Tcl command in C</li></ul><ul><li><tt>xmktclapp.tcl</tt> provides a GUI interface to <tt>mktclapp</tt></li></ul><ul><li>http://www.hwaci.com/sw/mktclapp/</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using Mktclapp</h2> <p><ul><li>Download <tt>mktclapp.c</tt> and <tt>xmktclapp.tcl</tt> from http://www.hwaci.com/sw/mktclapp/</li></ul><ul><li>Compile <tt>mktclapp</tt>: <blockquote><pre> cc -o mktclapp mktclapp.c </pre></blockquote></li></ul><ul><li>Create "Hello, World!" as a Tcl script in file <tt>hw.tcl</tt>: <blockquote><pre> button .b -text {Hello, World!} -command exit pack .b </pre></blockquote></li></ul><ul><li>Launch xmktclapp: <blockquote><pre> wish xmktclapp.tcl </pre></blockquote></li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using Mktclapp</h2> <table width="100%"><tr><td valign="top"><p><ul><li>Set "Command Line Input?" to "None"</li></ul><ul><li>Set "Standalone?" to "Yes"</li></ul><ul><li>Enter "<tt>hw.mta</tt>" for the Configuration File</li></ul><ul><li>Enter "<tt>hw.c</tt>" for the Output C File</li></ul></p></td> <td valign="top" align="right"><img src="image10"></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using Mktclapp</h2> <table width="100%"><tr><td valign="top"><p><ul><li>Go to the "Tcl Scripts" page</li></ul><ul><li>Press "Insert" and add <tt>hw.tcl</tt> to the list of Tcl scripts</li></ul><ul><li>Change the "Startup Script" to be <tt>hw.tcl</tt>.</li></ul><ul><li>Select File/Build and File/Exit</li></ul></p></td> <td valign="top" align="right"><img src="image11"></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">"Hello, World!" Using Mktclapp</h2> <p><ul><li>Mktclapp generates <tt>hw.c</tt>. Compile it something like this: <pre> cc hw.c -ltk -L/usr/X11R6/lib -lX11 -ltcl -lm -ldl </pre></li></ul><ul><li>Or, if using Cygwin: <pre> gcc hw.c -mwindows -ltk80 -ltcl80 -lm </pre></li></ul><ul><li>Or, if using Mingw32: <pre> gcc -mno-cygwin hw.c -mwindows -ltk82 -ltcl82 -lm </pre></li></ul><ul><li>And you're done!</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Adding C Code To Your Program</h2> <p>Put the new C code in a new source file named "<tt>add.c</tt>"</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"hw.h"</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Generated by mktclapp</td> </tr> <tr><td valign="center"> <small><tt></tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>int&nbsp;ET_COMMAND_add(ET_TCLARGS){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center"><tt>ET_TCLARGS</tt> is a macro defined in <tt>hw.h</tt></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;int&nbsp;a,&nbsp;b;<br> &nbsp;&nbsp;char&nbsp;zResult[30];<br> &nbsp;&nbsp;a&nbsp;=&nbsp;atoi(argv[1]);<br> &nbsp;&nbsp;b&nbsp;=&nbsp;atoi(argv[2]);<br> &nbsp;&nbsp;sprintf(zResult,&nbsp;"-1073742724",&nbsp;a+b);<br> &nbsp;&nbsp;Tcl_SetResult(interp,&nbsp;zResult,&nbsp;TCL_VOLATILE);<br> &nbsp;&nbsp;return&nbsp;TCL_OK;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Adding C Code To Your Program</h2> <table width="100%"><tr><td valign="top"><p><ul><li>Go to the "C/C++ Modules" page of xmktclapp.tcl</li></ul> <ul><li>Press "Insert" and add <tt>add.c</tt> to the list of C/C++ modules</p></li></ul></li></ul><ul><li>Select File/Build and File/Exit</li></ul></p></td> <td valign="top" align="right"><img src="image12"></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">Adding C Code To Your Program</h2> <p><ul><li>Compile as follows: <pre> cc add.c hw.c -ltk -L/usr/X11R6/lib -ltcl -lm -ldl </pre></li></ul><ul><li>Or construct a Makefile that compiles <tt>add.c</tt> into <tt>add.o</tt> and <tt>hw.c</tt> into <tt>hw.o</tt> and then links them.</li></ul><ul><li>Compile the same way for Windows except use the usual Windows libraries and options...</li></ul><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>Don't have to worry with <tt>Tcl_CreateCommand()</tt> - Mktclapp takes care of that automatically.</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">Checking Parameters In The <tt>add</tt> Command</h2> <p>Modify <tt>add.c</tt> to insure the <tt>add</tt> command is called with exactly two integer arguments</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"hw.h"<br> &nbsp;<br> int&nbsp;ET_COMMAND_add(ET_TCLARGS){<br> &nbsp;&nbsp;int&nbsp;a,&nbsp;b;<br> &nbsp;&nbsp;char&nbsp;zResult[30];</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;argc!=3&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;Tcl_AppendResult(interp,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"wrong&nbsp;#&nbsp;args:&nbsp;should&nbsp;be:&nbsp;\"",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv[0],&nbsp;"&nbsp;VALUE&nbsp;VALUE\"",&nbsp;0);<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Report an error if there are not exactly 2 arguments</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;Tcl_GetInt(interp,&nbsp;argv[1],&nbsp;&amp;a)!=TCL_OK&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Report an error if the first argument is not an integer</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;Tcl_GetInt(interp,&nbsp;argv[2],&nbsp;&amp;b)!=TCL_OK&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Do the same for the second argument</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;sprintf(zResult,&nbsp;"-1073742724",&nbsp;a+b);<br> &nbsp;&nbsp;Tcl_SetResult(interp,&nbsp;zResult,&nbsp;TCL_VOLATILE);<br> &nbsp;&nbsp;return&nbsp;TCL_OK;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Using The Tcl_Obj Interface</h2> <p>In the file <tt>objadd.c</tt> put this code:</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"hw.h"</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt><br> int&nbsp;ET_OBJCOMMAND_add2(ET_OBJARGS){<br> &nbsp;&nbsp;int&nbsp;a,&nbsp;b;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Use "<tt>ET_OBJCOMMAND</tt>" instead of "<tt>ET_COMMAND</tt>" and "<tt>ET_OBJARGS</tt>" instead of "<tt>ET_TCLARGS</tt>"</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;objc!=3&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;Tcl_WrongNumArgs(interp,&nbsp;1,&nbsp;objv,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"number&nbsp;number");<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">A special routine for "wrong # args" error</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;Tcl_GetIntFromObj(interp,&nbsp;objv[1],&nbsp;&amp;a)&nbsp;){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Instead of <tt>Tcl_GetInt</tt></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;if(&nbsp;Tcl_GetIntFromObj(interp,&nbsp;objv[2],&nbsp;&amp;b)&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_SetIntObj(Tcl_GetObjResult(interp),&nbsp;a+b);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Result stored as integer, not a string</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;TCL_OK;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Speed Of Tcl_Obj Versus "char*" Interfaces</h2> <p><ul><li>Compile both <tt>add</tt> and <tt>add2</tt> into the same executable.</li></ul><ul><li>Compare their speeds: <pre> time {add 123456 654321} 10000 <font color="blue">26 microseconds per iteration</font> time {add2 123456 654321} 10000 <font color="blue">4 microseconds per iteration</font> </pre></li></ul><ul><li>The Tcl_Obj version is 650 faster!</li></ul><ul><li>Replace the addition with a "real" computation that takes 10 milliseconds.</li></ul><ul><li>Now the Tcl_Obj version is only 0.2 faster!</li></ul><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>In many real-world problems, the Tcl_Obj interface has no noticeable speed advantage over the string interface.</b></td></tr></table></p> <br clear="both"><p><hr></p> <h2 align="center">More About Built-in Tcl Scripts</h2> <table><tr><td valign="top"><img src="image11"></td> <td valign="top"><p><ul><li>Comments and leading white-space are removed from the script by default. Use the "Don't Strip Comments" button to change this.</li></ul><ul><li>The file name must exactly match the name that is used by the <tt>source</tt> command.</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">Locations Of Libraries</h2> <table><tr><td valign="top"><img src="image13"></td> <td valign="top"><p><ul><li>Tells mktclapp where to look for script libraries.</li></ul><ul><li>All Tcl scripts in the indicated directories are compiled into the <tt>appinit.c</tt> file.</li></ul><ul><li>Comments and extra white-space are removed. There is no way to turn this off.</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">Built-in Binary Data Files</h2> <table><tr><td valign="top"><img src="image14"></td> <td valign="top"><p><ul><li>Arbitrary files become part of the virtual filesystem</li></ul><ul><li>No comment or white-space removal is attempted</li></ul><ul><li>Useful for images or other binary data</li></ul></p></td></tr></table> <br clear="both"><p><hr></p> <h2 align="center">New Commands In Namespaces</h2> <p>Two underscores (__) are replaced by two colons (::) in command names, thus giving the ability to define new commands in a namespace</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;hw.h></tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt><br> int&nbsp;ET_COMMAND_adder__add(ET_TCLARGS){<br> &nbsp;&nbsp;int&nbsp;a,&nbsp;b;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Creates the Tcl command called "<tt>adder::add</tt>"</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;char&nbsp;*zResult[30];<br> &nbsp;&nbsp;if(&nbsp;argc!=3&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;Tcl_AppendResult(interp,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"wrong&nbsp;#&nbsp;args:&nbsp;should&nbsp;be:&nbsp;\"",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argv[0],&nbsp;"&nbsp;VALUE&nbsp;VALUE\"",&nbsp;0);<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;if(&nbsp;Tcl_GetInt(interp,&nbsp;argv[1],&nbsp;&amp;a)!=TCL_OK&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;if(&nbsp;Tcl_GetInt(interp,&nbsp;argv[1],&nbsp;&amp;b)!=TCL_OK&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;sprintf(zResult,&nbsp;"-1073742724",&nbsp;a+b);<br> &nbsp;&nbsp;Tcl_SetResult(interp,&nbsp;zResult,&nbsp;TCL_VOLATILE);<br> &nbsp;&nbsp;return&nbsp;TCL_OK;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Adding Your Own <tt>main()</tt></h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;/*&nbsp;Application&nbsp;specific&nbsp;initialization&nbsp;*/</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Et_Init(argc,&nbsp;argv);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Never returns!</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*NOTREACHED*/<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><table><tr><td valign="top"><img src="image3"></td> <td valign="top"><b>The "Autofork" feature is disabled if you supply your own <tt>main()</tt></b></td></tr></table> </p> <br clear="both"><p><hr></p> <h2 align="center">Initializing The Tcl Interpreter</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> int&nbsp;counter&nbsp;=&nbsp;0;<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){<br> &nbsp;&nbsp;&nbsp;Et_Init(argc,&nbsp;argv);<br> &nbsp;&nbsp;&nbsp;/*NOTREACHED*/<br> &nbsp;&nbsp;&nbsp;return&nbsp;0;<br> }<br> &nbsp;<br> int&nbsp;Et_AppInit(Tcl_Interp&nbsp;*interp){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;if(&nbsp;Blt_Init(Interp)&nbsp;){<br> &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TCL_ERROR;<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Example: Initialize an extension</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Tcl_LinkVar(interp,&nbsp;"counter",&nbsp;&amp;counter,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCL_LINK_INT);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Or link a C variable to a Tcl variable</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return&nbsp;TCL_OK;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Return TCL_OK if successful</td> </tr> <tr><td valign="center"> <small><tt>}</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Writing Your Own Event Loop</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> </tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>void&nbsp;Et_CustomMainLoop(Tcl_Interp&nbsp;*interp){</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Replaces the default event loop</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;return;</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Ex: Return without handling any events.</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Et_Init(argc,&nbsp;argv);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">This now returns after initializing Tcl</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*&nbsp;Application&nbsp;code&nbsp;here&nbsp;*/<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Writing Your Own Event Loop</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;&lt;tcl.h><br> &nbsp;<br> void&nbsp;Et_CustomMainLoop(Tcl_Interp&nbsp;*interp){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;for(;;){<br> &nbsp;&nbsp;&nbsp;&nbsp;Tcl_DoOneEvent(TCL_ALL_EVENTS|TCL_DONT_WAIT);<br> &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Other&nbsp;processing...&nbsp;*/<br> &nbsp;&nbsp;}</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Intermix processing and event handling</td> </tr> <tr><td valign="center"> <small><tt>}<br> &nbsp;<br> int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv){</tt></small></td> <td></td><td></td><td></td><td></td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;Et_Init(argc,&nbsp;argv);</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Never returns</td> </tr> <tr><td valign="center"> <small><tt>&nbsp;&nbsp;/*NOTREACHED*/<br> &nbsp;&nbsp;return&nbsp;0;<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Mktclapp Initialization Sequence</h2> <p><ul><li>Initialization starts when the <tt>Et_Init()</tt> function is called either by client code or by the <tt>main()</tt> that mktclapp generates</li></ul><ul><li>Create the main Tcl interpreter</li></ul><ul><li>Construct the virtual filesystem overlay by redefining the <tt>source</tt> command and by using the <tt>Tcl</tt>*<tt>InsertProc()</tt> functions</li></ul><ul><li>Call <tt>Et_PreInit()</tt> if the client defines it</li></ul><ul><li>Call <tt>Tcl_Init()</tt> and <tt>Tk_Init()</tt></li></ul><ul><li>Call <tt>Tcl_CreateCommand()</tt> and <tt>Tcl_CreateObjCommand()</tt> for every <tt>ET_COMMAND_</tt>* and <tt>ET_OBJCOMMAND_</tt>* function in the client code</li></ul><ul><li>Call <tt>Et_AppInit()</tt> if the client defines it</li></ul><ul><li>Run the main Tcl script if there is one</li></ul><ul><li>Call <tt>Et_CustomMainLoop()</tt> if defined by client code or else run the built-in event loop</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Invoking Tcl From C</h2> <p><ul><li>Use one of the built-in evaluation functions: <center><table width="80%"> <tr><td valign="top" width="50%"><ul> <li> Tcl_Eval() </li> <li> Tcl_VarEval() </li> <li> Tcl_EvalFile() </li> <li> Tcl_GlobalEval() </li> </ul></td> <td valign="top" width="50%"><ul> <li> Tcl_EvalObj() </li> <li> Tcl_GlobalEvalObj() </li> </ul></td></tr> </table></center></li></ul><ul><li>Mktclapp provides evaluation functions with variable argument lists as in <tt>printf()</tt>: <ul> <li> Et_EvalF() </li> <li> Et_GlobalEvalF() </li> </ul></li></ul><ul><li>Mktclapp provides a global variable <tt>Et_Interp</tt> which is a pointer to the main interpreter</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Invoking Tcl From C</h2> <p>Example: A C function that pops up an error message dialog box</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"appinit.h"<br> &nbsp;<br> void&nbsp;ErrMsg(char&nbsp;*zMsg){<br> &nbsp;&nbsp;Tcl_SetVar(Et_Interp,&nbsp;"zMsg",&nbsp;zMsg,&nbsp;TCL_GLOBAL_ONLY);<br> &nbsp;&nbsp;Tcl_GlobalEval(Et_Interp,&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;"tk_messageBox&nbsp;-icon&nbsp;error&nbsp;-msg&nbsp;$zMsg&nbsp;-type&nbsp;ok");<br> &nbsp;&nbsp;Tcl_UnsetVar(Et_Interp,&nbsp;"zMsg",&nbsp;TCL_GLOBAL_ONLY);<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Invoking Tcl From C</h2> <p>The same C function implemented using <tt>Et_EvalF()</tt> instead of <tt>Tcl_GlobalEval()</tt></p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"appinit.h"<br> &nbsp;<br> void&nbsp;ErrMsg(char&nbsp;*zMsg){<br> &nbsp;&nbsp;Et_EvalF(Et_Interp,&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;"tk_messageBox&nbsp;-icon&nbsp;error&nbsp;-msg&nbsp;{PX}&nbsp;-type&nbsp;ok",<br> &nbsp;&nbsp;&nbsp;&nbsp;zMsg);<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p> <ul><li> Suppose the function is called as follows: <blockquote> <tt>ErrMsg("Syntax error near \"}\"");</tt> </blockquote> </li></ul> <ul><li> The command that gets executed is: <pre> tk_messageBox -icon error -msg \ {Syntax error near "}"} -type ok </pre> </li></ul> <ul><li> But this is an ill-formed Tcl command! </li></ul> </p> <br clear="both"><p><hr></p> <h2 align="center">Invoking Tcl From C</h2> <p>Use the "<tt></tt>" format to generate a quoted string</p><p> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#include&nbsp;"appinit.h"<br> &nbsp;<br> void&nbsp;ErrMsg(char&nbsp;*zMsg){<br> &nbsp;&nbsp;Et_EvalF(Et_Interp,&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;"tk_messageBox&nbsp;-icon&nbsp;error&nbsp;-msg&nbsp;\"%\"&nbsp;-type&nbsp;ok",<br> &nbsp;&nbsp;&nbsp;&nbsp;zMsg);<br> }</tt></small></td> <td></td><td></td><td></td><td></td> </tr> </table> <p><ul><li>The <tt></tt> puts a backslash before all characters that are special to Tcl</li></ul><ul><li>The Tcl command becomes: <pre> tk_messageBox -icon error -msg \ "Syntax error near \"\}\"" -type ok </pre></li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Other Functions Provided By Mktclapp</h2> <p><ul><li><tt>void Et_ResultF(Tcl_Interp*, ...);</tt></li></ul><ul><li><tt>char *Et_DStringAppendF(Tcl_DString*, ...);</tt></li></ul><ul><li><tt>int Et_AppendObjF(Tcl_Obj*, ...);</tt></li></ul><ul><li><tt>char *mprintf(const char *format, ...);<br> char *vmprintf(const char *format, va_list);</tt></li></ul><ul><li><tt>void Et_NewBuiltinFile(char *filename, char *data, int amt);</tt></li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Operating Mktclapp From The Command Line</h2> <p><ul><li>Generate the <tt>appinit.h</tt> header file like this: <blockquote> <tt>mktclapp -header &gt;appinit.h</tt> </blockquote></li></ul><ul><li>Generate the <tt>appinit.c</tt> file like this: <blockquote> <tt>mktclapp -f appinit.mta >appinit.c</tt> </blockquote></li></ul><ul><li>The <tt>*.mta</tt> file is just a list of command-line options</li></ul><ul><li>Enter <blockquote> <tt>mktclapp -help</tt> </blockquote> to get a list of available options</li></ul><ul><li>Look at MTA files generated by xmktclapp.tcl for examples</li></ul></p> <br clear="both"><p><hr></p> <h2 align="center">Format Of An MTA File</h2> <table cellspacing="0" cellpadding="0" border="0"> <tr><td valign="center"> <small><tt>#&nbsp;Configuration&nbsp;file&nbsp;generated&nbsp;by&nbsp;xmktclapp<br> #&nbsp;Hand&nbsp;editing&nbsp;is&nbsp;not&nbsp;recommended<br> #</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Comments begin with one #</td> </tr> <tr><td valign="center"> <small><tt>##&nbsp;Autofork&nbsp;No<br> ##&nbsp;CFile:add.c&nbsp;1<br> ##&nbsp;CFile:objadd.c&nbsp;1<br> ##&nbsp;CmdLine&nbsp;Console<br> ##&nbsp;ConfigFile&nbsp;hw.mta<br> ##&nbsp;Data:check.gif&nbsp;1<br> ##&nbsp;MainScript&nbsp;hw.tcl<br> ##&nbsp;Mode&nbsp;Tcl/Tk<br> ##&nbsp;NoSource&nbsp;No<br> ##&nbsp;OutputFile&nbsp;hw.c<br> ##&nbsp;Shroud&nbsp;No<br> ##&nbsp;Standalone&nbsp;Yes<br> ##&nbsp;TclFile:hw.tcl&nbsp;1<br> ##&nbsp;TclLib&nbsp;/usr/lib/tcl8.0<br> ##&nbsp;TkLib&nbsp;/usr/lib/tk8.0</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">Lines beginning with two #s are used by xmktclapp.tcl and ignored by mktclapp</td> </tr> <tr><td valign="center"> <small><tt>-console<br> -main-script&nbsp;"hw.tcl"<br> -tcl-library&nbsp;"/usr/lib/tcl8.0"<br> -tk-library&nbsp;"/usr/lib/tk8.0"<br> "add.c"<br> "objadd.c"<br> -i&nbsp;"check.gif"<br> -strip-tcl&nbsp;"hw.tcl"</tt></small></td> <td>&nbsp;&nbsp;</td> <td valign="center"><img src="image2"></td> <td>&nbsp;&nbsp;</td> <td valign="center">All other lines are read by mktclapp and ignored by xmktclapp.tcl</td> </tr> </table> <br clear="both"><p><hr></p> <h2 align="center">Summary</h2> <p><ul><li>Use Tcl for the things Tcl is good at and use C/C++ for the things that C/C++ is good at</li></ul><ul><li>Use wrapper programs to make pure Tcl programs standalone</li></ul><ul><li>Use mktclapp to combine Tcl/Tk with C/C++ into a standalone</li></ul></p> <br clear="both"><p><hr></p> �������������������������saods9/tkhtml1.0/tests/page2/image1�����������������������������������������������������������������000644 �000765 �000000 �00000003656 07504443350 017352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ay�O�������9!!!))))9111191B1Z1c9999B9B9cBBBBBBJJJJJJJRRRRRRRZZZZZZZccccccckckckkkkkksssssss{{s{{{{{{ք{քք֌֌֌֔֔֔ޜޜޜޥޥޭޭ筵絭絵絽罵罽ƽ������������������������������������������������������������������������������,����y�O��e]P@7'&2;GYdTD.#*.20.*'&&#7L\G&7;?94*.LP@XP%*,Ѐ% |8&'p0ҏ*R$#GIHB260͛8pC #70LQX8A#@H80;Y"2PE7<8 (K$m19Cm#@&2(0E8##q QP7& 􅊊,l;FGEe e &4Cᡂ N71 EL,8ok&cqA 1?4CR ~%` Pq?ؘzY0W  &P; EXMF?_*`0 sWX UdD<T"&!`x%Yl`G$`%3e0== t ' #Y̠k4A X㖊 iqCA(ĸЙY|g�#G```AH`9#\P! &BPݩ뮼2��0@&-�/�S�8!�H)RB . :lA%`  K8�h ��"Z!B` ApE1<+H > rE ;Q 1:[B AD `!S-xQJƐЂAt� .�[FAFH˭B pA:l �- 4�]Q@ F�h!@]` -<\L렅e�>L|o;~ "tL/e�wP^ @ň�!;ܑE�ͯeL>�ڮ P"N !{;!B,{+%]q #,@l^�DHD+�AZ8B}�@ o5<8+s p@ 1PZ!Rȋ)LC$|[!@��}; 6BF� p Q�m*nXP�W' e瘶BE (isBPGE"4;-B+� �uJ#)DWq>݊?^σ{Hg!_$:-� J10D(D`a|!!%DhLN iL�Ќ4X̦6nz 8iM,<' @|;)xsg:~l= Oz>CPsm'D#Ί& (:*юZT'FFQ:RԤ|(K7*җ*0uIczіԦ:NPըH=Rϒ.LTj�XXͪVծz` X@��;����������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image10����������������������������������������������������������������000644 �000765 �000000 �00000000377 07504443350 017427� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���aM{JwDn0_/^+V'O&Q"E=z:v7o2f-[+W&L"E 5>������������������������������������,�����$�@ %$YƑ(1,4<@<؎oH,Jȑ!�&$X1풖M ݁q\Aݔw{8cd dn?Te=5av Tfo8SqEm<y!�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image11����������������������������������������������������������������000644 �000765 �000000 �00000001116 07504443350 017420� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87aX�$���稻䠵◮ߎ܆}ulga`~[TqRyM{IrDn9j0_>������,����X�$�@'dihMp,tmxeq�` NAH 8`H�B�Iu,pE (d--CAKnfM�Ui Q� CYW�`Gt Q hҗ$߆C��G@tTOMu@DZ4A�3�cGŋ3jܨǏ CIɓ+&rܸAʕ05 jb^$U >ѐ 2ՙ*>U IE@+!92M.fY�3^ɛF <SP'k%o2 @p@gT.��( v@p8\@�1yj?L�4|M qy@УKNسkνË�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image12����������������������������������������������������������������000644 �000765 �000000 �00000000376 07504443350 017430� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���aTqJwF_Dn9j5Iw0_,X+V'O"E=z:v7o2g-]+W#B&L< 5>���������������������������,�����$�@%$ FDE,J Gm7ANطX8tğIvzIxE&} BGj4.w c fUib kpj9;@rn,lto5Nu5 y!�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image13����������������������������������������������������������������000644 �000765 �000000 �00000000755 07504443350 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a9�$���ֳܼѩˠŗzqh{a^sTjKbBZ8Q0_/^/J,X?:v 5>���,����9�$�@'dihp,tmk\5s a(p&�#db"GY�X oL.4n|NgI� DF ��YHN9B ^A]dz)i jA>:PW=<HU DJ@[9cu#:d b� cȷo PPa %@4 N(`V׏Y8,$@s|hJ̳):Xd!�PxO"2 Jh A> *@!+C:A r4L˯lʝKݻx%Ƿ߿@È+^̘p�;�������������������saods9/tkhtml1.0/tests/page2/image14����������������������������������������������������������������000644 �000765 �000000 �00000000303 07504443350 017420� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���a0_/^,X&K%I!C?:v4j"C?<6 > ������������������������������������������,�����$��H`$dih@ #"A !<b GwH4=\6a4Uֹ̫^0@.zn|.�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image15����������������������������������������������������������������000644 �000765 �000000 �00000000104 07504443350 017420� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a �$���a0_>,���� �$��ڋH扦j)[��;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image16����������������������������������������������������������������000644 �000765 �000000 �00000000235 07504443350 017426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���筽ߣ|yyyaLLL8880_""">���,�����$��RPc:STq]d[«\/y qX&%cIZجv˵!pxA.znэ|>��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image17����������������������������������������������������������������000644 �000765 �000000 �00000000121 07504443350 017421� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax����$D!8/{&d,����x���*ڋ޼b@扦ʶ L,��;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image18����������������������������������������������������������������000644 �000765 �000000 �00000001041 07504443350 017424� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���߶ݳۯګبק֡ӝѕΎʇǂ|uqljf|e|^vWoTmLfGbD_A]=Y9V6S.M'G������������������������������������������������,����x� �@p8$e4$rl:ШtJ% �X`+Ɓ�j.ԫ�T"�ŪB} -l/l/bdfB X$/-� [��|O.� B#[.&/F-/&'BB'� �I{ %,B�&� W(/ �/v �| v^~HЦ�9 A�o4p&�aq!�(0vE 2\IÕ Ψ2g^L aGB6�`<�q $V �x1@( �%r6x�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image19����������������������������������������������������������������000644 �000765 �000000 �00000000065 07504443350 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax����$D���,����x���ڋ޼T��;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image2�����������������������������������������������������������������000644 �000765 �000000 �00000000061 07504443350 017336� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a � ������!����,���� � ��a�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image20����������������������������������������������������������������000644 �000765 �000000 �00000001025 07504443350 017417� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���ߵݳۯګا֡ӜѕΎʂ{uqmjf|e|^vWoTmLfE`D_A]=Y9V6S.M'G������������������������������������������������������������,����x� �@pH,Gl:Ш)T �`$+ȇX�sc(ҷ-LPV�#&]DCf� C#xD$)�v_ +�O)L_O ~C�B*D+!C'{B�]�w (&`OMD#<B \23b+* #"q4�|k% +@X"a� ]@(; �@`‰O䙬�BBE+,�8HOEM1X"O:T��;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image21����������������������������������������������������������������000644 �000765 �000000 �00000001064 07504443350 017423� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���߲ۯڤ՝јϕ͎ʂ|tqnjf|e|^vWoTmOiLfGbA]=Y9V6S.M'G���������������������������������������������������������������,����x� �@@pH,Ȥrl:Pb!,��M GU@� QuEД�&` 'QC�dm �) prl&�$"B*#�#t* $(*` *])Q�J)&I`�eg* !p!BcmdBm*qs}pp�m&G#�F  , !! S�` uTaO~$!��;�Nh bCZ9��&LRE/hg�.ܔ͈�hCFtJfؿ'w1=G'E�H&p!JN""�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image22����������������������������������������������������������������000644 �000765 �000000 �00000000121 07504443350 017415� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax����3Pw0_$D,����x���*ڋ޼b@扦ʶ L,��;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image23����������������������������������������������������������������000644 �000765 �000000 �00000001033 07504443350 017421� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���334444ߴ4֮5ͧ5Ţ666677788}8w8t8zk9vh9tg9h^:d[:]V:TO;HG;GF;?@;>?;6:<27<.4<%-='=!== >>���������������������������������������������������������������������,����x� �@@pH,Ȥrl:P!j@PBީrPi!�8#@`s* `LMQK(#B'#!� (  d( �'� p�e 'o(q RrQhD'(]_�cd'$"(oq�"o!$qt'L PB" #|\P,�p �H!B� "H�5�tʐ,Y̖y!)ED<�}HF !qq"CA(Hh@r0턮JB*0L$=Ψ"U@:d0瀮 ']+�#$ Ћ- �;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image24����������������������������������������������������������������000644 �000765 �000000 �00000000227 07504443350 017426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ak����=34֮5)=&6y%>3,r$[������������������,����k���LI8ͻ dihlC"tmx|pH,Ȥrl: tJZجvz xL.zn#�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image25����������������������������������������������������������������000644 �000765 �000000 �00000000705 07504443350 017430� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���߶ݯګءӘϕΎ|pmjf|by^vWoSlLfA]=Y9V6S.M'G���������������������������������������������������������������������������������,����x� �@@pH,Ȥrl:P!!&$@C /@`X,` ֈPtN#$!�$ $egi�rf#vP�E# Fx WRXZC jB ^srIS$�$  zTf۴aGkkX�]iZ TH��KC i `A��QiFfШ�" e"Hj �;�����������������������������������������������������������saods9/tkhtml1.0/tests/page2/image26����������������������������������������������������������������000644 �000765 �000000 �00000001010 07504443350 017417� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���߶ݯڧ֡ӝјϕΎʇǂ|uqljf|e|^vWoLfA]=Y9V6S.M'G���������������������������������������������������������������������,����x� �@@pH,Ȥrl:a:5�� )nF�ʂ5|d�PB�QIT�"#[E'�BX j�! wB B U�( (iKT D�~D %[yTC}� � 'r^BPB�Fb(h("Bq8PBābs0`F!r :(>� M�`D RdHE.PF�he @K.(`<Pa{W�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image27����������������������������������������������������������������000644 �000765 �000000 �00000001065 07504443351 017433� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���߯ڧ֡ӝјϕΎʂ{uqmje|^vWoSlLfE`A]=Y9V6S.M'G���������������������������������������������������������������������,����x� �@@pH,Gl:Ш N � GX�c(O@ QB1'jpIZtSGV�!#]DCf� D $�v ' &[(|S�O&L �"'$΄ nC�B'D(#&B  { B$#`O4~B[Ho[� @$JVP0� CQ L`F=8`� �*9@d[HBuCNH/k �y8Z�`V�H 5hn eg �J�W丠pb�Y0Zd-=㢔HH�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image28����������������������������������������������������������������000644 �000765 �000000 �00000000640 07504443351 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���ߵݲۯګا֡ӝђ̍ʂupm^vWoTmIdE`D_A]=Y9V6S.M'G���������������������������������������������������������������������������,����x� �@@pH,Ȥrl:a`*1ȴ �!`zf?� #P�$mB�vj$%Qo& B�&t&�C�K&&"  Ba&$c k B `\�~�N�#%&""$ &�M$H ѯHd�;������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image29����������������������������������������������������������������000644 �000765 �000000 �00000000171 07504443351 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87at����aHw3\0_+O$D������,����t���FX0I$ͻ`(d) hlp,tx|pȤrl:Ш9Zجvz7�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image3�����������������������������������������������������������������000644 �000765 �000000 �00000025123 07504443351 017346� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a"���ccckkksss{{{絽ƌs{{{ƔΜޜ{ތ֭筽Ό祽֜ΔƄ{ޔ֌΄{絽Ɣ电ތքεޔ祽ޜ֔ΌƄ{眭{ﭽ֥Όޔ֌{֜焜ޥ筽ޥ֜Δƌ{ք絽έƌ祵ޜ֔ΌƄ{筵ΥƔﵽޔ絵ƌss{{{֭ƽΥ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!���,����"�@�Hp`�ZPaÆ -IHDdHHA KQ)ȑ&+\2J0cƘILR7cIԙ? =CEQi3OIBxZʵׯxrXlYC9Z˶۷pK׋/vuW߿ <pÅҢϘ>7rCٍFk9sϠ?L͛(oy+Rĉ$ktEҐ:brRpЙ3˜%_9�Y/~G :X Z(B(P @KPTA@D  Q%$` *`IX(ZHK)hL'dN:u"@@>Q1 '%B QMKQOJS*,Td*S�6 UWb֘bY%晆(fk ZZlIyuW{'_~pסW]aaV�Ds"*FtQjptlꪬJC t=f+q nE{\rWqb볮fܴtTkAj$XD:G$s.s ɸūA�X@$L@��@D`h A  0a)8(XBI2 &) hb!%`R)1IH)T()HD &'xBwRx@&I� uI�g4 'R 6�T U]q)` hU�xU) Ulhiyц��x i چ mH9 І!l k0+萺\y8Bc|,)CBa<#+o|bꦩjjXdG\E 7=X\[C!-pC?De!m9kC "Ff?Y@:txx-S|C.+0DuS9\,c($C !Jr`x/ˆ�$/LD�MHA %RC%JD⒖$D)N&O&0FGJ!ʐ|ĵ H]+Rנ@JVi,� *�$�i%Lk\Zւ;Nv$uD_X nw< `A#l 0h<Bd9*Y2Raµ^6TB$ib*U4j)B3h-iAYB3ʛfC8b ff8͐vDBw6g50ǂd( aB <(2ڑ@t|#P ! #ZFLP>R,11ɆRB!upbMx}QE@Np'C@Pt!5kM  9. Ф@2+J/!%؂Z+\ @B _e;.Ou“:°b@' SPT 4ֱp2o Kiu dC2 N7LSpC>s`2ZM#vBիru\F! p$ڇ(</ PLߥm ͨzWBC^<I( H#Zi)}$̲^D(u2TGC:JF.>yRֱ$ HP« &+ib¢ǒd $/6sP|)L0aoJɄV@?x ohk HLkZ' l*}u`~N,d8uN,F+Ӛk-B[0a`?AjHj6�$��&b�X+P%0T @�0!Nd P�\C�^�dD E%:1ݤw(t ڌR#"4Q6Pz;C�P$/# †a��RU0l�"oVA,QLyC(("tVZCtk�`­/z(!R]@w<;M%SPz=㉁Pչ__O׳!J7tZkkX�.@v;;@a w�0}{?ߝw<P'ZR:A˕s\R qK[@sxF]$^9Hߒqڈ!BHI!eUDQH"MFoDFJ'>jjQ46ql#RTL2#TYPi+5J [!&iHHt9 &5:@;r)|p<؁h<XtTwi*-䂳 ЄLLL**@2is>2> D@vc@Y?OONԴMۄt ą[OBMP*8PA e AARBb@x8@j9R74 7T%_?t&5D"qDŷk3!2D(| aXtE,E>39#8aJeFH#5FFFUUU%GK,&cQ TR_V66cҋb7h:pIR-BEE QR�?�/@Zs~Q -t<P;K;B;-a�K`KαSaL5L3OI…T>> ԃ!$ZkGe0QVPy8i}j"9i$5Q {F4 0 |DR*R 2aȷ`4eST6'pn;#w!fL1bGUw$K'bXيN1px_`Q&bgj?6dHր3Ԗp'dR(Ae~(~opBT0Ej@c0SeIe0Kb�WG+R?"hRg&,Fg&,+# ˁ %W�.,$`'Wj158 Dג)5D!.5DDDEm9a8Ea?U_#@#>C~FIAOa$Q0pJG$Sgc d 9B֠IxsuycXNdXQU`^EfCU*A 0`*-ru"=b>v0>|>vz棿gĢY,Fh,>24L1h*ôI.Y.Q^`i{Q jp�C b/`D �`�08 !@ p !� P! 6�V 0  �@!1D!P�Jp 2"�6 (� T� 0`@ C3�zoP�p �JxpyJK7zī`]3p_nV!9% �P�8{ 'Ө` VQ�{@�V*##�6hZs#"l:'8KfTP*$K4u)ätu"uBuf=⣵<uuhgzV+yhhaFNN=qGxw:kxBO=-ĄiÄ-$J! gB9dZv�`/ ` v� |C� !�!�20�0�P `: 3 Sy2},"1 00l> 40�ZJA�'{ lG4 3 �(%{ Hy7%x  zHh�3�pl0�o$�5k o'#:Z�I'tIJҰOuҁS<<ͣ\<TGu>l=dwPx=WdO3@s??t @TO \-4=s =QÝeyqX%f'-A�K XIJ}@j94�P ;$�|yk{ B  B !27%8S 6G#4ا >TY~Ey(@4~1$U7Jl hz0�ercGh̛^EeZ�+qKC)$x<#ӁbDtKDA`XLDic=Ғ* Tio|v@hnW??6?Wx- d>R>-xsڡ&Bxh!I{]C;{6{— $-Sr!'!D}H.A}+r}7rLI Mu#NE營M~U/6T"UX&THch1d ڀ~:Ao- tS;)X)zj'xKTK[׳4�)ɔ*9B@"- Y@ $ ,?QNtMMbX-قdHPeH$J ׁsXQvm! `I_蒅^D`wDET`|DR!.D:1!"9}Fv#FMlSFCH]G/GU'6VRHgY?H@f(=٘C;*u8|;dKKuKޢ8ˡ(AtLLąBOtL fN$OX_ wރ8 BAju(Z!-"PBq0]^=^^ Ή'].ugRDWT-ED}A#75fD~L1G~KqHG\u)bQPV;pVI'j&PNИc@A@JR`�uXxAdsody:X6YD@n)b̻׶T.`ƏLڜ|@tpz(f-WdZT.1\q]>]5 յo]�^'Yjm8C]G_�_G_Rdi*;UBu: Ib^~rUPp ɹ6(N &aalar/Hj ؠudBI;Xe|eQA?J̇VvUU[%\Zoqg.,uH,Ff΢g.{$4BVޥ yeWcNRr 1ES`>yyo0ATE8#B#ND⊉~\$PGxɰd2cd3ni'Xu e~Ay0G_(B_eLeYvUiE ET+0q qPYrhW+Qgãz&+R",CjhFz¬,�QG@Iň)x 1 > F?~\ĘQ7}��RH%T�i%*]ҒK,gּ)AM vRPPAeT:T(JKcPiMc\T+1H]XbzԙjR:-pٲ=mHR V*' ! Xx'nXdʒsP6#!Cx.OКhLժ9ȣÐ/:tʓ!/y>tѡC~q7ZL3fJq7Q42E7Sȁ!,W#ERt9_̐uzO.3H:$ c:hA!İB.dArPODR!1"Q1 ˆDH9䈣 ?xH6 RLB$@Z% @āNh * ˚h x(!L (J*D% ,A-PbΠk32Aab+J:RR)0CBNPl=ZAT*cU:d-T4ˁ`5_Y[Wzc͋`jsv7Š 9h;*�b00ʽ!c]\O? F`@÷{0C& .'Dz/T1,\  D9L>Y܉!5"IP$&a �MljҒ KKz҉&<ZJfY+,B%Έ.ގ+/N{0K# 0R S<Na�V=Onp38 4dcr5`S`M7rm{窰"""F٣Ec|q^FD?`yW B;dDBꠃA)F( !c!3yd 9?LIKhf �x T8@MV\hXZ%0`"%<!�LX ,S�> �(!K| +AA&LL`4D&Љ`D5%\Ehb'6Rp`1(RO|  H!�Q@�N(E*Bq�<a 8l�_PU@�)ȃ`< �KЃ*VA�=X>A�4 @U e �C�8Ѓt`blAC@�N� ΀6ilSBn{,[Ĺs;@ 7q'_DҙN1`y`;=wAyH7o  Ph X@A�B}h щJ hE0'! v�P;t %HUZbWHx3ӓdRx)$#)ȧqF>&!D81�8ZO(M`U I p(@@ B�Ȁ�H� (!:fJ 8J|�a3 (�`1XZb0MQ� 3lbwA F'Q`� +<`�)@A`��jT `|)b4�s"7>)�@�8h%XA( 16膺zЍ!@eƼĉBPM>,vC{yMnK uW g yY z)D^.B:O(p +TX! &> $-f1!KGq�@ #J\+e8ra@�bGW_p?)@ :OĀ5[RLh %@Xmb (�7qxBؒ'F!6 *4\"�KJ)F�u'B `КjijT *;�GeC�2qٮe(0t\薩"g#l NrcRQ$ q)<ˤ�n'?x9eh Ca�X#k6ZxA~ӈ-=6 ."Ἕ7{W 0Ovw C"GyccAP27D9w=uuԽ!EEQUdAxC 0n@h M&2d&T:DOT4!ژ:J�;`�`wI`�&`$@2X Ā�\�"*`) {BNM*AYƖiPF4)`ZS°gP<oO Tt(ز ¹c�zkX _W|dl ӊy|LP �-n!L(?l sWCq0cEa -xs."Մ{/|38>H3's: #5:u)rd9~AA3!1azIA9IԹS: ” "D:{$[2+:222ۑ8Ј(01s )ß+ � 8Ik4>0@ xEaļX` D@ N!i4=CbႜR _ɕќ_a7CЂ70�7�j/j/{{_0D@t/)#9XpFjƝ@As(sL̹8빟 h#<¢{)ȟ[„j2#8+*B C0\ 11șC-ْ0IyCËy0\7<C PK XpJhDqDXŨJɔ?r >HNdϘɁ،Е`͙ _97�)){[|b󀲗Fsaɝ@94L 9zApD1PA̜#̹A9SAM1:G h$B"4<H&|'M&kH(|H*Hp13ɤiÞ ?[C2qIz L>�HFQDDEqJ DP 8ȨʪWΨ[ ψ@UlT - %P0Pi\\/Km1#ˈPLm2&mRjrQ´ D<G r1Ƥ3X3@$%UMAȂ'm,RKA}GAM !Ɠq $9hSM@%N&㈘0C81 DJJHI4X x<=>4pOZ RIDt GOIěDId-3 ؊U9Jɑ1%(ET ]ќՠ(x/0EhjrlKB&3P̯j5 Ă9gjs1ƍQwA$ ,�1M,R4k1R)E)z9Mƈ=9BqS'KH;}8$itN2 �Ԕ *T8LY7N6CϦ�O)OLɰ( "*jOaĸDX܋PY5ZMЬ% ͕70XEj E V'B2p8Lָ8j2lʦљoWoE\ÍFumWĤ׎\Q5zTR$�1:h,R0 B2* **1p]=;Y?}< ؅??*?&C*8ΐ͈4I Ï2yY5 DÞ|ԛɧx<M@@@35I3hZ܋pQ�^ZY۰/@D`)h ne:)B%"(kE8�7pcYЍB8י؉@eQqQ̚:\ؓ1fX!vYr,A,@:""h^88]Gx{Gx@7p;<=/ 0C @] 4C5/ j47Ԛ!8yKATA<ڵ DڥMM1`曬D /`0H-嶵8"c& `]bdqcj ЂFP'a"9&\"yx@(%;+ ڽ*8:pF8hp脞갎I)x~9G(7Gccvc>FVi<6$1ȚAԕmY8 jßOI ;<|>9OLL˴P1Z(1DU^JZRU-aZv8@]-@a �䅃]^gVV ݈ ( X7`"20**"h7"PW)>>vFXmfFlB(m7 ܾܮh7(ⶎi96665;^n<S�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image30����������������������������������������������������������������000644 �000765 �000000 �00000001227 07504443351 017425� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���笿榺䡶⟵☯ލ܃|xungda]YV|OwHqAl>j:g6d0_������������������������������������������������������������������������,����x� �@pxql:ШtJ&،i8.SHҨL$LHtNؗ|"f&E!'&'BWB]_[W"&zUK�'�'B � %C z#� ' ��B �B%��' ɚ'�'%� '#֕�z ��� qnP&U$ 'x:�P (4@ki:K}Y"(QH<�pϟ@ 91"ЧP/);�2xpDJ ![%$o <HxaPo# !V&qՉ@�pK"c;� j-p-O\�a�xG9VC2 xK?@� v@.ViHhb'h`"�<bhYA5Nan)�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image31����������������������������������������������������������������000644 �000765 �000000 �00000000116 07504443351 017422� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax����Pw0_/P���,����x���'ڋ޼"@扦ʶ L�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image32����������������������������������������������������������������000644 �000765 �000000 �00000001054 07504443351 017425� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���笿榺䢷㟵☯߉ۃ|yuhgdaYU|NvHqDo>j:g6d0_������������������������������������������������������������������������,����x� �@p(1��l:ШtJZMC#>8΄$>dq<>I4'|[R �!C �B'#�� '�'�r�'& �CC�B!%B'G{ 'è'H�G&$V�B& �'� �f�Ѩ'Z&,a` (HD �a!H;-8y*� H|!�\R!puH�*z4e+IXt*�Ӡ# aB�\:�6�nuk(qp� V! Lb�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image33����������������������������������������������������������������000644 �000765 �000000 �00000001126 07504443351 017426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���禺䢷㞴☯߉ۅڃ|yungda]V|OwHqDo>j:g6d0_���������������������������������������������������������������������������,����x� �@@phrBacz@ĨtLBHx\xD4&QD#HLsTaHDDlnl&t&$lLdc ���  B  &%�Q �nC �V&�C� $Ξ&&#�%&�V Bܺ�E�H&FeV(Llx��Ai@‚o2jȱG! Ac`�*CBխPď08��&H b|!(x0q|s]"1p�1;f*`}M�`* l3؊�(¦�X˄`��eXqwvV3Q�e $�Vlr;% r�`ӨSg �;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image34����������������������������������������������������������������000644 �000765 �000000 �00000000760 07504443351 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���笿榺䢷㛲ᘯލ܆ڃ{yungd`]RyNvHqAl>j:g6d0_���������������������������������������������������������������������������,����x� �@@p8t,Ĥ()@5PͥvzZD3TB $-#%Mi6]``% #� &�x� C �B�&��BB� �q� $�I� &�&Z � �% �D&R"�%ěC%� 2�hY� (ep�i۹ztpKX( D4~�P'P 4IᇱeL|@@>2 [� e�$ pɴvA��;����������������saods9/tkhtml1.0/tests/page2/image35����������������������������������������������������������������000644 �000765 �000000 �00000001324 07504443351 017430� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���笿榺䢷㞴☯ߍ܆ڃ|xungda]V|OwHqDo>j:g6d0_���������������������������������������������������������������,����x� �@@p.*NaBl:s�%vJT6HX5fS3D$tr"cTe!M$ &){e"$*)`kf**^!��C m �B ��#B�!*�*kCU�`*(�*D��^�* �'$� ��%$B<PiTD*( @!<ǒy<%hroHF 0L:�` GCPr�&� U(PĶbOs$jʵW��kV{2X@0T,fz`Հ!R�5"y`]�=T  Y$vQA,^\aĚq{']LTPP ,uVH9֔8IwG, 3ތ{w<\.$E,EA 0� 40 � :a`ͩM (jE(uQ!WA��;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image36����������������������������������������������������������������000644 �000765 �000000 �00000000624 07504443351 017433� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax� ���笿榺䢷㞴☯ߍ܅ڃ{ukd`]OwHqDo>j:g3b0_���������������������������������������������������������������������������������������,����x� �@@p($Ĥrl:Шt:@2 Ddj! "P(" Qx\BH]p>� |� [B�~rItv�"{}�"�zSC nR} "֦� c"  �BA�;������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image37����������������������������������������������������������������000644 �000765 �000000 �00000000174 07504443351 017434� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87ax����◯cIsAl0_���������������������,����x���1I8ͻ'divqlNDptm[G�&�@ S��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image38����������������������������������������������������������������000644 �000765 �000000 �00000020212 07504443351 017430� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a'*���ֽεΥֽƜ{!޽ֵέƥνƵ֥ΜƔֽεƭ{cƄ޽{ZֵsRέk{JƥcZ{9s1kR!c!B1cJZB9)�Δֽε{ƭscZ޽sֵkRέcƥZRs9JBk1ΥJ9ƜB{19sZ!Ɯ9s)1k!)kR޵֭ΥƜνƵ{ƌΌֽ{kεsƭkZ޽kJRJέZcR)ƥRJ{9ZJ!Bs1֭J{c)9֭B1RBΥ9{)1Ɯ1s!)J9)sZޭ֥νƵkcƄ΄cεkƭcR޽cJֵZBέRkZ)ֵRƥJέJBcR!ƥB{19911{c!k!))Υ1{!ֽΜƔ֜νsƵ{Z{ZֽkZ{k9ƭZs9JB99ֵJkZ!{)ZJ1cRs!))!RB{c޽Δƌsν{kƵsRRֽcRƭR{9{k1JB911έ9)ƥ1kZ{!ZJֵέƥ޵ƽΌƄkνsƵkB{k)91B91)ΥƜcJBޭ֥Μ��������������������������,����'*�@� <H`A]*ŰÆtHbq^`d9v9r](ߤtQZZ-nż儦iNDRK+0 Q\tP)NLPjN\ȹ3릯p@kC5E֘!nSxP ,<CT¢+p13v˘3k|e@�u=W_N_@�jm(h{"1#��z Tyr>⸋ׯcZKpiɖMd1jkK*/n?5c=P’C>"1l!_ `|'!]voXcMoY#zB9<1^y"4fac߈ <@)d&c!H&\4$8[lQC05B/"(QDx 2t"�<WqtJ7]C%W9&$(.C*0rVzH)`t*ip &u5ya5Vzm8Ҫ^z6v5j=F$ѩ#aW&Vh5^bm{(8ܒaoF/ȡ8FȺLҌlLƼ @J!>*A6i0U‡]R0!2C �sI#S @G&̱l$ڪ)%BxLVraE'X"GY&p&r)z�\8jκj:XJs42sزtEC-GmIE>LR ϸL iDFd>D抐42ǔqǨr 7\xc  1RDAa=cqoL@�71�"Y$W?@P,gG HD.P-MKQL\r H?$A URJP.H88%ѐT간TT <E@l + H :- ܂&4,0!J$� "$"a8D!@ͮ5B wq%*�&1 Ox*f< _>V8ANӳF! &ÞrHG;I!HITZ;~ d]$$H:‚qp#F&HZґldG>B$r&Q!0 UY kX2Zъd`)md#O& yK1f2MN45�f4#nzs1s¹;=$"wE4ґ:<]0.j8 `- ]� ̀1 Djam4`2 )r \%/ ] A) ܃} `2 iIk�P-SΈ4HjF #7zB5 P}VT K@(|�Pp{6 LfƘFԑ wrC$G< �5Ǧ|y7 ԅQY&[)M9JiVHEly!₫ZF3HG+2J> *P;(B V<̣n :q7ح<ыB tYcXe(+Ct7=! -vU@?0,w`Ts8##6FbHh4 [5@Tz٧u0Rԥ@5Ye TVoEC1fmw78E>gՀ`WةWm8XsURJAhUGe5--ʨGQ%Iܠ$@ gXJk̘DА}b_2z<vȝ܁k@lEI4.pL�f24`VNt(:<m&\<*< (t`bRTj 2J ĒjEpTЎ 4TuUKJ4hQ@g8rp~DvC9VH0(;J5k�Dzנo>0RpGk|bFHMXH2m1=hJ O\U2P6yhSi98zֵET |$'Wϗ3Mʝ8Ґd#_ *<@ `8T*Pl,WT8i̺[vǘ18\tu.c9l^yN<~\کF4\z]~':U0 ׏@ V%nIn4K_t J.MgƚԦ+Ջ?Pb!AaD AeV3ƫ T߫O*RUn@5Y( Vblc cWqWxNqQINO0 2jb 9P[5#|P1Q2Q(9@!/"#|0ZǗX`S<(b{0Ra PZz|{})SNd3 p#" 6 [Xn^^oPe%%c%Q% &p�f p<1F2w5GWH-+M � ͢ [C8Z A6U+ Ė(W'#͗0HpRGSnS"e[\E\ŕ e&Op 6"7#$`n{֌0>ps^}g#[8%ED0&`xՓgGqa 0<F=%-q!8a6mdq4*)*BiFv^�X-+A�2Y"+2f wS`Sb ʕ�ir\[[f!\ Y  h0D/ w /^Bh %GD__#FoMFvu� =v #A Ԑ356")Y3yXf*B7l2mpiib,:6{o![ ( 1#3B7z#YA çST0� } " JJfl.)/L /z^S0V9_B4wo1@L\_a`tqQ&Ga2  *ta6303a{ap=kr:: KV &e8"f 08 ҁ, *2a4"7N5V tW!e0b z38s � 0 P.0p^ҌT$>4;;)vE EL #qFxd2P@K* ɐJҙ3A"V|:.'432bmXsp?kLP0Ude )6VaFmC7tbyb :8n f`9Pd0 b *< < Ǹ$G#;VCo#ZL ]:<[d<awTM'gD=fMg2`HN`i3Sq *2)` q`7RjOus>J�tfkDzI@<kPA4z4&A3Y" 8*i6v" t S?kq nrgz؈$V oA4 Ve FD:Z;gD[;RdhVDݙ sxN[qg=G1`�`\`=1O-p71 G?; H@tP@@-:4EC2[[+ 9*#$HRwJN@z$?Bq.J a�8p }oSpnvvW4<DPC<#�SLߙ Mchfkt NTyAXIt(t%dI[$ )yMwJuBHuk B?�v;0v`U@؀ 'L4wx<_wlwaL`v' ig~x;UaI I"AOޛyG}{BSBӀ?'?K3@w@Z{VV+ [(Z!tQZZNSAT1؇ƨd W }TnI%ƿ P �ben1A̼ h&| ؀I4y'OOJ4B 0P`4T,!#{PR(Q"uv!|_㈮y?EQsR{Q(T[}|}p~o~Y@UQupVcUVP7 V1�32Wx%‰<Œl!yH+LHwtH@0ʛ06R5Q{=e(�˲,3r2(y{Q&5eSB ń= |@|!#j,6B%T2o=<=%S5 bXYVǩ  V!Z4`uUБxLNgy'x'<,4Z3J u2\ lX uz3ўr S2ZA舙I L5SBQ%X(|Ҩ|LY " �NڮN_\ڬ=]hUBt\V]VVD&&Sj=WG_xa+ g7<~ 3(‘-m{({X|8iU` `\!Su%<2Ir<C@80=E&p$G$6 %sV ;`&tu` rGws1 +bY4I^AˠR̦ZxPu !Ւ߻ŋ�&e"ox�P ڃNU>�5^e^zv^:I`0"ލҊDmȝkw/Fg`z(Š堖lcoY̏ Ǧl)cŗjY^RFiZ*bޟB(u->X"4 c.\ąώe d0=@ EŔrg/y/08c0%mK;Tzȇ\er(X"+җdl6Ɨt+lAގH5{ZJܑ7iژ1m0-`Wx&e"r.Q@``ːC.Ͱl / Py^5n5 ZQEE{&]<m"M}N�=6(�"ΙqJac;t* VҰV,k13|6Hĭ[B,,jq\17zid G8(A(Rٸ"}P� W0s.h r/ϔ5^V:#;ͪ0 K4 tw}Lִ@am l3FjVSC 7Ζl@2+c[pQ�qTS^qPM6 22M8rl-є:٘R9lӆ#FET9rJT:q4'3s3iґGMBWh rBXo\lt(Ł)RDp<yy!C^}.`x @ bƍ<AZ2vj@mB gBmatCG1rgM9eʤIukd7o?֔).Zu\A@D={KWN( c̹ %7沴c%%#G*_@&dJlDqxc3(JyG+ <tAU9Q .FჁP�..ށ��P #cr1ꁲ].dҲ!/X50c6:#ܚЍM* K"+;C&.1D@ZB$X2&/ A%PͥHb5S?$[>K`/r:VX TJgp& !YC4̀Gc#)e`YW|x+:DѢ,A+s( ǺKu} L0 # [I$ӥ8{KS <X;hlInMK,u 7J,/MlɄZpZ9b͑ؠKhZX6im9 bvʙOWd \Q0 `IdQDGFEК{�Fq,A]Ekѝ+<v+jw0x,# K^Ý4}3$LCe)U-H!M⠃5?O3x4,aH(8h&0vL`Bv\ҤsNDͣ\LB u9REJK=egpykJ6B 4)cFPY!'a."pn>8H爂nT܅G{;"�0<RSzpy@v60"umNP%8�wE&N3EgBU.thpd%Vp nv@♔95/8tJV%;*SjS=嬆=ҟ:N gf@ ATA\�`q-2b[".rK.0׹vM` ΃d  qN& $H5].L475�2L H.a^˜B,s3тq-wXtI")KcSIJ&( 6Om8 $L --"bJpfHX\#‰|Ō"7UC8F^n׀"�+=[E8ͫ1eJC9QRFqzbv-Ȝ,aasE<�YL#D*=y $2Dg2܍OwTad9e3T %y x *Tc+- `A- `�n-�-}VZQ 8,$1Kt'2IJVHA"LԵL drvKuFƦ)ycί+P&ψOjPnJEtЬ4 C&c*0قZT)k^"*^:`!d!_C1+ lE0Oh^$<a KX]HvZX0&kE|8_-m1x, ;ܶ/8X`]u]`Tw G2|[ wiOl.ہ02e* .Po-~^xYG.^ (1B?QlՑ)9JGvvCH \'Gi42)E[,`:^6Mvu[0kzV.e/,q `1:oHkγ+ ;`P@g# P't]ѧtݷf(tU ԟ̓�nbޢXŦn1~7+-nM-qK82`s\`,(5/sZ[ k*~mp @6O|]<$`,YAo~#z17M[Oe@��;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image39����������������������������������������������������������������000644 �000765 �000000 �00000000561 07504443351 017436� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a.����ᠳٕԋЀuk`UwKo@f6^+U LD�3���������������������������!���,����.��@%dihjlp,& TPIB P"�dPA ~PQ �v˭1%BQ(hd@Ƴݼ~#kq3,5, hjX�;9l;,Tw�Ab1"- 4%�L ,: , bĴ j c?kXU-uWx$/v@M iI:< TX5Dc$L`N�0@qxCŋ"B��;�����������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image4�����������������������������������������������������������������000644 �000765 �000000 �00000000414 07504443351 017343� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���ᣣyyyaLLL8880_/^,X&K"""?:v*U @ 5>������������������������������������������,�����$�@ c H,0p ?8<.aH,%d5` جK5 JBm} EQ]}8G]"_*>$eoeejqdJkm J6suzx|{MytRS !�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image5�����������������������������������������������������������������000644 �000765 �000000 �00000000754 07504443351 017353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a:�$���ֳܼѩˠŗzqa^sTjKbBZ8Q0_/^/J?:v 5>���������,����:�$�@`'dihWp,tj`z>"� <H�  (R0xL.4n|No<J=cPPLK9�C�OQ cz+|��W�F<?R�89; �Scju'j=h`@0( 8*0!! bp�@BSr�䎒);dI!C@�%qjl � 2rsMÃeI?z-U@ZfPY%A[ކpʝKݻp˷߿pLÈ+^L8�;��������������������saods9/tkhtml1.0/tests/page2/image6�����������������������������������������������������������������000644 �000765 �000000 �00000000366 07504443351 017353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a�$���a0_/^,X+V'O"E=z:v7o2g-]+W&L"E?< 5>���������������������������������������,�����$�@{$$) 8FA Hm#P, W-@,W˵z̦N�XXr%bQ'5=E3ԣ|N'v|+mQ Nden?S e8c7j6pPu!�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image7�����������������������������������������������������������������000644 �000765 �000000 �00000001047 07504443351 017351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87aE�$���ֳܼѩˠŗzqh{a^sTjKbBZ8Q0_/^/J,X:v 5>���������,����E�$�@`'dihcvW,tmxk& =Y�$B`8h @I�@D��0/8(8$l|Ny~z,w�� <a <X �ea� h Foǿ%Q CoFH^[�O�C�gFbhYW� 6*\hÇ#JH3jܸ18r4)3TЀA\f̕*|!SL3װt s hR:�F{zIGiɪ�NIQx mYP2"+yxv΃,K4D�LB0/U.oT0$^$ɹ8BMӨSͰװc˞۸sͻ߷C��;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page2/image8�����������������������������������������������������������������000644 �000765 �000000 �00000000761 07504443351 017354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a<�$���ֳܼѩˠŗzqa^sTjKbBZ8Q0_/^/J.[%A{:v 5>������,����<�$�@'dihYfW,tmHߦ$�I�v�A:�p`(zneN~o_*qo>@<ZKHU;X TXS L >j>T� Å> �� HJ�BSXT\E_bT n|u�t")  ,m 1TQY"lY w0��4p4iB} R  0�<h2Y 42JFD8U@GTvR6*@B-2ƃp@ݻx LpÈ+^̸NJC��;���������������saods9/tkhtml1.0/tests/page2/image9�����������������������������������������������������������������000644 �000765 �000000 �00000000754 07504443352 017360� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a8�$���ֳܼѩˠŗzqh{a^sTjKbBZ8Q0_/^/J-Y%A{:v 5>������,����8�$�@'dihzY{p,tm[B  $`l�PaS� ?B`8zn-|Nxj܀m ?F� ?A9B9SUN] h~'X] A��H�? =^g]˔my 1 C( Ap† ByPaA :HhqZ �Gr�Fe bXV IG3&2IAx4Q@��[ZM$YvR2aA60$ʥРJ�ȶ>pʝKݻx9˷߿vLÈ+^!�;��������������������saods9/tkhtml1.0/tests/page2/index.html�������������������������������������������������������������000644 �000765 �000000 �00000100263 07504443347 020257� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<html> <head> <title>Tcl Resource Center</title> </head> <body bgcolor="white" text="black"> <!-- MenuTopLevel Resource Software Extensions --> <table border="0" cellpadding="0" cellspacing="0"> <tr> <td width="120" valign="TOP"><a href="/"><img src="image1" width="120" height="79" alt="Scriptics" border="0"></a></td> <td valign="top" width="548"> <!-- Table to hold tabs --> <table cellpadding="0" cellspacing="0" border="0" width="548"> <tr> <td valign="top" align="right" colspan="15" width="548"><a name="TOP"><img src="image2" width="548" height="9" alt="Tcl/Tk" border="0"></a></td> </tr> <tr> <td valign="top" align="right" colspan="15" width="548"><img src="image3" width="482" height="34" alt="Scripting Solutions for eBusiness Integration" border="0"></td> </tr> <tr> <td width="18" valign="TOP"><img src="image4" width="18" height="36" alt="" border="0"></td> <td width="58"><a href="/products/" onMouseOver="msover(4, 'http://images.scriptics.com/images/ProductsMouseOff.gif') ; return true ;" onMouseOut="msover(4, 'http://images.scriptics.com/images/ProductsOff.gif') ; return true ;"><img src="image5" width="58" height="36" alt="Products" border="0"></a></td> <td width="14" valign="TOP"><img src="image6" width="14" height="36" alt="" border="0"></td> <td width="69"><a href="/customers/" onMouseOver="msover(6, 'http://images.scriptics.com/images/CustomersMouseOff.gif') ; return true ;" onMouseOut="msover(6, 'http://images.scriptics.com/images/CustomersOff.gif') ; return true ;"><img src="image7" width="69" height="36" alt="Customers" border="0"></a></td> <td width="14" valign="TOP"><img src="image6" width="14" height="36" alt="" border="0"></td> <td width="60"><a href="/partners/" onMouseOver="msover(8, 'http://images.scriptics.com/images/PartnersMouseOff.gif') ; return true ;" onMouseOut="msover(8, 'http://images.scriptics.com/images/PartnersOff.gif') ; return true ;"><img src="image8" width="60" height="36" alt="Partners" border="0"></a></td> <td width="14" valign="TOP"><img src="image6" width="14" height="36" alt="" border="0"></td> <td width="56"><a href="/services/" onMouseOver="msover(10, 'http://images.scriptics.com/images/ServicesMouseOff.gif') ; return true ;" onMouseOut="msover(10, 'http://images.scriptics.com/images/ServicesOff.gif') ; return true ;"><img src="image9" width="56" height="36" alt="Services" border="0"></a></td> <td width="14" valign="TOP"><img src="image10" width="14" height="36" alt="" border="0"></td> <td width="88"><a href="/resource/" onMouseOver="msover(12, 'http://images.scriptics.com/images/ResourceMouseOn.gif') ; return true ;" onMouseOut="msover(12, 'http://images.scriptics.com/images/ResourceOn.gif') ; return true ;"><img src="image11" width="88" height="36" alt="Tcl Resources" border="0"></a></td> <td width="14" valign="TOP"><img src="image12" width="14" height="36" alt="" border="0"></td> <td width="57"><a href="/company/" onMouseOver="msover(14, 'http://images.scriptics.com/images/CompanyMouseOff.gif') ; return true ;" onMouseOut="msover(14, 'http://images.scriptics.com/images/CompanyOff.gif') ; return true ;"><img src="image13" width="57" height="36" alt="Company" border="0"></a></td> <td width="8" valign="TOP"><img src="image14" width="8" height="36" alt="" border="0"></td> <td width="50" valign="TOP"><img src="image15" width="50" height="36" alt="" border="0"></td> <td width="14" valign="TOP"><img src="image16" width="14" height="36" alt="" border="0"></td> </tr> </table> </td> </tr> </table> <script language="Javascript"> <!-- function msover(num, file ) { old = (((navigator.appName=='Netscape') && (parseInt(navigator.appVersion)<=3.0 ))) if ( !old ) { document.images[num].src=file } } //--> </SCRIPT> <!-- MenuSubLevel Resource Software Extensions Tk --> <table cellpadding="0" cellspacing="0" border="0"> <!-- Left Hand Column--> <tr><td valign="top" width="120"><table cellpadding="0" cellspacing="0" border="0" width="120"> <tr> <td width="120" valign="TOP"><img src="image17" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/"><img src="image18" width="120" height="11" alt="Software" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image19" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/tcltk/"><img src="image20" width="120" height="11" alt="Tcl/Tk Core" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image19" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/applications/"><img src="image21" width="120" height="11" alt="Applications" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image22" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/extensions/"><img src="image23" width="120" height="11" alt="Extensions" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image24" width="120" height="6" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/patches/"><img src="image25" width="120" height="11" alt="Patches" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image19" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/java/"><img src="image26" width="120" height="11" alt="Tcl &amp; Java" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image19" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/ports/"><img src="image27" width="120" height="11" alt="Tcl/Tk Ports" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image19" width="120" height="4" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/software/tools/"><img src="image28" width="120" height="11" alt="Tools" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image29" width="120" height="6" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/doc/"><img src="image30" width="120" height="11" alt="Documentation" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image31" width="120" height="5" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/resource/community/"><img src="image32" width="120" height="11" alt="Community" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image31" width="120" height="5" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/live/bydate"><img src="image33" width="120" height="11" alt="What's New" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image31" width="120" height="5" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/forms/urlnote.html"><img src="image34" width="120" height="11" alt="Add URL" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image31" width="120" height="5" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/live/keyword"><img src="image35" width="120" height="11" alt="Keyword Search" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image31" width="120" height="5" alt="" border="0"></td> </tr> <tr> <td width="120" valign="TOP"><a href="/live/sitemap"><img src="image36" width="120" height="11" alt="Index" border="0"></a></td> </tr> <tr> <td width="120" valign="TOP"><img src="image37" width="120" height="6" alt="" border="0"></td> </tr> </table><!-- End Left Column --></td><!-- Right Hand Column --><td valign="top" width="548" align="left"><table cellpadding="0" cellspacing="0" border="0" width="548"> <tr> <td width="295" valign="TOP"><img src="image38" width="295" height="42" alt="Resource" border="0"></td> <td width="187" valign="bottom" align="right"><FORM action="/live/keyword"><img src="image39" width="46" height="24" alt="" border="0"><INPUT TYPE="TEXT" SIZE="10" MAXLENGTH="35" NAME="keywords"><INPUT type="IMAGE" border="0" img="img" src="http://images.scriptics.com/images/Go.gif" value="submit" width="33" height="24"></FORM> </tr> </table> <!-- 2 Columns for spacer --> <table cellpadding="0" cellspacing="0" border="0" width="548"> <tr> <!-- Spacer Column --> <td valign="top" width="10"> &nbsp; </td> <td valign="top" width="548"><font face="Geneva, Helvetica, Arial" size="2"><h1>Tcl Resource Center</h1> <font size="+1"><a href="/resource/">Top</a>&gt;<a href="/resource/software/" ="">Software Central</a>&gt;<a href="/resource/software/extensions/" ="">Extensions</a>&gt;Tk Widgets</font><font size="-1"><br>Viewed by name (<a href="/resource/software/extensions/tk/?sortby=date">By date</a>)</font><br> <p>Tk is a toolkit for building graphical user interfaces with Tcl. Your Tcl/Tk scripts run on UNIX, Windows, and Macintosh.<p> <font face="Geneva, Helvetica, Arial"><ul></ul></font><dl> <dt><b><a href="http://marge.phys.washington.edu/%7Ezager/blt80-unoff-exe.zip" ="">BLT 8.0 Unofficial zip and DLL</a></b> <dd>This is a compiled version of BLT 8.0 "unofficial" for the Windows platform. <a href="/live/annotate?url=http%3a%2f%2fmarge%2ephys%2ewashington%2eedu%2f%257Ezager%2fblt80%2dunoff%2dexe%2ezip">Edit</a> <i><font size="-1">(September 24, 1999 06:31)</font></i><dt><b><a href="ftp://ftp.neosoft.com/languages/tcl/sorted/unknown/blt8.0p2-unoff.tgz" ="">BLT 8.0p2 Unofficial tar file</a><a name="bltunoff"></a></b> <dd>This is a contributed patch to make BLT compatible with Tcl/Tk 8.0p2. While still "unofficial", it is widely used. Make sure you get the 8.0p2 version because the 8.0 version does not compile under windows. There is also a <a href="ftp://ftp.neosoft.com/languages/sorted/devel/blt2.3-8.1.tar.gz">2.3-8.1 version</a> that has been patched to work with 8.1. <a href="ftp://ftp.neosoft.com/languages/tcl/sorted/unknown/blt8.0p2-unoff.README">README file</a>. <a href="/live/annotate?url=ftp%3a%2f%2fftp%2eneosoft%2ecom%2flanguages%2ftcl%2fsorted%2funknown%2fblt8%2e0p2%2dunoff%2etgz">Edit</a> <i><font size="-1">(August 30, 1999 06:38)</font></i><dt><b><a href="http://www.tcltk.com/blt/" ="">BLT Home Page</a></b> <dd> Author <b>George Howlett</b>, Version <b>2.3</b>, Works with <b>Tk 4.1 through Tk 8.1</b> <br><a href="ftp://ftp.tcltk.com/pub/blt/">Download</a>, <a href="ftp://ftp.tcltk.com/pub/blt/BLT2.3.tar.gz">BLT2.3.tar.gz</a>, <a href="ftp://ftp.tcltk.com/pub/blt/BLT2.4h.tar.gz">BLT2.4h.tar.gz</a>, <a href="ftp://ftp.tcltk.com/pub/blt/BLT2.4i.tar.gz">BLT2.4i.tar.gz</a>, <a href="ftp://ftp.tcltk.com/pub/blt/blt2.4i-for-8.0.exe">blt2.4i-for-8.0.exe</a>, <a href="ftp://ftp.tcltk.com/pub/blt/blt2.4i-for-8.1.exe">blt2.4i-for-8.1.exe</a><br>BLT is a set of widgets for Tk, including a graph widget, bar chart, drag&drop, a simple command tracer, and much more. The 2.4 release, which is still under development, works with 8.0 or higher. There are also an "<a href="#bltunoff">unofficial</a>" release for 8.0p2 and 8.1a2 that were not done by the author. <a href="/live/annotate?url=http%3a%2f%2fwww%2etcltk%2ecom%2fblt%2f">Edit</a> <i><font size="-1">(October 26, 1999 09:43)</font></i><dt><b><a href="http://www.unifix-online.com/BWidget/index.html" ="">BWidget</a></b> <dd>A set of native Tk 8.x Widgets using Tcl8.x namespaces. The ToolKit is available under Unix/X11 and Windows. The BWidget(s) have a professional look&feel as in other well known Toolkits (Tix or Incr Widget) but the concept is radically different because everything is native so no platform compilation, no compiled extension library are needed. The code is 100 Pure Tcl/Tk. More 30 components : Notebook, PageManager, Tree, PanedWindow, ButtonBox, ScrollView, ComboBox, SpinBox, ListBox, SelectFont, SelectColor, ProgressBare ... <a href="/live/annotate?url=http%3a%2f%2fwww%2eunifix%2donline%2ecom%2fBWidget%2findex%2ehtml">Edit</a> <i><font size="-1">(September 06, 1999 09:58)</font></i><dt><b><a href="http://purl.oclc.org/net/nijtmans/dash.html" ="">Dash Patch for Tk</a></b> <dd>This patch has many enhancements to the Tk and its canvas widget, including dashed lines, smoothed polygons, and performance enhancements. <a href="/live/annotate?url=http%3a%2f%2fpurl%2eoclc%2eorg%2fnet%2fnijtmans%2fdash%2ehtml">Edit</a> <i><font size="-1">(November 21, 1999 06:33)</font></i><dt><b><a href="http://www.hwaci.com/sw/et" ="">Embedded Tk (et)</a></b> <dd> Author <b><a href="mailto:drh@acm.org" ="">Richard Hipp</a></b>, Version <b>8.0b5</b>, Works with <b>Tk 4.0, 4.1, 4.2, 8.0</b> <br>Download: <a href="http://www.hwaci.com/sw/et/et80b5.tar.gz">et80b5.tar.gz</a><br>Embedded Tk or ``ET'' is tool for making stand-alone executables out of a mixture of C or C++ and Tcl/Tk. Using ET you can invoke a short Tcl/Tk script in the middle of a C routine, or you can invoke a C routine in the middle of a Tcl/Tk script. ET also bundles external Tcl/Tk scripts (including the standard Tcl/Tk startup scripts) into the executable so that the executable can be run on another binary-compatible computer that doesn't have Tcl/Tk installed. <a href="/live/annotate?url=http%3a%2f%2fwww%2ehwaci%2ecom%2fsw%2fet">Edit</a> <i><font size="-1">(August 19, 1999 15:35)</font></i><dt><b><a href="http://www.purl.org/net/hobbs/tcl/script/tkcon/" ="">Enhanced Tk Console (TkCon)</a></b> <dd> Author <b><a href="mailto:jeffrey.hobbs@oen.siemens.de" ="">Jeff Hobbs</a></b>, Version <b>1.3</b>, Works with <b>Tk 4.1 through Tk 8.1</b> <br>Download: <a href="http://www.purl.org/net/hobbs/tcl/script/tkcon/tkcon.tar.gz">tkcon.tar.gz</a><br>TkCon is a replacement for the standard console that comes with Tk (on Windows/Mac, but also works on Unix). The console itself provides many more features than the standard console. <a href="/live/annotate?url=http%3a%2f%2fwww%2epurl%2eorg%2fnet%2fhobbs%2ftcl%2fscript%2ftkcon%2f">Edit</a> <i><font size="-1">(August 23, 1999 12:06)</font></i><dt><b><a href="http://www.scriptmeridian.org/projects/tk/" ="">Frontier-Tk ScriptMeridian project</a></b> <dd>This project seeks to integrate the Tk toolkit with the Frontier scripting language. <a href="/live/annotate?url=http%3a%2f%2fwww%2escriptmeridian%2eorg%2fprojects%2ftk%2f">Edit</a> <i><font size="-1">(August 19, 1999 15:36)</font></i><dt><b><a href="http://purl.oclc.org/net/nijtmans/img.html" ="">Img image format extension</a></b> <dd>This package enhances Tk, adding support for many other Image formats: BMP, XBM, XPM, GIF (with transparency), PNG, JPEG, TIFF and postscript. This is implemented as a shared library that can be dynamically loaded into Tcl/Tk. <a href="/live/annotate?url=http%3a%2f%2fpurl%2eoclc%2eorg%2fnet%2fnijtmans%2fimg%2ehtml">Edit</a> <i><font size="-1">(November 21, 1999 06:35)</font></i><dt><b><a href="http://purl.oclc.org/net/oakley/tcl/mclistbox/index.html" ="">mclistbox - a multi-column listbox widget</a></b> <dd>mclistbox is a multi-column listbox that is written in pure tcl and runs on all platforms that support tcl/tk 8.0 or higher. This widget requires no other extensions; it is completely standalone. <a href="/live/annotate?url=http%3a%2f%2fpurl%2eoclc%2eorg%2fnet%2foakley%2ftcl%2fmclistbox%2findex%2ehtml">Edit</a> <i><font size="-1">(August 19, 1999 15:37)</font></i><dt><b><a href="http://home.t-online.de/home/dshepherd/tkview.htm" ="">MFC views C++ class for embedding Tk</a></b> <dd>The idea of embedding Tk in MFC windows always seemed very enticing but information was sparse and contradictory - on a scale between "very easy" and "not yet possible". The only thing for it was to have a go and lo, it wasn't that hard after all. CTkView is a C++ class which can be used in MFC SDI or MDI applications. An instance of CTkView hosts an embedded Tk toplevel widget and performs some management chores for the widget so that it can size, update and react correctly to Windows events. <a href="/live/annotate?url=http%3a%2f%2fhome%2et%2donline%2ede%2fhome%2fdshepherd%2ftkview%2ehtm">Edit</a> <i><font size="-1">(August 19, 1999 15:38)</font></i><dt><b><a href="http://www.cs.umd.edu/hcil/pad++" ="">Pad++</a></b> <dd> Author <b><a href="mailto:pad-info@cs.umd.edu" ="">Ben Bederson et al</a></b>, Version <b>0.9p1</b>, Works with <b>8.0</b> <br>Download: <a href="http://www.cs.umd.edu/hcil/pad++/download.html">download.html</a><br>Pad++ is a Tk widget that provides a Zoomable User Interface (ZUI) that supports real-time interactive zoomable graphics in a fashion similar to the Tk Canvas widget. Pad++ supports tens of thousands of objects which include text, images, graphics, portals, lenses, simple html (and more), including transparency and rotation. <a href="/live/annotate?url=http%3a%2f%2fwww%2ecs%2eumd%2eedu%2fhcil%2fpad%2b%2b">Edit</a> <i><font size="-1">(August 19, 1999 15:39)</font></i><dt><b><a href="http://home.t-online.de/home/sesam.com/freeware.htm" ="">Progressbar</a></b> <dd>Progressbar is a megawidget written in pure tcl (ie: no compiling required - runs on all platforms Macintosh, Unix, Windows). Its primary purpose is to show the progress of any action in percent. <a href="/live/annotate?url=http%3a%2f%2fhome%2et%2donline%2ede%2fhome%2fsesam%2ecom%2ffreeware%2ehtm">Edit</a> <i><font size="-1">(January 24, 2000 09:19)</font></i><dt><b><a href="http://jfontain.free.fr/" ="">scwoop (Simple Composite Widget Object Oriented Package)</a></b> <dd>Scwoop is a composite widget (also known as mega widget) extension to the great Tk widget library. Scwoop is entirely written in Tcl using the stooop (Simple Tcl Only Object Oriented Programming) extension. <a href="/live/annotate?url=http%3a%2f%2fjfontain%2efree%2efr%2f">Edit</a> <i><font size="-1">(January 09, 2000 02:10)</font></i><dt><b><a href="http://www2.clearlight.com/~oakley/tcl/supertext.html" ="">Supertext - tk text widget with unlimited undo</a></b> <dd> Author <b><a href="mailto:oakley@channelpoint.com" ="">Bryan Oakley</a></b>, Version <b>1.0b1</b>, Works with <b>Tcl 8.0</b> <br>Download: <a href="http://www2.clearlight.com/~oakley/tcl/supertext.tcl">supertext.tcl</a><br>Supertext is a package that provides a tk text widget with full undo and the ability to execute procedures both before and after a text widget command has been processed. Supertext may be used as-is, or for the brave it may be used in place of the standard text widget. <a href="/live/annotate?url=http%3a%2f%2fwww2%2eclearlight%2ecom%2f%7eoakley%2ftcl%2fsupertext%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:06)</font></i><dt><b><a href="http://www.hwaci.com/sw/tk/nbpi.html" ="">Tabbed Notebook Widget</a></b> <dd> Author <b><a href="mailto:drh@acm.org" ="">Richard Hipp</a></b>, Version <b>1.0</b>, Works with <b>Tk 4.1 or later.</b> <br>Download: <a href="http://www.hwaci.com/sw/tk/notebook.tcl">notebook.tcl</a><br>This implements a tabbed notebook using a canvas widget and embedded frames. This is pure Tcl code - not a C extension. <a href="/live/annotate?url=http%3a%2f%2fwww%2ehwaci%2ecom%2fsw%2ftk%2fnbpi%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:08)</font></i><dt><b><a href="http://www.tcltk.com/ellson/ftp/Gdtclft2.0.README" ="">Tcl GD - graphics</a></b> <dd> Author <b>John Ellson and Spencer Thomas</b>, Version <b>2.0</b>, Works with <b>8.0 and higher</b> <br>Download: <a href="http://www.tcltk.com/ellson/ftp/Gdtclft2.0.tar.gz">Gdtclft2.0.tar.gz</a><br> Thomas Boutell's Gd package provides a convenient way to generate PNG images with a C program. If you prefer Tcl for CGI applications, you'll want the TCL GD extension. <a href="/live/annotate?url=http%3a%2f%2fwww%2etcltk%2ecom%2fellson%2fftp%2fGdtclft2%2e0%2eREADME">Edit</a> <i><font size="-1">(August 19, 1999 14:52)</font></i><dt><b><a href="http://www.stratasys.com/software/metagui" ="">The Meta-GUI Tools</a></b> <dd>The Meta-GUI tools provide a framework for quickly building full GUI applications. The GUI is rendered by a run-time engine based on a hierarchical set of definitions you provide. At the bottom of the hierarchy are abstract data types such as length, angle, string, etc., and these are used to progressively build up frames, dialogs, toolbars, menus, and operations. <a href="/live/annotate?url=http%3a%2f%2fwww%2estratasys%2ecom%2fsoftware%2fmetagui">Edit</a> <i><font size="-1">(August 23, 1999 12:10)</font></i><dt><b><a href="http://jfontain.free.fr/" ="">Tkpiechart Home Page</a></b> <dd>Tkpiechart is a Tcl-only extension that allows the programmer to create and dynamically update 2D or 3D pie charts in a Tcl/Tk application. This uses the stooop package and builds pie charts on a Tk canvas. <a href="/live/annotate?url=http%3a%2f%2fjfontain%2efree%2efr%2f">Edit</a> <i><font size="-1">(January 09, 2000 02:12)</font></i><dt><b><a href="http://www.cygnus.com/~irox/tkprint/" ="">TkPrint</a></b> <dd>TkPrint is an extension that allows you to print from a Tk widget. <a href="/live/annotate?url=http%3a%2f%2fwww%2ecygnus%2ecom%2f%7eirox%2ftkprint%2f">Edit</a> <i><font size="-1">(October 11, 1999 09:58)</font></i><dt><b><a href="http://www.purl.org/net/hobbs/tcl/capp/" ="">TkTable Home Page</a></b> <dd>The TkTable widget. The <code>table</code> command creates a 2-dimensional grid of cells. The table can use a Tcl array variable or Tcl command for data storage and retrieval. <a href="/live/annotate?url=http%3a%2f%2fwww%2epurl%2eorg%2fnet%2fhobbs%2ftcl%2fcapp%2f">Edit</a> <i><font size="-1">(November 18, 1999 09:25)</font></i><dt><b><a href="http://ftp.austintx.net/users/jatucker/TkTextmatrix/default.htm" ="">TkTextMatrix (spreadsheet)</a></b> <dd> Author <b><a href="mailto:jatucker@austin.dsccc.com" ="">John Arthur Tucker</a></b>, Version <b>4.1</b>, Works with <b>Tk 4.1</b> <br>Download: <a href="http://ftp.austintx.net/users/jatucker/TkTextmatrix/download.htm">download.htm</a>, <a href="http://ftp.austintx.net/users/jatucker/TkTextmatrix/textmatrix4.1.tar.gz">textmatrix4.1.tar.gz</a><br>A Tcl/Tk spreadsheet widget, TkTextmatrix, which is implemented in C++ and is basically a Tk Canvas widget plus extra behavior for manipulating rows and columns of cell items many times faster than with a plain Tk Canvas. It actually inserts text nearly as fast as the Tk Text widget. If you work with or are interested in creating your own Tcl/Tk widgets in C++, you might want to take a look at the C++ widget library included with this distribution. <a href="/live/annotate?url=http%3a%2f%2fftp%2eaustintx%2enet%2fusers%2fjatucker%2fTkTextmatrix%2fdefault%2ehtm">Edit</a> <i><font size="-1">(August 23, 1999 12:14)</font></i><dt><b><a href="http://www.cs.umd.edu/~bederson/Togl.html" ="">ToGL - a Tk Open GL widget</a></b> <dd>Togl is a Tk widget for OpenGL rendering. Togl is based on OGLTK, originally written by Benjamin Bederson at the University of New Mexico (who has since moved to the University of Maryland). Togl adds the new features: <ul> <li> color-index mode support including color allocation functions <li> support for requesting stencil, accumulation, alpha buffers, etc <li> multiple OpenGL drawing widgets <li> OpenGL extension testing from Tcl <li> simple, portable font support <li> overlay plane support </ul> Togl allows one to create and manage a special Tk/OpenGL widget with Tcl and render into it with a C program. That is, a typical Togl program will have Tcl code for managing the user interface and a C program for computations and OpenGL rendering. <a href="/live/annotate?url=http%3a%2f%2fwww%2ecs%2eumd%2eedu%2f%7ebederson%2fTogl%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:14)</font></i><dt><b><a href="http://www.hwaci.com/sw/tk/treepi.html" ="">Tree Widget</a></b> <dd>This implements a tree display in a canvas widget. It is similar in layout to that of the Windows explorer file viewer. This is pure Tcl code - not a C extension. <a href="/live/annotate?url=http%3a%2f%2fwww%2ehwaci%2ecom%2fsw%2ftk%2ftreepi%2ehtml">Edit</a> <i><font size="-1">(September 29, 1999 14:37)</font></i><dt><b><a href="http://www.du.edu/~mschwart/tcl-tk.htm" ="">Windows Extensions for Tcl/Tk (Michael Schwartz)</a></b> <dd>This site has pointers to several extensions specific to the Windows platform. The extensions provide printing, a MAPI interface to send email, and an interface to manipulate .INI files, among other things. <a href="/live/annotate?url=http%3a%2f%2fwww%2edu%2eedu%2f%7emschwart%2ftcl%2dtk%2ehtm">Edit</a> <i><font size="-1">(October 07, 1999 10:50)</font></i><dt><b><a href="http://www.tcltk.com/iwidgets/" ="">[incr Widgets] Home Page</a></b> <dd>[incr Widgets] is a set of megawidgets (combo boxes, etc.) that are upon the [incr Tcl] object system and the [incr Tk] megawidget framework. This comes bundled with the <a href="http://www.tcltk.com/itcl/">[incr Tcl]</a> distributions. <a href="/live/annotate?url=http%3a%2f%2fwww%2etcltk%2ecom%2fiwidgets%2f">Edit</a> <i><font size="-1">(September 05, 1999 16:08)</font></i><dt><b><a href="http://www1.clearlight.com/~oakley/tcl/combobox/index.html" ="">combobox</a></b> <dd> Author <b><a href="mailto:oakley@channelpoint.com" ="">Bryan Oakley</a></b>, Version <b>1.03</b>, Works with <b>8.x</b> <br>Download: <a href="http://www1.clearlight.com/~oakley/tcl/combobox/combobox.tcl">combobox.tcl</a><br>combobox is a pure-tcl implementation of a combobox widget. It is entirely self contained and does not require any other OO or megawidget extension. It supports both editable and non-editable entries, and provides the ability to call a procedure anytime the value of the combobox changes. <a href="/live/annotate?url=http%3a%2f%2fwww1%2eclearlight%2ecom%2f%7eoakley%2ftcl%2fcombobox%2findex%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:15)</font></i><dt><b><a href="http://www.multimania.com/droche/rnotebook/index.html" ="">Rnotebook</a></b> <dd> Author <b><a href="mailto:dan@lectra.com" ="">Daniel Roche</a></b>, Version <b>1.0</b>, Works with <b>8.0 or higher</b> <br>Download: <a href="http://www.multimania.com/droche/rnotebook/index.html">index.html</a><br>This implements a resizeable notebook widget in pure tcl/tk <a href="/live/annotate?url=http%3a%2f%2fwww%2emultimania%2ecom%2fdroche%2frnotebook%2findex%2ehtml">Edit</a> <i><font size="-1">(August 19, 1999 15:39)</font></i><dt><b><a href="http://www.tregar.com/samdi.html" ="">saMDI v1.0a1 Multi-Document Interface Extension</a></b> <dd>A multi-document interface (MDI) extension for TCL/Tk 8.0. This is a common interface format in Microsoft Windows that lets a parent window contain multiple child windows. In effect you get a window manager inside a window! Uses and includes the STOOOP object-oriented extension by Jean-Luc Fontaine. saMDI v1.0a1 GPL Copyright 1998 Sam Tregar. <a href="/live/annotate?url=http%3a%2f%2fwww%2etregar%2ecom%2fsamdi%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:07)</font></i><dt><b><a href="http://tix.mne.com/htdocs/tix/index.html" ="">Tix Support Site</a></b> <dd> Author <b><a href="mailto:tix@mne.com" ="">Ioi Lam, (adopted by Gregg Squires)</a></b>, Version <b>4.1</b>, Works with <b>Tcl 7.4 through Tcl 8.0</b> <br><a href="ftp://ftp.tix.mne.com/pub/tix/">Download</a>, <a href="ftp://ftp.tix.mne.com/pub/tix/Tix4.1.0.006.tar.gz">Tix4.1.0.006.tar.gz</a>, <a href="ftp://ftp.tix.mne.com/pub/tix/Tix41p6.zip">Tix41p6.zip</a>, <a href="ftp://ftp.tix.mne.com/pub/tix/win41p6bin.zip">win41p6bin.zip</a><br><b>Tix has found a new home!</b> <br> Tix provides over 40 new Tk including the combo box, file selection dialogs, paned widget, notebook, hierarchical list, directory tree, and more. <a href="/live/annotate?url=http%3a%2f%2ftix%2emne%2ecom%2fhtdocs%2ftix%2findex%2ehtml">Edit</a> <i><font size="-1">(August 23, 1999 12:11)</font></i><dt><b><a href="ftp://ftp.archive.eso.org/pub/tree" ="">Tk Tree Widget (C++)</a></b> <dd>Tk Tree widget for Tcl8.0.3. This version contains (optional) support for \[incr Tcl\] and \[incr Tk\] version 3.0. <br> With the tree widget, you can display a tree in a Tk canvas. The nodes can be made up of any number of canvas items or even other Tk widgets. You create the objects that make up a node and the line that connects it to its parent and pass them to the tree widget. After this the tree widget manages the positions of the nodes and end points of the tree lines. Operations are available for inserting, moving and removing nodes and subtrees and for querrying the position of a node in the tree. The tree can be displayed horizontally or vertically. <a href="/live/annotate?url=ftp%3a%2f%2fftp%2earchive%2eeso%2eorg%2fpub%2ftree">Edit</a> <i><font size="-1">(August 25, 1999 03:14)</font></i><dt><b><a href="http://www.purl.org/net/hobbs/tcl/script/widget/" ="">widget, simple megawidget package</a></b> <dd> Author <b><a href="mailto:jeffrey.hobbs@oen.siemens.de" ="">Jeffrey Hobbs</a></b>, Version <b>0.9</b>, Works with <b>Tcl/Tk 8.0 or higher</b> <br>Download: <a href="http://www.purl.org/net/hobbs/tcl/script/widget/widget-0.9.tar.gz">widget-0.9.tar.gz</a><br>This is a package of megawidgets (i.e., compound widgets) that work almost exactly like Tk widgets. You can also build your own new megawidgets. Includes: combobox, hierarchy, console, progressbar, tabnotebook, validating entry, pane geometry manager, baloon help. <a href="/live/annotate?url=http%3a%2f%2fwww%2epurl%2eorg%2fnet%2fhobbs%2ftcl%2fscript%2fwidget%2f">Edit</a> <i><font size="-1">(August 23, 1999 12:16)</font></i></dl> <hr><p><center><font size="-1" face="Geneva, Helvetica, Arial"><br><a href="#TOP"><b>Top</b></a><br><!-- key ResourceSoftwareExtensions --><a href="/">Home</a> | <a href="/products/">Products</a> | <a href="/customers/">Customers</a> | <a href="/partners/">Partners</a> | <a href="/services/">Services</a> | <a href="/resource/">Tcl Resources</a> | <a href="/company/">Company</a> <br><a href="/live/keyword">Search</a> | <a href="/live/map">Site Map</a> | <a href="/company/feedback.html?url=%2fresource%2fsoftware%2fextensions%2ftk%2f">Feedback</a> | <a href="/company/contact.html">Contact Us</a> | <a href="mailto:info@scriptics.com">info@scriptics.com</a> <SCRIPT LANGUAGE="Javascript"> <!-- browser = (((navigator.appName == "Netscape") &&(parseInt(navigator.appVersion) >= 3 )) || ((navigator.appName =="Microsoft Internet Explorer") && (parseInt(navigator.appVersion) >= 4 ))) if ( browser ) { over = new MakeImageArray(10) over[0].src = "http://images.scriptics.com/images/ProductsMouseOff.gif" over[1].src = "http://images.scriptics.com/images/CustomersMouseOff.gif" over[2].src = "http://images.scriptics.com/images/PartnersMouseOff.gif" over[3].src = "http://images.scriptics.com/images/ServicesMouseOff.gif" over[4].src = "http://images.scriptics.com/images/ResourceMouseOff.gif" over[5].src = "http://images.scriptics.com/images/CompanyMouseOff.gif" over[6].src = "http://images.scriptics.com/images/homeMainRollover1.gif" over[7].src = "http://images.scriptics.com/images/homeMainRollover2.gif" over[8].src = "http://images.scriptics.com/images/homeMainRollover3.gif" over[9].src = "http://images.scriptics.com/images/homeMainRollover3.gif" } function MakeImageArray(n) { this.length = n for (var i = 0; i<=n; i++)="i++)" {="{" this[i]="this[i]" ="" new="new" Image()="Image()" }="}" return="return" this="this" }="}" //="//" --="--"> </SCRIPT><br> <font size="2"> &copy; 1998-2000 Scriptics Corporation. All rights reserved. <a href="/legal_notice.html">Legal Notice</a> | <A href="" /privacy.html="/privacy.html"> Privacy Statement</a> </td></tr></table></td></tr></table> </Body> </Html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image1�����������������������������������������������������������������000644 �000765 �000000 �00000021443 07504443347 017351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a<�!�̙̙f̙3̙̙f̙f3fff3ff3ffff3fff333f3f33333������f3�̙f3�f3�ffffff3f�3333f333�����f�3��f3�f3�̙̙̙̙�ffffff3f�3333f333�����f�3��̙f3�3��ff̙ff�33̙33f333���̙��f�3��fffff! NETSCAPE2.0���!d�!�,����<���  ľ˯Ԓ λƫ݇ӄTG`{  -wR9CBaH/fVxQM גDmP-q^Y -}%$4Ol`@(4lة[>*}V">*]G`{tɻށ �AV$4D/|l Ṷ,lt}'xXǥ,ԣʾf^ x|Ӝ^gs2FbBc}8`uOޮ2;E]?^z,ov{LVvw3N'Jp_&Hmҁjh} 釠1 3kE VExi�$boYxXI~.`$a5&0B,bݽhcs#}IJ dե >n VwEg2&f]РI`YT8iɣ1W!c*2hzkBb7!^*NNmH-x&=c#ڜf`m&Vg.9k@ǩH&)UP*-S^֎j,tV/E dfq^<iE[.,k,Jkh˾GE9Y@ >Eq.> )J0<}\W b1aXNb1ՒJ҃Ge*1�ԯSĖH,@_V*,j3^myT+oh{r%k.Dc~mhxg%ub"#v UD־U]ROwSYcpqΖ ӏs?&ĹĮ)XC$2pMyfٌPؒuxnCⲧ-v"ʷ*$o'!oΧeJ=F^{l$?]|LJך+RATd!1PXc`ǓL(0#6 A]@?`\A jbP{ڄra!%<HGP$la#l>! 18ߧ-񉪈Ny1"u^p` G81hL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz6 (GIRL*WV򕰌,gIZ̥.w^ 0)@��!�!�,���'�� ! !! ‰̼ˣł͐ Ɉۣڡ܍ʃޠ⧯=KS\v#6 LUd#_m2dPrL,Z/ QV5>J[:ԙ3,EVjGҳI)RqFt!SU&,'_ӊ s5O`ijjY[vݳ6W~</S{aߓ)عPŠ\׮Ϣ^X!1}ȷa]ᩋ]9s{5>:܁w중~3n;,L}wil 9,m]fm#QGwQYR5NbWA&ރe%!q6Ty`$�?m*5vccA&3$KuBX׃ fߑĈa-c[@^Qßeoy`lؤ9�)ip!㨓)bjB((ycUYdf|YZ6fPJf)VY-XH +jG*W:ޭn檟*vڨ@z`ZFT.ˤ+F(l ꤫[IlL a kkZlF̤K%uU #l&,7.V߉_ U(v#+ỉN+RR�洞+Z-=9K*Z`.6SM;uPgIjwN};vI~5pYz3h.u;ua'Kvm/Sv9gzW9Xܬ/Xx#y# d{; ۗN(<Cq ,<;y⬏|l͹ScMw8Ή˘MIWr@Y,p;@��!�!�,��9��� qa@@;(A :dGQ⯎�HH$^ m\#/&/" VJ"e K'&"*K 52u45SCW5$ ]U'4 �LE1) 7 t-v!ź7\.DX6>ʽbz=p΍={ݪ62�Hճ UxYJ7[1!#e bx؈1QːA#x9= /1օWllj^O+HBr:9wf q "{kx~| bp|ޅpea$qyh9UT!160[v=XdVu<kƥ5r+xNɡb"Y"tcZ 6$tW~/r d]Zxl'w#x) YT$ U!d\6Di`< }`% mꤠ=jh֒ol/%ߓ'⺗ SL"V!"jc!kwV}G_B6'y_uz$"ziMvƫ?UkaW\xǬ#Fp-ޚ8"N7'k{JzWuւK(|:g&F|LwP)[,WZ."'s(Ȏ-\,K*(?3ү!l`h1[{\odȽ:EZ뭒E9]up: + gl*dJC#!8[z2(Vʹl2?S226/,KMko<n`3?ƵV߆x5d3:r^Q_fGgvtAiGoDJm]w͔&u] a=V{_~GaXH⫵A[>'7=KC O ѬgCN5kxڃvupnrk袗Aq#X�4vD5 /3ߏb=%17"l&NCDA0Q0bS26ɫ61`ՔѱcT*!GCQ ?EbENΡIZj!&7q;8NAIRL*WV򕰌,gIZ̥.w^ 0Ib�!P�!�, ��:����M   τ ŵ �~+ЎC- @+7JÇ#*w`BS5 8JI$%:BC|lRr4ɳOA ^X`vv6�gN ,,IȢ3ǡnUj�hCm}esd-HU˷o:(iҺw-ͯ^vp(܆  Cv2BpV8�g6{:LK\lID X`SzA+^�س'B>v`\ ӫVhzKH`$ w\sWeRy4brh'yA!'h�bo㕆p6(@T 1#7} 6xwY 3(,jt,heIVY΀ K (VH!h%H?b" #$Cg dbty'T⑉ X}Ф`Pg|"XcR)gUj>đ�\*:%&pƔ}U9㲃IʙͶ+0F-�C:W_z+Έ"0;Y6AGZ{ AseL%C,xzz+T dadM`�x >¡x)̮! A{L0z6�cB$>HizV&�2SX! MvM;z1yB>@:HqFS:!�LjAJ00٢L D!h`aݣwҔuGnvf7CSn{.'ctZk3_"3wǸhثBԪWS𿯓6C04{9xT.SoXN65aw0`߃$ĸ(~/ƅ DJk.K24 �$J=^v);dnIRs Q�>4W`2( (:qyoV#71�咨J[aؠ/zoM|;̓w8`V9�J�`4*e�lQ5 2b! )Ş5:mtˤ9VvF # P�Or>4A0۶&$˓4IIP2yacxp8CREN:Hc-ɉe@9#/d8^c\N6D|o:WcFrDtLBP}&Јw*v PעdSF(HZt(16?)g7S=A%'|0M7Otn:K D*K*OR1M$՛H7;oh I$e n\WI TE0R󍴲DHՒ\*VWJ󬀍(ҁDҭTw8A�``%k`kg!hXKDv Hq(@VNv%a>+I P8d``�l'/&kWmՊüb�nI=[nILo2҈RT0@+vaK(Bb.^Z~-͍+uL]R)LA*\6A@ě![%5aNnZ Ȧu0ʼn{H]NM8ގ촚L��!P�!�,b���$��!       ƫ Ѩͣړϧℰµ ؇ !hmG@^`;ՌW'Ih&d@9Gqʜ_rP"(W_r=Bva(B5U,xUH.52yrUP$T (!z"f\ūa֙[5Iz!ղVo& bNG[Wя~&lګ 7v}0x aּ!FKg OxlkGYBhaʼn_U(тFZ^aAAMMffswA| r٪CBS/y@I˛ G1BJ~REZfMWǭCt[WxY!DN'If#mA*qʀ^Ϭ߂ias/2L21s^}%0Y#?2H/DӚNԕߐiDuO5IIeYSuW[<q qd2^"⃔+6q:z eA$H/tآP%-ʨm~deTc5.NcI"-x*3d+0ŒғyP+'U`"g}襣>6W( wmiFeY`9*g "uj DBke&@;,\'lK*0-rlZ$ׂwLJ7.ȕ`'(Ob%��!�!�,��:���!!     ! !ĥ ! ăͯ܋ȷ؜݄T2d&08W"mx)VH%R% 1ڽWBIڻ`I2BMV@ӅbiQe_jrLV-X<w ^3H4 +l˸?puu*+ٳΒVT �!�!�, ��:��� � Ý ʲǼؖɵ ��p �%k1e HEVlbx A zS\Hqp[@ ILYG] 79ի<]*Ff=b]˶e@"5F0c\٪,8 LX|)Ҧ؆(ŤL2Ie k\xSgmzpgW]Ag,c0<<M=H<Bh{ȓ4=1qƥӸD;MZDq 5=HO9~>O>3yeΓӕe'VD% 0xuB9eKN><dQ l (b(݆1UTWXOLmZQ)V`X#c'7IPXchzSP-xq ;F)#sa<Lx_9O<ĩuj!hiϚ^y$d^K9`i|;xRv*蠄j(i&|6裐F*餔Vj饒*i+n駠~Ljꩨꪬ@n*)b 뮼 ĖRk@;lЂr,Q 4k>L;P؆+nrk%Z[F"=+ ;Ⱥ"aHzJŒЈ'7x#*R[qr<*ɇLZ+;KZ-$X1 V�ȸ>('-8nqŬny&t?8?M�`tH+X0:%C^- ƪl?cQUم3H-~HP,պY7A�H, goLrLp&@�=…u,y9mlH,'W8k�m:�M4P6�`-:Jf@ >{4 ;YcMof!C?�[{"3q�|�7Z d7smLKgG"�p 9c67Тz mOWA]p!0;iqHd-0Dp]s�hX G=u##ЃR;_?>B q4#X] aiC_!DC2s""FDĭwlc(eFq|P�~ ,$Ͱlh+J3RBDB\!e8F?Q,6o&Pgʋ3x!dz)�Z@`z�,oHMPlc(gAoe2q#:sU֞p?q%C3,|7c))/jM 1pp-t2ZHEW X6wȋ&ʢe'IK4J_1^T2J?U]T/ ?& !\ Dd6'2B@#[R5U� ʘF ] ?~= &7}`$d)\Gfص?Bs�>*uVb{ kB[k1kj(EV75hJ:x[R:[v;TK鎪UͮvWUZB S xKֻMz/!�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image10����������������������������������������������������������������000644 �000765 �000000 �00000006027 07504443347 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87a2�2���LZTlvt4><~|lfdLBDTjdԤt|,.,<NL\Z\Ą4.4|vt4FD¼LNL쌚lnll~t\b\464\VTTb\djlDFD䬶tvt|¼LVT|rt<64TZTD>D$64DVTtnldbd$&$Ԕ\jd||DNL|~|TRT<><LJLܤ<FDLRL4:4DJDtztƼ,64,*,\ndL^\lzt䄂ljlLFDܜdrl줮t~|TVTľt,24\^\|z|lrl\fd<:<T^\trtdfd$*+|DRO<B?<JH<RL424dnlDBD$:4,:4LZ\~lfl̄|v|LNTԜ\bd46<\V\TbdDFLtv||<6<TZ\tnt\jl||~ܼ̔LRT4:<DJLtz|䴲\nllz|LFL윖\^dlrtdfl,����2�2��� wƨc6A( 4! H/DD!s4GJ"<A >Y.%Hۃ W7!JaEhaJ3<<cɖ-mi+`H1QYQ#B:-QFs>A%(qO3[&jPC-hyTKE[eҽD{܆6dn ܛ1bB*cedezU[=*WM3!>UaO !X]ZrdBJЂϿzY ZV3iqI${%XRB`bܡeCB&S?+P >tB/?\-. <71 0N0+XBD�mtGG�' +#O0PF %9$ )"Mp<8) sݠE*J#D?*93:4L7LNI 3 3@h ! (L09%Ұ9 G< v0 qdCQ /<DL@gNdAl O L�PkD<L*2)8( N[#8N k4)`QP(C$.$zF4 s7_=# <Szi0S<q&㜡jd9M$OHzA:HX1.)3gX/d S,5$ (` G|f 3J.B.ZtAБH4|C9ެ; +d0#YZS( S96P4\# w;I/7(Md'^qmͪß| )f,[րZś$A(OrTo :Љn@Fa,2D:*6Q_�rQs UD#y V(M&IE* *dndB o"y4``Z1!1ChD&/Mc4 `ARp M*1ĖA<HrPn0Ff-GG6p-j`L0$h {I+ _\7HFr X j*0=TlT<X ] HaX1=DI=@rzO`܆�*e kDB0)@{-vǶrd<�' S, "Ѕ` !z-85�*b晁uO)[8G % 0<@B wXw`8 x\)6QEeD c�n-( U(a,tADF8> #A ` S`!h*JM�ZS}&Sl 4q#9`E,Ğ, #xVcЇO|nP"�)bVa &P F1A~CXg>lu a'IqQhPG1ִ`0Vq :02UD8�s`) d_Db@-&6 N+6P 84pIs]8Ql g`K#8B b'hE+)Z`X^$V[,4h'#u#:P�`p;% xa`coAJf`& hG8GX`H:\F`# \`}"ф"6%HXIp4p=D*@HJ�V@ll4 Mh~il܀7A$՚# hLL# F9hfl(-$hF$f*O@ u a8 H8�")h)`{17 1G8.a BE'4�+l/` IpQG!%F']DyC" ` E V�f?a6}'`AX9(^q~J *PDˡ (1X 0S4P[*RY$CMa(.&rN8C颹Hzh=(T*H�0ޏ$!=&bu"$;db@$ro.J wqg,\A|�#bCDؗ= 3}�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image11����������������������������������������������������������������000644 �000765 �000000 �00000002621 07504443347 017427� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aK�7��� ?6WHBL*'vha̤pH8k`1)&n8)nYOdoȯ@DtQE%RQxn_TOH94���!Made with GIMP�! ��,����K�7�@'di)dFXhm߸h=Pcb8A'GY"AcE8HDAɮW&,σV=u8ӱh4>  CD -nnpSu" 7ML 0hNBMztU3"n`d,/HO2: 3tLoqIJp L 2}7Pr� A3#nq0 `YHHA` QEGp iAaȁyтZd$W,2 *氰bzha3t+N=mpHpe<{P�ݻxݻ7 |2`'(:@r9V "##I ^ AR:kx \0#BfC$9hi‘kQ]pQ'rڳA @pd%*�XƊi;|-:2BQAJUc&@@�k2,jx0T@6(�M.=9(OV+XzWաIpB0kH@4=JX>N"$z/"tA)`7 o hM|HZH8G qQA@5w *pf- ] Y�YKgM<8v)cAm�(&]#Ϭ ?o,@DHQD 7*(pA�JGxA3ɭseEDGRəKՒpn5І 0C`#ܖ[`iՆ9 t\ /o,=A�"Ɲr+2!CQgȚ3bm@lTGx$AjFLb�G /$C$1-Y ~: ]�9!##3 Vc9^8=q[Np'x@5Lzh@U[r2zY:aO"|8Q.m'=)aDiS� a9) l!J CG1q_;rE<hKSx%$( Uy"#8LjfT6"e#6P(!I3ذBQ`da">?y@ȑ>IG>� `4d86gk4ruKK?6C03~a'Q�Ԡ,7 X"Ef*2�;���������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image12����������������������������������������������������������������000644 �000765 �000000 �00000004644 07504443347 017437� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aP�F���氰vusddb||ymmkFDB$"" 1,)MLKUTS><;840]\Z"~~|!Made with GIMP�! � �,����P�F�@@pH,Ȥr$2%ˆԈԢ` +p1,2jP6W4{hg [BU zQ_^�UR C G MD �B�hB  ittCi_ܩ޲B�i~C�؀<z5H]< "΂ŋEh/aG a0!A :((p;0f8ȱ�8�JA|q< `@H&@BJ& 3͚rBX_*jhv;Wp)P[/hZ@ڄÇuY^Vz%aX)", �aq:`P!XRqoB(xT`~MTXP!.x}VEP@a Lh0a�nN � `߄HeK \+]h!E>pVZ m1L"_hbC1A\,Vx aC4E49&-t@! d)}\L21$<4ѓPN`@eXfnA4xQ,iL_ٔӚ7@YD8 @Tb 1c@SVPp&FGbdZf]:٦lAV/5驨@SXpR-,# J\s@sB[@!Ry^'yZ^-q9l,Pt݂&2h lYgq,E'Q@}l&$ zš&d�Uv,Nu!'8ցoFNpW (Me�0,a5.P0J+JlL\ 0AWNO">|# ݺQ|WmyyQ)HH;Bgvjh@sDts,EUE'= hb7Z%D >Qع$PkQY׈[la;0u�Ѐzf`95>Wo=TTz(P@z|jl6@�|_SH>c׀mBP#uOrY:%/�<QQߚFY8�O5!jPUZ]1@7Mۛ^bE\ !@�AH* `j.xQ��QH-qffB >Ntb,YlF]qd,]y`Uyѭ!`D)BT Aբ - jB7<0FmQh��ΘDC P )뒁$a&МWr`,uxqZъXsfb:؈?ZATx _  �A[IB& ɰ! V' e'.UK}VL9l =k� d�.#S %/(s4f^"4E p~C  L 2k�jV F&JZ:%Й5t NSЉ` Sa5;;BAf Z4SQc8%v׈ڵ̫)ӏI"(OҔMPj*,18?֖C@�@ntC@+ BXQ\\1(NEK"sbun`v!_WiOҪBw9I#]4�+*NГAಘ-Dt4'q4N ^^Jc.K1 #EYӑa(CB&ҽXxCUTb&&MqOxҾ+i[: Gt(WM)Z6'ϋ1͝PHA<(~0�4=9}ϓR:'ȏ/󝖕b]�Qd3 5Ff ~sp(#8|s2X\Gͧ/%8T\ +\"VH~KP 5`�y aaI�C 6!ͬ.Ct<jLF~Ƭ(QᐉaY,&dDT}l&KD7bFzL9c�E't؆ҷf T�:% ٪N�{ �;��������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image13����������������������������������������������������������������000644 �000765 �000000 �00000007751 07504443347 017442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF87aP�8���t„,BD|ҌJTlƴܰPbd͜|l<2TLEO$$'zľtmtLRTTrDnt紴̄씞\jttvyƄ\Y^447ܜxddhĢ|vt~ʼ̤t~|ĄLKP4&LҐdXlkodù,+/lup4T4Ҭάܾl:D|y}^^b䴶̄|<<AT\\켵̌ƜlbTNl伲ĺܬ~lvdlX`Ƭ| <Z<DDGľޤl~|\dd|جv||ڼ̮\vdΔtƬTjT֬Τľܜt֤|<>TԶ0:<伾|\^|tФlvؤ𬬰ʌlfmxҜܜܰtrvƿ|v|~||TFT,&,TTYԜdV\TMT4.4$$䬞D>DztZdĤD^D̽Ҝ֜̄TvTty̦Ԅ,����P�8���H#f3Kc)KwhqI$(S*g b҄2/Ԑzr^@5g(Tl2es6Q$TI`ˁ\~-'?*g&2FʓuX1Z `Nq:5LD˫Uզ2dxV!@me> )P -8*,*Kb| I\C^R1\$|` E-DZhuȲuJ.-a۰ʟCG̥jxWӌ(+V@Pꘂc<x|ouTCipx*b0+B8D H"L5PcX@4_L|@JWS Jw27=NQ ,@,DI聇%�1yRIqA806wAmTBPxXd"H$ DA�O1NA.�ƨҊT]k T?A?i^: rtQN =U=BLFd O9^ K?fP ԓxo89p9$% PM6L M0@8�.~HPرV%Od1 xLxG=RC݆A$00 e\$L4g0Ӄ.�29�cTLEA1xP� 6^?u ZhA tG&I7F@ l4̘<sC~̇ Mc�L .mM3LAi. oX @R ,L!`1G4yL w {;G;LP]wpxpJ@0#(rCp - w p(G!+RX >.t> ɳA3 ȅ; P"�lhDx@L� ||HIblFb#*$ � 4 gv3\$ KMH@z ΰB.P&0lCn(9*`؀.8rUHM&$(Mc Mf;1 2\d#: :P L(cbTaLx2<J̀ :`i i(13 @  ,p~8쁇U 1aEfp1NJ F") Cl%1MX0~1 h*62av=BTȄ;f *vDB l: Rh)" Nf0X0p3 9 `xF\@U@W#z � . JpOP �{z11&ŇiP./@sN!ސx%aPf,!,=@LJ& =#Pzɚ?Pq1xE488 H�,,[~Dn% :,3bX4Nla̠`{@\@ƒLeP�pE @q?a4M? +^�h3f . B*4cbb2p#8 ¹ O6؜Xq:a"h_v3!X !G!pAL 7�) H p4&%KPX(0ؘ8q)| 8ri < a00/u\D/“e �� XCI;Nd1L% ,�?D�(ƆA ^P=|?o\`)cJcc2"n łs/� <8M`FgNï7Y.@ q a X Pq!- ?0#Hd D ?2уl5`A ?|i=ǚ٘@4\Co Ld*wEFA ՜?8XPR_Kp~pdMÍb; (=a)x3@bh(F .�<7%7(܅K:̴|"sVk `a>Ema0445ށ: q4 5?itz0  0FgSs@V&:t �-w}|\ u Aw 0L�#MT-gǞ~,[ | v3l*D eyPAK~ 0*6`t GzHmeC{hg405ݠg+Um ^7 @M{ESOH\6lʹn C \PpX4~/g ;sg``}`Eesq 0 �HF�Mr ITdpkfH?}kv01¢Hݐ_ ){ MfXC5x` ~@{S{ł u OI mzhEِ ^x 0"İG |5$9t@` װ T,肖'pZ =�UPJ##VI&p =`FrIp`  2Ww%Y?Hnfx�cEtP  Kh%@} k kq`:@�4}@ 5DEZ<2i, xp�dNyhE^=e )i HEI32緌M8U`),_a#UpВ,p i;upT,Mf@脦L Ut97thpPY,Te#0-Y T=p % @ Ud'X-) 0" spnfhO;0<po7a E6=pH.�t" |in=`?`IzY SbRrax/"D`pB~M`^g0 %v/hDeQQ~AS6}դ9}v 'nt ٰ7H̠xhAɃ6`g?/mH04D�b4 `@P:{1i-9 [ n j$F`6P2zw P`3J)ZF2�bj [dD٤V~GڏD<UY퇥b(OT[W:X�;�����������������������saods9/tkhtml1.0/tests/page1/image14����������������������������������������������������������������000644 �000765 �000000 �00000000065 07504443347 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����fd�!Made with GIMP�,�������D�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image2�����������������������������������������������������������������000644 �000765 �000000 �00000000052 07504443347 017343� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����������!����,��������;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image3�����������������������������������������������������������������000644 �000765 �000000 �00000006621 07504443347 017354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aH���  N JEUYXfd13jZU.ww157������������������������������������������������!�� �,����H�@ $di%�p,tmx|p(ZcX8eHZجv[0r xL.# ,`n�t>�> NK?tKyn|;AKa�:^q?e kdprRchg3xgpy *�0nn1*j5T lp nȩhIػSݰpܐh miy9@ѥ(P &v.�>e_*$#,TBmUŲ˗0cʜI͛8sɳϟ*J� Q飸!dZ #^`#z �VC0pM딌 ˆ+U+FB{#raEj`*U2-{ >'ҷF3Bqj ,޽�2 50 3 D  +4 N8� +;gn]n뱟Ito/6}!|5P!W$I\eyiGsnGtHIv($h" b cRsm2ь,R?&0s52F9BP#HTX@� �Hy-7xa `FHڂ 8TF8&ÔܨpY;bs�es'?0~C'� �|,g3hZFgE褟d2&h?DpM,WN5 T./܊ {"t 2تV 80ӲfE侷*%W[. N[׆2%z;ˇ/�`U m_ 8�ƍqgV^S8g6QjBg%um!5_-_m,Vq %W,Wa7_v@ryHR_u[VGԗ9T0@hMJ_5d\>/x|߀%p'x)>G.и44 .Zh;F8r>y4Hp7xJ芒 zd&Zge�mMȸ%{1 iGHxk|=G7�0Q<"h = 0 ־d5Cr Kd_(.CXDJ P=HC(Oہ@Hs# $CT7A@M�1Hj}A)mĩUN vS S).ܗ Y.@05UJr)u!$*!>0T:CW) eO;*B~a_%ĘPJXcBYnP܁*/'cdp�|gzF!Q<d cH0u(2.KZH8V̀%0]M,BIbEbt�f:Ќ47<*ir0o)7;™tMh2,;W87\ l0 ;,KNU�|')Q�4�l �@F'nvt"-FCJM@G;ahM- ^q P6,7Lmi|EUmmМ\5|<#A6kCH!4_BsϿ-L8arp4e;sZ;1d[*)TWRe/GkBB㴺tBpX0$CZXx]Dg ]@XzLʨռ .rƓl(5RʎUrӴV2fT4pKMrܼ9h2IZE*^wuwKɁC`y^ĝ1 =h%˥w#Aw[ࠥZZD 0l� c0j)b6cH#;kDrA,K"MN<[Tݥ0/|Y*%0 <ʀ8�r�J{" ܒA:Ѐѥʇ1O{_rԲ>\ n =g@K{P6ؠZb`rO|uD�ÀJ2v:tyW8Q3:U >*5S1oIˮ 4fv"I.$E % æ2!?T.t @Ugn#_^wHqfAƒ0{IN] 7C'A,=$šL-H-2Iua W o)F%w)H#;ZRDq޵#[/GT"=rkFBn!ZDuc $ ԊoR.э.8�<PÂ?Gs\ˋ6o9Omtd%b_ 6oȩ9\o[k*\p$go硐 "^%>alvq!|څ"I?,,@"mWG)nTa oˠX<^!$˓}SS$ p?}9ZϾdSzo~Kg_7 i!_~ le6� u�9xTLHVL7 ؀ 5H1P4wDŽ d,#1H^(\,؂.0284-a%CqX742cZ@.Bx7v"1[BӀ.1DW|/86CM \q/h$a1/a/!0W1mo(,X 0v؇ @ E-� Z Z(UphaY!%@ }H&щ<hѴ0 MI1?�51S KUIXk2$2G#1P�@EZs1-Xc##HaR<4F\15ZsS fcaRwsSEeHX;#^ UV~sVUPc9 E l2a�)4\1Txe22me9#31s3q [;xR>2GSNMǡZ< Tq5`Zjk2W5Cl3r5CXtVs15ZA %8>N!aQ�2 yX%Q�5aYy^Z: ' 4/HPT#ӓlR!TE)65tŔZ%2b9PQa5b8j1Ok!QcZ'Rn!W1ia+A�{I5`s1(,,T �I2Qs%}u3)dQI!] rR5Ř+yhђaPa(u+9-51/Yٟ�:Zzj!��;���������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image4�����������������������������������������������������������������000644 �000765 �000000 �00000003704 07504443347 017354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a<�F���UMy8JIi{{ٻ霜''&''MUToiit:.<667^\u6( GD=xxz'yפĤzٸh T\F ;;seѕ ՜ sO Y DgwknenYWZ=Ƌ hJ0khLvI9I������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!Made with GIMP�! �@�,����<�F�@@�  ,-(#$$)$%$",+ ƃ+ 55 Īǒ+ګƋ2$ #*,!E ٫ǠC,16!bƅ 2<B8#E.N^;dt…!p`0 "pYHU iĤF:jլM r#Df*uط@ 0B6C/H5J t a lcn r hA_(Qܽ-*UhrD>}zQC. '5#P  tCB 7rl!t 7}v H<RdpA`pٗ}T AaqS@,( I 2(f$`" HQx L!%� HTARb≅ȥ! oW/@'(�.%AuQI3a5HϤe/+4 JVfto&q0Pif%+BLdN4r]Vl5TS"X6Lv,L@w *h "\/TQ'�<iT8,B*TAKB4@GjTvE9ë. 蓰&'{F.@QaTDp <� 8@3�F U1t ۍPIŀ)|ͷrʈy+UH.=mcO9+I\F" 894!Z* E_]HZ45!)*PJYX ] ZHd � �"]grQ%U*)%-H^'ȂK-`+ ~c`/-�O/d-Hp2� B g<^^s6@ KVo A'79�Z8@D 7-f$@TԘU@W?ɪ4%!?@>g YT�L`T` a!M +\NQȭu+ cZAF֊ `Р&)++6A $Sޙ44*R{uZE&~J5`@cԻ~N8?LӪJp+~N6h ӺWHEFqAp Ȁ<9"t aQ�%�&k3AoED �Ɇ�%2 ld$3LvK!O[ޡEsq]0pa& TcOJXkaK$ 0@6Z6#-A&`k4p 2Ȅ � xaD@�H32  d(K@ @�?Ċg? }(D% Dd$DɨB3qR&'-PRT -h4& RF ]+X K9hOILTh%cTJJChOQE*45Hr`-D ��;������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image5�����������������������������������������������������������������000644 �000765 �000000 �00000001715 07504443347 017355� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a"�,���5 t`Vǵ{rӹrhZZ@7ܯ:M/)~nfdOFӊR0R ½rg¹~v������������������������������������������������������������������������������������������������!Made with GIMP�! � �,����"�,�@@pH, ҨAT#BNRH B!4RB�#>VdL2Rh y`aOBH wmbbP[  fvTKHqW GsVO| MZzgp   oK] gN~ � IDG@�s{0a25641b,*10l@Ó�T Щ'"&H16$·OO488gMN &AN &3&Y4VY0%ΑJӤ @gt "`B=f|&(J94Nxp@@� ܰ BA"kV> �'CVe+}0Hȕ+H{EtVʹ8 yIWPz �$)o%(H 2QPaM!@D0 $jN'S ,pfNxl� 0P$x|0GTb5b|] @Vu q�.UN0fxA�lt<�:), dtQ�%TX'h|Doё$PKOcSဓR *t5=Q@Yq(t@4<g" ?$:>@@,֪� J�әim%�;���������������������������������������������������saods9/tkhtml1.0/tests/page1/image6�����������������������������������������������������������������000644 �000765 �000000 �00000004210 07504443347 017347� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aP�=���香ʷ:8YP:+Q~mzx~_We@JEWhgn(&L';R7HxxꙘə, ))88XW?ihȇ̩:PHH)(YXghzz版''IJ99da :;~|*)U$%H!Made with GIMP�! �?�,����P�=�@pH,:ШtJE, ämH$\!;nLYN6ł@' fu0]e[b]\4$$!uqst''./! $#402++,-&8C/�� '%:5##!/.r'-+2 l)-pr ./%)Ϣ51:,&&88 F/:-!t-!!)1jZ%9wyhD Z<&((``F`hXqZ :CA"lJ.$- <pУHcd.RBΞX�T(Q4P@"ADL &@x�@& "a� S��Nn*aQ5j!E$ )�%(AoACf`Q)_D*Q �l`!Æ f:>Ԩ VC<1:eB iUY[˘oΟp :GBA@ 2 FS Rv{Dp W;y$7422#nB xֈ%r"Hr$L�w4Y� !<?% x!!Vvae _Z!_i� DLړ�VgW7 I8$C 09c0lP5JDL?UPuf tfo�1DЁ͍92`QDvS~C@%#9@#lD2-8nq*i#pV=j)pʄP Id ` Lq+�ðG1GVܥ[.s( H Щ<y\M3VF (YO-(Եp : 6,-BcdNIH1,@"#K0 su?%'#rN Wu[e/D %Q5cBY:E :D[eQG�[@ӌٶúcHkߵ4^`KyXm^O=#0æ_50xP$@V`bVaN]Xe2&x7?ź�F߫VL{RF]!�"PBq|sȄ0'ma AIX`1I5H�p�f� ^Lsk4C/]A)JTx^_U'A,J?JT,&` Q>HBbr<'0!T-pe3RqAA{A _&= f5Ӥ (� h2JhS`y6 $�lRKqy @AK&K X@p|@ RŢh`rўxd 'Pƈ:ji�A%5K/U.AYVv `^w T3TK�ТA:OAٔ[6 ,䠾 ` "Q:0J‰I,dWOi#% % ,T)I]3=`dsсW m8dP. W#ҹ�iR GM�#.9lc;Z}(A x@KBzgRv * 1f@a [> 씜 5T � p�ɠj&X<l+Hb/T)rjLm$ (*P@G6pO@N,`(I V!s(ʰJ! QR P|D9Pˋ2)sDnh7 #]O+ѷɀ"X%e )f9FsCLM $!<q&n;6 7}*|@11$ XdcTJAwuD=K"p�O��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image7�����������������������������������������������������������������000644 �000765 �000000 �00000003746 07504443347 017365� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aW�@���"."+<*???4J2>X;KKJRUQ__^LkHYwUfkapxnjh|zzj�Vkž!���,����W�@��pH,Ȥr8P!G"XzZw<GT𸼜w%^vry|O^  ]NoW�\{ νҎ ݚ Wz\ ۱ [W&Pf`F} q{q_AuepA `bX2DqeY+ q `z NuėZ.|*Yţ6pphQae=XNx*pp1p`тt5LqAoM`,4Æ2xT&VWC5 ܢmЖ2XBtK bj`@U |K,lG x Wk.<snpݳVF45lwEBT\:[mGoչgqg-6xbE�`=a||ZqpaVJ~1]{ƥZѡba] U@|]6bN—Fcn{!ioYpH5Z1SXLb]0"xF!y _XP!ObJe&RC>]mVY(XBgz|Y%h:%@FXz ljbŴ j(ZACL>"t.l^Hloe<uZlrѺ>>$C&pTM$hLH5{%YB8a0GeZY{A,] aD�а8k 7`D敟ytP0CBUڨ ]~ZvI[8C3a"o*=D5|O%h e3]0M' pҮ-ڍh{!bԔ׌^nLRڈa)T^9*gMn646C~01Ѐ{3pgF!N:4v{-5C{ YmfJܝz;&Hr3%|򙥱fV3;>}'PIYzdruB?Q?NVY$ l4x~9hNѾՋ^6~84X#63l@1^bQC4@KU fC̈ ` qV5ѻMH@! |Fٸ=HJ麇)iC� YBNo1"gnwD+9iDkT`+ m(o(E$�F L r; )Bk%j"C}j g8wO0rzA� Z/rE)#'Yą-o)�.gy+P@0)/#K��69iNج8)^ 8b| uIzړ >Ot!TT *)u s ,`YK):m 0Pƈ<< L`8 PҚP7ͩNwәGX)4p <�1LԦ:P*Tӏ(3*Q)00` XJֲh5+#P c<*9+׾ l` r#Nh\5p Td'KZcFAD*1"j+*iֺ0fkZbl_j9Պo=nL VtKZؕ1\ xK ܅@��;��������������������������saods9/tkhtml1.0/tests/page1/image8�����������������������������������������������������������������000644 �000765 �000000 �00000002242 07504443347 017354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aI�;����զid`g:0 ['ڷ}z@Ή_853Uޟ1 ������������������������������!���,����I�;�@`$di.Elp\:@3c0I4Z�bH$x`L x@Y%DUһ=be�IKLha;a-G X} _`a�44)6739P" I tN"4,b&3:c>v-8@wS0(4צv%*9<;xW~^>aJpI0\=V𹅋;B lϢ\Ƶ@aC/_vv@-!D(u< AkGOH܌T4ShQ> TDQ2)EOPu+;kT:h@$JVw`KFm`xLlbpdjD:P@رǔF @)Eof-.(] =j"4xJPF&l`+ kIiaW }ۏ^ҬC&딌g/5s V@P\׋sʌ�'B Y M 43 (ab�C{3Xu!VZiF(A DBJV>`ӟ4"8 @ # $5dC36hE H`MTh]s Lab]heX4t _G( _1er^G#pX=FU Q&1ALJ̣$Џ@ dCsk(<_L9Cc2C`@Ӏ�6/4 G'cˡKzAH1ܺyDRE˹In86,hp \~GU@@K,72 vQ aY3�$pTn̅P!w4.F@]86""נ7 RZ=!:HU+MÌc<H&O3JJQI$+ԡ"Q ZW 4�@(b~M$52&p8B1Lg<@5Nߡ- kTqVCêfCB998 kxsǺfUA5.s|v{ܤ`6>B�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/image9�����������������������������������������������������������������000644 �000765 �000000 �00000000213 07504443347 017351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a ����FRTz2fd̊Zro!Made with GIMP�! ��,���� � �@&)9`GIl%'YER7 0�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tests/page1/index.html�������������������������������������������������������������000644 �000765 �000000 �00000102706 07504443346 020261� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<HTML><HEAD><TITLE>Slashdot:News for Nerds. Stuff that Matters.</TITLE> </HEAD> <BODY bgcolor="#000000" text="#000000" link="#006666" vlink="#000000"> <center><a href="http://209.207.224.220/redir.pl?1463" target="_top"><img src="image1" alt="Click Here to enter the Sweepstakes" border="2" width="468" height="60"></a></center> <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD WIDTH="1"><SCRIPT LANGUAGE="JAVASCRIPT"> <!-- now="now" ="" new="new" Date();="Date();" tail="tail" ="" now.getTime();="now.getTime();" document.write("<IMG="document.write("<IMG" SRC="http://209.207.224.245/Slashdot/pc.gif?/slashhead.inc,"+" tail="tail" +="+" "=""" WIDTH="1" HEIGHT="1><BR>");" --> </SCRIPT> <NOSCRIPT> <IMG SRC="image2" WIDTH="1" HEIGHT="1"> </NOSCRIPT></TD></TR></TABLE><P> <TABLE bgcolor="#FFFFFF" cellpadding="0" cellspacing="0" border="0" width="99%" align="center"> <TR> <TD valign="top" align="left" valign="top"><A href="http://slashdot.org/"><IMG src="image3" width="275" height="72" border="0" alt="Welcome to Slashdot"></A></TD> <TD><A href="http://slashdot.org/search.pl?topic=linux"><IMG SRC="image4" width="60" height="70" border="0" alt="Linux"></A></TD> <TD><A href="http://slashdot.org/search.pl?topic=news"><IMG SRC="image5" width="34" height="44" border="0" alt="News"></A></TD> <TD><A href="http://slashdot.org/search.pl?topic=usa"><IMG SRC="image6" width="80" height="61" border="0" alt="United States"></A></TD> <TD><A href="http://slashdot.org/search.pl?topic=ed"><IMG SRC="image7" width="87" height="64" border="0" alt="Education"></A></TD> <TD><A href="http://slashdot.org/search.pl?topic=space"><IMG SRC="image8" width="73" height="59" border="0" alt="Space"></A></TD> </TR></TABLE> <TABLE width="99%" align="center" cellpadding="0" cellspacing="0" border="0" bgcolor="#FFFFFF"><TR> <TD valign="top" rowspan="5"><NOBR><FONT size="2"><B> &nbsp;<A href="/faq.shtml">faq</A> <BR> &nbsp;<A href="/code.shtml">code</A> <BR> &nbsp;<A href="/awards.shtml">awards</A> <BR> &nbsp;<A href="http://Andover.Net/privacy.html">privacy</A> <BR> &nbsp;<A href="http://slashnet.org">slashNET</A> <BR> &nbsp;<A href="/search.pl">older stuff</A> <BR> &nbsp;<A href="http://cmdrtaco.net">rob's page</A> <BR> &nbsp;<A href="/users.pl?op=preferences">preferences</A> <BR> &nbsp;<A href="http://Andover.Net">andover.net</A> <BR> &nbsp;<A href="/submit.pl">submit story</A> <BR> &nbsp;<A href="/advertising.shtml">advertising</A> <BR> &nbsp;<A href="/supporters.shtml">supporters</A> <BR> &nbsp;<A href="/pollBooth.pl">past polls</A> <BR> &nbsp;<A href="/topics.shtml">topics</A> <BR> &nbsp;<A href="/about.shtml">about</A> <BR> &nbsp;<A href="/jobs.shtml">jobs</A> <BR> &nbsp;<A href="/hof.shtml">hof</A> </B></FONT></NOBR> <P><TABLE border="0" cellpadding="1" cellspacing="0" align="center" bgcolor="#CCCCCC"><TR> <TD><FONT size="2" color="#000000"><B> Sections</B></FONT></TD></TR> <TR><TD><TABLE border="0" cellspacing="1" cellpadding="1" bgcolor="#FFFFFF" width="100%"><TR><TD><FONT color="#000000" size="2"><NOBR> 1/23<BR> <B><A href="http://slashdot.org/index.pl?section=apache">apache</A></B><BR> 1/29 (3)<BR> <B><A href="http://slashdot.org/index.pl?section=askslashdot">askslashdot</A></B><BR> 1/27<BR> <B><A href="http://slashdot.org/index.pl?section=awards">awards</A></B><BR> 1/29 (2)<BR> <B><A href="http://slashdot.org/index.pl?section=books">books</A></B><BR> 1/27<BR> <B><A href="http://slashdot.org/index.pl?section=bsd">bsd</A></B><BR> 1/28 (2)<BR> <B><A href="http://slashdot.org/index.pl?section=features">features</A></B><BR> 1/28 (2)<BR> <B><A href="http://slashdot.org/index.pl?section=interviews">interviews</A></B><BR> 1/19<BR> <B><A href="http://slashdot.org/index.pl?section=radio">radio</A></B><BR> 1/27 (2)<BR> <B><A href="http://slashdot.org/index.pl?section=science">science</A></B><BR> 1/28 (3)<BR> <B><A href="http://slashdot.org/index.pl?section=yro">yro</A></B><BR> </NOBR></FONT></TD></TR></TABLE><TR> <TD><A href="http://andover.net"><FONT size="2" color="#000000"><B>Andover.Net</B></FONT></A></TD></TR> <TR><TD><TABLE border="0" cellspacing="1" cellpadding="1" bgcolor="#FFFFFF"><TR><TD> <FONT color="#000000" size="2"><NOBR><A href="http://www.andovernews.com">AndoverNews</A><BR><A href="http://www.askreggie.com">Ask Reggie</A><BR><A href="http://www.davecentral.com">DaveCentral</A><BR><A href="http://www.freecode.com">FreeCode</A><BR><A href="http://www.mediabuilder.com">MediaBuilder</A><BR> </NOBR></FONT></TD></TR></TABLE></TD></TR></TABLE></P> <P></P> </TD><TD valign="top" align="left"><FONT color="#000000"> <TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Who Bought Linux.Net?</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=linux"><IMG src="image4" width="60" height="70" border="0" align="right" hspace="20" vspace="10" alt="Linux"></A> <B>Posted by <A href="http://CmdrTaco.net">CmdrTaco</A> on Saturday January 29, @10:52AM</B><BR> <FONT size="2"><B>from the this-game-again dept.</B></FONT><BR> So Fred VanKampen (who has to hold the record for most money made by reselling two domain names) e-mailed us to say that the Domain Name for 'Linux.Net' has been sold. He won't say to whom, but it supposedly will be announced at LinuxWorld next week. Of course we have no idea what he got for the entry, but the rumors were that he made several million when he sold <A href="http://www.linux.com">Linux.com</A> to <A href="http://www.valinux.com">VA Linux</A>. Hopefully he'll take me for a ride in his yacht. ;) <P><B>( </B><A href="http://slashdot.org/articles/00/01/29/0837235.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/29/0837235&mode=thread&threshold=0">58</A> of <A href="http://slashdot.org/article.pl?sid=00/01/29/0837235&mode=thread&threshold=-1">62</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Book Reviews: E-Mails from (Over?) The Edge</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=news"><IMG src="image5" width="34" height="44" border="0" align="right" hspace="20" vspace="10" alt="News"></A> <B>Posted by <A href="http://hemos.net">Hemos</A> on Saturday January 29, @10:43AM</B><BR> <FONT size="2"><B>from the touching-story dept.</B></FONT><BR> I'd like to thank the author of this book for sending it to me. Nick's written a book that's touching and endearing, and one that's well worth reading for everyone who's ever had social struggles to deal with. As well, his involvement with the fine folks of <a href="http://www.thevenue.org">TheVenue</a>. I'll warn you - it's not a tech text. But it's still worth reading. Click below to read more. <P><B>( </B><A href="http://slashdot.org/books/00/01/24/1146250.shtml"><B>Read More...</B></A> | <A href="http://slashdot.org/article.pl?sid=00/01/24/1146250&mode=nocomment">6197 bytes in body</A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/24/1146250&mode=thread&threshold=0">6</A> of <A href="http://slashdot.org/article.pl?sid=00/01/24/1146250&mode=thread&threshold=-1">22</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Linux Kernel 2.3.41</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=linux"><IMG src="image4" width="60" height="70" border="0" align="right" hspace="20" vspace="10" alt="Linux"></A> <B>Posted by <A href="http://CmdrTaco.net">CmdrTaco</A> on Saturday January 29, @10:21AM</B><BR> <FONT size="2"><B>from the download-compile-reboot-repeat dept.</B></FONT><BR> <A href="mailto:bwhitehead@nospam.acm.org">sdriver</A> writes <I>"For those of us who enjoy *panic*, *oops*, and suddenly seeing their video BIOS... the newest version is out! Be the first on your block to submit a new patch! ;) "</I> If you don't know where to get it, you probably should stick to your warm and cuddly 2.2.x kernel *grin*. Now outta my way, I wanna crash my laptop! <P><B>( </B><A href="http://slashdot.org/articles/00/01/29/0834223.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/29/0834223&mode=thread&threshold=0">52</A> of <A href="http://slashdot.org/article.pl?sid=00/01/29/0834223&mode=thread&threshold=-1">57</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Congress Still Figuring Out E-Mail</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=usa"><IMG src="image6" width="80" height="61" border="0" align="right" hspace="20" vspace="10" alt="United States"></A> <B>Posted by <A href="mailto:roblimo@slashdot.org">Roblimo</A> on Saturday January 29, @07:28AM</B><BR> <FONT size="2"><B>from the voice-of-the-people-can-get-awfully-loud dept.</B></FONT><BR> Jett writes <I>" <A href="http://www.vote.com/">Vote.com</A> has <A href="http://www.vote.com/magazine/editorials/editorial1843752.phtml">an interesting article</A> in their Webmag Fifth Estate about how congressmen have responded to the popularity of e-mail in their daily operations. Quote: 'Of the 440 voting and non-voting House of Representatives members, 22 have no e-mail at all. Even House Speaker Dennis Hastert is wired only halfway -- his office receives e-mail, but does not respond to it. And while all U.S. senators have e-mail, they, like their House counterparts, routinely shun non-constituent mail -- even though they chair committees whose decisions affect the entire country.'"</I> <P><B>( </B><A href="http://slashdot.org/articles/00/01/28/2311232.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/28/2311232&mode=thread&threshold=0">66</A> of <A href="http://slashdot.org/article.pl?sid=00/01/28/2311232&mode=thread&threshold=-1">66</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Ask Slashdot: Sci Fi Literature 101?</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=ed"><IMG src="image7" width="87" height="64" border="0" align="right" hspace="20" vspace="10" alt="Education"></A> <B>Posted by <A href="http://exit118.com/">Cliff</A> on Saturday January 29, @06:56AM</B><BR> <FONT size="2"><B>from the recommendations-wanted dept.</B></FONT><BR> ohlaadee asks: <I>"My niece (she's 13) wants to start reading science fiction. I do too. I gave us both Asimov's </I>_The Foundation_<I>&nbsp; for Christmas. We'll read it together. I suppose we could spend the rest of our lives just reading Asimov, but I'm wondering what books and movies you folks would come up with? What does the /. recommended Science Fiction 101 list include?"</I> <P><B>( </B><A href="http://slashdot.org/askslashdot/00/01/22/1946244.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/22/1946244&mode=thread&threshold=0">345</A> of <A href="http://slashdot.org/article.pl?sid=00/01/22/1946244&mode=thread&threshold=-1">345</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Could Distributed.Net Help the Mars Polar Lander?</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=space"><IMG src="image8" width="73" height="59" border="0" align="right" hspace="20" vspace="10" alt="Space"></A> <B>Posted by <A href="mailto:roblimo@slashdot.org">Roblimo</A> on Saturday January 29, @03:35AM</B><BR> <FONT size="2"><B>from the food-for-thought dept.</B></FONT><BR> Anonymous Coward writes <I>"This official JPL <A href="http://mpfwww.jpl.nasa.gov/msp98/news/mpl000127.html">press release</A> describes the current attempt to listen for faint signals from the Mars Lander. They get three windows a day, and it takes 18 hours to process data because the signal is so weak (if it's really there). Too bad they don't have a deal with <A href="http://www.distributed.net"> distributed.net</A>."</I> Interesting thought. Is anyone at distributed.net or JPL interested in pursuing it? <P><B>( </B><A href="http://slashdot.org/articles/00/01/28/2318246.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/28/2318246&mode=thread&threshold=0">99</A> of <A href="http://slashdot.org/article.pl?sid=00/01/28/2318246&mode=thread&threshold=-1">102</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>iCrave TV Loses Battle against U.S. Broadcasters</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=tv"><IMG src="image10" width="50" height="50" border="0" align="right" hspace="20" vspace="10" alt="Television"></A> <B>Posted by <A href="mailto:roblimo@slashdot.org">Roblimo</A> on Saturday January 29, @12:21AM</B><BR> <FONT size="2"><B>from the shut-down-just-before-the-super-bowl dept.</B></FONT><BR> <A href="mailto:doran@brandx.net">Doran</A> writes <I>"C|Net has <a href="http://news.cnet.com/news/0-1004-200-1535528.html">this story</a> about how the Canadian company <a href="http://www.icravetv.com">iCraveTV.com</a> has lost its latest battle in U.S. courts over whether it can rebroadcast TV signals over the Web. The broadcasters say it's theft, while iCraveTV sez it's just doing what's legal for other cable TV companies in Canada (ie. rebroadcasting TV). Of course, by framing the streaming video iCraveTV is doing more than just rebroadcasting, they're also adding more commercial content, which the broadcasters feel dilutes their TV commercials. "</I> <P><B>( </B><A href="http://slashdot.org/articles/00/01/29/0010203.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/29/0010203&mode=thread&threshold=0">152</A> of <A href="http://slashdot.org/article.pl?sid=00/01/29/0010203&mode=thread&threshold=-1">170</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Win2k Security holes found</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=microsoft"><IMG src="image11" width="75" height="55" border="0" align="right" hspace="20" vspace="10" alt="Microsoft"></A> <B>Posted by <A href="mailto:heunique@slashdot.org">HeUnique</A> on Friday January 28, @04:58PM</B><BR> <FONT size="2"><B>from the and-it's-not-even-out-yet dept.</B></FONT><BR> According to a story posted by <a href="http://www.zdnn.com">ZDNN</a>, <a href="http://www.zdnet.com/zdnn/stories/news/0,4586,2429334,00.html?chkpt=zdnntop">two security holes</a> have been found on Windows 2000, and that's even before the official release of Windows 2000! Administrators who rush to incorporate the patch from MS beware - according to one of the talkback posts on ZDNN, the patch creates a new problem with Windows 2000 news server service. <P><B>( </B><A href="http://slashdot.org/articles/00/01/28/1653228.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/28/1653228&mode=thread&threshold=0">510</A> of <A href="http://slashdot.org/article.pl?sid=00/01/28/1653228&mode=thread&threshold=-1">534</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Encryption Debate at Mitnick Trial</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=encryption"><IMG src="image12" width="80" height="70" border="0" align="right" hspace="20" vspace="10" alt="Encryption"></A> <B>Posted by <A href="http://hemos.net">Hemos</A> on Friday January 28, @03:33PM</B><BR> <FONT size="2"><B>from the gimmie-the-data dept.</B></FONT><BR> A number of people have written about <A HREF="http://nytimes.com/library/tech/00/01/cyber/cyberlaw/28law.html">the latest twist</a> in the Mitnick case. Kevin wants to get his data back, but the government is refusing to do so until he gives them the key. Apparently, the government is unable to crack the encryption that he's got on it - you'd think after having the data for five years, they'd be able to brute-force the darn thing. It's a NYT article - free login required. <P><B>( </B><A href="http://slashdot.org/articles/00/01/28/1320253.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/28/1320253&mode=thread&threshold=0">504</A> of <A href="http://slashdot.org/article.pl?sid=00/01/28/1320253&mode=thread&threshold=-1">521</A> </B>comments <B>)</B> <P><TABLE width="99%" cellpadding="0" cellspacing="0" border="0"><TR><TD valign="top" bgcolor="#006666"><IMG src="image9" width="13" height="16" alt="" align="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Forum: Future Ports of Games to Linux</B></FONT></TD> </TR></TABLE><A href="http://slashdot.org/search.pl?topic=games"><IMG src="image13" width="80" height="56" border="0" align="right" hspace="20" vspace="10" alt="Games"></A> <B>Posted by <A href="http://CmdrTaco.net">CmdrTaco</A> on Friday January 28, @02:26PM</B><BR> <FONT size="2"><B>from the it's-been-awhile dept.</B></FONT><BR> It's been a long time since I posted an open forum like this, but I'm curious what people think on this one. What games do you most want to see ported to Linux in the next few months? Of course, for me personally it's StarCraft and Diablo 2, but I'm curious what games have come out or are due soon that people would most like to see a port of (and note that WINE doesn't count. ;) <P><B>( </B><A href="http://slashdot.org/articles/00/01/28/1257211.shtml"><B>Read More...</B></A> | <B><A href="http://slashdot.org/article.pl?sid=00/01/28/1257211&mode=thread&threshold=0">648</A> of <A href="http://slashdot.org/article.pl?sid=00/01/28/1257211&mode=thread&threshold=-1">652</A> </B>comments <B>)</B> <P></TD><TD width="210" align="center" valign="top"><TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B><A HREF="/index.pl?section=features"><FONT COLOR="#FFFFFF">Features</FONT></A></B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><A href="/vote.pl">Voting has begun</A> for the $100k <A href="/index.pl?section=awards">Slashdot Beanie Awards</A>. Talk amongst yourselves and choose who deserves the cash. <P>The latest installment of <A href="http://www.thesync.com/geeks">Geeks in Space</A> is up at <A href="http://www.thesync.com">The Sync</A>. Listen to CmdrTaco, Hemos, and Nate talk about the latest events to happen - or not happen in the computer world. <P>Perhaps you are seeking Jon Katz's series of articles related to recent events in Colorado. These articles include <A href="/article.pl?sid=99/04/25/1438249">Voices from the Hellmouth</A>, <A href="/article.pl?sid=99/04/27/0310247">More Stories from the Hellmouth</A> or <A href="/article.pl?sid=99/04/29/0124247">The Price of Being Different</A>, <P>For something different, try reading a little essay <A href="/article.pl?sid=99/03/31/0137221">Thoughts from the Furnace</A> about the internet, and flame. <p> And for a bit of an amusing take on the Open Source world, check out <a href="/article.pl?sid=99/08/24/1327256&mode=thread">Open Source as an Ant Farm</a> <P><B>Update: 01/03 03:10</B> by <B><A href="http://cowboyneal.org">CowboyNeal</a></B>: <P align="right"><B><A href="/features/">Past Features</A></B> <!-- end="end" features="features" block="block" --></FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B><A HREF="http://slashdot.org/index.pl?section=askslashdot"><FONT COLOR="#FFFFFF">Ask Slashdot</FONT></A></B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1946244">Sci Fi Literature 101?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/192226">Linux and Satellite Internet Services</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1843258">Open Defensive Patents?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1825252">Technologies That Shaped the Last Century?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1958212">Disk Repair Tools for Linux?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1955215">Why Can't the Command-Line be More Standardized?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1928235">Packet Radio Networking with PalmOS?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1817211">Cheap Rackmount Enclosures/Systems?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1950249">Open Source Software and Tax Breaks?</A> <li><A HREF="http://slashdot.org/article.pl?sid=00/01/22/1917207">Building an Upgradable Dual Processor System</A> <P> if you have a question for Ask Slashdot, send it to <A href="mailto:askslashdot@slashdot.org">askslashdot@slashdot.org</A></FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B><A HREF="/users.pl"><FONT COLOR="#FFFFFF">Slashdot Login</FONT></A></B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><FORM action="/users.pl" METHOD="POST"> <B>Nickname:</B><BR> <INPUT type="text" name="unickname" size="20" value=""><BR> <B>Password:</B><BR> <INPUT type="hidden" name="returnto" value="index.pl"> <INPUT type="password" name="upasswd" size="20"><BR> <INPUT type="submit" name="op" value="userlogin"> </FORM> Don't have an account yet? <A href="/users.pl">Go Create One</A>. A user account will allow you to customize all these <A href="/cheesyportal.shtml">nutty little boxes</A>, tailor the stories you see, as well as remember your comment viewing preferences.</FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Slashdot Poll</B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><FORM action="http://slashdot.org/pollBooth.pl"> <INPUT type="hidden" name="qid" value="techadvance"> <B>The Tech Advance I Most Want Is:</B><BR><INPUT type="radio" name="aid" value="1">Nanotechnology<BR><INPUT type="radio" name="aid" value="2">Cold Fusion<BR><INPUT type="radio" name="aid" value="3">Powerful Fuel Cells<BR><INPUT type="radio" name="aid" value="4">Hard Wiring my Body<BR><INPUT type="radio" name="aid" value="5">Universal Strong Crypto<BR><INPUT type="radio" name="aid" value="6">Interstellar Travel<BR><INPUT type="radio" name="aid" value="7">Cybernetic Body Armor<BR><INPUT type="radio" name="aid" value="8">ColecoVision<BR><INPUT type="submit" value="Vote"> [ <A href="http://slashdot.org/pollBooth.pl?qid=techadvance&aid=-1"><B>Results</B></A> | <A href="http://slashdot.org/pollBooth.pl?"><B>Polls</B></A> ] <BR>Comments:<B>656</B> | Votes:<B>29121</B></FORM> </FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Older Stuff</B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><P><B><A href="http://slashdot.org/index.pl?section=&issue=730512&mode=thread"><FONT size="4">Friday</FONT></A> January 28</B> <LI><A href="http://slashdot.org/articles/00/01/28/1110258.shtml">Abstract Programming and GPL Enforcement</A> (235) <LI><A href="http://slashdot.org/interviews/00/01/28/1225206.shtml">Interview: FreeDOS Leader Jim Hall Answers</A> (86) <LI><A href="http://slashdot.org/articles/00/01/28/116240.shtml">Open Source's Achilles Heel</A> (466) <LI><A href="http://slashdot.org/features/00/01/26/1915230.shtml">The Virtue of Communal Instincts</A> (237) <LI><A href="http://slashdot.org/articles/00/01/28/0723223.shtml">Gartner Group Debunking Open Source Myths</A> (165) <LI><A href="http://slashdot.org/yro/00/01/28/0917229.shtml">DoubleClick Taken to Court</A> (310) <LI><A href="http://slashdot.org/articles/00/01/28/0718209.shtml">Updated Slash & Server 51</A> (81) <LI><A href="http://slashdot.org/articles/00/01/28/089230.shtml">XMMS 1.0.0 Released</A> (128) <LI><A href="http://slashdot.org/askslashdot/00/01/22/192226.shtml">Linux and Satellite Internet Services</A> (138) <LI><A href="http://slashdot.org/articles/00/01/27/1811221.shtml">UN Wants to Combat Online Racism</A> (531) <P><B><A href="http://slashdot.org/index.pl?section=&issue=730511&mode=thread"><FONT size="4">Thursday</FONT></A> January 27</B> <LI><A href="http://slashdot.org/yro/00/01/27/2330205.shtml">Crackdowns, Fools and the MPAA</A> (351) <LI><A href="http://slashdot.org/articles/00/01/27/0832215.shtml">Heroes of Might and Magic III Demo Released</A> (157) <LI><A href="http://slashdot.org/science/00/01/27/1345241.shtml">Sandia Labs Venture Into Nanotechnology</A> (117) <LI><A href="http://slashdot.org/articles/00/01/27/0931237.shtml">CA Announces Program Ports to Linux</A> (195) <LI><A href="http://slashdot.org/interviews/00/01/27/1118251.shtml">Interview: Larry Augustin Finally Answers</A> (210) <LI><A href="http://slashdot.org/awards/00/01/27/0855252.shtml">Final Call for Voting in Slashdot's Beanie Awards</A> (178) <LI><A href="http://slashdot.org/features/00/01/26/197211.shtml">Transmeta Code Morphing != Just In Time</A> (449) <LI><A href="http://slashdot.org/books/00/01/24/1150256.shtml">Intrusion Detection</A> (65) <LI><A href="http://slashdot.org/science/00/01/27/0824239.shtml">Using Enzymes to Help Fight CO2 Build-Up</A> (165) <LI><A href="http://slashdot.org/articles/00/01/27/0712217.shtml">Jon Johansen on ABC World News Tonight</A> (415) <P align="right"><BR><A href="http://slashdot.org/search.pl?section=&min=30"><B>Older Articles</B></A><BR><A href="http://slashdot.org/index.pl?section=&mode=thread&issue=730512"><B>Yesterday's Edition</B></A> </FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B><A HREF="/index.pl?section=books"><FONT COLOR="#FFFFFF">Book Reviews</FONT></A></B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><p>Jon Katz, Resident Gasbag, has a new, very appropriate book coming out soon, <a href="http://www.thinkgeek.com">Geeks</a>. Preorder now and receive the book early. <p>For probably the best fiction read around, check out Neal Stephenson's <cite><a href="/article.pl?sid=99/06/23/139229&mode=thread">Cryptonomicon</a></cite>, an engaging read about WWII, cryptography and buried treasure. And data vaults. <p>If you've been doing a lot of work in Perl, you've probably figured out you really need <cite><a href="/article.pl?sid=99/05/10/2238254&mode=thread">Perl in a Nutshell</a></cite> or <cite><a href="/article.pl?sid=99/01/29/1035246&mode=thread">The Perl Cookbook</a></cite>. If you're still learning, grab <cite><a href="/books/older/980526096229.shtml">Programming Perl</a></cite>. <p>And if you want to learn more about how to become a better coder, grab <cite><a href="/article.pl?sid=99/06/28/1417229&mode=thread">The Unified Software Development Process</a></cite> or <cite><a href="/article.pl?sid=99/04/08/1512209&mode=thread">The Practice of Programming</cite></a> Additionally, check out <cite><a href="http://slashdot.org/article.pl?sid=99/09/16/1333202&mode=thread">Refactoring: Improving the Design of Existing Code</a></cite> . <p>Developing a large application? Grab Eric Greenberg's excellent <cite><a href="/article.pl?sid=99/07/13/1943258&mode=thread">Network Application Frameworks</cite></a>. <P>Visit <A href="/index.pl?section=books">Our Book Reviews Section</A> for more. <br> <B>Update: 11/12 05:19</B> by <B><A href="mailto:hemos@slashdot.org">H</A></B>:</FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B>Quick Links</B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><B>Cool Sites:</B> <LI><A href="http://www.linux.com">Linux.com</A> (What <B>is</B> Linux?) <LI><A href="http://everything.blockstackers.com">Everything</A> (Blow your Mind) <LI><A href="http://www.geekculture.com/geekycomics/Aftery2k/aftery2kmain.html">After Y2k</A> (<I>This</I> is Post-Apocalyptic?) <LI><A href="http://www.userfriendly.org">User Friendly</A> (Laugh) <LI><A href="http://themes.org">Themes.org</A> (Make X Perty) <P><B>Support Slashdot:</B> <LI><A href="http://www.thinkgeek.com">ThinkGeek</A> (Clothe Yourself in Slashdot) <LI><A href="http://cdnow.com/from=sr-302791">CDnow</A> (Support <A href="http://www.cdnow.com/gift/malda@slashdot.org">Rob's Who Habit</A>) <LI><A href="http://adfu.slashdot.org">Slashdot Advertiser Index</A></FONT></TD> </TR> </TABLE><P> <TABLE cellpadding="1" cellspacing="0" border="0" width="200" align="center"> <TR bgcolor="#006666"> <TD valign="top"><FONT size="4" color="#FFFFFF" face="arial,helvetica"><B><A HREF="http://freshmeat.net"><FONT COLOR="#FFFFFF">Freshmeat</FONT></A></B></FONT></TD> </TR><TR><TD bgcolor="#CCCCCC"><FONT color="#000000" size="2"><P><FONT size="4" color="#006666"><B>January</B></FONT><BR> <LI><A href="http://freshmeat.net/news/2000/01/29/949208399.html">We should get this out of the door now</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949159642.html">Is Linux for Crazies?</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949156343.html">SQN Linux 1.6</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949156277.html">Limo 0.3.2</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949156237.html">Fusion GS 1.3</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949145887.html">MMR 1.5.4</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949142835.html">KUPS 0.3.4</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949142815.html">3DSE patch for XMMS 4</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949139763.html">Linux 2.3.41</A> <LI><A href="http://freshmeat.net/news/2000/01/29/949139751.html">Free Code for Linux S/390</A> <FORM METHOD="post" ACTION="http://core.freshmeat.net/search.php3"> <FONT size="3" color="#006666"><B>Search Freshmeat:</B></FONT><BR> <INPUT TYPE="hidden" NAME="link" VALUE="freshmeat.net"> <INPUT TYPE="text" NAME="query"> </FORM> <P align="right"><A href="http://freshmeat.net"><B>More Meat...</B></A></FONT></TD> </TR> </TABLE><P> </FONT></TD> </TR> </TABLE><TABLE cellpadding="0" cellspacing="0" border="0" width="99%" align="center" bgcolor="ffffff"> <TR> <TD colspan="4" align="center"><IMG src="image14" alt="" width="80%" height="1" hspace="10" vspace="30"></TD> </TR><TR> <TD align="center"><FONT size="2" face="arial,helvetica"> <FORM method="GET" action="http://slashdot.org/search.pl"> <INPUT type="name" name="query" value="" width="20" size="20" length="20"> <INPUT type="submit" value="Search"> </FORM> </FONT> </TD> <TD bgcolor="#ffffff" width="25"> &nbsp; </TD> <TD align="center"> <FONT size="2" face="arial,helvetica"><I>Wasn't there something about a PASCAL programmer knowing the value of everything and the Wirth of nothing? <TD>&nbsp;</TD></I></FONT> </FONT> </TD></TR> <TR><TD colspan="4" align="center"> <FONT size="1" color="#006666" face="arial,helvetica"> All trademarks and copyrights on this page are owned by their respective owners. Comments are owned by the Poster. The Rest 1997-2000 <A href="http://Andover.Net">Andover.Net</A>. </FONT></CENTER> </TD> </TR> </TABLE> <CENTER> <FONT size="2" color="#006666"> [ <A href="http://slashdot.org/"><Font color="#ffffff">home</FONT></A> | <A href="http://slashdot.org/awards.shtml"><Font color="#ffffff">awards</FONT></A> | <A href="http://slashdot.org/supporters.shtml"><FONT color="#ffffff">supporters</FONT></A> | <A href="http://CmdrTaco.net"><FONT color="#ffffff">rob's homepage</FONT></A> | <A href="http://slashdot.org/submit.pl"><FONT color="#ffffff">contribute story</FONT></A> | <A href="http://slashdot.org/search.pl"><FONT color="#ffffff">older articles</FONT></A> | <A href="http://Andover.Net"><FONT color="#ffffff">Andover.Net</FONT></A> | <A href="http://slashdot.org/advertising.shtml"><FONT color="#ffffff">advertising</FONT></A> | <A href="http://slashdot.org/pollBooth.pl"><FONT color="#ffffff">past polls</FONT></A> | <A href="http://slashdot.org/about.shtml"><FONT color="#ffffff">about</FONT></A> | <A href="http://slashdot.org/faq.shtml"><FONT color="#ffffff">faq</FONT></A> ] </FONT> </CENTER> </BODY> </HTML> ����������������������������������������������������������saods9/tkhtml1.0/tclconfig/ChangeLog����������������������������������������������������������������000644 �000765 �000000 �00000106605 12546552047 017652� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tclconfig/install-sh���������������������������������������������������������������000755 �000765 �000000 �00000033054 12546552047 020101� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tclconfig/README.txt���������������������������������������������������������������000644 �000765 �000000 �00000001454 12546552047 017572� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/tclconfig/tcl.m4�������������������������������������������������������������������000644 �000765 �000000 �00000404643 12546571317 017130� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir # i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ���������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/html.h�������������������������������������������������������������������������000644 �000765 �000000 �00000123152 12547243500 016020� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Structures and typedefs used by the HTML widget ** $Revision: 1.3 $ ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ /* ** Debug must be turned on for testing to work. */ #define DEBUG 1 /* ** Sanity checking macros. */ #ifdef DEBUG #define HtmlAssert(X) \ if(!(X)){ \ fprintf(stderr,"Assertion failed on line %d of %s\n",__LINE__,__FILE__); \ } #define HtmlCantHappen \ fprintf(stderr,"Can't happen on line %d of %s\n",__LINE__,__FILE__); #else #define HtmlAssert(X) #define HtmlCantHappen #endif /* ** The TRACE macro is used to print internal information about the ** HTML layout engine during testing and debugging. The amount of ** information printed is governed by a global variable named ** HtmlTraceMask. If bits in the first argument to the TRACE macro ** match any bits in HtmlTraceMask variable, then the trace message ** is printed. ** ** All of this is completely disabled, of course, if the DEBUG macro ** is not defined. */ #ifdef DEBUG # define TRACE_INDENT printf("%*s",HtmlDepth-3,"") # define TRACE(Flag, Args) \ if( (Flag)&HtmlTraceMask ){ \ TRACE_INDENT; printf Args; fflush(stdout); \ } # define TRACE_PUSH(Flag) if( (Flag)&HtmlTraceMask ){ HtmlDepth+=3; } # define TRACE_POP(Flag) if( (Flag)&HtmlTraceMask ){ HtmlDepth-=3; } #else # define TRACE_INDENT # define TRACE(Flag, Args) # define TRACE_PUSH(Flag) # define TRACE_POP(Flag) #endif /* ** Bitmasks for the HtmlTraceMask global variable */ #define HtmlTrace_Table1 0x00000001 #define HtmlTrace_Table2 0x00000002 #define HtmlTrace_Table3 0x00000004 #define HtmlTrace_Table4 0x00000008 #define HtmlTrace_Table5 0x00000010 #define HtmlTrace_Table6 0x00000020 #define HtmlTrace_GetLine 0x00000100 #define HtmlTrace_GetLine2 0x00000200 #define HtmlTrace_FixLine 0x00000400 #define HtmlTrace_BreakMarkup 0x00001000 #define HtmlTrace_Style 0x00002000 #define HtmlTrace_Input1 0x00004000 /* ** Macros to allocate and free memory. */ #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) #define HtmlFree(A) Tcl_Free((char*)(A)) #define HtmlRealloc(A,B) ((void*)Tcl_Realloc((A),(B))) /* ** Various data types. This code is designed to run on a modern ** cached architecture where the CPU runs a lot faster than the ** memory bus. Hence we try to pack as much data into as small a space ** as possible so that it is more likely to fit in cache. The ** extra CPU instruction or two needed to unpack the data is not ** normally an issue since we expect the speed of the memory bus ** to be the limiting factor. */ typedef unsigned char Html_u8; /* 8-bit unsigned integer */ typedef short Html_16; /* 16-bit signed integer */ typedef unsigned short Html_u16; /* 16-bit unsigned integer */ typedef int Html_32; /* 32-bit signed integer */ /* ** An instance of the following structure is used to record style ** information on each Html element. */ struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ } /* ** We allow 8 different font families: Normal, Bold, Italic and ** Bold-Italic in either variable or constant width. ** Within each family there can be up to 7 font sizes from 1 ** (the smallest) up to 7 (the largest). Hence, the widget can use ** a maximum of 56 fonts. The ".font" field of the style is an integer ** between 0 and 55 which indicates which font to use. */ #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define NormalFont(X) (X) #define BoldFont(X) ((X)+N_FONT_SIZE) #define ItalicFont(X) ((X)+2*N_FONT_SIZE) #define CWFont(X) ((X)+4*N_FONT_SIZE) #define FontSize(X) ((X)%N_FONT_SIZE) #define FontFamily(X) (((X)/N_FONT_SIZE)*N_FONT_SIZE) #define FONT_Any -1 #define FONT_Default 3 #define FontSwitch(Size, Bold, Italic, Cw) \ ((Size)+(Bold+(Italic)*2+(Cw)*4)*N_FONT_SIZE) /* ** Macros for manipulating the fontValid bitmap of an HtmlWidget structure. */ #define FontIsValid(H,I) (((H)->fontValid[(I)>>3] & (1<<((I)&3)))!=0) #define FontSetValid(H,I) ((H)->fontValid[(I)>>3] |= (1<<((I)&3))) #define FontClearValid(H,I) ((H)->fontValid[(I)>>3] &= ~(1<<((I)&3))) /* ** Information about available colors. ** ** The widget will use at most N_COLOR colors. 4 of these colors ** are predefined. The rest are user selectable by options to ** various markups. (Ex: <font color=red>) ** ** All colors are stored in the apColor[] array of the main widget ** structure. The ".color" field of the HtmlStyle is an integer ** between 0 and N_COLOR-1 which indicates which of these colors ** to use. */ #define N_COLOR 16 /* Total number of colors */ #define COLOR_Normal 0 /* Index for normal color (black) */ #define COLOR_Unvisited 1 /* Index for unvisited hyperlinks */ #define COLOR_Visited 2 /* Color for visited hyperlinks */ #define COLOR_Selection 3 /* Background color for the selection */ #define COLOR_Background 4 /* Default background color */ #define N_PREDEFINED_COLOR 5 /* Number of predefined colors */ /* ** The "align" field of the style determines how text is justified ** horizontally. ALIGN_None means that the alignment is not specified. ** (It should probably default to ALIGN_Left in this case.) */ #define ALIGN_Left 1 #define ALIGN_Right 2 #define ALIGN_Center 3 #define ALIGN_None 0 /* ** Possible value of the "flags" field of HtmlStyle are shown below. ** ** STY_Preformatted If set, the current text occurred within ** <pre>..</pre> ** ** STY_StrikeThru Draw a solid line thru the middle of this text. ** ** STY_Underline This text should drawn with an underline. ** ** STY_NoBreak This text occurs within <nobr>..</nobr> ** ** STY_Anchor This text occurs within <a href=X>..</a>. ** ** STY_DT This text occurs within <dt>..</dt>. ** ** STY_Invisible This text should not appear in the main HTML ** window. (For example, it might be within ** <title>..</title> or <marquee>..</marquee>.) */ #define STY_Preformatted 0x001 #define STY_StrikeThru 0x002 #define STY_Underline 0x004 #define STY_NoBreak 0x008 #define STY_Anchor 0x010 #define STY_DT 0x020 #define STY_Invisible 0x040 #define STY_FontMask (STY_StrikeThru|STY_Underline) /* ** The first thing done with input HTML text is to parse it into ** HtmlElements. All sizing and layout is done using these elements, ** so this is a very important structure. ** ** Elements are designed so that the common ones (Text and Space) ** require as little storage as possible, in order to increase ** the chance of memory cache hits. (Turns out I didn't do a ** very good job of this. This widget is a pig for memory. But ** the speed is good, so I'm not going to change it right now...) ** ** Some elements require more memory than Text and Space (ex: <IMG>). ** An HtmlElement is therefore represented as a union of many other ** structures all of different sizes. That way we can have a pointer ** to a generic element without having to worry about how big that ** element is. The ".base.type" field (which is found in all elements) ** will tell us what type of element we are dealing with. ** ** NOTE: This trick will only work on compilers that align all elements ** of a union to the lowest memory address in that union. This is true ** for every C compiler I've ever seen, but isn't guarenteed for ANSI-C. */ union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; /* ** Every element contains at least this much information: */ struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; /* ** Bitmasks for the "flags" field of the HtmlBaseElement */ #define HTML_Visible 0x01 /* This element produces "ink" */ #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define HTML_Selected 0x04 /* Some or all of this Html_Block is selected */ /* Used by Html_Block elements only. */ /* ** Each text element holds additional information as show here. Notice ** that extra space is allocated so that zText[] will be large enough ** to hold the complete text of the element. X and y coordinates are ** relative to the virtual canvas. The y coordinate refers to the ** baseline. */ struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; /* ** Each space element is represented like this: */ struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; /* ** Most markup uses this structure. Some markup extends this structure ** with additional information, but most use it as a base, at the very ** least. ** ** If the markup doesn't have arguments (the "count" field of ** HtmlBaseElement is 0) then the extra "argv" field of this structure ** is not allocated and should not be used. */ struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; /* Each <td> or <th> markup is represented by an instance of the ** following structure. ** ** Drawing for a cell is a sunken 3D border with the border width given ** by the borderWidth field in the associated <table> structure. */ struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; /* ** The maximum number of columns allowed in a table. Any columns beyond ** this number are ignored. */ #define HTML_MAX_COLUMNS 40 /* ** This structure is used for each <table> element. ** ** In the minW[] and maxW[] arrays, the [0] element is the overall ** minimum and maximum width, including cell padding, spacing and ** the "hspace". All other elements are the minimum and maximum ** width for the contents of individual cells without any spacing or ** padding. */ struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; /* This structure is used for </table>, </td>, <tr>, </tr> ** and </th> elements. It points back to the <table> element ** that began the table. It is also used by </a> to point back ** to the original <a>. I'll probably think of other uses before ** all is said and done... */ struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; /* ** An instance of the following structure is used to represent ** each <LI> markup. */ struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; /* ** The .type field of an HtmlLi or HtmlListStart structure can take on ** any of the following values to indicate what type of bullet to draw. ** The value in HtmlLi will take precedence over the value in HtmlListStart ** if the two values differ. */ #define LI_TYPE_Undefined 0 /* If in HtmlLi, use the HtmlListStart value */ #define LI_TYPE_Bullet1 1 /* A solid circle */ #define LI_TYPE_Bullet2 2 /* A hollow circle */ #define LI_TYPE_Bullet3 3 /* A hollow square */ #define LI_TYPE_Enum_1 4 /* Arabic numbers */ #define LI_TYPE_Enum_A 5 /* A, B, C, ... */ #define LI_TYPE_Enum_a 6 /* a, b, c, ... */ #define LI_TYPE_Enum_I 7 /* Capitalized roman numerals */ #define LI_TYPE_Enum_i 8 /* Lower-case roman numerals */ /* ** An instance of this structure is used for <UL> or <OL> ** markup. */ struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; /* ** Information about each image on the HTML widget is held in an ** instance of the following structure. A pointer to this structure ** is the clientData for the image change callback. All image structures ** are held on a list attached to the main widget structure. ** ** This structure is NOT an element. The <IMG> element is represented ** by an HtmlImageMarkup structure below. There is one HtmlImageMarkup ** for each <IMG> in the source HTML. There is one of these structures ** for each unique image loaded. (If two <IMG> specify the same image, ** there are still two HtmlImageMarkup structures but only one ** HtmlImage structure that is shared between them.) */ struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; /* Each <img> markup is represented by an instance of the ** following structure. ** ** If pImage==0, then we use the alternative text in zAlt. */ struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; /* ** Allowed alignments for images. These represent the allowed arguments ** to the "align=" field of the <IMG> markup. */ #define IMAGE_ALIGN_Bottom 0 #define IMAGE_ALIGN_Middle 1 #define IMAGE_ALIGN_Top 2 #define IMAGE_ALIGN_TextTop 3 #define IMAGE_ALIGN_AbsMiddle 4 #define IMAGE_ALIGN_AbsBottom 5 #define IMAGE_ALIGN_Left 6 #define IMAGE_ALIGN_Right 7 /* ** All kinds of form markup, including <INPUT>, <TEXTAREA> and <SELECT> ** are represented by instances of the following structure. ** ** (later...) We also use this for the <APPLET> markup. That way, ** the window we create for an <APPLET> responds to the HtmlMapControls() ** and HtmlUnmapControls() function calls. For an <APPLET>, the ** pForm field is NULL. (Later still...) <EMBED> works just like ** <APPLET> so it uses this structure too. */ struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; /* ** An input control can be one of the following types. See the ** comment about <APPLET> on the HtmlInput structure insight into ** INPUT_TYPE_Applet. */ #define INPUT_TYPE_Unknown 0 #define INPUT_TYPE_Checkbox 1 #define INPUT_TYPE_File 2 #define INPUT_TYPE_Hidden 3 #define INPUT_TYPE_Image 4 #define INPUT_TYPE_Password 5 #define INPUT_TYPE_Radio 6 #define INPUT_TYPE_Reset 7 #define INPUT_TYPE_Select 8 #define INPUT_TYPE_Submit 9 #define INPUT_TYPE_Text 10 #define INPUT_TYPE_TextArea 11 #define INPUT_TYPE_Applet 12 /* ** There can be multiple <FORM> entries on a single HTML page. ** Each one must be given a unique number for identification purposes, ** and so we can generate unique state variable names for radiobuttons, ** checkbuttons, and entry boxes. */ struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; /* ** Information used by a <HR> markup */ struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; /* ** Information used by a <A> markup */ struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; /* ** Information about the <SCRIPT> markup. The parser treats <SCRIPT> ** specially. All text between <SCRIPT> and </SCRIPT> is captured and ** is pointed to by the zScript field of this structure. ** ** Note that zScript is not null-terminated. Instead, zScript just ** points to a spot in the zText field of the HtmlWidget structure. ** The nScript field determines how long the script is. */ struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ } /* ** A block is a single unit of display information. This can be ** one or more text elements, or the border of table, or an ** image, etc. ** ** Blocks are used to improve display speed and to improve the ** speed of linear searchs through the token list. A single ** block will typically contain enough information to display ** a dozen or more Text and Space elements all with a single ** call to Tk_DrawChars(). The blocks are linked together on ** their own list, so we can search them much faster then elements ** (since there are fewer of them.) ** ** Of course, you can construct pathological HTML that has as ** many Blocks as it has normal tokens. But you haven't lost ** anything. Using blocks just speeds things up in the common ** case. ** ** Much of the information needed for display is held in the ** original HtmlElement structures. "base.pNext" points to the first ** structure in the list which can be used to find the "style" ** "x" and "y". ** ** If n==0, then "base.pNext" might point to a special HtmlElement that ** defines some other kind of drawing, like <LI> or <IMG> or <INPUT>. */ struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; /* ** Linux doesn't have a stricmp() function. */ #ifndef HAVE_STRICMP # define stricmp strcasecmp # define strnicmp strncasecmp #endif /* ** A stack of these structures is used to keep track of nested font and ** style changes. This allows us to easily revert to the previous style ** when we encounter and end-tag like </em> or </h3>. ** ** This stack is used to keep track of the current style while walking ** the list of elements. After all elements have been assigned a style, ** the information in this stack is no longer used. */ struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ } /* ** A stack of the following structures is used to remember the ** left and right margins within a layout context. */ struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; /* ** How much space (in pixels) used for a single level of indentation due ** to a <UL> or <DL> or <BLOCKQUOTE>, etc. */ #define HTML_INDENT 36 /* ** A layout context holds all state information used by the layout ** engine. */ struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; /* ** With 28 different fonts and 16 colors, we could in principle have ** as many as 448 different GCs. But in practice, a single page of ** HTML will typically have much less than this. So we won't try to ** keep all GCs on hand. Instead, We'll keep around the most recently ** used GCs and allocate new ones as necessary. ** ** The following structure is used to build a cache of GCs in the ** main widget structure. */ #define N_CACHE_GC 16 struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; /* ** An HtmlIndex is a reference to a particular character within a ** particular Text or Space token. */ struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; /* ** A single instance of the following structure (together with various ** other structures to which this structure points) contains complete ** state information for a single HTML widget. The clientData for ** the widget command is a pointer to this structure. ** ** The HTML widget is really a mega-widget. It consists of two nested ** windows. The outer window (tkwin) contains the focus highlight border, ** the 3D border and the padding between the border and the text. All ** text that results from the HTML is drawn into the clipping window ** (clipwin). The clipping window is a child of the main ** window and has the name "x". We have to use a clipping window so ** that subwindows required by <FORM> will be clipped properly and won't ** overlap with the borders. ** ** Two primary coordinate systems are used in this widget. ** ** Window coordinates In this system, (0,0) is the upper left-hand ** corner of the clipping window. This coordinates ** apply only to objects which is visible on screen. ** ** Virtual canvas The virtual canvas is an imaginary canvas holding ** the entire document. Typically, part of the ** virtual canvas will show thru the clipping ** window to become visible. The mapping from ** window to virtual canvas coordinates is ** governed by the "xOffset" and "yOffset" fields ** of the widget structure. ** ** */ struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ } /* * Flag bits "flags" field of the Html widget: * * REDRAW_PENDING A DoWhenIdle handler has already been queued to * call HtmlRedrawCallback() function. * * GOT_FOCUS This widget currently has input focus. * * HSCROLL Horizontal scrollbar position needs to be * recomputed. * * VSCROLL Vertical scrollbar position needs to be * recomputed. * * RELAYOUT We need to reposition every element on the * virtual canvas. (This happens, for example, * when the size of the widget changes and we * need to recompute the line breaks.) * * RESIZE_ELEMENTS We need to recompute the size of every element. * This happens, for example, when the fonts * change. * * REDRAW_FOCUS We need to repaint the focus highlight border. * * REDRAW_TEXT Everything in the clipping window needs to be redrawn. * * REDRAW_BORDER Everything outside the clipping window needs * to be redrawn. * * RESIZE_CLIPWIN The size and position of the clipping window * needs to be adjusted using Tk_MoveResizeWindow(). * * STYLER_RUNNING There is a call to HtmlAddStyle() in process. * Used to prevent a recursive call to HtmlAddStyle(). * * INSERT_FLASHING True if there is a timer callback pending that will * toggle the state of the insertion cursor. * * REDRAW_IMAGES One or more HtmlImageMarkup structures have * their redrawNeeded flag set. */ #define REDRAW_PENDING 0x000001 #define GOT_FOCUS 0x000002 #define HSCROLL 0x000004 #define VSCROLL 0x000008 #define RELAYOUT 0x000010 #define RESIZE_ELEMENTS 0x000020 #define REDRAW_FOCUS 0x000040 #define REDRAW_TEXT 0x000080 #define REDRAW_BORDER 0x000100 #define EXTEND_LAYOUT 0x000200 #define RESIZE_CLIPWIN 0x000400 #define STYLER_RUNNING 0x000800 #define INSERT_FLASHING 0x001000 #define REDRAW_IMAGES 0x002000 /* ** Macros to set, clear or test bits of the "flags" field. */ #define HtmlHasFlag(A,F) (((A)->flags&(F))==(F)) #define HtmlHasAnyFlag(A,F) (((A)->flags&(F))!=0) #define HtmlSetFlag(A,F) ((A)->flags|=(F)) #define HtmlClearFlag(A,F) ((A)->flags&=~(F)) /* ** No coordinate is every as big as this number */ #define LARGE_NUMBER 100000000 /* ** Default values for configuration options */ #define DEF_HTML_BG_COLOR DEF_FRAME_BG_COLOR #define DEF_HTML_BG_MONO DEF_FRAME_BG_MONO #define DEF_HTML_BORDER_WIDTH "2" #define DEF_HTML_CALLBACK "" #define DEF_HTML_CURSOR DEF_FRAME_CURSOR #define DEF_HTML_EXPORT_SEL "yes" #define DEF_HTML_FG DEF_BUTTON_FG #define DEF_HTML_HEIGHT "400" #define DEF_HTML_HIGHLIGHT_BG DEF_BUTTON_HIGHLIGHT_BG #define DEF_HTML_HIGHLIGHT DEF_BUTTON_HIGHLIGHT #define DEF_HTML_HIGHLIGHT_WIDTH "0" #define DEF_HTML_INSERT_OFF_TIME "300" #define DEF_HTML_INSERT_ON_TIME "600" #define DEF_HTML_PADX "5" #define DEF_HTML_PADY "5" #define DEF_HTML_RELIEF "raised" #define DEF_HTML_SCROLL_COMMAND "" #define DEF_HTML_SELECTION_COLOR "skyblue" #define DEF_HTML_TAKE_FOCUS "0" #define DEF_HTML_UNVISITED "blue1" #define DEF_HTML_VISITED "blue3" #define DEF_HTML_WIDTH "600" #ifdef NAVIGATOR_TABLES #define DEF_HTML_TABLE_BORDER "0" #define DEF_HTML_TABLE_CELLPADDING "2" #define DEF_HTML_TABLE_CELLSPACING "5" #define DEF_HTML_TABLE_BORDER_LIGHT_COLOR "gray80" #define DEF_HTML_TABLE_BORDER_DARK_COLOR "gray40" #endif /* NAVIGATOR_TABLES */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlcmd.c����������������������������������������������������������������������000644 �000765 �000000 �00000045576 12547267111 016520� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines to implement the HTML widget commands ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <stdlib.h> #include <string.h> #include "htmlcmd.h" /* ** WIDGET resolve ?URI ...? ** ** Call the TCL command specified by the -resolvercommand option ** to resolve the URL. */ int HtmlResolveCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ return HtmlCallResolver(htmlPtr, (char**)argv+2); } /* ** WIDGET cget CONFIG-OPTION ** ** Retrieve the value of a configuration option */ int HtmlCgetCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ TestPoint(0); return Tk_ConfigureValue(interp, htmlPtr->tkwin, HtmlConfigSpec(), (char *) htmlPtr, argv[2], 0); } /* ** WIDGET clear ** ** Erase all HTML from this widget and clear the screen. This is ** typically done before loading a new document. */ int HtmlClearCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlClear(htmlPtr); htmlPtr->flags |= REDRAW_TEXT | VSCROLL | HSCROLL; HtmlScheduleRedraw(htmlPtr); TestPoint(0); return TCL_OK; } /* ** WIDGET configure ?OPTIONS? ** ** The standard Tk configure command. */ int HtmlConfigCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ if (argc == 2) { TestPoint(0); return Tk_ConfigureInfo(interp, htmlPtr->tkwin, HtmlConfigSpec(), (char *) htmlPtr, (char *) NULL, 0); } else if (argc == 3) { TestPoint(0); return Tk_ConfigureInfo(interp, htmlPtr->tkwin, HtmlConfigSpec(), (char *) htmlPtr, argv[2], 0); } else { TestPoint(0); return ConfigureHtmlWidget(interp, htmlPtr, argc-2, argv+2, TK_CONFIG_ARGV_ONLY, 0); } } /* ** WIDGET href X Y ** ** Returns the URL on the hyperlink that is beneath the position X,Y. ** Returns {} if there is no hyperlink beneath X,Y. */ int HtmlHrefCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ int x, y; char *z; if( Tcl_GetInt(interp, argv[2], &x) != TCL_OK || Tcl_GetInt(interp, argv[3], &y) != TCL_OK ){ TestPoint(0); return TCL_ERROR; } z = HtmlGetHref(htmlPtr, x + htmlPtr->xOffset, y + htmlPtr->yOffset); if( z ){ HtmlLock(htmlPtr); z = HtmlResolveUri(htmlPtr, z); if( !HtmlUnlock(htmlPtr) ){ Tcl_SetResult(interp, z, TCL_DYNAMIC); } } return TCL_OK; } /* ** WIDGET names ** ** Returns a list of names associated with <a name=...> tags. */ int HtmlNamesCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlElement *p; char *z; TestPoint(0); for(p=htmlPtr->pFirst; p; p=p->pNext){ if( p->base.type!=Html_A ) continue; z = HtmlMarkupArg(p,"name",0); if( z ){ Tcl_AppendElement(interp,z); }else{ z = HtmlMarkupArg(p,"id",0); if( z ){ Tcl_AppendElement(interp,z); } } } return TCL_OK; } /* ** WIDGET parse HTML ** ** Appends the given HTML text to the end of any HTML text that may have ** been inserted by prior calls to this command. Then it runs the ** tokenizer, parser and layout engine as far as possible with the ** text that is available. The display is updated appropriately. */ int HtmlParseCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlElement *endPtr; endPtr = htmlPtr->pLast; HtmlLock(htmlPtr); HtmlTokenizerAppend(htmlPtr, argv[2]); if( HtmlIsDead(htmlPtr) ){ return TCL_OK; } if( endPtr ){ if( endPtr->pNext ){ HtmlAddStyle(htmlPtr, endPtr->pNext); } }else if( htmlPtr->pFirst ){ htmlPtr->paraAlignment = ALIGN_None; htmlPtr->rowAlignment = ALIGN_None; htmlPtr->anchorFlags = 0; htmlPtr->inDt = 0; htmlPtr->anchorStart = 0; htmlPtr->formStart = 0; htmlPtr->innerList = 0; HtmlAddStyle(htmlPtr, htmlPtr->pFirst); TestPoint(0); } if( !HtmlUnlock(htmlPtr) ){ htmlPtr->flags |= EXTEND_LAYOUT; HtmlScheduleRedraw(htmlPtr); TestPoint(0); } return TCL_OK; } /* ** WIDGET xview ?SCROLL-OPTIONS...? ** ** Implements horizontal scrolling in the usual Tk way. */ int HtmlXviewCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ if( argc==2 ){ HtmlComputeHorizontalPosition(htmlPtr,(char*)Tcl_GetStringResult(interp)); TestPoint(0); }else{ int count; double fraction; int maxX = htmlPtr->maxX; int w = HtmlUsableWidth(htmlPtr); int offset = htmlPtr->xOffset; int type = Tk_GetScrollInfo(interp,argc,(const char**)argv,&fraction,&count); switch( type ){ case TK_SCROLL_ERROR: TestPoint(0); return TCL_ERROR; case TK_SCROLL_MOVETO: offset = fraction * maxX; TestPoint(0); break; case TK_SCROLL_PAGES: offset += (count * w * 9)/10; TestPoint(0); break; case TK_SCROLL_UNITS: offset += (count * w)/10; TestPoint(0); break; } if( offset + w > maxX ){ offset = maxX - w; TestPoint(0); }else{ TestPoint(0); } if( offset < 0 ){ offset = 0; TestPoint(0); }else{ TestPoint(0); } HtmlHorizontalScroll(htmlPtr, offset); } return TCL_OK; } /* ** WIDGET yview ?SCROLL-OPTIONS...? ** ** Implements vertical scrolling in the usual Tk way, but with one ** enhancement. If the argument is a single word, the widget looks ** for a <a name=...> tag with that word as the "name" and scrolls ** to the position of that tag. */ int HtmlYviewCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ if( argc==2 ){ HtmlComputeVerticalPosition(htmlPtr,(char*)Tcl_GetStringResult(interp)); TestPoint(0); }else if( argc==3 ){ char *z; HtmlElement *p; for(p=htmlPtr->pFirst; p; p=p->pNext){ if( p->base.type!=Html_A ) continue; z = HtmlMarkupArg(p,"name",0); if( z==0 ){ TestPoint(0); continue; } if( strcmp(z,argv[2])!=0 ){ TestPoint(0); continue; } HtmlVerticalScroll(htmlPtr, p->anchor.y); TestPoint(0); break; } } else if( argc==4 && !strncmp(argv[2],"text",4)) { HtmlElement *p; int i; HtmlLock(htmlPtr); if( HtmlGetIndex(htmlPtr, argv[3], &p, &i)!=0 ){ if( !HtmlUnlock(htmlPtr) ){ Tcl_AppendResult(interp,"malformed index: \"", argv[3], "\"", 0); } TestPoint(0); return TCL_ERROR; } if( !HtmlUnlock(htmlPtr) && p ){ if( p->base.type==Html_Text ) { int offset = p->text.y-20; if (offset<0) offset = 0; HtmlVerticalScroll(htmlPtr, offset); } TestPoint(0); } } else{ int count; double fraction; int maxY = htmlPtr->maxY; int h = HtmlUsableHeight(htmlPtr); int offset = htmlPtr->yOffset; int type = Tk_GetScrollInfo(interp,argc,(const char**)argv,&fraction,&count); switch( type ){ case TK_SCROLL_ERROR: TestPoint(0); return TCL_ERROR; case TK_SCROLL_MOVETO: offset = fraction * maxY; TestPoint(0); break; case TK_SCROLL_PAGES: offset += (count * h * 9)/10; TestPoint(0); break; case TK_SCROLL_UNITS: offset += (count * h)/10; TestPoint(0); break; } if( offset + h > maxY ){ offset = maxY - h; TestPoint(0); }else{ TestPoint(0); } if( offset < 0 ){ offset = 0; TestPoint(0); }else{ TestPoint(0); } HtmlVerticalScroll(htmlPtr, offset); } return TCL_OK; } /* ** WIDGET token handler TAG ?SCRIPT? */ int HtmlTokenHandlerCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ int type = HtmlNameToType(argv[3]); if( type==Html_Unknown ){ Tcl_AppendResult(interp,"unknown tag: \"", argv[3], "\"", 0); return TCL_ERROR; } if( argc==4 ){ if( htmlPtr->zHandler[type]!=0 ){ Tcl_SetResult(interp,htmlPtr->zHandler[type],NULL); } }else{ if( htmlPtr->zHandler[type]!=0 ){ HtmlFree(htmlPtr->zHandler[type]); } htmlPtr->zHandler[type] = HtmlAlloc( strlen(argv[4]) + 1 ); if( htmlPtr->zHandler[type] ){ strcpy(htmlPtr->zHandler[type],argv[4]); } } return TCL_OK; } /* ** WIDGET index INDEX */ int HtmlIndexCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlElement *p; int i; HtmlLock(htmlPtr); if( HtmlGetIndex(htmlPtr, argv[2], &p, &i)!=0 ){ if( !HtmlUnlock(htmlPtr) ){ Tcl_AppendResult(interp,"malformed index: \"", argv[2], "\"", 0); } TestPoint(0); return TCL_ERROR; } if( !HtmlUnlock(htmlPtr) && p ){ sprintf((char*)Tcl_GetStringResult(interp), "%d.%d", HtmlTokenNumber(p), i); TestPoint(0); }else{ TestPoint(0); } return TCL_OK; } /* The pSelStartBlock and pSelEndBlock values have been changed. ** This routine's job is to loop over all HtmlBlocks and either ** set or clear the HTML_Selected bits in the .base.flags field ** as appropriate. For every HtmlBlock where the bit changes, ** mark that block for redrawing. */ static void UpdateSelection(HtmlWidget *htmlPtr){ int selected = 0; HtmlIndex tempIndex; HtmlBlock *pTempBlock; int temp; HtmlBlock *p; for(p=htmlPtr->firstBlock; p; p=p->pNext){ if( p==htmlPtr->pSelStartBlock ){ selected = 1; HtmlRedrawBlock(htmlPtr, p); TestPoint(0); }else if( !selected && p==htmlPtr->pSelEndBlock ){ selected = 1; tempIndex = htmlPtr->selBegin; htmlPtr->selBegin = htmlPtr->selEnd; htmlPtr->selEnd = tempIndex; pTempBlock = htmlPtr->pSelStartBlock; htmlPtr->pSelStartBlock = htmlPtr->pSelEndBlock; htmlPtr->pSelEndBlock = pTempBlock; temp = htmlPtr->selStartIndex; htmlPtr->selStartIndex = htmlPtr->selEndIndex; htmlPtr->selEndIndex = temp; HtmlRedrawBlock(htmlPtr, p); TestPoint(0); }else{ TestPoint(0); } if( p->base.flags & HTML_Selected ){ if( !selected ){ p->base.flags &= ~HTML_Selected; HtmlRedrawBlock(htmlPtr,p); TestPoint(0); }else{ TestPoint(0); } }else{ if( selected ){ p->base.flags |= HTML_Selected; HtmlRedrawBlock(htmlPtr,p); TestPoint(0); }else{ TestPoint(0); } } if( p==htmlPtr->pSelEndBlock ){ selected = 0; HtmlRedrawBlock(htmlPtr, p); TestPoint(0); }else{ TestPoint(0); } } } /* Given the selection end-points in htmlPtr->selBegin ** and htmlPtr->selEnd, recompute pSelBeginBlock and ** pSelEndBlock, then call UpdateSelection to update the ** display. ** ** This routine should be called whenever the selection ** changes or whenever the set of HtmlBlock structures ** change. */ void HtmlUpdateSelection(HtmlWidget *htmlPtr, int forceUpdate){ HtmlBlock *pBlock; int index; int needUpdate = forceUpdate; int temp; if( htmlPtr->selEnd.p==0 ){ htmlPtr->selBegin.p = 0; TestPoint(0); }else{ TestPoint(0); } HtmlIndexToBlockIndex(htmlPtr, htmlPtr->selBegin, &pBlock, &index); if( needUpdate || pBlock != htmlPtr->pSelStartBlock ){ needUpdate = 1; HtmlRedrawBlock(htmlPtr, htmlPtr->pSelStartBlock); htmlPtr->pSelStartBlock = pBlock; htmlPtr->selStartIndex = index; TestPoint(0); }else if( index != htmlPtr->selStartIndex ){ HtmlRedrawBlock(htmlPtr, pBlock); htmlPtr->selStartIndex = index; TestPoint(0); }else{ TestPoint(0); } if( htmlPtr->selBegin.p==0 ){ htmlPtr->selEnd.p = 0; TestPoint(0); }else{ TestPoint(0); } HtmlIndexToBlockIndex(htmlPtr, htmlPtr->selEnd, &pBlock, &index); if( needUpdate || pBlock != htmlPtr->pSelEndBlock ){ needUpdate = 1; HtmlRedrawBlock(htmlPtr, htmlPtr->pSelEndBlock); htmlPtr->pSelEndBlock = pBlock; htmlPtr->selEndIndex = index; TestPoint(0); }else if( index != htmlPtr->selEndIndex ){ HtmlRedrawBlock(htmlPtr, pBlock); htmlPtr->selEndIndex = index; TestPoint(0); }else{ TestPoint(0); } if( htmlPtr->pSelStartBlock && htmlPtr->pSelStartBlock==htmlPtr->pSelEndBlock && htmlPtr->selStartIndex > htmlPtr->selEndIndex ){ temp = htmlPtr->selStartIndex; htmlPtr->selStartIndex = htmlPtr->selEndIndex; htmlPtr->selEndIndex = temp; TestPoint(0); }else{ TestPoint(0); } if( needUpdate ){ UpdateSelection(htmlPtr); TestPoint(0); }else{ TestPoint(0); } } /* ** WIDGET selection set INDEX INDEX */ int HtmlSelectionSetCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlIndex selBegin, selEnd; HtmlLock(htmlPtr); if( HtmlGetIndex(htmlPtr, argv[3], &selBegin.p, &selBegin.i) ){ if( !HtmlUnlock(htmlPtr) ){ Tcl_AppendResult(interp,"malformed index: \"", argv[3], "\"", 0); } TestPoint(0); return TCL_ERROR; } if( HtmlIsDead(htmlPtr) ) return TCL_OK; if( HtmlGetIndex(htmlPtr, argv[4], &selEnd.p, &selEnd.i) ){ if( !HtmlUnlock(htmlPtr) ){ Tcl_AppendResult(interp,"malformed index: \"", argv[4], "\"", 0); } TestPoint(0); return TCL_ERROR; } if( HtmlUnlock(htmlPtr) ) return TCL_OK; htmlPtr->selBegin = selBegin; htmlPtr->selEnd = selEnd; HtmlUpdateSelection(htmlPtr,0); TestPoint(0); return TCL_OK; } /* ** WIDGET selection clear */ int HtmlSelectionClearCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ htmlPtr->pSelStartBlock = 0; htmlPtr->pSelEndBlock = 0; htmlPtr->selBegin.p = 0; htmlPtr->selEnd.p = 0; UpdateSelection(htmlPtr); TestPoint(0); return TCL_OK; } /* ** Recompute the position of the insertion cursor based on the ** position in htmlPtr->ins. */ void HtmlUpdateInsert(HtmlWidget *htmlPtr){ HtmlIndexToBlockIndex(htmlPtr, htmlPtr->ins, &htmlPtr->pInsBlock, &htmlPtr->insIndex); HtmlRedrawBlock(htmlPtr, htmlPtr->pInsBlock); if( htmlPtr->insTimer==0 ){ htmlPtr->insStatus = 0; HtmlFlashCursor(htmlPtr); TestPoint(0); }else{ TestPoint(0); } } /* ** WIDGET insert INDEX */ int HtmlInsertCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlIndex ins; if( argv[2][0]==0 ){ HtmlRedrawBlock(htmlPtr, htmlPtr->pInsBlock); htmlPtr->insStatus = 0; htmlPtr->pInsBlock = 0; htmlPtr->ins.p = 0; TestPoint(0); }else{ HtmlLock(htmlPtr); if( HtmlGetIndex(htmlPtr, argv[2], &ins.p, &ins.i) ){ if( !HtmlUnlock(htmlPtr) ){ Tcl_AppendResult(interp,"malformed index: \"", argv[2], "\"", 0); } TestPoint(0); return TCL_ERROR; } if( HtmlUnlock(htmlPtr) ) return TCL_OK; HtmlRedrawBlock(htmlPtr, htmlPtr->pInsBlock); htmlPtr->ins = ins; HtmlUpdateInsert(htmlPtr); TestPoint(0); } return TCL_OK; } /* ** WIDGET token list START END */ int HtmlTokenListCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlElement *pStart, *pEnd; int i; if( HtmlGetIndex(htmlPtr, argv[3], &pStart, &i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", argv[3], "\"", 0); return TCL_ERROR; } if( HtmlGetIndex(htmlPtr, argv[4], &pEnd, &i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", argv[4], "\"", 0); return TCL_ERROR; } if( pStart ){ HtmlTclizeList(interp,pStart,pEnd ? pEnd->base.pNext : 0); } return TCL_OK; } #ifdef DEBUG /* ** WIDGET debug dump START END */ int HtmlDebugDumpCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlElement *pStart, *pEnd; int i; if( HtmlGetIndex(htmlPtr, argv[3], &pStart, &i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", argv[3], "\"", 0); return TCL_ERROR; } if( HtmlGetIndex(htmlPtr, argv[4], &pEnd, &i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", argv[4], "\"", 0); return TCL_ERROR; } if( pStart ){ HtmlPrintList(pStart,pEnd ? pEnd->base.pNext : 0); } return TCL_OK; } /* ** WIDGET debug testpt FILENAME */ int HtmlDebugTestPtCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlTestPointDump(argv[3]); return TCL_OK; } #endif ����������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlcmd.h����������������������������������������������������������������������000644 �000765 �000000 �00000060755 12547267111 016521� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ void HtmlTestPointDump(const char *filename); typedef struct HtmlWidget HtmlWidget; #define DEBUG 1 #if defined(DEBUG) int HtmlDebugTestPtCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); #endif typedef union HtmlElement HtmlElement; #if defined(DEBUG) void HtmlPrintList(HtmlElement *p,HtmlElement *pEnd); int HtmlDebugDumpCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); #endif void HtmlTclizeList(Tcl_Interp *interp,HtmlElement *p,HtmlElement *pEnd); int HtmlTokenListCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlInsertCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); void HtmlFlashCursor(ClientData clientData); void HtmlUpdateInsert(HtmlWidget *htmlPtr); int HtmlSelectionClearCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlSelectionSetCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef struct HtmlBlock HtmlBlock; void HtmlIndexToBlockIndex(HtmlWidget *htmlPtr,HtmlIndex sIndex,HtmlBlock **ppBlock,int *piIndex); void HtmlUpdateSelection(HtmlWidget *htmlPtr,int forceUpdate); #define HTML_Selected 0x04 /* Some or all of this Html_Block is selected */ void HtmlRedrawBlock(HtmlWidget *htmlPtr,HtmlBlock *p); typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef unsigned short Html_u16; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; int HtmlTokenNumber(HtmlElement *p); int HtmlIndexCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) #define HtmlFree(A) Tcl_Free((char*)(A)) #define Html_Unknown 3 int HtmlNameToType(const char *zType); int HtmlTokenHandlerCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlUsableHeight(HtmlWidget *htmlPtr); #define Html_Text 1 int HtmlGetIndex(HtmlWidget *htmlPtr,const char *zIndex,HtmlElement **ppToken,int *pIndex); void HtmlVerticalScroll(HtmlWidget *htmlPtr,int yOffset); void HtmlComputeVerticalPosition(HtmlWidget *htmlPtr,char *buf); int HtmlYviewCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); void HtmlHorizontalScroll(HtmlWidget *htmlPtr,int xOffset); int HtmlUsableWidth(HtmlWidget *htmlPtr); void HtmlComputeHorizontalPosition(HtmlWidget *htmlPtr,char *buf); int HtmlXviewCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); #define EXTEND_LAYOUT 0x000200 #define ALIGN_None 0 void HtmlAddStyle(HtmlWidget *htmlPtr,HtmlElement *p); int HtmlIsDead(HtmlWidget *htmlPtr); void HtmlTokenizerAppend(HtmlWidget *htmlPtr,const char *zText); int HtmlParseCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define Html_A 5 typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; int HtmlNamesCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlUnlock(HtmlWidget *htmlPtr); char *HtmlResolveUri(HtmlWidget *htmlPtr,char *zUri); void HtmlLock(HtmlWidget *htmlPtr); char *HtmlGetHref(HtmlWidget *htmlPtr,int x,int y); int HtmlHrefCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int ConfigureHtmlWidget(Tcl_Interp *interp,HtmlWidget *htmlPtr,int argc,const char **argv,int flags,int realign); int HtmlConfigCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); void HtmlScheduleRedraw(HtmlWidget *htmlPtr); #define HSCROLL 0x000004 #define VSCROLL 0x000008 #define REDRAW_TEXT 0x000080 void HtmlClear(HtmlWidget *htmlPtr); int HtmlClearCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); Tk_ConfigSpec *HtmlConfigSpec(void); #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif int HtmlCgetCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlCallResolver(HtmlWidget *htmlPtr,char **azSeries); #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; int HtmlResolveCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; �������������������saods9/tkhtml1.0/src/htmldraw.c���������������������������������������������������������������������000644 �000765 �000000 �00000061743 12547267111 016704� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines used to render HTML onto the screen for the Tk HTML widget. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <string.h> #include <stdlib.h> #include "htmldraw.h" #ifdef USE_TK_STUBS # include <tkIntXlibDecls.h> #endif #define USE_TK_DRAWCHARS 1 /* ** Allocate a new HtmlBlock structure. */ static HtmlBlock *AllocBlock(void){ HtmlBlock *pNew; pNew = HtmlAlloc( sizeof(HtmlBlock) ); if( pNew ){ memset(pNew, 0, sizeof(*pNew)); pNew->base.type = Html_Block; } return pNew; } /* ** Free an HtmlBlock structure. Assume that it is already unlinked ** from the element list and the block list. */ static void FreeBlock(HtmlBlock *pBlock){ if( pBlock ){ if( pBlock->z ){ HtmlFree(pBlock->z); } HtmlFree(pBlock); } } /* ** Destroy the given Block after first unlinking it from the ** element list. Note that this unlinks the block from the ** element list only -- not from the block list. */ static void UnlinkAndFreeBlock(HtmlWidget *htmlPtr, HtmlBlock *pBlock){ if( pBlock->base.pNext ){ pBlock->base.pNext->base.pPrev = pBlock->base.pPrev; TestPoint(0); }else{ htmlPtr->pLast = pBlock->base.pPrev; TestPoint(0); } if( pBlock->base.pPrev ){ pBlock->base.pPrev->base.pNext = pBlock->base.pNext; TestPoint(0); }else{ htmlPtr->pFirst = pBlock->base.pNext; TestPoint(0); } pBlock->base.pPrev = pBlock->base.pNext = 0; FreeBlock(pBlock); } /* ** Append a block to the block list and insert the block into the ** element list immediately prior to the element given. */ static void AppendBlock( HtmlWidget *htmlPtr, /* The HTML widget */ HtmlElement *pToken, /* The token that comes after pBlock */ HtmlBlock *pBlock /* The block to be appended */ ){ pBlock->base.pPrev = pToken->base.pPrev; pBlock->base.pNext = pToken; pBlock->pPrev = htmlPtr->lastBlock; pBlock->pNext = 0; if( htmlPtr->lastBlock ){ htmlPtr->lastBlock->pNext = pBlock; TestPoint(0); }else{ htmlPtr->firstBlock = pBlock; TestPoint(0); } htmlPtr->lastBlock = pBlock; if( pToken->base.pPrev ){ pToken->base.pPrev->base.pNext = (HtmlElement*)pBlock; TestPoint(0); }else{ htmlPtr->pFirst = (HtmlElement*)pBlock; TestPoint(0); } pToken->base.pPrev = (HtmlElement*)pBlock; } /* ** Print an ordered list index into the given buffer. Use numbering ** like this: ** ** A B C ... Y Z AA BB CC ... ZZ ** ** Revert to decimal for indices greater than 52. */ static void GetLetterIndex(char *zBuf, int index, int isUpper){ int seed; if( index<1 || index>52 ){ sprintf(zBuf,"%d",index); TestPoint(0); return; } if( isUpper ){ seed = 'A'; TestPoint(0); }else{ seed = 'a'; TestPoint(0); } index--; if( index<26 ){ zBuf[0] = seed + index; zBuf[1] = 0; TestPoint(0); }else{ index -= 26; zBuf[0] = seed + index; zBuf[1] = seed + index; zBuf[2] = 0; TestPoint(0); } strcat(zBuf,"."); } /* ** Print an ordered list index into the given buffer. Use roman ** numerals. For indices greater than a few thousand, revert to ** decimal. */ static void GetRomanIndex(char *zBuf, int index, int isUpper){ int i = 0; int j; static struct { int value; char *name; } values[] = { { 1000, "m" }, { 999, "im" }, { 990, "xm" }, { 900, "cm" }, { 500, "d" }, { 499, "id" }, { 490, "xd" }, { 400, "cd" }, { 100, "c" }, { 99, "ic" }, { 90, "xc" }, { 50, "l" }, { 49, "il" }, { 40, "xl" }, { 10, "x" }, { 9, "ix" }, { 5, "v" }, { 4, "iv" }, { 1, "i" }, }; if( index<1 || index>=5000 ){ sprintf(zBuf,"%d",index); TestPoint(0); return; } for(j=0; index>0 && j<sizeof(values)/sizeof(values[0]); j++){ int k; while( index >= values[j].value ){ for(k=0; values[j].name[k]; k++){ zBuf[i++] = values[j].name[k]; TestPoint(0); } index -= values[j].value; TestPoint(0); } } zBuf[i] = 0; if( isUpper ){ for(i=0; zBuf[i]; i++){ zBuf[i] += 'A' - 'a'; TestPoint(0); } }else{ TestPoint(0); } strcat(zBuf,"."); } /* Draw the selection background for the given block */ static void DrawSelectionBackground( HtmlWidget *htmlPtr, /* The HTML widget */ HtmlBlock *pBlock, /* The block whose background is drawn */ Drawable drawable, /* Draw the background on this drawable */ int x, int y /* Virtual coords of top-left of drawable */ ){ int xLeft, xRight; /* Left and right bounds of box to draw */ int yTop, yBottom; /* Top and bottom of box */ HtmlElement *p = 0; /* First element of the block */ Tk_Font font; /* Font */ GC gc; /* GC for drawing */ XRectangle xrec; /* Size of a filled rectangle to be drawn */ if( pBlock==0 || (pBlock->base.flags & HTML_Selected)==0 ){ TestPoint(0); return; } xLeft = pBlock->left - x; if( pBlock==htmlPtr->pSelStartBlock && htmlPtr->selStartIndex>0 ){ if( htmlPtr->selStartIndex >= pBlock->n ){ TestPoint(0); return; } p = pBlock->base.pNext; font = HtmlGetFont(htmlPtr, p->base.style.font); if( font==0 ) return; if( p->base.type==Html_Text ){ xLeft = p->text.x - x + Tk_TextWidth(font, pBlock->z, htmlPtr->selStartIndex); } } xRight = pBlock->right - x; if( pBlock==htmlPtr->pSelEndBlock && htmlPtr->selEndIndex<pBlock->n ){ if( p==0 ){ p = pBlock->base.pNext; font = HtmlGetFont(htmlPtr, p->base.style.font); if( font==0 ) return; } if( p->base.type==Html_Text ){ xRight = p->text.x - x + Tk_TextWidth(font, pBlock->z, htmlPtr->selEndIndex); } } yTop = pBlock->top - y; yBottom = pBlock->bottom - y; gc = HtmlGetGC(htmlPtr, COLOR_Selection, FONT_Any); xrec.x = xLeft; xrec.y = yTop; xrec.width = xRight - xLeft; xrec.height = yBottom - yTop; XFillRectangles(htmlPtr->display, drawable, gc, &xrec, 1); } /* ** Draw a rectangle. The rectangle will have a 3-D appearance if ** flat==0 and a flat appearance if flat==1. ** ** We don't use Tk_Draw3DRectangle() because it doesn't work well ** when the background color is close to pure white or pure black. */ static void HtmlDrawRect( HtmlWidget *htmlPtr, /* The HTML widget */ Drawable drawable, /* Draw it here */ HtmlElement *src, /* Element associated with drawing */ int x, int y, int w, int h, /* Coordinates of the rectangle */ int depth, /* Width of the relief, or the flat line */ int relief /* The relief. TK_RELIEF_FLAT omits 3d */ ){ if( depth>0 ){ int i; GC gcLight, gcDark; XRectangle xrec[1]; if( relief!=TK_RELIEF_FLAT ){ int iLight, iDark; iLight = HtmlGetLightShadowColor(htmlPtr, src->base.style.bgcolor); gcLight = HtmlGetGC(htmlPtr, iLight, FONT_Any); iDark = HtmlGetDarkShadowColor(htmlPtr, src->base.style.bgcolor); gcDark = HtmlGetGC(htmlPtr, iDark, FONT_Any); if( relief==TK_RELIEF_SUNKEN ){ GC gcTemp = gcLight; gcLight = gcDark; gcDark = gcTemp; } }else{ gcLight = HtmlGetGC(htmlPtr, src->base.style.color, FONT_Any); gcDark = gcLight; } xrec[0].x = x; xrec[0].y = y; xrec[0].width = depth; xrec[0].height = h; XFillRectangles(htmlPtr->display, drawable, gcLight, xrec, 1); xrec[0].x = x+w-depth; XFillRectangles(htmlPtr->display, drawable, gcDark, xrec, 1); for(i=0; i<depth && i<h/2; i++){ XDrawLine(htmlPtr->display, drawable, gcLight, x+i, y+i, x+w-i-1, y+i); XDrawLine(htmlPtr->display, drawable, gcDark, x+i, y+h-i-1, x+w-i-1, y+h-i-1); } } if( h>depth*2 && w>depth*2 ){ GC gcBg; XRectangle xrec[1]; gcBg = HtmlGetGC(htmlPtr, src->base.style.bgcolor, FONT_Any); xrec[0].x = x + depth; xrec[0].y = y + depth; xrec[0].width = w - depth*2; xrec[0].height = h - depth*2; XFillRectangles(htmlPtr->display, drawable, gcBg, xrec, 1); } } /* ** Display a single HtmlBlock. This is where all the drawing ** happens. */ void HtmlBlockDraw( HtmlWidget *htmlPtr, /* The main HTML widget */ HtmlBlock *pBlock, /* Block which needs to be drawn */ Drawable drawable, /* Draw the line on this */ int drawableLeft, /* Virtual coordinate of left edge of drawable */ int drawableTop, /* Virtual coordinate of top edge of drawable */ int drawableWidth, /* Width of the drawable */ int drawableHeight /* Height of the drawable */ ){ Tk_Font font; /* Font to use to render text */ GC gc; /* A graphics context */ HtmlElement *src; /* HtmlElement holding style information */ HtmlElement *pTable; /* The table (when drawing part of a table) */ int x, y; /* Where to draw */ if( pBlock==0 ){ TestPoint(0); return; } src = pBlock->base.pNext; while( src && (src->base.flags & HTML_Visible)==0 ){ src = src->base.pNext; TestPoint(0); } if( src==0 ){ TestPoint(0); return; } if( pBlock->n>0 ){ /* We must be dealing with plain old text */ if( src->base.type==Html_Text ){ x = src->text.x; y = src->text.y; TestPoint(0); }else{ CANT_HAPPEN; return; } if( pBlock->base.flags & HTML_Selected ){ HtmlLock(htmlPtr); DrawSelectionBackground(htmlPtr, pBlock, drawable, drawableLeft, drawableTop); if( HtmlUnlock(htmlPtr) ) return; } gc = HtmlGetGC(htmlPtr, src->base.style.color, src->base.style.font); font = HtmlGetFont(htmlPtr, src->base.style.font); if( font==0 ) return; Tk_DrawChars(htmlPtr->display, drawable, gc, font, pBlock->z, pBlock->n, x - drawableLeft, y - drawableTop); if( src->base.style.flags & STY_Underline ){ Tk_UnderlineChars(htmlPtr->display, drawable, gc, font, pBlock->z, x - drawableLeft, y-drawableTop, 0, pBlock->n); } if( src->base.style.flags & STY_StrikeThru ){ XRectangle xrec; xrec.x = pBlock->left - drawableLeft; xrec.y = (pBlock->top + pBlock->bottom)/2 - drawableTop; xrec.width = pBlock->right - pBlock->left; xrec.height = 1 + (pBlock->bottom - pBlock->top > 15); XFillRectangles(htmlPtr->display, drawable, gc, &xrec, 1); } if( pBlock==htmlPtr->pInsBlock && htmlPtr->insStatus>0 ){ int x; XRectangle xrec; if( htmlPtr->insIndex < pBlock->n ){ x = src->text.x - drawableLeft; x += Tk_TextWidth(font, pBlock->z, htmlPtr->insIndex); }else{ x = pBlock->right - drawableLeft; } if( x>0 ){ TestPoint(0); x--; } xrec.x = x; xrec.y = pBlock->top - drawableTop; xrec.width = 2; xrec.height = pBlock->bottom - pBlock->top; XFillRectangles(htmlPtr->display, drawable, gc, &xrec, 1); } }else{ /* We are dealing with a single HtmlElement which contains something ** other than plain text. */ int top=0; int btm=0; int cntr; int cnt, w; char zBuf[30]; switch( src->base.type ){ case Html_LI: x = src->li.x; y = src->li.y; cntr = (top+btm)/2; switch( src->li.type ){ case LI_TYPE_Enum_1: sprintf(zBuf,"%d.",src->li.cnt); TestPoint(0); break; case LI_TYPE_Enum_A: GetLetterIndex(zBuf,src->li.cnt,1); TestPoint(0); break; case LI_TYPE_Enum_a: GetLetterIndex(zBuf,src->li.cnt,0); TestPoint(0); break; case LI_TYPE_Enum_I: GetRomanIndex(zBuf,src->li.cnt,1); TestPoint(0); break; case LI_TYPE_Enum_i: GetRomanIndex(zBuf,src->li.cnt,0); TestPoint(0); break; default: zBuf[0] = 0; TestPoint(0); break; } gc = HtmlGetGC(htmlPtr, src->base.style.color, src->base.style.font); switch( src->li.type ){ case LI_TYPE_Undefined: case LI_TYPE_Bullet1: XFillArc(htmlPtr->display, drawable, gc, x - 7 - drawableLeft, y - 8 - drawableTop, 7, 7, 0, 360*64); TestPoint(0); break; case LI_TYPE_Bullet2: XDrawArc(htmlPtr->display, drawable, gc, x - 7 - drawableLeft, y - 8 - drawableTop, 7, 7, 0, 360*64); TestPoint(0); break; case LI_TYPE_Bullet3: XDrawRectangle(htmlPtr->display, drawable, gc, x - 7 - drawableLeft, y - 8 - drawableTop, 7, 7); TestPoint(0); break; case LI_TYPE_Enum_1: case LI_TYPE_Enum_A: case LI_TYPE_Enum_a: case LI_TYPE_Enum_I: case LI_TYPE_Enum_i: cnt = strlen(zBuf); font = HtmlGetFont(htmlPtr, src->base.style.font); if( font==0 ) return; w = Tk_TextWidth(font, zBuf, cnt); Tk_DrawChars(htmlPtr->display, drawable, gc, font, zBuf, cnt, x - w - drawableLeft, y - drawableTop); TestPoint(0); break; } break; case Html_HR: { int relief = htmlPtr->ruleRelief; switch( relief ){ case TK_RELIEF_RAISED: case TK_RELIEF_SUNKEN: break; default: relief = TK_RELIEF_FLAT; break; } HtmlDrawRect(htmlPtr, drawable, src, src->hr.x - drawableLeft, src->hr.y - drawableTop, src->hr.w, src->hr.h, 1, relief); break; } case Html_TABLE: { int relief = htmlPtr->tableRelief; switch( relief ){ case TK_RELIEF_RAISED: case TK_RELIEF_SUNKEN: break; default: relief = TK_RELIEF_FLAT; break; } HtmlDrawRect(htmlPtr, drawable, src, src->table.x - drawableLeft, src->table.y - drawableTop, src->table.w, src->table.h, src->table.borderWidth, relief); break; } case Html_TH: case Html_TD: { int depth, relief; pTable = src->cell.pTable; depth = pTable && pTable->table.borderWidth>0; switch( htmlPtr->tableRelief ){ case TK_RELIEF_RAISED: relief = TK_RELIEF_SUNKEN; break; case TK_RELIEF_SUNKEN: relief = TK_RELIEF_RAISED; break; default: relief = TK_RELIEF_FLAT; break; } HtmlDrawRect(htmlPtr, drawable, src, src->cell.x - drawableLeft, src->cell.y - drawableTop, src->cell.w, src->cell.h, depth, relief); break; } case Html_IMG: if( src->image.pImage ){ HtmlDrawImage(src, drawable, drawableLeft, drawableTop, drawableLeft + drawableWidth, drawableTop + drawableHeight); }else if( src->image.zAlt ){ gc = HtmlGetGC(htmlPtr, src->base.style.color, src->base.style.font); font = HtmlGetFont(htmlPtr, src->base.style.font); if( font==0 ) return; Tk_DrawChars(htmlPtr->display, drawable, gc, font, src->image.zAlt, strlen(src->image.zAlt), src->image.x - drawableLeft, src->image.y - drawableTop); TestPoint(0); } break; default: TestPoint(0); break; } } } /* ** Draw all or part of an image. */ void HtmlDrawImage( HtmlElement *pElem, /* The <IMG> to be drawn */ Drawable drawable, /* Draw it here */ int drawableLeft, /* left edge of the drawable */ int drawableTop, /* Virtual canvas coordinate for top of drawable */ int drawableRight, /* right edge of the drawable */ int drawableBottom /* bottom edge of the drawable */ ){ int imageTop; /* virtual canvas coordinate for top of image */ int x, y; /* where to place image on the drawable */ int imageX, imageY; /* \__ Subset of image that fits */ int imageW, imageH; /* / on the drawable */ imageTop = pElem->image.y - pElem->image.ascent; y = imageTop - drawableTop; if( imageTop + pElem->image.h > drawableBottom ){ imageH = drawableBottom - imageTop; TestPoint(0); }else{ imageH = pElem->image.h; TestPoint(0); } if( y<0 ){ imageY = -y; imageH += y; y = 0; TestPoint(0); }else{ imageY = 0; TestPoint(0); } x = pElem->image.x - drawableLeft; if( pElem->image.x + pElem->image.w > drawableRight ){ imageW = drawableRight - pElem->image.x; TestPoint(0); }else{ imageW = pElem->image.w; TestPoint(0); } if( x<0 ){ imageX = -x; imageW += x; x = 0; TestPoint(0); }else{ imageX = 0; TestPoint(0); } Tk_RedrawImage(pElem->image.pImage->image, imageX, imageY, imageW, imageH, drawable, x, y); pElem->image.redrawNeeded = 0; } /* ** Recompute the following fields of the given block structure: ** ** base.count The number of elements described by this ** block structure. ** ** n The number of characters of text output ** associated with this block. If the block ** renders something other than text (ex: <IMG>) ** then set n to 0. ** ** z Pointer to malloced memory containing the ** text associated with this block. NULL if ** n is 0. ** ** Return a pointer to the first HtmlElement not covered by the ** block. */ static HtmlElement *FillOutBlock(HtmlWidget *htmlPtr, HtmlBlock *p){ HtmlElement *pElem; int go; int n; int x, y; int i; HtmlStyle style; int firstSelected; /* First selected character in this block */ int lastSelected; /* Last selected character in this block */ char zBuf[400]; /* ** Reset n and z */ if( p->n ){ p->n = 0; } if( p->z ){ HtmlFree(p->z); } firstSelected = 1000000; lastSelected = -1; /* ** Skip over HtmlElements that aren't directly displayed. */ pElem = p->base.pNext; p->base.count = 0; while( pElem && (pElem->base.flags & HTML_Visible)==0 ){ HtmlElement *pNext = pElem->pNext; if( pElem->base.type==Html_Block ){ UnlinkAndFreeBlock(htmlPtr, &pElem->block); TestPoint(0); }else{ p->base.count++; TestPoint(0); } pElem = pNext; } if( pElem==0 ){ TestPoint(0); return 0; } /* ** Handle "special" elements. */ if( pElem->base.type!=Html_Text ){ switch( pElem->base.type ){ case Html_HR: p->top = pElem->hr.y - pElem->hr.h; p->bottom = pElem->hr.y; p->left = pElem->hr.x; p->right = pElem->hr.x + pElem->hr.w; TestPoint(0); break; case Html_LI: p->top = pElem->li.y - pElem->li.ascent; p->bottom = pElem->li.y + pElem->li.descent; p->left = pElem->li.x - 10; p->right = pElem->li.x + 10; TestPoint(0); break; case Html_TD: case Html_TH: p->top = pElem->cell.y; p->bottom = pElem->cell.y + pElem->cell.h; p->left = pElem->cell.x; p->right = pElem->cell.x + pElem->cell.w; TestPoint(0); break; case Html_TABLE: p->top = pElem->table.y; p->bottom = pElem->table.y + pElem->table.h; p->left = pElem->table.x; p->right = pElem->table.x + pElem->table.w; TestPoint(0); break; case Html_IMG: p->top = pElem->image.y - pElem->image.ascent; p->bottom = pElem->image.y + pElem->image.descent; p->left = pElem->image.x; p->right = pElem->image.x + pElem->image.w; TestPoint(0); break; } p->base.count++; TestPoint(0); return pElem->pNext; } /* ** If we get this far, we must be dealing with text. */ n = 0; x = pElem->text.x; y = pElem->text.y; p->top = y - pElem->text.ascent; p->bottom = y + pElem->text.descent; p->left = x; style = pElem->base.style; go = 1; while( pElem ){ HtmlElement *pNext = pElem->pNext; switch( pElem->base.type ){ case Html_Text: if( pElem->base.style.flags & STY_Invisible ){ TestPoint(0); break; } if( pElem->text.spaceWidth <=0 ){ CANT_HAPPEN; break; } if( y != pElem->text.y || style.font != pElem->base.style.font || style.color != pElem->base.style.color || (style.flags & STY_FontMask) != (pElem->base.style.flags & STY_FontMask) ){ go = 0; TestPoint(0); }else{ int sw = pElem->text.spaceWidth; int nSpace = (pElem->text.x - x) / sw; if( nSpace * sw + x != pElem->text.x ){ go = 0; TestPoint(0); }else if( n + nSpace + pElem->base.count >= sizeof(zBuf) ){ go = 0; TestPoint(0); }else{ for(i=0; i<nSpace; i++){ zBuf[n++] = ' '; TestPoint(0); } strcpy(&zBuf[n], pElem->text.zText); n += pElem->base.count; x = pElem->text.x + pElem->text.w; } } break; case Html_Space: if( pElem->base.style.font != style.font ){ pElem = pElem->pNext; go = 0; }else if( (style.flags & STY_Preformatted)!=0 && (pElem->base.flags & HTML_NewLine)!=0 ){ pElem = pElem->pNext; go = 0; } break; case Html_Block: UnlinkAndFreeBlock(htmlPtr,&pElem->block); break; case Html_A: case Html_EndA: go = 0; break; default: if( pElem->base.flags & HTML_Visible ) go = 0; TestPoint(0); break; } if( go==0 ) break; p->base.count++; pElem = pNext; } p->right = x; while( n>0 && zBuf[n-1]==' ' ){ TestPoint(0); n--; } p->z = HtmlAlloc( n ); strncpy(p->z, zBuf, n); p->n = n; return pElem; } /* ** Scan ahead looking for a place to put a block. Return a pointer ** to the element which should come immediately after the block. ** ** if pCnt!=0, then put the number of elements skipped in *pCnt. */ static HtmlElement *FindStartOfNextBlock( HtmlWidget *htmlPtr, /* The HTML widget */ HtmlElement *p, /* First candid for the start of a block */ int *pCnt /* Write number of elements skipped here */ ){ int cnt = 0; while( p && (p->base.flags & HTML_Visible)==0 ){ HtmlElement *pNext = p->pNext; if( p->base.type==Html_Block ){ UnlinkAndFreeBlock(htmlPtr, &p->block); }else{ cnt++; } p = pNext; } if( pCnt ){ *pCnt = cnt; } return p; } /* ** Add additional blocks to the block list in order to cover ** all elements on the element list. ** ** If any old blocks are found on the element list, they must ** be left over from a prior rendering. Unlink and delete them. */ void HtmlFormBlocks(HtmlWidget *htmlPtr){ HtmlElement *pElem; if( htmlPtr->lastBlock ){ pElem = FillOutBlock(htmlPtr, htmlPtr->lastBlock); }else{ pElem = htmlPtr->pFirst; } while( pElem ){ int cnt; pElem = FindStartOfNextBlock(htmlPtr, pElem, &cnt); if( pElem ){ HtmlBlock *pNew = AllocBlock(); if( htmlPtr->lastBlock ){ htmlPtr->lastBlock->base.count += cnt; } AppendBlock(htmlPtr, pElem, pNew); pElem = FillOutBlock(htmlPtr, pNew); } } } �����������������������������saods9/tkhtml1.0/src/htmldraw.h���������������������������������������������������������������������000644 �000765 �000000 �00000056233 12547026202 016701� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlWidget HtmlWidget; void HtmlFormBlocks(HtmlWidget *htmlPtr); #define Html_EndA 6 #define Html_A 5 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define STY_Preformatted 0x001 #define Html_Space 2 #define STY_StrikeThru 0x002 #define STY_Underline 0x004 #define STY_FontMask (STY_StrikeThru|STY_Underline) #define STY_Invisible 0x040 typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef union HtmlElement HtmlElement; void HtmlDrawImage(HtmlElement *pElem,Drawable drawable,int drawableLeft,int drawableTop,int drawableRight,int drawableBottom); #define Html_IMG 76 #define Html_TD 131 #define Html_TH 135 #define Html_TABLE 129 #define Html_HR 70 #define LI_TYPE_Bullet3 3 /* A hollow square */ #define LI_TYPE_Bullet2 2 /* A hollow circle */ #define LI_TYPE_Bullet1 1 /* A solid circle */ #define LI_TYPE_Undefined 0 /* If in HtmlLi, use the HtmlListStart value */ #define LI_TYPE_Enum_i 8 /* Lower-case roman numerals */ #define LI_TYPE_Enum_I 7 /* Capitalized roman numerals */ #define LI_TYPE_Enum_a 6 /* a, b, c, ... */ #define LI_TYPE_Enum_A 5 /* A, B, C, ... */ #define LI_TYPE_Enum_1 4 /* Arabic numbers */ #define Html_LI 81 int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif #define HTML_Visible 0x01 /* This element produces "ink" */ typedef struct HtmlBlock HtmlBlock; void HtmlBlockDraw(HtmlWidget *htmlPtr,HtmlBlock *pBlock,Drawable drawable,int drawableLeft,int drawableTop,int drawableWidth,int drawableHeight); int HtmlGetDarkShadowColor(HtmlWidget *htmlPtr,int iBgColor); int HtmlGetLightShadowColor(HtmlWidget *htmlPtr,int iBgColor); #define FONT_Any -1 #define COLOR_Selection 3 /* Background color for the selection */ GC HtmlGetGC(HtmlWidget *htmlPtr,int color,int font); #define Html_Text 1 Tk_Font HtmlGetFont(HtmlWidget *htmlPtr,int iFont); #define HTML_Selected 0x04 /* Some or all of this Html_Block is selected */ typedef struct HtmlBaseElement HtmlBaseElement; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; #define HtmlFree(A) Tcl_Free((char*)(A)) #define Html_Block 4 #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlexts.c���������������������������������������������������������������������000644 �000765 �000000 �00000005754 12547267111 016732� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The extra routines for the HTML widget for Tcl/Tk ** ** Copyright (C) 1997-2000 Peter MacDonald and BrowseX Systems Inc. ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** peter@browsex.com ** http://browsex.com */ #include <tk.h> #include <string.h> #include <stdlib.h> #include "htmlexts.h" void HtmlTclizeAscii(Tcl_Interp *interp, HtmlIndex *s, HtmlIndex *e); /* ** WIDGET text ascii START END */ int HtmlTextAsciiCmd( HtmlWidget *htmlPtr, /* The HTML widget */ Tcl_Interp *interp, /* The interpreter */ int argc, /* Number of arguments */ const char **argv /* List of all arguments */ ){ HtmlIndex iStart, iEnd; char *cb, *ce; if (argc<=3) cb="begin"; else cb=(char*)argv[3]; if (argc<=4) ce=cb; else ce=(char*)argv[4]; if( HtmlGetIndex(htmlPtr, cb, &iStart.p, &iStart.i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", cb, "\"", 0); return TCL_ERROR; } if( HtmlGetIndex(htmlPtr, ce, &iEnd.p, &iEnd.i)!=0 ){ Tcl_AppendResult(interp,"malformed index: \"", ce, "\"", 0); return TCL_ERROR; } if (iEnd.p && iStart.p) { if ((!iEnd.i) && (!strchr(ce,'.'))) { iEnd.p=iEnd.p->pNext; } HtmlTclizeAscii(interp,&iStart,&iEnd); } return TCL_OK; } /* ** Return all tokens between the two elements as a Text. */ void HtmlTclizeAscii(Tcl_Interp *interp, HtmlIndex *s, HtmlIndex *e){ int j, nsub=0; HtmlElement* p=s->p; Tcl_DString str; if (p && p->base.type==Html_Text) { nsub=s->i; } Tcl_DStringInit(&str); while( p) { switch( p->base.type ){ case Html_Block: break; case Html_Text: j=strlen(p->text.zText); if (j<nsub) nsub=j; if (p==e->p) { j= (e->i-nsub+1); } Tcl_DStringAppend(&str, p->text.zText+nsub,j-nsub); nsub=0; break; case Html_Space: for (j=0; j< p->base.count; j++) { if (nsub-->0) continue; Tcl_DStringAppend(&str, " ", 1); } if ((p->base.flags & HTML_NewLine)!=0) Tcl_DStringAppend(&str, "\n",1); nsub=0; break; case Html_P: case Html_BR: Tcl_DStringAppend(&str, "\n",1); break; case Html_Unknown: break; default: break; } if (p==e->p) break; p = p->pNext; } Tcl_DStringResult(interp, &str); } ��������������������saods9/tkhtml1.0/src/htmlexts.h���������������������������������������������������������������������000644 �000765 �000000 �00000052403 12547267111 016730� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ #define Html_Unknown 3 #define Html_BR 24 #define Html_P 104 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define Html_Space 2 #define Html_Block 4 #define Html_Text 1 typedef union HtmlElement HtmlElement; typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; typedef struct HtmlWidget HtmlWidget; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; int HtmlGetIndex(HtmlWidget *htmlPtr,const char *zIndex,HtmlElement **ppToken,int *pIndex); typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; int HtmlTextAsciiCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); void HtmlTclizeAscii(Tcl_Interp *interp,HtmlIndex *s,HtmlIndex *e); void HtmlTclizeAscii(Tcl_Interp *interp,HtmlIndex *s,HtmlIndex *e); struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlform.c���������������������������������������������������������������������000644 �000765 �000000 �00000045015 12547267111 016704� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines used for processing HTML makeup for forms. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> #include "htmlform.h" /* ** Unmap any input control that is currently mapped. */ void HtmlUnmapControls(HtmlWidget *htmlPtr){ HtmlElement *p; for(p=htmlPtr->firstInput; p; p=p->input.pNext){ if( p->input.tkwin!=0 && Tk_IsMapped(p->input.tkwin) ){ Tk_UnmapWindow(p->input.tkwin); } } } /* ** Map any control that should be visible according to the ** current scroll position. At the same time, if any controls that ** should not be visible are mapped, unmap them. After this routine ** finishes, all <INPUT> controls should be in their proper places ** regardless of where they might have been before. ** ** Return the number of controls that are currently visible. */ int HtmlMapControls(HtmlWidget *htmlPtr){ HtmlElement *p; /* For looping over all controls */ int x, y, w, h; /* Part of the virtual canvas that is visible */ int cnt = 0; /* Number of visible controls */ x = htmlPtr->xOffset; y = htmlPtr->yOffset; w = Tk_Width(htmlPtr->clipwin); h = Tk_Height(htmlPtr->clipwin); for(p=htmlPtr->firstInput; p; p=p->input.pNext){ if( p->input.tkwin==0 ) continue; if( p->input.y < y+h && p->input.y + p->input.h > y && p->input.x < x+w && p->input.x + p->input.w > x ){ /* The control should be visible. Make is so if it isn't already */ Tk_MoveResizeWindow(p->input.tkwin, p->input.x - x, p->input.y - y, p->input.w, p->input.h); if( !Tk_IsMapped(p->input.tkwin) ){ Tk_MapWindow(p->input.tkwin); } cnt++; }else{ /* This control should not be visible. Unmap it. */ if( Tk_IsMapped(p->input.tkwin) ){ Tk_UnmapWindow(p->input.tkwin); } } } return cnt; } /* ** Delete all input controls. This happens when the HTML widget ** is cleared. ** ** When the TCL "exit" command is invoked, the order of operations ** here is very touchy. */ void HtmlDeleteControls(HtmlWidget *htmlPtr){ HtmlElement *p; /* For looping over all controls */ Tcl_Interp *interp; /* The interpreter */ interp = htmlPtr->interp; p = htmlPtr->firstInput; htmlPtr->firstInput = 0; htmlPtr->lastInput = 0; htmlPtr->nInput = 0; if( p==0 || htmlPtr->tkwin==0 ) return; HtmlLock(htmlPtr); for(; p; p=p->input.pNext){ if( p->input.pForm && p->input.pForm->form.id>0 && htmlPtr->zFormCommand && htmlPtr->zFormCommand[0] && !Tcl_InterpDeleted(interp) && htmlPtr->clipwin ){ Tcl_DString cmd; int result; char zBuf[60]; Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zFormCommand, -1); sprintf(zBuf," %d flush", p->input.pForm->form.id); Tcl_DStringAppend(&cmd, zBuf, -1); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( !Tcl_InterpDeleted(interp) ){ if( result != TCL_OK ){ Tcl_AddErrorInfo(htmlPtr->interp, "\n (-formcommand flush callback executed by html widget)"); Tcl_BackgroundError(htmlPtr->interp); TestPoint(0); } Tcl_ResetResult(htmlPtr->interp); } p->input.pForm->form.id = 0; } if( p->input.tkwin ){ if( htmlPtr->clipwin!=0 ) Tk_DestroyWindow(p->input.tkwin); p->input.tkwin = 0; } p->input.sized = 0; } HtmlUnlock(htmlPtr); } /* ** Return an appropriate type value for the given <INPUT> markup. */ static int InputType(HtmlElement *p){ int type = INPUT_TYPE_Unknown; char *z; int i; static struct { char *zName; int type; } types[] = { { "checkbox", INPUT_TYPE_Checkbox }, { "file", INPUT_TYPE_File }, { "hidden", INPUT_TYPE_Hidden }, { "image", INPUT_TYPE_Image }, { "password", INPUT_TYPE_Password }, { "radio", INPUT_TYPE_Radio }, { "reset", INPUT_TYPE_Reset }, { "submit", INPUT_TYPE_Submit }, { "text", INPUT_TYPE_Text }, }; switch( p->base.type ){ case Html_INPUT: z = HtmlMarkupArg(p, "type", "text"); if( z==0 ){ TestPoint(0); break; } for(i=0; i<sizeof(types)/sizeof(types[0]); i++){ if( stricmp(types[i].zName,z)==0 ){ type = types[i].type; TestPoint(0); break; } TestPoint(0); } break; case Html_SELECT: type = INPUT_TYPE_Select; TestPoint(0); break; case Html_TEXTAREA: type = INPUT_TYPE_TextArea; TestPoint(0); break; case Html_APPLET: case Html_IFRAME: case Html_EMBED: type = INPUT_TYPE_Applet; TestPoint(0); break; default: CANT_HAPPEN; break; } return type; } /* ** Create the window name for a child widget. Space to hold the name ** is obtained from HtmlAlloc() and must be freed by the calling function. */ static char *MakeWindowName( HtmlWidget *htmlPtr, /* The HTML widget */ HtmlElement *pElem /* The input that needs a child widget */ ){ int n; char *zBuf; n = strlen(Tk_PathName(htmlPtr->clipwin)); zBuf = HtmlAlloc( n + 20 ); sprintf(zBuf,"%s.x%d",Tk_PathName(htmlPtr->clipwin), pElem->input.cnt); return zBuf; } /* ** A Input element is the input. Mark this element as being ** empty. It has no widget and doesn't appear on the screen. ** ** This is called for HIDDEN inputs or when the -formcommand ** callback doesn't create the widget. */ static void EmptyInput(HtmlElement *pElem){ pElem->input.tkwin = 0; pElem->input.w = 0; pElem->input.h = 0; pElem->base.flags &= !HTML_Visible; pElem->base.style.flags |= STY_Invisible; pElem->input.sized = 1; } /* ** This routine is called when one of the child windows for a form ** wants to change its size. */ static void HtmlInputRequestProc(ClientData clientData, Tk_Window tkwin){ HtmlElement *pElem = (HtmlElement*)clientData; if( pElem->base.type!=Html_INPUT ){ CANT_HAPPEN; return; } if( pElem->input.tkwin!=tkwin ){ CANT_HAPPEN; return; } pElem->input.w = Tk_ReqWidth(tkwin); pElem->input.h = Tk_ReqHeight(tkwin); if( pElem->input.htmlPtr && pElem->input.htmlPtr->tkwin!=0 ){ pElem->input.htmlPtr->flags |= RELAYOUT; HtmlScheduleRedraw(pElem->input.htmlPtr); } } /* ** This routine is called when another entity takes over geometry ** management for a widget corresponding to an input element. */ static void HtmlInputLostSlaveProc(ClientData clientData, Tk_Window tkwin){ HtmlElement *pElem = (HtmlElement*)clientData; if( pElem->base.type!=Html_INPUT ){ CANT_HAPPEN; return; } if( pElem->input.tkwin!=tkwin ){ CANT_HAPPEN; return; } EmptyInput(pElem); if( pElem->input.htmlPtr && pElem->input.htmlPtr->tkwin!=0 ){ pElem->input.htmlPtr->flags |= RELAYOUT; HtmlScheduleRedraw(pElem->input.htmlPtr); } } /* ** This routine catches DestroyNotify events on a INPUT window so ** that we will know the window is been deleted. */ static void HtmlInputEventProc(ClientData clientData, XEvent *eventPtr){ HtmlElement *pElem = (HtmlElement*)clientData; /* if( pElem->base.type!=Html_INPUT ){ CANT_HAPPEN; return; } */ if( eventPtr->type==DestroyNotify ){ EmptyInput(pElem); if( pElem->input.htmlPtr && pElem->input.htmlPtr->tkwin!=0 ){ pElem->input.htmlPtr->flags |= RELAYOUT; HtmlScheduleRedraw(pElem->input.htmlPtr); } } } /* ** The geometry manager for the HTML widget */ static Tk_GeomMgr htmlGeomType = { "html", /* Name */ HtmlInputRequestProc, /* Called when widget changes size */ HtmlInputLostSlaveProc, /* Called when someone else takes over management */ }; /* ** zWin is the name of a child widget that is used to implement an ** input element. Query Tk for information about this widget (such ** as its size) and put that information in the pElem structure ** that represents the input. */ static void SizeAndLink(HtmlWidget *htmlPtr, char *zWin, HtmlElement *pElem){ pElem->input.tkwin = Tk_NameToWindow(htmlPtr->interp, zWin, htmlPtr->clipwin); if( pElem->input.tkwin==0 ){ Tcl_ResetResult(htmlPtr->interp); EmptyInput(pElem); }else if( pElem->input.type==INPUT_TYPE_Hidden ){ pElem->input.w = 0; pElem->input.h = 0; pElem->base.flags &= !HTML_Visible; pElem->base.style.flags |= STY_Invisible; }else{ pElem->input.w = Tk_ReqWidth(pElem->input.tkwin); pElem->input.h = Tk_ReqHeight(pElem->input.tkwin); pElem->base.flags |= HTML_Visible; pElem->input.htmlPtr = htmlPtr; Tk_ManageGeometry(pElem->input.tkwin, &htmlGeomType, pElem); Tk_CreateEventHandler(pElem->input.tkwin, StructureNotifyMask, HtmlInputEventProc, pElem); } pElem->input.pNext = 0; if( htmlPtr->firstInput==0 ){ htmlPtr->firstInput = pElem; }else{ htmlPtr->lastInput->input.pNext = pElem; } htmlPtr->lastInput = pElem; pElem->input.sized = 1; } /* Append all text and space tokens between pStart and pEnd to ** the given Tcl_DString. */ static void HtmlAppendText( Tcl_DString *str, /* Append the text here */ HtmlElement *pFirst, /* The first token */ HtmlElement *pEnd /* The last token */ ){ while( pFirst && pFirst!=pEnd ){ switch( pFirst->base.type ){ case Html_Text: { Tcl_DStringAppend(str, pFirst->text.zText, -1); break; } case Html_Space: { if( pFirst->base.flags & HTML_NewLine ){ Tcl_DStringAppend(str, "\n", 1); }else{ int cnt; static char zSpaces[] = " "; cnt = pFirst->base.count; while( cnt>sizeof(zSpaces)-1 ){ Tcl_DStringAppend(str, zSpaces, sizeof(zSpaces)-1); cnt -= sizeof(zSpaces)-1; } if( cnt>0 ){ Tcl_DStringAppend(str, zSpaces, cnt); } } break; } default: /* Do nothing */ break; } pFirst = pFirst->pNext; } } /* ** The "p" argument points to a <select>. This routine scans all ** subsequent elements (up to the next </select>) looking for ** <option> tags. For each option tag, it appends three elements ** to the "str" DString: ** ** * 1 or 0 to indicated whether or not the element is ** selected. ** ** * The value returned if this element is selected. ** ** * The text displayed for this element. */ static void AddSelectOptions( Tcl_DString *str, /* Add text here */ HtmlElement *p, /* The <SELECT> markup */ HtmlElement *pEnd /* The </SELECT> markup */ ){ while( p && p!=pEnd && p->base.type!=Html_EndSELECT ){ if( p->base.type==Html_OPTION ){ char *zValue; Tcl_DStringStartSublist(str); if( HtmlMarkupArg(p, "selected", 0)==0 ){ Tcl_DStringAppend(str, "0 ", 2); }else{ Tcl_DStringAppend(str, "1 ", 2); } zValue = HtmlMarkupArg(p, "value", ""); Tcl_DStringAppendElement(str, zValue); Tcl_DStringStartSublist(str); p = p->pNext; while( p && p!=pEnd && p->base.type!=Html_EndOPTION && p->base.type!=Html_OPTION && p->base.type!=Html_EndSELECT ){ if( p->base.type==Html_Text ){ Tcl_DStringAppend(str, p->text.zText, -1); }else if( p->base.type==Html_Space ){ Tcl_DStringAppend(str, " ", 1); } p = p->pNext; } Tcl_DStringEndSublist(str); Tcl_DStringEndSublist(str); }else{ p = p->pNext; } } } /* ** This routine implements the Sizer() function for <INPUT>, ** <SELECT> and <TEXTAREA> markup. ** ** A side effect of sizing these markups is that widgets are ** created to represent the corresponding input controls. ** ** The function normally returns 0. But if it is dealing with ** a <SELECT> or <TEXTAREA> that is incomplete, 1 is returned. ** In that case, the sizer will be called again at some point in ** the future when more information is available. */ int HtmlControlSize(HtmlWidget *htmlPtr, HtmlElement *pElem){ char *zWin; /* Name of child widget that implements this input */ int incomplete = 0; /* True if data is incomplete */ Tcl_DString cmd; /* The complete -formcommand callback */ if( pElem->input.sized ) return 0; pElem->input.type = InputType(pElem); switch( pElem->input.type ){ case INPUT_TYPE_Checkbox: case INPUT_TYPE_Hidden: case INPUT_TYPE_Image: case INPUT_TYPE_Radio: case INPUT_TYPE_Reset: case INPUT_TYPE_Submit: case INPUT_TYPE_Text: case INPUT_TYPE_Password: case INPUT_TYPE_File: { int result; char zToken[50]; if( pElem->input.pForm==0 || htmlPtr->zFormCommand==0 || htmlPtr->zFormCommand[0]==0 ){ EmptyInput(pElem); break; } Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zFormCommand, -1); sprintf(zToken," %d input ",pElem->input.pForm->form.id); Tcl_DStringAppend(&cmd, zToken, -1); pElem->input.cnt = ++htmlPtr->nInput; zWin = MakeWindowName(htmlPtr, pElem); Tcl_DStringAppend(&cmd, zWin, -1); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, pElem); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( !HtmlUnlock(htmlPtr) ){ SizeAndLink(htmlPtr, zWin, pElem); } HtmlFree(zWin); break; } case INPUT_TYPE_Select: { int result; char zToken[50]; if( pElem->input.pForm==0 || htmlPtr->zFormCommand==0 || htmlPtr->zFormCommand[0]==0 ){ EmptyInput(pElem); break; } Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zFormCommand, -1); sprintf(zToken," %d select ",pElem->input.pForm->form.id); Tcl_DStringAppend(&cmd, zToken, -1); pElem->input.cnt = ++htmlPtr->nInput; zWin = MakeWindowName(htmlPtr, pElem); Tcl_DStringAppend(&cmd, zWin, -1); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, pElem); Tcl_DStringEndSublist(&cmd); Tcl_DStringStartSublist(&cmd); AddSelectOptions(&cmd, pElem, pElem->input.pEnd); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( !HtmlUnlock(htmlPtr) ){ SizeAndLink(htmlPtr, zWin, pElem); } HtmlFree(zWin); break; } case INPUT_TYPE_TextArea: { int result; char zToken[50]; if( pElem->input.pForm==0 || htmlPtr->zFormCommand==0 || htmlPtr->zFormCommand[0]==0 ){ EmptyInput(pElem); break; } Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zFormCommand, -1); sprintf(zToken," %d textarea ",pElem->input.pForm->form.id); Tcl_DStringAppend(&cmd, zToken, -1); pElem->input.cnt = ++htmlPtr->nInput; zWin = MakeWindowName(htmlPtr, pElem); Tcl_DStringAppend(&cmd, zWin, -1); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, pElem); Tcl_DStringEndSublist(&cmd); Tcl_DStringStartSublist(&cmd); HtmlAppendText(&cmd, pElem, pElem->input.pEnd); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( !HtmlUnlock(htmlPtr) ){ SizeAndLink(htmlPtr, zWin, pElem); } HtmlFree(zWin); break; } case INPUT_TYPE_Applet: { int result; if( htmlPtr->zAppletCommand==0 || htmlPtr->zAppletCommand[0]==0 ){ EmptyInput(pElem); break; } Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zAppletCommand, -1); Tcl_DStringAppend(&cmd, " ", 1); pElem->input.cnt = ++htmlPtr->nInput; zWin = MakeWindowName(htmlPtr, pElem); Tcl_DStringAppend(&cmd, zWin, -1); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, pElem); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( !HtmlUnlock(htmlPtr) ){ SizeAndLink(htmlPtr, zWin, pElem); } HtmlFree(zWin); break; } default: { CANT_HAPPEN; pElem->base.flags &= ~HTML_Visible; pElem->base.style.flags |= STY_Invisible; pElem->input.tkwin = 0; break; } } return incomplete; } #if 0 /* ** The following array determines which characters can be put directly ** in a query string and which must be escaped. */ static char needEscape[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, }; #define NeedToEscape(C) ((C)>0 && (C)<127 && needEscape[(int)(C)]) /* ** Append to the given DString, an encoded version of the given ** text. */ static void EncodeText(Tcl_DString *str, char *z){ int i; while( *z ){ for(i=0; z[i] && !NeedToEscape(z[i]); i++){ TestPoint(0); } if( i>0 ){ TestPoint(0); Tcl_DStringAppend(str, z, i); } z += i; while( *z && NeedToEscape(*z) ){ if( *z==' ' ){ Tcl_DStringAppend(str,"+",1); TestPoint(0); }else if( *z=='\n' ){ Tcl_DStringAppend(str, "%0D%0A", 6); TestPoint(0); }else if( *z=='\r' ){ /* Ignore it... */ TestPoint(0); }else{ char zBuf[5]; sprintf(zBuf,"%%%02X",0xff & *z); Tcl_DStringAppend(str, zBuf, 3); TestPoint(0); } z++; } } } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlform.h���������������������������������������������������������������������000644 �000765 �000000 �00000055250 12547026202 016705� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ #define HtmlFree(A) Tcl_Free((char*)(A)) typedef union HtmlElement HtmlElement; void HtmlAppendArglist(Tcl_DString *str,HtmlElement *pElem); typedef struct HtmlWidget HtmlWidget; int HtmlControlSize(HtmlWidget *htmlPtr,HtmlElement *pElem); #define Html_EndOPTION 103 #define Html_OPTION 102 #define Html_EndSELECT 117 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define Html_Space 2 #define Html_Text 1 void HtmlScheduleRedraw(HtmlWidget *htmlPtr); #define RELAYOUT 0x000010 #define STY_Invisible 0x040 #define HTML_Visible 0x01 /* This element produces "ink" */ #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif #define INPUT_TYPE_Applet 12 #define Html_EMBED 49 #define Html_IFRAME 75 #define Html_APPLET 9 #define INPUT_TYPE_TextArea 11 #define Html_TEXTAREA 133 #define INPUT_TYPE_Select 8 #define Html_SELECT 116 #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define Html_INPUT 77 #define INPUT_TYPE_Text 10 #define INPUT_TYPE_Submit 9 #define INPUT_TYPE_Reset 7 #define INPUT_TYPE_Radio 6 #define INPUT_TYPE_Password 5 #define INPUT_TYPE_Image 4 #define INPUT_TYPE_Hidden 3 #define INPUT_TYPE_File 2 #define INPUT_TYPE_Checkbox 1 #define INPUT_TYPE_Unknown 0 int HtmlUnlock(HtmlWidget *htmlPtr); #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif void HtmlLock(HtmlWidget *htmlPtr); void HtmlDeleteControls(HtmlWidget *htmlPtr); int HtmlMapControls(HtmlWidget *htmlPtr); typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; void HtmlUnmapControls(HtmlWidget *htmlPtr); struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlimage.c��������������������������������������������������������������������000644 �000765 �000000 �00000015305 12547267111 017022� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines used for processing <IMG> markup ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <string.h> #include <stdlib.h> #include "htmlimage.h" /* ** Find the alignment for an image */ int HtmlGetImageAlignment(HtmlElement *p){ char *z; int i; int result; static struct { char *zName; int iValue; } aligns[] = { { "bottom", IMAGE_ALIGN_Bottom }, { "baseline", IMAGE_ALIGN_Bottom }, { "middle", IMAGE_ALIGN_Middle }, { "top", IMAGE_ALIGN_Top }, { "absbottom", IMAGE_ALIGN_AbsBottom }, { "absmiddle", IMAGE_ALIGN_AbsMiddle }, { "texttop", IMAGE_ALIGN_TextTop }, { "left", IMAGE_ALIGN_Left }, { "right", IMAGE_ALIGN_Right }, }; z = HtmlMarkupArg(p, "align", 0); result = IMAGE_ALIGN_Bottom; if( z ){ for(i=0; i<sizeof(aligns)/sizeof(aligns[0]); i++){ if( stricmp(aligns[i].zName,z)==0 ){ result = aligns[i].iValue; TestPoint(0); break; }else{ TestPoint(0); } } }else{ TestPoint(0); } return result; } /* ** This routine is called when an image changes. If the size of the ** images changes, then we need to completely redo the layout. If ** only the appearance changes, then this works like an expose event. */ static void ImageChangeProc( ClientData clientData, /* Pointer to an HtmlImage structure */ int x, /* Left edge of region that changed */ int y, /* Top edge of region that changed */ int w, /* Width of region that changes. Maybe 0 */ int h, /* Height of region that changed. Maybe 0 */ int newWidth, /* New width of the image */ int newHeight /* New height of the image */ ){ HtmlImage *pImage; HtmlWidget *htmlPtr; HtmlElement *pElem; pImage = (HtmlImage*)clientData; htmlPtr = pImage->htmlPtr; if( pImage->w!=newWidth || pImage->h!=newHeight ){ /* We have to completely redo the layout after adjusting the size ** of the images */ for(pElem = pImage->pList; pElem; pElem = pElem->image.pNext){ pElem->image.w = newWidth; pElem->image.h = newHeight; TestPoint(0); } htmlPtr->flags |= RELAYOUT; pImage->w = newWidth; pImage->h = newHeight; HtmlRedrawEverything(htmlPtr); }else{ for(pElem = pImage->pList; pElem; pElem = pElem->image.pNext){ pElem->image.redrawNeeded = 1; } htmlPtr->flags |= REDRAW_IMAGES; HtmlScheduleRedraw(htmlPtr); } } /* ** Append all the arguments of the given markup to the given ** DString. ** ** Example: If the markup is <IMG SRC=image.gif ALT="hello!"> ** then the following text is appended to the DString: ** ** "src image.gif alt hello!" ** ** Notice how all attribute names are converted to lower case. ** This conversion happens in the parser. */ void HtmlAppendArglist(Tcl_DString *str, HtmlElement *pElem){ int i; for(i=0; i+1<pElem->base.count; i+=2){ char *z = pElem->markup.argv[i+1]; Tcl_DStringAppendElement(str, pElem->markup.argv[i]); Tcl_DStringAppendElement(str, z); } } /* ** Given an <IMG> markup, find or create an appropriate HtmlImage ** structure and return a pointer to that structure. NULL might ** be returned. ** ** This routine may invoke a callback procedure which could delete ** the HTML widget. Use HtmlLock() if necessary to preserve the ** widget structure. */ HtmlImage *HtmlGetImage(HtmlWidget *htmlPtr, HtmlElement *p){ char *zWidth; char *zHeight; char *zSrc; char *zImageName; HtmlImage *pImage; int result; Tcl_DString cmd; int lenSrc, lenW, lenH; /* Lengths of various strings */ if( p->base.type!=Html_IMG ){ CANT_HAPPEN; return 0; } if( htmlPtr->zGetImage==0 || htmlPtr->zGetImage[0]==0 ){ TestPoint(0); return 0; } zSrc = HtmlMarkupArg(p, "src", 0); if( zSrc==0 ){ return 0; } HtmlLock(htmlPtr); zSrc = HtmlResolveUri(htmlPtr, zSrc); if( HtmlUnlock(htmlPtr) || zSrc==0 ) return 0; zWidth = HtmlMarkupArg(p, "width", ""); zHeight = HtmlMarkupArg(p, "height", ""); for(pImage=htmlPtr->imageList; pImage; pImage=pImage->pNext){ if( strcmp(pImage->zUrl,zSrc)==0 && strcmp(pImage->zWidth, zWidth)==0 && strcmp(pImage->zHeight, zHeight)==0 ){ HtmlFree(zSrc); return pImage; } } Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zGetImage, -1); Tcl_DStringAppendElement(&cmd,zSrc); Tcl_DStringAppendElement(&cmd,zWidth); Tcl_DStringAppendElement(&cmd,zHeight); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, p); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( HtmlUnlock(htmlPtr) ){ HtmlFree(zSrc); } zImageName = (char*)Tcl_GetStringResult(htmlPtr->interp); lenSrc = strlen(zSrc); lenW = strlen(zWidth); lenH = strlen(zHeight); pImage = HtmlAlloc( sizeof(HtmlImage) + lenSrc + lenW + lenH + 3 ); memset(pImage,0,sizeof(HtmlImage)); pImage->htmlPtr = htmlPtr; pImage->zUrl = (char*)&pImage[1]; strcpy(pImage->zUrl,zSrc); HtmlFree(zSrc); pImage->zWidth = &pImage->zUrl[lenSrc+1]; strcpy(pImage->zWidth, zWidth); pImage->zHeight = &pImage->zWidth[lenW+1]; strcpy(pImage->zHeight, zHeight); pImage->w = 0; pImage->h = 0; if( result==TCL_OK ){ pImage->image = Tk_GetImage(htmlPtr->interp, htmlPtr->clipwin, zImageName, ImageChangeProc, pImage); TestPoint(0); }else{ Tcl_AddErrorInfo(htmlPtr->interp, "\n (\"-imagecommand\" command executed by html widget)"); Tcl_BackgroundError(htmlPtr->interp); pImage->image = 0; TestPoint(0); } if( pImage->image==0 ){ HtmlFree((char*)pImage); TestPoint(0); return 0; } pImage->pNext = htmlPtr->imageList; htmlPtr->imageList = pImage; TestPoint(0); Tcl_ResetResult(htmlPtr->interp); return pImage; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlimage.h��������������������������������������������������������������������000644 �000765 �000000 �00000054135 12547026202 017025� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) #define HtmlFree(A) Tcl_Free((char*)(A)) typedef struct HtmlWidget HtmlWidget; int HtmlUnlock(HtmlWidget *htmlPtr); char *HtmlResolveUri(HtmlWidget *htmlPtr,char *zUri); void HtmlLock(HtmlWidget *htmlPtr); void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif #define Html_IMG 76 typedef struct HtmlImage HtmlImage; typedef union HtmlElement HtmlElement; HtmlImage *HtmlGetImage(HtmlWidget *htmlPtr,HtmlElement *p); void HtmlAppendArglist(Tcl_DString *str,HtmlElement *pElem); void HtmlScheduleRedraw(HtmlWidget *htmlPtr); #define REDRAW_IMAGES 0x002000 void HtmlRedrawEverything(HtmlWidget *htmlPtr); #define RELAYOUT 0x000010 typedef struct HtmlBlock HtmlBlock; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef short Html_16; typedef struct HtmlScript HtmlScript; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; typedef unsigned char Html_u8; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; typedef int Html_32; struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define IMAGE_ALIGN_Right 7 #define IMAGE_ALIGN_Left 6 #define IMAGE_ALIGN_TextTop 3 #define IMAGE_ALIGN_AbsMiddle 4 #define IMAGE_ALIGN_AbsBottom 5 #define IMAGE_ALIGN_Top 2 #define IMAGE_ALIGN_Middle 1 #define IMAGE_ALIGN_Bottom 0 typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; int HtmlGetImageAlignment(HtmlElement *p); struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlindex.c��������������������������������������������������������������������000644 �000765 �000000 �00000031267 12547267111 017054� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines that deal with indexes ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <ctype.h> #include <tk.h> #include <string.h> #include "htmlindex.h" /* ** Return a pointer to the Nth HtmlElement in the list. If there ** is no Nth element, return 0 if flag==0 and return either the first ** or last element (whichever is closest) if flag!=0 */ HtmlElement *HtmlTokenByIndex(HtmlWidget *htmlPtr, int N, int flag){ HtmlElement *p; int n; if( N > htmlPtr->nToken/2 ){ /* Start at the end and work back toward the beginning */ for(p=htmlPtr->pLast, n=htmlPtr->nToken; p; p=p->base.pPrev){ if( p->base.type!=Html_Block ){ if( n==N ){ TestPoint(0); break; } n--; TestPoint(0); }else{ TestPoint(0); } } }else{ /* Start at the beginning and work forward */ for(p=htmlPtr->pFirst; p; p = p->base.pNext){ if( p->base.type!=Html_Block ){ N--; if( N<=0 ){ TestPoint(0); break; } }else{ TestPoint(0); } } } return p; } /* ** Return the token number for the given HtmlElement */ int HtmlTokenNumber(HtmlElement *p){ int n = 0; while( p ){ if( p->base.type!=Html_Block ){ TestPoint(0); n++; }else{ TestPoint(0); } p = p->base.pPrev; } return n; } /* ** Find the maximum index for the given token */ static void maxIndex(HtmlElement *p, int *pIndex){ if( p==0 ){ *pIndex = 0; TestPoint(0); }else{ switch( p->base.type ){ case Html_Text: *pIndex = p->base.count-1; TestPoint(0); break; case Html_Space: if( p->base.style.flags & STY_Preformatted ){ *pIndex = p->base.count-1; TestPoint(0); }else{ *pIndex = 0; TestPoint(0); } break; default: *pIndex = 0; TestPoint(0); break; } } } /* ** Given a Block and an x coordinate, find the Index of the character ** that is closest to the given x coordinate. ** ** The x-coordinate might specify a point to the left of the block, ** in which case the procedure returns the first token and a character ** index of 0. Or the x-coordinate might specify a point to the right ** of the block, in which case the last token is returned with an index ** equal to its last character. */ static void FindIndexInBlock( HtmlWidget *htmlPtr, /* The widget */ HtmlBlock *pBlock, /* The block */ int x, /* The x coordinate */ HtmlElement **ppToken, /* Write the closest token here */ int *pIndex /* Write the charater index in ppToken here */ ){ HtmlElement *p; Tk_Font font; int len; int n; p = pBlock->base.pNext; HtmlLock(htmlPtr); font = HtmlGetFont(htmlPtr, p->base.style.font); if( HtmlUnlock(htmlPtr) ){ *ppToken = p; *pIndex = 0; return; } if( x <= pBlock->left ){ *ppToken = p; *pIndex = 0; TestPoint(0); return; }else if( x>= pBlock->right ){ *ppToken = p; *pIndex = 0; while( p && p->base.type!=Html_Block ){ *ppToken = p; p = p->base.pNext; TestPoint(0); } p = *ppToken; if( p && p->base.type==Html_Text ){ *pIndex = p->base.count - 1; TestPoint(0); }else{ TestPoint(0); } return; } if( pBlock->n==0 ){ *ppToken = p; *pIndex = 0; TestPoint(0); }else{ TestPoint(0); } n = Tk_MeasureChars(font, pBlock->z, pBlock->n, x - pBlock->left, 0, &len); *pIndex = 0; *ppToken = 0; while( p && n>=0 ){ switch( p->base.type ){ case Html_Text: if( n<p->base.count ){ *pIndex = n; TestPoint(0); }else{ *pIndex = p->base.count - 1; TestPoint(0); } *ppToken = p; n -= p->base.count; break; case Html_Space: if( p->base.style.flags & STY_Preformatted ){ if( n<p->base.count ){ *pIndex = n; TestPoint(0); }else{ *pIndex = p->base.count - 1; TestPoint(0); } *ppToken = p; n -= p->base.count; }else{ *pIndex = 0; *ppToken = p; n--; TestPoint(0); } break; default: TestPoint(0); break; } if( p ){ p = p->base.pNext; TestPoint(0); }else{ TestPoint(0); } } } /* ** Convert an Element-based index into a Block-based index. ** ** In other words, given a pointer to an element and an index ** of a particular character within that element, compute a ** pointer to the HtmlBlock used to display that character and ** the index in the HtmlBlock of the character. */ void HtmlIndexToBlockIndex( HtmlWidget *htmlPtr, /* The widget */ HtmlIndex sIndex, /* The index to be translated */ HtmlBlock **ppBlock, /* Write the corresponding block here */ int *piIndex /* Write the block index here */ ){ int n = sIndex.i; HtmlElement *p; if( sIndex.p==0 ){ *ppBlock = 0; *piIndex = 0; TestPoint(0); return; } p = sIndex.p->base.pPrev; while( p && p->base.type!=Html_Block ){ switch( p->base.type ){ case Html_Text: n += p->base.count; TestPoint(0); break; case Html_Space: if( p->base.style.flags & STY_Preformatted ){ n += p->base.count; TestPoint(0); }else{ n++; TestPoint(0); } break; default: TestPoint(0); break; } p = p->base.pPrev; } if( p ){ *ppBlock = &p->block; *piIndex = n; TestPoint(0); return; } for(p=sIndex.p; p && p->base.type!=Html_Block; p=p->base.pNext){ TestPoint(0); } *ppBlock = &p->block; *piIndex = 0; } /* ** Given a base index name (without any modifiers) return a pointer ** to the token described, and the character within that token. ** ** Valid input forms include: ** ** N.M Token number N (with numbering starting at 1) and ** character number M (with numbering starting at 0). ** ** end The end of all text ** ** N.last Last character of token number N. ** ** sel.first First character of the selection. ** ** sel.last Last character of the selection. ** ** ins The character holding the insertion cursor. ** ** @X,Y The character a location X,Y of the clipping window. ** ** Zero is returned if we are successful and non-zero if there is ** any kind of error. ** ** If the given token doesn't exist (for example if there are only 10 ** tokens and 11.5 is requested) then *ppToken is left pointing to NULL. ** But the function still returns 0 for success. */ static int DecodeBaseIndex( HtmlWidget *htmlPtr, /* The HTML widget we are dealing with */ const char *zBase, /* The base index string */ HtmlElement **ppToken, /* Write the pointer to the token here */ int *pIndex /* Write the character offset here */ ){ int x, y; int n; int i; HtmlElement *p; HtmlBlock *pBlock; HtmlBlock *pNearby; int dist = 1000000; int rc = 0; while( isspace(*zBase) ){ TestPoint(0); zBase++; } switch( *zBase ){ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = sscanf(zBase,"%d.%d",&x,&y); if( n>0 ){ p = *ppToken = HtmlTokenByIndex(htmlPtr, x, 0); TestPoint(0); }else{ TestPoint(0); } if( n==2 ){ *pIndex = y; TestPoint(0); }else{ for(i=1; isdigit(zBase[i]); i++){ TestPoint(0); } if( zBase[i]==0 ){ *pIndex = 0; TestPoint(0); }else if( strcmp(&zBase[i],".last")==0 ){ maxIndex(p,pIndex); TestPoint(0); }else{ rc = 1; TestPoint(0); } } break; case 'e': if( strcmp(zBase,"end")==0 ){ p = *ppToken = htmlPtr->pLast; maxIndex(p,pIndex); TestPoint(0); }else{ rc = 1; TestPoint(0); } break; case 's': if( strcmp(zBase,"sel.first")==0 ){ *ppToken = htmlPtr->selBegin.p; *pIndex = htmlPtr->selBegin.i; TestPoint(0); }else if( strcmp(zBase,"sel.last")==0 ){ *ppToken = htmlPtr->selEnd.p; *pIndex = htmlPtr->selEnd.i; TestPoint(0); }else{ rc = 1; TestPoint(0); } break; case 'i': if( strcmp(zBase,"insert")==0 ){ *ppToken = htmlPtr->ins.p; *pIndex = htmlPtr->ins.i; TestPoint(0); }else{ rc = 1; TestPoint(0); } break; case '@': n = sscanf(zBase,"@%d,%d",&x,&y); if( n!=2 ){ rc = 1; TestPoint(0); break; } x += htmlPtr->xOffset; y += htmlPtr->yOffset; pNearby = 0; *ppToken = htmlPtr->pLast; *pIndex = 0; for(pBlock=htmlPtr->firstBlock; pBlock; pBlock=pBlock->pNext){ int dotest; if( pBlock->n==0 ){ switch( pBlock->base.pNext->base.type ){ case Html_LI: case Html_IMG: case Html_INPUT: case Html_TEXTAREA: case Html_SELECT: dotest = 1; TestPoint(0); break; default: dotest = 0; TestPoint(0); break; } }else{ dotest = 1; TestPoint(0); } if (dotest){ if( pBlock->top <= y && pBlock->bottom >= y ){ if( pBlock->left > x ){ if( pBlock->left - x < dist ){ dist = pBlock->left - x; pNearby = pBlock; TestPoint(0); }else{ TestPoint(0); } }else if( pBlock->right < x ){ if( x - pBlock->right < dist ){ dist = x - pBlock->right; pNearby = pBlock; TestPoint(0); }else{ TestPoint(0); } }else{ HtmlLock(htmlPtr); FindIndexInBlock(htmlPtr, pBlock, x, ppToken, pIndex); if( HtmlUnlock(htmlPtr) ) return 1; TestPoint(0); break; } }else{ int distY; int distX; if( pBlock->bottom < y ){ distY = y - pBlock->bottom; TestPoint(0); }else{ distY = pBlock->top - y; TestPoint(0); } if( pBlock->left > x ){ distX = pBlock->left - x; TestPoint(0); }else if( pBlock->right < x ){ distX = x - pBlock->right; TestPoint(0); }else{ distX = 0; TestPoint(0); } if( distX + 4*distY < dist ){ dist = distX + 4*distY; pNearby = pBlock; TestPoint(0); }else{ TestPoint(0); } } } } if( pBlock==0 ){ if( pNearby ){ HtmlLock(htmlPtr); FindIndexInBlock(htmlPtr, pNearby, x, ppToken, pIndex); if( HtmlUnlock(htmlPtr) ) return 1; TestPoint(0); }else{ TestPoint(0); } }else{ TestPoint(0); } break; default: rc = 1; TestPoint(0); break; } return rc; } /* ** This routine decodes a complete index specification. A complete ** index consists of the base specification followed by modifiers. */ int HtmlGetIndex( HtmlWidget *htmlPtr, /* The widget */ const char *zIndex, /* Complete text of the index spec */ HtmlElement **ppToken, /* Write the pointer to the token here */ int *pIndex /* Write the character offset here */ ){ TestPoint(0); return DecodeBaseIndex(htmlPtr, zIndex, ppToken, pIndex); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlindex.h��������������������������������������������������������������������000644 �000765 �000000 �00000053115 12547267111 017055� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlWidget HtmlWidget; typedef union HtmlElement HtmlElement; int HtmlGetIndex(HtmlWidget *htmlPtr,const char *zIndex,HtmlElement **ppToken,int *pIndex); #define Html_SELECT 116 #define Html_TEXTAREA 133 #define Html_INPUT 77 #define Html_IMG 76 #define Html_LI 81 typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef struct HtmlBlock HtmlBlock; void HtmlIndexToBlockIndex(HtmlWidget *htmlPtr,HtmlIndex sIndex,HtmlBlock **ppBlock,int *piIndex); int HtmlUnlock(HtmlWidget *htmlPtr); Tk_Font HtmlGetFont(HtmlWidget *htmlPtr,int iFont); void HtmlLock(HtmlWidget *htmlPtr); typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef unsigned short Html_u16; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; #define STY_Preformatted 0x001 #define Html_Space 2 #define Html_Text 1 int HtmlTokenNumber(HtmlElement *p); #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define Html_Block 4 typedef struct HtmlScript HtmlScript; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 typedef struct HtmlImage HtmlImage; struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; HtmlElement *HtmlTokenByIndex(HtmlWidget *htmlPtr,int N,int flag); typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmllayout.c�������������������������������������������������������������������000644 �000765 �000000 �00000102756 12547267111 017264� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** This file contains the code used to position elements of the ** HTML file on the screen. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <stdlib.h> #include <string.h> #include "htmllayout.h" /* ** Push a new margin onto the given margin stack. ** ** If the "bottom" parameter is non-negative, then this margin will ** automatically expire for all text that is placed below the y-coordinate ** given by "bottom". This feature is used for <IMG ALIGN=left> ** and <IMG ALIGN=right> kinds of markup. It allows text to flow around ** an image. ** ** If "bottom" is negative, then the margin stays in force until ** it is explicitly canceled by a call to HtmlPopMargin(). */ void HtmlPushMargin( HtmlMargin **ppMargin, /* The margin stack onto which to push */ int indent, /* The indentation for the new margin */ int bottom, /* The margin expires at this Y coordinate */ int tag /* Markup that will cancel this margin */ ){ HtmlMargin *pNew = HtmlAlloc( sizeof(HtmlMargin) ); pNew->pNext = *ppMargin; if( pNew->pNext ){ pNew->indent = indent + pNew->pNext->indent; TestPoint(0); }else{ pNew->indent = indent; TestPoint(0); } pNew->bottom = bottom; pNew->tag = tag; *ppMargin = pNew; } /* ** Pop one margin off of the given margin stack. */ static void HtmlPopOneMargin(HtmlMargin **ppMargin){ if( *ppMargin ){ HtmlMargin *pOld = *ppMargin; *ppMargin = pOld->pNext; HtmlFree(pOld); } } /* ** Pop as many margins as necessary until the margin that was ** created with "tag" is popped off. Update the layout context ** to move past obsticles, if necessary. ** ** If there are some margins on the stack that contain non-negative ** bottom fields, that means there are some obsticles that we have ** not yet cleared. If these margins get popped off the stack, ** then we have to be careful to advance the pLC->bottom value so ** that the next line of text will clear the obsticle. */ static void HtmlPopMargin( HtmlMargin **ppMargin, /* The margin stack to be popped */ int tag, /* The tag we want to pop */ HtmlLayoutContext *pLC /* Update this layout context */ ){ int bottom = -1; int oldTag; HtmlMargin *pM; for(pM=*ppMargin; pM && pM->tag!=tag; pM=pM->pNext){} if( pM==0 ){ /* No matching margin is found. Do nothing. */ return; } while( (pM=*ppMargin)!=0 ){ if( pM->bottom>bottom ){ bottom = pM->bottom; } oldTag = pM->tag; HtmlPopOneMargin(ppMargin); if( oldTag==tag ) break; } if( pLC && pLC->bottom<bottom ){ pLC->headRoom += bottom - pLC->bottom; pLC->bottom = bottom; } } /* ** Pop all expired margins from the stack. ** ** An expired margin is one with a non-negative bottom parameter ** that is less than the value "y". "y" is the Y-coordinate of ** the top edge the next line of text to by positioned. What this ** function does is check to see if we have cleared any obsticles ** (an obsticle is an <IMG ALIGN=left> or <IMG ALIGN=right>) and ** expands the margins if we have. */ static void PopExpiredMargins(HtmlMargin **ppMarginStack, int y){ while( *ppMarginStack && (**ppMarginStack).bottom>=0 && (**ppMarginStack).bottom <= y ){ HtmlPopOneMargin(ppMarginStack); } } /* ** Clear a margin stack to reclaim memory. This routine just blindly ** pops everything off the stack. Typically used when the screen is ** cleared or the widget is deleted, etc. */ void HtmlClearMarginStack(HtmlMargin **ppMargin){ while( *ppMargin ){ HtmlPopOneMargin(ppMargin); } } /* ** This routine gathers as many tokens as will fit on one line. ** ** The candidate tokens begin with pStart and go thru the end of ** the list or to pEnd, whichever comes first. The first token ** at the start of the next line is returned. NULL is returned if ** we exhaust data. ** ** "width" is the maximum allowed width of the line. The actual ** width is returned in *actualWidth. The actual width does not ** include any trailing spaces. Sometimes the actual width will ** be greater than the maximum width. This will happen, for example, ** for text enclosed in <pre>..</pre> that has lines longer than ** the width of the page. ** ** If the list begins with text, at least one token is returned, ** even if that one token is longer than the allowed line length. ** But if the list begins with some kind of break markup (possibly ** preceded by white space) then the returned list may be empty. ** ** The "x" coordinates of all elements are set assuming that the line ** begins at 0. The calling routine should adjust these coordinates ** to position the line horizontally. (The FixLine() procedure does ** this.) Note that the "x" coordinate of <li> elements will be negative. ** Text within <dt>..</dt> might also have a negative "x" coordinate. ** But in no case will the x coordinate every be less than "minX". */ static HtmlElement *GetLine( HtmlLayoutContext *pLC, /* The complete layout context. */ HtmlElement *pStart, /* First token on new line */ HtmlElement *pEnd, /* End of line. Might be NULL */ int width, /* How much space is on this line */ int minX, /* The minimum value of the X coordinate */ int *actualWidth /* Return space actually required */ ){ int x; /* Current X coordinate */ int spaceWanted = 0; /* Add this much space before next token */ HtmlElement *p; /* For looping over tokens */ HtmlElement *lastBreak = 0; /* Last line-break opportunity */ int isEmpty = 1; /* True if link contains nothing */ int origin; /* Initial value of "x" */ *actualWidth = 0; p = pStart; while( p && p!=pEnd && (p->base.style.flags & STY_Invisible)!=0 ){ p = p->pNext; } if( p && p->base.style.flags & STY_DT ){ origin = -HTML_INDENT; }else{ origin = 0; } x = origin; if( x<minX ){ x = minX; } if( p && p!=pEnd && p->base.type==Html_LI ){ p->li.x = x - HTML_INDENT/3; if( p->li.x - (HTML_INDENT*2)/3<minX ){ x += minX - p->li.x + (HTML_INDENT*2)/3; p->li.x = minX + (HTML_INDENT*2)/3; } isEmpty = 0; *actualWidth = 1; p = p->pNext; while( p && (p->base.type==Html_Space || p->base.type==Html_P) ){ p = p->pNext; } } for(; p && p!=pEnd; p=p->pNext){ if( p->base.style.flags & STY_Invisible ){ continue; } switch( p->base.type ){ case Html_Text: p->text.x = x + spaceWanted; if( (p->base.style.flags & STY_Preformatted) == 0 ){ if( lastBreak && x + spaceWanted + p->text.w > width ){ TestPoint(0); return lastBreak; } } TRACE(HtmlTrace_GetLine2, ("Place token %s at x=%d w=%d\n", HtmlTokenName(p), p->text.x, p->text.w)); x += p->text.w + spaceWanted; isEmpty = 0; spaceWanted = 0; break; case Html_Space: if( p->base.style.flags & STY_Preformatted ){ if( p->base.flags & HTML_NewLine ){ *actualWidth = x<=0 ? 1 : x; TestPoint(0); return p->pNext; } x += p->space.w * p->base.count; TestPoint(0); }else{ int w; if( (p->base.style.flags & STY_NoBreak)==0 ){ lastBreak = p->pNext; *actualWidth = x<=0 && !isEmpty ? 1 : x; } w = p->space.w; if( spaceWanted < w && x>origin ){ spaceWanted = w; } } break; case Html_IMG: switch( p->image.align ){ case IMAGE_ALIGN_Left: case IMAGE_ALIGN_Right: *actualWidth = x<=0 && !isEmpty ? 1 : x; return p; default: break; } p->image.x = x + spaceWanted; if( (p->base.style.flags & STY_Preformatted) == 0 ){ if( lastBreak && x + spaceWanted + p->image.w > width ){ TestPoint(0); return lastBreak; } } TRACE(HtmlTrace_GetLine2, ("Place in-line image %s at x=%d w=%d\n", HtmlTokenName(p), p->image.x, p->image.w)); x += p->image.w + spaceWanted; if( (p->base.style.flags & STY_NoBreak)==0 ){ lastBreak = p->pNext; *actualWidth = x<=0 && !isEmpty ? 1 : x; } spaceWanted = 0; isEmpty = 0; break; case Html_APPLET: case Html_EMBED: case Html_INPUT: case Html_SELECT: case Html_TEXTAREA: p->input.x = x + spaceWanted + p->input.padLeft; if( (p->base.style.flags & STY_Preformatted) == 0 ){ if( lastBreak && x + spaceWanted + p->input.w > width ){ TestPoint(0); return lastBreak; } } TRACE(HtmlTrace_GetLine2, ("Place token %s at x=%d w=%d\n", HtmlTokenName(p), p->input.x, p->input.w)); x = p->input.x + p->input.w; if( (p->base.style.flags & STY_NoBreak)==0 ){ lastBreak = p->pNext; *actualWidth = x<=0 && !isEmpty ? 1 : x; } spaceWanted = 0; isEmpty = 0; break; case Html_EndTEXTAREA: if( p->ref.pOther ){ /* HtmlResetTextarea(pLC->htmlPtr, p->ref.pOther); */ } break; case Html_DD: if( p->ref.pOther==0 ) break; if( p->ref.pOther->list.compact==0 || x + spaceWanted >= 0 ){ *actualWidth = x<=0 && !isEmpty ? 1 : x; return p; } x = 0; spaceWanted = 0; break; case Html_WBR: *actualWidth = x<=0 && !isEmpty ? 1 : x; if( x + spaceWanted >= width ){ return p->pNext; }else{ lastBreak = p->pNext; } break; case Html_ADDRESS: case Html_EndADDRESS: case Html_BLOCKQUOTE: case Html_EndBLOCKQUOTE: case Html_BODY: case Html_EndBODY: case Html_BR: case Html_CAPTION: case Html_EndCAPTION: case Html_CENTER: case Html_EndCENTER: case Html_EndDD: case Html_DIV: case Html_EndDIV: case Html_DL: case Html_EndDL: case Html_DT: case Html_H1: case Html_EndH1: case Html_H2: case Html_EndH2: case Html_H3: case Html_EndH3: case Html_H4: case Html_EndH4: case Html_H5: case Html_EndH5: case Html_H6: case Html_EndH6: case Html_EndHTML: case Html_HR: case Html_LI: case Html_LISTING: case Html_EndLISTING: case Html_MENU: case Html_EndMENU: case Html_OL: case Html_EndOL: case Html_P: case Html_EndP: case Html_PRE: case Html_EndPRE: case Html_TABLE: case Html_EndTABLE: case Html_TD: case Html_EndTD: case Html_TH: case Html_EndTH: case Html_TR: case Html_EndTR: case Html_UL: case Html_EndUL: *actualWidth = x<=0 && !isEmpty ? 1 : x; return p; default: break; } } *actualWidth = x<=0 && !isEmpty ? 1 : x; return p; } /* ** Set the y coordinate for every anchor in the given list */ static void FixAnchors(HtmlElement *p, HtmlElement *pEnd, int y){ while( p && p!=pEnd ){ if( p->base.type==Html_A ){ p->anchor.y = y; } p = p->pNext; } } /* ** This routine computes the X and Y coordinates for all elements of ** a line that has been gathered using GetLine() above. It also figures ** the ascent and descent for in-line images. ** ** The value returned is the Y coordinate of the bottom edge of the ** new line. The X coordinates are computed by adding the left margin ** plus any extra space needed for centering or right-justification. */ static int FixLine( HtmlElement *pStart, /* Start of tokens for this line */ HtmlElement *pEnd, /* First token past end of this line. Maybe NULL */ int bottom, /* Put the top of this line here */ int width, /* This is the space available to the line */ int actualWidth, /* This is the actual width needed by the line */ int leftMargin, /* The current left margin */ int *maxX /* Write maximum X coordinate of ink here */ ){ int dx; /* Amount by which to increase all X coordinates */ int maxAscent; /* Maximum height above baseline */ int maxTextAscent; /* Maximum height above baseline for text */ int maxDescent; /* Maximum depth below baseline */ int ascent, descent; /* Computed ascent and descent for one element */ HtmlElement *p; /* For looping */ int y; /* Y coordinate of the baseline */ int dy2center; /* Distance from baseline to text font center */ int max = 0; if( actualWidth>0 ){ for(p=pStart; p && p!=pEnd && p->base.type!=Html_Text; p=p->pNext){} if( p==pEnd || p==0 ) p = pStart; if( p->base.style.align == ALIGN_Center ){ dx = leftMargin + (width - actualWidth)/2; }else if( p->base.style.align == ALIGN_Right ){ dx = leftMargin + (width - actualWidth); }else{ dx = leftMargin; } if( dx<0 ) dx = 0; maxAscent = maxTextAscent = 0; for(p=pStart; p && p!=pEnd; p=p->pNext){ int ss; if( p->base.style.flags & STY_Invisible ){ continue; } switch( p->base.type ){ case Html_Text: p->text.x += dx; max = p->text.x + p->text.w; ss = p->base.style.subscript; if( ss > 0 ){ int ascent = p->text.ascent; int delta = (ascent + p->text.descent)*ss/2; ascent += delta; p->text.y = -delta; if( ascent > maxAscent ){ TestPoint(0); maxAscent = ascent; } if( ascent > maxTextAscent ){ TestPoint(0); maxTextAscent = ascent;} }else if( ss < 0 ){ int descent = p->text.descent; int delta = (descent + p->text.ascent)*(-ss)/2; descent += delta; p->text.y = delta; }else{ p->text.y = 0; if( p->text.ascent > maxAscent ){ maxAscent = p->text.ascent; } if( p->text.ascent > maxTextAscent ){ maxTextAscent = p->text.ascent; } } break; case Html_Space: if( p->space.ascent > maxAscent ){ maxAscent = p->space.ascent; } break; case Html_LI: p->li.x += dx; if( p->li.x > max ){ max = p->li.x; } break; case Html_IMG: p->image.x += dx; max = p->image.x + p->image.w; switch( p->image.align ){ case IMAGE_ALIGN_Middle: p->image.descent = p->image.h/2; p->image.ascent = p->image.h - p->image.descent; if( p->image.ascent > maxAscent ){ maxAscent = p->image.ascent; } break; case IMAGE_ALIGN_AbsMiddle: dy2center = (p->image.textDescent - p->image.textAscent)/2; p->image.descent = p->image.h/2 + dy2center; p->image.ascent = p->image.h - p->image.descent; if( p->image.ascent > maxAscent ){ maxAscent = p->image.ascent; } break; case IMAGE_ALIGN_Bottom: p->image.descent = 0; p->image.ascent = p->image.h; if( p->image.ascent > maxAscent ){ maxAscent = p->image.ascent; } break; case IMAGE_ALIGN_AbsBottom: p->image.descent = p->image.textDescent; p->image.ascent = p->image.h - p->image.descent; if( p->image.ascent > maxAscent ){ maxAscent = p->image.ascent; } break; default: TestPoint(0); break; } break; case Html_TEXTAREA: case Html_INPUT: case Html_SELECT: case Html_EMBED: case Html_APPLET: p->input.x += dx; max = p->input.x + p->input.w; dy2center = (p->input.textDescent - p->input.textAscent)/2; p->input.y = dy2center - p->input.h/2; ascent = -p->input.y; if( ascent > maxAscent ){ maxAscent = ascent; } break; default: /* Shouldn't happen */ break; } } *maxX = max; y = maxAscent + bottom; maxDescent = 0; for(p=pStart; p && p!=pEnd; p=p->pNext){ if( p->base.style.flags & STY_Invisible ){ TestPoint(0); continue; } switch( p->base.type ){ case Html_Text: p->text.y += y; if( p->text.descent > maxDescent ){ maxDescent = p->text.descent; } break; case Html_LI: p->li.y = y; if( p->li.descent > maxDescent ){ maxDescent = p->li.descent; } break; case Html_IMG: p->image.y = y; switch( p->image.align ){ case IMAGE_ALIGN_Top: p->image.ascent = maxAscent; p->image.descent = p->image.h - maxAscent; TestPoint(0); break; case IMAGE_ALIGN_TextTop: p->image.ascent = maxTextAscent; p->image.descent = p->image.h - maxTextAscent; TestPoint(0); break; default: TestPoint(0); break; } if( p->image.descent > maxDescent ){ maxDescent = p->image.descent; } break; case Html_INPUT: case Html_SELECT: case Html_TEXTAREA: case Html_APPLET: case Html_EMBED: descent = p->input.y + p->input.h; p->input.y += y; if( descent > maxDescent ){ maxDescent = descent; } break; default: /* Shouldn't happen */ break; } } TRACE(HtmlTrace_FixLine, ("Setting baseline to %d. bottom=%d ascent=%d descent=%d dx=%d\n", y, bottom, maxAscent, maxDescent, dx)); }else{ maxDescent = 0; y = bottom; } return y + maxDescent; } /* ** Increase the headroom to create a paragraph break at the current token */ static void Paragraph( HtmlLayoutContext *pLC, HtmlElement *p ){ int headroom; if( p==0 ){ TestPoint(0); return; } if( p->base.type==Html_Text ){ headroom = p->text.ascent + p->text.descent; TestPoint(0); }else if( p->pNext && p->pNext->base.type==Html_Text ){ headroom = p->pNext->text.ascent + p->pNext->text.descent; TestPoint(0); }else{ Tk_FontMetrics fontMetrics; Tk_Font font; font = HtmlGetFont(pLC->htmlPtr, p->base.style.font); if( font==0 ) return; Tk_GetFontMetrics(font, &fontMetrics); headroom = fontMetrics.descent + fontMetrics.ascent; TestPoint(0); } if( pLC->headRoom < headroom && pLC->bottom > pLC->top ){ pLC->headRoom = headroom; } } /* ** Compute the current margins for layout. Three values are returned: ** ** *pY The top edge of the area in which we can put ink. This ** takes into account any requested headroom. ** ** *pX The left edge of the inkable area. The takes into account ** any margin requests active at vertical position specified ** in pLC->bottom. ** ** *pW The width of the inkable area. This takes into account ** an margin requests that are active at the vertical position ** pLC->bottom. ** */ void HtmlComputeMargins( HtmlLayoutContext *pLC, /* The current layout context */ int *pX, /* Put the left edge here */ int *pY, /* Put the top edge here */ int *pW /* Put the width here */ ){ int x, y, w; y = pLC->bottom + pLC->headRoom; PopExpiredMargins(&pLC->leftMargin, pLC->bottom); PopExpiredMargins(&pLC->rightMargin, pLC->bottom); w = pLC->pageWidth - pLC->right; if( pLC->leftMargin ){ x = pLC->leftMargin->indent + pLC->left; TestPoint(0); }else{ x = pLC->left; TestPoint(0); } w -= x; if( pLC->rightMargin ){ w -= pLC->rightMargin->indent; TestPoint(0); }else{ TestPoint(0); } *pX = x; *pY = y; *pW = w; } /* ** Clear a wrap-around obstacle. The second option determines the ** precise behavior. ** ** CLEAR_Left Clear all obstacles on the left. ** ** CLEAR_Right Clear all obstacles on the right. ** ** CLEAR_Both Clear all obstacles on both sides. ** ** CLEAR_First Clear only the first obsticle on either side. */ #define CLEAR_Left 0 #define CLEAR_Right 1 #define CLEAR_Both 2 #define CLEAR_First 3 static void ClearObstacle(HtmlLayoutContext *pLC, int mode){ int newBottom = pLC->bottom; PopExpiredMargins(&pLC->leftMargin, pLC->bottom); PopExpiredMargins(&pLC->rightMargin, pLC->bottom); switch( mode ){ case CLEAR_Both: ClearObstacle(pLC,CLEAR_Left); ClearObstacle(pLC,CLEAR_Right); TestPoint(0); break; case CLEAR_Left: while( pLC->leftMargin && pLC->leftMargin->bottom>=0 ){ newBottom = pLC->leftMargin->bottom; HtmlPopOneMargin(&pLC->leftMargin); TestPoint(0); } if( newBottom > pLC->bottom + pLC->headRoom ){ pLC->headRoom = 0; TestPoint(0); }else{ pLC->headRoom = newBottom - pLC->bottom; TestPoint(0); } pLC->bottom = newBottom; PopExpiredMargins(&pLC->rightMargin, pLC->bottom); break; case CLEAR_Right: while( pLC->rightMargin && pLC->rightMargin->bottom>=0 ){ newBottom = pLC->rightMargin->bottom; HtmlPopOneMargin(&pLC->rightMargin); TestPoint(0); } if( newBottom > pLC->bottom + pLC->headRoom ){ pLC->headRoom = 0; TestPoint(0); }else{ pLC->headRoom = newBottom - pLC->bottom; TestPoint(0); } pLC->bottom = newBottom; PopExpiredMargins(&pLC->leftMargin, pLC->bottom); break; case CLEAR_First: if( pLC->leftMargin && pLC->leftMargin->bottom>=0 ){ if( pLC->rightMargin && pLC->rightMargin->bottom < pLC->leftMargin->bottom ){ newBottom = pLC->rightMargin->bottom; HtmlPopOneMargin(&pLC->rightMargin); TestPoint(0); }else{ newBottom = pLC->leftMargin->bottom; HtmlPopOneMargin(&pLC->leftMargin); TestPoint(0); } }else if( pLC->rightMargin && pLC->rightMargin->bottom>=0 ){ newBottom = pLC->rightMargin->bottom; HtmlPopOneMargin(&pLC->rightMargin); TestPoint(0); }else{ TestPoint(0); } if( newBottom > pLC->bottom + pLC->headRoom ){ pLC->headRoom = 0; TestPoint(0); }else{ pLC->headRoom = newBottom - pLC->bottom; TestPoint(0); } pLC->bottom = newBottom; break; } } /* ** Break markup is any kind of markup that might force a line-break. This ** routine handles a single element of break markup and returns a pointer ** to the first element past that markup. If p doesn't point to break ** markup, then p is returned. If p is an incomplete table (a <TABLE> ** that lacks a </TABLE>), then NULL is returned. */ static HtmlElement *DoBreakMarkup( HtmlLayoutContext *pLC, HtmlElement *p ){ HtmlElement *pNext = p->pNext; char *z; int x, y, w; switch( p->base.type ){ case Html_A: p->anchor.y = pLC->bottom; TestPoint(0); break; case Html_BLOCKQUOTE: HtmlPushMargin(&pLC->leftMargin, HTML_INDENT, -1, Html_EndBLOCKQUOTE); HtmlPushMargin(&pLC->rightMargin, HTML_INDENT, -1, Html_EndBLOCKQUOTE); Paragraph(pLC, p); TestPoint(0); break; case Html_EndBLOCKQUOTE: HtmlPopMargin(&pLC->leftMargin, Html_EndBLOCKQUOTE, pLC); HtmlPopMargin(&pLC->rightMargin, Html_EndBLOCKQUOTE, pLC); Paragraph(pLC, p); TestPoint(0); break; case Html_IMG: switch( p->image.align ){ case IMAGE_ALIGN_Left: HtmlComputeMargins(pLC, &x, &y, &w); p->image.x = x; p->image.y = y; p->image.ascent = 0; p->image.descent = p->image.h; HtmlPushMargin(&pLC->leftMargin, p->image.w + 2, y + p->image.h, 0); SETMAX( pLC->maxY, y + p->image.h ); SETMAX( pLC->maxX, x + p->image.w ); break; case IMAGE_ALIGN_Right: HtmlComputeMargins(pLC, &x, &y, &w); p->image.x = x + w - p->image.w; p->image.y = y; p->image.ascent = 0; p->image.descent = p->image.h; HtmlPushMargin(&pLC->rightMargin, p->image.w + 2, y + p->image.h, 0); SETMAX( pLC->maxY, y + p->image.h ); SETMAX( pLC->maxX, x + p->image.w ); break; default: TestPoint(0); pNext = p; break; } break; case Html_PRE: /* Skip space tokens thru the next newline. */ while( pNext->base.type==Html_Space ){ HtmlElement *pThis = pNext; pNext = pNext->pNext; if( pThis->base.flags & HTML_NewLine ){ TestPoint(0); break; } } Paragraph(pLC,p); break; case Html_UL: case Html_MENU: case Html_DIR: case Html_OL: if( p->list.compact==0 ){ Paragraph(pLC,p); } HtmlPushMargin(&pLC->leftMargin, HTML_INDENT, -1, p->base.type+1); break; case Html_EndOL: case Html_EndUL: case Html_EndMENU: case Html_EndDIR: if( p->ref.pOther ){ HtmlPopMargin(&pLC->leftMargin, p->base.type, pLC); if( !p->ref.pOther->list.compact ){ Paragraph(pLC,p); } } break; case Html_DL: Paragraph(pLC,p); HtmlPushMargin(&pLC->leftMargin, HTML_INDENT, -1, Html_EndDL); TestPoint(0); break; case Html_EndDL: HtmlPopMargin(&pLC->leftMargin, Html_EndDL, pLC); Paragraph(pLC,p); TestPoint(0); break; case Html_HR: { int zl, wd; p->hr.is3D = HtmlMarkupArg(p, "noshade", 0)==0; z = HtmlMarkupArg(p, "size", 0); if( z ){ p->hr.h = atoi(z); }else{ p->hr.h = 0; } if( p->hr.h<1 ){ int relief = pLC->htmlPtr->ruleRelief; if( p->hr.is3D && (relief==TK_RELIEF_SUNKEN || relief==TK_RELIEF_RAISED) ){ p->hr.h = 3; }else{ p->hr.h = 2; } } HtmlComputeMargins(pLC, &x, &y, &w); p->hr.y = y; y += p->hr.h + 1; p->hr.x = x; z = HtmlMarkupArg(p, "width", "100%"); zl = strlen(z); if( zl>0 && z[zl-1]=='%' ){ wd = (atoi(z)*w)/100; }else{ wd = atoi(z); } if( wd>w ) wd = w; p->hr.w = wd; switch( p->base.style.align ){ case ALIGN_Center: case ALIGN_None: p->hr.x += (w - wd)/2; TestPoint(0); break; case ALIGN_Right: p->hr.x += (w - wd); TestPoint(0); break; default: TestPoint(0); break; } SETMAX( pLC->maxY, y); SETMAX( pLC->maxX, wd + p->hr.x ); pLC->bottom = y; pLC->headRoom = 0; break; } case Html_ADDRESS: case Html_EndADDRESS: case Html_CENTER: case Html_EndCENTER: case Html_DIV: case Html_EndDIV: case Html_H1: case Html_EndH1: case Html_H2: case Html_EndH2: case Html_H3: case Html_EndH3: case Html_H4: case Html_EndH4: case Html_H5: case Html_EndH5: case Html_H6: case Html_EndH6: case Html_P: case Html_EndP: case Html_EndPRE: Paragraph(pLC, p); TestPoint(0); break; case Html_TABLE: pNext = HtmlTableLayout(pLC, p); TestPoint(0); break; case Html_BR: z = HtmlMarkupArg(p, "clear",0); if( z ){ if( stricmp(z,"left")==0 ){ ClearObstacle(pLC, CLEAR_Left); TestPoint(0); }else if( stricmp(z,"right")==0 ){ ClearObstacle(pLC, CLEAR_Right); TestPoint(0); }else{ ClearObstacle(pLC, CLEAR_Both); TestPoint(0); } }else{ TestPoint(0); } break; /* All of the following tags need to be handed to the GetLine() routine */ case Html_Text: case Html_Space: case Html_LI: case Html_INPUT: case Html_SELECT: case Html_TEXTAREA: case Html_APPLET: case Html_EMBED: pNext = p; TestPoint(0); break; default: TestPoint(0); break; } return pNext; } /* ** Return TRUE (non-zero) if we are currently wrapping text around ** one or more images. */ static int InWrapAround(HtmlLayoutContext *pLC){ if( pLC->leftMargin && pLC->leftMargin->bottom >= 0 ){ TestPoint(0); return 1; } if( pLC->rightMargin && pLC->rightMargin->bottom >= 0 ){ TestPoint(0); return 1; } TestPoint(0); return 0; } /* ** Move past obsticles until a linewidth of reqWidth is obtained, ** or until all obsticles are cleared. */ void HtmlWidenLine( HtmlLayoutContext *pLC, /* The layout context */ int reqWidth, /* Requested line width */ int *pX, int *pY, int *pW /* The margins. See HtmllComputeMargins() */ ){ HtmlComputeMargins(pLC, pX, pY, pW); if( *pW<reqWidth && InWrapAround(pLC) ){ ClearObstacle(pLC, CLEAR_First); HtmlComputeMargins(pLC, pX, pY, pW); } } #ifdef TABLE_TRIM_BLANK int HtmlLineWasBlank = 0; #endif /* TABLE_TRIM_BLANK */ /* ** Do as much layout as possible on the block of text defined by ** the HtmlLayoutContext. */ void HtmlLayoutBlock(HtmlLayoutContext *pLC){ HtmlElement *p, *pNext; for(p=pLC->pStart; p && p!=pLC->pEnd; p=pNext){ int lineWidth; int actualWidth; int y = 0; int leftMargin; int maxX = 0; /* Do as much break markup as we can. */ while( p && p!=pLC->pEnd ){ HtmlLock(pLC->htmlPtr); pNext = DoBreakMarkup(pLC, p); if( HtmlUnlock(pLC->htmlPtr) ) return; if( pNext==p ){ TestPoint(0); break; } if( pNext ){ TRACE(HtmlTrace_BreakMarkup, ("Processed token %s as break markup\n", HtmlTokenName(p))); pLC->pStart = p; } p = pNext; TestPoint(0); } if( p==0 || p==pLC->pEnd ){ TestPoint(0); break; } #ifdef TABLE_TRIM_BLANK HtmlLineWasBlank = 0; #endif /* TABLE_TRIM_BLANK */ /* We might try several times to layout a single line... */ while( 1 ){ /* Compute margins */ HtmlComputeMargins(pLC, &leftMargin, &y, &lineWidth); /* Layout a single line of text */ pNext = GetLine(pLC, p, pLC->pEnd, lineWidth, pLC->left-leftMargin, &actualWidth); TRACE(HtmlTrace_GetLine, ("GetLine page=%d left=%d right=%d available=%d used=%d\n", pLC->pageWidth, pLC->left, pLC->right, lineWidth, actualWidth)); FixAnchors(p,pNext,pLC->bottom); /* Move down and repeat the layout if we exceeded the available ** line length and it is possible to increase the line length by ** moving past some obsticle. */ if( actualWidth > lineWidth && InWrapAround(pLC) ){ ClearObstacle(pLC, CLEAR_First); TestPoint(0); continue; } /* Lock the line into place and exit the loop */ y = FixLine(p, pNext, y, lineWidth, actualWidth, leftMargin, &maxX); TestPoint(0); break; } #ifdef TABLE_TRIM_BLANK /* * I noticed that a newline following break markup would result * in a blank line being drawn. So if an "empty" line was found * I subtract any whitespace caused by break markup. */ if (actualWidth <= 0) { HtmlLineWasBlank = 1; } #endif /* TABLE_TRIM_BLANK */ /* If a line was completed, advance to the next line */ if( pNext && actualWidth>0 && y > pLC->bottom ){ pLC->bottom = y; pLC->headRoom = 0; pLC->pStart = pNext; } if( y > pLC->maxY ){ pLC->maxY = y; } if( maxX > pLC->maxX ){ pLC->maxX = maxX; } } } /* ** Advance the layout as far as possible */ void HtmlLayout(HtmlWidget *htmlPtr){ HtmlLayoutContext *pLC; int btm; if( htmlPtr->pFirst==0 ) return; HtmlLock(htmlPtr); HtmlSizer(htmlPtr); if( HtmlUnlock(htmlPtr) ) return; pLC = &htmlPtr->layoutContext; pLC->htmlPtr = htmlPtr; pLC->pageWidth = htmlPtr->realWidth - 2*(htmlPtr->inset + htmlPtr->padx); pLC->left = 0; pLC->right = 0; pLC->pStart = htmlPtr->nextPlaced; if( pLC->pStart==0 ){ pLC->pStart = htmlPtr->pFirst; } if( pLC->pStart ){ pLC->maxX = htmlPtr->maxX; pLC->maxY = htmlPtr->maxY; btm = pLC->bottom; HtmlLock(htmlPtr); HtmlLayoutBlock(pLC); if( HtmlUnlock(htmlPtr) ) return; htmlPtr->maxX = pLC->maxX; htmlPtr->maxY = pLC->maxY; htmlPtr->nextPlaced = pLC->pStart; htmlPtr->flags |= HSCROLL | VSCROLL; HtmlRedrawText(htmlPtr, btm); } } ������������������saods9/tkhtml1.0/src/htmllayout.h�������������������������������������������������������������������000644 �000765 �000000 �00000062256 12547026202 017263� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlWidget HtmlWidget; void HtmlRedrawText(HtmlWidget *htmlPtr,int y); #define VSCROLL 0x000008 #define HSCROLL 0x000004 void HtmlSizer(HtmlWidget *htmlPtr); typedef union HtmlElement HtmlElement; typedef struct HtmlBlock HtmlBlock; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef short Html_16; typedef struct HtmlScript HtmlScript; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; typedef unsigned char Html_u8; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 typedef struct HtmlImage HtmlImage; struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; void HtmlLayout(HtmlWidget *htmlPtr); #define HtmlTrace_GetLine 0x00000100 #define HtmlTrace_BreakMarkup 0x00001000 int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); void HtmlLayoutBlock(HtmlLayoutContext *pLC); #if defined(TABLE_TRIM_BLANK) extern int HtmlLineWasBlank; #endif void HtmlWidenLine(HtmlLayoutContext *pLC,int reqWidth,int *pX,int *pY,int *pW); #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif HtmlElement *HtmlTableLayout(HtmlLayoutContext *pLC,HtmlElement *pTable); #define ALIGN_None 0 char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define Html_EndDIR 40 #define Html_DIR 39 #define SETMAX(A,B) if( (A)<(B) ){ (A) = (B); } void HtmlComputeMargins(HtmlLayoutContext *pLC,int *pX,int *pY,int *pW); Tk_Font HtmlGetFont(HtmlWidget *htmlPtr,int iFont); #define HtmlTrace_FixLine 0x00000400 #define IMAGE_ALIGN_TextTop 3 #define IMAGE_ALIGN_Top 2 #define IMAGE_ALIGN_AbsBottom 5 #define IMAGE_ALIGN_Bottom 0 #define IMAGE_ALIGN_AbsMiddle 4 #define IMAGE_ALIGN_Middle 1 #define ALIGN_Right 2 #define ALIGN_Center 3 #define Html_A 5 #define Html_EndUL 146 #define Html_UL 145 #define Html_EndTR 140 #define Html_TR 139 #define Html_EndTH 136 #define Html_TH 135 #define Html_EndTD 132 #define Html_TD 131 #define Html_EndTABLE 130 #define Html_TABLE 129 #define Html_EndPRE 110 #define Html_PRE 109 #define Html_EndP 105 #define Html_EndOL 101 #define Html_OL 100 #define Html_EndMENU 91 #define Html_MENU 90 #define Html_EndLISTING 85 #define Html_LISTING 84 #define Html_HR 70 #define Html_EndHTML 72 #define Html_EndH6 69 #define Html_H6 68 #define Html_EndH5 67 #define Html_H5 66 #define Html_EndH4 65 #define Html_H4 64 #define Html_EndH3 63 #define Html_H3 62 #define Html_EndH2 61 #define Html_H2 60 #define Html_EndH1 59 #define Html_H1 58 #define Html_DT 45 #define Html_EndDL 44 #define Html_DL 43 #define Html_EndDIV 42 #define Html_DIV 41 #define Html_EndDD 36 #define Html_EndCENTER 28 #define Html_CENTER 27 #define Html_EndCAPTION 26 #define Html_CAPTION 25 #define Html_BR 24 #define Html_EndBODY 23 #define Html_BODY 22 #define Html_EndBLOCKQUOTE 21 #define Html_BLOCKQUOTE 20 #define Html_EndADDRESS 8 #define Html_ADDRESS 7 #define Html_WBR 149 #define Html_DD 35 #define Html_EndTEXTAREA 134 #define Html_TEXTAREA 133 #define Html_SELECT 116 #define Html_INPUT 77 #define Html_EMBED 49 #define Html_APPLET 9 #define IMAGE_ALIGN_Right 7 #define IMAGE_ALIGN_Left 6 #define Html_IMG 76 #define STY_NoBreak 0x008 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ char *HtmlTokenName(HtmlElement *p); #define HtmlTrace_GetLine2 0x00000200 extern int HtmlTraceMask; #define DEBUG 1 #if defined(DEBUG) extern int HtmlDepth; # define TRACE_INDENT printf("%*s",HtmlDepth-3,"") #endif #if !(defined(DEBUG)) # define TRACE_INDENT #endif #if defined(DEBUG) # define TRACE(Flag, Args) \ if( (Flag)&HtmlTraceMask ){ \ TRACE_INDENT; printf Args; fflush(stdout); \ } #endif #if !(defined(DEBUG)) # define TRACE(Flag, Args) #endif #define STY_Preformatted 0x001 #define Html_Text 1 #define Html_P 104 #define Html_Space 2 #define Html_LI 81 #define HTML_INDENT 36 #define STY_DT 0x020 #define STY_Invisible 0x040 typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; void HtmlClearMarginStack(HtmlMargin **ppMargin); #define HtmlFree(A) Tcl_Free((char*)(A)) #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; void HtmlPushMargin(HtmlMargin **ppMargin,int indent,int bottom,int tag); struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlparse.c��������������������������������������������������������������������000644 �000765 �000000 �00000100173 12547267111 017050� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** A tokenizer that converts raw HTML into a linked list of HTML elements. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <string.h> #include <stdlib.h> #include <stdio.h> #include <ctype.h> #include <tk.h> #include "htmlparse.h" /****************** Begin Escape Sequence Translator *************/ /* ** The next section of code implements routines used to translate ** the '&' escape sequences of SGML to individual characters. ** Examples: ** ** &amp; & ** &lt; < ** &gt; > ** &nbsp; nonbreakable space */ /* Each escape sequence is recorded as an instance of the following ** structure */ struct sgEsc { char *zName; /* The name of this escape sequence. ex: "amp" */ char value[8]; /* The value for this sequence. ex: "&" */ struct sgEsc *pNext; /* Next sequence with the same hash on zName */ }; /* The following is a table of all escape sequences. Add new sequences ** by adding entries to this table. */ static struct sgEsc esc_sequences[] = { { "quot", "\"", 0 }, { "amp", "&", 0 }, { "lt", "<", 0 }, { "gt", ">", 0 }, { "nbsp", " ", 0 }, { "iexcl", "\241", 0 }, { "cent", "\242", 0 }, { "pound", "\243", 0 }, { "curren", "\244", 0 }, { "yen", "\245", 0 }, { "brvbar", "\246", 0 }, { "sect", "\247", 0 }, { "uml", "\250", 0 }, { "copy", "\251", 0 }, { "ordf", "\252", 0 }, { "laquo", "\253", 0 }, { "not", "\254", 0 }, { "shy", "\255", 0 }, { "reg", "\256", 0 }, { "macr", "\257", 0 }, { "deg", "\260", 0 }, { "plusmn", "\261", 0 }, { "sup2", "\262", 0 }, { "sup3", "\263", 0 }, { "acute", "\264", 0 }, { "micro", "\265", 0 }, { "para", "\266", 0 }, { "middot", "\267", 0 }, { "cedil", "\270", 0 }, { "sup1", "\271", 0 }, { "ordm", "\272", 0 }, { "raquo", "\273", 0 }, { "frac14", "\274", 0 }, { "frac12", "\275", 0 }, { "frac34", "\276", 0 }, { "iquest", "\277", 0 }, { "Agrave", "\300", 0 }, { "Aacute", "\301", 0 }, { "Acirc", "\302", 0 }, { "Atilde", "\303", 0 }, { "Auml", "\304", 0 }, { "Aring", "\305", 0 }, { "AElig", "\306", 0 }, { "Ccedil", "\307", 0 }, { "Egrave", "\310", 0 }, { "Eacute", "\311", 0 }, { "Ecirc", "\312", 0 }, { "Euml", "\313", 0 }, { "Igrave", "\314", 0 }, { "Iacute", "\315", 0 }, { "Icirc", "\316", 0 }, { "Iuml", "\317", 0 }, { "ETH", "\320", 0 }, { "Ntilde", "\321", 0 }, { "Ograve", "\322", 0 }, { "Oacute", "\323", 0 }, { "Ocirc", "\324", 0 }, { "Otilde", "\325", 0 }, { "Ouml", "\326", 0 }, { "times", "\327", 0 }, { "Oslash", "\330", 0 }, { "Ugrave", "\331", 0 }, { "Uacute", "\332", 0 }, { "Ucirc", "\333", 0 }, { "Uuml", "\334", 0 }, { "Yacute", "\335", 0 }, { "THORN", "\336", 0 }, { "szlig", "\337", 0 }, { "agrave", "\340", 0 }, { "aacute", "\341", 0 }, { "acirc", "\342", 0 }, { "atilde", "\343", 0 }, { "auml", "\344", 0 }, { "aring", "\345", 0 }, { "aelig", "\346", 0 }, { "ccedil", "\347", 0 }, { "egrave", "\350", 0 }, { "eacute", "\351", 0 }, { "ecirc", "\352", 0 }, { "euml", "\353", 0 }, { "igrave", "\354", 0 }, { "iacute", "\355", 0 }, { "icirc", "\356", 0 }, { "iuml", "\357", 0 }, { "eth", "\360", 0 }, { "ntilde", "\361", 0 }, { "ograve", "\362", 0 }, { "oacute", "\363", 0 }, { "ocirc", "\364", 0 }, { "otilde", "\365", 0 }, { "ouml", "\366", 0 }, { "divide", "\367", 0 }, { "oslash", "\370", 0 }, { "ugrave", "\371", 0 }, { "uacute", "\372", 0 }, { "ucirc", "\373", 0 }, { "uuml", "\374", 0 }, { "yacute", "\375", 0 }, { "thorn", "\376", 0 }, { "yuml", "\377", 0 }, }; /* The size of the handler hash table. For best results this should ** be a prime number which is about the same size as the number of ** escape sequences known to the system. */ #define ESC_HASH_SIZE (sizeof(esc_sequences)/sizeof(esc_sequences[0])+7) /* The hash table ** ** If the name of an escape sequences hashes to the value H, then ** apEscHash[H] will point to a linked list of Esc structures, one of ** which will be the Esc structure for that escape sequence. */ static struct sgEsc *apEscHash[ESC_HASH_SIZE]; /* Hash a escape sequence name. The value returned is an integer ** between 0 and ESC_HASH_SIZE-1, inclusive. */ static int EscHash(const char *zName){ int h = 0; /* The hash value to be returned */ char c; /* The next character in the name being hashed */ while( (c=*zName)!=0 ){ h = h<<5 ^ h ^ c; zName++; TestPoint(0); } if( h<0 ){ h = -h; TestPoint(0); }else{ TestPoint(0); } return h % ESC_HASH_SIZE; } #ifdef TEST /* ** Compute the longest and average collision chain length for the ** escape sequence hash table */ static void EscHashStats(void){ int i; int sum = 0; int max = 0; int cnt; int notempty = 0; struct sgEsc *p; for(i=0; i<sizeof(esc_sequences)/sizeof(esc_sequences[0]); i++){ cnt = 0; p = apEscHash[i]; if( p ) notempty++; while( p ){ cnt++; p = p->pNext; } sum += cnt; if( cnt>max ) max = cnt; } printf("Longest chain=%d avg=%g slots=%d empty=%d (%g%%)\n", max,(double)sum/(double)notempty, i, i-notempty, 100.0*(i-notempty)/(double)i); } #endif /* Initialize the escape sequence hash table */ static void EscInit(void){ int i; /* For looping thru the list of escape sequences */ int h; /* The hash on a sequence */ for(i=0; i<sizeof(esc_sequences)/sizeof(esc_sequences[i]); i++){ /* #ifdef TCL_UTF_MAX */ #if 0 { int c = esc_sequences[i].value[0]; Tcl_UniCharToUtf(c, esc_sequences[i].value); } #endif h = EscHash(esc_sequences[i].zName); esc_sequences[i].pNext = apEscHash[h]; apEscHash[h] = &esc_sequences[i]; TestPoint(0); } #ifdef TEST EscHashStats(); #endif } /* ** This table translates the non-standard microsoft characters between ** 0x80 and 0x9f into plain ASCII so that the characters will be visible ** on Unix systems. Care is taken to translate the characters ** into values less than 0x80, to avoid UTF-8 problems. */ #ifndef __WIN32__ static char acMsChar[] = { /* 0x80 */ 'C', /* 0x81 */ ' ', /* 0x82 */ ',', /* 0x83 */ 'f', /* 0x84 */ '"', /* 0x85 */ '.', /* 0x86 */ '*', /* 0x87 */ '*', /* 0x88 */ '^', /* 0x89 */ '%', /* 0x8a */ 'S', /* 0x8b */ '<', /* 0x8c */ 'O', /* 0x8d */ ' ', /* 0x8e */ 'Z', /* 0x8f */ ' ', /* 0x90 */ ' ', /* 0x91 */ '\'', /* 0x92 */ '\'', /* 0x93 */ '"', /* 0x94 */ '"', /* 0x95 */ '*', /* 0x96 */ '-', /* 0x97 */ '-', /* 0x98 */ '~', /* 0x99 */ '@', /* 0x9a */ 's', /* 0x9b */ '>', /* 0x9c */ 'o', /* 0x9d */ ' ', /* 0x9e */ 'z', /* 0x9f */ 'Y', }; #endif /* Translate escape sequences in the string "z". "z" is overwritten ** with the translated sequence. ** ** Unrecognized escape sequences are unaltered. ** ** Example: ** ** input = "AT&amp;T &gt MCI" ** output = "AT&T > MCI" */ LOCAL void HtmlTranslateEscapes(char *z){ int from; /* Read characters from this position in z[] */ int to; /* Write characters into this position in z[] */ int h; /* A hash on the escape sequence */ struct sgEsc *p; /* For looping down the escape sequence collision chain */ static int isInit = 0; /* True after initialization */ from = to = 0; if( !isInit ){ EscInit(); isInit = 1; } while( z[from] ){ if( z[from]=='&' ){ if( z[from+1]=='#' ){ int i = from + 2; int v = 0; while( isdigit(z[i]) ){ v = v*10 + z[i] - '0'; i++; } if( z[i]==';' ){ i++; } /* On Unix systems, translate the non-standard microsoft ** characters in the range of 0x80 to 0x9f into something ** we can see. */ #ifndef __WIN32__ if( v>=0x80 && v<0xa0 ){ v = acMsChar[v&0x1f]; } #endif /* Put the character in the output stream in place of ** the "&#000;". How we do this depends on whether or ** not we are using UTF-8. */ #ifdef TCL_UTF_MAX { int j, n; char value[8]; n = Tcl_UniCharToUtf(v,value); for(j=0; j<n; j++){ z[to++] = value[j]; } } #else z[to++] = v; #endif from = i; }else{ int i = from+1; int c; while( z[i] && isalnum(z[i]) ){ TestPoint(0); i++; } c = z[i]; z[i] = 0; h = EscHash(&z[from+1]); p = apEscHash[h]; while( p && strcmp(p->zName,&z[from+1])!=0 ){ p = p->pNext; } z[i] = c; if( p ){ int j; for(j=0; p->value[j]; j++){ z[to++] = p->value[j]; } from = i; if( c==';' ){ from++; } }else{ z[to++] = z[from++]; } } /* On UNIX systems, look for the non-standard microsoft characters ** between 0x80 and 0x9f and translate them into printable ASCII ** codes. Separate algorithms are required to do this for plain ** ascii and for utf-8. */ #ifndef __WIN32__ #ifdef TCL_UTF_MAX }else if( (z[from]&0x80)!=0 ){ Tcl_UniChar c; int n; n = Tcl_UtfToUniChar(&z[from], &c); if( c>=0x80 && c<0xa0 ){ z[to++] = acMsChar[c & 0x1f]; from += n; }else{ while( n-- ) z[to++] = z[from++]; } #else /* if !defined(TCL_UTF_MAX) */ }else if( ((unsigned char)z[from])>=0x80 && ((unsigned char)z[from])<0xa0 ){ z[to++] = acMsChar[z[from++]&0x1f]; #endif /* TCL_UTF_MAX */ #endif /* __WIN32__ */ }else{ z[to++] = z[from++]; TestPoint(0); } } z[to] = 0; } /******************* End Escape Sequence Translator ***************/ /******************* Begin HTML tokenizer code *******************/ /* ** The following variable becomes TRUE when the markup hash table ** (stored in HtmlMarkupMap[]) is initialized. */ static int isInit = 0; /* The hash table for HTML markup names. ** ** If an HTML markup name hashes to H, then apMap[H] will point to ** a linked list of sgMap structure, one of which will describe the ** the particular markup (if it exists.) */ static HtmlTokenMap *apMap[HTML_MARKUP_HASH_SIZE]; /* Hash a markup name ** ** HTML markup is case insensitive, so this function will give the ** same hash regardless of the case of the markup name. ** ** The value returned is an integer between 0 and HTML_MARKUP_HASH_SIZE-1, ** inclusive. */ static int HtmlHash(const char *zName){ int h = 0; char c; while( (c=*zName)!=0 ){ if( isupper(c) ){ c = tolower(c); } h = h<<5 ^ h ^ c; zName++; } if( h<0 ){ h = -h; } return h % HTML_MARKUP_HASH_SIZE; } #ifdef TEST /* ** Compute the longest and average collision chain length for the ** markup hash table */ static void HtmlHashStats(void){ int i; int sum = 0; int max = 0; int cnt; int notempty = 0; struct sgMap *p; for(i=0; i<HTML_MARKUP_COUNT; i++){ cnt = 0; p = apMap[i]; if( p ) notempty++; while( p ){ cnt++; p = p->pCollide; } sum += cnt; if( cnt>max ) max = cnt; } printf("longest chain=%d avg=%g slots=%d empty=%d (%g%%)\n", max, (double)sum/(double)notempty, i, i-notempty, 100.0*(i-notempty)/(double)i); } #endif /* Initialize the escape sequence hash table */ static void HtmlHashInit(void){ int i; /* For looping thru the list of markup names */ int h; /* The hash on a markup name */ for(i=0; i<HTML_MARKUP_COUNT; i++){ h = HtmlHash(HtmlMarkupMap[i].zName); HtmlMarkupMap[i].pCollide = apMap[h]; apMap[h] = &HtmlMarkupMap[i]; } #ifdef TEST HtmlHashStats(); #endif } /* ** Append the given HtmlElement to the tokenizers list of elements */ static void AppendElement(HtmlWidget *p, HtmlElement *pElem){ pElem->base.pNext = 0; pElem->base.pPrev = p->pLast; if( p->pFirst==0 ){ p->pFirst = pElem; }else{ p->pLast->base.pNext = pElem; } p->pLast = pElem; p->nToken++; } /* ** Compute the new column index following the given character. */ static int NextColumn(int iCol, char c){ switch( c ){ case '\n': return 0; case '\t': return (iCol | 7) + 1; default: return iCol+1; } /* NOT REACHED */ } /* ** Convert a string to all lower-case letters. */ static void ToLower(char *z){ while( *z ){ if( isupper(*z) ) *z = tolower(*z); z++; } } /* Process as much of the input HTML as possible. Construct new ** HtmlElement structures and appended them to the list. Return ** the number of characters actually processed. ** ** This routine may invoke a callback procedure which could delete ** the HTML widget. ** ** This routine is not reentrant for the same HTML widget. To ** prevent reentrancy (during a callback), the p->iCol field is ** set to a negative number. This is a flag to future invocations ** not to reentry this routine. The p->iCol field is restored ** before exiting, of course. */ static int Tokenize( HtmlWidget *p /* The HTML widget doing the parsing */ ){ char *z; /* The input HTML text */ int c; /* The next character of input */ int n; /* Number of characters processed so far */ int iCol; /* Column of input */ int i, j; /* Loop counters */ int h; /* Result from HtmlHash() */ int nByte; /* Space allocated for a single HtmlElement */ HtmlElement *pElem; /* A new HTML element */ int selfClose; /* True for content free elements. Ex: <br/> */ int argc; /* The number of arguments on a markup */ HtmlTokenMap *pMap; /* For searching the markup name hash table */ char *zBuf; /* For handing out buffer space */ # define mxARG 200 /* Maximum number of parameters in a single markup */ char *argv[mxARG]; /* Pointers to each markup argument. */ int arglen[mxARG]; /* Length of each markup argument */ iCol = p->iCol; n = p->nComplete; z = p->zText; if( iCol<0 ){ TestPoint(0); return n; } /* Prevents recursion */ p->iCol = -1; while( (c=z[n])!=0 ){ if( p->pScript ){ /* We are in the middle of <SCRIPT>...</SCRIPT>. Just look for ** the </SCRIPT> markup. (later:) Treat <STYLE>...</STYLE> the ** same way. */ HtmlScript *pScript = p->pScript; char *zEnd; int nEnd; if( pScript->markup.base.type==Html_SCRIPT ){ zEnd = "</script>"; nEnd = 9; }else{ zEnd = "</style>"; nEnd = 8; } if( pScript->zScript==0 ){ pScript->zScript = &z[n]; pScript->nScript = 0; } for(i=n+pScript->nScript; z[i]; i++){ if( z[i]=='<' && z[i+1]=='/' && strnicmp(&z[i],zEnd,nEnd)==0 ){ pScript->nScript = i - n; p->pScript = 0; n = i+nEnd; break; } } if( p->pScript ){ pScript->nScript = i - n; } continue; }else if( isspace(c) ){ /* White space */ for(i=0; (c=z[n+i])!=0 && isspace(c) && c!='\n' && c!='\r'; i++){} if( c=='\r' && z[n+i+1]=='\n' ){ i++; } pElem = HtmlAlloc( sizeof(HtmlSpaceElement) ); if( pElem==0 ){ goto incomplete; } pElem->base.type = Html_Space; if( c=='\n' || c=='\r' ){ pElem->base.flags = HTML_NewLine; pElem->base.count = 1; i++; iCol = 0; TestPoint(0); }else{ int iColStart = iCol; pElem->base.flags = 0; for(j=0; j<i; j++){ iCol = NextColumn(iCol, z[n+j]); TestPoint(0); } pElem->base.count = iCol - iColStart; } AppendElement(p,pElem); n += i; }else if( c!='<' || p->iPlaintext!=0 || (!isalpha(z[n+1]) && z[n+1]!='/' && z[n+1]!='!' && z[n+1]!='?') ){ /* Ordinary text */ for(i=1; (c=z[n+i])!=0 && !isspace(c) && c!='<'; i++){} if( c==0 ){ TestPoint(0); goto incomplete; } if( p->iPlaintext!=0 && z[n]=='<' ){ switch( p->iPlaintext ){ case Html_LISTING: if( i>=10 && strnicmp(&z[n],"</listing>",10)==0 ){ p->iPlaintext = 0; goto doMarkup; } break; case Html_XMP: if( i>=6 && strnicmp(&z[n],"</xmp>",6)==0 ){ p->iPlaintext = 0; goto doMarkup; } break; case Html_TEXTAREA: if( i>=11 && strnicmp(&z[n],"</textarea>",11)==0 ){ p->iPlaintext = 0; goto doMarkup; } break; default: break; } } nByte = sizeof(HtmlTextElement) + i; pElem = HtmlAlloc( nByte ); if( pElem==0 ){ goto incomplete; } memset(pElem,0,nByte); pElem->base.type = Html_Text; sprintf(pElem->text.zText,"%.*s",i,&z[n]); AppendElement(p,pElem); if( p->iPlaintext==0 || p->iPlaintext==Html_TEXTAREA ){ HtmlTranslateEscapes(pElem->text.zText); } pElem->base.count = strlen(pElem->text.zText); n += i; iCol += i; }else if( strncmp(&z[n],"<!--",4)==0 ){ /* An HTML comment. Just skip it. */ for(i=4; z[n+i]; i++){ if( z[n+i]=='-' && strncmp(&z[n+i],"-->",3)==0 ){ break; } } if( z[n+i]==0 ){ TestPoint(0); goto incomplete; } for(j=0; j<i+3; j++){ iCol = NextColumn(iCol, z[n+j]); } n += i + 3; }else{ /* Markup. ** ** First get the name of the markup */ doMarkup: argc = 1; argv[0] = &z[n+1]; for(i=1; (c=z[n+i])!=0 && !isspace(c) && c!='>' && (i<2 || c!='/'); i++){} arglen[0] = i - 1; if( c==0 ){ goto incomplete; } /* ** Now parse up the arguments */ while( isspace(z[n+i]) ){ i++; } while( (c=z[n+i])!=0 && c!='>' && (c!='/' || z[n+i+1]!='>') ){ if( argc>mxARG-3 ){ argc = mxARG-3; } argv[argc] = &z[n+i]; j = 0; while( (c=z[n+i+j])!=0 && !isspace(c) && c!='>' && c!='=' && (c!='/' || z[n+i+j+1]!='>') ){ j++; } arglen[argc] = j; if( c==0 ){ goto incomplete; } i += j; while( isspace(c) ){ i++; c = z[n+i]; } if( c==0 ){ goto incomplete; } argc++; if( c!='=' ){ argv[argc] = ""; arglen[argc] = 0; argc++; continue; } i++; c = z[n+i]; while( isspace(c) ){ i++; c = z[n+i]; } if( c==0 ){ goto incomplete; } if( c=='\'' || c=='"' ){ int cQuote = c; i++; argv[argc] = &z[n+i]; for(j=0; (c=z[n+i+j])!=0 && c!=cQuote; j++){} if( c==0 ){ goto incomplete; } arglen[argc] = j; i += j+1; TestPoint(0); }else{ argv[argc] = &z[n+i]; for(j=0; (c=z[n+i+j])!=0 && !isspace(c) && c!='>'; j++){} if( c==0 ){ goto incomplete; } arglen[argc] = j; i += j; } argc++; while( isspace(z[n+i]) ){ i++; } } if( c=='/' ){ i++; c = z[n+i]; selfClose = 1; }else{ selfClose = 0; } if( c==0 ){ goto incomplete; } for(j=0; j<i+1; j++){ iCol = NextColumn(iCol, z[n+j]); } n += i + 1; /* Lookup the markup name in the hash table */ if( !isInit ){ HtmlHashInit(); isInit = 1; } c = argv[0][arglen[0]]; argv[0][arglen[0]] = 0; h = HtmlHash(argv[0]); for(pMap = apMap[h]; pMap; pMap=pMap->pCollide){ if( stricmp(pMap->zName,argv[0])==0 ){ break; } TestPoint(0); } argv[0][arglen[0]] = c; if( pMap==0 ){ continue; } /* Ignore unknown markup */ makeMarkupEntry: /* Construct a HtmlMarkup entry for this markup. */ if( pMap->extra ){ nByte = pMap->extra; }else if( argc==1 ){ nByte = sizeof(HtmlBaseElement); }else{ nByte = sizeof(HtmlMarkupElement); } if( argc>1 ){ nByte += sizeof(char*) * argc; for(j=1; j<argc; j++){ nByte += arglen[j] + 1; } } pElem = HtmlAlloc( nByte ); if( pElem==0 ){ goto incomplete; } memset(pElem,0,nByte); pElem->base.type = pMap->type; pElem->base.count = argc - 1; if( argc>1 ){ if( pMap->extra ){ pElem->markup.argv = (char**)&((char*)pElem)[pMap->extra]; }else{ pElem->markup.argv = (char**)&((HtmlMarkupElement*)pElem)[1]; } zBuf = (char*)&pElem->markup.argv[argc]; for(j=1; j<argc; j++){ pElem->markup.argv[j-1] = zBuf; zBuf += arglen[j] + 1; sprintf(pElem->markup.argv[j-1],"%.*s",arglen[j],argv[j]); HtmlTranslateEscapes(pElem->markup.argv[j-1]); if( (j&1)==1 ){ ToLower(pElem->markup.argv[j-1]); } } pElem->markup.argv[argc-1] = 0; } /* The new markup has now be constructed in pElem. But before ** appending to the list, check to see if there is a special ** handler for this markup type. */ if( p->zHandler[pMap->type] ){ Tcl_DString str; Tcl_DStringInit(&str); Tcl_DStringAppend(&str, p->zHandler[pMap->type], -1); Tcl_DStringAppendElement(&str, pMap->zName); Tcl_DStringStartSublist(&str); for(j=0; j<argc-1; j++){ Tcl_DStringAppendElement(&str, pElem->markup.argv[j]); } Tcl_DStringEndSublist(&str); HtmlFree(pElem); HtmlLock(p); Tcl_GlobalEval(p->interp, Tcl_DStringValue(&str)); Tcl_DStringFree(&str); if( HtmlUnlock(p) ){ return 0; } /* Tricky, tricky. The callback might have caused the p->zText ** pointer to change, so renew our copy of that pointer. The ** callback might also have cleared or destroyed the widget. ** If so, abort this routine. */ z = p->zText; if( z==0 || p->tkwin==0 ){ n = 0; iCol = 0; goto incomplete; } continue; } /* No special handler for this markup. Just append it to the ** list of all tokens. */ AppendElement(p,pElem); switch( pMap->type ){ case Html_PLAINTEXT: case Html_LISTING: case Html_XMP: case Html_TEXTAREA: p->iPlaintext = pMap->type; break; case Html_STYLE: case Html_SCRIPT: p->pScript = (HtmlScript*)pElem; break; default: break; } /* If this is self-closing markup (ex: <br/> or <img/>) then ** synthesize a closing token. */ if( selfClose && argv[0][0]!='/' && strcmp(&pMap[1].zName[1],pMap->zName)==0 ){ selfClose = 0; pMap++; argc = 1; goto makeMarkupEntry; } } } incomplete: p->iCol = iCol; return n; } /************************** End HTML Tokenizer Code ***************************/ /* ** Append text to the tokenizer engine. ** ** This routine (actually the Tokenize() subroutine that is called ** by this routine) may invoke a callback procedure which could delete ** the HTML widget. */ void HtmlTokenizerAppend(HtmlWidget *htmlPtr, const char *zText){ int len = strlen(zText); if( htmlPtr->nText==0 ){ htmlPtr->nAlloc = len + 100; htmlPtr->zText = HtmlAlloc( htmlPtr->nAlloc ); TestPoint(0); }else if( htmlPtr->nText + len >= htmlPtr->nAlloc ){ htmlPtr->nAlloc += len + 100; htmlPtr->zText = HtmlRealloc( htmlPtr->zText, htmlPtr->nAlloc ); TestPoint(0); } if( htmlPtr->zText==0 ){ htmlPtr->nText = 0; UNTESTED; return; } strcpy(&htmlPtr->zText[htmlPtr->nText], zText); htmlPtr->nText += len; htmlPtr->nComplete = Tokenize(htmlPtr); } /* ** This routine takes a text representation of a token, converts ** it into an HtmlElement structure and inserts it immediately ** prior to pToken. If pToken==0, then the newly created HtmlElement ** is appended. ** ** This routine does nothing to resize, restyle, relayout or redisplay ** the HTML. That is the calling routines responsibility. ** ** Return 0 if successful. Return non-zero if zType is not a known ** markup name. */ int HtmlInsertToken( HtmlWidget *htmlPtr, /* The widget into which the token is inserted */ HtmlElement *pToken, /* Insert before this. Append if pToken==0 */ char *zType, /* Type of markup. Ex: "/a" or "table" */ char *zArgs /* List of arguments */ ){ HtmlTokenMap *pMap; /* For searching the markup name hash table */ int h; /* The hash on zType */ HtmlElement *pElem; /* The new element */ int nByte; /* How many bytes to allocate */ int i; /* Loop counter */ if( !isInit ){ HtmlHashInit(); isInit = 1; TestPoint(0); }else{ TestPoint(0); } h = HtmlHash(zType); for(pMap = apMap[h]; pMap; pMap=pMap->pCollide){ if( stricmp(pMap->zName,zType)==0 ){ TestPoint(0); break; } TestPoint(0); } if( pMap==0 ){ TestPoint(0); return 1; } if( zArgs==0 || *zArgs==0 ){ /* Special case of no arguments. This is a lot easier... */ nByte = pMap->extra ? pMap->extra : sizeof(HtmlBaseElement); nByte += strlen(zType); pElem = HtmlAlloc( nByte ); if( pElem==0 ){ TestPoint(0); return 1; } memset(pElem,0,nByte); pElem->base.type = pMap->type; TestPoint(0); }else{ /* The general case. There are arguments that need to be parsed ** up. This is slower, but we gotta do it. */ int argc; const char **argv; char *zBuf; if( Tcl_SplitList(htmlPtr->interp, zArgs, &argc, (const char***)&argv)!=TCL_OK ){ TestPoint(0); return 1; } if( pMap->extra ){ nByte = pMap->extra; TestPoint(0); }else{ nByte = sizeof(HtmlMarkupElement); TestPoint(0); } nByte += sizeof(char*)*(argc+1) + strlen(zArgs) + argc + 2; pElem = HtmlAlloc( nByte ); if( pElem==0 ){ HtmlFree(argv); TestPoint(0); return 1; } memset(pElem,0,nByte); pElem->base.type = pMap->type; pElem->base.count = argc; if( pMap->extra ){ pElem->markup.argv = (char**)&((char*)pElem)[pMap->extra]; TestPoint(0); }else{ pElem->markup.argv = (char**)&((HtmlMarkupElement*)pElem)[1]; TestPoint(0); } zBuf = (char*)&pElem->markup.argv[argc]; for(i=1; i<argc; i++){ pElem->markup.argv[i-1] = zBuf; zBuf += strlen(argv[i]) + 1; strcpy(pElem->markup.argv[i-1],argv[i]); TestPoint(0); } pElem->markup.argv[argc-1] = 0; HtmlFree(argv); TestPoint(0); } if( pToken ){ pElem->base.pNext = pToken; pElem->base.pPrev = pToken->base.pPrev; if( pToken->base.pPrev ){ pToken->base.pPrev->pNext = pElem; TestPoint(0); }else{ htmlPtr->pFirst = pElem; TestPoint(0); } pToken->base.pPrev = pElem; htmlPtr->nToken++; }else{ AppendElement(htmlPtr,pElem); TestPoint(0); } return 0; } /* ** Convert a markup name into a type integer */ int HtmlNameToType(const char *zType){ HtmlTokenMap *pMap; /* For searching the markup name hash table */ int h; /* The hash on zType */ if( !isInit ){ HtmlHashInit(); isInit = 1; TestPoint(0); }else{ TestPoint(0); } h = HtmlHash(zType); for(pMap = apMap[h]; pMap; pMap=pMap->pCollide){ if( stricmp(pMap->zName,zType)==0 ){ TestPoint(0); break; } TestPoint(0); } return pMap ? pMap->type : Html_Unknown; } /* ** Convert a type into a symbolic name */ const char *HtmlTypeToName(int type){ if( type>=Html_A && type<=Html_EndXMP ){ HtmlTokenMap *pMap = apMap[type - Html_A]; TestPoint(0); return pMap->zName; }else{ TestPoint(0); return "???"; } } /* ** For debugging purposes, print information about a token */ char *HtmlTokenName(HtmlElement *p){ #ifdef DEBUG static char zBuf[200]; int j; char *zName; if( p==0 ) return "NULL"; switch( p->base.type ){ case Html_Text: sprintf(zBuf,"\"%.*s\"",p->base.count,p->text.zText); break; case Html_Space: if( p->base.flags & HTML_NewLine ){ sprintf(zBuf,"\"\\n\""); }else{ sprintf(zBuf,"\" \""); } break; case Html_Block: if( p->block.n>0 ){ int n = p->block.n; if( n>150 ) n = 150; sprintf(zBuf,"<Block z=\"%.*s\">", n, p->block.z); }else{ sprintf(zBuf,"<Block>"); } break; default: if( p->base.type >= HtmlMarkupMap[0].type && p->base.type <= HtmlMarkupMap[HTML_MARKUP_COUNT-1].type ){ zName = HtmlMarkupMap[p->base.type - HtmlMarkupMap[0].type].zName; }else{ zName = "Unknown"; } sprintf(zBuf,"<%s",zName); for(j=1; j<p->base.count; j += 2){ sprintf(&zBuf[strlen(zBuf)]," %s=%s", p->markup.argv[j-1],p->markup.argv[j]); } strcat(zBuf,">"); break; } return zBuf; #else return 0; #endif } /* ** Return all tokens between the two elements as a Tcl list. */ void HtmlTclizeList(Tcl_Interp *interp, HtmlElement *p, HtmlElement *pEnd){ Tcl_DString str; int i; char *zName; char zLine[100]; Tcl_DStringInit(&str); while( p && p!=pEnd ){ switch( p->base.type ){ case Html_Block: break; case Html_Text: Tcl_DStringStartSublist(&str); Tcl_DStringAppendElement(&str,"Text"); Tcl_DStringAppendElement(&str, p->text.zText); Tcl_DStringEndSublist(&str); break; case Html_Space: sprintf(zLine,"Space %d %d", p->base.count, (p->base.flags & HTML_NewLine)!=0); Tcl_DStringAppendElement(&str,zLine); break; case Html_Unknown: Tcl_DStringAppendElement(&str,"Unknown"); break; default: Tcl_DStringStartSublist(&str); Tcl_DStringAppendElement(&str,"Markup"); if( p->base.type >= HtmlMarkupMap[0].type && p->base.type <= HtmlMarkupMap[HTML_MARKUP_COUNT-1].type ){ zName = HtmlMarkupMap[p->base.type - HtmlMarkupMap[0].type].zName; }else{ zName = "Unknown"; } Tcl_DStringAppendElement(&str, zName); for(i=0; i<p->base.count; i++){ Tcl_DStringAppendElement(&str, p->markup.argv[i]); } Tcl_DStringEndSublist(&str); break; } p = p->pNext; } Tcl_DStringResult(interp, &str); } /* ** Print a list of tokens */ #ifdef DEBUG void HtmlPrintList(HtmlElement *p, HtmlElement *pEnd){ while( p && p!=pEnd ){ if( p->base.type==Html_Block ){ char *z = p->block.z; int n = p->block.n; if( n==0 || z==0 ){ n = 1; z = ""; } printf("Block 0x%08x flags=%02x cnt=%d x=%d..%d y=%d..%d z=\"%.*s\"\n", (int)p, p->base.flags, p->base.count, p->block.left, p->block.right, p->block.top, p->block.bottom, n, z); }else{ printf("Token 0x%08x font=%2d color=%2d align=%d flags=0x%04x name=%s\n", (int)p, p->base.style.font, p->base.style.color, p->base.style.align, p->base.style.flags, HtmlTokenName(p)); } p = p->pNext; } } #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlparse.h��������������������������������������������������������������������000644 �000765 �000000 �00000055403 12547267111 017062� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef union HtmlElement HtmlElement; #define DEBUG 1 #if defined(DEBUG) void HtmlPrintList(HtmlElement *p,HtmlElement *pEnd); #endif void HtmlTclizeList(Tcl_Interp *interp,HtmlElement *p,HtmlElement *pEnd); #define Html_Block 4 char *HtmlTokenName(HtmlElement *p); #define Html_EndXMP 151 #define Html_A 5 const char *HtmlTypeToName(int type); #define Html_Unknown 3 int HtmlNameToType(const char *zType); typedef struct HtmlWidget HtmlWidget; int HtmlInsertToken(HtmlWidget *htmlPtr,HtmlElement *pToken,char *zType,char *zArgs); void HtmlTPUntested(const char *zFile,int line); #if defined(COVERAGE_TEST) # define UNTESTED HtmlTPUntested(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define UNTESTED #endif #define HtmlRealloc(A,B) ((void*)Tcl_Realloc((A),(B))) void HtmlTokenizerAppend(HtmlWidget *htmlPtr,const char *zText); #define Html_STYLE 124 #define Html_PLAINTEXT 108 int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); #define HtmlFree(A) Tcl_Free((char*)(A)) typedef struct HtmlMarkupElement HtmlMarkupElement; typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif #define Html_Text 1 typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; #define Html_TEXTAREA 133 #define Html_XMP 150 #define Html_LISTING 84 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define Html_Space 2 typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) #if !defined(HAVE_STRICMP) # define strnicmp strncasecmp #endif #define Html_SCRIPT 115 typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; typedef struct HtmlTokenMap HtmlTokenMap; struct HtmlTokenMap { char *zName; /* Name of a markup */ Html_16 type; /* Markup type code */ Html_16 extra; /* Extra space needed above HtmlBaseElement */ HtmlTokenMap *pCollide; /* Hash table collision chain */ }; extern HtmlTokenMap HtmlMarkupMap[]; #define HTML_MARKUP_COUNT 147 #define HTML_MARKUP_HASH_SIZE 163 #define LOCAL static LOCAL void HtmlTranslateEscapes(char *z); #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlsizer.c��������������������������������������������������������������������000644 �000765 �000000 �00000106344 12547267111 017100� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines used to compute the style and size of individual elements. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <string.h> #include <stdlib.h> #include "htmlsizer.h" /* ** Get the current rendering style. In other words, get the style ** that is currently on the top of the style stack. */ static HtmlStyle GetCurrentStyle(HtmlWidget *htmlPtr){ HtmlStyle style; if( htmlPtr->styleStack ){ style = htmlPtr->styleStack->style; }else{ style.font = NormalFont(2); style.color = COLOR_Normal; style.bgcolor = COLOR_Background; style.subscript = 0; style.align = ALIGN_Left; style.flags = 0; } return style; } /* ** Push a new rendering style onto the stack. */ static void PushStyleStack( HtmlWidget *htmlPtr, /* Widget on which to push the style */ int tag, /* Tag for this style. Normally the end-tag such ** as </h3> or </em>. */ HtmlStyle style /* The style to push */ ){ HtmlStyleStack *p; p = HtmlAlloc(sizeof(*p)); p->pNext = htmlPtr->styleStack; p->type = tag; p->style = style; htmlPtr->styleStack = p; } /* ** Pop a rendering style off of the stack. ** ** The top-most style on the stack should have a tag equal to "tag". ** If not, then we have an HTML coding error. Perhaps something ** like this: "Some text <em>Enphasized</i> more text". It is an ** interesting problem to figure out how to respond sanely to this ** kind of error. Our solution it to keep popping the stack until ** we find the correct tag, or until the stack is empty. */ HtmlStyle HtmlPopStyleStack(HtmlWidget *htmlPtr, int tag){ int type; HtmlStyleStack *p; static Html_u8 priority[Html_TypeCount+1]; if( priority[Html_TABLE]==0 ){ int i; for(i=0; i<=Html_TypeCount; i++) priority[i] = 1; priority[Html_TD] = 2; priority[Html_EndTD] = 2; priority[Html_TH] = 2; priority[Html_EndTH] = 2; priority[Html_TR] = 3; priority[Html_EndTR] = 3; priority[Html_TABLE] = 4; priority[Html_EndTABLE] = 4; } if( tag<=0 || tag>Html_TypeCount ){ CANT_HAPPEN; return GetCurrentStyle(htmlPtr); } while( (p=htmlPtr->styleStack)!=0 ){ type = p->type; if( type<=0 || type>Html_TypeCount ){ CANT_HAPPEN; return GetCurrentStyle(htmlPtr); } if( type!=tag && priority[type]>priority[tag] ){ return GetCurrentStyle(htmlPtr); } htmlPtr->styleStack = p->pNext; HtmlFree(p); if( type==tag ){ break; } } return GetCurrentStyle(htmlPtr); } /* ** Change the font size on the given style by the delta-amount given */ static void ScaleFont(HtmlStyle *pStyle, int delta){ int size = FontSize(pStyle->font) + delta; if( size<0 ){ delta -= size; }else if( size>6 ){ delta -= size-6; } pStyle->font += delta; } /* ** Lookup an argument in the given markup with the name given. ** Return a pointer to its value, or the given default ** value if it doesn't appear. */ char *HtmlMarkupArg(HtmlElement *p, const char *tag, char *zDefault){ int i; if( !HtmlIsMarkup(p) ){ TestPoint(0); return 0; } for(i=0; i<p->base.count; i+=2){ if( strcmp(p->markup.argv[i],tag)==0 ){ return p->markup.argv[i+1]; } } return zDefault; } /* ** Return an alignment or justification flag associated with the ** given markup. The given default value is returned if no alignment is ** specified. */ static int GetAlignment(HtmlElement *p, int dflt){ char *z = HtmlMarkupArg(p,"align",0); int rc = dflt; if( z ){ if( stricmp(z,"left")==0 ){ rc = ALIGN_Left; }else if( stricmp(z,"right")==0 ){ rc = ALIGN_Right; }else if( stricmp(z,"center")==0 ){ rc = ALIGN_Center; } } return rc; } /* ** The "type" argument to the given element might describe the type ** for an ordered list. Return the corresponding LI_TYPE_* entry ** if this is the case, or the default value if it isn't. */ static int GetOrderedListType(HtmlElement *p, int dflt){ char *z; z = HtmlMarkupArg(p,"type",0); if( z ){ switch( *z ){ case 'A': TestPoint(0); dflt = LI_TYPE_Enum_A; break; case 'a': TestPoint(0); dflt = LI_TYPE_Enum_a; break; case '1': TestPoint(0); dflt = LI_TYPE_Enum_1; break; case 'I': TestPoint(0); dflt = LI_TYPE_Enum_I; break; case 'i': TestPoint(0); dflt = LI_TYPE_Enum_i; break; default: TestPoint(0); break; } }else{ TestPoint(0); } return dflt; } /* ** The "type" argument to the given element might describe a type ** for an unordered list. Return the corresponding LI_TYPE entry ** if this is the case, or the default value if it isn't. */ static int GetUnorderedListType(HtmlElement *p, int dflt){ char *z; z = HtmlMarkupArg(p,"type",0); if( z ){ if( stricmp(z,"disc")==0 ){ dflt = LI_TYPE_Bullet1; }else if( stricmp(z,"circle")==0 ){ dflt = LI_TYPE_Bullet2; }else if( stricmp(z,"square")==0 ){ dflt = LI_TYPE_Bullet3; } } return dflt; } /* ** Add the STY_Invisible style to every token between pFirst and pLast. */ static void MakeInvisible(HtmlElement *pFirst, HtmlElement *pLast){ if( pFirst==0 ) return; pFirst = pFirst->pNext; while( pFirst && pFirst!=pLast ){ pFirst->base.style.flags |= STY_Invisible; pFirst=pFirst->pNext; } } /* ** For the markup <a href=XXX>, find out if the URL has been visited ** before or not. Return COLOR_Visited or COLOR_Unvisited, as ** appropriate. ** ** This routine may invoke a callback procedure which could delete ** the HTML widget. The calling function should call HtmlLock() ** if it needs the widget structure to be preserved. */ static int GetLinkColor(HtmlWidget *htmlPtr, char *zURL){ char *zCmd; int result; int isVisited; if( htmlPtr->tkwin==0 ){ TestPoint(0); return COLOR_Normal; } if( htmlPtr->zIsVisited==0 || htmlPtr->zIsVisited[0]==0 ){ TestPoint(0); return COLOR_Unvisited; } zCmd = HtmlAlloc( strlen(htmlPtr->zIsVisited) + strlen(zURL) + 10 ); if( zCmd==0 ){ TestPoint(0); return COLOR_Unvisited; } sprintf(zCmd,"%s {%s}",htmlPtr->zIsVisited, zURL); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp,zCmd); HtmlFree(zCmd); if( HtmlUnlock(htmlPtr) ){ return COLOR_Unvisited; } if( result!=TCL_OK ){ TestPoint(0); goto errorOut; } result = Tcl_GetBoolean(htmlPtr->interp, Tcl_GetStringResult(htmlPtr->interp), &isVisited); if( result!=TCL_OK ){ TestPoint(0); goto errorOut; } TestPoint(0); return isVisited ? COLOR_Visited : COLOR_Unvisited; errorOut: Tcl_AddErrorInfo(htmlPtr->interp, "\n (\"-isvisitedcommand\" command executed by html widget)"); Tcl_BackgroundError(htmlPtr->interp); TestPoint(0); return COLOR_Unvisited; } /* ** This routine adds information to the input texts that doesn't change ** when the display is resized or when new fonts are selected, etc. ** Mostly this means adding style attributes. But other constant ** information (such as numbering on <li> and images used for <IMG>) ** is also obtained. The key is that this routine is only called ** once, where the sizer and layout routines can be called many times. ** ** This routine is called whenever the list of elements grows. The ** style stack is stored as part of the HTML widget so that we can ** always continue where we left off the last time. ** ** In addition to adding style, this routine will invoke callbacks ** needed to acquire information about a markup. The htmlPtr->zIsVisitied ** callback is called for each <a> and the htmlPtr->zGetImage is called ** for each <IMG> or for each <LI> that has a SRC= field. ** ** This routine may invoke a callback procedure which could delete ** the HTML widget. ** ** When a markup is inserted or deleted from the token list, the ** style routine must be completely rerun from the beginning. So ** what we said above, that this routine is only run once, is not ** strictly true. */ void HtmlAddStyle(HtmlWidget *htmlPtr, HtmlElement *p){ HtmlStyle style; /* Current style */ int size; /* A new font size */ int i; /* Loop counter */ int paraAlign; /* Current paragraph alignment */ int rowAlign; /* Current table row alignment */ int anchorFlags; /* Flags associated with <a> tag */ int inDt; /* True if within <dt>..</dt> */ HtmlStyle nextStyle; /* Style for next token if useNextStyle==1 */ int useNextStyle = 0; /* True if nextStyle is valid */ char *z; /* A tag parameter's value */ /* The size of header fonts relative to the current font size */ static int header_sizes[] = {+2, +1, 1, 1, -1, -1}; /* Don't allow recursion */ if( htmlPtr->flags & STYLER_RUNNING ){ TestPoint(0); return; } htmlPtr->flags |= STYLER_RUNNING; /* Load the style state out of the htmlPtr structure and into local ** variables. This is purely a matter of convenience... */ style = GetCurrentStyle(htmlPtr); paraAlign = htmlPtr->paraAlignment; rowAlign = htmlPtr->rowAlignment; anchorFlags = htmlPtr->anchorFlags; inDt = htmlPtr->inDt; /* Loop over tokens */ while( p ){ switch( p->base.type ){ case Html_A: if( htmlPtr->anchorStart ){ style = HtmlPopStyleStack(htmlPtr, Html_EndA); htmlPtr->anchorStart = 0; anchorFlags = 0; } z = HtmlMarkupArg(p,"href",0); if( z ){ HtmlLock(htmlPtr); style.color = GetLinkColor(htmlPtr, z); if( htmlPtr->underlineLinks ){ style.flags |= STY_Underline; } if( HtmlUnlock(htmlPtr) ) return; anchorFlags |= STY_Anchor; PushStyleStack(htmlPtr, Html_EndA, style); htmlPtr->anchorStart = p; } break; case Html_EndA: if( htmlPtr->anchorStart ){ p->ref.pOther = htmlPtr->anchorStart; style = HtmlPopStyleStack(htmlPtr, Html_EndA); htmlPtr->anchorStart = 0; anchorFlags = 0; } break; case Html_ADDRESS: case Html_EndADDRESS: case Html_BLOCKQUOTE: case Html_EndBLOCKQUOTE: paraAlign = ALIGN_None; TestPoint(0); break; case Html_APPLET: if( htmlPtr->zAppletCommand && *htmlPtr->zAppletCommand ){ nextStyle = style; nextStyle.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndAPPLET, nextStyle); useNextStyle = 1; }else{ PushStyleStack(htmlPtr, Html_EndAPPLET, style); } TestPoint(0); break; case Html_B: style.font = BoldFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndB, style); TestPoint(0); break; case Html_EndAPPLET: case Html_EndB: case Html_EndBIG: case Html_EndCENTER: case Html_EndCITE: case Html_EndCODE: case Html_EndCOMMENT: case Html_EndEM: case Html_EndFONT: case Html_EndI: case Html_EndKBD: case Html_EndMARQUEE: case Html_EndNOBR: case Html_EndNOFRAME: case Html_EndNOSCRIPT: case Html_EndS: case Html_EndSAMP: case Html_EndSMALL: case Html_EndSTRIKE: case Html_EndSTRONG: case Html_EndSUB: case Html_EndSUP: case Html_EndTITLE: case Html_EndTT: case Html_EndU: case Html_EndVAR: style = HtmlPopStyleStack(htmlPtr, p->base.type); TestPoint(0); break; case Html_BASE: z = HtmlMarkupArg(p,"href",0); if( z ){ HtmlLock(htmlPtr); z = HtmlResolveUri(htmlPtr, z); if( HtmlUnlock(htmlPtr) ) return; if( z!=0 ){ if( htmlPtr->zBaseHref ){ HtmlFree(htmlPtr->zBaseHref); } htmlPtr->zBaseHref = z; } } break; case Html_EndDIV: paraAlign = ALIGN_None; style = HtmlPopStyleStack(htmlPtr, p->base.type); TestPoint(0); break; case Html_EndBASEFONT: style = HtmlPopStyleStack(htmlPtr, Html_EndBASEFONT); style.font = FontFamily(style.font) + 2; TestPoint(0); break; case Html_BIG: ScaleFont(&style,1); PushStyleStack(htmlPtr, Html_EndBIG, style); TestPoint(0); break; case Html_CAPTION: paraAlign = GetAlignment(p, paraAlign); TestPoint(0); break; case Html_EndCAPTION: paraAlign = ALIGN_None; TestPoint(0); break; case Html_CENTER: paraAlign = ALIGN_None; style.align = ALIGN_Center; PushStyleStack(htmlPtr, Html_EndCENTER, style); TestPoint(0); break; case Html_CITE: PushStyleStack(htmlPtr, Html_EndCITE, style); TestPoint(0); break; case Html_CODE: style.font = CWFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndCODE, style); TestPoint(0); break; case Html_COMMENT: style.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndCOMMENT, style); TestPoint(0); break; case Html_DD: if( htmlPtr->innerList && htmlPtr->innerList->base.type==Html_DL ){ p->ref.pOther = htmlPtr->innerList; TestPoint(0); }else{ p->ref.pOther = 0; TestPoint(0); } inDt = 0; break; case Html_DIR: case Html_MENU: case Html_UL: p->list.pPrev = htmlPtr->innerList; p->list.cnt = 0; htmlPtr->innerList = p; if( p->list.pPrev==0 ){ p->list.type = LI_TYPE_Bullet1; p->list.compact = HtmlMarkupArg(p,"compact",0)!=0; TestPoint(0); }else if( p->list.pPrev->list.pPrev==0 ){ p->list.type = LI_TYPE_Bullet2; p->list.compact = 1; TestPoint(0); }else{ p->list.type = LI_TYPE_Bullet3; p->list.compact = 1; TestPoint(0); } p->list.type = GetUnorderedListType(p,p->list.type); break; case Html_EndDL: inDt = 0; TestPoint(0); /* Fall thru into the next case */ case Html_EndDIR: case Html_EndMENU: case Html_EndOL: case Html_EndUL: p->ref.pOther = htmlPtr->innerList; if( htmlPtr->innerList ){ htmlPtr->innerList = htmlPtr->innerList->list.pPrev; TestPoint(0); }else{ TestPoint(0); } break; case Html_DIV: paraAlign = ALIGN_None; style.align = GetAlignment(p, style.align); PushStyleStack(htmlPtr, Html_EndDIV, style); TestPoint(0); break; case Html_DT: if( htmlPtr->innerList && htmlPtr->innerList->base.type==Html_DL ){ p->ref.pOther = htmlPtr->innerList; TestPoint(0); }else{ p->ref.pOther = 0; TestPoint(0); } inDt = STY_DT; break; case Html_EndDD: case Html_EndDT: inDt = 0; TestPoint(0); break; case Html_DL: p->list.pPrev = htmlPtr->innerList; p->list.cnt = 0; htmlPtr->innerList = p; p->list.compact = HtmlMarkupArg(p,"compact",0)!=0; inDt = 0; TestPoint(0); break; case Html_EM: style.font = ItalicFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndEM, style); TestPoint(0); break; case Html_EMBED: break; case Html_BASEFONT: case Html_FONT: z = HtmlMarkupArg(p,"size",0); if( z ){ if( *z=='-' ){ size = FontSize(style.font) - atoi(&z[1]); }else if( *z=='+' ){ size = FontSize(style.font) + atoi(&z[1]); }else{ size = atoi(z); } if( size <= 0 ){ size = 1; } if( size >= N_FONT_SIZE ){ size = N_FONT_SIZE - 1; } style.font = FontFamily(style.font) + size - 1; } z = HtmlMarkupArg(p,"color",0); if( z ){ style.color = HtmlGetColorByName(htmlPtr, z); } PushStyleStack(htmlPtr, p->base.type==Html_FONT ? Html_EndFONT : Html_EndBASEFONT, style); break; case Html_FORM: { char *zUrl; char *zMethod; Tcl_DString cmd; /* -formcommand callback */ int result; char zToken[50]; htmlPtr->formStart = 0; p->form.id = 0; if( htmlPtr->zFormCommand==0 || htmlPtr->zFormCommand[0]==0 ){ TestPoint(0); break; } zUrl = HtmlMarkupArg(p,"action",0); if( zUrl==0 ){ TestPoint(0); break; } HtmlLock(htmlPtr); zUrl = HtmlResolveUri(htmlPtr, zUrl); if( HtmlUnlock(htmlPtr) ) return; if( zUrl==0 ) break; zMethod = HtmlMarkupArg(p,"method","GET"); sprintf(zToken," %d form ", ++htmlPtr->nForm); Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zFormCommand, -1); Tcl_DStringAppend(&cmd, zToken, -1); Tcl_DStringAppendElement(&cmd, zUrl); HtmlFree(zUrl); Tcl_DStringAppendElement(&cmd, zMethod); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, p); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( HtmlUnlock(htmlPtr) ) return; if( result==TCL_OK ){ htmlPtr->formStart = p; p->form.id = htmlPtr->nForm; } Tcl_ResetResult(htmlPtr->interp); break; } case Html_EndFORM: p->ref.pOther = htmlPtr->formStart; htmlPtr->formStart = 0; TestPoint(0); break; case Html_H1: case Html_H2: case Html_H3: case Html_H4: case Html_H5: case Html_H6: paraAlign = ALIGN_None; i = (p->base.type - Html_H1)/2 + 1; if( i>=1 && i<=6 ){ ScaleFont(&style,header_sizes[i-1]); } style.font = BoldFont( FontSize(style.font) ); style.align = GetAlignment(p, style.align); PushStyleStack(htmlPtr, Html_EndH1, style); break; case Html_EndH1: case Html_EndH2: case Html_EndH3: case Html_EndH4: case Html_EndH5: case Html_EndH6: paraAlign = ALIGN_None; style = HtmlPopStyleStack(htmlPtr, Html_EndH1); TestPoint(0); break; case Html_HR: nextStyle = style; style.align = GetAlignment(p, ALIGN_None); useNextStyle = 1; break; case Html_I: style.font = ItalicFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndI, style); TestPoint(0); break; case Html_IMG: HtmlLock(htmlPtr); p->image.pImage = HtmlGetImage(htmlPtr, p); if( HtmlUnlock(htmlPtr) ) return; TestPoint(0); break; case Html_INPUT: p->input.pForm = htmlPtr->formStart; TestPoint(0); break; case Html_KBD: style.font = CWFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndKBD, style); TestPoint(0); break; case Html_LI: if( htmlPtr->innerList ){ p->li.type = htmlPtr->innerList->list.type; if( htmlPtr->innerList->base.type==Html_OL ){ z = HtmlMarkupArg(p, "value", 0); if( z ){ int n = atoi(z); if( n>0 ){ p->li.cnt = n; htmlPtr->innerList->list.cnt = n+1; TestPoint(0); }else{ TestPoint(0); } }else{ p->li.cnt = htmlPtr->innerList->list.cnt++; TestPoint(0); } p->li.type = GetOrderedListType(p,p->li.type); }else{ p->li.type = GetUnorderedListType(p,p->li.type); TestPoint(0); } }else{ p->base.flags &= ~HTML_Visible; TestPoint(0); } break; case Html_MARQUEE: style.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndMARQUEE, style); TestPoint(0); break; case Html_NOBR: style.flags |= STY_NoBreak; PushStyleStack(htmlPtr, Html_EndNOBR, style); TestPoint(0); break; case Html_NOFRAME: if( htmlPtr->zFrameCommand && *htmlPtr->zFrameCommand ){ nextStyle = style; nextStyle.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndNOFRAME, nextStyle); useNextStyle = 1; }else{ PushStyleStack(htmlPtr, Html_EndNOFRAME, style); } TestPoint(0); break; case Html_NOSCRIPT: if( htmlPtr->zScriptCommand && *htmlPtr->zScriptCommand ){ nextStyle = style; nextStyle.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndNOSCRIPT, nextStyle); useNextStyle = 1; }else{ PushStyleStack(htmlPtr, Html_EndNOSCRIPT, style); } TestPoint(0); break; case Html_OL: p->list.pPrev = htmlPtr->innerList; p->list.type = GetOrderedListType(p,LI_TYPE_Enum_1); p->list.cnt = 1; z = HtmlMarkupArg(p,"start",0); if( z ){ int n = atoi(z); if( n>0 ){ p->list.cnt = n; TestPoint(0); }else{ TestPoint(0); } }else{ TestPoint(0); } p->list.compact = htmlPtr->innerList!=0 || HtmlMarkupArg(p,"compact",0)!=0; htmlPtr->innerList = p; break; case Html_P: paraAlign = GetAlignment(p, ALIGN_None); TestPoint(0); break; case Html_EndP: paraAlign = ALIGN_None; TestPoint(0); break; case Html_PRE: case Html_LISTING: case Html_XMP: case Html_PLAINTEXT: paraAlign = ALIGN_None; style.font = CWFont( FontSize(style.font) ); style.flags |= STY_Preformatted; PushStyleStack(htmlPtr, Html_EndPRE, style); TestPoint(0); break; case Html_EndPRE: case Html_EndLISTING: case Html_EndXMP: style = HtmlPopStyleStack(htmlPtr, Html_EndPRE); TestPoint(0); break; case Html_S: style.flags |= STY_StrikeThru; PushStyleStack(htmlPtr, Html_EndS, style); TestPoint(0); break; case Html_SCRIPT: if( htmlPtr->zScriptCommand && *htmlPtr->zScriptCommand ){ Tcl_DString cmd; int result; Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zScriptCommand, -1); Tcl_DStringStartSublist(&cmd); HtmlAppendArglist(&cmd, p); Tcl_DStringEndSublist(&cmd); Tcl_DStringStartSublist(&cmd); Tcl_DStringAppend(&cmd, p->script.zScript, p->script.nScript); Tcl_DStringEndSublist(&cmd); HtmlLock(htmlPtr); result = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( HtmlUnlock(htmlPtr) ) return; Tcl_ResetResult(htmlPtr->interp); } nextStyle = style; style.flags |= STY_Invisible; useNextStyle = 1; break; case Html_SELECT: p->input.pForm = htmlPtr->formStart; nextStyle.flags |= STY_Invisible; useNextStyle = 1; PushStyleStack(htmlPtr, Html_EndSELECT, style); htmlPtr->formElemStart = p; break; case Html_EndSELECT: style = HtmlPopStyleStack(htmlPtr, Html_EndSELECT); if( htmlPtr->formElemStart && htmlPtr->formElemStart->base.type==Html_SELECT ){ p->ref.pOther = htmlPtr->formElemStart; MakeInvisible(p->ref.pOther, p); }else{ p->ref.pOther = 0; } htmlPtr->formElemStart = 0; break; case Html_STRIKE: style.flags |= STY_StrikeThru; PushStyleStack(htmlPtr, Html_EndSTRIKE, style); TestPoint(0); break; case Html_STYLE: /* Ignore style sheets */ break; case Html_SAMP: style.font = CWFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndSAMP, style); TestPoint(0); break; case Html_SMALL: ScaleFont(&style,-1); PushStyleStack(htmlPtr, Html_EndSMALL, style); TestPoint(0); break; case Html_STRONG: style.font = BoldFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndSTRONG, style); TestPoint(0); break; case Html_SUB: ScaleFont(&style,-1); if( style.subscript > -6 ){ style.subscript--; TestPoint(0); }else{ TestPoint(0); } PushStyleStack(htmlPtr, Html_EndSUB, style); break; case Html_SUP: ScaleFont(&style,-1); if( style.subscript < 6 ){ style.subscript++; TestPoint(0); }else{ TestPoint(0); } PushStyleStack(htmlPtr, Html_EndSUP, style); break; case Html_TABLE: paraAlign = ALIGN_None; nextStyle = style; nextStyle.align = ALIGN_Left; z = HtmlMarkupArg(p, "bgcolor", 0); if( z ){ nextStyle.bgcolor = HtmlGetColorByName(htmlPtr, z); style.bgcolor = nextStyle.bgcolor; /* }else{ nextStyle.bgcolor = COLOR_Background; */ } PushStyleStack(htmlPtr, Html_EndTABLE, nextStyle); useNextStyle = 1; htmlPtr->inTd = 0; htmlPtr->inTr = 0; TestPoint(0); break; case Html_EndTABLE: paraAlign = ALIGN_None; if( htmlPtr->inTd ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTD); htmlPtr->inTd = 0; } if( htmlPtr->inTr ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTR); htmlPtr->inTr = 0; } style = HtmlPopStyleStack(htmlPtr, p->base.type); TestPoint(0); break; case Html_TD: if( htmlPtr->inTd ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTD); } htmlPtr->inTd = 1; paraAlign = GetAlignment(p, rowAlign); if( (z = HtmlMarkupArg(p, "bgcolor", 0))!=0 ){ style.bgcolor = HtmlGetColorByName(htmlPtr, z); } PushStyleStack(htmlPtr, Html_EndTD, style); TestPoint(0); break; case Html_TEXTAREA: p->input.pForm = htmlPtr->formStart; nextStyle = style; nextStyle.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndTEXTAREA, nextStyle); htmlPtr->formElemStart = p; useNextStyle = 1; TestPoint(0); break; case Html_EndTEXTAREA: style = HtmlPopStyleStack(htmlPtr, Html_EndTEXTAREA); if( htmlPtr->formElemStart && htmlPtr->formElemStart->base.type==Html_TEXTAREA ){ p->ref.pOther = htmlPtr->formElemStart; }else{ p->ref.pOther = 0; } htmlPtr->formElemStart = 0; break; case Html_TH: /* paraAlign = GetAlignment(p, rowAlign); */ if( htmlPtr->inTd ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTD); } paraAlign = GetAlignment(p, ALIGN_Center); style.font = BoldFont( FontSize(style.font) ); if( (z = HtmlMarkupArg(p, "bgcolor", 0))!=0 ){ style.bgcolor = HtmlGetColorByName(htmlPtr, z); } PushStyleStack(htmlPtr, Html_EndTD, style); htmlPtr->inTd = 1; TestPoint(0); break; case Html_TR: if( htmlPtr->inTd ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTD); htmlPtr->inTd = 0; } if( htmlPtr->inTr ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTR); } rowAlign = GetAlignment(p, ALIGN_None); if( (z = HtmlMarkupArg(p, "bgcolor", 0))!=0 ){ style.bgcolor = HtmlGetColorByName(htmlPtr, z); } PushStyleStack(htmlPtr, Html_EndTR, style); htmlPtr->inTr = 1; TestPoint(0); break; case Html_EndTR: if( htmlPtr->inTd ){ style = HtmlPopStyleStack(htmlPtr, Html_EndTD); htmlPtr->inTd = 0; } style = HtmlPopStyleStack(htmlPtr, Html_EndTR); htmlPtr->inTr = 0; paraAlign = ALIGN_None; rowAlign = ALIGN_None; TestPoint(0); break; case Html_EndTD: case Html_EndTH: style = HtmlPopStyleStack(htmlPtr, Html_EndTD); htmlPtr->inTd = 0; paraAlign = ALIGN_None; rowAlign = ALIGN_None; TestPoint(0); break; case Html_TITLE: style.flags |= STY_Invisible; PushStyleStack(htmlPtr, Html_EndTITLE, style); TestPoint(0); break; case Html_TT: style.font = CWFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndTT, style); TestPoint(0); break; case Html_U: style.flags |= STY_Underline; PushStyleStack(htmlPtr, Html_EndU, style); break; case Html_VAR: style.font = ItalicFont( FontSize(style.font) ); PushStyleStack(htmlPtr, Html_EndVAR, style); TestPoint(0); break; default: TestPoint(0); break; } p->base.style = style; p->base.style.flags |= anchorFlags | inDt; if( paraAlign!=ALIGN_None ){ p->base.style.align = paraAlign; } if( useNextStyle ){ style = nextStyle; useNextStyle = 0; } TRACE(HtmlTrace_Style, ("Style of 0x%08x font=%02d color=%02d bg=%02d " "align=%d flags=0x%04x token=%s\n", (int)p, p->base.style.font, p->base.style.color, p->base.style.bgcolor, p->base.style.align, p->base.style.flags, HtmlTokenName(p))); p = p->pNext; } /* Copy state information back into the htmlPtr structure for ** safe keeping. */ htmlPtr->paraAlignment = paraAlign; htmlPtr->rowAlignment = rowAlign; htmlPtr->anchorFlags = anchorFlags; htmlPtr->inDt = inDt; htmlPtr->flags &= ~STYLER_RUNNING; } /* ** Compute the size of all elements in the widget. Assume that a ** style has already been assigned to all elements. ** ** Some of the elements might have already been sized. Refer to the ** htmlPtr->lastSized and only compute sizes for elements that follow ** this one. If htmlPtr->lastSized==0, then size everything. ** ** This routine only computes the sizes of individual elements. The ** size of aggregate elements (like tables) are computed separately. ** ** The HTML_Visible flag is also set on every element that results ** in ink on the page. ** ** This routine may invoke a callback procedure which could delete ** the HTML widget. */ void HtmlSizer(HtmlWidget *htmlPtr){ HtmlElement *p; int iFont = -1; Tk_Font font; int spaceWidth = 0; Tk_FontMetrics fontMetrics; char *z; int stop = 0; if( htmlPtr->pFirst==0 ){ TestPoint(0); return; } if( htmlPtr->lastSized==0 ){ p = htmlPtr->pFirst; TestPoint(0); }else{ p = htmlPtr->lastSized->pNext; TestPoint(0); } for(; !stop && p; p=p->pNext){ if( p->base.style.flags & STY_Invisible ){ p->base.flags &= ~HTML_Visible; TestPoint(0); continue; } if( iFont != p->base.style.font ){ iFont = p->base.style.font; HtmlLock(htmlPtr); font = HtmlGetFont(htmlPtr, iFont); if( HtmlUnlock(htmlPtr) ) break; Tk_GetFontMetrics(font, &fontMetrics); spaceWidth = 0; } switch( p->base.type ){ case Html_Text: p->text.w = Tk_TextWidth(font, p->text.zText, p->base.count); p->base.flags |= HTML_Visible; p->text.descent = fontMetrics.descent; p->text.ascent = fontMetrics.ascent; if( spaceWidth==0 ){ spaceWidth = Tk_TextWidth(font, " ", 1); TestPoint(0); }else{ TestPoint(0); } p->text.spaceWidth = spaceWidth; break; case Html_Space: if( spaceWidth==0 ){ spaceWidth = Tk_TextWidth(font, " ", 1); } p->space.w = spaceWidth; p->space.descent = fontMetrics.descent; p->space.ascent = fontMetrics.ascent; p->base.flags &= ~HTML_Visible; break; case Html_TD: case Html_TH: z = HtmlMarkupArg(p, "rowspan","1"); p->cell.rowspan = atoi(z); z = HtmlMarkupArg(p, "colspan","1"); p->cell.colspan = atoi(z); p->base.flags |= HTML_Visible; TestPoint(0); break; case Html_LI: p->li.descent = fontMetrics.descent; p->li.ascent = fontMetrics.ascent; p->base.flags |= HTML_Visible; TestPoint(0); break; case Html_IMG: p->base.flags |= HTML_Visible; p->image.redrawNeeded = 0; p->image.textAscent = fontMetrics.ascent; p->image.textDescent = fontMetrics.descent; p->image.align = HtmlGetImageAlignment(p); if( p->image.pImage==0 ){ p->image.ascent = fontMetrics.ascent; p->image.descent = fontMetrics.descent; p->image.zAlt = HtmlMarkupArg(p, "alt", "<image>"); p->image.w = Tk_TextWidth(font, p->image.zAlt, strlen(p->image.zAlt)); }else{ int w, h; p->image.pNext = p->image.pImage->pList; p->image.pImage->pList = p; Tk_SizeOfImage(p->image.pImage->image, &w, &h); p->image.h = h; p->image.w = w; p->image.ascent = h/2; p->image.descent = h - p->image.ascent; } if( (z = HtmlMarkupArg(p, "width", 0))!=0 ){ int w = atoi(z); if( w>0 ) p->image.w = w; } if( (z = HtmlMarkupArg(p, "height", 0))!=0 ){ int h = atoi(z); if( h>0 ) p->image.h = h; } break; case Html_HR: case Html_TABLE: p->base.flags |= HTML_Visible; TestPoint(0); break; case Html_APPLET: case Html_EMBED: case Html_INPUT: p->input.textAscent = fontMetrics.ascent; p->input.textDescent = fontMetrics.descent; stop = HtmlControlSize(htmlPtr, p); break; case Html_SELECT: case Html_TEXTAREA: p->input.textAscent = fontMetrics.ascent; p->input.textDescent = fontMetrics.descent; break; case Html_EndSELECT: case Html_EndTEXTAREA: if( p->ref.pOther ){ p->ref.pOther->input.pEnd = p; stop = HtmlControlSize(htmlPtr, p->ref.pOther); } break; default: p->base.flags &= ~HTML_Visible; break; } } if( p ){ htmlPtr->lastSized = p; }else{ htmlPtr->lastSized = htmlPtr->pLast; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlsizer.h��������������������������������������������������������������������000644 �000765 �000000 �00000067351 12547026202 017103� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlWidget HtmlWidget; typedef union HtmlElement HtmlElement; int HtmlControlSize(HtmlWidget *htmlPtr,HtmlElement *pElem); int HtmlGetImageAlignment(HtmlElement *p); #define Html_Space 2 #define Html_Text 1 Tk_Font HtmlGetFont(HtmlWidget *htmlPtr,int iFont); void HtmlSizer(HtmlWidget *htmlPtr); char *HtmlTokenName(HtmlElement *p); #define HtmlTrace_Style 0x00002000 extern int HtmlTraceMask; #define DEBUG 1 #if defined(DEBUG) extern int HtmlDepth; # define TRACE_INDENT printf("%*s",HtmlDepth-3,"") #endif #if !(defined(DEBUG)) # define TRACE_INDENT #endif #if defined(DEBUG) # define TRACE(Flag, Args) \ if( (Flag)&HtmlTraceMask ){ \ TRACE_INDENT; printf Args; fflush(stdout); \ } #endif #if !(defined(DEBUG)) # define TRACE(Flag, Args) #endif #define Html_VAR 147 #define Html_U 143 #define Html_TT 141 #define Html_TITLE 137 #define Html_EndTEXTAREA 134 #define Html_TEXTAREA 133 #define Html_SUP 127 #define Html_SUB 125 #define Html_STRONG 122 #define Html_SMALL 118 #define Html_SAMP 113 #define Html_STYLE 124 #define Html_STRIKE 120 #define Html_EndSELECT 117 #define Html_SELECT 116 #define Html_SCRIPT 115 #define STY_StrikeThru 0x002 #define Html_S 111 #define Html_EndXMP 151 #define Html_EndLISTING 85 #define Html_EndPRE 110 #define STY_Preformatted 0x001 #define Html_PLAINTEXT 108 #define Html_XMP 150 #define Html_LISTING 84 #define Html_PRE 109 #define Html_EndP 105 #define Html_P 104 #define Html_NOSCRIPT 98 #define Html_NOFRAME 96 #define STY_NoBreak 0x008 #define Html_NOBR 94 #define Html_MARQUEE 88 #define HTML_Visible 0x01 /* This element produces "ink" */ #define Html_OL 100 #define Html_LI 81 #define Html_KBD 79 #define Html_INPUT 77 typedef struct HtmlImage HtmlImage; HtmlImage *HtmlGetImage(HtmlWidget *htmlPtr,HtmlElement *p); #define Html_IMG 76 #define Html_I 73 #define Html_HR 70 #define Html_EndH6 69 #define Html_EndH5 67 #define Html_EndH4 65 #define Html_EndH3 63 #define Html_EndH2 61 #define Html_EndH1 59 #define Html_H6 68 #define Html_H5 66 #define Html_H4 64 #define Html_H3 62 #define Html_H2 60 #define Html_H1 58 #define Html_EndFORM 53 void HtmlAppendArglist(Tcl_DString *str,HtmlElement *pElem); #define Html_FORM 52 int HtmlGetColorByName(HtmlWidget *htmlPtr,char *zColor); #define N_FONT_SIZE 7 #define Html_FONT 50 #define Html_BASEFONT 15 #define Html_EMBED 49 #define ItalicFont(X) ((X)+2*N_FONT_SIZE) #define Html_EM 47 #define Html_EndDT 46 #define Html_EndDD 36 #define STY_DT 0x020 #define Html_DT 45 #define Html_DIV 41 #define Html_EndUL 146 #define Html_EndOL 101 #define Html_EndMENU 91 #define Html_EndDIR 40 #define Html_EndDL 44 #define Html_UL 145 #define Html_MENU 90 #define Html_DIR 39 #define Html_DL 43 #define Html_DD 35 #define Html_COMMENT 33 #define CWFont(X) ((X)+4*N_FONT_SIZE) #define Html_CODE 31 #define Html_CITE 29 #define Html_CENTER 27 #define Html_EndCAPTION 26 #define Html_CAPTION 25 #define Html_BIG 18 #define FontFamily(X) (((X)/N_FONT_SIZE)*N_FONT_SIZE) #define Html_EndBASEFONT 16 #define Html_EndDIV 42 char *HtmlResolveUri(HtmlWidget *htmlPtr,char *zUri); #define Html_BASE 14 #define Html_EndVAR 148 #define Html_EndU 144 #define Html_EndTT 142 #define Html_EndTITLE 138 #define Html_EndSUP 128 #define Html_EndSUB 126 #define Html_EndSTRONG 123 #define Html_EndSTRIKE 121 #define Html_EndSMALL 119 #define Html_EndSAMP 114 #define Html_EndS 112 #define Html_EndNOSCRIPT 99 #define Html_EndNOFRAME 97 #define Html_EndNOBR 95 #define Html_EndMARQUEE 89 #define Html_EndKBD 80 #define Html_EndI 74 #define Html_EndFONT 51 #define Html_EndEM 48 #define Html_EndCOMMENT 34 #define Html_EndCODE 32 #define Html_EndCITE 30 #define Html_EndCENTER 28 #define Html_EndBIG 19 #define Html_EndB 13 #define BoldFont(X) ((X)+N_FONT_SIZE) #define Html_B 12 #define Html_EndAPPLET 10 #define Html_APPLET 9 #define ALIGN_None 0 #define Html_EndBLOCKQUOTE 21 #define Html_BLOCKQUOTE 20 #define Html_EndADDRESS 8 #define Html_ADDRESS 7 #define STY_Anchor 0x010 #define STY_Underline 0x004 #define Html_EndA 6 #define Html_A 5 #define STYLER_RUNNING 0x000800 void HtmlAddStyle(HtmlWidget *htmlPtr,HtmlElement *p); #define COLOR_Visited 2 /* Color for visited hyperlinks */ int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); #define COLOR_Unvisited 1 /* Index for unvisited hyperlinks */ #define STY_Invisible 0x040 #define LI_TYPE_Bullet3 3 /* A hollow square */ #define LI_TYPE_Bullet2 2 /* A hollow circle */ #define LI_TYPE_Bullet1 1 /* A solid circle */ #define LI_TYPE_Enum_i 8 /* Lower-case roman numerals */ #define LI_TYPE_Enum_I 7 /* Capitalized roman numerals */ #define LI_TYPE_Enum_1 4 /* Arabic numbers */ #define LI_TYPE_Enum_a 6 /* a, b, c, ... */ #define LI_TYPE_Enum_A 5 /* A, B, C, ... */ #define ALIGN_Center 3 #define ALIGN_Right 2 #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define Html_Block 4 #define HtmlIsMarkup(X) ((X)->base.type>Html_Block) typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define FontSize(X) ((X)%N_FONT_SIZE) #define HtmlFree(A) Tcl_Free((char*)(A)) void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif #define Html_EndTABLE 130 #define Html_EndTR 140 #define Html_TR 139 #define Html_EndTH 136 #define Html_TH 135 #define Html_EndTD 132 #define Html_TD 131 #define Html_TABLE 129 #define Html_TypeCount 151 HtmlStyle HtmlPopStyleStack(HtmlWidget *htmlPtr,int tag); #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) typedef struct HtmlStyleStack HtmlStyleStack; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; #define ALIGN_Left 1 #define COLOR_Background 4 /* Default background color */ #define COLOR_Normal 0 /* Index for normal color (black) */ #define NormalFont(X) (X) typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmltable.c��������������������������������������������������������������������000644 �000765 �000000 �00000114715 12547267112 017035� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines for doing layout of HTML tables ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <math.h> #include "htmltable.h" /* ** Default values for various table style parameters */ #define DFLT_BORDER 0 #define DFLT_CELLSPACING_3D 5 #define DFLT_CELLSPACING_FLAT 0 #define DFLT_CELLPADDING 2 #define DFLT_HSPACE 0 #define DFLT_VSPACE 0 #if INTERFACE /* ** Set parameter A to the maximum of A and B. */ #define SETMAX(A,B) if( (A)<(B) ){ (A) = (B); } #define MAX(A,B) ((A)<(B)?(B):(A)) #endif /* ** Return the appropriate cell spacing for the given table. */ static int CellSpacing(HtmlWidget *htmlPtr, HtmlElement *pTable){ char *z; int relief; int cellSpacing; z = HtmlMarkupArg(pTable, "cellspacing", 0); if( z==0 ){ relief = htmlPtr->tableRelief; if( relief==TK_RELIEF_RAISED || relief==TK_RELIEF_SUNKEN ){ cellSpacing = DFLT_CELLSPACING_3D; }else{ cellSpacing = DFLT_CELLSPACING_FLAT; } }else{ cellSpacing = atoi(z); } return cellSpacing; } /* Forward declaration */ static HtmlElement *MinMax(HtmlWidget*, HtmlElement *, int *, int *, int); /* pStart points to a <table>. Compute the number of columns, the ** minimum and maximum size for each column and the overall minimum ** and maximum size for this table and store these value in the ** pStart structure. Return a pointer to the </table> element, ** or to NULL if there is no </table>. ** ** The min and max size for column N (where the leftmost column has ** N==1) is pStart->minW[1] and pStart->maxW[1]. The pStart->minW[0] ** and pStart->maxW[0] entries contain the minimum and maximum widths ** of the whole table, including any cell padding, cell spacing, ** border width and "hspace". The values of pStart->minW[I] for I>=1 ** do not contain any cell padding, cell spacing or border width. ** Only pStart->minW[0] contains these extra spaces. ** ** The back references from </table>, </tr>, </td> and </th> back to ** the <table> markup are also filled in. And for each <td> and <th> ** markup, the pTable and pEnd fields are set to their proper values. */ static HtmlElement *TableDimensions( HtmlWidget *htmlPtr, /* The HTML widget */ HtmlElement *pStart, /* The <table> markup */ int lineWidth /* Total widget available to the table */ ){ HtmlElement *p; /* Element being processed */ HtmlElement *pNext; /* Next element to process */ int iCol = 0; /* Current column number. 1..N */ int iRow = 0; /* Current row number */ int inRow = 0; /* True if in between <TR> and </TR> */ int i, j; /* Loop counters */ int n; /* Number of columns */ int minW, maxW, requestedW; /* min, max, requested width for a cell */ int noWrap; /* true for NOWRAP cells */ int colspan; /* Column span for the current cell */ int rowspan; /* Row span for the current cell */ char *z; /* Value of a <table> parameter */ int cellSpacing; /* Value of CELLSPACING parameter */ int cellPadding; /* Value of CELLPADDING parameter */ int tbw; /* Width of border around whole table */ int cbw; /* Width of border around one cell */ int hspace; /* Value of HSPACE parameter */ int separation; /* Space between columns */ int margin; /* Space between left margin and 1st col */ int availWidth; /* Part of lineWidth still available */ int maxTableWidth; /* Amount of lineWidth available to table*/ int fromAbove[HTML_MAX_COLUMNS+1]; /* Cell above extends thru this row */ int min0span[HTML_MAX_COLUMNS+1]; /* Min for colspan=0 cells */ int max0span[HTML_MAX_COLUMNS+1]; /* Max for colspan=0 cells */ int reqW[HTML_MAX_COLUMNS+1]; /* Requested width for each column */ /* colMin[A][B] is the absolute minimum width of all columns between ** A+1 and B+1. colMin[B][A] is the requested width of columns between ** A+1 and B+1. This information is used to add in the constraints imposed ** by <TD COLSPAN=N> markup where N>=2. */ int colMin[HTML_MAX_COLUMNS+1][HTML_MAX_COLUMNS+1]; # define ColMin(A,B) colMin[(A)-1][(B)-1] # define ColReq(A,B) colMin[(B)-1][(A)-1] if( pStart==0 || pStart->base.type!=Html_TABLE ){ TestPoint(0); return pStart; } TRACE_PUSH(HtmlTrace_Table1); TRACE(HtmlTrace_Table1, ("Starting TableDimensions..\n")); pStart->table.nCol = 0; pStart->table.nRow = 0; z = HtmlMarkupArg(pStart, "border", 0); if( z && *z==0 ) z = "2"; tbw = pStart->table.borderWidth = z ? atoi(z) : DFLT_BORDER; cbw = tbw>0; z = HtmlMarkupArg(pStart, "cellpadding", 0); cellPadding = z ? atoi(z) : DFLT_CELLPADDING; cellSpacing = CellSpacing(htmlPtr, pStart); #ifdef DEBUG /* The HtmlTrace_Table4 flag causes tables to be draw with borders ** of 2, cellPadding of 5 and cell spacing of 2. This makes the ** table clearly visible. Useful for debugging. */ if( HtmlTraceMask & HtmlTrace_Table4 ){ tbw = pStart->table.borderWidth = 2; cbw = 1; cellPadding = 5; cellSpacing = 2; pStart->base.style.bgcolor = COLOR_Background; } #endif separation = cellSpacing + 2*(cellPadding + cbw); margin = tbw + cellSpacing + cbw + cellPadding; z = HtmlMarkupArg(pStart, "hspace", 0); hspace = z ? atoi(z) : DFLT_HSPACE; for(p=pStart->pNext; p && p->base.type!=Html_EndTABLE; p=pNext){ pNext = p->pNext; switch( p->base.type ){ case Html_EndTD: case Html_EndTH: case Html_EndTABLE: p->ref.pOther = pStart; TestPoint(0); break; case Html_EndTR: p->ref.pOther = pStart; inRow = 0; TestPoint(0); break; case Html_TR: p->ref.pOther = pStart; iRow++; pStart->table.nRow++; iCol = 0; inRow = 1; maxTableWidth = availWidth = lineWidth - 2*margin; TestPoint(0); break; case Html_CAPTION: while( p && p->base.type!=Html_EndTABLE && p->base.type!=Html_EndCAPTION ){ p = p->pNext; TestPoint(0); } break; case Html_TD: case Html_TH: if( !inRow ){ /* If the <TR> markup is omitted, insert it. */ HtmlElement *pNew = HtmlAlloc( sizeof(HtmlRef) ); if( pNew==0 ) break; memset(pNew, 0, sizeof(HtmlRef)); pNew->base = p->base; pNew->base.pNext = p; pNew->base.type = Html_TR; pNew->base.count = 0; p->base.pPrev->base.pNext = pNew; p->base.pPrev = pNew; pNext = pNew; break; } do{ iCol++; }while( iCol <= pStart->table.nCol && fromAbove[iCol] > iRow ); p->cell.pTable = pStart; colspan = p->cell.colspan; if( colspan==0 ){ colspan = 1; } if( iCol + colspan - 1 > pStart->table.nCol ){ int nCol = iCol + colspan - 1; if( nCol > HTML_MAX_COLUMNS ){ nCol = HTML_MAX_COLUMNS; } for(i=pStart->table.nCol+1; i<=nCol; i++){ fromAbove[i] = 0; pStart->table.minW[i] = 0; pStart->table.maxW[i] = 0; min0span[i] = 0; max0span[i] = 0; reqW[i] = 0; for(j=1; j<i; j++){ ColMin(j,i) = 0; ColReq(j,i) = 0; } } pStart->table.nCol = nCol; } noWrap = HtmlMarkupArg(p, "nowrap", 0)!=0; pNext = MinMax(htmlPtr, p, &minW, &maxW, availWidth); p->cell.pEnd = pNext; if( (z = HtmlMarkupArg(p, "width", 0))!=0 ){ for(i=0; isdigit(z[i]); i++){} if( strcmp(z,"*")==0 ){ requestedW = availWidth; }else if( z[i]==0 ){ requestedW = atoi(z); }else if( z[i]=='%' ){ /* requestedW = (atoi(z)*availWidth + 99)/100; */ requestedW = (atoi(z)*maxTableWidth + 99)/100; } }else{ requestedW = 0; } TRACE(HtmlTrace_Table1, ("Row %d Column %d: min=%d max=%d req=%d stop at %s\n", iRow,iCol,minW,maxW,requestedW, HtmlTokenName(p->cell.pEnd))); if( noWrap ){ minW = maxW; } if( iCol + p->cell.colspan <= HTML_MAX_COLUMNS ){ int min = 0; if( p->cell.colspan==0 ){ SETMAX( min0span[iCol], minW ); SETMAX( max0span[iCol], maxW ); min = min0span[iCol] + separation; }else if( colspan==1 ){ SETMAX( pStart->table.minW[iCol], minW ); SETMAX( pStart->table.maxW[iCol], maxW ); SETMAX( reqW[iCol], requestedW ); min = pStart->table.minW[iCol] + separation; }else{ int n = p->cell.colspan; SETMAX( ColMin(iCol,iCol+n-1), minW); SETMAX( ColReq(iCol,iCol+n-1), requestedW); min = minW + separation; #if 0 maxW = (maxW + (n - 1)*(1-separation))/n; for(i=iCol; i<iCol + n && i<HTML_MAX_COLUMNS; i++){ SETMAX( pStart->table.maxW[i], maxW ); } #endif } availWidth -= min; } rowspan = p->cell.rowspan; if( rowspan==0 ){ rowspan = LARGE_NUMBER; } if( rowspan>1 ){ for(i=iCol; i<iCol + p->cell.colspan && i<HTML_MAX_COLUMNS; i++){ fromAbove[i] = iRow + rowspan; } } if( p->cell.colspan > 1 ){ iCol += p->cell.colspan - 1; }else if( p->cell.colspan==0 ){ iCol = HTML_MAX_COLUMNS + 1; } break; } } #ifdef DEBUG if( HtmlTraceMask & HtmlTrace_Table6 ){ char *zSpace = ""; TRACE_INDENT; for(i=1; i<=pStart->table.nCol; i++){ printf("%s%d:%d..%d",zSpace,i, pStart->table.minW[i],pStart->table.maxW[i]); if( reqW[i]>0 ){ printf("(w=%d)",reqW[i]); } zSpace = " "; } printf("\n"); for(i=1; i<pStart->table.nCol; i++){ for(j=i+1; j<=pStart->table.nCol; j++){ if( ColMin(i,j)>0 ){ TRACE_INDENT; printf("ColMin(%d,%d) = %d\n", i, j, ColMin(i,j)); } if( ColReq(i,j)>0 ){ TRACE_INDENT; printf("ColReq(%d,%d) = %d\n", i, j, ColReq(i,j)); } } } } #endif /* Compute the min and max width of each column */ for(i=1; i<=pStart->table.nCol; i++){ int sumMin, sumReq, sumMax; /* Reduce the max[] field to N for columns that have "width=N" */ if( reqW[i]>0 ){ pStart->table.maxW[i] = MAX(pStart->table.minW[i],reqW[i]); } /* Expand the width of columns marked with "colspan=0". */ if( min0span[i]>0 || max0span[i]>0 ){ int n = pStart->table.nCol - i + 1; minW = (min0span[i] + (n - 1)*(1-separation))/n; maxW = (max0span[i] + (n - 1)*(1-separation))/n; for(j=i; j<=pStart->table.nCol; j++){ SETMAX( pStart->table.minW[j], minW ); SETMAX( pStart->table.maxW[j], maxW ); } } /* Expand the minW[] of columns to accomodate "colspan=N" constraints. ** The minW[] is expanded up to the maxW[] first. Then all the maxW[]s ** are expanded in proportion to their sizes. The same thing occurs ** for reqW[]s. */ sumReq = reqW[i]; sumMin = pStart->table.minW[i]; sumMax = pStart->table.maxW[i]; for(j=i-1; j>=1; j--){ int cmin, creq; sumMin += pStart->table.minW[j]; sumMax += pStart->table.maxW[j]; sumReq += reqW[i]; cmin = ColMin(j,i); if( cmin>sumMin ){ int k; double scale; int *tminW = pStart->table.minW; int *tmaxW = pStart->table.maxW; if( sumMin<sumMax ){ scale = (double)(cmin - sumMin)/(double)(sumMax - sumMin); for(k=j; k<=i; k++){ sumMin -= tminW[k]; tminW[k] = (tmaxW[k] - tminW[k])*scale + tminW[k]; sumMin += tminW[k]; } }else if( sumMin>0 ){ scale = (double)cmin/(double)sumMin; for(k=j; k<=i; k++){ sumMin -= tminW[k]; tminW[k] = tmaxW[k] = tminW[k]*scale; sumMin += tminW[k]; } }else{ int unit = cmin/(i-j+1); for(k=j; k<=i; k++){ tminW[k] = tmaxW[k] = unit; sumMin += tminW[k]; } } } creq = ColReq(j,i); if( creq>sumReq ){ int k; double scale; int *tmaxW = pStart->table.maxW; if( sumReq<sumMax ){ scale = (double)(creq - sumReq)/(double)(sumMax - sumReq); for(k=j; k<=i; k++){ sumReq -= reqW[k]; reqW[k] = (tmaxW[k] - reqW[k])*scale + reqW[k]; sumReq += reqW[k]; } }else if( sumReq>0 ){ scale = (double)creq/(double)sumReq; for(k=j; k<=i; k++){ sumReq -= reqW[k]; reqW[k] = reqW[k]*scale; sumReq += reqW[k]; } }else{ int unit = creq/(i-j+1); for(k=j; k<=i; k++){ reqW[k] = unit; sumReq += reqW[k]; } } } } } #ifdef DEBUG if( HtmlTraceMask & HtmlTrace_Table6 ){ char *zSpace = ""; TRACE_INDENT; for(i=1; i<=pStart->table.nCol; i++){ printf("%s%d:%d..%d",zSpace,i, pStart->table.minW[i],pStart->table.maxW[i]); if( reqW[i]>0 ){ printf("(w=%d)",reqW[i]); } zSpace = " "; } printf("\n"); } #endif /* Compute the min and max width of the whole table */ n = pStart->table.nCol; requestedW = tbw*2 + (n+1)*cellSpacing + n*2*(cellPadding + cbw); pStart->table.minW[0] = requestedW; pStart->table.maxW[0] = requestedW; for(i=1; i<=pStart->table.nCol; i++){ pStart->table.minW[0] += pStart->table.minW[i]; pStart->table.maxW[0] += pStart->table.maxW[i]; requestedW += MAX(reqW[i], pStart->table.minW[i]); } /* Figure out how wide to draw the table */ z = HtmlMarkupArg(pStart, "width", 0); if( z ){ int len = strlen(z); int totalWidth; if( len>0 && z[len-1]=='%' ){ totalWidth = (atoi(z) * lineWidth)/100; }else{ totalWidth = atoi(z); } SETMAX( requestedW, totalWidth ); } if( lineWidth && (requestedW > lineWidth) ){ TRACE(HtmlTrace_Table5,("RequestedW reduced to lineWidth: %d -> %d\n", requestedW, lineWidth)); requestedW = lineWidth; } if( requestedW > pStart->table.minW[0] ){ float scale; int *tminW = pStart->table.minW; int *tmaxW = pStart->table.maxW; TRACE(HtmlTrace_Table5, ("Expanding table minW from %d to %d. (reqW=%d width=%s)\n", tminW[0], requestedW, requestedW, z)); if( tmaxW[0] > tminW[0] ){ scale = (double)(requestedW - tminW[0]) / (double)(tmaxW[0] - tminW[0]); for(i=1; i<=pStart->table.nCol; i++){ tminW[i] += (tmaxW[i] - tminW[i]) * scale; SETMAX(tmaxW[i], tminW[i]); } }else if( tminW[0]>0 ){ scale = requestedW/(double)tminW[0]; for(i=1; i<=pStart->table.nCol; i++){ tminW[i] *= scale; tmaxW[i] *= scale; } }else if( pStart->table.nCol>0 ){ int unit = (requestedW - margin)/pStart->table.nCol - separation; if( unit<0 ) unit = 0; for(i=1; i<=pStart->table.nCol; i++){ tminW[i] = tmaxW[i] = unit; } }else{ tminW[0] = tmaxW[0] = requestedW; } pStart->table.minW[0] = requestedW; SETMAX( pStart->table.maxW[0], requestedW ); } #ifdef DEBUG if( HtmlTraceMask & HtmlTrace_Table5 ){ TRACE_INDENT; printf("Start with %s and ", HtmlTokenName(pStart)); printf("end with %s\n", HtmlTokenName(p)); TRACE_INDENT; printf("nCol=%d minWidth=%d maxWidth=%d\n", pStart->table.nCol, pStart->table.minW[0], pStart->table.maxW[0]); for(i=1; i<=pStart->table.nCol; i++){ TRACE_INDENT; printf("Column %d minWidth=%d maxWidth=%d\n", i, pStart->table.minW[i], pStart->table.maxW[i]); } } #endif TRACE(HtmlTrace_Table1, ("Result of TableDimensions: min=%d max=%d nCol=%d\n", pStart->table.minW[0], pStart->table.maxW[0], pStart->table.nCol)); TRACE_POP(HtmlTrace_Table1); return p; } /* ** Given a list of elements, compute the minimum and maximum width needed ** to render the list. Stop the search at the first element seen that is ** in the following set: ** ** <tr> <td> <th> </tr> </td> </th> </table> ** ** Return a pointer to the element that stopped the search, or to NULL ** if we ran out of data. ** ** Sometimes the value returned for both min and max will be larger than ** the true minimum and maximum. This is rare, and only occurs if the ** element string contains figures with flow-around text. */ static HtmlElement *MinMax( HtmlWidget *htmlPtr, /* The Html widget */ HtmlElement *p, /* Start the search here */ int *pMin, /* Return the minimum width here */ int *pMax, /* Return the maximum width here */ int lineWidth /* Total width available */ ){ int min = 0; /* Minimum width so far */ int max = 0; /* Maximum width so far */ int indent = 0; /* Amount of indentation (minimum) */ int obstacle = 0; /* Possible obstacles in the margin */ int x1 = 0; /* Length of current line assuming maximum length */ int x2 = 0; /* Length of current line assuming minimum length */ int go = 1; /* Change to 0 to stop the loop */ HtmlElement *pNext; /* Next element in the list */ for(p=p->pNext; go && p; p = pNext){ pNext = p->pNext; switch( p->base.type ){ case Html_Text: x1 += p->text.w; x2 += p->text.w; if( p->base.style.flags & STY_Preformatted ){ SETMAX( min, x1 ); SETMAX( max, x1 ); }else{ SETMAX( min, x2 ); SETMAX( max, x1 ); } break; case Html_Space: if( p->base.style.flags & STY_Preformatted ){ if( p->base.flags & HTML_NewLine ){ x1 = x2 = indent; }else{ x1 += p->space.w * p->base.count; x2 += p->space.w * p->base.count; } }else if( p->base.style.flags & STY_NoBreak ){ if( x1>indent ){ x1 += p->space.w; TestPoint(0);} if( x2>indent ){ x2 += p->space.w; TestPoint(0);} }else{ if( x1>indent ){ x1 += p->space.w; TestPoint(0);} x2 = indent; } break; case Html_IMG: switch( p->image.align ){ case IMAGE_ALIGN_Left: case IMAGE_ALIGN_Right: obstacle += p->image.w; x1 = obstacle + indent; x2 = indent; SETMAX( min, x2 ); SETMAX( min, p->image.w ); SETMAX( max, x1 ); break; default: x1 += p->image.w; x2 += p->image.w; if( p->base.style.flags & STY_Preformatted ){ SETMAX( min, x1 ); SETMAX( max, x1 ); }else{ SETMAX( min, x2 ); SETMAX( max, x1 ); } break; } break; case Html_TABLE: /* pNext = TableDimensions(htmlPtr, p, lineWidth-indent); */ pNext = TableDimensions(htmlPtr, p, 0); x1 = p->table.maxW[0] + indent + obstacle; x2 = p->table.minW[0] + indent; SETMAX( max, x1 ); SETMAX( min, x2 ); x1 = indent + obstacle; x2 = indent; if( pNext && pNext->base.type==Html_EndTABLE ){ pNext = pNext->pNext; } break; case Html_UL: case Html_OL: indent += HTML_INDENT; x1 = indent + obstacle; x2 = indent; break; case Html_EndUL: case Html_EndOL: indent -= HTML_INDENT; if( indent < 0 ){ indent = 0; } x1 = indent + obstacle; x2 = indent; break; case Html_BLOCKQUOTE: indent += 2*HTML_INDENT; x1 = indent + obstacle; x2 = indent; break; case Html_EndBLOCKQUOTE: indent -= 2*HTML_INDENT; if( indent < 0 ){ indent = 0; } x1 = indent + obstacle; x2 = indent; break; case Html_APPLET: case Html_INPUT: case Html_SELECT: case Html_EMBED: case Html_TEXTAREA: x1 += p->input.w + p->input.padLeft; if( p->base.style.flags & STY_Preformatted ){ SETMAX( min, x1 ); SETMAX( max, x1 ); x2 += p->input.w + p->input.padLeft; }else{ SETMAX( min, indent + p->input.w ); SETMAX( max, x1 ); x2 = indent; } break; case Html_BR: case Html_P: case Html_EndP: case Html_DIV: case Html_EndDIV: case Html_H1: case Html_EndH1: case Html_H2: case Html_EndH2: case Html_H3: case Html_EndH3: case Html_H4: case Html_EndH4: case Html_H5: case Html_H6: x1 = indent + obstacle; x2 = indent; break; case Html_EndTD: case Html_EndTH: case Html_CAPTION: case Html_EndTABLE: case Html_TD: case Html_TR: case Html_TH: case Html_EndTR: go = 0; break; default: break; } if( !go ){ break; } } *pMin = min; *pMax = max; return p; } /* Vertical alignments: */ #define VAlign_Unknown 0 #define VAlign_Top 1 #define VAlign_Bottom 2 #define VAlign_Center 3 #define VAlign_Baseline 4 /* ** Return the vertical alignment specified by the given element. */ static int GetVerticalAlignment(HtmlElement *p, int dflt){ char *z; int rc; if( p==0 ) return dflt; z = HtmlMarkupArg(p, "valign", 0); if( z==0 ){ rc = dflt; TestPoint(0); }else if( stricmp(z,"top")==0 ){ rc = VAlign_Top; TestPoint(0); }else if( stricmp(z,"bottom")==0 ){ rc = VAlign_Bottom; TestPoint(0); }else if( stricmp(z,"center")==0 ){ rc = VAlign_Center; TestPoint(0); }else if( stricmp(z,"baseline")==0 ){ rc = VAlign_Baseline; TestPoint(0); }else{ rc = dflt; TestPoint(0); } return rc; } /* Do all layout for a single table. Return the </table> element or ** NULL if the table is unterminated. */ HtmlElement *HtmlTableLayout( HtmlLayoutContext *pLC, /* The layout context */ HtmlElement *pTable /* The <table> element */ ){ HtmlElement *pEnd; /* The </table> element */ HtmlElement *p; /* For looping thru elements of the table */ HtmlElement *pNext; /* Next element in the loop */ HtmlElement *pCaption; /* Start of the caption text. The <caption> */ HtmlElement *pEndCaption; /* End of the caption. The </caption> */ int width; /* Width of the table as drawn */ int cellSpacing; /* Value of cellspacing= parameter to <table> */ int cellPadding; /* Value of cellpadding= parameter to <table> */ int tbw; /* Width of the 3D border around the whole table */ int cbw; /* Width of the 3D border around a cell */ int pad; /* cellPadding + borderwidth */ char *z; /* A string */ int leftMargin; /* The left edge of space available for drawing */ int lineWidth; /* Total horizontal space available for drawing */ int separation; /* Distance between content of columns (or rows) */ int i; /* Loop counter */ int n; /* Number of columns */ int btm; /* Bottom edge of previous row */ int iRow; /* Current row number */ int iCol; /* Current column number */ int colspan; /* Number of columns spanned by current cell */ int vspace; /* Value of the vspace= parameter to <table> */ int hspace; /* Value of the hspace= parameter to <table> */ int rowBottom; /* Bottom edge of content in the current row */ int defaultVAlign; /* Default vertical alignment for the current row */ char *zAlign; /* Value of the ALIGN= attribute of the <TABLE> */ #define N HTML_MAX_COLUMNS+1 int y[N]; /* Top edge of each cell's content */ int x[N]; /* Left edge of each cell's content */ int w[N]; /* Width of each cell's content */ int ymax[N]; /* Bottom edge of cell's content if valign=top */ HtmlElement *apElem[N]; /* The <td> or <th> for each cell in a row */ int firstRow[N]; /* First row on which a cell appears */ int lastRow[N]; /* Row to which each cell span's */ int valign[N]; /* Vertical alignment for each cell */ HtmlLayoutContext savedContext; /* Saved copy of the original pLC */ HtmlLayoutContext cellContext; /* Used to render a single cell */ #ifdef TABLE_TRIM_BLANK extern int HtmlLineWasBlank; #endif /* TABLE_TRIM_BLANK */ if( pTable==0 || pTable->base.type!=Html_TABLE ){ TestPoint(0); return pTable; } TRACE_PUSH(HtmlTrace_Table2); TRACE(HtmlTrace_Table2, ("Starting TableLayout() at %s\n", HtmlTokenName(pTable))); /* Figure how much horizontal space is available for rendering ** this table. Store the answer in lineWidth. leftMargin is ** the left-most X coordinate of the table. btm stores the top-most ** Y coordinate. */ HtmlComputeMargins(pLC, &leftMargin, &btm, &lineWidth); TRACE(HtmlTrace_Table2, ("...btm=%d left=%d width=%d\n", btm, leftMargin, lineWidth)); /* figure out how much space the table wants for each column, ** and in total.. */ pEnd = TableDimensions(pLC->htmlPtr, pTable, lineWidth); /* If we don't have enough horizontal space to accomodate the minimum table ** width, then try to move down past some obstruction (such as an ** <IMG ALIGN=LEFT>) to give us more room. */ if( lineWidth < pTable->table.minW[0] ){ HtmlWidenLine(pLC, pTable->table.minW[0], &leftMargin, &btm, &lineWidth); TRACE(HtmlTrace_Table2, ("Widen to btm=%d left=%d width=%d\n", btm, leftMargin, lineWidth)); } savedContext = *pLC; /* Figure out how wide to draw the table */ if( lineWidth < pTable->table.minW[0] ){ width = pTable->table.minW[0]; }else if( lineWidth <= pTable->table.maxW[0] ){ width = lineWidth; }else{ width = pTable->table.maxW[0]; } /* Compute the width and left edge position of every column in ** the table */ z = HtmlMarkupArg(pTable, "cellpadding", 0); cellPadding = z ? atoi(z) : DFLT_CELLPADDING; cellSpacing = CellSpacing(pLC->htmlPtr, pTable); z = HtmlMarkupArg(pTable, "vspace", 0); vspace = z ? atoi(z) : DFLT_VSPACE; z = HtmlMarkupArg(pTable, "hspace", 0); hspace = z ? atoi(z) : DFLT_HSPACE; #ifdef DEBUG if( HtmlTraceMask & HtmlTrace_Table4 ){ cellPadding = 5; cellSpacing = 2; if( vspace<2 ) vspace = 2; if( hspace<2 ) hspace = 2; } #endif tbw = pTable->table.borderWidth; cbw = (tbw>0); pad = cellPadding + cbw; separation = cellSpacing + 2*pad; x[1] = leftMargin + tbw + cellSpacing + pad; n = pTable->table.nCol; if( n<=0 || pTable->table.maxW[0]<=0 ){ /* Abort if the table has no columns at all or if the total width ** of the table is zero or less. */ return pEnd; } zAlign = HtmlMarkupArg(pTable, "align", ""); if( width < lineWidth ){ int align = pTable->base.style.align; if( align==ALIGN_Right || stricmp(zAlign,"right")==0 ){ x[1] += lineWidth - width; }else if( align==ALIGN_Center && stricmp(zAlign,"left")!=0 ){ x[1] += (lineWidth - width)/2; } } if( width==pTable->table.maxW[0] ){ w[1] = pTable->table.maxW[1]; for(i=2; i<=n; i++){ w[i] = pTable->table.maxW[i]; x[i] = x[i-1] + w[i-1] + separation; TestPoint(0); } }else if( width > pTable->table.maxW[0] ){ int *tmaxW = pTable->table.maxW; double scale = ((double)width)/ (double)tmaxW[0]; w[1] = tmaxW[1] * scale; for(i=2; i<=n; i++){ w[i] = tmaxW[i] * scale; x[i] = x[i-1] + w[i-1] + separation; TestPoint(0); } }else if( width > pTable->table.minW[0] ){ float scale; int *tminW = pTable->table.minW; int *tmaxW = pTable->table.maxW; scale = (double)(width - tminW[0]) / (double)(tmaxW[0] - tminW[0]); w[1] = tminW[1] + (tmaxW[1] - tminW[1]) * scale; for(i=2; i<=n; i++){ w[i] = tminW[i] + (tmaxW[i] - tminW[i]) * scale; x[i] = x[i-1] + w[i-1] + separation; TestPoint(0); } }else{ w[1] = pTable->table.minW[1]; for(i=2; i<=n; i++){ w[i] = pTable->table.minW[i]; x[i] = x[i-1] + w[i-1] + separation; TestPoint(0); } } w[n] = width - ((x[n] - x[1]) + 2*(tbw + pad + cellSpacing)); /* Add notation to the pTable structure so that we will know where ** to draw the outer box around the outside of the table. */ btm += vspace; pTable->table.y = btm; pTable->table.x = x[1] - (tbw + cellSpacing + pad); pTable->table.w = width; SETMAX(pLC->maxX, pTable->table.x + pTable->table.w); btm += tbw + cellSpacing; /* Begin rendering rows of the table */ for(i=1; i<=n; i++){ firstRow[i] = 0; lastRow[i] = 0; apElem[i] = 0; } p = pTable->pNext; rowBottom = btm; for(iRow=1; iRow<=pTable->table.nRow; iRow++){ TRACE(HtmlTrace_Table2, ("Row %d: btm=%d\n",iRow,btm)); /* Find the start of the next row. Keep an eye out for the caption ** while we search */ while( p && p->base.type!=Html_TR ){ if( p->base.type==Html_CAPTION ){ pCaption = p; while( p && p!=pEnd && p->base.type!=Html_EndCAPTION ){ p = p->pNext; } pEndCaption = p; } TRACE(HtmlTrace_Table3, ("Skipping token %s\n", HtmlTokenName(p))); p = p->pNext; } if( p==0 ){ TestPoint(0); break; } /* Record default vertical alignment flag for this row */ defaultVAlign = GetVerticalAlignment(p, VAlign_Center); /* Find every new cell on this row */ for(iCol=1; iCol<=pTable->table.nCol && iCol<HTML_MAX_COLUMNS; iCol++){ if( lastRow[iCol]<iRow ) ymax[iCol] = 0; } iCol = 0; for(p=p->pNext; p && p->base.type!=Html_TR && p!=pEnd; p=pNext){ pNext = p->pNext; TRACE(HtmlTrace_Table3, ("Processing token %s\n", HtmlTokenName(p))); switch( p->base.type ){ case Html_TD: case Html_TH: /* Find the column number for this cell. Be careful to skip ** columns which extend down to this row from prior rows */ do{ iCol++; }while( iCol <= HTML_MAX_COLUMNS && lastRow[iCol] >= iRow ); TRACE(HtmlTrace_Table2, ("Column %d: x=%d w=%d\n",iCol,x[iCol],w[iCol])); /* Process the new cell. (Cells beyond the maximum number of ** cells are simply ignored.) */ if( iCol <= HTML_MAX_COLUMNS ){ apElem[iCol] = p; pNext = p->cell.pEnd; if( p->cell.rowspan==0 ){ lastRow[iCol] = pTable->table.nRow; }else{ lastRow[iCol] = iRow + p->cell.rowspan - 1; } firstRow[iCol] = iRow; /* Set vertical alignment flag for this cell */ valign[iCol] = GetVerticalAlignment(p, defaultVAlign); /* Render cell contents and record the height */ y[iCol] = btm + pad; cellContext.htmlPtr = pLC->htmlPtr; cellContext.pStart = p->pNext; cellContext.pEnd = pNext; cellContext.headRoom = 0; cellContext.top = y[iCol]; cellContext.bottom = y[iCol]; cellContext.left = x[iCol]; cellContext.right = 0; cellContext.pageWidth = x[iCol]+w[iCol]; colspan = p->cell.colspan; if( colspan==0 ){ for(i=iCol+1; i<=pTable->table.nCol; i++){ cellContext.pageWidth += w[i] + separation; lastRow[i] = lastRow[iCol]; } }else if( colspan>1 ){ for(i=iCol+1; i<iCol+colspan; i++){ cellContext.pageWidth += w[i] + separation; lastRow[i] = lastRow[iCol]; } } cellContext.maxX = 0; cellContext.maxY = 0; cellContext.leftMargin = 0; cellContext.rightMargin = 0; HtmlLock(cellContext.htmlPtr); HtmlLayoutBlock(&cellContext); if( HtmlUnlock(cellContext.htmlPtr) ) return 0; #ifdef TABLE_TRIM_BLANK /* * Cancel any trailing vertical whitespace caused * by break markup */ if (HtmlLineWasBlank) cellContext.maxY -= cellContext.headRoom; #endif /* TABLE_TRIM_BLANK */ ymax[iCol] = cellContext.maxY; SETMAX(ymax[iCol], y[iCol]); HtmlClearMarginStack(&cellContext.leftMargin); HtmlClearMarginStack(&cellContext.rightMargin); /* Set coordinates of the cell border */ p->cell.x = x[iCol] - pad; p->cell.y = btm; p->cell.w = cellContext.pageWidth + 2*pad - x[iCol]; TRACE(HtmlTrace_Table2, ("Column %d top=%d bottom=%d h=%d left=%d w=%d\n", iCol, y[iCol], ymax[iCol], ymax[iCol]-y[iCol], p->cell.x, p->cell.w)); /* Advance the column counter for cells spaning multiple columns */ if( colspan > 1 ){ iCol += colspan - 1; }else if( colspan==0 ){ iCol = HTML_MAX_COLUMNS + 1; } } break; case Html_CAPTION: /* Gotta remember where the caption is so we can render it ** at the end */ pCaption = p; while( pNext && pNext!=pEnd && pNext->base.type!=Html_EndCAPTION ){ pNext = pNext->pNext; } pEndCaption = pNext; break; } } /* Figure out how high to make this row. */ for(iCol=1; iCol<=pTable->table.nCol; iCol++){ if( lastRow[iCol] == iRow || iRow==pTable->table.nRow ){ SETMAX( rowBottom, ymax[iCol] ); } } TRACE(HtmlTrace_Table2, ("Total row height: %d..%d -> %d\n", btm,rowBottom,rowBottom-btm)); /* Position every cell whose bottom edge ends on this row */ for(iCol=1; iCol<=pTable->table.nCol; iCol++){ int dy; /* Extra space at top of cell used for vertical alignment */ /* Skip any unused cells or cells that extend down thru ** subsequent rows */ if( apElem[iCol]==0 || (iRow!=pTable->table.nRow && lastRow[iCol]>iRow) ){ continue; } /* Align the contents of the cell vertically. */ switch( valign[iCol] ){ case VAlign_Unknown: case VAlign_Center: dy = (rowBottom - ymax[iCol])/2; break; case VAlign_Top: case VAlign_Baseline: dy = 0; break; case VAlign_Bottom: dy = rowBottom - ymax[iCol]; break; } if( dy ){ HtmlElement *pLast = apElem[iCol]->cell.pEnd; TRACE(HtmlTrace_Table3, ("Delta column %d by %d\n",iCol,dy)); HtmlMoveVertically(apElem[iCol]->pNext, pLast, dy); } /* Record the height of the cell so that the border can be drawn */ apElem[iCol]->cell.h = rowBottom + pad - apElem[iCol]->cell.y; apElem[iCol] = 0; } /* Update btm to the height of the row we just finished setting */ btm = rowBottom + pad + cellSpacing; } btm += tbw; pTable->table.h = btm - pTable->table.y; SETMAX( pLC->maxY, btm ); pLC->bottom = btm + vspace; /* Render the caption, if there is one */ if( pCaption ){ } /* Whenever we do any table layout, we need to recompute all the ** HtmlBlocks. The following statement forces this. */ pLC->htmlPtr->firstBlock = pLC->htmlPtr->lastBlock = 0; /* Adjust the context for text that wraps around the table, if ** requested by an ALIGN=RIGHT or ALIGN=LEFT attribute. */ if( stricmp(zAlign,"left")==0 ){ savedContext.maxX = pLC->maxX; savedContext.maxY = pLC->maxY; *pLC = savedContext; HtmlPushMargin(&pLC->leftMargin, pTable->table.w + 2, pTable->table.y + pTable->table.h + 2, 0); }else if( stricmp(zAlign,"right")==0 ){ savedContext.maxX = pLC->maxX; savedContext.maxY = pLC->maxY; *pLC = savedContext; HtmlPushMargin(&pLC->rightMargin, pTable->table.w + 2, pTable->table.y + pTable->table.h + 2, 0); } /* All done */ TRACE(HtmlTrace_Table2, ( "Done with TableLayout(). x=%d y=%d w=%d h=%d Return %s\n", pTable->table.x, pTable->table.y, pTable->table.w, pTable->table.h, HtmlTokenName(pEnd))); TRACE_POP(HtmlTrace_Table2); return pEnd; } /* ** Move all elements in the given list vertically by the amount dy */ void HtmlMoveVertically( HtmlElement *p, /* First element to move */ HtmlElement *pLast, /* Last element. Do move this one */ int dy /* Amount by which to move */ ){ if( dy==0 ){ TestPoint(0); return; } while( p && p!=pLast ){ switch( p->base.type ){ case Html_A: p->anchor.y += dy; break; case Html_Text: p->text.y += dy; break; case Html_LI: p->li.y += dy; break; case Html_TD: case Html_TH: p->cell.y += dy; break; case Html_TABLE: p->table.y += dy; break; case Html_IMG: p->image.y += dy; break; case Html_INPUT: case Html_SELECT: case Html_APPLET: case Html_EMBED: case Html_TEXTAREA: p->input.y += dy; break; default: break; } p = p->pNext; } } ���������������������������������������������������saods9/tkhtml1.0/src/htmltable.h��������������������������������������������������������������������000644 �000765 �000000 �00000060622 12547026202 017030� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ #define Html_LI 81 #define Html_A 5 typedef struct HtmlMargin HtmlMargin; void HtmlPushMargin(HtmlMargin **ppMargin,int indent,int bottom,int tag); typedef union HtmlElement HtmlElement; void HtmlMoveVertically(HtmlElement *p,HtmlElement *pLast,int dy); void HtmlClearMarginStack(HtmlMargin **ppMargin); typedef struct HtmlWidget HtmlWidget; int HtmlUnlock(HtmlWidget *htmlPtr); typedef struct HtmlLayoutContext HtmlLayoutContext; void HtmlLayoutBlock(HtmlLayoutContext *pLC); void HtmlLock(HtmlWidget *htmlPtr); #define HtmlTrace_Table3 0x00000004 #define ALIGN_Center 3 #define ALIGN_Right 2 void HtmlWidenLine(HtmlLayoutContext *pLC,int reqWidth,int *pX,int *pY,int *pW); void HtmlComputeMargins(HtmlLayoutContext *pLC,int *pX,int *pY,int *pW); #define HtmlTrace_Table2 0x00000002 #if defined(TABLE_TRIM_BLANK) extern int HtmlLineWasBlank; #endif struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; HtmlElement *HtmlTableLayout(HtmlLayoutContext *pLC,HtmlElement *pTable); #if !defined(HAVE_STRICMP) # define stricmp strcasecmp #endif #define Html_H6 68 #define Html_H5 66 #define Html_EndH4 65 #define Html_H4 64 #define Html_EndH3 63 #define Html_H3 62 #define Html_EndH2 61 #define Html_H2 60 #define Html_EndH1 59 #define Html_H1 58 #define Html_EndDIV 42 #define Html_DIV 41 #define Html_EndP 105 #define Html_P 104 #define Html_BR 24 #define Html_TEXTAREA 133 #define Html_EMBED 49 #define Html_SELECT 116 #define Html_INPUT 77 #define Html_APPLET 9 #define Html_EndBLOCKQUOTE 21 #define Html_BLOCKQUOTE 20 #define Html_EndOL 101 #define Html_EndUL 146 #define HTML_INDENT 36 #define Html_OL 100 #define Html_UL 145 #define IMAGE_ALIGN_Right 7 #define IMAGE_ALIGN_Left 6 #define Html_IMG 76 #define STY_NoBreak 0x008 #define HTML_NewLine 0x02 /* type==Html_Space and ends with newline */ #define Html_Space 2 #define STY_Preformatted 0x001 #define Html_Text 1 extern int HtmlTraceMask; #define DEBUG 1 #if defined(DEBUG) extern int HtmlDepth; # define TRACE_POP(Flag) if( (Flag)&HtmlTraceMask ){ HtmlDepth-=3; } #endif #if !(defined(DEBUG)) # define TRACE_POP(Flag) #endif #define HtmlTrace_Table5 0x00000010 #if defined(DEBUG) # define TRACE_INDENT printf("%*s",HtmlDepth-3,"") #endif #if !(defined(DEBUG)) # define TRACE_INDENT #endif #define HtmlTrace_Table6 0x00000020 #define LARGE_NUMBER 100000000 char *HtmlTokenName(HtmlElement *p); typedef struct HtmlRef HtmlRef; typedef struct HtmlMarkupElement HtmlMarkupElement; typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) #define Html_TH 135 #define Html_TD 131 #define Html_EndCAPTION 26 #define Html_CAPTION 25 #define Html_TR 139 #define Html_EndTR 140 #define Html_EndTH 136 #define Html_EndTD 132 #define Html_EndTABLE 130 #define COLOR_Background 4 /* Default background color */ #define HtmlTrace_Table4 0x00000008 #if defined(DEBUG) # define TRACE(Flag, Args) \ if( (Flag)&HtmlTraceMask ){ \ TRACE_INDENT; printf Args; fflush(stdout); \ } #endif #if !(defined(DEBUG)) # define TRACE(Flag, Args) #endif #define HtmlTrace_Table1 0x00000001 #if defined(DEBUG) # define TRACE_PUSH(Flag) if( (Flag)&HtmlTraceMask ){ HtmlDepth+=3; } #endif #if !(defined(DEBUG)) # define TRACE_PUSH(Flag) #endif #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define Html_TABLE 129 #define HTML_MAX_COLUMNS 40 char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; #define MAX(A,B) ((A)<(B)?(B):(A)) #define SETMAX(A,B) if( (A)<(B) ){ (A) = (B); } #define INTERFACE 0 struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ��������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmltest.c���������������������������������������������������������������������000644 �000765 �000000 �00000006610 12547267112 016717� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** This file contains the TestPoint routines used for profiling ** and coverage analysis of the code. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ /* ** A macro named "TestPoint" is defined which increments a counter ** whenever it is encountered. This is very efficient, and should ** not impact performance of the system. For delivery, the macro ** can be nulled out by recompiling without the COVERAGE_TEST macro ** defined. ** ** See also the "renumber.c" program which can be used ** to assign unique numbers to all of the TestPoint(0) macros. */ #include "tcl.h" #include "htmltest.h" #if INTERFACE #if defined(COVERAGE_TEST) # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} # define UNTESTED HtmlTPUntested(__FILE__,__LINE__) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) # define HtmlVerifyLock(H) if((H)->locked==0)HtmlTPCantHappen(__FILE__,__LINE__) #else # define TestPoint(X) # define UNTESTED # define CANT_HAPPEN # define HtmlVerifyLock(H) #endif #endif /* INTERFACE */ /* ** The following global array keeps track of the number of visits to ** each testpoint. The size of the array must be set manually to the ** be at least one greater than the largest TestPoint number. */ #if defined(COVERAGE_TEST) int HtmlTPArray[2000]; #endif /* Needed by the EslTestPointDump routine */ #include <stdio.h> /* ** Recursion depth */ #if defined(DEBUG) int HtmlDepth = 0; #endif #if INTERFACE #if defined(DEBUG) #define HtmlPush HtmlDepth+=2 #define HtmlPop HtmlDepth-=2 #else #define HtmlPush #define HtmlPop #endif #endif /* This function is called to print the values of all elements of the ** TP_Array to the given file. Values are printed in decimal, one per line. */ void HtmlTestPointDump(const char *filename){ #if defined(COVERAGE_TEST) FILE *fp; fp = fopen(filename,"a"); if( fp ){ int i; for(i=0; i<sizeof(HtmlTPArray)/sizeof(HtmlTPArray[0]); i++){ if( HtmlTPArray[i]>0 ){ fprintf(fp,"%d %d\n",i,HtmlTPArray[i]); } } } fclose(fp); #endif } /* This function reports an error to stderr when code that is marked ** UNTESTED gets executed. */ void HtmlTPUntested(const char *zFile, int line){ #ifndef USE_TCL_STUBS fprintf(stderr,"Untested HTML Widget code executed in file %s line %d\n", zFile,line); #endif } /* This function reports an error to stderr when safety code that should ** never execute is called. */ void HtmlTPCantHappen(const char *zFile, int line){ #ifndef USE_TCL_STUBS fprintf(stderr,"Unplanned behavior in the HTML Widget in file %s line %d\n", zFile,line); #endif } ������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmltest.h���������������������������������������������������������������������000644 �000765 �000000 �00000002173 12547267112 016724� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ void HtmlTestPointDump(const char *filename); #define DEBUG 1 #if defined(DEBUG) extern int HtmlDepth; #define HtmlPop HtmlDepth-=2 #endif #if !(defined(DEBUG)) #define HtmlPop #endif #if defined(DEBUG) #define HtmlPush HtmlDepth+=2 #endif #if !(defined(DEBUG)) #define HtmlPush #endif void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define HtmlVerifyLock(H) if((H)->locked==0)HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define HtmlVerifyLock(H) #endif #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif void HtmlTPUntested(const char *zFile,int line); #if defined(COVERAGE_TEST) # define UNTESTED HtmlTPUntested(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define UNTESTED #endif #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define INTERFACE 0 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmltokens.c�������������������������������������������������������������������000644 �000765 �000000 �00000041471 12547026202 017240� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* DO NOT EDIT ** The code in this file was automatically generated. */ #include <tk.h> #include "htmltokens.h" #if INTERFACE struct HtmlTokenMap { char *zName; /* Name of a markup */ Html_16 type; /* Markup type code */ Html_16 extra; /* Extra space needed above HtmlBaseElement */ HtmlTokenMap *pCollide; /* Hash table collision chain */ }; #define Html_Text 1 #define Html_Space 2 #define Html_Unknown 3 #define Html_Block 4 #define HtmlIsMarkup(X) ((X)->base.type>Html_Block) #define Html_A 5 #define Html_EndA 6 #define Html_ADDRESS 7 #define Html_EndADDRESS 8 #define Html_APPLET 9 #define Html_EndAPPLET 10 #define Html_AREA 11 #define Html_B 12 #define Html_EndB 13 #define Html_BASE 14 #define Html_BASEFONT 15 #define Html_EndBASEFONT 16 #define Html_BGSOUND 17 #define Html_BIG 18 #define Html_EndBIG 19 #define Html_BLOCKQUOTE 20 #define Html_EndBLOCKQUOTE 21 #define Html_BODY 22 #define Html_EndBODY 23 #define Html_BR 24 #define Html_CAPTION 25 #define Html_EndCAPTION 26 #define Html_CENTER 27 #define Html_EndCENTER 28 #define Html_CITE 29 #define Html_EndCITE 30 #define Html_CODE 31 #define Html_EndCODE 32 #define Html_COMMENT 33 #define Html_EndCOMMENT 34 #define Html_DD 35 #define Html_EndDD 36 #define Html_DFN 37 #define Html_EndDFN 38 #define Html_DIR 39 #define Html_EndDIR 40 #define Html_DIV 41 #define Html_EndDIV 42 #define Html_DL 43 #define Html_EndDL 44 #define Html_DT 45 #define Html_EndDT 46 #define Html_EM 47 #define Html_EndEM 48 #define Html_EMBED 49 #define Html_FONT 50 #define Html_EndFONT 51 #define Html_FORM 52 #define Html_EndFORM 53 #define Html_FRAME 54 #define Html_EndFRAME 55 #define Html_FRAMESET 56 #define Html_EndFRAMESET 57 #define Html_H1 58 #define Html_EndH1 59 #define Html_H2 60 #define Html_EndH2 61 #define Html_H3 62 #define Html_EndH3 63 #define Html_H4 64 #define Html_EndH4 65 #define Html_H5 66 #define Html_EndH5 67 #define Html_H6 68 #define Html_EndH6 69 #define Html_HR 70 #define Html_HTML 71 #define Html_EndHTML 72 #define Html_I 73 #define Html_EndI 74 #define Html_IFRAME 75 #define Html_IMG 76 #define Html_INPUT 77 #define Html_ISINDEX 78 #define Html_KBD 79 #define Html_EndKBD 80 #define Html_LI 81 #define Html_EndLI 82 #define Html_LINK 83 #define Html_LISTING 84 #define Html_EndLISTING 85 #define Html_MAP 86 #define Html_EndMAP 87 #define Html_MARQUEE 88 #define Html_EndMARQUEE 89 #define Html_MENU 90 #define Html_EndMENU 91 #define Html_META 92 #define Html_NEXTID 93 #define Html_NOBR 94 #define Html_EndNOBR 95 #define Html_NOFRAME 96 #define Html_EndNOFRAME 97 #define Html_NOSCRIPT 98 #define Html_EndNOSCRIPT 99 #define Html_OL 100 #define Html_EndOL 101 #define Html_OPTION 102 #define Html_EndOPTION 103 #define Html_P 104 #define Html_EndP 105 #define Html_PARAM 106 #define Html_EndPARAM 107 #define Html_PLAINTEXT 108 #define Html_PRE 109 #define Html_EndPRE 110 #define Html_S 111 #define Html_EndS 112 #define Html_SAMP 113 #define Html_EndSAMP 114 #define Html_SCRIPT 115 #define Html_SELECT 116 #define Html_EndSELECT 117 #define Html_SMALL 118 #define Html_EndSMALL 119 #define Html_STRIKE 120 #define Html_EndSTRIKE 121 #define Html_STRONG 122 #define Html_EndSTRONG 123 #define Html_STYLE 124 #define Html_SUB 125 #define Html_EndSUB 126 #define Html_SUP 127 #define Html_EndSUP 128 #define Html_TABLE 129 #define Html_EndTABLE 130 #define Html_TD 131 #define Html_EndTD 132 #define Html_TEXTAREA 133 #define Html_EndTEXTAREA 134 #define Html_TH 135 #define Html_EndTH 136 #define Html_TITLE 137 #define Html_EndTITLE 138 #define Html_TR 139 #define Html_EndTR 140 #define Html_TT 141 #define Html_EndTT 142 #define Html_U 143 #define Html_EndU 144 #define Html_UL 145 #define Html_EndUL 146 #define Html_VAR 147 #define Html_EndVAR 148 #define Html_WBR 149 #define Html_XMP 150 #define Html_EndXMP 151 #define Html_TypeCount 151 #define HTML_MARKUP_HASH_SIZE 163 #define HTML_MARKUP_COUNT 147 #endif /* INTERFACE */ HtmlTokenMap HtmlMarkupMap[] = { { "a", Html_A, sizeof(HtmlAnchor), }, { "/a", Html_EndA, sizeof(HtmlRef), }, { "address", Html_ADDRESS, 0, }, { "/address", Html_EndADDRESS, 0, }, { "applet", Html_APPLET, sizeof(HtmlInput), }, { "/applet", Html_EndAPPLET, 0, }, { "area", Html_AREA, 0, }, { "b", Html_B, 0, }, { "/b", Html_EndB, 0, }, { "base", Html_BASE, 0, }, { "basefont", Html_BASEFONT, 0, }, { "/basefont", Html_EndBASEFONT, 0, }, { "bgsound", Html_BGSOUND, 0, }, { "big", Html_BIG, 0, }, { "/big", Html_EndBIG, 0, }, { "blockquote", Html_BLOCKQUOTE, 0, }, { "/blockquote", Html_EndBLOCKQUOTE, 0, }, { "body", Html_BODY, 0, }, { "/body", Html_EndBODY, 0, }, { "br", Html_BR, 0, }, { "caption", Html_CAPTION, 0, }, { "/caption", Html_EndCAPTION, 0, }, { "center", Html_CENTER, 0, }, { "/center", Html_EndCENTER, 0, }, { "cite", Html_CITE, 0, }, { "/cite", Html_EndCITE, 0, }, { "code", Html_CODE, 0, }, { "/code", Html_EndCODE, 0, }, { "comment", Html_COMMENT, 0, }, { "/comment", Html_EndCOMMENT, 0, }, { "dd", Html_DD, sizeof(HtmlRef), }, { "/dd", Html_EndDD, 0, }, { "dfn", Html_DFN, 0, }, { "/dfn", Html_EndDFN, 0, }, { "dir", Html_DIR, sizeof(HtmlListStart), }, { "/dir", Html_EndDIR, sizeof(HtmlRef), }, { "div", Html_DIV, 0, }, { "/div", Html_EndDIV, 0, }, { "dl", Html_DL, sizeof(HtmlListStart), }, { "/dl", Html_EndDL, sizeof(HtmlRef), }, { "dt", Html_DT, sizeof(HtmlRef), }, { "/dt", Html_EndDT, 0, }, { "em", Html_EM, 0, }, { "/em", Html_EndEM, 0, }, { "embed", Html_EMBED, sizeof(HtmlInput), }, { "font", Html_FONT, 0, }, { "/font", Html_EndFONT, 0, }, { "form", Html_FORM, sizeof(HtmlForm), }, { "/form", Html_EndFORM, sizeof(HtmlRef), }, { "frame", Html_FRAME, 0, }, { "/frame", Html_EndFRAME, 0, }, { "frameset", Html_FRAMESET, 0, }, { "/frameset", Html_EndFRAMESET, 0, }, { "h1", Html_H1, 0, }, { "/h1", Html_EndH1, 0, }, { "h2", Html_H2, 0, }, { "/h2", Html_EndH2, 0, }, { "h3", Html_H3, 0, }, { "/h3", Html_EndH3, 0, }, { "h4", Html_H4, 0, }, { "/h4", Html_EndH4, 0, }, { "h5", Html_H5, 0, }, { "/h5", Html_EndH5, 0, }, { "h6", Html_H6, 0, }, { "/h6", Html_EndH6, 0, }, { "hr", Html_HR, sizeof(HtmlHr), }, { "html", Html_HTML, 0, }, { "/html", Html_EndHTML, 0, }, { "i", Html_I, 0, }, { "/i", Html_EndI, 0, }, { "iframe", Html_IFRAME, 0, }, { "img", Html_IMG, sizeof(HtmlImageMarkup), }, { "input", Html_INPUT, sizeof(HtmlInput), }, { "isindex", Html_ISINDEX, 0, }, { "kbd", Html_KBD, 0, }, { "/kbd", Html_EndKBD, 0, }, { "li", Html_LI, sizeof(HtmlLi), }, { "/li", Html_EndLI, 0, }, { "link", Html_LINK, 0, }, { "listing", Html_LISTING, 0, }, { "/listing", Html_EndLISTING, 0, }, { "map", Html_MAP, 0, }, { "/map", Html_EndMAP, 0, }, { "marquee", Html_MARQUEE, 0, }, { "/marquee", Html_EndMARQUEE, 0, }, { "menu", Html_MENU, sizeof(HtmlListStart), }, { "/menu", Html_EndMENU, sizeof(HtmlRef), }, { "meta", Html_META, 0, }, { "nextid", Html_NEXTID, 0, }, { "nobr", Html_NOBR, 0, }, { "/nobr", Html_EndNOBR, 0, }, { "noframe", Html_NOFRAME, 0, }, { "/noframe", Html_EndNOFRAME, 0, }, { "noscript", Html_NOSCRIPT, 0, }, { "/noscript", Html_EndNOSCRIPT, 0, }, { "ol", Html_OL, sizeof(HtmlListStart), }, { "/ol", Html_EndOL, sizeof(HtmlRef), }, { "option", Html_OPTION, 0, }, { "/option", Html_EndOPTION, 0, }, { "p", Html_P, 0, }, { "/p", Html_EndP, 0, }, { "param", Html_PARAM, 0, }, { "/param", Html_EndPARAM, 0, }, { "plaintext", Html_PLAINTEXT, 0, }, { "pre", Html_PRE, 0, }, { "/pre", Html_EndPRE, 0, }, { "s", Html_S, 0, }, { "/s", Html_EndS, 0, }, { "samp", Html_SAMP, 0, }, { "/samp", Html_EndSAMP, 0, }, { "script", Html_SCRIPT, sizeof(HtmlScript), }, { "select", Html_SELECT, sizeof(HtmlInput), }, { "/select", Html_EndSELECT, sizeof(HtmlRef), }, { "small", Html_SMALL, 0, }, { "/small", Html_EndSMALL, 0, }, { "strike", Html_STRIKE, 0, }, { "/strike", Html_EndSTRIKE, 0, }, { "strong", Html_STRONG, 0, }, { "/strong", Html_EndSTRONG, 0, }, { "style", Html_STYLE, sizeof(HtmlScript), }, { "sub", Html_SUB, 0, }, { "/sub", Html_EndSUB, 0, }, { "sup", Html_SUP, 0, }, { "/sup", Html_EndSUP, 0, }, { "table", Html_TABLE, sizeof(HtmlTable), }, { "/table", Html_EndTABLE, sizeof(HtmlRef), }, { "td", Html_TD, sizeof(HtmlCell), }, { "/td", Html_EndTD, sizeof(HtmlRef), }, { "textarea", Html_TEXTAREA, sizeof(HtmlInput), }, { "/textarea", Html_EndTEXTAREA, sizeof(HtmlRef), }, { "th", Html_TH, sizeof(HtmlCell), }, { "/th", Html_EndTH, sizeof(HtmlRef), }, { "title", Html_TITLE, 0, }, { "/title", Html_EndTITLE, 0, }, { "tr", Html_TR, sizeof(HtmlRef), }, { "/tr", Html_EndTR, sizeof(HtmlRef), }, { "tt", Html_TT, 0, }, { "/tt", Html_EndTT, 0, }, { "u", Html_U, 0, }, { "/u", Html_EndU, 0, }, { "ul", Html_UL, sizeof(HtmlListStart), }, { "/ul", Html_EndUL, sizeof(HtmlRef), }, { "var", Html_VAR, 0, }, { "/var", Html_EndVAR, 0, }, { "wbr", Html_WBR, 0, }, { "xmp", Html_XMP, 0, }, { "/xmp", Html_EndXMP, 0, }, }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmltokens.h�������������������������������������������������������������������000644 �000765 �000000 �00000063655 12547026202 017255� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlCell HtmlCell; typedef struct HtmlMarkupElement HtmlMarkupElement; typedef struct HtmlBaseElement HtmlBaseElement; typedef union HtmlElement HtmlElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; typedef unsigned char Html_u8; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef int Html_32; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlInput HtmlInput; typedef struct HtmlWidget HtmlWidget; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlTokenMap HtmlTokenMap; struct HtmlTokenMap { char *zName; /* Name of a markup */ Html_16 type; /* Markup type code */ Html_16 extra; /* Extra space needed above HtmlBaseElement */ HtmlTokenMap *pCollide; /* Hash table collision chain */ }; extern HtmlTokenMap HtmlMarkupMap[]; #define HTML_MARKUP_COUNT 147 #define HTML_MARKUP_HASH_SIZE 163 #define Html_TypeCount 151 #define Html_EndXMP 151 #define Html_XMP 150 #define Html_WBR 149 #define Html_EndVAR 148 #define Html_VAR 147 #define Html_EndUL 146 #define Html_UL 145 #define Html_EndU 144 #define Html_U 143 #define Html_EndTT 142 #define Html_TT 141 #define Html_EndTR 140 #define Html_TR 139 #define Html_EndTITLE 138 #define Html_TITLE 137 #define Html_EndTH 136 #define Html_TH 135 #define Html_EndTEXTAREA 134 #define Html_TEXTAREA 133 #define Html_EndTD 132 #define Html_TD 131 #define Html_EndTABLE 130 #define Html_TABLE 129 #define Html_EndSUP 128 #define Html_SUP 127 #define Html_EndSUB 126 #define Html_SUB 125 #define Html_STYLE 124 #define Html_EndSTRONG 123 #define Html_STRONG 122 #define Html_EndSTRIKE 121 #define Html_STRIKE 120 #define Html_EndSMALL 119 #define Html_SMALL 118 #define Html_EndSELECT 117 #define Html_SELECT 116 #define Html_SCRIPT 115 #define Html_EndSAMP 114 #define Html_SAMP 113 #define Html_EndS 112 #define Html_S 111 #define Html_EndPRE 110 #define Html_PRE 109 #define Html_PLAINTEXT 108 #define Html_EndPARAM 107 #define Html_PARAM 106 #define Html_EndP 105 #define Html_P 104 #define Html_EndOPTION 103 #define Html_OPTION 102 #define Html_EndOL 101 #define Html_OL 100 #define Html_EndNOSCRIPT 99 #define Html_NOSCRIPT 98 #define Html_EndNOFRAME 97 #define Html_NOFRAME 96 #define Html_EndNOBR 95 #define Html_NOBR 94 #define Html_NEXTID 93 #define Html_META 92 #define Html_EndMENU 91 #define Html_MENU 90 #define Html_EndMARQUEE 89 #define Html_MARQUEE 88 #define Html_EndMAP 87 #define Html_MAP 86 #define Html_EndLISTING 85 #define Html_LISTING 84 #define Html_LINK 83 #define Html_EndLI 82 #define Html_LI 81 #define Html_EndKBD 80 #define Html_KBD 79 #define Html_ISINDEX 78 #define Html_INPUT 77 #define Html_IMG 76 #define Html_IFRAME 75 #define Html_EndI 74 #define Html_I 73 #define Html_EndHTML 72 #define Html_HTML 71 #define Html_HR 70 #define Html_EndH6 69 #define Html_H6 68 #define Html_EndH5 67 #define Html_H5 66 #define Html_EndH4 65 #define Html_H4 64 #define Html_EndH3 63 #define Html_H3 62 #define Html_EndH2 61 #define Html_H2 60 #define Html_EndH1 59 #define Html_H1 58 #define Html_EndFRAMESET 57 #define Html_FRAMESET 56 #define Html_EndFRAME 55 #define Html_FRAME 54 #define Html_EndFORM 53 #define Html_FORM 52 #define Html_EndFONT 51 #define Html_FONT 50 #define Html_EMBED 49 #define Html_EndEM 48 #define Html_EM 47 #define Html_EndDT 46 #define Html_DT 45 #define Html_EndDL 44 #define Html_DL 43 #define Html_EndDIV 42 #define Html_DIV 41 #define Html_EndDIR 40 #define Html_DIR 39 #define Html_EndDFN 38 #define Html_DFN 37 #define Html_EndDD 36 #define Html_DD 35 #define Html_EndCOMMENT 34 #define Html_COMMENT 33 #define Html_EndCODE 32 #define Html_CODE 31 #define Html_EndCITE 30 #define Html_CITE 29 #define Html_EndCENTER 28 #define Html_CENTER 27 #define Html_EndCAPTION 26 #define Html_CAPTION 25 #define Html_BR 24 #define Html_EndBODY 23 #define Html_BODY 22 #define Html_EndBLOCKQUOTE 21 #define Html_BLOCKQUOTE 20 #define Html_EndBIG 19 #define Html_BIG 18 #define Html_BGSOUND 17 #define Html_EndBASEFONT 16 #define Html_BASEFONT 15 #define Html_BASE 14 #define Html_EndB 13 #define Html_B 12 #define Html_AREA 11 #define Html_EndAPPLET 10 #define Html_APPLET 9 #define Html_EndADDRESS 8 #define Html_ADDRESS 7 #define Html_EndA 6 #define Html_A 5 #define Html_Block 4 #define HtmlIsMarkup(X) ((X)->base.type>Html_Block) #define Html_Unknown 3 #define Html_Space 2 #define Html_Text 1 #define INTERFACE 0 typedef struct HtmlTextElement HtmlTextElement; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlBlock HtmlBlock; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; �����������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlurl.c����������������������������������������������������������������������000644 �000765 �000000 �00000026246 12547267112 016551� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** Routines for processing URLs. ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include "htmlurl.h" #if LOCAL_INTERFACE /* ** A parsed URI is held in an instance of the following structure. ** Each component is recorded in memory obtained from HtmlAlloc(). ** ** The examples are from the URI ** ** http://192.168.1.1:8080/cgi-bin/printenv?name=xyzzy&addr=none#frag */ struct HtmlUri { char *zScheme; /* Ex: "http" */ char *zAuthority; /* Ex: "192.168.1.1:8080" */ char *zPath; /* Ex: "cgi-bin/printenv" */ char *zQuery; /* Ex: "name=xyzzy&addr=none" */ char *zFragment; /* Ex: "frag" */ }; #endif /* ** Return the length of the next component of the URL in z[] given ** that the component starts at z[0]. The initial sequence of the ** component must be zInit[]. The component is terminated by any ** character in zTerm[]. The length returned is 0 if the component ** doesn't exist. The length includes the zInit[] string, but not ** the termination character. ** ** Component zInit zTerm ** ---------- ------- ------- ** scheme "" ":/?#" ** authority "//" "/?#" ** path "/" "?#" ** query "?" "#" ** fragment "#" "" */ static int ComponentLength(const char *z, const char *zInit, const char *zTerm){ int i, n; for(n=0; zInit[n]; n++){ if( zInit[n]!=z[n] ) return 0; } while( z[n] ){ for(i=0; zTerm[i]; i++){ if( z[n]==zTerm[i] ) return n; } n++; } return n; } /* ** Duplicate a string of length n. */ static char *StrNDup(const char *z, int n){ char *zResult; if(!n) return NULL; if( n<=0 ){ n = strlen(z); } zResult = HtmlAlloc( n + 1 ); if( zResult ){ memcpy(zResult, z, n); zResult[n] = 0; TestPoint(0); } return zResult; } /* ** Parse a text URI into an HtmlUri structure. */ static HtmlUri *ParseUri(const char *zUri){ HtmlUri *p; int n; p = HtmlAlloc( sizeof(*p) ); if( p==0 ) return 0; memset(p, 0, sizeof(*p)); if( zUri==0 || zUri[0]==0 ) return p; while( isspace(zUri[0]) ){ zUri++; } n = ComponentLength(zUri, "", ":/?# "); if( n>0 && zUri[n]==':' ){ p->zScheme = StrNDup(zUri, n); zUri += n+1; } n = ComponentLength(zUri, "//", "/?# "); if( n>0 ){ p->zAuthority = StrNDup(&zUri[2], n-2); zUri += n; } /* allow spaces in path */ /* n = ComponentLength(zUri, "", "?# ");*/ n = ComponentLength(zUri, "", "?#"); if( n>0 ){ p->zPath = StrNDup(zUri, n); zUri += n; } n = ComponentLength(zUri, "?", "# "); if( n>0 ){ p->zQuery = StrNDup(&zUri[1], n-1); zUri += n; } n = ComponentLength(zUri, "#", " "); if( n>0 ){ p->zFragment = StrNDup(&zUri[1], n-1); } return p; } /* ** Delete an HtmlUri structure. */ static void FreeUri(HtmlUri *p){ if( p==0 ) return; if( p->zScheme ) HtmlFree(p->zScheme); if( p->zAuthority ) HtmlFree(p->zAuthority); if( p->zPath ) HtmlFree(p->zPath); if( p->zQuery ) HtmlFree(p->zQuery); if( p->zFragment ) HtmlFree(p->zFragment); HtmlFree(p); } /* ** Create a string to hold the given URI. Memory to hold the string ** is obtained from HtmlAlloc() and must be freed by the calling ** function. */ static char *BuildUri(HtmlUri *p){ int n = 1; char *z; if( p->zScheme ) n += strlen(p->zScheme)+1; if( p->zAuthority ) n += strlen(p->zAuthority)+2; if( p->zPath ) n += strlen(p->zPath)+1; if( p->zQuery ) n += strlen(p->zQuery)+1; if( p->zFragment ) n += strlen(p->zFragment)+1; z = HtmlAlloc( n ); if( z==0 ) return 0; n = 0; if( p->zScheme ){ sprintf(z, "%s:", p->zScheme); n = strlen(z); } if( p->zAuthority ){ sprintf(&z[n], "//%s", p->zAuthority); n += strlen(&z[n]); } if( p->zPath ){ sprintf(&z[n], "%s", p->zPath); n += strlen(&z[n]); } if( p->zQuery ){ sprintf(&z[n], "?%s", p->zQuery); n += strlen(&z[n]); } if( p->zFragment ){ sprintf(&z[n], "#%s", p->zFragment); }else{ z[n] = 0; } return z; } /* ** Replace the string in *pzDest with the string in zSrc */ static void ReplaceStr(char **pzDest, const char *zSrc){ if( *pzDest!=0 ) HtmlFree(*pzDest); if( zSrc==0 ){ *pzDest = 0; }else{ *pzDest = StrNDup(zSrc, -1); } } /* ** Remove leading and trailing spaces from the given string. Return ** a new string obtained from HtmlAlloc(). */ static char *Trim(char *z){ int i; char *zNew; while( isspace(*z) ) z++; i = strlen(z); zNew = HtmlAlloc( i+1 ); if( zNew==0 ) return 0; strcpy(zNew, z); if( i>0 && isspace(zNew[i-1]) ){ i--; zNew[i] = 0; } return zNew; } /* ** The input azSeries[] is a sequence of URIs. This command must ** resolve them all and put the result in the interp->result field ** of the interpreter associated with the HTML widget. Return ** TCL_OK on success and TCL_ERROR if there is a failure. ** ** This function can cause the HTML widget to be deleted or changed ** arbitrarily. */ int HtmlCallResolver( HtmlWidget *htmlPtr, /* The widget that is doing the resolving. */ char **azSeries /* A list of URIs. NULL terminated */ ){ int rc = TCL_OK; /* Return value of this function. */ char *z; HtmlVerifyLock(htmlPtr); if( htmlPtr->zResolverCommand && htmlPtr->zResolverCommand[0] ){ /* ** Append the current base URI then the azSeries arguments to the ** TCL command specified by the -resolvercommand optoin, then execute ** the result. ** ** The -resolvercommand could do nasty things, such as delete ** the HTML widget out from under us. Be prepared for the worst. */ Tcl_DString cmd; Tcl_DStringInit(&cmd); Tcl_DStringAppend(&cmd, htmlPtr->zResolverCommand, -1); if( htmlPtr->zBaseHref && htmlPtr->zBaseHref[0] ){ z = Trim(htmlPtr->zBaseHref); }else if( htmlPtr->zBase && htmlPtr->zBase[0] ){ z = Trim(htmlPtr->zBase); } else z=0; if( z ){ Tcl_DStringAppendElement(&cmd, z); HtmlFree(z); } while( azSeries[0] ){ z = Trim(azSeries[0]); if( z ){ Tcl_DStringAppendElement(&cmd, z); HtmlFree(z); } azSeries++; } HtmlLock(htmlPtr); rc = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&cmd)); Tcl_DStringFree(&cmd); if( HtmlUnlock(htmlPtr) ) return TCL_ERROR; if( rc!=TCL_OK ){ Tcl_AddErrorInfo(htmlPtr->interp, "\n (-resolvercommand executed by HTML widget)"); } }else{ /* ** No -resolvercommand has been specified. Do the default ** resolver algorithm specified in section 5.2 of RFC 2396. */ HtmlUri *base, *term; if( htmlPtr->zBaseHref && htmlPtr->zBaseHref[0] ){ base = ParseUri(htmlPtr->zBaseHref); }else{ base = ParseUri(htmlPtr->zBase); } while( azSeries[0] ){ term = ParseUri(azSeries[0]); azSeries++; if( term->zScheme==0 && term->zAuthority==0 && term->zPath==0 && term->zQuery==0 && term->zFragment ){ ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zScheme ){ HtmlUri temp; temp = *term; *term = *base; *base = temp; }else if( term->zAuthority ){ ReplaceStr(&base->zAuthority, term->zAuthority); ReplaceStr(&base->zPath, term->zPath); ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zPath && (term->zPath[0]=='/' || base->zPath==0) ){ ReplaceStr(&base->zPath, term->zPath); ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); }else if( term->zPath && base->zPath ){ char *zBuf; int i, j; zBuf = HtmlAlloc( strlen(base->zPath) + strlen(term->zPath) + 2 ); if( zBuf ){ sprintf(zBuf,"%s", base->zPath); for(i=strlen(zBuf)-1; i>=0 && zBuf[i]!='/'; i--){ zBuf[i] = 0; } strcat(zBuf, term->zPath); for(i=0; zBuf[i]; i++){ if( zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]=='/' ){ // strcpy into same buf is undefined // strcpy(&zBuf[i+1], &zBuf[i+3]); int ll = strlen(zBuf+i+3)+1; char* tmp = malloc(ll); strncpy(tmp,zBuf+i+3,ll); strcpy(zBuf+i+1, tmp); free(tmp); i--; continue; } if( zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]==0 ){ zBuf[i+1] = 0; continue; } if( i>0 && zBuf[i]=='/' && zBuf[i+1]=='.' && zBuf[i+2]=='.' && (zBuf[i+3]=='/' || zBuf[i+3]==0) ){ for(j=i-1; j>=0 && zBuf[j]!='/'; j--){} if( zBuf[i+3] ){ // strcpy into same buf is undefined // strcpy(&zBuf[j+1], &zBuf[i+4]); int ll = strlen(zBuf+i+4)+1; char* tmp = malloc(ll); strncpy(tmp,zBuf+i+4,ll); strcpy(zBuf+j+1, tmp); free(tmp); }else{ zBuf[j+1] = 0; } i = j-1; if( i<-1 ) i = -1; continue; } } /* look for /../ at begining */ if (!strncmp(zBuf,"/../",4)) { // strcpy into same buf is undefined // strcpy(zBuf,zBuf+3); int ll = strlen(zBuf+3)+1; char* tmp = malloc(ll); strncpy(tmp,zBuf+3,ll); strcpy(zBuf, tmp); free(tmp); } HtmlFree(base->zPath); base->zPath = zBuf; } ReplaceStr(&base->zQuery, term->zQuery); ReplaceStr(&base->zFragment, term->zFragment); } FreeUri(term); } Tcl_SetResult(htmlPtr->interp, BuildUri(base), TCL_DYNAMIC); FreeUri(base); } return rc; } /* ** This is a convenient wrapper routine for HtmlCallResolver. ** It makes a copy of the result into memory obtained from HtmlAlloc() ** and invokes Tcl_ResetResult(). */ char *HtmlResolveUri(HtmlWidget *htmlPtr, char *zUri){ char *azSeq[2]; char *zSrc; int result; if( zUri==0 || *zUri==0 ) return 0; azSeq[0] = zUri; azSeq[1] = 0; HtmlLock(htmlPtr); result = HtmlCallResolver(htmlPtr, azSeq); if( HtmlUnlock(htmlPtr) ) return 0; if( result==TCL_OK ){ zSrc = HtmlAlloc( strlen(Tcl_GetStringResult(htmlPtr->interp)) + 1 ); if( zSrc ) strcpy(zSrc, Tcl_GetStringResult(htmlPtr->interp)); }else{ zSrc = 0; } Tcl_ResetResult(htmlPtr->interp); return zSrc; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlurl.h����������������������������������������������������������������������000644 �000765 �000000 �00000053373 12547026202 016550� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ typedef struct HtmlWidget HtmlWidget; char *HtmlResolveUri(HtmlWidget *htmlPtr,char *zUri); int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define HtmlVerifyLock(H) if((H)->locked==0)HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define HtmlVerifyLock(H) #endif typedef union HtmlElement HtmlElement; typedef struct HtmlBlock HtmlBlock; typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef short Html_16; typedef struct HtmlScript HtmlScript; #define Html_TypeCount 151 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlLayoutContext HtmlLayoutContext; typedef struct HtmlMargin HtmlMargin; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; #define N_FONT_FAMILY 8 #define N_FONT_SIZE 7 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define N_COLOR 16 /* Total number of colors */ typedef struct GcCache GcCache; typedef unsigned char Html_u8; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; #define N_CACHE_GC 16 typedef struct HtmlImage HtmlImage; struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; int HtmlCallResolver(HtmlWidget *htmlPtr,char **azSeries); #define HtmlFree(A) Tcl_Free((char*)(A)) #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) typedef struct HtmlUri HtmlUri; struct HtmlUri { char *zScheme; /* Ex: "http" */ char *zAuthority; /* Ex: "192.168.1.1:8080" */ char *zPath; /* Ex: "cgi-bin/printenv" */ char *zQuery; /* Ex: "name=xyzzy&addr=none" */ char *zFragment; /* Ex: "frag" */ }; #define LOCAL_INTERFACE 0 typedef struct HtmlBaseElement HtmlBaseElement; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlwidget.c�������������������������������������������������������������������000644 �000765 �000000 �00000200027 12547267112 017221� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ** The main routine for the HTML widget for Tcl/Tk ** ** Copyright (C) 1997-2000 D. Richard Hipp ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Library General Public ** License as published by the Free Software Foundation; either ** version 2 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Library General Public License for more details. ** ** You should have received a copy of the GNU Library General Public ** License along with this library; if not, write to the ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, ** Boston, MA 02111-1307, USA. ** ** Author contact information: ** drh@acm.org ** http://www.hwaci.com/drh/ */ #include <tk.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include "htmlwidget.h" #ifdef USE_TK_STUBS # include <tkIntXlibDecls.h> #endif /* ** This global variable is used for tracing the operation of ** the Html formatter. */ int HtmlTraceMask = 0; #ifdef __WIN32__ # define DEF_FRAME_BG_COLOR "SystemButtonFace" # define DEF_FRAME_BG_MONO "White" # define DEF_FRAME_CURSOR "" # define DEF_BUTTON_FG "SystemButtonText" # define DEF_BUTTON_HIGHLIGHT_BG "SystemButtonFace" # define DEF_BUTTON_HIGHLIGHT "SystemWindowFrame" #else # define DEF_FRAME_BG_COLOR "#d9d9d9" # define DEF_FRAME_BG_MONO "White" # define DEF_FRAME_CURSOR "" # define DEF_BUTTON_FG "Black" # define DEF_BUTTON_HIGHLIGHT_BG "#d9d9d9" # define DEF_BUTTON_HIGHLIGHT "Black" #endif /* ** Information used for argv parsing. */ static Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_STRING, "-appletcommand", "appletCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zAppletCommand), 0}, {TK_CONFIG_BORDER, "-background", "background", "Background", DEF_HTML_BG_COLOR, Tk_Offset(HtmlWidget, border), TK_CONFIG_COLOR_ONLY}, {TK_CONFIG_BORDER, "-background", "background", "Background", DEF_HTML_BG_MONO, Tk_Offset(HtmlWidget, border), TK_CONFIG_MONO_ONLY}, {TK_CONFIG_STRING, "-base", "base", "Base", "", Tk_Offset(HtmlWidget, zBase), 0}, {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", DEF_HTML_BORDER_WIDTH, Tk_Offset(HtmlWidget, borderWidth), 0}, {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", DEF_HTML_CURSOR, Tk_Offset(HtmlWidget, cursor), TK_CONFIG_NULL_OK}, {TK_CONFIG_BOOLEAN, "-exportselection", "exportSelection","ExportSelection", DEF_HTML_EXPORT_SEL, Tk_Offset(HtmlWidget, exportSelection), 0}, {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL, (char *) NULL, 0, 0}, {TK_CONFIG_STRING, "-fontcommand", "fontCommand", "FontCommand", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zFontCommand), 0}, {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground", DEF_HTML_FG, Tk_Offset(HtmlWidget, fgColor), 0}, {TK_CONFIG_STRING, "-formcommand", "formlCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zFormCommand), 0}, {TK_CONFIG_STRING, "-framecommand", "frameCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zFrameCommand), 0}, {TK_CONFIG_PIXELS, "-height", "height", "Height", DEF_HTML_HEIGHT, Tk_Offset(HtmlWidget, height), 0}, {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground", "HighlightBackground", DEF_HTML_HIGHLIGHT_BG, Tk_Offset(HtmlWidget, highlightBgColorPtr), 0}, {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor", DEF_HTML_HIGHLIGHT, Tk_Offset(HtmlWidget, highlightColorPtr), 0}, {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness", "HighlightThickness", DEF_HTML_HIGHLIGHT_WIDTH, Tk_Offset(HtmlWidget, highlightWidth), 0}, {TK_CONFIG_STRING, "-hyperlinkcommand", "hyperlinkCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zHyperlinkCommand), 0}, {TK_CONFIG_STRING, "-imagecommand", "imageCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zGetImage), 0}, {TK_CONFIG_INT, "-insertofftime", "insertOffTime", "OffTime", DEF_HTML_INSERT_OFF_TIME, Tk_Offset(HtmlWidget, insOffTime), 0}, {TK_CONFIG_INT, "-insertontime", "insertOnTime", "OnTime", DEF_HTML_INSERT_ON_TIME, Tk_Offset(HtmlWidget, insOnTime), 0}, {TK_CONFIG_STRING, "-isvisitedcommand", "isVisitedCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zIsVisited), 0}, {TK_CONFIG_PIXELS, "-padx", "padX", "Pad", DEF_HTML_PADX, Tk_Offset(HtmlWidget, padx), 0}, {TK_CONFIG_PIXELS, "-pady", "padY", "Pad", DEF_HTML_PADY, Tk_Offset(HtmlWidget, pady), 0}, {TK_CONFIG_RELIEF, "-relief", "relief", "Relief", DEF_HTML_RELIEF, Tk_Offset(HtmlWidget, relief), 0}, {TK_CONFIG_STRING, "-resolvercommand", "resolverCommand", "HtmlCallback", DEF_HTML_CALLBACK, Tk_Offset(HtmlWidget, zResolverCommand), 0}, {TK_CONFIG_RELIEF, "-rulerelief", "ruleRelief","RuleRelief", "sunken", Tk_Offset(HtmlWidget, ruleRelief), 0}, {TK_CONFIG_STRING, "-scriptcommand", "scriptCommand", "HtmlCallback", "", Tk_Offset(HtmlWidget, zScriptCommand), 0}, {TK_CONFIG_COLOR, "-selectioncolor", "background", "Background", DEF_HTML_SELECTION_COLOR, Tk_Offset(HtmlWidget, selectionColor), 0}, {TK_CONFIG_RELIEF, "-tablerelief", "tableRelief","TableRelief", "raised", Tk_Offset(HtmlWidget, tableRelief), 0}, {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_HTML_TAKE_FOCUS, Tk_Offset(HtmlWidget, takeFocus), TK_CONFIG_NULL_OK}, {TK_CONFIG_COLOR, "-unvisitedcolor", "foreground", "Foreground", DEF_HTML_UNVISITED, Tk_Offset(HtmlWidget, newLinkColor), 0}, {TK_CONFIG_BOOLEAN, "-underlinehyperlinks", "underlineHyperlinks", "UnderlineHyperlinks", "1", Tk_Offset(HtmlWidget, underlineLinks), 0}, {TK_CONFIG_COLOR, "-visitedcolor", "foreground", "Foreground", DEF_HTML_VISITED, Tk_Offset(HtmlWidget, oldLinkColor), 0}, {TK_CONFIG_PIXELS, "-width", "width", "Width", DEF_HTML_WIDTH, Tk_Offset(HtmlWidget, width), 0}, {TK_CONFIG_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand", DEF_HTML_SCROLL_COMMAND, Tk_Offset(HtmlWidget, xScrollCmd), TK_CONFIG_NULL_OK}, {TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand", DEF_HTML_SCROLL_COMMAND, Tk_Offset(HtmlWidget, yScrollCmd), TK_CONFIG_NULL_OK}, {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL, (char *) NULL, 0, 0} }; /* ** Get a copy of the config specs. */ Tk_ConfigSpec *HtmlConfigSpec(void){ return configSpecs; } /* ** Find the width of the usable drawing area in pixels. If the window isn't ** mapped, use the size requested by the user. ** ** The usable drawing area is the area available for displaying rendered ** HTML. The usable drawing area does not include the 3D border or the ** padx and pady boundry within the 3D border. The usable drawing area ** is the size of the clipping window. */ int HtmlUsableWidth(HtmlWidget *htmlPtr){ int w; Tk_Window tkwin = htmlPtr->tkwin; if( tkwin && Tk_IsMapped(tkwin) ){ w = Tk_Width(tkwin) - 2*(htmlPtr->padx + htmlPtr->inset); TestPoint(0); }else{ w = htmlPtr->width; TestPoint(0); } return w; } /* ** Find the height of the usable drawing area in pixels. If the window isn't ** mapped, use the size requested by the user. ** ** The usable drawing area is the area available for displaying rendered ** HTML. The usable drawing area does not include the 3D border or the ** padx and pady boundry within the 3D border. The usable drawing area ** is the size of the clipping window. */ int HtmlUsableHeight(HtmlWidget *htmlPtr){ int h; Tk_Window tkwin = htmlPtr->tkwin; if( tkwin && Tk_IsMapped(tkwin) ){ h = Tk_Height(tkwin) - 2*(htmlPtr->pady + htmlPtr->inset); TestPoint(0); }else{ h = htmlPtr->height; TestPoint(0); } return h; } /* ** Compute a pair of floating point numbers that describe the current ** vertical scroll position. The first number is the fraction of ** the document that is off the top of the visible region and the second ** number is the fraction that is beyond the end of the visible region. */ void HtmlComputeVerticalPosition( HtmlWidget *htmlPtr, char *buf /* Write the two floating point values here */ ){ int actual; /* Size of the viewing area */ double frac1, frac2; actual = HtmlUsableHeight(htmlPtr); if( htmlPtr->maxY <= 0 ){ frac1 = 0.0; frac2 = 1.0; TestPoint(0); }else{ frac1 = (double)htmlPtr->yOffset/(double)htmlPtr->maxY; if( frac1 > 1.0 ){ frac1 = 1.0; TestPoint(0); }else if( frac1 < 0.0 ){ frac1 = 0.0; TestPoint(0); } frac2 = (double)(htmlPtr->yOffset+actual)/(double)htmlPtr->maxY; if( frac2 > 1.0 ){ frac2 = 1.0; TestPoint(0); }else if( frac2 < 0.0 ){ frac2 = 0.0; TestPoint(0); } } sprintf(buf,"%g %g",frac1, frac2); } /* ** Do the same thing for the horizontal direction */ void HtmlComputeHorizontalPosition( HtmlWidget *htmlPtr, char *buf /* Write the two floating point values here */ ){ int actual; /* Size of the viewing area */ double frac1, frac2; actual = HtmlUsableWidth(htmlPtr); if( htmlPtr->maxX <= 0 ){ frac1 = 0.0; frac2 = 1.0; TestPoint(0); }else{ frac1 = (double)htmlPtr->xOffset/(double)htmlPtr->maxX; if( frac1 > 1.0 ){ frac1 = 1.0; TestPoint(0); }else if( frac1 < 0.0 ){ frac1 = 0.0; TestPoint(0); } frac2 = (double)(htmlPtr->xOffset+actual)/(double)htmlPtr->maxX; if( frac2 > 1.0 ){ frac2 = 1.0; TestPoint(0); }else if( frac2 < 0.0 ){ frac2 = 0.0; TestPoint(0); } } sprintf(buf,"%g %g",frac1, frac2); } /* ** Clear the cache of GCs */ static void ClearGcCache(HtmlWidget *htmlPtr){ int i; for(i=0; i<N_CACHE_GC; i++){ if( htmlPtr->aGcCache[i].index ){ Tk_FreeGC(htmlPtr->display, htmlPtr->aGcCache[i].gc); htmlPtr->aGcCache[i].index = 0; TestPoint(0); }else{ TestPoint(0); } } } /* ** This routine is called when the widget command is deleted. If the ** widget isn't already in the process of being destroyed, this command ** starts that process rolling. ** ** This routine can be called in two ways. ** ** (1) The window is destroyed, which causes the command to be deleted. ** In this case, we don't have to do anything. ** ** (2) The command only is deleted (ex: "rename .html {}"). In that ** case we need to destroy the window. */ static void HtmlCmdDeletedProc(ClientData clientData){ HtmlWidget *htmlPtr = (HtmlWidget*) clientData; if (htmlPtr != NULL && htmlPtr->tkwin!=NULL ) { Tk_Window tkwin = htmlPtr->tkwin; htmlPtr->tkwin = NULL; Tk_DestroyWindow(tkwin); } } /* ** Reset the main layout context in the main widget. This happens ** before we redo the layout, or just before deleting the widget. */ static void ResetLayoutContext(HtmlWidget *htmlPtr){ htmlPtr->layoutContext.headRoom = 0; htmlPtr->layoutContext.top = 0; htmlPtr->layoutContext.bottom = 0; HtmlClearMarginStack(&htmlPtr->layoutContext.leftMargin); HtmlClearMarginStack(&htmlPtr->layoutContext.rightMargin); } /* ** This routine is invoked in order to redraw all or part of the HTML ** widget. This might happen because the display has changed, or in ** response to an expose event. In all cases, though, this routine ** is called by an idle callback. */ static void HtmlRedrawCallback(ClientData clientData){ HtmlWidget *htmlPtr = (HtmlWidget*)clientData; Tk_Window tkwin = htmlPtr->tkwin; Tk_Window clipwin = htmlPtr->clipwin; Pixmap pixmap; /* The buffer on which to render HTML */ int x, y, w, h; /* Virtual canvas coordinates of area to draw */ int hw; /* highlight thickness */ int insetX, insetY; /* Total highlight thickness, border width and ** padx/y */ int clipwinH, clipwinW; /* Width and height of the clipping window */ HtmlBlock *pBlock; /* For looping over blocks to be drawn */ int redoSelection = 0; /* True to recompute the selection */ /* ** Don't bother doing anything if the widget is in the process of ** being destroyed. */ if( tkwin==0 ){ goto redrawExit; } /* ** Recompute the layout, if necessary or requested. ** ** Calling HtmlLayout() is tricky because HtmlLayout() may invoke one ** or more callbacks (thru the "-imagecommand" callback, for instance) ** and these callbacks could, in theory, do nasty things like delete ** or unmap this widget. So we have to take precautions: ** ** * Don't remove the REDRAW_PENDING flag until after HtmlLayout() ** has been called, to prevent a recursive call to HtmlRedrawCallback(). ** ** * Call HtmlLock() on the htmlPtr structure to prevent it from ** being deleted out from under us. ** */ if( (htmlPtr->flags & RESIZE_ELEMENTS)!=0 && (htmlPtr->flags & STYLER_RUNNING)==0 ){ HtmlImage *pImage; for(pImage=htmlPtr->imageList; pImage; pImage=pImage->pNext){ pImage->pList = 0; } htmlPtr->lastSized = 0; htmlPtr->flags &= ~RESIZE_ELEMENTS; htmlPtr->flags |= RELAYOUT; } /* We used to make a distinction between RELAYOUT and EXTEND_LAYOUT. ** RELAYOUT would be used when the widget was resized, but the ** less compute-intensive EXTEND_LAYOUT would be used when new ** text was appended. ** ** Unfortunately, EXTEND_LAYOUT has some problem that arise when ** tables are used. The quick fix is to make an EXTEND_LAYOUT do ** a complete RELAYOUT. Someday, we need to fix EXTEND_LAYOUT so ** that it works right... */ if( (htmlPtr->flags & (RELAYOUT|EXTEND_LAYOUT))!=0 && (htmlPtr->flags & STYLER_RUNNING)==0 ){ htmlPtr->nextPlaced = 0; htmlPtr->nInput = 0; htmlPtr->varId = 0; htmlPtr->maxX = 0; htmlPtr->maxY = 0; ResetLayoutContext(htmlPtr); htmlPtr->firstBlock = 0; htmlPtr->lastBlock = 0; redoSelection = 1; htmlPtr->flags &= ~RELAYOUT; htmlPtr->flags |= HSCROLL | VSCROLL | REDRAW_TEXT | EXTEND_LAYOUT; } if( (htmlPtr->flags & EXTEND_LAYOUT) && htmlPtr->pFirst!=0 ){ HtmlLock(htmlPtr); HtmlLayout(htmlPtr); if( HtmlUnlock(htmlPtr) ) goto redrawExit; tkwin = htmlPtr->tkwin; htmlPtr->flags &= ~EXTEND_LAYOUT; HtmlFormBlocks(htmlPtr); HtmlMapControls(htmlPtr); if( redoSelection && htmlPtr->selBegin.p && htmlPtr->selEnd.p ){ HtmlUpdateSelection(htmlPtr,1); HtmlUpdateInsert(htmlPtr); } } htmlPtr->flags &= ~REDRAW_PENDING; /* No need to do any actual drawing if we aren't mapped */ if( !Tk_IsMapped(tkwin) ){ goto redrawExit; } /* Redraw the scrollbars. Take care here, since the scrollbar ** update command could (in theory) delete the html widget, or ** even the whole interpreter. Preserve critical data structures, ** and check to see if we are still alive before continuing. */ if( (htmlPtr->flags & (HSCROLL|VSCROLL)) != 0 ){ Tcl_Interp *interp = htmlPtr->interp; int result; char buf[200]; if( (htmlPtr->flags & HSCROLL)!=0 ){ if( htmlPtr->xScrollCmd && htmlPtr->xScrollCmd[0] ){ HtmlComputeHorizontalPosition(htmlPtr,buf); HtmlLock(htmlPtr); result = Tcl_VarEval(interp, htmlPtr->xScrollCmd, " ", buf, 0); if( HtmlUnlock(htmlPtr) ) goto redrawExit; if (result != TCL_OK) { Tcl_AddErrorInfo(interp, "\n (horizontal scrolling command executed by html widget)"); Tcl_BackgroundError(interp); TestPoint(0); } } htmlPtr->flags &= ~HSCROLL; } if( (htmlPtr->flags & VSCROLL)!=0 && tkwin && Tk_IsMapped(tkwin) ){ if( htmlPtr->yScrollCmd && htmlPtr->yScrollCmd[0] ){ Tcl_Interp *interp = htmlPtr->interp; int result; char buf[200]; HtmlComputeVerticalPosition(htmlPtr,buf); HtmlLock(htmlPtr); result = Tcl_VarEval(interp, htmlPtr->yScrollCmd, " ", buf, 0); if( HtmlUnlock(htmlPtr) ) goto redrawExit; if (result != TCL_OK) { Tcl_AddErrorInfo(interp, "\n (horizontal scrolling command executed by html widget)"); Tcl_BackgroundError(interp); TestPoint(0); } } htmlPtr->flags &= ~VSCROLL; } tkwin = htmlPtr->tkwin; if( tkwin==0 || !Tk_IsMapped(tkwin) ){ goto redrawExit; } if( htmlPtr->flags & REDRAW_PENDING ){ return; } clipwin = htmlPtr->clipwin; if( clipwin==0 ){ TestPoint(0); goto redrawExit; } } /* Redraw the focus highlight, if requested */ hw = htmlPtr->highlightWidth; if( htmlPtr->flags & REDRAW_FOCUS ){ if( hw>0 ){ GC gc; Tk_Window tkwin = htmlPtr->tkwin; if( htmlPtr->flags & GOT_FOCUS ){ gc = Tk_GCForColor(htmlPtr->highlightColorPtr, Tk_WindowId(tkwin)); TestPoint(0); }else{ gc = Tk_GCForColor(htmlPtr->highlightBgColorPtr, Tk_WindowId(tkwin)); TestPoint(0); } Tk_DrawFocusHighlight(tkwin, gc, hw, Tk_WindowId(tkwin)); } htmlPtr->flags &= ~REDRAW_FOCUS; } /* Draw the borders around the parameter of the window. This is ** drawn directly -- it is not double buffered. */ if( htmlPtr->flags & REDRAW_BORDER ){ htmlPtr->flags &= ~REDRAW_BORDER; Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), htmlPtr->border, hw, /* x */ hw, /* y */ Tk_Width(tkwin) - 2*hw, /* width */ Tk_Height(tkwin) - 2*hw, /* height */ htmlPtr->borderWidth, htmlPtr->relief); } /* ** If the styler is in a callback, unmap the clipping window and ** abort further processing. */ if( htmlPtr->flags & STYLER_RUNNING ){ if( Tk_IsMapped(clipwin) ){ Tk_UnmapWindow(clipwin); } goto earlyOut; } /* ** If we don't have a clipping window, then something is seriously ** wrong. We might as well give up. */ if( clipwin==NULL ){ TestPoint(0); goto earlyOut; } /* Resize, reposition and map the clipping window, if necessary */ insetX = htmlPtr->padx + htmlPtr->inset; insetY = htmlPtr->pady + htmlPtr->inset; if( htmlPtr->flags & RESIZE_CLIPWIN ){ int h, w; Tk_MoveResizeWindow(clipwin, insetX, insetY, htmlPtr->realWidth - 2*insetX, htmlPtr->realHeight - 2*insetY); if( !Tk_IsMapped(clipwin) ){ Tk_MapWindow(clipwin); } h = htmlPtr->realHeight - 2*insetY; if( htmlPtr->yOffset + h > htmlPtr->maxY ){ htmlPtr->yOffset = htmlPtr->maxY - h; } if( htmlPtr->yOffset < 0 ){ htmlPtr->yOffset = 0; } w = htmlPtr->realWidth - 2*insetX; if( htmlPtr->xOffset + h > htmlPtr->maxX ){ htmlPtr->xOffset = htmlPtr->maxX - w; } if( htmlPtr->xOffset < 0 ){ htmlPtr->xOffset = 0; } htmlPtr->flags &= ~RESIZE_CLIPWIN; } HtmlMapControls(htmlPtr); /* ** Compute the virtual canvas coordinates corresponding to the ** dirty region of the clipping window. */ clipwinW = Tk_Width(clipwin); clipwinH = Tk_Height(clipwin); if( htmlPtr->flags & REDRAW_TEXT ){ w = clipwinW; h = clipwinH; x = htmlPtr->xOffset; y = htmlPtr->yOffset; htmlPtr->dirtyLeft = 0; htmlPtr->dirtyTop = 0; htmlPtr->flags &= ~REDRAW_TEXT; }else{ if( htmlPtr->dirtyLeft < 0 ){ htmlPtr->dirtyLeft = 0; TestPoint(0); } if( htmlPtr->dirtyRight > clipwinW ){ htmlPtr->dirtyRight = clipwinW; TestPoint(0); } if( htmlPtr->dirtyTop < 0 ){ htmlPtr->dirtyTop = 0; TestPoint(0); } if( htmlPtr->dirtyBottom > clipwinH ){ htmlPtr->dirtyBottom = clipwinH; TestPoint(0); } w = htmlPtr->dirtyRight - htmlPtr->dirtyLeft; h = htmlPtr->dirtyBottom - htmlPtr->dirtyTop; x = htmlPtr->xOffset + htmlPtr->dirtyLeft; y = htmlPtr->yOffset + htmlPtr->dirtyTop; } /* Skip the rest of the drawing process if the area to be refreshed is ** less than zero */ if( w>0 && h>0 ){ Display *display = htmlPtr->display; int dead; GC gcBg; XRectangle xrec; /* printf("Redraw %dx%d at %d,%d\n", w, h, x, y); */ /* Allocate and clear a pixmap upon which to draw */ gcBg = HtmlGetGC(htmlPtr, COLOR_Background, FONT_Any); pixmap = Tk_GetPixmap(display, Tk_WindowId(clipwin),w,h,Tk_Depth(clipwin)); xrec.x = 0; xrec.y = 0; xrec.width = w; xrec.height = h; XFillRectangles(display, pixmap, gcBg, &xrec, 1); /* Render all visible HTML onto the pixmap */ HtmlLock(htmlPtr); for(pBlock=htmlPtr->firstBlock; pBlock; pBlock=pBlock->pNext){ if( pBlock->top <= y+h && pBlock->bottom >= y && pBlock->left <= x+w && pBlock->right >= x ){ HtmlBlockDraw(htmlPtr,pBlock,pixmap,x,y,w,h); if( htmlPtr->tkwin==0 ) break; } } dead = HtmlUnlock(htmlPtr); /* Finally, copy the pixmap onto the window and delete the pixmap */ if( !dead ){ XCopyArea(display, pixmap, Tk_WindowId(clipwin), gcBg, 0, 0, w, h, htmlPtr->dirtyLeft, htmlPtr->dirtyTop); } Tk_FreePixmap(display, pixmap); if( dead ) goto redrawExit; /* XFlush(display); */ } /* Redraw images, if requested */ if( htmlPtr->flags & REDRAW_IMAGES ){ HtmlImage *pImage; HtmlElement *pElem; int top, bottom, left, right; /* Coordinates of the clipping window */ int imageTop; /* Top edge of image */ top = htmlPtr->yOffset; bottom = top + HtmlUsableHeight(htmlPtr); left = htmlPtr->xOffset; right = left + HtmlUsableWidth(htmlPtr); for(pImage = htmlPtr->imageList; pImage; pImage=pImage->pNext){ for(pElem = pImage->pList; pElem; pElem=pElem->image.pNext){ if( pElem->image.redrawNeeded==0 ) continue; imageTop = pElem->image.y - pElem->image.ascent; if( imageTop > bottom || imageTop + pElem->image.h < top || pElem->image.x > right || pElem->image.x + pElem->image.w < left ){ TestPoint(0); continue; } HtmlDrawImage(pElem, Tk_WindowId(htmlPtr->clipwin), left, top, right, bottom); } } htmlPtr->flags &= ~REDRAW_IMAGES; } /* Set the dirty region to the empty set. */ earlyOut: htmlPtr->dirtyTop = LARGE_NUMBER; htmlPtr->dirtyLeft = LARGE_NUMBER; htmlPtr->dirtyBottom = 0; htmlPtr->dirtyRight = 0; redrawExit: return; } /* ** Make sure that a call to the HtmlRedrawCallback() routine has been ** queued. */ void HtmlScheduleRedraw(HtmlWidget *htmlPtr){ if( (htmlPtr->flags & REDRAW_PENDING)==0 && htmlPtr->tkwin!=0 && Tk_IsMapped(htmlPtr->tkwin) ){ Tcl_DoWhenIdle(HtmlRedrawCallback, (ClientData)htmlPtr); htmlPtr->flags |= REDRAW_PENDING; } } /* ** If any part of the screen needs to be redrawn, Then call this routine ** with the values of a box (in window coordinates) that needs to be ** redrawn. This routine will make sure an idle callback is scheduled ** to do the redraw. ** ** The box coordinates are relative to the clipping window (clipwin), ** not the main window (tkwin). */ void HtmlRedrawArea( HtmlWidget *htmlPtr, /* The widget to be redrawn */ int left, int top, /* Top left corner of area to redraw */ int right, int bottom /* bottom right corner of area to redraw */ ){ if( bottom < 0 ){ TestPoint(0); return; } if( top > htmlPtr->realHeight ){ TestPoint(0); return; } if( right < 0 ){ TestPoint(0); return; } if( left > htmlPtr->realWidth ){ TestPoint(0); return; } if( htmlPtr->dirtyTop > top ){ htmlPtr->dirtyTop = top; TestPoint(0);} if( htmlPtr->dirtyLeft > left ){ htmlPtr->dirtyLeft = left; TestPoint(0);} if( htmlPtr->dirtyBottom < bottom ){ htmlPtr->dirtyBottom = bottom; TestPoint(0); } if( htmlPtr->dirtyRight < right ){ htmlPtr->dirtyRight = right; TestPoint(0);} HtmlScheduleRedraw(htmlPtr); TestPoint(0); } /* Redraw the HtmlBlock given. */ void HtmlRedrawBlock(HtmlWidget *htmlPtr, HtmlBlock *p){ if( p ){ HtmlRedrawArea(htmlPtr, p->left - htmlPtr->xOffset, p->top - htmlPtr->yOffset, p->right - htmlPtr->xOffset + 1, p->bottom - htmlPtr->yOffset ); TestPoint(0); }else{ TestPoint(0); } } /* ** Call this routine to force the entire widget to be redrawn. */ void HtmlRedrawEverything(HtmlWidget *htmlPtr){ htmlPtr->flags |= REDRAW_FOCUS | REDRAW_TEXT | REDRAW_BORDER; HtmlScheduleRedraw(htmlPtr); TestPoint(0); } /* ** Do the redrawing right now. Don't wait. */ #if 0 /* NOT_USED */ static void HtmlRedrawPush(HtmlWidget *htmlPtr){ if( htmlPtr->flags & REDRAW_PENDING ){ Tcl_CancelIdleCall(HtmlRedrawCallback, (ClientData)htmlPtr); TestPoint(0); }else{ TestPoint(0); } HtmlRedrawCallback( (ClientData)htmlPtr ); } #endif /* ** Call this routine to cause all of the rendered HTML at the ** virtual canvas coordinate of Y and beyond to be redrawn. */ void HtmlRedrawText(HtmlWidget *htmlPtr, int y){ int yOffset; /* Top-most visible canvas coordinate */ int clipHeight; /* Height of the clipping window */ yOffset = htmlPtr->yOffset; clipHeight = HtmlUsableHeight(htmlPtr); y -= yOffset; if( y < clipHeight ){ HtmlRedrawArea(htmlPtr, 0, y, LARGE_NUMBER, clipHeight); TestPoint(0); }else{ TestPoint(0); } } /* ** Recalculate the preferred size of the html widget and pass this ** along to the geometry manager. */ static void HtmlRecomputeGeometry(HtmlWidget *htmlPtr){ int w, h; /* Total width and height of the widget */ htmlPtr->inset = htmlPtr->highlightWidth + htmlPtr->borderWidth; w = htmlPtr->width + 2*(htmlPtr->padx + htmlPtr->inset); h = htmlPtr->height + 2*(htmlPtr->pady + htmlPtr->inset); Tk_GeometryRequest(htmlPtr->tkwin, w, h); Tk_SetInternalBorder(htmlPtr->tkwin, htmlPtr->inset); TestPoint(0); } /* ** This routine is called in order to process a "configure" subcommand ** on the given html widget. */ int ConfigureHtmlWidget( Tcl_Interp *interp, /* Write error message to this interpreter */ HtmlWidget *htmlPtr, /* The Html widget to be configured */ int argc, /* Number of configuration arguments */ const char **argv, /* Text of configuration arguments */ int flags, /* Configuration flags */ int realign /* Always do a redraw if set */ ){ int rc; int i; int redraw = realign; /* True if a redraw is required. */ /* Scan thru the configuration options to see if we need to redraw ** the widget. */ for(i=0; redraw==0 && i<argc; i+=2){ int c; int n; if( argv[i][0]!='-' ){ redraw = 1; break; } c = argv[i][1]; n = strlen(argv[i]); if( c=='c' && n>4 && strncmp(argv[i],"-cursor",n)==0 ){ /* do nothing */ }else /* The default case */ { redraw = 1; } } rc = Tk_ConfigureWidget(interp, htmlPtr->tkwin, configSpecs, argc, (const char**)argv, (char *) htmlPtr, flags); if( rc!=TCL_OK || redraw==0 ){ TestPoint(0); return rc; } memset(htmlPtr->fontValid, 0, sizeof(htmlPtr->fontValid)); htmlPtr->apColor[COLOR_Normal] = htmlPtr->fgColor; htmlPtr->apColor[COLOR_Visited] = htmlPtr->oldLinkColor; htmlPtr->apColor[COLOR_Unvisited] = htmlPtr->newLinkColor; htmlPtr->apColor[COLOR_Selection] = htmlPtr->selectionColor; htmlPtr->apColor[COLOR_Background] = Tk_3DBorderColor(htmlPtr->border); Tk_SetBackgroundFromBorder(htmlPtr->tkwin, htmlPtr->border); if( htmlPtr->highlightWidth < 0 ){ htmlPtr->highlightWidth = 0; TestPoint(0);} if (htmlPtr->padx < 0) { htmlPtr->padx = 0; TestPoint(0);} if (htmlPtr->pady < 0) { htmlPtr->pady = 0; TestPoint(0);} if (htmlPtr->width < 100) { htmlPtr->width = 100; TestPoint(0);} if (htmlPtr->height < 100) { htmlPtr->height = 100; TestPoint(0);} if (htmlPtr->borderWidth < 0) {htmlPtr->borderWidth = 0; TestPoint(0);} htmlPtr->flags |= RESIZE_ELEMENTS | RELAYOUT | REDRAW_BORDER | RESIZE_CLIPWIN; HtmlRecomputeGeometry(htmlPtr); HtmlRedrawEverything(htmlPtr); ClearGcCache(htmlPtr); return rc; } /* ** Delete a single HtmlElement */ void HtmlDeleteElement(HtmlElement *p){ switch( p->base.type ){ case Html_Block: if( p->block.z ){ HtmlFree(p->block.z); } break; default: break; } HtmlFree(p); } /* ** Erase all data from the HTML widget. Bring it back to an ** empty screen. ** ** This happens (for example) when the "clear" method is invoked ** on the widget, or just before the widget is deleted. */ void HtmlClear(HtmlWidget *htmlPtr){ int i; HtmlElement *p, *pNext; HtmlDeleteControls(htmlPtr); for(p=htmlPtr->pFirst; p; p=pNext){ pNext = p->pNext; HtmlDeleteElement(p); } htmlPtr->pFirst = 0; htmlPtr->pLast = 0; htmlPtr->nToken = 0; if( htmlPtr->zText ){ HtmlFree(htmlPtr->zText); } htmlPtr->zText = 0; htmlPtr->nText = 0; htmlPtr->nAlloc = 0; htmlPtr->nComplete = 0; htmlPtr->iPlaintext = 0; for(i=N_PREDEFINED_COLOR; i<N_COLOR; i++){ if( htmlPtr->apColor[i] != 0 ){ Tk_FreeColor(htmlPtr->apColor[i]); htmlPtr->apColor[i] = 0; } } for(i=0; i<N_COLOR; i++){ htmlPtr->iDark[i] = 0; htmlPtr->iLight[i] = 0; } htmlPtr->colorUsed = 0; while( htmlPtr->imageList ){ HtmlImage *p = htmlPtr->imageList; htmlPtr->imageList = p->pNext; Tk_FreeImage(p->image); HtmlFree(p); TestPoint(0); } while( htmlPtr->styleStack ){ HtmlStyleStack *p = htmlPtr->styleStack; htmlPtr->styleStack = p->pNext; HtmlFree(p); } ClearGcCache(htmlPtr); ResetLayoutContext(htmlPtr); if( htmlPtr->zBaseHref ){ HtmlFree(htmlPtr->zBaseHref); htmlPtr->zBaseHref = 0; } htmlPtr->lastSized = 0; htmlPtr->nextPlaced = 0; htmlPtr->firstBlock = 0; htmlPtr->lastBlock = 0; htmlPtr->nInput = 0; htmlPtr->nForm = 0; htmlPtr->varId = 0; htmlPtr->paraAlignment = ALIGN_None; htmlPtr->rowAlignment = ALIGN_None; htmlPtr->anchorFlags = 0; htmlPtr->inDt = 0; htmlPtr->anchorStart = 0; htmlPtr->formStart = 0; htmlPtr->innerList = 0; htmlPtr->maxX = 0; htmlPtr->maxY = 0; htmlPtr->xOffset = 0; htmlPtr->yOffset = 0; htmlPtr->pInsBlock = 0; htmlPtr->ins.p = 0; htmlPtr->selBegin.p = 0; htmlPtr->selEnd.p = 0; htmlPtr->pSelStartBlock = 0; htmlPtr->pSelEndBlock = 0; } /* ** This routine attempts to delete the widget structure. But it won't ** do it if the widget structure is locked. If the widget structure is ** locked, then when HtmlUnlock() is called and the lock count reaches ** zero, this routine will be called to finish the job. */ static void DestroyHtmlWidget(HtmlWidget *htmlPtr){ int i; if( htmlPtr->locked>0 ) return; Tcl_DeleteCommand(htmlPtr->interp, htmlPtr->zCmdName); Tcl_DeleteCommand(htmlPtr->interp, htmlPtr->zClipwin); HtmlClear(htmlPtr); Tk_FreeOptions(configSpecs, (char*) htmlPtr, htmlPtr->display, 0); for(i=0; i<N_FONT; i++){ if( htmlPtr->aFont[i] != 0 ){ Tk_FreeFont(htmlPtr->aFont[i]); htmlPtr->aFont[i] = 0; } } for(i=0; i<Html_TypeCount; i++){ if( htmlPtr->zHandler[i] ){ HtmlFree(htmlPtr->zHandler[i]); htmlPtr->zHandler[i] = 0; } } if( htmlPtr->insTimer ){ Tcl_DeleteTimerHandler(htmlPtr->insTimer); htmlPtr->insTimer = 0; } HtmlFree(htmlPtr->zClipwin); HtmlFree(htmlPtr); } /* ** Remove a lock from the HTML widget. If the widget has been ** deleted, then delete the widget structure. Return 1 if the ** widget has been deleted. Return 0 if it still exists. ** ** Normal Tk code (that is to say, code in the Tk core) uses ** Tcl_Preserve() and Tcl_Release() to accomplish what this ** function does. But preserving and releasing are much more ** common in this code than in regular widgets, so this routine ** was invented to do the same thing easier and faster. */ int HtmlUnlock(HtmlWidget *htmlPtr){ htmlPtr->locked--; if( htmlPtr->tkwin==0 && htmlPtr->locked<=0 ){ Tcl_Interp *interp = htmlPtr->interp; Tcl_Preserve(interp); DestroyHtmlWidget(htmlPtr); Tcl_Release(interp); return 1; } return htmlPtr->tkwin==0; } /* ** Lock the HTML widget. This prevents the widget structure from ** being deleted even if the widget itself is destroyed. There must ** be a call to HtmlUnlock() to release the structure. */ void HtmlLock(HtmlWidget *htmlPtr){ htmlPtr->locked++; } /* ** This routine checks to see if an HTML widget has been ** destroyed. It is always called after calling HtmlLock(). ** ** If the widget has been destroyed, then the structure ** is unlocked and the function returns 1. If the widget ** has not been destroyed, then the structure is not unlocked ** and the routine returns 0. ** ** This routine is intended for use in code like the following: ** ** HtmlLock(htmlPtr); ** // Do something that might destroy the widget ** if( HtmlIsDead(htmlPtr) ) return; ** // Do something that might destroy the widget ** if( HtmlIsDead(htmlPtr) ) return; ** // Do something that might destroy the widget ** if( HtmlUnlock(htmlPtr) ) return; */ int HtmlIsDead(HtmlWidget *htmlPtr){ if( htmlPtr->tkwin==0 ){ HtmlUnlock(htmlPtr); return 1; } return 0; } /* ** Flash the insertion cursor. */ void HtmlFlashCursor(ClientData clientData){ HtmlWidget *htmlPtr = (HtmlWidget*)clientData; if( htmlPtr->pInsBlock==0 || htmlPtr->insOnTime<=0 || htmlPtr->insOffTime<=0 ){ htmlPtr->insTimer = 0; TestPoint(0); return; } HtmlRedrawBlock(htmlPtr, htmlPtr->pInsBlock); if( (htmlPtr->flags & GOT_FOCUS)==0 ){ htmlPtr->insStatus = 0; htmlPtr->insTimer = 0; TestPoint(0); }else if( htmlPtr->insStatus ){ htmlPtr->insTimer = Tcl_CreateTimerHandler(htmlPtr->insOffTime, HtmlFlashCursor, clientData); htmlPtr->insStatus = 0; TestPoint(0); }else{ htmlPtr->insTimer = Tcl_CreateTimerHandler(htmlPtr->insOnTime, HtmlFlashCursor, clientData); htmlPtr->insStatus = 1; TestPoint(0); } } /* ** Return a GC from the cache. As many as N_CACHE_GCs are kept valid ** at any one time. They are replaced using an LRU algorithm. ** ** A value of FONT_Any (-1) for the font means "don't care". */ GC HtmlGetGC(HtmlWidget *htmlPtr, int color, int font){ int i, j; GcCache *p = htmlPtr->aGcCache; XGCValues gcValues; int mask; Tk_Font tkfont; /* ** Check for an existing GC. */ if( color < 0 || color >= N_COLOR ){ color = 0; TestPoint(0); } if( font < FONT_Any || font >= N_FONT ){ font = FONT_Default; TestPoint(0); } for(i=0; i<N_CACHE_GC; i++, p++){ if( p->index==0 ){ TestPoint(0); continue; } if( (font<0 || p->font==font) && p->color==color ){ if( p->index>1 ){ for(j=0; j<N_CACHE_GC; j++){ if( htmlPtr->aGcCache[j].index && htmlPtr->aGcCache[j].index < p->index ){ htmlPtr->aGcCache[j].index++; } } p->index = 1; } return htmlPtr->aGcCache[i].gc; } } /* ** No GC matches. Find a place to allocate a new GC. */ p = htmlPtr->aGcCache; for(i=0; i<N_CACHE_GC; i++, p++){ if( p->index==0 || p->index==N_CACHE_GC ){ TestPoint(0); break; } } if( p->index ){ Tk_FreeGC(htmlPtr->display, p->gc); } gcValues.foreground = htmlPtr->apColor[color]->pixel; gcValues.graphics_exposures = True; mask = GCForeground | GCGraphicsExposures; if( font<0 ){ font = FONT_Default; TestPoint(0); } tkfont = HtmlGetFont(htmlPtr, font); if( tkfont ){ gcValues.font = Tk_FontId(tkfont); mask |= GCFont; } p->gc = Tk_GetGC(htmlPtr->tkwin, mask, &gcValues); if( p->index==0 ){ p->index = N_CACHE_GC + 1; TestPoint(0); } for(j=0; j<N_CACHE_GC; j++){ if( htmlPtr->aGcCache[j].index && htmlPtr->aGcCache[j].index < p->index ){ htmlPtr->aGcCache[j].index++; } } p->index = 1; p->font = font; p->color = color; return p->gc; } /* ** Retrieve any valid GC. The font and color don't matter since the ** GC will only be used for copying. */ GC HtmlGetAnyGC(HtmlWidget *htmlPtr){ int i; GcCache *p = htmlPtr->aGcCache; for(i=0; i<N_CACHE_GC; i++, p++){ if( p->index ){ TestPoint(0); return p->gc; } } TestPoint(0); return HtmlGetGC(htmlPtr, COLOR_Normal, FONT_Default); } /* ** All window events (for both tkwin and clipwin) are ** sent to this routine. */ static void HtmlEventProc(ClientData clientData, XEvent *eventPtr){ HtmlWidget *htmlPtr = (HtmlWidget*) clientData; int redraw_needed = 0; XConfigureRequestEvent *p; switch( eventPtr->type ){ case GraphicsExpose: case Expose: if( htmlPtr->tkwin==0 ){ /* The widget is being deleted. Do nothing */ TestPoint(0); }else if( eventPtr->xexpose.window!=Tk_WindowId(htmlPtr->tkwin) ){ /* Exposure in the clipping window */ HtmlRedrawArea(htmlPtr, eventPtr->xexpose.x - 1, eventPtr->xexpose.y - 1, eventPtr->xexpose.x + eventPtr->xexpose.width + 1, eventPtr->xexpose.y + eventPtr->xexpose.height + 1); TestPoint(0); }else{ /* Exposure in the main window */ htmlPtr->flags |= REDRAW_BORDER; HtmlScheduleRedraw(htmlPtr); TestPoint(0); } break; case DestroyNotify: if( (htmlPtr->flags & REDRAW_PENDING) ){ Tcl_CancelIdleCall(HtmlRedrawCallback, (ClientData)htmlPtr); htmlPtr->flags &= ~REDRAW_PENDING; } if( htmlPtr->tkwin != 0 ){ if( eventPtr->xany.window!=Tk_WindowId(htmlPtr->tkwin) ){ Tk_DestroyWindow(htmlPtr->tkwin); htmlPtr->clipwin = 0; break; } htmlPtr->tkwin = 0; Tcl_DeleteCommand(htmlPtr->interp, htmlPtr->zCmdName); Tcl_DeleteCommand(htmlPtr->interp, htmlPtr->zClipwin); } HtmlUnlock(htmlPtr); break; case ConfigureNotify: if( htmlPtr->tkwin!=0 && eventPtr->xconfigure.window==Tk_WindowId(htmlPtr->tkwin) ){ p = (XConfigureRequestEvent*)eventPtr; if( p->width != htmlPtr->realWidth ){ redraw_needed = 1; htmlPtr->realWidth = p->width; TestPoint(0); }else{ TestPoint(0); } if( p->height != htmlPtr->realHeight ){ redraw_needed = 1; htmlPtr->realHeight = p->height; TestPoint(0); }else{ TestPoint(0); } if( redraw_needed ){ htmlPtr->flags |= RELAYOUT | VSCROLL | HSCROLL | RESIZE_CLIPWIN; HtmlRedrawEverything(htmlPtr); TestPoint(0); }else{ TestPoint(0); } } break; case FocusIn: if( htmlPtr->tkwin!=0 && eventPtr->xfocus.window==Tk_WindowId(htmlPtr->tkwin) && eventPtr->xfocus.detail != NotifyInferior ){ htmlPtr->flags |= GOT_FOCUS | REDRAW_FOCUS; HtmlScheduleRedraw(htmlPtr); HtmlUpdateInsert(htmlPtr); TestPoint(0); }else{ TestPoint(0); } break; case FocusOut: if( htmlPtr->tkwin!=0 && eventPtr->xfocus.window==Tk_WindowId(htmlPtr->tkwin) && eventPtr->xfocus.detail != NotifyInferior ){ htmlPtr->flags &= ~GOT_FOCUS; htmlPtr->flags |= REDRAW_FOCUS; HtmlScheduleRedraw(htmlPtr); TestPoint(0); }else{ TestPoint(0); } break; } } /* ** The rendering and layout routines should call this routine in order to get ** a font structure. The iFont parameter specifies which of the N_FONT ** fonts should be obtained. The font is allocated if necessary. ** ** Because the -fontcommand callback can be invoked, this function can ** (in theory) cause the HTML widget to be changed arbitrarily or even ** deleted. Callers of this function much be prepared to be called ** recursively and/or to have the HTML widget deleted out from under ** them. This routine will return NULL if the HTML widget is deleted. */ Tk_Font HtmlGetFont( HtmlWidget *htmlPtr, /* The HTML widget to which the font applies */ int iFont /* Which font to obtain */ ){ Tk_Font toFree = 0; if( iFont<0 ){ iFont = 0; TestPoint(0); } if( iFont>=N_FONT ){ iFont = N_FONT - 1; CANT_HAPPEN; } /* ** If the font has previously been allocated, but the "fontValid" bitmap ** shows it is no longer valid, then mark it for freeing later. We use ** a policy of allocate-before-free because Tk's font cache operates ** much more efficiently that way. */ if( !FontIsValid(htmlPtr, iFont) && htmlPtr->aFont[iFont]!=0 ){ toFree = htmlPtr->aFont[iFont]; htmlPtr->aFont[iFont] = 0; TestPoint(0); } /* ** If we need to allocate a font, first construct the font name then ** allocate it. */ if( htmlPtr->aFont[iFont]==0 ){ char name[200]; /* Name of the font */ name[0] = 0; /* Run the -fontcommand if it is specified */ if( htmlPtr->zFontCommand && htmlPtr->zFontCommand[0] ){ int iFam; /* The font family index. Value between 0 and 7 */ Tcl_DString str; /* The command we'll execute to get the font name */ char *zSep = ""; /* Separator between font attributes */ int rc; /* Return code from the font command */ char zBuf[100]; /* Temporary buffer */ Tcl_DStringInit(&str); Tcl_DStringAppend(&str, htmlPtr->zFontCommand, -1); sprintf(zBuf, " %d {", FontSize(iFont)+1); Tcl_DStringAppend(&str,zBuf, -1); iFam = iFont / N_FONT_SIZE ; if( iFam & 1 ){ Tcl_DStringAppend(&str,"bold",-1); zSep = " "; } if( iFam & 2 ){ Tcl_DStringAppend(&str,zSep,-1); Tcl_DStringAppend(&str,"italic",-1); zSep = " "; } if( iFam & 4 ){ Tcl_DStringAppend(&str,zSep,-1); Tcl_DStringAppend(&str,"fixed",-1); } Tcl_DStringAppend(&str,"}",-1); HtmlLock(htmlPtr); rc = Tcl_GlobalEval(htmlPtr->interp, Tcl_DStringValue(&str)); Tcl_DStringFree(&str); if( HtmlUnlock(htmlPtr) ){ return NULL; } if( rc!=TCL_OK ){ Tcl_AddErrorInfo(htmlPtr->interp, "\n (-fontcommand callback of HTML widget)"); Tcl_BackgroundError(htmlPtr->interp); }else{ sprintf(name,"%.100s", Tcl_GetStringResult(htmlPtr->interp)); } Tcl_ResetResult(htmlPtr->interp); } /* ** If the -fontcommand failed or returned an empty string, or if ** there is no -fontcommand, then get the default font name. */ if( name[0]==0 ){ char *familyStr = ""; int iFamily; int iSize; int size; iFamily = iFont / N_FONT_SIZE; iSize = iFont % N_FONT_SIZE + 1; switch( iFamily ){ case 0: familyStr = "helvetica -%d"; break; case 1: familyStr = "helvetica -%d bold"; break; case 2: familyStr = "helvetica -%d italic"; break; case 3: familyStr = "helvetica -%d bold italic"; break; case 4: familyStr = "courier -%d"; break; case 5: familyStr = "courier -%d bold"; break; case 6: familyStr = "courier -%d italic"; break; case 7: familyStr = "courier -%d bold italic"; break; default: familyStr = "helvetica -14"; CANT_HAPPEN; } switch( iSize ){ case 1: size = 8; break; case 2: size = 10; break; case 3: size = 12; break; case 4: size = 14; break; case 5: size = 16; break; case 6: size = 18; break; case 7: size = 24; break; default: size = 14; CANT_HAPPEN; } sprintf(name, familyStr, size); } /* Get the named font */ htmlPtr->aFont[iFont] = Tk_GetFont(htmlPtr->interp, htmlPtr->tkwin, name); if( htmlPtr->aFont[iFont]==0 ){ Tcl_AddErrorInfo(htmlPtr->interp, "\n (trying to create a font named \""); Tcl_AddErrorInfo(htmlPtr->interp, name); Tcl_AddErrorInfo(htmlPtr->interp, "\" in the HTML widget)"); Tcl_BackgroundError(htmlPtr->interp); htmlPtr->aFont[iFont] = Tk_GetFont(htmlPtr->interp, htmlPtr->tkwin, "fixed"); } if( htmlPtr->aFont[iFont]==0 ){ Tcl_AddErrorInfo(htmlPtr->interp, "\n (trying to create font \"fixed\" in the HTML widget)"); Tcl_BackgroundError(htmlPtr->interp); htmlPtr->aFont[iFont] = Tk_GetFont(htmlPtr->interp, htmlPtr->tkwin, "helvetica -12"); } FontSetValid(htmlPtr, iFont); TestPoint(0); } /* ** Free the expired font, if any. */ if( toFree!=0 ){ Tk_FreeFont(toFree); } return htmlPtr->aFont[iFont]; } /* ** Compute the squared distance between two colors */ static float colorDistance(XColor *pA, XColor *pB){ float x, y, z; x = 0.30 * (pA->red - pB->red); y = 0.61 * (pA->green - pB->green); z = 0.11 * (pA->blue - pB->blue); TestPoint(0); return x*x + y*y + z*z; } /* ** This routine returns an index between 0 and N_COLOR-1 which indicates ** which XColor structure in the apColor[] array of htmlPtr should be ** used to describe the color specified by the given name. */ int HtmlGetColorByName(HtmlWidget *htmlPtr, char *zColor){ XColor *pNew; int iColor; Tk_Uid name; int i, n; char zAltColor[16]; /* Netscape accepts color names that are just HEX values, without ** the # up front. This isn't valid HTML, but we support it for ** compatibility. */ n = strlen(zColor); /* trucate any spaces on the end */ while (n>0 && zColor[n-1]==' ') { zColor[n-1] = '\0'; n--; } if( n==6 || n==3 || n==9 || n==12 ){ for(i=0; i<n; i++){ if( !isxdigit(zColor[i]) ) break; } if( i==n ){ sprintf(zAltColor,"#%s",zColor); }else{ strcpy(zAltColor, zColor); } name = Tk_GetUid(zAltColor); }else{ name = Tk_GetUid(zColor); } pNew = Tk_GetColor(htmlPtr->interp, htmlPtr->clipwin, name); if( pNew==0 ){ return 0; /* Color 0 is always the default */ } iColor = GetColorByValue(htmlPtr, pNew); Tk_FreeColor(pNew); return iColor; } /* ** Macros used in the computation of appropriate shadow colors. */ #define MAX_COLOR 65535 #define MAX(A,B) ((A)<(B)?(B):(A)) #define MIN(A,B) ((A)<(B)?(A):(B)) /* ** Check to see if the given color is too dark to be easily distinguished ** from black. */ static int isDarkColor(XColor *p){ float x, y, z; x = 0.50 * p->red; y = 1.00 * p->green; z = 0.28 * p->blue; return (x*x + y*y + z*z)<0.05*MAX_COLOR*MAX_COLOR; } /* ** Given that the background color is iBgColor, figure out an ** appropriate color for the dark part of a 3D shadow. */ int HtmlGetDarkShadowColor(HtmlWidget *htmlPtr, int iBgColor){ if( htmlPtr->iDark[iBgColor]==0 ){ XColor *pRef, val; pRef = htmlPtr->apColor[iBgColor]; if( isDarkColor(pRef) ){ int t1, t2; t1 = MIN(MAX_COLOR,pRef->red*1.2); t2 = (pRef->red*3 + MAX_COLOR)/4; val.red = MAX(t1,t2); t1 = MIN(MAX_COLOR,pRef->green*1.2); t2 = (pRef->green*3 + MAX_COLOR)/4; val.green = MAX(t1,t2); t1 = MIN(MAX_COLOR,pRef->blue*1.2); t2 = (pRef->blue*3 + MAX_COLOR)/4; val.blue = MAX(t1,t2); }else{ val.red = pRef->red*0.6; val.green = pRef->green*0.6; val.blue = pRef->blue*0.6; } htmlPtr->iDark[iBgColor] = GetColorByValue(htmlPtr, &val) + 1; } return htmlPtr->iDark[iBgColor] - 1; } /* ** Check to see if the given color is too light to be easily distinguished ** from white. */ static int isLightColor(XColor *p){ return p->green>=0.85*MAX_COLOR; } /* ** Given that the background color is iBgColor, figure out an ** appropriate color for the bright part of the 3D shadow. */ int HtmlGetLightShadowColor(HtmlWidget *htmlPtr, int iBgColor){ if( htmlPtr->iLight[iBgColor]==0 ){ XColor *pRef, val; pRef = htmlPtr->apColor[iBgColor]; if( isLightColor(pRef) ){ val.red = pRef->red*0.9; val.green = pRef->green*0.9; val.blue = pRef->blue*0.9; }else{ int t1, t2; t1 = MIN(MAX_COLOR,pRef->green*1.4); t2 = (pRef->green + MAX_COLOR)/2; val.green = MAX(t1,t2); t1 = MIN(MAX_COLOR,pRef->red*1.4); t2 = (pRef->red + MAX_COLOR)/2; val.red = MAX(t1,t2); t1 = MIN(MAX_COLOR,pRef->blue*1.4); t2 = (pRef->blue + MAX_COLOR)/2; val.blue = MAX(t1,t2); } htmlPtr->iLight[iBgColor] = GetColorByValue(htmlPtr, &val) + 1; } return htmlPtr->iLight[iBgColor] - 1; } /* ** Find a color integer for the color whose color components ** are given by pRef. */ LOCAL int GetColorByValue(HtmlWidget *htmlPtr, XColor *pRef){ int i; float dist; float closestDist; int closest; /* int r, g, b; # define COLOR_MASK 0xf800 */ XColor* q; q = Tk_GetColorByValue(htmlPtr->clipwin, pRef); /* Search for an exact match */ /* r = pRef->red &= COLOR_MASK; g = pRef->green &= COLOR_MASK; b = pRef->blue &= COLOR_MASK; */ for(i=0; i<N_COLOR; i++){ XColor *p = htmlPtr->apColor[i]; /* if( p && (p->red & COLOR_MASK)==r && (p->green & COLOR_MASK)==g && (p->blue & COLOR_MASK)==b ){ */ if (p && (q->red == p->red) && (q->green == p->green) && (q->blue == p->blue)) { htmlPtr->colorUsed |= (1<<i); Tk_FreeColor(q); return i; } } Tk_FreeColor(q); /* No exact matches. Look for a completely unused slot */ for(i=N_PREDEFINED_COLOR; i<N_COLOR; i++){ if( htmlPtr->apColor[i]==0 ){ htmlPtr->apColor[i] = Tk_GetColorByValue(htmlPtr->clipwin, pRef); htmlPtr->colorUsed |= (1<<i); return i; } } /* No empty slots. Look for a slot that contains a color that ** isn't currently in use. */ for(i=N_PREDEFINED_COLOR; i<N_COLOR; i++){ if( ((htmlPtr->colorUsed >> i) & 1) == 0 ){ Tk_FreeColor(htmlPtr->apColor[i]); htmlPtr->apColor[i] = Tk_GetColorByValue(htmlPtr->clipwin, pRef); htmlPtr->colorUsed |= (1<<i); return i; } } /* Ok, find the existing color that is closest to the color requested ** and use it. */ closest = 0; closestDist = colorDistance(pRef, htmlPtr->apColor[0]); for(i=1; i<N_COLOR; i++){ dist = colorDistance(pRef, htmlPtr->apColor[i]); if( dist < closestDist ){ closestDist = dist; closest = i; } } return i; } /* ** This routine searchs for a hyperlink beneath the coordinates x,y ** and returns a pointer to the HREF for that hyperlink. The text ** is held one of the markup.argv[] fields of the <a> markup. */ char *HtmlGetHref(HtmlWidget *htmlPtr, int x, int y){ HtmlBlock *pBlock; HtmlElement *pElem; for(pBlock=htmlPtr->firstBlock; pBlock; pBlock=pBlock->pNext){ if( pBlock->top > y || pBlock->bottom < y || pBlock->left > x || pBlock->right < x ){ TestPoint(0); continue; } pElem = pBlock->base.pNext; if( (pElem->base.style.flags & STY_Anchor)==0 ){ TestPoint(0); continue; } switch( pElem->base.type ){ case Html_Text: case Html_Space: case Html_IMG: while( pElem && pElem->base.type!=Html_A ){ pElem = pElem->base.pPrev; } if( pElem==0 || pElem->base.type!=Html_A ){ break; } return HtmlMarkupArg(pElem,"href", 0); default: break; } } TestPoint(0); return 0; } /* ** Change the "yOffset" field from its current value to the value given. ** This has the effect of scrolling the widget vertically. */ void HtmlVerticalScroll(HtmlWidget *htmlPtr, int yOffset){ int inset; /* The 3D border plus the pady */ int h; /* Height of the clipping window */ int diff; /* Difference between old and new offset */ GC gc; /* Graphics context used for copying */ int w; /* Width of text area */ if( yOffset==htmlPtr->yOffset ){ TestPoint(0); return; } inset = htmlPtr->pady + htmlPtr->inset; h = htmlPtr->realHeight - 2*inset; if( (htmlPtr->flags & REDRAW_TEXT)!=0 || (htmlPtr->dirtyTop < h && htmlPtr->dirtyBottom > 0) || htmlPtr->yOffset > yOffset + (h - 30) || htmlPtr->yOffset < yOffset - (h - 30) ){ htmlPtr->yOffset = yOffset; htmlPtr->flags |= VSCROLL | REDRAW_TEXT; HtmlScheduleRedraw(htmlPtr); TestPoint(0); return; } diff = htmlPtr->yOffset - yOffset; gc = HtmlGetAnyGC(htmlPtr); w = htmlPtr->realWidth - 2*(htmlPtr->inset + htmlPtr->padx); htmlPtr->flags |= VSCROLL; htmlPtr->yOffset = yOffset; #ifndef _MACOSX if( diff < 0 ){ XCopyArea(htmlPtr->display, Tk_WindowId(htmlPtr->clipwin), /* source */ Tk_WindowId(htmlPtr->clipwin), /* destination */ gc, 0, -diff, /* source X, Y */ w, h + diff, /* Width and height */ 0, 0); /* Destination X, Y */ HtmlRedrawArea(htmlPtr, 0, h + diff, w, h); TestPoint(0); }else{ XCopyArea(htmlPtr->display, Tk_WindowId(htmlPtr->clipwin), /* source */ Tk_WindowId(htmlPtr->clipwin), /* destination */ gc, 0, 0, /* source X, Y */ w, h - diff, /* Width and height */ 0, diff); /* Destination X, Y */ HtmlRedrawArea(htmlPtr, 0, 0, w, diff); TestPoint(0); } #else HtmlRedrawArea(htmlPtr, 0, 0, w, h); #endif /* HtmlMapControls(htmlPtr);*/ } /* ** Change the "xOffset" field from its current value to the value given. ** This has the effect of scrolling the widget horizontally. */ void HtmlHorizontalScroll(HtmlWidget *htmlPtr, int xOffset){ if( xOffset==htmlPtr->xOffset ){ TestPoint(0); return; } htmlPtr->xOffset = xOffset; HtmlMapControls(htmlPtr); htmlPtr->flags |= HSCROLL | REDRAW_TEXT; HtmlScheduleRedraw(htmlPtr); TestPoint(0); } /* ** The following array defines all possible widget command. The main ** widget command function just parses up the command line, then vectors ** control to one of the command service routines defined in the ** following array: */ static struct HtmlSubcommand { char *zCmd1; /* First-level subcommand. Required */ char *zCmd2; /* Second-level subcommand. May be NULL */ int minArgc; /* Minimum number of arguments */ int maxArgc; /* Maximum number of arguments */ char *zHelp; /* Help string if wrong number of arguments */ int (*xFunc)(HtmlWidget*,Tcl_Interp*,int,const char**); /* Cmd service routine */ } aSubcommand[] = { { "cget", 0, 3, 3, "CONFIG-OPTION", HtmlCgetCmd }, { "clear", 0, 2, 2, 0, HtmlClearCmd }, { "configure", 0, 2, 0, "?ARGS...?", HtmlConfigCmd }, { "href", 0, 4, 4, "X Y", HtmlHrefCmd }, { "index", 0, 3, 3, "INDEX", HtmlIndexCmd }, { "insert", 0, 3, 3, "INDEX", HtmlInsertCmd }, { "names", 0, 2, 2, 0, HtmlNamesCmd }, { "parse", 0, 3, 3, "HTML-TEXT", HtmlParseCmd }, { "resolve", 0, 2, 0, "?URI ...?", HtmlResolveCmd }, { "selection", "clear", 3, 3, 0, HtmlSelectionClearCmd}, { 0, "set", 5, 5, "START END", HtmlSelectionSetCmd }, { "text", "ascii", 5, 5, "START END", HtmlTextAsciiCmd}, { 0, "delete", 5, 5, "START END", 0 }, { 0, "html", 5, 5, "START END", 0 }, { 0, "insert", 5, 5, "INDEX TEXT", 0 }, { "token", "append", 5, 5, "TAG ARGUMENTS", 0 }, { 0, "delete", 4, 5, "INDEX ?INDEX?", 0 }, { 0, "find", 4, 6, "TAG ?before|after INDEX?", 0 }, { 0, "get", 4, 5, "INDEX ?INDEX?", 0 }, { 0, "handler", 4, 5, "TAG ?SCRIPT?", HtmlTokenHandlerCmd }, { 0, "insert", 6, 6, "INDEX TAG ARGUMENTS", 0 }, { 0, "list", 5, 5, "START END", HtmlTokenListCmd }, { "xview", 0, 2, 5, "OPTIONS...", HtmlXviewCmd }, { "yview", 0, 2, 5, "OPTIONS...", HtmlYviewCmd }, #ifdef DEBUG { "debug", "dump", 5, 5, "START END", HtmlDebugDumpCmd }, { 0, "testpt", 4, 4, "FILENAME", HtmlDebugTestPtCmd }, #endif }; #define nSubcommand (sizeof(aSubcommand)/sizeof(aSubcommand[0])) /* ** This routine implements the command used by individual HTML widgets. */ static int HtmlWidgetCommand( ClientData clientData, /* The HTML widget data structure */ Tcl_Interp *interp, /* Current interpreter. */ int argc, /* Number of arguments. */ const char **argv /* Argument strings. */ ){ HtmlWidget *htmlPtr = (HtmlWidget*) clientData; size_t length; int c; int i; struct HtmlSubcommand *pCmd; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " option ?arg arg ...?\"", 0); TestPoint(0); return TCL_ERROR; } c = argv[1][0]; length = strlen(argv[1]); for(i=0, pCmd=aSubcommand; i<nSubcommand; i++, pCmd++){ if( pCmd->zCmd1==0 || c!=pCmd->zCmd1[0] || strncmp(pCmd->zCmd1,argv[1],length)!=0 ){ TestPoint(0); continue; } if( pCmd->zCmd2 ){ int length2; int j; if( argc<3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " ", pCmd->zCmd1, " SUBCOMMAND ?OPTIONS...?", 0); TestPoint(0); return TCL_ERROR; } length2 = strlen(argv[2]); for(j=i; j<nSubcommand && (j==i || pCmd->zCmd1==0); j++, pCmd++){ if( strncmp(pCmd->zCmd2,argv[2],length2)==0 ){ TestPoint(0); break; } } if( j>=nSubcommand || (j!=i && aSubcommand[j].zCmd1!=0) ){ Tcl_AppendResult(interp,"unknown subcommand \"", argv[2], "\" -- should be one of:", 0); for(j=i; j<nSubcommand && (j==i || aSubcommand[j].zCmd1==0); j++){ Tcl_AppendResult(interp, " ", aSubcommand[j].zCmd2, 0); TestPoint(0); } return TCL_ERROR; } } if( argc<pCmd->minArgc || (argc>pCmd->maxArgc && pCmd->maxArgc>0) ){ Tcl_AppendResult(interp,"wrong # args: should be \"", argv[0], " ", pCmd->zCmd1, 0); if( pCmd->zCmd2 ){ Tcl_AppendResult(interp, " ", pCmd->zCmd2, 0); TestPoint(0); } if( pCmd->zHelp ){ Tcl_AppendResult(interp, " ", pCmd->zHelp, 0); TestPoint(0); } Tcl_AppendResult(interp, "\"", 0); TestPoint(0); return TCL_ERROR; } if( pCmd->xFunc==0 ){ Tcl_AppendResult(interp,"command not yet implemented", 0); TestPoint(0); return TCL_ERROR; } TestPoint(0); return (*pCmd->xFunc)(htmlPtr, interp, argc, argv); } Tcl_AppendResult(interp,"unknown command \"", argv[1], "\" -- should be " "one of:", 0); for(i=0; i<nSubcommand; i++){ if( aSubcommand[i].zCmd1==0 || aSubcommand[i].zCmd1[0]=='_' ){ TestPoint(0); continue; } Tcl_AppendResult(interp, " ", aSubcommand[i].zCmd1, 0); TestPoint(0); } TestPoint(0); return TCL_ERROR; } /* ** The following routine implements the Tcl "html" command. This command ** is used to create new HTML widgets only. After the widget has been ** created, it is manipulated using the widget command defined above. */ static int HtmlCommand( ClientData clientData, /* Main window */ Tcl_Interp *interp, /* Current interpreter. */ int argc, /* Number of arguments. */ const char **argv /* Argument strings. */ ){ int n, c; char *z; if (argc < 2) { Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " pathName ?options?\"", (char *) NULL); return TCL_ERROR; } z = (char*)argv[1]; n = strlen(z); c = z[0]; /* If the first argument begins with ".", then it must be the ** name of a new window the user wants to create. */ if( argv[1][0]=='.' ){ HtmlWidget *htmlPtr; Tk_Window new; Tk_Window clipwin; char *zClipwin; Tk_Window tkwin = (Tk_Window)clientData; static int varId = 1; /* Used to construct unique names */ new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL); if (new == NULL) { return TCL_ERROR; } zClipwin = HtmlAlloc( strlen(argv[1]) + 3 ); if( zClipwin==0 ){ Tk_DestroyWindow(new); return TCL_ERROR; } sprintf(zClipwin,"%s.x",argv[1]); clipwin = Tk_CreateWindowFromPath(interp, new, zClipwin, 0); if( clipwin==0 ){ Tk_DestroyWindow(new); HtmlFree(zClipwin); return TCL_ERROR; } htmlPtr = HtmlAlloc(sizeof(HtmlWidget) + strlen(argv[1]) + 1); memset(htmlPtr, 0, sizeof(HtmlWidget)); htmlPtr->tkwin = new; htmlPtr->clipwin = clipwin; htmlPtr->zClipwin = zClipwin; htmlPtr->display = Tk_Display(new); htmlPtr->interp = interp; htmlPtr->zCmdName = (char*)&htmlPtr[1]; strcpy(htmlPtr->zCmdName, argv[1]); htmlPtr->relief = TK_RELIEF_FLAT; htmlPtr->dirtyLeft = LARGE_NUMBER; htmlPtr->dirtyTop = LARGE_NUMBER; htmlPtr->flags = RESIZE_CLIPWIN; htmlPtr->varId = varId++; Tcl_CreateCommand(interp, htmlPtr->zCmdName, HtmlWidgetCommand, (ClientData)htmlPtr, HtmlCmdDeletedProc); Tcl_CreateCommand(interp, htmlPtr->zClipwin, HtmlWidgetCommand, (ClientData)htmlPtr, HtmlCmdDeletedProc); Tk_SetClass(new,"Html"); Tk_SetClass(clipwin,"HtmlClip"); Tk_CreateEventHandler(htmlPtr->tkwin, ExposureMask|StructureNotifyMask|FocusChangeMask, HtmlEventProc, (ClientData) htmlPtr); Tk_CreateEventHandler(htmlPtr->clipwin, ExposureMask|StructureNotifyMask, HtmlEventProc, (ClientData) htmlPtr); if (ConfigureHtmlWidget(interp, htmlPtr, argc-2, argv+2, 0, 1) != TCL_OK) { goto error; } Tcl_SetResult(interp,Tk_PathName(htmlPtr->tkwin),NULL); return TCL_OK; error: Tk_DestroyWindow(htmlPtr->tkwin); return TCL_ERROR; } /* html reformat $from $to $text ** ** Convert the format of text. */ if( c=='r' && strncmp(z,"reformat",n)==0 ){ if( argc!=5 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " reformat FROM TO TEXT", (char *) NULL); return TCL_ERROR; } Tcl_AppendResult(interp, "not yet implemented", 0); return TCL_ERROR; }else /* html urljoin $scheme $authority $path $query $fragment ** ** Merge together the parts of a URL into a single value URL. */ if( c=='u' && strncmp(z,"urljoin",n)==0 ){ if( argc!=7 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " url join SCHEME AUTHORITY PATH QUERY FRAGMENT\"", 0); return TCL_ERROR; } Tcl_AppendResult(interp, "not yet implemented", 0); return TCL_ERROR; }else /* html urlsplit $url ** ** Split a URL into a list of its parts. */ if( c=='u' && strncmp(z,"urlsplit",n)==0 ){ if( argc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " url split URL\"", 0); return TCL_ERROR; } Tcl_AppendResult(interp, "not yet implemented", 0); return TCL_ERROR; }else /* No match. Report an error. */ { Tcl_AppendResult(interp, "unknown command \"", z, "\": should be " "a window name or one of: " "reformat urljoin urlsplit", 0); return TCL_ERROR; } return TCL_OK; } /* ** The following mess is used to define DLL_EXPORT. DLL_EXPORT is ** blank except when we are building a Windows95/NT DLL from this ** library. Some special trickery is necessary to make this wall ** work together with makeheaders. */ #if INTERFACE #define DLL_EXPORT #endif #if defined(USE_TCL_STUBS) && defined(__WIN32__) # undef DLL_EXPORT # define DLL_EXPORT __declspec(dllexport) #endif /* ** This routine is used to register the "html" command with the ** Tcl interpreter. This is the only routine in this file with ** external linkage. */ DLL_EXPORT int Tkhtml_Init(Tcl_Interp *interp) { if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; if (Tk_InitStubs(interp, TK_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; Tcl_CreateCommand(interp,"html", HtmlCommand, Tk_MainWindow(interp), 0); #ifdef DEBUG Tcl_LinkVar(interp, "HtmlTraceMask", (char*)&HtmlTraceMask, TCL_LINK_INT); #endif if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) return TCL_ERROR; return TCL_OK; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/htmlwidget.h�������������������������������������������������������������������000644 �000765 �000000 �00000066577 12547267112 017252� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file was automatically generated. Do not edit! */ #define DLL_EXPORT DLL_EXPORT int Tkhtml_Init(Tcl_Interp *interp); #define INTERFACE 0 #define HtmlAlloc(A) ((void*)Tcl_Alloc(A)) typedef struct HtmlWidget HtmlWidget; #define DEBUG 1 #if defined(DEBUG) int HtmlDebugTestPtCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlDebugDumpCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); #endif int HtmlYviewCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlXviewCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlTokenListCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlTokenHandlerCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlTextAsciiCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlSelectionSetCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlSelectionClearCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlResolveCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlParseCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlNamesCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlInsertCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlIndexCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlHrefCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlConfigCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlClearCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); int HtmlCgetCmd(HtmlWidget *htmlPtr,Tcl_Interp *interp,int argc,const char **argv); void HtmlHorizontalScroll(HtmlWidget *htmlPtr,int xOffset); void HtmlVerticalScroll(HtmlWidget *htmlPtr,int yOffset); typedef union HtmlElement HtmlElement; char *HtmlMarkupArg(HtmlElement *p,const char *tag,char *zDefault); #define Html_A 5 #define Html_IMG 76 #define Html_Space 2 #define Html_Text 1 #define STY_Anchor 0x010 char *HtmlGetHref(HtmlWidget *htmlPtr,int x,int y); #define LOCAL static int HtmlGetLightShadowColor(HtmlWidget *htmlPtr,int iBgColor); int HtmlGetDarkShadowColor(HtmlWidget *htmlPtr,int iBgColor); #define MAX(A,B) ((A)<(B)?(B):(A)) LOCAL int GetColorByValue(HtmlWidget *htmlPtr,XColor *pRef); int HtmlGetColorByName(HtmlWidget *htmlPtr,char *zColor); #define FontSetValid(H,I) ((H)->fontValid[(I)>>3] |= (1<<((I)&3))) #define N_FONT_SIZE 7 #define FontSize(X) ((X)%N_FONT_SIZE) #define FontIsValid(H,I) (((H)->fontValid[(I)>>3] & (1<<((I)&3)))!=0) void HtmlTPCantHappen(const char *zFile,int line); #if defined(COVERAGE_TEST) # define CANT_HAPPEN HtmlTPCantHappen(__FILE__,__LINE__) #endif #if !(defined(COVERAGE_TEST)) # define CANT_HAPPEN #endif GC HtmlGetAnyGC(HtmlWidget *htmlPtr); Tk_Font HtmlGetFont(HtmlWidget *htmlPtr,int iFont); #define FONT_Default 3 typedef struct GcCache GcCache; typedef unsigned char Html_u8; struct GcCache { GC gc; /* The graphics context */ Html_u8 font; /* Font used for this context */ Html_u8 color; /* Color used for this context */ Html_u8 index; /* Index used for LRU replacement */ }; void HtmlFlashCursor(ClientData clientData); int HtmlIsDead(HtmlWidget *htmlPtr); #define Html_TypeCount 151 #define N_FONT_FAMILY 8 #define N_FONT (N_FONT_FAMILY*N_FONT_SIZE) #define ALIGN_None 0 typedef struct HtmlStyleStack HtmlStyleStack; typedef struct HtmlStyle HtmlStyle; struct HtmlStyle { unsigned int font : 6; /* Font to use for display */ unsigned int color : 4; /* Foreground color */ signed int subscript : 4; /* Positive for <sup>, negative for <sub> */ unsigned int align : 2; /* Horizontal alignment */ unsigned int bgcolor : 4; /* Background color */ unsigned int flags : 12; /* the STY_ flags below */ }; struct HtmlStyleStack { HtmlStyleStack *pNext; /* Next style on the stack */ int type; /* A markup that ends this style. Ex: Html_EndEM */ HtmlStyle style; /* The currently active style. */ }; #define N_COLOR 16 /* Total number of colors */ #define N_PREDEFINED_COLOR 5 /* Number of predefined colors */ void HtmlDeleteControls(HtmlWidget *htmlPtr); void HtmlClear(HtmlWidget *htmlPtr); #define HtmlFree(A) Tcl_Free((char*)(A)) #define Html_Block 4 void HtmlDeleteElement(HtmlElement *p); #define COLOR_Selection 3 /* Background color for the selection */ #define COLOR_Unvisited 1 /* Index for unvisited hyperlinks */ #define COLOR_Visited 2 /* Color for visited hyperlinks */ #define COLOR_Normal 0 /* Index for normal color (black) */ int ConfigureHtmlWidget(Tcl_Interp *interp,HtmlWidget *htmlPtr,int argc,const char **argv,int flags,int realign); void HtmlRedrawText(HtmlWidget *htmlPtr,int y); void HtmlRedrawEverything(HtmlWidget *htmlPtr); typedef struct HtmlBlock HtmlBlock; void HtmlRedrawBlock(HtmlWidget *htmlPtr,HtmlBlock *p); void HtmlRedrawArea(HtmlWidget *htmlPtr,int left,int top,int right,int bottom); void HtmlScheduleRedraw(HtmlWidget *htmlPtr); #define LARGE_NUMBER 100000000 void HtmlDrawImage(HtmlElement *pElem,Drawable drawable,int drawableLeft,int drawableTop,int drawableRight,int drawableBottom); typedef struct HtmlBaseElement HtmlBaseElement; typedef short Html_16; struct HtmlBaseElement { HtmlElement *pNext; /* Next input token in a list of them all */ HtmlElement *pPrev; /* Previous token in a list of them all */ HtmlStyle style; /* The rendering style for this token */ Html_u8 type; /* The token type. */ Html_u8 flags; /* The HTML_ flags below */ Html_16 count; /* Various uses, depending on "type" */ }; typedef struct HtmlTextElement HtmlTextElement; typedef int Html_32; struct HtmlTextElement { HtmlBaseElement base; /* All the base information */ Html_32 y; /* y coordinate where text should be rendered */ Html_16 x; /* x coordinate where text should be rendered */ Html_16 w; /* width of this token in pixels */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_u8 spaceWidth; /* Width of one space in the current font */ char zText[1]; /* Text for this element. Null terminated */ }; typedef struct HtmlSpaceElement HtmlSpaceElement; struct HtmlSpaceElement { HtmlBaseElement base; /* All the base information */ Html_16 w; /* Width of a single space in current font */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ }; typedef struct HtmlMarkupElement HtmlMarkupElement; struct HtmlMarkupElement { HtmlBaseElement base; char **argv; }; typedef struct HtmlCell HtmlCell; struct HtmlCell { HtmlMarkupElement markup; Html_16 rowspan; /* Number of rows spanned by this cell */ Html_16 colspan; /* Number of columns spanned by this cell */ Html_16 x; /* X coordinate of left edge of border */ Html_16 w; /* Width of the border */ Html_32 y; /* Y coordinate of top of border indentation */ Html_32 h; /* Height of the border */ HtmlElement *pTable; /* Pointer back to the <table> */ HtmlElement *pEnd; /* Element that ends this cell */ }; typedef struct HtmlTable HtmlTable; typedef unsigned short Html_u16; #define HTML_MAX_COLUMNS 40 struct HtmlTable { HtmlMarkupElement markup; Html_u8 borderWidth; /* Width of the border */ Html_u8 nCol; /* Number of columns */ Html_u16 nRow; /* Number of rows */ Html_32 y; /* top edge of table border */ Html_32 h; /* height of the table border */ Html_16 x; /* left edge of table border */ Html_16 w; /* width of the table border */ int minW[HTML_MAX_COLUMNS+1]; /* minimum width of each column */ int maxW[HTML_MAX_COLUMNS+1]; /* maximum width of each column */ }; typedef struct HtmlRef HtmlRef; struct HtmlRef { HtmlMarkupElement markup; HtmlElement *pOther; /* Pointer to some other Html element */ }; typedef struct HtmlLi HtmlLi; struct HtmlLi { HtmlMarkupElement markup; Html_u8 type; /* What type of list is this? */ Html_u8 ascent; /* height above the baseline */ Html_u8 descent; /* depth below the baseline */ Html_16 cnt; /* Value for this element (if inside <OL>) */ Html_16 x; /* X coordinate of the bullet */ Html_32 y; /* Y coordinate of the bullet */ }; typedef struct HtmlListStart HtmlListStart; struct HtmlListStart { HtmlMarkupElement markup; Html_u8 type; /* One of the LI_TYPE_ defines above */ Html_u8 compact; /* True if the COMPACT flag is present */ Html_u16 cnt; /* Next value for <OL> */ Html_u16 width; /* How much space to allow for indentation */ HtmlElement *pPrev; /* Next higher level list, or NULL */ }; typedef struct HtmlImageMarkup HtmlImageMarkup; typedef struct HtmlImage HtmlImage; struct HtmlImageMarkup { HtmlMarkupElement markup; Html_u8 align; /* Alignment. See IMAGE_ALIGN_ defines below */ Html_u8 textAscent; /* Ascent of text font in force at the <IMG> */ Html_u8 textDescent; /* Descent of text font in force at the <IMG> */ Html_u8 redrawNeeded; /* Need to redraw this image because the image ** content changed. */ Html_16 h; /* Actual height of the image */ Html_16 w; /* Actual width of the image */ Html_16 ascent; /* How far image extends above "y" */ Html_16 descent; /* How far image extends below "y" */ Html_16 x; /* X coordinate of left edge of the image */ Html_32 y; /* Y coordinate of image baseline */ char *zAlt; /* Alternative text */ HtmlImage *pImage; /* Corresponding HtmlImage structure */ HtmlElement *pNext; /* Next markup using the same HtmlImage structure */ }; typedef struct HtmlInput HtmlInput; struct HtmlInput { HtmlMarkupElement markup; HtmlElement *pForm; /* The <FORM> to which this belongs */ HtmlElement *pNext; /* Next element in a list of all input elements */ Tk_Window tkwin; /* The window that implements this control */ HtmlWidget *htmlPtr; /* The whole widget. Needed by geometry callbacks */ HtmlElement *pEnd; /* End tag for <TEXTAREA>, etc. */ Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 padLeft; /* Extra padding on left side of the control */ Html_u8 align; /* One of the IMAGE_ALIGN_xxx types */ Html_u8 textAscent; /* Ascent for the current font */ Html_u8 textDescent; /* descent for the current font */ Html_u8 type; /* What type of input is this? */ Html_u8 sized; /* True if this input has been sized already */ Html_u16 cnt; /* Used to derive widget name. 0 if no widget */ }; typedef struct HtmlForm HtmlForm; struct HtmlForm { HtmlMarkupElement markup; Html_u16 id; /* Unique number assigned to this form */ }; typedef struct HtmlHr HtmlHr; struct HtmlHr { HtmlMarkupElement markup; Html_32 y; /* Baseline for this input element */ Html_u16 x; /* Left edge */ Html_u16 w, h; /* Width and height of this control */ Html_u8 is3D; /* Is it drawn 3D? */ }; typedef struct HtmlAnchor HtmlAnchor; struct HtmlAnchor { HtmlMarkupElement markup; Html_32 y; /* Top edge for this element */ }; typedef struct HtmlScript HtmlScript; struct HtmlScript { HtmlMarkupElement markup; char *zScript; /* Complete text of this script */ int nScript; /* Number of characters of text */ }; struct HtmlBlock { HtmlBaseElement base; /* Superclass. Must be first */ char *z; /* Space to hold text when n>0 */ int top, bottom; /* Extremes of y coordinates */ Html_u16 left, right; /* Left and right boundry of this object */ Html_u16 n; /* Number of characters in z[] */ HtmlBlock *pPrev, *pNext; /* Linked list of all Blocks */ }; union HtmlElement { HtmlElement *pNext; HtmlBaseElement base; HtmlTextElement text; HtmlSpaceElement space; HtmlMarkupElement markup; HtmlCell cell; HtmlTable table; HtmlRef ref; HtmlLi li; HtmlListStart list; HtmlImageMarkup image; HtmlInput input; HtmlForm form; HtmlHr hr; HtmlAnchor anchor; HtmlScript script; HtmlBlock block; }; #define REDRAW_IMAGES 0x002000 void HtmlBlockDraw(HtmlWidget *htmlPtr,HtmlBlock *pBlock,Drawable drawable,int drawableLeft,int drawableTop,int drawableWidth,int drawableHeight); #define FONT_Any -1 #define COLOR_Background 4 /* Default background color */ GC HtmlGetGC(HtmlWidget *htmlPtr,int color,int font); #define RESIZE_CLIPWIN 0x000400 #define REDRAW_BORDER 0x000100 #define GOT_FOCUS 0x000002 #define REDRAW_FOCUS 0x000040 #define REDRAW_PENDING 0x000001 void HtmlUpdateInsert(HtmlWidget *htmlPtr); void HtmlUpdateSelection(HtmlWidget *htmlPtr,int forceUpdate); int HtmlMapControls(HtmlWidget *htmlPtr); void HtmlFormBlocks(HtmlWidget *htmlPtr); int HtmlUnlock(HtmlWidget *htmlPtr); void HtmlLayout(HtmlWidget *htmlPtr); void HtmlLock(HtmlWidget *htmlPtr); #define REDRAW_TEXT 0x000080 #define VSCROLL 0x000008 #define HSCROLL 0x000004 #define EXTEND_LAYOUT 0x000200 #define RELAYOUT 0x000010 struct HtmlImage { HtmlWidget *htmlPtr; /* The owner of this image */ Tk_Image image; /* The Tk image token */ Html_32 w; /* Requested width of this image (0 if none) */ Html_32 h; /* Requested height of this image (0 if none) */ char *zUrl; /* The URL for this image. */ char *zWidth, *zHeight; /* Width and height in the <img> markup. */ HtmlImage *pNext; /* Next image on the list */ HtmlElement *pList; /* List of all <IMG> markups that use this ** same image */ }; #define STYLER_RUNNING 0x000800 #define RESIZE_ELEMENTS 0x000020 typedef struct HtmlMargin HtmlMargin; void HtmlClearMarginStack(HtmlMargin **ppMargin); #define N_CACHE_GC 16 void HtmlComputeHorizontalPosition(HtmlWidget *htmlPtr,char *buf); void HtmlComputeVerticalPosition(HtmlWidget *htmlPtr,char *buf); int HtmlUsableHeight(HtmlWidget *htmlPtr); #if defined(COVERAGE_TEST) extern int HtmlTPArray[2000]; # define TestPoint(X) {extern int HtmlTPArray[]; HtmlTPArray[X]++;} #endif #if !(defined(COVERAGE_TEST)) # define TestPoint(X) #endif int HtmlUsableWidth(HtmlWidget *htmlPtr); Tk_ConfigSpec *HtmlConfigSpec(void); #define DEF_HTML_SCROLL_COMMAND "" #define DEF_HTML_WIDTH "600" #define DEF_HTML_VISITED "blue3" #define DEF_HTML_UNVISITED "blue1" #define DEF_HTML_TAKE_FOCUS "0" #define DEF_HTML_SELECTION_COLOR "skyblue" #define DEF_HTML_RELIEF "raised" #define DEF_HTML_PADY "5" #define DEF_HTML_PADX "5" #define DEF_HTML_INSERT_ON_TIME "600" #define DEF_HTML_INSERT_OFF_TIME "300" #define DEF_HTML_HIGHLIGHT_WIDTH "0" #define DEF_HTML_HIGHLIGHT DEF_BUTTON_HIGHLIGHT #define DEF_HTML_HIGHLIGHT_BG DEF_BUTTON_HIGHLIGHT_BG #define DEF_HTML_HEIGHT "400" #define DEF_HTML_FG DEF_BUTTON_FG #define DEF_HTML_EXPORT_SEL "yes" #define DEF_HTML_CURSOR DEF_FRAME_CURSOR #define DEF_HTML_BORDER_WIDTH "2" #define DEF_HTML_BG_MONO DEF_FRAME_BG_MONO #define DEF_HTML_BG_COLOR DEF_FRAME_BG_COLOR typedef struct HtmlIndex HtmlIndex; struct HtmlIndex { HtmlElement *p; /* The token containing the character */ int i; /* Index of the character */ }; typedef struct HtmlLayoutContext HtmlLayoutContext; struct HtmlLayoutContext { HtmlWidget *htmlPtr; /* The html widget undergoing layout */ HtmlElement *pStart; /* Start of elements to layout */ HtmlElement *pEnd; /* Stop when reaching this element */ int headRoom; /* Extra space wanted above this line */ int top; /* Absolute top of drawing area */ int bottom; /* Bottom of previous line */ int left, right; /* Left and right extremes of drawing area */ int pageWidth; /* Width of the layout field, including ** the margins */ int maxX, maxY; /* Maximum X and Y values of paint */ HtmlMargin *leftMargin; /* Stack of left margins */ HtmlMargin *rightMargin; /* Stack of right margins */ }; struct HtmlWidget { Tk_Window tkwin; /* The main window for this widget */ Tk_Window clipwin; /* The clipping window in which all text is ** rendered. */ char *zClipwin; /* Name of the clipping window. */ Display *display; /* The X11 Server that contains tkwin */ Tcl_Interp *interp; /* The interpreter in which the widget lives */ char *zCmdName; /* Name of the command */ HtmlElement *pFirst; /* First HTML token on a list of them all */ HtmlElement *pLast; /* Last HTML token on the list */ int nToken; /* Number of HTML tokens on the list. * Html_Block tokens don't count. */ HtmlElement *lastSized; /* Last HTML element that has been sized */ HtmlElement *nextPlaced; /* Next HTML element that needs to be * positioned on canvas. */ HtmlBlock *firstBlock; /* List of all HtmlBlock tokens */ HtmlBlock *lastBlock; /* Last HtmlBlock in the list */ HtmlElement *firstInput; /* First <INPUT> element */ HtmlElement *lastInput; /* Last <INPUT> element */ int nInput; /* The number of <INPUT> elements */ int nForm; /* The number of <FORM> elements */ int varId; /* Used to construct a unique name for a ** global array used by <INPUT> elements */ /* * Information about the selected region of text */ HtmlIndex selBegin; /* Start of the selection */ HtmlIndex selEnd; /* End of the selection */ HtmlBlock *pSelStartBlock; /* Block in which selection starts */ Html_16 selStartIndex; /* Index in pSelStartBlock of first selected * character */ Html_16 selEndIndex; /* Index of last selecte char in pSelEndBlock */ HtmlBlock *pSelEndBlock; /* Block in which selection ends */ /* * Information about the insertion cursor */ int insOnTime; /* How long the cursor states one (millisec) */ int insOffTime; /* How long it is off (milliseconds) */ int insStatus; /* Is it visible? */ Tcl_TimerToken insTimer; /* Timer used to flash the insertion cursor */ HtmlIndex ins; /* The insertion cursor position */ HtmlBlock *pInsBlock; /* The HtmlBlock containing the cursor */ int insIndex; /* Index in pInsBlock of the cursor */ /* * The following fields hold state information used by * the tokenizer. */ char *zText; /* Complete text of the unparsed HTML */ int nText; /* Number of characters in zText */ int nAlloc; /* Space allocated for zText */ int nComplete; /* How much of zText has actually been * converted into tokens */ int iCol; /* The column in which zText[nComplete] * occurs. Used to resolve tabs in input */ int iPlaintext; /* If not zero, this is the token type that * caused us to go into plaintext mode. One * of Html_PLAINTEXT, Html_LISTING or * Html_XMP */ HtmlScript *pScript; /* <SCRIPT> currently being parsed */ char *zHandler[Html_TypeCount]; /* If not NULL, this is a TCL routine that * is used to process tokens of the given * type */ /* * These fields hold state information used by the HtmlAddStyle routine. * We have to store this state information here since HtmlAddStyle * operates incrementally. This information must be carried from * one incremental execution to the next. */ HtmlStyleStack *styleStack; /* The style stack */ int paraAlignment; /* Justification associated with <p> */ int rowAlignment; /* Justification associated with <tr> */ int anchorFlags; /* Style flags associated with <A>...</A> */ int inDt; /* Style flags associated with <DT>...</DT> */ int inTr; /* True if within <tr>..</tr> */ int inTd; /* True if within <td>..</td> or <th>..</th> */ HtmlElement *anchorStart; /* Most recent <a href=...> */ HtmlElement *formStart; /* Most recent <form> */ HtmlElement *formElemStart; /* Most recent <textarea> or <select> */ HtmlElement *innerList; /* The inner most <OL> or <UL> */ /* * These fields are used to hold the state of the layout engine. * Because the layout is incremental, this state must be held for * the life of the widget. */ HtmlLayoutContext layoutContext; /* * Information used when displaying the widget: */ Tk_3DBorder border; /* Background color */ int borderWidth; /* Width of the border. */ int relief; /* 3-D effect: TK_RELIEF_RAISED, etc. */ int highlightWidth; /* Width in pixels of highlight to draw * around widget when it has the focus. * <= 0 means don't draw a highlight. */ XColor *highlightBgColorPtr; /* Color for drawing traversal highlight * area when highlight is off. */ XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ int inset; /* Total width of highlight and 3-D border */ Tk_Font aFont[N_FONT]; /* Information about all screen fonts */ char fontValid[(N_FONT+7)/8]; /* If bit N%8 of work N/8 of this field is 0 * if aFont[N] needs to be reallocated before * being used. */ XColor *apColor[N_COLOR]; /* Information about all colors */ int colorUsed; /* bit N is 1 if color N is in use. Only ** applies to colors that aren't predefined */ int iDark[N_COLOR]; /* Dark 3D shadow of color K is iDark[K] */ int iLight[N_COLOR]; /* Light 3D shadow of color K is iLight[K] */ XColor *fgColor; /* Color of normal text. apColor[0] */ XColor *newLinkColor; /* Color of unvisitied links. apColor[1] */ XColor *oldLinkColor; /* Color of visitied links. apColor[2] */ XColor *selectionColor; /* Background color for selections */ GcCache aGcCache[N_CACHE_GC]; /* A cache of GCs for general use */ int lastGC; /* Index of recently used GC */ HtmlImage *imageList; /* A list of all images */ int width, height; /* User-requested size of the usable drawing * area, in pixels. Borders and padding * make the actual window a little larger */ int realWidth, realHeight; /* The actual physical size of tkwin as * reported in the most recent ConfigureNotify * event. */ int padx, pady; /* Separation between the edge of the window * and rendered HTML. */ int underlineLinks; /* TRUE if we should underline hyperlinks */ /* Information about the selection */ int exportSelection; /* True if the selection is automatically * exported to the clipboard */ /* Callback commands. The HTML parser will invoke callbacks from time ** to time to find out information it needs to complete formatting of ** the document. The following fields define the callback commands. */ char *zIsVisited; /* Command to tell if a hyperlink has already ** been visited */ char *zGetImage; /* Command to get an image from a URL */ char *zFrameCommand; /* Command for handling <frameset> markup */ char *zAppletCommand; /* Command to process applets */ char *zResolverCommand; /* Command to resolve URIs */ char *zFormCommand; /* When user presses Submit */ char *zHyperlinkCommand; /* Invoked when a hyperlink is clicked */ char *zFontCommand; /* Invoked to find font names */ char *zScriptCommand; /* Invoked for each <SCRIPT> markup */ /* * Miscellaneous information: */ int tableRelief; /* 3d effects on <TABLE> */ int ruleRelief; /* 3d effects on <HR> */ char *zBase; /* The base URI */ char *zBaseHref; /* zBase as modified by <BASE HREF=..> markup */ Tk_Cursor cursor; /* Current cursor for window, or None. */ char *takeFocus; /* Value of -takefocus option; not used in * the C code, but used by keyboard traversal * scripts. Malloc'ed, but may be NULL. */ char *yScrollCmd; /* Command prefix for communicating with * vertical scrollbar. NULL means no command * to issue. Malloc'ed. */ char *xScrollCmd; /* Command prefix for communicating with * horizontal scrollbar. NULL means no command * to issue. Malloc'ed. */ int xOffset, yOffset; /* Current scroll position. These form the * coordinate in the virtual canvas that * corresponds to (0,0) on the physical screen * in window tkwin */ int maxX, maxY; /* Maximum extent of any "paint" that appears * on the virtual canvas. Used to compute * scrollbar positions. */ int dirtyLeft, dirtyTop; /* Top left corner of region to redraw. These * are physical screen coordinates relative to * clipwin, not tkwin. */ int dirtyRight, dirtyBottom; /* Bottom right corner of region to redraw */ int locked; /* Number of locks on this structure. Don't ** delete until it reaches zero. */ int flags; /* Various flags; see below for * definitions. */ }; #define DEF_HTML_CALLBACK "" extern int HtmlTraceMask; struct HtmlMargin { int indent; /* Size of the current margin */ int bottom; /* Y value at which this margin expires */ int tag; /* Markup that will cancel this margin */ HtmlMargin *pNext; /* Previous margin */ }; ���������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/src/tokenlist.txt������������������������������������������������������������������000644 �000765 �000000 �00000012366 07504443346 017473� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # This file contains raw data used to build the "htmltokens.c" file. # Each line contains 2 or 3 elements. The first word on each line is # the name of some HTML markup. The second word is the amount of # space to allocate for the corresponding element. "0" appears if # no extra space (beyond HtmlMarkup) is required. If there is a # corresponding end-tag, then the third column specifies the size of # the end markup. # $Revision: 1.1.1.1 $ # # Copyright (C) 1997-2000 D. Richard Hipp # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@acm.org # http://www.hwaci.com/drh/ # Order is not important. Comments begin with #. Spacing is ignored. a HtmlAnchor HtmlRef address 0 0 applet HtmlInput 0 area 0 b 0 0 base 0 basefont 0 0 bgsound 0 big 0 0 blockquote 0 0 body 0 0 br 0 caption 0 0 center 0 0 cite 0 0 code 0 0 comment 0 0 dd HtmlRef 0 dfn 0 0 dir HtmlListStart HtmlRef div 0 0 dl HtmlListStart HtmlRef dt HtmlRef 0 em 0 0 embed HtmlInput font 0 0 form HtmlForm HtmlRef frame 0 0 frameset 0 0 h1 0 0 h2 0 0 h3 0 0 h4 0 0 h5 0 0 h6 0 0 hr HtmlHr html 0 0 i 0 0 iframe 0 img HtmlImageMarkup input HtmlInput isindex 0 kbd 0 0 li HtmlLi 0 link 0 listing 0 0 map 0 0 marquee 0 0 menu HtmlListStart HtmlRef meta 0 nextid 0 nobr 0 0 noframe 0 0 noscript 0 0 ol HtmlListStart HtmlRef option 0 0 p 0 0 param 0 0 plaintext 0 pre 0 0 s 0 0 samp 0 0 script HtmlScript select HtmlInput HtmlRef small 0 0 strike 0 0 strong 0 0 style HtmlScript sub 0 0 sup 0 0 table HtmlTable HtmlRef td HtmlCell HtmlRef textarea HtmlInput HtmlRef th HtmlCell HtmlRef title 0 0 tr HtmlRef HtmlRef tt 0 0 u 0 0 ul HtmlListStart HtmlRef var 0 0 wbr 0 xmp 0 0 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/COPYING������������������������������������������������������������������������000644 �000765 �000000 �00000043070 07504443343 015720� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) 19yy <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/COPYRIGHT����������������������������������������������������������������������000644 �000765 �000000 �00000001774 12547270645 016173� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # This code has been modified under the terms listed below and is made # available under the same terms. # # Copyright (C) 1997,1998 D. Richard Hipp # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Library General Public License for more details. # # You should have received a copy of the GNU Library General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Author contact information: # drh@acm.org # http://www.hwaci.com/drh/ ����saods9/tkhtml1.0/doc/notes1.txt���������������������������������������������������������������������000644 �000765 �000000 �00000002767 07504443344 016650� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������The HTML widget uses lots of TCL callback routines. But a TCL callback can do nasty things. For example, a TCL callback could delete the HTML widget that invoked the callback. Or it could delete the TCL interpreter in which the HTML widget is running. So we have to call HtmlLock() before invoking a TCL callback and check to make sure the widget was not deleted before using any fields in the widget structure after the callback runs. The following routines can call TCL callbacks, either directly or indirectly: HtmlTokenizerAppend() HtmlParseCmd() HtmlWidgetCommand() HtmlGetImage() HtmlAddStyle() HtmlParseCmd()... HtmlSizer() HtmlLayout() HtmlRedrawCallback() GetLinkColor() HtmlAddStyle()... HtmlCallResolver() HtmlGetImage()... HtmlResolveCmd() HtmlWidgetCommand() HtmlRedrawCallback()... HtmlGetFont() DrawSelectionBackground() HtmlBlockDraw()... HtmlBlockDraw() HtmlRedrawCallback() FindIndexInBlock() DecodeBaseIndex() HtmlGetIndex() HtmlIndexCmd() HtmlWidgetCommand()... HtmlSelectionSetCmd() HtmlWidgetCommand()... HtmlInsertCmd() HtmlWidgetCommand()... Paragraph() DoBreakMarkup() HtmlLayoutBlock() HtmlLayout()... HtmlTableLayout() DoBreakMarkup()... HtmlDeleteControls() HtmlClear() HtmlWidgetCommand()... HtmlDestroyWidget() ���������saods9/tkhtml1.0/doc/README�������������������������������������������������������������������������000644 �000765 �000000 �00000001015 07504443343 015536� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������This directory contains all source code files for the TkHtml widget. TkHtml renders HTML for Tcl/Tk 8.0 and later. COPYRIGHT Text of the GNU Public License, under which this software is distributed. COMPILE.txt Instructions on how to compile TkHtml. doc Other documentation about TkHtml. src All of the source code. tools Source code to tools that are used to build the widget but which do not become part of the widget. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/simple.make��������������������������������������������������������������������000644 �000765 �000000 �00000003455 07504443344 017021� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # # Trying to generate a loadable module for Tcl/Tk8.1.1 on # WindowsNT using Cygwin20 cross-compiler running under # RedHat6.0. # Step -1: # Make a copy of winsock.h into winsock2.h. "Winsock2.h" is needed by # tclWinPort.h. tclWinPort.h is included by tclStubLib.c in step 3. # # Step 0: # Make sure the cross-compiler tools are on PATH and remove # old files. # PATH=$PATH:/opt/cygwin20/bin rm -f simple.o stublib.o simple.dll # Step 1: # Generate the C source code into "simple.c" # cat >simple.c <<\END #include <tcl.h> int Simple_Init(Tcl_Interp *interp){ Tcl_InitStubs(interp,"8.1",0); Tk_InitStubs(interp,"8.1",0); return TCL_OK; } END # Step 2: # Compile the C source code yielding simple.o # i586-cygwin32-gcc \ -I/home/drh/tcltk/tcl8.1.1/generic \ -mno-cygwin \ -DUSE_TCL_STUBS=1 \ -c simple.c # Step 3: # Compile the Stub libraries yielding tclstub.o and tkstub.o # i586-cygwin32-gcc \ -I/home/drh/tcltk/tcl8.1.1/generic \ -I/home/drh/tcltk/tcl8.1.1/win \ -mno-cygwin \ -o tclstub.o \ -c /home/drh/tcltk/tcl8.1.1/generic/tclStubLib.c i586-cygwin32-gcc \ -I/home/drh/tcltk/tcl8.1.1/generic \ -I/home/drh/tcltk/tcl8.1.1/win \ -I/home/drh/tcltk/tk8.1.1/generic \ -I/home/drh/tcltk/tk8.1.1/win \ -I/home/drh/tcltk/tk8.1.1/xlib \ -mno-cygwin \ -o tkstub.o \ -c /home/drh/tcltk/tk8.1.1/generic/tkStubLib.c # Step 4: # Generate the DEF file # cat >simple.def <<\END EXPORTS Simple_Init END # Step 5: # Use dllwrap to build the DLL. Note: tclstub81.lib is copied out # of the binary tk8.1 distribution from Scriptics. # i586-cygwin32-dllwrap \ --def simple.def \ -v \ --driver-name i586-cygwin32-gcc \ --dlltool-name i586-cygwin32-dlltool \ --as i586-cygwin32-as \ --dllname simple.dll \ --target i386-mingw32 -mno-cygwin \ simple.o tclstub.o tkstub.o �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/spec.html����������������������������������������������������������������������000644 �000765 �000000 �00000063506 07504443344 016514� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<html> <!-- Specifications for the Tk HTML Widget $Revision: 1.1.1.1 $ Copyright (C) 1997, 1998, 1999 D. Richard Hipp This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Author Contact Information: drh@acm.org http://www.hwaci.com/drh/ @(#) $Id: spec.html,v 1.1.1.1 2002/06/20 21:19:32 joye Exp $ --> <head> <title>Interface Specification For The HTML Widget</title> </head> <body bgcolor=white> <h1>Interface Specification For The HTML Widget</h1> <p>This is a draft interface specification for the Tk HTML widget currently under development. Since it is still a draft, it is subject to change. Eventually, the interface will stabilize and this interface specification will morph into a manual page.</p> <h2>Configuration Options</h2> <table cellspacing=10> <tr><td valign=top><tt>-appletcommand</tt></td> <td> <p>This option specifies the name of the Tcl procedure to invoke when the <tt>&lt;applet&gt;...&lt;/applet&gt;</tt> tag sequence is seen. The html widget will append two arguments to the procedure before calling it. The first argument is the name of a widget that the callback should create to hold the applet. The second argument is a list of name/value pairs which are the arguments to the <tt>&lt;applet&gt;</tt> tag.</p> <p>The text between <tt>&lt;applet&gt</tt> and <tt>&lt;/applet&gt;</tt> is normally suppressed. However, if the <tt>-appletcommand</tt> option is set to the empty string, the <tt>&lt;applet&gt</tt> tag is ignored and all text between <tt>&lt;applet&gt;</tt> and <tt>&lt;/applet&gt;</tt> is displayed normally.</p> <p>"&lt;embed&gt;" is treated as an alias for "&lt;applet&gt;&lt;/applet&gt".</p> </td></tr> <tr><td valign=top><tt>-background</tt></td> <td> <p>The background color for the widget.</p> <p>Note that the <tt>&lt;body bgcolor=...&gt;</tt> HTML tag does not automatically cause the widget to change its background color. If you want the background color to change in response to this HTML tag, then your Tcl script should intercept the <tt>&lt;body&gt;</tt> tag using the ``<tt>token handler</tt>'' widget command (described below) and change the background color manually.</p> </td></tr> <tr><td valign=top><tt>-base</tt></td> <td> <p>The base URI for the current document. This should be set to the URI that was used to retrieve the document before parsing begins.</p> </td></tr> <tr><td valign=top><tt>-bd</tt><td>An alias for <tt>-borderwidth</tt> <tr><td valign=top><tt>-bg</tt><td>An alias for <tt>-background</tt> <tr><td valign=top><tt>-borderwidth</tt></td> <td> <p>The width of the 3-D border drawn around the parameter of the widget, in pixels.</p> </td></tr> <tr><td valign=top><tt>-cursor</tt></td> <td> <p>The cursor displayed when the pointer is positioned over the HTML widget. If {}, the cursor reverts to its default shape.</p> </td></tr> <tr><td valign=top><tt>-exportselection</tt></td> </tr> <tr><td valign=top><tt>-fontcommand</tt></td> <td> <p>The name of a TCL procedure that is used to convert HTML font names into TCL font names. A default built-in procedure is used if the value of this option is {}.</p> <p>When the HTML widget needs a new font, it calls this procedure with two arguments. This first argument is the font size expressed as an integer between 1 and 7. The standard size is 4. The second argument is a set of between 0 and 3 keywords drawn from the following set: "bold", "italic", and "fixed". If the "bold" keyword is present in the second argument, the font returned should be bold. If the "italic" keyword is present, the font should be italic. If the "fixed" keyword is present, the font should be fixed-width. The TCL procedure should return the name of the TCL font that the HTML widget will use to render the given HTML font. If the TCL procedure returns an empty string, then the built-in default procedure is used to determine the font.</p> <p>Examples: This is {4 {}}. <tt>This is {4 fixed}</tt>. <small>This is {3 {}}</small>. <large><tt><bold>This is {5 {fixed bold}} </bold></tt></large></p> </td></tr> <tr><td valign=top><tt>-fg</tt></td> <td>An alias for <tt>-foreground</tt>.</td> </tr> <tr><td valign=top><tt>-foreground</tt></td> <td> The default foreground color in which HTML text is rendered. The HTML can override this using the <tt>color=...</tt> attribute on various HTML tags. </td></tr> <tr><td valign=top> <code>-formcommand <var>string</var></code> </td><td> Declares a handler for everything to do with forms within a document. Arguments will be appended to <var>string</var> and the result evaluated during parsing (for form creation) and when the widget is cleared (for form cleanup). The first argument is a token for identifying a form. The second argument selects the action to perform. The remaining arguments depend on the action, as follows. <dl><dt><code><var>string token</var> form <var>URL method attrs</var></code> <dd>The handler should begin taking notes for form <var>token</var>, especially the (resolved) <var>URL</var> of the action and the <var>method</var> to be applied. The raw attributes of the FORM element are in the pairlist <var>attrs</var>. <dt><code><var>string token</var> flush</code> <dd>When the document is cleared, the widget will destroy all the windows it requested. This handler should clean up anything else it created for that form. <dt><code><var>string token</var> input <var>path attrs</var></code> <dd>The handler should create a window named <var>path</var> appropriate for the element described by the <var>attrs</var>. The widget will map the window into its rendering appropriately. <p>It is not an error for the handler to return without creating such a window (it's natural in the case of type=hidden); the widget simply ignores the element in that case. The attributes are the raw values in the HTML, with one exception; a <code>src</code> will be resolved before the handler is called. <dt><code><var>string token</var> textarea <var>path attrs initial</var></code> <dd>The handler should create a window (a single Text, or a Frame with Text and Scrollbars, or whatever) appropriate for a &lt;textarea&gt; and initialise it to the <var>initial</var> string. <dt><code><var>string token</var> select <var>path attrs choices initial</var></code> <dd><em>&lt;select&gt is quite a complicated case...</em> The handler should create a window appropriate for a &lt;select&gt; of the given attributes and present the list of <var>choices</var>. Each choice is a pair, the value and its label. <var>initial</var> is a list of values initially selected. <em>This approach is somewhat questionable but should do most of the time.</em> </dl> Caution: Be very careful to avoid confusing HTML variables with TCL variables. It may be tempting to use the <code>name</code> attribute fairly directly to link together related widgets, but it will likely cause incorrect behaviours. Also be careful to observe the order in which the elements are created; this determines the order in which they must be submitted. A default form handler with the correct bahaviour written in TCL will be bundled with the widget. <p>The attribute names will be downcased within <var>attrs</var>. </td></tr> <tr><td valign=top><tt>-framecommand</tt><td> The script specified by this option is invoked when the HTML parser encounters a <tt>&lt;frameset&gt;...&lt;/frameset&gt;</tt> tag sequence. The arguments to the script are TBD. If the value of the option is the empty string, then the text within the <tt>&lt;noframe&gt...&lt;/noframe&gt;</tt> tag sequence is displayed. <tr><td valign=top><tt>-height</tt><td> Specifies the height of the area into which HTML is rendered. This value plus twice the <tt>-padx</tt>, <tt>-borderwidth</tt> and <tt>-highlightthickness</tt> values is the total height of the widget. <tr><td valign=top><tt>-highlightbackground</tt><td> <tr><td valign=top><tt>-highlightcolor</tt><td> <tr><td valign=top><tt>-highlightthickness</tt><td> <tr><td valign=top><tt>-hyperlinkcommand</tt></td> <td> The script specified by this option is invoked whenever the user clicks on a hyperlink on the HTML page. Before invoking this script, the URI for the hyperlink is appended. </td></tr> <tr><td valign=top><tt>-imagecommand</tt></td> <td> When a ``<tt>&lt;img src=...&gt;</tt>'' tag is encountered, the HTML widget invokes the script specified by this option in order to get the name of a Tk image object to display the HTML image. Before invoking the script, the following arguments are appended: <ol> <li>The value of the <tt>src=...</tt> parameter after have been processed by the resolver. <li>The value of the <tt>width=...</tt> parameter. <li>The value of the <tt>height=...</tt> parameter. <li>A list containing the names and values of all parameters. </ol> If the name returned by this script is the empty string, or if the script is an empty string, then the HTML widget displays the <tt>alt=...</tt> text of the <tt>&lt;img&gt</tt> tag instead of an image. </td></tr> <tr><td valign=top><tt>-isvisitedcommand</tt><td> When the HTML widget encounters a hyperlink (``<tt>&lt;a href=...&gt;</tt>'') it invokes the script specified by this option in order to determine whether or not the hyperlink has been visited. This information is needed to determine what color to use to display the hyperlink. <tr><td valign=top><tt>-padx</tt><td> The amount of extra space to insert between the 3-D border and the left and right sides of the document text. <tr><td valign=top><tt>-pady</tt><td> The amount of extra space to insert between the 3-D border and the top and bottom of the document text. <tr><td valign=top><tt>-relief</tt><td> The relief used to draw the 3-D border. <tr><td valign=top><tt>-resolvercommand</tt></td> <td> <p>The name of a TCL command used to resolve URIs. If blank, a built-in resolver is used. If a TCL command is specified but it returns an empty string, the built-in resolver is used then too. The build-in resolver is based on the algorithm in section 5.2 of RFC 2396. </p> <p>Multiple URIs are appended to the TCL command before it is executed. The first URI is the BASE URI of the document (the URL that specified by the -base configuration option and updated according to any prior &lt;BASE&gt; markup). Zero or more additional URIs are appended to this base. The result of the script should be the resolution of the whole series or URIs.</p> </td></tr> <tr><td valign=top><tt>-rulerelief</tt></td> <td> <p>Determines the appearance of the Horizontal Rule (&lt;HR&gt) markup. The default is "sunken". This can also be "raised" or "flat". If "flat", then the &lt;HR&gt; is drawn using a solid line in the current foreground color. "groove" and "ridge" are the same as "flat".</p> </td></tr> <tr><td valign=top><tt>-scriptcommand</tt></td> <td> <p>Whenever &lt;SCRIPT&gt;...&lt;/SCRIPT&gt; markup is encountered in the input HTML, the attributes of the &lt;SCRIPT&gt; markup and the body of the script are appended to this string and the result is executed as a TCL command. If this options is the empty string, then the script is ignored. </td></tr> <tr><td valign=top><tt>-selectioncolor</tt><td> The background color used when drawing the selection. The foreground color for the selection is the same as the regular foreground color. <tr><td valign=top><tt>-tablerelief</tt></td> <td> <p>Determines the appearance of the borders around tables. The default is "raised". This can also be "sunken" or "flat". If "flat", then the borders is drawn using solid lines in the current foreground color. "groove" and "ridge" are the same as "flat".</p> </td></tr> <tr><td valign=top><tt>-takefocus</tt><td> <tr><td valign=top><tt>-unvisitedcolor</tt><td> The foreground color used to draw hyperlinks that have not been visited. <tr><td valign=top><tt>-underlinehyperlinks</tt><td> Set to TRUE to cause hyperlinks to be drawn using an underlined font. <tr><td valign=top><tt>-visitedcolor</tt><td> The foreground color used to draw hyperlinks that have been visited. <tr><td valign=top><tt>-width</tt><td> The width of the document text. This value does not include space allocated for <tt>-highlightthickness</tt>, <tt>-borderwiddth</tt> or <tt>-padx</tt>. <tr><td valign=top><tt>-xscrollcommand</tt><td> <tr><td valign=top><tt>-yscrollcommand</tt><td> </table> <h2>Indices</h2> Internally, the HTML widget stores the HTML document as a list of tokens. Each token is either <ul> <li>a contiguous sequence of non-space characters (Text), <li>a contiguous sequence of spaces, tabs or newlines (Space), <li>or an HTML markup tag (such as ``<tt>&lt;em&gt;</tt>''.) </ul> Tokens are identified by number. The first token is ``1'', the second is ``2'' and so forth. So in its simplest form, an index is just an integer greater than 0. <p> Within a single Text or Space token, individual characters are also identified by number, though the counting starts with 0 instead of 1. The character number is connected to the token number by a period. So, for example, the 4th character in the 9th token would be ``9.3''. <p> Two integers separated by a dot is called the <em>connonical</em> form of an index. Other index forms are available, including: <table cellspacing=10> <tr><td valign=top>end<td> The keyword ``end'' means one character past the last character of the last token. <tr><td valign=top>@X,Y<td> The character located at screen coordinates X,Y. <tr><td valign=top>*.last<td> The second integer can be replaced by the keyword ``last'' to mean the last character in the token. <tr><td valign=top>sel.first<td> This is the first character that is part of the selection. <tr><td valign=top>sel.last<td> This is the last character that is part of the selection. <tr><td valign=top>ins<td> The character immediately following the insertion cursor. </table> <h2>Commands</h2> <dl> <dt><b>html</b> <i>window</i> ?<i>options ...</i>?</dt><p> <dd> Create a new HTML widget instance named <i>windows</i> </dd> <p> <dt><b>html</b> <b>reformat</b> <i>from to text</i><p> <dd> Convert text from one encoding to another. The text is given in the <i>text</i> argument. The current encoding of the text is specified by the <i>from</i> argument. This command returns the same text in the <i>to</i> encoding. <p> <i>From</i> and <i>to</i> may be any of the following values: <p> <table cellspacing=10> <tr><td valign=top>plain</td> <td> Ordinary text with no characters escaped. </td></tr> <tr><td valign=top>http</td> <td> The text is encoded in a form suitable for use with the HTTP protocol. Spaces are converted to "+". Special characters and escaped as "%aa" where "a" is a hexadecimal digit. A special character is anything other than an alphanumeric or one of these: ".", "$", "-", or "_". </td></tr> <tr><td valign=top>url</td> <td> The text is encoded in a form suitable for use as a URI. Spaces are converted to "+". Special characters and escaped as "%aa" where "a" is a hexadecimal digit. A special character is anything other than an alphanumeric or one of these: ".", "$", "-", "_", or "/". </td></tr> <tr><td valign=top>html</td> <td> The text is encoded in a form suitable for use within HTML. "&amp;" is encoded as "&amp;amp;", "&lt;" is encoded as "&amp;lt;" and so forth. </td></tr> </table> <p> This command is intended to be useful to the TCL procedures that implement callbacks for the HTML widget. </dd> <p> <dt><b>html</b> <b>uri join</b> <i>scheme authority path query fragment</i><p> <dd> This command takes the five main components of a URI and joins them together into a complete URI. Special characters in any component are escaped. </dd> <p> <dt><b>html</b> <b>uri split</b> <i>uri</i><p> <dd> This command takes a single URI and splits it into its five major components: scheme, authorithy, path, query and fragement. The command returns a list where each component is an element of the list. Components missing from the URI are represented as empty elements in the list. </dd> </dl> <h2>Widget Commands</h2> <dl> <dt><i>WIDGET</i>&nbsp <tt>cget</tt> <i>config-option</i><p> <dd> Return the value of a configuration option. Works just like any other Tk widget. <p> <dt><i>WIDGET</i>&nbsp <tt>clear</tt><p> <dd> Remove all tokens and text from the HTML widget. The parser is reset to its initial state. This routine should be called to changes pages. <p> <dt><i>WIDGET</i>&nbsp <tt>configure</tt> ?<i>args...</i>?<p> <dd> The standard Tk configuration command. <p> <dt><i>WIDGET</i>&nbsp <tt>href</tt>&nbsp <i>X&nbsp Y</i><p> <dd>If the coordinates <i>X Y</i> define a point above a hyperlink, then this command will return the target URL for that hyperlink. The URL will be resolved using the -resolvercommand before it is returned. <p> <dt><i>WIDGET</i>&nbsp <tt>index</tt>&nbsp <i>INDEX&nbsp ?COUNT&nbsp UNITS?</i></p> <dd> Translates <i>INDEX</i> into its connonical form. The connonical form of an index is two integers separated by a period. <p> The optional 3rd and 4th arguments specify a displacement from <i>INDEX</i> to the value of the index returned. <i>COUNT</i> can be any integer value, including a negative number. <i>UNITS</i> must be either ``<tt>char</tt>'' or ``<tt>line</tt>''. <p> <dt><i>WIDGET</i>&nbsp <tt>insert</tt>&nbsp <i>INDEX</i><p> <dd> Causes the insertion cursor (a flashing vertical bar) to be positioned immediately before the character specified by <i>INDEX</i>. <p> <dt><i>WIDGET</i>&nbsp <tt>names</tt><p> <dd> This command causes the widget to scan the entire text of the document looking for tags of the form ``<tt>&lt;a name=...&gt;</tt>''. It returns a list of values of the <tt>name=...</tt> fields. <p> The vertical position of the document can be moved to any of these names using the ``<i>WIDGET</i> <tt>yview</tt> <i>NAME</i>'' command described below. <p> <dt><i>WIDGET</i>&nbsp <tt>parse</tt>&nbsp <i>HTML-TEXT</i><p> <dd>Adds the given HTML text to the end of any text previously received through the <tt>parse</tt> command and parses as much of the text as possible into tokens. Afterwards, the display is updated to show the new tokens, if they are visible.<p> <dt><i>WIDGET</i>&nbsp; <tt>resolver</tt>&nbsp; ?<i>uri ...</i>?<p> <dd>The resolver specified by the -resolvercommand option is called with the base URI of the document followed by the remaining arguments to this commant. The result of this command is the result of the -resolvercommand script.<p> <dt><i>WIDGET</i>&nbsp <tt>selection</tt>&nbsp <i>subcommand args...</i><p> <dd>The selection widget command is used to control the selection.<p> <dl> <dt><i>WIDGET</i>&nbsp <tt>selection clear</tt><p> <dd>Clear the current selection. No text will be selected after this command executes.<p> <dt><i>WIDGET</i>&nbsp <tt>selection set</tt>&nbsp <i>START&nbsp END</i><p> <dd>Change the selection to be all text contained within the given indices.<p> </dl> <p> <dt><i>WIDGET</i>&nbsp <tt>text</tt>&nbsp <i>subcommand args...</i><p> <dd>There are several token commands. They all have the common property that they directly manipulate the text that is displayed. These commands (none of which are currently implemented) can be used to build an WYSIWYG editor for HTML.<p> <dl> <dt><i>WIDGET</i>&nbsp; <tt>text ascii</tt>&nbsp <i>INDEX-1&nbsp INDEX-2</i><p> <dd><p> Returns plain ASCII text that represents all characters between <i>INDEX-1</i> and <i>INDEX-2</i>. Formatting tags are omitted. The <i>INDEX-1</i> character is included by <i>INDEX-2</i> is omitted. <p> <dt><i>WIDGET</i>&nbsp; <tt>text delete</tt>&nbsp <i>INDEX-1&nbsp INDEX-2</i><p> <dd><p> All text from <i>INDEX-1</i> up to, but not including <i>INDEX-2</i> is removed and the display is updated accordingly. <p> <dt><i>WIDGET</i>&nbsp; <tt>text html</tt>&nbsp <i>INDEX-1&nbsp INDEX-2</i><p> <dd><p> Returns HTML text that represents all characters and formatting tags between <i>INDEX-1</i> and <i>INDEX-2</i>. The <i>INDEX-1</i> character is included by <i>INDEX-2</i> is omitted. <p> <dt><i>WIDGET</i>&nbsp; <tt>text insert</tt>&nbsp <i>INDEX&nbsp TEXT</i><p> <dd><p> Inserts one or more characters immediately before the character whose index is given. <p> </dl> <dt><i>WIDGET</i>&nbsp <tt>token</tt>&nbsp <i>subcommand args...</i><p> <dd>There are several token commands. They all have the common property that they involve the list of tokens into which the HTML is parsed.<p> Some of the following subcommands make use of indices. The character number of these indices is ignored since these commands deal only with whole tokens. <p> <dl> <dt><i>WIDGET</i>&nbsp; <tt>token append</tt>&nbsp; <i>TAG&nbsp; ARGUMENTS</i><p> <dd> The command causes a token to be appended to the current list of tokens in the HTML widget. This command is typically used within a token handler. <p> <dt><i>WIDGET</i>&nbsp; <tt>token delete</tt>&nbsp; <i>INDEX&nbsp ?INDEX-2?</i><p> <dd> Deletes the single token indentified by the index. If a second index is given, the range of tokens from the first to the second index inclusive is deleted. <p> <dt><i>WIDGET</i>&nbsp; <tt>token find</tt>&nbsp; <i>TAG</i><p> <dd> Locates all tokens with the given <i>TAG</i> and returns them all as a list. Each element of the returned list is a sublist containing the index for the token and the arguments for the token. <p> <dt><i>WIDGET</i>&nbsp; <tt>token get</tt>&nbsp; <i>INDEX&nbsp ?INDEX-2?</i><p> <dd> Returns a list of tokens in the range of <i>INDEX</i> through <i>INDEX-2</i>. Each element of the list consists of the token tag followed by the token arguments. <p> <dt><i>WIDGET</i>&nbsp; <tt>token handler</tt>&nbsp; <i>TAG&nbsp; ?SCRIPT?</i><p> <dd> This command allows special processing to occur for selected tokens in the HTML input stream. The <i>TAG</i> argument is either ``Text'' or ``Space'' or the name of an HTML tag (ex: ``H3'' or ``/A''). If a non-empty script is specified for a particular tag, then when instances of that tag are encountered by the parser, the parser calls the corresponding script instead of appending the token to the end of the token list. Before calling the script, three arguments are appended: <ol> <li>The token number. <li>The tag. (ex: <tt>H3</tt>) <li>A list of name/value pairs describing all arguments to the tag. </ol> An empty handler script causes the default processing to occur for the tag. If the script argument is omitted all together, then the current value of the token handler for the given tag is returned. <p> Only one handler may be defined for each token type. If a new handler is specified for a token type that previously had a different handler defined, then the old handler is overwritten by the new. <p> <dt><i>WIDGET</i>&nbsp; <tt>token insert</tt>&nbsp; <i>INDEX&nbsp TAG&nbsp ARGUMENTS</i><p> <dd> Inserts a single token given by <i>TAG</i> and <i>ARGUMENTS</i> into the token list immediately before <i>INDEX</i>. <p> </dl> <p> <dt><i>WIDGET</i>&nbsp; <tt>xview</tt>&nbsp; <i>args...</i><p> <dd>Used to control horizontal scrolling.<p> <dl> <dt><i>WIDGET</i>&nbsp <tt>xview</tt><p> <dd>Returns a list containing two elements. The elements are a fractions between 0.0 and 1.0 that define the position of the left and right edges of the visible part of the document as a fraction of the whole.<p> <dt><i>WIDGET</i>&nbsp <tt>xview moveto</tt>&nbsp <i>FRACTION</i><p> <dd>Adjusts the horizontal position of the document so that <i>FRACTION</i> of the horizontal span of the document is off-screen to the left.<p> <dt><i>WIDGET</i>&nbsp <tt>xview scroll</i>&nbsp <i>NUMBER&nbsp WHAT</i><p> <dd> Shifts the view in the window left or right according to <i>NUMBER</i> and <i>WHAT</i>.&nbsp&nbsp <i>NUMBER</i> is an integer and <i>WHAT</i> is either <tt>units</tt> or <tt>pages</tt>.<p> </dl> <dt><i>WIDGET</i>&nbsp <tt>yview</tt>&nbsp; <i>args...</i><p> <dd>Used to control the vertical position of the document.<p> <dl> <dt><i>WIDGET</i>&nbsp <tt>yview</tt><p> <dd>Returns a list containing two elements. The elements are a fractions between 0.0 and 1.0 that define the position of the top and bottom edges of the visible part of the document as a fraction of the whole.<p> <dt><i>WIDGET</i>&nbsp <tt>yview</tt>&nbsp <i>NAME</i><p> <dd>Adjusts the vertical position of the document so that the tag ``<tt>&lt;a name=</tt><i>NAME</i><tt>&gt;</tt>'' is on screen, and preferably near the top of the screen.<p> <dt><i>WIDGET</i>&nbsp <tt>yview moveto</tt>&nbsp <i>FRACTION</i><p> <dd>Adjusts the horizontal position of the document so that <i>FRACTION</i> of the vertical span of the document is off-screen above the visible region.<p> <dt><i>WIDGET</i>&nbsp <tt>xview scroll</i>&nbsp; <i>NUMBER&nbsp; WHAT</i><p> <dd> Shifts the view in the window up or down according to <i>NUMBER</i> and <i>WHAT</i>.&nbsp&nbsp <i>NUMBER</i> is an integer and <i>WHAT</i> is either <tt>units</tt> or <tt>pages</tt>.<p> </dl> </dl> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/webpage/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602245 016271� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tkhtml1.0/doc/webpage/mkwebpage.tcl����������������������������������������������������������000644 �000765 �000000 �00000013471 07504443354 020751� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/tclsh # # Construct the web page for tkhtml # # @(#) $Id: mkwebpage.tcl,v 1.1.1.1 2002/06/20 21:19:40 joye Exp $ # set p [open publish.sh w] puts $p "#!/bin/sh" puts $p "#" set SendList {} set f [open index.html w] puts $f { <html> <head> <title>An HTML Widget for Tcl/Tk</title> </head> <body bgcolor=white> <h1 align=center>An HTML Widget For Tcl/Tk</h1> } puts $f "<p align=center><i>Last update: [clock format [clock seconds]]</i></p>" puts $f { <p>"Tkhtml" is a Tcl/Tk widget that displays HTML. Tkhtml is implemented in C. It is a true widget, not a metawidget implemented using the Text or Canvas widgets of the Tcl/Tk core. Implementing Tkhtml in C gives it a number of advantages:</p> <p> <ul> <li> It runs fast and uses little memory.</li> <li> It supports smooth scrolling.</li> <li> It supports text wrap-around on images and tables.</li> <li> It has a full implementation of tables. Complex pages (such as <a href="http://www.scriptics.com/">http://www.scriptics.com/</a>) are displayed correctly.</li> <li> Supports forms. </li> <li> It supports the &lt;APPLET&gt;, &lt;SCRIPT&gt; and &lt;EMBED&gt;. (Partially. Full support is pending.) </li> <li> Support for frames is planned. </li> </ul> </p> <p>Tkhtml can be used with Tcl/Tk8.0 or later. The shared libraries use the new stubs mechanism, so you should be able to load Tkhtml with any version of "wish" beginning with 8.0.6.</p> <p>At the moment, there is not a lot of software that uses this widget. Tkhtml is not an application in and of itself. It is only a tool. But applications are being built around tkhtml. Check back later for new developments.</p> <h2>Mailing List!</h2> <p><font color=red><b><i>New!</i></b></font> A mailing list has been started for users of tkhtml. Sign up if you want to recieve notifications of updates or ask questions about using tkhtml.</p> <form method=GET action="http://www.egroups.com/subscribe"> <input type=hidden name="listname" value="tkhtml"> <input type=hidden name="SubmitAction" value="Subscribe"> <p>Enter your e-mail address below and click the button to sign up for the tkhtml mailing list:</p> <p> <table cellspacing=10> <tr><td valign=center> <input type=text name="emailaddr" value="your e-mail" size=21> </td><td valign=center> <input type=image border=0 alt="Click here to join tkhtml" name="Click here to join tkhtml" SRC="http://www.egroups.com/oems/default/languages/english/images/subscriptionBoxButton.gif"> </td></tr> </table> </p> <p>You can also view the <a href="http://www.egroups.com/group/tkhtml/">archives</a> for the mailing list. To post to this mailing list, send a message to <a href="mailto:tkhtml@eGroups.com">tkhtml@eGroups.com</a>. The mailing list is hosted by <a href="http://www.egroups.com/">eGroups.com</A> </p> </form> <h2>You Can Help!</h2> <p>If you would like to help, please consider contributing in the following ways:</p> <p> <ul> <li> Try out tkhtml on your computer and report bugs to <a href="mailto:drh@acm.org">drh@acm.org</a>. </li> <li> Fix bugs and send in patches. (Write access to the CVS repository may be granted to anyone who is serious about this.)</li> <li> Make suggestions for new features. </li> <li> Write applications that use tkhtml. </li> <li> Improve the documentation. </li> </ul> </p> <p>Any help you can provide is appreciated.</p> <h2>Getting The Widget</h2> <p>Visit the <a href="download.html">download</a> page for a list of files available for immediate download.</p> <p>You can now also obtain the latest tkhtml sources via anonymous CVS. To access the anonymous CVS server, first install CVS on your system. (See <a href="http://www.cyclic.com/">http://www.cyclic.com/</a> for additional information.) Then login as follows:</p> <blockquote><pre> cvs -d :pserver:cvs@xoli.dyn.dhs.org:/home/cvs/cvsroot login </pre></blockquote> <p>You will be prompted for a password. Use "<tt>cvs</tt>". After you get logged in successfully, you can check out the source tree like this:</p> <blockquote><pre> cvs -d :pserver:cvs@xoli.dyn.dhs.org:/home/cvs/cvsroot checkout htmlwidget </pre></blockquote> <p>This command creates a directory named "<tt>htmlwidget</tt>" and fills it with the latest version of the sources.</p> </body> </html> } close $f lappend SendList index.html set f [open download.html w] puts $f { <html> <head> <title>TkHtml Download Page</title> </head> <body bgcolor=white> <h1 align=center>TkHtml Download Page</h1> } puts $f "<p align=center><i>Last update: [clock format [clock seconds]]</i></p>" puts $f { <p>The files shown below are available for download. For the very latest sources, visit the anonymous CVS server. Instructions for reaching the anonymous CVS server are on the tkhtml <a href="index.html">homepage</a>.</p> <ul> } foreach {file desc} { tkhtml.tar.gz {A tarball containing all the latest source code} hv.tcl.gz {The "Html Viewer" example application} spec.html {A raw specification of how the tkhtml widget works} tkhtml.so.gz {Shared library suitable for use on Linux} tkhtml.dll.zip {A DLL suitable for use on Windows95/98/NT/2K} } { if {![file readable $file]} continue lappend SendList $file puts $f "<li><p><a href=\"$file\">$file</a><br>" puts $f "Description: $desc<br>" puts $f "Size: [file size $file] bytes<br>" puts $f "Last modified: [clock format [file mtime $file]]" switch -glob -- $file { *.zip - *.gz {set access zcat} default {set access cat} } if {![catch {exec $access $file | ident | grep {$Id: }} ident]} { puts $f "<br>Version information:" puts $f "<pre>\n$ident</pre>" } puts $f "</p></li>\n" } puts $f { </ul> <p><a href="index.html">Back</a> to the tkhtml home page</p> </body> </html> } close $f lappend SendList download.html puts $p "scp [lsort $SendList] hwaci@oak.he.net:public_html/sw/tkhtml" close $p �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/align.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000002050 12131345054 015152� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** align.sh ***" ds9 -scale mode 98 data/r.fits data/i.fits data/v.fits -match frames wcs -single ds9 -zscale -mosaicimage iraf mosaic/megacam.fits -mosaicimage wcs mosaic/megacam.fits -single ds9 -zscale -mosaic wcs mosaic/megacam.fits[1] mosaic/megacam.fits[2] mosaic/megacam.fits[3] -rgb -red mosaic/megacam.fits[1] -green mosaic/megacam.fits[2] -blue mosaic/megacam.fits[3] -single ds9 -zscale -mosaic wcs data/m51hst.fits data/img.fits -fits -rgb -red data/m51hst.fits -green data/img.fits -single ds9 -zscale data/ch4.nonan.fits data/mips24.nonan.fits -frame new -mosaic wcs data/ch4.nonan.fits data/mips24.nonan.fits -frame new rgb -fits -red data/ch4.nonan.fits -green data/mips24.nonan.fits -frame 1 -pan to 17:42:56.836 -28:31:53.10 fk5 -match frames wcs -single ds9 -mosaicimage iraf mosaic/ds9_2amp.fits -mosaicimage wcs mosaic/ds9_2amp.fits -fits -rgb -red mosaic/ds9_2amp.fits[1] -green mosaic/ds9_2amp.fits[2] -single ds9 -mosaicimage iraf mosaic/ds9_8amp_2x2.fits -mosaicimage wcs mosaic/ds9_8amp_2x2.fits -single echo "Done" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/all.sh���������������������������������������������������������������������������������000755 �000765 �000000 �00000000325 12360033771 014637� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#io.sh #xpa.sh #command.sh #samp.sh parse.sh compress.sh crop.sh regions.sh regions3d.sh plot.sh scale.sh lock.sh prefs.sh matrix.sh align.sh wcs.sh wcs2.sh #vo.sh xpa vo.sh mime print.sh backup.sh analysis.sh �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis/������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 015353� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000006527 12614503526 015726� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** analysis.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ] then ds9& fi i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done # load default xpaset -p ds9 scale zscale xpaset -p ds9 fits data/img.fits xpaset -p ds9 regions file analysis/analysis.reg xpaset -p ds9 analysis clear xpaset -p ds9 analysis load analysis/analysis.ans # Main if [ "$1" = "help" -o -z "$1" ]; then echo "$j Help" xpaset -p ds9 analysis 0 fi # Web if [ "$1" = "web" -o -z "$1" ]; then echo "$j Web" xpaset -p ds9 analysis 1 echo "..$j web url" xpaset -p ds9 analysis 2 echo "..$j web file" xpaset -p ds9 analysis 3 fi # Basics if [ "$1" = "basics" -o -z "$1" ]; then echo "Basic" xpaset -p ds9 analysis 4 echo "..$j escape macro" xpaset -p ds9 analysis 5 echo "..$j non macro" xpaset -p ds9 analysis 6 echo "..$j \$xpa" xpaset -p ds9 analysis 7 echo "..$j \$xpa_method" xpaset -p ds9 analysis 8 echo "..$j \$vo_method" xpaset -p ds9 analysis 9 echo "..$j \$filename" xpaset -p ds9 analysis 10 echo "..$j \$filename(root)" xpaset -p ds9 analysis 11 echo "..$j \$filename(full)" xpaset -p ds9 analysis 12 echo "..$j \$filedialog(open)" xpaset -p ds9 analysis 13 echo "..$j \$filename(save)" xpaset -p ds9 analysis 14 echo "..$j \$width $height $depth $bitpix" xpaset -p ds9 analysis 15 echo "..$j \$pan" xpaset -p ds9 analysis 16 echo "..$j \$env" xpaset -p ds9 analysis 17 fi # Regions if [ "$1" = "regions" -o -z "$1" ]; then echo "$j Regions" xpaset -p ds9 analysis 18 echo "..$j \$regions" xpaset -p ds9 analysis 19 echo "..$j \$regions wcs" xpaset -p ds9 analysis 20 echo "..$j \$jnclude_regions_pixels" xpaset -p ds9 analysis 21 echo "..$j \$filename $regions" xpaset -p ds9 analysis 22 echo "..$j \$regions()" xpaset -p ds9 analysis 23 fi # Output if [ "$1" = "output" -o -z "$1" ]; then echo "$j Output" xpaset -p ds9 analysis 24 echo "..$j \$null" xpaset -p ds9 analysis 25 echo "..$j \$text" xpaset -p ds9 analysis 26 echo "..$j \$plot" xpaset -p ds9 analysis 27 echo "..$j \$plot(title,x,y,xyey)" xpaset -p ds9 analysis 28 echo "..$j \$plot(title,x,y,xyexey)" xpaset -p ds9 analysis 29 echo "..$j \$plot(title,x,y,4)" xpaset -p ds9 analysis 30 echo "..$j \$plot(title,x,y,5)" xpaset -p ds9 analysis 31 echo "..$j \$plot(stdin)" xpaset -p ds9 analysis 32 echo "..$j \$plot(stdin) text" xpaset -p ds9 analysis 33 echo "..$j \$plot(stdin) error" xpaset -p ds9 analysis 34 echo "..$j \$data" xpaset -p ds9 analysis 35 echo "..$j \$jmage" xpaset -p ds9 analysis 36 echo "..$j \$jmage(3d)" xpaset -p ds9 analysis 37 fi # Dialogs if [ "$1" = "dialogs" -o -z "$1" ]; then echo "$j Dialog" xpaset -p ds9 analysis 38 echo "..$j \$message(message)" xpaset -p ds9 analysis 39 echo "..$j \$message(ok,message)" xpaset -p ds9 analysis 40 echo "..$j \$entry(message)" xpaset -p ds9 analysis 41 fi # Params if [ "$1" = "params" -o -z "$1" ]; then echo "$j Param" xpaset -p ds9 analysis 42 echo "..$j \$param" xpaset -p ds9 analysis 43 echo "..$j \$param @file" xpaset -p ds9 analysis 44 fi # Network if [ "$1" = "network" -o -z "$1" ]; then echo "$j Network" xpaset -p ds9 analysis 45 echo "..$j \$url(http://)" xpaset -p ds9 analysis 46 fi echo "PASSED" # Other if [ "$1" = "other" -o -z "$1" ]; then xpaset -p ds9 analysis message {press 'x','y','z' to test interactive} fi echo "Done" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/array.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000042605 12131345761 015215� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } DoXPA () { echo "$1" xpaset -p ds9 array $2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdin () { echo "$1" cat $2 | xpaset ds9 array $3 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdout () { echo "$1" xpaset -p ds9 tile xpaset -p ds9 array $2 xpaget ds9 array $3 > foo.arr xpaset -p ds9 frame new xpaset -p ds9 array foo.arr$4 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear } initit () { echo "Testing $1" unset opt } testit () { opt="$opt -export array foo.arr $1 -sleep .1" opt="$opt -frame new -array foo.arr$2" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" } doit () { eval ds9 -tile -array $1 "$opt" -exit echo "PASSED" } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** array.sh ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command File" echo ".. char" ds9 -array array/char.arr[dim=256,bitpix=8] & KillIt echo ".. char gzip" ds9 -array array/char.arr.gz[dim=256,bitpix=8] & KillIt echo ".. short little" ds9 -array array/short_little.arr[dim=256,bitpix=16,arch=little] & KillIt echo ".. short little gzip" ds9 -array array/short_little.arr.gz[dim=256,bitpix=16,arch=little] & KillIt echo ".. short big" ds9 -array array/short_big.arr[dim=256,bitpix=16,arch=big] & KillIt echo ".. short big gzip" ds9 -array array/short_big.arr.gz[dim=256,bitpix=16,arch=big] & KillIt echo ".. ushort little" ds9 -array array/ushort_little.arr[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" ds9 -array array/ushort_little.arr.gz[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort big" ds9 -array array/ushort_big.arr[dim=256,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" ds9 -array array/ushort_big.arr.gz[dim=256,bitpix=-16,arch=big] & KillIt echo ".. int little" ds9 -array array/int_little.arr[dim=256,bitpix=32,arch=little] & KillIt echo ".. int little gzip" ds9 -array array/int_little.arr.gz[dim=256,bitpix=32,arch=little] & KillIt echo ".. int big" ds9 -array array/int_big.arr[dim=256,bitpix=32,arch=big] & KillIt echo ".. int big gzip" ds9 -array array/int_big.arr.gz[dim=256,bitpix=32,arch=big] & KillIt echo ".. longlong little" ds9 -array array/longlong_little.arr[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" ds9 -array array/longlong_little.arr.gz[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong big" ds9 -array array/longlong_big.arr[dim=256,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" ds9 -array array/longlong_big.arr.gz[dim=256,bitpix=64,arch=big] & KillIt echo ".. float little" ds9 -array array/float_little.arr[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" ds9 -array array/float_little.arr.gz[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float big" ds9 -array array/float_big.arr[dim=256,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" ds9 -array array/float_big.arr.gz[dim=256,bitpix=-32,arch=big] & KillIt echo ".. double little" ds9 -array array/double_little.arr[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" ds9 -array array/double_little.arr.gz[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double big" ds9 -array array/double_big.arr[dim=256,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" ds9 -array array/double_big.arr.gz[dim=256,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Command Stdin" echo ".. char" cat array/char.arr | ds9 -array -[dim=256,bitpix=8] & KillIt echo ".. char gzip" cat array/char.arr.gz | ds9 -array -[dim=256,bitpix=8] & KillIt echo ".. short little" cat array/short_little.arr | ds9 -array -[dim=256,bitpix=16,arch=little] & KillIt echo ".. short little gzip" cat array/short_little.arr.gz | ds9 -array -[dim=256,bitpix=16,arch=little] & KillIt echo ".. short big" cat array/short_big.arr | ds9 -array -[dim=256,bitpix=16,arch=big] & KillIt echo ".. short big gzip" cat array/short_big.arr.gz | ds9 -array -[dim=256,bitpix=16,arch=big] & KillIt echo ".. ushort little" cat array/ushort_little.arr | ds9 -array -[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" cat array/ushort_little.arr.gz | ds9 -array -[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort big" cat array/ushort_big.arr | ds9 -array -[dim=256,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" cat array/ushort_big.arr.gz | ds9 -array -[dim=256,bitpix=-16,arch=big] & KillIt echo ".. int little" cat array/int_little.arr | ds9 -array -[dim=256,bitpix=32,arch=little] & KillIt echo ".. int little gzip" cat array/int_little.arr.gz | ds9 -array -[dim=256,bitpix=32,arch=little] & KillIt echo ".. int big" cat array/int_big.arr | ds9 -array -[dim=256,bitpix=32,arch=big] & KillIt echo ".. int big gzip" cat array/int_big.arr.gz | ds9 -array -[dim=256,bitpix=32,arch=big] & KillIt echo ".. longlong little" cat array/longlong_little.arr | ds9 -array -[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" cat array/longlong_little.arr.gz | ds9 -array -[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong big" cat array/longlong_big.arr | ds9 -array -[dim=256,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" cat array/longlong_big.arr.gz | ds9 -array -[dim=256,bitpix=64,arch=big] & KillIt echo ".. float little" cat array/float_little.arr | ds9 -array -[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" cat array/float_little.arr.gz | ds9 -array -[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float big" cat array/float_big.arr | ds9 -array -[dim=256,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" cat array/float_big.arr.gz | ds9 -array -[dim=256,bitpix=-32,arch=big] & KillIt echo ".. double little" cat array/double_little.arr | ds9 -array -[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" cat array/double_little.arr.gz | ds9 -array -[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double big" cat array/double_big.arr | ds9 -array -[dim=256,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" cat array/double_big.arr.gz | ds9 -array -[dim=256,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # export if [ "$1" = "export" -o -z "$1" ]; then echo "Testing Command export" initit ".. char" testit little [dim=256,bitpix=8] doit array/char.arr[dim=256,bitpix=8] initit ".. short little little" testit little [dim=256,bitpix=16,arch=little] doit array/short_little.arr[dim=256,bitpix=16,arch=little] initit ".. short little big" testit big [dim=256,bitpix=16,arch=big] doit array/short_little.arr[dim=256,bitpix=16,arch=little] initit ".. short big little" testit little [dim=256,bitpix=16,arch=little] doit array/short_big.arr[dim=256,bitpix=16,arch=big] initit ".. short big big" testit big [dim=256,bitpix=16,arch=big] doit array/short_big.arr[dim=256,bitpix=16,arch=big] initit ".. ushort little little" testit little [dim=256,bitpix=-16,arch=little] doit array/ushort_little.arr[dim=256,bitpix=-16,arch=little] initit ".. ushort little big" testit big [dim=256,bitpix=-16,arch=big] doit array/ushort_little.arr[dim=256,bitpix=-16,arch=little] initit ".. ushort big little" testit little [dim=256,bitpix=-16,arch=little] doit array/ushort_big.arr[dim=256,bitpix=-16,arch=big] initit ".. ushort big big" testit big [dim=256,bitpix=-16,arch=big] doit array/ushort_big.arr[dim=256,bitpix=-16,arch=big] initit ".. int little little" testit little [dim=256,bitpix=32,arch=little] doit array/int_little.arr[dim=256,bitpix=32,arch=little] initit ".. int little big" testit big [dim=256,bitpix=32,arch=big] doit array/int_little.arr[dim=256,bitpix=32,arch=little] initit ".. int big little" testit little [dim=256,bitpix=32,arch=little] doit array/int_big.arr[dim=256,bitpix=32,arch=big] initit ".. int big big" testit big [dim=256,bitpix=32,arch=big] doit array/int_big.arr[dim=256,bitpix=32,arch=big] initit ".. longlong little little" testit little [dim=256,bitpix=64,arch=little] doit array/longlong_little.arr[dim=256,bitpix=64,arch=little] initit ".. longlong little big" testit big [dim=256,bitpix=64,arch=big] doit array/longlong_little.arr[dim=256,bitpix=64,arch=little] initit ".. longlong big little" testit little [dim=256,bitpix=64,arch=little] doit array/longlong_big.arr[dim=256,bitpix=64,arch=big] initit ".. longlong big big" testit big [dim=256,bitpix=64,arch=big] doit array/longlong_big.arr[dim=256,bitpix=64,arch=big] initit ".. float little little" testit little [dim=256,bitpix=-32,arch=little] doit array/float_little.arr[dim=256,bitpix=-32,arch=little] initit ".. float little big" testit big [dim=256,bitpix=-32,arch=big] doit array/float_little.arr[dim=256,bitpix=-32,arch=little] initit ".. float big little" testit little [dim=256,bitpix=-32,arch=little] doit array/float_big.arr[dim=256,bitpix=-32,arch=big] initit ".. float big big" testit big [dim=256,bitpix=-32,arch=big] doit array/float_big.arr[dim=256,bitpix=-32,arch=big] initit ".. double little little" testit little [dim=256,bitpix=-64,arch=little] doit array/double_little.arr[dim=256,bitpix=-64,arch=little] initit ".. double little big" testit big [dim=256,bitpix=-64,arch=big] doit array/double_little.arr[dim=256,bitpix=-64,arch=little] initit ".. double big little" testit little [dim=256,bitpix=-64,arch=little] doit array/double_big.arr[dim=256,bitpix=-64,arch=big] initit ".. double big big" testit big [dim=256,bitpix=-64,arch=big] doit array/double_big.arr[dim=256,bitpix=-64,arch=big] fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 DoXPA ".. char" array/char.arr[dim=256,bitpix=8] DoXPA ".. char gzip" array/char.arr.gz[dim=256,bitpix=8] DoXPA ".. short little" array/short_little.arr[dim=256,bitpix=16,arch=little] DoXPA ".. short little gzip" array/short_little.arr.gz[dim=256,bitpix=16,arch=little] DoXPA ".. short big" array/short_big.arr[dim=256,bitpix=16,arch=big] DoXPA ".. short big gzip" array/short_big.arr.gz[dim=256,bitpix=16,arch=big] DoXPA ".. ushort little" array/ushort_little.arr[dim=256,bitpix=-16,arch=little] DoXPA ".. ushort little gzip" array/ushort_little.arr.gz[dim=256,bitpix=-16,arch=little] DoXPA ".. ushort big" array/ushort_big.arr[dim=256,bitpix=-16,arch=big] DoXPA ".. ushort big gzip" array/ushort_big.arr.gz[dim=256,bitpix=-16,arch=big] DoXPA ".. int little" array/int_little.arr[dim=256,bitpix=32,arch=little] DoXPA ".. int little gzip" array/int_little.arr.gz[dim=256,bitpix=32,arch=little] DoXPA ".. int big" array/int_big.arr[dim=256,bitpix=32,arch=big] DoXPA ".. int big gzip" array/int_big.arr.gz[dim=256,bitpix=32,arch=big] DoXPA ".. longlong little" array/longlong_little.arr[dim=256,bitpix=64,arch=little] DoXPA ".. longlong little gzip" array/longlong_little.arr.gz[dim=256,bitpix=64,arch=little] DoXPA ".. longlong big" array/longlong_big.arr[dim=256,bitpix=64,arch=big] DoXPA ".. longlong big gzip" array/longlong_big.arr.gz[dim=256,bitpix=64,arch=big] DoXPA ".. float little" array/float_little.arr[dim=256,bitpix=-32,arch=little] DoXPA ".. float little gzip" array/float_little.arr.gz[dim=256,bitpix=-32,arch=little] DoXPA ".. float big" array/float_big.arr[dim=256,bitpix=-32,arch=big] DoXPA ".. float big gzip" array/float_big.arr.gz[dim=256,bitpix=-32,arch=big] DoXPA ".. double little" array/double_little.arr[dim=256,bitpix=-64,arch=little] DoXPA ".. double little gzip" array/double_little.arr.gz[dim=256,bitpix=-64,arch=little] DoXPA ".. double big" array/double_big.arr[dim=256,bitpix=-64,arch=big] DoXPA ".. double big gzip" array/double_big.arr.gz[dim=256,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi # XPA if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 DoXPAStdin ".. char" array/char.arr [dim=256,bitpix=8] DoXPAStdin ".. char gzip" array/char.arr.gz [dim=256,bitpix=8] DoXPAStdin ".. short little" array/short_little.arr [dim=256,bitpix=16,arch=little] DoXPAStdin ".. short little gzip" array/short_little.arr.gz [dim=256,bitpix=16,arch=little] DoXPAStdin ".. short big" array/short_big.arr [dim=256,bitpix=16,arch=big] DoXPAStdin ".. short big gzip" array/short_big.arr.gz [dim=256,bitpix=16,arch=big] DoXPAStdin ".. ushort little" array/ushort_little.arr [dim=256,bitpix=-16,arch=little] DoXPAStdin ".. ushort little gzip" array/ushort_little.arr.gz [dim=256,bitpix=-16,arch=little] DoXPAStdin ".. ushort big" array/ushort_big.arr [dim=256,bitpix=-16,arch=big] DoXPAStdin ".. ushort big gzip" array/ushort_big.arr.gz [dim=256,bitpix=-16,arch=big] DoXPAStdin ".. int little" array/int_little.arr [dim=256,bitpix=32,arch=little] DoXPAStdin ".. int little gzip" array/int_little.arr.gz [dim=256,bitpix=32,arch=little] DoXPAStdin ".. int big" array/int_big.arr [dim=256,bitpix=32,arch=big] DoXPAStdin ".. int big gzip" array/int_big.arr.gz [dim=256,bitpix=32,arch=big] DoXPAStdin ".. longlong little" array/longlong_little.arr [dim=256,bitpix=64,arch=little] DoXPAStdin ".. longlong little gzip" array/longlong_little.arr.gz [dim=256,bitpix=64,arch=little] DoXPAStdin ".. longlong big" array/longlong_big.arr [dim=256,bitpix=64,arch=big] DoXPAStdin ".. longlong big gzip" array/longlong_big.arr.gz [dim=256,bitpix=64,arch=big] DoXPAStdin ".. float little" array/float_little.arr [dim=256,bitpix=-32,arch=little] DoXPAStdin ".. float little gzip" array/float_little.arr.gz [dim=256,bitpix=-32,arch=little] DoXPAStdin ".. float big" array/float_big.arr [dim=256,bitpix=-32,arch=big] DoXPAStdin ".. float big gzip" array/float_big.arr.gz [dim=256,bitpix=-32,arch=big] DoXPAStdin ".. double little" array/double_little.arr [dim=256,bitpix=-64,arch=little] DoXPAStdin ".. double little gzip" array/double_little.arr.gz [dim=256,bitpix=-64,arch=little] DoXPAStdin ".. double big" array/double_big.arr [dim=256,bitpix=-64,arch=big] DoXPAStdin ".. double big gzip" array/double_big.arr.gz [dim=256,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 DoXPAStdout ".. char" array/char.arr[dim=256,bitpix=8] little [dim=256,bitpix=8] DoXPAStdout ".. short little little" array/short_little.arr[dim=256,bitpix=16,arch=little] little [dim=256,bitpix=16,arch=little] DoXPAStdout ".. short little big" array/short_little.arr[dim=256,bitpix=16,arch=little] big [dim=256,bitpix=16,arch=big] DoXPAStdout ".. short big little" array/short_big.arr[dim=256,bitpix=16,arch=big] little [dim=256,bitpix=16,arch=little] DoXPAStdout ".. short big big" array/short_big.arr[dim=256,bitpix=16,arch=big] big [dim=256,bitpix=16,arch=big] DoXPAStdout ".. ushort little little" array/ushort_little.arr[dim=256,bitpix=-16,arch=little] little [dim=256,bitpix=-16,arch=little] DoXPAStdout ".. ushort little big" array/ushort_little.arr[dim=256,bitpix=-16,arch=little] big [dim=256,bitpix=-16,arch=big] DoXPAStdout ".. ushort big little" array/ushort_big.arr[dim=256,bitpix=-16,arch=big] little [dim=256,bitpix=-16,arch=little] DoXPAStdout ".. ushort big big" array/ushort_big.arr[dim=256,bitpix=-16,arch=big] big [dim=256,bitpix=-16,arch=big] DoXPAStdout ".. int little little" array/int_little.arr[dim=256,bitpix=32,arch=little] little [dim=256,bitpix=32,arch=little] DoXPAStdout ".. int little big" array/int_little.arr[dim=256,bitpix=32,arch=little] big [dim=256,bitpix=32,arch=big] DoXPAStdout ".. int big little" array/int_big.arr[dim=256,bitpix=32,arch=big] little [dim=256,bitpix=32,arch=little] DoXPAStdout ".. int big big" array/int_big.arr[dim=256,bitpix=32,arch=big] big [dim=256,bitpix=32,arch=big] DoXPAStdout ".. longlong little little" array/longlong_little.arr[dim=256,bitpix=64,arch=little] little [dim=256,bitpix=64,arch=little] DoXPAStdout ".. longlong little big" array/longlong_little.arr[dim=256,bitpix=64,arch=little] big [dim=256,bitpix=64,arch=big] DoXPAStdout ".. longlong big little" array/longlong_big.arr[dim=256,bitpix=64,arch=big] little [dim=256,bitpix=64,arch=little] DoXPAStdout ".. longlong big big" array/longlong_big.arr[dim=256,bitpix=64,arch=big] big [dim=256,bitpix=64,arch=big] DoXPAStdout ".. float little little" array/float_little.arr[dim=256,bitpix=-32,arch=little] little [dim=256,bitpix=-32,arch=little] DoXPAStdout ".. float little big" array/float_little.arr[dim=256,bitpix=-32,arch=little] big [dim=256,bitpix=-32,arch=big] DoXPAStdout ".. float big little" array/float_big.arr[dim=256,bitpix=-32,arch=big] little [dim=256,bitpix=-32,arch=little] DoXPAStdout ".. float big big" array/float_big.arr[dim=256,bitpix=-32,arch=big] big [dim=256,bitpix=-32,arch=big] DoXPAStdout ".. double little little" array/double_little.arr[dim=256,bitpix=-64,arch=little] little [dim=256,bitpix=-64,arch=little] DoXPAStdout ".. double little big" array/double_little.arr[dim=256,bitpix=-64,arch=little] big [dim=256,bitpix=-64,arch=big] DoXPAStdout ".. double big little" array/double_big.arr[dim=256,bitpix=-64,arch=big] little [dim=256,bitpix=-64,arch=little] DoXPAStdout ".. double big big" array/double_big.arr[dim=256,bitpix=-64,arch=big] big [dim=256,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ���������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 014325� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/backup.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000007105 12131336167 015340� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������TEMP=/tmp testfull () { # $1 title # $2 type # $3 file # $4 params # $5 cmd echo -n "$1" echo -n "." ds9 $5 -$2 $3$4 -backup foo.bck -sleep 1 -exit echo -n "*" ds9 -restore foo.bck -sleep 1 -exit rm -rf foo.bck* echo -n "." cat $3 | ds9 $5 -$2 -$4 -backup foo.bck -sleep 1 -exit echo -n "*" ds9 -restore foo.bck -sleep 1 -exit rm -rf foo.bck* echo -n "." echo "PASSED" } testhalf () { # $1 title # $2 type # $3 file echo -n "$1" echo -n "." ds9 -$2 ${3%.arr}.hdr $3 -backup foo.bck -sleep 1 -exit echo -n "*" ds9 -restore foo.bck -sleep 1 -exit rm -rf foo.bck* echo -n "." echo "PASSED" } echo echo "*** backup.sh ***" rm -rf foo.bck* if [ "$TEMP" = "" ]; then echo "No TEMP directory defined." echo "Be sure to define TEMP first..." exit fi if [ "$1" = "fits" -o -z "$1" ]; then testfull fits fits fits/float.fits testfull "fits original" fits fits/float.fits " -source aux/pds9.tcl " fi if [ "$1" = "rgbcube" -o -z "$1" ]; then testfull rgbcube rgbcube rgbcube/float.fits testfull "rgbcube original" rgbcube rgbcube/float.fits " -source aux/pds9.tcl " fi if [ "$1" = "rgbimage" -o -z "$1" ]; then testfull rgbimage rgbimage mecube/float.fits testfull "rgbimage original" rgbimage mecube/float.fits " -source aux/pds9.tcl " fi if [ "$1" = "mecube" -o -z "$1" ]; then testfull mecube mecube mecube/float.fits testfull "mecube original" mecube mecube/float.fits " -source aux/pds9.tcl " fi if [ "$1" = "multiframe" -o -z "$1" ]; then testfull multiframe multiframe mecube/float.fits testfull "multiframe original" multiframe mecube/float.fits " -source aux/pds9.tcl " fi if [ "$1" = "mosaicimage" -o -z "$1" ]; then testfull mosaicimagewcs mosaicimagewcs mosaic/mosaicimage.fits testfull "mosaicimagewcs original" mosaicimagewcs mosaic/mosaicimage.fits " -source aux/pds9.tcl " fi if [ "$1" = "mosaic" -o -z "$1" ]; then testfull mosaicwcs mosaicwcs mosaic/mosaicimage.fits testfull "mosaicwcs original" mosaicwcs mosaic/mosaicimage.fits " -source aux/pds9.tcl " fi if [ "$1" = "sfits" -o -z "$1" ]; then testhalf sfits sfits sfits/float.arr testhalf "sfits original" sfits sfits/float.arr " -source aux/pds9.tcl " fi if [ "$1" = "srgbcube" -o -z "$1" ]; then testhalf srgbcube srgbcube srgbcube/float.arr testhalf "srgbcube original" srgbcube srgbcube/float.arr " -source aux/pds9.tcl " fi if [ "$1" = "array" -o -z "$1" ]; then testfull array array array/float_big.arr [dim=256,bitpix=-32,endian=big] testfull "array original" array array/float_big.arr [dim=256,bitpix=-32,endian=big] " -source aux/pds9.tcl " fi if [ "$1" = "rgbarray" -o -z "$1" ]; then testfull rgbarray rgbarray rgbarray/float_big.rgb [dim=256,bitpix=-32,endian=big] -rgb testfull "rgbarray original" rgbarray rgbarray/float_big.rgb [dim=256,bitpix=-32,endian=big] " -rgb -source aux/pds9.tcl " fi if [ "$1" = "nrrd" -o -z "$1" ]; then testfull nrrd nrrd nrrd/float_big_raw.nrrd testfull "nrrd original" nrrd nrrd/float_big_raw.nrrd " -source aux/pds9.tcl " fi if [ "$1" = "photo" -o -z "$1" ]; then testfull photo tiff photo/rose.tiff testfull "photo original" tiff photo/rose.tiff " -source aux/pds9.tcl " fi if [ "$1" = "photorgb" -o -z "$1" ]; then testfull photorgb tiff photo/rose.tiff "" -rgb testfull "photorgb original" tiff photo/rose.tiff "" " -rgb -source aux/pds9.tcl " fi # previous backups if [ "$1" = "old" -o -z "$1" ]; then for f in backup/*.bck do echo "Testing $f" ds9 -restore $f echo "PASSED" done fi echo "DONE" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/command.sh�����������������������������������������������������������������������������000755 �000765 �000000 �00000145105 12620446640 015515� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "Command Line Options Tests" initit () { echo "Testing $1" unset opt } testit () { echo "$1" opt="$opt $1 -sleep .1" } doit () { eval ds9 -zscale data/img.fits "$opt" -exit echo "PASSED" echo "" } echo echo "*** command.sh ***" delay=.5 # must be invoked # -private # -samp # no test # -shm # -smosaic # -smosaicwcs # -smosaiciraf # not tested # -geometry # --help # -visual tt="2mass" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-2mass open" testit "-2mass close" testit "-2mass survey h" testit "-2mass size 30 30 arcsec" testit "-2mass save no" testit "-2mass frame new" testit "-2mass update frame" testit "-2mass m51" testit "-2mass name m51" testit "-2mass name ''" testit "-2mass coord 00:42:44.404 +41:16:08.78 sexagesimal" testit "-2mass update frame" testit "-mode crosshair" testit "-2mass update crosshair" testit "-2mass close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="3d" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-3d open" testit "-3d close" testit "-3d" testit "-3d view 45 30" testit "-3d az 45" testit "-3d el 30" testit "-3d scale 5" testit "-3d method mip" testit "-3d background azimuth" testit "-3d border yes" testit "-3d border color red" testit "-3d compass yes" testit "-3d compass color red" testit "-3d highlite yes" testit "-3d highlite color red" testit "-frame delete" testit "-3d close" testit "-cube close" doit fi tt="about" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-about" doit fi tt="align" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-align" doit fi tt="analysis" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-analysis clear" testit "-analysis analysis/analysis.ans" testit "-analysis 0" testit "-analysis task 1" testit "-analysis task '{Basic Help}'" testit "-analysis clear" testit "-analysis load analysis/analysis.ans" testit "-analysis clear load analysis/analysis.ans" testit "-analysis clear" #testit "-analysis message 'This is a message'" #testit "-analysis message yesno 'This is a message'" testit "-analysis text 'This is text'" testit "-analysis mode none" doit fi tt="array" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-array array/float_big.arr[dim=256,bitpix=-32,endian=big]" testit "-frame delete" testit "-frame new" testit "-array -mask array/float_big.arr[dim=256,bitpix=-32,endian=big] -nomask" testit "-frame delete" testit "-rgb close" doit fi tt="asinh" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-asinh" doit fi tt="bg" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/background" testit "-background red" testit "-background white" doit fi tt="backup" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-backup foo.bck" doit fi tt="bin" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new -fits fits/table.fits" testit "-single" testit "-bin open" testit "-bin factor 4" testit "-bin factor 8 8" testit "-scale log" testit "-scale minmax" testit "-bin buffersize 1024" testit "-bin filter 'circle(4096,4096,200)'" testit "-bin filter ''" testit "-bin cols rawx rawy" testit "-bin about center" testit "-bin colsz x y pha" testit "-bin depth 10" testit "-bin about 4096 4096" testit "-bin depth 1" testit "-bin function sum" testit "-bin in" testit "-bin out" testit "-bin to fit" testit "-bin match" testit "-bin lock yes" testit "-bin lock no" testit "-bin close" testit "-frame delete" doit fi tt="blink" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-blink" testit "-blink yes" testit "-blink interval .5" testit "-single" testit "-frame first" testit "-frame next" doit fi tt="block" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-block open" testit "-block 4" testit "-block 8 8" testit "-block to 4" testit "-block to 8 8" testit "-block in" testit "-block out" testit "-block to fit" testit "-block to 1" testit "-block match" testit "-block lock yes" testit "-block lock no" testit "-block close" doit fi tt="blue" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-blue" testit "-rgb close" doit fi tt="catalog" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/cat" testit "-catalog cds 2mass" testit "-catalog clear" testit "-catalog close" testit "-catalog" testit "-catalog close" testit "-catalog cds 'I/284'" testit "-catalog clear" testit "-catalog close" testit "-catalog import sb aux/ds9.cat" testit "-catalog clear" testit "-catalog close" testit "-catalog cds 2mass" testit "-raise" testit "-catalog plot '\$Jmag' '\$Hmag' '\$e_Jmag' '\$e_Hmag'" testit "-catalog symbol condition '\$Jmag>15'" testit "-catalog symbol shape 'boxcircle point'" testit "-catalog symbol color red" testit "-catalog symbol condition ''" testit "-catalog symbol color red" testit "-catalog symbol shape text" testit "-catalog symbol font times" testit "-catalog symbol fontsize 14" testit "-catalog symbol fontweight bold" testit "-catalog symbol fontslant italic" testit "-catalog symbol add" testit "-catalog symbol remove" testit "-catalog symbol load aux/ds9.sym" testit "-catalog symbol save foo.sym" testit "-catalog name m51" testit "-catalog coordinate 202.48 47.21 fk5" testit "-catalog system wcs" testit "-catalog sky fk5" testit "-catalog skyformat degrees" testit "-catalog size 22 22 arcmin" testit "-catalog regions" testit "-regions delete all" testit "-catalog retrieve" testit "-catalog save foo.cat" testit "-catalog filter '\$Jmag>15'" testit "-catalog filter load aux/ds9.flt" testit "-catalog retrieve" testit "-catalog cancel" #testit "-catalog print" testit "-catalog server sao" testit "-catalog sort 'Jmag' incr" testit "-catalog maxrows 3000" testit "-catalog allcols" testit "-catalog allrows" testit "-catalog ra 'RAJ2000'" testit "-catalog dec 'DEJ2000'" testit "-catalog psystem wcs" testit "-catalog psky fk5" testit "-catalog hide" testit "-catalog show" testit "-catalog panto no" #testit "-catalog edit yes" testit "-catalog location 400" testit "-catalog header" testit "-catalog clear" testit "-catalog close" testit "-catalog 2mass" testit "-catalog xmm" testit "-catalog match function 1and2" testit "-catalog match error 2 arcsec" testit "-catalog match return 1only" testit "-catalog match unique no" testit "-catalog match 2mass xmm" testit "-catalog clear" testit "-catalog close" testit "-catalog clear" testit "-catalog close" testit "-catalog clear" testit "-catalog close" doit fi tt="cd" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-cd ." doit fi tt="cmap" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-cmap open" testit "-cmap Heat" testit "-cmap load aux/ds9.sao" testit "-cmap save foo.sao" testit "-cmap invert yes" testit "-cmap invert no" testit "-invert" testit "-cmap value 5 .2" testit "-cmap tag load aux/ds9.tag" testit "-cmap tag save foo.tag" testit "-cmap tag delete" testit "-cmap match" testit "-cmap lock yes" testit "-cmap lock no" testit "-cmap Grey" testit "-cmap close" doit fi tt="colorbar" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-colorbar no" testit "-colorbar yes" testit "-colorbar vertical" testit "-colorbar horizontal" testit "-colorbar numerics no" testit "-colorbar numerics yes" testit "-colorbar space value" testit "-colorbar space distance" testit "-colorbar font times" testit "-colorbar fontsize 30" testit "-colorbar fontweight bold" testit "-colorbar fontslant roman" testit "-colorbar font helvetica" testit "-colorbar fontsize 10" testit "-colorbar fontweight normal" testit "-colorbar fontslant roman" testit "-colorbar size 30" testit "-colorbar ticks 9" testit "-colorbar size 20" testit "-colorbar size 11" doit fi tt="console" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-console" doit fi tt="contour" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/contours" testit "-contour open" testit "-contour" testit "-contour yes" testit "-contour clear" testit "-contour yes" testit "-contour load aux/ds9.con wcs fk5 red 2" testit "-contour save foo.con wcs fk5" testit "-contour clear" testit "-contour yes" testit "-contour convert" testit "-regions delete all" testit "-contour loadlevels aux/ds9.lev" testit "-contour savelevels foo.lev" testit "-contour clear" testit "-contour yes" testit "-contour copy" testit "-contour paste wcs red 2" testit "-contour clear" testit "-contour yes" testit "-contour color yellow" testit "-contour width 2" testit "-contour smooth 5" testit "-contour method block" testit "-contour nlevels 10" testit "-contour width 2" testit "-contour scale sqrt" testit "-contour log exp 1000" testit "-contour mode zscale" testit "-contour limits 1 100" testit "-contour levels '1 10 100 1000'" testit "-contour clear" testit "-contour close" doit fi tt="crop" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-mode crop" testit "-crop 978 970 356 308" testit "-crop 13:29:52.908 +47:11:38.19 35.279606 30.522805 wcs fk5 arcsec" testit "-crop reset" testit "-3d" testit "-fits data/3d.fits" testit "-3d vp 45 30" testit "-crop 3d 25 75" testit "-crop reset" testit "-crop match wcs" testit "-crop lock wcs" testit "-crop lock none" testit "-frame delete" testit "-mode none" testit "-3d close" testit "-cube close" doit fi tt="crosshair" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-mode crosshair" testit "-crosshair 13:29:55.287 +47:11:37.73 wcs fk5" testit "-crosshair match wcs" testit "-crosshair lock wcs" testit "-crosshair lock none" testit "-mode none" doit fi tt="cube" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/datacube" testit "-cube open" testit "-cube close" testit "-frame new -fits data/3d.fits" testit "-cube 2" testit "-cube interval .5" testit "-cube axis 3" testit "-cube play" testit "-cube stop" testit "-cube match wcs" testit "-cube lock wcs" testit "-cube lock none" testit "-cube order 321" testit "-cube order 123" testit "-cube axes lock yes" testit "-cube axes lock no" testit "-frame delete" testit "-3d close" testit "-cube close" doit fi tt="cursor" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-mode crosshair" testit "-cursor 10 10" testit "-mode none" doit fi tt="dsssao" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/dss" testit "-dsssao open" testit "-dsssao close" testit "-dsssao size 30 30 arcsec" testit "-dsssao save no" testit "-dsssao frame new" testit "-dsssao update frame" testit "-dsssao m51" testit "-dsssao name m51" testit "-dsssao name ''" testit "-dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal" testit "-dsssao update frame" testit "-mode crosshair" testit "-dsssao update crosshair" testit "-dsssao close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="dsseso" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-dsseso open" testit "-dsseso close" testit "-dsseso survey DSS2-red" testit "-dsseso size 30 30 arcsec" testit "-dsseso save no" testit "-dsseso frame new" testit "-dsseso update frame" testit "-dsseso m51" testit "-dsseso name m51" testit "-dsseso name ''" testit "-dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal" testit "-dsseso update frame" testit "-mode crosshair" testit "-dsseso update crosshair" testit "-dsseso close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="dssstsci" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-dssstsci open" testit "-dssstsci close" testit "-dssstsci survey all" testit "-dssstsci size 30 30 arcsec" testit "-dssstsci save no" testit "-dssstsci frame new" testit "-dssstsci update frame" testit "-dssstsci m51" testit "-dssstsci name m51" testit "-dssstsci name ''" testit "-dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal" testit "-dssstsci update frame" testit "-mode crosshair" testit "-dssstsci update crosshair" testit "-dssstsci close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="export" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-export array foo.arr little" testit "-export foo.arr little" testit "-export nrrd foo.nrrd big" testit "-export foo.nrrd" testit "-export gif foo.gif" testit "-export foo.gif" testit "-export tiff foo.tiff none" testit "-export foo.tiff" testit "-export jpeg foo.jpeg 10" testit "-export foo.jpeg" testit "-export png foo.png" testit "-export foo.png" testit "-frame new rgb" testit "-rgbcube rgbcube/float.fits" testit "-export rgbarray foo.rgb little" testit "-export foo.rgb little" testit "-frame delete" testit "-rgb close" testit "-cube close" doit fi tt="fifo" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-fifo /dev/imt1" testit "-fifo_only" doit fi # backward compatibility tt="file" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-file fits/float.fits" testit "-file -slice fits/float.fits -noslice" testit "-file -mask fits/float.fits -nomask" testit "-frame delete" doit fi tt="fits" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-fits fits/float.fits" testit "-fits -slice fits/float.fits -noslice" testit "-fits -mask fits/float.fits -nomask" testit "-frame delete" doit fi tt="frame" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-frame delete" testit "-frame new 3d" testit "-frame delete" testit "-fits data/img.fits" testit "-tile" testit "-frame center" testit "-frame center 1" testit "-frame center all" testit "-frame reset" testit "-frame reset 1" testit "-frame reset all" testit "-frame refresh" testit "-frame refresh 1" testit "-frame refresh all" testit "-frame hide" testit "-frame hide 1" testit "-frame hide all" testit "-frame show" testit "-frame show 1" testit "-frame show all" testit "-frame move first" testit "-frame move back" testit "-frame move forward" testit "-frame move last" testit "-frame first" testit "-frame prev" testit "-frame next" testit "-frame last" testit "-frame frameno 1" testit "-frame 2" testit "-frame match wcs" testit "-frame lock wcs" testit "-frame lock none" testit "-frame clear" testit "-frame clear 1" testit "-frame clear all" testit "-frame delete" testit "-frame delete 1" testit "-frame delete all" testit "-frame new -fits data/img.fits" testit "-rgb close" testit "-3d close" testit "-cube close" doit fi tt="gif" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-gif photo/rose.gif" testit "-frame delete" testit "-frame new" testit "-gif -slice photo/rose.gif -noslice" testit "-frame delete" doit fi tt="green" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-green" testit "-rgb close" doit fi tt="grid" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-grid open" testit "-grid close" testit "-grid" testit "-grid yes" testit "-grid type analysis" testit "-grid system wcs" testit "-grid sky fk5" testit "-grid skyformat degrees" testit "-grid grid yes" testit "-grid grid color red" testit "-grid grid width 2" testit "-grid grid style 1" testit "-grid grid gap1 .01" testit "-grid grid gap2 .01" testit "-grid axes yes" testit "-grid axes color red" testit "-grid axes width 2" testit "-grid axes style 1" testit "-grid axes type exterior" testit "-grid axes origin lll" testit "-grid format1 d.2" testit "-grid format2 d.2" testit "-grid tickmarks color red" testit "-grid tickmarks width 2" testit "-grid tickmarks style 1" testit "-grid border yes" testit "-grid border color red" testit "-grid border width 2" testit "-grid border style 1" testit "-grid numerics yes" testit "-grid numerics font courier" testit "-grid numerics fontweight bold" testit "-grid numerics fontslant roman" testit "-grid numerics fontsize 12" testit "-grid numerics color red" testit "-grid numerics gap1 10" testit "-grid numerics gap2 10" testit "-grid numerics type exterior" testit "-grid numerics vertical yes" testit "-grid title yes" testit "-grid title text 'Hello World'" testit "-grid title def yes" testit "-grid title gap 10" testit "-grid title font courier" testit "-grid title fontweight bold" testit "-grid title fontslant roman" testit "-grid title fontsize 12" testit "-grid title color red" testit "-grid labels yes" testit "-grid labels text1 'Hello World'" testit "-grid labels def1 yes" testit "-grid labels gap1 10" testit "-grid labels text2 'Hello World'" testit "-grid labels def2 yes" testit "-grid labels gap2 10" testit "-grid labels font courier" testit "-grid labels fontweight bold" testit "-grid labels fontslant roman" testit "-grid labels fontsize 12" testit "-grid labels color red" testit "-grid save foo.grd" testit "-grid load foo.grd" testit "-grid reset" testit "-grid no" testit "-grid close" doit fi tt="header" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-header" testit "-header save foo.txt" testit "-header close" testit "-header 1" testit "-header close 1" doit fi tt="height" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-height 443" doit fi tt="histequ" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-histequ" doit fi tt="iconify" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-iconify" testit "-iconify yes" testit "-iconify no" doit fi tt="invert" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-invert" doit fi tt="iis" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-iis filename foo.fits" testit "-iis filename foo.fits 1" doit fi tt="jpeg" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/jpg" testit "-frame new" testit "-jpeg photo/rose.jpeg" testit "-jpeg -slice photo/rose.jpeg -noslice" testit "-frame delete" doit fi tt="language" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-language fr" doit fi tt="linear" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-linear" doit fi tt="lock" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-fits data/img.fits" testit "-tile" testit "-mode crosshair" testit "-lock frame wcs" testit "-lock frame none" testit "-lock crosshair wcs" testit "-crosshair 13:29:56 +47:11:38 wcs fk5" testit "-lock crosshair none" testit "-lock crop wcs" testit "-lock crop none" testit "-lock slice wcs" testit "-lock slice none" testit "-lock bin yes" testit "-lock bin no" testit "-lock axes yes" testit "-lock axes no" testit "-lock scale yes" testit "-lock scale no" testit "-lock scalelimits yes" testit "-lock scalelimits no" testit "-lock colorbar yes" testit "-lock colorbar no" testit "-lock block yes" testit "-lock block no" testit "-lock smooth yes" testit "-lock smooth no" testit "-mode none" testit "-frame delete" testit "-wcs align no" testit "-scale zscale" doit fi tt="log" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-log" doit fi tt="lower" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-lower" testit "-raise" doit fi tt="magnifier" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-magnifier color white" testit "-magnifier zoom 4" testit "-magnifier cursor yes" testit "-magnifier region yes" doit fi tt="mask" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-mask open" testit "-mask color cyan" testit "-mask clear" testit "-mask close" doit fi tt="match" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-fits data/img.fits" testit "-tile" testit "-mode crosshair" testit "-match frame wcs" testit "-match frame image" testit "-match crosshair wcs" testit "-match crop wcs" testit "-match slice wcs" testit "-match bin" testit "-match axes" testit "-match scale" testit "-match scalelimits" testit "-match colorbar" testit "-match block" testit "-match smooth" testit "-frame delete" testit "-mode none" testit "-scale zscale" doit fi tt="mecube" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-mecube mecube/float.fits" testit "-frame delete" testit "-cube close" doit fi tt="minmax" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-minmax scan" testit "-minmax mode scan" doit fi tt="mode" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-mode none" testit "-mode region" # backward compatibility testit "-mode pointer" testit "-mode crosshair" testit "-mode colorbar" testit "-mode pan" testit "-mode zoom" testit "-mode rotate" testit "-mode catalog" testit "-mode examine" testit "-mode none" doit fi tt="mosaic" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-mosaic mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaic wcs mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaic iraf mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaic mosaic/mosaicimage.fits" testit "-mosaic -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi tt="mosaicimage" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-mosaicimage mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaicimage wcs mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaicimage iraf mosaic/mosaicimage.fits" testit "-frame clear" testit "-mosaicimage wfpc2 mosaic/hst.fits" testit "-frame clear" testit "-mosaicimage mosaic/mosaicimage.fits" testit "-mosaicimage -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi # backward compatibility tt="mosaicwcs" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-mosaicwcs mosaic/mosaicimage.fits" testit "-mosaicwcs -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi # backward compatibility tt="mosaiciraf" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-mosaiciraf mosaic/mosaicimage.fits" testit "-mosaiciraf -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi # backward compatibility tt="mosaicimagewcs" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-mosaicimagewcs mosaic/mosaicimage.fits" testit "-mosaicimagewcs -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi # backward compatibility tt="mosaicimageiraf" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-mosaicimageiraf mosaic/mosaicimage.fits" testit "-mosaicimageiraf -mask mosaic/mosaicimage.fits -nomask" testit "-frame delete" doit fi # backward compatibility tt="mosaicimagewfpc2" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-mosaicimagewfpc2 mosaic/hst.fits" testit "-frame delete" doit fi # movie will fail if moved from corner tt="movie" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/savempeg" testit "-width 715 -height 450" testit "-movie slice foo.mpg" testit "-movie frame foo.mpg" testit "-frame new 3d" testit "-movie 3d foo.mpg number 1 azfrom 0 azto 0 elfrom 0 elto 0 slfrom 1 slto 1 repeat 1" testit "-frame delete" # backward compatibility testit "-savempeg foo.mpg" testit "-3d close" testit "-cube close" doit fi tt="msg" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-msg ../msgs" doit fi tt="multiframe" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/memf" testit "-frame delete" testit "-multiframe mecube/float.fits" doit fi tt="nameserver" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-nameserver open" testit "-nameserver close" testit "-nameserver m51" testit "-nameserver name m51" testit "-nameserver server simbad-cds" testit "-nameserver skyformat degrees" testit "-mode crosshair" testit "-nameserver crosshair" testit "-nameserver pan" testit "-nameserver close" testit "-mode none" testit "-frame reset" doit fi tt="nan" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-nan blue" testit "-nan white" doit fi tt="nrrd" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-nrrd nrrd/float_big_raw.nrrd" testit "-nrrd -mask nrrd/float_big_raw.nrrd -nomask" doit fi tt="nvss" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-nvss open" testit "-nvss close" testit "-nvss size 30 30 arcsec" testit "-nvss save no" testit "-nvss frame new" testit "-nvss update frame" testit "-nvss m51" testit "-nvss name m51" testit "-nvss name ''" testit "-nvss coord 13:29:52.37 +47:11:40.8 sexagesimal" testit "-nvss update frame" testit "-mode crosshair" testit "-nvss update crosshair" testit "-nvss close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="orient" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-orient open" testit "-orient none" testit "-orient x" testit "-orient y" testit "-orient xy" testit "-orient close" testit "-frame reset" doit fi tt="pagesetup" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-pspagesetup orient portrait" testit "-pspagesetup scale 100" testit "-pspagesetup size letter" doit fi tt="pan" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-pan open" testit "-pan 100 100 image" testit "-pan to 13:29:55.666 +47:12:16.29 wcs fk5" testit "-pan close" testit "-frame reset" doit fi # backward compatibility tt="photo" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-photo photo/rose.tiff" testit "-photo -slice photo/rose.tiff -noslice" testit "-frame delete" doit fi tt="pixeltable" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-pixeltable" testit "-pixeltable yes" testit "-pixeltable no" testit "-pixeltable open" testit "-pixeltable close" doit fi tt="plot" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-plot" testit "-plot close" testit "-plot new" testit "-plot bar" testit "-plot new bar" testit "-plot scatter" testit "-plot new scatter" testit "-sleep $delay" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot new name foo" testit "-plot new name foo line" testit "-plot new name foo bar" testit "-plot new name foo scatter" testit "-sleep $delay" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot new name foo 'The Title' 'X Axis' 'Y Axis' xy" testit "-plot new name foo line 'The Title' 'X Axis' 'Y Axis' xy" testit "-plot new name foo bar 'The Title' 'X Axis' 'Y Axis' xy" testit "-plot new name foo scatter 'The Title' 'X Axis' 'Y Axis' xy" testit "-sleep $delay" testit "-plot close" testit "-plot close" testit "-plot close" testit "-plot close" doit initit "..save/load" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot save foo.dat" testit "-sleep $delay" testit "-plot close" doit initit "..clear" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-sleep $delay" testit "-plot clear" testit "-plot close" doit initit "..duplicate" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot dup" testit "-plot duplicate 1" testit "-sleep $delay" testit "-plot close" doit initit "..stats" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot stats" testit "-sleep $delay" testit "-plot close" doit initit "..list" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot list" testit "-sleep $delay" testit "-plot close" doit initit "..saveconfig/loadconfig" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot saveconfig foo.plt" testit "-plot loadconfig foo.plt" testit "-sleep $delay" testit "-plot close" doit initit "..pagesetup" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot pagesetup orient portrait" testit "-plot pagesetup pagesize letter" testit "-sleep $delay" testit "-plot close" doit initit "..print" testit "-plot new" testit "-plot load plot/xy.dat xy" #testit "-plot print" testit "-plot print destination printer" testit "-plot print command 'lp'" testit "-plot print filename 'foo.ps'" testit "-plot print color rgb" testit "-sleep $delay" testit "-plot close" doit initit "..mode" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot mode pointer" testit "-sleep $delay" testit "-plot close" doit initit "..axis" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot axis x grid no" testit "-plot axis x grid yes" testit "-plot axis x log yes" testit "-plot axis x log no" testit "-plot axis x flip yes" testit "-plot axis x flip no" testit "-plot axis x auto no" testit "-plot axis x min 1" testit "-plot axis x max 100" testit "-plot axis x format '%f'" testit "-plot axis y grid no" testit "-plot axis y grid yes" testit "-plot axis y log yes" testit "-plot axis y log no" testit "-plot axis y flip yes" testit "-plot axis y flip no" testit "-plot axis y auto no" testit "-plot axis y min 1" testit "-plot axis y max 100" testit "-plot axis y format '%f'" testit "-sleep $delay" testit "-plot close" doit initit "..legend" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot legend yes" testit "-plot legend position left" testit "-plot legend position right" testit "-plot legend position bottom" testit "-plot legend position top" testit "-sleep $delay" testit "-plot close" doit initit "..font" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot title 'This is a Title'" testit "-plot title xaxis 'X Axis'" testit "-plot title yaxis 'Y Axis'" testit "-plot title legend 'This is the Legend'" testit "-plot legend yes" testit "-plot font title font times" testit "-plot font title size 12" testit "-plot font title weight bold" testit "-plot font title slant roman" testit "-plot font labels font times" testit "-plot font labels size 12" testit "-plot font labels weight bold" testit "-plot font labels slant roman" testit "-plot font numbers font times" testit "-plot font numbers size 12" testit "-plot font numbers weight bold" testit "-plot font numbers slant roman" testit "-plot font legendtitle font times" testit "-plot font legendtitle size 12" testit "-plot font legendtitle weight bold" testit "-plot font legendtitle slant roman" testit "-plot font legend font times" testit "-plot font legend size 12" testit "-plot font legend weight bold" testit "-plot font legend slant roman" testit "-sleep $delay" testit "-plot close" doit initit "..title" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot title 'This is a Title'" testit "-plot title x 'X Axis'" testit "-plot title y 'Y Axis'" testit "-plot title legend 'This is the Legend'" testit "-sleep $delay" testit "-plot close" doit initit "..barmode" testit "-plot new bar" testit "-plot load plot/xy.dat xy" testit "-plot load plot/xyey.dat xyey" testit "-plot barmode normal" testit "-plot barmode stacked" testit "-plot barmode aligned" testit "-plot barmode overlap" testit "-sleep $delay" testit "-plot close" doit initit "..show" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot show no" testit "-plot show yes" testit "-sleep $delay" testit "-plot close" doit initit "..shape" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot shape circle" testit "-plot shape square" testit "-plot shape diamond" testit "-plot shape plus" testit "-plot shape splus" testit "-plot shape scross" testit "-plot shape triangle" testit "-plot shape arrow" testit "-plot shape circle" testit "-plot shape fill no" testit "-plot shape fill yes" testit "-plot shape color cyan" testit "-sleep $delay" testit "-plot close" doit initit "..smooth" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot smooth step" testit "-plot smooth linear" testit "-plot smooth cubic" testit "-plot smooth quadratic" testit "-plot smooth catrom" testit "-sleep $delay" testit "-plot close" doit initit "..color" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot color magenta" testit "-plot color '#2C8'" testit "-sleep $delay" testit "-plot close" doit initit "..width" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot width 2" testit "-plot dash yes" testit "-sleep $delay" testit "-plot close" doit initit "..error" testit "-plot new" testit "-plot load plot/xyexey.dat xyexey" testit "-plot error no" testit "-plot error yes" testit "-plot error cap yes" testit "-plot error cap no" testit "-plot error color blue" testit "-plot error width 2" testit "-sleep $delay" testit "-plot close" doit initit "..name" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot legend yes" testit "-plot name 'This is a test'" testit "-sleep $delay" testit "-plot close" doit initit "..select" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot load plot/xyey.dat xyey" testit "-plot select 2" testit "-plot dataset 1" testit "-sleep $delay" testit "-plot close" doit initit "..backward compatibility graph" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot graph grid x no" testit "-plot graph grid y yes" testit "-plot graph log x no" testit "-plot graph log y no" testit "-plot graph flip x no" testit "-plot graph flip y no" testit "-plot graph range x min 1" testit "-plot graph range x max 100" testit "-plot graph range y min 1" testit "-plot graph range y max 100" testit "-plot graph range x auto yes" testit "-plot graph range y auto yes" testit "-plot graph format x ''" testit "-plot graph format y ''" testit "-plot graph labels title 'The Title'" testit "-plot graph labels xaxis 'X Axis'" testit "-plot graph labels yaxis 'Y Axis'" testit "-sleep $delay" testit "-plot close" doit initit "..backward compatibility view" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot view discrete yes" testit "-plot view line yes" testit "-plot view step yes" testit "-plot view quadratic yes" testit "-plot view errorbar yes" testit "-sleep $delay" testit "-plot close" doit initit "..backward compatibility line" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot line discrete cross" testit "-plot line linear width 2" testit "-plot line linear dash yes" testit "-plot line step width 2" testit "-plot line step dash yes" testit "-plot line quadratic width 2" testit "-plot line quadratic dash yes" testit "-plot line errorbar width 2" testit "-plot line errorbar style 1" testit "-sleep $delay" testit "-plot close" doit initit "..backward compatibility color" testit "-plot new" testit "-plot load plot/xy.dat xy" testit "-plot color discrete red" testit "-plot color step blue" testit "-plot color line green" testit "-plot color quadratic cyan" testit "-plot color errorbar magenta" doit fi tt="png" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-png photo/rose.png" testit "-png -slice photo/rose.png -noslice" testit "-frame delete" doit fi tt="port" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-port 5137" testit "-port_only" testit "-inet_only" doit fi tt="pow" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-pow" doit fi tt="prefs" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-prefs clear" # backward compatibility testit "-prefs bgcolor white" testit "-prefs nancolor white" testit "-prefs threads 8" testit "-prefs irafalign yes" doit fi tt="preserve" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-preserve pan no" testit "-preserve regions no" doit fi tt="print" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" #testit "-psprint" testit "-psprint destination printer" testit "-psprint command lp" testit "-psprint filename ds9.ps" testit "-psprint color rgb" testit "-psprint level 2" testit "-psprint resolution 75" doit fi tt="private" if [ "$1" = "$tt" ]; then initit "$tt" testit "-private" doit fi tt="raise" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-lower" testit "-raise" doit fi tt="regions" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/region" testit "-regions regions/ds9.physical.reg" testit "-regions delete all" testit "-regions load regions/ds9.physical.reg" testit "-regions delete all" testit "-regions load 'regions/ds9.fk5*.reg'" testit "-regions delete all" testit "-regions load all regions/ds9.physical.reg" testit "-regions save foo.reg" testit "-regions list" testit "-regions list close" testit "-regions delete all" testit "-regions epsilon 5" testit "-regions show yes" testit "-regions showtext yes" testit "-regions centroid auto no" testit "-regions centroid radius 10" testit "-regions centroid iteration 30" #testit "-regions getinfo" testit "-regions move front" testit "-regions move back" testit "-regions select all" testit "-regions select none" testit "-regions delete all" testit "-regions delete select" testit "-regions format ds9" testit "-regions system physical" testit "-regions sky fk5" testit "-regions skyformat degrees" testit "-regions delim nl" testit "-regions strip no" testit "-regions shape circle" testit "-regions color green" testit "-regions width 1" testit "-regions edit yes" testit "-regions include" testit "-regions command 'circle 100 100 20'" testit "-regions group new" testit "-regions group foo new" testit "-regions group foo update" testit "-regions group foo select" testit "-regions group foo color red" testit "-regions group foo copy" testit "-regions group foo delete" testit "-regions group foo cut" testit "-regions group foo font 'time 14 bold'" testit "-regions group foo move 100 100" testit "-regions group foo movefront" testit "-regions group foo moveback" testit "-regions group foo property delete no" testit "-regions delete all" testit "-regions command 'circle 100 100 20'" testit "-regions select all" testit "-regions copy" testit "-regions cut" testit "-regions paste" testit "-regions undo" testit "-regions delete all" testit "-regions load regions/ds9.physical.reg" testit "-regions select all" testit "-regions composite" testit "-regions desolve" testit "-regions delete all" testit "-regions command 'circle 100 100 20'" testit "-regions savetemplate foo.tpl" testit "-regions delete all" testit "-regions template foo.tpl" testit "-regions delete all" testit "-regions template foo.tpl at 202.46963 47.19556 fk5" testit "-regions delete all" doit fi tt="red" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-red" testit "-rgb close" doit fi tt="restore" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-backup foo.bck" testit "-restore foo.bck" doit fi tt="rgb" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-rgb open" testit "-rgb close" testit "-rgb" testit "-rgb green" testit "-rgb channel blue" testit "-red" testit "-green" testit "-blue" testit "-rgb view blue off" testit "-rgb system wcs" testit "-rgb lock wcs yes" testit "-rgb lock wcs no" testit "-rgb lock crop yes" testit "-rgb lock crop no" testit "-rgb lock slice yes" testit "-rgb lock slice no" testit "-rgb lock bin yes" testit "-rgb lock bin no" testit "-rgb lock scale yes" testit "-rgb lock scale no" testit "-rgb lock scalelimits yes" testit "-rgb lock scalelimits no" testit "-rgb lock colorbar yes" testit "-rgb lock colorbar no" testit "-rgb lock block yes" testit "-rgb lock block no" testit "-rgb lock smooth yes" testit "-rgb lock smooth no" testit "-rgb close" testit "-frame delete" doit fi tt="rgbarray" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big]" testit "-frame delete" testit "-rgb close" doit fi tt="rgbcube" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-rgbcube rgbcube/float.fits" testit "-frame delete" testit "-rgb close" doit fi tt="rgbimage" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new rgb" testit "-rgbimage mecube/float.fits" testit "-frame delete" testit "-rgb close" doit fi tt="rotate" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-rotate open" testit "-rotate to 30" testit "-rotate 15" testit "-rotate close" testit "-frame reset" doit fi tt="samp" if [ "$1" = "$tt" ]; then initit "$tt" testit "-samp no" testit "-samp yes" testit "-samp broadcast" testit "-samp broadcast image" testit "-samp send aladin" testit "-samp send image aladin" doit fi tt="save" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/savefits" testit "-save foo.fits" testit "-save fits foo.fits" testit "-save foo.fits image" testit "-save fits foo.fits image" testit "-save foo.fits slice" testit "-save fits foo.fits slice" testit "-frame new" testit "-fits fits/table.fits" testit "-save foo.fits" testit "-save fits foo.fits" testit "-save foo.fits image" testit "-save fits foo.fits image" testit "-save foo.fits table" testit "-save fits foo.fits table" testit "-frame delete" testit "-frame new rgb" testit "-rgbimage mecube/float.fits" testit "-save rgbimage foo.fits" testit "-frame delete" testit "-frame new rgb" testit "-rgbcube rgbcube/float.fits" testit "-save rgbcube foo.fits" testit "-frame delete" testit "-frame new" testit "-mecube mecube/float.fits" testit "-save mecube foo.fits" testit "-frame delete" testit "-frame new" testit "-mosaicimage mosaic/mosaicimage.fits" testit "-save mosaicimage foo.fits" testit "-frame delete" testit "-frame new" testit "-mosaicimage mosaic/mosaicimage.fits" testit "-save mosaic foo.fits" testit "-frame delete" # backward compatibility testit "-savefits foo.fits" testit "-rgb close" testit "-cube close" doit fi # movie will fail if moved from corner tt="saveimage" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-saveimage fits foo.fits" testit "-saveimage foo.fits" testit "-saveimage eps foo.eps" testit "-saveimage foo.eps" #testit "-saveimage foo.gif" testit "-saveimage tiff foo.tiff none" testit "-saveimage foo.tiff" testit "-saveimage jpeg foo.jpeg 100" testit "-saveimage foo.jpeg" testit "-saveimage png foo.png" testit "-saveimage foo.png" # backward compatibility testit "-saveimage tiff none foo.tiff" testit "-saveimage jpeg 100 foo.jpeg" testit "-saveimage mpeg foo.mpeg" doit fi tt="scale" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-scale open" testit "-scale minmax" testit "-scale linear" testit "-scale log" testit "-scale pow" testit "-scale sqrt" testit "-scale squared" testit "-scale histequ" testit "-scale log exp 1000" testit "-scale log exp 10000" testit "-linear" testit "-log" testit "-pow" testit "-sqrt" testit "-squared" testit "-asinh" testit "-sinh" testit "-histequ" testit "-scale linear" testit "-scale minmax" testit "-scale zscale" testit "-scale zmax" testit "-scale user" testit "-scale mode minmax" testit "-scale mode zscale" testit "-scale mode zmax" testit "-scale mode 95" testit "-minmax" testit "-zscale" testit "-zmax" testit "-scale minmax" testit "-scale limits 0 100" testit "-scale global" testit "-scale local" testit "-scale scope global" testit "-scale scope local" testit "-scale mode minmax" testit "-scale linear" testit "-scale zscale" testit "-scale datasec yes" testit "-scale match" testit "-scale match limits" testit "-scale lock yes" testit "-scale lock no" testit "-scale lock limits yes" testit "-scale lock limits no" testit "-scale close" doit fi # backward compatibility tt="sfits" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new" testit "-sfits sfits/float.hdr sfits/float.arr" testit "-sfits -slice sfits/float.hdr sfits/float.arr -noslice" testit "-sfits -mask sfits/float.hdr sfits/float.arr -nomask" testit "-frame delete" doit fi tt="shm" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" # no test doit fi tt="single" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-tile" doit fi tt="sinh" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-sinh" doit fi tt="skyview" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-skyview open" testit "-skyview close" testit "-skyview survey sdssi" testit "-skyview size 30 30 arcsec" testit "-skyview pixels 600 600" testit "-skyview save no" testit "-skyview frame new" testit "-skyview update frame" testit "-skyview m51" testit "-skyview name m51" testit "-skyview name ''" testit "-skyview coord 13:29:55.301 +47:11:37.73 sexagesimal" testit "-skyview update frame" testit "-mode crosshair" testit "-skyview update crosshair" testit "-skyview close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="sleep" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-sleep" testit "-sleep 2" doit fi tt="slice" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-slice" testit "-noslice" doit fi # backward compatibility tt="smosaic" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" # no test doit fi # backward compatibility tt="smosaicwcs" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" # no test doit fi # backward compatibility tt="smosaiciraf" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" # no test doit fi tt="smooth" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-smooth open" testit "-smooth" testit "-smooth yes" testit "-smooth function tophat" testit "-smooth radius 5" testit "-smooth match" testit "-smooth lock yes" testit "-smooth lock no" testit "-smooth no" testit "-smooth close" doit fi tt="squared" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-squared" doit fi tt="sqrt" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-sqrt" doit fi tt="source" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-source aux/source.tcl" doit fi # backward compatibility tt="srgbcube" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt...backward compatibility" testit "-frame new rgb" testit "-srgbcube srgbcube/float.hdr srgbcube/float.arr" testit "-frame delete" testit "-rgb close" doit fi tt="tcl" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-tcl yes" doit fi tt="threads" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/tread" testit "-threads 8" doit fi tt="tiff" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt/tif" testit "-frame new" testit "-tiff photo/rose.tiff" testit "-tiff -slice photo/rose.tiff -noslice" testit "-frame delete" doit fi tt="tile" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new -fits data/img.fits" testit "-frame new -fits data/img.fits" testit "-tile" testit "-tile yes" testit "-tile row" testit "-tile column" testit "-tile grid" testit "-tile grid mode automatic" testit "-tile grid direction x" testit "-frame delete" testit "-frame delete" doit fi tt="title" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-title foobar" doit fi tt="unix" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-unix /tmp/.IMT%d" testit "-unix_only" doit fi tt="update" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-update" testit "-update 1 100 100 300 400" testit "-update now" testit "-update now 1 100 100 300 400" testit "-update off" testit "-update on" doit fi tt="url" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame new" testit "-url http://ds9.si.edu/download/data/img.fits" testit "-frame delete" doit fi tt="version" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-version" doit fi tt="view" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-frame delete" testit "-view layout vertical" testit "-sleep $delay" testit "-view layout horizontal" testit "-sleep $delay" testit "-view keyvalue BITPIX" testit "-view info no" testit "-view info yes" testit "-view panner no" testit "-view panner yes" testit "-view magnifier no" testit "-view magnifier yes" testit "-view buttons no" testit "-view buttons yes" testit "-view colorbar no" testit "-view colorbar yes" testit "-view graph horizontal yes" testit "-view graph horizontal no" testit "-view graph vertical yes" testit "-view graph vertical no" testit "-view filename no" testit "-view filename yes" testit "-view object no" testit "-view object yes" testit "-view keyword yes" testit "-view keyword no" testit "-view minmax yes" testit "-view minmax no" testit "-view lowhigh yes" testit "-view lowhigh no" testit "-view units yes" testit "-view units no" testit "-view wcs no" testit "-view wcs yes" testit "-view wcsa yes" testit "-view wcsa no" testit "-view detector yes" testit "-view detector no" testit "-view amplifier yes" testit "-view amplifier no" testit "-view physical no" testit "-view physical yes" testit "-view image no" testit "-view image yes" testit "-view frame no" testit "-view frame yes" testit "-sleep $delay" testit "-frame new rgb" testit "-view red no" testit "-view red yes" testit "-view green no" testit "-view green yes" testit "-view blue no" testit "-view blue yes" testit "-frame delete" testit "-sleep $delay" testit "-frame new -fits data/img.fits" testit "-rgb close" doit fi tt="vla" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-vla open" testit "-vla close" testit "-vla size 30 30 arcsec" testit "-vla save no" testit "-vla frame new" testit "-vla survey first" testit "-vla update frame" testit "-vla m51" testit "-vla name m51" testit "-vla name ''" testit "-vla coord 13:29:52.37 +47:11:40.8 sexagesimal" testit "-vla update frame" testit "-mode crosshair" testit "-vla update crosshair" testit "-vla close" testit "-mode none" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" testit "-frame delete" doit fi tt="vo" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-vo method open" testit "-vo method mime" testit "-vo server 'http://cxc.harvard.edu/chandraed/list.txt'" testit "-vo internal yes" testit "-vo delay 10" testit "-vo connect foo" testit "-vo chandra-ed" testit "-vo disconnect chandra-ed" testit "-vo method close" testit "-web close" doit fi tt="wcs" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-wcs open" testit "-wcs wcs" testit "-wcs align yes" testit "-wcs system wcs" testit "-wcs sky galactic" testit "-wcs skyformat sexagesimal" testit "-wcs align no" testit "-wcs sky fk5" testit "-wcs skyformat degrees" testit "-wcs append aux/image.wcs" testit "-wcs replace aux/image.wcs" testit "-wcs reset" testit "-wcs skyformat sexagesimal" testit "-wcs close" doit fi tt="web" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-web ds9.si.edu/doc/acknowledgment.html" testit "-web ds9.si.edu/doc/helpdesk.html" testit "-web hvweb click back" testit "-web click forward" testit "-web clear" testit "-web close" doit fi tt="width" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-width 600" doit fi tt="xpa" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-xpa yes" testit "-xpa local" testit "-xpa noxpans" doit fi tt="zscale" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-zscale contrast .25" testit "-zscale sample 600" testit "-zscale line 120" doit fi tt="zoom" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-zoom open" testit "-zoom 2" testit "-zoom 2 4" testit "-zoom to 4" testit "-zoom to 2 4" testit "-zoom in" testit "-zoom out" testit "-zoom to fit" testit "-zoom close" testit "-frame reset" doit fi tt="exit" if [ "$1" = "$tt" -o -z "$1" ]; then initit "$tt" testit "-quit" doit fi rm -rf foo.* echo "DONE" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/compress.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000000407 12156113415 015720� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** COMPRESS ***" for f in compress/* do echo " ${f#compress/}" rm -f foo.fits funpack -O foo.fits $f ds9 $f foo.fits -mode crosshair -lock crosshair image -lock scale -lock colorbar -lock frame image -lock slice done echo "PASSED" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/crop.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000002545 12131345054 015034� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** crop.sh ***" echo "..fits[xmin:xmax,ymin:ymax]" ds9 -zscale data/img.fits[100:300,100:300] & KillIt echo "..fits[*,ymin:ymax]" ds9 -zscale data/img.fits[*,100:300] & KillIt echo "..fits[xmin:xmax,*]" ds9 -zscale data/img.fits[100:300,*] & KillIt echo "..fits[xdim@xcen,ydim@ycen]" ds9 -zscale data/img.fits[256@400,256@400] & KillIt echo "..fits[dim@xcen@ycen]" ds9 -zscale data/img.fits[256@400@400] & KillIt echo "..fits[xmin:xmax,ymin:ymax,zmin:zmax]" ds9 -zscale -3d data/3d.fits[100:300,100:300,25:75] -3d vp 45 30& KillIt echo "..fits[*,*,zmin:zmax]" ds9 -zscale -3d data/3d.fits[*,*,25:75] -3d vp 45 30& KillIt echo "..fits[xdim@xcen,ydim@ycen,zdim@zcen]" ds9 -zscale -3d data/3d.fits[100@150,100@150,25@50] -3d vp 45 30& KillIt echo "..fits[dim@xcen@ycen@zcen]" ds9 -zscale -3d data/3d.fits[25@150@150@50] -3d vp 45 30& KillIt echo "DONE" �����������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/cube.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000045 12113456763 015012� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������full.sh Cube rgbcube fits save $1 $2 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/cubearray.sh���������������������������������������������������������������������������000755 �000765 �000000 �00000046353 12131345761 016060� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } DoXPA () { echo "$1" xpaset -p ds9 array $2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdin () { echo "$1" cat $2 | xpaset ds9 array $3 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdout () { echo "$1" xpaset -p ds9 tile xpaset -p ds9 array $2 xpaget ds9 array $3 > foo.arr xpaset -p ds9 frame new xpaset -p ds9 array foo.arr$4 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear } initit () { echo "Testing $1" unset opt } testit () { opt="$opt -export array foo.arr $1 -sleep .1" opt="$opt -frame new -array foo.arr$2" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" } doit () { eval ds9 -tile -array $1 "$opt" -exit echo "PASSED" } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** cubearray.sh ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command File" echo ".. char" ds9 -array rgbarray/char.rgb[dim=256,zdim=3,bitpix=8] & KillIt echo ".. char gzip" ds9 -array rgbarray/char.rgb.gz[dim=256,zdim=3,bitpix=8] & KillIt echo ".. short little" ds9 -array rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] & KillIt echo ".. short little gzip" ds9 -array rgbarray/short_little.rgb.gz[dim=256,zdim=3,bitpix=16,arch=little] & KillIt echo ".. short big" ds9 -array rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] & KillIt echo ".. short big gzip" ds9 -array rgbarray/short_big.rgb.gz[dim=256,zdim=3,bitpix=16,arch=big] & KillIt echo ".. ushort little" ds9 -array rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" ds9 -array rgbarray/ushort_little.rgb.gz[dim=256,zdim=3,bitpix=-16,arch=little] & KillIt echo ".. ushort big" ds9 -array rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" ds9 -array rgbarray/ushort_big.rgb.gz[dim=256,zdim=3,bitpix=-16,arch=big] & KillIt echo ".. int little" ds9 -array rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] & KillIt echo ".. int little gzip" ds9 -array rgbarray/int_little.rgb.gz[dim=256,zdim=3,bitpix=32,arch=little] & KillIt echo ".. int big" ds9 -array rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] & KillIt echo ".. int big gzip" ds9 -array rgbarray/int_big.rgb.gz[dim=256,zdim=3,bitpix=32,arch=big] & KillIt echo ".. longlong little" ds9 -array rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" ds9 -array rgbarray/longlong_little.rgb.gz[dim=256,zdim=3,bitpix=64,arch=little] & KillIt echo ".. longlong big" ds9 -array rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" ds9 -array rgbarray/longlong_big.rgb.gz[dim=256,zdim=3,bitpix=64,arch=big] & KillIt echo ".. float little" ds9 -array rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" ds9 -array rgbarray/float_little.rgb.gz[dim=256,zdim=3,bitpix=-32,arch=little] & KillIt echo ".. float big" ds9 -array rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" ds9 -array rgbarray/float_big.rgb.gz[dim=256,zdim=3,bitpix=-32,arch=big] & KillIt echo ".. double little" ds9 -array rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" ds9 -array rgbarray/double_little.rgb.gz[dim=256,zdim=3,bitpix=-64,arch=little] & KillIt echo ".. double big" ds9 -array rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" ds9 -array rgbarray/double_big.rgb.gz[dim=256,zdim=3,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Command Stdin" echo ".. char" cat rgbarray/char.rgb | ds9 -array -[dim=256,zdim=3,bitpix=8] & KillIt echo ".. char gzip" cat rgbarray/char.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=8] & KillIt echo ".. short little" cat rgbarray/short_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=16,arch=little] & KillIt echo ".. short little gzip" cat rgbarray/short_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=16,arch=little] & KillIt echo ".. short big" cat rgbarray/short_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=16,arch=big] & KillIt echo ".. short big gzip" cat rgbarray/short_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=16,arch=big] & KillIt echo ".. ushort little" cat rgbarray/ushort_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" cat rgbarray/ushort_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-16,arch=little] & KillIt echo ".. ushort big" cat rgbarray/ushort_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" cat rgbarray/ushort_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-16,arch=big] & KillIt echo ".. int little" cat rgbarray/int_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=32,arch=little] & KillIt echo ".. int little gzip" cat rgbarray/int_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=32,arch=little] & KillIt echo ".. int big" cat rgbarray/int_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=32,arch=big] & KillIt echo ".. int big gzip" cat rgbarray/int_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=32,arch=big] & KillIt echo ".. longlong little" cat rgbarray/longlong_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" cat rgbarray/longlong_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=64,arch=little] & KillIt echo ".. longlong big" cat rgbarray/longlong_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" cat rgbarray/longlong_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=64,arch=big] & KillIt echo ".. float little" cat rgbarray/float_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" cat rgbarray/float_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-32,arch=little] & KillIt echo ".. float big" cat rgbarray/float_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" cat rgbarray/float_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-32,arch=big] & KillIt echo ".. double little" cat rgbarray/double_little.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" cat rgbarray/double_little.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-64,arch=little] & KillIt echo ".. double big" cat rgbarray/double_big.rgb | ds9 -array -[dim=256,zdim=3,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" cat rgbarray/double_big.rgb.gz | ds9 -array -[dim=256,zdim=3,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # export if [ "$1" = "export" -o -z "$1" ]; then echo "Testing Command export" initit ".. char" testit little [dim=256,zdim=3,bitpix=8] doit rgbarray/char.rgb[dim=256,zdim=3,bitpix=8] initit ".. short little little" testit little [dim=256,zdim=3,bitpix=16,arch=little] doit rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] initit ".. short little big" testit big [dim=256,zdim=3,bitpix=16,arch=big] doit rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] initit ".. short big little" testit little [dim=256,zdim=3,bitpix=16,arch=little] doit rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] initit ".. short big big" testit big [dim=256,zdim=3,bitpix=16,arch=big] doit rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] initit ".. ushort little little" testit little [dim=256,zdim=3,bitpix=-16,arch=little] doit rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] initit ".. ushort little big" testit big [dim=256,zdim=3,bitpix=-16,arch=big] doit rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] initit ".. ushort big little" testit little [dim=256,zdim=3,bitpix=-16,arch=little] doit rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] initit ".. ushort big big" testit big [dim=256,zdim=3,bitpix=-16,arch=big] doit rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] initit ".. int little little" testit little [dim=256,zdim=3,bitpix=32,arch=little] doit rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] initit ".. int little big" testit big [dim=256,zdim=3,bitpix=32,arch=big] doit rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] initit ".. int big little" testit little [dim=256,zdim=3,bitpix=32,arch=little] doit rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] initit ".. int big big" testit big [dim=256,zdim=3,bitpix=32,arch=big] doit rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] initit ".. longlong little little" testit little [dim=256,zdim=3,bitpix=64,arch=little] doit rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] initit ".. longlong little big" testit big [dim=256,zdim=3,bitpix=64,arch=big] doit rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] initit ".. longlong big little" testit little [dim=256,zdim=3,bitpix=64,arch=little] doit rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] initit ".. longlong big big" testit big [dim=256,zdim=3,bitpix=64,arch=big] doit rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] initit ".. float little little" testit little [dim=256,zdim=3,bitpix=-32,arch=little] doit rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] initit ".. float little big" testit big [dim=256,zdim=3,bitpix=-32,arch=big] doit rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] initit ".. float big little" testit little [dim=256,zdim=3,bitpix=-32,arch=little] doit rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] initit ".. float big big" testit big [dim=256,zdim=3,bitpix=-32,arch=big] doit rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] initit ".. double little little" testit little [dim=256,zdim=3,bitpix=-64,arch=little] doit rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] initit ".. double little big" testit big [dim=256,zdim=3,bitpix=-64,arch=big] doit rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] initit ".. double big little" testit little [dim=256,zdim=3,bitpix=-64,arch=little] doit rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] initit ".. double big big" testit big [dim=256,zdim=3,bitpix=-64,arch=big] doit rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 DoXPA ".. char" rgbarray/char.rgb[dim=256,zdim=3,bitpix=8] DoXPA ".. char gzip" rgbarray/char.rgb.gz[dim=256,zdim=3,bitpix=8] DoXPA ".. short little" rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] DoXPA ".. short little gzip" rgbarray/short_little.rgb.gz[dim=256,zdim=3,bitpix=16,arch=little] DoXPA ".. short big" rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] DoXPA ".. short big gzip" rgbarray/short_big.rgb.gz[dim=256,zdim=3,bitpix=16,arch=big] DoXPA ".. ushort little" rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] DoXPA ".. ushort little gzip" rgbarray/ushort_little.rgb.gz[dim=256,zdim=3,bitpix=-16,arch=little] DoXPA ".. ushort big" rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] DoXPA ".. ushort big gzip" rgbarray/ushort_big.rgb.gz[dim=256,zdim=3,bitpix=-16,arch=big] DoXPA ".. int little" rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] DoXPA ".. int little gzip" rgbarray/int_little.rgb.gz[dim=256,zdim=3,bitpix=32,arch=little] DoXPA ".. int big" rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] DoXPA ".. int big gzip" rgbarray/int_big.rgb.gz[dim=256,zdim=3,bitpix=32,arch=big] DoXPA ".. longlong little" rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] DoXPA ".. longlong little gzip" rgbarray/longlong_little.rgb.gz[dim=256,zdim=3,bitpix=64,arch=little] DoXPA ".. longlong big" rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] DoXPA ".. longlong big gzip" rgbarray/longlong_big.rgb.gz[dim=256,zdim=3,bitpix=64,arch=big] DoXPA ".. float little" rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] DoXPA ".. float little gzip" rgbarray/float_little.rgb.gz[dim=256,zdim=3,bitpix=-32,arch=little] DoXPA ".. float big" rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] DoXPA ".. float big gzip" rgbarray/float_big.rgb.gz[dim=256,zdim=3,bitpix=-32,arch=big] DoXPA ".. double little" rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] DoXPA ".. double little gzip" rgbarray/double_little.rgb.gz[dim=256,zdim=3,bitpix=-64,arch=little] DoXPA ".. double big" rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] DoXPA ".. double big gzip" rgbarray/double_big.rgb.gz[dim=256,zdim=3,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi # XPA if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 DoXPAStdin ".. char" rgbarray/char.rgb [dim=256,zdim=3,bitpix=8] DoXPAStdin ".. char gzip" rgbarray/char.rgb.gz [dim=256,zdim=3,bitpix=8] DoXPAStdin ".. short little" rgbarray/short_little.rgb [dim=256,zdim=3,bitpix=16,arch=little] DoXPAStdin ".. short little gzip" rgbarray/short_little.rgb.gz [dim=256,zdim=3,bitpix=16,arch=little] DoXPAStdin ".. short big" rgbarray/short_big.rgb [dim=256,zdim=3,bitpix=16,arch=big] DoXPAStdin ".. short big gzip" rgbarray/short_big.rgb.gz [dim=256,zdim=3,bitpix=16,arch=big] DoXPAStdin ".. ushort little" rgbarray/ushort_little.rgb [dim=256,zdim=3,bitpix=-16,arch=little] DoXPAStdin ".. ushort little gzip" rgbarray/ushort_little.rgb.gz [dim=256,zdim=3,bitpix=-16,arch=little] DoXPAStdin ".. ushort big" rgbarray/ushort_big.rgb [dim=256,zdim=3,bitpix=-16,arch=big] DoXPAStdin ".. ushort big gzip" rgbarray/ushort_big.rgb.gz [dim=256,zdim=3,bitpix=-16,arch=big] DoXPAStdin ".. int little" rgbarray/int_little.rgb [dim=256,zdim=3,bitpix=32,arch=little] DoXPAStdin ".. int little gzip" rgbarray/int_little.rgb.gz [dim=256,zdim=3,bitpix=32,arch=little] DoXPAStdin ".. int big" rgbarray/int_big.rgb [dim=256,zdim=3,bitpix=32,arch=big] DoXPAStdin ".. int big gzip" rgbarray/int_big.rgb.gz [dim=256,zdim=3,bitpix=32,arch=big] DoXPAStdin ".. longlong little" rgbarray/longlong_little.rgb [dim=256,zdim=3,bitpix=64,arch=little] DoXPAStdin ".. longlong little gzip" rgbarray/longlong_little.rgb.gz [dim=256,zdim=3,bitpix=64,arch=little] DoXPAStdin ".. longlong big" rgbarray/longlong_big.rgb [dim=256,zdim=3,bitpix=64,arch=big] DoXPAStdin ".. longlong big gzip" rgbarray/longlong_big.rgb.gz [dim=256,zdim=3,bitpix=64,arch=big] DoXPAStdin ".. float little" rgbarray/float_little.rgb [dim=256,zdim=3,bitpix=-32,arch=little] DoXPAStdin ".. float little gzip" rgbarray/float_little.rgb.gz [dim=256,zdim=3,bitpix=-32,arch=little] DoXPAStdin ".. float big" rgbarray/float_big.rgb [dim=256,zdim=3,bitpix=-32,arch=big] DoXPAStdin ".. float big gzip" rgbarray/float_big.rgb.gz [dim=256,zdim=3,bitpix=-32,arch=big] DoXPAStdin ".. double little" rgbarray/double_little.rgb [dim=256,zdim=3,bitpix=-64,arch=little] DoXPAStdin ".. double little gzip" rgbarray/double_little.rgb.gz [dim=256,zdim=3,bitpix=-64,arch=little] DoXPAStdin ".. double big" rgbarray/double_big.rgb [dim=256,zdim=3,bitpix=-64,arch=big] DoXPAStdin ".. double big gzip" rgbarray/double_big.rgb.gz [dim=256,zdim=3,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 DoXPAStdout ".. char" rgbarray/char.rgb[dim=256,zdim=3,bitpix=8] little [dim=256,zdim=3,bitpix=8] DoXPAStdout ".. short little little" rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] little [dim=256,zdim=3,bitpix=16,arch=little] DoXPAStdout ".. short little big" rgbarray/short_little.rgb[dim=256,zdim=3,bitpix=16,arch=little] big [dim=256,zdim=3,bitpix=16,arch=big] DoXPAStdout ".. short big little" rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] little [dim=256,zdim=3,bitpix=16,arch=little] DoXPAStdout ".. short big big" rgbarray/short_big.rgb[dim=256,zdim=3,bitpix=16,arch=big] big [dim=256,zdim=3,bitpix=16,arch=big] DoXPAStdout ".. ushort little little" rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] little [dim=256,zdim=3,bitpix=-16,arch=little] DoXPAStdout ".. ushort little big" rgbarray/ushort_little.rgb[dim=256,zdim=3,bitpix=-16,arch=little] big [dim=256,zdim=3,bitpix=-16,arch=big] DoXPAStdout ".. ushort big little" rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] little [dim=256,zdim=3,bitpix=-16,arch=little] DoXPAStdout ".. ushort big big" rgbarray/ushort_big.rgb[dim=256,zdim=3,bitpix=-16,arch=big] big [dim=256,zdim=3,bitpix=-16,arch=big] DoXPAStdout ".. int little little" rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] little [dim=256,zdim=3,bitpix=32,arch=little] DoXPAStdout ".. int little big" rgbarray/int_little.rgb[dim=256,zdim=3,bitpix=32,arch=little] big [dim=256,zdim=3,bitpix=32,arch=big] DoXPAStdout ".. int big little" rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] little [dim=256,zdim=3,bitpix=32,arch=little] DoXPAStdout ".. int big big" rgbarray/int_big.rgb[dim=256,zdim=3,bitpix=32,arch=big] big [dim=256,zdim=3,bitpix=32,arch=big] DoXPAStdout ".. longlong little little" rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] little [dim=256,zdim=3,bitpix=64,arch=little] DoXPAStdout ".. longlong little big" rgbarray/longlong_little.rgb[dim=256,zdim=3,bitpix=64,arch=little] big [dim=256,zdim=3,bitpix=64,arch=big] DoXPAStdout ".. longlong big little" rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] little [dim=256,zdim=3,bitpix=64,arch=little] DoXPAStdout ".. longlong big big" rgbarray/longlong_big.rgb[dim=256,zdim=3,bitpix=64,arch=big] big [dim=256,zdim=3,bitpix=64,arch=big] DoXPAStdout ".. float little little" rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] little [dim=256,zdim=3,bitpix=-32,arch=little] DoXPAStdout ".. float little big" rgbarray/float_little.rgb[dim=256,zdim=3,bitpix=-32,arch=little] big [dim=256,zdim=3,bitpix=-32,arch=big] DoXPAStdout ".. float big little" rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] little [dim=256,zdim=3,bitpix=-32,arch=little] DoXPAStdout ".. float big big" rgbarray/float_big.rgb[dim=256,zdim=3,bitpix=-32,arch=big] big [dim=256,zdim=3,bitpix=-32,arch=big] DoXPAStdout ".. double little little" rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] little [dim=256,zdim=3,bitpix=-64,arch=little] DoXPAStdout ".. double little big" rgbarray/double_little.rgb[dim=256,zdim=3,bitpix=-64,arch=little] big [dim=256,zdim=3,bitpix=-64,arch=big] DoXPAStdout ".. double big little" rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] little [dim=256,zdim=3,bitpix=-64,arch=little] DoXPAStdout ".. double big big" rgbarray/double_big.rgb[dim=256,zdim=3,bitpix=-64,arch=big] big [dim=256,zdim=3,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/envi.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000003555 12405641734 015044� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where/what where=envi what=envi save=export # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** ENVI ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/*.b* do echo " ${f#$where/} 1" opt="-$what ${f%.b*}.hdr -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit echo " ${f#$where/} 2" opt="-$what ${f%.b*}.hdr $f -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit done echo "PASSED" fi # Save if [ "$1" = "$save" -o -z "$1" ]; then echo "Testing Command $save" for f in $where/*.b* do echo " ${f#$where/} 1" opt="-tile -$what ${f%.b*}.hdr $f" opt="$opt -$save $what foo.hdr" opt="$opt -frame new -$what foo.hdr -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete" ds9 $opt -exit echo " ${f#$where/} 2" opt="-tile -$what ${f%.b*}.hdr $f" opt="$opt -$save $what foo.hdr foo.bsq" opt="$opt -frame new -$what foo.hdr foo.bsq -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete" ds9 $opt -exit done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 for f in $where/*.b* do echo " ${f#$where/} 1" xpaset -p ds9 $what ${f%.b*}.hdr if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " ${f#$where/} 2" xpaset -p ds9 $what ${f%.b*}.hdr $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ���������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/fits.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000042 12113456764 015037� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������full.sh Fits fits fits save $1 $2 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/fits64.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000000170 12131617434 015204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������export XPA_CONNECT_TIMEOUT=0 export XPA_SHORT_TIMEOUT=-1 export XPA_LONG_TIMEOUT=-1 full.sh Fits large fits save $1 $2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/full.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000004375 12131617434 015042� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where/what which=$1 shift where=$1 shift what=$1 shift save=$1 shift # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** $which ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/* do echo " ${f#$where/}" opt="-$what $f -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit done echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" for f in $where/* do echo " ${f#$where/}" opt="-$what - -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi cat $f | ds9 $opt -exit done echo "PASSED" fi # Save if [ "$1" = "$save" -o -z "$1" ]; then echo "Testing Command $save" for f in $where/* do echo " ${f#$where/}" opt="-tile -$what $f" opt="$opt -$save $what foo.fits" opt="$opt -frame new -$what foo.fits -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete" ds9 $opt -exit done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 $what $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 for f in $where/* do echo " ${f#$where/}" cat $f | xpaset ds9 $what if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 tile xpaset -p ds9 $what $f xpaget ds9 $what > foo.fits xpaset -p ds9 frame new xpaset -p ds9 $what foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/fullrgb.sh�����������������������������������������������������������������������������000755 �000765 �000000 �00000004430 12131617434 015525� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 -frame delete -rgb& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where/what which=$1 shift where=$1 shift what=$1 shift # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** $which ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/* do echo " ${f#$where/}" opt="-$what $f -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit done echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" for f in $where/* do echo " ${f#$where/}" opt="-$what - -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi cat $f | ds9 $opt -exit done echo "PASSED" fi # Save if [ "$1" = "save" -o -z "$1" ]; then echo "Testing Command save" for f in $where/* do echo " ${f#$where/}" opt="-tile -frame delete -rgb -$what $f" opt="$opt -save $what foo.fits" opt="$opt -frame new rgb -$what foo.fits -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete" ds9 $opt -exit done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 $what $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 for f in $where/* do echo " ${f#$where/}" cat $f | xpaset ds9 $what if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 tile xpaset -p ds9 $what $f xpaget ds9 $what > foo.fits xpaset -p ds9 frame new rgb xpaset -p ds9 $what foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/gzip.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000040 12107264737 015041� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������partial.sh GZIP gzip fits $1 $2 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/hcompress.sh���������������������������������������������������������������������������000755 �000765 �000000 �00000000052 12107264737 016076� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������partial.sh HCOMPRESS hcompress fits $1 $2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/incr_load.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000001517 07660243212 016172� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartLoad Frame1 load fits {mosaic image iraf} mosaicimage.fits mmap incr Frame1 load incr data 1 1 1 2080 1000 Frame1 load incr minmax 1 1 1 2080 1000 Frame1 update 1 1 1 2080 1000 Frame1 load incr data 2 1 1 2080 1000 Frame1 load incr minmax 2 1 1 2080 1000 Frame1 update 2 1 1 2080 1000 Frame1 load incr data 3 1 1 2080 1000 Frame1 load incr minmax 3 1 1 2080 1000 Frame1 update 3 1 1 2080 1000 Frame1 load incr data 4 1 1 2080 1000 Frame1 load incr minmax 4 1 1 2080 1000 Frame1 update 4 1 1 2080 1000 Frame1 load incr data 1 1 1 2080 2064 Frame1 update 1 1 1001 2080 2064 Frame1 load incr data 2 1 1 2080 2064 Frame1 update 2 1 1001 2080 2064 Frame1 load incr data 3 1 1 2080 2064 Frame1 update 3 1 1001 2080 2064 Frame1 load incr data 4 1 1 2080 2064 Frame1 update 4 1 1001 2080 2064 Frame1 load incr end FinishLoad ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/io.sh����������������������������������������������������������������������������������000755 �000765 �000000 �00000000450 12160365265 014501� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������fits.sh cube.sh rice.sh hcompress.sh gzip.sh plio.sh #fits64.sh #shm.sh rgbimage.sh rgbcube.sh mecube.sh multiframe.sh mosaic.sh mosaicimage.sh # backward compatibility sfits.sh srgbcube.sh #smosaic.sh #smosaiciraf.sh #smosaicwcs.sh array.sh cubearray.sh rgbarray.sh nrrd.sh envi.sh photo.sh ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/lock.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000003426 12620447551 015030� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** lock.sh ***" if [ "$1" = "frame" -o -z "$1" ]; then echo "Testing frame" ds9 -debug -zscale data/img.fits data/img.fits -tile -lock frame wcs -mode pan fi if [ "$1" = "crosshair" -o -z "$1" ]; then echo "Testing crosshair" ds9 -debug -zscale data/img.fits data/img.fits -tile -lock crosshair wcs -mode crosshair fi if [ "$1" = "crop" -o -z "$1" ]; then echo "Testing crop" ds9 -debug -zscale data/img.fits -rgb data/img.fits -green data/img.fits -blue data/img.fits -tile -lock crop wcs -crop open -mode crop -rgb lock crop yes ds9 -debug -zscale data/3d.fits -3d data/3d.fits -3d vp 45 30 -tile -lock crop wcs -mode crop fi if [ "$1" = "slice" -o -z "$1" ]; then echo "Testing slice" ds9 -debug -zscale data/3d.fits -3d data/3d.fits -3d vp 45 30 -tile -lock slice fi if [ "$1" = "bin" -o -z "$1" ]; then echo "Testing bin" ds9 -debug -zscale fits/table.fits -rgb fits/table.fits -green fits/table.fits -blue fits/table.fits -tile -lock bin -bin open -rgb lock bin yes fi if [ "$1" = "scale" -o -z "$1" ]; then echo "Testing scale" ds9 -debug -zscale data/img.fits -rgb data/img.fits -green data/img.fits -blue data/img.fits -tile -lock scale -scale open -rgb lock scale yes fi if [ "$1" = "color" -o -z "$1" ]; then echo "Testing color" ds9 -debug -zscale data/img.fits data/img.fits -rgb -red data/img.fits -green data/img.fits -blue data/img.fits -rgb lock colorbar yes -rgb -red data/img.fits -green data/img.fits -blue data/img.fits -rgb lock colorbar yes -tile -lock colorbar yes -cmap open fi if [ "$1" = "block" -o -z "$1" ]; then echo "Testing block" ds9 -debug -zscale data/img.fits data/img.fits -tile -lock block -block 4 fi if [ "$1" = "smooth" -o -z "$1" ]; then echo "Testing smooth" ds9 -debug -zscale data/img.fits data/img.fits -tile -lock smooth -smooth fi echo "Done" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/makeregions.sh�������������������������������������������������������������������������000755 �000765 �000000 �00000026661 12131345054 016402� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������doit () { echo "Generating $6 $7 $8 $9 in ${10}" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions load $5 xpaset -p ds9 regions format $6 xpaset -p ds9 regions system $7 xpaset -p ds9 regions sky $8 xpaset -p ds9 regions skyformat $9 xpaset -p ds9 regions save ${10} xpaset -p ds9 regions deleteall } echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done fi echo "Loading Data..." xpaset -p ds9 file data/img.fits echo "DONE" if [ "$1" = "ds9" ]; then echo echo "DS9 Format..." doit ds9 image fk5 degrees regions/ds9.image.reg ds9 physical fk5 degrees regions/ds9.physical.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk4 degrees regions/ds9.fk4.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk4 sexagesimal regions/ds9.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk5 degrees regions/ds9.fk5.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk5 sexagesimal regions/ds9.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs icrs degrees regions/ds9.icrs.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs icrs sexagesimal regions/ds9.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs galactic degrees regions/ds9.galactic.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs galactic sexagesimal regions/ds9.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs ecliptic degrees regions/ds9.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs ecliptic sexagesimal regions/ds9.ecliptic.hms.reg echo echo "XML Format..." doit ds9 image fk5 degrees regions/ds9.image.reg xml image fk5 degrees regions/xml.image.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml physical fk5 degrees regions/xml.physical.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs fk4 degrees regions/xml.fk4.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs fk4 sexagesimal regions/xml.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs fk5 degrees regions/xml.fk5.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs fk5 sexagesimal regions/xml.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs icrs degrees regions/xml.icrs.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs icrs sexagesimal regions/xml.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs galactic degrees regions/xml.galactic.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs galactic sexagesimal regions/xml.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs ecliptic degrees regions/xml.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.image.reg xml wcs ecliptic sexagesimal regions/xml.ecliptic.hms.reg fi if [ "$1" = "ds9strip" ]; then echo xpaset -p ds9 regions strip yes echo "DS9 strip Format..." doit ds9 image fk5 degrees regions/ds9.image.reg ds9 image fk5 degrees regions/ds9.image.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 physical fk5 degrees regions/ds9.physical.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk4 degrees regions/ds9.fk4.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk4 sexagesimal regions/ds9.fk4.hms.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk5 degrees regions/ds9.fk5.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs fk5 sexagesimal regions/ds9.fk5.hms.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs icrs degrees regions/ds9.icrs.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs icrs sexagesimal regions/ds9.icrs.hms.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs galactic degrees regions/ds9.galactic.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs galactic sexagesimal regions/ds9.galactic.hms.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs ecliptic degrees regions/ds9.ecliptic.strip.reg doit ds9 image fk5 degrees regions/ds9.image.reg ds9 wcs ecliptic sexagesimal regions/ds9.ecliptic.hms.strip.reg xpaset -p ds9 regions strip yes fi if [ "$1" = "ciao" ]; then echo echo "DS9 Format..." doit ds9 image fk5 degrees regions/ds9.image.reg ciao physical fk5 degrees regions/ciao.physical.reg doit ds9 image fk5 degrees regions/ds9.image.reg ciao wcs fk5 sexagesimal regions/ciao.fk5.reg fi if [ "$1" = "saotng" ]; then echo echo "SAOtng Format..." doit ds9 image fk5 degrees regions/ds9.image.reg saotng image fk5 degrees regions/saotng.image.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs fk4 degrees regions/saotng.fk4.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs fk4 sexagesimal regions/saotng.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs fk5 degrees regions/saotng.fk5.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs fk5 sexagesimal regions/saotng.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs icrs degrees regions/saotng.icrs.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs icrs sexagesimal regions/saotng.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs galactic degrees regions/saotng.galactic.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs galactic sexagesimal regions/saotng.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs ecliptic degrees regions/saotng.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.image.reg saotng wcs ecliptic sexagesimal regions/saotng.ecliptic.hms.reg fi if [ "$1" = "pros" ]; then echo echo "IRAF Pros Format..." doit ds9 image fk5 degrees regions/ds9.image.reg pros image fk5 degrees regions/pros.image.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros physical fk5 degrees regions/pros.physical.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs fk4 degrees regions/pros.fk4.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs fk4 sexagesimal regions/pros.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs fk5 degrees regions/pros.fk5.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs fk5 sexagesimal regions/pros.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs galactic degrees regions/pros.galactic.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs galactic sexagesimal regions/pros.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs ecliptic degrees regions/pros.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.image.reg pros wcs ecliptic sexagesimal regions/pros.ecliptic.hms.reg fi if [ "$1" = "xy" ]; then echo echo "X Y Format..." doit ds9 image fk5 degrees regions/ds9.image.reg xy image fk5 degrees regions/xy.image.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy physical fk5 degrees regions/xy.physical.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs fk4 degrees regions/xy.fk4.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs fk4 sexagesimal regions/xy.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs fk5 degrees regions/xy.fk5.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs fk5 sexagesimal regions/xy.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs icrs degrees regions/xy.icrs.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs icrs sexagesimal regions/xy.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs galactic degrees regions/xy.galactic.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs galactic sexagesimal regions/xy.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs ecliptic degrees regions/xy.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.image.reg xy wcs ecliptic sexagesimal regions/xy.ecliptic.hms.reg fi if [ "$1" = "mosaic" ]; then echo echo "Loading Mosaic Data..." xpaset -p ds9 frame clear xpaset -p ds9 file mosaicimage mosaic/mosaicimage.fits echo "DONE" echo echo "DS9 Mosaic Format..." doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 physical fk5 degrees regions/ds9.mosaic.physical.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs fk4 degrees regions/ds9.mosaic.fk4.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs fk4 sexagesimal regions/ds9.mosaic.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs fk5 degrees regions/ds9.mosaic.fk5.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs fk5 sexagesimal regions/ds9.mosaic.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs icrs degrees regions/ds9.mosaic.icrs.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs icrs sexagesimal regions/ds9.mosaic.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs galactic degrees regions/ds9.mosaic.galactic.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs galactic sexagesimal regions/ds9.mosaic.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs ecliptic degrees regions/ds9.mosaic.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg ds9 wcs ecliptic sexagesimal regions/ds9.mosaic.ecliptic.hms.reg echo echo "XML Mosaic Format..." doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml image fk5 degrees regions/xml.mosaic.image.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml physical fk5 degrees regions/xml.mosaic.physical.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs fk4 degrees regions/xml.mosaic.fk4.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs fk4 sexagesimal regions/xml.mosaic.fk4.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs fk5 degrees regions/xml.mosaic.fk5.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs fk5 sexagesimal regions/xml.mosaic.fk5.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs icrs degrees regions/xml.mosaic.icrs.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs icrs sexagesimal regions/xml.mosaic.icrs.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs galactic degrees regions/xml.mosaic.galactic.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs galactic sexagesimal regions/xml.mosaic.galactic.hms.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs ecliptic degrees regions/xml.mosaic.ecliptic.reg doit ds9 image fk5 degrees regions/ds9.mosaic.image.reg xml wcs ecliptic sexagesimal regions/xml.mosaic.ecliptic.hms.reg fi if [ "$1" = "linear" ]; then echo echo "Loading Linear Data..." xpaset -p ds9 scale minmax xpaset -p ds9 frame clear xpaset -p ds9 file mosaicimage mosaic/ds9_8amp_2x2.fits echo "DONE" echo echo "DS9 Linear Format..." doit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg ds9 wcsa fk5 degrees regions/ds9.linear.wcsa.reg doit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg ds9 wcsc fk5 degrees regions/ds9.linear.wcsc.reg doit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg ds9 wcsd fk5 degrees regions/ds9.linear.wcsd.reg doit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg ds9 wcsi fk5 degrees regions/ds9.linear.wcsi.reg doit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg ds9 wcsp fk5 degrees regions/ds9.linear.wcsp.reg fi xpaset -p ds9 quit �������������������������������������������������������������������������������saods9/tests/matrix.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000000254 12131345054 015370� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** matrix.sh ***" echo "test panner,center,zoom" ds9 data/5x5.fits echo "PASSED" echo "testing DATASEC" ds9 mosaic/ds9_2amp.fits echo "PASSED" echo "Done" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/mecube.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000000065 12113456764 015337� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������full.sh "Multiple Ext Cube" mecube mecube save $1 $2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/mosaic.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000011442 12131345761 015345� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** Mosaic Image ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" echo " -mosaic" ds9 -mosaic mosaic/mosaicimage.fits & KillIt echo " -mosaic wcs" ds9 -mosaic wcs mosaic/mosaicimage.fits & KillIt echo " -mosaicwcs" ds9 -mosaicwcs mosaic/mosaicimage.fits & KillIt echo " -mosaic iraf" ds9 -mosaic iraf mosaic/mosaicimage.fits & KillIt echo " -mosaiciraf" ds9 -mosaiciraf mosaic/mosaicimage.fits & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" echo " -mosaic" cat mosaic/mosaicimage.fits | ds9 -mosaic -& KillIt echo " -mosaic wcs" cat mosaic/mosaicimage.fits | ds9 -mosaic wcs -& KillIt echo " -mosaicwcs" cat mosaic/mosaicimage.fits | ds9 -mosaicwcs -& KillIt echo " -mosaic iraf" cat mosaic/mosaicimage.fits | ds9 -mosaic iraf -& KillIt echo " -mosaiciraf" cat mosaic/mosaicimage.fits | ds9 -mosaiciraf -& KillIt echo "PASSED" fi # Save if [ "$1" = "save" -o -z "$1" ]; then echo "Testing Command Save" echo " -mosaic" opt="" opt="$opt -save mosaic foo.fits -sleep .1" opt="$opt -frame new -mosaic foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaic mosaic/mosaicimage.fits "$opt" -exit echo " -mosaic wcs" opt="" opt="$opt -save mosaic wcs foo.fits -sleep .1" opt="$opt -frame new -mosaic wcs foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaic wcs mosaic/mosaicimage.fits "$opt" -exit echo " -mosaicwcs" opt="" opt="$opt -save mosaicwcs foo.fits -sleep .1" opt="$opt -frame new -mosaicwcs foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaicwcs mosaic/mosaicimage.fits "$opt" -exit echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 echo " -mosaic" xpaset -p ds9 mosaic mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaic wcs" xpaset -p ds9 mosaic wcs mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicwcs" xpaset -p ds9 mosaicwcs mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaic iraf" xpaset -p ds9 mosaic iraf mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaiciraf" xpaset -p ds9 mosaiciraf mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 echo " -mosaic" cat mosaic/mosaicimage.fits | xpaset ds9 mosaic if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaic wcs" cat mosaic/mosaicimage.fits | xpaset ds9 mosaic wcs if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicwcs" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicwcs if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaic iraf" cat mosaic/mosaicimage.fits | xpaset ds9 mosaic iraf if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaiciraf" cat mosaic/mosaicimage.fits | xpaset ds9 mosaiciraf if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 echo " -mosaic" xpaset -p ds9 tile xpaset -p ds9 mosaic mosaic/mosaicimage.fits xpaget ds9 mosaic > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaic foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear echo " -mosaic wcs" xpaset -p ds9 tile xpaset -p ds9 mosaic wcs mosaic/mosaicimage.fits xpaget ds9 mosaic wcs > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaic wcs foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear echo " -mosaicwcs" xpaset -p ds9 tile xpaset -p ds9 mosaicwcs mosaic/mosaicimage.fits xpaget ds9 mosaicwcs > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaicwcs foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/mosaicimage.sh�������������������������������������������������������������������������000755 �000765 �000000 �00000013724 12131345761 016355� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** Mosaic Image ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" echo " -mosaicimage" ds9 -mosaicimage mosaic/mosaicimage.fits & KillIt echo " -mosaicimage wcs" ds9 -mosaicimage wcs mosaic/mosaicimage.fits & KillIt echo " -mosaicimagewcs" ds9 -mosaicimagewcs mosaic/mosaicimage.fits & KillIt echo " -mosaicimage iraf" ds9 -mosaicimage iraf mosaic/mosaicimage.fits & KillIt echo " -mosaicimageiraf" ds9 -mosaicimageiraf mosaic/mosaicimage.fits & KillIt echo " -mosaicimage wfpc2" ds9 -mosaicimage wfpc2 mosaic/hst.fits & KillIt echo " -mosaicimagewfpc2" ds9 -mosaicimagewfpc2 mosaic/hst.fits & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" echo " -mosaicimage" cat mosaic/mosaicimage.fits | ds9 -mosaicimage -& KillIt echo " -mosaicimage wcs" cat mosaic/mosaicimage.fits | ds9 -mosaicimage wcs -& KillIt echo " -mosaicimagewcs" cat mosaic/mosaicimage.fits | ds9 -mosaicimagewcs -& KillIt echo " -mosaicimage iraf" cat mosaic/mosaicimage.fits | ds9 -mosaicimage iraf -& KillIt echo " -mosaicimageiraf" cat mosaic/mosaicimage.fits | ds9 -mosaicimageiraf -& KillIt echo " -mosaicimage wfpc2" cat mosaic/hst.fits | ds9 -mosaicimage wfpc2 -& KillIt echo " -mosaicimagewfpc2" cat mosaic/hst.fits | ds9 -mosaicimagewfpc2 -& KillIt echo "PASSED" fi # Save if [ "$1" = "save" -o -z "$1" ]; then echo "Testing Command Save" echo " -mosaicimage" opt="" opt="$opt -save mosaicimage foo.fits -sleep .1" opt="$opt -frame new -mosaicimage foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaicimage mosaic/mosaicimage.fits "$opt" -exit echo " -mosaicimage wcs" opt="" opt="$opt -save mosaicimage wcs foo.fits -sleep .1" opt="$opt -frame new -mosaicimage wcs foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaicimage wcs mosaic/mosaicimage.fits "$opt" -exit echo " -mosaicimagewcs" opt="" opt="$opt -save mosaicimagewcs foo.fits -sleep .1" opt="$opt -frame new -mosaicimagewcs foo.fits" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" eval ds9 -tile -mosaicimagewcs mosaic/mosaicimage.fits "$opt" -exit echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 echo " -mosaicimage" xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage wcs" xpaset -p ds9 mosaicimage wcs mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimagewcs" xpaset -p ds9 mosaicimagewcs mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage iraf" xpaset -p ds9 mosaicimage iraf mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimageiraf" xpaset -p ds9 mosaicimageiraf mosaic/mosaicimage.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage wfpc2" xpaset -p ds9 mosaicimage wfpc2 mosaic/hst.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimagewfpc2" xpaset -p ds9 mosaicimagewfpc2 mosaic/hst.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 echo " -mosaicimage" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimage if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage wcs" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimage wcs if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimagewcs" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimagewcs if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage iraf" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimage iraf if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimageiraf" cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimageiraf if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimage wfpc2" cat mosaic/hst.fits | xpaset ds9 mosaicimage wfpc2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo " -mosaicimagewfpc2" cat mosaic/hst.fits | xpaset ds9 mosaicimagewfpc2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 echo " -mosaicimage" xpaset -p ds9 tile xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits xpaget ds9 mosaicimage > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaicimage foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear echo " -mosaicimage wcs" xpaset -p ds9 tile xpaset -p ds9 mosaicimage wcs mosaic/mosaicimage.fits xpaget ds9 mosaicimage wcs > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaicimage wcs foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear echo " -mosaicimagewcs" xpaset -p ds9 tile xpaset -p ds9 mosaicimagewcs mosaic/mosaicimage.fits xpaget ds9 mosaicimagewcs > foo.fits xpaset -p ds9 frame new xpaset -p ds9 mosaicimagewcs foo.fits if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ��������������������������������������������saods9/tests/multiframe.sh��������������������������������������������������������������������������000755 �000765 �000000 �00000003125 12131345054 016231� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where which=Multiframe where=mecube what=multiframe # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** $which ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/* do echo " ${f#$where/}" ds9 -$what $f & KillIt done echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" for f in $where/* do echo " ${f#$where/}" cat $f | ds9 -$what - & KillIt done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 xpaset -p ds9 frame delete all for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 $what $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete all done xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 xpaset -p ds9 frame delete all for f in $where/* do echo " ${f#$where/}" cat $f | xpaset ds9 $what if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete all done xpaset -p ds9 quit echo "PASSED" fi echo "DONE" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/nrrd.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000044 12113456764 015041� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������full.sh NRRD nrrd nrrd export $1 $2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/parse.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000006021 12221341330 015165� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** parse.sh ***" echo ".. base" ds9 -log fits/table.fits & KillIt echo ".. [2]" ds9 -log fits/table.fits[2] & KillIt echo ".. [STDEVT]" ds9 -log fits/table.fits[STDEVT] & KillIt echo ".. [xmin:xmax,ymin:ymax]" ds9 -zscale data/img.fits[100:300,100:300] & KillIt echo ".. [xmin:xmax,*]" ds9 -zscale data/img.fits[100:300,*] & KillIt echo ".. [dim@xcen@ycen]" ds9 -zscale data/img.fits[256@400@400] & KillIt echo ".. [bin=rawx,rawy]" ds9 -log fits/table.fits[bin=rawx,rawy] & KillIt echo ".. [STDEVT][xmin:xmax,ymin:ymax]" ds9 -log fits/table.fits[STDEVT][100:300,100:300] & KillIt echo ".. [STDEVT][bin=rawx,rawy]" ds9 -log fits/table.fits[STDEVT][bin=rawx,rawy] & KillIt echo ".. [STDEVT][bin=(rawx,rawy)]" ds9 -log 'fits/table.fits[STDEVT][bin=(rawx,rawy)]' & KillIt echo ".. [STDEVT][xmin:xmax,ymin:ymax][bin=rawx,rawy]" ds9 -log fits/table.fits[STDEVT][100:300,100:300][bin=rawx,rawy] & KillIt echo ".. [2,xmin:xmax,ymin:ymax]" ds9 -log fits/table.fits[2,100:300,100:300] & KillIt echo ".. [STDEVT,xmin:xmax,ymin:ymax]" ds9 -log fits/table.fits[STDEVT,100:300,100:300] & KillIt echo ".. [STDEVT,bin=rawx,rawy]" ds9 -log fits/table.fits[STDEVT,bin=rawx,rawy] & KillIt echo ".. [filter]" ds9 -log 'fits/table.fits[pha<5]' & KillIt echo ".. [STDEVT][filter]" ds9 -log 'fits/table.fits[STDEVT][pha<5]' & KillIt echo ".. array[xdim=256,ydim=256,bitpix=-32,arch=little,skip=0]" ds9 -array array/float_little.arr[xdim=256,ydim=256,bitpix=-32,arch=little,skip=0] & KillIt echo ".. array[dim=256,bitpix=-32,endian=little]" ds9 -array array/float_little.arr[dim=256,bitpix=-32,endian=little] & KillIt echo ".. array[dim=256,bitpix=-32,little]" ds9 -array array/float_little.arr[dim=256,bitpix=-32,little] & KillIt echo ".. array[dim=256,bitpix=-32,little][100:200,100:200]" ds9 -array array/float_little.arr[dim=256,bitpix=-32,little][100:200,100:200] & KillIt echo ".. array[array(r256l)]" ds9 -array 'array/float_little.arr[array(r256l)]' & KillIt echo ".. array[array(r256.256:0l)]" ds9 -array 'array/float_little.arr[array(r256.256:0l)]' & KillIt echo ".. hpx" ds9 fits/wmap.fits & KillIt echo ".. hpx[100:200,100:200]" ds9 fits/wmap.fits[100:200,100:200] & KillIt echo ".. hpx[system=equatorial,order=nested,layout=equatorial,col=1,quad=1]" ds9 fits/wmap.fits[system=equatorial,order=nested,layout=equatorial,col=1,quad=1] & KillIt echo ".. nrrd[100:200,100:200]" ds9 -nrrd nrrd/float_big_raw.nrrd[100:200,100:200] & KillIt echo ".. envi[100:200,100:200]" ds9 -envi envi/float_big.hdr envi/float_big.bsq[100:200,100:200] & KillIt echo "DONE" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/partial.sh�����������������������������������������������������������������������������000755 �000765 �000000 �00000002672 12131617434 015532� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where which=$1 shift where=$1 shift what=$1 shift # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** $which ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/* do echo " ${f#$where/}" opt="-$what $f -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit done echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Stdin File" for f in $where/* do echo " ${f#$where/}" opt="-$what - -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi cat $f | ds9 $opt -exit done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 for f in $where/* do echo " ${f#$where/}" xpaset -p ds9 $what $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 for f in $where/* do echo " ${f#$where/}" cat $f | xpaset ds9 $what if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi echo "DONE" ����������������������������������������������������������������������saods9/tests/photo.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000012551 12131345761 015225� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } DoXPA () { echo "$1" xpaset -p ds9 $2 $3 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdin () { echo "$1" cat $3 | xpaset ds9 $2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdout () { echo ".. $2" xpaset -p ds9 tile xpaget ds9 $2 > foo.$2 xpaset -p ds9 frame new $1 xpaset -p ds9 $2 foo.$2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete } initit () { echo "Testing $1" unset opt } testit () { echo "$2" opt="$opt -export $2 foo.$2 $3 -sleep .1" opt="$opt -frame new $1 foo.$2" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" } doit () { eval ds9 -tile $1 -tiff photo/rose.tiff "$opt" -exit echo "PASSED" } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** photo.sh ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" echo ".. base" echo ".. gif" ds9 -gif photo/rose.gif & KillIt echo ".. tiff" ds9 -tiff photo/rose.tiff & KillIt echo ".. jpeg" ds9 -jpeg photo/rose.jpeg & KillIt echo ".. png" ds9 -png photo/rose.png & KillIt echo ".. # backward compatibility" echo ".. -photo" ds9 -photo photo/rose.tiff & KillIt echo ".. rgb" echo ".. gif" ds9 -rgb -gif photo/rose.gif & KillIt echo ".. tiff" ds9 -rgb -tiff photo/rose.tiff & KillIt echo ".. jpeg" ds9 -rgb -jpeg photo/rose.jpeg & KillIt echo ".. png" ds9 -rgb -png photo/rose.png & KillIt echo ".. # backward compatibility" echo ".. -photo" ds9 -rgb -photo photo/rose.tiff & KillIt echo ".. 3d" echo ".. gif" ds9 -3d -gif photo/rose.gif & KillIt echo ".. tiff" ds9 -3d -tiff photo/rose.tiff & KillIt echo ".. jpeg" ds9 -3d -jpeg photo/rose.jpeg & KillIt echo ".. png" ds9 -3d -png photo/rose.png & KillIt echo ".. # backward compatibility" echo ".. -photo" ds9 -3d -photo photo/rose.tiff & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Command Stdin" echo ".. base" echo ".. gif" cat photo/rose.gif | ds9 -gif - & KillIt echo ".. tiff" cat photo/rose.tiff | ds9 -tiff - & KillIt echo ".. jpeg" cat photo/rose.jpeg | ds9 -jpeg - & KillIt echo ".. png" cat photo/rose.png | ds9 -png - & KillIt echo ".. rgb" echo ".. gif" cat photo/rose.gif | ds9 -rgb -gif - & KillIt echo ".. tiff" cat photo/rose.tiff | ds9 -rgb -tiff - & KillIt echo ".. jpeg" cat photo/rose.jpeg | ds9 -rgb -jpeg - & KillIt echo ".. png" cat photo/rose.png | ds9 -rgb -png - & KillIt echo ".. 3d" echo ".. gif" cat photo/rose.gif | ds9 -3d -gif - & KillIt echo ".. tiff" cat photo/rose.tiff | ds9 -3d -tiff - & KillIt echo ".. jpeg" cat photo/rose.jpeg | ds9 -3d -jpeg - & KillIt echo ".. png" cat photo/rose.png | ds9 -3d -png - & KillIt echo "PASSED" fi # export if [ "$1" = "export" -o -z "$1" ]; then echo "Testing Command export" initit ".. base" testit "" gif testit "" tiff testit "" tiff none testit "" jpeg testit "" jpeg 100 testit "" png doit "" initit ".. rgb" #testit rgb gif testit rgb tiff testit rgb tiff none testit rgb jpeg testit rgb jpeg 100 testit rgb png doit "-frame delete -rgb" fi # XPA File if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 echo ".. base" DoXPA ".. gif" gif photo/rose.gif DoXPA ".. jpeg" jpeg photo/rose.jpeg DoXPA ".. tiff" tiff photo/rose.tiff DoXPA ".. png" png photo/rose.png echo ".. rgb" xpaset -p ds9 rgb DoXPA ".. gif" gif photo/rose.gif DoXPA ".. jpeg" jpeg photo/rose.jpeg DoXPA ".. tiff" tiff photo/rose.tiff DoXPA ".. png" png photo/rose.png echo ".. 3d" xpaset -p ds9 3d DoXPA ".. gif" gif photo/rose.gif DoXPA ".. jpeg" jpeg photo/rose.jpeg DoXPA ".. tiff" tiff photo/rose.tiff DoXPA ".. png" png photo/rose.png xpaset -p ds9 quit echo "PASSED" fi # XPA stdin if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 echo ".. base" DoXPAStdin ".. gif" gif photo/rose.gif DoXPAStdin ".. jpeg" jpeg photo/rose.jpeg DoXPAStdin ".. tiff" tiff photo/rose.tiff DoXPAStdin ".. png" png photo/rose.png echo ".. rgb" xpaset -p ds9 rgb DoXPAStdin ".. gif" gif photo/rose.gif DoXPAStdin ".. jpeg" jpeg photo/rose.jpeg DoXPAStdin ".. tiff" tiff photo/rose.tiff DoXPAStdin ".. png" png photo/rose.png echo ".. 3d" xpaset -p ds9 3d DoXPAStdin ".. gif" gif photo/rose.gif DoXPAStdin ".. jpeg" jpeg photo/rose.jpeg DoXPAStdin ".. tiff" tiff photo/rose.tiff DoXPAStdin ".. png" png photo/rose.png xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 echo ".. base" xpaset -p ds9 tiff photo/rose.tiff DoXPAStdout "" gif DoXPAStdout "" jpeg DoXPAStdout "" tiff DoXPAStdout "" png echo ".. rgb" xpaset -p ds9 frame delete xpaset -p ds9 rgb xpaset -p ds9 tiff photo/rose.tiff # not enough colors #DoXPAStdout rgb gif DoXPAStdout rgb jpeg DoXPAStdout rgb tiff DoXPAStdout rgb png xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" �������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plio.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000040 12107264737 015033� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������partial.sh PLIO plio fits $1 $2 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 014506� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000022445 12115164572 015056� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9 -tcl& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi echo echo "*** plot.sh ***" delay=.5 echo -n "stdin 2|3|4|5..." cat plot/stdin.2.dat | xpaset ds9 plot new stdin cat plot/stdin.3.dat | xpaset ds9 plot new stdin cat plot/stdin.4.dat | xpaset ds9 plot new stdin cat plot/stdin.5.dat | xpaset ds9 plot new stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.2.dat | xpaset ds9 plot new bar stdin cat plot/stdin.3.dat | xpaset ds9 plot new bar stdin cat plot/stdin.4.dat | xpaset ds9 plot new bar stdin cat plot/stdin.5.dat | xpaset ds9 plot new bar stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.2.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.3.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.4.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.5.dat | xpaset ds9 plot new scatter stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "named stdin 2|3|4|5..." cat plot/stdin.2.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.3.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.4.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.5.dat | xpaset ds9 plot new name foo stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.2.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.3.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.4.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.5.dat | xpaset ds9 plot new name foo bar stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.2.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.3.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.4.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.5.dat | xpaset ds9 plot new name foo scatter stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "stdin xy|xyex|xyey|xyexey..." cat plot/stdin.xy.dat | xpaset ds9 plot new stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.xy.dat | xpaset ds9 plot new bar stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new bar stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new bar stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new bar stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.xy.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new scatter stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new scatter stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "named stdin xy|xyex|xyey|xyexey..." cat plot/stdin.xy.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new name foo stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.xy.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new name foo bar stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new name foo bar stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/stdin.xy.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.xyex.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.xyey.dat | xpaset ds9 plot new name foo scatter stdin cat plot/stdin.xyexey.dat | xpaset ds9 plot new name foo scatter stdin sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "stdin text|error..." cat plot/stdin.error.dat | xpaset ds9 plot new stdin cat plot/stdin.text.dat | xpaset ds9 plot new stdin sleep "$delay" xpaset -p ds9 plot close echo "PASSED" echo -n "named stdin text|error..." cat plot/stdin.error.dat | xpaset ds9 plot new name foo stdin cat plot/stdin.text.dat | xpaset ds9 plot new name foo stdin sleep "$delay" xpaset -p ds9 plot close echo "PASSED" echo -n "4|5..." cat plot/4.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/4.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/4.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "named 4|5..." cat plot/4.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/4.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/4.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" 4 cat plot/5.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" 5 sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "xy|xyex|xyey|xyexey..." cat plot/xy.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/xy.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new bar "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/xy.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new scatter "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n "name xy|xyex|xyey|xyexey..." cat plot/xy.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/xy.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close cat plot/xy.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" xy cat plot/xyex.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" xyex cat plot/xyey.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" xyey cat plot/xyexey.dat | xpaset ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" xyexey sleep "$delay" xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" xpaset -p ds9 quit echo "DONE" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 014647� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000000600 12073112720 015173� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "Prefs Tests" doit() { if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ]; do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } echo echo "*** prefs.sh ***" for f in prefs/*.prf do echo "Testing $f" rm -f ~/.ds9.prf cp $f ~/.ds9.prf doit xpaset -p ds9 exit rm -f ~/.ds9.prf echo "PASSED" done ��������������������������������������������������������������������������������������������������������������������������������saods9/tests/print.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000003460 12131316277 015227� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** print.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi doit() { echo $1 xpaset -p ds9 psprint palette $2 xpaset -p ds9 psprint level $3 xpaset -p ds9 psprint filename ps/ds9-$4-$2-$3.ps xpaset -p ds9 psprint } rm -rf ps mkdir ps xpaset -p ds9 scale zscale #xpaset -p ds9 psprint command '{gv -}' xpaset -p ds9 psprint destination file xpaset -p ds9 grid if [ "$1" = "single" -o -z "$1" ]; then echo "Testing Single" xpaset -p ds9 fits data/img.fits xpaset -p ds9 regions load regions/ds9.fk5.hms.reg doit "..RGB Level 3" rgb 3 b doit "..CMYK Level 3" cmyk 3 b doit "..Gray Level 3" gray 3 b doit "..RGB Level 2" rgb 2 b doit "..CMYK Level 2" cmyk 2 b doit "..Gray Level 2" gray 2 b doit "..RGB Level 1" rgb 1 b doit "..Gray Level 1" gray 1 b echo "PASSED" fi if [ "$1" = "mosaic" -o -z "$1" ]; then echo "Testing Mosaic" xpaset -p ds9 mosaicimage iraf mosaic/mosaicimage.fits xpaset -p ds9 regions load regions/ds9.mosaic.fk5.hms.reg doit "..RGB Level 3" rgb 3 m doit "..CMYK Level 3" cmyk 3 m doit "..Gray Level 3" gray 3 m doit "..RGB Level 2" rgb 2 m doit "..CMYK Level 2" cmyk 2 m doit "..Gray Level 2" gray 2 m doit "..RGB Level 1" rgb 1 m doit "..Gray Level 1" gray 1 m echo "PASSED" fi if [ "$1" = "rgb" -o -z "$1" ]; then echo "Testing RGB" xpaset -p ds9 rgb xpaset -p ds9 rgbcube rgbcube/float.fits doit "..RGB Level 3" rgb 3 r doit "..CMYK Level 3" cmyk 3 r doit "..Gray Level 3" gray 3 r doit "..RGB Level 2" rgb 2 r doit "..CMYK Level 2" cmyk 2 r doit "..Gray Level 2" gray 2 r doit "..RGB Level 1" rgb 1 r doit "..Gray Level 1" gray 1 r echo "PASSED" fi echo "DONE" if [ -z "$1" ]; then xpaset -p ds9 quit fi ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/regions.sh�����������������������������������������������������������������������������000755 �000765 �000000 �00000024011 12230046432 015525� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������testit () { echo "Test $1 $2 $3 $4 $5" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 xpaset -p ds9 regions save ${5}.out if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall o=`diff $5 ${5}.out` if [ "$o" = "" ] then echo "PASSED" else echo "FAILED" echo "$o" fi rm -f ${5}.out } testit2 () { echo "Test $1 $2 $3 $4 $5 $6" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 xpaset -p ds9 regions save ${5}.out if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall o=`diff $6 ${5}.out` if [ "$o" = "" ] then echo "PASSED" else echo "FAILED" echo "$o" fi rm -f ${5}.out } testit3 () { echo "Test $1 $2 $3 $4 $5" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall echo "PASSED" } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** regions.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done fi echo "Loading Data..." xpaset -p ds9 fits data/img.fits if [ "$1" = "ds9" -o -z "$1" ]; then echo echo "Testing DS9 Format..." testit ds9 image fk5 degrees regions/ds9.image.reg testit ds9 physical fk5 degrees regions/ds9.physical.reg testit ds9 wcs fk4 degrees regions/ds9.fk4.reg testit ds9 wcs fk4 sexagesimal regions/ds9.fk4.hms.reg testit ds9 wcs fk5 degrees regions/ds9.fk5.reg testit ds9 wcs fk5 sexagesimal regions/ds9.fk5.hms.reg testit ds9 wcs icrs degrees regions/ds9.icrs.reg testit ds9 wcs icrs sexagesimal regions/ds9.icrs.hms.reg testit ds9 wcs galactic degrees regions/ds9.galactic.reg testit ds9 wcs galactic sexagesimal regions/ds9.galactic.hms.reg testit ds9 wcs ecliptic degrees regions/ds9.ecliptic.reg testit ds9 wcs ecliptic sexagesimal regions/ds9.ecliptic.hms.reg echo echo "Testing DS9 Color..." testit ds9 wcs fk5 sexagesimal regions/ds9.color.reg echo echo "Testing XML Format..." testit xml image fk5 degrees regions/xml.image.reg testit xml physical fk5 degrees regions/xml.physical.reg testit xml wcs fk4 degrees regions/xml.fk4.reg testit xml wcs fk4 sexagesimal regions/xml.fk4.hms.reg testit xml wcs fk5 degrees regions/xml.fk5.reg testit xml wcs fk5 sexagesimal regions/xml.fk5.hms.reg testit xml wcs icrs degrees regions/xml.icrs.reg testit xml wcs icrs sexagesimal regions/xml.icrs.hms.reg testit xml wcs galactic degrees regions/xml.galactic.reg testit xml wcs galactic sexagesimal regions/xml.galactic.hms.reg testit xml wcs ecliptic degrees regions/xml.ecliptic.reg testit xml wcs ecliptic sexagesimal regions/xml.ecliptic.hms.reg fi if [ "$1" = "comment" -o -z "$1" ]; then echo echo "Testing DS9 Format Comments..." xpaset -p ds9 regions format ds9 xpaset -p ds9 regions file regions/ds9.comment.reg xpaset -p ds9 regions deleteall echo "PASSED" fi if [ "$1" = "ds9strip" -o -z "$1" ]; then echo xpaset -p ds9 regions strip yes echo "Testing ds9 strip Regions Format..." testit2 ds9 image fk5 degrees regions/ds9.image.reg regions/ds9.image.strip.reg testit2 ds9 physical fk5 degrees regions/ds9.physical.reg regions/ds9.physical.strip.reg testit2 ds9 wcs fk4 degrees regions/ds9.fk4.reg regions/ds9.fk4.strip.reg testit2 ds9 wcs fk4 sexagesimal regions/ds9.fk4.hms.reg regions/ds9.fk4.hms.strip.reg testit2 ds9 wcs fk5 degrees regions/ds9.fk5.reg regions/ds9.fk5.strip.reg testit2 ds9 wcs fk5 sexagesimal regions/ds9.fk5.hms.reg regions/ds9.fk5.hms.strip.reg testit2 ds9 wcs icrs degrees regions/ds9.icrs.reg regions/ds9.icrs.strip.reg testit2 ds9 wcs icrs sexagesimal regions/ds9.icrs.hms.reg regions/ds9.icrs.hms.strip.reg testit2 ds9 wcs galactic degrees regions/ds9.galactic.reg regions/ds9.galactic.strip.reg testit2 ds9 wcs galactic sexagesimal regions/ds9.galactic.hms.reg regions/ds9.galactic.hms.strip.reg testit2 ds9 wcs ecliptic degrees regions/ds9.ecliptic.reg regions/ds9.ecliptic.strip.reg testit2 ds9 wcs ecliptic sexagesimal regions/ds9.ecliptic.hms.reg regions/ds9.ecliptic.hms.strip.reg xpaset -p ds9 regions strip no fi if [ "$1" = "ciao" -o -z "$1" ]; then echo echo "Testing CIAO Format..." testit ciao physical fk5 degrees regions/ciao.physical.reg testit ciao wcs fk5 sexagesimal regions/ciao.fk5.reg fi if [ "$1" = "saotng" -o -z "$1" ]; then echo echo "Testing SAOtng Format..." testit saotng image fk5 degrees regions/saotng.image.reg testit saotng wcs fk4 degrees regions/saotng.fk4.reg testit saotng wcs fk4 sexagesimal regions/saotng.fk4.hms.reg testit saotng wcs fk5 degrees regions/saotng.fk5.reg testit saotng wcs fk5 sexagesimal regions/saotng.fk5.hms.reg testit saotng wcs icrs degrees regions/saotng.icrs.reg testit saotng wcs icrs sexagesimal regions/saotng.icrs.hms.reg testit saotng wcs galactic degrees regions/saotng.galactic.reg testit saotng wcs galactic sexagesimal regions/saotng.galactic.hms.reg testit saotng wcs ecliptic degrees regions/saotng.ecliptic.reg testit saotng wcs ecliptic sexagesimal regions/saotng.ecliptic.hms.reg fi if [ "$1" = "pros" -o -z "$1" ]; then echo echo "Testing IRAF Pros Format..." testit pros image fk5 degrees regions/pros.image.reg testit pros physical fk5 degrees regions/pros.physical.reg testit pros wcs fk4 degrees regions/pros.fk4.reg testit pros wcs fk4 sexagesimal regions/pros.fk4.hms.reg testit pros wcs fk5 degrees regions/pros.fk5.reg testit pros wcs fk5 sexagesimal regions/pros.fk5.hms.reg testit pros wcs galactic degrees regions/pros.galactic.reg testit pros wcs galactic sexagesimal regions/pros.galactic.hms.reg testit pros wcs ecliptic degrees regions/pros.ecliptic.reg testit pros wcs ecliptic sexagesimal regions/pros.ecliptic.hms.reg fi if [ "$1" = "saoimage" -o -z "$1" ]; then echo echo "Testing SAOimage Format..." testit saoimage image fk5 degrees regions/saoimage.reg fi if [ "$1" = "xy" -o -z "$1" ]; then echo echo "Testing X Y Format..." testit xy image fk5 degrees regions/xy.image.reg testit xy physical fk5 degrees regions/xy.physical.reg testit xy wcs fk4 degrees regions/xy.fk4.reg testit xy wcs fk4 sexagesimal regions/xy.fk4.hms.reg testit xy wcs fk5 degrees regions/xy.fk5.reg testit xy wcs fk5 sexagesimal regions/xy.fk5.hms.reg testit xy wcs icrs degrees regions/xy.icrs.reg testit xy wcs icrs sexagesimal regions/xy.icrs.hms.reg testit xy wcs galactic degrees regions/xy.galactic.reg testit xy wcs galactic sexagesimal regions/xy.galactic.hms.reg testit xy wcs ecliptic degrees regions/xy.ecliptic.reg testit xy wcs ecliptic sexagesimal regions/xy.ecliptic.hms.reg fi if [ "$1" = "windows" -o -z "$1" ]; then echo echo "Testing Windows /CR/NL Format..." testit3 ds9 physical fk5 degrees regions/ds9.physical.windows.reg testit3 ciao physical fk5 degrees regions/ciao.physical.windows.reg testit3 saotng image fk5 degrees regions/saotng.image.windows.reg testit3 saoimage image fk5 degrees regions/saoimage.windows.reg testit3 pros physical fk5 degrees regions/pros.physical.windows.reg testit3 xy physical fk5 degrees regions/xy.physical.windows.reg fi if [ "$1" = "composite" -o -z "$1" ]; then echo echo "Loading Composite Data..." testit ds9 wcs fk5 degrees regions/ds9.composite.reg fi if [ "$1" = "fits" -o -z "$1" ]; then echo echo "Testing FITS Regions Format..." testit2 ds9 physical fk5 degrees regions/ds9.reg.fits regions/ds9.fits.reg fi if [ "$1" = "mosaic" -o -z "$1" ]; then echo echo "Loading Mosaic Data..." xpaset -p ds9 frame clear xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 zoom .5 echo echo "Testing DS9 Mosaic Format..." testit ds9 image fk5 degrees regions/ds9.mosaic.image.reg testit ds9 physical fk5 degrees regions/ds9.mosaic.physical.reg testit ds9 wcs fk4 degrees regions/ds9.mosaic.fk4.reg testit ds9 wcs fk4 sexagesimal regions/ds9.mosaic.fk4.hms.reg testit ds9 wcs fk5 degrees regions/ds9.mosaic.fk5.reg testit ds9 wcs fk5 sexagesimal regions/ds9.mosaic.fk5.hms.reg testit ds9 wcs icrs degrees regions/ds9.mosaic.icrs.reg testit ds9 wcs icrs sexagesimal regions/ds9.mosaic.icrs.hms.reg testit ds9 wcs galactic degrees regions/ds9.mosaic.galactic.reg testit ds9 wcs galactic sexagesimal regions/ds9.mosaic.galactic.hms.reg testit ds9 wcs ecliptic degrees regions/ds9.mosaic.ecliptic.reg testit ds9 wcs ecliptic sexagesimal regions/ds9.mosaic.ecliptic.hms.reg echo echo "Testing XML Mosaic Format..." testit xml image fk5 degrees regions/xml.mosaic.image.reg testit xml physical fk5 degrees regions/xml.mosaic.physical.reg testit xml wcs fk4 degrees regions/xml.mosaic.fk4.reg testit xml wcs fk4 sexagesimal regions/xml.mosaic.fk4.hms.reg testit xml wcs fk5 degrees regions/xml.mosaic.fk5.reg testit xml wcs fk5 sexagesimal regions/xml.mosaic.fk5.hms.reg testit xml wcs icrs degrees regions/xml.mosaic.icrs.reg testit xml wcs icrs sexagesimal regions/xml.mosaic.icrs.hms.reg testit xml wcs galactic degrees regions/xml.mosaic.galactic.reg testit xml wcs galactic sexagesimal regions/xml.mosaic.galactic.hms.reg testit xml wcs ecliptic degrees regions/xml.mosaic.ecliptic.reg testit xml wcs ecliptic sexagesimal regions/xml.mosaic.ecliptic.hms.reg fi if [ "$1" = "linear" -o -z "$1" ]; then echo echo "Loading Linear Data..." xpaset -p ds9 scale minmax xpaset -p ds9 frame clear xpaset -p ds9 mosaicimage mosaic/ds9_8amp_2x2.fits xpaset -p ds9 zoom .5 echo echo "Testing DS9 Linear Format..." testit ds9 wcs fk5 degrees regions/ds9.linear.wcs.reg testit ds9 wcsa fk5 degrees regions/ds9.linear.wcsa.reg testit ds9 wcsc fk5 degrees regions/ds9.linear.wcsc.reg testit ds9 wcsd fk5 degrees regions/ds9.linear.wcsd.reg testit ds9 wcsi fk5 degrees regions/ds9.linear.wcsi.reg testit ds9 wcsp fk5 degrees regions/ds9.linear.wcsp.reg fi if [ -z "$1" ]; then xpaset -p ds9 quit fi �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/regions3d.sh���������������������������������������������������������������������������000755 �000765 �000000 �00000006162 12131345054 015765� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������testit () { echo "Test $1 $2 $3 $4 $5" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 xpaset -p ds9 regions save ${5}.out if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall o=`diff $5 ${5}.out` if [ "$o" = "" ] then echo "PASSED" else echo "FAILED" echo "$o" fi rm -f ${5}.out } testit2 () { echo "Test $1 $2 $3 $4 $5 $6" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 xpaset -p ds9 regions save ${5}.out if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall o=`diff $6 ${5}.out` if [ "$o" = "" ] then echo "PASSED" else echo "FAILED" echo "$o" fi rm -f ${5}.out } testit3 () { echo "Test $1 $2 $3 $4 $5" xpaset -p ds9 regions format $1 xpaset -p ds9 regions system $2 xpaset -p ds9 regions sky $3 xpaset -p ds9 regions skyformat $4 xpaset -p ds9 regions file $5 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 regions deleteall echo "PASSED" } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** regions.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9 -3d -3d vp 45 30& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done fi echo "Loading Data..." xpaset -p ds9 fits data/img.fits if [ "$1" = "ds9" -o -z "$1" ]; then echo echo "Testing DS9 Format..." testit ds9 image fk5 degrees regions/ds9.image.reg testit ds9 physical fk5 degrees regions/ds9.physical.reg testit ds9 wcs fk4 degrees regions/ds9.fk4.reg testit ds9 wcs fk4 sexagesimal regions/ds9.fk4.hms.reg testit ds9 wcs fk5 degrees regions/ds9.fk5.reg testit ds9 wcs fk5 sexagesimal regions/ds9.fk5.hms.reg testit ds9 wcs icrs degrees regions/ds9.icrs.reg testit ds9 wcs icrs sexagesimal regions/ds9.icrs.hms.reg testit ds9 wcs galactic degrees regions/ds9.galactic.reg testit ds9 wcs galactic sexagesimal regions/ds9.galactic.hms.reg testit ds9 wcs ecliptic degrees regions/ds9.ecliptic.reg testit ds9 wcs ecliptic sexagesimal regions/ds9.ecliptic.hms.reg echo echo "Testing XML Format..." testit xml image fk5 degrees regions/xml.image.reg testit xml physical fk5 degrees regions/xml.physical.reg testit xml wcs fk4 degrees regions/xml.fk4.reg testit xml wcs fk4 sexagesimal regions/xml.fk4.hms.reg testit xml wcs fk5 degrees regions/xml.fk5.reg testit xml wcs fk5 sexagesimal regions/xml.fk5.hms.reg testit xml wcs icrs degrees regions/xml.icrs.reg testit xml wcs icrs sexagesimal regions/xml.icrs.hms.reg testit xml wcs galactic degrees regions/xml.galactic.reg testit xml wcs galactic sexagesimal regions/xml.galactic.hms.reg testit xml wcs ecliptic degrees regions/xml.ecliptic.reg testit xml wcs ecliptic sexagesimal regions/xml.ecliptic.hms.reg fi if [ -z "$1" ]; then xpaset -p ds9 quit fi ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/rgbarray.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000045426 12131345761 015714� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 quit break fi i=`expr $i + 1` done } DoXPA () { echo "$1" xpaset -p ds9 rgbarray $2 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdin () { echo "$1" cat $2 | xpaset ds9 rgbarray $3 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear } DoXPAStdout () { echo "$1" xpaset -p ds9 tile xpaset -p ds9 rgbarray $2 xpaget ds9 rgbarray $3 > foo.rgb xpaset -p ds9 frame new rgb xpaset -p ds9 rgbarray foo.rgb$4 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame delete xpaset -p ds9 frame clear } initit () { echo "Testing $1" unset opt } testit () { opt="$opt -export rgbarray foo.rgb $1 -sleep .1" opt="$opt -frame new rgb -rgbarray foo.rgb$2" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi opt="$opt -frame delete -sleep .1" } doit () { eval ds9 -tile -frame delete -rgb -rgbarray $1 "$opt" -exit echo "PASSED" } StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 -frame delete -rgb& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** rgbarray.sh ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command File" echo ".. char" ds9 -rgbarray rgbarray/char.rgb[dim=256,bitpix=8] & KillIt echo ".. char gzip" ds9 -rgbarray rgbarray/char.rgb.gz[dim=256,bitpix=8] & KillIt echo ".. short little" ds9 -rgbarray rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] & KillIt echo ".. short little gzip" ds9 -rgbarray rgbarray/short_little.rgb.gz[dim=256,bitpix=16,arch=little] & KillIt echo ".. short big" ds9 -rgbarray rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] & KillIt echo ".. short big gzip" ds9 -rgbarray rgbarray/short_big.rgb.gz[dim=256,bitpix=16,arch=big] & KillIt echo ".. ushort little" ds9 -rgbarray rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" ds9 -rgbarray rgbarray/ushort_little.rgb.gz[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort big" ds9 -rgbarray rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" ds9 -rgbarray rgbarray/ushort_big.rgb.gz[dim=256,bitpix=-16,arch=big] & KillIt echo ".. int little" ds9 -rgbarray rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] & KillIt echo ".. int little gzip" ds9 -rgbarray rgbarray/int_little.rgb.gz[dim=256,bitpix=32,arch=little] & KillIt echo ".. int big" ds9 -rgbarray rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] & KillIt echo ".. int big gzip" ds9 -rgbarray rgbarray/int_big.rgb.gz[dim=256,bitpix=32,arch=big] & KillIt echo ".. longlong little" ds9 -rgbarray rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" ds9 -rgbarray rgbarray/longlong_little.rgb.gz[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong big" ds9 -rgbarray rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" ds9 -rgbarray rgbarray/longlong_big.rgb.gz[dim=256,bitpix=64,arch=big] & KillIt echo ".. float little" ds9 -rgbarray rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" ds9 -rgbarray rgbarray/float_little.rgb.gz[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float big" ds9 -rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" ds9 -rgbarray rgbarray/float_big.rgb.gz[dim=256,bitpix=-32,arch=big] & KillIt echo ".. double little" ds9 -rgbarray rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" ds9 -rgbarray rgbarray/double_little.rgb.gz[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double big" ds9 -rgbarray rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" ds9 -rgbarray rgbarray/double_big.rgb.gz[dim=256,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # Stdin if [ "$1" = "stdin" -o -z "$1" ]; then echo "Testing Command Stdin" echo ".. char" cat rgbarray/char.rgb | ds9 -rgbarray -[dim=256,bitpix=8] & KillIt echo ".. char gzip" cat rgbarray/char.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=8] & KillIt echo ".. short little" cat rgbarray/short_little.rgb | ds9 -rgbarray -[dim=256,bitpix=16,arch=little] & KillIt echo ".. short little gzip" cat rgbarray/short_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=16,arch=little] & KillIt echo ".. short big" cat rgbarray/short_big.rgb | ds9 -rgbarray -[dim=256,bitpix=16,arch=big] & KillIt echo ".. short big gzip" cat rgbarray/short_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=16,arch=big] & KillIt echo ".. ushort little" cat rgbarray/ushort_little.rgb | ds9 -rgbarray -[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort little gzip" cat rgbarray/ushort_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-16,arch=little] & KillIt echo ".. ushort big" cat rgbarray/ushort_big.rgb | ds9 -rgbarray -[dim=256,bitpix=-16,arch=big] & KillIt echo ".. ushort big gzip" cat rgbarray/ushort_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-16,arch=big] & KillIt echo ".. int little" cat rgbarray/int_little.rgb | ds9 -rgbarray -[dim=256,bitpix=32,arch=little] & KillIt echo ".. int little gzip" cat rgbarray/int_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=32,arch=little] & KillIt echo ".. int big" cat rgbarray/int_big.rgb | ds9 -rgbarray -[dim=256,bitpix=32,arch=big] & KillIt echo ".. int big gzip" cat rgbarray/int_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=32,arch=big] & KillIt echo ".. longlong little" cat rgbarray/longlong_little.rgb | ds9 -rgbarray -[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong little gzip" cat rgbarray/longlong_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=64,arch=little] & KillIt echo ".. longlong big" cat rgbarray/longlong_big.rgb | ds9 -rgbarray -[dim=256,bitpix=64,arch=big] & KillIt echo ".. longlong big gzip" cat rgbarray/longlong_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=64,arch=big] & KillIt echo ".. float little" cat rgbarray/float_little.rgb | ds9 -rgbarray -[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float little gzip" cat rgbarray/float_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-32,arch=little] & KillIt echo ".. float big" cat rgbarray/float_big.rgb | ds9 -rgbarray -[dim=256,bitpix=-32,arch=big] & KillIt echo ".. float big gzip" cat rgbarray/float_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-32,arch=big] & KillIt echo ".. double little" cat rgbarray/double_little.rgb | ds9 -rgbarray -[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double little gzip" cat rgbarray/double_little.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-64,arch=little] & KillIt echo ".. double big" cat rgbarray/double_big.rgb | ds9 -rgbarray -[dim=256,bitpix=-64,arch=big] & KillIt echo ".. double big gzip" cat rgbarray/double_big.rgb.gz | ds9 -rgbarray -[dim=256,bitpix=-64,arch=big] & KillIt echo "PASSED" fi # export if [ "$1" = "export" -o -z "$1" ]; then echo "Testing Command export" initit ".. char" testit little [dim=256,bitpix=8] doit rgbarray/char.rgb[dim=256,bitpix=8] initit ".. short little little" testit little [dim=256,bitpix=16,arch=little] doit rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] initit ".. short little big" testit big [dim=256,bitpix=16,arch=big] doit rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] initit ".. short big little" testit little [dim=256,bitpix=16,arch=little] doit rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] initit ".. short big big" testit big [dim=256,bitpix=16,arch=big] doit rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] initit ".. ushort little little" testit little [dim=256,bitpix=-16,arch=little] doit rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] initit ".. ushort little big" testit big [dim=256,bitpix=-16,arch=big] doit rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] initit ".. ushort big little" testit little [dim=256,bitpix=-16,arch=little] doit rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] initit ".. ushort big big" testit big [dim=256,bitpix=-16,arch=big] doit rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] initit ".. int little little" testit little [dim=256,bitpix=32,arch=little] doit rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] initit ".. int little big" testit big [dim=256,bitpix=32,arch=big] doit rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] initit ".. int big little" testit little [dim=256,bitpix=32,arch=little] doit rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] initit ".. int big big" testit big [dim=256,bitpix=32,arch=big] doit rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] initit ".. longlong little little" testit little [dim=256,bitpix=64,arch=little] doit rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] initit ".. longlong little big" testit big [dim=256,bitpix=64,arch=big] doit rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] initit ".. longlong big little" testit little [dim=256,bitpix=64,arch=little] doit rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] initit ".. longlong big big" testit big [dim=256,bitpix=64,arch=big] doit rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] initit ".. float little little" testit little [dim=256,bitpix=-32,arch=little] doit rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] initit ".. float little big" testit big [dim=256,bitpix=-32,arch=big] doit rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] initit ".. float big little" testit little [dim=256,bitpix=-32,arch=little] doit rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] initit ".. float big big" testit big [dim=256,bitpix=-32,arch=big] doit rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] initit ".. double little little" testit little [dim=256,bitpix=-64,arch=little] doit rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] initit ".. double little big" testit big [dim=256,bitpix=-64,arch=big] doit rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] initit ".. double big little" testit little [dim=256,bitpix=-64,arch=little] doit rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] initit ".. double big big" testit big [dim=256,bitpix=-64,arch=big] doit rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 DoXPA ".. char" rgbarray/char.rgb[dim=256,bitpix=8] DoXPA ".. char gzip" rgbarray/char.rgb.gz[dim=256,bitpix=8] DoXPA ".. short little" rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] DoXPA ".. short little gzip" rgbarray/short_little.rgb.gz[dim=256,bitpix=16,arch=little] DoXPA ".. short big" rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] DoXPA ".. short big gzip" rgbarray/short_big.rgb.gz[dim=256,bitpix=16,arch=big] DoXPA ".. ushort little" rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] DoXPA ".. ushort little gzip" rgbarray/ushort_little.rgb.gz[dim=256,bitpix=-16,arch=little] DoXPA ".. ushort big" rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] DoXPA ".. ushort big gzip" rgbarray/ushort_big.rgb.gz[dim=256,bitpix=-16,arch=big] DoXPA ".. int little" rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] DoXPA ".. int little gzip" rgbarray/int_little.rgb.gz[dim=256,bitpix=32,arch=little] DoXPA ".. int big" rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] DoXPA ".. int big gzip" rgbarray/int_big.rgb.gz[dim=256,bitpix=32,arch=big] DoXPA ".. longlong little" rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] DoXPA ".. longlong little gzip" rgbarray/longlong_little.rgb.gz[dim=256,bitpix=64,arch=little] DoXPA ".. longlong big" rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] DoXPA ".. longlong big gzip" rgbarray/longlong_big.rgb.gz[dim=256,bitpix=64,arch=big] DoXPA ".. float little" rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] DoXPA ".. float little gzip" rgbarray/float_little.rgb.gz[dim=256,bitpix=-32,arch=little] DoXPA ".. float big" rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] DoXPA ".. float big gzip" rgbarray/float_big.rgb.gz[dim=256,bitpix=-32,arch=big] DoXPA ".. double little" rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] DoXPA ".. double little gzip" rgbarray/double_little.rgb.gz[dim=256,bitpix=-64,arch=little] DoXPA ".. double big" rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] DoXPA ".. double big gzip" rgbarray/double_big.rgb.gz[dim=256,bitpix=-64,arch=big] echo ".. backward compatibility" echo ".. array rgb" xpaset -p ds9 frame new rgb xpaset -p ds9 array rgb rgbarray/char.rgb[dim=256,bitpix=8] if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo ".. array new rgb" xpaset -p ds9 array new rgb rgbarray/char.rgb[dim=256,bitpix=8] if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA if [ "$1" = "xpastdin" -o -z "$1" ]; then echo "Testing XPA Stdin" StartDS9 DoXPAStdin ".. char" rgbarray/char.rgb [dim=256,bitpix=8] DoXPAStdin ".. char gzip" rgbarray/char.rgb.gz [dim=256,bitpix=8] DoXPAStdin ".. short little" rgbarray/short_little.rgb [dim=256,bitpix=16,arch=little] DoXPAStdin ".. short little gzip" rgbarray/short_little.rgb.gz [dim=256,bitpix=16,arch=little] DoXPAStdin ".. short big" rgbarray/short_big.rgb [dim=256,bitpix=16,arch=big] DoXPAStdin ".. short big gzip" rgbarray/short_big.rgb.gz [dim=256,bitpix=16,arch=big] DoXPAStdin ".. ushort little" rgbarray/ushort_little.rgb [dim=256,bitpix=-16,arch=little] DoXPAStdin ".. ushort little gzip" rgbarray/ushort_little.rgb.gz [dim=256,bitpix=-16,arch=little] DoXPAStdin ".. ushort big" rgbarray/ushort_big.rgb [dim=256,bitpix=-16,arch=big] DoXPAStdin ".. ushort big gzip" rgbarray/ushort_big.rgb.gz [dim=256,bitpix=-16,arch=big] DoXPAStdin ".. int little" rgbarray/int_little.rgb [dim=256,bitpix=32,arch=little] DoXPAStdin ".. int little gzip" rgbarray/int_little.rgb.gz [dim=256,bitpix=32,arch=little] DoXPAStdin ".. int big" rgbarray/int_big.rgb [dim=256,bitpix=32,arch=big] DoXPAStdin ".. int big gzip" rgbarray/int_big.rgb.gz [dim=256,bitpix=32,arch=big] DoXPAStdin ".. longlong little" rgbarray/longlong_little.rgb [dim=256,bitpix=64,arch=little] DoXPAStdin ".. longlong little gzip" rgbarray/longlong_little.rgb.gz [dim=256,bitpix=64,arch=little] DoXPAStdin ".. longlong big" rgbarray/longlong_big.rgb [dim=256,bitpix=64,arch=big] DoXPAStdin ".. longlong big gzip" rgbarray/longlong_big.rgb.gz [dim=256,bitpix=64,arch=big] DoXPAStdin ".. float little" rgbarray/float_little.rgb [dim=256,bitpix=-32,arch=little] DoXPAStdin ".. float little gzip" rgbarray/float_little.rgb.gz [dim=256,bitpix=-32,arch=little] DoXPAStdin ".. float big" rgbarray/float_big.rgb [dim=256,bitpix=-32,arch=big] DoXPAStdin ".. float big gzip" rgbarray/float_big.rgb.gz [dim=256,bitpix=-32,arch=big] DoXPAStdin ".. double little" rgbarray/double_little.rgb [dim=256,bitpix=-64,arch=little] DoXPAStdin ".. double little gzip" rgbarray/double_little.rgb.gz [dim=256,bitpix=-64,arch=little] DoXPAStdin ".. double big" rgbarray/double_big.rgb [dim=256,bitpix=-64,arch=big] DoXPAStdin ".. double big gzip" rgbarray/double_big.rgb.gz [dim=256,bitpix=-64,arch=big] echo ".. backward compatibility" echo ".. array rgb" xpaset -p ds9 frame new rgb cat rgbarray/char.rgb | xpaset ds9 array rgb [dim=256,bitpix=8] if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear echo ".. array new rgb" cat rgbarray/char.rgb | xpaset ds9 array new rgb [dim=256,bitpix=8] if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear xpaset -p ds9 quit echo "PASSED" fi # XPA stdout if [ "$1" = "xpastdout" -o -z "$1" ]; then echo "Testing XPA Stdout" StartDS9 DoXPAStdout ".. char" rgbarray/char.rgb[dim=256,bitpix=8] little [dim=256,bitpix=8] DoXPAStdout ".. short little little" rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] little [dim=256,bitpix=16,arch=little] DoXPAStdout ".. short little big" rgbarray/short_little.rgb[dim=256,bitpix=16,arch=little] big [dim=256,bitpix=16,arch=big] DoXPAStdout ".. short big little" rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] little [dim=256,bitpix=16,arch=little] DoXPAStdout ".. short big big" rgbarray/short_big.rgb[dim=256,bitpix=16,arch=big] big [dim=256,bitpix=16,arch=big] DoXPAStdout ".. ushort little little" rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] little [dim=256,bitpix=-16,arch=little] DoXPAStdout ".. ushort little big" rgbarray/ushort_little.rgb[dim=256,bitpix=-16,arch=little] big [dim=256,bitpix=-16,arch=big] DoXPAStdout ".. ushort big little" rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] little [dim=256,bitpix=-16,arch=little] DoXPAStdout ".. ushort big big" rgbarray/ushort_big.rgb[dim=256,bitpix=-16,arch=big] big [dim=256,bitpix=-16,arch=big] DoXPAStdout ".. int little little" rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] little [dim=256,bitpix=32,arch=little] DoXPAStdout ".. int little big" rgbarray/int_little.rgb[dim=256,bitpix=32,arch=little] big [dim=256,bitpix=32,arch=big] DoXPAStdout ".. int big little" rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] little [dim=256,bitpix=32,arch=little] DoXPAStdout ".. int big big" rgbarray/int_big.rgb[dim=256,bitpix=32,arch=big] big [dim=256,bitpix=32,arch=big] DoXPAStdout ".. longlong little little" rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] little [dim=256,bitpix=64,arch=little] DoXPAStdout ".. longlong little big" rgbarray/longlong_little.rgb[dim=256,bitpix=64,arch=little] big [dim=256,bitpix=64,arch=big] DoXPAStdout ".. longlong big little" rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] little [dim=256,bitpix=64,arch=little] DoXPAStdout ".. longlong big big" rgbarray/longlong_big.rgb[dim=256,bitpix=64,arch=big] big [dim=256,bitpix=64,arch=big] DoXPAStdout ".. float little little" rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] little [dim=256,bitpix=-32,arch=little] DoXPAStdout ".. float little big" rgbarray/float_little.rgb[dim=256,bitpix=-32,arch=little] big [dim=256,bitpix=-32,arch=big] DoXPAStdout ".. float big little" rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] little [dim=256,bitpix=-32,arch=little] DoXPAStdout ".. float big big" rgbarray/float_big.rgb[dim=256,bitpix=-32,arch=big] big [dim=256,bitpix=-32,arch=big] DoXPAStdout ".. double little little" rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] little [dim=256,bitpix=-64,arch=little] DoXPAStdout ".. double little big" rgbarray/double_little.rgb[dim=256,bitpix=-64,arch=little] big [dim=256,bitpix=-64,arch=big] DoXPAStdout ".. double big little" rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] little [dim=256,bitpix=-64,arch=little] DoXPAStdout ".. double big big" rgbarray/double_big.rgb[dim=256,bitpix=-64,arch=big] big [dim=256,bitpix=-64,arch=big] xpaset -p ds9 quit echo "PASSED" fi rm -f foo.* echo "DONE" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/rgbcube.sh�����������������������������������������������������������������������������000755 �000765 �000000 �00000000051 12107266155 015477� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������fullrgb.sh RGBCube rgbcube rgbcube $1 $2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/rgbimage.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000000052 12107266155 015644� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������fullrgb.sh RGBImage mecube rgbimage $1 $2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/rice.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000000040 12107264737 015012� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������partial.sh RICE rice fits $1 $2 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 014470� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000005372 12610250021 015021� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "SAMP Tests" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9 -tcl& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi testit () { echo echo "Testing $1" tclsh ../admin/samp.tcl block < samp/${1}.samp # tclsh85sg ../admin/samp.tcl block < samp/${1}.samp echo "PASSED" } doit () { if [ "$1" = "$2" -o -z "$1" ]; then testit "$2" fi } echo echo "*** samp.sh ***" # must be invoked # iexam # samp # skyview # load default image xpaset -p ds9 scale zscale xpaset -p ds9 fits data/img.fits doit "$1" 2mass doit "$1" 3d doit "$1" about doit "$1" align doit "$1" analysis doit "$1" array doit "$1" bg doit "$1" backup doit "$1" bin doit "$1" blink doit "$1" block doit "$1" catalog doit "$1" cd doit "$1" cmap doit "$1" colorbar doit "$1" console doit "$1" contour doit "$1" crop doit "$1" crosshair doit "$1" cube doit "$1" cursor doit "$1" data doit "$1" dsssao doit "$1" dsseso doit "$1" dssstsci doit "$1" export # backward compatibility doit "$1" file doit "$1" fits doit "$1" frame doit "$1" gif doit "$1" grid doit "$1" header doit "$1" height doit "$1" iconify doit "$1" iis # interactive #doit "$1" iexam doit "$1" jpeg doit "$1" lock doit "$1" lower doit "$1" magnifier doit "$1" mask doit "$1" match doit "$1" mecube doit "$1" minmax doit "$1" mode doit "$1" mosaic doit "$1" mosaicimage # backward compatibility doit "$1" mosaicwcs # backward compatibility doit "$1" mosaiciraf # backward compatibility doit "$1" mosaicimagewcs # backward compatibility doit "$1" mosaicimageiraf # backward compatibility doit "$1" mosaicimagewfpc2 # movie will fail if moved from corner doit "$1" movie doit "$1" multiframe doit "$1" nameserver doit "$1" nan doit "$1" nrrd #doit "$1" nvss doit "$1" orient doit "$1" pagesetup doit "$1" pan doit "$1" pixeltable doit "$1" plot doit "$1" png doit "$1" prefs doit "$1" preserve doit "$1" print doit "$1" raise doit "$1" regions doit "$1" restore doit "$1" rgb doit "$1" rgbarray doit "$1" rgbcube doit "$1" rgbimage doit "$1" rotate # really don't want to do this #doit "$1" samp doit "$1" save # movie will fail if moved from corner doit "$1" saveimage doit "$1" scale # backward compatibility doit "$1" sfits doit "$1" single # no tests #doit "$1" shm doit "$1" skyview doit "$1" sleep # no tests #doit "$1" smosaic # no tests #doit "$1" smosaicwcs # no tests #doit "$1" smosaiciraf doit "$1" smooth doit "$1" source # backward compatibility doit "$1" srgbcube doit "$1" tcl doit "$1" threads doit "$1" tiff doit "$1" tile doit "$1" update # no tests doit "$1" url doit "$1" version doit "$1" view doit "$1" vla doit "$1" vo doit "$1" wcs doit "$1" web doit "$1" width doit "$1" zscale doit "$1" zoom doit "$1" exit rm -rf foo.* ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/scale.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000003057 12131345054 015157� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������testit () { echo "Testing $1..." xpaset -p ds9 scale $1 xpaset -p ds9 contour scale $1 xpaset -p ds9 file $2 xpaset -p ds9 contour yes read xpaset -p ds9 frame clear } echo echo "*** scale.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done fi echo "Setup..." xpaset -p ds9 cmap i8 xpaset -p ds9 contour nlevels 9 xpaset -p ds9 contour color black testit linear scale/linear.fits testit log scale/pow.fits testit pow scale/log.fits testit sqrt scale/squ.fits testit squared scale/sqrt.fits testit asinh scale/sinh.fits testit sinh scale/asinh.fits echo "Testing histequ..." xpaset -p ds9 scale histequ xpaset -p ds9 contour scale histequ xpaset -p ds9 fits scale/linear.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/log.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/pow.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/sqrt.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/squ.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/asinh.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 fits scale/sinh.fits xpaset -p ds9 contour generate xpaset -p ds9 contour yes read xpaset -p ds9 frame clear xpaset -p ds9 quit ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/sfits.sh�������������������������������������������������������������������������������000755 �000765 �000000 �00000000047 12122431011 015201� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������spartial.sh SFits sfits sfits "" $1 $2 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/shared.sh������������������������������������������������������������������������������000755 �000765 �000000 �00000013316 12132047764 015345� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#linux commands #ipcs -m #ipcs -ml #ipcrm shm <shmid> #echo '67108864' > /proc/sys/kernel/shmmax KillIt () { i=1 while [ "$i" -le 15 ]; do sleep 1 if [ `xpaaccess ds9` = yes ]; then sleep 1 xpaset -p ds9 quit break fi i=`expr $i + 1` done } DoCmd () { echo "$1" shmid=`shmload -q $2` ds9 -scale $5 -scale mode $6 -shm $3 shmid $shmid $4 & KillIt ipcrm -m $shmid } DoSCmd () { echo "$1" shmid1=`shmload -q $2` shmid2=`shmload -q $3` ds9 -scale $6 -scale mode $7 -shm $4 shmid $shmid1 $shmid2 $5 & KillIt ipcrm -m $shmid1 ipcrm -m $shmid2 } DoXPA () { echo "$1" shmid=`shmload -q $2` xpaset -p ds9 scale $5 xpaset -p ds9 scale mode $6 xpaset -p ds9 shm $3 shmid $shmid $4 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear ipcrm -m $shmid } DoSXPA () { echo "$1" shmid1=`shmload -q $2` shmid2=`shmload -q $3` xpaset -p ds9 scale $6 xpaset -p ds9 scale mode $7 xpaset -p ds9 shm $4 shmid $shmid1 $shmid2 $5 if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear ipcrm -m $shmid1 ipcrm -m $shmid2 } # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** shared.sh ***" echo "Current shm limits" #ipcs -lm if [ "$1" = "command" -o -z "$1" ]; then echo "Command Line Shm Tests" # basics DoCmd "..fits" data/img.fits fits foo linear zscale DoSCmd "..sfits" sfits/float.hdr sfits/float.arr sfits foo linear zscale DoCmd "..table" fits/table.fits "" foo log minmax DoCmd "..table filter" fits/table.fits "" 'foo[bin=rawx,rawy]' log minmax # mosaic DoCmd "..mosaic image iraf" mosaic/mosaicimage.fits "mosaicimage iraf" foo linear zscale DoCmd "..mosaic image iraf datacube" mosaic/naxis4.fits "mosaicimage iraf" foo linear zscale DoCmd "..mosaic image wcs" mosaic/mosaicimage.fits "mosaicimage wcs" foo linear zscale DoCmd "..mosaic image wcsp" mosaic/ds9_8amp_2x2.fits "mosaicimage wcsp" foo linear minmax DoCmd "..mosaic image wfpc2" mosaic/hst.fits "mosaicimage wfpc2" foo linear zscale DoCmd "..mosaic iraf" mosaic/mosaicimage.fits "mosaic iraf" foo linear zscale DoCmd "..mosaic iraf datacube" mosaic/naxis4.fits "mosaic iraf" foo linear zscale DoCmd "..mosaic wcs" mosaic/mosaicimage.fits "mosaic wcs" foo linear zscale DoCmd "..mosaic wcsp" mosaic/ds9_8amp_2x2.fits "mosaic wcsp" foo linear minmax #DoSCmd "..mosaic wcs sfits" sfits/float.hdr sfits/float.arr "smosaic wcs" foo linear zscale # backward compatibility DoCmd "..mosaic image iraf(bc)" mosaic/mosaicimage.fits mosaicimageiraf foo linear zscale DoCmd "..mosaic image wcs(bc)" mosaic/mosaicimage.fits mosaicimagewcs foo linear zscale DoCmd "..mosaic image wfpc2(bc)" mosaic/hst.fits mosaicimagewfpc2 foo linear zscale DoCmd "..mosaic iraf(bc)" mosaic/mosaicimage.fits mosaiciraf foo linear zscale DoCmd "..mosaic wcs(bc)" mosaic/mosaicimage.fits mosaicwcs foo linear zscale # array DoCmd "..array" array/float_big.arr array 'foo[dim=256,bitpix=-32,arch=big]' linear minmax DoCmd "..array cube" rgbarray/float_big.rgb array 'foo[dim=256,zdim=3,bitpix=-32,arch=big]' linear minmax # rgb DoCmd "..rgbcube" rgbcube/float.fits rgbcube foo linear minmax DoSCmd "..rgbcube sfits" srgbcube/float.hdr srgbcube/float.arr srgbcube foo linear minmax DoCmd "..rgbimage" mecube/float.fits rgbimage foo linear minmax echo "PASSED" fi if [ "$1" = "xpa" -o -z "$1" ]; then echo "XPA Shm Tests" echo "Starting DS9..." if [ `xpaaccess ds9` = no ] then ds9& fi i=1 while [ "$i" -le 15 ] do sleep 1 if [ `xpaaccess ds9` = yes ] then break fi i=`expr $i + 1` done # basics DoXPA "..fits" data/img.fits fits foo linear zscale DoSXPA "..split fits" sfits/float.hdr sfits/float.arr sfits foo linear zscale DoXPA "..table" fits/table.fits "" foo log minmax DoXPA "..table filter" fits/table.fits "" 'foo[bin=rawx,rawy]' log minmax # mosaics DoXPA "..mosaic image iraf" mosaic/mosaicimage.fits "mosaicimage iraf" foo linear zscale DoXPA "..mosaic image iraf datacube" mosaic/naxis4.fits "mosaicimage iraf" foo linear zscale DoXPA "..mosaic image wcs" mosaic/mosaicimage.fits "mosaicimage wcs" foo linear zscale DoXPA "..mosaic image wcsp" mosaic/ds9_8amp_2x2.fits "mosaicimage wcs" foo linear minmax DoXPA "..mosaic image wfpc2" mosaic/hst.fits "mosaicimage wfpc2" foo linear zscale DoXPA "..mosaic iraf" mosaic/mosaicimage.fits "mosaic iraf" foo linear zscale DoXPA "..mosaic iraf datacube" mosaic/naxis4.fits "mosaic iraf" foo linear zscale DoXPA "..mosaic wcs" mosaic/mosaicimage.fits "mosaic wcs" foo linear zscale DoXPA "..mosaic wcsp" mosaic/ds9_8amp_2x2.fits "mosaicimage wcs" foo linear minmax #DoSXPA "..sfits mosaic wcs" sfits/float.hdr sfits/float.arr "smosaic wcs" foo linear zscale # backward compatibility DoXPA "..mosaic image iraf(bc)" mosaic/mosaicimage.fits mosaicimageiraf foo linear zscale DoXPA "..mosaic image wcs(bc)" mosaic/mosaicimage.fits mosaicimagewcs foo linear zscale DoXPA "..mosaic image wfpc2(bc)" mosaic/hst.fits mosaicimagewfpc2 foo linear zscale DoXPA "..mosaic iraf(bc)" mosaic/mosaicimage.fits mosaiciraf foo linear zscale DoXPA "..mosaic wcs(bc)" mosaic/mosaicimage.fits mosaicwcs foo linear zscale # array DoXPA "..array" array/float_big.arr array 'foo[dim=256,bitpix=-32,arch=big]' linear minmax DoXPA "..array cube" rgbarray/float_big.rgb array 'foo[dim=256,zdim=3,bitpix=-32,arch=big]' linear minmax # rgb xpaset -p ds9 scale linear xpaset -p ds9 scale mode minmax xpaset -p ds9 rgb DoXPA "..rgbcube" rgbcube/float.fits rgbcube foo linear minmax DoSXPA "..rgbcube sfits" srgbcube/float.hdr srgbcube/float.arr srgbcube foo linear minmax DoXPA "..rgbimage" mecube/float.fits rgbimage foo linear minmax xpaset -p ds9 frame delete xpaset -p ds9 quit echo "PASSED" fi echo "DONE" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/spartial.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000001725 12131617435 015714� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������StartDS9 () { if [ `xpaaccess ds9` = no ]; then ds9 $extra & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi } # which/where/what which=$1 shift where=$1 shift what=$1 shift extra=$1 shift # slow down? slow=0 if [ "$1" = "slow" ]; then slow=1 shift fi echo echo "*** $which ***" # Command Line if [ "$1" = "command" -o -z "$1" ]; then echo "Testing Command Line File" for f in $where/*.arr do echo " ${f#$where/}" opt="-$what ${f%.arr}.hdr $f -sleep .1" if [ $slow = "1" ]; then opt="$opt -sleep 1" fi ds9 $opt -exit done echo "PASSED" fi # XPA if [ "$1" = "xpa" -o -z "$1" ]; then echo "Testing XPA File" StartDS9 for f in $where/*.arr do echo " ${f#$where/}" xpaset -p ds9 $what ${f%.arr}.hdr $f if [ $slow = "1" ]; then sleep 1 fi xpaset -p ds9 frame clear done xpaset -p ds9 quit echo "PASSED" fi echo "DONE" �������������������������������������������saods9/tests/srgbcube.sh����������������������������������������������������������������������������000755 �000765 �000000 �00000000102 12122431011 015635� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������spartial.sh SRGBCube srgbcube srgbcube "-frame delete -rgb" $1 $2 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/vo.sh����������������������������������������������������������������������������������000755 �000765 �000000 �00000004577 12131345054 014524� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** vo.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi doit () { dd=1 ddd=4 xpaset -p ds9 vo chandra-ed #xpaset -p ds9 vo chandra-ed.rutgers xpaset -p ds9 web click 4 sleep $ddd xpaset -p ds9 web click back xpaset -p ds9 raise echo "..Overview of Chandra-Ed Analysis Tools" xpaset -p ds9 analysis 0 sleep $dd echo "..Radial Profile Plot" xpaset -p ds9 regions regions/vo2.reg xpaset -p ds9 analysis 1 sleep $dd echo "..Counts in Regions" xpaset -p ds9 regions deleteall xpaset -p ds9 regions regions/vo1.reg xpaset -p ds9 analysis 2 sleep $dd echo "..Quick Energy Spectrum Plot" xpaset -p ds9 analysis 3 sleep $dd echo "..Quick Light Curve Plot" xpaset -p ds9 analysis 4 sleep $dd echo "..Histogram Plot" xpaset -p ds9 analysis 5 sleep $dd echo "..Column Histogram" xpaset -p ds9 analysis 6 sleep $dd echo "..Refine (Centroid) Position" xpaset -p ds9 analysis 7 sleep $ddd echo "..Imexam" xpaset -p ds9 analysis 8 sleep $ddd echo "..Rebin image" xpaset -p ds9 analysis 9 sleep $ddd sleep $ddd xpaset -p ds9 frame delete echo "..Energy Filter" xpaset -p ds9 analysis 10 sleep $ddd sleep $ddd xpaset -p ds9 frame delete echo "..Time Filter" xpaset -p ds9 analysis 11 sleep $ddd sleep $ddd xpaset -p ds9 frame delete echo "..Column Filter" xpaset -p ds9 analysis 12 sleep $ddd sleep $ddd xpaset -p ds9 frame delete echo "..CIAO/Sherpa Spectral Fit" xpaset -p ds9 analysis 13 sleep $ddd echo "..FTOOLS/Light Curve" xpaset -p ds9 analysis 14 sleep $ddd echo "..FTOOLS/Power Spectrum" xpaset -p ds9 analysis 15 sleep $ddd echo "..FTOOLS/Period Fold" xpaset -p ds9 analysis 16 sleep $ddd xpaset -p ds9 regions deleteall xpaset -p ds9 frame clear xpaset -p ds9 vo disconnect chandra-ed xpaset -p ds9 web close echo "PASSED" } if [ "$1" = "xpa" ]; then echo "Testing xpa" xpaset -p ds9 vo method xpa doit fi if [ "$1" = "mime" ]; then echo "Testing mime" xpaset -p ds9 vo method mime doit fi xpaset -p ds9 exit echo "DONE" ���������������������������������������������������������������������������������������������������������������������������������saods9/tests/wcs.sh���������������������������������������������������������������������������������000755 �000765 �000000 �00000000657 12131345054 014667� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** wcs.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi xpaset -p ds9 grid on xpaset -p ds9 grid wcs xpaset -p ds9 scale zscale xpaset -p ds9 wcs skyformat degrees for f in wcs/*.fits do echo $f xpaset -p ds9 fits $f read done xpaset -p ds9 quit echo "DONE" ���������������������������������������������������������������������������������saods9/tests/wcs2.sh��������������������������������������������������������������������������������000755 �000765 �000000 �00000002751 12622703735 014757� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo echo "*** wcs2.sh ***" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9 & i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi testit () { echo "Testing $1" xpaset -p ds9 fits $1 xpaset -p ds9 zoom $2 xpaset -p ds9 wcs sky fk5 xpaset -p ds9 align yes read xpaset -p ds9 wcs sky galactic read xpaset -p ds9 frame clear } # load default image xpaset -p ds9 grid yes xpaset -p ds9 wcs skyformat deg echo "AST" testit wcs2/ast.fits 1 echo "STScI DSS" testit wcs2/wcen.fits.gz 1 echo "Old SCAMP" testit wcs2/ngc6819.fits 1 echo "TAN+ PV" testit wcs2/paucam_0_0_t7_0_science.fits 1 echo "TAN PV2_1=0 PV2_2=0" testit wcs2/a68.fits 1 echo "ZPN+ PV" testit wcs2/UKIDDS_K_3219_606_17_67_3.fits 1 echo "TNX" testit wcs2/30s_01.fits 1 echo "ZPX" testit wcs2/E5.3090.fits 1 echo "TAN-SIP" testit wcs2/sst.fits 2 testit wcs2/mos8.fits 1 echo "SAO Plate" testit wcs2/ac.fits 1 testit wcs2/crts_short.fits 1 #echo "TAB" #testit wcs2/sparse.fits echo "WCSDEP" testit wcs2/ngc6819.fits 1 echo "HPX" testit wcs2/wmap.fits 1 echo "XPH" testit wcs2/scuba2.fits 1 echo "GLON-ZEA" testit wcs2/South_galactic.fits 1 echo "RA-CAR" testit wcs2/CAR_model.fits 1 testit wcs2/car_01.fits 1 echo "GLON-CAR" testit wcs2/GLM_00350+0115_mosaic_I4_cutout_14706.fits 1 echo "xxLN-xxLT" testit wcs2/MolaTopographyPolar.miss.fits.fz 1 echo "IRAF" testit wcs2/obj011.fits 1 xpaset -p ds9 quit �����������������������saods9/tests/xpa/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602243 014320� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa.sh���������������������������������������������������������������������������������000755 �000765 �000000 �00000251046 12620446640 014671� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "XPA Tests" echo "Starting DS9..." if [ `xpaaccess ds9` = no ]; then ds9 -tcl& i=1 while [ "$i" -le 30 ] do sleep 2 if [ `xpaaccess ds9` = yes ]; then break fi i=`expr $i + 1` done fi testit () { if [ -f xpa/${1}.xpa ] then o=`diff xpa/${1}.xpa ${1}.out` if [ "$o" = "" ] then echo "PASSED" else echo "FAILED" echo "$o" fi else echo "PASSED" fi rm -f ${1}.out xpaset -p ds9 single xpaset -p ds9 raise } echo echo "*** xpa.sh ***" delay=.5 # must be invoked # iexam # samp # shm # no test # shm # smosaic # smosaicwcs # smosaiciraf rm -f *.out xpaset -p ds9 scale zscale xpaset -p ds9 fits data/img.fits tt="2mass" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 2mass open xpaset -p ds9 2mass close xpaset -p ds9 2mass survey h xpaget ds9 2mass survey >> ${tt}.out xpaset -p ds9 2mass size 30 30 arcsec xpaget ds9 2mass size >> ${tt}.out xpaset -p ds9 2mass save no xpaget ds9 2mass save >> ${tt}.out xpaset -p ds9 2mass frame new xpaget ds9 2mass frame >> ${tt}.out xpaset -p ds9 2mass update frame xpaset -p ds9 2mass m51 xpaset -p ds9 2mass name m51 xpaget ds9 2mass name >> ${tt}.out xpaset -p ds9 2mass name {} xpaset -p ds9 2mass coord 00:42:44.404 +41:16:08.78 sexagesimal xpaget ds9 2mass coord >> ${tt}.out xpaset -p ds9 2mass update frame xpaset -p ds9 mode crosshair xpaset -p ds9 2mass update crosshair xpaset -p ds9 2mass close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="3d" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 3d open xpaset -p ds9 3d close xpaset -p ds9 3d xpaset -p ds9 3d view 45 30 xpaget ds9 3d view >> ${tt}.out xpaget ds9 3d az >> ${tt}.out xpaget ds9 3d el >> ${tt}.out xpaget ds9 3d scale >> ${tt}.out xpaget ds9 3d method >> ${tt}.out xpaget ds9 3d background >> ${tt}.out xpaget ds9 3d border >> ${tt}.out xpaget ds9 3d border color >> ${tt}.out xpaget ds9 3d compass >> ${tt}.out xpaget ds9 3d compass color >> ${tt}.out xpaget ds9 3d highlite >> ${tt}.out xpaget ds9 3d highlite color >> ${tt}.out xpaset -p ds9 3d view 45 30 xpaset -p ds9 3d az 45 xpaset -p ds9 3d el 30 xpaset -p ds9 3d scale 5 xpaset -p ds9 3d method mip xpaset -p ds9 3d background azimuth xpaset -p ds9 3d border yes xpaset -p ds9 3d border color red xpaset -p ds9 3d compass yes xpaset -p ds9 3d compass color red xpaset -p ds9 3d highlite yes xpaset -p ds9 3d highlite color red xpaset -p ds9 frame delete xpaset -p ds9 3d close xpaset -p ds9 cube close testit $tt fi tt="about" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 about > /dev/null testit $tt fi tt="align" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 align >> ${tt}.out xpaset -p ds9 align xpaset -p ds9 frame reset testit $tt fi tt="analysis" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 analysis clear xpaset -p ds9 analysis analysis/analysis.ans xpaget ds9 analysis > /dev/null xpaget ds9 analysis task > /dev/null #xpaget ds9 analysis entry 'hello world' xpaget ds9 analysis mode > /dev/null xpaset -p ds9 analysis 0 xpaset -p ds9 analysis task 1 xpaset -p ds9 analysis task '{Basic Help}' xpaset -p ds9 analysis clear xpaset -p ds9 analysis load analysis/analysis.ans xpaset -p ds9 analysis clear load analysis/analysis.ans xpaset -p ds9 analysis clear cat analysis/analysis.ans | xpaset ds9 analysis load xpaset -p ds9 analysis clear #xpaset -p ds9 analysis message {This is a message} #xpaset -p ds9 analysis message yesno {This is a message} xpaset -p ds9 analysis text {This is text} xpaset -p ds9 analysis mode none cat analysis/analysis.txt | xpaset ds9 analysis text testit $tt fi tt="array" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 array array/float_big.arr[dim=256,bitpix=-32,endian=big] cat array/float_big.arr | xpaset ds9 array -[dim=256,bitpix=-32,endian=big] xpaget ds9 array little > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 array new array/float_big.arr[dim=256,bitpix=-32,endian=big] xpaset -p ds9 array mask array/float_big.arr[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete # backward compatibility xpaset -p ds9 frame new rgb cat rgbarray/float_big.rgb | xpaset ds9 array rgb -[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete cat rgbarray/float_big.rgb | xpaset ds9 array new rgb -[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi tt="bg" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/background..." xpaget ds9 background >> ${tt}.out xpaget ds9 bg >> ${tt}.out xpaset -p ds9 background red xpaset -p ds9 background white testit $tt fi tt="backup" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 backup foo.bck testit $tt fi tt="bin" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 fits new fits/table.fits xpaset -p ds9 single xpaset -p ds9 bin open xpaset -p ds9 bin factor 4 xpaset -p ds9 bin factor 8 8 xpaset -p ds9 scale log xpaset -p ds9 scale minmax xpaset -p ds9 bin buffersize 1024 xpaset -p ds9 bin filter 'circle(4096,4096,200)' xpaset -p ds9 bin filter '' xpaset -p ds9 bin cols rawx rawy xpaset -p ds9 bin about center xpaset -p ds9 bin colsz x y pha xpaset -p ds9 bin depth 10 xpaset -p ds9 bin about 4096 4096 xpaset -p ds9 bin depth 1 xpaset -p ds9 bin function sum xpaset -p ds9 bin in xpaset -p ds9 bin out xpaset -p ds9 bin to fit xpaset -p ds9 bin match xpaset -p ds9 bin lock yes xpaset -p ds9 bin lock no xpaset -p ds9 bin close xpaget ds9 bin about >> ${tt}.out xpaget ds9 bin buffersize >> ${tt}.out xpaget ds9 bin cols >> ${tt}.out xpaget ds9 bin factor >> ${tt}.out xpaget ds9 bin filter >> ${tt}.out xpaget ds9 bin function >> ${tt}.out xpaget ds9 bin lock >> ${tt}.out xpaset -p ds9 frame delete testit $tt fi tt="blink" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 blink >> ${tt}.out xpaget ds9 blink interval >> ${tt}.out xpaset -p ds9 frame new xpaset -p ds9 blink xpaset -p ds9 blink yes xpaset -p ds9 blink interval .5 xpaset -p ds9 single xpaset -p ds9 frame first xpaset -p ds9 frame next xpaset -p ds9 frame delete testit $tt fi tt="block" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 block open xpaset -p ds9 block 4 xpaset -p ds9 block 8 8 xpaset -p ds9 block to 4 xpaset -p ds9 block to 8 8 xpaset -p ds9 block in xpaset -p ds9 block out xpaset -p ds9 block to fit xpaset -p ds9 block to 1 xpaset -p ds9 block match xpaset -p ds9 block lock yes xpaset -p ds9 block lock no xpaset -p ds9 block close xpaget ds9 block >> ${tt}.out xpaget ds9 block lock >> ${tt}.out testit $tt fi tt="catalog" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/cat..." xpaset -p ds9 catalog cds 2mass xpaget ds9 catalog >> ${tt}.out xpaget ds9 catalog header > /dev/null xpaget ds9 catalog cat2mass header > /dev/null xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog xpaset -p ds9 catalog close xpaset -p ds9 catalog cds "I/284" xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog import sb aux/ds9.cat xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog cds 2mass xpaset -p ds9 raise xpaset -p ds9 catalog plot '$Jmag' '$Hmag' '$e_Jmag' '$e_Hmag' xpaset -p ds9 catalog symbol condition '$Jmag>15' xpaset -p ds9 catalog symbol shape "{boxcircle point}" xpaset -p ds9 catalog symbol color red xpaset -p ds9 catalog symbol condition "{}" xpaset -p ds9 catalog symbol color red xpaset -p ds9 catalog symbol shape text xpaset -p ds9 catalog symbol font times xpaset -p ds9 catalog symbol fontsize 14 xpaset -p ds9 catalog symbol fontweight bold xpaset -p ds9 catalog symbol fontslant italic xpaset -p ds9 catalog symbol add xpaset -p ds9 catalog symbol remove xpaset -p ds9 catalog symbol load aux/ds9.sym xpaset -p ds9 catalog symbol save foo.sym xpaset -p ds9 catalog name m51 xpaset -p ds9 catalog coordinate 202.48 47.21 fk5 xpaset -p ds9 catalog system wcs xpaset -p ds9 catalog sky fk5 xpaset -p ds9 catalog skyformat degrees xpaset -p ds9 catalog size 22 22 arcmin xpaset -p ds9 catalog regions xpaset -p ds9 regions delete all xpaset -p ds9 catalog retrieve xpaset -p ds9 catalog save foo.cat xpaset -p ds9 catalog filter '$Jmag>15' xpaset -p ds9 catalog filter load aux/ds9.flt xpaset -p ds9 catalog retrieve xpaset -p ds9 catalog cancel #xpaset -p ds9 catalog print xpaset -p ds9 catalog server sao xpaset -p ds9 catalog sort "Jmag" incr xpaset -p ds9 catalog maxrows 3000 xpaset -p ds9 catalog allcols xpaset -p ds9 catalog allrows xpaset -p ds9 catalog ra "RAJ2000" xpaset -p ds9 catalog dec "DEJ2000" xpaset -p ds9 catalog psystem wcs xpaset -p ds9 catalog psky fk5 xpaset -p ds9 catalog hide xpaset -p ds9 catalog show xpaset -p ds9 catalog panto no #xpaset -p ds9 catalog edit yes xpaset -p ds9 catalog location 400 xpaset -p ds9 catalog header xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog 2mass xpaset -p ds9 catalog xmm xpaset -p ds9 catalog match function 1and2 xpaset -p ds9 catalog match error 2 arcsec xpaset -p ds9 catalog match return 1only xpaset -p ds9 catalog match unique no xpaset -p ds9 catalog match 2mass xmm xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog clear xpaset -p ds9 catalog close xpaset -p ds9 catalog clear xpaset -p ds9 catalog close testit $tt fi tt="cd" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 cd >> ${tt}.out xpaset -p ds9 cd . testit $tt fi tt="cmap" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 cmap >> ${tt}.out xpaget ds9 cmap file >> ${tt}.out xpaget ds9 cmap invert >> ${tt}.out xpaget ds9 cmap value >> ${tt}.out xpaget ds9 cmap lock >> ${tt}.out xpaset -p ds9 cmap open xpaset -p ds9 cmap Heat xpaset -p ds9 cmap load aux/ds9.sao xpaset -p ds9 cmap save foo.sao xpaset -p ds9 cmap invert yes xpaset -p ds9 cmap value 5 .2 xpaset -p ds9 cmap match xpaset -p ds9 cmap lock yes xpaset -p ds9 cmap lock no xpaset -p ds9 cmap tag load aux/ds9.tag xpaset -p ds9 cmap tag save foo.tag xpaset -p ds9 cmap tag delete xpaset -p ds9 cmap Grey xpaset -p ds9 cmap close testit $tt fi tt="colorbar" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 colorbar >> ${tt}.out xpaget ds9 colorbar orientation >> ${tt}.out xpaget ds9 colorbar numerics >> ${tt}.out xpaget ds9 colorbar space >> ${tt}.out xpaget ds9 colorbar font >> ${tt}.out xpaget ds9 colorbar fontsize >> ${tt}.out xpaget ds9 colorbar fontweight >> ${tt}.out xpaget ds9 colorbar fontslant >> ${tt}.out xpaget ds9 colorbar size >> ${tt}.out xpaget ds9 colorbar ticks >> ${tt}.out xpaset -p ds9 colorbar no xpaset -p ds9 colorbar yes xpaset -p ds9 colorbar vertical xpaset -p ds9 colorbar horizontal xpaset -p ds9 colorbar numerics no xpaset -p ds9 colorbar numerics yes xpaset -p ds9 colorbar space value xpaset -p ds9 colorbar space distance xpaset -p ds9 colorbar font times xpaset -p ds9 colorbar fontsize 30 xpaset -p ds9 colorbar fontweight bold xpaset -p ds9 colorbar fontslant roman xpaset -p ds9 colorbar font helvetica xpaset -p ds9 colorbar fontsize 10 xpaset -p ds9 colorbar fontweight normal xpaset -p ds9 colorbar fontslant roman xpaset -p ds9 colorbar size 30 xpaset -p ds9 colorbar ticks 9 xpaset -p ds9 colorbar size 20 xpaset -p ds9 colorbar ticks 11 testit $tt fi tt="console" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 console testit $tt fi tt="contour" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/contours..." xpaset -p ds9 contour yes xpaget ds9 contour >> ${tt}.out xpaget ds9 contour wcs fk5 >> ${tt}.out xpaget ds9 contour color >> ${tt}.out xpaget ds9 contour width >> ${tt}.out xpaget ds9 contour smooth >> ${tt}.out xpaget ds9 contour method >> ${tt}.out xpaget ds9 contour nlevels >> ${tt}.out xpaget ds9 contour scale >> ${tt}.out xpaget ds9 contour log exp >> ${tt}.out xpaget ds9 contour mode >> ${tt}.out xpaget ds9 contour limits >> ${tt}.out xpaget ds9 contour levels >> ${tt}.out xpaset -p ds9 contour open xpaset -p ds9 contour xpaset -p ds9 contour yes xpaset -p ds9 contour clear xpaset -p ds9 contour yes xpaset -p ds9 contour load aux/ds9.con wcs fk5 red 2 xpaset -p ds9 contour save foo.con wcs fk5 xpaset -p ds9 contour clear xpaset -p ds9 contour yes xpaset -p ds9 contour convert xpaset -p ds9 regions delete all xpaset -p ds9 contour loadlevels aux/ds9.lev xpaset -p ds9 contour savelevels foo.lev xpaset -p ds9 contour clear xpaset -p ds9 contour yes xpaset -p ds9 contour copy xpaset -p ds9 contour paste wcs red 2 xpaset -p ds9 contour clear xpaset -p ds9 contour yes xpaset -p ds9 contour color yellow xpaset -p ds9 contour width 2 xpaset -p ds9 contour smooth 5 xpaset -p ds9 contour method block xpaset -p ds9 contour nlevels 10 xpaset -p ds9 contour width 2 xpaset -p ds9 contour scale sqrt xpaset -p ds9 contour log exp 1000 xpaset -p ds9 contour mode zscale xpaset -p ds9 contour limits 1 100 xpaset -p ds9 contour levels "{1 10 100 1000}" xpaset -p ds9 contour clear xpaset -p ds9 contour close testit $tt fi tt="crop" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 mode crop xpaset -p ds9 crop 978 970 356 308 xpaget ds9 crop >> ${tt}.out xpaget ds9 crop wcs fk5 sexagesimal arcsec >> ${tt}.out xpaget ds9 crop lock >> ${tt}.out xpaset -p ds9 crop 978 970 356 308 xpaset -p ds9 crop 13:29:52.908 +47:11:38.19 35.279606 30.522805 wcs fk5 arcsec xpaset -p ds9 crop reset xpaset -p ds9 3d xpaset -p ds9 fits data/3d.fits xpaset -p ds9 3d vp 45 30 xpaset -p ds9 crop 3d 25 75 xpaset -p ds9 crop reset xpaset -p ds9 crop match wcs xpaset -p ds9 crop lock wcs xpaset -p ds9 crop lock none xpaset -p ds9 frame delete xpaset -p ds9 mode none xpaset -p ds9 3d close xpaset -p ds9 cube close testit $tt fi tt="crosshair" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 mode crosshair xpaget ds9 crosshair >> ${tt}.out xpaget ds9 crosshair wcs fk5 sexagesimal >> ${tt}.out xpaget ds9 crosshair lock >> ${tt}.out xpaset -p ds9 crosshair 13:29:55.287 +47:11:37.73 wcs fk5 xpaset -p ds9 crosshair match wcs xpaset -p ds9 crosshair lock wcs xpaset -p ds9 crosshair lock none xpaset -p ds9 mode none testit $tt fi tt="cube" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/datacube..." xpaset -p ds9 cube open xpaset -p ds9 cube close xpaset -p ds9 fits new data/3d.fits xpaget ds9 cube >> ${tt}.out xpaget ds9 cube interval >> ${tt}.out xpaget ds9 cube axis >> ${tt}.out xpaget ds9 cube lock >> ${tt}.out xpaget ds9 cube order >> ${tt}.out xpaget ds9 cube axes lock >> ${tt}.out xpaset -p ds9 cube 2 xpaset -p ds9 cube interval .5 xpaset -p ds9 cube axis 3 xpaset -p ds9 cube play xpaset -p ds9 cube stop xpaset -p ds9 cube match wcs xpaset -p ds9 cube lock wcs xpaset -p ds9 cube lock none xpaset -p ds9 cube order 321 xpaset -p ds9 cube order 123 xpaset -p ds9 cube axes lock yes xpaset -p ds9 cube axes lock no xpaset -p ds9 frame delete xpaset -p ds9 cube close testit $tt fi tt="cursor" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 mode crosshair xpaset -p ds9 cursor 10 10 xpaset -p ds9 mode none testit $tt fi tt="data" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 data image 450 520 3 3 yes >> ${tt}.out xpaget ds9 data physical 899 1039 6 6 no >> ${tt}.out xpaget ds9 data fk5 202.4709 47.19681 0.00016517 0.00016517 yes >> ${tt}.out xpaget ds9 data wcs fk5 202.4709 47.19681 0.00016517 0.00016517 no >> ${tt}.out testit $tt fi tt="dsssao" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/dss..." xpaset -p ds9 dsssao open xpaset -p ds9 dsssao close xpaset -p ds9 dsssao size 30 30 arcsec xpaget ds9 dsssao size >> ${tt}.out xpaset -p ds9 dsssao save no xpaget ds9 dsssao save >> ${tt}.out xpaset -p ds9 dsssao frame new xpaget ds9 dsssao frame >> ${tt}.out xpaset -p ds9 dsssao update frame xpaset -p ds9 dsssao m51 xpaset -p ds9 dsssao name m51 xpaget ds9 dsssao name >> ${tt}.out xpaset -p ds9 dsssao name {} xpaset -p ds9 dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal xpaget ds9 dsssao coord >> ${tt}.out xpaset -p ds9 dsssao update frame xpaset -p ds9 mode crosshair xpaset -p ds9 dsssao update crosshair xpaset -p ds9 dsssao close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="dsseso" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 dsseso open xpaset -p ds9 dsseso close xpaset -p ds9 dsseso survey DSS2-red xpaget ds9 dsseso survey >> ${tt}.out xpaset -p ds9 dsseso size 30 30 arcsec xpaget ds9 dsseso size >> ${tt}.out xpaset -p ds9 dsseso save no xpaget ds9 dsseso save >> ${tt}.out xpaset -p ds9 dsseso frame new xpaget ds9 dsseso frame >> ${tt}.out xpaset -p ds9 dsseso update frame xpaset -p ds9 dsseso m51 xpaset -p ds9 dsseso name m51 xpaget ds9 dsseso name >> ${tt}.out xpaset -p ds9 dsseso name {} xpaset -p ds9 dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal xpaget ds9 dsseso coord >> ${tt}.out xpaset -p ds9 dsseso update frame xpaset -p ds9 mode crosshair xpaset -p ds9 dsseso update crosshair xpaset -p ds9 dsseso close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="dssstsci" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 dssstsci open xpaset -p ds9 dssstsci close xpaset -p ds9 dssstsci survey all xpaget ds9 dssstsci survey >> ${tt}.out xpaset -p ds9 dssstsci size 30 30 arcsec xpaget ds9 dssstsci size >> ${tt}.out xpaset -p ds9 dssstsci save no xpaget ds9 dssstsci save >> ${tt}.out xpaset -p ds9 dssstsci frame new xpaget ds9 dssstsci frame >> ${tt}.out xpaset -p ds9 dssstsci update frame xpaset -p ds9 dssstsci m51 xpaset -p ds9 dssstsci name m51 xpaget ds9 dssstsci name >> ${tt}.out xpaset -p ds9 dssstsci name {} xpaset -p ds9 dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal xpaget ds9 dssstsci coord >> ${tt}.out xpaset -p ds9 dssstsci update frame xpaset -p ds9 mode crosshair xpaset -p ds9 dssstsci update crosshair xpaset -p ds9 dssstsci close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="export" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 export array foo.arr little xpaset -p ds9 export foo.arr little xpaset -p ds9 export nrrd foo.nrrd big xpaset -p ds9 export foo.nrrd xpaset -p ds9 export gif foo.gif xpaset -p ds9 export foo.gif xpaset -p ds9 export tiff foo.tiff none xpaset -p ds9 export foo.tiff xpaset -p ds9 export jpeg foo.jpeg 10 xpaset -p ds9 export foo.jpeg xpaset -p ds9 export png foo.png xpaset -p ds9 export foo.png xpaset -p ds9 frame new rgb xpaset -p ds9 rgbcube rgbcube/float.fits xpaset -p ds9 export rgbarray foo.rgb little xpaset -p ds9 export foo.rgb little xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi # backward compatibility tt="file" if [ "$1" = "$tt" -o -z "$1" ]; then echo "$tt...backward compatibility..." xpaget ds9 file >> ${tt}.out echo -n " default..." xpaset -p ds9 frame new xpaset -p ds9 file fits/float.fits xpaset -p ds9 frame delete xpaset -p ds9 file new fits/float.fits xpaset -p ds9 file slice fits/float.fits xpaset -p ds9 file mask fits/float.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " fits..." xpaset -p ds9 frame new xpaset -p ds9 file fits fits/float.fits xpaset -p ds9 frame delete xpaset -p ds9 file new fits fits/float.fits xpaset -p ds9 file fits slice fits/float.fits xpaset -p ds9 file mask fits fits/float.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " sfits..." xpaset -p ds9 frame new xpaset -p ds9 file sfits sfits/float.hdr sfits/float.arr xpaset -p ds9 frame delete xpaset -p ds9 file new sfits sfits/float.hdr sfits/float.arr xpaset -p ds9 file mask sfits sfits/float.hdr sfits/float.arr xpaset -p ds9 frame delete echo "PASSED" echo -n " url..." xpaset -p ds9 frame new xpaset -p ds9 file url http://ds9.si.edu/download/data/img.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " rgbimage..." xpaset -p ds9 frame new rgb xpaset -p ds9 file rgbimage mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 file new rgbimage mecube/float.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " rgbcube..." xpaset -p ds9 frame new rgb xpaset -p ds9 file rgbcube rgbcube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 file new rgbcube rgbcube/float.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " srgbcube..." xpaset -p ds9 frame new rgb xpaset -p ds9 file srgbcube srgbcube/float.hdr srgbcube/float.arr xpaset -p ds9 frame delete xpaset -p ds9 file new srgbcube srgbcube/float.hdr srgbcube/float.arr xpaset -p ds9 frame delete echo "PASSED" echo -n " mecube..." xpaset -p ds9 frame new xpaset -p ds9 file mecube mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mecube mecube/float.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " multiframe..." xpaset -p ds9 frame new xpaset -p ds9 file multiframe mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 file new multiframe mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 single echo "PASSED" echo -n " mosaic..." xpaset -p ds9 frame new xpaset -p ds9 file mosaic mosaic/mosaicimage.fits xpaset -p ds9 frame clear xpaset -p ds9 file mosaic wcs mosaic/mosaicimage.fits xpaset -p ds9 frame clear xpaset -p ds9 file mosaic iraf mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaic mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaic mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaic wcs mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaic wcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicimage..." xpaset -p ds9 frame new xpaset -p ds9 file mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 frame clear xpaset -p ds9 file mosaicimage wcs mosaic/mosaicimage.fits xpaset -p ds9 frame clear xpaset -p ds9 file mosaicimage iraf mosaic/mosaicimage.fits xpaset -p ds9 frame clear xpaset -p ds9 file mosaicimage wfpc2 mosaic/hst.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicimage wcs mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaicimage wcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicwcs..." xpaset -p ds9 frame new xpaset -p ds9 file mosaicwcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicwcs mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaicwcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaiciraf..." xpaset -p ds9 frame new xpaset -p ds9 file mosaiciraf mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaiciraf mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaiciraf mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicimagewcs..." xpaset -p ds9 frame new xpaset -p ds9 file mosaicimagewcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicimagewcs mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaicimagewcs mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicimageiraf..." xpaset -p ds9 frame new xpaset -p ds9 file mosaicimageiraf mosaic/mosaicimage.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicimageiraf mosaic/mosaicimage.fits xpaset -p ds9 file mask mosaicimageiraf mosaic/mosaicimage.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicimagewfpc2..." xpaset -p ds9 frame new xpaset -p ds9 file mosaicimagewfpc2 mosaic/hst.fits xpaset -p ds9 frame delete xpaset -p ds9 file new mosaicimagewfpc2 mosaic/hst.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " smosaic...no test..." echo "PASSED" echo -n " smosaiciraf...no test..." echo "PASSED" echo -n " smosaicwcs...no test..." echo "PASSED" echo -n " array..." xpaset -p ds9 frame new xpaset -p ds9 file array array/float_big.arr[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete xpaset -p ds9 file new array array/float_big.arr[dim=256,bitpix=-32,endian=big] xpaset -p ds9 file mask array array/float_big.arr[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete echo "PASSED" echo -n " rgbarray..." xpaset -p ds9 frame new rgb xpaset -p ds9 file rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete xpaset -p ds9 file new rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete echo "PASSED" echo -n " photo..." xpaset -p ds9 frame new xpaset -p ds9 file photo photo/rose.tiff xpaset -p ds9 frame delete xpaset -p ds9 file new photo photo/rose.tiff xpaset -p ds9 file photo slice photo/rose.tiff xpaset -p ds9 frame delete echo "PASSED" echo -n " file save..." xpaset -p ds9 file save foo.fits echo "PASSED" echo -n " file save gz..." xpaset -p ds9 file save gz foo.fits.gz echo "PASSED" echo -n " file save resample..." xpaset -p ds9 file save resample foo.fits echo "PASSED" echo -n " file save resample gz..." xpaset -p ds9 file save resample gz foo.fits.gz echo "PASSED" xpaset -p ds9 rgb close xpaset -p ds9 cube close testit $tt fi tt="fits" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 fits > /dev/null xpaget ds9 fits image > /dev/null xpaget ds9 fits slice > /dev/null cat fits/table.fits | xpaset ds9 fits new xpaget ds9 fits table > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 frame new xpaset -p ds9 fits fits/float.fits xpaset -p ds9 frame delete xpaset -p ds9 fits new fits/float.fits xpaset -p ds9 fits slice fits/float.fits xpaset -p ds9 fits mask fits/float.fits xpaset -p ds9 frame delete xpaget ds9 fits size >> ${tt}.out xpaget ds9 fits width >> ${tt}.out xpaget ds9 fits height >> ${tt}.out xpaget ds9 fits depth >> ${tt}.out xpaget ds9 fits bitpix >> ${tt}.out xpaget ds9 fits type >> ${tt}.out xpaget ds9 fits size wcs fk5 arcsec >> ${tt}.out xpaget ds9 fits header >> ${tt}.out xpaget ds9 fits header 1 >> ${tt}.out xpaget ds9 fits header keyword BITPIX >> ${tt}.out xpaget ds9 fits header 1 keyword BITPIX >> ${tt}.out xpaset -p ds9 single # backward compatibility xpaget ds9 fits image > /dev/null xpaget ds9 fits image gz > /dev/null xpaget ds9 fits resample > /dev/null xpaget ds9 fits resample gz > /dev/null xpaset -p ds9 frame new xpaset -p ds9 fits fits/table.fits xpaget ds9 fits table > /dev/null xpaget ds9 fits table gz> /dev/null xpaset -p ds9 frame delete xpaset -p ds9 frame new cat mecube/float.fits | xpaset ds9 fits mecube xpaset -p ds9 frame delete cat mecube/float.fits | xpaset ds9 fits new mecube xpaset -p ds9 frame delete xpaset -p ds9 frame new cat mosaic/mosaicimage.fits | xpaset ds9 fits mosaicimage cat mosaic/mosaicimage.fits | xpaset ds9 fits mosaicimage wcs xpaset -p ds9 frame delete cat mosaic/mosaicimage.fits | xpaset ds9 fits new mosaicimage cat mosaic/mosaicimage.fits | xpaset ds9 fits mask mosaicimage xpaset -p ds9 frame delete xpaset -p ds9 frame new cat mosaic/mosaicimage.fits | xpaset ds9 fits mosaicimagewcs xpaset -p ds9 frame delete cat mosaic/mosaicimage.fits | xpaset ds9 fits new mosaicimagewcs cat mosaic/mosaicimage.fits | xpaset ds9 fits mask mosaicimagewcs xpaset -p ds9 frame delete xpaset -p ds9 frame new cat mosaic/mosaicimage.fits | xpaset ds9 fits mosaicimageiraf xpaset -p ds9 frame delete cat mosaic/mosaicimage.fits | xpaset ds9 fits new mosaicimageiraf cat mosaic/mosaicimage.fits | xpaset ds9 fits mask mosaicimageiraf xpaset -p ds9 frame delete xpaset -p ds9 frame new cat mosaic/hst.fits | xpaset ds9 fits mosaicimagewfpc2 xpaset -p ds9 frame delete cat mosaic/hst.fits | xpaset ds9 fits new mosaicimagewfpc2 xpaset -p ds9 frame delete xpaset -p ds9 frame new rgb cat rgbcube/float.fits | xpaset ds9 fits rgbcube xpaset -p ds9 frame delete cat rgbcube/float.fits | xpaset ds9 fits new rgbcube xpaset -p ds9 frame delete xpaset -p ds9 frame new rgb cat mecube/float.fits | xpaset ds9 fits rgbimage xpaset -p ds9 frame delete cat mecube/float.fits | xpaset ds9 fits new rgbimage xpaset -p ds9 frame delete xpaset -p ds9 rgb close xpaset -p ds9 cube close testit $tt fi tt="frame" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 frame lock >> ${tt}.out xpaget ds9 frame has amplifier >> ${tt}.out xpaget ds9 frame has datamin >> ${tt}.out xpaget ds9 frame has datasec >> ${tt}.out xpaget ds9 frame has detector >> ${tt}.out xpaget ds9 frame has grid >> ${tt}.out xpaget ds9 frame has iis >> ${tt}.out xpaget ds9 frame has irafmin >> ${tt}.out xpaget ds9 frame has physical >> ${tt}.out xpaget ds9 frame has smooth >> ${tt}.out xpaget ds9 frame has contour >> ${tt}.out xpaget ds9 frame has contour aux >> ${tt}.out xpaget ds9 frame has fits >> ${tt}.out xpaget ds9 frame has fits bin >> ${tt}.out xpaget ds9 frame has fits cube >> ${tt}.out xpaget ds9 frame has fits mosaic >> ${tt}.out xpaget ds9 frame has marker highlite >> ${tt}.out xpaget ds9 frame has marker paste >> ${tt}.out xpaget ds9 frame has marker select >> ${tt}.out xpaget ds9 frame has marker undo >> ${tt}.out xpaget ds9 frame has system physical >> ${tt}.out xpaget ds9 frame has wcs wcsa >> ${tt}.out xpaget ds9 frame has wcs equatorial wcsa >> ${tt}.out xpaset -p ds9 frame new rgb xpaset -p ds9 frame delete xpaset -p ds9 frame new 3d xpaset -p ds9 frame delete xpaset -p ds9 frame new xpaset -p ds9 fits data/img.fits xpaset -p ds9 tile xpaget ds9 frame > /dev/null xpaget ds9 frame frameno > /dev/null xpaget ds9 frame all > /dev/null xpaget ds9 frame active > /dev/null xpaset -p ds9 frame center xpaset -p ds9 frame center 1 xpaset -p ds9 frame center all xpaset -p ds9 frame reset xpaset -p ds9 frame reset 1 xpaset -p ds9 frame reset all xpaset -p ds9 frame refresh xpaset -p ds9 frame refresh 1 xpaset -p ds9 frame refresh all xpaset -p ds9 frame hide xpaset -p ds9 frame hide 1 xpaset -p ds9 frame hide all xpaset -p ds9 frame show xpaset -p ds9 frame show 1 xpaset -p ds9 frame show all xpaset -p ds9 frame move first xpaset -p ds9 frame move back xpaset -p ds9 frame move forward xpaset -p ds9 frame move last xpaset -p ds9 frame first xpaset -p ds9 frame prev xpaset -p ds9 frame next xpaset -p ds9 frame last xpaset -p ds9 frame frameno 1 xpaset -p ds9 frame 2 xpaset -p ds9 frame match wcs xpaset -p ds9 frame lock wcs xpaset -p ds9 frame lock none xpaset -p ds9 frame clear xpaset -p ds9 frame clear 1 xpaset -p ds9 frame clear all xpaset -p ds9 frame delete xpaset -p ds9 frame delete 1 xpaset -p ds9 frame delete all xpaset -p ds9 fits new data/img.fits xpaset -p ds9 rgb close xpaset -p ds9 3d close xpaset -p ds9 cube close testit $tt fi tt="gif" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 gif photo/rose.gif cat photo/rose.gif | xpaset ds9 gif xpaget ds9 gif > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 gif new photo/rose.gif xpaset -p ds9 gif slice photo/rose.gif xpaset -p ds9 frame delete testit $tt fi tt="grid" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 wcs wcs xpaget ds9 grid >> ${tt}.out xpaget ds9 grid type >> ${tt}.out xpaget ds9 grid system >> ${tt}.out xpaget ds9 grid sky >> ${tt}.out xpaget ds9 grid skyformat >> ${tt}.out xpaget ds9 grid grid >> ${tt}.out xpaget ds9 grid grid color >> ${tt}.out xpaget ds9 grid grid width >> ${tt}.out xpaget ds9 grid grid style >> ${tt}.out xpaget ds9 grid grid gap1 >> ${tt}.out xpaget ds9 grid grid gap2 >> ${tt}.out xpaget ds9 grid axes >> ${tt}.out xpaget ds9 grid axes color >> ${tt}.out xpaget ds9 grid axes width >> ${tt}.out xpaget ds9 grid axes style >> ${tt}.out xpaget ds9 grid axes type >> ${tt}.out xpaget ds9 grid axes origin >> ${tt}.out xpaget ds9 grid format1 >> ${tt}.out xpaget ds9 grid format2 >> ${tt}.out xpaget ds9 grid tickmarks >> ${tt}.out xpaget ds9 grid tickmarks color >> ${tt}.out xpaget ds9 grid tickmarks width >> ${tt}.out xpaget ds9 grid tickmarks style >> ${tt}.out xpaget ds9 grid border >> ${tt}.out xpaget ds9 grid border color >> ${tt}.out xpaget ds9 grid border width >> ${tt}.out xpaget ds9 grid border style >> ${tt}.out xpaget ds9 grid numerics >> ${tt}.out xpaget ds9 grid numerics font >> ${tt}.out xpaget ds9 grid numerics fontweight >> ${tt}.out xpaget ds9 grid numerics fontslant >> ${tt}.out xpaget ds9 grid numerics fontsize >> ${tt}.out xpaget ds9 grid numerics color >> ${tt}.out xpaget ds9 grid numerics gap1 >> ${tt}.out xpaget ds9 grid numerics gap2 >> ${tt}.out xpaget ds9 grid numerics type >> ${tt}.out xpaget ds9 grid numerics vertical >> ${tt}.out xpaget ds9 grid title >> ${tt}.out xpaget ds9 grid title text >> ${tt}.out xpaget ds9 grid title def >> ${tt}.out xpaget ds9 grid title gap >> ${tt}.out xpaget ds9 grid title font >> ${tt}.out xpaget ds9 grid title fontweight >> ${tt}.out xpaget ds9 grid title fontslant >> ${tt}.out xpaget ds9 grid title fontsize >> ${tt}.out xpaget ds9 grid title color >> ${tt}.out xpaget ds9 grid labels >> ${tt}.out xpaget ds9 grid labels text1 >> ${tt}.out xpaget ds9 grid labels def1 >> ${tt}.out xpaget ds9 grid labels gap1 >> ${tt}.out xpaget ds9 grid labels text2 >> ${tt}.out xpaget ds9 grid labels def2 >> ${tt}.out xpaget ds9 grid labels gap2 >> ${tt}.out xpaget ds9 grid labels font >> ${tt}.out xpaget ds9 grid labels fontweight >> ${tt}.out xpaget ds9 grid labels fontslant >> ${tt}.out xpaget ds9 grid labels fontsize >> ${tt}.out xpaget ds9 grid labels color >> ${tt}.out xpaset -p ds9 grid open xpaset -p ds9 grid close xpaset -p ds9 grid xpaset -p ds9 grid yes xpaset -p ds9 grid type analysis xpaset -p ds9 grid system wcs xpaset -p ds9 grid sky fk5 xpaset -p ds9 grid skyformat degrees xpaset -p ds9 grid grid yes xpaset -p ds9 grid grid color red xpaset -p ds9 grid grid width 2 xpaset -p ds9 grid grid style 1 xpaset -p ds9 grid grid gap1 .01 xpaset -p ds9 grid grid gap2 .01 xpaset -p ds9 grid axes yes xpaset -p ds9 grid axes color red xpaset -p ds9 grid axes width 2 xpaset -p ds9 grid axes style 1 xpaset -p ds9 grid axes type exterior xpaset -p ds9 grid axes origin lll xpaset -p ds9 grid format1 d.2 xpaset -p ds9 grid format2 d.2 xpaset -p ds9 grid tickmarks yes xpaset -p ds9 grid tickmarks color red xpaset -p ds9 grid tickmarks width 2 xpaset -p ds9 grid tickmarks style 1 xpaset -p ds9 grid border yes xpaset -p ds9 grid border color red xpaset -p ds9 grid border width 2 xpaset -p ds9 grid border style 1 xpaset -p ds9 grid numerics yes xpaset -p ds9 grid numerics font courier xpaset -p ds9 grid numerics fontweight bold xpaset -p ds9 grid numerics fontslant roman xpaset -p ds9 grid numerics fontsize 12 xpaset -p ds9 grid numerics color red xpaset -p ds9 grid numerics gap1 10 xpaset -p ds9 grid numerics gap2 10 xpaset -p ds9 grid numerics type exterior xpaset -p ds9 grid numerics vertical yes xpaset -p ds9 grid title yes xpaset -p ds9 grid title text {Hello World} xpaset -p ds9 grid title def yes xpaset -p ds9 grid title gap 10 xpaset -p ds9 grid title font courier xpaset -p ds9 grid title fontweight bold xpaset -p ds9 grid title fontslant roman xpaset -p ds9 grid title fontsize 12 xpaset -p ds9 grid title color red xpaset -p ds9 grid labels yes xpaset -p ds9 grid labels text1 {Hello World} xpaset -p ds9 grid labels def1 yes xpaset -p ds9 grid labels gap1 10 xpaset -p ds9 grid labels text2 {Hello World} xpaset -p ds9 grid labels def2 yes xpaset -p ds9 grid labels gap2 10 xpaset -p ds9 grid labels font courier xpaset -p ds9 grid labels fontweight bold xpaset -p ds9 grid labels fontslant roman xpaset -p ds9 grid labels fontsize 12 xpaset -p ds9 grid labels color red xpaset -p ds9 grid save foo.grd xpaset -p ds9 grid load foo.grd xpaset -p ds9 grid reset xpaset -p ds9 grid no xpaset -p ds9 grid close testit $tt fi tt="header" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 header xpaset -p ds9 header save foo.txt xpaset -p ds9 header close xpaset -p ds9 header 1 xpaset -p ds9 header close 1 testit $tt fi tt="height" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 height >> /dev/null xpaset -p ds9 height 443 testit $tt fi tt="iconify" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 iconify >> ${tt}.out xpaset -p ds9 iconify xpaset -p ds9 iconify yes xpaset -p ds9 iconify no testit $tt fi tt="iis" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 iis filename >> ${tt}.out xpaget ds9 iis filename 1 >> ${tt}.out xpaset -p ds9 iis filename foo.fits xpaset -p ds9 iis filename foo.fits 1 testit $tt fi tt="iexam" if [ "$1" = "$tt" ]; then echo "$tt..." echo "Select coordinate point:" xpaget ds9 iexam coordinate wcs fk5 degrees echo " ok" sleep $delay echo "Press key:" xpaget ds9 iexam key coordinate wcs fk5 degrees echo " ok" sleep $delay echo "Press either:" xpaget ds9 iexam any coordinate wcs fk5 degrees echo " ok" sleep $delay echo "Select value point:" xpaget ds9 iexam data echo " ok" sleep $delay echo "Press key:" xpaget ds9 iexam key data echo " ok" sleep $delay echo "Press any:" xpaget ds9 iexam any data echo " ok" echo "Macro string:" xpaget ds9 iexam any 'Click at $x,$y in file $filename' echo " ok" sleep $delay testit $tt fi tt="jpeg" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/jpg..." xpaset -p ds9 frame new xpaset -p ds9 jpeg photo/rose.jpeg cat photo/rose.jpeg | xpaset ds9 jpeg xpaget ds9 jpeg > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 jpeg new photo/rose.jpeg xpaset -p ds9 jpeg slice photo/rose.jpeg xpaset -p ds9 frame delete testit $tt fi tt="lock" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 lock frame >> ${tt}.out xpaget ds9 lock crosshair >> ${tt}.out xpaget ds9 lock crop >> ${tt}.out xpaget ds9 lock slice >> ${tt}.out xpaget ds9 lock bin >> ${tt}.out xpaget ds9 lock axes >> ${tt}.out xpaget ds9 lock scale >> ${tt}.out xpaget ds9 lock scalelimits >> ${tt}.out xpaget ds9 lock colorbar >> ${tt}.out xpaget ds9 lock block >> ${tt}.out xpaget ds9 lock smooth >> ${tt}.out xpaset -p ds9 fits new data/img.fits xpaset -p ds9 tile xpaset -p ds9 mode crosshair xpaset -p ds9 lock frame wcs xpaset -p ds9 lock frame none xpaset -p ds9 lock crosshair wcs xpaset -p ds9 crosshair 13:29:56 +47:11:38 wcs fk5 xpaset -p ds9 lock crosshair none xpaset -p ds9 lock crop wcs xpaset -p ds9 lock crop none xpaset -p ds9 lock slice wcs xpaset -p ds9 lock slice none xpaset -p ds9 lock bin yes xpaset -p ds9 lock bin no xpaset -p ds9 lock axes yes xpaset -p ds9 lock axes no xpaset -p ds9 lock scale yes xpaset -p ds9 lock scale no xpaset -p ds9 lock scalelimits yes xpaset -p ds9 lock scalelimits no xpaset -p ds9 lock colorbar yes xpaset -p ds9 lock colorbar no xpaset -p ds9 lock smooth yes xpaset -p ds9 lock smooth no xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 wcs align no xpaset -p ds9 scale zscale testit $tt fi tt="lower" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 lower xpaset -p ds9 raise testit $tt fi tt="magnifier" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 magnifier color >> ${tt}.out xpaget ds9 magnifier zoom >> ${tt}.out xpaget ds9 magnifier cursor >> ${tt}.out xpaget ds9 magnifier region >> ${tt}.out xpaset -p ds9 magnifier color white xpaset -p ds9 magnifier zoom 4 xpaset -p ds9 magnifier cursor yes xpaset -p ds9 magnifier region yes testit $tt fi tt="mask" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 mask color >> ${tt}.out xpaget ds9 mask mark >> ${tt}.out xpaget ds9 mask transparency >> ${tt}.out xpaset -p ds9 mask open xpaset -p ds9 mask color cyan xpaset -p ds9 mask clear xpaset -p ds9 mask close sleep $delay testit $tt fi tt="match" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 fits new data/img.fits xpaset -p ds9 tile xpaset -p ds9 mode crosshair xpaset -p ds9 match frame wcs xpaset -p ds9 match frame image xpaset -p ds9 match crosshair wcs xpaset -p ds9 match crop wcs xpaset -p ds9 match slice wcs xpaset -p ds9 match bin xpaset -p ds9 match axes xpaset -p ds9 match scale xpaset -p ds9 match scalelimits xpaset -p ds9 match colorbar xpaset -p ds9 match block xpaset -p ds9 match smooth xpaset -p ds9 frame delete xpaset -p ds9 mode none xpaset -p ds9 scale zscale testit $tt fi tt="mecube" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 mecube mecube/float.fits cat mecube/float.fits | xpaset ds9 mecube xpaget ds9 mecube > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 cube close testit $tt fi tt="minmax" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 minmax >> ${tt}.out xpaget ds9 minmax mode >> ${tt}.out xpaset -p ds9 minmax scan xpaset -p ds9 minmax mode scan testit $tt fi tt="mode" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 mode >> ${tt}.out xpaset -p ds9 mode none xpaset -p ds9 mode region # backward compatibility xpaset -p ds9 mode pointer xpaset -p ds9 mode crosshair xpaset -p ds9 mode colorbar xpaset -p ds9 mode pan xpaset -p ds9 mode zoom xpaset -p ds9 mode rotate xpaset -p ds9 mode catalog xpaset -p ds9 mode examine xpaset -p ds9 mode none testit $tt fi tt="mosaic" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 mosaic mosaic/mosaicimage.fits xpaget ds9 mosaic > /dev/null xpaset -p ds9 frame clear xpaset -p ds9 mosaic wcs mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaic wcs xpaset -p ds9 frame clear xpaset -p ds9 mosaic iraf mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaic iraf xpaset -p ds9 frame delete xpaset -p ds9 mosaic new mosaic/mosaicimage.fits xpaset -p ds9 mosaic mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi tt="mosaicimage" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits xpaget ds9 mosaicimage > /dev/null xpaset -p ds9 frame clear xpaset -p ds9 mosaicimage wcs mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimage wcs xpaset -p ds9 frame clear xpaset -p ds9 mosaicimage iraf mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimage iraf xpaset -p ds9 frame clear xpaset -p ds9 mosaicimage wfpc2 mosaic/hst.fits xpaset -p ds9 frame clear cat mosaic/hst.fits | xpaset ds9 mosaicimage wfpc2 xpaset -p ds9 frame delete xpaset -p ds9 mosaicimage new mosaic/mosaicimage.fits xpaset -p ds9 mosaicimage mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi # backward compatibility tt="mosaicwcs" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 mosaicwcs mosaic/mosaicimage.fits xpaget ds9 mosaicwcs > /dev/null xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaicwcs xpaset -p ds9 frame delete xpaset -p ds9 mosaicwcs new mosaic/mosaicimage.fits xpaset -p ds9 mosaicwcs mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi # backward compatibility tt="mosaiciraf" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 mosaiciraf mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaiciraf xpaset -p ds9 frame delete xpaset -p ds9 mosaiciraf new mosaic/mosaicimage.fits xpaset -p ds9 mosaiciraf mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi # backward compatibility tt="mosaicimagewcs" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimagewcs mosaic/mosaicimage.fits xpaget ds9 mosaicimagewcs > /dev/null xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimagewcs xpaset -p ds9 frame delete xpaset -p ds9 mosaicimagewcs new mosaic/mosaicimage.fits xpaset -p ds9 mosaicimagewcs mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi # backward compatibility tt="mosaicimageiraf" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimageiraf mosaic/mosaicimage.fits xpaset -p ds9 frame clear cat mosaic/mosaicimage.fits | xpaset ds9 mosaicimageiraf xpaset -p ds9 frame delete xpaset -p ds9 mosaicimageiraf new mosaic/mosaicimage.fits xpaset -p ds9 mosaicimageiraf mask mosaic/mosaicimage.fits xpaset -p ds9 frame delete testit $tt fi # backward compatibility tt="mosaicimagewfpc2" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimage wfpc2 mosaic/hst.fits xpaset -p ds9 frame clear cat mosaic/hst.fits | xpaset ds9 mosaicimagewfpc2 xpaset -p ds9 frame delete testit $tt fi # movie will fail if moved from corner tt="movie" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/savempeg..." xpaset -p ds9 width 715 xpaset -p ds9 height 450 xpaset -p ds9 movie foo.mpg xpaset -p ds9 movie frame foo.mpg xpaset -p ds9 movie slice foo.mpg xpaset -p ds9 frame new 3d xpaset -p ds9 movie 3d foo.mpg number 1 azfrom 0 azto 0 elfrom 0 elto 0 slfrom 1 slto 1 repeat 1 xpaset -p ds9 frame delete # backward compatibility xpaset -p ds9 savempeg foo.mpg xpaset -p ds9 3d close xpaset -p ds9 cube close testit $tt fi tt="multiframe" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/memf..." xpaset -p ds9 frame new xpaset -p ds9 multiframe mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="nameserver" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 nameserver open xpaset -p ds9 nameserver close xpaset -p ds9 nameserver m51 xpaget ds9 nameserver >> ${tt}.out xpaget ds9 nameserver server >> ${tt}.out xpaget ds9 nameserver skyformat >> ${tt}.out xpaget ds9 nameserver m51 >> ${tt}.out xpaset -p ds9 nameserver name m51 xpaset -p ds9 nameserver server simbad-cds xpaset -p ds9 nameserver skyformat degrees xpaset -p ds9 mode crosshair xpaset -p ds9 nameserver crosshair xpaset -p ds9 nameserver pan xpaset -p ds9 nameserver close xpaset -p ds9 mode none xpaset -p ds9 frame reset testit $tt fi tt="nan" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 nan >> ${tt}.out xpaset -p ds9 nan blue xpaset -p ds9 nan white testit $tt fi tt="nrrd" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 nrrd nrrd/float_big_raw.nrrd cat nrrd/float_big_raw.nrrd | xpaset ds9 nrrd xpaget ds9 nrrd > /dev/null xpaget ds9 nrrd big > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 nrrd new nrrd/float_big_raw.nrrd xpaset -p ds9 nrrd mask nrrd/float_big_raw.nrrd xpaset -p ds9 frame delete testit $tt fi tt="nvss" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 nvss open xpaset -p ds9 nvss close xpaset -p ds9 nvss size 30 30 arcsec xpaget ds9 nvss size >> ${tt}.out xpaset -p ds9 nvss save no xpaget ds9 nvss save >> ${tt}.out xpaset -p ds9 nvss frame new xpaget ds9 nvss frame >> ${tt}.out xpaset -p ds9 nvss update frame xpaset -p ds9 nvss m51 xpaset -p ds9 nvss name m51 xpaget ds9 nvss name >> ${tt}.out xpaset -p ds9 nvss name {} xpaset -p ds9 nvss coord 13:29:52.37 +47:11:40.8 sexagesimal xpaget ds9 nvss coord >> ${tt}.out xpaset -p ds9 nvss update frame xpaset -p ds9 mode crosshair xpaset -p ds9 nvss update crosshair xpaset -p ds9 nvss close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="orient" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 orient open xpaset -p ds9 orient none xpaset -p ds9 orient x xpaset -p ds9 orient y xpaset -p ds9 orient xy xpaset -p ds9 orient close xpaget ds9 orient >> ${tt}.out xpaset -p ds9 frame reset testit $tt fi tt="pagesetup" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 pspagesetup orient >> ${tt}.out xpaget ds9 pspagesetup scale >> ${tt}.out xpaget ds9 pspagesetup size >> ${tt}.out xpaset -p ds9 pspagesetup orient portrait xpaset -p ds9 pspagesetup scale 100 xpaset -p ds9 pspagesetup size letter testit $tt fi tt="pan" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 pan physical >> ${tt}.out xpaget ds9 pan wcs fk5 sexagesimal >> ${tt}.out xpaset -p ds9 pan open xpaset -p ds9 pan 100 100 image xpaset -p ds9 pan to 13:29:55.666 +47:12:16.29 wcs fk5 xpaset -p ds9 pan close xpaset -p ds9 frame reset testit $tt fi tt="pixeltable" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 pixeltable >> ${tt}.out xpaset -p ds9 pixeltable xpaset -p ds9 pixeltable yes xpaset -p ds9 pixeltable no xpaset -p ds9 pixeltable open xpaset -p ds9 pixeltable close testit $tt fi tt="plot" if [ "$1" = "$tt" -o -z "$1" ]; then echo "$tt..." echo -n " empty plot..." xpaset -p ds9 plot xpaget ds9 plot >> ${tt}.out sleep $delay xpaset -p ds9 plot close xpaset -p ds9 plot new xpaset -p ds9 plot bar xpaset -p ds9 plot new bar xpaset -p ds9 plot scatter xpaset -p ds9 plot new scatter sleep $delay xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot new name foo xpaset -p ds9 plot new name foo line xpaset -p ds9 plot new name foo bar xpaset -p ds9 plot new name foo scatter sleep $delay xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot new name foo "{The Title}" "{X Axis}" "{Y Axis}" xy xpaset -p ds9 plot new name foo line "{The Title}" "{X Axis}" "{Y Axis}" xy xpaset -p ds9 plot new name foo bar "{The Title}" "{X Axis}" "{Y Axis}" xy xpaset -p ds9 plot new name foo scatter "{The Title}" "{X Axis}" "{Y Axis}" xy sleep $delay xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n " data..." xpaset -p ds9 plot new cat plot/xy.dat | xpaset ds9 plot data xy xpaset -p ds9 plot new name foo cat plot/xy.dat | xpaset ds9 plot foo data xy sleep $delay xpaset -p ds9 plot close xpaset -p ds9 plot close echo "PASSED" echo -n " save/load..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot save foo.dat sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " clear..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy sleep $delay xpaset -p ds9 plot clear xpaset -p ds9 plot close echo "PASSED" echo -n " duplicate..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot dup xpaset -p ds9 plot duplicate 1 sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " stats..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot stats >> /dev/null xpaset -p ds9 plot stats sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " list..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot list >> /dev/null xpaset -p ds9 plot list sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " saveconfig/loadconfig..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot saveconfig foo.plt xpaset -p ds9 plot loadconfig foo.plt sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " pagesetup..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot pagesetup orient portrait xpaset -p ds9 plot pagesetup size letter sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " print..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy #xpaset -p ds9 plot print xpaset -p ds9 plot print destination printer xpaset -p ds9 plot print command "lp" xpaset -p ds9 plot print filename "foo.ps" xpaset -p ds9 plot print color rgb sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " mode..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot mode >> ${tt}.out xpaset -p ds9 plot mode pointer sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " axis..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot axis x grid no xpaset -p ds9 plot axis x grid yes xpaset -p ds9 plot axis x log yes xpaset -p ds9 plot axis x log no xpaset -p ds9 plot axis x flip yes xpaset -p ds9 plot axis x flip no xpaset -p ds9 plot axis x auto no xpaset -p ds9 plot axis x min 1 xpaset -p ds9 plot axis x max 100 xpaset -p ds9 plot axis x format "%f" xpaset -p ds9 plot axis y grid no xpaset -p ds9 plot axis y grid yes xpaset -p ds9 plot axis y log yes xpaset -p ds9 plot axis y log no xpaset -p ds9 plot axis y flip yes xpaset -p ds9 plot axis y flip no xpaset -p ds9 plot axis y auto no xpaset -p ds9 plot axis y min 1 xpaset -p ds9 plot axis y max 100 xpaset -p ds9 plot axis y format "%f" xpaget ds9 plot axis x grid >> ${tt}.out xpaget ds9 plot axis x log >> ${tt}.out xpaget ds9 plot axis x flip >> ${tt}.out xpaget ds9 plot axis x auto >> ${tt}.out xpaget ds9 plot axis x min >> ${tt}.out xpaget ds9 plot axis x max >> ${tt}.out xpaget ds9 plot axis x format >> ${tt}.out xpaget ds9 plot axis y grid >> ${tt}.out xpaget ds9 plot axis y log >> ${tt}.out xpaget ds9 plot axis y flip >> ${tt}.out xpaget ds9 plot axis y auto >> ${tt}.out xpaget ds9 plot axis y min >> ${tt}.out xpaget ds9 plot axis y max >> ${tt}.out xpaget ds9 plot axis y format >> ${tt}.out sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " legend..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot legend >> ${tt}.out xpaget ds9 plot legend position >> ${tt}.out xpaset -p ds9 plot legend yes xpaset -p ds9 plot legend position left xpaset -p ds9 plot legend position right xpaset -p ds9 plot legend position bottom xpaset -p ds9 plot legend position top sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " font..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot title "{This is a Title}" xpaset -p ds9 plot title xaxis "{X Axis}" xpaset -p ds9 plot title yaxis "{Y Axis}" xpaset -p ds9 plot title legend "{This is the Legend}" xpaset -p ds9 plot legend yes xpaget ds9 plot font title font >> ${tt}.out xpaget ds9 plot font title size >> ${tt}.out xpaget ds9 plot font title weight >> ${tt}.out xpaget ds9 plot font title slant >> ${tt}.out xpaget ds9 plot font labels font >> ${tt}.out xpaget ds9 plot font labels size >> ${tt}.out xpaget ds9 plot font labels weight >> ${tt}.out xpaget ds9 plot font labels slant >> ${tt}.out xpaget ds9 plot font numbers font >> ${tt}.out xpaget ds9 plot font numbers size >> ${tt}.out xpaget ds9 plot font numbers weight >> ${tt}.out xpaget ds9 plot font numbers slant >> ${tt}.out xpaget ds9 plot font legendtitle font >> ${tt}.out xpaget ds9 plot font legendtitle size >> ${tt}.out xpaget ds9 plot font legendtitle weight >> ${tt}.out xpaget ds9 plot font legendtitle slant >> ${tt}.out xpaget ds9 plot font legend font >> ${tt}.out xpaget ds9 plot font legend size >> ${tt}.out xpaget ds9 plot font legend weight >> ${tt}.out xpaget ds9 plot font legend slant >> ${tt}.out xpaset -p ds9 plot font title font times xpaset -p ds9 plot font title size 12 xpaset -p ds9 plot font title weight bold xpaset -p ds9 plot font title slant roman xpaset -p ds9 plot font labels font times xpaset -p ds9 plot font labels size 12 xpaset -p ds9 plot font labels weight bold xpaset -p ds9 plot font labels slant roman xpaset -p ds9 plot font numbers font times xpaset -p ds9 plot font numbers size 12 xpaset -p ds9 plot font numbers weight bold xpaset -p ds9 plot font numbers slant roman xpaset -p ds9 plot font legendtitle font times xpaset -p ds9 plot font legendtitle size 12 xpaset -p ds9 plot font legendtitle weight bold xpaset -p ds9 plot font legendtitle slant roman xpaset -p ds9 plot font legend font times xpaset -p ds9 plot font legend size 12 xpaset -p ds9 plot font legend weight bold xpaset -p ds9 plot font legend slant roman sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " title..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot title "{This is a Title}" xpaset -p ds9 plot title x "{X Axis}" xpaset -p ds9 plot title y "{Y Axis}" xpaset -p ds9 plot title legend "{This is the Legend}" xpaget ds9 plot title >> ${tt}.out xpaget ds9 plot title x >> ${tt}.out xpaget ds9 plot title y >> ${tt}.out xpaget ds9 plot title legend >> ${tt}.out sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " barmode..." xpaset -p ds9 plot new bar xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot load plot/xyey.dat xyey xpaget ds9 plot barmode >> ${tt}.out xpaset -p ds9 plot barmode normal xpaset -p ds9 plot barmode stacked xpaset -p ds9 plot barmode aligned xpaset -p ds9 plot barmode overlap sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " show..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot show >> ${tt}.out xpaset -p ds9 plot show no xpaset -p ds9 plot show yes sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " shape..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot shape >> ${tt}.out xpaget ds9 plot shape fill >> ${tt}.out xpaget ds9 plot shape color >> ${tt}.out xpaset -p ds9 plot shape circle xpaset -p ds9 plot shape square xpaset -p ds9 plot shape diamond xpaset -p ds9 plot shape plus xpaset -p ds9 plot shape splus xpaset -p ds9 plot shape scross xpaset -p ds9 plot shape triangle xpaset -p ds9 plot shape arrow xpaset -p ds9 plot shape circle xpaset -p ds9 plot shape fill no xpaset -p ds9 plot shape fill yes xpaset -p ds9 plot shape color cyan sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " smooth..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot smooth >> ${tt}.out xpaset -p ds9 plot smooth step xpaset -p ds9 plot smooth linear xpaset -p ds9 plot smooth cubic xpaset -p ds9 plot smooth quadratic xpaset -p ds9 plot smooth catrom sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " color..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot color >> ${tt}.out xpaset -p ds9 plot color magenta xpaset -p ds9 plot color "#2C8" sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " width..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot width >> ${tt}.out xpaget ds9 plot dash >> ${tt}.out xpaset -p ds9 plot width 2 xpaset -p ds9 plot dash yes sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " error..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xyexey.dat xyexey xpaget ds9 plot error >> ${tt}.out xpaget ds9 plot error cap >> ${tt}.out xpaget ds9 plot error color >> ${tt}.out xpaget ds9 plot error width >> ${tt}.out xpaset -p ds9 plot error no xpaset -p ds9 plot error yes xpaset -p ds9 plot error cap yes xpaset -p ds9 plot error cap no xpaset -p ds9 plot error color blue xpaset -p ds9 plot error width 2 sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " name..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaget ds9 plot name >> ${tt}.out xpaset -p ds9 plot legend yes xpaset -p ds9 plot name "{This is a test}" sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " select..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot load plot/xyey.dat xyey xpaget ds9 plot select >> ${tt}.out xpaset -p ds9 plot select 2 xpaset -p ds9 plot dataset 1 sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " backward compatibility graph..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot graph grid x no xpaset -p ds9 plot graph grid y yes xpaset -p ds9 plot graph log x no xpaset -p ds9 plot graph log y no xpaset -p ds9 plot graph scale linearlinear xpaset -p ds9 plot graph flip x no xpaset -p ds9 plot graph flip y no xpaset -p ds9 plot graph range x min 1 xpaset -p ds9 plot graph range x max 100 xpaset -p ds9 plot graph range y min 1 xpaset -p ds9 plot graph range y max 100 xpaset -p ds9 plot graph range x auto yes xpaset -p ds9 plot graph range y auto yes xpaset -p ds9 plot graph format x {} xpaset -p ds9 plot graph format y {} xpaset -p ds9 plot graph labels title "{The Title}" xpaset -p ds9 plot graph labels xaxis "{X Axis}" xpaset -p ds9 plot graph labels yaxis "{Y Axis}" xpaset -p ds9 plot graph type line sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " backward compatibility view..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot view discrete yes xpaset -p ds9 plot view line yes xpaset -p ds9 plot view step yes xpaset -p ds9 plot view quadratic yes xpaset -p ds9 plot view errorbar yes sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " backward compatibility line..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot line discrete cross xpaset -p ds9 plot line linear width 2 xpaset -p ds9 plot line linear dash yes xpaset -p ds9 plot line step width 2 xpaset -p ds9 plot line step dash yes xpaset -p ds9 plot line quadratic width 2 xpaset -p ds9 plot line quadratic dash yes xpaset -p ds9 plot line errorbar width 2 xpaset -p ds9 plot line errorbar style 1 sleep $delay xpaset -p ds9 plot close echo "PASSED" echo -n " backward compatibility color..." xpaset -p ds9 plot new xpaset -p ds9 plot load plot/xy.dat xy xpaset -p ds9 plot color discrete red xpaset -p ds9 plot color line green xpaset -p ds9 plot color step blue xpaset -p ds9 plot color quadratic cyan xpaset -p ds9 plot color errorbar magenta sleep $delay xpaset -p ds9 plot close echo "PASSED" testit $tt fi tt="png" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 png photo/rose.png cat photo/rose.png | xpaset ds9 png xpaget ds9 png > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 png new photo/rose.png xpaset -p ds9 png slice photo/rose.png xpaset -p ds9 frame delete testit $tt fi tt="prefs" if [ "$1" = "$tt" -o -z "$1" ]; then echo "$tt..." xpaset -p ds9 prefs clear # backward compatibility xpaget ds9 prefs bgcolor >> ${tt}.out xpaget ds9 prefs nancolor >> ${tt}.out xpaget ds9 prefs threads >> ${tt}.out xpaget ds9 prefs irafalign >> ${tt}.out xpaset -p ds9 prefs bgcolor white xpaset -p ds9 prefs nancolor white xpaset -p ds9 prefs threads 8 xpaset -p ds9 prefs irafalign yes testit $tt fi tt="preserve" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 preserve pan >> ${tt}.out xpaget ds9 preserve regions >> ${tt}.out xpaset -p ds9 preserve pan no xpaset -p ds9 preserve regions no testit $tt fi tt="print" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 psprint destination >> ${tt}.out xpaget ds9 psprint command >> ${tt}.out xpaget ds9 psprint color >> ${tt}.out xpaget ds9 psprint level >> ${tt}.out xpaget ds9 psprint resolution >> ${tt}.out #xpaset -p ds9 psprint xpaset -p ds9 psprint destination printer xpaset -p ds9 psprint command lp xpaset -p ds9 psprint filename ds9.ps xpaset -p ds9 psprint color rgb xpaset -p ds9 psprint level 2 xpaset -p ds9 psprint resolution 150 testit $tt fi tt="raise" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 lower xpaset -p ds9 raise testit $tt fi tt="regions" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/region..." xpaset -p ds9 regions delete all xpaset -p ds9 regions system physical xpaset -p ds9 regions sky fk5 xpaset -p ds9 regions skyformat degrees echo "physical;circle(957,1027,40) # tag=foo" | xpaset ds9 regions xpaget ds9 regions >> ${tt}.out xpaget ds9 regions epsilon >> ${tt}.out xpaget ds9 regions show >> ${tt}.out xpaget ds9 regions showtext >> ${tt}.out xpaget ds9 regions centroid auto >> ${tt}.out xpaget ds9 regions centroid radius >> ${tt}.out xpaget ds9 regions centroid iteration >> ${tt}.out xpaget ds9 regions -format pros -system wcs -sky fk5 -skyformat sexagesimal -delim nl -prop edit 1 -group foo -strip yes >> ${tt}.out xpaget ds9 regions include >> ${tt}.out xpaget ds9 regions exclude >> ${tt}.out xpaget ds9 regions source >> ${tt}.out xpaget ds9 regions background >> ${tt}.out xpaget ds9 regions selected >> ${tt}.out xpaget ds9 regions format >> ${tt}.out xpaget ds9 regions system >> ${tt}.out xpaget ds9 regions sky >> ${tt}.out xpaget ds9 regions skyformat >> ${tt}.out xpaget ds9 regions strip >> ${tt}.out xpaget ds9 regions shape >> ${tt}.out xpaget ds9 regions color >> ${tt}.out xpaget ds9 regions width >> ${tt}.out xpaget ds9 regions delim >> ${tt}.out xpaget ds9 regions groups >> ${tt}.out echo "image; circle 100 100 20" | xpaset ds9 regions echo "fk5; circle 13:29:55 47:11:50 .5'" | xpaset ds9 regions echo "physical; ellipse 100 100 20 40" | xpaset ds9 regions echo "box 100 100 20 40 25" | xpaset ds9 regions echo "image; line 100 100 200 400" | xpaset ds9 regions echo "physical; ruler 200 300 200 400" | xpaset ds9 regions echo "image; text 100 100 # text={Hello, World}" | xpaset ds9 regions echo "fk4; boxcircle point 13:29:55 47:11:50" | xpaset ds9 regions xpaset -p ds9 regions delete all xpaset -p ds9 regions regions/ds9.physical.reg xpaset -p ds9 regions delete all xpaset -p ds9 regions load regions/ds9.physical.reg xpaset -p ds9 regions delete all xpaset -p ds9 regions load 'regions/ds9.fk5*.reg' xpaset -p ds9 regions delete all xpaset -p ds9 regions load all regions/ds9.physical.reg xpaset -p ds9 regions save foo.reg xpaset -p ds9 regions list xpaset -p ds9 regions list close xpaset -p ds9 regions delete all xpaset -p ds9 regions epsilon 5 xpaset -p ds9 regions show yes xpaset -p ds9 regions showtext yes xpaset -p ds9 regions centroid xpaset -p ds9 regions centroid auto no xpaset -p ds9 regions centroid radius 10 xpaset -p ds9 regions centroid iteration 30 #xpaset -p ds9 regions getinfo xpaset -p ds9 regions move front xpaset -p ds9 regions move back xpaset -p ds9 regions select all xpaset -p ds9 regions select none xpaset -p ds9 regions delete all xpaset -p ds9 regions delete select xpaset -p ds9 regions format ds9 xpaset -p ds9 regions system physical xpaset -p ds9 regions sky fk5 xpaset -p ds9 regions skyformat degrees xpaset -p ds9 regions delim nl xpaset -p ds9 regions strip no xpaset -p ds9 regions shape circle xpaset -p ds9 regions color green xpaset -p ds9 regions width 1 xpaset -p ds9 regions edit yes xpaset -p ds9 regions include xpaset -p ds9 regions command {circle 100 100 20} xpaset -p ds9 regions group new xpaset -p ds9 regions group foo new xpaset -p ds9 regions group foo update xpaset -p ds9 regions group foo select xpaset -p ds9 regions group foo color red xpaset -p ds9 regions group foo copy xpaset -p ds9 regions group foo delete xpaset -p ds9 regions group foo cut xpaset -p ds9 regions group foo font {time 14 bold} xpaset -p ds9 regions group foo move 100 100 xpaset -p ds9 regions group foo movefront xpaset -p ds9 regions group foo moveback xpaset -p ds9 regions group foo property delete no xpaset -p ds9 regions delete all xpaset -p ds9 regions command {circle 100 100 20} xpaset -p ds9 regions select all xpaset -p ds9 regions copy xpaset -p ds9 regions cut xpaset -p ds9 regions paste xpaset -p ds9 regions undo xpaset -p ds9 regions delete all xpaset -p ds9 regions load regions/ds9.physical.reg xpaset -p ds9 regions select all xpaset -p ds9 regions composite xpaset -p ds9 regions desolve xpaset -p ds9 regions delete all xpaset -p ds9 regions command {circle 100 100 20} xpaset -p ds9 regions savetemplate foo.tpl xpaset -p ds9 regions delete all xpaset -p ds9 regions template foo.tpl xpaset -p ds9 regions delete all xpaset -p ds9 regions template foo.tpl at 202.46963 47.19556 fk5 xpaset -p ds9 regions delete all testit $tt fi tt="restore" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 backup foo.bck xpaset -p ds9 restore foo.bck testit $tt fi tt="rgb" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 rgb open xpaset -p ds9 rgb close xpaset -p ds9 rgb xpaget ds9 rgb channel >> ${tt}.out xpaget ds9 rgb view red >> ${tt}.out xpaget ds9 rgb view green >> ${tt}.out xpaget ds9 rgb view blue >> ${tt}.out xpaget ds9 rgb system >> ${tt}.out xpaget ds9 rgb lock wcs >> ${tt}.out xpaget ds9 rgb lock crop >> ${tt}.out xpaget ds9 rgb lock slice >> ${tt}.out xpaget ds9 rgb lock bin >> ${tt}.out xpaget ds9 rgb lock scale >> ${tt}.out xpaget ds9 rgb lock scalelimits >> ${tt}.out xpaget ds9 rgb lock colorbar >> ${tt}.out xpaget ds9 rgb lock block >> ${tt}.out xpaget ds9 rgb lock smooth >> ${tt}.out xpaset -p ds9 rgb green xpaset -p ds9 rgb channel blue xpaset -p ds9 rgb view blue off xpaset -p ds9 rgb system wcs xpaset -p ds9 rgb lock wcs yes xpaset -p ds9 rgb lock wcs no xpaset -p ds9 rgb lock crop yes xpaset -p ds9 rgb lock crop no xpaset -p ds9 rgb lock slice yes xpaset -p ds9 rgb lock slice no xpaset -p ds9 rgb lock bin yes xpaset -p ds9 rgb lock bin no xpaset -p ds9 rgb lock scale yes xpaset -p ds9 rgb lock scale no xpaset -p ds9 rgb lock scalelimits yes xpaset -p ds9 rgb lock scalelimits no xpaset -p ds9 rgb lock colorbar yes xpaset -p ds9 rgb lock colorbar no xpaset -p ds9 rgb lock block yes xpaset -p ds9 rgb lock block no xpaset -p ds9 rgb lock smooth yes xpaset -p ds9 rgb lock smooth no xpaset -p ds9 rgb close xpaset -p ds9 frame delete testit $tt fi tt="rgbarray" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new rgb xpaset -p ds9 rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] cat rgbarray/float_big.rgb | xpaset ds9 rgbarray -[dim=256,bitpix=-32,endian=big] xpaget ds9 rgbarray big > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 rgbarray new rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi tt="rgbcube" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new rgb xpaset -p ds9 rgbcube rgbcube/float.fits cat rgbcube/float.fits | xpaset ds9 rgbcube xpaget ds9 rgbcube > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 rgbcube new rgbcube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi tt="rgbimage" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new rgb xpaset -p ds9 rgbimage mecube/float.fits cat mecube/float.fits | xpaset ds9 rgbimage xpaget ds9 rgbimage > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 rgbimage new mecube/float.fits xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi tt="rotate" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 rotate >> ${tt}.out xpaset -p ds9 rotate open xpaset -p ds9 rotate to 30 xpaset -p ds9 rotate 15 xpaset -p ds9 rotate close xpaset -p ds9 frame reset testit $tt fi tt="samp" if [ "$1" = "$tt" ]; then echo "samp" xpaset -p ds9 samp no xpaset -p ds9 samp yes xpaset -p ds9 samp broadcast xpaset -p ds9 samp broadcast image xpaset -p ds9 samp send aladin xpaset -p ds9 samp send image aladin testit $tt fi tt="save" if [ "$1" = "$tt" -o -z "$1" ]; then echo "$tt/savefits..." echo -n " fits..." xpaset -p ds9 save foo.fits xpaset -p ds9 save fits foo.fits xpaset -p ds9 save foo.fits image xpaset -p ds9 save fits foo.fits image xpaset -p ds9 save foo.fits slice xpaset -p ds9 save fits foo.fits slice xpaset -p ds9 frame new xpaset -p ds9 fits fits/table.fits xpaset -p ds9 save foo.fits xpaset -p ds9 save fits foo.fits xpaset -p ds9 save foo.fits image xpaset -p ds9 save fits foo.fits image xpaset -p ds9 save foo.fits table xpaset -p ds9 save fits foo.fits table xpaset -p ds9 frame delete echo "PASSED" echo -n " rgbimage..." xpaset -p ds9 frame new rgb xpaset -p ds9 rgbimage mecube/float.fits xpaset -p ds9 save rgbimage foo.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " rgbcube..." xpaset -p ds9 frame new rgb xpaset -p ds9 rgbcube rgbcube/float.fits xpaset -p ds9 save rgbcube foo.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mecube..." xpaset -p ds9 frame new xpaset -p ds9 mecube mecube/float.fits xpaset -p ds9 save mecube foo.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaicimage..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 save mosaicimage foo.fits xpaset -p ds9 frame delete echo "PASSED" echo -n " mosaic..." xpaset -p ds9 frame new xpaset -p ds9 mosaicimage mosaic/mosaicimage.fits xpaset -p ds9 save mosaic foo.fits xpaset -p ds9 frame delete echo "PASSED" # backward compatibility echo -n " savefits..." xpaset -p ds9 savefits foo.fits echo "PASSED" xpaset -p ds9 rgb close xpaset -p ds9 cube close testit $tt fi # movie will fail if moved from corner tt="saveimage" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 saveimage fits foo.fits xpaset -p ds9 saveimage foo.fits xpaset -p ds9 saveimage eps foo.eps xpaset -p ds9 saveimage foo.eps #xpaset -p ds9 saveimage foo.gif xpaset -p ds9 saveimage tiff foo.tiff none xpaset -p ds9 saveimage foo.tiff xpaset -p ds9 saveimage jpeg foo.jpeg 100 xpaset -p ds9 saveimage foo.jpeg xpaset -p ds9 saveimage png foo.png xpaset -p ds9 saveimage foo.png # backward compatibility (6.2) xpaset -p ds9 saveimage tiff none foo.tiff xpaset -p ds9 saveimage jpeg 100 foo.jpeg xpaset -p ds9 saveimage mpeg foo.mpeg testit $tt fi tt="scale" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 scale >> ${tt}.out xpaget ds9 scale log exp >> ${tt}.out xpaget ds9 scale limits >> ${tt}.out xpaget ds9 scale mode >> ${tt}.out xpaget ds9 scale scope >> ${tt}.out xpaget ds9 scale datasec >> ${tt}.out xpaget ds9 scale lock >> ${tt}.out xpaget ds9 scale lock limits >> ${tt}.out xpaset -p ds9 scale open xpaset -p ds9 scale minmax xpaset -p ds9 scale linear xpaset -p ds9 scale log xpaset -p ds9 scale pow xpaset -p ds9 scale sqrt xpaset -p ds9 scale squared xpaset -p ds9 scale asinh xpaset -p ds9 scale sinh xpaset -p ds9 scale histequ xpaset -p ds9 scale log exp 1000 xpaset -p ds9 scale log exp 10000 xpaset -p ds9 scale linear xpaset -p ds9 scale minmax xpaset -p ds9 scale zscale xpaset -p ds9 scale zmax xpaset -p ds9 scale user xpaset -p ds9 scale mode zscale xpaset -p ds9 scale mode zmax xpaset -p ds9 scale mode 95 xpaset -p ds9 scale mode minmax xpaset -p ds9 scale limits 0 100 xpaset -p ds9 scale global xpaset -p ds9 scale local xpaset -p ds9 scale scope global xpaset -p ds9 scale scope local xpaset -p ds9 scale mode minmax xpaset -p ds9 scale linear xpaset -p ds9 scale zscale xpaset -p ds9 scale datasec yes xpaset -p ds9 scale match xpaset -p ds9 scale match limits xpaset -p ds9 scale lock yes xpaset -p ds9 scale lock no xpaset -p ds9 scale lock limits yes xpaset -p ds9 scale lock limits no xpaset -p ds9 scale close testit $tt fi # backward compatibility tt="sfits" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new xpaset -p ds9 sfits sfits/float.hdr sfits/float.arr xpaset -p ds9 frame delete xpaset -p ds9 sfits new sfits/float.hdr sfits/float.arr xpaset -p ds9 sfits slice sfits/float.hdr sfits/float.arr xpaset -p ds9 sfits mask sfits/float.hdr sfits/float.arr xpaset -p ds9 frame delete testit $tt fi tt="single" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 single >> ${tt}.out xpaset -p ds9 tile xpaget ds9 single >> ${tt}.out xpaset -p ds9 single xpaget ds9 single >> ${tt}.out testit $tt fi tt="shm" if [ "$1" = "$tt" ]; then echo -n "$tt...no test..." testit $tt fi tt="skyview" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 skyview open xpaset -p ds9 skyview close xpaset -p ds9 skyview survey sdssi xpaget ds9 skyview survey >> /dev/null xpaset -p ds9 skyview size 30 30 arcsec xpaget ds9 skyview size >> /dev/null xpaset -p ds9 skyview pixels 600 600 xpaget ds9 skyview pixels >> /dev/null xpaset -p ds9 skyview save no xpaget ds9 skyview save >> /dev/null xpaset -p ds9 skyview frame new xpaget ds9 skyview frame >> /dev/null xpaset -p ds9 skyview update frame xpaset -p ds9 skyview m51 xpaset -p ds9 skyview name m51 xpaget ds9 skyview name >> /dev/null xpaset -p ds9 skyview name {} xpaset -p ds9 skyview coord 13:29:55.301 +47:11:37.73 sexagesimal xpaget ds9 skyview coord >> /dev/null xpaset -p ds9 skyview update frame xpaset -p ds9 mode crosshair xpaset -p ds9 skyview update crosshair xpaset -p ds9 skyview close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="sleep" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 sleep xpaset -p ds9 sleep 2 testit $tt fi # backward compatibility tt="smosaic" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility...no test..." testit $tt fi # backward compatibility tt="smosaicwcs" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility...no test..." testit $tt fi # backward compatibility tt="smosaiciraf" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility...no test..." testit $tt fi tt="smooth" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 smooth >> ${tt}.out xpaget ds9 smooth function >> ${tt}.out xpaget ds9 smooth radius >> ${tt}.out xpaset -p ds9 smooth open xpaset -p ds9 smooth xpaset -p ds9 smooth yes xpaset -p ds9 smooth function tophat xpaset -p ds9 smooth radius 5 xpaset -p ds9 smooth match xpaset -p ds9 smooth lock yes xpaset -p ds9 smooth lock no xpaset -p ds9 smooth no xpaset -p ds9 smooth close testit $tt fi tt="source" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 source aux/source.tcl testit $tt fi # backward compatibility tt="srgbcube" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt...backward compatibility..." xpaset -p ds9 frame new rgb xpaset -p ds9 srgbcube srgbcube/float.hdr srgbcube/float.arr xpaset -p ds9 frame delete xpaset -p ds9 srgbcube new srgbcube/float.hdr srgbcube/float.arr xpaset -p ds9 frame delete xpaset -p ds9 rgb close testit $tt fi tt="tcl" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." cat aux/hello.tcl | xpaset ds9 tcl xpaset -p ds9 tcl 'puts "Hello Again, World"' testit $tt fi tt="threads" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 threads >> ${tt}.out xpaset -p ds9 threads 8 testit $tt fi tt="tiff" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/tif..." xpaset -p ds9 frame new xpaset -p ds9 tiff photo/rose.tiff cat photo/rose.tiff | xpaset ds9 tiff xpaget ds9 tiff > /dev/null xpaget ds9 tiff jpeg > /dev/null xpaset -p ds9 frame delete xpaset -p ds9 tiff new photo/rose.tiff xpaset -p ds9 tiff slice photo/rose.tiff xpaset -p ds9 frame delete testit $tt fi tt="tile" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 tile >> ${tt}.out xpaget ds9 tile mode >> ${tt}.out xpaget ds9 tile grid mode >> ${tt}.out xpaget ds9 tile grid direction >> ${tt}.out xpaset -p ds9 fits new data/img.fits xpaset -p ds9 fits new data/img.fits xpaset -p ds9 tile xpaset -p ds9 tile yes xpaset -p ds9 tile row xpaset -p ds9 tile column xpaset -p ds9 tile grid xpaset -p ds9 tile grid mode automatic xpaset -p ds9 tile grid direction x xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="update" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 update xpaset -p ds9 update 1 100 100 300 400 xpaset -p ds9 update now xpaset -p ds9 update now 1 100 100 300 400 xpaset -p ds9 update off xpaset -p ds9 update on testit $tt fi tt="url" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame new xpaset -p ds9 url http://ds9.si.edu/download/data/img.fits xpaset -p ds9 frame delete testit $tt fi tt="version" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 version >> /dev/null testit $tt fi tt="view" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 frame delete xpaget ds9 view layout >> ${tt}.out xpaget ds9 view keyvalue >> ${tt}.out xpaget ds9 view info >> ${tt}.out xpaget ds9 view panner >> ${tt}.out xpaget ds9 view magnifier >> ${tt}.out xpaget ds9 view buttons >> ${tt}.out xpaget ds9 view colorbar >> ${tt}.out xpaget ds9 view graph horizontal >> ${tt}.out xpaget ds9 view graph vertical >> ${tt}.out xpaget ds9 view filename >> ${tt}.out xpaget ds9 view object >> ${tt}.out xpaget ds9 view keyword >> ${tt}.out xpaget ds9 view minmax >> ${tt}.out xpaget ds9 view lowhigh >> ${tt}.out xpaget ds9 view units >> ${tt}.out xpaget ds9 view wcs >> ${tt}.out xpaget ds9 view detector >> ${tt}.out xpaget ds9 view amplifier >> ${tt}.out xpaget ds9 view physical >> ${tt}.out xpaget ds9 view image >> ${tt}.out xpaget ds9 view frame >> ${tt}.out xpaset -p ds9 view layout vertical sleep $delay xpaset -p ds9 view layout horizontal sleep $delay xpaset -p ds9 view keyvalue BITPIX xpaset -p ds9 view info no xpaset -p ds9 view info yes xpaset -p ds9 view panner no xpaset -p ds9 view panner yes xpaset -p ds9 view magnifier no xpaset -p ds9 view magnifier yes xpaset -p ds9 view buttons no xpaset -p ds9 view buttons yes xpaset -p ds9 view colorbar no xpaset -p ds9 view colorbar yes xpaset -p ds9 view graph horizontal yes xpaset -p ds9 view graph horizontal no xpaset -p ds9 view graph vertical yes xpaset -p ds9 view graph vertical no xpaset -p ds9 view filename no xpaset -p ds9 view filename yes xpaset -p ds9 view object no xpaset -p ds9 view object yes xpaset -p ds9 view keyword yes xpaset -p ds9 view keyword no xpaset -p ds9 view minmax yes xpaset -p ds9 view minmax no xpaset -p ds9 view lowhigh yes xpaset -p ds9 view lowhigh no xpaset -p ds9 view units yes xpaset -p ds9 view units no xpaset -p ds9 view wcs no xpaset -p ds9 view wcs yes xpaset -p ds9 view wcsa yes xpaset -p ds9 view wcsa no xpaset -p ds9 view detector yes xpaset -p ds9 view detector no xpaset -p ds9 view amplifier yes xpaset -p ds9 view amplifier no xpaset -p ds9 view physical no xpaset -p ds9 view physical yes xpaset -p ds9 view image no xpaset -p ds9 view image yes xpaset -p ds9 view frame no xpaset -p ds9 view frame yes sleep $delay xpaset -p ds9 frame new rgb xpaset -p ds9 view red no xpaset -p ds9 view red yes xpaset -p ds9 view green no xpaset -p ds9 view green yes xpaset -p ds9 view blue no xpaset -p ds9 view blue yes xpaset -p ds9 frame delete sleep $delay xpaset -p ds9 fits new data/img.fits xpaset -p ds9 rgb close testit $tt fi tt="vla" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 vla open xpaset -p ds9 vla close xpaset -p ds9 vla size 30 30 arcsec xpaget ds9 vla size >> ${tt}.out xpaset -p ds9 vla save no xpaget ds9 vla save >> ${tt}.out xpaset -p ds9 vla frame new xpaget ds9 vla frame >> ${tt}.out xpaset -p ds9 vla survey first xpaget ds9 vla survey >> ${tt}.out xpaset -p ds9 vla update frame xpaset -p ds9 vla m51 xpaset -p ds9 vla name m51 xpaget ds9 vla name >> ${tt}.out xpaset -p ds9 vla name {} xpaset -p ds9 vla coord 13:29:52.37 +47:11:40.8 sexagesimal xpaget ds9 vla coord >> ${tt}.out xpaset -p ds9 vla update frame xpaset -p ds9 mode crosshair xpaset -p ds9 vla update crosshair xpaset -p ds9 vla close xpaset -p ds9 mode none xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete xpaset -p ds9 frame delete testit $tt fi tt="vo" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 vo method >> ${tt}.out xpaget ds9 vo server >> ${tt}.out xpaget ds9 vo internal >> ${tt}.out xpaget ds9 vo delay >> ${tt}.out xpaget ds9 vo connect >> ${tt}.out xpaget ds9 vo >> /dev/null xpaset -p ds9 vo open xpaset -p ds9 vo method mime xpaset -p ds9 vo server "http://cxc.harvard.edu/chandraed/list.txt" xpaset -p ds9 vo internal yes xpaset -p ds9 vo delay 15 xpaset -p ds9 vo connect foo xpaset -p ds9 vo chandra-ed xpaset -p ds9 vo disconnect chandra-ed xpaset -p ds9 vo close xpaset -p ds9 web close testit $tt fi tt="wcs" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 wcs >> ${tt}.out xpaget ds9 wcs system >> ${tt}.out xpaget ds9 wcs sky >> ${tt}.out xpaget ds9 wcs skyformat >> ${tt}.out xpaget ds9 wcs align >> ${tt}.out xpaset -p ds9 wcs open xpaset -p ds9 wcs wcs xpaset -p ds9 wcs align yes xpaset -p ds9 wcs system wcs xpaset -p ds9 wcs sky galactic xpaset -p ds9 wcs skyformat sexagesimal xpaset -p ds9 wcs align no xpaset -p ds9 wcs sky fk5 xpaset -p ds9 wcs skyformat degrees cat aux/image.wcs | xpaset ds9 wcs append cat aux/image.wcs | xpaset ds9 wcs replace xpaset -p ds9 wcs append aux/image.wcs xpaset -p ds9 wcs replace aux/image.wcs xpaset -p ds9 wcs reset xpaset -p ds9 wcs skyformat sexagesimal xpaset -p ds9 wcs close testit $tt fi tt="web" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 web ds9.si.edu/doc/acknowledgment.html sleep $delay xpaget ds9 web >> ${tt}.out xpaset -p ds9 web ds9.si.edu/doc/helpdesk.html sleep $delay xpaset -p ds9 web hvweb click back sleep $delay xpaset -p ds9 web click forward xpaset -p ds9 web clear xpaset -p ds9 web close testit $tt fi tt="width" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 width >> /dev/null xpaset -p ds9 width 600 testit $tt fi tt="zscale" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaget ds9 zscale contrast >> ${tt}.out xpaget ds9 zscale sample >> ${tt}.out xpaget ds9 zscale line >> ${tt}.out xpaset -p ds9 zscale contrast .25 xpaset -p ds9 zscale sample 600 xpaset -p ds9 zscale line 120 testit $tt fi tt="zoom" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt..." xpaset -p ds9 zoom open xpaset -p ds9 zoom 2 xpaset -p ds9 zoom 2 4 xpaset -p ds9 zoom to 4 xpaset -p ds9 zoom to 2 4 xpaset -p ds9 zoom in xpaset -p ds9 zoom out xpaset -p ds9 zoom to fit xpaset -p ds9 zoom close xpaget ds9 zoom > /dev/null xpaset -p ds9 frame reset testit $tt fi tt="exit" if [ "$1" = "$tt" -o -z "$1" ]; then echo -n "$tt/quit..." xpaset -p ds9 quit fi rm -rf foo.* echo "DONE" ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/3d.xpa�����������������������������������������������������������������������������000644 �000765 �000000 �00000000062 12225313612 015331� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������45 30 45 30 1 mip none yes blue no green yes cyan ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/align.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000003 11311767244 016121� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/bg.xpa�����������������������������������������������������������������������������000644 �000765 �000000 �00000000014 11540446107 015415� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������white white ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/bin.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000051 11715044514 015576� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 4096.5 4096.5 1024 x y 32 32 sum no ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/blink.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000007 12113740635 016126� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no 0.5 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/block.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000005 12450335034 016114� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 no ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/catalog.xpa������������������������������������������������������������������������000644 �000765 �000000 �00000000011 11232370250 016425� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������cat2mass �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/cd.xpa�����������������������������������������������������������������������������000644 �000765 �000000 �00000000031 11240627001 015401� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/Users/joye/saods9/tests �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/cmap.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000032 11755007521 015746� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������grey grey.sao no 1 0.5 no ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/colorbar.xpa�����������������������������������������������������������������������000644 �000765 �000000 �00000000073 11755007521 016636� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������yes horizontal yes distance helvetica 9 normal roman 20 11 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/contour.xpa������������������������������������������������������������������������000644 �000765 �000000 �00000701656 12532123103 016530� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������yes 202.47278 47.218812 202.47282 47.218782 202.47257 47.21864 202.47235 47.218484 202.4721 47.218342 202.47183 47.218216 202.47374 47.219408 202.47378 47.219379 202.47353 47.219237 202.47326 47.21911 202.47803 47.222092 202.47807 47.222062 202.47786 47.221896 202.47756 47.221794 202.47994 47.223284 202.47997 47.223263 202.47974 47.223106 202.47947 47.222986 202.48365 47.223802 202.48335 47.223919 202.48316 47.224099 202.48299 47.224289 202.50389 47.182003 202.50373 47.181955 202.50374 47.181907 202.50378 47.181913 202.50389 47.182003 202.49291 47.175441 202.49272 47.175447 202.49266 47.175287 202.49286 47.175344 202.49291 47.175441 202.51263 47.18806 202.5123 47.187984 202.51227 47.187836 202.51251 47.187823 202.51263 47.18806 202.49885 47.179449 202.49878 47.179429 202.49877 47.179402 202.49881 47.179409 202.49885 47.179449 202.4897 47.173733 202.48931 47.173744 202.48929 47.173482 202.48968 47.173467 202.4897 47.173733 202.4818 47.168799 202.48143 47.168831 202.48132 47.168795 202.48096 47.168869 202.48089 47.168905 202.48072 47.169017 202.48035 47.168977 202.48011 47.168828 202.47987 47.168681 202.47986 47.16848 202.48003 47.168288 202.48025 47.168124 202.48058 47.168037 202.4807 47.168069 202.48098 47.168183 202.48118 47.168365 202.48149 47.168462 202.48178 47.168573 202.4818 47.168799 202.52011 47.193026 202.52001 47.193017 202.52001 47.192963 202.52012 47.192942 202.52011 47.193026 202.49835 47.179441 202.49831 47.179448 202.49832 47.17942 202.49836 47.179414 202.49835 47.179441 202.49717 47.178702 202.49728 47.178907 202.4973 47.179079 202.49709 47.179249 202.49686 47.179225 202.49658 47.179232 202.49632 47.179366 202.49642 47.179549 202.49643 47.179734 202.49635 47.179922 202.49633 47.179972 202.49635 47.180251 202.49675 47.180278 202.49689 47.1805 202.49695 47.180656 202.49695 47.180779 202.49723 47.180832 202.4973 47.180847 202.4973 47.18088 202.49739 47.18111 202.49773 47.181146 202.49777 47.181151 202.49804 47.181277 202.4984 47.181266 202.49848 47.181281 202.49878 47.181381 202.49906 47.181498 202.49903 47.181656 202.49897 47.18189 202.49923 47.182024 202.49947 47.182171 202.49945 47.182221 202.49947 47.182499 202.49988 47.182487 202.49993 47.182485 202.49993 47.182519 202.49973 47.182697 202.49988 47.182842 202.49999 47.183091 202.50035 47.183081 202.50045 47.183078 202.50073 47.183196 202.50078 47.183352 202.50083 47.183442 202.50103 47.183623 202.50104 47.183812 202.50108 47.183913 202.50123 47.183929 202.50151 47.183921 202.50178 47.183975 202.50188 47.183972 202.50209 47.184138 202.50209 47.184171 202.50205 47.184173 202.50164 47.184185 202.50165 47.184463 202.50168 47.18451 202.5018 47.184679 202.50197 47.184692 202.50205 47.184499 202.50206 47.184451 202.50211 47.18445 202.50252 47.184438 202.50259 47.184419 202.50292 47.184504 202.50293 47.184693 202.50271 47.184855 202.50263 47.185042 202.50264 47.185108 202.50256 47.185093 202.50215 47.185105 202.50217 47.185383 202.5022 47.185432 202.50198 47.185594 202.50199 47.185839 202.50223 47.18599 202.5026 47.18598 202.50273 47.185764 202.50295 47.185784 202.50326 47.185883 202.50354 47.186 202.50353 47.186263 202.50314 47.186291 202.50303 47.186249 202.50306 47.18635 202.50321 47.186366 202.50345 47.186391 202.50372 47.186516 202.50377 47.186715 202.50381 47.186774 202.50402 47.186872 202.50412 47.186869 202.50436 47.187018 202.5046 47.187167 202.50496 47.187157 202.50503 47.187171 202.50504 47.187204 202.50516 47.1874 202.50522 47.187616 202.50509 47.187776 202.50547 47.187822 202.50565 47.188015 202.50566 47.188195 202.50545 47.188359 202.50546 47.188484 202.5057 47.188633 202.50583 47.188863 202.50624 47.188851 202.50628 47.18885 202.50629 47.188883 202.50609 47.189061 202.50619 47.189242 202.50637 47.189237 202.50665 47.189229 202.50662 47.189388 202.50656 47.189621 202.5069 47.189565 202.50708 47.18956 202.50714 47.189716 202.50692 47.189878 202.50661 47.189981 202.50674 47.190141 202.50686 47.190375 202.5071 47.190524 202.50734 47.190673 202.50732 47.190724 202.50734 47.191002 202.50757 47.191151 202.5076 47.1912 202.50773 47.19136 202.50797 47.191509 202.50809 47.191502 202.50843 47.191492 202.5087 47.191621 202.5087 47.191887 202.5083 47.191917 202.5081 47.191809 202.50811 47.192054 202.50812 47.19212 202.50813 47.192365 202.50849 47.192429 202.50861 47.192663 202.50885 47.192812 202.50906 47.192984 202.50933 47.19311 202.5093 47.19316 202.50923 47.193179 202.50887 47.193189 202.50865 47.193351 202.50878 47.193513 202.50875 47.193711 202.50846 47.193749 202.50834 47.193754 202.50809 47.193897 202.50812 47.193998 202.50837 47.194073 202.50844 47.19382 202.50879 47.193833 202.5089 47.194074 202.5089 47.194107 202.50883 47.194126 202.50847 47.194136 202.50838 47.194376 202.50835 47.194479 202.50837 47.194668 202.50809 47.194676 202.50791 47.194681 202.50797 47.194765 202.50819 47.194927 202.5082 47.195165 202.5082 47.195243 202.50835 47.195259 202.50855 47.19531 202.50875 47.195489 202.50879 47.19553 202.50893 47.195679 202.50904 47.195686 202.50938 47.195676 202.50954 47.19588 202.5098 47.196017 202.50983 47.196181 202.50983 47.196316 202.51014 47.196376 202.51037 47.196219 202.51043 47.196195 202.51076 47.196281 202.51072 47.196439 202.51048 47.196586 202.51032 47.196604 202.51011 47.196653 202.50983 47.196777 202.50977 47.19701 202.50976 47.197035 202.50987 47.197264 202.51006 47.197448 202.51007 47.197524 202.50994 47.197746 202.50993 47.197871 202.51007 47.198092 202.51032 47.198236 202.51036 47.198304 202.51033 47.198553 202.51063 47.198475 202.5108 47.198279 202.51118 47.198222 202.51125 47.198198 202.51149 47.198347 202.51149 47.198413 202.51164 47.198563 202.51177 47.198589 202.51198 47.198631 202.51201 47.19874 202.51202 47.198925 202.51231 47.199042 202.51248 47.19924 202.51256 47.199379 202.51248 47.199566 202.51248 47.199632 202.51239 47.199872 202.51228 47.200039 202.51226 47.200089 202.51228 47.200367 202.51269 47.200356 202.51276 47.200337 202.51276 47.200403 202.51278 47.200648 202.51278 47.200714 202.5128 47.200959 202.51312 47.201044 202.51302 47.201161 202.5128 47.201323 202.51259 47.201494 202.51233 47.201632 202.51218 47.201834 202.51197 47.202001 202.51168 47.202119 202.51163 47.20215 202.51126 47.20216 202.5112 47.20214 202.51077 47.202153 202.51056 47.202319 202.51069 47.202517 202.51065 47.202676 202.5107 47.202837 202.51063 47.202963 202.51039 47.203111 202.51027 47.203154 202.51003 47.203005 202.50997 47.202849 202.5099 47.202772 202.5097 47.2026 202.50965 47.20235 202.50979 47.202203 202.50958 47.202037 202.50934 47.201887 202.50931 47.201839 202.50917 47.201689 202.50893 47.20154 202.50873 47.201359 202.50872 47.201171 202.50888 47.20097 202.50913 47.20083 202.50921 47.200683 202.50901 47.200753 202.50867 47.200753 202.50847 47.200579 202.50833 47.200352 202.50832 47.200325 202.50823 47.200104 202.50817 47.199931 202.50826 47.199753 202.50792 47.199683 202.50764 47.199598 202.50777 47.199796 202.50792 47.200008 202.5079 47.200059 202.50783 47.200077 202.50761 47.200176 202.50724 47.200186 202.5071 47.200159 202.50716 47.200242 202.50718 47.200507 202.50679 47.200519 202.50669 47.200266 202.50647 47.200363 202.50611 47.200371 202.50602 47.200111 202.50602 47.20008 202.50597 47.199819 202.506 47.199768 202.50598 47.19949 202.50574 47.199341 202.50543 47.199247 202.50542 47.199109 202.50549 47.198875 202.50549 47.198855 202.50558 47.198614 202.50558 47.198486 202.50557 47.198303 202.50578 47.198138 202.50577 47.198015 202.50581 47.197857 202.50586 47.197623 202.50562 47.197474 202.50532 47.197373 202.50508 47.197399 202.50486 47.197388 202.50468 47.197194 202.50428 47.197201 202.50418 47.197438 202.50402 47.197639 202.50363 47.19765 202.50353 47.197395 202.50353 47.197329 202.50342 47.197148 202.50322 47.196975 202.50321 47.196832 202.50342 47.196826 202.50375 47.196871 202.50382 47.196853 202.50406 47.197002 202.50442 47.196991 202.50441 47.196746 202.5044 47.19668 202.50427 47.19652 202.50411 47.196317 202.5041 47.196191 202.50404 47.196045 202.50379 47.195903 202.50366 47.195915 202.5037 47.195964 202.50369 47.196235 202.5033 47.196267 202.50319 47.196219 202.50291 47.196224 202.5028 47.196277 202.50248 47.196378 202.50228 47.196368 202.50222 47.196216 202.5023 47.196027 202.50229 47.195961 202.50216 47.195801 202.50201 47.195785 202.50178 47.195761 202.5018 47.19565 202.50175 47.195454 202.50148 47.19545 202.50125 47.195504 202.50128 47.195328 202.50141 47.195108 202.50154 47.194958 202.50154 47.194892 202.50161 47.194912 202.50197 47.194859 202.5021 47.194873 202.50245 47.194941 202.50273 47.195061 202.50281 47.195086 202.50311 47.194977 202.50309 47.194794 202.50301 47.194612 202.50298 47.19455 202.50293 47.194564 202.50252 47.194564 202.50227 47.194453 202.50223 47.194449 202.50183 47.194425 202.50165 47.194229 202.50134 47.194168 202.5013 47.194161 202.50101 47.194049 202.5008 47.19413 202.50045 47.19414 202.50026 47.19409 202.50003 47.194128 202.49987 47.193915 202.49966 47.193749 202.49932 47.193672 202.49931 47.1935 202.49949 47.19331 202.49962 47.193126 202.49928 47.193182 202.49912 47.193171 202.49886 47.193215 202.49859 47.193239 202.49862 47.193067 202.49877 47.192863 202.49879 47.19276 202.4987 47.192819 202.49825 47.192837 202.49827 47.192549 202.49867 47.192502 202.49855 47.192289 202.49831 47.19214 202.49813 47.191953 202.4981 47.191844 202.49802 47.191707 202.49797 47.191467 202.49799 47.191401 202.4979 47.191419 202.49757 47.19139 202.4975 47.19117 202.49754 47.191082 202.49739 47.190869 202.49712 47.190741 202.49683 47.190635 202.49655 47.190581 202.49648 47.190567 202.49613 47.190501 202.49617 47.190338 202.4961 47.190193 202.49581 47.190118 202.49577 47.190114 202.4954 47.190161 202.49526 47.190164 202.49489 47.190139 202.49466 47.190298 202.49464 47.190302 202.49437 47.190176 202.49401 47.190186 202.49379 47.190348 202.4938 47.190593 202.49381 47.19066 202.49371 47.190662 202.49347 47.190513 202.49347 47.190447 202.49336 47.190266 202.49321 47.190053 202.49301 47.189881 202.49297 47.189838 202.49295 47.189593 202.49298 47.189543 202.49289 47.189313 202.49289 47.189187 202.49294 47.188953 202.49259 47.188885 202.4923 47.188824 202.49226 47.188806 202.49225 47.188793 202.49223 47.1885 202.49188 47.188438 202.49186 47.18825 202.49183 47.188148 202.49162 47.187978 202.49161 47.187789 202.4916 47.187667 202.49145 47.187454 202.49109 47.18739 202.49088 47.18722 202.49064 47.187071 202.49045 47.186889 202.49011 47.186852 202.49019 47.187082 202.49047 47.187198 202.49048 47.187387 202.49022 47.187519 202.49003 47.187524 202.48968 47.187483 202.48964 47.187484 202.48962 47.187448 202.48951 47.187259 202.48925 47.187129 202.48912 47.187132 202.48912 47.18722 202.48925 47.18745 202.48923 47.187501 202.48931 47.187731 202.48966 47.187767 202.4897 47.187766 202.48973 47.187815 202.48983 47.187996 202.48996 47.188226 202.4902 47.188375 202.49019 47.188403 202.49015 47.188409 202.48974 47.188421 202.48967 47.18844 202.48945 47.188538 202.48909 47.188612 202.48924 47.188759 202.48937 47.188788 202.48965 47.18878 202.48994 47.188891 202.49016 47.189057 202.49039 47.189215 202.4904 47.189428 202.49013 47.189405 202.48988 47.189266 202.4897 47.189292 202.48958 47.189484 202.48961 47.189533 202.48951 47.189535 202.48915 47.189546 202.48905 47.189548 202.48873 47.189463 202.48846 47.189335 202.48838 47.189361 202.488 47.189354 202.48787 47.189343 202.48755 47.189441 202.48745 47.189432 202.48745 47.189378 202.48744 47.189116 202.48733 47.189008 202.48751 47.18906 202.48778 47.188986 202.48777 47.188873 202.48747 47.188798 202.48737 47.188843 202.48743 47.188769 202.48741 47.188484 202.48738 47.188439 202.48748 47.188436 202.48786 47.188478 202.48806 47.188568 202.48816 47.188585 202.48838 47.188747 202.48875 47.188697 202.48879 47.188443 202.48848 47.188348 202.4882 47.188356 202.48797 47.188394 202.48774 47.188245 202.48746 47.188191 202.48736 47.188194 202.48739 47.188144 202.48749 47.187907 202.48745 47.187806 202.4873 47.18779 202.48709 47.187748 202.48683 47.187616 202.48677 47.18746 202.48673 47.187359 202.48649 47.187284 202.48659 47.187465 202.48655 47.187623 202.48639 47.187612 202.4861 47.187504 202.48596 47.187282 202.48562 47.187338 202.48549 47.187557 202.4852 47.187678 202.48489 47.18778 202.48467 47.187942 202.48463 47.187938 202.48459 47.187895 202.48481 47.187733 202.48496 47.187527 202.48505 47.187299 202.4848 47.187159 202.48441 47.187122 202.48417 47.18703 202.48419 47.187283 202.4842 47.187349 202.48409 47.187582 202.48382 47.187559 202.48377 47.18738 202.48389 47.187183 202.4835 47.187211 202.48338 47.187434 202.48338 47.187556 202.48361 47.187714 202.48367 47.187914 202.48364 47.188017 202.48365 47.188205 202.48371 47.188289 202.48398 47.188416 202.48403 47.188442 202.48429 47.188513 202.48459 47.18849 202.48479 47.188467 202.48512 47.18852 202.48519 47.188502 202.4855 47.188595 202.48578 47.188714 202.48579 47.188944 202.48583 47.188999 202.48585 47.189278 202.48544 47.189291 202.48521 47.189136 202.48509 47.1891 202.48481 47.189107 202.48451 47.189001 202.48428 47.188897 202.48418 47.189131 202.48388 47.189139 202.48368 47.189121 202.4834 47.189242 202.4833 47.189245 202.48293 47.189247 202.48285 47.189249 202.48261 47.189346 202.48226 47.18943 202.48236 47.189612 202.48249 47.189571 202.48287 47.18956 202.48296 47.189564 202.48319 47.189412 202.48353 47.189402 202.48368 47.189418 202.48402 47.189331 202.48407 47.189329 202.48435 47.189446 202.48454 47.189633 202.48457 47.189676 202.48467 47.189857 202.48468 47.190046 202.48472 47.190145 202.48484 47.190382 202.48511 47.190313 202.48542 47.190209 202.48552 47.190206 202.48553 47.190272 202.48566 47.190432 202.4859 47.190507 202.48589 47.190262 202.48588 47.190196 202.48598 47.190193 202.48622 47.190342 202.48646 47.190491 202.48646 47.190558 202.48656 47.190739 202.48674 47.190734 202.48682 47.190547 202.48682 47.190481 202.48672 47.190298 202.48648 47.190149 202.48624 47.190002 202.48611 47.189772 202.48581 47.189671 202.48562 47.189482 202.48562 47.189433 202.48569 47.189434 202.48598 47.18954 202.48618 47.18972 202.48654 47.18971 202.48664 47.189707 202.48697 47.189784 202.48711 47.190011 202.48716 47.190094 202.48711 47.190333 202.48711 47.190367 202.48713 47.190645 202.48742 47.19056 202.48773 47.190524 202.48775 47.190764 202.48751 47.190917 202.48718 47.191005 202.48719 47.19125 202.48755 47.19124 202.48773 47.191051 202.48795 47.191013 202.48814 47.191006 202.48821 47.190819 202.48821 47.190753 202.48811 47.190572 202.4881 47.190383 202.48809 47.190261 202.48794 47.190048 202.48797 47.190003 202.48795 47.189714 202.48794 47.189686 202.48798 47.189691 202.48834 47.189753 202.48861 47.189807 202.48871 47.189804 202.48906 47.189868 202.48908 47.190097 202.48886 47.190259 202.48883 47.190362 202.48911 47.190416 202.48933 47.190254 202.48931 47.190009 202.48931 47.189943 202.48953 47.18978 202.48962 47.189778 202.48959 47.189823 202.48974 47.190017 202.4898 47.190253 202.48943 47.190317 202.48944 47.190562 202.48945 47.190628 202.48935 47.190631 202.48899 47.190641 202.48877 47.190803 202.48878 47.191048 202.48902 47.191198 202.48903 47.191264 202.4892 47.191392 202.48937 47.191594 202.48949 47.191552 202.48977 47.191427 202.48985 47.19124 202.48988 47.191195 202.48981 47.190944 202.48973 47.190804 202.49004 47.190701 202.48994 47.19052 202.48993 47.190331 202.49021 47.190323 202.49036 47.190536 202.49072 47.190526 202.49082 47.190523 202.49111 47.19047 202.49129 47.190496 202.4916 47.190478 202.49174 47.190488 202.49194 47.190669 202.49218 47.190818 202.49219 47.190845 202.49212 47.190864 202.49188 47.190715 202.49166 47.190812 202.49161 47.19091 202.49162 47.191091 202.49132 47.191198 202.49125 47.191453 202.49111 47.191605 202.49133 47.191507 202.49155 47.191345 202.49191 47.191271 202.49198 47.191291 202.49234 47.191348 202.49264 47.191453 202.49285 47.191619 202.49293 47.191887 202.4932 47.192013 202.49356 47.192077 202.49368 47.192311 202.4939 47.192214 202.49409 47.192032 202.49416 47.191958 202.49415 47.191769 202.49437 47.191607 202.49436 47.191484 202.49421 47.191272 202.49397 47.191123 202.49374 47.191217 202.49339 47.191225 202.49341 47.191011 202.49372 47.190907 202.49382 47.190905 202.49404 47.191071 202.49428 47.19122 202.49468 47.191208 202.49476 47.19119 202.49499 47.191101 202.49536 47.191033 202.4954 47.19104 202.49564 47.191189 202.49589 47.19133 202.49619 47.19143 202.49625 47.191586 202.49603 47.191748 202.49595 47.191935 202.49619 47.192084 202.49619 47.19215 202.49621 47.192395 202.49647 47.192529 202.4965 47.192639 202.49627 47.192677 202.49599 47.192623 202.49592 47.192609 202.49551 47.19262 202.49553 47.192899 202.49555 47.192947 202.49546 47.19295 202.49522 47.192801 202.49501 47.192629 202.49465 47.192679 202.49447 47.1927 202.49428 47.192516 202.49392 47.192527 202.49394 47.192772 202.49394 47.192838 202.49372 47.193 202.49348 47.193146 202.49363 47.193327 202.49364 47.193547 202.4934 47.193696 202.49322 47.193886 202.4931 47.194042 202.49331 47.194214 202.49358 47.194341 202.49358 47.194407 202.49368 47.194588 202.49369 47.194776 202.4934 47.194893 202.4932 47.194947 202.49302 47.194952 202.49274 47.19496 202.49273 47.194771 202.49272 47.194648 202.49244 47.194595 202.49235 47.194598 202.49234 47.194532 202.49221 47.194372 202.49209 47.194137 202.49209 47.194071 202.49207 47.193826 202.49207 47.19376 202.49205 47.193515 202.49205 47.193449 202.49195 47.193268 202.49179 47.193055 202.49158 47.192889 202.49157 47.192853 202.49162 47.192854 202.49203 47.192843 202.49195 47.192613 202.49167 47.192496 202.49152 47.192284 202.49119 47.192198 202.49107 47.192242 202.49067 47.192291 202.49044 47.192448 202.49026 47.192631 202.49019 47.192611 202.49016 47.192568 202.49014 47.192323 202.48986 47.192381 202.48966 47.192356 202.48941 47.192216 202.4894 47.192094 202.48938 47.191907 202.4891 47.19179 202.48883 47.191737 202.48873 47.19174 202.48837 47.19175 202.48815 47.191912 202.48825 47.192093 202.48855 47.1922 202.48876 47.192296 202.48884 47.19231 202.48884 47.192343 202.48896 47.192549 202.48897 47.192721 202.48881 47.192921 202.48854 47.193053 202.48852 47.193195 202.48853 47.193347 202.48841 47.19357 202.48802 47.193564 202.48776 47.193465 202.48757 47.193643 202.4877 47.193803 202.48771 47.194033 202.48772 47.194114 202.48796 47.194189 202.48821 47.194043 202.48825 47.19405 202.48828 47.194088 202.48807 47.194252 202.48806 47.194516 202.48806 47.194547 202.48821 47.194724 202.48833 47.194714 202.48862 47.194749 202.4889 47.194864 202.48894 47.195097 202.48855 47.195124 202.4885 47.195125 202.48846 47.195195 202.48872 47.195329 202.48864 47.195511 202.48844 47.195684 202.48815 47.195745 202.48818 47.195518 202.48821 47.195379 202.48788 47.195332 202.488 47.195536 202.48805 47.195739 202.48802 47.19584 202.48829 47.195968 202.48831 47.196198 202.48831 47.196279 202.48844 47.19628 202.4887 47.19632 202.48885 47.19653 202.48885 47.196539 202.48882 47.196551 202.48844 47.19658 202.48834 47.19682 202.48835 47.196902 202.48845 47.197153 202.48848 47.197202 202.48858 47.197383 202.48854 47.197542 202.48849 47.197775 202.48849 47.197808 202.48839 47.198045 202.48844 47.198136 202.48862 47.198325 202.48864 47.198497 202.48861 47.198661 202.48862 47.198786 202.48856 47.19902 202.48889 47.199104 202.48895 47.199291 202.48866 47.199409 202.48854 47.199636 202.48841 47.199787 202.48839 47.199838 202.48833 47.200104 202.48807 47.200236 202.48799 47.200423 202.48799 47.200489 202.48801 47.200734 202.48824 47.200641 202.48858 47.200637 202.4886 47.200869 202.48857 47.200968 202.48858 47.201157 202.48827 47.20126 202.48837 47.201441 202.48838 47.20163 202.4883 47.201816 202.48828 47.201867 202.48823 47.201868 202.48782 47.20188 202.48778 47.201875 202.48777 47.201848 202.48769 47.201618 202.48735 47.201582 202.48731 47.201577 202.48699 47.201659 202.48694 47.201848 202.48694 47.201928 202.48676 47.201979 202.4866 47.202013 202.48626 47.202097 202.48636 47.202278 202.48664 47.202339 202.48669 47.202358 202.48692 47.202511 202.48716 47.202364 202.48758 47.202352 202.4876 47.202639 202.48738 47.202799 202.48697 47.202805 202.4868 47.202735 202.48661 47.20274 202.48641 47.202567 202.48606 47.20257 202.48584 47.202732 202.48594 47.202913 202.48611 47.203112 202.48637 47.203244 202.48643 47.2034 202.48646 47.203501 202.48666 47.20368 202.48687 47.203854 202.48692 47.204009 202.48663 47.204126 202.48643 47.204179 202.48625 47.204185 202.48597 47.204193 202.48585 47.204237 202.48583 47.204294 202.4858 47.204508 202.48563 47.204695 202.4853 47.204791 202.48511 47.204829 202.48492 47.204643 202.48461 47.204545 202.48437 47.204394 202.48425 47.204164 202.48424 47.204131 202.48413 47.203925 202.48412 47.203753 202.48402 47.203679 202.48378 47.20353 202.48358 47.20342 202.48351 47.203405 202.48352 47.203378 202.4835 47.203088 202.4835 47.203066 202.48343 47.202815 202.48319 47.202666 202.483 47.202479 202.48299 47.202452 202.48306 47.202196 202.48343 47.202128 202.48335 47.201898 202.48334 47.201772 202.4834 47.201538 202.4834 47.201511 202.48338 47.201221 202.48339 47.201202 202.4833 47.200959 202.4832 47.200789 202.48323 47.200686 202.48322 47.200497 202.48316 47.200413 202.48317 47.200172 202.4833 47.199983 202.48327 47.199934 202.48314 47.199774 202.4829 47.199625 202.48271 47.199446 202.48265 47.199246 202.48284 47.199068 202.48288 47.198992 202.48287 47.198782 202.48296 47.198606 202.48296 47.19854 202.48305 47.1983 202.48327 47.198137 202.48329 47.198034 202.48333 47.197876 202.48329 47.197715 202.48321 47.197499 202.48321 47.197444 202.4833 47.197257 202.48332 47.197036 202.48326 47.196932 202.48316 47.19683 202.48315 47.196564 202.48313 47.196527 202.48305 47.196503 202.48268 47.196571 202.48246 47.196733 202.48263 47.196898 202.48283 47.19708 202.48279 47.197238 202.48267 47.197462 202.48245 47.197626 202.48215 47.197739 202.48211 47.197936 202.48211 47.198011 202.48197 47.198223 202.48182 47.198427 202.48181 47.198481 202.48183 47.19873 202.4817 47.198887 202.48168 47.198938 202.48176 47.199168 202.48177 47.199293 202.48156 47.199461 202.48154 47.199657 202.48157 47.199767 202.48138 47.199951 202.48108 47.200061 202.48096 47.200282 202.48094 47.200425 202.48095 47.200576 202.48091 47.200773 202.4809 47.200845 202.4808 47.200857 202.48041 47.200814 202.48036 47.200804 202.48013 47.200961 202.48012 47.201033 202.48022 47.201284 202.48046 47.201433 202.48046 47.201466 202.48047 47.201744 202.48059 47.201846 202.48038 47.202014 202.48038 47.202136 202.48065 47.202264 202.48068 47.202504 202.48029 47.202531 202.48016 47.2023 202.47993 47.20233 202.4799 47.202498 202.4799 47.202615 202.47993 47.202797 202.47989 47.202905 202.48002 47.203055 202.48004 47.203298 202.47964 47.20335 202.47954 47.203412 202.4794 47.203496 202.47939 47.203519 202.47938 47.203787 202.47911 47.203912 202.47908 47.204075 202.47914 47.204231 202.47888 47.204369 202.47881 47.204603 202.4788 47.204622 202.47876 47.204896 202.47851 47.205034 202.47821 47.205146 202.47793 47.20527 202.47777 47.20547 202.47749 47.205597 202.47743 47.205621 202.47721 47.205719 202.47701 47.205891 202.47698 47.205953 202.47692 47.206139 202.47666 47.206192 202.47657 47.206219 202.47632 47.206359 202.47625 47.206494 202.47622 47.206595 202.47603 47.206657 202.47585 47.206663 202.47567 47.206855 202.47555 47.207011 202.47552 47.207056 202.47548 47.207334 202.47539 47.207453 202.4754 47.207579 202.47517 47.207617 202.47489 47.207496 202.47476 47.207478 202.47445 47.207587 202.47442 47.207843 202.47444 47.20788 202.47456 47.208069 202.47471 47.208282 202.47469 47.208332 202.47461 47.208351 202.47425 47.208361 202.47408 47.208554 202.47378 47.208664 202.47374 47.208671 202.4734 47.208727 202.47324 47.208716 202.47316 47.208576 202.47316 47.208449 202.47297 47.208459 202.47275 47.208621 202.47257 47.208802 202.47235 47.208964 202.47201 47.208974 202.4719 47.208987 202.47154 47.208998 202.47143 47.20899 202.47109 47.209 202.47099 47.209013 202.47078 47.209182 202.47055 47.209073 202.47025 47.209151 202.47 47.209291 202.46971 47.209409 202.46963 47.209427 202.46936 47.209494 202.46909 47.209502 202.46891 47.209509 202.46892 47.209632 202.46917 47.20977 202.46938 47.209806 202.46955 47.209612 202.46979 47.209636 202.47006 47.209631 202.47028 47.209469 202.47051 47.209431 202.47063 47.20939 202.47085 47.209227 202.47109 47.209076 202.47144 47.209065 202.47168 47.209147 202.47178 47.209144 202.47214 47.209134 202.47224 47.209131 202.47256 47.209217 202.47257 47.209405 202.47226 47.209508 202.47216 47.209743 202.47178 47.209804 202.47176 47.209809 202.47141 47.209874 202.47125 47.209863 202.47087 47.209838 202.47065 47.21 202.47059 47.210023 202.47023 47.210034 202.47013 47.210036 202.46991 47.210135 202.46957 47.210222 202.46929 47.210347 202.46926 47.210356 202.46895 47.210435 202.4687 47.210442 202.46852 47.210461 202.46819 47.210495 202.46808 47.210488 202.46771 47.210556 202.46749 47.210718 202.46745 47.210714 202.46708 47.210666 202.46684 47.210608 202.46675 47.210583 202.4664 47.210515 202.46629 47.210567 202.46587 47.210579 202.46576 47.210533 202.46548 47.210541 202.4653 47.210546 202.46502 47.210554 202.46475 47.210501 202.46461 47.210714 202.46436 47.210721 202.46405 47.21066 202.46401 47.210656 202.46364 47.210702 202.4635 47.210706 202.46312 47.210681 202.46308 47.210687 202.46282 47.210555 202.46247 47.210491 202.46226 47.210321 202.46197 47.210204 202.46184 47.210177 202.46184 47.210299 202.46186 47.210488 202.46158 47.210496 202.4613 47.210442 202.46104 47.210579 202.46101 47.21059 202.46075 47.210697 202.46047 47.210662 202.46028 47.210476 202.46016 47.210327 202.46016 47.210245 202.46 47.210229 202.45983 47.210158 202.45984 47.210123 202.46005 47.209959 202.46024 47.209778 202.46043 47.209596 202.46065 47.209434 202.46088 47.209281 202.46108 47.209107 202.46129 47.208935 202.46152 47.208783 202.46177 47.208637 202.46201 47.208491 202.46227 47.208352 202.46246 47.208171 202.46266 47.207999 202.46289 47.207839 202.46309 47.207671 202.46331 47.207504 202.46356 47.207361 202.4638 47.207217 202.46399 47.207037 202.46421 47.206874 202.46443 47.206712 202.46463 47.206536 202.46485 47.206374 202.46508 47.206216 202.46534 47.206083 202.46547 47.205866 202.46567 47.205689 202.46594 47.205557 202.46615 47.205391 202.46636 47.205225 202.46653 47.205028 202.46672 47.204852 202.46696 47.204703 202.46702 47.204525 202.46707 47.204468 202.46722 47.204266 202.46745 47.204108 202.46768 47.203957 202.46791 47.203866 202.46802 47.203868 202.46826 47.203717 202.46828 47.203597 202.46836 47.203481 202.46851 47.203276 202.46869 47.203086 202.46897 47.202965 202.46922 47.202821 202.46947 47.202681 202.46966 47.202497 202.46988 47.202335 202.47011 47.202178 202.4703 47.202001 202.47021 47.201848 202.46997 47.201695 202.46974 47.201538 202.46948 47.201411 202.46922 47.201272 202.46899 47.201119 202.46879 47.200945 202.46854 47.200804 202.4683 47.200655 202.46807 47.200499 202.46779 47.200379 202.46756 47.200224 202.46731 47.200086 202.46709 47.199923 202.46684 47.19978 202.46659 47.199637 202.46635 47.19949 202.4661 47.199351 202.46585 47.199207 202.46563 47.199051 202.46538 47.198908 202.46514 47.198762 202.46497 47.19867 202.46486 47.198643 202.46455 47.19854 202.46444 47.19834 202.46442 47.198316 202.46417 47.198171 202.46417 47.19817 202.46384 47.198089 202.46363 47.197919 202.4634 47.197764 202.46315 47.197624 202.46296 47.197438 202.46286 47.197348 202.46275 47.197272 202.46252 47.197112 202.46229 47.196957 202.46209 47.196869 202.46201 47.196844 202.46199 47.196806 202.46184 47.196642 202.46162 47.196477 202.46137 47.196335 202.46108 47.196227 202.46086 47.196063 202.4606 47.195932 202.46058 47.195925 202.46026 47.195855 202.46022 47.195699 202.46022 47.195562 202.46024 47.195416 202.46047 47.195254 202.46072 47.195117 202.46091 47.194936 202.46113 47.194774 202.46132 47.194594 202.4615 47.194404 202.46174 47.194255 202.46199 47.194114 202.46215 47.193915 202.46235 47.193741 202.46259 47.19359 202.46283 47.193444 202.46308 47.193295 202.46327 47.193121 202.46349 47.192954 202.46372 47.1928 202.46393 47.192634 202.46415 47.192468 202.46436 47.192303 202.46457 47.192135 202.4648 47.191978 202.465 47.191806 202.46521 47.191639 202.46543 47.191476 202.46566 47.191317 202.4659 47.19117 202.4661 47.190997 202.46633 47.190843 202.46656 47.190689 202.46678 47.190523 202.467 47.19036 202.46721 47.190196 202.46742 47.190027 202.46766 47.189877 202.46788 47.189719 202.4681 47.189553 202.46831 47.189383 202.46852 47.18922 202.46873 47.189052 202.46896 47.188896 202.46917 47.188728 202.46916 47.18863 202.46895 47.188462 202.46874 47.188293 202.46853 47.188121 202.46826 47.187996 202.46801 47.187853 202.46777 47.187708 202.46755 47.187542 202.46733 47.187381 202.46708 47.187241 202.46684 47.187092 202.46662 47.186928 202.46639 47.186773 202.46616 47.186624 202.46595 47.186453 202.46572 47.186294 202.46545 47.186168 202.46522 47.186015 202.46496 47.185878 202.46474 47.185719 202.4645 47.185569 202.46422 47.185449 202.46409 47.185253 202.46424 47.185111 202.46426 47.18506 202.4643 47.185065 202.46473 47.185053 202.46491 47.184869 202.46516 47.184723 202.46521 47.184722 202.46555 47.184666 202.46578 47.184628 202.46596 47.184623 202.46603 47.184436 202.46606 47.184391 202.46613 47.184368 202.46636 47.184279 202.46635 47.184205 202.46637 47.183986 202.46652 47.183776 202.46659 47.183703 202.46662 47.183544 202.46685 47.183506 202.46713 47.18356 202.46722 47.183557 202.46759 47.183547 202.46783 47.183401 202.46788 47.183399 202.46818 47.1835 202.46846 47.183496 202.46867 47.18333 202.46866 47.183145 202.4685 47.182942 202.4685 47.18292 202.46856 47.182896 202.46888 47.182981 202.46904 47.183194 202.46927 47.183106 202.4693 47.183003 202.46928 47.182814 202.4696 47.182711 202.46969 47.182708 202.46996 47.182639 202.47024 47.182631 202.47025 47.18282 202.47026 47.182942 202.47044 47.182937 202.47043 47.182814 202.47042 47.182626 202.4707 47.182618 202.47088 47.182613 202.47087 47.18249 202.47074 47.182259 202.47074 47.182228 202.47079 47.182227 202.47117 47.182198 202.47125 47.182213 202.47151 47.182111 202.47187 47.18208 202.47209 47.182172 202.47216 47.182187 202.47257 47.182175 202.47262 47.182174 202.47303 47.182162 202.47325 47.182 202.47323 47.181722 202.47323 47.181689 202.47345 47.181527 202.47349 47.181531 202.47391 47.181519 202.47398 47.181495 202.47398 47.181561 202.47386 47.181782 202.47354 47.181885 202.47357 47.182123 202.4738 47.18228 202.47406 47.182211 202.47426 47.182035 202.47429 47.181917 202.47428 47.181746 202.47434 47.181551 202.47434 47.181485 202.47444 47.181482 202.4748 47.181472 202.47502 47.18131 202.47519 47.181119 202.47537 47.181114 202.47572 47.181151 202.47575 47.181158 202.476 47.181298 202.47629 47.18121 202.47655 47.181219 202.47672 47.181417 202.47699 47.18135 202.47722 47.181375 202.47728 47.181527 202.47734 47.181612 202.47744 47.181627 202.47777 47.181617 202.47793 47.181633 202.4782 47.181625 202.47835 47.181601 202.47869 47.181591 202.47881 47.181825 202.47879 47.181876 202.47891 47.182081 202.47896 47.182281 202.47862 47.182365 202.47852 47.182367 202.47816 47.182378 202.47803 47.182598 202.47804 47.182721 202.47822 47.182716 202.47844 47.182554 202.47872 47.182546 202.47899 47.182599 202.47921 47.182437 202.47943 47.182275 202.47933 47.182094 202.47937 47.181936 202.47936 47.18175 202.47931 47.1816 202.47951 47.181635 202.47988 47.181661 202.47995 47.181637 202.47993 47.181687 202.47971 47.181849 202.47972 47.182128 202.47996 47.182282 202.48038 47.18227 202.48031 47.182017 202.48029 47.181911 202.48034 47.181676 202.48031 47.181627 202.48037 47.18165 202.48067 47.181753 202.48085 47.181663 202.48112 47.181537 202.48145 47.181502 202.48156 47.181509 202.48185 47.18153 202.48209 47.181546 202.48228 47.181541 202.48259 47.181636 202.48281 47.1818 202.48299 47.181809 202.48308 47.181598 202.48309 47.181572 202.48318 47.181325 202.48344 47.181335 202.4837 47.181469 202.48382 47.181705 202.48419 47.181658 202.48431 47.181664 202.48455 47.181813 202.4846 47.181913 202.48464 47.182074 202.48489 47.182215 202.4852 47.182289 202.48523 47.182288 202.4855 47.182414 202.48577 47.182345 202.48604 47.182337 202.48617 47.182567 202.4862 47.182616 202.48595 47.182757 202.48591 47.182764 202.48557 47.182687 202.48544 47.182457 202.4851 47.18253 202.48489 47.182542 202.48463 47.182535 202.48444 47.182546 202.48413 47.18252 202.484 47.18274 202.48406 47.182831 202.48425 47.183012 202.48445 47.183194 202.48479 47.18323 202.48501 47.183068 202.48506 47.183067 202.4853 47.183216 202.48563 47.18316 202.48586 47.183122 202.48614 47.183175 202.4862 47.183195 202.48649 47.183307 202.48675 47.18344 202.48681 47.183595 202.48687 47.183681 202.48695 47.183948 202.48697 47.183997 202.48707 47.184178 202.48735 47.184232 202.48742 47.184246 202.48783 47.184234 202.4879 47.184216 202.4882 47.184166 202.48835 47.184212 202.4886 47.184352 202.4886 47.184418 202.48871 47.184599 202.48892 47.184764 202.48905 47.184698 202.48906 47.18466 202.48897 47.184408 202.48896 47.184342 202.48886 47.18416 202.4887 47.183952 202.48839 47.183854 202.48821 47.183664 202.48813 47.183525 202.48835 47.183362 202.48869 47.183275 202.48876 47.183256 202.48897 47.183152 202.4893 47.183055 202.48948 47.183051 202.48946 47.183159 202.48943 47.183416 202.48944 47.183442 202.48955 47.183648 202.48956 47.18382 202.48947 47.184032 202.48976 47.184148 202.49004 47.184263 202.49008 47.184443 202.48996 47.18465 202.48998 47.184682 202.48992 47.184677 202.48968 47.18479 202.48954 47.184957 202.48984 47.185066 202.49015 47.185161 202.49027 47.185158 202.49038 47.184991 202.49037 47.184925 202.49047 47.184922 202.49083 47.184912 202.49093 47.184909 202.49129 47.184899 202.49136 47.184913 202.4917 47.184857 202.49175 47.184623 202.49173 47.184574 202.49156 47.184438 202.49132 47.184291 202.49136 47.184043 202.49141 47.183899 202.49141 47.18378 202.49165 47.183627 202.49155 47.183469 202.4913 47.18333 202.4911 47.183286 202.49095 47.183265 202.49056 47.183246 202.49054 47.183247 202.49021 47.183161 202.49014 47.182984 202.49025 47.182809 202.49005 47.182927 202.48965 47.182926 202.48961 47.182654 202.48968 47.182578 202.4894 47.182457 202.48946 47.182258 202.48954 47.182031 202.48951 47.18199 202.48938 47.181826 202.48925 47.181594 202.48898 47.181663 202.48875 47.181638 202.48869 47.181482 202.48869 47.18136 202.48841 47.181306 202.48834 47.181292 202.48834 47.181259 202.48856 47.181097 202.48854 47.180819 202.48815 47.180782 202.48804 47.180775 202.4877 47.180864 202.48768 47.18113 202.48769 47.181154 202.48777 47.181388 202.48775 47.181492 202.4876 47.181511 202.48725 47.181445 202.48703 47.181342 202.48705 47.181594 202.48727 47.181757 202.48768 47.181745 202.48772 47.181749 202.48773 47.181777 202.48787 47.181965 202.48788 47.182171 202.48754 47.182205 202.48748 47.182217 202.48706 47.182255 202.48702 47.182264 202.48661 47.182276 202.48656 47.182278 202.48622 47.18221 202.4861 47.181971 202.48579 47.181877 202.48573 47.181723 202.48601 47.181715 202.48614 47.18168 202.48634 47.181509 202.48637 47.181446 202.48627 47.181465 202.4859 47.181534 202.48581 47.181536 202.48547 47.181457 202.48531 47.181253 202.48523 47.181114 202.48522 47.180991 202.48502 47.180819 202.48502 47.180683 202.48508 47.18045 202.48507 47.180417 202.48489 47.180258 202.4847 47.180074 202.4847 47.179882 202.48463 47.179803 202.48448 47.179745 202.48433 47.1797 202.48425 47.179603 202.48415 47.179509 202.48392 47.17935 202.48384 47.179348 202.4838 47.17944 202.48381 47.179628 202.48365 47.179826 202.48341 47.179975 202.48308 47.17997 202.48281 47.179848 202.48272 47.179842 202.48244 47.179794 202.48226 47.179603 202.48212 47.179471 202.48208 47.17941 202.48192 47.179342 202.48177 47.179314 202.4815 47.179383 202.48123 47.17939 202.48095 47.179337 202.48086 47.179577 202.48048 47.17964 202.48045 47.179636 202.48016 47.179529 202.47984 47.179539 202.4797 47.179543 202.47936 47.179471 202.4791 47.179336 202.47904 47.179338 202.47867 47.179329 202.47861 47.179067 202.47889 47.178945 202.47886 47.178861 202.47873 47.178844 202.47847 47.178827 202.47813 47.178772 202.478 47.178989 202.4778 47.178995 202.47757 47.179016 202.47726 47.179066 202.47716 47.179059 202.47681 47.179143 202.47659 47.179305 202.47647 47.179526 202.47618 47.179643 202.4759 47.17977 202.47568 47.179932 202.47547 47.1801 202.47524 47.180254 202.4752 47.180263 202.4749 47.180341 202.47467 47.180331 202.47433 47.180282 202.47422 47.180516 202.47393 47.180554 202.47381 47.180557 202.47349 47.180654 202.47338 47.180887 202.47299 47.180941 202.47296 47.180945 202.47254 47.180957 202.47247 47.180981 202.47249 47.18093 202.47248 47.180652 202.47222 47.180514 202.47222 47.18046 202.47218 47.180224 202.47184 47.180145 202.47174 47.180159 202.47145 47.180113 202.47124 47.179941 202.47091 47.179857 202.47073 47.179663 202.47051 47.179504 202.47023 47.179516 202.46993 47.179605 202.46984 47.17957 202.46991 47.17962 202.46986 47.179883 202.46951 47.179965 202.46945 47.179963 202.46943 47.179911 202.46935 47.179712 202.46927 47.179512 202.46965 47.179453 202.46967 47.179163 202.46972 47.179115 202.46962 47.179136 202.4693 47.17923 202.46907 47.179268 202.4691 47.17911 202.46901 47.178983 202.46878 47.178827 202.46862 47.178805 202.46838 47.178958 202.46824 47.179167 202.46825 47.179222 202.46827 47.179484 202.46813 47.179635 202.46811 47.179685 202.46813 47.179963 202.46812 47.179989 202.4679 47.180151 202.46784 47.180177 202.46748 47.180187 202.46738 47.180428 202.46704 47.180511 202.46705 47.180757 202.46706 47.180823 202.46696 47.180825 202.46668 47.180883 202.46649 47.180844 202.46615 47.180771 202.46613 47.18054 202.46616 47.180438 202.46587 47.180332 202.46581 47.180046 202.46625 47.180017 202.46623 47.179739 202.46623 47.179706 202.46611 47.1795 202.46587 47.179483 202.46569 47.179489 202.4657 47.179378 202.46585 47.179171 202.4658 47.17908 202.46578 47.17883 202.46582 47.178737 202.46586 47.178579 202.46582 47.178417 202.46583 47.178262 202.46585 47.178066 202.46582 47.177956 202.46576 47.177809 202.46556 47.177628 202.46535 47.177458 202.46535 47.17736 202.46541 47.1771 202.46558 47.176968 202.46561 47.176923 202.46565 47.176917 202.46595 47.176841 202.4662 47.176834 202.46648 47.17695 202.46673 47.177025 202.4666 47.176865 202.46658 47.176636 202.46692 47.176626 202.46704 47.17686 202.46705 47.176927 202.4668 47.177073 202.46682 47.177351 202.46706 47.1775 202.46706 47.177533 202.46717 47.177739 202.46723 47.177938 202.46721 47.178041 202.46735 47.178017 202.46761 47.177874 202.46755 47.177784 202.46758 47.177556 202.46792 47.177475 202.468 47.177457 202.46821 47.177353 202.46823 47.177287 202.46821 47.177057 202.46824 47.176954 202.46812 47.176998 202.4679 47.17716 202.46753 47.177151 202.46732 47.176978 202.46731 47.176793 202.46751 47.176618 202.46782 47.176609 202.46811 47.176696 202.4683 47.176513 202.46855 47.176372 202.46859 47.176365 202.46862 47.176414 202.46864 47.176659 202.469 47.176649 202.46912 47.176428 202.46929 47.176237 202.46961 47.176134 202.46987 47.176001 202.46986 47.175756 202.46988 47.175706 202.47006 47.175517 202.47025 47.175465 202.4704 47.175431 202.47052 47.17527 202.4703 47.175103 202.47027 47.175054 202.47037 47.175052 202.4706 47.174959 202.47095 47.174949 202.47097 47.175187 202.47085 47.17535 202.47085 47.175416 202.47098 47.175576 202.471 47.175805 202.47097 47.175908 202.47125 47.175962 202.47123 47.175717 202.47123 47.175651 202.47135 47.175632 202.47152 47.175535 202.4718 47.175412 202.4721 47.175403 202.47232 47.175434 202.47255 47.175396 202.47267 47.175358 202.47302 47.175371 202.4733 47.175453 202.47338 47.175434 202.47374 47.175424 202.47386 47.175203 202.47414 47.175195 202.47426 47.175155 202.47431 47.175067 202.4743 47.174879 202.47438 47.174692 202.47417 47.17452 202.47416 47.174493 202.47421 47.174492 202.47447 47.174621 202.47483 47.174611 202.47505 47.174453 202.47513 47.174466 202.47553 47.174454 202.47552 47.174176 202.47511 47.174187 202.47504 47.174204 202.47503 47.17414 202.47502 47.173895 202.47501 47.173829 202.47509 47.173843 202.47537 47.17396 202.47559 47.174124 202.47583 47.174273 202.47619 47.174263 202.47628 47.174262 202.47652 47.174409 202.47653 47.174475 202.47654 47.174721 202.47678 47.17487 202.47676 47.17492 202.47654 47.175082 202.47656 47.17536 202.47697 47.175348 202.47701 47.175347 202.47742 47.175335 202.47746 47.17534 202.4775 47.175383 202.47725 47.175524 202.47738 47.17573 202.47739 47.175911 202.47715 47.176063 202.47694 47.176052 202.47669 47.176071 202.47638 47.176182 202.47633 47.176449 202.47613 47.176624 202.47582 47.176553 202.47561 47.176595 202.47556 47.176745 202.47555 47.176855 202.47564 47.177012 202.47588 47.177066 202.47603 47.177053 202.47637 47.177121 202.47645 47.177119 202.47682 47.177051 202.47706 47.176904 202.4771 47.176909 202.47735 47.177052 202.47769 47.176996 202.47784 47.176791 202.478 47.176591 202.478 47.176567 202.47792 47.176306 202.47791 47.17624 202.47816 47.176094 202.47839 47.175937 202.47845 47.175913 202.47881 47.175903 202.47891 47.1759 202.47923 47.175985 202.47951 47.176039 202.47949 47.175794 202.47926 47.175636 202.47929 47.175603 202.4792 47.175356 202.47921 47.175256 202.47939 47.175067 202.47958 47.175078 202.47965 47.175234 202.47971 47.175304 202.47993 47.175405 202.48002 47.175401 202.48029 47.175332 202.48063 47.175244 202.48068 47.175243 202.48109 47.175231 202.4813 47.175069 202.48129 47.174791 202.48129 47.174758 202.48143 47.174551 202.48149 47.174318 202.48123 47.174186 202.48102 47.174293 202.48067 47.174268 202.48044 47.174119 202.48019 47.173977 202.48029 47.173838 202.48045 47.17378 202.48072 47.173912 202.48092 47.173931 202.4812 47.173808 202.48136 47.173764 202.48168 47.173851 202.48178 47.174104 202.48216 47.174149 202.48238 47.174243 202.48247 47.17424 202.48282 47.174306 202.48307 47.174379 202.48317 47.174376 202.48341 47.174525 202.48377 47.174515 202.48399 47.174353 202.48406 47.174367 202.48447 47.174355 202.48452 47.174354 202.48475 47.174509 202.48476 47.174536 202.48478 47.174814 202.48478 47.174847 202.4848 47.175125 202.48482 47.175174 202.48484 47.175419 202.48481 47.175464 202.48458 47.175622 202.48453 47.17565 202.48429 47.175501 202.48405 47.17559 202.48371 47.175599 202.48356 47.175583 202.48329 47.175591 202.48314 47.175617 202.48277 47.175688 202.48271 47.17569 202.48237 47.175617 202.48213 47.175468 202.48195 47.175473 202.48187 47.17566 202.48211 47.175809 202.48209 47.175859 202.48211 47.176137 202.48251 47.176122 202.48274 47.175963 202.48278 47.175962 202.48312 47.175906 202.48335 47.175868 202.48353 47.175863 202.48375 47.175701 202.48403 47.175693 202.48431 47.17581 202.48446 47.176028 202.48466 47.176204 202.48497 47.176296 202.4849 47.176419 202.48481 47.176659 202.48451 47.176639 202.48435 47.176435 202.48414 47.176263 202.4841 47.17622 202.48396 47.17607 202.48382 47.176044 202.48355 47.176176 202.48325 47.176288 202.48303 47.176447 202.48282 47.176617 202.48283 47.176905 202.48284 47.176928 202.48297 47.177126 202.48317 47.177134 202.48337 47.177159 202.48366 47.177138 202.48389 47.1771 202.48417 47.177217 202.48425 47.177208 202.48448 47.177052 202.48471 47.1769 202.48496 47.176757 202.48528 47.176654 202.48526 47.176409 202.48517 47.17629 202.48535 47.17634 202.48557 47.176506 202.48591 47.17645 202.48608 47.176258 202.48631 47.176283 202.48666 47.176319 202.48683 47.176131 202.48696 47.176128 202.48731 47.176192 202.48755 47.176277 202.48762 47.176292 202.48796 47.176236 202.48819 47.176198 202.48846 47.176251 202.48845 47.176006 202.48823 47.17584 202.48782 47.175815 202.48782 47.175553 202.48823 47.175516 202.48825 47.175519 202.48839 47.175398 202.48845 47.175344 202.48846 47.175343 202.48881 47.175415 202.48907 47.175546 202.48936 47.175658 202.48956 47.175833 202.48957 47.176048 202.48945 47.17624 202.48945 47.176273 202.4894 47.176274 202.489 47.176246 202.48883 47.176181 202.48853 47.176293 202.48834 47.176477 202.48844 47.176662 202.48872 47.176711 202.48878 47.176734 202.48914 47.176797 202.48931 47.176992 202.48966 47.17706 202.48989 47.177146 202.49005 47.176945 202.49031 47.176907 202.49057 47.17697 202.49067 47.176968 202.49093 47.176899 202.49117 47.176923 202.49122 47.177079 202.49127 47.17717 202.49138 47.177415 202.49135 47.177457 202.49129 47.177484 202.49109 47.177593 202.49103 47.177675 202.49099 47.177834 202.49106 47.17798 202.49135 47.178056 202.49142 47.178037 202.49164 47.177939 202.49198 47.177851 202.49217 47.177674 202.4924 47.177636 202.49258 47.177631 202.49266 47.177444 202.49269 47.177399 202.49272 47.177398 202.4931 47.177446 202.49317 47.177397 202.49342 47.177254 202.49382 47.177242 202.49404 47.177405 202.49405 47.17765 202.49385 47.177825 202.49345 47.177836 202.49338 47.177827 202.49299 47.177854 202.49287 47.177811 202.49288 47.177934 202.49307 47.178116 202.49342 47.178152 202.49347 47.178151 202.49349 47.1782 202.4936 47.178381 202.49373 47.178347 202.4941 47.178337 202.49433 47.178422 202.49442 47.178419 202.49478 47.178483 202.49502 47.178557 202.49512 47.178555 202.49548 47.178544 202.49573 47.178403 202.49577 47.178402 202.49601 47.178551 202.49604 47.178595 202.49606 47.17884 202.49639 47.178916 202.49653 47.1789 202.49664 47.178733 202.49664 47.178667 202.49671 47.178682 202.49712 47.17867 202.49716 47.178674 202.49717 47.178702 202.5103 47.187201 202.51027 47.187201 202.50992 47.187139 202.50992 47.186963 202.51016 47.186963 202.5103 47.18718 202.5103 47.187201 202.4979 47.17946 202.49786 47.179461 202.49785 47.179428 202.49789 47.179433 202.4979 47.17946 202.49303 47.176412 202.49273 47.176419 202.49273 47.176228 202.49301 47.176208 202.49303 47.176412 202.47929 47.167824 202.47926 47.167831 202.47927 47.167813 202.47928 47.167813 202.47929 47.167824 202.51627 47.191231 202.51627 47.191232 202.51627 47.191227 202.51627 47.191227 202.51627 47.191231 202.50965 47.187097 202.50949 47.187128 202.50952 47.187017 202.50964 47.187019 202.50965 47.187097 202.5056 47.184563 202.50547 47.184567 202.50542 47.184451 202.50562 47.184462 202.5056 47.184563 202.49752 47.179517 202.49733 47.179523 202.49728 47.179367 202.49751 47.179392 202.49752 47.179517 202.49501 47.17795 202.49462 47.177946 202.49463 47.177712 202.49492 47.17773 202.49501 47.17795 202.51836 47.192834 202.51805 47.192845 202.51803 47.192629 202.51836 47.192616 202.51836 47.192834 202.50924 47.187137 202.50908 47.187109 202.50906 47.187029 202.50919 47.187025 202.50924 47.187137 202.50678 47.185605 202.50669 47.185621 202.5065 47.185436 202.5065 47.18543 202.50652 47.185423 202.5068 47.185539 202.50678 47.185605 202.50344 47.183518 202.50329 47.183722 202.50311 47.18371 202.50311 47.183606 202.50336 47.183464 202.50344 47.183468 202.50344 47.183518 202.4952 47.178368 202.49492 47.178376 202.49496 47.178218 202.49514 47.178212 202.4952 47.178368 202.47925 47.168399 202.47891 47.168417 202.47892 47.168193 202.47923 47.168179 202.47925 47.168399 202.47657 47.166726 202.47635 47.166731 202.47638 47.166605 202.47656 47.166571 202.47657 47.166726 202.50461 47.184544 202.5042 47.184534 202.50415 47.184259 202.50453 47.184292 202.50461 47.184544 202.49574 47.179006 202.49562 47.179164 202.49562 47.17923 202.49572 47.179411 202.49583 47.179361 202.49599 47.179211 202.49599 47.179161 202.49596 47.178908 202.49574 47.179006 202.48953 47.175123 202.4892 47.175125 202.48918 47.174908 202.48954 47.17487 202.48953 47.175123 202.51713 47.192665 202.51698 47.192661 202.51696 47.192557 202.51711 47.192564 202.51713 47.192665 202.51217 47.189567 202.51188 47.189594 202.51188 47.189385 202.51215 47.189393 202.51217 47.189567 202.50943 47.187857 202.50938 47.187859 202.5091 47.187948 202.5091 47.188072 202.50905 47.188217 202.5088 47.188291 202.50852 47.188176 202.50851 47.188175 202.50811 47.188152 202.50802 47.18789 202.50802 47.187873 202.50821 47.187689 202.50834 47.187652 202.50869 47.187725 202.50876 47.187737 202.50907 47.187634 202.50924 47.187643 202.50942 47.187836 202.50943 47.187857 202.50635 47.185935 202.50619 47.185991 202.5059 47.185947 202.50599 47.18614 202.50628 47.186248 202.50622 47.186449 202.50602 47.186622 202.50575 47.186642 202.50554 47.186623 202.50527 47.186754 202.50515 47.186757 202.50519 47.186702 202.50529 47.186465 202.50536 47.186276 202.50508 47.186158 202.50503 47.186003 202.5052 47.185811 202.50516 47.185772 202.50504 47.18554 202.50509 47.185445 202.50516 47.185453 202.50558 47.185462 202.50562 47.185478 202.50591 47.185548 202.50621 47.185653 202.50636 47.185864 202.50635 47.185935 202.50115 47.182681 202.50104 47.182916 202.50063 47.182939 202.50058 47.182656 202.50057 47.182623 202.5006 47.182341 202.50098 47.182355 202.50114 47.182566 202.50115 47.182681 202.49798 47.180705 202.49793 47.180706 202.49793 47.180673 202.49797 47.180677 202.49798 47.180705 202.50397 47.185045 202.50391 47.185071 202.50391 47.185005 202.50397 47.185028 202.50397 47.185045 202.50267 47.184233 202.50244 47.184208 202.50243 47.184082 202.50262 47.184077 202.50267 47.184233 202.50196 47.183786 202.50168 47.183794 202.50167 47.183605 202.5019 47.18363 202.50196 47.183786 202.50124 47.183339 202.50096 47.183347 202.501 47.183188 202.50118 47.183183 202.50124 47.183339 202.4853 47.173378 202.48529 47.173456 202.48529 47.173671 202.48499 47.173679 202.48476 47.173529 202.48479 47.173356 202.48496 47.173167 202.48526 47.173159 202.4853 47.173378 202.47693 47.168146 202.47665 47.168135 202.47648 47.167931 202.47648 47.167864 202.47662 47.167827 202.47689 47.167955 202.47693 47.168146 202.50474 47.185826 202.50465 47.185829 202.50467 47.185779 202.50474 47.18576 202.50474 47.185826 202.48715 47.174834 202.48693 47.17485 202.48664 47.174741 202.48664 47.174514 202.48698 47.174488 202.48714 47.174692 202.48715 47.174834 202.50654 47.187249 202.50624 47.187257 202.50606 47.18706 202.50611 47.186979 202.50617 47.186982 202.50649 47.18707 202.50654 47.187249 202.48232 47.172115 202.48227 47.172114 202.48227 47.172082 202.48232 47.172078 202.48232 47.172115 202.50982 47.189594 202.50965 47.189614 202.50966 47.189493 202.50981 47.1895 202.50982 47.189594 202.50934 47.189292 202.50919 47.189304 202.50917 47.189186 202.50933 47.189201 202.50934 47.189292 202.5044 47.186209 202.50417 47.186185 202.50416 47.186059 202.50439 47.186021 202.5044 47.186209 202.48669 47.175145 202.48651 47.175161 202.48628 47.175004 202.48627 47.174884 202.48645 47.174879 202.48667 47.175043 202.48669 47.175145 202.48542 47.174351 202.4854 47.174351 202.4854 47.174338 202.48543 47.174333 202.48542 47.174351 202.47951 47.170659 202.47939 47.170663 202.47939 47.170582 202.4795 47.170579 202.47951 47.170659 202.51766 47.194788 202.51762 47.194787 202.51761 47.194759 202.51765 47.194763 202.51766 47.194788 202.49025 47.177669 202.49015 47.177672 202.4898 47.177608 202.4897 47.177626 202.48971 47.177672 202.48992 47.177842 202.49008 47.177858 202.49035 47.17785 202.49053 47.177845 202.49048 47.177754 202.49025 47.177669 202.47724 47.169533 202.47692 47.16956 202.47694 47.169351 202.47722 47.169337 202.47724 47.169533 202.47596 47.168738 202.47583 47.168737 202.47581 47.168645 202.47598 47.168627 202.47596 47.168738 202.51889 47.195855 202.5188 47.195867 202.51872 47.195752 202.51889 47.195798 202.51889 47.195855 202.50779 47.188925 202.50749 47.188934 202.50746 47.188718 202.50776 47.188733 202.50779 47.188925 202.50735 47.188652 202.50698 47.188664 202.50699 47.188426 202.50735 47.188388 202.50735 47.188652 202.501 47.184687 202.50093 47.184672 202.50052 47.184684 202.50042 47.184921 202.50046 47.185022 202.50061 47.185038 202.50084 47.184884 202.50113 47.184847 202.50138 47.184922 202.50128 47.18474 202.501 47.184687 202.4858 47.175183 202.48555 47.175219 202.48554 47.175022 202.48579 47.175044 202.4858 47.175183 202.48097 47.172169 202.48084 47.172193 202.48087 47.172104 202.48101 47.172068 202.48097 47.172169 202.50148 47.18528 202.50156 47.18551 202.5019 47.185547 202.50188 47.185268 202.50148 47.18528 202.48752 47.176561 202.48753 47.176684 202.48768 47.176897 202.48788 47.176788 202.48794 47.176705 202.48779 47.176492 202.48752 47.176561 202.48588 47.175535 202.48561 47.175502 202.48557 47.175343 202.48579 47.175366 202.48588 47.175535 202.47943 47.171503 202.47907 47.171551 202.47904 47.171258 202.47946 47.171264 202.47943 47.171503 202.51161 47.191907 202.5115 47.192137 202.5111 47.192124 202.51108 47.191879 202.51141 47.191787 202.51155 47.19179 202.51161 47.191907 202.48599 47.175904 202.48592 47.17616 202.48558 47.17617 202.48561 47.175968 202.48594 47.175872 202.48599 47.175871 202.48599 47.175904 202.48426 47.174824 202.48426 47.174867 202.48448 47.174962 202.48447 47.174717 202.48426 47.174824 202.482 47.173411 202.48183 47.173416 202.48159 47.173264 202.48161 47.173167 202.48176 47.173137 202.482 47.17329 202.482 47.173411 202.48097 47.172764 202.48094 47.172769 202.48093 47.172742 202.48105 47.172689 202.48097 47.172764 202.48051 47.172475 202.48039 47.172705 202.4801 47.172742 202.48008 47.172511 202.48046 47.172449 202.4805 47.172448 202.48051 47.172475 202.48008 47.172207 202.47993 47.172417 202.47965 47.172425 202.47971 47.172275 202.47986 47.172071 202.48015 47.172057 202.48008 47.172207 202.5076 47.189703 202.50732 47.18971 202.50736 47.189552 202.50754 47.189547 202.5076 47.189703 202.50699 47.189321 202.50697 47.189322 202.50695 47.189299 202.50698 47.189309 202.50699 47.189321 202.48209 47.173765 202.48175 47.173798 202.48177 47.173567 202.48208 47.173558 202.48209 47.173765 202.4803 47.172948 202.48043 47.173148 202.48044 47.173332 202.48017 47.17334 202.48 47.173137 202.48 47.173056 202.48026 47.172918 202.48029 47.172925 202.4803 47.172948 202.51348 47.19397 202.51344 47.193973 202.51343 47.193945 202.51348 47.193943 202.51348 47.19397 202.48258 47.17467 202.48228 47.174707 202.48218 47.174716 202.48205 47.174875 202.48241 47.174865 202.48249 47.17488 202.48283 47.174823 202.48288 47.17459 202.48258 47.17467 202.47811 47.171878 202.47772 47.171897 202.47772 47.171629 202.47811 47.171609 202.47811 47.171878 202.51124 47.192871 202.51094 47.192896 202.51095 47.19269 202.51122 47.192682 202.51124 47.192871 202.50778 47.190715 202.50772 47.190716 202.50769 47.190656 202.5078 47.190655 202.50778 47.190715 202.47954 47.173069 202.47943 47.173236 202.47941 47.173286 202.47919 47.173448 202.47921 47.173726 202.47956 47.173794 202.47955 47.173972 202.4794 47.17418 202.4792 47.174349 202.47883 47.174422 202.4787 47.174426 202.47842 47.174308 202.47829 47.174083 202.47862 47.173991 202.47887 47.173975 202.47901 47.173933 202.47916 47.173758 202.47893 47.173603 202.47889 47.173563 202.47879 47.173381 202.47878 47.173193 202.47874 47.173095 202.47848 47.172965 202.47849 47.17271 202.47883 47.1727 202.47904 47.172877 202.47923 47.172876 202.47953 47.172839 202.47954 47.173069 202.48253 47.17524 202.48264 47.175421 202.48278 47.175395 202.48281 47.175293 202.48253 47.17524 202.47988 47.173578 202.47983 47.17359 202.47983 47.173548 202.47992 47.173526 202.47988 47.173578 202.47757 47.172136 202.47746 47.172368 202.47741 47.172455 202.47773 47.172543 202.47766 47.17279 202.4777 47.172891 202.47794 47.172966 202.47804 47.172964 202.47828 47.173113 202.47828 47.173179 202.4783 47.173424 202.47827 47.173474 202.47823 47.173475 202.47799 47.173326 202.47758 47.173338 202.47748 47.173575 202.4774 47.173761 202.47772 47.173846 202.478 47.173964 202.47798 47.174188 202.47763 47.174242 202.47759 47.174243 202.47722 47.174308 202.47705 47.174342 202.47686 47.174161 202.47662 47.17401 202.47664 47.173951 202.47663 47.173677 202.47663 47.173643 202.47668 47.173642 202.47709 47.17363 202.47707 47.173352 202.47666 47.173364 202.47661 47.173365 202.47631 47.173441 202.47599 47.173539 202.47594 47.17354 202.47591 47.173492 202.47601 47.173253 202.47614 47.173066 202.47614 47.173035 202.47609 47.172773 202.47573 47.172783 202.47567 47.172763 202.47567 47.172741 202.47561 47.172478 202.4756 47.172402 202.47582 47.17224 202.47595 47.172229 202.47627 47.172318 202.47655 47.172436 202.4766 47.172428 202.47681 47.172258 202.47704 47.172101 202.47712 47.172014 202.47693 47.171828 202.47694 47.171743 202.47713 47.171681 202.47729 47.171887 202.47756 47.172014 202.47757 47.172136 202.47323 47.169424 202.47314 47.169424 202.47281 47.169344 202.47288 47.169202 202.47313 47.169112 202.47323 47.169364 202.47323 47.169424 202.5065 47.190513 202.50654 47.190615 202.50678 47.190689 202.50677 47.190444 202.5065 47.190513 202.47355 47.169923 202.47334 47.169929 202.47323 47.169723 202.47354 47.16978 202.47355 47.169923 202.51439 47.195736 202.51411 47.195753 202.51398 47.195525 202.51397 47.195477 202.51404 47.19548 202.51437 47.195567 202.51439 47.195736 202.51071 47.19344 202.51064 47.193442 202.51063 47.193392 202.51069 47.193404 202.51071 47.19344 202.47263 47.169645 202.47237 47.16967 202.47244 47.169528 202.47264 47.169472 202.47263 47.169645 202.51254 47.19488 202.5123 47.195029 202.512 47.195037 202.51197 47.194827 202.51215 47.19464 202.51252 47.194652 202.51254 47.19488 202.51153 47.194252 202.51122 47.19431 202.51127 47.194086 202.5115 47.194107 202.51153 47.194252 202.51041 47.193549 202.51002 47.193607 202.50995 47.193626 202.50968 47.193697 202.50944 47.193843 202.50918 47.193867 202.50913 47.19365 202.50939 47.193513 202.50973 47.193427 202.50978 47.193425 202.51006 47.193334 202.51039 47.193299 202.51041 47.193549 202.4735 47.17049 202.47345 47.170498 202.47334 47.170389 202.47351 47.170455 202.4735 47.17049 202.51725 47.198123 202.517 47.198177 202.51701 47.19797 202.51728 47.197967 202.51725 47.198123 202.51172 47.194669 202.51161 47.194672 202.51161 47.1946 202.51173 47.194585 202.51172 47.194669 202.49931 47.186917 202.49919 47.187144 202.49896 47.1873 202.49903 47.187382 202.49915 47.187418 202.4995 47.187339 202.49952 47.187049 202.49955 47.186992 202.49931 47.186917 202.51409 47.196446 202.51403 47.196463 202.51406 47.196428 202.51408 47.196427 202.51409 47.196446 202.49775 47.186244 202.49757 47.186429 202.49722 47.186436 202.49701 47.186272 202.49679 47.18624 202.49673 47.186474 202.49676 47.186523 202.49678 47.186768 202.49677 47.18683 202.49687 47.187021 202.49698 47.186959 202.49739 47.186968 202.49747 47.187232 202.49781 47.187176 202.49786 47.186942 202.49747 47.186906 202.49743 47.186643 202.49765 47.186477 202.49791 47.186342 202.49789 47.186271 202.49775 47.186244 202.48206 47.176436 202.48179 47.176569 202.48148 47.176672 202.48162 47.176822 202.48176 47.176849 202.48198 47.176686 202.48226 47.176678 202.48253 47.176732 202.48251 47.176487 202.48216 47.176421 202.48206 47.176436 202.4738 47.171273 202.47376 47.171548 202.47349 47.171682 202.47327 47.171844 202.47321 47.171976 202.47315 47.172065 202.47297 47.17225 202.47294 47.172502 202.47294 47.172535 202.47296 47.172813 202.47335 47.172852 202.47338 47.173105 202.47296 47.173137 202.47292 47.172841 202.47253 47.172877 202.47243 47.17288 202.47204 47.172866 202.47201 47.172867 202.47162 47.172826 202.47152 47.172575 202.47128 47.17243 202.47097 47.172334 202.47081 47.172128 202.4708 47.172095 202.47093 47.171875 202.47116 47.171869 202.47148 47.17192 202.47146 47.171641 202.47133 47.171523 202.47158 47.171555 202.47173 47.171474 202.47198 47.171335 202.47229 47.171353 202.4726 47.17142 202.47249 47.171207 202.47251 47.171066 202.47269 47.171061 202.47286 47.171258 202.47328 47.171246 202.47323 47.170984 202.47325 47.170934 202.4733 47.170937 202.47352 47.171095 202.4738 47.171215 202.4738 47.171273 202.51279 47.195934 202.51253 47.195951 202.51236 47.19575 202.51234 47.195652 202.51248 47.195657 202.51278 47.195764 202.51279 47.195934 202.50082 47.188462 202.50064 47.188468 202.50042 47.188511 202.50047 47.188594 202.5007 47.188745 202.50079 47.188743 202.50103 47.188592 202.50103 47.188507 202.50082 47.188462 202.49959 47.187689 202.49934 47.187835 202.49947 47.188033 202.49962 47.188009 202.4998 47.187822 202.49979 47.187798 202.49959 47.187689 202.51606 47.198274 202.51599 47.198272 202.51599 47.19823 202.51605 47.198228 202.51606 47.198274 202.51394 47.196953 202.51379 47.196973 202.51379 47.19686 202.51394 47.196855 202.51394 47.196953 202.50961 47.194546 202.50958 47.194547 202.50958 47.194528 202.50962 47.194521 202.50961 47.194546 202.49569 47.185856 202.4954 47.185836 202.49519 47.185841 202.49494 47.185849 202.49473 47.185675 202.49446 47.185554 202.49414 47.185466 202.49411 47.185462 202.49369 47.185503 202.49377 47.185733 202.49399 47.185898 202.494 47.185992 202.49379 47.186046 202.49355 47.185897 202.4934 47.185921 202.49341 47.186003 202.49362 47.186173 202.49363 47.186362 202.49332 47.186465 202.49326 47.186441 202.49301 47.186296 202.49277 47.186147 202.49242 47.186085 202.49225 47.186097 202.49203 47.186045 202.49194 47.185903 202.49203 47.185723 202.49205 47.185673 202.49203 47.185395 202.492 47.185346 202.49186 47.185196 202.49172 47.185168 202.49175 47.185277 202.49172 47.185466 202.4917 47.185642 202.49175 47.185786 202.49157 47.185736 202.49121 47.185677 202.4911 47.185675 202.49075 47.185759 202.49068 47.185745 202.49065 47.185696 202.49052 47.185536 202.49037 47.18552 202.49014 47.185674 202.49005 47.185886 202.49029 47.186035 202.49069 47.186023 202.49077 47.186004 202.49098 47.186171 202.49098 47.186204 202.491 47.186482 202.49135 47.18655 202.49148 47.18678 202.49151 47.186829 202.49152 47.187074 202.49188 47.187064 202.49198 47.186823 202.492 47.18672 202.49206 47.186577 202.49218 47.186589 202.49244 47.186722 202.49277 47.186801 202.49294 47.187004 202.49313 47.187186 202.49349 47.187169 202.49348 47.186926 202.4935 47.186878 202.49357 47.186859 202.49379 47.187025 202.49419 47.187055 202.49429 47.187307 202.4945 47.187473 202.49491 47.187461 202.49483 47.187231 202.49477 47.187075 202.49471 47.186992 202.49449 47.186899 202.49442 47.186885 202.4941 47.18679 202.49403 47.186609 202.49404 47.186513 202.49403 47.186311 202.49426 47.186352 202.49462 47.186384 202.49469 47.18636 202.49505 47.18635 202.49512 47.186364 202.49512 47.186397 202.49521 47.186627 202.49555 47.186664 202.4956 47.186662 202.49584 47.186811 202.49614 47.186733 202.49616 47.18657 202.49611 47.186414 202.49642 47.18631 202.49627 47.186167 202.49604 47.186012 202.49579 47.185872 202.49569 47.185856 202.48623 47.179944 202.48609 47.180154 202.48613 47.180319 202.48619 47.180515 202.48585 47.180525 202.48577 47.180555 202.48571 47.180632 202.48572 47.180821 202.48578 47.180908 202.48588 47.180919 202.48621 47.180909 202.48634 47.180906 202.48667 47.180896 202.48682 47.180909 202.48706 47.180933 202.48729 47.180907 202.48727 47.180783 202.48697 47.180707 202.4869 47.180726 202.48659 47.180629 202.4863 47.180524 202.48632 47.180299 202.48653 47.180131 202.48658 47.179992 202.48623 47.179944 202.51239 47.196585 202.5121 47.196594 202.51208 47.196392 202.51238 47.196383 202.51239 47.196585 202.49186 47.183763 202.49194 47.183834 202.49202 47.183861 202.492 47.18379 202.49186 47.183763 202.48888 47.181899 202.48884 47.181895 202.48883 47.181868 202.4889 47.181849 202.48888 47.181899 202.48855 47.181689 202.48823 47.181698 202.48822 47.181483 202.48856 47.18145 202.48855 47.181689 202.47844 47.175372 202.4783 47.175376 202.47829 47.175278 202.47846 47.175258 202.47844 47.175372 202.47779 47.174964 202.47752 47.174972 202.47722 47.174869 202.4772 47.1746 202.47757 47.174609 202.47778 47.174784 202.47779 47.174964 202.47559 47.173591 202.47542 47.173595 202.47524 47.173404 202.47525 47.173377 202.47529 47.17337 202.47563 47.173445 202.47559 47.173591 202.47414 47.172684 202.47402 47.172678 202.474 47.172595 202.47413 47.172596 202.47414 47.172684 202.4719 47.171284 202.47153 47.171264 202.47154 47.171057 202.47184 47.171038 202.4719 47.171284 202.48993 47.183155 202.48978 47.183157 202.48974 47.183035 202.48999 47.183001 202.48993 47.183155 202.51144 47.196889 202.51128 47.196875 202.51126 47.196773 202.51143 47.196758 202.51144 47.196889 202.49565 47.187022 202.49555 47.187263 202.49521 47.187346 202.49522 47.187592 202.49546 47.187741 202.4957 47.187652 202.49595 47.187509 202.49591 47.187408 202.4959 47.187179 202.49587 47.187114 202.49565 47.187022 202.49084 47.184022 202.49073 47.184248 202.49048 47.184267 202.4905 47.184104 202.49081 47.184 202.49084 47.183997 202.49084 47.184022 202.48455 47.180088 202.48461 47.180147 202.48457 47.1804 202.48426 47.180401 202.48411 47.180413 202.4839 47.180581 202.48354 47.180606 202.48356 47.180368 202.48356 47.180272 202.4835 47.180029 202.48388 47.180035 202.48408 47.180092 202.48431 47.179941 202.48453 47.179877 202.48455 47.180088 202.48314 47.179211 202.4831 47.179304 202.48338 47.179357 202.48323 47.179212 202.48314 47.179211 202.47863 47.17639 202.47849 47.176535 202.47872 47.176447 202.47875 47.176344 202.47863 47.17639 202.47589 47.174677 202.47571 47.174862 202.47539 47.174959 202.47547 47.175189 202.47552 47.175345 202.47556 47.175446 202.47571 47.175462 202.47579 47.175276 202.47581 47.175225 202.47603 47.175063 202.47625 47.174901 202.47623 47.174623 202.47589 47.174677 202.47403 47.173513 202.47381 47.173488 202.47375 47.17334 202.47395 47.173381 202.47403 47.173513 202.51201 47.197543 202.51167 47.197631 202.51157 47.197634 202.51159 47.197579 202.51164 47.197309 202.51198 47.197333 202.51201 47.197543 202.49624 47.18769 202.49627 47.187791 202.49652 47.187866 202.49636 47.187723 202.49624 47.18769 202.48994 47.183756 202.4898 47.183792 202.48979 47.183663 202.48994 47.183684 202.48994 47.183756 202.4748 47.174292 202.4745 47.174274 202.47445 47.174075 202.47479 47.174065 202.4748 47.174292 202.47073 47.171747 202.47043 47.171756 202.47021 47.171722 202.46998 47.171759 202.46983 47.171549 202.46986 47.171502 202.46998 47.171439 202.47014 47.171377 202.47051 47.17137 202.47071 47.171545 202.47073 47.171747 202.49268 47.185766 202.49268 47.185888 202.49286 47.185883 202.49281 47.185793 202.49268 47.185766 202.48792 47.182792 202.48757 47.182873 202.48748 47.182905 202.48752 47.18284 202.48764 47.182616 202.48791 47.182588 202.48792 47.182792 202.47756 47.176316 202.47746 47.176319 202.47748 47.176269 202.47755 47.17625 202.47756 47.176316 202.51208 47.198186 202.51169 47.198198 202.51167 47.197929 202.51204 47.197938 202.51208 47.198186 202.48807 47.183186 202.488 47.183441 202.48774 47.183582 202.48737 47.183648 202.48735 47.183649 202.48735 47.183636 202.48742 47.183376 202.48754 47.183185 202.48751 47.183136 202.48758 47.183156 202.488 47.183144 202.48807 47.18312 202.48807 47.183186 202.47309 47.17382 202.47291 47.173825 202.47292 47.173717 202.47309 47.173692 202.47309 47.17382 202.47243 47.173412 202.47211 47.17344 202.47216 47.173239 202.47242 47.173212 202.47243 47.173412 202.49474 47.187655 202.4949 47.187833 202.49494 47.188078 202.49474 47.188249 202.49471 47.188293 202.49494 47.188379 202.49516 47.188217 202.49515 47.187972 202.49517 47.187921 202.49515 47.187643 202.49474 47.187655 202.47013 47.172268 202.46972 47.172314 202.46965 47.172571 202.46931 47.17258 202.46919 47.172346 202.46923 47.172305 202.46926 47.172294 202.46967 47.172283 202.46967 47.17199 202.46967 47.171987 202.46968 47.171982 202.4701 47.172002 202.47013 47.172268 202.5139 47.199915 202.51377 47.199914 202.51378 47.199844 202.51386 47.199848 202.5139 47.199915 202.50228 47.192661 202.50231 47.192762 202.50243 47.192758 202.50241 47.192694 202.50228 47.192661 202.49359 47.187234 202.49348 47.187463 202.49337 47.187661 202.49367 47.187583 202.49396 47.187546 202.49421 47.187621 202.49419 47.187375 202.49381 47.187337 202.49359 47.187234 202.4709 47.173055 202.47086 47.173061 202.47086 47.173028 202.47093 47.17301 202.4709 47.173055 202.49576 47.188889 202.49591 47.189039 202.4961 47.18922 202.49633 47.189377 202.49649 47.189581 202.4965 47.189647 202.49663 47.189807 202.49687 47.189882 202.49695 47.189897 202.49736 47.189885 202.49724 47.189679 202.4971 47.189458 202.49672 47.189411 202.49648 47.189263 202.49625 47.189113 202.49612 47.188879 202.49576 47.188889 202.48185 47.180198 202.48156 47.180121 202.48145 47.179949 202.48174 47.179985 202.48185 47.180198 202.51319 47.200374 202.51312 47.200393 202.51312 47.200327 202.51319 47.200341 202.51319 47.200374 202.48878 47.185126 202.48866 47.185285 202.48887 47.185452 202.48921 47.185396 202.4892 47.185208 202.48884 47.185149 202.48878 47.185126 202.48797 47.184622 202.48788 47.184863 202.48789 47.184878 202.48786 47.185151 202.48778 47.18528 202.48802 47.185429 202.48837 47.185466 202.48835 47.185188 202.48835 47.185155 202.4884 47.184891 202.48844 47.184796 202.48821 47.184638 202.48797 47.184622 202.47287 47.175182 202.47282 47.175196 202.47283 47.175159 202.47286 47.175162 202.47287 47.175182 202.47119 47.174131 202.47118 47.17413 202.47118 47.174123 202.47119 47.174122 202.47119 47.174131 202.49173 47.187268 202.4918 47.187519 202.4921 47.187619 202.49238 47.187673 202.49223 47.187522 202.49215 47.187256 202.49173 47.187268 202.49081 47.186693 202.49091 47.186874 202.49109 47.186869 202.49108 47.186746 202.49081 47.186693 202.49014 47.186274 202.49009 47.186508 202.49035 47.18664 202.49071 47.18663 202.49069 47.186384 202.49048 47.186218 202.49014 47.186274 202.47498 47.176799 202.47477 47.176966 202.47474 47.177028 202.47486 47.177024 202.47512 47.176887 202.47519 47.176692 202.47498 47.176799 202.50672 47.196928 202.50673 47.196982 202.50682 47.196993 202.5068 47.196932 202.50672 47.196928 202.48658 47.18435 202.48629 47.184467 202.48631 47.184746 202.48661 47.184667 202.48694 47.184572 202.48685 47.184342 202.48658 47.18435 202.47079 47.174482 202.4707 47.174485 202.47072 47.174435 202.47076 47.174442 202.47079 47.174482 202.50984 47.199176 202.50984 47.199242 202.50992 47.199229 202.51006 47.199078 202.50984 47.199176 202.48581 47.184169 202.48583 47.184447 202.48624 47.184436 202.4861 47.184245 202.48581 47.184169 202.47091 47.174854 202.47063 47.174862 202.47062 47.17467 202.4709 47.174662 202.47091 47.174854 202.50643 47.197348 202.5062 47.197504 202.50621 47.197689 202.50638 47.197893 202.50641 47.197936 202.50629 47.198156 202.5063 47.198279 202.50657 47.198333 202.50679 47.19817 202.50688 47.19793 202.50689 47.19784 202.50697 47.197682 202.50693 47.197482 202.50668 47.197345 202.50643 47.197348 202.49096 47.187685 202.49068 47.187693 202.49067 47.187504 202.49095 47.187496 202.49096 47.187685 202.49682 47.191642 202.49663 47.191826 202.49653 47.191828 202.49653 47.191762 202.49677 47.191616 202.49682 47.19162 202.49682 47.191642 202.49135 47.188226 202.4913 47.18821 202.49129 47.188192 202.49135 47.188178 202.49135 47.188226 202.48564 47.184658 202.4858 47.184798 202.48601 47.184893 202.486 47.184648 202.48564 47.184658 202.48382 47.183525 202.48349 47.183612 202.48341 47.183631 202.48305 47.183641 202.48299 47.183621 202.48256 47.183633 202.4825 47.183657 202.48214 47.183667 202.48204 47.18367 202.48169 47.183606 202.48158 47.183619 202.48119 47.183672 202.481 47.183855 202.48091 47.184096 202.4808 47.184263 202.48102 47.184164 202.48128 47.184031 202.48156 47.184024 202.48174 47.184018 202.48193 47.183837 202.48227 47.183827 202.48244 47.184024 202.48279 47.184072 202.483 47.18391 202.48307 47.183886 202.48343 47.183876 202.4835 47.18389 202.48391 47.183879 202.48398 47.18386 202.48425 47.183791 202.48433 47.183605 202.484 47.183519 202.48382 47.183525 202.50713 47.198383 202.50703 47.198385 202.50667 47.198396 202.50666 47.198659 202.50689 47.198813 202.50727 47.198766 202.50751 47.198617 202.50732 47.198497 202.50713 47.198383 202.4972 47.192182 202.49699 47.192141 202.49691 47.192002 202.49715 47.192027 202.4972 47.192182 202.49268 47.189358 202.49239 47.189475 202.49223 47.189479 202.49192 47.189379 202.49191 47.189176 202.49223 47.189153 202.49235 47.189149 202.49267 47.189154 202.49268 47.189358 202.49053 47.188016 202.49023 47.188025 202.49025 47.187838 202.49055 47.187788 202.49053 47.188016 202.48706 47.185848 202.48689 47.18604 202.48673 47.18606 202.48667 47.185904 202.48701 47.185816 202.48693 47.185587 202.48659 47.18555 202.48651 47.185569 202.48654 47.185524 202.48648 47.185272 202.48617 47.185175 202.48599 47.18518 202.486 47.185297 202.48596 47.185458 202.48578 47.185464 202.4855 47.185339 202.4853 47.185345 202.48497 47.18544 202.48475 47.185602 202.48477 47.18588 202.48508 47.185804 202.48527 47.185623 202.48557 47.185615 202.48583 47.185752 202.48584 47.185981 202.48573 47.186148 202.48573 47.186214 202.48549 47.186361 202.48551 47.186639 202.48592 47.186627 202.48599 47.186608 202.48625 47.186539 202.48649 47.186564 202.48683 47.186601 202.48688 47.186599 202.48729 47.186588 202.48752 47.186434 202.48758 47.186407 202.4878 47.186309 202.48781 47.186237 202.48755 47.186105 202.48735 47.185923 202.48706 47.185848 202.48432 47.184134 202.48436 47.184235 202.48446 47.184222 202.4845 47.184129 202.48432 47.184134 202.49474 47.190945 202.49467 47.19093 202.49467 47.190897 202.49474 47.190878 202.49474 47.190945 202.50333 47.196605 202.50328 47.196606 202.50325 47.196557 202.50332 47.196572 202.50333 47.196605 202.49242 47.189794 202.49224 47.189799 202.49223 47.189673 202.49241 47.189668 202.49242 47.189794 202.48622 47.185922 202.48603 47.185928 202.48602 47.185795 202.48622 47.185789 202.48622 47.185922 202.48367 47.184329 202.48365 47.184432 202.4838 47.184407 202.48382 47.184304 202.48367 47.184329 202.4694 47.175405 202.46902 47.175398 202.46903 47.175174 202.46936 47.17515 202.4694 47.175405 202.50083 47.195347 202.50057 47.195354 202.50055 47.195173 202.50078 47.195198 202.50083 47.195347 202.49983 47.194723 202.49965 47.194728 202.49965 47.194607 202.49979 47.194627 202.49983 47.194723 202.49535 47.191924 202.49507 47.191932 202.49489 47.191937 202.49493 47.192038 202.49518 47.192113 202.49527 47.19211 202.49563 47.1921 202.49562 47.191855 202.49535 47.191924 202.4688 47.175332 202.46867 47.175336 202.46866 47.175241 202.46878 47.175252 202.4688 47.175332 202.50464 47.198024 202.50446 47.198012 202.50414 47.19801 202.50401 47.198013 202.50367 47.197946 202.50361 47.197683 202.50404 47.197671 202.50424 47.197776 202.50434 47.197771 202.50461 47.197901 202.50464 47.198024 202.50028 47.195304 202.50021 47.195291 202.50021 47.195258 202.50028 47.19524 202.50028 47.195304 202.49909 47.194561 202.499 47.194563 202.49902 47.194513 202.49909 47.194495 202.49909 47.194561 202.49795 47.193844 202.49776 47.193849 202.49775 47.193724 202.49795 47.193707 202.49795 47.193844 202.48085 47.183162 202.48051 47.183172 202.48036 47.183156 202.48015 47.183114 202.47982 47.183036 202.47966 47.18302 202.47939 47.183028 202.47911 47.182974 202.47913 47.183219 202.47949 47.183209 202.47959 47.183206 202.47956 47.183256 202.47958 47.183534 202.47999 47.183523 202.48003 47.183527 202.48035 47.183446 202.48064 47.183332 202.48074 47.183329 202.48098 47.183244 202.481 47.183137 202.48085 47.183162 202.4754 47.179753 202.47516 47.179905 202.47512 47.179999 202.4754 47.180052 202.47562 47.17989 202.47549 47.17973 202.4754 47.179753 202.47395 47.178849 202.47356 47.178907 202.47335 47.179069 202.47312 47.179226 202.47293 47.179409 202.47283 47.179412 202.47264 47.179527 202.47241 47.179679 202.47231 47.179801 202.47231 47.17992 202.47233 47.180109 202.47255 47.180066 202.47288 47.180032 202.47296 47.180023 202.47328 47.179927 202.47327 47.179741 202.47321 47.179585 202.47351 47.179468 202.4737 47.179291 202.47392 47.179129 202.47409 47.178937 202.47405 47.178836 202.47395 47.178849 202.46919 47.175871 202.46887 47.175832 202.46873 47.175615 202.46873 47.175582 202.46877 47.175581 202.46914 47.175634 202.46919 47.175871 202.50791 47.200364 202.50787 47.200371 202.50784 47.200322 202.50792 47.200337 202.50791 47.200364 202.50028 47.195601 202.50043 47.195779 202.50042 47.19599 202.50009 47.196035 202.49985 47.195882 202.49982 47.195611 202.50023 47.195569 202.5003 47.195553 202.50028 47.195601 202.49975 47.195267 202.49952 47.195423 202.49917 47.19541 202.49916 47.1952 202.49928 47.195006 202.49925 47.194958 202.49932 47.194972 202.49974 47.194987 202.49975 47.195267 202.49386 47.191593 202.49377 47.191596 202.49353 47.191447 202.49353 47.191383 202.49362 47.191378 202.49386 47.191527 202.49386 47.191593 202.4931 47.191118 202.49305 47.191385 202.49272 47.191394 202.49275 47.191196 202.49309 47.191112 202.4931 47.191112 202.4931 47.191118 202.49072 47.189628 202.49083 47.189863 202.49084 47.190001 202.49077 47.190235 202.4908 47.190278 202.4907 47.190281 202.49047 47.190132 202.49023 47.189982 202.49002 47.18981 202.48998 47.189767 202.49008 47.189765 202.49028 47.189652 202.49069 47.189609 202.49073 47.189608 202.49072 47.189628 202.48504 47.186078 202.48505 47.186323 202.48541 47.186313 202.4854 47.186068 202.48504 47.186078 202.50629 47.199654 202.50644 47.199802 202.50653 47.1998 202.50654 47.199728 202.50629 47.199654 202.49768 47.194273 202.49763 47.194269 202.49721 47.194281 202.49718 47.194282 202.49717 47.194254 202.49739 47.194098 202.49743 47.194091 202.49767 47.19424 202.49768 47.194273 202.4967 47.193666 202.49669 47.193669 202.49668 47.193654 202.49671 47.193653 202.4967 47.193666 202.50806 47.201059 202.50779 47.201078 202.50774 47.200857 202.50807 47.200874 202.50806 47.201059 202.50382 47.198412 202.50344 47.198441 202.50345 47.198182 202.50382 47.198158 202.50382 47.198412 202.50127 47.196814 202.50107 47.19699 202.50099 47.196992 202.50075 47.197093 202.5004 47.197103 202.50043 47.196891 202.50069 47.196757 202.50088 47.196751 202.50122 47.196788 202.50127 47.196787 202.50127 47.196814 202.49579 47.193392 202.49574 47.193393 202.49571 47.193344 202.49578 47.193359 202.49579 47.193392 202.50561 47.199829 202.50555 47.199806 202.50554 47.199781 202.50559 47.19978 202.50561 47.199829 202.50237 47.197805 202.5024 47.197903 202.50242 47.198132 202.50207 47.198216 202.50209 47.198461 202.50241 47.198546 202.50265 47.198695 202.50293 47.198749 202.503 47.198763 202.50323 47.198921 202.50324 47.198945 202.50332 47.199175 202.5035 47.199372 202.5035 47.199405 202.50358 47.199635 202.50359 47.199761 202.50363 47.199922 202.50394 47.199983 202.50418 47.199832 202.5042 47.199832 202.50421 47.199851 202.50402 47.20003 202.50404 47.200276 202.50401 47.200326 202.50403 47.200604 202.50403 47.200637 202.50419 47.20081 202.50424 47.201062 202.50409 47.201209 202.5043 47.201381 202.50457 47.201507 202.50488 47.201465 202.50504 47.201488 202.50508 47.201592 202.50492 47.20179 202.50466 47.201767 202.5044 47.201764 202.50435 47.201998 202.50476 47.201986 202.50483 47.201967 202.5048 47.202012 202.50461 47.202195 202.50463 47.202441 202.50461 47.202491 202.50463 47.202769 202.50465 47.202818 202.50453 47.203039 202.50454 47.203161 202.50472 47.203156 202.50499 47.203148 202.505 47.203337 202.50493 47.203523 202.50529 47.203513 202.50538 47.203272 202.5054 47.203169 202.50539 47.202981 202.50547 47.202794 202.5055 47.202749 202.50569 47.202566 202.50567 47.202321 202.50546 47.202149 202.50543 47.202106 202.50532 47.201927 202.50531 47.201734 202.5056 47.201726 202.50574 47.201703 202.50574 47.201622 202.50572 47.201392 202.5057 47.201321 202.50573 47.201095 202.50597 47.200946 202.50606 47.200735 202.50605 47.200702 202.50617 47.200474 202.50642 47.200464 202.50643 47.20064 202.50645 47.200768 202.50669 47.200917 202.5067 47.201106 202.50673 47.20121 202.50665 47.201371 202.50651 47.201583 202.5064 47.201783 202.50643 47.201832 202.50644 47.202077 202.50665 47.202249 202.50665 47.202268 202.50659 47.202295 202.50637 47.202129 202.50609 47.20222 202.50598 47.202418 202.50633 47.202486 202.50648 47.202462 202.50673 47.202512 202.50701 47.202634 202.50728 47.202662 202.50726 47.202445 202.50727 47.20236 202.50722 47.202154 202.50719 47.202011 202.50718 47.201854 202.50687 47.201759 202.50686 47.201507 202.50724 47.201484 202.50749 47.201601 202.50753 47.2016 202.50756 47.201643 202.50758 47.201888 202.50787 47.202 202.50803 47.202204 202.50834 47.202304 202.50834 47.20243 202.50839 47.202591 202.50853 47.202813 202.50876 47.202968 202.50876 47.202987 202.50873 47.203267 202.50873 47.203315 202.50883 47.203568 202.50919 47.203623 202.50931 47.203865 202.50927 47.203904 202.50915 47.204132 202.50903 47.204351 202.50875 47.204479 202.50852 47.204632 202.50828 47.204786 202.50802 47.20492 202.50781 47.205087 202.50763 47.205274 202.50739 47.205422 202.50707 47.205525 202.50685 47.205688 202.50675 47.20592 202.50652 47.206074 202.50625 47.206211 202.50606 47.206391 202.5058 47.206524 202.50554 47.206661 202.50548 47.20669 202.50511 47.206693 202.50504 47.206695 202.50476 47.206773 202.50477 47.206895 202.50478 47.207084 202.50482 47.207185 202.50471 47.207338 202.50444 47.207473 202.50439 47.207501 202.50403 47.207512 202.50404 47.207757 202.504 47.207795 202.50384 47.207994 202.5037 47.208206 202.5034 47.208319 202.50315 47.208462 202.50303 47.208505 202.50302 47.208379 202.50298 47.208218 202.50284 47.207997 202.50243 47.208008 202.50236 47.208027 202.50235 47.207961 202.50225 47.20778 202.50224 47.207591 202.50247 47.207616 202.50274 47.207608 202.5028 47.207374 202.50277 47.207325 202.50276 47.20708 202.50275 47.207014 202.50274 47.206769 202.50277 47.206724 202.50275 47.206435 202.50275 47.206416 202.50284 47.206173 202.5028 47.20607 202.50268 47.205836 202.50267 47.20577 202.50266 47.205525 202.50238 47.205407 202.50237 47.205281 202.50242 47.205047 202.50242 47.205014 202.5024 47.204736 202.50207 47.204794 202.50183 47.204832 202.50157 47.2047 202.50152 47.204449 202.50167 47.204306 202.50169 47.204256 202.5016 47.204026 202.5016 47.2039 202.50158 47.203715 202.50135 47.203566 202.50129 47.20341 202.5016 47.203307 202.50159 47.203061 202.50158 47.202995 202.50157 47.20275 202.50156 47.202684 202.50146 47.202503 202.50131 47.20229 202.50095 47.2023 202.50088 47.202286 202.50061 47.202154 202.50061 47.202088 202.5007 47.201848 202.50108 47.201785 202.50127 47.201602 202.50117 47.20142 202.50089 47.201367 202.50082 47.201353 202.50079 47.201304 202.50101 47.201142 202.5011 47.200901 202.50136 47.200759 202.50143 47.200572 202.50146 47.200522 202.50156 47.200285 202.50155 47.200163 202.50131 47.200014 202.50135 47.199855 202.5014 47.199621 202.50099 47.199633 202.50094 47.199635 202.50068 47.199503 202.50068 47.199437 202.50089 47.199275 202.50088 47.199029 202.50088 47.198963 202.50077 47.198782 202.50059 47.198787 202.5006 47.19891 202.50061 47.199098 202.50034 47.199103 202.5001 47.198957 202.49986 47.198808 202.49971 47.198595 202.49939 47.198502 202.49934 47.198302 202.49968 47.198292 202.49978 47.198544 202.50011 47.198488 202.50017 47.198254 202.49991 47.198122 202.4999 47.198056 202.49989 47.197811 202.49967 47.197645 202.49926 47.197656 202.49904 47.197819 202.49899 47.19782 202.49873 47.197688 202.49849 47.197539 202.49849 47.197473 202.49873 47.197327 202.49895 47.197165 202.49915 47.196987 202.49937 47.196825 202.49946 47.196822 202.49979 47.196907 202.49994 47.19712 202.49994 47.197186 202.49996 47.197431 202.50017 47.197603 202.50044 47.197729 202.50072 47.197847 202.50106 47.197884 202.50113 47.197865 202.5014 47.197796 202.50148 47.19761 202.50124 47.19746 202.50104 47.197286 202.501 47.197245 202.5011 47.197243 202.50133 47.197392 202.50155 47.197558 202.50179 47.197707 202.50212 47.197647 202.50231 47.197649 202.50237 47.197805 202.487 47.188204 202.48702 47.188449 202.48699 47.188496 202.4869 47.188735 202.48659 47.188764 202.48655 47.188521 202.4866 47.188433 202.48664 47.188274 202.48694 47.188162 202.48698 47.188155 202.487 47.188204 202.48355 47.186047 202.48321 47.186056 202.48309 47.18606 202.48298 47.186226 202.48322 47.186376 202.48344 47.186277 202.48377 47.186293 202.48399 47.186324 202.48398 47.186138 202.48367 47.186043 202.48355 47.186047 202.50943 47.202508 202.50939 47.202504 202.50938 47.202477 202.50945 47.202458 202.50943 47.202508 202.50859 47.201987 202.50836 47.201962 202.5083 47.201806 202.50858 47.201798 202.50859 47.201987 202.49585 47.19403 202.49578 47.194016 202.49575 47.193967 202.49582 47.193981 202.49585 47.19403 202.49509 47.193556 202.49524 47.193761 202.49531 47.19399 202.49508 47.194144 202.49471 47.194155 202.49469 47.193905 202.49467 47.193858 202.4946 47.193582 202.49436 47.193433 202.49434 47.193384 202.49446 47.193163 202.49474 47.193155 202.49491 47.193353 202.49509 47.193546 202.49509 47.193556 202.4906 47.190751 202.4907 47.190932 202.49088 47.190927 202.49088 47.190805 202.4906 47.190751 202.48032 47.184326 202.48027 47.184592 202.48023 47.184685 202.48037 47.184655 202.48075 47.184592 202.48073 47.184314 202.48032 47.184326 202.47715 47.182343 202.47702 47.1825 202.47737 47.182564 202.47753 47.18258 202.47752 47.182457 202.47728 47.182308 202.47715 47.182343 202.47662 47.182015 202.47669 47.182095 202.47676 47.182103 202.47677 47.182031 202.47662 47.182015 202.47557 47.18136 202.4755 47.181346 202.47509 47.181357 202.47486 47.181514 202.47488 47.181803 202.47525 47.181757 202.47546 47.181704 202.47573 47.181757 202.47595 47.181595 202.47593 47.18135 202.47557 47.18136 202.47303 47.179771 202.47274 47.179808 202.47272 47.179579 202.47306 47.179569 202.47303 47.179771 202.49957 47.196655 202.49924 47.196665 202.49911 47.19643 202.49875 47.196441 202.49885 47.196622 202.49887 47.196811 202.49863 47.196786 202.49844 47.196606 202.4982 47.196457 202.49822 47.196406 202.4982 47.196128 202.4982 47.196095 202.49827 47.196077 202.49849 47.196243 202.49882 47.196187 202.49901 47.196181 202.49918 47.196379 202.49952 47.196455 202.49957 47.196655 202.49802 47.195682 202.49795 47.195662 202.49795 47.19564 202.49798 47.195639 202.49802 47.195682 202.48721 47.189231 202.48682 47.18925 202.48678 47.188964 202.48722 47.188948 202.48721 47.189231 202.48535 47.188068 202.48533 47.188071 202.48532 47.188047 202.48536 47.188045 202.48535 47.188068 202.46553 47.175679 202.46521 47.175776 202.46498 47.175782 202.46499 47.17564 202.46517 47.175456 202.46543 47.175449 202.46553 47.175679 202.495 47.194396 202.49478 47.194558 202.49455 47.194596 202.49454 47.194408 202.49476 47.194245 202.49504 47.194237 202.495 47.194396 202.47973 47.184857 202.4795 47.184895 202.47937 47.184928 202.479 47.184938 202.47891 47.184942 202.47879 47.185099 202.47902 47.185248 202.47929 47.185179 202.47951 47.185017 202.47974 47.185042 202.4798 47.185198 202.47958 47.18536 202.47939 47.185542 202.47928 47.185708 202.47952 47.185857 202.47979 47.185788 202.47977 47.185675 202.47975 47.185469 202.48006 47.185461 202.48029 47.185617 202.48043 47.185594 202.48046 47.185491 202.48022 47.185337 202.48028 47.185202 202.48027 47.184981 202.48 47.184849 202.47973 47.184857 202.46622 47.176412 202.46592 47.176389 202.46591 47.176215 202.46614 47.176226 202.46622 47.176412 202.50246 47.199357 202.50247 47.19948 202.50265 47.199475 202.50264 47.199352 202.50246 47.199357 202.50165 47.198851 202.50178 47.199011 202.5019 47.199008 202.50201 47.198841 202.50165 47.198851 202.48954 47.191286 202.48934 47.191292 202.48933 47.191152 202.48948 47.191188 202.48954 47.191286 202.48662 47.189462 202.48653 47.189465 202.48655 47.189414 202.4866 47.189413 202.48662 47.189462 202.48626 47.189236 202.48592 47.189265 202.48589 47.189007 202.48625 47.189019 202.48626 47.189236 202.47864 47.184472 202.47864 47.184554 202.47876 47.184551 202.47876 47.184469 202.47864 47.184472 202.50499 47.201233 202.50492 47.201252 202.50494 47.201201 202.50498 47.201209 202.50499 47.201233 202.49878 47.197358 202.4988 47.197637 202.49921 47.197625 202.49919 47.197347 202.49878 47.197358 202.49831 47.19706 202.49824 47.197079 202.49823 47.197013 202.4983 47.197027 202.49831 47.19706 202.49778 47.196732 202.4974 47.196791 202.49726 47.197004 202.49705 47.196978 202.4967 47.196912 202.49652 47.196722 202.49652 47.196545 202.49684 47.196487 202.49709 47.196622 202.4973 47.196728 202.49737 47.196477 202.49776 47.196451 202.49778 47.196732 202.49954 47.198132 202.49945 47.198135 202.49947 47.198085 202.49954 47.198066 202.49954 47.198132 202.49509 47.195649 202.49477 47.195749 202.49475 47.19575 202.49452 47.195891 202.49427 47.196032 202.49389 47.196061 202.49371 47.195867 202.49352 47.195685 202.49351 47.195559 202.49356 47.195326 202.49357 47.195298 202.49361 47.195291 202.49395 47.195235 202.49418 47.195197 202.49437 47.195379 202.49458 47.195329 202.49492 47.195296 202.49506 47.195523 202.49509 47.195649 202.47263 47.181614 202.47252 47.181596 202.47249 47.181524 202.47266 47.181491 202.47263 47.181614 202.47172 47.181046 202.47154 47.18102 202.47156 47.180947 202.47167 47.180922 202.47172 47.181046 202.49915 47.198487 202.49899 47.198476 202.49891 47.198333 202.49919 47.198325 202.49915 47.198487 202.49728 47.197319 202.49706 47.197294 202.49706 47.197177 202.49727 47.197139 202.49728 47.197319 202.485 47.189647 202.48493 47.189666 202.48496 47.189621 202.48503 47.189597 202.485 47.189647 202.47892 47.185846 202.47896 47.185947 202.47911 47.185964 202.47919 47.185777 202.47892 47.185846 202.47654 47.184355 202.47654 47.184478 202.47672 47.184473 202.47672 47.18435 202.47654 47.184355 202.47458 47.183132 202.47443 47.183109 202.47405 47.183101 202.474 47.183368 202.47361 47.183425 202.47351 47.183662 202.47355 47.183763 202.47379 47.183838 202.47389 47.183835 202.47416 47.183767 202.47438 47.183604 202.47473 47.183525 202.47482 47.18328 202.47475 47.183201 202.47458 47.183132 202.47371 47.182586 202.47337 47.182596 202.47325 47.182361 202.47288 47.182372 202.47299 47.182553 202.47322 47.182702 202.47346 47.182851 202.47359 47.183081 202.474 47.18307 202.47409 47.182824 202.47421 47.182621 202.47394 47.182498 202.47371 47.182586 202.50378 47.201676 202.50376 47.201781 202.50394 47.201775 202.50391 47.201674 202.50378 47.201676 202.49173 47.194148 202.49165 47.194133 202.49166 47.194106 202.49172 47.194082 202.49173 47.194148 202.49073 47.193524 202.49052 47.193689 202.49049 47.19369 202.49011 47.193648 202.49012 47.193442 202.49032 47.19327 202.49065 47.193247 202.49073 47.193515 202.49073 47.193524 202.47131 47.181387 202.47123 47.181573 202.47121 47.181623 202.47117 47.181619 202.4709 47.181493 202.47054 47.181503 202.47041 47.181724 202.4701 47.181827 202.46985 47.181974 202.46981 47.181975 202.46947 47.182031 202.4695 47.182198 202.46951 47.182359 202.46924 47.182397 202.46898 47.182327 202.46876 47.182489 202.46869 47.182474 202.46839 47.182373 202.46804 47.182337 202.46784 47.18251 202.46762 47.182672 202.46744 47.18286 202.46726 47.182882 202.467 47.18288 202.46671 47.182998 202.46667 47.182994 202.46663 47.182951 202.46662 47.182705 202.46664 47.182655 202.46654 47.182439 202.46655 47.182303 202.46651 47.18213 202.46651 47.181975 202.4667 47.181995 202.46699 47.182103 202.4673 47.182169 202.46753 47.182015 202.46766 47.181798 202.46793 47.181734 202.46817 47.181816 202.46822 47.181552 202.46861 47.181495 202.46869 47.181498 202.46871 47.181559 202.46862 47.181803 202.4686 47.181894 202.46882 47.181925 202.46912 47.181811 202.46915 47.18181 202.46952 47.181764 202.46971 47.181586 202.47 47.181469 202.47008 47.18145 202.47044 47.18144 202.47069 47.181299 202.47075 47.181275 202.47102 47.181206 202.47125 47.181232 202.47131 47.181387 202.47059 47.180938 202.47031 47.180954 202.47022 47.180708 202.47066 47.180695 202.47059 47.180938 202.46988 47.180495 202.46961 47.180494 202.46954 47.180282 202.4699 47.180277 202.46988 47.180495 202.46504 47.177464 202.4649 47.177468 202.46487 47.177363 202.46503 47.177372 202.46504 47.177464 202.50093 47.200195 202.50083 47.200367 202.50083 47.200433 202.50077 47.200413 202.5005 47.200287 202.50049 47.200221 202.5006 47.199986 202.50088 47.200008 202.50093 47.200195 202.49694 47.197703 202.49668 47.197837 202.49633 47.197836 202.4963 47.1976 202.49648 47.197413 202.49692 47.1974 202.49694 47.197703 202.49589 47.197049 202.49562 47.197057 202.49564 47.196889 202.49588 47.196866 202.49589 47.197049 202.48932 47.192941 202.4893 47.192944 202.4893 47.19293 202.48932 47.192933 202.48932 47.192941 202.48635 47.191089 202.48639 47.191191 202.48654 47.191207 202.48654 47.191084 202.48635 47.191089 202.47901 47.186499 202.47903 47.186549 202.47924 47.186645 202.47914 47.186463 202.47901 47.186499 202.47016 47.180966 202.46983 47.180985 202.46984 47.180766 202.4702 47.180707 202.47016 47.180966 202.50597 47.203641 202.50598 47.203723 202.50613 47.203739 202.50612 47.203616 202.50597 47.203641 202.50374 47.20225 202.50369 47.202484 202.50372 47.202533 202.50385 47.202693 202.504 47.202709 202.50399 47.202586 202.50403 47.202428 202.50408 47.202194 202.50374 47.20225 202.4927 47.19535 202.49266 47.195346 202.49262 47.195303 202.49269 47.195317 202.4927 47.19535 202.48993 47.193622 202.48978 47.193827 202.4894 47.193847 202.48934 47.193567 202.48933 47.193548 202.48936 47.193551 202.48971 47.193487 202.48989 47.193482 202.48993 47.193622 202.487 47.191789 202.48701 47.192034 202.48701 47.1921 202.48717 47.192245 202.48721 47.192225 202.48725 47.192186 202.48723 47.191936 202.48727 47.191843 202.487 47.191789 202.47615 47.18501 202.47604 47.185177 202.4764 47.185167 202.4763 47.184986 202.47615 47.18501 202.4729 47.182978 202.47291 47.183256 202.47325 47.1832 202.47324 47.183015 202.4729 47.182978 202.46974 47.181005 202.46937 47.180999 202.46935 47.180762 202.46971 47.180746 202.46974 47.181005 202.46728 47.179467 202.46699 47.179504 202.46689 47.179523 202.46684 47.17961 202.46709 47.179753 202.46738 47.179829 202.4676 47.179667 202.46752 47.179437 202.46728 47.179467 202.5061 47.204023 202.50621 47.204204 202.50617 47.204363 202.50588 47.204481 202.50583 47.204482 202.50559 47.204333 202.50556 47.204284 202.50543 47.204124 202.50542 47.203895 202.50544 47.203792 202.50517 47.203738 202.5051 47.203718 202.50483 47.203592 202.50465 47.203711 202.50457 47.203784 202.50451 47.203927 202.50456 47.204121 202.50464 47.204303 202.50467 47.204362 202.50479 47.204401 202.50507 47.204393 202.50503 47.204551 202.50498 47.204785 202.50522 47.204934 202.50521 47.204962 202.50503 47.205145 202.50481 47.205307 202.50468 47.205528 202.50473 47.205619 202.50496 47.205704 202.50518 47.205542 202.50526 47.205556 202.50528 47.205605 202.50539 47.205786 202.50566 47.20584 202.50579 47.205619 202.50601 47.205457 202.50628 47.205449 202.50646 47.205444 202.50643 47.205343 202.50641 47.205113 202.50652 47.204946 202.50652 47.20488 202.5066 47.20463 202.50682 47.204468 202.50681 47.204407 202.50661 47.204231 202.50646 47.204013 202.5061 47.204023 202.4999 47.200148 202.4998 47.200151 202.4998 47.200085 202.4999 47.200082 202.4999 47.200148 202.49462 47.196854 202.49458 47.196855 202.49457 47.196822 202.49462 47.196821 202.49462 47.196854 202.49223 47.195358 202.49219 47.195365 202.49216 47.195316 202.49226 47.195313 202.49223 47.195358 202.49179 47.195081 202.49169 47.195084 202.49145 47.194935 202.49109 47.194945 202.49099 47.194948 202.49065 47.194879 202.49052 47.19465 202.49054 47.1946 202.49059 47.194598 202.49099 47.194583 202.49108 47.194561 202.49131 47.194717 202.49154 47.194866 202.49175 47.195038 202.49179 47.195081 202.48786 47.192629 202.48772 47.19281 202.48772 47.192843 202.48783 47.193056 202.48807 47.19306 202.48812 47.192844 202.48811 47.192787 202.48797 47.192627 202.48786 47.192629 202.47166 47.182502 202.47153 47.182656 202.47153 47.182722 202.47129 47.182868 202.47109 47.183046 202.47122 47.183206 202.47134 47.183203 202.47168 47.183193 202.47193 47.183268 202.47179 47.183108 202.47178 47.182878 202.47213 47.182795 202.47211 47.18255 202.47187 47.1824 202.47166 47.182502 202.46399 47.177709 202.46405 47.177768 202.46409 47.178067 202.46368 47.178113 202.46358 47.178116 202.46337 47.17822 202.46299 47.178231 202.463 47.17799 202.46337 47.177922 202.46342 47.177651 202.46371 47.177534 202.46394 47.177528 202.46399 47.177709 202.49011 47.194333 202.49004 47.194352 202.49006 47.194302 202.49011 47.1943 202.49011 47.194333 202.47496 47.184868 202.47469 47.184876 202.47467 47.184687 202.47467 47.184564 202.47444 47.184407 202.47423 47.184413 202.47415 47.184624 202.47417 47.184673 202.47408 47.184676 202.47381 47.184745 202.47354 47.184877 202.47355 47.185062 202.47379 47.185211 202.47406 47.185203 202.47423 47.185215 202.47453 47.185319 202.47449 47.185469 202.47432 47.185474 202.47397 47.185442 202.47374 47.185598 202.47365 47.18584 202.47365 47.185963 202.47362 47.186121 202.4735 47.186348 202.4735 47.186404 202.47363 47.186431 202.4739 47.186299 202.47413 47.186261 202.47441 47.186315 202.47439 47.186069 202.47442 47.186025 202.47446 47.186018 202.47487 47.186006 202.47498 47.185778 202.47511 47.185558 202.47548 47.185491 202.47576 47.185363 202.47569 47.185112 202.47538 47.185012 202.47514 47.184863 202.47496 47.184868 202.50337 47.202916 202.50344 47.202997 202.50366 47.203156 202.50377 47.203163 202.50388 47.202996 202.50352 47.202932 202.50337 47.202916 202.50264 47.202461 202.50265 47.2026 202.50289 47.202616 202.50295 47.202383 202.50264 47.202461 202.50015 47.200904 202.5001 47.200905 202.50008 47.200857 202.50017 47.200854 202.50015 47.200904 202.49979 47.20068 202.49958 47.200639 202.4995 47.2005 202.49978 47.200492 202.49979 47.20068 202.49345 47.19672 202.49324 47.196888 202.49302 47.197051 202.49294 47.197295 202.49258 47.197352 202.49271 47.197154 202.49299 47.197032 202.49317 47.196846 202.49316 47.196601 202.49318 47.19655 202.49323 47.196549 202.49345 47.19671 202.49345 47.19672 202.49285 47.196346 202.49257 47.196384 202.49244 47.196154 202.49216 47.196214 202.49194 47.196372 202.4917 47.196379 202.49169 47.196216 202.49198 47.196102 202.49208 47.19586 202.49235 47.195898 202.49251 47.196102 202.49284 47.196183 202.49285 47.196346 202.48166 47.189353 202.48138 47.189361 202.4812 47.189366 202.48127 47.189446 202.48149 47.189606 202.48163 47.189632 202.48194 47.189529 202.48193 47.189284 202.48166 47.189353 202.47512 47.185266 202.47504 47.185261 202.4748 47.185114 202.4748 47.185065 202.47487 47.185063 202.47518 47.185164 202.47512 47.185266 202.46465 47.17872 202.46454 47.17895 202.46436 47.179138 202.46412 47.179284 202.46411 47.179356 202.46412 47.179585 202.46391 47.179754 202.46365 47.17989 202.4637 47.179978 202.46389 47.180168 202.46385 47.180316 202.46393 47.180463 202.464 47.180706 202.46399 47.180745 202.46406 47.181019 202.46405 47.181039 202.46385 47.181209 202.46362 47.181366 202.4634 47.181528 202.46336 47.181534 202.46296 47.181507 202.46271 47.18136 202.46264 47.181354 202.46224 47.181404 202.46202 47.181562 202.46199 47.181573 202.46158 47.181585 202.46153 47.181586 202.46119 47.181642 202.46092 47.181776 202.46083 47.182016 202.46057 47.182151 202.46059 47.182275 202.46065 47.182499 202.46061 47.182592 202.46079 47.182587 202.46086 47.182401 202.46089 47.182351 202.46108 47.182173 202.46115 47.182193 202.46142 47.182319 202.46165 47.18247 202.46166 47.182534 202.46156 47.182537 202.4612 47.182547 202.4613 47.182728 202.46131 47.182917 202.46136 47.183009 202.4616 47.183093 202.46168 47.182846 202.46205 47.182777 202.4621 47.182792 202.4621 47.182808 202.46206 47.183082 202.46167 47.183141 202.46144 47.183297 202.46138 47.183557 202.46116 47.183483 202.4609 47.183348 202.46071 47.183165 202.46049 47.183004 202.46047 47.182986 202.46038 47.182756 202.46009 47.182645 202.4599 47.182467 202.4598 47.182272 202.45978 47.182229 202.4596 47.182034 202.45935 47.18199 202.45919 47.18201 202.45885 47.181974 202.45882 47.181962 202.45853 47.181849 202.45826 47.181725 202.45804 47.181563 202.4578 47.181413 202.45751 47.181305 202.45748 47.181117 202.45776 47.180997 202.4579 47.180785 202.45789 47.180693 202.45802 47.180557 202.45821 47.180378 202.4584 47.18032 202.45848 47.180544 202.45842 47.180628 202.45854 47.180582 202.45882 47.180461 202.45881 47.18034 202.4589 47.180212 202.45881 47.180016 202.45886 47.179885 202.4591 47.179738 202.45928 47.179552 202.45957 47.179433 202.45974 47.17924 202.45995 47.179072 202.46022 47.178942 202.46038 47.178741 202.46061 47.178585 202.46087 47.178451 202.46109 47.178289 202.46132 47.178134 202.46147 47.178049 202.46148 47.178233 202.46152 47.178341 202.46159 47.178304 202.46167 47.178231 202.46165 47.17804 202.46189 47.177888 202.46208 47.177922 202.46245 47.177978 202.46252 47.178252 202.46287 47.17832 202.46305 47.178315 202.46332 47.178307 202.46345 47.178268 202.46383 47.178258 202.46406 47.178348 202.46412 47.178368 202.46451 47.178409 202.46463 47.178645 202.46465 47.17872 202.46262 47.17745 202.46244 47.177639 202.46201 47.17765 202.46209 47.177417 202.46234 47.177274 202.46264 47.177186 202.46262 47.17745 202.49787 47.19978 202.49764 47.199933 202.49741 47.199968 202.49711 47.19986 202.49697 47.199639 202.49692 47.199486 202.49688 47.19938 202.49694 47.199195 202.49717 47.199171 202.49738 47.199335 202.49744 47.199511 202.49749 47.199583 202.49765 47.199638 202.49779 47.199683 202.49787 47.19978 202.49051 47.195179 202.4903 47.195138 202.49027 47.195029 202.49049 47.194991 202.49051 47.195179 202.47658 47.186475 202.47659 47.18672 202.47686 47.186651 202.47694 47.186465 202.47658 47.186475 202.47014 47.18245 202.47004 47.182452 202.47006 47.182402 202.47011 47.182401 202.47014 47.18245 202.46504 47.179262 202.46466 47.179273 202.46464 47.179012 202.465 47.179024 202.46504 47.179262 202.50201 47.202664 202.50199 47.202767 202.50217 47.202761 202.50213 47.20266 202.50201 47.202664 202.50045 47.201691 202.50036 47.201694 202.50015 47.201522 202.50011 47.201479 202.50021 47.201476 202.50043 47.201642 202.50045 47.201691 202.49782 47.200347 202.49775 47.200366 202.49751 47.200217 202.49751 47.200153 202.49758 47.200165 202.49782 47.200314 202.49782 47.200347 202.49527 47.198752 202.49528 47.198938 202.49529 47.199063 202.49533 47.199227 202.49531 47.199378 202.49536 47.199527 202.49541 47.19974 202.49539 47.199835 202.49534 47.199991 202.49515 47.200007 202.49485 47.199984 202.49468 47.200033 202.49453 47.200085 202.49419 47.20007 202.4942 47.19988 202.4945 47.199769 202.4944 47.199588 202.49444 47.199429 202.49443 47.199244 202.49408 47.199207 202.49389 47.199385 202.49379 47.199388 202.49379 47.199322 202.49368 47.199141 202.49349 47.198959 202.49315 47.198922 202.4931 47.198924 202.49268 47.198931 202.49265 47.198932 202.49263 47.198896 202.49283 47.198726 202.4927 47.198566 202.49247 47.198413 202.49226 47.198371 202.49208 47.198376 202.4919 47.198179 202.4919 47.198145 202.49182 47.197916 202.49162 47.197735 202.49165 47.197685 202.49156 47.197455 202.49122 47.197419 202.49118 47.197414 202.49117 47.197387 202.49116 47.197104 202.49116 47.197084 202.49107 47.196841 202.49108 47.196735 202.49124 47.19672 202.4914 47.196921 202.49141 47.19694 202.49143 47.197229 202.49174 47.197324 202.49201 47.197317 202.49224 47.197162 202.49236 47.197195 202.49252 47.197334 202.49256 47.197365 202.49264 47.197412 202.49285 47.197478 202.49321 47.197468 202.49328 47.197488 202.49329 47.197516 202.49319 47.197752 202.49311 47.197939 202.49311 47.198005 202.49322 47.198186 202.49345 47.198335 202.49373 47.198389 202.49397 47.198242 202.49402 47.198241 202.49426 47.19839 202.49461 47.198456 202.49489 47.198573 202.49503 47.198602 202.4953 47.198597 202.49527 47.198752 202.47444 47.185735 202.47441 47.185732 202.4744 47.185712 202.47443 47.185711 202.47444 47.185735 202.46498 47.179825 202.46467 47.179927 202.46445 47.180088 202.46443 47.180089 202.46442 47.18007 202.46464 47.179907 202.46475 47.179679 202.465 47.179672 202.46498 47.179825 202.50097 47.202612 202.5011 47.202772 202.50107 47.202974 202.50078 47.203011 202.50053 47.202936 202.50031 47.203098 202.50024 47.203084 202.50001 47.202929 202.49997 47.202886 202.50005 47.2029 202.50045 47.202888 202.50044 47.20261 202.50018 47.202478 202.50021 47.202434 202.50027 47.20241 202.50048 47.202576 202.50089 47.202564 202.50097 47.202546 202.50097 47.202612 202.50025 47.202165 202.50019 47.202144 202.50019 47.202122 202.50025 47.202098 202.50025 47.202165 202.49669 47.199936 202.49659 47.199919 202.4966 47.199884 202.49665 47.199876 202.49669 47.199936 202.4671 47.181448 202.46699 47.181451 202.46679 47.181279 202.46677 47.181244 202.46686 47.181222 202.46713 47.18135 202.4671 47.181448 202.46209 47.178314 202.46204 47.178584 202.46188 47.178721 202.46189 47.178787 202.46199 47.178968 202.46214 47.178944 202.46213 47.178862 202.46212 47.178633 202.46237 47.17849 202.46245 47.178304 202.46209 47.178314 202.49667 47.200224 202.49663 47.200215 202.49662 47.200193 202.49669 47.200174 202.49667 47.200224 202.47487 47.186605 202.47485 47.186708 202.47503 47.186703 202.47502 47.186581 202.47487 47.186605 202.5011 47.203293 202.50082 47.203301 202.50081 47.203112 202.50105 47.203137 202.5011 47.203293 202.49072 47.196807 202.49068 47.196805 202.49064 47.196759 202.49071 47.196783 202.49072 47.196807 202.46663 47.181754 202.46656 47.181769 202.46656 47.181707 202.46664 47.181712 202.46663 47.181754 202.46566 47.181149 202.46565 47.181146 202.46564 47.181136 202.46566 47.181136 202.46566 47.181149 202.501 47.203529 202.50081 47.203707 202.50071 47.20371 202.50035 47.20372 202.50028 47.2037 202.50025 47.203657 202.50023 47.203412 202.50025 47.203362 202.50033 47.203343 202.50065 47.203428 202.50093 47.203482 202.50102 47.203479 202.501 47.203529 202.49816 47.201757 202.49807 47.20176 202.49777 47.201653 202.49773 47.201489 202.49803 47.201463 202.49824 47.201633 202.49816 47.201757 202.46119 47.178651 202.46134 47.178794 202.46133 47.179035 202.46097 47.179108 202.46082 47.179315 202.4609 47.179451 202.46094 47.179692 202.46081 47.179843 202.46101 47.180017 202.46142 47.180039 202.4615 47.180042 202.46151 47.179971 202.46143 47.179708 202.4614 47.179678 202.46137 47.179425 202.46139 47.179375 202.46161 47.179213 202.46159 47.178935 202.46157 47.178886 202.46139 47.178763 202.46119 47.178651 202.49675 47.20117 202.49667 47.201166 202.49666 47.201114 202.49674 47.201111 202.49675 47.20117 202.49575 47.200547 202.49574 47.200547 202.49537 47.200498 202.49538 47.20032 202.49562 47.200313 202.49575 47.200544 202.49575 47.200547 202.47752 47.189159 202.47758 47.189243 202.47771 47.189276 202.4777 47.189154 202.47752 47.189159 202.47399 47.186952 202.47395 47.187045 202.47413 47.18704 202.47421 47.186854 202.47399 47.186952 202.49966 47.203287 202.49952 47.203291 202.49953 47.203209 202.49963 47.203206 202.49966 47.203287 202.49343 47.199398 202.49336 47.199384 202.49335 47.199351 202.49343 47.199332 202.49343 47.199398 202.49005 47.197287 202.49003 47.197283 202.49003 47.197277 202.49004 47.197276 202.49005 47.197287 202.47042 47.185017 202.47042 47.185099 202.47057 47.185115 202.47056 47.184993 202.47042 47.185017 202.46532 47.181833 202.46515 47.181838 202.46514 47.18172 202.46528 47.18174 202.46532 47.181833 202.49295 47.199396 202.49275 47.199574 202.49269 47.199553 202.49268 47.199526 202.49267 47.199243 202.49266 47.199219 202.4927 47.199218 202.49294 47.199363 202.49295 47.199396 202.49175 47.19865 202.4917 47.198652 202.4913 47.198663 202.49122 47.198682 202.49124 47.198632 202.49146 47.19847 202.49151 47.198468 202.49175 47.198617 202.49175 47.19865 202.48693 47.195639 202.48678 47.195781 202.48702 47.195693 202.48713 47.195526 202.48693 47.195639 202.46825 47.183961 202.46825 47.184099 202.46845 47.184085 202.46839 47.183998 202.46825 47.183961 202.46586 47.182469 202.46566 47.182438 202.46567 47.182351 202.46577 47.182357 202.46586 47.182469 202.49343 47.2 202.4934 47.200001 202.49339 47.199973 202.49344 47.199972 202.49343 47.2 202.4889 47.197168 202.48884 47.197192 202.48886 47.197141 202.4889 47.197146 202.4889 47.197168 202.46971 47.185173 202.46963 47.185359 202.46985 47.185261 202.46989 47.185168 202.46971 47.185173 202.4689 47.184667 202.46891 47.184912 202.46918 47.184843 202.46917 47.18472 202.4689 47.184667 202.48566 47.195442 202.48567 47.195627 202.48591 47.195776 202.48618 47.195769 202.48617 47.195583 202.48593 47.195434 202.48566 47.195442 202.46192 47.180603 202.46189 47.180665 202.462 47.180652 202.46201 47.18058 202.46192 47.180603 202.50016 47.2048 202.50009 47.204819 202.50012 47.204774 202.50015 47.204773 202.50016 47.2048 202.49341 47.200584 202.49307 47.200569 202.49282 47.200427 202.49283 47.200218 202.49313 47.200198 202.49336 47.200355 202.49341 47.200584 202.48959 47.198197 202.48921 47.198218 202.48912 47.197959 202.48912 47.1979 202.4892 47.197898 202.48959 47.197937 202.48959 47.198197 202.46837 47.184933 202.46835 47.185002 202.46837 47.185231 202.46825 47.185398 202.46849 47.18531 202.46886 47.185242 202.46884 47.184964 202.46858 47.184832 202.46837 47.184933 202.46431 47.182397 202.46395 47.182469 202.46388 47.182449 202.46388 47.18243 202.46387 47.182133 202.46387 47.182122 202.46389 47.182114 202.46426 47.182166 202.46431 47.182397 202.49248 47.200299 202.49209 47.200317 202.49197 47.200086 202.49182 47.199888 202.49214 47.199954 202.49246 47.200045 202.49248 47.200299 202.47778 47.191116 202.47788 47.191298 202.47816 47.191351 202.47801 47.191202 202.47778 47.191116 202.46577 47.183606 202.46538 47.183665 202.46531 47.183667 202.46531 47.183622 202.46541 47.183386 202.46573 47.183359 202.46577 47.183606 202.49451 47.201868 202.49439 47.201871 202.4944 47.2018 202.49451 47.201788 202.49451 47.201868 202.49358 47.201285 202.49337 47.201324 202.49334 47.201134 202.49359 47.201161 202.49358 47.201285 202.46152 47.181252 202.4614 47.181354 202.46174 47.181391 202.46163 47.181185 202.46152 47.181252 202.49823 47.204492 202.49791 47.204476 202.49784 47.204245 202.4982 47.204266 202.49823 47.204492 202.50239 47.207386 202.50232 47.207405 202.5021 47.207503 202.50173 47.207514 202.50162 47.207269 202.50162 47.207203 202.50171 47.2072 202.50207 47.20719 202.50217 47.207187 202.50241 47.207336 202.50239 47.207386 202.49728 47.204194 202.49698 47.204192 202.49693 47.203976 202.49726 47.20398 202.49728 47.204194 202.50078 47.20668 202.50058 47.206732 202.50057 47.206552 202.50077 47.206593 202.50078 47.20668 202.49954 47.205904 202.4995 47.20591 202.4995 47.205883 202.49954 47.205876 202.49954 47.205904 202.49606 47.203735 202.49578 47.203775 202.49556 47.203721 202.49547 47.203961 202.49549 47.20399 202.49544 47.204245 202.49513 47.204254 202.49496 47.204054 202.4949 47.203907 202.49508 47.203719 202.49536 47.203597 202.49553 47.203399 202.49584 47.203405 202.49604 47.203583 202.49606 47.203735 202.48935 47.199844 202.48918 47.199865 202.48883 47.199804 202.48881 47.199506 202.48925 47.199488 202.48935 47.199743 202.48935 47.199844 202.45896 47.180844 202.45881 47.18099 202.45914 47.181074 202.45923 47.181014 202.45939 47.180886 202.45903 47.180832 202.45896 47.180844 202.50154 47.207753 202.5014 47.207757 202.50132 47.207617 202.5016 47.207609 202.50154 47.207753 202.50032 47.206994 202.50025 47.20698 202.50025 47.206947 202.50032 47.206928 202.50032 47.206994 202.49577 47.204152 202.4957 47.204158 202.49558 47.204034 202.49578 47.204103 202.49577 47.204152 202.49178 47.201659 202.49157 47.201682 202.4916 47.201546 202.49175 47.20155 202.49178 47.201659 202.46635 47.185766 202.46631 47.18586 202.46625 47.186003 202.46627 47.186216 202.46664 47.186245 202.46682 47.186062 202.46681 47.185817 202.46657 47.185668 202.46635 47.185766 202.5023 47.208526 202.50214 47.208515 202.50206 47.208376 202.50233 47.208368 202.5023 47.208526 202.50082 47.207603 202.50072 47.207606 202.50072 47.20754 202.50079 47.207555 202.50082 47.207603 202.49946 47.206753 202.49923 47.206758 202.49926 47.20663 202.49945 47.206595 202.49946 47.206753 202.49626 47.205056 202.49607 47.205233 202.49601 47.205231 202.49593 47.20515 202.49625 47.205048 202.49626 47.205046 202.49626 47.205056 202.49586 47.204807 202.4957 47.204812 202.4957 47.204707 202.49584 47.204709 202.49586 47.204807 202.49083 47.201662 202.49071 47.201665 202.4907 47.201585 202.49082 47.201582 202.49083 47.201662 202.50205 47.208971 202.50207 47.209216 202.50207 47.209282 202.50217 47.209463 202.50207 47.209583 202.50183 47.209729 202.50161 47.20989 202.50141 47.210066 202.50117 47.210214 202.501 47.210409 202.50083 47.210454 202.50076 47.210258 202.50111 47.210178 202.5011 47.209933 202.50088 47.209767 202.50051 47.209713 202.50033 47.20969 202.50012 47.209677 202.50013 47.209566 202.50005 47.209403 202.50003 47.209201 202.50038 47.209161 202.50051 47.209204 202.50072 47.209037 202.50103 47.208934 202.50125 47.208772 202.50135 47.208769 202.50171 47.208759 202.50178 47.208779 202.50205 47.208905 202.50205 47.208971 202.46334 47.184784 202.46299 47.184737 202.46287 47.184496 202.46285 47.184479 202.4629 47.184478 202.46331 47.184495 202.46334 47.184784 202.49366 47.204032 202.49342 47.204179 202.49304 47.204176 202.49302 47.203929 202.4932 47.203741 202.49364 47.203729 202.49366 47.204032 202.4894 47.201367 202.48935 47.201369 202.48932 47.20132 202.48938 47.201343 202.4894 47.201367 202.49715 47.206511 202.49694 47.206496 202.49665 47.20639 202.49666 47.206204 202.49691 47.206196 202.49712 47.206368 202.49715 47.206511 202.4902 47.20217 202.49005 47.202149 202.49005 47.202074 202.4902 47.202044 202.4902 47.20217 202.4892 47.201841 202.48916 47.201836 202.48886 47.201732 202.48885 47.201623 202.48901 47.201619 202.4892 47.201807 202.4892 47.201841 202.49675 47.206854 202.49637 47.20692 202.49637 47.206919 202.49637 47.206917 202.4965 47.2067 202.49668 47.206688 202.49675 47.206854 202.49823 47.208081 202.49793 47.208193 202.49764 47.208254 202.49771 47.208055 202.49788 47.207864 202.49818 47.207855 202.49823 47.208081 202.49433 47.205643 202.49426 47.205877 202.49427 47.205904 202.49423 47.2059 202.49394 47.205784 202.4939 47.205672 202.4938 47.205567 202.49381 47.205318 202.49415 47.205309 202.49431 47.205515 202.49433 47.205643 202.50029 47.209961 202.50012 47.210006 202.50017 47.209889 202.5003 47.20987 202.50029 47.209961 202.49316 47.205511 202.49298 47.205516 202.49299 47.205405 202.49315 47.205392 202.49316 47.205511 202.49859 47.209502 202.49829 47.209614 202.49802 47.209605 202.49803 47.209448 202.49809 47.209228 202.49809 47.209186 202.49814 47.209191 202.49857 47.209201 202.49859 47.209502 202.48227 47.19931 202.48204 47.199285 202.48203 47.19916 202.48222 47.199154 202.48227 47.19931 202.49492 47.207509 202.49472 47.207681 202.49443 47.207698 202.49442 47.207497 202.49469 47.207364 202.49491 47.207346 202.49492 47.207509 202.48543 47.201579 202.48546 47.201639 202.48568 47.201735 202.4855 47.201607 202.48543 47.201579 202.49978 47.210841 202.49941 47.210852 202.49942 47.210616 202.49979 47.210573 202.49978 47.210841 202.49299 47.206603 202.49283 47.206607 202.49282 47.206497 202.49298 47.206492 202.49299 47.206603 202.48299 47.200353 202.48285 47.200311 202.48284 47.200264 202.48294 47.200249 202.48299 47.200353 202.49843 47.210297 202.49837 47.210323 202.4984 47.210278 202.49844 47.210272 202.49843 47.210297 202.48818 47.203896 202.48811 47.203914 202.4881 47.203848 202.48817 47.203868 202.48818 47.203896 202.48748 47.20376 202.48743 47.203761 202.48744 47.203733 202.4875 47.20371 202.48748 47.20376 202.49717 47.210109 202.4969 47.210107 202.49689 47.209934 202.49718 47.209899 202.49717 47.210109 202.4887 47.205122 202.48866 47.205129 202.48866 47.205096 202.48871 47.205094 202.4887 47.205122 202.48266 47.201344 202.48266 47.201428 202.48279 47.201662 202.48276 47.201707 202.48269 47.201731 202.48246 47.201819 202.48212 47.201908 202.48186 47.202044 202.48182 47.202051 202.48182 47.202018 202.48192 47.201781 202.48185 47.201701 202.4817 47.201487 202.48169 47.201341 202.48161 47.201233 202.48159 47.200978 202.48192 47.200881 202.48209 47.200876 202.4823 47.201048 202.4826 47.201149 202.48266 47.201344 202.49902 47.211864 202.49876 47.212001 202.4989 47.212205 202.49884 47.212347 202.4986 47.212433 202.49834 47.212335 202.4983 47.212329 202.49824 47.212276 202.49839 47.212069 202.49846 47.211879 202.49849 47.211829 202.49856 47.21181 202.49882 47.211741 202.49906 47.211766 202.49902 47.211864 202.48754 47.204693 202.48747 47.204712 202.48726 47.204819 202.48698 47.204943 202.4869 47.205129 202.48691 47.205195 202.48673 47.205386 202.48662 47.205615 202.48662 47.205666 202.48676 47.205883 202.48675 47.205993 202.48648 47.206126 202.48656 47.206356 202.48662 47.206515 202.48634 47.20652 202.48623 47.20657 202.48597 47.206708 202.48565 47.206804 202.48555 47.207041 202.48551 47.207134 202.48547 47.207292 202.48533 47.207504 202.48522 47.207671 202.48519 47.207716 202.48516 47.207717 202.48493 47.207563 202.48453 47.207599 202.48436 47.207791 202.48413 47.207949 202.48397 47.208146 202.48379 47.208337 202.48366 47.208503 202.48363 47.208533 202.4836 47.208547 202.48337 47.208674 202.48328 47.208782 202.48324 47.208891 202.48311 47.209106 202.48286 47.209094 202.48289 47.20897 202.48283 47.208789 202.48256 47.208762 202.48242 47.208766 202.48215 47.20864 202.48182 47.208555 202.48157 47.208417 202.48136 47.208246 202.48141 47.208047 202.48157 47.207848 202.48181 47.207696 202.48207 47.207561 202.48216 47.207335 202.48215 47.207313 202.48219 47.207306 202.4825 47.207228 202.48283 47.207138 202.48292 47.206896 202.48314 47.206734 202.48332 47.206542 202.48353 47.20638 202.48387 47.206396 202.48416 47.206471 202.48435 47.206293 202.48422 47.206133 202.48421 47.205904 202.48432 47.205737 202.48411 47.205562 202.48411 47.205545 202.48425 47.205331 202.48448 47.205293 202.48475 47.205346 202.48501 47.205205 202.48504 47.205205 202.48546 47.205192 202.4855 47.205186 202.48581 47.205107 202.4859 47.204896 202.4859 47.204868 202.48599 47.204621 202.48615 47.204425 202.48655 47.204414 202.48662 47.204686 202.48688 47.204582 202.48717 47.204462 202.48744 47.204409 202.48756 47.204643 202.48754 47.204693 202.48545 47.203388 202.48557 47.203511 202.4858 47.203666 202.48591 47.203673 202.48589 47.203602 202.48574 47.203388 202.48545 47.203388 202.49687 47.210823 202.49681 47.210824 202.49681 47.21078 202.49687 47.210778 202.49687 47.210823 202.48944 47.206179 202.48913 47.206288 202.48886 47.206284 202.48878 47.206066 202.48902 47.205915 202.48932 47.205949 202.48944 47.206179 202.48281 47.202039 202.48271 47.202042 202.48271 47.201976 202.48278 47.201996 202.48281 47.202039 202.48139 47.201448 202.48133 47.201435 202.48132 47.201408 202.48138 47.201399 202.48139 47.201448 202.49641 47.211133 202.49639 47.211137 202.49638 47.21111 202.49642 47.211114 202.49641 47.211133 202.4881 47.205941 202.48803 47.205926 202.48802 47.205893 202.4881 47.205875 202.4881 47.205941 202.49488 47.210476 202.49461 47.210495 202.4946 47.2103 202.49489 47.210293 202.49488 47.210476 202.48287 47.202974 202.48277 47.203213 202.4828 47.203278 202.48279 47.203519 202.48278 47.203621 202.48293 47.203835 202.48297 47.203935 202.48302 47.204096 202.48322 47.204269 202.48328 47.204425 202.48293 47.204507 202.48275 47.204691 202.48261 47.204903 202.48228 47.204999 202.48209 47.205177 202.48183 47.205318 202.48177 47.205342 202.48141 47.205352 202.48154 47.205512 202.48151 47.205714 202.4813 47.205883 202.48104 47.206016 202.48087 47.206005 202.48069 47.205818 202.48068 47.205791 202.48066 47.205513 202.48063 47.205464 202.48073 47.205461 202.481 47.205392 202.48107 47.205206 202.48107 47.20514 202.48127 47.204964 202.48147 47.204911 202.48175 47.204965 202.48167 47.204762 202.48173 47.204655 202.48186 47.204436 202.4818 47.204342 202.48187 47.204143 202.482 47.203924 202.48202 47.203858 202.48205 47.203656 202.48214 47.203444 202.48173 47.203456 202.48168 47.203458 202.48145 47.2033 202.48145 47.203283 202.48155 47.203049 202.48164 47.202835 202.48165 47.202807 202.48171 47.202784 202.48198 47.202715 202.48232 47.202627 202.48236 47.202631 202.48239 47.202674 202.48249 47.202856 202.48268 47.202855 202.48288 47.202895 202.48287 47.202974 202.49792 47.212673 202.49778 47.212708 202.49773 47.212552 202.49794 47.212593 202.49792 47.212673 202.49585 47.21198 202.49568 47.211985 202.49569 47.211877 202.49583 47.211874 202.49585 47.21198 202.48423 47.205021 202.484 47.204996 202.48402 47.204886 202.48418 47.204865 202.48423 47.205021 202.48342 47.204811 202.48334 47.204829 202.48337 47.204784 202.48341 47.204778 202.48342 47.204811 202.49566 47.212756 202.49545 47.212801 202.4955 47.212659 202.49565 47.212655 202.49566 47.212756 202.4808 47.203474 202.48076 47.203484 202.48077 47.203458 202.4808 47.203458 202.4808 47.203474 202.49592 47.213215 202.49573 47.213245 202.49578 47.213133 202.49594 47.21309 202.49592 47.213215 202.48214 47.204609 202.48215 47.204736 202.4823 47.204711 202.48232 47.204608 202.48214 47.204609 202.48122 47.204637 202.48102 47.204596 202.48099 47.204491 202.48116 47.204488 202.48122 47.204637 202.48063 47.204267 202.48071 47.204496 202.4807 47.204607 202.48049 47.20466 202.48031 47.204665 202.48003 47.204673 202.48007 47.204515 202.48029 47.204353 202.48028 47.204167 202.48029 47.204057 202.48046 47.204036 202.48063 47.204234 202.48063 47.204267 202.48079 47.204964 202.48051 47.204971 202.4805 47.204783 202.48071 47.204824 202.48079 47.204964 202.4943 47.213701 202.4942 47.213725 202.49424 47.213663 202.4943 47.213658 202.4943 47.213701 202.48081 47.205275 202.48053 47.205283 202.48052 47.205094 202.4808 47.205086 202.48081 47.205275 202.48213 47.206398 202.48191 47.20656 202.48177 47.206772 202.48162 47.206752 202.48138 47.206604 202.48134 47.206505 202.48156 47.206343 202.48172 47.206354 202.4821 47.206379 202.48214 47.206373 202.48213 47.206398 202.48035 47.205288 202.48039 47.205388 202.48036 47.205592 202.48011 47.205734 202.47981 47.205846 202.47974 47.206106 202.47947 47.206236 202.47914 47.20633 202.47901 47.206544 202.47889 47.206493 202.47889 47.206471 202.47882 47.206219 202.47883 47.206134 202.47877 47.205931 202.47876 47.205793 202.47895 47.205608 202.47925 47.205574 202.47945 47.205625 202.47967 47.205461 202.47981 47.20525 202.47981 47.205164 202.47984 47.20497 202.48012 47.204933 202.48034 47.205099 202.48035 47.205288 202.49475 47.214878 202.49439 47.214888 202.49433 47.21462 202.49472 47.214647 202.49475 47.214878 202.49209 47.213821 202.49187 47.21382 202.49185 47.213671 202.49208 47.213665 202.49209 47.213821 202.48053 47.206599 202.48059 47.206863 202.48064 47.206963 202.48051 47.207184 202.48027 47.207331 202.48005 47.207493 202.47974 47.207597 202.47945 47.207719 202.47943 47.207724 202.47906 47.207771 202.47879 47.207904 202.47875 47.207899 202.47832 47.207911 202.47828 47.207918 202.47828 47.207885 202.47845 47.207694 202.47866 47.207641 202.47884 47.207635 202.47883 47.207513 202.47891 47.207378 202.47917 47.207245 202.47931 47.20703 202.47936 47.206796 202.47928 47.206716 202.47943 47.206745 202.47967 47.206656 202.47978 47.206489 202.4798 47.206439 202.47985 47.206438 202.48026 47.206426 202.48033 47.206408 202.48053 47.206582 202.48053 47.206599 202.49416 47.215413 202.4941 47.215432 202.49404 47.215337 202.49418 47.215371 202.49416 47.215413 202.48416 47.209465 202.48409 47.209484 202.48411 47.209434 202.48416 47.209432 202.48416 47.209465 202.48457 47.21002 202.48455 47.210123 202.48451 47.210281 202.48429 47.210316 202.48417 47.210366 202.48418 47.210393 202.4844 47.21056 202.48463 47.21071 202.48467 47.210979 202.48435 47.211076 202.48406 47.211199 202.48399 47.211182 202.48364 47.211116 202.48334 47.211047 202.48327 47.211066 202.48306 47.210899 202.48303 47.210851 202.4829 47.210692 202.48265 47.210549 202.4826 47.210283 202.4826 47.210261 202.48254 47.209979 202.48251 47.20993 202.48241 47.209749 202.48226 47.209774 202.48227 47.209855 202.48224 47.210057 202.48221 47.210221 202.48222 47.210346 202.48199 47.210384 202.48181 47.210389 202.48153 47.210397 202.48152 47.210209 202.4816 47.210022 202.48124 47.210033 202.48115 47.210273 202.48117 47.21034 202.48139 47.210504 202.48163 47.210579 202.48173 47.210576 202.48174 47.210642 202.48152 47.210804 202.48153 47.211049 202.48151 47.211099 202.48132 47.211277 202.48122 47.21128 202.48086 47.21129 202.48078 47.211276 202.48037 47.211287 202.48039 47.211566 202.48039 47.211599 202.4802 47.211777 202.47998 47.211939 202.47974 47.212085 202.47992 47.212242 202.48007 47.212296 202.48029 47.212289 202.48029 47.212434 202.48015 47.212641 202.47977 47.212702 202.47973 47.212709 202.47972 47.212676 202.47954 47.212519 202.47948 47.212525 202.47909 47.212528 202.47893 47.21232 202.47887 47.212145 202.47918 47.212136 202.47944 47.2122 202.47943 47.211954 202.47916 47.212023 202.47888 47.212031 202.47887 47.211843 202.47886 47.21172 202.47856 47.21165 202.47853 47.211642 202.47828 47.211499 202.47827 47.21147 202.47832 47.211198 202.47831 47.211149 202.47807 47.211 202.47806 47.210738 202.47804 47.210701 202.47779 47.210559 202.47763 47.210354 202.4774 47.210327 202.47719 47.210495 202.47706 47.210711 202.47686 47.210886 202.47651 47.210858 202.47635 47.210644 202.47601 47.210654 202.47598 47.21092 202.476 47.210949 202.47617 47.211107 202.47615 47.211342 202.47579 47.211383 202.47567 47.211343 202.47544 47.211318 202.47539 47.211162 202.47546 47.210976 202.47511 47.210912 202.47499 47.210916 202.47462 47.210983 202.47447 47.21119 202.47442 47.211424 202.47483 47.211412 202.47488 47.211411 202.47511 47.21156 202.47511 47.211588 202.47518 47.211839 202.4755 47.21183 202.47576 47.211697 202.4758 47.211704 202.47616 47.211764 202.47631 47.211739 202.47668 47.211671 202.47666 47.211393 202.47667 47.211365 202.47689 47.211203 202.47694 47.211191 202.47718 47.211087 202.47743 47.210942 202.47774 47.210839 202.47794 47.210776 202.47795 47.210969 202.47787 47.211153 202.47784 47.211198 202.4777 47.21141 202.47757 47.211631 202.47755 47.211711 202.47777 47.211874 202.47778 47.212063 202.47745 47.21215 202.47741 47.212143 202.47697 47.212155 202.47699 47.21245 202.47703 47.21249 202.47716 47.21265 202.47718 47.21288 202.47684 47.212889 202.47672 47.212893 202.47634 47.212955 202.47625 47.213197 202.47617 47.213384 202.47614 47.213426 202.47608 47.213452 202.47584 47.213542 202.47567 47.213734 202.47542 47.213878 202.47506 47.213881 202.47485 47.213706 202.47482 47.213504 202.47496 47.213303 202.47496 47.213289 202.47511 47.213088 202.47507 47.212893 202.47473 47.212845 202.47469 47.212846 202.47436 47.212914 202.47421 47.21312 202.47399 47.213282 202.47396 47.213385 202.47408 47.213624 202.47408 47.213637 202.47405 47.213648 202.4737 47.213581 202.47352 47.213586 202.47324 47.213594 202.47297 47.213541 202.47289 47.213791 202.47285 47.213884 202.47286 47.214073 202.47278 47.214259 202.47279 47.214325 202.47262 47.214524 202.47235 47.214577 202.47223 47.214341 202.47196 47.21441 202.47165 47.214513 202.47155 47.214516 202.47119 47.214526 202.47094 47.214667 202.47087 47.214691 202.47087 47.214625 202.47112 47.214479 202.4711 47.214201 202.47107 47.214152 202.47092 47.214006 202.47084 47.214005 202.47045 47.214063 202.47035 47.2143 202.47027 47.214486 202.47051 47.214635 202.47051 47.214701 202.47042 47.214704 202.47015 47.214773 202.46994 47.214732 202.46961 47.214648 202.46953 47.214686 202.46919 47.214775 202.46893 47.214828 202.46891 47.214599 202.46886 47.214552 202.46866 47.214442 202.46857 47.214445 202.4683 47.214514 202.46796 47.214601 202.46773 47.214755 202.4677 47.214756 202.46769 47.214732 202.46761 47.214502 202.46737 47.214353 202.46702 47.214316 202.46698 47.214312 202.46667 47.214217 202.46666 47.214091 202.46697 47.213981 202.46703 47.213955 202.46724 47.214121 202.46758 47.214065 202.46786 47.213941 202.46799 47.213893 202.46817 47.213833 202.46821 47.213734 202.46826 47.213594 202.46822 47.2134 202.46818 47.213245 202.46843 47.2131 202.4687 47.212972 202.4686 47.212791 202.46847 47.212828 202.4682 47.212953 202.46803 47.213146 202.46777 47.213288 202.4675 47.213418 202.46728 47.213576 202.46705 47.213614 202.46694 47.213666 202.46652 47.213678 202.46644 47.213652 202.46607 47.21372 202.466 47.213738 202.46576 47.213827 202.46552 47.213766 202.46541 47.213607 202.46539 47.213536 202.46531 47.213544 202.46503 47.213477 202.46478 47.213333 202.46449 47.213224 202.4642 47.213115 202.46396 47.212968 202.46376 47.212786 202.46359 47.212587 202.46337 47.212424 202.46316 47.212257 202.46313 47.212185 202.46328 47.21217 202.46363 47.212232 202.46367 47.212218 202.46368 47.212194 202.4638 47.212005 202.46391 47.211771 202.46403 47.21161 202.46403 47.211546 202.46423 47.211375 202.46435 47.211378 202.46464 47.211492 202.46464 47.211632 202.46434 47.211742 202.46448 47.211934 202.4646 47.21217 202.46484 47.212056 202.46521 47.211985 202.46537 47.211928 202.46564 47.212047 202.46585 47.212088 202.46599 47.212115 202.46627 47.212239 202.46645 47.212163 202.46666 47.211994 202.467 47.212021 202.46725 47.212164 202.46742 47.212168 202.46737 47.212074 202.46742 47.211872 202.46768 47.211848 202.46783 47.212062 202.46779 47.212104 202.46781 47.212399 202.46809 47.212517 202.46848 47.212535 202.46852 47.212526 202.46886 47.21247 202.46903 47.212278 202.46911 47.212092 202.46913 47.212041 202.46918 47.21204 202.46959 47.212028 202.46963 47.212033 202.46964 47.21206 202.4696 47.212332 202.46957 47.2124 202.46952 47.212581 202.46925 47.212635 202.4691 47.212621 202.46902 47.212807 202.46902 47.212873 202.46918 47.213016 202.46926 47.21302 202.46957 47.212917 202.4698 47.212879 202.47008 47.212933 202.47014 47.212953 202.47051 47.212907 202.47064 47.212912 202.47093 47.212869 202.47109 47.212667 202.47111 47.212564 202.47115 47.212405 202.47145 47.212295 202.47151 47.212269 202.47173 47.212171 202.4721 47.212161 202.47233 47.212246 202.4724 47.21226 202.47271 47.212182 202.47273 47.212019 202.47251 47.211853 202.47249 47.211744 202.47254 47.21151 202.4723 47.211361 202.47208 47.211491 202.47168 47.211496 202.47158 47.211477 202.47128 47.211592 202.47101 47.211662 202.47087 47.211635 202.47064 47.21161 202.47059 47.211455 202.47055 47.211353 202.47043 47.211357 202.47021 47.211518 202.46991 47.211497 202.46967 47.211482 202.46951 47.211471 202.46929 47.211307 202.46932 47.211265 202.46955 47.211105 202.4696 47.211076 202.4698 47.210963 202.47021 47.210952 202.47033 47.210994 202.47055 47.210836 202.47083 47.210819 202.47093 47.210775 202.47134 47.210732 202.47156 47.21057 202.47161 47.210568 202.47196 47.210635 202.47202 47.210852 202.47206 47.210889 202.47229 47.211044 202.47249 47.21115 202.47257 47.211165 202.47286 47.211079 202.47317 47.211043 202.47341 47.211124 202.47351 47.210889 202.47373 47.210727 202.47411 47.210662 202.47416 47.210635 202.47417 47.210701 202.47431 47.210856 202.47454 47.210936 202.47464 47.210696 202.47498 47.210612 202.47508 47.210371 202.47542 47.210362 202.47562 47.210532 202.47581 47.210527 202.4758 47.210405 202.47565 47.210192 202.47568 47.210149 202.47584 47.20995 202.47599 47.209743 202.47595 47.209641 202.47594 47.209412 202.47596 47.209309 202.476 47.20915 202.47618 47.209145 202.47653 47.209182 202.47672 47.209004 202.4768 47.208754 202.47679 47.208692 202.47682 47.208467 202.47712 47.208355 202.47738 47.208222 202.47761 47.208065 202.47765 47.208059 202.47796 47.20816 202.47829 47.208238 202.47835 47.20823 202.47862 47.208097 202.47895 47.208074 202.47898 47.208323 202.47876 47.208481 202.47868 47.208597 202.47866 47.208718 202.47854 47.208945 202.47845 47.209099 202.47841 47.209165 202.47819 47.209324 202.47815 47.209316 202.47774 47.209293 202.47762 47.209266 202.4774 47.20943 202.47739 47.209555 202.47744 47.209753 202.47748 47.20981 202.4776 47.210046 202.47787 47.210024 202.47818 47.209915 202.47812 47.209664 202.47815 47.209595 202.47825 47.209573 202.47851 47.209523 202.47874 47.209534 202.47882 47.209716 202.47882 47.209797 202.47899 47.210001 202.4792 47.209954 202.47943 47.209798 202.47977 47.209751 202.47999 47.20991 202.4801 47.209917 202.4803 47.209745 202.48057 47.209612 202.48056 47.20949 202.48055 47.209301 202.48051 47.2092 202.48057 47.209014 202.4808 47.208863 202.48101 47.208829 202.48129 47.208948 202.48131 47.209177 202.48131 47.209259 202.48146 47.209275 202.4817 47.2093 202.48204 47.209337 202.48227 47.209182 202.4823 47.209179 202.48256 47.209317 202.48258 47.209371 202.48268 47.209552 202.48295 47.209606 202.48302 47.209626 202.48344 47.209614 202.48348 47.209613 202.48383 47.209675 202.48402 47.209672 202.48424 47.209697 202.48452 47.20982 202.48457 47.21002 202.48059 47.207533 202.48065 47.207796 202.48074 47.207926 202.48043 47.20803 202.48017 47.208171 202.48011 47.208194 202.48011 47.208128 202.48036 47.207987 202.48034 47.207698 202.48033 47.207671 202.48055 47.207509 202.48059 47.207516 202.48059 47.207533 202.47797 47.205893 202.47775 47.206055 202.47769 47.206081 202.47772 47.206036 202.47794 47.205874 202.47796 47.205876 202.47797 47.205893 202.48635 47.21143 202.48631 47.21142 202.48627 47.211382 202.48637 47.211379 202.48635 47.21143 202.48555 47.210931 202.48526 47.210897 202.48523 47.210727 202.4855 47.210719 202.48555 47.210931 202.48898 47.213369 202.48896 47.213369 202.48896 47.213357 202.48898 47.213358 202.48898 47.213369 202.48164 47.208788 202.48144 47.208841 202.48121 47.208684 202.4812 47.208512 202.48149 47.208475 202.4817 47.208645 202.48164 47.208788 202.47451 47.204329 202.47433 47.204334 202.47412 47.204389 202.4739 47.204551 202.47378 47.20474 202.47378 47.204773 202.47373 47.204774 202.47332 47.204786 202.47315 47.204978 202.47305 47.205214 202.47281 47.205366 202.47256 47.205509 202.47222 47.205597 202.47215 47.205615 202.47179 47.205625 202.47181 47.20587 202.47215 47.205943 202.47216 47.206156 202.47218 47.206245 202.47227 47.206227 202.47226 47.206188 202.47224 47.205906 202.47253 47.205789 202.47275 47.205626 202.47303 47.205619 202.4733 47.205672 202.47338 47.205687 202.47371 47.205631 202.47394 47.205593 202.47422 47.205646 202.47412 47.205465 202.47415 47.205306 202.47438 47.205268 202.4745 47.205226 202.47464 47.205077 202.47464 47.205011 202.47448 47.204872 202.47441 47.204599 202.47441 47.204566 202.47445 47.204565 202.47469 47.204447 202.47472 47.204371 202.47451 47.204329 202.49018 47.214421 202.49018 47.214421 202.49018 47.21442 202.49018 47.21442 202.49018 47.214421 202.48664 47.212207 202.48656 47.212214 202.48635 47.212044 202.48635 47.212028 202.4864 47.212011 202.48665 47.212147 202.48664 47.212207 202.47761 47.206568 202.47733 47.20669 202.47734 47.206985 202.47738 47.207025 202.47716 47.207187 202.47707 47.20719 202.47706 47.207124 202.47696 47.206943 202.47702 47.206799 202.47729 47.206666 202.47744 47.206462 202.47767 47.206422 202.47761 47.206568 202.47823 47.207255 202.47819 47.207335 202.47813 47.207492 202.47795 47.207514 202.47768 47.20739 202.47767 47.207201 202.47774 47.207015 202.47778 47.206973 202.47781 47.206963 202.47818 47.207016 202.47823 47.207255 202.49197 47.216433 202.49186 47.21643 202.49185 47.216362 202.49195 47.216364 202.49197 47.216433 202.48477 47.211936 202.48475 47.212225 202.48451 47.212377 202.48413 47.212381 202.48398 47.21217 202.48399 47.212053 202.48409 47.211815 202.48434 47.211673 202.4847 47.21164 202.48476 47.211914 202.48477 47.211936 202.48411 47.211527 202.48392 47.211562 202.48398 47.211442 202.48414 47.211403 202.48411 47.211527 202.47972 47.208785 202.47944 47.20891 202.4792 47.20887 202.47919 47.208752 202.47932 47.208535 202.47966 47.208528 202.47972 47.208785 202.48943 47.215148 202.48917 47.215169 202.48917 47.214983 202.48942 47.214983 202.48943 47.215148 202.48339 47.211374 202.48329 47.211377 202.48329 47.211311 202.48336 47.211325 202.48339 47.211374 202.48341 47.211685 202.48333 47.211671 202.48331 47.211622 202.4834 47.211619 202.48341 47.211685 202.48293 47.211387 202.48286 47.211373 202.48283 47.211324 202.48293 47.211321 202.48293 47.211387 202.47702 47.207696 202.47677 47.207734 202.47676 47.207532 202.47701 47.207556 202.47702 47.207696 202.4764 47.20731 202.47603 47.207303 202.47602 47.20707 202.47636 47.20706 202.4764 47.20731 202.48292 47.211683 202.48287 47.211684 202.48287 47.211651 202.48294 47.211632 202.48292 47.211683 202.48437 47.212886 202.48432 47.21289 202.48432 47.212856 202.48437 47.212855 202.48437 47.212886 202.48297 47.212008 202.48286 47.212019 202.48283 47.211926 202.48299 47.211921 202.48297 47.212008 202.47625 47.207811 202.47607 47.207998 202.47582 47.208144 202.47577 47.208145 202.47577 47.208112 202.47575 47.207834 202.47575 47.207801 202.47582 47.207783 202.47621 47.207789 202.47626 47.207788 202.47625 47.207811 202.47664 47.208356 202.47638 47.208346 202.47631 47.208147 202.47658 47.208204 202.47664 47.208356 202.48139 47.211919 202.48116 47.211973 202.48115 47.211771 202.48138 47.211812 202.48139 47.211919 202.4852 47.214598 202.48511 47.214588 202.4851 47.214539 202.48519 47.214529 202.4852 47.214598 202.48101 47.211983 202.48078 47.211931 202.48073 47.211808 202.481 47.21177 202.48101 47.211983 202.47619 47.208975 202.47596 47.208982 202.47598 47.208843 202.47618 47.208817 202.47619 47.208975 202.47362 47.207364 202.47349 47.207554 202.4738 47.207651 202.47394 47.207566 202.47397 47.207527 202.47377 47.207344 202.47362 47.207364 202.47127 47.2062 202.47089 47.206258 202.47084 47.206259 202.4705 47.206315 202.47032 47.206321 202.46997 47.206284 202.4699 47.206302 202.46968 47.206401 202.46931 47.206411 202.46923 47.20642 202.4691 47.206571 202.46908 47.206621 202.46916 47.206851 202.4695 47.206888 202.46954 47.206892 202.46958 47.206935 202.46945 47.207156 202.46924 47.207115 202.46892 47.207124 202.46872 47.207177 202.46844 47.207123 202.46846 47.207368 202.46844 47.207418 202.46836 47.207437 202.46801 47.207371 202.46789 47.207376 202.46755 47.207386 202.46731 47.207311 202.46724 47.207291 202.46723 47.207264 202.46745 47.207102 202.46743 47.206823 202.46717 47.206692 202.46681 47.206702 202.46656 47.206843 202.46637 47.207026 202.46627 47.207029 202.46591 47.207039 202.46601 47.20722 202.46603 47.207409 202.46595 47.207595 202.46632 47.207643 202.4664 47.207911 202.46671 47.208011 202.46676 47.208167 202.46677 47.20829 202.46704 47.208343 202.46714 47.208341 202.46736 47.208507 202.46773 47.208558 202.46797 47.208703 202.46822 47.208778 202.46828 47.208798 202.46871 47.208786 202.46874 47.208785 202.46912 47.20883 202.46925 47.208828 202.46957 47.208725 202.46984 47.208598 202.46987 47.2086 202.46989 47.208624 202.46997 47.208854 202.47021 47.208824 202.47053 47.208729 202.47068 47.208522 202.4709 47.20836 202.47089 47.208175 202.47054 47.208138 202.4705 47.208134 202.47014 47.208075 202.46995 47.207896 202.46991 47.207741 202.46993 47.207582 202.46992 47.207449 202.47007 47.20724 202.47043 47.20721 202.47052 47.207228 202.4709 47.207165 202.47097 47.207141 202.4712 47.207053 202.47118 47.206981 202.47117 47.206732 202.47117 47.206669 202.47119 47.206447 202.47154 47.206389 202.47157 47.206382 202.4716 47.206349 202.4714 47.206167 202.47127 47.2062 202.47378 47.208063 202.47388 47.208242 202.47415 47.208298 202.47414 47.208052 202.47378 47.208063 202.47308 47.207629 202.47294 47.20784 202.47283 47.208046 202.47319 47.208102 202.47337 47.208111 202.47368 47.207999 202.47366 47.207754 202.47345 47.207582 202.47308 47.207629 202.4755 47.20944 202.47533 47.209635 202.47503 47.209669 202.47502 47.209437 202.47533 47.209332 202.47552 47.20931 202.4755 47.20944 202.48069 47.212981 202.4806 47.213221 202.4803 47.213258 202.48033 47.213056 202.48068 47.212972 202.48069 47.212973 202.48069 47.212981 202.4882 47.21827 202.48807 47.218259 202.48806 47.21818 202.48818 47.218177 202.4882 47.21827 202.47163 47.207917 202.47139 47.208065 202.47132 47.208184 202.47147 47.208117 202.4717 47.207963 202.47171 47.207891 202.47163 47.207917 202.47 47.206901 202.46994 47.206925 202.46997 47.20688 202.47 47.206879 202.47 47.206901 202.48031 47.213639 202.48021 47.213649 202.48019 47.213564 202.48033 47.21356 202.48031 47.213639 202.4747 47.210436 202.47442 47.210444 202.47446 47.210285 202.47469 47.210247 202.4747 47.210436 202.47291 47.209318 202.47284 47.209336 202.47284 47.20927 202.4729 47.20929 202.47291 47.209318 202.47946 47.214009 202.47923 47.214047 202.47922 47.213859 202.47946 47.213884 202.47946 47.214009 202.47811 47.213162 202.47792 47.213346 202.47752 47.213395 202.47748 47.21339 202.47747 47.213363 202.47749 47.213077 202.47781 47.212973 202.4781 47.212936 202.47811 47.213162 202.48005 47.214675 202.47966 47.214709 202.47944 47.214543 202.47947 47.214309 202.47975 47.214318 202.48005 47.214421 202.48005 47.214675 202.47909 47.214072 202.47898 47.214239 202.47919 47.214405 202.47922 47.214454 202.47915 47.214434 202.47878 47.214477 202.47851 47.214608 202.47847 47.214609 202.47805 47.214621 202.47797 47.21487 202.47765 47.214892 202.47749 47.214686 202.47751 47.214582 202.4777 47.214401 202.47787 47.214208 202.47812 47.21407 202.47834 47.213905 202.47858 47.213881 202.47878 47.21388 202.47907 47.213843 202.47909 47.214072 202.46969 47.208203 202.46957 47.208424 202.46922 47.208434 202.4692 47.208195 202.4695 47.208086 202.46971 47.208067 202.46969 47.208203 202.48084 47.215469 202.481 47.21567 202.48093 47.215821 202.48079 47.215825 202.48059 47.215913 202.48022 47.215919 202.47995 47.215795 202.47994 47.215506 202.48035 47.215499 202.48039 47.215484 202.48084 47.215465 202.48084 47.215465 202.48084 47.215469 202.47704 47.213097 202.47701 47.213088 202.47697 47.213049 202.47707 47.213046 202.47704 47.213097 202.47924 47.215065 202.47917 47.215073 202.47886 47.214975 202.47888 47.214839 202.47907 47.214816 202.47926 47.215005 202.47924 47.215065 202.47556 47.21277 202.47554 47.212873 202.47555 47.213061 202.47561 47.213147 202.47574 47.213179 202.4757 47.213077 202.47569 47.212848 202.47565 47.21279 202.47556 47.21277 202.4653 47.206359 202.46519 47.206526 202.46546 47.206457 202.46545 47.206334 202.4653 47.206359 202.48604 47.21961 202.48581 47.219604 202.48581 47.21947 202.48605 47.219423 202.48604 47.21961 202.4678 47.208218 202.46772 47.208237 202.46773 47.208176 202.46779 47.208184 202.4678 47.208218 202.47106 47.210555 202.47076 47.210549 202.47063 47.210585 202.47034 47.2107 202.47017 47.210894 202.46984 47.210903 202.46974 47.210653 202.46973 47.210623 202.46984 47.210388 202.4701 47.210381 202.47024 47.21034 202.4705 47.210203 202.47073 47.210244 202.47103 47.21035 202.47106 47.210555 202.46713 47.208096 202.46703 47.208098 202.46705 47.208048 202.46709 47.208052 202.46713 47.208096 202.48657 47.220545 202.48625 47.220577 202.48603 47.220415 202.48599 47.220179 202.48632 47.220203 202.48656 47.220347 202.48657 47.220545 202.46457 47.206795 202.46458 47.206981 202.46485 47.206973 202.4649 47.206739 202.46457 47.206795 202.47861 47.215871 202.47853 47.215871 202.47854 47.215823 202.47859 47.215821 202.47861 47.215871 202.47648 47.214837 202.4764 47.214837 202.47642 47.214798 202.47646 47.214794 202.47648 47.214837 202.46465 47.207448 202.4647 47.207538 202.46484 47.207565 202.46492 47.207379 202.46465 47.207448 202.47608 47.214888 202.4759 47.214887 202.4759 47.214776 202.47604 47.214778 202.47608 47.214888 202.47245 47.21262 202.4726 47.212763 202.47267 47.212757 202.47268 47.212705 202.47245 47.21262 202.47603 47.215156 202.47597 47.215158 202.47595 47.215107 202.47605 47.2151 202.47603 47.215156 202.47481 47.214393 202.4748 47.214395 202.4748 47.214387 202.47481 47.214387 202.47481 47.214393 202.47101 47.212021 202.47079 47.212183 202.47074 47.212184 202.4704 47.212116 202.47027 47.211886 202.47024 47.211837 202.47031 47.211852 202.47068 47.211904 202.47094 47.211975 202.47103 47.211972 202.47101 47.212021 202.48576 47.221532 202.48541 47.221523 202.4854 47.221305 202.48572 47.221296 202.48576 47.221532 202.47373 47.214017 202.4735 47.214055 202.47349 47.213866 202.47376 47.213858 202.47373 47.214017 202.48517 47.221466 202.48502 47.221485 202.485 47.221356 202.48517 47.221376 202.48517 47.221466 202.48021 47.218665 202.48001 47.218676 202.48001 47.218538 202.4802 47.218537 202.48021 47.218665 202.47322 47.214296 202.47315 47.214315 202.47314 47.214249 202.47324 47.214246 202.47322 47.214296 202.47946 47.218497 202.47938 47.218493 202.47939 47.218451 202.47944 47.218447 202.47946 47.218497 202.46453 47.209166 202.46456 47.209267 202.46465 47.209243 202.46465 47.209203 202.46453 47.209166 202.4832 47.221129 202.48298 47.221293 202.48265 47.221286 202.48266 47.221089 202.48286 47.220918 202.4832 47.220877 202.4832 47.221129 202.47255 47.214777 202.47251 47.214784 202.47248 47.214735 202.47255 47.214755 202.47255 47.214777 202.47444 47.216257 202.47416 47.21638 202.47387 47.216384 202.47387 47.2162 202.47403 47.215999 202.47439 47.215999 202.47444 47.216257 202.48396 47.2225 202.4836 47.222532 202.48359 47.222273 202.48392 47.222298 202.48396 47.2225 202.48429 47.223009 202.48428 47.223013 202.48426 47.222989 202.4843 47.222996 202.48429 47.223009 202.4712 47.215127 202.47116 47.215134 202.47116 47.215106 202.47119 47.215105 202.4712 47.215127 202.47158 47.215669 202.47133 47.215653 202.47133 47.215508 202.47154 47.215502 202.47158 47.215669 202.46511 47.211623 202.46485 47.211659 202.46484 47.211453 202.46518 47.211417 202.46511 47.211623 202.46594 47.21244 202.46579 47.212587 202.46598 47.212468 202.46605 47.212395 202.46594 47.21244 202.48235 47.222993 202.4821 47.222993 202.48208 47.222823 202.48234 47.222816 202.48235 47.222993 202.47937 47.221431 202.47937 47.221431 202.47937 47.22143 202.47937 47.22143 202.47937 47.221431 202.47798 47.22056 202.47782 47.220762 202.47762 47.220774 202.47762 47.220634 202.47789 47.220508 202.47797 47.220509 202.47798 47.22056 202.47108 47.216254 202.47096 47.216257 202.47084 47.2161 202.4711 47.216153 202.47108 47.216254 202.48958 47.173657 202.48942 47.173661 202.48941 47.173555 202.48957 47.173549 202.48958 47.173657 202.48113 47.168675 202.48092 47.168845 202.4805 47.168865 202.48025 47.168723 202.48023 47.168415 202.4804 47.168287 202.48045 47.16825 202.48046 47.168248 202.4809 47.168244 202.48111 47.168417 202.48113 47.168675 202.49364 47.17769 202.4932 47.177698 202.49319 47.177413 202.49362 47.177389 202.49364 47.17769 202.49357 47.179442 202.4935 47.179431 202.4935 47.179397 202.49354 47.179398 202.49357 47.179442 202.49506 47.181869 202.49494 47.181941 202.49481 47.182016 202.49442 47.182 202.49445 47.181788 202.49462 47.181595 202.49499 47.181579 202.49506 47.181855 202.49506 47.181869 202.49134 47.179544 202.49105 47.17961 202.49107 47.179375 202.49134 47.179396 202.49134 47.179544 202.48955 47.179028 202.48918 47.179091 202.48932 47.179267 202.48949 47.179287 202.4897 47.17931 202.48998 47.179425 202.49025 47.179554 202.49033 47.179812 202.49007 47.179949 202.49009 47.179997 202.49023 47.18022 202.49024 47.180352 202.49003 47.180522 202.48978 47.180665 202.48961 47.180678 202.48926 47.180609 202.48925 47.180332 202.48963 47.18027 202.48957 47.180057 202.48921 47.179994 202.48919 47.179997 202.48918 47.180016 202.48917 47.180282 202.48916 47.180359 202.48918 47.180588 202.48896 47.180507 202.48875 47.18034 202.48866 47.180265 202.48859 47.180132 202.48834 47.180065 202.48828 47.180034 202.48828 47.180027 202.48841 47.179808 202.48857 47.179609 202.48872 47.179407 202.48873 47.179377 202.48871 47.179098 202.4887 47.179074 202.48873 47.178816 202.48911 47.178772 202.48914 47.178767 202.48953 47.178781 202.48955 47.179028 202.4956 47.183106 202.49539 47.183275 202.49518 47.183443 202.49513 47.183429 202.49513 47.183407 202.49527 47.183199 202.4955 47.183043 202.49562 47.183069 202.4956 47.183106 202.49527 47.1829 202.49499 47.183022 202.49486 47.182981 202.49486 47.182943 202.49483 47.182677 202.49482 47.18262 202.49492 47.182609 202.49528 47.182667 202.49527 47.1829 202.49322 47.18162 202.49317 47.181627 202.49304 47.181503 202.49323 47.181582 202.49322 47.18162 202.4911 47.180294 202.49086 47.1804 202.49095 47.180199 202.49114 47.180194 202.4911 47.180294 202.49707 47.184321 202.497 47.184323 202.497 47.18428 202.49705 47.184286 202.49707 47.184321 202.49365 47.182185 202.49332 47.182161 202.49336 47.182003 202.49357 47.181978 202.49365 47.182185 202.49269 47.181586 202.4924 47.181542 202.49242 47.18142 202.49257 47.181416 202.49269 47.181586 202.4878 47.178528 202.48753 47.178658 202.48749 47.178665 202.4875 47.178643 202.48739 47.178414 202.48721 47.17822 202.48721 47.17816 202.48731 47.17815 202.4876 47.178256 202.48775 47.178475 202.4878 47.178528 202.50166 47.187488 202.50147 47.18753 202.50149 47.187382 202.50165 47.187394 202.50166 47.187488 202.49363 47.182475 202.49331 47.182499 202.4933 47.182264 202.49367 47.18223 202.49363 47.182475 202.48617 47.17811 202.48601 47.178132 202.48596 47.177978 202.48623 47.177972 202.48617 47.17811 202.47717 47.172484 202.47689 47.172514 202.47692 47.172328 202.4772 47.172278 202.47717 47.172484 202.50131 47.18787 202.50107 47.187824 202.5007 47.187773 202.50066 47.187763 202.50039 47.187675 202.50037 47.18758 202.5005 47.187364 202.5008 47.187375 202.50101 47.187543 202.50124 47.187696 202.50131 47.18787 202.49533 47.184135 202.49534 47.184252 202.49535 47.184444 202.49516 47.184386 202.49493 47.18423 202.49488 47.184148 202.49513 47.184009 202.49524 47.183996 202.49533 47.184135 202.49114 47.181514 202.49112 47.181516 202.49112 47.181501 202.49114 47.181499 202.49114 47.181514 202.5001 47.18741 202.49991 47.187379 202.4999 47.187286 202.50005 47.187278 202.5001 47.18741 202.49583 47.184747 202.49588 47.184826 202.49583 47.185046 202.49551 47.185144 202.49546 47.185141 202.49506 47.185107 202.49482 47.184964 202.49487 47.184745 202.49516 47.184628 202.49537 47.184557 202.49548 47.184524 202.4958 47.184561 202.49583 47.184747 202.49673 47.185606 202.49661 47.18559 202.49632 47.185481 202.49632 47.185348 202.4965 47.185342 202.49675 47.185488 202.49673 47.185606 202.48697 47.179505 202.48676 47.179527 202.48651 47.179393 202.48652 47.179227 202.48675 47.179212 202.48698 47.179371 202.48697 47.179505 202.49607 47.185493 202.49588 47.18548 202.49585 47.185355 202.49605 47.18535 202.49607 47.185493 202.49104 47.182349 202.49083 47.18238 202.49081 47.182209 202.49107 47.182202 202.49104 47.182349 202.48562 47.179261 202.48529 47.179355 202.48522 47.179371 202.48524 47.179321 202.4854 47.179125 202.48562 47.17907 202.48562 47.179261 202.49721 47.187102 202.4972 47.187103 202.4972 47.187098 202.49721 47.187098 202.49721 47.187102 202.47289 47.1719 202.47287 47.171901 202.47287 47.171893 202.47289 47.171892 202.47289 47.1719 202.4987 47.188333 202.49863 47.188327 202.49863 47.188288 202.49868 47.18829 202.4987 47.188333 202.48569 47.180203 202.48541 47.180329 202.48526 47.180311 202.48521 47.180204 202.48542 47.180032 202.48564 47.18003 202.48569 47.180203 202.50173 47.190521 202.50146 47.190462 202.50144 47.190344 202.50159 47.190365 202.50173 47.190521 202.50085 47.189976 202.5008 47.189978 202.50048 47.189884 202.50029 47.189921 202.50004 47.189885 202.50004 47.189765 202.50033 47.189652 202.50036 47.189647 202.50067 47.189743 202.50086 47.189929 202.50085 47.189976 202.5016 47.191039 202.50155 47.191051 202.50154 47.191002 202.50162 47.191 202.5016 47.191039 202.49854 47.189132 202.49843 47.189124 202.49816 47.189 202.49808 47.188845 202.49843 47.188797 202.49852 47.189057 202.49854 47.189132 202.4771 47.175729 202.47692 47.175739 202.47693 47.175626 202.47708 47.175626 202.4771 47.175729 202.49851 47.189409 202.49846 47.189427 202.49848 47.189394 202.49851 47.18939 202.49851 47.189409 202.49729 47.188647 202.49711 47.188802 202.4971 47.188825 202.49707 47.188826 202.49679 47.188711 202.49678 47.188627 202.49686 47.188381 202.49727 47.188357 202.49729 47.188647 202.50145 47.191544 202.50132 47.191547 202.50133 47.19147 202.50147 47.191432 202.50145 47.191544 202.49878 47.189877 202.49873 47.189882 202.49874 47.189851 202.49877 47.189849 202.49878 47.189877 202.50144 47.191841 202.50129 47.192044 202.50108 47.192046 202.50109 47.191917 202.50135 47.191781 202.50144 47.191778 202.50144 47.191841 202.50473 47.194191 202.5043 47.194219 202.50431 47.193932 202.5047 47.193928 202.50473 47.194191 202.49984 47.191438 202.49955 47.191552 202.49965 47.19132 202.49983 47.191346 202.49984 47.191438 202.49914 47.190997 202.49894 47.191029 202.49899 47.190907 202.49909 47.190918 202.49914 47.190997 202.50493 47.194915 202.50471 47.195078 202.50447 47.19507 202.50415 47.194983 202.50393 47.19482 202.50367 47.194689 202.50345 47.194591 202.5034 47.194563 202.5034 47.194556 202.50343 47.194277 202.50379 47.194272 202.50407 47.194377 202.50419 47.194301 202.50453 47.194378 202.50477 47.194525 202.50499 47.194688 202.50493 47.194915 202.51008 47.198431 202.51003 47.198445 202.51004 47.198408 202.51008 47.198411 202.51008 47.198431 202.50282 47.194194 202.50258 47.194195 202.50251 47.194003 202.50285 47.193995 202.50282 47.194194 202.50235 47.193905 202.50211 47.193887 202.50205 47.193713 202.50237 47.193697 202.50235 47.193905 202.50182 47.193574 202.50166 47.193572 202.50163 47.193455 202.5018 47.193469 202.50182 47.193574 202.50601 47.196488 202.50566 47.196475 202.50563 47.196252 202.50599 47.196224 202.50601 47.196488 202.50824 47.19818 202.50804 47.198354 202.50794 47.198369 202.50772 47.198453 202.50741 47.198431 202.50727 47.19821 202.50726 47.198168 202.50734 47.198159 202.5076 47.198081 202.50792 47.198053 202.50818 47.198144 202.50823 47.198149 202.50824 47.19818 202.49851 47.192701 202.49843 47.192704 202.49843 47.192653 202.49851 47.192646 202.49851 47.192701 202.47353 47.177989 202.47342 47.178001 202.4734 47.177909 202.47354 47.177917 202.47353 47.177989 202.50865 47.200231 202.50851 47.200225 202.5085 47.200134 202.50869 47.200088 202.50865 47.200231 202.47283 47.177851 202.47275 47.177851 202.47275 47.177798 202.47282 47.177796 202.47283 47.177851 202.47208 47.177378 202.47206 47.177379 202.47206 47.177369 202.47208 47.177367 202.47208 47.177378 202.4716 47.177377 202.47122 47.17744 202.47104 47.177487 202.47106 47.177342 202.47127 47.177175 202.47146 47.177172 202.4716 47.177377 202.50575 47.199018 202.50574 47.199019 202.50574 47.199007 202.50575 47.199006 202.50575 47.199018 202.47455 47.179521 202.47438 47.179569 202.47444 47.179455 202.47454 47.17945 202.47455 47.179521 202.47059 47.177049 202.47022 47.177115 202.47028 47.176856 202.47054 47.176878 202.47059 47.177049 202.47261 47.178907 202.47239 47.179071 202.47218 47.179241 202.47218 47.179242 202.47212 47.179497 202.47178 47.179538 202.47156 47.179378 202.47134 47.179313 202.47124 47.179288 202.47123 47.179243 202.47116 47.179025 202.47098 47.178829 202.4706 47.178788 202.47064 47.178574 202.47095 47.178529 202.47104 47.178525 202.47143 47.1785 202.47153 47.178531 202.47173 47.178603 202.47214 47.178614 202.47216 47.17861 202.47258 47.178625 202.47261 47.178907 202.46942 47.176916 202.4692 47.176892 202.46921 47.176785 202.46936 47.176771 202.46942 47.176916 202.47011 47.177646 202.46994 47.177646 202.46988 47.177498 202.47008 47.177543 202.47011 47.177646 202.50708 47.201639 202.50704 47.201636 202.50704 47.201615 202.50707 47.201613 202.50708 47.201639 202.47616 47.182326 202.47592 47.182338 202.47592 47.182175 202.47615 47.182164 202.47616 47.182326 202.47036 47.179 202.47029 47.179014 202.47029 47.178953 202.47044 47.178907 202.47036 47.179 202.46925 47.178603 202.4691 47.178592 202.46906 47.178486 202.46924 47.178488 202.46925 47.178603 202.46993 47.179327 202.46987 47.179328 202.46987 47.179287 202.46994 47.179271 202.46993 47.179327 202.50885 47.203945 202.50875 47.203954 202.50874 47.203876 202.50885 47.203874 202.50885 47.203945 202.47534 47.183007 202.475 47.183019 202.475 47.182794 202.47532 47.182783 202.47534 47.183007 202.50889 47.204269 202.50868 47.204324 202.5087 47.20415 202.50892 47.204152 202.50889 47.204269 202.50818 47.203826 202.50802 47.203836 202.50804 47.203735 202.50818 47.203719 202.50818 47.203826 202.46578 47.177329 202.46556 47.177309 202.46556 47.177191 202.46574 47.177172 202.46578 47.177329 202.49432 47.195764 202.49428 47.195772 202.49429 47.195745 202.49433 47.195736 202.49432 47.195764 202.49687 47.197658 202.49653 47.197687 202.49655 47.197457 202.49686 47.197448 202.49687 47.197658 202.46955 47.180888 202.46952 47.180888 202.46952 47.180864 202.46955 47.180862 202.46955 47.180888 202.46393 47.177971 202.46377 47.177977 202.46373 47.177847 202.46392 47.177866 202.46393 47.177971 202.48123 47.190582 202.48106 47.190574 202.48103 47.190456 202.4812 47.190471 202.48123 47.190582 202.46167 47.178652 202.46153 47.178654 202.46152 47.178557 202.46174 47.178505 202.46167 47.178652 202.48177 47.191518 202.48146 47.191624 202.48159 47.191812 202.48163 47.192024 202.4814 47.192182 202.48118 47.192115 202.48086 47.192027 202.48059 47.191973 202.48043 47.192173 202.48051 47.192284 202.48075 47.192428 202.48099 47.192521 202.48108 47.192514 202.48131 47.192426 202.48168 47.192393 202.48187 47.192578 202.48205 47.192772 202.48232 47.192895 202.48241 47.193111 202.48231 47.193234 202.48249 47.19316 202.48276 47.193224 202.48314 47.193272 202.48307 47.193524 202.48303 47.193673 202.48314 47.19387 202.48288 47.194006 202.48287 47.194117 202.48317 47.194223 202.48315 47.194474 202.48319 47.194533 202.4832 47.194805 202.48286 47.194888 202.48288 47.195086 202.48311 47.195049 202.48342 47.194942 202.48358 47.194742 202.48363 47.194534 202.48326 47.194479 202.48322 47.194216 202.48352 47.194105 202.48375 47.194117 202.48376 47.194255 202.4837 47.194477 202.48397 47.194607 202.48398 47.194689 202.48391 47.194947 202.48351 47.194995 202.48361 47.195196 202.48371 47.19542 202.48331 47.195422 202.48326 47.195438 202.4829 47.195396 202.48263 47.195343 202.48255 47.195329 202.4823 47.195191 202.48221 47.195079 202.48211 47.195003 202.48202 47.194962 202.4818 47.194911 202.48175 47.194793 202.48201 47.194655 202.48225 47.194507 202.48217 47.194308 202.48216 47.194151 202.4822 47.193964 202.48199 47.193795 202.48171 47.193675 202.48142 47.193565 202.48124 47.193368 202.48101 47.193219 202.48067 47.193139 202.48058 47.192881 202.48043 47.192772 202.48035 47.192723 202.48015 47.19255 202.47996 47.19248 202.47986 47.192435 202.47966 47.192292 202.47964 47.192275 202.47965 47.191988 202.48 47.192008 202.48024 47.192056 202.48027 47.191812 202.48019 47.191723 202.48008 47.191628 202.48001 47.191614 202.47974 47.19174 202.47948 47.191742 202.47946 47.19157 202.47944 47.191445 202.47923 47.19128 202.47898 47.191134 202.47897 47.190962 202.47907 47.190746 202.47905 47.190713 202.47911 47.190717 202.47948 47.190769 202.47969 47.190934 202.47998 47.190996 202.48005 47.190994 202.48041 47.191055 202.48046 47.191298 202.48048 47.191332 202.48054 47.191346 202.48091 47.191336 202.48109 47.191391 202.48121 47.19144 202.48159 47.191401 202.48172 47.191389 202.48177 47.191518 202.46266 47.18017 202.46253 47.180197 202.46225 47.180073 202.46208 47.179876 202.46207 47.179802 202.46218 47.179801 202.46247 47.179912 202.46266 47.180096 202.46266 47.18017 202.48169 47.192961 202.48139 47.192935 202.48123 47.192976 202.48122 47.193061 202.4815 47.193182 202.48155 47.193173 202.48183 47.193049 202.48178 47.192969 202.48169 47.192961 202.47709 47.190088 202.4771 47.190247 202.47708 47.190379 202.47682 47.190518 202.47679 47.190795 202.47646 47.190891 202.47619 47.19092 202.47589 47.190818 202.47587 47.190821 202.47552 47.190767 202.4752 47.190702 202.47515 47.190713 202.47475 47.190681 202.47449 47.190553 202.47448 47.190552 202.47404 47.190558 202.47401 47.190557 202.47402 47.190573 202.47408 47.190602 202.47447 47.190564 202.47468 47.190735 202.47486 47.190928 202.47515 47.19104 202.47537 47.1912 202.47549 47.191179 202.47585 47.191175 202.47598 47.191189 202.47617 47.191006 202.47651 47.191013 202.47674 47.191165 202.47696 47.191328 202.47696 47.191504 202.47666 47.191616 202.47682 47.191756 202.47709 47.191885 202.47713 47.19191 202.47743 47.191953 202.47766 47.192114 202.47769 47.192254 202.47743 47.192285 202.47725 47.192282 202.47695 47.192313 202.47684 47.192323 202.47683 47.192399 202.47686 47.192637 202.47647 47.192667 202.47644 47.192674 202.47644 47.192689 202.47663 47.192794 202.47671 47.192814 202.47704 47.192749 202.47718 47.192794 202.47719 47.192841 202.47727 47.193052 202.47752 47.193193 202.47768 47.193395 202.47797 47.193511 202.47804 47.193673 202.47809 47.193746 202.47826 47.19381 202.47842 47.193831 202.47874 47.193918 202.47867 47.194069 202.47874 47.194245 202.47899 47.194381 202.4792 47.194549 202.47945 47.194692 202.47975 47.194799 202.47997 47.194963 202.48019 47.195122 202.4803 47.195366 202.48056 47.1955 202.48095 47.195538 202.48119 47.195638 202.48124 47.19565 202.48151 47.195771 202.4818 47.195883 202.48185 47.196056 202.48181 47.196206 202.48181 47.196326 202.48188 47.196479 202.48199 47.196722 202.48203 47.196764 202.48221 47.196882 202.4823 47.19714 202.48229 47.197227 202.48217 47.197448 202.48188 47.197567 202.48181 47.197825 202.48159 47.197985 202.48154 47.198031 202.48139 47.198161 202.48135 47.198171 202.48096 47.198193 202.48085 47.198212 202.48061 47.198067 202.48022 47.198026 202.48022 47.198025 202.47987 47.197963 202.47971 47.197755 202.47972 47.197712 202.4798 47.197466 202.48018 47.197407 202.48019 47.197407 202.48019 47.197402 202.48027 47.197161 202.48039 47.196933 202.48039 47.19693 202.48038 47.196929 202.47995 47.196924 202.47969 47.196794 202.47945 47.196644 202.47942 47.196629 202.47908 47.196713 202.47879 47.196832 202.47872 47.197088 202.47844 47.197064 202.4782 47.19692 202.4781 47.196703 202.47849 47.196704 202.4787 47.19678 202.47857 47.196643 202.47841 47.196435 202.47846 47.196329 202.47838 47.196132 202.47813 47.196122 202.47802 47.196354 202.47772 47.196298 202.47738 47.196226 202.47732 47.196217 202.47734 47.196252 202.47737 47.196542 202.47735 47.196568 202.47723 47.196755 202.47695 47.196881 202.47716 47.197038 202.47729 47.197093 202.47749 47.197121 202.47752 47.197235 202.47736 47.197436 202.47734 47.197555 202.47746 47.197787 202.47778 47.197878 202.47814 47.197935 202.47816 47.197935 202.47846 47.198031 202.47846 47.198121 202.47842 47.198382 202.47859 47.198503 202.47835 47.198436 202.47816 47.198252 202.47779 47.198301 202.47759 47.19848 202.4776 47.198662 202.47758 47.198769 202.47747 47.199001 202.47743 47.199114 202.47756 47.199342 202.47758 47.199369 202.47776 47.199518 202.47786 47.199772 202.47795 47.199902 202.47801 47.199985 202.47808 47.200259 202.47848 47.20029 202.47875 47.200413 202.47886 47.200663 202.47905 47.200844 202.47908 47.200906 202.479 47.200883 202.47877 47.200727 202.47839 47.200772 202.47822 47.200809 202.47824 47.200681 202.47812 47.200555 202.47799 47.200524 202.47766 47.200618 202.47763 47.200895 202.4776 47.200943 202.47757 47.20116 202.47765 47.201229 202.4777 47.201241 202.4777 47.201194 202.47766 47.200917 202.47804 47.20094 202.4782 47.201151 202.47818 47.201242 202.47816 47.201503 202.47818 47.201536 202.47813 47.201809 202.47812 47.201858 202.47809 47.202084 202.47814 47.202164 202.47818 47.202437 202.47815 47.202489 202.47814 47.202712 202.47806 47.202877 202.47803 47.202943 202.47815 47.203133 202.47811 47.203293 202.47795 47.203488 202.4776 47.203546 202.47746 47.203319 202.47724 47.203347 202.47707 47.203539 202.4769 47.203728 202.47664 47.203866 202.47626 47.203883 202.47622 47.203904 202.47621 47.203917 202.47618 47.204177 202.47587 47.204172 202.4757 47.20397 202.47533 47.20395 202.47529 47.203948 202.47489 47.203919 202.47489 47.203669 202.47525 47.203649 202.47551 47.203763 202.47559 47.203512 202.47589 47.203504 202.47606 47.203504 202.47633 47.203508 202.47649 47.203473 202.47661 47.203297 202.47653 47.203201 202.47663 47.202964 202.47664 47.20295 202.47662 47.202955 202.47633 47.203079 202.4761 47.203229 202.47589 47.203398 202.47558 47.203407 202.47537 47.20324 202.47524 47.20301 202.47524 47.202995 202.47527 47.202987 202.47549 47.202848 202.47557 47.202767 202.4756 47.202617 202.47579 47.202605 202.47608 47.20262 202.47631 47.202464 202.47615 47.202333 202.47595 47.202162 202.47588 47.201896 202.47619 47.201794 202.47631 47.201568 202.47631 47.201565 202.4763 47.201564 202.476 47.201671 202.47568 47.201708 202.47554 47.201488 202.47528 47.201355 202.47493 47.201286 202.47492 47.201294 202.47492 47.201296 202.47491 47.201592 202.47482 47.201692 202.47477 47.201803 202.47465 47.201818 202.4744 47.201681 202.47418 47.201729 202.47393 47.201878 202.47365 47.201905 202.47345 47.201872 202.4733 47.201839 202.47326 47.201759 202.47318 47.201602 202.47318 47.201405 202.4733 47.20119 202.47299 47.201288 202.47271 47.201303 202.47243 47.201178 202.47217 47.201051 202.47213 47.201048 202.47184 47.201169 202.47163 47.201335 202.47152 47.201529 202.4715 47.201556 202.4714 47.201792 202.47124 47.201989 202.47086 47.202015 202.47067 47.20183 202.47054 47.201852 202.47028 47.201794 202.47005 47.201637 202.46983 47.201476 202.46954 47.201365 202.46927 47.201237 202.46904 47.201079 202.46888 47.200877 202.46862 47.200746 202.46838 47.200597 202.46816 47.200433 202.46785 47.200334 202.46762 47.20018 202.46737 47.200039 202.46716 47.199869 202.4669 47.199734 202.46664 47.1996 202.46641 47.19945 202.46614 47.199325 202.46588 47.199186 202.46566 47.199025 202.46541 47.198887 202.46516 47.198743 202.46492 47.198597 202.46467 47.198454 202.46447 47.19828 202.46423 47.198131 202.46396 47.198006 202.46373 47.19785 202.4635 47.197691 202.46327 47.197538 202.46306 47.197364 202.46284 47.197207 202.46262 47.197041 202.46241 47.196871 202.46211 47.196765 202.46195 47.196563 202.46173 47.196397 202.46149 47.196251 202.4612 47.196135 202.46096 47.195994 202.46069 47.195867 202.46038 47.19577 202.46037 47.195493 202.46062 47.195352 202.461 47.195292 202.46112 47.195065 202.46131 47.194886 202.46149 47.1947 202.46147 47.194636 202.46159 47.194459 202.46185 47.194327 202.46195 47.194286 202.46218 47.194231 202.46215 47.194136 202.46223 47.193966 202.46242 47.19378 202.46267 47.19364 202.46294 47.19351 202.46311 47.193428 202.46323 47.193392 202.46327 47.193311 202.46338 47.193185 202.46359 47.193022 202.46384 47.192878 202.46405 47.192705 202.46425 47.192536 202.46446 47.192367 202.46466 47.192192 202.4649 47.192041 202.46508 47.191858 202.46529 47.191685 202.4655 47.191522 202.46574 47.191367 202.466 47.191235 202.46619 47.191056 202.46644 47.190911 202.46669 47.190768 202.4669 47.190596 202.46711 47.190432 202.46732 47.190266 202.46752 47.190088 202.46779 47.189956 202.46801 47.1898 202.46822 47.18963 202.46841 47.189451 202.46863 47.189286 202.46883 47.189113 202.46907 47.188963 202.46931 47.188817 202.46929 47.188537 202.46907 47.188377 202.46902 47.188334 202.46923 47.188254 202.46936 47.18825 202.46965 47.188132 202.46989 47.188094 202.47005 47.188079 202.47029 47.187929 202.47056 47.187921 202.47078 47.187935 202.47102 47.187791 202.47121 47.187767 202.47122 47.187915 202.47117 47.188121 202.47155 47.188167 202.47164 47.18843 202.47202 47.188471 202.47204 47.188723 202.47174 47.188835 202.47145 47.188894 202.47136 47.188898 202.47099 47.188909 202.47091 47.188918 202.4707 47.189085 202.4705 47.189261 202.47021 47.189378 202.4701 47.189565 202.4701 47.189609 202.47002 47.189622 202.4697 47.189534 202.46945 47.189392 202.4693 47.189404 202.469 47.189519 202.46891 47.189763 202.46889 47.189808 202.46912 47.189893 202.4692 47.189902 202.4695 47.189829 202.46978 47.189803 202.46988 47.189768 202.47027 47.189767 202.47044 47.189819 202.4706 47.189621 202.47077 47.189426 202.47117 47.189422 202.47138 47.189597 202.47154 47.189608 202.47186 47.189566 202.47195 47.189567 202.47192 47.189519 202.47184 47.189252 202.47184 47.189198 202.472 47.189139 202.47221 47.189129 202.47248 47.188998 202.47277 47.188894 202.47278 47.18889 202.47315 47.188939 202.47334 47.188939 202.4736 47.188801 202.47391 47.188704 202.47392 47.188702 202.47432 47.188655 202.47447 47.188613 202.47471 47.188759 202.475 47.188875 202.47497 47.18906 202.47478 47.189244 202.47475 47.189385 202.47506 47.189481 202.47517 47.189484 202.47549 47.189386 202.47563 47.189386 202.47583 47.189564 202.47609 47.189459 202.47644 47.189437 202.4765 47.189716 202.47626 47.189867 202.47587 47.189859 202.47578 47.189867 202.47572 47.189965 202.4759 47.189944 202.47624 47.189906 202.47647 47.19006 202.47642 47.190263 202.47624 47.190453 202.47624 47.190562 202.47645 47.190582 202.47674 47.190466 202.47658 47.190306 202.47653 47.190037 202.47679 47.189897 202.47705 47.189957 202.47709 47.190088 202.48222 47.193592 202.48217 47.193656 202.48234 47.193667 202.4823 47.193563 202.48222 47.193592 202.49228 47.200179 202.49228 47.200179 202.49228 47.200176 202.49228 47.200176 202.49228 47.200179 202.4719 47.18744 202.47161 47.187476 202.47136 47.187329 202.47139 47.187125 202.47166 47.187114 202.47187 47.18728 202.4719 47.18744 202.46143 47.181194 202.46112 47.181233 202.46106 47.18096 202.46145 47.180995 202.46143 47.181194 202.47885 47.192383 202.47857 47.192412 202.47836 47.192248 202.47837 47.192082 202.47866 47.192024 202.47884 47.192215 202.47885 47.192383 202.47557 47.190333 202.47519 47.190358 202.47515 47.190373 202.47515 47.19039 202.47521 47.190407 202.47555 47.190415 202.47564 47.190376 202.47566 47.190334 202.47557 47.190333 202.46105 47.181259 202.46067 47.181315 202.46057 47.181318 202.46019 47.181276 202.46017 47.181008 202.46058 47.180986 202.46061 47.18098 202.46105 47.18096 202.46105 47.181259 202.48355 47.195622 202.48341 47.195832 202.48315 47.19586 202.48319 47.195692 202.48334 47.19549 202.48369 47.195464 202.48355 47.195622 202.48127 47.194194 202.48113 47.194404 202.48075 47.194387 202.48063 47.194145 202.48059 47.19407 202.4807 47.194096 202.48104 47.194053 202.4812 47.194052 202.48127 47.194194 202.47904 47.192801 202.47896 47.192776 202.47896 47.192751 202.47905 47.192713 202.47904 47.192801 202.47745 47.191811 202.47712 47.191863 202.4772 47.191649 202.47737 47.191674 202.47745 47.191811 202.47967 47.193497 202.47931 47.193496 202.47918 47.193265 202.47918 47.193186 202.47932 47.193161 202.4796 47.193284 202.47967 47.193497 202.47626 47.191365 202.47623 47.191545 202.47655 47.191543 202.47645 47.191376 202.47626 47.191365 202.48914 47.19971 202.48895 47.19971 202.48895 47.19959 202.48912 47.199582 202.48914 47.19971 202.48432 47.196701 202.48411 47.196864 202.48389 47.19694 202.4837 47.196762 202.48367 47.196592 202.48397 47.196559 202.48416 47.196598 202.4843 47.196639 202.48432 47.196701 202.45965 47.181278 202.4593 47.181279 202.45931 47.181065 202.45961 47.18105 202.45965 47.181278 202.46851 47.187119 202.46809 47.187149 202.4681 47.186861 202.46849 47.186847 202.46851 47.187119 202.46001 47.181805 202.45992 47.181795 202.45992 47.181748 202.45999 47.181743 202.46001 47.181805 202.48472 47.197546 202.48447 47.197493 202.48417 47.197505 202.484 47.19751 202.48401 47.197405 202.48425 47.197252 202.48434 47.197258 202.48462 47.197381 202.48472 47.197546 202.4826 47.196221 202.48221 47.196235 202.48223 47.195993 202.48256 47.195971 202.4826 47.196221 202.47298 47.190213 202.47282 47.190158 202.47248 47.190086 202.47221 47.190031 202.47208 47.190053 202.4719 47.190137 202.4716 47.190249 202.47159 47.190414 202.47195 47.190462 202.47197 47.190457 202.47239 47.190443 202.47244 47.190442 202.47281 47.19049 202.47294 47.190486 202.47311 47.190293 202.47311 47.190269 202.47298 47.190213 202.48561 47.198405 202.48544 47.198402 202.48541 47.198276 202.48562 47.198265 202.48561 47.198405 202.48464 47.198098 202.48462 47.198358 202.48488 47.198491 202.4849 47.198558 202.48477 47.198567 202.48442 47.198555 202.48434 47.198563 202.48394 47.19853 202.48378 47.198326 202.48377 47.19815 202.48396 47.197971 202.48433 47.1979 202.48438 47.19788 202.48463 47.198022 202.48464 47.198098 202.46313 47.184649 202.46311 47.184646 202.4631 47.184634 202.46312 47.184635 202.46313 47.184649 202.49363 47.204008 202.49322 47.204043 202.49324 47.203765 202.49361 47.203754 202.49363 47.204008 202.48545 47.199199 202.48519 47.199339 202.48516 47.199585 202.48515 47.199611 202.48502 47.199827 202.48488 47.200043 202.48466 47.200204 202.4843 47.20022 202.48404 47.200083 202.48403 47.199812 202.48403 47.199766 202.48377 47.199635 202.48369 47.199597 202.4835 47.199506 202.48349 47.199473 202.48334 47.199301 202.48316 47.199108 202.48316 47.198969 202.48325 47.198725 202.4837 47.198711 202.48394 47.198858 202.48396 47.198866 202.48437 47.198866 202.4846 47.199024 202.48484 47.19917 202.48501 47.199227 202.48511 47.198987 202.48541 47.199072 202.48545 47.199199 202.48461 47.199571 202.48463 47.199647 202.48485 47.19972 202.48484 47.199491 202.48461 47.199571 202.49852 47.209458 202.49819 47.209475 202.49819 47.20925 202.4985 47.209248 202.49852 47.209458 202.48747 47.202556 202.48721 47.202694 202.48711 47.202695 202.4871 47.202627 202.48729 47.202444 202.48746 47.202439 202.48747 47.202556 202.48037 47.198716 202.48018 47.198709 202.48012 47.198566 202.48031 47.198615 202.48037 47.198716 202.46713 47.190741 202.46714 47.190778 202.46718 47.190773 202.46718 47.190747 202.46713 47.190741 202.47877 47.198917 202.47874 47.199118 202.47894 47.199301 202.47896 47.199332 202.47889 47.199339 202.47851 47.199293 202.47831 47.199116 202.47832 47.198935 202.47832 47.198781 202.47827 47.198605 202.47863 47.19855 202.47877 47.198772 202.47877 47.198917 202.48454 47.203419 202.48439 47.203626 202.48411 47.203613 202.484 47.203377 202.48433 47.20329 202.48455 47.203292 202.48454 47.203419 202.47679 47.199174 202.47678 47.19927 202.47679 47.199473 202.47683 47.199558 202.47688 47.199832 202.47688 47.199843 202.47693 47.200131 202.47701 47.200211 202.47678 47.200367 202.47661 47.200556 202.47653 47.200756 202.47671 47.200921 202.47632 47.200976 202.4764 47.201177 202.47662 47.201165 202.47673 47.200933 202.47674 47.200928 202.47686 47.200712 202.47708 47.200551 202.47738 47.200452 202.4774 47.200453 202.47739 47.200444 202.47743 47.200172 202.47758 47.199977 202.47725 47.199899 202.47693 47.199806 202.47703 47.199621 202.47705 47.199397 202.47704 47.199332 202.4769 47.199179 202.47679 47.199174 202.47985 47.203182 202.47985 47.203183 202.47985 47.203179 202.47985 47.20318 202.47985 47.203182 202.4781 47.203884 202.47798 47.203916 202.478 47.203822 202.47816 47.203782 202.4781 47.203884 202.48335 47.208058 202.48336 47.20807 202.48335 47.208361 202.48293 47.208393 202.4827 47.208236 202.48265 47.208219 202.48232 47.208314 202.48215 47.208315 202.48193 47.208154 202.48193 47.208072 202.4821 47.207874 202.48229 47.207698 202.48265 47.207621 202.48265 47.207621 202.48298 47.207705 202.4832 47.207863 202.48335 47.208058 202.47821 47.204852 202.47798 47.204886 202.47775 47.204737 202.47774 47.204557 202.47801 47.204544 202.47822 47.204711 202.47821 47.204852 202.47242 47.201532 202.47251 47.201774 202.47254 47.201906 202.47237 47.201875 202.47217 47.2017 202.47216 47.201666 202.4724 47.201517 202.47242 47.201513 202.47242 47.201532 202.47271 47.20231 202.47263 47.202333 202.47266 47.202281 202.4727 47.20228 202.47271 47.20231 202.4724 47.202714 202.47207 47.20281 202.47199 47.202808 202.47199 47.202757 202.47207 47.202507 202.47244 47.202478 202.4724 47.202714 202.48374 47.210096 202.48384 47.210323 202.48389 47.210493 202.48353 47.210566 202.48351 47.210564 202.48326 47.210426 202.4829 47.210363 202.48289 47.210167 202.48321 47.210132 202.48331 47.210132 202.48369 47.210069 202.48373 47.210077 202.48374 47.210096 202.47539 47.204884 202.47533 47.204895 202.47496 47.20491 202.47489 47.204894 202.47488 47.204863 202.47505 47.204668 202.4752 47.204668 202.4754 47.204843 202.47539 47.204884 202.47373 47.204142 202.47351 47.204303 202.47348 47.20431 202.47323 47.204171 202.47321 47.204118 202.4733 47.204115 202.47365 47.204094 202.47373 47.204127 202.47373 47.204142 202.47287 47.203909 202.47277 47.204145 202.47244 47.204104 202.47228 47.203897 202.47194 47.203926 202.47188 47.204184 202.47165 47.204338 202.47121 47.204361 202.47103 47.204168 202.47105 47.203965 202.47122 47.203772 202.47143 47.203606 202.47178 47.203524 202.472 47.203449 202.47211 47.203433 202.47248 47.203421 202.47267 47.203602 202.47295 47.203724 202.47287 47.203909 202.47581 47.206342 202.47554 47.206366 202.47531 47.206212 202.47533 47.206043 202.47561 47.205986 202.47588 47.206116 202.47581 47.206342 202.48457 47.212112 202.48434 47.212228 202.48448 47.212055 202.48457 47.212058 202.48457 47.212112 202.47539 47.206979 202.47526 47.207193 202.47485 47.207202 202.47482 47.206917 202.47492 47.206824 202.47496 47.206706 202.47514 47.206658 202.47539 47.206799 202.47539 47.206979 202.46957 47.203338 202.46952 47.203329 202.46952 47.20331 202.46957 47.203294 202.46957 47.203338 202.47323 47.205929 202.47303 47.205946 202.47304 47.205805 202.47322 47.205803 202.47323 47.205929 202.46896 47.203257 202.46867 47.203308 202.46878 47.203143 202.46897 47.203084 202.46896 47.203257 202.47897 47.21101 202.47882 47.211211 202.47865 47.211223 202.47865 47.211106 202.47893 47.210984 202.47898 47.210981 202.47897 47.21101 202.47693 47.210032 202.47676 47.21002 202.47678 47.209942 202.47687 47.209934 202.47693 47.210032 202.47051 47.207515 202.47046 47.207519 202.47046 47.207489 202.47049 47.20749 202.47051 47.207515 202.48083 47.215759 202.48047 47.215835 202.48033 47.215838 202.48007 47.215707 202.48007 47.215583 202.48024 47.215581 202.48042 47.215504 202.48081 47.215489 202.48083 47.215759 202.47199 47.211133 202.47186 47.211356 202.47143 47.211353 202.47128 47.211139 202.47101 47.211122 202.4709 47.211096 202.47089 47.211048 202.47115 47.210908 202.47115 47.210907 202.47145 47.211014 202.47175 47.210987 202.47192 47.210993 202.47199 47.211133 202.46765 47.21261 202.46776 47.212764 202.46777 47.212988 202.46757 47.213164 202.46718 47.213215 202.46709 47.213457 202.46677 47.21349 202.46662 47.213277 202.46654 47.213113 202.46674 47.21294 202.46679 47.212829 202.46681 47.212685 202.46702 47.212516 202.46723 47.212505 202.4675 47.212518 202.46762 47.212538 202.46765 47.21261 202.46316 47.209804 202.46291 47.209837 202.4629 47.209644 202.46317 47.209645 202.46316 47.209804 202.48108 47.168645 202.48089 47.168828 202.48053 47.168845 202.48026 47.16872 202.48024 47.168418 202.48046 47.168259 202.48089 47.168252 202.48106 47.168449 202.48108 47.168645 202.49361 47.177674 202.49322 47.17768 202.49322 47.177428 202.49359 47.177407 202.49361 47.177674 202.48957 47.179635 202.48927 47.179627 202.48925 47.179439 202.48952 47.179441 202.48957 47.179635 202.47704 47.172405 202.47703 47.172407 202.47703 47.172398 202.47705 47.172396 202.47704 47.172405 202.49564 47.184925 202.49527 47.184993 202.49522 47.18499 202.49519 47.184946 202.49531 47.18472 202.4956 47.184706 202.49564 47.184925 202.49722 47.188605 202.4969 47.188627 202.49692 47.188418 202.49721 47.188402 202.49722 47.188605 202.50459 47.194102 202.50445 47.194111 202.50445 47.194019 202.50458 47.194018 202.50459 47.194102 202.50477 47.194818 202.50439 47.19488 202.50431 47.194865 202.50419 47.19475 202.50413 47.194675 202.50422 47.194472 202.50441 47.19447 202.50471 47.19457 202.50477 47.194818 202.50379 47.194501 202.5035 47.194486 202.50352 47.194333 202.50371 47.19433 202.50379 47.194501 202.50587 47.196402 202.50576 47.196398 202.50575 47.196326 202.50587 47.196318 202.50587 47.196402 202.50778 47.198193 202.50759 47.198372 202.5075 47.198366 202.50746 47.198288 202.50774 47.198166 202.50777 47.198164 202.50778 47.198193 202.47228 47.179004 202.47207 47.179169 202.47179 47.179209 202.47159 47.179028 202.4716 47.178878 202.47192 47.178779 202.47193 47.178779 202.47232 47.178813 202.47228 47.179004 202.47525 47.182954 202.47508 47.18296 202.47508 47.182844 202.47524 47.182838 202.47525 47.182954 202.4968 47.197614 202.49661 47.19763 202.49662 47.197501 202.49679 47.197496 202.4968 47.197614 202.48131 47.192724 202.48122 47.192734 202.48123 47.192673 202.48137 47.192625 202.48131 47.192724 202.48068 47.19263 202.48049 47.192623 202.48045 47.192489 202.48064 47.192511 202.48068 47.19263 202.46134 47.181136 202.46124 47.181149 202.46122 47.181061 202.46134 47.181072 202.46134 47.181136 202.48261 47.194734 202.48247 47.194947 202.48222 47.194926 202.48219 47.194768 202.48247 47.194646 202.4827 47.194569 202.48261 47.194734 202.47504 47.190005 202.47492 47.190225 202.47455 47.190292 202.47443 47.190273 202.47436 47.190178 202.47435 47.190003 202.47439 47.189893 202.47464 47.18975 202.47469 47.18975 202.47507 47.189797 202.47504 47.190005 202.46101 47.181233 202.46065 47.181259 202.46065 47.181007 202.46101 47.180991 202.46101 47.181233 202.47369 47.189456 202.4737 47.189509 202.4737 47.189765 202.47351 47.189946 202.4732 47.190047 202.47299 47.190034 202.47282 47.189829 202.47255 47.189703 202.47232 47.189552 202.4723 47.189485 202.47242 47.189477 202.47273 47.189455 202.47298 47.189389 202.47306 47.189363 202.47339 47.189272 202.47362 47.18924 202.47369 47.189456 202.46055 47.181245 202.46025 47.181231 202.46024 47.181048 202.46051 47.181033 202.46055 47.181245 202.48091 47.19427 202.4809 47.19427 202.4809 47.194264 202.48091 47.194262 202.48091 47.19427 202.47697 47.192106 202.47677 47.19212 202.47648 47.192099 202.47657 47.192264 202.47657 47.192456 202.47625 47.1925 202.47619 47.192515 202.4758 47.192513 202.47566 47.192484 202.47538 47.192496 202.47508 47.19239 202.47502 47.192382 202.47501 47.192441 202.47526 47.192581 202.47554 47.192705 202.47554 47.192705 202.47595 47.192726 202.47619 47.192873 202.47637 47.192929 202.47652 47.192953 202.47681 47.193065 202.47705 47.193215 202.47731 47.193344 202.47752 47.193517 202.47776 47.193663 202.47791 47.193878 202.47819 47.193996 202.47823 47.194091 202.47823 47.194295 202.47828 47.194418 202.47837 47.194513 202.47839 47.194787 202.47813 47.194926 202.47777 47.194961 202.47772 47.194969 202.47751 47.195138 202.47751 47.195153 202.47748 47.195419 202.47725 47.195574 202.47703 47.195504 202.47666 47.195502 202.47675 47.195713 202.47687 47.195932 202.47686 47.195958 202.47673 47.196143 202.47645 47.19626 202.47644 47.196263 202.47611 47.196357 202.47588 47.196513 202.47574 47.196723 202.47574 47.196783 202.47595 47.196953 202.47613 47.196964 202.47641 47.196939 202.47657 47.19694 202.47677 47.197002 202.47701 47.197149 202.47706 47.197251 202.47698 47.197496 202.47698 47.197497 202.47708 47.197747 202.47709 47.197867 202.47679 47.197961 202.47677 47.197965 202.47677 47.197975 202.477 47.198127 202.47716 47.19834 202.47718 47.198524 202.47712 47.198696 202.47726 47.198872 202.477 47.198777 202.47674 47.198846 202.47644 47.198956 202.47647 47.199175 202.47646 47.199269 202.47646 47.199507 202.47649 47.199584 202.47644 47.199846 202.47644 47.199852 202.47632 47.200079 202.47618 47.200286 202.4761 47.200424 202.47604 47.2005 202.47594 47.200739 202.4757 47.200719 202.47557 47.200509 202.47557 47.20049 202.47555 47.200492 202.47523 47.200592 202.47493 47.200706 202.47472 47.200875 202.47455 47.201065 202.47428 47.201114 202.47435 47.200942 202.47433 47.20075 202.47428 47.200595 202.47458 47.200572 202.47474 47.200587 202.47472 47.200463 202.47452 47.200448 202.47432 47.200438 202.47407 47.200294 202.47384 47.20014 202.47375 47.199966 202.47382 47.19983 202.47389 47.199754 202.47384 47.199488 202.47381 47.199406 202.47384 47.199165 202.47348 47.199202 202.47323 47.199346 202.47297 47.199482 202.47297 47.199483 202.47297 47.199478 202.47287 47.199227 202.47265 47.19928 202.47238 47.199411 202.47241 47.199573 202.47248 47.199775 202.47248 47.199842 202.47241 47.200026 202.47218 47.20018 202.472 47.200368 202.47183 47.200561 202.47153 47.200673 202.47132 47.20084 202.47114 47.200833 202.47104 47.200665 202.47099 47.20062 202.47092 47.200345 202.47064 47.200224 202.4704 47.200078 202.47005 47.200008 202.46982 47.199856 202.46976 47.199865 202.46974 47.199916 202.46992 47.200107 202.46986 47.200227 202.46971 47.200433 202.46949 47.200424 202.46924 47.200442 202.46929 47.200575 202.46948 47.200593 202.46973 47.20057 202.47003 47.200635 202.4701 47.200626 202.47047 47.200675 202.47073 47.200809 202.47082 47.201068 202.4708 47.201117 202.47063 47.201306 202.4707 47.201485 202.47071 47.201658 202.47037 47.201744 202.47035 47.20174 202.47028 47.201689 202.47017 47.201551 202.46995 47.201383 202.46979 47.201382 202.4696 47.20132 202.46932 47.201202 202.4691 47.20104 202.46899 47.200884 202.46902 47.200776 202.46881 47.200604 202.46847 47.200529 202.46833 47.200305 202.46814 47.200351 202.46791 47.20029 202.46768 47.200136 202.46743 47.199993 202.46723 47.199814 202.46696 47.199689 202.46669 47.199563 202.46646 47.19941 202.46617 47.199298 202.46591 47.199164 202.4657 47.198998 202.46543 47.198866 202.46519 47.198724 202.46495 47.198572 202.46475 47.198398 202.46452 47.198243 202.46428 47.19809 202.46402 47.197957 202.46378 47.197812 202.46357 47.197642 202.46335 47.197476 202.46315 47.197298 202.46292 47.197143 202.46272 47.19697 202.46269 47.196944 202.46259 47.196737 202.46237 47.196743 202.46221 47.196694 202.46213 47.196597 202.46214 47.196417 202.46195 47.196235 202.46183 47.196109 202.46179 47.196027 202.46189 47.195843 202.46203 47.195636 202.46202 47.195531 202.46194 47.19528 202.46194 47.195267 202.46188 47.195244 202.46162 47.195181 202.46163 47.195083 202.46185 47.194922 202.46183 47.1947 202.46177 47.194577 202.46207 47.194461 202.46219 47.194433 202.46238 47.194355 202.46239 47.194282 202.46232 47.194018 202.46232 47.194013 202.46248 47.193819 202.46275 47.19369 202.46276 47.193686 202.46287 47.193763 202.46298 47.193851 202.46317 47.194034 202.46323 47.194289 202.46324 47.19431 202.46346 47.194473 202.46369 47.194625 202.46372 47.194892 202.46374 47.194916 202.46375 47.194917 202.46399 47.194763 202.46398 47.194737 202.46375 47.194584 202.46364 47.194338 202.46364 47.19425 202.46374 47.194013 202.46389 47.193827 202.46358 47.193732 202.46357 47.193603 202.46371 47.193633 202.46397 47.193555 202.46405 47.193386 202.46406 47.193315 202.46427 47.193145 202.4643 47.192875 202.4643 47.192863 202.46453 47.192706 202.46464 47.192478 202.46494 47.192399 202.46498 47.192392 202.46522 47.192243 202.46523 47.192187 202.46517 47.191911 202.46517 47.191904 202.46536 47.191732 202.46558 47.191568 202.46581 47.191417 202.46586 47.191398 202.46613 47.191522 202.46637 47.191464 202.46657 47.191293 202.4667 47.191104 202.4667 47.191074 202.46674 47.191074 202.46714 47.191098 202.46739 47.191239 202.46763 47.191388 202.46772 47.19141 202.46771 47.191333 202.46758 47.191102 202.4676 47.191037 202.46762 47.19075 202.46762 47.190747 202.46775 47.190529 202.46795 47.190501 202.4681 47.190453 202.46841 47.190485 202.46863 47.190651 202.46869 47.190822 202.46868 47.190938 202.46886 47.19113 202.46911 47.191086 202.46931 47.190906 202.46945 47.190697 202.46945 47.190696 202.46936 47.190439 202.4693 47.190301 202.46949 47.190124 202.4698 47.190017 202.46998 47.18998 202.4702 47.18997 202.47039 47.19 202.47076 47.190051 202.47074 47.190305 202.47077 47.190373 202.47095 47.190563 202.47127 47.19064 202.47129 47.19064 202.47163 47.190563 202.47183 47.190567 202.47216 47.190643 202.47217 47.1909 202.47195 47.191063 202.47197 47.191112 202.47201 47.191102 202.47239 47.191036 202.47251 47.191039 202.47277 47.190976 202.47303 47.19098 202.47332 47.191092 202.47339 47.191064 202.47344 47.191001 202.47353 47.190853 202.47365 47.190849 202.47394 47.190957 202.47416 47.191121 202.47445 47.191231 202.47471 47.191364 202.47496 47.191447 202.47504 47.191448 202.47513 47.191556 202.47522 47.191634 202.4753 47.191661 202.47555 47.191716 202.47588 47.1918 202.47616 47.191916 202.47626 47.191963 202.47646 47.191786 202.47671 47.191839 202.47693 47.191998 202.47697 47.192106 202.45955 47.181214 202.45939 47.181215 202.45939 47.181117 202.45953 47.18111 202.45955 47.181214 202.46844 47.187076 202.46816 47.187096 202.46817 47.186903 202.46843 47.186894 202.46844 47.187076 202.4825 47.19616 202.4823 47.196167 202.48231 47.196043 202.48248 47.196032 202.4825 47.19616 202.47002 47.188661 202.47 47.188663 202.47 47.188649 202.47002 47.188647 202.47002 47.188661 202.48138 47.196057 202.48111 47.196069 202.48115 47.195912 202.48133 47.195909 202.48138 47.196057 202.48087 47.195742 202.48063 47.19577 202.48067 47.195617 202.48083 47.195626 202.48087 47.195742 202.4797 47.195008 202.47945 47.19515 202.47933 47.195106 202.47927 47.195039 202.47951 47.194889 202.47961 47.194903 202.4797 47.195008 202.47107 47.189615 202.47091 47.189619 202.47093 47.18953 202.47103 47.189529 202.47107 47.189615 202.49359 47.203984 202.49326 47.204012 202.49327 47.203788 202.49357 47.20378 202.49359 47.203984 202.48423 47.198136 202.48392 47.198222 202.48408 47.198048 202.48418 47.198031 202.48423 47.198136 202.48135 47.19634 202.48137 47.196526 202.4817 47.196607 202.48192 47.19677 202.4822 47.196892 202.48222 47.197183 202.48201 47.197347 202.48162 47.197407 202.48177 47.197531 202.48178 47.197802 202.48136 47.197837 202.48113 47.197684 202.48099 47.197458 202.48097 47.197297 202.48119 47.197136 202.48126 47.196938 202.48125 47.196874 202.48118 47.196672 202.48104 47.196446 202.48104 47.196445 202.48115 47.196214 202.48136 47.196213 202.48135 47.19634 202.48046 47.195783 202.48016 47.195894 202.48016 47.196119 202.48035 47.196303 202.48035 47.196315 202.48035 47.196615 202.48008 47.196743 202.47976 47.196743 202.4795 47.196606 202.47943 47.196338 202.47967 47.196189 202.4797 47.196135 202.47966 47.195879 202.47968 47.195825 202.47955 47.195814 202.47927 47.195802 202.47932 47.19567 202.47944 47.195443 202.47965 47.195278 202.47998 47.195278 202.4801 47.195515 202.4804 47.195617 202.48046 47.195783 202.47866 47.19466 202.47859 47.194676 202.47858 47.19461 202.47868 47.194614 202.47866 47.19466 202.48422 47.198431 202.48408 47.198429 202.48392 47.198242 202.48426 47.1983 202.48422 47.198431 202.4845 47.199206 202.48431 47.199387 202.48402 47.199449 202.48407 47.199238 202.48437 47.199124 202.48444 47.199138 202.4845 47.199206 202.47873 47.195602 202.47868 47.195585 202.47868 47.19557 202.4787 47.195572 202.47873 47.195602 202.48394 47.199152 202.48391 47.199207 202.48396 47.199468 202.48362 47.199423 202.48344 47.199226 202.48335 47.199086 202.48327 47.199026 202.48328 47.198739 202.48368 47.198726 202.48389 47.198896 202.48394 47.199152 202.47788 47.195368 202.47767 47.19536 202.47757 47.195177 202.47785 47.195228 202.47788 47.195368 202.47913 47.196446 202.47885 47.196438 202.47871 47.196218 202.4787 47.196179 202.47881 47.19614 202.47914 47.196222 202.47913 47.196446 202.47779 47.195612 202.47758 47.195781 202.47745 47.195998 202.47725 47.195992 202.47689 47.195935 202.47695 47.195683 202.47731 47.195626 202.47747 47.195707 202.47775 47.195584 202.47782 47.195575 202.47779 47.195612 202.47099 47.191359 202.47084 47.191569 202.47084 47.191619 202.47089 47.1916 202.47134 47.191578 202.47134 47.191578 202.47134 47.191578 202.47113 47.191404 202.47099 47.191359 202.46853 47.18982 202.46844 47.189818 202.46844 47.189765 202.46864 47.189666 202.46853 47.18982 202.48453 47.200124 202.48442 47.200129 202.48428 47.199965 202.48461 47.199992 202.48453 47.200124 202.49845 47.209413 202.49826 47.209423 202.49826 47.209296 202.49844 47.209294 202.49845 47.209413 202.46782 47.190276 202.46782 47.190276 202.46782 47.190275 202.46782 47.190275 202.46782 47.190276 202.47557 47.197212 202.47514 47.197224 202.47511 47.197227 202.47474 47.197292 202.4748 47.197482 202.47478 47.197618 202.4747 47.197867 202.47467 47.197901 202.47487 47.198077 202.47501 47.198061 202.47501 47.197975 202.47504 47.197783 202.47507 47.197602 202.47504 47.197483 202.47524 47.197481 202.47541 47.19768 202.47542 47.197721 202.47544 47.197983 202.47544 47.198031 202.47549 47.198273 202.4755 47.198367 202.47558 47.198529 202.47576 47.198532 202.47572 47.198427 202.47571 47.198199 202.47603 47.198195 202.47618 47.198194 202.4762 47.198071 202.47598 47.19791 202.47568 47.197807 202.47568 47.197586 202.47601 47.197488 202.47587 47.197338 202.47561 47.197205 202.47557 47.197212 202.48427 47.20355 202.4842 47.203547 202.48417 47.203486 202.48431 47.203465 202.48427 47.20355 202.47626 47.198541 202.4763 47.198648 202.47642 47.198645 202.47654 47.198472 202.47626 47.198541 202.47769 47.199736 202.47746 47.199741 202.47745 47.19959 202.47766 47.199598 202.47769 47.199736 202.47873 47.200686 202.47836 47.2007 202.47823 47.200472 202.47821 47.20036 202.47837 47.20037 202.47871 47.200447 202.47873 47.200686 202.4747 47.199063 202.47476 47.199132 202.47479 47.199123 202.47479 47.199109 202.4747 47.199063 202.47383 47.198823 202.47377 47.198889 202.47387 47.198843 202.47387 47.198819 202.47383 47.198823 202.47433 47.199431 202.47428 47.199486 202.47419 47.199643 202.47429 47.199805 202.47455 47.199939 202.47462 47.199911 202.47461 47.199893 202.47448 47.199665 202.47438 47.199462 202.47437 47.199423 202.47433 47.199431 202.4648 47.193473 202.46479 47.193485 202.46481 47.193481 202.46481 47.193472 202.4648 47.193473 202.47743 47.201666 202.47744 47.201707 202.47765 47.201879 202.47783 47.202072 202.4779 47.202262 202.47795 47.202306 202.47795 47.202593 202.47758 47.202663 202.47739 47.20272 202.47709 47.202621 202.47698 47.202371 202.47696 47.202275 202.47685 47.202142 202.47662 47.201986 202.4764 47.201824 202.4764 47.201625 202.47671 47.201517 202.47687 47.201318 202.47715 47.201271 202.47742 47.2014 202.47743 47.201666 202.4765 47.202282 202.47623 47.202277 202.47612 47.202049 202.47652 47.202061 202.4765 47.202282 202.47782 47.203407 202.47777 47.203414 202.47776 47.203373 202.47784 47.203366 202.47782 47.203407 202.47479 47.201515 202.47459 47.201534 202.47436 47.201384 202.4743 47.201207 202.47455 47.201243 202.47479 47.201388 202.47479 47.201515 202.47405 47.201349 202.47393 47.201375 202.47377 47.201179 202.47408 47.201264 202.47405 47.201349 202.47309 47.200749 202.47295 47.200963 202.47266 47.201014 202.47277 47.200849 202.47298 47.200686 202.47311 47.200682 202.47309 47.200749 202.47368 47.201419 202.47348 47.201378 202.47351 47.201312 202.47376 47.201175 202.47368 47.201419 202.47588 47.203095 202.47556 47.203099 202.47556 47.202895 202.47591 47.202837 202.47588 47.203095 202.48329 47.208324 202.48299 47.208347 202.48274 47.208201 202.48248 47.208118 202.48239 47.20814 202.48236 47.208041 202.48237 47.207824 202.48241 47.207774 202.48245 47.207765 202.48276 47.207863 202.48309 47.207946 202.4833 47.208116 202.48329 47.208324 202.4713 47.201127 202.47116 47.201144 202.47111 47.201009 202.47137 47.200989 202.4713 47.201127 202.47519 47.20386 202.47498 47.203851 202.47498 47.203728 202.47516 47.203718 202.47519 47.20386 202.46816 47.199763 202.4681 47.199828 202.4682 47.199792 202.46818 47.199766 202.46816 47.199763 202.46119 47.195708 202.46108 47.1959 202.46109 47.195947 202.46105 47.195926 202.46078 47.195802 202.46045 47.195716 202.46045 47.195541 202.46078 47.195451 202.46082 47.195445 202.46113 47.195538 202.46119 47.195708 202.48306 47.210271 202.48303 47.210267 202.48303 47.210253 202.48305 47.210251 202.48306 47.210271 202.47174 47.204096 202.47152 47.20426 202.47133 47.20427 202.47123 47.20408 202.47124 47.204009 202.47134 47.203849 202.47161 47.203741 202.47173 47.203972 202.47174 47.204096 202.47529 47.206911 202.4752 47.207157 202.4749 47.207164 202.47488 47.206955 202.47521 47.206866 202.47529 47.206879 202.47529 47.206911 202.48079 47.215737 202.48042 47.215778 202.48045 47.215525 202.48078 47.215512 202.48079 47.215737 202.47182 47.211327 202.47147 47.211324 202.47142 47.211081 202.47182 47.211064 202.47182 47.211327 202.46766 47.21292 202.4675 47.213117 202.46724 47.213145 202.46698 47.213093 202.46685 47.213108 202.46688 47.213028 202.467 47.212807 202.46717 47.212611 202.46753 47.212608 202.46766 47.212838 202.46766 47.21292 202.46698 47.213393 202.46689 47.213403 202.46685 47.213308 202.46701 47.213316 202.46698 47.213393 202.48103 47.168616 202.48087 47.168811 202.48055 47.168826 202.48026 47.168717 202.48024 47.168421 202.48047 47.168266 202.48088 47.168259 202.48102 47.168481 202.48103 47.168616 202.49358 47.177657 202.49325 47.177663 202.49324 47.177443 202.49357 47.177425 202.49358 47.177657 202.49552 47.184852 202.49538 47.184874 202.49541 47.18478 202.49551 47.184776 202.49552 47.184852 202.49716 47.188564 202.49697 47.188576 202.49698 47.188456 202.49715 47.188446 202.49716 47.188564 202.50469 47.194765 202.50442 47.194788 202.50436 47.194559 202.50465 47.194614 202.50469 47.194765 202.50365 47.194412 202.50361 47.19441 202.50361 47.194389 202.50364 47.194388 202.50365 47.194412 202.47218 47.178937 202.47195 47.179097 202.47194 47.1791 202.47191 47.179069 202.47214 47.178917 202.47218 47.17892 202.47218 47.178937 202.47517 47.182901 202.47516 47.182901 202.47516 47.182894 202.47517 47.182894 202.47517 47.182901 202.49673 47.197569 202.49669 47.197573 202.49669 47.197545 202.49673 47.197544 202.49673 47.197569 202.46097 47.181206 202.46069 47.181226 202.4607 47.181035 202.46097 47.181022 202.46097 47.181206 202.47477 47.190132 202.4746 47.190144 202.47459 47.190021 202.47479 47.190001 202.47477 47.190132 202.46047 47.181194 202.46031 47.181186 202.4603 47.181088 202.46045 47.18108 202.46047 47.181194 202.47334 47.18984 202.47319 47.189881 202.47311 47.189694 202.47338 47.189742 202.47334 47.18984 202.46837 47.187033 202.46823 47.187043 202.46823 47.186945 202.46837 47.186941 202.46837 47.187033 202.4824 47.196098 202.48239 47.196099 202.48239 47.196093 202.4824 47.196092 202.4824 47.196098 202.47637 47.192332 202.47606 47.192434 202.4759 47.192434 202.47555 47.192369 202.47544 47.192348 202.47518 47.192316 202.47484 47.192273 202.47476 47.192521 202.47483 47.192578 202.47486 47.192584 202.47517 47.192652 202.47541 47.192797 202.47567 47.19293 202.47586 47.192911 202.47609 47.192946 202.47643 47.19302 202.47665 47.193183 202.47684 47.193368 202.47709 47.193511 202.47728 47.193693 202.47736 47.193846 202.47738 47.193949 202.47739 47.194163 202.4771 47.19428 202.47705 47.194517 202.47731 47.194412 202.47768 47.194373 202.47783 47.194592 202.47782 47.194732 202.47755 47.194797 202.47749 47.194823 202.47708 47.194816 202.477 47.194548 202.47672 47.194432 202.47647 47.194486 202.47645 47.194631 202.47653 47.194821 202.47656 47.194877 202.47669 47.195108 202.47669 47.19522 202.47646 47.195377 202.47643 47.195626 202.47644 47.195667 202.47637 47.195665 202.47595 47.195657 202.4761 47.195869 202.47616 47.19609 202.47578 47.196147 202.47569 47.196174 202.47539 47.196208 202.47546 47.196337 202.47543 47.19653 202.47532 47.19676 202.47532 47.19677 202.47525 47.197016 202.47495 47.197043 202.47486 47.197071 202.47454 47.19717 202.47442 47.197392 202.47439 47.197453 202.47455 47.197665 202.47454 47.197765 202.47428 47.197865 202.47421 47.197863 202.47401 47.198034 202.47399 47.198074 202.47397 47.19831 202.47369 47.198299 202.4735 47.198318 202.47318 47.198416 202.47321 47.198653 202.47318 47.198716 202.47308 47.198951 202.47282 47.198941 202.4726 47.198952 202.47246 47.199162 202.47213 47.199255 202.47206 47.199502 202.47206 47.199511 202.47185 47.199675 202.47173 47.199903 202.47169 47.200098 202.47167 47.200163 202.47157 47.200403 202.47125 47.200426 202.47126 47.200205 202.47137 47.200011 202.4713 47.199933 202.47122 47.199796 202.4711 47.199809 202.47074 47.199828 202.47051 47.199737 202.47044 47.19972 202.47004 47.199695 202.46985 47.199512 202.46964 47.199494 202.46956 47.19972 202.46956 47.199743 202.4695 47.200002 202.4694 47.200166 202.46938 47.200231 202.4693 47.200236 202.46908 47.200079 202.46871 47.200025 202.46872 47.199814 202.46888 47.199618 202.46894 47.19953 202.46879 47.199561 202.46851 47.199686 202.46828 47.199689 202.46798 47.199652 202.46788 47.199662 202.46752 47.199606 202.46727 47.199466 202.46722 47.199474 202.46698 47.199624 202.46674 47.199526 202.46651 47.19937 202.46621 47.199271 202.46594 47.199143 202.46573 47.198972 202.46546 47.198846 202.46521 47.198705 202.46499 47.198547 202.46482 47.198341 202.46457 47.198206 202.46434 47.19805 202.46409 47.197909 202.46383 47.197775 202.46363 47.197594 202.46344 47.197415 202.46343 47.197405 202.46328 47.197208 202.4632 47.196966 202.4632 47.196937 202.46302 47.196854 202.46293 47.196811 202.46293 47.196793 202.46285 47.196545 202.46262 47.196393 202.46241 47.196224 202.46231 47.196109 202.46228 47.19599 202.46235 47.195833 202.46238 47.195591 202.46238 47.195553 202.46249 47.195511 202.46265 47.195426 202.46265 47.195396 202.46258 47.195383 202.46228 47.195345 202.46225 47.19517 202.46229 47.195006 202.46211 47.194816 202.46211 47.194785 202.46215 47.194513 202.4625 47.194432 202.46256 47.194172 202.46295 47.194194 202.46299 47.194442 202.46271 47.194565 202.46271 47.194699 202.46296 47.194717 202.46314 47.194535 202.4633 47.194585 202.46334 47.194657 202.46343 47.194814 202.4636 47.195017 202.46394 47.195031 202.46419 47.194891 202.46412 47.194636 202.46401 47.194479 202.46399 47.194403 202.46399 47.194167 202.46405 47.194035 202.4641 47.193937 202.4642 47.193697 202.46445 47.193737 202.46466 47.193906 202.46469 47.194006 202.46478 47.194142 202.46488 47.194125 202.46512 47.193972 202.46509 47.193917 202.46506 47.193636 202.46519 47.19352 202.46524 47.193449 202.46528 47.193447 202.46565 47.1935 202.46586 47.19354 202.46609 47.1935 202.46628 47.193506 202.46627 47.193371 202.46627 47.1932 202.46623 47.193073 202.46629 47.192908 202.46656 47.192831 202.46662 47.192819 202.46663 47.192776 202.46666 47.192545 202.46663 47.192451 202.46664 47.192232 202.46685 47.192063 202.46693 47.191907 202.46661 47.191821 202.46654 47.191574 202.46675 47.191403 202.46698 47.19125 202.46731 47.191297 202.46752 47.191468 202.46759 47.191629 202.46742 47.191819 202.46741 47.191878 202.4675 47.191874 202.46778 47.191751 202.46806 47.191625 202.46817 47.191641 202.46848 47.19159 202.46872 47.19156 202.46879 47.19178 202.46879 47.191832 202.46886 47.191823 202.46923 47.191837 202.46945 47.191993 202.46956 47.191962 202.46985 47.191845 202.47007 47.191861 202.47032 47.192001 202.47053 47.191972 202.47074 47.191803 202.47106 47.191705 202.47117 47.191699 202.47149 47.191675 202.47149 47.191467 202.47139 47.191314 202.47171 47.191212 202.47182 47.191221 202.4721 47.191158 202.47238 47.191136 202.47251 47.191115 202.4729 47.191077 202.47302 47.191311 202.47322 47.191261 202.4736 47.191205 202.47363 47.191216 202.47393 47.191293 202.47422 47.191285 202.47434 47.191313 202.47463 47.191422 202.47491 47.191542 202.47511 47.19172 202.47542 47.191814 202.47572 47.191921 202.47572 47.191921 202.47606 47.191992 202.47628 47.192159 202.47637 47.192332 202.49355 47.20396 202.4933 47.203982 202.49331 47.203811 202.49354 47.203805 202.49355 47.20396 202.47384 47.191644 202.47382 47.191693 202.47387 47.191667 202.47388 47.191649 202.47384 47.191644 202.48221 47.197173 202.48195 47.197312 202.4816 47.197334 202.48143 47.197136 202.48145 47.196998 202.48157 47.196776 202.48187 47.196811 202.48218 47.196903 202.48221 47.197173 202.47967 47.195589 202.47956 47.195588 202.47958 47.19553 202.47968 47.195503 202.47967 47.195589 202.47827 47.194713 202.47804 47.19476 202.47801 47.194554 202.47826 47.194594 202.47827 47.194713 202.4764 47.193544 202.47611 47.19358 202.47587 47.193516 202.47577 47.193505 202.47539 47.193467 202.4752 47.193395 202.47532 47.193514 202.47532 47.193771 202.47495 47.193788 202.47488 47.193794 202.47488 47.193838 202.47494 47.193832 202.47534 47.193826 202.47558 47.193974 202.47567 47.193984 202.47577 47.193836 202.47581 47.193772 202.47587 47.19376 202.47623 47.193738 202.47632 47.193754 202.47632 47.193794 202.47625 47.194047 202.4763 47.194093 202.47647 47.194187 202.47677 47.194072 202.4769 47.193859 202.47688 47.193664 202.47665 47.19351 202.4764 47.193544 202.47205 47.190829 202.47181 47.190905 202.47182 47.190681 202.47205 47.190724 202.47205 47.190829 202.47165 47.190876 202.47146 47.19084 202.47147 47.190763 202.47161 47.190726 202.47165 47.190876 202.48029 47.196577 202.48 47.196692 202.47983 47.196693 202.47955 47.196569 202.47951 47.196383 202.4798 47.196268 202.47998 47.196251 202.48029 47.196352 202.48029 47.196577 202.4727 47.191833 202.47271 47.191864 202.47277 47.191876 202.47274 47.191844 202.4727 47.191833 202.47096 47.190746 202.47103 47.190829 202.47096 47.191043 202.4707 47.191178 202.47052 47.191363 202.47029 47.191521 202.47006 47.191545 202.47005 47.191374 202.47011 47.191182 202.4698 47.191213 202.46965 47.19142 202.46958 47.191578 202.46959 47.191681 202.46942 47.191697 202.46918 47.191547 202.4692 47.191441 202.46935 47.191231 202.46961 47.191093 202.46959 47.190917 202.46963 47.190808 202.46973 47.190572 202.46999 47.190439 202.47034 47.190354 202.47036 47.19035 202.47063 47.190477 202.47084 47.190647 202.47096 47.190746 202.48387 47.19911 202.48354 47.199155 202.4833 47.199009 202.4833 47.198753 202.48366 47.198742 202.48384 47.198935 202.48387 47.19911 202.48174 47.19778 202.4814 47.197808 202.48123 47.197607 202.48118 47.19743 202.48146 47.197436 202.48174 47.197558 202.48174 47.19778 202.47729 47.195 202.47727 47.195002 202.47725 47.194976 202.47735 47.19494 202.47729 47.195 202.48379 47.199357 202.48372 47.199348 202.48365 47.199275 202.48377 47.199306 202.48379 47.199357 202.47565 47.194571 202.47565 47.194575 202.47563 47.19486 202.47551 47.195005 202.4758 47.195112 202.47598 47.195304 202.47621 47.195221 202.47617 47.195163 202.4761 47.194891 202.47609 47.19485 202.47593 47.194692 202.47565 47.19457 202.47565 47.194571 202.49838 47.209369 202.49833 47.209371 202.49833 47.209341 202.49838 47.209341 202.49838 47.209369 202.46816 47.190791 202.46799 47.190798 202.46803 47.190705 202.46817 47.190667 202.46816 47.190791 202.46842 47.191251 202.46823 47.191269 202.46809 47.191048 202.46809 47.191046 202.4681 47.191046 202.46842 47.19113 202.46842 47.191251 202.47674 47.197349 202.47674 47.19735 202.47673 47.197344 202.47674 47.197344 202.47674 47.197349 202.47608 47.197233 202.47602 47.197227 202.47599 47.197179 202.47608 47.197183 202.47608 47.197233 202.46612 47.192504 202.46612 47.192506 202.46599 47.192725 202.46572 47.192798 202.46546 47.192664 202.46547 47.192395 202.46567 47.192222 202.46597 47.192293 202.46612 47.192504 202.47868 47.200654 202.47841 47.200664 202.47833 47.200438 202.47866 47.200481 202.47868 47.200654 202.47624 47.199133 202.47602 47.199293 202.47587 47.199496 202.47591 47.199586 202.47587 47.199797 202.47563 47.199947 202.47533 47.200013 202.47516 47.199814 202.47509 47.19961 202.47533 47.19946 202.4755 47.199265 202.47571 47.199095 202.47601 47.198989 202.47623 47.199022 202.47624 47.199133 202.47546 47.199242 202.47506 47.199237 202.47517 47.199058 202.47532 47.199044 202.47546 47.199242 202.466 47.19333 202.46591 47.193311 202.46573 47.193157 202.46599 47.193254 202.466 47.19333 202.46569 47.193137 202.46533 47.193086 202.46512 47.19308 202.46495 47.193042 202.46487 47.192922 202.46483 47.192807 202.46487 47.192622 202.46512 47.19259 202.46543 47.192691 202.46563 47.19287 202.46569 47.193137 202.46587 47.193843 202.46592 47.193952 202.46619 47.194077 202.46623 47.194068 202.4663 47.194002 202.46616 47.193774 202.46587 47.193843 202.46442 47.193536 202.46421 47.193589 202.46429 47.193454 202.46443 47.193431 202.46442 47.193536 202.47723 47.201841 202.47719 47.201896 202.47744 47.202032 202.47772 47.202154 202.47792 47.202334 202.47791 47.20257 202.47755 47.202602 202.47728 47.202474 202.4771 47.202285 202.47697 47.202054 202.47676 47.201885 202.4765 47.201756 202.4765 47.201683 202.47664 47.201647 202.47684 47.201597 202.47718 47.201577 202.47723 47.201841 202.47127 47.198121 202.47126 47.198138 202.47129 47.19813 202.47137 47.198058 202.47127 47.198121 202.4764 47.202223 202.47631 47.202221 202.47627 47.20214 202.47641 47.202144 202.4764 47.202223 202.47038 47.199057 202.47034 47.199149 202.47035 47.19934 202.47041 47.19942 202.47066 47.199533 202.47052 47.199336 202.47052 47.199143 202.47046 47.199055 202.47038 47.199057 202.47579 47.20304 202.47564 47.203042 202.47564 47.202942 202.47581 47.202914 202.47579 47.20304 202.47095 47.200011 202.47094 47.200008 202.47089 47.199976 202.47097 47.199981 202.47095 47.200011 202.48323 47.208287 202.48305 47.208301 202.48279 47.208167 202.48271 47.20796 202.48304 47.207985 202.48324 47.208161 202.48323 47.208287 202.46405 47.1963 202.46405 47.19631 202.46407 47.196313 202.46407 47.196293 202.46405 47.1963 202.46374 47.196702 202.46381 47.196811 202.46391 47.196811 202.46392 47.196735 202.46374 47.196702 202.47 47.200916 202.46992 47.20108 202.46996 47.201192 202.46979 47.201181 202.46957 47.201244 202.46937 47.201167 202.46915 47.201001 202.46913 47.20097 202.46922 47.20095 202.46956 47.200936 202.46971 47.200731 202.46994 47.200741 202.47 47.200916 202.46824 47.200113 202.46798 47.200241 202.46815 47.200059 202.46825 47.200037 202.46824 47.200113 202.46071 47.195708 202.46052 47.195662 202.46052 47.195589 202.46067 47.195551 202.46071 47.195708 202.47514 47.207121 202.47495 47.207126 202.47494 47.206992 202.47519 47.206947 202.47514 47.207121 202.48076 47.215715 202.48046 47.215748 202.48049 47.215545 202.48074 47.215535 202.48076 47.215715 202.47177 47.211297 202.47151 47.211295 202.47148 47.211113 202.47177 47.2111 202.47177 47.211297 202.46755 47.212847 202.46717 47.212875 202.46725 47.212661 202.46746 47.212659 202.46755 47.212847 202.46742 47.21307 202.46733 47.213081 202.4672 47.212929 202.46751 47.212947 202.46742 47.21307 green 1 4 block 5 linear 1000 zscale -1 66.151024 -1 15.7878 32.5755 49.3633 66.151 ����������������������������������������������������������������������������������saods9/tests/xpa/crop.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000110 11716566011 015767� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 978 970 356 308 13:29:52.908 +47:11:38.19 35.279606 30.522805 none ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/crosshair.xpa����������������������������������������������������������������������000644 �000765 �000000 �00000000052 11715044514 017024� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 801 801 13:29:55.287 +47:11:37.73 none ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/cube.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000024 12511563722 015746� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 0.5 2 none 123 no ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/data.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000001373 11232370250 015740� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������178 167 181 170 188 179 170 182 182 903,1043 = 178 901,1041 = 179 899,1041 = 170 903,1039 = 188 903,1041 = 182 901,1043 = 182 899,1043 = 170 901,1039 = 181 899,1039 = 167 178 170 178 155 182 161 181 179 182 168 170 172 172 188 167 183 202.470721097,47.196698184 = 178 202.470790293,47.1968910411 = 170 202.470671024,47.196816497 = 178 202.470556536,47.1968197453 = 155 202.470725878,47.1967759765 = 182 202.47061139,47.1967792249 = 161 202.470840366,47.196772728 = 181 202.470785512,47.1968132486 = 179 202.470730658,47.1968537691 = 182 202.470666243,47.1967387045 = 168 202.470845146,47.1968505206 = 170 202.470735439,47.1969315616 = 172 202.47061617,47.1968570175 = 172 202.470780731,47.196735456 = 188 202.4709,47.19681 = 167 202.470675805,47.1968942895 = 183 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/dsssao.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000076 11241073001 016314� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������30 30 arcsec no new m51 00:42:44.404 +41:16:08.78 sexagesimal ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/file.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000016 12113731142 015737� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������data/img.fits ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/fits.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000027421 12113733451 016003� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 800 800 800 800 1 -32 image 224.1726 224.04129 SIMPLE = T / Standard FITS BITPIX = -32 / bits/pixel NAXIS = 2 / number of axes NAXIS1 = 800 / x axis dimension NAXIS2 = 800 / y axis dimension EXTEND = F / File may contain extensions IRAF-TLM= '11:49:54 (09/03/1998)' / Time of last modification OBJECT = 'TT_HST3728A[1/4]' / ORIGIN = 'KPNO-IRAF' / DATE = '04/01/99' / IRAFNAME= 'tt_scaled3728n' / NAME OF IRAF IMAGE FILE IRAF-MAX= 2.706860E5 / DATA MAX IRAF-MIN= -2.404023E2 / DATA MIN IRAF-BPX= 32 / DATA BITS/PIXEL IRAFTYPE= 'REAL ' / PIXEL TYPE CRVAL1 = 47.2097404068078 CRVAL2 = 202.481101229926 CRPIX1 = 198.5000000 / reference point CRPIX2 = 607.7500000 / reference point CD1_1 = -3.7266660e-05 / WCS matrix value CD1_2 = 4.0525440e-05 / WCS matrix value CD2_1 = -4.0525440e-05 / WCS matrix value CD2_2 = -3.7266660e-05 / WCS matrix value DATAMIN = -240.4023 DATAMAX = 270686. MIR_REVR= T ORIENTAT= -131.863 FILLCNT = 0 ERRCNT = 0 FPKTTIME= 49741.978982527 LPKTTIME= 49741.9791503511 CTYPE1 = 'DEC--TAN' CTYPE2 = 'RA---TAN' DETECTOR= 4 DEZERO = 311.8649 BIASEVEN= 311.8772 BIASODD = 311.8526 GOODMIN = -240.4023 GOODMAX = 270686. DATAMEAN= 24.99208 GPIXELS = 626299 SOFTERRS= 0 CALIBDEF= 7126 STATICD = 0 ATODSAT = 18 DATALOST= 0 BADPIXEL= 0 WCSDIM = 2 LTV1 = 0.5000000 / IRAF ref. point LTV2 = 0.5000000 / IRAF ref. point LTM1_1 = 0.5000000 / IRAF matrix value LTM1_2 = 0.0000000e+00 / IRAF matrix value LTM2_2 = 0.5000000 / IRAF matrix value LTM2_1 = 0.0000000e+00 / IRAF matrix value WAT0_001= 'system=image ' WAT1_001= 'wtype=tan axtype=dec ' WAT2_001= 'wtype=tan axtype=ra ' HISTORY New copy of tt_hst3728a.c0h[1/4] HISTORY New copy of tt_mosaic3728d[-*,*] HISTORY New copy of tt_mosaiced3728b HISTORY New copy of tt_mosaiced3728b HISTORY New copy of tt_real3728h HISTORY New copy of tt_clean3728i HISTORY New copy of tt_median3728j HISTORY New copy of tt_gaussian3728k HISTORY New copy of tt_scaled3728n HISTORY New copy of tt_scaled3728n END SIMPLE = T / Standard FITS BITPIX = -32 / bits/pixel NAXIS = 2 / number of axes NAXIS1 = 800 / x axis dimension NAXIS2 = 800 / y axis dimension EXTEND = F / File may contain extensions IRAF-TLM= '11:49:54 (09/03/1998)' / Time of last modification OBJECT = 'TT_HST3728A[1/4]' / ORIGIN = 'KPNO-IRAF' / DATE = '04/01/99' / IRAFNAME= 'tt_scaled3728n' / NAME OF IRAF IMAGE FILE IRAF-MAX= 2.706860E5 / DATA MAX IRAF-MIN= -2.404023E2 / DATA MIN IRAF-BPX= 32 / DATA BITS/PIXEL IRAFTYPE= 'REAL ' / PIXEL TYPE CRVAL1 = 47.2097404068078 CRVAL2 = 202.481101229926 CRPIX1 = 198.5000000 / reference point CRPIX2 = 607.7500000 / reference point CD1_1 = -3.7266660e-05 / WCS matrix value CD1_2 = 4.0525440e-05 / WCS matrix value CD2_1 = -4.0525440e-05 / WCS matrix value CD2_2 = -3.7266660e-05 / WCS matrix value DATAMIN = -240.4023 DATAMAX = 270686. MIR_REVR= T ORIENTAT= -131.863 FILLCNT = 0 ERRCNT = 0 FPKTTIME= 49741.978982527 LPKTTIME= 49741.9791503511 CTYPE1 = 'DEC--TAN' CTYPE2 = 'RA---TAN' DETECTOR= 4 DEZERO = 311.8649 BIASEVEN= 311.8772 BIASODD = 311.8526 GOODMIN = -240.4023 GOODMAX = 270686. DATAMEAN= 24.99208 GPIXELS = 626299 SOFTERRS= 0 CALIBDEF= 7126 STATICD = 0 ATODSAT = 18 DATALOST= 0 BADPIXEL= 0 WCSDIM = 2 LTV1 = 0.5000000 / IRAF ref. point LTV2 = 0.5000000 / IRAF ref. point LTM1_1 = 0.5000000 / IRAF matrix value LTM1_2 = 0.0000000e+00 / IRAF matrix value LTM2_2 = 0.5000000 / IRAF matrix value LTM2_1 = 0.0000000e+00 / IRAF matrix value WAT0_001= 'system=image ' WAT1_001= 'wtype=tan axtype=dec ' WAT2_001= 'wtype=tan axtype=ra ' HISTORY New copy of tt_hst3728a.c0h[1/4] HISTORY New copy of tt_mosaic3728d[-*,*] HISTORY New copy of tt_mosaiced3728b HISTORY New copy of tt_mosaiced3728b HISTORY New copy of tt_real3728h HISTORY New copy of tt_clean3728i HISTORY New copy of tt_median3728j HISTORY New copy of tt_gaussian3728k HISTORY New copy of tt_scaled3728n HISTORY New copy of tt_scaled3728n END -32 -32 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/frame.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000114 11715044514 016120� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������none no yes no no no no yes yes no no no yes no no no no no no no yes no no ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/grid.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000360 11756512443 015764� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no analysis wcs fk5 sexagesimal yes blue 1 0 yes red 1 0 interior lll yes white 1 0 yes blue 1 0 yes helvetica normal roman 10 green interior 0 yes yes helvetica normal roman 12 black yes yes yes helvetica normal roman 10 black ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/iconify.xpa������������������������������������������������������������������������000644 �000765 �000000 �00000000003 11232370250 016454� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/iis.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000034 12113731142 015604� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������data/img.fits data/img.fits ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/lock.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000051 12527427332 015763� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������none none none none no no no no no no no ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/magnifier.xpa����������������������������������������������������������������������000644 �000765 �000000 �00000000020 11431034705 016757� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������white 4 yes yes ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/mask.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000010 11242614631 015752� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������red 1 0 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/minmax.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000012 12616732023 016314� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������scan scan ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/mode.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000005 12412620230 015737� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������none ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/nameserver.xpa���������������������������������������������������������������������000644 �000765 �000000 �00000000055 12131310156 017170� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������m51 simbad-cds degrees 202.469575 47.1952583 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/nan.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000006 11534242553 015604� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������white ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/orient.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000003 11232370251 016315� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������xy �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/pagesetup.xpa����������������������������������������������������������������������000644 �000765 �000000 �00000000024 11762201375 017025� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������portrait 100 letter ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/pan.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000045 11670473306 015614� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 801 801 13:29:55.287 +47:11:37.73 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/pixeltable.xpa���������������������������������������������������������������������000644 �000765 �000000 �00000000777 11232370251 017170� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ----------- ----------- ----------- ----------- ----------- | | | | | �saods9/tests/xpa/plot.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000460 12403657556 016023� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ap zoom yes no no no 1 100 %f yes no no no 1 100 %f no right helvetica 12 normal roman helvetica 9 normal roman helvetica 9 normal roman helvetica 10 normal roman helvetica 9 normal roman This is a Title X Axis Y Axis This is the Legend normal yes none yes red linear black 1 no yes no red 1 Dataset 1 2 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/prefs.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000023 12576612222 016147� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������white white 12 yes �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/preserve.xpa�����������������������������������������������������������������������000644 �000765 �000000 �00000000006 12231543054 016656� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no no ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/print.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000025 11533775540 016173� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������printer lp rgb 2 150 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/regions.xpa������������������������������������������������������������������������000644 �000765 �000000 �00000002527 12226046241 016503� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 physical circle(957,1027,40) # tag={foo} 3 yes yes no 10 30 j2000; circle 13:29:52.683 47:11:43.75 3.964" ;# Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 physical circle(957,1027,40) # tag={foo} # Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 # Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 physical circle(957,1027,40) # tag={foo} # Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 # Region file format: DS9 version 4.1 global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 ds9 physical fk5 degrees no circle green 1 nl foo �������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/rgb.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000057 12527427332 015613� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������red yes yes yes wcs no no no no no no no no no ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/rotate.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000002 11232370251 016312� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������0 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/scale.xpa��������������������������������������������������������������������������000644 �000765 �000000 �00000000056 12617220471 016122� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������linear 1000 -1 66.151024 zscale local 1 no no ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/single.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000013 12113740635 016305� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������yes no yes ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/smooth.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000016 11232370251 016332� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no gaussian 3 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/threads.xpa������������������������������������������������������������������������000644 �000765 �000000 �00000000002 11761437235 016463� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������8 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/tile.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000024 12520467360 015766� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������no grid automatic x ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/view.xpa���������������������������������������������������������������������������000644 �000765 �000000 �00000000120 12520761535 016001� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������horizontal yes yes yes yes yes no no yes yes no no no no yes no no yes yes yes ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/vla.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000102 12414573616 015614� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������30 30 arcsec no new first m51 13:29:52.37 +47:11:40.8 sexagesimal ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/vo.xpa�����������������������������������������������������������������������������000644 �000765 �000000 �00000000066 12464240610 015455� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������mime http://cxc.harvard.edu/chandraed/list.txt yes 15 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/wcs.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000033 11232370251 015614� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������wcs wcs fk5 sexagesimal no �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/web.xpa����������������������������������������������������������������������������000644 �000765 �000000 �00000000006 11236332365 015605� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������hvweb ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/xpa/zscale.xpa�������������������������������������������������������������������������000644 �000765 �000000 �00000000014 11232370251 016300� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������.25 600 120 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/2mass.samp������������������������������������������������������������������������000644 �000765 �000000 �00000001171 12412607652 016402� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} 2mass open set {} 2mass close set {} 2mass survey h get 2mass survey set {} 2mass size 30 30 arcsec get 2mass size set {} 2mass save no get 2mass save set {} 2mass frame new get 2mass frame set {} 2mass update frame set {} 2mass m51 set {} 2mass name m51 get 2mass name set {} 2mass name {} set {} 2mass coord 00:42:44.404 +41:16:08.78 sexagesimal get 2mass coord set {} 2mass update frame set {} mode crosshair set {} 2mass update crosshair set {} 2mass close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/3d.samp���������������������������������������������������������������������������000644 �000765 �000000 �00000001130 12424767443 015666� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} 3d open set {} 3d close set {} 3d set {} 3d view 45 30 get 3d view get 3d az get 3d el get 3d scale get 3d method get 3d background get 3d border get 3d border color get 3d compass get 3d compass color get 3d highlite get 3d highlite color set {} 3d view 45 30 set {} 3d az 45 set {} 3d el 30 set {} 3d scale 5 set {} 3d method mip set {} 3d background azimuth set {} 3d border yes set {} 3d border color red set {} 3d compass yes set {} 3d compass color red set {} 3d highlite yes set {} 3d highlite color red set {} frame delete set {} 3d close set {} cube close set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/about.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000046 12125354777 016477� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get about set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/align.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000106 12125354777 016454� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get align set {} align set {} frame reset set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/analysis.samp���������������������������������������������������������������������000644 �000765 �000000 �00000001315 12522457642 017204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} analysis clear set {} analysis analysis/analysis.ans get analysis get analysis task #get analysis entry hello world get analysis mode set {} analysis 0 set {} analysis task 1 set {} analysis task '{Basic Help}' set {} analysis clear set {} analysis load analysis/analysis.ans set {} analysis clear load analysis/analysis.ans set {} analysis clear set file://localhost/Users/joye/saods9/tests/analysis/analysis.ans analysis load set {} analysis clear #set {} analysis message {This is a message} #set {} analysis message yesno {This is a message} set {} analysis text {This is text} set {} analysis mode none set file://localhost/Users/joye/saods9/tests/analysis.txt analysis text set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/array.samp������������������������������������������������������������������������000644 �000765 �000000 �00000001031 12360014501 016451� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} array array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} frame delete set {} array new array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} array mask array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} frame delete # backward compatibiliy set {} frame new rgb set {} array rgb rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] set {} frame delete set {} array new rgb rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] set {} frame delete set {} rgb close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/backup.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000062 12125354777 016630� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} backup foo.bck set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/bg.samp���������������������������������������������������������������������������000644 �000765 �000000 �00000000140 12125405766 015743� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get background get bg set {} background red set {} background white set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/bin.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000001220 12441410124 016104� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} file new fits/table.fits set {} bin open set {} bin factor 4 set {} bin factor 8 8 set {} scale log set {} scale minmax set {} bin buffersize 1024 set {} bin filter 'circle(4096,4096,200)' set {} bin filter {} set {} bin cols rawx rawy set {} bin about center set {} bin colsz x y pha set {} bin depth 10 set {} bin about 4096 4096 set {} bin depth 1 set {} bin function sum set {} bin in set {} bin out set {} bin to fit set {} bin match set {} bin lock yes set {} bin lock no set {} bin close get bin about get bin buffersize get bin cols get bin factor get bin filter get bin function get bin lock set {} frame delete set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/blink.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000310 12125354777 016456� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get blink get blink interval set {} frame new set {} blink set {} blink yes set {} blink interval .5 set {} single set {} frame first set {} frame next set {} frame delete set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/block.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000445 12610250021 016432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} block open set {} block 4 set {} block 8 8 set {} block to 4 set {} block to 8 8 set {} block in set {} block out set {} block to fit set {} block to 1 set {} block match set {} block lock yes set {} block lock no set {} block close get block get block lock set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/catalog.samp����������������������������������������������������������������������000644 �000765 �000000 �00000004045 12360014501 016755� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} catalog cds 2mass get catalog get catalog header get catalog cat2mass header set {} catalog clear set {} catalog close set {} catalog set {} catalog close set {} catalog cds {I/284} set {} catalog clear set {} catalog close set {} catalog import sb aux/ds9.cat set {} catalog clear set {} catalog close set {} catalog cds 2mass set {} raise set {} catalog plot {$Jmag} {$Hmag} {$e_Jmag} {$e_Hmag} set {} catalog symbol condition {$Jmag>15} set {} catalog symbol shape {boxcircle point} set {} catalog symbol color red set {} catalog symbol condition {} set {} catalog symbol color red set {} catalog symbol shape text set {} catalog symbol font times set {} catalog symbol fontsize 14 set {} catalog symbol fontweight bold set {} catalog symbol fontslant italic set {} catalog symbol add set {} catalog symbol remove set {} catalog symbol load aux/ds9.sym set {} catalog symbol save foo.sym set {} catalog name m51 set {} catalog coordinate 202.48 47.21 fk5 set {} catalog system wcs set {} catalog sky fk5 set {} catalog skyformat degrees set {} catalog size 22 22 arcmin set {} catalog save foo.cat set {} catalog filter {$Jmag>15} set {} catalog filter load aux/ds9.flt set {} catalog regions set {} regions delete all set {} catalog retrieve set {} catalog cancel #set {} catalog print set {} catalog server sao set {} catalog sort {Jmag} incr set {} catalog maxrows 3000 set {} catalog allcols set {} catalog allrows set {} catalog ra {RAJ2000} set {} catalog dec {DEJ2000} set {} catalog psystem wcs set {} catalog psky fk5 set {} catalog hide set {} catalog show set {} catalog panto no #set {} catalog edit yes set {} catalog location 400 set {} catalog header set {} catalog clear set {} catalog close set {} catalog 2mass set {} catalog xmm set {} catalog match function 1and2 set {} catalog match error 2 arcsec set {} catalog match return 1only set {} catalog match unique no set {} catalog match 2mass xmm set {} catalog clear set {} catalog close set {} catalog clear set {} catalog close set {} catalog clear set {} catalog close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/cd.samp���������������������������������������������������������������������������000644 �000765 �000000 �00000000060 12125354777 015747� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get cd set {} cd . set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/cmap.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000631 12131334246 016267� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get cmap get cmap file get cmap invert get cmap value get cmap lock set {} cmap open set {} cmap Heat set {} cmap load aux/ds9.sao set {} cmap save foo.sao set {} cmap invert yes set {} cmap value 5 .2 set {} cmap tag load aux/ds9.tag set {} cmap tag save foo.tag set {} cmap tag delete set {} cmap match set {} cmap lock yes set {} cmap lock no set {} cmap Grey set {} cmap close set {} single set {} raise �������������������������������������������������������������������������������������������������������saods9/tests/samp/colorbar.samp���������������������������������������������������������������������000644 �000765 �000000 �00000001414 12125362316 017154� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get colorbar get colorbar orientation get colorbar numerics get colorbar space get colorbar font get colorbar fontsize get colorbar fontweight get colorbar fontslant get colorbar size get colorbar ticks set {} colorbar no set {} colorbar yes set {} colorbar vertical set {} colorbar horizontal set {} colorbar numerics no set {} colorbar numerics yes set {} colorbar space value set {} colorbar space distance set {} colorbar font times set {} colorbar fontsize 30 set {} colorbar fontweight bold set {} colorbar fontslant roman set {} colorbar font helvetica set {} colorbar fontsize 10 set {} colorbar fontweight normal set {} colorbar fontslant roman set {} colorbar size 30 set {} colorbar ticks 9 set {} colorbar size 20 set {} colorbar ticks 11 set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/console.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000053 12125362316 017011� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} console set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/contour.samp����������������������������������������������������������������������000644 �000765 �000000 �00000002074 12131334246 017043� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} contour yes get contour get contour wcs fk5 get contour color get contour width get contour smooth get contour method get contour nlevels get contour scale get contour log exp get contour mode get contour limits get contour levels set {} contour open set {} contour set {} contour yes set {} contour clear set {} contour yes set {} contour load aux/ds9.con wcs fk5 red 2 set {} contour save foo.con wcs fk5 set {} contour clear set {} contour yes set {} contour convert set {} regions delete all set {} contour loadlevels aux/ds9.lev set {} contour savelevels foo.lev set {} contour clear set {} contour yes set {} contour copy set {} contour paste wcs red 2 set {} contour clear set {} contour yes set {} contour color yellow set {} contour width 2 set {} contour smooth 5 set {} contour method block set {} contour nlevels 10 set {} contour width 2 set {} contour scale sqrt set {} contour log exp 1000 set {} contour mode zscale set {} contour limits 1 100 set {} contour levels "{1 10 100 1000}" set {} contour clear set {} contour close set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/crop.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000747 12412607652 016330� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} mode crop set {} crop 978 970 356 308 get crop get crop wcs fk5 sexagesimal arcsec get crop lock set {} crop 978 970 356 308 set {} crop 13:29:52.908 +47:11:38.19 35.279606 30.522805 wcs fk5 arcsec set {} crop reset set {} 3d set {} file data/3d.fits set {} 3d vp 45 30 set {} crop 3d 25 75 set {} crop reset set {} crop match wcs set {} crop lock wcs set {} crop lock none set {} frame delete set {} mode none set {} 3d close set {} cube close set {} single set {} raise �������������������������saods9/tests/samp/crosshair.samp��������������������������������������������������������������������000644 �000765 �000000 �00000000411 12412607652 017346� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} mode crosshair get crosshair get crosshair wcs fk5 sexagesimal get crosshair lock set {} crosshair 13:29:55.287 +47:11:37.73 wcs fk5 set {} crosshair match wcs set {} crosshair lock wcs set {} crosshair lock none set {} mode none set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/cube.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000746 12620447104 016275� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} cube open set {} cube close set {} file new data/3d.fits get cube get cube interval get cube axis get cube lock get cube order get cube axes lock set {} cube 2 set {} cube interval .5 set {} cube axis 3 set {} cube play set {} cube stop set {} cube match wcs set {} cube lock wcs set {} cube lock none set {} cube order 321 set {} cube order 123 set {} cube axes lock yes set {} cube axes lock no set {} frame delete set {} 3d close set {} cube close set {} single set {} raise ��������������������������saods9/tests/samp/cursor.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000127 12412607652 016672� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} mode crosshair set {} cursor 10 10 set {} mode none set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/data.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000322 12125362316 016257� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get data image 450 520 3 3 yes get data physical 899 1039 6 6 no get data fk5 202.4709 47.19681 0.00016517 0.00016517 yes get data wcs fk5 202.4709 47.19681 0.00016517 0.00016517 no set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/dsseso.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000001224 12412607652 016654� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} dsseso open set {} dsseso close set {} dsseso survey DSS2-red get dsseso survey set {} dsseso size 30 30 arcsec get dsseso size set {} dsseso save no get dsseso save set {} dsseso frame new get dsseso frame set {} dsseso update frame set {} dsseso m51 set {} dsseso name m51 get dsseso name set {} dsseso name {} set {} dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal get dsseso coord set {} dsseso update frame set {} mode crosshair set {} dsseso update crosshair set {} dsseso close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/dsssao.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000001144 12412607652 016651� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} dsssao open set {} dsssao close set {} dsssao size 30 30 arcsec get dsssao size set {} dsssao save no get dsssao save set {} dsssao frame new get dsssao frame set {} dsssao update frame set {} dsssao m51 set {} dsssao name m51 get dsssao name set {} dsssao name {} set {} dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal get dsssao coord set {} dsssao update frame set {} mode crosshair set {} dsssao update crosshair set {} dsssao close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/dssstsci.samp���������������������������������������������������������������������000644 �000765 �000000 �00000001266 12412607652 017221� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} dssstsci open set {} dssstsci close set {} dssstsci survey all get dssstsci survey set {} dssstsci size 30 30 arcsec get dssstsci size set {} dssstsci save no get dssstsci save set {} dssstsci frame new get dssstsci frame set {} dssstsci update frame set {} dssstsci m1 set {} dssstsci name m51 get dssstsci name set {} dssstsci name {} set {} dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal get dssstsci coord set {} dssstsci update frame set {} mode crosshair set {} dssstsci update crosshair set {} dssstsci close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/exit.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000014 11236363301 016312� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} quit ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/export.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000001003 12360014501 016653� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} export array foo.arr little set {} export foo.arr little set {} export nrrd foo.nrrd big set {} export foo.nrrd set {} export gif foo.gif set {} export foo.gif set {} export tiff foo.tiff none set {} export foo.tiff set {} export jpeg foo.jpeg 10 set {} export foo.jpeg set {} export png foo.png set {} export foo.png set {} frame new rgb set {} rgbcube rgbcube/float.fits set {} export rgbarray foo.rgb little set {} export foo.rgb little set {} frame delete set {} rgb close set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/file.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000011421 12360036776 016300� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get file # default... set {} frame new set {} file fits/float.fits set {} frame delete set {} file new fits/float.fits set {} file slice fits/float.fits set {} file mask fits/float.fits set {} frame delete # fits... set {} frame new set {} file fits fits/float.fits set {} frame delete set {} file new fits fits/float.fits set {} file fits slice fits/float.fits set {} file mask fits fits/float.fits set {} frame delete # sfits... set {} frame new set {} file sfits sfits/float.hdr sfits/float.arr set {} frame delete set {} file new sfits sfits/float.hdr sfits/float.arr set {} file mask sfits sfits/float.hdr sfits/float.arr set {} frame delete # url... set {} frame new set {} file url http://ds9.si.edu/download/data/img.fits set {} frame delete # rgbimage... set {} frame new rgb set {} file rgbimage mecube/float.fits set {} frame delete set {} file new rgbimage mecube/float.fits set {} frame delete # rgbcube... set {} frame new rgb set {} file rgbcube rgbcube/float.fits set {} frame delete set {} file new rgbcube rgbcube/float.fits set {} frame delete # srgbcube... set {} frame new rgb set {} file srgbcube srgbcube/float.hdr srgbcube/float.arr set {} frame delete set {} file new srgbcube srgbcube/float.hdr srgbcube/float.arr set {} frame delete # mecube... set {} frame new set {} file mecube mecube/float.fits set {} frame delete set {} file new mecube mecube/float.fits set {} frame delete # multiframe... set {} frame new set {} file multiframe mecube/float.fits set {} frame delete set {} frame delete set {} frame delete set {} file new multiframe mecube/float.fits set {} frame delete set {} frame delete set {} frame delete set {} single # mosaic... set {} frame new set {} file mosaic mosaic/mosaicimage.fits set {} frame clear set {} file mosaic wcs mosaic/mosaicimage.fits set {} frame clear set {} file mosaic iraf mosaic/mosaicimage.fits set {} frame delete set {} file new mosaic mosaic/mosaicimage.fits set {} file mask mosaic mosaic/mosaicimage.fits set {} frame delete set {} file new mosaic wcs mosaic/mosaicimage.fits set {} file mask mosaic wcs mosaic/mosaicimage.fits set {} frame delete # mosaicimage... set {} frame new set {} file mosaicimage mosaic/mosaicimage.fits set {} frame clear set {} file mosaicimage wcs mosaic/mosaicimage.fits set {} frame clear set {} file mosaicimage iraf mosaic/mosaicimage.fits set {} frame clear set {} file mosaicimage wfpc2 mosaic/hst.fits set {} frame delete set {} file new mosaicimage mosaic/mosaicimage.fits set {} file mask mosaicimage mosaic/mosaicimage.fits set {} frame delete set {} file new mosaicimage wcs mosaic/mosaicimage.fits set {} file mask mosaicimage wcs mosaic/mosaicimage.fits set {} frame delete # mosaicwcs... set {} frame new set {} file mosaicwcs mosaic/mosaicimage.fits set {} frame delete set {} file new mosaicwcs mosaic/mosaicimage.fits set {} file mask mosaicwcs mosaic/mosaicimage.fits set {} frame delete # mosaiciraf... set {} frame new set {} file mosaiciraf mosaic/mosaicimage.fits set {} frame delete set {} file new mosaiciraf mosaic/mosaicimage.fits set {} file mask mosaiciraf mosaic/mosaicimage.fits set {} frame delete # mosaicimagewcs... set {} frame new set {} file mosaicimagewcs mosaic/mosaicimage.fits set {} frame delete set {} file new mosaicimagewcs mosaic/mosaicimage.fits set {} file mask mosaicimagewcs mosaic/mosaicimage.fits set {} frame delete # mosaicimageiraf... set {} frame new set {} file mosaicimageiraf mosaic/mosaicimage.fits set {} frame delete set {} file new mosaicimageiraf mosaic/mosaicimage.fits set {} file mask mosaicimageiraf mosaic/mosaicimage.fits set {} frame delete # mosaicimagewfpc2... set {} frame new set {} file mosaicimagewfpc2 mosaic/hst.fits set {} frame delete set {} file new mosaicimagewfpc2 mosaic/hst.fits set {} frame delete # smosaic...no test... # smosaiciraf...no test... # smosaicwcs...no test... # array... set {} frame new set {} file array array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} frame delete set {} file new array array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} file mask array array/float_big.arr[dim=256,bitpix=-32,endian=big] set {} frame delete # rgbarray... set {} frame new rgb set {} file rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] set {} frame delete set {} file new rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] set {} frame delete # photo... set {} frame new set {} file photo photo/rose.png set {} frame delete set {} file new photo photo/rose.png set {} file photo slice photo/rose.png set {} frame delete # file save... set {} file save foo.fits # file save gz... set {} file save gz foo.fits.gz # file save resample... set {} file save resample foo.fits # file save resample gz... set {} file save resample gz foo.fits.gz set {} rgb close set {} cube close set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/fits.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000003420 12520761535 016322� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get fits get fits image get fits slice set {} frame new set file://localhost/Users/joye/saods9/tests/fits/table.fits fits get fits table set {} frame delete set {} frame new set {} fits fits/float.fits set {} frame delete set {} fits new fits/float.fits set {} fits slice fits/float.fits set {} fits mask fits/float.fits set {} frame delete get fits size get fits width get fits height get fits depth get fits bitpix get fits type get fits size wcs fk5 arcsec get fits header get fits header 1 get fits header keyword BITPIX get fits header 1 keyword BITPIX set {} single # backward compatibility get fits image get fits image gz get fits resample get fits resample gz set {} frame new set {} fits fits/table.fits get fits table get fits table gz set {} frame delete set {} frame new set file://localhost/Users/joye/saods9/tests/mecube/float.fits fits mecube set {} frame delete set file://localhost/Users/joye/saods9/tests/mecube/float.fits fits new mecube set {} frame delete set {} frame new set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits mosaicimage set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits mosaicimage wcs set {} frame delete set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits new mosaicimage set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits mask mosaicimage set {} frame delete set {} frame new set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits mosaicimagewcs set {} frame delete set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits new mosaicimagewcs set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits fits mask mosaicimagewcs set {} frame delete set {} rgb close set {} cube close set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/frame.samp������������������������������������������������������������������������000644 �000765 �000000 �00000003031 12360036776 016451� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get frame lock get frame has amplifier get frame has datamin get frame has datasec get frame has detector get frame has grid get frame has iis get frame has irafmin get frame has physical get frame has smooth get frame has contour get frame has contour aux get frame has fits get frame has fits bin get frame has fits cube get frame has fits mosaic get frame has marker highlite get frame has marker paste get frame has marker select get frame has marker undo get frame has system physical get frame has wcs wcsa get frame has wcs equatorial wcsa set {} frame new rgb set {} frame delete set {} frame new 3d set {} frame delete set {} frame new set {} file data/img.fits get frame get frame frameno get frame all get frame active set {} frame center set {} frame center 1 set {} frame center all set {} frame reset set {} frame reset 1 set {} frame reset all set {} frame refresh set {} frame refresh 1 set {} frame refresh all set {} frame hide set {} frame hide 1 set {} frame hide all set {} frame show set {} frame show 1 set {} frame show all set {} frame move first set {} frame move back set {} frame move forward set {} frame move last set {} frame first set {} frame prev set {} frame next set {} frame last set {} frame frameno 1 set {} frame 2 set {} frame match wcs set {} frame lock wcs set {} frame lock none set {} frame clear set {} frame clear 1 set {} frame clear all set {} frame delete set {} frame delete 1 set {} frame delete all set {} file new data/img.fits set {} rgb close set {} 3d close set {} cube close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/gif.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000366 12126626244 016127� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} gif photo/rose.gif set file://localhost/Users/joye/saods9/tests/photo/rose.gif gif get gif set {} frame delete set {} gif new photo/rose.gif set {} gif slice photo/rose.gif set {} frame delete set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/grid.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000005747 12126603214 016307� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} wcs wcs get grid get grid type get grid system get grid sky get grid skyformat get grid grid get grid grid color get grid grid width get grid grid style get grid grid gap1 get grid grid gap2 get grid axes get grid axes color get grid axes width get grid axes style get grid axes type get grid axes origin get grid format1 get grid format2 get grid tickmarks get grid tickmarks color get grid tickmarks width get grid tickmarks style get grid border get grid border color get grid border width get grid border style get grid numlab get grid numlab font get grid numlab fontweight get grid numlab fontslant get grid numlab fontsize get grid numlab color get grid numlab gap1 get grid numlab gap2 get grid numlab type get grid numlab vertical get grid title get grid title text get grid title def get grid title gap get grid title font get grid title fontweight get grid title fontslant get grid title fontsize get grid title color get grid textlab get grid textlab text1 get grid textlab def1 get grid textlab gap1 get grid textlab text2 get grid textlab def2 get grid textlab gap2 get grid textlab font get grid textlab fontweight get grid textlab fontslant get grid textlab fontsize get grid textlab color set {} grid open set {} grid close set {} grid set {} grid yes set {} grid type analysis set {} grid system wcs set {} grid sky fk5 set {} grid skyformat degrees set {} grid grid yes set {} grid grid color red set {} grid grid width 2 set {} grid grid style 1 set {} grid grid gap1 .01 set {} grid grid gap2 .01 set {} grid axes yes set {} grid axes color red set {} grid axes width 2 set {} grid axes style 1 set {} grid axes type exterior set {} grid format1 d.2 set {} grid format2 d.2 set {} grid tickmarks yes set {} grid tickmarks color red set {} grid tickmarks width 2 set {} grid tickmarks style 1 set {} grid border yes set {} grid border color red set {} grid border width 2 set {} grid border style 1 set {} grid numerics yes set {} grid numerics font courier set {} grid numerics fontweigth bold set {} grid numerics fontslant roman set {} grid numerics fontsize 12 set {} grid numerics color red set {} grid numerics gap1 10 set {} grid numerics gap2 10 set {} grid numerics type exterior set {} grid numerics vertical yes set {} grid title yes set {} grid title text {Hello World} set {} grid title def yes set {} grid title gap 10 set {} grid title font courier set {} grid title fontweight bold set {} grid title fontslant roman set {} grid title fontsize 12 set {} grid title color red set {} grid labels yes set {} grid labels text1 {Hello World} set {} grid labels def1 yes set {} grid labels gap1 10 set {} grid labels text2 {Hello World} set {} grid labels def2 yes set {} grid labels gap2 10 set {} grid labels font courier set {} grid labels fontweight bold set {} grid labels fontslant roman set {} grid labels fontsize 12 set {} grid labels color red set {} grid save foo.grd set {} grid load foo.grd set {} grid reset set {} grid no set {} grid close set {} single set {} raise �������������������������saods9/tests/samp/header.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000177 12126603214 016602� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} header set {} header save foo.txt set {} header close set {} header 1 set {} header close 1 set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/height.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000071 12126603214 016613� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get height set {} height 443 set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/iconify.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000134 12126603214 017003� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get iconify set {} iconify set {} iconify yes set {} iconify no set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/iexam.samp������������������������������������������������������������������������000644 �000765 �000000 �00000001036 12520745345 016462� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "Select coordinate point:" get iexam coordinate wcs fk5 degrees echo " ok" sleep .5 echo "Press key:" get iexam key coordinate wcs fk5 degrees echo " ok" sleep .5 echo "Press either:" get iexam any coordinate wcs fk5 degrees echo " ok" sleep .5 echo "Select value point:" get iexam data echo " ok" sleep .5 echo "Press key:" get iexam key data echo " ok" sleep .5 echo "Press any:" get iexam any data echo " ok" sleep .5 echo "Macro string:" get iexam any {Click at $x,$y in file $filename} echo " ok" set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/iis.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000174 12126603214 016133� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get iis filename get iis filename 1 set {} iis filename foo.fits set {} iis filename foo.fits 1 set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/jpeg.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000377 12126623076 016311� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} jpeg photo/rose.jpeg set file://localhost/Users/joye/saods9/tests/photo/rose.jpeg jpeg get jpeg set {} frame delete set {} jpeg new photo/rose.jpeg set {} jpeg slice photo/rose.jpeg set {} frame delete set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/lock.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000001551 12532124131 016274� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get lock frame get lock crosshair get lock crop get lock slice get lock bin get lock axes get lock scale get lock scalelimits get lock colorbar get lock smooth set {} file new data/img.fits set {} tile set {} mode crosshair set {} lock frame wcs set {} lock frame none set {} lock crosshair wcs set {} crosshair 13:29:56 +47:11:38 wcs fk5 set {} lock crosshair none set {} lock crop wcs set {} lock crop none set {} lock slice wcs set {} lock slice none set {} lock bin yes set {} lock bin no set {} lock axes yes set {} lock axes no set {} lock scale yes set {} lock scale no set {} lock scalelimits yes set {} lock scalelimits no set {} lock colorbar yes set {} lock colorbar no set {} lock block yes set {} lock block no set {} lock smooth yes set {} lock smooth no set {} mode none set {} frame delete set {} wcs align no set {} scale zscale set {} single set {} raise�������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/lower.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000065 12126603214 016476� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get iconify set {} lower set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/magnifier.samp��������������������������������������������������������������������000644 �000765 �000000 �00000000332 12126603214 017304� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get magnifier color get magnifier zoom get magnifier cursor get magnifier region set {} magnifier color white set {} magnifier zoom 4 set {} magnifier cursor yes set {} magnifier region yes set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mask.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000233 12126603214 016276� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get mask color get mask mark get mask transparency set {} mask open set {} mask color cyan set {} mask clear set {} mask close set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/match.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000634 12532124131 016441� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} file new data/img.fits set {} tile set {} mode crosshair set {} match frames wcs set {} match frames image set {} match crosshairs wcs set {} match crop wcs set {} match slice wcs set {} match bin set {} match axes set {} match scale set {} match scalelimits set {} match colorbar set {} match block set {} match smooth set {} frame delete set {} mode none set {} scale zscale set {} single set {} raise ����������������������������������������������������������������������������������������������������saods9/tests/samp/mecube.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000304 12360036776 016617� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mecube mecube/float.fits set file://localhost/Users/joye/saods9/tests/mecube/float.fits mecube get mecube set {} frame delete set {} cube close set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/minmax.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000142 12616732023 016640� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get minmax get minmax mode set {} minmax scan set {} minmax mode scan set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mode.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000365 12412607652 016305� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get mode set {} mode none set {} mode region set {} mode pointer set {} mode crosshair set {} mode colorbar set {} mode pan set {} mode zoom set {} mode rotate set {} mode catalog set {} mode examine set {} mode none set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaic.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000001037 12131307543 016623� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaic mosaic/mosaicimage.fits get mosaic set {} frame clear set {} mosaic wcs mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaic wcs set {} frame clear set {} mosaic iraf mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaic iraf set {} frame delete set {} mosaic new mosaic/mosaicimage.fits set {} mosaic mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaicimage.samp������������������������������������������������������������������000644 �000765 �000000 �00000001344 12131307543 017627� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaicimage mosaic/mosaicimage.fits get mosaicimage set {} frame clear set {} mosaicimage wcs mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaicimage wcs set {} frame clear set {} mosaicimage iraf mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaicimage iraf set {} frame clear set {} mosaicimage wfpc2 mosaic/hst.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/hst.fits mosaicimage wfpc2 set {} frame delete set {} mosaicimage new mosaic/mosaicimage.fits set {} mosaicimage mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaicimageiraf.samp��������������������������������������������������������������000644 �000765 �000000 �00000000524 12131307543 020470� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaicimageiraf mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaicimageiraf set {} frame delete set {} mosaicimageiraf new mosaic/mosaicimage.fits set {} mosaicimageiraf mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaicimagewcs.samp���������������������������������������������������������������000644 �000765 �000000 �00000000544 12131307543 020345� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaicimagewcs mosaic/mosaicimage.fits get mosaicimagewcs set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaicimagewcs set {} frame delete set {} mosaicimagewcs new mosaic/mosaicimage.fits set {} mosaicimagewcs mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaicimagewfpc2.samp�������������������������������������������������������������000644 �000765 �000000 �00000000313 12131307543 020564� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaicimage wfpc2 mosaic/hst.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/hst.fits mosaicimagewfpc2 set {} frame delete set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaiciraf.samp�������������������������������������������������������������������000644 �000765 �000000 �00000000500 12131307543 017457� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaiciraf mosaic/mosaicimage.fits set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaiciraf set {} frame delete set {} mosaiciraf new mosaic/mosaicimage.fits set {} mosaiciraf mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/mosaicwcs.samp��������������������������������������������������������������������000644 �000765 �000000 �00000000513 12131307543 017336� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} mosaicwcs mosaic/mosaicimage.fits get mosaicwcs set {} frame clear set file://localhost/Users/joye/saods9/tests/mosaic/mosaicimage.fits mosaicwcs set {} frame delete set {} mosaicwcs new mosaic/mosaicimage.fits set {} mosaicwcs mask mosaic/mosaicimage.fits set {} frame delete set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/movie.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000540 12360036776 016500� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} width 715 set {} height 450 set {} movie foo.mpg set {} movie frame foo.mpg set {} movie slice foo.mpg set {} frame new 3d set {} movie 3d foo.mpg number 1 azfrom 0 azto 0 elfrom 0 elto 0 slfrom 1 slto 1 repeat 1 set {} frame delete # backward compatibility set {} savempeg foo.mpg set {} 3d close set {} cube close set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/multiframe.samp�������������������������������������������������������������������000644 �000765 �000000 �00000000216 12126606406 017517� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} multiframe mecube/float.fits set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/nameserver.samp�������������������������������������������������������������������000644 �000765 �000000 �00000000631 12412607652 017524� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} nameserver open set {} nameserver close set {} nameserver m51 get nameserver get nameserver server get nameserver skyformat get nameserver m51 set {} nameserver name m51 set {} nameserver server simbad-cds set {} nameserver skyformat degrees set {} mode crosshair set {} nameserver crosshair set {} nameserver pan set {} nameserver close set {} mode none set {} frame reset set {} single set {} raise �������������������������������������������������������������������������������������������������������saods9/tests/samp/nan.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000105 12130630775 016124� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get nan set {} nan blue set {} nan white set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/nrrd.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000453 12127371452 016323� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} nrrd nrrd/float_big_raw.nrrd set file://localhost/Users/joye/saods9/tests/nrrd/float_big_raw.nrrd nrrd get nrrd get nrrd big set {} frame delete set {} nrrd new nrrd/float_big_raw.nrrd set {} nrrd mask nrrd/float_big_raw.nrrd set {} frame delete set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/nvss.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000001076 12412607652 016352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} nvss open set {} nvss close set {} nvss size 30 30 arcsec get nvss size set {} nvss save no get nvss save set {} nvss frame new get nvss frame set {} nvss update frame set {} nvss m51 set {} nvss name m51 get nvss name set {} nvss name {} set {} nvss coord 13:29:52.37 +47:11:40.8 sexagesimal get nvss coord set {} nvss update frame set {} mode crosshair set {} nvss update crosshair set {} nvss close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/orient.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000245 12126621321 016645� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} orient open set {} orient none set {} orient x set {} orient y set {} orient xy set {} orient close get orient set {} frame reset set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/pagesetup.samp��������������������������������������������������������������������000644 �000765 �000000 �00000000275 12126621321 017345� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get pspagesetup orient get pspagesetup scale get pspagesetup size set {} pspagesetup orient portrait set {} pspagesetup scale 100 set {} pspagesetup size letter set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/pan.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000306 12126621321 016121� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get pan physical get pan wcs fk5 sexagesimal set {} pan open set {} pan 100 100 image set {} pan to 13:29:55.666 +47:12:16.29 wcs fk5 set {} pan close set {} frame reset set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/pixeltable.samp�������������������������������������������������������������������000644 �000765 �000000 �00000000227 12126621321 017476� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get pixeltable set {} pixeltable set {} pixeltable yes set {} pixeltable no set {} pixeltable open set {} pixeltable close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/plot.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000022003 12403657556 016340� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# empty plot... set {} plot get plot set {} sleep .5 set {} plot close set {} plot new set {} plot bar set {} plot new bar set {} plot scatter set {} plot new scatter set {} sleep .5 set {} plot close set {} plot close set {} plot close set {} plot close set {} plot close set {} plot new name foo set {} plot new name foo line set {} plot new name foo bar set {} plot new name foo scatter set {} sleep .5 set {} plot close set {} plot close set {} plot close set {} plot close set {} plot new name foo "The Title" "X Axis" "Y Axis" xy set {} plot new name foo line "The Title" "X Axis" "Y Axis" xy set {} plot new name foo bar "The Title" "X Axis" "Y Axis" xy set {} plot new name foo scatter "The Title" "X Axis" "Y Axis" xy set {} sleep .5 set {} plot close set {} plot close set {} plot close set {} plot close # data... set {} plot new set file://localhost/Users/joye/saods9/tests/plot/xy.dat plot data xy set {} plot new name foo set file://localhost/Users/joye/saods9/tests/plot/xy.dat plot foo data xy set {} sleep .5 set {} plot close set {} plot close # save/load... set {} plot new set {} plot load plot/xy.dat xy set {} plot save foo.dat set {} sleep .5 set {} plot close # clear... set {} plot new set {} plot load plot/xy.dat xy set {} sleep .5 set {} plot clear set {} plot close # duplicate... set {} plot new set {} plot load plot/xy.dat xy set {} plot dup set {} plot duplicate 1 set {} sleep .5 set {} plot close # stats... set {} plot new set {} plot load plot/xy.dat xy get plot stats set {} plot stats set {} sleep .5 set {} plot close # list... set {} plot new set {} plot load plot/xy.dat xy get plot list set {} plot list set {} sleep .5 set {} plot close # saveconfig/loadconfig... set {} plot new set {} plot load plot/xy.dat xy set {} plot saveconfig foo.plt set {} plot loadconfig foo.plt set {} sleep .5 set {} plot close # pagesetup... set {} plot new set {} plot load plot/xy.dat xy set {} plot pagesetup orient portrait set {} plot pagesetup size letter set {} sleep .5 set {} plot close # print... set {} plot new set {} plot load plot/xy.dat xy #set {} plot print set {} plot print destination printer set {} plot print command "lp" set {} plot print filename "foo.ps" set {} plot print color rgb set {} sleep .5 set {} plot close # mode... set {} plot new set {} plot load plot/xy.dat xy get plot mode set {} plot mode pointer set {} sleep .5 set {} plot close # axis... set {} plot new set {} plot load plot/xy.dat xy set {} plot axis x grid no set {} plot axis x grid yes set {} plot axis x log yes set {} plot axis x log no set {} plot axis x flip yes set {} plot axis x flip no set {} plot axis x auto no set {} plot axis x min 1 set {} plot axis x max 100 set {} plot axis x format "%f" set {} plot axis y grid no set {} plot axis y grid yes set {} plot axis y log yes set {} plot axis y log no set {} plot axis y flip yes set {} plot axis y flip no set {} plot axis y auto no set {} plot axis y min 1 set {} plot axis y max 100 set {} plot axis y format "%f" get plot axis x grid get plot axis x log get plot axis x flip get plot axis x auto get plot axis x min get plot axis x max get plot axis x format get plot axis y grid get plot axis y log get plot axis y flip get plot axis y auto get plot axis y min get plot axis y max get plot axis y format set {} sleep .5 set {} plot close # legend... set {} plot new set {} plot load plot/xy.dat xy get plot legend get plot legend position set {} plot legend yes set {} plot legend position left set {} plot legend position right set {} plot legend position bottom set {} plot legend position top set {} sleep .5 set {} plot close # font... set {} plot new set {} plot load plot/xy.dat xy set {} plot title "This is a Title" set {} plot title xaxis "X Axis" set {} plot title yaxis "Y Axis" set {} plot title legend "This is the Legend" set {} plot legend yes get plot font title font get plot font title size get plot font title weight get plot font title slant get plot font labels font get plot font labels size get plot font labels weight get plot font labels slant get plot font numbers font get plot font numbers size get plot font numbers weight get plot font numbers slant get plot font legendtitle font get plot font legendtitle size get plot font legendtitle weight get plot font legendtitle slant get plot font legend font get plot font legend size get plot font legend weight get plot font legend slant set {} plot font title font times set {} plot font title size 12 set {} plot font title weight bold set {} plot font title slant roman set {} plot font labels font times set {} plot font labels size 12 set {} plot font labels weight bold set {} plot font labels slant roman set {} plot font numbers font times set {} plot font numbers size 12 set {} plot font numbers weight bold set {} plot font numbers slant roman set {} plot font legendtitle font times set {} plot font legendtitle size 12 set {} plot font legendtitle weight bold set {} plot font legendtitle slant roman set {} plot font legend font times set {} plot font legend size 12 set {} plot font legend weight bold set {} plot font legend slant roman set {} sleep .5 set {} plot close # title... set {} plot new set {} plot load plot/xy.dat xy set {} plot title "This is a Title" set {} plot title x "X Axis" set {} plot title y "Y Axis" set {} plot title legend "This is the Legend" get plot title get plot title x get plot title y get plot title legend set {} sleep .5 set {} plot close # barmode... set {} plot new bar set {} plot load plot/xy.dat xy set {} plot load plot/xyey.dat xyey get plot barmode set {} plot barmode normal set {} plot barmode stacked set {} plot barmode aligned set {} plot barmode overlap set {} sleep .5 set {} plot close # show... set {} plot new set {} plot load plot/xy.dat xy get plot show set {} plot show no set {} plot show yes set {} sleep .5 set {} plot close # shape... set {} plot new set {} plot load plot/xy.dat xy get plot shape get plot shape fill get plot shape color set {} plot shape circle set {} plot shape square set {} plot shape diamond set {} plot shape plus set {} plot shape splus set {} plot shape scross set {} plot shape triangle set {} plot shape arrow set {} plot shape circle set {} plot shape fill no set {} plot shape fill yes set {} plot shape color cyan set {} sleep .5 set {} plot close # smooth... set {} plot new set {} plot load plot/xy.dat xy get plot smooth set {} plot smooth step set {} plot smooth linear set {} plot smooth cubic set {} plot smooth quadratic set {} plot smooth catrom set {} sleep .5 set {} plot close # color... set {} plot new set {} plot load plot/xy.dat xy get plot color set {} plot color magenta set {} plot color "#2C8" set {} sleep .5 set {} plot close # width... set {} plot new set {} plot load plot/xy.dat xy get plot width get plot dash set {} plot width 2 set {} plot dash yes set {} sleep .5 set {} plot close # error... set {} plot new set {} plot load plot/xy.dat xy get plot error get plot error cap get plot error color get plot error width set {} plot error no set {} plot error yes set {} plot error cap yes set {} plot error cap no set {} plot error color blue set {} plot error width 2 set {} sleep .5 set {} plot close # name... set {} plot new set {} plot load plot/xy.dat xy get plot name set {} plot legend yes set {} plot name "This is a test" set {} sleep .5 set {} plot close # select... set {} plot new set {} plot load plot/xy.dat xy set {} plot load plot/xyey.dat xyey get plot select set {} plot select 2 set {} plot dataset 1 set {} sleep .5 set {} plot close # backward compatibility graph... set {} plot new set {} plot load plot/xy.dat xy set {} plot graph grid x no set {} plot graph grid y yes set {} plot graph log x no set {} plot graph log y no set {} plot graph flip x no set {} plot graph flip y no set {} plot graph range x min 1 set {} plot graph range x max 100 set {} plot graph range y min 1 set {} plot graph range y max 100 set {} plot graph range x auto yes set {} plot graph range y auto yes set {} plot graph format x {} set {} plot graph format y {} set {} plot graph labels title "The Title" set {} plot graph labels xaxis "X Axis" set {} plot graph labels yaxis "Y Axis" set {} sleep .5 set {} plot close # backward compatibility view... set {} plot new set {} plot load plot/xy.dat xy set {} plot view discrete yes set {} plot view line yes set {} plot view step yes set {} plot view quadratic yes set {} plot view errorbar yes set {} sleep .5 set {} plot close # backward compatibility view... set {} plot new set {} plot load plot/xy.dat xy set {} plot line discrete cross set {} plot line linear width 2 set {} plot line linear dash yes set {} plot line step width 2 set {} plot line step dash yes set {} plot line quadratic width 2 set {} plot line quadratic dash yes set {} plot line errorbar width 2 set {} plot line errorbar style 1 set {} sleep .5 set {} plot close # backward compatibility view... set {} plot new set {} plot load plot/xy.dat xy set {} sleep .5 set {} plot close set {} plot color discrete red set {} plot color line green set {} plot color step blue set {} plot color quadratic cyan set {} plot color errorbar magenta set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/png.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000366 12126626244 016146� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} png photo/rose.png set file://localhost/Users/joye/saods9/tests/photo/rose.png png get png set {} frame delete set {} png new photo/rose.png set {} png slice photo/rose.png set {} frame delete set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/prefs.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000375 12576612222 016501� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} prefs clear # backward compatibility get prefs bgcolor get prefs nancolor get prefs threads get prefs irafalign set {} prefs bgcolor white set {} prefs nancolor white set {} prefs threads 8 set {} prefs irafalign yes set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/preserve.samp���������������������������������������������������������������������000644 �000765 �000000 �00000000165 12231543054 017204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get preserve pan get preserve regions set {} preserve pan no set {} preserve regions no set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/print.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000475 12126626244 016517� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get psprint destination get psprint command get psprint color get psprint level get psprint resolution #set {} psprint set {} psprint destination printer set {} psprint command lp set {} psprint filename ds9.ps set {} psprint color rgb set {} psprint level 2 set {} psprint resolution 150 set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/raise.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000066 12126626256 016465� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} lower set {} raise set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/regions.samp����������������������������������������������������������������������000644 �000765 �000000 �00000005532 12226046241 017022� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} regions delete all set {} regions system physical set {} regions sky fk5 set {} regions skyformat degrees set file://localhost/Users/joye/saods9/tests/regions/samp.reg regions get regions get regions epsilon get regions show get regions showtext get regions centroid auto get regions centroid radius get regions centroid iteration get regions -format pros -system wcs -sky fk5 -skyformat sexagesimal -delim nl -prop edit 1 -group foo -strip yes get regions include get regions exclude get regions source get regions background get regions selected get regions format get regions system get regions sky get regions skyformat get regions strip get regions shape get regions color get regions width get regions delim get regions groups set {} regions delete all set {} regions regions/ds9.physical.reg set {} regions delete all set {} regions load regions/ds9.physical.reg set {} regions delete all set {} regions load regions/ds9.fk5*.reg set {} regions delete all set {} regions load all regions/ds9.physical.reg set {} regions save foo.reg set {} regions list set {} regions list close set {} regions delete all set {} regions epsilon 5 set {} regions show yes set {} regions showtext yes set {} regions centroid set {} regions centroid auto no set {} regions centroid radius 10 set {} regions centroid iteration 30 #set {} regions getinfo set {} regions move front set {} regions move back set {} regions select all set {} regions select none set {} regions delete all set {} regions delete select set {} regions format ds9 set {} regions system physical set {} regions sky fk5 set {} regions skyformat degrees set {} regions delim nl set {} regions strip no set {} regions shape circle set {} regions color green set {} regions edit yes set {} regions include set {} regions width 1 set {} regions command "circle 100 100 20" set {} regions group new set {} regions group foo new set {} regions group foo update set {} regions group foo select set {} regions group foo color red set {} regions group foo copy set {} regions group foo delete set {} regions group foo cut set {} regions group foo font 'time 14 bold' set {} regions group foo move 100 100 set {} regions group foo movefront set {} regions group foo moveback set {} regions group foo property delete no set {} regions delete all set {} regions command "circle 100 100 20" set {} regions select all set {} regions copy set {} regions cut set {} regions paste set {} regions undo set {} regions delete all set {} regions load regions/ds9.physical.reg set {} regions select all set {} regions composite set {} regions desolve set {} regions delete all set {} regions command "circle 100 100 20" set {} regions savetemplate foo.tpl set {} regions delete all set {} regions template foo.tpl set {} regions delete all set {} regions template foo.tpl at 202.46963 47.19556 fk5 set {} regions delete all set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/restore.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000112 12126626244 017032� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} backup foo.bck set {} restore foo.bck set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/rgb.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000001637 12527427331 016137� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} rgb open set {} rgb close set {} rgb get rgb channel get rgb view red get rgb view green get rgb view blue get rgb system get rgb lock wcs get rgb lock crop get rgb lock slice get rgb lock bin get rgb lock scale get rgb lock scalelimits get rgb lock colorbar get rgb lock block get rgb lock smooth set {} rgb green set {} rgb channel blue set {} rgb view blue off set {} rgb system wcs set {} rgb lock wcs yes set {} rgb lock wcs no set {} rgb lock crop yes set {} rgb lock crop no set {} rgb lock slice yes set {} rgb lock slice no set {} rgb lock bin yes set {} rgb lock bin no set {} rgb lock scale yes set {} rgb lock scale no set {} rgb lock scalelimits yes set {} rgb lock scalelimits no set {} rgb lock colorbar yes set {} rgb lock colorbar no set {} rgb lock block yes set {} rgb lock block no set {} rgb lock smooth yes set {} rgb lock smooth no set {} rgb close set {} frame delete set {} single set {} raise �������������������������������������������������������������������������������������������������saods9/tests/samp/rgbarray.samp���������������������������������������������������������������������000644 �000765 �000000 �00000000414 12360014501 017150� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new rgb set {} rgbarray rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] get rgbarray big set {} frame delete set {} rgbarray new rgbarray/float_big.rgb[dim=256,bitpix=-32,endian=big] set {} frame delete set {} rgb close set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/rgbcube.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000407 12360014501 016752� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new rgb set {} rgbcube rgbcube/float.fits set file://localhost/Users/joye/saods9/tests/rgbcube/float.fits rgbcube get rgbcube set {} frame delete set {} rgbcube new rgbcube/float.fits set {} frame delete set {} rgb close set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/rgbimage.samp���������������������������������������������������������������������000644 �000765 �000000 �00000000410 12360014501 017110� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new rgb set {} rgbimage mecube/float.fits set file://localhost/Users/joye/saods9/tests/mecube/float.fits rgbimage get rgbimage set {} frame delete set {} rgbimage new mecube/float.fits set {} frame delete set {} rgb close set {} single set {} raise ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/rotate.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000206 12126634102 016641� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get rotate set {} rotate open set {} rotate to 30 set {} rotate 15 set {} rotate close set {} frame reset set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/samp.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000244 12126642367 016321� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} samp no set {} samp yes set {} samp broadcast set {} samp broadcast image set {} samp send aladin set {} samp send image aladin set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/save.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000002156 12360036776 016324� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# fits... set {} save foo.fits set {} save fits foo.fits set {} save foo.fits image set {} save fits foo.fits image set {} save foo.fits slice set {} save fits foo.fits slice set {} frame new set {} fits fits/table.fits set {} save foo.fits set {} save fits foo.fits set {} save foo.fits image set {} save fits foo.fits image set {} save foo.fits table set {} save fits foo.fits table set {} frame delete # rgbimage... set {} frame new rgb set {} rgbimage mecube/float.fits set {} save rgbimage foo.fits set {} frame delete # rgbcube... set {} frame new rgb set {} rgbcube rgbcube/float.fits set {} save rgbcube foo.fits set {} frame delete # mecube... set {} frame new set {} mecube mecube/float.fits set {} save mecube foo.fits set {} frame delete # mosaicimage... set {} frame new set {} mosaicimage mosaic/mosaicimage.fits set {} save mosaicimage foo.fits set {} frame delete # mosaic... set {} frame new set {} mosaicimage mosaic/mosaicimage.fits set {} save mosaic foo.fits set {} frame delete # backward compatibility # savefits... set {} savefits foo.fits set {} rgb close set {} cube close set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/saveimage.samp��������������������������������������������������������������������000644 �000765 �000000 �00000000734 12620446640 017321� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} saveimage fits foo.fits set {} saveimage foo.fits set {} saveimage eps foo.eps set {} saveimage foo.eps #set {} saveimage foo.gif set {} saveimage tiff foo.tiff none set {} saveimage foo.tiff set {} saveimage jpeg foo.jpeg 100 set {} saveimage foo.jpeg set {} saveimage png foo.png set {} saveimage foo.png # backward compatibility (6.2) set {} saveimage tiff none foo.tiff set {} saveimage jpeg 100 foo.jpeg set {} saveimage mpeg foo.mpeg set {} single set {} raise ������������������������������������saods9/tests/samp/scale.samp������������������������������������������������������������������������000644 �000765 �000000 �00000001655 12527427331 016454� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get scale get scale log exp get scale limits get scale mode get scale scope get scale datasec get scale lock get scale lock limits set {} scale open set {} scale linear set {} scale log set {} scale pow set {} scale sqrt set {} scale squared set {} scale asinh set {} scale sinh set {} scale histequ set {} scale log exp 1000 set {} scale log exp 10000 set {} scale linear set {} scale minmax set {} scale zscale set {} scale zmax set {} scale user set {} scale mode zscale set {} scale mode zmax set {} scale mode 95 set {} scale mode minmax set {} scale limits 0 100 set {} scale global set {} scale local set {} scale scope global set {} scale scope local set {} scale mode minmax set {} scale linear set {} scale zscale set {} scale datasec yes set {} scale match set {} scale match limits set {} scale lock yes set {} scale lock no set {} scale lock limits yes set {} scale lock limits no set {} scale close set {} single set {} raise �����������������������������������������������������������������������������������saods9/tests/samp/sfits.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000431 12126635566 016512� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} sfits sfits/float.hdr sfits/float.arr set {} frame delete set {} sfits new sfits/float.hdr sfits/float.arr set {} sfits slice sfits/float.hdr sfits/float.arr set {} sfits mask sfits/float.hdr sfits/float.arr set {} frame delete set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/single.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000127 12126635566 016645� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get single set {} tile get single set {} single get single set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/skyview.samp����������������������������������������������������������������������000644 �000765 �000000 �00000001326 12544316734 017064� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} skyview open set {} skyview close set {} skyview survey sdssi get skyview survey set {} skyview size 30 30 arcsec get skyview size set {} skyview pixels 600 600 get skyview pixels set {} skyview save no get skyview save set {} skyview frame new get skyview frame set {} skyview update frame set {} skyview m51 set {} skyview name m51 get skyview name set {} skyview name {} set {} skyview coord 13:29:55.301 +47:11:37.73 sexagesimal get skyview coord set {} skyview update frame set {} mode crosshair set {} skyview update crosshair set {} skyview close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/sleep.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000070 12126635566 016471� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} sleep set {} sleep 2 set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/smooth.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000414 12021722226 016654� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get smooth get smooth function get smooth radius set {} smooth open set {} smooth set {} smooth yes set {} smooth function tophat set {} smooth radius 5 set {} smooth match set {} smooth lock yes set {} smooth lock no set {} smooth no set {} smooth close set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/source.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000071 12131336426 016647� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} source aux/source.tcl set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/srgbcube.samp���������������������������������������������������������������������000644 �000765 �000000 �00000000333 12360014501 017133� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new rgb set {} srgbcube srgbcube/float.hdr srgbcube/float.arr set {} frame delete set {} srgbcube new srgbcube/float.hdr srgbcube/float.arr set {} frame delete set {} rgb close set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/tcl.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000200 12131335202 016112� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set file://localhost/Users/joye/saods9/tests/aux/hello.tcl tcl set {} tcl puts "Hello Again, World" set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/threads.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000071 12126640714 017003� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get threads set {} threads 8 set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/tiff.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000415 12127370217 016302� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} tiff photo/rose.tiff set file://localhost/Users/joye/saods9/tests/photo/rose.tiff tiff get tiff get tiff jpeg set {} frame delete set {} tiff new photo/rose.tiff set {} tiff slice photo/rose.tiff set {} frame delete set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/tile.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000517 12520467360 016315� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get tile get tile mode get tile grid mode get tile grid direction set {} fits new data/img.fits set {} fits new data/img.fits set {} tile set {} tile yes set {} tile row set {} tile column set {} tile grid set {} tile grid mode automatic set {} tile grid direction x set {} frame delete set {} frame delete set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/update.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000243 12126640714 016634� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} update set {} update 1 100 100 300 400 set {} update now set {} update now 1 100 100 300 400 set {} update off set {} update on set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/url.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000136 12360014501 016142� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame new set {} url http://ds9.si.edu/download/data/data/img.fits set {} frame delete ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/version.samp����������������������������������������������������������������������000644 �000765 �000000 �00000000050 12126640714 017033� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get version set {} single set {} raise ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/view.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000003321 12520761535 016327� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} frame delete get view layout get view keyvalue get view info get view panner get view magnifier get view buttons get view colorbar get view graph horizontal get view graph vertical get view filename get view object get view keyword get view minmax get view lowhigh get view units get view wcs get view detector get view amplifier get view physical get view image get view frame set {} view layout vertical set {} sleep .5 set {} view layout horizontal set {} sleep .5 set {} view keyvalue BITPIX set {} view info no set {} view info yes set {} view panner no set {} view panner yes set {} view magnifier no set {} view magnifier yes set {} view buttons no set {} view buttons yes set {} view colorbar no set {} view colorbar yes set {} view graph horizontal yes set {} view graph horizontal no set {} view graph vertical yes set {} view graph vertical no set {} view filename no set {} view filename yes set {} view object no set {} view object yes set {} view keyword yes set {} view keyword no set {} view minmax yes set {} view minmax no set {} view lowhigh yes set {} view lowhigh no set {} view units yes set {} view units no set {} view wcs no set {} view wcs yes set {} view wcsa yes set {} view wcsa no set {} view detector yes set {} view detector no set {} view amplifier yes set {} view amplifier no set {} view physical no set {} view physical yes set {} view image no set {} view image yes set {} view frame no set {} view frame yes set {} sleep .5 set {} frame new rgb set {} view red no set {} view red yes set {} view green no set {} view green yes set {} view blue no set {} view blue yes set {} frame delete set {} sleep .5 set {} file new data/img.fits set {} rgb close set {} rgb close set {} single set {} raise ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/vla.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000001177 12414573616 016151� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} first open set {} first close set {} first size 30 30 arcsec get first size set {} first save no get first save set {} first frame new get first frame set {} first survey stripe82 get first survey set {} first update frame set {} first m51 set {} first name m51 get first name set {} first name {} set {} first coord 13:29:52.37 +47:11:40.8 sexagesimal get first coord set {} first update frame set {} mode crosshair set {} first update crosshair set {} first close set {} mode none set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} frame delete set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/vo.samp���������������������������������������������������������������������������000644 �000765 �000000 �00000000543 12360033773 016002� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get vo method get vo server get vo internal get vo delay get vo connect get vo set {} vo open set {} vo method mime set {} vo server "http://cxc.harvard.edu/chandraed/list.txt" set {} vo internal yes set {} vo delay 10 set {} vo connect foo set {} vo chandra-ed set {} vo disconnect chandra-ed set {} vo close set {} web close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/wcs.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000001067 12131335202 016140� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get wcs get wcs system get wcs sky get wcs skyformat get wcs align set {} wcs open set {} wcs wcs set {} wcs align yes set {} wcs system wcs set {} wcs sky galactic set {} wcs skyformat sexagesimal set {} wcs align no set {} wcs sky fk5 set {} wcs skyformat degrees set file://localhost/Users/joye/saods9/tests/aux/image.wcs wcs append set file://localhost/Users/joye/saods9/tests/aux/image.wcs wcs replace set {} wcs append aux/image.wcs set {} wcs replace aux/image.wcs set {} wcs reset set {} wcs skyformat sexagesimal set {} wcs close set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/web.samp��������������������������������������������������������������������������000644 �000765 �000000 �00000000354 12360014501 016117� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} web ds9.si.edu/doc/acknowledgment.html sleep .5 get web set {} web ds9.si.edu/doc/helpdesk.html sleep .5 set {} web hvweb click back sleep .5 set {} web click forward set {} web clear set {} web close set {} single set {} raise ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/width.samp������������������������������������������������������������������������000644 �000765 �000000 �00000000067 12126640714 016475� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get width set {} width 600 set {} single set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/zoom.samp�������������������������������������������������������������������������000644 �000765 �000000 �00000000317 12441410124 016326� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set {} zoom open set {} zoom 2 set {} zoom 2 4 set {} zoom to 4 set {} zoom to 2 4 set {} zoom in set {} zoom out set {} zoom to fit set {} zoom close get zoom set {} frame reset set {} single set {} raise �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/samp/zscale.samp�����������������������������������������������������������������������000644 �000765 �000000 �00000000235 12126640714 016634� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������get zscale contrast get zscale sample get zscale line set {} zscale contrast .25 set {} zscale sample 600 set {} zscale line 120 set {} scale set {} raise �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.0.prf����������������������������������������������������������������������000644 �000765 �000000 �00000021275 11004151141 016351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.0 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) $ds9(version)] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum top .bl mb .blmb factor { 1 1 } } array set bin [array get pbin] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 copy {} mb .ctmb width 1 smooth 4 top .ct levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Mask prefs global mask global pmask array set pmask { view 1 color red } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local top .scale mb .scalemb } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian top .sm mb .smmb view 0 } array set smooth [array get psmooth] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 info,lowhigh 0 magnifier 1 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 colorbar,numerics 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] # Edit prefs set prefs(ds9,mode) pointer set ds9(mode) pointer # Frame prefs global tile set prefs(tile,mode) grid set tile(mode) grid global blink set prefs(blink,interval) 500 set blink(interval) 500 # Zoom prefs global current global wcs set prefs(zoom) { 1 1 } set current(zoom) { 1 1 } set prefs(orient) none set current(orient) none set prefs(rotate) 0 set current(rotate) 0 # Color prefs global colorbar set prefs(colorbar,map) Grey set colorbar(map) Grey set prefs(colorbar,invert) 0 set colorbar(invert) 0 # Region prefs global marker set prefs(marker,shape) {circle} set marker(shape) {circle} set prefs(marker,color) green set marker(color) green set prefs(marker,width) 1 set marker(width) 1 set prefs(marker,edit) 1 set marker(edit) 1 set prefs(marker,move) 1 set marker(move) 1 set prefs(marker,rotate) 1 set marker(rotate) 1 set prefs(marker,delete) 1 set marker(delete) 1 set prefs(marker,fixed) 0 set marker(fixed) 0 set prefs(marker,include) 1 set marker(include) 1 set prefs(marker,source) 1 set marker(source) 1 set prefs(marker,font) helvetica set marker(font) helvetica set prefs(marker,font,size) 10 set marker(font,size) 10 set prefs(marker,font,style) normal set marker(font,style) normal set prefs(marker,format) ds9 set marker(format) ds9 set prefs(marker,strip) 0 set marker(strip) 0 set prefs(marker,wcs) 0 set marker(wcs) 0 set prefs(marker,system) physical set marker(system) physical set prefs(marker,sky) fk5 set marker(sky) fk5 set prefs(marker,skyformat) degrees set marker(skyformat) degrees set marker(dialog,system) physical set marker(dialog,sky) fk5 set marker(dialog,skyformat) degrees set marker(dialog,dist,system) physical set marker(dialog,dist,format) degrees set marker(circle,radius) 20 set marker(ellipse,radius1) 40 set marker(ellipse,radius2) 20 set marker(box,radius1) 80 set marker(box,radius2) 40 set marker(polygon,width) 20 set marker(polygon,height) 20 set marker(projection,thick) 0 set marker(annulus,inner) 15 set marker(annulus,outer) 30 set marker(annulus,annuli) 1 set marker(ellipseannulus,radius1) 40 set marker(ellipseannulus,radius2) 20 set marker(ellipseannulus,radius3) 60 set marker(ellipseannulus,annuli) 1 set marker(boxannulus,radius1) 80 set marker(boxannulus,radius2) 40 set marker(boxannulus,radius3) 120 set marker(boxannulus,annuli) 1 set marker(panda,inner) 15 set marker(panda,outer) 30 set marker(panda,annuli) 1 set marker(panda,ang1) 0 set marker(panda,ang2) 360 set marker(panda,angnum) 4 set marker(epanda,radius1) 40 set marker(epanda,radius2) 20 set marker(epanda,radius3) 60 set marker(epanda,annuli) 1 set marker(epanda,ang1) 0 set marker(epanda,ang2) 360 set marker(epanda,angnum) 4 set marker(bpanda,radius1) 80 set marker(bpanda,radius2) 40 set marker(bpanda,radius3) 120 set marker(bpanda,annuli) 1 set marker(bpanda,ang1) 0 set marker(bpanda,ang2) 360 set marker(bpanda,angnum) 4 set marker(point,size) 11 global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false global nres set nres(server) {simbad-sao} global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green global hv set hv(archive,menu,1) {} set hv(archive,url,1) {} set hv(archive,menu,2) {} set hv(archive,url,2) {} set hv(archive,menu,3) {} set hv(archive,url,3) {} set hv(archive,menu,4) {} set hv(archive,url,4) {} global vo set vo(server) {http://cxc.harvard.edu/chandraed/list.txt} set vo(hv) 1 set vo(method) xpa set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} global analysis set prefs(analysis,log) 0 set analysis(log) 0 # Analysis Plot prefs set prefs(ap,grid) 1 set prefs(ap,grid,log) linearlinear set prefs(ap,discrete) 0 set prefs(ap,discrete,symbol) circle set prefs(ap,discrete,color) red set prefs(ap,linear) 1 set prefs(ap,linear,width) 1 set prefs(ap,linear,color) black set prefs(ap,linear,dash) no set prefs(ap,step) 0 set prefs(ap,step,width) 1 set prefs(ap,step,color) black set prefs(ap,step,dash) no set prefs(ap,quadratic) 0 set prefs(ap,quadratic,width) 1 set prefs(ap,quadratic,color) black set prefs(ap,quadratic,dash) no set prefs(ap,error,width) 1 set prefs(ap,error,color) red set prefs(ap,error,style) 1 set prefs(ap,titleFont) helvetica set prefs(ap,titleSize) 12 set prefs(ap,titleStyle) normal set prefs(ap,textlabFont) helvetica set prefs(ap,textlabSize) 10 set prefs(ap,textlabStyle) normal set prefs(ap,numlabFont) helvetica set prefs(ap,numlabSize) 10 set prefs(ap,numlabStyle) normal # Language set ds9(language) locale set ds9(language,name) Locale # Background Color prefs set ds9(bg,color) white # Blank/Inf/NaN Color prefs set ds9(nan,color) white # Font prefs set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } # Panner prefs global panner set panner(compass,image) 1 set panner(compass,wcs) 1 set panner(compass,wcs,system) wcs set panner(compass,wcs,sky) fk5 # Magnifier prefs global magnifier set magnifier(region) 1 set magnifier(cursor) 1 set magnifier(zoom) 4 # Truecolor Colorbar prefs global colorbar set colorbar(area) 0 set colorbar(mode) center # Dialog prefs global ds9 set ds9(dialog) motif # PanZoom prefs global panzoom set panzoom(mode) click # Print Coordinates prefs global coord set coord(value) 1 set coord(image) 1 set coord(physical) 0 set coord(amplifier) 0 set coord(detector) 0 set coord(wcs) 1 set coord(wcsa) 0 set coord(wcsb) 0 set coord(wcsc) 0 set coord(wcsd) 0 set coord(wcse) 0 set coord(wcsf) 0 set coord(wcsg) 0 set coord(wcsh) 0 set coord(wcsi) 0 set coord(wcsj) 0 set coord(wcsk) 0 set coord(wcsl) 0 set coord(wcsm) 0 set coord(wcsn) 0 set coord(wcso) 0 set coord(wcsp) 0 set coord(wcsq) 0 set coord(wcsr) 0 set coord(wcss) 0 set coord(wcst) 0 set coord(wcsu) 0 set coord(wcsv) 0 set coord(wcsw) 0 set coord(wcsx) 0 set coord(wcsy) 0 set coord(wcsz) 0 set coord(sky) fk5 set coord(skyformat) sexagesimal # Examine prefs global examine set examine(mode) new set examine(zoom) 4 # Misc prefs global ds9 set ds9(tmpdir) {/tmp} set ds9(automarker) 1 set ds9(xpa) 1 set ds9(confirm) 1 # HTTP prefs global http set http(proxy) 0 set http(proxy,host) {} set http(proxy,port) {} set http(auth) 0 set http(auth,user) {} set http(auth,passwd) {} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.1.prf����������������������������������������������������������������������000644 �000765 �000000 �00000021312 11004151141 016342� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.1 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum top .bl mb .blmb factor { 1 1 } } array set bin [array get pbin] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 copy {} mb .ctmb width 1 smooth 4 top .ct levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Mask prefs global mask global pmask array set pmask { view 1 color red } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local top .scale mb .scalemb } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian top .sm mb .smmb view 0 } array set smooth [array get psmooth] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 info,lowhigh 0 magnifier 1 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 colorbar,numerics 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] # Edit prefs set prefs(ds9,mode) pointer set ds9(mode) pointer # Frame prefs global tile set prefs(tile,mode) grid set tile(mode) grid global blink set prefs(blink,interval) 500 set blink(interval) 500 # Zoom prefs global current global wcs set prefs(zoom) { 1 1 } set current(zoom) { 1 1 } set prefs(orient) none set current(orient) none set prefs(rotate) 0 set current(rotate) 0 # Color prefs global colorbar set prefs(colorbar,map) Grey set colorbar(map) Grey set prefs(colorbar,invert) 0 set colorbar(invert) 0 # Region prefs global marker set prefs(marker,shape) {circle} set marker(shape) {circle} set prefs(marker,color) green set marker(color) green set prefs(marker,width) 1 set marker(width) 1 set prefs(marker,edit) 1 set marker(edit) 1 set prefs(marker,move) 1 set marker(move) 1 set prefs(marker,rotate) 1 set marker(rotate) 1 set prefs(marker,delete) 1 set marker(delete) 1 set prefs(marker,fixed) 0 set marker(fixed) 0 set prefs(marker,include) 1 set marker(include) 1 set prefs(marker,source) 1 set marker(source) 1 set prefs(marker,font) helvetica set marker(font) helvetica set prefs(marker,font,size) 10 set marker(font,size) 10 set prefs(marker,font,style) normal set marker(font,style) normal set prefs(marker,format) ds9 set marker(format) ds9 set prefs(marker,strip) 0 set marker(strip) 0 set prefs(marker,wcs) 0 set marker(wcs) 0 set prefs(marker,system) physical set marker(system) physical set prefs(marker,sky) fk5 set marker(sky) fk5 set prefs(marker,skyformat) degrees set marker(skyformat) degrees set marker(dialog,system) physical set marker(dialog,sky) fk5 set marker(dialog,skyformat) degrees set marker(dialog,dist,system) physical set marker(dialog,dist,format) degrees set marker(circle,radius) 20 set marker(ellipse,radius1) 40 set marker(ellipse,radius2) 20 set marker(box,radius1) 80 set marker(box,radius2) 40 set marker(polygon,width) 20 set marker(polygon,height) 20 set marker(projection,thick) 0 set marker(annulus,inner) 15 set marker(annulus,outer) 30 set marker(annulus,annuli) 1 set marker(ellipseannulus,radius1) 40 set marker(ellipseannulus,radius2) 20 set marker(ellipseannulus,radius3) 60 set marker(ellipseannulus,annuli) 1 set marker(boxannulus,radius1) 80 set marker(boxannulus,radius2) 40 set marker(boxannulus,radius3) 120 set marker(boxannulus,annuli) 1 set marker(panda,inner) 15 set marker(panda,outer) 30 set marker(panda,annuli) 1 set marker(panda,ang1) 0 set marker(panda,ang2) 360 set marker(panda,angnum) 4 set marker(epanda,radius1) 40 set marker(epanda,radius2) 20 set marker(epanda,radius3) 60 set marker(epanda,annuli) 1 set marker(epanda,ang1) 0 set marker(epanda,ang2) 360 set marker(epanda,angnum) 4 set marker(bpanda,radius1) 80 set marker(bpanda,radius2) 40 set marker(bpanda,radius3) 120 set marker(bpanda,annuli) 1 set marker(bpanda,ang1) 0 set marker(bpanda,ang2) 360 set marker(bpanda,angnum) 4 set marker(point,size) 11 global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false global nres set nres(server) {simbad-sao} global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green global hv set hv(archive,menu,1) {} set hv(archive,url,1) {} set hv(archive,menu,2) {} set hv(archive,url,2) {} set hv(archive,menu,3) {} set hv(archive,url,3) {} set hv(archive,menu,4) {} set hv(archive,url,4) {} global vo set vo(server) {http://cxc.harvard.edu/chandraed/list.txt} set vo(hv) 1 set vo(method) xpa set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} global analysis set prefs(analysis,log) 0 set analysis(log) 0 # Analysis Plot prefs set prefs(ap,grid) 1 set prefs(ap,grid,log) linearlinear set prefs(ap,discrete) 0 set prefs(ap,discrete,symbol) circle set prefs(ap,discrete,color) red set prefs(ap,linear) 1 set prefs(ap,linear,width) 1 set prefs(ap,linear,color) black set prefs(ap,linear,dash) no set prefs(ap,step) 0 set prefs(ap,step,width) 1 set prefs(ap,step,color) black set prefs(ap,step,dash) no set prefs(ap,quadratic) 0 set prefs(ap,quadratic,width) 1 set prefs(ap,quadratic,color) black set prefs(ap,quadratic,dash) no set prefs(ap,error,width) 1 set prefs(ap,error,color) red set prefs(ap,error,style) 1 set prefs(ap,titleFont) helvetica set prefs(ap,titleSize) 12 set prefs(ap,titleStyle) normal set prefs(ap,textlabFont) helvetica set prefs(ap,textlabSize) 10 set prefs(ap,textlabStyle) normal set prefs(ap,numlabFont) helvetica set prefs(ap,numlabSize) 10 set prefs(ap,numlabStyle) normal # Language set ds9(language) locale set ds9(language,name) English # Background Color prefs set ds9(bg,color) white # Blank/Inf/NaN Color prefs set ds9(nan,color) white # Font prefs set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } # Panner prefs global panner set panner(compass,image) 1 set panner(compass,wcs) 1 set panner(compass,wcs,system) wcs set panner(compass,wcs,sky) fk5 # Magnifier prefs global magnifier set magnifier(region) 1 set magnifier(cursor) 1 set magnifier(zoom) 4 # Truecolor Colorbar prefs global colorbar set colorbar(area) 0 set colorbar(mode) center # Dialog prefs global ds9 set ds9(dialog) native # PanZoom prefs global panzoom set panzoom(mode) click # Print Coordinates prefs global coord set coord(value) 1 set coord(image) 1 set coord(physical) 0 set coord(amplifier) 0 set coord(detector) 0 set coord(wcs) 1 set coord(wcsa) 0 set coord(wcsb) 0 set coord(wcsc) 0 set coord(wcsd) 0 set coord(wcse) 0 set coord(wcsf) 0 set coord(wcsg) 0 set coord(wcsh) 0 set coord(wcsi) 0 set coord(wcsj) 0 set coord(wcsk) 0 set coord(wcsl) 0 set coord(wcsm) 0 set coord(wcsn) 0 set coord(wcso) 0 set coord(wcsp) 0 set coord(wcsq) 0 set coord(wcsr) 0 set coord(wcss) 0 set coord(wcst) 0 set coord(wcsu) 0 set coord(wcsv) 0 set coord(wcsw) 0 set coord(wcsx) 0 set coord(wcsy) 0 set coord(wcsz) 0 set coord(sky) fk5 set coord(skyformat) sexagesimal # Examine prefs global examine set examine(mode) new set examine(zoom) 4 # Misc prefs global ds9 set ds9(tmpdir) {/tmp} set ds9(automarker) 1 set ds9(xpa) 1 set ds9(confirm) 1 # HTTP prefs global http set http(proxy) 0 set http(proxy,host) {} set http(proxy,port) {} set http(auth) 0 set http(auth,user) {} set http(auth,passwd) {} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.2.prf����������������������������������������������������������������������000644 �000765 �000000 �00000054624 11004151141 016357� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.2 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum top .bl mb .blmb factor { 1 1 } } array set bin [array get pbin] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 copy {} mb .ctmb width 1 smooth 4 top .ct levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Mask prefs global mask global pmask array set pmask { view 1 color red } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local top .scale mb .scalemb } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian top .sm mb .smmb view 0 } array set smooth [array get psmooth] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 colorbar,numerics 1 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # Buttons prefs global buttons array set buttons { color,he 1 view,lowhigh 0 frame,single 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 frame,newrgb 1 bin,512x 0 file,console 0 scale { .ds9.buttons.scale.linear buttons(scale,linear) .ds9.buttons.scale.log buttons(scale,log) .ds9.buttons.scale.pow buttons(scale,pow) .ds9.buttons.scale.sqrt buttons(scale,sqrt) .ds9.buttons.scale.squared buttons(scale,squared) .ds9.buttons.scale.hist buttons(scale,hist) .ds9.buttons.scale.minmax buttons(scale,minmax) .ds9.buttons.scale.995 buttons(scale,99.5) .ds9.buttons.scale.99 buttons(scale,99) .ds9.buttons.scale.98 buttons(scale,98) .ds9.buttons.scale.97 buttons(scale,97) .ds9.buttons.scale.96 buttons(scale,96) .ds9.buttons.scale.95 buttons(scale,95) .ds9.buttons.scale.925 buttons(scale,92.5) .ds9.buttons.scale.90 buttons(scale,90) .ds9.buttons.scale.zscale buttons(scale,zscale) .ds9.buttons.scale.zmax buttons(scale,zmax) .ds9.buttons.scale.user buttons(scale,user) .ds9.buttons.scale.datasec buttons(scale,datasec) .ds9.buttons.scale.params buttons(scale,params) } bin { .ds9.buttons.bin.average buttons(bin,average) .ds9.buttons.bin.sum buttons(bin,sum) .ds9.buttons.bin.in buttons(bin,in) .ds9.buttons.bin.out buttons(bin,out) .ds9.buttons.bin.fit buttons(bin,fit) .ds9.buttons.bin.1 buttons(bin,1) .ds9.buttons.bin.2 buttons(bin,2) .ds9.buttons.bin.4 buttons(bin,4) .ds9.buttons.bin.8 buttons(bin,8) .ds9.buttons.bin.16 buttons(bin,16) .ds9.buttons.bin.32 buttons(bin,32) .ds9.buttons.bin.64 buttons(bin,64) .ds9.buttons.bin.128 buttons(bin,128) .ds9.buttons.bin.256 buttons(bin,256) .ds9.buttons.bin.128x buttons(bin,128x) .ds9.buttons.bin.256x buttons(bin,256x) .ds9.buttons.bin.512x buttons(bin,512x) .ds9.buttons.bin.1024x buttons(bin,1024x) .ds9.buttons.bin.2048x buttons(bin,2048x) .ds9.buttons.bin.4096x buttons(bin,4096x) .ds9.buttons.bin.8192x buttons(bin,8192x) .ds9.buttons.bin.params buttons(bin,params) } bin,8192x 0 edit,prefs 0 bin,2048x 0 edit,colorbar 1 scale,minmax 1 view,horizontal 0 view,colorbar 1 color,sls 0 majorPrev .ds9.buttons.file frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 file,pspage 0 region,list 1 bin,8 1 scale,zscale 1 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 view { .ds9.buttons.view.horizontal buttons(view,horizontal) .ds9.buttons.view.vertical buttons(view,vertical) .ds9.buttons.view.info buttons(view,info) .ds9.buttons.view.panner buttons(view,panner) .ds9.buttons.view.magnifier buttons(view,magnifier) .ds9.buttons.view.buttons buttons(view,buttons) .ds9.buttons.view.colorbar buttons(view,colorbar) .ds9.buttons.view.graphhorz buttons(view,graphhorz) .ds9.buttons.view.graphvert buttons(view,graphvert) .ds9.buttons.view.filename buttons(view,filename) .ds9.buttons.view.object buttons(view,object) .ds9.buttons.view.minmax buttons(view,minmax) .ds9.buttons.view.lowhigh buttons(view,lowhigh) .ds9.buttons.view.frame buttons(view,frame) .ds9.buttons.view.wcs buttons(view,wcs) .ds9.buttons.view.image buttons(view,image) .ds9.buttons.view.physical buttons(view,physical) .ds9.buttons.view.amplifier buttons(view,amplifier) .ds9.buttons.view.detector buttons(view,detector) .ds9.buttons.view.numerics buttons(view,numerics) } scale,96 0 scale,97 0 scale,98 0 file,exit 1 scale,99 0 region,showtext 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 help { .ds9.buttons.help.ref buttons(help,ref) .ds9.buttons.help.keyboard buttons(help,keyboard) .ds9.buttons.help.faq buttons(help,faq) .ds9.buttons.help.new buttons(help,new) .ds9.buttons.help.issue buttons(help,issue) .ds9.buttons.help.release buttons(help,release) .ds9.buttons.help.desk buttons(help,desk) .ds9.buttons.help.ack buttons(help,ack) .ds9.buttons.help.home buttons(help,home) } file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 edit { .ds9.buttons.edit.undo buttons(edit,undo) .ds9.buttons.edit.cut buttons(edit,cut) .ds9.buttons.edit.copy buttons(edit,copy) .ds9.buttons.edit.paste buttons(edit,paste) .ds9.buttons.edit.none buttons(edit,none) .ds9.buttons.edit.pointer buttons(edit,pointer) .ds9.buttons.edit.crosshair buttons(edit,crosshair) .ds9.buttons.edit.colorbar buttons(edit,colorbar) .ds9.buttons.edit.pan buttons(edit,pan) .ds9.buttons.edit.zoom buttons(edit,zoom) .ds9.buttons.edit.rotate buttons(edit,rotate) .ds9.buttons.edit.catalog buttons(edit,catalog) .ds9.buttons.edit.examine buttons(edit,examine) .ds9.buttons.edit.prefs buttons(edit,prefs) } region,load 1 region,savetemplate 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 wcs { .ds9.buttons.wcs.fk4 buttons(wcs,fk4) .ds9.buttons.wcs.fk5 buttons(wcs,fk5) .ds9.buttons.wcs.icrs buttons(wcs,icrs) .ds9.buttons.wcs.galactic buttons(wcs,galactic) .ds9.buttons.wcs.ecliptic buttons(wcs,ecliptic) .ds9.buttons.wcs.degrees buttons(wcs,degrees) .ds9.buttons.wcs.sexagesimal buttons(wcs,sexagesimal) } edit,catalog 1 frame,tile 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 zoom,1/2 1 color,blue 0 region { .ds9.buttons.region.show buttons(region,show) .ds9.buttons.region.showtext buttons(region,showtext) .ds9.buttons.region.info buttons(region,info) .ds9.buttons.region.front buttons(region,front) .ds9.buttons.region.back buttons(region,back) .ds9.buttons.region.all buttons(region,all) .ds9.buttons.region.none buttons(region,none) .ds9.buttons.region.invert buttons(region,invert) .ds9.buttons.region.delete buttons(region,delete) .ds9.buttons.region.deleteall buttons(region,deleteall) .ds9.buttons.region.newgroup buttons(region,newgroup) .ds9.buttons.region.group buttons(region,group) .ds9.buttons.region.create buttons(region,create) .ds9.buttons.region.dissolve buttons(region,dissolve) .ds9.buttons.region.loadtemplate buttons(region,loadtemplate) .ds9.buttons.region.savetemplate buttons(region,savetemplate) .ds9.buttons.region.list buttons(region,list) .ds9.buttons.region.load buttons(region,load) .ds9.buttons.region.save buttons(region,save) .ds9.buttons.region.circle buttons(region,circle) .ds9.buttons.region.ellipse buttons(region,ellipse) .ds9.buttons.region.box buttons(region,box) .ds9.buttons.region.polygon buttons(region,polygon) .ds9.buttons.region.line buttons(region,line) .ds9.buttons.region.vector buttons(region,vector) .ds9.buttons.region.text buttons(region,text) .ds9.buttons.region.point buttons(region,point) .ds9.buttons.region.ruler buttons(region,ruler) .ds9.buttons.region.compass buttons(region,compass) .ds9.buttons.region.projection buttons(region,projection) .ds9.buttons.region.annulus buttons(region,annulus) .ds9.buttons.region.ellipseannulus buttons(region,ellipseannulus) .ds9.buttons.region.boxannulus buttons(region,boxannulus) .ds9.buttons.region.panda buttons(region,panda) .ds9.buttons.region.epanda buttons(region,epanda) .ds9.buttons.region.bpanda buttons(region,bpanda) } file,psprint 0 zoom,1/4 1 wcs,ecliptic 1 region,newgroup 0 region,save 1 color,aips0 1 major {.ds9.buttons.major.file .ds9.buttons.major.edit .ds9.buttons.major.view .ds9.buttons.major.frame .ds9.buttons.major.bin .ds9.buttons.major.zoom .ds9.buttons.major.scale .ds9.buttons.major.color .ds9.buttons.major.region .ds9.buttons.major.wcs .ds9.buttons.major.help} wcs,galactic 1 zoom,1/8 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,hist 1 view,numerics 0 zoom,4 1 color,reset 0 file,about 1 view,detector 0 view,minmax 0 frame,new 1 zoom,8 1 region,show 0 zoom,center 0 frame { .ds9.buttons.frame.new buttons(frame,new) .ds9.buttons.frame.newrgb buttons(frame,newrgb) .ds9.buttons.frame.delete buttons(frame,delete) .ds9.buttons.frame.deleteall buttons(frame,deleteall) .ds9.buttons.frame.clear buttons(frame,clear) .ds9.buttons.frame.reset buttons(frame,reset) .ds9.buttons.frame.refresh buttons(frame,refresh) .ds9.buttons.frame.single buttons(frame,single) .ds9.buttons.frame.tile buttons(frame,tile) .ds9.buttons.frame.blink buttons(frame,blink) .ds9.buttons.frame.size buttons(frame,size) .ds9.buttons.frame.matchframe buttons(frame,matchframe) .ds9.buttons.frame.matchcolor buttons(frame,matchcolor) .ds9.buttons.frame.matchscale buttons(frame,matchscale) .ds9.buttons.frame.cube buttons(frame,cube) .ds9.buttons.frame.rgb buttons(frame,rgb) .ds9.buttons.frame.movefirst buttons(frame,movefirst) .ds9.buttons.frame.moveprev buttons(frame,moveprev) .ds9.buttons.frame.movenext buttons(frame,movenext) .ds9.buttons.frame.movelast buttons(frame,movelast) .ds9.buttons.frame.first buttons(frame,first) .ds9.buttons.frame.prev buttons(frame,prev) .ds9.buttons.frame.next buttons(frame,next) .ds9.buttons.frame.last buttons(frame,last) } zoom,fit 1 region,ellipseannulus 0 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 scale,92.5 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 majorCurrent .ds9.buttons.file wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 zoom { .ds9.buttons.zoom.center buttons(zoom,center) .ds9.buttons.zoom.align buttons(zoom,align) .ds9.buttons.zoom.in buttons(zoom,in) .ds9.buttons.zoom.out buttons(zoom,out) .ds9.buttons.zoom.fit buttons(zoom,fit) .ds9.buttons.zoom.z132 buttons(zoom,1/32) .ds9.buttons.zoom.z116 buttons(zoom,1/16) .ds9.buttons.zoom.z18 buttons(zoom,1/8) .ds9.buttons.zoom.z14 buttons(zoom,1/4) .ds9.buttons.zoom.z12 buttons(zoom,1/2) .ds9.buttons.zoom.z1 buttons(zoom,1) .ds9.buttons.zoom.z2 buttons(zoom,2) .ds9.buttons.zoom.z4 buttons(zoom,4) .ds9.buttons.zoom.z8 buttons(zoom,8) .ds9.buttons.zoom.z16 buttons(zoom,16) .ds9.buttons.zoom.z32 buttons(zoom,32) .ds9.buttons.zoom.none buttons(zoom,none) .ds9.buttons.zoom.x buttons(zoom,x) .ds9.buttons.zoom.y buttons(zoom,y) .ds9.buttons.zoom.xy buttons(zoom,xy) .ds9.buttons.zoom.0 buttons(zoom,0) .ds9.buttons.zoom.90 buttons(zoom,90) .ds9.buttons.zoom.180 buttons(zoom,180) .ds9.buttons.zoom.270 buttons(zoom,270) .ds9.buttons.zoom.params buttons(zoom,params) } color,heat 1 color {.ds9.buttons.color.grey buttons(color,grey) .ds9.buttons.color.red buttons(color,red) .ds9.buttons.color.green buttons(color,green) .ds9.buttons.color.blue buttons(color,blue) .ds9.buttons.color.a buttons(color,a) .ds9.buttons.color.b buttons(color,b) .ds9.buttons.color.bb buttons(color,bb) .ds9.buttons.color.he buttons(color,he) .ds9.buttons.color.i8 buttons(color,i8) .ds9.buttons.color.aips0 buttons(color,aips0) .ds9.buttons.color.sls buttons(color,sls) .ds9.buttons.color.hsv buttons(color,hsv) .ds9.buttons.color.heat buttons(color,heat) .ds9.buttons.color.cool buttons(color,cool) .ds9.buttons.color.rainbow buttons(color,rainbow) .ds9.buttons.color.standard buttons(color,standard) .ds9.buttons.color.staircase buttons(color,staircase) .ds9.buttons.color.color buttons(color,color) .ds9.buttons.color.invert buttons(color,invert) .ds9.buttons.color.reset buttons(color,reset) .ds9.buttons.color.params buttons(color,params) } edit,zoom 1 file { .ds9.buttons.file.about buttons(file,about) .ds9.buttons.file.open buttons(file,open) .ds9.buttons.file.saveimage buttons(file,saveimage) .ds9.buttons.file.savefits buttons(file,savefits) .ds9.buttons.file.savempeg buttons(file,savempeg) .ds9.buttons.file.header buttons(file,header) .ds9.buttons.file.xpa buttons(file,xpa) .ds9.buttons.file.console buttons(file,console) .ds9.buttons.file.tcl buttons(file,tcl) .ds9.buttons.file.pspage buttons(file,pspage) .ds9.buttons.file.psprint buttons(file,psprint) .ds9.buttons.file.page buttons(file,page) .ds9.buttons.file.print buttons(file,print) .ds9.buttons.file.exit buttons(file,exit) } region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 zoom,1/16 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 zoom,1/32 0 region,line 0 region,epanda 0 zoom,out 1 scale,99.5 0 bin,sum 0 bin,256x 0 region,bpanda 0 bin,64 1 } # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] # Edit prefs set prefs(ds9,mode) pointer set ds9(mode) pointer # Frame prefs global tile set prefs(tile,mode) grid set tile(mode) grid global blink set prefs(blink,interval) 500 set blink(interval) 500 # Zoom prefs global current global wcs set prefs(zoom) { 1 1 } set current(zoom) { 1 1 } set prefs(orient) none set current(orient) none set prefs(rotate) 0 set current(rotate) 0 # Color prefs global colorbar set prefs(colorbar,map) Grey set colorbar(map) Grey set prefs(colorbar,invert) 0 set colorbar(invert) 0 # Region prefs global marker set prefs(marker,shape) {circle} set marker(shape) {circle} set prefs(marker,color) green set marker(color) green set prefs(marker,width) 1 set marker(width) 1 set prefs(marker,edit) 1 set marker(edit) 1 set prefs(marker,move) 1 set marker(move) 1 set prefs(marker,rotate) 1 set marker(rotate) 1 set prefs(marker,delete) 1 set marker(delete) 1 set prefs(marker,fixed) 0 set marker(fixed) 0 set prefs(marker,include) 1 set marker(include) 1 set prefs(marker,source) 1 set marker(source) 1 set prefs(marker,font) helvetica set marker(font) helvetica set prefs(marker,font,size) 10 set marker(font,size) 10 set prefs(marker,font,style) normal set marker(font,style) normal set prefs(marker,format) ds9 set marker(format) ds9 set prefs(marker,strip) 0 set marker(strip) 0 set prefs(marker,wcs) 0 set marker(wcs) 0 set prefs(marker,system) physical set marker(system) physical set prefs(marker,sky) fk5 set marker(sky) fk5 set prefs(marker,skyformat) degrees set marker(skyformat) degrees set marker(dialog,system) physical set marker(dialog,sky) fk5 set marker(dialog,skyformat) degrees set marker(dialog,dist,system) physical set marker(dialog,dist,format) degrees set marker(circle,radius) 20 set marker(ellipse,radius1) 40 set marker(ellipse,radius2) 20 set marker(box,radius1) 80 set marker(box,radius2) 40 set marker(polygon,width) 20 set marker(polygon,height) 20 set marker(projection,thick) 0 set marker(annulus,inner) 15 set marker(annulus,outer) 30 set marker(annulus,annuli) 1 set marker(ellipseannulus,radius1) 40 set marker(ellipseannulus,radius2) 20 set marker(ellipseannulus,radius3) 60 set marker(ellipseannulus,annuli) 1 set marker(boxannulus,radius1) 80 set marker(boxannulus,radius2) 40 set marker(boxannulus,radius3) 120 set marker(boxannulus,annuli) 1 set marker(panda,inner) 15 set marker(panda,outer) 30 set marker(panda,annuli) 1 set marker(panda,ang1) 0 set marker(panda,ang2) 360 set marker(panda,angnum) 4 set marker(epanda,radius1) 40 set marker(epanda,radius2) 20 set marker(epanda,radius3) 60 set marker(epanda,annuli) 1 set marker(epanda,ang1) 0 set marker(epanda,ang2) 360 set marker(epanda,angnum) 4 set marker(bpanda,radius1) 80 set marker(bpanda,radius2) 40 set marker(bpanda,radius3) 120 set marker(bpanda,annuli) 1 set marker(bpanda,ang1) 0 set marker(bpanda,ang2) 360 set marker(bpanda,angnum) 4 set marker(point,size) 11 global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false global nres set nres(server) {simbad-sao} global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green global hv set hv(archive,menu,1) {} set hv(archive,url,1) {} set hv(archive,menu,2) {} set hv(archive,url,2) {} set hv(archive,menu,3) {} set hv(archive,url,3) {} set hv(archive,menu,4) {} set hv(archive,url,4) {} global vo set vo(server) {http://cxc.harvard.edu/chandraed/list.txt} set vo(hv) 1 set vo(method) xpa set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} global analysis set prefs(analysis,log) 0 set analysis(log) 0 # Analysis Plot prefs set prefs(ap,grid) 1 set prefs(ap,grid,log) linearlinear set prefs(ap,discrete) 0 set prefs(ap,discrete,symbol) circle set prefs(ap,discrete,color) red set prefs(ap,linear) 1 set prefs(ap,linear,width) 1 set prefs(ap,linear,color) black set prefs(ap,linear,dash) no set prefs(ap,step) 0 set prefs(ap,step,width) 1 set prefs(ap,step,color) black set prefs(ap,step,dash) no set prefs(ap,quadratic) 0 set prefs(ap,quadratic,width) 1 set prefs(ap,quadratic,color) black set prefs(ap,quadratic,dash) no set prefs(ap,error,width) 1 set prefs(ap,error,color) red set prefs(ap,error,style) 1 set prefs(ap,titleFont) helvetica set prefs(ap,titleSize) 12 set prefs(ap,titleStyle) normal set prefs(ap,textlabFont) helvetica set prefs(ap,textlabSize) 10 set prefs(ap,textlabStyle) normal set prefs(ap,numlabFont) helvetica set prefs(ap,numlabSize) 10 set prefs(ap,numlabStyle) normal # Language set ds9(language) locale set ds9(language,name) English # Background Color prefs set ds9(bg,color) white # Blank/Inf/NaN Color prefs set ds9(nan,color) white # Font prefs set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } # Panner prefs global panner set panner(compass,image) 1 set panner(compass,wcs) 1 set panner(compass,wcs,system) wcs set panner(compass,wcs,sky) fk5 # Magnifier prefs global magnifier set magnifier(region) 1 set magnifier(cursor) 1 set magnifier(zoom) 4 # Truecolor Colorbar prefs global colorbar set colorbar(area) 0 set colorbar(mode) center # Dialog prefs global ds9 set ds9(dialog) native # PanZoom prefs global panzoom set panzoom(mode) click # Print Coordinates prefs global coord set coord(value) 1 set coord(image) 1 set coord(physical) 0 set coord(amplifier) 0 set coord(detector) 0 set coord(wcs) 1 set coord(wcsa) 0 set coord(wcsb) 0 set coord(wcsc) 0 set coord(wcsd) 0 set coord(wcse) 0 set coord(wcsf) 0 set coord(wcsg) 0 set coord(wcsh) 0 set coord(wcsi) 0 set coord(wcsj) 0 set coord(wcsk) 0 set coord(wcsl) 0 set coord(wcsm) 0 set coord(wcsn) 0 set coord(wcso) 0 set coord(wcsp) 0 set coord(wcsq) 0 set coord(wcsr) 0 set coord(wcss) 0 set coord(wcst) 0 set coord(wcsu) 0 set coord(wcsv) 0 set coord(wcsw) 0 set coord(wcsx) 0 set coord(wcsy) 0 set coord(wcsz) 0 set coord(sky) fk5 set coord(skyformat) sexagesimal # Examine prefs global examine set examine(mode) new set examine(zoom) 4 # Misc prefs global ds9 set ds9(tmpdir) {/tmp} set ds9(automarker) 1 set ds9(xpa) 1 set ds9(confirm) 1 # HTTP prefs global http set http(proxy) 0 set http(proxy,host) {} set http(proxy,port) {} set http(auth) 0 set http(auth,user) {} set http(auth,passwd) {} ������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.3.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023467 11322716562 016402� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.3 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 file,pspage 0 region,list 1 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 file,exit 1 scale,99 0 region,showtext 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,newgroup 0 region,save 1 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 frame,new 1 view,detector 0 view,minmax 0 zoom,8 1 region,show 0 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 width 1 dash 0 smooth 4 levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 wcs 0 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { view 1 color red } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-sao} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.4.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023506 11322716562 016375� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.4 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 file,pspage 0 region,list 1 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 file,exit 1 scale,99 0 region,showtext 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,newgroup 0 region,save 1 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 frame,new 1 view,detector 0 view,minmax 0 zoom,8 1 region,show 0 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 width 1 dash 0 smooth 4 levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 wcs 0 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-sao} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.5.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023510 11322716562 016371� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.5.1 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 file,pspage 0 region,list 1 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,polygon 0 region,none 1 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 region,show 0 frame,new 1 view,detector 0 view,minmax 0 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 width 1 dash 0 smooth 4 levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 wcs 0 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-sao} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.5.6.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023664 11322716562 016404� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.6.3 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,polygon 0 region,none 1 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 region,show 0 view,detector 0 view,minmax 0 frame,new 1 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 file,samp 1 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {sao} set cat(sym,shape) {circle point} set cat(sym,color) green set cat(vot) 1 # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 width 1 dash 0 color,msg Green smooth 4 levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 set ds9(samp,auto) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees paste,sky fk5 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 wcs 0 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees paste,system wcs circle,radius 20 load current width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 ellipseannulus,annuli 1 panda,ang1 0 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-sao} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] ����������������������������������������������������������������������������saods9/tests/prefs/ds9.5.7.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023710 11322716162 016371� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 5.7 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 help,issue 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,polygon 0 region,none 1 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 region,show 0 view,detector 0 view,minmax 0 frame,new 1 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 help,user 1 file,samp 1 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {cds} set cat(sym,shape) {circle point} set cat(sym,color) green set cat(vot) 1 # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { scale linear method block view 0 width 1 dash 0 color,msg Green smooth 4 levels 5 min {} mode minmax max {} color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 set ds9(samp,auto) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} xpa {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} unique 0 } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees paste,sky fk5 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees paste,system wcs circle,radius 20 load current width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 ellipseannulus,annuli 1 panda,ang1 0 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-cds} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] ��������������������������������������������������������saods9/tests/prefs/ds9.6.0.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023623 11355450075 016372� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 6.0 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } # Analysis prefs global analysis global panalysis array set panalysis { log 0 } array set analysis [array get panalysis] # AP prefs global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } # Bin prefs global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] # Blink prefs global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] # Buttons prefs global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 file,header 1 edit,cut 0 file,savefits 0 region,all 1 scale,user 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 color,standard 0 region,deleteall 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 frame,movenext 0 region,group 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,polygon 0 region,none 1 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 region,show 0 view,detector 0 view,minmax 0 frame,new 1 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 help,user 1 file,samp 1 region,bpanda 0 bin,64 1 } # CAT prefs global cat set cat(server) {cds} set cat(sym,shape) {circle point} set cat(sym,color) green set cat(vot) 1 # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { font,style normal orientation horizontal invert 0 font,size 10 numerics 1 map Grey font helvetica } array set colorbar [array get pcolorbar] # Contour prefs global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] # Coord prefs global coord array set coord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } # Current prefs global current global pcurrent array set pcurrent { orient none zoom { 1 1 } rotate 0 } array set current [array get pcurrent] # DS9 prefs global ds9 global pds9 array set pds9 { mode pointer } array set ds9 [array get pds9] set ds9(analysis,user) {} set ds9(analysis,user2) {} set ds9(analysis,user3) {} set ds9(analysis,user4) {} set ds9(automarker) 1 set ds9(bg,color) white set ds9(confirm) 1 set ds9(dialog) native set ds9(font) default set ds9(font,size) 10 set ds9(font,style) normal if {$ds9(font) != "default"} { option add *font {default 10 normal} } set ds9(language) locale set ds9(language,name) English set ds9(nan,color) white set ds9(tmpdir) {/tmp} set ds9(xpa) 1 set ds9(samp,auto) 1 # Examine prefs global examine array set examine { zoom 4 mode new } # Graph prefs global graph set graph(horz,grid) 1 set graph(horz,log) false set graph(vert,grid) 1 set graph(vert,log) false # HTTP prefs global http array set http { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 timeout 240000 proxy,port {} } # HV prefs global hv array set hv { archive,url,3 {} archive,menu,1 {} archive,url,4 {} archive,menu,2 {} archive,menu,3 {} archive,url,1 {} archive,menu,4 {} archive,url,2 {} windows {} unique 0 } # Magnifier prefs global magnifier array set magnifier { region 1 zoom 4 cursor 1 size 128 } # Marker prefs global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 rotate 1 move 1 fixed 0 skyformat degrees paste,sky fk5 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 epanda,radius1 40 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 source 1 dialog,system physical strip 0 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 system physical boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 dialog,dist,format degrees paste,system wcs circle,radius 20 load current width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 maxdialog 48 ellipseannulus,annuli 1 panda,ang1 0 } array set marker [array get pmarker] # Mask prefs global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] # MinMax prefs global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] # NRES prefs global nres set nres(server) {simbad-cds} # Panner prefs global panner array set panner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 size 128 } # PanZoom prefs global panzoom global ppanzoom set panzoom(mode) click array set ppanzoom { preserve 0 } array set panzoom [array get ppanzoom] # Postscript prefs global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] # Scale prefs global scale global pscale array set pscale { min 1 preserve 0 xaxis full mode minmax datasec 1 max 100 yaxis log type linear scope local } array set scale [array get pscale] # Smooth prefs global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] # Tile prefs global tile global ptile array set ptile { mode grid } array set tile [array get ptile] # View prefs global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] # WCS prefs global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] # VO prefs global vo set vo(server) http://cxc.harvard.edu/chandraed/list.txt set vo(hv) 1 set vo(method) xpa # ZScale prefs global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] �������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.6.1.prf����������������������������������������������������������������������000644 �000765 �000000 �00000022142 11431323362 016357� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 6.1.2 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } global pds9 array set pds9 { dialog native samp 1 automarker 1 font,style normal language locale nan white backup 1 confirm 1 font default language,dir {} xpa 1 bg white language,name English tcl 0 font,size 10 } if {$pds9(font) != "default"} { option add *font {default 10 normal} } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode pointer display single rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 color,numerics 0 major,wcs 1 zoom,i8 1 view,colorbar 1 frame,matchbin 0 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 color,vert 0 file,header 1 edit,cut 0 region,all 1 file,savefits 0 scale,user 0 file,samp,image 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 region,deleteall 0 color,standard 0 help,faq 0 region,load 1 region,savetemplate 0 scale,925 0 region,loadtemplate 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 frame,matchframe 0 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 file,samp,table 0 scale,squared 1 scale,datasec 0 region,back 1 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 zoom,0 0 region,front 1 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 color,numspace 0 region,show 0 view,minmax 0 view,detector 0 frame,new 1 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 color,numvalue 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 help,user 1 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 cursor 1 } global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.2 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { preserve 0 datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 annulus,inner 15 panda,angnum 4 autocentroid 0 show,text 1 epanda,angnum 4 font,size 10 move 1 rotate 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 epanda,radius1 40 panda,outer 30 panda,annuli 1 epanda,radius2 20 epanda,radius3 60 source 1 dialog,system physical bpanda,radius1 80 bpanda,radius2 40 dialog,skyformat degrees epanda,annuli 1 bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 polygon,width 20 font,style normal edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 include 1 epanda,ang1 0 dialog,dist,format degrees epanda,ang2 360 circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,color green vot 1 sym,shape {circle point} loc 500 server cds } global pvo array set pvo { method xpa hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { step,dash no step,width 1 titleFont helvetica quadratic,color black numlabSize 10 error 1 linear 1 textlabStyle normal numlabFont helvetica error,width 1 quadratic 0 grid 1 discrete,color red textlabSize 10 linear,width 1 step,color black numlabStyle normal quadratic,dash no quadratic,width 1 textlabFont helvetica titleStyle normal discrete 0 grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } global panalysis array set panalysis { user2 {} user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 space 0 orientation horizontal font,style normal map Grey numerics 1 font,size 10 size 20 font helvetica } array set colorbar [array get pcolorbar] ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.6.2.prf����������������������������������������������������������������������000644 �000765 �000000 �00000023462 11576454532 016404� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 6.2 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } global pds9 array set pds9 { nan,msg White dialog motif samp 1 font,msg Helvetica font,weight normal automarker 1 bg,msg White language locale font,slant roman nan white backup 1 confirm 1 language,dir {} font helvetica language,name English xpa 1 bg white tcl 0 font,size 9 } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode pointer display single rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 frame,matchframe,amplifier 0 help,story 0 help,new 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 view,horizontal 0 color,numerics 0 major,wcs 1 zoom,i8 1 view,colorbar 1 frame,matchbin 0 color,sls 0 frame,clear 1 bin,1 1 bin,2 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 bin,average 0 bin,128x 0 color,cool 1 view,image 0 frame,reset 0 scale,95 0 color,staircase 0 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 help,ref 1 color,grey 1 view,filename 0 view,magnifier 1 region,vector 0 color,green 0 color,vert 0 file,header 1 edit,cut 0 region,all 1 file,savefits 0 scale,user 0 file,samp,image 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 region,deleteall 0 color,standard 0 help,faq 0 region,load 1 region,savetemplate 0 region,loadtemplate 0 scale,925 0 zoom,params 0 color,rainbow 1 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 bin,fit 1 region,circle 0 region,ruler 0 view,physical 0 color,a 1 color,b 1 scale,sqrt 1 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 bin,128 0 file,print 1 frame,delete 1 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 frame,matchframe,physical 0 region,back 1 file,samp,table 0 scale,squared 1 scale,datasec 0 help,desk 1 frame,cube 0 region,ellipse 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 region,front 1 zoom,0 0 zoom,1 1 frame,matchcolor 0 frame,moveprev 0 zoom,2 1 scale,995 0 scale,hist 1 zoom,4 1 color,reset 0 file,about 1 color,numspace 0 region,show 0 view,minmax 0 view,detector 0 frame,new 1 zoom,8 1 zoom,center 0 zoom,fit 1 region,ellipseannulus 0 major,bin 1 frame,next 1 edit,pan 1 view,info 1 bin,1024x 0 bin,out 1 view,object 0 frame,matchframe,image 0 frame,matchframe,wcs 0 color,invert 0 region,info 1 region,create 0 file,tcl 0 color,bb 1 graphics 0 region,circle3d 0 wcs,sexagesimal 1 region,panda 0 frame,matchframe,detector 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 bin,16 1 major,frame 1 color,color 0 help,ack 1 frame,prev 1 color,i8 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 help,keyboard 1 scale,log 1 bin,4096x 0 file,savempeg 0 frame,matchscale 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 view,graphhorz 1 color,hsv 0 color,numvalue 0 region,line 0 zoom,out 1 region,epanda 0 bin,sum 0 bin,256x 0 help,user 1 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass,wcs,system wcs compass,image 1 compass,wcs,sky fk5 compass,wcs 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 color,msg White cursor 1 color white } global ps global pps array set pps { scale scaled orient portrait height 11 size letter resolution 150 dest printer level 2 width 8.5 filename ds9.ps color2 color cmd lp color rgb } array set ps [array get pps] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global bin global pbin array set pbin { depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.2 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { preserve 0 datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 dialog,dist,system physical bpanda,ang2 360 boxannulus,annuli 1 delete 1 centroid,radius 10 annulus,inner 15 panda,angnum 4 show,text 1 epanda,angnum 4 centroid,iteration 30 circle3d,radius 20 font,size 10 rotate 1 move 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 epanda,radius1 40 panda,outer 30 panda,annuli 1 epanda,radius2 20 epanda,radius3 60 source 1 dialog,system physical bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 dialog,skyformat degrees bpanda,radius3 120 sky fk5 color green format ds9 annulus,outer 30 font,weight normal polygon,width 20 font,slant roman edit 1 font helvetica bpanda,angnum 4 dash 0 dialog,sky fk5 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 centroid,auto 0 dialog,dist,format degrees circle,radius 20 width 1 bpanda,annuli 1 projection,method 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 circle3d,method 1 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal align,system wcs system wcs align,sky fk5 sky fk5 align 0 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { skyformat sexagesimal wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 image 1 wcsf 0 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 sky fk5 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,font,weight normal vot 1 loc 500 server cds sym,color,msg Green sym,font,msg Helvetica sym,font,slant roman sym,font,size 10 sym,font,weight, {} sym,color green sym,font helvetica sym,shape {circle point} } global pvo array set pvo { method xpa hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { step,dash no step,width 1 discrete,color,msg Red numlabFont,msg Helvetica titleFont helvetica quadratic,color black step,color,msg Black numlabSize 9 titleWeight normal error 1 linear 1 textlabFont,msg Helvetica numlabFont helvetica textlabSlant roman error,width 1 quadratic 0 grid 1 discrete,color red numlabWeight normal textlabSize 9 linear,width 1 step,color black error,color,msg Red linear,color,msg Black numlabSlant roman quadratic,dash no quadratic,width 1 textlabFont helvetica discrete 0 quadratic,color,msg Black titleFont,msg Helvetica textlabWeight normal titleSlant roman grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } global panalysis array set panalysis { user2 {} user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 space 0 orientation horizontal font,slant roman ticks 11 map Grey numerics 1 font,size 9 size 20 font helvetica font,weight normal } array set colorbar [array get pcolorbar] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.7.0.prf����������������������������������������������������������������������000644 �000765 �000000 �00000025723 11765664114 016404� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 7.0 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } global pds9 array set pds9 { nan,msg White dialog motif text,font courier samp 1 font,msg Helvetica threads 8 font,weight normal automarker 1 bg,msg White language locale text,font,weight normal dialog,all 0 nan white font,slant roman confirm 1 backup 1 language,dir {} font helvetica language,name English bg white xpa 1 text,font,msg Courier theme native tcl 0 font,size 9 text,font,slant roman text,font,size 9 } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode pointer display single rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 frame,lock,frame,physical 0 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 frame,lock,scale 0 help,story 0 help,new 0 frame,match,color 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,lock,cube 0 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 scale,asinh 1 color,numerics 0 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,match,crop,wcs 0 frame,clear 1 bin,1 1 bin,2 1 frame,new3d 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 frame,lock,crop,none 0 frame,lock,frame,detector 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 frame,match,crop,image 0 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 frame,match,cube 0 color,cool 1 frame,match,frame,amplifier 0 bin,average 0 bin,128x 0 frame,lock,crosshair,image 0 color,staircase 0 view,image 0 frame,reset 0 scale,95 0 file,save 1 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 frame,lock,crop,physical 0 help,ref 1 color,grey 1 frame,lock,crop,amplifier 0 frame,lock,crosshair,none 0 view,filename 0 view,magnifier 1 region,vector 0 frame,lock,crosshair,wcs 0 color,vert 0 color,green 0 file,header 1 edit,crop 1 edit,cut 0 frame,lock,crop,image 0 frame,match,scale 0 region,all 1 scale,user 0 file,samp,image 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 region,deleteall 0 color,standard 0 frame,match,frame,physical 0 help,faq 0 frame,lock,frame,image 0 region,load 1 frame,match,frame,image 0 region,savetemplate 0 region,loadtemplate 0 scale,925 0 color,rainbow 1 zoom,params 0 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 frame,lock,crosshair,amplifier 0 bin,fit 1 region,ruler 0 region,circle 0 frame,match,crosshair,amplifier 0 view,physical 0 color,a 1 color,b 1 frame,lock,crop,detector 0 scale,sqrt 1 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 frame,match,crosshair,physical 0 bin,128 0 file,print 1 frame,lock,crop,wcs 0 frame,delete 1 frame,lock,frame,none 0 frame,match,crop,physical 0 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 frame,match,crosshair,wcs 0 region,back 1 file,samp,table 0 frame,match,frame,detector 0 scale,squared 1 scale,datasec 0 help,desk 1 region,ellipse 0 frame,cube 0 view,graphvert 1 edit,none 1 major,edit 1 frame,lock,crosshair,physical 0 color,blue 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 region,front 1 zoom,0 0 zoom,1 1 frame,moveprev 0 zoom,2 1 scale,995 0 frame,match,frame,wcs 0 scale,hist 1 zoom,4 1 color,reset 0 color,numspace 0 file,about 1 region,show 0 view,minmax 0 view,detector 0 frame,new 1 frame,match,crop,amplifier 0 zoom,8 1 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 frame,match,crosshair,detector 0 frame,lock,frame,amplifier 0 bin,1024x 0 bin,out 1 view,object 0 frame,match,crop,detector 0 color,invert 0 region,create 0 region,info 1 frame,match,crosshair,image 0 scale,sinh 1 file,tcl 0 color,bb 1 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 frame,lock,color 0 bin,16 1 frame,lock,bin 0 frame,3d 0 major,frame 1 frame,lock,crosshair,detector 0 frame,match,bin 0 color,color 0 help,ack 1 color,i8 1 frame,prev 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 zoom,crop 0 help,keyboard 1 scale,log 1 frame,lock,frame,wcs 0 bin,4096x 0 zoom,align 0 help,home 1 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 color,hsv 0 view,graphhorz 1 file,export 0 region,line 0 color,numvalue 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 help,user 1 file,movie 0 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 color,msg White cursor 1 color white } global ps global pps array set pps { scale 100 orient portrait height 11 size letter resolution 150 filename,txt ds9.txt dest printer level 2 width 8.5 filename ds9.ps cmd lp color rgb } array set ps [array get pps] global pr global ppr array set ppr { } array set pr [array get ppr] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global threed global pthreed array set pthreed { highlite,color,msg Cyan highlite,color cyan method mip highlite 1 } array set threed [array get pthreed] global bin global pbin array set pbin { wheel,factor 1.01 wheel 0 lock 0 depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.01 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { preserve 0 datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 bpanda,ang2 360 boxannulus,annuli 1 delete 1 centroid,radius 10 annulus,inner 15 panda,angnum 4 show,text 1 centroid,iteration 30 epanda,angnum 4 plot2d 0 font,size 10 rotate 1 move 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 plot3d 1 epanda,radius1 40 panda,outer 30 panda,annuli 1 epanda,radius2 20 epanda,radius3 60 source 1 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 bpanda,radius3 120 color green format ds9 annulus,outer 30 font,weight normal polygon,width 20 font,slant roman edit 1 font helvetica bpanda,angnum 4 dash 0 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 include 1 epanda,ang1 0 centroid,auto 0 epanda,ang2 360 circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal system wcs sky fk5 align 0 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 wcsf 0 image 1 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 filename 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global pixel global ppixel array set ppixel { size 5 } array set pixel [array get ppixel] global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,font,weight normal vot 1 loc 500 server cds sym,color,msg Green sym,font,msg Helvetica sym,font,slant roman sym,font,size 10 sym,font,weight, {} sym,color green sym,font helvetica sym,shape {circle point} } global pvo array set pvo { method xpa hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { step,dash no step,width 1 discrete,color,msg Red numlabFont,msg Helvetica titleFont helvetica quadratic,color black step,color,msg Black numlabSize 9 titleWeight normal error 1 linear 1 textlabFont,msg Helvetica numlabFont helvetica textlabSlant roman error,width 1 quadratic 0 grid 1 discrete,color red numlabWeight normal textlabSize 9 linear,width 1 step,color black error,color,msg Red linear,color,msg Black numlabSlant roman quadratic,dash no quadratic,width 1 textlabFont helvetica discrete 0 quadratic,color,msg Black titleFont,msg Helvetica textlabWeight normal titleSlant roman grid,log linearlinear step 0 titleSize 12 error,color red discrete,symbol circle linear,color black error,style 1 linear,dash no } global panalysis array set panalysis { user2 {} autoload 1 user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 lock 0 size 20 font,weight normal space 0 tag red font,slant roman map grey numerics 1 font helvetica orientation horizontal font,size 9 ticks 11 tag,msg Red } array set colorbar [array get pcolorbar] ���������������������������������������������saods9/tests/prefs/ds9.7.1.prf����������������������������������������������������������������������000644 �000765 �000000 �00000026257 12131315525 016373� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 7.1 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } global pds9 array set pds9 { nan,msg White dialog motif text,font courier samp 1 font,msg Helvetica threads 8 font,weight normal automarker 1 bg,msg White language locale text,font,weight normal dialog,all 0 nan white font,slant roman confirm 1 backup 1 language,dir {} font helvetica language,name English bg white xpa 1 text,font,msg Courier theme native tcl 0 font,size 9 text,font,slant roman text,font,size 9 } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode pointer display single rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 frame,lock,frame,physical 0 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 frame,lock,scale 0 help,story 0 help,new 0 frame,match,color 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,lock,cube 0 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 frame,match,smooth 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 scale,asinh 1 color,numerics 0 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,match,crop,wcs 0 frame,clear 1 bin,1 1 bin,2 1 frame,new3d 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 frame,lock,crop,none 0 frame,lock,frame,detector 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 frame,match,crop,image 0 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 frame,match,cube 0 color,cool 1 frame,match,frame,amplifier 0 bin,average 0 bin,128x 0 frame,lock,crosshair,image 0 color,staircase 0 view,image 0 frame,reset 0 scale,95 0 file,save 1 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 frame,lock,crop,physical 0 help,ref 1 color,grey 1 frame,lock,crop,amplifier 0 frame,lock,crosshair,none 0 view,filename 0 view,magnifier 1 region,vector 0 frame,lock,crosshair,wcs 0 color,vert 0 color,green 0 file,header 1 edit,crop 1 edit,cut 0 frame,lock,crop,image 0 frame,match,scale 0 region,all 1 scale,user 0 file,samp,image 0 file,saveimage 1 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 region,deleteall 0 color,standard 0 frame,match,frame,physical 0 help,faq 0 frame,lock,frame,image 0 region,load 1 frame,match,frame,image 0 region,savetemplate 0 region,loadtemplate 0 scale,925 0 color,rainbow 1 zoom,params 0 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 file,xpa 0 region,annulus 0 frame,lock,crosshair,amplifier 0 bin,fit 1 region,ruler 0 region,circle 0 frame,match,crosshair,amplifier 0 view,physical 0 color,a 1 color,b 1 frame,lock,crop,detector 0 scale,sqrt 1 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 frame,match,crosshair,physical 0 bin,128 0 file,print 1 frame,lock,crop,wcs 0 frame,delete 1 frame,lock,frame,none 0 frame,match,crop,physical 0 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 frame,match,crosshair,wcs 0 help,about 1 region,back 1 file,samp,table 0 frame,match,frame,detector 0 scale,squared 1 scale,datasec 0 help,desk 1 region,ellipse 0 frame,cube 0 view,graphvert 1 edit,none 1 major,edit 1 frame,lock,crosshair,physical 0 color,blue 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 region,front 1 zoom,0 0 zoom,1 1 frame,moveprev 0 zoom,2 1 scale,995 0 frame,match,frame,wcs 0 scale,hist 1 zoom,4 1 color,reset 0 color,numspace 0 region,show 0 view,minmax 0 view,detector 0 frame,new 1 frame,match,crop,amplifier 0 zoom,8 1 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 frame,match,crosshair,detector 0 frame,lock,frame,amplifier 0 bin,1024x 0 bin,out 1 view,object 0 frame,lock,smooth 0 frame,match,crop,detector 0 color,invert 0 region,create 0 region,info 1 frame,match,crosshair,image 0 scale,sinh 1 color,bb 1 file,tcl 0 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 frame,lock,color 0 bin,16 1 frame,lock,bin 0 frame,3d 0 major,frame 1 frame,lock,crosshair,detector 0 frame,match,bin 0 color,color 0 help,ack 1 color,i8 1 frame,prev 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 zoom,crop 0 help,keyboard 1 scale,log 1 frame,lock,frame,wcs 0 bin,4096x 0 zoom,align 0 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 color,hsv 0 view,graphhorz 1 file,export 0 region,line 0 color,numvalue 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 help,user 1 file,movie 0 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 color,msg White cursor 1 color white } global ps global pps array set pps { scale 100 orient portrait height 11 size letter resolution 150 filename,txt ds9.txt dest printer level 2 width 8.5 filename ds9.ps cmd lp color rgb } array set ps [array get pps] global pr global ppr array set ppr { } array set pr [array get ppr] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global threed global pthreed array set pthreed { border,color,msg Blue highlite,color,msg Cyan scale 1 method mip highlite,color cyan border,color blue compass,color green highlite 1 border 1 compass 0 } array set threed [array get pthreed] global bin global pbin array set pbin { wheel,factor 1.2 wheel 0 lock 0 depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.2 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { preserve 0 datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 bpanda,ang2 360 boxannulus,annuli 1 delete 1 centroid,radius 10 dformat degrees annulus,inner 15 panda,angnum 4 show,text 1 epanda,angnum 4 centroid,iteration 30 plot2d 0 font,size 10 rotate 1 move 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 plot3d 1 epanda,radius1 40 panda,outer 30 panda,annuli 1 epanda,radius2 20 epanda,radius3 60 source 1 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 bpanda,radius3 120 color green format ds9 annulus,outer 30 font,weight normal polygon,width 20 font,slant roman edit 1 font helvetica bpanda,angnum 4 dash 0 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 include 1 epanda,ang1 0 centroid,auto 0 epanda,ang2 360 circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal system wcs sky fk5 align 0 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 wcsf 0 image 1 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 filename 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global pixel global ppixel array set ppixel { size 5 } array set pixel [array get ppixel] global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 lock 0 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,font,weight normal vot 1 loc 500 server cds sym,color,msg Green sym,font,msg Helvetica sym,font,slant roman sym,font,size 10 sym,font,weight, {} sym,color green sym,font helvetica sym,shape {circle point} } global pvo array set pvo { method xpa hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { textlabSlant roman quadratic 0 textlabFont,msg Helvetica numlabWeight normal quadratic,dash no textlabWeight normal graph,y,grid 1 quadratic,color black discrete,color,msg Red error 1 discrete,color red step,color black linear,color,msg Black discrete 0 graph,x,log 0 titleSize 12 error,color red bar 0 graph,y,flip 0 linear,color black step,dash no titleFont helvetica titleWeight normal linear 1 discrete,fill 1 textlabSize 9 graph,x,grid 1 numlabSlant roman quadratic,width 1 textlabFont helvetica quadratic,color,msg Black titleSlant roman step 0 discrete,symbol circle linear,dash no step,width 1 numlabFont,msg Helvetica step,color,msg Black numlabSize 9 graph,x,flip 0 numlabFont helvetica error,width 1 linear,width 1 error,color,msg Red bar,color black titleFont,msg Helvetica graph,y,log 0 } global panalysis array set panalysis { user2 {} autoload 1 user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 lock 0 size 20 font,weight normal space 0 tag red font,slant roman map grey numerics 1 font helvetica orientation horizontal font,size 9 ticks 11 tag,msg Red } array set colorbar [array get pcolorbar] �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.7.2.prf����������������������������������������������������������������������000644 �000765 �000000 �00000026303 12227332275 016373� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 7.2 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare $prefs(version) [lindex $ds9(version) 0]] == 1} { tk_messageBox -type ok -icon warning -message "[msgcat::mc {DS9 has detected a newer version of a preferences file and therefore will not process this file.}]" return } global pds9 array set pds9 { nan,msg White dialog motif text,font courier samp 1 font,msg Helvetica threads 8 font,weight normal automarker 1 bg,msg White language locale text,font,weight normal dialog,all 0 nan white font,slant roman confirm 1 backup 1 language,dir {} font helvetica language,name English bg white xpa 1 text,font,msg Courier theme native tcl 0 dialog,center 0 font,size 9 text,font,slant roman text,font,size 9 } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode pointer display single align 0 rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 frame,lock,frame,physical 0 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 frame,lock,scale 0 help,story 0 help,new 0 frame,match,color 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,lock,cube 0 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 bin,8192x 0 edit,prefs 0 frame,match,smooth 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 scale,asinh 1 color,numerics 0 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,match,crop,wcs 0 frame,clear 1 bin,1 1 bin,2 1 frame,new3d 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 frame,lock,crop,none 0 frame,lock,frame,detector 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 frame,match,crop,image 0 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 frame,match,cube 0 color,cool 1 frame,match,frame,amplifier 0 bin,average 0 bin,128x 0 frame,lock,crosshair,image 0 color,staircase 0 view,image 0 frame,reset 0 scale,95 0 file,save 1 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 file,exit 1 scale,99 0 frame,first 1 frame,lock,crop,physical 0 help,ref 1 color,grey 1 frame,lock,crop,amplifier 0 frame,lock,crosshair,none 0 view,filename 0 view,magnifier 1 file,backup 0 region,vector 0 frame,lock,crosshair,wcs 0 color,vert 0 color,green 0 file,header 1 edit,crop 1 edit,cut 0 frame,lock,crop,image 0 frame,match,scale 0 region,all 1 scale,user 0 file,samp,image 0 color,params 0 zoom,in 1 frame,movelast 0 edit,pointer 1 region,deleteall 0 color,standard 0 frame,match,frame,physical 0 help,faq 0 frame,lock,frame,image 0 region,load 1 frame,match,frame,image 0 region,savetemplate 0 region,loadtemplate 0 scale,925 0 color,rainbow 1 zoom,params 0 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 region,annulus 0 frame,lock,crosshair,amplifier 0 bin,fit 1 region,ruler 0 region,circle 0 frame,match,crosshair,amplifier 0 view,physical 0 color,a 1 color,b 1 frame,lock,crop,detector 0 scale,sqrt 1 zoom,i32 0 major,view 1 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 frame,match,crosshair,physical 0 bin,128 0 file,print 1 frame,lock,crop,wcs 0 frame,delete 1 frame,lock,frame,none 0 frame,match,crop,physical 0 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 frame,match,crosshair,wcs 0 help,about 1 region,back 1 file,samp,table 0 frame,match,frame,detector 0 scale,squared 1 scale,datasec 0 help,desk 1 region,ellipse 0 frame,cube 0 view,graphvert 1 edit,none 1 major,edit 1 frame,lock,crosshair,physical 0 color,blue 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 region,front 1 zoom,0 0 zoom,1 1 frame,moveprev 0 zoom,2 1 scale,995 0 frame,match,frame,wcs 0 scale,hist 1 zoom,4 1 color,reset 0 color,numspace 0 region,show 0 view,minmax 0 view,detector 0 frame,new 1 frame,match,crop,amplifier 0 zoom,8 1 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 frame,match,crosshair,detector 0 frame,lock,frame,amplifier 0 bin,1024x 0 file,xpa,info 0 bin,out 1 view,object 0 frame,lock,smooth 0 frame,match,crop,detector 0 color,invert 0 region,create 0 region,info 1 frame,match,crosshair,image 0 scale,sinh 1 color,bb 1 file,tcl 0 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 frame,lock,color 0 bin,16 1 frame,lock,bin 0 frame,3d 0 major,frame 1 file,restore 0 frame,lock,crosshair,detector 0 frame,match,bin 0 color,color 0 help,ack 1 color,i8 1 frame,prev 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 zoom,crop 0 help,keyboard 1 scale,log 1 frame,lock,frame,wcs 0 bin,4096x 0 zoom,align 0 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 color,hsv 0 view,graphhorz 1 region,line 0 color,numvalue 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 help,user 1 file,movie 0 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 color,msg White cursor 1 color white } global ps global pps array set pps { scale 100 orient portrait height 11 size letter resolution 150 filename,txt ds9.txt dest printer level 2 width 8.5 filename ds9.ps cmd lp color rgb } array set ps [array get pps] global pr global ppr array set ppr { } array set pr [array get ppr] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global threed global pthreed array set pthreed { border,color,msg Blue highlite,color,msg Cyan scale 1 method mip highlite,color cyan border,color blue compass,color green highlite 1 border 1 compass 0 } array set threed [array get pthreed] global bin global pbin array set pbin { wheel,factor 1.2 wheel 0 lock 0 depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.2 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { preserve 0 datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 bpanda,ang2 360 boxannulus,annuli 1 delete 1 centroid,radius 10 dformat degrees annulus,inner 15 panda,angnum 4 show,text 1 epanda,angnum 4 centroid,iteration 30 plot2d 0 font,size 10 rotate 1 move 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 plot3d 1 epanda,radius1 40 panda,outer 30 panda,annuli 1 epanda,radius2 20 epanda,radius3 60 source 1 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 bpanda,radius3 120 color green format ds9 annulus,outer 30 font,weight normal polygon,width 20 font,slant roman edit 1 font helvetica bpanda,angnum 4 dash 0 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 include 1 epanda,ang1 0 centroid,auto 0 epanda,ang2 360 circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 panda,ang1 0 ellipseannulus,annuli 1 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal system wcs sky fk5 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 wcsf 0 image 1 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 filename 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global pixel global ppixel array set ppixel { size 5 } array set pixel [array get ppixel] global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 lock 0 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,font,weight normal vot 1 loc 500 server cds sym,color,msg Green sym,font,msg Helvetica sym,font,slant roman sym,font,size 10 sym,font,weight, {} sym,color green sym,font helvetica sym,shape {circle point} } global pvo array set pvo { method mime hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { textlabSlant roman quadratic 0 textlabFont,msg Helvetica numlabWeight normal quadratic,dash no textlabWeight normal graph,y,grid 1 quadratic,color black discrete,color,msg Red error 1 discrete,color red step,color black linear,color,msg Black discrete 0 graph,x,log 0 titleSize 12 error,color red bar 0 graph,y,flip 0 linear,color black step,dash no titleFont helvetica titleWeight normal linear 1 discrete,fill 1 textlabSize 9 graph,x,grid 1 numlabSlant roman quadratic,width 1 textlabFont helvetica quadratic,color,msg Black titleSlant roman step 0 discrete,symbol circle linear,dash no step,width 1 numlabFont,msg Helvetica step,color,msg Black numlabSize 9 graph,x,flip 0 numlabFont helvetica error,width 1 linear,width 1 error,color,msg Red bar,color black titleFont,msg Helvetica graph,y,log 0 } global panalysis array set panalysis { user2 {} autoload 1 user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 lock 0 size 20 font,weight normal space 0 tag red font,slant roman map grey numerics 1 font helvetica orientation horizontal font,size 9 ticks 11 tag,msg Red } array set colorbar [array get pcolorbar] �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/prefs/ds9.7.3.prf����������������������������������������������������������������������000644 �000765 �000000 �00000026735 12464744765 016423� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global ds9 global prefs set prefs(version) 7.3.2 # this is a check for to ensure a match between the # current ds9 version matches the prefs version if {[string compare -length 3 $prefs(version) [lindex $ds9(version) 0]] == 1} { return } global pds9 array set pds9 { nan,msg White dialog motif text,font courier samp 1 font,msg Helvetica threads 8 font,weight normal automarker 1 bg,msg White language locale text,font,weight normal dialog,all 0 nan white font,slant roman confirm 1 backup 1 language,dir {} font helvetica language,name English bg white xpa 1 text,font,msg Courier tcl 0 dialog,center 0 font,size 9 text,font,slant roman text,font,size 9 } global current global pcurrent array set pcurrent { orient none zoom { 1 1 } mode none display single align 0 rotate 0 } array set current [array get pcurrent] global view global pview array set pview { info,wcss 0 info,wcsc 0 info,wcst 0 info,wcsd 0 graph,horz 0 info,wcsu 0 info,wcse 0 magnifier 1 info,lowhigh 0 info,wcsf 0 info,frame 1 info,image 1 info,wcsv 0 colorbar 1 info 1 info,wcsg 0 info,wcsw 0 info,wcs 1 info,wcsh 0 info,wcsx 0 info,physical 1 info,wcsi 0 info,wcsy 0 info,object 1 buttons 1 info,wcsj 0 info,wcsz 0 info,wcsk 0 info,filename 1 info,wcsl 0 info,amplifier 0 info,minmax 0 info,wcsm 0 info,detector 0 info,wcsn 0 panner 1 info,wcso 0 info,wcsp 0 layout horizontal info,wcsa 0 info,wcsq 0 graph,vert 0 info,wcsb 0 info,wcsr 0 } array set view [array get pview] global phttp array set phttp { auth,passwd {} proxy,host {} auth,user {} auth 0 proxy 0 proxy,port {} } global pbuttons array set pbuttons { color,he 1 frame,lock,frame,physical 0 view,lowhigh 0 frame,single 1 major,color 1 view,wcs 0 bin,in 1 view,buttons 1 help,release 1 file,open 1 edit,crosshair 1 view,panner 1 frame,lock,scale 0 help,story 0 help,new 0 frame,match,color 0 view,amplifier 0 scale,params 0 region,dissolve 0 major,zoom 1 frame,newrgb 1 major,file 1 bin,512x 0 file,console 0 frame,lock,cube,none 0 bin,8192x 0 edit,prefs 0 frame,match,smooth 0 bin,2048x 0 zoom,i2 1 edit,colorbar 1 zoom,i4 1 scale,minmax 1 scale,asinh 1 color,numerics 0 view,horizontal 0 major,wcs 1 zoom,i8 1 view,colorbar 1 color,sls 0 frame,match,crop,wcs 0 frame,clear 1 bin,1 1 bin,2 1 frame,new3d 1 zoom,16 0 edit,rotate 1 file,page 1 bin,4 1 zoom,none 0 region,list 1 file,pspage 0 frame,lock,crop,none 0 frame,lock,frame,detector 0 bin,8 1 scale,zscale 1 region,centroid 0 region,autocentroid 0 frame,size 0 zoom,270 0 scale,pow 1 frame,match,crop,image 0 scale,90 0 wcs,fk4 1 zoom,32 0 wcs,fk5 1 frame,blink 1 color,cool 1 frame,match,frame,amplifier 0 bin,average 0 bin,128x 0 frame,lock,crosshair,image 0 color,staircase 0 view,image 0 frame,reset 0 scale,95 0 file,save 1 scale,96 0 scale,97 0 major,scale 1 scale,98 0 region,showtext 0 edit,region 1 file,exit 1 scale,99 0 frame,first 1 frame,lock,crop,physical 0 help,ref 1 color,grey 1 frame,lock,crop,amplifier 0 frame,lock,crosshair,none 0 view,filename 0 view,magnifier 1 file,backup 0 region,vector 0 frame,lock,crosshair,wcs 0 color,vert 0 color,green 0 file,header 1 edit,crop 1 edit,cut 0 frame,lock,crop,image 0 frame,match,scale 0 region,all 1 scale,user 0 file,samp,image 0 color,params 0 zoom,in 1 frame,movelast 0 region,deleteall 0 color,standard 0 frame,match,frame,physical 0 help,faq 0 frame,lock,frame,image 0 region,load 1 frame,match,frame,image 0 region,savetemplate 0 region,loadtemplate 0 scale,925 0 color,rainbow 1 zoom,params 0 frame,refresh 0 zoom,i16 0 zoom,90 0 region,delete 1 edit,copy 0 region,annulus 0 frame,lock,crosshair,amplifier 0 bin,fit 1 region,ruler 0 region,circle 0 frame,match,crosshair,amplifier 0 color,a 1 view,physical 0 color,b 1 frame,match,cube,image 0 frame,lock,crop,detector 0 scale,sqrt 1 zoom,i32 0 major,view 1 frame,match,cube,wcs 0 view,vertical 0 region,point 0 region,group 0 frame,movenext 0 frame,match,crosshair,physical 0 bin,128 0 file,print 1 frame,lock,crop,wcs 0 frame,delete 1 frame,lock,frame,none 0 frame,match,crop,physical 0 frame,movefirst 0 color,red 0 region,none 1 region,polygon 0 bin,params 0 frame,last 1 scale,zmax 0 edit,catalog 1 frame,tile 1 major,help 1 region,compass 0 edit,paste 0 frame,match,crosshair,wcs 0 help,about 1 region,back 1 file,samp,table 0 frame,match,frame,detector 0 scale,squared 1 scale,datasec 0 frame,lock,cube,image 0 help,desk 1 region,ellipse 0 frame,cube 0 view,graphvert 1 edit,none 1 major,edit 1 color,blue 0 frame,lock,crosshair,physical 0 file,psprint 0 wcs,ecliptic 1 color,horz 0 region,save 1 region,newgroup 0 color,aips0 1 wcs,galactic 1 region,front 1 zoom,0 0 zoom,1 1 frame,moveprev 0 zoom,2 1 scale,995 0 frame,match,frame,wcs 0 scale,hist 1 zoom,4 1 color,reset 0 color,numspace 0 region,show 0 view,minmax 0 view,detector 0 frame,new 1 frame,match,crop,amplifier 0 zoom,8 1 zoom,center 0 region,ellipseannulus 0 zoom,fit 1 major,bin 1 frame,next 1 edit,pan 1 view,info 1 frame,match,crosshair,detector 0 frame,lock,frame,amplifier 0 bin,1024x 0 file,xpa,info 0 bin,out 1 view,object 0 frame,lock,smooth 0 frame,match,crop,detector 0 color,invert 0 region,create 0 region,info 1 frame,match,crosshair,image 0 scale,sinh 1 color,bb 1 file,tcl 0 wcs,sexagesimal 1 region,panda 0 region,boxannulus 0 wcs,degrees 1 region,box 0 wcs,icrs 1 view,frame 0 region,segment 0 frame,lock,color 0 bin,16 1 frame,lock,bin 0 frame,3d 0 major,frame 1 file,restore 0 frame,lock,crosshair,detector 0 frame,match,bin 0 color,color 0 help,ack 1 color,i8 1 frame,lock,cube,wcs 0 frame,prev 1 color,heat 1 edit,zoom 1 region,invert 0 edit,examine 1 bin,32 1 frame,deleteall 0 region,text 0 region,projection 0 zoom,crop 0 help,keyboard 1 scale,log 1 frame,lock,frame,wcs 0 bin,4096x 0 zoom,align 0 scale,linear 1 edit,undo 0 major,region 1 zoom,x 0 frame,rgb 0 bin,256 0 zoom,y 0 zoom,xy 0 zoom,180 0 color,hsv 0 view,graphhorz 1 region,line 0 color,numvalue 0 region,epanda 0 zoom,out 1 bin,sum 0 bin,256x 0 help,user 1 file,movie 0 region,bpanda 0 bin,64 1 } global ppanner array set ppanner { compass 1 } global pmagnifier array set pmagnifier { region 1 zoom 4 color,msg White cursor 1 color white } global ps global pps array set pps { scale 100 orient portrait height 11 size letter resolution 150 filename,txt ds9.txt dest printer level 2 width 8.5 filename ds9.ps cmd lp color rgb } array set ps [array get pps] global pr global ppr array set ppr { } array set pr [array get ppr] global blink global pblink array set pblink { interval 500 } array set blink [array get pblink] global tile global ptile array set ptile { grid,col 10 mode grid grid,row 10 grid,gap 4 grid,mode automatic } array set tile [array get ptile] global threed global pthreed array set pthreed { scale 1 compass,color green border,color blue highlite,color cyan method mip compass 0 border 1 highlite 1 background none border,color,msg Blue highlite,color,msg Cyan } array set threed [array get pthreed] global bin global pbin array set pbin { wheel,factor 1.2 wheel 0 lock 0 depth 1 buffersize 1024 function sum factor { 1 1 } } array set bin [array get pbin] global panzoom global ppanzoom array set ppanzoom { wheel,factor 1.2 preserve 0 wheel 1 mode click } array set panzoom [array get ppanzoom] global scale global pscale array set pscale { datasec 1 mode minmax scope local log 1000 type linear } array set scale [array get pscale] global minmax global pminmax array set pminmax { mode auto sample 25 } array set minmax [array get pminmax] global zscale global pzscale array set pzscale { line 120 contrast .25 sample 600 } array set zscale [array get pzscale] global marker global pmarker array set pmarker { panda,ang2 360 bpanda,ang1 0 shape circle show 1 bpanda,ang2 360 boxannulus,annuli 1 delete 1 centroid,radius 10 dformat degrees annulus,inner 15 panda,angnum 4 show,text 1 epanda,angnum 4 centroid,iteration 30 plot2d 0 font,size 10 rotate 1 move 1 fixed 0 ellipseannulus,radius1 40 ellipseannulus,radius2 20 ellipseannulus,radius3 60 epanda,radius1 40 plot3d 1 epanda,radius2 20 panda,outer 30 panda,annuli 1 epanda,radius3 60 segment,length 20 source 1 epsilon 3 bpanda,radius1 80 bpanda,radius2 40 epanda,annuli 1 bpanda,radius3 120 stats 0 color green format ds9 annulus,outer 30 font,weight normal polygon,width 20 font,slant roman edit 1 font helvetica bpanda,angnum 4 dash 0 projection,thick 0 boxannulus,radius1 80 dashlist {8 3} polygon,height 20 boxannulus,radius2 40 boxannulus,radius3 120 box,radius1 80 box,radius2 40 point,size 11 annulus,annuli 1 compass,radius 40 epanda,ang1 0 include 1 epanda,ang2 360 centroid,auto 0 circle,radius 20 width 1 bpanda,annuli 1 ellipse,radius1 40 preserve 0 panda,inner 15 ellipse,radius2 20 ellipseannulus,annuli 1 panda,ang1 0 } array set marker [array get pmarker] global wcs global pwcs array set pwcs { skyformat sexagesimal system wcs sky fk5 } array set wcs [array get pwcs] global pgraph array set pgraph { horz,log false horz,grid 1 vert,log false vert,grid 1 } global pcoord array set pcoord { wcss 0 wcsc 0 wcst 0 wcsd 0 wcsu 0 wcse 0 wcsv 0 wcsf 0 image 1 wcsw 0 wcsg 0 wcsx 0 wcsh 0 physical 0 wcs 1 wcsy 0 wcsi 0 wcsz 0 wcsj 0 wcsk 0 wcsl 0 filename 0 amplifier 0 wcsm 0 detector 0 wcsn 0 wcso 0 wcsp 0 value 1 wcsq 0 wcsa 0 wcsr 0 wcsb 0 } global pexamine array set pexamine { zoom 4 mode new } global pixel global ppixel array set ppixel { size 5 } array set pixel [array get ppixel] global mask global pmask array set pmask { transparency 0 color red mark 1 } array set mask [array get pmask] global contour global pcontour array set pcontour { numlevel 5 dash 0 width 1 method block color,msg Green smooth 4 color green } array set contour [array get pcontour] global smooth global psmooth array set psmooth { radius 3 lock 0 function gaussian view 0 } array set smooth [array get psmooth] global nres global pnres array set nres { server simbad-cds } array set nres [array get pnres] global pcat array set pcat { sym,units physical sym,font,weight normal vot 1 loc 500 server cds sym,color,msg Green sym,font,msg Helvetica sym,font,slant roman sym,font,size 10 sym,font,weight, {} sym,color green sym,font helvetica sym,shape {circle point} } global pvo array set pvo { method mime hv 1 delay 15 server http://cxc.harvard.edu/chandraed/list.txt } global pap array set pap { legend,position right axis,x,flip 0 show 1 graph,title,size 12 axis,title,weight normal error,cap 0 legend,title,family helvetica legend,title Legend axis,x,log 0 legend,font,slant roman axis,font,family,msg Helvetica error 1 axis,y,min {} axis,title,family,msg Helvetica axis,y,max {} axis,font,family helvetica shape,color,msg Red legend 0 legend,font,family helvetica graph,title,family,msg Helvetica legend,title,weight normal axis,y,grid 1 shape,color red error,color red graph,title,family helvetica axis,font,slant roman color black bar,relief raised legend,font,size 9 shape,symbol none legend,title,size 10 axis,font,weight normal graph,title,slant roman legend,font,weight normal axis,y,auto 1 axis,y,format {} dash 0 axis,y,flip 0 axis,title,slant roman smooth linear legend,title,slant roman graph,title,weight normal axis,x,format {} axis,y,title {} axis,y,log 0 axis,x,min {} axis,title,size 9 axis,x,grid 1 axis,x,max {} error,width 1 error,color,msg Red graph,title {} width 1 axis,title,family helvetica color,msg Black shape,fill 1 bar,mode normal axis,x,auto 1 axis,x,title {} axis,font,size 9 } global panalysis array set panalysis { user2 {} autoload 1 user3 {} log 0 user4 {} user {} } # Colorbar prefs global colorbar global pcolorbar array set pcolorbar { invert 0 lock 0 size 20 font,weight normal space 0 tag red font,slant roman map grey numerics 1 font helvetica orientation horizontal font,size 9 ticks 11 tag,msg Red } array set colorbar [array get pcolorbar] �����������������������������������saods9/tests/plot/4.dat�����������������������������������������������������������������������������000644 �000765 �000000 �00000000351 07713776174 015363� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������0.00 0.153 0.003 .2 80.00 0.021 0.001 .03 160.00 0.008 0.000 .01 240.00 0.007 0.000 .006 320.00 0.007 0.000 .005 400.00 0.006 0.000 .005 480.00 0.006 0.000 .004 560.00 0.006 0.000 .003 640.00 0.005 0.000 .004 720.00 0.005 0.000 .004 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/5.dat�����������������������������������������������������������������������������000644 �000765 �000000 �00000000433 07713776174 015365� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������0.00 0.153 0.003 .2 .005 80.00 0.021 0.001 .03 .005 160.00 0.008 0.000 .01 .005 240.00 0.007 0.000 .006 .005 320.00 0.007 0.000 .005 .005 400.00 0.006 0.000 .005 .005 480.00 0.006 0.000 .004 .005 560.00 0.006 0.000 .003 .005 640.00 0.005 0.000 .004 .005 720.00 0.005 0.000 .004 .005 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.2.dat�����������������������������������������������������������������������000644 �000765 �000000 �00000000223 10111150222 016435� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis 2 0.00 0.153 80.00 0.021 160.00 0.008 240.00 0.007 320.00 0.007 400.00 0.006 480.00 0.006 560.00 0.006 640.00 0.005 720.00 0.005 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.3.dat�����������������������������������������������������������������������000644 �000765 �000000 �00000000317 10111150222 016442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis 3 0.00 0.153 0.003 80.00 0.021 0.001 160.00 0.008 0.000 240.00 0.007 0.000 320.00 0.007 0.000 400.00 0.006 0.000 480.00 0.006 0.000 560.00 0.006 0.000 640.00 0.005 0.000 720.00 0.005 0.000 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.4.dat�����������������������������������������������������������������������000644 �000765 �000000 �00000000375 10111150404 016451� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis 4 0.00 0.153 0.003 .2 80.00 0.021 0.001 .03 160.00 0.008 0.000 .01 240.00 0.007 0.000 .006 320.00 0.007 0.000 .005 400.00 0.006 0.000 .005 480.00 0.006 0.000 .004 560.00 0.006 0.000 .003 640.00 0.005 0.000 .004 720.00 0.005 0.000 .004 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.5.dat�����������������������������������������������������������������������000644 �000765 �000000 �00000000457 10111150404 016453� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis 5 0.00 0.153 0.003 .2 .005 80.00 0.021 0.001 .03 .005 160.00 0.008 0.000 .01 .005 240.00 0.007 0.000 .006 .005 320.00 0.007 0.000 .005 .005 400.00 0.006 0.000 .005 .005 480.00 0.006 0.000 .004 .005 560.00 0.006 0.000 .003 .005 640.00 0.005 0.000 .004 .005 720.00 0.005 0.000 .004 .005 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.error.dat�������������������������������������������������������������������000644 �000765 �000000 �00000000053 07734146323 017456� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ERROR: This is a test of plot(stdin) ERROR �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.text.dat��������������������������������������������������������������������000644 �000765 �000000 �00000000553 07713776173 017327� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������$BEGINTEXT this is text that is inserted at the beginning of the $plot(stdin) call this text can be of any length and maybe contain multiple lines $ENDTEXT Title XAxis YAxis 3 0.00 0.153 0.003 80.00 0.021 0.001 160.00 0.008 0.000 240.00 0.007 0.000 320.00 0.007 0.000 400.00 0.006 0.000 480.00 0.006 0.000 560.00 0.006 0.000 640.00 0.005 0.000 720.00 0.005 0.000 �����������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.xy.dat����������������������������������������������������������������������000644 �000765 �000000 �00000000102 10111177377 016754� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis xy 1 5 2 7 3 11 4 2 5 11 6 5 7 7 8 11 9 4 10 4 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.xyex.dat��������������������������������������������������������������������000644 �000765 �000000 �00000000141 10111177377 017314� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis xyex 1 5 .5 2 7 .5 3 11 .5 4 2 .5 5 11 .5 6 5 .5 7 7 .5 8 11 .5 9 4 .5 10 4 .5 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.xyexey.dat������������������������������������������������������������������000644 �000765 �000000 �00000000201 10111150530 017625� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis xyexey 1 5 .5 .5 2 7 .5 .5 3 11 .5 .5 4 2 .5 .5 5 11 .5 .5 6 5 .5 .5 7 7 .5 .5 8 11 .5 .5 9 4 .5 .5 10 4 .5 .5 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/stdin.xyey.dat��������������������������������������������������������������������000644 �000765 �000000 �00000000141 10111177377 017315� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Title XAxis YAxis xyey 1 5 .5 2 7 .5 3 11 .5 4 2 .5 5 11 .5 6 5 .5 7 7 .5 8 11 .5 9 4 .5 10 4 .5 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/xy.dat����������������������������������������������������������������������������000644 �000765 �000000 �00000000051 07713776172 015653� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 3 2 5 3 9 4 0 5 9 6 3 7 5 8 9 9 2 10 2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/xyex.dat��������������������������������������������������������������������������000644 �000765 �000000 �00000000100 10111147331 016152� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 5 1 2 7 2 3 11 1 4 2 3 5 11 2 6 5 3 7 7 1 8 11 1 9 4 3 10 4 3 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/xyexey.dat������������������������������������������������������������������������000644 �000765 �000000 �00000000150 07713776173 016547� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 5 .5 .5 2 7 .5 .5 3 11 .5 .5 4 2 .5 .5 5 11 .5 .5 6 5 .5 .5 7 7 .5 .5 8 11 .5 .5 9 4 .5 .5 10 4 .5 .5 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/plot/xyey.dat��������������������������������������������������������������������������000644 �000765 �000000 �00000000100 07713776172 016204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 5 1 2 7 2 3 11 1 4 2 3 5 11 2 6 5 3 7 7 1 8 11 1 9 4 3 10 4 3 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.cat����������������������������������������������������������������������������000644 �000765 �000000 �00000030354 12131336426 015521� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # VizieR Astronomical Server: vizier.cfa.harvard.edu 2005-03-18T18:31:38 # Explanations and Statistics of UCDs: See LINK below # In case of problem, please report to: question@simbad.u-strasbg.fr # (link) # #Coosys J2000: eq_FK5 2000 #INFO Ref=Vxml14769 #INFO Target=202.483367+47.234489,bm=22.016000/22.019 #RESOURCE=16010735 #Name: J/ApJ/601/735 #Title: M51 luminous X-ray sources (Terashima+, 2004) #Table J_ApJ_601_735_sources: #Name: J/ApJ/601/735/sources #Title: Sources detected {\em(tables 1--3 of paper)} #Column _RAJ2000 (F9.5) Right ascension (FK5) Equinox=J2000. (computed by VizieR, not part of the original data) [ucd=POS_EQ_RA_MAIN] #Column _DEJ2000 (F9.5) Declination (FK5) Equinox=J2000. (computed by VizieR, not part of the original data) [ucd=POS_EQ_DEC_MAIN] #Column recno (I8) Record number within the original table (starting from 1) (link) [ucd=RECORD] #Column [TW2004] (I2) Sequential number (1) (link) [ucd=ID_NUMBER] #Column RAJ2000 (A11) Right ascension (J2000.0) [ucd=POS_EQ_RA_MAIN] #Column DEJ2000 (A11) Declination (J2000.0) [ucd=POS_EQ_DEC_MAIN] #Column 0.5-8keV (F6.1) 0.5-8keV band counts in observations 1 & 2 [ucd=PHOT_COUNTS_X] #Column e_0.5-8keV (F4.1) rms uncertainty on 0.5-8keV [ucd=ERROR] #Column l_0.5-2keV (A1) Limit flag on 0.5-2keV [ucd=CODE_LIMIT] #Column 0.5-2keV (F6.1) 0.5-2keV band counts in observations 1 & 2 [ucd=PHOT_COUNTS_X] #Column e_0.5-2keV (F4.1) ? rms uncertainty on 0.5-2keV [ucd=ERROR] #Column l_2-8keV (A1) Limit flag on 2-8keV [ucd=CODE_LIMIT] #Column 2-8keV (F6.1) 2-8keV band counts in observations 1 & 2 [ucd=PHOT_COUNTS_X] #Column e_2-8keV (F4.1) ? rms uncertainty on 2-8keV [ucd=ERROR] _RAJ2000 _DEJ2000 recno [TW2004] RAJ2000 DEJ2000 0.5-8keV e_0.5-8keV l_0.5-2keV 0.5-2keV e_0.5-2keV l_2-8keV 2-8keV e_2-8keV -------- -------- ----- -------- ------- ------- -------- ---------- ---------- -------- ---------- -------- ------ -------- 202.39871 +47.20031 1 1 13 29 35.69 +47 12 01.1 15.2 5.4 < 9.4 11.6 4.7 202.40229 +47.18483 2 2 13 29 36.55 +47 11 05.4 8.8 4.6 6.7 2.6 < 7.9 202.41217 +47.22331 3 3 13 29 38.92 +47 13 23.9 54.6 8.8 37.5 7.3 17.4 4.2 202.41242 +47.18433 4 4 13 29 38.98 +47 11 03.6 26.3 5.2 16.6 4.1 9.7 3.2 202.41438 +47.21214 5 5 13 29 39.45 +47 12 43.7 427.0 21.0 308.0 18.0 120.0 11.0 202.41650 +47.21025 6 6 13 29 39.96 +47 12 36.9 276.0 17.0 266.0 16.0 10.4 4.4 202.42354 +47.18119 7 7 13 29 41.65 +47 10 52.3 20.4 4.6 16.6 4.1 < 8.9 202.42712 +47.17853 8 8 13 29 42.51 +47 10 42.7 16.7 5.3 13.1 4.8 < 9.1 202.43042 +47.19297 9 9 13 29 43.30 +47 11 34.7 365.0 19.0 364.0 19.0 < 5.8 202.43354 +47.19900 10 10 13 29 44.05 +47 11 56.4 18.8 5.7 17.3 5.4 < 5.8 202.43412 +47.17231 11 11 13 29 44.19 +47 10 20.3 8.1 4.4 8.7 4.4 < 4.3 202.43562 +47.23242 12 12 13 29 44.55 +47 13 56.7 72.8 8.6 55.4 8.6 18.6 4.4 202.43696 +47.19128 13 13 13 29 44.87 +47 11 28.6 11.8 4.8 7.3 4.1 < 10.3 202.43962 +47.19750 14 14 13 29 45.51 +47 11 51.0 30.0 5.6 14.3 3.9 15.7 4.0 202.43967 +47.19033 15 15 13 29 45.52 +47 11 25.2 11.3 3.5 8.5 3.0 < 7.4 202.44142 +47.18214 16 16 13 29 45.94 +47 10 55.7 9.0 3.2 7.5 2.8 < 5.8 202.44213 +47.17842 17 17 13 29 46.11 +47 10 42.3 28.6 5.5 25.0 5.1 < 8.9 202.44592 +47.18453 18 18 13 29 47.02 +47 11 04.3 11.8 4.8 12.3 4.8 < 4.4 202.44796 +47.21703 19 19 13 29 47.51 +47 13 01.3 17.8 4.4 10.5 3.3 7.5 4.0 202.45329 +47.18928 20 20 13 29 48.79 +47 11 21.4 67.8 9.4 50.3 8.3 17.7 4.2 202.45429 +47.18147 21 21 13 29 49.03 +47 10 53.3 143.0 12.0 105.0 10.0 36.5 6.1 202.45479 +47.21583 22 22 13 29 49.15 +47 12 57.0 14.0 3.9 < 3.9 13.7 3.7 202.45858 +47.23886 23 23 13 29 50.06 +47 14 19.9 17.7 5.7 16.0 5.3 < 6.5 202.45867 +47.19425 24 24 13 29 50.08 +47 11 39.3 32.3 6.2 31.8 6.1 < 4.2 202.45979 +47.22297 25 25 13 29 50.35 +47 13 22.7 22.8 6.1 22.3 6.0 < 4.4 202.46113 +47.19864 26 26 13 29 50.67 +47 11 55.1 377.0 20.0 52.2 9.0 325.0 18.0 202.46175 +47.17536 27 27 13 29 50.82 +47 10 31.3 135.0 13.0 117.0 11.0 17.5 5.3 202.46400 +47.17567 28 28 13 29 51.36 +47 10 32.4 238.0 16.0 155.0 13.0 83.0 10.0 202.46575 +47.19778 29 29 13 29 51.78 +47 11 52.0 36.3 8.1 36.2 8.0 < 4.2 202.46696 +47.19078 30 30 13 29 52.07 +47 11 26.8 24.3 7.1 25.2 7.1 < 4.2 202.46717 +47.20356 31 31 13 29 52.12 +47 12 12.8 22.1 5.3 21.7 5.2 < 5.7 202.46762 +47.19156 32 32 13 29 52.23 +47 11 29.6 25.3 7.2 24.2 7.1 < 5.5 202.46971 +47.18089 33 33 13 29 52.73 +47 10 51.2 34.0 6.0 15.8 4.1 18.5 5.4 202.46971 +47.18928 34 34 13 29 52.73 +47 11 21.4 16.1 4.6 15.0 4.5 < 4.2 202.46979 +47.17850 35 35 13 29 52.75 +47 10 42.6 11.8 4.8 < 15.9 < 8.9 202.46996 +47.21247 36 36 13 29 52.79 +47 12 44.9 42.8 7.8 28.3 6.5 14.5 5.0 202.47213 +47.17842 37 37 13 29 53.31 +47 10 42.3 581.0 24.0 429.0 21.0 151.0 12.0 202.47304 +47.19247 38 38 13 29 53.53 +47 11 32.9 27.3 7.4 19.2 6.6 8.1 4.1 202.47308 +47.19067 39 39 13 29 53.54 +47 11 26.4 36.2 6.6 32.1 6.2 < 11.4 202.47342 +47.22300 40 40 13 29 53.62 +47 13 22.8 12.0 3.6 12.3 3.6 < 4.4 202.47383 +47.24331 41 41 13 29 53.72 +47 14 35.9 629.0 26.0 445.0 22.0 184.0 15.0 202.47412 +47.24214 42 42 13 29 53.79 +47 14 31.7 276.0 18.0 217.0 16.0 58.9 8.9 202.47471 +47.17536 43 43 13 29 53.93 +47 10 31.3 12.7 3.7 13.3 5.0 < 4.4 202.47500 +47.15647 44 44 13 29 54.00 +47 09 23.3 9.6 4.4 8.2 4.1 < 5.8 202.47567 +47.19172 45 45 13 29 54.16 +47 11 30.2 18.3 6.6 16.2 6.4 < 6.9 202.47575 +47.19361 46 46 13 29 54.18 +47 11 37.0 111.0 12.0 68.0 8.9 43.1 7.7 202.47600 +47.21672 47 47 13 29 54.24 +47 13 00.2 47.2 7.0 15.0 4.0 32.5 6.8 202.47654 +47.18931 48 48 13 29 54.37 +47 11 21.5 26.8 5.7 27.5 5.7 < 4.2 202.47721 +47.15600 49 49 13 29 54.53 +47 09 21.6 69.2 8.4 45.7 6.9 23.6 4.9 202.47900 +47.15622 50 50 13 29 54.96 +47 09 22.4 47.6 7.0 38.1 6.2 9.5 4.3 202.47913 +47.18394 51 51 13 29 54.99 +47 11 02.2 12.5 3.7 10.8 3.5 < 5.8 202.47971 +47.17839 52 52 13 29 55.13 +47 10 42.2 29.8 6.7 29.3 6.6 < 4.4 202.48017 +47.17950 53 53 13 29 55.24 +47 10 46.2 8.1 3.0 8.3 3.0 < 4.4 202.48104 +47.19542 54 54 13 29 55.45 +47 11 43.5 49.6 7.5 45.4 7.2 < 10.0 202.48112 +47.23389 55 55 13 29 55.47 +47 14 02.0 16.6 4.2 16.2 5.5 < 4.1 202.48179 +47.15519 56 56 13 29 55.63 +47 09 18.7 7.6 4.1 < 11.4 < 7.4 202.48192 +47.15294 57 57 13 29 55.66 +47 09 10.6 12.8 5.2 12.4 5.0 < 5.0 202.48208 +47.17878 58 58 13 29 55.70 +47 10 43.6 14.8 5.2 14.3 5.1 < 4.4 202.48275 +47.19569 59 59 13 29 55.86 +47 11 44.5 42.5 6.9 41.5 6.9 < 4.2 202.48358 +47.23081 60 60 13 29 56.06 +47 13 50.9 14.8 4.0 15.1 4.0 < 4.2 202.48396 +47.21017 61 61 13 29 56.15 +47 12 36.6 18.8 5.7 18.3 5.6 < 4.4 202.48946 +47.17697 62 62 13 29 57.47 +47 10 37.1 18.8 5.7 18.9 4.5 < 4.4 202.48988 +47.18008 63 63 13 29 57.57 +47 10 48.3 400.0 20.0 318.0 18.0 81.0 10.0 202.49008 +47.20172 64 64 13 29 57.62 +47 12 06.2 95.0 11.0 73.9 8.7 20.6 4.6 202.49317 +47.22236 65 65 13 29 58.36 +47 13 20.5 76.1 8.8 53.6 7.4 22.6 4.8 202.49467 +47.17497 66 66 13 29 58.72 +47 10 29.9 53.8 7.4 27.2 5.3 26.5 5.2 202.49592 +47.24283 67 67 13 29 59.02 +47 14 34.2 12.5 5.2 < 15.0 < 11.7 202.50233 +47.19333 68 68 13 30 00.56 +47 11 36.0 13.2 5.1 < 20.7 < 5.7 202.50425 +47.22889 69 69 13 30 01.02 +47 13 44.0 553.0 24.0 374.0 20.0 180.0 13.0 202.50467 +47.22581 70 70 13 30 01.12 +47 13 32.9 12.4 5.1 12.2 3.7 < 4.4 202.50529 +47.21228 71 71 13 30 01.27 +47 12 44.2 15.2 4.1 < 14.1 < 11.8 202.50783 +47.14547 72 72 13 30 01.88 +47 08 43.7 10.4 4.7 11.6 4.7 < 4.0 202.50875 +47.21058 73 73 13 30 02.10 +47 12 38.1 17.6 4.4 15.0 4.0 < 7.4 202.50887 +47.15017 74 74 13 30 02.13 +47 09 00.6 40.9 6.5 29.6 6.6 10.6 4.6 202.51708 +47.16764 75 75 13 30 04.10 +47 10 03.5 24.2 6.5 24.7 6.4 < 3.9 202.51800 +47.22244 76 76 13 30 04.32 +47 13 20.8 120.0 11.0 78.2 9.0 41.5 7.6 202.51862 +47.17539 77 77 13 30 04.47 +47 10 31.4 31.9 5.7 30.3 5.6 < 5.9 202.51942 +47.23806 78 78 13 30 04.66 +47 14 17.0 64.1 9.4 48.0 7.1 15.9 5.2 202.52425 +47.17553 79 79 13 30 05.82 +47 10 31.9 13.1 3.7 13.4 3.7 < 4.1 202.52517 +47.23444 80 80 13 30 06.04 +47 14 04.0 24.3 6.5 23.7 6.3 < 5.2 202.52613 +47.17122 81 81 13 30 06.27 +47 10 16.4 9.6 4.9 < 11.7 < 10.9 202.53150 +47.18497 82 82 13 30 07.56 +47 11 05.9 1680.0 42.0 1367.0 38.0 312.0 18.0 202.53704 +47.20514 83 83 13 30 08.89 +47 12 18.5 29.0 5.6 24.8 5.1 < 9.9 202.54596 +47.17797 84 84 13 30 11.03 +47 10 40.7 89.3 9.5 65.1 9.2 24.6 6.2 202.47000 +47.27903 85 1 13 29 52.80 +47 16 44.5 157.0 13.0 103.0 11.0 54.7 8.7 202.48138 +47.26539 86 2 13 29 55.53 +47 15 55.4 22.2 5.3 < 8.4 20.8 6.0 202.48775 +47.26569 87 3 13 29 57.06 +47 15 56.5 25.5 8.8 19.6 7.9 < 13.4 202.48950 +47.27003 88 4 13 29 57.48 +47 16 12.1 256.0 17.0 178.0 16.0 74.1 9.9 202.49325 +47.26317 89 5 13 29 58.38 +47 15 47.4 124.0 14.0 120.0 14.0 < 9.3 202.49475 +47.27375 90 6 13 29 58.74 +47 16 25.5 94.0 13.0 88.0 12.0 < 13.6 202.49804 +47.26625 91 7 13 29 59.53 +47 15 58.5 522.0 25.0 390.0 22.0 132.0 13.0 202.49912 +47.26133 92 8 13 29 59.79 +47 15 40.8 89.0 13.0 66.0 11.0 22.1 6.2 202.50258 +47.25847 93 9 13 30 00.62 +47 15 30.5 19.5 5.2 18.8 5.0 < 6.7 202.50842 +47.25175 94 10 13 30 02.02 +47 15 06.3 96.0 11.0 68.0 9.4 28.1 6.6 202.51567 +47.26978 95 11 13 30 03.76 +47 16 11.2 85.0 11.0 75.0 10.0 9.9 4.8 202.52512 +47.26178 96 12 13 30 06.03 +47 15 42.4 547.0 25.0 386.0 21.0 161.0 14.0 202.36096 +47.20958 97 1 13 29 26.63 +47 12 34.5 9.7 4.8 < 14.9 < 7.3 202.38887 +47.24456 98 2 13 29 33.33 +47 14 40.4 18.7 5.8 10.3 4.4 < 16.3 202.40321 +47.24681 99 3 13 29 36.77 +47 14 48.5 22.0 6.3 20.7 5.9 < 6.7 202.40442 +47.22500 100 4 13 29 37.06 +47 13 30.0 33.6 7.2 20.2 5.8 13.5 5.0 202.40838 +47.27039 101 5 13 29 38.01 +47 16 13.4 44.7 8.0 39.9 7.5 < 11.1 202.41096 +47.22672 102 6 13 29 38.63 +47 13 36.2 92.0 11.0 82.0 9.1 < 17.8 202.42575 +47.24669 103 7 13 29 42.18 +47 14 48.1 28.3 6.6 16.2 5.2 12.1 4.7 202.43067 +47.25703 104 8 13 29 43.36 +47 15 25.3 133.0 13.0 110.0 12.0 22.8 6.2 202.43262 +47.24294 105 9 13 29 43.83 +47 14 34.6 7.5 2.8 < 11.1 < 7.9 202.48437 +47.24767 106 10 13 29 56.25 +47 14 51.6 161.0 14.0 119.0 12.0 41.8 7.7 202.52696 +47.14286 107 11 13 30 06.47 +47 08 34.3 265.0 16.0 212.0 16.0 53.8 8.5 202.56325 +47.26083 108 12 13 30 15.18 +47 15 39.0 20.7 6.2 10.3 4.6 < 19.5 202.56558 +47.25458 109 13 13 30 15.74 +47 15 16.5 139.0 12.0 118.0 12.0 19.8 4.8 202.58754 +47.23153 110 14 13 30 21.01 +47 13 53.5 32.9 7.3 29.0 5.6 < 10.1 202.60462 +47.22033 111 15 13 30 25.11 +47 13 13.2 26.3 6.4 18.0 4.4 < 16.8 202.61854 +47.25564 112 16 13 30 28.45 +47 15 20.3 17.7 5.9 14.2 5.2 < 9.3 202.62225 +47.24117 113 17 13 30 29.34 +47 14 28.2 19.1 6.0 13.9 3.9 < 12.1 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.con����������������������������������������������������������������������������000644 �000765 �000000 �00001224076 12131336426 015540� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 2.02472783e+02 4.72188119e+01 2.02472824e+02 4.72187818e+01 2.02472575e+02 4.72186405e+01 2.02472347e+02 4.72184836e+01 2.02472097e+02 4.72183423e+01 2.02471829e+02 4.72182156e+01 2.02473738e+02 4.72194083e+01 2.02473778e+02 4.72193788e+01 2.02473529e+02 4.72192368e+01 2.02473260e+02 4.72191101e+01 2.02478034e+02 4.72220917e+01 2.02478073e+02 4.72220622e+01 2.02477858e+02 4.72218963e+01 2.02477556e+02 4.72217935e+01 2.02479943e+02 4.72232842e+01 2.02479972e+02 4.72232626e+01 2.02479744e+02 4.72231057e+01 2.02479466e+02 4.72229861e+01 2.02483647e+02 4.72238023e+01 2.02483354e+02 4.72239185e+01 2.02483163e+02 4.72240987e+01 2.02482988e+02 4.72242886e+01 2.02503891e+02 4.71820029e+01 2.02503726e+02 4.71819545e+01 2.02503737e+02 4.71819071e+01 2.02503782e+02 4.71819129e+01 2.02503891e+02 4.71820029e+01 2.02492909e+02 4.71754413e+01 2.02492723e+02 4.71754466e+01 2.02492662e+02 4.71752867e+01 2.02492862e+02 4.71753443e+01 2.02492909e+02 4.71754413e+01 2.02512631e+02 4.71880599e+01 2.02512296e+02 4.71879841e+01 2.02512272e+02 4.71878359e+01 2.02512514e+02 4.71878229e+01 2.02512631e+02 4.71880599e+01 2.02498845e+02 4.71794494e+01 2.02498779e+02 4.71794293e+01 2.02498769e+02 4.71794020e+01 2.02498806e+02 4.71794092e+01 2.02498845e+02 4.71794494e+01 2.02489697e+02 4.71737327e+01 2.02489305e+02 4.71737438e+01 2.02489295e+02 4.71734816e+01 2.02489680e+02 4.71734667e+01 2.02489697e+02 4.71737327e+01 2.02481803e+02 4.71687986e+01 2.02481428e+02 4.71688308e+01 2.02481319e+02 4.71687952e+01 2.02480959e+02 4.71688691e+01 2.02480888e+02 4.71689047e+01 2.02480716e+02 4.71690165e+01 2.02480350e+02 4.71689772e+01 2.02480111e+02 4.71688284e+01 2.02479870e+02 4.71686811e+01 2.02479858e+02 4.71684801e+01 2.02480029e+02 4.71682880e+01 2.02480245e+02 4.71681240e+01 2.02480584e+02 4.71680366e+01 2.02480698e+02 4.71680692e+01 2.02480984e+02 4.71681834e+01 2.02481179e+02 4.71683646e+01 2.02481487e+02 4.71684622e+01 2.02481777e+02 4.71685728e+01 2.02481803e+02 4.71687986e+01 2.02520105e+02 4.71930256e+01 2.02520013e+02 4.71930172e+01 2.02520005e+02 4.71929631e+01 2.02520115e+02 4.71929418e+01 2.02520105e+02 4.71930256e+01 2.02498354e+02 4.71794415e+01 2.02498314e+02 4.71794481e+01 2.02498320e+02 4.71794204e+01 2.02498360e+02 4.71794137e+01 2.02498354e+02 4.71794415e+01 2.02497170e+02 4.71787016e+01 2.02497285e+02 4.71789073e+01 2.02497295e+02 4.71790793e+01 2.02497089e+02 4.71792494e+01 2.02496856e+02 4.71792246e+01 2.02496583e+02 4.71792324e+01 2.02496318e+02 4.71793659e+01 2.02496417e+02 4.71795492e+01 2.02496428e+02 4.71797339e+01 2.02496352e+02 4.71799222e+01 2.02496331e+02 4.71799724e+01 2.02496348e+02 4.71802506e+01 2.02496751e+02 4.71802785e+01 2.02496891e+02 4.71805003e+01 2.02496947e+02 4.71806562e+01 2.02496954e+02 4.71807788e+01 2.02497229e+02 4.71808323e+01 2.02497302e+02 4.71808467e+01 2.02497305e+02 4.71808797e+01 2.02497387e+02 4.71811096e+01 2.02497731e+02 4.71811462e+01 2.02497772e+02 4.71811505e+01 2.02498041e+02 4.71812766e+01 2.02498402e+02 4.71812663e+01 2.02498476e+02 4.71812807e+01 2.02498780e+02 4.71813814e+01 2.02499063e+02 4.71814977e+01 2.02499026e+02 4.71816562e+01 2.02498972e+02 4.71818899e+01 2.02499231e+02 4.71820238e+01 2.02499473e+02 4.71821708e+01 2.02499451e+02 4.71822210e+01 2.02499469e+02 4.71824992e+01 2.02499878e+02 4.71824874e+01 2.02499927e+02 4.71824855e+01 2.02499929e+02 4.71825191e+01 2.02499735e+02 4.71826970e+01 2.02499885e+02 4.71828424e+01 2.02499988e+02 4.71830912e+01 2.02500349e+02 4.71830808e+01 2.02500446e+02 4.71830781e+01 2.02500727e+02 4.71831960e+01 2.02500783e+02 4.71833518e+01 2.02500834e+02 4.71834425e+01 2.02501029e+02 4.71836234e+01 2.02501041e+02 4.71838120e+01 2.02501077e+02 4.71839133e+01 2.02501229e+02 4.71839294e+01 2.02501506e+02 4.71839215e+01 2.02501780e+02 4.71839750e+01 2.02501878e+02 4.71839722e+01 2.02502093e+02 4.71841384e+01 2.02502095e+02 4.71841715e+01 2.02502046e+02 4.71841728e+01 2.02501637e+02 4.71841846e+01 2.02501654e+02 4.71844627e+01 2.02501679e+02 4.71845097e+01 2.02501802e+02 4.71846791e+01 2.02501971e+02 4.71846923e+01 2.02502045e+02 4.71844992e+01 2.02502064e+02 4.71844510e+01 2.02502112e+02 4.71844496e+01 2.02502521e+02 4.71844379e+01 2.02502593e+02 4.71844193e+01 2.02502918e+02 4.71845044e+01 2.02502930e+02 4.71846930e+01 2.02502711e+02 4.71848552e+01 2.02502632e+02 4.71850416e+01 2.02502636e+02 4.71851076e+01 2.02502562e+02 4.71850932e+01 2.02502153e+02 4.71851050e+01 2.02502170e+02 4.71853831e+01 2.02502197e+02 4.71854319e+01 2.02501978e+02 4.71855941e+01 2.02501993e+02 4.71858392e+01 2.02502229e+02 4.71859903e+01 2.02502596e+02 4.71859798e+01 2.02502730e+02 4.71857643e+01 2.02502948e+02 4.71857839e+01 2.02503255e+02 4.71858826e+01 2.02503536e+02 4.71860003e+01 2.02503528e+02 4.71862631e+01 2.02503143e+02 4.71862905e+01 2.02503026e+02 4.71862489e+01 2.02503063e+02 4.71863501e+01 2.02503214e+02 4.71863663e+01 2.02503448e+02 4.71863911e+01 2.02503719e+02 4.71865159e+01 2.02503774e+02 4.71867155e+01 2.02503810e+02 4.71867737e+01 2.02504024e+02 4.71868720e+01 2.02504121e+02 4.71868692e+01 2.02504360e+02 4.71870182e+01 2.02504598e+02 4.71871673e+01 2.02504959e+02 4.71871569e+01 2.02505033e+02 4.71871713e+01 2.02505035e+02 4.71872044e+01 2.02505164e+02 4.71874002e+01 2.02505216e+02 4.71876163e+01 2.02505095e+02 4.71877765e+01 2.02505474e+02 4.71878215e+01 2.02505653e+02 4.71880149e+01 2.02505664e+02 4.71881953e+01 2.02505448e+02 4.71883595e+01 2.02505459e+02 4.71884839e+01 2.02505697e+02 4.71886330e+01 2.02505826e+02 4.71888630e+01 2.02506235e+02 4.71888513e+01 2.02506284e+02 4.71888499e+01 2.02506286e+02 4.71888829e+01 2.02506092e+02 4.71890609e+01 2.02506194e+02 4.71892422e+01 2.02506374e+02 4.71892370e+01 2.02506652e+02 4.71892290e+01 2.02506615e+02 4.71893875e+01 2.02506561e+02 4.71896213e+01 2.02506899e+02 4.71895651e+01 2.02507084e+02 4.71895598e+01 2.02507141e+02 4.71897156e+01 2.02506921e+02 4.71898778e+01 2.02506608e+02 4.71899812e+01 2.02506738e+02 4.71901412e+01 2.02506862e+02 4.71903754e+01 2.02507100e+02 4.71905244e+01 2.02507339e+02 4.71906734e+01 2.02507318e+02 4.71907236e+01 2.02507335e+02 4.71910018e+01 2.02507574e+02 4.71911508e+01 2.02507601e+02 4.71911996e+01 2.02507731e+02 4.71913596e+01 2.02507970e+02 4.71915086e+01 2.02508086e+02 4.71915021e+01 2.02508432e+02 4.71914922e+01 2.02508698e+02 4.71916215e+01 2.02508701e+02 4.71918868e+01 2.02508298e+02 4.71919169e+01 2.02508098e+02 4.71918088e+01 2.02508113e+02 4.71920539e+01 2.02508117e+02 4.71921200e+01 2.02508132e+02 4.71923651e+01 2.02508486e+02 4.71924290e+01 2.02508609e+02 4.71926631e+01 2.02508848e+02 4.71928121e+01 2.02509056e+02 4.71929841e+01 2.02509325e+02 4.71931102e+01 2.02509304e+02 4.71931604e+01 2.02509232e+02 4.71931790e+01 2.02508872e+02 4.71931893e+01 2.02508652e+02 4.71933515e+01 2.02508780e+02 4.71935133e+01 2.02508750e+02 4.71937113e+01 2.02508462e+02 4.71937487e+01 2.02508339e+02 4.71937541e+01 2.02508088e+02 4.71938966e+01 2.02508125e+02 4.71939979e+01 2.02508370e+02 4.71940727e+01 2.02508444e+02 4.71938196e+01 2.02508788e+02 4.71938334e+01 2.02508902e+02 4.71940740e+01 2.02508904e+02 4.71941070e+01 2.02508832e+02 4.71941256e+01 2.02508472e+02 4.71941360e+01 2.02508378e+02 4.71943764e+01 2.02508354e+02 4.71944794e+01 2.02508366e+02 4.71946680e+01 2.02508088e+02 4.71946759e+01 2.02507908e+02 4.71946811e+01 2.02507967e+02 4.71947654e+01 2.02508189e+02 4.71949267e+01 2.02508204e+02 4.71951652e+01 2.02508202e+02 4.71952426e+01 2.02508354e+02 4.71952587e+01 2.02508552e+02 4.71953097e+01 2.02508749e+02 4.71954894e+01 2.02508788e+02 4.71955296e+01 2.02508933e+02 4.71956790e+01 2.02509038e+02 4.71956861e+01 2.02509376e+02 4.71956765e+01 2.02509542e+02 4.71958795e+01 2.02509796e+02 4.71960170e+01 2.02509831e+02 4.71961813e+01 2.02509832e+02 4.71963155e+01 2.02510144e+02 4.71963762e+01 2.02510371e+02 4.71962194e+01 2.02510435e+02 4.71961955e+01 2.02510760e+02 4.71962806e+01 2.02510723e+02 4.71964391e+01 2.02510480e+02 4.71965862e+01 2.02510322e+02 4.71966040e+01 2.02510107e+02 4.71966525e+01 2.02509827e+02 4.71967766e+01 2.02509773e+02 4.71970103e+01 2.02509762e+02 4.71970354e+01 2.02509870e+02 4.71972643e+01 2.02510061e+02 4.71974484e+01 2.02510066e+02 4.71975238e+01 2.02509942e+02 4.71977456e+01 2.02509929e+02 4.71978713e+01 2.02510070e+02 4.71980923e+01 2.02510316e+02 4.71982365e+01 2.02510357e+02 4.71983041e+01 2.02510328e+02 4.71985530e+01 2.02510630e+02 4.71984746e+01 2.02510796e+02 4.71982793e+01 2.02511184e+02 4.71982220e+01 2.02511247e+02 4.71981983e+01 2.02511486e+02 4.71983473e+01 2.02511490e+02 4.71984134e+01 2.02511635e+02 4.71985627e+01 2.02511772e+02 4.71985894e+01 2.02511983e+02 4.71986306e+01 2.02512013e+02 4.71987399e+01 2.02512025e+02 4.71989254e+01 2.02512308e+02 4.71990416e+01 2.02512480e+02 4.71992398e+01 2.02512558e+02 4.71993792e+01 2.02512480e+02 4.71995657e+01 2.02512484e+02 4.71996317e+01 2.02512390e+02 4.71998721e+01 2.02512280e+02 4.72000390e+01 2.02512258e+02 4.72000892e+01 2.02512276e+02 4.72003674e+01 2.02512685e+02 4.72003556e+01 2.02512757e+02 4.72003370e+01 2.02512761e+02 4.72004030e+01 2.02512776e+02 4.72006482e+01 2.02512780e+02 4.72007142e+01 2.02512796e+02 4.72009593e+01 2.02513121e+02 4.72010444e+01 2.02513016e+02 4.72011606e+01 2.02512797e+02 4.72013229e+01 2.02512592e+02 4.72014940e+01 2.02512335e+02 4.72016323e+01 2.02512179e+02 4.72018339e+01 2.02511967e+02 4.72020009e+01 2.02511677e+02 4.72021189e+01 2.02511625e+02 4.72021501e+01 2.02511265e+02 4.72021605e+01 2.02511198e+02 4.72021403e+01 2.02510773e+02 4.72021525e+01 2.02510560e+02 4.72023190e+01 2.02510689e+02 4.72025170e+01 2.02510652e+02 4.72026755e+01 2.02510697e+02 4.72028368e+01 2.02510634e+02 4.72029631e+01 2.02510392e+02 4.72031112e+01 2.02510267e+02 4.72031542e+01 2.02510029e+02 4.72030052e+01 2.02509973e+02 4.72028493e+01 2.02509904e+02 4.72027719e+01 2.02509696e+02 4.72026002e+01 2.02509652e+02 4.72023500e+01 2.02509793e+02 4.72022027e+01 2.02509578e+02 4.72020365e+01 2.02509339e+02 4.72018875e+01 2.02509312e+02 4.72018387e+01 2.02509167e+02 4.72016893e+01 2.02508929e+02 4.72015403e+01 2.02508733e+02 4.72013594e+01 2.02508721e+02 4.72011708e+01 2.02508878e+02 4.72009695e+01 2.02509134e+02 4.72008304e+01 2.02509207e+02 4.72006834e+01 2.02509011e+02 4.72007533e+01 2.02508673e+02 4.72007531e+01 2.02508467e+02 4.72005795e+01 2.02508334e+02 4.72003522e+01 2.02508325e+02 4.72003250e+01 2.02508230e+02 4.72001042e+01 2.02508173e+02 4.71999314e+01 2.02508265e+02 4.71997528e+01 2.02507919e+02 4.71996833e+01 2.02507640e+02 4.71995984e+01 2.02507766e+02 4.71997960e+01 2.02507919e+02 4.72000083e+01 2.02507898e+02 4.72000586e+01 2.02507826e+02 4.72000772e+01 2.02507606e+02 4.72001755e+01 2.02507239e+02 4.72001861e+01 2.02507101e+02 4.72001593e+01 2.02507163e+02 4.72002418e+01 2.02507180e+02 4.72005074e+01 2.02506789e+02 4.72005186e+01 2.02506691e+02 4.72002656e+01 2.02506469e+02 4.72003625e+01 2.02506108e+02 4.72003709e+01 2.02506019e+02 4.72001115e+01 2.02506017e+02 4.72000804e+01 2.02505975e+02 4.71998185e+01 2.02505996e+02 4.71997683e+01 2.02505979e+02 4.71994902e+01 2.02505740e+02 4.71993412e+01 2.02505428e+02 4.71992467e+01 2.02505419e+02 4.71991090e+01 2.02505490e+02 4.71988752e+01 2.02505492e+02 4.71988550e+01 2.02505585e+02 4.71986140e+01 2.02505577e+02 4.71984858e+01 2.02505565e+02 4.71983029e+01 2.02505780e+02 4.71981380e+01 2.02505773e+02 4.71980154e+01 2.02505809e+02 4.71978569e+01 2.02505863e+02 4.71976232e+01 2.02505624e+02 4.71974742e+01 2.02505320e+02 4.71973735e+01 2.02505076e+02 4.71973991e+01 2.02504860e+02 4.71973881e+01 2.02504683e+02 4.71971937e+01 2.02504280e+02 4.71972010e+01 2.02504180e+02 4.71974377e+01 2.02504022e+02 4.71976385e+01 2.02503626e+02 4.71976499e+01 2.02503531e+02 4.71973949e+01 2.02503526e+02 4.71973288e+01 2.02503425e+02 4.71971476e+01 2.02503218e+02 4.71969749e+01 2.02503209e+02 4.71968317e+01 2.02503420e+02 4.71968256e+01 2.02503752e+02 4.71968713e+01 2.02503824e+02 4.71968527e+01 2.02504062e+02 4.71970018e+01 2.02504423e+02 4.71969914e+01 2.02504408e+02 4.71967463e+01 2.02504404e+02 4.71966803e+01 2.02504273e+02 4.71965203e+01 2.02504108e+02 4.71963172e+01 2.02504100e+02 4.71961915e+01 2.02504036e+02 4.71960447e+01 2.02503788e+02 4.71959026e+01 2.02503656e+02 4.71959145e+01 2.02503704e+02 4.71959645e+01 2.02503690e+02 4.71962347e+01 2.02503295e+02 4.71962671e+01 2.02503186e+02 4.71962193e+01 2.02502913e+02 4.71962242e+01 2.02502800e+02 4.71962769e+01 2.02502483e+02 4.71963783e+01 2.02502279e+02 4.71963677e+01 2.02502223e+02 4.71962158e+01 2.02502299e+02 4.71960274e+01 2.02502295e+02 4.71959614e+01 2.02502164e+02 4.71958014e+01 2.02502013e+02 4.71957853e+01 2.02501779e+02 4.71957605e+01 2.02501796e+02 4.71956498e+01 2.02501753e+02 4.71954544e+01 2.02501475e+02 4.71954496e+01 2.02501246e+02 4.71955038e+01 2.02501281e+02 4.71953283e+01 2.02501406e+02 4.71951076e+01 2.02501544e+02 4.71949580e+01 2.02501540e+02 4.71948920e+01 2.02501606e+02 4.71949122e+01 2.02501967e+02 4.71948592e+01 2.02502100e+02 4.71948726e+01 2.02502448e+02 4.71949411e+01 2.02502725e+02 4.71950613e+01 2.02502808e+02 4.71950855e+01 2.02503112e+02 4.71949766e+01 2.02503087e+02 4.71947939e+01 2.02503008e+02 4.71946122e+01 2.02502977e+02 4.71945499e+01 2.02502930e+02 4.71945635e+01 2.02502517e+02 4.71945643e+01 2.02502274e+02 4.71944530e+01 2.02502233e+02 4.71944487e+01 2.02501825e+02 4.71944248e+01 2.02501650e+02 4.71942288e+01 2.02501339e+02 4.71941681e+01 2.02501302e+02 4.71941609e+01 2.02501013e+02 4.71940494e+01 2.02500799e+02 4.71941302e+01 2.02500450e+02 4.71941402e+01 2.02500256e+02 4.71940897e+01 2.02500026e+02 4.71941277e+01 2.02499874e+02 4.71939149e+01 2.02499659e+02 4.71937486e+01 2.02499322e+02 4.71936721e+01 2.02499311e+02 4.71935000e+01 2.02499486e+02 4.71933096e+01 2.02499620e+02 4.71931263e+01 2.02499282e+02 4.71931824e+01 2.02499119e+02 4.71931713e+01 2.02498855e+02 4.71932151e+01 2.02498587e+02 4.71932395e+01 2.02498618e+02 4.71930669e+01 2.02498771e+02 4.71928633e+01 2.02498795e+02 4.71927603e+01 2.02498699e+02 4.71928186e+01 2.02498251e+02 4.71928369e+01 2.02498268e+02 4.71925494e+01 2.02498672e+02 4.71925024e+01 2.02498552e+02 4.71922886e+01 2.02498314e+02 4.71921396e+01 2.02498126e+02 4.71919529e+01 2.02498096e+02 4.71918435e+01 2.02498019e+02 4.71917069e+01 2.02497972e+02 4.71914667e+01 2.02497992e+02 4.71914010e+01 2.02497895e+02 4.71914188e+01 2.02497567e+02 4.71913897e+01 2.02497497e+02 4.71911702e+01 2.02497544e+02 4.71910816e+01 2.02497392e+02 4.71908687e+01 2.02497124e+02 4.71907414e+01 2.02496828e+02 4.71906345e+01 2.02496554e+02 4.71905810e+01 2.02496480e+02 4.71905666e+01 2.02496129e+02 4.71905005e+01 2.02496165e+02 4.71903383e+01 2.02496104e+02 4.71901933e+01 2.02495813e+02 4.71901181e+01 2.02495772e+02 4.71901137e+01 2.02495402e+02 4.71901605e+01 2.02495263e+02 4.71901645e+01 2.02494888e+02 4.71901390e+01 2.02494665e+02 4.71902985e+01 2.02494637e+02 4.71903020e+01 2.02494367e+02 4.71901759e+01 2.02494006e+02 4.71901862e+01 2.02493787e+02 4.71903484e+01 2.02493802e+02 4.71905935e+01 2.02493806e+02 4.71906595e+01 2.02493709e+02 4.71906623e+01 2.02493471e+02 4.71905133e+01 2.02493467e+02 4.71904472e+01 2.02493365e+02 4.71902660e+01 2.02493213e+02 4.71900531e+01 2.02493005e+02 4.71898811e+01 2.02492970e+02 4.71898380e+01 2.02492955e+02 4.71895928e+01 2.02492976e+02 4.71895426e+01 2.02492894e+02 4.71893128e+01 2.02492886e+02 4.71891871e+01 2.02492940e+02 4.71889533e+01 2.02492592e+02 4.71888853e+01 2.02492305e+02 4.71888239e+01 2.02492258e+02 4.71888063e+01 2.02492254e+02 4.71887926e+01 2.02492232e+02 4.71885004e+01 2.02491876e+02 4.71884382e+01 2.02491864e+02 4.71882496e+01 2.02491828e+02 4.71881483e+01 2.02491618e+02 4.71879780e+01 2.02491606e+02 4.71877894e+01 2.02491599e+02 4.71876668e+01 2.02491447e+02 4.71874539e+01 2.02491093e+02 4.71873900e+01 2.02490883e+02 4.71872197e+01 2.02490645e+02 4.71870706e+01 2.02490450e+02 4.71868888e+01 2.02490106e+02 4.71868522e+01 2.02490189e+02 4.71870821e+01 2.02490472e+02 4.71871984e+01 2.02490483e+02 4.71873870e+01 2.02490216e+02 4.71875190e+01 2.02490031e+02 4.71875242e+01 2.02489680e+02 4.71874833e+01 2.02489645e+02 4.71874843e+01 2.02489624e+02 4.71874480e+01 2.02489510e+02 4.71872589e+01 2.02489246e+02 4.71871287e+01 2.02489118e+02 4.71871323e+01 2.02489122e+02 4.71872197e+01 2.02489250e+02 4.71874505e+01 2.02489229e+02 4.71875007e+01 2.02489312e+02 4.71877305e+01 2.02489656e+02 4.71877672e+01 2.02489704e+02 4.71877658e+01 2.02489732e+02 4.71878146e+01 2.02489833e+02 4.71879959e+01 2.02489962e+02 4.71882260e+01 2.02490201e+02 4.71883750e+01 2.02490194e+02 4.71884028e+01 2.02490154e+02 4.71884094e+01 2.02489745e+02 4.71884211e+01 2.02489673e+02 4.71884397e+01 2.02489453e+02 4.71885381e+01 2.02489093e+02 4.71886121e+01 2.02489241e+02 4.71887592e+01 2.02489375e+02 4.71887883e+01 2.02489652e+02 4.71887803e+01 2.02489943e+02 4.71888907e+01 2.02490158e+02 4.71890571e+01 2.02490385e+02 4.71892147e+01 2.02490398e+02 4.71894278e+01 2.02490128e+02 4.71894050e+01 2.02489875e+02 4.71892663e+01 2.02489703e+02 4.71892925e+01 2.02489581e+02 4.71894837e+01 2.02489608e+02 4.71895326e+01 2.02489511e+02 4.71895353e+01 2.02489151e+02 4.71895456e+01 2.02489053e+02 4.71895484e+01 2.02488728e+02 4.71894632e+01 2.02488461e+02 4.71893354e+01 2.02488376e+02 4.71893606e+01 2.02487996e+02 4.71893537e+01 2.02487868e+02 4.71893426e+01 2.02487547e+02 4.71894410e+01 2.02487450e+02 4.71894323e+01 2.02487446e+02 4.71893782e+01 2.02487437e+02 4.71891160e+01 2.02487333e+02 4.71890082e+01 2.02487514e+02 4.71890597e+01 2.02487775e+02 4.71889855e+01 2.02487766e+02 4.71888729e+01 2.02487475e+02 4.71887976e+01 2.02487367e+02 4.71888430e+01 2.02487429e+02 4.71887691e+01 2.02487411e+02 4.71884844e+01 2.02487379e+02 4.71884390e+01 2.02487477e+02 4.71884362e+01 2.02487860e+02 4.71884780e+01 2.02488065e+02 4.71885681e+01 2.02488156e+02 4.71885850e+01 2.02488376e+02 4.71887474e+01 2.02488751e+02 4.71886974e+01 2.02488788e+02 4.71884429e+01 2.02488476e+02 4.71883479e+01 2.02488204e+02 4.71883557e+01 2.02487974e+02 4.71883937e+01 2.02487736e+02 4.71882447e+01 2.02487461e+02 4.71881911e+01 2.02487364e+02 4.71881939e+01 2.02487386e+02 4.71881436e+01 2.02487486e+02 4.71879070e+01 2.02487449e+02 4.71878057e+01 2.02487298e+02 4.71877896e+01 2.02487087e+02 4.71877484e+01 2.02486826e+02 4.71876157e+01 2.02486770e+02 4.71874598e+01 2.02486734e+02 4.71873586e+01 2.02486488e+02 4.71872837e+01 2.02486590e+02 4.71874650e+01 2.02486553e+02 4.71876235e+01 2.02486390e+02 4.71876124e+01 2.02486097e+02 4.71875038e+01 2.02485956e+02 4.71872823e+01 2.02485618e+02 4.71873384e+01 2.02485489e+02 4.71875571e+01 2.02485204e+02 4.71876780e+01 2.02484889e+02 4.71877803e+01 2.02484669e+02 4.71879420e+01 2.02484629e+02 4.71879381e+01 2.02484594e+02 4.71878950e+01 2.02484813e+02 4.71877329e+01 2.02484962e+02 4.71875269e+01 2.02485054e+02 4.71872988e+01 2.02484802e+02 4.71871594e+01 2.02484412e+02 4.71871223e+01 2.02484167e+02 4.71870300e+01 2.02484195e+02 4.71872829e+01 2.02484199e+02 4.71873490e+01 2.02484092e+02 4.71875815e+01 2.02483821e+02 4.71875587e+01 2.02483769e+02 4.71873798e+01 2.02483889e+02 4.71871834e+01 2.02483499e+02 4.71872111e+01 2.02483377e+02 4.71874338e+01 2.02483385e+02 4.71875563e+01 2.02483611e+02 4.71877140e+01 2.02483666e+02 4.71879136e+01 2.02483642e+02 4.71880166e+01 2.02483654e+02 4.71882052e+01 2.02483713e+02 4.71882894e+01 2.02483982e+02 4.71884161e+01 2.02484032e+02 4.71884415e+01 2.02484291e+02 4.71885129e+01 2.02484588e+02 4.71884897e+01 2.02484794e+02 4.71884668e+01 2.02485115e+02 4.71885201e+01 2.02485187e+02 4.71885015e+01 2.02485501e+02 4.71885953e+01 2.02485779e+02 4.71887145e+01 2.02485794e+02 4.71889439e+01 2.02485835e+02 4.71889990e+01 2.02485849e+02 4.71892775e+01 2.02485439e+02 4.71892913e+01 2.02485209e+02 4.71891360e+01 2.02485085e+02 4.71890995e+01 2.02484808e+02 4.71891074e+01 2.02484511e+02 4.71890010e+01 2.02484282e+02 4.71888970e+01 2.02484178e+02 4.71891310e+01 2.02483884e+02 4.71891394e+01 2.02483684e+02 4.71891212e+01 2.02483398e+02 4.71892421e+01 2.02483301e+02 4.71892448e+01 2.02482928e+02 4.71892473e+01 2.02482855e+02 4.71892494e+01 2.02482608e+02 4.71893464e+01 2.02482263e+02 4.71894303e+01 2.02482365e+02 4.71896115e+01 2.02482489e+02 4.71895712e+01 2.02482874e+02 4.71895602e+01 2.02482956e+02 4.71895640e+01 2.02483191e+02 4.71894117e+01 2.02483528e+02 4.71894021e+01 2.02483680e+02 4.71894182e+01 2.02484019e+02 4.71893306e+01 2.02484067e+02 4.71893293e+01 2.02484349e+02 4.71894464e+01 2.02484537e+02 4.71896331e+01 2.02484572e+02 4.71896762e+01 2.02484673e+02 4.71898575e+01 2.02484685e+02 4.71900461e+01 2.02484725e+02 4.71901449e+01 2.02484845e+02 4.71903816e+01 2.02485111e+02 4.71903126e+01 2.02485425e+02 4.71902092e+01 2.02485522e+02 4.71902064e+01 2.02485526e+02 4.71902724e+01 2.02485656e+02 4.71904324e+01 2.02485902e+02 4.71905073e+01 2.02485887e+02 4.71902622e+01 2.02485883e+02 4.71901961e+01 2.02485980e+02 4.71901934e+01 2.02486218e+02 4.71903424e+01 2.02486457e+02 4.71904915e+01 2.02486461e+02 4.71905575e+01 2.02486562e+02 4.71907388e+01 2.02486743e+02 4.71907336e+01 2.02486822e+02 4.71905472e+01 2.02486818e+02 4.71904812e+01 2.02486719e+02 4.71902978e+01 2.02486480e+02 4.71901488e+01 2.02486239e+02 4.71900018e+01 2.02486110e+02 4.71897717e+01 2.02485806e+02 4.71896709e+01 2.02485621e+02 4.71894822e+01 2.02485618e+02 4.71894326e+01 2.02485687e+02 4.71894335e+01 2.02485983e+02 4.71895399e+01 2.02486180e+02 4.71897201e+01 2.02486541e+02 4.71897098e+01 2.02486638e+02 4.71897070e+01 2.02486974e+02 4.71897840e+01 2.02487107e+02 4.71900109e+01 2.02487155e+02 4.71900938e+01 2.02487111e+02 4.71903335e+01 2.02487113e+02 4.71903665e+01 2.02487130e+02 4.71906447e+01 2.02487422e+02 4.71905598e+01 2.02487734e+02 4.71905238e+01 2.02487748e+02 4.71907637e+01 2.02487515e+02 4.71909169e+01 2.02487177e+02 4.71910047e+01 2.02487192e+02 4.71912498e+01 2.02487552e+02 4.71912395e+01 2.02487729e+02 4.71910507e+01 2.02487953e+02 4.71910128e+01 2.02488136e+02 4.71910056e+01 2.02488214e+02 4.71908192e+01 2.02488210e+02 4.71907532e+01 2.02488109e+02 4.71905719e+01 2.02488097e+02 4.71903833e+01 2.02488090e+02 4.71902607e+01 2.02487937e+02 4.71900478e+01 2.02487967e+02 4.71900029e+01 2.02487949e+02 4.71897137e+01 2.02487939e+02 4.71896864e+01 2.02487980e+02 4.71896908e+01 2.02488336e+02 4.71897530e+01 2.02488611e+02 4.71898066e+01 2.02488708e+02 4.71898038e+01 2.02489062e+02 4.71898677e+01 2.02489076e+02 4.71900972e+01 2.02488856e+02 4.71902593e+01 2.02488833e+02 4.71903623e+01 2.02489107e+02 4.71904159e+01 2.02489326e+02 4.71902537e+01 2.02489311e+02 4.71900086e+01 2.02489307e+02 4.71899426e+01 2.02489526e+02 4.71897805e+01 2.02489624e+02 4.71897777e+01 2.02489594e+02 4.71898226e+01 2.02489740e+02 4.71900168e+01 2.02489804e+02 4.71902531e+01 2.02489428e+02 4.71903170e+01 2.02489443e+02 4.71905621e+01 2.02489447e+02 4.71906282e+01 2.02489350e+02 4.71906309e+01 2.02488989e+02 4.71906412e+01 2.02488770e+02 4.71908034e+01 2.02488785e+02 4.71910485e+01 2.02489023e+02 4.71911975e+01 2.02489027e+02 4.71912636e+01 2.02489201e+02 4.71913916e+01 2.02489367e+02 4.71915939e+01 2.02489489e+02 4.71915519e+01 2.02489767e+02 4.71914266e+01 2.02489846e+02 4.71912402e+01 2.02489876e+02 4.71911953e+01 2.02489807e+02 4.71909438e+01 2.02489729e+02 4.71908043e+01 2.02490042e+02 4.71907009e+01 2.02489940e+02 4.71905196e+01 2.02489929e+02 4.71903310e+01 2.02490206e+02 4.71903231e+01 2.02490358e+02 4.71905360e+01 2.02490719e+02 4.71905257e+01 2.02490816e+02 4.71905229e+01 2.02491109e+02 4.71904704e+01 2.02491292e+02 4.71904964e+01 2.02491601e+02 4.71904781e+01 2.02491745e+02 4.71904876e+01 2.02491940e+02 4.71906688e+01 2.02492178e+02 4.71908178e+01 2.02492188e+02 4.71908451e+01 2.02492116e+02 4.71908637e+01 2.02491878e+02 4.71907146e+01 2.02491656e+02 4.71908115e+01 2.02491613e+02 4.71909105e+01 2.02491624e+02 4.71910909e+01 2.02491317e+02 4.71911982e+01 2.02491246e+02 4.71914534e+01 2.02491113e+02 4.71916055e+01 2.02491332e+02 4.71915071e+01 2.02491553e+02 4.71913455e+01 2.02491912e+02 4.71912709e+01 2.02491978e+02 4.71912911e+01 2.02492341e+02 4.71913482e+01 2.02492640e+02 4.71914525e+01 2.02492855e+02 4.71916195e+01 2.02492932e+02 4.71918873e+01 2.02493202e+02 4.71920134e+01 2.02493556e+02 4.71920773e+01 2.02493679e+02 4.71923114e+01 2.02493901e+02 4.71922140e+01 2.02494088e+02 4.71920321e+01 2.02494158e+02 4.71919577e+01 2.02494146e+02 4.71917691e+01 2.02494365e+02 4.71916070e+01 2.02494358e+02 4.71914844e+01 2.02494206e+02 4.71912715e+01 2.02493967e+02 4.71911225e+01 2.02493741e+02 4.71912167e+01 2.02493389e+02 4.71912246e+01 2.02493412e+02 4.71910114e+01 2.02493724e+02 4.71909074e+01 2.02493822e+02 4.71909047e+01 2.02494037e+02 4.71910709e+01 2.02494275e+02 4.71912199e+01 2.02494685e+02 4.71912082e+01 2.02494757e+02 4.71911897e+01 2.02494992e+02 4.71911011e+01 2.02495362e+02 4.71910330e+01 2.02495399e+02 4.71910402e+01 2.02495637e+02 4.71911893e+01 2.02495888e+02 4.71913297e+01 2.02496192e+02 4.71914304e+01 2.02496248e+02 4.71915863e+01 2.02496028e+02 4.71917484e+01 2.02495950e+02 4.71919348e+01 2.02496188e+02 4.71920839e+01 2.02496192e+02 4.71921499e+01 2.02496207e+02 4.71923950e+01 2.02496466e+02 4.71925293e+01 2.02496496e+02 4.71926387e+01 2.02496266e+02 4.71926767e+01 2.02495992e+02 4.71926232e+01 2.02495918e+02 4.71926088e+01 2.02495509e+02 4.71926205e+01 2.02495526e+02 4.71928986e+01 2.02495554e+02 4.71929475e+01 2.02495456e+02 4.71929502e+01 2.02495218e+02 4.71928012e+01 2.02495010e+02 4.71926292e+01 2.02494645e+02 4.71926792e+01 2.02494474e+02 4.71927002e+01 2.02494283e+02 4.71925162e+01 2.02493922e+02 4.71925265e+01 2.02493937e+02 4.71927717e+01 2.02493941e+02 4.71928377e+01 2.02493722e+02 4.71929998e+01 2.02493477e+02 4.71931461e+01 2.02493626e+02 4.71933267e+01 2.02493640e+02 4.71935470e+01 2.02493399e+02 4.71936957e+01 2.02493225e+02 4.71938859e+01 2.02493098e+02 4.71940425e+01 2.02493306e+02 4.71942145e+01 2.02493575e+02 4.71943406e+01 2.02493580e+02 4.71944066e+01 2.02493681e+02 4.71945879e+01 2.02493693e+02 4.71947765e+01 2.02493401e+02 4.71948934e+01 2.02493196e+02 4.71949465e+01 2.02493016e+02 4.71949517e+01 2.02492738e+02 4.71949596e+01 2.02492726e+02 4.71947710e+01 2.02492719e+02 4.71946484e+01 2.02492444e+02 4.71945949e+01 2.02492347e+02 4.71945977e+01 2.02492343e+02 4.71945316e+01 2.02492213e+02 4.71943716e+01 2.02492089e+02 4.71941375e+01 2.02492085e+02 4.71940714e+01 2.02492070e+02 4.71938263e+01 2.02492066e+02 4.71937603e+01 2.02492051e+02 4.71935151e+01 2.02492047e+02 4.71934491e+01 2.02491945e+02 4.71932678e+01 2.02491793e+02 4.71930549e+01 2.02491578e+02 4.71928887e+01 2.02491572e+02 4.71928534e+01 2.02491624e+02 4.71928543e+01 2.02492034e+02 4.71928426e+01 2.02491951e+02 4.71926127e+01 2.02491668e+02 4.71924964e+01 2.02491516e+02 4.71922835e+01 2.02491191e+02 4.71921984e+01 2.02491072e+02 4.71922418e+01 2.02490672e+02 4.71922911e+01 2.02490444e+02 4.71924479e+01 2.02490259e+02 4.71926312e+01 2.02490193e+02 4.71926110e+01 2.02490157e+02 4.71925679e+01 2.02490142e+02 4.71923228e+01 2.02489858e+02 4.71923809e+01 2.02489657e+02 4.71923557e+01 2.02489406e+02 4.71922158e+01 2.02489399e+02 4.71920940e+01 2.02489384e+02 4.71919067e+01 2.02489102e+02 4.71917904e+01 2.02488827e+02 4.71917369e+01 2.02488730e+02 4.71917396e+01 2.02488369e+02 4.71917499e+01 2.02488150e+02 4.71919120e+01 2.02488252e+02 4.71920933e+01 2.02488547e+02 4.71922000e+01 2.02488764e+02 4.71922959e+01 2.02488838e+02 4.71923104e+01 2.02488840e+02 4.71923434e+01 2.02488956e+02 4.71925491e+01 2.02488966e+02 4.71927212e+01 2.02488808e+02 4.71929213e+01 2.02488539e+02 4.71930528e+01 2.02488522e+02 4.71931948e+01 2.02488532e+02 4.71933470e+01 2.02488409e+02 4.71935696e+01 2.02488022e+02 4.71935643e+01 2.02487763e+02 4.71934651e+01 2.02487569e+02 4.71936431e+01 2.02487699e+02 4.71938030e+01 2.02487713e+02 4.71940325e+01 2.02487718e+02 4.71941142e+01 2.02487964e+02 4.71941891e+01 2.02488209e+02 4.71940428e+01 2.02488246e+02 4.71940500e+01 2.02488282e+02 4.71940883e+01 2.02488065e+02 4.71942523e+01 2.02488056e+02 4.71945157e+01 2.02488058e+02 4.71945467e+01 2.02488214e+02 4.71947244e+01 2.02488325e+02 4.71947139e+01 2.02488620e+02 4.71947491e+01 2.02488905e+02 4.71948642e+01 2.02488938e+02 4.71950969e+01 2.02488553e+02 4.71951242e+01 2.02488504e+02 4.71951248e+01 2.02488457e+02 4.71951949e+01 2.02488716e+02 4.71953295e+01 2.02488643e+02 4.71955110e+01 2.02488441e+02 4.71956835e+01 2.02488153e+02 4.71957451e+01 2.02488176e+02 4.71955180e+01 2.02488208e+02 4.71953795e+01 2.02487878e+02 4.71953321e+01 2.02487996e+02 4.71955356e+01 2.02488051e+02 4.71957390e+01 2.02488024e+02 4.71958404e+01 2.02488292e+02 4.71959682e+01 2.02488306e+02 4.71961976e+01 2.02488311e+02 4.71962793e+01 2.02488438e+02 4.71962804e+01 2.02488696e+02 4.71963201e+01 2.02488852e+02 4.71965299e+01 2.02488853e+02 4.71965394e+01 2.02488824e+02 4.71965510e+01 2.02488438e+02 4.71965795e+01 2.02488344e+02 4.71968199e+01 2.02488349e+02 4.71969017e+01 2.02488449e+02 4.71971530e+01 2.02488477e+02 4.71972019e+01 2.02488578e+02 4.71973832e+01 2.02488542e+02 4.71975416e+01 2.02488488e+02 4.71977754e+01 2.02488490e+02 4.71978084e+01 2.02488390e+02 4.71980450e+01 2.02488441e+02 4.71981357e+01 2.02488624e+02 4.71983253e+01 2.02488635e+02 4.71984974e+01 2.02488611e+02 4.71986606e+01 2.02488619e+02 4.71987863e+01 2.02488565e+02 4.71990201e+01 2.02488891e+02 4.71991041e+01 2.02488947e+02 4.71992906e+01 2.02488657e+02 4.71994086e+01 2.02488542e+02 4.71996361e+01 2.02488407e+02 4.71997873e+01 2.02488386e+02 4.71998375e+01 2.02488333e+02 4.72001035e+01 2.02488067e+02 4.72002363e+01 2.02487988e+02 4.72004227e+01 2.02487992e+02 4.72004887e+01 2.02488007e+02 4.72007339e+01 2.02488235e+02 4.72006409e+01 2.02488578e+02 4.72006375e+01 2.02488601e+02 4.72008695e+01 2.02488571e+02 4.72009681e+01 2.02488582e+02 4.72011567e+01 2.02488269e+02 4.72012601e+01 2.02488370e+02 4.72014414e+01 2.02488382e+02 4.72016300e+01 2.02488303e+02 4.72018164e+01 2.02488282e+02 4.72018666e+01 2.02488233e+02 4.72018680e+01 2.02487824e+02 4.72018797e+01 2.02487783e+02 4.72018754e+01 2.02487773e+02 4.72018481e+01 2.02487691e+02 4.72016182e+01 2.02487347e+02 4.72015816e+01 2.02487306e+02 4.72015772e+01 2.02486991e+02 4.72016586e+01 2.02486939e+02 4.72018484e+01 2.02486944e+02 4.72019283e+01 2.02486762e+02 4.72019791e+01 2.02486601e+02 4.72020130e+01 2.02486256e+02 4.72020968e+01 2.02486357e+02 4.72022781e+01 2.02486644e+02 4.72023395e+01 2.02486689e+02 4.72023584e+01 2.02486923e+02 4.72025109e+01 2.02487162e+02 4.72023635e+01 2.02487579e+02 4.72023516e+01 2.02487602e+02 4.72026387e+01 2.02487380e+02 4.72027992e+01 2.02486965e+02 4.72028052e+01 2.02486798e+02 4.72027349e+01 2.02486613e+02 4.72027402e+01 2.02486406e+02 4.72025673e+01 2.02486056e+02 4.72025701e+01 2.02485836e+02 4.72027322e+01 2.02485938e+02 4.72029135e+01 2.02486110e+02 4.72031117e+01 2.02486371e+02 4.72032443e+01 2.02486427e+02 4.72034002e+01 2.02486463e+02 4.72035015e+01 2.02486661e+02 4.72036804e+01 2.02486867e+02 4.72038536e+01 2.02486923e+02 4.72040095e+01 2.02486631e+02 4.72041264e+01 2.02486426e+02 4.72041795e+01 2.02486246e+02 4.72041846e+01 2.02485968e+02 4.72041925e+01 2.02485850e+02 4.72042368e+01 2.02485831e+02 4.72042936e+01 2.02485805e+02 4.72045075e+01 2.02485625e+02 4.72046945e+01 2.02485301e+02 4.72047911e+01 2.02485106e+02 4.72048294e+01 2.02484918e+02 4.72046428e+01 2.02484610e+02 4.72045454e+01 2.02484375e+02 4.72043938e+01 2.02484246e+02 4.72041637e+01 2.02484244e+02 4.72041307e+01 2.02484129e+02 4.72039250e+01 2.02484118e+02 4.72037529e+01 2.02484021e+02 4.72036792e+01 2.02483783e+02 4.72035298e+01 2.02483585e+02 4.72034198e+01 2.02483511e+02 4.72034053e+01 2.02483517e+02 4.72033776e+01 2.02483499e+02 4.72030884e+01 2.02483498e+02 4.72030664e+01 2.02483429e+02 4.72028149e+01 2.02483191e+02 4.72026659e+01 2.02483003e+02 4.72024792e+01 2.02482993e+02 4.72024519e+01 2.02483062e+02 4.72021957e+01 2.02483432e+02 4.72021277e+01 2.02483349e+02 4.72018978e+01 2.02483342e+02 4.72017721e+01 2.02483396e+02 4.72015383e+01 2.02483402e+02 4.72015106e+01 2.02483384e+02 4.72012214e+01 2.02483387e+02 4.72012021e+01 2.02483300e+02 4.72009586e+01 2.02483205e+02 4.72007889e+01 2.02483228e+02 4.72006859e+01 2.02483217e+02 4.72004973e+01 2.02483157e+02 4.72004130e+01 2.02483175e+02 4.72001718e+01 2.02483300e+02 4.71999825e+01 2.02483272e+02 4.71999337e+01 2.02483142e+02 4.71997737e+01 2.02482903e+02 4.71996246e+01 2.02482705e+02 4.71994457e+01 2.02482651e+02 4.71992461e+01 2.02482845e+02 4.71990683e+01 2.02482878e+02 4.71989924e+01 2.02482865e+02 4.71987818e+01 2.02482961e+02 4.71986060e+01 2.02482957e+02 4.71985399e+01 2.02483051e+02 4.71982995e+01 2.02483270e+02 4.71981374e+01 2.02483294e+02 4.71980344e+01 2.02483331e+02 4.71978760e+01 2.02483287e+02 4.71977147e+01 2.02483207e+02 4.71974994e+01 2.02483212e+02 4.71974445e+01 2.02483298e+02 4.71972571e+01 2.02483325e+02 4.71970357e+01 2.02483256e+02 4.71969319e+01 2.02483162e+02 4.71968304e+01 2.02483146e+02 4.71965638e+01 2.02483132e+02 4.71965272e+01 2.02483049e+02 4.71965033e+01 2.02482679e+02 4.71965713e+01 2.02482460e+02 4.71967334e+01 2.02482631e+02 4.71968980e+01 2.02482825e+02 4.71970796e+01 2.02482789e+02 4.71972381e+01 2.02482668e+02 4.71974622e+01 2.02482452e+02 4.71976263e+01 2.02482153e+02 4.71977385e+01 2.02482106e+02 4.71979360e+01 2.02482111e+02 4.71980114e+01 2.02481970e+02 4.71982225e+01 2.02481819e+02 4.71984272e+01 2.02481810e+02 4.71984805e+01 2.02481825e+02 4.71987304e+01 2.02481699e+02 4.71988875e+01 2.02481678e+02 4.71989377e+01 2.02481761e+02 4.71991675e+01 2.02481768e+02 4.71992933e+01 2.02481558e+02 4.71994611e+01 2.02481538e+02 4.71996572e+01 2.02481568e+02 4.71997665e+01 2.02481384e+02 4.71999508e+01 2.02481082e+02 4.72000608e+01 2.02480957e+02 4.72002823e+01 2.02480940e+02 4.72004248e+01 2.02480949e+02 4.72005764e+01 2.02480908e+02 4.72007733e+01 2.02480900e+02 4.72008451e+01 2.02480796e+02 4.72008565e+01 2.02480413e+02 4.72008140e+01 2.02480356e+02 4.72008042e+01 2.02480128e+02 4.72009607e+01 2.02480117e+02 4.72010326e+01 2.02480217e+02 4.72012840e+01 2.02480456e+02 4.72014331e+01 2.02480458e+02 4.72014661e+01 2.02480475e+02 4.72017443e+01 2.02480587e+02 4.72018458e+01 2.02480377e+02 4.72020139e+01 2.02480384e+02 4.72021365e+01 2.02480652e+02 4.72022637e+01 2.02480682e+02 4.72025040e+01 2.02480290e+02 4.72025313e+01 2.02480163e+02 4.72023002e+01 2.02479925e+02 4.72023302e+01 2.02479895e+02 4.72024976e+01 2.02479903e+02 4.72026153e+01 2.02479930e+02 4.72027972e+01 2.02479888e+02 4.72029050e+01 2.02480022e+02 4.72030549e+01 2.02480037e+02 4.72032975e+01 2.02479642e+02 4.72033497e+01 2.02479538e+02 4.72034122e+01 2.02479397e+02 4.72034959e+01 2.02479394e+02 4.72035188e+01 2.02479384e+02 4.72037873e+01 2.02479105e+02 4.72039121e+01 2.02479081e+02 4.72040753e+01 2.02479137e+02 4.72042312e+01 2.02478879e+02 4.72043689e+01 2.02478808e+02 4.72046026e+01 2.02478805e+02 4.72046220e+01 2.02478764e+02 4.72048959e+01 2.02478507e+02 4.72050341e+01 2.02478206e+02 4.72051456e+01 2.02477927e+02 4.72052704e+01 2.02477767e+02 4.72054698e+01 2.02477492e+02 4.72055972e+01 2.02477429e+02 4.72056211e+01 2.02477209e+02 4.72057194e+01 2.02477005e+02 4.72058913e+01 2.02476979e+02 4.72059534e+01 2.02476923e+02 4.72061389e+01 2.02476655e+02 4.72061925e+01 2.02476572e+02 4.72062189e+01 2.02476317e+02 4.72063591e+01 2.02476248e+02 4.72064937e+01 2.02476217e+02 4.72065954e+01 2.02476026e+02 4.72066575e+01 2.02475846e+02 4.72066626e+01 2.02475674e+02 4.72068545e+01 2.02475547e+02 4.72070111e+01 2.02475518e+02 4.72070561e+01 2.02475484e+02 4.72073340e+01 2.02475389e+02 4.72074533e+01 2.02475397e+02 4.72075790e+01 2.02475167e+02 4.72076170e+01 2.02474891e+02 4.72074956e+01 2.02474757e+02 4.72074785e+01 2.02474452e+02 4.72075873e+01 2.02474420e+02 4.72078434e+01 2.02474442e+02 4.72078798e+01 2.02474556e+02 4.72080689e+01 2.02474708e+02 4.72082818e+01 2.02474686e+02 4.72083320e+01 2.02474615e+02 4.72083506e+01 2.02474254e+02 4.72083609e+01 2.02474084e+02 4.72085540e+01 2.02473781e+02 4.72086639e+01 2.02473741e+02 4.72086706e+01 2.02473403e+02 4.72087266e+01 2.02473240e+02 4.72087155e+01 2.02473162e+02 4.72085760e+01 2.02473160e+02 4.72084492e+01 2.02472974e+02 4.72084586e+01 2.02472754e+02 4.72086207e+01 2.02472566e+02 4.72088023e+01 2.02472347e+02 4.72089644e+01 2.02472009e+02 4.72089740e+01 2.02471904e+02 4.72089872e+01 2.02471536e+02 4.72089977e+01 2.02471430e+02 4.72089904e+01 2.02471093e+02 4.72090000e+01 2.02470988e+02 4.72090132e+01 2.02470779e+02 4.72091821e+01 2.02470554e+02 4.72090728e+01 2.02470251e+02 4.72091510e+01 2.02469996e+02 4.72092909e+01 2.02469705e+02 4.72094085e+01 2.02469633e+02 4.72094271e+01 2.02469363e+02 4.72094942e+01 2.02469092e+02 4.72095019e+01 2.02468908e+02 4.72095091e+01 2.02468916e+02 4.72096316e+01 2.02469170e+02 4.72097696e+01 2.02469383e+02 4.72098057e+01 2.02469552e+02 4.72096118e+01 2.02469790e+02 4.72096364e+01 2.02470061e+02 4.72096307e+01 2.02470280e+02 4.72094686e+01 2.02470510e+02 4.72094306e+01 2.02470633e+02 4.72093899e+01 2.02470852e+02 4.72092272e+01 2.02471088e+02 4.72090755e+01 2.02471445e+02 4.72090654e+01 2.02471681e+02 4.72091470e+01 2.02471778e+02 4.72091443e+01 2.02472139e+02 4.72091340e+01 2.02472236e+02 4.72091313e+01 2.02472561e+02 4.72092165e+01 2.02472573e+02 4.72094051e+01 2.02472260e+02 4.72095085e+01 2.02472156e+02 4.72097429e+01 2.02471775e+02 4.72098044e+01 2.02471760e+02 4.72098085e+01 2.02471408e+02 4.72098742e+01 2.02471245e+02 4.72098631e+01 2.02470871e+02 4.72098375e+01 2.02470651e+02 4.72099996e+01 2.02470588e+02 4.72100235e+01 2.02470227e+02 4.72100337e+01 2.02470130e+02 4.72100365e+01 2.02469910e+02 4.72101348e+01 2.02469571e+02 4.72102223e+01 2.02469292e+02 4.72103471e+01 2.02469256e+02 4.72103564e+01 2.02468953e+02 4.72104347e+01 2.02468700e+02 4.72104418e+01 2.02468516e+02 4.72104610e+01 2.02468187e+02 4.72104954e+01 2.02468081e+02 4.72104881e+01 2.02467711e+02 4.72105561e+01 2.02467491e+02 4.72107182e+01 2.02467451e+02 4.72107138e+01 2.02467075e+02 4.72106655e+01 2.02466837e+02 4.72106084e+01 2.02466746e+02 4.72105834e+01 2.02466398e+02 4.72105154e+01 2.02466293e+02 4.72105674e+01 2.02465871e+02 4.72105794e+01 2.02465759e+02 4.72105334e+01 2.02465482e+02 4.72105413e+01 2.02465301e+02 4.72105464e+01 2.02465024e+02 4.72105543e+01 2.02464749e+02 4.72105007e+01 2.02464611e+02 4.72107135e+01 2.02464358e+02 4.72107207e+01 2.02464046e+02 4.72106599e+01 2.02464005e+02 4.72106555e+01 2.02463635e+02 4.72107022e+01 2.02463496e+02 4.72107061e+01 2.02463122e+02 4.72106805e+01 2.02463082e+02 4.72106872e+01 2.02462820e+02 4.72105553e+01 2.02462466e+02 4.72104913e+01 2.02462256e+02 4.72103209e+01 2.02461974e+02 4.72102037e+01 2.02461837e+02 4.72101769e+01 2.02461845e+02 4.72102995e+01 2.02461856e+02 4.72104881e+01 2.02461579e+02 4.72104959e+01 2.02461304e+02 4.72104423e+01 2.02461044e+02 4.72105790e+01 2.02461011e+02 4.72105899e+01 2.02460754e+02 4.72106967e+01 2.02460472e+02 4.72106625e+01 2.02460283e+02 4.72104764e+01 2.02460161e+02 4.72103266e+01 2.02460156e+02 4.72102449e+01 2.02460005e+02 4.72102287e+01 2.02459834e+02 4.72101580e+01 2.02459836e+02 4.72101234e+01 2.02460052e+02 4.72099586e+01 2.02460241e+02 4.72097781e+01 2.02460429e+02 4.72095963e+01 2.02460649e+02 4.72094343e+01 2.02460882e+02 4.72092806e+01 2.02461083e+02 4.72091073e+01 2.02461286e+02 4.72089348e+01 2.02461522e+02 4.72087832e+01 2.02461768e+02 4.72086372e+01 2.02462012e+02 4.72084908e+01 2.02462270e+02 4.72083525e+01 2.02462458e+02 4.72081710e+01 2.02462661e+02 4.72079985e+01 2.02462885e+02 4.72078395e+01 2.02463094e+02 4.72076707e+01 2.02463306e+02 4.72075041e+01 2.02463555e+02 4.72073606e+01 2.02463805e+02 4.72072172e+01 2.02463994e+02 4.72070365e+01 2.02464214e+02 4.72068744e+01 2.02464433e+02 4.72067124e+01 2.02464630e+02 4.72065362e+01 2.02464850e+02 4.72063742e+01 2.02465075e+02 4.72062158e+01 2.02465341e+02 4.72060827e+01 2.02465474e+02 4.72058663e+01 2.02465669e+02 4.72056893e+01 2.02465936e+02 4.72055569e+01 2.02466150e+02 4.72053913e+01 2.02466362e+02 4.72052245e+01 2.02466526e+02 4.72050276e+01 2.02466723e+02 4.72048520e+01 2.02466964e+02 4.72047035e+01 2.02467021e+02 4.72045251e+01 2.02467067e+02 4.72044683e+01 2.02467223e+02 4.72042663e+01 2.02467449e+02 4.72041083e+01 2.02467685e+02 4.72039567e+01 2.02467914e+02 4.72038662e+01 2.02468022e+02 4.72038681e+01 2.02468259e+02 4.72037174e+01 2.02468278e+02 4.72035970e+01 2.02468360e+02 4.72034813e+01 2.02468510e+02 4.72032758e+01 2.02468686e+02 4.72030864e+01 2.02468971e+02 4.72029651e+01 2.02469219e+02 4.72028211e+01 2.02469475e+02 4.72026815e+01 2.02469658e+02 4.72024970e+01 2.02469878e+02 4.72023349e+01 2.02470106e+02 4.72021784e+01 2.02470301e+02 4.72020013e+01 2.02470206e+02 4.72018479e+01 2.02469972e+02 4.72016952e+01 2.02469744e+02 4.72015381e+01 2.02469476e+02 4.72014109e+01 2.02469224e+02 4.72012716e+01 2.02468991e+02 4.72011186e+01 2.02468786e+02 4.72009446e+01 2.02468537e+02 4.72008038e+01 2.02468298e+02 4.72006551e+01 2.02468069e+02 4.72004989e+01 2.02467791e+02 4.72003786e+01 2.02467560e+02 4.72002239e+01 2.02467307e+02 4.72000855e+01 2.02467086e+02 4.71999233e+01 2.02466840e+02 4.71997802e+01 2.02466593e+02 4.71996374e+01 2.02466352e+02 4.71994896e+01 2.02466099e+02 4.71993514e+01 2.02465854e+02 4.71992070e+01 2.02465625e+02 4.71990507e+01 2.02465378e+02 4.71989077e+01 2.02465136e+02 4.71987616e+01 2.02464971e+02 4.71986698e+01 2.02464856e+02 4.71986433e+01 2.02464555e+02 4.71985402e+01 2.02464443e+02 4.71983400e+01 2.02464418e+02 4.71983163e+01 2.02464174e+02 4.71981710e+01 2.02464171e+02 4.71981699e+01 2.02463845e+02 4.71980888e+01 2.02463634e+02 4.71979192e+01 2.02463404e+02 4.71977642e+01 2.02463153e+02 4.71976238e+01 2.02462965e+02 4.71974379e+01 2.02462856e+02 4.71973478e+01 2.02462749e+02 4.71972722e+01 2.02462525e+02 4.71971120e+01 2.02462295e+02 4.71969569e+01 2.02462090e+02 4.71968689e+01 2.02462008e+02 4.71968436e+01 2.02461989e+02 4.71968059e+01 2.02461840e+02 4.71966420e+01 2.02461623e+02 4.71964768e+01 2.02461375e+02 4.71963351e+01 2.02461081e+02 4.71962272e+01 2.02460863e+02 4.71960630e+01 2.02460600e+02 4.71959316e+01 2.02460581e+02 4.71959253e+01 2.02460264e+02 4.71958548e+01 2.02460220e+02 4.71956994e+01 2.02460219e+02 4.71955624e+01 2.02460245e+02 4.71954158e+01 2.02460465e+02 4.71952544e+01 2.02460723e+02 4.71951167e+01 2.02460913e+02 4.71949362e+01 2.02461132e+02 4.71947736e+01 2.02461324e+02 4.71945941e+01 2.02461498e+02 4.71944042e+01 2.02461738e+02 4.71942548e+01 2.02461992e+02 4.71941144e+01 2.02462151e+02 4.71939146e+01 2.02462353e+02 4.71937413e+01 2.02462589e+02 4.71935898e+01 2.02462834e+02 4.71934435e+01 2.02463075e+02 4.71932951e+01 2.02463275e+02 4.71931209e+01 2.02463487e+02 4.71929539e+01 2.02463720e+02 4.71928004e+01 2.02463931e+02 4.71926335e+01 2.02464146e+02 4.71924682e+01 2.02464359e+02 4.71923026e+01 2.02464569e+02 4.71921347e+01 2.02464797e+02 4.71919777e+01 2.02465000e+02 4.71918056e+01 2.02465212e+02 4.71916387e+01 2.02465431e+02 4.71914762e+01 2.02465656e+02 4.71913175e+01 2.02465898e+02 4.71911696e+01 2.02466100e+02 4.71909970e+01 2.02466332e+02 4.71908425e+01 2.02466565e+02 4.71906889e+01 2.02466777e+02 4.71905226e+01 2.02466995e+02 4.71903596e+01 2.02467212e+02 4.71901956e+01 2.02467420e+02 4.71900267e+01 2.02467660e+02 4.71898774e+01 2.02467884e+02 4.71897185e+01 2.02468099e+02 4.71895531e+01 2.02468306e+02 4.71893834e+01 2.02468523e+02 4.71892201e+01 2.02468733e+02 4.71890523e+01 2.02468962e+02 4.71888961e+01 2.02469172e+02 4.71887281e+01 2.02469164e+02 4.71886303e+01 2.02468951e+02 4.71884622e+01 2.02468740e+02 4.71882928e+01 2.02468532e+02 4.71881208e+01 2.02468261e+02 4.71879957e+01 2.02468014e+02 4.71878531e+01 2.02467770e+02 4.71877084e+01 2.02467554e+02 4.71875423e+01 2.02467332e+02 4.71873809e+01 2.02467082e+02 4.71872407e+01 2.02466843e+02 4.71870916e+01 2.02466624e+02 4.71869280e+01 2.02466394e+02 4.71867731e+01 2.02466155e+02 4.71866240e+01 2.02465946e+02 4.71864532e+01 2.02465721e+02 4.71862942e+01 2.02465452e+02 4.71861676e+01 2.02465219e+02 4.71860148e+01 2.02464963e+02 4.71858783e+01 2.02464739e+02 4.71857188e+01 2.02464501e+02 4.71855695e+01 2.02464224e+02 4.71854488e+01 2.02464093e+02 4.71852535e+01 2.02464241e+02 4.71851105e+01 2.02464263e+02 4.71850603e+01 2.02464303e+02 4.71850647e+01 2.02464729e+02 4.71850526e+01 2.02464915e+02 4.71848695e+01 2.02465159e+02 4.71847232e+01 2.02465208e+02 4.71847218e+01 2.02465546e+02 4.71846658e+01 2.02465775e+02 4.71846278e+01 2.02465956e+02 4.71846227e+01 2.02466035e+02 4.71844363e+01 2.02466064e+02 4.71843914e+01 2.02466128e+02 4.71843675e+01 2.02466363e+02 4.71842790e+01 2.02466348e+02 4.71842046e+01 2.02466374e+02 4.71839863e+01 2.02466516e+02 4.71837761e+01 2.02466587e+02 4.71837028e+01 2.02466624e+02 4.71835443e+01 2.02466853e+02 4.71835063e+01 2.02467127e+02 4.71835599e+01 2.02467225e+02 4.71835571e+01 2.02467585e+02 4.71835469e+01 2.02467830e+02 4.71834007e+01 2.02467878e+02 4.71833993e+01 2.02468182e+02 4.71835001e+01 2.02468461e+02 4.71834962e+01 2.02468675e+02 4.71833303e+01 2.02468663e+02 4.71831448e+01 2.02468498e+02 4.71829417e+01 2.02468496e+02 4.71829197e+01 2.02468560e+02 4.71828959e+01 2.02468885e+02 4.71829811e+01 2.02469037e+02 4.71831940e+01 2.02469272e+02 4.71831055e+01 2.02469296e+02 4.71830025e+01 2.02469284e+02 4.71828139e+01 2.02469598e+02 4.71827106e+01 2.02469695e+02 4.71827078e+01 2.02469962e+02 4.71826388e+01 2.02470239e+02 4.71826310e+01 2.02470251e+02 4.71828196e+01 2.02470258e+02 4.71829421e+01 2.02470439e+02 4.71829370e+01 2.02470431e+02 4.71828145e+01 2.02470419e+02 4.71826259e+01 2.02470697e+02 4.71826180e+01 2.02470877e+02 4.71826129e+01 2.02470870e+02 4.71824903e+01 2.02470742e+02 4.71822591e+01 2.02470740e+02 4.71822281e+01 2.02470786e+02 4.71822268e+01 2.02471171e+02 4.71821983e+01 2.02471245e+02 4.71822128e+01 2.02471510e+02 4.71821110e+01 2.02471866e+02 4.71820795e+01 2.02472087e+02 4.71821723e+01 2.02472161e+02 4.71821868e+01 2.02472570e+02 4.71821752e+01 2.02472619e+02 4.71821738e+01 2.02473028e+02 4.71821622e+01 2.02473247e+02 4.71820001e+01 2.02473230e+02 4.71817219e+01 2.02473228e+02 4.71816889e+01 2.02473448e+02 4.71815268e+01 2.02473488e+02 4.71815312e+01 2.02473914e+02 4.71815191e+01 2.02473977e+02 4.71814952e+01 2.02473981e+02 4.71815613e+01 2.02473856e+02 4.71817821e+01 2.02473543e+02 4.71818854e+01 2.02473568e+02 4.71821231e+01 2.02473796e+02 4.71822797e+01 2.02474063e+02 4.71822107e+01 2.02474260e+02 4.71820346e+01 2.02474287e+02 4.71819169e+01 2.02474277e+02 4.71817458e+01 2.02474342e+02 4.71815510e+01 2.02474338e+02 4.71814850e+01 2.02474435e+02 4.71814822e+01 2.02474796e+02 4.71814720e+01 2.02475015e+02 4.71813099e+01 2.02475189e+02 4.71811192e+01 2.02475374e+02 4.71811139e+01 2.02475718e+02 4.71811506e+01 2.02475754e+02 4.71811578e+01 2.02476005e+02 4.71812983e+01 2.02476290e+02 4.71812095e+01 2.02476552e+02 4.71812190e+01 2.02476724e+02 4.71814172e+01 2.02476994e+02 4.71813501e+01 2.02477221e+02 4.71813751e+01 2.02477277e+02 4.71815270e+01 2.02477341e+02 4.71816122e+01 2.02477437e+02 4.71816268e+01 2.02477774e+02 4.71816172e+01 2.02477926e+02 4.71816333e+01 2.02478203e+02 4.71816254e+01 2.02478352e+02 4.71816007e+01 2.02478690e+02 4.71815911e+01 2.02478813e+02 4.71818253e+01 2.02478792e+02 4.71818755e+01 2.02478907e+02 4.71820812e+01 2.02478962e+02 4.71822808e+01 2.02478617e+02 4.71823646e+01 2.02478520e+02 4.71823674e+01 2.02478159e+02 4.71823776e+01 2.02478034e+02 4.71825984e+01 2.02478041e+02 4.71827210e+01 2.02478222e+02 4.71827159e+01 2.02478441e+02 4.71825538e+01 2.02478718e+02 4.71825459e+01 2.02478993e+02 4.71825995e+01 2.02479212e+02 4.71824374e+01 2.02479431e+02 4.71822753e+01 2.02479330e+02 4.71820940e+01 2.02479367e+02 4.71819355e+01 2.02479355e+02 4.71817501e+01 2.02479308e+02 4.71815995e+01 2.02479510e+02 4.71816355e+01 2.02479885e+02 4.71816610e+01 2.02479948e+02 4.71816372e+01 2.02479927e+02 4.71816874e+01 2.02479708e+02 4.71818495e+01 2.02479725e+02 4.71821276e+01 2.02479955e+02 4.71822824e+01 2.02480381e+02 4.71822703e+01 2.02480314e+02 4.71820170e+01 2.02480285e+02 4.71819113e+01 2.02480336e+02 4.71816757e+01 2.02480309e+02 4.71816269e+01 2.02480371e+02 4.71816499e+01 2.02480672e+02 4.71817526e+01 2.02480845e+02 4.71816631e+01 2.02481122e+02 4.71815367e+01 2.02481451e+02 4.71815023e+01 2.02481557e+02 4.71815095e+01 2.02481854e+02 4.71815298e+01 2.02482094e+02 4.71815461e+01 2.02482279e+02 4.71815409e+01 2.02482591e+02 4.71816359e+01 2.02482809e+02 4.71818004e+01 2.02482994e+02 4.71818090e+01 2.02483083e+02 4.71815975e+01 2.02483094e+02 4.71815724e+01 2.02483177e+02 4.71813252e+01 2.02483439e+02 4.71813347e+01 2.02483697e+02 4.71814690e+01 2.02483818e+02 4.71817048e+01 2.02484188e+02 4.71816581e+01 2.02484314e+02 4.71816640e+01 2.02484552e+02 4.71818130e+01 2.02484595e+02 4.71819126e+01 2.02484639e+02 4.71820738e+01 2.02484889e+02 4.71822150e+01 2.02485198e+02 4.71822890e+01 2.02485230e+02 4.71822880e+01 2.02485499e+02 4.71824142e+01 2.02485766e+02 4.71823452e+01 2.02486044e+02 4.71823373e+01 2.02486173e+02 4.71825674e+01 2.02486200e+02 4.71826162e+01 2.02485947e+02 4.71827572e+01 2.02485907e+02 4.71827639e+01 2.02485570e+02 4.71826873e+01 2.02485441e+02 4.71824572e+01 2.02485105e+02 4.71825300e+01 2.02484887e+02 4.71825417e+01 2.02484633e+02 4.71825346e+01 2.02484440e+02 4.71825464e+01 2.02484131e+02 4.71825201e+01 2.02484005e+02 4.71827402e+01 2.02484055e+02 4.71828308e+01 2.02484251e+02 4.71830118e+01 2.02484445e+02 4.71831936e+01 2.02484789e+02 4.71832302e+01 2.02485008e+02 4.71830681e+01 2.02485057e+02 4.71830667e+01 2.02485295e+02 4.71832158e+01 2.02485633e+02 4.71831597e+01 2.02485863e+02 4.71831217e+01 2.02486137e+02 4.71831753e+01 2.02486203e+02 4.71831954e+01 2.02486493e+02 4.71833068e+01 2.02486753e+02 4.71834395e+01 2.02486809e+02 4.71835954e+01 2.02486867e+02 4.71836810e+01 2.02486946e+02 4.71839480e+01 2.02486973e+02 4.71839969e+01 2.02487075e+02 4.71841781e+01 2.02487349e+02 4.71842317e+01 2.02487423e+02 4.71842461e+01 2.02487832e+02 4.71842345e+01 2.02487904e+02 4.71842159e+01 2.02488202e+02 4.71841664e+01 2.02488350e+02 4.71842116e+01 2.02488600e+02 4.71843519e+01 2.02488604e+02 4.71844179e+01 2.02488706e+02 4.71845992e+01 2.02488923e+02 4.71847637e+01 2.02489052e+02 4.71846979e+01 2.02489063e+02 4.71846602e+01 2.02488965e+02 4.71844076e+01 2.02488961e+02 4.71843416e+01 2.02488859e+02 4.71841603e+01 2.02488701e+02 4.71839523e+01 2.02488394e+02 4.71838536e+01 2.02488210e+02 4.71836640e+01 2.02488132e+02 4.71835245e+01 2.02488352e+02 4.71833624e+01 2.02488690e+02 4.71832748e+01 2.02488762e+02 4.71832563e+01 2.02488972e+02 4.71831520e+01 2.02489296e+02 4.71830552e+01 2.02489479e+02 4.71830513e+01 2.02489462e+02 4.71831586e+01 2.02489426e+02 4.71834158e+01 2.02489437e+02 4.71834424e+01 2.02489552e+02 4.71836481e+01 2.02489563e+02 4.71838202e+01 2.02489473e+02 4.71840318e+01 2.02489757e+02 4.71841475e+01 2.02490042e+02 4.71842626e+01 2.02490081e+02 4.71844434e+01 2.02489957e+02 4.71846501e+01 2.02489985e+02 4.71846820e+01 2.02489921e+02 4.71846767e+01 2.02489678e+02 4.71847895e+01 2.02489542e+02 4.71849575e+01 2.02489835e+02 4.71850660e+01 2.02490147e+02 4.71851610e+01 2.02490267e+02 4.71851576e+01 2.02490377e+02 4.71849907e+01 2.02490373e+02 4.71849247e+01 2.02490470e+02 4.71849219e+01 2.02490831e+02 4.71849116e+01 2.02490928e+02 4.71849089e+01 2.02491289e+02 4.71848986e+01 2.02491363e+02 4.71849130e+01 2.02491701e+02 4.71848569e+01 2.02491755e+02 4.71846231e+01 2.02491727e+02 4.71845743e+01 2.02491564e+02 4.71844383e+01 2.02491323e+02 4.71842915e+01 2.02491356e+02 4.71840431e+01 2.02491414e+02 4.71838989e+01 2.02491414e+02 4.71837805e+01 2.02491648e+02 4.71836273e+01 2.02491555e+02 4.71834694e+01 2.02491303e+02 4.71833302e+01 2.02491101e+02 4.71832855e+01 2.02490951e+02 4.71832646e+01 2.02490559e+02 4.71832463e+01 2.02490535e+02 4.71832470e+01 2.02490211e+02 4.71831611e+01 2.02490139e+02 4.71829838e+01 2.02490248e+02 4.71828087e+01 2.02490048e+02 4.71829268e+01 2.02489649e+02 4.71829261e+01 2.02489611e+02 4.71826540e+01 2.02489679e+02 4.71825783e+01 2.02489403e+02 4.71824566e+01 2.02489456e+02 4.71822575e+01 2.02489539e+02 4.71820313e+01 2.02489506e+02 4.71819901e+01 2.02489376e+02 4.71818258e+01 2.02489250e+02 4.71815940e+01 2.02488983e+02 4.71816630e+01 2.02488750e+02 4.71816382e+01 2.02488694e+02 4.71814824e+01 2.02488686e+02 4.71813598e+01 2.02488412e+02 4.71813062e+01 2.02488338e+02 4.71812918e+01 2.02488336e+02 4.71812588e+01 2.02488556e+02 4.71810967e+01 2.02488538e+02 4.71808185e+01 2.02488147e+02 4.71807825e+01 2.02488041e+02 4.71807752e+01 2.02487704e+02 4.71808636e+01 2.02487677e+02 4.71811300e+01 2.02487691e+02 4.71811544e+01 2.02487767e+02 4.71813885e+01 2.02487751e+02 4.71814916e+01 2.02487601e+02 4.71815111e+01 2.02487251e+02 4.71814450e+01 2.02487033e+02 4.71813419e+01 2.02487049e+02 4.71815944e+01 2.02487269e+02 4.71817568e+01 2.02487678e+02 4.71817451e+01 2.02487719e+02 4.71817495e+01 2.02487729e+02 4.71817768e+01 2.02487868e+02 4.71819646e+01 2.02487881e+02 4.71821710e+01 2.02487544e+02 4.71822046e+01 2.02487477e+02 4.71822174e+01 2.02487058e+02 4.71822552e+01 2.02487022e+02 4.71822645e+01 2.02486613e+02 4.71822762e+01 2.02486565e+02 4.71822775e+01 2.02486216e+02 4.71822095e+01 2.02486099e+02 4.71819708e+01 2.02485786e+02 4.71818773e+01 2.02485728e+02 4.71817228e+01 2.02486005e+02 4.71817149e+01 2.02486139e+02 4.71816804e+01 2.02486342e+02 4.71815085e+01 2.02486369e+02 4.71814464e+01 2.02486273e+02 4.71814652e+01 2.02485904e+02 4.71815336e+01 2.02485807e+02 4.71815364e+01 2.02485474e+02 4.71814571e+01 2.02485310e+02 4.71812530e+01 2.02485232e+02 4.71811135e+01 2.02485224e+02 4.71809910e+01 2.02485017e+02 4.71808185e+01 2.02485022e+02 4.71806834e+01 2.02485076e+02 4.71804497e+01 2.02485074e+02 4.71804167e+01 2.02484895e+02 4.71802584e+01 2.02484704e+02 4.71800737e+01 2.02484697e+02 4.71798819e+01 2.02484631e+02 4.71798028e+01 2.02484478e+02 4.71797449e+01 2.02484330e+02 4.71796998e+01 2.02484251e+02 4.71796034e+01 2.02484148e+02 4.71795091e+01 2.02483922e+02 4.71793505e+01 2.02483843e+02 4.71793484e+01 2.02483801e+02 4.71794399e+01 2.02483813e+02 4.71796285e+01 2.02483650e+02 4.71798258e+01 2.02483410e+02 4.71799750e+01 2.02483084e+02 4.71799701e+01 2.02482809e+02 4.71798478e+01 2.02482718e+02 4.71798418e+01 2.02482442e+02 4.71797940e+01 2.02482260e+02 4.71796029e+01 2.02482125e+02 4.71794711e+01 2.02482082e+02 4.71794095e+01 2.02481919e+02 4.71793424e+01 2.02481771e+02 4.71793135e+01 2.02481505e+02 4.71793825e+01 2.02481227e+02 4.71793904e+01 2.02480953e+02 4.71793368e+01 2.02480859e+02 4.71795772e+01 2.02480480e+02 4.71796400e+01 2.02480454e+02 4.71796363e+01 2.02480159e+02 4.71795295e+01 2.02479840e+02 4.71795386e+01 2.02479701e+02 4.71795425e+01 2.02479357e+02 4.71794713e+01 2.02479100e+02 4.71793360e+01 2.02479039e+02 4.71793376e+01 2.02478670e+02 4.71793286e+01 2.02478607e+02 4.71790671e+01 2.02478889e+02 4.71789446e+01 2.02478862e+02 4.71788610e+01 2.02478728e+02 4.71788438e+01 2.02478468e+02 4.71788270e+01 2.02478134e+02 4.71787716e+01 2.02478003e+02 4.71789891e+01 2.02477801e+02 4.71789949e+01 2.02477568e+02 4.71790160e+01 2.02477264e+02 4.71790663e+01 2.02477158e+02 4.71790591e+01 2.02476814e+02 4.71791429e+01 2.02476594e+02 4.71793050e+01 2.02476469e+02 4.71795258e+01 2.02476177e+02 4.71796427e+01 2.02475902e+02 4.71797702e+01 2.02475683e+02 4.71799323e+01 2.02475472e+02 4.71800996e+01 2.02475240e+02 4.71802538e+01 2.02475204e+02 4.71802631e+01 2.02474902e+02 4.71803414e+01 2.02474673e+02 4.71803306e+01 2.02474329e+02 4.71802825e+01 2.02474225e+02 4.71805165e+01 2.02473931e+02 4.71805536e+01 2.02473811e+02 4.71805570e+01 2.02473488e+02 4.71806543e+01 2.02473381e+02 4.71808867e+01 2.02472989e+02 4.71809412e+01 2.02472961e+02 4.71809448e+01 2.02472536e+02 4.71809568e+01 2.02472472e+02 4.71809807e+01 2.02472494e+02 4.71809305e+01 2.02472477e+02 4.71806523e+01 2.02472223e+02 4.71805142e+01 2.02472220e+02 4.71804601e+01 2.02472176e+02 4.71802240e+01 2.02471842e+02 4.71801453e+01 2.02471738e+02 4.71801585e+01 2.02471445e+02 4.71801132e+01 2.02471238e+02 4.71799414e+01 2.02470912e+02 4.71798569e+01 2.02470734e+02 4.71796632e+01 2.02470509e+02 4.71795037e+01 2.02470231e+02 4.71795157e+01 2.02469932e+02 4.71796051e+01 2.02469838e+02 4.71795697e+01 2.02469912e+02 4.71796200e+01 2.02469862e+02 4.71798834e+01 2.02469514e+02 4.71799653e+01 2.02469448e+02 4.71799627e+01 2.02469428e+02 4.71799113e+01 2.02469347e+02 4.71797123e+01 2.02469267e+02 4.71795118e+01 2.02469651e+02 4.71794526e+01 2.02469667e+02 4.71791631e+01 2.02469715e+02 4.71791147e+01 2.02469623e+02 4.71791359e+01 2.02469296e+02 4.71792305e+01 2.02469067e+02 4.71792685e+01 2.02469103e+02 4.71791100e+01 2.02469013e+02 4.71789825e+01 2.02468783e+02 4.71788275e+01 2.02468616e+02 4.71788054e+01 2.02468382e+02 4.71789580e+01 2.02468237e+02 4.71791668e+01 2.02468249e+02 4.71792217e+01 2.02468266e+02 4.71794839e+01 2.02468130e+02 4.71796351e+01 2.02468109e+02 4.71796853e+01 2.02468126e+02 4.71799634e+01 2.02468116e+02 4.71799885e+01 2.02467896e+02 4.71801506e+01 2.02467837e+02 4.71801771e+01 2.02467476e+02 4.71801873e+01 2.02467382e+02 4.71804277e+01 2.02467038e+02 4.71805115e+01 2.02467053e+02 4.71807566e+01 2.02467057e+02 4.71808226e+01 2.02466960e+02 4.71808254e+01 2.02466675e+02 4.71808835e+01 2.02466495e+02 4.71808435e+01 2.02466153e+02 4.71807708e+01 2.02466125e+02 4.71805395e+01 2.02466164e+02 4.71804376e+01 2.02465867e+02 4.71803318e+01 2.02465814e+02 4.71800459e+01 2.02466246e+02 4.71800167e+01 2.02466229e+02 4.71797386e+01 2.02466227e+02 4.71797056e+01 2.02466112e+02 4.71794998e+01 2.02465872e+02 4.71794834e+01 2.02465687e+02 4.71794887e+01 2.02465703e+02 4.71793780e+01 2.02465851e+02 4.71791707e+01 2.02465800e+02 4.71790801e+01 2.02465784e+02 4.71788302e+01 2.02465824e+02 4.71787370e+01 2.02465861e+02 4.71785785e+01 2.02465816e+02 4.71784172e+01 2.02465832e+02 4.71782616e+01 2.02465852e+02 4.71780655e+01 2.02465822e+02 4.71779562e+01 2.02465759e+02 4.71778094e+01 2.02465564e+02 4.71776279e+01 2.02465354e+02 4.71774575e+01 2.02465348e+02 4.71773601e+01 2.02465410e+02 4.71771002e+01 2.02465576e+02 4.71769682e+01 2.02465606e+02 4.71769233e+01 2.02465646e+02 4.71769166e+01 2.02465952e+02 4.71768405e+01 2.02466199e+02 4.71768335e+01 2.02466481e+02 4.71769504e+01 2.02466726e+02 4.71770253e+01 2.02466596e+02 4.71768653e+01 2.02466582e+02 4.71766358e+01 2.02466920e+02 4.71766263e+01 2.02467043e+02 4.71768605e+01 2.02467047e+02 4.71769265e+01 2.02466802e+02 4.71770728e+01 2.02466819e+02 4.71773509e+01 2.02467058e+02 4.71775000e+01 2.02467060e+02 4.71775330e+01 2.02467175e+02 4.71777388e+01 2.02467229e+02 4.71779383e+01 2.02467206e+02 4.71780413e+01 2.02467355e+02 4.71780166e+01 2.02467605e+02 4.71778741e+01 2.02467553e+02 4.71777845e+01 2.02467575e+02 4.71775563e+01 2.02467925e+02 4.71774754e+01 2.02467997e+02 4.71774569e+01 2.02468207e+02 4.71773530e+01 2.02468227e+02 4.71772866e+01 2.02468213e+02 4.71770572e+01 2.02468237e+02 4.71769542e+01 2.02468118e+02 4.71769980e+01 2.02467899e+02 4.71771599e+01 2.02467531e+02 4.71771505e+01 2.02467324e+02 4.71769781e+01 2.02467313e+02 4.71767934e+01 2.02467511e+02 4.71766182e+01 2.02467823e+02 4.71766094e+01 2.02468114e+02 4.71766963e+01 2.02468300e+02 4.71765131e+01 2.02468553e+02 4.71763721e+01 2.02468593e+02 4.71763655e+01 2.02468621e+02 4.71764143e+01 2.02468636e+02 4.71766595e+01 2.02468996e+02 4.71766492e+01 2.02469122e+02 4.71764284e+01 2.02469294e+02 4.71762370e+01 2.02469608e+02 4.71761344e+01 2.02469874e+02 4.71760009e+01 2.02469858e+02 4.71757558e+01 2.02469880e+02 4.71757056e+01 2.02470057e+02 4.71755175e+01 2.02470252e+02 4.71754653e+01 2.02470397e+02 4.71754308e+01 2.02470516e+02 4.71752695e+01 2.02470301e+02 4.71751033e+01 2.02470274e+02 4.71750544e+01 2.02470371e+02 4.71750517e+01 2.02470600e+02 4.71749588e+01 2.02470950e+02 4.71749488e+01 2.02470965e+02 4.71751873e+01 2.02470848e+02 4.71753498e+01 2.02470852e+02 4.71754159e+01 2.02470982e+02 4.71755759e+01 2.02470996e+02 4.71758053e+01 2.02470973e+02 4.71759083e+01 2.02471247e+02 4.71759619e+01 2.02471232e+02 4.71757168e+01 2.02471228e+02 4.71756508e+01 2.02471346e+02 4.71756324e+01 2.02471522e+02 4.71755354e+01 2.02471802e+02 4.71754115e+01 2.02472096e+02 4.71754032e+01 2.02472317e+02 4.71754341e+01 2.02472546e+02 4.71753961e+01 2.02472674e+02 4.71753580e+01 2.02473020e+02 4.71753713e+01 2.02473303e+02 4.71754525e+01 2.02473375e+02 4.71754339e+01 2.02473736e+02 4.71754237e+01 2.02473861e+02 4.71752029e+01 2.02474139e+02 4.71751950e+01 2.02474263e+02 4.71751546e+01 2.02474312e+02 4.71750673e+01 2.02474300e+02 4.71748787e+01 2.02474379e+02 4.71746923e+01 2.02474171e+02 4.71745203e+01 2.02474162e+02 4.71744930e+01 2.02474210e+02 4.71744916e+01 2.02474475e+02 4.71746212e+01 2.02474829e+02 4.71746111e+01 2.02475055e+02 4.71744530e+01 2.02475126e+02 4.71744656e+01 2.02475535e+02 4.71744540e+01 2.02475518e+02 4.71741758e+01 2.02475109e+02 4.71741874e+01 2.02475039e+02 4.71742040e+01 2.02475033e+02 4.71741400e+01 2.02475018e+02 4.71738948e+01 2.02475013e+02 4.71738288e+01 2.02475087e+02 4.71738432e+01 2.02475369e+02 4.71739604e+01 2.02475588e+02 4.71741242e+01 2.02475826e+02 4.71742733e+01 2.02476187e+02 4.71742630e+01 2.02476281e+02 4.71742623e+01 2.02476522e+02 4.71744093e+01 2.02476526e+02 4.71744754e+01 2.02476541e+02 4.71747205e+01 2.02476780e+02 4.71748696e+01 2.02476759e+02 4.71749198e+01 2.02476539e+02 4.71750819e+01 2.02476556e+02 4.71753600e+01 2.02476966e+02 4.71753484e+01 2.02477014e+02 4.71753470e+01 2.02477423e+02 4.71753354e+01 2.02477464e+02 4.71753397e+01 2.02477499e+02 4.71753828e+01 2.02477246e+02 4.71755239e+01 2.02477376e+02 4.71757300e+01 2.02477388e+02 4.71759114e+01 2.02477152e+02 4.71760634e+01 2.02476940e+02 4.71760523e+01 2.02476686e+02 4.71760713e+01 2.02476384e+02 4.71761815e+01 2.02476334e+02 4.71764494e+01 2.02476135e+02 4.71766241e+01 2.02475822e+02 4.71765533e+01 2.02475609e+02 4.71765947e+01 2.02475563e+02 4.71767446e+01 2.02475547e+02 4.71768552e+01 2.02475641e+02 4.71770123e+01 2.02475885e+02 4.71770664e+01 2.02476027e+02 4.71770529e+01 2.02476375e+02 4.71771207e+01 2.02476447e+02 4.71771187e+01 2.02476817e+02 4.71770505e+01 2.02477061e+02 4.71769043e+01 2.02477102e+02 4.71769086e+01 2.02477348e+02 4.71770520e+01 2.02477687e+02 4.71769959e+01 2.02477837e+02 4.71767908e+01 2.02477996e+02 4.71765909e+01 2.02478005e+02 4.71765669e+01 2.02477917e+02 4.71763061e+01 2.02477913e+02 4.71762401e+01 2.02478158e+02 4.71760938e+01 2.02478386e+02 4.71759370e+01 2.02478449e+02 4.71759131e+01 2.02478810e+02 4.71759028e+01 2.02478907e+02 4.71759001e+01 2.02479232e+02 4.71759853e+01 2.02479506e+02 4.71760389e+01 2.02479491e+02 4.71757937e+01 2.02479264e+02 4.71756362e+01 2.02479287e+02 4.71756027e+01 2.02479202e+02 4.71753564e+01 2.02479211e+02 4.71752563e+01 2.02479387e+02 4.71750669e+01 2.02479579e+02 4.71750782e+01 2.02479654e+02 4.71752341e+01 2.02479714e+02 4.71753037e+01 2.02479928e+02 4.71754054e+01 2.02480022e+02 4.71754008e+01 2.02480289e+02 4.71753318e+01 2.02480628e+02 4.71752442e+01 2.02480676e+02 4.71752428e+01 2.02481085e+02 4.71752312e+01 2.02481305e+02 4.71750691e+01 2.02481288e+02 4.71747909e+01 2.02481286e+02 4.71747579e+01 2.02481434e+02 4.71745514e+01 2.02481488e+02 4.71743176e+01 2.02481226e+02 4.71741858e+01 2.02481021e+02 4.71742931e+01 2.02480674e+02 4.71742682e+01 2.02480437e+02 4.71741186e+01 2.02480187e+02 4.71739774e+01 2.02480292e+02 4.71738377e+01 2.02480455e+02 4.71737799e+01 2.02480716e+02 4.71739121e+01 2.02480920e+02 4.71739309e+01 2.02481202e+02 4.71738081e+01 2.02481356e+02 4.71737640e+01 2.02481679e+02 4.71738507e+01 2.02481777e+02 4.71741039e+01 2.02482157e+02 4.71741485e+01 2.02482376e+02 4.71742427e+01 2.02482473e+02 4.71742400e+01 2.02482824e+02 4.71743057e+01 2.02483072e+02 4.71743788e+01 2.02483169e+02 4.71743760e+01 2.02483408e+02 4.71745251e+01 2.02483768e+02 4.71745148e+01 2.02483988e+02 4.71743527e+01 2.02484061e+02 4.71743671e+01 2.02484471e+02 4.71743554e+01 2.02484519e+02 4.71743541e+01 2.02484750e+02 4.71745088e+01 2.02484760e+02 4.71745361e+01 2.02484777e+02 4.71748143e+01 2.02484779e+02 4.71748473e+01 2.02484796e+02 4.71751254e+01 2.02484823e+02 4.71751743e+01 2.02484839e+02 4.71754194e+01 2.02484809e+02 4.71754644e+01 2.02484583e+02 4.71756222e+01 2.02484526e+02 4.71756503e+01 2.02484288e+02 4.71755013e+01 2.02484052e+02 4.71755898e+01 2.02483715e+02 4.71755994e+01 2.02483563e+02 4.71755833e+01 2.02483286e+02 4.71755912e+01 2.02483138e+02 4.71756167e+01 2.02482773e+02 4.71756880e+01 2.02482712e+02 4.71756897e+01 2.02482370e+02 4.71756173e+01 2.02482132e+02 4.71754682e+01 2.02481952e+02 4.71754734e+01 2.02481873e+02 4.71756598e+01 2.02482111e+02 4.71758089e+01 2.02482090e+02 4.71758591e+01 2.02482107e+02 4.71761372e+01 2.02482510e+02 4.71761215e+01 2.02482736e+02 4.71759635e+01 2.02482784e+02 4.71759621e+01 2.02483122e+02 4.71759060e+01 2.02483352e+02 4.71758680e+01 2.02483532e+02 4.71758628e+01 2.02483751e+02 4.71757007e+01 2.02484029e+02 4.71756928e+01 2.02484310e+02 4.71758100e+01 2.02484456e+02 4.71760275e+01 2.02484658e+02 4.71762039e+01 2.02484974e+02 4.71762956e+01 2.02484900e+02 4.71764189e+01 2.02484806e+02 4.71766593e+01 2.02484509e+02 4.71766391e+01 2.02484345e+02 4.71764348e+01 2.02484138e+02 4.71762628e+01 2.02484103e+02 4.71762197e+01 2.02483958e+02 4.71760703e+01 2.02483821e+02 4.71760435e+01 2.02483553e+02 4.71761755e+01 2.02483255e+02 4.71762879e+01 2.02483031e+02 4.71764474e+01 2.02482825e+02 4.71766174e+01 2.02482829e+02 4.71769052e+01 2.02482842e+02 4.71769276e+01 2.02482971e+02 4.71771257e+01 2.02483173e+02 4.71771341e+01 2.02483365e+02 4.71771592e+01 2.02483657e+02 4.71771376e+01 2.02483886e+02 4.71770996e+01 2.02484167e+02 4.71772172e+01 2.02484249e+02 4.71772083e+01 2.02484477e+02 4.71770521e+01 2.02484712e+02 4.71768997e+01 2.02484963e+02 4.71767572e+01 2.02485276e+02 4.71766538e+01 2.02485261e+02 4.71764087e+01 2.02485172e+02 4.71762899e+01 2.02485354e+02 4.71763399e+01 2.02485569e+02 4.71765061e+01 2.02485907e+02 4.71764500e+01 2.02486078e+02 4.71762578e+01 2.02486312e+02 4.71762827e+01 2.02486655e+02 4.71763193e+01 2.02486833e+02 4.71761312e+01 2.02486962e+02 4.71761275e+01 2.02487314e+02 4.71761924e+01 2.02487546e+02 4.71762774e+01 2.02487620e+02 4.71762918e+01 2.02487958e+02 4.71762357e+01 2.02488187e+02 4.71761977e+01 2.02488461e+02 4.71762512e+01 2.02488446e+02 4.71760061e+01 2.02488231e+02 4.71758398e+01 2.02487825e+02 4.71758145e+01 2.02487822e+02 4.71755528e+01 2.02488229e+02 4.71755161e+01 2.02488247e+02 4.71755189e+01 2.02488388e+02 4.71753979e+01 2.02488445e+02 4.71753437e+01 2.02488462e+02 4.71753432e+01 2.02488806e+02 4.71754149e+01 2.02489068e+02 4.71755464e+01 2.02489357e+02 4.71756577e+01 2.02489560e+02 4.71758333e+01 2.02489572e+02 4.71760481e+01 2.02489451e+02 4.71762396e+01 2.02489453e+02 4.71762728e+01 2.02489404e+02 4.71762742e+01 2.02489002e+02 4.71762456e+01 2.02488827e+02 4.71761810e+01 2.02488529e+02 4.71762934e+01 2.02488343e+02 4.71764766e+01 2.02488439e+02 4.71766621e+01 2.02488719e+02 4.71767114e+01 2.02488781e+02 4.71767345e+01 2.02489137e+02 4.71767968e+01 2.02489313e+02 4.71769920e+01 2.02489661e+02 4.71770600e+01 2.02489892e+02 4.71771455e+01 2.02490050e+02 4.71769449e+01 2.02490309e+02 4.71769067e+01 2.02490569e+02 4.71769703e+01 2.02490666e+02 4.71769676e+01 2.02490933e+02 4.71768986e+01 2.02491166e+02 4.71769234e+01 2.02491222e+02 4.71770792e+01 2.02491273e+02 4.71771699e+01 2.02491382e+02 4.71774147e+01 2.02491348e+02 4.71774570e+01 2.02491289e+02 4.71774835e+01 2.02491087e+02 4.71775932e+01 2.02491030e+02 4.71776751e+01 2.02490993e+02 4.71778336e+01 2.02491057e+02 4.71779804e+01 2.02491349e+02 4.71780556e+01 2.02491420e+02 4.71780370e+01 2.02491640e+02 4.71779387e+01 2.02491979e+02 4.71778511e+01 2.02492174e+02 4.71776739e+01 2.02492403e+02 4.71776359e+01 2.02492583e+02 4.71776307e+01 2.02492662e+02 4.71774443e+01 2.02492692e+02 4.71773993e+01 2.02492724e+02 4.71773984e+01 2.02493100e+02 4.71774463e+01 2.02493168e+02 4.71773975e+01 2.02493416e+02 4.71772535e+01 2.02493816e+02 4.71772421e+01 2.02494035e+02 4.71774052e+01 2.02494050e+02 4.71776500e+01 2.02493852e+02 4.71778250e+01 2.02493452e+02 4.71778364e+01 2.02493376e+02 4.71778270e+01 2.02492988e+02 4.71778539e+01 2.02492873e+02 4.71778114e+01 2.02492880e+02 4.71779339e+01 2.02493074e+02 4.71781157e+01 2.02493418e+02 4.71781523e+01 2.02493467e+02 4.71781510e+01 2.02493494e+02 4.71781998e+01 2.02493596e+02 4.71783811e+01 2.02493730e+02 4.71783470e+01 2.02494096e+02 4.71783366e+01 2.02494328e+02 4.71784215e+01 2.02494425e+02 4.71784188e+01 2.02494779e+02 4.71784826e+01 2.02495024e+02 4.71785575e+01 2.02495121e+02 4.71785547e+01 2.02495482e+02 4.71785444e+01 2.02495735e+02 4.71784033e+01 2.02495767e+02 4.71784024e+01 2.02496006e+02 4.71785515e+01 2.02496041e+02 4.71785945e+01 2.02496056e+02 4.71788397e+01 2.02496393e+02 4.71789162e+01 2.02496530e+02 4.71789001e+01 2.02496640e+02 4.71787333e+01 2.02496636e+02 4.71786672e+01 2.02496710e+02 4.71786817e+01 2.02497119e+02 4.71786699e+01 2.02497160e+02 4.71786743e+01 2.02497170e+02 4.71787016e+01 2.02510298e+02 4.71872013e+01 2.02510274e+02 4.71872009e+01 2.02509917e+02 4.71871394e+01 2.02509917e+02 4.71869633e+01 2.02510156e+02 4.71869626e+01 2.02510302e+02 4.71871804e+01 2.02510298e+02 4.71872013e+01 2.02497904e+02 4.71794598e+01 2.02497856e+02 4.71794612e+01 2.02497854e+02 4.71794282e+01 2.02497895e+02 4.71794326e+01 2.02497904e+02 4.71794598e+01 2.02493026e+02 4.71764117e+01 2.02492728e+02 4.71764194e+01 2.02492733e+02 4.71762284e+01 2.02493014e+02 4.71762082e+01 2.02493026e+02 4.71764117e+01 2.02479287e+02 4.71678242e+01 2.02479261e+02 4.71678305e+01 2.02479269e+02 4.71678128e+01 2.02479284e+02 4.71678131e+01 2.02479287e+02 4.71678242e+01 2.02516272e+02 4.71912308e+01 2.02516266e+02 4.71912318e+01 2.02516267e+02 4.71912273e+01 2.02516272e+02 4.71912274e+01 2.02516272e+02 4.71912308e+01 2.02509653e+02 4.71870974e+01 2.02509493e+02 4.71871280e+01 2.02509524e+02 4.71870169e+01 2.02509640e+02 4.71870191e+01 2.02509653e+02 4.71870974e+01 2.02505595e+02 4.71845632e+01 2.02505475e+02 4.71845667e+01 2.02505416e+02 4.71844511e+01 2.02505616e+02 4.71844623e+01 2.02505595e+02 4.71845632e+01 2.02497518e+02 4.71795173e+01 2.02497333e+02 4.71795226e+01 2.02497277e+02 4.71793668e+01 2.02497510e+02 4.71793916e+01 2.02497518e+02 4.71795173e+01 2.02495010e+02 4.71779503e+01 2.02494624e+02 4.71779463e+01 2.02494628e+02 4.71777119e+01 2.02494916e+02 4.71777299e+01 2.02495010e+02 4.71779503e+01 2.02518361e+02 4.71928339e+01 2.02518046e+02 4.71928450e+01 2.02518032e+02 4.71926287e+01 2.02518356e+02 4.71926157e+01 2.02518361e+02 4.71928339e+01 2.02509237e+02 4.71871367e+01 2.02509078e+02 4.71871094e+01 2.02509064e+02 4.71870290e+01 2.02509191e+02 4.71870253e+01 2.02509237e+02 4.71871367e+01 2.02506785e+02 4.71856051e+01 2.02506689e+02 4.71856211e+01 2.02506500e+02 4.71854358e+01 2.02506504e+02 4.71854299e+01 2.02506517e+02 4.71854232e+01 2.02506801e+02 4.71855386e+01 2.02506785e+02 4.71856051e+01 2.02503442e+02 4.71835175e+01 2.02503290e+02 4.71837215e+01 2.02503112e+02 4.71837103e+01 2.02503105e+02 4.71836063e+01 2.02503357e+02 4.71834642e+01 2.02503439e+02 4.71834683e+01 2.02503442e+02 4.71835175e+01 2.02495200e+02 4.71783683e+01 2.02494922e+02 4.71783762e+01 2.02494959e+02 4.71782177e+01 2.02495144e+02 4.71782124e+01 2.02495200e+02 4.71783683e+01 2.02479250e+02 4.71683993e+01 2.02478907e+02 4.71684170e+01 2.02478920e+02 4.71681931e+01 2.02479229e+02 4.71681789e+01 2.02479250e+02 4.71683993e+01 2.02476574e+02 4.71667260e+01 2.02476348e+02 4.71667306e+01 2.02476380e+02 4.71666047e+01 2.02476564e+02 4.71665709e+01 2.02476574e+02 4.71667260e+01 2.02504606e+02 4.71845438e+01 2.02504199e+02 4.71845339e+01 2.02504150e+02 4.71842586e+01 2.02504526e+02 4.71842922e+01 2.02504606e+02 4.71845438e+01 2.02495742e+02 4.71790059e+01 2.02495617e+02 4.71791639e+01 2.02495622e+02 4.71792300e+01 2.02495723e+02 4.71794112e+01 2.02495832e+02 4.71793613e+01 2.02495994e+02 4.71792111e+01 2.02495991e+02 4.71791615e+01 2.02495963e+02 4.71789085e+01 2.02495742e+02 4.71790059e+01 2.02489528e+02 4.71751233e+01 2.02489197e+02 4.71751255e+01 2.02489184e+02 4.71749078e+01 2.02489543e+02 4.71748696e+01 2.02489528e+02 4.71751233e+01 2.02517132e+02 4.71926646e+01 2.02516975e+02 4.71926606e+01 2.02516959e+02 4.71925566e+01 2.02517105e+02 4.71925641e+01 2.02517132e+02 4.71926646e+01 2.02512170e+02 4.71895667e+01 2.02511879e+02 4.71895942e+01 2.02511879e+02 4.71893846e+01 2.02512152e+02 4.71893925e+01 2.02512170e+02 4.71895667e+01 2.02509433e+02 4.71878574e+01 2.02509385e+02 4.71878588e+01 2.02509099e+02 4.71879477e+01 2.02509096e+02 4.71880720e+01 2.02509050e+02 4.71882165e+01 2.02508800e+02 4.71882912e+01 2.02508516e+02 4.71881761e+01 2.02508506e+02 4.71881755e+01 2.02508107e+02 4.71881524e+01 2.02508023e+02 4.71878897e+01 2.02508022e+02 4.71878732e+01 2.02508205e+02 4.71876888e+01 2.02508344e+02 4.71876520e+01 2.02508685e+02 4.71877252e+01 2.02508761e+02 4.71877371e+01 2.02509075e+02 4.71876336e+01 2.02509236e+02 4.71876435e+01 2.02509416e+02 4.71878359e+01 2.02509433e+02 4.71878574e+01 2.02506354e+02 4.71859347e+01 2.02506190e+02 4.71859906e+01 2.02505896e+02 4.71859474e+01 2.02505987e+02 4.71861402e+01 2.02506282e+02 4.71862481e+01 2.02506221e+02 4.71864493e+01 2.02506019e+02 4.71866224e+01 2.02505748e+02 4.71866424e+01 2.02505542e+02 4.71866234e+01 2.02505271e+02 4.71867538e+01 2.02505153e+02 4.71867572e+01 2.02505188e+02 4.71867019e+01 2.02505287e+02 4.71864647e+01 2.02505363e+02 4.71862763e+01 2.02505082e+02 4.71861584e+01 2.02505026e+02 4.71860026e+01 2.02505199e+02 4.71858111e+01 2.02505165e+02 4.71857722e+01 2.02505039e+02 4.71855398e+01 2.02505091e+02 4.71854446e+01 2.02505156e+02 4.71854531e+01 2.02505584e+02 4.71854618e+01 2.02505624e+02 4.71854783e+01 2.02505908e+02 4.71855478e+01 2.02506206e+02 4.71856529e+01 2.02506361e+02 4.71858636e+01 2.02506354e+02 4.71859347e+01 2.02501146e+02 4.71826815e+01 2.02501042e+02 4.71829157e+01 2.02500634e+02 4.71829391e+01 2.02500576e+02 4.71826564e+01 2.02500574e+02 4.71826234e+01 2.02500601e+02 4.71823408e+01 2.02500984e+02 4.71823553e+01 2.02501139e+02 4.71825658e+01 2.02501146e+02 4.71826815e+01 2.02497982e+02 4.71807045e+01 2.02497933e+02 4.71807059e+01 2.02497931e+02 4.71806729e+01 2.02497972e+02 4.71806772e+01 2.02497982e+02 4.71807045e+01 2.02503972e+02 4.71850446e+01 2.02503912e+02 4.71850711e+01 2.02503908e+02 4.71850050e+01 2.02503970e+02 4.71850280e+01 2.02503972e+02 4.71850446e+01 2.02502672e+02 4.71842328e+01 2.02502439e+02 4.71842080e+01 2.02502431e+02 4.71840823e+01 2.02502616e+02 4.71840770e+01 2.02502672e+02 4.71842328e+01 2.02501956e+02 4.71837858e+01 2.02501679e+02 4.71837937e+01 2.02501667e+02 4.71836051e+01 2.02501900e+02 4.71836299e+01 2.02501956e+02 4.71837858e+01 2.02501241e+02 4.71833387e+01 2.02500963e+02 4.71833467e+01 2.02501000e+02 4.71831882e+01 2.02501185e+02 4.71831829e+01 2.02501241e+02 4.71833387e+01 2.02485300e+02 4.71733780e+01 2.02485294e+02 4.71734562e+01 2.02485290e+02 4.71736709e+01 2.02484992e+02 4.71736794e+01 2.02484755e+02 4.71735288e+01 2.02484787e+02 4.71733563e+01 2.02484962e+02 4.71731670e+01 2.02485256e+02 4.71731586e+01 2.02485300e+02 4.71733780e+01 2.02476931e+02 4.71681461e+01 2.02476648e+02 4.71681351e+01 2.02476485e+02 4.71679307e+01 2.02476480e+02 4.71678644e+01 2.02476625e+02 4.71678271e+01 2.02476892e+02 4.71679550e+01 2.02476931e+02 4.71681461e+01 2.02504745e+02 4.71858265e+01 2.02504647e+02 4.71858293e+01 2.02504669e+02 4.71857791e+01 2.02504740e+02 4.71857605e+01 2.02504745e+02 4.71858265e+01 2.02487151e+02 4.71748343e+01 2.02486929e+02 4.71748497e+01 2.02486637e+02 4.71747407e+01 2.02486639e+02 4.71745138e+01 2.02486979e+02 4.71744880e+01 2.02487143e+02 4.71746922e+01 2.02487151e+02 4.71748343e+01 2.02506543e+02 4.71872486e+01 2.02506237e+02 4.71872574e+01 2.02506064e+02 4.71870601e+01 2.02506111e+02 4.71869789e+01 2.02506169e+02 4.71869825e+01 2.02506490e+02 4.71870703e+01 2.02506543e+02 4.71872486e+01 2.02482323e+02 4.71721155e+01 2.02482268e+02 4.71721140e+01 2.02482270e+02 4.71720820e+01 2.02482316e+02 4.71720784e+01 2.02482323e+02 4.71721155e+01 2.02509819e+02 4.71895940e+01 2.02509652e+02 4.71896141e+01 2.02509657e+02 4.71894926e+01 2.02509806e+02 4.71895002e+01 2.02509819e+02 4.71895940e+01 2.02509335e+02 4.71892918e+01 2.02509191e+02 4.71893038e+01 2.02509166e+02 4.71891861e+01 2.02509330e+02 4.71892013e+01 2.02509335e+02 4.71892918e+01 2.02504400e+02 4.71862095e+01 2.02504167e+02 4.71861847e+01 2.02504159e+02 4.71860589e+01 2.02504388e+02 4.71860209e+01 2.02504400e+02 4.71862095e+01 2.02486690e+02 4.71751445e+01 2.02486508e+02 4.71751614e+01 2.02486280e+02 4.71750041e+01 2.02486273e+02 4.71748837e+01 2.02486450e+02 4.71748786e+01 2.02486669e+02 4.71750426e+01 2.02486690e+02 4.71751445e+01 2.02485421e+02 4.71743508e+01 2.02485403e+02 4.71743513e+01 2.02485399e+02 4.71743376e+01 2.02485427e+02 4.71743334e+01 2.02485421e+02 4.71743508e+01 2.02479515e+02 4.71706590e+01 2.02479390e+02 4.71706625e+01 2.02479392e+02 4.71705821e+01 2.02479504e+02 4.71705789e+01 2.02479515e+02 4.71706590e+01 2.02517658e+02 4.71947875e+01 2.02517621e+02 4.71947867e+01 2.02517612e+02 4.71947586e+01 2.02517654e+02 4.71947626e+01 2.02517658e+02 4.71947875e+01 2.02490251e+02 4.71776690e+01 2.02490154e+02 4.71776718e+01 2.02489800e+02 4.71776079e+01 2.02489704e+02 4.71776264e+01 2.02489714e+02 4.71776720e+01 2.02489924e+02 4.71778421e+01 2.02490075e+02 4.71778582e+01 2.02490353e+02 4.71778503e+01 2.02490533e+02 4.71778451e+01 2.02490482e+02 4.71777545e+01 2.02490251e+02 4.71776690e+01 2.02477235e+02 4.71695330e+01 2.02476921e+02 4.71695597e+01 2.02476944e+02 4.71693510e+01 2.02477222e+02 4.71693372e+01 2.02477235e+02 4.71695330e+01 2.02475963e+02 4.71687376e+01 2.02475834e+02 4.71687369e+01 2.02475814e+02 4.71686446e+01 2.02475982e+02 4.71686273e+01 2.02475963e+02 4.71687376e+01 2.02518889e+02 4.71958550e+01 2.02518801e+02 4.71958674e+01 2.02518725e+02 4.71957522e+01 2.02518894e+02 4.71957980e+01 2.02518889e+02 4.71958550e+01 2.02507790e+02 4.71889252e+01 2.02507491e+02 4.71889338e+01 2.02507459e+02 4.71887183e+01 2.02507762e+02 4.71887333e+01 2.02507790e+02 4.71889252e+01 2.02507353e+02 4.71886519e+01 2.02506975e+02 4.71886642e+01 2.02506991e+02 4.71884258e+01 2.02507348e+02 4.71883884e+01 2.02507353e+02 4.71886519e+01 2.02501005e+02 4.71846868e+01 2.02500931e+02 4.71846724e+01 2.02500521e+02 4.71846841e+01 2.02500421e+02 4.71849208e+01 2.02500458e+02 4.71850220e+01 2.02500609e+02 4.71850382e+01 2.02500841e+02 4.71848839e+01 2.02501135e+02 4.71848468e+01 2.02501380e+02 4.71849216e+01 2.02501279e+02 4.71847403e+01 2.02501005e+02 4.71846868e+01 2.02485795e+02 4.71751835e+01 2.02485549e+02 4.71752192e+01 2.02485537e+02 4.71750222e+01 2.02485787e+02 4.71750437e+01 2.02485795e+02 4.71751835e+01 2.02480973e+02 4.71721693e+01 2.02480841e+02 4.71721926e+01 2.02480869e+02 4.71721042e+01 2.02481010e+02 4.71720683e+01 2.02480973e+02 4.71721693e+01 2.02501476e+02 4.71852802e+01 2.02501558e+02 4.71855100e+01 2.02501902e+02 4.71855466e+01 2.02501885e+02 4.71852685e+01 2.02501476e+02 4.71852802e+01 2.02487522e+02 4.71765614e+01 2.02487529e+02 4.71766840e+01 2.02487681e+02 4.71768969e+01 2.02487883e+02 4.71767876e+01 2.02487940e+02 4.71767053e+01 2.02487788e+02 4.71764924e+01 2.02487522e+02 4.71765614e+01 2.02485879e+02 4.71755349e+01 2.02485608e+02 4.71755016e+01 2.02485572e+02 4.71753433e+01 2.02485791e+02 4.71753659e+01 2.02485879e+02 4.71755349e+01 2.02479430e+02 4.71715035e+01 2.02479068e+02 4.71715514e+01 2.02479037e+02 4.71712581e+01 2.02479457e+02 4.71712638e+01 2.02479430e+02 4.71715035e+01 2.02511608e+02 4.71919071e+01 2.02511497e+02 4.71921371e+01 2.02511099e+02 4.71921239e+01 2.02511084e+02 4.71918791e+01 2.02511415e+02 4.71917866e+01 2.02511550e+02 4.71917903e+01 2.02511608e+02 4.71919071e+01 2.02485991e+02 4.71759038e+01 2.02485922e+02 4.71761600e+01 2.02485584e+02 4.71761696e+01 2.02485614e+02 4.71759676e+01 2.02485940e+02 4.71758721e+01 2.02485989e+02 4.71758707e+01 2.02485991e+02 4.71759038e+01 2.02484262e+02 4.71748237e+01 2.02484265e+02 4.71748675e+01 2.02484484e+02 4.71749620e+01 2.02484469e+02 4.71747168e+01 2.02484262e+02 4.71748237e+01 2.02482003e+02 4.71734110e+01 2.02481827e+02 4.71734160e+01 2.02481593e+02 4.71732639e+01 2.02481613e+02 4.71731673e+01 2.02481764e+02 4.71731374e+01 2.02481997e+02 4.71732905e+01 2.02482003e+02 4.71734110e+01 2.02480967e+02 4.71727640e+01 2.02480942e+02 4.71727691e+01 2.02480932e+02 4.71727418e+01 2.02481050e+02 4.71726888e+01 2.02480967e+02 4.71727640e+01 2.02480506e+02 4.71724753e+01 2.02480395e+02 4.71727051e+01 2.02480098e+02 4.71727420e+01 2.02480084e+02 4.71725109e+01 2.02480464e+02 4.71724490e+01 2.02480496e+02 4.71724480e+01 2.02480506e+02 4.71724753e+01 2.02480076e+02 4.71722065e+01 2.02479934e+02 4.71724173e+01 2.02479646e+02 4.71724255e+01 2.02479707e+02 4.71722751e+01 2.02479859e+02 4.71720710e+01 2.02480145e+02 4.71720566e+01 2.02480076e+02 4.71722065e+01 2.02507598e+02 4.71897025e+01 2.02507321e+02 4.71897105e+01 2.02507357e+02 4.71895520e+01 2.02507542e+02 4.71895467e+01 2.02507598e+02 4.71897025e+01 2.02506988e+02 4.71893211e+01 2.02506966e+02 4.71893217e+01 2.02506953e+02 4.71892993e+01 2.02506983e+02 4.71893092e+01 2.02506988e+02 4.71893211e+01 2.02482090e+02 4.71737646e+01 2.02481751e+02 4.71737980e+01 2.02481773e+02 4.71735667e+01 2.02482075e+02 4.71735581e+01 2.02482090e+02 4.71737646e+01 2.02480304e+02 4.71729476e+01 2.02480430e+02 4.71731478e+01 2.02480441e+02 4.71733324e+01 2.02480169e+02 4.71733401e+01 2.02480004e+02 4.71731368e+01 2.02479999e+02 4.71730563e+01 2.02480257e+02 4.71729179e+01 2.02480291e+02 4.71729252e+01 2.02480304e+02 4.71729476e+01 2.02513475e+02 4.71939703e+01 2.02513440e+02 4.71939731e+01 2.02513434e+02 4.71939448e+01 2.02513480e+02 4.71939434e+01 2.02513475e+02 4.71939703e+01 2.02482581e+02 4.71746700e+01 2.02482282e+02 4.71747068e+01 2.02482176e+02 4.71747163e+01 2.02482054e+02 4.71748753e+01 2.02482414e+02 4.71748651e+01 2.02482488e+02 4.71748795e+01 2.02482826e+02 4.71748234e+01 2.02482880e+02 4.71745897e+01 2.02482581e+02 4.71746700e+01 2.02478114e+02 4.71718776e+01 2.02477720e+02 4.71718970e+01 2.02477716e+02 4.71716289e+01 2.02478109e+02 4.71716095e+01 2.02478114e+02 4.71718776e+01 2.02511236e+02 4.71928715e+01 2.02510936e+02 4.71928956e+01 2.02510946e+02 4.71926901e+01 2.02511225e+02 4.71926821e+01 2.02511236e+02 4.71928715e+01 2.02507782e+02 4.71907145e+01 2.02507721e+02 4.71907163e+01 2.02507689e+02 4.71906562e+01 2.02507804e+02 4.71906551e+01 2.02507782e+02 4.71907145e+01 2.02479541e+02 4.71730688e+01 2.02479431e+02 4.71732356e+01 2.02479409e+02 4.71732858e+01 2.02479190e+02 4.71734479e+01 2.02479207e+02 4.71737261e+01 2.02479556e+02 4.71737938e+01 2.02479550e+02 4.71739721e+01 2.02479404e+02 4.71741802e+01 2.02479195e+02 4.71743488e+01 2.02478834e+02 4.71744222e+01 2.02478700e+02 4.71744260e+01 2.02478420e+02 4.71743076e+01 2.02478291e+02 4.71740826e+01 2.02478624e+02 4.71739915e+01 2.02478871e+02 4.71739746e+01 2.02479008e+02 4.71739327e+01 2.02479164e+02 4.71737578e+01 2.02478934e+02 4.71736028e+01 2.02478895e+02 4.71735626e+01 2.02478793e+02 4.71733813e+01 2.02478782e+02 4.71731927e+01 2.02478740e+02 4.71730954e+01 2.02478476e+02 4.71729649e+01 2.02478488e+02 4.71727099e+01 2.02478835e+02 4.71727000e+01 2.02479035e+02 4.71728770e+01 2.02479233e+02 4.71728764e+01 2.02479527e+02 4.71728393e+01 2.02479541e+02 4.71730688e+01 2.02482535e+02 4.71752395e+01 2.02482636e+02 4.71754208e+01 2.02482784e+02 4.71753953e+01 2.02482809e+02 4.71752931e+01 2.02482535e+02 4.71752395e+01 2.02479877e+02 4.71735782e+01 2.02479832e+02 4.71735897e+01 2.02479829e+02 4.71735483e+01 2.02479918e+02 4.71735262e+01 2.02479877e+02 4.71735782e+01 2.02477570e+02 4.71721358e+01 2.02477463e+02 4.71723681e+01 2.02477406e+02 4.71724548e+01 2.02477727e+02 4.71725426e+01 2.02477659e+02 4.71727901e+01 2.02477696e+02 4.71728914e+01 2.02477941e+02 4.71729663e+01 2.02478038e+02 4.71729635e+01 2.02478277e+02 4.71731126e+01 2.02478281e+02 4.71731786e+01 2.02478296e+02 4.71734238e+01 2.02478274e+02 4.71734740e+01 2.02478226e+02 4.71734754e+01 2.02477987e+02 4.71733263e+01 2.02477578e+02 4.71733379e+01 2.02477478e+02 4.71735746e+01 2.02477399e+02 4.71737610e+01 2.02477724e+02 4.71738462e+01 2.02478004e+02 4.71739644e+01 2.02477981e+02 4.71741879e+01 2.02477629e+02 4.71742418e+01 2.02477591e+02 4.71742434e+01 2.02477216e+02 4.71743084e+01 2.02477054e+02 4.71743419e+01 2.02476858e+02 4.71741615e+01 2.02476622e+02 4.71740101e+01 2.02476644e+02 4.71739506e+01 2.02476633e+02 4.71736765e+01 2.02476631e+02 4.71736435e+01 2.02476680e+02 4.71736421e+01 2.02477089e+02 4.71736305e+01 2.02477072e+02 4.71733523e+01 2.02476663e+02 4.71733640e+01 2.02476614e+02 4.71733653e+01 2.02476308e+02 4.71734415e+01 2.02475986e+02 4.71735391e+01 2.02475937e+02 4.71735404e+01 2.02475910e+02 4.71734916e+01 2.02476007e+02 4.71732529e+01 2.02476139e+02 4.71730661e+01 2.02476137e+02 4.71730351e+01 2.02476095e+02 4.71727732e+01 2.02475734e+02 4.71727835e+01 2.02475668e+02 4.71727633e+01 2.02475667e+02 4.71727413e+01 2.02475614e+02 4.71724781e+01 2.02475603e+02 4.71724023e+01 2.02475823e+02 4.71722404e+01 2.02475950e+02 4.71722294e+01 2.02476271e+02 4.71723176e+01 2.02476551e+02 4.71724365e+01 2.02476601e+02 4.71724276e+01 2.02476809e+02 4.71722584e+01 2.02477035e+02 4.71721010e+01 2.02477122e+02 4.71720144e+01 2.02476933e+02 4.71718284e+01 2.02476942e+02 4.71717431e+01 2.02477132e+02 4.71716810e+01 2.02477294e+02 4.71718868e+01 2.02477562e+02 4.71720140e+01 2.02477570e+02 4.71721358e+01 2.02473232e+02 4.71694238e+01 2.02473143e+02 4.71694244e+01 2.02472812e+02 4.71693439e+01 2.02472878e+02 4.71692022e+01 2.02473125e+02 4.71691124e+01 2.02473226e+02 4.71693636e+01 2.02473232e+02 4.71694238e+01 2.02506502e+02 4.71905133e+01 2.02506538e+02 4.71906145e+01 2.02506784e+02 4.71906893e+01 2.02506769e+02 4.71904442e+01 2.02506502e+02 4.71905133e+01 2.02473551e+02 4.71699226e+01 2.02473342e+02 4.71699286e+01 2.02473232e+02 4.71697229e+01 2.02473542e+02 4.71697804e+01 2.02473551e+02 4.71699226e+01 2.02514387e+02 4.71957357e+01 2.02514114e+02 4.71957528e+01 2.02513982e+02 4.71955249e+01 2.02513972e+02 4.71954770e+01 2.02514043e+02 4.71954797e+01 2.02514366e+02 4.71955670e+01 2.02514387e+02 4.71957357e+01 2.02510710e+02 4.71934401e+01 2.02510637e+02 4.71934422e+01 2.02510634e+02 4.71933925e+01 2.02510689e+02 4.71934037e+01 2.02510710e+02 4.71934401e+01 2.02472629e+02 4.71696447e+01 2.02472371e+02 4.71696702e+01 2.02472442e+02 4.71695282e+01 2.02472638e+02 4.71694725e+01 2.02472629e+02 4.71696447e+01 2.02512536e+02 4.71948796e+01 2.02512296e+02 4.71950285e+01 2.02512001e+02 4.71950370e+01 2.02511973e+02 4.71948268e+01 2.02512154e+02 4.71946405e+01 2.02512522e+02 4.71946517e+01 2.02512536e+02 4.71948796e+01 2.02511531e+02 4.71942518e+01 2.02511223e+02 4.71943104e+01 2.02511265e+02 4.71940859e+01 2.02511498e+02 4.71941073e+01 2.02511531e+02 4.71942518e+01 2.02510406e+02 4.71935491e+01 2.02510020e+02 4.71936074e+01 2.02509948e+02 4.71936260e+01 2.02509684e+02 4.71936968e+01 2.02509439e+02 4.71938429e+01 2.02509182e+02 4.71938672e+01 2.02509130e+02 4.71936497e+01 2.02509389e+02 4.71935126e+01 2.02509731e+02 4.71934268e+01 2.02509779e+02 4.71934254e+01 2.02510061e+02 4.71933337e+01 2.02510390e+02 4.71932992e+01 2.02510406e+02 4.71935491e+01 2.02473502e+02 4.71704903e+01 2.02473451e+02 4.71704984e+01 2.02473340e+02 4.71703891e+01 2.02473510e+02 4.71704549e+01 2.02473502e+02 4.71704903e+01 2.02517253e+02 4.71981234e+01 2.02516998e+02 4.71981768e+01 2.02517007e+02 4.71979699e+01 2.02517282e+02 4.71979675e+01 2.02517253e+02 4.71981234e+01 2.02511720e+02 4.71946690e+01 2.02511615e+02 4.71946721e+01 2.02511610e+02 4.71946002e+01 2.02511732e+02 4.71945853e+01 2.02511720e+02 4.71946690e+01 2.02499308e+02 4.71869174e+01 2.02499192e+02 4.71871437e+01 2.02498964e+02 4.71873004e+01 2.02499026e+02 4.71873823e+01 2.02499152e+02 4.71874178e+01 2.02499504e+02 4.71873390e+01 2.02499520e+02 4.71870495e+01 2.02499554e+02 4.71869922e+01 2.02499308e+02 4.71869174e+01 2.02514087e+02 4.71964456e+01 2.02514034e+02 4.71964631e+01 2.02514058e+02 4.71964276e+01 2.02514083e+02 4.71964269e+01 2.02514087e+02 4.71964456e+01 2.02497751e+02 4.71862441e+01 2.02497568e+02 4.71864288e+01 2.02497225e+02 4.71864364e+01 2.02497007e+02 4.71862717e+01 2.02496788e+02 4.71862402e+01 2.02496734e+02 4.71864739e+01 2.02496761e+02 4.71865227e+01 2.02496776e+02 4.71867679e+01 2.02496775e+02 4.71868304e+01 2.02496874e+02 4.71870209e+01 2.02496980e+02 4.71869589e+01 2.02497386e+02 4.71869677e+01 2.02497469e+02 4.71872322e+01 2.02497807e+02 4.71871760e+01 2.02497861e+02 4.71869423e+01 2.02497470e+02 4.71869061e+01 2.02497432e+02 4.71866426e+01 2.02497646e+02 4.71864771e+01 2.02497908e+02 4.71863419e+01 2.02497889e+02 4.71862708e+01 2.02497751e+02 4.71862441e+01 2.02482056e+02 4.71764362e+01 2.02481790e+02 4.71765690e+01 2.02481477e+02 4.71766724e+01 2.02481621e+02 4.71768217e+01 2.02481758e+02 4.71768485e+01 2.02481978e+02 4.71766864e+01 2.02482255e+02 4.71766785e+01 2.02482529e+02 4.71767321e+01 2.02482514e+02 4.71764869e+01 2.02482163e+02 4.71764212e+01 2.02482056e+02 4.71764362e+01 2.02473797e+02 4.71712730e+01 2.02473758e+02 4.71715477e+01 2.02473494e+02 4.71716821e+01 2.02473275e+02 4.71718442e+01 2.02473212e+02 4.71719762e+01 2.02473150e+02 4.71720655e+01 2.02472967e+02 4.71722500e+01 2.02472941e+02 4.71725015e+01 2.02472943e+02 4.71725345e+01 2.02472961e+02 4.71728127e+01 2.02473347e+02 4.71728523e+01 2.02473378e+02 4.71731054e+01 2.02472963e+02 4.71731365e+01 2.02472922e+02 4.71728413e+01 2.02472535e+02 4.71728773e+01 2.02472429e+02 4.71728803e+01 2.02472039e+02 4.71728664e+01 2.02472006e+02 4.71728673e+01 2.02471622e+02 4.71728263e+01 2.02471522e+02 4.71725749e+01 2.02471277e+02 4.71724302e+01 2.02470967e+02 4.71723341e+01 2.02470806e+02 4.71721276e+01 2.02470804e+02 4.71720946e+01 2.02470932e+02 4.71718754e+01 2.02471156e+02 4.71718691e+01 2.02471481e+02 4.71719196e+01 2.02471464e+02 4.71716414e+01 2.02471326e+02 4.71715230e+01 2.02471581e+02 4.71715554e+01 2.02471726e+02 4.71714744e+01 2.02471982e+02 4.71713348e+01 2.02472294e+02 4.71713533e+01 2.02472597e+02 4.71714203e+01 2.02472492e+02 4.71712071e+01 2.02472508e+02 4.71710657e+01 2.02472690e+02 4.71710606e+01 2.02472863e+02 4.71712579e+01 2.02473276e+02 4.71712462e+01 2.02473234e+02 4.71709843e+01 2.02473255e+02 4.71709340e+01 2.02473297e+02 4.71709374e+01 2.02473524e+02 4.71710949e+01 2.02473802e+02 4.71712152e+01 2.02473797e+02 4.71712730e+01 2.02512789e+02 4.71959344e+01 2.02512526e+02 4.71959509e+01 2.02512357e+02 4.71957505e+01 2.02512337e+02 4.71956520e+01 2.02512483e+02 4.71956574e+01 2.02512778e+02 4.71957643e+01 2.02512789e+02 4.71959344e+01 2.02500824e+02 4.71884625e+01 2.02500639e+02 4.71884678e+01 2.02500423e+02 4.71885111e+01 2.02500468e+02 4.71885940e+01 2.02500704e+02 4.71887454e+01 2.02500794e+02 4.71887428e+01 2.02501032e+02 4.71885923e+01 2.02501027e+02 4.71885067e+01 2.02500824e+02 4.71884625e+01 2.02499585e+02 4.71876888e+01 2.02499341e+02 4.71878351e+01 2.02499467e+02 4.71880327e+01 2.02499620e+02 4.71880093e+01 2.02499798e+02 4.71878218e+01 2.02499785e+02 4.71877975e+01 2.02499585e+02 4.71876888e+01 2.02516057e+02 4.71982736e+01 2.02515989e+02 4.71982725e+01 2.02515986e+02 4.71982295e+01 2.02516049e+02 4.71982277e+01 2.02516057e+02 4.71982736e+01 2.02513941e+02 4.71969528e+01 2.02513785e+02 4.71969726e+01 2.02513793e+02 4.71968602e+01 2.02513944e+02 4.71968550e+01 2.02513941e+02 4.71969528e+01 2.02509608e+02 4.71945461e+01 2.02509583e+02 4.71945468e+01 2.02509578e+02 4.71945277e+01 2.02509618e+02 4.71945210e+01 2.02509608e+02 4.71945461e+01 2.02495694e+02 4.71858558e+01 2.02495396e+02 4.71858356e+01 2.02495192e+02 4.71858414e+01 2.02494939e+02 4.71858487e+01 2.02494733e+02 4.71856755e+01 2.02494457e+02 4.71855535e+01 2.02494136e+02 4.71854660e+01 2.02494106e+02 4.71854624e+01 2.02493692e+02 4.71855029e+01 2.02493775e+02 4.71857328e+01 2.02493991e+02 4.71858982e+01 2.02493997e+02 4.71859925e+01 2.02493792e+02 4.71860456e+01 2.02493553e+02 4.71858965e+01 2.02493404e+02 4.71859213e+01 2.02493409e+02 4.71860030e+01 2.02493619e+02 4.71861733e+01 2.02493631e+02 4.71863619e+01 2.02493318e+02 4.71864653e+01 2.02493258e+02 4.71864406e+01 2.02493013e+02 4.71862961e+01 2.02492774e+02 4.71861471e+01 2.02492418e+02 4.71860848e+01 2.02492248e+02 4.71860965e+01 2.02492032e+02 4.71860448e+01 2.02491938e+02 4.71859028e+01 2.02492028e+02 4.71857229e+01 2.02492049e+02 4.71856727e+01 2.02492032e+02 4.71853945e+01 2.02492004e+02 4.71853457e+01 2.02491860e+02 4.71851963e+01 2.02491719e+02 4.71851677e+01 2.02491751e+02 4.71852769e+01 2.02491718e+02 4.71854659e+01 2.02491696e+02 4.71856425e+01 2.02491751e+02 4.71857858e+01 2.02491570e+02 4.71857361e+01 2.02491210e+02 4.71856768e+01 2.02491096e+02 4.71856755e+01 2.02490751e+02 4.71857593e+01 2.02490677e+02 4.71857449e+01 2.02490650e+02 4.71856961e+01 2.02490520e+02 4.71855361e+01 2.02490368e+02 4.71855200e+01 2.02490136e+02 4.71856742e+01 2.02490047e+02 4.71858857e+01 2.02490285e+02 4.71860347e+01 2.02490695e+02 4.71860231e+01 2.02490766e+02 4.71860045e+01 2.02490982e+02 4.71861707e+01 2.02490984e+02 4.71862037e+01 2.02491001e+02 4.71864819e+01 2.02491349e+02 4.71865499e+01 2.02491478e+02 4.71867800e+01 2.02491505e+02 4.71868288e+01 2.02491520e+02 4.71870739e+01 2.02491881e+02 4.71870636e+01 2.02491975e+02 4.71868232e+01 2.02491999e+02 4.71867202e+01 2.02492060e+02 4.71865768e+01 2.02492176e+02 4.71865892e+01 2.02492437e+02 4.71867219e+01 2.02492771e+02 4.71868005e+01 2.02492936e+02 4.71870036e+01 2.02493130e+02 4.71871858e+01 2.02493486e+02 4.71871687e+01 2.02493481e+02 4.71869263e+01 2.02493499e+02 4.71868781e+01 2.02493571e+02 4.71868595e+01 2.02493787e+02 4.71870254e+01 2.02494187e+02 4.71870553e+01 2.02494287e+02 4.71873066e+01 2.02494502e+02 4.71874729e+01 2.02494911e+02 4.71874612e+01 2.02494829e+02 4.71872313e+01 2.02494773e+02 4.71870755e+01 2.02494713e+02 4.71869915e+01 2.02494491e+02 4.71868994e+01 2.02494417e+02 4.71868849e+01 2.02494105e+02 4.71867904e+01 2.02494026e+02 4.71866088e+01 2.02494040e+02 4.71865129e+01 2.02494028e+02 4.71863107e+01 2.02494258e+02 4.71863517e+01 2.02494624e+02 4.71863839e+01 2.02494687e+02 4.71863600e+01 2.02495048e+02 4.71863497e+01 2.02495122e+02 4.71863641e+01 2.02495124e+02 4.71863972e+01 2.02495206e+02 4.71866270e+01 2.02495550e+02 4.71866636e+01 2.02495599e+02 4.71866622e+01 2.02495837e+02 4.71868113e+01 2.02496140e+02 4.71867329e+01 2.02496164e+02 4.71865697e+01 2.02496108e+02 4.71864139e+01 2.02496421e+02 4.71863104e+01 2.02496268e+02 4.71861675e+01 2.02496038e+02 4.71860121e+01 2.02495788e+02 4.71858717e+01 2.02495694e+02 4.71858558e+01 2.02486232e+02 4.71799437e+01 2.02486090e+02 4.71801542e+01 2.02486133e+02 4.71803193e+01 2.02486189e+02 4.71805155e+01 2.02485854e+02 4.71805250e+01 2.02485775e+02 4.71805555e+01 2.02485709e+02 4.71806324e+01 2.02485721e+02 4.71808210e+01 2.02485776e+02 4.71809081e+01 2.02485877e+02 4.71809188e+01 2.02486215e+02 4.71809092e+01 2.02486335e+02 4.71809058e+01 2.02486673e+02 4.71808961e+01 2.02486819e+02 4.71809088e+01 2.02487063e+02 4.71809332e+01 2.02487295e+02 4.71809071e+01 2.02487267e+02 4.71807825e+01 2.02486975e+02 4.71807073e+01 2.02486903e+02 4.71807258e+01 2.02486594e+02 4.71806292e+01 2.02486297e+02 4.71805235e+01 2.02486321e+02 4.71802988e+01 2.02486531e+02 4.71801307e+01 2.02486576e+02 4.71799918e+01 2.02486232e+02 4.71799437e+01 2.02512394e+02 4.71965852e+01 2.02512097e+02 4.71965938e+01 2.02512084e+02 4.71963916e+01 2.02512382e+02 4.71963831e+01 2.02512394e+02 4.71965852e+01 2.02491865e+02 4.71837628e+01 2.02491942e+02 4.71838341e+01 2.02492023e+02 4.71838615e+01 2.02492002e+02 4.71837896e+01 2.02491865e+02 4.71837628e+01 2.02488882e+02 4.71818992e+01 2.02488842e+02 4.71818953e+01 2.02488832e+02 4.71818681e+01 2.02488904e+02 4.71818495e+01 2.02488882e+02 4.71818992e+01 2.02488546e+02 4.71816890e+01 2.02488229e+02 4.71816980e+01 2.02488216e+02 4.71814826e+01 2.02488564e+02 4.71814502e+01 2.02488546e+02 4.71816890e+01 2.02478439e+02 4.71753719e+01 2.02478295e+02 4.71753760e+01 2.02478289e+02 4.71752784e+01 2.02478455e+02 4.71752577e+01 2.02478439e+02 4.71753719e+01 2.02477787e+02 4.71749644e+01 2.02477522e+02 4.71749719e+01 2.02477221e+02 4.71748690e+01 2.02477204e+02 4.71746000e+01 2.02477572e+02 4.71746093e+01 2.02477776e+02 4.71747840e+01 2.02477787e+02 4.71749644e+01 2.02475590e+02 4.71735906e+01 2.02475423e+02 4.71735953e+01 2.02475241e+02 4.71734044e+01 2.02475247e+02 4.71733766e+01 2.02475288e+02 4.71733700e+01 2.02475627e+02 4.71734446e+01 2.02475590e+02 4.71735906e+01 2.02474139e+02 4.71726836e+01 2.02474023e+02 4.71726779e+01 2.02473998e+02 4.71725955e+01 2.02474134e+02 4.71725963e+01 2.02474139e+02 4.71726836e+01 2.02471900e+02 4.71712838e+01 2.02471535e+02 4.71712642e+01 2.02471537e+02 4.71710570e+01 2.02471841e+02 4.71710377e+01 2.02471900e+02 4.71712838e+01 2.02489935e+02 4.71831551e+01 2.02489776e+02 4.71831573e+01 2.02489743e+02 4.71830351e+01 2.02489988e+02 4.71830010e+01 2.02489935e+02 4.71831551e+01 2.02511444e+02 4.71968889e+01 2.02511276e+02 4.71968751e+01 2.02511258e+02 4.71967730e+01 2.02511434e+02 4.71967582e+01 2.02511444e+02 4.71968889e+01 2.02495645e+02 4.71870222e+01 2.02495551e+02 4.71872626e+01 2.02495207e+02 4.71873465e+01 2.02495222e+02 4.71875916e+01 2.02495460e+02 4.71877406e+01 2.02495696e+02 4.71876521e+01 2.02495947e+02 4.71875095e+01 2.02495910e+02 4.71874082e+01 2.02495896e+02 4.71871788e+01 2.02495868e+02 4.71871141e+01 2.02495645e+02 4.71870222e+01 2.02490844e+02 4.71840221e+01 2.02490726e+02 4.71842481e+01 2.02490476e+02 4.71842670e+01 2.02490496e+02 4.71841044e+01 2.02490808e+02 4.71839999e+01 2.02490842e+02 4.71839965e+01 2.02490844e+02 4.71840221e+01 2.02484547e+02 4.71800876e+01 2.02484605e+02 4.71801469e+01 2.02484569e+02 4.71804002e+01 2.02484262e+02 4.71804008e+01 2.02484111e+02 4.71804133e+01 2.02483901e+02 4.71805809e+01 2.02483543e+02 4.71806065e+01 2.02483561e+02 4.71803685e+01 2.02483556e+02 4.71802722e+01 2.02483497e+02 4.71800295e+01 2.02483876e+02 4.71800350e+01 2.02484076e+02 4.71800925e+01 2.02484313e+02 4.71799413e+01 2.02484530e+02 4.71798770e+01 2.02484547e+02 4.71800876e+01 2.02483144e+02 4.71792107e+01 2.02483105e+02 4.71793039e+01 2.02483379e+02 4.71793574e+01 2.02483230e+02 4.71792116e+01 2.02483144e+02 4.71792107e+01 2.02478632e+02 4.71763902e+01 2.02478487e+02 4.71765354e+01 2.02478723e+02 4.71764469e+01 2.02478746e+02 4.71763439e+01 2.02478632e+02 4.71763902e+01 2.02475892e+02 4.71746772e+01 2.02475709e+02 4.71748623e+01 2.02475385e+02 4.71749588e+01 2.02475468e+02 4.71751887e+01 2.02475524e+02 4.71753446e+01 2.02475560e+02 4.71754458e+01 2.02475711e+02 4.71754620e+01 2.02475790e+02 4.71752756e+01 2.02475812e+02 4.71752254e+01 2.02476031e+02 4.71750633e+01 2.02476250e+02 4.71749012e+01 2.02476233e+02 4.71746230e+01 2.02475892e+02 4.71746772e+01 2.02474029e+02 4.71735127e+01 2.02473808e+02 4.71734875e+01 2.02473753e+02 4.71733398e+01 2.02473953e+02 4.71733807e+01 2.02474029e+02 4.71735127e+01 2.02512013e+02 4.71975435e+01 2.02511674e+02 4.71976311e+01 2.02511570e+02 4.71976340e+01 2.02511591e+02 4.71975791e+01 2.02511637e+02 4.71973086e+01 2.02511978e+02 4.71973327e+01 2.02512013e+02 4.71975435e+01 2.02496236e+02 4.71876902e+01 2.02496272e+02 4.71877914e+01 2.02496518e+02 4.71878663e+01 2.02496364e+02 4.71877233e+01 2.02496236e+02 4.71876902e+01 2.02489939e+02 4.71837561e+01 2.02489798e+02 4.71837922e+01 2.02489790e+02 4.71836627e+01 2.02489944e+02 4.71836839e+01 2.02489939e+02 4.71837561e+01 2.02474798e+02 4.71742923e+01 2.02474504e+02 4.71742743e+01 2.02474450e+02 4.71740747e+01 2.02474787e+02 4.71740651e+01 2.02474798e+02 4.71742923e+01 2.02470727e+02 4.71717473e+01 2.02470429e+02 4.71717557e+01 2.02470208e+02 4.71717215e+01 2.02469984e+02 4.71717594e+01 2.02469829e+02 4.71715488e+01 2.02469857e+02 4.71715025e+01 2.02469978e+02 4.71714387e+01 2.02470135e+02 4.71713771e+01 2.02470511e+02 4.71713699e+01 2.02470715e+02 4.71715447e+01 2.02470727e+02 4.71717473e+01 2.02492677e+02 4.71857657e+01 2.02492684e+02 4.71858883e+01 2.02492865e+02 4.71858832e+01 2.02492814e+02 4.71857925e+01 2.02492677e+02 4.71857657e+01 2.02487918e+02 4.71827924e+01 2.02487568e+02 4.71828726e+01 2.02487476e+02 4.71829051e+01 2.02487516e+02 4.71828405e+01 2.02487636e+02 4.71826159e+01 2.02487905e+02 4.71825880e+01 2.02487918e+02 4.71827924e+01 2.02477557e+02 4.71763164e+01 2.02477460e+02 4.71763191e+01 2.02477481e+02 4.71762689e+01 2.02477553e+02 4.71762503e+01 2.02477557e+02 4.71763164e+01 2.02512085e+02 4.71981862e+01 2.02511689e+02 4.71981976e+01 2.02511672e+02 4.71979286e+01 2.02512040e+02 4.71979378e+01 2.02512085e+02 4.71981862e+01 2.02488070e+02 4.71831863e+01 2.02487999e+02 4.71834411e+01 2.02487745e+02 4.71835816e+01 2.02487372e+02 4.71836477e+01 2.02487351e+02 4.71836485e+01 2.02487354e+02 4.71836365e+01 2.02487416e+02 4.71833762e+01 2.02487538e+02 4.71831849e+01 2.02487511e+02 4.71831361e+01 2.02487577e+02 4.71831563e+01 2.02488002e+02 4.71831441e+01 2.02488066e+02 4.71831203e+01 2.02488070e+02 4.71831863e+01 2.02473085e+02 4.71738201e+01 2.02472911e+02 4.71738251e+01 2.02472920e+02 4.71737170e+01 2.02473092e+02 4.71736918e+01 2.02473085e+02 4.71738201e+01 2.02472433e+02 4.71734119e+01 2.02472111e+02 4.71734405e+01 2.02472156e+02 4.71732387e+01 2.02472420e+02 4.71732120e+01 2.02472433e+02 4.71734119e+01 2.02494743e+02 4.71876549e+01 2.02494895e+02 4.71878332e+01 2.02494941e+02 4.71880777e+01 2.02494736e+02 4.71882487e+01 2.02494713e+02 4.71882934e+01 2.02494944e+02 4.71883788e+01 2.02495163e+02 4.71882167e+01 2.02495148e+02 4.71879716e+01 2.02495169e+02 4.71879214e+01 2.02495152e+02 4.71876432e+01 2.02494743e+02 4.71876549e+01 2.02470125e+02 4.71722684e+01 2.02469720e+02 4.71723143e+01 2.02469651e+02 4.71725705e+01 2.02469314e+02 4.71725801e+01 2.02469191e+02 4.71723459e+01 2.02469227e+02 4.71723053e+01 2.02469260e+02 4.71722943e+01 2.02469670e+02 4.71722827e+01 2.02469673e+02 4.71719896e+01 2.02469675e+02 4.71719868e+01 2.02469682e+02 4.71719824e+01 2.02470097e+02 4.71720016e+01 2.02470125e+02 4.71722684e+01 2.02513895e+02 4.71999148e+01 2.02513769e+02 4.71999139e+01 2.02513781e+02 4.71998436e+01 2.02513858e+02 4.71998483e+01 2.02513895e+02 4.71999148e+01 2.02502278e+02 4.71926605e+01 2.02502314e+02 4.71927618e+01 2.02502434e+02 4.71927584e+01 2.02502406e+02 4.71926937e+01 2.02502278e+02 4.71926605e+01 2.02493590e+02 4.71872335e+01 2.02493478e+02 4.71874629e+01 2.02493367e+02 4.71876612e+01 2.02493670e+02 4.71875828e+01 2.02493963e+02 4.71875457e+01 2.02494209e+02 4.71876206e+01 2.02494194e+02 4.71873754e+01 2.02493806e+02 4.71873366e+01 2.02493590e+02 4.71872335e+01 2.02470904e+02 4.71730545e+01 2.02470864e+02 4.71730612e+01 2.02470862e+02 4.71730281e+01 2.02470933e+02 4.71730096e+01 2.02470904e+02 4.71730545e+01 2.02495761e+02 4.71888892e+01 2.02495906e+02 4.71890385e+01 2.02496101e+02 4.71892195e+01 2.02496328e+02 4.71893772e+01 2.02496492e+02 4.71895814e+01 2.02496496e+02 4.71896475e+01 2.02496626e+02 4.71898075e+01 2.02496872e+02 4.71898823e+01 2.02496946e+02 4.71898967e+01 2.02497355e+02 4.71898850e+01 2.02497240e+02 4.71896793e+01 2.02497099e+02 4.71894578e+01 2.02496722e+02 4.71894111e+01 2.02496482e+02 4.71892633e+01 2.02496245e+02 4.71891131e+01 2.02496122e+02 4.71888789e+01 2.02495761e+02 4.71888892e+01 2.02481852e+02 4.71801980e+01 2.02481559e+02 4.71801213e+01 2.02481453e+02 4.71799487e+01 2.02481744e+02 4.71799846e+01 2.02481852e+02 4.71801980e+01 2.02513194e+02 4.72003740e+01 2.02513122e+02 4.72003926e+01 2.02513118e+02 4.72003266e+01 2.02513192e+02 4.72003410e+01 2.02513194e+02 4.72003740e+01 2.02488781e+02 4.71851263e+01 2.02488658e+02 4.71852854e+01 2.02488873e+02 4.71854516e+01 2.02489211e+02 4.71853955e+01 2.02489203e+02 4.71852080e+01 2.02488842e+02 4.71851492e+01 2.02488781e+02 4.71851263e+01 2.02487973e+02 4.71846217e+01 2.02487880e+02 4.71848628e+01 2.02487888e+02 4.71848781e+01 2.02487863e+02 4.71851512e+01 2.02487784e+02 4.71852804e+01 2.02488023e+02 4.71854294e+01 2.02488367e+02 4.71854661e+01 2.02488350e+02 4.71851879e+01 2.02488348e+02 4.71851549e+01 2.02488404e+02 4.71848909e+01 2.02488440e+02 4.71847957e+01 2.02488213e+02 4.71846380e+01 2.02487973e+02 4.71846217e+01 2.02472870e+02 4.71751817e+01 2.02472817e+02 4.71751960e+01 2.02472833e+02 4.71751586e+01 2.02472863e+02 4.71751619e+01 2.02472870e+02 4.71751817e+01 2.02471190e+02 4.71741309e+01 2.02471178e+02 4.71741302e+01 2.02471177e+02 4.71741233e+01 2.02471189e+02 4.71741216e+01 2.02471190e+02 4.71741309e+01 2.02491729e+02 4.71872679e+01 2.02491798e+02 4.71875194e+01 2.02492103e+02 4.71876193e+01 2.02492378e+02 4.71876729e+01 2.02492235e+02 4.71875220e+01 2.02492155e+02 4.71872558e+01 2.02491729e+02 4.71872679e+01 2.02490809e+02 4.71866928e+01 2.02490910e+02 4.71868741e+01 2.02491091e+02 4.71868690e+01 2.02491083e+02 4.71867464e+01 2.02490809e+02 4.71866928e+01 2.02490139e+02 4.71862743e+01 2.02490085e+02 4.71865080e+01 2.02490347e+02 4.71866399e+01 2.02490708e+02 4.71866296e+01 2.02490693e+02 4.71863844e+01 2.02490477e+02 4.71862182e+01 2.02490139e+02 4.71862743e+01 2.02474978e+02 4.71767989e+01 2.02474766e+02 4.71769656e+01 2.02474740e+02 4.71770277e+01 2.02474860e+02 4.71770243e+01 2.02475119e+02 4.71768871e+01 2.02475195e+02 4.71766915e+01 2.02474978e+02 4.71767989e+01 2.02506716e+02 4.71969280e+01 2.02506730e+02 4.71969817e+01 2.02506820e+02 4.71969928e+01 2.02506798e+02 4.71969318e+01 2.02506716e+02 4.71969280e+01 2.02486580e+02 4.71843497e+01 2.02486290e+02 4.71844674e+01 2.02486307e+02 4.71847455e+01 2.02486610e+02 4.71846672e+01 2.02486936e+02 4.71845718e+01 2.02486853e+02 4.71843419e+01 2.02486580e+02 4.71843497e+01 2.02470795e+02 4.71744824e+01 2.02470698e+02 4.71744851e+01 2.02470719e+02 4.71744349e+01 2.02470756e+02 4.71744421e+01 2.02470795e+02 4.71744824e+01 2.02509838e+02 4.71991763e+01 2.02509836e+02 4.71992422e+01 2.02509923e+02 4.71992292e+01 2.02510058e+02 4.71990779e+01 2.02509838e+02 4.71991763e+01 2.02485813e+02 4.71841693e+01 2.02485830e+02 4.71844474e+01 2.02486239e+02 4.71844358e+01 2.02486103e+02 4.71842453e+01 2.02485813e+02 4.71841693e+01 2.02470911e+02 4.71748540e+01 2.02470628e+02 4.71748621e+01 2.02470616e+02 4.71746697e+01 2.02470899e+02 4.71746617e+01 2.02470911e+02 4.71748540e+01 2.02506430e+02 4.71973476e+01 2.02506202e+02 4.71975040e+01 2.02506213e+02 4.71976895e+01 2.02506379e+02 4.71978925e+01 2.02506414e+02 4.71979356e+01 2.02506289e+02 4.71981565e+01 2.02506296e+02 4.71982790e+01 2.02506571e+02 4.71983326e+01 2.02506790e+02 4.71981704e+01 2.02506884e+02 4.71979300e+01 2.02506890e+02 4.71978398e+01 2.02506966e+02 4.71976823e+01 2.02506934e+02 4.71974824e+01 2.02506680e+02 4.71973446e+01 2.02506430e+02 4.71973476e+01 2.02490961e+02 4.71876850e+01 2.02490683e+02 4.71876930e+01 2.02490671e+02 4.71875044e+01 2.02490949e+02 4.71874964e+01 2.02490961e+02 4.71876850e+01 2.02496816e+02 4.71916424e+01 2.02496631e+02 4.71918256e+01 2.02496534e+02 4.71918284e+01 2.02496530e+02 4.71917624e+01 2.02496774e+02 4.71916161e+01 2.02496815e+02 4.71916204e+01 2.02496816e+02 4.71916424e+01 2.02491348e+02 4.71882263e+01 2.02491304e+02 4.71882101e+01 2.02491294e+02 4.71881925e+01 2.02491347e+02 4.71881781e+01 2.02491348e+02 4.71882263e+01 2.02485638e+02 4.71846584e+01 2.02485795e+02 4.71847985e+01 2.02486014e+02 4.71848932e+01 2.02485999e+02 4.71846481e+01 2.02485638e+02 4.71846584e+01 2.02483824e+02 4.71835246e+01 2.02483485e+02 4.71836122e+01 2.02483413e+02 4.71836308e+01 2.02483053e+02 4.71836410e+01 2.02482987e+02 4.71836209e+01 2.02482561e+02 4.71836330e+01 2.02482498e+02 4.71836569e+01 2.02482137e+02 4.71836671e+01 2.02482040e+02 4.71836699e+01 2.02481686e+02 4.71836060e+01 2.02481582e+02 4.71836192e+01 2.02481188e+02 4.71836721e+01 2.02481002e+02 4.71838553e+01 2.02480908e+02 4.71840957e+01 2.02480798e+02 4.71842625e+01 2.02481018e+02 4.71841642e+01 2.02481284e+02 4.71840315e+01 2.02481561e+02 4.71840236e+01 2.02481742e+02 4.71840184e+01 2.02481930e+02 4.71838367e+01 2.02482267e+02 4.71838271e+01 2.02482441e+02 4.71840240e+01 2.02482785e+02 4.71840721e+01 2.02483004e+02 4.71839100e+01 2.02483068e+02 4.71838862e+01 2.02483428e+02 4.71838759e+01 2.02483502e+02 4.71838903e+01 2.02483912e+02 4.71838787e+01 2.02483983e+02 4.71838601e+01 2.02484250e+02 4.71837911e+01 2.02484329e+02 4.71836047e+01 2.02484004e+02 4.71835195e+01 2.02483824e+02 4.71835246e+01 2.02507130e+02 4.71983827e+01 2.02507033e+02 4.71983855e+01 2.02506672e+02 4.71983958e+01 2.02506663e+02 4.71986592e+01 2.02506895e+02 4.71988129e+01 2.02507265e+02 4.71987661e+01 2.02507506e+02 4.71986175e+01 2.02507322e+02 4.71984970e+01 2.02507130e+02 4.71983827e+01 2.02497202e+02 4.71921824e+01 2.02496991e+02 4.71921412e+01 2.02496913e+02 4.71920018e+01 2.02497146e+02 4.71920266e+01 2.02497202e+02 4.71921824e+01 2.02492681e+02 4.71893580e+01 2.02492389e+02 4.71894746e+01 2.02492228e+02 4.71894792e+01 2.02491924e+02 4.71893790e+01 2.02491911e+02 4.71891764e+01 2.02492229e+02 4.71891532e+01 2.02492347e+02 4.71891493e+01 2.02492668e+02 4.71891541e+01 2.02492681e+02 4.71893580e+01 2.02490533e+02 4.71880160e+01 2.02490235e+02 4.71880245e+01 2.02490247e+02 4.71878377e+01 2.02490555e+02 4.71877878e+01 2.02490533e+02 4.71880160e+01 2.02487063e+02 4.71858481e+01 2.02486891e+02 4.71860395e+01 2.02486730e+02 4.71860599e+01 2.02486674e+02 4.71859040e+01 2.02487012e+02 4.71858164e+01 2.02486930e+02 4.71855866e+01 2.02486586e+02 4.71855499e+01 2.02486514e+02 4.71855685e+01 2.02486544e+02 4.71855236e+01 2.02486475e+02 4.71852721e+01 2.02486166e+02 4.71851753e+01 2.02485994e+02 4.71851802e+01 2.02486002e+02 4.71852967e+01 2.02485961e+02 4.71854584e+01 2.02485776e+02 4.71854636e+01 2.02485505e+02 4.71853387e+01 2.02485300e+02 4.71853446e+01 2.02484974e+02 4.71854400e+01 2.02484755e+02 4.71856022e+01 2.02484772e+02 4.71858803e+01 2.02485078e+02 4.71858042e+01 2.02485267e+02 4.71856235e+01 2.02485571e+02 4.71856148e+01 2.02485826e+02 4.71857519e+01 2.02485840e+02 4.71859813e+01 2.02485730e+02 4.71861482e+01 2.02485734e+02 4.71862142e+01 2.02485489e+02 4.71863605e+01 2.02485507e+02 4.71866387e+01 2.02485916e+02 4.71866270e+01 2.02485988e+02 4.71866084e+01 2.02486254e+02 4.71865394e+01 2.02486488e+02 4.71865642e+01 2.02486832e+02 4.71866009e+01 2.02486880e+02 4.71865995e+01 2.02487289e+02 4.71865878e+01 2.02487521e+02 4.71864336e+01 2.02487581e+02 4.71864071e+01 2.02487801e+02 4.71863092e+01 2.02487811e+02 4.71862368e+01 2.02487549e+02 4.71861048e+01 2.02487355e+02 4.71859233e+01 2.02487063e+02 4.71858481e+01 2.02484320e+02 4.71841339e+01 2.02484356e+02 4.71842352e+01 2.02484461e+02 4.71842220e+01 2.02484500e+02 4.71841288e+01 2.02484320e+02 4.71841339e+01 2.02494741e+02 4.71909445e+01 2.02494668e+02 4.71909301e+01 2.02494665e+02 4.71908971e+01 2.02494737e+02 4.71908785e+01 2.02494741e+02 4.71909445e+01 2.02503325e+02 4.71966049e+01 2.02503277e+02 4.71966063e+01 2.02503249e+02 4.71965575e+01 2.02503323e+02 4.71965719e+01 2.02503325e+02 4.71966049e+01 2.02492421e+02 4.71897939e+01 2.02492236e+02 4.71897992e+01 2.02492228e+02 4.71896734e+01 2.02492413e+02 4.71896681e+01 2.02492421e+02 4.71897939e+01 2.02486224e+02 4.71859220e+01 2.02486028e+02 4.71859276e+01 2.02486020e+02 4.71857947e+01 2.02486216e+02 4.71857891e+01 2.02486224e+02 4.71859220e+01 2.02483674e+02 4.71843286e+01 2.02483650e+02 4.71844316e+01 2.02483799e+02 4.71844069e+01 2.02483823e+02 4.71843039e+01 2.02483674e+02 4.71843286e+01 2.02469400e+02 4.71754053e+01 2.02469022e+02 4.71753979e+01 2.02469029e+02 4.71751736e+01 2.02469357e+02 4.71751504e+01 2.02469400e+02 4.71754053e+01 2.02500831e+02 4.71953467e+01 2.02500568e+02 4.71953542e+01 2.02500553e+02 4.71951726e+01 2.02500780e+02 4.71951976e+01 2.02500831e+02 4.71953467e+01 2.02499833e+02 4.71947232e+01 2.02499654e+02 4.71947284e+01 2.02499646e+02 4.71946066e+01 2.02499791e+02 4.71946272e+01 2.02499833e+02 4.71947232e+01 2.02495351e+02 4.71919236e+01 2.02495074e+02 4.71919316e+01 2.02494893e+02 4.71919367e+01 2.02494930e+02 4.71920380e+01 2.02495175e+02 4.71921128e+01 2.02495272e+02 4.71921101e+01 2.02495633e+02 4.71920997e+01 2.02495618e+02 4.71918546e+01 2.02495351e+02 4.71919236e+01 2.02468804e+02 4.71753322e+01 2.02468666e+02 4.71753361e+01 2.02468658e+02 4.71752409e+01 2.02468780e+02 4.71752519e+01 2.02468804e+02 4.71753322e+01 2.02504639e+02 4.71980236e+01 2.02504456e+02 4.71980123e+01 2.02504138e+02 4.71980097e+01 2.02504015e+02 4.71980132e+01 2.02503666e+02 4.71979457e+01 2.02503615e+02 4.71976832e+01 2.02504037e+02 4.71976710e+01 2.02504242e+02 4.71977759e+01 2.02504343e+02 4.71977708e+01 2.02504607e+02 4.71979008e+01 2.02504639e+02 4.71980236e+01 2.02500284e+02 4.71953039e+01 2.02500213e+02 4.71952913e+01 2.02500211e+02 4.71952583e+01 2.02500283e+02 4.71952397e+01 2.02500284e+02 4.71953039e+01 2.02499094e+02 4.71945606e+01 2.02498997e+02 4.71945634e+01 2.02499018e+02 4.71945132e+01 2.02499090e+02 4.71944946e+01 2.02499094e+02 4.71945606e+01 2.02497947e+02 4.71938441e+01 2.02497762e+02 4.71938494e+01 2.02497754e+02 4.71937236e+01 2.02497954e+02 4.71937071e+01 2.02497947e+02 4.71938441e+01 2.02480850e+02 4.71831622e+01 2.02480513e+02 4.71831718e+01 2.02480361e+02 4.71831556e+01 2.02480150e+02 4.71831144e+01 2.02479816e+02 4.71830358e+01 2.02479665e+02 4.71830196e+01 2.02479387e+02 4.71830275e+01 2.02479113e+02 4.71829739e+01 2.02479128e+02 4.71832191e+01 2.02479489e+02 4.71832088e+01 2.02479586e+02 4.71832060e+01 2.02479565e+02 4.71832562e+01 2.02479582e+02 4.71835344e+01 2.02479991e+02 4.71835228e+01 2.02480032e+02 4.71835271e+01 2.02480347e+02 4.71834457e+01 2.02480643e+02 4.71833318e+01 2.02480740e+02 4.71833290e+01 2.02480981e+02 4.71832440e+01 2.02480999e+02 4.71831375e+01 2.02480850e+02 4.71831622e+01 2.02475396e+02 4.71797531e+01 2.02475161e+02 4.71799054e+01 2.02475122e+02 4.71799986e+01 2.02475396e+02 4.71800522e+01 2.02475616e+02 4.71798901e+01 2.02475485e+02 4.71797301e+01 2.02475396e+02 4.71797531e+01 2.02473950e+02 4.71788488e+01 2.02473564e+02 4.71789070e+01 2.02473345e+02 4.71790691e+01 2.02473117e+02 4.71792259e+01 2.02472932e+02 4.71794091e+01 2.02472835e+02 4.71794118e+01 2.02472642e+02 4.71795272e+01 2.02472406e+02 4.71796789e+01 2.02472308e+02 4.71798010e+01 2.02472313e+02 4.71799201e+01 2.02472331e+02 4.71801094e+01 2.02472547e+02 4.71800661e+01 2.02472876e+02 4.71800317e+01 2.02472957e+02 4.71800233e+01 2.02473281e+02 4.71799265e+01 2.02473269e+02 4.71797411e+01 2.02473214e+02 4.71795853e+01 2.02473505e+02 4.71794683e+01 2.02473700e+02 4.71792912e+01 2.02473920e+02 4.71791291e+01 2.02474091e+02 4.71789369e+01 2.02474055e+02 4.71788356e+01 2.02473950e+02 4.71788488e+01 2.02469187e+02 4.71758711e+01 2.02468875e+02 4.71758321e+01 2.02468728e+02 4.71756155e+01 2.02468726e+02 4.71755825e+01 2.02468774e+02 4.71755811e+01 2.02469143e+02 4.71756341e+01 2.02469187e+02 4.71758711e+01 2.02507909e+02 4.72003644e+01 2.02507869e+02 4.72003711e+01 2.02507841e+02 4.72003223e+01 2.02507915e+02 4.72003367e+01 2.02507909e+02 4.72003644e+01 2.02500281e+02 4.71956011e+01 2.02500434e+02 4.71957789e+01 2.02500425e+02 4.71959901e+01 2.02500087e+02 4.71960354e+01 2.02499854e+02 4.71958825e+01 2.02499817e+02 4.71956105e+01 2.02500230e+02 4.71955695e+01 2.02500299e+02 4.71955529e+01 2.02500281e+02 4.71956011e+01 2.02499746e+02 4.71952670e+01 2.02499517e+02 4.71954233e+01 2.02499172e+02 4.71954098e+01 2.02499159e+02 4.71951998e+01 2.02499278e+02 4.71950064e+01 2.02499251e+02 4.71949576e+01 2.02499324e+02 4.71949720e+01 2.02499745e+02 4.71949866e+01 2.02499746e+02 4.71952670e+01 2.02493864e+02 4.71915930e+01 2.02493767e+02 4.71915958e+01 2.02493528e+02 4.71914468e+01 2.02493527e+02 4.71913826e+01 2.02493621e+02 4.71913780e+01 2.02493860e+02 4.71915270e+01 2.02493864e+02 4.71915930e+01 2.02493105e+02 4.71911185e+01 2.02493052e+02 4.71913846e+01 2.02492719e+02 4.71913941e+01 2.02492750e+02 4.71911961e+01 2.02493095e+02 4.71911122e+01 2.02493101e+02 4.71911121e+01 2.02493105e+02 4.71911185e+01 2.02490719e+02 4.71896284e+01 2.02490828e+02 4.71898633e+01 2.02490837e+02 4.71900009e+01 2.02490766e+02 4.71902347e+01 2.02490801e+02 4.71902778e+01 2.02490704e+02 4.71902806e+01 2.02490465e+02 4.71901315e+01 2.02490227e+02 4.71899825e+01 2.02490019e+02 4.71898105e+01 2.02489984e+02 4.71897674e+01 2.02490081e+02 4.71897646e+01 2.02490278e+02 4.71896517e+01 2.02490688e+02 4.71896090e+01 2.02490734e+02 4.71896077e+01 2.02490719e+02 4.71896284e+01 2.02485038e+02 4.71860782e+01 2.02485053e+02 4.71863233e+01 2.02485413e+02 4.71863131e+01 2.02485398e+02 4.71860679e+01 2.02485038e+02 4.71860782e+01 2.02506291e+02 4.71996536e+01 2.02506437e+02 4.71998024e+01 2.02506526e+02 4.71998003e+01 2.02506537e+02 4.71997284e+01 2.02506291e+02 4.71996536e+01 2.02497676e+02 4.71942730e+01 2.02497635e+02 4.71942686e+01 2.02497209e+02 4.71942808e+01 2.02497177e+02 4.71942817e+01 2.02497167e+02 4.71942544e+01 2.02497395e+02 4.71940976e+01 2.02497435e+02 4.71940909e+01 2.02497674e+02 4.71942399e+01 2.02497676e+02 4.71942730e+01 2.02496703e+02 4.71936655e+01 2.02496685e+02 4.71936688e+01 2.02496685e+02 4.71936541e+01 2.02496706e+02 4.71936535e+01 2.02496703e+02 4.71936655e+01 2.02508063e+02 4.72010588e+01 2.02507793e+02 4.72010781e+01 2.02507739e+02 4.72008567e+01 2.02508068e+02 4.72008744e+01 2.02508063e+02 4.72010588e+01 2.02503825e+02 4.71984125e+01 2.02503436e+02 4.71984413e+01 2.02503455e+02 4.71981815e+01 2.02503819e+02 4.71981576e+01 2.02503825e+02 4.71984125e+01 2.02501266e+02 4.71968143e+01 2.02501067e+02 4.71969897e+01 2.02500994e+02 4.71969918e+01 2.02500754e+02 4.71970932e+01 2.02500403e+02 4.71971033e+01 2.02500430e+02 4.71968909e+01 2.02500694e+02 4.71967566e+01 2.02500879e+02 4.71967513e+01 2.02501223e+02 4.71967879e+01 2.02501272e+02 4.71967865e+01 2.02501266e+02 4.71968143e+01 2.02495786e+02 4.71933918e+01 2.02495737e+02 4.71933932e+01 2.02495710e+02 4.71933444e+01 2.02495784e+02 4.71933588e+01 2.02495786e+02 4.71933918e+01 2.02505614e+02 4.71998289e+01 2.02505552e+02 4.71998059e+01 2.02505538e+02 4.71997815e+01 2.02505587e+02 4.71997801e+01 2.02505614e+02 4.71998289e+01 2.02502373e+02 4.71978048e+01 2.02502404e+02 4.71979026e+01 2.02502418e+02 4.71981320e+01 2.02502073e+02 4.71982159e+01 2.02502088e+02 4.71984611e+01 2.02502413e+02 4.71985462e+01 2.02502652e+02 4.71986952e+01 2.02502926e+02 4.71987488e+01 2.02503000e+02 4.71987632e+01 2.02503227e+02 4.71989208e+01 2.02503241e+02 4.71989452e+01 2.02503324e+02 4.71991751e+01 2.02503497e+02 4.71993724e+01 2.02503499e+02 4.71994054e+01 2.02503582e+02 4.71996352e+01 2.02503589e+02 4.71997610e+01 2.02503634e+02 4.71999223e+01 2.02503945e+02 4.71999830e+01 2.02504182e+02 4.71998321e+01 2.02504196e+02 4.71998317e+01 2.02504212e+02 4.71998505e+01 2.02504021e+02 4.72000304e+01 2.02504036e+02 4.72002756e+01 2.02504015e+02 4.72003258e+01 2.02504032e+02 4.72006039e+01 2.02504034e+02 4.72006369e+01 2.02504193e+02 4.72008105e+01 2.02504236e+02 4.72010623e+01 2.02504094e+02 4.72012091e+01 2.02504302e+02 4.72013810e+01 2.02504571e+02 4.72015071e+01 2.02504881e+02 4.72014647e+01 2.02505037e+02 4.72014883e+01 2.02505085e+02 4.72015920e+01 2.02504923e+02 4.72017901e+01 2.02504660e+02 4.72017668e+01 2.02504402e+02 4.72017639e+01 2.02504348e+02 4.72019976e+01 2.02504757e+02 4.72019859e+01 2.02504829e+02 4.72019673e+01 2.02504800e+02 4.72020122e+01 2.02504614e+02 4.72021954e+01 2.02504629e+02 4.72024406e+01 2.02504608e+02 4.72024908e+01 2.02504625e+02 4.72027689e+01 2.02504653e+02 4.72028178e+01 2.02504527e+02 4.72030386e+01 2.02504535e+02 4.72031612e+01 2.02504715e+02 4.72031560e+01 2.02504993e+02 4.72031481e+01 2.02505005e+02 4.72033367e+01 2.02504926e+02 4.72035231e+01 2.02505287e+02 4.72035127e+01 2.02505381e+02 4.72032723e+01 2.02505405e+02 4.72031693e+01 2.02505393e+02 4.72029807e+01 2.02505472e+02 4.72027943e+01 2.02505501e+02 4.72027494e+01 2.02505687e+02 4.72025661e+01 2.02505672e+02 4.72023210e+01 2.02505464e+02 4.72021490e+01 2.02505429e+02 4.72021059e+01 2.02505325e+02 4.72019266e+01 2.02505313e+02 4.72017343e+01 2.02505596e+02 4.72017262e+01 2.02505742e+02 4.72017034e+01 2.02505737e+02 4.72016217e+01 2.02505723e+02 4.72013922e+01 2.02505703e+02 4.72013212e+01 2.02505726e+02 4.72010952e+01 2.02505967e+02 4.72009464e+01 2.02506056e+02 4.72007348e+01 2.02506054e+02 4.72007018e+01 2.02506168e+02 4.72004740e+01 2.02506423e+02 4.72004638e+01 2.02506434e+02 4.72006397e+01 2.02506451e+02 4.72007684e+01 2.02506690e+02 4.72009174e+01 2.02506701e+02 4.72011060e+01 2.02506734e+02 4.72012101e+01 2.02506647e+02 4.72013711e+01 2.02506508e+02 4.72015833e+01 2.02506399e+02 4.72017829e+01 2.02506427e+02 4.72018318e+01 2.02506442e+02 4.72020769e+01 2.02506650e+02 4.72022488e+01 2.02506647e+02 4.72022682e+01 2.02506588e+02 4.72022947e+01 2.02506372e+02 4.72021285e+01 2.02506091e+02 4.72022202e+01 2.02505980e+02 4.72024184e+01 2.02506328e+02 4.72024863e+01 2.02506477e+02 4.72024616e+01 2.02506734e+02 4.72025117e+01 2.02507010e+02 4.72026337e+01 2.02507278e+02 4.72026622e+01 2.02507264e+02 4.72024453e+01 2.02507273e+02 4.72023601e+01 2.02507219e+02 4.72021536e+01 2.02507192e+02 4.72020107e+01 2.02507184e+02 4.72018538e+01 2.02506872e+02 4.72017592e+01 2.02506864e+02 4.72015068e+01 2.02507244e+02 4.72014842e+01 2.02507495e+02 4.72016012e+01 2.02507527e+02 4.72016002e+01 2.02507562e+02 4.72016433e+01 2.02507577e+02 4.72018885e+01 2.02507866e+02 4.72020001e+01 2.02508031e+02 4.72022037e+01 2.02508335e+02 4.72023044e+01 2.02508343e+02 4.72024301e+01 2.02508387e+02 4.72025914e+01 2.02508528e+02 4.72028129e+01 2.02508759e+02 4.72029676e+01 2.02508756e+02 4.72029870e+01 2.02508725e+02 4.72032668e+01 2.02508729e+02 4.72033155e+01 2.02508827e+02 4.72035684e+01 2.02509193e+02 4.72036231e+01 2.02509306e+02 4.72038650e+01 2.02509267e+02 4.72039039e+01 2.02509153e+02 4.72041322e+01 2.02509025e+02 4.72043513e+01 2.02508750e+02 4.72044787e+01 2.02508517e+02 4.72046322e+01 2.02508285e+02 4.72047863e+01 2.02508020e+02 4.72049202e+01 2.02507808e+02 4.72050868e+01 2.02507629e+02 4.72052743e+01 2.02507386e+02 4.72054216e+01 2.02507072e+02 4.72055249e+01 2.02506854e+02 4.72056876e+01 2.02506748e+02 4.72059203e+01 2.02506515e+02 4.72060743e+01 2.02506255e+02 4.72062108e+01 2.02506064e+02 4.72063906e+01 2.02505798e+02 4.72065240e+01 2.02505538e+02 4.72066605e+01 2.02505484e+02 4.72066904e+01 2.02505111e+02 4.72066929e+01 2.02505038e+02 4.72066950e+01 2.02504759e+02 4.72067726e+01 2.02504767e+02 4.72068952e+01 2.02504779e+02 4.72070838e+01 2.02504815e+02 4.72071850e+01 2.02504706e+02 4.72073376e+01 2.02504444e+02 4.72074728e+01 2.02504387e+02 4.72075012e+01 2.02504027e+02 4.72075115e+01 2.02504042e+02 4.72077566e+01 2.02504001e+02 4.72077946e+01 2.02503841e+02 4.72079938e+01 2.02503702e+02 4.72082063e+01 2.02503403e+02 4.72083187e+01 2.02503154e+02 4.72084622e+01 2.02503029e+02 4.72085051e+01 2.02503021e+02 4.72083794e+01 2.02502977e+02 4.72082181e+01 2.02502837e+02 4.72079966e+01 2.02502427e+02 4.72080084e+01 2.02502355e+02 4.72080270e+01 2.02502351e+02 4.72079609e+01 2.02502250e+02 4.72077797e+01 2.02502238e+02 4.72075911e+01 2.02502471e+02 4.72076159e+01 2.02502744e+02 4.72076081e+01 2.02502798e+02 4.72073743e+01 2.02502771e+02 4.72073255e+01 2.02502755e+02 4.72070803e+01 2.02502751e+02 4.72070143e+01 2.02502736e+02 4.72067692e+01 2.02502766e+02 4.72067242e+01 2.02502748e+02 4.72064351e+01 2.02502751e+02 4.72064157e+01 2.02502841e+02 4.72061730e+01 2.02502802e+02 4.72060699e+01 2.02502678e+02 4.72058357e+01 2.02502674e+02 4.72057697e+01 2.02502659e+02 4.72055245e+01 2.02502378e+02 4.72054066e+01 2.02502370e+02 4.72052809e+01 2.02502424e+02 4.72050471e+01 2.02502422e+02 4.72050141e+01 2.02502405e+02 4.72047360e+01 2.02502069e+02 4.72047939e+01 2.02501834e+02 4.72048321e+01 2.02501574e+02 4.72046995e+01 2.02501516e+02 4.72044486e+01 2.02501665e+02 4.72043061e+01 2.02501687e+02 4.72042559e+01 2.02501604e+02 4.72040260e+01 2.02501596e+02 4.72039003e+01 2.02501585e+02 4.72037149e+01 2.02501346e+02 4.72035659e+01 2.02501290e+02 4.72034100e+01 2.02501603e+02 4.72033066e+01 2.02501588e+02 4.72030614e+01 2.02501584e+02 4.72029954e+01 2.02501569e+02 4.72027503e+01 2.02501565e+02 4.72026842e+01 2.02501463e+02 4.72025030e+01 2.02501311e+02 4.72022901e+01 2.02500950e+02 4.72023004e+01 2.02500876e+02 4.72022860e+01 2.02500614e+02 4.72021542e+01 2.02500610e+02 4.72020881e+01 2.02500704e+02 4.72018477e+01 2.02501083e+02 4.72017849e+01 2.02501268e+02 4.72016017e+01 2.02501167e+02 4.72014205e+01 2.02500892e+02 4.72013669e+01 2.02500818e+02 4.72013525e+01 2.02500791e+02 4.72013037e+01 2.02501010e+02 4.72011415e+01 2.02501104e+02 4.72009011e+01 2.02501355e+02 4.72007586e+01 2.02501434e+02 4.72005721e+01 2.02501455e+02 4.72005219e+01 2.02501555e+02 4.72002853e+01 2.02501547e+02 4.72001627e+01 2.02501309e+02 4.72000137e+01 2.02501345e+02 4.71998552e+01 2.02501399e+02 4.71996214e+01 2.02500990e+02 4.71996331e+01 2.02500941e+02 4.71996345e+01 2.02500679e+02 4.71995027e+01 2.02500675e+02 4.71994367e+01 2.02500895e+02 4.71992745e+01 2.02500879e+02 4.71990294e+01 2.02500875e+02 4.71989634e+01 2.02500774e+02 4.71987821e+01 2.02500593e+02 4.71987873e+01 2.02500601e+02 4.71989098e+01 2.02500613e+02 4.71990984e+01 2.02500339e+02 4.71991034e+01 2.02500096e+02 4.71989574e+01 2.02499858e+02 4.71988083e+01 2.02499705e+02 4.71985954e+01 2.02499392e+02 4.71985017e+01 2.02499337e+02 4.71983021e+01 2.02499675e+02 4.71982924e+01 2.02499775e+02 4.71985438e+01 2.02500114e+02 4.71984877e+01 2.02500167e+02 4.71982540e+01 2.02499906e+02 4.71981221e+01 2.02499901e+02 4.71980561e+01 2.02499886e+02 4.71978110e+01 2.02499671e+02 4.71976447e+01 2.02499262e+02 4.71976565e+01 2.02499042e+02 4.71978186e+01 2.02498994e+02 4.71978200e+01 2.02498732e+02 4.71976882e+01 2.02498493e+02 4.71975391e+01 2.02498489e+02 4.71974731e+01 2.02498734e+02 4.71973268e+01 2.02498953e+02 4.71971646e+01 2.02499147e+02 4.71969867e+01 2.02499366e+02 4.71968246e+01 2.02499463e+02 4.71968218e+01 2.02499788e+02 4.71969069e+01 2.02499941e+02 4.71971198e+01 2.02499945e+02 4.71971859e+01 2.02499960e+02 4.71974310e+01 2.02500168e+02 4.71976030e+01 2.02500437e+02 4.71977291e+01 2.02500718e+02 4.71978470e+01 2.02501062e+02 4.71978836e+01 2.02501134e+02 4.71978650e+01 2.02501401e+02 4.71977959e+01 2.02501479e+02 4.71976095e+01 2.02501241e+02 4.71974605e+01 2.02501037e+02 4.71972856e+01 2.02500998e+02 4.71972454e+01 2.02501095e+02 4.71972426e+01 2.02501334e+02 4.71973917e+01 2.02501549e+02 4.71975579e+01 2.02501788e+02 4.71977069e+01 2.02502120e+02 4.71976472e+01 2.02502306e+02 4.71976490e+01 2.02502373e+02 4.71978048e+01 2.02487004e+02 4.71882042e+01 2.02487019e+02 4.71884493e+01 2.02486992e+02 4.71884963e+01 2.02486895e+02 4.71887347e+01 2.02486592e+02 4.71887644e+01 2.02486553e+02 4.71885211e+01 2.02486601e+02 4.71884329e+01 2.02486637e+02 4.71882744e+01 2.02486936e+02 4.71881620e+01 2.02486976e+02 4.71881553e+01 2.02487004e+02 4.71882042e+01 2.02483551e+02 4.71860466e+01 2.02483213e+02 4.71860562e+01 2.02483093e+02 4.71860596e+01 2.02482983e+02 4.71862265e+01 2.02483221e+02 4.71863755e+01 2.02483441e+02 4.71862772e+01 2.02483774e+02 4.71862927e+01 2.02483994e+02 4.71863236e+01 2.02483983e+02 4.71861382e+01 2.02483671e+02 4.71860431e+01 2.02483551e+02 4.71860466e+01 2.02509427e+02 4.72025084e+01 2.02509386e+02 4.72025041e+01 2.02509376e+02 4.72024768e+01 2.02509448e+02 4.72024582e+01 2.02509427e+02 4.72025084e+01 2.02508591e+02 4.72019869e+01 2.02508358e+02 4.72019621e+01 2.02508302e+02 4.72018063e+01 2.02508580e+02 4.72017983e+01 2.02508591e+02 4.72019869e+01 2.02495850e+02 4.71940300e+01 2.02495776e+02 4.71940156e+01 2.02495749e+02 4.71939667e+01 2.02495823e+02 4.71939812e+01 2.02495850e+02 4.71940300e+01 2.02495091e+02 4.71935558e+01 2.02495241e+02 4.71937606e+01 2.02495307e+02 4.71939901e+01 2.02495075e+02 4.71941442e+01 2.02494707e+02 4.71941547e+01 2.02494692e+02 4.71939049e+01 2.02494669e+02 4.71938576e+01 2.02494602e+02 4.71935815e+01 2.02494364e+02 4.71934325e+01 2.02494336e+02 4.71933837e+01 2.02494462e+02 4.71931628e+01 2.02494739e+02 4.71931549e+01 2.02494911e+02 4.71933531e+01 2.02495090e+02 4.71935463e+01 2.02495091e+02 4.71935558e+01 2.02490601e+02 4.71907511e+01 2.02490703e+02 4.71909324e+01 2.02490883e+02 4.71909272e+01 2.02490875e+02 4.71908046e+01 2.02490601e+02 4.71907511e+01 2.02480319e+02 4.71843258e+01 2.02480266e+02 4.71845918e+01 2.02480226e+02 4.71846850e+01 2.02480366e+02 4.71846547e+01 2.02480745e+02 4.71845923e+01 2.02480728e+02 4.71843141e+01 2.02480319e+02 4.71843258e+01 2.02477146e+02 4.71823427e+01 2.02477020e+02 4.71824997e+01 2.02477374e+02 4.71825637e+01 2.02477525e+02 4.71825798e+01 2.02477518e+02 4.71824573e+01 2.02477279e+02 4.71823082e+01 2.02477146e+02 4.71823427e+01 2.02476622e+02 4.71820152e+01 2.02476687e+02 4.71820952e+01 2.02476763e+02 4.71821033e+01 2.02476774e+02 4.71820313e+01 2.02476622e+02 4.71820152e+01 2.02475574e+02 4.71813601e+01 2.02475500e+02 4.71813457e+01 2.02475091e+02 4.71813573e+01 2.02474863e+02 4.71815142e+01 2.02474881e+02 4.71818033e+01 2.02475251e+02 4.71817566e+01 2.02475456e+02 4.71817035e+01 2.02475731e+02 4.71817571e+01 2.02475950e+02 4.71815950e+01 2.02475935e+02 4.71813499e+01 2.02475574e+02 4.71813601e+01 2.02473032e+02 4.71797711e+01 2.02472739e+02 4.71798081e+01 2.02472724e+02 4.71795787e+01 2.02473062e+02 4.71795691e+01 2.02473032e+02 4.71797711e+01 2.02499574e+02 4.71966549e+01 2.02499236e+02 4.71966646e+01 2.02499112e+02 4.71964304e+01 2.02498752e+02 4.71964407e+01 2.02498853e+02 4.71966220e+01 2.02498865e+02 4.71968106e+01 2.02498632e+02 4.71967858e+01 2.02498435e+02 4.71966056e+01 2.02498197e+02 4.71964566e+01 2.02498218e+02 4.71964064e+01 2.02498201e+02 4.71961282e+01 2.02498199e+02 4.71960952e+01 2.02498270e+02 4.71960766e+01 2.02498486e+02 4.71962429e+01 2.02498824e+02 4.71961867e+01 2.02499009e+02 4.71961814e+01 2.02499182e+02 4.71963788e+01 2.02499519e+02 4.71964553e+01 2.02499574e+02 4.71966549e+01 2.02498017e+02 4.71956825e+01 2.02497950e+02 4.71956623e+01 2.02497949e+02 4.71956403e+01 2.02497981e+02 4.71956394e+01 2.02498017e+02 4.71956825e+01 2.02487210e+02 4.71892305e+01 2.02486816e+02 4.71892500e+01 2.02486784e+02 4.71889642e+01 2.02487225e+02 4.71889478e+01 2.02487210e+02 4.71892305e+01 2.02485349e+02 4.71880679e+01 2.02485329e+02 4.71880712e+01 2.02485315e+02 4.71880468e+01 2.02485364e+02 4.71880454e+01 2.02485349e+02 4.71880679e+01 2.02465530e+02 4.71756785e+01 2.02465206e+02 4.71757756e+01 2.02464981e+02 4.71757820e+01 2.02464989e+02 4.71756399e+01 2.02465174e+02 4.71754558e+01 2.02465432e+02 4.71754485e+01 2.02465530e+02 4.71756785e+01 2.02494999e+02 4.71943959e+01 2.02494780e+02 4.71945581e+01 2.02494550e+02 4.71945961e+01 2.02494539e+02 4.71944075e+01 2.02494758e+02 4.71942454e+01 2.02495036e+02 4.71942374e+01 2.02494999e+02 4.71943959e+01 2.02479732e+02 4.71848565e+01 2.02479502e+02 4.71848945e+01 2.02479367e+02 4.71849276e+01 2.02479004e+02 4.71849379e+01 2.02478911e+02 4.71849420e+01 2.02478785e+02 4.71850991e+01 2.02479024e+02 4.71852482e+01 2.02479291e+02 4.71851792e+01 2.02479510e+02 4.71850171e+01 2.02479743e+02 4.71850419e+01 2.02479799e+02 4.71851978e+01 2.02479580e+02 4.71853599e+01 2.02479392e+02 4.71855416e+01 2.02479282e+02 4.71857084e+01 2.02479520e+02 4.71858575e+01 2.02479787e+02 4.71857885e+01 2.02479768e+02 4.71856746e+01 2.02479755e+02 4.71854694e+01 2.02480057e+02 4.71854608e+01 2.02480286e+02 4.71856166e+01 2.02480433e+02 4.71855938e+01 2.02480457e+02 4.71854908e+01 2.02480224e+02 4.71853375e+01 2.02480284e+02 4.71852017e+01 2.02480265e+02 4.71849814e+01 2.02480005e+02 4.71848487e+01 2.02479732e+02 4.71848565e+01 2.02466223e+02 4.71764115e+01 2.02465920e+02 4.71763892e+01 2.02465909e+02 4.71762150e+01 2.02466141e+02 4.71762257e+01 2.02466223e+02 4.71764115e+01 2.02502464e+02 4.71993571e+01 2.02502471e+02 4.71994797e+01 2.02502652e+02 4.71994745e+01 2.02502644e+02 4.71993520e+01 2.02502464e+02 4.71993571e+01 2.02501654e+02 4.71988514e+01 2.02501784e+02 4.71990114e+01 2.02501904e+02 4.71990079e+01 2.02502015e+02 4.71988410e+01 2.02501654e+02 4.71988514e+01 2.02489542e+02 4.71912862e+01 2.02489335e+02 4.71912921e+01 2.02489327e+02 4.71911515e+01 2.02489476e+02 4.71911882e+01 2.02489542e+02 4.71912862e+01 2.02486623e+02 4.71894619e+01 2.02486525e+02 4.71894647e+01 2.02486547e+02 4.71894144e+01 2.02486595e+02 4.71894130e+01 2.02486623e+02 4.71894619e+01 2.02486261e+02 4.71892358e+01 2.02485916e+02 4.71892647e+01 2.02485895e+02 4.71890072e+01 2.02486247e+02 4.71890194e+01 2.02486261e+02 4.71892358e+01 2.02478638e+02 4.71844720e+01 2.02478643e+02 4.71845537e+01 2.02478765e+02 4.71845511e+01 2.02478758e+02 4.71844686e+01 2.02478638e+02 4.71844720e+01 2.02504989e+02 4.72012330e+01 2.02504917e+02 4.72012516e+01 2.02504938e+02 4.72012014e+01 2.02504975e+02 4.72012086e+01 2.02504989e+02 4.72012330e+01 2.02498784e+02 4.71973584e+01 2.02498802e+02 4.71976366e+01 2.02499211e+02 4.71976248e+01 2.02499194e+02 4.71973467e+01 2.02498784e+02 4.71973584e+01 2.02498307e+02 4.71970603e+01 2.02498235e+02 4.71970789e+01 2.02498231e+02 4.71970129e+01 2.02498305e+02 4.71970273e+01 2.02498307e+02 4.71970603e+01 2.02497782e+02 4.71967323e+01 2.02497397e+02 4.71967912e+01 2.02497258e+02 4.71970036e+01 2.02497050e+02 4.71969784e+01 2.02496700e+02 4.71969118e+01 2.02496517e+02 4.71967218e+01 2.02496523e+02 4.71965446e+01 2.02496835e+02 4.71964867e+01 2.02497093e+02 4.71966215e+01 2.02497296e+02 4.71967279e+01 2.02497373e+02 4.71964770e+01 2.02497764e+02 4.71964507e+01 2.02497782e+02 4.71967323e+01 2.02499545e+02 4.71981325e+01 2.02499448e+02 4.71981352e+01 2.02499469e+02 4.71980850e+01 2.02499541e+02 4.71980664e+01 2.02499545e+02 4.71981325e+01 2.02495090e+02 4.71956490e+01 2.02494772e+02 4.71957494e+01 2.02494750e+02 4.71957500e+01 2.02494519e+02 4.71958911e+01 2.02494267e+02 4.71960323e+01 2.02493889e+02 4.71960614e+01 2.02493712e+02 4.71958669e+01 2.02493517e+02 4.71956852e+01 2.02493510e+02 4.71955594e+01 2.02493563e+02 4.71953257e+01 2.02493570e+02 4.71952979e+01 2.02493610e+02 4.71952913e+01 2.02493948e+02 4.71952352e+01 2.02494178e+02 4.71951971e+01 2.02494372e+02 4.71953789e+01 2.02494578e+02 4.71953292e+01 2.02494924e+02 4.71952965e+01 2.02495057e+02 4.71955231e+01 2.02495090e+02 4.71956490e+01 2.02472629e+02 4.71816137e+01 2.02472520e+02 4.71815962e+01 2.02472485e+02 4.71815236e+01 2.02472662e+02 4.71814914e+01 2.02472629e+02 4.71816137e+01 2.02471722e+02 4.71810462e+01 2.02471539e+02 4.71810201e+01 2.02471563e+02 4.71809470e+01 2.02471671e+02 4.71809221e+01 2.02471722e+02 4.71810462e+01 2.02499155e+02 4.71984871e+01 2.02498987e+02 4.71984760e+01 2.02498908e+02 4.71983330e+01 2.02499191e+02 4.71983249e+01 2.02499155e+02 4.71984871e+01 2.02497285e+02 4.71973193e+01 2.02497064e+02 4.71972942e+01 2.02497056e+02 4.71971765e+01 2.02497274e+02 4.71971389e+01 2.02497285e+02 4.71973193e+01 2.02485004e+02 4.71896473e+01 2.02484932e+02 4.71896659e+01 2.02484962e+02 4.71896210e+01 2.02485025e+02 4.71895971e+01 2.02485004e+02 4.71896473e+01 2.02478922e+02 4.71858462e+01 2.02478958e+02 4.71859475e+01 2.02479110e+02 4.71859636e+01 2.02479189e+02 4.71857772e+01 2.02478922e+02 4.71858462e+01 2.02476537e+02 4.71843554e+01 2.02476544e+02 4.71844780e+01 2.02476725e+02 4.71844729e+01 2.02476717e+02 4.71843503e+01 2.02476537e+02 4.71843554e+01 2.02474580e+02 4.71831321e+01 2.02474434e+02 4.71831092e+01 2.02474052e+02 4.71831013e+01 2.02473999e+02 4.71833677e+01 2.02473613e+02 4.71834255e+01 2.02473513e+02 4.71836621e+01 2.02473549e+02 4.71837634e+01 2.02473795e+02 4.71838383e+01 2.02473892e+02 4.71838355e+01 2.02474159e+02 4.71837665e+01 2.02474378e+02 4.71836044e+01 2.02474729e+02 4.71835248e+01 2.02474817e+02 4.71832803e+01 2.02474751e+02 4.71832009e+01 2.02474580e+02 4.71831321e+01 2.02473706e+02 4.71825861e+01 2.02473369e+02 4.71825957e+01 2.02473245e+02 4.71823615e+01 2.02472885e+02 4.71823717e+01 2.02472986e+02 4.71825530e+01 2.02473225e+02 4.71827021e+01 2.02473463e+02 4.71828512e+01 2.02473592e+02 4.71830813e+01 2.02474001e+02 4.71830697e+01 2.02474088e+02 4.71828245e+01 2.02474215e+02 4.71826208e+01 2.02473942e+02 4.71824975e+01 2.02473706e+02 4.71825861e+01 2.02503782e+02 4.72016759e+01 2.02503761e+02 4.72017806e+01 2.02503942e+02 4.72017755e+01 2.02503905e+02 4.72016742e+01 2.02503782e+02 4.72016759e+01 2.02491729e+02 4.71941478e+01 2.02491655e+02 4.71941333e+01 2.02491661e+02 4.71941056e+01 2.02491725e+02 4.71940817e+01 2.02491729e+02 4.71941478e+01 2.02490731e+02 4.71935245e+01 2.02490515e+02 4.71936890e+01 2.02490494e+02 4.71936896e+01 2.02490110e+02 4.71936478e+01 2.02490120e+02 4.71934423e+01 2.02490323e+02 4.71932697e+01 2.02490652e+02 4.71932475e+01 2.02490730e+02 4.71935150e+01 2.02490731e+02 4.71935245e+01 2.02471309e+02 4.71813868e+01 2.02471230e+02 4.71815732e+01 2.02471209e+02 4.71816234e+01 2.02471168e+02 4.71816191e+01 2.02470899e+02 4.71814929e+01 2.02470538e+02 4.71815032e+01 2.02470413e+02 4.71817240e+01 2.02470099e+02 4.71818273e+01 2.02469855e+02 4.71819736e+01 2.02469806e+02 4.71819750e+01 2.02469468e+02 4.71820310e+01 2.02469504e+02 4.71821984e+01 2.02469514e+02 4.71823587e+01 2.02469236e+02 4.71823965e+01 2.02468984e+02 4.71823266e+01 2.02468764e+02 4.71824886e+01 2.02468690e+02 4.71824742e+01 2.02468386e+02 4.71823734e+01 2.02468043e+02 4.71823367e+01 2.02467841e+02 4.71825096e+01 2.02467621e+02 4.71826717e+01 2.02467443e+02 4.71828598e+01 2.02467258e+02 4.71828817e+01 2.02466998e+02 4.71828804e+01 2.02466707e+02 4.71829980e+01 2.02466666e+02 4.71829936e+01 2.02466631e+02 4.71829505e+01 2.02466616e+02 4.71827054e+01 2.02466638e+02 4.71826552e+01 2.02466536e+02 4.71824391e+01 2.02466553e+02 4.71823031e+01 2.02466514e+02 4.71821304e+01 2.02466507e+02 4.71819751e+01 2.02466697e+02 4.71819954e+01 2.02466992e+02 4.71821029e+01 2.02467296e+02 4.71821690e+01 2.02467528e+02 4.71820148e+01 2.02467659e+02 4.71817976e+01 2.02467931e+02 4.71817344e+01 2.02468167e+02 4.71818160e+01 2.02468223e+02 4.71815520e+01 2.02468610e+02 4.71814949e+01 2.02468691e+02 4.71814979e+01 2.02468713e+02 4.71815593e+01 2.02468624e+02 4.71818027e+01 2.02468595e+02 4.71818939e+01 2.02468819e+02 4.71819247e+01 2.02469117e+02 4.71818113e+01 2.02469149e+02 4.71818102e+01 2.02469519e+02 4.71817635e+01 2.02469714e+02 4.71815864e+01 2.02470004e+02 4.71814687e+01 2.02470076e+02 4.71814501e+01 2.02470437e+02 4.71814399e+01 2.02470690e+02 4.71812989e+01 2.02470753e+02 4.71812751e+01 2.02471020e+02 4.71812061e+01 2.02471252e+02 4.71812323e+01 2.02471309e+02 4.71813868e+01 2.02470591e+02 4.71809375e+01 2.02470308e+02 4.71809536e+01 2.02470224e+02 4.71807085e+01 2.02470658e+02 4.71806949e+01 2.02470591e+02 4.71809375e+01 2.02469883e+02 4.71804949e+01 2.02469609e+02 4.71804939e+01 2.02469542e+02 4.71802822e+01 2.02469903e+02 4.71802768e+01 2.02469883e+02 4.71804949e+01 2.02465035e+02 4.71774641e+01 2.02464900e+02 4.71774679e+01 2.02464873e+02 4.71773627e+01 2.02465030e+02 4.71773716e+01 2.02465035e+02 4.71774641e+01 2.02500931e+02 4.72001949e+01 2.02500830e+02 4.72003674e+01 2.02500834e+02 4.72004334e+01 2.02500768e+02 4.72004133e+01 2.02500499e+02 4.72002872e+01 2.02500494e+02 4.72002212e+01 2.02500597e+02 4.71999863e+01 2.02500876e+02 4.72000085e+01 2.02500931e+02 4.72001949e+01 2.02496941e+02 4.71977031e+01 2.02496677e+02 4.71978373e+01 2.02496330e+02 4.71978365e+01 2.02496297e+02 4.71975996e+01 2.02496477e+02 4.71974128e+01 2.02496920e+02 4.71974001e+01 2.02496941e+02 4.71977031e+01 2.02495894e+02 4.71970491e+01 2.02495624e+02 4.71970569e+01 2.02495639e+02 4.71968893e+01 2.02495881e+02 4.71968665e+01 2.02495894e+02 4.71970491e+01 2.02489319e+02 4.71929413e+01 2.02489301e+02 4.71929444e+01 2.02489300e+02 4.71929299e+01 2.02489316e+02 4.71929332e+01 2.02489319e+02 4.71929413e+01 2.02486355e+02 4.71910895e+01 2.02486391e+02 4.71911908e+01 2.02486543e+02 4.71912069e+01 2.02486535e+02 4.71910843e+01 2.02486355e+02 4.71910895e+01 2.02479009e+02 4.71864992e+01 2.02479025e+02 4.71865485e+01 2.02479242e+02 4.71866447e+01 2.02479140e+02 4.71864634e+01 2.02479009e+02 4.71864992e+01 2.02470157e+02 4.71809656e+01 2.02469825e+02 4.71809850e+01 2.02469838e+02 4.71807660e+01 2.02470201e+02 4.71807074e+01 2.02470157e+02 4.71809656e+01 2.02505971e+02 4.72036411e+01 2.02505977e+02 4.72037228e+01 2.02506128e+02 4.72037389e+01 2.02506120e+02 4.72036164e+01 2.02505971e+02 4.72036411e+01 2.02503744e+02 4.72022503e+01 2.02503690e+02 4.72024840e+01 2.02503717e+02 4.72025329e+01 2.02503848e+02 4.72026928e+01 2.02503999e+02 4.72027090e+01 2.02503992e+02 4.72025864e+01 2.02504028e+02 4.72024279e+01 2.02504082e+02 4.72021942e+01 2.02503744e+02 4.72022503e+01 2.02492696e+02 4.71953505e+01 2.02492655e+02 4.71953461e+01 2.02492620e+02 4.71953030e+01 2.02492694e+02 4.71953174e+01 2.02492696e+02 4.71953505e+01 2.02489929e+02 4.71936216e+01 2.02489778e+02 4.71938266e+01 2.02489400e+02 4.71938473e+01 2.02489339e+02 4.71935674e+01 2.02489331e+02 4.71935476e+01 2.02489361e+02 4.71935509e+01 2.02489713e+02 4.71934869e+01 2.02489895e+02 4.71934817e+01 2.02489929e+02 4.71936216e+01 2.02486996e+02 4.71917891e+01 2.02487011e+02 4.71920342e+01 2.02487015e+02 4.71921003e+01 2.02487166e+02 4.71922446e+01 2.02487214e+02 4.71922247e+01 2.02487246e+02 4.71921858e+01 2.02487231e+02 4.71919359e+01 2.02487270e+02 4.71918427e+01 2.02486996e+02 4.71917891e+01 2.02476148e+02 4.71850104e+01 2.02476038e+02 4.71851772e+01 2.02476399e+02 4.71851670e+01 2.02476298e+02 4.71849857e+01 2.02476148e+02 4.71850104e+01 2.02472898e+02 4.71829782e+01 2.02472915e+02 4.71832564e+01 2.02473253e+02 4.71832003e+01 2.02473241e+02 4.71830149e+01 2.02472898e+02 4.71829782e+01 2.02469741e+02 4.71810049e+01 2.02469366e+02 4.71809989e+01 2.02469353e+02 4.71807620e+01 2.02469708e+02 4.71807462e+01 2.02469741e+02 4.71810049e+01 2.02467281e+02 4.71794667e+01 2.02466987e+02 4.71795038e+01 2.02466892e+02 4.71795228e+01 2.02466843e+02 4.71796102e+01 2.02467090e+02 4.71797534e+01 2.02467381e+02 4.71798287e+01 2.02467601e+02 4.71796666e+01 2.02467518e+02 4.71794368e+01 2.02467281e+02 4.71794667e+01 2.02506104e+02 4.72040230e+01 2.02506206e+02 4.72042043e+01 2.02506169e+02 4.72043628e+01 2.02505879e+02 4.72044805e+01 2.02505830e+02 4.72044819e+01 2.02505591e+02 4.72043329e+01 2.02505564e+02 4.72042841e+01 2.02505434e+02 4.72041241e+01 2.02505419e+02 4.72038947e+01 2.02505443e+02 4.72037917e+01 2.02505169e+02 4.72037381e+01 2.02505103e+02 4.72037180e+01 2.02504833e+02 4.72035919e+01 2.02504646e+02 4.72037110e+01 2.02504574e+02 4.72037835e+01 2.02504513e+02 4.72039270e+01 2.02504557e+02 4.72041212e+01 2.02504636e+02 4.72043028e+01 2.02504671e+02 4.72043624e+01 2.02504793e+02 4.72044007e+01 2.02505070e+02 4.72043927e+01 2.02505034e+02 4.72045512e+01 2.02504980e+02 4.72047850e+01 2.02505219e+02 4.72049340e+01 2.02505212e+02 4.72049617e+01 2.02505027e+02 4.72051449e+01 2.02504807e+02 4.72053071e+01 2.02504682e+02 4.72055279e+01 2.02504733e+02 4.72056186e+01 2.02504964e+02 4.72057040e+01 2.02505183e+02 4.72055419e+01 2.02505257e+02 4.72055563e+01 2.02505285e+02 4.72056051e+01 2.02505386e+02 4.72057864e+01 2.02505661e+02 4.72058399e+01 2.02505786e+02 4.72056191e+01 2.02506005e+02 4.72054569e+01 2.02506283e+02 4.72054490e+01 2.02506463e+02 4.72054438e+01 2.02506427e+02 4.72053425e+01 2.02506413e+02 4.72051131e+01 2.02506523e+02 4.72049462e+01 2.02506519e+02 4.72048802e+01 2.02506597e+02 4.72046300e+01 2.02506816e+02 4.72044678e+01 2.02506813e+02 4.72044065e+01 2.02506609e+02 4.72042315e+01 2.02506465e+02 4.72040127e+01 2.02506104e+02 4.72040230e+01 2.02499899e+02 4.72001485e+01 2.02499802e+02 4.72001513e+01 2.02499798e+02 4.72000852e+01 2.02499895e+02 4.72000825e+01 2.02499899e+02 4.72001485e+01 2.02494624e+02 4.71968539e+01 2.02494576e+02 4.71968553e+01 2.02494574e+02 4.71968223e+01 2.02494621e+02 4.71968215e+01 2.02494624e+02 4.71968539e+01 2.02492230e+02 4.71953583e+01 2.02492190e+02 4.71953649e+01 2.02492162e+02 4.71953161e+01 2.02492259e+02 4.71953133e+01 2.02492230e+02 4.71953583e+01 2.02491786e+02 4.71950813e+01 2.02491689e+02 4.71950840e+01 2.02491451e+02 4.71949350e+01 2.02491090e+02 4.71949453e+01 2.02490993e+02 4.71949481e+01 2.02490646e+02 4.71948792e+01 2.02490515e+02 4.71946500e+01 2.02490537e+02 4.71945998e+01 2.02490585e+02 4.71945984e+01 2.02490988e+02 4.71945826e+01 2.02491077e+02 4.71945606e+01 2.02491305e+02 4.71947171e+01 2.02491544e+02 4.71948662e+01 2.02491751e+02 4.71950382e+01 2.02491786e+02 4.71950813e+01 2.02487861e+02 4.71926287e+01 2.02487722e+02 4.71928098e+01 2.02487724e+02 4.71928428e+01 2.02487830e+02 4.71930560e+01 2.02488071e+02 4.71930596e+01 2.02488117e+02 4.71928435e+01 2.02488113e+02 4.71927867e+01 2.02487970e+02 4.71926268e+01 2.02487861e+02 4.71926287e+01 2.02471658e+02 4.71825024e+01 2.02471526e+02 4.71826558e+01 2.02471530e+02 4.71827219e+01 2.02471286e+02 4.71828681e+01 2.02471092e+02 4.71830460e+01 2.02471222e+02 4.71832060e+01 2.02471342e+02 4.71832026e+01 2.02471680e+02 4.71831930e+01 2.02471925e+02 4.71832679e+01 2.02471795e+02 4.71831079e+01 2.02471781e+02 4.71828785e+01 2.02472125e+02 4.71827947e+01 2.02472110e+02 4.71825495e+01 2.02471872e+02 4.71824005e+01 2.02471658e+02 4.71825024e+01 2.02463991e+02 4.71777087e+01 2.02464054e+02 4.71777676e+01 2.02464085e+02 4.71780670e+01 2.02463680e+02 4.71781129e+01 2.02463583e+02 4.71781157e+01 2.02463373e+02 4.71782198e+01 2.02462987e+02 4.71782308e+01 2.02463005e+02 4.71779896e+01 2.02463374e+02 4.71779216e+01 2.02463421e+02 4.71776515e+01 2.02463712e+02 4.71775342e+01 2.02463939e+02 4.71775278e+01 2.02463991e+02 4.71777087e+01 2.02490110e+02 4.71943333e+01 2.02490038e+02 4.71943519e+01 2.02490060e+02 4.71943017e+01 2.02490108e+02 4.71943003e+01 2.02490110e+02 4.71943333e+01 2.02474963e+02 4.71848677e+01 2.02474685e+02 4.71848756e+01 2.02474674e+02 4.71846870e+01 2.02474666e+02 4.71845645e+01 2.02474439e+02 4.71844068e+01 2.02474235e+02 4.71844126e+01 2.02474145e+02 4.71846241e+01 2.02474173e+02 4.71846730e+01 2.02474076e+02 4.71846757e+01 2.02473809e+02 4.71847447e+01 2.02473541e+02 4.71848767e+01 2.02473553e+02 4.71850621e+01 2.02473791e+02 4.71852112e+01 2.02474064e+02 4.71852034e+01 2.02474227e+02 4.71852145e+01 2.02474526e+02 4.71853188e+01 2.02474489e+02 4.71854691e+01 2.02474316e+02 4.71854740e+01 2.02473966e+02 4.71854416e+01 2.02473739e+02 4.71855984e+01 2.02473647e+02 4.71858403e+01 2.02473654e+02 4.71859629e+01 2.02473618e+02 4.71861213e+01 2.02473502e+02 4.71863482e+01 2.02473497e+02 4.71864042e+01 2.02473635e+02 4.71864310e+01 2.02473902e+02 4.71862990e+01 2.02474131e+02 4.71862610e+01 2.02474406e+02 4.71863146e+01 2.02474391e+02 4.71860695e+01 2.02474420e+02 4.71860245e+01 2.02474460e+02 4.71860179e+01 2.02474870e+02 4.71860063e+01 2.02474982e+02 4.71857775e+01 2.02475110e+02 4.71855583e+01 2.02475481e+02 4.71854906e+01 2.02475756e+02 4.71853632e+01 2.02475687e+02 4.71851117e+01 2.02475382e+02 4.71850117e+01 2.02475143e+02 4.71848626e+01 2.02474963e+02 4.71848677e+01 2.02503373e+02 4.72029159e+01 2.02503436e+02 4.72029973e+01 2.02503662e+02 4.72031555e+01 2.02503768e+02 4.72031627e+01 2.02503878e+02 4.72029958e+01 2.02503524e+02 4.72029320e+01 2.02503373e+02 4.72029159e+01 2.02502644e+02 4.72024609e+01 2.02502653e+02 4.72026000e+01 2.02502893e+02 4.72026163e+01 2.02502947e+02 4.72023825e+01 2.02502644e+02 4.72024609e+01 2.02500151e+02 4.72009040e+01 2.02500102e+02 4.72009054e+01 2.02500075e+02 4.72008566e+01 2.02500172e+02 4.72008538e+01 2.02500151e+02 4.72009040e+01 2.02499793e+02 4.72006805e+01 2.02499582e+02 4.72006393e+01 2.02499504e+02 4.72004998e+01 2.02499781e+02 4.72004919e+01 2.02499793e+02 4.72006805e+01 2.02493452e+02 4.71967198e+01 2.02493242e+02 4.71968879e+01 2.02493024e+02 4.71970510e+01 2.02492936e+02 4.71972954e+01 2.02492582e+02 4.71973525e+01 2.02492710e+02 4.71971540e+01 2.02492994e+02 4.71970319e+01 2.02493174e+02 4.71968458e+01 2.02493159e+02 4.71966006e+01 2.02493180e+02 4.71965504e+01 2.02493229e+02 4.71965490e+01 2.02493451e+02 4.71967103e+01 2.02493452e+02 4.71967198e+01 2.02492853e+02 4.71963461e+01 2.02492572e+02 4.71963838e+01 2.02492443e+02 4.71961535e+01 2.02492163e+02 4.71962141e+01 2.02491938e+02 4.71963723e+01 2.02491698e+02 4.71963791e+01 2.02491688e+02 4.71962163e+01 2.02491984e+02 4.71961020e+01 2.02492075e+02 4.71958602e+01 2.02492348e+02 4.71958983e+01 2.02492513e+02 4.71961019e+01 2.02492843e+02 4.71961833e+01 2.02492853e+02 4.71963461e+01 2.02481661e+02 4.71893529e+01 2.02481383e+02 4.71893608e+01 2.02481203e+02 4.71893660e+01 2.02481268e+02 4.71894460e+01 2.02481492e+02 4.71896057e+01 2.02481629e+02 4.71896325e+01 2.02481942e+02 4.71895291e+01 2.02481927e+02 4.71892840e+01 2.02481661e+02 4.71893529e+01 2.02475121e+02 4.71852658e+01 2.02475044e+02 4.71852614e+01 2.02474803e+02 4.71851144e+01 2.02474799e+02 4.71850648e+01 2.02474873e+02 4.71850627e+01 2.02475175e+02 4.71851644e+01 2.02475121e+02 4.71852658e+01 2.02464651e+02 4.71787202e+01 2.02464540e+02 4.71789497e+01 2.02464363e+02 4.71791382e+01 2.02464117e+02 4.71792836e+01 2.02464106e+02 4.71793556e+01 2.02464120e+02 4.71795850e+01 2.02463912e+02 4.71797539e+01 2.02463651e+02 4.71798902e+01 2.02463704e+02 4.71799783e+01 2.02463888e+02 4.71801676e+01 2.02463854e+02 4.71803164e+01 2.02463928e+02 4.71804631e+01 2.02463998e+02 4.71807055e+01 2.02463986e+02 4.71807453e+01 2.02464055e+02 4.71810195e+01 2.02464053e+02 4.71810388e+01 2.02463846e+02 4.71812088e+01 2.02463618e+02 4.71813656e+01 2.02463399e+02 4.71815277e+01 2.02463358e+02 4.71815343e+01 2.02462955e+02 4.71815069e+01 2.02462714e+02 4.71813597e+01 2.02462643e+02 4.71813541e+01 2.02462245e+02 4.71814045e+01 2.02462018e+02 4.71815623e+01 2.02461985e+02 4.71815732e+01 2.02461576e+02 4.71815848e+01 2.02461527e+02 4.71815862e+01 2.02461189e+02 4.71816422e+01 2.02460924e+02 4.71817756e+01 2.02460830e+02 4.71820160e+01 2.02460566e+02 4.71821506e+01 2.02460594e+02 4.71822752e+01 2.02460645e+02 4.71824990e+01 2.02460606e+02 4.71825922e+01 2.02460786e+02 4.71825871e+01 2.02460865e+02 4.71824007e+01 2.02460886e+02 4.71823505e+01 2.02461080e+02 4.71821726e+01 2.02461146e+02 4.71821928e+01 2.02461416e+02 4.71823190e+01 2.02461651e+02 4.71824701e+01 2.02461658e+02 4.71825341e+01 2.02461561e+02 4.71825369e+01 2.02461200e+02 4.71825471e+01 2.02461302e+02 4.71827284e+01 2.02461313e+02 4.71829170e+01 2.02461363e+02 4.71830087e+01 2.02461595e+02 4.71830932e+01 2.02461678e+02 4.71828455e+01 2.02462046e+02 4.71827769e+01 2.02462096e+02 4.71827924e+01 2.02462097e+02 4.71828083e+01 2.02462056e+02 4.71830820e+01 2.02461671e+02 4.71831406e+01 2.02461443e+02 4.71832974e+01 2.02461380e+02 4.71835572e+01 2.02461160e+02 4.71834834e+01 2.02460904e+02 4.71833477e+01 2.02460710e+02 4.71831654e+01 2.02460488e+02 4.71830043e+01 2.02460466e+02 4.71829858e+01 2.02460384e+02 4.71827559e+01 2.02460093e+02 4.71826455e+01 2.02459895e+02 4.71824666e+01 2.02459804e+02 4.71822725e+01 2.02459777e+02 4.71822287e+01 2.02459600e+02 4.71820338e+01 2.02459353e+02 4.71819901e+01 2.02459192e+02 4.71820104e+01 2.02458848e+02 4.71819737e+01 2.02458817e+02 4.71819621e+01 2.02458530e+02 4.71818486e+01 2.02458258e+02 4.71817247e+01 2.02458037e+02 4.71815626e+01 2.02457799e+02 4.71814126e+01 2.02457505e+02 4.71813048e+01 2.02457477e+02 4.71811166e+01 2.02457765e+02 4.71809969e+01 2.02457904e+02 4.71807847e+01 2.02457893e+02 4.71806931e+01 2.02458018e+02 4.71805569e+01 2.02458211e+02 4.71803783e+01 2.02458398e+02 4.71803202e+01 2.02458476e+02 4.71805443e+01 2.02458422e+02 4.71806279e+01 2.02458537e+02 4.71805821e+01 2.02458821e+02 4.71804607e+01 2.02458811e+02 4.71803401e+01 2.02458902e+02 4.71802120e+01 2.02458810e+02 4.71800160e+01 2.02458858e+02 4.71798854e+01 2.02459102e+02 4.71797383e+01 2.02459282e+02 4.71795516e+01 2.02459570e+02 4.71794329e+01 2.02459741e+02 4.71792403e+01 2.02459950e+02 4.71790716e+01 2.02460221e+02 4.71789419e+01 2.02460378e+02 4.71787411e+01 2.02460607e+02 4.71785847e+01 2.02460872e+02 4.71784511e+01 2.02461091e+02 4.71782889e+01 2.02461321e+02 4.71781336e+01 2.02461472e+02 4.71780489e+01 2.02461479e+02 4.71782325e+01 2.02461518e+02 4.71783406e+01 2.02461593e+02 4.71783041e+01 2.02461666e+02 4.71782313e+01 2.02461649e+02 4.71780398e+01 2.02461886e+02 4.71778884e+01 2.02462084e+02 4.71779219e+01 2.02462449e+02 4.71779776e+01 2.02462518e+02 4.71782521e+01 2.02462866e+02 4.71783201e+01 2.02463047e+02 4.71783150e+01 2.02463324e+02 4.71783072e+01 2.02463450e+02 4.71782684e+01 2.02463831e+02 4.71782576e+01 2.02464056e+02 4.71783478e+01 2.02464122e+02 4.71783680e+01 2.02464507e+02 4.71784091e+01 2.02464628e+02 4.71786447e+01 2.02464651e+02 4.71787202e+01 2.02462621e+02 4.71774502e+01 2.02462443e+02 4.71776386e+01 2.02462012e+02 4.71776502e+01 2.02462089e+02 4.71774171e+01 2.02462339e+02 4.71772740e+01 2.02462640e+02 4.71771865e+01 2.02462621e+02 4.71774502e+01 2.02497872e+02 4.71997799e+01 2.02497639e+02 4.71999333e+01 2.02497408e+02 4.71999685e+01 2.02497114e+02 4.71998603e+01 2.02496973e+02 4.71996387e+01 2.02496922e+02 4.71994856e+01 2.02496883e+02 4.71993800e+01 2.02496936e+02 4.71991950e+01 2.02497166e+02 4.71991712e+01 2.02497385e+02 4.71993348e+01 2.02497441e+02 4.71995106e+01 2.02497490e+02 4.71995825e+01 2.02497645e+02 4.71996383e+01 2.02497793e+02 4.71996834e+01 2.02497872e+02 4.71997799e+01 2.02490507e+02 4.71951792e+01 2.02490295e+02 4.71951380e+01 2.02490266e+02 4.71950286e+01 2.02490495e+02 4.71949906e+01 2.02490507e+02 4.71951792e+01 2.02476577e+02 4.71864749e+01 2.02476592e+02 4.71867200e+01 2.02476859e+02 4.71866511e+01 2.02476938e+02 4.71864647e+01 2.02476577e+02 4.71864749e+01 2.02470138e+02 4.71824497e+01 2.02470040e+02 4.71824524e+01 2.02470062e+02 4.71824022e+01 2.02470110e+02 4.71824008e+01 2.02470138e+02 4.71824497e+01 2.02465039e+02 4.71792620e+01 2.02464658e+02 4.71792728e+01 2.02464640e+02 4.71790123e+01 2.02464995e+02 4.71790242e+01 2.02465039e+02 4.71792620e+01 2.02502011e+02 4.72026636e+01 2.02501987e+02 4.72027666e+01 2.02502167e+02 4.72027615e+01 2.02502131e+02 4.72026602e+01 2.02502011e+02 4.72026636e+01 2.02500454e+02 4.72016912e+01 2.02500356e+02 4.72016940e+01 2.02500149e+02 4.72015220e+01 2.02500114e+02 4.72014789e+01 2.02500211e+02 4.72014761e+01 2.02500426e+02 4.72016424e+01 2.02500454e+02 4.72016912e+01 2.02497823e+02 4.72003472e+01 2.02497751e+02 4.72003658e+01 2.02497512e+02 4.72002168e+01 2.02497511e+02 4.72001526e+01 2.02497582e+02 4.72001652e+01 2.02497821e+02 4.72003142e+01 2.02497823e+02 4.72003472e+01 2.02495269e+02 4.71987523e+01 2.02495280e+02 4.71989377e+01 2.02495288e+02 4.71990634e+01 2.02495329e+02 4.71992270e+01 2.02495313e+02 4.71993782e+01 2.02495364e+02 4.71995268e+01 2.02495414e+02 4.71997405e+01 2.02495387e+02 4.71998353e+01 2.02495336e+02 4.71999907e+01 2.02495154e+02 4.72000073e+01 2.02494847e+02 4.71999842e+01 2.02494678e+02 4.72000333e+01 2.02494529e+02 4.72000847e+01 2.02494188e+02 4.72000704e+01 2.02494200e+02 4.71998797e+01 2.02494502e+02 4.71997691e+01 2.02494401e+02 4.71995879e+01 2.02494437e+02 4.71994294e+01 2.02494426e+02 4.71992439e+01 2.02494082e+02 4.71992073e+01 2.02493888e+02 4.71993853e+01 2.02493790e+02 4.71993880e+01 2.02493786e+02 4.71993220e+01 2.02493685e+02 4.71991407e+01 2.02493491e+02 4.71989589e+01 2.02493147e+02 4.71989223e+01 2.02493098e+02 4.71989237e+01 2.02492682e+02 4.71989311e+01 2.02492646e+02 4.71989321e+01 2.02492625e+02 4.71988958e+01 2.02492832e+02 4.71987258e+01 2.02492702e+02 4.71985659e+01 2.02492468e+02 4.71984135e+01 2.02492263e+02 4.71983706e+01 2.02492078e+02 4.71983759e+01 2.02491905e+02 4.71981785e+01 2.02491903e+02 4.71981455e+01 2.02491820e+02 4.71979156e+01 2.02491624e+02 4.71977355e+01 2.02491645e+02 4.71976853e+01 2.02491562e+02 4.71974554e+01 2.02491218e+02 4.71974188e+01 2.02491178e+02 4.71974145e+01 2.02491168e+02 4.71973872e+01 2.02491157e+02 4.71971044e+01 2.02491162e+02 4.71970842e+01 2.02491073e+02 4.71968409e+01 2.02491082e+02 4.71967354e+01 2.02491236e+02 4.71967204e+01 2.02491405e+02 4.71969211e+01 2.02491410e+02 4.71969403e+01 2.02491428e+02 4.71972294e+01 2.02491740e+02 4.71973244e+01 2.02492013e+02 4.71973166e+01 2.02492244e+02 4.71971618e+01 2.02492355e+02 4.71971948e+01 2.02492519e+02 4.71973339e+01 2.02492565e+02 4.71973653e+01 2.02492644e+02 4.71974116e+01 2.02492852e+02 4.71974784e+01 2.02493213e+02 4.71974681e+01 2.02493279e+02 4.71974883e+01 2.02493289e+02 4.71975155e+01 2.02493189e+02 4.71977522e+01 2.02493110e+02 4.71979386e+01 2.02493114e+02 4.71980046e+01 2.02493216e+02 4.71981859e+01 2.02493454e+02 4.71983350e+01 2.02493729e+02 4.71983885e+01 2.02493973e+02 4.71982422e+01 2.02494022e+02 4.71982408e+01 2.02494260e+02 4.71983898e+01 2.02494611e+02 4.71984559e+01 2.02494894e+02 4.71985726e+01 2.02495028e+02 4.71986017e+01 2.02495301e+02 4.71985968e+01 2.02495269e+02 4.71987523e+01 2.02474436e+02 4.71857354e+01 2.02474407e+02 4.71857322e+01 2.02474400e+02 4.71857124e+01 2.02474435e+02 4.71857114e+01 2.02474436e+02 4.71857354e+01 2.02464983e+02 4.71798252e+01 2.02464667e+02 4.71799269e+01 2.02464446e+02 4.71800878e+01 2.02464434e+02 4.71800894e+01 2.02464417e+02 4.71800696e+01 2.02464636e+02 4.71799075e+01 2.02464749e+02 4.71796789e+01 2.02464999e+02 4.71796718e+01 2.02464983e+02 4.71798252e+01 2.02500969e+02 4.72026116e+01 2.02501100e+02 4.72027716e+01 2.02501070e+02 4.72029735e+01 2.02500776e+02 4.72030107e+01 2.02500531e+02 4.72029359e+01 2.02500311e+02 4.72030980e+01 2.02500238e+02 4.72030836e+01 2.02500007e+02 4.72029288e+01 2.02499972e+02 4.72028857e+01 2.02500045e+02 4.72029001e+01 2.02500455e+02 4.72028884e+01 2.02500438e+02 4.72026103e+01 2.02500176e+02 4.72024785e+01 2.02500205e+02 4.72024335e+01 2.02500269e+02 4.72024096e+01 2.02500484e+02 4.72025759e+01 2.02500894e+02 4.72025641e+01 2.02500965e+02 4.72025456e+01 2.02500969e+02 4.72026116e+01 2.02500254e+02 4.72021645e+01 2.02500187e+02 4.72021443e+01 2.02500186e+02 4.72021223e+01 2.02500249e+02 4.72020985e+01 2.02500254e+02 4.72021645e+01 2.02496685e+02 4.71999360e+01 2.02496594e+02 4.71999190e+01 2.02496602e+02 4.71998841e+01 2.02496653e+02 4.71998758e+01 2.02496685e+02 4.71999360e+01 2.02467100e+02 4.71814481e+01 2.02466993e+02 4.71814511e+01 2.02466786e+02 4.71812788e+01 2.02466774e+02 4.71812444e+01 2.02466863e+02 4.71812223e+01 2.02467130e+02 4.71813499e+01 2.02467100e+02 4.71814481e+01 2.02462088e+02 4.71783139e+01 2.02462042e+02 4.71785845e+01 2.02461883e+02 4.71787211e+01 2.02461887e+02 4.71787871e+01 2.02461989e+02 4.71789684e+01 2.02462138e+02 4.71789437e+01 2.02462133e+02 4.71788620e+01 2.02462119e+02 4.71786326e+01 2.02462369e+02 4.71784901e+01 2.02462448e+02 4.71783037e+01 2.02462088e+02 4.71783139e+01 2.02496668e+02 4.72002244e+01 2.02496633e+02 4.72002155e+01 2.02496617e+02 4.72001928e+01 2.02496689e+02 4.72001742e+01 2.02496668e+02 4.72002244e+01 2.02474871e+02 4.71866053e+01 2.02474847e+02 4.71867083e+01 2.02475027e+02 4.71867031e+01 2.02475020e+02 4.71865806e+01 2.02474871e+02 4.71866053e+01 2.02501102e+02 4.72032926e+01 2.02500825e+02 4.72033006e+01 2.02500813e+02 4.72031120e+01 2.02501046e+02 4.72031368e+01 2.02501102e+02 4.72032926e+01 2.02490718e+02 4.71968071e+01 2.02490682e+02 4.71968047e+01 2.02490642e+02 4.71967593e+01 2.02490712e+02 4.71967828e+01 2.02490718e+02 4.71968071e+01 2.02466632e+02 4.71817538e+01 2.02466562e+02 4.71817693e+01 2.02466557e+02 4.71817072e+01 2.02466640e+02 4.71817118e+01 2.02466632e+02 4.71817538e+01 2.02465664e+02 4.71811487e+01 2.02465645e+02 4.71811460e+01 2.02465643e+02 4.71811355e+01 2.02465658e+02 4.71811363e+01 2.02465664e+02 4.71811487e+01 2.02501002e+02 4.72035293e+01 2.02500808e+02 4.72037072e+01 2.02500711e+02 4.72037100e+01 2.02500350e+02 4.72037203e+01 2.02500284e+02 4.72037002e+01 2.02500249e+02 4.72036571e+01 2.02500234e+02 4.72034119e+01 2.02500255e+02 4.72033617e+01 2.02500327e+02 4.72033431e+01 2.02500652e+02 4.72034283e+01 2.02500926e+02 4.72034818e+01 2.02501023e+02 4.72034790e+01 2.02501002e+02 4.72035293e+01 2.02498164e+02 4.72017567e+01 2.02498066e+02 4.72017595e+01 2.02497770e+02 4.72016531e+01 2.02497735e+02 4.72014888e+01 2.02498027e+02 4.72014632e+01 2.02498237e+02 4.72016334e+01 2.02498164e+02 4.72017567e+01 2.02461191e+02 4.71786510e+01 2.02461344e+02 4.71787940e+01 2.02461327e+02 4.71790352e+01 2.02460965e+02 4.71791084e+01 2.02460817e+02 4.71793149e+01 2.02460895e+02 4.71794510e+01 2.02460942e+02 4.71796920e+01 2.02460805e+02 4.71798426e+01 2.02461009e+02 4.71800175e+01 2.02461421e+02 4.71800386e+01 2.02461502e+02 4.71800425e+01 2.02461513e+02 4.71799705e+01 2.02461428e+02 4.71797081e+01 2.02461398e+02 4.71796781e+01 2.02461370e+02 4.71794252e+01 2.02461392e+02 4.71793749e+01 2.02461611e+02 4.71792129e+01 2.02461594e+02 4.71789347e+01 2.02461567e+02 4.71788859e+01 2.02461386e+02 4.71787633e+01 2.02461191e+02 4.71786510e+01 2.02496746e+02 4.72011703e+01 2.02496668e+02 4.72011658e+01 2.02496655e+02 4.72011139e+01 2.02496742e+02 4.72011114e+01 2.02496746e+02 4.72011703e+01 2.02495748e+02 4.72005473e+01 2.02495744e+02 4.72005474e+01 2.02495371e+02 4.72004980e+01 2.02495384e+02 4.72003201e+01 2.02495620e+02 4.72003134e+01 2.02495749e+02 4.72005437e+01 2.02495748e+02 4.72005473e+01 2.02477520e+02 4.71891590e+01 2.02477580e+02 4.71892433e+01 2.02477708e+02 4.71892765e+01 2.02477701e+02 4.71891539e+01 2.02477520e+02 4.71891590e+01 2.02473990e+02 4.71869522e+01 2.02473950e+02 4.71870454e+01 2.02474131e+02 4.71870403e+01 2.02474210e+02 4.71868539e+01 2.02473990e+02 4.71869522e+01 2.02499656e+02 4.72032867e+01 2.02499517e+02 4.72032906e+01 2.02499532e+02 4.72032092e+01 2.02499631e+02 4.72032064e+01 2.02499656e+02 4.72032867e+01 2.02493430e+02 4.71993983e+01 2.02493356e+02 4.71993839e+01 2.02493354e+02 4.71993509e+01 2.02493426e+02 4.71993323e+01 2.02493430e+02 4.71993983e+01 2.02490050e+02 4.71972870e+01 2.02490035e+02 4.71972830e+01 2.02490033e+02 4.71972767e+01 2.02490044e+02 4.71972764e+01 2.02490050e+02 4.71972870e+01 2.02470416e+02 4.71850173e+01 2.02470421e+02 4.71850991e+01 2.02470572e+02 4.71851152e+01 2.02470565e+02 4.71849926e+01 2.02470416e+02 4.71850173e+01 2.02465322e+02 4.71818328e+01 2.02465149e+02 4.71818377e+01 2.02465142e+02 4.71817200e+01 2.02465281e+02 4.71817403e+01 2.02465322e+02 4.71818328e+01 2.02492946e+02 4.71993956e+01 2.02492752e+02 4.71995736e+01 2.02492686e+02 4.71995534e+01 2.02492676e+02 4.71995261e+01 2.02492666e+02 4.71992433e+01 2.02492664e+02 4.71992192e+01 2.02492699e+02 4.71992182e+01 2.02492944e+02 4.71993626e+01 2.02492946e+02 4.71993956e+01 2.02491753e+02 4.71986504e+01 2.02491705e+02 4.71986518e+01 2.02491295e+02 4.71986635e+01 2.02491224e+02 4.71986821e+01 2.02491245e+02 4.71986319e+01 2.02491464e+02 4.71984697e+01 2.02491513e+02 4.71984683e+01 2.02491751e+02 4.71986174e+01 2.02491753e+02 4.71986504e+01 2.02486934e+02 4.71956395e+01 2.02486783e+02 4.71957813e+01 2.02487019e+02 4.71956927e+01 2.02487129e+02 4.71955259e+01 2.02486934e+02 4.71956395e+01 2.02468248e+02 4.71839610e+01 2.02468252e+02 4.71840988e+01 2.02468445e+02 4.71840846e+01 2.02468389e+02 4.71839979e+01 2.02468248e+02 4.71839610e+01 2.02465861e+02 4.71824688e+01 2.02465657e+02 4.71824385e+01 2.02465672e+02 4.71823509e+01 2.02465767e+02 4.71823571e+01 2.02465861e+02 4.71824688e+01 2.02493434e+02 4.71999996e+01 2.02493402e+02 4.72000005e+01 2.02493392e+02 4.71999732e+01 2.02493441e+02 4.71999719e+01 2.02493434e+02 4.71999996e+01 2.02488901e+02 4.71971677e+01 2.02488838e+02 4.71971916e+01 2.02488859e+02 4.71971414e+01 2.02488900e+02 4.71971457e+01 2.02488901e+02 4.71971677e+01 2.02469707e+02 4.71851728e+01 2.02469628e+02 4.71853592e+01 2.02469848e+02 4.71852609e+01 2.02469888e+02 4.71851677e+01 2.02469707e+02 4.71851728e+01 2.02468898e+02 4.71846668e+01 2.02468913e+02 4.71849120e+01 2.02469180e+02 4.71848430e+01 2.02469172e+02 4.71847204e+01 2.02468898e+02 4.71846668e+01 2.02485660e+02 4.71954418e+01 2.02485671e+02 4.71956273e+01 2.02485910e+02 4.71957763e+01 2.02486183e+02 4.71957685e+01 2.02486171e+02 4.71955831e+01 2.02485933e+02 4.71954340e+01 2.02485660e+02 4.71954418e+01 2.02461920e+02 4.71806029e+01 2.02461893e+02 4.71806651e+01 2.02461998e+02 4.71806519e+01 2.02462009e+02 4.71805799e+01 2.02461920e+02 4.71806029e+01 2.02500163e+02 4.72048002e+01 2.02500091e+02 4.72048187e+01 2.02500121e+02 4.72047738e+01 2.02500153e+02 4.72047729e+01 2.02500163e+02 4.72048002e+01 2.02493412e+02 4.72005838e+01 2.02493073e+02 4.72005693e+01 2.02492824e+02 4.72004274e+01 2.02492826e+02 4.72002177e+01 2.02493134e+02 4.72001984e+01 2.02493362e+02 4.72003554e+01 2.02493412e+02 4.72005838e+01 2.02489591e+02 4.71981974e+01 2.02489210e+02 4.71982178e+01 2.02489120e+02 4.71979592e+01 2.02489116e+02 4.71979004e+01 2.02489203e+02 4.71978979e+01 2.02489589e+02 4.71979375e+01 2.02489591e+02 4.71981974e+01 2.02468366e+02 4.71849325e+01 2.02468351e+02 4.71850019e+01 2.02468365e+02 4.71852314e+01 2.02468255e+02 4.71853982e+01 2.02468490e+02 4.71853097e+01 2.02468860e+02 4.71852417e+01 2.02468843e+02 4.71849636e+01 2.02468581e+02 4.71848317e+01 2.02468366e+02 4.71849325e+01 2.02464310e+02 4.71823969e+01 2.02463947e+02 4.71824693e+01 2.02463881e+02 4.71824491e+01 2.02463884e+02 4.71824298e+01 2.02463869e+02 4.71821327e+01 2.02463870e+02 4.71821220e+01 2.02463895e+02 4.71821140e+01 2.02464264e+02 4.71821662e+01 2.02464310e+02 4.71823969e+01 2.02492477e+02 4.72002992e+01 2.02492094e+02 4.72003166e+01 2.02491966e+02 4.72000856e+01 2.02491820e+02 4.71998885e+01 2.02492145e+02 4.71999537e+01 2.02492462e+02 4.72000448e+01 2.02492477e+02 4.72002992e+01 2.02477780e+02 4.71911164e+01 2.02477881e+02 4.71912977e+01 2.02478156e+02 4.71913513e+01 2.02478011e+02 4.71912019e+01 2.02477780e+02 4.71911164e+01 2.02465766e+02 4.71836061e+01 2.02465382e+02 4.71836653e+01 2.02465315e+02 4.71836672e+01 2.02465312e+02 4.71836216e+01 2.02465413e+02 4.71833859e+01 2.02465731e+02 4.71833592e+01 2.02465766e+02 4.71836061e+01 2.02494510e+02 4.72018681e+01 2.02494393e+02 4.72018715e+01 2.02494401e+02 4.72017997e+01 2.02494505e+02 4.72017883e+01 2.02494510e+02 4.72018681e+01 2.02493577e+02 4.72012850e+01 2.02493372e+02 4.72013240e+01 2.02493335e+02 4.72011341e+01 2.02493593e+02 4.72011608e+01 2.02493577e+02 4.72012850e+01 2.02461522e+02 4.71812516e+01 2.02461401e+02 4.71813544e+01 2.02461745e+02 4.71813911e+01 2.02461629e+02 4.71811854e+01 2.02461522e+02 4.71812516e+01 2.02498232e+02 4.72044915e+01 2.02497913e+02 4.72044761e+01 2.02497837e+02 4.72042448e+01 2.02498198e+02 4.72042657e+01 2.02498232e+02 4.72044915e+01 2.02502388e+02 4.72073860e+01 2.02502317e+02 4.72074046e+01 2.02502097e+02 4.72075030e+01 2.02501729e+02 4.72075136e+01 2.02501620e+02 4.72072687e+01 2.02501616e+02 4.72072027e+01 2.02501713e+02 4.72071999e+01 2.02502074e+02 4.72071896e+01 2.02502171e+02 4.72071868e+01 2.02502410e+02 4.72073358e+01 2.02502388e+02 4.72073860e+01 2.02497277e+02 4.72041942e+01 2.02496977e+02 4.72041919e+01 2.02496928e+02 4.72039761e+01 2.02497264e+02 4.72039800e+01 2.02497277e+02 4.72041942e+01 2.02500779e+02 4.72066800e+01 2.02500585e+02 4.72067322e+01 2.02500573e+02 4.72065518e+01 2.02500773e+02 4.72065927e+01 2.02500779e+02 4.72066800e+01 2.02499535e+02 4.72059036e+01 2.02499495e+02 4.72059103e+01 2.02499502e+02 4.72058825e+01 2.02499542e+02 4.72058759e+01 2.02499535e+02 4.72059036e+01 2.02496063e+02 4.72037350e+01 2.02495779e+02 4.72037754e+01 2.02495561e+02 4.72037206e+01 2.02495466e+02 4.72039609e+01 2.02495489e+02 4.72039899e+01 2.02495442e+02 4.72042447e+01 2.02495132e+02 4.72042536e+01 2.02494961e+02 4.72040544e+01 2.02494901e+02 4.72039067e+01 2.02495079e+02 4.72037192e+01 2.02495362e+02 4.72035968e+01 2.02495525e+02 4.72033994e+01 2.02495840e+02 4.72034052e+01 2.02496040e+02 4.72035829e+01 2.02496063e+02 4.72037350e+01 2.02489354e+02 4.71998439e+01 2.02489183e+02 4.71998649e+01 2.02488825e+02 4.71998039e+01 2.02488814e+02 4.71995063e+01 2.02489252e+02 4.71994885e+01 2.02489348e+02 4.71997430e+01 2.02489354e+02 4.71998439e+01 2.02458956e+02 4.71808442e+01 2.02458812e+02 4.71809899e+01 2.02459138e+02 4.71810741e+01 2.02459227e+02 4.71810136e+01 2.02459393e+02 4.71808860e+01 2.02459026e+02 4.71808318e+01 2.02458956e+02 4.71808442e+01 2.02501539e+02 4.72077528e+01 2.02501400e+02 4.72077568e+01 2.02501322e+02 4.72076173e+01 2.02501599e+02 4.72076094e+01 2.02501539e+02 4.72077528e+01 2.02500324e+02 4.72069941e+01 2.02500250e+02 4.72069797e+01 2.02500248e+02 4.72069467e+01 2.02500320e+02 4.72069281e+01 2.02500324e+02 4.72069941e+01 2.02495772e+02 4.72041517e+01 2.02495701e+02 4.72041584e+01 2.02495583e+02 4.72040337e+01 2.02495776e+02 4.72041034e+01 2.02495772e+02 4.72041517e+01 2.02491780e+02 4.72016588e+01 2.02491567e+02 4.72016820e+01 2.02491600e+02 4.72015463e+01 2.02491746e+02 4.72015501e+01 2.02491780e+02 4.72016588e+01 2.02466349e+02 4.71857663e+01 2.02466310e+02 4.71858595e+01 2.02466249e+02 4.71860030e+01 2.02466267e+02 4.71862164e+01 2.02466637e+02 4.71862454e+01 2.02466822e+02 4.71860622e+01 2.02466807e+02 4.71858171e+01 2.02466569e+02 4.71856680e+01 2.02466349e+02 4.71857663e+01 2.02502298e+02 4.72085261e+01 2.02502135e+02 4.72085150e+01 2.02502057e+02 4.72083755e+01 2.02502335e+02 4.72083676e+01 2.02502298e+02 4.72085261e+01 2.02500820e+02 4.72076033e+01 2.02500723e+02 4.72076061e+01 2.02500719e+02 4.72075401e+01 2.02500793e+02 4.72075545e+01 2.02500820e+02 4.72076033e+01 2.02499459e+02 4.72067531e+01 2.02499228e+02 4.72067583e+01 2.02499262e+02 4.72066300e+01 2.02499449e+02 4.72065953e+01 2.02499459e+02 4.72067531e+01 2.02496262e+02 4.72050558e+01 2.02496067e+02 4.72052334e+01 2.02496011e+02 4.72052311e+01 2.02495933e+02 4.72051498e+01 2.02496249e+02 4.72050479e+01 2.02496261e+02 4.72050464e+01 2.02496262e+02 4.72050558e+01 2.02495864e+02 4.72048072e+01 2.02495698e+02 4.72048119e+01 2.02495703e+02 4.72047070e+01 2.02495837e+02 4.72047093e+01 2.02495864e+02 4.72048072e+01 2.02490827e+02 4.72016616e+01 2.02490710e+02 4.72016650e+01 2.02490705e+02 4.72015851e+01 2.02490822e+02 4.72015818e+01 2.02490827e+02 4.72016616e+01 2.02502052e+02 4.72089708e+01 2.02502068e+02 4.72092159e+01 2.02502072e+02 4.72092820e+01 2.02502173e+02 4.72094632e+01 2.02502075e+02 4.72095831e+01 2.02501830e+02 4.72097294e+01 2.02501609e+02 4.72098901e+01 2.02501410e+02 4.72100655e+01 2.02501168e+02 4.72102135e+01 2.02501002e+02 4.72104086e+01 2.02500833e+02 4.72104540e+01 2.02500760e+02 4.72102575e+01 2.02501112e+02 4.72101784e+01 2.02501097e+02 4.72099333e+01 2.02500882e+02 4.72097671e+01 2.02500514e+02 4.72097133e+01 2.02500329e+02 4.72096895e+01 2.02500123e+02 4.72096770e+01 2.02500132e+02 4.72095664e+01 2.02500054e+02 4.72094027e+01 2.02500025e+02 4.72092006e+01 2.02500381e+02 4.72091605e+01 2.02500510e+02 4.72092040e+01 2.02500722e+02 4.72090372e+01 2.02501035e+02 4.72089338e+01 2.02501254e+02 4.72087716e+01 2.02501351e+02 4.72087689e+01 2.02501712e+02 4.72087585e+01 2.02501779e+02 4.72087787e+01 2.02502048e+02 4.72089048e+01 2.02502052e+02 4.72089708e+01 2.02463341e+02 4.71847836e+01 2.02462986e+02 4.71847371e+01 2.02462871e+02 4.71844962e+01 2.02462855e+02 4.71844793e+01 2.02462896e+02 4.71844782e+01 2.02463314e+02 4.71844946e+01 2.02463341e+02 4.71847836e+01 2.02493664e+02 4.72040316e+01 2.02493421e+02 4.72041793e+01 2.02493036e+02 4.72041755e+01 2.02493021e+02 4.72039294e+01 2.02493199e+02 4.72037414e+01 2.02493641e+02 4.72037288e+01 2.02493664e+02 4.72040316e+01 2.02489398e+02 4.72013672e+01 2.02489349e+02 4.72013686e+01 2.02489322e+02 4.72013198e+01 2.02489384e+02 4.72013428e+01 2.02489398e+02 4.72013672e+01 2.02497155e+02 4.72065110e+01 2.02496941e+02 4.72064962e+01 2.02496645e+02 4.72063895e+01 2.02496663e+02 4.72062040e+01 2.02496907e+02 4.72061957e+01 2.02497115e+02 4.72063676e+01 2.02497155e+02 4.72065110e+01 2.02490204e+02 4.72021699e+01 2.02490055e+02 4.72021490e+01 2.02490050e+02 4.72020736e+01 2.02490196e+02 4.72020442e+01 2.02490204e+02 4.72021699e+01 2.02489198e+02 4.72018405e+01 2.02489157e+02 4.72018362e+01 2.02488857e+02 4.72017324e+01 2.02488851e+02 4.72016235e+01 2.02489011e+02 4.72016189e+01 2.02489196e+02 4.72018075e+01 2.02489198e+02 4.72018405e+01 2.02496747e+02 4.72068544e+01 2.02496372e+02 4.72069196e+01 2.02496369e+02 4.72069193e+01 2.02496369e+02 4.72069174e+01 2.02496500e+02 4.72067004e+01 2.02496682e+02 4.72066881e+01 2.02496747e+02 4.72068544e+01 2.02498232e+02 4.72080810e+01 2.02497932e+02 4.72081928e+01 2.02497645e+02 4.72082544e+01 2.02497711e+02 4.72080546e+01 2.02497884e+02 4.72078638e+01 2.02498185e+02 4.72078552e+01 2.02498232e+02 4.72080810e+01 2.02494329e+02 4.72056433e+01 2.02494256e+02 4.72058771e+01 2.02494267e+02 4.72059039e+01 2.02494226e+02 4.72058996e+01 2.02493942e+02 4.72057842e+01 2.02493896e+02 4.72056720e+01 2.02493796e+02 4.72055666e+01 2.02493808e+02 4.72053182e+01 2.02494145e+02 4.72053085e+01 2.02494306e+02 4.72055151e+01 2.02494329e+02 4.72056433e+01 2.02500286e+02 4.72099615e+01 2.02500118e+02 4.72100056e+01 2.02500169e+02 4.72098888e+01 2.02500303e+02 4.72098696e+01 2.02500286e+02 4.72099615e+01 2.02493159e+02 4.72055110e+01 2.02492984e+02 4.72055160e+01 2.02492989e+02 4.72054052e+01 2.02493151e+02 4.72053922e+01 2.02493159e+02 4.72055110e+01 2.02498592e+02 4.72095022e+01 2.02498292e+02 4.72096138e+01 2.02498019e+02 4.72096049e+01 2.02498027e+02 4.72094483e+01 2.02498088e+02 4.72092280e+01 2.02498086e+02 4.72091862e+01 2.02498138e+02 4.72091913e+01 2.02498565e+02 4.72092008e+01 2.02498592e+02 4.72095022e+01 2.02482275e+02 4.71993103e+01 2.02482041e+02 4.71992855e+01 2.02482034e+02 4.71991597e+01 2.02482219e+02 4.71991545e+01 2.02482275e+02 4.71993103e+01 2.02494921e+02 4.72075092e+01 2.02494717e+02 4.72076810e+01 2.02494435e+02 4.72076977e+01 2.02494422e+02 4.72074968e+01 2.02494689e+02 4.72073639e+01 2.02494911e+02 4.72073457e+01 2.02494921e+02 4.72075092e+01 2.02485427e+02 4.72015789e+01 2.02485461e+02 4.72016393e+01 2.02485677e+02 4.72017354e+01 2.02485505e+02 4.72016067e+01 2.02485427e+02 4.72015789e+01 2.02499779e+02 4.72108415e+01 2.02499414e+02 4.72108519e+01 2.02499418e+02 4.72106160e+01 2.02499791e+02 4.72105733e+01 2.02499779e+02 4.72108415e+01 2.02492991e+02 4.72066028e+01 2.02492828e+02 4.72066075e+01 2.02492821e+02 4.72064966e+01 2.02492984e+02 4.72064920e+01 2.02492991e+02 4.72066028e+01 2.02482986e+02 4.72003532e+01 2.02482855e+02 4.72003113e+01 2.02482843e+02 4.72002636e+01 2.02482938e+02 4.72002494e+01 2.02482986e+02 4.72003532e+01 2.02498427e+02 4.72102966e+01 2.02498368e+02 4.72103231e+01 2.02498398e+02 4.72102782e+01 2.02498438e+02 4.72102715e+01 2.02498427e+02 4.72102966e+01 2.02488178e+02 4.72038958e+01 2.02488106e+02 4.72039143e+01 2.02488102e+02 4.72038483e+01 2.02488168e+02 4.72038685e+01 2.02488178e+02 4.72038958e+01 2.02487481e+02 4.72037598e+01 2.02487433e+02 4.72037612e+01 2.02487439e+02 4.72037334e+01 2.02487503e+02 4.72037095e+01 2.02487481e+02 4.72037598e+01 2.02497168e+02 4.72101090e+01 2.02496899e+02 4.72101067e+01 2.02496889e+02 4.72099342e+01 2.02497180e+02 4.72098993e+01 2.02497168e+02 4.72101090e+01 2.02488704e+02 4.72051221e+01 2.02488664e+02 4.72051287e+01 2.02488662e+02 4.72050957e+01 2.02488711e+02 4.72050943e+01 2.02488704e+02 4.72051221e+01 2.02482657e+02 4.72013443e+01 2.02482665e+02 4.72014277e+01 2.02482788e+02 4.72016619e+01 2.02482758e+02 4.72017068e+01 2.02482695e+02 4.72017307e+01 2.02482459e+02 4.72018192e+01 2.02482122e+02 4.72019076e+01 2.02481862e+02 4.72020441e+01 2.02481821e+02 4.72020507e+01 2.02481819e+02 4.72020177e+01 2.02481920e+02 4.72017811e+01 2.02481854e+02 4.72017011e+01 2.02481703e+02 4.72014874e+01 2.02481694e+02 4.72013411e+01 2.02481607e+02 4.72012330e+01 2.02481591e+02 4.72009778e+01 2.02481916e+02 4.72008812e+01 2.02482090e+02 4.72008762e+01 2.02482298e+02 4.72010477e+01 2.02482602e+02 4.72011487e+01 2.02482657e+02 4.72013443e+01 2.02499021e+02 4.72118639e+01 2.02498762e+02 4.72120011e+01 2.02498903e+02 4.72122055e+01 2.02498837e+02 4.72123471e+01 2.02498595e+02 4.72124329e+01 2.02498338e+02 4.72123347e+01 2.02498295e+02 4.72123293e+01 2.02498243e+02 4.72122757e+01 2.02498392e+02 4.72120693e+01 2.02498464e+02 4.72118790e+01 2.02498486e+02 4.72118287e+01 2.02498557e+02 4.72118101e+01 2.02498824e+02 4.72117411e+01 2.02499058e+02 4.72117659e+01 2.02499021e+02 4.72118639e+01 2.02487539e+02 4.72046933e+01 2.02487467e+02 4.72047119e+01 2.02487261e+02 4.72048187e+01 2.02486981e+02 4.72049430e+01 2.02486902e+02 4.72051294e+01 2.02486906e+02 4.72051954e+01 2.02486732e+02 4.72053861e+01 2.02486619e+02 4.72056147e+01 2.02486616e+02 4.72056663e+01 2.02486763e+02 4.72058827e+01 2.02486747e+02 4.72059934e+01 2.02486480e+02 4.72061262e+01 2.02486563e+02 4.72063560e+01 2.02486624e+02 4.72065148e+01 2.02486341e+02 4.72065198e+01 2.02486233e+02 4.72065698e+01 2.02485975e+02 4.72067077e+01 2.02485650e+02 4.72068040e+01 2.02485550e+02 4.72070406e+01 2.02485510e+02 4.72071338e+01 2.02485474e+02 4.72072923e+01 2.02485334e+02 4.72075041e+01 2.02485224e+02 4.72076710e+01 2.02485194e+02 4.72077159e+01 2.02485162e+02 4.72077168e+01 2.02484929e+02 4.72075632e+01 2.02484529e+02 4.72075995e+01 2.02484357e+02 4.72077913e+01 2.02484130e+02 4.72079485e+01 2.02483967e+02 4.72081460e+01 2.02483794e+02 4.72083375e+01 2.02483657e+02 4.72085031e+01 2.02483629e+02 4.72085335e+01 2.02483598e+02 4.72085466e+01 2.02483375e+02 4.72086739e+01 2.02483280e+02 4.72087818e+01 2.02483244e+02 4.72088914e+01 2.02483108e+02 4.72091056e+01 2.02482857e+02 4.72090939e+01 2.02482891e+02 4.72089701e+01 2.02482829e+02 4.72087893e+01 2.02482559e+02 4.72087623e+01 2.02482420e+02 4.72087663e+01 2.02482151e+02 4.72086398e+01 2.02481825e+02 4.72085552e+01 2.02481571e+02 4.72084170e+01 2.02481362e+02 4.72082465e+01 2.02481414e+02 4.72080474e+01 2.02481574e+02 4.72078478e+01 2.02481810e+02 4.72076961e+01 2.02482073e+02 4.72075611e+01 2.02482155e+02 4.72073349e+01 2.02482154e+02 4.72073129e+01 2.02482194e+02 4.72073062e+01 2.02482497e+02 4.72072279e+01 2.02482832e+02 4.72071377e+01 2.02482923e+02 4.72068958e+01 2.02483143e+02 4.72067337e+01 2.02483315e+02 4.72065422e+01 2.02483535e+02 4.72063801e+01 2.02483867e+02 4.72063957e+01 2.02484159e+02 4.72064710e+01 2.02484353e+02 4.72062930e+01 2.02484223e+02 4.72061330e+01 2.02484208e+02 4.72059036e+01 2.02484319e+02 4.72057367e+01 2.02484115e+02 4.72055619e+01 2.02484114e+02 4.72055454e+01 2.02484250e+02 4.72053309e+01 2.02484479e+02 4.72052929e+01 2.02484753e+02 4.72053465e+01 2.02485006e+02 4.72052055e+01 2.02485039e+02 4.72052045e+01 2.02485465e+02 4.72051924e+01 2.02485505e+02 4.72051858e+01 2.02485807e+02 4.72051075e+01 2.02485897e+02 4.72048959e+01 2.02485903e+02 4.72048682e+01 2.02485986e+02 4.72046209e+01 2.02486152e+02 4.72044250e+01 2.02486550e+02 4.72044137e+01 2.02486621e+02 4.72046864e+01 2.02486881e+02 4.72045817e+01 2.02487169e+02 4.72044625e+01 2.02487437e+02 4.72044089e+01 2.02487560e+02 4.72046431e+01 2.02487539e+02 4.72046933e+01 2.02485450e+02 4.72033881e+01 2.02485569e+02 4.72035112e+01 2.02485800e+02 4.72036660e+01 2.02485906e+02 4.72036732e+01 2.02485887e+02 4.72036021e+01 2.02485735e+02 4.72033884e+01 2.02485450e+02 4.72033881e+01 2.02496874e+02 4.72108225e+01 2.02496809e+02 4.72108244e+01 2.02496806e+02 4.72107801e+01 2.02496871e+02 4.72107783e+01 2.02496874e+02 4.72108225e+01 2.02489439e+02 4.72061791e+01 2.02489135e+02 4.72062882e+01 2.02488862e+02 4.72062845e+01 2.02488779e+02 4.72060662e+01 2.02489016e+02 4.72059148e+01 2.02489315e+02 4.72059493e+01 2.02489439e+02 4.72061791e+01 2.02482811e+02 4.72020391e+01 2.02482714e+02 4.72020419e+01 2.02482710e+02 4.72019758e+01 2.02482776e+02 4.72019960e+01 2.02482811e+02 4.72020391e+01 2.02481386e+02 4.72014479e+01 2.02481334e+02 4.72014349e+01 2.02481323e+02 4.72014081e+01 2.02481383e+02 4.72013985e+01 2.02481386e+02 4.72014479e+01 2.02496414e+02 4.72111335e+01 2.02496386e+02 4.72111371e+01 2.02496376e+02 4.72111098e+01 2.02496417e+02 4.72111141e+01 2.02496414e+02 4.72111335e+01 2.02488099e+02 4.72059407e+01 2.02488025e+02 4.72059263e+01 2.02488023e+02 4.72058932e+01 2.02488095e+02 4.72058747e+01 2.02488099e+02 4.72059407e+01 2.02494882e+02 4.72104761e+01 2.02494612e+02 4.72104954e+01 2.02494600e+02 4.72102999e+01 2.02494886e+02 4.72102933e+01 2.02494882e+02 4.72104761e+01 2.02482872e+02 4.72029742e+01 2.02482775e+02 4.72032130e+01 2.02482803e+02 4.72032777e+01 2.02482786e+02 4.72035189e+01 2.02482778e+02 4.72036213e+01 2.02482929e+02 4.72038352e+01 2.02482972e+02 4.72039347e+01 2.02483016e+02 4.72040960e+01 2.02483222e+02 4.72042692e+01 2.02483278e+02 4.72044250e+01 2.02482931e+02 4.72045073e+01 2.02482746e+02 4.72046905e+01 2.02482607e+02 4.72049034e+01 2.02482281e+02 4.72049989e+01 2.02482087e+02 4.72051768e+01 2.02481834e+02 4.72053179e+01 2.02481771e+02 4.72053417e+01 2.02481410e+02 4.72053520e+01 2.02481540e+02 4.72055120e+01 2.02481510e+02 4.72057140e+01 2.02481303e+02 4.72058833e+01 2.02481036e+02 4.72060160e+01 2.02480873e+02 4.72060049e+01 2.02480685e+02 4.72058181e+01 2.02480676e+02 4.72057908e+01 2.02480658e+02 4.72055127e+01 2.02480631e+02 4.72054639e+01 2.02480728e+02 4.72054611e+01 2.02480995e+02 4.72053921e+01 2.02481074e+02 4.72052057e+01 2.02481070e+02 4.72051397e+01 2.02481268e+02 4.72049640e+01 2.02481473e+02 4.72049109e+01 2.02481747e+02 4.72049645e+01 2.02481675e+02 4.72047619e+01 2.02481730e+02 4.72046547e+01 2.02481860e+02 4.72044364e+01 2.02481803e+02 4.72043419e+01 2.02481870e+02 4.72041433e+01 2.02481997e+02 4.72039240e+01 2.02482017e+02 4.72038580e+01 2.02482047e+02 4.72036560e+01 2.02482137e+02 4.72034445e+01 2.02481727e+02 4.72034561e+01 2.02481679e+02 4.72034575e+01 2.02481452e+02 4.72032998e+01 2.02481451e+02 4.72032833e+01 2.02481554e+02 4.72030488e+01 2.02481640e+02 4.72028352e+01 2.02481647e+02 4.72028074e+01 2.02481710e+02 4.72027836e+01 2.02481977e+02 4.72027146e+01 2.02482316e+02 4.72026270e+01 2.02482357e+02 4.72026314e+01 2.02482392e+02 4.72026745e+01 2.02482493e+02 4.72028557e+01 2.02482680e+02 4.72028545e+01 2.02482880e+02 4.72028955e+01 2.02482872e+02 4.72029742e+01 2.02497921e+02 4.72126729e+01 2.02497783e+02 4.72127076e+01 2.02497727e+02 4.72125518e+01 2.02497938e+02 4.72125930e+01 2.02497921e+02 4.72126729e+01 2.02495853e+02 4.72119798e+01 2.02495679e+02 4.72119848e+01 2.02495688e+02 4.72118767e+01 2.02495829e+02 4.72118738e+01 2.02495853e+02 4.72119798e+01 2.02484233e+02 4.72050213e+01 2.02483999e+02 4.72049964e+01 2.02484016e+02 4.72048858e+01 2.02484177e+02 4.72048654e+01 2.02484233e+02 4.72050213e+01 2.02483417e+02 4.72048107e+01 2.02483345e+02 4.72048293e+01 2.02483375e+02 4.72047844e+01 2.02483415e+02 4.72047777e+01 2.02483417e+02 4.72048107e+01 2.02495659e+02 4.72127559e+01 2.02495455e+02 4.72128014e+01 2.02495504e+02 4.72126593e+01 2.02495653e+02 4.72126550e+01 2.02495659e+02 4.72127559e+01 2.02480799e+02 4.72034743e+01 2.02480763e+02 4.72034836e+01 2.02480773e+02 4.72034585e+01 2.02480798e+02 4.72034578e+01 2.02480799e+02 4.72034743e+01 2.02495916e+02 4.72132153e+01 2.02495735e+02 4.72132454e+01 2.02495784e+02 4.72131334e+01 2.02495944e+02 4.72130902e+01 2.02495916e+02 4.72132153e+01 2.02482137e+02 4.72046093e+01 2.02482150e+02 4.72047358e+01 2.02482300e+02 4.72047111e+01 2.02482323e+02 4.72046081e+01 2.02482137e+02 4.72046093e+01 2.02481224e+02 4.72046374e+01 2.02481018e+02 4.72045963e+01 2.02480989e+02 4.72044906e+01 2.02481165e+02 4.72044881e+01 2.02481224e+02 4.72046374e+01 2.02480630e+02 4.72042666e+01 2.02480713e+02 4.72044965e+01 2.02480697e+02 4.72046072e+01 2.02480491e+02 4.72046602e+01 2.02480311e+02 4.72046654e+01 2.02480033e+02 4.72046733e+01 2.02480070e+02 4.72045148e+01 2.02480289e+02 4.72043527e+01 2.02480278e+02 4.72041673e+01 2.02480294e+02 4.72040566e+01 2.02480455e+02 4.72040363e+01 2.02480628e+02 4.72042336e+01 2.02480630e+02 4.72042666e+01 2.02480788e+02 4.72049635e+01 2.02480510e+02 4.72049714e+01 2.02480499e+02 4.72047828e+01 2.02480710e+02 4.72048240e+01 2.02480788e+02 4.72049635e+01 2.02494298e+02 4.72137011e+01 2.02494205e+02 4.72137250e+01 2.02494237e+02 4.72136628e+01 2.02494296e+02 4.72136578e+01 2.02494298e+02 4.72137011e+01 2.02480807e+02 4.72052747e+01 2.02480530e+02 4.72052826e+01 2.02480518e+02 4.72050940e+01 2.02480796e+02 4.72050861e+01 2.02480807e+02 4.72052747e+01 2.02482126e+02 4.72063978e+01 2.02481907e+02 4.72065599e+01 2.02481768e+02 4.72067724e+01 2.02481623e+02 4.72067518e+01 2.02481383e+02 4.72066043e+01 2.02481340e+02 4.72065048e+01 2.02481559e+02 4.72063427e+01 2.02481722e+02 4.72063538e+01 2.02482097e+02 4.72063793e+01 2.02482137e+02 4.72063727e+01 2.02482126e+02 4.72063978e+01 2.02480349e+02 4.72052877e+01 2.02480387e+02 4.72053881e+01 2.02480357e+02 4.72055920e+01 2.02480106e+02 4.72057339e+01 2.02479806e+02 4.72058461e+01 2.02479743e+02 4.72061058e+01 2.02479473e+02 4.72062361e+01 2.02479143e+02 4.72063296e+01 2.02479008e+02 4.72065444e+01 2.02478892e+02 4.72064926e+01 2.02478890e+02 4.72064706e+01 2.02478822e+02 4.72062191e+01 2.02478830e+02 4.72061338e+01 2.02478771e+02 4.72059308e+01 2.02478763e+02 4.72057926e+01 2.02478947e+02 4.72056082e+01 2.02479254e+02 4.72055742e+01 2.02479453e+02 4.72056253e+01 2.02479669e+02 4.72054613e+01 2.02479809e+02 4.72052495e+01 2.02479809e+02 4.72051640e+01 2.02479841e+02 4.72049703e+01 2.02480123e+02 4.72049326e+01 2.02480338e+02 4.72050991e+01 2.02480349e+02 4.72052877e+01 2.02494746e+02 4.72148779e+01 2.02494392e+02 4.72148879e+01 2.02494333e+02 4.72146201e+01 2.02494718e+02 4.72146473e+01 2.02494746e+02 4.72148779e+01 2.02492095e+02 4.72138207e+01 2.02491875e+02 4.72138196e+01 2.02491855e+02 4.72136709e+01 2.02492084e+02 4.72136648e+01 2.02492095e+02 4.72138207e+01 2.02480533e+02 4.72065990e+01 2.02480592e+02 4.72068630e+01 2.02480635e+02 4.72069625e+01 2.02480511e+02 4.72071841e+01 2.02480268e+02 4.72073311e+01 2.02480048e+02 4.72074932e+01 2.02479736e+02 4.72075971e+01 2.02479452e+02 4.72077191e+01 2.02479426e+02 4.72077242e+01 2.02479056e+02 4.72077710e+01 2.02478790e+02 4.72079037e+01 2.02478749e+02 4.72078994e+01 2.02478323e+02 4.72079115e+01 2.02478283e+02 4.72079181e+01 2.02478281e+02 4.72078851e+01 2.02478454e+02 4.72076936e+01 2.02478659e+02 4.72076406e+01 2.02478839e+02 4.72076354e+01 2.02478832e+02 4.72075129e+01 2.02478907e+02 4.72073785e+01 2.02479171e+02 4.72072446e+01 2.02479307e+02 4.72070302e+01 2.02479361e+02 4.72067965e+01 2.02479283e+02 4.72067160e+01 2.02479431e+02 4.72067449e+01 2.02479666e+02 4.72066563e+01 2.02479777e+02 4.72064895e+01 2.02479798e+02 4.72064392e+01 2.02479847e+02 4.72064379e+01 2.02480256e+02 4.72064262e+01 2.02480328e+02 4.72064076e+01 2.02480532e+02 4.72065825e+01 2.02480533e+02 4.72065990e+01 2.02494165e+02 4.72154126e+01 2.02494096e+02 4.72154324e+01 2.02494043e+02 4.72153367e+01 2.02494179e+02 4.72153708e+01 2.02494165e+02 4.72154126e+01 2.02484163e+02 4.72094652e+01 2.02484091e+02 4.72094838e+01 2.02484112e+02 4.72094336e+01 2.02484161e+02 4.72094322e+01 2.02484163e+02 4.72094652e+01 2.02484571e+02 4.72100195e+01 2.02484548e+02 4.72101225e+01 2.02484511e+02 4.72102810e+01 2.02484286e+02 4.72103161e+01 2.02484168e+02 4.72103661e+01 2.02484181e+02 4.72103933e+01 2.02484396e+02 4.72105599e+01 2.02484633e+02 4.72107100e+01 2.02484671e+02 4.72109791e+01 2.02484347e+02 4.72110761e+01 2.02484064e+02 4.72111985e+01 2.02483995e+02 4.72111819e+01 2.02483643e+02 4.72111160e+01 2.02483343e+02 4.72110471e+01 2.02483271e+02 4.72110657e+01 2.02483056e+02 4.72108995e+01 2.02483028e+02 4.72108506e+01 2.02482897e+02 4.72106915e+01 2.02482649e+02 4.72105490e+01 2.02482599e+02 4.72102832e+01 2.02482599e+02 4.72102609e+01 2.02482540e+02 4.72099790e+01 2.02482513e+02 4.72099302e+01 2.02482411e+02 4.72097489e+01 2.02482262e+02 4.72097736e+01 2.02482267e+02 4.72098553e+01 2.02482237e+02 4.72100573e+01 2.02482213e+02 4.72102205e+01 2.02482221e+02 4.72103462e+01 2.02481991e+02 4.72103843e+01 2.02481811e+02 4.72103894e+01 2.02481533e+02 4.72103973e+01 2.02481522e+02 4.72102087e+01 2.02481600e+02 4.72100223e+01 2.02481240e+02 4.72100326e+01 2.02481146e+02 4.72102729e+01 2.02481171e+02 4.72103397e+01 2.02481389e+02 4.72105037e+01 2.02481635e+02 4.72105786e+01 2.02481732e+02 4.72105758e+01 2.02481736e+02 4.72106419e+01 2.02481517e+02 4.72108040e+01 2.02481532e+02 4.72110491e+01 2.02481511e+02 4.72110993e+01 2.02481316e+02 4.72112772e+01 2.02481219e+02 4.72112800e+01 2.02480858e+02 4.72112903e+01 2.02480784e+02 4.72112758e+01 2.02480375e+02 4.72112875e+01 2.02480392e+02 4.72115656e+01 2.02480394e+02 4.72115986e+01 2.02480200e+02 4.72117766e+01 2.02479981e+02 4.72119387e+01 2.02479736e+02 4.72120849e+01 2.02479917e+02 4.72122420e+01 2.02480073e+02 4.72122957e+01 2.02480293e+02 4.72122895e+01 2.02480294e+02 4.72124340e+01 2.02480147e+02 4.72126411e+01 2.02479766e+02 4.72127020e+01 2.02479726e+02 4.72127087e+01 2.02479723e+02 4.72126756e+01 2.02479542e+02 4.72125186e+01 2.02479483e+02 4.72125253e+01 2.02479089e+02 4.72125282e+01 2.02478930e+02 4.72123205e+01 2.02478873e+02 4.72121446e+01 2.02479180e+02 4.72121359e+01 2.02479440e+02 4.72121996e+01 2.02479425e+02 4.72119545e+01 2.02479158e+02 4.72120234e+01 2.02478881e+02 4.72120313e+01 2.02478869e+02 4.72118427e+01 2.02478862e+02 4.72117202e+01 2.02478560e+02 4.72116498e+01 2.02478526e+02 4.72116425e+01 2.02478280e+02 4.72114991e+01 2.02478272e+02 4.72114698e+01 2.02478316e+02 4.72111982e+01 2.02478314e+02 4.72111488e+01 2.02478075e+02 4.72110001e+01 2.02478058e+02 4.72107379e+01 2.02478039e+02 4.72107009e+01 2.02477791e+02 4.72105591e+01 2.02477627e+02 4.72103545e+01 2.02477401e+02 4.72103275e+01 2.02477191e+02 4.72104953e+01 2.02477057e+02 4.72107110e+01 2.02476858e+02 4.72108856e+01 2.02476506e+02 4.72108577e+01 2.02476355e+02 4.72106437e+01 2.02476008e+02 4.72106536e+01 2.02475981e+02 4.72109200e+01 2.02476002e+02 4.72109489e+01 2.02476168e+02 4.72111071e+01 2.02476152e+02 4.72113420e+01 2.02475794e+02 4.72113833e+01 2.02475675e+02 4.72113432e+01 2.02475442e+02 4.72113183e+01 2.02475386e+02 4.72111625e+01 2.02475465e+02 4.72109760e+01 2.02475111e+02 4.72109121e+01 2.02474990e+02 4.72109155e+01 2.02474620e+02 4.72109835e+01 2.02474472e+02 4.72111900e+01 2.02474418e+02 4.72114237e+01 2.02474827e+02 4.72114121e+01 2.02474876e+02 4.72114107e+01 2.02475115e+02 4.72115598e+01 2.02475108e+02 4.72115875e+01 2.02475177e+02 4.72118390e+01 2.02475496e+02 4.72118300e+01 2.02475763e+02 4.72116972e+01 2.02475800e+02 4.72117045e+01 2.02476160e+02 4.72117639e+01 2.02476309e+02 4.72117392e+01 2.02476679e+02 4.72116712e+01 2.02476662e+02 4.72113931e+01 2.02476668e+02 4.72113653e+01 2.02476888e+02 4.72112032e+01 2.02476936e+02 4.72111908e+01 2.02477180e+02 4.72110866e+01 2.02477427e+02 4.72109420e+01 2.02477741e+02 4.72108390e+01 2.02477937e+02 4.72107764e+01 2.02477949e+02 4.72109687e+01 2.02477867e+02 4.72111533e+01 2.02477837e+02 4.72111983e+01 2.02477698e+02 4.72114101e+01 2.02477572e+02 4.72116307e+01 2.02477553e+02 4.72117108e+01 2.02477773e+02 4.72118739e+01 2.02477784e+02 4.72120625e+01 2.02477445e+02 4.72121501e+01 2.02477408e+02 4.72121429e+01 2.02476975e+02 4.72121552e+01 2.02476993e+02 4.72124498e+01 2.02477032e+02 4.72124901e+01 2.02477162e+02 4.72126501e+01 2.02477176e+02 4.72128795e+01 2.02476838e+02 4.72128891e+01 2.02476718e+02 4.72128926e+01 2.02476340e+02 4.72129553e+01 2.02476248e+02 4.72131972e+01 2.02476169e+02 4.72133836e+01 2.02476135e+02 4.72134259e+01 2.02476076e+02 4.72134524e+01 2.02475843e+02 4.72135425e+01 2.02475671e+02 4.72137342e+01 2.02475422e+02 4.72138779e+01 2.02475056e+02 4.72138806e+01 2.02474851e+02 4.72137060e+01 2.02474823e+02 4.72135038e+01 2.02474956e+02 4.72133032e+01 2.02474959e+02 4.72132893e+01 2.02475115e+02 4.72130877e+01 2.02475071e+02 4.72128934e+01 2.02474727e+02 4.72128452e+01 2.02474694e+02 4.72128461e+01 2.02474357e+02 4.72129136e+01 2.02474208e+02 4.72131197e+01 2.02473989e+02 4.72132818e+01 2.02473965e+02 4.72133848e+01 2.02474081e+02 4.72136243e+01 2.02474078e+02 4.72136366e+01 2.02474049e+02 4.72136483e+01 2.02473699e+02 4.72135813e+01 2.02473518e+02 4.72135864e+01 2.02473241e+02 4.72135943e+01 2.02472966e+02 4.72135407e+01 2.02472888e+02 4.72137909e+01 2.02472848e+02 4.72138841e+01 2.02472860e+02 4.72140727e+01 2.02472781e+02 4.72142591e+01 2.02472785e+02 4.72143251e+01 2.02472624e+02 4.72145235e+01 2.02472351e+02 4.72145768e+01 2.02472230e+02 4.72143409e+01 2.02471963e+02 4.72144098e+01 2.02471650e+02 4.72145132e+01 2.02471552e+02 4.72145159e+01 2.02471191e+02 4.72145262e+01 2.02470938e+02 4.72146672e+01 2.02470875e+02 4.72146910e+01 2.02470871e+02 4.72146250e+01 2.02471115e+02 4.72144787e+01 2.02471098e+02 4.72142006e+01 2.02471071e+02 4.72141517e+01 2.02470921e+02 4.72140059e+01 2.02470836e+02 4.72140049e+01 2.02470450e+02 4.72140631e+01 2.02470350e+02 4.72142997e+01 2.02470271e+02 4.72144861e+01 2.02470510e+02 4.72146352e+01 2.02470514e+02 4.72147013e+01 2.02470417e+02 4.72147040e+01 2.02470150e+02 4.72147730e+01 2.02469939e+02 4.72147317e+01 2.02469611e+02 4.72146483e+01 2.02469531e+02 4.72146855e+01 2.02469194e+02 4.72147746e+01 2.02468927e+02 4.72148281e+01 2.02468913e+02 4.72145987e+01 2.02468861e+02 4.72145517e+01 2.02468662e+02 4.72144420e+01 2.02468565e+02 4.72144448e+01 2.02468298e+02 4.72145138e+01 2.02467959e+02 4.72146013e+01 2.02467727e+02 4.72147555e+01 2.02467703e+02 4.72147561e+01 2.02467689e+02 4.72147317e+01 2.02467607e+02 4.72145019e+01 2.02467368e+02 4.72143528e+01 2.02467024e+02 4.72143161e+01 2.02466983e+02 4.72143117e+01 2.02466671e+02 4.72142167e+01 2.02466664e+02 4.72140909e+01 2.02466967e+02 4.72139812e+01 2.02467026e+02 4.72139547e+01 2.02467242e+02 4.72141210e+01 2.02467580e+02 4.72140650e+01 2.02467861e+02 4.72139413e+01 2.02467991e+02 4.72138929e+01 2.02468166e+02 4.72138327e+01 2.02468206e+02 4.72137342e+01 2.02468262e+02 4.72135938e+01 2.02468219e+02 4.72133995e+01 2.02468184e+02 4.72132454e+01 2.02468430e+02 4.72130998e+01 2.02468704e+02 4.72129720e+01 2.02468603e+02 4.72127907e+01 2.02468474e+02 4.72128281e+01 2.02468195e+02 4.72129533e+01 2.02468025e+02 4.72131464e+01 2.02467773e+02 4.72132879e+01 2.02467502e+02 4.72134176e+01 2.02467276e+02 4.72135761e+01 2.02467047e+02 4.72136141e+01 2.02466942e+02 4.72136662e+01 2.02466520e+02 4.72136781e+01 2.02466440e+02 4.72136517e+01 2.02466070e+02 4.72137197e+01 2.02465998e+02 4.72137383e+01 2.02465762e+02 4.72138268e+01 2.02465520e+02 4.72137659e+01 2.02465410e+02 4.72136069e+01 2.02465391e+02 4.72135358e+01 2.02465310e+02 4.72135443e+01 2.02465030e+02 4.72134768e+01 2.02464785e+02 4.72133327e+01 2.02464491e+02 4.72132244e+01 2.02464198e+02 4.72131152e+01 2.02463957e+02 4.72129681e+01 2.02463763e+02 4.72127862e+01 2.02463592e+02 4.72125871e+01 2.02463373e+02 4.72124236e+01 2.02463158e+02 4.72122570e+01 2.02463134e+02 4.72121846e+01 2.02463276e+02 4.72121696e+01 2.02463633e+02 4.72122315e+01 2.02463667e+02 4.72122180e+01 2.02463684e+02 4.72121937e+01 2.02463805e+02 4.72120050e+01 2.02463909e+02 4.72117713e+01 2.02464034e+02 4.72116099e+01 2.02464028e+02 4.72115459e+01 2.02464233e+02 4.72113749e+01 2.02464349e+02 4.72113776e+01 2.02464635e+02 4.72114917e+01 2.02464644e+02 4.72116317e+01 2.02464342e+02 4.72117425e+01 2.02464477e+02 4.72119337e+01 2.02464598e+02 4.72121697e+01 2.02464843e+02 4.72120558e+01 2.02465209e+02 4.72119849e+01 2.02465365e+02 4.72119284e+01 2.02465645e+02 4.72120472e+01 2.02465852e+02 4.72120878e+01 2.02465993e+02 4.72121153e+01 2.02466266e+02 4.72122389e+01 2.02466451e+02 4.72121626e+01 2.02466660e+02 4.72119940e+01 2.02467002e+02 4.72120206e+01 2.02467248e+02 4.72121643e+01 2.02467417e+02 4.72121678e+01 2.02467371e+02 4.72120739e+01 2.02467422e+02 4.72118718e+01 2.02467677e+02 4.72118476e+01 2.02467828e+02 4.72120617e+01 2.02467794e+02 4.72121040e+01 2.02467812e+02 4.72123987e+01 2.02468092e+02 4.72125171e+01 2.02468484e+02 4.72125355e+01 2.02468520e+02 4.72125262e+01 2.02468859e+02 4.72124702e+01 2.02469030e+02 4.72122780e+01 2.02469109e+02 4.72120915e+01 2.02469130e+02 4.72120413e+01 2.02469179e+02 4.72120400e+01 2.02469588e+02 4.72120283e+01 2.02469629e+02 4.72120327e+01 2.02469639e+02 4.72120600e+01 2.02469595e+02 4.72123318e+01 2.02469572e+02 4.72123997e+01 2.02469515e+02 4.72125812e+01 2.02469254e+02 4.72126351e+01 2.02469100e+02 4.72126208e+01 2.02469021e+02 4.72128072e+01 2.02469025e+02 4.72128732e+01 2.02469178e+02 4.72130162e+01 2.02469260e+02 4.72130200e+01 2.02469574e+02 4.72129174e+01 2.02469804e+02 4.72128794e+01 2.02470078e+02 4.72129330e+01 2.02470144e+02 4.72129532e+01 2.02470515e+02 4.72129065e+01 2.02470640e+02 4.72129124e+01 2.02470933e+02 4.72128689e+01 2.02471089e+02 4.72126667e+01 2.02471112e+02 4.72125637e+01 2.02471149e+02 4.72124052e+01 2.02471452e+02 4.72122955e+01 2.02471512e+02 4.72122690e+01 2.02471732e+02 4.72121711e+01 2.02472099e+02 4.72121607e+01 2.02472330e+02 4.72122457e+01 2.02472404e+02 4.72122602e+01 2.02472707e+02 4.72121819e+01 2.02472731e+02 4.72120187e+01 2.02472515e+02 4.72118532e+01 2.02472485e+02 4.72117439e+01 2.02472539e+02 4.72115101e+01 2.02472300e+02 4.72113611e+01 2.02472081e+02 4.72114914e+01 2.02471678e+02 4.72114955e+01 2.02471580e+02 4.72114774e+01 2.02471284e+02 4.72115918e+01 2.02471012e+02 4.72116621e+01 2.02470875e+02 4.72116353e+01 2.02470641e+02 4.72116104e+01 2.02470585e+02 4.72114546e+01 2.02470549e+02 4.72113533e+01 2.02470429e+02 4.72113567e+01 2.02470208e+02 4.72115179e+01 2.02469913e+02 4.72114973e+01 2.02469672e+02 4.72114821e+01 2.02469509e+02 4.72114709e+01 2.02469290e+02 4.72113071e+01 2.02469324e+02 4.72112648e+01 2.02469548e+02 4.72111054e+01 2.02469603e+02 4.72110763e+01 2.02469799e+02 4.72109634e+01 2.02470212e+02 4.72109517e+01 2.02470328e+02 4.72109943e+01 2.02470554e+02 4.72108362e+01 2.02470832e+02 4.72108192e+01 2.02470934e+02 4.72107747e+01 2.02471344e+02 4.72107317e+01 2.02471563e+02 4.72105696e+01 2.02471612e+02 4.72105682e+01 2.02471962e+02 4.72106348e+01 2.02472016e+02 4.72108523e+01 2.02472059e+02 4.72108885e+01 2.02472290e+02 4.72110437e+01 2.02472493e+02 4.72111501e+01 2.02472566e+02 4.72111646e+01 2.02472857e+02 4.72110789e+01 2.02473171e+02 4.72110432e+01 2.02473409e+02 4.72111241e+01 2.02473511e+02 4.72108890e+01 2.02473731e+02 4.72107269e+01 2.02474105e+02 4.72106616e+01 2.02474164e+02 4.72106351e+01 2.02474168e+02 4.72107011e+01 2.02474306e+02 4.72108557e+01 2.02474544e+02 4.72109360e+01 2.02474638e+02 4.72106956e+01 2.02474983e+02 4.72106119e+01 2.02475077e+02 4.72103715e+01 2.02475415e+02 4.72103619e+01 2.02475625e+02 4.72105322e+01 2.02475805e+02 4.72105271e+01 2.02475798e+02 4.72104045e+01 2.02475646e+02 4.72101916e+01 2.02475680e+02 4.72101493e+01 2.02475839e+02 4.72099499e+01 2.02475987e+02 4.72097427e+01 2.02475950e+02 4.72096414e+01 2.02475936e+02 4.72094119e+01 2.02475960e+02 4.72093089e+01 2.02475996e+02 4.72091505e+01 2.02476181e+02 4.72091452e+01 2.02476526e+02 4.72091819e+01 2.02476720e+02 4.72090039e+01 2.02476798e+02 4.72087538e+01 2.02476794e+02 4.72086925e+01 2.02476817e+02 4.72084665e+01 2.02477118e+02 4.72083550e+01 2.02477384e+02 4.72082223e+01 2.02477612e+02 4.72080655e+01 2.02477652e+02 4.72080588e+01 2.02477956e+02 4.72081596e+01 2.02478291e+02 4.72082376e+01 2.02478354e+02 4.72082302e+01 2.02478621e+02 4.72080975e+01 2.02478952e+02 4.72080744e+01 2.02478982e+02 4.72083227e+01 2.02478755e+02 4.72084807e+01 2.02478685e+02 4.72085975e+01 2.02478656e+02 4.72087175e+01 2.02478542e+02 4.72089454e+01 2.02478446e+02 4.72090994e+01 2.02478414e+02 4.72091649e+01 2.02478189e+02 4.72093235e+01 2.02478152e+02 4.72093163e+01 2.02477743e+02 4.72092929e+01 2.02477618e+02 4.72092659e+01 2.02477401e+02 4.72094295e+01 2.02477388e+02 4.72095553e+01 2.02477439e+02 4.72097526e+01 2.02477484e+02 4.72098095e+01 2.02477605e+02 4.72100457e+01 2.02477873e+02 4.72100240e+01 2.02478177e+02 4.72099147e+01 2.02478122e+02 4.72096639e+01 2.02478145e+02 4.72095953e+01 2.02478245e+02 4.72095727e+01 2.02478509e+02 4.72095234e+01 2.02478738e+02 4.72095341e+01 2.02478817e+02 4.72097158e+01 2.02478822e+02 4.72097975e+01 2.02478987e+02 4.72100006e+01 2.02479197e+02 4.72099536e+01 2.02479427e+02 4.72097978e+01 2.02479766e+02 4.72097507e+01 2.02479990e+02 4.72099103e+01 2.02480097e+02 4.72099171e+01 2.02480301e+02 4.72097452e+01 2.02480567e+02 4.72096124e+01 2.02480560e+02 4.72094899e+01 2.02480548e+02 4.72093013e+01 2.02480512e+02 4.72092000e+01 2.02480568e+02 4.72090145e+01 2.02480805e+02 4.72088634e+01 2.02481014e+02 4.72088287e+01 2.02481293e+02 4.72089479e+01 2.02481307e+02 4.72091773e+01 2.02481312e+02 4.72092590e+01 2.02481464e+02 4.72092752e+01 2.02481697e+02 4.72093000e+01 2.02482041e+02 4.72093367e+01 2.02482274e+02 4.72091825e+01 2.02482302e+02 4.72091789e+01 2.02482556e+02 4.72093165e+01 2.02482575e+02 4.72093711e+01 2.02482677e+02 4.72095524e+01 2.02482951e+02 4.72096060e+01 2.02483018e+02 4.72096261e+01 2.02483443e+02 4.72096140e+01 2.02483476e+02 4.72096131e+01 2.02483832e+02 4.72096754e+01 2.02484015e+02 4.72096721e+01 2.02484243e+02 4.72096971e+01 2.02484517e+02 4.72098200e+01 2.02484571e+02 4.72100195e+01 2.02480590e+02 4.72075325e+01 2.02480650e+02 4.72077965e+01 2.02480741e+02 4.72079261e+01 2.02480428e+02 4.72080295e+01 2.02480175e+02 4.72081705e+01 2.02480111e+02 4.72081944e+01 2.02480107e+02 4.72081283e+01 2.02480360e+02 4.72079873e+01 2.02480342e+02 4.72076982e+01 2.02480333e+02 4.72076709e+01 2.02480552e+02 4.72075088e+01 2.02480589e+02 4.72075160e+01 2.02480590e+02 4.72075325e+01 2.02477965e+02 4.72058927e+01 2.02477746e+02 4.72060548e+01 2.02477687e+02 4.72060813e+01 2.02477716e+02 4.72060364e+01 2.02477936e+02 4.72058743e+01 2.02477964e+02 4.72058762e+01 2.02477965e+02 4.72058927e+01 2.02486350e+02 4.72114296e+01 2.02486314e+02 4.72114201e+01 2.02486273e+02 4.72113816e+01 2.02486370e+02 4.72113789e+01 2.02486350e+02 4.72114296e+01 2.02485551e+02 4.72109305e+01 2.02485261e+02 4.72108970e+01 2.02485225e+02 4.72107272e+01 2.02485501e+02 4.72107193e+01 2.02485551e+02 4.72109305e+01 2.02488975e+02 4.72133685e+01 2.02488962e+02 4.72133689e+01 2.02488956e+02 4.72133566e+01 2.02488976e+02 4.72133584e+01 2.02488975e+02 4.72133685e+01 2.02481643e+02 4.72087884e+01 2.02481437e+02 4.72088415e+01 2.02481210e+02 4.72086838e+01 2.02481200e+02 4.72085117e+01 2.02481493e+02 4.72084746e+01 2.02481703e+02 4.72086450e+01 2.02481643e+02 4.72087884e+01 2.02474506e+02 4.72043294e+01 2.02474326e+02 4.72043345e+01 2.02474122e+02 4.72043887e+01 2.02473902e+02 4.72045508e+01 2.02473777e+02 4.72047401e+01 2.02473779e+02 4.72047731e+01 2.02473731e+02 4.72047745e+01 2.02473321e+02 4.72047861e+01 2.02473149e+02 4.72049776e+01 2.02473049e+02 4.72052142e+01 2.02472814e+02 4.72053665e+01 2.02472563e+02 4.72055090e+01 2.02472224e+02 4.72055965e+01 2.02472152e+02 4.72056151e+01 2.02471791e+02 4.72056254e+01 2.02471806e+02 4.72058705e+01 2.02472149e+02 4.72059430e+01 2.02472162e+02 4.72061561e+01 2.02472181e+02 4.72062448e+01 2.02472275e+02 4.72062265e+01 2.02472257e+02 4.72061880e+01 2.02472240e+02 4.72059057e+01 2.02472532e+02 4.72057890e+01 2.02472751e+02 4.72056264e+01 2.02473028e+02 4.72056186e+01 2.02473303e+02 4.72056722e+01 2.02473377e+02 4.72056866e+01 2.02473715e+02 4.72056306e+01 2.02473944e+02 4.72055925e+01 2.02474219e+02 4.72056461e+01 2.02474117e+02 4.72054649e+01 2.02474154e+02 4.72053064e+01 2.02474383e+02 4.72052684e+01 2.02474505e+02 4.72052264e+01 2.02474643e+02 4.72050768e+01 2.02474638e+02 4.72050108e+01 2.02474479e+02 4.72048721e+01 2.02474408e+02 4.72045994e+01 2.02474406e+02 4.72045664e+01 2.02474455e+02 4.72045650e+01 2.02474693e+02 4.72044467e+01 2.02474718e+02 4.72043708e+01 2.02474506e+02 4.72043294e+01 2.02490182e+02 4.72144211e+01 2.02490180e+02 4.72144210e+01 2.02490180e+02 4.72144199e+01 2.02490182e+02 4.72144197e+01 2.02490182e+02 4.72144211e+01 2.02486636e+02 4.72122068e+01 2.02486561e+02 4.72122140e+01 2.02486351e+02 4.72120439e+01 2.02486350e+02 4.72120280e+01 2.02486395e+02 4.72120113e+01 2.02486652e+02 4.72121472e+01 2.02486636e+02 4.72122068e+01 2.02477609e+02 4.72065678e+01 2.02477326e+02 4.72066902e+01 2.02477344e+02 4.72069849e+01 2.02477383e+02 4.72070251e+01 2.02477164e+02 4.72071872e+01 2.02477067e+02 4.72071899e+01 2.02477063e+02 4.72071239e+01 2.02476961e+02 4.72069426e+01 2.02477022e+02 4.72067992e+01 2.02477288e+02 4.72066665e+01 2.02477440e+02 4.72064622e+01 2.02477666e+02 4.72064223e+01 2.02477609e+02 4.72065678e+01 2.02478230e+02 4.72072551e+01 2.02478191e+02 4.72073353e+01 2.02478131e+02 4.72074920e+01 2.02477950e+02 4.72075136e+01 2.02477677e+02 4.72073898e+01 2.02477665e+02 4.72072012e+01 2.02477744e+02 4.72070148e+01 2.02477778e+02 4.72069725e+01 2.02477814e+02 4.72069632e+01 2.02478184e+02 4.72070157e+01 2.02478230e+02 4.72072551e+01 2.02491967e+02 4.72164334e+01 2.02491865e+02 4.72164300e+01 2.02491853e+02 4.72163620e+01 2.02491954e+02 4.72163645e+01 2.02491967e+02 4.72164334e+01 2.02484766e+02 4.72119362e+01 2.02484749e+02 4.72122249e+01 2.02484514e+02 4.72123771e+01 2.02484133e+02 4.72123813e+01 2.02483978e+02 4.72121702e+01 2.02483994e+02 4.72120525e+01 2.02484094e+02 4.72118154e+01 2.02484345e+02 4.72116731e+01 2.02484696e+02 4.72116401e+01 2.02484765e+02 4.72119142e+01 2.02484766e+02 4.72119362e+01 2.02484111e+02 4.72115273e+01 2.02483921e+02 4.72115619e+01 2.02483975e+02 4.72114421e+01 2.02484135e+02 4.72114032e+01 2.02484111e+02 4.72115273e+01 2.02479721e+02 4.72087847e+01 2.02479443e+02 4.72089105e+01 2.02479197e+02 4.72088700e+01 2.02479189e+02 4.72087517e+01 2.02479321e+02 4.72085345e+01 2.02479660e+02 4.72085280e+01 2.02479721e+02 4.72087847e+01 2.02489430e+02 4.72151479e+01 2.02489168e+02 4.72151690e+01 2.02489166e+02 4.72149834e+01 2.02489419e+02 4.72149830e+01 2.02489430e+02 4.72151479e+01 2.02483387e+02 4.72113741e+01 2.02483290e+02 4.72113769e+01 2.02483286e+02 4.72113109e+01 2.02483360e+02 4.72113253e+01 2.02483387e+02 4.72113741e+01 2.02483407e+02 4.72116853e+01 2.02483333e+02 4.72116709e+01 2.02483305e+02 4.72116220e+01 2.02483402e+02 4.72116193e+01 2.02483407e+02 4.72116853e+01 2.02482929e+02 4.72113872e+01 2.02482855e+02 4.72113727e+01 2.02482828e+02 4.72113239e+01 2.02482925e+02 4.72113211e+01 2.02482929e+02 4.72113872e+01 2.02477020e+02 4.72076959e+01 2.02476770e+02 4.72077342e+01 2.02476758e+02 4.72075319e+01 2.02477012e+02 4.72075559e+01 2.02477020e+02 4.72076959e+01 2.02476402e+02 4.72073097e+01 2.02476033e+02 4.72073031e+01 2.02476018e+02 4.72070698e+01 2.02476362e+02 4.72070601e+01 2.02476402e+02 4.72073097e+01 2.02482923e+02 4.72116825e+01 2.02482875e+02 4.72116839e+01 2.02482872e+02 4.72116509e+01 2.02482944e+02 4.72116323e+01 2.02482923e+02 4.72116825e+01 2.02484370e+02 4.72128857e+01 2.02484325e+02 4.72128900e+01 2.02484323e+02 4.72128560e+01 2.02484373e+02 4.72128545e+01 2.02484370e+02 4.72128857e+01 2.02482965e+02 4.72120081e+01 2.02482861e+02 4.72120195e+01 2.02482834e+02 4.72119257e+01 2.02482994e+02 4.72119212e+01 2.02482965e+02 4.72120081e+01 2.02476247e+02 4.72078109e+01 2.02476067e+02 4.72079976e+01 2.02475822e+02 4.72081439e+01 2.02475773e+02 4.72081453e+01 2.02475771e+02 4.72081123e+01 2.02475754e+02 4.72078341e+01 2.02475752e+02 4.72078011e+01 2.02475824e+02 4.72077825e+01 2.02476212e+02 4.72077891e+01 2.02476257e+02 4.72077878e+01 2.02476247e+02 4.72078109e+01 2.02476640e+02 4.72083556e+01 2.02476383e+02 4.72083459e+01 2.02476307e+02 4.72081475e+01 2.02476575e+02 4.72082039e+01 2.02476640e+02 4.72083556e+01 2.02481386e+02 4.72119192e+01 2.02481162e+02 4.72119733e+01 2.02481149e+02 4.72117711e+01 2.02481380e+02 4.72118122e+01 2.02481386e+02 4.72119192e+01 2.02485197e+02 4.72145984e+01 2.02485110e+02 4.72145876e+01 2.02485102e+02 4.72145394e+01 2.02485190e+02 4.72145286e+01 2.02485197e+02 4.72145984e+01 2.02481009e+02 4.72119831e+01 2.02480778e+02 4.72119314e+01 2.02480729e+02 4.72118080e+01 2.02480996e+02 4.72117699e+01 2.02481009e+02 4.72119831e+01 2.02476195e+02 4.72089751e+01 2.02475962e+02 4.72089817e+01 2.02475983e+02 4.72088426e+01 2.02476185e+02 4.72088174e+01 2.02476195e+02 4.72089751e+01 2.02473617e+02 4.72073643e+01 2.02473491e+02 4.72075536e+01 2.02473800e+02 4.72076511e+01 2.02473939e+02 4.72075660e+01 2.02473968e+02 4.72075267e+01 2.02473775e+02 4.72073443e+01 2.02473617e+02 4.72073643e+01 2.02471274e+02 4.72061997e+01 2.02470888e+02 4.72062579e+01 2.02470840e+02 4.72062592e+01 2.02470501e+02 4.72063153e+01 2.02470316e+02 4.72063205e+01 2.02469972e+02 4.72062838e+01 2.02469900e+02 4.72063024e+01 2.02469680e+02 4.72064007e+01 2.02469313e+02 4.72064112e+01 2.02469232e+02 4.72064196e+01 2.02469096e+02 4.72065708e+01 2.02469075e+02 4.72066210e+01 2.02469158e+02 4.72068509e+01 2.02469502e+02 4.72068875e+01 2.02469543e+02 4.72068919e+01 2.02469578e+02 4.72069350e+01 2.02469452e+02 4.72071558e+01 2.02469241e+02 4.72071146e+01 2.02468922e+02 4.72071236e+01 2.02468716e+02 4.72071767e+01 2.02468442e+02 4.72071231e+01 2.02468457e+02 4.72073682e+01 2.02468436e+02 4.72074184e+01 2.02468364e+02 4.72074370e+01 2.02468013e+02 4.72073712e+01 2.02467890e+02 4.72073764e+01 2.02467552e+02 4.72073860e+01 2.02467307e+02 4.72073111e+01 2.02467240e+02 4.72072909e+01 2.02467231e+02 4.72072636e+01 2.02467450e+02 4.72071016e+01 2.02467433e+02 4.72068234e+01 2.02467171e+02 4.72066915e+01 2.02466810e+02 4.72067017e+01 2.02466557e+02 4.72068427e+01 2.02466371e+02 4.72070259e+01 2.02466274e+02 4.72070286e+01 2.02465913e+02 4.72070389e+01 2.02466015e+02 4.72072202e+01 2.02466026e+02 4.72074088e+01 2.02465947e+02 4.72075952e+01 2.02466323e+02 4.72076435e+01 2.02466401e+02 4.72079106e+01 2.02466705e+02 4.72080114e+01 2.02466761e+02 4.72081672e+01 2.02466769e+02 4.72082898e+01 2.02467043e+02 4.72083434e+01 2.02467140e+02 4.72083406e+01 2.02467356e+02 4.72085069e+01 2.02467728e+02 4.72085576e+01 2.02467971e+02 4.72087028e+01 2.02468217e+02 4.72087777e+01 2.02468283e+02 4.72087979e+01 2.02468709e+02 4.72087858e+01 2.02468741e+02 4.72087849e+01 2.02469121e+02 4.72088297e+01 2.02469255e+02 4.72088278e+01 2.02469569e+02 4.72087252e+01 2.02469844e+02 4.72085978e+01 2.02469873e+02 4.72085997e+01 2.02469887e+02 4.72086241e+01 2.02469969e+02 4.72088540e+01 2.02470206e+02 4.72088240e+01 2.02470533e+02 4.72087286e+01 2.02470681e+02 4.72085221e+01 2.02470900e+02 4.72083600e+01 2.02470889e+02 4.72081746e+01 2.02470545e+02 4.72081379e+01 2.02470504e+02 4.72081335e+01 2.02470142e+02 4.72080754e+01 2.02469945e+02 4.72078956e+01 2.02469910e+02 4.72077414e+01 2.02469929e+02 4.72075821e+01 2.02469921e+02 4.72074489e+01 2.02470065e+02 4.72072396e+01 2.02470433e+02 4.72072098e+01 2.02470525e+02 4.72072277e+01 2.02470903e+02 4.72071650e+01 2.02470967e+02 4.72071412e+01 2.02471202e+02 4.72070526e+01 2.02471184e+02 4.72069810e+01 2.02471168e+02 4.72067321e+01 2.02471166e+02 4.72066688e+01 2.02471190e+02 4.72064465e+01 2.02471544e+02 4.72063894e+01 2.02471565e+02 4.72063816e+01 2.02471599e+02 4.72063489e+01 2.02471405e+02 4.72061671e+01 2.02471274e+02 4.72061997e+01 2.02473777e+02 4.72080627e+01 2.02473881e+02 4.72082421e+01 2.02474152e+02 4.72082976e+01 2.02474137e+02 4.72080525e+01 2.02473777e+02 4.72080627e+01 2.02473082e+02 4.72076290e+01 2.02472941e+02 4.72078396e+01 2.02472825e+02 4.72080456e+01 2.02473189e+02 4.72081020e+01 2.02473375e+02 4.72081107e+01 2.02473675e+02 4.72079994e+01 2.02473660e+02 4.72077543e+01 2.02473453e+02 4.72075823e+01 2.02473082e+02 4.72076290e+01 2.02475502e+02 4.72094399e+01 2.02475335e+02 4.72096347e+01 2.02475032e+02 4.72096689e+01 2.02475018e+02 4.72094365e+01 2.02475329e+02 4.72093317e+01 2.02475518e+02 4.72093096e+01 2.02475502e+02 4.72094399e+01 2.02480691e+02 4.72129811e+01 2.02480597e+02 4.72132211e+01 2.02480303e+02 4.72132582e+01 2.02480333e+02 4.72130562e+01 2.02480677e+02 4.72129720e+01 2.02480689e+02 4.72129729e+01 2.02480691e+02 4.72129811e+01 2.02488202e+02 4.72182704e+01 2.02488068e+02 4.72182587e+01 2.02488058e+02 4.72181801e+01 2.02488179e+02 4.72181766e+01 2.02488202e+02 4.72182704e+01 2.02471628e+02 4.72079172e+01 2.02471386e+02 4.72080649e+01 2.02471316e+02 4.72081843e+01 2.02471469e+02 4.72081170e+01 2.02471702e+02 4.72079634e+01 2.02471713e+02 4.72078914e+01 2.02471628e+02 4.72079172e+01 2.02470002e+02 4.72069009e+01 2.02469938e+02 4.72069248e+01 2.02469968e+02 4.72068798e+01 2.02470001e+02 4.72068789e+01 2.02470002e+02 4.72069009e+01 2.02480308e+02 4.72136389e+01 2.02480214e+02 4.72136494e+01 2.02480188e+02 4.72135644e+01 2.02480334e+02 4.72135602e+01 2.02480308e+02 4.72136389e+01 2.02474701e+02 4.72104357e+01 2.02474424e+02 4.72104436e+01 2.02474460e+02 4.72102851e+01 2.02474690e+02 4.72102471e+01 2.02474701e+02 4.72104357e+01 2.02472912e+02 4.72093176e+01 2.02472840e+02 4.72093361e+01 2.02472836e+02 4.72092701e+01 2.02472902e+02 4.72092903e+01 2.02472912e+02 4.72093176e+01 2.02479464e+02 4.72140094e+01 2.02479234e+02 4.72140474e+01 2.02479223e+02 4.72138588e+01 2.02479456e+02 4.72138837e+01 2.02479464e+02 4.72140094e+01 2.02478107e+02 4.72131616e+01 2.02477923e+02 4.72133460e+01 2.02477522e+02 4.72133947e+01 2.02477481e+02 4.72133904e+01 2.02477471e+02 4.72133631e+01 2.02477493e+02 4.72130772e+01 2.02477805e+02 4.72129734e+01 2.02478096e+02 4.72129361e+01 2.02478107e+02 4.72131616e+01 2.02480051e+02 4.72146751e+01 2.02479660e+02 4.72147088e+01 2.02479445e+02 4.72145427e+01 2.02479465e+02 4.72143094e+01 2.02479750e+02 4.72143175e+01 2.02480050e+02 4.72144209e+01 2.02480051e+02 4.72146751e+01 2.02479085e+02 4.72140721e+01 2.02478975e+02 4.72142390e+01 2.02479190e+02 4.72144052e+01 2.02479218e+02 4.72144541e+01 2.02479152e+02 4.72144339e+01 2.02478776e+02 4.72144773e+01 2.02478506e+02 4.72146081e+01 2.02478474e+02 4.72146090e+01 2.02478048e+02 4.72146211e+01 2.02477967e+02 4.72148698e+01 2.02477650e+02 4.72148923e+01 2.02477488e+02 4.72146863e+01 2.02477507e+02 4.72145823e+01 2.02477696e+02 4.72144013e+01 2.02477866e+02 4.72142080e+01 2.02478124e+02 4.72140702e+01 2.02478339e+02 4.72139053e+01 2.02478578e+02 4.72138813e+01 2.02478777e+02 4.72138798e+01 2.02479071e+02 4.72138427e+01 2.02479085e+02 4.72140721e+01 2.02469691e+02 4.72082027e+01 2.02469567e+02 4.72084244e+01 2.02469216e+02 4.72084344e+01 2.02469200e+02 4.72081952e+01 2.02469504e+02 4.72080856e+01 2.02469713e+02 4.72080672e+01 2.02469691e+02 4.72082027e+01 2.02480842e+02 4.72154689e+01 2.02481002e+02 4.72156698e+01 2.02480927e+02 4.72158208e+01 2.02480793e+02 4.72158246e+01 2.02480595e+02 4.72159126e+01 2.02480224e+02 4.72159193e+01 2.02479952e+02 4.72157951e+01 2.02479943e+02 4.72155057e+01 2.02480352e+02 4.72154991e+01 2.02480388e+02 4.72154840e+01 2.02480836e+02 4.72154652e+01 2.02480839e+02 4.72154651e+01 2.02480842e+02 4.72154689e+01 2.02477045e+02 4.72130966e+01 2.02477010e+02 4.72130877e+01 2.02476969e+02 4.72130491e+01 2.02477066e+02 4.72130464e+01 2.02477045e+02 4.72130966e+01 2.02479238e+02 4.72150648e+01 2.02479167e+02 4.72150730e+01 2.02478860e+02 4.72149750e+01 2.02478876e+02 4.72148390e+01 2.02479074e+02 4.72148164e+01 2.02479260e+02 4.72150047e+01 2.02479238e+02 4.72150648e+01 2.02475563e+02 4.72127695e+01 2.02475540e+02 4.72128725e+01 2.02475551e+02 4.72130611e+01 2.02475608e+02 4.72131474e+01 2.02475739e+02 4.72131785e+01 2.02475703e+02 4.72130773e+01 2.02475689e+02 4.72128478e+01 2.02475651e+02 4.72127904e+01 2.02475563e+02 4.72127695e+01 2.02465304e+02 4.72063587e+01 2.02465194e+02 4.72065255e+01 2.02465460e+02 4.72064566e+01 2.02465453e+02 4.72063340e+01 2.02465304e+02 4.72063587e+01 2.02486035e+02 4.72196095e+01 2.02485807e+02 4.72196041e+01 2.02485811e+02 4.72194699e+01 2.02486052e+02 4.72194229e+01 2.02486035e+02 4.72196095e+01 2.02467800e+02 4.72082181e+01 2.02467721e+02 4.72082368e+01 2.02467733e+02 4.72081764e+01 2.02467793e+02 4.72081840e+01 2.02467800e+02 4.72082181e+01 2.02471062e+02 4.72105553e+01 2.02470758e+02 4.72105486e+01 2.02470630e+02 4.72105848e+01 2.02470335e+02 4.72106998e+01 2.02470167e+02 4.72108938e+01 2.02469837e+02 4.72109032e+01 2.02469736e+02 4.72106529e+01 2.02469734e+02 4.72106232e+01 2.02469836e+02 4.72103878e+01 2.02470104e+02 4.72103811e+01 2.02470239e+02 4.72103403e+01 2.02470498e+02 4.72102034e+01 2.02470729e+02 4.72102445e+01 2.02471026e+02 4.72103501e+01 2.02471062e+02 4.72105553e+01 2.02467125e+02 4.72080955e+01 2.02467028e+02 4.72080983e+01 2.02467049e+02 4.72080481e+01 2.02467090e+02 4.72080524e+01 2.02467125e+02 4.72080955e+01 2.02486575e+02 4.72205449e+01 2.02486252e+02 4.72205766e+01 2.02486031e+02 4.72204146e+01 2.02485989e+02 4.72201793e+01 2.02486317e+02 4.72202032e+01 2.02486563e+02 4.72203472e+01 2.02486575e+02 4.72205449e+01 2.02464566e+02 4.72067952e+01 2.02464577e+02 4.72069806e+01 2.02464850e+02 4.72069729e+01 2.02464904e+02 4.72067392e+01 2.02464566e+02 4.72067952e+01 2.02478612e+02 4.72158705e+01 2.02478527e+02 4.72158711e+01 2.02478535e+02 4.72158229e+01 2.02478595e+02 4.72158212e+01 2.02478612e+02 4.72158705e+01 2.02476478e+02 4.72148372e+01 2.02476403e+02 4.72148371e+01 2.02476416e+02 4.72147980e+01 2.02476462e+02 4.72147940e+01 2.02476478e+02 4.72148372e+01 2.02464652e+02 4.72074477e+01 2.02464703e+02 4.72075383e+01 2.02464840e+02 4.72075651e+01 2.02464919e+02 4.72073787e+01 2.02464652e+02 4.72074477e+01 2.02476081e+02 4.72148881e+01 2.02475896e+02 4.72148866e+01 2.02475901e+02 4.72147758e+01 2.02476043e+02 4.72147781e+01 2.02476081e+02 4.72148881e+01 2.02472451e+02 4.72126202e+01 2.02472604e+02 4.72127632e+01 2.02472670e+02 4.72127572e+01 2.02472683e+02 4.72127047e+01 2.02472451e+02 4.72126202e+01 2.02476031e+02 4.72151560e+01 2.02475969e+02 4.72151577e+01 2.02475953e+02 4.72151073e+01 2.02476047e+02 4.72151000e+01 2.02476031e+02 4.72151560e+01 2.02474810e+02 4.72143932e+01 2.02474799e+02 4.72143954e+01 2.02474800e+02 4.72143872e+01 2.02474811e+02 4.72143869e+01 2.02474810e+02 4.72143932e+01 2.02471014e+02 4.72120214e+01 2.02470794e+02 4.72121831e+01 2.02470745e+02 4.72121845e+01 2.02470398e+02 4.72121157e+01 2.02470268e+02 4.72118863e+01 2.02470240e+02 4.72118375e+01 2.02470314e+02 4.72118519e+01 2.02470684e+02 4.72119044e+01 2.02470939e+02 4.72119746e+01 2.02471033e+02 4.72119719e+01 2.02471014e+02 4.72120214e+01 2.02485760e+02 4.72215321e+01 2.02485411e+02 4.72215235e+01 2.02485397e+02 4.72213053e+01 2.02485718e+02 4.72212961e+01 2.02485760e+02 4.72215321e+01 2.02473728e+02 4.72140165e+01 2.02473499e+02 4.72140545e+01 2.02473487e+02 4.72138659e+01 2.02473765e+02 4.72138581e+01 2.02473728e+02 4.72140165e+01 2.02485175e+02 4.72214657e+01 2.02485023e+02 4.72214847e+01 2.02484999e+02 4.72213557e+01 2.02485169e+02 4.72213762e+01 2.02485175e+02 4.72214657e+01 2.02480211e+02 4.72186647e+01 2.02480015e+02 4.72186764e+01 2.02480007e+02 4.72185376e+01 2.02480203e+02 4.72185372e+01 2.02480211e+02 4.72186647e+01 2.02473218e+02 4.72142963e+01 2.02473146e+02 4.72143149e+01 2.02473142e+02 4.72142488e+01 2.02473239e+02 4.72142461e+01 2.02473218e+02 4.72142963e+01 2.02479463e+02 4.72184969e+01 2.02479382e+02 4.72184933e+01 2.02479390e+02 4.72184513e+01 2.02479445e+02 4.72184466e+01 2.02479463e+02 4.72184969e+01 2.02464528e+02 4.72091656e+01 2.02464565e+02 4.72092669e+01 2.02464653e+02 4.72092433e+01 2.02464651e+02 4.72092030e+01 2.02464528e+02 4.72091656e+01 2.02483199e+02 4.72211292e+01 2.02482982e+02 4.72212929e+01 2.02482649e+02 4.72212857e+01 2.02482655e+02 4.72210889e+01 2.02482861e+02 4.72209181e+01 2.02483203e+02 4.72208766e+01 2.02483199e+02 4.72211292e+01 2.02472551e+02 4.72147773e+01 2.02472511e+02 4.72147839e+01 2.02472484e+02 4.72147351e+01 2.02472550e+02 4.72147553e+01 2.02472551e+02 4.72147773e+01 2.02474441e+02 4.72162572e+01 2.02474159e+02 4.72163801e+01 2.02473868e+02 4.72163839e+01 2.02473870e+02 4.72161997e+01 2.02474028e+02 4.72159993e+01 2.02474390e+02 4.72159987e+01 2.02474441e+02 4.72162572e+01 2.02483957e+02 4.72225001e+01 2.02483605e+02 4.72225320e+01 2.02483593e+02 4.72222730e+01 2.02483921e+02 4.72222979e+01 2.02483957e+02 4.72225001e+01 2.02484293e+02 4.72230090e+01 2.02484275e+02 4.72230128e+01 2.02484260e+02 4.72229886e+01 2.02484298e+02 4.72229958e+01 2.02484293e+02 4.72230090e+01 2.02471196e+02 4.72151274e+01 2.02471156e+02 4.72151341e+01 2.02471162e+02 4.72151063e+01 2.02471195e+02 4.72151054e+01 2.02471196e+02 4.72151274e+01 2.02471585e+02 4.72156695e+01 2.02471334e+02 4.72156530e+01 2.02471326e+02 4.72155082e+01 2.02471538e+02 4.72155022e+01 2.02471585e+02 4.72156695e+01 2.02465109e+02 4.72116235e+01 2.02464849e+02 4.72116592e+01 2.02464836e+02 4.72114527e+01 2.02465176e+02 4.72114172e+01 2.02465109e+02 4.72116235e+01 2.02465937e+02 4.72124396e+01 2.02465795e+02 4.72125869e+01 2.02465983e+02 4.72124684e+01 2.02466054e+02 4.72123954e+01 2.02465937e+02 4.72124396e+01 2.02482351e+02 4.72229928e+01 2.02482100e+02 4.72229926e+01 2.02482079e+02 4.72228230e+01 2.02482340e+02 4.72228155e+01 2.02482351e+02 4.72229928e+01 2.02479370e+02 4.72214307e+01 2.02479369e+02 4.72214308e+01 2.02479369e+02 4.72214298e+01 2.02479370e+02 4.72214298e+01 2.02479370e+02 4.72214307e+01 2.02477977e+02 4.72205603e+01 2.02477820e+02 4.72207618e+01 2.02477615e+02 4.72207737e+01 2.02477616e+02 4.72206340e+01 2.02477893e+02 4.72205081e+01 2.02477974e+02 4.72205091e+01 2.02477977e+02 4.72205603e+01 2.02471083e+02 4.72162537e+01 2.02470956e+02 4.72162573e+01 2.02470837e+02 4.72161002e+01 2.02471098e+02 4.72161527e+01 2.02471083e+02 4.72162537e+01 2.02489575e+02 4.71736567e+01 2.02489417e+02 4.71736612e+01 2.02489413e+02 4.71735554e+01 2.02489568e+02 4.71735494e+01 2.02489575e+02 4.71736567e+01 2.02481127e+02 4.71686753e+01 2.02480920e+02 4.71688448e+01 2.02480502e+02 4.71688647e+01 2.02480253e+02 4.71687234e+01 2.02480232e+02 4.71684146e+01 2.02480403e+02 4.71682870e+01 2.02480446e+02 4.71682495e+01 2.02480456e+02 4.71682485e+01 2.02480901e+02 4.71682442e+01 2.02481108e+02 4.71684171e+01 2.02481127e+02 4.71686753e+01 2.02493636e+02 4.71776904e+01 2.02493199e+02 4.71776978e+01 2.02493192e+02 4.71774128e+01 2.02493618e+02 4.71773885e+01 2.02493636e+02 4.71776904e+01 2.02493567e+02 4.71794419e+01 2.02493497e+02 4.71794305e+01 2.02493496e+02 4.71793974e+01 2.02493540e+02 4.71793982e+01 2.02493567e+02 4.71794419e+01 2.02495058e+02 4.71818694e+01 2.02494943e+02 4.71819406e+01 2.02494815e+02 4.71820162e+01 2.02494422e+02 4.71820003e+01 2.02494449e+02 4.71817878e+01 2.02494619e+02 4.71815946e+01 2.02494992e+02 4.71815789e+01 2.02495059e+02 4.71818548e+01 2.02495058e+02 4.71818694e+01 2.02491337e+02 4.71795439e+01 2.02491054e+02 4.71796098e+01 2.02491067e+02 4.71793754e+01 2.02491343e+02 4.71793959e+01 2.02491337e+02 4.71795439e+01 2.02489554e+02 4.71790280e+01 2.02489176e+02 4.71790914e+01 2.02489317e+02 4.71792671e+01 2.02489489e+02 4.71792868e+01 2.02489698e+02 4.71793103e+01 2.02489983e+02 4.71794249e+01 2.02490249e+02 4.71795541e+01 2.02490330e+02 4.71798123e+01 2.02490070e+02 4.71799491e+01 2.02490089e+02 4.71799973e+01 2.02490228e+02 4.71802200e+01 2.02490236e+02 4.71803521e+01 2.02490029e+02 4.71805217e+01 2.02489779e+02 4.71806647e+01 2.02489609e+02 4.71806779e+01 2.02489262e+02 4.71806087e+01 2.02489247e+02 4.71803324e+01 2.02489626e+02 4.71802698e+01 2.02489568e+02 4.71800572e+01 2.02489214e+02 4.71799940e+01 2.02489190e+02 4.71799973e+01 2.02489184e+02 4.71800159e+01 2.02489167e+02 4.71802822e+01 2.02489160e+02 4.71803593e+01 2.02489178e+02 4.71805881e+01 2.02488960e+02 4.71805071e+01 2.02488746e+02 4.71803395e+01 2.02488660e+02 4.71802648e+01 2.02488586e+02 4.71801323e+01 2.02488340e+02 4.71800646e+01 2.02488279e+02 4.71800338e+01 2.02488280e+02 4.71800273e+01 2.02488409e+02 4.71798083e+01 2.02488568e+02 4.71796088e+01 2.02488724e+02 4.71794069e+01 2.02488727e+02 4.71793772e+01 2.02488708e+02 4.71790978e+01 2.02488697e+02 4.71790745e+01 2.02488735e+02 4.71788156e+01 2.02489106e+02 4.71787720e+01 2.02489137e+02 4.71787675e+01 2.02489533e+02 4.71787813e+01 2.02489554e+02 4.71790280e+01 2.02495601e+02 4.71831060e+01 2.02495392e+02 4.71832746e+01 2.02495182e+02 4.71834425e+01 2.02495131e+02 4.71834287e+01 2.02495126e+02 4.71834072e+01 2.02495271e+02 4.71831990e+01 2.02495501e+02 4.71830435e+01 2.02495617e+02 4.71830694e+01 2.02495601e+02 4.71831060e+01 2.02495271e+02 4.71828997e+01 2.02494988e+02 4.71830218e+01 2.02494855e+02 4.71829815e+01 2.02494861e+02 4.71829427e+01 2.02494827e+02 4.71826770e+01 2.02494824e+02 4.71826201e+01 2.02494919e+02 4.71826089e+01 2.02495281e+02 4.71826667e+01 2.02495271e+02 4.71828997e+01 2.02493223e+02 4.71816199e+01 2.02493166e+02 4.71816270e+01 2.02493035e+02 4.71815028e+01 2.02493228e+02 4.71815816e+01 2.02493223e+02 4.71816199e+01 2.02491101e+02 4.71802943e+01 2.02490865e+02 4.71804003e+01 2.02490949e+02 4.71801994e+01 2.02491144e+02 4.71801939e+01 2.02491101e+02 4.71802943e+01 2.02497067e+02 4.71843209e+01 2.02497002e+02 4.71843228e+01 2.02497001e+02 4.71842796e+01 2.02497052e+02 4.71842861e+01 2.02497067e+02 4.71843209e+01 2.02493649e+02 4.71821853e+01 2.02493325e+02 4.71821606e+01 2.02493357e+02 4.71820031e+01 2.02493572e+02 4.71819783e+01 2.02493649e+02 4.71821853e+01 2.02492690e+02 4.71815860e+01 2.02492401e+02 4.71815423e+01 2.02492424e+02 4.71814201e+01 2.02492572e+02 4.71814159e+01 2.02492690e+02 4.71815860e+01 2.02487797e+02 4.71785284e+01 2.02487526e+02 4.71786584e+01 2.02487490e+02 4.71786655e+01 2.02487502e+02 4.71786433e+01 2.02487389e+02 4.71784144e+01 2.02487212e+02 4.71782203e+01 2.02487208e+02 4.71781602e+01 2.02487306e+02 4.71781503e+01 2.02487603e+02 4.71782562e+01 2.02487747e+02 4.71784753e+01 2.02487797e+02 4.71785284e+01 2.02501659e+02 4.71874883e+01 2.02501468e+02 4.71875296e+01 2.02501488e+02 4.71873818e+01 2.02501650e+02 4.71873945e+01 2.02501659e+02 4.71874883e+01 2.02493633e+02 4.71824746e+01 2.02493307e+02 4.71824994e+01 2.02493295e+02 4.71822636e+01 2.02493672e+02 4.71822297e+01 2.02493633e+02 4.71824746e+01 2.02486169e+02 4.71781096e+01 2.02486011e+02 4.71781319e+01 2.02485959e+02 4.71779780e+01 2.02486228e+02 4.71779716e+01 2.02486169e+02 4.71781096e+01 2.02477170e+02 4.71724841e+01 2.02476886e+02 4.71725138e+01 2.02476921e+02 4.71723283e+01 2.02477204e+02 4.71722785e+01 2.02477170e+02 4.71724841e+01 2.02501312e+02 4.71878700e+01 2.02501070e+02 4.71878237e+01 2.02500699e+02 4.71877728e+01 2.02500663e+02 4.71877634e+01 2.02500390e+02 4.71876755e+01 2.02500369e+02 4.71875801e+01 2.02500501e+02 4.71873636e+01 2.02500796e+02 4.71873753e+01 2.02501010e+02 4.71875427e+01 2.02501243e+02 4.71876960e+01 2.02501312e+02 4.71878700e+01 2.02495333e+02 4.71841352e+01 2.02495337e+02 4.71842523e+01 2.02495349e+02 4.71844441e+01 2.02495157e+02 4.71843855e+01 2.02494927e+02 4.71842304e+01 2.02494875e+02 4.71841481e+01 2.02495131e+02 4.71840088e+01 2.02495244e+02 4.71839961e+01 2.02495333e+02 4.71841352e+01 2.02491138e+02 4.71815138e+01 2.02491116e+02 4.71815156e+01 2.02491117e+02 4.71815009e+01 2.02491139e+02 4.71814992e+01 2.02491138e+02 4.71815138e+01 2.02500097e+02 4.71874104e+01 2.02499911e+02 4.71873788e+01 2.02499898e+02 4.71872858e+01 2.02500048e+02 4.71872777e+01 2.02500097e+02 4.71874104e+01 2.02495834e+02 4.71847473e+01 2.02495882e+02 4.71848261e+01 2.02495834e+02 4.71850460e+01 2.02495512e+02 4.71851439e+01 2.02495456e+02 4.71851407e+01 2.02495062e+02 4.71851066e+01 2.02494815e+02 4.71849638e+01 2.02494874e+02 4.71847452e+01 2.02495165e+02 4.71846280e+01 2.02495366e+02 4.71845565e+01 2.02495477e+02 4.71845241e+01 2.02495800e+02 4.71845608e+01 2.02495834e+02 4.71847473e+01 2.02496730e+02 4.71856059e+01 2.02496608e+02 4.71855905e+01 2.02496316e+02 4.71854812e+01 2.02496316e+02 4.71853476e+01 2.02496504e+02 4.71853422e+01 2.02496746e+02 4.71854882e+01 2.02496730e+02 4.71856059e+01 2.02486966e+02 4.71795049e+01 2.02486764e+02 4.71795272e+01 2.02486505e+02 4.71793930e+01 2.02486522e+02 4.71792274e+01 2.02486750e+02 4.71792121e+01 2.02486976e+02 4.71793708e+01 2.02486966e+02 4.71795049e+01 2.02496070e+02 4.71854929e+01 2.02495877e+02 4.71854800e+01 2.02495850e+02 4.71853554e+01 2.02496052e+02 4.71853505e+01 2.02496070e+02 4.71854929e+01 2.02491038e+02 4.71823486e+01 2.02490827e+02 4.71823804e+01 2.02490814e+02 4.71822089e+01 2.02491069e+02 4.71822016e+01 2.02491038e+02 4.71823486e+01 2.02485617e+02 4.71792605e+01 2.02485290e+02 4.71793550e+01 2.02485215e+02 4.71793705e+01 2.02485235e+02 4.71793208e+01 2.02485400e+02 4.71791246e+01 2.02485622e+02 4.71790703e+01 2.02485617e+02 4.71792605e+01 2.02497210e+02 4.71871024e+01 2.02497203e+02 4.71871031e+01 2.02497204e+02 4.71870984e+01 2.02497209e+02 4.71870985e+01 2.02497210e+02 4.71871024e+01 2.02472885e+02 4.71718996e+01 2.02472873e+02 4.71719012e+01 2.02472874e+02 4.71718927e+01 2.02472885e+02 4.71718924e+01 2.02472885e+02 4.71718996e+01 2.02498701e+02 4.71883327e+01 2.02498628e+02 4.71883274e+01 2.02498630e+02 4.71882884e+01 2.02498679e+02 4.71882900e+01 2.02498701e+02 4.71883327e+01 2.02485689e+02 4.71802028e+01 2.02485413e+02 4.71803293e+01 2.02485263e+02 4.71803114e+01 2.02485213e+02 4.71802041e+01 2.02485415e+02 4.71800316e+01 2.02485644e+02 4.71800300e+01 2.02485689e+02 4.71802028e+01 2.02501726e+02 4.71905215e+01 2.02501463e+02 4.71904623e+01 2.02501442e+02 4.71903440e+01 2.02501594e+02 4.71903651e+01 2.02501726e+02 4.71905215e+01 2.02500854e+02 4.71899765e+01 2.02500797e+02 4.71899781e+01 2.02500484e+02 4.71898842e+01 2.02500286e+02 4.71899210e+01 2.02500043e+02 4.71898849e+01 2.02500035e+02 4.71897646e+01 2.02500334e+02 4.71896517e+01 2.02500365e+02 4.71896470e+01 2.02500675e+02 4.71897429e+01 2.02500864e+02 4.71899288e+01 2.02500854e+02 4.71899765e+01 2.02501598e+02 4.71910395e+01 2.02501546e+02 4.71910515e+01 2.02501538e+02 4.71910025e+01 2.02501615e+02 4.71910003e+01 2.02501598e+02 4.71910395e+01 2.02498544e+02 4.71891324e+01 2.02498430e+02 4.71891244e+01 2.02498159e+02 4.71889998e+01 2.02498084e+02 4.71888450e+01 2.02498433e+02 4.71887968e+01 2.02498521e+02 4.71890572e+01 2.02498544e+02 4.71891324e+01 2.02477096e+02 4.71757290e+01 2.02476924e+02 4.71757392e+01 2.02476931e+02 4.71756259e+01 2.02477077e+02 4.71756261e+01 2.02477096e+02 4.71757290e+01 2.02498508e+02 4.71894089e+01 2.02498461e+02 4.71894272e+01 2.02498485e+02 4.71893942e+01 2.02498511e+02 4.71893902e+01 2.02498508e+02 4.71894089e+01 2.02497289e+02 4.71886470e+01 2.02497107e+02 4.71888016e+01 2.02497095e+02 4.71888253e+01 2.02497074e+02 4.71888259e+01 2.02496789e+02 4.71887108e+01 2.02496778e+02 4.71886269e+01 2.02496862e+02 4.71883807e+01 2.02497267e+02 4.71883573e+01 2.02497289e+02 4.71886470e+01 2.02501447e+02 4.71915439e+01 2.02501316e+02 4.71915472e+01 2.02501330e+02 4.71914704e+01 2.02501472e+02 4.71914318e+01 2.02501447e+02 4.71915439e+01 2.02498779e+02 4.71898773e+01 2.02498727e+02 4.71898815e+01 2.02498737e+02 4.71898512e+01 2.02498771e+02 4.71898487e+01 2.02498779e+02 4.71898773e+01 2.02501444e+02 4.71918407e+01 2.02501290e+02 4.71920436e+01 2.02501081e+02 4.71920459e+01 2.02501087e+02 4.71919168e+01 2.02501348e+02 4.71917808e+01 2.02501444e+02 4.71917777e+01 2.02501444e+02 4.71918407e+01 2.02504728e+02 4.71941906e+01 2.02504305e+02 4.71942189e+01 2.02504314e+02 4.71939325e+01 2.02504698e+02 4.71939281e+01 2.02504728e+02 4.71941906e+01 2.02499841e+02 4.71914377e+01 2.02499548e+02 4.71915524e+01 2.02499652e+02 4.71913198e+01 2.02499828e+02 4.71913457e+01 2.02499841e+02 4.71914377e+01 2.02499136e+02 4.71909974e+01 2.02498936e+02 4.71910288e+01 2.02498992e+02 4.71909074e+01 2.02499086e+02 4.71909178e+01 2.02499136e+02 4.71909974e+01 2.02504929e+02 4.71949146e+01 2.02504712e+02 4.71950781e+01 2.02504474e+02 4.71950699e+01 2.02504152e+02 4.71949825e+01 2.02503931e+02 4.71948203e+01 2.02503668e+02 4.71946893e+01 2.02503453e+02 4.71945910e+01 2.02503399e+02 4.71945632e+01 2.02503397e+02 4.71945564e+01 2.02503430e+02 4.71942773e+01 2.02503792e+02 4.71942723e+01 2.02504067e+02 4.71943766e+01 2.02504193e+02 4.71943011e+01 2.02504530e+02 4.71943775e+01 2.02504771e+02 4.71945250e+01 2.02504990e+02 4.71946883e+01 2.02504929e+02 4.71949146e+01 2.02510081e+02 4.71984306e+01 2.02510033e+02 4.71984452e+01 2.02510044e+02 4.71984076e+01 2.02510080e+02 4.71984107e+01 2.02510081e+02 4.71984306e+01 2.02502817e+02 4.71941939e+01 2.02502577e+02 4.71941946e+01 2.02502511e+02 4.71940026e+01 2.02502847e+02 4.71939951e+01 2.02502817e+02 4.71941939e+01 2.02502354e+02 4.71939049e+01 2.02502113e+02 4.71938865e+01 2.02502047e+02 4.71937133e+01 2.02502369e+02 4.71936974e+01 2.02502354e+02 4.71939049e+01 2.02501824e+02 4.71935739e+01 2.02501658e+02 4.71935721e+01 2.02501633e+02 4.71934545e+01 2.02501797e+02 4.71934695e+01 2.02501824e+02 4.71935739e+01 2.02506011e+02 4.71964878e+01 2.02505655e+02 4.71964748e+01 2.02505633e+02 4.71962516e+01 2.02505994e+02 4.71962242e+01 2.02506011e+02 4.71964878e+01 2.02508242e+02 4.71981799e+01 2.02508042e+02 4.71983538e+01 2.02507935e+02 4.71983690e+01 2.02507721e+02 4.71984528e+01 2.02507411e+02 4.71984315e+01 2.02507271e+02 4.71982096e+01 2.02507265e+02 4.71981676e+01 2.02507339e+02 4.71981588e+01 2.02507605e+02 4.71980809e+01 2.02507923e+02 4.71980529e+01 2.02508184e+02 4.71981438e+01 2.02508233e+02 4.71981492e+01 2.02508242e+02 4.71981799e+01 2.02498510e+02 4.71927005e+01 2.02498431e+02 4.71927038e+01 2.02498434e+02 4.71926529e+01 2.02498509e+02 4.71926461e+01 2.02498510e+02 4.71927005e+01 2.02473531e+02 4.71779887e+01 2.02473423e+02 4.71780015e+01 2.02473404e+02 4.71779091e+01 2.02473536e+02 4.71779173e+01 2.02473531e+02 4.71779887e+01 2.02508653e+02 4.72002310e+01 2.02508507e+02 4.72002245e+01 2.02508498e+02 4.72001339e+01 2.02508692e+02 4.72000882e+01 2.02508653e+02 4.72002310e+01 2.02472833e+02 4.71778510e+01 2.02472746e+02 4.71778506e+01 2.02472748e+02 4.71777980e+01 2.02472820e+02 4.71777962e+01 2.02472833e+02 4.71778510e+01 2.02472076e+02 4.71773777e+01 2.02472064e+02 4.71773792e+01 2.02472062e+02 4.71773689e+01 2.02472081e+02 4.71773665e+01 2.02472076e+02 4.71773777e+01 2.02471596e+02 4.71773772e+01 2.02471218e+02 4.71774400e+01 2.02471038e+02 4.71774865e+01 2.02471061e+02 4.71773417e+01 2.02471272e+02 4.71771747e+01 2.02471463e+02 4.71771725e+01 2.02471596e+02 4.71773772e+01 2.02505753e+02 4.71990184e+01 2.02505735e+02 4.71990193e+01 2.02505736e+02 4.71990075e+01 2.02505754e+02 4.71990058e+01 2.02505753e+02 4.71990184e+01 2.02474547e+02 4.71795214e+01 2.02474383e+02 4.71795690e+01 2.02474441e+02 4.71794549e+01 2.02474544e+02 4.71794495e+01 2.02474547e+02 4.71795214e+01 2.02470593e+02 4.71770493e+01 2.02470220e+02 4.71771148e+01 2.02470283e+02 4.71768555e+01 2.02470541e+02 4.71768775e+01 2.02470593e+02 4.71770493e+01 2.02472608e+02 4.71789072e+01 2.02472391e+02 4.71790712e+01 2.02472184e+02 4.71792410e+01 2.02472184e+02 4.71792424e+01 2.02472116e+02 4.71794975e+01 2.02471783e+02 4.71795380e+01 2.02471560e+02 4.71793779e+01 2.02471343e+02 4.71793131e+01 2.02471242e+02 4.71792875e+01 2.02471230e+02 4.71792426e+01 2.02471157e+02 4.71790251e+01 2.02470982e+02 4.71788290e+01 2.02470597e+02 4.71787883e+01 2.02470639e+02 4.71785741e+01 2.02470948e+02 4.71785290e+01 2.02471039e+02 4.71785251e+01 2.02471427e+02 4.71785002e+01 2.02471527e+02 4.71785308e+01 2.02471728e+02 4.71786034e+01 2.02472139e+02 4.71786143e+01 2.02472158e+02 4.71786103e+01 2.02472578e+02 4.71786254e+01 2.02472608e+02 4.71789072e+01 2.02469423e+02 4.71769160e+01 2.02469201e+02 4.71768922e+01 2.02469213e+02 4.71767849e+01 2.02469365e+02 4.71767711e+01 2.02469423e+02 4.71769160e+01 2.02470111e+02 4.71776456e+01 2.02469941e+02 4.71776463e+01 2.02469875e+02 4.71774981e+01 2.02470082e+02 4.71775426e+01 2.02470111e+02 4.71776456e+01 2.02507076e+02 4.72016391e+01 2.02507039e+02 4.72016358e+01 2.02507038e+02 4.72016152e+01 2.02507069e+02 4.72016134e+01 2.02507076e+02 4.72016391e+01 2.02476162e+02 4.71823258e+01 2.02475919e+02 4.71823379e+01 2.02475920e+02 4.71821749e+01 2.02476154e+02 4.71821641e+01 2.02476162e+02 4.71823258e+01 2.02470364e+02 4.71790004e+01 2.02470291e+02 4.71790144e+01 2.02470288e+02 4.71789529e+01 2.02470437e+02 4.71789068e+01 2.02470364e+02 4.71790004e+01 2.02469250e+02 4.71786034e+01 2.02469102e+02 4.71785918e+01 2.02469062e+02 4.71784860e+01 2.02469243e+02 4.71784876e+01 2.02469250e+02 4.71786034e+01 2.02469929e+02 4.71793273e+01 2.02469867e+02 4.71793279e+01 2.02469866e+02 4.71792875e+01 2.02469944e+02 4.71792706e+01 2.02469929e+02 4.71793273e+01 2.02508853e+02 4.72039446e+01 2.02508745e+02 4.72039542e+01 2.02508742e+02 4.72038757e+01 2.02508853e+02 4.72038743e+01 2.02508853e+02 4.72039446e+01 2.02475337e+02 4.71830070e+01 2.02474996e+02 4.71830194e+01 2.02474997e+02 4.71827944e+01 2.02475316e+02 4.71827832e+01 2.02475337e+02 4.71830070e+01 2.02508893e+02 4.72042686e+01 2.02508685e+02 4.72043243e+01 2.02508702e+02 4.72041496e+01 2.02508917e+02 4.72041523e+01 2.02508893e+02 4.72042686e+01 2.02508184e+02 4.72038265e+01 2.02508024e+02 4.72038364e+01 2.02508037e+02 4.72037345e+01 2.02508183e+02 4.72037187e+01 2.02508184e+02 4.72038265e+01 2.02465777e+02 4.71773292e+01 2.02465555e+02 4.71773093e+01 2.02465556e+02 4.71771912e+01 2.02465740e+02 4.71771723e+01 2.02465777e+02 4.71773292e+01 2.02494317e+02 4.71957645e+01 2.02494281e+02 4.71957717e+01 2.02494286e+02 4.71957451e+01 2.02494329e+02 4.71957358e+01 2.02494317e+02 4.71957645e+01 2.02496870e+02 4.71976585e+01 2.02496532e+02 4.71976869e+01 2.02496547e+02 4.71974569e+01 2.02496855e+02 4.71974481e+01 2.02496870e+02 4.71976585e+01 2.02469554e+02 4.71808881e+01 2.02469517e+02 4.71808875e+01 2.02469516e+02 4.71808639e+01 2.02469551e+02 4.71808623e+01 2.02469554e+02 4.71808881e+01 2.02463933e+02 4.71779714e+01 2.02463771e+02 4.71779769e+01 2.02463734e+02 4.71778472e+01 2.02463922e+02 4.71778656e+01 2.02463933e+02 4.71779714e+01 2.02481234e+02 4.71905823e+01 2.02481062e+02 4.71905745e+01 2.02481032e+02 4.71904563e+01 2.02481201e+02 4.71904711e+01 2.02481234e+02 4.71905823e+01 2.02461671e+02 4.71786519e+01 2.02461534e+02 4.71786539e+01 2.02461519e+02 4.71785570e+01 2.02461735e+02 4.71785051e+01 2.02461671e+02 4.71786519e+01 2.02481773e+02 4.71915176e+01 2.02481465e+02 4.71916240e+01 2.02481589e+02 4.71918116e+01 2.02481626e+02 4.71920240e+01 2.02481401e+02 4.71921823e+01 2.02481179e+02 4.71921146e+01 2.02480857e+02 4.71920269e+01 2.02480587e+02 4.71919728e+01 2.02480428e+02 4.71921730e+01 2.02480510e+02 4.71922837e+01 2.02480755e+02 4.71924281e+01 2.02480985e+02 4.71925212e+01 2.02481079e+02 4.71925136e+01 2.02481312e+02 4.71924262e+01 2.02481682e+02 4.71923930e+01 2.02481873e+02 4.71925777e+01 2.02482050e+02 4.71927721e+01 2.02482324e+02 4.71928950e+01 2.02482409e+02 4.71931115e+01 2.02482306e+02 4.71932336e+01 2.02482487e+02 4.71931605e+01 2.02482759e+02 4.71932244e+01 2.02483135e+02 4.71932715e+01 2.02483069e+02 4.71935239e+01 2.02483033e+02 4.71936725e+01 2.02483143e+02 4.71938696e+01 2.02482883e+02 4.71940061e+01 2.02482872e+02 4.71941170e+01 2.02483169e+02 4.71942226e+01 2.02483152e+02 4.71944736e+01 2.02483190e+02 4.71945326e+01 2.02483205e+02 4.71948054e+01 2.02482858e+02 4.71948883e+01 2.02482882e+02 4.71950857e+01 2.02483115e+02 4.71950485e+01 2.02483423e+02 4.71949419e+01 2.02483582e+02 4.71947421e+01 2.02483629e+02 4.71945337e+01 2.02483262e+02 4.71944791e+01 2.02483220e+02 4.71942165e+01 2.02483520e+02 4.71941048e+01 2.02483752e+02 4.71941173e+01 2.02483760e+02 4.71942552e+01 2.02483705e+02 4.71944774e+01 2.02483970e+02 4.71946065e+01 2.02483975e+02 4.71946887e+01 2.02483911e+02 4.71949474e+01 2.02483507e+02 4.71949947e+01 2.02483613e+02 4.71951960e+01 2.02483709e+02 4.71954197e+01 2.02483308e+02 4.71954215e+01 2.02483260e+02 4.71954382e+01 2.02482902e+02 4.71953958e+01 2.02482629e+02 4.71953430e+01 2.02482552e+02 4.71953292e+01 2.02482299e+02 4.71951911e+01 2.02482206e+02 4.71950789e+01 2.02482113e+02 4.71950029e+01 2.02482018e+02 4.71949617e+01 2.02481798e+02 4.71949106e+01 2.02481748e+02 4.71947926e+01 2.02482007e+02 4.71946555e+01 2.02482248e+02 4.71945067e+01 2.02482173e+02 4.71943083e+01 2.02482158e+02 4.71941512e+01 2.02482198e+02 4.71939639e+01 2.02481987e+02 4.71937948e+01 2.02481709e+02 4.71936747e+01 2.02481418e+02 4.71935647e+01 2.02481244e+02 4.71933681e+01 2.02481005e+02 4.71932190e+01 2.02480673e+02 4.71931389e+01 2.02480581e+02 4.71928815e+01 2.02480430e+02 4.71927724e+01 2.02480355e+02 4.71927234e+01 2.02480150e+02 4.71925495e+01 2.02479962e+02 4.71924800e+01 2.02479864e+02 4.71924353e+01 2.02479662e+02 4.71922924e+01 2.02479640e+02 4.71922754e+01 2.02479653e+02 4.71919879e+01 2.02480002e+02 4.71920078e+01 2.02480241e+02 4.71920563e+01 2.02480267e+02 4.71918125e+01 2.02480186e+02 4.71917227e+01 2.02480077e+02 4.71916276e+01 2.02480012e+02 4.71916140e+01 2.02479735e+02 4.71917401e+01 2.02479481e+02 4.71917421e+01 2.02479463e+02 4.71915699e+01 2.02479443e+02 4.71914452e+01 2.02479226e+02 4.71912802e+01 2.02478984e+02 4.71911340e+01 2.02478969e+02 4.71909618e+01 2.02479069e+02 4.71907457e+01 2.02479050e+02 4.71907134e+01 2.02479107e+02 4.71907173e+01 2.02479478e+02 4.71907690e+01 2.02479694e+02 4.71909344e+01 2.02479981e+02 4.71909958e+01 2.02480054e+02 4.71909937e+01 2.02480411e+02 4.71910553e+01 2.02480464e+02 4.71912976e+01 2.02480477e+02 4.71913321e+01 2.02480542e+02 4.71913464e+01 2.02480912e+02 4.71913358e+01 2.02481091e+02 4.71913905e+01 2.02481211e+02 4.71914400e+01 2.02481586e+02 4.71914008e+01 2.02481720e+02 4.71913891e+01 2.02481773e+02 4.71915176e+01 2.02462663e+02 4.71801700e+01 2.02462527e+02 4.71801973e+01 2.02462254e+02 4.71800732e+01 2.02462081e+02 4.71798756e+01 2.02462075e+02 4.71798020e+01 2.02462183e+02 4.71798009e+01 2.02462472e+02 4.71799123e+01 2.02462663e+02 4.71800964e+01 2.02462663e+02 4.71801700e+01 2.02481690e+02 4.71929614e+01 2.02481389e+02 4.71929354e+01 2.02481235e+02 4.71929761e+01 2.02481219e+02 4.71930607e+01 2.02481495e+02 4.71931820e+01 2.02481550e+02 4.71931729e+01 2.02481831e+02 4.71930494e+01 2.02481783e+02 4.71929695e+01 2.02481690e+02 4.71929614e+01 2.02477093e+02 4.71900884e+01 2.02477102e+02 4.71902468e+01 2.02477078e+02 4.71903787e+01 2.02476823e+02 4.71905183e+01 2.02476786e+02 4.71907946e+01 2.02476463e+02 4.71908915e+01 2.02476192e+02 4.71909198e+01 2.02475888e+02 4.71908185e+01 2.02475871e+02 4.71908207e+01 2.02475517e+02 4.71907672e+01 2.02475202e+02 4.71907023e+01 2.02475151e+02 4.71907125e+01 2.02474754e+02 4.71906808e+01 2.02474487e+02 4.71905525e+01 2.02474483e+02 4.71905517e+01 2.02474039e+02 4.71905581e+01 2.02474013e+02 4.71905573e+01 2.02474020e+02 4.71905726e+01 2.02474084e+02 4.71906018e+01 2.02474471e+02 4.71905644e+01 2.02474680e+02 4.71907354e+01 2.02474860e+02 4.71909276e+01 2.02475149e+02 4.71910397e+01 2.02475372e+02 4.71912003e+01 2.02475487e+02 4.71911792e+01 2.02475847e+02 4.71911746e+01 2.02475980e+02 4.71911885e+01 2.02476167e+02 4.71910062e+01 2.02476505e+02 4.71910131e+01 2.02476741e+02 4.71911647e+01 2.02476959e+02 4.71913285e+01 2.02476964e+02 4.71915039e+01 2.02476664e+02 4.71916158e+01 2.02476821e+02 4.71917558e+01 2.02477086e+02 4.71918853e+01 2.02477135e+02 4.71919098e+01 2.02477435e+02 4.71919532e+01 2.02477658e+02 4.71921135e+01 2.02477686e+02 4.71922543e+01 2.02477426e+02 4.71922852e+01 2.02477251e+02 4.71922816e+01 2.02476947e+02 4.71923134e+01 2.02476838e+02 4.71923229e+01 2.02476831e+02 4.71923992e+01 2.02476862e+02 4.71926368e+01 2.02476469e+02 4.71926670e+01 2.02476442e+02 4.71926736e+01 2.02476439e+02 4.71926887e+01 2.02476634e+02 4.71927941e+01 2.02476710e+02 4.71928137e+01 2.02477042e+02 4.71927494e+01 2.02477178e+02 4.71927935e+01 2.02477189e+02 4.71928413e+01 2.02477269e+02 4.71930518e+01 2.02477518e+02 4.71931930e+01 2.02477684e+02 4.71933953e+01 2.02477968e+02 4.71935109e+01 2.02478040e+02 4.71936725e+01 2.02478091e+02 4.71937455e+01 2.02478259e+02 4.71938096e+01 2.02478415e+02 4.71938314e+01 2.02478738e+02 4.71939182e+01 2.02478674e+02 4.71940688e+01 2.02478736e+02 4.71942450e+01 2.02478992e+02 4.71943808e+01 2.02479205e+02 4.71945494e+01 2.02479451e+02 4.71946923e+01 2.02479748e+02 4.71947987e+01 2.02479966e+02 4.71949626e+01 2.02480191e+02 4.71951217e+01 2.02480301e+02 4.71953656e+01 2.02480560e+02 4.71954998e+01 2.02480948e+02 4.71955385e+01 2.02481186e+02 4.71956381e+01 2.02481237e+02 4.71956500e+01 2.02481514e+02 4.71957709e+01 2.02481802e+02 4.71958835e+01 2.02481854e+02 4.71960556e+01 2.02481806e+02 4.71962056e+01 2.02481808e+02 4.71963263e+01 2.02481877e+02 4.71964786e+01 2.02481989e+02 4.71967215e+01 2.02482030e+02 4.71967638e+01 2.02482212e+02 4.71968819e+01 2.02482303e+02 4.71971397e+01 2.02482293e+02 4.71972275e+01 2.02482167e+02 4.71974481e+01 2.02481878e+02 4.71975665e+01 2.02481813e+02 4.71978252e+01 2.02481590e+02 4.71979853e+01 2.02481538e+02 4.71980306e+01 2.02481393e+02 4.71981610e+01 2.02481348e+02 4.71981709e+01 2.02480964e+02 4.71981926e+01 2.02480852e+02 4.71982125e+01 2.02480608e+02 4.71980671e+01 2.02480223e+02 4.71980260e+01 2.02480218e+02 4.71980255e+01 2.02479868e+02 4.71979630e+01 2.02479709e+02 4.71977552e+01 2.02479716e+02 4.71977118e+01 2.02479801e+02 4.71974658e+01 2.02480181e+02 4.71974067e+01 2.02480186e+02 4.71974068e+01 2.02480187e+02 4.71974024e+01 2.02480270e+02 4.71971606e+01 2.02480385e+02 4.71969330e+01 2.02480386e+02 4.71969297e+01 2.02480378e+02 4.71969286e+01 2.02479954e+02 4.71969238e+01 2.02479689e+02 4.71967941e+01 2.02479452e+02 4.71966440e+01 2.02479420e+02 4.71966292e+01 2.02479075e+02 4.71967130e+01 2.02478788e+02 4.71968324e+01 2.02478718e+02 4.71970879e+01 2.02478443e+02 4.71970640e+01 2.02478198e+02 4.71969198e+01 2.02478101e+02 4.71967028e+01 2.02478490e+02 4.71967041e+01 2.02478703e+02 4.71967797e+01 2.02478572e+02 4.71966434e+01 2.02478414e+02 4.71964345e+01 2.02478461e+02 4.71963288e+01 2.02478384e+02 4.71961318e+01 2.02478130e+02 4.71961223e+01 2.02478023e+02 4.71963545e+01 2.02477719e+02 4.71962978e+01 2.02477376e+02 4.71962260e+01 2.02477324e+02 4.71962168e+01 2.02477340e+02 4.71962524e+01 2.02477366e+02 4.71965423e+01 2.02477353e+02 4.71965681e+01 2.02477227e+02 4.71967547e+01 2.02476950e+02 4.71968808e+01 2.02477157e+02 4.71970383e+01 2.02477290e+02 4.71970932e+01 2.02477486e+02 4.71971208e+01 2.02477517e+02 4.71972350e+01 2.02477359e+02 4.71974358e+01 2.02477339e+02 4.71975548e+01 2.02477465e+02 4.71977868e+01 2.02477781e+02 4.71978782e+01 2.02478144e+02 4.71979354e+01 2.02478159e+02 4.71979354e+01 2.02478455e+02 4.71980312e+01 2.02478456e+02 4.71981208e+01 2.02478421e+02 4.71983819e+01 2.02478588e+02 4.71985030e+01 2.02478347e+02 4.71984361e+01 2.02478156e+02 4.71982524e+01 2.02477787e+02 4.71983012e+01 2.02477594e+02 4.71984799e+01 2.02477601e+02 4.71986623e+01 2.02477578e+02 4.71987694e+01 2.02477471e+02 4.71990012e+01 2.02477430e+02 4.71991137e+01 2.02477561e+02 4.71993423e+01 2.02477580e+02 4.71993687e+01 2.02477764e+02 4.71995179e+01 2.02477860e+02 4.71997725e+01 2.02477954e+02 4.71999016e+01 2.02478012e+02 4.71999849e+01 2.02478082e+02 4.72002591e+01 2.02478480e+02 4.72002901e+01 2.02478754e+02 4.72004133e+01 2.02478856e+02 4.72006629e+01 2.02479051e+02 4.72008440e+01 2.02479082e+02 4.72009060e+01 2.02478999e+02 4.72008826e+01 2.02478769e+02 4.72007269e+01 2.02478388e+02 4.72007716e+01 2.02478218e+02 4.72008090e+01 2.02478244e+02 4.72006812e+01 2.02478121e+02 4.72005550e+01 2.02477992e+02 4.72005242e+01 2.02477663e+02 4.72006178e+01 2.02477628e+02 4.72008947e+01 2.02477596e+02 4.72009434e+01 2.02477574e+02 4.72011600e+01 2.02477650e+02 4.72012288e+01 2.02477703e+02 4.72012408e+01 2.02477696e+02 4.72011944e+01 2.02477664e+02 4.72009170e+01 2.02478041e+02 4.72009398e+01 2.02478196e+02 4.72011506e+01 2.02478183e+02 4.72012416e+01 2.02478159e+02 4.72015034e+01 2.02478175e+02 4.72015360e+01 2.02478134e+02 4.72018093e+01 2.02478119e+02 4.72018583e+01 2.02478094e+02 4.72020838e+01 2.02478145e+02 4.72021645e+01 2.02478181e+02 4.72024373e+01 2.02478146e+02 4.72024888e+01 2.02478142e+02 4.72027119e+01 2.02478061e+02 4.72028769e+01 2.02478033e+02 4.72029431e+01 2.02478155e+02 4.72031331e+01 2.02478114e+02 4.72032929e+01 2.02477948e+02 4.72034883e+01 2.02477595e+02 4.72035461e+01 2.02477462e+02 4.72033191e+01 2.02477242e+02 4.72033466e+01 2.02477072e+02 4.72035391e+01 2.02476895e+02 4.72037282e+01 2.02476638e+02 4.72038663e+01 2.02476259e+02 4.72038830e+01 2.02476219e+02 4.72039037e+01 2.02476213e+02 4.72039168e+01 2.02476178e+02 4.72041774e+01 2.02475868e+02 4.72041720e+01 2.02475701e+02 4.72039700e+01 2.02475335e+02 4.72039500e+01 2.02475290e+02 4.72039478e+01 2.02474888e+02 4.72039194e+01 2.02474885e+02 4.72036691e+01 2.02475254e+02 4.72036495e+01 2.02475514e+02 4.72037627e+01 2.02475591e+02 4.72035116e+01 2.02475891e+02 4.72035037e+01 2.02476057e+02 4.72035035e+01 2.02476325e+02 4.72035085e+01 2.02476487e+02 4.72034730e+01 2.02476611e+02 4.72032974e+01 2.02476531e+02 4.72032013e+01 2.02476630e+02 4.72029642e+01 2.02476641e+02 4.72029501e+01 2.02476616e+02 4.72029549e+01 2.02476335e+02 4.72030786e+01 2.02476096e+02 4.72032286e+01 2.02475888e+02 4.72033977e+01 2.02475582e+02 4.72034070e+01 2.02475368e+02 4.72032398e+01 2.02475238e+02 4.72030103e+01 2.02475244e+02 4.72029953e+01 2.02475269e+02 4.72029872e+01 2.02475486e+02 4.72028477e+01 2.02475567e+02 4.72027674e+01 2.02475595e+02 4.72026167e+01 2.02475787e+02 4.72026050e+01 2.02476080e+02 4.72026204e+01 2.02476309e+02 4.72024640e+01 2.02476155e+02 4.72023331e+01 2.02475946e+02 4.72021620e+01 2.02475878e+02 4.72018960e+01 2.02476195e+02 4.72017943e+01 2.02476311e+02 4.72015678e+01 2.02476313e+02 4.72015654e+01 2.02476304e+02 4.72015638e+01 2.02475997e+02 4.72016705e+01 2.02475680e+02 4.72017078e+01 2.02475538e+02 4.72014876e+01 2.02475277e+02 4.72013553e+01 2.02474930e+02 4.72012861e+01 2.02474916e+02 4.72012943e+01 2.02474917e+02 4.72012958e+01 2.02474913e+02 4.72015919e+01 2.02474821e+02 4.72016921e+01 2.02474772e+02 4.72018030e+01 2.02474651e+02 4.72018178e+01 2.02474395e+02 4.72016811e+01 2.02474176e+02 4.72017294e+01 2.02473934e+02 4.72018780e+01 2.02473652e+02 4.72019050e+01 2.02473446e+02 4.72018722e+01 2.02473301e+02 4.72018391e+01 2.02473265e+02 4.72017587e+01 2.02473182e+02 4.72016016e+01 2.02473178e+02 4.72014053e+01 2.02473298e+02 4.72011903e+01 2.02472990e+02 4.72012876e+01 2.02472706e+02 4.72013025e+01 2.02472434e+02 4.72011779e+01 2.02472166e+02 4.72010506e+01 2.02472127e+02 4.72010480e+01 2.02471842e+02 4.72011690e+01 2.02471629e+02 4.72013351e+01 2.02471519e+02 4.72015288e+01 2.02471505e+02 4.72015564e+01 2.02471403e+02 4.72017920e+01 2.02471239e+02 4.72019891e+01 2.02470860e+02 4.72020151e+01 2.02470670e+02 4.72018301e+01 2.02470542e+02 4.72018524e+01 2.02470279e+02 4.72017940e+01 2.02470050e+02 4.72016374e+01 2.02469829e+02 4.72014757e+01 2.02469538e+02 4.72013653e+01 2.02469272e+02 4.72012367e+01 2.02469044e+02 4.72010793e+01 2.02468878e+02 4.72008770e+01 2.02468615e+02 4.72007455e+01 2.02468376e+02 4.72005973e+01 2.02468158e+02 4.72004331e+01 2.02467851e+02 4.72003342e+01 2.02467620e+02 4.72001799e+01 2.02467370e+02 4.72000390e+01 2.02467160e+02 4.71998686e+01 2.02466902e+02 4.71997344e+01 2.02466643e+02 4.71996004e+01 2.02466406e+02 4.71994496e+01 2.02466135e+02 4.71993246e+01 2.02465883e+02 4.71991856e+01 2.02465661e+02 4.71990246e+01 2.02465406e+02 4.71988870e+01 2.02465161e+02 4.71987428e+01 2.02464918e+02 4.71985974e+01 2.02464671e+02 4.71984541e+01 2.02464467e+02 4.71982797e+01 2.02464229e+02 4.71981305e+01 2.02463957e+02 4.71980056e+01 2.02463728e+02 4.71978497e+01 2.02463503e+02 4.71976907e+01 2.02463269e+02 4.71975382e+01 2.02463064e+02 4.71973642e+01 2.02462836e+02 4.71972074e+01 2.02462621e+02 4.71970409e+01 2.02462410e+02 4.71968714e+01 2.02462114e+02 4.71967648e+01 2.02461947e+02 4.71965634e+01 2.02461731e+02 4.71963974e+01 2.02461488e+02 4.71962514e+01 2.02461205e+02 4.71961354e+01 2.02460955e+02 4.71959944e+01 2.02460688e+02 4.71958668e+01 2.02460379e+02 4.71957695e+01 2.02460368e+02 4.71954932e+01 2.02460621e+02 4.71953521e+01 2.02461003e+02 4.71952916e+01 2.02461119e+02 4.71950646e+01 2.02461311e+02 4.71948856e+01 2.02461493e+02 4.71947001e+01 2.02461474e+02 4.71946357e+01 2.02461586e+02 4.71944588e+01 2.02461854e+02 4.71943273e+01 2.02461948e+02 4.71942858e+01 2.02462178e+02 4.71942305e+01 2.02462151e+02 4.71941357e+01 2.02462233e+02 4.71939656e+01 2.02462415e+02 4.71937803e+01 2.02462670e+02 4.71936401e+01 2.02462941e+02 4.71935105e+01 2.02463110e+02 4.71934276e+01 2.02463230e+02 4.71933922e+01 2.02463268e+02 4.71933108e+01 2.02463378e+02 4.71931854e+01 2.02463595e+02 4.71930216e+01 2.02463843e+02 4.71928777e+01 2.02464046e+02 4.71927054e+01 2.02464255e+02 4.71925364e+01 2.02464462e+02 4.71923668e+01 2.02464661e+02 4.71921922e+01 2.02464898e+02 4.71920411e+01 2.02465083e+02 4.71918575e+01 2.02465287e+02 4.71916853e+01 2.02465504e+02 4.71915223e+01 2.02465735e+02 4.71913673e+01 2.02466003e+02 4.71912354e+01 2.02466194e+02 4.71910559e+01 2.02466441e+02 4.71909109e+01 2.02466691e+02 4.71907677e+01 2.02466895e+02 4.71905962e+01 2.02467111e+02 4.71904320e+01 2.02467324e+02 4.71902656e+01 2.02467519e+02 4.71900883e+01 2.02467785e+02 4.71899557e+01 2.02468015e+02 4.71897999e+01 2.02468222e+02 4.71896305e+01 2.02468414e+02 4.71894511e+01 2.02468629e+02 4.71892864e+01 2.02468830e+02 4.71891126e+01 2.02469069e+02 4.71889627e+01 2.02469314e+02 4.71888167e+01 2.02469289e+02 4.71885373e+01 2.02469067e+02 4.71883765e+01 2.02469020e+02 4.71883338e+01 2.02469233e+02 4.71882538e+01 2.02469365e+02 4.71882501e+01 2.02469655e+02 4.71881321e+01 2.02469889e+02 4.71880940e+01 2.02470048e+02 4.71880791e+01 2.02470287e+02 4.71879287e+01 2.02470564e+02 4.71879209e+01 2.02470776e+02 4.71879353e+01 2.02471023e+02 4.71877909e+01 2.02471213e+02 4.71877671e+01 2.02471222e+02 4.71879148e+01 2.02471174e+02 4.71881208e+01 2.02471552e+02 4.71881668e+01 2.02471636e+02 4.71884304e+01 2.02472020e+02 4.71884715e+01 2.02472036e+02 4.71887229e+01 2.02471736e+02 4.71888349e+01 2.02471448e+02 4.71888942e+01 2.02471358e+02 4.71888980e+01 2.02470988e+02 4.71889085e+01 2.02470912e+02 4.71889182e+01 2.02470700e+02 4.71890845e+01 2.02470503e+02 4.71892606e+01 2.02470211e+02 4.71893779e+01 2.02470100e+02 4.71895650e+01 2.02470103e+02 4.71896090e+01 2.02470022e+02 4.71896223e+01 2.02469701e+02 4.71895341e+01 2.02469453e+02 4.71893922e+01 2.02469296e+02 4.71894038e+01 2.02469001e+02 4.71895192e+01 2.02468912e+02 4.71897626e+01 2.02468890e+02 4.71898082e+01 2.02469122e+02 4.71898935e+01 2.02469203e+02 4.71899022e+01 2.02469497e+02 4.71898291e+01 2.02469778e+02 4.71898031e+01 2.02469879e+02 4.71897684e+01 2.02470266e+02 4.71897674e+01 2.02470438e+02 4.71898190e+01 2.02470600e+02 4.71896209e+01 2.02470768e+02 4.71894264e+01 2.02471173e+02 4.71894225e+01 2.02471377e+02 4.71895973e+01 2.02471537e+02 4.71896081e+01 2.02471859e+02 4.71895663e+01 2.02471949e+02 4.71895665e+01 2.02471924e+02 4.71895185e+01 2.02471844e+02 4.71892523e+01 2.02471839e+02 4.71891983e+01 2.02471997e+02 4.71891395e+01 2.02472207e+02 4.71891289e+01 2.02472475e+02 4.71889975e+01 2.02472770e+02 4.71888937e+01 2.02472782e+02 4.71888904e+01 2.02473149e+02 4.71889388e+01 2.02473338e+02 4.71889386e+01 2.02473597e+02 4.71888014e+01 2.02473906e+02 4.71887044e+01 2.02473917e+02 4.71887020e+01 2.02474320e+02 4.71886549e+01 2.02474470e+02 4.71886131e+01 2.02474714e+02 4.71887586e+01 2.02474996e+02 4.71888750e+01 2.02474969e+02 4.71890604e+01 2.02474785e+02 4.71892444e+01 2.02474746e+02 4.71893852e+01 2.02475057e+02 4.71894810e+01 2.02475168e+02 4.71894841e+01 2.02475491e+02 4.71893864e+01 2.02475626e+02 4.71893856e+01 2.02475825e+02 4.71895638e+01 2.02476086e+02 4.71894594e+01 2.02476438e+02 4.71894366e+01 2.02476497e+02 4.71897163e+01 2.02476259e+02 4.71898666e+01 2.02475865e+02 4.71898595e+01 2.02475780e+02 4.71898666e+01 2.02475722e+02 4.71899651e+01 2.02475905e+02 4.71899444e+01 2.02476243e+02 4.71899058e+01 2.02476475e+02 4.71900600e+01 2.02476415e+02 4.71902635e+01 2.02476239e+02 4.71904527e+01 2.02476235e+02 4.71905622e+01 2.02476447e+02 4.71905823e+01 2.02476740e+02 4.71904665e+01 2.02476581e+02 4.71903065e+01 2.02476531e+02 4.71900367e+01 2.02476787e+02 4.71898972e+01 2.02477055e+02 4.71899566e+01 2.02477093e+02 4.71900884e+01 2.02482220e+02 4.71935917e+01 2.02482175e+02 4.71936561e+01 2.02482340e+02 4.71936668e+01 2.02482300e+02 4.71935635e+01 2.02482220e+02 4.71935917e+01 2.02492284e+02 4.72001786e+01 2.02492280e+02 4.72001788e+01 2.02492280e+02 4.72001757e+01 2.02492284e+02 4.72001760e+01 2.02492284e+02 4.72001786e+01 2.02471899e+02 4.71874404e+01 2.02471607e+02 4.71874759e+01 2.02471365e+02 4.71873295e+01 2.02471393e+02 4.71871245e+01 2.02471656e+02 4.71871139e+01 2.02471871e+02 4.71872804e+01 2.02471899e+02 4.71874404e+01 2.02461429e+02 4.71811938e+01 2.02461124e+02 4.71812332e+01 2.02461056e+02 4.71809604e+01 2.02461447e+02 4.71809948e+01 2.02461429e+02 4.71811938e+01 2.02478849e+02 4.71923828e+01 2.02478574e+02 4.71924124e+01 2.02478357e+02 4.71922478e+01 2.02478367e+02 4.71920815e+01 2.02478660e+02 4.71920235e+01 2.02478842e+02 4.71922149e+01 2.02478849e+02 4.71923828e+01 2.02475570e+02 4.71903334e+01 2.02475191e+02 4.71903577e+01 2.02475155e+02 4.71903733e+01 2.02475148e+02 4.71903897e+01 2.02475209e+02 4.71904070e+01 2.02475554e+02 4.71904152e+01 2.02475637e+02 4.71903757e+01 2.02475664e+02 4.71903337e+01 2.02475570e+02 4.71903334e+01 2.02461055e+02 4.71812590e+01 2.02460666e+02 4.71813148e+01 2.02460570e+02 4.71813176e+01 2.02460186e+02 4.71812759e+01 2.02460175e+02 4.71810078e+01 2.02460579e+02 4.71809859e+01 2.02460609e+02 4.71809802e+01 2.02461054e+02 4.71809598e+01 2.02461055e+02 4.71812590e+01 2.02483555e+02 4.71956224e+01 2.02483411e+02 4.71958318e+01 2.02483154e+02 4.71958605e+01 2.02483187e+02 4.71956921e+01 2.02483342e+02 4.71954897e+01 2.02483691e+02 4.71954639e+01 2.02483555e+02 4.71956224e+01 2.02481269e+02 4.71941944e+01 2.02481126e+02 4.71944043e+01 2.02480745e+02 4.71943870e+01 2.02480632e+02 4.71941454e+01 2.02480592e+02 4.71940705e+01 2.02480698e+02 4.71940964e+01 2.02481043e+02 4.71940532e+01 2.02481198e+02 4.71940522e+01 2.02481269e+02 4.71941944e+01 2.02479039e+02 4.71928010e+01 2.02478962e+02 4.71927764e+01 2.02478959e+02 4.71927510e+01 2.02479047e+02 4.71927134e+01 2.02479039e+02 4.71928010e+01 2.02477455e+02 4.71918106e+01 2.02477117e+02 4.71918628e+01 2.02477195e+02 4.71916486e+01 2.02477373e+02 4.71916736e+01 2.02477455e+02 4.71918106e+01 2.02479675e+02 4.71934971e+01 2.02479309e+02 4.71934959e+01 2.02479182e+02 4.71932649e+01 2.02479177e+02 4.71931862e+01 2.02479323e+02 4.71931607e+01 2.02479596e+02 4.71932841e+01 2.02479675e+02 4.71934971e+01 2.02476263e+02 4.71913649e+01 2.02476226e+02 4.71915449e+01 2.02476548e+02 4.71915431e+01 2.02476455e+02 4.71913758e+01 2.02476263e+02 4.71913649e+01 2.02489140e+02 4.71997101e+01 2.02488951e+02 4.71997105e+01 2.02488947e+02 4.71995896e+01 2.02489125e+02 4.71995823e+01 2.02489140e+02 4.71997101e+01 2.02484323e+02 4.71967008e+01 2.02484105e+02 4.71968639e+01 2.02483894e+02 4.71969402e+01 2.02483695e+02 4.71967619e+01 2.02483670e+02 4.71965919e+01 2.02483970e+02 4.71965587e+01 2.02484159e+02 4.71965985e+01 2.02484302e+02 4.71966391e+01 2.02484323e+02 4.71967008e+01 2.02459649e+02 4.71812778e+01 2.02459301e+02 4.71812792e+01 2.02459309e+02 4.71810652e+01 2.02459611e+02 4.71810503e+01 2.02459649e+02 4.71812778e+01 2.02468513e+02 4.71871191e+01 2.02468086e+02 4.71871491e+01 2.02468100e+02 4.71868609e+01 2.02468495e+02 4.71868474e+01 2.02468513e+02 4.71871191e+01 2.02460013e+02 4.71818047e+01 2.02459924e+02 4.71817946e+01 2.02459922e+02 4.71817479e+01 2.02459994e+02 4.71817430e+01 2.02460013e+02 4.71818047e+01 2.02484719e+02 4.71975464e+01 2.02484468e+02 4.71974926e+01 2.02484173e+02 4.71975045e+01 2.02484004e+02 4.71975101e+01 2.02484013e+02 4.71974046e+01 2.02484248e+02 4.71972524e+01 2.02484345e+02 4.71972580e+01 2.02484619e+02 4.71973811e+01 2.02484719e+02 4.71975464e+01 2.02482597e+02 4.71962208e+01 2.02482206e+02 4.71962354e+01 2.02482232e+02 4.71959926e+01 2.02482564e+02 4.71959711e+01 2.02482597e+02 4.71962208e+01 2.02472983e+02 4.71902128e+01 2.02472820e+02 4.71901580e+01 2.02472477e+02 4.71900856e+01 2.02472214e+02 4.71900309e+01 2.02472081e+02 4.71900528e+01 2.02471904e+02 4.71901367e+01 2.02471605e+02 4.71902489e+01 2.02471592e+02 4.71904143e+01 2.02471946e+02 4.71904619e+01 2.02471975e+02 4.71904569e+01 2.02472394e+02 4.71904428e+01 2.02472436e+02 4.71904416e+01 2.02472810e+02 4.71904901e+01 2.02472942e+02 4.71904864e+01 2.02473111e+02 4.71902926e+01 2.02473110e+02 4.71902688e+01 2.02472983e+02 4.71902128e+01 2.02485614e+02 4.71984050e+01 2.02485439e+02 4.71984020e+01 2.02485407e+02 4.71982759e+01 2.02485624e+02 4.71982652e+01 2.02485614e+02 4.71984050e+01 2.02484643e+02 4.71980975e+01 2.02484618e+02 4.71983578e+01 2.02484878e+02 4.71984907e+01 2.02484901e+02 4.71985576e+01 2.02484774e+02 4.71985674e+01 2.02484417e+02 4.71985546e+01 2.02484340e+02 4.71985629e+01 2.02483944e+02 4.71985300e+01 2.02483780e+02 4.71983260e+01 2.02483769e+02 4.71981500e+01 2.02483962e+02 4.71979713e+01 2.02484327e+02 4.71979002e+01 2.02484384e+02 4.71978797e+01 2.02484631e+02 4.71980225e+01 2.02484643e+02 4.71980975e+01 2.02463126e+02 4.71846487e+01 2.02463108e+02 4.71846465e+01 2.02463103e+02 4.71846344e+01 2.02463124e+02 4.71846346e+01 2.02463126e+02 4.71846487e+01 2.02493626e+02 4.72040078e+01 2.02493216e+02 4.72040428e+01 2.02493236e+02 4.72037647e+01 2.02493607e+02 4.72037542e+01 2.02493626e+02 4.72040078e+01 2.02485448e+02 4.71991986e+01 2.02485193e+02 4.71993386e+01 2.02485159e+02 4.71995846e+01 2.02485150e+02 4.71996109e+01 2.02485018e+02 4.71998274e+01 2.02484884e+02 4.72000431e+01 2.02484662e+02 4.72002036e+01 2.02484299e+02 4.72002201e+01 2.02484044e+02 4.72000829e+01 2.02484035e+02 4.71998117e+01 2.02484033e+02 4.71997663e+01 2.02483770e+02 4.71996351e+01 2.02483691e+02 4.71995968e+01 2.02483504e+02 4.71995059e+01 2.02483493e+02 4.71994730e+01 2.02483341e+02 4.71993010e+01 2.02483163e+02 4.71991076e+01 2.02483165e+02 4.71989689e+01 2.02483253e+02 4.71987247e+01 2.02483700e+02 4.71987109e+01 2.02483941e+02 4.71988578e+01 2.02483958e+02 4.71988661e+01 2.02484371e+02 4.71988658e+01 2.02484597e+02 4.71990238e+01 2.02484839e+02 4.71991703e+01 2.02485014e+02 4.71992270e+01 2.02485108e+02 4.71989866e+01 2.02485412e+02 4.71990722e+01 2.02485448e+02 4.71991986e+01 2.02484607e+02 4.71995708e+01 2.02484634e+02 4.71996471e+01 2.02484846e+02 4.71997203e+01 2.02484845e+02 4.71994913e+01 2.02484607e+02 4.71995708e+01 2.02498521e+02 4.72094577e+01 2.02498194e+02 4.72094754e+01 2.02498188e+02 4.72092501e+01 2.02498502e+02 4.72092475e+01 2.02498521e+02 4.72094577e+01 2.02487471e+02 4.72025565e+01 2.02487211e+02 4.72026936e+01 2.02487114e+02 4.72026950e+01 2.02487104e+02 4.72026266e+01 2.02487290e+02 4.72024436e+01 2.02487461e+02 4.72024387e+01 2.02487471e+02 4.72025565e+01 2.02480365e+02 4.71987158e+01 2.02480180e+02 4.71987088e+01 2.02480125e+02 4.71985655e+01 2.02480306e+02 4.71986153e+01 2.02480365e+02 4.71987158e+01 2.02467127e+02 4.71907413e+01 2.02467137e+02 4.71907777e+01 2.02467177e+02 4.71907725e+01 2.02467179e+02 4.71907467e+01 2.02467127e+02 4.71907413e+01 2.02478772e+02 4.71989171e+01 2.02478745e+02 4.71991185e+01 2.02478938e+02 4.71993014e+01 2.02478958e+02 4.71993323e+01 2.02478887e+02 4.71993387e+01 2.02478508e+02 4.71992931e+01 2.02478307e+02 4.71991163e+01 2.02478321e+02 4.71989345e+01 2.02478321e+02 4.71987809e+01 2.02478273e+02 4.71986050e+01 2.02478633e+02 4.71985502e+01 2.02478773e+02 4.71987725e+01 2.02478772e+02 4.71989171e+01 2.02484541e+02 4.72034191e+01 2.02484393e+02 4.72036257e+01 2.02484110e+02 4.72036132e+01 2.02483995e+02 4.72033772e+01 2.02484334e+02 4.72032897e+01 2.02484545e+02 4.72032919e+01 2.02484541e+02 4.72034191e+01 2.02476790e+02 4.71991743e+01 2.02476778e+02 4.71992699e+01 2.02476790e+02 4.71994733e+01 2.02476829e+02 4.71995578e+01 2.02476885e+02 4.71998320e+01 2.02476884e+02 4.71998426e+01 2.02476935e+02 4.72001305e+01 2.02477013e+02 4.72002110e+01 2.02476784e+02 4.72003672e+01 2.02476607e+02 4.72005560e+01 2.02476528e+02 4.72007558e+01 2.02476712e+02 4.72009209e+01 2.02476321e+02 4.72009758e+01 2.02476399e+02 4.72011771e+01 2.02476624e+02 4.72011653e+01 2.02476732e+02 4.72009334e+01 2.02476736e+02 4.72009281e+01 2.02476857e+02 4.72007119e+01 2.02477077e+02 4.72005506e+01 2.02477380e+02 4.72004520e+01 2.02477399e+02 4.72004528e+01 2.02477391e+02 4.72004438e+01 2.02477429e+02 4.72001719e+01 2.02477583e+02 4.71999766e+01 2.02477248e+02 4.71998990e+01 2.02476933e+02 4.71998064e+01 2.02477027e+02 4.71996214e+01 2.02477047e+02 4.71993969e+01 2.02477042e+02 4.71993318e+01 2.02476902e+02 4.71991786e+01 2.02476790e+02 4.71991743e+01 2.02479853e+02 4.72031825e+01 2.02479849e+02 4.72031830e+01 2.02479847e+02 4.72031787e+01 2.02479853e+02 4.72031800e+01 2.02479853e+02 4.72031825e+01 2.02478102e+02 4.72038840e+01 2.02477976e+02 4.72039155e+01 2.02478003e+02 4.72038220e+01 2.02478157e+02 4.72037823e+01 2.02478102e+02 4.72038840e+01 2.02483346e+02 4.72080576e+01 2.02483362e+02 4.72080699e+01 2.02483353e+02 4.72083609e+01 2.02482925e+02 4.72083929e+01 2.02482698e+02 4.72082355e+01 2.02482647e+02 4.72082192e+01 2.02482321e+02 4.72083145e+01 2.02482150e+02 4.72083149e+01 2.02481927e+02 4.72081540e+01 2.02481933e+02 4.72080724e+01 2.02482095e+02 4.72078744e+01 2.02482292e+02 4.72076980e+01 2.02482647e+02 4.72076208e+01 2.02482649e+02 4.72076210e+01 2.02482975e+02 4.72077054e+01 2.02483202e+02 4.72078634e+01 2.02483346e+02 4.72080576e+01 2.02478215e+02 4.72048517e+01 2.02477983e+02 4.72048862e+01 2.02477745e+02 4.72047370e+01 2.02477742e+02 4.72045567e+01 2.02478006e+02 4.72045440e+01 2.02478220e+02 4.72047113e+01 2.02478215e+02 4.72048517e+01 2.02472424e+02 4.72015324e+01 2.02472507e+02 4.72017744e+01 2.02472543e+02 4.72019060e+01 2.02472371e+02 4.72018750e+01 2.02472167e+02 4.72017004e+01 2.02472159e+02 4.72016662e+01 2.02472399e+02 4.72015168e+01 2.02472421e+02 4.72015125e+01 2.02472424e+02 4.72015324e+01 2.02472710e+02 4.72023098e+01 2.02472632e+02 4.72023332e+01 2.02472665e+02 4.72022813e+01 2.02472703e+02 4.72022802e+01 2.02472710e+02 4.72023098e+01 2.02472400e+02 4.72027142e+01 2.02472075e+02 4.72028104e+01 2.02471989e+02 4.72028080e+01 2.02471990e+02 4.72027571e+01 2.02472068e+02 4.72025069e+01 2.02472435e+02 4.72024783e+01 2.02472400e+02 4.72027142e+01 2.02483735e+02 4.72100957e+01 2.02483836e+02 4.72103227e+01 2.02483893e+02 4.72104935e+01 2.02483530e+02 4.72105656e+01 2.02483509e+02 4.72105643e+01 2.02483256e+02 4.72104263e+01 2.02482901e+02 4.72103630e+01 2.02482892e+02 4.72101670e+01 2.02483213e+02 4.72101324e+01 2.02483314e+02 4.72101318e+01 2.02483693e+02 4.72100693e+01 2.02483728e+02 4.72100773e+01 2.02483735e+02 4.72100957e+01 2.02475394e+02 4.72048844e+01 2.02475329e+02 4.72048950e+01 2.02474956e+02 4.72049099e+01 2.02474890e+02 4.72048937e+01 2.02474881e+02 4.72048634e+01 2.02475048e+02 4.72046685e+01 2.02475195e+02 4.72046685e+01 2.02475400e+02 4.72048427e+01 2.02475394e+02 4.72048844e+01 2.02473727e+02 4.72041419e+01 2.02473505e+02 4.72043026e+01 2.02473479e+02 4.72043100e+01 2.02473227e+02 4.72041709e+01 2.02473210e+02 4.72041182e+01 2.02473303e+02 4.72041146e+01 2.02473651e+02 4.72040944e+01 2.02473727e+02 4.72041268e+01 2.02473727e+02 4.72041419e+01 2.02472875e+02 4.72039087e+01 2.02472775e+02 4.72041455e+01 2.02472436e+02 4.72041042e+01 2.02472276e+02 4.72038972e+01 2.02471945e+02 4.72039260e+01 2.02471879e+02 4.72041839e+01 2.02471647e+02 4.72043384e+01 2.02471208e+02 4.72043606e+01 2.02471028e+02 4.72041684e+01 2.02471049e+02 4.72039649e+01 2.02471220e+02 4.72037720e+01 2.02471433e+02 4.72036061e+01 2.02471781e+02 4.72035244e+01 2.02472002e+02 4.72034487e+01 2.02472113e+02 4.72034328e+01 2.02472480e+02 4.72034214e+01 2.02472675e+02 4.72036025e+01 2.02472950e+02 4.72037244e+01 2.02472875e+02 4.72039087e+01 2.02475812e+02 4.72063422e+01 2.02475539e+02 4.72063664e+01 2.02475308e+02 4.72062115e+01 2.02475333e+02 4.72060434e+01 2.02475614e+02 4.72059858e+01 2.02475879e+02 4.72061155e+01 2.02475812e+02 4.72063422e+01 2.02484569e+02 4.72121124e+01 2.02484340e+02 4.72122280e+01 2.02484477e+02 4.72120550e+01 2.02484570e+02 4.72120584e+01 2.02484569e+02 4.72121124e+01 2.02475394e+02 4.72069786e+01 2.02475258e+02 4.72071930e+01 2.02474848e+02 4.72072022e+01 2.02474816e+02 4.72069168e+01 2.02474920e+02 4.72068240e+01 2.02474957e+02 4.72067058e+01 2.02475144e+02 4.72066581e+01 2.02475394e+02 4.72067990e+01 2.02475394e+02 4.72069786e+01 2.02469568e+02 4.72033383e+01 2.02469522e+02 4.72033286e+01 2.02469522e+02 4.72033096e+01 2.02469569e+02 4.72032938e+01 2.02469568e+02 4.72033383e+01 2.02473235e+02 4.72059289e+01 2.02473026e+02 4.72059457e+01 2.02473037e+02 4.72058055e+01 2.02473220e+02 4.72058026e+01 2.02473235e+02 4.72059289e+01 2.02468959e+02 4.72032568e+01 2.02468669e+02 4.72033085e+01 2.02468777e+02 4.72031430e+01 2.02468973e+02 4.72030837e+01 2.02468959e+02 4.72032568e+01 2.02478972e+02 4.72110097e+01 2.02478815e+02 4.72112106e+01 2.02478654e+02 4.72112228e+01 2.02478647e+02 4.72111056e+01 2.02478931e+02 4.72109836e+01 2.02478981e+02 4.72109809e+01 2.02478972e+02 4.72110097e+01 2.02476929e+02 4.72100324e+01 2.02476758e+02 4.72100204e+01 2.02476785e+02 4.72099422e+01 2.02476875e+02 4.72099344e+01 2.02476929e+02 4.72100324e+01 2.02470506e+02 4.72075148e+01 2.02470455e+02 4.72075189e+01 2.02470464e+02 4.72074887e+01 2.02470494e+02 4.72074901e+01 2.02470506e+02 4.72075148e+01 2.02480827e+02 4.72157585e+01 2.02480471e+02 4.72158354e+01 2.02480334e+02 4.72158379e+01 2.02480071e+02 4.72157067e+01 2.02480068e+02 4.72155833e+01 2.02480242e+02 4.72155805e+01 2.02480420e+02 4.72155045e+01 2.02480807e+02 4.72154889e+01 2.02480827e+02 4.72157585e+01 2.02471986e+02 4.72111328e+01 2.02471865e+02 4.72113564e+01 2.02471430e+02 4.72113532e+01 2.02471280e+02 4.72111385e+01 2.02471011e+02 4.72111223e+01 2.02470897e+02 4.72110963e+01 2.02470892e+02 4.72110477e+01 2.02471147e+02 4.72109077e+01 2.02471153e+02 4.72109073e+01 2.02471449e+02 4.72110139e+01 2.02471753e+02 4.72109870e+01 2.02471917e+02 4.72109934e+01 2.02471986e+02 4.72111328e+01 2.02467646e+02 4.72126102e+01 2.02467757e+02 4.72127645e+01 2.02467772e+02 4.72129880e+01 2.02467575e+02 4.72131641e+01 2.02467177e+02 4.72132147e+01 2.02467086e+02 4.72134570e+01 2.02466775e+02 4.72134898e+01 2.02466622e+02 4.72132770e+01 2.02466536e+02 4.72131133e+01 2.02466737e+02 4.72129398e+01 2.02466788e+02 4.72128291e+01 2.02466808e+02 4.72126850e+01 2.02467017e+02 4.72125164e+01 2.02467228e+02 4.72125045e+01 2.02467499e+02 4.72125182e+01 2.02467623e+02 4.72125379e+01 2.02467646e+02 4.72126102e+01 2.02463156e+02 4.72098043e+01 2.02462912e+02 4.72098368e+01 2.02462899e+02 4.72096438e+01 2.02463171e+02 4.72096452e+01 2.02463156e+02 4.72098043e+01 2.02481079e+02 4.71686454e+01 2.02480893e+02 4.71688279e+01 2.02480528e+02 4.71688453e+01 2.02480258e+02 4.71687200e+01 2.02480237e+02 4.71684178e+01 2.02480461e+02 4.71682591e+01 2.02480891e+02 4.71682516e+01 2.02481065e+02 4.71684489e+01 2.02481079e+02 4.71686454e+01 2.02493610e+02 4.71776737e+01 2.02493223e+02 4.71776803e+01 2.02493217e+02 4.71774281e+01 2.02493593e+02 4.71774066e+01 2.02493610e+02 4.71776737e+01 2.02489567e+02 4.71796349e+01 2.02489270e+02 4.71796271e+01 2.02489254e+02 4.71794393e+01 2.02489521e+02 4.71794412e+01 2.02489567e+02 4.71796349e+01 2.02477044e+02 4.71724055e+01 2.02477031e+02 4.71724069e+01 2.02477032e+02 4.71723982e+01 2.02477046e+02 4.71723959e+01 2.02477044e+02 4.71724055e+01 2.02495641e+02 4.71849255e+01 2.02495270e+02 4.71849926e+01 2.02495220e+02 4.71849898e+01 2.02495194e+02 4.71849456e+01 2.02495312e+02 4.71847199e+01 2.02495603e+02 4.71847064e+01 2.02495641e+02 4.71849255e+01 2.02497222e+02 4.71886054e+01 2.02496903e+02 4.71886265e+01 2.02496922e+02 4.71884183e+01 2.02497207e+02 4.71884019e+01 2.02497222e+02 4.71886054e+01 2.02504586e+02 4.71941023e+01 2.02504450e+02 4.71941113e+01 2.02504453e+02 4.71940193e+01 2.02504577e+02 4.71940179e+01 2.02504586e+02 4.71941023e+01 2.02504775e+02 4.71948184e+01 2.02504395e+02 4.71948801e+01 2.02504311e+02 4.71948655e+01 2.02504186e+02 4.71947499e+01 2.02504128e+02 4.71946754e+01 2.02504220e+02 4.71944716e+01 2.02504405e+02 4.71944700e+01 2.02504711e+02 4.71945697e+01 2.02504775e+02 4.71948184e+01 2.02503788e+02 4.71945015e+01 2.02503504e+02 4.71944857e+01 2.02503519e+02 4.71943330e+01 2.02503714e+02 4.71943303e+01 2.02503788e+02 4.71945015e+01 2.02505874e+02 4.71964018e+01 2.02505760e+02 4.71963976e+01 2.02505753e+02 4.71963262e+01 2.02505868e+02 4.71963175e+01 2.02505874e+02 4.71964018e+01 2.02507784e+02 4.71981928e+01 2.02507593e+02 4.71983724e+01 2.02507499e+02 4.71983660e+01 2.02507458e+02 4.71982882e+01 2.02507742e+02 4.71981665e+01 2.02507773e+02 4.71981637e+01 2.02507784e+02 4.71981928e+01 2.02472284e+02 4.71790039e+01 2.02472069e+02 4.71791691e+01 2.02471788e+02 4.71792092e+01 2.02471593e+02 4.71790279e+01 2.02471604e+02 4.71788779e+01 2.02471924e+02 4.71787790e+01 2.02471930e+02 4.71787792e+01 2.02472324e+02 4.71788130e+01 2.02472284e+02 4.71790039e+01 2.02475252e+02 4.71829540e+01 2.02475076e+02 4.71829604e+01 2.02475076e+02 4.71828442e+01 2.02475241e+02 4.71828384e+01 2.02475252e+02 4.71829540e+01 2.02496799e+02 4.71976139e+01 2.02496609e+02 4.71976298e+01 2.02496618e+02 4.71975010e+01 2.02496790e+02 4.71974960e+01 2.02496799e+02 4.71976139e+01 2.02481311e+02 4.71927244e+01 2.02481222e+02 4.71927336e+01 2.02481229e+02 4.71926734e+01 2.02481368e+02 4.71926252e+01 2.02481311e+02 4.71927244e+01 2.02480680e+02 4.71926297e+01 2.02480490e+02 4.71926235e+01 2.02480455e+02 4.71924887e+01 2.02480642e+02 4.71925115e+01 2.02480680e+02 4.71926297e+01 2.02461337e+02 4.71811361e+01 2.02461239e+02 4.71811487e+01 2.02461217e+02 4.71810610e+01 2.02461343e+02 4.71810721e+01 2.02461337e+02 4.71811361e+01 2.02482612e+02 4.71947344e+01 2.02482474e+02 4.71949471e+01 2.02482217e+02 4.71949258e+01 2.02482187e+02 4.71947680e+01 2.02482470e+02 4.71946456e+01 2.02482700e+02 4.71945693e+01 2.02482612e+02 4.71947344e+01 2.02475044e+02 4.71900047e+01 2.02474917e+02 4.71902249e+01 2.02474546e+02 4.71902919e+01 2.02474425e+02 4.71902728e+01 2.02474364e+02 4.71901780e+01 2.02474350e+02 4.71900032e+01 2.02474387e+02 4.71898931e+01 2.02474636e+02 4.71897496e+01 2.02474693e+02 4.71897497e+01 2.02475069e+02 4.71897975e+01 2.02475044e+02 4.71900047e+01 2.02461013e+02 4.71812326e+01 2.02460649e+02 4.71812590e+01 2.02460653e+02 4.71810074e+01 2.02461012e+02 4.71809910e+01 2.02461013e+02 4.71812326e+01 2.02473688e+02 4.71894563e+01 2.02473698e+02 4.71895091e+01 2.02473703e+02 4.71897653e+01 2.02473514e+02 4.71899462e+01 2.02473196e+02 4.71900469e+01 2.02472987e+02 4.71900342e+01 2.02472824e+02 4.71898292e+01 2.02472555e+02 4.71897031e+01 2.02472320e+02 4.71895515e+01 2.02472297e+02 4.71894849e+01 2.02472420e+02 4.71894772e+01 2.02472728e+02 4.71894550e+01 2.02472980e+02 4.71893890e+01 2.02473059e+02 4.71893626e+01 2.02473392e+02 4.71892716e+01 2.02473622e+02 4.71892397e+01 2.02473688e+02 4.71894563e+01 2.02460554e+02 4.71812449e+01 2.02460247e+02 4.71812310e+01 2.02460239e+02 4.71810481e+01 2.02460515e+02 4.71810331e+01 2.02460554e+02 4.71812449e+01 2.02480911e+02 4.71942700e+01 2.02480904e+02 4.71942696e+01 2.02480902e+02 4.71942642e+01 2.02480914e+02 4.71942624e+01 2.02480911e+02 4.71942700e+01 2.02476970e+02 4.71921062e+01 2.02476769e+02 4.71921200e+01 2.02476480e+02 4.71920989e+01 2.02476573e+02 4.71922642e+01 2.02476572e+02 4.71924557e+01 2.02476254e+02 4.71925003e+01 2.02476188e+02 4.71925151e+01 2.02475796e+02 4.71925132e+01 2.02475659e+02 4.71924835e+01 2.02475379e+02 4.71924961e+01 2.02475082e+02 4.71923900e+01 2.02475017e+02 4.71923817e+01 2.02475013e+02 4.71924414e+01 2.02475264e+02 4.71925808e+01 2.02475535e+02 4.71927054e+01 2.02475536e+02 4.71927054e+01 2.02475948e+02 4.71927261e+01 2.02476190e+02 4.71928725e+01 2.02476371e+02 4.71929289e+01 2.02476521e+02 4.71929533e+01 2.02476810e+02 4.71930652e+01 2.02477047e+02 4.71932153e+01 2.02477313e+02 4.71933442e+01 2.02477520e+02 4.71935166e+01 2.02477762e+02 4.71936632e+01 2.02477911e+02 4.71938783e+01 2.02478192e+02 4.71939960e+01 2.02478230e+02 4.71940906e+01 2.02478228e+02 4.71942947e+01 2.02478275e+02 4.71944177e+01 2.02478374e+02 4.71945125e+01 2.02478387e+02 4.71947868e+01 2.02478131e+02 4.71949263e+01 2.02477767e+02 4.71949606e+01 2.02477720e+02 4.71949687e+01 2.02477513e+02 4.71951384e+01 2.02477507e+02 4.71951528e+01 2.02477484e+02 4.71954193e+01 2.02477253e+02 4.71955742e+01 2.02477032e+02 4.71955040e+01 2.02476658e+02 4.71955018e+01 2.02476749e+02 4.71957130e+01 2.02476868e+02 4.71959319e+01 2.02476858e+02 4.71959580e+01 2.02476728e+02 4.71961434e+01 2.02476449e+02 4.71962602e+01 2.02476441e+02 4.71962634e+01 2.02476111e+02 4.71963566e+01 2.02475882e+02 4.71965127e+01 2.02475740e+02 4.71967228e+01 2.02475741e+02 4.71967830e+01 2.02475951e+02 4.71969533e+01 2.02476126e+02 4.71969641e+01 2.02476411e+02 4.71969385e+01 2.02476565e+02 4.71969396e+01 2.02476766e+02 4.71970019e+01 2.02477007e+02 4.71971488e+01 2.02477063e+02 4.71972509e+01 2.02476977e+02 4.71974958e+01 2.02476976e+02 4.71974970e+01 2.02477078e+02 4.71977471e+01 2.02477091e+02 4.71978667e+01 2.02476789e+02 4.71979610e+01 2.02476770e+02 4.71979650e+01 2.02476770e+02 4.71979745e+01 2.02477004e+02 4.71981269e+01 2.02477157e+02 4.71983399e+01 2.02477185e+02 4.71985235e+01 2.02477115e+02 4.71986955e+01 2.02477263e+02 4.71988717e+01 2.02477005e+02 4.71987774e+01 2.02476744e+02 4.71988462e+01 2.02476441e+02 4.71989560e+01 2.02476466e+02 4.71991752e+01 2.02476463e+02 4.71992692e+01 2.02476458e+02 4.71995070e+01 2.02476488e+02 4.71995843e+01 2.02476439e+02 4.71998462e+01 2.02476438e+02 4.71998520e+01 2.02476323e+02 4.72000793e+01 2.02476176e+02 4.72002864e+01 2.02476096e+02 4.72004244e+01 2.02476039e+02 4.72005003e+01 2.02475942e+02 4.72007392e+01 2.02475698e+02 4.72007190e+01 2.02475574e+02 4.72005088e+01 2.02475568e+02 4.72004896e+01 2.02475547e+02 4.72004924e+01 2.02475227e+02 4.72005915e+01 2.02474932e+02 4.72007063e+01 2.02474723e+02 4.72008749e+01 2.02474549e+02 4.72010651e+01 2.02474282e+02 4.72011142e+01 2.02474352e+02 4.72009423e+01 2.02474335e+02 4.72007497e+01 2.02474275e+02 4.72005949e+01 2.02474575e+02 4.72005721e+01 2.02474742e+02 4.72005871e+01 2.02474723e+02 4.72004631e+01 2.02474519e+02 4.72004479e+01 2.02474316e+02 4.72004381e+01 2.02474071e+02 4.72002944e+01 2.02473840e+02 4.72001397e+01 2.02473747e+02 4.71999657e+01 2.02473819e+02 4.71998296e+01 2.02473887e+02 4.71997536e+01 2.02473841e+02 4.71994883e+01 2.02473809e+02 4.71994060e+01 2.02473837e+02 4.71991654e+01 2.02473483e+02 4.71992022e+01 2.02473233e+02 4.71993455e+01 2.02472973e+02 4.71994820e+01 2.02472967e+02 4.71994829e+01 2.02472966e+02 4.71994777e+01 2.02472873e+02 4.71992270e+01 2.02472651e+02 4.71992804e+01 2.02472381e+02 4.71994113e+01 2.02472405e+02 4.71995729e+01 2.02472484e+02 4.71997750e+01 2.02472481e+02 4.71998418e+01 2.02472408e+02 4.72000263e+01 2.02472175e+02 4.72001804e+01 2.02471998e+02 4.72003684e+01 2.02471827e+02 4.72005610e+01 2.02471528e+02 4.72006731e+01 2.02471316e+02 4.72008401e+01 2.02471139e+02 4.72008334e+01 2.02471037e+02 4.72006655e+01 2.02470987e+02 4.72006205e+01 2.02470919e+02 4.72003452e+01 2.02470643e+02 4.72002235e+01 2.02470400e+02 4.72000778e+01 2.02470054e+02 4.72000083e+01 2.02469820e+02 4.71998559e+01 2.02469755e+02 4.71998646e+01 2.02469739e+02 4.71999156e+01 2.02469920e+02 4.72001073e+01 2.02469856e+02 4.72002271e+01 2.02469707e+02 4.72004331e+01 2.02469491e+02 4.72004241e+01 2.02469242e+02 4.72004416e+01 2.02469287e+02 4.72005750e+01 2.02469484e+02 4.72005927e+01 2.02469733e+02 4.72005705e+01 2.02470030e+02 4.72006348e+01 2.02470098e+02 4.72006265e+01 2.02470472e+02 4.72006751e+01 2.02470732e+02 4.72008089e+01 2.02470821e+02 4.72010679e+01 2.02470802e+02 4.72011170e+01 2.02470626e+02 4.72013064e+01 2.02470697e+02 4.72014850e+01 2.02470709e+02 4.72016578e+01 2.02470368e+02 4.72017435e+01 2.02470352e+02 4.72017400e+01 2.02470281e+02 4.72016891e+01 2.02470168e+02 4.72015507e+01 2.02469954e+02 4.72013834e+01 2.02469790e+02 4.72013824e+01 2.02469600e+02 4.72013197e+01 2.02469319e+02 4.72012018e+01 2.02469098e+02 4.72010400e+01 2.02468992e+02 4.72008837e+01 2.02469015e+02 4.72007757e+01 2.02468807e+02 4.72006039e+01 2.02468468e+02 4.72005291e+01 2.02468332e+02 4.72003046e+01 2.02468139e+02 4.72003508e+01 2.02467911e+02 4.72002898e+01 2.02467679e+02 4.72001360e+01 2.02467433e+02 4.71999925e+01 2.02467234e+02 4.71998139e+01 2.02466964e+02 4.71996886e+01 2.02466693e+02 4.71995634e+01 2.02466460e+02 4.71994097e+01 2.02466171e+02 4.71992979e+01 2.02465912e+02 4.71991642e+01 2.02465696e+02 4.71989985e+01 2.02465435e+02 4.71988663e+01 2.02465187e+02 4.71987241e+01 2.02464952e+02 4.71985720e+01 2.02464748e+02 4.71983977e+01 2.02464517e+02 4.71982430e+01 2.02464284e+02 4.71980900e+01 2.02464023e+02 4.71979574e+01 2.02463779e+02 4.71978124e+01 2.02463568e+02 4.71976424e+01 2.02463353e+02 4.71974764e+01 2.02463154e+02 4.71972977e+01 2.02462924e+02 4.71971426e+01 2.02462718e+02 4.71969698e+01 2.02462689e+02 4.71969439e+01 2.02462593e+02 4.71967367e+01 2.02462368e+02 4.71967435e+01 2.02462210e+02 4.71966938e+01 2.02462135e+02 4.71965975e+01 2.02462144e+02 4.71964174e+01 2.02461951e+02 4.71962350e+01 2.02461832e+02 4.71961089e+01 2.02461792e+02 4.71960271e+01 2.02461885e+02 4.71958429e+01 2.02462032e+02 4.71956357e+01 2.02462024e+02 4.71955308e+01 2.02461943e+02 4.71952805e+01 2.02461940e+02 4.71952674e+01 2.02461884e+02 4.71952436e+01 2.02461617e+02 4.71951809e+01 2.02461627e+02 4.71950830e+01 2.02461849e+02 4.71949225e+01 2.02461827e+02 4.71947003e+01 2.02461775e+02 4.71945770e+01 2.02462067e+02 4.71944607e+01 2.02462189e+02 4.71944327e+01 2.02462377e+02 4.71943550e+01 2.02462394e+02 4.71942816e+01 2.02462317e+02 4.71940181e+01 2.02462317e+02 4.71940133e+01 2.02462477e+02 4.71938192e+01 2.02462750e+02 4.71936904e+01 2.02462760e+02 4.71936858e+01 2.02462866e+02 4.71937631e+01 2.02462977e+02 4.71938511e+01 2.02463170e+02 4.71940338e+01 2.02463228e+02 4.71942888e+01 2.02463235e+02 4.71943105e+01 2.02463456e+02 4.71944727e+01 2.02463690e+02 4.71946251e+01 2.02463715e+02 4.71948925e+01 2.02463736e+02 4.71949164e+01 2.02463755e+02 4.71949172e+01 2.02463986e+02 4.71947626e+01 2.02463979e+02 4.71947372e+01 2.02463745e+02 4.71945844e+01 2.02463638e+02 4.71943384e+01 2.02463645e+02 4.71942497e+01 2.02463744e+02 4.71940128e+01 2.02463889e+02 4.71938274e+01 2.02463578e+02 4.71937324e+01 2.02463567e+02 4.71936027e+01 2.02463712e+02 4.71936331e+01 2.02463969e+02 4.71935549e+01 2.02464047e+02 4.71933857e+01 2.02464065e+02 4.71933153e+01 2.02464271e+02 4.71931450e+01 2.02464298e+02 4.71928753e+01 2.02464298e+02 4.71928630e+01 2.02464526e+02 4.71927062e+01 2.02464640e+02 4.71924779e+01 2.02464943e+02 4.71923989e+01 2.02464981e+02 4.71923922e+01 2.02465221e+02 4.71922427e+01 2.02465230e+02 4.71921868e+01 2.02465170e+02 4.71919114e+01 2.02465173e+02 4.71919039e+01 2.02465361e+02 4.71917318e+01 2.02465578e+02 4.71915683e+01 2.02465815e+02 4.71914171e+01 2.02465858e+02 4.71913978e+01 2.02466130e+02 4.71915219e+01 2.02466369e+02 4.71914644e+01 2.02466574e+02 4.71912930e+01 2.02466695e+02 4.71911041e+01 2.02466702e+02 4.71910740e+01 2.02466736e+02 4.71910741e+01 2.02467145e+02 4.71910976e+01 2.02467393e+02 4.71912392e+01 2.02467632e+02 4.71913878e+01 2.02467718e+02 4.71914097e+01 2.02467707e+02 4.71913331e+01 2.02467580e+02 4.71911016e+01 2.02467599e+02 4.71910365e+01 2.02467616e+02 4.71907497e+01 2.02467616e+02 4.71907475e+01 2.02467746e+02 4.71905294e+01 2.02467952e+02 4.71905009e+01 2.02468102e+02 4.71904530e+01 2.02468414e+02 4.71904852e+01 2.02468630e+02 4.71906509e+01 2.02468692e+02 4.71908221e+01 2.02468682e+02 4.71909381e+01 2.02468863e+02 4.71911297e+01 2.02469114e+02 4.71910859e+01 2.02469305e+02 4.71909060e+01 2.02469449e+02 4.71906969e+01 2.02469450e+02 4.71906956e+01 2.02469357e+02 4.71904389e+01 2.02469295e+02 4.71903011e+01 2.02469490e+02 4.71901240e+01 2.02469798e+02 4.71900171e+01 2.02469979e+02 4.71899795e+01 2.02470201e+02 4.71899696e+01 2.02470392e+02 4.71899997e+01 2.02470764e+02 4.71900505e+01 2.02470737e+02 4.71903047e+01 2.02470767e+02 4.71903734e+01 2.02470951e+02 4.71905628e+01 2.02471274e+02 4.71906404e+01 2.02471287e+02 4.71906398e+01 2.02471628e+02 4.71905626e+01 2.02471826e+02 4.71905669e+01 2.02472164e+02 4.71906425e+01 2.02472168e+02 4.71908999e+01 2.02471950e+02 4.71910631e+01 2.02471968e+02 4.71911123e+01 2.02472013e+02 4.71911023e+01 2.02472385e+02 4.71910358e+01 2.02472508e+02 4.71910390e+01 2.02472768e+02 4.71909756e+01 2.02473028e+02 4.71909797e+01 2.02473317e+02 4.71910921e+01 2.02473388e+02 4.71910643e+01 2.02473440e+02 4.71910008e+01 2.02473528e+02 4.71908527e+01 2.02473645e+02 4.71908494e+01 2.02473940e+02 4.71909568e+01 2.02474158e+02 4.71911211e+01 2.02474449e+02 4.71912313e+01 2.02474709e+02 4.71913643e+01 2.02474957e+02 4.71914465e+01 2.02475037e+02 4.71914478e+01 2.02475132e+02 4.71915559e+01 2.02475225e+02 4.71916340e+01 2.02475301e+02 4.71916613e+01 2.02475555e+02 4.71917156e+01 2.02475880e+02 4.71918004e+01 2.02476164e+02 4.71919161e+01 2.02476262e+02 4.71919628e+01 2.02476457e+02 4.71917857e+01 2.02476709e+02 4.71918389e+01 2.02476933e+02 4.71919984e+01 2.02476970e+02 4.71921062e+01 2.02459548e+02 4.71812143e+01 2.02459388e+02 4.71812149e+01 2.02459392e+02 4.71811168e+01 2.02459530e+02 4.71811100e+01 2.02459548e+02 4.71812143e+01 2.02468444e+02 4.71870760e+01 2.02468158e+02 4.71870961e+01 2.02468167e+02 4.71869030e+01 2.02468432e+02 4.71868940e+01 2.02468444e+02 4.71870760e+01 2.02482499e+02 4.71961596e+01 2.02482299e+02 4.71961671e+01 2.02482312e+02 4.71960427e+01 2.02482482e+02 4.71960316e+01 2.02482499e+02 4.71961596e+01 2.02470021e+02 4.71886606e+01 2.02470000e+02 4.71886631e+01 2.02470003e+02 4.71886488e+01 2.02470022e+02 4.71886470e+01 2.02470021e+02 4.71886606e+01 2.02481377e+02 4.71960568e+01 2.02481110e+02 4.71960692e+01 2.02481145e+02 4.71959121e+01 2.02481327e+02 4.71959092e+01 2.02481377e+02 4.71960568e+01 2.02480873e+02 4.71957419e+01 2.02480634e+02 4.71957702e+01 2.02480672e+02 4.71956166e+01 2.02480830e+02 4.71956259e+01 2.02480873e+02 4.71957419e+01 2.02479698e+02 4.71950077e+01 2.02479448e+02 4.71951505e+01 2.02479331e+02 4.71951063e+01 2.02479270e+02 4.71950395e+01 2.02479508e+02 4.71948890e+01 2.02479607e+02 4.71949031e+01 2.02479698e+02 4.71950077e+01 2.02471069e+02 4.71896149e+01 2.02470907e+02 4.71896193e+01 2.02470933e+02 4.71895296e+01 2.02471030e+02 4.71895287e+01 2.02471069e+02 4.71896149e+01 2.02493588e+02 4.72039841e+01 2.02493257e+02 4.72040123e+01 2.02493274e+02 4.72037881e+01 2.02493572e+02 4.72037795e+01 2.02493588e+02 4.72039841e+01 2.02484226e+02 4.71981361e+01 2.02483920e+02 4.71982224e+01 2.02484084e+02 4.71980477e+01 2.02484179e+02 4.71980315e+01 2.02484226e+02 4.71981361e+01 2.02481352e+02 4.71963405e+01 2.02481373e+02 4.71965260e+01 2.02481704e+02 4.71966067e+01 2.02481923e+02 4.71967698e+01 2.02482198e+02 4.71968924e+01 2.02482222e+02 4.71971834e+01 2.02482005e+02 4.71973468e+01 2.02481622e+02 4.71974070e+01 2.02481774e+02 4.71975308e+01 2.02481776e+02 4.71978024e+01 2.02481360e+02 4.71978371e+01 2.02481127e+02 4.71976837e+01 2.02480992e+02 4.71974577e+01 2.02480967e+02 4.71972969e+01 2.02481188e+02 4.71971356e+01 2.02481255e+02 4.71969382e+01 2.02481248e+02 4.71968740e+01 2.02481176e+02 4.71966717e+01 2.02481041e+02 4.71964457e+01 2.02481041e+02 4.71964454e+01 2.02481149e+02 4.71962136e+01 2.02481357e+02 4.71962126e+01 2.02481352e+02 4.71963405e+01 2.02480459e+02 4.71957826e+01 2.02480159e+02 4.71958942e+01 2.02480162e+02 4.71961190e+01 2.02480354e+02 4.71963031e+01 2.02480354e+02 4.71963153e+01 2.02480354e+02 4.71966146e+01 2.02480081e+02 4.71967427e+01 2.02479758e+02 4.71967434e+01 2.02479503e+02 4.71966064e+01 2.02479433e+02 4.71963382e+01 2.02479674e+02 4.71961892e+01 2.02479701e+02 4.71961349e+01 2.02479656e+02 4.71958791e+01 2.02479679e+02 4.71958255e+01 2.02479553e+02 4.71958145e+01 2.02479270e+02 4.71958024e+01 2.02479322e+02 4.71956702e+01 2.02479437e+02 4.71954432e+01 2.02479651e+02 4.71952775e+01 2.02479979e+02 4.71952781e+01 2.02480099e+02 4.71955152e+01 2.02480402e+02 4.71956167e+01 2.02480459e+02 4.71957826e+01 2.02478662e+02 4.71946598e+01 2.02478593e+02 4.71946761e+01 2.02478583e+02 4.71946100e+01 2.02478677e+02 4.71946137e+01 2.02478662e+02 4.71946598e+01 2.02484220e+02 4.71984313e+01 2.02484081e+02 4.71984289e+01 2.02483917e+02 4.71982422e+01 2.02484256e+02 4.71983001e+01 2.02484220e+02 4.71984313e+01 2.02484501e+02 4.71992056e+01 2.02484312e+02 4.71993867e+01 2.02484022e+02 4.71994488e+01 2.02484075e+02 4.71992382e+01 2.02484370e+02 4.71991235e+01 2.02484442e+02 4.71991381e+01 2.02484501e+02 4.71992056e+01 2.02478734e+02 4.71956021e+01 2.02478683e+02 4.71955853e+01 2.02478683e+02 4.71955702e+01 2.02478701e+02 4.71955719e+01 2.02478734e+02 4.71956021e+01 2.02483936e+02 4.71991515e+01 2.02483909e+02 4.71992066e+01 2.02483963e+02 4.71994679e+01 2.02483616e+02 4.71994230e+01 2.02483443e+02 4.71992256e+01 2.02483353e+02 4.71990863e+01 2.02483273e+02 4.71990260e+01 2.02483275e+02 4.71987388e+01 2.02483679e+02 4.71987263e+01 2.02483889e+02 4.71988963e+01 2.02483936e+02 4.71991515e+01 2.02477881e+02 4.71953683e+01 2.02477667e+02 4.71953600e+01 2.02477574e+02 4.71951767e+01 2.02477846e+02 4.71952277e+01 2.02477881e+02 4.71953683e+01 2.02479126e+02 4.71964457e+01 2.02478850e+02 4.71964377e+01 2.02478707e+02 4.71962181e+01 2.02478699e+02 4.71961787e+01 2.02478813e+02 4.71961402e+01 2.02479143e+02 4.71962218e+01 2.02479126e+02 4.71964457e+01 2.02477792e+02 4.71956121e+01 2.02477584e+02 4.71957813e+01 2.02477452e+02 4.71959978e+01 2.02477252e+02 4.71959920e+01 2.02476888e+02 4.71959354e+01 2.02476948e+02 4.71956828e+01 2.02477307e+02 4.71956261e+01 2.02477465e+02 4.71957069e+01 2.02477748e+02 4.71955840e+01 2.02477817e+02 4.71955746e+01 2.02477792e+02 4.71956121e+01 2.02470987e+02 4.71913585e+01 2.02470845e+02 4.71915689e+01 2.02470842e+02 4.71916191e+01 2.02470894e+02 4.71915996e+01 2.02471337e+02 4.71915784e+01 2.02471338e+02 4.71915784e+01 2.02471338e+02 4.71915777e+01 2.02471133e+02 4.71914044e+01 2.02470987e+02 4.71913585e+01 2.02468526e+02 4.71898202e+01 2.02468436e+02 4.71898182e+01 2.02468438e+02 4.71897655e+01 2.02468643e+02 4.71896655e+01 2.02468526e+02 4.71898202e+01 2.02484534e+02 4.72001237e+01 2.02484423e+02 4.72001288e+01 2.02484280e+02 4.71999649e+01 2.02484608e+02 4.71999921e+01 2.02484534e+02 4.72001237e+01 2.02498450e+02 4.72094133e+01 2.02498264e+02 4.72094233e+01 2.02498261e+02 4.72092957e+01 2.02498439e+02 4.72092942e+01 2.02498450e+02 4.72094133e+01 2.02467819e+02 4.71902758e+01 2.02467817e+02 4.71902756e+01 2.02467817e+02 4.71902750e+01 2.02467818e+02 4.71902749e+01 2.02467819e+02 4.71902758e+01 2.02475565e+02 4.71972123e+01 2.02475144e+02 4.71972243e+01 2.02475110e+02 4.71972269e+01 2.02474735e+02 4.71972920e+01 2.02474795e+02 4.71974818e+01 2.02474778e+02 4.71976180e+01 2.02474697e+02 4.71978666e+01 2.02474668e+02 4.71979010e+01 2.02474871e+02 4.71980765e+01 2.02475008e+02 4.71980611e+01 2.02475008e+02 4.71979752e+01 2.02475042e+02 4.71977830e+01 2.02475073e+02 4.71976019e+01 2.02475041e+02 4.71974831e+01 2.02475237e+02 4.71974810e+01 2.02475407e+02 4.71976803e+01 2.02475422e+02 4.71977213e+01 2.02475438e+02 4.71979827e+01 2.02475439e+02 4.71980308e+01 2.02475486e+02 4.71982726e+01 2.02475498e+02 4.71983668e+01 2.02475580e+02 4.71985286e+01 2.02475761e+02 4.71985316e+01 2.02475717e+02 4.71984272e+01 2.02475709e+02 4.71981994e+01 2.02476032e+02 4.71981949e+01 2.02476179e+02 4.71981940e+01 2.02476200e+02 4.71980708e+01 2.02475977e+02 4.71979099e+01 2.02475676e+02 4.71978071e+01 2.02475685e+02 4.71975862e+01 2.02476006e+02 4.71974878e+01 2.02475871e+02 4.71973375e+01 2.02475610e+02 4.71972054e+01 2.02475565e+02 4.71972123e+01 2.02484273e+02 4.72035503e+01 2.02484200e+02 4.72035471e+01 2.02484170e+02 4.72034863e+01 2.02484310e+02 4.72034654e+01 2.02484273e+02 4.72035503e+01 2.02476255e+02 4.71985409e+01 2.02476299e+02 4.71986484e+01 2.02476421e+02 4.71986449e+01 2.02476538e+02 4.71984719e+01 2.02476255e+02 4.71985409e+01 2.02477689e+02 4.71997362e+01 2.02477461e+02 4.71997414e+01 2.02477455e+02 4.71995897e+01 2.02477655e+02 4.71995979e+01 2.02477689e+02 4.71997362e+01 2.02478731e+02 4.72006862e+01 2.02478365e+02 4.72007004e+01 2.02478234e+02 4.72004721e+01 2.02478209e+02 4.72003602e+01 2.02478372e+02 4.72003697e+01 2.02478708e+02 4.72004471e+01 2.02478731e+02 4.72006862e+01 2.02474697e+02 4.71990635e+01 2.02474764e+02 4.71991318e+01 2.02474793e+02 4.71991231e+01 2.02474794e+02 4.71991090e+01 2.02474697e+02 4.71990635e+01 2.02473834e+02 4.71988229e+01 2.02473771e+02 4.71988895e+01 2.02473866e+02 4.71988433e+01 2.02473865e+02 4.71988194e+01 2.02473834e+02 4.71988229e+01 2.02474328e+02 4.71994310e+01 2.02474284e+02 4.71994862e+01 2.02474188e+02 4.71996426e+01 2.02474292e+02 4.71998053e+01 2.02474552e+02 4.71999389e+01 2.02474618e+02 4.71999113e+01 2.02474614e+02 4.71998928e+01 2.02474482e+02 4.71996652e+01 2.02474377e+02 4.71994618e+01 2.02474369e+02 4.71994232e+01 2.02474328e+02 4.71994310e+01 2.02464795e+02 4.71934729e+01 2.02464793e+02 4.71934852e+01 2.02464808e+02 4.71934807e+01 2.02464811e+02 4.71934721e+01 2.02464795e+02 4.71934729e+01 2.02477425e+02 4.72016656e+01 2.02477443e+02 4.72017066e+01 2.02477650e+02 4.72018795e+01 2.02477830e+02 4.72020716e+01 2.02477900e+02 4.72022618e+01 2.02477952e+02 4.72023065e+01 2.02477951e+02 4.72025926e+01 2.02477584e+02 4.72026626e+01 2.02477393e+02 4.72027199e+01 2.02477086e+02 4.72026210e+01 2.02476985e+02 4.72023709e+01 2.02476964e+02 4.72022748e+01 2.02476854e+02 4.72021421e+01 2.02476624e+02 4.72019863e+01 2.02476403e+02 4.72018244e+01 2.02476403e+02 4.72016253e+01 2.02476708e+02 4.72015168e+01 2.02476868e+02 4.72013176e+01 2.02477152e+02 4.72012712e+01 2.02477418e+02 4.72013999e+01 2.02477425e+02 4.72016656e+01 2.02476496e+02 4.72022815e+01 2.02476231e+02 4.72022771e+01 2.02476124e+02 4.72020491e+01 2.02476523e+02 4.72020615e+01 2.02476496e+02 4.72022815e+01 2.02477818e+02 4.72034068e+01 2.02477775e+02 4.72034138e+01 2.02477763e+02 4.72033727e+01 2.02477839e+02 4.72033665e+01 2.02477818e+02 4.72034068e+01 2.02474790e+02 4.72015150e+01 2.02474594e+02 4.72015342e+01 2.02474357e+02 4.72013837e+01 2.02474298e+02 4.72012073e+01 2.02474548e+02 4.72012428e+01 2.02474792e+02 4.72013882e+01 2.02474790e+02 4.72015150e+01 2.02474046e+02 4.72013491e+01 2.02473929e+02 4.72013750e+01 2.02473773e+02 4.72011787e+01 2.02474080e+02 4.72012636e+01 2.02474046e+02 4.72013491e+01 2.02473085e+02 4.72007489e+01 2.02472949e+02 4.72009632e+01 2.02472656e+02 4.72010139e+01 2.02472767e+02 4.72008494e+01 2.02472984e+02 4.72006857e+01 2.02473106e+02 4.72006818e+01 2.02473085e+02 4.72007489e+01 2.02473679e+02 4.72014189e+01 2.02473484e+02 4.72013783e+01 2.02473507e+02 4.72013115e+01 2.02473759e+02 4.72011750e+01 2.02473679e+02 4.72014189e+01 2.02475882e+02 4.72030951e+01 2.02475558e+02 4.72030991e+01 2.02475562e+02 4.72028949e+01 2.02475914e+02 4.72028366e+01 2.02475882e+02 4.72030951e+01 2.02483294e+02 4.72083239e+01 2.02482988e+02 4.72083469e+01 2.02482744e+02 4.72082012e+01 2.02482484e+02 4.72081176e+01 2.02482387e+02 4.72081400e+01 2.02482362e+02 4.72080411e+01 2.02482374e+02 4.72078238e+01 2.02482413e+02 4.72077737e+01 2.02482454e+02 4.72077648e+01 2.02482762e+02 4.72078632e+01 2.02483090e+02 4.72079457e+01 2.02483301e+02 4.72081156e+01 2.02483294e+02 4.72083239e+01 2.02471297e+02 4.72011274e+01 2.02471159e+02 4.72011436e+01 2.02471107e+02 4.72010090e+01 2.02471368e+02 4.72009894e+01 2.02471297e+02 4.72011274e+01 2.02475191e+02 4.72038602e+01 2.02474981e+02 4.72038513e+01 2.02474979e+02 4.72037276e+01 2.02475161e+02 4.72037179e+01 2.02475191e+02 4.72038602e+01 2.02468156e+02 4.71997626e+01 2.02468096e+02 4.71998283e+01 2.02468202e+02 4.71997916e+01 2.02468181e+02 4.71997656e+01 2.02468156e+02 4.71997626e+01 2.02461191e+02 4.71957084e+01 2.02461084e+02 4.71958997e+01 2.02461094e+02 4.71959469e+01 2.02461048e+02 4.71959259e+01 2.02460776e+02 4.71958019e+01 2.02460452e+02 4.71957158e+01 2.02460445e+02 4.71955412e+01 2.02460779e+02 4.71954507e+01 2.02460819e+02 4.71954450e+01 2.02461133e+02 4.71955380e+01 2.02461191e+02 4.71957084e+01 2.02483059e+02 4.72102715e+01 2.02483031e+02 4.72102671e+01 2.02483030e+02 4.72102534e+01 2.02483053e+02 4.72102510e+01 2.02483059e+02 4.72102715e+01 2.02471737e+02 4.72040955e+01 2.02471522e+02 4.72042599e+01 2.02471331e+02 4.72042695e+01 2.02471233e+02 4.72040795e+01 2.02471244e+02 4.72040090e+01 2.02471342e+02 4.72038487e+01 2.02471606e+02 4.72037412e+01 2.02471734e+02 4.72039720e+01 2.02471737e+02 4.72040955e+01 2.02475285e+02 4.72069109e+01 2.02475200e+02 4.72071571e+01 2.02474900e+02 4.72071639e+01 2.02474876e+02 4.72069546e+01 2.02475213e+02 4.72068659e+01 2.02475285e+02 4.72068793e+01 2.02475285e+02 4.72069109e+01 2.02480793e+02 4.72157369e+01 2.02480415e+02 4.72157778e+01 2.02480453e+02 4.72155250e+01 2.02480775e+02 4.72155120e+01 2.02480793e+02 4.72157369e+01 2.02471817e+02 4.72113266e+01 2.02471470e+02 4.72113241e+01 2.02471424e+02 4.72110811e+01 2.02471822e+02 4.72110638e+01 2.02471817e+02 4.72113266e+01 2.02467664e+02 4.72129204e+01 2.02467500e+02 4.72131172e+01 2.02467242e+02 4.72131447e+01 2.02466982e+02 4.72130927e+01 2.02466852e+02 4.72131078e+01 2.02466878e+02 4.72130282e+01 2.02467003e+02 4.72128068e+01 2.02467169e+02 4.72126112e+01 2.02467528e+02 4.72126083e+01 2.02467658e+02 4.72128375e+01 2.02467664e+02 4.72129204e+01 2.02466984e+02 4.72133935e+01 2.02466892e+02 4.72134032e+01 2.02466848e+02 4.72133082e+01 2.02467010e+02 4.72133164e+01 2.02466984e+02 4.72133935e+01 2.02481032e+02 4.71686156e+01 2.02480866e+02 4.71688110e+01 2.02480555e+02 4.71688258e+01 2.02480262e+02 4.71687166e+01 2.02480242e+02 4.71684209e+01 2.02480473e+02 4.71682661e+01 2.02480881e+02 4.71682590e+01 2.02481021e+02 4.71684808e+01 2.02481032e+02 4.71686156e+01 2.02493583e+02 4.71776571e+01 2.02493247e+02 4.71776628e+01 2.02493241e+02 4.71774435e+01 2.02493569e+02 4.71774248e+01 2.02493583e+02 4.71776571e+01 2.02495523e+02 4.71848516e+01 2.02495377e+02 4.71848739e+01 2.02495408e+02 4.71847803e+01 2.02495510e+02 4.71847757e+01 2.02495523e+02 4.71848516e+01 2.02497155e+02 4.71885638e+01 2.02496972e+02 4.71885760e+01 2.02496983e+02 4.71884559e+01 2.02497147e+02 4.71884465e+01 2.02497155e+02 4.71885638e+01 2.02504689e+02 4.71947647e+01 2.02504415e+02 4.71947880e+01 2.02504359e+02 4.71945589e+01 2.02504650e+02 4.71946145e+01 2.02504689e+02 4.71947647e+01 2.02503646e+02 4.71944123e+01 2.02503606e+02 4.71944101e+01 2.02503608e+02 4.71943888e+01 2.02503635e+02 4.71943884e+01 2.02503646e+02 4.71944123e+01 2.02472176e+02 4.71789366e+01 2.02471954e+02 4.71790973e+01 2.02471936e+02 4.71790998e+01 2.02471909e+02 4.71790690e+01 2.02472145e+02 4.71789171e+01 2.02472180e+02 4.71789200e+01 2.02472176e+02 4.71789366e+01 2.02475167e+02 4.71829010e+01 2.02475156e+02 4.71829014e+01 2.02475156e+02 4.71828939e+01 2.02475167e+02 4.71828935e+01 2.02475167e+02 4.71829010e+01 2.02496727e+02 4.71975693e+01 2.02496687e+02 4.71975728e+01 2.02496688e+02 4.71975451e+01 2.02496726e+02 4.71975440e+01 2.02496727e+02 4.71975693e+01 2.02460970e+02 4.71812062e+01 2.02460693e+02 4.71812263e+01 2.02460696e+02 4.71810346e+01 2.02460970e+02 4.71810221e+01 2.02460970e+02 4.71812062e+01 2.02474768e+02 4.71901318e+01 2.02474600e+02 4.71901442e+01 2.02474591e+02 4.71900212e+01 2.02474793e+02 4.71900011e+01 2.02474768e+02 4.71901318e+01 2.02460472e+02 4.71811936e+01 2.02460308e+02 4.71811862e+01 2.02460303e+02 4.71810884e+01 2.02460451e+02 4.71810804e+01 2.02460472e+02 4.71811936e+01 2.02473345e+02 4.71898403e+01 2.02473195e+02 4.71898808e+01 2.02473111e+02 4.71896945e+01 2.02473383e+02 4.71897417e+01 2.02473345e+02 4.71898403e+01 2.02468375e+02 4.71870328e+01 2.02468230e+02 4.71870431e+01 2.02468234e+02 4.71869451e+01 2.02468369e+02 4.71869405e+01 2.02468375e+02 4.71870328e+01 2.02482401e+02 4.71960984e+01 2.02482391e+02 4.71960987e+01 2.02482392e+02 4.71960927e+01 2.02482400e+02 4.71960922e+01 2.02482401e+02 4.71960984e+01 2.02476373e+02 4.71923317e+01 2.02476059e+02 4.71924345e+01 2.02475904e+02 4.71924338e+01 2.02475551e+02 4.71923687e+01 2.02475442e+02 4.71923483e+01 2.02475182e+02 4.71923164e+01 2.02474843e+02 4.71922729e+01 2.02474761e+02 4.71925210e+01 2.02474827e+02 4.71925783e+01 2.02474862e+02 4.71925839e+01 2.02475168e+02 4.71926523e+01 2.02475412e+02 4.71927967e+01 2.02475672e+02 4.71929303e+01 2.02475865e+02 4.71929113e+01 2.02476091e+02 4.71929457e+01 2.02476431e+02 4.71930204e+01 2.02476650e+02 4.71931834e+01 2.02476841e+02 4.71933677e+01 2.02477088e+02 4.71935109e+01 2.02477282e+02 4.71936928e+01 2.02477361e+02 4.71938463e+01 2.02477375e+02 4.71939491e+01 2.02477388e+02 4.71941628e+01 2.02477096e+02 4.71942795e+01 2.02477046e+02 4.71945174e+01 2.02477309e+02 4.71944122e+01 2.02477682e+02 4.71943729e+01 2.02477826e+02 4.71945918e+01 2.02477821e+02 4.71947325e+01 2.02477549e+02 4.71947967e+01 2.02477488e+02 4.71948232e+01 2.02477082e+02 4.71948161e+01 2.02477005e+02 4.71945483e+01 2.02476721e+02 4.71944325e+01 2.02476469e+02 4.71944860e+01 2.02476452e+02 4.71946314e+01 2.02476527e+02 4.71948212e+01 2.02476560e+02 4.71948767e+01 2.02476688e+02 4.71951076e+01 2.02476686e+02 4.71952196e+01 2.02476459e+02 4.71953771e+01 2.02476427e+02 4.71956259e+01 2.02476444e+02 4.71956668e+01 2.02476374e+02 4.71956648e+01 2.02475949e+02 4.71956567e+01 2.02476098e+02 4.71958686e+01 2.02476164e+02 4.71960903e+01 2.02475776e+02 4.71961474e+01 2.02475685e+02 4.71961736e+01 2.02475394e+02 4.71962079e+01 2.02475464e+02 4.71963373e+01 2.02475431e+02 4.71965299e+01 2.02475321e+02 4.71967603e+01 2.02475318e+02 4.71967701e+01 2.02475251e+02 4.71970156e+01 2.02474949e+02 4.71970432e+01 2.02474860e+02 4.71970710e+01 2.02474539e+02 4.71971696e+01 2.02474416e+02 4.71973918e+01 2.02474394e+02 4.71974529e+01 2.02474548e+02 4.71976647e+01 2.02474535e+02 4.71977655e+01 2.02474277e+02 4.71978647e+01 2.02474212e+02 4.71978627e+01 2.02474007e+02 4.71980337e+01 2.02473993e+02 4.71980745e+01 2.02473970e+02 4.71983098e+01 2.02473690e+02 4.71982986e+01 2.02473504e+02 4.71983177e+01 2.02473183e+02 4.71984161e+01 2.02473210e+02 4.71986528e+01 2.02473184e+02 4.71987162e+01 2.02473081e+02 4.71989510e+01 2.02472820e+02 4.71989412e+01 2.02472604e+02 4.71989520e+01 2.02472461e+02 4.71991622e+01 2.02472131e+02 4.71992548e+01 2.02472061e+02 4.71995020e+01 2.02472062e+02 4.71995109e+01 2.02471846e+02 4.71996753e+01 2.02471731e+02 4.71999029e+01 2.02471694e+02 4.72000980e+01 2.02471669e+02 4.72001630e+01 2.02471574e+02 4.72004030e+01 2.02471249e+02 4.72004265e+01 2.02471257e+02 4.72002049e+01 2.02471371e+02 4.72000110e+01 2.02471301e+02 4.71999331e+01 2.02471223e+02 4.71997956e+01 2.02471102e+02 4.71998086e+01 2.02470739e+02 4.71998277e+01 2.02470509e+02 4.71997372e+01 2.02470445e+02 4.71997198e+01 2.02470038e+02 4.71996950e+01 2.02469846e+02 4.71995116e+01 2.02469640e+02 4.71994936e+01 2.02469564e+02 4.71997200e+01 2.02469561e+02 4.71997432e+01 2.02469497e+02 4.72000022e+01 2.02469401e+02 4.72001656e+01 2.02469384e+02 4.72002314e+01 2.02469305e+02 4.72002365e+01 2.02469077e+02 4.72000791e+01 2.02468710e+02 4.72000250e+01 2.02468716e+02 4.71998136e+01 2.02468882e+02 4.71996182e+01 2.02468940e+02 4.71995300e+01 2.02468791e+02 4.71995611e+01 2.02468512e+02 4.71996861e+01 2.02468285e+02 4.71996888e+01 2.02467978e+02 4.71996516e+01 2.02467881e+02 4.71996615e+01 2.02467516e+02 4.71996061e+01 2.02467265e+02 4.71994659e+01 2.02467216e+02 4.71994745e+01 2.02466977e+02 4.71996243e+01 2.02466743e+02 4.71995264e+01 2.02466515e+02 4.71993698e+01 2.02466208e+02 4.71992711e+01 2.02465941e+02 4.71991428e+01 2.02465731e+02 4.71989724e+01 2.02465463e+02 4.71988456e+01 2.02465212e+02 4.71987053e+01 2.02464987e+02 4.71985466e+01 2.02464824e+02 4.71983413e+01 2.02464566e+02 4.71982064e+01 2.02464338e+02 4.71980495e+01 2.02464088e+02 4.71979092e+01 2.02463829e+02 4.71977751e+01 2.02463634e+02 4.71975942e+01 2.02463437e+02 4.71974145e+01 2.02463426e+02 4.71974047e+01 2.02463276e+02 4.71972079e+01 2.02463203e+02 4.71969658e+01 2.02463202e+02 4.71969371e+01 2.02463024e+02 4.71968541e+01 2.02462932e+02 4.71968111e+01 2.02462926e+02 4.71967931e+01 2.02462852e+02 4.71965449e+01 2.02462617e+02 4.71963933e+01 2.02462406e+02 4.71962242e+01 2.02462311e+02 4.71961091e+01 2.02462282e+02 4.71959902e+01 2.02462349e+02 4.71958335e+01 2.02462382e+02 4.71955911e+01 2.02462379e+02 4.71955531e+01 2.02462490e+02 4.71955114e+01 2.02462654e+02 4.71954260e+01 2.02462646e+02 4.71953962e+01 2.02462585e+02 4.71953825e+01 2.02462275e+02 4.71953449e+01 2.02462245e+02 4.71951703e+01 2.02462294e+02 4.71950059e+01 2.02462110e+02 4.71948164e+01 2.02462107e+02 4.71947848e+01 2.02462152e+02 4.71945135e+01 2.02462500e+02 4.71944321e+01 2.02462563e+02 4.71941717e+01 2.02462953e+02 4.71941936e+01 2.02462995e+02 4.71944420e+01 2.02462712e+02 4.71945645e+01 2.02462710e+02 4.71946985e+01 2.02462956e+02 4.71947171e+01 2.02463143e+02 4.71945346e+01 2.02463304e+02 4.71945849e+01 2.02463339e+02 4.71946569e+01 2.02463435e+02 4.71948138e+01 2.02463600e+02 4.71950167e+01 2.02463937e+02 4.71950309e+01 2.02464191e+02 4.71948905e+01 2.02464115e+02 4.71946364e+01 2.02464012e+02 4.71944792e+01 2.02463991e+02 4.71944028e+01 2.02463991e+02 4.71941669e+01 2.02464048e+02 4.71940352e+01 2.02464102e+02 4.71939372e+01 2.02464197e+02 4.71936973e+01 2.02464452e+02 4.71937373e+01 2.02464664e+02 4.71939060e+01 2.02464691e+02 4.71940059e+01 2.02464784e+02 4.71941424e+01 2.02464881e+02 4.71941249e+01 2.02465116e+02 4.71939724e+01 2.02465089e+02 4.71939173e+01 2.02465056e+02 4.71936355e+01 2.02465187e+02 4.71935196e+01 2.02465235e+02 4.71934485e+01 2.02465285e+02 4.71934473e+01 2.02465654e+02 4.71934997e+01 2.02465861e+02 4.71935403e+01 2.02466094e+02 4.71934998e+01 2.02466284e+02 4.71935058e+01 2.02466269e+02 4.71933712e+01 2.02466274e+02 4.71932001e+01 2.02466232e+02 4.71930728e+01 2.02466285e+02 4.71929081e+01 2.02466559e+02 4.71928313e+01 2.02466621e+02 4.71928186e+01 2.02466634e+02 4.71927759e+01 2.02466662e+02 4.71925449e+01 2.02466634e+02 4.71924506e+01 2.02466640e+02 4.71922323e+01 2.02466848e+02 4.71920628e+01 2.02466930e+02 4.71919069e+01 2.02466606e+02 4.71918206e+01 2.02466544e+02 4.71915738e+01 2.02466750e+02 4.71914034e+01 2.02466983e+02 4.71912496e+01 2.02467315e+02 4.71912973e+01 2.02467524e+02 4.71914683e+01 2.02467589e+02 4.71916285e+01 2.02467416e+02 4.71918195e+01 2.02467409e+02 4.71918781e+01 2.02467502e+02 4.71918736e+01 2.02467784e+02 4.71917505e+01 2.02468063e+02 4.71916253e+01 2.02468171e+02 4.71916405e+01 2.02468484e+02 4.71915897e+01 2.02468721e+02 4.71915597e+01 2.02468789e+02 4.71917803e+01 2.02468793e+02 4.71918318e+01 2.02468858e+02 4.71918230e+01 2.02469226e+02 4.71918369e+01 2.02469455e+02 4.71919933e+01 2.02469559e+02 4.71919622e+01 2.02469851e+02 4.71918454e+01 2.02470075e+02 4.71918607e+01 2.02470325e+02 4.71920013e+01 2.02470532e+02 4.71919718e+01 2.02470740e+02 4.71918029e+01 2.02471062e+02 4.71917047e+01 2.02471174e+02 4.71916994e+01 2.02471493e+02 4.71916753e+01 2.02471488e+02 4.71914672e+01 2.02471394e+02 4.71913139e+01 2.02471710e+02 4.71912123e+01 2.02471822e+02 4.71912206e+01 2.02472102e+02 4.71911578e+01 2.02472376e+02 4.71911365e+01 2.02472512e+02 4.71911153e+01 2.02472897e+02 4.71910771e+01 2.02473020e+02 4.71913110e+01 2.02473224e+02 4.71912611e+01 2.02473604e+02 4.71912049e+01 2.02473630e+02 4.71912155e+01 2.02473925e+02 4.71912928e+01 2.02474220e+02 4.71912853e+01 2.02474338e+02 4.71913131e+01 2.02474631e+02 4.71914224e+01 2.02474909e+02 4.71915423e+01 2.02475109e+02 4.71917200e+01 2.02475421e+02 4.71918142e+01 2.02475716e+02 4.71919208e+01 2.02475717e+02 4.71919210e+01 2.02476062e+02 4.71919918e+01 2.02476276e+02 4.71921585e+01 2.02476373e+02 4.71923317e+01 2.02493550e+02 4.72039603e+01 2.02493299e+02 4.72039818e+01 2.02493311e+02 4.72038114e+01 2.02493538e+02 4.72038049e+01 2.02493550e+02 4.72039603e+01 2.02473836e+02 4.71916436e+01 2.02473824e+02 4.71916931e+01 2.02473873e+02 4.71916668e+01 2.02473883e+02 4.71916493e+01 2.02473836e+02 4.71916436e+01 2.02482206e+02 4.71971734e+01 2.02481950e+02 4.71973122e+01 2.02481600e+02 4.71973338e+01 2.02481427e+02 4.71971365e+01 2.02481447e+02 4.71969981e+01 2.02481570e+02 4.71967759e+01 2.02481867e+02 4.71968114e+01 2.02482183e+02 4.71969030e+01 2.02482206e+02 4.71971734e+01 2.02479671e+02 4.71955892e+01 2.02479559e+02 4.71955885e+01 2.02479576e+02 4.71955297e+01 2.02479676e+02 4.71955027e+01 2.02479671e+02 4.71955892e+01 2.02478269e+02 4.71947130e+01 2.02478039e+02 4.71947600e+01 2.02478014e+02 4.71945537e+01 2.02478263e+02 4.71945944e+01 2.02478269e+02 4.71947130e+01 2.02476398e+02 4.71935437e+01 2.02476114e+02 4.71935795e+01 2.02475875e+02 4.71935161e+01 2.02475774e+02 4.71935055e+01 2.02475385e+02 4.71934674e+01 2.02475202e+02 4.71933948e+01 2.02475322e+02 4.71935139e+01 2.02475325e+02 4.71937706e+01 2.02474952e+02 4.71937879e+01 2.02474883e+02 4.71937936e+01 2.02474884e+02 4.71938379e+01 2.02474944e+02 4.71938319e+01 2.02475341e+02 4.71938258e+01 2.02475581e+02 4.71939737e+01 2.02475666e+02 4.71939840e+01 2.02475767e+02 4.71938362e+01 2.02475805e+02 4.71937717e+01 2.02475869e+02 4.71937603e+01 2.02476230e+02 4.71937379e+01 2.02476319e+02 4.71937535e+01 2.02476319e+02 4.71937936e+01 2.02476246e+02 4.71940475e+01 2.02476300e+02 4.71940926e+01 2.02476469e+02 4.71941869e+01 2.02476765e+02 4.71940725e+01 2.02476903e+02 4.71938593e+01 2.02476881e+02 4.71936638e+01 2.02476649e+02 4.71935100e+01 2.02476398e+02 4.71935437e+01 2.02472055e+02 4.71908294e+01 2.02471808e+02 4.71909055e+01 2.02471818e+02 4.71906815e+01 2.02472053e+02 4.71907242e+01 2.02472055e+02 4.71908294e+01 2.02471650e+02 4.71908756e+01 2.02471457e+02 4.71908397e+01 2.02471470e+02 4.71907631e+01 2.02471611e+02 4.71907256e+01 2.02471650e+02 4.71908756e+01 2.02480294e+02 4.71965768e+01 2.02480000e+02 4.71966923e+01 2.02479826e+02 4.71966927e+01 2.02479554e+02 4.71965688e+01 2.02479506e+02 4.71963834e+01 2.02479799e+02 4.71962677e+01 2.02479984e+02 4.71962510e+01 2.02480288e+02 4.71963517e+01 2.02480294e+02 4.71965768e+01 2.02472704e+02 4.71918333e+01 2.02472713e+02 4.71918636e+01 2.02472773e+02 4.71918765e+01 2.02472739e+02 4.71918443e+01 2.02472704e+02 4.71918333e+01 2.02470964e+02 4.71907459e+01 2.02471031e+02 4.71908289e+01 2.02470960e+02 4.71910428e+01 2.02470697e+02 4.71911776e+01 2.02470516e+02 4.71913634e+01 2.02470290e+02 4.71915212e+01 2.02470062e+02 4.71915445e+01 2.02470054e+02 4.71913742e+01 2.02470113e+02 4.71911819e+01 2.02469797e+02 4.71912133e+01 2.02469649e+02 4.71914198e+01 2.02469577e+02 4.71915777e+01 2.02469588e+02 4.71916812e+01 2.02469416e+02 4.71916969e+01 2.02469178e+02 4.71915469e+01 2.02469204e+02 4.71914410e+01 2.02469346e+02 4.71912308e+01 2.02469605e+02 4.71910934e+01 2.02469591e+02 4.71909168e+01 2.02469628e+02 4.71908084e+01 2.02469729e+02 4.71905721e+01 2.02469995e+02 4.71904394e+01 2.02470337e+02 4.71903541e+01 2.02470359e+02 4.71903497e+01 2.02470626e+02 4.71904773e+01 2.02470836e+02 4.71906473e+01 2.02470964e+02 4.71907459e+01 2.02483869e+02 4.71991098e+01 2.02483538e+02 4.71991554e+01 2.02483296e+02 4.71990092e+01 2.02483298e+02 4.71987529e+01 2.02483658e+02 4.71987418e+01 2.02483837e+02 4.71989347e+01 2.02483869e+02 4.71991098e+01 2.02481740e+02 4.71977796e+01 2.02481399e+02 4.71978080e+01 2.02481231e+02 4.71976068e+01 2.02481180e+02 4.71974300e+01 2.02481462e+02 4.71974360e+01 2.02481738e+02 4.71975575e+01 2.02481740e+02 4.71977796e+01 2.02477292e+02 4.71949999e+01 2.02477271e+02 4.71950022e+01 2.02477253e+02 4.71949755e+01 2.02477355e+02 4.71949403e+01 2.02477292e+02 4.71949999e+01 2.02483785e+02 4.71993567e+01 2.02483718e+02 4.71993480e+01 2.02483654e+02 4.71992746e+01 2.02483775e+02 4.71993060e+01 2.02483785e+02 4.71993567e+01 2.02475648e+02 4.71945709e+01 2.02475647e+02 4.71945750e+01 2.02475631e+02 4.71948598e+01 2.02475505e+02 4.71950053e+01 2.02475801e+02 4.71951122e+01 2.02475981e+02 4.71953041e+01 2.02476209e+02 4.71952207e+01 2.02476173e+02 4.71951628e+01 2.02476101e+02 4.71948908e+01 2.02476095e+02 4.71948505e+01 2.02475930e+02 4.71946917e+01 2.02475654e+02 4.71945702e+01 2.02475648e+02 4.71945709e+01 2.02498378e+02 4.72093689e+01 2.02498335e+02 4.72093712e+01 2.02498334e+02 4.72093412e+01 2.02498376e+02 4.72093409e+01 2.02498378e+02 4.72093689e+01 2.02468165e+02 4.71907915e+01 2.02467991e+02 4.71907976e+01 2.02468027e+02 4.71907051e+01 2.02468168e+02 4.71906672e+01 2.02468165e+02 4.71907915e+01 2.02468421e+02 4.71912509e+01 2.02468233e+02 4.71912692e+01 2.02468093e+02 4.71910478e+01 2.02468093e+02 4.71910457e+01 2.02468096e+02 4.71910456e+01 2.02468422e+02 4.71911297e+01 2.02468421e+02 4.71912509e+01 2.02476742e+02 4.71973492e+01 2.02476736e+02 4.71973496e+01 2.02476733e+02 4.71973435e+01 2.02476743e+02 4.71973441e+01 2.02476742e+02 4.71973492e+01 2.02476078e+02 4.71972333e+01 2.02476021e+02 4.71972270e+01 2.02475991e+02 4.71971790e+01 2.02476080e+02 4.71971832e+01 2.02476078e+02 4.71972333e+01 2.02466117e+02 4.71925038e+01 2.02466119e+02 4.71925058e+01 2.02465992e+02 4.71927249e+01 2.02465724e+02 4.71927978e+01 2.02465465e+02 4.71926639e+01 2.02465465e+02 4.71923955e+01 2.02465666e+02 4.71922218e+01 2.02465967e+02 4.71922930e+01 2.02466117e+02 4.71925038e+01 2.02478679e+02 4.72006536e+01 2.02478414e+02 4.72006639e+01 2.02478334e+02 4.72004384e+01 2.02478662e+02 4.72004809e+01 2.02478679e+02 4.72006536e+01 2.02476245e+02 4.71991330e+01 2.02476023e+02 4.71992934e+01 2.02475869e+02 4.71994962e+01 2.02475910e+02 4.71995859e+01 2.02475872e+02 4.71997972e+01 2.02475633e+02 4.71999473e+01 2.02475332e+02 4.72000130e+01 2.02475162e+02 4.71998135e+01 2.02475092e+02 4.71996096e+01 2.02475332e+02 4.71994604e+01 2.02475498e+02 4.71992645e+01 2.02475705e+02 4.71990950e+01 2.02476014e+02 4.71989889e+01 2.02476234e+02 4.71990217e+01 2.02476245e+02 4.71991330e+01 2.02475462e+02 4.71992420e+01 2.02475061e+02 4.71992374e+01 2.02475168e+02 4.71990583e+01 2.02475322e+02 4.71990443e+01 2.02475462e+02 4.71992420e+01 2.02466002e+02 4.71933297e+01 2.02465910e+02 4.71933110e+01 2.02465726e+02 4.71931570e+01 2.02465986e+02 4.71932545e+01 2.02466002e+02 4.71933297e+01 2.02465694e+02 4.71931371e+01 2.02465333e+02 4.71930865e+01 2.02465124e+02 4.71930797e+01 2.02464953e+02 4.71930418e+01 2.02464871e+02 4.71929218e+01 2.02464831e+02 4.71928070e+01 2.02464871e+02 4.71926224e+01 2.02465124e+02 4.71925905e+01 2.02465428e+02 4.71926912e+01 2.02465626e+02 4.71928702e+01 2.02465694e+02 4.71931371e+01 2.02465867e+02 4.71938434e+01 2.02465922e+02 4.71939524e+01 2.02466193e+02 4.71940775e+01 2.02466226e+02 4.71940681e+01 2.02466295e+02 4.71940021e+01 2.02466163e+02 4.71937744e+01 2.02465867e+02 4.71938434e+01 2.02464418e+02 4.71935361e+01 2.02464212e+02 4.71935893e+01 2.02464287e+02 4.71934540e+01 2.02464427e+02 4.71934305e+01 2.02464418e+02 4.71935361e+01 2.02477227e+02 4.72018413e+01 2.02477187e+02 4.72018958e+01 2.02477443e+02 4.72020320e+01 2.02477719e+02 4.72021539e+01 2.02477915e+02 4.72023339e+01 2.02477914e+02 4.72025695e+01 2.02477553e+02 4.72026016e+01 2.02477285e+02 4.72024744e+01 2.02477101e+02 4.72022846e+01 2.02476973e+02 4.72020540e+01 2.02476762e+02 4.72018848e+01 2.02476495e+02 4.72017564e+01 2.02476495e+02 4.72016828e+01 2.02476644e+02 4.72016468e+01 2.02476836e+02 4.72015967e+01 2.02477179e+02 4.72015765e+01 2.02477227e+02 4.72018413e+01 2.02471274e+02 4.71981209e+01 2.02471265e+02 4.71981382e+01 2.02471289e+02 4.71981304e+01 2.02471373e+02 4.71980581e+01 2.02471274e+02 4.71981209e+01 2.02476401e+02 4.72022227e+01 2.02476307e+02 4.72022211e+01 2.02476268e+02 4.72021395e+01 2.02476411e+02 4.72021439e+01 2.02476401e+02 4.72022227e+01 2.02470378e+02 4.71990571e+01 2.02470337e+02 4.71991488e+01 2.02470353e+02 4.71993405e+01 2.02470410e+02 4.71994201e+01 2.02470661e+02 4.71995330e+01 2.02470524e+02 4.71993360e+01 2.02470516e+02 4.71991434e+01 2.02470464e+02 4.71990551e+01 2.02470378e+02 4.71990571e+01 2.02475794e+02 4.72030401e+01 2.02475636e+02 4.72030420e+01 2.02475637e+02 4.72029421e+01 2.02475810e+02 4.72029135e+01 2.02475794e+02 4.72030401e+01 2.02470946e+02 4.72000105e+01 2.02470935e+02 4.72000081e+01 2.02470891e+02 4.71999760e+01 2.02470971e+02 4.71999814e+01 2.02470946e+02 4.72000105e+01 2.02483235e+02 4.72082870e+01 2.02483050e+02 4.72083008e+01 2.02482791e+02 4.72081668e+01 2.02482712e+02 4.72079605e+01 2.02483037e+02 4.72079848e+01 2.02483239e+02 4.72081613e+01 2.02483235e+02 4.72082870e+01 2.02464053e+02 4.71963004e+01 2.02464051e+02 4.71963105e+01 2.02464073e+02 4.71963127e+01 2.02464074e+02 4.71962933e+01 2.02464053e+02 4.71963004e+01 2.02463738e+02 4.71967020e+01 2.02463813e+02 4.71968113e+01 2.02463912e+02 4.71968110e+01 2.02463916e+02 4.71967353e+01 2.02463738e+02 4.71967020e+01 2.02470001e+02 4.72009160e+01 2.02469924e+02 4.72010800e+01 2.02469964e+02 4.72011918e+01 2.02469787e+02 4.72011812e+01 2.02469569e+02 4.72012441e+01 2.02469366e+02 4.72011669e+01 2.02469151e+02 4.72010007e+01 2.02469130e+02 4.72009701e+01 2.02469220e+02 4.72009499e+01 2.02469555e+02 4.72009365e+01 2.02469706e+02 4.72007313e+01 2.02469942e+02 4.72007414e+01 2.02470001e+02 4.72009160e+01 2.02468237e+02 4.72001127e+01 2.02467978e+02 4.72002406e+01 2.02468152e+02 4.72000592e+01 2.02468254e+02 4.72000368e+01 2.02468237e+02 4.72001127e+01 2.02460712e+02 4.71957080e+01 2.02460525e+02 4.71956620e+01 2.02460522e+02 4.71955891e+01 2.02460675e+02 4.71955513e+01 2.02460712e+02 4.71957080e+01 2.02475143e+02 4.72071213e+01 2.02474952e+02 4.72071255e+01 2.02474937e+02 4.72069924e+01 2.02475194e+02 4.72069468e+01 2.02475143e+02 4.72071213e+01 2.02480758e+02 4.72157153e+01 2.02480456e+02 4.72157481e+01 2.02480486e+02 4.72155454e+01 2.02480744e+02 4.72155350e+01 2.02480758e+02 4.72157153e+01 2.02471770e+02 4.72112968e+01 2.02471509e+02 4.72112949e+01 2.02471475e+02 4.72111129e+01 2.02471773e+02 4.72110999e+01 2.02471770e+02 4.72112968e+01 2.02467546e+02 4.72128469e+01 2.02467167e+02 4.72128748e+01 2.02467249e+02 4.72126610e+01 2.02467459e+02 4.72126593e+01 2.02467546e+02 4.72128469e+01 2.02467425e+02 4.72130703e+01 2.02467329e+02 4.72130805e+01 2.02467198e+02 4.72129289e+01 2.02467510e+02 4.72129471e+01 2.02467425e+02 4.72130703e+01 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.flt����������������������������������������������������������������������������000644 �000765 �000000 �00000000011 12131336426 015522� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������$Jmag>15 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.lev����������������������������������������������������������������������������000644 �000765 �000000 �00000000043 12131336426 015530� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������-1 15.7878 32.5755 49.3633 66.151 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.sao����������������������������������������������������������������������������000644 �000765 �000000 �00000000126 12131336426 015526� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table PSEUDOCOLOR RED: (0,0)(0,0) GREEN: (0,0)(0,0) BLUE: (0,0)(1,1) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.sym����������������������������������������������������������������������������000644 �000765 �000000 �00000000207 12131336426 015554� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������condition shape color text size size2 units angle --------- ----- ----- ---- ---- ----- ----- ----- diamond point yellow physical �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/ds9.tag����������������������������������������������������������������������������000644 �000765 �000000 �00000000076 12131336426 015523� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������10.8811 14.1631 red 29.2606 32.5427 green 48.953 52.2351 blue ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/hello.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000000041 12131336426 016126� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������puts stdout "Hello Again, World" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/image.wcs��������������������������������������������������������������������������000644 �000765 �000000 �00000001440 12131336426 016123� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������CRVAL1 = 47.2097404068078 CRVAL2 = 202.481101229926 CRPIX1 = 198.5 CRPIX2 = 607.75 CD1_1 = -3.7266660000000E-4 CD1_2 = 4.05254400000000E-4 CD2_1 = -4.0525440000000E-4 CD2_2 = -3.7266660000000E-4 CTYPE1 = 'DEC--TAN' CTYPE2 = 'RA---TAN' ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/pds9.tcl���������������������������������������������������������������������������000644 �000765 �000000 �00000000037 12131336426 015707� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������global pds9 set pds9(backup) 0 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/aux/source.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000000027 12131336426 016327� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������set foo "Hello, World" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis/analysis.ans������������������������������������������������������������������000644 �000765 �000000 �00000010634 12614503526 017707� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Analysis command descriptions: # menu label # file templates # menu/bind # analysis command line param foo var1 entry entry 40 {this is a entry} var2 checkbox checkbox 1 {this is a checkbox} var3 menu menu AAA|BBB|CCC {this is a menu} endparam param bar @analysis/analysis.par endparam param ltc bins entry "Enter number of [t1:t2:]bins" 0 "('0' for default number of bins)" endparam # Help Main Help help Main Help These menus contain a test for each possible feature supported by the ds9 (blank line above) endhelp --- hmenu Test Web help Web Help Help for web features endhelp --- Web Test url * web http://ds9.si.edu/doc/helpdesk.html Web Test file * web file:/Users/joye/saods9/tests/analysis/hv.html endhmenu hmenu Test Basics help Basic Help Help for basic features endhelp --- Test escape char # this is a comment * menu echo "this is not a macro $$xpa" | $text Test pass thru # this is a comment * menu echo "this is not a macro $foo" | $text Test $xpa # this is a comment * menu echo $xpa | $text Test $xpa_method # this is also a comment * menu echo $xpa_method | $text Test $vo_method * menu echo $vo_method | $text Test $filename *.fits menu echo $filename | $text Test $filename(root) *.fits menu echo $filename(root) | $text Test $filename(full) *.fits menu echo $filename(full) | $text Test $filedialog(open) * menu echo "$filedialog(open)" | $text Test $filedialog(save) * menu echo "$filedialog(save)" | $text Test $width $height $depth $bitpix *.fits menu echo "$width $height $depth $bitpix" | $text Test $pan *.fits menu echo "$pan(fk5,degrees)" | $text Test $env * menu echo $env(PATH) | $text endhmenu hmenu Test Regions help Regions Help Help for regions features endhelp --- Test $regions *.fits menu echo "$regions ds9_s:$regions(ds9,source,image) ciao_b:$regions(ciao,background) saotng_i:$regions(saotng,include,wcs,fk5) pros_e:$regions(pros,exclude,wcs,fk5,sexagesimal) xy_be:$regions(xy,background,exclude,wcs,fk4,hms)" | $text Test $regions wcs *.fits menu echo "$regions(ds9,wcs) $regions(ds9,wcs,fk5,sexagesimal) $regions(ds9,wcsa) " | $text Test $include_regions_pixels *.fits menu echo "ds9_s: $source_regions ds9_b: $background_regions_pixels ds9_i: $include_regions_degrees ds9_e: $exclude_regions_hms" | $text Test $filename $regions *.fits menu echo "$filename[$regions]" | $text Test $filename $regions() *.fits menu echo "$filename[$regions()]" | $text endhmenu hmenu Test Output help Output Help Help for output features endhelp --- Test $null * menu echo "This is Text" > /dev/null | $null Test $text * menu echo "This is Text" | $text Test $plot * menu cat xy.dat | $plot Test $plot(title,x,y,xyey) * menu cat xyey.dat | $plot(Title,X Axis,Y Axis,xyey) Test $plot(title,x,y,xyexey) * menu cat xyexey.dat | $plot(Title,X Axis,Y Axis,xyexey) Test $plot(title,x,y,4) * menu cat 4.dat | $plot(Title,X Axis,Y Axis,4) Test $plot(title,x,y,5) * menu cat 5.dat | $plot(Title,X Axis,Y Axis,5) Test $plot(stdin) * menu cat stdin.xy.dat | $plot(stdin) Test $plot(stdin) text * menu cat stdin.text.dat | $plot(stdin) Test $plot(stdin) error * menu cat stdin.error.dat | $plot(stdin) Test $data *.fits menu $data | $image(new) Test $image * menu cat data/img.fits | $image Test $image(3d) * menu cat data/3d.fits | $image(3d) endhmenu hmenu Test Dialogs help Dialogs Help Help for dialog features endhelp --- Test $message(message) * menu $message(ok,This is a Message) | echo "hello" | $text Test $message(ok,message) * menu $message(ok,This is a Message) | echo "World" | $text Test $entry(message) * menu echo "$entry(Enter Something)" | $text endhmenu hmenu Test Params help Param Help Help for param features endhelp --- Test $param * menu $param(foo); echo "$var1 $var2 $var3" | $text Test $param @file * menu $param(bar); echo "$var1 $var2 $var3" | $text endhmenu hmenu Test Network help Network Help Help for network features endhelp --- Test $url(http://) * menu $url(http://ds9.si.edu/download/data/img.fits) | $image(new) endhmenu $x $y $z $value *.fits bind x echo "$x $y $z $value" | $text $x(fk5) $y(fk5) $z(wcs) $value *.fits bind y echo "$x(fk5) $y(fk5) $z(wcs) $value" | $text $x(wcs,fk5,hms) $y(wcs,fk5,hms) $z(wcs) $value *.fits bind z echo "$x(wcs,fk5,hms) $y(wcs,fk5,hms) $z(wcs) $value" | $text ����������������������������������������������������������������������������������������������������saods9/tests/analysis/analysis.par������������������������������������������������������������������000644 �000765 �000000 �00000000232 07253746357 017717� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������var1,f,a,"something",,,"this is an entry" var2,b,h,yes,,,"this is a checkbox" var3,s,a,"default",default|other|another,,"this is a menu" mode,s,h,"ql",,, ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis/analysis.reg������������������������������������������������������������������000644 �000765 �000000 �00000000332 11430330435 017665� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 3.1 global color=green font="helvetica 10 normal roman" select=1 edit=1 move=1 delete=1 include=1 fixed=0 source physical;circle(759,913,40) physical;-circle(1029,917,40) # background ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis/analysis.txt������������������������������������������������������������������000644 �000765 �000000 �00000000015 11243053526 017732� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������This is text �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tests/analysis/font.html���������������������������������������������������������������������000644 �000765 �000000 �00000001627 12131337530 017211� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!doctype html public "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> </head> <body> <font size=-2>font size=-2</font> <br><font size=-1>font size=-1</font> <br>font size=0 <br><font size=+1>font size=1</font> <br><font size=+2>font size=2</font> <br><font size=+3>font size=3</font> <br><font size=+4>font size=4</font> <p>font variable <br><tt>font fixed</tt> <br><font face="Arial,Helvetica">font helvetica</font> <br><font face="Times New Roman,Times">font times</font> <br><font face="Courier New,Courier">font courier</font> <p>font plain <br><i>font italic</i> <br><b>font bold</b> <br><b><i>font bold italic</i></b> <br><u>font underline</u> <br><b><i><u>font bold italic underline</u></i></b> <br>&nbsp; <br>&nbsp; </body> </html> ���������������������������������������������������������������������������������������������������������saods9/tests/analysis/hv.html�����������������������������������������������������������������������000644 �000765 �000000 �00000001472 12107534544 016665� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Testing Image Formats</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> </head> <body> <table cellpadding="2" cellspacing="2" width="100%"> <tbody> <tr> <td valign="top">jpg<br> <img src="../photo/rose.jpeg" alt="jpeg" height="149" width="227"> <br> </td> <td valign="top">gif<br> <img src="../photo/rose.gif" alt="gif" height="149" width="227"> <br> </td> </tr> <tr> <td valign="top">tiff<br> <img src="../photo/rose.tiff" alt="tiff" height="149" width="227"> <br> </td> <td valign="top">png<br> <img src="../photo/rose.png" alt="png" height="149" width="227"> <br> </td> </tr> </tbody> </table> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/aclocal.m4�������������������������������������������������������������������������000755 �000765 �000000 �00000000223 12257365700 015741� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/configure��������������������������������������������������������������������������000755 �000765 �000000 �00001046657 12556465611 016037� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tcliis 1.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tcliis' PACKAGE_TARNAME='tcliis' PACKAGE_VERSION='1.0' PACKAGE_STRING='tcliis 1.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP ac_ct_CXX CXXFLAGS CXX TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tcliis 1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tcliis] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tcliis 1.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tcliis configure 1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case <limits.h> declares $2. For example, HP-UX 11i <limits.h> declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer <limits.h> to <assert.h> if __STDC__ is defined, since <limits.h> exists even on freestanding compilers. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tcliis $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars=" iistcl.C xim.C iis.c util.c " for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="-lstdc++" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done for ac_header in sys/un.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" if test "x$ac_cv_header_sys_un_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_UN_H 1 _ACEOF fi done #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <tk.h> int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tcliis $as_me 1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tcliis config.status 1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ���������������������������������������������������������������������������������saods9/tcliis1.0/configure.in�����������������������������������������������������������������������000755 �000765 �000000 �00000016627 12556465611 016435� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_<PACKAGE_NAME> # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([tcliis], [1.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([ iistcl.C xim.C iis.c util.c ]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([-lstdc++]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) AC_CHECK_HEADERS(sys/un.h) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile pkgIndex.tcl]) ���������������������������������������������������������������������������������������������������������saods9/tcliis1.0/iis.c������������������������������������������������������������������������������000644 �000765 �000000 �00000114727 12535332216 015040� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/errno.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <time.h> #include <ctype.h> #ifdef HAVE_SYS_UN_H #include <sys/un.h> #endif #include <fcntl.h> #include "iis.h" #include "xim.h" /* IIS data pixel values. */ #define CMS_DATASTART 1 #define CMS_DATAEND 200 #define CMS_DATARANGE 200 /* IIS color assignments. */ #define CMS_CURSOR 201 #define CMS_BACKGROUND 202 #define CMS_FOREGROUND 203 #define CMS_RED 204 #define CMS_GREEN 205 #define CMS_BLUE 206 #define CMS_YELLOW 207 #define CMS_CYAN 208 #define CMS_MAGENTA 209 #define XtInputId void * #define XtNumber(x) MAX_CLIENTS /* * IIS.C -- IRAF/IIS "imtool" protocol module. This code is responsible for * accepting connections from remote network clients and communicating with * them via the imtool/iis image display server communications prototcol. * * fd = xim_iisopen (xim) * xim_iisclose (xim) * xim_iisio (xim, &fd, &id) * * xim_frameLabel (xim) * xim_encodewcs (xim, sx, sy, sz, obuf) * xim_retCursorVal (xim, sx, sy, frame, wcs, key, strval) * * xim_iisiomap (w, iomap, &iomap_len) * xim_iiscolormap (w, r, g, b, &first, &ngray, &rgb_len) * * xim_iisio is a callback procedure called by Xt when there is input to be * processed on the stream used to communicate with the remote client. */ #define MEMORY 01 /* frame buffer i/o */ #define LUT 02 /* lut i/o */ #define FEEDBACK 05 /* used for frame clears */ #define IMCURSOR 020 /* logical image cursor */ #define WCS 021 /* used to set WCS */ #define SZ_IOBUF 65536 /* max size data transfer */ #define IO_TIMEOUT 30 /* i/o not getting anywhere */ #define MAXCONN 5 #define IIS_VERSION 10 /* version 10 -> 1.0 */ #define SZ_IMCURVAL 160 #define PACKED 0040000 #define COMMAND 0100000 #define IIS_READ 0100000 #define IMC_SAMPLE 0040000 #define IMT_FBCONFIG 077 #define XYMASK 077777 struct iism70 { short tid; short thingct; short subunit; short checksum; short x, y, z; short t; }; /* Running id for frame mappings. We keep a separate id for each of the * currently allowed MAX_FRAMES since the object id is used in the WCS * code for the image along with the (frame_num * 100). */ int objid[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static int *wcspix_enabled = NULL; static int iis_debug = -1; /* protocol debug */ static void set_fbconfig(), add_mapping(); static void xim_connectClient(), xim_disconnectClient(); static int chan_read(), chan_write(), decode_frameno(); static CtranPtr wcs_update(); static IoChanPtr open_fifo(), open_inet(); #ifdef HAVE_SYS_UN_H static IoChanPtr open_unix(); #endif static IoChanPtr get_iochan(); static MappingPtr xim_getMapping(XimDataPtr, float, float, int); static void print_mappings(FrameBufPtr fr); extern int errno; /* XIM_IISOPEN -- Initialize the IIS protocol module and ready the module to * accept client connections and begin processing client requests. Clients * may connect to the server using a fifo connection or an internet or * UNIX domain socket connection. All three types of server ports are * simultaneously ready to receive client connections. */ int xim_iisOpen(XimDataPtr xim) { int nopen = 0; if (open_fifo (xim)) nopen++; if (open_inet (xim)) nopen++; #ifdef HAVE_SYS_UN_H if (open_unix (xim)) nopen++; #endif return (nopen); } /* XIM_IISCLOSE -- Close down the IIS protocol module. */ void xim_iisClose(XimDataPtr xim) { IoChanPtr chan; int i; for (i=0, chan=NULL; i < XtNumber(xim->chan); i++) { chan = &xim->chan[i]; if (chan->id) { xim_removeInput (xim, (int)chan->id); chan->id = 0; } switch (chan->type) { case IO_FIFO: if (chan->keepalive >= 0) close (chan->keepalive); if (chan->datain >= 0) close (chan->datain); if (chan->dataout >= 0) close (chan->dataout); chan->type = 0; break; case IO_INET: close (chan->datain); chan->type = 0; break; #ifdef HAVE_SYS_UN_H case IO_UNIX: close (chan->datain); unlink (chan->path); chan->type = 0; break; #endif } } } /* OPEN_FIFO -- Ooen the (x)imtool fifo port and make ready to accept client * connections and begin processing client requests. There is no client * yet at this stage. */ static IoChanPtr open_fifo(XimDataPtr xim) { IoChanPtr chan; int datain, dataout; int keepalive; #ifdef __DARWIN__ /* On OS X we don't use fifos. */ xim->input_fifo = "none"; return (NULL); #endif /* Setting the input fifo to "none" or the null string disables * fifo support. */ if (!xim->input_fifo[0] || strcmp(xim->input_fifo,"none")==0) return (NULL); datain = dataout = -1; /* Open the output fifo (which is the client's input fifo). We have * to open it ourselves first as a client to get around the fifo * open-no-client error. */ if ((datain = open (xim->input_fifo, O_RDONLY|O_NDELAY)) != -1) { if ((dataout = open (xim->input_fifo, O_WRONLY|O_NDELAY)) != -1) fcntl (dataout, F_SETFL, O_WRONLY); else goto done; close (datain); } else goto done; /* Open the input stream, a FIFO pseudodevice file used by * applications to send us commands and data. */ if ((datain = open (xim->output_fifo, O_RDONLY|O_NDELAY)) == -1) goto done; else { /* Clear O_NDELAY for reading. */ fcntl (datain, F_SETFL, O_RDONLY); /* Open the client's output fifo as a pseudo-client to make it * appear that a client is connected. */ keepalive = open (xim->output_fifo, O_WRONLY); } done: /* Allocate and fill in i/o channel descriptor. */ if (datain > 0 && dataout > 0 && (chan = get_iochan(xim))) { chan->xim = (XtPointer) xim; chan->type = IO_FIFO; chan->datain = datain; chan->dataout = dataout; chan->keepalive = keepalive; chan->reference_frame = 1; chan->version = 0; chan->rf_p = &xim->frames[0]; } else { /* fprintf (stderr, "Warning: cannot open %s\n", xim->output_fifo); */ strcpy (xim->input_fifo, "none"); chan = NULL; } /* Register input callback. */ if (chan) { chan->id = xim_addInput(xim, chan->datain, xim_iisio, chan); } else { if (datain > 0) close (datain); if (dataout > 0) close (dataout); } return (chan); } /* OPEN_INET -- Set up a port to be used for incoming client connections * using internet domain sockets. */ static IoChanPtr open_inet(XimDataPtr xim) { int s = 0; IoChanPtr chan; struct sockaddr_in sockaddr; int reuse = 1; /* Setting the port to zero disables inet socket support. */ if (xim->port <= 0) return (NULL); if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) goto err; memset ((void *)&sockaddr, 0, sizeof(sockaddr)); sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons((short)xim->port); sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0) goto err; if (bind (s, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) goto err; if (listen (s, MAXCONN) < 0) goto err; /* make sure we close on exec */ fcntl(s, F_SETFD, FD_CLOEXEC); /* Allocate and fill in i/o channel descriptor. */ if ((chan = get_iochan(xim))) { chan->xim = (XtPointer) xim; chan->type = IO_INET; chan->datain = s; chan->dataout = s; chan->reference_frame = 1; chan->version = 0; chan->rf_p = &xim->frames[0]; /* Register connectClient callback. */ chan->id = xim_addInput(xim, s, xim_connectClient, chan); return (chan); } err: /* if (errno == EADDRINUSE) { fprintf (stderr,"ximtool: inet port %d already in use - disabled\n", xim->port); } else { fprintf (stderr, "ximtool: can't open inet socket %d, errno=%d\n", xim->port, errno); } */ xim->port = 0; if (s) close (s); return (NULL); } /* OPEN_UNIX -- Set up a port to be used for incoming client connections * using unix domain sockets. */ #ifdef HAVE_SYS_UN_H static IoChanPtr open_unix(XimDataPtr xim) { int s = 0; IoChanPtr chan; struct sockaddr_un sockaddr; int addrlen; char path[256]; /* Setting the addr to "none" or the null string disables unix * socket support. */ if (!xim->unixaddr[0] || strcmp(xim->unixaddr,"none")==0) return (NULL); /* Get path to be used for the unix domain socket. */ sprintf (path, xim->unixaddr, getuid()); unlink (path); if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) goto err; memset ((void *)&sockaddr, 0, sizeof(sockaddr)); sockaddr.sun_family = AF_UNIX; strcpy (sockaddr.sun_path, path); addrlen = sizeof(sockaddr) - sizeof(sockaddr.sun_path) + strlen(path); if (bind (s, (struct sockaddr *)&sockaddr, addrlen) < 0) goto err; if (listen (s, MAXCONN) < 0) goto err; /* make sure we close on exec */ fcntl(s, F_SETFD, FD_CLOEXEC); /* Allocate and fill in i/o channel descriptor. */ if ((chan = get_iochan(xim))) { chan->xim = (XtPointer) xim; chan->type = IO_UNIX; chan->datain = s; chan->dataout = s; chan->reference_frame = 1; chan->version = 0; chan->rf_p = &xim->frames[0]; strncpy (chan->path, path, SZ_FNAME); /* Register connectClient callback. */ chan->id = xim_addInput (xim,s,xim_connectClient,(XtPointer)chan); return (chan); } err: /* if (errno == EADDRINUSE) { fprintf (stderr,"ximtool: unix addr %s already in use - disabled\n", path); } else { fprintf (stderr,"ximtool: cannot open unix socket '%s', errno=%d\n", path, errno); } */ strcpy (xim->unixaddr, "none"); if (s) close (s); return (NULL); } #endif /* XIM_CONNECTCLIENT -- Called when a client has attempted a connection on * a socket port. Accept the connection and set up a new i/o channel to * communicate with the new client. */ static void xim_connectClient(IoChanPtr chan_port, int *source, XtPointer id) { XimDataPtr xim = (XimDataPtr) chan_port->xim; IoChanPtr chan; int s; /* Accept connection. */ if ((s = accept ((int)*source, (struct sockaddr *)0, (socklen_t *)0)) < 0) return; /* if (fcntl (s, F_SETFL, O_RDWR|O_NDELAY) < 0) { close (s); return; } */ /* Allocate and fill in i/o channel descriptor. */ if ((chan = get_iochan(xim))) { chan->xim = (XtPointer) xim; chan->type = chan_port->type; chan->datain = s; chan->dataout = s; chan->reference_frame = 1; chan->version = 0; chan->rf_p = &xim->frames[0]; chan->id = xim_addInput(xim, s, xim_iisio, chan); } } /* XIM_DISCONNECTCLIENT -- Called to close a client connection when EOF is * seen on the input port. Close the connection and free the channel * descriptor. */ static void xim_disconnectClient(IoChanPtr chan) { switch (chan->type) { case IO_INET: case IO_UNIX: close (chan->datain); if (chan->id) { xim_removeInput(chan->xim, chan->id); chan->id = 0; } chan->type = 0; break; default: break; } } /* GET_IOCHAN --- Get an i/o channel descriptor. */ static IoChanPtr get_iochan(XimDataPtr xim) { int i; for (i=0; i < XtNumber(xim->chan); i++) if (!xim->chan[i].type) return (&xim->chan[i]); return (NULL); } /* XIM_IISIO -- Xt file i/o callback procedure, called when there is input * pending on the data stream to the ximtool client. */ void xim_iisio (IoChanPtr chan, int *fd_addr, XtInputId *id_addr) { XimDataPtr xim = (XimDataPtr) chan->xim; MappingPtr mp = (MappingPtr) NULL; FrameBufPtr fb; int sum, i; short *p; int datain = *fd_addr; int dataout = chan->dataout; int ndatabytes, nbytes, n, newframe, ntrys=0; struct iism70 iis; char buf[SZ_FIFOBUF]; static int errmsg=0, bswap=0; /* Initialize the debug output. */ if (iis_debug == -1) iis_debug = (getenv("DEBUG_IIS") != (char *)NULL); /* Get the IIS header. */ if ((n = chan_read (datain, (char *)&iis, sizeof(iis))) < sizeof(iis)) { if (n != 0) fprintf (stderr, "ximtool: command input read error, n=%d of %d, errno=%d\n", n, (int)sizeof(iis), errno); if (n <= 0) xim_disconnectClient (chan); return; } else if (bswap) bswap2 ((char *)&iis, (char *)&iis, sizeof(iis)); /* Verify the checksum. If it fails swap the bytes and try again. */ for (;;) { for (i=0, sum=0, p=(short *)&iis; i < 8; i++) sum += *p++; if ((sum & 0177777) == 0177777) break; if (ntrys++) { if (!errmsg++) { fprintf (stderr, "ximtool: bad data header checksum\n"); if (bswap) bswap2 ((char *)&iis, (char *)&iis, sizeof(iis)); fprintf (stderr, "noswap:"); for (i=0, p=(short *)&iis; i < 8; i++) fprintf (stderr, " %6o", p[i]); fprintf (stderr, "\n"); bswap2 ((char *)&iis, (char *)&iis, sizeof(iis)); fprintf (stderr, " swap:"); for (i=0, p=(short *)&iis; i < 8; i++) fprintf (stderr, " %6o", p[i]); fprintf (stderr, "\n"); } break; } else { bswap2 ((char *)&iis, (char *)&iis, sizeof(iis)); bswap = !bswap; } } ndatabytes = -iis.thingct; if (!(iis.tid & PACKED)) ndatabytes *= 2; if (iis_debug) { fprintf (stderr, "subunit=%06o tid=%06o nbytes=%7d x=%06o y=%06o z=%06o t=%06o\n", iis.subunit & 077, iis.tid, ndatabytes, iis.x & 0177777, iis.y & 0177777, iis.z & 0177777, iis.t & 0177777); fflush (stderr); } switch (iis.subunit & 077) { case FEEDBACK: /* The feedback unit is used only to clear a frame. The * xim_eraseFrame() procedure takes care of uncaching the * mappings associated with this frame. */ newframe = decode_frameno (iis.z & 0177777); xim_setReferenceFrame (chan, newframe); if (newframe == chan->reference_frame) xim_eraseFrame (xim, chan->reference_frame); /* ISM: Uncache all mappings associated with this frame. */ fb = &xim->frames[newframe-1]; for (i=0; i < fb->nmaps; i++) { mp = &fb->mapping[i]; if (mp->id) { sprintf (buf, "uncache %d", mp->id); ism_message (xim, "wcspix", buf); wcspix_message (xim, buf); mp->id = 0; } } /* Reset various counters for the new frame and release the * mappings. */ fb->nmaps = 0; fb->ctran.valid = 0; objid[newframe-1] = 0; fb->nmaps = 0; if (iis_debug) fprintf (stderr, "erase frame %d - ref = %d\n", newframe, chan->reference_frame); break; case LUT: /* Data mode writes to the frame lookup tables are not implemented. * A command mode write to the LUT subunit is used to connect * image memories up to the RGB channels, i.e., to select the frame * to be displayed. We ignore any attempt to assign multiple * frames to multiple color channels, and just do a simple frame * select. */ if (iis.subunit & COMMAND) { int frame, z, n; short x[17]; if (chan_read (datain, (char *)x, ndatabytes) == ndatabytes) { if (bswap) bswap2 ((char *)x, (char *)x, ndatabytes); z = x[0]; if (!z) z = 1; for (n=0; !(z & 1); z >>= 1) n++; frame = max (1, n + 1); if (frame > xim->nframes) { if (frame <= MAX_FRAMES) { set_fbconfig (chan, xim->fb_configno, frame); if (iis_debug) fprintf (stderr, "set_fbconfig (%d, %d)\n", xim->fb_configno, frame); } else { fprintf (stderr, "ximtool warning: "); fprintf (stderr, "attempt to display nonexistent frame %d\n", frame); return; } } xim_setDisplayFrame (xim, frame); if (iis_debug) fprintf (stderr, "set_frame (%d)\n", frame); return; } } case MEMORY: /* Load data into the frame buffer. Data is assumed to be byte * packed. */ if (iis.tid & IIS_READ) { /* Read from the display. */ unsigned char *ip, iobuf[SZ_IOBUF]; int nbytes, nleft, n, x, y; long starttime; /* Get the frame to read from. */ xim_setReferenceFrame (chan, decode_frameno (iis.z & 0177777)); nbytes = ndatabytes; x = iis.x & XYMASK; y = iis.y & XYMASK; if (x < 0 || x >= xim->width || y < 0 || y >= xim->height) { fprintf (stderr, "ximtool: attempted read out of bounds on framebuf\n"); fprintf (stderr, "read %d bytes at [%d,%d]\n", nbytes, x, y); memset ((void *)iobuf, 0, nbytes); } else { GtReadPixels (xim->gt, chan->rf_p->raster, iobuf, 8, x, y, min(xim->width-x,nbytes), max(1,nbytes/xim->width)); if (iis_debug) fprintf (stderr, "read %d bytes at [%d,%d]\n", nbytes, x, y); } /* Return the data from the frame buffer. */ starttime = time(0); for (nleft=nbytes, ip=iobuf; nleft > 0; nleft -= n) { n = (nleft < SZ_FIFOBUF) ? nleft : SZ_FIFOBUF; if ((n = chan_write (dataout, ip, n)) <= 0) { if (n < 0 || (time(0) - starttime > IO_TIMEOUT)) { fprintf (stderr, "XIMTOOL: timeout on write\n"); break; } } else ip += n; } return; } else { /* Write to the display. */ unsigned char *op, iobuf[SZ_IOBUF]; int nbytes, nleft, n, x, y; long starttime; /* Get the frame to be written into (encoded with a bit for * each frame, 01 is frame 1, 02 is frame 2, 04 is frame 3, * and so on). */ xim_setReferenceFrame (chan, decode_frameno (iis.z & 0177777)); nbytes = ndatabytes; x = iis.x & XYMASK; y = iis.y & XYMASK; /* Read the data into the frame buffer. */ starttime = time(0); for (nleft=nbytes, op=iobuf; nleft > 0; nleft -= n) { n = (nleft < SZ_FIFOBUF) ? nleft : SZ_FIFOBUF; if ((n = chan_read (datain, op, n)) <= 0) { if (n < 0 || (time(0) - starttime > IO_TIMEOUT)) { fprintf (stderr, "XIMTOOL: timeout on read\n"); break; } } else op += n; } if (x < 0 || x >= xim->width || y < 0 || y >= xim->height) { fprintf (stderr, "ximtool: attempted write out of bounds on framebuf\n"); fprintf (stderr, "write %d bytes at [%d,%d]\n", nbytes, x, y); memset ((void *)iobuf, 0, nbytes); } else { GtWritePixels (xim->gt, chan->rf_p->raster, iobuf, 8, x, y, min(xim->width-x,nbytes), max(1,nbytes/xim->width)); if (iis_debug) fprintf (stderr, "write %d bytes at x=%d, y=%d\n", nbytes, x, y); } return; } break; case WCS: /* Read or write the WCS for a frame. The frame number to * which the WCS applies is passed in Z and the frame buffer * configuration in T. The client changes the frame buffer * configuration in a WCS set. The WCS text follows the header * as byte packed ASCII data. */ if (iis.tid & IIS_READ) { /* Return the WCS for the referenced frame. */ char emsg[SZ_WCSBUF]; char *text; int frame; memset ((char *)emsg, 0, SZ_WCSBUF); if ((iis.x & 017777) && (iis.y & 017777)) { /* This is a check by the client on our capabilities. * Return with a version number which can be used by the * client. However we write back using the old WCS * buffer size for compatability. */ sprintf (text=emsg, "version=%d", IIS_VERSION); chan->version = IIS_VERSION; chan_write (dataout, text, SZ_OLD_WCSBUF); if (iis_debug) fprintf (stderr, "version query wcs: %s\n",text); } else if ((iis.x & 017777) && (iis.t & 017777)) { /* Return the buffer for a specified WCS number. */ CtranPtr ct = (CtranPtr) NULL; FrameBufPtr fr = (FrameBufPtr) NULL; int wcsnum = (iis.t & 017777); int i, j; /* Decode the requested wcs number. */ frame = decode_frameno (iis.z & 0177777); /* Search for the requested WCS number. */ mp = (MappingPtr) NULL; for (j=0; j < xim->nframes; j++) { fr = &xim->frames[j]; if (fr->frameno != frame) continue; for (i=0; i < fr->nmaps; i++) { mp = &fr->mapping[i]; if (mp->id == wcsnum) { /* found the mapping */ ct = &(mp->ctran); goto map_found; } } } /* Encode the WCS and mapping information. */ map_found: if (ct) { char wcs[SZ_WCSBUF], mapping[SZ_WCSBUF]; sprintf (wcs, "%s\n%f %f %f %f %f %f %f %f %d\n", ct->imtitle, ct->a, ct->b, ct->c, ct->d, ct->tx, ct->ty, ct->z1, ct->z2, ct->zt); sprintf (mapping, "%s %f %f %d %d %d %d %d %d\n%s\n", mp->region, mp->sx, mp->sy, mp->snx, mp->sny, mp->dx, mp->dy, mp->dnx, mp->dny, mp->ref); strcpy (text=emsg, wcs); strcat (text, mapping); } else strcpy (text=emsg, "[NOSUCHWCS]\n"); chan_write (dataout, text, SZ_WCSBUF); if (iis_debug) { fprintf (stderr, "query specified wcs=%d frame=%d\n", wcsnum, frame); write (2, text, strlen (text)); } } else { frame = decode_frameno (iis.z & 0177777); xim_setReferenceFrame (chan, frame); /*** waj ***/ /* We always want to use the wcs buffer. If frameno == 0 ds9 will fill in the buffer. if (chan->rf_p->frameno <= 0) strcpy (text=emsg, "[NOSUCHFRAME]\n"); else */ /*** waj ***/ text = chan->rf_p->wcsbuf; if ((iis.x & 0777)) chan_write (dataout, text, SZ_WCSBUF); else chan_write (dataout, text, SZ_OLD_WCSBUF); if (iis_debug) { fprintf (stderr, "query wcs: frame = %d\n", frame); write (2, text, strlen(text)); } } } else { /* Set the WCS for the referenced frame. */ CtranPtr ct; int fb_config, frame, new_wcs = 0; frame = decode_frameno (iis.z & 0177777); fb_config = (iis.t & 0777) + 1; new_wcs = (iis.x & 0777); /* See if we need to change the frame buffer configuration, * or allocate a new frame. */ if (fb_config != xim->fb_configno) set_fbconfig (chan, fb_config, frame); else if (frame > xim->nframes && frame <= MAX_FRAMES) set_fbconfig (chan, xim->fb_configno, frame); /* Read in and set up the WCS. */ xim_setReferenceFrame (chan, frame); memset ((char *)buf, 0, SZ_WCSBUF); if (chan_read (datain, buf, ndatabytes) == ndatabytes) strncpy (chan->rf_p->wcsbuf, buf, (new_wcs ? SZ_WCSBUF : SZ_OLD_WCSBUF)); if (iis_debug) { fprintf (stderr, "set wcs:\n"); write (2, buf, ndatabytes); } strcpy (chan->rf_p->ctran.format, W_DEFFORMAT); chan->rf_p->ctran.imtitle[0] = '\0'; chan->rf_p->ctran.valid = 0; ct = wcs_update (xim, chan->rf_p); /* If we're connected to an old-style client, disable the * WCSPIX ISM, otherwise just let the GUI know it capable. */ wcspix_message (xim, (new_wcs ? "capable" : "disable")); /* Add the mapping information. */ add_mapping (xim, ct, chan->rf_p->wcsbuf, &xim->frames[chan->reference_frame-1]); xim_message (xim, "frameTitle", ct->imtitle); } return; case IMCURSOR: /* Read or write the logical image cursor. This is an extension * added to provide a high level cursor read facility; this is * not the same as a low level access to the IIS cursor subunit. * Cursor reads may be either nonblocking (immediate) or blocking, * using the keyboard or mouse to terminate the read, and * coordinates may be returned in either image (world) or frame * buffer pixel coordinates. */ if (iis.tid & IIS_READ) { /* Read the logical image cursor. In the case of a blocking * read all we do is initiate a cursor read; completion occurs * when the user hits a key or button. */ if (iis_debug) fprintf (stderr, "read cursor position\n"); if (iis.tid & IMC_SAMPLE) { /* Sample the cursor position and return the cursor value * on the output datastream encoded in a fixed size * ascii buffer. */ int wcs = iis.z; int raster, frame; float sx, sy; IoChanPtr sv_chan; /* Save the cursor channel so that sampled cursor reads * can occur on one channel without affecting any * interactive cursor reads in progress on another * channel. */ sv_chan = xim->cursor_chan; xim->cursor_chan = chan; xim_getCursorPos (xim, &sx, &sy, &raster, &frame); xim_retCursorVal (xim, sx, sy, frame, wcs, 0, ""); xim->cursor_chan = sv_chan; } else { /* Initiate a user triggered cursor read. */ if (xim->cursor_chan) { int frame = xim->cursor_chan->reference_frame; xim_retCursorVal (xim, 0., 0., frame, 0, EOF, ""); } xim->cursor_chan = chan; xim_cursorMode (xim, 1); } } else { /* Write (set) the logical image cursor position. */ CtranPtr ct; int sx = iis.x, sy = iis.y; float wx = sx, wy = sy; int wcs = iis.z; if (iis_debug) fprintf(stderr, "write cursor position: [%d,%d]\n", sx, sy); if (wcs) { ct = wcs_update (xim, xim->df_p); if (ct->valid) { if (abs(ct->a) > .001) sx = (wx - ct->tx) / ct->a; if (abs(ct->d) > .001) sy = (wy - ct->ty) / ct->d; } } xim_setCursorPos (xim, sx, sy); } return; default: /* Ignore unsupported command input. */ break; } /* Discard any data following the header. */ if (!(iis.tid & IIS_READ)) for (nbytes = ndatabytes; nbytes > 0; nbytes -= n) { n = (nbytes < SZ_FIFOBUF) ? nbytes : SZ_FIFOBUF; if ((n = chan_read (datain, buf, n)) <= 0) { if (iis_debug) fprintf (stderr, "discarding %d bytes following header:\n", n); break; } } } /* SET_FBCONFIG -- Set the frame buffer configuration, or add additional * frames to the current configuration. */ static void set_fbconfig(IoChanPtr chan, int config, int frame) { XimDataPtr xim = (XimDataPtr) chan->xim; FrameBufPtr fb = &xim->frames[frame-1]; int i; if (config != xim->fb_configno) { /* Change the frame buffer configuration. */ xim_initialize (xim, config, max (xim->fb_config[config-1].nframes, frame), 1); /* Reinitialize the tile framing if enabled. */ /* if (xim->tileFrames) xim_tileFrames (xim, xim->tileFramesList);*/ /* Initialize the ISM to uncache all images when we change * frame buffer configs. */ ism_message (xim, "wcspix", "initialize"); } else if (frame > xim->nframes) { /* Add additional frames. */ for (i=1; i <= frame; i++) { fb = &xim->frames[i-1]; if (fb->frameno != i) { xim_initFrame (xim, i, frame, &xim->fb_config[config-1], xim->memModel); /* If we're in tile mode, add the frame to the tile list * and if needed resize the tile frames. */ if (xim->tileFrames) { xim->tileFramesList |= (1 << (i-1)); xim->nTileFrames++; /* xim_tileFrames (xim, xim->tileFramesList);*/ } } } } xim_setReferenceFrame (chan, frame); if (frame != xim->display_frame) xim_setDisplayFrame (xim, frame); } /* DECODE_FRAMENO -- Decode encoded IIS register frame number. */ static int decode_frameno(int z) { int n; /* Get the frame number, encoded with a bit for each frame, 01 is * frame 1, 02 is frame 2, 04 is frame 3, and so on. */ if (!z) z = 1; for (n=0; !(z & 1); z >>= 1) n++; return (max (1, n + 1)); } /* XIM_RETCURSORVAL -- Return the cursor value on the output datastream to * the client which requested the cursor read. */ void xim_retCursorVal(XimDataPtr xim, float sx, float sy, int frame, int wcs, int key, char* strval) { CtranPtr ct; MappingPtr mp = (MappingPtr) NULL; int dataout, wcscode; char curval[SZ_IMCURVAL]; char keystr[20]; float wx, wy; if (xim->cursor_chan) dataout = xim->cursor_chan->dataout; else return; /* Compute cursor coordinates. */ if (wcs) { ct = wcs_update (xim, xim->df_p); if (ct->valid) { /* The imtool WCS assumes that the center of the first display * pixel is at (0,0) but actually it is at (0.5,0.5). */ sx -= 0.5; sy -= 0.5; if (abs(ct->a) > .001) wx = ct->a * sx + ct->c * sy + ct->tx; if (abs(ct->d) > .001) wy = ct->b * sx + ct->d * sy + ct->ty; } } else { wx = sx; wy = sy; } /* Compute WCS code. */ wcscode = frame * 100 + wcs; if (wcspix_enabled != NULL && *wcspix_enabled) { if ((mp = xim_getMapping (xim, sx, sy, frame))) { wcscode = mp->id; /* Return the coordinates in terms of the mapping. */ ct = &(mp->ctran); wx = ct->a * sx + ct->c * sy + ct->tx; wy = ct->b * sx + ct->d * sy + ct->ty; } } /* Encode the cursor value. */ if (key == EOF) sprintf (curval, "EOF\n"); else { if (isprint (key) && !isspace(key)) { keystr[0] = key; keystr[1] = '\0'; } else sprintf (keystr, "\\%03o", key); sprintf (curval, "%10.3f %10.3f %d %s %s\n", wx, wy, wcscode, keystr, strval); } if (iis_debug) fprintf (stderr, "curval: %s", curval); /* Send it to the client program and terminate cursor mode. */ chan_write (dataout, curval, sizeof(curval)); xim_cursorMode (xim, 0); xim->cursor_chan = NULL; } /* XIM_ENCODEWCS -- Transform the input screen (raster) coordinates and * pixel value and return a string giving X, Y, and the pixel intensity in * world units. */ void xim_encodewcs (XimDataPtr xim, float sx, float sy, int sz, char* obuf) { CtranPtr ct; MappingPtr mp = (MappingPtr) NULL; float wx, wy, wz; int i=0, ch, map_found = 0; char buf[SZ_LINE]; /* The first time we're called get the address of the wcspix * connected flag so we can check whether to get screen pixel * or real-image values. */ if (wcspix_enabled == NULL) { IsmModule ism; extern ismModule ism_modules[]; extern int ism_nmodules; for (i=0; i < ism_nmodules; i++) { ism = &ism_modules[i]; if (strcmp ("wcspix", ism->name) == 0) wcspix_enabled = &(ism->connected); } } /* Now lookup the coordinate mapping and update the WCS and real * pixel value if the ISM is running. */ if (wcspix_enabled != NULL && *wcspix_enabled) { if ((mp = xim_getMapping (xim, sx+1.0, sy, xim->display_frame))) { ct = &(mp->ctran); sx -= 0.5; sy -= 0.5; wx = ct->a * sx + ct->c * sy + ct->tx; wy = ct->b * sx + ct->d * sy + ct->ty; /* Found the image mapping so request the WCS * and pixel information from the WPIX ISM. */ /* if (mp->ref != NULL) {*/ sprintf (buf, "wcstran %d %g %g\n", mp->id, wx, wy); ism_message (xim, "wcspix", buf); /* }*/ map_found++; } } ct = wcs_update (xim, xim->df_p); if (ct->valid) { /* The imtool WCS assumes that the center of the first display * pixel is at (0,0) but actually it is at (0.5,0.5). */ wx = ct->a * sx + ct->c * sy + ct->tx; wy = ct->b * sx + ct->d * sy + ct->ty; if (sz == 0) wz = 0.0; else { switch (ct->zt) { case W_LINEAR: wz = ((sz - CMS_DATASTART) * (ct->z2 - ct->z1) / (CMS_DATARANGE-1)) + ct->z1; break; default: wz = sz; break; } } } else { wx = sx; wy = sy; wz = sz; } ch = ' '; if (sz && ct->valid) { if (ct->z1 < ct->z2) { if (wz < (ct->z1 + 0.01)) ch = '-'; else if (wz > (ct->z2 - 0.01)) ch = '+'; } else if (ct->z1 > ct->z2) { if (wz < (ct->z2 + 0.01)) ch = '-'; else if (wz > (ct->z1 - 0.01)) ch = '+'; } } sprintf (obuf, ct->format, wx + 0.005, wy + 0.005, wz, ch); } /* XIM_GETMAPPING -- Return the mapping struct for the given screen coords. */ static MappingPtr xim_getMapping(XimDataPtr xim, float sx, float sy, int frame) { FrameBufPtr fb = (FrameBufPtr) NULL; MappingPtr mp = (MappingPtr) NULL; int j,i=0; float y = xim->height - sy; int map_debug = 0; /* Loop through the frame buffers until we find the current one. * The mappings aren't stored in the display fb so we need to * search. */ for (j=0; j < xim->nframes; j++) { fb = &xim->frames[j]; if (frame == fb->frameno) { /* Got the right frame, now search for mappings on this * frame which intersect the screen coords. We assume there * are no overlapping image mappings. */ for (i=0; i < fb->nmaps; i++) { mp = &fb->mapping[i]; if (map_debug) { printf ("sx=%.2f sy=%.2f / %.2f --> ", sx, sy, y); printf ("mp->dx=%d+%d=%d mp->dy=%d+%d=%d", mp->dx, mp->dnx, mp->dx+mp->dnx, mp->dy, mp->dny, mp->dy+mp->dny); } if ((sx >= mp->dx && sx <= (mp->dx + mp->dnx)) && ( y >= mp->dy && y <= (mp->dy + mp->dny))) { if (map_debug) printf (" YES\n"); return (mp); } if (map_debug) printf (" NO\n"); } } } return ((MappingPtr) NULL); } /* XIM_FRAMELABEL -- Return a pointer to the frame label string for the current * frame. */ char* xim_frameLabel(XimDataPtr xim) { FrameBufPtr df_p = xim->df_p; sprintf (df_p->label, "[%d] %s", df_p->frameno, df_p->ctran.imtitle); return (df_p->label); } /* WCS_UPDATE -- Load the screen WCS, if not yet validated, from the user * wcs file, if any. * * File format (two lines): * * image title (imtool header label string)\n * a b c d tx ty z1 z2 zt * * The WCS text is passed in via the data stream as a write to the subunit * WCS and left in the buffer "wcsbuf". Mapping information is parsed * elsewhere if needed, our only purpose here is to extract the frame WCS. */ static CtranPtr wcs_update(XimDataPtr xim, FrameBufPtr fr) { CtranPtr ct = &fr->ctran; char buf[1024], *format; /* Get the new WCS. */ if (!ct->valid) { fr->label[0] = '\0'; ct->zt = W_UNITARY; /* Attempt to read the WCS and set up a unitary transformation * if the information cannot be read. */ if (sscanf (fr->wcsbuf, "%[^\n]\n%f%f%f%f%f%f%f%f%d", buf, &ct->a, &ct->b, &ct->c, &ct->d, &ct->tx, &ct->ty, &ct->z1, &ct->z2, &ct->zt) < 7) { if (fr->wcsbuf[0]) fprintf (stderr, "ximtool: error decoding WCS\n"); strncpy (ct->imtitle, "[NO WCS]\n", SZ_IMTITLE); ct->a = ct->d = 1; ct->b = ct->c = 0; ct->tx = ct->ty = 0; ct->zt = W_UNITARY; } else /*** waj ***/ xim_wcs(fr->frameno, ct->a, ct->b, ct->c, ct->d, ct->tx, ct->ty, ct->z1, ct->z2, ct->zt); /*** waj ***/ strncpy (ct->imtitle, buf, SZ_IMTITLE); ct->valid++; } /* Determine best format for wcs output. */ if (ct->valid && ct->zt == W_LINEAR) { float z1, z2, zrange; z1 = ct->z1; z2 = ct->z2; zrange = (z1 > z2) ? z1 - z2 : z2 - z1; if (zrange < 0.01 || (abs(z1) + abs(z2)) / 2.0 < 0.01) format = " %7.2f %7.2f %9.3g%c"; else if (zrange < 100.0 && (abs(z1) + abs(z2)) / 2.0 < 200.0) format = " %7.2f %7.2f %7.3f%c"; else if (zrange > 99999.0 || (abs(z1) + abs(z2)) / 2.0 > 99999.0) format = " %7.2f %7.2f %9.3g%c"; else format = W_DEFFORMAT; } else format = " %7.2f %7.2f %7.0f%c"; strcpy (ct->format, format); return (ct); } /* ADD_MAPPING -- Add a mapping for the current frame. * * File format (two lines): * * image title (imtool header label string)\n * a b c d tx ty z1 z2 zt \n * region_name sx sy snx sny dx dy dnx dny\n * object_ref * * The WCS text is passed in via the data stream as a write to the subunit * WCS and left in the buffer "wcsbuf". Mapping information is parsed * elsewhere if needed, our only purpose here is to extract the frame WCS. */ static void add_mapping (XimDataPtr xim, CtranPtr ctran, char* wcsbuf, FrameBufPtr fr) { MappingPtr mp = &fr->mapping[fr->nmaps]; CtranPtr ct = &mp->ctran; int i, j, frame = fr->frameno; char buf[SZ_WCSBUF]; /* Attempt to read the WCS and set up a unitary transformation * if the information cannot be read. */ if (sscanf (wcsbuf, "%[^\n]\n%f%f%f%f%f%f%f%f%d", buf, &ct->a, &ct->b, &ct->c, &ct->d, &ct->tx, &ct->ty, &ct->z1, &ct->z2, &ct->zt) < 7) { if (wcsbuf[0]) fprintf (stderr, "ximtool: error decoding WCS\n"); strncpy (ct->imtitle, "[NO WCS]\n", SZ_IMTITLE); ct->a = ct->d = 1; ct->b = ct->c = 0; ct->tx = ct->ty = 0; ct->zt = W_UNITARY; } else strncpy (ct->imtitle, buf, SZ_IMTITLE); ct->valid = 1; /* Skip over the first two lines of WCS data. */ strcpy (buf, wcsbuf); for (i=0, j=0; j < 2 && buf[i]; i++) if (buf[i] == '\n') j++; /* Attempt to read the mapping. */ mp->regid = (++objid[frame-1]) + (frame * 100); mp->id = mp->regid; mp->ref[0] = '\0'; mp->region[0] = '\0'; if (sscanf (&buf[i], "%s%f%f%d%d%d%d%d%d\n%s\n", mp->region, &mp->sx, &mp->sy, &mp->snx, &mp->sny, &mp->dx, &mp->dy, &mp->dnx, &mp->dny, mp->ref) < 10) { if (!wcsbuf[0]) fprintf (stderr, "ximtool: error decoding WCS mapping\n"); strncpy (mp->region, "none", SZ_IMTITLE); strncpy (mp->ref, "none", SZ_IMTITLE); mp->sx = 1.0; mp->sy = 1.0; mp->snx = xim->width; mp->sny = xim->height; mp->dx = 1; mp->dy = 1; mp->dnx = xim->width; mp->dny = xim->height; } memmove (ctran, &mp->ctran, sizeof (Ctran)); /* Tell the ISM to cache this mapping if we have an object ref. */ sprintf (buf, "cache %s %d", mp->ref, mp->id); ism_message (xim, "wcspix", buf); sprintf (buf, "wcslist %d", mp->id); ism_message (xim, "wcspix", buf); /* Send the object ref to the GUI. */ sprintf (buf, "cache %s %d %d", mp->ref, fr->frameno, mp->id); wcspix_message (xim, buf); sprintf (buf, "orient %d %d %d %d", mp->id, fr->frameno, (int)ctran->a, (int)(-1 * ctran->d)); wcspix_message (xim, buf); fr->nmaps++; /* Debug the mappings. */ if (getenv("DEBUG_MAPPINGS") != NULL) print_mappings (fr); } /* PRINT_MAPPINGS -- Debug routine to print all mappings on a frame. */ static void print_mappings(FrameBufPtr fr) { MappingPtr mp; int i; if (fr->nmaps == 0) printf ("No mappings for frame %d\n", fr->frameno); for (i=0; i < fr->nmaps; i++) { mp = &fr->mapping[i]; printf ("Mapping %d of %d: id=%d frame=%d:\n", i+1, fr->nmaps, mp->id, fr->frameno); printf ("\t%s %f %f %d %d %d %d %d %d\n\t%s\n", mp->region, mp->sx, mp->sy, mp->snx, mp->sny, mp->dx, mp->dy, mp->dnx, mp->dny, mp->ref); } } /* CHAN_READ -- Read exactly "n" bytes from a descriptor. */ static int chan_read(int fd, void* vptr, int nbytes) { char *ptr = vptr; int nread = 0, nleft = nbytes, nb = 0; while (nleft > 0) { if ( (nb = read(fd, ptr, nleft)) < 0) { if (errno == EINTR) nb = 0; /* and call read() again */ else return(-1); } else if (nb == 0) break; /* EOF */ nleft -= nb; ptr += nb; nread += nb; } return (nread); /* return no. of bytes read */ } /* CHAN_WRITE -- Write exactly "n" bytes to a descriptor. */ static int chan_write (int fd, void* vptr, int nbytes) { char *ptr = vptr; int nwritten = 0, nleft = nbytes, nb = 0; while (nleft > 0) { if ( (nb = write(fd, ptr, nleft)) <= 0) { if (errno == EINTR) nb = 0; /* and call write() again */ else return(-1); /* error */ } nleft -= nb; ptr += nb; nwritten += nb; } return (nwritten); } �����������������������������������������saods9/tcliis1.0/iis.h������������������������������������������������������������������������������000644 �000765 �000000 �00000000700 11107101056 015014� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __iis_h__ #define __iis_h__ #include "ximtool.h" int xim_iisOpen(XimDataPtr); void xim_iisClose(XimDataPtr); void xim_retCursorVal(XimDataPtr, float, float, int, int, int, char*); void xim_encodewcs(XimDataPtr, float, float, int, char*); void get_fbconfig(XimDataPtr); void bswap2 (char* a, char* b, int nbytes); void wcspix_message (XimDataPtr xim, char* message); void ism_message (XimDataPtr xim, char* object, char* command); #endif ����������������������������������������������������������������saods9/tcliis1.0/iistcl.C���������������������������������������������������������������������������000644 �000765 �000000 �00000025044 12547244460 015502� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2013 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <ctype.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> using namespace std; #include <tcl.h> #include "iistcl.h" extern "C" { #include "iis.h" #include "xim.h" int Tcliis_Init(Tcl_Interp* interp); int TcliisCmd(ClientData data, Tcl_Interp *interp, int argc, const char* argv[]); } IIS* iis=NULL; // Debug int IISDebug= 0; static char* dupstr(const char* str) { char* copy; if (str) { copy=new char[strlen(str)+1]; strcpy(copy,str); } else copy=NULL; return copy; } int Tcliis_Init(Tcl_Interp* interp) { if (IISDebug) cerr << "Iis_Init()" << endl; if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; Tcl_CreateCommand(interp, "iis", TcliisCmd, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) return TCL_ERROR; iis = new IIS(interp); if (iis) return TCL_OK; else return TCL_ERROR; } int TcliisCmd(ClientData data, Tcl_Interp *interp, int argc, const char* argv[]) { if (argc>=2) { if (!strncmp(argv[1], "open", 4)) return iis->open(argc, argv); else if (!strncmp(argv[1], "close", 4)) return iis->close(); else if (!strncmp(argv[1], "retcur", 4)) return iis->retcur(argc, argv); else if (!strncmp(argv[1], "debug", 4)) return iis->debug(argc, argv); else { Tcl_AppendResult(interp, "iis: unknown command: ", argv[1], NULL); return TCL_ERROR; } } else { Tcl_AppendResult(interp, "usage: iis ?open?close?retcur?", NULL); return TCL_ERROR; } } IIS::IIS(Tcl_Interp* intp) { interp = intp; { for (int i=0; i<MAXCHANNEL; i++) { chan[i] = NULL; func[i] = NULL; } } // Resources xim.def_config = 1; // default FB config xim.def_nframes = 0; // default number of frames xim.ncolors = DEF_NCOLORS; // number of image pixel colors xim.tileBorder = DEF_TILE_BORDER; // image border when tiling frames xim.borderColor = dupstr(DEF_BORDER_COLOR); // border color for tileFrames xim.autoscale = 0; // is XY autoscaling enabled xim.antialias = 0; // apply antialiasing when dezooming xim.antialiasType = (char*)DEF_ANTIALIASTYPE; // type of antialiasing xim.invert = 0; // use inverted colormap xim.tileFrames = 0; // tile rather than overlay frames xim.highlightFrames = 0; // highlight tiled frames xim.gui = dupstr("default"); // GUI file name // xim.imtoolrc = dupstr(FBCONFIG_2); // imtoolrc file name xim.memModel = dupstr("fast"); // *FB memory model xim.userCMap1 = dupstr("none"); // user colormap file xim.userCMap2 = dupstr("none"); // user colormap file xim.userCMapDir1 = dupstr("none"); // user colormap directory xim.userCMapDir2 = dupstr(CMAPCONFIG); // user colormap directory xim.printConfig = dupstr(PRINTCONFIG); // printer configuration file xim.input_fifo = dupstr(O_DEVNAME); // *client's output, e.g. /dev/imt1o xim.output_fifo = dupstr(I_DEVNAME); // *client's input, e.g. /dev/imt1i xim.unixaddr = dupstr(DEF_UNIXADDR); // *format for unix socket path xim.ism_addr = dupstr("none"); xim.port = DEF_PORT; // *port for INET socket xim.ism_task = dupstr(DEF_ISM_TASK); // items that require 'c' style memory allocation xim.imtoolrc = (char *) calloc(strlen(FBCONFIG_2)+1, sizeof(char)); strncpy (xim.imtoolrc, FBCONFIG_2, strlen(FBCONFIG_2)); /* Internal state. */ xim.obm = NULL; // object manager { for (int i=0; i<MAX_CLIENTS; i++) { xim.chan[i].xim = NULL; // backpointer to xim descriptor xim.chan[i].id = 0; // input callback id xim.chan[i].type = 0; // channel type xim.chan[i].datain = 0; // input channel xim.chan[i].dataout = 0; // output channel xim.chan[i].keepalive = 0; // used to keep input fifo ready xim.chan[i].path[0] = '\0'; // for unix sockets xim.chan[i].reference_frame = 0;// reference (cmd i/o) frame xim.chan[i].rf_p = NULL; // reference frame descriptor } } xim.cursor_chan = NULL; // *cursor mode channel { xim.ism_chan.xim = (XtPointer)NULL; xim.ism_chan.id = 0; xim.ism_chan.datain = 0; xim.ism_chan.dataout = 0; xim.ism_chan.connected = 0; xim.ism_chan.name[0] = '\0'; xim.ism_chan.path[0] = '\0'; xim.ism_chan.msgbuf[0] = '\0'; } { for (int i=0; i<MAX_ISM; i++) { xim.ism_client[i].xim = (XtPointer)NULL; xim.ism_client[i].id = 0; xim.ism_client[i].datain = 0; xim.ism_client[i].dataout = 0; xim.ism_client[i].connected = 0; xim.ism_client[i].name[0] = '\0'; xim.ism_client[i].path[0] = '\0'; xim.ism_client[i].msgbuf[0] = '\0'; } } xim.toplevel = NULL; // dummy toplevel app shell xim.gt = NULL; // *imagewin gterm-image widget xim.cb = NULL; // colorbar gterm-image widget xim.gm_border = NULL; // border marker for tileFrames xim.tileFramesList = 0; // frames to be tiled (bitmask) xim.nTileFrames = 0; // number of frames to be tiled xim.tileRows = 1; xim.tileCols = 1; xim.tileByRows = 1; xim.tileTopDown = 1; xim.tileLabels = 0; xim.rop = 0; // rasterop for mappings xim.display_frame = 0; // currently displayed frame xim.df_p = NULL; // *display frame descriptor { for (int i=0; i<MAX_FRAMES; i++) { xim.frames[i].frameno = 0; xim.frames[i].raster = 0; xim.frames[i].zoomras = 0; xim.frames[i].zoommap = 0; xim.frames[i].dispmap = 0; xim.frames[i].colormap = DEF_COLORMAP; xim.frames[i].offset = 0.5; xim.frames[i].scale = 1.0; xim.frames[i].xscale = xim.frames[i].yscale = 1.0; xim.frames[i].xmag = xim.frames[i].ymag = 1.0; xim.frames[i].xcen = xim.frames[i].ycen = 0.0; xim.frames[i].xoff = xim.frames[i].yoff = 0.0; xim.frames[i].xflip = xim.frames[i].yflip = 0; xim.frames[i].label[0] = '\0'; xim.frames[i].ctran.valid = 0; xim.frames[i].ctran.a = xim.frames[i].ctran.b = 0; xim.frames[i].ctran.c = xim.frames[i].ctran.d = 0; xim.frames[i].ctran.tx = xim.frames[i].ctran.ty = 0; xim.frames[i].ctran.z1 = xim.frames[i].ctran.z2 = 0; xim.frames[i].ctran.zt = 0; xim.frames[i].ctran.format[0] = '\0'; xim.frames[i].ctran.imtitle[0] = '\0'; xim.frames[i].wcsbuf[0] = '\0'; xim.frames[i].nmaps = 0; } } xim.fb_configno = 0; // *current config number xim.nframes = 0; // *current number of frame bufs xim.width = 0; xim.height = 0; // *current width, height //xim.fb_config[MAX_FBCONFIG]; // *fb config table xim.clientPrivate = NULL; // used by imtool client code xim.psim = NULL; // EPS image struct pointer xim.pcp = NULL; // printer config pointer xim.flp = NULL; // load disk file pointer xim.fsp = NULL; // save disk file pointer } IIS::~IIS() { if (xim.borderColor) delete [] xim.borderColor; if (xim.gui) delete [] xim.gui; // if (xim.imtoolrc) // delete xim.imtoolrc; if (xim.memModel) delete [] xim.memModel; if (xim.userCMap1) delete [] xim.userCMap1; if (xim.userCMap2) delete [] xim.userCMap2; if (xim.userCMapDir1) delete [] xim.userCMapDir1; if (xim.userCMapDir2) delete [] xim.userCMapDir2; if (xim.antialiasType) delete xim.antialiasType; if (xim.printConfig) delete [] xim.printConfig; if (xim.input_fifo) delete [] xim.input_fifo; if (xim.output_fifo) delete [] xim.output_fifo; if (xim.unixaddr) delete [] xim.unixaddr; if (xim.ism_addr) delete [] xim.ism_addr; if (xim.ism_task) delete [] xim.ism_task; // items that require 'c' style memory allocation if (xim.imtoolrc) free(xim.imtoolrc); } void IIS::eval(char* cmd) { if (Tcl_Eval(interp, cmd) == TCL_ERROR) cerr << Tcl_GetStringResult(interp) << endl; } const char *IIS::evalstr(char* cmd) { if (Tcl_Eval(interp, cmd) == TCL_ERROR) cerr << Tcl_GetStringResult(interp) << endl; return Tcl_GetStringResult(interp); } const char *IIS::result() { return Tcl_GetStringResult(interp); } int IIS::open(int argc, const char* argv[]) { if (IISDebug) cerr << "IIS:open()" << endl; if (argc==6) { delete [] xim.input_fifo; xim.input_fifo = dupstr(argv[2]); // *client's output, e.g. /dev/imt1i delete [] xim.output_fifo; xim.output_fifo = dupstr(argv[3]); // *client's input, e.g. /dev/imt1o string x(argv[4]); istringstream str(x); str >> xim.port; // *port for INET socket delete [] xim.unixaddr; xim.unixaddr = dupstr(argv[5]); // *format for unix socket path } xim_initialize(&xim, xim.def_config, xim.def_nframes, 1); xim_iisOpen(&xim); return TCL_OK; } int IIS::close() { if (IISDebug) cerr << "IIS::close()" << endl; xim_iisClose(&xim); return TCL_OK; } int IIS::retcur(int argc, const char* argv[]) { if (IISDebug) cerr << "IIS::retcur()" << endl; if (argc==6) { if (xim.cursor_chan == NULL) { Tcl_AppendResult(interp, "iis retcur: no cursor channel", NULL); return TCL_ERROR; } float xx,yy; { string x(argv[2]); istringstream str(x); str >> xx; } { string x(argv[3]); istringstream str(x); str >> yy; } int key = argv[4][0]; int frame; { string x(argv[5]); istringstream str(x); str >> frame; } xim_retCursorVal(&xim, xx, yy, frame, 0, key, (char*)""); return TCL_OK; } else { Tcl_AppendResult(interp, "iis retcur: wrong number of args", NULL); return TCL_ERROR; } } int IIS::encodewcs(int argc, const char* argv[]) { if (IISDebug) cerr << "IIS::encodewcs()" << endl; if (argc==4 || argc==5) { float sx,sy; { string x(argv[2]); istringstream str(x); str >> sx; } { string x(argv[3]); istringstream str(x); str >> sy; } int sz = 0; { string x(argv[4]); istringstream str(x); str >> sz; } char buf[SZ_LINE]; xim_encodewcs(&xim, sx, sy, sz, buf); Tcl_SetResult (interp, buf, TCL_VOLATILE); return TCL_OK; } else { Tcl_AppendResult(interp, "iis encodewcs: wrong number of args", NULL); return TCL_ERROR; } } int IIS::debug(int argc, const char* argv[]) { IISDebug = !strncmp(argv[2],"1",1); return TCL_OK; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/iistcl.h���������������������������������������������������������������������������000644 �000765 �000000 �00000001341 12233512450 015526� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2013 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #ifndef __iistcl_h__ #define __iistcl_h__ extern "C" { #include "ximtool.h" } extern int IISDebug; #define MAXCHANNEL 40 class IIS { private: Tcl_Interp* interp; public: XimData xim; IoChan* chan[MAXCHANNEL]; void (*func[MAXCHANNEL])(IoChan*, int*, void*); public: IIS(Tcl_Interp*); ~IIS(); void eval(char*); const char* evalstr(char*); const char* result(); int open(int, const char*[]); int close(); int retcur(int, const char*[]); int encodewcs(int, const char*[]); int debug(int, const char*[]); }; extern IIS* iis; #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/Makefile.in������������������������������������������������������������������������000755 �000765 �000000 �00000040251 12562731155 016153� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL_OPTIONS = INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS} INSTALL_DATA_DIR = ${INSTALL} -d -m 755 INSTALL_PROGRAM = ${INSTALL} -m 555 INSTALL_DATA = ${INSTALL} -m 444 INSTALL_SCRIPT = ${INSTALL_PROGRAM} INSTALL_LIBRARY = ${INSTALL} -m 644 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ #TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ #TK_BIN_DIR = @TK_BIN_DIR@ #TK_SRC_DIR = @TK_SRC_DIR@ # Not used, but retained for reference of what libs Tcl required #TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) #EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) TCLLIBPATH = $(top_builddir) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(TCLLIBPATH)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG) #WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` #WISH_PROG = @WISH_PROG@ #WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG) SHARED_BUILD = @SHARED_BUILD@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ #INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) DEFS = @DEFS@ $(PKG_CFLAGS) # Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl CLEANFILES = @CLEANFILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) .SUFFIXES: .c .C .$(OBJEXT) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target includes executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries #doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) libraries: #======================================================================== # Your doc target should differentiate from doc builds (by the developer) # and doc installs (see install-doc), which just install the docs on the # end user machine when building from source. #======================================================================== doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries #install-doc install-binaries: binaries install-lib-binaries install-bin-binaries #======================================================================== # This rule installs platform-independent files, such as header files. # The list=...; for p in $$list handles the empty list case x-platform. #======================================================================== install-libraries: libraries @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @list='$(PKG_HEADERS)'; for i in $$list; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann @echo "Installing documentation in $(DESTDIR)$(mandir)" @list='$(srcdir)/doc/*.n'; for i in $$list; do \ echo "Installing $$i"; \ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]" shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \ --leak-check=yes --show-reachable=yes -v valgrind: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) valgrindshell: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ .C.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean $(INSTALL_DATA_DIR) $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in for i in $(srcdir)/*.[ch]; do \ if [ -f $$i ]; then \ cp -p $$i $(DIST_DIR)/ ; \ fi; \ done; $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done @if test "x$(SHARED_BUILD)" = "x1"; then \ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # 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: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/pkgIndex.tcl.in��������������������������������������������������������������������000755 �000765 �000000 �00000000220 12535332216 016753� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Tcl package index file # package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/tclconfig/�������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602232 016042� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/util.c�����������������������������������������������������������������������������000644 �000765 �000000 �00000016533 12257374202 015227� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include "iis.h" #include "xim.h" /* Definitions for the supported ISM Modules. */ int ism_nmodules = 0; ismModule ism_modules[] = { {"wcspix", "", NULL, NULL, NULL, 0}, }; /* BSWAP2 - Move bytes from array "a" to array "b", swapping successive * pairs of bytes. The two arrays may be the same but may not be offset * and overlapping. */ void bswap2 (char* a, char* b, int nbytes) { register char *ip=a, *op=b, *otop; register unsigned temp; /* Swap successive pairs of bytes. */ for (otop = op + (nbytes & ~1); op < otop; ) { temp = *ip++; *op++ = *ip++; *op++ = temp; } /* If there is an odd byte left, move it to the output array. */ if (nbytes & 1) *op = *ip; } /* GET_FBCONFIG -- Read the XIMTOOL startup file to get the set of possible * frame buffer sizes. * * File format: configno nframes width height [extra fields] * e.g., 1 2 512 512 * 2 2 800 800 * 3 1 1024 1024 # comment */ void get_fbconfig (register XimDataPtr xim) { register char *ip; register FILE *fp = NULL; int config, nframes, width, height, i; char lbuf[SZ_LINE+1], *fname; static char *fb_paths[] = { "/usr/local/lib/imtoolrc", "/opt/local/lib/imtoolrc", "/iraf/iraf/dev/imtoolrc", "/local/lib/imtoolrc", "/usr/iraf/dev/imtoolrc", "/usr/local/iraf/dev/imtoolrc", NULL}; /* Initialize the config table. */ xim->fb_configno = 1; for (i=0; i < MAX_FBCONFIG; i++) { xim->fb_config[i].nframes = 1; xim->fb_config[i].width = DEF_FRAME_WIDTH; xim->fb_config[i].height = DEF_FRAME_HEIGHT; } /* Now add in some defaults for commonly used sizes based on the * standard IRAF imtoolrc file, we'll avoid any instrument specific * configurations. */ xim->fb_config[0].width = xim->fb_config[0].height = 512; xim->fb_config[1].width = xim->fb_config[1].height = 800; xim->fb_config[2].width = xim->fb_config[2].height = 1024; xim->fb_config[3].width = xim->fb_config[3].height = 1600; xim->fb_config[4].width = xim->fb_config[4].height = 2048; xim->fb_config[5].width = xim->fb_config[5].height = 4096; /* Attempt to open the config file. */ if ((fname=getenv(FBCONFIG_ENV1)) || (fname=getenv(FBCONFIG_ENV2))) fp = fopen (fname, "r"); if (!fp && (fname = getenv ("HOME"))) { sprintf (lbuf, "%s/%s", fname, FBCONFIG_1); fp = fopen (fname = lbuf, "r"); if (fp) { if (xim->imtoolrc) free(xim->imtoolrc); xim->imtoolrc = (char *) calloc (SZ_LINE, sizeof(char)); strncpy (xim->imtoolrc, fname, strlen(fname)); } } if (!fp) fp = fopen (fname = xim->imtoolrc, "r"); for (i=0; !fp && fb_paths[i]; i++) { if ((fp = fopen (fname = fb_paths[i], "r"))) { if (xim->imtoolrc) free(xim->imtoolrc); xim->imtoolrc = calloc(strlen(fb_paths[i])+1,sizeof(char)); strncpy (xim->imtoolrc, fb_paths[i],strlen(fb_paths[i])); break; } } if (!fp) { default_imtoolrc(xim); return; } /* Scan the frame buffer configuration file. */ while (fgets (lbuf, SZ_LINE, fp) != NULL) { /* Skip comment lines and blank lines. */ for (ip=lbuf; *ip == ' ' || *ip == '\t'; ip++) ; if (*ip == '\n' || *ip == '#') continue; if (!isdigit (*ip)) continue; switch (sscanf (ip, "%d%d%d%d", &config,&nframes,&width,&height)) { case 4: break; /* normal case */ case 3: height = width; /* default to square format */ break; default: fprintf (stderr, "ximtool: bad config `%s'\n", ip); continue; } nframes = max (1, nframes); width = max (1, width); height = max (1, height); /* Since the frame buffer is stored in a memory pixrect * (effectively), the line length should be an integral number * of 16 bit words. */ if (width & 1) { fprintf (stderr, "imtool warning: fb config %d [%d-%dx%d] - ", config, nframes, width, height); fprintf (stderr, "frame width should be even, reset to %d\n", --width); } config = max(1, min(MAX_FBCONFIG, config)) - 1; xim->fb_config[config].nframes = nframes; xim->fb_config[config].width = width; xim->fb_config[config].height = height; } if (fp) fclose (fp); } /* * Default imtoolrc file-- if a valid imtoolrc file can not be found, * then fill out a default fb_config */ void default_imtoolrc(XimDataPtr xim) { /* 1 2 512 512 # imt1|imt512 */ xim->fb_config[0].nframes = 2; xim->fb_config[0].width = 512; xim->fb_config[0].height = 512; /* 2 2 800 800 # imt2|imt800 */ xim->fb_config[1].nframes = 2; xim->fb_config[1].width = 800; xim->fb_config[1].height = 800; /* 3 2 1024 1024 # imt3|imt1024 */ xim->fb_config[2].nframes = 2; xim->fb_config[2].width = 1024; xim->fb_config[2].height = 1024; /* 4 1 1600 1600 # imt4|imt1600 */ xim->fb_config[3].nframes = 1; xim->fb_config[3].width = 1600; xim->fb_config[3].height = 1600; /* 5 1 2048 2048 # imt5|imt2048 */ xim->fb_config[4].nframes = 1; xim->fb_config[4].width = 2048; xim->fb_config[4].height = 2048; /* 6 1 4096 4096 # imt6|imt4096 */ xim->fb_config[5].nframes = 1; xim->fb_config[5].width = 4096; xim->fb_config[5].height = 4096; /* 7 1 8192 8192 # imt7|imt8192 */ xim->fb_config[6].nframes = 1; xim->fb_config[6].width = 8192; xim->fb_config[6].height = 8192; /* 8 1 1024 4096 # imt8|imt1x4 */ xim->fb_config[7].nframes = 1; xim->fb_config[7].width = 1024; xim->fb_config[7].height = 4096; /* 9 2 1144 880 # imt9|imtfs full screen (1152x900 minus frame) */ xim->fb_config[8].nframes = 2; xim->fb_config[8].width = 1144; xim->fb_config[8].height = 880; /* 10 2 1144 764 # imt10|imtfs35 full screen at 35mm film aspect */ xim->fb_config[9].nframes = 2; xim->fb_config[9].width = 1144; xim->fb_config[9].height = 764; /* 11 2 128 128 # imt11|imt128 */ xim->fb_config[10].nframes = 2; xim->fb_config[10].width = 128; xim->fb_config[10].height = 128; /* 12 2 256 256 # imt12|imt256 */ xim->fb_config[11].nframes = 2; xim->fb_config[11].width = 256; xim->fb_config[11].height = 256; /* 13 2 128 1056 # imt13|imttall128 tall & narrow for spectro. */ xim->fb_config[12].nframes = 2; xim->fb_config[12].width = 128; xim->fb_config[12].height = 1056; /* 14 2 256 1056 # imt14|imttall256 tall & wider for spectro. */ xim->fb_config[13].nframes = 2; xim->fb_config[13].width = 256; xim->fb_config[13].height = 1056; /* 15 2 1056 128 # imt15|imtwide128 wide & thin for spectro. */ xim->fb_config[14].nframes = 2; xim->fb_config[14].width = 1056; xim->fb_config[14].height = 128; /* 16 2 1056 256 # imt16|imtwide256 wide & fatter for spectro. */ xim->fb_config[15].nframes = 2; xim->fb_config[15].width = 1056; xim->fb_config[15].height = 256; /* 17 2 1008 648 # imt17|imtssy Solitaire fmt w/ imtool border */ xim->fb_config[16].nframes = 2; xim->fb_config[16].width = 1008; xim->fb_config[16].height = 648; /* 18 2 1024 680 # imt18|imtssn Solitaire fmt w/out imtool border */ xim->fb_config[17].nframes = 2; xim->fb_config[17].width = 1024; xim->fb_config[17].height = 680; /* 19 1 4096 1024 # imt19|imt4x1 */ xim->fb_config[18].nframes = 1; xim->fb_config[18].width = 4096; xim->fb_config[18].height = 1024; } void wcspix_message (XimDataPtr xim, char* message) {} void ism_message (XimDataPtr xim, char* object, char* command) {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/xim.C������������������������������������������������������������������������������000644 �000765 �000000 �00000016216 12547303724 015010� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2013 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <string.h> #include <sys/time.h> #include <iostream> #include <sstream> using namespace std; #include <tcl.h> #ifdef __WIN32__ #include <Winsock2.h> #endif #include "iistcl.h" extern "C" { #include "iis.h" #include "xim.h" void iisIO(ClientData data, int mask) { int fd = (long)data; if (IISDebug) cerr << "iisIO() " << fd << ' ' << mask << endl; if ((fd < MAXCHANNEL) && iis->func[fd]) { (*iis->func[fd])(iis->chan[fd], &fd, NULL); } else cerr << "Error: IIS iisIO problems" << endl; } } // extern 'C' int xim_addInput(XimDataPtr xim, int fd, void (*func)(IoChan*, int*, void*), IoChanPtr chan) { if (IISDebug) cerr << "xim_addInput() " << fd << ' ' << func << ' ' << chan << endl; iis->func[fd] = func; iis->chan[fd] = chan; #ifndef __WIN32__ Tcl_CreateFileHandler(fd, TCL_READABLE, (void (*)(ClientData,int))iisIO, (ClientData)long(fd)); #else Tcl_CreateEventSource(setupProc, checkProc, (ClientData)long(fd)); #endif return fd; } #ifdef __WIN32__ void setupProc(void* fd, int flags) { Tcl_Time blockTime = {0,1000}; Tcl_SetMaxBlockTime(&blockTime); return; } void checkProc(void* fdd, int flags) { int fd = (int)fdd; fd_set readfds; struct timeval tv = {0,0}; FD_ZERO(&readfds); FD_SET(fd, &readfds); int got = select(fd+1, &readfds, NULL, NULL, &tv); if (got<0) Tcl_DeleteEventSource(setupProc, checkProc, fdd); else if (got>0) iisIO(fdd,0); } #endif void xim_removeInput(XimDataPtr xim, int fd) { if (IISDebug) cerr << "xim_removeInput() " << fd << endl; if (fd < MAXCHANNEL) { iis->func[fd] = NULL; iis->chan[fd] = NULL; #ifndef __WIN32__ Tcl_DeleteFileHandler(fd); #endif } else cerr << "Error: IIS xim_removeInput-- bad fd" << endl; } void xim_initialize(XimDataPtr xim, int config, int nframes, int hardreset) { // from ximtool xim_initialize get_fbconfig(xim); xim->fb_configno = config; xim->df_p = &xim->frames[0]; FbConfigPtr cf = &xim->fb_config[config-1]; xim->width = cf->width; xim->height = cf->height; ostringstream str; str << "IISInitializeCmd " << xim->width << ' ' << xim->height << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "IISInitializeCmd " << xim->width << ' ' << xim->height << endl; } void xim_initFrame(XimDataPtr xim, int frame, int nframes, FbConfig* config, char* memModel) { // from ximtool xim_initFrame FrameBufPtr fb = &xim->frames[frame-1]; fb->frameno = frame; fb->raster = frame; fb->zoomras = 0; fb->zoommap = 0; fb->dispmap = 0; fb->colormap = DEF_COLORMAP; fb->offset = 0.5; fb->scale = 1.0; fb->xscale = fb->yscale = 1.0; fb->xmag = fb->ymag = 1.0; fb->xcen = fb->ycen = 0.0; fb->xoff = fb->yoff = 0.0; fb->xflip = fb->yflip = 0; fb->label[0] = '\0'; fb->wcsbuf[0] = '\0'; fb->nmaps = 0; // my stuff ostringstream str; str << "IISInitFrameCmd " << frame << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_initFrame() " << str.str().c_str() << endl; } void xim_setDisplayFrame(XimDataPtr xim, int frame) { // from imtool xim_setDisplayFrame FbConfig* config = &xim->fb_config[xim->fb_configno-1]; xim->df_p = &xim->frames[frame-1]; xim->width = config->width; xim->height = config->height; // and my stuff ostringstream str; str << "IISSetDisplayFrameCmd " << frame << ' ' << config->width << ' ' << config->height << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) { cerr << "xim_setDisplayFrame() " << str.str().c_str() << endl; } } void xim_setReferenceFrame(IoChanPtr chan, int frame) { // from imtool xim_setDisplayFrame // Ignore request if channel not active. if (!chan->type) return; XimDataPtr xim = (XimDataPtr)chan->xim; int frameno = max(1, min(MAX_FRAMES, frame)); FrameBufPtr fb = &xim->frames[frameno-1]; // Ignore request if not a valid frame. // // All frames are valid, ds9 frames now work with iis. // // if (fb->frameno > 0) { chan->reference_frame = frameno; chan->rf_p = fb; // } ostringstream str; str << "IISSetRefFrameCmd " << frame << ends; const char *wcs = iis->evalstr((char*)str.str().c_str()); if (IISDebug) { if (*wcs) cerr << "xim_setReferenceFrame() " << str.str().c_str() << " " << wcs << endl; else cerr << "xim_setReferenceFrame() " << str.str().c_str() << endl; } if (*wcs) strcpy(fb->wcsbuf, wcs); } void xim_eraseFrame(XimDataPtr xim, int frame) { ostringstream str; str << "IISEraseFrameCmd " << frame << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_eraseFrame() " << str.str().c_str() << endl; } void xim_message(XimDataPtr xim, char* message, char* imtitle) { ostringstream str; str << "IISMessageCmd {" << message << ' ' << imtitle << '}' << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_message() " << str.str().c_str() << endl; } void xim_wcs(int frame, float a, float b, float c, float d, float tx, float ty, float z1, float z2, int zt) { ostringstream str; str << "IISWCSCmd " << frame << ' ' << a << ' ' << b << ' ' << c << ' ' << d << ' ' << tx << ' ' << ty << ' ' << z1 << ' ' << z2 << ' ' << zt << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_wcs() " << frame << ' ' << a << ' ' << b << ' ' << c << ' ' << d << ' ' << tx << ' ' << ty << ' ' << z1 << ' ' << z2 << ' ' << zt << endl; } void GtWritePixels(void* gt, int frame, void* pixels, int bits, int xx, int yy, int dx, int dy) { ostringstream str; str << "IISWritePixelsCmd " << frame << ' ' << pixels << ' ' << xx << ' ' << yy << ' ' << dx << ' ' << dy << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "GtWritePixels() " << str.str().c_str() << endl; } void GtReadPixels(void* gt, int frame, void* pixels, int nbits, int xx, int yy, int dx, int dy) { ostringstream str; str << "IISReadPixelsCmd " << frame << ' ' << pixels << ' ' << xx << ' ' << yy << ' ' << dx << ' ' << dy << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "GtReadPixels() " << str.str().c_str() << endl; } void xim_cursorMode(XimDataPtr xim, int state) { ostringstream str; str << "IISCursorModeCmd " << state << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_cursorMode() " << state << endl; } void xim_getCursorPos(XimDataPtr xim, float* xx, float* yy, int* raster, int* frame) { { ostringstream str; str << "IISGetCursorPosCmd " << ends; iis->eval((char*)str.str().c_str()); } if (IISDebug) cerr << "xim_getCursorPos()" << endl; { string x(iis->result()); istringstream str(x); str >> *xx >> *yy >> *frame; *raster = *frame; } } void xim_setCursorPos(XimDataPtr xim, int xx, int yy) { ostringstream str; str << "IISSetCursorPosCmd " << xx << ' ' << yy << ends; iis->eval((char*)str.str().c_str()); if (IISDebug) cerr << "xim_setCursorPos()" << endl; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/xim.h������������������������������������������������������������������������������000644 �000765 �000000 �00000001737 07307475503 015062� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __xim_h__ #define __xim_h__ #include "ximtool.h" void xim_initialize(XimDataPtr, int, int, int); void GtQueryColormap(void*, int, int*, int*, int*); void GtReadPixels(void*, int, void*, int, int, int, int, int); void GtWritePixels(void*, int, void*, int, int, int, int, int); void xim_cursorMode(XimDataPtr, int); void xim_getCursorPos(XimDataPtr, float*, float*, int*, int*); void xim_setReferenceFrame(IoChanPtr, int); void xim_setDisplayFrame(XimDataPtr, int); void xim_removeInput(XimDataPtr, int); void xim_message(XimDataPtr, char*, char*); void xim_initFrame(XimDataPtr, int, int, FbConfig*, char*); void xim_setCursorPos(XimDataPtr, int, int); void xim_eraseFrame(XimDataPtr, int); int xim_addInput(XimDataPtr, int, void (*func)(IoChan*, int*, void*), IoChan*); void xim_wcs(int, float, float, float, float, float, float, float, float, int); #ifdef __WIN32__ void setupProc(void*, int); void checkProc(void*, int); #endif void default_imtoolrc (XimDataPtr xim); #endif ���������������������������������saods9/tcliis1.0/ximtool.h��������������������������������������������������������������������������000644 �000765 �000000 �00000027352 12260620651 015747� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __ximtool_h__ #define __ximtool_h__ #define XtPointer void * #define Boolean int #define String char * #define Widget void * #define PSImagePtr void * /* Default values, size limiting values. */ #define MAX_FBCONFIG 128 /* max possible frame buf sizes */ #define MAX_FRAMES 16 /* max number of frames */ #define MAX_MAPPINGS 100 /* max number of mappings/frame */ #define MAX_CLIENTS 8 /* max display server clients */ #define MAX_ISM 8 /* max ISM module clients */ #define MAX_COLORMAPS 256 /* max number of colormaps */ #define MAX_COLORS 256 /* max size colormap */ #define MAX_PRINTERS 128 /* max number of printers */ #define FIRST_COLOR 10 /* first allocatable color */ #define DEF_NCOLORS 201 /* default number of colors */ #define DEF_COLORMAP 1 /* default colormap */ #define DEF_NFRAMES 1 /* save memory; only one frame */ #define DEF_FRAME_WIDTH 512 /* 512 square frame */ #define DEF_FRAME_HEIGHT 512 /* 512 square frame */ #define DEF_FRAME_DEPTH 8 /* 8 bits deep */ #define DEF_WIN_WIDTH 512 /* default size window */ #define DEF_WIN_HEIGHT 512 /* default size window */ #define DEF_TILE_BORDER 3 /* border width for tileFrames */ #define DEF_BORDER_COLOR "9" /* border highlight color */ #define SZ_CMAPNAME 32 /* colormap name buffer */ #define SZ_NAME 80 /* object name buffer */ #define SZ_LABEL 256 /* main frame label string */ #define SZ_IMTITLE 128 /* image title string */ #define SZ_WCTEXT 80 /* WCS box text */ #define SZ_OLD_WCSBUF 320 /* old WCS text buffer size */ #define SZ_WCSBUF 1024 /* WCS text buffer size */ #define SZ_MSGBUF 8192 /* message buffer size */ #define SZ_COLORBAR 11 /* height of colorbar in pixels */ #define SZ_FIFOBUF 4000 /* transfer size for FIFO i/o */ #define SZ_FNAME 256 #define SZ_LINE 256 #define ERR (-1) #define OK 0 #define EOS '\0' #define M_UNITARY 0 /* xim_setmapping */ #define M_ASPECT 1 #define M_FILL 2 /* Magic numbers. */ #define DEF_PORT 5137 /* default tcp/ip socket */ #define I_DEVNAME "/dev/imt1o" /* pseudo device names */ #define O_DEVNAME "/dev/imt1i" /* our IN is client's OUT */ #define DEF_UNIXADDR "/tmp/.IMT%d" /* default unix socket */ #define DEF_ANTIALIASTYPE "boxcar" /* default antialiasing */ #define FBCONFIG_1 ".imtoolrc" #define FBCONFIG_2 "/usr/local/lib/imtoolrc" #define CMAPCONFIG "/usr/local/lib/imtoolcmap" #define FBCONFIG_ENV1 "imtoolrc" #define FBCONFIG_ENV2 "IMTOOLRC" #define PRINTCONFIG "/usr/local/lib/ximprint.cfg" #define DEF_ISM_ADDR "/tmp/.ISM%d" /* default ISM unix socket */ #define DEF_ISM_TEMPLATE "/tmp/.ISM%d_%d" /* ISM client socket template */ #define DEF_ISM_TASK "wcspix" #define DEF_ISM_CMD "ism_wcspix.e wcspix &" #define SZ_ISMBUF 4096 /* WCS definitions. */ #define W_UNITARY 0 #define W_LINEAR 1 #define W_LOG 2 #define W_USER 3 #define W_DEFFORMAT " %7.2f %7.2f %7.1f%c" /* Rotation matrix defining world coordinate system (WCS) of a frame. */ typedef struct { int valid; /* has WCS been set? */ float a, b; /* x, y scale factors */ float c, d; /* x, y cross factors */ float tx, ty; /* x, y translation */ float z1, z2; /* greyscale range */ int zt; /* greyscale mapping */ char format[32]; /* wcs output format */ char imtitle[SZ_IMTITLE+1]; /* image title from WCS */ } Ctran, *CtranPtr; /* Coordinate mappings on each frame buffer. */ typedef struct { int id; /* object id */ Ctran ctran; /* world coordinate system */ char ref[SZ_FNAME+1]; /* image reference from WCS */ int regid; /* region id */ char region[SZ_FNAME+1]; /* region name from WCS */ float sx, sy; /* source rect */ int snx, sny; int dx, dy; /* destination rect */ int dnx, dny; } Mapping, *MappingPtr; /* The frame buffers. */ typedef struct { int frameno; /* frame number */ int raster; /* frame buffer raster */ int zoomras; /* zoom/pan raster */ int zoommap; /* zoom/pan mapping */ int dispmap; /* mapping used for display */ int colormap; /* greyscale transformation */ float offset, scale; /* transfer function */ float xscale, yscale; /* scaling at [xy]mag==1.0 */ float xmag, ymag; /* zoom/dezoom factors */ float xcen, ycen; /* center of zoomed region */ float xoff, yoff; /* offset of zoomed region */ int xflip, yflip; /* flip in X or Y? */ char label[SZ_LABEL+1]; /* frame label string */ Ctran ctran; /* world coordinate system */ char wcsbuf[SZ_WCSBUF]; /* wcs info string */ Mapping mapping[MAX_MAPPINGS]; /* coordinate mappings */ int nmaps; /* number of defined mappings */ } FrameBuf, *FrameBufPtr; /* Possible frame buffer sizes. */ typedef struct { int nframes; /* number of frames */ int width; /* frame buffer width */ int height; /* frame buffer height */ } FbConfig, *FbConfigPtr; /* Predefined colormaps. */ typedef struct { int mapno; /* widget colormap number */ char name[SZ_CMAPNAME+1]; /* colormap name */ } ColorMap, *ColorMapPtr; /* Predefined lookup tables. */ typedef struct { float red, green, blue; } Triplet, *TripletPtr; typedef struct { int lutlen; Triplet hue[MAX_COLORS]; } Lut, *LutPtr; /* Client IIS I/O channel. */ typedef struct { XtPointer xim; /* backpointer to xim descriptor */ int id; /* input callback id */ int type; /* channel type */ int datain; /* input channel */ int dataout; /* output channel */ int keepalive; /* used to keep input fifo ready */ char path[SZ_FNAME+1]; /* for unix sockets */ int reference_frame; /* reference (cmd i/o) frame */ int version; /* flags capability of client */ FrameBufPtr rf_p; /* reference frame descriptor */ } IoChan, *IoChanPtr; #define IO_FIFO 1 #define IO_INET 2 #define IO_UNIX 3 /* Client ISM I/O channel. */ typedef struct { XtPointer xim; /* backpointer to xim descriptor */ XtPointer id; /* input callback id */ int datain; /* input channel */ int dataout; /* output channel */ int connected; /* client connected? */ char name[SZ_FNAME+1]; /* client name */ char path[SZ_FNAME+1]; /* for unix sockets */ char msgbuf[SZ_ISMBUF+1]; /* incomplete message buffer */ } IsmIoChan, *IsmIoChanPtr; /* Definitions for the supported ISM Modules. */ typedef void (*IsmFunc)(); typedef struct { char name[SZ_FNAME]; /* name of the module */ char command[SZ_LINE]; /* cmd to execute for module */ IsmFunc startupCB; /* connection callback func */ IsmFunc shutdownCB; /* shutdown callback func */ IsmFunc commandCB; /* client command callback func */ int connected; /* client is connected */ int ref_count; /* reference count */ IsmIoChanPtr chan; /* i/o channel */ } ismModule, *IsmModule; /* Printer list. */ typedef struct { char printerName[SZ_FNAME+1]; /* printer name */ char printCmd[SZ_FNAME+1]; /* printer dispose command */ } Printer, *PrinterPtr; /* Printer configuration struct. */ typedef struct { int printno; /* printer number */ int seqno; /* sequence number */ int diskfile; /* print to diskfile? */ char printFile[SZ_FNAME+1]; /* disk filename template */ char printCmd[SZ_FNAME+1]; /* dispose command */ } PrintCfg, *PrintCfgPtr; /* File save definitions and structure. */ typedef struct { int seqno; /* sequence number */ int format; /* save format */ int colorType; /* save color type */ int w, h, d; /* dimensions of last file saved */ char fname[SZ_FNAME+1]; /* save filename */ } fileSave, *fileSavePtr; #define XIM_GRAYSCALE 0 /* save color options */ #define XIM_PSEUDOCOLOR 1 #define XIM_RGB 2 #define XIM_RAS 0 /* save format options */ #define XIM_GIF 1 #define XIM_TIFF 2 #define XIM_JPEG 3 #define XIM_X11 4 #define XIM_FITS 5 #define XIM_RAW 6 #define XIM_EPS 7 #define XIM_OIF 8 /* File load struct. */ typedef struct { int nfiles; /* number of files in directory */ char **FileList; /* list of directory contents */ char curdir[SZ_FNAME+1]; /* current directory */ char homedir[SZ_FNAME+1]; /* home directory */ char pattern[SZ_NAME+1]; /* file pattern to match */ int gray; /* load as a grayscale image? */ int zscale; /* zscale the image */ int zrange; /* use full data range */ float z1, z2; /* user-supplied zrange limits */ int nsample; /* number of zscale sample pts */ } fileLoad, *fileLoadPtr; /* * Application resources and runtime descriptor. * ---------------------------------------------- */ typedef struct { /* Resources. */ Boolean autoscale; /* is XY autoscaling enabled */ Boolean antialias; /* apply antialiasing when dezooming */ Boolean tileFrames; /* tile rather than overlay frames */ Boolean highlightFrames; /* highlight tiled frames */ Boolean invert; /* use inverted colormap */ int def_config; /* default FB config */ int def_nframes; /* default number of frames */ int ncolors; /* number of image pixel colors */ int tileBorder; /* image border when tiling frames */ String borderColor; /* border color for tileFrames */ String gui; /* GUI file name */ String imtoolrc; /* imtoolrc file name */ String memModel; /* FB memory model */ String userCMap1; /* user colormap file */ String userCMap2; /* user colormap file */ String userCMapDir1; /* user colormap directory */ String userCMapDir2; /* user colormap directory */ String antialiasType; /* type of antialiasing */ String printConfig; /* printer configuration file */ String input_fifo; /* client's output, e.g. /dev/imt1o */ String output_fifo; /* client's input, e.g. /dev/imt1i */ String unixaddr; /* format for unix socket path */ String ism_addr; /* format for ISM unix socket path */ String ism_task; /* image support module taskname */ int port; /* port for INET socket */ /* Internal state. */ XtPointer obm; /* object manager */ IoChanPtr cursor_chan; /* cursor mode channel */ IoChan chan[MAX_CLIENTS]; /* client i/o descriptors */ IsmIoChan ism_chan; /* image support module channel */ IsmIoChan ism_client[MAX_ISM]; /* ISM client i/o descriptors */ Widget toplevel; /* dummy toplevel app shell */ Widget gt; /* imagewin gterm-image widget */ Widget cb; /* colorbar gterm-image widget */ XtPointer gm_border; /* border marker for tileFrames */ int tileFramesList; /* frames to be tiled (bitmask) */ int nTileFrames; /* number of frames to be tiled */ int tileRows; /* number of tile rows */ int tileCols; /* number of tile cols */ Boolean tileByRows; /* fill tiles by row vs cols */ Boolean tileTopDown; /* fill tiles by top to bottom */ Boolean tileLabels; /* label frame tiles */ int rop; /* rasterop for mappings */ int display_frame; /* currently displayed frame */ FrameBufPtr df_p; /* display frame descriptor */ FrameBuf frames[MAX_FRAMES]; /* array of frame descriptors */ int fb_configno; /* current config number */ int nframes; /* current number of frame bufs */ int width, height; /* current width, height */ FbConfig fb_config[MAX_FBCONFIG]; /* fb config table */ int *clientPrivate; /* used by imtool client code */ PSImagePtr psim; /* EPS image struct pointer */ PrintCfgPtr pcp; /* printer config pointer */ fileLoadPtr flp; /* load disk file pointer */ fileSavePtr fsp; /* save disk file pointer */ } XimData, *XimDataPtr; /* Functions. */ #ifndef abs #define abs(a) (((a)<0)?(-(a)):(a)) #endif #ifndef min #define min(a,b) ((a)<(b)?(a):(b)) #endif #ifndef max #define max(a,b) ((a)<(b)?(b):(a)) #endif void xim_iisio(); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/tclconfig/ChangeLog����������������������������������������������������������������000644 �000765 �000000 �00000106605 12257365700 017633� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/tclconfig/install-sh���������������������������������������������������������������000755 �000765 �000000 �00000033054 12257365700 020062� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/tclconfig/README.txt���������������������������������������������������������������000644 �000765 �000000 �00000001454 12257365700 017553� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tcliis1.0/tclconfig/tcl.m4�������������������������������������������������������������������000644 �000765 �000000 �00000404642 12562731155 017107� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ����������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/aclocal.m4��������������������������������������������������������������������000755 �000765 �000000 �00000000223 12260347267 016742� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/checkdns.C��������������������������������������������������������������������000644 �000765 �000000 �00000007214 12547246714 016777� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <setjmp.h> #include <netdb.h> #include <iostream> #include <sstream> #include <iomanip> using namespace std; #include <tcl.h> #define SZ_LINE 2048 static int debug =0; // alarm signal handler static sigjmp_buf alarmbuf; static void alarmHandler(int dummy) { siglongjmp(alarmbuf, 1); } extern "C" { int Tclcheckdns_Init(void *vinterp); }; static int checkdns(char *name, int delay, int cflag) { int result =0; // get temp name, look for port char tbuf[SZ_LINE]; unsigned int port=80; if (name && *name) { char* ss=NULL; strncpy(tbuf, name, SZ_LINE-1); if ((ss=strchr(tbuf, ':'))) { *ss = '\0'; port = atoi(ss+1); } } else *tbuf = '\0'; // start the alarm, if necessary struct sigaction sigact, osigact; if (delay>0) { if (sigsetjmp(alarmbuf, 1)) { if (debug) cerr << "alarm activated" << endl; result= 1; goto done; } else { sigact.sa_handler = alarmHandler; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigaction(SIGALRM, &sigact, &osigact); alarm(delay); } } // get name of host we are interested in char host[SZ_LINE]; if (*tbuf) strncpy(host, tbuf, SZ_LINE-1); else { // use current host if (gethostname(host, SZ_LINE) < 0) { result =2; goto done; } else if (debug) cerr << "gethostname: " << host << endl; } // try to get info on this host struct hostent* h; if (!(h=gethostbyname(host))) { result =3; goto done; } else if (debug) cerr << "gethostbyname: " << h->h_name << '(' << port << ')' << endl; // connect, if necessary if (cflag) { unsigned int ip; memcpy(&ip, h->h_addr_list[0], (size_t)h->h_length); ip = ntohl(ip); int fd; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { result =4; goto done; } struct sockaddr_in sock_in; memset((char *)&sock_in, 0, sizeof(sock_in)); sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = htonl(ip); sock_in.sin_port = htons(port); int got = connect(fd, (struct sockaddr *)&sock_in, sizeof(sock_in)); close(fd); if (got < 0) { result =5; goto done; } else if (debug) cerr << "connect succeeded" << endl; } done: if (delay) { alarm(0); sigaction(SIGALRM, &osigact, NULL); } return result; } static int TclcheckdnsCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "host delay [connect]"); return TCL_ERROR; } char* host =NULL; char* ss = Tcl_GetStringFromObj(objv[1], NULL); if (ss && *ss) host = ss; int delay=5; char* tt = Tcl_GetStringFromObj(objv[2], NULL); if (tt && *tt) delay = atoi(tt); int cflag=0; if (objc >= 4) { char* uu = Tcl_GetStringFromObj(objv[3], NULL); if (uu && *uu) cflag = atoi(uu); } ostringstream str; str << checkdns(host, delay, cflag) << ends; Tcl_AppendResult(interp, str.str().c_str(), NULL); return TCL_OK; } int Tclcheckdns_Init(void *vinterp) { Tcl_Interp *interp = (Tcl_Interp *)vinterp; if (Tcl_InitStubs(interp, TCL_PATCH_LEVEL, 0) == NULL) return TCL_ERROR; Tcl_CreateObjCommand(interp, "checkdns", TclcheckdnsCmd, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); if (Tcl_PkgProvide(interp, PACKAGE_NAME, PACKAGE_VERSION) != TCL_OK) return TCL_ERROR; return TCL_OK; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/configure���������������������������������������������������������������������000755 �000765 �000000 �00001046324 12556465353 017030� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for tclcheckdns 1.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='tclcheckdns' PACKAGE_TARNAME='tclcheckdns' PACKAGE_VERSION='1.1' PACKAGE_STRING='tclcheckdns 1.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS TCLSH_PROG VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR SHARED_BUILD TCL_THREADS TCL_INCLUDES PKG_OBJECTS PKG_SOURCES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP ac_ct_CXX CXXFLAGS CXX TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tclinclude enable_threads enable_shared enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tclcheckdns 1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/tclcheckdns] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tclcheckdns 1.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-shared build and link with shared libraries (default: on) --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF tclcheckdns configure 1.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case <limits.h> declares $2. For example, HP-UX 11i <limits.h> declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer <limits.h> to <assert.h> if __STDC__ is defined, since <limits.h> exists even on freestanding compilers. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tclcheckdns $as_me 1.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- vars="checkdns.C" for i in $vars; do case $i in \$*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find source file '$i'" "$LINENO" 5 fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 fi PKG_HEADERS="$PKG_HEADERS $i" done vars="" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done vars="-lstdc++" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done PKG_CFLAGS="$PKG_CFLAGS " vars="" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done vars="" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5 $as_echo_n "checking how to build libraries... " >&6; } # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5 $as_echo "shared" >&6; } SHARED_BUILD=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } SHARED_BUILD=0 $as_echo "#define STATIC_BUILD 1" >>confdefs.h fi #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <tk.h> int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- $as_echo "#define USE_TCL_STUBS 1" >>confdefs.h #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tclsh" >&5 $as_echo_n "checking for tclsh... " >&6; } if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TCLSH_PROG}" >&5 $as_echo "${TCLSH_PROG}" >&6; } #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile pkgIndex.tcl" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by tclcheckdns $as_me 1.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ tclcheckdns config.status 1.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/configure.in������������������������������������������������������������������000755 �000765 �000000 �00000016550 12556465353 017432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_<PACKAGE_NAME> # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([tclcheckdns], [1.1]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- #TEA_PATH_TKCONFIG #TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- TEA_ADD_SOURCES([checkdns.C]) TEA_ADD_HEADERS([]) TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([-lstdc++]) TEA_ADD_CFLAGS([]) TEA_ADD_STUB_SOURCES([]) TEA_ADD_TCL_SOURCES([]) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS #TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS #TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile pkgIndex.tcl]) ��������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/Makefile.in�������������������������������������������������������������������000755 �000765 �000000 �00000040251 12562731013 017143� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile.in -- # # This file is a Makefile for Sample TEA Extension. If it has the name # "Makefile.in" then it is a template for a Makefile; to generate the # actual Makefile, run "./configure", which is a configuration script # generated by the "autoconf" program (constructs like "@foo@" will get # replaced in the actual Makefile. # # Copyright (c) 1999 Scriptics Corporation. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #======================================================================== # Add additional lines to handle any additional AC_SUBST cases that # have been added in a customized configure script. #======================================================================== #SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@ #======================================================================== # Nothing of the variables below this line should need to be changed. # Please check the TARGETS section below to make sure the make targets # are correct. #======================================================================== #======================================================================== # The names of the source files is defined in the configure script. # The object files are used for linking into the final library. # This will be used when a dist target is added to the Makefile. # It is not important to specify the directory, as long as it is the # $(srcdir) or in the generic, win or unix subdirectory. #======================================================================== PKG_SOURCES = @PKG_SOURCES@ PKG_OBJECTS = @PKG_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ #======================================================================== # PKG_TCL_SOURCES identifies Tcl runtime files that are associated with # this package that need to be installed, if any. #======================================================================== PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ #======================================================================== # This is a list of public header files to be installed, if any. #======================================================================== PKG_HEADERS = @PKG_HEADERS@ #======================================================================== # "PKG_LIB_FILE" refers to the library (dynamic or static as per # configuration options) composed of the named objects. #======================================================================== PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ lib_BINARIES = $(PKG_LIB_FILE) BINARIES = $(lib_BINARIES) SHELL = @SHELL@ srcdir = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ datarootdir = @datarootdir@ datadir = @datadir@ mandir = @mandir@ DESTDIR = PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION) pkgdatadir = $(datadir)/$(PKG_DIR) pkglibdir = $(libdir)/$(PKG_DIR) pkgincludedir = $(includedir)/$(PKG_DIR) top_builddir = . INSTALL_OPTIONS = INSTALL = $(SHELL) $(srcdir)/tclconfig/install-sh -c ${INSTALL_OPTIONS} INSTALL_DATA_DIR = ${INSTALL} -d -m 755 INSTALL_PROGRAM = ${INSTALL} -m 555 INSTALL_DATA = ${INSTALL} -m 444 INSTALL_SCRIPT = ${INSTALL_PROGRAM} INSTALL_LIBRARY = ${INSTALL} -m 644 PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ CC = @CC@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ OBJEXT = @OBJEXT@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ #TCL_DEFS = @TCL_DEFS@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_SRC_DIR = @TCL_SRC_DIR@ #TK_BIN_DIR = @TK_BIN_DIR@ #TK_SRC_DIR = @TK_SRC_DIR@ # Not used, but retained for reference of what libs Tcl required #TCL_LIBS = @TCL_LIBS@ #======================================================================== # TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our # package without installing. The other environment variables allow us # to test against an uninstalled Tcl. Add special env vars that you # require for testing here (like TCLX_LIBRARY). #======================================================================== EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR) #EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR):$(TK_BIN_DIR) TCLLIBPATH = $(top_builddir) TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` PKG_ENV = @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \ PATH="$(EXTRA_PATH):$(PATH)" \ TCLLIBPATH="$(TCLLIBPATH)" TCLSH_PROG = @TCLSH_PROG@ TCLSH = $(PKG_ENV) $(TCLSH_ENV) $(TCLSH_PROG) #WISH_ENV = TK_LIBRARY=`@CYGPATH@ $(TK_SRC_DIR)/library` #WISH_PROG = @WISH_PROG@ #WISH = $(PKG_ENV) $(TCLSH_ENV) $(WISH_ENV) $(WISH_PROG) SHARED_BUILD = @SHARED_BUILD@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ #INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ # TCL_DEFS is not strictly need here, but if you remove it, then you # must make sure that configure.in checks for the necessary components # that your library may use. TCL_DEFS can actually be a problem if # you do not compile with a similar machine setup as the Tcl core was # compiled with. #DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS) DEFS = @DEFS@ $(PKG_CFLAGS) # Move pkgIndex.tcl to 'BINARIES' var if it is generated in the Makefile CONFIG_CLEAN_FILES = Makefile pkgIndex.tcl CLEANFILES = @CLEANFILES@ CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ AR = @AR@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) .SUFFIXES: .c .C .$(OBJEXT) #======================================================================== # Start of user-definable TARGETS section #======================================================================== #======================================================================== # TEA TARGETS. Please note that the "libraries:" target refers to platform # independent files, and the "binaries:" target includes executable programs and # platform-dependent libraries. Modify these targets so that they install # the various pieces of your package. The make and install rules # for the BINARIES that you specified above have already been done. #======================================================================== all: binaries libraries #doc #======================================================================== # The binaries target builds executable programs, Windows .dll's, unix # shared/static libraries, and any other platform-dependent files. # The list of targets to build for "binaries:" is specified at the top # of the Makefile, in the "BINARIES" variable. #======================================================================== binaries: $(BINARIES) libraries: #======================================================================== # Your doc target should differentiate from doc builds (by the developer) # and doc installs (see install-doc), which just install the docs on the # end user machine when building from source. #======================================================================== doc: @echo "If you have documentation to create, place the commands to" @echo "build the docs in the 'doc:' target. For example:" @echo " xml2nroff sample.xml > sample.n" @echo " xml2html sample.xml > sample.html" install: all install-binaries install-libraries #install-doc install-binaries: binaries install-lib-binaries install-bin-binaries #======================================================================== # This rule installs platform-independent files, such as header files. # The list=...; for p in $$list handles the empty list case x-platform. #======================================================================== install-libraries: libraries @$(INSTALL_DATA_DIR) $(DESTDIR)$(includedir) @echo "Installing header files in $(DESTDIR)$(includedir)" @list='$(PKG_HEADERS)'; for i in $$list; do \ echo "Installing $(srcdir)/$$i" ; \ $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \ done; #======================================================================== # Install documentation. Unix manpages should go in the $(mandir) # directory. #======================================================================== install-doc: doc @$(INSTALL_DATA_DIR) $(DESTDIR)$(mandir)/mann @echo "Installing documentation in $(DESTDIR)$(mandir)" @list='$(srcdir)/doc/*.n'; for i in $$list; do \ echo "Installing $$i"; \ $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \ done test: binaries libraries $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) \ -load "package ifneeded ${PACKAGE_NAME} ${PACKAGE_VERSION} \ [list load `@CYGPATH@ $(PKG_LIB_FILE)` $(PACKAGE_NAME)]" shell: binaries libraries @$(TCLSH) $(SCRIPT) gdb: $(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT) VALGRINDARGS = --tool=memcheck --num-callers=8 --leak-resolution=high \ --leak-check=yes --show-reachable=yes -v valgrind: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) \ `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS) valgrindshell: binaries libraries $(TCLSH_ENV) valgrind $(VALGRINDARGS) $(TCLSH_PROG) $(SCRIPT) depend: #======================================================================== # $(PKG_LIB_FILE) should be listed as part of the BINARIES variable # mentioned above. That will ensure that this target is built when you # run "make binaries". # # The $(PKG_OBJECTS) objects are created and linked into the final # library. In most cases these object files will correspond to the # source files above. #======================================================================== $(PKG_LIB_FILE): $(PKG_OBJECTS) -rm -f $(PKG_LIB_FILE) ${MAKE_LIB} $(RANLIB) $(PKG_LIB_FILE) $(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS) -rm -f $(PKG_STUB_LIB_FILE) ${MAKE_STUB_LIB} $(RANLIB_STUB) $(PKG_STUB_LIB_FILE) #======================================================================== # We need to enumerate the list of .c to .o lines here. # # In the following lines, $(srcdir) refers to the toplevel directory # containing your extension. If your sources are in a subdirectory, # you will have to modify the paths to reflect this: # # sample.$(OBJEXT): $(srcdir)/generic/sample.c # $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@ # # Setting the VPATH variable to a list of paths will cause the makefile # to look into these paths when resolving .c to .obj dependencies. # As necessary, add $(srcdir):$(srcdir)/compat:.... #======================================================================== VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win:$(srcdir)/macosx .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ .C.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #======================================================================== # Distribution creation # You may need to tweak this target to make it work correctly. #======================================================================== #COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar COMPRESS = tar zcvf $(PKG_DIR).tar.gz $(PKG_DIR) DIST_ROOT = /tmp/dist DIST_DIR = $(DIST_ROOT)/$(PKG_DIR) dist-clean: rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.* dist: dist-clean $(INSTALL_DATA_DIR) $(DIST_DIR) cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \ $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \ $(DIST_DIR)/ chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4 chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in for i in $(srcdir)/*.[ch]; do \ if [ -f $$i ]; then \ cp -p $$i $(DIST_DIR)/ ; \ fi; \ done; $(INSTALL_DATA_DIR) $(DIST_DIR)/tclconfig cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \ $(DIST_DIR)/tclconfig/ chmod 664 $(DIST_DIR)/tclconfig/tcl.m4 chmod +x $(DIST_DIR)/tclconfig/install-sh list='demos doc generic library mac tests unix win'; \ for p in $$list; do \ if test -d $(srcdir)/$$p ; then \ $(INSTALL_DATA_DIR) $(DIST_DIR)/$$p; \ cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \ fi; \ done (cd $(DIST_ROOT); $(COMPRESS);) #======================================================================== # End of user-definable section #======================================================================== #======================================================================== # Don't modify the file to clean here. Instead, set the "CLEANFILES" # variable in configure.in #======================================================================== clean: -test -z "$(BINARIES)" || rm -f $(BINARIES) -rm -f *.$(OBJEXT) core *.core -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean: clean -rm -f *.tab.c -rm -f $(CONFIG_CLEAN_FILES) -rm -f config.cache config.log config.status #======================================================================== # Install binary object libraries. On Windows this includes both .dll and # .lib files. Because the .lib files are not explicitly listed anywhere, # we need to deduce their existence from the .dll file of the same name. # Library files go into the lib directory. # In addition, this will generate the pkgIndex.tcl # file in the install location (assuming it can find a usable tclsh shell) # # You should not have to modify this target. #======================================================================== install-lib-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(pkglibdir) @list='$(lib_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p"; \ $(INSTALL_LIBRARY) $$p $(DESTDIR)$(pkglibdir)/$$p; \ stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \ if test "x$$stub" = "xstub"; then \ echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \ else \ echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \ $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \ fi; \ ext=`echo $$p|sed -e "s/.*\.//"`; \ if test "x$$ext" = "xdll"; then \ lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \ if test -f $$lib; then \ echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \ $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \ fi; \ fi; \ fi; \ done @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ if test -f $(srcdir)/$$p; then \ destp=`basename $$p`; \ echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \ fi; \ done @if test "x$(SHARED_BUILD)" = "x1"; then \ echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \ $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \ fi #======================================================================== # Install binary executables (e.g. .exe files and dependent .dll files) # This is for files that must go in the bin directory (located next to # wish and tclsh), like dependent .dll files on Windows. # # You should not have to modify this target, except to define bin_BINARIES # above if necessary. #======================================================================== install-bin-binaries: binaries @$(INSTALL_DATA_DIR) $(DESTDIR)$(bindir) @list='$(bin_BINARIES)'; for p in $$list; do \ if test -f $$p; then \ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \ fi; \ done Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) \ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status uninstall-binaries: list='$(lib_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(PKG_TCL_SOURCES)'; for p in $$list; do \ p=`basename $$p`; \ rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done list='$(bin_BINARIES)'; for p in $$list; do \ rm -f $(DESTDIR)$(bindir)/$$p; \ done .PHONY: all binaries clean depend distclean doc install libraries test # 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: �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/pkgIndex.tcl.in���������������������������������������������������������������000755 �000765 �000000 �00000000220 12535330301 017743� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Tcl package index file # package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ [list load [file join $dir @PKG_LIB_FILE@] @PACKAGE_NAME@] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/tclconfig/��������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602232 017041� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/tclconfig/ChangeLog�����������������������������������������������������������000644 �000765 �000000 �00000106605 12260347267 020634� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/tclconfig/install-sh����������������������������������������������������������000755 �000765 �000000 �00000033054 12260347267 021063� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/tclconfig/README.txt����������������������������������������������������������000644 �000765 �000000 �00000001454 12260347267 020554� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/tclcheckdns1.1/tclconfig/tcl.m4��������������������������������������������������������������000644 �000765 �000000 �00000404642 12562731013 020077� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ����������������������������������������������������������������������������������������������saods9/mods/flex/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014270� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014276� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/rice/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014254� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tcllib/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014603� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tclxml/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014635� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014204� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkcon/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014450� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014445� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tktable2.10/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015261� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/wcssubs/��������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015023� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/xmlrpc/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 014637� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/xmlrpc/xmlrpc.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000106573 12607261537 016671� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: xmlrpc.tcl =================================================================== RCS file: /proj/rd/cvsroot/saods9/xmlrpc-0.3/xmlrpc.tcl,v retrieving revision 1.1 retrieving revision 1.8 diff -r1.1 -r1.8 68,69c68,69 < namespace export call buildRequest marshall unmarshall assoc < namespace export serve --- > namespace export call buildRequest marshall unmarshall assoc > namespace export serve 71c71 < variable READSIZE 4096; # read size --- > variable READSIZE 4096; # read size 73,79c73,79 < variable WS "\[ |\n|\t\|\r]"; # WhiteSpace < variable W "\[^ |\n|\t\]"; # a word with no spaces < variable DIGIT "\[0-9\]"; # Digit < < variable response ""; # response to return < variable acceptfd ""; # socket to listen on < variable DEBUG 1; # debug --- > variable WS "\[ |\n|\t\|\r]"; # WhiteSpace > variable W "\[^ |\n|\t\]"; # a word with no spaces > variable DIGIT "\[0-9\]"; # Digit > > variable response ""; # response to return > variable acceptfd ""; # socket to listen on > variable DEBUG 0; # debug 86c86 < variable acceptfd --- > variable acceptfd 88c88,89 < set acceptfd [socket -server xmlrpc::serveOnce $port] --- > set acceptfd [socket -server xmlrpc::serveOnce $port] > return $acceptfd 94c95 < variable READSIZE --- > variable READSIZE 96,100c97,101 < debug "in serveOnce: addr: $addr" < debug "in serveOnce: port: $port" < fconfigure $sock -translation {lf lf} -buffersize $READSIZE < fconfigure $sock -blocking off < fileevent $sock readable [list xmlrpc::doRequest $sock] --- > debug "in serveOnce: addr: $addr" > debug "in serveOnce: port: $port" > fconfigure $sock -translation {lf lf} -buffersize $READSIZE > fconfigure $sock -blocking off > fileevent $sock readable [list xmlrpc::doRequest $sock] 107c108 < variable WS --- > variable WS 109,127c110,139 < set res [readHeader $sock] < set headerStatus [lindex $res 0]; # Header + Status < set body [lindex $res 1]; # Body, if any < < set RE "\[^\n\]+\n(.*)" < if {![regexp $RE $headerStatus {} header]} { < return [errReturn "Malformed Request"] < } < < set body [getBody $sock $header $body] < < set RE "<\?xml.version=."; # xml version < append RE "\[^\?\]+.\?>$WS*"; # version number < append RE "<methodCall>$WS*"; # methodCall tag < append RE "<methodName>"; # methodName tag < append RE "(\[a-zA-Z0-9_:\/\\.\]+)"; # method Name < append RE "</methodName>$WS*"; # end methodName tag < append RE "(.*)"; # parameters, if any < append RE "</methodCall>.*"; # end methodCall tag --- > set res [readHeader $sock] > set headerStatus [lindex $res 0]; # Header + Status > set body [lindex $res 1]; # Body, if any > > set RE "\[^\n\]+\n(.*)" > if {![regexp $RE $headerStatus {} header]} { > return [errReturn "Malformed Request"] > } > > set body [getBody $sock $header $body] > > set RE "<\?xml.version=."; # xml version > append RE "\[^\?\]+.\?>$WS*"; # version number > append RE "<methodCall>$WS*"; # methodCall tag > append RE "<methodName>"; # methodName tag > append RE "(\[a-zA-Z0-9_:\/\\.\]+)"; # method Name > append RE "</methodName>$WS*"; # end methodName tag > append RE "(.*)"; # parameters, if any > append RE "</methodCall>.*"; # end methodCall tag > > if {![regexp $RE $body {} mname params]} { > return [errReturn "Malformed methodCall"] > } > > set args {} > set param [string range $params 8 end] > set param [string trim $param] > while {[string range $param 0 6] == "<param>"} { > set param [string range $param 7 end] > set param [string trim $param] 129,130c141,146 < if {![regexp $RE $body {} mname params]} { < return [errReturn "Malformed methodCall"] --- > set res [unmarshall $param] > set param [lindex $res 0] > set el [lindex $res 1] > lappend args $el > if {[string range $param 0 7] != "</param>"} { > return [errReturn "Invalid End Param"] 132,134c148 < < set args {} < set param [string range $params 8 end] --- > set param [string range $param 8 end] 136,161c150,162 < while {[string range $param 0 6] == "<param>"} { < set param [string range $param 7 end] < set param [string trim $param] < < set res [unmarshall $param] < set param [lindex $res 0] < set el [lindex $res 1] < lappend args $el < if {[string range $param 0 7] != "</param>"} { < return [errReturn "Invalid End Param"] < } < set param [string range $param 8 end] < set param [string trim $param] < } < if {$param != "</params>"} { < return [errReturn "Invalid End Params"] < } < if {[catch {set result [eval ::$mname $args]}]} { < set response [buildFault 100 "eval() failed"] < } else { < set response [buildResponse $result] < } < debug "in doRequest: response:\n$response" < puts -nonewline $sock $response < flush $sock < catch {close $sock} --- > } > if {$param != "</params>"} { > return [errReturn "Invalid End Params"] > } > if {[catch {set result [eval ::$mname $args]}]} { > set response [buildFault 100 "eval() failed"] > } else { > set response [buildResponse $result] > } > debug "in doRequest: response:\n$response" > puts -nonewline $sock $response > flush $sock > catch {close $sock} 168,187c169,188 < # build the body < set body "<?xml version=\"1.0\"?>\n" < append body "<methodResponse>\n" < append body "\t<params>\n" < append body "\t\t<param>\n" < append body [xmlrpc::marshall $result 3 2] < append body "\n\t\t</param>\n" < append body "\t</params>\n" < append body "</methodResponse>\n" < < set lenbod [string length $body] < < # build the header < set header "HTTP/1.1 200 OK\n" < append header "Content-Type: text/xml\n" < append header "Content-length: $lenbod\n" < < set response "$header\n$body" < return $response < #return [string trim $response] --- > # build the body > set body "<?xml version=\"1.0\"?>\n" > append body "<methodResponse>\n" > append body "\t<params>\n" > append body "\t\t<param>\n" > append body [xmlrpc::marshall $result 3 2] > append body "\n\t\t</param>\n" > append body "\t</params>\n" > append body "</methodResponse>\n" > > set lenbod [string length $body] > > # build the header > set header "HTTP/1.1 200 OK\n" > append header "Content-Type: text/xml\n" > append header "Content-length: $lenbod\n" > > set response "$header\n$body" > return $response > #return [string trim $response] 195,196c196,197 < set err(faultCode) [list int $errcode] < set err(faultString) [list string $errmsg] --- > set err(faultCode) [list int $errcode] > set err(faultString) [list string $errmsg] 198,211c199,212 < # build the body < set body "<?xml version=\"1.0\"?>\n" < append body "<methodResponse>\n" < append body "\t<fault>\n" < append body [xmlrpc::marshall {struct err} 2] < append body "\t</fault>\n" < append body "</methodResponse>\n" < < set lenbod [string length $body] < < # build the header < set header "HTTP/1.1 200 OK\n" < append header "Content-Type: text/xml\n" < append header "Content-length: $lenbod\n" --- > # build the body > set body "<?xml version=\"1.0\"?>\n" > append body "<methodResponse>\n" > append body "\t<fault>\n" > append body [xmlrpc::marshall {struct err} 2] > append body "\t</fault>\n" > append body "</methodResponse>\n" > > set lenbod [string length $body] > > # build the header > set header "HTTP/1.1 200 OK\n" > append header "Content-Type: text/xml\n" > append header "Content-length: $lenbod\n" 213,214c214,215 < set response "$header\n$body" < return [string trim $response] --- > set response "$header\n$body" > return [string trim $response] 219,247c220,248 < proc xmlrpc::call {url methodName params {ntabs 4} {distance 3}} { < variable READSIZE < variable response < global readdone < global xmlcall < < set readdone 0 < set xmlcall 1 < set RE {http://([^:]+):([0-9]+)} < if {![regexp $RE $url {} host port]} { < return [errReturn "Malformed URL"] < } < < set sock [socket $host $port] < fconfigure $sock -translation {lf lf} -buffersize $READSIZE < fconfigure $sock -blocking off < if {[catch {set request [buildRequest $methodName $params $ntabs $distance]}]} { < return < } < puts -nonewline $sock $request < flush $sock < fileevent $sock readable [list xmlrpc::getResponse $sock] < vwait readdone < catch {close $sock} < if {$readdone > 0} { < return $response < } else { < return [errReturn "xmlrpc::call failed"] < } --- > proc xmlrpc::call {url method methodName params {ntabs 4} {distance 3}} { > variable READSIZE > variable response > global readdone > global xmlcall > > set readdone 0 > set xmlcall 1 > set RE {http://([^:]+):([0-9]+)} > if {![regexp $RE $url {} host port]} { > return [errReturn "Malformed URL"] > } > > set sock [socket $host $port] > fconfigure $sock -translation {lf lf} -buffersize $READSIZE > fconfigure $sock -blocking off > if {[catch {set request [buildRequest $method $methodName $params $ntabs $distance]}]} { > return > } > puts -nonewline $sock $request > flush $sock > fileevent $sock readable [list xmlrpc::getResponse $sock] > vwait readdone > catch {close $sock} > if {$readdone > 0} { > return $response > } else { > return [errReturn "xmlrpc::call failed"] > } 254,255c255,256 < variable response < global readdone --- > variable response > global readdone 257,264c258,265 < set res [readHeader $sock] < set headerStatus [lindex $res 0]; # Header + Status < set body [lindex $res 1]; # Body, if any < < set header [parseHTTPCode $headerStatus] < set body [getBody $sock $header $body] < set response [parseResponse $body] < set readdone 1 --- > set res [readHeader $sock] > set headerStatus [lindex $res 0]; # Header + Status > set body [lindex $res 1]; # Body, if any > > set header [parseHTTPCode $headerStatus] > set body [getBody $sock $header $body] > set response [parseResponse $body] > set readdone 1 273,274c274,275 < set res [parseHTTPHeaders $header] < set headersl [lindex $res 1]; # A-list of headers --- > set res [parseHTTPHeaders $header] > set headersl [lindex $res 1]; # A-list of headers 276,285c277,283 < set expLenl [assoc "Content-Length" $headersl] < if {$expLenl == {}} { < set expLenl [assoc "Content-length" $headersl] < if {$expLenl == {}} { < return [errReturn "No Content-length found"] < } < } < set expLen [lindex $expLenl 1] < set body [readBody $body $expLen $sock] < return $body --- > set expLenl [assoc "Content-Length" $headersl] > if {$expLenl == {}} { > return [errReturn "No Content-Length found"] > } > set expLen [lindex $expLenl 1] > set body [readBody $body $expLen $sock] > return $body 294,307c292,295 < set buffer "" < while {1} { < if {[catch {set buff [nbRead $sock]}]} { < return [errReturn "Premature eof"] < } < append buffer $buff < set nindex [string first "\n\n" $buffer] < if {$nindex > 0} { < break < } < set bindex [string first "\r\n\r\n" $buffer] < if {$bindex > 0} { < break < } --- > set buffer "" > while {1} { > if {[catch {set buff [nbRead $sock]}]} { > return [errReturn "Premature eof"] 308a297,298 > append buffer $buff > set nindex [string first "\n\n" $buffer] 310,314c300 < set header [string range $buffer 0 [expr $nindex - 1]] < set body [string range $buffer [expr $nindex + 2] end] < } elseif {$bindex > 0} { < set header [string range $buffer 0 [expr $bindex - 1]] < set body [string range $buffer [expr $bindex + 4] end] --- > break 316c302,314 < return [list $header $body] --- > set bindex [string first "\r\n\r\n" $buffer] > if {$bindex > 0} { > break > } > } > if {$nindex > 0} { > set header [string range $buffer 0 [expr $nindex - 1]] > set body [string range $buffer [expr $nindex + 2] end] > } elseif {$bindex > 0} { > set header [string range $buffer 0 [expr $bindex - 1]] > set body [string range $buffer [expr $bindex + 4] end] > } > return [list $header $body] 325,336c323,333 < set newbody $body < while {1} { < if {[catch {set buff [nbRead $sock]}]} { < return [errReturn "Premature eof"] < } < append newbody $buff < set bodLen [string length $newbody] < if {$bodLen == $expLen} { < break < } elseif {$bodLen > $expLen} { < return [errReturn "Content-length:$expLen does not match Body Length:$bodLen"] < } --- > set newbody $body > while {1} { > if {[catch {set buff [nbRead $sock]}]} { > return [errReturn "Premature eof"] > } > append newbody $buff > set bodLen [string length $newbody] > if {$bodLen == $expLen} { > break > } elseif {$bodLen > $expLen} { > return [errReturn "Content-length:$expLen does not match Body Length:$bodLen"] 338c335,336 < return $newbody --- > } > return $newbody 346c344 < variable DIGIT --- > variable DIGIT 348,359c346,357 < set RE "HTTP/"; # HTTP message < append RE "($DIGIT+\\.*$DIGIT*)."; # version < append RE "($DIGIT+)."; # status code < append RE "(\[^\n\]+)\n(.*)"; # status message < < if {![regexp $RE $str {} vern status code rest]} { < return [errReturn "Unrecognized HTTP code:\n$str"] < } < if {$status != "200"} { < return [errReturn "Bad HTTP status: $status"] < } < return $rest --- > set RE "HTTP/"; # HTTP message > append RE "($DIGIT+\\.*$DIGIT*)."; # version > append RE "($DIGIT+)."; # status code > append RE "(\[^\n\]+)\n(.*)"; # status message > > if {![regexp $RE $str {} vern status code rest]} { > return [errReturn "Unrecognized HTTP code:\n$str"] > } > if {$status != "200"} { > return [errReturn "Bad HTTP status: $status"] > } > return $rest 369,392c367,390 < set headers {} < set remain {} < set remainp 0 < set RE {([^:]+):(.*)} < < set parts [split $str "\n"] < foreach {part} $parts { < if {$part == "" < && !$remainp} { < set remainp 1 < continue < } < if {$remainp} { < lappend remain $part < continue < } < if {![regexp $RE $part {} key value]} { < return [errReturn "Unrecognized HTTP Header format: $part"] < } < set value [string trim $value] < lappend headers [list $key $value] < } < set rest [join $remain "\n"] < return [list $rest $headers] --- > set headers {} > set remain {} > set remainp 0 > set RE {([^:]+):(.*)} > > set parts [split $str "\n"] > foreach {part} $parts { > if {$part == "" > && !$remainp} { > set remainp 1 > continue > } > if {$remainp} { > lappend remain $part > continue > } > if {![regexp $RE $part {} key value]} { > return [errReturn "Unrecognized HTTP Header format: $part"] > } > set value [string trim $value] > lappend headers [list $key $value] > } > set rest [join $remain "\n"] > return [list $rest $headers] 400c398 < variable WS --- > variable WS 401a400,410 > set RE "<\?xml.version=."; # xml version > append RE "(\[^\?\]+).\?>$WS*"; # version number > append RE "<methodResponse>$WS*"; # method response tag > append RE "<params>$WS*"; # params tag > append RE "<param>$WS*"; # param tag > append RE "(<value>.*)"; # value > append RE "</param>$WS*"; # end param tag > append RE "</params>$WS*"; # end params tag > append RE "</methodResponse>"; # end method response tag > > if {![regexp $RE $str {} vern value]} { 405,409c414,416 < append RE "<params>$WS*"; # params tag < append RE "<param>$WS*"; # param tag < append RE "(<value>.*)"; # value < append RE "</param>$WS*"; # end param tag < append RE "</params>$WS*"; # end params tag --- > append RE "<fault>$WS*"; # fault tag > append RE "(.*)$WS*"; # fault values > append RE "</fault>$WS*"; # end fault tag 413,423c420 < set RE "<\?xml.version=."; # xml version < append RE "(\[^\?\]+).\?>$WS*"; # version number < append RE "<methodResponse>$WS*"; # method response tag < append RE "<fault>$WS*"; # fault tag < append RE "(.*)$WS*"; # fault values < append RE "</fault>$WS*"; # end fault tag < append RE "</methodResponse>"; # end method response tag < < if {![regexp $RE $str {} vern value]} { < return [errReturn "Unrecognized response from server"] < } --- > return [errReturn "Unrecognized response from server"] 425,426c422,424 < set result [unmarshall $value] < return $result --- > } > set result [unmarshall $value] > return $result 433c431 < variable READSIZE --- > variable READSIZE 435,448c433,446 < fileevent $fd readable "" < set buffer "" < while {1} { < if {[eof $fd]} { < catch {close $fd} < break < } < set temp [read $fd $READSIZE] < if {$temp == ""} { < break < } < append buffer $temp < } < return $buffer --- > fileevent $fd readable "" > set buffer "" > while {1} { > if {[eof $fd]} { > catch {close $fd} > break > } > set temp [read $fd $READSIZE] > if {$temp == ""} { > break > } > append buffer $temp > } > return $buffer 455,475c453,475 < proc xmlrpc::buildRequest {methodName params {ntabs 4} {distance 2}} { < # build the body < set body "<?xml version=\"1.0\"?>\n" < append body "<methodCall>\n" < append body "\t<methodName>$methodName</methodName>\n" < if {$params != {}} { < append body "\t\t<params>\n" < foreach {param} $params { < append body "\t\t\t<param>\n" < append body [xmlrpc::marshall $param $ntabs $distance] < append body "\n\t\t\t</param>\n" < } < append body "\t\t</params>\n" < } < append body "</methodCall>\n" < set lenbod [string length $body] < < # build the header < set header "POST /RPC2 HTTP/1.0\n" < append header "Content-Type: text/xml\n" < append header "Content-length: $lenbod\n" --- > proc xmlrpc::buildRequest {method methodName params {ntabs 4} {distance 2}} { > # build the body > set body "<?xml version=\"1.0\"?>\n" > append body "<methodCall>\n" > append body "\t<methodName>$methodName</methodName>\n" > if {$params != {}} { > append body "\t\t<params>\n" > foreach {param} $params { > append body "\t\t\t<param>\n" > append body [xmlrpc::marshall $param $ntabs $distance] > append body "\n\t\t\t</param>\n" > } > append body "\t\t</params>\n" > } > append body "</methodCall>\n" > set body [regsub -all "\n" $body "\r\n"] > set lenbod [string length $body] > > # build the header > set header "POST /$method HTTP/1.0\n" > append header "Content-Type: text/xml\n" > append header "Content-length: $lenbod\n" > set header [regsub -all "\n" $header "\r\n"] 477,478c477,478 < set request "$header\n$body" < return $request --- > set request "$header\r\n$body" > return $request 485,544c485,544 < if {![validParam $param]} { < return [errReturn "Malformed Parameter: $param"] < } < < set strtabs "" < for {set x 0} {$x < $ntabs} {incr x} { < append strtabs "\t" < } < < set type [lindex $param 0] < set val [lindex $param 1] < < if {$type == "int"} { < return "$strtabs<value><int>$val</int></value>" < } elseif {$type == "i4"} { < return "$strtabs<value><i4>$val</i4></value>" < } elseif {$type == "boolean"} { < return "$strtabs<value><boolean>$val</boolean></value>" < } elseif {$type == "string"} { < return "$strtabs<value><string>$val</string></value>" < } elseif {$type == "double"} { < return "$strtabs<value><double>$val</double></value>" < } elseif {$type == "dateTime.iso8601"} { < return "$strtabs<value><dateTime.iso8601>$val</dateTime.iso8601></value>" < } elseif {$type == "base64"} { < return "$strtabs<value><base64>$val</base64></value>" < } elseif {$type == "struct"} { < # get the original caller's scope < upvar $distance $val dict < # try the global scope < if {![array exists dict]} { < upvar #0 $val dict < } < < set str "$strtabs<value>\n" < append str "$strtabs\t<struct>\n" < foreach {k v} [array get dict] { < append str "$strtabs\t\t<member>\n" < append str "$strtabs\t\t\t<name>$k</name>\n" < append str [marshall $v [expr $ntabs + 3] [expr $distance + 1]] < append str "\n$strtabs\t\t</member>\n" < } < append str "$strtabs\t</struct>\n" < append str "$strtabs</value>\n" < return $str < } elseif {$type == "array"} { < set str "$strtabs<value>\n" < append str "$strtabs\t<array>\n" < append str "$strtabs\t\t<data>\n" < foreach el $val { < append str [marshall $el [expr $ntabs + 3] [expr $distance + 1]] < append str "\n" < } < append str "$strtabs\t\t</data>\n" < append str "$strtabs\t</array>\n" < append str "$strtabs</value>\n" < return $str < } else { < return [errReturn "Unknown type: $type"] < } --- > if {![validParam $param]} { > return [errReturn "Malformed Parameter: $param"] > } > > set strtabs "" > for {set x 0} {$x < $ntabs} {incr x} { > append strtabs "\t" > } > > set type [lindex $param 0] > set val [lindex $param 1] > > if {$type == "int"} { > return "$strtabs<value><int>$val</int></value>" > } elseif {$type == "i4"} { > return "$strtabs<value><i4>$val</i4></value>" > } elseif {$type == "boolean"} { > return "$strtabs<value><boolean>$val</boolean></value>" > } elseif {$type == "string"} { > return "$strtabs<value><string>$val</string></value>" > } elseif {$type == "double"} { > return "$strtabs<value><double>$val</double></value>" > } elseif {$type == "dateTime.iso8601"} { > return "$strtabs<value><dateTime.iso8601>$val</dateTime.iso8601></value>" > } elseif {$type == "base64"} { > return "$strtabs<value><base64>$val</base64></value>" > } elseif {$type == "struct"} { > # get the original caller's scope > upvar $distance $val dict > # try the global scope > if {![array exists dict]} { > upvar #0 $val dict > } > > set str "$strtabs<value>\n" > append str "$strtabs\t<struct>\n" > foreach {k v} [array get dict] { > append str "$strtabs\t\t<member>\n" > append str "$strtabs\t\t\t<name>$k</name>\n" > append str [marshall $v [expr $ntabs + 3] [expr $distance + 1]] > append str "\n$strtabs\t\t</member>\n" > } > append str "$strtabs\t</struct>\n" > append str "$strtabs</value>\n" > return $str > } elseif {$type == "array"} { > set str "$strtabs<value>\n" > append str "$strtabs\t<array>\n" > append str "$strtabs\t\t<data>\n" > foreach el $val { > append str [marshall $el [expr $ntabs + 3] [expr $distance + 1]] > append str "\n" > } > append str "$strtabs\t\t</data>\n" > append str "$strtabs\t</array>\n" > append str "$strtabs</value>\n" > return $str > } else { > return [errReturn "Unknown type: $type"] > } 553,556c553,556 < if {[llength $param] != 2} { < return 0 < } < return 1 --- > if {[llength $param] != 2} { > return 0 > } > return 1 563,574c563,574 < set str [string trim $str] < if {[string range $str 0 6] != "<value>"} { < return [errReturn "Bad value tag"] < } < < set str [string range $str 7 end] < set str [string trimleft $str] < set RE {<([^>]+)>} < if {![regexp $RE $str {} btag]} { < return [errReturn "No beginning tag found: $str"] < } < if {$btag == "int" --- > set str [string trim $str] > if {[string range $str 0 6] != "<value>"} { > return [errReturn "Bad value tag"] > } > > set str [string range $str 7 end] > set str [string trimleft $str] > set RE {<([^>]+)>} > if {![regexp $RE $str {} btag]} { > return [errReturn "No beginning tag found: $str"] > } > if {$btag == "int" 576,590c576,600 < set res [umInt $str] < } elseif {$btag== "boolean"} { < set res [umBool $str] < } elseif {$btag == "string"} { < set res [umString $str] < } elseif {$btag == "double"} { < set res [umDouble $str] < } elseif {$btag == "dateTime.iso8601"} { < set res [umDateTime $str] < } elseif {$btag == "base64"} { < set res [umBase64 $str] < } elseif {$btag == "array"} { < set res [umArray $str] < } elseif {$btag == "struct"} { < set res [umStruct $str] --- > set res [umInt $str] > } elseif {$btag== "boolean"} { > set res [umBool $str] > } elseif {$btag == "string"} { > set res [umString $str] > } elseif {$btag == "double"} { > set res [umDouble $str] > } elseif {$btag == "dateTime.iso8601"} { > set res [umDateTime $str] > } elseif {$btag == "base64"} { > set res [umBase64 $str] > } elseif {$btag == "array"} { > set res [umArray $str] > } elseif {$btag == "struct"} { > set res [umStruct $str] > } else { > # return [errReturn "Unknown type: $str"] > > # assume string > set id [string first "<" $str ] > if {$id != -1} { > set vv [string range $str 0 [expr $id-1]] > set rr [string range $str $id end] > set str "<string>${vv}</string>${rr}" > set res [umString $str] 592c602 < return [errReturn "Unknown type: $str"] --- > return [errReturn "Unknown type: $str"] 593a604 > } 595,596c606,607 < set rest [lindex $res 0] < set val [lindex $res 1] --- > set rest [lindex $res 0] > set val [lindex $res 1] 598,603c609,614 < if {[string range $rest 0 7] != "</value>"} { < return [errReturn "Invalid close of value tag"] < } < set rest [string range $rest 8 end] < set rest [string trim $rest] < return [list $rest $val] --- > if {[string range $rest 0 7] != "</value>"} { > return [errReturn "Invalid close of value tag"] > } > set rest [string range $rest 8 end] > set rest [string trim $rest] > return [list $rest $val] 607,608c618,619 < variable WS < variable DIGIT --- > variable WS > variable DIGIT 610,624c621,635 < set RE "<(int|i4)>$WS*"; # int tag < append RE "(-*)($DIGIT+)$WS*"; # int value < append RE "</(int|i4)>$WS*"; # end int tag < append RE "(.*)"; # leftover < < if {![regexp $RE $str {} tag negp digits engtag rest]} { < return [errReturn "Invalid Integer"] < } < if {$negp != ""} { < set digits [expr -1 * $digits] < } else { < set digits [expr 1 * $digits] < } < set rest [string trim $rest] < return [list $rest $digits] --- > set RE "<(int|i4)>$WS*"; # int tag > append RE "(-*)($DIGIT+)$WS*"; # int value > append RE "</(int|i4)>$WS*"; # end int tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} tag negp digits engtag rest]} { > return [errReturn "Invalid Integer"] > } > if {$negp != ""} { > set digits [expr -1 * $digits] > } else { > set digits [expr 1 * $digits] > } > set rest [string trim $rest] > return [list $rest $digits] 628c639 < variable WS --- > variable WS 630,639c641,650 < set RE "<boolean>$WS*"; # boolean tag < append RE "(0|1)$WS*"; # boolean value < append RE "</boolean>$WS*"; # end boolean tag < append RE "(.*)"; # leftover < < if {![regexp $RE $str {} bool rest]} { < return [errReturn "Invalid Boolean"] < } < set rest [string trim $rest] < return [list $rest $bool] --- > set RE "<boolean>$WS*"; # boolean tag > append RE "(0|1)$WS*"; # boolean value > append RE "</boolean>$WS*"; # end boolean tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} bool rest]} { > return [errReturn "Invalid Boolean"] > } > set rest [string trim $rest] > return [list $rest $bool] 643c654 < variable WS --- > variable WS 645,654c656,665 < set RE "<string>"; # string tag < append RE "(\[^<\]*)"; # string value < append RE "</string>$WS*"; # end string tag < append RE "(.*)"; # leftover < < if {![regexp $RE $str {} s rest]} { < return [errReturn "Invalid String"] < } < set rest [string trim $rest] < return [list $rest $s] --- > set RE "<string>"; # string tag > append RE "(\[^<\]*)"; # string value > append RE "</string>$WS*"; # end string tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} s rest]} { > return [errReturn "Invalid String"] > } > set rest [string trim $rest] > return [list $rest $s] 658,659c669,670 < variable WS < variable DIGIT --- > variable WS > variable DIGIT 661,675c672,686 < set RE "<double>$WS*"; # double tag < append RE "(-*)($DIGIT*\.?$DIGIT*)$WS*"; # double value < append RE "</double>$WS*"; # end double tag < append RE "(.*)"; # leftover < < if {![regexp $RE $str {} negp d rest]} { < return [errReturn "Invalid Double"] < } < if {$negp != ""} { < set d [expr -1 * $d] < } else { < set d [expr 1 * $d] < } < set rest [string trim $rest] < return [list $rest $d] --- > set RE "<double>$WS*"; # double tag > append RE "(-*)($DIGIT*\.?$DIGIT*)$WS*"; # double value > append RE "</double>$WS*"; # end double tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} negp d rest]} { > return [errReturn "Invalid Double"] > } > if {$negp != ""} { > set d [expr -1 * $d] > } else { > set d [expr 1 * $d] > } > set rest [string trim $rest] > return [list $rest $d] 679,685c690,691 < variable WS < variable DIGIT < < set RE "<dateTime\\.iso8601>$WS*"; # dateTime tag < append RE "($DIGIT+T$DIGIT+:$DIGIT+:$DIGIT+)$WS*"; # dateTime value < append RE "</dateTime\\.iso8601>$WS*"; # end string tag < append RE "(.*)"; # leftover --- > variable WS > variable DIGIT 687,691c693,702 < if {![regexp $RE $str {} dateTime rest]} { < return [errReturn "Invalid DateTime"] < } < set rest [string trim $rest] < return [list $rest $dateTime] --- > set RE "<dateTime\\.iso8601>$WS*"; # dateTime tag > append RE "($DIGIT+T$DIGIT+:$DIGIT+:$DIGIT+)$WS*"; # dateTime value > append RE "</dateTime\\.iso8601>$WS*"; # end string tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} dateTime rest]} { > return [errReturn "Invalid DateTime"] > } > set rest [string trim $rest] > return [list $rest $dateTime] 695,700c706 < variable WS < < set RE "<base64>"; # string tag < append RE "(\[^<\]*)"; # string value < append RE "</base64>$WS*"; # end string tag < append RE "(.*)"; # leftover --- > variable WS 702,706c708,717 < if {![regexp $RE $str {} s rest]} { < return [errReturn "Invalid Base64"] < } < set rest [string trim $rest] < return [list $rest $s] --- > set RE "<base64>"; # string tag > append RE "(\[^<\]*)"; # string value > append RE "</base64>$WS*"; # end string tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} s rest]} { > return [errReturn "Invalid Base64"] > } > set rest [string trim $rest] > return [list $rest $s] 710,729c721 < variable WS < < set RE "<array>$WS*"; # array tag < append RE "<data>$WS*"; # data tag < append RE "(.*)"; # leftover < < if {![regexp $RE $str {} rest]} { < return [errReturn "Invalid Array"] < } < set l {} < while {[string range $rest 0 6] == "<value>"} { < set res [unmarshall $rest] < set rest [lindex $res 0] < set el [lindex $res 1] < lappend l $el < } < < set REAREND "</data>$WS*"; # end data tag < append REAREND "</array>$WS*"; # end array tag < append REAREND "(.*)"; # leftover --- > variable WS 731,734c723,745 < if {![regexp $REAREND $rest {} leftover]} { < return [errReturn "Invalid End Array"] < } < return [list $leftover $l] --- > set RE "<array>$WS*"; # array tag > append RE "<data>$WS*"; # data tag > append RE "(.*)"; # leftover > > if {![regexp $RE $str {} rest]} { > return [errReturn "Invalid Array"] > } > set l {} > while {[string range $rest 0 6] == "<value>"} { > set res [unmarshall $rest] > set rest [lindex $res 0] > set el [lindex $res 1] > lappend l $el > } > > set REAREND "</data>$WS*"; # end data tag > append REAREND "</array>$WS*"; # end array tag > append REAREND "(.*)"; # leftover > > if {![regexp $REAREND $rest {} leftover]} { > return [errReturn "Invalid End Array"] > } > return [list $leftover $l] 738,743c749,750 < variable WS < variable W < < if {[string range $str 0 7] != "<struct>"} { < return [errReturn "Invalid Struct"] < } --- > variable WS > variable W 745,750c752,764 < set RE "<name>$WS*"; # name tag < append RE "($W+)$WS*"; # key < append RE "</name>$WS*"; # end name tag < append RE "(<value>.*)"; # value tag < < set l {} --- > if {[string range $str 0 7] != "<struct>"} { > return [errReturn "Invalid Struct"] > } > > set RE "<name>$WS*"; # name tag > append RE "($W+?)$WS*"; # key > append RE "</name>$WS*"; # end name tag > append RE "(<value>.*)"; # value tag > > set l {} > set str [string range $str 8 end] > set str [string trim $str] > while {[string range $str 0 7] == "<member>"} { 753,767c767,768 < while {[string range $str 0 7] == "<member>"} { < set str [string range $str 8 end] < set str [string trim $str] < if {![regexp $RE $str {} key val]} { < return [errReturn "Invalid Struct Member"] < } < set res [unmarshall $val] < set str [lindex $res 0] < set el [lindex $res 1] < lappend l [list $key $el] < if {[string range $str 0 8] != "</member>"} { < return [errReturn "Invalid End Struct Member"] < } < set str [string range $str 9 end] < set str [string trim $str] --- > if {![regexp $RE $str {} key val]} { > return [errReturn "Invalid Struct Member"] 769,770c770,775 < if {[string range $str 0 8] != "</struct>"} { < return [errReturn "Invalid End Struct"] --- > set res [unmarshall $val] > set str [lindex $res 0] > set el [lindex $res 1] > lappend l [list $key $el] > if {[string range $str 0 8] != "</member>"} { > return [errReturn "Invalid End Struct Member"] 774c779,785 < return [list $str $l] --- > } > if {[string range $str 0 8] != "</struct>"} { > return [errReturn "Invalid End Struct"] > } > set str [string range $str 9 end] > set str [string trim $str] > return [list $str $l] 784,788c795,798 < foreach {cons} $list { < set tkey [lindex $cons 0] < if {$key == $tkey} { < return $cons < } --- > foreach {cons} $list { > set tkey [lindex $cons 0] > if {[string tolower $key] == [string tolower $tkey]} { > return $cons 790c800,801 < return {} --- > } > return {} 794c805 < puts stderr $msg --- > puts stderr $msg 798c809 < variable DEBUG --- > variable DEBUG 800,802c811,813 < if {$DEBUG} { < puts "$msg" < } --- > if {$DEBUG} { > puts "$msg" > } 806,807c817,818 < warn $msg < return -code error --- > warn $msg > return -code error 811,827c822,838 < set person(first) {string "eric m"} < set person(last) {string yeh} < set employed(programmer) {struct person} < < #set xml [marshall {struct employed}] < #set w [list {int 1}] < #set q [list "array \{$w\}" {int 2} {string eric}] < #puts [marshall "array \{$q\}"] < < #set xml [marshall {array {{int 1} {string {hello everybody}}}}] < set xml [marshall {struct person}] < debug "xml:\n$xml" < set data [unmarshall $xml] < debug "data: $data" < set data [lindex $data 1] < debug "data: $data" < puts [assoc "first" $data] --- > set person(first) {string "eric m"} > set person(last) {string yeh} > set employed(programmer) {struct person} > > #set xml [marshall {struct employed}] > #set w [list {int 1}] > #set q [list "array \{$w\}" {int 2} {string eric}] > #puts [marshall "array \{$q\}"] > > #set xml [marshall {array {{int 1} {string {hello everybody}}}}] > set xml [marshall {struct person}] > debug "xml:\n$xml" > set data [unmarshall $xml] > debug "data: $data" > set data [lindex $data 1] > debug "data: $data" > puts [assoc "first" $data] 831c842 < global xmlcall --- > global xmlcall 833,837c844,848 < if {$xmlcall} { < global readdone < set readdone -1 < set xmlcall 0 < } --- > if {$xmlcall} { > global readdone > set readdone -1 > set xmlcall 0 > } �������������������������������������������������������������������������������������������������������������������������������������saods9/mods/wcssubs/hget.c��������������������������������������������������������������������������000644 �000765 �000000 �00000000744 11640432160 016114� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: hget.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/wcssubs-3.8.4/hget.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 1164a1165,1171 > /*** waj ***/ > extern char* findit(char*,char*); > char* ksearch(const char* hstring, const char* keyword) > { > return findit((char*)hstring, (char*)keyword); > } > 1166c1173,1174 < ksearch (hstring,keyword) --- > ksearchh (hstring,keyword) > /*** waj ***/ ����������������������������saods9/mods/wcssubs/wcs.c���������������������������������������������������������������������������000644 �000765 �000000 �00000001111 12144506174 015755� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: wcs.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/wcssubs-3.8.4/wcs.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 2335c2335 < int wcsrev(); --- > int wcsrevv(); 2352c2352 < offscl = wcsrev ((void *)&wcs->ctype, &wcs->wcsl, pixcrd, &wcs->lin, imgcrd, --- > offscl = wcsrevv ((void *)&wcs->ctype, &wcs->wcsl, pixcrd, &wcs->lin, imgcrd, 2383c2383 < if (wcsset (wcs->lin.naxis, (void *)&wcs->ctype, &wcs->wcsl) ) --- > if (wcssett (wcs->lin.naxis, (void *)&wcs->ctype, &wcs->wcsl) ) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/wcssubs/wcsinit.c�����������������������������������������������������������������������000644 �000765 �000000 �00000000440 11704113451 016636� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: wcsinit.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/wcssubs-3.8.4/wcsinit.c,v retrieving revision 1.1 retrieving revision 1.3 diff -r1.1 -r1.3 561a562 > /* 569c570 < --- > */ 762c763 < int n; --- > int n =0; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/wcssubs/wcslib.c������������������������������������������������������������������������000644 �000765 �000000 �00000001651 12144506174 016455� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: wcslib.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/wcssubs-3.8.4/wcslib.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 385c385 < * $Id: wcslib.c,v 1.1 2013/05/14 19:11:56 joye Exp $ --- > * $Id: wcslib.c,v 1.1 2013/05/14 19:11:56 joye Exp $ 424c424 < wcsset (naxis, ctype, wcs) --- > wcssett (naxis, ctype, wcs) 573c573 < if (wcsset(lin->naxis, ctype, wcs)) return 1; --- > if (wcssett(lin->naxis, ctype, wcs)) return 1; 644c644 < wcsrev(ctype, wcs, pixcrd, lin, imgcrd, prj, phi, theta, crval, cel, world) --- > wcsrevv(ctype, wcs, pixcrd, lin, imgcrd, prj, phi, theta, crval, cel, world) 663c663 < if (wcsset(lin->naxis, ctype, wcs)) return 1; --- > if (wcssett(lin->naxis, ctype, wcs)) return 1; 777c777 < if (wcsset(lin->naxis, ctype, wcs)) return 1; --- > if (wcssett(lin->naxis, ctype, wcs)) return 1; ���������������������������������������������������������������������������������������saods9/mods/wcssubs/wcslib.h������������������������������������������������������������������������000644 �000765 �000000 �00000000736 12144506174 016465� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: wcslib.h =================================================================== RCS file: /proj/rd/cvsroot/saods9/wcssubs-3.8.4/wcslib.h,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 32c32 < * $Id: wcslib.h,v 1.1 2013/05/14 19:11:56 joye Exp $ --- > * $Id: wcslib.h,v 1.1 2013/05/14 19:11:56 joye Exp $ 329c329 < int wcsset(const int, --- > int wcssett(const int, 345c345 < int wcsrev(const char[][9], --- > int wcsrevv(const char[][9], ����������������������������������saods9/mods/tktable2.10/configure�������������������������������������������������������������������000644 �000765 �000000 �00000000453 12140266072 017163� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure =================================================================== RCS file: /proj/rd/cvsroot/saods9/tktable2.10/configure,v retrieving revision 1.1 diff -r1.1 configure 1361c1361 < *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) --- > *win32*|*WIN32*|*MINGW32_*) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/���������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015730� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/configure.in����������������������������������������������������������������������000644 �000765 �000000 �00000005025 12142244561 016755� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/configure.in,v retrieving revision 1.1 diff -r1.1 configure.in 117c117 < TEA_CONFIG_SUBDIR(bmp, [--with-tkimg=`pwd`/base --disable-option-checking]) --- > #TEA_CONFIG_SUBDIR(bmp, [--with-tkimg=`pwd`/base --disable-option-checking]) 119c119 < TEA_CONFIG_SUBDIR(ico, [--with-tkimg=`pwd`/base --disable-option-checking]) --- > #TEA_CONFIG_SUBDIR(ico, [--with-tkimg=`pwd`/base --disable-option-checking]) 121,122c121,122 < TEA_CONFIG_SUBDIR(pcx, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(pixmap, [--with-tkimg=`pwd`/base --disable-option-checking]) --- > #TEA_CONFIG_SUBDIR(pcx, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(pixmap, [--with-tkimg=`pwd`/base --disable-option-checking]) 124,128c124,128 < TEA_CONFIG_SUBDIR(ppm, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(ps, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(sgi, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(sun, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(tga, [--with-tkimg=`pwd`/base --disable-option-checking]) --- > #TEA_CONFIG_SUBDIR(ppm, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(ps, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(sgi, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(sun, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(tga, [--with-tkimg=`pwd`/base --disable-option-checking]) 131,134c131,134 < TEA_CONFIG_SUBDIR(xbm, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(xpm, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(dted, [--with-tkimg=`pwd`/base --disable-option-checking]) < TEA_CONFIG_SUBDIR(raw, [--with-tkimg=`pwd`/base --disable-option-checking]) --- > #TEA_CONFIG_SUBDIR(xbm, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(xpm, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(dted, [--with-tkimg=`pwd`/base --disable-option-checking]) > #TEA_CONFIG_SUBDIR(raw, [--with-tkimg=`pwd`/base --disable-option-checking]) 140c140,141 < AC_OUTPUT(Makefile) --- > AC_CONFIG_FILES([Makefile]) > AC_OUTPUT �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/gif/������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015212� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/jpeg/�����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015372� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/libtiff/��������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 016064� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/Makefile.in�����������������������������������������������������������������������000644 �000765 �000000 �00000000360 12142246475 016514� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: Makefile.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/Makefile.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 116a117,118 > > install-mann: ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/png/������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015231� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/tiff/�����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015375� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/window/���������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015754� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/zlib/�����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015405� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/zlib/configure.in�����������������������������������������������������������������000644 �000765 �000000 �00000002226 12560203461 017713� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/zlib/configure.in,v retrieving revision 1.1.1.1 diff -r1.1.1.1 configure.in 54,58c54,58 < TEA_ADD_SOURCES([../compat/zlib/adler32.c ../compat/zlib/compress.c ../compat/zlib/crc32.c]) < TEA_ADD_SOURCES([../compat/zlib/deflate.c ../compat/zlib/gzclose.c ../compat/zlib/gzlib.c]) < TEA_ADD_SOURCES([../compat/zlib/gzread.c ../compat/zlib/gzwrite.c ../compat/zlib/infback.c]) < TEA_ADD_SOURCES([../compat/zlib/inffast.c ../compat/zlib/inflate.c ../compat/zlib/inftrees.c]) < TEA_ADD_SOURCES([../compat/zlib/trees.c ../compat/zlib/uncompr.c ../compat/zlib/zutil.c]) --- > #TEA_ADD_SOURCES([../compat/zlib/adler32.c ../compat/zlib/compress.c ../compat/zlib/crc32.c]) > #TEA_ADD_SOURCES([../compat/zlib/deflate.c ../compat/zlib/gzclose.c ../compat/zlib/gzlib.c]) > #TEA_ADD_SOURCES([../compat/zlib/gzread.c ../compat/zlib/gzwrite.c ../compat/zlib/infback.c]) > #TEA_ADD_SOURCES([../compat/zlib/inffast.c ../compat/zlib/inflate.c ../compat/zlib/inftrees.c]) > #TEA_ADD_SOURCES([../compat/zlib/trees.c ../compat/zlib/uncompr.c ../compat/zlib/zutil.c]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/window/configure.in���������������������������������������������������������������000644 �000765 �000000 �00000001055 12561216257 020271� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/window/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2015/08/07 21:01:35 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2015/08/07 21:01:35 joye Exp $) 118c118 < CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch init.c" --- > CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch" 120c120 < CLEANFILES="init.c" --- > CLEANFILES="" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/tiff/configure.in�����������������������������������������������������������������000644 �000765 �000000 �00000001053 12561212662 017704� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/tiff/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) 133c133 < CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch init.c" --- > CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch" 135c135 < CLEANFILES="init.c" --- > CLEANFILES="" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/png/configure.in������������������������������������������������������������������000644 �000765 �000000 �00000001052 12561212662 017537� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/png/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) 124c124 < CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch init.c" --- > CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch" 126c126 < CLEANFILES="init.c" --- > CLEANFILES="" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/libtiff/configure�����������������������������������������������������������������000644 �000765 �000000 �00000113373 12142246475 020003� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/libtiff/configure,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 2c2 < # From configure.in Id: configure.in 282 2010-07-06 13:48:46Z nijtmans . --- > # From configure.in Id: configure.in. 4c4 < # Generated by GNU Autoconf 2.65 for tifftcl 3.9.4. --- > # Generated by GNU Autoconf 2.68 for tifftcl 3.9.4. 8,9c8,9 < # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, < # Inc. --- > # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software > # Foundation, Inc. 92a93 > as_myself= 217a219 > # Preserve -v and -x to the replacement shell. 222c224,230 < exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} --- > case $- in # (((( > *v*x* | *x*v* ) as_opts=-vx ;; > *v* ) as_opts=-v ;; > *x* ) as_opts=-x ;; > * ) as_opts= ;; > esac > exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} 320c328 < } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" --- > } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" 360,361c368,369 < # as_fn_error ERROR [LINENO LOG_FD] < # --------------------------------- --- > # as_fn_error STATUS ERROR [LINENO LOG_FD] > # ---------------------------------------- 364c372 < # script with status $?, using 1 if that was 0. --- > # script with STATUS, using 1 if that was 0. 367,370c375,378 < as_status=$?; test $as_status -eq 0 && as_status=1 < if test "$3"; then < as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack < $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 --- > as_status=$1; test $as_status -eq 0 && as_status=1 > if test "$4"; then > as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack > $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 372c380 < $as_echo "$as_me: error: $1" >&2 --- > $as_echo "$as_me: error: $2" >&2 534c542 < # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, --- > # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, 747c755,756 < CPP' --- > CPP > CPPFLAGS' 810,811c819,821 < *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; < *) ac_optarg=yes ;; --- > *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; > *=) ac_optarg= ;; > *) ac_optarg=yes ;; 856c866 < as_fn_error "invalid feature name: $ac_useropt" --- > as_fn_error $? "invalid feature name: $ac_useropt" 882c892 < as_fn_error "invalid feature name: $ac_useropt" --- > as_fn_error $? "invalid feature name: $ac_useropt" 1086c1096 < as_fn_error "invalid package name: $ac_useropt" --- > as_fn_error $? "invalid package name: $ac_useropt" 1102c1112 < as_fn_error "invalid package name: $ac_useropt" --- > as_fn_error $? "invalid package name: $ac_useropt" 1132,1133c1142,1143 < -*) as_fn_error "unrecognized option: \`$ac_option' < Try \`$0 --help' for more information." --- > -*) as_fn_error $? "unrecognized option: \`$ac_option' > Try \`$0 --help' for more information" 1141c1151 < as_fn_error "invalid variable name: \`$ac_envvar'" ;; --- > as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; 1151c1161 < : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} --- > : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" 1159c1169 < as_fn_error "missing argument to $ac_option" --- > as_fn_error $? "missing argument to $ac_option" 1165c1175 < fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; --- > fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; 1188c1198 < as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" --- > as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" 1202,1203c1212,1213 < $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. < If a cross compiler is detected then cross compile mode will be used." >&2 --- > $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. > If a cross compiler is detected then cross compile mode will be used" >&2 1218c1228 < as_fn_error "working directory cannot be determined" --- > as_fn_error $? "working directory cannot be determined" 1220c1230 < as_fn_error "pwd does not report name of working directory" --- > as_fn_error $? "pwd does not report name of working directory" 1259c1269 < as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" --- > as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" 1263c1273 < cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" --- > cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" 1303c1313 < -q, --quiet, --silent do not print \`checking...' messages --- > -q, --quiet, --silent do not print \`checking ...' messages 1455c1465 < generated by GNU Autoconf 2.65 --- > generated by GNU Autoconf 2.68 1457c1467 < Copyright (C) 2009 Free Software Foundation, Inc. --- > Copyright (C) 2010 Free Software Foundation, Inc. 1501c1511 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1527c1537 < test $ac_status = 0; } >/dev/null && { --- > test $ac_status = 0; } > conftest.i && { 1538c1548 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1580c1590 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1594c1604 < if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${$3+:} false; then : 1612c1622 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1657c1667 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1670c1680 < if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${$3+:} false; then : 1725c1735 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1737c1747 < if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${$3+:} false; then : 1740c1750 < if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${$3+:} false; then : 1776c1786 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.err conftest.i conftest.$ac_ext 1803c1813 < if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${$3+:} false; then : 1812c1822 < eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} --- > eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno 1820c1830 < generated by GNU Autoconf 2.65. Invocation command line was --- > generated by GNU Autoconf 2.68. Invocation command line was 1930,1931c1940 < cat <<\_ASBOX < ## ---------------- ## --- > $as_echo "## ---------------- ## 1933,1934c1942 < ## ---------------- ## < _ASBOX --- > ## ---------------- ##" 1968,1969c1976 < cat <<\_ASBOX < ## ----------------- ## --- > $as_echo "## ----------------- ## 1971,1972c1978 < ## ----------------- ## < _ASBOX --- > ## ----------------- ##" 1985,1986c1991 < cat <<\_ASBOX < ## ------------------- ## --- > $as_echo "## ------------------- ## 1988,1989c1993 < ## ------------------- ## < _ASBOX --- > ## ------------------- ##" 2003,2004c2007 < cat <<\_ASBOX < ## ----------- ## --- > $as_echo "## ----------- ## 2006,2007c2009 < ## ----------- ## < _ASBOX --- > ## ----------- ##" 2062c2064,2069 < ac_site_file1=$CONFIG_SITE --- > # We do not want a PATH search for config.site. > case $CONFIG_SITE in #(( > -*) ac_site_file1=./$CONFIG_SITE;; > */*) ac_site_file1=$CONFIG_SITE;; > *) ac_site_file1=./$CONFIG_SITE;; > esac 2077c2084,2088 < . "$ac_site_file" --- > . "$ac_site_file" \ > || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 > $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} > as_fn_error $? "failed to load site script $ac_site_file > See \`config.log' for more details" "$LINENO" 5; } 2153c2164 < as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 --- > as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 2175c2186 < as_fn_error " --- > as_fn_error $? " 2179c2190 < as_fn_error " --- > as_fn_error $? " 2194c2205 < if test "${ac_cv_prog_CYGPATH+set}" = set; then : --- > if ${ac_cv_prog_CYGPATH+:} false; then : 2273,2279c2284,2296 < for ac_t in install-sh install.sh shtool; do < if test -f "$ac_dir/$ac_t"; then < ac_aux_dir=$ac_dir < ac_install_sh="$ac_aux_dir/$ac_t -c" < break 2 < fi < done --- > if test -f "$ac_dir/install-sh"; then > ac_aux_dir=$ac_dir > ac_install_sh="$ac_aux_dir/install-sh -c" > break > elif test -f "$ac_dir/install.sh"; then > ac_aux_dir=$ac_dir > ac_install_sh="$ac_aux_dir/install.sh -c" > break > elif test -f "$ac_dir/shtool"; then > ac_aux_dir=$ac_dir > ac_install_sh="$ac_aux_dir/shtool install -c" > break > fi 2282c2299 < as_fn_error "cannot find install-sh, install.sh, or shtool in ../tclconfig \"$srcdir\"/../tclconfig" "$LINENO" 5 --- > as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../tclconfig \"$srcdir\"/../tclconfig" "$LINENO" 5 2319c2336 < if test "${ac_cv_c_tclconfig+set}" = set; then : --- > if ${ac_cv_c_tclconfig+:} false; then : 2337c2354 < as_fn_error "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 --- > as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 2435c2452 < as_fn_error "Can't find Tcl configuration definitions" "$LINENO" 5 --- > as_fn_error $? "Can't find Tcl configuration definitions" "$LINENO" 5 2562c2579 < if test "${ac_cv_c_tkconfig+set}" = set; then : --- > if ${ac_cv_c_tkconfig+:} false; then : 2580c2597 < as_fn_error "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 --- > as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 2678c2695 < as_fn_error "Can't find Tk configuration definitions" "$LINENO" 5 --- > as_fn_error $? "Can't find Tk configuration definitions" "$LINENO" 5 2833c2850 < if test "${ac_cv_path_install+set}" = set; then : --- > if ${ac_cv_path_install+:} false; then : 2929c2946 < if test "${ac_cv_prog_CC+set}" = set; then : --- > if ${ac_cv_prog_CC+:} false; then : 2969c2986 < if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : --- > if ${ac_cv_prog_ac_ct_CC+:} false; then : 3022c3039 < if test "${ac_cv_prog_CC+set}" = set; then : --- > if ${ac_cv_prog_CC+:} false; then : 3062c3079 < if test "${ac_cv_prog_CC+set}" = set; then : --- > if ${ac_cv_prog_CC+:} false; then : 3121c3138 < if test "${ac_cv_prog_CC+set}" = set; then : --- > if ${ac_cv_prog_CC+:} false; then : 3165c3182 < if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : --- > if ${ac_cv_prog_ac_ct_CC+:} false; then : 3219,3220c3236,3237 < as_fn_error "no acceptable C compiler found in \$PATH < See \`config.log' for more details." "$LINENO" 5; } --- > as_fn_error $? "no acceptable C compiler found in \$PATH > See \`config.log' for more details" "$LINENO" 5; } 3334,3336c3351,3352 < { as_fn_set_status 77 < as_fn_error "C compiler cannot create executables < See \`config.log' for more details." "$LINENO" 5; }; } --- > as_fn_error 77 "C compiler cannot create executables > See \`config.log' for more details" "$LINENO" 5; } 3378,3379c3394,3395 < as_fn_error "cannot compute suffix of executables: cannot compile and link < See \`config.log' for more details." "$LINENO" 5; } --- > as_fn_error $? "cannot compute suffix of executables: cannot compile and link > See \`config.log' for more details" "$LINENO" 5; } 3436c3452 < as_fn_error "cannot run C compiled programs. --- > as_fn_error $? "cannot run C compiled programs. 3438c3454 < See \`config.log' for more details." "$LINENO" 5; } --- > See \`config.log' for more details" "$LINENO" 5; } 3449c3465 < if test "${ac_cv_objext+set}" = set; then : --- > if ${ac_cv_objext+:} false; then : 3489,3490c3505,3506 < as_fn_error "cannot compute suffix of object files: cannot compile < See \`config.log' for more details." "$LINENO" 5; } --- > as_fn_error $? "cannot compute suffix of object files: cannot compile > See \`config.log' for more details" "$LINENO" 5; } 3500c3516 < if test "${ac_cv_c_compiler_gnu+set}" = set; then : --- > if ${ac_cv_c_compiler_gnu+:} false; then : 3537c3553 < if test "${ac_cv_prog_cc_g+set}" = set; then : --- > if ${ac_cv_prog_cc_g+:} false; then : 3615c3631 < if test "${ac_cv_prog_cc_c89+set}" = set; then : --- > if ${ac_cv_prog_cc_c89+:} false; then : 3722c3738 < if test "${ac_cv_prog_CPP+set}" = set; then : --- > if ${ac_cv_prog_CPP+:} false; then : 3752c3768 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.err conftest.i conftest.$ac_ext 3768c3784 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.err conftest.i conftest.$ac_ext 3772c3788 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.i conftest.err conftest.$ac_ext 3811c3827 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.err conftest.i conftest.$ac_ext 3827c3843 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.err conftest.i conftest.$ac_ext 3831c3847 < rm -f conftest.err conftest.$ac_ext --- > rm -f conftest.i conftest.err conftest.$ac_ext 3837,3838c3853,3854 < as_fn_error "C preprocessor \"$CPP\" fails sanity check < See \`config.log' for more details." "$LINENO" 5; } --- > as_fn_error $? "C preprocessor \"$CPP\" fails sanity check > See \`config.log' for more details" "$LINENO" 5; } 3858c3874 < if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : --- > if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : 3866c3882 < # GNU make sometimes prints "make[1]: Entering...", which would confuse us. --- > # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. 3895c3911 < if test "${ac_cv_prog_RANLIB+set}" = set; then : --- > if ${ac_cv_prog_RANLIB+:} false; then : 3935c3951 < if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : --- > if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : 3994c4010 < if test "${ac_cv_path_GREP+set}" = set; then : --- > if ${ac_cv_path_GREP+:} false; then : 4043c4059 < as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 --- > as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 4057c4073 < if test "${ac_cv_path_EGREP+set}" = set; then : --- > if ${ac_cv_path_EGREP+:} false; then : 4109c4125 < as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 --- > as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 4124c4140 < if test "${ac_cv_header_stdc+set}" = set; then : --- > if ${ac_cv_header_stdc+:} false; then : 4241,4242c4257 < eval as_val=\$$as_ac_Header < if test "x$as_val" = x""yes; then : --- > if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : 4264c4279 < if test "${tcl_cv_cc_pipe+set}" = set; then : --- > if ${tcl_cv_cc_pipe+:} false; then : 4301c4316 < if test "${ac_cv_c_bigendian+set}" = set; then : --- > if ${ac_cv_c_bigendian+:} false; then : 4519c4534 < as_fn_error "unknown endianness --- > as_fn_error $? "unknown endianness 4533c4548 < if test "x$ac_cv_func_sin" = x""yes; then : --- > if test "x$ac_cv_func_sin" = xyes; then : 4541c4556 < if test "${ac_cv_lib_ieee_main+set}" = set; then : --- > if ${ac_cv_lib_ieee_main+:} false; then : 4569c4584 < if test "x$ac_cv_lib_ieee_main" = x""yes; then : --- > if test "x$ac_cv_lib_ieee_main" = xyes; then : 4581c4596 < if test "${ac_cv_lib_inet_main+set}" = set; then : --- > if ${ac_cv_lib_inet_main+:} false; then : 4609c4624 < if test "x$ac_cv_lib_inet_main" = x""yes; then : --- > if test "x$ac_cv_lib_inet_main" = xyes; then : 4614c4629 < if test "x$ac_cv_header_net_errno_h" = x""yes; then : --- > if test "x$ac_cv_header_net_errno_h" = xyes; then : 4643c4658 < if test "x$ac_cv_func_connect" = x""yes; then : --- > if test "x$ac_cv_func_connect" = xyes; then : 4651c4666 < if test "x$ac_cv_func_setsockopt" = x""yes; then : --- > if test "x$ac_cv_func_setsockopt" = xyes; then : 4656c4671 < if test "${ac_cv_lib_socket_setsockopt+set}" = set; then : --- > if ${ac_cv_lib_socket_setsockopt+:} false; then : 4690c4705 < if test "x$ac_cv_lib_socket_setsockopt" = x""yes; then : --- > if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : 4703c4718 < if test "x$ac_cv_func_accept" = x""yes; then : --- > if test "x$ac_cv_func_accept" = xyes; then : 4711c4726 < if test "x$ac_cv_func_gethostbyname" = x""yes; then : --- > if test "x$ac_cv_func_gethostbyname" = xyes; then : 4716c4731 < if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : --- > if ${ac_cv_lib_nsl_gethostbyname+:} false; then : 4750c4765 < if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : --- > if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : 4767c4782 < if test "${tcl_cv_dirent_h+set}" = set; then : --- > if ${tcl_cv_dirent_h+:} false; then : 4820c4835 < if test "x$ac_cv_header_errno_h" = x""yes; then : --- > if test "x$ac_cv_header_errno_h" = xyes; then : 4830c4845 < if test "x$ac_cv_header_float_h" = x""yes; then : --- > if test "x$ac_cv_header_float_h" = xyes; then : 4840c4855 < if test "x$ac_cv_header_values_h" = x""yes; then : --- > if test "x$ac_cv_header_values_h" = xyes; then : 4850c4865 < if test "x$ac_cv_header_limits_h" = x""yes; then : --- > if test "x$ac_cv_header_limits_h" = xyes; then : 4862c4877 < if test "x$ac_cv_header_stdlib_h" = x""yes; then : --- > if test "x$ac_cv_header_stdlib_h" = xyes; then : 4914c4929 < if test "x$ac_cv_header_string_h" = x""yes; then : --- > if test "x$ac_cv_header_string_h" = xyes; then : 4958c4973 < if test "x$ac_cv_header_sys_wait_h" = x""yes; then : --- > if test "x$ac_cv_header_sys_wait_h" = xyes; then : 4968c4983 < if test "x$ac_cv_header_dlfcn_h" = x""yes; then : --- > if test "x$ac_cv_header_dlfcn_h" = xyes; then : 4982c4997 < if test "x$ac_cv_header_sys_param_h" = x""yes; then : --- > if test "x$ac_cv_header_sys_param_h" = xyes; then : 5000c5015 < if test "${ac_cv_header_stdc+set}" = set; then : --- > if ${ac_cv_header_stdc+:} false; then : 5126c5141 < as_fn_error "Compiler does not use stdarg.h, required for TIFF" "$LINENO" 5 --- > as_fn_error $? "Compiler does not use stdarg.h, required for TIFF" "$LINENO" 5 5165,5212c5180 < as_fn_error "could not find source file '$i'" "$LINENO" 5 < fi < PKG_SOURCES="$PKG_SOURCES $i" < # this assumes it is in a VPATH dir < i=`basename $i` < # handle user calling this before or after TEA_SETUP_COMPILER < if test x"${OBJEXT}" != x ; then < j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" < else < j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" < fi < PKG_OBJECTS="$PKG_OBJECTS $j" < ;; < esac < done < < < < < < vars=" < ../compat/libtiff/libtiff/tif_aux.c ../compat/libtiff/libtiff/tif_close.c ../compat/libtiff/libtiff/tif_codec.c < ../compat/libtiff/libtiff/tif_compress.c ../compat/libtiff/libtiff/tif_dir.c ../compat/libtiff/libtiff/tif_dirinfo.c < ../compat/libtiff/libtiff/tif_dirread.c ../compat/libtiff/libtiff/tif_dirwrite.c ../compat/libtiff/libtiff/tif_dumpmode.c < ../compat/libtiff/libtiff/tif_error.c ../compat/libtiff/libtiff/tif_fax3.c < ../compat/libtiff/libtiff/tif_getimage.c ../compat/libtiff/libtiff/tif_flush.c ../compat/libtiff/libtiff/tif_luv.c < ../compat/libtiff/libtiff/tif_lzw.c ../compat/libtiff/libtiff/tif_next.c ../compat/libtiff/libtiff/tif_open.c < ../compat/libtiff/libtiff/tif_packbits.c ../compat/libtiff/libtiff/tif_predict.c ../compat/libtiff/libtiff/tif_print.c < ../compat/libtiff/libtiff/tif_read.c ../compat/libtiff/libtiff/tif_swab.c ../compat/libtiff/libtiff/tif_strip.c < ../compat/libtiff/libtiff/tif_thunder.c ../compat/libtiff/libtiff/tif_tile.c ../compat/libtiff/libtiff/tif_version.c < ../compat/libtiff/libtiff/tif_warning.c ../compat/libtiff/libtiff/tif_write.c < ../compat/libtiff/libtiff/tif_color.c ../compat/libtiff/libtiff/tif_extension.c < " < for i in $vars; do < case $i in < \$*) < # allow $-var names < PKG_SOURCES="$PKG_SOURCES $i" < PKG_OBJECTS="$PKG_OBJECTS $i" < ;; < *) < # check for existence - allows for generic/win/unix VPATH < # To add more dirs here (like 'src'), you have to update VPATH < # in Makefile.in as well < if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ < -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ < ; then < as_fn_error "could not find source file '$i'" "$LINENO" 5 --- > as_fn_error $? "could not find source file '$i'" "$LINENO" 5 5236c5204 < as_fn_error "could not find header file '${srcdir}/$i'" "$LINENO" 5 --- > as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 5270c5238 < as_fn_error "could not find stub source file '$i'" "$LINENO" 5 --- > as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 5302c5270 < as_fn_error "could not find source file '$i'" "$LINENO" 5 --- > as_fn_error $? "could not find source file '$i'" "$LINENO" 5 5325c5293 < as_fn_error "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 --- > as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 5352c5320 < if test "${ac_cv_c_tclh+set}" = set; then : --- > if ${ac_cv_c_tclh+:} false; then : 5362c5330 < as_fn_error "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 --- > as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 5411c5379 < as_fn_error "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 --- > as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 5436c5404 < if test "${ac_cv_c_tkh+set}" = set; then : --- > if ${ac_cv_c_tkh+:} false; then : 5446c5414 < as_fn_error "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 --- > as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 5498c5466 < as_fn_error "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 --- > as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 5540,5573d5507 < < vars="../compat/libtiff/libtiff/tif_win32.c" < for i in $vars; do < case $i in < \$*) < # allow $-var names < PKG_SOURCES="$PKG_SOURCES $i" < PKG_OBJECTS="$PKG_OBJECTS $i" < ;; < *) < # check for existence - allows for generic/win/unix VPATH < # To add more dirs here (like 'src'), you have to update VPATH < # in Makefile.in as well < if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ < -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ < ; then < as_fn_error "could not find source file '$i'" "$LINENO" 5 < fi < PKG_SOURCES="$PKG_SOURCES $i" < # this assumes it is in a VPATH dir < i=`basename $i` < # handle user calling this before or after TEA_SETUP_COMPILER < if test x"${OBJEXT}" != x ; then < j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" < else < j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" < fi < PKG_OBJECTS="$PKG_OBJECTS $j" < ;; < esac < done < < < 5576,5609d5509 < < vars="../compat/libtiff/libtiff/tif_unix.c" < for i in $vars; do < case $i in < \$*) < # allow $-var names < PKG_SOURCES="$PKG_SOURCES $i" < PKG_OBJECTS="$PKG_OBJECTS $i" < ;; < *) < # check for existence - allows for generic/win/unix VPATH < # To add more dirs here (like 'src'), you have to update VPATH < # in Makefile.in as well < if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ < -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ < ; then < as_fn_error "could not find source file '$i'" "$LINENO" 5 < fi < PKG_SOURCES="$PKG_SOURCES $i" < # this assumes it is in a VPATH dir < i=`basename $i` < # handle user calling this before or after TEA_SETUP_COMPILER < if test x"${OBJEXT}" != x ; then < j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}" < else < j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}" < fi < PKG_OBJECTS="$PKG_OBJECTS $j" < ;; < esac < done < < < 5658c5558 < if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then : --- > if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : 5692c5592 < if test "x$ac_cv_lib_pthread_pthread_mutex_init" = x""yes; then : --- > if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : 5706c5606 < if test "${ac_cv_lib_pthread___pthread_mutex_init+set}" = set; then : --- > if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : 5740c5640 < if test "x$ac_cv_lib_pthread___pthread_mutex_init" = x""yes; then : --- > if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : 5754c5654 < if test "${ac_cv_lib_pthreads_pthread_mutex_init+set}" = set; then : --- > if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : 5788c5688 < if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = x""yes; then : --- > if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : 5800c5700 < if test "${ac_cv_lib_c_pthread_mutex_init+set}" = set; then : --- > if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : 5834c5734 < if test "x$ac_cv_lib_c_pthread_mutex_init" = x""yes; then : --- > if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : 5843c5743 < if test "${ac_cv_lib_c_r_pthread_mutex_init+set}" = set; then : --- > if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : 5877c5777 < if test "x$ac_cv_lib_c_r_pthread_mutex_init" = x""yes; then : --- > if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : 6024c5924 < if test "${tcl_cv_cc_visibility_hidden+set}" = set; then : --- > if ${tcl_cv_cc_visibility_hidden+:} false; then : 6099c5999 < if test "${tcl_cv_sys_version+set}" = set; then : --- > if ${tcl_cv_sys_version+:} false; then : 6138c6038 < if test "${ac_cv_lib_dl_dlopen+set}" = set; then : --- > if ${ac_cv_lib_dl_dlopen+:} false; then : 6172c6072 < if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : --- > if test "x$ac_cv_lib_dl_dlopen" = xyes; then : 6217c6117 < if test "${ac_cv_prog_AR+set}" = set; then : --- > if ${ac_cv_prog_AR+:} false; then : 6295c6195 < as_fn_error "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 --- > as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 6298c6198 < as_fn_error "Windows/CE and GCC builds incompatible" "$LINENO" 5 --- > as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 6315c6215 < if test "${ac_cv_c_celibconfig+set}" = set; then : --- > if ${ac_cv_c_celibconfig+:} false; then : 6324c6224 < as_fn_error "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 --- > as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 6350c6250 < as_fn_error "Cannot find celib support library directory" "$LINENO" 5 --- > as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 6398c6298 < as_fn_error "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 --- > as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 6635c6535 < if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then : --- > if ${ac_cv_lib_bsd_gettimeofday+:} false; then : 6669c6569 < if test "x$ac_cv_lib_bsd_gettimeofday" = x""yes; then : --- > if test "x$ac_cv_lib_bsd_gettimeofday" = xyes; then : 6699c6599 < if test "${ac_cv_lib_bind_inet_ntoa+set}" = set; then : --- > if ${ac_cv_lib_bind_inet_ntoa+:} false; then : 6733c6633 < if test "x$ac_cv_lib_bind_inet_ntoa" = x""yes; then : --- > if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : 6790c6690 < if test "${ac_cv_lib_network_inet_ntoa+set}" = set; then : --- > if ${ac_cv_lib_network_inet_ntoa+:} false; then : 6824c6724 < if test "x$ac_cv_lib_network_inet_ntoa" = x""yes; then : --- > if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : 6853c6753 < if test "${ac_cv_lib_dld_shl_load+set}" = set; then : --- > if ${ac_cv_lib_dld_shl_load+:} false; then : 6887c6787 < if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : --- > if test "x$ac_cv_lib_dld_shl_load" = xyes; then : 6955c6855 < if test "${ac_cv_lib_dld_shl_load+set}" = set; then : --- > if ${ac_cv_lib_dld_shl_load+:} false; then : 6989c6889 < if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : --- > if test "x$ac_cv_lib_dld_shl_load" = xyes; then : 7115c7015 < if test "${tcl_cv_cc_m64+set}" = set; then : --- > if ${tcl_cv_cc_m64+:} false; then : 7228c7128 < if test "${tcl_cv_ld_elf+set}" = set; then : --- > if ${tcl_cv_ld_elf+:} false; then : 7281c7181 < if test "${tcl_cv_ld_elf+set}" = set; then : --- > if ${tcl_cv_ld_elf+:} false; then : 7401c7301 < if test "${tcl_cv_cc_arch_ppc64+set}" = set; then : --- > if ${tcl_cv_cc_arch_ppc64+:} false; then : 7438c7338 < if test "${tcl_cv_cc_arch_x86_64+set}" = set; then : --- > if ${tcl_cv_cc_arch_x86_64+:} false; then : 7491c7391 < if test "${tcl_cv_ld_single_module+set}" = set; then : --- > if ${tcl_cv_ld_single_module+:} false; then : 7540c7440 < if test "${tcl_cv_ld_search_paths_first+set}" = set; then : --- > if ${tcl_cv_ld_search_paths_first+:} false; then : 7592c7492 < if test "${tcl_cv_lib_x11_64+set}" = set; then : --- > if ${tcl_cv_lib_x11_64+:} false; then : 7631c7531 < if test "${tcl_cv_lib_tk_64+set}" = set; then : --- > if ${tcl_cv_lib_tk_64+:} false; then : 8025c7925 < if test "${tcl_cv_ld_Bexport+set}" = set; then : --- > if ${tcl_cv_ld_Bexport+:} false; then : 8165c8065 < if test "${tcl_cv_flag__isoc99_source+set}" = set; then : --- > if ${tcl_cv_flag__isoc99_source+:} false; then : 8212c8112 < if test "${tcl_cv_flag__largefile64_source+set}" = set; then : --- > if ${tcl_cv_flag__largefile64_source+:} false; then : 8259c8159 < if test "${tcl_cv_flag__largefile_source64+set}" = set; then : --- > if ${tcl_cv_flag__largefile_source64+:} false; then : 8316c8216 < if test "${tcl_cv_type_64bit+set}" = set; then : --- > if ${tcl_cv_type_64bit+:} false; then : 8385c8285 < if test "${tcl_cv_struct_dirent64+set}" = set; then : --- > if ${tcl_cv_struct_dirent64+:} false; then : 8418c8318 < if test "${tcl_cv_struct_stat64+set}" = set; then : --- > if ${tcl_cv_struct_stat64+:} false; then : 8453,8454c8353 < eval as_val=\$$as_ac_var < if test "x$as_val" = x""yes; then : --- > if eval test \"x\$"$as_ac_var"\" = x"yes"; then : 8464c8363 < if test "${tcl_cv_type_off64_t+set}" = set; then : --- > if ${tcl_cv_type_off64_t+:} false; then : 8836c8735 < test "x$cache_file" != "x/dev/null" && --- > if test "x$cache_file" != "x/dev/null"; then 8839c8738,8749 < cat confcache >$cache_file --- > if test ! -f "$cache_file" || test -h "$cache_file"; then > cat confcache >"$cache_file" > else > case $cache_file in #( > */* | ?:*) > mv -f confcache "$cache_file"$$ && > mv -f "$cache_file"$$ "$cache_file" ;; #( > *) > mv -f confcache "$cache_file" ;; > esac > fi > fi 8890a8801 > U= 8908c8819 < : ${CONFIG_STATUS=./config.status} --- > : "${CONFIG_STATUS=./config.status}" 9008a8920 > as_myself= 9054,9055c8966,8967 < # as_fn_error ERROR [LINENO LOG_FD] < # --------------------------------- --- > # as_fn_error STATUS ERROR [LINENO LOG_FD] > # ---------------------------------------- 9058c8970 < # script with status $?, using 1 if that was 0. --- > # script with STATUS, using 1 if that was 0. 9061,9064c8973,8976 < as_status=$?; test $as_status -eq 0 && as_status=1 < if test "$3"; then < as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack < $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 --- > as_status=$1; test $as_status -eq 0 && as_status=1 > if test "$4"; then > as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack > $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 9066c8978 < $as_echo "$as_me: error: $1" >&2 --- > $as_echo "$as_me: error: $2" >&2 9262c9174 < } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" --- > } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" 9316c9228 < generated by GNU Autoconf 2.65. Invocation command line was --- > generated by GNU Autoconf 2.68. Invocation command line was 9369c9281 < configured by $0, generated by GNU Autoconf 2.65, --- > configured by $0, generated by GNU Autoconf 2.68, 9372c9284 < Copyright (C) 2009 Free Software Foundation, Inc. --- > Copyright (C) 2010 Free Software Foundation, Inc. 9388c9300 < --*=*) --- > --*=?*) 9392a9305,9309 > --*=) > ac_option=`expr "X$1" : 'X\([^=]*\)='` > ac_optarg= > ac_shift=: > ;; 9413a9331 > '') as_fn_error $? "missing file argument" ;; 9424c9342 < -*) as_fn_error "unrecognized option: \`$1' --- > -*) as_fn_error $? "unrecognized option: \`$1' 9476c9394 < *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; --- > *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; 9497c9415 < tmp= --- > tmp= ac_tmp= 9499c9417,9418 < { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status --- > : "${ac_tmp:=$tmp}" > { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status 9507c9426 < test -n "$tmp" && test -d "$tmp" --- > test -d "$tmp" 9512c9431,9432 < } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 --- > } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 > ac_tmp=$tmp 9529c9449 < ac_cs_awk_cr='\r' --- > ac_cs_awk_cr='\\r' 9534c9454 < echo 'BEGIN {' >"$tmp/subs1.awk" && --- > echo 'BEGIN {' >"$ac_tmp/subs1.awk" && 9543,9544c9463,9464 < as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 < ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` --- > as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 > ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` 9548c9468 < as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 --- > as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 9554c9474 < as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 --- > as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 9562c9482 < cat >>"\$tmp/subs1.awk" <<\\_ACAWK && --- > cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && 9610c9530 < cat >>"\$tmp/subs1.awk" <<_ACAWK && --- > cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && 9642,9643c9562,9563 < fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ < || as_fn_error "could not setup config files machinery" "$LINENO" 5 --- > fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ > || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 9646,9647c9566,9567 < # VPATH may cause trouble with some makes, so we remove $(srcdir), < # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and --- > # VPATH may cause trouble with some makes, so we remove sole $(srcdir), > # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and 9651,9655c9571,9579 < ac_vpsub='/^[ ]*VPATH[ ]*=/{ < s/:*\$(srcdir):*/:/ < s/:*\${srcdir}:*/:/ < s/:*@srcdir@:*/:/ < s/^\([^=]*=[ ]*\):*/\1/ --- > ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ > h > s/// > s/^/:/ > s/[ ]*$/:/ > s/:\$(srcdir):/:/g > s/:\${srcdir}:/:/g > s/:@srcdir@:/:/g > s/^:*// 9656a9581,9584 > x > s/\(=[ ]*\).*/\1/ > G > s/\n// 9674c9602 < :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; --- > :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; 9693c9621 < -) ac_f="$tmp/stdin";; --- > -) ac_f="$ac_tmp/stdin";; 9702c9630 < as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; --- > as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; 9728,9729c9656,9657 < *:-:* | *:-) cat >"$tmp/stdin" \ < || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; --- > *:-:* | *:-) cat >"$ac_tmp/stdin" \ > || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; 9859,9860c9787,9788 < eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ < || as_fn_error "could not create $ac_file" "$LINENO" 5 --- > eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ > >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 9863,9864c9791,9793 < { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && < { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && --- > { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && > { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ > "$ac_tmp/out"`; test -z "$ac_out"; } && 9866c9795 < which seems to be undefined. Please make sure it is defined." >&5 --- > which seems to be undefined. Please make sure it is defined" >&5 9868c9797 < which seems to be undefined. Please make sure it is defined." >&2;} --- > which seems to be undefined. Please make sure it is defined" >&2;} 9870c9799 < rm -f "$tmp/stdin" --- > rm -f "$ac_tmp/stdin" 9872,9873c9801,9802 < -) cat "$tmp/out" && rm -f "$tmp/out";; < *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; --- > -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; > *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; 9875c9804 < || as_fn_error "could not create $ac_file" "$LINENO" 5 --- > || as_fn_error $? "could not create $ac_file" "$LINENO" 5 9890c9819 < as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 --- > as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 9911c9840 < $ac_cs_success || as_fn_exit $? --- > $ac_cs_success || as_fn_exit 1 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/libtiff/configure.in��������������������������������������������������������������000644 �000765 �000000 �00000003322 11540442612 020370� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/libtiff/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2011/03/17 17:31:54 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2011/03/17 17:31:54 joye Exp $) 85,98d84 < TEA_ADD_SOURCES([ < ../compat/libtiff/libtiff/tif_aux.c ../compat/libtiff/libtiff/tif_close.c ../compat/libtiff/libtiff/tif_codec.c < ../compat/libtiff/libtiff/tif_compress.c ../compat/libtiff/libtiff/tif_dir.c ../compat/libtiff/libtiff/tif_dirinfo.c < ../compat/libtiff/libtiff/tif_dirread.c ../compat/libtiff/libtiff/tif_dirwrite.c ../compat/libtiff/libtiff/tif_dumpmode.c < ../compat/libtiff/libtiff/tif_error.c ../compat/libtiff/libtiff/tif_fax3.c < ../compat/libtiff/libtiff/tif_getimage.c ../compat/libtiff/libtiff/tif_flush.c ../compat/libtiff/libtiff/tif_luv.c < ../compat/libtiff/libtiff/tif_lzw.c ../compat/libtiff/libtiff/tif_next.c ../compat/libtiff/libtiff/tif_open.c < ../compat/libtiff/libtiff/tif_packbits.c ../compat/libtiff/libtiff/tif_predict.c ../compat/libtiff/libtiff/tif_print.c < ../compat/libtiff/libtiff/tif_read.c ../compat/libtiff/libtiff/tif_swab.c ../compat/libtiff/libtiff/tif_strip.c < ../compat/libtiff/libtiff/tif_thunder.c ../compat/libtiff/libtiff/tif_tile.c ../compat/libtiff/libtiff/tif_version.c < ../compat/libtiff/libtiff/tif_warning.c ../compat/libtiff/libtiff/tif_write.c < ../compat/libtiff/libtiff/tif_color.c ../compat/libtiff/libtiff/tif_extension.c < ]) < 133d118 < TEA_ADD_SOURCES([../compat/libtiff/libtiff/tif_win32.c]) 136d120 < TEA_ADD_SOURCES([../compat/libtiff/libtiff/tif_unix.c]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/libtiff/Makefile.in���������������������������������������������������������������000644 �000765 �000000 �00000001025 11540225745 020130� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: Makefile.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/libtiff/Makefile.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 15c15 < # RCS: @(#) $Id: Makefile.in,v 1.1 2011/03/16 21:30:13 joye Exp $ --- > # RCS: @(#) $Id: Makefile.in,v 1.1 2011/03/16 21:30:13 joye Exp $ 38,39c38,39 < PKG_SOURCES = @PKG_SOURCES@ tif_fax3sm.c < PKG_OBJECTS = @PKG_OBJECTS@ tif_fax3sm.$(OBJEXT) --- > PKG_SOURCES = @PKG_SOURCES@ > PKG_OBJECTS = @PKG_OBJECTS@ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/jpeg/configure.in�����������������������������������������������������������������000644 �000765 �000000 �00000001053 12561212662 017701� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/jpeg/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) 116c116 < CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch init.c" --- > CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch" 118c118 < CLEANFILES="init.c" --- > CLEANFILES="" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/gif/configure.in������������������������������������������������������������������000644 �000765 �000000 �00000001052 12561212662 017520� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/gif/configure.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 4c4 < AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) --- > AC_REVISION($Id: configure.in,v 1.1 2015/08/07 20:31:46 joye Exp $) 109c109 < CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch init.c" --- > CLEANFILES="*.lib *.dll *.exp *.ilk *.pdb vc*.pch" 111c111 < CLEANFILES="init.c" --- > CLEANFILES="" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libjpeg/�������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 017344� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/�������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 017347� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/configure.ac�������������������������������������������������������000644 �000765 �000000 �00000001654 11540224501 021631� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.ac =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/compat/libtiff/configure.ac,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 27c27 < AC_PREREQ(2.64) --- > AC_PREREQ([2.68]) 644,661d643 < build/Makefile \ < contrib/Makefile \ < contrib/acorn/Makefile \ < contrib/addtiffo/Makefile \ < contrib/dbs/Makefile \ < contrib/dbs/xtiff/Makefile \ < contrib/iptcutil/Makefile \ < contrib/mac-cw/Makefile \ < contrib/mac-mpw/Makefile \ < contrib/mfs/Makefile \ < contrib/pds/Makefile \ < contrib/ras/Makefile \ < contrib/stream/Makefile \ < contrib/tags/Makefile \ < contrib/win_dib/Makefile \ < html/Makefile \ < html/images/Makefile \ < html/man/Makefile \ 663d644 < man/Makefile \ 665,666c646 < test/Makefile \ < tools/Makefile]) --- > ]) ������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/libtiff/�����������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 020766� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/Makefile.am��������������������������������������������������������000644 �000765 �000000 �00000000476 11540224501 021400� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: Makefile.am =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/compat/libtiff/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 50c50 < SUBDIRS = port libtiff tools build contrib test man html --- > SUBDIRS = port libtiff ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/Makefile.in��������������������������������������������������������000644 �000765 �000000 �00000003266 12142246475 021426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: Makefile.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/compat/libtiff/Makefile.in,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 1c1 < # Makefile.in generated by automake 1.11 from Makefile.am. --- > # Makefile.in generated by automake 1.11.1 from Makefile.am. 66,69c66,69 < $(top_srcdir)/configure ChangeLog TODO config/compile \ < config/config.guess config/config.sub config/depcomp \ < config/install-sh config/ltmain.sh config/missing \ < config/mkinstalldirs --- > $(top_srcdir)/configure ChangeLog TODO config.guess config.sub \ > config/compile config/config.guess config/config.sub \ > config/depcomp config/install-sh config/ltmain.sh \ > config/missing config/mkinstalldirs 333c333 < SUBDIRS = port libtiff tools build contrib test man html --- > SUBDIRS = port libtiff 408c408 < @failcom='exit 1'; \ --- > @fail= failcom='exit 1'; \ 433c433 < @failcom='exit 1'; \ --- > @fail= failcom='exit 1'; \ 597c597,598 < || find "$(distdir)" -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ --- > || find "$(distdir)" -type d ! -perm -755 \ > -exec chmod u+rwx,go+rx {} \; -o \ 642c643 < GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ --- > GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ 644c645 < bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ --- > bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ 646c647 < unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ --- > lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ 652c653 < GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ --- > GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libtiff/libtiff/tif_unix.c�������������������������������������������������000644 �000765 �000000 �00000000652 11607101276 022757� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tif_unix.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/compat/libtiff/libtiff/tif_unix.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 1c1 < /* $Id: tif_unix.c,v 1.1 2011/07/12 17:22:06 joye Exp $ */ --- > /* $Id: tif_unix.c,v 1.1 2011/07/12 17:22:06 joye Exp $ */ 184c184,185 < #ifdef __WIN32__ --- > /*#ifdef __WIN32__*/ > #if 0 ��������������������������������������������������������������������������������������saods9/mods/tkimg/compat/libjpeg/jconfig.cfg��������������������������������������������������������000644 �000765 �000000 �00000000632 11607114235 021441� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: jconfig.cfg =================================================================== RCS file: /proj/rd/cvsroot/saods9/tkimg1.4/compat/libjpeg/jconfig.cfg,v retrieving revision 1.1 retrieving revision 1.4 diff -r1.1 -r1.4 21a22 > #ifndef HAVE_BOOLEAN 25c26,27 < #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ --- > #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ > #endif ������������������������������������������������������������������������������������������������������saods9/mods/tkcon/tkcon.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000004127 10772712653 016304� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tkcon.tcl =================================================================== RCS file: /proj/rd/cvsroot/saods9/src/tkcon.tcl,v retrieving revision 1.1 retrieving revision 1.4 diff -r1.1 -r1.4 70a71,73 > # namespace variable used by C conputs routine (saotk/util/conputs.c) > set tkcon_showing unknown > 86a90 > 189c193 < RCS {RCS: @(#) $Id: tkcon.tcl,v 1.3 2008/03/27 12:40:11 eric Exp $} --- > RCS {RCS: @(#) $Id: tkcon.tcl,v 1.3 2008/03/27 12:40:11 eric Exp $} 809c813 < exit --- > 1382c1386,1388 < $m add command -label "Quit" -underline 0 -accel Ctrl-q -command exit --- > # egm 3/20/08 > # $m add command -label "Quit" -underline 0 -accel Ctrl-q -command exit > $m add command -label "Close" -underline 0 -accel Ctrl-q -command {::tkcon::HideConsole} 1411c1417,1418 < $m add command -label "Close Console" -underline 0 -accel Ctrl-w \ --- > # egm 3/20/08 > # $m add command -label "Close Console" -underline 0 -accel Ctrl-w \ 1412a1420,1421 > $m add command -label "Close Console" -underline 0 -accel Ctrl-w \ > -command {::tkcon::HideConsole} 4886c4895,4897 < bind $PRIV(root) <<TkCon_Exit>> exit --- > # egm 3/20/08 > # bind $PRIV(root) <<TkCon_Exit>> exit > bind $PRIV(root) <<TkCon_Exit>> { ::tkcon::HideConsole } 4891c4902,4904 < bind $PRIV(root) <<TkCon_Close>> { ::tkcon::Destroy } --- > # egm 3/20/08 > # bind $PRIV(root) <<TkCon_Close>> { ::tkcon::Destroy } > bind $PRIV(root) <<TkCon_Close>> { ::tkcon::HideConsole } 6161a6175,6206 > proc ::tkcon::ShowConsole {} { > global tkcon_showing > switch $tkcon_showing { > unknown { > set ::tkcon::OPT(exec) {} > tkcon::Init > set tkcon_showing true > } > false { > interp alias {} ::puts {} ::tkcon_puts > tkcon show > set tkcon_showing true > } > true { } > } > # invoke debug menu if not open > DebugMenu > } > > proc ::tkcon::HideConsole {} { > global tkcon_showing > switch $tkcon_showing { > unknown { } > false { } > true { > interp alias {} ::puts {} ::tkcon_tcl_puts > tkcon hide > set tkcon_showing false > } > } > } > �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/generic/��������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015620� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/library/��������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015650� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/macosx/���������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015476� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/macosx/tkMacOSXXStubs.c�����������������������������������������������������������000644 �000765 �000000 �00000001152 12544531117 020442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tkMacOSXXStubs.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tk8.6.4/macosx/tkMacOSXXStubs.c,v retrieving revision 1.1 retrieving revision 1.3 diff -r1.1 -r1.3 885a886 > /* 892a894,900 > */ > if ( bitmap_rep == Nil || > [bitmap_rep samplesPerPixel] != 4 || > [bitmap_rep isPlanar] != 0 ) { > TkMacOSXDbgMsg("XGetImage: Failed to construct NSBitmapRep"); > return NULL; > } 898a907 > /* 901a911,913 > */ > if ( [bitmap_rep isPlanar ] == 0 && > [bitmap_rep samplesPerPixel] == 4 ) { ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/library/tkfbox.tcl����������������������������������������������������������������000644 �000765 �000000 �00000000661 12144243241 017645� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������751c751,761 < if {[catch {file exists $path}]} { --- > # we want to strip any filtering/ext/blocking instructions > # from the file name > > set aa [string first "\[" $path] > if {$aa > 0} { > set fn [string range $path 0 [expr $aa-1]] > } else { > set fn $path > } > > if {[catch {file exists $fn}]} { 760c770 < if {[file exists $path]} { --- > if {[file exists $fn]} { �������������������������������������������������������������������������������saods9/mods/tk8.6/library/xmfbox.tcl����������������������������������������������������������������000644 �000765 �000000 �00000005402 12424000472 017647� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������184c184 < frame $f --- > ttk::frame $f 190c190 < radiobutton $f.b$cnt \ --- > ttk::radiobutton $f.b$cnt \ 330,331c330,331 < set top [frame $w.top -relief raised -bd 1] < set bot [frame $w.bot -relief raised -bd 1] --- > set top [ttk::frame $w.top -relief raised -borderwidth 1] > set bot [ttk::frame $w.bot -relief raised -borderwidth 1] 336,338c336,338 < set f1 [frame $top.f1] < set f2 [frame $top.f2] < set f3 [frame $top.f3] --- > set f1 [ttk::frame $top.f1] > set f2 [ttk::frame $top.f2] > set f3 [ttk::frame $top.f3] 344,345c344,345 < set f2a [frame $f2.a] < set f2b [frame $f2.b] --- > set f2a [ttk::frame $f2.a] > set f2b [ttk::frame $f2.b] 357c357 < bind [::tk::AmpWidget label $f1.lab -text [mc "Fil&ter:"] -anchor w] \ --- > bind [::tk::AmpWidget ttk::label $f1.lab -text [mc "Fil&ter:"] -anchor w] \ 359c359 < entry $f1.ent --- > ttk::entry $f1.ent 373c373 < bind [::tk::AmpWidget label $f3.lab -text [mc "&Selection:"] -anchor w] \ --- > bind [::tk::AmpWidget ttk::label $f3.lab -text [mc "&Selection:"] -anchor w] \ 375c375 < entry $f3.ent --- > ttk::entry $f3.ent 384c384 < set data(okBtn) [::tk::AmpWidget button $bot.ok -text [mc "&OK"] \ --- > set data(okBtn) [::tk::AmpWidget ttk::button $bot.ok -text [mc "&OK"] \ 387c387 < set data(filterBtn) [::tk::AmpWidget button $bot.filter -text [mc "&Filter"] \ --- > set data(filterBtn) [::tk::AmpWidget ttk::button $bot.filter -text [mc "&Filter"] \ 390c390 < set data(cancelBtn) [::tk::AmpWidget button $bot.cancel -text [mc "&Cancel"] \ --- > set data(cancelBtn) [::tk::AmpWidget ttk::button $bot.cancel -text [mc "&Cancel"] \ 437c437 < bind [::tk::AmpWidget label $f.lab -text $label -anchor w] \ --- > bind [::tk::AmpWidget ttk::label $f.lab -text $label -anchor w] \ 441,442c441,442 < scrollbar $f.v -orient vertical -takefocus 0 -command [list $f.l yview] < scrollbar $f.h -orient horizontal -takefocus 0 -command [list $f.l xview] --- > ttk::scrollbar $f.v -orient vertical -takefocus 0 -command [list $f.l yview] > ttk::scrollbar $f.h -orient horizontal -takefocus 0 -command [list $f.l xview] 742c742 < $data(fEnt) xview end --- > # $data(fEnt) xview end 753c753 < $data(sEnt) xview end --- > # $data(sEnt) xview end 849c849,859 < if {![file exists $item]} { --- > # we want to strip any filtering/ext/blocking instructions > # from the file name > > set aa [string first "\[" $item] > if {$aa > 0} { > set fn [string range $item 0 [expr $aa-1]] > } else { > set fn $item > } > > if {![file exists $fn]} { 852c862 < -message [mc {File "%1$s" does not exist.} $item] --- > -message [mc {File "%1$s" does not exist.} $fn] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/generic/tkArgv.c������������������������������������������������������������������000644 �000765 �000000 �00000000656 12517723510 017230� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tkArgv.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tk8.6.4/generic/tkArgv.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 22,23c22,23 < {"-help", TK_ARGV_HELP, NULL, NULL, < "Print summary of command-line options and abort"}, --- > /* {"-help", TK_ARGV_HELP, NULL, NULL, > "Print summary of command-line options and abort"},*/ ����������������������������������������������������������������������������������saods9/mods/tk8.6/generic/tkCanvPs.c����������������������������������������������������������������000644 �000765 �000000 �00000002145 12517723510 017516� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tkCanvPs.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tk8.6.4/generic/tkCanvPs.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 18a19,22 > /*** waj ***/ > float psScale =1; > /*** waj ***/ > 365a370 > result = TCL_ERROR; 370a376 > result = TCL_ERROR; 461c467 < + 1.0), --- > + 0.0), 463c469 < + 1.0)); --- > + 0.0)); 469c475 < (int) (psInfo.pageX - psInfo.scale*deltaY + 1.0), --- > (int) (psInfo.pageX - psInfo.scale*deltaY + 0.0), 471c477 < + 1.0)); --- > + 0.0)); 546a553,563 > /*** waj ***/ > Tcl_AppendPrintfToObj(psObj, "%g %g translate\n", > (Tk_PostscriptY((double) psInfo.x,(Tk_PostscriptInfo) &psInfo) - > Tk_PostscriptY((double) psInfo.x2,(Tk_PostscriptInfo) &psInfo)) > *(1.-psScale)/2., > (Tk_PostscriptY((double) psInfo.y,(Tk_PostscriptInfo) &psInfo) - > Tk_PostscriptY((double) psInfo.y2,(Tk_PostscriptInfo) &psInfo)) > *(1.-psScale)/2.); > > Tcl_AppendPrintfToObj(psObj, "%.4g %.4g scale\n", psScale, psScale); > /*** waj ***/ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tk8.6/generic/tkGC.c��������������������������������������������������������������������000644 �000765 �000000 �00000000426 12517723510 016615� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tkGC.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tk8.6.4/generic/tkGC.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 31a32 > unsigned long mask; 99a101 > valueKey.mask = valueMask; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tclxml/configure������������������������������������������������������������������������000644 �000765 �000000 �00000002157 12140302340 016527� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tclxml-3.2/configure =================================================================== RCS file: /proj/rd/cvsroot/saods9/tclxml-3.2/configure,v retrieving revision 1.1 retrieving revision 1.3 diff -r1.1 -r1.3 1810c1810 < *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) --- > *win32*|*WIN32*|*MINGW32_*) 6554c6554,6555 < vars="tclxml.c docObj.c tclxml-libxml2.c nodeObj.c tcldom-libxml2.c tclxslt-libxslt.c" --- > # vars="tclxml.c docObj.c tclxml-libxml2.c nodeObj.c tcldom-libxml2.c tclxslt-libxslt.c" > vars="tclxml.c docObj.c tclxml-libxml2.c" 6588c6589,6590 < vars="include/tclxml-libxml2/docObj.h include/tclxml-libxml2/tclxml-libxml2.h include/tcldom/tcldom.h include/tcldom-libxml2/tcldom-libxml2.h include/tclxslt/tclxslt.h" --- > # vars="include/tclxml-libxml2/docObj.h include/tclxml-libxml2/tclxml-libxml2.h include/tcldom/tcldom.h include/tcldom-libxml2/tcldom-libxml2.h include/tclxslt/tclxslt.h" > vars="include/tclxml-libxml2/docObj.h include/tclxml-libxml2/tclxml-libxml2.h" 10326c10328 < FIX_LIB="chcon -t texrel_shlib_t" --- > # FIX_LIB="chcon -t texrel_shlib_t" �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/tclxml/tclxml.c�������������������������������������������������������������������������000644 �000765 �000000 �00000000603 11153332707 016301� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: tclxml.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/tclxml-3.2/tclxml.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 13c13 < * $Id: tclxml.c,v 1.1 2009/03/03 22:57:11 joye Exp $ --- > * $Id: tclxml.c,v 1.1 2009/03/03 22:57:11 joye Exp $ 228a229 > /* 236a238 > */ 251a254 > /* 258a262 > */ �����������������������������������������������������������������������������������������������������������������������������saods9/mods/tcllib/configure������������������������������������������������������������������������000644 �000765 �000000 �00000000712 10726043107 016503� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure =================================================================== RCS file: /proj/rd/cvsroot/saods9/tcllib-1.10/configure,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 559c559 < search_path=`echo ${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin:${PATH} | sed -e 's/:/ /g'` --- > search_path=`echo ${PATH}:${exec_prefix}/bin:${prefix}/bin:${TCL_BIN_DIR}:${TCL_BIN_DIR}/../bin | sed -e 's/:/ /g'` ������������������������������������������������������saods9/mods/rice/ricecomp.c�������������������������������������������������������������������������000644 �000765 �000000 �00000000543 11277317551 016230� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: ricecomp.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/rice/ricecomp.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 38c38,40 < #include "fitsio2.h" --- > /*#include "fitsio2.h"*/ > #define FFLOCK > #define FFUNLOCK 886c888 < FFUNLOCK; --- > FFUNLOCK; �������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/configure��������������������������������������������������������������������������000644 �000765 �000000 �00000001307 11401266631 016177� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/configure,v retrieving revision 1.1 retrieving revision 1.3 diff -r1.1 -r1.3 536c536 < # $Revision: 1.2 $ --- > # $Revision: 1.2 $ 1137c1137 < if test "$enable_shared" = "yes"; then --- > #if test "$enable_shared" = "yes"; then 1157c1157 < fi --- > #fi 1290c1290 < if test "$enable_shared" = "yes"; then --- > #if test "$enable_shared" = "yes"; then 1309c1309 < fi --- > #fi 2695c2695 < TARGET_X_LIBS="-mwindows -e _mainCRTStartup" --- > TARGET_X_LIBS="-mwindows -e _mainCRTStartup -limm32 -lcomctl32" 2700,2701c2700,2701 < < --- > . $tkconf > TARGET_X_LIBS="${TK_LIBS}" �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/configure.in�����������������������������������������������������������������������000644 �000765 �000000 �00000000577 10424203174 016611� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: configure.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/configure.in,v retrieving revision 1.1 diff -r1.1 configure.in 167c167 < # $Revision: 1.1 $ --- > # $Revision: 1.1 $ 649c649 < TARGET_X_LIBS="-mwindows -e _mainCRTStartup" --- > TARGET_X_LIBS="-mwindows -e _mainCRTStartup -limm32 -lcomctl32" ���������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/htmlcmd.c��������������������������������������������������������������������������000644 �000765 �000000 �00000001762 11344041522 016070� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: htmlcmd.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/src/htmlcmd.c,v retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 1c1 < static char const rcsid[] = "@(#) $Id: htmlcmd.c,v 1.1 2010/03/04 23:33:38 joye Exp $"; --- > static char const rcsid[] = "@(#) $Id: htmlcmd.c,v 1.1 2010/03/04 23:33:38 joye Exp $"; 301c301,323 < }else{ --- > } else if( argc==4 && !strncmp(argv[2],"text",4)) { > HtmlElement *p; > int i; > > HtmlLock(htmlPtr); > if( HtmlGetIndex(htmlPtr, argv[3], &p, &i)!=0 ){ > if( !HtmlUnlock(htmlPtr) ){ > Tcl_AppendResult(interp,"malformed index: \"", argv[3], "\"", 0); > } > TestPoint(0); > return TCL_ERROR; > } > if( !HtmlUnlock(htmlPtr) && p ){ > if( p->base.type==Html_Text ) { > int offset = p->text.y-20; > if (offset<0) > offset = 0; > HtmlVerticalScroll(htmlPtr, offset); > } > TestPoint(0); > } > } > else{ ��������������saods9/mods/html/htmlurl.c��������������������������������������������������������������������������000644 �000765 �000000 �00000003020 12372225665 016132� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: htmlurl.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/src/htmlurl.c,v retrieving revision 1.1 retrieving revision 1.4 diff -r1.1 -r1.4 1c1 < static char const rcsid[] = "@(#) $Id: htmlurl.c,v 1.2 2014/08/11 20:46:45 joye Exp $"; --- > static char const rcsid[] = "@(#) $Id: htmlurl.c,v 1.2 2014/08/11 20:46:45 joye Exp $"; 84a85,86 > if(!n) > return NULL; 119c121,123 < n = ComponentLength(zUri, "", "?# "); --- > /* allow spaces in path */ > /* n = ComponentLength(zUri, "", "?# ");*/ > n = ComponentLength(zUri, "", "?#"); 315,316c319,326 < strcpy(&zBuf[i+1], &zBuf[i+3]); < i--; --- > // strcpy into same buf is undefined > // strcpy(&zBuf[i+1], &zBuf[i+3]); > int ll = strlen(zBuf+i+3)+1; > char* tmp = malloc(ll); > strncpy(tmp,zBuf+i+3,ll); > strcpy(zBuf+i+1, tmp); > free(tmp); > i--; 327c337,343 < strcpy(&zBuf[j+1], &zBuf[i+4]); --- > // strcpy into same buf is undefined > // strcpy(&zBuf[j+1], &zBuf[i+4]); > int ll = strlen(zBuf+i+4)+1; > char* tmp = malloc(ll); > strncpy(tmp,zBuf+i+4,ll); > strcpy(zBuf+j+1, tmp); > free(tmp); 335a352,361 > /* look for /../ at begining */ > if (!strncmp(zBuf,"/../",4)) { > // strcpy into same buf is undefined > // strcpy(zBuf,zBuf+3); > int ll = strlen(zBuf+3)+1; > char* tmp = malloc(ll); > strncpy(tmp,zBuf+3,ll); > strcpy(zBuf, tmp); > free(tmp); > } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/htmlwidget.c�����������������������������������������������������������������������000644 �000765 �000000 �00000002400 12372500466 016607� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: htmlwidget.c =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/src/htmlwidget.c,v retrieving revision 1.1 diff -r1.1 htmlwidget.c 1c1 < static char const rcsid[] = "@(#) $Id: htmlwidget.c,v 1.5 2014/08/12 21:03:50 joye Exp $"; --- > static char const rcsid[] = "@(#) $Id: htmlwidget.c,v 1.5 2014/08/12 21:03:50 joye Exp $"; 91c91 < {TK_CONFIG_PIXELS, "-height", "height", "Hidth", --- > {TK_CONFIG_PIXELS, "-height", "height", "Height", 1429a1430,1436 > > /* trucate any spaces on the end */ > while (n>0 && zColor[n-1]==' ') { > zColor[n-1] = '\0'; > n--; > } > 1547a1555 > /* 1549a1558,1561 > */ > > XColor* q; > q = Tk_GetColorByValue(htmlPtr->clipwin, pRef); 1551a1564 > /* 1554a1568 > */ 1556a1571 > /* 1558a1574,1577 > */ > if (p && (q->red == p->red) > && (q->green == p->green) > && (q->blue == p->blue)) { 1559a1579 > Tk_FreeColor(q); 1562a1583 > Tk_FreeColor(q); 1657a1679 > #if 0 1660a1683 > #endif 1662a1686 > #if 0 1683a1708,1709 > #endif > HtmlRedrawArea(htmlPtr, 0, 0, w, h); 1725c1751 < { "text", "ascii", 5, 5, "START END", 0 }, --- > { "text", "ascii", 5, 5, "START END", HtmlTextAsciiCmd}, ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/makemake.tcl.in��������������������������������������������������������������������000644 �000765 �000000 �00000003153 10334237023 017155� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: makemake.tcl.in =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/makemake.tcl.in,v retrieving revision 1.1 retrieving revision 1.8 diff -r1.1 -r1.8 15c15 < # $Revision: 1.3 $ --- > # $Revision: 1.3 $ 112a113 > append link " @TARGET_X_INC@" 116a118 > append link " @TARGET_X_INC@" 121a124 > append link " @TARGET_X_INC@" 127a131 > append link " @TARGET_X_INC@" 147a152 > append cc " @TARGET_X_INC@" 166c171 < set link "@TARGET_SHLIB_LINK@" --- > set link {@TARGET_SHLIB_LINK@} 194a200 > append cc " @TARGET_X_INC@" 272c278 < puts " echo '@TARGET_TCL_SCRIPT_DIR@/'*.tcl >>$n" --- > puts " echo @TARGET_TCL_SCRIPT_DIR@/*.tcl >>$n" 275c281 < puts " echo '@TARGET_TK_SCRIPT_DIR@/'*.tcl >>$n" --- > puts " echo @TARGET_TK_SCRIPT_DIR@/*.tcl >>$n" 296a303 > puts ".NOTPARALLEL :" 321a329 > src/htmlexts 359c367,368 < lappend all tkhtml.so --- > lappend all tkhtml@TARGET_SHLIB_EXT@ > # lappend all tkhtml.so 372a382,384 > if {$BEXE == ".exe"} { > puts "\t$BTCLSH \'[exec cygpath -w [Src tools/maketokens.tcl]]\' \'[exec cygpath -w [Src src/tokenlist.txt]]\' >htmltokens.c" > } else { 373a386 > } 379,380c392,395 < puts "pkgIndex.tcl: tkhtml.so" < puts "\techo 'pkg_mkIndex . tkhtml.so' | $BTCLSH" --- > puts "pkgIndex.tcl: tkhtml@TARGET_SHLIB_EXT@" > #puts "pkgIndex.tcl: tkhtml.so" > puts "\techo 'pkg_mkIndex . tkhtml.@TARGET_SHLIB_EXT@' | $BTCLSH" > #puts "\techo 'pkg_mkIndex . tkhtml.so' | $BTCLSH" 424c439,440 < puts " cp tkhtml.so $LIBDIR" --- > puts " cp tkhtml@TARGET_SHLIB_EXT@ $LIBDIR" > #puts " cp tkhtml.so $LIBDIR" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/html/maketokens.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000000524 10423760175 017145� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������Index: maketokens.tcl =================================================================== RCS file: /proj/rd/cvsroot/saods9/htmlwidget/tools/maketokens.tcl,v retrieving revision 1.1.1.1 diff -r1.1.1.1 maketokens.tcl 27a28,32 > global tcl_platform > if {$tcl_platform(platform) == "windows"} { > fconfigure stdout -translation lf > } > ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/mods/flex/FlexLexer.h������������������������������������������������������������������������000644 �000765 �000000 �00000000050 10051215130 016312� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������118a119,120 > void begin(int,int); > ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/aclocal.m4����������������������������������������������������������������������������000755 �000765 �000000 �00000001020 12562427127 015522� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # AC_DEFUN(SAO_CONFIG_DIR, [ sao_config_dir="$1" sao_config_arguments="$2" sao_popdir=`pwd` cd $sao_config_dir echo "" echo "*** Configure $1 ***" echo "running ${CONFIG_SHELL-/bin/sh} ./configure $sao_sub_configure_args $sao_config_arguments" ${CONFIG_SHELL-/bin/sh} ./configure $sao_sub_configure_args $sao_config_arguments cd $sao_popdir ]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/configure�����������������������������������������������������������������������������000755 �000765 �000000 �00000254275 12562707334 015615� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for saods9 7.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='saods9' PACKAGE_TARNAME='saods9' PACKAGE_VERSION='7.4' PACKAGE_STRING='saods9 7.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS ROOT ARCH OS PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_arch ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures saods9 7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/saods9] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of saods9 7.4:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-arch build name Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF saods9 configure 7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Check whether --with-arch was given. if test "${with_arch+set}" = set; then : withval=$with_arch; else with_arch=unknown fi OS="macosx" ARCH=$with_arch ROOT=$ac_pwd ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by saods9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ saods9 config.status 7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/configure.in��������������������������������������������������������������������������000755 �000765 �000000 �00000000743 12562707334 016207� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. AC_INIT([saods9], [7.4]) TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) AC_ARG_WITH([arch],AC_HELP_STRING([--with-arch],[build name]),[],[with_arch=unknown]) OS="macosx" AC_SUBST(OS) ARCH=$with_arch AC_SUBST(ARCH) ROOT=$ac_pwd AC_SUBST(ROOT) AC_OUTPUT([Makefile]) �����������������������������saods9/macosx/Makefile.in���������������������������������������������������������������������������000644 �000765 �000000 �00000006346 12632345556 015747� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������OS = @OS@ ARCH = @ARCH@ ROOT = @ROOT@ JOBS = 4 include ./make.include #--------------------------defines DS9APP =SAOImage\ DS9\ $(DS9VERSION) TCLFILES= \ $(TCLDIR)/generic/tcl.h \ $(TCLDIR)/generic/tclDecls.h \ $(TCLDIR)/generic/tclPlatDecls.h TKFILES = \ $(TKDIR)/generic/tk.h \ $(TKDIR)/generic/tkDecls.h \ $(TKDIR)/generic/tkPlatDecls.h \ $(TKDIR)/generic/tkIntXlibDecls.h \ $(TKDIR)/macosx/tkMacOSX.h WITHTCL =--with-tcl=$(ROOT)/build/tcl/Development WITHTK =--with-tk=$(ROOT)/build/tk/Development $(WITHTCL) #--------------------------build .PHONY : saods9 tcl tk tkmacosx saods9 : dirs tcl tk \ tclcheckdns tcliis tclsignal \ tclzvfs tclxml xmlrpc xpa \ tkblt tktable tkimg \ tkmpeg tkhtml tkcon \ tkmacosx \ tksao ds9 tcl : $(TCLDIR)/macosx/Makefile @echo "" @echo "*** Install $(TCLDIR) ***" $(MAKE) -C $(TCLDIR)/macosx -j $(JOBS) # install include, lib cp -p $(TCLFILES) include/. cp -p build/tcl/Tcl.framework/libtclstub8.6.a lib/. cp -rp build/tcl/Tcl.framework/Versions/8.6/Resources/Scripts lib/tcl8.6 cp -rp build/tcl/Tcl.framework/Versions/8.6/Resources/tcl8 lib/. # we need a working tclsh later cp -p build/tcl/tclsh8.6 bin/. install_name_tool -change /Library/Frameworks/Tcl.framework/Versions/8.6/Tcl @executable_path/../build/tcl/Tcl.framework/Tcl bin/tclsh8.6 $(TCLDIR)/macosx/Makefile : @echo "" @echo "*** Configure $(TCLDIR) ***" cd $(TCLDIR)/macosx; \ ./configure \ --enable-64bit \ --enable-symbols \ --config-cache --cache-file=../../config.cache tk : $(TKDIR)/macosx/Makefile @echo "" @echo "*** Installing $(TKDIR) ***" $(MAKE) -C $(TKDIR)/macosx -j $(JOBS) # install include, lib cp -p $(TKFILES) include/. cp -p build/tk/Tk.framework/libtkstub8.6.a lib/. cp -rp build/tk/Tk.framework/Versions/8.6/Resources/Scripts lib/tk8.6 # fix wish8.6 cp -p build/tk/wish8.6 bin/. install_name_tool -change /Library/Frameworks/Tcl.framework/Versions/8.6/Tcl @executable_path/../build/tcl/Tcl.framework/Tcl bin/wish8.6 install_name_tool -change /Library/Frameworks/Tk.framework/Versions/8.6/Tk @executable_path/../build/tk/Tk.framework/Tk bin/wish8.6 $(TKDIR)/macosx/Makefile : @echo "" @echo "*** Configure $(TKDIR) ***" cd $(TKDIR)/macosx; \ ./configure \ $(WITHTCL) \ --enable-64bit \ --enable-symbols \ --config-cache --cache-file=../../config.cache tkmacosx: $(TKMACOSXDIR)/Makefile @echo "" @echo "*** Installing $(TKMACOSXDIR) ***" $(MAKE) -C $(TKMACOSXDIR) -j $(JOBS) install $(TKMACOSXDIR)/Makefile : @echo "" @echo "*** Configure $(TKMACOSXDIR) ***" cd $(TKMACOSXDIR); \ ./configure \ $(WITHTK) \ --prefix $(ROOT) --exec-prefix $(ROOT) \ --disable-shared --enable-symbols \ --config-cache --cache-file=../../config.cache #--------------------------clean .PHONY : tkmacosxclean tkmacosxclean : $(MAKE) -C $(TKMACOSXDIR) clean #--------------------------distclean .PHONY : tkmacosxdistclean tkmacosxdistclean : $(MAKE) -C $(TKMACOSXDIR) distclean #--------------------------distribution .PHONY : dist dist : rm -rf dist/$(DS9APP) rm -rf dist/$(DS9APP).dmg mkdir dist/$(DS9APP) ln -s /Applications dist/$(DS9APP)/. cp -r ds9/macosx/README dist/$(DS9APP)/. cp -rp bin/SAOImage\ DS9.app dist/$(DS9APP)/. hdiutil create -srcfolder dist/$(DS9APP) dist/$(DS9APP) rm -rf dist/$(DS9APP) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/tclconfig/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 015632� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/tclconfig/ChangeLog�������������������������������������������������������������������000644 �000765 �000000 �00000106605 12562426762 017424� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/macosx/tclconfig/install-sh������������������������������������������������������������������000755 �000765 �000000 �00000033054 12562426762 017653� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/tclconfig/README.txt������������������������������������������������������������������000644 �000765 �000000 �00000001454 12562426762 017344� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/macosx/tclconfig/tcl.m4����������������������������������������������������������������������000644 �000765 �000000 �00000404642 12562426762 016700� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ����������������������������������������������������������������������������������������������saods9/ds9/cmaps/�����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014171� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/�������������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 013633� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014532� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/����������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014360� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/������������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014037� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/��������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014701� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/������������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014051� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/util/������������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014043� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/�������������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602227 013664� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/about.txt����������������������������������������������������������������������������000644 �000765 �000000 �00000000230 11370071032 015520� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������SAOImage DS9 installation program. For futher information, please visit us at http://hea-www.harvard.edu/RD/ds9 or contact us at saord@cfa.harvard.edu. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/buttons.bmp��������������������������������������������������������������������������000644 �000765 �000000 �00000001516 11607122125 016056� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������BMN������v���(���4�������������������������������������������������������������������ffffffffffffffffffffffffff�ff""ffffb"&ffff""ffffb"&ff�f"33"ffb#32&ff"33"ffb#32&fa3DD3&f4DC2fa3ff3&f6fc2f�aTDDC&fDDD2faVffc&ffff2fGDDDD2aTD�DC&ffff2aVf�fc&KDDDD2aT@�C&ffff2aV`�c&DDDD2aT@�C&ffff2aV`�c&DDDD2aTD�DC&ffff2aVf�fc&aTDDC&fDDD2faVffc&ffff2f�aUDDU&fTDERfaUffU&fVfeRf�fUUffaUQffUUffaUQfffffffaffffffffaff""""""""""""""""""""""""""�33333!33333233333!333332DDDDC!TDDDD2ffffc!Vffff2 DDDDC!TDDD2ffffc!Vfff2DDDDC!T@�DD2ffffc!V`�ff2��DDDDC!T��D2ffffc!V��f2�DDDDC!T�@�D2ffffc!V�`�f2�DDDDC!TD�2ffffc!Vf�2DDDDC!TDD@2ffffc!Vff`2 DDDDC!TDDD2ffffc!Vfff2LoDDDDC!TDDDD2ffffc!Vffff2�UUUUS!UUUUU2UUUUS!UUUUU2!!6�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/ds9.C��������������������������������������������������������������������������������000644 �000765 �000000 �00000012275 12601025232 014463� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <stdlib.h> #include <iostream> #include <sstream> using namespace std; #include <tcl.h> #include <tk.h> #define DEBUGS(x) {FILE* fp=fopen("/Users/joye/debug.txt","a+");fprintf(fp,"%s\n",x);fclose(fp);} extern "C" { int SAOAppInit(Tcl_Interp *interp); int SAOLocalMainHook(int* argc, char*** argv); void TclSetStartupScriptFileName(const char*); int Tkblt_Init(Tcl_Interp*); int Tktable_Init(Tcl_Interp*); int Tclcheckdns_Init(Tcl_Interp*); int Tksao_Init(Tcl_Interp*); int Tkhtml_Init(Tcl_Interp*); int Tkmpeg_Init(Tcl_Interp*); int Tkimg_Init(Tcl_Interp*); int Zlibtcl_Init(Tcl_Interp*); int Jpegtcl_Init(Tcl_Interp*); int Tkimgjpeg_Init(Tcl_Interp*); int Tifftcl_Init(Tcl_Interp*); int Tkimgtiff_Init(Tcl_Interp*); int Pngtcl_Init(Tcl_Interp*); int Tkimgpng_Init(Tcl_Interp*); int Tkimggif_Init(Tcl_Interp*); int Tkimgwindow_Init(Tcl_Interp*); int Tclxpa_Init(Tcl_Interp*); int Iis_Init(Tcl_Interp*); int Tclxml_Init(Tcl_Interp*); int Tclxml_libxml2_Init(Tcl_Interp*); // int Signal_ext_Init(Tcl_Interp*); // int Tkwin32_Init(Tcl_Interp*); #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN } Tcl_Interp *global_interp; void internalError(const char* msg) { Tcl_SetVar2(global_interp, "ds9", "msg", msg, TCL_GLOBAL_ONLY); Tcl_SetVar2(global_interp, "ds9", "msg,level", "error", TCL_GLOBAL_ONLY); } int SAOLocalMainHook(int* argcPtr, char*** argvPtr) { // sync C++ io calls with C io calls ios::sync_with_stdio(); // do this first Tcl_FindExecutable((*argvPtr)[0]); // startup script // use exec path int argc=*argcPtr; char** argv = *argvPtr; char ss[PATHSIZE]; strncpy(ss,argv[0],PATHSIZE); // and add path strncat(ss,"/library/ds9.tcl",PATHSIZE); Tcl_Obj *path = Tcl_NewStringObj(ss,-1); Tcl_SetStartupScript(path, NULL); return TCL_OK; } int SAOAppInit(Tcl_Interp *interp) { // save interp for cputs function global_interp = interp; // Initialize Tcl and Tk if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tk if (Tk_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp,"Tk", Tk_Init, Tk_SafeInit); // Tkblt if (Tkblt_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp, "tkblt", Tkblt_Init, (Tcl_PackageInitProc*)NULL); // Tktable if (Tktable_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tktable", Tktable_Init, (Tcl_PackageInitProc*)NULL); // Tksao if (Tksao_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tksao", Tksao_Init, (Tcl_PackageInitProc*)NULL); // Tkhtml if (Tkhtml_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkhtml", Tkhtml_Init, (Tcl_PackageInitProc*)NULL); // Tclxpa if (Tclxpa_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tclxpa", Tclxpa_Init, (Tcl_PackageInitProc*)NULL); // Tclxml if (Tclxml_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tkimg if (Tkimg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "img", Tkimg_Init, (Tcl_PackageInitProc*)NULL); // zlibtcl if (Zlibtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "zlibtcl", Zlibtcl_Init, (Tcl_PackageInitProc*)NULL); // jpegtcl if (Jpegtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpegtcl", Jpegtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgjpeg if (Tkimgjpeg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpeg", Tkimgjpeg_Init, (Tcl_PackageInitProc*)NULL); // Tifftcl if (Tifftcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tifftcl", Tifftcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgtiff if (Tkimgtiff_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tiff", Tkimgtiff_Init, (Tcl_PackageInitProc*)NULL); // Pngtcl if (Pngtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "pngtcl", Pngtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgpng if (Tkimgpng_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "png", Tkimgpng_Init, (Tcl_PackageInitProc*)NULL); // Tkimggif if (Tkimggif_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "gif", Tkimggif_Init, (Tcl_PackageInitProc*)NULL); // Tkimgwindow if (Tkimgwindow_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "window", Tkimgwindow_Init, (Tcl_PackageInitProc*)NULL); // Signal_Ext /* if (Signal_ext_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "signal", Signal_ext_Init, (Tcl_PackageInitProc*)NULL); */ // Tkwin32 /* if (Tkwin32_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkwin32", Tkwin32_Init, (Tcl_PackageInitProc*)NULL); */ return TCL_OK; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/ds9.ico������������������������������������������������������������������������������000644 �000765 �000000 �00000565116 11367615300 015073� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(���������h������� �h���� ������� �� ���� �� �� ��� ���~��00�����h��&*��00������0��00��� �%��6M��@@�����h ��r��@@����(2��F}��@@��� �(B��n�������h(��������(������ �(�&�(������ �����������������������������H��P��p`���0�0��X��Ȉ�H���@۽@�ɐ`@@lSF<D ""P"".?W8"""" ^""""P8""""吼""""u""(3J ""Ó9d@l50 \Z@@�@p�����@��������������������������������������@������(������ ���������@������������������������������ɃPRx������������������ݫLJt`�|?5UĔq���������ֲ࢔`xhj[IŘ~����ܣ(J0OĔ 5Dʧ5U,I���X|�/NĒ 0舦:$v���ܬUƘS[/HǡY~klģ$&V1䛘�U$:gmDʧ 1\yK|H^|2 Dʦhl:;�/RŒ&ͱFpoYKŜ-\VPÓ| 72PÐ剥8|�S������֬J-X3GȢ4$KƜ+J(���ש}�L’Vkc[~}$ ���������澿v[Ɨ"4}F�ycȊ������������������γP41ù^��������������?������+������P ��P ������+����������(������ ���� �����������������������������������������AɃPRxA������������������������.LJt`�|?5UĔq.������������S`xhj[IŘ~�S����/(J0OĔ 5Dʧ5U,I;����XǴ|�/NĒ 0:$v����ܬwUƘS[/HǡY~klWģ$琟&V1�Uڞ$:gmDʧ 1\yK|H^|2 Dʦhl:;⹇�/RŒ&ͱFgpoYKŜ-\VPÓW|Nj 72PÐ8|�S��������/J-X3GȢ4$KƜ+J(;����S}�L’Vkc[~}$ S������������/v[Ɨ"4}F�ycȊ/������������������������XγP41ù^X������������������?������+������P ��P ������+����������(��� ���@�������������������������������8Ȩ�Ȉ�xH�Ȑ�X� �P� �`h��0���(���� ,DD � ������ "������u0 W ����0� �� $ B��"ET"  �QQ�ZP@ .81"p[�"X`.1N ~_�� 9X9X�_� ~N %:`,Y "p�" . �Q1�ZP �"EPT" � $0B���Q0 0 ����u W ������ MP\ ������ wwL  ���`������� ����@�����������������������������������������������������������@�������� ����`(��� ���@��������� ���������������������������������������������ϑˇˇ͍������������������������������������������������������ټڲF ��0{5�� '͌������������������������������������������ԾnH/ʭ��axZL ӻxYͼe���������������������������������ߵ"�FǞ&எ��Cʨ;϶��MĘ�jk��ڪ���������������������͊�Iǟ^x��,#ަ ��x���������������ΌoF�{G 9ж $��jG}���������۫�8#sX��[~ 7ѻB =}C uQ��xQ%C�֟���������⪘�^x�GȠ�* 3[~=Ͳ >Jƚ�V����ȶS�5ҿ�wVcpcq#�.ˤ���ȭ=���߁4���� ' 3�0TMƗvB������ȅ̅>@3Z   dp�o\�'оΝ���괜3η# $co7ѻ GȞ�)̋�;ϲ  (Ԥ��߶J��rZ5һ0Ŗ�ɾh%����5W)tS���1-{IX<ζ#  #:ϷVxM+}F[~>Ͱ' %?̱YzJ(����xL.V2����2J�/1lc$��l͋��*  2Կ&�硨;�Iǜ 6Ҽgj!' &)ʭ���ѡ)θ�la�ke   U,?2!ȯ���ā=SY/�, ( -���.���ζQ���2�!hh![}G�+Х�ŲK���媛�]zHǞ7 ;϶au5#ݫ�NĔS����������ݰ�<&xR��zIwO, {HCʦ Q��}H%{J�أ������������ώlI�! Dʤ uQ�l@ɀ������������΋�� �,%ܤ��fk>γ�}���������������������⺰&��r^�HǠ��Cʧ:Ϸ��+<̯� ݱ���������������������������������r~X$ѵJ�`u[���2ȨOԾm���������������������������������������������Дç2�7?� Gٰ���������������������������������������������������ŷYUSŷY���������������������������q|>@����_��;�������� �������������� ��������;��_��@ z^_(��� ���@���� �������������������������������������������������������������LKϑˇˇ͍KL������������������������������������������������������������������������>ڲF쫕 ��0{5�� '͌> ��������������������������������������������������������;ԾnH/ʭ��axZL ӻxYͼe;��������������������������������������������ߵ"�FǞ&��Cʨ;϶��MĘ�jk��ڪ����������������������������͊�Iǟ^x��,# ��x�������������������� ΌoF�{G 9ж $��jG} ������������۫�8#sX��[~ 7ѻB =}C uQ��xQ%C�֟������������:�^x�GȠ�* 3[~=Ͳ >Jƚ�V�_����ȶSޞ�5ҿ�wVcpcq#�.���ȭ= ����j4���� ' 3�0TMƗvBv��������ȅ>@3Z   dp�o\�'оΝ����|3η# $co7ѻ GȞ�)4̋�;ϲ  (��߶wJ꣔��rZ5һ0�ɾh%����5W)tS���1-{IX<ζ#  #:ϷVxM+}F[~>Ͱ' %?̱YzJ(����xL.V2����2J裓�/1lc$��l͋��*  2Կ&�w@;�Iǜ 6Ҽgj!' &)4����ѡ)θ�la�ke   U,?2!����j=SY/�, ( -���.v����ζQޫ���2�!hh![}G�+�ŲK ����:�]zHǞ7 ;϶au5#�NĔS�_������������ݰ�<&xR��zIwO, {HCʦ Q��}H%{J�أ���������������� ώlI�! Dʤ uQ�l@ɀ ����������������΋�� �,%��fk>γ�}����������������������������⺇&��r^�HǠ��Cʧ:Ϸ��+<̯� ݱ��������������������������������������������;r~X$ѵJ�`u[���2ȨOԾm;������������������������������������������������������������@Дç2ۮ�7?� G۽ٰ@��������������������������������������������������������������������̀ŷY뺵USŷYˀ������������������������������������q|>@����_��;�������� �������������� ��������;��_��@ z^_(���0���`��������������������������������H�Ȁ�0�@Ȩ�H� ���hh�0�xP�ؠ�`x������� �")"�"����������� p�P�N � ����������������"��������� HP��`�� ������������ �0�� ������ $�������r�����p���ڭ�ڣ��� ���� +���ʡ���������"xe��Ѫ�:�:��� ����� 0ʡ���r��"�P�j�"����Zܪ�P�� "'���ڪ \���r""���6���k���P�a" P���ڪ�\.B'f��r�j0��� a���p���ܪ���p���������a=�<cЀ�a�p����񪪪����p���������ʪ3���'��ڪfr81r"�����}ÀP���""��� jo��� "'���:\���r"��ͪʪ�P�� �"�PѪ�j�"�������ʡ� �r��"xe���ʦ�:�:�� ��� /����:�� �������p���:�Z��� ����� $���ʥ��� �B��������� ����� ������� 1��`�� ����������M��� �� ����������� x�P�I  �������������)DDN�� ����������w���� ��`������������������_������/������������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������/������_������������`����������g����(���0���`���������������������������������������������������������������������������٩۬۬٨߷������������������������������������������������������������������������������������tA���{2{3���@r���������������������������������������������������������������������������������ʀ|ŎoZ���eqZ��� Mդ���������������������������������������������������������������ʅjJ 6�Hǟ;δ�jm(<Ě*u���������������������������������������������������������ෳ.�-���- 㧑���[~ PÒ ��%ܮ������������������������������������������������z��# qW��%��, /ʨ����ɽe���������������������������������������ijQ��! "ጠ/��~CtT��qY MĖ����?���������������������������������o�4 gh���au W��dn Hǟ�����V������������������������įEBͮ;���~C ?̭�Iǝ ?̮�Mė /ʥ��-?ϵ+.���������������������������ɽd��co X ��la IǞ0 %ݚ�& 䒝 �`t Y��öT���������������՝��;ϲ�/ǀ?���=ͱ qWxL 玟(��643�ϐ������������⫚�# S�6- if5  䝗Y 4� ������Ⱥ]����kb #xP�7ѽ  Eɤ:' ]z����M̟ �=Ͳ  QEɤ4  2Ť���ߵ���������ϞZi��%  2�Eɡ$#-_jG���y` ?�����n^ [��5&  OŘ���|#FȤbsY8л )Z*  8ѻ�*VX ]jˉJ�Hʥ  ;ζ@̭ kc����7Ȯ�<ʹ  JŚ�җ��|EauQ<δ ,͚���ɾf�����l`+9е��uH������#`u[~�����C&��� 'yJW;Ϸ# #:иWuP) ���2<zJT8к&  &5ҾQ‘vN7|FX=ͱ+  +9ϸU{G)���%~Bas>̱&#$?̮]zzI%���3M������`u#\} ������BȽe��8ж%dp*������{Җ���. 5JƛSqW ��̰�Mĕ  /Ɠ"� J����n]?̮Dɥ  9Ѿ<���ΐZr.$V W*�?̰ %_x7ѿ"<ϵ[cqP“ {1od  %ׄ=��en bs�����+ra���������θWkR2))IǛ�*  :��`dϠӯ����8к  9ϸ?̯Z  .̢ ����ǽd����cn &Ӈ;OÓ  )Ԩ�<- ]{����õS������㭜�# T'  /pZ - yJ� [ 5� ������������إ��;ϳ�49��( tS vQ 5�.:ϸ.ʤ�ҕ���������������������l��_w _t�% 韕 3 $ݡ[~ ]{��gkP��ŸZ������������������űE!>϶7����9к Dɧ��IƝ >̰�NÕ  uQ���)D̮&7���������������������������q����PÒ Y��`v Z��wN )՞���O���������������������������������ĵU����OÒ _x��@uR�� ' /���K������������������������������������������8м 6�� %��|G/��r������������������������������������������������5�� ] Z��-!㧑���!$䜔�.޳���������������������������������������������������������̉1@“*gq�GǠ?̮�+dTʆ���������������������������������������������������������������������ש[�����gjX�����{H{Ǒʀ������������������������������������������������������������������������������I$ �:<� $Hw������������������������������������������������������������������������������������������۬ΏtyxtΏ۬�������������������������������������������������������=�� ������[��������������@������������������������������?������������������������������������������������������������������������������������������������������������������������������?������������������������@��������������������������������(���0���`���� �����������������������������������������������������������������������������������������٩۬۬٨߷����������������������������������������������������������������������������������������������������������������<tϻA���{2{3���@r⽗<������������������������������������������������������������������������������������������������������������Hʀ|ŎoZ���eqZ��� Mդ[!������������������������������������������������������������������������������������4ʅjJ 6�Hǟ;δ�jm(<Ě*u3����������������������������������������������������������������������������ෝ.�-���- ���[~ PÒ ��%ܮ����������������������������������������������������������������Oz椑��# qW��%��, /����ɽeO����������������������������������������������������TijQ��! "/��~CtT��qY MĖ����?T��������������������������������������������Qo�4 gh���au W��dn Hǟ�����VQ��������������������������������ZįEBͮ;���~C ?̭�Iǝ ?̮�Mė /��-?ϵ+.W������������������������������������ɽd蜋��co X ��la IǞ0 %�& �`t Y��öTE��������������������՝��;ϲ�/?���=ͱ qWxL (��643�ϐ����������������8�# S�6- if5  Y 4� ֗��������&Ⱥ]럌����kb #xP�7ѽ  Eɤ:' ]z����M&̒ �=Ͳ  QEɤ4  2���ߵ������������ϞZi��%  2�Eɡ$#-_jG����Ny` ?�����n^ [��5&  OŘː����|ą#FȤbsY8л )Z*  8ѻ�*VX ]jˉiJ�Hʥ  ;ζ@̭ kc����7U�<ʹ  JŚ�җ��|EauQ<δ ,���ɾf�����l`+9е��uH������#`u[~�����C&��� 'yJW;Ϸ# #:иWuP) ���2<zJT8к&  &5ҾQ‘vN7|FX=ͱ+  +9ϸU{G)���%~Bas>̱&#$?̮]zzI%���3M������`u#\} ������BȽe��8ж%dp*������{Җ���. 5JƛSqW ��]�Mĕ  /"� GJߦ����n]?̮Dɥ  9Ѿ<����ΐZr.$V W*�?̰ %_x7ѿ"<ϵ[cqP“ {1oWd  %=��en bs�����+ra������������θWkR2))IǛ�*  :��`dϠӒ����8к  9ϸ?̯Z  . �Ǒ����&ǽd럌����cn &;OÓ  )�<- ]{����õS&��������8�# T'  /pZ - yJ� [ 5� ٗ����������������إ��;ϳ�49��( tS vQ 5�.:ϸ.�ҕ����������������������������l蝋��_w _t�%  3 $[~ ]{��gkP��ŸZE������������������������ZűE!>϶7����9к Dɧ��IƝ >̰�NÕ  uQ���)D̮&7W������������������������������������Qq����PÒ Y��`v Z��wN )���OQ��������������������������������������������TĵU����OÒ _x��@uR�� ' /���KT����������������������������������������������������O榓���8м 6�� %��|G/��rO����������������������������������������������������������������5�� ] Z��-!���!$�.޳����������������������������������������������������������������������������4̉1@“*gq�GǠ?̮�+dTʆ4��������������������������������������������������������������������������������������������Hש[�����gjX�����{H{ǑʀH��������������������������������������������������������������������������������������������������������;ƛI$ �:<� $HwÛ;������������������������������������������������������������������������������������������������������������������������Od۬aΏtyxtΏ۬adO������������������������������������������������������������������������=�� ������[��������������@������������������������������?������������������������������������������������������������������������������������������������������������������������������?������������������������@��������������������������������(���@������������� ����������������������H�А�8�@Ȩ�H����hX�0�`x�@����������� ""J""  ����������������� *G�P�t "���������������� F��� ���t ����������������G3����`����" ������������ "H���� ���\"������������������� � ����������$������Q�����B ��������p�������1��� �����������0���1��P����� ������ *�������P�����B�����8��� �����" ����*��00��� "���� (��� 0 `��a�"����"p���`��� ������`����B �� (����0 ��� �"p���YP���"  �����9�����@ "-������ۀr 0�����""s������ad 5fmS�͠*PP�B$�1���r'���� ��ɑ����@���9h����@���������p������P�����p���[6c���p�l;P�<ø֙P�l;�p����[m���@�����i������@����o�����@������ ����a��'��� �$����r*�B o�hcވ0 "C������Q7 0�P����d""'������b ���������@ "p���UaP���" � (��� � ��������h� P����B ���"p���`��P� ��� '���0 0��1�"����"ٰ���  ��"������������" ����� *�������1����B������������1��� ���� �������p���������a�� ��������$��� ��Q������B �����������a������� ������������ "H��� ����0"�������������M����`����3t � �������������� D��� 0���d ���������������� *G�P�t  ����������������� �"*DDJ"� �����������g��`���������/���������������������������������������������������������� �������������������@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@�������������������������������� ��������������������������������������������������������/��`������(���@�������������2���������������������������������������������������������������������������������ߵ������������������������������������������������������������������������������������������������������������������������˄O����~75����Hʃ������������������������������������������������������������������������������������������������������������סˏB�����_xY�����%μc՛���������������������������������������������������������������������������������������������������������˅6Qĕ6Ù ��MĖ=Ͳ����xIř���������������������������������������������������������������������������������ђ&�SwZ��� 6Ҿ(ؘ��@1f`ʃ������������������������������������������������������������������������������Ŷ4��{I�"!)����qY 3’&��)ߵ���������������������������������������������������������������������|�do ^z���4{H��#.˚����n������������������������������������������������������������ڿI���X 0ɜ��la Y���NĖma����3���������������������������������������������������������ϰ#���X LŖ���Mė ?̮��/ ?��ݮ������������������������������������������������Ѭ"���vQ:ж&��� ,蝖�+ >�� � ݮ���������������������������������������̦+Wx#�����,  fk�� %��$ sV���W}!۩������������������������������׮ �p_ mb��6 NÕ �< n^��?W���vR"[����������������������������津+��Aˬ>̯,���xL`t�^yMė�[  >̰ ��� Gȡ5ҽ��������������������������Ź\�"#em��S$FȢ  0ȫ�2  ;ε ��m`ꋡ-��D������������������������՝��l` 7й,��"% gj# kb  ;δ��%@˪ co���ώ������������������嬛����FȤ  _w�Z %jb/ Hǟ� je  5�� ������������ƻa����! 2zI�= vO-6Ѻ2��J���������⺫ ��rW T0  1R ]z�������ګ������Lj���Cʧ  5#  6Ѿ��qXhitS'>������cĐGĞ�")�� R MÐܭ߿cFoZ����������rW as��;϶ �)˰x������Yw R<zJ]{FȤEʥDʧ[2Hǡ4á ��o`'  QsWqY2l���⻤�9 !! .聦>hg5  'Յ8���۬{��Q 0 扢3���Ǽc麫<��Cɧ  kb�����ܪ���n_@˪3" Aʬ����۬���&-wNKř <β��ؤʂ�������_uGǞ���yɼe�����jc:϶@������GB����?n`W>Ͱ$->̯Tkb>!�����A2����4o]S<α*    ):жOÕl`4���+IxKV3!  /SuQF}DY;ε$   5ѾY|E1����'sVUA˫1    -?̯VsV(����,J����5rZYIƝ:и (@ˬZ}qZ5�����Aʾi�����@?̭^x������GɁ���GȠQ ��������|۬� <β @ˬkb7*%����ݰ۩ ����Fȣ "5Ҿ_w���콯D��n]  4”��"���ɀ����*  8к( ?̯��Ƚe⻐��7'  5if 3 0# !"uX�ݲ���Ӄŋ+flpZGȠ  "n`��A˭9Ϻ'kiNĕC˦JƝ`wB)^{ P ���ʄA�  9Ϸ(��n] `w����������7@۸R������ī\v R ��<�RMɢ؟̽d�}BxL|E���=Ͳ  "5ҿ  .ˡ�ʕ���������Ѯ�������id X9м  (ב hl X��ک���������Ǽb�)  6ѻ1= !qX�0=Ͱ 솣2����µS������������寞����?̮  br �[~ #rU%LŘ�l` 5��� ���������������������ګ��l` =ͯ.�� ?̯  gk  "giꈢ0�Iƛ ^x��ώ���������������������ɾg��!# m`�� <ͳ  -ϖ�@̭  5+ Dɥ���tU) 8��O���������������������������깩6��=αHǟ ���LĘOÓ��emKƚ�rW fk���Mė +Ϡ��#���������������������������ۯ �epp]����emrW��< m_�atzH����xN(W�������������������������������ˡ4Zr"���@ 䍟)�� %��xN'  %ܙ���ceݮ������������������������������������Ӯ���= %ܕ�� +#ݞ ��Lŗ cq���ݮ������������������������������������������������б'���= $ݝP’ ?̮����X  Fɤ���!���������������������������������������������������������M�����xL  >α��qY Y��� :Ϲ A̫��>������������������������������������������������������������Ϗ ���8л 4��5{H���kcX��y���������������������������������������������������������������������һ@��C˩ pZ����""(�}E6��4������������������������������������������������������������������������������ף%hc4zJ�� 5-Ϛ���ft L�&ђ���������������������������������������������������������������������������������������Όq{W����PÑ<γ��ALǝ6˄������������������������������������������������������������������������������������������������������ܫm7������bsW�������=̏أ���������������������������������������������������������������������������������������������������������������ϐķV3��84��3ķVϐ���������������������������������������������������������������������������������������������������������������������������՞Ӛ՜՞Ԛ՞������������������������������������������������������������������_��_@��Y4��.����O��������+����@����������������������_������������/������������������+������������������������������������������������������������������������������������������������������������������������������������������������������������+������������������/�����������_�������������@������������+������O�� 4��,��[��_(���@������� ������������������������������������������������������������������������������������������������������������� ߵ ����������������������������������������������������������������������������������������������������������������������������������������������������������������E>˄O����~75����Hʃ>E������������������������������������������������������������������������������������������������������������������������������������������������^סˏB�����_xY�����%μc՛^��������������������������������������������������������������������������������������������������������������������������������������������M˅6Qĕ6Ù ��MĖ=Ͳ����xIřܧ)������������������������������������������������������������������������������������������������������������&ђӰ&�SwZ��� 6Ҿ(��@1f`ʃ$��������������������������������������������������������������������������������������������������������׶4��{I�"!)����qY 3&��)ߵ�������������������������������������������������������������������������������������������� Y|Ϧ�do ^z���4{H��#.����nY ��������������������������������������������������������������������������������ڴI���X 0��la Y���NĖma����3Ҵ����������������������������������������������������������������������������#���X LŖ���Mė ?̮��/ ?��ݮ���������������������������������������������������������������� "���vQ:ж&��� ,�+ >�� � ݮ ����������������������������������������������������̾+Wx#�����,  fk�� %��$ sV���W}!۩����������������������������������������׺ �p_ mb��6 NÕ �< n^��?W���vR"[�û ������������������������������������?+��Aˬ>̯,���xL`t�^yMė�[  >̰ ��� Gȡ5ҽ����������������������������������Ź\ݠ�"#em��S$FȢ  0�2  ;ε ��m`-��D!��������������������������������՝頍��l` 7й,��"% gj# kb  ;δ��%@˪ co���ώ#������������������������@����FȤ  _w�Z %jb/ Hǟ� je  5�� ����������������Vƻa����! 2zI�= vO-6Ѻ2��JV������������⺨ ��rW T0  1R ]z�������ګ��������dLj���Cʧ  5#  6Ѿ��qXhitS'>X���� ����_cĐGĞ�")�� R MÐܭ߿cFoZ����������rW as��;϶ �)˰xC��������9Yw R<zJ]{FȤEʥDʧ[2Hǡ4 ��o`'  QsWqY2l.����#ݤ�9 !! .>hg5  '8���۬-{��Q 0 3���Ǽc .<��Cɧ  kb���������n_@˪3" Aʬ����۬ɥ���&-wNKř <β��ؤʂ�������_uGǞ���yɼe�����jc:϶@������GB����?n`W>Ͱ$->̯Tkb>!�����A2����4o]S<α*    ):жOÕl`4���+IxKV3!  /SuQF}DY;ε$   5ѾY|E1����'sVUA˫1    -?̯VsV(����,J����5rZYIƝ:и (@ˬZ}qZ5�����Aʾi�����@?̭^x������GɁ���GȠQ ��������|۬ɥ� <β @ˬkb7*%����ݰ ����Fȣ "5Ҿ_w���/D��n]  4��"����)ɀ����*  8к( ?̯��Ƚe B��7'  5if 3 0# !"uX�ݲ����Cŋ+flpZGȠ  "n`��A˭9Ϻ'kiNĕC˦JƝ`wB)^{ P .����ʄA�  9Ϸ(��n] `w����������7@۸RC���� ����_\v R ��<�RMɢ؟d̽d�}BxL|E���=Ͳ  "5ҿ  .�ʕX������������Ѩ�������id X9м  ( hl X��ک������������VǼb�)  6ѻ1= !qX�0=Ͱ 2����µSV����������������@����?̮  br �[~ #rU%LŘ�l` 5��� ����������������������������ګ額��l` =ͯ.�� ?̯  gk  "gi0�Iƛ ^x��ώ#����������������������������ɾgݡ��!# m`�� <ͳ  -�@̭  5+ Dɥ���tU) 8��O!������������������������������������?6��=αHǟ ���LĘOÓ��emKƚ�rW fk���Mė +��#������������������������������������ۺ �epp]����emrW��< m_�atzH����xN(W�ͻ ����������������������������������������˾4Zr"���@ )�� %��xN'  %���ceݮ������������������������������������������������ ���= %�� +# ��Lŗ cq���ݮ ����������������������������������������������������������������'���= $P’ ?̮����X  Fɤ���!����������������������������������������������������������������������������M�����xL  >α��qY Y��� :Ϲ A̫��>ִ�������������������������������������������������������������������������������� YϏϨ ���8л 4��5{H���kcX��yY ��������������������������������������������������������������������������������������������׻@��C˩ pZ����""(�}E6��4��������������������������������������������������������������������������������������������������������&ףӶ%hc4zJ�� 5-���ft L�&ђ&��������������������������������������������������������������������������������������������������������������������MΌq{W����PÑ<γ��ALǝ6˄M����������������������������������������������������������������������������������������������������������������������������������������^ܫm7������bsW�������=̏أ^����������������������������������������������������������������������������������������������������������������������������������������������������CBCϐķV3��84��3ķVϐCBC�������������������������������������������������������������������������������������������������������������������������������������������������������� ������������&/3/՞Ӛ՜՞Ԛ՞/3/&������������ ����������������������������������������������������������������������������_��_@��Y4��.����O��������+����@����������������������_������������/������������������+������������������������������������������������������������������������������������������������������������������������������������������������������������+������������������/�����������_�������������@������������+������O�� 4��,��[��_(����������������(����������������������h`�p��@�0�@Ƞ�@����ذ�X�И�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z��������������������������������������������������������I��0��M��������������������������������������������������������p���� ������������������������������������������������� 0���� �����������������������������������������������������|���������nd�������������������������������������������� ���������̋��������������������������������������������l��������,{������������������������������������������������������ǰ���@�������������������������������������������|°����`������ �����������������������������������������|����l��, �������������������������������������������[����|����̀��p����������������������������������������������̋���| � p������������������������������������������[����`��,� ����������������������������������������`���� ������ �����������������������������������ΰ��������" P����������������������������������&�������|����������������������������������������<���̀�� �����������������������������������`��l̰,��g°�������������������������������������ΰ�̌c����������������������������������������&�̂,p���������������������������������������̋{°�����P�����������������������������@�����f����������������������������������k������p���c6 ����������������������������������°��.���������������������������� "�������{���������������������������,{������p� |���������������������������|f,~b`�̆�g`���������������������������< ����������������������������� �,������������������������������,���� �������������������������� ��+�����������������������������������n|0�����P�������������������������������h��������������������������������������`������@�������������������������@��������g��������������������������������@������,(�����������������������������������nǎ`������������������������������ >|~6���������������������������,�������������������������,(�������������������������� nr~k�������������������������������`�����������������������������@������>|x��������������������������������@������ `���������������������������������������bȰ�������@������������������������������;�������������������������������������l'~0���P������������������������� ���� ,`� ������������������������������� �������������������������� ����<(,°��������������������������� ��,���������������������������;�c(f ���������������������������{��p��������������������������������� �����������������������������������,��`�����$����������������������������f`���p�����������������������������������@�����g�����������������������������������������°���������������������������������������& �|p��������������������������������������ΰľ`������������������������������������P���`� lp��°������������������������������������������p������������������������������������v���̰ ,°�� |������������������������������������������<p���" P���������������������������������`������ �,���������������������������������������V������|��,��g`����k�����������������������������������������|��|p���̀�����������������������������������������[������|��̀��� ��� ������������������������������������������|��l�������������������������������������������������� ̀��`���� �� �������������������������������������������°�������̀�������������������������������������������� &��������`�������������������������������������������� `������������������������������������������������������c���������{����������������������������������������������� @�����������c�����������������������������������������������������p���� ���������������������������������������������������� I��`��J�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?������������������������������������������������������������?��������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��������?����������������������������������������������������������?����������������������?�������?(�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ްɀA!n`Aqް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������АA-Ϧ1А���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ްµQn`n`0Aנ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נ!7ҿ @n`0ep\epPɀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް!@ͯ7ҿ\Iȟ 7ҿIȟ נ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������༮A0\@ͯ-Ϧ0-ϓ 1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������АR@ͯ$-Ϝɀ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ7ҿ@\@1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������з17ҿRwPep$煉������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ь7ҿn`\Iȟ7ҿנ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ь\Iȟ7ҿ$ߦ7ҿנ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Т \ $wP@煉ep נ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ь\-ϊ0\R @n`  7ҿ@ͯް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-RIȟRwP\Iȟn`\���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@$߁@-@R@ͯ\0-wP!���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������qRR0$ߦ7ҿ$ߦn`\\@ͯµQ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$$߁@Iȟ0 $\0-ް���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!@R @ͯwPn`ep\ep���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀRwP@ͯIȟ0@$7ҿȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ଚ$@ͯep-ϜR ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa@wP0\$epA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wP Iȟ@ͯ7ҿ@n`n`@���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ@ͯn` epRȼa���������������������������������������������������������������������������������������������������������������������������������������������������������������������������$ߜwPepIȟ-Ϝ���������������������������������������������������������������������������������������������������������������������������������������������������������������������נ-Ϝ@ͯ-Ϧ7ҿ@ͯА���������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ7ҿRwP@@\@ͯ-\00ep@ͯ0wP7ҿ@������������������������������������������������������������������������������������������������������������������������������������������������������������������n`-\ \$n`���������������������������������������������������������������������������������������������������������������������������������������������������������������ް-7ҿ$epА���������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa0@ͯA���������������������������������������������������������������������������������������������������������������������������������������������������������������1 7ҿ ���������������������������������������������������������������������������������������������������������������������������������������������������������������0\\7ҿ7ҿn`���������������������������������������������������������������������������������������������������������������������������������������������������������wPIȟn`נ���������������������������������������������������������������������������������������������������������������������������������������������������������נRwPɀ���������������������������������������������������������������������������������������������������������������������������������������������������������ɀ0--epµQ���������������������������������������������������������������������������������������������������������������������������������������������������������ȼa@ep@ͯ$$@ͯ\@A���������������������������������������������������������������������������������������������������������������������������������������������������������A0epIȟ--Iȟep@A���������������������������������������������������������������������������������������������������������������������������������������������������������A n`R7ҿ-Rn`0!���������������������������������������������������������������������������������������������������������������������������������������������������������PwP\7ҿ7ҿRwP ���������������������������������������������������������������������������������������������������������������������������������������������������������P@\@ͯ$@ͯ\@���������������������������������������������������������������������������������������������������������������������������������������������������������AwP\7ҿ7ҿ\wP !���������������������������������������������������������������������������������������������������������������������������������������������������������A wPR7ҿ7ҿRn`0A���������������������������������������������������������������������������������������������������������������������������������������������������������q0n`R--Iȟep0A���������������������������������������������������������������������������������������������������������������������������������������������������������ɀ\-wPµQ���������������������������������������������������������������������������������������������������������������������������������������������������������נwP@ͯ ɀ���������������������������������������������������������������������������������������������������������������������������������������������������������n`7ҿn` ް������������������������������������������������������������������������������������������������������������������������������������������������������������wP$7ҿ7ҿRn`������������������������������������������������������������������������������������������������������������������������������������������������������������1$߁@���������������������������������������������������������������������������������������������������������������������������������������������������������������q@ͯwPµQ���������������������������������������������������������������������������������������������������������������������������������������������������������������ްn`$IȟА������������������������������������������������������������������������������������������������������������������������������������������������������������������n`$\ ep-R������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ-n` wP@ͯep @n`@ͯ$$@ͯep@@@ep$$ߦ1���������������������������������������������������������������������������������������������������������������������������������������������������������������������ް\-ϓ @ͯ-ϦIȟА������������������������������������������������������������������������������������������������������������������������������������������������������������������������IȟIȟwP\7ҿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀep$$ep0@$ȼa���������������������������������������������������������������������������������������������������������������������������������������������������������������������������0@@0@ͯ@ͯ-Ϧep������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀwP$epwP0-\A���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R@ͯR\ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ@ͯ$߁@R$ߦ0-7ҿq������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@R@\0@ͯ@\ep������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ц$-ρ@\$ߦ07ҿ 7ҿ ް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀR\\ep7ҿ$ߦIȟwPep7ҿȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A@-ϊ0n`\@ͯ  7ҿep1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!$\@7ҿwP\n`-Ϧep ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ЬR-ϊ0\ @n`Iȟ @ͯ@ͯ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Й0ep7ҿwP07ҿ@wP נ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ь7ҿ@7ҿ-Ϧep@ͯנ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ь7ҿ@\Iȟ@$ߦް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������෧1-@epep!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa Iȟ@$$ߦA���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް7ҿ $R@ͯА������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ@ͯ0@ͯ-Ϧ\wPA���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@ͯ7ҿ0\RIȟ7ҿ!ް���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נ@n`\ep @n`-Ϝ!נ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa0@n`µQް���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נµQ-ϦµQА���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀµQ1wP1µQɀ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?������������������������������������������������������������?��������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��������?����������������������������������������������������������?����������������������?�������?(���������� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ްɀA!n`Aqް��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������АA-1А������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ްµQn`n`0Aנ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נ!7ҿ @n`0ep\epPɀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް!@ͯ7ҿ\Iȟ 7ҿIȟ נ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A0\@ͯ-0- 1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������АR@ͯ$-ɀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ7ҿ@\@1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������17ҿRwPep$����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7ҿn`\Iȟ7ҿנ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\Iȟ7ҿ$7ҿנ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ \ $wP@ep נ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\-0\R @n`  7ҿ@ͯް��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-RIȟRwP\Iȟn`\����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@$@-@R@ͯ\0-wP!��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������qRR0$7ҿ$n`\\@ͯµQ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$$@Iȟ0 $\0-ް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!@R @ͯwPn`ep\ep����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀRwP@ͯIȟ0@$7ҿȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$@ͯep-R ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa@wP0\$epA����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wP Iȟ@ͯ7ҿ@n`n`@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ@ͯn` epRȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$wPepIȟ-����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נ-@ͯ-7ҿ@ͯА����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ7ҿRwP@@\@ͯ-\00ep@ͯ0wP7ҿ@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n`-\ \$n`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް-7ҿ$epА��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa0@ͯA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1 7ҿ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0\\7ҿ7ҿn`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wPIȟn`נ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נRwPɀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ0--epµQ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa@ep@ͯ$$@ͯ\@A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A0epIȟ--Iȟep@A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A n`R7ҿ-Rn`0!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PwP\7ҿ7ҿRwP ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P@\@ͯ$@ͯ\@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AwP\7ҿ7ҿ\wP !������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A wPR7ҿ7ҿRn`0A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������q0n`R--Iȟep0A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ\-wPµQ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נwP@ͯ ɀ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n`7ҿn` ް����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wP$7ҿ7ҿRn`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1$@��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������q@ͯwPµQ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ްn`$IȟА������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������n`$\ ep-R������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ-n` wP@ͯep @n`@ͯ$$@ͯep@@@ep$$1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް\- @ͯ-IȟА��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IȟIȟwP\7ҿ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀep$$ep0@$ȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0@@0@ͯ@ͯ-ep����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀwP$epwP0-\A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R@ͯR\ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀ@ͯ$@R$0-7ҿq��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@R@\0@ͯ@\ep��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$-@\$07ҿ 7ҿ ް����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀR\\ep7ҿ$IȟwPep7ҿȼa������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A@-0n`\@ͯ  7ҿep1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!$\@7ҿwP\n`-ep ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R-0\ @n`Iȟ @ͯ@ͯ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0ep7ҿwP07ҿ@wP נ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7ҿ@7ҿ-ep@ͯנ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7ҿ@\Iȟ@$ް����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1-@epep!������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa Iȟ@$$A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ް7ҿ $R@ͯА������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������µQ@ͯ0@ͯ-\wPA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1@ͯ7ҿ0\RIȟ7ҿ!ް����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נ@n`\ep @n`-!נ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ȼa0@n`µQް������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������נµQ-µQА������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ɀµQ1wP1µQɀ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?������������������������������������������������������������?��������?������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��������?����������������������������������������������������������?����������������������?�������?��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/win/ds9.rc�������������������������������������������������������������������������������000644 �000765 �000000 �00000013706 12620453700 014713� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <windows.h> #define VV "7.4b9" VS_VERSION_INFO VERSIONINFO FILEVERSION 7,4,0,0 PRODUCTVERSION 7,4,0,0 FILEFLAGSMASK 0x3fL FILEFLAGS 0x0L FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "SAOImage DS9 " VV VALUE "OriginalFilename", "ds9.exe" VALUE "CompanyName", "Smithsonian Astrophysical Observatory" VALUE "FileVersion", VV VALUE "LegalCopyright", "Copyright 1999-2015 by Smithsonian Astrophysical Observatory" VALUE "ProductName", "SAOImage DS9" VALUE "ProductVersion", VV END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END tk ICON DISCARDABLE "ds9.ico" // // Bitmaps // buttons BITMAP DISCARDABLE "buttons.bmp" // // Cursors // X_cursor CURSOR DISCARDABLE "cursor00.cur" arrow CURSOR DISCARDABLE "cursor02.cur" based_arrow_down CURSOR DISCARDABLE "cursor04.cur" based_arrow_up CURSOR DISCARDABLE "cursor06.cur" boat CURSOR DISCARDABLE "cursor08.cur" bogosity CURSOR DISCARDABLE "cursor0a.cur" bottom_left_corner CURSOR DISCARDABLE "cursor0c.cur" bottom_right_corner CURSOR DISCARDABLE "cursor0e.cur" bottom_side CURSOR DISCARDABLE "cursor10.cur" bottom_tee CURSOR DISCARDABLE "cursor12.cur" box_spiral CURSOR DISCARDABLE "cursor14.cur" center_ptr CURSOR DISCARDABLE "cursor16.cur" circle CURSOR DISCARDABLE "cursor18.cur" clock CURSOR DISCARDABLE "cursor1a.cur" coffee_mug CURSOR DISCARDABLE "cursor1c.cur" cross CURSOR DISCARDABLE "cursor1e.cur" cross_reverse CURSOR DISCARDABLE "cursor20.cur" crosshair CURSOR DISCARDABLE "cursor22.cur" diamond_cross CURSOR DISCARDABLE "cursor24.cur" dot CURSOR DISCARDABLE "cursor26.cur" dotbox CURSOR DISCARDABLE "cursor28.cur" double_arrow CURSOR DISCARDABLE "cursor2a.cur" draft_large CURSOR DISCARDABLE "cursor2c.cur" draft_small CURSOR DISCARDABLE "cursor2e.cur" draped_box CURSOR DISCARDABLE "cursor30.cur" exchange CURSOR DISCARDABLE "cursor32.cur" fleur CURSOR DISCARDABLE "cursor34.cur" gobbler CURSOR DISCARDABLE "cursor36.cur" gumby CURSOR DISCARDABLE "cursor38.cur" hand1 CURSOR DISCARDABLE "cursor3a.cur" hand2 CURSOR DISCARDABLE "cursor3c.cur" heart CURSOR DISCARDABLE "cursor3e.cur" icon CURSOR DISCARDABLE "cursor40.cur" iron_cross CURSOR DISCARDABLE "cursor42.cur" left_ptr CURSOR DISCARDABLE "cursor44.cur" left_side CURSOR DISCARDABLE "cursor46.cur" left_tee CURSOR DISCARDABLE "cursor48.cur" leftbutton CURSOR DISCARDABLE "cursor4a.cur" ll_angle CURSOR DISCARDABLE "cursor4c.cur" lr_angle CURSOR DISCARDABLE "cursor4e.cur" man CURSOR DISCARDABLE "cursor50.cur" middlebutton CURSOR DISCARDABLE "cursor52.cur" mouse CURSOR DISCARDABLE "cursor54.cur" pencil CURSOR DISCARDABLE "cursor56.cur" pirate CURSOR DISCARDABLE "cursor58.cur" plus CURSOR DISCARDABLE "cursor5a.cur" question_arrow CURSOR DISCARDABLE "cursor5c.cur" right_ptr CURSOR DISCARDABLE "cursor5e.cur" right_side CURSOR DISCARDABLE "cursor60.cur" right_tee CURSOR DISCARDABLE "cursor62.cur" rightbutton CURSOR DISCARDABLE "cursor64.cur" rtl_logo CURSOR DISCARDABLE "cursor66.cur" sailboat CURSOR DISCARDABLE "cursor68.cur" sb_down_arrow CURSOR DISCARDABLE "cursor6a.cur" sb_h_double_arrow CURSOR DISCARDABLE "cursor6c.cur" sb_left_arrow CURSOR DISCARDABLE "cursor6e.cur" sb_right_arrow CURSOR DISCARDABLE "cursor70.cur" sb_up_arrow CURSOR DISCARDABLE "cursor72.cur" sb_v_double_arrow CURSOR DISCARDABLE "cursor74.cur" shuttle CURSOR DISCARDABLE "cursor76.cur" sizing CURSOR DISCARDABLE "cursor78.cur" spider CURSOR DISCARDABLE "cursor7a.cur" spraycan CURSOR DISCARDABLE "cursor7c.cur" star CURSOR DISCARDABLE "cursor7e.cur" target CURSOR DISCARDABLE "cursor80.cur" tcross CURSOR DISCARDABLE "cursor82.cur" top_left_arrow CURSOR DISCARDABLE "cursor84.cur" top_left_corner CURSOR DISCARDABLE "cursor86.cur" top_right_corner CURSOR DISCARDABLE "cursor88.cur" top_side CURSOR DISCARDABLE "cursor8a.cur" top_tee CURSOR DISCARDABLE "cursor8c.cur" trek CURSOR DISCARDABLE "cursor8e.cur" ul_angle CURSOR DISCARDABLE "cursor90.cur" umbrella CURSOR DISCARDABLE "cursor92.cur" ur_angle CURSOR DISCARDABLE "cursor94.cur" watch CURSOR DISCARDABLE "cursor96.cur" xterm CURSOR DISCARDABLE "cursor98.cur" none CURSOR DISCARDABLE "cursor9a.cur" // // This enables themed scrollbars in XP by trying to use comctl32 v6. // #ifndef RT_MANIFEST #define RT_MANIFEST 24 #endif #ifndef CREATEPROCESS_MANIFEST_RESOURCE_ID #define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 #endif ����������������������������������������������������������saods9/ds9/win/install.vbs��������������������������������������������������������������������������000644 �000765 �000000 �00000000657 11374524132 016054� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������' ' Copy to destination ' 'dim fso 'set fso = CreateObject("Scripting.FileSystemObject") 'fso.CopyFolder "..\WZSE0.TMP","c:\ds9",True ' ' Create a ds9 shortcut on the Desktop ' set WshShell = CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oMyShortCut= WshShell.CreateShortcut(strDesktop+"\SAOImage DS9.lnk") oMyShortCut.WindowStyle = 7 oMyShortCut.TargetPath = "c:\ds9\ds9.exe" oMyShortCut.Save ���������������������������������������������������������������������������������saods9/ds9/win/Makefile�����������������������������������������������������������������������������000644 �000765 �000000 �00000005635 12556730356 015345� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������include ../../make.pkgs #--------------------------defines CFLAGS= -g -DSTATIC_BUILD -mnop-fun-dllimport -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -I. -I../../include -I../../include/X11 CXXFLAGS = $(CFLAGS) OBJS = ds9.o winMain.o ds9.res.o ZDIR = zipdir/zvfsmntpt FFILES = \ $(ZDIR)/$(TCLVER) \ $(ZDIR)/tcl8 \ $(ZDIR)/$(TKVER) \ $(ZDIR)/$(TKBLTDIR) \ $(ZDIR)/$(TCLLIBVER) \ $(ZDIR)/$(TKCONVER) \ $(ZDIR)/$(XMLRPCVER) \ $(ZDIR)/library \ $(ZDIR)/msgs \ $(ZDIR)/doc \ $(ZDIR)/cmaps \ $(ZDIR)/template ifdef FILTERCOMPILER FILES = $(FFILES) $(ZDIR)/$(FILTERCOMPILER) else FILES = $(FFILES) endif LIBS = \ ../../lib/$(TKSAODIR)/libtksao10.a \ ../../lib/$(TKSAODIR)/libfuntools.a \ ../../lib/$(TKSAODIR)/libast.a \ ../../lib/$(TKSAODIR)/libast_err.a \ ../../lib/$(TKSAODIR)/libast_pal.a \ ../../lib/$(TKHTMLDIR)/libtkhtml10.a \ ../../lib/$(TKMPEGDIR)/libtkmpeg10.a \ ../../lib/$(TCLXMLVER)/Tclxml32.a \ ../../lib/$(TKTABLEVER)/Tktable210.a \ ../../lib/$(TKIMGVER)/tkimgpng14.a \ ../../lib/$(TKIMGVER)/pngtcl143.a \ ../../lib/$(TKIMGVER)/tkimgtiff14.a \ ../../lib/$(TKIMGVER)/tifftcl394.a \ ../../lib/$(TKIMGVER)/tkimgjpeg14.a \ ../../lib/$(TKIMGVER)/jpegtcl82.a \ ../../lib/$(TKIMGVER)/tkimggif14.a \ ../../lib/$(TKIMGVER)/tkimgwindow14.a \ ../../lib/$(TKIMGVER)/zlibtcl125.a \ ../../lib/$(TKIMGVER)/tkimg14.a \ ../../lib/libtiff.a \ ../../lib/$(TCLZVFSDIR/libtclzvfs10.a \ ../../lib/libxpa.a \ ../../lib/$(TKBLTDIR)/libtkblt30.a \ ../../lib/libtk86.a \ ../../lib/libtkstub86.a \ ../../lib/libtcl86.a \ ../../lib/libtclstub86.a #--------------------------main all: ds9.exe winMain.o : winMain.c $(CC) $(CFLAGS) -DTK_LOCAL_APPINIT=SAOAppInit \ -DTK_LOCAL_MAIN_HOOK=SAOLocalMainHook -c winMain.c -o $@ winMain.c : ../../$(TKDIR)/winMain.c cp ../../$(TKDIR)/winMain.c . ds9.exe : ds9Base.exe ds9.zip ../../bin/tcc $(RM) $@ strip ds9Base.exe cp ds9Base.exe ds9.exe cp ds9.exe ../../bin/. cp ds9.zip ../../bin/. debug : ds9Base.exe ds9.zip ../../bin/tcc $(RM) $@ cp ds9Base.exe ds9.exe ds9app : ds9.exe $(RM) -r ../../bin/ds9app mkdir ../../bin/ds9app cp ds9.exe ../../bin/ds9app/. cp ds9.zip ../../bin/ds9app/. cp -rp ../../bin/tcc ../../bin/ds9app/. cp ../../ds9/install.vbs ../../bin/ds9app/. ds9Base.exe: $(OBJS) $(LIBS) $(RM) $@ $(CXX) ${OPTS} \ -o $@ $(OBJS) $(LIBS) \ -lxml2 -ljbig \ -lws2_32 -limm32 -lcomctl32 -mwindows ds9.res.o: ds9.rc ds9.ico windres -o $@ --define STATIC_BUILD --include ../../$(TKDIR)/generic \ --include ../../$(TCLDIR)/generic --include ../../$(TKDIR)/rc \ --include win ds9.rc ../../bin/tcc: ../../compilers/$(TCC) $(RM) -r $@ cd ../../bin; unzip ../../compilers/$(TCC) chmod +x ../../bin/tcc/tcc.exe touch $@ #--------------------------cleanup clean : FORCE cd ../library; $(MAKE) clean $(RM) core *~ *# distclean: FORCE cd ../library; $(MAKE) distclean $(RM) core *~ *# ds9Base.exe ds9.exe *.zip *.o $(RM) -r zipdir bin/tcc FORCE : ���������������������������������������������������������������������������������������������������saods9/ds9/win/message.txt��������������������������������������������������������������������������000644 �000765 �000000 �00000000103 11370071032 016031� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������To install SAOImage DS9 in C:\ds9, please select the Setup button. �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/util/mergedict.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000002452 10660664756 016532� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# usage: mergedict <##> set mm [lindex $argv 0] set enc [lindex $argv 1] set fn "msgs/${mm}.msg" # read in original msg file if {[catch {open $fn r} id]} { puts "Error: can't open $fn for reading" return } fconfigure $id -encoding $enc set orgmsg {} while {[gets $id line] >= 0} { lappend orgmsg $line } set orgmsg [lsort -unique $orgmsg] catch {close $id} # read current msgs set curmsg {} while {[gets stdin line] >= 0} { set exp {.*msgcat::mc {([^\}]*)}} if [regexp $exp $line foo aa] { lappend curmsg "::msgcat::mcset $mm {$aa} " } } set curmsg [lsort -unique $curmsg] # now merge original against current set mermsg {} foreach ll $curmsg { set ii [lsearch -glob $orgmsg "$ll*"] if {$ii != -1} { lappend mermsg [lindex $orgmsg $ii] } else { lappend mermsg $ll } } set mermsg [lsort -unique $mermsg] # now find unused entries in original foreach ll $orgmsg { set ii [lsearch -exact $mermsg $ll] if {$ii == -1} { if {[string range $ll 0 0] != {#}} { lappend mermsg "# $ll" } else { lappend mermsg "$ll" } } } set mermsg [lsort -unique $mermsg] # write new msg file if {[catch {open $fn w} id]} { puts "Error: can't open $fn for writing" return } fconfigure $id -encoding $enc foreach ll $mermsg { puts $id $ll } catch {close $id} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/aclocal.m4��������������������������������������������������������������������������000755 �000765 �000000 �00000000223 12556763143 015722� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/configure���������������������������������������������������������������������������000755 �000765 �000000 �00001074474 12602576261 016005� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for ds9 7.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ds9' PACKAGE_TARNAME='ds9' PACKAGE_VERSION='7.4' PACKAGE_STRING='ds9 7.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR TCL_THREADS XMKMF TK_INCLUDES TCL_INCLUDES DEBUGCMD DS9CMD MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tk with_tclinclude with_tkinclude with_x enable_threads enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures ds9 7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ds9] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ds9 7.4:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-tkinclude directory containing the public Tk header files --with-x use the X Window System --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ds9 configure 7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case <limits.h> declares $2. For example, HP-UX 11i <limits.h> declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer <limits.h> to <assert.h> if __STDC__ is defined, since <limits.h> exists even on freestanding compilers. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ds9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- #TEA_ADD_SOURCES([sample.c tclsample.c]) #TEA_ADD_HEADERS([]) #TEA_ADD_INCLUDES([]) vars="-lstdc++" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done #TEA_ADD_CFLAGS([]) #TEA_ADD_STUB_SOURCES([]) #TEA_ADD_TCL_SOURCES([]) { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version case $system in Darwin* ) DS9CMD=ds9zip DEBUGCMD=dds9zip $as_echo "#define ZIPFILE 1" >>confdefs.h ;; *) DS9CMD=ds9 DEBUGCMD=dds9 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jbg_enc_init in -ljbig" >&5 $as_echo_n "checking for jbg_enc_init in -ljbig... " >&6; } if ${ac_cv_lib_jbig_jbg_enc_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljbig $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jbg_enc_init (); int main () { return jbg_enc_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jbig_jbg_enc_init=yes else ac_cv_lib_jbig_jbg_enc_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jbig_jbg_enc_init" >&5 $as_echo "$ac_cv_lib_jbig_jbg_enc_init" >&6; } if test "x$ac_cv_lib_jbig_jbg_enc_init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBJBIG 1 _ACEOF LIBS="-ljbig $LIBS" fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 $as_echo_n "checking for xmlInitParser in -lxml2... " >&6; } if ${ac_cv_lib_xml2_xmlInitParser+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xmlInitParser (); int main () { return xmlInitParser (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_xml2_xmlInitParser=yes else ac_cv_lib_xml2_xmlInitParser=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 $as_echo "$ac_cv_lib_xml2_xmlInitParser" >&6; } if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXML2 1 _ACEOF LIBS="-lxml2 $LIBS" fi #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi #TEA_PRIVATE_TK_HEADERS if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else not_really_there="yes" fi rm -f conftest.err conftest.i conftest.$ac_ext else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } found_xincludes="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : found_xincludes="yes" else found_xincludes="no" fi rm -f conftest.err conftest.i conftest.$ac_ext if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: couldn't find any!" >&5 $as_echo "couldn't find any!" >&6; } fi if test "$no_x" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 libraries" >&5 $as_echo_n "checking for X11 libraries... " >&6; } XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCreateWindow in -lXwindow" >&5 $as_echo_n "checking for XCreateWindow in -lXwindow... " >&6; } if ${ac_cv_lib_Xwindow_XCreateWindow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXwindow $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XCreateWindow (); int main () { return XCreateWindow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xwindow_XCreateWindow=yes else ac_cv_lib_Xwindow_XCreateWindow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xwindow_XCreateWindow" >&5 $as_echo "$ac_cv_lib_Xwindow_XCreateWindow" >&6; } if test "x$ac_cv_lib_Xwindow_XCreateWindow" = xyes; then : XLIBSW=-lXwindow fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find any! Using -lX11." >&5 $as_echo "could not find any! Using -lX11." >&6; } XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi fi #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- #TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <tk.h> int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- #AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- #TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ds9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ds9 config.status 7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/configure.in������������������������������������������������������������������������000755 �000765 �000000 �00000017150 12602576261 016375� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_<PACKAGE_NAME> # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([ds9], [7.4]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- #TEA_ADD_SOURCES([sample.c tclsample.c]) #TEA_ADD_HEADERS([]) #TEA_ADD_INCLUDES([]) TEA_ADD_LIBS([-lstdc++]) #TEA_ADD_CFLAGS([]) #TEA_ADD_STUB_SOURCES([]) #TEA_ADD_TCL_SOURCES([]) TEA_CONFIG_SYSTEM case $system in Darwin* ) DS9CMD=ds9zip DEBUGCMD=dds9zip AC_DEFINE([ZIPFILE]) ;; *) DS9CMD=ds9 DEBUGCMD=dds9 AC_CHECK_LIB([jbig],[jbg_enc_init]) ;; esac AC_SUBST(DS9CMD) AC_SUBST(DEBUGCMD) AC_CHECK_LIB([xml2],[xmlInitParser]) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- #TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- #AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- #TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/ds9.C�������������������������������������������������������������������������������000644 �000765 �000000 �00000015014 12556717727 014675� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <stdlib.h> #include <string.h> #include <iostream> #include <sstream> using namespace std; #include <tcl.h> #include <tk.h> extern "C" { int SAOAppInit(Tcl_Interp *interp); int SAOLocalMainHook(int* argc, char*** argv); void TclSetStartupScriptFileName(const char*); int Zvfs_Init(Tcl_Interp*); int Zvfs_Mount(Tcl_Interp*, char*, char *); int Tkblt_Init(Tcl_Interp*); int Tktable_Init(Tcl_Interp*); int Tclcheckdns_Init(Tcl_Interp*); int Tksao_Init(Tcl_Interp*); int Tkhtml_Init(Tcl_Interp*); int Tkmpeg_Init(Tcl_Interp*); int Tkimg_Init(Tcl_Interp*); int Zlibtcl_Init(Tcl_Interp*); int Jpegtcl_Init(Tcl_Interp*); int Tkimgjpeg_Init(Tcl_Interp*); int Tifftcl_Init(Tcl_Interp*); int Tkimgtiff_Init(Tcl_Interp*); int Pngtcl_Init(Tcl_Interp*); int Tkimgpng_Init(Tcl_Interp*); int Tkimggif_Init(Tcl_Interp*); int Tkimgwindow_Init(Tcl_Interp*); int Tclxpa_Init(Tcl_Interp*); int Tcliis_Init(Tcl_Interp*); int Tclxml_Init(Tcl_Interp*); int Tclxml_libxml2_Init(Tcl_Interp*); int Signal_ext_Init(Tcl_Interp*); } Tcl_Interp *global_interp; void internalError(const char* msg) { Tcl_SetVar2(global_interp, "ds9", "msg", msg, TCL_GLOBAL_ONLY); Tcl_SetVar2(global_interp, "ds9", "msg,level", "error", TCL_GLOBAL_ONLY); } // currently use relative path // using full path with spaces causes problems // with htmwidget and tcl/tk int SAOLocalMainHook(int* argcPtr, char*** argvPtr) { // sync C++ io calls with C io calls ios::sync_with_stdio(); // do this first Tcl_FindExecutable((*argvPtr)[0]); // so that tcl and tk know where to find their libs // we do it here before InitLibraryPath is called putenv((char*)"TCL_LIBRARY=./zvfsmntpt/tcl8.6"); putenv((char*)"TK_LIBRARY=./zvfsmntpt/tk8.6"); // startup script Tcl_Obj *path = Tcl_NewStringObj("./zvfsmntpt/library/ds9.tcl",-1); Tcl_SetStartupScript(path, NULL); return TCL_OK; } int SAOAppInit(Tcl_Interp *interp) { // save interp for cputs function global_interp = interp; // We have to initialize the virtual filesystem before calling // Tcl_Init(). Otherwise, Tcl_Init() will not be able to find // its startup script files. if (Zvfs_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "zvfs", Zvfs_Init, (Tcl_PackageInitProc*)NULL); // find current working directory, and set as mount point { Tcl_DString pwd; Tcl_DStringInit(&pwd); Tcl_GetCwd(interp, &pwd); #ifdef ZIPFILE ostringstream str; str << (char *)Tcl_GetNameOfExecutable() << ".zip" << ends; if( Zvfs_Mount(interp, (char*)str.str().c_str(), Tcl_DStringValue(&pwd)) != TCL_OK ){ char str[] = "ERROR: Unable to open the auxiliary ds9 file 'ds9.zip'. If you moved the ds9 program from its original location, please also move the zip file to the same place."; cerr << str << endl; exit(1); } #else Zvfs_Mount(interp, (char *)Tcl_GetNameOfExecutable(), Tcl_DStringValue(&pwd)); #endif Tcl_DStringFree(&pwd); } // Tcl if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tk if (Tk_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp,"Tk", Tk_Init, Tk_SafeInit); // Tkblt if (Tkblt_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp, "tkblt", Tkblt_Init, (Tcl_PackageInitProc*)NULL); // Tktable if (Tktable_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tktable", Tktable_Init, (Tcl_PackageInitProc*)NULL); // Tclcheckdns if (Tclcheckdns_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tclcheckdns", Tclcheckdns_Init, (Tcl_PackageInitProc*)NULL); // Tksao if (Tksao_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tksao", Tksao_Init, (Tcl_PackageInitProc*)NULL); // Tkhtml if (Tkhtml_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkhtml", Tkhtml_Init, (Tcl_PackageInitProc*)NULL); // Tclxpa if (Tclxpa_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tclxpa", Tclxpa_Init, (Tcl_PackageInitProc*)NULL); // Tcliis if (Tcliis_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tcliis", Tcliis_Init, (Tcl_PackageInitProc*)NULL); // Tkmpeg if (Tkmpeg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkmpeg", Tkmpeg_Init, (Tcl_PackageInitProc*)NULL); // Tclxml if (Tclxml_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tkimg if (Tkimg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "img", Tkimg_Init, (Tcl_PackageInitProc*)NULL); // zlibtcl if (Zlibtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "zlibtcl", Zlibtcl_Init, (Tcl_PackageInitProc*)NULL); // jpegtcl if (Jpegtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpegtcl", Jpegtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgjpeg if (Tkimgjpeg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpeg", Tkimgjpeg_Init, (Tcl_PackageInitProc*)NULL); // Tifftcl if (Tifftcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tifftcl", Tifftcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgtiff if (Tkimgtiff_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tiff", Tkimgtiff_Init, (Tcl_PackageInitProc*)NULL); // Pngtcl if (Pngtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "pngtcl", Pngtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgpng if (Tkimgpng_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "png", Tkimgpng_Init, (Tcl_PackageInitProc*)NULL); // Tkimggif if (Tkimggif_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "gif", Tkimggif_Init, (Tcl_PackageInitProc*)NULL); // Tkimgwindow if (Tkimgwindow_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "window", Tkimgwindow_Init, (Tcl_PackageInitProc*)NULL); // Signal_Ext if (Signal_ext_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "signal", Signal_ext_Init, (Tcl_PackageInitProc*)NULL); return TCL_OK; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/Makefile.in�������������������������������������������������������������������������000644 �000765 �000000 �00000012234 12602575261 016123� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������DS9CMD = @DS9CMD@ DEBUGCMD = @DEBUGCMD@ CC = @CC@ CXX = @CXX@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_WARNING = @CFLAGS_WARNING@ EXEEXT = @EXEEXT@ OBJEXT = @OBJEXT@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ PKG_CFLAGS = @PKG_CFLAGS@ DEFS = @DEFS@ $(PKG_CFLAGS) CPPFLAGS = @CPPFLAGS@ LIBS = @PKG_LIBS@ @LIBS@ CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_STUB_LIB_SPEC= @TCL_STUB_LIB_SPEC@ TK_LIBS = @TK_LIBS@ TK_LIB_SPEC = @TK_LIB_SPEC@ TK_STUB_LIB_SPEC= @TK_STUB_LIB_SPEC@ .SUFFIXES: .c .C .$(OBJEXT) .c.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ .C.@OBJEXT@: $(COMPILE) -c `@CYGPATH@ $<` -o $@ #--------------------------defines include ../../make.pkgs ZDIR = zipdir/zvfsmntpt OBJS = ds9.o tkAppInit.o FILES = \ $(ZDIR)/$(TCLVER) \ $(ZDIR)/tcl8 \ $(ZDIR)/$(TKVER) \ $(ZDIR)/$(TKBLTDIR) \ $(ZDIR)/$(TCLLIBVER) \ $(ZDIR)/$(TKCONVER) \ $(ZDIR)/$(XMLRPCVER) \ $(ZDIR)/library \ $(ZDIR)/msgs \ $(ZDIR)/doc \ $(ZDIR)/cmaps \ $(ZDIR)/template LLIBS = \ ../../lib/$(TKSAODIR)/libtksao1.0.a \ ../../lib/$(TKSAODIR)/libfuntools.a \ ../../lib/$(TKSAODIR)/libast.a \ ../../lib/$(TKSAODIR)/libast_err.a \ ../../lib/$(TKSAODIR)/libast_pal.a \ ../../lib/$(TKSAODIR)/libtksao1.0.a \ ../../lib/$(TKHTMLDIR)/libtkhtml1.0.a \ ../../lib/$(TKMPEGDIR)/libtkmpeg1.0.a \ ../../lib/$(TCLXMLVER)/libTclxml3.2.a \ ../../lib/$(TKTABLEVER)/libTktable2.10.a \ ../../lib/$(TKIMGVER)/libtkimgpng1.4.a \ ../../lib/$(TKIMGVER)/libpngtcl1.4.3.a \ ../../lib/$(TKIMGVER)/libtkimgtiff1.4.a \ ../../lib/$(TKIMGVER)/libtifftcl3.9.4.a \ ../../lib/$(TKIMGVER)/libtkimgjpeg1.4.a \ ../../lib/$(TKIMGVER)/libjpegtcl8.2.a \ ../../lib/$(TKIMGVER)/libtkimggif1.4.a \ ../../lib/$(TKIMGVER)/libtkimgwindow1.4.a \ ../../lib/$(TKIMGVER)/libzlibtcl1.2.5.a \ ../../lib/$(TKIMGVER)/libtkimg1.4.a \ ../../lib/libtiff.a \ ../../lib/$(TCLZVFSDIR)/libtclzvfs1.0.a \ ../../lib/libxpa.a \ ../../lib/$(TCLIISDIR)/libtcliis1.0.a \ ../../lib/$(TCLCHECKDNSDIR)/libtclcheckdns1.1.a \ ../../lib/$(TCLSIGNALDIR)/libtclsignal1.4.a \ ../../lib/$(TKBLTDIR)/libtkblt3.0.a #--------------------------main all: $(DS9CMD) debug: $(DEBUGCMD) tkAppInit.o : tkAppInit.c $(COMPILE) -DTK_LOCAL_APPINIT=SAOAppInit \ -DTK_LOCAL_MAIN_HOOK=SAOLocalMainHook -c tkAppInit.c -o $@ tkAppInit.c : ../../$(TKDIR)/unix/tkAppInit.c cp ../../$(TKDIR)/unix/tkAppInit.c . ds9 : ds9Base ds9.zip $(RM) $@ strip ds9Base cat ds9Base ds9.zip > ds9$(EXEEXT) zip -A ds9$(EXEEXT) chmod 755 ds9$(EXEEXT) cp ds9$(EXEEXT) ../../bin/. dds9 : ds9Base ds9.zip $(RM) $@ cat ds9Base ds9.zip > ds9$(EXEEXT) zip -A ds9$(EXEEXT) chmod 755 ds9$(EXEEXT) cp ds9$(EXEEXT) ../../bin/. ds9zip : ds9Base ds9.zip $(RM) $@ strip ds9Base cp ds9Base ds9 cp ds9 ../../bin/. cp ds9.zip ../../bin/. cd ../../bin; codesign -s "SAOImage DS9" ds9 dds9zip: ds9Base ds9.zip $(RM) $@ cp ds9Base ds9 cp ds9 ../../bin/. cp ds9.zip ../../bin/. cd ../../bin; codesign -s "SAOImage DS9" ds9 ds9Base : $(OBJS) $(LLIBS) $(RM) $@ $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ \ $(OBJS) \ $(LLIBS) \ $(LIBS) \ $(TK_STUB_LIB_SPEC) $(TK_LIB_SPEC) \ $(TCL_STUB_LIB_SPEC) $(TCL_LIB_SPEC) \ $(TK_LIBS) ds9.zip : $(FILES) cd zipdir; find . -depth -name "CVS" -exec rm -r {} \; cd zipdir; zip -r ../ds9.zip * zipdir : mkdir zipdir mkdir $(ZDIR) $(ZDIR)/$(TCLVER) : zipdir ../../lib/$(TCLVER) $(RM) -r $@ cp -r ../../lib/$(TCLVER) $(ZDIR)/. $(ZDIR)/tcl8 : zipdir ../../lib/tcl8 $(RM) -r $@ cp -r ../../lib/tcl8 $(ZDIR)/. $(ZDIR)/$(TKVER) : zipdir ../../lib/$(TKVER) $(RM) -r $@ cp -r ../../lib/$(TKVER) $(ZDIR)/. rm -rf $(ZDIR)/$(TKVER)/images rm -rf $(ZDIR)/$(TKVER)/demos $(ZDIR)/$(TKBLTDIR) : zipdir $(RM) -r $@ mkdir $(ZDIR)/$(TKBLTDIR) cp ../../$(TKBLTDIR)/library/graph.tcl $(ZDIR)/$(TKBLTDIR)/. $(ZDIR)/$(TCLLIBVER) : zipdir $(RM) -r $@ mkdir $(ZDIR)/$(TCLLIBVER) cp -r ../../$(TCLLIBDIR)/modules/base64 $(ZDIR)/$(TCLLIBVER)/. cp -r ../../$(TCLLIBDIR)/modules/ftp $(ZDIR)/$(TCLLIBVER)/. cp -r ../../$(TCLLIBDIR)/modules/log $(ZDIR)/$(TCLLIBVER)/. cp -r ../../$(TCLLIBDIR)/modules/textutil $(ZDIR)/$(TCLLIBVER)/. cp -r ../../$(TCLLIBDIR)/modules/math $(ZDIR)/$(TCLLIBVER)/. $(ZDIR)/$(TKCONVER) : zipdir ../../lib/$(TKCONVER) $(RM) -r $@ cp -r ../../lib/$(TKCONVER) $@ $(ZDIR)/$(XMLRPCVER) : zipdir ../../lib/$(XMLRPCVER) $(RM) -r $@ cp -r ../../lib/$(XMLRPCVER) $@ $(ZDIR)/library : zipdir ../library/*.tcl $(RM) -r $@ cp -r ../library $(ZDIR)/. $(ZDIR)/msgs : zipdir ../msgs/* $(RM) -r $@ cp -r ../msgs $(ZDIR)/. $(ZDIR)/doc : zipdir ../doc/* ../doc/ref/* ../doc/user/* ../doc/release/* $(RM) -r $@ cd ..; find doc -name "*.html" | cpio -pdmuv unix/$(ZDIR) cd ..; find doc -name "*.gif" | cpio -pdmuv unix/$(ZDIR) cd ..; find doc -name "*.png" | cpio -pdmuv unix/$(ZDIR) $(ZDIR)/cmaps : zipdir ../cmaps/* $(RM) -r $@ cp -r ../cmaps $(ZDIR)/. $(ZDIR)/template : zipdir ../template/* $(RM) -r $@ cd ..; find template -name "*.tpl" | cpio -pdmuv unix/$(ZDIR) #--------------------------cleanup distclean: clean -rm -f Makefile config.cache config.log config.status clean : FORCE cd ../library; $(MAKE) clean $(RM) core *~ *# ds9Base ds9 *.zip *.o $(RM) -r zipdir FORCE : ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/tclconfig/��������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016021� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/tclconfig/ChangeLog�����������������������������������������������������������������000644 �000765 �000000 �00000106605 12556763143 017614� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/tclconfig/install-sh����������������������������������������������������������������000755 �000765 �000000 �00000033054 12556763143 020043� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/tclconfig/README.txt����������������������������������������������������������������000644 �000765 �000000 �00000001454 12556763143 017534� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/unix/tclconfig/tcl.m4��������������������������������������������������������������������000644 �000765 �000000 �00000404642 12602575261 017062� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ����������������������������������������������������������������������������������������������saods9/ds9/template/chandra/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016301� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/heasarc/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016307� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015476� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/xmm/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015502� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/xmm/epicmos1.tpl����������������������������������������������������������������000644 �000765 �000000 �00000002501 10370226422 017734� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/xmm/epicmos/image_epicmos1.ds global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(-0.017,-0.014495,0) || point(359.98122,-0.014772826) || # point=boxcircle # text(0.095331979,0.18528183) || text={5} # text(0.18353977,0.0004077268) || text={6} # text(359.99987,0.00040772889) || text={1} # text(359.90683,0.18649016) || text={4} # text(359.81379,0.0016160537) || text={3} # text(0.092915319,-0.18325807) || text={7} # text(359.90925,-0.18204976) || text={2} polygon(0.18524639,0.27414948,0.0045201849,0.27427278,0.0056046815,0.09358257,0.1845215,0.093406209) || polygon(0.18400899,-0.094584329,0.0032641713,-0.093859609,0.0043500151,-0.27454963,0.18385383,-0.2741015) || polygon(0.27711421,0.089482136,0.094538624,0.090759,0.093867077,-0.091797152,0.27761497,-0.091828859) || polygon(0.092712157,0.091309595,359.91014,0.092586111,359.91122,-0.088106013,0.092552581,-0.088209985) || polygon(0.0033282835,0.27363238,359.82076,0.27490768,359.82001,0.094768685,0.0031744198,0.094115539) || polygon(359.90953,0.092568474,359.72696,0.093844064,359.72812,-0.089262169,359.90881,-0.088176995) || polygon(0.0019846216,-0.091478854,359.81886,-0.092032372,359.8205,-0.27089198,0.0018258799,-0.27099729) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/xmm/epicmos2.tpl����������������������������������������������������������������000644 �000765 �000000 �00000002501 10370226423 017736� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/xmm/epicmos/image_epicmos2.ds global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(-.02,-.015099,0) || point(359.98032,-0.015255945) || # point=boxcircle # text(0.002598154,-7.5391061e-05) || text={1} # text(0.19351408,-0.090699798) || text={2} # text(0.0013898207,-0.18132479) || text={3} # text(359.80806,-0.090699806) || text={4} # text(0.19351408,0.09175734) || text={7} # text(0.00018148737,0.18600729) || text={6} # text(359.80927,0.092965679) || text={5} polygon(0.092381631,0.092656826,359.91167,0.092172121,359.91162,-0.090971255,0.092913154,-0.089866031) || polygon(0.091779215,-0.092315194,359.90928,-0.093457297,359.91102,-0.2759413,0.092316593,-0.27483652) || polygon(359.90894,-8.3494418e-05,359.72643,-0.00062029737,359.72749,-0.18040463,359.90763,-0.18114781) || polygon(359.90805,0.18424156,359.72735,0.1837549,359.7273,0.00061430326,359.90859,0.0017195055) || polygon(0.091791652,0.27698791,359.91108,0.27650239,359.91103,0.09336198,0.092327659,0.094467032) || polygon(0.27583152,0.18479008,0.095118571,0.18430591,0.095069778,0.001163703,0.27636646,0.0022696912) || polygon(0.27552481,0.00013033963,0.094815474,-0.00035441732,0.094691734,-0.18108137,0.27625199,-0.17875761) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/xmm/epicpn.tpl������������������������������������������������������������������000644 �000765 �000000 �00000004246 10370226423 017503� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/xmm/epicpn/image_epicpn.ds global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(-0.032,0.0166,0) || point(359.9684,0.017688302) || # point=boxcircle polygon(0.0024077734,-0.00014830005,359.78785,-0.00041752552,359.78786,-0.072646412,0.0018211508,-0.072695941) || # text(359.90368,-0.036006347) || text={1} polygon(0.0024077734,-0.00014830005,359.78785,-0.00041752552,359.78786,-0.072646412,0.0018211508,-0.072695941) || # text(359.90247,-0.11213125) || text={2} polygon(0.0021963947,-0.075102588,359.78764,-0.075372326,359.78765,-0.14760027,0.0016077991,-0.14765228) || # text(359.90368,-0.18704668) || text={3} polygon(0.0019729992,-0.14975594,359.78741,-0.15002511,359.78742,-0.2222521,0.0013929609,-0.22230368) || # text(359.90247,0.041326975) || text={4} polygon(0.0026231785,0.074806934,359.78805,0.074537239,359.78807,0.0023093611,0.0020385428,0.0022583476) || # text(359.90126,0.11382726) || text={5} polygon(0.0028373576,0.14976211,359.78827,0.14949189,359.78828,0.077263098,0.0022494778,0.077213572) || # text(359.90247,0.18632595) || text={6} polygon(0.0030451022,0.22471722,359.78848,0.2244455,359.78849,0.15221877,0.0024592092,0.15216874) || # text(0.11272235,0.040118972) || text={7} polygon(0.21961801,0.074544059,0.0050560461,0.074274386,0.0050631475,0.0020453621,0.21903517,0.0019959256) || # text(0.11272285,0.11141062) || text={8} polygon(0.21982932,0.14949757,0.0052702679,0.14922958,0.0052781157,0.077000618,0.21924514,0.076949464) || # text(0.11513727,0.18753426) || text={9} polygon(0.22003744,0.22445102,0.0054832423,0.22418372,0.0054866164,0.15195581,0.21945715,0.15190497) || # text(0.1115122,-0.037214702) || text={10} polygon(0.21940876,-0.00041148409,0.0048458181,-0.00068086539,0.0048521831,-0.072908947,0.21882206,-0.07295968) || # text(0.1127201,-0.11333958) || text={11} polygon(0.21919634,-0.075366094,0.0046291113,-0.075636181,0.0046399943,-0.14786432,0.21860577,-0.14791435) || # text(0.11272043,-0.1870464) || text={12} polygon(0.21897336,-0.15001881,0.0044055854,-0.15028956,0.0044157238,-0.22251775,0.21838946,-0.22256606) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/binospec.tpl����������������������������������������������������������������000644 �000765 �000000 �00000000433 11073704415 020020� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || composite=1 box(359.9225,0,480",900",0) || # tag={Bino} box(0.077500142,0,480",900",0) # tag={Bino} �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/hecto/����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016600� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/megacam/��������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 017070� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/mmirs/����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016625� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/swirc.tpl�������������������������������������������������������������������000644 �000765 �000000 �00000003736 10270004707 017351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/sao/swirc.fits global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || point(0,0) || # point=boxcircle # text(359.97636,0.021004921) || font="times 12 normal" text={I} # text(359.97633,-0.021495059) || font="times 12 normal" text={II} # text(0.023662353,-0.021532975) || font="times 12 normal" text={III} # text(0.023196531,0.021134073) || font="times 12 normal" text={IV} box(0.021365501,0.02401054,153.6",19.2",0) || box(0.021361229,0.01867721,153.6",19.2",0) || box(359.97603,0.021380188,19.2",153.6",0) || box(359.97866,-0.01862193,153.6",19.2",0) || box(359.97866,-0.023955261,153.6",19.2",0) || box(0.023995853,-0.021324909,19.2",153.6",0) || box(0.021348413,0.0026772167,153.6",19.2",0) || box(0.021352685,0.0080105479,153.6",19.2",0) || box(0.021356957,0.013343879,153.6",19.2",0) || box(0.021369773,0.02934387,153.6",19.2",0) || box(0.021374046,0.0346772,153.6",19.2",0) || box(0.021378318,0.040010529,153.6",19.2",0) || box(359.97865,-0.039955249,153.6",19.2",0) || box(359.97865,-0.03462192,153.6",19.2",0) || box(359.97866,-0.029288591,153.6",19.2",0) || box(359.97867,-0.013288599,153.6",19.2",0) || box(359.97867,-0.0079552683,153.6",19.2",0) || box(359.97868,-0.0026219371,153.6",19.2",0) || box(359.96003,0.021393001,19.2",153.6",0) || box(359.96536,0.021388731,19.2",153.6",0) || box(359.9707,0.021384459,19.2",153.6",0) || box(359.98136,0.021375917,19.2",153.6",0) || box(359.9867,0.021371645,19.2",153.6",0) || box(359.99203,0.021367373,19.2",153.6",0) || box(359.99736,0.021363101,19.2",153.6",0) || box(0.0026625281,-0.021307822,19.2",153.6",0) || box(0.0079958596,-0.021312094,19.2",153.6",0) || box(0.013329191,-0.021316366,19.2",153.6",0) || box(0.018662522,-0.021320637,19.2",153.6",0) || box(0.029329184,-0.02132918,19.2",153.6",0) || box(0.034662514,-0.021333451,19.2",153.6",0) || box(0.039995843,-0.021337722,19.2",153.6",0) ����������������������������������saods9/ds9/template/mmt/mmirs/image.tpl�������������������������������������������������������������000644 �000765 �000000 �00000005050 11444434371 020432� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: test.fits global color=green dashlist=8 3 width=1 font="helvetica 10 normal" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,5.2213707e-05) || composite=1 box(0,0,408",408",5.2213707e-05) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016979321,359.89215,0.057385486,359.90996,0.092233383,359.94322,0.11811841,359.98286,0.13249802,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,359.98288,0.073283367,359.94221,0.069587115,359.92874,0.054886822,359.92887,-0.055011809,359.94234,-0.069675137,359.98292,-0.073297943,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,359.98294,-0.13251162,359.94344,-0.11820308,359.91024,-0.092419349,359.89236,-0.057641649,359.89229,-0.017235729) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016944321,359.89215,0.056508482,359.91364,0.088477822,359.94746,0.1093244,359.98286,0.1175641,359.98287,0.091928249,359.93711,0.086467601,359.92194,0.079989511,359.91524,0.062597422,359.91542,-0.062765368,359.92215,-0.080135045,359.93729,-0.08656855,359.98293,-0.091941579,359.98293,-0.117578,359.94765,-0.10939812,359.9139,-0.088649851,359.89236,-0.056764653,359.89229,-0.017200729) || # tag={Mask} # text(359.90741,-9.7747524e-05) || textangle=270.00005 text={Camera 1} tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283029,0.017027184,0.11290769,0.057431829,0.090040766,0.092277881,0.056787713,0.11814596,0.017143943,0.13250625,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,0.017125131,0.073291941,0.057793497,0.069616127,0.071262324,0.054922962,0.071130502,-0.054973028,0.057658219,-0.069643411,0.017083571,-0.073288523,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,0.017068804,-0.13250186,0.056562363,-0.11817101,0.089760798,-0.092369245,0.11268869,-0.057590992,0.11276514,-0.017186583) || # tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283022,0.016992185,0.11192484,0.056556496,0.086360832,0.088520613,0.052547573,0.10935005,0.017139089,0.11757242,0.017130929,0.091936714,0.062891853,0.086498803,0.078062803,0.080028419,0.084756883,0.062640181,0.084577917,-0.062719024,0.077852405,-0.080091921,0.0627089,-0.086533678,0.017078796,-0.091932052,0.017072419,-0.11756833,0.052354648,-0.1093686,0.086103276,-0.088601901,0.11171106,-0.056712414,0.11276521,-0.017151584) || # tag={Mask} # text(0.092595036,-4.9017175e-05) || textangle=90.000052 text={Camera 2} tag={Mask} # vector(359.96798,0.055537453,180",180.00005) || vector=1 tag={Mask} # text(359.98315,0.062281588) textangle=180.00005 text={Wavelength} tag={Mask} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/mmirs/longslit.tpl����������������������������������������������������������000644 �000765 �000000 �00000005046 11444434371 021210� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: test.fits global color=green dashlist=8 3 width=1 font="helvetica 10 normal" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,5.2213707e-05) || composite=1 box(0,0,1",408",5.2213707e-05) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016979321,359.89215,0.057385486,359.90996,0.092233383,359.94322,0.11811841,359.98286,0.13249802,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,359.98288,0.073283367,359.94221,0.069587115,359.92874,0.054886822,359.92887,-0.055011809,359.94234,-0.069675137,359.98292,-0.073297943,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,359.98294,-0.13251162,359.94344,-0.11820308,359.91024,-0.092419349,359.89236,-0.057641649,359.89229,-0.017235729) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016944321,359.89215,0.056508482,359.91364,0.088477822,359.94746,0.1093244,359.98286,0.1175641,359.98287,0.091928249,359.93711,0.086467601,359.92194,0.079989511,359.91524,0.062597422,359.91542,-0.062765368,359.92215,-0.080135045,359.93729,-0.08656855,359.98293,-0.091941579,359.98293,-0.117578,359.94765,-0.10939812,359.9139,-0.088649851,359.89236,-0.056764653,359.89229,-0.017200729) || # tag={Mask} # text(359.90741,-9.7747524e-05) || textangle=270.00005 text={Camera 1} tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283029,0.017027184,0.11290769,0.057431829,0.090040766,0.092277881,0.056787713,0.11814596,0.017143943,0.13250625,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,0.017125131,0.073291941,0.057793497,0.069616127,0.071262324,0.054922962,0.071130502,-0.054973028,0.057658219,-0.069643411,0.017083571,-0.073288523,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,0.017068804,-0.13250186,0.056562363,-0.11817101,0.089760798,-0.092369245,0.11268869,-0.057590992,0.11276514,-0.017186583) || # tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283022,0.016992185,0.11192484,0.056556496,0.086360832,0.088520613,0.052547573,0.10935005,0.017139089,0.11757242,0.017130929,0.091936714,0.062891853,0.086498803,0.078062803,0.080028419,0.084756883,0.062640181,0.084577917,-0.062719024,0.077852405,-0.080091921,0.0627089,-0.086533678,0.017078796,-0.091932052,0.017072419,-0.11756833,0.052354648,-0.1093686,0.086103276,-0.088601901,0.11171106,-0.056712414,0.11276521,-0.017151584) || # tag={Mask} # text(0.092595036,-4.9017175e-05) || textangle=90.000052 text={Camera 2} tag={Mask} # vector(359.96798,0.055537453,180",180.00005) || vector=1 tag={Mask} # text(359.98315,0.062281588) textangle=180.00005 text={Wavelength} tag={Mask} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/mmirs/mask.tpl��������������������������������������������������������������000644 �000765 �000000 �00000005050 11444434371 020303� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: test.fits global color=green dashlist=8 3 width=1 font="helvetica 10 normal" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,5.2213707e-05) || composite=1 box(0,0,240",408",5.2213707e-05) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016979321,359.89215,0.057385486,359.90996,0.092233383,359.94322,0.11811841,359.98286,0.13249802,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,359.98288,0.073283367,359.94221,0.069587115,359.92874,0.054886822,359.92887,-0.055011809,359.94234,-0.069675137,359.98292,-0.073297943,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,359.98294,-0.13251162,359.94344,-0.11820308,359.91024,-0.092419349,359.89236,-0.057641649,359.89229,-0.017235729) || # tag={Mask} polygon(359.89225,-0.00012771548,359.89222,0.016944321,359.89215,0.056508482,359.91364,0.088477822,359.94746,0.1093244,359.98286,0.1175641,359.98287,0.091928249,359.93711,0.086467601,359.92194,0.079989511,359.91524,0.062597422,359.91542,-0.062765368,359.92215,-0.080135045,359.93729,-0.08656855,359.98293,-0.091941579,359.98293,-0.117578,359.94765,-0.10939812,359.9139,-0.088649851,359.89236,-0.056764653,359.89229,-0.017200729) || # tag={Mask} # text(359.90741,-9.7747524e-05) || textangle=270.00005 text={Camera 1} tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283029,0.017027184,0.11290769,0.057431829,0.090040766,0.092277881,0.056787713,0.11814596,0.017143943,0.13250625,1.6000224e-06,0.11759077,8.5553752e-07,0.091934992,0.017125131,0.073291941,0.057793497,0.069616127,0.071262324,0.054922962,0.071130502,-0.054973028,0.057658219,-0.069643411,0.017083571,-0.073288523,1.9770939e-06,-0.091934318,3.0342173e-06,-0.11759067,0.017068804,-0.13250186,0.056562363,-0.11817101,0.089760798,-0.092369245,0.11268869,-0.057590992,0.11276514,-0.017186583) || # tag={Mask} polygon(0.11279767,-7.9210806e-05,0.11283022,0.016992185,0.11192484,0.056556496,0.086360832,0.088520613,0.052547573,0.10935005,0.017139089,0.11757242,0.017130929,0.091936714,0.062891853,0.086498803,0.078062803,0.080028419,0.084756883,0.062640181,0.084577917,-0.062719024,0.077852405,-0.080091921,0.0627089,-0.086533678,0.017078796,-0.091932052,0.017072419,-0.11756833,0.052354648,-0.1093686,0.086103276,-0.088601901,0.11171106,-0.056712414,0.11276521,-0.017151584) || # tag={Mask} # text(0.092595036,-4.9017175e-05) || textangle=90.000052 text={Camera 2} tag={Mask} # vector(359.96798,0.055537453,180",180.00005) || vector=1 tag={Mask} # text(359.98315,0.062281588) textangle=180.00005 text={Wavelength} tag={Mask} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/megacam/megacam-amp-guide.tpl�����������������������������������������������000644 �000765 �000000 �00000021164 11075735605 023063� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0|| composite=1 point(0,0) || # point=boxcircle # text(359.83864,-0.20117642) || textangle=89.5 text={A1} box(359.83867,-0.20115398,81.586975",367.7002",89.5) || # text(359.83844,-0.1784702) || textangle=89.5 text={A2} box(359.83847,-0.17844776,81.586975",367.7002",89.5) || # text(359.83823,-0.15407873) || textangle=89.5 text={A3} box(359.83825,-0.15405641,81.586975",367.7002",89.5) || # text(359.83803,-0.13137242) || textangle=89.5 text={A4} box(359.83805,-0.13135009,81.586975",367.7002",89.5) || # text(359.83783,-0.10698076) || textangle=89.5 text={A5} box(359.83785,-0.10695843,81.586975",367.7002",89.5) || # text(359.83762,-0.084274433) || textangle=89.5 text={A6} box(359.83764,-0.084252106,81.586975",367.7002",89.5) || # text(359.83742,-0.059882774) || textangle=89.5 text={A7} box(359.83744,-0.059860347,81.586975",367.7002",89.5) || # text(359.83722,-0.037176259) || textangle=89.5 text={A8} box(359.83724,-0.037153931,81.586975",367.7002",89.5) || # text(359.837,-0.012784701) || textangle=89.5 text={A9} box(359.83703,-0.012762259,81.586975",367.7002",89.5) || # text(359.8368,0.0099217144) || textangle=89.5 text={A10} box(359.83683,0.0099441558,81.586975",367.7002",89.5) || # text(359.83658,0.034313386) || textangle=89.5 text={A11} box(359.8366,0.034335714,81.586975",367.7002",89.5) || # text(359.83639,0.057019803) || textangle=89.5 text={A12} box(359.8364,0.05704213,81.586975",367.7002",89.5) || # text(359.83618,0.081411562) || textangle=89.5 text={A13} box(359.8362,0.081433889,81.586975",367.7002",89.5) || # text(359.83597,0.10411788) || textangle=89.5 text={A14} box(359.83599,0.10414022,81.586975",367.7002",89.5) || # text(359.83577,0.12850954) || textangle=89.5 text={A15} box(359.83579,0.12853188,81.586975",367.7002",89.5) || # text(359.83557,0.15121586) || textangle=89.5 text={A16} box(359.83559,0.15123819,81.586975",367.7002",89.5) || # text(359.83535,0.17560722) || textangle=89.5 text={A17} box(359.83537,0.17562955,81.586975",367.7002",89.5) || # text(359.83515,0.19831344) || textangle=89.5 text={A18} box(359.83518,0.19833588,81.586975",367.7002",89.5) || # text(359.95003,-0.20020716) || textangle=89.5 text={A19} box(359.95007,-0.2001846,81.586975",367.7002",89.5) || # text(359.94983,-0.17750084) || textangle=89.5 text={A20} box(359.94987,-0.17747829,81.586975",367.7002",89.5) || # text(359.94962,-0.15310927) || textangle=89.5 text={A21} box(359.94966,-0.15308671,81.586975",367.7002",89.5) || # text(359.94942,-0.13040286) || textangle=89.5 text={A22} box(359.94946,-0.1303804,81.586975",367.7002",89.5) || # text(359.9492,-0.1060113) || textangle=89.5 text={A23} box(359.94924,-0.10598873,81.586975",367.7002",89.5) || # text(359.94901,-0.08330477) || textangle=89.5 text={A24} box(359.94905,-0.083282213,81.586975",367.7002",89.5) || # text(359.94878,-0.058913113) || textangle=89.5 text={A25} box(359.94883,-0.058890441,81.586975",367.7002",89.5) || # text(359.94859,-0.036206483) || textangle=89.5 text={A26} box(359.94863,-0.036184025,81.586975",367.7002",89.5) || # text(359.94838,-0.011814738) || textangle=89.5 text={A27} box(359.94843,-0.011792066,81.586975",367.7002",89.5) || # text(359.94818,0.010891805) || textangle=89.5 text={A28} box(359.94822,0.010914362,81.586975",367.7002",89.5) || # text(359.94797,0.03528355) || textangle=89.5 text={A29} box(359.94802,0.035306221,81.586975",367.7002",89.5) || # text(359.94777,0.057990092) || textangle=89.5 text={A30} box(359.94781,0.058012649,81.586975",367.7002",89.5) || # text(359.94756,0.082381837) || textangle=89.5 text={A31} box(359.94761,0.082404408,81.586975",367.7002",89.5) || # text(359.94735,0.10508817) || textangle=89.5 text={A32} box(359.9474,0.10511083,81.586975",367.7002",89.5) || # text(359.94715,0.12947993) || textangle=89.5 text={A33} box(359.9472,0.12950259,81.586975",367.7002",89.5) || # text(359.94695,0.15218634) || textangle=89.5 text={A34} box(359.947,0.15220891,81.586975",367.7002",89.5) || # text(359.94673,0.17657792) || textangle=89.5 text={A35} box(359.94678,0.17660058,81.586975",367.7002",89.5) || # text(359.94654,0.19928423) || textangle=89.5 text={A36} box(359.94659,0.1993068,81.586975",367.7002",89.5) || # text(0.053422167,-0.19930672) || textangle=89.5 text={A37} box(0.053451906,-0.19928428,81.586975",367.7002",89.5) || # text(0.053230353,-0.17660032) || textangle=89.5 text={A38} box(0.053250094,-0.17657799,81.586975",367.7002",89.5) || # text(0.053019108,-0.15220873) || textangle=89.5 text={A39} box(0.053038849,-0.1521864,81.586975",367.7002",89.5) || # text(0.052817296,-0.12950244) || textangle=89.5 text={A40} box(0.052837036,-0.12948012,81.586975",367.7002",89.5) || # text(0.052606049,-0.10511075) || textangle=89.5 text={A41} box(0.052625787,-0.10508833,81.586975",367.7002",89.5) || # text(0.052404233,-0.082404267) || textangle=89.5 text={A42} box(0.052423972,-0.082381938,81.586975",367.7002",89.5) || # text(0.052192982,-0.058012476) || textangle=89.5 text={A43} box(0.052212722,-0.057990148,81.586975",367.7002",89.5) || # text(0.051991165,-0.035306089) || textangle=89.5 text={A44} box(0.052010904,-0.035283661,81.586975",367.7002",89.5) || # text(0.051779913,-0.010914299) || textangle=89.5 text={A45} box(0.051799651,-0.010891871,81.586975",367.7002",89.5) || # text(0.051578093,0.011792188) || textangle=89.5 text={A46} box(0.051597832,0.011814616,81.586975",367.7002",89.5) || # text(0.051366839,0.036183977) || textangle=89.5 text={A47} box(0.051386577,0.036206406,81.586975",367.7002",89.5) || # text(0.051165016,0.058890464) || textangle=89.5 text={A48} box(0.051194752,0.058912908,81.586975",367.7002",89.5) || # text(0.05095376,0.083282255) || textangle=89.5 text={A49} box(0.050973498,0.083304583,81.586975",367.7002",89.5) || # text(0.050761932,0.10598876) || textangle=89.5 text={A50} box(0.050781669,0.10601119,81.586975",367.7002",89.5) || # text(0.050540675,0.13038043) || textangle=89.5 text={A51} box(0.05057041,0.13040288,81.586975",367.7002",89.5) || # text(0.050348846,0.15308683) || textangle=89.5 text={A52} box(0.050368584,0.15310917,81.586975",367.7002",89.5) || # text(0.050127588,0.17747831) || textangle=89.5 text={A53} box(0.050157322,0.17750076,81.586975",367.7002",89.5) || # text(0.049935755,0.20018471) || textangle=89.5 text={A54} box(0.049955493,0.20020703,81.586975",367.7002",89.5) || # text(0.16483089,-0.19833571) || textangle=89.5 text={A55} box(0.16485064,-0.19831338,81.586975",367.7002",89.5) || # text(0.16462814,-0.17562963) || textangle=89.5 text={A56} box(0.16465787,-0.17560709,81.586975",367.7002",89.5) || # text(0.16441587,-0.15123805) || textangle=89.5 text={A57} box(0.16443561,-0.15121572,81.586975",367.7002",89.5) || # text(0.1642231,-0.12853175) || textangle=89.5 text={A58} box(0.16424285,-0.12850943,81.586975",367.7002",89.5) || # text(0.16401084,-0.10414017) || textangle=89.5 text={A59} box(0.16403057,-0.10411775,81.586975",367.7002",89.5) || # text(0.16380807,-0.081433798) || textangle=89.5 text={A60} box(0.16382782,-0.081411469,81.586975",367.7002",89.5) || # text(0.16359581,-0.057042117) || textangle=89.5 text={A61} box(0.16361554,-0.057019787,81.586975",367.7002",89.5) || # text(0.16339304,-0.034335739) || textangle=89.5 text={A62} box(0.16342277,-0.034313294,81.586975",367.7002",89.5) || # text(0.16318077,-0.0099440576) || textangle=89.5 text={A63} box(0.16320051,-0.0099217278,81.586975",367.7002",89.5) || # text(0.162988,0.012762437) || textangle=89.5 text={A64} box(0.16300773,0.012784766,81.586975",367.7002",89.5) || # text(0.16277572,0.037154118) || textangle=89.5 text={A65} box(0.16279546,0.037176447,81.586975",367.7002",89.5) || # text(0.16257296,0.059860497) || textangle=89.5 text={A66} box(0.16259269,0.059882825,81.586975",367.7002",89.5) || # text(0.16236067,0.084252178) || textangle=89.5 text={A67} box(0.16238042,0.084274507,81.586975",367.7002",89.5) || # text(0.1621579,0.10695856) || textangle=89.5 text={A68} box(0.16217764,0.10698089,81.586975",367.7002",89.5) || # text(0.16194562,0.13135014) || textangle=89.5 text={A69} box(0.16196536,0.13137247,81.586975",367.7002",89.5) || # text(0.16175284,0.15405653) || textangle=89.5 text={A70} box(0.16177259,0.15407886,81.586975",367.7002",89.5) || # text(0.16153057,0.1784479) || textangle=89.5 text={A71} box(0.1615603,0.17847035,81.586975",367.7002",89.5) || # text(0.16133779,0.20115409) || textangle=89.5 text={A72} box(0.16135752,0.20117652,81.586975",367.7002",89.5)|| # text(359.99712,0.32469933) || textangle=89.429076 text={G1} box(359.99712,0.32469933,163.33361",367.7002",89.429076) || # text(0.0028790655,-0.32469933) || textangle=89.429076 text={G2} box(0.0028790655,-0.32469933,163.33361",367.7002",89.429076) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/megacam/megacam-amp.tpl�����������������������������������������������������000644 �000765 �000000 �00000020176 10271504030 021751� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/sao/megacam.fits[IM1] global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || point(0,0) || # point=boxcircle # text(359.83689,-0.19976359) || textangle=90 text={A1} box(359.83692,-0.19974141,81.586975",367.7002",90) || # text(359.83689,-0.17705651) || textangle=90 text={A2} box(359.83692,-0.17703433,81.586975",367.7002",90) || # text(359.83689,-0.15266411) || textangle=90 text={A3} box(359.83691,-0.15264196,81.586975",367.7002",90) || # text(359.83689,-0.12995693) || textangle=90 text={A4} box(359.83691,-0.12993478,81.586975",367.7002",90) || # text(359.8369,-0.10556443) || textangle=90 text={A5} box(359.83692,-0.10554228,81.586975",367.7002",90) || # text(359.83689,-0.082857155) || textangle=90 text={A6} box(359.83691,-0.082835001,81.586975",367.7002",90) || # text(359.8369,-0.058464655) || textangle=90 text={A7} box(359.83692,-0.058442401,81.586975",367.7002",90) || # text(359.8369,-0.035757276) || textangle=90 text={A8} box(359.83692,-0.035735122,81.586975",367.7002",90) || # text(359.83689,-0.011364703) || textangle=90 text={A9} box(359.83692,-0.011342522,81.586975",367.7002",90) || # text(359.83689,0.011342576) || textangle=90 text={A10} box(359.83692,0.011364757,81.586975",367.7002",90) || # text(359.83689,0.035735176) || textangle=90 text={A11} box(359.83691,0.03575733,81.586975",367.7002",90) || # text(359.83689,0.058442456) || textangle=90 text={A12} box(359.83691,0.05846461,81.586975",367.7002",90) || # text(359.8369,0.082835056) || textangle=90 text={A13} box(359.83692,0.08285721,81.586975",367.7002",90) || # text(359.83689,0.10554233) || textangle=90 text={A14} box(359.83691,0.10556449,81.586975",367.7002",90) || # text(359.8369,0.12993483) || textangle=90 text={A15} box(359.83692,0.12995699,81.586975",367.7002",90) || # text(359.8369,0.15264201) || textangle=90 text={A16} box(359.83692,0.15266417,81.586975",367.7002",90) || # text(359.83689,0.17703439) || textangle=90 text={A17} box(359.83691,0.17705654,81.586975",367.7002",90) || # text(359.83689,0.19974147) || textangle=90 text={A18} box(359.83692,0.19976365,81.586975",367.7002",90) || # text(359.94828,-0.19976436) || textangle=90 text={A19} box(359.94832,-0.19974215,81.586975",367.7002",90) || # text(359.94828,-0.17705718) || textangle=90 text={A20} box(359.94832,-0.17703497,81.586975",367.7002",90) || # text(359.94828,-0.15266468) || textangle=90 text={A21} box(359.94832,-0.15264247,81.586975",367.7002",90) || # text(359.94828,-0.1299574) || textangle=90 text={A22} box(359.94832,-0.12993529,81.586975",367.7002",90) || # text(359.94827,-0.10556483) || textangle=90 text={A23} box(359.94832,-0.10554269,81.586975",367.7002",90) || # text(359.94828,-0.082857522) || textangle=90 text={A24} box(359.94832,-0.082835313,81.586975",367.7002",90) || # text(359.94827,-0.05846485) || textangle=90 text={A25} box(359.94832,-0.058442613,81.586975",367.7002",90) || # text(359.94828,-0.035757443) || textangle=90 text={A26} box(359.94832,-0.035735333,81.586975",367.7002",90) || # text(359.94828,-0.01136477) || textangle=90 text={A27} box(359.94833,-0.011342533,81.586975",367.7002",90) || # text(359.94828,0.011342636) || textangle=90 text={A28} box(359.94832,0.011364846,81.586975",367.7002",90) || # text(359.94828,0.035735309) || textangle=90 text={A29} box(359.94833,0.035757546,81.586975",367.7002",90) || # text(359.94828,0.058442715) || textangle=90 text={A30} box(359.94832,0.058464925,81.586975",367.7002",90) || # text(359.94828,0.082835388) || textangle=90 text={A31} box(359.94833,0.082857525,81.586975",367.7002",90) || # text(359.94827,0.10554267) || textangle=90 text={A32} box(359.94832,0.1055649,81.586975",367.7002",90) || # text(359.94828,0.12993527) || textangle=90 text={A33} box(359.94833,0.1299575,81.586975",367.7002",90) || # text(359.94828,0.15264255) || textangle=90 text={A34} box(359.94833,0.15266468,81.586975",367.7002",90) || # text(359.94828,0.17703505) || textangle=90 text={A35} box(359.94833,0.17705728,81.586975",367.7002",90) || # text(359.94828,0.19974223) || textangle=90 text={A36} box(359.94833,0.19976436,81.586975",367.7002",90) || # text(0.051677255,-0.19976435) || textangle=90 text={A37} box(0.051707189,-0.19974217,81.586975",367.7002",90) || # text(0.051684011,-0.17705714) || textangle=90 text={A38} box(0.051703946,-0.17703499,81.586975",367.7002",90) || # text(0.051686072,-0.15266464) || textangle=90 text={A39} box(0.051706007,-0.15264249,81.586975",367.7002",90) || # text(0.051682828,-0.12995746) || textangle=90 text={A40} box(0.051702762,-0.12993531,81.586975",367.7002",90) || # text(0.051684887,-0.10556486) || textangle=90 text={A41} box(0.051704821,-0.10554261,81.586975",367.7002",90) || # text(0.05168164,-0.082857485) || textangle=90 text={A42} box(0.051701574,-0.082835329,81.586975",367.7002",90) || # text(0.051683696,-0.058464784) || textangle=90 text={A43} box(0.05170363,-0.058442629,81.586975",367.7002",90) || # text(0.051680447,-0.035757505) || textangle=90 text={A44} box(0.051700381,-0.03573525,81.586975",367.7002",90) || # text(0.051682501,-0.011364805) || textangle=90 text={A45} box(0.051702435,-0.011342549,81.586975",367.7002",90) || # text(0.05167925,0.011342574) || textangle=90 text={A46} box(0.051699184,0.01136483,81.586975",367.7002",90) || # text(0.051681302,0.035735274) || textangle=90 text={A47} box(0.051701235,0.03575753,81.586975",367.7002",90) || # text(0.051678048,0.058442653) || textangle=90 text={A48} box(0.051707979,0.058464837,81.586975",367.7002",90) || # text(0.051680098,0.082835354) || textangle=90 text={A49} box(0.051700031,0.082857509,81.586975",367.7002",90) || # text(0.051686839,0.10554266) || textangle=90 text={A50} box(0.051706772,0.10556492,81.586975",367.7002",90) || # text(0.051678889,0.12993533) || textangle=90 text={A51} box(0.051708819,0.12995752,81.586975",367.7002",90) || # text(0.051685628,0.15264254) || textangle=90 text={A52} box(0.051705561,0.1526647,81.586975",367.7002",90) || # text(0.051677676,0.17703501) || textangle=90 text={A53} box(0.051707605,0.1770572,81.586975",367.7002",90) || # text(0.051684413,0.19974222) || textangle=90 text={A54} box(0.051704345,0.19976437,81.586975",367.7002",90) || # text(0.16309024,-0.19976357) || textangle=90 text={A55} box(0.16311018,-0.19974141,81.586975",367.7002",90) || # text(0.16308605,-0.17705659) || textangle=90 text={A56} box(0.16311598,-0.17703431,81.586975",367.7002",90) || # text(0.16308709,-0.15266409) || textangle=90 text={A57} box(0.16310702,-0.15264193,81.586975",367.7002",90) || # text(0.16309289,-0.12995698) || textangle=90 text={A58} box(0.16311283,-0.12993483,81.586975",367.7002",90) || # text(0.16309393,-0.10556448) || textangle=90 text={A59} box(0.16311386,-0.10554223,81.586975",367.7002",90) || # text(0.16308973,-0.082857204) || textangle=90 text={A60} box(0.16310967,-0.082835048,81.586975",367.7002",90) || # text(0.16309077,-0.058464604) || textangle=90 text={A61} box(0.1631107,-0.058442447,81.586975",367.7002",90) || # text(0.16308657,-0.035757325) || textangle=90 text={A62} box(0.1631165,-0.03573514,81.586975",367.7002",90) || # text(0.1630876,-0.011364725) || textangle=90 text={A63} box(0.16310754,-0.011342568,81.586975",367.7002",90) || # text(0.1630934,0.011342583) || textangle=90 text={A64} box(0.16311333,0.011364739,81.586975",367.7002",90) || # text(0.16309443,0.035735183) || textangle=90 text={A65} box(0.16311436,0.035757339,81.586975",367.7002",90) || # text(0.16309023,0.058442462) || textangle=90 text={A66} box(0.16311016,0.058464618,81.586975",367.7002",90) || # text(0.16309125,0.082835062) || textangle=90 text={A67} box(0.16311119,0.082857219,81.586975",367.7002",90) || # text(0.16308705,0.10554234) || textangle=90 text={A68} box(0.16310698,0.1055645,81.586975",367.7002",90) || # text(0.16308807,0.12993484) || textangle=90 text={A69} box(0.16310801,0.129957,81.586975",367.7002",90) || # text(0.16309386,0.15264205) || textangle=90 text={A70} box(0.1631138,0.1526642,81.586975",367.7002",90) || # text(0.16308489,0.17703442) || textangle=90 text={A71} box(0.16311482,0.17705661,81.586975",367.7002",90) || # text(0.16309068,0.19974143) || textangle=90 text={A72} box(0.16311061,0.19976368,81.586975",367.7002",90) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/megacam/megacam-chip-guide.tpl����������������������������������������������000644 �000765 �000000 �00000011655 11075735605 023235� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /tmp/dss1224085352034269.fits.gz global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || composite=1 point(0,0) || # point=boxcircle # text(359.83879,-0.19000008) || textangle=89.429076 text={C1} box(359.83881,-0.19002199,163.33361",367.7002",89.429076) || # text(359.83831,-0.14290288) || textangle=89.429076 text={C2} box(359.83833,-0.14292488,163.33361",367.7002",89.429076) || # text(359.83784,-0.095805501) || textangle=89.429076 text={C3} box(359.83787,-0.095827401,163.33361",367.7002",89.429076) || # text(359.83737,-0.048708098) || textangle=89.429076 text={C4} box(359.83739,-0.048729996,163.33361",367.7002",89.429076) || # text(359.8369,-0.0016104951) || textangle=89.429076 text={C5} box(359.83692,-0.0016323935,163.33361",367.7002",89.429076) || # text(359.83644,0.045487183) || textangle=89.429076 text={C6} box(359.83646,0.045465284,163.33361",367.7002",89.429076) || # text(359.83596,0.092584587) || textangle=89.429076 text={C7} box(359.83598,0.09256259,163.33361",367.7002",89.429076) || # text(359.8355,0.13968217) || textangle=89.429076 text={C8} box(359.83551,0.13966,163.33361",367.7002",89.429076) || # text(359.83503,0.18677928) || textangle=89.429076 text={C9} box(359.83505,0.18675738,163.33361",367.7002",89.429076) || # text(359.95017,-0.1888932) || textangle=89.429076 text={C10} box(359.9502,-0.188915,163.33361",367.7002",89.429076) || # text(359.94969,-0.1417959) || textangle=89.429076 text={C11} box(359.94971,-0.1418178,163.33361",367.7002",89.429076) || # text(359.94922,-0.094698394) || textangle=89.429076 text={C12} box(359.94924,-0.094720293,163.33361",367.7002",89.429076) || # text(359.94875,-0.047600518) || textangle=89.429076 text={C13} box(359.94878,-0.047622515,163.33361",367.7002",89.429076) || # text(359.94828,-0.00050291415) || textangle=89.429076 text={C14} box(359.9483,-0.00052481167,163.33361",367.7002",89.429076) || # text(359.94781,0.046594788) || textangle=89.429076 text={C15} box(359.94783,0.046572792,163.33361",367.7002",89.429076) || # text(359.94734,0.093692567) || textangle=89.429076 text={C16} box(359.94736,0.09367067,163.33361",367.7002",89.429076) || # text(359.94687,0.14079007) || textangle=89.429076 text={C17} box(359.94689,0.14076818,163.33361",367.7002",89.429076) || # text(359.94642,0.18788765) || textangle=89.429076 text={C18} box(359.94644,0.18786575,163.33361",367.7002",89.429076) || # text(0.053560184,-0.18786505) || textangle=89.429076 text={C19} box(0.053590399,-0.18788685,163.33361",367.7002",89.429076) || # text(0.053088973,-0.14076769) || textangle=89.429076 text={C20} box(0.053119188,-0.1407895,163.33361",367.7002",89.429076) || # text(0.052617761,-0.093670143) || textangle=89.429076 text={C21} box(0.052647975,-0.093691943,163.33361",367.7002",89.429076) || # text(0.052156546,-0.046572288) || textangle=89.429076 text={C22} box(0.052176763,-0.046594288,163.33361",367.7002",89.429076) || # text(0.051685335,0.00052536623) || textangle=89.429076 text={C23} box(0.051705551,0.00050346653,163.33361",367.7002",89.429076) || # text(0.051214124,0.047623121) || textangle=89.429076 text={C24} box(0.05123434,0.047601121,163.33361",367.7002",89.429076) || # text(0.050742913,0.094720775) || textangle=89.429076 text={C25} box(0.050763127,0.094698876,163.33361",367.7002",89.429076) || # text(0.0502717,0.14181833) || textangle=89.429076 text={C26} box(0.050291915,0.14179643,163.33361",367.7002",89.429076) || # text(0.049800489,0.18891568) || textangle=89.429076 text={C27} box(0.049820703,0.18889379,163.33361",367.7002",89.429076) || # text(0.1649667,-0.18675652) || textangle=89.429076 text={C28} box(0.16498692,-0.18677841,163.33361",367.7002",89.429076) || # text(0.16449352,-0.13965928) || textangle=89.429076 text={C29} box(0.16451373,-0.13968127,163.33361",367.7002",89.429076) || # text(0.16402034,-0.092561943) || textangle=89.429076 text={C30} box(0.16405055,-0.092583842,163.33361",367.7002",89.429076) || # text(0.16355716,-0.045464409) || textangle=89.429076 text={C31} box(0.16357738,-0.045486307,163.33361",367.7002",89.429076) || # text(0.16308398,0.001633126) || textangle=89.429076 text={C32} box(0.16310419,0.0016112271,163.33361",367.7002",89.429076) || # text(0.16261079,0.04873076) || textangle=89.429076 text={C33} box(0.16264101,0.048708862,163.33361",367.7002",89.429076) || # text(0.16214762,0.095828296) || textangle=89.429076 text={C34} box(0.16216783,0.095806296,163.33361",367.7002",89.429076) || # text(0.16167444,0.14292563) || textangle=89.429076 text={C35} box(0.16169464,0.14290364,163.33361",367.7002",89.429076) || # text(0.16120125,0.19002276) || textangle=89.429076 text={C36} box(0.16122147,0.19000087,163.33361",367.7002",89.429076) || # text(359.9993,0.32469933) || textangle=89.429076 text={G1} box(359.9993,0.32469933,163.33361",364",89.429076) || # text(0.0007,-0.32469933) || textangle=89.429076 text={G2} box(0.0007,-0.32469933,163.33361",364",89.429076) �����������������������������������������������������������������������������������saods9/ds9/template/mmt/megacam/megacam-chip.tpl����������������������������������������������������000644 �000765 �000000 �00000010270 10271504030 022111� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 # Filename: /home/joye/templates/sao/megacam.fits[IM1] global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || point(0,0) || # point=boxcircle # text(359.8369,-0.1883876) || textangle=90 text={C1} box(359.83692,-0.18840971,163.33361",367.7002",90) || # text(359.8369,-0.141288) || textangle=90 text={C2} box(359.83692,-0.14131021,163.33361",367.7002",90) || # text(359.83689,-0.094188304) || textangle=90 text={C3} box(359.83692,-0.094210505,163.33361",367.7002",90) || # text(359.83689,-0.047088504) || textangle=90 text={C4} box(359.83691,-0.047110605,163.33361",367.7002",90) || # text(359.8369,1.1396249e-05) || textangle=90 text={C5} box(359.83692,-1.0704976e-05,163.33361",367.7002",90) || # text(359.8369,0.047111296) || textangle=90 text={C6} box(359.83692,0.047089195,163.33361",367.7002",90) || # text(359.83689,0.094211197) || textangle=90 text={C7} box(359.83691,0.094188996,163.33361",367.7002",90) || # text(359.8369,0.1413109) || textangle=90 text={C8} box(359.83692,0.1412887,163.33361",367.7002",90) || # text(359.8369,0.1884104) || textangle=90 text={C9} box(359.83692,0.1883883,163.33361",367.7002",90) || # text(359.94828,-0.1883883) || textangle=90 text={C10} box(359.94831,-0.1884104,163.33361",367.7002",90) || # text(359.94828,-0.1412886) || textangle=90 text={C11} box(359.9483,-0.1413107,163.33361",367.7002",90) || # text(359.94828,-0.0941887) || textangle=90 text={C12} box(359.9483,-0.094210801,163.33361",367.7002",90) || # text(359.94828,-0.047088601) || textangle=90 text={C13} box(359.9483,-0.047110801,163.33361",367.7002",90) || # text(359.94828,1.1399465e-05) || textangle=90 text={C14} box(359.9483,-1.0700924e-05,163.33361",367.7002",90) || # text(359.94828,0.047111499) || textangle=90 text={C15} box(359.9483,0.047089299,163.33361",367.7002",90) || # text(359.94828,0.0942115) || textangle=90 text={C16} box(359.9483,0.094189399,163.33361",367.7002",90) || # text(359.94828,0.1413114) || textangle=90 text={C17} box(359.9483,0.1412893,163.33361",367.7002",90) || # text(359.94829,0.1884111) || textangle=90 text={C18} box(359.94831,0.188389,163.33361",367.7002",90) || # text(0.051681678,-0.1883883) || textangle=90 text={C19} box(0.051711674,-0.1884104,163.33361",367.7002",90) || # text(0.051680764,-0.1412886) || textangle=90 text={C20} box(0.051710759,-0.1413107,163.33361",367.7002",90) || # text(0.051679849,-0.094188702) || textangle=90 text={C21} box(0.051709844,-0.094210801,163.33361",367.7002",90) || # text(0.051688932,-0.047088601) || textangle=90 text={C22} box(0.051708928,-0.047110801,163.33361",367.7002",90) || # text(0.051688017,1.1398494e-05) || textangle=90 text={C23} box(0.051708013,-1.0701118e-05,163.33361",367.7002",90) || # text(0.051687103,0.047111498) || textangle=90 text={C24} box(0.051707098,0.047089299,163.33361",367.7002",90) || # text(0.051686188,0.094211499) || textangle=90 text={C25} box(0.051706183,0.094189399,163.33361",367.7002",90) || # text(0.051685273,0.1413114) || textangle=90 text={C26} box(0.051705268,0.1412893,163.33361",367.7002",90) || # text(0.051684358,0.1884111) || textangle=90 text={C27} box(0.051704353,0.188389,163.33361",367.7002",90) || # text(0.16309374,-0.18838761) || textangle=90 text={C28} box(0.16311374,-0.1884097,163.33361",367.7002",90) || # text(0.16309085,-0.14128801) || textangle=90 text={C29} box(0.16311085,-0.1413102,163.33361",367.7002",90) || # text(0.16308797,-0.094188306) || textangle=90 text={C30} box(0.16311796,-0.094210504,163.33361",367.7002",90) || # text(0.16309508,-0.047088505) || textangle=90 text={C31} box(0.16311508,-0.047110604,163.33361",367.7002",90) || # text(0.16309219,1.1394411e-05) || textangle=90 text={C32} box(0.16311219,-1.0704364e-05,163.33361",367.7002",90) || # text(0.1630893,0.047111394) || textangle=90 text={C33} box(0.1631193,0.047089196,163.33361",367.7002",90) || # text(0.16309642,0.094211195) || textangle=90 text={C34} box(0.16311641,0.094188996,163.33361",367.7002",90) || # text(0.16309353,0.14131089) || textangle=90 text={C35} box(0.16311352,0.1412887,163.33361",367.7002",90) || # text(0.16309064,0.18841039) || textangle=90 text={C36} box(0.16311064,0.1883883,163.33361",367.7002",90) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/hecto/hectochelle.tpl�������������������������������������������������������000644 �000765 �000000 �00000000351 10270004706 021570� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || point(0,0) || # point=boxcircle circle(0,0,1800") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/mmt/hecto/hectospec.tpl���������������������������������������������������������000644 �000765 �000000 �00000000351 10270004706 021266� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.0 global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source wcs0;fk5 # composite(0,0,0) || point(0,0) || # point=boxcircle circle(0,0,1800") ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/heasarc/suzaku/�����������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 017631� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/heasarc/suzaku/hxd.tpl����������������������������������������������������������000644 �000765 �000000 �00000001522 11476230566 021144� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Created with aemkreg version 6.1 with Euler angles (0, 90, 0) global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,0) || composite=1 polygon( 0.563355, -0.621657,359.436645, -0.621657,359.436652, 0.504992, 0.563348, 0.504992) || #text={PIN (FULL)} polygon(360.000000, -0.340000,359.718333, -0.058333, 0.000000, 0.223333, 0.281667, -0.058333) || #text={PIN (FWHM)} polygon( 4.574921, -4.618431,355.425079, -4.618431,355.425574, 4.501888, 4.574426, 4.501888) || #text={GSO (FULL)} polygon(360.000000, -2.340833,357.717499, -0.058318, 0.000000, 2.224167, 2.282501, -0.058318) || #text={GSO (FWHM)} polygon( 0.008333, -0.066667,359.991667, -0.066667,359.991667, -0.050000, 0.008333, -0.050000) #text={HXD-nominal} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/heasarc/suzaku/xis.tpl����������������������������������������������������������000644 �000765 �000000 �00000000553 11476230566 021167� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Created with aemkreg version 6.1 with Euler angles (0, 90, 0) global color=blue dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,0) || composite=1 polygon( 0.150000, -0.150000,359.850000, -0.150000,359.850000, 0.150000, 0.150000, 0.150000) #text=XIS �����������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/heasarc/suzaku/xrs.tpl����������������������������������������������������������000644 �000765 �000000 �00000006742 11476230566 021206� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Created with aemkreg version 6.1 with Euler angles (0, 90, 0) global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,0) || composite=1 polygon( 0.008047, 0.016399, 0.008047, 0.024344, 0.000102, 0.024344, 0.000102, 0.016399) || #text=XRS polygon( 0.008047, 0.008251, 0.008047, 0.016196, 0.000102, 0.016196, 0.000102, 0.008251) || #text=XRS polygon( 0.024344, 0.008251, 0.024344, 0.016196, 0.016399, 0.016196, 0.016399, 0.008251) || #text=XRS polygon( 0.016196, 0.000102, 0.016196, 0.008047, 0.008251, 0.008047, 0.008251, 0.000102) || #text=XRS polygon( 0.024344, 0.000102, 0.024344, 0.008047, 0.016399, 0.008047, 0.016399, 0.000102) || #text=XRS polygon( 0.008047, 0.000102, 0.008047, 0.008047, 0.000102, 0.008047, 0.000102, 0.000102) || #text=XRS polygon( 0.008047, -0.008047, 0.008047, -0.000102, 0.000102, -0.000102, 0.000102, -0.008047) || #text=XRS polygon( 0.008047, -0.024344, 0.008047, -0.016399, 0.000102, -0.016399, 0.000102, -0.024344) || #text=XRS polygon( 0.008047, -0.016196, 0.008047, -0.008251, 0.000102, -0.008251, 0.000102, -0.016196) || #text=XRS polygon( 0.016196, -0.024344, 0.016196, -0.016399, 0.008251, -0.016399, 0.008251, -0.024344) || #text=XRS polygon( 0.016196, -0.016196, 0.016196, -0.008251, 0.008251, -0.008251, 0.008251, -0.016196) || #text=XRS polygon( 0.024344, -0.016196, 0.024344, -0.008251, 0.016399, -0.008251, 0.016399, -0.016196) || #text=XRS polygon( 0.016196, -0.008047, 0.016196, -0.000102, 0.008251, -0.000102, 0.008251, -0.008047) || #text=XRS polygon( 0.024344, -0.008047, 0.024344, -0.000102, 0.016399, -0.000102, 0.016399, -0.008047) || #text=XRS polygon(359.999898, -0.024344,359.999898, -0.016399,359.991953, -0.016399,359.991953, -0.024344) || #text=XRS polygon(359.999898, -0.016196,359.999898, -0.008251,359.991953, -0.008251,359.991953, -0.016196) || #text=XRS polygon(359.991749, -0.024344,359.991749, -0.016399,359.983804, -0.016399,359.983804, -0.024344) || #text=XRS polygon(359.991749, -0.016196,359.991749, -0.008251,359.983804, -0.008251,359.983804, -0.016196) || #text=XRS polygon(359.983601, -0.016196,359.983601, -0.008251,359.975656, -0.008251,359.975656, -0.016196) || #text=XRS polygon(359.991749, -0.008047,359.991749, -0.000102,359.983804, -0.000102,359.983804, -0.008047) || #text=XRS polygon(359.983601, -0.008047,359.983601, -0.000102,359.975656, -0.000102,359.975656, -0.008047) || #text=XRS polygon(359.999898, -0.008047,359.999898, -0.000102,359.991953, -0.000102,359.991953, -0.008047) || #text=XRS polygon(359.999898, 0.000102,359.999898, 0.008047,359.991953, 0.008047,359.991953, 0.000102) || #text=XRS polygon(359.999898, 0.016399,359.999898, 0.024344,359.991953, 0.024344,359.991953, 0.016399) || #text=XRS polygon(359.999898, 0.008251,359.999898, 0.016196,359.991953, 0.016196,359.991953, 0.008251) || #text=XRS polygon(359.991749, 0.016399,359.991749, 0.024344,359.983804, 0.024344,359.983804, 0.016399) || #text=XRS polygon(359.991749, 0.008251,359.991749, 0.016196,359.983804, 0.016196,359.983804, 0.008251) || #text=XRS polygon(359.983601, 0.008251,359.983601, 0.016196,359.975656, 0.016196,359.975656, 0.008251) || #text=XRS polygon(359.991749, 0.000102,359.991749, 0.008047,359.983804, 0.008047,359.983804, 0.000102) || #text=XRS polygon(359.983601, 0.000102,359.983601, 0.008047,359.975656, 0.008047,359.975656, 0.000102) #text=XRS ������������������������������saods9/ds9/template/chandra/acis/�������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 017220� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/chandra/hrc/��������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 017055� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/chandra/hrc/hrc-i.tpl�����������������������������������������������������������000644 �000765 �000000 �00000001673 11446443665 020621� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(359.99932,0.0042101979) || # point=boxcircle color=blue point(0.00069740655,0.0082266505) || # point=boxcircle box(0.00069740655,0.0082266505,40",40",0.0074458119) || # color=red line(0.00069392696,-0.01677324,0.00070029419,0.033226372) || # line=0 0 color=red line(359.9757,0.0082303192,0.025697186,0.0082236331) || # line=0 0 color=red # text(0.0060229964,-0.071730321) || textangle=359.45857 color=blue text={I0} polygon(359.99635,-0.35905082,359.63404,0.0033523352,359.99665,0.36586903,0.35895968,0.0034650549) || # color=blue polygon(359.99531,-0.3931907,359.57097,0.031258645,359.99542,0.45559694,0.4197573,0.031147222) # color=blue dashlist=12 4 background ���������������������������������������������������������������������saods9/ds9/template/chandra/hrc/hrc-s.tpl�����������������������������������������������������������000644 �000765 �000000 �00000003767 11446443665 020641� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(0.014345364,-0.0013056111) || # point=boxcircle color=blue point(0.016219966,0.0012246581) || # point=boxcircle box(0.016219966,0.0012246581,40",40",0.0074458106) || # color=red line(0.016216487,-0.023775231,0.016222854,0.02622438) || # line=0 0 color=red line(359.99122,0.0012283276,0.041219741,0.0012216413) || # line=0 0 color=red # text(359.38538,0.0030653744) || textangle=359.45857 color=blue text={S1} polygon(359.14343,0.056577828,359.14354,-0.050535114,359.68674,-0.049942976,359.68662,0.057169491) || # color=blue line(359.14351,-0.019991269,359.6867,-0.019398968) || # line=0 0 color=blue polygon(359.08396,0.077760121,359.08412,-0.072286681,359.6868,-0.071629351,359.68663,0.078416884) || # color=blue background # text(359.98814,0.0037220871) || textangle=359.45857 color=blue text={S2} polygon(359.70851,0.057193071,359.70863,-0.049919757,0.27053203,-0.049307389,0.27041232,0.057805635) || # color=blue line(359.7086,-0.019374933,359.92699,-0.019136806) || # line=0 0 color=blue line(359.92699,-0.019136806,359.9269,0.057431375) || # line=0 0 color=blue line(0.10661832,0.057626818,0.1067037,-0.01894101) || # line=0 0 color=blue line(0.1067037,-0.01894101,0.27049777,-0.018762924) || # line=0 0 color=blue polygon(359.68663,0.078416884,359.6868,-0.071629351,0.28965388,-0.070972867,0.28948516,0.079073122) || # color=blue background # text(0.59092858,0.0043780574) || textangle=359.45857 color=blue text={S3} polygon(0.29539512,0.057832417,0.29551495,-0.049280661,0.8367598,-0.048690494,0.83664301,0.058421797) || # color=blue line(0.29548067,-0.018735466,0.83672616,-0.018146798) || # line=0 0 color=blue polygon(0.28948516,0.079073122,0.28965388,-0.070972867,0.89236821,-0.070316746,0.89220504,0.079728383) # color=blue background ���������saods9/ds9/template/chandra/acis/acis-i.tpl���������������������������������������������������������000644 �000765 �000000 �00000002571 11446443664 021124� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(359.99565,0.0059387181) || # point=boxcircle color=blue point(359.99369,0.0057314379) || # point=boxcircle box(359.99369,0.0057314379,16",16",0.0074458093) || # color=red line(359.99369,-0.019268453,359.9937,0.03073116) || # line=0 0 color=red line(359.96869,0.0057351065,0.018691898,0.0057284211) || # line=0 0 color=red # text(0.074983471,-0.07503056) || textangle=359.45857 color=blue text={I0} polygon(0.14468917,-0.14493171,0.14506091,-0.0051482778,0.0052770566,-0.0051292868,0.0049055019,-0.14491342) || # color=blue # text(359.93236,-0.075069338) || textangle=359.45857 color=blue text={I1} polygon(359.86231,-0.0051675813,359.86264,-0.14495208,0.0024209693,-0.14496979,0.0020857765,-0.0051863415) || # color=blue # text(0.075029991,0.0678101) || textangle=359.45857 color=blue text={I2} polygon(0.14508996,-0.0020934155,0.14475484,0.13769617,0.0049709953,0.13771371,0.0053064433,-0.0020753216) || # color=blue # text(359.93241,0.067857426) || textangle=359.45857 color=blue text={I3} polygon(359.86271,0.13776073,359.86234,-0.0020285164,0.0021152286,-0.0020463747,0.0024869566,0.13774255) # color=blue ���������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/chandra/acis/acis-is.tpl��������������������������������������������������������000644 �000765 �000000 �00000005025 11446443664 021304� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(359.9814,-0.1158516) || # point=boxcircle color=blue point(359.97944,-0.11605888) || # point=boxcircle box(359.97944,-0.11605888,16",16",0.0074458169) || # color=red line(359.97944,-0.14105864,359.97944,-0.091059238) || # line=0 0 color=red line(359.95444,-0.11605518,0.0044416507,-0.1160619) || # line=0 0 color=red # text(0.060733243,-0.19682027) || textangle=359.45857 color=blue text={I0} polygon(0.13043901,-0.26672034,0.13081075,-0.12693824,359.99103,-0.12691956,359.99066,-0.26670229) || # color=blue # text(359.91811,-0.19685894) || textangle=359.45857 color=blue text={I1} polygon(359.84806,-0.12695743,359.84839,-0.26674043,359.98817,-0.26675865,359.98784,-0.12697661) || # color=blue # text(0.060779763,-0.053980247) || textangle=359.45857 color=blue text={I2} polygon(0.13083979,-0.12388339,0.13050467,0.015906345,359.99072,0.015923489,359.99106,-0.12386561) || # color=blue # text(359.91816,-0.053932908) || textangle=359.45857 color=blue text={I3} polygon(359.84846,0.015970851,359.84809,-0.12381838,359.98786,-0.12383666,359.98824,0.015952329) || # color=blue # text(0.37184311,0.1320915) || textangle=359.45857 color=blue text={S0} polygon(0.44178599,0.20209913,0.30184873,0.20204633,0.30189968,0.062083348,0.4418371,0.062137092) || # color=blue dashlist=12 4 background # text(0.22927653,0.13201944) || textangle=359.45857 color=blue text={S1} polygon(0.2991992,0.20204725,0.15925574,0.2019529,0.15935471,0.061990276,0.29929739,0.062090227) || # color=blue dashlist=12 4 background # text(0.086742871,0.13196478) || textangle=359.45857 color=blue text={S2} polygon(0.15667073,0.20199168,0.016716491,0.20189768,0.016814458,0.061935721,0.15676886,0.062034932) || # color=blue # text(359.94399,0.13190556) || textangle=359.45857 color=blue text={S3} polygon(0.013935284,0.20191224,359.87399,0.20185577,359.87404,0.061899917,0.013991488,0.061955169) || # color=blue # text(359.8016,0.13185239) || textangle=359.45857 color=blue text={S4} polygon(359.87155,0.20185484,359.7316,0.2018065,359.73165,0.061850174,359.8716,0.061898904) || # color=blue dashlist=12 4 background # text(359.65917,0.13179423) || textangle=359.45857 color=blue text={S5} polygon(359.72912,0.20179225,359.58918,0.20175502,359.58922,0.061799638,359.72916,0.061830852) # color=blue dashlist=12 4 background �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/chandra/acis/acis-s.tpl���������������������������������������������������������000644 �000765 �000000 �00000003373 11446443664 021137� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(359.97589,-0.00023858801) || # point=boxcircle color=blue point(359.97739,-0.00030415722) || # point=boxcircle box(359.97739,-0.00030415722,16",16",0.0074458058) || # color=red line(359.97738,-0.025304045,359.97739,0.024695564) || # line=0 0 color=red line(359.95239,-0.00030048775,0.0023881862,-0.00030717384) || # line=0 0 color=red # text(0.36595192,0.00027268306) || textangle=359.45857 color=blue text={S0} polygon(0.4358959,0.070278402,0.29595769,0.070227238,0.29600903,-0.069733324,0.4359469,-0.069682246) || # color=blue # text(0.22338589,0.00020314963) || textangle=359.45857 color=blue text={S1} polygon(0.29330794,0.070228032,0.1533645,0.070135307,0.15346356,-0.069824861,0.29340664,-0.069726563) || # color=blue # text(0.080851968,0.00014900597) || textangle=359.45857 color=blue text={S2} polygon(0.15078032,0.070173966,0.010825204,0.070081577,0.01092379,-0.06987889,0.15087857,-0.069781319) || # color=blue # text(359.9381,8.9273906e-05) || textangle=359.45857 color=blue text={S3} polygon(0.0080444743,0.070095011,359.8681,0.070039132,359.86815,-0.069915191,0.0081003229,-0.069859569) || # color=blue # text(359.79571,3.6603168e-05) || textangle=359.45857 color=blue text={S4} polygon(359.86566,0.070038097,359.72571,0.069988331,359.72576,-0.069965427,359.86571,-0.069916317) || # color=blue # text(359.65328,-2.3084464e-05) || textangle=359.45857 color=blue text={S5} polygon(359.72323,0.069974963,359.58329,0.069936296,359.58333,-0.070018472,359.72327,-0.069984864) # color=blue ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/template/chandra/acis/acis-si.tpl��������������������������������������������������������000644 �000765 �000000 �00000005035 11446443664 021305� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: /tmp/ds9sao26241407288736.fits.gz global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 wcs0;fk5 # composite(0,0,359.45114) || composite=0 point(359.98115,0.082070413) || # point=boxcircle color=blue point(359.98265,0.082004845) || # point=boxcircle box(359.98265,0.082004845,16",16",0.0074458153) || # color=red line(359.98265,0.057004991,359.98265,0.1070045) || # line=0 0 color=red line(359.95765,0.082008495,0.0076502475,0.082001831) || # line=0 0 color=red # text(0.060103564,-0.24632926) || textangle=359.45857 color=blue text={I0} polygon(0.12980967,-0.3162311,0.13018093,-0.17644548,359.9904,-0.17642695,359.99003,-0.31621219) || # color=blue # text(359.91749,-0.24636747) || textangle=359.45857 color=blue text={I1} polygon(359.84743,-0.17646563,359.84776,-0.31625111,359.98754,-0.31626967,359.98721,-0.17648316) || # color=blue # text(0.060150801,-0.1034866) || textangle=359.45857 color=blue text={I2} polygon(0.13021067,-0.17339142,0.12987474,-0.033600335,359.99009,-0.033582341,359.99043,-0.17337279) || # color=blue # text(359.91753,-0.10343879) || textangle=359.45857 color=blue text={I3} polygon(359.84783,-0.033535754,359.84746,-0.17332537,359.98724,-0.17334399,359.98761,-0.033553613) || # color=blue # text(0.37121376,0.08257996) || textangle=359.45857 color=blue text={S0} polygon(0.44115766,0.15258465,0.30121961,0.1525348,0.30127095,0.012574598,0.44120866,0.012624389) || # color=blue dashlist=12 4 background # text(0.22864787,0.082511499) || textangle=359.45857 color=blue text={S1} polygon(0.29856987,0.15253562,0.15862653,0.15244371,0.15872558,0.012483867,0.29866856,0.012581379) || # color=blue dashlist=12 4 background # text(0.086114019,0.082457918) || textangle=359.45857 color=blue text={S2} polygon(0.15604234,0.15248238,0.016087265,0.15239031,0.016185851,0.012430134,0.15614059,0.01252742) || # color=blue # text(359.94336,0.082398238) || textangle=359.45857 color=blue text={S3} polygon(0.013306535,0.15240374,359.87336,0.15234768,359.87341,0.01239362,0.013362384,0.012449456) || # color=blue # text(359.80097,0.082345111) || textangle=359.45857 color=blue text={S4} polygon(359.87092,0.15234664,359.73097,0.15229619,359.73102,0.012342662,359.87097,0.012392486) || # color=blue dashlist=12 4 background # text(359.65854,0.082284459) || textangle=359.45857 color=blue text={S5} polygon(359.7285,0.15228281,359.58855,0.15224296,359.58859,0.012288386,359.72853,0.012323208) # color=blue dashlist=12 4 background ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/cs.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000134230 12600277755 015167� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset cs {2D} ::msgcat::mcset cs {3D} ::msgcat::mcset cs {A postscript generation error has occurred} [encoding convertfrom iso8859-2 {Chyba pi generovn postscriptu}] ::msgcat::mcset cs {AIP} ::msgcat::mcset cs {Abort} [encoding convertfrom iso8859-2 {Peruit}] ::msgcat::mcset cs {About SAOImage DS9} [encoding convertfrom iso8859-2 {O programu SAOImage DS9}] ::msgcat::mcset cs {About} [encoding convertfrom iso8859-2 {O programu}] ::msgcat::mcset cs {Acknowledgment} [encoding convertfrom iso8859-2 {Podkovn}] ::msgcat::mcset cs {Add} [encoding convertfrom iso8859-2 {Pidat}] ::msgcat::mcset cs {Advanced} [encoding convertfrom iso8859-2 {Dal nastaven}] ::msgcat::mcset cs {Aligned} ::msgcat::mcset cs {Align} [encoding convertfrom iso8859-2 {Zarovnat}] ::msgcat::mcset cs {All Columns} [encoding convertfrom iso8859-2 {Vechny sloupce}] ::msgcat::mcset cs {All Rows} [encoding convertfrom iso8859-2 {Vechny dky}] ::msgcat::mcset cs {All} [encoding convertfrom iso8859-2 {Ve}] ::msgcat::mcset cs {Always save files during Backup} [encoding convertfrom iso8859-2 {Vdy uloit soubory pi zlohovn}] ::msgcat::mcset cs {Amplifier} [encoding convertfrom iso8859-2 {Zesilova}] ::msgcat::mcset cs {An error has occurred during backup} [encoding convertfrom iso8859-2 {Chyba pi poizovn zlohy}] ::msgcat::mcset cs {An error has occurred during restore} [encoding convertfrom iso8859-2 {Chyba pi obnov zlohy}] ::msgcat::mcset cs {An error has occurred invoking the Analysis task} [encoding convertfrom iso8859-2 {Chyba pi spoutn Analzy}] ::msgcat::mcset cs {An error has occurred while creating image.} [encoding convertfrom iso8859-2 {Chyba pi vytven obrzku.}] ::msgcat::mcset cs {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} [encoding convertfrom iso8859-2 {Chyba pi vytven obrzku. Prosm ujistte se e okno s DS9tkou je ve vrchnm levm rohu vchoz obrazovky a e je cel viditeln.}] ::msgcat::mcset cs {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} [encoding convertfrom iso8859-2 {Chyba pi vytven obrzku. Prosm ujistte se na obrazovce je zobrazen cel okno s obrzkem}] ::msgcat::mcset cs {An error has occurred while printing} [encoding convertfrom iso8859-2 {Pi tisku se vyskytla chyba}] ::msgcat::mcset cs {An error has occurred while reading image.} [encoding convertfrom iso8859-2 {Chyba pi ten obrzku.}] ::msgcat::mcset cs {An error has occurred while saving} [encoding convertfrom iso8859-2 {Chyba pi ukldn souboru}] ::msgcat::mcset cs {An error has occurred while updating VO server list} ::msgcat::mcset cs {An error has occurred while writing image.} ::msgcat::mcset cs {An internal error has been detected} [encoding convertfrom iso8859-2 {Byla detekovna vnitn chyba programu}] ::msgcat::mcset cs {Analysis Command Log} [encoding convertfrom iso8859-2 {Poizovat zznam analytickch pkaz}] ::msgcat::mcset cs {Analysis Commands} [encoding convertfrom iso8859-2 {Analytick pkazy}] ::msgcat::mcset cs {Analysis File} [encoding convertfrom iso8859-2 {Analytick soubor}] ::msgcat::mcset cs {Analysis Log} [encoding convertfrom iso8859-2 {Zznam innosti analytick pkaz}] ::msgcat::mcset cs {Analysis} [encoding convertfrom iso8859-2 {Analza}] ::msgcat::mcset cs {Angle Complement} [encoding convertfrom iso8859-2 {Doplnk hlu}] ::msgcat::mcset cs {Angles} [encoding convertfrom iso8859-2 {hly}] ::msgcat::mcset cs {Angle} [encoding convertfrom iso8859-2 {hel}] ::msgcat::mcset cs {Annuli} [encoding convertfrom iso8859-2 {Kruh}] ::msgcat::mcset cs {Annulus} [encoding convertfrom iso8859-2 {Kruh}] ::msgcat::mcset cs {Apply} [encoding convertfrom iso8859-2 {Pout}] ::msgcat::mcset cs {ArcMin} [encoding convertfrom iso8859-2 {hlovch minut}] ::msgcat::mcset cs {ArcSec} [encoding convertfrom iso8859-2 {hlovch sekund}] ::msgcat::mcset cs {Architecture} [encoding convertfrom iso8859-2 {Architektura}] ::msgcat::mcset cs {Archives} [encoding convertfrom iso8859-2 {Achvy}] ::msgcat::mcset cs {Array} ::msgcat::mcset cs {Arrow} [encoding convertfrom iso8859-2 {ipka}] ::msgcat::mcset cs {Astronomy} [encoding convertfrom iso8859-2 {Astronomie}] ::msgcat::mcset cs {At Startup} [encoding convertfrom iso8859-2 {Pi sputn}] ::msgcat::mcset cs {At least 2 different catalogs are required} ::msgcat::mcset cs {Auto Centroid} [encoding convertfrom iso8859-2 {Automatick centrovn}] ::msgcat::mcset cs {Auto Plot 2D} [encoding convertfrom iso8859-2 {Automatick 2D graf}] ::msgcat::mcset cs {Auto Plot 3D} [encoding convertfrom iso8859-2 {Automatick 3D graf}] ::msgcat::mcset cs {Auto Plot Statistics} ::msgcat::mcset cs {Auto Plot} [encoding convertfrom iso8859-2 {Automatick graf}] ::msgcat::mcset cs {Autoload FITS Regions} [encoding convertfrom iso8859-2 {Automaticky nahrt FITS oblasti}] ::msgcat::mcset cs {Autoload} [encoding convertfrom iso8859-2 {Automatick nahrvn}] ::msgcat::mcset cs {Automatic} [encoding convertfrom iso8859-2 {Automatick}] ::msgcat::mcset cs {Average} [encoding convertfrom iso8859-2 {Prmr}] ::msgcat::mcset cs {Axes Number} ::msgcat::mcset cs {Axes Order} ::msgcat::mcset cs {Axes Title} ::msgcat::mcset cs {Axes} [encoding convertfrom iso8859-2 {Osy}] ::msgcat::mcset cs {Axis Length} [encoding convertfrom iso8859-2 {Dlka osy}] ::msgcat::mcset cs {Axis Numbers} [encoding convertfrom iso8859-2 {slovn osy}] ::msgcat::mcset cs {Axis Title} ::msgcat::mcset cs {Axis} [encoding convertfrom iso8859-2 {Osy}] ::msgcat::mcset cs {Azimuth} [encoding convertfrom iso8859-2 {Azimut}] ::msgcat::mcset cs {Background Color} [encoding convertfrom iso8859-2 {Barva pozad}] ::msgcat::mcset cs {Background} [encoding convertfrom iso8859-2 {Pozad}] ::msgcat::mcset cs {Backup} [encoding convertfrom iso8859-2 {Zloha}] ::msgcat::mcset cs {Back} [encoding convertfrom iso8859-2 {Zpt}] ::msgcat::mcset cs {Bar Plot Tool} ::msgcat::mcset cs {Bias} ::msgcat::mcset cs {Bin 3rd Column} [encoding convertfrom iso8859-2 {Binuj tet sloupec}] ::msgcat::mcset cs {Bin Center} [encoding convertfrom iso8859-2 {Binuj sted}] ::msgcat::mcset cs {Bin Columns} [encoding convertfrom iso8859-2 {Binuj sloupce}] ::msgcat::mcset cs {Bin Filter} [encoding convertfrom iso8859-2 {Filtr binovn}] ::msgcat::mcset cs {Bin Fit} ::msgcat::mcset cs {Bin In} ::msgcat::mcset cs {Bin Out} ::msgcat::mcset cs {Binning Parameters} [encoding convertfrom iso8859-2 {Parametry binovn}] ::msgcat::mcset cs {Bin} ::msgcat::mcset cs {Black} [encoding convertfrom iso8859-2 {ern}] ::msgcat::mcset cs {Blank/Inf/NaN Color} [encoding convertfrom iso8859-2 {Barva nedefinovanch pixel}] ::msgcat::mcset cs {Blink Frames} [encoding convertfrom iso8859-2 {Problikvej snmky}] ::msgcat::mcset cs {Blink Interval} [encoding convertfrom iso8859-2 {Interval problikvn snmk}] ::msgcat::mcset cs {Blink} [encoding convertfrom iso8859-2 {Problikvat}] ::msgcat::mcset cs {Block Fit} ::msgcat::mcset cs {Block In} [encoding convertfrom iso8859-2 {Zmenit}] ::msgcat::mcset cs {Block Out} [encoding convertfrom iso8859-2 {Zvtit}] ::msgcat::mcset cs {Block Parameters} ::msgcat::mcset cs {Block} ::msgcat::mcset cs {Blue} [encoding convertfrom iso8859-2 {Modr}] ::msgcat::mcset cs {Bold} [encoding convertfrom iso8859-2 {Tun}] ::msgcat::mcset cs {Border} [encoding convertfrom iso8859-2 {Okraj}] ::msgcat::mcset cs {Bottom} ::msgcat::mcset cs {Box Annulus} ::msgcat::mcset cs {Box Panda} ::msgcat::mcset cs {BoxCircle} ::msgcat::mcset cs {Boxcar} ::msgcat::mcset cs {Box} [encoding convertfrom iso8859-2 {Obdlnk}] ::msgcat::mcset cs {Broadcast} ::msgcat::mcset cs {Browser} [encoding convertfrom iso8859-2 {Prohle}] ::msgcat::mcset cs {Browse} [encoding convertfrom iso8859-2 {Prohlet}] ::msgcat::mcset cs {Buffer} ::msgcat::mcset cs {Buttonbar} ::msgcat::mcset cs {Buttons} [encoding convertfrom iso8859-2 {Tlatka}] ::msgcat::mcset cs {Bytes} ::msgcat::mcset cs {CMYK} ::msgcat::mcset cs {Can Delete} ::msgcat::mcset cs {Can Edit} ::msgcat::mcset cs {Can Move} ::msgcat::mcset cs {Can Rotate} ::msgcat::mcset cs {Cancel} [encoding convertfrom iso8859-2 {Zruit}] ::msgcat::mcset cs {Cap} ::msgcat::mcset cs {Catalog Server} [encoding convertfrom iso8859-2 {Katalogov server}] ::msgcat::mcset cs {Catalog Tool} [encoding convertfrom iso8859-2 {Katalogov nstroj}] ::msgcat::mcset cs {Catalogs} [encoding convertfrom iso8859-2 {Katalogy}] ::msgcat::mcset cs {Catalog} [encoding convertfrom iso8859-2 {Katalog}] ::msgcat::mcset cs {Catrom} ::msgcat::mcset cs {Cat} ::msgcat::mcset cs {Center Image} [encoding convertfrom iso8859-2 {Vycentruj obrzek}] ::msgcat::mcset cs {Center Non-modal Dialogs} ::msgcat::mcset cs {Center} [encoding convertfrom iso8859-2 {Sted}] ::msgcat::mcset cs {Centroid Parameters} [encoding convertfrom iso8859-2 {Parametry centroidu}] ::msgcat::mcset cs {Centroid} [encoding convertfrom iso8859-2 {Vystedit}] ::msgcat::mcset cs {Circle} [encoding convertfrom iso8859-2 {Krunice}] ::msgcat::mcset cs {Clear All} [encoding convertfrom iso8859-2 {Vyma ve}] ::msgcat::mcset cs {Clear Analysis Commands} [encoding convertfrom iso8859-2 {Vyma analytick pkazy}] ::msgcat::mcset cs {Clear Cache} ::msgcat::mcset cs {Clear Data} ::msgcat::mcset cs {Clear External Analysis Commands?} ::msgcat::mcset cs {Clear Filter} [encoding convertfrom iso8859-2 {Vynuluvoat filtr}] ::msgcat::mcset cs {Clear Frame} [encoding convertfrom iso8859-2 {Vyistit snmek}] ::msgcat::mcset cs {Clear Preferences?} [encoding convertfrom iso8859-2 {Smazat nastaven?}] ::msgcat::mcset cs {Clear Preferences} [encoding convertfrom iso8859-2 {Smazat nastaven}] ::msgcat::mcset cs {Clear} [encoding convertfrom iso8859-2 {Vyistit}] ::msgcat::mcset cs {Click to Center} [encoding convertfrom iso8859-2 {Klinout na centrovn}] ::msgcat::mcset cs {Close} [encoding convertfrom iso8859-2 {Zavt}] ::msgcat::mcset cs {Colorbar Size} [encoding convertfrom iso8859-2 {Velikost colorbaru}] ::msgcat::mcset cs {Colorbar} [encoding convertfrom iso8859-2 {klovn barev}] ::msgcat::mcset cs {Colormap Parameters} ::msgcat::mcset cs {Colormap} ::msgcat::mcset cs {Color} [encoding convertfrom iso8859-2 {Barva}] ::msgcat::mcset cs {Columns} [encoding convertfrom iso8859-2 {Sloupce}] ::msgcat::mcset cs {Column} [encoding convertfrom iso8859-2 {Sploupec}] ::msgcat::mcset cs {Command} [encoding convertfrom iso8859-2 {Pkaz}] ::msgcat::mcset cs {Compass} [encoding convertfrom iso8859-2 {Kompas}] ::msgcat::mcset cs {Composite Region} [encoding convertfrom iso8859-2 {Spojit oblasti}] ::msgcat::mcset cs {Composite} ::msgcat::mcset cs {Compression} [encoding convertfrom iso8859-2 {Komprese}] ::msgcat::mcset cs {Configure} [encoding convertfrom iso8859-2 {Konfigurace}] ::msgcat::mcset cs {Connect Directly} ::msgcat::mcset cs {Connect SAMP} ::msgcat::mcset cs {Connect Using Web Proxy} ::msgcat::mcset cs {Connect} [encoding convertfrom iso8859-2 {Pipoji}] ::msgcat::mcset cs {Console} ::msgcat::mcset cs {Contour Parameters} [encoding convertfrom iso8859-2 {Parametry obrysu}] ::msgcat::mcset cs {Contours} [encoding convertfrom iso8859-2 {Obrysy}] ::msgcat::mcset cs {Contour} [encoding convertfrom iso8859-2 {Obrys}] ::msgcat::mcset cs {Contrast} [encoding convertfrom iso8859-2 {Kontrast}] ::msgcat::mcset cs {Convert to Polygons} [encoding convertfrom iso8859-2 {Zmnit na obdlnky}] ::msgcat::mcset cs {Coordinate Grid Parameters} [encoding convertfrom iso8859-2 {Nastaven mky}] ::msgcat::mcset cs {Coordinate Grid} [encoding convertfrom iso8859-2 {Mka}] ::msgcat::mcset cs {Coordinate System} [encoding convertfrom iso8859-2 {Systm koordint}] ::msgcat::mcset cs {Coordinates} [encoding convertfrom iso8859-2 {Koordinty}] ::msgcat::mcset cs {Coordinate} [encoding convertfrom iso8859-2 {Koordint}] ::msgcat::mcset cs {Copy Contours} ::msgcat::mcset cs {Copy to Regions} [encoding convertfrom iso8859-2 {Kopruj do oblast}] ::msgcat::mcset cs {Copy} [encoding convertfrom iso8859-2 {Kopruj}] ::msgcat::mcset cs {Create Movie} [encoding convertfrom iso8859-2 {Vytvoit video}] ::msgcat::mcset cs {Create New Frame on Download} ::msgcat::mcset cs {Create} [encoding convertfrom iso8859-2 {Vytvoit}] ::msgcat::mcset cs {Crop Parameters} [encoding convertfrom iso8859-2 {Parametry oezvn}] ::msgcat::mcset cs {Crop} [encoding convertfrom iso8859-2 {Vez}] ::msgcat::mcset cs {Crosshair Parameters} ::msgcat::mcset cs {Crosshair To} [encoding convertfrom iso8859-2 {Zamova na}] ::msgcat::mcset cs {Crosshair} [encoding convertfrom iso8859-2 {Zamova}] ::msgcat::mcset cs {Cross} [encoding convertfrom iso8859-2 {K}] ::msgcat::mcset cs {Cubehelix} ::msgcat::mcset cs {Cube} [encoding convertfrom iso8859-2 {Krychle}] ::msgcat::mcset cs {Cubic} ::msgcat::mcset cs {Current Frame} [encoding convertfrom iso8859-2 {Souasn obrzek}] ::msgcat::mcset cs {Current Range} [encoding convertfrom iso8859-2 {Souasn rozsah}] ::msgcat::mcset cs {Current} [encoding convertfrom iso8859-2 {Souasn}] ::msgcat::mcset cs {Cursor} [encoding convertfrom iso8859-2 {Kurzor}] ::msgcat::mcset cs {Cut} [encoding convertfrom iso8859-2 {Vyznout}] ::msgcat::mcset cs {Cyan} [encoding convertfrom iso8859-2 {Azurov}] ::msgcat::mcset cs {DPI} ::msgcat::mcset cs {DS9 has detected a newer version of a backup file and therefore will not process this file.} [encoding convertfrom iso8859-2 {Program nael novou verzi zlonho souboru a tedy tento soubor nebude zpracovn.}] ::msgcat::mcset cs {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset cs {DS9 has detected an older backup file, do you wish to continue?} [encoding convertfrom iso8859-2 {DS9 detekovala starou verzi zlonho souboru, chcete pokraovat?}] ::msgcat::mcset cs {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-2 {Star konfiguran soubor, chcete ho zaktualizovat?}] ::msgcat::mcset cs {DS9 will complete the initialization process} [encoding convertfrom iso8859-2 {DS9 dokon inticializan proces}] ::msgcat::mcset cs {Dash} ::msgcat::mcset cs {Data Format} [encoding convertfrom iso8859-2 {Formt dat}] ::msgcat::mcset cs {Dataset Name} ::msgcat::mcset cs {Dataset} [encoding convertfrom iso8859-2 {Soubor dat}] ::msgcat::mcset cs {Data} ::msgcat::mcset cs {Decrease} [encoding convertfrom iso8859-2 {Zmenit}] ::msgcat::mcset cs {Default All Files} [encoding convertfrom iso8859-2 {Vychoz pro vechny soubory}] ::msgcat::mcset cs {Default Format} ::msgcat::mcset cs {Default Length} ::msgcat::mcset cs {Default} [encoding convertfrom iso8859-2 {Vchoz}] ::msgcat::mcset cs {Degrees} [encoding convertfrom iso8859-2 {Stupn}] ::msgcat::mcset cs {Delete All Frames?} [encoding convertfrom iso8859-2 {Smazat vechny snmky?}] ::msgcat::mcset cs {Delete All Frames} [encoding convertfrom iso8859-2 {Smazat vechny snmky}] ::msgcat::mcset cs {Delete All Groups?} [encoding convertfrom iso8859-2 {Smazat vechny skupiny?}] ::msgcat::mcset cs {Delete All Groups} [encoding convertfrom iso8859-2 {Smazat vechny skupiny}] ::msgcat::mcset cs {Delete All Regions?} [encoding convertfrom iso8859-2 {Smazat vechny oblasti?}] ::msgcat::mcset cs {Delete All Regions} [encoding convertfrom iso8859-2 {Smazat vechny oblasti}] ::msgcat::mcset cs {Delete All} [encoding convertfrom iso8859-2 {Smazat ve}] ::msgcat::mcset cs {Delete Color Tags} ::msgcat::mcset cs {Delete Frame} [encoding convertfrom iso8859-2 {Smazat snmek}] ::msgcat::mcset cs {Delete Group} [encoding convertfrom iso8859-2 {Smazat skupiny}] ::msgcat::mcset cs {Delete Selected Regions} [encoding convertfrom iso8859-2 {Smazat vybran oblasti}] ::msgcat::mcset cs {Delete} [encoding convertfrom iso8859-2 {Smazat}] ::msgcat::mcset cs {Depth} [encoding convertfrom iso8859-2 {Hloubka}] ::msgcat::mcset cs {Detector} [encoding convertfrom iso8859-2 {Detektor}] ::msgcat::mcset cs {Dialog Box} [encoding convertfrom iso8859-2 {Dialogov okno}] ::msgcat::mcset cs {Diamond} [encoding convertfrom iso8859-2 {Diamant}] ::msgcat::mcset cs {Dimension} [encoding convertfrom iso8859-2 {Rozmr}] ::msgcat::mcset cs {Direction} ::msgcat::mcset cs {Disconnect} ::msgcat::mcset cs {Display Header} ::msgcat::mcset cs {Display Size} [encoding convertfrom iso8859-2 {Velikost displeje}] ::msgcat::mcset cs {Dissolve} ::msgcat::mcset cs {Distance} [encoding convertfrom iso8859-2 {Vzdlenost}] ::msgcat::mcset cs {Download Colormap} ::msgcat::mcset cs {Download VOTABLE format if available} ::msgcat::mcset cs {Drag to Center} ::msgcat::mcset cs {Duplicate Data} ::msgcat::mcset cs {East} [encoding convertfrom iso8859-2 {Vchod}] ::msgcat::mcset cs {Ecliptic} [encoding convertfrom iso8859-2 {Ekliptikln}] ::msgcat::mcset cs {Edit Group Name} ::msgcat::mcset cs {Edit} [encoding convertfrom iso8859-2 {pravy}] ::msgcat::mcset cs {Elevation} ::msgcat::mcset cs {Ellipse Annulus} ::msgcat::mcset cs {Ellipse Panda} ::msgcat::mcset cs {Ellipse} [encoding convertfrom iso8859-2 {Elipsa}] ::msgcat::mcset cs {Elliptical Annulus} ::msgcat::mcset cs {Elliptical Panda} ::msgcat::mcset cs {Enable Confirmation Dialogs} ::msgcat::mcset cs {Enable} [encoding convertfrom iso8859-2 {Povolit}] ::msgcat::mcset cs {End} [encoding convertfrom iso8859-2 {Ukonit}] ::msgcat::mcset cs {Enter Color} [encoding convertfrom iso8859-2 {Zadejte barvu}] ::msgcat::mcset cs {Enter Font Size} ::msgcat::mcset cs {Enter Group Name} ::msgcat::mcset cs {Enter Search Expression} ::msgcat::mcset cs {Enter URL} ::msgcat::mcset cs {Entry} ::msgcat::mcset cs {Equal Area} ::msgcat::mcset cs {Equal Distance} ::msgcat::mcset cs {Equal Spacing} ::msgcat::mcset cs {Equal Value} ::msgcat::mcset cs {Error code was returned} ::msgcat::mcset cs {Error} ::msgcat::mcset cs {Examine Frame} ::msgcat::mcset cs {Examine} [encoding convertfrom iso8859-2 {Prozkoumat}] ::msgcat::mcset cs {Exam} ::msgcat::mcset cs {Exclude} ::msgcat::mcset cs {Executing TCL code is not enabled} ::msgcat::mcset cs {Exit} [encoding convertfrom iso8859-2 {Ukoni}] ::msgcat::mcset cs {Export Array} ::msgcat::mcset cs {Export} [encoding convertfrom iso8859-2 {Uloit jako}] ::msgcat::mcset cs {Extention} ::msgcat::mcset cs {Exterior Axes} ::msgcat::mcset cs {Exterior Numerics} ::msgcat::mcset cs {FAQ} ::msgcat::mcset cs {FK4} ::msgcat::mcset cs {FK5} ::msgcat::mcset cs {Factor} [encoding convertfrom iso8859-2 {Faktor}] ::msgcat::mcset cs {File not Found or Unable to load FITS data MIME type} [encoding convertfrom iso8859-2 {Soubor nenalezen nebo nen mon nahrt dan FITS MIME typ}] ::msgcat::mcset cs {Filename} [encoding convertfrom iso8859-2 {Nzev souboru}] ::msgcat::mcset cs {File} [encoding convertfrom iso8859-2 {Soubor}] ::msgcat::mcset cs {Fill} ::msgcat::mcset cs {Filter} [encoding convertfrom iso8859-2 {Filtr}] ::msgcat::mcset cs {Find Next} [encoding convertfrom iso8859-2 {Najt dal}] ::msgcat::mcset cs {Find} [encoding convertfrom iso8859-2 {Najt}] ::msgcat::mcset cs {First Frame} [encoding convertfrom iso8859-2 {Prvn snmek}] ::msgcat::mcset cs {First} [encoding convertfrom iso8859-2 {Prvn}] ::msgcat::mcset cs {Fits} ::msgcat::mcset cs {Fixed in Size} ::msgcat::mcset cs {Flat} ::msgcat::mcset cs {Flip} ::msgcat::mcset cs {Font} [encoding convertfrom iso8859-2 {Znak}] ::msgcat::mcset cs {For more information, use --help} [encoding convertfrom iso8859-2 {Pro vce informac, pouijte --help}] ::msgcat::mcset cs {Format} [encoding convertfrom iso8859-2 {Formt}] ::msgcat::mcset cs {Forward} [encoding convertfrom iso8859-2 {Vped}] ::msgcat::mcset cs {Found} [encoding convertfrom iso8859-2 {Nalezeno}] ::msgcat::mcset cs {Frame Information} [encoding convertfrom iso8859-2 {Informace o snmku}] ::msgcat::mcset cs {Frame Parameters} [encoding convertfrom iso8859-2 {Parametry snmku}] ::msgcat::mcset cs {Frames} [encoding convertfrom iso8859-2 {Snmky}] ::msgcat::mcset cs {Frame} [encoding convertfrom iso8859-2 {Snmek}] ::msgcat::mcset cs {From} [encoding convertfrom iso8859-2 {Od}] ::msgcat::mcset cs {Front} [encoding convertfrom iso8859-2 {Prvn}] ::msgcat::mcset cs {Full Range} [encoding convertfrom iso8859-2 {Pln rozsah}] ::msgcat::mcset cs {Function} [encoding convertfrom iso8859-2 {Funkce}] ::msgcat::mcset cs {GUI Font} [encoding convertfrom iso8859-2 {Font GUI}] ::msgcat::mcset cs {Galactic} [encoding convertfrom iso8859-2 {Galaktick}] ::msgcat::mcset cs {Gap} ::msgcat::mcset cs {Gaussian} ::msgcat::mcset cs {General} ::msgcat::mcset cs {Generate} [encoding convertfrom iso8859-2 {Vygeneruj}] ::msgcat::mcset cs {Generating Regions} ::msgcat::mcset cs {Get Information} [encoding convertfrom iso8859-2 {Zskej informace}] ::msgcat::mcset cs {Gist} ::msgcat::mcset cs {Global Properties} ::msgcat::mcset cs {Global} ::msgcat::mcset cs {Goto Frame} [encoding convertfrom iso8859-2 {B na snmek}] ::msgcat::mcset cs {Graph Horz} ::msgcat::mcset cs {Graph Vert} ::msgcat::mcset cs {Graphics} ::msgcat::mcset cs {Graphs} [encoding convertfrom iso8859-2 {Grafy}] ::msgcat::mcset cs {Graph} [encoding convertfrom iso8859-2 {Graf}] ::msgcat::mcset cs {Grayscale} [encoding convertfrom iso8859-2 {Stupn edi}] ::msgcat::mcset cs {Green} [encoding convertfrom iso8859-2 {Zelen}] ::msgcat::mcset cs {Grid Gap} ::msgcat::mcset cs {Grid} [encoding convertfrom iso8859-2 {Mka}] ::msgcat::mcset cs {Groove} ::msgcat::mcset cs {Groups} [encoding convertfrom iso8859-2 {Skupiny}] ::msgcat::mcset cs {HTTP} ::msgcat::mcset cs {Header} [encoding convertfrom iso8859-2 {Hlavika}] ::msgcat::mcset cs {Height} [encoding convertfrom iso8859-2 {Vka}] ::msgcat::mcset cs {Help Desk} [encoding convertfrom iso8859-2 {Podpora}] ::msgcat::mcset cs {Help Me Choose} ::msgcat::mcset cs {Help} [encoding convertfrom iso8859-2 {Npovda}] ::msgcat::mcset cs {Hide All} [encoding convertfrom iso8859-2 {Skryj vechny}] ::msgcat::mcset cs {Highlite} ::msgcat::mcset cs {High} [encoding convertfrom iso8859-2 {Vysok}] ::msgcat::mcset cs {Histogram Equalization} [encoding convertfrom iso8859-2 {Vyrovnn histogramu}] ::msgcat::mcset cs {Histogram} ::msgcat::mcset cs {Horizontal Graph} [encoding convertfrom iso8859-2 {Horizontln graf}] ::msgcat::mcset cs {Horizontal Layout} [encoding convertfrom iso8859-2 {Horizontln rozloen}] ::msgcat::mcset cs {Horizontal} ::msgcat::mcset cs {IAU Location Code} ::msgcat::mcset cs {ICRS} ::msgcat::mcset cs {Identification} ::msgcat::mcset cs {If} ::msgcat::mcset cs {Image Servers} [encoding convertfrom iso8859-2 {Obrzkov servery}] ::msgcat::mcset cs {Image} [encoding convertfrom iso8859-2 {Obrzek}] ::msgcat::mcset cs {Import Array} ::msgcat::mcset cs {Import} ::msgcat::mcset cs {Include} ::msgcat::mcset cs {Increase} ::msgcat::mcset cs {Information Panel} [encoding convertfrom iso8859-2 {Informan panel}] ::msgcat::mcset cs {Information} [encoding convertfrom iso8859-2 {Detaily}] ::msgcat::mcset cs {Initialize XPA} ::msgcat::mcset cs {Inner} ::msgcat::mcset cs {Instrument FOV} [encoding convertfrom iso8859-2 {Zorn pole dalekohled}] ::msgcat::mcset cs {Interior Axes} ::msgcat::mcset cs {Interior Numerics} ::msgcat::mcset cs {Internal Parse Error} ::msgcat::mcset cs {Interval} ::msgcat::mcset cs {Invalid Column Name} ::msgcat::mcset cs {Invalid formated multipart/mixed mime type message} ::msgcat::mcset cs {Invert Colormap} ::msgcat::mcset cs {Invert Selection} [encoding convertfrom iso8859-2 {Vybrat doplnk}] ::msgcat::mcset cs {Invert} [encoding convertfrom iso8859-2 {Peklopit}] ::msgcat::mcset cs {Italic} [encoding convertfrom iso8859-2 {Kurzva}] ::msgcat::mcset cs {Items Found} ::msgcat::mcset cs {Iteration} ::msgcat::mcset cs {JPEG Quality Factor} [encoding convertfrom iso8859-2 {Kvalita JPEGu}] ::msgcat::mcset cs {Keep-Alive} ::msgcat::mcset cs {Kernel} [encoding convertfrom iso8859-2 {Kernel}] ::msgcat::mcset cs {Keyboard Shortcuts} [encoding convertfrom iso8859-2 {Klvesnicov zkratky}] ::msgcat::mcset cs {Keyboard} [encoding convertfrom iso8859-2 {Klvesnice}] ::msgcat::mcset cs {Keyword} ::msgcat::mcset cs {Labels} [encoding convertfrom iso8859-2 {Oznaen}] ::msgcat::mcset cs {Label} [encoding convertfrom iso8859-2 {Oznaen}] ::msgcat::mcset cs {Landscape} [encoding convertfrom iso8859-2 {Horizontln}] ::msgcat::mcset cs {Language} [encoding convertfrom iso8859-2 {Jazyk}] ::msgcat::mcset cs {Last Frame} [encoding convertfrom iso8859-2 {Posledn snmek}] ::msgcat::mcset cs {Last} [encoding convertfrom iso8859-2 {Posledn}] ::msgcat::mcset cs {Layout Horz} ::msgcat::mcset cs {Layout Vert} ::msgcat::mcset cs {Layout} [encoding convertfrom iso8859-2 {Rozvren}] ::msgcat::mcset cs {Left} [encoding convertfrom iso8859-2 {Vlevo}] ::msgcat::mcset cs {Legal} ::msgcat::mcset cs {Legend Title} ::msgcat::mcset cs {Legend} ::msgcat::mcset cs {Length} [encoding convertfrom iso8859-2 {Dlka}] ::msgcat::mcset cs {Letter} ::msgcat::mcset cs {Levels} [encoding convertfrom iso8859-2 {rovn}] ::msgcat::mcset cs {Level} [encoding convertfrom iso8859-2 {rove}] ::msgcat::mcset cs {Limits} ::msgcat::mcset cs {Line Plot Tool} ::msgcat::mcset cs {Linear} [encoding convertfrom iso8859-2 {Linrn}] ::msgcat::mcset cs {Line} ::msgcat::mcset cs {List Data} ::msgcat::mcset cs {List Regions} [encoding convertfrom iso8859-2 {Seznam oblast}] ::msgcat::mcset cs {List} [encoding convertfrom iso8859-2 {Seznam}] ::msgcat::mcset cs {Load Analysis Commands} [encoding convertfrom iso8859-2 {Nahrt analytick pkazy}] ::msgcat::mcset cs {Load Color Tags} ::msgcat::mcset cs {Load Colormap} ::msgcat::mcset cs {Load Configuration} [encoding convertfrom iso8859-2 {Nahraj konfiguraci}] ::msgcat::mcset cs {Load Contour Levels} ::msgcat::mcset cs {Load Contours} ::msgcat::mcset cs {Load Contrast/Bias} ::msgcat::mcset cs {Load Data} ::msgcat::mcset cs {Load Mosaic} ::msgcat::mcset cs {Load Regions} [encoding convertfrom iso8859-2 {Nahrt oblasti}] ::msgcat::mcset cs {Load Template} ::msgcat::mcset cs {Load into All Frames} ::msgcat::mcset cs {Load into Current Frame} ::msgcat::mcset cs {Loading Catalog} ::msgcat::mcset cs {Loading} ::msgcat::mcset cs {Load} [encoding convertfrom iso8859-2 {Nahrt}] ::msgcat::mcset cs {Local} ::msgcat::mcset cs {Lock Axes} ::msgcat::mcset cs {Lock Bin} ::msgcat::mcset cs {Lock Color} ::msgcat::mcset cs {Lock Crop Amplifier} ::msgcat::mcset cs {Lock Crop Detector} ::msgcat::mcset cs {Lock Crop Image} ::msgcat::mcset cs {Lock Crop None} ::msgcat::mcset cs {Lock Crop Physical} ::msgcat::mcset cs {Lock Crop WCS} ::msgcat::mcset cs {Lock Crosshair Amplifier} ::msgcat::mcset cs {Lock Crosshair Detector} ::msgcat::mcset cs {Lock Crosshair Image} ::msgcat::mcset cs {Lock Crosshair None} ::msgcat::mcset cs {Lock Crosshair Physical} ::msgcat::mcset cs {Lock Crosshair WCS} ::msgcat::mcset cs {Lock Frame Amplifier} ::msgcat::mcset cs {Lock Frame Detector} ::msgcat::mcset cs {Lock Frame Image} ::msgcat::mcset cs {Lock Frame None} ::msgcat::mcset cs {Lock Frame Physical} ::msgcat::mcset cs {Lock Frame WCS} ::msgcat::mcset cs {Lock Limits} ::msgcat::mcset cs {Lock Scale} ::msgcat::mcset cs {Lock Slice Image} ::msgcat::mcset cs {Lock Slice None} ::msgcat::mcset cs {Lock Slice WCS} ::msgcat::mcset cs {Lock Smooth} ::msgcat::mcset cs {Lock} [encoding convertfrom iso8859-2 {Synchronizovat}] ::msgcat::mcset cs {Log Exponent} [encoding convertfrom iso8859-2 {Numerus logaritmu}] ::msgcat::mcset cs {Log} [encoding convertfrom iso8859-2 {Logaritmick}] ::msgcat::mcset cs {Low High} [encoding convertfrom iso8859-2 {Nejmen Nejvt}] ::msgcat::mcset cs {Lower Left Back} ::msgcat::mcset cs {Lower Left Front} ::msgcat::mcset cs {Lower Right Back} ::msgcat::mcset cs {Lower Right Front} ::msgcat::mcset cs {Low} ::msgcat::mcset cs {MIP} ::msgcat::mcset cs {Magenta} ::msgcat::mcset cs {Magnification} ::msgcat::mcset cs {Magnifier} [encoding convertfrom iso8859-2 {Zvtova}] ::msgcat::mcset cs {Major} ::msgcat::mcset cs {Manual} ::msgcat::mcset cs {Mask Parameters} [encoding convertfrom iso8859-2 {Nastaven masky}] ::msgcat::mcset cs {Match Axes} ::msgcat::mcset cs {Match Bin} [encoding convertfrom iso8859-2 {Zarovnat bin}] ::msgcat::mcset cs {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset cs {Match Color} [encoding convertfrom iso8859-2 {Sladit barvu}] ::msgcat::mcset cs {Match Crop Amplifier} ::msgcat::mcset cs {Match Crop Detector} ::msgcat::mcset cs {Match Crop Image} ::msgcat::mcset cs {Match Crop Physical} ::msgcat::mcset cs {Match Crop WCS} ::msgcat::mcset cs {Match Crosshair Amplifier} ::msgcat::mcset cs {Match Crosshair Detector} ::msgcat::mcset cs {Match Crosshair Image} ::msgcat::mcset cs {Match Crosshair Physical} ::msgcat::mcset cs {Match Crosshair WCS} ::msgcat::mcset cs {Match Frame Amplifier} ::msgcat::mcset cs {Match Frame Detector} ::msgcat::mcset cs {Match Frame Image} ::msgcat::mcset cs {Match Frame Physical} ::msgcat::mcset cs {Match Frame WCS} ::msgcat::mcset cs {Match Limits} ::msgcat::mcset cs {Match Scale} [encoding convertfrom iso8859-2 {Zarovnat klovn}] ::msgcat::mcset cs {Match Slice Image} ::msgcat::mcset cs {Match Slice WCS} ::msgcat::mcset cs {Match Smooth} ::msgcat::mcset cs {Match} [encoding convertfrom iso8859-2 {Zarovnat}] ::msgcat::mcset cs {Math Function} ::msgcat::mcset cs {Matplotlib} ::msgcat::mcset cs {Max Rows} ::msgcat::mcset cs {Max} ::msgcat::mcset cs {Menus and Buttons} ::msgcat::mcset cs {Menu} [encoding convertfrom iso8859-2 {Nabdka}] ::msgcat::mcset cs {Message Log} ::msgcat::mcset cs {Method} ::msgcat::mcset cs {Min Max Parameters} ::msgcat::mcset cs {Min Max} [encoding convertfrom iso8859-2 {Minimum Maximum}] ::msgcat::mcset cs {Minor} ::msgcat::mcset cs {Minutes} ::msgcat::mcset cs {Min} ::msgcat::mcset cs {Mission} ::msgcat::mcset cs {Mode} ::msgcat::mcset cs {Mosaic IRAF Segment} ::msgcat::mcset cs {Mosaic IRAF} ::msgcat::mcset cs {Mosaic WCS Segment} ::msgcat::mcset cs {Mosaic WCS} ::msgcat::mcset cs {Mosaic WFPC2} ::msgcat::mcset cs {Mosaic} ::msgcat::mcset cs {Mouse Click Epsilon} ::msgcat::mcset cs {Mouse Wheel Bin} ::msgcat::mcset cs {Mouse Wheel Zoom} ::msgcat::mcset cs {Mouse and Keyboard} ::msgcat::mcset cs {Move Back} ::msgcat::mcset cs {Move First} ::msgcat::mcset cs {Move Forward} ::msgcat::mcset cs {Move Frame} [encoding convertfrom iso8859-2 {Pesunout snmek}] ::msgcat::mcset cs {Move Last} ::msgcat::mcset cs {Move to Back} [encoding convertfrom iso8859-2 {Pesunout vzad}] ::msgcat::mcset cs {Move to Front} [encoding convertfrom iso8859-2 {Pesunout vped}] ::msgcat::mcset cs {Movie} ::msgcat::mcset cs {Multiple Extension Cube} ::msgcat::mcset cs {Multiple Extension Frames} ::msgcat::mcset cs {Multiple WCS} [encoding convertfrom iso8859-2 {Multi WCS}] ::msgcat::mcset cs {NRRD} ::msgcat::mcset cs {Name Resolution} [encoding convertfrom iso8859-2 {Vyhledn objektu}] ::msgcat::mcset cs {Name Server} ::msgcat::mcset cs {Name or Designation} ::msgcat::mcset cs {Name} [encoding convertfrom iso8859-2 {Nzev}] ::msgcat::mcset cs {Native Dialog} ::msgcat::mcset cs {New Features} [encoding convertfrom iso8859-2 {Nov vlasnosti}] ::msgcat::mcset cs {New Frame 3D} [encoding convertfrom iso8859-2 {Nov 3D snmek}] ::msgcat::mcset cs {New Frame RGB} [encoding convertfrom iso8859-2 {Nov barevn RGB snmek}] ::msgcat::mcset cs {New Frame each Time} ::msgcat::mcset cs {New Frame} [encoding convertfrom iso8859-2 {Nov snmek}] ::msgcat::mcset cs {New Group} [encoding convertfrom iso8859-2 {Nov skupina}] ::msgcat::mcset cs {New} [encoding convertfrom iso8859-2 {Nov}] ::msgcat::mcset cs {Next Frame} [encoding convertfrom iso8859-2 {Dal snmek}] ::msgcat::mcset cs {Next} [encoding convertfrom iso8859-2 {Dal}] ::msgcat::mcset cs {No Catalog specified} ::msgcat::mcset cs {No Items Found} ::msgcat::mcset cs {No current frame} ::msgcat::mcset cs {No data available at } ::msgcat::mcset cs {Non-zero} ::msgcat::mcset cs {None} [encoding convertfrom iso8859-2 {Nic}] ::msgcat::mcset cs {Normal} ::msgcat::mcset cs {North} [encoding convertfrom iso8859-2 {Sever}] ::msgcat::mcset cs {Not Found} ::msgcat::mcset cs {Number of Samples} ::msgcat::mcset cs {Number of Threads} ::msgcat::mcset cs {Number of Ticks} ::msgcat::mcset cs {Number} [encoding convertfrom iso8859-2 {slo}] ::msgcat::mcset cs {Numerics} ::msgcat::mcset cs {OK} [encoding convertfrom iso8859-2 {Budi}] ::msgcat::mcset cs {Object} [encoding convertfrom iso8859-2 {Objekt}] ::msgcat::mcset cs {Open File} [encoding convertfrom iso8859-2 {Otevt soubor}] ::msgcat::mcset cs {Open TCL Console} [encoding convertfrom iso8859-2 {Otevt konzoly TCL}] ::msgcat::mcset cs {Open URL} [encoding convertfrom iso8859-2 {Otevt URL}] ::msgcat::mcset cs {Open as} ::msgcat::mcset cs {Open} [encoding convertfrom iso8859-2 {Otevt}] ::msgcat::mcset cs {Operator} ::msgcat::mcset cs {Orientation} ::msgcat::mcset cs {Origin} ::msgcat::mcset cs {Oscillate} ::msgcat::mcset cs {Other Color} ::msgcat::mcset cs {Other Font Size} ::msgcat::mcset cs {Other} ::msgcat::mcset cs {Outer} ::msgcat::mcset cs {Overlap} ::msgcat::mcset cs {PS Page Setup} ::msgcat::mcset cs {PS Print} ::msgcat::mcset cs {Page Setup} [encoding convertfrom iso8859-2 {Vlastnosti tisku}] ::msgcat::mcset cs {Page Source} ::msgcat::mcset cs {Pan To} ::msgcat::mcset cs {Pan Zoom Rotate Parameters} [encoding convertfrom iso8859-2 {Parametry prohlen a zvten}] ::msgcat::mcset cs {Pan Zoom} ::msgcat::mcset cs {Pan then Zoom} ::msgcat::mcset cs {Panda} ::msgcat::mcset cs {Panner} [encoding convertfrom iso8859-2 {Nhled snmku}] ::msgcat::mcset cs {Pan} [encoding convertfrom iso8859-2 {Posun}] ::msgcat::mcset cs {Parameters} ::msgcat::mcset cs {Password} ::msgcat::mcset cs {Paste Contours} ::msgcat::mcset cs {Paste} [encoding convertfrom iso8859-2 {Vloit}] ::msgcat::mcset cs {Physical} [encoding convertfrom iso8859-2 {Fyzick}] ::msgcat::mcset cs {Pixel Distribution} ::msgcat::mcset cs {Pixel Size} ::msgcat::mcset cs {Pixel Table} [encoding convertfrom iso8859-2 {Pixel tabulka}] ::msgcat::mcset cs {Pixels} ::msgcat::mcset cs {Play} ::msgcat::mcset cs {Please Select a Region} ::msgcat::mcset cs {Please specify width, height, and either name or (ra,dec)} ::msgcat::mcset cs {Plot 2D} ::msgcat::mcset cs {Plot 3D} ::msgcat::mcset cs {Plot Title} ::msgcat::mcset cs {Plotting Regions} ::msgcat::mcset cs {Plot} ::msgcat::mcset cs {Plus} ::msgcat::mcset cs {Pointer} [encoding convertfrom iso8859-2 {Ukazatel}] ::msgcat::mcset cs {Points} ::msgcat::mcset cs {Point} ::msgcat::mcset cs {Polygon} ::msgcat::mcset cs {Portrait} ::msgcat::mcset cs {Poster} ::msgcat::mcset cs {Postscript Page Setup} ::msgcat::mcset cs {Postscript Print} ::msgcat::mcset cs {Postscript} ::msgcat::mcset cs {Power} [encoding convertfrom iso8859-2 {Mocninov}] ::msgcat::mcset cs {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} ::msgcat::mcset cs {Preferences} [encoding convertfrom iso8859-2 {Nastaven}] ::msgcat::mcset cs {Preserve During Load} [encoding convertfrom iso8859-2 {Zachovej pi oteven}] ::msgcat::mcset cs {Previous Frame} [encoding convertfrom iso8859-2 {Pedel snmek}] ::msgcat::mcset cs {Previous} [encoding convertfrom iso8859-2 {Pedchoz}] ::msgcat::mcset cs {Prev} ::msgcat::mcset cs {Print Coordinates} ::msgcat::mcset cs {Print To} ::msgcat::mcset cs {Printer} ::msgcat::mcset cs {Print} [encoding convertfrom iso8859-2 {Vytisknout}] ::msgcat::mcset cs {Projection} ::msgcat::mcset cs {Properties} [encoding convertfrom iso8859-2 {Vlastnosti}] ::msgcat::mcset cs {Property} ::msgcat::mcset cs {Proxy Host} ::msgcat::mcset cs {Proxy Port} ::msgcat::mcset cs {Publication} ::msgcat::mcset cs {Quadratic} ::msgcat::mcset cs {RGB Array} ::msgcat::mcset cs {RGB Cube} ::msgcat::mcset cs {RGB Image} ::msgcat::mcset cs {RGB} ::msgcat::mcset cs {Radial Profile} ::msgcat::mcset cs {Radial} ::msgcat::mcset cs {Radius} ::msgcat::mcset cs {Raised} ::msgcat::mcset cs {Range} ::msgcat::mcset cs {Redo} ::msgcat::mcset cs {Red} ::msgcat::mcset cs {Reference Manual} [encoding convertfrom iso8859-2 {Seznam pkaz}] ::msgcat::mcset cs {Reference} ::msgcat::mcset cs {Refresh Frame} [encoding convertfrom iso8859-2 {Obnov snmek}] ::msgcat::mcset cs {Refresh} ::msgcat::mcset cs {Region Parameters} [encoding convertfrom iso8859-2 {Parametry oblast}] ::msgcat::mcset cs {Region} [encoding convertfrom iso8859-2 {Oblasti}] ::msgcat::mcset cs {Release Notes} [encoding convertfrom iso8859-2 {Informace o vydn}] ::msgcat::mcset cs {Release} ::msgcat::mcset cs {Relief} ::msgcat::mcset cs {Reload} ::msgcat::mcset cs {Render} ::msgcat::mcset cs {Repeat} ::msgcat::mcset cs {Reset Colormap} ::msgcat::mcset cs {Reset Frame} [encoding convertfrom iso8859-2 {Vynulovat nastaven snmku}] ::msgcat::mcset cs {Reset} ::msgcat::mcset cs {Restore} [encoding convertfrom iso8859-2 {Obnovit}] ::msgcat::mcset cs {Retrieve} ::msgcat::mcset cs {Return} ::msgcat::mcset cs {Right} ::msgcat::mcset cs {Roman} ::msgcat::mcset cs {Rotate} {Rotovat} ::msgcat::mcset cs {Rows} ::msgcat::mcset cs {Row} ::msgcat::mcset cs {Ruler} ::msgcat::mcset cs {SAMP Image} ::msgcat::mcset cs {SAMP Table} ::msgcat::mcset cs {SAMP: already connected} ::msgcat::mcset cs {SAMP: internal error} ::msgcat::mcset cs {SAMP: not connected} ::msgcat::mcset cs {SAMP: unable to locate HUB} ::msgcat::mcset cs {SAMP} ::msgcat::mcset cs {Sample Increment} ::msgcat::mcset cs {Sample Parameters} ::msgcat::mcset cs {Samples per Line} ::msgcat::mcset cs {Sample} ::msgcat::mcset cs {Save 3D Movie} ::msgcat::mcset cs {Save Color Tags} ::msgcat::mcset cs {Save Colormap} ::msgcat::mcset cs {Save Configuration} ::msgcat::mcset cs {Save Contour Levels} ::msgcat::mcset cs {Save Contours} ::msgcat::mcset cs {Save Contrast/Bias} ::msgcat::mcset cs {Save Data} ::msgcat::mcset cs {Save Image on Download} ::msgcat::mcset cs {Save Image} [encoding convertfrom iso8859-2 {Uloit snmek}] ::msgcat::mcset cs {Save Regions} [encoding convertfrom iso8859-2 {Uloit oblasti}] ::msgcat::mcset cs {Save Template} [encoding convertfrom iso8859-2 {Uloit ablony}] ::msgcat::mcset cs {Save as} ::msgcat::mcset cs {Save} [encoding convertfrom iso8859-2 {Uloit}] ::msgcat::mcset cs {Scale Parameters} [encoding convertfrom iso8859-2 {Parametry klovn}] ::msgcat::mcset cs {Scale and Limits} ::msgcat::mcset cs {Scale} [encoding convertfrom iso8859-2 {klovn}] ::msgcat::mcset cs {Scan} ::msgcat::mcset cs {Scatter Plot Tool} ::msgcat::mcset cs {Scope} ::msgcat::mcset cs {Search for Catalogs} ::msgcat::mcset cs {Searching for catalogs} ::msgcat::mcset cs {Seconds} ::msgcat::mcset cs {Segment} ::msgcat::mcset cs {Select All} [encoding convertfrom iso8859-2 {Vybrat vechny}] ::msgcat::mcset cs {Select Coordinate System } ::msgcat::mcset cs {Select None} [encoding convertfrom iso8859-2 {Zruit vbr}] ::msgcat::mcset cs {Select} ::msgcat::mcset cs {Send} ::msgcat::mcset cs {Server} ::msgcat::mcset cs {Sexagesimal} [encoding convertfrom iso8859-2 {edestkov}] ::msgcat::mcset cs {Shape} [encoding convertfrom iso8859-2 {Tvar}] ::msgcat::mcset cs {Show All} [encoding convertfrom iso8859-2 {Zobrazit ve}] ::msgcat::mcset cs {Show Command} ::msgcat::mcset cs {Show Compass} ::msgcat::mcset cs {Show Text} ::msgcat::mcset cs {Show/Hide Frames} [encoding convertfrom iso8859-2 {Zobrazit/skrt snmky}] ::msgcat::mcset cs {Show} ::msgcat::mcset cs {Simple Cross} ::msgcat::mcset cs {Simple Plus} ::msgcat::mcset cs {Single Frame} [encoding convertfrom iso8859-2 {Jeden snmek}] ::msgcat::mcset cs {Single} [encoding convertfrom iso8859-2 {jeden}] ::msgcat::mcset cs {Sites} ::msgcat::mcset cs {Size/Radius} ::msgcat::mcset cs {Size} ::msgcat::mcset cs {Skip First} ::msgcat::mcset cs {Slice} ::msgcat::mcset cs {Smooth Parameters} [encoding convertfrom iso8859-2 {Nastaven vyhlazen}] ::msgcat::mcset cs {Smoothness} ::msgcat::mcset cs {Smooth} [encoding convertfrom iso8859-2 {Vyhlazen}] ::msgcat::mcset cs {Solid} ::msgcat::mcset cs {Sorry, DS9 does not support} ::msgcat::mcset cs {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset cs {Sort} ::msgcat::mcset cs {Source TCL} ::msgcat::mcset cs {Source} ::msgcat::mcset cs {Space Equal Distance} ::msgcat::mcset cs {Space Equal Value} ::msgcat::mcset cs {Spacing} ::msgcat::mcset cs {Sqrt} ::msgcat::mcset cs {Square Root} [encoding convertfrom iso8859-2 {Odmocninov}] ::msgcat::mcset cs {Squared} ::msgcat::mcset cs {Square} ::msgcat::mcset cs {Stacked} ::msgcat::mcset cs {Starbase} ::msgcat::mcset cs {Startup} ::msgcat::mcset cs {Start} ::msgcat::mcset cs {Statistics} ::msgcat::mcset cs {Stats} ::msgcat::mcset cs {Status} ::msgcat::mcset cs {Step} ::msgcat::mcset cs {Stop} ::msgcat::mcset cs {Story of SAOImage DS9} [encoding convertfrom iso8859-2 {Pbh SAOImage DS9}] ::msgcat::mcset cs {Story} ::msgcat::mcset cs {Sum} ::msgcat::mcset cs {Sunken} ::msgcat::mcset cs {Symbol Editor} ::msgcat::mcset cs {Symbol} ::msgcat::mcset cs {Tab-Separated-Value} ::msgcat::mcset cs {Table} ::msgcat::mcset cs {Tabloid} ::msgcat::mcset cs {Task} ::msgcat::mcset cs {Template} [encoding convertfrom iso8859-2 {ablona}] ::msgcat::mcset cs {Text Font} ::msgcat::mcset cs {Text} ::msgcat::mcset cs {Then} ::msgcat::mcset cs {Thickness} ::msgcat::mcset cs {This analysis task is already running. Do you wish to kill it?} ::msgcat::mcset cs {This function is not currently supported for this port.} ::msgcat::mcset cs {Tickmarks} ::msgcat::mcset cs {Tile Frames} [encoding convertfrom iso8859-2 {Snmky do dladic}] ::msgcat::mcset cs {Tile Parameters} [encoding convertfrom iso8859-2 {Parametry dladic}] ::msgcat::mcset cs {Tile} [encoding convertfrom iso8859-2 {Dladice}] ::msgcat::mcset cs {Times} ::msgcat::mcset cs {Title} ::msgcat::mcset cs {Tophat} ::msgcat::mcset cs {Topographic} ::msgcat::mcset cs {Top} ::msgcat::mcset cs {To} ::msgcat::mcset cs {Transparency} ::msgcat::mcset cs {Triangle} ::msgcat::mcset cs {Type} ::msgcat::mcset cs {URL} ::msgcat::mcset cs {Unable to connect directly: using Web Proxy} ::msgcat::mcset cs {Unable to determine date of observation} ::msgcat::mcset cs {Unable to determine time of observation} ::msgcat::mcset cs {Unable to evaluate filter} ::msgcat::mcset cs {Unable to find catalog window} ::msgcat::mcset cs {Unable to find plot window} ::msgcat::mcset cs {Unable to load RGB image into a non-rgb frame} ::msgcat::mcset cs {Unable to load region file} ::msgcat::mcset cs {Unable to load} ::msgcat::mcset cs {Unable to locate URL} ::msgcat::mcset cs {Unable to match target with XPA Mime request} ::msgcat::mcset cs {Unable to open file} ::msgcat::mcset cs {Unable to process Analysis file} ::msgcat::mcset cs {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset cs {Undo} [encoding convertfrom iso8859-2 {Zpt}] ::msgcat::mcset cs {Unique} ::msgcat::mcset cs {Unists} ::msgcat::mcset cs {Units} ::msgcat::mcset cs {Unknown Colormap} ::msgcat::mcset cs {Unknown command} ::msgcat::mcset cs {Update Filter} ::msgcat::mcset cs {Update Group} ::msgcat::mcset cs {Update from Current Crosshair} ::msgcat::mcset cs {Update from Current Frame} ::msgcat::mcset cs {Update} ::msgcat::mcset cs {Upper Left Back} ::msgcat::mcset cs {Upper Left Front} ::msgcat::mcset cs {Upper Right Back} ::msgcat::mcset cs {Upper Right Front} ::msgcat::mcset cs {Use Authentication} ::msgcat::mcset cs {Use Current Frame on Download} ::msgcat::mcset cs {Use Internal Web Browser} ::msgcat::mcset cs {Use Proxy} ::msgcat::mcset cs {User Manual} [encoding convertfrom iso8859-2 {Uivatelsk manul}] ::msgcat::mcset cs {Username} ::msgcat::mcset cs {User} [encoding convertfrom iso8859-2 {Uivatelsk}] ::msgcat::mcset cs {Use} [encoding convertfrom iso8859-2 {Pouvat}] ::msgcat::mcset cs {VO Server} ::msgcat::mcset cs {VO} ::msgcat::mcset cs {Value} [encoding convertfrom iso8859-2 {Hodnota}] ::msgcat::mcset cs {Vector} ::msgcat::mcset cs {Vertical Graph} [encoding convertfrom iso8859-2 {Vertikln graf}] ::msgcat::mcset cs {Vertical Layout} [encoding convertfrom iso8859-2 {Vertikln rozloen}] ::msgcat::mcset cs {Vertical Text} ::msgcat::mcset cs {Vertical} ::msgcat::mcset cs {View} [encoding convertfrom iso8859-2 {Zobrazit}] ::msgcat::mcset cs {Virtual Observatory} [encoding convertfrom iso8859-2 {Virtuln Observato}] ::msgcat::mcset cs {WCS Parameters} [encoding convertfrom iso8859-2 {Detaily WCS}] ::msgcat::mcset cs {WCS} ::msgcat::mcset cs {Wavelength} ::msgcat::mcset cs {Web Browser} [encoding convertfrom iso8859-2 {Prohle}] ::msgcat::mcset cs {White} ::msgcat::mcset cs {Width} [encoding convertfrom iso8859-2 {Tlouka}] ::msgcat::mcset cs {Window} ::msgcat::mcset cs {Words matching title, description} ::msgcat::mcset cs {Writing Catalog} ::msgcat::mcset cs {X Axis Title} ::msgcat::mcset cs {X Grid} ::msgcat::mcset cs {XPA Information} ::msgcat::mcset cs {XPA not initialized} [encoding convertfrom iso8859-2] ::msgcat::mcset cs {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset cs {XPA} ::msgcat::mcset cs {X} ::msgcat::mcset cs {Y Axis Title} ::msgcat::mcset cs {Y Grid} ::msgcat::mcset cs {Yellow} [encoding convertfrom iso8859-2 {lut}] ::msgcat::mcset cs {Y} ::msgcat::mcset cs {Z Axis Scale} ::msgcat::mcset cs {ZScale Parameters} [encoding convertfrom iso8859-2 {Parametry ZScale}] ::msgcat::mcset cs {Zero} [encoding convertfrom iso8859-2 {Nula}] ::msgcat::mcset cs {Zoom Fit} ::msgcat::mcset cs {Zoom In} [encoding convertfrom iso8859-2 {Zvtit}] ::msgcat::mcset cs {Zoom Out} [encoding convertfrom iso8859-2 {Zmenit}] ::msgcat::mcset cs {Zoom} [encoding convertfrom iso8859-2 {Zvten}] ::msgcat::mcset cs {and} ::msgcat::mcset cs {blue} [encoding convertfrom iso8859-2 {modr}] ::msgcat::mcset cs {b} ::msgcat::mcset cs {color} [encoding convertfrom iso8859-2 {barva}] ::msgcat::mcset cs {cool} [encoding convertfrom iso8859-2 {chlad}] ::msgcat::mcset cs {green} [encoding convertfrom iso8859-2 {zelen}] ::msgcat::mcset cs {grey} [encoding convertfrom iso8859-2 {ed}] ::msgcat::mcset cs {g} ::msgcat::mcset cs {h5utils} ::msgcat::mcset cs {heat} [encoding convertfrom iso8859-2 {horko}] ::msgcat::mcset cs {not} ::msgcat::mcset cs {only} ::msgcat::mcset cs {or center of data} ::msgcat::mcset cs {rainbow} [encoding convertfrom iso8859-2 {duha}] ::msgcat::mcset cs {red} [encoding convertfrom iso8859-2 {erven}] ::msgcat::mcset cs {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom iso8859-2 {dk dat. Vce jich me bt k dispozici. Zkuste zmnit povolen maximum}] ::msgcat::mcset cs {r} ::msgcat::mcset cs {staircase} [encoding convertfrom iso8859-2 {schodit}] ::msgcat::mcset cs {standard} ::msgcat::mcset cs {x} ::msgcat::mcset cs {} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/da.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000117636 12600277755 015161� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset da {2D} ::msgcat::mcset da {3D} ::msgcat::mcset da {A postscript generation error has occurred} [encoding convertfrom iso8859-1 {En fejl er opstet under postscript generering}] ::msgcat::mcset da {AIP} ::msgcat::mcset da {Abort} ::msgcat::mcset da {About SAOImage DS9} {Om SAOImage DS9} ::msgcat::mcset da {About} {Om} ::msgcat::mcset da {Acknowledgment} {Tak} ::msgcat::mcset da {Add} [encoding convertfrom iso8859-1 {Tilfj}] ::msgcat::mcset da {Advanced} {Avanceret} ::msgcat::mcset da {Aligned} ::msgcat::mcset da {Align} {Juster} ::msgcat::mcset da {All Columns} {Alle sjler} ::msgcat::mcset da {All Rows} [encoding convertfrom iso8859-1 {Alle rkker}] ::msgcat::mcset da {All} {Alle} ::msgcat::mcset da {Always save files during Backup} ::msgcat::mcset da {Amplifier} [encoding convertfrom iso8859-1 {Forstrker}] ::msgcat::mcset da {An error has occurred during backup} ::msgcat::mcset da {An error has occurred during restore} ::msgcat::mcset da {An error has occurred invoking the Analysis task} [encoding convertfrom iso8859-1 {Fejl opstet ved kald til analyse program}] ::msgcat::mcset da {An error has occurred while creating image.} ::msgcat::mcset da {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset da {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset da {An error has occurred while printing} [encoding convertfrom iso8859-1 {Fejl opstet under udskrivning}] ::msgcat::mcset da {An error has occurred while reading image.} ::msgcat::mcset da {An error has occurred while saving} [encoding convertfrom iso8859-1 {Fejl opstet under gemning}] ::msgcat::mcset da {An error has occurred while updating VO server list} ::msgcat::mcset da {An error has occurred while writing image.} ::msgcat::mcset da {An internal error has been detected} ::msgcat::mcset da {Analysis Command Log} {Analyse kommando logbog} ::msgcat::mcset da {Analysis Commands} [encoding convertfrom iso8859-1 {Analyse muligheder}] ::msgcat::mcset da {Analysis File} ::msgcat::mcset da {Analysis Log} ::msgcat::mcset da {Analysis} {Analyse} ::msgcat::mcset da {Angle Complement} [encoding convertfrom iso8859-1 {Komplementrvinkel}] ::msgcat::mcset da {Angles} {Vinkler} ::msgcat::mcset da {Angle} {Vinkel} ::msgcat::mcset da {Annuli} {Ringforme} ::msgcat::mcset da {Annulus} {Ringform} ::msgcat::mcset da {Apply} {Anvend} ::msgcat::mcset da {ArcMin} {Bueminutter} ::msgcat::mcset da {ArcSec} {Buesekunder} ::msgcat::mcset da {Architecture} {Arkitektur} ::msgcat::mcset da {Archives} {Arkiver} ::msgcat::mcset da {Array} ::msgcat::mcset da {Arrow} {Pil} ::msgcat::mcset da {Astronomy} ::msgcat::mcset da {At Startup} ::msgcat::mcset da {At least 2 different catalogs are required} ::msgcat::mcset da {Auto Centroid} {Automatisk centroide} ::msgcat::mcset da {Auto Plot 2D} ::msgcat::mcset da {Auto Plot 3D} ::msgcat::mcset da {Auto Plot Statistics} ::msgcat::mcset da {Auto Plot} ::msgcat::mcset da {Autoload FITS Regions} [encoding convertfrom iso8859-1 {Indls automatisk FITS regioner}] ::msgcat::mcset da {Autoload} ::msgcat::mcset da {Automatic} {Automatisk} ::msgcat::mcset da {Average} [encoding convertfrom iso8859-1 {Middelvrdi}] ::msgcat::mcset da {Axes Number} ::msgcat::mcset da {Axes Order} ::msgcat::mcset da {Axes Title} ::msgcat::mcset da {Axes} {Akser} ::msgcat::mcset da {Axis Length} [encoding convertfrom iso8859-1 {Akse lngde}] ::msgcat::mcset da {Axis Numbers} {Akse tal} ::msgcat::mcset da {Axis Title} ::msgcat::mcset da {Axis} {Akser} ::msgcat::mcset da {Azimuth} ::msgcat::mcset da {Background Color} {Baggrunds farve} ::msgcat::mcset da {Background} {Baggrund} ::msgcat::mcset da {Backup} ::msgcat::mcset da {Back} {Tilbage} ::msgcat::mcset da {Bar Plot Tool} ::msgcat::mcset da {Bias} {Bias} ::msgcat::mcset da {Bin 3rd Column} [encoding convertfrom iso8859-1 {Bin 3dje sjle}] ::msgcat::mcset da {Bin Center} {Bin center} ::msgcat::mcset da {Bin Columns} [encoding convertfrom iso8859-1 {Bin sjler}] ::msgcat::mcset da {Bin Filter} {Bin filter} ::msgcat::mcset da {Bin Fit} ::msgcat::mcset da {Bin In} ::msgcat::mcset da {Bin Out} ::msgcat::mcset da {Binning Parameters} {Parameter binning} ::msgcat::mcset da {Bin} {Bin} ::msgcat::mcset da {Black} {Sort} ::msgcat::mcset da {Blank/Inf/NaN Color} {Blank/Inf/NaN farve} ::msgcat::mcset da {Blink Frames} {Blink rammer} ::msgcat::mcset da {Blink Interval} {Blinke interval} ::msgcat::mcset da {Blink} {Blink} ::msgcat::mcset da {Block Fit} ::msgcat::mcset da {Block In} {Bin ind} ::msgcat::mcset da {Block Out} {Bin ud} ::msgcat::mcset da {Block Parameters} ::msgcat::mcset da {Block} {Bin} ::msgcat::mcset da {Blue} [encoding convertfrom iso8859-1 {Bl}] ::msgcat::mcset da {Bold} {Fed} ::msgcat::mcset da {Border} {Kant} ::msgcat::mcset da {Bottom} ::msgcat::mcset da {Box Annulus} {Kasseformet ringform} ::msgcat::mcset da {Box Panda} {Kasseformet panda} ::msgcat::mcset da {BoxCircle} ::msgcat::mcset da {Boxcar} {Kvadratisk kernel} ::msgcat::mcset da {Box} {Kasse} ::msgcat::mcset da {Broadcast} ::msgcat::mcset da {Browser} ::msgcat::mcset da {Browse} ::msgcat::mcset da {Buffer} ::msgcat::mcset da {Buttonbar} ::msgcat::mcset da {Buttons} {Knapper} ::msgcat::mcset da {Bytes} ::msgcat::mcset da {CMYK} ::msgcat::mcset da {Can Delete} [encoding convertfrom iso8859-1 {M slette}] ::msgcat::mcset da {Can Edit} [encoding convertfrom iso8859-1 {M redigere}] ::msgcat::mcset da {Can Move} [encoding convertfrom iso8859-1 {M flytte}] ::msgcat::mcset da {Can Rotate} [encoding convertfrom iso8859-1 {M rotere}] ::msgcat::mcset da {Cancel} {Slet} ::msgcat::mcset da {Cap} ::msgcat::mcset da {Catalog Server} {Katalog server} ::msgcat::mcset da {Catalog Tool} {Katalog funktion} ::msgcat::mcset da {Catalogs} {Kataloger} ::msgcat::mcset da {Catalog} {Katalog} ::msgcat::mcset da {Catrom} ::msgcat::mcset da {Cat} ::msgcat::mcset da {Center Image} {Centrer billedet} ::msgcat::mcset da {Center Non-modal Dialogs} ::msgcat::mcset da {Center} {Centrer} ::msgcat::mcset da {Centroid Parameters} ::msgcat::mcset da {Centroid} {Centroide} ::msgcat::mcset da {Circle} {Cirkel} ::msgcat::mcset da {Clear All} {Fjern alt} ::msgcat::mcset da {Clear Analysis Commands} {Fjern analyse funktioner} ::msgcat::mcset da {Clear Cache} [encoding convertfrom iso8859-1 {Tm cache}] ::msgcat::mcset da {Clear Data} {Fjern data} ::msgcat::mcset da {Clear External Analysis Commands?} [encoding convertfrom iso8859-1 {Ryd ekstern analyse kommandoer?}] ::msgcat::mcset da {Clear Filter} {Fjern filter} ::msgcat::mcset da {Clear Frame} {Ryd ramme} ::msgcat::mcset da {Clear Preferences?} {Nulstil foretrukne?} ::msgcat::mcset da {Clear Preferences} {Nulstil foretrukne} ::msgcat::mcset da {Clear} {Fjern} ::msgcat::mcset da {Click to Center} {Klik for centrering} ::msgcat::mcset da {Close} {Luk} ::msgcat::mcset da {Colorbar Size} ::msgcat::mcset da {Colorbar} {Farvekode} ::msgcat::mcset da {Colormap Parameters} {Farvetabel parametre} ::msgcat::mcset da {Colormap} {Farvetabel} ::msgcat::mcset da {Color} {Farve} ::msgcat::mcset da {Columns} [encoding convertfrom iso8859-1 {Sjler}] ::msgcat::mcset da {Column} [encoding convertfrom iso8859-1 {Sjle}] ::msgcat::mcset da {Command} ::msgcat::mcset da {Compass} {Kompas} ::msgcat::mcset da {Composite Region} ::msgcat::mcset da {Composite} {Sammensat} ::msgcat::mcset da {Compression} {Komprimer} ::msgcat::mcset da {Configure} {Konfigurer} ::msgcat::mcset da {Connect Directly} {Tilslut direkte} ::msgcat::mcset da {Connect SAMP} ::msgcat::mcset da {Connect Using Web Proxy} {Tilslut via web proxy} ::msgcat::mcset da {Connect} ::msgcat::mcset da {Console} {konsol} ::msgcat::mcset da {Contour Parameters} {Kontur parametre} ::msgcat::mcset da {Contours} {Konturer} ::msgcat::mcset da {Contour} {Konturer} ::msgcat::mcset da {Contrast} {Kontrast} ::msgcat::mcset da {Convert to Polygons} {Omdan til poygoner} ::msgcat::mcset da {Coordinate Grid Parameters} {Koordinatnetparametre} ::msgcat::mcset da {Coordinate Grid} {Koordinatnet} ::msgcat::mcset da {Coordinate System} {Koordinat system} ::msgcat::mcset da {Coordinates} {Koordinater} ::msgcat::mcset da {Coordinate} {Koordinat} ::msgcat::mcset da {Copy Contours} {Kopier konturer} ::msgcat::mcset da {Copy to Regions} {kopier til regioner} ::msgcat::mcset da {Copy} {Kopier} ::msgcat::mcset da {Create Movie} ::msgcat::mcset da {Create New Frame on Download} {Dan en ny ramme under hentning} ::msgcat::mcset da {Create} ::msgcat::mcset da {Crop Parameters} ::msgcat::mcset da {Crop} ::msgcat::mcset da {Crosshair Parameters} ::msgcat::mcset da {Crosshair To} [encoding convertfrom iso8859-1 {Trdkors til}] ::msgcat::mcset da {Crosshair} [encoding convertfrom iso8859-1 {Trdkors}] ::msgcat::mcset da {Cross} {Kryds} ::msgcat::mcset da {Cubehelix} ::msgcat::mcset da {Cube} ::msgcat::mcset da {Cubic} ::msgcat::mcset da {Current Frame} {Denne ramme} ::msgcat::mcset da {Current Range} {Dette interval} ::msgcat::mcset da {Current} {Denne} ::msgcat::mcset da {Cursor} ::msgcat::mcset da {Cut} [encoding convertfrom iso8859-1 {Beskr}] ::msgcat::mcset da {Cyan} {Cyan} ::msgcat::mcset da {DPI} ::msgcat::mcset da {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset da {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset da {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset da {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-1 {DS9 har fundet en ldre fil med foretrukne indstillinger, nsker du at opdatere?}] ::msgcat::mcset da {DS9 will complete the initialization process} [encoding convertfrom iso8859-1 {DS9 vil fuldfre initialiserings processen}] ::msgcat::mcset da {Dash} {streg} ::msgcat::mcset da {Data Format} {Dataformat} ::msgcat::mcset da {Dataset Name} ::msgcat::mcset da {Dataset} [encoding convertfrom iso8859-1 {Datast}] ::msgcat::mcset da {Data} ::msgcat::mcset da {Decrease} {Aftag} ::msgcat::mcset da {Default All Files} ::msgcat::mcset da {Default Format} ::msgcat::mcset da {Default Length} ::msgcat::mcset da {Default} {Standard} ::msgcat::mcset da {Degrees} {Grader} ::msgcat::mcset da {Delete All Frames?} {Slet alle rammer?} ::msgcat::mcset da {Delete All Frames} {Slet alle rammer} ::msgcat::mcset da {Delete All Groups?} {Slet alle grupper?} ::msgcat::mcset da {Delete All Groups} {Slet alle grupper} ::msgcat::mcset da {Delete All Regions?} {Slet alle omrder?} ::msgcat::mcset da {Delete All Regions} {Slet alle omrder} ::msgcat::mcset da {Delete All} {Slet alt} ::msgcat::mcset da {Delete Color Tags} ::msgcat::mcset da {Delete Frame} {Slet denne ramme} ::msgcat::mcset da {Delete Group} {Slet gruppe} ::msgcat::mcset da {Delete Selected Regions} [encoding convertfrom iso8859-1 {Slet valgte omrder}] ::msgcat::mcset da {Delete} {Slet} ::msgcat::mcset da {Depth} {Dybde} ::msgcat::mcset da {Detector} {Detektor} ::msgcat::mcset da {Dialog Box} {Dialog vindue} ::msgcat::mcset da {Diamond} {Ruder} ::msgcat::mcset da {Dimension} {Dimension} ::msgcat::mcset da {Direction} ::msgcat::mcset da {Disconnect} ::msgcat::mcset da {Display Header} ::msgcat::mcset da {Display Size} [encoding convertfrom iso8859-1 {Vis strrelse}] ::msgcat::mcset da {Dissolve} [encoding convertfrom iso8859-1 {Opls}] ::msgcat::mcset da {Distance} ::msgcat::mcset da {Download Colormap} ::msgcat::mcset da {Download VOTABLE format if available} ::msgcat::mcset da {Drag to Center} [encoding convertfrom iso8859-1 {Trk til center}] ::msgcat::mcset da {Duplicate Data} ::msgcat::mcset da {East} [encoding convertfrom iso8859-1 {st}] ::msgcat::mcset da {Ecliptic} {Ekliptisk} ::msgcat::mcset da {Edit Group Name} {Rediger gruppe navn} ::msgcat::mcset da {Edit} {Rediger} ::msgcat::mcset da {Elevation} {Stigning} ::msgcat::mcset da {Ellipse Annulus} ::msgcat::mcset da {Ellipse Panda} {Ellipse Panda} ::msgcat::mcset da {Ellipse} {Ellipse} ::msgcat::mcset da {Elliptical Annulus} {Elliptisk ringform} ::msgcat::mcset da {Elliptical Panda} {Elliptisk pandaform} ::msgcat::mcset da {Enable Confirmation Dialogs} [encoding convertfrom iso8859-1 {Aktiver bekrftelsesdialoger}] ::msgcat::mcset da {Enable} ::msgcat::mcset da {End} {Afslut} ::msgcat::mcset da {Enter Color} {Angiv farve} ::msgcat::mcset da {Enter Font Size} ::msgcat::mcset da {Enter Group Name} {Indtast gruppenavn} ::msgcat::mcset da {Enter Search Expression} [encoding convertfrom iso8859-1 {Angiv sgeudtryk}] ::msgcat::mcset da {Enter URL} ::msgcat::mcset da {Entry} ::msgcat::mcset da {Equal Area} {Samme areal} ::msgcat::mcset da {Equal Distance} {Samme afstand} ::msgcat::mcset da {Equal Spacing} ::msgcat::mcset da {Equal Value} ::msgcat::mcset da {Error code was returned} {Fejlkode blev returneret} ::msgcat::mcset da {Error} {Fejl} ::msgcat::mcset da {Examine Frame} [encoding convertfrom iso8859-1 {Undersg ramme}] ::msgcat::mcset da {Examine} [encoding convertfrom iso8859-1 {Undersg}] ::msgcat::mcset da {Exam} ::msgcat::mcset da {Exclude} {Udelad} ::msgcat::mcset da {Executing TCL code is not enabled} ::msgcat::mcset da {Exit} {Luk} ::msgcat::mcset da {Export Array} ::msgcat::mcset da {Export} ::msgcat::mcset da {Extention} ::msgcat::mcset da {Exterior Axes} {Udvendige akser} ::msgcat::mcset da {Exterior Numerics} {Udvendige tal} ::msgcat::mcset da {FAQ} [encoding convertfrom iso8859-1 {Ofte Stillede Sprgsml}] ::msgcat::mcset da {FK4} ::msgcat::mcset da {FK5} ::msgcat::mcset da {Factor} ::msgcat::mcset da {File not Found or Unable to load FITS data MIME type} [encoding convertfrom iso8859-1 {Filen blev ikke fundet, eller det var ikke muligt at bne FITS data MIME filtype}] ::msgcat::mcset da {Filename} {Filnavn} ::msgcat::mcset da {File} {Fil} ::msgcat::mcset da {Fill} ::msgcat::mcset da {Filter} {Filter} ::msgcat::mcset da {Find Next} [encoding convertfrom iso8859-1 {Find nste}] ::msgcat::mcset da {Find} {Find} ::msgcat::mcset da {First Frame} [encoding convertfrom iso8859-1 {Frste ramme}] ::msgcat::mcset da {First} [encoding convertfrom iso8859-1 {Frste}] ::msgcat::mcset da {Fits} ::msgcat::mcset da {Fixed in Size} [encoding convertfrom iso8859-1 {Fastlst strrelse}] ::msgcat::mcset da {Flat} ::msgcat::mcset da {Flip} ::msgcat::mcset da {Font} {Skrifttype} ::msgcat::mcset da {For more information, use --help} ::msgcat::mcset da {Format} {Format} ::msgcat::mcset da {Forward} {Videre} ::msgcat::mcset da {Found} {Fundet} ::msgcat::mcset da {Frame Information} {Information for ramme} ::msgcat::mcset da {Frame Parameters} ::msgcat::mcset da {Frames} ::msgcat::mcset da {Frame} {Ramme} ::msgcat::mcset da {From} ::msgcat::mcset da {Front} {Foran} ::msgcat::mcset da {Full Range} {Hele intervallet} ::msgcat::mcset da {Function} {Funktion} ::msgcat::mcset da {GUI Font} ::msgcat::mcset da {Galactic} {Galaktisk} ::msgcat::mcset da {Gap} ::msgcat::mcset da {Gaussian} {Gaussisk} ::msgcat::mcset da {General} {Generel} ::msgcat::mcset da {Generate} {Opret} ::msgcat::mcset da {Generating Regions} [encoding convertfrom iso8859-1 {danner omrder}] ::msgcat::mcset da {Get Information} {Hent information} ::msgcat::mcset da {Gist} ::msgcat::mcset da {Global Properties} ::msgcat::mcset da {Global} {Global} ::msgcat::mcset da {Goto Frame} [encoding convertfrom iso8859-1 {G til ramme}] ::msgcat::mcset da {Graph Horz} {vandret graf} ::msgcat::mcset da {Graph Vert} {lodret graf} ::msgcat::mcset da {Graphics} {Grafisk} ::msgcat::mcset da {Graphs} ::msgcat::mcset da {Graph} {graf} ::msgcat::mcset da {Grayscale} [encoding convertfrom iso8859-1 {Grskala}] ::msgcat::mcset da {Green} [encoding convertfrom iso8859-1 {Grn}] ::msgcat::mcset da {Grid Gap} {Mellemrum i nettet} ::msgcat::mcset da {Grid} {Net} ::msgcat::mcset da {Groove} ::msgcat::mcset da {Groups} {Gupper} ::msgcat::mcset da {HTTP} {HTTP} ::msgcat::mcset da {Header} {Hovede} ::msgcat::mcset da {Height} [encoding convertfrom iso8859-1 {Hjde}] ::msgcat::mcset da {Help Desk} [encoding convertfrom iso8859-1 {Hjlp}] ::msgcat::mcset da {Help Me Choose} [encoding convertfrom iso8859-1 {Hjlp mig at vlge}] ::msgcat::mcset da {Help} [encoding convertfrom iso8859-1 {Hjlp}] ::msgcat::mcset da {Hide All} {Gem alle} ::msgcat::mcset da {Highlite} ::msgcat::mcset da {High} [encoding convertfrom iso8859-1 {Hj}] ::msgcat::mcset da {Histogram Equalization} {Histogram udligning} ::msgcat::mcset da {Histogram} {Histogram} ::msgcat::mcset da {Horizontal Graph} {Vandret graf} ::msgcat::mcset da {Horizontal Layout} {Vandret layout} ::msgcat::mcset da {Horizontal} ::msgcat::mcset da {IAU Location Code} ::msgcat::mcset da {ICRS} ::msgcat::mcset da {Identification} {Identifikation} ::msgcat::mcset da {If} {Hvis} ::msgcat::mcset da {Image Servers} {Billed servere} ::msgcat::mcset da {Image} {Billed} ::msgcat::mcset da {Import Array} ::msgcat::mcset da {Import} ::msgcat::mcset da {Include} {Inkluder} ::msgcat::mcset da {Increase} [encoding convertfrom iso8859-1 {Forg}] ::msgcat::mcset da {Information Panel} {Informations panel} ::msgcat::mcset da {Information} {Information} ::msgcat::mcset da {Initialize XPA} {Initialiser XPA} ::msgcat::mcset da {Inner} {Indre} ::msgcat::mcset da {Instrument FOV} {Instrument FOV} ::msgcat::mcset da {Interior Axes} {Indre akser} ::msgcat::mcset da {Interior Numerics} {Indre tal} ::msgcat::mcset da {Internal Parse Error} ::msgcat::mcset da {Interval} {Interval} ::msgcat::mcset da {Invalid Column Name} ::msgcat::mcset da {Invalid formated multipart/mixed mime type message} {Forkert formatteret opdelt eller blandet mime type meddelelse} ::msgcat::mcset da {Invert Colormap} {Vend farvetabel} ::msgcat::mcset da {Invert Selection} {Inverter valg} ::msgcat::mcset da {Invert} {Inverter} ::msgcat::mcset da {Italic} {Kursiv} ::msgcat::mcset da {Items Found} {Emner fundet} ::msgcat::mcset da {Iteration} ::msgcat::mcset da {JPEG Quality Factor} {JPEG kvalitetsfaktor} ::msgcat::mcset da {Keep-Alive} ::msgcat::mcset da {Kernel} ::msgcat::mcset da {Keyboard Shortcuts} {Tastatur genveje} ::msgcat::mcset da {Keyboard} {Tastatur} ::msgcat::mcset da {Keyword} ::msgcat::mcset da {Labels} {Etiketter} ::msgcat::mcset da {Label} {Etikette} ::msgcat::mcset da {Landscape} {Landskab} ::msgcat::mcset da {Language} {Sprog} ::msgcat::mcset da {Last Frame} {Sidste ramme} ::msgcat::mcset da {Last} {Sidste} ::msgcat::mcset da {Layout Horz} ::msgcat::mcset da {Layout Vert} ::msgcat::mcset da {Layout} ::msgcat::mcset da {Left} ::msgcat::mcset da {Legal} ::msgcat::mcset da {Legend Title} ::msgcat::mcset da {Legend} ::msgcat::mcset da {Length} [encoding convertfrom iso8859-1 {Lngde}] ::msgcat::mcset da {Letter} ::msgcat::mcset da {Levels} {Niveauer} ::msgcat::mcset da {Level} {Niveau} ::msgcat::mcset da {Limits} [encoding convertfrom iso8859-1 {Grnser}] ::msgcat::mcset da {Line Plot Tool} ::msgcat::mcset da {Linear} [encoding convertfrom iso8859-1 {Liner}] ::msgcat::mcset da {Line} {Linie} ::msgcat::mcset da {List Data} ::msgcat::mcset da {List Regions} [encoding convertfrom iso8859-1 {Vis omrder}] ::msgcat::mcset da {List} {Liste} ::msgcat::mcset da {Load Analysis Commands} [encoding convertfrom iso8859-1 {Indls analyse funktioner}] ::msgcat::mcset da {Load Color Tags} ::msgcat::mcset da {Load Colormap} [encoding convertfrom iso8859-1 {Indls farvekort}] ::msgcat::mcset da {Load Configuration} [encoding convertfrom iso8859-1 {Indls konfiguration}] ::msgcat::mcset da {Load Contour Levels} [encoding convertfrom iso8859-1 {Indls konturniveauer}] ::msgcat::mcset da {Load Contours} [encoding convertfrom iso8859-1 {indls konturer}] ::msgcat::mcset da {Load Contrast/Bias} [encoding convertfrom iso8859-1 {Indls kontrast/bias}] ::msgcat::mcset da {Load Data} [encoding convertfrom iso8859-1 {Indls data}] ::msgcat::mcset da {Load Mosaic} [encoding convertfrom iso8859-1 {Indls mosaik}] ::msgcat::mcset da {Load Regions} [encoding convertfrom iso8859-1 {Indls omrder}] ::msgcat::mcset da {Load Template} [encoding convertfrom iso8859-1 {Indls skabelon}] ::msgcat::mcset da {Load into All Frames} ::msgcat::mcset da {Load into Current Frame} ::msgcat::mcset da {Loading Catalog} ::msgcat::mcset da {Loading} ::msgcat::mcset da {Load} [encoding convertfrom iso8859-1 {Indls}] ::msgcat::mcset da {Local} {Lokal} ::msgcat::mcset da {Lock Axes} ::msgcat::mcset da {Lock Bin} ::msgcat::mcset da {Lock Color} ::msgcat::mcset da {Lock Crop Amplifier} ::msgcat::mcset da {Lock Crop Detector} ::msgcat::mcset da {Lock Crop Image} ::msgcat::mcset da {Lock Crop None} ::msgcat::mcset da {Lock Crop Physical} ::msgcat::mcset da {Lock Crop WCS} ::msgcat::mcset da {Lock Crosshair Amplifier} ::msgcat::mcset da {Lock Crosshair Detector} ::msgcat::mcset da {Lock Crosshair Image} ::msgcat::mcset da {Lock Crosshair None} ::msgcat::mcset da {Lock Crosshair Physical} ::msgcat::mcset da {Lock Crosshair WCS} ::msgcat::mcset da {Lock Frame Amplifier} ::msgcat::mcset da {Lock Frame Detector} ::msgcat::mcset da {Lock Frame Image} ::msgcat::mcset da {Lock Frame None} ::msgcat::mcset da {Lock Frame Physical} ::msgcat::mcset da {Lock Frame WCS} ::msgcat::mcset da {Lock Limits} ::msgcat::mcset da {Lock Scale} ::msgcat::mcset da {Lock Slice Image} ::msgcat::mcset da {Lock Slice None} ::msgcat::mcset da {Lock Slice WCS} ::msgcat::mcset da {Lock Smooth} ::msgcat::mcset da {Lock} [encoding convertfrom iso8859-1 {Ls}] ::msgcat::mcset da {Log Exponent} ::msgcat::mcset da {Log} ::msgcat::mcset da {Low High} [encoding convertfrom iso8859-1 {Lav hj}] ::msgcat::mcset da {Lower Left Back} ::msgcat::mcset da {Lower Left Front} ::msgcat::mcset da {Lower Right Back} ::msgcat::mcset da {Lower Right Front} ::msgcat::mcset da {Low} {lav} ::msgcat::mcset da {MIP} ::msgcat::mcset da {Magenta} ::msgcat::mcset da {Magnification} ::msgcat::mcset da {Magnifier} [encoding convertfrom iso8859-1 {Forstrrelse}] ::msgcat::mcset da {Major} ::msgcat::mcset da {Manual} ::msgcat::mcset da {Mask Parameters} {Maske parametre} ::msgcat::mcset da {Match Axes} ::msgcat::mcset da {Match Bin} ::msgcat::mcset da {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset da {Match Color} ::msgcat::mcset da {Match Crop Amplifier} ::msgcat::mcset da {Match Crop Detector} ::msgcat::mcset da {Match Crop Image} ::msgcat::mcset da {Match Crop Physical} ::msgcat::mcset da {Match Crop WCS} ::msgcat::mcset da {Match Crosshair Amplifier} ::msgcat::mcset da {Match Crosshair Detector} ::msgcat::mcset da {Match Crosshair Image} ::msgcat::mcset da {Match Crosshair Physical} ::msgcat::mcset da {Match Crosshair WCS} ::msgcat::mcset da {Match Frame Amplifier} ::msgcat::mcset da {Match Frame Detector} ::msgcat::mcset da {Match Frame Image} ::msgcat::mcset da {Match Frame Physical} ::msgcat::mcset da {Match Frame WCS} ::msgcat::mcset da {Match Limits} ::msgcat::mcset da {Match Scale} ::msgcat::mcset da {Match Slice Image} ::msgcat::mcset da {Match Slice WCS} ::msgcat::mcset da {Match Smooth} ::msgcat::mcset da {Match} ::msgcat::mcset da {Math Function} {Matematisk funktion} ::msgcat::mcset da {Matplotlib} ::msgcat::mcset da {Max Rows} {Maks antal rkker} ::msgcat::mcset da {Max} {Maks} ::msgcat::mcset da {Menus and Buttons} ::msgcat::mcset da {Menu} ::msgcat::mcset da {Message Log} ::msgcat::mcset da {Method} {Metode} ::msgcat::mcset da {Min Max Parameters} {Min Max parametre} ::msgcat::mcset da {Min Max} {Min Maks} ::msgcat::mcset da {Minor} ::msgcat::mcset da {Minutes} ::msgcat::mcset da {Min} ::msgcat::mcset da {Mission} ::msgcat::mcset da {Mode} ::msgcat::mcset da {Mosaic IRAF Segment} ::msgcat::mcset da {Mosaic IRAF} ::msgcat::mcset da {Mosaic WCS Segment} ::msgcat::mcset da {Mosaic WCS} ::msgcat::mcset da {Mosaic WFPC2} ::msgcat::mcset da {Mosaic} ::msgcat::mcset da {Mouse Click Epsilon} ::msgcat::mcset da {Mouse Wheel Bin} ::msgcat::mcset da {Mouse Wheel Zoom} ::msgcat::mcset da {Mouse and Keyboard} ::msgcat::mcset da {Move Back} {flyt tilbage} ::msgcat::mcset da {Move First} {flyt forrest} ::msgcat::mcset da {Move Forward} {flyt frem} ::msgcat::mcset da {Move Frame} ::msgcat::mcset da {Move Last} {flyt sidst} ::msgcat::mcset da {Move to Back} {Bag} ::msgcat::mcset da {Move to Front} {Foran} ::msgcat::mcset da {Movie} ::msgcat::mcset da {Multiple Extension Cube} ::msgcat::mcset da {Multiple Extension Frames} ::msgcat::mcset da {Multiple WCS} {Multipel WCS} ::msgcat::mcset da {NRRD} ::msgcat::mcset da {Name Resolution} [encoding convertfrom iso8859-1 {Navnesgning}] ::msgcat::mcset da {Name Server} {Navneserver} ::msgcat::mcset da {Name or Designation} {navn eller beskrivelse} ::msgcat::mcset da {Name} ::msgcat::mcset da {Native Dialog} {Oprindelig dialog} ::msgcat::mcset da {New Features} {Nye egenskaber} ::msgcat::mcset da {New Frame 3D} {Ny ramme 3D} ::msgcat::mcset da {New Frame RGB} {Ny ramme (RGB)} ::msgcat::mcset da {New Frame each Time} {Ny ramme hver gang} ::msgcat::mcset da {New Frame} {Ny ramme} ::msgcat::mcset da {New Group} {Ny gruppe} ::msgcat::mcset da {New} {Ny} ::msgcat::mcset da {Next Frame} [encoding convertfrom iso8859-1 {Nste ramme}] ::msgcat::mcset da {Next} [encoding convertfrom iso8859-1 {Nste}] ::msgcat::mcset da {No Catalog specified} {Intet katalog er specificeret} ::msgcat::mcset da {No Items Found} {Ingen emner er fundet} ::msgcat::mcset da {No current frame} ::msgcat::mcset da {No data available at } {Ingen data tilgngelige ved } ::msgcat::mcset da {Non-zero} {ikke-nul} ::msgcat::mcset da {None} [encoding convertfrom iso8859-1 {Ingen}] ::msgcat::mcset da {Normal} {Normal} ::msgcat::mcset da {North} {Nord} ::msgcat::mcset da {Not Found} ::msgcat::mcset da {Number of Samples} {Antal} ::msgcat::mcset da {Number of Threads} ::msgcat::mcset da {Number of Ticks} ::msgcat::mcset da {Number} {Antal} ::msgcat::mcset da {Numerics} {Talvrdier} ::msgcat::mcset da {OK} ::msgcat::mcset da {Object} {Objekt} ::msgcat::mcset da {Open File} {ben fil} ::msgcat::mcset da {Open TCL Console} [encoding convertfrom iso8859-1 {ben TCL konsol}] ::msgcat::mcset da {Open URL} [encoding convertfrom iso8859-1 {ben URL}] ::msgcat::mcset da {Open as} ::msgcat::mcset da {Open} [encoding convertfrom iso8859-1 {ben}] ::msgcat::mcset da {Operator} ::msgcat::mcset da {Orientation} {Orientering} ::msgcat::mcset da {Origin} ::msgcat::mcset da {Oscillate} ::msgcat::mcset da {Other Color} ::msgcat::mcset da {Other Font Size} ::msgcat::mcset da {Other} {Anden} ::msgcat::mcset da {Outer} {Ydre} ::msgcat::mcset da {Overlap} ::msgcat::mcset da {PS Page Setup} {PS side opstning} ::msgcat::mcset da {PS Print} {PS udskrift} ::msgcat::mcset da {Page Setup} [encoding convertfrom iso8859-1 {Side opstning}] ::msgcat::mcset da {Page Source} {Side kilde} ::msgcat::mcset da {Pan To} {Flyt til} ::msgcat::mcset da {Pan Zoom Rotate Parameters} [encoding convertfrom iso8859-1 {Flyt Zoom Rotr parametre}] ::msgcat::mcset da {Pan Zoom} {Flyt Zoom} ::msgcat::mcset da {Pan then Zoom} {Flyt og derefter zoom} ::msgcat::mcset da {Panda} ::msgcat::mcset da {Panner} {Oversigtskort} ::msgcat::mcset da {Pan} {Flyt} ::msgcat::mcset da {Parameters} {Parametre} ::msgcat::mcset da {Password} {Kodeord} ::msgcat::mcset da {Paste Contours} {Indst konturer} ::msgcat::mcset da {Paste} [encoding convertfrom iso8859-1 {St ind}] ::msgcat::mcset da {Physical} {Fysisk} ::msgcat::mcset da {Pixel Distribution} {Pixelfordeling} ::msgcat::mcset da {Pixel Size} [encoding convertfrom iso8859-1 {Pixelstrrelse}] ::msgcat::mcset da {Pixel Table} {Pixel tabel} ::msgcat::mcset da {Pixels} {Pixler} ::msgcat::mcset da {Play} {Afspil} ::msgcat::mcset da {Please Select a Region} ::msgcat::mcset da {Please specify width, height, and either name or (ra,dec)} [encoding convertfrom iso8859-1 {angiv venligst bredde, hjde, og enten navn eller (ra,dec)}] ::msgcat::mcset da {Plot 2D} ::msgcat::mcset da {Plot 3D} ::msgcat::mcset da {Plot Title} {Plot titel} ::msgcat::mcset da {Plotting Regions} [encoding convertfrom iso8859-1 {Plotte omrder}] ::msgcat::mcset da {Plot} ::msgcat::mcset da {Plus} ::msgcat::mcset da {Pointer} {Pegepil} ::msgcat::mcset da {Points} {Punkter} ::msgcat::mcset da {Point} {Punkt} ::msgcat::mcset da {Polygon} {Polygon} ::msgcat::mcset da {Portrait} [encoding convertfrom iso8859-1 {Portrt}] ::msgcat::mcset da {Poster} {Plakat} ::msgcat::mcset da {Postscript Page Setup} [encoding convertfrom iso8859-1 {Postscript side opstning}] ::msgcat::mcset da {Postscript Print} {Postscript udskriv} ::msgcat::mcset da {Postscript} ::msgcat::mcset da {Power} {Potenslov} ::msgcat::mcset da {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} [encoding convertfrom iso8859-1 {Foretrukne er sat til standardvrdier. Start ds9 igen for at f ndringerne implementeret}] ::msgcat::mcset da {Preferences} {Foretrukne} ::msgcat::mcset da {Preserve During Load} [encoding convertfrom iso8859-1 {Bevar under indlsning}] ::msgcat::mcset da {Previous Frame} [encoding convertfrom iso8859-1 {Foregende ramme}] ::msgcat::mcset da {Previous} [encoding convertfrom iso8859-1 {Foregende}] ::msgcat::mcset da {Prev} ::msgcat::mcset da {Print Coordinates} {Udskriv koordinater} ::msgcat::mcset da {Print To} {Udskriv til} ::msgcat::mcset da {Printer} {Printer} ::msgcat::mcset da {Print} {Udskriv} ::msgcat::mcset da {Projection} {Projektion} ::msgcat::mcset da {Properties} {Egenskaber} ::msgcat::mcset da {Property} {Egenskab} ::msgcat::mcset da {Proxy Host} ::msgcat::mcset da {Proxy Port} ::msgcat::mcset da {Publication} {Publikation} ::msgcat::mcset da {Quadratic} {Kvadratisk} ::msgcat::mcset da {RGB Array} ::msgcat::mcset da {RGB Cube} ::msgcat::mcset da {RGB Image} ::msgcat::mcset da {RGB} ::msgcat::mcset da {Radial Profile} ::msgcat::mcset da {Radial} ::msgcat::mcset da {Radius} ::msgcat::mcset da {Raised} ::msgcat::mcset da {Range} ::msgcat::mcset da {Redo} {Gentag sidste} ::msgcat::mcset da {Red} [encoding convertfrom iso8859-1 {Rd}] ::msgcat::mcset da {Reference Manual} ::msgcat::mcset da {Reference} ::msgcat::mcset da {Refresh Frame} {Opdater ramme} ::msgcat::mcset da {Refresh} {Opdater} ::msgcat::mcset da {Region Parameters} ::msgcat::mcset da {Region} [encoding convertfrom iso8859-1 {Omrde}] ::msgcat::mcset da {Release Notes} {Frigvelsesnoter} ::msgcat::mcset da {Release} {Frigivelsesnoter} ::msgcat::mcset da {Relief} ::msgcat::mcset da {Reload} {Genhent} ::msgcat::mcset da {Render} ::msgcat::mcset da {Repeat} ::msgcat::mcset da {Reset Colormap} {Nulstil farvetabel} ::msgcat::mcset da {Reset Frame} {Nulstil ramme} ::msgcat::mcset da {Reset} {Nulstil} ::msgcat::mcset da {Restore} ::msgcat::mcset da {Retrieve} {Hent} ::msgcat::mcset da {Return} ::msgcat::mcset da {Right} ::msgcat::mcset da {Roman} ::msgcat::mcset da {Rotate} {Roter} ::msgcat::mcset da {Rows} [encoding convertfrom iso8859-1 {Rkker}] ::msgcat::mcset da {Row} ::msgcat::mcset da {Ruler} {Lineal} ::msgcat::mcset da {SAMP Image} ::msgcat::mcset da {SAMP Table} ::msgcat::mcset da {SAMP: already connected} ::msgcat::mcset da {SAMP: internal error} ::msgcat::mcset da {SAMP: not connected} ::msgcat::mcset da {SAMP: unable to locate HUB} ::msgcat::mcset da {SAMP} ::msgcat::mcset da {Sample Increment} {Udvalgs stigning} ::msgcat::mcset da {Sample Parameters} {Udvalgs parametre} ::msgcat::mcset da {Samples per Line} {Udvalg per linie} ::msgcat::mcset da {Sample} {Udvalg} ::msgcat::mcset da {Save 3D Movie} ::msgcat::mcset da {Save Color Tags} ::msgcat::mcset da {Save Colormap} {gem farvekort} ::msgcat::mcset da {Save Configuration} {Gem konfiguration} ::msgcat::mcset da {Save Contour Levels} {Gem konturniveauer} ::msgcat::mcset da {Save Contours} {Gem konturer} ::msgcat::mcset da {Save Contrast/Bias} {Gem kontrast/bias} ::msgcat::mcset da {Save Data} {Gem data} ::msgcat::mcset da {Save Image on Download} ::msgcat::mcset da {Save Image} {Gem billede} ::msgcat::mcset da {Save Regions} [encoding convertfrom iso8859-1 {Gem omrder}] ::msgcat::mcset da {Save Template} {Gem skabelon} ::msgcat::mcset da {Save as} ::msgcat::mcset da {Save} {Gem} ::msgcat::mcset da {Scale Parameters} {Skala parametre} ::msgcat::mcset da {Scale and Limits} ::msgcat::mcset da {Scale} {Skala} ::msgcat::mcset da {Scan} {skan} ::msgcat::mcset da {Scatter Plot Tool} ::msgcat::mcset da {Scope} [encoding convertfrom iso8859-1 {Gldende}] ::msgcat::mcset da {Search for Catalogs} [encoding convertfrom iso8859-1 {sg efter kataloger}] ::msgcat::mcset da {Searching for catalogs} [encoding convertfrom iso8859-1 {sger efter kataloger}] ::msgcat::mcset da {Seconds} {Sekunder} ::msgcat::mcset da {Segment} ::msgcat::mcset da {Select All} [encoding convertfrom iso8859-1 {Vlg alle}] ::msgcat::mcset da {Select Coordinate System } [encoding convertfrom iso8859-1 {vlg koordinat system}] ::msgcat::mcset da {Select None} [encoding convertfrom iso8859-1 {Vlg ingen}] ::msgcat::mcset da {Select} ::msgcat::mcset da {Send} ::msgcat::mcset da {Server} {Server} ::msgcat::mcset da {Sexagesimal} ::msgcat::mcset da {Shape} {Form} ::msgcat::mcset da {Show All} {Vis alle} ::msgcat::mcset da {Show Command} ::msgcat::mcset da {Show Compass} ::msgcat::mcset da {Show Text} {Vis tekst} ::msgcat::mcset da {Show/Hide Frames} {Vis/skjul rammer} ::msgcat::mcset da {Show} {Vis} ::msgcat::mcset da {Simple Cross} ::msgcat::mcset da {Simple Plus} ::msgcat::mcset da {Single Frame} {Enkel ramme} ::msgcat::mcset da {Single} {Enkel} ::msgcat::mcset da {Sites} ::msgcat::mcset da {Size/Radius} [encoding convertfrom iso8859-1 {Strrelse/Radius}] ::msgcat::mcset da {Size} {Strrelse} ::msgcat::mcset da {Skip First} [encoding convertfrom iso8859-1 {Overspring frste}] ::msgcat::mcset da {Slice} ::msgcat::mcset da {Smooth Parameters} {Udglatningsparametre} ::msgcat::mcset da {Smoothness} ::msgcat::mcset da {Smooth} {Udglat} ::msgcat::mcset da {Solid} ::msgcat::mcset da {Sorry, DS9 does not support} [encoding convertfrom iso8859-1 {DS9 understtter ikke}] ::msgcat::mcset da {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset da {Sort} {Sorter} ::msgcat::mcset da {Source TCL} {Kilde TCL} ::msgcat::mcset da {Source} {Kilde} ::msgcat::mcset da {Space Equal Distance} ::msgcat::mcset da {Space Equal Value} ::msgcat::mcset da {Spacing} {Mellemrum} ::msgcat::mcset da {Sqrt} ::msgcat::mcset da {Square Root} {Kvadratrod} ::msgcat::mcset da {Squared} {Kvadratisk} ::msgcat::mcset da {Square} ::msgcat::mcset da {Stacked} ::msgcat::mcset da {Starbase} ::msgcat::mcset da {Startup} ::msgcat::mcset da {Start} ::msgcat::mcset da {Statistics} ::msgcat::mcset da {Stats} ::msgcat::mcset da {Status} ::msgcat::mcset da {Step} {Trin} ::msgcat::mcset da {Stop} ::msgcat::mcset da {Story of SAOImage DS9} ::msgcat::mcset da {Story} ::msgcat::mcset da {Sum} ::msgcat::mcset da {Sunken} ::msgcat::mcset da {Symbol Editor} ::msgcat::mcset da {Symbol} ::msgcat::mcset da {Tab-Separated-Value} ::msgcat::mcset da {Table} ::msgcat::mcset da {Tabloid} ::msgcat::mcset da {Task} ::msgcat::mcset da {Template} ::msgcat::mcset da {Text Font} ::msgcat::mcset da {Text} {Tekst} ::msgcat::mcset da {Then} [encoding convertfrom iso8859-1 {S}] ::msgcat::mcset da {Thickness} {Tykkelse} ::msgcat::mcset da {This analysis task is already running. Do you wish to kill it?} {Denne analyseopgave krer allerede - skal den stoppes?} ::msgcat::mcset da {This function is not currently supported for this port.} ::msgcat::mcset da {Tickmarks} {Afmrkninger} ::msgcat::mcset da {Tile Frames} {Mosaik rammer} ::msgcat::mcset da {Tile Parameters} {Mosaik parametre} ::msgcat::mcset da {Tile} {Mosaik} ::msgcat::mcset da {Times} ::msgcat::mcset da {Title} {Titel} ::msgcat::mcset da {Tophat} ::msgcat::mcset da {Topographic} ::msgcat::mcset da {Top} ::msgcat::mcset da {To} {Til} ::msgcat::mcset da {Transparency} ::msgcat::mcset da {Triangle} ::msgcat::mcset da {Type} ::msgcat::mcset da {URL} ::msgcat::mcset da {Unable to connect directly: using Web Proxy} ::msgcat::mcset da {Unable to determine date of observation} ::msgcat::mcset da {Unable to determine time of observation} ::msgcat::mcset da {Unable to evaluate filter} {kan ikke bestemme filter} ::msgcat::mcset da {Unable to find catalog window} {Kan ikke finde katalog vinduet} ::msgcat::mcset da {Unable to find plot window} {kan ikke finde plotte vinduet} ::msgcat::mcset da {Unable to load RGB image into a non-rgb frame} {Kan ikke hente et RGB billede ind i en ikke-RGB ramme} ::msgcat::mcset da {Unable to load region file} ::msgcat::mcset da {Unable to load} {Kan ikke hente} ::msgcat::mcset da {Unable to locate URL} {Kan ikke finde URL} ::msgcat::mcset da {Unable to match target with XPA Mime request} ::msgcat::mcset da {Unable to open file} [encoding convertfrom iso8859-1 {Kan ikke bne fil}] ::msgcat::mcset da {Unable to process Analysis file} ::msgcat::mcset da {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset da {Undo} {Fortryd} ::msgcat::mcset da {Unique} ::msgcat::mcset da {Unists} ::msgcat::mcset da {Units} {Enheder} ::msgcat::mcset da {Unknown Colormap} ::msgcat::mcset da {Unknown command} ::msgcat::mcset da {Update Filter} ::msgcat::mcset da {Update Group} {Opdater gruppe} ::msgcat::mcset da {Update from Current Crosshair} [encoding convertfrom iso8859-1 {Opdater fra nuvrende trdkors}] ::msgcat::mcset da {Update from Current Frame} [encoding convertfrom iso8859-1 {Opdater fra nuvrende ramme}] ::msgcat::mcset da {Update} {Opdater} ::msgcat::mcset da {Upper Left Back} ::msgcat::mcset da {Upper Left Front} ::msgcat::mcset da {Upper Right Back} ::msgcat::mcset da {Upper Right Front} ::msgcat::mcset da {Use Authentication} [encoding convertfrom iso8859-1 {Anvend bekrftelse}] ::msgcat::mcset da {Use Current Frame on Download} {Brug nuvrende ramme til download} ::msgcat::mcset da {Use Internal Web Browser} {Brug intern web browser} ::msgcat::mcset da {Use Proxy} {Anvend proxy} ::msgcat::mcset da {User Manual} ::msgcat::mcset da {Username} {Brugernavn} ::msgcat::mcset da {User} {Brugerdefineret} ::msgcat::mcset da {Use} {Anvend} ::msgcat::mcset da {VO Server} ::msgcat::mcset da {VO} ::msgcat::mcset da {Value} [encoding convertfrom iso8859-1 {Vrdi}] ::msgcat::mcset da {Vector} {Vektor} ::msgcat::mcset da {Vertical Graph} {Lodret graf} ::msgcat::mcset da {Vertical Layout} {Lodret layoyt} ::msgcat::mcset da {Vertical Text} {Lodret tekst} ::msgcat::mcset da {Vertical} ::msgcat::mcset da {View} {Vis} ::msgcat::mcset da {Virtual Observatory} {Virtuelt Observatorium} ::msgcat::mcset da {WCS Parameters} ::msgcat::mcset da {WCS} ::msgcat::mcset da {Wavelength} [encoding convertfrom iso8859-1 {Blgelngde}] ::msgcat::mcset da {Web Browser} ::msgcat::mcset da {White} {Hvid} ::msgcat::mcset da {Width} {Bredde} ::msgcat::mcset da {Window} ::msgcat::mcset da {Words matching title, description} {Ord tilpasset titel, beskrivelse } ::msgcat::mcset da {Writing Catalog} ::msgcat::mcset da {X Axis Title} ::msgcat::mcset da {X Grid} ::msgcat::mcset da {XPA Information} {XPA information} ::msgcat::mcset da {XPA not initialized} {XPA ikke startet} ::msgcat::mcset da {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset da {XPA} ::msgcat::mcset da {X} ::msgcat::mcset da {Y Axis Title} ::msgcat::mcset da {Y Grid} ::msgcat::mcset da {Yellow} {Gul} ::msgcat::mcset da {Y} ::msgcat::mcset da {Z Axis Scale} ::msgcat::mcset da {ZScale Parameters} ::msgcat::mcset da {Zero} {Nul} ::msgcat::mcset da {Zoom Fit} ::msgcat::mcset da {Zoom In} {Zoom ind} ::msgcat::mcset da {Zoom Out} {Zoom ud} ::msgcat::mcset da {Zoom} ::msgcat::mcset da {and} ::msgcat::mcset da {blue} ::msgcat::mcset da {b} ::msgcat::mcset da {color} ::msgcat::mcset da {cool} ::msgcat::mcset da {green} ::msgcat::mcset da {grey} [encoding convertfrom iso8859-1 {gr}] ::msgcat::mcset da {g} ::msgcat::mcset da {h5utils} ::msgcat::mcset da {heat} ::msgcat::mcset da {not} ::msgcat::mcset da {only} ::msgcat::mcset da {or center of data} {eller center for data} ::msgcat::mcset da {rainbow} {regnbue} ::msgcat::mcset da {red} ::msgcat::mcset da {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom iso8859-1 {rkker af data er blevet hentet. Der kan vre flere tilgngelige. Du br mske ndre det maksimalt tilladte antal}] ::msgcat::mcset da {r} ::msgcat::mcset da {staircase} {trappe} ::msgcat::mcset da {standard} ::msgcat::mcset da {x} ::msgcat::mcset da {} ��������������������������������������������������������������������������������������������������saods9/ds9/msgs/de.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000116246 12600277755 015161� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset de {2D} ::msgcat::mcset de {3D} ::msgcat::mcset de {A postscript generation error has occurred} {Beim Erstellen von Postscript ist ein Fehler aufgetreten} ::msgcat::mcset de {AIP} ::msgcat::mcset de {Abort} ::msgcat::mcset de {About SAOImage DS9} [encoding convertfrom iso8859-1 {ber SAOImage DS9}] ::msgcat::mcset de {About} [encoding convertfrom iso8859-1 {ber}] ::msgcat::mcset de {Acknowledgment} {Danksagung} ::msgcat::mcset de {Add} [encoding convertfrom iso8859-1 {Hinzufgen}] ::msgcat::mcset de {Advanced} {Erweitert} ::msgcat::mcset de {Aligned} ::msgcat::mcset de {Align} {Ausrichten} ::msgcat::mcset de {All Columns} {Alle spalten} ::msgcat::mcset de {All Rows} {Alle zeilen} ::msgcat::mcset de {All} {Alles} ::msgcat::mcset de {Always save files during Backup} ::msgcat::mcset de {Amplifier} [encoding convertfrom iso8859-1 {Verstrker}] ::msgcat::mcset de {An error has occurred during backup} ::msgcat::mcset de {An error has occurred during restore} ::msgcat::mcset de {An error has occurred invoking the Analysis task} {Beim Aufrufen des Analysetasks ist ein Fehler aufgetreten} ::msgcat::mcset de {An error has occurred while creating image.} ::msgcat::mcset de {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset de {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset de {An error has occurred while printing} {Beim Drucken ist ein Fehler aufgetreten} ::msgcat::mcset de {An error has occurred while reading image.} ::msgcat::mcset de {An error has occurred while saving} {Beim Speichern ist ein Fehler aufgetreten} ::msgcat::mcset de {An error has occurred while updating VO server list} ::msgcat::mcset de {An error has occurred while writing image.} ::msgcat::mcset de {An internal error has been detected} ::msgcat::mcset de {Analysis Command Log} {Analysebefehlslog} ::msgcat::mcset de {Analysis Commands} ::msgcat::mcset de {Analysis File} ::msgcat::mcset de {Analysis Log} ::msgcat::mcset de {Analysis} {Analyse} ::msgcat::mcset de {Angle Complement} {Komplementwinkel} ::msgcat::mcset de {Angles} {Winkel} ::msgcat::mcset de {Angle} {Winkel} ::msgcat::mcset de {Annuli} {Kreisringe} ::msgcat::mcset de {Annulus} {Kreisring} ::msgcat::mcset de {Apply} {Anwenden} ::msgcat::mcset de {ArcMin} {Bogenminute} ::msgcat::mcset de {ArcSec} {Bogensekunde} ::msgcat::mcset de {Architecture} {Architektur} ::msgcat::mcset de {Archives} {Archive} ::msgcat::mcset de {Array} ::msgcat::mcset de {Arrow} {Pfeil} ::msgcat::mcset de {Astronomy} ::msgcat::mcset de {At Startup} ::msgcat::mcset de {At least 2 different catalogs are required} ::msgcat::mcset de {Auto Centroid} ::msgcat::mcset de {Auto Plot 2D} ::msgcat::mcset de {Auto Plot 3D} ::msgcat::mcset de {Auto Plot Statistics} ::msgcat::mcset de {Auto Plot} ::msgcat::mcset de {Autoload FITS Regions} {FITS-Regionen autom. laden} ::msgcat::mcset de {Autoload} ::msgcat::mcset de {Automatic} {Automatisch} ::msgcat::mcset de {Average} {Mitteln} ::msgcat::mcset de {Axes Number} ::msgcat::mcset de {Axes Order} ::msgcat::mcset de {Axes Title} ::msgcat::mcset de {Axes} {Achsen} ::msgcat::mcset de {Axis Length} [encoding convertfrom iso8859-1 {Achsenlnge}] ::msgcat::mcset de {Axis Numbers} {Achsenziffern} ::msgcat::mcset de {Axis Title} ::msgcat::mcset de {Axis} {Achse} ::msgcat::mcset de {Azimuth} ::msgcat::mcset de {Background Color} {Hintergrundfarbe} ::msgcat::mcset de {Background} {Hintergrund} ::msgcat::mcset de {Backup} ::msgcat::mcset de {Back} [encoding convertfrom iso8859-1 {Zurck}] ::msgcat::mcset de {Bar Plot Tool} ::msgcat::mcset de {Bias} ::msgcat::mcset de {Bin 3rd Column} {Bin 3. Spalte} ::msgcat::mcset de {Bin Center} {Bin Zentrum} ::msgcat::mcset de {Bin Columns} {Bin Spalten} ::msgcat::mcset de {Bin Filter} ::msgcat::mcset de {Bin Fit} ::msgcat::mcset de {Bin In} ::msgcat::mcset de {Bin Out} ::msgcat::mcset de {Binning Parameters} {Binparameter} ::msgcat::mcset de {Bin} ::msgcat::mcset de {Black} {Schwarz} ::msgcat::mcset de {Blank/Inf/NaN Color} {Leer/Inf/Nan Farbe} ::msgcat::mcset de {Blink Frames} {Blinkende rahmen} ::msgcat::mcset de {Blink Interval} {Blinkinterval} ::msgcat::mcset de {Blink} {Blinken} ::msgcat::mcset de {Block Fit} ::msgcat::mcset de {Block In} {Bin ein} ::msgcat::mcset de {Block Out} {Bin aus} ::msgcat::mcset de {Block Parameters} ::msgcat::mcset de {Block} {Bin} ::msgcat::mcset de {Blue} {Blau} ::msgcat::mcset de {Bold} {Fett} ::msgcat::mcset de {Border} {Begrenzung} ::msgcat::mcset de {Bottom} ::msgcat::mcset de {Box Annulus} {Viereck ring} ::msgcat::mcset de {Box Panda} {Viereckiger panda} ::msgcat::mcset de {BoxCircle} ::msgcat::mcset de {Boxcar} ::msgcat::mcset de {Box} {Viereck} ::msgcat::mcset de {Broadcast} ::msgcat::mcset de {Browser} ::msgcat::mcset de {Browse} [encoding convertfrom iso8859-1 {Auswhlen}] ::msgcat::mcset de {Buffer} {Puffer} ::msgcat::mcset de {Buttonbar} ::msgcat::mcset de {Buttons} [encoding convertfrom iso8859-1 {Schaltflchen}] ::msgcat::mcset de {Bytes} ::msgcat::mcset de {CMYK} ::msgcat::mcset de {Can Delete} {Kann lschen} ::msgcat::mcset de {Can Edit} {Kann bearbeiten} ::msgcat::mcset de {Can Move} {Kann bewegen} ::msgcat::mcset de {Can Rotate} {Kann rotieren} ::msgcat::mcset de {Cancel} {Abbrechen} ::msgcat::mcset de {Cap} ::msgcat::mcset de {Catalog Server} {Katalogserver} ::msgcat::mcset de {Catalog Tool} {Katalogwerkzeug} ::msgcat::mcset de {Catalogs} {Kataloge} ::msgcat::mcset de {Catalog} {Katalog} ::msgcat::mcset de {Catrom} ::msgcat::mcset de {Cat} ::msgcat::mcset de {Center Image} {Bild zentrieren} ::msgcat::mcset de {Center Non-modal Dialogs} ::msgcat::mcset de {Center} {Mittelpunkt} ::msgcat::mcset de {Centroid Parameters} ::msgcat::mcset de {Centroid} ::msgcat::mcset de {Circle} {Kreis} ::msgcat::mcset de {Clear All} [encoding convertfrom iso8859-1 {Alle lschen}] ::msgcat::mcset de {Clear Analysis Commands} [encoding convertfrom iso8859-1 {Analysebefehle lschen}] ::msgcat::mcset de {Clear Cache} [encoding convertfrom iso8859-1 {Cache lschen}] ::msgcat::mcset de {Clear Data} [encoding convertfrom iso8859-1 {Daten lschen}] ::msgcat::mcset de {Clear External Analysis Commands?} [encoding convertfrom iso8859-1 {Externe Analysebefehle lschen?}] ::msgcat::mcset de {Clear Filter} [encoding convertfrom iso8859-1 {Filter lschen}] ::msgcat::mcset de {Clear Frame} {Rahmen freigeben} ::msgcat::mcset de {Clear Preferences?} [encoding convertfrom iso8859-1 {Voreinstellungen lschen?}] ::msgcat::mcset de {Clear Preferences} [encoding convertfrom iso8859-1 {Voreinstellungen lschen}] ::msgcat::mcset de {Clear} [encoding convertfrom iso8859-1 {Lschen}] ::msgcat::mcset de {Click to Center} {Klicken zum Zentrieren} ::msgcat::mcset de {Close} [encoding convertfrom iso8859-1 {Schlieen}] ::msgcat::mcset de {Colorbar Size} ::msgcat::mcset de {Colorbar} {Farbbalken} ::msgcat::mcset de {Colormap Parameters} {Farbpalettenparameter} ::msgcat::mcset de {Colormap} ::msgcat::mcset de {Color} {Farbe} ::msgcat::mcset de {Columns} {Spalten} ::msgcat::mcset de {Column} {Spalte} ::msgcat::mcset de {Command} ::msgcat::mcset de {Compass} {Kompass} ::msgcat::mcset de {Composite Region} ::msgcat::mcset de {Composite} ::msgcat::mcset de {Compression} {Kompression} ::msgcat::mcset de {Configure} {Konfigurieren} ::msgcat::mcset de {Connect Directly} {Direkt verbinden} ::msgcat::mcset de {Connect SAMP} ::msgcat::mcset de {Connect Using Web Proxy} [encoding convertfrom iso8859-1 {Fr Verbindung Webproxy verwenden}] ::msgcat::mcset de {Connect} ::msgcat::mcset de {Console} ::msgcat::mcset de {Contour Parameters} {Konturenparameter} ::msgcat::mcset de {Contours} {Konturen} ::msgcat::mcset de {Contour} ::msgcat::mcset de {Contrast} {Kontrast} ::msgcat::mcset de {Convert to Polygons} {Zu Polygonen konvertieren} ::msgcat::mcset de {Coordinate Grid Parameters} {Koordinatennetzparameter} ::msgcat::mcset de {Coordinate Grid} {Koordinatennetz} ::msgcat::mcset de {Coordinate System} {Koordinatensystem} ::msgcat::mcset de {Coordinates} ::msgcat::mcset de {Coordinate} {Koordinaten} ::msgcat::mcset de {Copy Contours} {Konturen kopieren} ::msgcat::mcset de {Copy to Regions} {Zu Regionen kopieren} ::msgcat::mcset de {Copy} {Kopieren} ::msgcat::mcset de {Create Movie} ::msgcat::mcset de {Create New Frame on Download} {Neuen rahmen bei Download} ::msgcat::mcset de {Create} ::msgcat::mcset de {Crop Parameters} ::msgcat::mcset de {Crop} ::msgcat::mcset de {Crosshair Parameters} ::msgcat::mcset de {Crosshair To} {Fadenkreuz auf} ::msgcat::mcset de {Crosshair} {Fadenkreuz} ::msgcat::mcset de {Cross} {Kreuz} ::msgcat::mcset de {Cubehelix} ::msgcat::mcset de {Cube} ::msgcat::mcset de {Cubic} ::msgcat::mcset de {Current Frame} {Aktueller rahmen} ::msgcat::mcset de {Current Range} {Aktueller bereich} ::msgcat::mcset de {Current} {Aktuell} ::msgcat::mcset de {Cursor} {Zeiger} ::msgcat::mcset de {Cut} {Ausschneiden} ::msgcat::mcset de {Cyan} {Zyan} ::msgcat::mcset de {DPI} ::msgcat::mcset de {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset de {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset de {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset de {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-1 {DS9 hat ein ltere Einstellungsdatei erkannt, mchten Sie aktualisieren?}] ::msgcat::mcset de {DS9 will complete the initialization process} [encoding convertfrom iso8859-1 {DS9 wird den Initialisierungsproze vervollstndigen}] ::msgcat::mcset de {Dash} {Gestrichelt} ::msgcat::mcset de {Data Format} {Datenformat} ::msgcat::mcset de {Dataset Name} ::msgcat::mcset de {Dataset} {Datensatz} ::msgcat::mcset de {Data} ::msgcat::mcset de {Decrease} {Absteigend} ::msgcat::mcset de {Default All Files} ::msgcat::mcset de {Default Format} ::msgcat::mcset de {Default Length} ::msgcat::mcset de {Default} {Standard} ::msgcat::mcset de {Degrees} {Grad} ::msgcat::mcset de {Delete All Frames?} [encoding convertfrom iso8859-1 {Alle rahmen lschen?}] ::msgcat::mcset de {Delete All Frames} [encoding convertfrom iso8859-1 {Alle rahmen lschen}] ::msgcat::mcset de {Delete All Groups?} [encoding convertfrom iso8859-1 {Alle Gruppen lschen?}] ::msgcat::mcset de {Delete All Groups} [encoding convertfrom iso8859-1 {Alle Gruppen lschen}] ::msgcat::mcset de {Delete All Regions?} [encoding convertfrom iso8859-1 {Alle Regionen lschen?}] ::msgcat::mcset de {Delete All Regions} [encoding convertfrom iso8859-1 {Alle Regionen lschen}] ::msgcat::mcset de {Delete All} ::msgcat::mcset de {Delete Color Tags} ::msgcat::mcset de {Delete Frame} [encoding convertfrom iso8859-1 {Rahmen lschen}] ::msgcat::mcset de {Delete Group} [encoding convertfrom iso8859-1 {Gruppe lschen}] ::msgcat::mcset de {Delete Selected Regions} [encoding convertfrom iso8859-1 {Ausgewhlte Regionen lschen}] ::msgcat::mcset de {Delete} [encoding convertfrom iso8859-1 {Lschen}] ::msgcat::mcset de {Depth} {Tiefe} ::msgcat::mcset de {Detector} {Detektor} ::msgcat::mcset de {Dialog Box} {Dialogbox} ::msgcat::mcset de {Diamond} {Raute} ::msgcat::mcset de {Dimension} ::msgcat::mcset de {Direction} ::msgcat::mcset de {Disconnect} ::msgcat::mcset de {Display Header} ::msgcat::mcset de {Display Size} [encoding convertfrom iso8859-1 {Gre zeigen}] ::msgcat::mcset de {Dissolve} ::msgcat::mcset de {Distance} ::msgcat::mcset de {Download Colormap} ::msgcat::mcset de {Download VOTABLE format if available} ::msgcat::mcset de {Drag to Center} {Ziehen zum zentrieren} ::msgcat::mcset de {Duplicate Data} ::msgcat::mcset de {East} {Osten} ::msgcat::mcset de {Ecliptic} {Ekliptisch} ::msgcat::mcset de {Edit Group Name} {Gruppenname bearbeiten} ::msgcat::mcset de {Edit} {Bearbeiten} ::msgcat::mcset de {Elevation} ::msgcat::mcset de {Ellipse Annulus} ::msgcat::mcset de {Ellipse Panda} {Ellipsen Panda} ::msgcat::mcset de {Ellipse} ::msgcat::mcset de {Elliptical Annulus} {Elliptischer Kreisring} ::msgcat::mcset de {Elliptical Panda} {Elliptischer Panda} ::msgcat::mcset de {Enable Confirmation Dialogs} [encoding convertfrom iso8859-1 {Besttigungsdialoge einschalten}] ::msgcat::mcset de {Enable} ::msgcat::mcset de {End} {Ende} ::msgcat::mcset de {Enter Color} ::msgcat::mcset de {Enter Font Size} ::msgcat::mcset de {Enter Group Name} {Gruppenname eingeben} ::msgcat::mcset de {Enter Search Expression} ::msgcat::mcset de {Enter URL} ::msgcat::mcset de {Entry} ::msgcat::mcset de {Equal Area} [encoding convertfrom iso8859-1 {Gleiche Flche}] ::msgcat::mcset de {Equal Distance} {Gleicher Abstand} ::msgcat::mcset de {Equal Spacing} ::msgcat::mcset de {Equal Value} ::msgcat::mcset de {Error code was returned} [encoding convertfrom iso8859-1 {Fehlercode wurde zurckgegeben}] ::msgcat::mcset de {Error} {Fehler} ::msgcat::mcset de {Examine Frame} {Rahmen inspizieren} ::msgcat::mcset de {Examine} {Inspizieren} ::msgcat::mcset de {Exam} ::msgcat::mcset de {Exclude} {Ausschliessen} ::msgcat::mcset de {Executing TCL code is not enabled} ::msgcat::mcset de {Exit} [encoding convertfrom iso8859-1 {Schlieen}] ::msgcat::mcset de {Export Array} ::msgcat::mcset de {Export} ::msgcat::mcset de {Extention} ::msgcat::mcset de {Exterior Axes} [encoding convertfrom iso8859-1 {uere Achsen}] ::msgcat::mcset de {Exterior Numerics} [encoding convertfrom iso8859-1 {uere Ziffern}] ::msgcat::mcset de {FAQ} ::msgcat::mcset de {FK4} ::msgcat::mcset de {FK5} ::msgcat::mcset de {Factor} ::msgcat::mcset de {File not Found or Unable to load FITS data MIME type} [encoding convertfrom iso8859-1 {Datei nicht gefunden oder nicht mglich FITS-Daten MIME-Type zu laden}] ::msgcat::mcset de {Filename} {Dateiname} ::msgcat::mcset de {File} {Datei} ::msgcat::mcset de {Fill} ::msgcat::mcset de {Filter} ::msgcat::mcset de {Find Next} [encoding convertfrom iso8859-1 {Nchsten finden}] ::msgcat::mcset de {Find} {Suchen} ::msgcat::mcset de {First Frame} {Erster rahmen} ::msgcat::mcset de {First} {Erster} ::msgcat::mcset de {Fits} ::msgcat::mcset de {Fixed in Size} [encoding convertfrom iso8859-1 {Feste Gre}] ::msgcat::mcset de {Flat} ::msgcat::mcset de {Flip} ::msgcat::mcset de {Font} ::msgcat::mcset de {For more information, use --help} ::msgcat::mcset de {Format} ::msgcat::mcset de {Forward} [encoding convertfrom iso8859-1 {Vorwrts}] ::msgcat::mcset de {Found} {Gefunden} ::msgcat::mcset de {Frame Information} {Rahmeninformation} ::msgcat::mcset de {Frame Parameters} ::msgcat::mcset de {Frames} ::msgcat::mcset de {Frame} {Rahmen} ::msgcat::mcset de {From} ::msgcat::mcset de {Front} {Vor} ::msgcat::mcset de {Full Range} {Ganzer Bereich} ::msgcat::mcset de {Function} {Funktion} ::msgcat::mcset de {GUI Font} ::msgcat::mcset de {Galactic} {Galaktisch} ::msgcat::mcset de {Gap} ::msgcat::mcset de {Gaussian} {Gauss} ::msgcat::mcset de {General} {Allgemein} ::msgcat::mcset de {Generate} {Herstellen} ::msgcat::mcset de {Generating Regions} {Regionen erstellen} ::msgcat::mcset de {Get Information} {Informationen} ::msgcat::mcset de {Gist} ::msgcat::mcset de {Global Properties} ::msgcat::mcset de {Global} ::msgcat::mcset de {Goto Frame} ::msgcat::mcset de {Graph Horz} ::msgcat::mcset de {Graph Vert} ::msgcat::mcset de {Graphics} {Grafik} ::msgcat::mcset de {Graphs} ::msgcat::mcset de {Graph} ::msgcat::mcset de {Grayscale} {Graustufen} ::msgcat::mcset de {Green} [encoding convertfrom iso8859-1 {Grn}] ::msgcat::mcset de {Grid Gap} {Gitterabstand} ::msgcat::mcset de {Grid} {Gitter} ::msgcat::mcset de {Groove} ::msgcat::mcset de {Groups} {Gruppen} ::msgcat::mcset de {HTTP} ::msgcat::mcset de {Header} {Dateikopf} ::msgcat::mcset de {Height} [encoding convertfrom iso8859-1 {Hhe}] ::msgcat::mcset de {Help Desk} {Hilfestelle} ::msgcat::mcset de {Help Me Choose} [encoding convertfrom iso8859-1 {Hilf mir auswhlen}] ::msgcat::mcset de {Help} {Hilfe} ::msgcat::mcset de {Hide All} {Alle verstecken} ::msgcat::mcset de {Highlite} ::msgcat::mcset de {High} {Hoch} ::msgcat::mcset de {Histogram Equalization} {Histogrammausgleich} ::msgcat::mcset de {Histogram} {Histogramm} ::msgcat::mcset de {Horizontal Graph} {Horizontaldarstellung} ::msgcat::mcset de {Horizontal Layout} {Horizontales Layout} ::msgcat::mcset de {Horizontal} ::msgcat::mcset de {IAU Location Code} ::msgcat::mcset de {ICRS} ::msgcat::mcset de {Identification} {Kennzeichnung} ::msgcat::mcset de {If} {Wenn} ::msgcat::mcset de {Image Servers} {Bildserver} ::msgcat::mcset de {Image} {Bild} ::msgcat::mcset de {Import Array} ::msgcat::mcset de {Import} ::msgcat::mcset de {Include} {Einschliessen} ::msgcat::mcset de {Increase} {Aufsteigend} ::msgcat::mcset de {Information Panel} {Informationsfeld} ::msgcat::mcset de {Information} {Informations} ::msgcat::mcset de {Initialize XPA} {XPA initialisieren} ::msgcat::mcset de {Inner} {Innerer} ::msgcat::mcset de {Instrument FOV} {Instrumentensichtfeld} ::msgcat::mcset de {Interior Axes} {Innere Achsen} ::msgcat::mcset de {Interior Numerics} {Innere Ziffern} ::msgcat::mcset de {Internal Parse Error} ::msgcat::mcset de {Interval} {Intervall} ::msgcat::mcset de {Invalid Column Name} ::msgcat::mcset de {Invalid formated multipart/mixed mime type message} [encoding convertfrom iso8859-1 {Ungltig formatierter multipart/mixed MIME-Type}] ::msgcat::mcset de {Invert Colormap} {Farbpalette invertieren} ::msgcat::mcset de {Invert Selection} {Auswahl umkehren} ::msgcat::mcset de {Invert} {Invertieren} ::msgcat::mcset de {Italic} {Kursiv} ::msgcat::mcset de {Items Found} ::msgcat::mcset de {Iteration} ::msgcat::mcset de {JPEG Quality Factor} [encoding convertfrom iso8859-1 {JPEG Qualittsfaktor}] ::msgcat::mcset de {Keep-Alive} ::msgcat::mcset de {Kernel} ::msgcat::mcset de {Keyboard Shortcuts} {Tastatur-Shortcuts} ::msgcat::mcset de {Keyboard} {Tastatur} ::msgcat::mcset de {Keyword} ::msgcat::mcset de {Labels} {Beschriftung} ::msgcat::mcset de {Label} ::msgcat::mcset de {Landscape} {Horizontal} ::msgcat::mcset de {Language} {Sprache} ::msgcat::mcset de {Last Frame} {Letzter rahmen} ::msgcat::mcset de {Last} {Letzter} ::msgcat::mcset de {Layout Horz} ::msgcat::mcset de {Layout Vert} ::msgcat::mcset de {Layout} ::msgcat::mcset de {Left} ::msgcat::mcset de {Legal} ::msgcat::mcset de {Legend Title} ::msgcat::mcset de {Legend} ::msgcat::mcset de {Length} [encoding convertfrom iso8859-1 {Lnge}] ::msgcat::mcset de {Letter} ::msgcat::mcset de {Levels} {Niveaus} ::msgcat::mcset de {Level} {Niveau} ::msgcat::mcset de {Limits} {Grenzen} ::msgcat::mcset de {Line Plot Tool} ::msgcat::mcset de {Linear} ::msgcat::mcset de {Line} {Linie} ::msgcat::mcset de {List Data} ::msgcat::mcset de {List Regions} {Regionen auflisten} ::msgcat::mcset de {List} {Auflisten} ::msgcat::mcset de {Load Analysis Commands} {Analysebefehle laden} ::msgcat::mcset de {Load Color Tags} ::msgcat::mcset de {Load Colormap} {Farbpalette laden} ::msgcat::mcset de {Load Configuration} {Konfiguration laden} ::msgcat::mcset de {Load Contour Levels} {Kontourniveaus laden} ::msgcat::mcset de {Load Contours} {Konturen laden} ::msgcat::mcset de {Load Contrast/Bias} {Kontrast/Bias laden} ::msgcat::mcset de {Load Data} {Daten laden} ::msgcat::mcset de {Load Mosaic} {Mosaic laden} ::msgcat::mcset de {Load Regions} {Regionen laden} ::msgcat::mcset de {Load Template} {Vorlage laden} ::msgcat::mcset de {Load into All Frames} ::msgcat::mcset de {Load into Current Frame} ::msgcat::mcset de {Loading Catalog} ::msgcat::mcset de {Loading} ::msgcat::mcset de {Load} {Laden} ::msgcat::mcset de {Local} {Lokal} ::msgcat::mcset de {Lock Axes} ::msgcat::mcset de {Lock Bin} ::msgcat::mcset de {Lock Color} ::msgcat::mcset de {Lock Crop Amplifier} ::msgcat::mcset de {Lock Crop Detector} ::msgcat::mcset de {Lock Crop Image} ::msgcat::mcset de {Lock Crop None} ::msgcat::mcset de {Lock Crop Physical} ::msgcat::mcset de {Lock Crop WCS} ::msgcat::mcset de {Lock Crosshair Amplifier} ::msgcat::mcset de {Lock Crosshair Detector} ::msgcat::mcset de {Lock Crosshair Image} ::msgcat::mcset de {Lock Crosshair None} ::msgcat::mcset de {Lock Crosshair Physical} ::msgcat::mcset de {Lock Crosshair WCS} ::msgcat::mcset de {Lock Frame Amplifier} ::msgcat::mcset de {Lock Frame Detector} ::msgcat::mcset de {Lock Frame Image} ::msgcat::mcset de {Lock Frame None} ::msgcat::mcset de {Lock Frame Physical} ::msgcat::mcset de {Lock Frame WCS} ::msgcat::mcset de {Lock Limits} ::msgcat::mcset de {Lock Scale} ::msgcat::mcset de {Lock Slice Image} ::msgcat::mcset de {Lock Slice None} ::msgcat::mcset de {Lock Slice WCS} ::msgcat::mcset de {Lock Smooth} ::msgcat::mcset de {Lock} {Arretieren} ::msgcat::mcset de {Log Exponent} ::msgcat::mcset de {Log} ::msgcat::mcset de {Low High} {Niedrig Hoch} ::msgcat::mcset de {Lower Left Back} ::msgcat::mcset de {Lower Left Front} ::msgcat::mcset de {Lower Right Back} ::msgcat::mcset de {Lower Right Front} ::msgcat::mcset de {Low} {Niedrig} ::msgcat::mcset de {MIP} ::msgcat::mcset de {Magenta} ::msgcat::mcset de {Magnification} ::msgcat::mcset de {Magnifier} [encoding convertfrom iso8859-1 {Vergrerungsglas}] ::msgcat::mcset de {Major} [encoding convertfrom iso8859-1 {Gro}] ::msgcat::mcset de {Manual} {Manuell} ::msgcat::mcset de {Mask Parameters} {Maskenparameter} ::msgcat::mcset de {Match Axes} ::msgcat::mcset de {Match Bin} ::msgcat::mcset de {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset de {Match Color} ::msgcat::mcset de {Match Crop Amplifier} ::msgcat::mcset de {Match Crop Detector} ::msgcat::mcset de {Match Crop Image} ::msgcat::mcset de {Match Crop Physical} ::msgcat::mcset de {Match Crop WCS} ::msgcat::mcset de {Match Crosshair Amplifier} ::msgcat::mcset de {Match Crosshair Detector} ::msgcat::mcset de {Match Crosshair Image} ::msgcat::mcset de {Match Crosshair Physical} ::msgcat::mcset de {Match Crosshair WCS} ::msgcat::mcset de {Match Frame Amplifier} ::msgcat::mcset de {Match Frame Detector} ::msgcat::mcset de {Match Frame Image} ::msgcat::mcset de {Match Frame Physical} ::msgcat::mcset de {Match Frame WCS} ::msgcat::mcset de {Match Limits} ::msgcat::mcset de {Match Scale} ::msgcat::mcset de {Match Slice Image} ::msgcat::mcset de {Match Slice WCS} ::msgcat::mcset de {Match Smooth} ::msgcat::mcset de {Match} ::msgcat::mcset de {Math Function} {Math. Funktion} ::msgcat::mcset de {Matplotlib} ::msgcat::mcset de {Max Rows} {Max. Reihen} ::msgcat::mcset de {Max} ::msgcat::mcset de {Menus and Buttons} ::msgcat::mcset de {Menu} ::msgcat::mcset de {Message Log} ::msgcat::mcset de {Method} {Methode} ::msgcat::mcset de {Min Max Parameters} ::msgcat::mcset de {Min Max} ::msgcat::mcset de {Minor} {Gering} ::msgcat::mcset de {Minutes} ::msgcat::mcset de {Min} ::msgcat::mcset de {Mission} ::msgcat::mcset de {Mode} ::msgcat::mcset de {Mosaic IRAF Segment} ::msgcat::mcset de {Mosaic IRAF} ::msgcat::mcset de {Mosaic WCS Segment} ::msgcat::mcset de {Mosaic WCS} ::msgcat::mcset de {Mosaic WFPC2} ::msgcat::mcset de {Mosaic} ::msgcat::mcset de {Mouse Click Epsilon} ::msgcat::mcset de {Mouse Wheel Bin} ::msgcat::mcset de {Mouse Wheel Zoom} ::msgcat::mcset de {Mouse and Keyboard} ::msgcat::mcset de {Move Back} ::msgcat::mcset de {Move First} ::msgcat::mcset de {Move Forward} ::msgcat::mcset de {Move Frame} ::msgcat::mcset de {Move Last} ::msgcat::mcset de {Move to Back} {Nach hinten} ::msgcat::mcset de {Move to Front} {Nach vorne} ::msgcat::mcset de {Movie} ::msgcat::mcset de {Multiple Extension Cube} ::msgcat::mcset de {Multiple Extension Frames} ::msgcat::mcset de {Multiple WCS} {Mehrere WCS} ::msgcat::mcset de {NRRD} ::msgcat::mcset de {Name Resolution} {Namensbestimmung} ::msgcat::mcset de {Name Server} ::msgcat::mcset de {Name or Designation} {Name oder Bezeichnung} ::msgcat::mcset de {Name} ::msgcat::mcset de {Native Dialog} {Systemnativer Dialog} ::msgcat::mcset de {New Features} {Neue Eigenschaften} ::msgcat::mcset de {New Frame 3D} ::msgcat::mcset de {New Frame RGB} {Neuer RGB rahmen} ::msgcat::mcset de {New Frame each Time} {Neuer rahmen jedes Mal} ::msgcat::mcset de {New Frame} {Neuer rahmen} ::msgcat::mcset de {New Group} {Neue Gruppe} ::msgcat::mcset de {New} {Neu} ::msgcat::mcset de {Next Frame} [encoding convertfrom iso8859-1 {Nchster rahmen}] ::msgcat::mcset de {Next} [encoding convertfrom iso8859-1 {Nchster}] ::msgcat::mcset de {No Catalog specified} {Keine Katalog spezifiziert} ::msgcat::mcset de {No Items Found} {Keine Objekte gefunden} ::msgcat::mcset de {No current frame} ::msgcat::mcset de {No data available at } [encoding convertfrom iso8859-1 {Keine Daten verfgbar bei }] ::msgcat::mcset de {Non-zero} ::msgcat::mcset de {None} {Kein} ::msgcat::mcset de {Normal} ::msgcat::mcset de {North} {Norden} ::msgcat::mcset de {Not Found} ::msgcat::mcset de {Number of Samples} {Anzahl der Stichproben} ::msgcat::mcset de {Number of Threads} ::msgcat::mcset de {Number of Ticks} ::msgcat::mcset de {Number} {Zahl} ::msgcat::mcset de {Numerics} ::msgcat::mcset de {OK} ::msgcat::mcset de {Object} {Objekt} ::msgcat::mcset de {Open File} [encoding convertfrom iso8859-1 {Datei ffnen}] ::msgcat::mcset de {Open TCL Console} ::msgcat::mcset de {Open URL} [encoding convertfrom iso8859-1 {URL ffnen}] ::msgcat::mcset de {Open as} ::msgcat::mcset de {Open} [encoding convertfrom iso8859-1 {ffnen}] ::msgcat::mcset de {Operator} ::msgcat::mcset de {Orientation} {Orientierung} ::msgcat::mcset de {Origin} ::msgcat::mcset de {Oscillate} ::msgcat::mcset de {Other Color} ::msgcat::mcset de {Other Font Size} ::msgcat::mcset de {Other} {Andere} ::msgcat::mcset de {Outer} [encoding convertfrom iso8859-1 {uerer}] ::msgcat::mcset de {Overlap} ::msgcat::mcset de {PS Page Setup} ::msgcat::mcset de {PS Print} ::msgcat::mcset de {Page Setup} {Seitensetup} ::msgcat::mcset de {Page Source} {Seitenquelle} ::msgcat::mcset de {Pan To} {Ausrichten auf} ::msgcat::mcset de {Pan Zoom Rotate Parameters} {Ausrichten zoomen rotieren} ::msgcat::mcset de {Pan Zoom} ::msgcat::mcset de {Pan then Zoom} {Ausrichten dann Zoomen} ::msgcat::mcset de {Panda} ::msgcat::mcset de {Panner} [encoding convertfrom iso8859-1 {bersichtsfeld}] ::msgcat::mcset de {Pan} {Ausrichtung} ::msgcat::mcset de {Parameters} {Parameter} ::msgcat::mcset de {Password} {Passwort} ::msgcat::mcset de {Paste Contours} [encoding convertfrom iso8859-1 {Konturen einfgen}] ::msgcat::mcset de {Paste} [encoding convertfrom iso8859-1 {Einfgen}] ::msgcat::mcset de {Physical} {Physikalisch} ::msgcat::mcset de {Pixel Distribution} {Pixelverteilung} ::msgcat::mcset de {Pixel Size} [encoding convertfrom iso8859-1 {Pixelgre}] ::msgcat::mcset de {Pixel Table} {Pixeltabelle} ::msgcat::mcset de {Pixels} {Pixel} ::msgcat::mcset de {Play} {Abspielen} ::msgcat::mcset de {Please Select a Region} ::msgcat::mcset de {Please specify width, height, and either name or (ra,dec)} [encoding convertfrom iso8859-1 {Bitte Weite, Hhe und entweder Namen oder (RA,Dec) angeben}] ::msgcat::mcset de {Plot 2D} ::msgcat::mcset de {Plot 3D} ::msgcat::mcset de {Plot Title} {Titel drucken} ::msgcat::mcset de {Plotting Regions} {Regionen drucken} ::msgcat::mcset de {Plot} ::msgcat::mcset de {Plus} ::msgcat::mcset de {Pointer} {Zeiger} ::msgcat::mcset de {Points} {Punkte} ::msgcat::mcset de {Point} {Punkt} ::msgcat::mcset de {Polygon} ::msgcat::mcset de {Portrait} {Vertikal} ::msgcat::mcset de {Poster} ::msgcat::mcset de {Postscript Page Setup} ::msgcat::mcset de {Postscript Print} ::msgcat::mcset de {Postscript} ::msgcat::mcset de {Power} {Exp} ::msgcat::mcset de {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} [encoding convertfrom iso8859-1 {Einstellungen wurden auf die Standardwerte zurckgesetzt. Starten Sie DS9 bitte neu, um die nderungen zu bernehmen}] ::msgcat::mcset de {Preferences} {Einstellungen} ::msgcat::mcset de {Preserve During Load} {Beim Laden beibehalten} ::msgcat::mcset de {Previous Frame} {Vorheriger rahmen} ::msgcat::mcset de {Previous} {Vorheriger} ::msgcat::mcset de {Prev} ::msgcat::mcset de {Print Coordinates} {Koordinaten drucken} ::msgcat::mcset de {Print To} {Drucken} ::msgcat::mcset de {Printer} {Drucker} ::msgcat::mcset de {Print} {Drucken} ::msgcat::mcset de {Projection} {Projektion} ::msgcat::mcset de {Properties} {Eigenschaften} ::msgcat::mcset de {Property} {Eigenschaften} ::msgcat::mcset de {Proxy Host} ::msgcat::mcset de {Proxy Port} ::msgcat::mcset de {Publication} [encoding convertfrom iso8859-1 {Verffentlichung}] ::msgcat::mcset de {Quadratic} {Quadratisch} ::msgcat::mcset de {RGB Array} ::msgcat::mcset de {RGB Cube} ::msgcat::mcset de {RGB Image} ::msgcat::mcset de {RGB} ::msgcat::mcset de {Radial Profile} ::msgcat::mcset de {Radial} ::msgcat::mcset de {Radius} ::msgcat::mcset de {Raised} ::msgcat::mcset de {Range} ::msgcat::mcset de {Redo} {Wiederholen} ::msgcat::mcset de {Red} {Rot} ::msgcat::mcset de {Reference Manual} {Referenzhandbuch} ::msgcat::mcset de {Reference} {Referenz} ::msgcat::mcset de {Refresh Frame} {Rahmen erneuern} ::msgcat::mcset de {Refresh} ::msgcat::mcset de {Region Parameters} ::msgcat::mcset de {Region} ::msgcat::mcset de {Release Notes} {Versionshinweise} ::msgcat::mcset de {Release} {Version} ::msgcat::mcset de {Relief} ::msgcat::mcset de {Reload} {Wieder laden} ::msgcat::mcset de {Render} ::msgcat::mcset de {Repeat} ::msgcat::mcset de {Reset Colormap} [encoding convertfrom iso8859-1 {Farbpalette zurcksetzen}] ::msgcat::mcset de {Reset Frame} [encoding convertfrom iso8859-1 {Rahmen zurcksetzen}] ::msgcat::mcset de {Reset} ::msgcat::mcset de {Restore} ::msgcat::mcset de {Retrieve} {Suchen} ::msgcat::mcset de {Return} ::msgcat::mcset de {Right} ::msgcat::mcset de {Roman} ::msgcat::mcset de {Rotate} {Rotieren} ::msgcat::mcset de {Rows} {Reihen} ::msgcat::mcset de {Row} ::msgcat::mcset de {Ruler} {Lineal} ::msgcat::mcset de {SAMP Image} ::msgcat::mcset de {SAMP Table} ::msgcat::mcset de {SAMP: already connected} ::msgcat::mcset de {SAMP: internal error} ::msgcat::mcset de {SAMP: not connected} ::msgcat::mcset de {SAMP: unable to locate HUB} ::msgcat::mcset de {SAMP} ::msgcat::mcset de {Sample Increment} {Stichprobeninkrement} ::msgcat::mcset de {Sample Parameters} {Stichprobenparameter} ::msgcat::mcset de {Samples per Line} {Stichproben pro Linie} ::msgcat::mcset de {Sample} {Stichprobe} ::msgcat::mcset de {Save 3D Movie} ::msgcat::mcset de {Save Color Tags} ::msgcat::mcset de {Save Colormap} {Farbpalette speichern} ::msgcat::mcset de {Save Configuration} {Konfiguration speichern} ::msgcat::mcset de {Save Contour Levels} {Konturniveaus speichern} ::msgcat::mcset de {Save Contours} {Konturen speichern} ::msgcat::mcset de {Save Contrast/Bias} {Kontrast/Bias speichern} ::msgcat::mcset de {Save Data} {Daten speichern} ::msgcat::mcset de {Save Image on Download} ::msgcat::mcset de {Save Image} {Bild speichern} ::msgcat::mcset de {Save Regions} {Regionen speichern} ::msgcat::mcset de {Save Template} {Vorlage speichern} ::msgcat::mcset de {Save as} ::msgcat::mcset de {Save} {Speichern} ::msgcat::mcset de {Scale Parameters} {Skalierungsparameter} ::msgcat::mcset de {Scale and Limits} ::msgcat::mcset de {Scale} {Skalierung} ::msgcat::mcset de {Scan} {Abtastung} ::msgcat::mcset de {Scatter Plot Tool} ::msgcat::mcset de {Scope} {Anwendungsbereich} ::msgcat::mcset de {Search for Catalogs} {Nach Katalogen suchen} ::msgcat::mcset de {Searching for catalogs} {Suche nach Katalogen} ::msgcat::mcset de {Seconds} {Sekunden} ::msgcat::mcset de {Segment} ::msgcat::mcset de {Select All} [encoding convertfrom iso8859-1 {Alle auswhlen}] ::msgcat::mcset de {Select Coordinate System } [encoding convertfrom iso8859-1 {Koordinatensystem auswhlen}] ::msgcat::mcset de {Select None} [encoding convertfrom iso8859-1 {Nichts auswhlen}] ::msgcat::mcset de {Select} ::msgcat::mcset de {Send} ::msgcat::mcset de {Server} ::msgcat::mcset de {Sexagesimal} ::msgcat::mcset de {Shape} {Form} ::msgcat::mcset de {Show All} {Alle zeigen} ::msgcat::mcset de {Show Command} ::msgcat::mcset de {Show Compass} ::msgcat::mcset de {Show Text} ::msgcat::mcset de {Show/Hide Frames} {Rahmen zeigen/verstecken} ::msgcat::mcset de {Show} ::msgcat::mcset de {Simple Cross} ::msgcat::mcset de {Simple Plus} ::msgcat::mcset de {Single Frame} {Einzelner rahmen} ::msgcat::mcset de {Single} {Einzeln} ::msgcat::mcset de {Sites} ::msgcat::mcset de {Size/Radius} [encoding convertfrom iso8859-1 {Gre/Radius}] ::msgcat::mcset de {Size} [encoding convertfrom iso8859-1 {Gre}] ::msgcat::mcset de {Skip First} [encoding convertfrom iso8859-1 {Erste berspringen}] ::msgcat::mcset de {Slice} ::msgcat::mcset de {Smooth Parameters} [encoding convertfrom iso8859-1 {Glttungsparameter}] ::msgcat::mcset de {Smoothness} ::msgcat::mcset de {Smooth} [encoding convertfrom iso8859-1 {Gltten}] ::msgcat::mcset de {Solid} ::msgcat::mcset de {Sorry, DS9 does not support} [encoding convertfrom iso8859-1 {Sorry, DS9 untersttzt nicht}] ::msgcat::mcset de {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset de {Sort} {Sortieren} ::msgcat::mcset de {Source TCL} ::msgcat::mcset de {Source} {Quelle} ::msgcat::mcset de {Space Equal Distance} ::msgcat::mcset de {Space Equal Value} ::msgcat::mcset de {Spacing} {Intervall} ::msgcat::mcset de {Sqrt} ::msgcat::mcset de {Square Root} {Wurzel} ::msgcat::mcset de {Squared} {Quadratisch} ::msgcat::mcset de {Square} ::msgcat::mcset de {Stacked} ::msgcat::mcset de {Starbase} ::msgcat::mcset de {Startup} ::msgcat::mcset de {Start} ::msgcat::mcset de {Statistics} ::msgcat::mcset de {Stats} ::msgcat::mcset de {Status} ::msgcat::mcset de {Step} {Stufe} ::msgcat::mcset de {Stop} ::msgcat::mcset de {Story of SAOImage DS9} ::msgcat::mcset de {Story} ::msgcat::mcset de {Sum} {Summieren} ::msgcat::mcset de {Sunken} ::msgcat::mcset de {Symbol Editor} ::msgcat::mcset de {Symbol} ::msgcat::mcset de {Tab-Separated-Value} ::msgcat::mcset de {Table} ::msgcat::mcset de {Tabloid} ::msgcat::mcset de {Task} ::msgcat::mcset de {Template} ::msgcat::mcset de {Text Font} ::msgcat::mcset de {Text} ::msgcat::mcset de {Then} {dann} ::msgcat::mcset de {Thickness} {Dicke} ::msgcat::mcset de {This analysis task is already running. Do you wish to kill it?} [encoding convertfrom iso8859-1 {Diese Analyse luft bereits. Soll sie beendet werden?}] ::msgcat::mcset de {This function is not currently supported for this port.} ::msgcat::mcset de {Tickmarks} {Achsenstriche} ::msgcat::mcset de {Tile Frames} {Gekachelte rahmen} ::msgcat::mcset de {Tile Parameters} ::msgcat::mcset de {Tile} {Kacheln} ::msgcat::mcset de {Times} ::msgcat::mcset de {Title} {Titel} ::msgcat::mcset de {Tophat} ::msgcat::mcset de {Topographic} ::msgcat::mcset de {Top} ::msgcat::mcset de {To} {Nach} ::msgcat::mcset de {Transparency} ::msgcat::mcset de {Triangle} ::msgcat::mcset de {Type} {Typ} ::msgcat::mcset de {URL} ::msgcat::mcset de {Unable to connect directly: using Web Proxy} ::msgcat::mcset de {Unable to determine date of observation} ::msgcat::mcset de {Unable to determine time of observation} ::msgcat::mcset de {Unable to evaluate filter} [encoding convertfrom iso8859-1 {Nicht mglich Filter zu evaluieren}] ::msgcat::mcset de {Unable to find catalog window} [encoding convertfrom iso8859-1 {Nicht mglich Katalogfenster zu finden}] ::msgcat::mcset de {Unable to find plot window} [encoding convertfrom iso8859-1 {Nicht mglich Plotfenster zu finden}] ::msgcat::mcset de {Unable to load RGB image into a non-rgb frame} [encoding convertfrom iso8859-1 {Nicht mglich RGB-Bild in nicht-RGB-rahmen zu laden}] ::msgcat::mcset de {Unable to load region file} ::msgcat::mcset de {Unable to load} [encoding convertfrom iso8859-1 {Nicht mglich zu laden}] ::msgcat::mcset de {Unable to locate URL} [encoding convertfrom iso8859-1 {Nicht mglich URL zu finden}] ::msgcat::mcset de {Unable to match target with XPA Mime request} ::msgcat::mcset de {Unable to open file} [encoding convertfrom iso8859-1 {Nicht mglich Datei zu ffnen}] ::msgcat::mcset de {Unable to process Analysis file} ::msgcat::mcset de {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset de {Undo} [encoding convertfrom iso8859-1 {Rckgngig}] ::msgcat::mcset de {Unique} ::msgcat::mcset de {Unists} ::msgcat::mcset de {Units} {Einheiten} ::msgcat::mcset de {Unknown Colormap} ::msgcat::mcset de {Unknown command} ::msgcat::mcset de {Update Filter} ::msgcat::mcset de {Update Group} {Gruppe aktualisieren} ::msgcat::mcset de {Update from Current Crosshair} {Vom aktuellen Fadenkreuz aktualisieren} ::msgcat::mcset de {Update from Current Frame} {Vom aktuellen rahmen aktualisieren} ::msgcat::mcset de {Update} {Aktualisieren} ::msgcat::mcset de {Upper Left Back} ::msgcat::mcset de {Upper Left Front} ::msgcat::mcset de {Upper Right Back} ::msgcat::mcset de {Upper Right Front} ::msgcat::mcset de {Use Authentication} {Authentifizierung verwenden} ::msgcat::mcset de {Use Current Frame on Download} {Aktuellen rahmen bei Download verwenden} ::msgcat::mcset de {Use Internal Web Browser} {Internen Webbrowser verwenden} ::msgcat::mcset de {Use Proxy} {Proxy verwenden} ::msgcat::mcset de {User Manual} ::msgcat::mcset de {Username} {Login} ::msgcat::mcset de {User} {Benutzer} ::msgcat::mcset de {Use} {Benutze} ::msgcat::mcset de {VO Server} ::msgcat::mcset de {VO} ::msgcat::mcset de {Value} {Wert} ::msgcat::mcset de {Vector} {Vektor} ::msgcat::mcset de {Vertical Graph} {Vertikaldarstellung} ::msgcat::mcset de {Vertical Layout} {Vertikales layout} ::msgcat::mcset de {Vertical Text} {Vertikaler text} ::msgcat::mcset de {Vertical} ::msgcat::mcset de {View} {Ansicht} ::msgcat::mcset de {Virtual Observatory} ::msgcat::mcset de {WCS Parameters} ::msgcat::mcset de {WCS} ::msgcat::mcset de {Wavelength} [encoding convertfrom iso8859-1 {Wellenlnge}] ::msgcat::mcset de {Web Browser} {Webbrowser} ::msgcat::mcset de {White} [encoding convertfrom iso8859-1 {Wei}] ::msgcat::mcset de {Width} {Breite} ::msgcat::mcset de {Window} ::msgcat::mcset de {Words matching title, description} {Worte im Titel, Bezeichnung} ::msgcat::mcset de {Writing Catalog} ::msgcat::mcset de {X Axis Title} ::msgcat::mcset de {X Grid} ::msgcat::mcset de {XPA Information} ::msgcat::mcset de {XPA not initialized} {XPA nicht initialisiert} ::msgcat::mcset de {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset de {XPA} ::msgcat::mcset de {X} ::msgcat::mcset de {Y Axis Title} ::msgcat::mcset de {Y Grid} ::msgcat::mcset de {Yellow} {Gelb} ::msgcat::mcset de {Y} ::msgcat::mcset de {Z Axis Scale} ::msgcat::mcset de {ZScale Parameters} ::msgcat::mcset de {Zero} ::msgcat::mcset de {Zoom Fit} ::msgcat::mcset de {Zoom In} {Hineinzoomen} ::msgcat::mcset de {Zoom Out} {Herauszoomen} ::msgcat::mcset de {Zoom} ::msgcat::mcset de {and} ::msgcat::mcset de {blue} ::msgcat::mcset de {b} ::msgcat::mcset de {color} ::msgcat::mcset de {cool} ::msgcat::mcset de {green} ::msgcat::mcset de {grey} ::msgcat::mcset de {g} ::msgcat::mcset de {h5utils} ::msgcat::mcset de {heat} ::msgcat::mcset de {not} ::msgcat::mcset de {only} ::msgcat::mcset de {or center of data} {oder Zentrum der Daten} ::msgcat::mcset de {rainbow} ::msgcat::mcset de {red} ::msgcat::mcset de {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom iso8859-1 {Datenreihen wurden heruntergeladen. Mehr sind vielleicht verfgbar. Sie knnen die maximale Anzahl anpassen.}] ::msgcat::mcset de {r} ::msgcat::mcset de {staircase} ::msgcat::mcset de {standard} ::msgcat::mcset de {x} ::msgcat::mcset de {} ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/es.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000124303 12600277755 015171� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset es {2D} ::msgcat::mcset es {3D} ::msgcat::mcset es {A postscript generation error has occurred} [encoding convertfrom iso8859-1 {Un error ha ocurrido en la generacin del fichero postscript}] ::msgcat::mcset es {AIP} ::msgcat::mcset es {Abort} ::msgcat::mcset es {About SAOImage DS9} {Acerca de SAOImage DS9} ::msgcat::mcset es {About} {Acerca de} ::msgcat::mcset es {Acknowledgment} {Reconocimientos} ::msgcat::mcset es {Add} {Agregar} ::msgcat::mcset es {Advanced} {Avanzado} ::msgcat::mcset es {Aligned} ::msgcat::mcset es {Align} {Alinear} ::msgcat::mcset es {All Columns} {Todas las columnas} ::msgcat::mcset es {All Rows} {Todas las filas} ::msgcat::mcset es {All} {Todas} ::msgcat::mcset es {Always save files during Backup} ::msgcat::mcset es {Amplifier} {Amplificador} ::msgcat::mcset es {An error has occurred during backup} ::msgcat::mcset es {An error has occurred during restore} ::msgcat::mcset es {An error has occurred invoking the Analysis task} [encoding convertfrom iso8859-1 {Un error ha ocurrido mientras se invocaba la tarea de anlisis}] ::msgcat::mcset es {An error has occurred while creating image.} ::msgcat::mcset es {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset es {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset es {An error has occurred while printing} {Un error ha ocurrido al imprimir} ::msgcat::mcset es {An error has occurred while reading image.} ::msgcat::mcset es {An error has occurred while saving} {Un error ha ocurrido al guardar} ::msgcat::mcset es {An error has occurred while updating VO server list} ::msgcat::mcset es {An error has occurred while writing image.} ::msgcat::mcset es {An internal error has been detected} ::msgcat::mcset es {Analysis Command Log} [encoding convertfrom iso8859-1 {Log de instrucciones de anlisis}] ::msgcat::mcset es {Analysis Commands} [encoding convertfrom iso8859-1 {Comandos de anlisis}] ::msgcat::mcset es {Analysis File} ::msgcat::mcset es {Analysis Log} ::msgcat::mcset es {Analysis} [encoding convertfrom iso8859-1 {Anlisis}] ::msgcat::mcset es {Angle Complement} [encoding convertfrom iso8859-1 {ngulo complementario}] ::msgcat::mcset es {Angles} [encoding convertfrom iso8859-1 {ngulos}] ::msgcat::mcset es {Angle} [encoding convertfrom iso8859-1 {ngulo}] ::msgcat::mcset es {Annuli} [encoding convertfrom iso8859-1 {nulos}] ::msgcat::mcset es {Annulus} {Corona} ::msgcat::mcset es {Apply} {Aplicar} ::msgcat::mcset es {ArcMin} {MinArc} ::msgcat::mcset es {ArcSec} {SegArc} ::msgcat::mcset es {Architecture} {Arquitectura} ::msgcat::mcset es {Archives} {Archivos} ::msgcat::mcset es {Array} ::msgcat::mcset es {Arrow} {Flecha} ::msgcat::mcset es {Astronomy} ::msgcat::mcset es {At Startup} ::msgcat::mcset es {At least 2 different catalogs are required} ::msgcat::mcset es {Auto Centroid} {Auto Centroide} ::msgcat::mcset es {Auto Plot 2D} ::msgcat::mcset es {Auto Plot 3D} ::msgcat::mcset es {Auto Plot Statistics} ::msgcat::mcset es {Auto Plot} ::msgcat::mcset es {Autoload FITS Regions} {Autocargar regiones FITS} ::msgcat::mcset es {Autoload} ::msgcat::mcset es {Automatic} [encoding convertfrom iso8859-1 {Automtico}] ::msgcat::mcset es {Average} {Promedio} ::msgcat::mcset es {Axes Number} ::msgcat::mcset es {Axes Order} ::msgcat::mcset es {Axes Title} ::msgcat::mcset es {Axes} {Ejes} ::msgcat::mcset es {Axis Length} {Longitud del eje} ::msgcat::mcset es {Axis Numbers} [encoding convertfrom iso8859-1 {Nmeros de los ejes}] ::msgcat::mcset es {Axis Title} ::msgcat::mcset es {Axis} {Eje} ::msgcat::mcset es {Azimuth} ::msgcat::mcset es {Background Color} {Color de fondo} ::msgcat::mcset es {Background} {Fondo} ::msgcat::mcset es {Backup} ::msgcat::mcset es {Back} [encoding convertfrom iso8859-1 {Para atrs}] ::msgcat::mcset es {Bar Plot Tool} ::msgcat::mcset es {Bias} ::msgcat::mcset es {Bin 3rd Column} {Bin tercera columna} ::msgcat::mcset es {Bin Center} {Centro del bin} ::msgcat::mcset es {Bin Columns} {Columnas del bin} ::msgcat::mcset es {Bin Filter} {Filtro del bin} ::msgcat::mcset es {Bin Fit} ::msgcat::mcset es {Bin In} ::msgcat::mcset es {Bin Out} ::msgcat::mcset es {Binning Parameters} [encoding convertfrom iso8859-1 {Parmetros de resolucin}] ::msgcat::mcset es {Bin} ::msgcat::mcset es {Black} {Negro} ::msgcat::mcset es {Blank/Inf/NaN Color} {Color en blanco/Inf/NaN} ::msgcat::mcset es {Blink Frames} {Parpadear Marcos} ::msgcat::mcset es {Blink Interval} {Intervalo de parpadeo} ::msgcat::mcset es {Blink} {Parpadear} ::msgcat::mcset es {Block Fit} ::msgcat::mcset es {Block In} {Bin a} ::msgcat::mcset es {Block Out} {Bin de} ::msgcat::mcset es {Block Parameters} ::msgcat::mcset es {Block} {Bin} ::msgcat::mcset es {Blue} {Azul} ::msgcat::mcset es {Bold} {Negrilla} ::msgcat::mcset es {Border} {Borde} ::msgcat::mcset es {Bottom} ::msgcat::mcset es {Box Annulus} {Caja con caja inscrita} ::msgcat::mcset es {Box Panda} {Caja con caja inscrita segmetada} ::msgcat::mcset es {BoxCircle} ::msgcat::mcset es {Boxcar} ::msgcat::mcset es {Box} {Casilla} ::msgcat::mcset es {Broadcast} ::msgcat::mcset es {Browser} ::msgcat::mcset es {Browse} ::msgcat::mcset es {Buffer} ::msgcat::mcset es {Buttonbar} ::msgcat::mcset es {Buttons} {Teclas} ::msgcat::mcset es {Bytes} ::msgcat::mcset es {CMYK} ::msgcat::mcset es {Can Delete} {Puede suprimir} ::msgcat::mcset es {Can Edit} {Puede editar} ::msgcat::mcset es {Can Move} {Puede mover} ::msgcat::mcset es {Can Rotate} {Puede rotar} ::msgcat::mcset es {Cancel} {Cancelar} ::msgcat::mcset es {Cap} ::msgcat::mcset es {Catalog Server} [encoding convertfrom iso8859-1 {Servidor de catlogo}] ::msgcat::mcset es {Catalog Tool} [encoding convertfrom iso8859-1 {Herramienta de catlogo}] ::msgcat::mcset es {Catalogs} [encoding convertfrom iso8859-1 {Catlogos}] ::msgcat::mcset es {Catalog} [encoding convertfrom iso8859-1 {Catlogo}] ::msgcat::mcset es {Catrom} ::msgcat::mcset es {Cat} ::msgcat::mcset es {Center Image} {Centrar imagen} ::msgcat::mcset es {Center Non-modal Dialogs} ::msgcat::mcset es {Center} {Centrar} ::msgcat::mcset es {Centroid Parameters} [encoding convertfrom iso8859-1 {Prametros del centroide}] ::msgcat::mcset es {Centroid} {Centroide} ::msgcat::mcset es {Circle} [encoding convertfrom iso8859-1 {Crculo}] ::msgcat::mcset es {Clear All} {Despejar todos} ::msgcat::mcset es {Clear Analysis Commands} {Borrar las instrucciones de anlisis} ::msgcat::mcset es {Clear Cache} {Limpiar cache} ::msgcat::mcset es {Clear Data} {Limpiar de datos} ::msgcat::mcset es {Clear External Analysis Commands?} [encoding convertfrom iso8859-1 {Borrar las instrucciones externas de anlisis?}] ::msgcat::mcset es {Clear Filter} {Borrar filtro} ::msgcat::mcset es {Clear Frame} {Despejar marco} ::msgcat::mcset es {Clear Preferences?} [encoding convertfrom iso8859-1 {Limpiar las preferencias?}] ::msgcat::mcset es {Clear Preferences} {Limpiar las preferencias} ::msgcat::mcset es {Clear} {Vaciar} ::msgcat::mcset es {Click to Center} {Clic para centrar} ::msgcat::mcset es {Close} {Cerrar} ::msgcat::mcset es {Colorbar Size} ::msgcat::mcset es {Colorbar} {Barra de colores} ::msgcat::mcset es {Colormap Parameters} [encoding convertfrom iso8859-1 {Parmetros del mapa de colores}] ::msgcat::mcset es {Colormap} {Mapa de colores} ::msgcat::mcset es {Color} ::msgcat::mcset es {Columns} {Columnas} ::msgcat::mcset es {Column} {Columna} ::msgcat::mcset es {Command} ::msgcat::mcset es {Compass} [encoding convertfrom iso8859-1 {Comps}] ::msgcat::mcset es {Composite Region} ::msgcat::mcset es {Composite} {Compuesto} ::msgcat::mcset es {Compression} [encoding convertfrom iso8859-1 {Compresin}] ::msgcat::mcset es {Configure} {Configurar} ::msgcat::mcset es {Connect Directly} {Conecta directamente} ::msgcat::mcset es {Connect SAMP} ::msgcat::mcset es {Connect Using Web Proxy} {Conecta, usa Web Proxy} ::msgcat::mcset es {Connect} ::msgcat::mcset es {Console} ::msgcat::mcset es {Contour Parameters} [encoding convertfrom iso8859-1 {Parmetros de contorno}] ::msgcat::mcset es {Contours} {Contornos} ::msgcat::mcset es {Contour} ::msgcat::mcset es {Contrast} {Contraste} ::msgcat::mcset es {Convert to Polygons} [encoding convertfrom iso8859-1 {Convertir a polgonos}] ::msgcat::mcset es {Coordinate Grid Parameters} [encoding convertfrom iso8859-1 {Parmetros de la cuadrcula de coordenadas}] ::msgcat::mcset es {Coordinate Grid} [encoding convertfrom iso8859-1 {Cuadrcula de coordenadas}] ::msgcat::mcset es {Coordinate System} {Sistema de coordenadas} ::msgcat::mcset es {Coordinates} {Coordenadas} ::msgcat::mcset es {Coordinate} {Coordenada} ::msgcat::mcset es {Copy Contours} {Copiar contornos} ::msgcat::mcset es {Copy to Regions} {Copiar a regiones} ::msgcat::mcset es {Copy} {Copiar} ::msgcat::mcset es {Create Movie} ::msgcat::mcset es {Create New Frame on Download} {Crear un nuevo marco al transferir} ::msgcat::mcset es {Create} ::msgcat::mcset es {Crop Parameters} ::msgcat::mcset es {Crop} ::msgcat::mcset es {Crosshair Parameters} ::msgcat::mcset es {Crosshair To} {Localizar con punto de mira} ::msgcat::mcset es {Crosshair} {Punto de mira} ::msgcat::mcset es {Cross} {Cruz} ::msgcat::mcset es {Cubehelix} ::msgcat::mcset es {Cube} ::msgcat::mcset es {Cubic} ::msgcat::mcset es {Current Frame} {Marco actual} ::msgcat::mcset es {Current Range} {Rango actual} ::msgcat::mcset es {Current} {Actual} ::msgcat::mcset es {Cursor} ::msgcat::mcset es {Cut} {Corte} ::msgcat::mcset es {Cyan} {Cian} ::msgcat::mcset es {DPI} ::msgcat::mcset es {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset es {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset es {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset es {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-1 {DS9 ha detectado un fichero de preferencias ms antiguo, Desea actualizarlo?}] ::msgcat::mcset es {DS9 will complete the initialization process} [encoding convertfrom iso8859-1 {DS9 completar el proceso de inicializacin}] ::msgcat::mcset es {Dash} [encoding convertfrom iso8859-1 {Guin}] ::msgcat::mcset es {Data Format} {Formato de los datos} ::msgcat::mcset es {Dataset Name} ::msgcat::mcset es {Dataset} {Conjunto de datos} ::msgcat::mcset es {Data} ::msgcat::mcset es {Decrease} [encoding convertfrom iso8859-1 {Disminucin}] ::msgcat::mcset es {Default All Files} ::msgcat::mcset es {Default Format} ::msgcat::mcset es {Default Length} ::msgcat::mcset es {Default} {Por defecto} ::msgcat::mcset es {Degrees} {Grados} ::msgcat::mcset es {Delete All Frames?} [encoding convertfrom iso8859-1 {Borrar todos los marcos?}] ::msgcat::mcset es {Delete All Frames} {Borrar todos los marcos} ::msgcat::mcset es {Delete All Groups?} [encoding convertfrom iso8859-1 {Borrar todos los grupos?}] ::msgcat::mcset es {Delete All Groups} {Borrar todos los grupos} ::msgcat::mcset es {Delete All Regions?} [encoding convertfrom iso8859-1 {Borrar todas las regiones?}] ::msgcat::mcset es {Delete All Regions} {Borrar todas las regiones} ::msgcat::mcset es {Delete All} ::msgcat::mcset es {Delete Color Tags} ::msgcat::mcset es {Delete Frame} {Borrar marco} ::msgcat::mcset es {Delete Group} {Borrar grupo} ::msgcat::mcset es {Delete Selected Regions} {Borrar regiones seleccionadas} ::msgcat::mcset es {Delete} {Borrar} ::msgcat::mcset es {Depth} {Profundidad} ::msgcat::mcset es {Detector} ::msgcat::mcset es {Dialog Box} [encoding convertfrom iso8859-1 {Caja de dilogo}] ::msgcat::mcset es {Diamond} {Diamante} ::msgcat::mcset es {Dimension} [encoding convertfrom iso8859-1 {Dimensin}] ::msgcat::mcset es {Direction} ::msgcat::mcset es {Disconnect} ::msgcat::mcset es {Display Header} ::msgcat::mcset es {Display Size} [encoding convertfrom iso8859-1 {Mostrar el tamao}] ::msgcat::mcset es {Dissolve} {Disolver} ::msgcat::mcset es {Distance} ::msgcat::mcset es {Download Colormap} ::msgcat::mcset es {Download VOTABLE format if available} ::msgcat::mcset es {Drag to Center} {Arrastrar para centrar} ::msgcat::mcset es {Duplicate Data} ::msgcat::mcset es {East} {Este} ::msgcat::mcset es {Ecliptic} [encoding convertfrom iso8859-1 {Eclptica}] ::msgcat::mcset es {Edit Group Name} {Editar el nombre del grupo} ::msgcat::mcset es {Edit} {Editar} ::msgcat::mcset es {Elevation} [encoding convertfrom iso8859-1 {Elevacin}] ::msgcat::mcset es {Ellipse Annulus} ::msgcat::mcset es {Ellipse Panda} {Elipse con elipse inscrita segmentada} ::msgcat::mcset es {Ellipse} {Elipse} ::msgcat::mcset es {Elliptical Annulus} {Elipse con elipse inscrita} ::msgcat::mcset es {Elliptical Panda} [encoding convertfrom iso8859-1 {Elipse con elipse inscrita segmentada}] ::msgcat::mcset es {Enable Confirmation Dialogs} [encoding convertfrom iso8859-1 {Habilitar los dilogos de confirmacin}] ::msgcat::mcset es {Enable} ::msgcat::mcset es {End} ::msgcat::mcset es {Enter Color} {Entrar color} ::msgcat::mcset es {Enter Font Size} ::msgcat::mcset es {Enter Group Name} {Entrar nombre de grupo} ::msgcat::mcset es {Enter Search Expression} [encoding convertfrom iso8859-1 {Entrar expresin de bsqueda}] ::msgcat::mcset es {Enter URL} ::msgcat::mcset es {Entry} {Entrada} ::msgcat::mcset es {Equal Area} {Misma rea} ::msgcat::mcset es {Equal Distance} {Misma distancia} ::msgcat::mcset es {Equal Spacing} ::msgcat::mcset es {Equal Value} ::msgcat::mcset es {Error code was returned} [encoding convertfrom iso8859-1 {Error de cdigo fue regresado}] ::msgcat::mcset es {Error} ::msgcat::mcset es {Examine Frame} {Examinar marco} ::msgcat::mcset es {Examine} {Examinar} ::msgcat::mcset es {Exam} ::msgcat::mcset es {Exclude} {Excluir} ::msgcat::mcset es {Executing TCL code is not enabled} ::msgcat::mcset es {Exit} {Salir} ::msgcat::mcset es {Export Array} ::msgcat::mcset es {Export} ::msgcat::mcset es {Extention} ::msgcat::mcset es {Exterior Axes} {Ejes exteriores} ::msgcat::mcset es {Exterior Numerics} {Numeracin exterior} ::msgcat::mcset es {FAQ} ::msgcat::mcset es {FK4} ::msgcat::mcset es {FK5} ::msgcat::mcset es {Factor} ::msgcat::mcset es {File not Found or Unable to load FITS data MIME type} {Fichero no hallado o incapaz de cargar datos FITS de tipo MIME} ::msgcat::mcset es {Filename} {Nombre del fichero} ::msgcat::mcset es {File} {Fichero} ::msgcat::mcset es {Fill} ::msgcat::mcset es {Filter} {Filtro} ::msgcat::mcset es {Find Next} {Hallar la siguiente} ::msgcat::mcset es {Find} {Hallar} ::msgcat::mcset es {First Frame} {Primer Marco} ::msgcat::mcset es {First} {Primer} ::msgcat::mcset es {Fits} ::msgcat::mcset es {Fixed in Size} [encoding convertfrom iso8859-1 {Fijado en tamao}] ::msgcat::mcset es {Flat} ::msgcat::mcset es {Flip} ::msgcat::mcset es {Font} {Fuente} ::msgcat::mcset es {For more information, use --help} ::msgcat::mcset es {Format} {Formato} ::msgcat::mcset es {Forward} {Hacia adelante} ::msgcat::mcset es {Found} {Hallado} ::msgcat::mcset es {Frame Information} [encoding convertfrom iso8859-1 {Informacin del marco}] ::msgcat::mcset es {Frame Parameters} ::msgcat::mcset es {Frames} ::msgcat::mcset es {Frame} {Marco} ::msgcat::mcset es {From} ::msgcat::mcset es {Front} {Al frente} ::msgcat::mcset es {Full Range} {Rango completo} ::msgcat::mcset es {Function} [encoding convertfrom iso8859-1 {Funcin}] ::msgcat::mcset es {GUI Font} ::msgcat::mcset es {Galactic} [encoding convertfrom iso8859-1 {Galctico}] ::msgcat::mcset es {Gap} ::msgcat::mcset es {Gaussian} {Gausiana} ::msgcat::mcset es {General} ::msgcat::mcset es {Generate} {Generar} ::msgcat::mcset es {Generating Regions} {Generando regiones} ::msgcat::mcset es {Get Information} [encoding convertfrom iso8859-1 {Obtener informacin}] ::msgcat::mcset es {Gist} ::msgcat::mcset es {Global Properties} ::msgcat::mcset es {Global} ::msgcat::mcset es {Goto Frame} ::msgcat::mcset es {Graph Horz} ::msgcat::mcset es {Graph Vert} ::msgcat::mcset es {Graphics} [encoding convertfrom iso8859-1 {Grficos}] ::msgcat::mcset es {Graphs} ::msgcat::mcset es {Graph} [encoding convertfrom iso8859-1 {Grfica}] ::msgcat::mcset es {Grayscale} {Escala de grises} ::msgcat::mcset es {Green} {Verde} ::msgcat::mcset es {Grid Gap} [encoding convertfrom iso8859-1 {Espaciado de la cuadrcula}] ::msgcat::mcset es {Grid} [encoding convertfrom iso8859-1 {Cuadrcula}] ::msgcat::mcset es {Groove} ::msgcat::mcset es {Groups} {Grupos} ::msgcat::mcset es {HTTP} ::msgcat::mcset es {Header} {Cabecera} ::msgcat::mcset es {Height} {Altura} ::msgcat::mcset es {Help Desk} {Mesa de ayuda} ::msgcat::mcset es {Help Me Choose} {Ayudame a escoger} ::msgcat::mcset es {Help} {Ayuda} ::msgcat::mcset es {Hide All} {Ocultar todos} ::msgcat::mcset es {Highlite} ::msgcat::mcset es {High} {Alto} ::msgcat::mcset es {Histogram Equalization} [encoding convertfrom iso8859-1 {Ecualizacin de histograma}] ::msgcat::mcset es {Histogram} {Histograma} ::msgcat::mcset es {Horizontal Graph} [encoding convertfrom iso8859-1 {Grfica horizontal}] ::msgcat::mcset es {Horizontal Layout} [encoding convertfrom iso8859-1 {Distribucin horizontal}] ::msgcat::mcset es {Horizontal} ::msgcat::mcset es {IAU Location Code} ::msgcat::mcset es {ICRS} ::msgcat::mcset es {Identification} {Identificacin} ::msgcat::mcset es {If} {Si} ::msgcat::mcset es {Image Servers} {Servidores de imagen} ::msgcat::mcset es {Image} {Imagen} ::msgcat::mcset es {Import Array} ::msgcat::mcset es {Import} ::msgcat::mcset es {Include} {Incluir} ::msgcat::mcset es {Increase} {Aumento} ::msgcat::mcset es {Information Panel} [encoding convertfrom iso8859-1 {Panel de informacin}] ::msgcat::mcset es {Information} [encoding convertfrom iso8859-1 {Informacin}] ::msgcat::mcset es {Initialize XPA} {Inicializar XPA} ::msgcat::mcset es {Inner} {Interior} ::msgcat::mcset es {Instrument FOV} {Campo visual del instrumento} ::msgcat::mcset es {Interior Axes} {Ejes interiores} ::msgcat::mcset es {Interior Numerics} [encoding convertfrom iso8859-1 {Numeracin interior}] ::msgcat::mcset es {Internal Parse Error} ::msgcat::mcset es {Interval} {Intervalo} ::msgcat::mcset es {Invalid Column Name} ::msgcat::mcset es {Invalid formated multipart/mixed mime type message} ::msgcat::mcset es {Invert Colormap} {Invertir mapa de colores} ::msgcat::mcset es {Invert Selection} [encoding convertfrom iso8859-1 {Invertir seleccin}] ::msgcat::mcset es {Invert} {Invertir} ::msgcat::mcset es {Italic} [encoding convertfrom iso8859-1 {Itlica}] ::msgcat::mcset es {Items Found} [encoding convertfrom iso8859-1 {Artculos hallados}] ::msgcat::mcset es {Iteration} [encoding convertfrom iso8859-1 {Iteracin}] ::msgcat::mcset es {JPEG Quality Factor} {Factor de calidad JPEG} ::msgcat::mcset es {Keep-Alive} ::msgcat::mcset es {Kernel} ::msgcat::mcset es {Keyboard Shortcuts} {Atajos con el teclado} ::msgcat::mcset es {Keyboard} {Teclado} ::msgcat::mcset es {Keyword} ::msgcat::mcset es {Labels} {Etiquetas} ::msgcat::mcset es {Label} {Etiqueta} ::msgcat::mcset es {Landscape} {Apaisado} ::msgcat::mcset es {Language} {Idioma} ::msgcat::mcset es {Last Frame} [encoding convertfrom iso8859-1 {ltimo marco}] ::msgcat::mcset es {Last} [encoding convertfrom iso8859-1 {ltimo}] ::msgcat::mcset es {Layout Horz} ::msgcat::mcset es {Layout Vert} ::msgcat::mcset es {Layout} ::msgcat::mcset es {Left} ::msgcat::mcset es {Legal} ::msgcat::mcset es {Legend Title} ::msgcat::mcset es {Legend} ::msgcat::mcset es {Length} {Longitud} ::msgcat::mcset es {Letter} ::msgcat::mcset es {Levels} {Niveles} ::msgcat::mcset es {Level} {Nivel} ::msgcat::mcset es {Limits} [encoding convertfrom iso8859-1 {Lmites}] ::msgcat::mcset es {Line Plot Tool} ::msgcat::mcset es {Linear} {Lineal} ::msgcat::mcset es {Line} [encoding convertfrom iso8859-1 {Lnea}] ::msgcat::mcset es {List Data} ::msgcat::mcset es {List Regions} {Listar regiones} ::msgcat::mcset es {List} {Listar} ::msgcat::mcset es {Load Analysis Commands} [encoding convertfrom iso8859-1 {Cargar las instrucciones de anlisis}] ::msgcat::mcset es {Load Color Tags} ::msgcat::mcset es {Load Colormap} {Cargar mapa de colores} ::msgcat::mcset es {Load Configuration} [encoding convertfrom iso8859-1 {Cargar configuracin}] ::msgcat::mcset es {Load Contour Levels} {Cargar niveles de contorno} ::msgcat::mcset es {Load Contours} {Cargar contornos} ::msgcat::mcset es {Load Contrast/Bias} {Cargar contraste/Bias} ::msgcat::mcset es {Load Data} {Cargar datos} ::msgcat::mcset es {Load Mosaic} {Cargar mosaico} ::msgcat::mcset es {Load Regions} {Cargar regiones} ::msgcat::mcset es {Load Template} {Cargar modelo} ::msgcat::mcset es {Load into All Frames} ::msgcat::mcset es {Load into Current Frame} ::msgcat::mcset es {Loading Catalog} ::msgcat::mcset es {Loading} ::msgcat::mcset es {Load} {Cargar} ::msgcat::mcset es {Local} ::msgcat::mcset es {Lock Axes} ::msgcat::mcset es {Lock Bin} ::msgcat::mcset es {Lock Color} ::msgcat::mcset es {Lock Crop Amplifier} ::msgcat::mcset es {Lock Crop Detector} ::msgcat::mcset es {Lock Crop Image} ::msgcat::mcset es {Lock Crop None} ::msgcat::mcset es {Lock Crop Physical} ::msgcat::mcset es {Lock Crop WCS} ::msgcat::mcset es {Lock Crosshair Amplifier} ::msgcat::mcset es {Lock Crosshair Detector} ::msgcat::mcset es {Lock Crosshair Image} ::msgcat::mcset es {Lock Crosshair None} ::msgcat::mcset es {Lock Crosshair Physical} ::msgcat::mcset es {Lock Crosshair WCS} ::msgcat::mcset es {Lock Frame Amplifier} ::msgcat::mcset es {Lock Frame Detector} ::msgcat::mcset es {Lock Frame Image} ::msgcat::mcset es {Lock Frame None} ::msgcat::mcset es {Lock Frame Physical} ::msgcat::mcset es {Lock Frame WCS} ::msgcat::mcset es {Lock Limits} ::msgcat::mcset es {Lock Scale} ::msgcat::mcset es {Lock Slice Image} ::msgcat::mcset es {Lock Slice None} ::msgcat::mcset es {Lock Slice WCS} ::msgcat::mcset es {Lock Smooth} ::msgcat::mcset es {Lock} {Bloquear} ::msgcat::mcset es {Log Exponent} ::msgcat::mcset es {Log} ::msgcat::mcset es {Low High} {Bajo Alto} ::msgcat::mcset es {Lower Left Back} ::msgcat::mcset es {Lower Left Front} ::msgcat::mcset es {Lower Right Back} ::msgcat::mcset es {Lower Right Front} ::msgcat::mcset es {Low} {Bajo} ::msgcat::mcset es {MIP} ::msgcat::mcset es {Magenta} ::msgcat::mcset es {Magnification} ::msgcat::mcset es {Magnifier} {Ventanilla magnificadora} ::msgcat::mcset es {Major} {Mayor} ::msgcat::mcset es {Manual} ::msgcat::mcset es {Mask Parameters} [encoding convertfrom iso8859-1 {Parmetros de mascara}] ::msgcat::mcset es {Match Axes} ::msgcat::mcset es {Match Bin} ::msgcat::mcset es {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset es {Match Color} ::msgcat::mcset es {Match Crop Amplifier} ::msgcat::mcset es {Match Crop Detector} ::msgcat::mcset es {Match Crop Image} ::msgcat::mcset es {Match Crop Physical} ::msgcat::mcset es {Match Crop WCS} ::msgcat::mcset es {Match Crosshair Amplifier} ::msgcat::mcset es {Match Crosshair Detector} ::msgcat::mcset es {Match Crosshair Image} ::msgcat::mcset es {Match Crosshair Physical} ::msgcat::mcset es {Match Crosshair WCS} ::msgcat::mcset es {Match Frame Amplifier} ::msgcat::mcset es {Match Frame Detector} ::msgcat::mcset es {Match Frame Image} ::msgcat::mcset es {Match Frame Physical} ::msgcat::mcset es {Match Frame WCS} ::msgcat::mcset es {Match Limits} ::msgcat::mcset es {Match Scale} ::msgcat::mcset es {Match Slice Image} ::msgcat::mcset es {Match Slice WCS} ::msgcat::mcset es {Match Smooth} ::msgcat::mcset es {Match} ::msgcat::mcset es {Math Function} [encoding convertfrom iso8859-1 {Funcin matemtica}] ::msgcat::mcset es {Matplotlib} ::msgcat::mcset es {Max Rows} [encoding convertfrom iso8859-1 {Mx filas}] ::msgcat::mcset es {Max} [encoding convertfrom iso8859-1 {Mx}] ::msgcat::mcset es {Menus and Buttons} ::msgcat::mcset es {Menu} ::msgcat::mcset es {Message Log} ::msgcat::mcset es {Method} [encoding convertfrom iso8859-1 {Mtodo}] ::msgcat::mcset es {Min Max Parameters} ::msgcat::mcset es {Min Max} [encoding convertfrom iso8859-1 {Mn Mx}] ::msgcat::mcset es {Minor} {Menor} ::msgcat::mcset es {Minutes} ::msgcat::mcset es {Min} [encoding convertfrom iso8859-1 {Mn}] ::msgcat::mcset es {Mission} [encoding convertfrom iso8859-1 {Misin}] ::msgcat::mcset es {Mode} ::msgcat::mcset es {Mosaic IRAF Segment} ::msgcat::mcset es {Mosaic IRAF} ::msgcat::mcset es {Mosaic WCS Segment} ::msgcat::mcset es {Mosaic WCS} ::msgcat::mcset es {Mosaic WFPC2} ::msgcat::mcset es {Mosaic} ::msgcat::mcset es {Mouse Click Epsilon} ::msgcat::mcset es {Mouse Wheel Bin} ::msgcat::mcset es {Mouse Wheel Zoom} ::msgcat::mcset es {Mouse and Keyboard} ::msgcat::mcset es {Move Back} [encoding convertfrom iso8859-1 {Mover atrs}] ::msgcat::mcset es {Move First} {Mover al primero} ::msgcat::mcset es {Move Forward} {Mover adelante} ::msgcat::mcset es {Move Frame} ::msgcat::mcset es {Move Last} [encoding convertfrom iso8859-1 {Mover al ltimo}] ::msgcat::mcset es {Move to Back} [encoding convertfrom iso8859-1 {Poner detrs}] ::msgcat::mcset es {Move to Front} {Poner delante} ::msgcat::mcset es {Movie} ::msgcat::mcset es {Multiple Extension Cube} ::msgcat::mcset es {Multiple Extension Frames} ::msgcat::mcset es {Multiple WCS} [encoding convertfrom iso8859-1 {Mltiple WCS}] ::msgcat::mcset es {NRRD} ::msgcat::mcset es {Name Resolution} [encoding convertfrom iso8859-1 {Conversin a coordenadas}] ::msgcat::mcset es {Name Server} {Nombre del servidor} ::msgcat::mcset es {Name or Designation} [encoding convertfrom iso8859-1 {Nombre o designacin}] ::msgcat::mcset es {Name} ::msgcat::mcset es {Native Dialog} [encoding convertfrom iso8859-1 {Dilogo nativo}] ::msgcat::mcset es {New Features} [encoding convertfrom iso8859-1 {Nuevas caractersticas}] ::msgcat::mcset es {New Frame 3D} {Nuevo Marco 3D} ::msgcat::mcset es {New Frame RGB} {Nuevo marco RGB} ::msgcat::mcset es {New Frame each Time} {Nuevo marco cada vez} ::msgcat::mcset es {New Frame} {Nuevo marco} ::msgcat::mcset es {New Group} {Nuevo grupo} ::msgcat::mcset es {New} {Nuevo} ::msgcat::mcset es {Next Frame} {Siguiente Marco} ::msgcat::mcset es {Next} {Siguiente} ::msgcat::mcset es {No Catalog specified} [encoding convertfrom iso8859-1 {No se ha especificado el catlogo}] ::msgcat::mcset es {No Items Found} [encoding convertfrom iso8859-1 {Artculos no encontrados}] ::msgcat::mcset es {No current frame} ::msgcat::mcset es {No data available at } {No hay datos disponibles en} ::msgcat::mcset es {Non-zero} {No nulo} ::msgcat::mcset es {None} {Nada} ::msgcat::mcset es {Normal} ::msgcat::mcset es {North} {Norte} ::msgcat::mcset es {Not Found} ::msgcat::mcset es {Number of Samples} [encoding convertfrom iso8859-1 {Nmero de muestreos}] ::msgcat::mcset es {Number of Threads} ::msgcat::mcset es {Number of Ticks} ::msgcat::mcset es {Number} [encoding convertfrom iso8859-1 {Nmero}] ::msgcat::mcset es {Numerics} [encoding convertfrom iso8859-1 {Numeracin}] ::msgcat::mcset es {OK} {Vale} ::msgcat::mcset es {Object} {Objeto} ::msgcat::mcset es {Open File} {Abrir fichero} ::msgcat::mcset es {Open TCL Console} {Abrir consola TCL} ::msgcat::mcset es {Open URL} {Abrir URL} ::msgcat::mcset es {Open as} ::msgcat::mcset es {Open} {Abrir} ::msgcat::mcset es {Operator} {Operador} ::msgcat::mcset es {Orientation} [encoding convertfrom iso8859-1 {Orientacin}] ::msgcat::mcset es {Origin} ::msgcat::mcset es {Oscillate} ::msgcat::mcset es {Other Color} ::msgcat::mcset es {Other Font Size} ::msgcat::mcset es {Other} {Otro} ::msgcat::mcset es {Outer} {Exterior} ::msgcat::mcset es {Overlap} ::msgcat::mcset es {PS Page Setup} [encoding convertfrom iso8859-1 {Setup para Pgina PS}] ::msgcat::mcset es {PS Print} {Imprimir PS} ::msgcat::mcset es {Page Setup} [encoding convertfrom iso8859-1 {Formato de pgina}] ::msgcat::mcset es {Page Source} [encoding convertfrom iso8859-1 {Fuente HTML de la pgina}] ::msgcat::mcset es {Pan To} {Trasladar a} ::msgcat::mcset es {Pan Zoom Rotate Parameters} [encoding convertfrom iso8859-1 {Parmetros de traslacin, Zoom y rotacin}] ::msgcat::mcset es {Pan Zoom} ::msgcat::mcset es {Pan then Zoom} [encoding convertfrom iso8859-1 {Trasladar y despus Zoom}] ::msgcat::mcset es {Panda} {Corona segmentada} ::msgcat::mcset es {Panner} [encoding convertfrom iso8859-1 {Ventanilla panormica}] ::msgcat::mcset es {Pan} {Trasladar} ::msgcat::mcset es {Parameters} [encoding convertfrom iso8859-1 {Parmetros}] ::msgcat::mcset es {Password} [encoding convertfrom iso8859-1 {Contrasea}] ::msgcat::mcset es {Paste Contours} {Pegar contornos} ::msgcat::mcset es {Paste} {Pegar} ::msgcat::mcset es {Physical} [encoding convertfrom iso8859-1 {Fsica}] ::msgcat::mcset es {Pixel Distribution} [encoding convertfrom iso8859-1 {Distribucin por pxeles}] ::msgcat::mcset es {Pixel Size} [encoding convertfrom iso8859-1 {Tamao del pxel}] ::msgcat::mcset es {Pixel Table} [encoding convertfrom iso8859-1 {Tabla en pxeles}] ::msgcat::mcset es {Pixels} [encoding convertfrom iso8859-1 {Pxeles}] ::msgcat::mcset es {Play} ::msgcat::mcset es {Please Select a Region} ::msgcat::mcset es {Please specify width, height, and either name or (ra,dec)} {Por farvor, especifique el ancho, altura, y nombre o (A.R.,Dec.)} ::msgcat::mcset es {Plot 2D} ::msgcat::mcset es {Plot 3D} ::msgcat::mcset es {Plot Title} [encoding convertfrom iso8859-1 {Ttulo de la grfica}] ::msgcat::mcset es {Plotting Regions} {Dibujando regiones} ::msgcat::mcset es {Plot} ::msgcat::mcset es {Plus} [encoding convertfrom iso8859-1 {Ms}] ::msgcat::mcset es {Pointer} {Indicador} ::msgcat::mcset es {Points} [encoding convertfrom iso8859-1 {Posicin}] ::msgcat::mcset es {Point} [encoding convertfrom iso8859-1 {Posicin}] ::msgcat::mcset es {Polygon} [encoding convertfrom iso8859-1 {Polgono}] ::msgcat::mcset es {Portrait} ::msgcat::mcset es {Poster} [encoding convertfrom iso8859-1 {Pster}] ::msgcat::mcset es {Postscript Page Setup} [encoding convertfrom iso8859-1 {Setup para Pgina Postscript}] ::msgcat::mcset es {Postscript Print} {Imprimir Postscript} ::msgcat::mcset es {Postscript} ::msgcat::mcset es {Power} {Potencia} ::msgcat::mcset es {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} {Las preferencias han sido restauradas a sus valores por defecto. Por favor reanude DS9 para que estos cambios tengan efecto.} ::msgcat::mcset es {Preferences} {Preferencias} ::msgcat::mcset es {Preserve During Load} {Conservar mientras se carga} ::msgcat::mcset es {Previous Frame} {Marco Previo} ::msgcat::mcset es {Previous} {Previo} ::msgcat::mcset es {Prev} ::msgcat::mcset es {Print Coordinates} {Imprimir coordenadas} ::msgcat::mcset es {Print To} {Imprimir en} ::msgcat::mcset es {Printer} {Impresora} ::msgcat::mcset es {Print} {Imprimir} ::msgcat::mcset es {Projection} [encoding convertfrom iso8859-1 {Proyeccin}] ::msgcat::mcset es {Properties} {Propiedades} ::msgcat::mcset es {Property} {Propiedad} ::msgcat::mcset es {Proxy Host} ::msgcat::mcset es {Proxy Port} ::msgcat::mcset es {Publication} [encoding convertfrom iso8859-1 {Publicacin}] ::msgcat::mcset es {Quadratic} [encoding convertfrom iso8859-1 {Cuadrtico}] ::msgcat::mcset es {RGB Array} ::msgcat::mcset es {RGB Cube} ::msgcat::mcset es {RGB Image} ::msgcat::mcset es {RGB} ::msgcat::mcset es {Radial Profile} ::msgcat::mcset es {Radial} ::msgcat::mcset es {Radius} {Radio} ::msgcat::mcset es {Raised} ::msgcat::mcset es {Range} ::msgcat::mcset es {Redo} {Rehacer} ::msgcat::mcset es {Red} {Rojo} ::msgcat::mcset es {Reference Manual} {Manual de referencia} ::msgcat::mcset es {Reference} {Manual} ::msgcat::mcset es {Refresh Frame} {Refrescar marco} ::msgcat::mcset es {Refresh} {Refrescar} ::msgcat::mcset es {Region Parameters} ::msgcat::mcset es {Region} [encoding convertfrom iso8859-1 {Regin}] ::msgcat::mcset es {Release Notes} [encoding convertfrom iso8859-1 {Notas de esta versin}] ::msgcat::mcset es {Release} [encoding convertfrom iso8859-1 {Versin}] ::msgcat::mcset es {Relief} ::msgcat::mcset es {Reload} {Recargar} ::msgcat::mcset es {Render} ::msgcat::mcset es {Repeat} ::msgcat::mcset es {Reset Colormap} {Restaurar el mapa de colores} ::msgcat::mcset es {Reset Frame} {Restaurar Marco} ::msgcat::mcset es {Reset} ::msgcat::mcset es {Restore} ::msgcat::mcset es {Retrieve} {Localizar y leer} ::msgcat::mcset es {Return} ::msgcat::mcset es {Right} ::msgcat::mcset es {Roman} ::msgcat::mcset es {Rotate} {Rotar} ::msgcat::mcset es {Rows} {Filas} ::msgcat::mcset es {Row} ::msgcat::mcset es {Ruler} {Regla} ::msgcat::mcset es {SAMP Image} ::msgcat::mcset es {SAMP Table} ::msgcat::mcset es {SAMP: already connected} ::msgcat::mcset es {SAMP: internal error} ::msgcat::mcset es {SAMP: not connected} ::msgcat::mcset es {SAMP: unable to locate HUB} ::msgcat::mcset es {SAMP} ::msgcat::mcset es {Sample Increment} {Incremento en el muestreo} ::msgcat::mcset es {Sample Parameters} [encoding convertfrom iso8859-1 {Parmetros de muestreo}] ::msgcat::mcset es {Samples per Line} [encoding convertfrom iso8859-1 {Muestreos por lnea}] ::msgcat::mcset es {Sample} {Muestreo} ::msgcat::mcset es {Save 3D Movie} ::msgcat::mcset es {Save Color Tags} ::msgcat::mcset es {Save Colormap} {Guardar mapa de colores} ::msgcat::mcset es {Save Configuration} [encoding convertfrom iso8859-1 {Guardar configuracin}] ::msgcat::mcset es {Save Contour Levels} {Guardar niveles de contorno} ::msgcat::mcset es {Save Contours} {Guardar contornos} ::msgcat::mcset es {Save Contrast/Bias} {Guardar contraste/Bias} ::msgcat::mcset es {Save Data} {Guardar datos} ::msgcat::mcset es {Save Image on Download} ::msgcat::mcset es {Save Image} {Guardar imagen} ::msgcat::mcset es {Save Regions} {Guardar regiones} ::msgcat::mcset es {Save Template} {Guardar modelo} ::msgcat::mcset es {Save as} ::msgcat::mcset es {Save} {Guardar} ::msgcat::mcset es {Scale Parameters} [encoding convertfrom iso8859-1 {Prametros de escala}] ::msgcat::mcset es {Scale and Limits} ::msgcat::mcset es {Scale} {Escala} ::msgcat::mcset es {Scan} {Escanear} ::msgcat::mcset es {Scatter Plot Tool} ::msgcat::mcset es {Scope} {Alcance} ::msgcat::mcset es {Search for Catalogs} [encoding convertfrom iso8859-1 {Buscar por catlogos}] ::msgcat::mcset es {Searching for catalogs} [encoding convertfrom iso8859-1 {Buscando por catlogos}] ::msgcat::mcset es {Seconds} {Segundos} ::msgcat::mcset es {Segment} ::msgcat::mcset es {Select All} {Seleccionar todos} ::msgcat::mcset es {Select Coordinate System } {Seleccionar el sistema de coordenadas} ::msgcat::mcset es {Select None} {Seleccionar nada} ::msgcat::mcset es {Select} ::msgcat::mcset es {Send} ::msgcat::mcset es {Server} {Servidor} ::msgcat::mcset es {Sexagesimal} ::msgcat::mcset es {Shape} {Forma} ::msgcat::mcset es {Show All} {Mostrarlos todos} ::msgcat::mcset es {Show Command} ::msgcat::mcset es {Show Compass} ::msgcat::mcset es {Show Text} {Mostrar Texto} ::msgcat::mcset es {Show/Hide Frames} {Mostar/ocultar marcos} ::msgcat::mcset es {Show} {Mostrar} ::msgcat::mcset es {Simple Cross} ::msgcat::mcset es {Simple Plus} ::msgcat::mcset es {Single Frame} [encoding convertfrom iso8859-1 {Un nico marco}] ::msgcat::mcset es {Single} [encoding convertfrom iso8859-1 {nico}] ::msgcat::mcset es {Sites} ::msgcat::mcset es {Size/Radius} [encoding convertfrom iso8859-1 {Tamao/Radio}] ::msgcat::mcset es {Size} [encoding convertfrom iso8859-1 {Tamao}] ::msgcat::mcset es {Skip First} {Omitir primeros} ::msgcat::mcset es {Slice} ::msgcat::mcset es {Smooth Parameters} [encoding convertfrom iso8859-1 {Parmetros de suavizado}] ::msgcat::mcset es {Smoothness} ::msgcat::mcset es {Smooth} {Suavizar} ::msgcat::mcset es {Solid} ::msgcat::mcset es {Sorry, DS9 does not support} {Lo siento, DS9 no admite} ::msgcat::mcset es {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset es {Sort} {Clasificar} ::msgcat::mcset es {Source TCL} [encoding convertfrom iso8859-1 {Leer cdigo TCL}] ::msgcat::mcset es {Source} {Fuente} ::msgcat::mcset es {Space Equal Distance} ::msgcat::mcset es {Space Equal Value} ::msgcat::mcset es {Spacing} {Espaciado} ::msgcat::mcset es {Sqrt} ::msgcat::mcset es {Square Root} [encoding convertfrom iso8859-1 {Raz cuadrada}] ::msgcat::mcset es {Squared} {Al cuadrado} ::msgcat::mcset es {Square} ::msgcat::mcset es {Stacked} ::msgcat::mcset es {Starbase} ::msgcat::mcset es {Startup} ::msgcat::mcset es {Start} {Empezar} ::msgcat::mcset es {Statistics} ::msgcat::mcset es {Stats} ::msgcat::mcset es {Status} {Estado} ::msgcat::mcset es {Step} {Escalonado} ::msgcat::mcset es {Stop} {Parar} ::msgcat::mcset es {Story of SAOImage DS9} ::msgcat::mcset es {Story} ::msgcat::mcset es {Sum} {Suma} ::msgcat::mcset es {Sunken} ::msgcat::mcset es {Symbol Editor} [encoding convertfrom iso8859-1 {Editor de smbolos}] ::msgcat::mcset es {Symbol} [encoding convertfrom iso8859-1 {Smbolo}] ::msgcat::mcset es {Tab-Separated-Value} ::msgcat::mcset es {Table} ::msgcat::mcset es {Tabloid} ::msgcat::mcset es {Task} ::msgcat::mcset es {Template} ::msgcat::mcset es {Text Font} ::msgcat::mcset es {Text} {Texto} ::msgcat::mcset es {Then} {Entonces} ::msgcat::mcset es {Thickness} {Grosor} ::msgcat::mcset es {This analysis task is already running. Do you wish to kill it?} [encoding convertfrom iso8859-1 {Esta tarea para el anlisis ya est siendo ejecutada. Desea interrumpirla?}] ::msgcat::mcset es {This function is not currently supported for this port.} ::msgcat::mcset es {Tickmarks} {Marcas} ::msgcat::mcset es {Tile Frames} {Alicatar los marcos} ::msgcat::mcset es {Tile Parameters} [encoding convertfrom iso8859-1 {Parmetros de alicatado}] ::msgcat::mcset es {Tile} {Tejar} ::msgcat::mcset es {Times} ::msgcat::mcset es {Title} [encoding convertfrom iso8859-1 {Ttulo}] ::msgcat::mcset es {Tophat} ::msgcat::mcset es {Topographic} ::msgcat::mcset es {Top} ::msgcat::mcset es {To} {A} ::msgcat::mcset es {Transparency} ::msgcat::mcset es {Triangle} ::msgcat::mcset es {Type} {Clase} ::msgcat::mcset es {URL} ::msgcat::mcset es {Unable to connect directly: using Web Proxy} ::msgcat::mcset es {Unable to determine date of observation} ::msgcat::mcset es {Unable to determine time of observation} ::msgcat::mcset es {Unable to evaluate filter} {Incapaz de evaluar el filtro} ::msgcat::mcset es {Unable to find catalog window} [encoding convertfrom iso8859-1 {Incapaz de hallar la ventana de catlogo}] ::msgcat::mcset es {Unable to find plot window} [encoding convertfrom iso8859-1 {Incapaz de hallar la ventana grfica}] ::msgcat::mcset es {Unable to load RGB image into a non-rgb frame} {Incapaz de cargar imagen RGB en un marco no RGB} ::msgcat::mcset es {Unable to load region file} ::msgcat::mcset es {Unable to load} {Incapaz de cargar} ::msgcat::mcset es {Unable to locate URL} {Incapaz de localizar URL} ::msgcat::mcset es {Unable to match target with XPA Mime request} ::msgcat::mcset es {Unable to open file} {Incapaz de abrir fichero} ::msgcat::mcset es {Unable to process Analysis file} ::msgcat::mcset es {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset es {Undo} {Deshacer} ::msgcat::mcset es {Unique} ::msgcat::mcset es {Unists} ::msgcat::mcset es {Units} {Unidades} ::msgcat::mcset es {Unknown Colormap} ::msgcat::mcset es {Unknown command} ::msgcat::mcset es {Update Filter} ::msgcat::mcset es {Update Group} {Actualizar grupo} ::msgcat::mcset es {Update from Current Crosshair} {Actualizar a partir del punto de mira actual} ::msgcat::mcset es {Update from Current Frame} {Actualizar a partir del marco actual} ::msgcat::mcset es {Update} {Actualizar} ::msgcat::mcset es {Upper Left Back} ::msgcat::mcset es {Upper Left Front} ::msgcat::mcset es {Upper Right Back} ::msgcat::mcset es {Upper Right Front} ::msgcat::mcset es {Use Authentication} [encoding convertfrom iso8859-1 {Usa autenticacin}] ::msgcat::mcset es {Use Current Frame on Download} {Usar marco actual al transferir} ::msgcat::mcset es {Use Internal Web Browser} {Usar Web Browser interno} ::msgcat::mcset es {Use Proxy} {Usar Proxy} ::msgcat::mcset es {User Manual} ::msgcat::mcset es {Username} {Nombre de usuario} ::msgcat::mcset es {User} {Usuario} ::msgcat::mcset es {Use} {Usa} ::msgcat::mcset es {VO Server} ::msgcat::mcset es {VO} ::msgcat::mcset es {Value} {Valor} ::msgcat::mcset es {Vector} ::msgcat::mcset es {Vertical Graph} [encoding convertfrom iso8859-1 {Grfica vertical}] ::msgcat::mcset es {Vertical Layout} [encoding convertfrom iso8859-1 {Distribucin vertical}] ::msgcat::mcset es {Vertical Text} {Texto vertical} ::msgcat::mcset es {Vertical} ::msgcat::mcset es {View} {Ver} ::msgcat::mcset es {Virtual Observatory} {Observatorio Virtual} ::msgcat::mcset es {WCS Parameters} ::msgcat::mcset es {WCS} ::msgcat::mcset es {Wavelength} {Longitud de onda} ::msgcat::mcset es {Web Browser} ::msgcat::mcset es {White} {Blanco} ::msgcat::mcset es {Width} {Ancho} ::msgcat::mcset es {Window} ::msgcat::mcset es {Words matching title, description} [encoding convertfrom iso8859-1 {Palabras que coincidan con el ttulo, descripcin}] ::msgcat::mcset es {Writing Catalog} ::msgcat::mcset es {X Axis Title} ::msgcat::mcset es {X Grid} ::msgcat::mcset es {XPA Information} [encoding convertfrom iso8859-1 {Informacin XPA}] ::msgcat::mcset es {XPA not initialized} {XPA no inicializado} ::msgcat::mcset es {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset es {XPA} ::msgcat::mcset es {X} ::msgcat::mcset es {Y Axis Title} ::msgcat::mcset es {Y Grid} ::msgcat::mcset es {Yellow} {Amarillo} ::msgcat::mcset es {Y} ::msgcat::mcset es {Z Axis Scale} ::msgcat::mcset es {ZScale Parameters} [encoding convertfrom iso8859-1 {Parmetros de la escala Z}] ::msgcat::mcset es {Zero} ::msgcat::mcset es {Zoom Fit} ::msgcat::mcset es {Zoom In} {Aumentar} ::msgcat::mcset es {Zoom Out} {Reducir} ::msgcat::mcset es {Zoom} {Zoom} ::msgcat::mcset es {and} ::msgcat::mcset es {blue} ::msgcat::mcset es {b} ::msgcat::mcset es {color} ::msgcat::mcset es {cool} ::msgcat::mcset es {green} ::msgcat::mcset es {grey} {gris} ::msgcat::mcset es {g} ::msgcat::mcset es {h5utils} ::msgcat::mcset es {heat} ::msgcat::mcset es {not} ::msgcat::mcset es {only} ::msgcat::mcset es {or center of data} {o centro de los datos} ::msgcat::mcset es {rainbow} ::msgcat::mcset es {red} ::msgcat::mcset es {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom iso8859-1 {Filas de datos transferidas. Puede que haya ms disponibles. Quiz quiera ajustar el mximo permitido.}] ::msgcat::mcset es {r} ::msgcat::mcset es {staircase} ::msgcat::mcset es {standard} [encoding convertfrom iso8859-1 {estndar}] ::msgcat::mcset es {x} ::msgcat::mcset es {} �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/fr.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000114222 12600277755 015170� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset fr {2D} ::msgcat::mcset fr {3D} ::msgcat::mcset fr {A postscript generation error has occurred} [encoding convertfrom iso8859-1 {Une erreur de gnration de postscript s'est produite}] ::msgcat::mcset fr {AIP} ::msgcat::mcset fr {Abort} ::msgcat::mcset fr {About SAOImage DS9} [encoding convertfrom iso8859-1 { propos de SAOImage DS9}] ::msgcat::mcset fr {About} [encoding convertfrom iso8859-1 { propos de}] ::msgcat::mcset fr {Acknowledgment} {Remerciement} ::msgcat::mcset fr {Add} {Ajouter} ::msgcat::mcset fr {Advanced} [encoding convertfrom iso8859-1 {Avanc}] ::msgcat::mcset fr {Aligned} ::msgcat::mcset fr {Align} {Aligner} ::msgcat::mcset fr {All Columns} {Toutes les colonnes} ::msgcat::mcset fr {All Rows} [encoding convertfrom iso8859-1 {Toutes les ranges}] ::msgcat::mcset fr {All} {Tous} ::msgcat::mcset fr {Always save files during Backup} ::msgcat::mcset fr {Amplifier} {Amplificateur} ::msgcat::mcset fr {An error has occurred during backup} ::msgcat::mcset fr {An error has occurred during restore} ::msgcat::mcset fr {An error has occurred invoking the Analysis task} [encoding convertfrom iso8859-1 {Une erreur s'est produite en invoquant la tche d'analyse}] ::msgcat::mcset fr {An error has occurred while creating image.} ::msgcat::mcset fr {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset fr {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset fr {An error has occurred while printing} {Une erreur s'est produite pendant l'impression} ::msgcat::mcset fr {An error has occurred while reading image.} ::msgcat::mcset fr {An error has occurred while saving} {Une erreur s'est produite pendant la sauvegarde} ::msgcat::mcset fr {An error has occurred while updating VO server list} ::msgcat::mcset fr {An error has occurred while writing image.} ::msgcat::mcset fr {An internal error has been detected} ::msgcat::mcset fr {Analysis Command Log} {Enregistrement des commandes d'analyse} ::msgcat::mcset fr {Analysis Commands} ::msgcat::mcset fr {Analysis File} ::msgcat::mcset fr {Analysis Log} ::msgcat::mcset fr {Analysis} {Analyse} ::msgcat::mcset fr {Angle Complement} [encoding convertfrom iso8859-1 {Complment d'angle}] ::msgcat::mcset fr {Angles} {Angles} ::msgcat::mcset fr {Angle} {Angle} ::msgcat::mcset fr {Annuli} {Anneaux} ::msgcat::mcset fr {Annulus} {Anneau} ::msgcat::mcset fr {Apply} {Appliquer} ::msgcat::mcset fr {ArcMin} ::msgcat::mcset fr {ArcSec} ::msgcat::mcset fr {Architecture} ::msgcat::mcset fr {Archives} ::msgcat::mcset fr {Array} ::msgcat::mcset fr {Arrow} [encoding convertfrom iso8859-1 {Flche}] ::msgcat::mcset fr {Astronomy} ::msgcat::mcset fr {At Startup} ::msgcat::mcset fr {At least 2 different catalogs are required} ::msgcat::mcset fr {Auto Centroid} ::msgcat::mcset fr {Auto Plot 2D} ::msgcat::mcset fr {Auto Plot 3D} ::msgcat::mcset fr {Auto Plot Statistics} ::msgcat::mcset fr {Auto Plot} ::msgcat::mcset fr {Autoload FITS Regions} [encoding convertfrom iso8859-1 {Autochargement des rgions FITS}] ::msgcat::mcset fr {Autoload} ::msgcat::mcset fr {Automatic} {Automatique} ::msgcat::mcset fr {Average} {Moyenne} ::msgcat::mcset fr {Axes Number} ::msgcat::mcset fr {Axes Order} ::msgcat::mcset fr {Axes Title} ::msgcat::mcset fr {Axes} ::msgcat::mcset fr {Axis Length} {Longueur de l'axe} ::msgcat::mcset fr {Axis Numbers} [encoding convertfrom iso8859-1 {chelle de l'axe}] ::msgcat::mcset fr {Axis Title} ::msgcat::mcset fr {Axis} {Axe} ::msgcat::mcset fr {Azimuth} ::msgcat::mcset fr {Background Color} {Couleur de fond} ::msgcat::mcset fr {Background} {Fond} ::msgcat::mcset fr {Backup} ::msgcat::mcset fr {Back} {Retour} ::msgcat::mcset fr {Bar Plot Tool} ::msgcat::mcset fr {Bias} {Biais} ::msgcat::mcset fr {Bin 3rd Column} [encoding convertfrom iso8859-1 {3me colonne de bin}] ::msgcat::mcset fr {Bin Center} {Centre de bin} ::msgcat::mcset fr {Bin Columns} {Colonnes de bin} ::msgcat::mcset fr {Bin Filter} {Filtre de bin} ::msgcat::mcset fr {Bin Fit} ::msgcat::mcset fr {Bin In} ::msgcat::mcset fr {Bin Out} ::msgcat::mcset fr {Binning Parameters} [encoding convertfrom iso8859-1 {Paramtres de bin}] ::msgcat::mcset fr {Bin} ::msgcat::mcset fr {Black} {Noir} ::msgcat::mcset fr {Blank/Inf/NaN Color} {Blanc/Inf/NaN Couleur} ::msgcat::mcset fr {Blink Frames} [encoding convertfrom iso8859-1 {Clignotement des fentres}] ::msgcat::mcset fr {Blink Interval} {Intervalle de clignotement} ::msgcat::mcset fr {Blink} {Clignotement} ::msgcat::mcset fr {Block Fit} ::msgcat::mcset fr {Block In} [encoding convertfrom iso8859-1 {Bin }] ::msgcat::mcset fr {Block Out} {Bin de} ::msgcat::mcset fr {Block Parameters} ::msgcat::mcset fr {Block} {Bin} ::msgcat::mcset fr {Blue} {Bleu} ::msgcat::mcset fr {Bold} {Gras} ::msgcat::mcset fr {Border} {Bordure} ::msgcat::mcset fr {Bottom} ::msgcat::mcset fr {Box Annulus} [encoding convertfrom iso8859-1 {Anneau de bote}] ::msgcat::mcset fr {Box Panda} ::msgcat::mcset fr {BoxCircle} ::msgcat::mcset fr {Boxcar} ::msgcat::mcset fr {Box} [encoding convertfrom iso8859-1 {Bote}] ::msgcat::mcset fr {Broadcast} ::msgcat::mcset fr {Browser} ::msgcat::mcset fr {Browse} {Parcourir} ::msgcat::mcset fr {Buffer} {Tampon} ::msgcat::mcset fr {Buttonbar} ::msgcat::mcset fr {Buttons} {Boutons} ::msgcat::mcset fr {Bytes} {Octets} ::msgcat::mcset fr {CMYK} ::msgcat::mcset fr {Can Delete} {Peut effacer} ::msgcat::mcset fr {Can Edit} [encoding convertfrom iso8859-1 {Peut diter}] ::msgcat::mcset fr {Can Move} [encoding convertfrom iso8859-1 {Peut dplacer}] ::msgcat::mcset fr {Can Rotate} {Peut tourner} ::msgcat::mcset fr {Cancel} {Annuler} ::msgcat::mcset fr {Cap} ::msgcat::mcset fr {Catalog Server} {Serveur de catalogue} ::msgcat::mcset fr {Catalog Tool} {Outil de catalogue} ::msgcat::mcset fr {Catalogs} {Catalogues} ::msgcat::mcset fr {Catalog} {Catalogue} ::msgcat::mcset fr {Catrom} ::msgcat::mcset fr {Cat} ::msgcat::mcset fr {Center Image} {Centrer l'image} ::msgcat::mcset fr {Center Non-modal Dialogs} ::msgcat::mcset fr {Center} {Centrer} ::msgcat::mcset fr {Centroid Parameters} ::msgcat::mcset fr {Centroid} ::msgcat::mcset fr {Circle} {Cercle} ::msgcat::mcset fr {Clear All} {Tout effacer} ::msgcat::mcset fr {Clear Analysis Commands} {Effacer les commandes d'analyse} ::msgcat::mcset fr {Clear Cache} {Effacer le cache} ::msgcat::mcset fr {Clear Data} [encoding convertfrom iso8859-1 {Effacer les donnes}] ::msgcat::mcset fr {Clear External Analysis Commands?} {Effacer les commandes d'analyse externes ?} ::msgcat::mcset fr {Clear Filter} {Effacer le filtre} ::msgcat::mcset fr {Clear Frame} [encoding convertfrom iso8859-1 {Effacer la fentre}] ::msgcat::mcset fr {Clear Preferences?} [encoding convertfrom iso8859-1 {Effacer les prfrences ?}] ::msgcat::mcset fr {Clear Preferences} [encoding convertfrom iso8859-1 {Effacer les prfrences}] ::msgcat::mcset fr {Clear} {Effacer} ::msgcat::mcset fr {Click to Center} {Cliquer pour centrer} ::msgcat::mcset fr {Close} {Fermer} ::msgcat::mcset fr {Colorbar Size} ::msgcat::mcset fr {Colorbar} {Barre de couleurs} ::msgcat::mcset fr {Colormap Parameters} [encoding convertfrom iso8859-1 {Paramtres de carte de couleurs}] ::msgcat::mcset fr {Colormap} {Carte de couleurs} ::msgcat::mcset fr {Color} {Couleur} ::msgcat::mcset fr {Columns} {Colonnes} ::msgcat::mcset fr {Column} {Colonne} ::msgcat::mcset fr {Command} ::msgcat::mcset fr {Compass} {Boussole} ::msgcat::mcset fr {Composite Region} ::msgcat::mcset fr {Composite} ::msgcat::mcset fr {Compression} ::msgcat::mcset fr {Configure} {Configurer} ::msgcat::mcset fr {Connect Directly} {Connexion directe} ::msgcat::mcset fr {Connect SAMP} ::msgcat::mcset fr {Connect Using Web Proxy} {Connexion par proxy web} ::msgcat::mcset fr {Connect} ::msgcat::mcset fr {Console} ::msgcat::mcset fr {Contour Parameters} [encoding convertfrom iso8859-1 {Paramtres de contour}] ::msgcat::mcset fr {Contours} ::msgcat::mcset fr {Contour} ::msgcat::mcset fr {Contrast} {Contraste} ::msgcat::mcset fr {Convert to Polygons} {Convertir en polygones} ::msgcat::mcset fr {Coordinate Grid Parameters} [encoding convertfrom iso8859-1 {Paramtres de grille de coordonnes}] ::msgcat::mcset fr {Coordinate Grid} [encoding convertfrom iso8859-1 {Grille de coordonnes}] ::msgcat::mcset fr {Coordinate System} [encoding convertfrom iso8859-1 {Systme de coordonnes}] ::msgcat::mcset fr {Coordinates} ::msgcat::mcset fr {Coordinate} [encoding convertfrom iso8859-1 {Coordonne}] ::msgcat::mcset fr {Copy Contours} {Copier les contours} ::msgcat::mcset fr {Copy to Regions} [encoding convertfrom iso8859-1 {Copier vers Rgions}] ::msgcat::mcset fr {Copy} {Copier} ::msgcat::mcset fr {Create Movie} ::msgcat::mcset fr {Create New Frame on Download} [encoding convertfrom iso8859-1 {Crer une nouvelle fentre au tlchargement}] ::msgcat::mcset fr {Create} ::msgcat::mcset fr {Crop Parameters} ::msgcat::mcset fr {Crop} ::msgcat::mcset fr {Crosshair Parameters} ::msgcat::mcset fr {Crosshair To} [encoding convertfrom iso8859-1 {Rticule vers}] ::msgcat::mcset fr {Crosshair} [encoding convertfrom iso8859-1 {Rticule}] ::msgcat::mcset fr {Cross} {Croisement} ::msgcat::mcset fr {Cubehelix} ::msgcat::mcset fr {Cube} ::msgcat::mcset fr {Cubic} ::msgcat::mcset fr {Current Frame} {Fentre courante} ::msgcat::mcset fr {Current Range} {Intervalle courant} ::msgcat::mcset fr {Current} {Courant} ::msgcat::mcset fr {Cursor} {Curseur} ::msgcat::mcset fr {Cut} {Couper} ::msgcat::mcset fr {Cyan} ::msgcat::mcset fr {DPI} ::msgcat::mcset fr {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset fr {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset fr {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset fr {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-1 {DS9 a dtect une vielle version du fichier de prfrences, voulez vous la mettre jour ?}] ::msgcat::mcset fr {DS9 will complete the initialization process} {DS9 va terminer le processus d'initialisation} ::msgcat::mcset fr {Dash} {Tiret} ::msgcat::mcset fr {Data Format} [encoding convertfrom iso8859-1 {Format de donnes}] ::msgcat::mcset fr {Dataset Name} ::msgcat::mcset fr {Dataset} [encoding convertfrom iso8859-1 {Ensemble de donnes}] ::msgcat::mcset fr {Data} ::msgcat::mcset fr {Decrease} {Diminuer} ::msgcat::mcset fr {Default All Files} ::msgcat::mcset fr {Default Format} ::msgcat::mcset fr {Default Length} ::msgcat::mcset fr {Default} {Defaut} ::msgcat::mcset fr {Degrees} [encoding convertfrom iso8859-1 {Degrs}] ::msgcat::mcset fr {Delete All Frames?} [encoding convertfrom iso8859-1 {Supprimer toutes les fentres ?}] ::msgcat::mcset fr {Delete All Frames} [encoding convertfrom iso8859-1 {Supprimer toutes les fentres}] ::msgcat::mcset fr {Delete All Groups?} {Supprimer tous les groupes ?} ::msgcat::mcset fr {Delete All Groups} {Supprimer tous les groupes} ::msgcat::mcset fr {Delete All Regions?} [encoding convertfrom iso8859-1 {Supprimer toutes les rgions ?}] ::msgcat::mcset fr {Delete All Regions} [encoding convertfrom iso8859-1 {Supprimer toutes les rgions}] ::msgcat::mcset fr {Delete All} ::msgcat::mcset fr {Delete Color Tags} ::msgcat::mcset fr {Delete Frame} [encoding convertfrom iso8859-1 {Supprimer la fentre}] ::msgcat::mcset fr {Delete Group} {Supprimer le groupe} ::msgcat::mcset fr {Delete Selected Regions} [encoding convertfrom iso8859-1 {Supprimer les rgions slctionnes}] ::msgcat::mcset fr {Delete} {Supprimer} ::msgcat::mcset fr {Depth} {Profondeur} ::msgcat::mcset fr {Detector} {Detecteur} ::msgcat::mcset fr {Dialog Box} [encoding convertfrom iso8859-1 {Bote de dialogue}] ::msgcat::mcset fr {Diamond} {Losange} ::msgcat::mcset fr {Dimension} {Dimention} ::msgcat::mcset fr {Direction} ::msgcat::mcset fr {Disconnect} ::msgcat::mcset fr {Display Header} ::msgcat::mcset fr {Display Size} {Afficher la taille} ::msgcat::mcset fr {Dissolve} ::msgcat::mcset fr {Distance} ::msgcat::mcset fr {Download Colormap} ::msgcat::mcset fr {Download VOTABLE format if available} ::msgcat::mcset fr {Drag to Center} {Glisser au centre} ::msgcat::mcset fr {Duplicate Data} ::msgcat::mcset fr {East} {Est} ::msgcat::mcset fr {Ecliptic} {Ecliptiques} ::msgcat::mcset fr {Edit Group Name} {Editer le nom du groupe} ::msgcat::mcset fr {Edit} [encoding convertfrom iso8859-1 {dition}] ::msgcat::mcset fr {Elevation} ::msgcat::mcset fr {Ellipse Annulus} ::msgcat::mcset fr {Ellipse Panda} {Ellipse Panda} ::msgcat::mcset fr {Ellipse} {Ellipse} ::msgcat::mcset fr {Elliptical Annulus} {Anneau elliptique} ::msgcat::mcset fr {Elliptical Panda} {Panda elliptique} ::msgcat::mcset fr {Enable Confirmation Dialogs} {Utiliser les dialogues de confirmation} ::msgcat::mcset fr {Enable} ::msgcat::mcset fr {End} {Fin} ::msgcat::mcset fr {Enter Color} ::msgcat::mcset fr {Enter Font Size} ::msgcat::mcset fr {Enter Group Name} {Entrer le nom du groupe} ::msgcat::mcset fr {Enter Search Expression} ::msgcat::mcset fr {Enter URL} ::msgcat::mcset fr {Entry} ::msgcat::mcset fr {Equal Area} {Egale surface} ::msgcat::mcset fr {Equal Distance} {Egale distance} ::msgcat::mcset fr {Equal Spacing} ::msgcat::mcset fr {Equal Value} ::msgcat::mcset fr {Error code was returned} [encoding convertfrom iso8859-1 {Un code d'erreur a t renvoy}] ::msgcat::mcset fr {Error} {Erreur} ::msgcat::mcset fr {Examine Frame} [encoding convertfrom iso8859-1 {Examiner la fentre}] ::msgcat::mcset fr {Examine} {Examiner} ::msgcat::mcset fr {Exam} ::msgcat::mcset fr {Exclude} {Exclure} ::msgcat::mcset fr {Executing TCL code is not enabled} ::msgcat::mcset fr {Exit} {Sortie} ::msgcat::mcset fr {Export Array} ::msgcat::mcset fr {Export} ::msgcat::mcset fr {Extention} ::msgcat::mcset fr {Exterior Axes} {Axes exterieurs} ::msgcat::mcset fr {Exterior Numerics} {Chiffres exterieurs} ::msgcat::mcset fr {FAQ} {Foire-Aux-Questions} ::msgcat::mcset fr {FK4} ::msgcat::mcset fr {FK5} ::msgcat::mcset fr {Factor} ::msgcat::mcset fr {File not Found or Unable to load FITS data MIME type} [encoding convertfrom iso8859-1 {Fichier non trouv, ou impossible d'utiliser le type MIME des donnes FITS}] ::msgcat::mcset fr {Filename} {NomDuFichier} ::msgcat::mcset fr {File} {Fichier} ::msgcat::mcset fr {Fill} ::msgcat::mcset fr {Filter} {Filtre} ::msgcat::mcset fr {Find Next} {Trouver le suivant} ::msgcat::mcset fr {Find} {Trouver} ::msgcat::mcset fr {First Frame} [encoding convertfrom iso8859-1 {Premire fentre}] ::msgcat::mcset fr {First} {Premier} ::msgcat::mcset fr {Fits} ::msgcat::mcset fr {Fixed in Size} [encoding convertfrom iso8859-1 {Taille fixe}] ::msgcat::mcset fr {Flat} ::msgcat::mcset fr {Flip} ::msgcat::mcset fr {Font} {Police} ::msgcat::mcset fr {For more information, use --help} ::msgcat::mcset fr {Format} ::msgcat::mcset fr {Forward} {En avant} ::msgcat::mcset fr {Found} {Trouv} ::msgcat::mcset fr {Frame Information} [encoding convertfrom iso8859-1 {Information de la fentre }] ::msgcat::mcset fr {Frame Parameters} ::msgcat::mcset fr {Frames} ::msgcat::mcset fr {Frame} [encoding convertfrom iso8859-1 {Fentre}] ::msgcat::mcset fr {From} ::msgcat::mcset fr {Front} {Avant} ::msgcat::mcset fr {Full Range} ::msgcat::mcset fr {Function} {Fonction} ::msgcat::mcset fr {GUI Font} ::msgcat::mcset fr {Galactic} {Galactiques} ::msgcat::mcset fr {Gap} ::msgcat::mcset fr {Gaussian} {Gaussien} ::msgcat::mcset fr {General} [encoding convertfrom iso8859-1 {Gnral}] ::msgcat::mcset fr {Generate} [encoding convertfrom iso8859-1 {Gnrer}] ::msgcat::mcset fr {Generating Regions} [encoding convertfrom iso8859-1 {Cration des rgions}] ::msgcat::mcset fr {Get Information} [encoding convertfrom iso8859-1 {Rcuperer l'information}] ::msgcat::mcset fr {Gist} ::msgcat::mcset fr {Global Properties} ::msgcat::mcset fr {Global} {Global} ::msgcat::mcset fr {Goto Frame} [encoding convertfrom iso8859-1 {Aller la fentre}] ::msgcat::mcset fr {Graph Horz} ::msgcat::mcset fr {Graph Vert} ::msgcat::mcset fr {Graphics} {Graphiques} ::msgcat::mcset fr {Graphs} ::msgcat::mcset fr {Graph} {Graph} ::msgcat::mcset fr {Grayscale} {Niveaux de gris} ::msgcat::mcset fr {Green} {Vert} ::msgcat::mcset fr {Grid Gap} {Espacement de la grille} ::msgcat::mcset fr {Grid} {Grille} ::msgcat::mcset fr {Groove} ::msgcat::mcset fr {Groups} {Groupes} ::msgcat::mcset fr {HTTP} ::msgcat::mcset fr {Header} [encoding convertfrom iso8859-1 {Entte}] ::msgcat::mcset fr {Height} {Hauteur} ::msgcat::mcset fr {Help Desk} {Contacts} ::msgcat::mcset fr {Help Me Choose} {Aider moi} ::msgcat::mcset fr {Help} {Aide} ::msgcat::mcset fr {Hide All} {Cacher tous} ::msgcat::mcset fr {Highlite} ::msgcat::mcset fr {High} {Haut} ::msgcat::mcset fr {Histogram Equalization} {Egalisation via Histogramme} ::msgcat::mcset fr {Histogram} {Histogramme} ::msgcat::mcset fr {Horizontal Graph} {Graphique Horizontal} ::msgcat::mcset fr {Horizontal Layout} {Mise en page Horizontale} ::msgcat::mcset fr {Horizontal} ::msgcat::mcset fr {IAU Location Code} ::msgcat::mcset fr {ICRS} ::msgcat::mcset fr {Identification} ::msgcat::mcset fr {If} {Si} ::msgcat::mcset fr {Image Servers} {Serveurs d'image} ::msgcat::mcset fr {Image} ::msgcat::mcset fr {Import Array} ::msgcat::mcset fr {Import} ::msgcat::mcset fr {Include} {Inclure} ::msgcat::mcset fr {Increase} {Augmenter} ::msgcat::mcset fr {Information Panel} {Panneau de reseignement} ::msgcat::mcset fr {Information} {Reseignement} ::msgcat::mcset fr {Initialize XPA} {Initialiser XPA} ::msgcat::mcset fr {Inner} [encoding convertfrom iso8859-1 {Intrieur}] ::msgcat::mcset fr {Instrument FOV} {Profondeur de champ de l'instrument} ::msgcat::mcset fr {Interior Axes} [encoding convertfrom iso8859-1 {Axes intrieur}] ::msgcat::mcset fr {Interior Numerics} [encoding convertfrom iso8859-1 {Chiffres intrieur}] ::msgcat::mcset fr {Internal Parse Error} ::msgcat::mcset fr {Interval} {Intervalle} ::msgcat::mcset fr {Invalid Column Name} ::msgcat::mcset fr {Invalid formated multipart/mixed mime type message} {Message invalide de genre mixte/multipart} ::msgcat::mcset fr {Invert Colormap} {Plan de couleur inverti} ::msgcat::mcset fr {Invert Selection} {Selection inverti} ::msgcat::mcset fr {Invert} {Invertir} ::msgcat::mcset fr {Italic} {Italique} ::msgcat::mcset fr {Items Found} [encoding convertfrom iso8859-1 {Articles trouvs}] ::msgcat::mcset fr {Iteration} ::msgcat::mcset fr {JPEG Quality Factor} [encoding convertfrom iso8859-1 {Le facteur de qualit JPEG}] ::msgcat::mcset fr {Keep-Alive} ::msgcat::mcset fr {Kernel} ::msgcat::mcset fr {Keyboard Shortcuts} {Raccourcis du clavier} ::msgcat::mcset fr {Keyboard} {Clavier} ::msgcat::mcset fr {Keyword} ::msgcat::mcset fr {Labels} {tiquettes} ::msgcat::mcset fr {Label} {tiquette} ::msgcat::mcset fr {Landscape} {Paysage} ::msgcat::mcset fr {Language} {Langue} ::msgcat::mcset fr {Last Frame} [encoding convertfrom iso8859-1 {Dernire fentre}] ::msgcat::mcset fr {Last} {Dernier} ::msgcat::mcset fr {Layout Horz} ::msgcat::mcset fr {Layout Vert} ::msgcat::mcset fr {Layout} ::msgcat::mcset fr {Left} ::msgcat::mcset fr {Legal} {Legale} ::msgcat::mcset fr {Legend Title} ::msgcat::mcset fr {Legend} ::msgcat::mcset fr {Length} {Longeur} ::msgcat::mcset fr {Letter} {Lettre} ::msgcat::mcset fr {Levels} {Niveaux} ::msgcat::mcset fr {Level} {Niveau} ::msgcat::mcset fr {Limits} {Limites} ::msgcat::mcset fr {Line Plot Tool} ::msgcat::mcset fr {Linear} [encoding convertfrom iso8859-1 {Linaire}] ::msgcat::mcset fr {Line} {Ligne} ::msgcat::mcset fr {List Data} ::msgcat::mcset fr {List Regions} [encoding convertfrom iso8859-1 {numrer les rgions}] ::msgcat::mcset fr {List} [encoding convertfrom iso8859-1 {numrer}] ::msgcat::mcset fr {Load Analysis Commands} {Charger le commandes d'analyse} ::msgcat::mcset fr {Load Color Tags} ::msgcat::mcset fr {Load Colormap} {Charger le plan de couleur} ::msgcat::mcset fr {Load Configuration} {Charger la configuration} ::msgcat::mcset fr {Load Contour Levels} {Charger les niveaux de contour} ::msgcat::mcset fr {Load Contours} {Charger les contours} ::msgcat::mcset fr {Load Contrast/Bias} {Charger le contraste/inclination} ::msgcat::mcset fr {Load Data} [encoding convertfrom iso8859-1 {Charger les donnes}] ::msgcat::mcset fr {Load Mosaic} [encoding convertfrom iso8859-1 {Charger le mosaque}] ::msgcat::mcset fr {Load Regions} [encoding convertfrom iso8859-1 {Charger les rgions}] ::msgcat::mcset fr {Load Template} {Charger le patron} ::msgcat::mcset fr {Load into All Frames} ::msgcat::mcset fr {Load into Current Frame} ::msgcat::mcset fr {Loading Catalog} ::msgcat::mcset fr {Loading} ::msgcat::mcset fr {Load} {Charger} ::msgcat::mcset fr {Local} {Locale} ::msgcat::mcset fr {Lock Axes} ::msgcat::mcset fr {Lock Bin} ::msgcat::mcset fr {Lock Color} ::msgcat::mcset fr {Lock Crop Amplifier} ::msgcat::mcset fr {Lock Crop Detector} ::msgcat::mcset fr {Lock Crop Image} ::msgcat::mcset fr {Lock Crop None} ::msgcat::mcset fr {Lock Crop Physical} ::msgcat::mcset fr {Lock Crop WCS} ::msgcat::mcset fr {Lock Crosshair Amplifier} ::msgcat::mcset fr {Lock Crosshair Detector} ::msgcat::mcset fr {Lock Crosshair Image} ::msgcat::mcset fr {Lock Crosshair None} ::msgcat::mcset fr {Lock Crosshair Physical} ::msgcat::mcset fr {Lock Crosshair WCS} ::msgcat::mcset fr {Lock Frame Amplifier} ::msgcat::mcset fr {Lock Frame Detector} ::msgcat::mcset fr {Lock Frame Image} ::msgcat::mcset fr {Lock Frame None} ::msgcat::mcset fr {Lock Frame Physical} ::msgcat::mcset fr {Lock Frame WCS} ::msgcat::mcset fr {Lock Limits} ::msgcat::mcset fr {Lock Scale} ::msgcat::mcset fr {Lock Slice Image} ::msgcat::mcset fr {Lock Slice None} ::msgcat::mcset fr {Lock Slice WCS} ::msgcat::mcset fr {Lock Smooth} ::msgcat::mcset fr {Lock} {Verrouiller} ::msgcat::mcset fr {Log Exponent} ::msgcat::mcset fr {Log} ::msgcat::mcset fr {Low High} {Haut bas} ::msgcat::mcset fr {Lower Left Back} ::msgcat::mcset fr {Lower Left Front} ::msgcat::mcset fr {Lower Right Back} ::msgcat::mcset fr {Lower Right Front} ::msgcat::mcset fr {Low} {Bas} ::msgcat::mcset fr {MIP} ::msgcat::mcset fr {Magenta} ::msgcat::mcset fr {Magnification} ::msgcat::mcset fr {Magnifier} {Magnificateur} ::msgcat::mcset fr {Major} {Majeure} ::msgcat::mcset fr {Manual} ::msgcat::mcset fr {Mask Parameters} [encoding convertfrom iso8859-1 {Paramtres de masque}] ::msgcat::mcset fr {Match Axes} ::msgcat::mcset fr {Match Bin} ::msgcat::mcset fr {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset fr {Match Color} ::msgcat::mcset fr {Match Crop Amplifier} ::msgcat::mcset fr {Match Crop Detector} ::msgcat::mcset fr {Match Crop Image} ::msgcat::mcset fr {Match Crop Physical} ::msgcat::mcset fr {Match Crop WCS} ::msgcat::mcset fr {Match Crosshair Amplifier} ::msgcat::mcset fr {Match Crosshair Detector} ::msgcat::mcset fr {Match Crosshair Image} ::msgcat::mcset fr {Match Crosshair Physical} ::msgcat::mcset fr {Match Crosshair WCS} ::msgcat::mcset fr {Match Frame Amplifier} ::msgcat::mcset fr {Match Frame Detector} ::msgcat::mcset fr {Match Frame Image} ::msgcat::mcset fr {Match Frame Physical} ::msgcat::mcset fr {Match Frame WCS} ::msgcat::mcset fr {Match Limits} ::msgcat::mcset fr {Match Scale} ::msgcat::mcset fr {Match Slice Image} ::msgcat::mcset fr {Match Slice WCS} ::msgcat::mcset fr {Match Smooth} ::msgcat::mcset fr {Match} ::msgcat::mcset fr {Math Function} {Fonction mathmatique} ::msgcat::mcset fr {Matplotlib} ::msgcat::mcset fr {Max Rows} [encoding convertfrom iso8859-1 {Maximum de ranges}] ::msgcat::mcset fr {Max} {Maximum} ::msgcat::mcset fr {Menus and Buttons} ::msgcat::mcset fr {Menu} ::msgcat::mcset fr {Message Log} ::msgcat::mcset fr {Method} [encoding convertfrom iso8859-1 {Mthode}] ::msgcat::mcset fr {Min Max Parameters} ::msgcat::mcset fr {Min Max} ::msgcat::mcset fr {Minor} {Mineure} ::msgcat::mcset fr {Minutes} ::msgcat::mcset fr {Min} {Minimum} ::msgcat::mcset fr {Mission} ::msgcat::mcset fr {Mode} ::msgcat::mcset fr {Mosaic IRAF Segment} ::msgcat::mcset fr {Mosaic IRAF} ::msgcat::mcset fr {Mosaic WCS Segment} ::msgcat::mcset fr {Mosaic WCS} ::msgcat::mcset fr {Mosaic WFPC2} ::msgcat::mcset fr {Mosaic} ::msgcat::mcset fr {Mouse Click Epsilon} ::msgcat::mcset fr {Mouse Wheel Bin} ::msgcat::mcset fr {Mouse Wheel Zoom} ::msgcat::mcset fr {Mouse and Keyboard} ::msgcat::mcset fr {Move Back} ::msgcat::mcset fr {Move First} ::msgcat::mcset fr {Move Forward} ::msgcat::mcset fr {Move Frame} ::msgcat::mcset fr {Move Last} ::msgcat::mcset fr {Move to Back} [encoding convertfrom iso8859-1 {Bouger vers arrire}] ::msgcat::mcset fr {Move to Front} {Bouger vers le devant} ::msgcat::mcset fr {Movie} ::msgcat::mcset fr {Multiple Extension Cube} ::msgcat::mcset fr {Multiple Extension Frames} ::msgcat::mcset fr {Multiple WCS} ::msgcat::mcset fr {NRRD} ::msgcat::mcset fr {Name Resolution} [encoding convertfrom iso8859-1 {Nom de la rsolution}] ::msgcat::mcset fr {Name Server} {Nom du Serveur} ::msgcat::mcset fr {Name or Designation} [encoding convertfrom iso8859-1 {Nom ou Dsignation}] ::msgcat::mcset fr {Name} ::msgcat::mcset fr {Native Dialog} ::msgcat::mcset fr {New Features} {Nouvelles options} ::msgcat::mcset fr {New Frame 3D} ::msgcat::mcset fr {New Frame RGB} [encoding convertfrom iso8859-1 {Nouvelle fentre RGB}] ::msgcat::mcset fr {New Frame each Time} [encoding convertfrom iso8859-1 {Nouvelle fentre chaque fois}] ::msgcat::mcset fr {New Frame} [encoding convertfrom iso8859-1 {Nouvelle fentre}] ::msgcat::mcset fr {New Group} {Nouveau groupe} ::msgcat::mcset fr {New} {Nouveau} ::msgcat::mcset fr {Next Frame} [encoding convertfrom iso8859-1 {Fentre suivante}] ::msgcat::mcset fr {Next} {Suivant} ::msgcat::mcset fr {No Catalog specified} [encoding convertfrom iso8859-1 {Pas de Catalogue spcifi}] ::msgcat::mcset fr {No Items Found} [encoding convertfrom iso8859-1 {Pas trouv}] ::msgcat::mcset fr {No current frame} ::msgcat::mcset fr {No data available at } [encoding convertfrom iso8859-1 {pas de donne disponible }] ::msgcat::mcset fr {Non-zero} ::msgcat::mcset fr {None} {Rien} ::msgcat::mcset fr {Normal} ::msgcat::mcset fr {North} {Nord} ::msgcat::mcset fr {Not Found} ::msgcat::mcset fr {Number of Samples} [encoding convertfrom iso8859-1 {Nombre d'chantillons}] ::msgcat::mcset fr {Number of Threads} ::msgcat::mcset fr {Number of Ticks} ::msgcat::mcset fr {Number} {Nombre} ::msgcat::mcset fr {Numerics} {Chiffres} ::msgcat::mcset fr {OK} ::msgcat::mcset fr {Object} {Objet} ::msgcat::mcset fr {Open File} {Ouvrir fichier} ::msgcat::mcset fr {Open TCL Console} ::msgcat::mcset fr {Open URL} {Ouvrir un URL} ::msgcat::mcset fr {Open as} ::msgcat::mcset fr {Open} {Ouvrir} ::msgcat::mcset fr {Operator} {Operateur} ::msgcat::mcset fr {Orientation} ::msgcat::mcset fr {Origin} ::msgcat::mcset fr {Oscillate} ::msgcat::mcset fr {Other Color} ::msgcat::mcset fr {Other Font Size} ::msgcat::mcset fr {Other} {Autre} ::msgcat::mcset fr {Outer} {Externe} ::msgcat::mcset fr {Overlap} ::msgcat::mcset fr {PS Page Setup} ::msgcat::mcset fr {PS Print} ::msgcat::mcset fr {Page Setup} {Configurer la Page} ::msgcat::mcset fr {Page Source} {Source de la Page} ::msgcat::mcset fr {Pan To} ::msgcat::mcset fr {Pan Zoom Rotate Parameters} ::msgcat::mcset fr {Pan Zoom} ::msgcat::mcset fr {Pan then Zoom} ::msgcat::mcset fr {Panda} ::msgcat::mcset fr {Panner} ::msgcat::mcset fr {Pan} ::msgcat::mcset fr {Parameters} [encoding convertfrom iso8859-1 {Paramtres}] ::msgcat::mcset fr {Password} {Mot de passe} ::msgcat::mcset fr {Paste Contours} {Coller les contours} ::msgcat::mcset fr {Paste} {Coller} ::msgcat::mcset fr {Physical} {Physique} ::msgcat::mcset fr {Pixel Distribution} {Distribution des pixels} ::msgcat::mcset fr {Pixel Size} {Taille des pixels} ::msgcat::mcset fr {Pixel Table} {Table des pixels} ::msgcat::mcset fr {Pixels} ::msgcat::mcset fr {Play} {Jouer} ::msgcat::mcset fr {Please Select a Region} ::msgcat::mcset fr {Please specify width, height, and either name or (ra,dec)} {Specifiez largeur, longeur, et autre noms possibles ou (ra,dec)} ::msgcat::mcset fr {Plot 2D} ::msgcat::mcset fr {Plot 3D} ::msgcat::mcset fr {Plot Title} {Ecrire le titre} ::msgcat::mcset fr {Plotting Regions} [encoding convertfrom iso8859-1 {Tracer les rgions}] ::msgcat::mcset fr {Plot} {Dessiner} ::msgcat::mcset fr {Plus} ::msgcat::mcset fr {Pointer} {Pointeur} ::msgcat::mcset fr {Points} ::msgcat::mcset fr {Point} ::msgcat::mcset fr {Polygon} {Polygone} ::msgcat::mcset fr {Portrait} ::msgcat::mcset fr {Poster} ::msgcat::mcset fr {Postscript Page Setup} ::msgcat::mcset fr {Postscript Print} ::msgcat::mcset fr {Postscript} ::msgcat::mcset fr {Power} {Puissance} ::msgcat::mcset fr {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} [encoding convertfrom iso8859-1 {Les prfrences ont t re-initialises leur valeurs de dfaut. Re-initaliser DS9 pour que ces changements prennent effet}] ::msgcat::mcset fr {Preferences} [encoding convertfrom iso8859-1 {Prfrences}] ::msgcat::mcset fr {Preserve During Load} [encoding convertfrom iso8859-1 {Prserver pendant le chargement}] ::msgcat::mcset fr {Previous Frame} [encoding convertfrom iso8859-1 {Fentre prcdente}] ::msgcat::mcset fr {Previous} [encoding convertfrom iso8859-1 {Prcdent}] ::msgcat::mcset fr {Prev} ::msgcat::mcset fr {Print Coordinates} {Imprimer les coordonnees} ::msgcat::mcset fr {Print To} {Imprimer dans} ::msgcat::mcset fr {Printer} {L'imprimante} ::msgcat::mcset fr {Print} {Imprimer} ::msgcat::mcset fr {Projection} ::msgcat::mcset fr {Properties} [encoding convertfrom iso8859-1 {Proprits}] ::msgcat::mcset fr {Property} [encoding convertfrom iso8859-1 {Proprit}] ::msgcat::mcset fr {Proxy Host} ::msgcat::mcset fr {Proxy Port} ::msgcat::mcset fr {Publication} ::msgcat::mcset fr {Quadratic} ::msgcat::mcset fr {RGB Array} ::msgcat::mcset fr {RGB Cube} ::msgcat::mcset fr {RGB Image} ::msgcat::mcset fr {RGB} ::msgcat::mcset fr {Radial Profile} ::msgcat::mcset fr {Radial} ::msgcat::mcset fr {Radius} ::msgcat::mcset fr {Raised} ::msgcat::mcset fr {Range} ::msgcat::mcset fr {Redo} {Refaire} ::msgcat::mcset fr {Red} ::msgcat::mcset fr {Reference Manual} ::msgcat::mcset fr {Reference} ::msgcat::mcset fr {Refresh Frame} ::msgcat::mcset fr {Refresh} ::msgcat::mcset fr {Region Parameters} ::msgcat::mcset fr {Region} [encoding convertfrom iso8859-1 {Rgion}] ::msgcat::mcset fr {Release Notes} ::msgcat::mcset fr {Release} ::msgcat::mcset fr {Relief} ::msgcat::mcset fr {Reload} ::msgcat::mcset fr {Render} ::msgcat::mcset fr {Repeat} ::msgcat::mcset fr {Reset Colormap} ::msgcat::mcset fr {Reset Frame} ::msgcat::mcset fr {Reset} ::msgcat::mcset fr {Restore} ::msgcat::mcset fr {Retrieve} ::msgcat::mcset fr {Return} ::msgcat::mcset fr {Right} ::msgcat::mcset fr {Roman} ::msgcat::mcset fr {Rotate} ::msgcat::mcset fr {Rows} ::msgcat::mcset fr {Row} ::msgcat::mcset fr {Ruler} ::msgcat::mcset fr {SAMP Image} ::msgcat::mcset fr {SAMP Table} ::msgcat::mcset fr {SAMP: already connected} ::msgcat::mcset fr {SAMP: internal error} ::msgcat::mcset fr {SAMP: not connected} ::msgcat::mcset fr {SAMP: unable to locate HUB} ::msgcat::mcset fr {SAMP} ::msgcat::mcset fr {Sample Increment} ::msgcat::mcset fr {Sample Parameters} ::msgcat::mcset fr {Samples per Line} ::msgcat::mcset fr {Sample} ::msgcat::mcset fr {Save 3D Movie} ::msgcat::mcset fr {Save Color Tags} ::msgcat::mcset fr {Save Colormap} ::msgcat::mcset fr {Save Configuration} ::msgcat::mcset fr {Save Contour Levels} ::msgcat::mcset fr {Save Contours} ::msgcat::mcset fr {Save Contrast/Bias} ::msgcat::mcset fr {Save Data} ::msgcat::mcset fr {Save Image on Download} ::msgcat::mcset fr {Save Image} ::msgcat::mcset fr {Save Regions} ::msgcat::mcset fr {Save Template} ::msgcat::mcset fr {Save as} ::msgcat::mcset fr {Save} {Enregistrer} ::msgcat::mcset fr {Scale Parameters} ::msgcat::mcset fr {Scale and Limits} ::msgcat::mcset fr {Scale} ::msgcat::mcset fr {Scan} ::msgcat::mcset fr {Scatter Plot Tool} ::msgcat::mcset fr {Scope} ::msgcat::mcset fr {Search for Catalogs} ::msgcat::mcset fr {Searching for catalogs} ::msgcat::mcset fr {Seconds} ::msgcat::mcset fr {Segment} ::msgcat::mcset fr {Select All} ::msgcat::mcset fr {Select Coordinate System } ::msgcat::mcset fr {Select None} ::msgcat::mcset fr {Select} ::msgcat::mcset fr {Send} ::msgcat::mcset fr {Server} ::msgcat::mcset fr {Sexagesimal} ::msgcat::mcset fr {Shape} ::msgcat::mcset fr {Show All} {Montrer tous} ::msgcat::mcset fr {Show Command} ::msgcat::mcset fr {Show Compass} ::msgcat::mcset fr {Show Text} ::msgcat::mcset fr {Show/Hide Frames} [encoding convertfrom iso8859-1 {Montrer/Cacher les fentres}] ::msgcat::mcset fr {Show} ::msgcat::mcset fr {Simple Cross} ::msgcat::mcset fr {Simple Plus} ::msgcat::mcset fr {Single Frame} ::msgcat::mcset fr {Single} ::msgcat::mcset fr {Sites} ::msgcat::mcset fr {Size/Radius} ::msgcat::mcset fr {Size} ::msgcat::mcset fr {Skip First} ::msgcat::mcset fr {Slice} ::msgcat::mcset fr {Smooth Parameters} ::msgcat::mcset fr {Smoothness} ::msgcat::mcset fr {Smooth} ::msgcat::mcset fr {Solid} ::msgcat::mcset fr {Sorry, DS9 does not support} ::msgcat::mcset fr {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset fr {Sort} ::msgcat::mcset fr {Source TCL} ::msgcat::mcset fr {Source} ::msgcat::mcset fr {Space Equal Distance} ::msgcat::mcset fr {Space Equal Value} ::msgcat::mcset fr {Spacing} ::msgcat::mcset fr {Sqrt} ::msgcat::mcset fr {Square Root} ::msgcat::mcset fr {Squared} ::msgcat::mcset fr {Square} ::msgcat::mcset fr {Stacked} ::msgcat::mcset fr {Starbase} ::msgcat::mcset fr {Startup} ::msgcat::mcset fr {Start} ::msgcat::mcset fr {Statistics} ::msgcat::mcset fr {Stats} ::msgcat::mcset fr {Status} ::msgcat::mcset fr {Step} ::msgcat::mcset fr {Stop} ::msgcat::mcset fr {Story of SAOImage DS9} ::msgcat::mcset fr {Story} ::msgcat::mcset fr {Sum} ::msgcat::mcset fr {Sunken} ::msgcat::mcset fr {Symbol Editor} ::msgcat::mcset fr {Symbol} ::msgcat::mcset fr {Tab-Separated-Value} ::msgcat::mcset fr {Table} ::msgcat::mcset fr {Tabloid} ::msgcat::mcset fr {Task} ::msgcat::mcset fr {Template} ::msgcat::mcset fr {Text Font} ::msgcat::mcset fr {Text} {Texte} ::msgcat::mcset fr {Then} ::msgcat::mcset fr {Thickness} ::msgcat::mcset fr {This analysis task is already running. Do you wish to kill it?} ::msgcat::mcset fr {This function is not currently supported for this port.} ::msgcat::mcset fr {Tickmarks} ::msgcat::mcset fr {Tile Frames} ::msgcat::mcset fr {Tile Parameters} ::msgcat::mcset fr {Tile} ::msgcat::mcset fr {Times} ::msgcat::mcset fr {Title} ::msgcat::mcset fr {Tophat} ::msgcat::mcset fr {Topographic} ::msgcat::mcset fr {Top} ::msgcat::mcset fr {To} ::msgcat::mcset fr {Transparency} ::msgcat::mcset fr {Triangle} ::msgcat::mcset fr {Type} ::msgcat::mcset fr {URL} ::msgcat::mcset fr {Unable to connect directly: using Web Proxy} ::msgcat::mcset fr {Unable to determine date of observation} ::msgcat::mcset fr {Unable to determine time of observation} ::msgcat::mcset fr {Unable to evaluate filter} ::msgcat::mcset fr {Unable to find catalog window} ::msgcat::mcset fr {Unable to find plot window} ::msgcat::mcset fr {Unable to load RGB image into a non-rgb frame} ::msgcat::mcset fr {Unable to load region file} ::msgcat::mcset fr {Unable to load} ::msgcat::mcset fr {Unable to locate URL} ::msgcat::mcset fr {Unable to match target with XPA Mime request} ::msgcat::mcset fr {Unable to open file} ::msgcat::mcset fr {Unable to process Analysis file} ::msgcat::mcset fr {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset fr {Undo} [encoding convertfrom iso8859-1 {Dfaire}] ::msgcat::mcset fr {Unique} ::msgcat::mcset fr {Unists} ::msgcat::mcset fr {Units} ::msgcat::mcset fr {Unknown Colormap} ::msgcat::mcset fr {Unknown command} ::msgcat::mcset fr {Update Filter} ::msgcat::mcset fr {Update Group} ::msgcat::mcset fr {Update from Current Crosshair} ::msgcat::mcset fr {Update from Current Frame} ::msgcat::mcset fr {Update} ::msgcat::mcset fr {Upper Left Back} ::msgcat::mcset fr {Upper Left Front} ::msgcat::mcset fr {Upper Right Back} ::msgcat::mcset fr {Upper Right Front} ::msgcat::mcset fr {Use Authentication} ::msgcat::mcset fr {Use Current Frame on Download} ::msgcat::mcset fr {Use Internal Web Browser} ::msgcat::mcset fr {Use Proxy} ::msgcat::mcset fr {User Manual} ::msgcat::mcset fr {Username} ::msgcat::mcset fr {User} ::msgcat::mcset fr {Use} ::msgcat::mcset fr {VO Server} ::msgcat::mcset fr {VO} ::msgcat::mcset fr {Value} ::msgcat::mcset fr {Vector} ::msgcat::mcset fr {Vertical Graph} ::msgcat::mcset fr {Vertical Layout} ::msgcat::mcset fr {Vertical Text} ::msgcat::mcset fr {Vertical} ::msgcat::mcset fr {View} {Affichage} ::msgcat::mcset fr {Virtual Observatory} ::msgcat::mcset fr {WCS Parameters} ::msgcat::mcset fr {WCS} ::msgcat::mcset fr {Wavelength} ::msgcat::mcset fr {Web Browser} ::msgcat::mcset fr {White} ::msgcat::mcset fr {Width} ::msgcat::mcset fr {Window} ::msgcat::mcset fr {Words matching title, description} ::msgcat::mcset fr {Writing Catalog} ::msgcat::mcset fr {X Axis Title} ::msgcat::mcset fr {X Grid} ::msgcat::mcset fr {XPA Information} ::msgcat::mcset fr {XPA not initialized} ::msgcat::mcset fr {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset fr {XPA} ::msgcat::mcset fr {X} ::msgcat::mcset fr {Y Axis Title} ::msgcat::mcset fr {Y Grid} ::msgcat::mcset fr {Yellow} ::msgcat::mcset fr {Y} ::msgcat::mcset fr {Z Axis Scale} ::msgcat::mcset fr {ZScale Parameters} ::msgcat::mcset fr {Zero} ::msgcat::mcset fr {Zoom Fit} ::msgcat::mcset fr {Zoom In} ::msgcat::mcset fr {Zoom Out} ::msgcat::mcset fr {Zoom} ::msgcat::mcset fr {and} ::msgcat::mcset fr {blue} ::msgcat::mcset fr {b} ::msgcat::mcset fr {color} ::msgcat::mcset fr {cool} ::msgcat::mcset fr {green} ::msgcat::mcset fr {grey} ::msgcat::mcset fr {g} ::msgcat::mcset fr {h5utils} ::msgcat::mcset fr {heat} ::msgcat::mcset fr {not} ::msgcat::mcset fr {only} ::msgcat::mcset fr {or center of data} ::msgcat::mcset fr {rainbow} ::msgcat::mcset fr {red} ::msgcat::mcset fr {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} ::msgcat::mcset fr {r} ::msgcat::mcset fr {staircase} ::msgcat::mcset fr {standard} ::msgcat::mcset fr {x} ::msgcat::mcset fr {} ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/ja.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000214461 12600277755 015161� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset ja {2D} ::msgcat::mcset ja {3D} [encoding convertfrom euc-jp "\x33\xbc\xa1\xb8\xb5"] ::msgcat::mcset ja {A postscript generation error has occurred} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xb9\xa5\xc8\xa5\xb9\xa5\xaf\xa5\xea\xa5\xd7\xa5\xc8\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xba\xee\xc0\xae\xa4\xcb\xbc\xba\xc7\xd4\xa4\xb7\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {AIP} ::msgcat::mcset ja {Abort} ::msgcat::mcset ja {About SAOImage DS9} [encoding convertfrom euc-jp "\x53\x41\x4f\x49\x6d\x61\x67\x65\x20\x44\x53\x39\x20\xa4\xcb\xa4\xc4\xa4\xa4\xa4\xc6"] ::msgcat::mcset ja {About} [encoding convertfrom euc-jp "\x44\x53\x39\x20\xa4\xcb\xa4\xc4\xa4\xa4\xa4\xc6"] ::msgcat::mcset ja {Acknowledgment} [encoding convertfrom euc-jp "\xbc\xd5\xbc\xad"] ::msgcat::mcset ja {Add} [encoding convertfrom euc-jp "\xc4\xc9\xb2\xc3"] ::msgcat::mcset ja {Advanced} [encoding convertfrom euc-jp "\xb9\xe2\xc5\xd9\xa4\xca\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Aligned} ::msgcat::mcset ja {Align} [encoding convertfrom euc-jp "\xc0\xb0\xce\xf3"] ::msgcat::mcset ja {All Columns} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xce\xf3"] ::msgcat::mcset ja {All Rows} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xb9\xd4"] ::msgcat::mcset ja {All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6"] ::msgcat::mcset ja {Always save files during Backup} ::msgcat::mcset ja {Amplifier} [encoding convertfrom euc-jp "\xc1\xfd\xc9\xfd\xb4\xef\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {An error has occurred during backup} ::msgcat::mcset ja {An error has occurred during restore} ::msgcat::mcset ja {An error has occurred invoking the Analysis task} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf\xa5\xbf\xa5\xb9\xa5\xaf\xa4\xce\xb5\xaf\xc6\xb0\xa4\xcb\xbc\xba\xc7\xd4\xa4\xb7\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {An error has occurred while creating image.} ::msgcat::mcset ja {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset ja {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset ja {An error has occurred while printing} [encoding convertfrom euc-jp "\xb0\xf5\xba\xfe\xa4\xcb\xbc\xba\xc7\xd4\xa4\xb7\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {An error has occurred while reading image.} ::msgcat::mcset ja {An error has occurred while saving} [encoding convertfrom euc-jp "\xca\xdd\xc2\xb8\xa4\xcb\xbc\xba\xc7\xd4\xa4\xb7\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {An error has occurred while updating VO server list} ::msgcat::mcset ja {An error has occurred while writing image.} ::msgcat::mcset ja {An internal error has been detected} ::msgcat::mcset ja {Analysis Command Log} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9\xa4\xce\xb5\xad\xcf\xbf"] ::msgcat::mcset ja {Analysis Commands} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9"] ::msgcat::mcset ja {Analysis File} ::msgcat::mcset ja {Analysis Log} ::msgcat::mcset ja {Analysis} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf"] ::msgcat::mcset ja {Angle Complement} [encoding convertfrom euc-jp "\xca\xe4\xb3\xd1"] ::msgcat::mcset ja {Angles} [encoding convertfrom euc-jp "\xb3\xd1\xc5\xd9"] ::msgcat::mcset ja {Angle} [encoding convertfrom euc-jp "\xb3\xd1\xc5\xd9"] ::msgcat::mcset ja {Annuli} [encoding convertfrom euc-jp "\xc3\xe6\xc8\xb4\xa4\xad\xb1\xdf"] ::msgcat::mcset ja {Annulus} [encoding convertfrom euc-jp "\xc3\xe6\xc8\xb4\xa4\xad\xb1\xdf"] ::msgcat::mcset ja {Apply} [encoding convertfrom euc-jp "\xc5\xac\xcd\xd1"] ::msgcat::mcset ja {ArcMin} [encoding convertfrom euc-jp "\xca\xac"] ::msgcat::mcset ja {ArcSec} [encoding convertfrom euc-jp "\xc9\xc3"] ::msgcat::mcset ja {Architecture} [encoding convertfrom euc-jp "\xa5\xa2\xa1\xbc\xa5\xad\xa5\xc6\xa5\xaf\xa5\xc1\xa5\xe3"] ::msgcat::mcset ja {Archives} [encoding convertfrom euc-jp "\xa5\xa2\xa1\xbc\xa5\xab\xa5\xa4\xa5\xd6"] ::msgcat::mcset ja {Array} ::msgcat::mcset ja {Arrow} [encoding convertfrom euc-jp "\xcc\xf0\xb0\xf5"] ::msgcat::mcset ja {Astronomy} [encoding convertfrom euc-jp "\xc5\xb7\xca\xb8\xb3\xd8"] ::msgcat::mcset ja {At Startup} ::msgcat::mcset ja {At least 2 different catalogs are required} ::msgcat::mcset ja {Auto Centroid} [encoding convertfrom euc-jp "\xbc\xab\xc6\xb0\xc3\xe6\xbf\xb4\xb9\xe7\xa4\xef\xa4\xbb"] ::msgcat::mcset ja {Auto Plot 2D} ::msgcat::mcset ja {Auto Plot 3D} ::msgcat::mcset ja {Auto Plot Statistics} ::msgcat::mcset ja {Auto Plot} ::msgcat::mcset ja {Autoload FITS Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xce\xbc\xab\xc6\xb0\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Autoload} ::msgcat::mcset ja {Automatic} [encoding convertfrom euc-jp "\xbc\xab\xc6\xb0"] ::msgcat::mcset ja {Average} [encoding convertfrom euc-jp "\xca\xbf\xb6\xd1"] ::msgcat::mcset ja {Axes Number} ::msgcat::mcset ja {Axes Order} ::msgcat::mcset ja {Axes Title} ::msgcat::mcset ja {Axes} [encoding convertfrom euc-jp "\xbc\xb4"] ::msgcat::mcset ja {Axis Length} [encoding convertfrom euc-jp "\xbc\xb4\xa4\xce\xc4\xb9\xa4\xb5"] ::msgcat::mcset ja {Axis Numbers} [encoding convertfrom euc-jp "\xbc\xb4\xa4\xce\xbf\xf4\xc3\xcd"] ::msgcat::mcset ja {Axis Title} ::msgcat::mcset ja {Axis} [encoding convertfrom euc-jp "\xbc\xb4"] ::msgcat::mcset ja {Azimuth} [encoding convertfrom euc-jp "\xca\xfd\xb0\xcc\xb3\xd1"] ::msgcat::mcset ja {Background Color} [encoding convertfrom euc-jp "\xc7\xd8\xb7\xca\xbf\xa7"] ::msgcat::mcset ja {Background} [encoding convertfrom euc-jp "\xa5\xd0\xa5\xc3\xa5\xaf\xa5\xb0\xa5\xe9\xa5\xa6\xa5\xf3\xa5\xc9\xce\xce\xb0\xe8"] ::msgcat::mcset ja {Backup} ::msgcat::mcset ja {Back} [encoding convertfrom euc-jp "\xc1\xb0"] ::msgcat::mcset ja {Bar Plot Tool} ::msgcat::mcset ja {Bias} [encoding convertfrom euc-jp "\xa5\xd0\xa5\xa4\xa5\xa2\xa5\xb9"] ::msgcat::mcset ja {Bin 3rd Column} [encoding convertfrom euc-jp "\xc2\xe8\xa3\xb3\xa4\xce\xce\xf3\xa4\xf2\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1"] ::msgcat::mcset ja {Bin Center} [encoding convertfrom euc-jp "\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1\xa4\xce\xc3\xe6\xbf\xb4"] ::msgcat::mcset ja {Bin Columns} [encoding convertfrom euc-jp "\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1\xa4\xb9\xa4\xeb\xce\xf3"] ::msgcat::mcset ja {Bin Filter} [encoding convertfrom euc-jp "\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1\xa4\xce\xb9\xca\xa4\xea\xb9\xfe\xa4\xdf\xbe\xf2\xb7\xef"] ::msgcat::mcset ja {Bin Fit} ::msgcat::mcset ja {Bin In} ::msgcat::mcset ja {Bin Out} ::msgcat::mcset ja {Binning Parameters} [encoding convertfrom euc-jp "\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Bin} [encoding convertfrom euc-jp "\xa5\xd3\xa5\xf3\xa4\xde\xa4\xc8\xa4\xe1"] ::msgcat::mcset ja {Black} [encoding convertfrom euc-jp "\xb9\xf5\xbf\xa7"] ::msgcat::mcset ja {Blank/Inf/NaN Color} [encoding convertfrom euc-jp "\xcc\xa4\xc4\xea\xb5\xc1\xc3\xcd\x28\x42\x6c\x61\x6e\x6b\x2f\x49\x6e\x66\x2f\x4e\x61\x4e\x29\xa4\xce\xbf\xa7"] ::msgcat::mcset ja {Blink Frames} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xa5\xd6\xa5\xea\xa5\xf3\xa5\xaf"] ::msgcat::mcset ja {Blink Interval} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xea\xa5\xf3\xa5\xaf\xa4\xce\xb4\xd6\xb3\xd6"] ::msgcat::mcset ja {Blink} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xea\xa5\xf3\xa5\xaf"] ::msgcat::mcset ja {Block Fit} ::msgcat::mcset ja {Block In} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xed\xa5\xc3\xa5\xaf\xa4\xf2\xba\xd9\xa4\xab\xa4\xaf"] ::msgcat::mcset ja {Block Out} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xed\xa5\xc3\xa5\xaf\xa4\xf2\xb9\xd3\xa4\xaf"] ::msgcat::mcset ja {Block Parameters} ::msgcat::mcset ja {Block} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xed\xa5\xc3\xa5\xaf"] ::msgcat::mcset ja {Blue} [encoding convertfrom euc-jp "\xc0\xc4\xbf\xa7"] ::msgcat::mcset ja {Bold} [encoding convertfrom euc-jp "\xc2\xc0\xbb\xfa"] ::msgcat::mcset ja {Border} [encoding convertfrom euc-jp "\xcf\xc8\xc0\xfe"] ::msgcat::mcset ja {Bottom} ::msgcat::mcset ja {Box Annulus} [encoding convertfrom euc-jp "\xc3\xe6\xc8\xb4\xa4\xad\xbb\xcd\xb3\xd1\xb7\xc1"] ::msgcat::mcset ja {Box Panda} [encoding convertfrom euc-jp "\xc9\xf4\xca\xac\xbb\xcd\xb3\xd1\xb7\xc1"] ::msgcat::mcset ja {BoxCircle} ::msgcat::mcset ja {Boxcar} [encoding convertfrom euc-jp "\xa5\xdc\xa5\xc3\xa5\xaf\xa5\xb9\xa5\xab\xa1\xbc"] ::msgcat::mcset ja {Box} [encoding convertfrom euc-jp "\xbb\xcd\xb3\xd1\xb7\xc1"] ::msgcat::mcset ja {Broadcast} ::msgcat::mcset ja {Browser} ::msgcat::mcset ja {Browse} [encoding convertfrom euc-jp "\xbb\xb2\xbe\xc8"] ::msgcat::mcset ja {Buffer} [encoding convertfrom euc-jp "\xa5\xd0\xa5\xc3\xa5\xd5\xa5\xa1"] ::msgcat::mcset ja {Buttonbar} [encoding convertfrom euc-jp "\xa5\xdc\xa5\xbf\xa5\xf3\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Buttons} [encoding convertfrom euc-jp "\xa5\xdc\xa5\xbf\xa5\xf3"] ::msgcat::mcset ja {Bytes} [encoding convertfrom euc-jp "\xa5\xd0\xa5\xa4\xa5\xc8"] ::msgcat::mcset ja {CMYK} [encoding convertfrom euc-jp "\x43\x4d\x59\x4b\xbf\xa7"] ::msgcat::mcset ja {Can Delete} [encoding convertfrom euc-jp "\xba\xef\xbd\xfc\xb2\xc4"] ::msgcat::mcset ja {Can Edit} [encoding convertfrom euc-jp "\xca\xd4\xbd\xb8\xb2\xc4"] ::msgcat::mcset ja {Can Move} [encoding convertfrom euc-jp "\xb0\xdc\xc6\xb0\xb2\xc4"] ::msgcat::mcset ja {Can Rotate} [encoding convertfrom euc-jp "\xb2\xf3\xc5\xbe\xb2\xc4"] ::msgcat::mcset ja {Cancel} [encoding convertfrom euc-jp "\xbc\xe8\xa4\xea\xbe\xc3\xa4\xb7"] ::msgcat::mcset ja {Cap} ::msgcat::mcset ja {Catalog Server} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xb8\xa1\xba\xf7\xa5\xb5\xa1\xbc\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Catalog Tool} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa5\xc4\xa1\xbc\xa5\xeb"] ::msgcat::mcset ja {Catalogs} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0"] ::msgcat::mcset ja {Catalog} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0"] ::msgcat::mcset ja {Catrom} ::msgcat::mcset ja {Cat} ::msgcat::mcset ja {Center Image} [encoding convertfrom euc-jp "\xa5\xa4\xa5\xe1\xa1\xbc\xa5\xb8\xa4\xf2\xc3\xe6\xbf\xb4\xa4\xcb"] ::msgcat::mcset ja {Center Non-modal Dialogs} ::msgcat::mcset ja {Center} [encoding convertfrom euc-jp "\xc3\xe6\xbf\xb4"] ::msgcat::mcset ja {Centroid Parameters} [encoding convertfrom euc-jp "\xc3\xe6\xbf\xb4\xb9\xe7\xa4\xef\xa4\xbb\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Centroid} ::msgcat::mcset ja {Circle} [encoding convertfrom euc-jp "\xb1\xdf"] ::msgcat::mcset ja {Clear All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear Analysis Commands} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear Cache} [encoding convertfrom euc-jp "\xa5\xad\xa5\xe3\xa5\xc3\xa5\xb7\xa5\xe5\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear Data} [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear External Analysis Commands?} [encoding convertfrom euc-jp "\xb3\xb0\xc9\xf4\xb2\xf2\xc0\xcf\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9\xa4\xf2\xbe\xc3\xb5\xee\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {Clear Filter} [encoding convertfrom euc-jp "\xb9\xca\xa4\xea\xb9\xfe\xa4\xdf\xbe\xf2\xb7\xef\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear Preferences?} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea\xa4\xf2\xbe\xc3\xb5\xee\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {Clear Preferences} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Clear} [encoding convertfrom euc-jp "\xa5\xaf\xa5\xea\xa5\xa2"] ::msgcat::mcset ja {Click to Center} [encoding convertfrom euc-jp "\xa5\xaf\xa5\xea\xa5\xc3\xa5\xaf\xb0\xcc\xc3\xd6\xa4\xf2\xc3\xe6\xbf\xb4"] ::msgcat::mcset ja {Close} [encoding convertfrom euc-jp "\xca\xc4\xa4\xb8\xa4\xeb"] ::msgcat::mcset ja {Colorbar Size} ::msgcat::mcset ja {Colorbar} [encoding convertfrom euc-jp "\xc7\xdb\xbf\xa7\xcb\xc0"] ::msgcat::mcset ja {Colormap Parameters} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Colormap} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4"] ::msgcat::mcset ja {Color} [encoding convertfrom euc-jp "\xbf\xa7"] ::msgcat::mcset ja {Columns} [encoding convertfrom euc-jp "\xce\xf3"] ::msgcat::mcset ja {Column} [encoding convertfrom euc-jp "\xce\xf3"] ::msgcat::mcset ja {Command} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9"] ::msgcat::mcset ja {Compass} [encoding convertfrom euc-jp "\xca\xfd\xb0\xcc\xbc\xa7\xc0\xd0"] ::msgcat::mcset ja {Composite Region} [encoding convertfrom euc-jp "\xca\xa3\xb9\xe7\xce\xce\xb0\xe8"] ::msgcat::mcset ja {Composite} ::msgcat::mcset ja {Compression} [encoding convertfrom euc-jp "\xb0\xb5\xbd\xcc"] ::msgcat::mcset ja {Configure} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Connect Directly} [encoding convertfrom euc-jp "\xc4\xbe\xc0\xdc\xc0\xdc\xc2\xb3"] ::msgcat::mcset ja {Connect SAMP} ::msgcat::mcset ja {Connect Using Web Proxy} [encoding convertfrom euc-jp "\x57\x65\x62\x20\xa5\xd7\xa5\xed\xa5\xad\xa5\xb7\xa4\xf2\xb2\xf0\xa4\xb7\xa4\xc6\xc0\xdc\xc2\xb3"] ::msgcat::mcset ja {Connect} [encoding convertfrom euc-jp "\xc0\xdc\xc2\xb3"] ::msgcat::mcset ja {Console} ::msgcat::mcset ja {Contour Parameters} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Contours} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2"] ::msgcat::mcset ja {Contour} ::msgcat::mcset ja {Contrast} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xe9\xa5\xb9\xa5\xc8"] ::msgcat::mcset ja {Convert to Polygons} [encoding convertfrom euc-jp "\xc2\xbf\xb3\xd1\xb7\xc1\xa4\xcb\xca\xd1\xb4\xb9"] ::msgcat::mcset ja {Coordinate Grid Parameters} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8\xa5\xb0\xa5\xea\xa5\xc3\xa5\xc9\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Coordinate Grid} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8\xa5\xb0\xa5\xea\xa5\xc3\xa5\xc9"] ::msgcat::mcset ja {Coordinate System} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8\xb7\xcf"] ::msgcat::mcset ja {Coordinates} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Coordinate} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Copy Contours} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa4\xf2\xa5\xb3\xa5\xd4\xa1\xbc"] ::msgcat::mcset ja {Copy to Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xcb\xa5\xb3\xa5\xd4\xa1\xbc"] ::msgcat::mcset ja {Copy} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xd4\xa1\xbc"] ::msgcat::mcset ja {Create Movie} ::msgcat::mcset ja {Create New Frame on Download} [encoding convertfrom euc-jp "\xa5\xc0\xa5\xa6\xa5\xf3\xa5\xed\xa1\xbc\xa5\xc9\xbb\xfe\xa4\xcb\xbf\xb7\xa4\xb7\xa4\xa4\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xba\xee\xc0\xae"] ::msgcat::mcset ja {Create} [encoding convertfrom euc-jp "\xba\xee\xc0\xae"] ::msgcat::mcset ja {Crop Parameters} ::msgcat::mcset ja {Crop} ::msgcat::mcset ja {Crosshair Parameters} ::msgcat::mcset ja {Crosshair To} [encoding convertfrom euc-jp "\xa4\xbd\xa4\xb3\xa4\xcb\xbd\xbd\xbb\xfa\xc0\xfe"] ::msgcat::mcset ja {Crosshair} [encoding convertfrom euc-jp "\xbd\xbd\xbb\xfa\xa5\xab\xa1\xbc\xa5\xbd\xa5\xeb"] ::msgcat::mcset ja {Cross} [encoding convertfrom euc-jp "\xbd\xbd\xbb\xfa"] ::msgcat::mcset ja {Cubehelix} ::msgcat::mcset ja {Cube} ::msgcat::mcset ja {Cubic} ::msgcat::mcset ja {Current Frame} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xc3\xe6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Current Range} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xc3\xe6\xa4\xce\xc8\xcf\xb0\xcf"] ::msgcat::mcset ja {Current} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xc3\xe6"] ::msgcat::mcset ja {Cursor} [encoding convertfrom euc-jp "\xa5\xab\xa1\xbc\xa5\xbd\xa5\xeb"] ::msgcat::mcset ja {Cut} [encoding convertfrom euc-jp "\xc0\xda\xa4\xea\xbc\xe8\xa4\xea"] ::msgcat::mcset ja {Cyan} [encoding convertfrom euc-jp "\xbf\xe5\xbf\xa7"] ::msgcat::mcset ja {DPI} ::msgcat::mcset ja {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset ja {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset ja {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset ja {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom euc-jp "\xb8\xc5\xa4\xa4\xa5\xd0\xa1\xbc\xa5\xb8\xa5\xe7\xa5\xf3\xa4\xce\xc0\xdf\xc4\xea\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3\xb9\xb9\xbf\xb7\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {DS9 will complete the initialization process} [encoding convertfrom euc-jp "\xbd\xe9\xb4\xfc\xb2\xbd\xa4\xf2\xb4\xb0\xce\xbb\xa4\xb7\xa4\xde\xa4\xb9\xa1\xa3"] ::msgcat::mcset ja {Dash} [encoding convertfrom euc-jp "\xc7\xcb\xc0\xfe"] ::msgcat::mcset ja {Data Format} [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xb7\xc1\xbc\xb0"] ::msgcat::mcset ja {Dataset Name} ::msgcat::mcset ja {Dataset} [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xa5\xbb\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Data} ::msgcat::mcset ja {Decrease} [encoding convertfrom euc-jp "\xb9\xdf\xbd\xe7"] ::msgcat::mcset ja {Default All Files} ::msgcat::mcset ja {Default Format} ::msgcat::mcset ja {Default Length} ::msgcat::mcset ja {Default} [encoding convertfrom euc-jp "\xc9\xb8\xbd\xe0"] ::msgcat::mcset ja {Degrees} [encoding convertfrom euc-jp "\xc5\xd9"] ::msgcat::mcset ja {Delete All Frames?} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbe\xc3\xb5\xee\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {Delete All Frames} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete All Groups?} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xa4\xf2\xbe\xc3\xb5\xee\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {Delete All Groups} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete All Regions?} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xce\xce\xb0\xe8\xa4\xf2\xbe\xc3\xb5\xee\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {Delete All Regions} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xce\xce\xb0\xe8\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete Color Tags} ::msgcat::mcset ja {Delete Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete Group} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xa4\xf2\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Delete Selected Regions} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xa4\xb7\xa4\xbf\xce\xce\xb0\xe8\xa4\xf2\xba\xef\xbd\xfc"] ::msgcat::mcset ja {Delete} [encoding convertfrom euc-jp "\xbe\xc3\xb5\xee"] ::msgcat::mcset ja {Depth} [encoding convertfrom euc-jp "\xbf\xbc\xa4\xb5"] ::msgcat::mcset ja {Detector} [encoding convertfrom euc-jp "\xb8\xa1\xbd\xd0\xb4\xef\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Dialog Box} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xc3\xa5\xd7\xa5\xa2\xa5\xc3\xa5\xd7\xa5\xe1\xa5\xcb\xa5\xe5\xa1\xbc"] ::msgcat::mcset ja {Diamond} [encoding convertfrom euc-jp "\xc9\xa9\xb7\xc1"] ::msgcat::mcset ja {Dimension} [encoding convertfrom euc-jp "\xbc\xa1\xb8\xb5"] ::msgcat::mcset ja {Direction} ::msgcat::mcset ja {Disconnect} [encoding convertfrom euc-jp "\xc0\xdc\xc2\xb3\xbd\xaa\xce\xbb"] ::msgcat::mcset ja {Display Header} ::msgcat::mcset ja {Display Size} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xa4\xa5\xba\xa4\xf2\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Dissolve} [encoding convertfrom euc-jp "\xca\xac\xb2\xf2"] ::msgcat::mcset ja {Distance} ::msgcat::mcset ja {Download Colormap} ::msgcat::mcset ja {Download VOTABLE format if available} [encoding convertfrom euc-jp "\x56\x4f\x54\x41\x42\x4c\x45\x20\xb7\xc1\xbc\xb0\xa4\xac\xa4\xa2\xa4\xec\xa4\xd0\xa5\xc0\xa5\xa6\xa5\xf3\xa5\xed\xa1\xbc\xa5\xc9"] ::msgcat::mcset ja {Drag to Center} [encoding convertfrom euc-jp "\xc3\xe6\xbf\xb4\xa4\xcb\xa5\xc9\xa5\xe9\xa5\xc3\xa5\xb0"] ::msgcat::mcset ja {Duplicate Data} ::msgcat::mcset ja {East} [encoding convertfrom euc-jp "\xc5\xec"] ::msgcat::mcset ja {Ecliptic} [encoding convertfrom euc-jp "\xb2\xab\xc6\xbb\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Edit Group Name} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xcc\xbe\xa4\xf2\xca\xd1\xb9\xb9"] ::msgcat::mcset ja {Edit} [encoding convertfrom euc-jp "\xca\xd4\xbd\xb8"] ::msgcat::mcset ja {Elevation} [encoding convertfrom euc-jp "\xb9\xe2\xc5\xd9"] ::msgcat::mcset ja {Ellipse Annulus} ::msgcat::mcset ja {Ellipse Panda} [encoding convertfrom euc-jp "\xc9\xf4\xca\xac\xc2\xca\xb1\xdf"] ::msgcat::mcset ja {Ellipse} [encoding convertfrom euc-jp "\xc2\xca\xb1\xdf"] ::msgcat::mcset ja {Elliptical Annulus} [encoding convertfrom euc-jp "\xc3\xe6\xc8\xb4\xa4\xad\xc2\xca\xb1\xdf"] ::msgcat::mcset ja {Elliptical Panda} [encoding convertfrom euc-jp "\xc3\xe6\xc8\xb4\xa4\xad\xc9\xf4\xca\xac\xc2\xca\xb1\xdf"] ::msgcat::mcset ja {Enable Confirmation Dialogs} [encoding convertfrom euc-jp "\xb3\xce\xc7\xa7\xa5\xe1\xa5\xc3\xa5\xbb\xa1\xbc\xa5\xb8\xa4\xf2\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Enable} ::msgcat::mcset ja {End} [encoding convertfrom euc-jp "\xbd\xaa\xce\xbb"] ::msgcat::mcset ja {Enter Color} [encoding convertfrom euc-jp "\xbf\xa7\xa4\xf2\xc6\xfe\xce\xcf"] ::msgcat::mcset ja {Enter Font Size} ::msgcat::mcset ja {Enter Group Name} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xcc\xbe\xa4\xf2\xc6\xfe\xce\xcf"] ::msgcat::mcset ja {Enter Search Expression} [encoding convertfrom euc-jp "\xb8\xa1\xba\xf7\xbe\xf2\xb7\xef\xa4\xf2\xc6\xfe\xce\xcf"] ::msgcat::mcset ja {Enter URL} ::msgcat::mcset ja {Entry} ::msgcat::mcset ja {Equal Area} [encoding convertfrom euc-jp "\xc5\xf9\xcc\xcc\xc0\xd1"] ::msgcat::mcset ja {Equal Distance} [encoding convertfrom euc-jp "\xc5\xf9\xb5\xf7\xce\xa5"] ::msgcat::mcset ja {Equal Spacing} ::msgcat::mcset ja {Equal Value} ::msgcat::mcset ja {Error code was returned} [encoding convertfrom euc-jp "\xa5\xa8\xa5\xe9\xa1\xbc\xa5\xb3\xa1\xbc\xa5\xc9\xa4\xac\xca\xd6\xa4\xb5\xa4\xec\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {Error} [encoding convertfrom euc-jp "\xa5\xa8\xa5\xe9\xa1\xbc"] ::msgcat::mcset ja {Examine Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbe\xdc\xba\xd9\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Examine} [encoding convertfrom euc-jp "\xbe\xdc\xba\xd9\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Exam} ::msgcat::mcset ja {Exclude} [encoding convertfrom euc-jp "\xb3\xb0\xc2\xa6"] ::msgcat::mcset ja {Executing TCL code is not enabled} [encoding convertfrom euc-jp "\x54\x43\x4c\x20\xa5\xb3\xa1\xbc\xa5\xc9\xa4\xce\xbc\xc2\xb9\xd4\xa4\xac\xb5\xf6\xb2\xc4\xa4\xb5\xa4\xec\xa4\xc6\xa4\xa4\xa4\xde\xa4\xbb\xa4\xf3"] ::msgcat::mcset ja {Exit} [encoding convertfrom euc-jp "\xbd\xaa\xce\xbb"] ::msgcat::mcset ja {Export Array} ::msgcat::mcset ja {Export} ::msgcat::mcset ja {Extention} ::msgcat::mcset ja {Exterior Axes} [encoding convertfrom euc-jp "\xbc\xb4\xa4\xf2\xb3\xb0\xc2\xa6\xa4\xcb"] ::msgcat::mcset ja {Exterior Numerics} [encoding convertfrom euc-jp "\xbf\xf4\xc3\xcd\xa4\xf2\xb3\xb0\xc2\xa6\xa4\xcb"] ::msgcat::mcset ja {FAQ} [encoding convertfrom euc-jp "\xa4\xe8\xa4\xaf\xa4\xa2\xa4\xeb\xbc\xc1\xcc\xe4\xa4\xc8\xc5\xfa\xa4\xa8"] ::msgcat::mcset ja {FK4} ::msgcat::mcset ja {FK5} ::msgcat::mcset ja {Factor} ::msgcat::mcset ja {File not Found or Unable to load FITS data MIME type} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3\xa4\xde\xa4\xbf\xa4\xcf\xa1\xa2\x46\x49\x54\x53\x20\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xac\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xe1\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Filename} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xcc\xbe"] ::msgcat::mcset ja {File} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb"] ::msgcat::mcset ja {Fill} ::msgcat::mcset ja {Filter} [encoding convertfrom euc-jp "\xb9\xca\xa4\xea\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Find Next} [encoding convertfrom euc-jp "\xbc\xa1\xa4\xf2\xb8\xa1\xba\xf7"] ::msgcat::mcset ja {Find} [encoding convertfrom euc-jp "\xb8\xa1\xba\xf7"] ::msgcat::mcset ja {First Frame} [encoding convertfrom euc-jp "\xba\xc7\xbd\xe9\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {First} [encoding convertfrom euc-jp "\xba\xc7\xbd\xe9"] ::msgcat::mcset ja {Fits} ::msgcat::mcset ja {Fixed in Size} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xa4\xa5\xba\xb8\xc7\xc4\xea"] ::msgcat::mcset ja {Flat} ::msgcat::mcset ja {Flip} ::msgcat::mcset ja {Font} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa9\xa5\xf3\xa5\xc8"] ::msgcat::mcset ja {For more information, use --help} [encoding convertfrom euc-jp "\xbe\xdc\xa4\xb7\xa4\xaf\xa4\xcf\x20\x2d\x2d\x68\x65\x6c\x70\x20\xa5\xaa\xa5\xd7\xa5\xb7\xa5\xe7\xa5\xf3\xa4\xc7\xa1\xa3"] ::msgcat::mcset ja {Format} [encoding convertfrom euc-jp "\xb7\xc1\xbc\xb0"] ::msgcat::mcset ja {Forward} [encoding convertfrom euc-jp "\xbc\xa1"] ::msgcat::mcset ja {Found} ::msgcat::mcset ja {Frame Information} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xce\xbe\xf0\xca\xf3"] ::msgcat::mcset ja {Frame Parameters} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Frames} ::msgcat::mcset ja {Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {From} ::msgcat::mcset ja {Front} [encoding convertfrom euc-jp "\xc1\xb4\xcc\xcc"] ::msgcat::mcset ja {Full Range} [encoding convertfrom euc-jp "\xc1\xb4\xc8\xcf\xb0\xcf"] ::msgcat::mcset ja {Function} [encoding convertfrom euc-jp "\xb4\xd8\xbf\xf4"] ::msgcat::mcset ja {GUI Font} ::msgcat::mcset ja {Galactic} [encoding convertfrom euc-jp "\xb6\xe4\xb2\xcf\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Gap} ::msgcat::mcset ja {Gaussian} [encoding convertfrom euc-jp "\xa5\xac\xa5\xa6\xa5\xb7\xa5\xa2\xa5\xf3"] ::msgcat::mcset ja {General} [encoding convertfrom euc-jp "\xb0\xec\xc8\xcc"] ::msgcat::mcset ja {Generate} [encoding convertfrom euc-jp "\xc0\xb8\xc0\xae"] ::msgcat::mcset ja {Generating Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xf2\xba\xee\xc0\xae\xc3\xe6"] ::msgcat::mcset ja {Get Information} [encoding convertfrom euc-jp "\xbe\xf0\xca\xf3\xa4\xf2\xbc\xe8\xc6\xc0"] ::msgcat::mcset ja {Gist} ::msgcat::mcset ja {Global Properties} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xed\xa1\xbc\xa5\xd0\xa5\xeb\xa5\xd7\xa5\xed\xa5\xd1\xa5\xc6\xa5\xa3"] ::msgcat::mcset ja {Global} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xed\xa1\xbc\xa5\xd0\xa5\xeb"] ::msgcat::mcset ja {Goto Frame} [encoding convertfrom euc-jp "\xbb\xd8\xc4\xea\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Graph Horz} [encoding convertfrom euc-jp "\xb2\xa3\xc3\xc7\xcc\xcc\xbf\xde"] ::msgcat::mcset ja {Graph Vert} [encoding convertfrom euc-jp "\xbd\xc4\xc3\xc7\xcc\xcc\xbf\xde"] ::msgcat::mcset ja {Graphics} ::msgcat::mcset ja {Graphs} ::msgcat::mcset ja {Graph} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xe9\xa5\xd5"] ::msgcat::mcset ja {Grayscale} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xec\xa1\xbc\xa5\xb9\xa5\xb1\xa1\xbc\xa5\xeb"] ::msgcat::mcset ja {Green} [encoding convertfrom euc-jp "\xce\xd0\xbf\xa7"] ::msgcat::mcset ja {Grid Gap} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xea\xa5\xc3\xa5\xc9\xa4\xce\xb4\xd6\xb3\xd6"] ::msgcat::mcset ja {Grid} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xea\xa5\xc3\xa5\xc9"] ::msgcat::mcset ja {Groove} ::msgcat::mcset ja {Groups} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7"] ::msgcat::mcset ja {HTTP} [encoding convertfrom euc-jp "\x48\x54\x54\x50"] ::msgcat::mcset ja {Header} [encoding convertfrom euc-jp "\xa5\xd8\xa5\xc3\xa5\xc0"] ::msgcat::mcset ja {Height} [encoding convertfrom euc-jp "\xb9\xe2\xa4\xb5"] ::msgcat::mcset ja {Help Desk} [encoding convertfrom euc-jp "\xa5\xd8\xa5\xeb\xa5\xd7\xa5\xc7\xa5\xb9\xa5\xaf"] ::msgcat::mcset ja {Help Me Choose} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xa4\xce\xa5\xd2\xa5\xf3\xa5\xc8"] ::msgcat::mcset ja {Help} [encoding convertfrom euc-jp "\xa5\xd8\xa5\xeb\xa5\xd7"] ::msgcat::mcset ja {Hide All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xc8\xf3\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Highlite} ::msgcat::mcset ja {High} [encoding convertfrom euc-jp "\xbe\xe5\xb8\xc2"] ::msgcat::mcset ja {Histogram Equalization} [encoding convertfrom euc-jp "\xa5\xd2\xa5\xb9\xa5\xc8\xa5\xb0\xa5\xe9\xa5\xe0\xc5\xf9\xca\xac\xc9\xdb"] ::msgcat::mcset ja {Histogram} [encoding convertfrom euc-jp "\xa5\xd2\xa5\xb9\xa5\xc8\xa5\xb0\xa5\xe9\xa5\xe0"] ::msgcat::mcset ja {Horizontal Graph} [encoding convertfrom euc-jp "\xb2\xa3\xc3\xc7\xcc\xcc"] ::msgcat::mcset ja {Horizontal Layout} [encoding convertfrom euc-jp "\xb2\xe8\xc1\xfc\xa4\xce\xbe\xe5\xa4\xcb\xc7\xdb\xc3\xd6"] ::msgcat::mcset ja {Horizontal} ::msgcat::mcset ja {IAU Location Code} ::msgcat::mcset ja {ICRS} [encoding convertfrom euc-jp "\xb9\xf1\xba\xdd\xc5\xb7\xca\xb8\xbd\xe0\xb5\xf2\xb7\xcf"] ::msgcat::mcset ja {Identification} [encoding convertfrom euc-jp "\xc6\xb1\xc4\xea"] ::msgcat::mcset ja {If} [encoding convertfrom euc-jp "\xa4\xe2\xa4\xb7"] ::msgcat::mcset ja {Image Servers} [encoding convertfrom euc-jp "\xa5\xa4\xa5\xe1\xa1\xbc\xa5\xb8\xb8\xa1\xba\xf7\xa5\xb5\xa1\xbc\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Image} [encoding convertfrom euc-jp "\xcf\xc0\xcd\xfd\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Import Array} ::msgcat::mcset ja {Import} ::msgcat::mcset ja {Include} [encoding convertfrom euc-jp "\xc6\xe2\xc2\xa6"] ::msgcat::mcset ja {Increase} [encoding convertfrom euc-jp "\xbe\xba\xbd\xe7"] ::msgcat::mcset ja {Information Panel} [encoding convertfrom euc-jp "\xbe\xf0\xca\xf3\xa5\xd1\xa5\xcd\xa5\xeb"] ::msgcat::mcset ja {Information} [encoding convertfrom euc-jp "\xbe\xf0\xca\xf3"] ::msgcat::mcset ja {Initialize XPA} [encoding convertfrom euc-jp "\x58\x50\x41\x20\xa4\xf2\xbd\xe9\xb4\xfc\xb2\xbd"] ::msgcat::mcset ja {Inner} [encoding convertfrom euc-jp "\xc6\xe2\xb7\xc2"] ::msgcat::mcset ja {Instrument FOV} [encoding convertfrom euc-jp "\xb8\xa1\xbd\xd0\xb4\xef\xa4\xce\xbb\xeb\xcc\xee"] ::msgcat::mcset ja {Interior Axes} [encoding convertfrom euc-jp "\xbc\xb4\xa4\xf2\xc6\xe2\xc2\xa6\xa4\xcb"] ::msgcat::mcset ja {Interior Numerics} [encoding convertfrom euc-jp "\xbf\xf4\xc3\xcd\xa4\xf2\xc6\xe2\xc2\xa6\xa4\xcb"] ::msgcat::mcset ja {Internal Parse Error} [encoding convertfrom euc-jp "\xc6\xe2\xc9\xf4\xb2\xf2\xbc\xe1\xa5\xa8\xa5\xe9\xa1\xbc"] ::msgcat::mcset ja {Interval} [encoding convertfrom euc-jp "\xb4\xd6\xb3\xd6"] ::msgcat::mcset ja {Invalid Column Name} ::msgcat::mcset ja {Invalid formated multipart/mixed mime type message} ::msgcat::mcset ja {Invert Colormap} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4\xa4\xf2\xc8\xbf\xc5\xbe"] ::msgcat::mcset ja {Invert Selection} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xa4\xf2\xc8\xbf\xc5\xbe"] ::msgcat::mcset ja {Invert} [encoding convertfrom euc-jp "\xc8\xbf\xc5\xbe"] ::msgcat::mcset ja {Italic} [encoding convertfrom euc-jp "\xa5\xa4\xa5\xbf\xa5\xea\xa5\xc3\xa5\xaf"] ::msgcat::mcset ja {Items Found} ::msgcat::mcset ja {Iteration} [encoding convertfrom euc-jp "\xb7\xab\xa4\xea\xca\xd6\xa4\xb7"] ::msgcat::mcset ja {JPEG Quality Factor} [encoding convertfrom euc-jp "\x4a\x50\x45\x47\xa4\xce\xc9\xca\xbc\xc1"] ::msgcat::mcset ja {Keep-Alive} ::msgcat::mcset ja {Kernel} ::msgcat::mcset ja {Keyboard Shortcuts} [encoding convertfrom euc-jp "\xa5\xb7\xa5\xe7\xa1\xbc\xa5\xc8\xa5\xab\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Keyboard} [encoding convertfrom euc-jp "\xa5\xad\xa1\xbc\xa5\xdc\xa1\xbc\xa5\xc9"] ::msgcat::mcset ja {Keyword} ::msgcat::mcset ja {Labels} [encoding convertfrom euc-jp "\xa5\xe9\xa5\xd9\xa5\xeb"] ::msgcat::mcset ja {Label} [encoding convertfrom euc-jp "\xa5\xe9\xa5\xd9\xa5\xeb"] ::msgcat::mcset ja {Landscape} [encoding convertfrom euc-jp "\xb2\xa3\xc4\xb9"] ::msgcat::mcset ja {Language} [encoding convertfrom euc-jp "\xb8\xc0\xb8\xec"] ::msgcat::mcset ja {Last Frame} [encoding convertfrom euc-jp "\xba\xc7\xb8\xe5\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Last} [encoding convertfrom euc-jp "\xba\xc7\xb8\xe5"] ::msgcat::mcset ja {Layout Horz} [encoding convertfrom euc-jp "\xb2\xa3\xc7\xdb\xc3\xd6"] ::msgcat::mcset ja {Layout Vert} [encoding convertfrom euc-jp "\xbd\xc4\xc7\xdb\xc3\xd6"] ::msgcat::mcset ja {Layout} ::msgcat::mcset ja {Left} ::msgcat::mcset ja {Legal} [encoding convertfrom euc-jp "\xa5\xea\xa1\xbc\xa5\xac\xa5\xeb"] ::msgcat::mcset ja {Legend Title} ::msgcat::mcset ja {Legend} ::msgcat::mcset ja {Length} [encoding convertfrom euc-jp "\xc4\xb9\xa4\xb5"] ::msgcat::mcset ja {Letter} [encoding convertfrom euc-jp "\xa5\xec\xa5\xbf\xa1\xbc"] ::msgcat::mcset ja {Levels} [encoding convertfrom euc-jp "\xa5\xec\xa5\xd9\xa5\xeb"] ::msgcat::mcset ja {Level} [encoding convertfrom euc-jp "\xa5\xec\xa5\xd9\xa5\xeb"] ::msgcat::mcset ja {Limits} [encoding convertfrom euc-jp "\xbe\xe5\xb2\xbc\xb8\xc2"] ::msgcat::mcset ja {Line Plot Tool} ::msgcat::mcset ja {Linear} [encoding convertfrom euc-jp "\xc0\xfe\xb7\xc1"] ::msgcat::mcset ja {Line} [encoding convertfrom euc-jp "\xc0\xfe"] ::msgcat::mcset ja {List Data} ::msgcat::mcset ja {List Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xf2\xce\xf3\xb5\xf3"] ::msgcat::mcset ja {List} [encoding convertfrom euc-jp "\xce\xf3\xb5\xf3"] ::msgcat::mcset ja {Load Analysis Commands} [encoding convertfrom euc-jp "\xb2\xf2\xc0\xcf\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Color Tags} ::msgcat::mcset ja {Load Colormap} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Configuration} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Contour Levels} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa5\xec\xa5\xd9\xa5\xeb\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Contours} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Contrast/Bias} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xe9\xa5\xb9\xa5\xc8\xa1\xa6\xa5\xd0\xa5\xa4\xa5\xa2\xa5\xb9\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Data} [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Mosaic} [encoding convertfrom euc-jp "\xa5\xe2\xa5\xb6\xa5\xa4\xa5\xaf\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load Template} [encoding convertfrom euc-jp "\xbf\xf7\xb7\xc1\xa4\xce\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load into All Frames} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xcb\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Load into Current Frame} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xc3\xe6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xcb\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Loading Catalog} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa4\xf2\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf\xc3\xe6"] ::msgcat::mcset ja {Loading} [encoding convertfrom euc-jp "\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf\xc3\xe6"] ::msgcat::mcset ja {Load} [encoding convertfrom euc-jp "\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Local} [encoding convertfrom euc-jp "\xa5\xed\xa1\xbc\xa5\xab\xa5\xeb"] ::msgcat::mcset ja {Lock Axes} ::msgcat::mcset ja {Lock Bin} ::msgcat::mcset ja {Lock Color} ::msgcat::mcset ja {Lock Crop Amplifier} ::msgcat::mcset ja {Lock Crop Detector} ::msgcat::mcset ja {Lock Crop Image} ::msgcat::mcset ja {Lock Crop None} ::msgcat::mcset ja {Lock Crop Physical} ::msgcat::mcset ja {Lock Crop WCS} ::msgcat::mcset ja {Lock Crosshair Amplifier} ::msgcat::mcset ja {Lock Crosshair Detector} ::msgcat::mcset ja {Lock Crosshair Image} ::msgcat::mcset ja {Lock Crosshair None} ::msgcat::mcset ja {Lock Crosshair Physical} ::msgcat::mcset ja {Lock Crosshair WCS} ::msgcat::mcset ja {Lock Frame Amplifier} ::msgcat::mcset ja {Lock Frame Detector} ::msgcat::mcset ja {Lock Frame Image} ::msgcat::mcset ja {Lock Frame None} ::msgcat::mcset ja {Lock Frame Physical} ::msgcat::mcset ja {Lock Frame WCS} ::msgcat::mcset ja {Lock Limits} ::msgcat::mcset ja {Lock Scale} ::msgcat::mcset ja {Lock Slice Image} ::msgcat::mcset ja {Lock Slice None} ::msgcat::mcset ja {Lock Slice WCS} ::msgcat::mcset ja {Lock Smooth} ::msgcat::mcset ja {Lock} [encoding convertfrom euc-jp "\xb8\xc7\xc4\xea"] ::msgcat::mcset ja {Log Exponent} ::msgcat::mcset ja {Log} [encoding convertfrom euc-jp "\xc2\xd0\xbf\xf4"] ::msgcat::mcset ja {Low High} [encoding convertfrom euc-jp "\xbe\xe5\xb8\xc2\xa1\xa6\xb2\xbc\xb8\xc2"] ::msgcat::mcset ja {Lower Left Back} ::msgcat::mcset ja {Lower Left Front} ::msgcat::mcset ja {Lower Right Back} ::msgcat::mcset ja {Lower Right Front} ::msgcat::mcset ja {Low} [encoding convertfrom euc-jp "\xb2\xbc\xb8\xc2"] ::msgcat::mcset ja {MIP} ::msgcat::mcset ja {Magenta} [encoding convertfrom euc-jp "\xc5\xed\xbf\xa7"] ::msgcat::mcset ja {Magnification} ::msgcat::mcset ja {Magnifier} [encoding convertfrom euc-jp "\xb3\xc8\xc2\xe7\xbf\xde"] ::msgcat::mcset ja {Major} [encoding convertfrom euc-jp "\xc4\xb9\xbc\xb4"] ::msgcat::mcset ja {Manual} [encoding convertfrom euc-jp "\xbc\xea\xc6\xb0"] ::msgcat::mcset ja {Mask Parameters} [encoding convertfrom euc-jp "\xa5\xde\xa5\xb9\xa5\xaf\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Match Axes} ::msgcat::mcset ja {Match Bin} ::msgcat::mcset ja {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset ja {Match Color} ::msgcat::mcset ja {Match Crop Amplifier} ::msgcat::mcset ja {Match Crop Detector} ::msgcat::mcset ja {Match Crop Image} ::msgcat::mcset ja {Match Crop Physical} ::msgcat::mcset ja {Match Crop WCS} ::msgcat::mcset ja {Match Crosshair Amplifier} ::msgcat::mcset ja {Match Crosshair Detector} ::msgcat::mcset ja {Match Crosshair Image} ::msgcat::mcset ja {Match Crosshair Physical} ::msgcat::mcset ja {Match Crosshair WCS} ::msgcat::mcset ja {Match Frame Amplifier} ::msgcat::mcset ja {Match Frame Detector} ::msgcat::mcset ja {Match Frame Image} ::msgcat::mcset ja {Match Frame Physical} ::msgcat::mcset ja {Match Frame WCS} ::msgcat::mcset ja {Match Limits} ::msgcat::mcset ja {Match Scale} ::msgcat::mcset ja {Match Slice Image} ::msgcat::mcset ja {Match Slice WCS} ::msgcat::mcset ja {Match Smooth} ::msgcat::mcset ja {Match} ::msgcat::mcset ja {Math Function} [encoding convertfrom euc-jp "\xb4\xd8\xbf\xf4"] ::msgcat::mcset ja {Matplotlib} ::msgcat::mcset ja {Max Rows} [encoding convertfrom euc-jp "\xba\xc7\xc2\xe7\xb9\xd4\xbf\xf4"] ::msgcat::mcset ja {Max} [encoding convertfrom euc-jp "\xba\xc7\xc2\xe7"] ::msgcat::mcset ja {Menus and Buttons} ::msgcat::mcset ja {Menu} [encoding convertfrom euc-jp "\xa5\xe1\xa5\xcb\xa5\xe5\xa1\xbc"] ::msgcat::mcset ja {Message Log} [encoding convertfrom euc-jp "\xa5\xe1\xa5\xc3\xa5\xbb\xa1\xbc\xa5\xb8\xa4\xce\xb5\xad\xcf\xbf"] ::msgcat::mcset ja {Method} [encoding convertfrom euc-jp "\xb7\xd7\xbb\xbb\xcb\xa1"] ::msgcat::mcset ja {Min Max Parameters} [encoding convertfrom euc-jp "\xba\xc7\xc2\xe7\xa1\xa6\xba\xc7\xbe\xae\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Min Max} [encoding convertfrom euc-jp "\xba\xc7\xc2\xe7\xa1\xa6\xba\xc7\xbe\xae"] ::msgcat::mcset ja {Minor} [encoding convertfrom euc-jp "\xc3\xbb\xbc\xb4"] ::msgcat::mcset ja {Minutes} ::msgcat::mcset ja {Min} [encoding convertfrom euc-jp "\xba\xc7\xbe\xae"] ::msgcat::mcset ja {Mission} [encoding convertfrom euc-jp "\xa5\xdf\xa5\xc3\xa5\xb7\xa5\xe7\xa5\xf3"] ::msgcat::mcset ja {Mode} ::msgcat::mcset ja {Mosaic IRAF Segment} ::msgcat::mcset ja {Mosaic IRAF} ::msgcat::mcset ja {Mosaic WCS Segment} ::msgcat::mcset ja {Mosaic WCS} ::msgcat::mcset ja {Mosaic WFPC2} ::msgcat::mcset ja {Mosaic} ::msgcat::mcset ja {Mouse Click Epsilon} ::msgcat::mcset ja {Mouse Wheel Bin} ::msgcat::mcset ja {Mouse Wheel Zoom} ::msgcat::mcset ja {Mouse and Keyboard} ::msgcat::mcset ja {Move Back} [encoding convertfrom euc-jp "\xc1\xb0\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move First} [encoding convertfrom euc-jp "\xba\xc7\xbd\xe9\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move Forward} [encoding convertfrom euc-jp "\xbc\xa1\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move Last} [encoding convertfrom euc-jp "\xba\xc7\xb8\xe5\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move to Back} [encoding convertfrom euc-jp "\xc7\xd8\xcc\xcc\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Move to Front} [encoding convertfrom euc-jp "\xc1\xb0\xcc\xcc\xa4\xcb\xb0\xdc\xc6\xb0"] ::msgcat::mcset ja {Movie} ::msgcat::mcset ja {Multiple Extension Cube} ::msgcat::mcset ja {Multiple Extension Frames} ::msgcat::mcset ja {Multiple WCS} [encoding convertfrom euc-jp "\xca\xa3\xbf\xf4\x57\x43\x53"] ::msgcat::mcset ja {NRRD} ::msgcat::mcset ja {Name Resolution} [encoding convertfrom euc-jp "\xcc\xbe\xc1\xb0\xa4\xc7\xb8\xa1\xba\xf7"] ::msgcat::mcset ja {Name Server} [encoding convertfrom euc-jp "\xc5\xb7\xc2\xce\xcc\xbe\xb8\xa1\xba\xf7\xa5\xb5\xa1\xbc\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Name or Designation} [encoding convertfrom euc-jp "\xc5\xb7\xc2\xce\xcc\xbe"] ::msgcat::mcset ja {Name} ::msgcat::mcset ja {Native Dialog} ::msgcat::mcset ja {New Features} [encoding convertfrom euc-jp "\xbf\xb7\xa4\xb7\xa4\xa4\xb5\xa1\xc7\xbd"] ::msgcat::mcset ja {New Frame 3D} [encoding convertfrom euc-jp "\xbf\xb7\xa4\xb7\xa4\xa4\x33\x44\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {New Frame RGB} [encoding convertfrom euc-jp "\xbf\xb7\xa4\xb7\xa4\xa4\x52\x47\x42\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {New Frame each Time} [encoding convertfrom euc-jp "\xcb\xe8\xb2\xf3\xbf\xb7\xa4\xb7\xa4\xa4\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xba\xee\xc0\xae"] ::msgcat::mcset ja {New Frame} [encoding convertfrom euc-jp "\xbf\xb7\xa4\xb7\xa4\xa4\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {New Group} [encoding convertfrom euc-jp "\xbf\xb7\xa4\xb7\xa4\xa4\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7"] ::msgcat::mcset ja {New} [encoding convertfrom euc-jp "\xbf\xb7\xb5\xac"] ::msgcat::mcset ja {Next Frame} [encoding convertfrom euc-jp "\xbc\xa1\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Next} [encoding convertfrom euc-jp "\xbf\xca\xa4\xe0"] ::msgcat::mcset ja {No Catalog specified} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa4\xac\xbb\xd8\xc4\xea\xa4\xb5\xa4\xec\xa4\xc6\xa4\xa4\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {No Items Found} [encoding convertfrom euc-jp "\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\xa4\xc7\xa4\xb7\xa4\xbf\xa1\xa3"] ::msgcat::mcset ja {No current frame} ::msgcat::mcset ja {No data available at } [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\x20\x3a\x20"] ::msgcat::mcset ja {Non-zero} [encoding convertfrom euc-jp "\xc8\xf3\xce\xed\xc3\xcd"] ::msgcat::mcset ja {None} [encoding convertfrom euc-jp "\xa4\xca\xa4\xb7"] ::msgcat::mcset ja {Normal} [encoding convertfrom euc-jp "\xc9\xb8\xbd\xe0"] ::msgcat::mcset ja {North} [encoding convertfrom euc-jp "\xcb\xcc"] ::msgcat::mcset ja {Not Found} ::msgcat::mcset ja {Number of Samples} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xf3\xa5\xd7\xa5\xeb\xa4\xce\xbf\xf4"] ::msgcat::mcset ja {Number of Threads} ::msgcat::mcset ja {Number of Ticks} ::msgcat::mcset ja {Number} [encoding convertfrom euc-jp "\xc8\xd6\xb9\xe6"] ::msgcat::mcset ja {Numerics} [encoding convertfrom euc-jp "\xbf\xf4\xc3\xcd"] ::msgcat::mcset ja {OK} [encoding convertfrom euc-jp "\xce\xbb\xb2\xf2"] ::msgcat::mcset ja {Object} [encoding convertfrom euc-jp "\xc5\xb7\xc2\xce\xcc\xbe"] ::msgcat::mcset ja {Open File} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xf2\xb3\xab\xa4\xaf"] ::msgcat::mcset ja {Open TCL Console} [encoding convertfrom euc-jp "\x54\x43\x4c\x20\xa5\xb3\xa5\xf3\xa5\xbd\xa1\xbc\xa5\xeb\xa4\xf2\xb3\xab\xa4\xaf"] ::msgcat::mcset ja {Open URL} [encoding convertfrom euc-jp "\x55\x52\x4c\x20\xa4\xf2\xb3\xab\xa4\xaf"] ::msgcat::mcset ja {Open as} ::msgcat::mcset ja {Open} [encoding convertfrom euc-jp "\xb3\xab\xa4\xaf"] ::msgcat::mcset ja {Operator} [encoding convertfrom euc-jp "\xb1\xe9\xbb\xbb\xbb\xd2"] ::msgcat::mcset ja {Orientation} [encoding convertfrom euc-jp "\xca\xfd\xb8\xfe"] ::msgcat::mcset ja {Origin} ::msgcat::mcset ja {Oscillate} ::msgcat::mcset ja {Other Color} ::msgcat::mcset ja {Other Font Size} ::msgcat::mcset ja {Other} [encoding convertfrom euc-jp "\xa4\xbd\xa4\xce\xc2\xbe"] ::msgcat::mcset ja {Outer} [encoding convertfrom euc-jp "\xb3\xb0\xb7\xc2"] ::msgcat::mcset ja {Overlap} ::msgcat::mcset ja {PS Page Setup} [encoding convertfrom euc-jp "\x50\x53\xa5\xda\xa1\xbc\xa5\xb8\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {PS Print} [encoding convertfrom euc-jp "\x50\x53\xb0\xf5\xba\xfe"] ::msgcat::mcset ja {Page Setup} [encoding convertfrom euc-jp "\xa5\xda\xa1\xbc\xa5\xb8\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Page Source} [encoding convertfrom euc-jp "\xa5\xda\xa1\xbc\xa5\xb8\xa4\xce\xa5\xbd\xa1\xbc\xa5\xb9"] ::msgcat::mcset ja {Pan To} [encoding convertfrom euc-jp "\xa4\xbd\xa4\xb3\xa4\xcb\xa5\xd1\xa5\xf3"] ::msgcat::mcset ja {Pan Zoom Rotate Parameters} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xf3\xa1\xa6\xa5\xba\xa1\xbc\xa5\xe0\xa1\xa6\xb2\xf3\xc5\xbe\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Pan Zoom} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xf3\xa1\xa6\xa5\xba\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Pan then Zoom} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xf3\xa4\xce\xa4\xc1\xa5\xba\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Panda} [encoding convertfrom euc-jp "\xc9\xf4\xca\xac\xb1\xdf"] ::msgcat::mcset ja {Panner} [encoding convertfrom euc-jp "\xc1\xb4\xc2\xce\xbf\xde"] ::msgcat::mcset ja {Pan} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xf3"] ::msgcat::mcset ja {Parameters} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xe9\xa5\xe1\xa1\xbc\xa5\xbf"] ::msgcat::mcset ja {Password} [encoding convertfrom euc-jp "\xa5\xd1\xa5\xb9\xa5\xef\xa1\xbc\xa5\xc9"] ::msgcat::mcset ja {Paste Contours} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa4\xf2\xc5\xbd\xa4\xea\xc9\xd5\xa4\xb1"] ::msgcat::mcset ja {Paste} [encoding convertfrom euc-jp "\xc5\xbd\xa4\xea\xc9\xd5\xa4\xb1"] ::msgcat::mcset ja {Physical} [encoding convertfrom euc-jp "\xca\xaa\xcd\xfd\xba\xc2\xc9\xb8"] ::msgcat::mcset ja {Pixel Distribution} [encoding convertfrom euc-jp "\xa5\xd4\xa5\xaf\xa5\xbb\xa5\xeb\xc9\xd1\xc5\xd9\xca\xac\xc9\xdb"] ::msgcat::mcset ja {Pixel Size} [encoding convertfrom euc-jp "\xa5\xd4\xa5\xaf\xa5\xbb\xa5\xeb\xa5\xb5\xa5\xa4\xa5\xba"] ::msgcat::mcset ja {Pixel Table} [encoding convertfrom euc-jp "\xa5\xd4\xa5\xaf\xa5\xbb\xa5\xeb\xc9\xbd"] ::msgcat::mcset ja {Pixels} [encoding convertfrom euc-jp "\xa5\xd4\xa5\xaf\xa5\xbb\xa5\xeb"] ::msgcat::mcset ja {Play} [encoding convertfrom euc-jp "\xba\xc6\xc0\xb8"] ::msgcat::mcset ja {Please Select a Region} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xf2\xbb\xd8\xc4\xea\xa4\xb7\xa4\xc6\xa4\xaf\xa4\xc0\xa4\xb5\xa4\xa4\xa1\xa3"] ::msgcat::mcset ja {Please specify width, height, and either name or (ra,dec)} [encoding convertfrom euc-jp "\xc9\xfd\xa1\xa2\xb9\xe2\xa4\xb5\xa1\xa2\xcc\xbe\xc1\xb0\xa4\xe2\xa4\xb7\xa4\xaf\xa4\xcf\x20\x28\x72\x61\x2c\x64\x65\x63\x29\x20\xa4\xf2\xbb\xd8\xc4\xea\xa4\xb7\xa4\xc6\xa4\xaf\xa4\xc0\xa4\xb5\xa4\xa4\xa1\xa3"] ::msgcat::mcset ja {Plot 2D} ::msgcat::mcset ja {Plot 3D} ::msgcat::mcset ja {Plot Title} [encoding convertfrom euc-jp "\xa5\xbf\xa5\xa4\xa5\xc8\xa5\xeb\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Plotting Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xf2\xa5\xd7\xa5\xed\xa5\xc3\xa5\xc8\xa4\xb7\xa4\xc6\xa4\xa4\xa4\xde\xa4\xb9"] ::msgcat::mcset ja {Plot} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xed\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Plus} [encoding convertfrom euc-jp "\xa1\xdc"] ::msgcat::mcset ja {Pointer} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xa4\xa5\xf3\xa5\xbf"] ::msgcat::mcset ja {Points} [encoding convertfrom euc-jp "\xc5\xc0"] ::msgcat::mcset ja {Point} [encoding convertfrom euc-jp "\xc5\xc0"] ::msgcat::mcset ja {Polygon} [encoding convertfrom euc-jp "\xc2\xbf\xb3\xd1\xb7\xc1"] ::msgcat::mcset ja {Portrait} [encoding convertfrom euc-jp "\xbd\xc4\xc4\xb9"] ::msgcat::mcset ja {Poster} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xb9\xa5\xbf\xa1\xbc"] ::msgcat::mcset ja {Postscript Page Setup} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xb9\xa5\xc8\xa5\xb9\xa5\xaf\xa5\xea\xa5\xd7\xa5\xc8\xa5\xda\xa1\xbc\xa5\xb8\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Postscript Print} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xb9\xa5\xc8\xa5\xb9\xa5\xaf\xa5\xea\xa5\xd7\xa5\xc8\xb0\xf5\xba\xfe"] ::msgcat::mcset ja {Postscript} [encoding convertfrom euc-jp "\xa5\xdd\xa5\xb9\xa5\xc8\xa5\xb9\xa5\xaf\xa5\xea\xa5\xd7\xa5\xc8"] ::msgcat::mcset ja {Power} [encoding convertfrom euc-jp "\xd1\xd1\xbe\xe8"] ::msgcat::mcset ja {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea\xa4\xcf\xbd\xe9\xb4\xfc\xb2\xbd\xa4\xb5\xa4\xec\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3\xca\xd1\xb9\xb9\xa4\xf2\xcd\xad\xb8\xfa\xa4\xcb\xa4\xb9\xa4\xeb\xa4\xcb\xa4\xcf\xa1\xa2\x44\x53\x39\xa4\xf2\xba\xc6\xb5\xaf\xc6\xb0\xa4\xb7\xa4\xc6\xa4\xaf\xa4\xc0\xa4\xb5\xa4\xa4\xa1\xa3"] ::msgcat::mcset ja {Preferences} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Preserve During Load} [encoding convertfrom euc-jp "\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf\xc3\xe6\xa4\xcb\xca\xdd\xbb\xfd"] ::msgcat::mcset ja {Previous Frame} [encoding convertfrom euc-jp "\xc1\xb0\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Previous} [encoding convertfrom euc-jp "\xcc\xe1\xa4\xeb"] ::msgcat::mcset ja {Prev} ::msgcat::mcset ja {Print Coordinates} [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8\xa4\xf2\xb0\xf5\xba\xfe"] ::msgcat::mcset ja {Print To} [encoding convertfrom euc-jp "\xbd\xd0\xce\xcf\xc0\xe8"] ::msgcat::mcset ja {Printer} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xea\xa5\xf3\xa5\xbf"] ::msgcat::mcset ja {Print} [encoding convertfrom euc-jp "\xb0\xf5\xba\xfe"] ::msgcat::mcset ja {Projection} [encoding convertfrom euc-jp "\xc0\xda\xc3\xc7\xcc\xcc"] ::msgcat::mcset ja {Properties} [encoding convertfrom euc-jp "\xc2\xb0\xc0\xad"] ::msgcat::mcset ja {Property} [encoding convertfrom euc-jp "\xc2\xb0\xc0\xad"] ::msgcat::mcset ja {Proxy Host} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xed\xa5\xad\xa5\xb7\xa5\xb5\xa1\xbc\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Proxy Port} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xed\xa5\xad\xa5\xb7\xa5\xdd\xa1\xbc\xa5\xc8"] ::msgcat::mcset ja {Publication} [encoding convertfrom euc-jp "\xcf\xc0\xca\xb8"] ::msgcat::mcset ja {Quadratic} ::msgcat::mcset ja {RGB Array} ::msgcat::mcset ja {RGB Cube} ::msgcat::mcset ja {RGB Image} ::msgcat::mcset ja {RGB} [encoding convertfrom euc-jp "\x52\x47\x42\xbf\xa7"] ::msgcat::mcset ja {Radial Profile} ::msgcat::mcset ja {Radial} ::msgcat::mcset ja {Radius} [encoding convertfrom euc-jp "\xc8\xbe\xb7\xc2"] ::msgcat::mcset ja {Raised} ::msgcat::mcset ja {Range} ::msgcat::mcset ja {Redo} [encoding convertfrom euc-jp "\xa4\xe2\xa4\xa6\xb0\xec\xc5\xd9"] ::msgcat::mcset ja {Red} [encoding convertfrom euc-jp "\xc0\xd6\xbf\xa7"] ::msgcat::mcset ja {Reference Manual} [encoding convertfrom euc-jp "\xa5\xea\xa5\xd5\xa5\xa1\xa5\xec\xa5\xf3\xa5\xb9\xa5\xde\xa5\xcb\xa5\xe5\xa5\xa2\xa5\xeb"] ::msgcat::mcset ja {Reference} [encoding convertfrom euc-jp "\xa5\xea\xa5\xd5\xa5\xa1\xa5\xec\xa5\xf3\xa5\xb9"] ::msgcat::mcset ja {Refresh Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xba\xc6\xc9\xc1\xb2\xe8"] ::msgcat::mcset ja {Refresh} [encoding convertfrom euc-jp "\xba\xc6\xc9\xc1\xb2\xe8"] ::msgcat::mcset ja {Region Parameters} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Region} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8"] ::msgcat::mcset ja {Release Notes} [encoding convertfrom euc-jp "\xa5\xea\xa5\xea\xa1\xbc\xa5\xb9\xa5\xce\xa1\xbc\xa5\xc8"] ::msgcat::mcset ja {Release} [encoding convertfrom euc-jp "\xa5\xea\xa5\xea\xa1\xbc\xa5\xb9"] ::msgcat::mcset ja {Relief} ::msgcat::mcset ja {Reload} [encoding convertfrom euc-jp "\xba\xc6\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xdf"] ::msgcat::mcset ja {Render} ::msgcat::mcset ja {Repeat} ::msgcat::mcset ja {Reset Colormap} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4\xa4\xf2\xa5\xea\xa5\xbb\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Reset Frame} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xa5\xea\xa5\xbb\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Reset} [encoding convertfrom euc-jp "\xa5\xea\xa5\xbb\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Restore} ::msgcat::mcset ja {Retrieve} [encoding convertfrom euc-jp "\xb8\xa1\xba\xf7"] ::msgcat::mcset ja {Return} ::msgcat::mcset ja {Right} ::msgcat::mcset ja {Roman} ::msgcat::mcset ja {Rotate} [encoding convertfrom euc-jp "\xb2\xf3\xc5\xbe"] ::msgcat::mcset ja {Rows} [encoding convertfrom euc-jp "\xb9\xd4"] ::msgcat::mcset ja {Row} ::msgcat::mcset ja {Ruler} [encoding convertfrom euc-jp "\xa4\xe2\xa4\xce\xa4\xb5\xa4\xb7"] ::msgcat::mcset ja {SAMP Image} ::msgcat::mcset ja {SAMP Table} ::msgcat::mcset ja {SAMP: already connected} [encoding convertfrom euc-jp "\x53\x41\x4d\x50\x3a\x20\xc0\xdc\xc2\xb3\xa4\xba\xa4\xdf"] ::msgcat::mcset ja {SAMP: internal error} [encoding convertfrom euc-jp "\x53\x41\x4d\x50\x3a\x20\xc6\xe2\xc9\xf4\xa5\xa8\xa5\xe9\xa1\xbc"] ::msgcat::mcset ja {SAMP: not connected} [encoding convertfrom euc-jp "\x53\x41\x4d\x50\x3a\x20\xcc\xa4\xc0\xdc\xc2\xb3"] ::msgcat::mcset ja {SAMP: unable to locate HUB} [encoding convertfrom euc-jp "\x53\x41\x4d\x50\x3a\x20\x48\x55\x42\x20\xa4\xf2\xb8\xab\xa4\xc4\xa4\xb1\xa4\xe9\xa4\xec\xa4\xde\xa4\xbb\xa4\xf3"] ::msgcat::mcset ja {SAMP} [encoding convertfrom euc-jp "\x53\x41\x4d\x50"] ::msgcat::mcset ja {Sample Increment} [encoding convertfrom euc-jp "\xa4\xc8\xa4\xd0\xa4\xb7\xc6\xc9\xa4\xdf\xa4\xce\xb4\xd6\xb3\xd6"] ::msgcat::mcset ja {Sample Parameters} [encoding convertfrom euc-jp "\xa4\xc8\xa4\xd0\xa4\xb7\xc6\xc9\xa4\xdf\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Samples per Line} [encoding convertfrom euc-jp "\xa3\xb1\xb9\xd4\xa4\xa2\xa4\xbf\xa4\xea\xa4\xce\xa5\xb5\xa5\xf3\xa5\xd7\xa5\xeb"] ::msgcat::mcset ja {Sample} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xf3\xa5\xd7\xa5\xeb"] ::msgcat::mcset ja {Save 3D Movie} ::msgcat::mcset ja {Save Color Tags} ::msgcat::mcset ja {Save Colormap} [encoding convertfrom euc-jp "\xbf\xa7\xc4\xb4\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Configuration} [encoding convertfrom euc-jp "\xc0\xdf\xc4\xea\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Contour Levels} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa5\xec\xa5\xd9\xa5\xeb\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Contours} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xa2\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Contrast/Bias} [encoding convertfrom euc-jp "\xa5\xb3\xa5\xf3\xa5\xc8\xa5\xe9\xa5\xb9\xa5\xc8\xa1\xa6\xa5\xd0\xa5\xa4\xa5\xa2\xa5\xb9\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Data} [encoding convertfrom euc-jp "\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Image on Download} ::msgcat::mcset ja {Save Image} [encoding convertfrom euc-jp "\xa5\xa4\xa5\xe1\xa1\xbc\xa5\xb8\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Regions} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save Template} [encoding convertfrom euc-jp "\xbf\xf7\xb7\xc1\xa4\xf2\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Save as} ::msgcat::mcset ja {Save} [encoding convertfrom euc-jp "\xca\xdd\xc2\xb8"] ::msgcat::mcset ja {Scale Parameters} [encoding convertfrom euc-jp "\xa5\xb9\xa5\xb1\xa1\xbc\xa5\xeb\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Scale and Limits} ::msgcat::mcset ja {Scale} [encoding convertfrom euc-jp "\xa5\xb9\xa5\xb1\xa1\xbc\xa5\xeb"] ::msgcat::mcset ja {Scan} [encoding convertfrom euc-jp "\xa5\xb9\xa5\xad\xa5\xe3\xa5\xf3"] ::msgcat::mcset ja {Scatter Plot Tool} ::msgcat::mcset ja {Scope} [encoding convertfrom euc-jp "\xa5\xb9\xa5\xb3\xa1\xbc\xa5\xd7"] ::msgcat::mcset ja {Search for Catalogs} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa4\xf2\xb8\xa1\xba\xf7"] ::msgcat::mcset ja {Searching for catalogs} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa4\xf2\xb8\xa1\xba\xf7\xc3\xe6"] ::msgcat::mcset ja {Seconds} [encoding convertfrom euc-jp "\xc9\xc3"] ::msgcat::mcset ja {Segment} ::msgcat::mcset ja {Select All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xc1\xaa\xc2\xf2"] ::msgcat::mcset ja {Select Coordinate System } [encoding convertfrom euc-jp "\xba\xc2\xc9\xb8\xb7\xcf\xa4\xf2\xc1\xaa\xc2\xf2"] ::msgcat::mcset ja {Select None} [encoding convertfrom euc-jp "\xc1\xaa\xc2\xf2\xa4\xf2\xb2\xf2\xbd\xfc"] ::msgcat::mcset ja {Select} ::msgcat::mcset ja {Send} [encoding convertfrom euc-jp "\xc1\xf7\xbf\xae"] ::msgcat::mcset ja {Server} [encoding convertfrom euc-jp "\xa5\xb5\xa1\xbc\xa5\xd0\xa1\xbc"] ::msgcat::mcset ja {Sexagesimal} [encoding convertfrom euc-jp "\xbb\xfe\xca\xac\xc9\xc3"] ::msgcat::mcset ja {Shape} [encoding convertfrom euc-jp "\xb7\xc1"] ::msgcat::mcset ja {Show All} [encoding convertfrom euc-jp "\xc1\xb4\xa4\xc6\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Show Command} ::msgcat::mcset ja {Show Compass} ::msgcat::mcset ja {Show Text} [encoding convertfrom euc-jp "\xca\xb8\xbb\xfa\xa4\xf2\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Show/Hide Frames} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xce\xc9\xbd\xbc\xa8\x2f\xc8\xf3\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Show} [encoding convertfrom euc-jp "\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Simple Cross} ::msgcat::mcset ja {Simple Plus} ::msgcat::mcset ja {Single Frame} [encoding convertfrom euc-jp "\xc3\xb1\xb0\xec\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {Single} [encoding convertfrom euc-jp "\xc3\xb1\xb0\xec"] ::msgcat::mcset ja {Sites} ::msgcat::mcset ja {Size/Radius} [encoding convertfrom euc-jp "\xc2\xe7\xa4\xad\xa4\xb5\x2f\xc8\xbe\xb7\xc2"] ::msgcat::mcset ja {Size} [encoding convertfrom euc-jp "\xc2\xe7\xa4\xad\xa4\xb5"] ::msgcat::mcset ja {Skip First} ::msgcat::mcset ja {Slice} ::msgcat::mcset ja {Smooth Parameters} [encoding convertfrom euc-jp "\xca\xbf\xb3\xea\xb2\xbd\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Smoothness} ::msgcat::mcset ja {Smooth} [encoding convertfrom euc-jp "\xca\xbf\xb3\xea\xb2\xbd"] ::msgcat::mcset ja {Solid} ::msgcat::mcset ja {Sorry, DS9 does not support} [encoding convertfrom euc-jp "\x44\x53\x39\x20\xa4\xc7\xa5\xb5\xa5\xdd\xa1\xbc\xa5\xc8\xa4\xb5\xa4\xec\xa4\xc6\xa4\xa4\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset ja {Sort} [encoding convertfrom euc-jp "\xca\xc2\xa4\xd9\xc2\xd8\xa4\xa8"] ::msgcat::mcset ja {Source TCL} [encoding convertfrom euc-jp "\x54\x43\x4c\x20\xa4\xf2\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xe0"] ::msgcat::mcset ja {Source} [encoding convertfrom euc-jp "\xa5\xbd\xa1\xbc\xa5\xb9\xce\xce\xb0\xe8"] ::msgcat::mcset ja {Space Equal Distance} ::msgcat::mcset ja {Space Equal Value} ::msgcat::mcset ja {Spacing} ::msgcat::mcset ja {Sqrt} ::msgcat::mcset ja {Square Root} [encoding convertfrom euc-jp "\xca\xbf\xca\xfd\xba\xac"] ::msgcat::mcset ja {Squared} [encoding convertfrom euc-jp "\xca\xbf\xca\xfd"] ::msgcat::mcset ja {Square} ::msgcat::mcset ja {Stacked} ::msgcat::mcset ja {Starbase} ::msgcat::mcset ja {Startup} ::msgcat::mcset ja {Start} [encoding convertfrom euc-jp "\xb3\xab\xbb\xcf"] ::msgcat::mcset ja {Statistics} ::msgcat::mcset ja {Stats} ::msgcat::mcset ja {Status} [encoding convertfrom euc-jp "\xbe\xf5\xc2\xd6"] ::msgcat::mcset ja {Step} [encoding convertfrom euc-jp "\xa5\xb9\xa5\xc6\xa5\xc3\xa5\xd7"] ::msgcat::mcset ja {Stop} [encoding convertfrom euc-jp "\xbd\xaa\xce\xbb"] ::msgcat::mcset ja {Story of SAOImage DS9} ::msgcat::mcset ja {Story} ::msgcat::mcset ja {Sum} [encoding convertfrom euc-jp "\xb9\xe7\xb7\xd7"] ::msgcat::mcset ja {Sunken} ::msgcat::mcset ja {Symbol Editor} [encoding convertfrom euc-jp "\xb5\xad\xb9\xe6\xa4\xce\xca\xd4\xbd\xb8"] ::msgcat::mcset ja {Symbol} [encoding convertfrom euc-jp "\xb5\xad\xb9\xe6"] ::msgcat::mcset ja {Tab-Separated-Value} [encoding convertfrom euc-jp "\xa5\xbf\xa5\xd6\xca\xac\xb3\xe4\xb5\xad\xcb\xa1"] ::msgcat::mcset ja {Table} ::msgcat::mcset ja {Tabloid} [encoding convertfrom euc-jp "\xa5\xbf\xa5\xd6\xa5\xed\xa5\xa4\xa5\xc9"] ::msgcat::mcset ja {Task} ::msgcat::mcset ja {Template} [encoding convertfrom euc-jp "\xbf\xf7\xb7\xc1"] ::msgcat::mcset ja {Text Font} ::msgcat::mcset ja {Text} [encoding convertfrom euc-jp "\xca\xb8\xbb\xfa"] ::msgcat::mcset ja {Then} [encoding convertfrom euc-jp "\xa4\xca\xa4\xe9"] ::msgcat::mcset ja {Thickness} [encoding convertfrom euc-jp "\xc2\xc0\xa4\xb5"] ::msgcat::mcset ja {This analysis task is already running. Do you wish to kill it?} [encoding convertfrom euc-jp "\xa4\xb3\xa4\xce\xb2\xf2\xc0\xcf\xa5\xbf\xa5\xb9\xa5\xaf\xa4\xcf\xa4\xb9\xa4\xc7\xa4\xcb\xbc\xc2\xb9\xd4\xc3\xe6\xa4\xc7\xa4\xb9\xa1\xa3\xc3\xe6\xc3\xc7\xa4\xb7\xa4\xde\xa4\xb9\xa4\xab\x3f"] ::msgcat::mcset ja {This function is not currently supported for this port.} ::msgcat::mcset ja {Tickmarks} [encoding convertfrom euc-jp "\xcc\xdc\xc0\xb9\xa4\xea"] ::msgcat::mcset ja {Tile Frames} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xca\xc2\xa4\xd9\xa4\xeb"] ::msgcat::mcset ja {Tile Parameters} [encoding convertfrom euc-jp "\xca\xc2\xa4\xd9\xca\xfd\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Tile} [encoding convertfrom euc-jp "\xca\xc2\xa4\xd9\xa4\xc6\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Times} ::msgcat::mcset ja {Title} [encoding convertfrom euc-jp "\xa5\xbf\xa5\xa4\xa5\xc8\xa5\xeb"] ::msgcat::mcset ja {Tophat} [encoding convertfrom euc-jp "\xa5\xc8\xa5\xc3\xa5\xd7\xa5\xcf\xa5\xc3\xa5\xc8"] ::msgcat::mcset ja {Topographic} ::msgcat::mcset ja {Top} ::msgcat::mcset ja {To} ::msgcat::mcset ja {Transparency} [encoding convertfrom euc-jp "\xc6\xa9\xcc\xc0"] ::msgcat::mcset ja {Triangle} ::msgcat::mcset ja {Type} [encoding convertfrom euc-jp "\xbc\xef\xce\xe0"] ::msgcat::mcset ja {URL} ::msgcat::mcset ja {Unable to connect directly: using Web Proxy} ::msgcat::mcset ja {Unable to determine date of observation} ::msgcat::mcset ja {Unable to determine time of observation} ::msgcat::mcset ja {Unable to evaluate filter} [encoding convertfrom euc-jp "\xb9\xca\xa4\xea\xb9\xfe\xa4\xdf\xbe\xf2\xb7\xef\xa4\xac\xc9\xbe\xb2\xc1\xa4\xc7\xa4\xad\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to find catalog window} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa5\xa6\xa5\xa3\xa5\xf3\xa5\xc9\xa5\xa6\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to find plot window} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xed\xa5\xc3\xa5\xc8\xa5\xa6\xa5\xa3\xa5\xf3\xa5\xc9\xa5\xa6\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to load RGB image into a non-rgb frame} [encoding convertfrom euc-jp "\x52\x42\x47\xa5\xa4\xa5\xe1\xa1\xbc\xa5\xb8\xa4\xf2\xc8\xf3\x52\x47\x42\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xcb\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xe1\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to load region file} [encoding convertfrom euc-jp "\xce\xce\xb0\xe8\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xf2\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xe1\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to load} [encoding convertfrom euc-jp "\xc6\xc9\xa4\xdf\xb9\xfe\xa4\xe1\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to locate URL} [encoding convertfrom euc-jp "\x55\x52\x4c\xa4\xf2\xc6\xc3\xc4\xea\xa4\xc7\xa4\xad\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to match target with XPA Mime request} ::msgcat::mcset ja {Unable to open file} [encoding convertfrom euc-jp "\xa5\xd5\xa5\xa1\xa5\xa4\xa5\xeb\xa4\xf2\xb3\xab\xa4\xb1\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {Unable to process Analysis file} ::msgcat::mcset ja {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset ja {Undo} [encoding convertfrom euc-jp "\xa4\xe4\xa4\xea\xc4\xbe\xa4\xb7"] ::msgcat::mcset ja {Unique} ::msgcat::mcset ja {Unists} ::msgcat::mcset ja {Units} [encoding convertfrom euc-jp "\xc3\xb1\xb0\xcc"] ::msgcat::mcset ja {Unknown Colormap} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xdd\xa1\xbc\xa5\xc8\xa4\xb5\xa4\xec\xa4\xca\xa4\xa4\xc7\xdb\xbf\xa7"] ::msgcat::mcset ja {Unknown command} [encoding convertfrom euc-jp "\xa5\xb5\xa5\xdd\xa1\xbc\xa5\xc8\xa4\xb5\xa4\xec\xa4\xca\xa4\xa4\xa5\xb3\xa5\xde\xa5\xf3\xa5\xc9"] ::msgcat::mcset ja {Update Filter} [encoding convertfrom euc-jp "\xb8\xa1\xba\xf7\xbe\xf2\xb7\xef\xa4\xf2\xb9\xb9\xbf\xb7"] ::msgcat::mcset ja {Update Group} [encoding convertfrom euc-jp "\xa5\xb0\xa5\xeb\xa1\xbc\xa5\xd7\xa4\xf2\xb9\xb9\xbf\xb7"] ::msgcat::mcset ja {Update from Current Crosshair} [encoding convertfrom euc-jp "\xb8\xbd\xba\xdf\xa4\xce\xbd\xbd\xbb\xfa\xa5\xab\xa1\xbc\xa5\xbd\xa5\xeb\xb0\xcc\xc3\xd6\xa4\xab\xa4\xe9\xb9\xb9\xbf\xb7"] ::msgcat::mcset ja {Update from Current Frame} [encoding convertfrom euc-jp "\xb8\xbd\xba\xdf\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xab\xa4\xe9\xb9\xb9\xbf\xb7"] ::msgcat::mcset ja {Update} [encoding convertfrom euc-jp "\xb9\xb9\xbf\xb7"] ::msgcat::mcset ja {Upper Left Back} ::msgcat::mcset ja {Upper Left Front} ::msgcat::mcset ja {Upper Right Back} ::msgcat::mcset ja {Upper Right Front} ::msgcat::mcset ja {Use Authentication} [encoding convertfrom euc-jp "\xc7\xa7\xbe\xda\xa4\xf2\xbb\xc8\xcd\xd1"] ::msgcat::mcset ja {Use Current Frame on Download} [encoding convertfrom euc-jp "\xa5\xc0\xa5\xa6\xa5\xf3\xa5\xed\xa1\xbc\xa5\xc9\xbb\xfe\xa4\xcb\xc1\xaa\xc2\xf2\xc3\xe6\xa4\xce\xa5\xd5\xa5\xec\xa1\xbc\xa5\xe0\xa4\xf2\xbb\xc8\xcd\xd1"] ::msgcat::mcset ja {Use Internal Web Browser} [encoding convertfrom euc-jp "\xc6\xe2\xc9\xf4\xa5\xd6\xa5\xe9\xa5\xa6\xa5\xb6\xa4\xf2\xbb\xc8\xcd\xd1"] ::msgcat::mcset ja {Use Proxy} [encoding convertfrom euc-jp "\xa5\xd7\xa5\xed\xa5\xad\xa5\xb7\xa4\xf2\xbb\xc8\xcd\xd1"] ::msgcat::mcset ja {User Manual} [encoding convertfrom euc-jp "\xa5\xe6\xa1\xbc\xa5\xb6\xa1\xbc\xa5\xde\xa5\xcb\xa5\xe5\xa5\xa2\xa5\xeb"] ::msgcat::mcset ja {Username} [encoding convertfrom euc-jp "\xa5\xe6\xa1\xbc\xa5\xb6\xa1\xbc\xcc\xbe"] ::msgcat::mcset ja {User} [encoding convertfrom euc-jp "\xa5\xe6\xa1\xbc\xa5\xb6\xa1\xbc"] ::msgcat::mcset ja {Use} [encoding convertfrom euc-jp "\xbb\xc8\xcd\xd1"] ::msgcat::mcset ja {VO Server} ::msgcat::mcset ja {VO} [encoding convertfrom euc-jp "\xb2\xbe\xc1\xdb\xc5\xb7\xca\xb8\xc2\xe6"] ::msgcat::mcset ja {Value} [encoding convertfrom euc-jp "\xc3\xcd"] ::msgcat::mcset ja {Vector} [encoding convertfrom euc-jp "\xa5\xd9\xa5\xaf\xa5\xc8\xa5\xeb"] ::msgcat::mcset ja {Vertical Graph} [encoding convertfrom euc-jp "\xbd\xc4\xc3\xc7\xcc\xcc"] ::msgcat::mcset ja {Vertical Layout} [encoding convertfrom euc-jp "\xb2\xe8\xcc\xcc\xa4\xce\xba\xb8\xa4\xcb\xc7\xdb\xc3\xd6"] ::msgcat::mcset ja {Vertical Text} ::msgcat::mcset ja {Vertical} ::msgcat::mcset ja {View} [encoding convertfrom euc-jp "\xc9\xbd\xbc\xa8"] ::msgcat::mcset ja {Virtual Observatory} [encoding convertfrom euc-jp "\xb2\xbe\xc1\xdb\xc5\xb7\xca\xb8\xc2\xe6"] ::msgcat::mcset ja {WCS Parameters} ::msgcat::mcset ja {WCS} ::msgcat::mcset ja {Wavelength} [encoding convertfrom euc-jp "\xc7\xc8\xc4\xb9"] ::msgcat::mcset ja {Web Browser} [encoding convertfrom euc-jp "\xa5\xd6\xa5\xe9\xa5\xa6\xa5\xb6"] ::msgcat::mcset ja {White} [encoding convertfrom euc-jp "\xc7\xf2\xbf\xa7"] ::msgcat::mcset ja {Width} [encoding convertfrom euc-jp "\xc9\xfd"] ::msgcat::mcset ja {Window} ::msgcat::mcset ja {Words matching title, description} ::msgcat::mcset ja {Writing Catalog} [encoding convertfrom euc-jp "\xa5\xab\xa5\xbf\xa5\xed\xa5\xb0\xa4\xf2\xbd\xf1\xa4\xad\xbd\xd0\xa4\xb7\xc3\xe6"] ::msgcat::mcset ja {X Axis Title} ::msgcat::mcset ja {X Grid} ::msgcat::mcset ja {XPA Information} [encoding convertfrom euc-jp "\x58\x50\x41\xa4\xce\xbe\xf0\xca\xf3"] ::msgcat::mcset ja {XPA not initialized} [encoding convertfrom euc-jp "\x58\x50\x41\x20\xa4\xac\xbd\xe9\xb4\xfc\xb2\xbd\xa4\xb5\xa4\xec\xa4\xc6\xa4\xa4\xa4\xde\xa4\xbb\xa4\xf3\xa1\xa3"] ::msgcat::mcset ja {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset ja {XPA} [encoding convertfrom euc-jp "\x58\x50\x41"] ::msgcat::mcset ja {X} ::msgcat::mcset ja {Y Axis Title} ::msgcat::mcset ja {Y Grid} ::msgcat::mcset ja {Yellow} [encoding convertfrom euc-jp "\xb2\xab\xbf\xa7"] ::msgcat::mcset ja {Y} ::msgcat::mcset ja {Z Axis Scale} ::msgcat::mcset ja {ZScale Parameters} [encoding convertfrom euc-jp "\x5a\xa5\xb9\xa5\xb1\xa1\xbc\xa5\xeb\xa4\xce\xc0\xdf\xc4\xea"] ::msgcat::mcset ja {Zero} [encoding convertfrom euc-jp "\xce\xed"] ::msgcat::mcset ja {Zoom Fit} ::msgcat::mcset ja {Zoom In} [encoding convertfrom euc-jp "\xb3\xc8\xc2\xe7"] ::msgcat::mcset ja {Zoom Out} [encoding convertfrom euc-jp "\xbd\xcc\xbe\xae"] ::msgcat::mcset ja {Zoom} [encoding convertfrom euc-jp "\xa5\xba\xa1\xbc\xa5\xe0"] ::msgcat::mcset ja {and} ::msgcat::mcset ja {blue} ::msgcat::mcset ja {b} ::msgcat::mcset ja {color} ::msgcat::mcset ja {cool} ::msgcat::mcset ja {green} ::msgcat::mcset ja {grey} ::msgcat::mcset ja {g} ::msgcat::mcset ja {h5utils} ::msgcat::mcset ja {heat} ::msgcat::mcset ja {not} ::msgcat::mcset ja {only} ::msgcat::mcset ja {or center of data} [encoding convertfrom euc-jp "\xa4\xe2\xa4\xb7\xa4\xaf\xa4\xcf\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xce\xc3\xe6\xbf\xb4"] ::msgcat::mcset ja {rainbow} ::msgcat::mcset ja {red} ::msgcat::mcset ja {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom euc-jp "\xb9\xd4\xa4\xce\xa5\xc7\xa1\xbc\xa5\xbf\xa4\xac\xa5\xc0\xa5\xa6\xa5\xf3\xa5\xed\xa1\xbc\xa5\xc9\xa4\xb5\xa4\xec\xa4\xde\xa4\xb7\xa4\xbf\xa1\xa3\xa4\xb5\xa4\xe9\xa4\xcb\xa5\xc0\xa5\xa6\xa5\xf3\xa5\xed\xa1\xbc\xa5\xc9\xa4\xb9\xa4\xeb\xbe\xec\xb9\xe7\xa4\xcf\xa1\xa2\xba\xc7\xc2\xe7\xb9\xd4\xbf\xf4\xa4\xf2\xc0\xdf\xc4\xea\xa4\xb7\xa4\xca\xa4\xaa\xa4\xb7\xa4\xc6\xa4\xaf\xa4\xc0\xa4\xb5\xa4\xa4\xa1\xa3"] ::msgcat::mcset ja {r} ::msgcat::mcset ja {staircase} ::msgcat::mcset ja {standard} ::msgcat::mcset ja {x} ::msgcat::mcset ja {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/pt.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000120115 12600277755 015202� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset pt {2D} ::msgcat::mcset pt {3D} ::msgcat::mcset pt {A postscript generation error has occurred} {Um erro ocorreu ao gerar o postscript} ::msgcat::mcset pt {AIP} ::msgcat::mcset pt {Abort} ::msgcat::mcset pt {About SAOImage DS9} {Sobre o SAOImage DS9} ::msgcat::mcset pt {About} {Sobre} ::msgcat::mcset pt {Acknowledgment} [encoding convertfrom iso8859-1 {Crditos}] ::msgcat::mcset pt {Add} {Adicionar} ::msgcat::mcset pt {Advanced} [encoding convertfrom iso8859-1 {Avanado}] ::msgcat::mcset pt {Aligned} ::msgcat::mcset pt {Align} {Alinhar} ::msgcat::mcset pt {All Columns} {Todas as colunas} ::msgcat::mcset pt {All Rows} {Todas as linhas} ::msgcat::mcset pt {All} {Tudo} ::msgcat::mcset pt {Always save files during Backup} ::msgcat::mcset pt {Amplifier} {Aplificador} ::msgcat::mcset pt {An error has occurred during backup} ::msgcat::mcset pt {An error has occurred during restore} ::msgcat::mcset pt {An error has occurred invoking the Analysis task} [encoding convertfrom iso8859-1 {Um erro ocorreu ao chamar a tarefa de Anlise}] ::msgcat::mcset pt {An error has occurred while creating image.} ::msgcat::mcset pt {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset pt {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset pt {An error has occurred while printing} {Um erro ocorreu ao imprimir} ::msgcat::mcset pt {An error has occurred while reading image.} ::msgcat::mcset pt {An error has occurred while saving} {Um erro ocorreu ao salvar} ::msgcat::mcset pt {An error has occurred while updating VO server list} ::msgcat::mcset pt {An error has occurred while writing image.} ::msgcat::mcset pt {An internal error has been detected} ::msgcat::mcset pt {Analysis Command Log} [encoding convertfrom iso8859-1 {Registro de Comandos de Anlise}] ::msgcat::mcset pt {Analysis Commands} ::msgcat::mcset pt {Analysis File} ::msgcat::mcset pt {Analysis Log} ::msgcat::mcset pt {Analysis} [encoding convertfrom iso8859-1 {Anlise}] ::msgcat::mcset pt {Angle Complement} [encoding convertfrom iso8859-1 {Complemento do ngulo}] ::msgcat::mcset pt {Angles} [encoding convertfrom iso8859-1 {ngulos}] ::msgcat::mcset pt {Angle} [encoding convertfrom iso8859-1 {ngulo}] ::msgcat::mcset pt {Annuli} {Annuli} ::msgcat::mcset pt {Annulus} {Annulus} ::msgcat::mcset pt {Apply} {Aplicar} ::msgcat::mcset pt {ArcMin} ::msgcat::mcset pt {ArcSec} ::msgcat::mcset pt {Architecture} {Arquitetura} ::msgcat::mcset pt {Archives} {Arquivos} ::msgcat::mcset pt {Array} ::msgcat::mcset pt {Arrow} {Seta} ::msgcat::mcset pt {Astronomy} ::msgcat::mcset pt {At Startup} ::msgcat::mcset pt {At least 2 different catalogs are required} ::msgcat::mcset pt {Auto Centroid} ::msgcat::mcset pt {Auto Plot 2D} ::msgcat::mcset pt {Auto Plot 3D} ::msgcat::mcset pt {Auto Plot Statistics} ::msgcat::mcset pt {Auto Plot} ::msgcat::mcset pt {Autoload FITS Regions} [encoding convertfrom iso8859-1 {Auto-carregar regies FITS}] ::msgcat::mcset pt {Autoload} ::msgcat::mcset pt {Automatic} [encoding convertfrom iso8859-1 {Automtico}] ::msgcat::mcset pt {Average} [encoding convertfrom iso8859-1 {Mdia}] ::msgcat::mcset pt {Axes Number} ::msgcat::mcset pt {Axes Order} ::msgcat::mcset pt {Axes Title} ::msgcat::mcset pt {Axes} {Eixos} ::msgcat::mcset pt {Axis Length} {Tamanho do eixo} ::msgcat::mcset pt {Axis Numbers} [encoding convertfrom iso8859-1 {Numerao do eixo}] ::msgcat::mcset pt {Axis Title} ::msgcat::mcset pt {Axis} {Eixo} ::msgcat::mcset pt {Azimuth} ::msgcat::mcset pt {Background Color} {Cor de fundo} ::msgcat::mcset pt {Background} {Fundo} ::msgcat::mcset pt {Backup} ::msgcat::mcset pt {Back} {Anterior} ::msgcat::mcset pt {Bar Plot Tool} ::msgcat::mcset pt {Bias} ::msgcat::mcset pt {Bin 3rd Column} {Bin terceira coluna} ::msgcat::mcset pt {Bin Center} {Centro do Bin} ::msgcat::mcset pt {Bin Columns} {Binar colunas} ::msgcat::mcset pt {Bin Filter} {Filtro do Bin} ::msgcat::mcset pt {Bin Fit} ::msgcat::mcset pt {Bin In} ::msgcat::mcset pt {Bin Out} ::msgcat::mcset pt {Binning Parameters} [encoding convertfrom iso8859-1 {Parmetros de Binning}] ::msgcat::mcset pt {Bin} ::msgcat::mcset pt {Black} {Preto} ::msgcat::mcset pt {Blank/Inf/NaN Color} {Cor Preto/Inf/NaN} ::msgcat::mcset pt {Blink Frames} {Blinkar quadros} ::msgcat::mcset pt {Blink Interval} {Intervalo de Blink} ::msgcat::mcset pt {Blink} ::msgcat::mcset pt {Block Fit} ::msgcat::mcset pt {Block In} {Bin em} ::msgcat::mcset pt {Block Out} {Bin partir} ::msgcat::mcset pt {Block Parameters} ::msgcat::mcset pt {Block} {Bin} ::msgcat::mcset pt {Blue} {Azul} ::msgcat::mcset pt {Bold} {Negrito} ::msgcat::mcset pt {Border} {Borda} ::msgcat::mcset pt {Bottom} ::msgcat::mcset pt {Box Annulus} {Annulus da Caixa} ::msgcat::mcset pt {Box Panda} {Panda Caixa} ::msgcat::mcset pt {BoxCircle} ::msgcat::mcset pt {Boxcar} ::msgcat::mcset pt {Box} {Caixa} ::msgcat::mcset pt {Broadcast} ::msgcat::mcset pt {Browser} ::msgcat::mcset pt {Browse} {Navegar} ::msgcat::mcset pt {Buffer} ::msgcat::mcset pt {Buttonbar} ::msgcat::mcset pt {Buttons} {Botoes} ::msgcat::mcset pt {Bytes} ::msgcat::mcset pt {CMYK} ::msgcat::mcset pt {Can Delete} {Pode Apagar} ::msgcat::mcset pt {Can Edit} {Pode Editar} ::msgcat::mcset pt {Can Move} {Pode Mover} ::msgcat::mcset pt {Can Rotate} {Pode Rodar} ::msgcat::mcset pt {Cancel} {Cancelar} ::msgcat::mcset pt {Cap} ::msgcat::mcset pt {Catalog Server} [encoding convertfrom iso8859-1 {Servidor do Catlogo}] ::msgcat::mcset pt {Catalog Tool} [encoding convertfrom iso8859-1 {Ferramenta de Catlogos}] ::msgcat::mcset pt {Catalogs} [encoding convertfrom iso8859-1 {Catlogos}] ::msgcat::mcset pt {Catalog} [encoding convertfrom iso8859-1 {Catlogo}] ::msgcat::mcset pt {Catrom} ::msgcat::mcset pt {Cat} ::msgcat::mcset pt {Center Image} {Centralizar Imagem} ::msgcat::mcset pt {Center Non-modal Dialogs} ::msgcat::mcset pt {Center} {Centro} ::msgcat::mcset pt {Centroid Parameters} ::msgcat::mcset pt {Centroid} ::msgcat::mcset pt {Circle} {Circulo} ::msgcat::mcset pt {Clear All} {Limpar tudo} ::msgcat::mcset pt {Clear Analysis Commands} [encoding convertfrom iso8859-1 {Limpar Comandos de Anlise}] ::msgcat::mcset pt {Clear Cache} {Limpar cache} ::msgcat::mcset pt {Clear Data} {Limpar dados} ::msgcat::mcset pt {Clear External Analysis Commands?} {Limpar Comandos de Anlise Externos?} ::msgcat::mcset pt {Clear Filter} {Limpar Filtro} ::msgcat::mcset pt {Clear Frame} {Limpar Frame} ::msgcat::mcset pt {Clear Preferences?} [encoding convertfrom iso8859-1 {Limpar preferncias?}] ::msgcat::mcset pt {Clear Preferences} [encoding convertfrom iso8859-1 {Limpar preferncias}] ::msgcat::mcset pt {Clear} {Limpar} ::msgcat::mcset pt {Click to Center} {Clique para centralizar} ::msgcat::mcset pt {Close} {Fechar} ::msgcat::mcset pt {Colorbar Size} ::msgcat::mcset pt {Colorbar} {Barra de Cores} ::msgcat::mcset pt {Colormap Parameters} [encoding convertfrom iso8859-1 {Parmetros do Mapa de Cores}] ::msgcat::mcset pt {Colormap} {Mapa de Cores} ::msgcat::mcset pt {Color} {Cor} ::msgcat::mcset pt {Columns} {Colunas} ::msgcat::mcset pt {Column} {Coluna} ::msgcat::mcset pt {Command} ::msgcat::mcset pt {Compass} {Compasso} ::msgcat::mcset pt {Composite Region} ::msgcat::mcset pt {Composite} ::msgcat::mcset pt {Compression} [encoding convertfrom iso8859-1 {Compresso}] ::msgcat::mcset pt {Configure} {Configurar} ::msgcat::mcset pt {Connect Directly} {Conectar diretamente} ::msgcat::mcset pt {Connect SAMP} ::msgcat::mcset pt {Connect Using Web Proxy} {Connectar usando Proxy Web} ::msgcat::mcset pt {Connect} ::msgcat::mcset pt {Console} ::msgcat::mcset pt {Contour Parameters} [encoding convertfrom iso8859-1 {Parmetros de contorno}] ::msgcat::mcset pt {Contours} {Contornos} ::msgcat::mcset pt {Contour} ::msgcat::mcset pt {Contrast} {Contraste} ::msgcat::mcset pt {Convert to Polygons} [encoding convertfrom iso8859-1 {Converter para polgonos}] ::msgcat::mcset pt {Coordinate Grid Parameters} [encoding convertfrom iso8859-1 {Parmetros do Grid de Coordenadas}] ::msgcat::mcset pt {Coordinate Grid} {Grid de Coordenadas} ::msgcat::mcset pt {Coordinate System} {Sistema de Coordenadas} ::msgcat::mcset pt {Coordinates} ::msgcat::mcset pt {Coordinate} {Coordenada} ::msgcat::mcset pt {Copy Contours} {Copiar Contornos} ::msgcat::mcset pt {Copy to Regions} [encoding convertfrom iso8859-1 {Copiar para Regies}] ::msgcat::mcset pt {Copy} {Copiar} ::msgcat::mcset pt {Create Movie} ::msgcat::mcset pt {Create New Frame on Download} {Criar novo Frame ao carregar} ::msgcat::mcset pt {Create} ::msgcat::mcset pt {Crop Parameters} ::msgcat::mcset pt {Crop} ::msgcat::mcset pt {Crosshair Parameters} ::msgcat::mcset pt {Crosshair To} {Cruz para} ::msgcat::mcset pt {Crosshair} {Cruz} ::msgcat::mcset pt {Cross} {Cruz} ::msgcat::mcset pt {Cubehelix} ::msgcat::mcset pt {Cube} ::msgcat::mcset pt {Cubic} ::msgcat::mcset pt {Current Frame} {Frame atual} ::msgcat::mcset pt {Current Range} {Intervalo atual} ::msgcat::mcset pt {Current} {Atual} ::msgcat::mcset pt {Cursor} ::msgcat::mcset pt {Cut} {Cortar} ::msgcat::mcset pt {Cyan} {Ciano} ::msgcat::mcset pt {DPI} ::msgcat::mcset pt {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset pt {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset pt {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset pt {DS9 has detected an older preferences file, do you wish to update?} [encoding convertfrom iso8859-1 {O DS9 detectou um arquivo de preferncias antigo, voc deseja atualizar?}] ::msgcat::mcset pt {DS9 will complete the initialization process} [encoding convertfrom iso8859-1 {O DS9 completou o processo de inicializao}] ::msgcat::mcset pt {Dash} [encoding convertfrom iso8859-1 {Trao}] ::msgcat::mcset pt {Data Format} {Formato de dados} ::msgcat::mcset pt {Dataset Name} ::msgcat::mcset pt {Dataset} {Conjunto de dados} ::msgcat::mcset pt {Data} ::msgcat::mcset pt {Decrease} {Diminuir} ::msgcat::mcset pt {Default All Files} ::msgcat::mcset pt {Default Format} ::msgcat::mcset pt {Default Length} ::msgcat::mcset pt {Default} [encoding convertfrom iso8859-1 {Padro}] ::msgcat::mcset pt {Degrees} {Graus} ::msgcat::mcset pt {Delete All Frames?} {Apagar todos Frames?} ::msgcat::mcset pt {Delete All Frames} {Apagar todos Frames} ::msgcat::mcset pt {Delete All Groups?} {Apagar todos os grupos?} ::msgcat::mcset pt {Delete All Groups} {Apagar todos os grupos} ::msgcat::mcset pt {Delete All Regions?} {Apagar todas as Regies?} ::msgcat::mcset pt {Delete All Regions} {Apagar todas as Regies} ::msgcat::mcset pt {Delete All} ::msgcat::mcset pt {Delete Color Tags} ::msgcat::mcset pt {Delete Frame} {Apague o Frame} ::msgcat::mcset pt {Delete Group} {Apague o Grupo} ::msgcat::mcset pt {Delete Selected Regions} [encoding convertfrom iso8859-1 {Apagar Regies Selecionadas}] ::msgcat::mcset pt {Delete} {Apagar} ::msgcat::mcset pt {Depth} {Profundidade} ::msgcat::mcset pt {Detector} ::msgcat::mcset pt {Dialog Box} {Box de dialog} ::msgcat::mcset pt {Diamond} {Diamante} ::msgcat::mcset pt {Dimension} [encoding convertfrom iso8859-1 {Dimenso}] ::msgcat::mcset pt {Direction} ::msgcat::mcset pt {Disconnect} ::msgcat::mcset pt {Display Header} ::msgcat::mcset pt {Display Size} {Mostar tamanho} ::msgcat::mcset pt {Dissolve} ::msgcat::mcset pt {Distance} ::msgcat::mcset pt {Download Colormap} ::msgcat::mcset pt {Download VOTABLE format if available} ::msgcat::mcset pt {Drag to Center} {Arrate para centralizar} ::msgcat::mcset pt {Duplicate Data} ::msgcat::mcset pt {East} {Leste} ::msgcat::mcset pt {Ecliptic} {Ecliptico} ::msgcat::mcset pt {Edit Group Name} {Editar nome do Grupo} ::msgcat::mcset pt {Edit} {Editar} ::msgcat::mcset pt {Elevation} ::msgcat::mcset pt {Ellipse Annulus} ::msgcat::mcset pt {Ellipse Panda} ::msgcat::mcset pt {Ellipse} {Elipse} ::msgcat::mcset pt {Elliptical Annulus} {Annulus Elipse} ::msgcat::mcset pt {Elliptical Panda} [encoding convertfrom iso8859-1 {Panda Elptico}] ::msgcat::mcset pt {Enable Confirmation Dialogs} {} ::msgcat::mcset pt {Enable} ::msgcat::mcset pt {End} {Fim} ::msgcat::mcset pt {Enter Color} ::msgcat::mcset pt {Enter Font Size} ::msgcat::mcset pt {Enter Group Name} {Entre o nome do Grupo} ::msgcat::mcset pt {Enter Search Expression} ::msgcat::mcset pt {Enter URL} ::msgcat::mcset pt {Entry} ::msgcat::mcset pt {Equal Area} [encoding convertfrom iso8859-1 {rea Igual}] ::msgcat::mcset pt {Equal Distance} [encoding convertfrom iso8859-1 {Distncia Igual}] ::msgcat::mcset pt {Equal Spacing} ::msgcat::mcset pt {Equal Value} ::msgcat::mcset pt {Error code was returned} [encoding convertfrom iso8859-1 {Retornou cdigo de erro}] ::msgcat::mcset pt {Error} {Erro} ::msgcat::mcset pt {Examine Frame} {Examinar Frame} ::msgcat::mcset pt {Examine} {Examinar} ::msgcat::mcset pt {Exam} ::msgcat::mcset pt {Exclude} {Excluir} ::msgcat::mcset pt {Executing TCL code is not enabled} ::msgcat::mcset pt {Exit} {Sair} ::msgcat::mcset pt {Export Array} ::msgcat::mcset pt {Export} ::msgcat::mcset pt {Extention} ::msgcat::mcset pt {Exterior Axes} {Eixos exteriores} ::msgcat::mcset pt {Exterior Numerics} [encoding convertfrom iso8859-1 {Numerao exterior}] ::msgcat::mcset pt {FAQ} ::msgcat::mcset pt {FK4} ::msgcat::mcset pt {FK5} ::msgcat::mcset pt {Factor} ::msgcat::mcset pt {File not Found or Unable to load FITS data MIME type} [encoding convertfrom iso8859-1 {Arquivo no encontrado ou incapaz de carregar dados FITS do tipo MIME}] ::msgcat::mcset pt {Filename} {Nome de Arquivo} ::msgcat::mcset pt {File} {Arquivo} ::msgcat::mcset pt {Fill} ::msgcat::mcset pt {Filter} {Filtro} ::msgcat::mcset pt {Find Next} [encoding convertfrom iso8859-1 {Encontrar prximo}] ::msgcat::mcset pt {Find} {Encontrado} ::msgcat::mcset pt {First Frame} ::msgcat::mcset pt {First} {Primeiro} ::msgcat::mcset pt {Fits} ::msgcat::mcset pt {Fixed in Size} {Fixa em tamanho} ::msgcat::mcset pt {Flat} ::msgcat::mcset pt {Flip} ::msgcat::mcset pt {Font} {Fonte} ::msgcat::mcset pt {For more information, use --help} ::msgcat::mcset pt {Format} {Formato} ::msgcat::mcset pt {Forward} {Frente} ::msgcat::mcset pt {Found} {Encontrado} ::msgcat::mcset pt {Frame Information} [encoding convertfrom iso8859-1 {Informao do Frame}] ::msgcat::mcset pt {Frame Parameters} ::msgcat::mcset pt {Frames} ::msgcat::mcset pt {Frame} {Frame} ::msgcat::mcset pt {From} ::msgcat::mcset pt {Front} {Frente} ::msgcat::mcset pt {Full Range} {Intervalo completo} ::msgcat::mcset pt {Function} [encoding convertfrom iso8859-1 {Funo}] ::msgcat::mcset pt {GUI Font} ::msgcat::mcset pt {Galactic} [encoding convertfrom iso8859-1 {Galctico}] ::msgcat::mcset pt {Gap} ::msgcat::mcset pt {Gaussian} {Gaussiano} ::msgcat::mcset pt {General} {Geral} ::msgcat::mcset pt {Generate} {Gerar} ::msgcat::mcset pt {Generating Regions} [encoding convertfrom iso8859-1 {Gerando regies}] ::msgcat::mcset pt {Get Information} [encoding convertfrom iso8859-1 {Obter informaes}] ::msgcat::mcset pt {Gist} ::msgcat::mcset pt {Global Properties} ::msgcat::mcset pt {Global} ::msgcat::mcset pt {Goto Frame} ::msgcat::mcset pt {Graph Horz} ::msgcat::mcset pt {Graph Vert} ::msgcat::mcset pt {Graphics} [encoding convertfrom iso8859-1 {Grficos}] ::msgcat::mcset pt {Graphs} ::msgcat::mcset pt {Graph} [encoding convertfrom iso8859-1 {Grfico}] ::msgcat::mcset pt {Grayscale} {Tons de cinza} ::msgcat::mcset pt {Green} {Verde} ::msgcat::mcset pt {Grid Gap} ::msgcat::mcset pt {Grid} {Grade} ::msgcat::mcset pt {Groove} ::msgcat::mcset pt {Groups} {Grupos} ::msgcat::mcset pt {HTTP} ::msgcat::mcset pt {Header} [encoding convertfrom iso8859-1 {Caberio}] ::msgcat::mcset pt {Height} {Altura} ::msgcat::mcset pt {Help Desk} {Centro de ajuda} ::msgcat::mcset pt {Help Me Choose} {Ajude-me escolher} ::msgcat::mcset pt {Help} {Ajuda} ::msgcat::mcset pt {Hide All} {Esconda tudo} ::msgcat::mcset pt {Highlite} ::msgcat::mcset pt {High} {Alto} ::msgcat::mcset pt {Histogram Equalization} [encoding convertfrom iso8859-1 {Equalizao de Histograma}] ::msgcat::mcset pt {Histogram} {Histograma} ::msgcat::mcset pt {Horizontal Graph} [encoding convertfrom iso8859-1 {Grfico Horizontal}] ::msgcat::mcset pt {Horizontal Layout} {Layout Horizontal} ::msgcat::mcset pt {Horizontal} ::msgcat::mcset pt {IAU Location Code} ::msgcat::mcset pt {ICRS} ::msgcat::mcset pt {Identification} [encoding convertfrom iso8859-1 {Identificao}] ::msgcat::mcset pt {If} {Se} ::msgcat::mcset pt {Image Servers} {Servidores de Imagem} ::msgcat::mcset pt {Image} {Imagem} ::msgcat::mcset pt {Import Array} ::msgcat::mcset pt {Import} ::msgcat::mcset pt {Include} {Incluir} ::msgcat::mcset pt {Increase} {Aumento} ::msgcat::mcset pt {Information Panel} [encoding convertfrom iso8859-1 {Painel de informao}] ::msgcat::mcset pt {Information} [encoding convertfrom iso8859-1 {Informao}] ::msgcat::mcset pt {Initialize XPA} {Inicialize XPA} ::msgcat::mcset pt {Inner} {Interno} ::msgcat::mcset pt {Instrument FOV} {FOV do instrumento} ::msgcat::mcset pt {Interior Axes} {Eixos Interiores} ::msgcat::mcset pt {Interior Numerics} [encoding convertfrom iso8859-1 {Numerao Interior}] ::msgcat::mcset pt {Internal Parse Error} ::msgcat::mcset pt {Interval} {Intervalo} ::msgcat::mcset pt {Invalid Column Name} ::msgcat::mcset pt {Invalid formated multipart/mixed mime type message} [encoding convertfrom iso8859-1 {Mensagem tipo MIME multiparte/mista em formato invlido}] ::msgcat::mcset pt {Invert Colormap} {Inverter mapa de cores} ::msgcat::mcset pt {Invert Selection} [encoding convertfrom iso8859-1 {Inverter Seleo}] ::msgcat::mcset pt {Invert} {Inverter} ::msgcat::mcset pt {Italic} [encoding convertfrom iso8859-1 {Itlico}] ::msgcat::mcset pt {Items Found} [encoding convertfrom iso8859-1 {tens Encontrados}] ::msgcat::mcset pt {Iteration} ::msgcat::mcset pt {JPEG Quality Factor} {Fator de qualidade JPEG} ::msgcat::mcset pt {Keep-Alive} ::msgcat::mcset pt {Kernel} ::msgcat::mcset pt {Keyboard Shortcuts} {Atalhos do teclado} ::msgcat::mcset pt {Keyboard} {Teclado} ::msgcat::mcset pt {Keyword} ::msgcat::mcset pt {Labels} {Legendas} ::msgcat::mcset pt {Label} {Legenda} ::msgcat::mcset pt {Landscape} {Paisagem} ::msgcat::mcset pt {Language} [encoding convertfrom iso8859-1 {Lngua}] ::msgcat::mcset pt {Last Frame} ::msgcat::mcset pt {Last} [encoding convertfrom iso8859-1 {ltimo}] ::msgcat::mcset pt {Layout Horz} ::msgcat::mcset pt {Layout Vert} ::msgcat::mcset pt {Layout} ::msgcat::mcset pt {Left} ::msgcat::mcset pt {Legal} ::msgcat::mcset pt {Legend Title} ::msgcat::mcset pt {Legend} ::msgcat::mcset pt {Length} {Comprimento} ::msgcat::mcset pt {Letter} {Carta} ::msgcat::mcset pt {Levels} [encoding convertfrom iso8859-1 {Nveis}] ::msgcat::mcset pt {Level} {Nvel} ::msgcat::mcset pt {Limits} {Limiter} ::msgcat::mcset pt {Line Plot Tool} ::msgcat::mcset pt {Linear} ::msgcat::mcset pt {Line} {Linha} ::msgcat::mcset pt {List Data} ::msgcat::mcset pt {List Regions} [encoding convertfrom iso8859-1 {Listar Regies}] ::msgcat::mcset pt {List} {Listar} ::msgcat::mcset pt {Load Analysis Commands} [encoding convertfrom iso8859-1 {Ler Comandos de Anlise}] ::msgcat::mcset pt {Load Color Tags} ::msgcat::mcset pt {Load Colormap} {Carregar Mapa de Cores} ::msgcat::mcset pt {Load Configuration} [encoding convertfrom iso8859-1 {Carregar Configurao}] ::msgcat::mcset pt {Load Contour Levels} [encoding convertfrom iso8859-1 {Carregar Nveis de Contorno}] ::msgcat::mcset pt {Load Contours} {Carregar Contornos} ::msgcat::mcset pt {Load Contrast/Bias} {Carregar Contraste/Bias} ::msgcat::mcset pt {Load Data} {Carregar Dados} ::msgcat::mcset pt {Load Mosaic} {Carregar Mosaico} ::msgcat::mcset pt {Load Regions} [encoding convertfrom iso8859-1 {Carregar Regies}] ::msgcat::mcset pt {Load Template} {Carregar Template} ::msgcat::mcset pt {Load into All Frames} ::msgcat::mcset pt {Load into Current Frame} ::msgcat::mcset pt {Loading Catalog} ::msgcat::mcset pt {Loading} ::msgcat::mcset pt {Load} {Carregar} ::msgcat::mcset pt {Local} ::msgcat::mcset pt {Lock Axes} ::msgcat::mcset pt {Lock Bin} ::msgcat::mcset pt {Lock Color} ::msgcat::mcset pt {Lock Crop Amplifier} ::msgcat::mcset pt {Lock Crop Detector} ::msgcat::mcset pt {Lock Crop Image} ::msgcat::mcset pt {Lock Crop None} ::msgcat::mcset pt {Lock Crop Physical} ::msgcat::mcset pt {Lock Crop WCS} ::msgcat::mcset pt {Lock Crosshair Amplifier} ::msgcat::mcset pt {Lock Crosshair Detector} ::msgcat::mcset pt {Lock Crosshair Image} ::msgcat::mcset pt {Lock Crosshair None} ::msgcat::mcset pt {Lock Crosshair Physical} ::msgcat::mcset pt {Lock Crosshair WCS} ::msgcat::mcset pt {Lock Frame Amplifier} ::msgcat::mcset pt {Lock Frame Detector} ::msgcat::mcset pt {Lock Frame Image} ::msgcat::mcset pt {Lock Frame None} ::msgcat::mcset pt {Lock Frame Physical} ::msgcat::mcset pt {Lock Frame WCS} ::msgcat::mcset pt {Lock Limits} ::msgcat::mcset pt {Lock Scale} ::msgcat::mcset pt {Lock Slice Image} ::msgcat::mcset pt {Lock Slice None} ::msgcat::mcset pt {Lock Slice WCS} ::msgcat::mcset pt {Lock Smooth} ::msgcat::mcset pt {Lock} {Travar} ::msgcat::mcset pt {Log Exponent} ::msgcat::mcset pt {Log} ::msgcat::mcset pt {Low High} {Baixo Alto} ::msgcat::mcset pt {Lower Left Back} ::msgcat::mcset pt {Lower Left Front} ::msgcat::mcset pt {Lower Right Back} ::msgcat::mcset pt {Lower Right Front} ::msgcat::mcset pt {Low} {Baixo} ::msgcat::mcset pt {MIP} ::msgcat::mcset pt {Magenta} {Magenta} ::msgcat::mcset pt {Magnification} ::msgcat::mcset pt {Magnifier} {Lente} ::msgcat::mcset pt {Major} ::msgcat::mcset pt {Manual} ::msgcat::mcset pt {Mask Parameters} [encoding convertfrom iso8859-1 {Parmetros da mscara}] ::msgcat::mcset pt {Match Axes} ::msgcat::mcset pt {Match Bin} ::msgcat::mcset pt {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset pt {Match Color} ::msgcat::mcset pt {Match Crop Amplifier} ::msgcat::mcset pt {Match Crop Detector} ::msgcat::mcset pt {Match Crop Image} ::msgcat::mcset pt {Match Crop Physical} ::msgcat::mcset pt {Match Crop WCS} ::msgcat::mcset pt {Match Crosshair Amplifier} ::msgcat::mcset pt {Match Crosshair Detector} ::msgcat::mcset pt {Match Crosshair Image} ::msgcat::mcset pt {Match Crosshair Physical} ::msgcat::mcset pt {Match Crosshair WCS} ::msgcat::mcset pt {Match Frame Amplifier} ::msgcat::mcset pt {Match Frame Detector} ::msgcat::mcset pt {Match Frame Image} ::msgcat::mcset pt {Match Frame Physical} ::msgcat::mcset pt {Match Frame WCS} ::msgcat::mcset pt {Match Limits} ::msgcat::mcset pt {Match Scale} ::msgcat::mcset pt {Match Slice Image} ::msgcat::mcset pt {Match Slice WCS} ::msgcat::mcset pt {Match Smooth} ::msgcat::mcset pt {Match} ::msgcat::mcset pt {Math Function} [encoding convertfrom iso8859-1 {Funo Matemtica}] ::msgcat::mcset pt {Matplotlib} ::msgcat::mcset pt {Max Rows} [encoding convertfrom iso8859-1 {Mximas linhas}] ::msgcat::mcset pt {Max} [encoding convertfrom iso8859-1 {Mximo}] ::msgcat::mcset pt {Menus and Buttons} ::msgcat::mcset pt {Menu} ::msgcat::mcset pt {Message Log} ::msgcat::mcset pt {Method} [encoding convertfrom iso8859-1 {Mtodo}] ::msgcat::mcset pt {Min Max Parameters} ::msgcat::mcset pt {Min Max} [encoding convertfrom iso8859-1 {Min Mx}] ::msgcat::mcset pt {Minor} {Menor} ::msgcat::mcset pt {Minutes} ::msgcat::mcset pt {Min} ::msgcat::mcset pt {Mission} [encoding convertfrom iso8859-1 {Misso}] ::msgcat::mcset pt {Mode} ::msgcat::mcset pt {Mosaic IRAF Segment} ::msgcat::mcset pt {Mosaic IRAF} ::msgcat::mcset pt {Mosaic WCS Segment} ::msgcat::mcset pt {Mosaic WCS} ::msgcat::mcset pt {Mosaic WFPC2} ::msgcat::mcset pt {Mosaic} ::msgcat::mcset pt {Mouse Click Epsilon} ::msgcat::mcset pt {Mouse Wheel Bin} ::msgcat::mcset pt {Mouse Wheel Zoom} ::msgcat::mcset pt {Mouse and Keyboard} ::msgcat::mcset pt {Move Back} ::msgcat::mcset pt {Move First} ::msgcat::mcset pt {Move Forward} ::msgcat::mcset pt {Move Frame} ::msgcat::mcset pt {Move Last} ::msgcat::mcset pt {Move to Back} [encoding convertfrom iso8859-1 {Move para trs}] ::msgcat::mcset pt {Move to Front} {Mover para frente} ::msgcat::mcset pt {Movie} ::msgcat::mcset pt {Multiple Extension Cube} ::msgcat::mcset pt {Multiple Extension Frames} ::msgcat::mcset pt {Multiple WCS} {Multiplos WCS} ::msgcat::mcset pt {NRRD} ::msgcat::mcset pt {Name Resolution} {Resolver o Nome} ::msgcat::mcset pt {Name Server} {Servidor de Nomes} ::msgcat::mcset pt {Name or Designation} [encoding convertfrom iso8859-1 {Nome ou designao}] ::msgcat::mcset pt {Name} ::msgcat::mcset pt {Native Dialog} {Dialog Nativo} ::msgcat::mcset pt {New Features} {Novo} ::msgcat::mcset pt {New Frame 3D} ::msgcat::mcset pt {New Frame RGB} {Novo Frame RGB} ::msgcat::mcset pt {New Frame each Time} ::msgcat::mcset pt {New Frame} {Novo frame} ::msgcat::mcset pt {New Group} {Novo grupo} ::msgcat::mcset pt {New} {Novo} ::msgcat::mcset pt {Next Frame} ::msgcat::mcset pt {Next} [encoding convertfrom iso8859-1 {Prximo}] ::msgcat::mcset pt {No Catalog specified} [encoding convertfrom iso8859-1 {Nenhum catlogo especificado}] ::msgcat::mcset pt {No Items Found} [encoding convertfrom iso8859-1 {Nenhum tem encontrado}] ::msgcat::mcset pt {No current frame} ::msgcat::mcset pt {No data available at } [encoding convertfrom iso8859-1 {Nenhum dado disponvel em }] ::msgcat::mcset pt {Non-zero} ::msgcat::mcset pt {None} {Nenhum} ::msgcat::mcset pt {Normal} ::msgcat::mcset pt {North} {Norte} ::msgcat::mcset pt {Not Found} ::msgcat::mcset pt {Number of Samples} ::msgcat::mcset pt {Number of Threads} ::msgcat::mcset pt {Number of Ticks} ::msgcat::mcset pt {Number} [encoding convertfrom iso8859-1 {Nmero}] ::msgcat::mcset pt {Numerics} ::msgcat::mcset pt {OK} ::msgcat::mcset pt {Object} {Objeto} ::msgcat::mcset pt {Open File} {Abrir Arquivo} ::msgcat::mcset pt {Open TCL Console} ::msgcat::mcset pt {Open URL} {Abrir URL} ::msgcat::mcset pt {Open as} ::msgcat::mcset pt {Open} {Abrir} ::msgcat::mcset pt {Operator} {Operador} ::msgcat::mcset pt {Orientation} [encoding convertfrom iso8859-1 {Orientao}] ::msgcat::mcset pt {Origin} ::msgcat::mcset pt {Oscillate} ::msgcat::mcset pt {Other Color} ::msgcat::mcset pt {Other Font Size} ::msgcat::mcset pt {Other} {Outro} ::msgcat::mcset pt {Outer} {Fora} ::msgcat::mcset pt {Overlap} ::msgcat::mcset pt {PS Page Setup} ::msgcat::mcset pt {PS Print} ::msgcat::mcset pt {Page Setup} [encoding convertfrom iso8859-1 {Configuracoes de pgina}] ::msgcat::mcset pt {Page Source} [encoding convertfrom iso8859-1 {Fonte da pgina}] ::msgcat::mcset pt {Pan To} ::msgcat::mcset pt {Pan Zoom Rotate Parameters} ::msgcat::mcset pt {Pan Zoom} ::msgcat::mcset pt {Pan then Zoom} ::msgcat::mcset pt {Panda} {Panda} ::msgcat::mcset pt {Panner} ::msgcat::mcset pt {Pan} ::msgcat::mcset pt {Parameters} [encoding convertfrom iso8859-1 {Parmetros}] ::msgcat::mcset pt {Password} {Senha} ::msgcat::mcset pt {Paste Contours} {Colar Contornos} ::msgcat::mcset pt {Paste} {Colar} ::msgcat::mcset pt {Physical} [encoding convertfrom iso8859-1 {Fsico}] ::msgcat::mcset pt {Pixel Distribution} [encoding convertfrom iso8859-1 {Distribuio de Pixels}] ::msgcat::mcset pt {Pixel Size} {Tamanho do Pixel} ::msgcat::mcset pt {Pixel Table} {Tabela de Pixels} ::msgcat::mcset pt {Pixels} ::msgcat::mcset pt {Play} {Execute} ::msgcat::mcset pt {Please Select a Region} ::msgcat::mcset pt {Please specify width, height, and either name or (ra,dec)} ::msgcat::mcset pt {Plot 2D} ::msgcat::mcset pt {Plot 3D} ::msgcat::mcset pt {Plot Title} [encoding convertfrom iso8859-1 {Ttulo}] ::msgcat::mcset pt {Plotting Regions} ::msgcat::mcset pt {Plot} ::msgcat::mcset pt {Plus} {Mais} ::msgcat::mcset pt {Pointer} {Ponteiro} ::msgcat::mcset pt {Points} {Pntos} ::msgcat::mcset pt {Point} {Ponto} ::msgcat::mcset pt {Polygon} [encoding convertfrom iso8859-1 {Polgono}] ::msgcat::mcset pt {Portrait} {Retrato} ::msgcat::mcset pt {Poster} ::msgcat::mcset pt {Postscript Page Setup} ::msgcat::mcset pt {Postscript Print} ::msgcat::mcset pt {Postscript} ::msgcat::mcset pt {Power} [encoding convertfrom iso8859-1 {Potncia}] ::msgcat::mcset pt {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} ::msgcat::mcset pt {Preferences} [encoding convertfrom iso8859-1 {Preferncias}] ::msgcat::mcset pt {Preserve During Load} {Preservar durante a carga} ::msgcat::mcset pt {Previous Frame} ::msgcat::mcset pt {Previous} {Anterior} ::msgcat::mcset pt {Prev} ::msgcat::mcset pt {Print Coordinates} {Imprimir Coordenadas} ::msgcat::mcset pt {Print To} {Imprimir Para} ::msgcat::mcset pt {Printer} {Impressora} ::msgcat::mcset pt {Print} {Imprimir} ::msgcat::mcset pt {Projection} [encoding convertfrom iso8859-1 {Projeo}] ::msgcat::mcset pt {Properties} {Propriedades} ::msgcat::mcset pt {Property} {Propriedade} ::msgcat::mcset pt {Proxy Host} {Host Proxy} ::msgcat::mcset pt {Proxy Port} {Porta do Proxy} ::msgcat::mcset pt {Publication} [encoding convertfrom iso8859-1 {Publicao}] ::msgcat::mcset pt {Quadratic} [encoding convertfrom iso8859-1 {Quadrtico}] ::msgcat::mcset pt {RGB Array} ::msgcat::mcset pt {RGB Cube} ::msgcat::mcset pt {RGB Image} ::msgcat::mcset pt {RGB} ::msgcat::mcset pt {Radial Profile} ::msgcat::mcset pt {Radial} ::msgcat::mcset pt {Radius} {Raio} ::msgcat::mcset pt {Raised} ::msgcat::mcset pt {Range} ::msgcat::mcset pt {Redo} {Refazer} ::msgcat::mcset pt {Red} {Vermelho} ::msgcat::mcset pt {Reference Manual} [encoding convertfrom iso8859-1 {Manual de referncia}] ::msgcat::mcset pt {Reference} [encoding convertfrom iso8859-1 {Referncia}] ::msgcat::mcset pt {Refresh Frame} {Recarregar Frame} ::msgcat::mcset pt {Refresh} ::msgcat::mcset pt {Region Parameters} ::msgcat::mcset pt {Region} [encoding convertfrom iso8859-1 {Regio}] ::msgcat::mcset pt {Release Notes} [encoding convertfrom iso8859-1 {Notas das Verso}] ::msgcat::mcset pt {Release} [encoding convertfrom iso8859-1 {Verso}] ::msgcat::mcset pt {Relief} ::msgcat::mcset pt {Reload} {Recarregar} ::msgcat::mcset pt {Render} ::msgcat::mcset pt {Repeat} ::msgcat::mcset pt {Reset Colormap} {Reiniciar mapa de cores} ::msgcat::mcset pt {Reset Frame} {Reiniciar Frame} ::msgcat::mcset pt {Reset} ::msgcat::mcset pt {Restore} ::msgcat::mcset pt {Retrieve} {Receber} ::msgcat::mcset pt {Return} ::msgcat::mcset pt {Right} ::msgcat::mcset pt {Roman} ::msgcat::mcset pt {Rotate} {Rodar} ::msgcat::mcset pt {Rows} {Linhas} ::msgcat::mcset pt {Row} ::msgcat::mcset pt {Ruler} [encoding convertfrom iso8859-1 {Rgua}] ::msgcat::mcset pt {SAMP Image} ::msgcat::mcset pt {SAMP Table} ::msgcat::mcset pt {SAMP: already connected} ::msgcat::mcset pt {SAMP: internal error} ::msgcat::mcset pt {SAMP: not connected} ::msgcat::mcset pt {SAMP: unable to locate HUB} ::msgcat::mcset pt {SAMP} ::msgcat::mcset pt {Sample Increment} {Incremento da Amostra} ::msgcat::mcset pt {Sample Parameters} [encoding convertfrom iso8859-1 {Parmetros da Amostra}] ::msgcat::mcset pt {Samples per Line} {Amostras por Linha} ::msgcat::mcset pt {Sample} {Amostra} ::msgcat::mcset pt {Save 3D Movie} ::msgcat::mcset pt {Save Color Tags} ::msgcat::mcset pt {Save Colormap} {Salvar Mapa de Cores} ::msgcat::mcset pt {Save Configuration} [encoding convertfrom iso8859-1 {Salvar Configurao}] ::msgcat::mcset pt {Save Contour Levels} {Salvar Nveis de Contorno} ::msgcat::mcset pt {Save Contours} {Salvar Contornos} ::msgcat::mcset pt {Save Contrast/Bias} {Salvar Contraste/Bias} ::msgcat::mcset pt {Save Data} {Salvar Dados} ::msgcat::mcset pt {Save Image on Download} ::msgcat::mcset pt {Save Image} {Salvar Imagem} ::msgcat::mcset pt {Save Regions} [encoding convertfrom iso8859-1 {Salvar Regies}] ::msgcat::mcset pt {Save Template} ::msgcat::mcset pt {Save as} ::msgcat::mcset pt {Save} {Salvar} ::msgcat::mcset pt {Scale Parameters} [encoding convertfrom iso8859-1 {Parmetros da Escala}] ::msgcat::mcset pt {Scale and Limits} ::msgcat::mcset pt {Scale} {Escala} ::msgcat::mcset pt {Scan} ::msgcat::mcset pt {Scatter Plot Tool} ::msgcat::mcset pt {Scope} {Escopo} ::msgcat::mcset pt {Search for Catalogs} [encoding convertfrom iso8859-1 {Buscar Catlogos}] ::msgcat::mcset pt {Searching for catalogs} [encoding convertfrom iso8859-1 {Buscando Catlogos}] ::msgcat::mcset pt {Seconds} {Segundos} ::msgcat::mcset pt {Segment} ::msgcat::mcset pt {Select All} {Selecionar tudo} ::msgcat::mcset pt {Select Coordinate System } {Selecionar Sistema de Coordenadas} ::msgcat::mcset pt {Select None} {Selecionar Nada} ::msgcat::mcset pt {Select} ::msgcat::mcset pt {Send} ::msgcat::mcset pt {Server} {Servidor} ::msgcat::mcset pt {Sexagesimal} ::msgcat::mcset pt {Shape} {Formato} ::msgcat::mcset pt {Show All} {Mostre todos} ::msgcat::mcset pt {Show Command} ::msgcat::mcset pt {Show Compass} ::msgcat::mcset pt {Show Text} ::msgcat::mcset pt {Show/Hide Frames} {Mostra/Esconde Frames} ::msgcat::mcset pt {Show} {Mostrar} ::msgcat::mcset pt {Simple Cross} ::msgcat::mcset pt {Simple Plus} ::msgcat::mcset pt {Single Frame} [encoding convertfrom iso8859-1 {Frame nico}] ::msgcat::mcset pt {Single} [encoding convertfrom iso8859-1 {nico}] ::msgcat::mcset pt {Sites} ::msgcat::mcset pt {Size/Radius} {Tamanho/Raio} ::msgcat::mcset pt {Size} {Tamanho} ::msgcat::mcset pt {Skip First} {Pular Primeiro} ::msgcat::mcset pt {Slice} ::msgcat::mcset pt {Smooth Parameters} [encoding convertfrom iso8859-1 {Parmetros da Suavizao}] ::msgcat::mcset pt {Smoothness} ::msgcat::mcset pt {Smooth} {Suavizar} ::msgcat::mcset pt {Solid} ::msgcat::mcset pt {Sorry, DS9 does not support} [encoding convertfrom iso8859-1 {Perdo, o DS9 no suporta}] ::msgcat::mcset pt {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset pt {Sort} {Organizar} ::msgcat::mcset pt {Source TCL} [encoding convertfrom iso8859-1 {Cdigo TCL}] ::msgcat::mcset pt {Source} {Fonte} ::msgcat::mcset pt {Space Equal Distance} ::msgcat::mcset pt {Space Equal Value} ::msgcat::mcset pt {Spacing} [encoding convertfrom iso8859-1 {Espaamento}] ::msgcat::mcset pt {Sqrt} ::msgcat::mcset pt {Square Root} {Raiz Quadrada} ::msgcat::mcset pt {Squared} {Quadrado} ::msgcat::mcset pt {Square} ::msgcat::mcset pt {Stacked} ::msgcat::mcset pt {Starbase} ::msgcat::mcset pt {Startup} ::msgcat::mcset pt {Start} {Iniciar} ::msgcat::mcset pt {Statistics} ::msgcat::mcset pt {Stats} ::msgcat::mcset pt {Status} {Estado} ::msgcat::mcset pt {Step} {Passo} ::msgcat::mcset pt {Stop} {Parar} ::msgcat::mcset pt {Story of SAOImage DS9} ::msgcat::mcset pt {Story} ::msgcat::mcset pt {Sum} {Soma} ::msgcat::mcset pt {Sunken} ::msgcat::mcset pt {Symbol Editor} ::msgcat::mcset pt {Symbol} [encoding convertfrom iso8859-1 {Smbolo}] ::msgcat::mcset pt {Tab-Separated-Value} ::msgcat::mcset pt {Table} ::msgcat::mcset pt {Tabloid} [encoding convertfrom iso8859-1 {Tablide}] ::msgcat::mcset pt {Task} ::msgcat::mcset pt {Template} ::msgcat::mcset pt {Text Font} ::msgcat::mcset pt {Text} {Texto} ::msgcat::mcset pt {Then} [encoding convertfrom iso8859-1 {Ento}] ::msgcat::mcset pt {Thickness} {Expessura} ::msgcat::mcset pt {This analysis task is already running. Do you wish to kill it?} [encoding convertfrom iso8859-1 {Esta anlise j est sendo executada. Voc deseja parar?}] ::msgcat::mcset pt {This function is not currently supported for this port.} ::msgcat::mcset pt {Tickmarks} ::msgcat::mcset pt {Tile Frames} ::msgcat::mcset pt {Tile Parameters} ::msgcat::mcset pt {Tile} ::msgcat::mcset pt {Times} ::msgcat::mcset pt {Title} [encoding convertfrom iso8859-1 {Ttulo}] ::msgcat::mcset pt {Tophat} ::msgcat::mcset pt {Topographic} ::msgcat::mcset pt {Top} ::msgcat::mcset pt {To} {Para} ::msgcat::mcset pt {Transparency} ::msgcat::mcset pt {Triangle} ::msgcat::mcset pt {Type} {Tipo} ::msgcat::mcset pt {URL} ::msgcat::mcset pt {Unable to connect directly: using Web Proxy} ::msgcat::mcset pt {Unable to determine date of observation} ::msgcat::mcset pt {Unable to determine time of observation} ::msgcat::mcset pt {Unable to evaluate filter} {Incapaz de calcular filtro} ::msgcat::mcset pt {Unable to find catalog window} [encoding convertfrom iso8859-1 {Incapaz de encontrar janela do catlogo}] ::msgcat::mcset pt {Unable to find plot window} [encoding convertfrom iso8859-1 {Incapaz de encontrar janela de grfico}] ::msgcat::mcset pt {Unable to load RGB image into a non-rgb frame} [encoding convertfrom iso8859-1 {Incapaz de carregar imagem RGB em um frame no RGB}] ::msgcat::mcset pt {Unable to load region file} ::msgcat::mcset pt {Unable to load} {Incapaz de carregar} ::msgcat::mcset pt {Unable to locate URL} {Incapaz de localizar URL} ::msgcat::mcset pt {Unable to match target with XPA Mime request} ::msgcat::mcset pt {Unable to open file} {Incapaz de abrir arquivo} ::msgcat::mcset pt {Unable to process Analysis file} ::msgcat::mcset pt {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset pt {Undo} {Voltar} ::msgcat::mcset pt {Unique} ::msgcat::mcset pt {Unists} ::msgcat::mcset pt {Units} {Unidades} ::msgcat::mcset pt {Unknown Colormap} ::msgcat::mcset pt {Unknown command} ::msgcat::mcset pt {Update Filter} ::msgcat::mcset pt {Update Group} {Atualizar Grupo} ::msgcat::mcset pt {Update from Current Crosshair} {Atualizar da Cruz Atual} ::msgcat::mcset pt {Update from Current Frame} {Atualizar do Frame Atual} ::msgcat::mcset pt {Update} {Atualizar} ::msgcat::mcset pt {Upper Left Back} ::msgcat::mcset pt {Upper Left Front} ::msgcat::mcset pt {Upper Right Back} ::msgcat::mcset pt {Upper Right Front} ::msgcat::mcset pt {Use Authentication} [encoding convertfrom iso8859-1 {Utilizar Autenticao}] ::msgcat::mcset pt {Use Current Frame on Download} {Utilizar Frame Atual ao Descarregar} ::msgcat::mcset pt {Use Internal Web Browser} {Utilizar Navegador Web Interno} ::msgcat::mcset pt {Use Proxy} {Utilizar Proxy} ::msgcat::mcset pt {User Manual} ::msgcat::mcset pt {Username} [encoding convertfrom iso8859-1 {Nome de usurio}] ::msgcat::mcset pt {User} [encoding convertfrom iso8859-1 {Usurio}] ::msgcat::mcset pt {Use} {Usar} ::msgcat::mcset pt {VO Server} ::msgcat::mcset pt {VO} ::msgcat::mcset pt {Value} {Valor} ::msgcat::mcset pt {Vector} {Vetor} ::msgcat::mcset pt {Vertical Graph} [encoding convertfrom iso8859-1 {Grfico Vertical}] ::msgcat::mcset pt {Vertical Layout} {Layout Vertical} ::msgcat::mcset pt {Vertical Text} {Texto Vertical} ::msgcat::mcset pt {Vertical} ::msgcat::mcset pt {View} {Visualizar} ::msgcat::mcset pt {Virtual Observatory} [encoding convertfrom iso8859-1 {Observatrio Virtual}] ::msgcat::mcset pt {WCS Parameters} ::msgcat::mcset pt {WCS} ::msgcat::mcset pt {Wavelength} {Comprimento de Onda} ::msgcat::mcset pt {Web Browser} {Navegador Web} ::msgcat::mcset pt {White} {Branco} ::msgcat::mcset pt {Width} {Largura} ::msgcat::mcset pt {Window} ::msgcat::mcset pt {Words matching title, description} ::msgcat::mcset pt {Writing Catalog} ::msgcat::mcset pt {X Axis Title} ::msgcat::mcset pt {X Grid} ::msgcat::mcset pt {XPA Information} [encoding convertfrom iso8859-1 {Informao sobre o XPA}] ::msgcat::mcset pt {XPA not initialized} [encoding convertfrom iso8859-1 {XPA no inicializado}] ::msgcat::mcset pt {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset pt {XPA} ::msgcat::mcset pt {X} ::msgcat::mcset pt {Y Axis Title} ::msgcat::mcset pt {Y Grid} ::msgcat::mcset pt {Yellow} {Amarelo} ::msgcat::mcset pt {Y} ::msgcat::mcset pt {Z Axis Scale} ::msgcat::mcset pt {ZScale Parameters} [encoding convertfrom iso8859-1 {Parmetros da escala Z}] ::msgcat::mcset pt {Zero} ::msgcat::mcset pt {Zoom Fit} ::msgcat::mcset pt {Zoom In} {Aumentar} ::msgcat::mcset pt {Zoom Out} {Diminuir} ::msgcat::mcset pt {Zoom} {Fator} ::msgcat::mcset pt {and} ::msgcat::mcset pt {blue} ::msgcat::mcset pt {b} ::msgcat::mcset pt {color} ::msgcat::mcset pt {cool} ::msgcat::mcset pt {green} ::msgcat::mcset pt {grey} ::msgcat::mcset pt {g} ::msgcat::mcset pt {h5utils} ::msgcat::mcset pt {heat} ::msgcat::mcset pt {not} ::msgcat::mcset pt {only} ::msgcat::mcset pt {or center of data} {ou centro dos dados} ::msgcat::mcset pt {rainbow} ::msgcat::mcset pt {red} ::msgcat::mcset pt {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} [encoding convertfrom iso8859-1 {colunas de dados foram descarregadas. Mais podem estar disponveis. Voc pode querer ajustar o mximo permitido}] ::msgcat::mcset pt {r} ::msgcat::mcset pt {staircase} ::msgcat::mcset pt {standard} ::msgcat::mcset pt {x} ::msgcat::mcset pt {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/msgs/zh.msg������������������������������������������������������������������������������000644 �000765 �000000 �00000111203 12600277755 015176� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������::msgcat::mcset zh {2D} ::msgcat::mcset zh {3D} ::msgcat::mcset zh {A postscript generation error has occurred} ::msgcat::mcset zh {AIP} ::msgcat::mcset zh {Abort} ::msgcat::mcset zh {About SAOImage DS9} ::msgcat::mcset zh {About} [encoding convertfrom big5 "\xC3\xF6 \xA9\xF3"] ::msgcat::mcset zh {Acknowledgment} ::msgcat::mcset zh {Add} ::msgcat::mcset zh {Advanced} ::msgcat::mcset zh {Aligned} ::msgcat::mcset zh {Align} [encoding convertfrom big5 "\xB9\xEF \xBB\xF4 \xA4\xE8 \xA6\xEC"] ::msgcat::mcset zh {All Columns} ::msgcat::mcset zh {All Rows} ::msgcat::mcset zh {All} ::msgcat::mcset zh {Always save files during Backup} ::msgcat::mcset zh {Amplifier} ::msgcat::mcset zh {An error has occurred during backup} ::msgcat::mcset zh {An error has occurred during restore} ::msgcat::mcset zh {An error has occurred invoking the Analysis task} ::msgcat::mcset zh {An error has occurred while creating image.} ::msgcat::mcset zh {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.} ::msgcat::mcset zh {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.} ::msgcat::mcset zh {An error has occurred while printing} ::msgcat::mcset zh {An error has occurred while reading image.} ::msgcat::mcset zh {An error has occurred while saving} ::msgcat::mcset zh {An error has occurred while updating VO server list} ::msgcat::mcset zh {An error has occurred while writing image.} ::msgcat::mcset zh {An internal error has been detected} ::msgcat::mcset zh {Analysis Command Log} ::msgcat::mcset zh {Analysis Commands} ::msgcat::mcset zh {Analysis File} ::msgcat::mcset zh {Analysis Log} ::msgcat::mcset zh {Analysis} [encoding convertfrom big5 "\xA4\xC0 \xAA\x52"] ::msgcat::mcset zh {Angle Complement} ::msgcat::mcset zh {Angles} ::msgcat::mcset zh {Angle} ::msgcat::mcset zh {Annuli} ::msgcat::mcset zh {Annulus} [encoding convertfrom big5 "\xB6\xEA \xB0\xE9"] ::msgcat::mcset zh {Apply} ::msgcat::mcset zh {ArcMin} ::msgcat::mcset zh {ArcSec} ::msgcat::mcset zh {Architecture} ::msgcat::mcset zh {Archives} [encoding convertfrom big5 "\xBD\x75 \xA4\x57 \xB8\xEA \xAE\xC6"] ::msgcat::mcset zh {Array} ::msgcat::mcset zh {Arrow} ::msgcat::mcset zh {Astronomy} ::msgcat::mcset zh {At Startup} ::msgcat::mcset zh {At least 2 different catalogs are required} ::msgcat::mcset zh {Auto Centroid} ::msgcat::mcset zh {Auto Plot 2D} ::msgcat::mcset zh {Auto Plot 3D} ::msgcat::mcset zh {Auto Plot Statistics} ::msgcat::mcset zh {Auto Plot} ::msgcat::mcset zh {Autoload FITS Regions} ::msgcat::mcset zh {Autoload} ::msgcat::mcset zh {Automatic} ::msgcat::mcset zh {Average} ::msgcat::mcset zh {Axes Number} ::msgcat::mcset zh {Axes Order} ::msgcat::mcset zh {Axes Title} ::msgcat::mcset zh {Axes} ::msgcat::mcset zh {Axis Length} ::msgcat::mcset zh {Axis Numbers} ::msgcat::mcset zh {Axis Title} ::msgcat::mcset zh {Axis} ::msgcat::mcset zh {Azimuth} ::msgcat::mcset zh {Background Color} ::msgcat::mcset zh {Background} ::msgcat::mcset zh {Backup} ::msgcat::mcset zh {Back} ::msgcat::mcset zh {Bar Plot Tool} ::msgcat::mcset zh {Bias} ::msgcat::mcset zh {Bin 3rd Column} ::msgcat::mcset zh {Bin Center} ::msgcat::mcset zh {Bin Columns} ::msgcat::mcset zh {Bin Filter} ::msgcat::mcset zh {Bin Fit} ::msgcat::mcset zh {Bin In} ::msgcat::mcset zh {Bin Out} ::msgcat::mcset zh {Binning Parameters} ::msgcat::mcset zh {Bin} ::msgcat::mcset zh {Black} [encoding convertfrom big5 "\xB6\xC2 \xA6\xE2"] ::msgcat::mcset zh {Blank/Inf/NaN Color} ::msgcat::mcset zh {Blink Frames} ::msgcat::mcset zh {Blink Interval} ::msgcat::mcset zh {Blink} ::msgcat::mcset zh {Block Fit} ::msgcat::mcset zh {Block In} ::msgcat::mcset zh {Block Out} ::msgcat::mcset zh {Block Parameters} ::msgcat::mcset zh {Block} ::msgcat::mcset zh {Blue} ::msgcat::mcset zh {Bold} ::msgcat::mcset zh {Border} ::msgcat::mcset zh {Bottom} ::msgcat::mcset zh {Box Annulus} [encoding convertfrom big5 "\xA4\xE8 \xA7\xCE \xB0\xE9"] ::msgcat::mcset zh {Box Panda} ::msgcat::mcset zh {BoxCircle} ::msgcat::mcset zh {Boxcar} ::msgcat::mcset zh {Box} [encoding convertfrom big5 "\xA4\xE8 \xA7\xCE"] ::msgcat::mcset zh {Broadcast} ::msgcat::mcset zh {Browser} ::msgcat::mcset zh {Browse} ::msgcat::mcset zh {Buffer} ::msgcat::mcset zh {Buttonbar} ::msgcat::mcset zh {Buttons} [encoding convertfrom big5 "\xAB\xF6 \xB6\x73 \xA6\x43"] ::msgcat::mcset zh {Bytes} ::msgcat::mcset zh {CMYK} ::msgcat::mcset zh {Can Delete} [encoding convertfrom big5 "\xA5\x69 \xA5\x48 \xA7\x52 \xB0\xA3"] ::msgcat::mcset zh {Can Edit} [encoding convertfrom big5 "\xA5\x69 \xA5\x48 \xBD\x73 \xBF\xE8"] ::msgcat::mcset zh {Can Move} [encoding convertfrom big5 "\xA5\x69 \xA5\x48 \xB2\xBE \xB0\xCA"] ::msgcat::mcset zh {Can Rotate} [encoding convertfrom big5 "\xA5\x69 \xA5\x48 \xB1\xDB \xC2\xE0"] ::msgcat::mcset zh {Cancel} ::msgcat::mcset zh {Cap} ::msgcat::mcset zh {Catalog Server} ::msgcat::mcset zh {Catalog Tool} ::msgcat::mcset zh {Catalogs} [encoding convertfrom big5 "\xB8\xEA \xAE\xC6 \xAA\xED"] ::msgcat::mcset zh {Catalog} ::msgcat::mcset zh {Catrom} ::msgcat::mcset zh {Cat} ::msgcat::mcset zh {Center Image} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xB8\x6D \xA4\xA4"] ::msgcat::mcset zh {Center Non-modal Dialogs} ::msgcat::mcset zh {Center} ::msgcat::mcset zh {Centroid Parameters} [encoding convertfrom big5 "\xA4\xA4 \xA4\xDF \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Centroid} ::msgcat::mcset zh {Circle} [encoding convertfrom big5 "\xB6\xEA \xA7\xCE"] ::msgcat::mcset zh {Clear All} ::msgcat::mcset zh {Clear Analysis Commands} ::msgcat::mcset zh {Clear Cache} ::msgcat::mcset zh {Clear Data} ::msgcat::mcset zh {Clear External Analysis Commands?} ::msgcat::mcset zh {Clear Filter} ::msgcat::mcset zh {Clear Frame} [encoding convertfrom big5 "\xB2\x4D \xB0\xA3 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Clear Preferences?} ::msgcat::mcset zh {Clear Preferences} ::msgcat::mcset zh {Clear} [encoding convertfrom big5 "\xB2\x4D \xB0\xA3"] ::msgcat::mcset zh {Click to Center} ::msgcat::mcset zh {Close} ::msgcat::mcset zh {Colorbar Size} ::msgcat::mcset zh {Colorbar} [encoding convertfrom big5 "\xA6\xE2 \xB6\xA5 \xB9\xCF \xA8\xD2"] ::msgcat::mcset zh {Colormap Parameters} [encoding convertfrom big5 "\xC3\x43 \xA6\xE2 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Colormap} ::msgcat::mcset zh {Color} [encoding convertfrom big5 "\xC3\x43 \xA6\xE2"] ::msgcat::mcset zh {Columns} [encoding convertfrom big5 "\xA4\xE8 \xA6\xEC"] ::msgcat::mcset zh {Column} ::msgcat::mcset zh {Command} ::msgcat::mcset zh {Compass} ::msgcat::mcset zh {Composite Region} [encoding convertfrom big5 "\xB2\x56 \xA6\x58 \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Composite} ::msgcat::mcset zh {Compression} ::msgcat::mcset zh {Configure} ::msgcat::mcset zh {Connect Directly} ::msgcat::mcset zh {Connect SAMP} ::msgcat::mcset zh {Connect Using Web Proxy} ::msgcat::mcset zh {Connect} ::msgcat::mcset zh {Console} ::msgcat::mcset zh {Contour Parameters} [encoding convertfrom big5 "\xB5\xA5 \xAD\xC8 \xBD\x75 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Contours} [encoding convertfrom big5 "\xB5\xA5 \xAD\xC8 \xBD\x75"] ::msgcat::mcset zh {Contour} ::msgcat::mcset zh {Contrast} ::msgcat::mcset zh {Convert to Polygons} ::msgcat::mcset zh {Coordinate Grid Parameters} [encoding convertfrom big5 "\xAE\x79 \xBC\xD0 \xAE\xE6 \xBD\x75 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Coordinate Grid} [encoding convertfrom big5 "\xAE\x79 \xBC\xD0 \xAE\xE6 \xBD\x75"] ::msgcat::mcset zh {Coordinate System} ::msgcat::mcset zh {Coordinates} ::msgcat::mcset zh {Coordinate} ::msgcat::mcset zh {Copy Contours} ::msgcat::mcset zh {Copy to Regions} ::msgcat::mcset zh {Copy} ::msgcat::mcset zh {Create Movie} ::msgcat::mcset zh {Create New Frame on Download} ::msgcat::mcset zh {Create} [encoding convertfrom big5 "\xBB\x73 \xB3\x79"] ::msgcat::mcset zh {Crop Parameters} ::msgcat::mcset zh {Crop} ::msgcat::mcset zh {Crosshair Parameters} ::msgcat::mcset zh {Crosshair To} ::msgcat::mcset zh {Crosshair} ::msgcat::mcset zh {Cross} ::msgcat::mcset zh {Cubehelix} ::msgcat::mcset zh {Cube} ::msgcat::mcset zh {Cubic} ::msgcat::mcset zh {Current Frame} ::msgcat::mcset zh {Current Range} ::msgcat::mcset zh {Current} ::msgcat::mcset zh {Cursor} ::msgcat::mcset zh {Cut} ::msgcat::mcset zh {Cyan} [encoding convertfrom big5 "\xAB\x43 \xA6\xE2"] ::msgcat::mcset zh {DPI} ::msgcat::mcset zh {DS9 has detected a newer version of a backup file and therefore will not process this file.} ::msgcat::mcset zh {DS9 has detected a newer version of a preferences file.} ::msgcat::mcset zh {DS9 has detected an older backup file, do you wish to continue?} ::msgcat::mcset zh {DS9 has detected an older preferences file, do you wish to update?} ::msgcat::mcset zh {DS9 will complete the initialization process} ::msgcat::mcset zh {Dash} [encoding convertfrom big5 "\xB5\xEA \xBD\x75"] ::msgcat::mcset zh {Data Format} ::msgcat::mcset zh {Dataset Name} ::msgcat::mcset zh {Dataset} ::msgcat::mcset zh {Data} ::msgcat::mcset zh {Decrease} ::msgcat::mcset zh {Default All Files} ::msgcat::mcset zh {Default Format} ::msgcat::mcset zh {Default Length} ::msgcat::mcset zh {Default} ::msgcat::mcset zh {Degrees} ::msgcat::mcset zh {Delete All Frames?} ::msgcat::mcset zh {Delete All Frames} [encoding convertfrom big5 "\xA7\x52 \xB0\xA3 \xA9\xD2 \xA6\xB3 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Delete All Groups?} ::msgcat::mcset zh {Delete All Groups} ::msgcat::mcset zh {Delete All Regions?} ::msgcat::mcset zh {Delete All Regions} [encoding convertfrom big5 "\xA7\x52 \xB0\xA3 \xA5\xEF \xB3\xA1 \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Delete All} ::msgcat::mcset zh {Delete Color Tags} ::msgcat::mcset zh {Delete Frame} [encoding convertfrom big5 "\xA7\x52 \xB0\xA3 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Delete Group} ::msgcat::mcset zh {Delete Selected Regions} [encoding convertfrom big5 "\xA7\x52 \xB0\xA3 \xBF\xEF \xA8\xFA \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Delete} [encoding convertfrom big5 "\xA7\x52 \xB0\xA3"] ::msgcat::mcset zh {Depth} ::msgcat::mcset zh {Detector} ::msgcat::mcset zh {Dialog Box} ::msgcat::mcset zh {Diamond} ::msgcat::mcset zh {Dimension} ::msgcat::mcset zh {Direction} ::msgcat::mcset zh {Disconnect} ::msgcat::mcset zh {Display Header} ::msgcat::mcset zh {Display Size} ::msgcat::mcset zh {Dissolve} [encoding convertfrom big5 "\xB8\xD1 \xB4\xB2"] ::msgcat::mcset zh {Distance} ::msgcat::mcset zh {Download Colormap} ::msgcat::mcset zh {Download VOTABLE format if available} ::msgcat::mcset zh {Drag to Center} ::msgcat::mcset zh {Duplicate Data} ::msgcat::mcset zh {East} ::msgcat::mcset zh {Ecliptic} ::msgcat::mcset zh {Edit Group Name} ::msgcat::mcset zh {Edit} [encoding convertfrom big5 "\xBD\x73 \xBF\xE8"] ::msgcat::mcset zh {Elevation} ::msgcat::mcset zh {Ellipse Annulus} ::msgcat::mcset zh {Ellipse Panda} ::msgcat::mcset zh {Ellipse} [encoding convertfrom big5 "\xBE\xF2 \xB6\xEA \xA7\xCE"] ::msgcat::mcset zh {Elliptical Annulus} [encoding convertfrom big5 "\xBE\xF2 \xB6\xEA \xB0\xE9"] ::msgcat::mcset zh {Elliptical Panda} ::msgcat::mcset zh {Enable Confirmation Dialogs} ::msgcat::mcset zh {Enable} ::msgcat::mcset zh {End} ::msgcat::mcset zh {Enter Color} ::msgcat::mcset zh {Enter Font Size} ::msgcat::mcset zh {Enter Group Name} ::msgcat::mcset zh {Enter Search Expression} ::msgcat::mcset zh {Enter URL} ::msgcat::mcset zh {Entry} ::msgcat::mcset zh {Equal Area} ::msgcat::mcset zh {Equal Distance} ::msgcat::mcset zh {Equal Spacing} ::msgcat::mcset zh {Equal Value} ::msgcat::mcset zh {Error code was returned} ::msgcat::mcset zh {Error} ::msgcat::mcset zh {Examine Frame} ::msgcat::mcset zh {Examine} [encoding convertfrom big5 "\xA9\xF1 \xA4\x6A \xC0\xCB \xB5\xF8"] ::msgcat::mcset zh {Exam} ::msgcat::mcset zh {Exclude} ::msgcat::mcset zh {Executing TCL code is not enabled} ::msgcat::mcset zh {Exit} [encoding convertfrom big5 "\xC2\xF7 \xB6\x7D"] ::msgcat::mcset zh {Export Array} ::msgcat::mcset zh {Export} ::msgcat::mcset zh {Extention} ::msgcat::mcset zh {Exterior Axes} ::msgcat::mcset zh {Exterior Numerics} ::msgcat::mcset zh {FAQ} ::msgcat::mcset zh {FK4} ::msgcat::mcset zh {FK5} ::msgcat::mcset zh {Factor} ::msgcat::mcset zh {File not Found or Unable to load FITS data MIME type} ::msgcat::mcset zh {Filename} [encoding convertfrom big5 "\xC0\xC9 \xAE\xD7 \xA6\x57 \xBA\xD9"] ::msgcat::mcset zh {File} [encoding convertfrom big5 "\xC0\xC9 \xAE\xD7"] ::msgcat::mcset zh {Fill} ::msgcat::mcset zh {Filter} ::msgcat::mcset zh {Find Next} ::msgcat::mcset zh {Find} ::msgcat::mcset zh {First Frame} [encoding convertfrom big5 "\xB3\xCC \xA4\x57 \xBC\x68 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {First} ::msgcat::mcset zh {Fits} ::msgcat::mcset zh {Fixed in Size} [encoding convertfrom big5 "\xA9\x54 \xA9\x77 \xA4\x6A \xA4\x70"] ::msgcat::mcset zh {Flat} ::msgcat::mcset zh {Flip} ::msgcat::mcset zh {Font} ::msgcat::mcset zh {For more information, use --help} ::msgcat::mcset zh {Format} ::msgcat::mcset zh {Forward} ::msgcat::mcset zh {Found} ::msgcat::mcset zh {Frame Information} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1 \xB8\xEA \xB0\x54"] ::msgcat::mcset zh {Frame Parameters} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Frames} ::msgcat::mcset zh {Frame} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {From} ::msgcat::mcset zh {Front} ::msgcat::mcset zh {Full Range} ::msgcat::mcset zh {Function} ::msgcat::mcset zh {GUI Font} ::msgcat::mcset zh {Galactic} ::msgcat::mcset zh {Gap} ::msgcat::mcset zh {Gaussian} ::msgcat::mcset zh {General} ::msgcat::mcset zh {Generate} ::msgcat::mcset zh {Generating Regions} ::msgcat::mcset zh {Get Information} [encoding convertfrom big5 "\xB8\xFC \xA4\x4A \xB0\x54 \xAE\xA7"] ::msgcat::mcset zh {Gist} ::msgcat::mcset zh {Global Properties} ::msgcat::mcset zh {Global} ::msgcat::mcset zh {Goto Frame} [encoding convertfrom big5 "\xA8\xEC \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Graph Horz} ::msgcat::mcset zh {Graph Vert} ::msgcat::mcset zh {Graphics} ::msgcat::mcset zh {Graphs} ::msgcat::mcset zh {Graph} ::msgcat::mcset zh {Grayscale} ::msgcat::mcset zh {Green} ::msgcat::mcset zh {Grid Gap} ::msgcat::mcset zh {Grid} ::msgcat::mcset zh {Groove} ::msgcat::mcset zh {Groups} ::msgcat::mcset zh {HTTP} ::msgcat::mcset zh {Header} ::msgcat::mcset zh {Height} ::msgcat::mcset zh {Help Desk} ::msgcat::mcset zh {Help Me Choose} ::msgcat::mcset zh {Help} [encoding convertfrom big5 "\xBB\xA1 \xA9\xFA"] ::msgcat::mcset zh {Hide All} [encoding convertfrom big5 "\xC1\xF4 \xC2\xC3 \xA5\xFE \xB3\xA1"] ::msgcat::mcset zh {Highlite} ::msgcat::mcset zh {High} ::msgcat::mcset zh {Histogram Equalization} ::msgcat::mcset zh {Histogram} ::msgcat::mcset zh {Horizontal Graph} ::msgcat::mcset zh {Horizontal Layout} ::msgcat::mcset zh {Horizontal} [encoding convertfrom big5 "\xA4\xF4 \xA5\xAD"] ::msgcat::mcset zh {IAU Location Code} ::msgcat::mcset zh {ICRS} ::msgcat::mcset zh {Identification} ::msgcat::mcset zh {If} ::msgcat::mcset zh {Image Servers} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xA4\x55 \xB8\xFC"] ::msgcat::mcset zh {Image} ::msgcat::mcset zh {Import Array} ::msgcat::mcset zh {Import} ::msgcat::mcset zh {Include} ::msgcat::mcset zh {Increase} ::msgcat::mcset zh {Information Panel} [encoding convertfrom big5 "\xB8\xEA \xB0\x54 \xA6\x43"] ::msgcat::mcset zh {Information} [encoding convertfrom big5 "\xB8\xEA \xB0\x54"] ::msgcat::mcset zh {Initialize XPA} ::msgcat::mcset zh {Inner} ::msgcat::mcset zh {Instrument FOV} ::msgcat::mcset zh {Interior Axes} ::msgcat::mcset zh {Interior Numerics} ::msgcat::mcset zh {Internal Parse Error} ::msgcat::mcset zh {Interval} ::msgcat::mcset zh {Invalid Column Name} ::msgcat::mcset zh {Invalid formated multipart/mixed mime type message} ::msgcat::mcset zh {Invert Colormap} [encoding convertfrom big5 "\xA6\xE2 \xB1\x6D \xA4\xCF \xA6\x56"] ::msgcat::mcset zh {Invert Selection} [encoding convertfrom big5 "\xA4\xCF \xA6\x56 \xBF\xEF \xA8\xFA"] ::msgcat::mcset zh {Invert} ::msgcat::mcset zh {Italic} ::msgcat::mcset zh {Items Found} ::msgcat::mcset zh {Iteration} ::msgcat::mcset zh {JPEG Quality Factor} ::msgcat::mcset zh {Keep-Alive} ::msgcat::mcset zh {Kernel} ::msgcat::mcset zh {Keyboard Shortcuts} ::msgcat::mcset zh {Keyboard} ::msgcat::mcset zh {Keyword} ::msgcat::mcset zh {Labels} ::msgcat::mcset zh {Label} ::msgcat::mcset zh {Landscape} ::msgcat::mcset zh {Language} ::msgcat::mcset zh {Last Frame} [encoding convertfrom big5 "\xB3\xCC \xA9\xB3 \xBC\x68 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Last} ::msgcat::mcset zh {Layout Horz} ::msgcat::mcset zh {Layout Vert} ::msgcat::mcset zh {Layout} ::msgcat::mcset zh {Left} ::msgcat::mcset zh {Legal} ::msgcat::mcset zh {Legend Title} ::msgcat::mcset zh {Legend} ::msgcat::mcset zh {Length} ::msgcat::mcset zh {Letter} ::msgcat::mcset zh {Levels} ::msgcat::mcset zh {Level} ::msgcat::mcset zh {Limits} ::msgcat::mcset zh {Line Plot Tool} ::msgcat::mcset zh {Linear} [encoding convertfrom big5 "\xBD\x75 \xA9\xCA"] ::msgcat::mcset zh {Line} [encoding convertfrom big5 "\xAA\xBD \xBD\x75"] ::msgcat::mcset zh {List Data} ::msgcat::mcset zh {List Regions} [encoding convertfrom big5 "\xA6\x43 \xA5\x58 \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {List} ::msgcat::mcset zh {Load Analysis Commands} ::msgcat::mcset zh {Load Color Tags} ::msgcat::mcset zh {Load Colormap} ::msgcat::mcset zh {Load Configuration} ::msgcat::mcset zh {Load Contour Levels} ::msgcat::mcset zh {Load Contours} ::msgcat::mcset zh {Load Contrast/Bias} ::msgcat::mcset zh {Load Data} ::msgcat::mcset zh {Load Mosaic} ::msgcat::mcset zh {Load Regions} [encoding convertfrom big5 "\xB8\xFC \xA4\x4A \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Load Template} ::msgcat::mcset zh {Load into All Frames} ::msgcat::mcset zh {Load into Current Frame} ::msgcat::mcset zh {Loading Catalog} ::msgcat::mcset zh {Loading} ::msgcat::mcset zh {Load} [encoding convertfrom big5 "\xB8\xFC \xA4\x4A"] ::msgcat::mcset zh {Local} ::msgcat::mcset zh {Lock Axes} ::msgcat::mcset zh {Lock Bin} ::msgcat::mcset zh {Lock Color} ::msgcat::mcset zh {Lock Crop Amplifier} ::msgcat::mcset zh {Lock Crop Detector} ::msgcat::mcset zh {Lock Crop Image} ::msgcat::mcset zh {Lock Crop None} ::msgcat::mcset zh {Lock Crop Physical} ::msgcat::mcset zh {Lock Crop WCS} ::msgcat::mcset zh {Lock Crosshair Amplifier} ::msgcat::mcset zh {Lock Crosshair Detector} ::msgcat::mcset zh {Lock Crosshair Image} ::msgcat::mcset zh {Lock Crosshair None} ::msgcat::mcset zh {Lock Crosshair Physical} ::msgcat::mcset zh {Lock Crosshair WCS} ::msgcat::mcset zh {Lock Frame Amplifier} ::msgcat::mcset zh {Lock Frame Detector} ::msgcat::mcset zh {Lock Frame Image} ::msgcat::mcset zh {Lock Frame None} ::msgcat::mcset zh {Lock Frame Physical} ::msgcat::mcset zh {Lock Frame WCS} ::msgcat::mcset zh {Lock Limits} ::msgcat::mcset zh {Lock Scale} ::msgcat::mcset zh {Lock Slice Image} ::msgcat::mcset zh {Lock Slice None} ::msgcat::mcset zh {Lock Slice WCS} ::msgcat::mcset zh {Lock Smooth} ::msgcat::mcset zh {Lock} ::msgcat::mcset zh {Log Exponent} ::msgcat::mcset zh {Log} [encoding convertfrom big5 "\xB9\xEF \xBC\xC6"] ::msgcat::mcset zh {Low High} ::msgcat::mcset zh {Lower Left Back} ::msgcat::mcset zh {Lower Left Front} ::msgcat::mcset zh {Lower Right Back} ::msgcat::mcset zh {Lower Right Front} ::msgcat::mcset zh {Low} ::msgcat::mcset zh {MIP} ::msgcat::mcset zh {Magenta} [encoding convertfrom big5 "\xAC\xF5 \xB5\xB5 \xA6\xE2"] ::msgcat::mcset zh {Magnification} ::msgcat::mcset zh {Magnifier} [encoding convertfrom big5 "\xA9\xF1 \xA4\x6A \xC3\xE8 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Major} ::msgcat::mcset zh {Manual} ::msgcat::mcset zh {Mask Parameters} ::msgcat::mcset zh {Match Axes} ::msgcat::mcset zh {Match Bin} ::msgcat::mcset zh {Match Catalog requires at least 1 row per catalog} ::msgcat::mcset zh {Match Color} ::msgcat::mcset zh {Match Crop Amplifier} ::msgcat::mcset zh {Match Crop Detector} ::msgcat::mcset zh {Match Crop Image} ::msgcat::mcset zh {Match Crop Physical} ::msgcat::mcset zh {Match Crop WCS} ::msgcat::mcset zh {Match Crosshair Amplifier} ::msgcat::mcset zh {Match Crosshair Detector} ::msgcat::mcset zh {Match Crosshair Image} ::msgcat::mcset zh {Match Crosshair Physical} ::msgcat::mcset zh {Match Crosshair WCS} ::msgcat::mcset zh {Match Frame Amplifier} ::msgcat::mcset zh {Match Frame Detector} ::msgcat::mcset zh {Match Frame Image} ::msgcat::mcset zh {Match Frame Physical} ::msgcat::mcset zh {Match Frame WCS} ::msgcat::mcset zh {Match Limits} ::msgcat::mcset zh {Match Scale} ::msgcat::mcset zh {Match Slice Image} ::msgcat::mcset zh {Match Slice WCS} ::msgcat::mcset zh {Match Smooth} ::msgcat::mcset zh {Match} ::msgcat::mcset zh {Math Function} ::msgcat::mcset zh {Matplotlib} ::msgcat::mcset zh {Max Rows} ::msgcat::mcset zh {Max} ::msgcat::mcset zh {Menus and Buttons} ::msgcat::mcset zh {Menu} ::msgcat::mcset zh {Message Log} ::msgcat::mcset zh {Method} ::msgcat::mcset zh {Min Max Parameters} ::msgcat::mcset zh {Min Max} ::msgcat::mcset zh {Minor} ::msgcat::mcset zh {Minutes} ::msgcat::mcset zh {Min} ::msgcat::mcset zh {Mission} ::msgcat::mcset zh {Mode} ::msgcat::mcset zh {Mosaic IRAF Segment} ::msgcat::mcset zh {Mosaic IRAF} ::msgcat::mcset zh {Mosaic WCS Segment} ::msgcat::mcset zh {Mosaic WCS} ::msgcat::mcset zh {Mosaic WFPC2} ::msgcat::mcset zh {Mosaic} ::msgcat::mcset zh {Mouse Click Epsilon} ::msgcat::mcset zh {Mouse Wheel Bin} ::msgcat::mcset zh {Mouse Wheel Zoom} ::msgcat::mcset zh {Mouse and Keyboard} ::msgcat::mcset zh {Move Back} ::msgcat::mcset zh {Move First} ::msgcat::mcset zh {Move Forward} ::msgcat::mcset zh {Move Frame} [encoding convertfrom big5 "\xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1 \xB6\xB6 \xA7\xC7"] ::msgcat::mcset zh {Move Last} ::msgcat::mcset zh {Move to Back} ::msgcat::mcset zh {Move to Front} ::msgcat::mcset zh {Movie} ::msgcat::mcset zh {Multiple Extension Cube} ::msgcat::mcset zh {Multiple Extension Frames} ::msgcat::mcset zh {Multiple WCS} ::msgcat::mcset zh {NRRD} ::msgcat::mcset zh {Name Resolution} ::msgcat::mcset zh {Name Server} ::msgcat::mcset zh {Name or Designation} ::msgcat::mcset zh {Name} ::msgcat::mcset zh {Native Dialog} ::msgcat::mcset zh {New Features} ::msgcat::mcset zh {New Frame 3D} ::msgcat::mcset zh {New Frame RGB} ::msgcat::mcset zh {New Frame each Time} ::msgcat::mcset zh {New Frame} [encoding convertfrom big5 "\xB7\x73 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {New Group} ::msgcat::mcset zh {New} ::msgcat::mcset zh {Next Frame} [encoding convertfrom big5 "\xAB\xE1 \xA4\x40 \xBC\x68 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Next} ::msgcat::mcset zh {No Catalog specified} ::msgcat::mcset zh {No Items Found} ::msgcat::mcset zh {No current frame} ::msgcat::mcset zh {No data available at } ::msgcat::mcset zh {Non-zero} ::msgcat::mcset zh {None} ::msgcat::mcset zh {Normal} ::msgcat::mcset zh {North} ::msgcat::mcset zh {Not Found} ::msgcat::mcset zh {Number of Samples} ::msgcat::mcset zh {Number of Threads} ::msgcat::mcset zh {Number of Ticks} ::msgcat::mcset zh {Number} ::msgcat::mcset zh {Numerics} [encoding convertfrom big5 "\xBC\xC6 \xAD\xC8"] ::msgcat::mcset zh {OK} ::msgcat::mcset zh {Object} [encoding convertfrom big5 "\xA4\xD1 \xC5\xE9 \xA6\x57 \xBA\xD9"] ::msgcat::mcset zh {Open File} ::msgcat::mcset zh {Open TCL Console} ::msgcat::mcset zh {Open URL} ::msgcat::mcset zh {Open as} ::msgcat::mcset zh {Open} [encoding convertfrom big5 "\xB6\x7D \xB1\xD2"] ::msgcat::mcset zh {Operator} ::msgcat::mcset zh {Orientation} [encoding convertfrom big5 "\xA4\xE8 \xA6\x56"] ::msgcat::mcset zh {Origin} ::msgcat::mcset zh {Oscillate} ::msgcat::mcset zh {Other Color} ::msgcat::mcset zh {Other Font Size} ::msgcat::mcset zh {Other} [encoding convertfrom big5 "\xA8\xE4 \xA5\xA6"] ::msgcat::mcset zh {Outer} ::msgcat::mcset zh {Overlap} ::msgcat::mcset zh {PS Page Setup} ::msgcat::mcset zh {PS Print} ::msgcat::mcset zh {Page Setup} ::msgcat::mcset zh {Page Source} ::msgcat::mcset zh {Pan To} ::msgcat::mcset zh {Pan Zoom Rotate Parameters} [encoding convertfrom big5 "\xC1\x59 \xA9\xF1 \xB1\xDB \xC2\xE0 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Pan Zoom} ::msgcat::mcset zh {Pan then Zoom} ::msgcat::mcset zh {Panda} ::msgcat::mcset zh {Panner} [encoding convertfrom big5 "\xC1\x59 \xB9\xCF"] ::msgcat::mcset zh {Pan} ::msgcat::mcset zh {Parameters} ::msgcat::mcset zh {Password} ::msgcat::mcset zh {Paste Contours} ::msgcat::mcset zh {Paste} ::msgcat::mcset zh {Physical} ::msgcat::mcset zh {Pixel Distribution} ::msgcat::mcset zh {Pixel Size} ::msgcat::mcset zh {Pixel Table} ::msgcat::mcset zh {Pixels} ::msgcat::mcset zh {Play} ::msgcat::mcset zh {Please Select a Region} ::msgcat::mcset zh {Please specify width, height, and either name or (ra,dec)} ::msgcat::mcset zh {Plot 2D} ::msgcat::mcset zh {Plot 3D} ::msgcat::mcset zh {Plot Title} ::msgcat::mcset zh {Plotting Regions} ::msgcat::mcset zh {Plot} ::msgcat::mcset zh {Plus} ::msgcat::mcset zh {Pointer} ::msgcat::mcset zh {Points} ::msgcat::mcset zh {Point} ::msgcat::mcset zh {Polygon} [encoding convertfrom big5 "\xA6\x68 \xA8\xA4 \xA7\xCE"] ::msgcat::mcset zh {Portrait} ::msgcat::mcset zh {Poster} ::msgcat::mcset zh {Postscript Page Setup} ::msgcat::mcset zh {Postscript Print} ::msgcat::mcset zh {Postscript} ::msgcat::mcset zh {Power} [encoding convertfrom big5 "\xAB\xFC \xBC\xC6"] ::msgcat::mcset zh {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect} ::msgcat::mcset zh {Preferences} [encoding convertfrom big5 "\xB0\xBE \xA6\x6E \xB3\x5D \xA9\x77"] ::msgcat::mcset zh {Preserve During Load} ::msgcat::mcset zh {Previous Frame} [encoding convertfrom big5 "\xAB\x65 \xA4\x40 \xBC\x68 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Previous} ::msgcat::mcset zh {Prev} ::msgcat::mcset zh {Print Coordinates} ::msgcat::mcset zh {Print To} ::msgcat::mcset zh {Printer} ::msgcat::mcset zh {Print} [encoding convertfrom big5 "\xA6\x43 \xA6\x4C"] ::msgcat::mcset zh {Projection} ::msgcat::mcset zh {Properties} [encoding convertfrom big5 "\xA6\x43 \xA6\x4C"] ::msgcat::mcset zh {Property} ::msgcat::mcset zh {Proxy Host} ::msgcat::mcset zh {Proxy Port} ::msgcat::mcset zh {Publication} ::msgcat::mcset zh {Quadratic} ::msgcat::mcset zh {RGB Array} ::msgcat::mcset zh {RGB Cube} ::msgcat::mcset zh {RGB Image} ::msgcat::mcset zh {RGB} ::msgcat::mcset zh {Radial Profile} ::msgcat::mcset zh {Radial} ::msgcat::mcset zh {Radius} ::msgcat::mcset zh {Raised} ::msgcat::mcset zh {Range} ::msgcat::mcset zh {Redo} ::msgcat::mcset zh {Red} ::msgcat::mcset zh {Reference Manual} ::msgcat::mcset zh {Reference} ::msgcat::mcset zh {Refresh Frame} [encoding convertfrom big5 "\xAD\xAB \xB7\x73 \xBE\xE3 \xB2\x7A \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Refresh} ::msgcat::mcset zh {Region Parameters} [encoding convertfrom big5 "\xB0\xCF \xB0\xEC \xB0\xD1\xBC\xC6"] ::msgcat::mcset zh {Region} [encoding convertfrom big5 "\xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Release Notes} ::msgcat::mcset zh {Release} ::msgcat::mcset zh {Relief} ::msgcat::mcset zh {Reload} ::msgcat::mcset zh {Render} ::msgcat::mcset zh {Repeat} ::msgcat::mcset zh {Reset Colormap} [encoding convertfrom big5 "\xAD\xAB \xB3\x5D \xC3\x43 \xA6\xF2"] ::msgcat::mcset zh {Reset Frame} [encoding convertfrom big5 "\xAD\xAB \xB3\x5D \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Reset} ::msgcat::mcset zh {Restore} ::msgcat::mcset zh {Retrieve} ::msgcat::mcset zh {Return} ::msgcat::mcset zh {Right} ::msgcat::mcset zh {Roman} ::msgcat::mcset zh {Rotate} [encoding convertfrom big5 "\xB1\xDB \xC2\xE0"] ::msgcat::mcset zh {Rows} ::msgcat::mcset zh {Row} ::msgcat::mcset zh {Ruler} [encoding convertfrom big5 "\xA4\xD8 \xB3\x57"] ::msgcat::mcset zh {SAMP Image} ::msgcat::mcset zh {SAMP Table} ::msgcat::mcset zh {SAMP: already connected} ::msgcat::mcset zh {SAMP: internal error} ::msgcat::mcset zh {SAMP: not connected} ::msgcat::mcset zh {SAMP: unable to locate HUB} ::msgcat::mcset zh {SAMP} ::msgcat::mcset zh {Sample Increment} ::msgcat::mcset zh {Sample Parameters} ::msgcat::mcset zh {Samples per Line} ::msgcat::mcset zh {Sample} ::msgcat::mcset zh {Save 3D Movie} ::msgcat::mcset zh {Save Color Tags} ::msgcat::mcset zh {Save Colormap} ::msgcat::mcset zh {Save Configuration} ::msgcat::mcset zh {Save Contour Levels} ::msgcat::mcset zh {Save Contours} ::msgcat::mcset zh {Save Contrast/Bias} ::msgcat::mcset zh {Save Data} ::msgcat::mcset zh {Save Image on Download} ::msgcat::mcset zh {Save Image} [encoding convertfrom big5 "\xC0\x78 \xA6\x73 \xBC\x76 \xB9\xB3"] ::msgcat::mcset zh {Save Regions} [encoding convertfrom big5 "\xC0\x78 \xA6\x73 \xB0\xCF \xB0\xEC"] ::msgcat::mcset zh {Save Template} ::msgcat::mcset zh {Save as} ::msgcat::mcset zh {Save} [encoding convertfrom big5 "\xC0\x78 \xA6\x73"] ::msgcat::mcset zh {Scale Parameters} [encoding convertfrom big5 "\xA6\xE2 \xB6\xA5 \xB0\xD1 \xBC\xC6"] ::msgcat::mcset zh {Scale and Limits} ::msgcat::mcset zh {Scale} [encoding convertfrom big5 "\xA6\xE2 \xB6\xA5"] ::msgcat::mcset zh {Scan} ::msgcat::mcset zh {Scatter Plot Tool} ::msgcat::mcset zh {Scope} ::msgcat::mcset zh {Search for Catalogs} ::msgcat::mcset zh {Searching for catalogs} ::msgcat::mcset zh {Seconds} ::msgcat::mcset zh {Segment} ::msgcat::mcset zh {Select All} [encoding convertfrom big5 "\xBF\xEF \xA8\xFA \xA5\xFE \xB3\xA1"] ::msgcat::mcset zh {Select Coordinate System } ::msgcat::mcset zh {Select None} [encoding convertfrom big5 "\xA8\xFA \xAE\xF8 \xBF\xEF \xA8\xFA"] ::msgcat::mcset zh {Select} ::msgcat::mcset zh {Send} ::msgcat::mcset zh {Server} ::msgcat::mcset zh {Sexagesimal} ::msgcat::mcset zh {Shape} [encoding convertfrom big5 "\xA7\xCE \xAA\xAC"] ::msgcat::mcset zh {Show All} [encoding convertfrom big5 "\xC5\xE3 \xA5\xDC \xA5\xFE \xB3\xA1"] ::msgcat::mcset zh {Show Command} ::msgcat::mcset zh {Show Compass} ::msgcat::mcset zh {Show Text} ::msgcat::mcset zh {Show/Hide Frames} ::msgcat::mcset zh {Show} [encoding convertfrom big5 "\xC5\xE3 \xA5\xDC"] ::msgcat::mcset zh {Simple Cross} ::msgcat::mcset zh {Simple Plus} ::msgcat::mcset zh {Single Frame} [encoding convertfrom big5 "\xB3\xE6 \xA4\x40 \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Single} [encoding convertfrom big5 "\xB3\xE6 \xA4\x40"] ::msgcat::mcset zh {Sites} ::msgcat::mcset zh {Size/Radius} ::msgcat::mcset zh {Size} ::msgcat::mcset zh {Skip First} ::msgcat::mcset zh {Slice} ::msgcat::mcset zh {Smooth Parameters} ::msgcat::mcset zh {Smoothness} ::msgcat::mcset zh {Smooth} ::msgcat::mcset zh {Solid} ::msgcat::mcset zh {Sorry, DS9 does not support} ::msgcat::mcset zh {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available} ::msgcat::mcset zh {Sort} ::msgcat::mcset zh {Source TCL} ::msgcat::mcset zh {Source} ::msgcat::mcset zh {Space Equal Distance} ::msgcat::mcset zh {Space Equal Value} ::msgcat::mcset zh {Spacing} ::msgcat::mcset zh {Sqrt} ::msgcat::mcset zh {Square Root} ::msgcat::mcset zh {Squared} ::msgcat::mcset zh {Square} ::msgcat::mcset zh {Stacked} ::msgcat::mcset zh {Starbase} ::msgcat::mcset zh {Startup} ::msgcat::mcset zh {Start} ::msgcat::mcset zh {Statistics} ::msgcat::mcset zh {Stats} ::msgcat::mcset zh {Status} ::msgcat::mcset zh {Step} ::msgcat::mcset zh {Stop} ::msgcat::mcset zh {Story of SAOImage DS9} ::msgcat::mcset zh {Story} ::msgcat::mcset zh {Sum} ::msgcat::mcset zh {Sunken} ::msgcat::mcset zh {Symbol Editor} ::msgcat::mcset zh {Symbol} ::msgcat::mcset zh {Tab-Separated-Value} ::msgcat::mcset zh {Table} ::msgcat::mcset zh {Tabloid} ::msgcat::mcset zh {Task} ::msgcat::mcset zh {Template} [encoding convertfrom big5 "\xBC\xCB \xA5\xBB"] ::msgcat::mcset zh {Text Font} ::msgcat::mcset zh {Text} [encoding convertfrom big5 "\xA4\xE5 \xA6\x72"] ::msgcat::mcset zh {Then} ::msgcat::mcset zh {Thickness} ::msgcat::mcset zh {This analysis task is already running. Do you wish to kill it?} ::msgcat::mcset zh {This function is not currently supported for this port.} ::msgcat::mcset zh {Tickmarks} ::msgcat::mcset zh {Tile Frames} [encoding convertfrom big5 "\xA6\x58 \xAD\xAB \xBC\x76 \xB9\xB3 \xB5\xF8 \xB5\xA1"] ::msgcat::mcset zh {Tile Parameters} ::msgcat::mcset zh {Tile} [encoding convertfrom big5 "\xA6\x58 \xAD\xAB"] ::msgcat::mcset zh {Times} ::msgcat::mcset zh {Title} ::msgcat::mcset zh {Tophat} ::msgcat::mcset zh {Topographic} ::msgcat::mcset zh {Top} ::msgcat::mcset zh {To} ::msgcat::mcset zh {Transparency} ::msgcat::mcset zh {Triangle} ::msgcat::mcset zh {Type} ::msgcat::mcset zh {URL} ::msgcat::mcset zh {Unable to connect directly: using Web Proxy} ::msgcat::mcset zh {Unable to determine date of observation} ::msgcat::mcset zh {Unable to determine time of observation} ::msgcat::mcset zh {Unable to evaluate filter} ::msgcat::mcset zh {Unable to find catalog window} ::msgcat::mcset zh {Unable to find plot window} ::msgcat::mcset zh {Unable to load RGB image into a non-rgb frame} ::msgcat::mcset zh {Unable to load region file} ::msgcat::mcset zh {Unable to load} ::msgcat::mcset zh {Unable to locate URL} ::msgcat::mcset zh {Unable to match target with XPA Mime request} ::msgcat::mcset zh {Unable to open file} ::msgcat::mcset zh {Unable to process Analysis file} ::msgcat::mcset zh {Unable to save RGB image from a non-rgb frame} ::msgcat::mcset zh {Undo} ::msgcat::mcset zh {Unique} ::msgcat::mcset zh {Unists} ::msgcat::mcset zh {Units} ::msgcat::mcset zh {Unknown Colormap} ::msgcat::mcset zh {Unknown command} ::msgcat::mcset zh {Update Filter} ::msgcat::mcset zh {Update Group} ::msgcat::mcset zh {Update from Current Crosshair} ::msgcat::mcset zh {Update from Current Frame} ::msgcat::mcset zh {Update} ::msgcat::mcset zh {Upper Left Back} ::msgcat::mcset zh {Upper Left Front} ::msgcat::mcset zh {Upper Right Back} ::msgcat::mcset zh {Upper Right Front} ::msgcat::mcset zh {Use Authentication} ::msgcat::mcset zh {Use Current Frame on Download} ::msgcat::mcset zh {Use Internal Web Browser} ::msgcat::mcset zh {Use Proxy} ::msgcat::mcset zh {User Manual} ::msgcat::mcset zh {Username} ::msgcat::mcset zh {User} ::msgcat::mcset zh {Use} ::msgcat::mcset zh {VO Server} ::msgcat::mcset zh {VO} ::msgcat::mcset zh {Value} ::msgcat::mcset zh {Vector} [encoding convertfrom big5 "\xA6\x56 \xB6\x71"] ::msgcat::mcset zh {Vertical Graph} ::msgcat::mcset zh {Vertical Layout} ::msgcat::mcset zh {Vertical Text} ::msgcat::mcset zh {Vertical} [encoding convertfrom big5 "\xAB\xAB \xAA\xBD"] ::msgcat::mcset zh {View} [encoding convertfrom big5 "\xC0\xCB \xB5\xF8"] ::msgcat::mcset zh {Virtual Observatory} ::msgcat::mcset zh {WCS Parameters} ::msgcat::mcset zh {WCS} [encoding convertfrom big5 "\xA7\x79 \xBC\xD0"] ::msgcat::mcset zh {Wavelength} ::msgcat::mcset zh {Web Browser} ::msgcat::mcset zh {White} [encoding convertfrom big5 "\xA5\xD5 \xA6\xE2"] ::msgcat::mcset zh {Width} [encoding convertfrom big5 "\xBC\x65 \xAB\xD7"] ::msgcat::mcset zh {Window} ::msgcat::mcset zh {Words matching title, description} ::msgcat::mcset zh {Writing Catalog} ::msgcat::mcset zh {X Axis Title} ::msgcat::mcset zh {X Grid} ::msgcat::mcset zh {XPA Information} ::msgcat::mcset zh {XPA not initialized} ::msgcat::mcset zh {XPA unable to verify hostname, setting XPA_METHOD to LOCAL} ::msgcat::mcset zh {XPA} ::msgcat::mcset zh {X} ::msgcat::mcset zh {Y Axis Title} ::msgcat::mcset zh {Y Grid} ::msgcat::mcset zh {Yellow} [encoding convertfrom big5 "\xB6\xC0 \xA6\xE2"] ::msgcat::mcset zh {Y} ::msgcat::mcset zh {Z Axis Scale} ::msgcat::mcset zh {ZScale Parameters} ::msgcat::mcset zh {Zero} ::msgcat::mcset zh {Zoom Fit} ::msgcat::mcset zh {Zoom In} [encoding convertfrom big5 "\xA9\xF1 \xA4\x6A"] ::msgcat::mcset zh {Zoom Out} [encoding convertfrom big5 "\xC1\x59 \xA4\x70"] ::msgcat::mcset zh {Zoom} [encoding convertfrom big5 "\xC1\x59 \xA9\xF1"] ::msgcat::mcset zh {and} ::msgcat::mcset zh {blue} [encoding convertfrom big5 "\xC2\xC5"] ::msgcat::mcset zh {b} ::msgcat::mcset zh {color} ::msgcat::mcset zh {cool} ::msgcat::mcset zh {green} [encoding convertfrom big5 "\xBA\xF1"] ::msgcat::mcset zh {grey} [encoding convertfrom big5 "\xA6\xC7"] ::msgcat::mcset zh {g} ::msgcat::mcset zh {h5utils} ::msgcat::mcset zh {heat} ::msgcat::mcset zh {not} ::msgcat::mcset zh {only} ::msgcat::mcset zh {or center of data} ::msgcat::mcset zh {rainbow} ::msgcat::mcset zh {red} [encoding convertfrom big5 "\xAC\xF5"] ::msgcat::mcset zh {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed} ::msgcat::mcset zh {r} ::msgcat::mcset zh {staircase} ::msgcat::mcset zh {standard} ::msgcat::mcset zh {x} ::msgcat::mcset zh {} ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/aclocal.m4������������������������������������������������������������������������000755 �000765 �000000 �00000000223 12557751640 016231� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Include the TEA standard macro set # builtin(include,tclconfig/tcl.m4) # # Add here whatever m4 macros you want to define for your package # �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/configure�������������������������������������������������������������������������000755 �000765 �000000 �00001107006 12602575413 016276� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for ds9 7.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 </dev/null exec 6>&1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ds9' PACKAGE_TARNAME='ds9' PACKAGE_VERSION='7.4' PACKAGE_STRING='ds9 7.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include <stdio.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h> #endif #ifdef STDC_HEADERS # include <stdlib.h> # include <stddef.h> #else # ifdef HAVE_STDLIB_H # include <stdlib.h> # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include <memory.h> # endif # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_INTTYPES_H # include <inttypes.h> #endif #ifdef HAVE_STDINT_H # include <stdint.h> #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif" ac_subst_vars='LTLIBOBJS LIBOBJS VC_MANIFEST_EMBED_EXE VC_MANIFEST_EMBED_DLL RANLIB_STUB MAKE_STUB_LIB MAKE_STATIC_LIB MAKE_SHARED_LIB MAKE_LIB TCL_DBGX LDFLAGS_DEFAULT CFLAGS_DEFAULT LD_LIBRARY_PATH_VAR SHLIB_CFLAGS SHLIB_LD_LIBS SHLIB_LD STLIB_LD CFLAGS_WARNING CFLAGS_OPTIMIZE CFLAGS_DEBUG RC CELIB_DIR AR TCL_THREADS XMKMF TK_INCLUDES TCL_INCLUDES MATH_LIBS EGREP GREP RANLIB SET_MAKE INSTALL CPP ac_ct_CXX CXXFLAGS CXX TK_XINCLUDES TK_LIBS TK_STUB_LIB_SPEC TK_STUB_LIB_FLAG TK_STUB_LIB_FILE TK_LIB_SPEC TK_LIB_FLAG TK_LIB_FILE TK_SRC_DIR TK_BIN_DIR TK_VERSION TCL_SHLIB_LD_LIBS TCL_LD_FLAGS TCL_EXTRA_CFLAGS TCL_DEFS TCL_LIBS CLEANFILES OBJEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TCL_STUB_LIB_SPEC TCL_STUB_LIB_FLAG TCL_STUB_LIB_FILE TCL_LIB_SPEC TCL_LIB_FLAG TCL_LIB_FILE TCL_SRC_DIR TCL_BIN_DIR TCL_PATCH_LEVEL TCL_VERSION PKG_CFLAGS PKG_LIBS PKG_INCLUDES PKG_HEADERS PKG_TCL_SOURCES PKG_STUB_OBJECTS PKG_STUB_SOURCES PKG_STUB_LIB_FILE PKG_LIB_FILE EXEEXT CYGPATH target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_tcl with_tk with_tclinclude with_tkinclude with_x enable_threads enable_64bit enable_64bit_vis enable_rpath enable_wince with_celib enable_symbols ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures ds9 7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ds9] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ds9 7.4:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-threads build with threads --enable-64bit enable 64bit support (default: off) --enable-64bit-vis enable 64bit Sparc VIS support (default: off) --disable-rpath disable rpath support (default: on) --enable-wince enable Win/CE support (where applicable) --enable-symbols build with debugging symbols (default: off) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-tcl directory containing tcl configuration (tclConfig.sh) --with-tk directory containing tk configuration (tkConfig.sh) --with-tclinclude directory containing the public Tcl header files --with-tkinclude directory containing the public Tk header files --with-x use the X Window System --with-celib=DIR use Windows/CE support library from DIR Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ds9 configure 7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case <limits.h> declares $2. For example, HP-UX 11i <limits.h> declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer <limits.h> to <assert.h> if __STDC__ is defined, since <limits.h> exists even on freestanding compilers. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ds9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 $as_echo_n "checking for correct TEA configuration... " >&6; } if test x"${PACKAGE_NAME}" = x ; then as_fn_error $? " The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 fi if test x"3.9" = x ; then as_fn_error $? " TEA version not specified." "$LINENO" 5 elif test "3.9" != "${TEA_VERSION}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 $as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5 $as_echo "ok (TEA ${TEA_VERSION})" >&6; } fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) # Extract the first word of "cygpath", so it can be a program name with args. set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CYGPATH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CYGPATH"; then ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CYGPATH="cygpath -w" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo" fi fi CYGPATH=$ac_cv_prog_CYGPATH if test -n "$CYGPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 $as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5 $as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;} # This package name must be replaced statically for AC_SUBST to work # Substitute STUB_LIB_FILE in case package creates a stub library too. # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... ac_aux_dir= for ac_dir in tclconfig "$srcdir"/tclconfig; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; with_tclconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } if ${ac_cv_c_tclconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;} with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5 else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdio.h> int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; } if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TCL_BIN_DIR}/tclConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5 $as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; } fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5 $as_echo_n "checking platform... " >&6; } hold_cc=$CC; CC="$TCL_CC" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifdef _WIN32 #error win32 #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : TEA_PLATFORM="unix" else TEA_PLATFORM="windows" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CC=$hold_cc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5 $as_echo "$TEA_PLATFORM" >&6; } # The BUILD_$pkg is to define the correct extern storage class # handling when making this package cat >>confdefs.h <<_ACEOF #define BUILD_${PACKAGE_NAME} /**/ _ACEOF # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true # Check whether --with-tk was given. if test "${with_tk+set}" = set; then : withval=$with_tk; with_tkconfig="${withval}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk configuration" >&5 $as_echo_n "checking for Tk configuration... " >&6; } if ${ac_cv_c_tkconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&5 $as_echo "$as_me: WARNING: --with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself" >&2;} with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else as_fn_error $? "${with_tkconfig} directory doesn't contain tkConfig.sh" "$LINENO" 5 fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../tk[8-9].[0-9]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../tk[8-9].[0-9]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ../../../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[8-9].[0-9].[0-9]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[8-9].[0-9]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi fi if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" as_fn_error $? "Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh" "$LINENO" 5 else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "found ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo_n "checking for existence of ${TK_BIN_DIR}/tkConfig.sh... " >&6; } if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5 $as_echo "loading" >&6; } . "${TK_BIN_DIR}/tkConfig.sh" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TK_BIN_DIR}/tkConfig.sh" >&5 $as_echo "could not find ${TK_BIN_DIR}/tkConfig.sh" >&6; } fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) $as_echo "#define MAC_OSX_TK 1" >>confdefs.h TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi # TEA specific: #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5 $as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;} prefix=${TCL_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5 $as_echo "$as_me: --prefix defaulting to /usr/local" >&6;} prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5 $as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;} exec_prefix=${TCL_EXEC_PREFIX} else { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5 $as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;} exec_prefix=$prefix fi fi #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdarg.h> #include <stdio.h> struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since # <limits.h> exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include <limits.h> #else # include <assert.h> #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ac_nonexistent.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <float.h> int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <ctype.h> #include <stdlib.h> #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 $as_echo_n "checking if the compiler understands -pipe... " >&6; } if ${tcl_cv_cc_pipe+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cc_pipe=yes else tcl_cv_cc_pipe=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5 $as_echo "$tcl_cv_cc_pipe" >&6; } if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <sys/param.h> int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <limits.h> int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac if test "${TEA_PLATFORM}" = "unix" ; then #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" if test "x$ac_cv_func_sin" = xyes; then : MATH_LIBS="" else MATH_LIBS="-lm" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : MATH_LIBS="-lieee $MATH_LIBS" fi #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 $as_echo_n "checking for main in -linet... " >&6; } if ${ac_cv_lib_inet_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-linet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_inet_main=yes else ac_cv_lib_inet_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 $as_echo "$ac_cv_lib_inet_main" >&6; } if test "x$ac_cv_lib_inet_main" = xyes; then : LIBS="$LIBS -linet" fi ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" if test "x$ac_cv_header_net_errno_h" = xyes; then : $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h fi #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : tcl_checkSocket=0 else tcl_checkSocket=1 fi if test "$tcl_checkSocket" = 1; then ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" if test "x$ac_cv_func_setsockopt" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 $as_echo_n "checking for setsockopt in -lsocket... " >&6; } if ${ac_cv_lib_socket_setsockopt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char setsockopt (); int main () { return setsockopt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_setsockopt=yes else ac_cv_lib_socket_setsockopt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 $as_echo "$ac_cv_lib_socket_setsockopt" >&6; } if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : LIBS="$LIBS -lsocket" else tcl_checkBoth=1 fi fi fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" if test "x$ac_cv_func_accept" = xyes; then : tcl_checkNsl=0 else LIBS=$tk_oldLibs fi fi ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : LIBS="$LIBS -lnsl" fi fi # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 $as_echo_n "checking dirent.h... " >&6; } if ${tcl_cv_dirent_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_dirent_h=yes else tcl_cv_dirent_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5 $as_echo "$tcl_cv_dirent_h" >&6; } if test $tcl_cv_dirent_h = no; then $as_echo "#define NO_DIRENT_H 1" >>confdefs.h fi # TEA specific: ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" if test "x$ac_cv_header_errno_h" = xyes; then : else $as_echo "#define NO_ERRNO_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" if test "x$ac_cv_header_float_h" = xyes; then : else $as_echo "#define NO_FLOAT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" if test "x$ac_cv_header_values_h" = xyes; then : else $as_echo "#define NO_VALUES_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes; then : $as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h else $as_echo "#define NO_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtol" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtoul" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strtod" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* if test $tcl_ok = 0; then $as_echo "#define NO_STDLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : tcl_ok=1 else tcl_ok=0 fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strstr" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <string.h> _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "strerror" >/dev/null 2>&1; then : else tcl_ok=0 fi rm -f conftest* # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then $as_echo "#define NO_STRING_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" if test "x$ac_cv_header_sys_wait_h" = xyes; then : else $as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : else $as_echo "#define NO_DLFCN_H 1" >>confdefs.h fi # OS/390 lacks sys/param.h (and doesn't need it, by chance). for ac_header in sys/param.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" if test "x$ac_cv_header_sys_param_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PARAM_H 1 _ACEOF fi done # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- #TEA_ADD_SOURCES([sample.c tclsample.c]) #TEA_ADD_HEADERS([]) #TEA_ADD_INCLUDES([]) #TEA_ADD_LIBS([]) #TEA_ADD_CFLAGS([]) #TEA_ADD_STUB_SOURCES([]) #TEA_ADD_TCL_SOURCES([]) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlInitParser in -lxml2" >&5 $as_echo_n "checking for xmlInitParser in -lxml2... " >&6; } if ${ac_cv_lib_xml2_xmlInitParser+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lxml2 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char xmlInitParser (); int main () { return xmlInitParser (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_xml2_xmlInitParser=yes else ac_cv_lib_xml2_xmlInitParser=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xml2_xmlInitParser" >&5 $as_echo "$ac_cv_lib_xml2_xmlInitParser" >&6; } if test "x$ac_cv_lib_xml2_xmlInitParser" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXML2 1 _ACEOF LIBS="-lxml2 $LIBS" fi #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5 $as_echo_n "checking for Tcl public headers... " >&6; } # Check whether --with-tclinclude was given. if test "${with_tclinclude+set}" = set; then : withval=$with_tclinclude; with_tclinclude=${withval} fi if ${ac_cv_c_tclh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 $as_echo "${ac_cv_c_tclh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" #TEA_PRIVATE_TCL_HEADERS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tk public headers" >&5 $as_echo_n "checking for Tk public headers... " >&6; } # Check whether --with-tkinclude was given. if test "${with_tkinclude+set}" = set; then : withval=$with_tkinclude; with_tkinclude=${withval} fi if ${ac_cv_c_tkh+:} false; then : $as_echo_n "(cached) " >&6 else # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else as_fn_error $? "${with_tkinclude} directory does not contain tk.h" "$LINENO" 5 fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi fi # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then as_fn_error $? "tk.h not found. Please specify its location with --with-tkinclude" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tkh}" >&5 $as_echo "${ac_cv_c_tkh}" >&6; } fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${INCLUDE_DIR_NATIVE}" >&5 $as_echo "${INCLUDE_DIR_NATIVE}" >&6; } fi #TEA_PRIVATE_TK_HEADERS if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else not_really_there="yes" fi rm -f conftest.err conftest.i conftest.$ac_ext else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 header files" >&5 $as_echo_n "checking for X11 header files... " >&6; } found_xincludes="no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : found_xincludes="yes" else found_xincludes="no" fi rm -f conftest.err conftest.i conftest.$ac_ext if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: couldn't find any!" >&5 $as_echo "couldn't find any!" >&6; } fi if test "$no_x" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11 libraries" >&5 $as_echo_n "checking for X11 libraries... " >&6; } XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCreateWindow in -lXwindow" >&5 $as_echo_n "checking for XCreateWindow in -lXwindow... " >&6; } if ${ac_cv_lib_Xwindow_XCreateWindow+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXwindow $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XCreateWindow (); int main () { return XCreateWindow (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_Xwindow_XCreateWindow=yes else ac_cv_lib_Xwindow_XCreateWindow=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xwindow_XCreateWindow" >&5 $as_echo "$ac_cv_lib_Xwindow_XCreateWindow" >&6; } if test "x$ac_cv_lib_Xwindow_XCreateWindow" = xyes; then : XLIBSW=-lXwindow fi fi if test "$XLIBSW" = nope ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find any! Using -lX11." >&5 $as_echo "could not find any! Using -lX11." >&6; } XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi fi #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- # Check whether --enable-threads was given. if test "${enable_threads+set}" = set; then : enableval=$enable_threads; tcl_ok=$enableval else tcl_ok=yes fi if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention $as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h $as_echo "#define _REENTRANT 1" >>confdefs.h if test "`uname -s`" = "SunOS" ; then $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi $as_echo "#define _THREAD_SAFE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_mutex_init=yes else ac_cv_lib_pthread_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 $as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char __pthread_mutex_init (); int main () { return __pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread___pthread_mutex_init=yes else ac_cv_lib_pthread___pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 $as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthreads $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthreads_pthread_mutex_init=yes else ac_cv_lib_pthreads_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 $as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_pthread_mutex_init=yes else ac_cv_lib_c_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 $as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_mutex_init (); int main () { return pthread_mutex_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_mutex_init=yes else ac_cv_lib_c_r_pthread_mutex_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 $as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5 $as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;} fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5 $as_echo_n "checking for building with threads... " >&6; } if test "${TCL_THREADS}" = 1; then $as_echo "#define TCL_THREADS 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5 $as_echo "yes (default)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&5 $as_echo "$as_me: WARNING: Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads." >&2;} fi ;; *) if test "${TCL_THREADS}" = "1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&5 $as_echo "$as_me: WARNING: --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core." >&2;} fi ;; esac #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- #TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Step 0.a: Enable 64 bit support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5 $as_echo_n "checking if 64bit support is requested... " >&6; } # Check whether --enable-64bit was given. if test "${enable_64bit+set}" = set; then : enableval=$enable_64bit; do64bit=$enableval else do64bit=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5 $as_echo "$do64bit" >&6; } # Step 0.b: Enable Solaris 64 bit VIS support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5 $as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; } # Check whether --enable-64bit-vis was given. if test "${enable_64bit_vis+set}" = set; then : enableval=$enable_64bit_vis; do64bitVIS=$enableval else do64bitVIS=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5 $as_echo "$do64bitVIS" >&6; } # Force 64bit on with VIS if test "$do64bitVIS" = "yes"; then : do64bit=yes fi # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 $as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } if ${tcl_cv_cc_visibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {} int main () { f(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_visibility_hidden=yes else tcl_cv_cc_visibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5 $as_echo "$tcl_cv_cc_visibility_hidden" >&6; } if test $tcl_cv_cc_visibility_hidden = yes; then : $as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h $as_echo "#define HAVE_HIDDEN 1" >>confdefs.h fi # Step 0.d: Disable -rpath support? { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5 $as_echo_n "checking if rpath support is requested... " >&6; } # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; doRpath=$enableval else doRpath=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5 $as_echo "$doRpath" >&6; } # TEA specific: Cross-compiling options for Windows/CE builds? if test "${TEA_PLATFORM}" = windows; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5 $as_echo_n "checking if Windows/CE build is requested... " >&6; } # Check whether --enable-wince was given. if test "${enable_wince+set}" = set; then : enableval=$enable_wince; doWince=$enableval else doWince=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5 $as_echo "$doWince" >&6; } fi # Set the variable "system" to hold the name and version number # for the system. { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 $as_echo_n "checking system version... " >&6; } if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5 $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5 $as_echo "$tcl_cv_sys_version" >&6; } system=$tcl_cv_sys_version # Require ranlib early so we can override it in special cases below. # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g if test "$GCC" = yes; then : CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" else CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" if test "x$SHLIB_VERSION" = x; then : SHLIB_VERSION="1.0" fi case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5 $as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5 $as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;} do64bit="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5 $as_echo " Using 64-bit $MACHINE mode" >&6; } do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 fi if test "$GCC" = "yes" ; then as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 fi # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true # Check whether --with-celib was given. if test "${with_celib+set}" = set; then : withval=$with_celib; with_celibconfig=${withval} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 $as_echo_n "checking for Windows/CE celib directory... " >&6; } if ${ac_cv_c_celibconfig+:} false; then : $as_echo_n "(cached) " >&6 else # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi fi if test x"${ac_cv_c_celibconfig}" = x ; then as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5 $as_echo "found $CELIB_DIR" >&6; } fi fi # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \ if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \ if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \ if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 vars="bufferoverflowU.lib" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower($0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do cat >>confdefs.h <<_ACEOF #define $i 1 _ACEOF done cat >>confdefs.h <<_ACEOF #define _WIN32_WCE $CEVERSION _ACEOF cat >>confdefs.h <<_ACEOF #define UNDER_CE $CEVERSION _ACEOF CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RC"; then ac_cv_prog_RC="$RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RC="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RC=$ac_cv_prog_RC if test -n "$RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5 $as_echo "$RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RC"; then ac_ct_RC=$RC # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RC"; then ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RC="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RC=$ac_cv_prog_ac_ct_RC if test -n "$ac_ct_RC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5 $as_echo "$ac_ct_RC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RC" = x; then RC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RC=$ac_ct_RC fi else RC="$ac_cv_prog_RC" fi CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5 $as_echo_n "checking for cross-compile version of gcc... " >&6; } if ${ac_cv_cross+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __WIN32__ #error cross-compiler #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cross=yes else ac_cv_cross=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5 $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then : # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'` ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5 $as_echo "Using $CC for compiling with threads" >&6; } fi LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" fi fi if test "`uname -m`" = ia64; then : # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" if test "$GCC" = yes; then : CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' else CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' else if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared -Wl,-bexpall' else SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" fi SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 $as_echo_n "checking for inet_ntoa in -lbind... " >&6; } if ${ac_cv_lib_bind_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbind $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bind_inet_ntoa=yes else ac_cv_lib_bind_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 $as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : LIBS="$LIBS -lbind -lsocket" fi ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 $as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } if ${ac_cv_lib_network_inet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnetwork $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_ntoa (); int main () { return inet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_network_inet_ntoa=yes else ac_cv_lib_network_inet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 $as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : LIBS="$LIBS -lnetwork" fi ;; HP-UX-*.11.*) # Use updated header definitions where possible $as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library if test "`uname -m`" = ia64; then : SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi else SHLIB_SUFFIX=".sl" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : tcl_ok=yes else tcl_ok=no fi if test "$tcl_ok" = yes; then : LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" fi if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = "yes"; then : if test "$GCC" = yes; then : case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;} ;; esac else do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" fi fi ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" else case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" fi ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : if test "$GCC" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;} else do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" fi fi ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "`uname -m`" = "alpha"; then : CFLAGS="$CFLAGS -mieee" fi if test $do64bit = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 $as_echo_n "checking if compiler accepts -m64 flag... " >&6; } if ${tcl_cv_cc_m64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_m64=yes else tcl_cv_cc_m64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5 $as_echo "$tcl_cv_cc_m64" >&6; } if test $tcl_cv_cc_m64 = yes; then : CFLAGS="$CFLAGS -m64" do64bit_ok=yes fi fi # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. if test x"${USE_COMPAT}" != x; then : CFLAGS="$CFLAGS -fno-inline" fi ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" fi # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@" SHLIB_SUFFIX=".so" LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi if test "${TCL_THREADS}" = "1"; then : # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS" fi # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`" if test $do64bit = yes; then : case `arch` in ppc) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 $as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } if ${tcl_cv_cc_arch_ppc64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_ppc64=yes else tcl_cv_cc_arch_ppc64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5 $as_echo "$tcl_cv_cc_arch_ppc64" >&6; } if test $tcl_cv_cc_arch_ppc64 = yes; then : CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes fi;; i386) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 $as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } if ${tcl_cv_cc_arch_x86_64+:} false; then : $as_echo_n "(cached) " >&6 else hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_cc_arch_x86_64=yes else tcl_cv_cc_arch_x86_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS=$hold_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5 $as_echo "$tcl_cv_cc_arch_x86_64" >&6; } if test $tcl_cv_cc_arch_x86_64 = yes; then : CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes fi;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5 $as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};; esac else # Check for combined 32-bit and 64-bit fat build if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then : fat_32_64=yes fi fi # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 $as_echo_n "checking if ld accepts -single_module flag... " >&6; } if ${tcl_cv_ld_single_module+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_single_module=yes else tcl_cv_ld_single_module=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5 $as_echo "$tcl_cv_ld_single_module" >&6; } if test $tcl_cv_ld_single_module = yes; then : SHLIB_LD="${SHLIB_LD} -Wl,-single_module" fi # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then : LDFLAGS="$LDFLAGS -prebind" fi LDFLAGS="$LDFLAGS -headerpad_max_install_names" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 $as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } if ${tcl_cv_ld_search_paths_first+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_search_paths_first=yes else tcl_cv_ld_search_paths_first=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5 $as_echo "$tcl_cv_ld_search_paths_first" >&6; } if test $tcl_cv_ld_search_paths_first = yes; then : LDFLAGS="$LDFLAGS -Wl,-search_paths_first" fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then : if test "${TEA_WINDOWINGSYSTEM}" = x11; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 $as_echo_n "checking for 64-bit X11... " >&6; } if ${tcl_cv_lib_x11_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <X11/Xlib.h> int main () { XrmInitialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_x11_64=yes else tcl_cv_lib_x11_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5 $as_echo "$tcl_cv_lib_x11_64" >&6; } fi if test "${TEA_WINDOWINGSYSTEM}" = aqua; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 $as_echo_n "checking for 64-bit Tk... " >&6; } if ${tcl_cv_lib_tk_64+:} false; then : $as_echo_n "(cached) " >&6 else for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <tk.h> int main () { Tk_InitStubs(NULL, "", 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_lib_tk_64=yes else tcl_cv_lib_tk_64=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5 $as_echo "$tcl_cv_lib_tk_64" >&6; } fi # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5 $as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;} for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done fi fi ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" if test "$SHARED_BUILD" = 1; then : SHLIB_LD='ld -shared -expect_unresolved "*"' else SHLIB_LD='ld -non_shared -expect_unresolved "*"' fi SHLIB_SUFFIX=".so" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' fi if test "$GCC" = yes; then : CFLAGS="$CFLAGS -mieee" else CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" fi # see pthread_intro(3) for pthread support on osf1, k.furukawa if test "${TCL_THREADS}" = 1; then : CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` if test "$GCC" = yes; then : LIBS="$LIBS -lpthread -lmach -lexc" else CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" fi fi ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) if test "$GCC" = yes; then : SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" else SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" fi SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} else SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} fi ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. $as_echo "#define _REENTRANT 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker if test "$do64bit" = yes; then : arch=`isainfo` if test "$arch" = "sparcv9 sparc"; then : if test "$GCC" = yes; then : if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;} else do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" fi else do64bit_ok=yes if test "$do64bitVIS" = yes; then : CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" else CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" fi # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" fi else if test "$arch" = "amd64 i386"; then : if test "$GCC" = yes; then : case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};; esac else do64bit_ok=yes case $system in SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5 $as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;} fi fi fi SHLIB_SUFFIX=".so" if test "$GCC" = yes; then : SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} if test "$do64bit_ok" = yes; then : if test "$arch" = "sparcv9 sparc"; then : # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" else if test "$arch" = "amd64 i386"; then : # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" fi fi fi else case $system in SunOS-5.[1-9][0-9]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' fi ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5 $as_echo_n "checking for ld accepts -Bexport flag... " >&6; } if ${tcl_cv_ld_Bexport+:} false; then : $as_echo_n "(cached) " >&6 else hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : tcl_cv_ld_Bexport=yes else tcl_cv_ld_Bexport=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$hold_ldflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5 $as_echo "$tcl_cv_ld_Bexport" >&6; } if test $tcl_cv_ld_Bexport = yes; then : LDFLAGS="$LDFLAGS -Wl,-Bexport" fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac if test "$do64bit" = yes -a "$do64bit_ok" = no; then : { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5 $as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;} fi # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. if test "$GCC" = yes; then : case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac fi if test "$tcl_cv_cc_visibility_hidden" != yes; then : $as_echo "#define MODULE_SCOPE extern" >>confdefs.h fi if test "$SHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' fi if test "$UNSHARED_LIB_SUFFIX" = ""; then : # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' fi if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5 $as_echo_n "checking for SEH support in compiler... " >&6; } if ${tcl_cv_seh+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : tcl_cv_seh=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : tcl_cv_seh=yes else tcl_cv_seh=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5 $as_echo "$tcl_cv_seh" >&6; } if test "$tcl_cv_seh" = "no" ; then $as_echo "#define HAVE_NO_SEH 1" >>confdefs.h fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5 $as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; } if ${tcl_cv_eh_disposition+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN int main () { EXCEPTION_DISPOSITION x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_eh_disposition=yes else tcl_cv_eh_disposition=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5 $as_echo "$tcl_cv_eh_disposition" >&6; } if test "$tcl_cv_eh_disposition" = "no" ; then $as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5 $as_echo_n "checking for winnt.h that ignores VOID define... " >&6; } if ${tcl_cv_winnt_ignore_void+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main () { CHAR c; SHORT s; LONG l; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_winnt_ignore_void=yes else tcl_cv_winnt_ignore_void=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5 $as_echo "$tcl_cv_winnt_ignore_void" >&6; } if test "$tcl_cv_winnt_ignore_void" = "yes" ; then $as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5 $as_echo_n "checking for cast to union support... " >&6; } if ${tcl_cv_cast_to_union+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { union foo { int i; double d; }; union foo f = (union foo) (int) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_cast_to_union=yes else tcl_cv_cast_to_union=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5 $as_echo "$tcl_cv_cast_to_union" >&6; } if test "$tcl_cv_cast_to_union" = "yes"; then $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5 $as_echo_n "checking for required early compiler flags... " >&6; } tcl_flags="" if ${tcl_cv_flag__isoc99_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _ISOC99_SOURCE 1 #include <stdlib.h> int main () { char *p = (char *)strtoll; char *q = (char *)strtoull; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__isoc99_source=yes else tcl_cv_flag__isoc99_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then $as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _ISOC99_SOURCE" fi if ${tcl_cv_flag__largefile64_source+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE64_SOURCE 1 #include <sys/stat.h> int main () { struct stat64 buf; int i = stat64("/", &buf); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile64_source=yes else tcl_cv_flag__largefile64_source=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then $as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE64_SOURCE" fi if ${tcl_cv_flag__largefile_source64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGEFILE_SOURCE64 1 #include <sys/stat.h> int main () { char *p = (char *)open64; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_flag__largefile_source64=yes else tcl_cv_flag__largefile_source64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then $as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h tcl_flags="$tcl_flags _LARGEFILE_SOURCE64" fi if test "x${tcl_flags}" = "x" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5 $as_echo "${tcl_flags}" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 $as_echo_n "checking for 64-bit integer type... " >&6; } if ${tcl_cv_type_64bit+:} false; then : $as_echo_n "(cached) " >&6 else tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { __int64 value = (__int64) 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_type_64bit=__int64 else tcl_type_64bit="long long" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { switch (0) { case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ; } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_64bit=${tcl_type_64bit} fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "${tcl_cv_type_64bit}" = none ; then $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5 $as_echo "using long" >&6; } elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5 $as_echo "using Tcl header defaults" >&6; } else cat >>confdefs.h <<_ACEOF #define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit} _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5 $as_echo "${tcl_cv_type_64bit}" >&6; } # Now check for auxiliary declarations { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 $as_echo_n "checking for struct dirent64... " >&6; } if ${tcl_cv_struct_dirent64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> #include <dirent.h> int main () { struct dirent64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_dirent64=yes else tcl_cv_struct_dirent64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5 $as_echo "$tcl_cv_struct_dirent64" >&6; } if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 $as_echo_n "checking for struct stat64... " >&6; } if ${tcl_cv_struct_stat64+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/stat.h> int main () { struct stat64 p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_struct_stat64=yes else tcl_cv_struct_stat64=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5 $as_echo "$tcl_cv_struct_stat64" >&6; } if test "x${tcl_cv_struct_stat64}" = "xyes" ; then $as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h fi for ac_func in open64 lseek64 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 $as_echo_n "checking for off64_t... " >&6; } if ${tcl_cv_type_off64_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <sys/types.h> int main () { off64_t offset; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : tcl_cv_type_off64_t=yes else tcl_cv_type_off64_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then $as_echo "#define HAVE_TYPE_OFF64_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build with symbols" >&5 $as_echo_n "checking for build with symbols... " >&6; } # Check whether --enable-symbols was given. if test "${enable_symbols+set}" = set; then : enableval=$enable_symbols; tcl_ok=$enableval else tcl_ok=no fi DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (standard debugging)" >&5 $as_echo "yes (standard debugging)" >&6; } fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then $as_echo "#define TCL_MEM_DEBUG 1" >>confdefs.h fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled symbols mem debugging" >&5 $as_echo "enabled symbols mem debugging" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: enabled $tcl_ok debugging" >&5 $as_echo "enabled $tcl_ok debugging" >&6; } fi fi #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- #AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\$@ \$(PKG_OBJECTS)" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "manifest needed" >/dev/null 2>&1; then : # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \$@.manifest ; then mt.exe -nologo -manifest \$@.manifest -outputresource:\$@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" CLEANFILES="$CLEANFILES *.manifest" fi rm -f conftest* MAKE_STUB_LIB="\${STLIB_LD} -out:\$@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \$@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \$@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \$@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- #TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ds9 $as_me 7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ds9 config.status 7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' <conf$$subs.awk | sed ' /^[^""]/{ N s/\n// } ' >>$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/configure.in����������������������������������������������������������������������000755 �000765 �000000 �00000016601 12602575413 016702� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash -norc dnl This file is an input file used by the GNU "autoconf" program to dnl generate the file "configure", which is run during Tcl installation dnl to configure the system for the local environment. #----------------------------------------------------------------------- # Sample configure.in for Tcl Extensions. The only places you should # need to modify this file are marked by the string __CHANGE__ #----------------------------------------------------------------------- #----------------------------------------------------------------------- # __CHANGE__ # Set your package name and version numbers here. # # This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION # set as provided. These will also be added as -D defs in your Makefile # so you can encode the package version directly into the source files. # This will also define a special symbol for Windows (BUILD_<PACKAGE_NAME> # so that we create the export library with the dll. #----------------------------------------------------------------------- AC_INIT([ds9], [7.4]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. # This will define a ${TEA_PLATFORM} variable == "unix" or "windows" # as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. #-------------------------------------------------------------------- TEA_INIT([3.9]) AC_CONFIG_AUX_DIR(tclconfig) #-------------------------------------------------------------------- # Load the tclConfig.sh file #-------------------------------------------------------------------- TEA_PATH_TCLCONFIG TEA_LOAD_TCLCONFIG #-------------------------------------------------------------------- # Load the tkConfig.sh file if necessary (Tk extension) #-------------------------------------------------------------------- TEA_PATH_TKCONFIG TEA_LOAD_TKCONFIG #----------------------------------------------------------------------- # Handle the --prefix=... option by defaulting to what Tcl gave. # Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. #----------------------------------------------------------------------- TEA_PREFIX #----------------------------------------------------------------------- # Standard compiler checks. # This sets up CC by using the CC env var, or looks for gcc otherwise. # This also calls AC_PROG_CC and a few others to create the basic setup # necessary to compile executables. #----------------------------------------------------------------------- TEA_SETUP_COMPILER #----------------------------------------------------------------------- # __CHANGE__ # Specify the C source files to compile in TEA_ADD_SOURCES, # public headers that need to be installed in TEA_ADD_HEADERS, # stub library C source files to compile in TEA_ADD_STUB_SOURCES, # and runtime Tcl library files in TEA_ADD_TCL_SOURCES. # This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS # and PKG_TCL_SOURCES. #----------------------------------------------------------------------- #TEA_ADD_SOURCES([sample.c tclsample.c]) #TEA_ADD_HEADERS([]) #TEA_ADD_INCLUDES([]) #TEA_ADD_LIBS([]) #TEA_ADD_CFLAGS([]) #TEA_ADD_STUB_SOURCES([]) #TEA_ADD_TCL_SOURCES([]) AC_CHECK_LIB([xml2],[xmlInitParser]) #-------------------------------------------------------------------- # __CHANGE__ # # You can add more files to clean if your extension creates any extra # files by extending CLEANFILES. # Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure # and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var. # # A few miscellaneous platform-specific items: # TEA_ADD_* any platform specific compiler/build info here. #-------------------------------------------------------------------- #CLEANFILES="$CLEANFILES pkgIndex.tcl" if test "${TEA_PLATFORM}" = "windows" ; then # Ensure no empty if clauses : #TEA_ADD_SOURCES([win/winFile.c]) #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) else # Ensure no empty else clauses : #TEA_ADD_SOURCES([unix/unixFile.c]) #TEA_ADD_LIBS([-lsuperfly]) fi #-------------------------------------------------------------------- # __CHANGE__ # Choose which headers you need. Extension authors should try very # hard to only rely on the Tcl public header files. Internal headers # contain private data structures and are subject to change without # notice. # This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG #-------------------------------------------------------------------- TEA_PUBLIC_TCL_HEADERS #TEA_PRIVATE_TCL_HEADERS TEA_PUBLIC_TK_HEADERS #TEA_PRIVATE_TK_HEADERS TEA_PATH_X #-------------------------------------------------------------------- # Check whether --enable-threads or --disable-threads was given. # This auto-enables if Tcl was compiled threaded. #-------------------------------------------------------------------- TEA_ENABLE_THREADS #-------------------------------------------------------------------- # The statement below defines a collection of symbols related to # building as a shared library instead of a static library. #-------------------------------------------------------------------- #TEA_ENABLE_SHARED #-------------------------------------------------------------------- # This macro figures out what flags to use with the compiler/linker # when building shared/static debug/optimized objects. This information # can be taken from the tclConfig.sh file, but this figures it all out. #-------------------------------------------------------------------- TEA_CONFIG_CFLAGS #-------------------------------------------------------------------- # Set the default compiler switches based on the --enable-symbols option. #-------------------------------------------------------------------- TEA_ENABLE_SYMBOLS #-------------------------------------------------------------------- # Everyone should be linking against the Tcl stub library. If you # can't for some reason, remove this definition. If you aren't using # stubs, you also need to modify the SHLIB_LD_LIBS setting below to # link against the non-stubbed Tcl library. Add Tk too if necessary. #-------------------------------------------------------------------- #AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) #AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) #-------------------------------------------------------------------- # This macro generates a line to use when building a library. It # depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, # and TEA_LOAD_TCLCONFIG macros above. #-------------------------------------------------------------------- TEA_MAKE_LIB #-------------------------------------------------------------------- # Determine the name of the tclsh and/or wish executables in the # Tcl and Tk build directories or the location they were installed # into. These paths are used to support running test cases only, # the Makefile should not be making use of these paths to generate # a pkgIndex.tcl file or anything else at extension build time. #-------------------------------------------------------------------- #TEA_PROG_TCLSH #TEA_PROG_WISH #-------------------------------------------------------------------- # Finally, substitute all of the various values into the Makefile. # You may alternatively have a special pkgIndex.tcl.in or other files # which require substituting th AC variables in. Include these here. #-------------------------------------------------------------------- AC_OUTPUT([Makefile]) �������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/ds9.C�����������������������������������������������������������������������������000644 �000765 �000000 �00000013533 12610232041 015154� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 1999-2015 // Smithsonian Astrophysical Observatory, Cambridge, MA, USA // For conditions of distribution and use, see copyright notice in "copyright" #include <stdlib.h> #include <iostream> #include <sstream> using namespace std; #include <tcl.h> #include <tk.h> #define DEBUGS(x) {FILE* fp=fopen("/Users/joye/debug.txt","a+");fprintf(fp,"%s\n",x);fclose(fp);} extern "C" { int SAOAppInit(Tcl_Interp *interp); int SAOLocalMainHook(int* argc, char*** argv); void TclSetStartupScriptFileName(const char*); int Tkblt_Init(Tcl_Interp*); int Tktable_Init(Tcl_Interp*); int Tclcheckdns_Init(Tcl_Interp*); int Tksao_Init(Tcl_Interp*); int Tkhtml_Init(Tcl_Interp*); int Tkmpeg_Init(Tcl_Interp*); int Tkimg_Init(Tcl_Interp*); int Zlibtcl_Init(Tcl_Interp*); int Jpegtcl_Init(Tcl_Interp*); int Tkimgjpeg_Init(Tcl_Interp*); int Tifftcl_Init(Tcl_Interp*); int Tkimgtiff_Init(Tcl_Interp*); int Pngtcl_Init(Tcl_Interp*); int Tkimgpng_Init(Tcl_Interp*); int Tkimggif_Init(Tcl_Interp*); int Tkimgwindow_Init(Tcl_Interp*); int Tclxpa_Init(Tcl_Interp*); int Tcliis_Init(Tcl_Interp*); int Tclxml_Init(Tcl_Interp*); int Tclxml_libxml2_Init(Tcl_Interp*); int Signal_ext_Init(Tcl_Interp*); int Tkmacosx_Init(Tcl_Interp*); } Tcl_Interp *global_interp; void internalError(const char* msg) { Tcl_SetVar2(global_interp, "ds9", "msg", msg, TCL_GLOBAL_ONLY); Tcl_SetVar2(global_interp, "ds9", "msg,level", "error", TCL_GLOBAL_ONLY); } extern char* dupstr(const char* str); #define PATHSIZE 2048 int SAOLocalMainHook(int* argcPtr, char*** argvPtr) { // sync C++ io calls with C io calls ios::sync_with_stdio(); // do this first Tcl_FindExecutable((*argvPtr)[0]); // startup script // use exec path int argc=*argcPtr; char** argv = *argvPtr; char ss[PATHSIZE]; strncpy(ss,argv[0],PATHSIZE); // now remove "MacOSX/ds9" char* ptr = ss+strlen(ss); while (*ptr != '/' && ptr != ss) ptr--; ptr--; while (*ptr != '/' && ptr != ss) ptr--; *ptr = '\0'; // and add path strncat(ss,"/Frameworks/Tksao.framework/Resources/library/ds9.tcl",PATHSIZE); Tcl_Obj *path = Tcl_NewStringObj(ss,-1); Tcl_SetStartupScript(path, NULL); return TCL_OK; } int SAOAppInit(Tcl_Interp *interp) { // save interp for cputs function global_interp = interp; // Tcl if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tk if (Tk_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp,"Tk", Tk_Init, Tk_SafeInit); // Tkblt if (Tkblt_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage(interp, "tkblt", Tkblt_Init, (Tcl_PackageInitProc*)NULL); // Tktable if (Tktable_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tktable", Tktable_Init, (Tcl_PackageInitProc*)NULL); // Tclcheckdns if (Tclcheckdns_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tclcheckdns", Tclcheckdns_Init, (Tcl_PackageInitProc*)NULL); // Tksao if (Tksao_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tksao", Tksao_Init, (Tcl_PackageInitProc*)NULL); // Tkhtml if (Tkhtml_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkhtml", Tkhtml_Init, (Tcl_PackageInitProc*)NULL); // Tclxpa if (Tclxpa_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "Tclxpa", Tclxpa_Init, (Tcl_PackageInitProc*)NULL); // Tcliis if (Tcliis_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tcliis", Tcliis_Init, (Tcl_PackageInitProc*)NULL); // Tkmpeg if (Tkmpeg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkmpeg", Tkmpeg_Init, (Tcl_PackageInitProc*)NULL); // Tclxml if (Tclxml_Init(interp) == TCL_ERROR) return TCL_ERROR; // Tkimg if (Tkimg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "img", Tkimg_Init, (Tcl_PackageInitProc*)NULL); // zlibtcl if (Zlibtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "zlibtcl", Zlibtcl_Init, (Tcl_PackageInitProc*)NULL); // jpegtcl if (Jpegtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpegtcl", Jpegtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgjpeg if (Tkimgjpeg_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "jpeg", Tkimgjpeg_Init, (Tcl_PackageInitProc*)NULL); // Tifftcl if (Tifftcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tifftcl", Tifftcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgtiff if (Tkimgtiff_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tiff", Tkimgtiff_Init, (Tcl_PackageInitProc*)NULL); // Pngtcl if (Pngtcl_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "pngtcl", Pngtcl_Init, (Tcl_PackageInitProc*)NULL); // Tkimgpng if (Tkimgpng_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "png", Tkimgpng_Init, (Tcl_PackageInitProc*)NULL); // Tkimggif if (Tkimggif_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "gif", Tkimggif_Init, (Tcl_PackageInitProc*)NULL); // Tkimgwindow if (Tkimgwindow_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "window", Tkimgwindow_Init, (Tcl_PackageInitProc*)NULL); // Signal_Ext if (Signal_ext_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "signal", Signal_ext_Init, (Tcl_PackageInitProc*)NULL); // Tkmacosx if (Tkmacosx_Init(interp) == TCL_ERROR) return TCL_ERROR; Tcl_StaticPackage (interp, "tkmacosx", Tkmacosx_Init, (Tcl_PackageInitProc*)NULL); return TCL_OK; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/Makefile.in�����������������������������������������������������������������������000644 �000765 �000000 �00000014444 12602574520 016434� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������include ../../make.pkgs CC = @CC@ CXX = @CXX@ LIBS = @LIBS@ OBJEXT = @OBJEXT@ EXEEXT = @EXEEXT@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_STUB_LIB_SPEC= @TCL_STUB_LIB_SPEC@ TK_LIBS = @TK_LIBS@ TK_LIB_SPEC = @TK_LIB_SPEC@ TK_STUB_LIB_SPEC= @TK_STUB_LIB_SPEC@ PKG_CFLAGS = @PKG_CFLAGS@ DEFS = @DEFS@ $(PKG_CFLAGS) CPPFLAGS = @CPPFLAGS@ COMPILE = $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) CPPFLAGS = @CPPFLAGS@ CFLAGS = @CFLAGS@ INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@ @TK_INCLUDES@ @TK_XINCLUDES@ .SUFFIXES: .c .C .$(OBJEXT) .c.@OBJEXT@: $(CC) $(COMPILE) -c $< -o $@ .C.@OBJEXT@: $(CXX) $(COMPILE) -c $< -o $@ #--------------------------defines OBJS = ds9.o tkAppInit.o LLIBS = \ ../../lib/$(TKSAODIR)/libtksao1.0.a \ ../../lib/$(TKSAODIR)/libfuntools.a \ ../../lib/$(TKSAODIR)/libast.a \ ../../lib/$(TKSAODIR)/libast_err.a \ ../../lib/$(TKSAODIR)/libast_pal.a \ ../../lib/$(TKHTMLDIR)/libtkhtml1.0.a \ ../../lib/$(TKMPEGDIR)/libtkmpeg1.0.a \ ../../lib/$(TCLXMLVER)/libTclxml3.2.a \ ../../lib/$(TKTABLEVER)/libTktable2.10.a \ ../../lib/$(TKIMGVER)/libtkimgpng1.4.a \ ../../lib/$(TKIMGVER)/libpngtcl1.4.3.a \ ../../lib/$(TKIMGVER)/libtkimgtiff1.4.a \ ../../lib/$(TKIMGVER)/libtifftcl3.9.4.a \ ../../lib/$(TKIMGVER)/libtkimgjpeg1.4.a \ ../../lib/$(TKIMGVER)/libjpegtcl8.2.a \ ../../lib/$(TKIMGVER)/libtkimggif1.4.a \ ../../lib/$(TKIMGVER)/libtkimgwindow1.4.a \ ../../lib/$(TKIMGVER)/libzlibtcl1.2.5.a \ ../../lib/$(TKIMGVER)/libtkimg1.4.a \ ../../lib/libtiff.a \ ../../lib/libxpa.a \ ../../lib/$(TCLIISDIR)/libtcliis1.0.a \ ../../lib/$(TCLCHECKDNSDIR)/libtclcheckdns1.1.a \ ../../lib/$(TCLSIGNALDIR)/libtclsignal1.4.a \ ../../lib/$(TKBLTDIR)/libtkblt3.0.a \ ../../lib/$(TKMACOSXDIR)/libtkmacosx1.0.a APPDIR = ../../bin/SAOImage\ DS9.app TKSAOFW = ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tksao.framework TKSAORES= ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tksao.framework/Resources TCLFW = ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tcl.framework TCLRES = ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tcl.framework/Resources TKFW = ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tk.framework TKRES = ../../bin/SAOImage\ DS9.app/Contents/Frameworks/Tk.framework/Resources #--------------------------main ds9 : ds9base appdir framework tcl tk tcllib tkcon xmlrpc tkblt xpa compiler cp -p ds9base $(APPDIR)/Contents/MacOS/ds9 strip $(APPDIR)/Contents/MacOS/ds9 install_name_tool -change \ /Library/Frameworks/Tcl.framework/Versions/8.6/Tcl \ @executable_path/../Frameworks/Tcl.framework/Tcl \ $(APPDIR)/Contents/MacOS/ds9 install_name_tool -change \ /Library/Frameworks/Tk.framework/Versions/8.6/Tk \ @executable_path/../Frameworks/Tk.framework/Tk \ $(APPDIR)/Contents/MacOS/ds9 cd ../../bin; codesign --deep -f -s "SAOImage DS9" SAOImage\ DS9.app debug : ds9base appdir framework tcl tk tcllib tkcon xmlrpc tkblt xpa compiler cp -p ds9base $(APPDIR)/Contents/MacOS/ds9 install_name_tool -change \ /Library/Frameworks/Tcl.framework/Versions/8.6/Tcl \ @executable_path/../Frameworks/Tcl.framework/Tcl \ $(APPDIR)/Contents/MacOS/ds9 install_name_tool -change \ /Library/Frameworks/Tk.framework/Versions/8.6/Tk \ @executable_path/../Frameworks/Tk.framework/Tk \ $(APPDIR)/Contents/MacOS/ds9 cd ../../bin; codesign --deep -f -s "SAOImage DS9" SAOImage\ DS9.app tkAppInit.o : tkAppInit.c $(CC) $(COMPILE) -DTK_LOCAL_APPINIT=SAOAppInit \ -DTK_LOCAL_MAIN_HOOK=SAOLocalMainHook -c tkAppInit.c -o $@ tkAppInit.c : ../../$(TKDIR)/unix/tkAppInit.c cp ../../$(TKDIR)/unix/tkAppInit.c . ds9base : $(OBJS) $(LLIBS) $(RM) $@ $(CXX) -o $@ $(OBJS) \ $(LLIBS) \ $(LIBS) \ $(TK_STUB_LIB_SPEC) $(TK_LIB_SPEC) \ $(TCL_STUB_LIB_SPEC) $(TCL_LIB_SPEC) \ $(TK_LIBS) appdir : FORCE rm -rf $(APPDIR) cp -rp SAOImage\ DS9.app ../../bin/. framework: FORCE cp -pr ../library $(TKSAORES)/. cp -pr ../msgs $(TKSAORES)/. cp -pr ../doc $(TKSAORES)/. cp -pr ../cmaps $(TKSAORES)/. cp -pr ../template $(TKSAORES)/. rm $(TKSAORES)/library/source.tcl cd $(APPDIR); find -d . -name CVS -exec rm -rf {} \; cd $(APPDIR); find . -name keepme -exec rm -rf {} \; echo "pkg_mkIndex $(TKSAORES)/library *.tcl; exit" | ../../bin/tclsh8.6 tcl : FORCE cp -p ../../build/tcl/Tcl.framework/Versions/8.6/Tcl $(TCLFW)/. cp -pr ../../build/tcl/Tcl.framework/Versions/8.6/Resources/* $(TCLRES)/. tcl_debug: FORCE cp -p ../../build/tcl/Tcl.framework/Versions/8.6/Tcl_debug $(TCLFW)/Tcl cp -pr ../../build/tcl/Tcl.framework/Versions/8.6/Resources/* $(TCLRES)/. tk : FORCE cp -p ../../build/tk/Tk.framework/Versions/8.6/Tk $(TKFW)/. cp -p ../../build/tk/Tk.framework/Versions/8.6/Resources/Info.plist \ $(TKRES)/. cp -p ../../build/tk/Tk.framework/Versions/8.6/Resources/license.terms \ $(TKRES)/. cp -rp ../../build/tk/Tk.framework/Versions/8.6/Resources/Scripts \ $(TKRES)/. tk_debug: FORCE cp -p ../../build/tk/Tk.framework/Versions/8.6/Tk_debug $(TKFW)/Tk cp -p ../../build/tk/Tk.framework/Versions/8.6/Resources/Info.plist \ $(TKRES)/. cp -p ../../build/tk/Tk.framework/Versions/8.6/Resources/license.terms \ $(TKRES)/. cp -rp ../../build/tk/Tk.framework/Versions/8.6/Resources/Scripts \ $(TKRES)/. tcllib : FORCE mkdir $(TKSAORES)/$(TCLLIBVER) cp -pr ../../$(TCLLIBDIR)/modules/base64 $(TKSAORES)/$(TCLLIBVER)/. cp -pr ../../$(TCLLIBDIR)/modules/ftp $(TKSAORES)/$(TCLLIBVER)/. cp -pr ../../$(TCLLIBDIR)/modules/log $(TKSAORES)/$(TCLLIBVER)/. cp -pr ../../$(TCLLIBDIR)/modules/textutil $(TKSAORES)/$(TCLLIBVER)/. cp -pr ../../$(TCLLIBDIR)/modules/math $(TKSAORES)/$(TCLLIBVER)/. tkcon : FORCE mkdir $(TKSAORES)/$(TKCONVER) cp -p ../../$(TKCONDIR)/*.tcl $(TKSAORES)/$(TKCONVER)/. xmlrpc : FORCE mkdir $(TKSAORES)/$(XMLRPCVER) cp -p ../../$(XMLRPCDIR)/xmlrpc.tcl $(TKSAORES)/$(XMLRPCVER)/. echo "pkg_mkIndex $(TKSAORES)/$(XMLRPCVER) *.tcl; exit" | ../../bin/tclsh8.6 tkblt : FORCE mkdir $(TKSAORES)/$(TKBLTDIR) cp -p ../../$(TKBLTDIR)/library/graph.tcl $(TKSAORES)/$(TKBLTDIR)/. echo "pkg_mkIndex $(TKSAORES)/tkblt3.0 *.tcl; exit" | ../../bin/tclsh8.6 xpa : FORCE cp -pr ../../bin/xpans $(TKSAORES)/. compiler: FORCE cp -p ../../compilers/pcc-i386-snowleopard.tar.gz $(TKSAORES)/. #--------------------------cleanup clean : FORCE cd ../library; $(MAKE) clean $(RM) core *~ *# distclean: FORCE cd ../library; $(MAKE) distclean -rm -f Makefile -rm -f config.cache config.log config.status $(RM) core *~ *# ds9Base ds9 *.o FORCE : ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/README����������������������������������������������������������������������������000644 �000765 �000000 �00000000403 12413306271 015231� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ To install SAOimage DS9, drag and drop the DS9 icon onto the Applications Folder. You also can drag the DS9 icon from Applications to your Dock in order to make DS9 more easily accessible. Email us with questions and comments: saord@cfa.harvard.edu �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/�����������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 017104� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/tclconfig/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016330� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/tclconfig/ChangeLog���������������������������������������������������������������000644 �000765 �000000 �00000106605 12557751640 020123� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������2013-07-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [3324676]: AC_PROG_INSTALL incompat, Bug [3606445]: Unneeded -DHAVE_NO_SEH=1 when not building on Windows 2013-07-02 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Bug [32afa6e256]: dirent64 check is incorrect in tcl.m4 (thanks to Brian Griffin) 2013-06-20 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Use X11/Xlib.h for checking where X11 can be found in stead of X11/XIntrinsic.h. Suggested by Pietro Cerutti. 2013-06-04 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Eliminate NO_VIZ macro as current zlib uses HAVE_HIDDEN in stead. One more last-moment fix for FreeBSD by Pietro Cerutti 2013-05-19 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Fix for FreeBSD, and remove support for old FreeBSD versions. Patch by Pietro Cerutti 2013-03-12 Jan Nijtmans <nijtmans@users.sf.net> * unix/tcl.m4: Patch by Andrew Shadura, providing better support for * three architectures they have in Debian. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Added "-DNDEBUG" to CFLAGS_DEFAULT when building with --disable-symbols. 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3555058]: Checkin [30736d63f0] broke CFLAGS_DEFAULT, LDFLAGS_DEFAULT 2012-08-07 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-08-07 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806]: Checkin [30736d63f0] broke CFLAGS 2012-07-25 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: My previous commit (2012-04-03) broke the ActiveTcl build for AMD64, because of the quotes in "C:/<path>/AMD64/cl.exe". It turns out that the AC_TRY_COMPILE macro cannot handle that. 2012-07-22 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Tidy: consistency, spelling, phrasing, whitespace. No functional change. 2012-04-03 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 3511806] Compiler checks too early This change allows to build the cygwin and mingw32 ports of Tcl/Tk extensions to build out-of-the-box using a native or cross-compiler, e.g. on Cygwin, Linux or Darwin. 2011-04-02 Jan Nijtmans <nijtmans@users.sf.net> * install-sh: Fix issue with library stripping in install-sh (backported from kevin_walzer's patch from Tcl 8.6 trunk) 2011-04-05 Andreas Kupries <andreask@activestate.com> * tcl.m4: Applied patch by Jeff Lawson. Nicer error message when tclConfig.sh was not found. 2010-12-15 Stuart Cassoff <stwo@users.sourceforge.net> * install-sh: Upgrade to newer install-sh and use it. * tcl.m4: 2010-12-14 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Better building on OpenBSD. 2010-12-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: when using gcc, don't try to determine Win64 SDK 2010-12-12 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Determine correctly a cross-compiler-windres 2010-11-23 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: add some cross-compile support, borrowed from Tcl 8.6 2010-09-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX LDFLAGS (only used when building big shell) 2010-09-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add extra if check for .manifest file generation Add notice about package name and version being built. 2010-09-09 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [FREQ #3058486] TEA_LOAD_CONFIG doesn't set all BUILD_ vars Slightly related: defining BUILD_$1 on all platforms - not only win - allows the -fvisibility feature to be used in extensions as well, at least if you compile against tcl >= 8.5. 2010-08-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: ensure safe quoting for autoheader usage 2010-08-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add TEA_ADD_CLEANFILES macro to make adding cleanfiles easier, and add *.exp to CLEANFILES Windows default. (TEA_MAKE_LIB): Enhanced to check for MSVC that requires manifests and auto-embed it into proj DLL via MAKE_SHARED_LIB. Also define VC_MANIFEST_EMBED_DLL and VC_MANIFEST_EMBED_EXE that do the same magic in case it is needed for extended TEA projects. 2010-08-16 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.9 *** If upgrading from TEA_VERSION 3.8, copy over tcl.m4, change TEA_INIT to use 3.9 and reconfigure (ac-2.59+). BUILD_${PACKAGE_NAME} will be auto-defined on Windows for correct setting of TCL_STORAGE_CLASS. TEA_LOAD_CONFIG users should remove the SHLIB_LD_LIBS setting done in configure.in (LIBS will be automagically populated by TEA_LOAD_CONFIG). TEA_EXPORT_CONFIG has been added for ${pkg}Config.sh creators SHLIB_LD_FLAGS was deprecated a while ago, remove it if it is still in your Makefile.in. * tcl.m4: add /usr/lib64 to set of auto-search dirs. [Bug 1230554] Auto-define BUILD_$PACKAGE_NAME so users don't need to. This needs to correspond with $pkg.h define magic for TCL_STORAGE_CLASS. Auto-define CLEANFILES. Users can expand it. (SHLIB_LD_LIBS): define to '${LIBS}' default and change it only if necessary. Platforms not using this may simply not work or have very funky linkers. (TEA_LOAD_CONFIG): When loading config for another extension, auto-add stub libraries found with TEA_ADD_LIBS. Eases configure.in for modules like itk and img::*. (TEA_EXPORT_CONFIG): Add standardized function for exporting a ${pkg}Config.sh. See use by img::* and itcl. 2010-08-12 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.8 *** If upgrading from TEA_VERSION 3.7, copy over tcl.m4, change TEA_INIT to use 3.8 and reconfigure (ac-2.59+). No other changes should be necessary. * tcl.m4: remove more vestigial bits from removed platforms. Add back SCO_SV-3.2*. Remove use of DL_LIBS and DL_OBJS and related baggage - these are only needed by the core to support 'load'. Allow for macosx in TEA_ADD_SOURCES. Correct check for found_xincludes=no in TEA_PATH_UNIX_X. 2010-08-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove the following old platform configurations: UNIX_SV*|UnixWare-5*, SunOS-4.*, SINIX*5.4*, SCO_SV-3.2*<readded>, OSF1-1.*, NEXTSTEP-*, NetBSD-1.*|FreeBSD-[[1-2]].*, MP-RAS-*, IRIX-5.*, HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*, dgux*, BSD/OS-2.1*|BSD/OS-3* (AIX): drop AIX-pre4 support and use of ldAix, use -bexpall/-brtl 2010-07-05 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Patch #1055668] removal of exported internals from tclInt.h (EXTERN macro) 2010-04-14 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4 - Backport a lot of quoting fixes from tcl8.6/unix/tcl.m4 - Fix determination of CYGPATH for CYGWIN With those fixes, itcl and tdbc compile fine with CYGWIN 2010-04-06 Jan Nijtmans <nijtmans@users.sf.net> * install-sh [Bug 2982540] configure and install* script files should always have LF 2010-02-19 Stuart Cassoff <stwo@users.sourceforge.net> * tcl.m4: Correct compiler/linker flags for threaded builds on OpenBSD. 2010-01-19 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: Detect CYGWIN variant: win32 or unix 2010-01-03 Donal K. Fellows <dkf@users.sf.net> * unix/tcl.m4 (TEA_CONFIG_CFLAGS): [Tcl Bug 1636685]: Use the configuration for modern FreeBSD suggested by the FreeBSD porter. 2009-10-22 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Tcl Patch #2883533] tcl.m4 support for Haiku OS 2009-04-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): harden the check to add _r to CC on AIX with threads. 2009-04-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): check for 64-bit TkAqua. 2009-03-26 Jan Nijtmans <nijtmans@users.sf.net> * tclconfig/tcl.m4: Adapt LDFLAGS and LD_SEARCH_FLAGS together with SHLIB_LD definition to unbreak building on HPUX. 2009-03-20 Andreas Kupries <andreask@activestate.com> * tclconfig/tcl.m4: Changed SHLIB_LD definition to unbreak building on HPUX. 2009-03-16 Joe English <jenglish@users.sourceforge.net> * tcl.m4(TEA_PUBLIC_TK_HEADERS): Look at ${TK_INCLUDE_SPEC} (found in tkConfig.sh) when trying to guess where tk.h might be [Patch 1960628]. 2009-03-11 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Allow ${SHLIB_SUFFIX} to be overridden at configure-time [Patch 1960628]. Also fix some comment typos, and an uninitialized variable bug-waiting-to-happen. 2008-12-21 Jan Nijtmans <nijtmans@users.sf.net> * tcl.m4: [Bug 2073255] Tcl_GetString(NULL) doesn't crash on HP-UX (this bug report was for Tcl, but holds for TEA as well.) 2008-12-20 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: sync with tdbc tcl.m4 changes (SunOS-5.11): Sun cc SHLIB_LD: use LDFLAGS_DEFAULT instead of LDFLAGS 2008-12-02 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.7 *** * tcl.m4: in private header check, check for <plat>Port.h instead of Int.h to ensure all private headers are available. 2008-11-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): sync TEA_PRIVATE_TK_HEADERS handling of Tk.framework PrivateHeaders with TEA_PRIVATE_TCL_HEADERS. 2008-11-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_TCLCONFIG, TEA_PATH_TKCONFIG): exit with error when tclConfig.sh cannot be found. [Bug #1997760] (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): allow for finding the headers installed in the public areas, e.g. a result of make install-private-headers. [Bug #1631922] 2008-08-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): link shlib with current and compatiblity version flags; look for libX11.dylib when searching for X11 libraries. 2008-06-12 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.11): fix 64bit amd64 support with gcc & Sun cc. 2008-03-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (SunOS-5.1x): fix 64bit support for Sun cc. [Bug 1921166] 2008-02-01 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4 (TEA_CONFIG_CFLAGS): Updated to work at least in part with more modern VC versions. Currently just made the linker flags more flexible; more work may be needed. 2007-10-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for 64-bit X11. 2007-10-23 Jeff Hobbs <jeffh@ActiveState.com> *** Tagged tea-3-branch to start TEA 4 development on HEAD *** 2007-09-17 Joe English <jenglish@users.sourceforge.net> * tcl.m4: use '${CC} -shared' instead of 'ld -Bshareable' to build shared libraries on current NetBSDs [Bug 1749251]. 2007-09-15 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: replace all direct references to compiler by ${CC} to enable CC overriding at configure & make time. (SunOS-5.1x): replace direct use of '/usr/ccs/bin/ld' in SHLIB_LD by 'cc' compiler driver. 2007-08-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check Ttk dir for Tk private headers (8.5). Add some comments to other bits. 2007-06-25 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): move where / is added. 2007-06-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: fix --with-tkinclude alignment. [Bug 1506111] 2007-06-06 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fix 64bit arch removal in fat 32&64bit builds. 2007-05-18 Donal K. Fellows <donal.k.fellows@man.ac.uk> * tcl.m4: Added quoting so that paths with spaces cause fewer problems. 2007-03-07 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): s/CFLAGS/CPPFLAGS/ in -mmacosx-version-min check. 2007-02-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct private header check to search in generic subdir 2007-02-09 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA_VERSION 3.6 *** * tcl.m4: correct -d to -f (TEA_CONFIG_CFLAGS): SHLIB_SUFFIX is .so on HP ia64 [Bug 1615058] 2007-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS, TEA_PRIVATE_TK_HEADERS): check that the dirs actually have private headers. [Bug 1631922] 2007-02-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching to -pipe check. 2007-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: integrate CPPFLAGS into CFLAGS as late as possible and move (rather than duplicate) -isysroot flags from CFLAGS to CPPFLAGS to avoid errors about multiple -isysroot flags from some older gcc builds. 2006-01-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: ensure CPPFLAGS env var is used when set. [Bug 1586861] (Darwin): add -isysroot and -mmacosx-version-min flags to CPPFLAGS when present in CFLAGS to avoid discrepancies between what headers configure sees during preprocessing tests and compiling tests. 2006-12-19 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): --enable-64bit: verify linking with 64bit -arch flag succeeds before enabling 64bit build. 2006-12-16 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): fix previous change to use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. 2006-11-26 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Linux): --enable-64bit support. [Patch 1597389], [Bug 1230558] 2006-08-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add support for --enable-64bit on x86_64, for universal builds including x86_64 and for use of -mmacosx-version-min instead of MACOSX_DEPLOYMENT_TARGET. For Tk extensions, remove 64-bit arch flags from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64-bit at present. 2006-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: []-quote AC_DEFUN functions. (TEA_PATH_TKCONFIG): Fixed Windows-specific check for tkConfig.sh. (TEA_MAKE_LIB): Prepend 'lib' for Windows-gcc configs. 2006-03-07 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Set SHLIB_LD_FLAGS='${LIBS}' on NetBSD, as per the other *BSD variants [Bug 1334613]. 2006-01-25 Jeff Hobbs <jeffh@ActiveState.com> *** Bump to TEA version 3.5 *** * tcl.m4: keep LD_SEARCH_FLAGS and CC_SEARCH_FLAGS synchronous with core tcl.m4 meaning. 2006-01-24 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): use makefile variable LDFLAGS_DEFAULT instead of LDFLAGS in SHLIB_LD, to ensure linker flags in sampleextension Makefile are picked up. [Bug 1403343] 2006-01-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add C:/Tcl/lib and C:/Progra~1/Tcl/lib dirs to check for *Config.sh on Windows. [Bug 1407544] 2006-01-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): for Tk extensions, remove -arch ppc64 from CFLAGS like in the Tk configure, as neither TkAqua nor TkX11 can be built for 64bit at present (no 64bit GUI libraries). 2006-01-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: restore system=windows on Windows. Remove error if 'ar' isn't found (it may not be on Windows). Do not add -lxnet or define _XOPEN_SOURCE on HP-UX by default. Ensure the C|LDFLAGS_DEFAULT gets the fully sub'd value at configure time. 2006-01-10 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: add caching, use AC_CACHE_CHECK instead of AC_CACHE_VAL where possible, consistent message quoting, sync relevant tcl/unix/tcl.m4 HEAD changes and gratuitous formatting differences (notably sunc removal of support for for ancient BSD's, IRIX 4, RISCos and Ultrix by kennykb), Darwin improvements to TEA_LOAD_*CONFIG to make linking work against Tcl/Tk frameworks installed in arbitrary location, change TEA_PROG_* search order (look in *_BIN_DIR parents before *_PREFIX). 2006-01-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add dkf's system config refactor 2006-01-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove extraneous ' that causes bash 3.1 to choke 2005-12-19 Joe English <jenglish@users.sourceforge.net> * tcl.m4 (TEA_PATH_TCLCONFIG &c): Look for tclConfig.sh &c in ${libdir}, where they are installed by default [Patch #1377407]. 2005-12-05 Don Porter <dgp@users.sf.net> * tcl.m4 (TEA_PUBLIC_*_HEADERS): Better support for finding header files for uninstalled Tcl and Tk. 2005-12-02 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correctly bump TEA_VERSION var to 3.4 2005-12-01 Daniel Steffen <das@users.sourceforge.net> * unix/tcl.m4 (Darwin): fixed error when MACOSX_DEPLOYMENT_TARGET unset 2005-11-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Bump to TEA version 3.4 *** Add Windows x64 build support. Remove TEA_PATH_NOSPACE and handle the problem with ""s where necessary - the macro relied on TCLSH_PROG which didn't work for cross-compiles. 2005-11-27 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add 64bit support, add CFLAGS to SHLIB_LD to support passing -isysroot in env(CFLAGS) to configure (flag can't be present twice, so can't be in both CFLAGS and LDFLAGS during configure), don't use -prebind when deploying on 10.4. (TEA_ENABLE_LANGINFO, TEA_TIME_HANDLER): add/fix caching. 2005-10-30 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: fixed two tests for TEA_WINDOWINGSYSTEM = "aqua" that should have been for `uname -s` = "Darwin" instead; added some missing quoting. (TEA_PROG_TCLSH, TEA_PROG_WISH): fix incorrect assumption that install location of tclConfig.sh/tkConfig.sh allows to determine the tclsh/wish install dir via ../bin. Indeed tcl/tk can be configured with arbitrary --libdir and --bindir (independent of prefix) and such a configuration is in fact standard with Darwin framework builds. At least now also check ${TCL_PREFIX}/bin resp. ${TK_PREFIX}/bin for presence of tclsh resp. wish (if tcl/tk have been configured with arbitrary --bindir, this will still not find them, for a general solution *Config.sh would need to contain the values of bindir/libdir/includedir passed to configure). 2005-10-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Fix Solaris 5.10 check and Solaris AMD64 64-bit builds. 2005-10-04 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PRIVATE_TCL_HEADERS): add / to finish sed macro (TEA_ENABLE_THREADS): don't check for pthread_attr_setstacksize func 2005-09-13 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: *** Update to TEA version 3.3 *** define TEA_WINDOWINGSYSTEM in TEA_LOAD_TKCONFIG. Make --enable-threads the default (users can --disable-threads). Improve AIX ${CC}_r fix to better check existing ${CC} value. Do the appropriate evals to not require the *TOP_DIR_NATIVE vars be set for extensions that use private headers. Make aqua check for Xlib compat headers the same as win32. 2005-07-26 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Remove TEA_BUILD_TCLSH and TEA_BUILD_WISH because of complaints that it broke the build when only an installed version of Tcl was available at extension build time. The TEA_PROG_TCLSH and TEA_PROG_WISH macros will no longer search the path at all. The build tclsh or installed tclsh shell will now be found by TEA_PROG_TCLSH. 2005-07-24 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_PROG_TCLSH, TEA_BUILD_TCLSH, TEA_PROG_WISH, TEA_BUILD_WISH): Split confused search for tclsh on PATH and build and install locations into two macros. TEA_PROG_TCLSH and TEA_PROG_WISH search the system PATH for an installed tclsh or wish. The TEA_BUILD_TCLSH and TEA_BUILD_WISH macros determine the name of tclsh or wish in the Tcl or Tk build directory even if tclsh or wish has not yet been built. [Tcl bug 1160114] [Tcl patch 1244153] 2005-06-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PRIVATE_TK_HEADERS): add ${TK_SRC_DIR}/macosx to TK_INCLUDES when building against TkAqua. * tcl.m4 (TEA_PATH_X): fixed missing comma in AC_DEFINE * tcl.m4: changes to better support framework builds of Tcl and Tk out of the box: search framework install locations for *Config.sh, and if in presence of a framework build, use the framework's Headers and PrivateHeaders directories for public and private includes. [FR 947735] 2005-06-18 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): add -headerpad_max_install_names to LDFLAGS to ensure we can always relocate binaries with install_name_tool. 2005-06-04 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_PATH_X): for TEA_WINDOWINGSYSTEM == aqua, check if xlib compat headers are available in tkheaders location, otherwise add xlib sourcedir to TK_XINCLUDES. 2005-04-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4: added AC_DEFINE* descriptions (from core tcl.m4) to allow use with autoheader. (Darwin): added configure checks for recently added linker flags -single_module and -search_paths_first to allow building with older tools (and on Mac OS X 10.1), use -single_module in SHLIB_LD. (TEA_MISSING_POSIX_HEADERS): added caching of dirent.h check. (TEA_BUGGY_STRTOD): added caching (sync with core tcl.m4). 2005-03-24 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): use Tcl header defaults for wide int type only on Windows when __int64 is detected as valid. 2005-03-24 Don Porter <dgp@users.sf.net> * README.txt: Update reference to "SC_* macros" to "TEA_* macros". * tcl.m4: Incorporated recent improvements in SC_PATH_TCLCONFIG and SC_PATH_TKCONFIG into TEA_PATH_TCLCONFIG and TEA_PATH_TKCONFIG. Corrected search path in TEA_PATH_CONFIG and added AC_SUBST($1_BIN_DIR) to TEA_LOAD_CONFIG so that packages that load the configuration of another package can know where they loaded it from. 2005-03-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): correct 2005-03-17 change to have variant LD_SEARCH_FLAGS for gcc and cc builds. * tcl.m4 (TEA_PROG_TCLSH, TEA_PROG_WISH): correct x-compile check. 2005-03-17 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Correct gcc build and HP-UX-11. 2005-02-08 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ADD_LIBS): don't touch lib args starting with -. (TEA_CONFIG_CFLAGS): only define _DLL for CE in shared build. (TEA_MAKE_LIB): set RANLIB* to : on Windows (it's not needed). 2005-02-01 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: redo of 2005-01-27 changes to correctly handle paths with spaces. Win/CE and Win/64 builds now require a prebuilt tclsh to handle conversion to short pathnames. This is done in the new TEA_PATH_NOSPACE macro. For Win/CE|64, make CC just the compiler and move the necessary includes to CFLAGS. (TEA_CONFIG_CFLAGS): Add Solaris 64-bit gcc build support. (TEA_PROG_TCLSH, TEA_PROG_WISH): Allow TCLSH_PROG and WISH_PROG to be set in the env and prevent resetting. (TEA_ADD_LIBS): On Windows using GCC (mingw), convert foo.lib args to -lfoo, for use with mingw. *** POTENTIAL INCOMPATABILITY *** (TEA_CONFIG_CFLAGS): Fix AIX gcc builds to work out-of-box. Bumped TEA to 3.2. 2005-01-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: remove cygpath calls to support msys. Update base CE build assumption to "420,ARMV4,ARM,Pocket PC 2003". Make STLIB_LD use $LINKBIN -lib. 2005-01-25 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (Darwin): fixed bug with static build linking to dynamic library in /usr/lib etc instead of linking to static library earlier in search path. [Tcl Bug 956908] Removed obsolete references to Rhapsody. 2004-12-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updates for VC7 compatibility, fixing CFLAGS and LDFLAGS options, using better default -O levels. [Bug 1092952, 1091967] 2004-12-29 Joe English <jenglish@users.sourceforge.net> * tcl.m4: Do not use ${DBGX} suffix when building shared libraries [patch #1081595, TIP #34] 2004-09-07 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_CONFIG_CFLAGS): support eVC4 Win/CE builds 2004-08-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_INIT, TEA_PREFIX): update handling of exec_prefix to work around subdir configures since autoconf only propagates the prefix (not exec_prefix). 2004-07-23 Daniel Steffen <das@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Darwin section: brought inline with Tcl 8.5 HEAD config, removed core specific & obsolete settings. 2004-07-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_PATH_X): check in TK_DEFS for MAC_OSX_TK to see if we are compiling on Aqua. Add TEA_WINDOWINGSYSTEM var that reflects 'tk windowingsystem' value. 2004-07-16 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): force a threaded build when building against a threaded core. (CFLAGS_WARNING): Remove -Wconversion for gcc builds (TEA_CONFIG_CFLAGS): Reorder configure.in for better 64-bit build configuration, replacing EXTRA_CFLAGS with CFLAGS. [Bug #874058] Update to latest Tcl 8.5 head config settings. Call this TEA version 3.1. 2004-04-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): replace AC_TRY_RUN test with AC_TRY_COMPILE for the long vs. long long check. (kenny) 2004-04-26 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_TCL_64BIT_FLAGS): update against core tcl.m4 to define TCL_WIDE_INT_IS_LONG if 'using long'. 2004-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct Windows builds getting LDFLAGS info in MAKE_LIB 2004-02-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct TCL_INCLUDES for private headers on Windows - it doesn't need the eval. 2004-02-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: don't require TK_INCLUDES and TCL_INCLUDES to have the DIR_NATIVE vars defined when using private headers on unix. Allow $... to TEA_ADD_SOURCES for constructs like TEA_ADD_SOURCES([\$(WIN_OBJECTS)]), that allow the developer to place more in the Makefile.in. tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and CHECK on limits.h 2003-12-10 Jeff Hobbs <jeffh@ActiveState.com> * Makefile.in: added TEA_ADD_LIBS, TEA_ADD_INCLUDES and * configure: TEA_ADD_CFLAGS to configurable parameters with * configure.in: PKG_* equivs in the Makefile. This allows the * tclconfig/tcl.m4: user to worry less about actual magic VAR names. Corrected Makefile.in to note that TEA_ADD_TCL_SOURCES requires exact file names. 2003-12-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: updated OpenBSD support based on [Patch #775246] (cassoff) 2003-12-05 Jeff Hobbs <jeffh@ActiveState.com> * configure: * configure.in: * Makefile.in (VPATH): readd $(srcdir) to front of VPATH as the first part of VPATH can get chopped off. Change .c.$(OBJEXT) rule to .c.@OBJEXT@ to support more makes. * tclconfig/tcl.m4: add TEA_ADD_STUB_SOURCES to support libstub generation and TEA_ADD_TCL_SOURCES to replace RUNTIME_SOURCES as the way the user specifies library files. 2003-12-03 Jeff Hobbs <jeffh@ActiveState.com> * configure: Update of TEA spec to (hopefully) simplify * configure.in: some aspects of TEA by making use of more * Makefile.in: AC 2.5x features. Use PACKAGE_NAME (instead * generic/tclsample.c: of PACKAGE) and PACKAGE_VERSION (instead of * tclconfig/tcl.m4: VERSION) arguments to AC_INIT as the TEA package name and version. Provide a version argument to TEA_INIT - starting with 3.0. Drop all use of interior shell substs that older makefiles didn't like. Use PKG_* naming convention instead. Move specification of source files and public headers into configure.in with TEA_ADD_SOURCES and TEA_ADD_HEADERS. These will be munged during ./configure into the right obj file names (no $(SOURCES:.c=.obj) needed). There is almost nothing that should be touched in Makefile.in now for the developer. May want to add a TEA_ADD_TCL_SOURCES for the RUNTIME_SOURCES that remains. Use SHLID_LD_FLAGS (instead of SHLID_LDFLAGS) as Tcl does. Only specify the user requested LDFLAGS/CFLAGS in the Makefile, don't mention the _OPTIMIZE/_DEBUG variants. 2003-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: create a TEA_SETUP_COMPILER_CC the precedes the TEA_SETUP_COMPILER macro. They are split so the check for CC occurs before any use of CC. Also add AC_PROG_CPP to the compiler checks. 2003-10-06 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Updated for autoconf 2.5x prereq. Where TCL_WIDE_INT_TYPE would be __int64, defer to the code checks in tcl.h, which also handles TCL_LL_MODIFIER* properly. 2003-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct default setting of ARCH for WinCE builds. Correct \ escaping for CE sed macros. 2003-04-10 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: replace $(syscal) construct with older `syscall` for systems where sh != bash. 2003-04-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_WITH_CELIB): add --enable-wince and --with-celib options for Windows/CE compilation support. Requires the Microsoft eMbedded SDK and Keuchel's celib emulation layer. 2003-02-18 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): Make sure -lpthread gets passed on the link line when checking for the pthread_attr_setstacksize symbol. (dejong) * tcl.m4 (TEA_SETUP_COMPILER): added default calls to TEA_TCL_EARLY_FLAGS, TEA_TCL_64BIT_FLAGS, TEA_MISSING_POSIX_HEADERS and TEA_BUGGY_STRTOD. 2003-02-14 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: correct HP-UX ia64 --enable-64bit build flags 2003-01-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: check $prefix/lib as well as $exec_prefix/lib when looking for tcl|tkConfig.sh, as this check is done before we would set exec_prefix when the user does not define it. 2003-01-21 Mo DeJong <mdejong@users.sourceforge.net> * tcl.m4 (TEA_CONFIG_CFLAGS): Fix build support for mingw, the previous implementation would use VC++ when compiling with mingw gcc. Don't pass -fPIC since gcc always compiles pic code under win32. Change some hard coded cases of gcc to ${CC}. 2002-10-15 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: move the CFLAGS definition from TEA_ENABLE_SHARED to TEA_MAKE_LIB because setting too early confuses other AC_* macros. Correct the HP-11 SHLIB_LD_LIBS setting. * tcl.m4: add the CFLAGS definition into TEA_ENABLE_SHARED and make it pick up the env CFLAGS at configure time. 2002-10-09 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: add --enable-symbols=mem option to enable TCL_MEM_DEBUG. Improved AIX 64-bit build support, allow it on AIX-4 as well. Enable 64-bit HP-11 compilation with gcc. Enable 64-bit IRIX64-6 cc build support. Correct FreeBSD thread library linkage. Add OSF1 static build support. Improve SunOS-5 shared build SHLIB_LD macro. 2002-07-20 Zoran Vasiljevic <zoran@archiware.com> * tcl.m4: Added MINGW32 to list of systems checked for Windows build. Also, fixes some indentation issues with "--with-XXX" options. 2002-04-23 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_ENABLE_THREADS): added USE_THREAD_ALLOC define to use new threaded allocatory by default on Unix for Tcl 8.4. (TEA_CONFIG_CFLAGS): corrected LD_SEARCH_FLAGS for FreeBSD-3+. 2002-04-22 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4 (TEA_SETUP_COMPILER): removed call to AC_CYGWIN so that we can use autoconf 2.5x as well as 2.13. This prevents us from being able to warn against the use of cygwin gcc at configure time, but allows autoconf 2.5x, which is what is shipped with most newer systems. 2002-04-11 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: Enabled COFF as well as CV style debug info with --enable-symbols to allow Dr. Watson users to see function info. More info on debugging levels can be obtained at: http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp 2002-04-03 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: change all SC_* macros to TEA_*. The SC_ was for Scriptics, which is no more. TEA represents a better, independent prefix that won't need changing. Added preliminary mingw gcc support. [Patch #538772] Added TEA_PREFIX macro that handles defaulting the prefix and exec_prefix vars to those used by Tcl if none were specified. Added TEA_SETUP_COMPILER macro that encompasses the AC_PROG_CC check and several other basic AC_PROG checks needed for making executables. This greatly simplifies user's configure.in files. Collapsed AIX-5 defines into AIX-* with extra checks for doing the ELF stuff on AIX-5-ia64. Updated TEA_ENABLE_THREADS to take an optional arg to allow switching it on by default (for Thread) and add sanity checking to warn the user if configuring threads incompatibly. 2002-03-29 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made sure that SHLIB_LDFLAGS was set to LDFLAGS_DEFAULT. Removed --enable-64bit support for AIX-4 because it wasn't correct. Added -MT or -MD Windows linker switches to properly support symbols-enabled builds. 2002-03-28 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: called AC_MSG_ERROR when SC_TEA_INIT wasn't called first instead of calling it as that inlines it each time in shell code. Changed Windows CFLAGS_OPTIMIZE to use -O2 instead of -Oti. Noted TCL_LIB_VERSIONS_OK=nodots for Windows builds. A few changes to support itcl (and perhaps others): Added support for making your own stub libraries to SC_MAKE_LIB. New SC_PATH_CONFIG and SC_LOAD_CONFIG that take a package name arg and find that ${pkg}Config.sh file. itk uses this for itcl. 2002-03-27 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: made SC_LOAD_TKCONFIG recognize when working with a Tk build dir setup. Added EXTRA_CFLAGS and SHLIB_LD_LIBS substs to SC_CONFIG_CFLAGS. Added XLIBSW onto LIBS when it is defined. Remove TCL_LIBS from MAKE_LIB and correctly use SHLIB_LD_LIBS instead to not rely as much on tclConfig.sh cached info. Add TK_BIN_DIR to paths to find wish in SC_PROG_WISH. These move towards making TEA much more independent of *Config.sh. 2002-03-19 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: corrected forgotten (UN)SHARED_LIB_SUFFIX and SHLIB_SUFFIX defines for Win. (SC_PATH_X): made this only do the check on unix platforms. 2002-03-12 Jeff Hobbs <jeffh@ActiveState.com> * README.txt: updated to reflect fewer files 2002-03-06 Jeff Hobbs <jeffh@ActiveState.com> * config.guess (removed): * config.sub (removed): removed unnecessary files * installFile.tcl (removed): * mkinstalldirs (removed): these aren't really necessary for making TEA work * tcl.m4 (SC_PUBLIC_TCL_HEADERS, SC_PUBLIC_TK_HEADERS): don't check /usr(/local)/include for includes on Windows when not using gcc 2002-03-05 Jeff Hobbs <jeffh@ActiveState.com> * tcl.m4: added warnings on Windows, removed RELPATH define and added TCL_LIBS to MAKE_LIB macro. This import represents 2.0.0, or a new start at attempting to make TEA much easier for C extension developers. **** moved from tclpro project to core tcl project, **** **** renamed to 'tclconfig' **** 2001-03-15 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added updating of the modification time of the target file whether we overwrote it or decided that it hadn't changed. This was necessary for us to be able to determine whether or not a module install touched the file. 2001-03-08 Karl Lehenbauer <karl@procplace.com> * installFile.tcl: Added support for converting new-style (1.1+) Cygnus drive paths to Tcl-style. 2001-01-15 <brent.welch@interwoven.com> * tcl.m4: Added FreeBSD clause. 2001-01-03 <brent.welch@interwoven.com> * tcl.m4: Fixed typo in SC_LIB_SPEC where it is checking for exec-prefix. 2000-12-01 <brent.welch@interwoven.com> * tcl.m4: Concatenated most of the Ajuba acsite.m4 file so we don't need to modify the autoconf installation. * config.guess: * config.sub: * installFile.tcl: Added files from the itcl config subdirectory, which should go away. 2000-7-29 <welch@ajubasolutions.com> * Fixed the use of TCL_SRC_DIR and TK_SRC_DIR within TCL_PRIVATE_INCLUDES and TK_PRIVATE_INCLUDES to match their recent change from $(srcdir) to $(srcdir)/.. ���������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/tclconfig/install-sh��������������������������������������������������������������000755 �000765 �000000 �00000033054 12557751640 020352� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-04-20.01; # 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. -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;; -S) stripcmd="$stripprog $2" shift;; -t) dst_arg=$2 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 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/tclconfig/README.txt��������������������������������������������������������������000644 �000765 �000000 �00000001454 12557751640 020043� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������These files comprise the basic building blocks for a Tcl Extension Architecture (TEA) extension. For more information on TEA see: http://www.tcl.tk/doc/tea/ This package is part of the Tcl project at SourceForge, and latest sources should be available there: http://tcl.sourceforge.net/ This package is a freely available open source package. You can do virtually anything you like with it, such as modifying it, redistributing it, and selling it either in whole or in part. CONTENTS ======== The following is a short description of the files you will find in the sample extension. README.txt This file install-sh Program used for copying binaries and script files to their install locations. tcl.m4 Collection of Tcl autoconf macros. Included by a package's aclocal.m4 to define TEA_* macros. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/tclconfig/tcl.m4������������������������������������������������������������������000644 �000765 �000000 �00000404662 12557751640 017401� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tcl.m4 -- # # This file provides a set of autoconf macros to help TEA-enable # a Tcl extension. # # Copyright (c) 1999-2000 Ajuba Solutions. # Copyright (c) 2002-2005 ActiveState Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. AC_PREREQ(2.57) dnl TEA extensions pass us the version of TEA they think they dnl are compatible with (must be set in TEA_INIT below) dnl TEA_VERSION="3.9" # Possible values for key variables defined: # # TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') # TEA_PLATFORM - windows unix # #------------------------------------------------------------------------ # TEA_PATH_TCLCONFIG -- # # Locate the tclConfig.sh file and perform a sanity check on # the Tcl compile flags # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tcl=... # # Defines the following vars: # TCL_BIN_DIR Full path to the directory containing # the tclConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TCLCONFIG], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # # Ok, lets find the tcl configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tcl # if test x"${no_tcl}" = x ; then # we reset no_tcl in case something fails here no_tcl=true AC_ARG_WITH(tcl, AC_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), with_tclconfig="${withval}") AC_MSG_CHECKING([for Tcl configuration]) AC_CACHE_VAL(ac_cv_c_tclconfig,[ # First check to see if --with-tcl was specified. if test x"${with_tclconfig}" != x ; then case "${with_tclconfig}" in */tclConfig.sh ) if test -f "${with_tclconfig}"; then AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`" fi ;; esac if test -f "${with_tclconfig}/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" else AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) fi fi # then check for a private Tcl installation if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ../tcl \ `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tcl \ `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tcl \ `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tcl.framework/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tclconfig}" = x ; then for i in \ ${srcdir}/../tcl \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tclConfig.sh" ; then ac_cv_c_tclconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tclconfig}" = x ; then TCL_BIN_DIR="# no Tcl configs found" AC_MSG_ERROR([Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh]) else no_tcl= TCL_BIN_DIR="${ac_cv_c_tclconfig}" AC_MSG_RESULT([found ${TCL_BIN_DIR}/tclConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_PATH_TKCONFIG -- # # Locate the tkConfig.sh file # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-tk=... # # Defines the following vars: # TK_BIN_DIR Full path to the directory containing # the tkConfig.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_TKCONFIG], [ # # Ok, lets find the tk configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-tk # if test x"${no_tk}" = x ; then # we reset no_tk in case something fails here no_tk=true AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), with_tkconfig="${withval}") AC_MSG_CHECKING([for Tk configuration]) AC_CACHE_VAL(ac_cv_c_tkconfig,[ # First check to see if --with-tkconfig was specified. if test x"${with_tkconfig}" != x ; then case "${with_tkconfig}" in */tkConfig.sh ) if test -f "${with_tkconfig}"; then AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) with_tkconfig="`echo "${with_tkconfig}" | sed 's!/tkConfig\.sh$!!'`" fi ;; esac if test -f "${with_tkconfig}/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd "${with_tkconfig}"; pwd)`" else AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) fi fi # then check for a private Tk library if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ../tk \ `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../tk \ `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ ../../../tk \ `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi # on Darwin, check in Framework installation locations if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ `ls -d /Library/Frameworks 2>/dev/null` \ `ls -d /Network/Library/Frameworks 2>/dev/null` \ `ls -d /System/Library/Frameworks 2>/dev/null` \ ; do if test -f "$i/Tk.framework/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/Tk.framework; pwd)`" break fi done fi # check in a few common install locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # TEA specific: on Windows, check in common installation locations if test "${TEA_PLATFORM}" = "windows" \ -a x"${ac_cv_c_tkconfig}" = x ; then for i in `ls -d C:/Tcl/lib 2>/dev/null` \ `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \ ; do if test -f "$i/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i; pwd)`" break fi done fi # check in a few other private locations if test x"${ac_cv_c_tkconfig}" = x ; then for i in \ ${srcdir}/../tk \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do if test "${TEA_PLATFORM}" = "windows" \ -a -f "$i/win/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/win; pwd)`" break fi if test -f "$i/unix/tkConfig.sh" ; then ac_cv_c_tkconfig="`(cd $i/unix; pwd)`" break fi done fi ]) if test x"${ac_cv_c_tkconfig}" = x ; then TK_BIN_DIR="# no Tk configs found" AC_MSG_ERROR([Can't find Tk configuration definitions. Use --with-tk to specify a directory containing tkConfig.sh]) else no_tk= TK_BIN_DIR="${ac_cv_c_tkconfig}" AC_MSG_RESULT([found ${TK_BIN_DIR}/tkConfig.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_TCLCONFIG -- # # Load the tclConfig.sh file # # Arguments: # # Requires the following vars to be set: # TCL_BIN_DIR # # Results: # # Substitutes the following vars: # TCL_BIN_DIR # TCL_SRC_DIR # TCL_LIB_FILE #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for existence of ${TCL_BIN_DIR}/tclConfig.sh]) if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TCL_BIN_DIR}/tclConfig.sh" else AC_MSG_RESULT([could not find ${TCL_BIN_DIR}/tclConfig.sh]) fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" # If the TCL_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TCL_LIB_SPEC will be set to the value # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC # instead of TCL_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TCL_BIN_DIR}/Makefile" ; then TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}" TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}" TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tcl.framework installed in an arbitrary location. case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then for i in "`cd "${TCL_BIN_DIR}"; pwd`" \ "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}" break fi done fi if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}" TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TCL_DBGX substitution eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" AC_SUBST(TCL_VERSION) AC_SUBST(TCL_PATCH_LEVEL) AC_SUBST(TCL_BIN_DIR) AC_SUBST(TCL_SRC_DIR) AC_SUBST(TCL_LIB_FILE) AC_SUBST(TCL_LIB_FLAG) AC_SUBST(TCL_LIB_SPEC) AC_SUBST(TCL_STUB_LIB_FILE) AC_SUBST(TCL_STUB_LIB_FLAG) AC_SUBST(TCL_STUB_LIB_SPEC) AC_MSG_CHECKING([platform]) hold_cc=$CC; CC="$TCL_CC" AC_TRY_COMPILE(,[ #ifdef _WIN32 #error win32 #endif ], TEA_PLATFORM="unix", TEA_PLATFORM="windows" ) CC=$hold_cc AC_MSG_RESULT($TEA_PLATFORM) # The BUILD_$pkg is to define the correct extern storage class # handling when making this package AC_DEFINE_UNQUOTED(BUILD_${PACKAGE_NAME}, [], [Building extension source?]) # Do this here as we have fully defined TEA_PLATFORM now if test "${TEA_PLATFORM}" = "windows" ; then EXEEXT=".exe" CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp" fi # TEA specific: AC_SUBST(CLEANFILES) AC_SUBST(TCL_LIBS) AC_SUBST(TCL_DEFS) AC_SUBST(TCL_EXTRA_CFLAGS) AC_SUBST(TCL_LD_FLAGS) AC_SUBST(TCL_SHLIB_LD_LIBS) ]) #------------------------------------------------------------------------ # TEA_LOAD_TKCONFIG -- # # Load the tkConfig.sh file # # Arguments: # # Requires the following vars to be set: # TK_BIN_DIR # # Results: # # Sets the following vars that should be in tkConfig.sh: # TK_BIN_DIR #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_TKCONFIG], [ AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then AC_MSG_RESULT([loading]) . "${TK_BIN_DIR}/tkConfig.sh" else AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" # If the TK_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable TK_LIB_SPEC will be set to the value # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC # instead of TK_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. if test -f "${TK_BIN_DIR}/Makefile" ; then TK_LIB_SPEC="${TK_BUILD_LIB_SPEC}" TK_STUB_LIB_SPEC="${TK_BUILD_STUB_LIB_SPEC}" TK_STUB_LIB_PATH="${TK_BUILD_STUB_LIB_PATH}" elif test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use the libraries # from the framework at the given location so that linking works # against Tk.framework installed in an arbitrary location. case ${TK_DEFS} in *TK_FRAMEWORK*) if test -f "${TK_BIN_DIR}/${TK_LIB_FILE}"; then for i in "`cd "${TK_BIN_DIR}"; pwd`" \ "`cd "${TK_BIN_DIR}"/../..; pwd`"; do if test "`basename "$i"`" = "${TK_LIB_FILE}.framework"; then TK_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TK_LIB_FILE}" break fi done fi if test -f "${TK_BIN_DIR}/${TK_STUB_LIB_FILE}"; then TK_STUB_LIB_SPEC="-L` echo "${TK_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TK_STUB_LIB_FLAG}" TK_STUB_LIB_PATH="${TK_BIN_DIR}/${TK_STUB_LIB_FILE}" fi ;; esac fi # eval is required to do the TK_DBGX substitution eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" # TEA specific: Ensure windowingsystem is defined if test "${TEA_PLATFORM}" = "unix" ; then case ${TK_DEFS} in *MAC_OSX_TK*) AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) TEA_WINDOWINGSYSTEM="aqua" ;; *) TEA_WINDOWINGSYSTEM="x11" ;; esac elif test "${TEA_PLATFORM}" = "windows" ; then TEA_WINDOWINGSYSTEM="win32" fi AC_SUBST(TK_VERSION) AC_SUBST(TK_BIN_DIR) AC_SUBST(TK_SRC_DIR) AC_SUBST(TK_LIB_FILE) AC_SUBST(TK_LIB_FLAG) AC_SUBST(TK_LIB_SPEC) AC_SUBST(TK_STUB_LIB_FILE) AC_SUBST(TK_STUB_LIB_FLAG) AC_SUBST(TK_STUB_LIB_SPEC) # TEA specific: AC_SUBST(TK_LIBS) AC_SUBST(TK_XINCLUDES) ]) #------------------------------------------------------------------------ # TEA_PROG_TCLSH # Determine the fully qualified path name of the tclsh executable # in the Tcl build directory or the tclsh installed in a bin # directory. This macro will correctly determine the name # of the tclsh executable even if tclsh has not yet been # built in the build directory. The tclsh found is always # associated with a tclConfig.sh file. This tclsh should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # TCLSH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_TCLSH], [ AC_MSG_CHECKING([for tclsh]) if test -f "${TCL_BIN_DIR}/Makefile" ; then # tclConfig.sh is in Tcl build directory if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="${TCL_BIN_DIR}/tclsh" fi else # tclConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" else TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" fi list="`ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TCL_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${TCLSH_PROG}" ; then REAL_TCL_BIN_DIR="`cd "$i"; pwd`/" break fi done TCLSH_PROG="${REAL_TCL_BIN_DIR}${TCLSH_PROG}" fi AC_MSG_RESULT([${TCLSH_PROG}]) AC_SUBST(TCLSH_PROG) ]) #------------------------------------------------------------------------ # TEA_PROG_WISH # Determine the fully qualified path name of the wish executable # in the Tk build directory or the wish installed in a bin # directory. This macro will correctly determine the name # of the wish executable even if wish has not yet been # built in the build directory. The wish found is always # associated with a tkConfig.sh file. This wish should be used # only for running extension test cases. It should never be # or generation of files (like pkgIndex.tcl) at build time. # # Arguments: # none # # Results: # Substitutes the following vars: # WISH_PROG #------------------------------------------------------------------------ AC_DEFUN([TEA_PROG_WISH], [ AC_MSG_CHECKING([for wish]) if test -f "${TK_BIN_DIR}/Makefile" ; then # tkConfig.sh is in Tk build directory if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="${TK_BIN_DIR}/wish" fi else # tkConfig.sh is in install location if test "${TEA_PLATFORM}" = "windows"; then WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" else WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" fi list="`ls -d ${TK_BIN_DIR}/../bin 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/.. 2>/dev/null` \ `ls -d ${TK_PREFIX}/bin 2>/dev/null`" for i in $list ; do if test -f "$i/${WISH_PROG}" ; then REAL_TK_BIN_DIR="`cd "$i"; pwd`/" break fi done WISH_PROG="${REAL_TK_BIN_DIR}${WISH_PROG}" fi AC_MSG_RESULT([${WISH_PROG}]) AC_SUBST(WISH_PROG) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SHARED -- # # Allows the building of shared libraries # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-shared=yes|no # # Defines the following vars: # STATIC_BUILD Used for building import/export libraries # on Windows. # # Sets the following vars: # SHARED_BUILD Value of 1 or 0 #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SHARED], [ AC_MSG_CHECKING([how to build libraries]) AC_ARG_ENABLE(shared, AC_HELP_STRING([--enable-shared], [build and link with shared libraries (default: on)]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_shared+set}" = set; then enableval="$enable_shared" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" ; then AC_MSG_RESULT([shared]) SHARED_BUILD=1 else AC_MSG_RESULT([static]) SHARED_BUILD=0 AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) fi AC_SUBST(SHARED_BUILD) ]) #------------------------------------------------------------------------ # TEA_ENABLE_THREADS -- # # Specify if thread support should be enabled. If "yes" is specified # as an arg (optional), threads are enabled by default, "no" means # threads are disabled. "yes" is the default. # # TCL_THREADS is checked so that if you are compiling an extension # against a threaded core, your extension must be compiled threaded # as well. # # Note that it is legal to have a thread enabled extension run in a # threaded or non-threaded Tcl core, but a non-threaded extension may # only run in a non-threaded Tcl core. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-threads # # Sets the following vars: # THREADS_LIBS Thread library(s) # # Defines the following vars: # TCL_THREADS # _REENTRANT # _THREAD_SAFE #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_THREADS], [ AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [build with threads]), [tcl_ok=$enableval], [tcl_ok=yes]) if test "${enable_threads+set}" = set; then enableval="$enable_threads" tcl_ok=$enableval else tcl_ok=yes fi if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then TCL_THREADS=1 if test "${TEA_PLATFORM}" != "windows" ; then # We are always OK on Windows, so check what this platform wants: # USE_THREAD_ALLOC tells us to try the special thread-based # allocator that significantly reduces lock contention AC_DEFINE(USE_THREAD_ALLOC, 1, [Do we want to use the threaded memory allocator?]) AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) if test "`uname -s`" = "SunOS" ; then AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) fi AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) if test "$tcl_ok" = "no"; then # Check a little harder for __pthread_mutex_init in the same # library, as some systems hide it there until pthread.h is # defined. We could alternatively do an AC_TRY_COMPILE with # pthread.h, but that will work with libpthread really doesn't # exist, like AIX 4.2. [Bug: 4359] AC_CHECK_LIB(pthread, __pthread_mutex_init, tcl_ok=yes, tcl_ok=no) fi if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthread" else AC_CHECK_LIB(pthreads, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -lpthreads" else AC_CHECK_LIB(c, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "no"; then AC_CHECK_LIB(c_r, pthread_mutex_init, tcl_ok=yes, tcl_ok=no) if test "$tcl_ok" = "yes"; then # The space is needed THREADS_LIBS=" -pthread" else TCL_THREADS=0 AC_MSG_WARN([Do not know how to find pthread lib on your system - thread support disabled]) fi fi fi fi fi else TCL_THREADS=0 fi # Do checking message here to not mess up interleaved configure output AC_MSG_CHECKING([for building with threads]) if test "${TCL_THREADS}" = 1; then AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) AC_MSG_RESULT([yes (default)]) else AC_MSG_RESULT([no]) fi # TCL_THREADS sanity checking. See if our request for building with # threads is the same as the way Tcl was built. If not, warn the user. case ${TCL_DEFS} in *THREADS=1*) if test "${TCL_THREADS}" = "0"; then AC_MSG_WARN([ Building ${PACKAGE_NAME} without threads enabled, but building against Tcl that IS thread-enabled. It is recommended to use --enable-threads.]) fi ;; *) if test "${TCL_THREADS}" = "1"; then AC_MSG_WARN([ --enable-threads requested, but building against a Tcl that is NOT thread-enabled. This is an OK configuration that will also run in a thread-enabled core.]) fi ;; esac AC_SUBST(TCL_THREADS) ]) #------------------------------------------------------------------------ # TEA_ENABLE_SYMBOLS -- # # Specify if debugging symbols should be used. # Memory (TCL_MEM_DEBUG) debugging can also be enabled. # # Arguments: # none # # TEA varies from core Tcl in that C|LDFLAGS_DEFAULT receives # the value of C|LDFLAGS_OPTIMIZE|DEBUG already substituted. # Requires the following vars to be set in the Makefile: # CFLAGS_DEFAULT # LDFLAGS_DEFAULT # # Results: # # Adds the following arguments to configure: # --enable-symbols # # Defines the following vars: # CFLAGS_DEFAULT Sets to $(CFLAGS_DEBUG) if true # Sets to "$(CFLAGS_OPTIMIZE) -DNDEBUG" if false # LDFLAGS_DEFAULT Sets to $(LDFLAGS_DEBUG) if true # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_SYMBOLS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_CONFIG_CFLAGS]) AC_MSG_CHECKING([for build with symbols]) AC_ARG_ENABLE(symbols, AC_HELP_STRING([--enable-symbols], [build with debugging symbols (default: off)]), [tcl_ok=$enableval], [tcl_ok=no]) DBGX="" if test "$tcl_ok" = "no"; then CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE} -DNDEBUG" LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" AC_MSG_RESULT([no]) else CFLAGS_DEFAULT="${CFLAGS_DEBUG}" LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" if test "$tcl_ok" = "yes"; then AC_MSG_RESULT([yes (standard debugging)]) fi fi # TEA specific: if test "${TEA_PLATFORM}" != "windows" ; then LDFLAGS_DEFAULT="${LDFLAGS}" fi AC_SUBST(CFLAGS_DEFAULT) AC_SUBST(LDFLAGS_DEFAULT) AC_SUBST(TCL_DBGX) if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) fi if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then if test "$tcl_ok" = "all"; then AC_MSG_RESULT([enabled symbols mem debugging]) else AC_MSG_RESULT([enabled $tcl_ok debugging]) fi fi ]) #------------------------------------------------------------------------ # TEA_ENABLE_LANGINFO -- # # Allows use of modern nl_langinfo check for better l10n. # This is only relevant for Unix. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --enable-langinfo=yes|no (default is yes) # # Defines the following vars: # HAVE_LANGINFO Triggers use of nl_langinfo if defined. #------------------------------------------------------------------------ AC_DEFUN([TEA_ENABLE_LANGINFO], [ AC_ARG_ENABLE(langinfo, AC_HELP_STRING([--enable-langinfo], [use nl_langinfo if possible to determine encoding at startup, otherwise use old heuristic (default: on)]), [langinfo_ok=$enableval], [langinfo_ok=yes]) HAVE_LANGINFO=0 if test "$langinfo_ok" = "yes"; then AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) fi AC_MSG_CHECKING([whether to use nl_langinfo]) if test "$langinfo_ok" = "yes"; then AC_CACHE_VAL(tcl_cv_langinfo_h, [ AC_TRY_COMPILE([#include <langinfo.h>], [nl_langinfo(CODESET);], [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])]) AC_MSG_RESULT([$tcl_cv_langinfo_h]) if test $tcl_cv_langinfo_h = yes; then AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) fi else AC_MSG_RESULT([$langinfo_ok]) fi ]) #-------------------------------------------------------------------- # TEA_CONFIG_SYSTEM # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the # "uname" command. # # Arguments: # none # # Results: # Defines the following var: # # system - System/platform/version identification code. #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ # TEA specific: if test "${TEA_PLATFORM}" = "windows" ; then tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi fi fi ]) system=$tcl_cv_sys_version ]) #-------------------------------------------------------------------- # TEA_CONFIG_CFLAGS # # Try to determine the proper flags to pass to the compiler # for building shared libraries and other such nonsense. # # Arguments: # none # # Results: # # Defines and substitutes the following vars: # # DL_OBJS, DL_LIBS - removed for TEA, only needed by core. # LDFLAGS - Flags to pass to the compiler when linking object # files into an executable application binary such # as tclsh. # LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. Could # be the same as CC_SEARCH_FLAGS if ${CC} is used to link. # CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib", # that tell the run-time dynamic linker where to look # for shared libraries such as libtcl.so. Depends on # the variable LIB_RUNTIME_DIR in the Makefile. # SHLIB_CFLAGS - Flags to pass to cc when compiling the components # of a shared library (may request position-independent # code, among other things). # SHLIB_LD - Base command to use for combining object files # into a shared library. # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build # shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If # dependent libraries should not be specified (as on # SunOS 4.x, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. # SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable # extensions. An empty string means we don't know how # to use shared libraries on this platform. # LIB_SUFFIX - Specifies everything that comes after the "libfoo" # in a static or shared library name, using the $PACKAGE_VERSION variable # to put the version in the right place. This is used # by platforms that need non-standard library names. # Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, since it needs # to have a version after the .so, and ${PACKAGE_VERSION}.a # on AIX, since a shared library needs to have # a .a extension whereas shared objects for loadable # extensions have a .so extension. Defaults to # ${PACKAGE_VERSION}${SHLIB_SUFFIX}. # CFLAGS_DEBUG - # Flags used when running the compiler in debug mode # CFLAGS_OPTIMIZE - # Flags used when running the compiler in optimize mode # CFLAGS - Additional CFLAGS added as necessary (usually 64-bit) #-------------------------------------------------------------------- AC_DEFUN([TEA_CONFIG_CFLAGS], [ dnl TEA specific: Make sure we are initialized AC_REQUIRE([TEA_INIT]) # Step 0.a: Enable 64 bit support? AC_MSG_CHECKING([if 64bit support is requested]) AC_ARG_ENABLE(64bit, AC_HELP_STRING([--enable-64bit], [enable 64bit support (default: off)]), [do64bit=$enableval], [do64bit=no]) AC_MSG_RESULT([$do64bit]) # Step 0.b: Enable Solaris 64 bit VIS support? AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) AC_ARG_ENABLE(64bit-vis, AC_HELP_STRING([--enable-64bit-vis], [enable 64bit Sparc VIS support (default: off)]), [do64bitVIS=$enableval], [do64bitVIS=no]) AC_MSG_RESULT([$do64bitVIS]) # Force 64bit on with VIS AS_IF([test "$do64bitVIS" = "yes"], [do64bit=yes]) # Step 0.c: Check if visibility support is available. Do this here so # that platform specific alternatives can be used below if this fails. AC_CACHE_CHECK([if compiler supports visibility "hidden"], tcl_cv_cc_visibility_hidden, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror" AC_TRY_LINK([ extern __attribute__((__visibility__("hidden"))) void f(void); void f(void) {}], [f();], tcl_cv_cc_visibility_hidden=yes, tcl_cv_cc_visibility_hidden=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_visibility_hidden = yes], [ AC_DEFINE(MODULE_SCOPE, [extern __attribute__((__visibility__("hidden")))], [Compiler support for module scope symbols]) AC_DEFINE(HAVE_HIDDEN, [1], [Compiler support for module scope symbols]) ]) # Step 0.d: Disable -rpath support? AC_MSG_CHECKING([if rpath support is requested]) AC_ARG_ENABLE(rpath, AC_HELP_STRING([--disable-rpath], [disable rpath support (default: on)]), [doRpath=$enableval], [doRpath=yes]) AC_MSG_RESULT([$doRpath]) # TEA specific: Cross-compiling options for Windows/CE builds? AS_IF([test "${TEA_PLATFORM}" = windows], [ AC_MSG_CHECKING([if Windows/CE build is requested]) AC_ARG_ENABLE(wince, AC_HELP_STRING([--enable-wince], [enable Win/CE support (where applicable)]), [doWince=$enableval], [doWince=no]) AC_MSG_RESULT([$doWince]) ]) # Set the variable "system" to hold the name and version number # for the system. TEA_CONFIG_SYSTEM # Require ranlib early so we can override it in special cases below. AC_REQUIRE([AC_PROG_RANLIB]) # Set configuration options based on system name and version. # This is similar to Tcl's unix/tcl.m4 except that we've added a # "windows" case and removed some core-only vars. do64bit_ok=no # default to '{$LIBS}' and set to "" on per-platform necessary basis SHLIB_LD_LIBS='${LIBS}' # When ld needs options to work in 64-bit mode, put them in # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load] # is disabled by the user. [Bug 1016796] LDFLAGS_ARCH="" UNSHARED_LIB_SUFFIX="" # TEA specific: use PACKAGE_VERSION instead of VERSION TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' ECHO_VERSION='`echo ${PACKAGE_VERSION}`' TCL_LIB_VERSIONS_OK=ok CFLAGS_DEBUG=-g AS_IF([test "$GCC" = yes], [ CFLAGS_OPTIMIZE=-O2 CFLAGS_WARNING="-Wall" ], [ CFLAGS_OPTIMIZE=-O CFLAGS_WARNING="" ]) AC_CHECK_TOOL(AR, ar) STLIB_LD='${AR} cr' LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" AS_IF([test "x$SHLIB_VERSION" = x],[SHLIB_VERSION="1.0"]) case $system in # TEA specific: windows) # This is a 2-stage check to make sure we have the 64-bit SDK # We have to know where the SDK is installed. # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs # MACHINE is IX86 for LINK, but this is used by the manifest, # which requires x86|amd64|ia64. MACHINE="X86" if test "$do64bit" != "no" ; then if test "x${MSSDK}x" = "xx" ; then MSSDK="C:/Progra~1/Microsoft Platform SDK" fi MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` PATH64="" case "$do64bit" in amd64|x64|yes) MACHINE="AMD64" ; # default to AMD64 64-bit build PATH64="${MSSDK}/Bin/Win64/x86/AMD64" ;; ia64) MACHINE="IA64" PATH64="${MSSDK}/Bin/Win64" ;; esac if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) AC_MSG_WARN([Ensure latest Platform SDK is installed]) do64bit="no" else AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) do64bit_ok="yes" fi fi if test "$doWince" != "no" ; then if test "$do64bit" != "no" ; then AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) fi if test "$GCC" = "yes" ; then AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) fi TEA_PATH_CELIB # Set defaults for common evc4/PPC2003 setup # Currently Tcl requires 300+, possibly 420+ for sockets CEVERSION=420; # could be 211 300 301 400 420 ... TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... ARCH=ARM; # could be ARM MIPS X86EM ... PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" if test "$doWince" != "yes"; then # If !yes then the user specified something # Reset ARCH to allow user to skip specifying it ARCH= eval `echo $doWince | awk -F, '{ \ if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ }'` if test "x${ARCH}" = "x" ; then ARCH=$TARGETCPU; fi fi OSVERSION=WCE$CEVERSION; if test "x${WCEROOT}" = "x" ; then WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" if test ! -d "${WCEROOT}" ; then WCEROOT="C:/Program Files/Microsoft eMbedded Tools" fi fi if test "x${SDKROOT}" = "x" ; then SDKROOT="C:/Program Files/Windows CE Tools" if test ! -d "${SDKROOT}" ; then SDKROOT="C:/Windows CE Tools" fi fi WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) doWince="no" else # We could PATH_NOSPACE these, but that's not important, # as long as we quote them when used. CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" if test -d "${CEINCLUDE}/${TARGETCPU}" ; then CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" fi CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" fi fi if test "$GCC" != "yes" ; then if test "${SHARED_BUILD}" = "0" ; then runtime=-MT else runtime=-MD fi if test "$do64bit" != "no" ; then # All this magic is necessary for the Win64 SDK RC1 - hobbs CC="\"${PATH64}/cl.exe\"" CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" RC="\"${MSSDK}/bin/rc.exe\"" lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" LINKBIN="\"${PATH64}/link.exe\"" CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" # Avoid 'unresolved external symbol __security_cookie' # errors, c.f. http://support.microsoft.com/?id=894573 TEA_ADD_LIBS([bufferoverflowU.lib]) elif test "$doWince" != "no" ; then CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" if test "${TARGETCPU}" = "X86"; then CC="\"${CEBINROOT}/cl.exe\"" else CC="\"${CEBINROOT}/cl${ARCH}.exe\"" fi CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" if test "${SHARED_BUILD}" = "1" ; then # Static CE builds require static celib as well defs="${defs} _DLL" fi for i in $defs ; do AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) done AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) CFLAGS_DEBUG="-nologo -Zi -Od" CFLAGS_OPTIMIZE="-nologo -Ox" lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" LINKBIN="\"${CEBINROOT}/link.exe\"" AC_SUBST(CELIB_DIR) else RC="rc" lflags="-nologo" LINKBIN="link" CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" fi fi if test "$GCC" = "yes"; then # mingw gcc mode AC_CHECK_TOOL(RC, windres) CFLAGS_DEBUG="-g" CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" SHLIB_LD='${CC} -shared' UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" AC_CACHE_CHECK(for cross-compile version of gcc, ac_cv_cross, AC_TRY_COMPILE([ #ifdef __WIN32__ #error cross-compiler #endif ], [], ac_cv_cross=yes, ac_cv_cross=no) ) if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) CC="x86_64-w64-mingw32-gcc" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) CC="i686-w64-mingw32-gcc" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" RC="i686-w64-mingw32-windres" ;; esac fi else SHLIB_LD="${LINKBIN} -dll ${lflags}" # link -lib only works when -lib is the first arg STLIB_LD="${LINKBIN} -lib ${lflags}" UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' PATHTYPE=-w # For information on what debugtype is most useful, see: # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp # and also # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx # This essentially turns it all on. LDFLAGS_DEBUG="-debug -debugtype:cv" LDFLAGS_OPTIMIZE="-release" if test "$doWince" != "no" ; then LDFLAGS_CONSOLE="-link ${lflags}" LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} else LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" fi fi SHLIB_SUFFIX=".dll" SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' TCL_LIB_VERSIONS_OK=nodots ;; AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ # AIX requires the _r compiler when gcc isn't being used case "${CC}" in *_r|*_r\ *) # ok ... ;; *) # Make sure only first arg gets _r CC=`echo "$CC" | sed -e 's/^\([[^ ]]*\)/\1_r/'` ;; esac AC_MSG_RESULT([Using $CC for compiling with threads]) ]) LIBS="$LIBS -lc" SHLIB_CFLAGS="" SHLIB_SUFFIX=".so" LD_LIBRARY_PATH_VAR="LIBPATH" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported with GCC on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -q64" LDFLAGS_ARCH="-q64" RANLIB="${RANLIB} -X64" AR="${AR} -X64" SHLIB_LD_FLAGS="-b64" ]) ]) AS_IF([test "`uname -m`" = ia64], [ # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC SHLIB_LD="/usr/ccs/bin/ld -G -z text" AS_IF([test "$GCC" = yes], [ CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' ], [ CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' ]) LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ], [ AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared -Wl,-bexpall' ], [ SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry" LDFLAGS="$LDFLAGS -brtl" ]) SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}" CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; BeOS*) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -nostart' SHLIB_SUFFIX=".so" #----------------------------------------------------------- # Check for inet_ntoa in -lbind, for BeOS (which also needs # -lsocket, even if the network functions are in -lnet which # is always linked to, for compatibility. #----------------------------------------------------------- AC_CHECK_LIB(bind, inet_ntoa, [LIBS="$LIBS -lbind -lsocket"]) ;; BSD/OS-4.*) SHLIB_CFLAGS="-export-dynamic -fPIC" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; CYGWIN_*) SHLIB_CFLAGS="" SHLIB_LD='${CC} -shared' SHLIB_SUFFIX=".dll" EXEEXT=".exe" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; Haiku*) LDFLAGS="$LDFLAGS -Wl,--export-dynamic" SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' AC_CHECK_LIB(network, inet_ntoa, [LIBS="$LIBS -lnetwork"]) ;; HP-UX-*.11.*) # Use updated header definitions where possible AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) # TEA specific: Needed by Tcl, but not most extensions #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?]) #LIBS="$LIBS -lxnet" # Use the XOPEN network library AS_IF([test "`uname -m`" = ia64], [ SHLIB_SUFFIX=".so" # Use newer C++ library for C++ extensions #if test "$GCC" != "yes" ; then # CPPFLAGS="-AA" #fi ], [ SHLIB_SUFFIX=".sl" ]) AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) AS_IF([test "$tcl_ok" = yes], [ LDFLAGS="$LDFLAGS -Wl,-E" CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' LD_LIBRARY_PATH_VAR="SHLIB_PATH" ]) AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ CFLAGS="$CFLAGS -z" # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc #CFLAGS="$CFLAGS +DAportable" SHLIB_CFLAGS="+z" SHLIB_LD="ld -b" ]) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = "yes"], [ AS_IF([test "$GCC" = yes], [ case `${CC} -dumpmachine` in hppa64*) # 64-bit gcc in use. Fix flags for GNU ld. do64bit_ok=yes SHLIB_LD='${CC} -shared' AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ;; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]) ;; esac ], [ do64bit_ok=yes CFLAGS="$CFLAGS +DD64" LDFLAGS_ARCH="+DD64" ]) ]) ;; IRIX-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [ CFLAGS="$CFLAGS -mabi=n32" LDFLAGS="$LDFLAGS -mabi=n32" ], [ case $system in IRIX-6.3) # Use to build 6.2 compatible binaries on 6.3. CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" ;; *) CFLAGS="$CFLAGS -n32" ;; esac LDFLAGS="$LDFLAGS -n32" ]) ;; IRIX64-6.*) SHLIB_CFLAGS="" SHLIB_LD="ld -n32 -shared -rdata_shared" SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ AS_IF([test "$GCC" = yes], [ AC_MSG_WARN([64bit mode not supported by gcc]) ], [ do64bit_ok=yes SHLIB_LD="ld -64 -shared -rdata_shared" CFLAGS="$CFLAGS -64" LDFLAGS_ARCH="-64" ]) ]) ;; Linux*|GNU*|NetBSD-Debian) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" # TEA specific: CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}' LDFLAGS="$LDFLAGS -Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "`uname -m`" = "alpha"], [CFLAGS="$CFLAGS -mieee"]) AS_IF([test $do64bit = yes], [ AC_CACHE_CHECK([if compiler accepts -m64 flag], tcl_cv_cc_m64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -m64" AC_TRY_LINK(,, tcl_cv_cc_m64=yes, tcl_cv_cc_m64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_m64 = yes], [ CFLAGS="$CFLAGS -m64" do64bit_ok=yes ]) ]) # The combo of gcc + glibc has a bug related to inlining of # functions like strtod(). The -fno-builtin flag should address # this problem but it does not work. The -fno-inline flag is kind # of overkill but it works. Disable inlining only when one of the # files in compat/*.c is being linked in. AS_IF([test x"${USE_COMPAT}" != x],[CFLAGS="$CFLAGS -fno-inline"]) ;; Lynx*) SHLIB_CFLAGS="-fPIC" SHLIB_SUFFIX=".so" CFLAGS_OPTIMIZE=-02 SHLIB_LD='${CC} -shared' LD_FLAGS="-Wl,--export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; OpenBSD-*) arch=`arch -s` case "$arch" in vax) SHLIB_SUFFIX="" SHARED_LIB_SUFFIX="" LDFLAGS="" ;; *) SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' LDFLAGS="-Wl,-export-dynamic" ;; esac case "$arch" in vax) CFLAGS_OPTIMIZE="-O1" ;; *) CFLAGS_OPTIMIZE="-O2" ;; esac AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread LIBS=`echo $LIBS | sed s/-lpthread//` CFLAGS="$CFLAGS -pthread" ]) # OpenBSD doesn't do version numbers with dots. UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' TCL_LIB_VERSIONS_OK=nodots ;; NetBSD-*) # NetBSD has ELF and can use 'cc -shared' to build shared libs SHLIB_CFLAGS="-fPIC" SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' SHLIB_SUFFIX=".so" LDFLAGS="$LDFLAGS -export-dynamic" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the CFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ;; FreeBSD-*) # This configuration from FreeBSD Ports. SHLIB_CFLAGS="-fPIC" SHLIB_LD="${CC} -shared" TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$[@]" SHLIB_SUFFIX=".so" LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) AS_IF([test "${TCL_THREADS}" = "1"], [ # The -pthread needs to go in the LDFLAGS, not LIBS LIBS=`echo $LIBS | sed s/-pthread//` CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_LIBS"]) # Version numbers are dot-stripped by system policy. TCL_TRIM_DOTS=`echo ${PACKAGE_VERSION} | tr -d .` UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1' TCL_LIB_VERSIONS_OK=nodots ;; Darwin-*) CFLAGS_OPTIMIZE="-Os" SHLIB_CFLAGS="-fno-common" # To avoid discrepancies between what headers configure sees during # preprocessing tests and compiling tests, move any -isysroot and # -mmacosx-version-min flags from CFLAGS to CPPFLAGS: CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if ([$]i~/^(isysroot|mmacosx-version-min)/) print "-"[$]i}'`" CFLAGS="`echo " ${CFLAGS}" | \ awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \ if (!([$]i~/^(isysroot|mmacosx-version-min)/)) print "-"[$]i}'`" AS_IF([test $do64bit = yes], [ case `arch` in ppc) AC_CACHE_CHECK([if compiler accepts -arch ppc64 flag], tcl_cv_cc_arch_ppc64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" AC_TRY_LINK(,, tcl_cv_cc_arch_ppc64=yes, tcl_cv_cc_arch_ppc64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_ppc64 = yes], [ CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" do64bit_ok=yes ]);; i386) AC_CACHE_CHECK([if compiler accepts -arch x86_64 flag], tcl_cv_cc_arch_x86_64, [ hold_cflags=$CFLAGS CFLAGS="$CFLAGS -arch x86_64" AC_TRY_LINK(,, tcl_cv_cc_arch_x86_64=yes, tcl_cv_cc_arch_x86_64=no) CFLAGS=$hold_cflags]) AS_IF([test $tcl_cv_cc_arch_x86_64 = yes], [ CFLAGS="$CFLAGS -arch x86_64" do64bit_ok=yes ]);; *) AC_MSG_WARN([Don't know how enable 64-bit on architecture `arch`]);; esac ], [ # Check for combined 32-bit and 64-bit fat build AS_IF([echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \ && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '], [ fat_32_64=yes]) ]) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_single_module = yes], [ SHLIB_LD="${SHLIB_LD} -Wl,-single_module" ]) # TEA specific: link shlib with current and compatibility version flags vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([[0-9]]\{1,5\}\)\(\(\.[[0-9]]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d` SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}" SHLIB_SUFFIX=".dylib" # Don't use -prebind when building for Mac OS X 10.4 or later only: AS_IF([test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int([$]2)}'`" -lt 4 -a \ "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int([$]2)}'`" -lt 4], [ LDFLAGS="$LDFLAGS -prebind"]) LDFLAGS="$LDFLAGS -headerpad_max_install_names" AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-search_paths_first" AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_search_paths_first = yes], [ LDFLAGS="$LDFLAGS -Wl,-search_paths_first" ]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" # TEA specific: for combined 32 & 64 bit fat builds of Tk # extensions, verify that 64-bit build is possible. AS_IF([test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"], [ AS_IF([test "${TEA_WINDOWINGSYSTEM}" = x11], [ AC_CACHE_CHECK([for 64-bit X11], tcl_cv_lib_x11_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include" LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11" AC_TRY_LINK([#include <X11/Xlib.h>], [XrmInitialize();], tcl_cv_lib_x11_64=yes, tcl_cv_lib_x11_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) AS_IF([test "${TEA_WINDOWINGSYSTEM}" = aqua], [ AC_CACHE_CHECK([for 64-bit Tk], tcl_cv_lib_tk_64, [ for v in CFLAGS CPPFLAGS LDFLAGS; do eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"' done CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}" LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}" AC_TRY_LINK([#include <tk.h>], [Tk_InitStubs(NULL, "", 0);], tcl_cv_lib_tk_64=yes, tcl_cv_lib_tk_64=no) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="$hold_'$v'"' done]) ]) # remove 64-bit arch flags from CFLAGS et al. if configuration # does not support 64-bit. AS_IF([test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no], [ AC_MSG_NOTICE([Removing 64-bit architectures from compiler & linker flags]) for v in CFLAGS CPPFLAGS LDFLAGS; do eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"' done]) ]) ;; OS/390-*) CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" AS_IF([test "$SHARED_BUILD" = 1], [ SHLIB_LD='ld -shared -expect_unresolved "*"' ], [ SHLIB_LD='ld -non_shared -expect_unresolved "*"' ]) SHLIB_SUFFIX=".so" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}']) AS_IF([test "$GCC" = yes], [CFLAGS="$CFLAGS -mieee"], [ CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"]) # see pthread_intro(3) for pthread support on osf1, k.furukawa AS_IF([test "${TCL_THREADS}" = 1], [ CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" LIBS=`echo $LIBS | sed s/-lpthreads//` AS_IF([test "$GCC" = yes], [ LIBS="$LIBS -lpthread -lmach -lexc" ], [ CFLAGS="$CFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ]) ]) ;; QNX-6*) # QNX RTP # This may work for all QNX, but it was only reported for v6. SHLIB_CFLAGS="-fPIC" SHLIB_LD="ld -Bshareable -x" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SCO_SV-3.2*) AS_IF([test "$GCC" = yes], [ SHLIB_CFLAGS="-fPIC -melf" LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" ], [ SHLIB_CFLAGS="-Kpic -belf" LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" ]) SHLIB_LD="ld -G" SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ], [ SHLIB_LD="/usr/ccs/bin/ld -G -z text" CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} ]) ;; SunOS-5*) # Note: If _REENTRANT isn't defined, then Solaris # won't define thread-safe library routines. AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Do we really want to follow the standard? Yes we do!]) SHLIB_CFLAGS="-KPIC" # Check to enable 64-bit flags for compiler/linker AS_IF([test "$do64bit" = yes], [ arch=`isainfo` AS_IF([test "$arch" = "sparcv9 sparc"], [ AS_IF([test "$GCC" = yes], [ AS_IF([test "`${CC} -dumpversion | awk -F. '{print [$]1}'`" -lt 3], [ AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) ], [ do64bit_ok=yes CFLAGS="$CFLAGS -m64 -mcpu=v9" LDFLAGS="$LDFLAGS -m64 -mcpu=v9" SHLIB_CFLAGS="-fPIC" ]) ], [ do64bit_ok=yes AS_IF([test "$do64bitVIS" = yes], [ CFLAGS="$CFLAGS -xarch=v9a" LDFLAGS_ARCH="-xarch=v9a" ], [ CFLAGS="$CFLAGS -xarch=v9" LDFLAGS_ARCH="-xarch=v9" ]) # Solaris 64 uses this as well #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" ]) ], [AS_IF([test "$arch" = "amd64 i386"], [ AS_IF([test "$GCC" = yes], [ case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) do64bit_ok=yes CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) AC_MSG_WARN([64bit mode not supported with GCC on $system]);; esac ], [ do64bit_ok=yes case $system in SunOS-5.1[[1-9]]*|SunOS-5.[[2-9]][[0-9]]*) CFLAGS="$CFLAGS -m64" LDFLAGS="$LDFLAGS -m64";; *) CFLAGS="$CFLAGS -xarch=amd64" LDFLAGS="$LDFLAGS -xarch=amd64";; esac ]) ], [AC_MSG_WARN([64bit mode not supported for $arch])])]) ]) SHLIB_SUFFIX=".so" AS_IF([test "$GCC" = yes], [ SHLIB_LD='${CC} -shared' CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} AS_IF([test "$do64bit_ok" = yes], [ AS_IF([test "$arch" = "sparcv9 sparc"], [ # We need to specify -static-libgcc or we need to # add the path to the sparv9 libgcc. # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" # for finding sparcv9 libgcc, get the regular libgcc # path, remove so name and append 'sparcv9' #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir" ], [AS_IF([test "$arch" = "amd64 i386"], [ # JH: static-libgcc is necessary for core Tcl, but may # not be necessary for extensions. SHLIB_LD="$SHLIB_LD -m64 -static-libgcc" ])]) ]) ], [ case $system in SunOS-5.[[1-9]][[0-9]]*) # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';; *) SHLIB_LD='/usr/ccs/bin/ld -G -z text';; esac CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' ]) ;; UNIX_SV* | UnixWare-5*) SHLIB_CFLAGS="-KPIC" SHLIB_LD='${CC} -G' SHLIB_LD_LIBS="" SHLIB_SUFFIX=".so" # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers # that don't grok the -Bexport option. Test that it does. AC_CACHE_CHECK([for ld accepts -Bexport flag], tcl_cv_ld_Bexport, [ hold_ldflags=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-Bexport" AC_TRY_LINK(, [int i;], tcl_cv_ld_Bexport=yes, tcl_cv_ld_Bexport=no) LDFLAGS=$hold_ldflags]) AS_IF([test $tcl_cv_ld_Bexport = yes], [ LDFLAGS="$LDFLAGS -Wl,-Bexport" ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; esac AS_IF([test "$do64bit" = yes -a "$do64bit_ok" = no], [ AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) ]) dnl # Add any CPPFLAGS set in the environment to our CFLAGS, but delay doing so dnl # until the end of configure, as configure's compile and link tests use dnl # both CPPFLAGS and CFLAGS (unlike our compile and link) but configure's dnl # preprocessing tests use only CPPFLAGS. AC_CONFIG_COMMANDS_PRE([CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS=""]) # Add in the arch flags late to ensure it wasn't removed. # Not necessary in TEA, but this is aligned with core LDFLAGS="$LDFLAGS $LDFLAGS_ARCH" # If we're running gcc, then change the C flags for compiling shared # libraries to the right flags for gcc, instead of those for the # standard manufacturer compiler. AS_IF([test "$GCC" = yes], [ case $system in AIX-*) ;; BSD/OS*) ;; CYGWIN_*|MINGW32_*) ;; IRIX*) ;; NetBSD-*|FreeBSD-*|OpenBSD-*) ;; Darwin-*) ;; SCO_SV-3.2*) ;; windows) ;; *) SHLIB_CFLAGS="-fPIC" ;; esac]) AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [extern], [No Compiler support for module scope symbols]) ]) AS_IF([test "$SHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}']) AS_IF([test "$UNSHARED_LIB_SUFFIX" = ""], [ # TEA specific: use PACKAGE_VERSION instead of VERSION UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a']) if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then AC_CACHE_CHECK(for SEH support in compiler, tcl_cv_seh, AC_TRY_RUN([ #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN int main(int argc, char** argv) { int a, b = 0; __try { a = 666 / b; } __except (EXCEPTION_EXECUTE_HANDLER) { return 0; } return 1; } ], tcl_cv_seh=yes, tcl_cv_seh=no, tcl_cv_seh=no) ) if test "$tcl_cv_seh" = "no" ; then AC_DEFINE(HAVE_NO_SEH, 1, [Defined when mingw does not support SEH]) fi # # Check to see if the excpt.h include file provided contains the # definition for EXCEPTION_DISPOSITION; if not, which is the case # with Cygwin's version as of 2002-04-10, define it to be int, # sufficient for getting the current code to work. # AC_CACHE_CHECK(for EXCEPTION_DISPOSITION support in include files, tcl_cv_eh_disposition, AC_TRY_COMPILE([ # define WIN32_LEAN_AND_MEAN # include <windows.h> # undef WIN32_LEAN_AND_MEAN ],[ EXCEPTION_DISPOSITION x; ], tcl_cv_eh_disposition=yes, tcl_cv_eh_disposition=no) ) if test "$tcl_cv_eh_disposition" = "no" ; then AC_DEFINE(EXCEPTION_DISPOSITION, int, [Defined when cygwin/mingw does not support EXCEPTION DISPOSITION]) fi # Check to see if winnt.h defines CHAR, SHORT, and LONG # even if VOID has already been #defined. The win32api # used by mingw and cygwin is known to do this. AC_CACHE_CHECK(for winnt.h that ignores VOID define, tcl_cv_winnt_ignore_void, AC_TRY_COMPILE([ #define VOID void #define WIN32_LEAN_AND_MEAN #include <windows.h> #undef WIN32_LEAN_AND_MEAN ], [ CHAR c; SHORT s; LONG l; ], tcl_cv_winnt_ignore_void=yes, tcl_cv_winnt_ignore_void=no) ) if test "$tcl_cv_winnt_ignore_void" = "yes" ; then AC_DEFINE(HAVE_WINNT_IGNORE_VOID, 1, [Defined when cygwin/mingw ignores VOID define in winnt.h]) fi fi # See if the compiler supports casting to a union type. # This is used to stop gcc from printing a compiler # warning when initializing a union member. AC_CACHE_CHECK(for cast to union support, tcl_cv_cast_to_union, AC_TRY_COMPILE([], [ union foo { int i; double d; }; union foo f = (union foo) (int) 0; ], tcl_cv_cast_to_union=yes, tcl_cv_cast_to_union=no) ) if test "$tcl_cv_cast_to_union" = "yes"; then AC_DEFINE(HAVE_CAST_TO_UNION, 1, [Defined when compiler supports casting to union type.]) fi AC_SUBST(CFLAGS_DEBUG) AC_SUBST(CFLAGS_OPTIMIZE) AC_SUBST(CFLAGS_WARNING) AC_SUBST(STLIB_LD) AC_SUBST(SHLIB_LD) AC_SUBST(SHLIB_LD_LIBS) AC_SUBST(SHLIB_CFLAGS) AC_SUBST(LD_LIBRARY_PATH_VAR) # These must be called after we do the basic CFLAGS checks and # verify any possible 64-bit or similar switches are necessary TEA_TCL_EARLY_FLAGS TEA_TCL_64BIT_FLAGS ]) #-------------------------------------------------------------------- # TEA_SERIAL_PORT # # Determine which interface to use to talk to the serial port. # Note that #include lines must begin in leftmost column for # some compilers to recognize them as preprocessor directives, # and some build environments have stdin not pointing at a # pseudo-terminal (usually /dev/null instead.) # # Arguments: # none # # Results: # # Defines only one of the following vars: # HAVE_SYS_MODEM_H # USE_TERMIOS # USE_TERMIO # USE_SGTTY #-------------------------------------------------------------------- AC_DEFUN([TEA_SERIAL_PORT], [ AC_CHECK_HEADERS(sys/modem.h) AC_CACHE_CHECK([termios vs. termio vs. sgtty], tcl_cv_api_serial, [ AC_TRY_RUN([ #include <termios.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termio.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <sgtty.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no ; then AC_TRY_RUN([ #include <termios.h> #include <errno.h> int main() { struct termios t; if (tcgetattr(0, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { cfsetospeed(&t, 0); t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <termio.h> #include <errno.h> int main() { struct termio t; if (ioctl(0, TCGETA, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; return 0; } return 1; }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) fi if test $tcl_cv_api_serial = no; then AC_TRY_RUN([ #include <sgtty.h> #include <errno.h> int main() { struct sgttyb t; if (ioctl(0, TIOCGETP, &t) == 0 || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { t.sg_ospeed = 0; t.sg_flags |= ODDP | EVENP | RAW; return 0; } return 1; }], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) fi]) case $tcl_cv_api_serial in termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; esac ]) #-------------------------------------------------------------------- # TEA_MISSING_POSIX_HEADERS # # Supply substitutes for missing POSIX header files. Special # notes: # - stdlib.h doesn't define strtol, strtoul, or # strtod in some versions of SunOS # - some versions of string.h don't declare procedures such # as strstr # # Arguments: # none # # Results: # # Defines some of the following vars: # NO_DIRENT_H # NO_ERRNO_H # NO_VALUES_H # HAVE_LIMITS_H or NO_LIMITS_H # NO_STDLIB_H # NO_STRING_H # NO_SYS_WAIT_H # NO_DLFCN_H # HAVE_SYS_PARAM_H # # HAVE_STRING_H ? # # tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and # CHECK on limits.h #-------------------------------------------------------------------- AC_DEFUN([TEA_MISSING_POSIX_HEADERS], [ AC_CACHE_CHECK([dirent.h], tcl_cv_dirent_h, [ AC_TRY_LINK([#include <sys/types.h> #include <dirent.h>], [ #ifndef _POSIX_SOURCE # ifdef __Lynx__ /* * Generate compilation error to make the test fail: Lynx headers * are only valid if really in the POSIX environment. */ missing_procedure(); # endif #endif DIR *d; struct dirent *entryPtr; char *p; d = opendir("foobar"); entryPtr = readdir(d); p = entryPtr->d_name; closedir(d); ], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)]) if test $tcl_cv_dirent_h = no; then AC_DEFINE(NO_DIRENT_H, 1, [Do we have <dirent.h>?]) fi # TEA specific: AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have <errno.h>?])]) AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have <float.h>?])]) AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have <values.h>?])]) AC_CHECK_HEADER(limits.h, [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have <limits.h>?])], [AC_DEFINE(NO_LIMITS_H, 1, [Do we have <limits.h>?])]) AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) if test $tcl_ok = 0; then AC_DEFINE(NO_STDLIB_H, 1, [Do we have <stdlib.h>?]) fi AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) # See also memmove check below for a place where NO_STRING_H can be # set and why. if test $tcl_ok = 0; then AC_DEFINE(NO_STRING_H, 1, [Do we have <string.h>?]) fi AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have <sys/wait.h>?])]) AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have <dlfcn.h>?])]) # OS/390 lacks sys/param.h (and doesn't need it, by chance). AC_HAVE_HEADERS(sys/param.h) ]) #-------------------------------------------------------------------- # TEA_PATH_X # # Locate the X11 header files and the X11 library archive. Try # the ac_path_x macro first, but if it doesn't find the X stuff # (e.g. because there's no xmkmf program) then check through # a list of possible directories. Under some conditions the # autoconf macro will return an include directory that contains # no include files, so double-check its result just to be safe. # # This should be called after TEA_CONFIG_CFLAGS as setting the # LIBS line can confuse some configure macro magic. # # Arguments: # none # # Results: # # Sets the following vars: # XINCLUDES # XLIBSW # PKG_LIBS (appends to) #-------------------------------------------------------------------- AC_DEFUN([TEA_PATH_X], [ if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then TEA_PATH_UNIX_X fi ]) AC_DEFUN([TEA_PATH_UNIX_X], [ AC_PATH_X not_really_there="" if test "$no_x" = ""; then if test "$x_includes" = ""; then AC_TRY_CPP([#include <X11/Xlib.h>], , not_really_there="yes") else if test ! -r $x_includes/X11/Xlib.h; then not_really_there="yes" fi fi fi if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then AC_MSG_CHECKING([for X11 header files]) found_xincludes="no" AC_TRY_CPP([#include <X11/Xlib.h>], found_xincludes="yes", found_xincludes="no") if test "$found_xincludes" = "no"; then dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" for i in $dirs ; do if test -r $i/X11/Xlib.h; then AC_MSG_RESULT([$i]) XINCLUDES=" -I$i" found_xincludes="yes" break fi done fi else if test "$x_includes" != ""; then XINCLUDES="-I$x_includes" found_xincludes="yes" fi fi if test "$found_xincludes" = "no"; then AC_MSG_RESULT([couldn't find any!]) fi if test "$no_x" = yes; then AC_MSG_CHECKING([for X11 libraries]) XLIBSW=nope dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" for i in $dirs ; do if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl -o -r $i/libX11.dylib; then AC_MSG_RESULT([$i]) XLIBSW="-L$i -lX11" x_libraries="$i" break fi done else if test "$x_libraries" = ""; then XLIBSW=-lX11 else XLIBSW="-L$x_libraries -lX11" fi fi if test "$XLIBSW" = nope ; then AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) fi if test "$XLIBSW" = nope ; then AC_MSG_RESULT([could not find any! Using -lX11.]) XLIBSW=-lX11 fi # TEA specific: if test x"${XLIBSW}" != x ; then PKG_LIBS="${PKG_LIBS} ${XLIBSW}" fi ]) #-------------------------------------------------------------------- # TEA_BLOCKING_STYLE # # The statements below check for systems where POSIX-style # non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. # On these systems (mostly older ones), use the old BSD-style # FIONBIO approach instead. # # Arguments: # none # # Results: # # Defines some of the following vars: # HAVE_SYS_IOCTL_H # HAVE_SYS_FILIO_H # USE_FIONBIO # O_NONBLOCK #-------------------------------------------------------------------- AC_DEFUN([TEA_BLOCKING_STYLE], [ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/filio.h) TEA_CONFIG_SYSTEM AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) case $system in OSF*) AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; esac ]) #-------------------------------------------------------------------- # TEA_TIME_HANDLER # # Checks how the system deals with time.h, what time structures # are used on the system, and what fields the structures have. # # Arguments: # none # # Results: # # Defines some of the following vars: # USE_DELTA_FOR_TZ # HAVE_TM_GMTOFF # HAVE_TM_TZADJ # HAVE_TIMEZONE_VAR #-------------------------------------------------------------------- AC_DEFUN([TEA_TIME_HANDLER], [ AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME AC_STRUCT_TIMEZONE AC_CHECK_FUNCS(gmtime_r localtime_r) AC_CACHE_CHECK([tm_tzadj in struct tm], tcl_cv_member_tm_tzadj, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;], tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)]) if test $tcl_cv_member_tm_tzadj = yes ; then AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) fi AC_CACHE_CHECK([tm_gmtoff in struct tm], tcl_cv_member_tm_gmtoff, [ AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;], tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)]) if test $tcl_cv_member_tm_gmtoff = yes ; then AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) fi # # Its important to include time.h in this check, as some systems # (like convex) have timezone functions, etc. # AC_CACHE_CHECK([long timezone variable], tcl_cv_timezone_long, [ AC_TRY_COMPILE([#include <time.h>], [extern long timezone; timezone += 1; exit (0);], tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)]) if test $tcl_cv_timezone_long = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) else # # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. # AC_CACHE_CHECK([time_t timezone variable], tcl_cv_timezone_time, [ AC_TRY_COMPILE([#include <time.h>], [extern time_t timezone; timezone += 1; exit (0);], tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)]) if test $tcl_cv_timezone_time = yes ; then AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) fi fi ]) #-------------------------------------------------------------------- # TEA_BUGGY_STRTOD # # Under Solaris 2.4, strtod returns the wrong value for the # terminating character under some conditions. Check for this # and if the problem exists use a substitute procedure # "fixstrtod" (provided by Tcl) that corrects the error. # Also, on Compaq's Tru64 Unix 5.0, # strtod(" ") returns 0.0 instead of a failure to convert. # # Arguments: # none # # Results: # # Might defines some of the following vars: # strtod (=fixstrtod) #-------------------------------------------------------------------- AC_DEFUN([TEA_BUGGY_STRTOD], [ AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) if test "$tcl_strtod" = 1; then AC_CACHE_CHECK([for Solaris2.4/Tru64 strtod bugs], tcl_cv_strtod_buggy,[ AC_TRY_RUN([ extern double strtod(); int main() { char *infString="Inf", *nanString="NaN", *spaceString=" "; char *term; double value; value = strtod(infString, &term); if ((term != infString) && (term[-1] == 0)) { exit(1); } value = strtod(nanString, &term); if ((term != nanString) && (term[-1] == 0)) { exit(1); } value = strtod(spaceString, &term); if (term == (spaceString+1)) { exit(1); } exit(0); }], tcl_cv_strtod_buggy=ok, tcl_cv_strtod_buggy=buggy, tcl_cv_strtod_buggy=buggy)]) if test "$tcl_cv_strtod_buggy" = buggy; then AC_LIBOBJ([fixstrtod]) USE_COMPAT=1 AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) fi fi ]) #-------------------------------------------------------------------- # TEA_TCL_LINK_LIBS # # Search for the libraries needed to link the Tcl shell. # Things like the math library (-lm) and socket stuff (-lsocket vs. # -lnsl) are dealt with here. # # Arguments: # Requires the following vars to be set in the Makefile: # DL_LIBS (not in TEA, only needed in core) # LIBS # MATH_LIBS # # Results: # # Substitutes the following vars: # TCL_LIBS # MATH_LIBS # # Might append to the following vars: # LIBS # # Might define the following vars: # HAVE_NET_ERRNO_H #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_LINK_LIBS], [ #-------------------------------------------------------------------- # On a few very rare systems, all of the libm.a stuff is # already in libc.a. Set compiler flags accordingly. # Also, Linux requires the "ieee" library for math to work # right (and it must appear before "-lm"). #-------------------------------------------------------------------- AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) #-------------------------------------------------------------------- # Interactive UNIX requires -linet instead of -lsocket, plus it # needs net/errno.h to define the socket-related error codes. #-------------------------------------------------------------------- AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) AC_CHECK_HEADER(net/errno.h, [ AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have <net/errno.h>?])]) #-------------------------------------------------------------------- # Check for the existence of the -lsocket and -lnsl libraries. # The order here is important, so that they end up in the right # order in the command line generated by make. Here are some # special considerations: # 1. Use "connect" and "accept" to check for -lsocket, and # "gethostbyname" to check for -lnsl. # 2. Use each function name only once: can't redo a check because # autoconf caches the results of the last check and won't redo it. # 3. Use -lnsl and -lsocket only if they supply procedures that # aren't already present in the normal libraries. This is because # IRIX 5.2 has libraries, but they aren't needed and they're # bogus: they goof up name resolution if used. # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. # To get around this problem, check for both libraries together # if -lsocket doesn't work by itself. #-------------------------------------------------------------------- tcl_checkBoth=0 AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) if test "$tcl_checkSocket" = 1; then AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) fi if test "$tcl_checkBoth" = 1; then tk_oldLibs=$LIBS LIBS="$LIBS -lsocket -lnsl" AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) fi AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, [LIBS="$LIBS -lnsl"])]) # TEA specific: Don't perform the eval of the libraries here because # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' AC_SUBST(TCL_LIBS) AC_SUBST(MATH_LIBS) ]) #-------------------------------------------------------------------- # TEA_TCL_EARLY_FLAGS # # Check for what flags are needed to be passed so the correct OS # features are available. # # Arguments: # None # # Results: # # Might define the following vars: # _ISOC99_SOURCE # _LARGEFILE64_SOURCE # _LARGEFILE_SOURCE64 #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_EARLY_FLAG],[ AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, AC_TRY_COMPILE([[#define ]$1[ 1 ]$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) tcl_flags="$tcl_flags $1" fi ]) AC_DEFUN([TEA_TCL_EARLY_FLAGS],[ AC_MSG_CHECKING([for required early compiler flags]) tcl_flags="" TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>], [char *p = (char *)strtoll; char *q = (char *)strtoull;]) TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>], [struct stat64 buf; int i = stat64("/", &buf);]) TEA_TCL_EARLY_FLAG(_LARGEFILE_SOURCE64,[#include <sys/stat.h>], [char *p = (char *)open64;]) if test "x${tcl_flags}" = "x" ; then AC_MSG_RESULT([none]) else AC_MSG_RESULT([${tcl_flags}]) fi ]) #-------------------------------------------------------------------- # TEA_TCL_64BIT_FLAGS # # Check for what is defined in the way of 64-bit features. # # Arguments: # None # # Results: # # Might define the following vars: # TCL_WIDE_INT_IS_LONG # TCL_WIDE_INT_TYPE # HAVE_STRUCT_DIRENT64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T #-------------------------------------------------------------------- AC_DEFUN([TEA_TCL_64BIT_FLAGS], [ AC_MSG_CHECKING([for 64-bit integer type]) AC_CACHE_VAL(tcl_cv_type_64bit,[ tcl_cv_type_64bit=none # See if the compiler knows natively about __int64 AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], tcl_type_64bit=__int64, tcl_type_64bit="long long") # See if we should use long anyway Note that we substitute in the # type that is our current guess for a 64-bit type inside this check # program, so it should be modified only carefully... AC_TRY_COMPILE(,[switch (0) { case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) AC_MSG_RESULT([using long]) elif test "${tcl_cv_type_64bit}" = "__int64" \ -a "${TEA_PLATFORM}" = "windows" ; then # TEA specific: We actually want to use the default tcl.h checks in # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* AC_MSG_RESULT([using Tcl header defaults]) else AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, [What type should be used to define wide integers?]) AC_MSG_RESULT([${tcl_cv_type_64bit}]) # Now check for auxiliary declarations AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[ AC_TRY_COMPILE([#include <sys/types.h> #include <dirent.h>],[struct dirent64 p;], tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?]) fi AC_CACHE_CHECK([for struct stat64], tcl_cv_struct_stat64,[ AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p; ], tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) if test "x${tcl_cv_struct_stat64}" = "xyes" ; then AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in <sys/stat.h>?]) fi AC_CHECK_FUNCS(open64 lseek64) AC_MSG_CHECKING([for off64_t]) AC_CACHE_VAL(tcl_cv_type_off64_t,[ AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset; ], tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) dnl Define HAVE_TYPE_OFF64_T only when the off64_t type and the dnl functions lseek64 and open64 are defined. if test "x${tcl_cv_type_off64_t}" = "xyes" && \ test "x${ac_cv_func_lseek64}" = "xyes" && \ test "x${ac_cv_func_open64}" = "xyes" ; then AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in <sys/types.h>?]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi fi ]) ## ## Here ends the standard Tcl configuration bits and starts the ## TEA specific functions ## #------------------------------------------------------------------------ # TEA_INIT -- # # Init various Tcl Extension Architecture (TEA) variables. # This should be the first called TEA_* macro. # # Arguments: # none # # Results: # # Defines and substs the following vars: # CYGPATH # EXEEXT # Defines only: # TEA_VERSION # TEA_INITED # TEA_PLATFORM (windows or unix) # # "cygpath" is used on windows to generate native path names for include # files. These variables should only be used with the compiler and linker # since they generate native path names. # # EXEEXT # Select the executable extension based on the host type. This # is a lightweight replacement for AC_EXEEXT that doesn't require # a compiler. #------------------------------------------------------------------------ AC_DEFUN([TEA_INIT], [ # TEA extensions pass this us the version of TEA they think they # are compatible with. TEA_VERSION="3.9" AC_MSG_CHECKING([for correct TEA configuration]) if test x"${PACKAGE_NAME}" = x ; then AC_MSG_ERROR([ The PACKAGE_NAME variable must be defined by your TEA configure.in]) fi if test x"$1" = x ; then AC_MSG_ERROR([ TEA version not specified.]) elif test "$1" != "${TEA_VERSION}" ; then AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) else AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) fi # If the user did not set CFLAGS, set it now to keep macros # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2". if test "${CFLAGS+set}" != "set" ; then CFLAGS="" fi case "`uname -s`" in *win32*|*WIN32*|*MINGW32_*) AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *CYGWIN_*) CYGPATH=echo EXEEXT=".exe" # TEA_PLATFORM is determined later in LOAD_TCLCONFIG ;; *) CYGPATH=echo # Maybe we are cross-compiling.... case ${host_alias} in *mingw32*) EXEEXT=".exe" TEA_PLATFORM="windows" ;; *) EXEEXT="" TEA_PLATFORM="unix" ;; esac ;; esac # Check if exec_prefix is set. If not use fall back to prefix. # Note when adjusted, so that TEA_PREFIX can correct for this. # This is needed for recursive configures, since autoconf propagates # $prefix, but not $exec_prefix (doh!). if test x$exec_prefix = xNONE ; then exec_prefix_default=yes exec_prefix=$prefix fi AC_MSG_NOTICE([configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}]) AC_SUBST(EXEEXT) AC_SUBST(CYGPATH) # This package name must be replaced statically for AC_SUBST to work AC_SUBST(PKG_LIB_FILE) # Substitute STUB_LIB_FILE in case package creates a stub library too. AC_SUBST(PKG_STUB_LIB_FILE) # We AC_SUBST these here to ensure they are subst'ed, # in case the user doesn't call TEA_ADD_... AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) AC_SUBST(PKG_TCL_SOURCES) AC_SUBST(PKG_HEADERS) AC_SUBST(PKG_INCLUDES) AC_SUBST(PKG_LIBS) AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_SOURCES # PKG_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_SOURCES], [ vars="$@" for i in $vars; do case $i in [\$]*) # allow $-var names PKG_SOURCES="$PKG_SOURCES $i" PKG_OBJECTS="$PKG_OBJECTS $i" ;; *) # check for existence - allows for generic/win/unix VPATH # To add more dirs here (like 'src'), you have to update VPATH # in Makefile.in as well if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find source file '$i']) fi PKG_SOURCES="$PKG_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_OBJECTS="$PKG_OBJECTS $j" ;; esac done AC_SUBST(PKG_SOURCES) AC_SUBST(PKG_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_STUB_SOURCES -- # # Specify one or more source files. Users should check for # the right platform before adding to their list. # It is not important to specify the directory, as long as it is # in the generic, win or unix subdirectory of $(srcdir). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_STUB_SOURCES # PKG_STUB_OBJECTS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_STUB_SOURCES], [ vars="$@" for i in $vars; do # check for existence - allows for generic/win/unix VPATH if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ -a ! -f "${srcdir}/macosx/$i" \ ; then AC_MSG_ERROR([could not find stub source file '$i']) fi PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" # this assumes it is in a VPATH dir i=`basename $i` # handle user calling this before or after TEA_SETUP_COMPILER if test x"${OBJEXT}" != x ; then j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" else j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" fi PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" done AC_SUBST(PKG_STUB_SOURCES) AC_SUBST(PKG_STUB_OBJECTS) ]) #------------------------------------------------------------------------ # TEA_ADD_TCL_SOURCES -- # # Specify one or more Tcl source files. These should be platform # independent runtime files. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_TCL_SOURCES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_TCL_SOURCES], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) fi PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" done AC_SUBST(PKG_TCL_SOURCES) ]) #------------------------------------------------------------------------ # TEA_ADD_HEADERS -- # # Specify one or more source headers. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_HEADERS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_HEADERS], [ vars="$@" for i in $vars; do # check for existence, be strict because it is installed if test ! -f "${srcdir}/$i" ; then AC_MSG_ERROR([could not find header file '${srcdir}/$i']) fi PKG_HEADERS="$PKG_HEADERS $i" done AC_SUBST(PKG_HEADERS) ]) #------------------------------------------------------------------------ # TEA_ADD_INCLUDES -- # # Specify one or more include dirs. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_INCLUDES], [ vars="$@" for i in $vars; do PKG_INCLUDES="$PKG_INCLUDES $i" done AC_SUBST(PKG_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_ADD_LIBS -- # # Specify one or more libraries. Users should check for # the right platform before adding to their list. For Windows, # libraries provided in "foo.lib" format will be converted to # "-lfoo" when using GCC (mingw). # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_LIBS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_LIBS], [ vars="$@" for i in $vars; do if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then # Convert foo.lib to -lfoo for GCC. No-op if not *.lib i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` fi PKG_LIBS="$PKG_LIBS $i" done AC_SUBST(PKG_LIBS) ]) #------------------------------------------------------------------------ # TEA_ADD_CFLAGS -- # # Specify one or more CFLAGS. Users should check for # the right platform before adding to their list. # # Arguments: # one or more file names # # Results: # # Defines and substs the following vars: # PKG_CFLAGS #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CFLAGS], [ PKG_CFLAGS="$PKG_CFLAGS $@" AC_SUBST(PKG_CFLAGS) ]) #------------------------------------------------------------------------ # TEA_ADD_CLEANFILES -- # # Specify one or more CLEANFILES. # # Arguments: # one or more file names to clean target # # Results: # # Appends to CLEANFILES, already defined for subst in LOAD_TCLCONFIG #------------------------------------------------------------------------ AC_DEFUN([TEA_ADD_CLEANFILES], [ CLEANFILES="$CLEANFILES $@" ]) #------------------------------------------------------------------------ # TEA_PREFIX -- # # Handle the --prefix=... option by defaulting to what Tcl gave # # Arguments: # none # # Results: # # If --prefix or --exec-prefix was not specified, $prefix and # $exec_prefix will be set to the values given to Tcl when it was # configured. #------------------------------------------------------------------------ AC_DEFUN([TEA_PREFIX], [ if test "${prefix}" = "NONE"; then prefix_default=yes if test x"${TCL_PREFIX}" != x; then AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) prefix=${TCL_PREFIX} else AC_MSG_NOTICE([--prefix defaulting to /usr/local]) prefix=/usr/local fi fi if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ -o x"${exec_prefix_default}" = x"yes" ; then if test x"${TCL_EXEC_PREFIX}" != x; then AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) exec_prefix=${TCL_EXEC_PREFIX} else AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) exec_prefix=$prefix fi fi ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER_CC -- # # Do compiler checks the way we want. This is just a replacement # for AC_PROG_CC in TEA configure.in files to make them cleaner. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER_CC], [ # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) # in this macro, they need to go into TEA_SETUP_COMPILER instead. AC_PROG_CC AC_PROG_CXX AC_PROG_CPP INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c" AC_SUBST(INSTALL) #-------------------------------------------------------------------- # Checks to see if the make program sets the $MAKE variable. #-------------------------------------------------------------------- AC_PROG_MAKE_SET #-------------------------------------------------------------------- # Find ranlib #-------------------------------------------------------------------- AC_CHECK_TOOL(RANLIB, ranlib) #-------------------------------------------------------------------- # Determines the correct binary file extension (.o, .obj, .exe etc.) #-------------------------------------------------------------------- AC_OBJEXT AC_EXEEXT ]) #------------------------------------------------------------------------ # TEA_SETUP_COMPILER -- # # Do compiler checks that use the compiler. This must go after # TEA_SETUP_COMPILER_CC, which does the actual compiler check. # # Arguments: # none # # Results: # # Sets up CC var and other standard bits we need to make executables. #------------------------------------------------------------------------ AC_DEFUN([TEA_SETUP_COMPILER], [ # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. AC_REQUIRE([TEA_SETUP_COMPILER_CC]) #------------------------------------------------------------------------ # If we're using GCC, see if the compiler understands -pipe. If so, use it. # It makes compiling go faster. (This is only a performance feature.) #------------------------------------------------------------------------ if test -z "$no_pipe" -a -n "$GCC"; then AC_CACHE_CHECK([if the compiler understands -pipe], tcl_cv_cc_pipe, [ hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe" AC_TRY_COMPILE(,, tcl_cv_cc_pipe=yes, tcl_cv_cc_pipe=no) CFLAGS=$hold_cflags]) if test $tcl_cv_cc_pipe = yes; then CFLAGS="$CFLAGS -pipe" fi fi #-------------------------------------------------------------------- # Common compiler flag setup #-------------------------------------------------------------------- AC_C_BIGENDIAN if test "${TEA_PLATFORM}" = "unix" ; then TEA_TCL_LINK_LIBS TEA_MISSING_POSIX_HEADERS # Let the user call this, because if it triggers, they will # need a compat/strtod.c that is correct. Users can also # use Tcl_GetDouble(FromObj) instead. #TEA_BUGGY_STRTOD fi ]) #------------------------------------------------------------------------ # TEA_MAKE_LIB -- # # Generate a line that can be used to build a shared/unshared library # in a platform independent manner. # # Arguments: # none # # Requires: # # Results: # # Defines the following vars: # CFLAGS - Done late here to note disturb other AC macros # MAKE_LIB - Command to execute to build the Tcl library; # differs depending on whether or not Tcl is being # compiled as a shared library. # MAKE_SHARED_LIB Makefile rule for building a shared library # MAKE_STATIC_LIB Makefile rule for building a static library # MAKE_STUB_LIB Makefile rule for building a stub library # VC_MANIFEST_EMBED_DLL Makefile rule for embedded VC manifest in DLL # VC_MANIFEST_EMBED_EXE Makefile rule for embedded VC manifest in EXE #------------------------------------------------------------------------ AC_DEFUN([TEA_MAKE_LIB], [ if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" AC_EGREP_CPP([manifest needed], [ #if defined(_MSC_VER) && _MSC_VER >= 1400 print("manifest needed") #endif ], [ # Could do a CHECK_PROG for mt, but should always be with MSVC8+ VC_MANIFEST_EMBED_DLL="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;2 ; fi" VC_MANIFEST_EMBED_EXE="if test -f \[$]@.manifest ; then mt.exe -nologo -manifest \[$]@.manifest -outputresource:\[$]@\;1 ; fi" MAKE_SHARED_LIB="${MAKE_SHARED_LIB} ; ${VC_MANIFEST_EMBED_DLL}" TEA_ADD_CLEANFILES([*.manifest]) ]) MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" else MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" fi if test "${SHARED_BUILD}" = "1" ; then MAKE_LIB="${MAKE_SHARED_LIB} " else MAKE_LIB="${MAKE_STATIC_LIB} " fi #-------------------------------------------------------------------- # Shared libraries and static libraries have different names. # Use the double eval to make sure any variables in the suffix is # substituted. (@@@ Might not be necessary anymore) #-------------------------------------------------------------------- if test "${TEA_PLATFORM}" = "windows" ; then if test "${SHARED_BUILD}" = "1" ; then # We force the unresolved linking of symbols that are really in # the private libraries of Tcl and Tk. SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" fi eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" else eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" if test "$GCC" = "yes"; then PKG_STUB_LIB_FILE=lib${PKG_STUB_LIB_FILE} fi # These aren't needed on Windows (either MSVC or gcc) RANLIB=: RANLIB_STUB=: else RANLIB_STUB="${RANLIB}" if test "${SHARED_BUILD}" = "1" ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" if test x"${TK_BIN_DIR}" != x ; then SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" fi eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" RANLIB=: else eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" fi # Some packages build their own stubs libraries eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" fi # These are escaped so that only CFLAGS is picked up at configure time. # The other values will be substituted at make time. CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" if test "${SHARED_BUILD}" = "1" ; then CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" fi AC_SUBST(MAKE_LIB) AC_SUBST(MAKE_SHARED_LIB) AC_SUBST(MAKE_STATIC_LIB) AC_SUBST(MAKE_STUB_LIB) AC_SUBST(RANLIB_STUB) AC_SUBST(VC_MANIFEST_EMBED_DLL) AC_SUBST(VC_MANIFEST_EMBED_EXE) ]) #------------------------------------------------------------------------ # TEA_LIB_SPEC -- # # Compute the name of an existing object library located in libdir # from the given base name and produce the appropriate linker flags. # # Arguments: # basename The base name of the library without version # numbers, extensions, or "lib" prefixes. # extra_dir Extra directory in which to search for the # library. This location is used first, then # $prefix/$exec-prefix, then some defaults. # # Requires: # TEA_INIT and TEA_PREFIX must be called first. # # Results: # # Defines the following vars: # ${basename}_LIB_NAME The computed library name. # ${basename}_LIB_SPEC The computed linker flags. #------------------------------------------------------------------------ AC_DEFUN([TEA_LIB_SPEC], [ AC_MSG_CHECKING([for $1 library]) # Look in exec-prefix for the library (defined by TEA_PREFIX). tea_lib_name_dir="${exec_prefix}/lib" # Or in a user-specified location. if test x"$2" != x ; then tea_extra_lib_dir=$2 else tea_extra_lib_dir=NONE fi for i in \ `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/lib64/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/lib64/lib$1[[0-9]]* 2>/dev/null ` \ `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do if test -f "$i" ; then tea_lib_name_dir=`dirname $i` $1_LIB_NAME=`basename $i` $1_LIB_PATH_NAME=$i break fi done if test "${TEA_PLATFORM}" = "windows"; then $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" else # Strip off the leading "lib" and trailing ".a" or ".so" tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" fi if test "x${$1_LIB_NAME}" = x ; then AC_MSG_ERROR([not found]) else AC_MSG_RESULT([${$1_LIB_SPEC}]) fi ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TCL_HEADERS -- # # Locate the private Tcl include files # # Arguments: # # Requires: # TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TCL_TOP_DIR_NATIVE # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TCL_HEADERS], [ # Allow for --with-tclinclude to take effect and define ${ac_cv_c_tclh} AC_REQUIRE([TEA_PUBLIC_TCL_HEADERS]) AC_MSG_CHECKING([for Tcl private include files]) TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" # Check to see if tcl<Plat>Port.h isn't already with the public headers # Don't look for tclInt.h because that resides with tcl.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tclh}/tclWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tclh}/tclUnixPort.h"; then result="private headers found with public headers" else TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" if test "${TEA_PLATFORM}" = "windows"; then TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" else TCL_PLATFORM_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TCL_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TCL_DEFS} in *TCL_FRAMEWORK*) if test -d "${TCL_BIN_DIR}/Headers" -a \ -d "${TCL_BIN_DIR}/PrivateHeaders"; then TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}" else TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TCL_INCLUDES}" else if test ! -f "${TCL_SRC_DIR}/generic/tclInt.h" ; then AC_MSG_ERROR([Cannot find private header tclInt.h in ${TCL_SRC_DIR}]) fi result="Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}" fi fi AC_SUBST(TCL_TOP_DIR_NATIVE) AC_SUBST(TCL_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TCL_HEADERS -- # # Locate the installed public Tcl header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tclinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TCL_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TCL_HEADERS], [ AC_MSG_CHECKING([for Tcl public headers]) AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tclh, [ # Use the value from --with-tclinclude, if it was given if test x"${with_tclinclude}" != x ; then if test -f "${with_tclinclude}/tcl.h" ; then ac_cv_c_tclh=${with_tclinclude} else AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tcl was built as a framework, attempt to use # the framework's Headers directory case ${TCL_DEFS} in *TCL_FRAMEWORK*) list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tcl is not installed, # and in that situation, look there before installed locations. if test -f "${TCL_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TCL_INCLUDE_SPEC}" != x ; then d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tcl.h" ; then ac_cv_c_tclh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tclh}" = x ; then AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) else AC_MSG_RESULT([${ac_cv_c_tclh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TCL_INCLUDES) ]) #------------------------------------------------------------------------ # TEA_PRIVATE_TK_HEADERS -- # # Locate the private Tk include files # # Arguments: # # Requires: # TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has # already been called. # # Results: # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PRIVATE_TK_HEADERS], [ # Allow for --with-tkinclude to take effect and define ${ac_cv_c_tkh} AC_REQUIRE([TEA_PUBLIC_TK_HEADERS]) AC_MSG_CHECKING([for Tk private include files]) TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" # Check to see if tk<Plat>Port.h isn't already with the public headers # Don't look for tkInt.h because that resides with tk.h in the core # sources, but the <plat>Port headers are in a different directory if test "${TEA_PLATFORM}" = "windows" -a \ -f "${ac_cv_c_tkh}/tkWinPort.h"; then result="private headers found with public headers" elif test "${TEA_PLATFORM}" = "unix" -a \ -f "${ac_cv_c_tkh}/tkUnixPort.h"; then result="private headers found with public headers" else TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" if test "${TEA_PLATFORM}" = "windows"; then TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" else TK_PLATFORM_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" fi # Overwrite the previous TK_INCLUDES as this should capture both # public and private headers in the same set. # We want to ensure these are substituted so as not to require # any *_NATIVE vars be defined in the Makefile TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" # Detect and add ttk subdir if test -d "${TK_SRC_DIR}/generic/ttk"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/generic/ttk\"" fi if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_XLIB_DIR_NATIVE}\"" fi if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then TK_INCLUDES="${TK_INCLUDES} -I\"${TK_SRC_DIR_NATIVE}/macosx\"" fi if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers and PrivateHeaders directories case ${TK_DEFS} in *TK_FRAMEWORK*) if test -d "${TK_BIN_DIR}/Headers" -a \ -d "${TK_BIN_DIR}/PrivateHeaders"; then TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}" else TK_INCLUDES="${TK_INCLUDES} ${TK_INCLUDE_SPEC} `echo "${TK_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`" fi ;; esac result="Using ${TK_INCLUDES}" else if test ! -f "${TK_SRC_DIR}/generic/tkInt.h" ; then AC_MSG_ERROR([Cannot find private header tkInt.h in ${TK_SRC_DIR}]) fi result="Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}" fi fi AC_SUBST(TK_TOP_DIR_NATIVE) AC_SUBST(TK_XLIB_DIR_NATIVE) AC_SUBST(TK_INCLUDES) AC_MSG_RESULT([${result}]) ]) #------------------------------------------------------------------------ # TEA_PUBLIC_TK_HEADERS -- # # Locate the installed public Tk header files # # Arguments: # None. # # Requires: # CYGPATH must be set # # Results: # # Adds a --with-tkinclude switch to configure. # Result is cached. # # Substitutes the following vars: # TK_INCLUDES #------------------------------------------------------------------------ AC_DEFUN([TEA_PUBLIC_TK_HEADERS], [ AC_MSG_CHECKING([for Tk public headers]) AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files], with_tkinclude=${withval}) AC_CACHE_VAL(ac_cv_c_tkh, [ # Use the value from --with-tkinclude, if it was given if test x"${with_tkinclude}" != x ; then if test -f "${with_tkinclude}/tk.h" ; then ac_cv_c_tkh=${with_tkinclude} else AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) fi else list="" if test "`uname -s`" = "Darwin"; then # If Tk was built as a framework, attempt to use # the framework's Headers directory. case ${TK_DEFS} in *TK_FRAMEWORK*) list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" ;; esac fi # Look in the source dir only if Tk is not installed, # and in that situation, look there before installed locations. if test -f "${TK_BIN_DIR}/Makefile" ; then list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" fi # Check order: pkg --prefix location, Tk's --prefix location, # relative to directory of tkConfig.sh, Tcl's --prefix location, # relative to directory of tclConfig.sh. eval "temp_includedir=${includedir}" list="$list \ `ls -d ${temp_includedir} 2>/dev/null` \ `ls -d ${TK_PREFIX}/include 2>/dev/null` \ `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then list="$list /usr/local/include /usr/include" if test x"${TK_INCLUDE_SPEC}" != x ; then d=`echo "${TK_INCLUDE_SPEC}" | sed -e 's/^-I//'` list="$list `ls -d ${d} 2>/dev/null`" fi fi for i in $list ; do if test -f "$i/tk.h" ; then ac_cv_c_tkh=$i break fi done fi ]) # Print a message based on how we determined the include path if test x"${ac_cv_c_tkh}" = x ; then AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) else AC_MSG_RESULT([${ac_cv_c_tkh}]) fi # Convert to a native path and substitute into the output files. INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_INCLUDES) if test "${TEA_WINDOWINGSYSTEM}" != "x11"; then # On Windows and Aqua, we need the X compat headers AC_MSG_CHECKING([for X11 header files]) if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" AC_SUBST(TK_XINCLUDES) fi AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) fi ]) #------------------------------------------------------------------------ # TEA_PATH_CONFIG -- # # Locate the ${1}Config.sh file and perform a sanity check on # the ${1} compile flags. These are used by packages like # [incr Tk] that load *Config.sh files from more than Tcl and Tk. # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-$1=... # # Defines the following vars: # $1_BIN_DIR Full path to the directory containing # the $1Config.sh file #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CONFIG], [ # # Ok, lets find the $1 configuration # First, look for one uninstalled. # the alternative search directory is invoked by --with-$1 # if test x"${no_$1}" = x ; then # we reset no_$1 in case something fails here no_$1=true AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) AC_MSG_CHECKING([for $1 configuration]) AC_CACHE_VAL(ac_cv_c_$1config,[ # First check to see if --with-$1 was specified. if test x"${with_$1config}" != x ; then case ${with_$1config} in */$1Config.sh ) if test -f ${with_$1config}; then AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` fi;; esac if test -f "${with_$1config}/$1Config.sh" ; then ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` else AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) fi fi # then check for a private $1 installation if test x"${ac_cv_c_$1config}" = x ; then for i in \ ../$1 \ `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../$1 \ `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ../../../$1 \ `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ${srcdir}/../$1 \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi if test -f "$i/unix/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i/unix; pwd)` break fi done fi # check in a few common install locations if test x"${ac_cv_c_$1config}" = x ; then for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do if test -f "$i/$1Config.sh" ; then ac_cv_c_$1config=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_$1config}" = x ; then $1_BIN_DIR="# no $1 configs found" AC_MSG_WARN([Cannot find $1 configuration definitions]) exit 0 else no_$1= $1_BIN_DIR=${ac_cv_c_$1config} AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) fi fi ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG -- # # Load the $1Config.sh file # # Arguments: # # Requires the following vars to be set: # $1_BIN_DIR # # Results: # # Substitutes the following vars: # $1_SRC_DIR # $1_LIB_FILE # $1_LIB_SPEC #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG], [ AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) if test -f "${$1_BIN_DIR}/$1Config.sh" ; then AC_MSG_RESULT([loading]) . "${$1_BIN_DIR}/$1Config.sh" else AC_MSG_RESULT([file not found]) fi # # If the $1_BIN_DIR is the build directory (not the install directory), # then set the common variable name to the value of the build variables. # For example, the variable $1_LIB_SPEC will be set to the value # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC # instead of $1_BUILD_LIB_SPEC since it will work with both an # installed and uninstalled version of Tcl. # if test -f "${$1_BIN_DIR}/Makefile" ; then AC_MSG_WARN([Found Makefile - using build library specs for $1]) $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} $1_INCLUDE_SPEC=${$1_BUILD_INCLUDE_SPEC} $1_LIBRARY_PATH=${$1_LIBRARY_PATH} fi AC_SUBST($1_VERSION) AC_SUBST($1_BIN_DIR) AC_SUBST($1_SRC_DIR) AC_SUBST($1_LIB_FILE) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_STUB_LIB_FILE) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_PATH) # Allow the caller to prevent this auto-check by specifying any 2nd arg AS_IF([test "x$2" = x], [ # Check both upper and lower-case variants # If a dev wanted non-stubs libs, this function could take an option # to not use _STUB in the paths below AS_IF([test "x${$1_STUB_LIB_SPEC}" = x], [TEA_LOAD_CONFIG_LIB(translit($1,[a-z],[A-Z])_STUB)], [TEA_LOAD_CONFIG_LIB($1_STUB)]) ]) ]) #------------------------------------------------------------------------ # TEA_LOAD_CONFIG_LIB -- # # Helper function to load correct library from another extension's # ${PACKAGE}Config.sh. # # Results: # Adds to LIBS the appropriate extension library #------------------------------------------------------------------------ AC_DEFUN([TEA_LOAD_CONFIG_LIB], [ AC_MSG_CHECKING([For $1 library for LIBS]) # This simplifies the use of stub libraries by automatically adding # the stub lib to your path. Normally this would add to SHLIB_LD_LIBS, # but this is called before CONFIG_CFLAGS. More importantly, this adds # to PKG_LIBS, which becomes LIBS, and that is only used by SHLIB_LD. if test "x${$1_LIB_SPEC}" != "x" ; then if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes" ; then TEA_ADD_LIBS([\"`${CYGPATH} ${$1_LIB_PATH}`\"]) AC_MSG_RESULT([using $1_LIB_PATH ${$1_LIB_PATH}]) else TEA_ADD_LIBS([${$1_LIB_SPEC}]) AC_MSG_RESULT([using $1_LIB_SPEC ${$1_LIB_SPEC}]) fi else AC_MSG_RESULT([file not found]) fi ]) #------------------------------------------------------------------------ # TEA_EXPORT_CONFIG -- # # Define the data to insert into the ${PACKAGE}Config.sh file # # Arguments: # # Requires the following vars to be set: # $1 # # Results: # Substitutes the following vars: #------------------------------------------------------------------------ AC_DEFUN([TEA_EXPORT_CONFIG], [ #-------------------------------------------------------------------- # These are for $1Config.sh #-------------------------------------------------------------------- # pkglibdir must be a fully qualified path and (not ${exec_prefix}/lib) eval pkglibdir="[$]{libdir}/$1${PACKAGE_VERSION}" if test "${TCL_LIB_VERSIONS_OK}" = "ok"; then eval $1_LIB_FLAG="-l$1${PACKAGE_VERSION}${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub${PACKAGE_VERSION}${DBGX}" else eval $1_LIB_FLAG="-l$1`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" eval $1_STUB_LIB_FLAG="-l$1stub`echo ${PACKAGE_VERSION} | tr -d .`${DBGX}" fi $1_BUILD_LIB_SPEC="-L`pwd` ${$1_LIB_FLAG}" $1_LIB_SPEC="-L${pkglibdir} ${$1_LIB_FLAG}" $1_BUILD_STUB_LIB_SPEC="-L`pwd` [$]{$1_STUB_LIB_FLAG}" $1_STUB_LIB_SPEC="-L${pkglibdir} [$]{$1_STUB_LIB_FLAG}" $1_BUILD_STUB_LIB_PATH="`pwd`/[$]{PKG_STUB_LIB_FILE}" $1_STUB_LIB_PATH="${pkglibdir}/[$]{PKG_STUB_LIB_FILE}" AC_SUBST($1_BUILD_LIB_SPEC) AC_SUBST($1_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_SPEC) AC_SUBST($1_STUB_LIB_SPEC) AC_SUBST($1_BUILD_STUB_LIB_PATH) AC_SUBST($1_STUB_LIB_PATH) AC_SUBST(MAJOR_VERSION) AC_SUBST(MINOR_VERSION) AC_SUBST(PATCHLEVEL) ]) #------------------------------------------------------------------------ # TEA_PATH_CELIB -- # # Locate Keuchel's celib emulation layer for targeting Win/CE # # Arguments: # none # # Results: # # Adds the following arguments to configure: # --with-celib=... # # Defines the following vars: # CELIB_DIR Full path to the directory containing # the include and platform lib files #------------------------------------------------------------------------ AC_DEFUN([TEA_PATH_CELIB], [ # First, look for one uninstalled. # the alternative search directory is invoked by --with-celib if test x"${no_celib}" = x ; then # we reset no_celib in case something fails here no_celib=true AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) AC_MSG_CHECKING([for Windows/CE celib directory]) AC_CACHE_VAL(ac_cv_c_celibconfig,[ # First check to see if --with-celibconfig was specified. if test x"${with_celibconfig}" != x ; then if test -d "${with_celibconfig}/inc" ; then ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` else AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) fi fi # then check for a celib library if test x"${ac_cv_c_celibconfig}" = x ; then for i in \ ../celib-palm-3.0 \ ../celib \ ../../celib-palm-3.0 \ ../../celib \ `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ ${srcdir}/../celib-palm-3.0 \ ${srcdir}/../celib \ `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ ; do if test -d "$i/inc" ; then ac_cv_c_celibconfig=`(cd $i; pwd)` break fi done fi ]) if test x"${ac_cv_c_celibconfig}" = x ; then AC_MSG_ERROR([Cannot find celib support library directory]) else no_celib= CELIB_DIR=${ac_cv_c_celibconfig} CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` AC_MSG_RESULT([found $CELIB_DIR]) fi fi ]) # Local Variables: # mode: autoconf # End: ������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/��������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 020701� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/���������������������������������������������000755 �000765 �000000 �00000000000 12634602226 023021� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Info.plist����������������������������������������������000644 �000765 �000000 �00000003437 12632624340 022657� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeExtensions</key> <array> <string>fits</string> <string>fit</string> <string>fts</string> <string>fitz</string> <string>ftz</string> <string>fz</string> </array> <key>CFBundleTypeIconFile</key> <string>fits.icns</string> <key>CFBundleTypeMIMETypes</key> <array> <string>image/fits</string> </array> <key>CFBundleTypeName</key> <string>Flexible Image Transport System</string> <key>CFBundleTypeOSTypes</key> <array> <string>FITS</string> </array> <key>CFBundleTypeRole</key> <string>Viewer</string> </dict> </array> <key>CFBundleExecutable</key> <string>ds9</string> <key>CFBundleGetInfoString</key> <string>"SAOImage DS9 7.4 Copyright 1999-2015 Smithsonian Astrophysical Observatory"</string> <key>CFBundleIconFile</key> <string>App.icns</string> <key>CFBundleIdentifier</key> <string>com.sao.SAOImageDS9</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>SAOImage DS9</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>7.4</string> <key>CFBundleSignature</key> <string>DS9</string> <key>CFBundleVersion</key> <string>7.4</string> <key>LSMinimumSystemVersion</key> <string>10.8.0</string> <key>LSRequiresCarbon</key> <true/> <key>LSEnvironment</key> <dict> <key>PATH</key> <string>/sw/bin:/usr/local/bin:/opt/local/bin:/usr/bin:/bin/:/usr/sbin:/sbin</string> </dict> </dict> </plist> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/MacOS/��������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 021643� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Resources/����������������������������������������������000755 �000765 �000000 �00000000000 12634602226 022653� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Resources/App.icns��������������������������������������000644 �000765 �000000 �00000135567 12350653200 024263� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��wics#���H��????����????��is32��Ձ���� �%%,]k�D�< Wz7Q�";��A=0qCB��e ��e`2R{�!� $#5t r7x-N ](UQ3��ky`uR�� �+x��+A2hƓR#G( �1 EVvb2� �_f!&t\���?>y����U�� �Ȱ� �Ŵͮ�4�οȭ��ڮټ̰��ûƱ��ڂ ǰ؁ վ̱ԃ ɼ�ׂ Ǧ�Ȼۀ4ݿϼ��̩ά��͸���Ь«�� ������ظ����U_�� �Ѳ� �Քm`�D�㥾5rWUM��Aa" {?��c^��T��G��/dŪ¤o� �q\� �L�ӐO�� QѪ�u}Y��3nJ\��B` E8��ۤx+VV<���Nm�� ��ܡϷÍ�����s8mk�������~υ��D^�B\�� ��j�  �y��3��^}h��3E���()�ICN#���������?���??????????���?��������������?���??????????���?�������il32�� � ��mh���P1%6 -d�� ��Q~,��@m�+*v� �e��p�*!X��K �^T�� (�A��FD&�xl�+��JE��c��S�<=V��&��N}^���{�+D ��ܕ[ ��?��u|�7� q��y[\(Y}[@��>��D��(��M ~_*���w�D� q��}0Ze:6��;rÅ=/��d�� )Mr.��X��"��M0� ��-����Ei߸l<��q>� ~��L�\�CK4��p��iEI�c��H�'�pR�;��#Bm�5 %B��R`��8� u�&�'v��t;߈��廀�5��bQ��U��MtT��t`�)E�3� �SF**;Zf���������jm����ѱͳ���ǭ٬ˤٱ���ยէܮ���ཤګʦ��Ҵϻ̩ݸԩг���ⱦ˪޺ä� �ۃٹӨ��ۃ۱��ù̯ ¹Թ�ڈܶ��݋º��ϫщǫ��ًͬƼ��༿ތú��ªۊվ��ᰦ΋Ұ��֪݉��ۆ½̫��ϳ݆ԧ��Uԁ ǣ��˱ڼ˴߶���Ю޷ԦӪ��汻ɨܮѧ��洪רȤ��ɸãϥϤ��ƮиĤIJ���ǾU� ��ڀ������UĶّ����ۉLϙuϯi����?sCѬ���ԁ�MA���ݦl�v,$�Gҿ��ڹ5~J�@�)� ֞0���ҏ�D_� j�,�c�a�,�Q�U��� .�&��%i�����ҋ��ҕ%�?� ��>iIgP9؁� չ�( ��� ��Ґ��.g��՘.����P��`: �1V|��p<��/b��ŭV���r��¸7��)��s`�����/&8���cx�A��fȸD�*�� B� T���ք��?!����)�Rʘ��θ y��0 �C ����E2t��f�T�T%��֠uբ �J!�.ӌ��6�o@Ǯ�M��_e35��Uщ_Џv���Գ۾U������l8mk�������������-cbbeA��� PY����3R��{������w��,W���,d������J�� j��9g��cg��&h��"\�� #���H��)��O����D��)G��L��+��.R ��&\_#������ich#��H���������������������������?����?????????�����?������������������������������������������������?����?????????�����?���������������������ih32��A�����si_`_xl����Јl=& ��=��9[����t)��?�\R���OI��f��� )w��e$�)n����:�P��] ��� �8��R�F���C�� ���`� 13��'��#�?G5���$�>��p��W5��h�s��W�e�l�;V�A� ���O+���5?�� ~�E�'�/���n�@��<��r��[�#�(U�}X���3�� � S ^�����_en� ��*���^% ��\ 3S]\lj EG��a� K�(��-���ߒ�n��&��x8� ����ou� �f��2 �%Mp_6�=�u&Is߶V/,��1ޤU0�y�Ex⺆X/�3��M� %MU�P����%r����v��(��Gq ���j�;�F����s�t�'��5S;UN �Nb>ln�t �H����6� �S�� [7C��)���%s� �(�~��A`�%4'���U�'�<�� !��&l�oC����/��`�-<1o�-� ��t ;!�s�U�M��{wT���<���T��.{��"���*T� �O�� � N����D���~4��1���'��a4��t��P ���� ����:��3M��Y���ب?f���tA�2i� /����Ң<1(1$60cx����wJD_�����Ȁ����ʹ����ʱä;����ݿ¦ϦӮ��ȹྤک ߱�� �Ųӧޱ޷���㻪׫޻ܰ���ڭȚ̌�%�ȫп޹ФӪҸ��նήˢױـ ʥ�'�پ۳̥׫��fĩͭـ ޷ݹ��ٳ݂ ں˥$��?Ӿۇج��Ǩی ݺ��ӺԻۋ඼q��?ƀ ی̥��𳦧ޒƩ��伥ݓ���ϴڐ۾��ڏĻ3��ήݓøU��Uܳݗʼ���Ьےù���ېиU��Ӷڑؿ��ޕ¤��ހ�ݍܵ��f̧݁یȿԬ��ԼϸƷۋթջ��Χ݈ɤ��Ѻ ۄݸò��沦 ʭہϿ֪��Ҵ׺؀ـƥ�'�ṩʬڬ޽޴��㺦ںݲէ޽թf� �̪ɭр̥ݶ���ѻ׸ڭ��jѫ߶ت���пܰܮܱ� ��濳զ֨Ψ��Ҷҩ̥о����ɿs���Ը��̾܀��������Ѻ����礑Нbr����ؐe{6̀b&��֮�uV]����ʀB�&/�ӷ����ʁN�л�Ԩ)����ۛ̀6� ՞�Ys ��C‚��Ժ0rͽ��{��2v� 'ՠ.�&�ӏ�9ϳ ��DS����hJ��R�v��3�� H� >֟.���fμ��;L�����i��� �ɼӋ�K����� 3�Dρ���?&&vL�������ҩ���Tٺ����̲6n��ʋ��%Ä���+_/NM�U��?ג�7 �� � @��сV������W��ʀ:���#n���ʁu,��q̀���DZr? ��8^���ɰpK$ ��:aπ�^*��H���ȷkD ��8a���ų)���3���Ѳ[ �ŕ���ʕtc9 ����f��Ͽ@������3N���$���Nr.�#� �7_GWK� �ѐ#��~z��9ܖ������Lռ=�~� �ư!����� ȆWc��ԁY�I0����2r���(�ӛ�ձ����X��7��T� �&�Gb�GC�� W� xu ��&�` Ѭ��g��ɧ��vԬ4"3� �ԝN.�pډ��B*��kk�#��Z��Ы�jG� Ҵ��U!�.�W�̀���@Ӏ����6 c>�<��ڠ%҇EcJ����ꩿϥv\���˽��Ѐ��h8mk�� �������:PyϲPR����7n/����('���Z#��"S��s���u���p��"\����Z�� L��Q��N��N ��J��#_��`��\��V��� ���V��^��M�[�� ��g�%e�� ���� ��k��\ ��p����� t���y��S"��#U���%[ ���4ll/����:LKKKKKM�����������it32��K����������Ÿ�ޤf:zpbbQNOQaSN _bgwWZr� {Őu[, � 2 �  <Rgj�Dž\!�!$�)Bu� ɘf4 � 0:� .Ye|�ݚlN2 �GM �zwlM� ͑J%�_a� >A�H=kӸu.� })� Y A�?DӤ5�,?� 7k� A½�n:, �"R<�>S�'9 ��$?v�U� cx� Ja�'R�Z�� >Y!�_y�8}>�w�8 � V�2"�l^� ;�`4� L(�EM� t� &w�̯* �0?�Pd�4x�8٭�� ]�ğ� k�ƻ�v� p�㯈� 'N�?̩�1� ~� 1�!o1� )�P2� ͈� H*� ?L� 2c� @F� -ӓ�bA�-(�%7I���N(� P�h �p4 �48k£� h�� 7l/�� ��ہK � ۡi�Hȟ�w9�yR� <�� �� `Ϗ�L|j2�!�( � *V#� t��! )5�"f,�8ҝ�F� b. � ��?5xE�  %N�cl�uq�z1� 3 �{Q<9�&m�t�� Bݻ`�!�pFm� n%�,Zߙ�x� tI �9 ef �  Kѐ�=�_$� 1k8 �q3�  %1�E�w!�3 Ղ� lΘ?�E�»�0 �VI-ܲ^� US�X�� xB 1�7e$�ȓ�̊c�VτА!x  9? �|�­�o՘h ��xk�"Iph1 �+Ť�By�r7FsxD'�_g�%}o�o(`�-n'�JDŽG�nD0�I� )�Mv' �97�x RU� emkou-� b&?]lon`A� d|#ٌ�\uN/-1Ah+�U 7.Cb}YG1.(()1Yn ΋�j"�B N 5ɹN� �3�J ɚp8&bҫ Y!�KH��n ʭ "�� �8 q��ig�q���HH�j�Xs��;yŷE �;M�ا �CѸwed_W@�%K��m Ǐa1�L�u� PL�;߈�u�  9݉0 �2ƈ�e�7hƂ< �,�jQ� .d > �%�I8� !>e ۾lG*�n�2'� 0H|ٻpX5�n�2'�-Je~ʹkN/ �Q�=$�� #.8OlªmM>-$ ��H� Y 2Mq ضbH2 H�X-Q ϝP<H� Y!=cz�ճb>H�]*>T{ıt^J,H�b'� ;b̷eB-�K�2'� +Mt װe> �n�F6� #=So̰z_3  �n�ZE� .AYkʟjI4$ �!�nT� C⾋F" �(�nT�O�ՌF�1ˆ�q�Lޏ�2ˆ�� ;V{x$ � @؈�Ș� +ST!�J��Rqɍ�)5�N.� iq�Qj�]Z�^8�l�}�,��h ��» �( � ߊ� � K ֠*GE�-JԊ�=�ކ K(<am� Z]� U^ #ԺȟYy �#jܪ=  &~� GۙF,N{R.V9�Y ـE/#*N}T�(.e`�� h ID�cZe7 �n-� I;�o[o�=_�kډK.̏�zR/�1s+�Fݞ'8ڐ�HP� rه�8ǵn8��8n��bQh欮V�  �qВ�ž'�& ښE5c o�9tܓ�bi� j 㼊-9x Z@vU�{��$ @��c�  (3�!ݔ�h�"O�x@U1� �@� Z1�>:l,�8^n� 3ޗ�Z,� 2xH�>x)}9� ${4�^�t� t7 �E$J� 8ԓ� 8š�NB� yd �& g� ~Q� XK �Oi̛�� -t:�c [ J �/Q� 5r(�5؜�t� `% �H ]'< 0�� M�#cq��) �1V�@ (�#�G�U3�7ڠ�N�$^�4 %���Fz4�L{<�̡� eV��5je �!-�� (X �  !�E�kb5Efy(�qϚ_ �] � ~>�8z}DEf�{yHM�G � i7� n(�'=W�x�Z;� 4�c� �jaJ�"‹!��[�"�j^J� .L�l֗�T�Yv�jb'�1�_ʃ� M�2{�# � 4�PY� =$� /�m�1X�67� FP�#X�O�('�$u� J�Y�i2� �ez� as�4{�Q�V� Lb� x �G� ] � �3K�w ?��V� 餗n8$�&7�"YxIbͬ� {qd5{]�u$� "Zxsowm�i).x�kZ� *7Jd�~Q7P �FD�@� sܶg:#�&+� 39� rpN:) �i�  8Mlk6�!ښtP1- : 13:n�Ǧoo\JNoo�̪ffUDff����������܅� Ȼ�(Ŵ�ưĭ �ʸϲ � ʿ׷ ˾� ׽ܻ ޴�޿ο Ȥ�仧ɱDZ ܽ�˸ϲϷѲ�­ ӻٷ߶�׮؀ڹ�ڷ ιŭǸ�Ŷ Į˵ ;�۳؁ɴλ ;�۪ڀκã ˼�Ϧڀн ˥ށĵ�ݱڀ£݀Ҫ܁ܾڧ�ցã݁ԯ݁Զ�Ө؁ţ݀״݂ʮ� ֤̮܀˂݀ ڼ܁Ա ˲� ȭּ܀Ӫ݀ ǧރն ɼڟ�͹ŷ܀ ײ܀ͩ݃ū׽�賧͸܁۾Ԃ ӭ܃Űˮ� ï܁́݁ٲ݅Ǵ ۷̿�ͣ ܂ױ݃޷ރײ ¨ݛ�ׯۀι܂ë߽݃܃Ʃ Ϯ�Фȶ܃ϱ݃ü߄ܻĦ�DZս܃ܿ݃ޅիǰ�ή܀ «܄Ǵ܃ރȣށɳݕ�󵨤ف ʵم܃܃ֻԸ�᪥܁ ܆�ؐ Ѱڃì�ɣ܃ŭ݅ܐ ͪ܃׳�㨦ރԾܙƨބĥ�ˢ܅՚܄ʫߑ�͸ˀޅؚ܄м�̩ށƺ݆ܝކŭſ�˼݃¦ܱɵűݍ�ހ܁Ȯհձ î̍� Ŀ݀οޮڼ �׼ĵ܁ ͼܮӲºվ�̯ނ Ͷެı߀ʶڋ�܂ ƾܪ܆ށ�ށ޹�묆܂ہܪ؀܆ۇ̬�েڅ٬ڑ پ�ˣއ�܀� ɧ��܂ȼ͉�尥ĵ�થܿĿ�؍ݿĺ�΢ܻ ƶ�Ρܵ°�ȡڶ°�شȳو�ܳ Ƚ�ˈ�� ܵȾˈ� مܵۃ܀� ܁�ہĿ�ĭ߀ۀ܁ Ǻ�IJ݁��܁ȷ� įހü�ůۄۃ܀ ƾ�Dz ܀ހ Ǽ�ܷƼˈ� ڶ ˈ�Ľ ܳȽӈ�¡ܳõ݈�¡ܵ�܀ĵ�ܹ͡ī�Ӣ ܹ�ۥܿӸ�嬤 ũ�ށ־Ɋ�ţׇҲ׊�Ѥۂ܄ڽ�肦܄Ѯ�܀݀�܈ܪ ȯ܄dz�ނܪ ҵ݂˼Œ�ťڀǹެ ׿ـ܀˳Ҍ�ߩǵܮ ղ܁ ȹ�Ⱥݮ݂ͪ Ͼ̍� ̰ܱݽ߄ĵݏ�Ⱥݾ܅ܜ܆ͺ؆÷�̹װއܜ܆Ʈ؀ Ȯڐ�ޅܙ܄åĽ˒�ߩބŸܚބԸ �ݲ݃Ȳܚо݃ɪ�ʥ܁ ïޒ܄ں܃ظԔ�骍܁ óߐ܄ Φ݁ϰ�ɫ܀ Ϸބ܃܃ ڴ܁į�黪°܃܃Ѱރݼս�Ĵ Ѿֿ҅܃̫܄ ±ۀƱ�̣ ˲݄ӵ݃é܃ɵŤ� ̻օȨ݃޼݃˶ ض�䭤 ѿ܄ɺ݄ڃ˶ ϭ�Ω̺܃ֹ܁ ׯ݂ʶ۾�鲨͸ޅʮځӬނȴ ͮ� ۿ˺܃ Ѯ݀ ɨނ� áҼނί݀ §ۀ ʭ�Ŷ݀ۀȺހںڴ ڥ�Щ܁ĵހٲ׭ڦ�Ь܂ҳ݁ԫ ѫէ�ƾ݁ĭ ̧ Ψ�ž݀϶Ƥ ͩ�DZۀ¬£ Ϫۯ�ݰ ҫ͹ ԭ�ˬ ڹȱڂ�Ԯìހɵ�̳Ҫ Ҿ� ΌӺ о� ǩϨ͵́ ʳ�̰׮Ű� ȵպ޿� ̱ĥܺ �·մ� ʺȰ� Ϳ ʶ� �Ƃ�݈����������� �ɀƽʀ� ɂƱY̓ � ʀɄƣ,τ ʿ� Ɉđψ ʻ� Ȁˈ|}ω CDd�ؼs05lˇϷZfԊ Ճ<J�ʾTFˆͪ8LԊ աM� t�ƼL��1΄ɚ2ЊѭU*�ٺ{8� h̓ŏ�#}ˉѭU��Ʉ�Ӄ Ծ~��hˈՠL�fԀ�Ɇ]�7σ ԧ[��Wˈt3�LԂ�Ɉ̍� [ˁԘE�Aˇ;�:oԄ�ȉͥ�IˁҎ7�6zˆΡ"�7lԄ�Ɋ�:ˁx�'_˅ͼ>�BwԆ�Ɍ�2qˀϺa �<φϮN�Yԇ�ɍ� +eԦP� +ˁԲX/ �rԈ�ֶό̵� '^ՒD�̀Ĝ[$�χļ�Ɩ̋ʦ � "U|8� éW �B·ή� Ԏc8ˉ̉� <X#� vԻp#�΅ գ==� ɤ2tˇZ� "?� LμA�̅ ʵcHwڟ�мi4Z˅E� / �7|�%W˂ϸg)v�ʬ&7̓ͻ1� nͱ�!̫3�X˂˵{?=�ȁ { X˂˴�?Ι� i�NӃ ɮU� сԜ�ȃ H��'iˀʲ�f ��ς ӱr� ]˄�ɄӗL��5˶%�ZM �pt�Oˀ ϽtF��0̅�ҹm�  Kͺ/�2<�]w]� xɷ@�"V˅�ȇӨ]� vI�p�;L<� ʹd�Uˆ�Ȉ˥2� bs�$O �!� Kһ`3�Fˉ�Ȉ†�Cէ�8� � ~lj; �Њ�̋˷G�>o> ��� +â{8 �\͊�ʃ˄φ&�$Vj� 7ўd+�ό�т˂]�p3�Pv�[͎�qẃӪQ��*F� A̋�ƗnZC14Pj́8� � �.xˋή^�ȫO �R~ˁѪq� Wˌѐ)u�̤�bπ̻8�Iҍ8\�ׇ2�Jр͜�Մ́ Իj]ݍ� [.Ysuqc*� 6l\�|Ưwtv̶}V�f� kX_)� ;yՉ'�%zeMB?AKdH(��s�߽΃U� ;W$�\C� '4@B>&�B�̃Ϲ�  (NqƬ|�@���֋�΀˃r �'=OC� �?�͡$�##�� q�ɇp� I�ɈμC�Gvρ�Њҝi� "#*5Ŵ؉�͊Ͼ6� #8P\kx{˂�ѿt� (X}˄�ȍ̉� Ǒ�Ȏ̝d%�\ˏ�Ǐ{S=# �+dː�ȌʁǥyH&� Ḿˌ�ȊӀxR,�/Isˉ�ȄЀʹfO, �2LpҀ΄�Ѐȼ|gN5*$ � (8Ncwه�ƽu\G2� .CYsׇ� öoP0 � 6Nzׇ� E�  !Kׇ� ʲ|hT5 �  ;L]{ׇ�þjQ;0& � %,;Qpׇ�Ӏ ̼|U;$� %5Oy؈�Ȃр ĨmY4� <Rx̀σ�ȅʁoU3 � $=Qh}΀́˄�LjɾvX7� %Hu΀ˈ�Ǐ Ȗ\� 0[ˎ�ǑΌA �Xˎ�Ǎ ϻB� Wю�Ȇρ ǸhA�#j͌�Ʌ þ^8�ϋ�ɂ εo[NB8,�(Xˉщ�Ɂ ͹v �pˉߊ�ɀʀU�$Έ�ϪR(�� xˇ�J�� �$φ�ˍ �(+ �IdA�Oυ�ʼ@��]S:� )κ{D�?uڌ�ƭ�"4?HG@0)  ,KR0� jȱx@� BȺ�ӻ� OcMC<=Jgх� ԹN� cfM�լx��K~ѷ'� 8v� >ݍ� ޴x�;˄ T �qʀɑ/ �[�鿁q͈ʀο#�8πлvM�\�Ȓ΍ѧl����Qˁӹ:  Jڐ�cˍn� � �]ˁʟ\F6(7Yr�ɍ~2�Ru �?>�&́�ɌͲJ� O|� *qK' �H͂́�u�4[١j�� m7�ˌ�ˊʯ&� ^}H��� �5ʫK �2͋�ȉϵU� -U!� �ha�ȅ.�]Ӊ�ɇѾ�:bŀҵ4�L!�+<�sŸ~8�r·�ȆЦ]� *k՘%�i/�:f � `ǰj' �Rˆ�ȅm�ÀW�)H �Yկ"� HΠ7�!T̅�Ƀ i.��;zˀϭ�Ia �wf �?ԁ ѽ;��̈́�Ɂ ͪ' �(lˁ_�H�Υ�>Ԃ o$�1͂�b @~˂ϻ#�њ�<�Cԃ ʴ|C qЀ�ɥ# 9σΛ\�CϮ�"`(�MԅʇD7�ҴI�>˃ԣR�'3�FԒE�hԇӹ(g� ӣt'x˄Ѳ5� 3S � _ϬU�Ԉ ̹d/E� ϓwh˄p� %O~e*� Ϻd� щ ̢if�͒ˆʹ-� Yw5� r�ϋӰ�ψ�%ρգN�ˀ|#�(̎�ȈҶU�/[˃и^�9ˀσ0�6ύ�Ʌϩ/�2ͅs�Ŕҋ;�8͌�Ʉͥ&�`Ά$�)bˁԑD�1ˉ�Ƀ ˢ&��$Έԏ7�<ˁӝ[�͉�ǃ Φ&��͉ԤW�Mˁϻ�Ӈ�ɀ ѱE�̉ Գn��]ˁ˺L�G΅�Ҹ[�%ˉҺz�h΃}�%qˁ�… �3ˉÍ�!~τI�/kˁ�ʽ02ˊ̤$<ӆk;� H�̝͊ϲJVԇǶ1� "i� ׾g5~͊й_lԇʵj^UWq� ӵs9Z̊оt Ӊ ø�ʉȊǔϊ� Ɂ�ɃɭG˄ɀ � ʂȸuʃ �Ѐæʀ �ނ�݁����t8mk��@���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`�������������������������������������������������������������������������������������������W��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������``����������������������������������������������������������������������������������������������������������������������������������������������-- �������������������������������������������������������������������x���������������������������������������������������������������� 0������������������������������������������������������������Ko ���������������������������������������������������������K����������������������������������������������������������������������������������������������������������0��������������������������������������������������Wo0������������������������������������������������W������������������������������������������������������������������������������������������������������������������������������������@����������������������������������������;��������������������������������������������������������������������������������������������������������������� ��������������������������������K?��������������������������������?K �������������������������������?����������������������������������������������������������<������������������������������������������������������������������������������`���������������������������������������������;��������������������������������������������������������������px��������������������������������������������������������������������0���������������?��������������?��������������<?��������������?ϐ�������������?�������������?�������������?������������������������p��������������������������������������������������������������������������������������������������8����������������������������������������������������������������������������������������������������������������������������������������������������������������� K�������������?�������������?�������������?�������������?K �������������K?���������������?���������������8��������������������������������������������������������������������������������������������������������������������������������?p���������������������������������������������x�����������������������-����������������������������������������������������������������������������������������������������������� K������������������������������?������������������������������� `��������������������������������8������������������������������������������������������������������������������������������������������������@p����������������������������������������p�����������������������������������������������������������������������������������-���������������������������������������������0o<�����������������������������������������������0ϐ��������������������������������������������������<���������������������������������������������������-�����������������������������������������������������8?�������������������������������������������������������`�����������������������������������������������������������<�����������������������������������������������������������������������������������������������������������������������������;������������������������������������������������������������������@�����������������������������������������������������������������������������������������������������������������������������������������������������?�����������������������������������������������������������������������������������������������������������������������������������������������������������������??����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Resources/fits.icns�������������������������������������000644 �000765 �000000 �00000136621 12350653200 024500� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������icns��ics#���H?????????????��?????????????��is32��y ���¾͢� zrgΰ� ˻ݻ� ȄĞy�  @.-Ά� (Z@� .$� C � n7e� B�0H� �-/$ � "Z^?:SK\l� ���¾͢� zrgΰ� ˻׺� ͚y� ˭Ά� պ� ӱбꣁ� ڵή� ϳ� 滫� � kv� ^g� JxwyxxzvV� ���¾͢� zrgΰ� ˻ֻ� ˚y� وVbΆ� }��@�`�ꣁ�T�� 2��U� w���ЀӒ� |狁�fq�s8mk����`````c>��������Le�������Le������Le�����L=����Lh����Lg����Lg����Lg����Lg����Lg����Lg����Lg����Nj����7J���� ��ICN#������������������������������������il32��:�}}ytlm�ǿ,�° �5[(}<ɼ �&H<0ġ �3٬E6t3ʫ �בȔ݋zβ�Ӻmep�ơ}}~�r� (ǵ-�[�[�J�=�é'�\��`n[��ѹ+���,�e*�cjv\I\/��� ?�/��L f�/���F ��3�: I�3����Ql3���MVґ&R�3����~��3�U&� F%8�zel8��8� ^a_a[b[_`bddcecbd[�#e_taUrrk�f)Fv�%|ejqcU*{eP|u}o)����7�����}}ytlm�ǿ,�° �5[(}<ɼ �&H<0ġ �3٬E6t3ʫ �בȔ݋zβ�Ӻmep�ģ}}~�ƣö-�é'�éɻУѹ+�࣠DZ*�ƾۀ ӻ/�ńɴ/�쫷׃ͽ/�𤢶ځ ʤ3�ڀ з3�ۜѧ3�ί3�骘ʤ«ɏ3�ð8�8��ڂ8� ̂ʀ˼*� } !�ȶϮκԷ۵!�Ⱥ缊!�곿!�kqlm�lm ps~qloq���}}ytlm�ǿ,�° �5[(}<ɼ �&H<0ġ �3٬E6t3ʫ �בȔ݋zβ�Ӻmep�ģ}}~�أȣþö-�B|UnZé'�zI@M�vѹ+�ޢ� %m*�63:�KRp/�.�`/�S� F/�\�3�)�V3�Ÿ�I3�tWP��$�qN3�찧4}Ǯ3� xtX8�8�8�݂ނ/� € *�ӳ*�ر*�ҵ/� ��l8mk������*;;;;;;;;;;;;1���������������� ��������������������������������������������������������������������������������������������'��������4��������5��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������6��������Կ*�������� 455555555567<=;86555& ��������������ich#��H����������������������������������������������������������������������ih32��\�D41)+/�ԁ¿x�ºs�wžs�xoAOʰXMBAh@żl�x)Rݑա {|óͻl�x22CȺl�x15 kʿk�x'lń1?«l�xrb^bOůl�xɳw�x͸xbYX\el�xп{}~U�xuMLLtʺ�|f<���jþ�|D��,����Ež� |H�v���p��Jʗ�~L�w��Ǫ$S��t�Mԡ�~��VJM�ڦ�hX�jj�h߭� �$>铳Iᮋ��� ˑF�沋�Y�W�Z賋�N S뷋�R�Ed�W�{��8Ā�z�v���j�U1�e�� \���I�@ʻ�M}��~��HD���"‹�~ ��7���R�ċ�~Z^�D��g4\Ƌ�~܆.��,yƋ�~Ƌ��ʋ�xم؃׀�ցԁܪ� ;��6��@�� �y�cd���`H>@�]�1i#�PH�[�o1���Wx>j�pP)�Nmg4��Vic:0 Cdo�7�A,]�N_�s�,?<u�Px}�o�q�Vl�����D41)+/�Ӏ¿x�ºs�wžs�xoAOʰXMBAh@żl�x)Rݑա {|óͻl�x22CȺl�x15 kʿk�x'lń1?«l�xrb^bOůl�xɳw�x͸xbYX\el�x п{}~U�xɿʺ�|õľ�|弔бȚƔž�!|绕נʗ�~쾘ʮܺЖԡ�~ؔغ۶ثڦ�ûڀܿ߭� 䧯˴ڂ͹⮋�Ԓׅ Ƿ沋�Đ؅ Ϫ賋�ڇ ȭ뷋�Öڅ ׽�А؅ Ѡ�ڂН�Ş؀ܱ�֒ǻؠ�ŷ۴ϖÑ�~챞ڶء˔‹�~뫏˳̗͑ċ�~ƿƋ�~ոƋ�~Ƌ�~Nj�|��Z}�Q z�!Qթ粭ʴϹěz�!Qz�!Qаz�!Qܯ¼̰̗ӨӲբګӨz�U֖}�F~wut vx}|tu|i� #��D41)+/�ԁ¿x�ºs�wžs�xoAOʰXMBAh@żl�x)Rݑա {|óͻl�x22CȺl�x15 kʿk�x'lń1?«l�xrb^bOůl�xɳw�x͸xbYX\el�xп{}~U�|ʺ�|ml ľ�|±�l%}ž�|깲<��>бʗ�~ج8�v�S��9ԡ�~|�S�[X�ڦ�%NB� Cɶݭ� o�b� $�+ l᱋�v� &Z沋�¿O� 賋�j� l뷋�ر^� E�e2� �}� ;���}S� l��ȟ�%M��Ʊ�Ѹ4Y�.�a��V5�~Z�^�0˔‹�~gЮS žċ�~ e¹W<Ƌ�~ ʹƋ�~Ƌ�~Ƌ�|� i¿˞�i̾ł��ɝ�!iѿȝ�!iǝ�!iǝ�!i߿ȝ�hǁǂџ�Y �*(�h8mk�� ������  ������������������������SD����������������������lT�������������������� uR�������������������wR������������������wR�����������������wR����������������wQ���������������wR��������������wR�������������wQ������������wP�����������w3�����������w ����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w����������w���������� x����������� aޝ����������� #ASTTTTTTTTTTTTTTUWZagfc_[WUTTTSH-����������� ��������������������it32��P�������߂�݀ րΤ��߂ڀ¿���ހہÿ_����ހہ¿+���ހہ¾0��߀ۀր-��߀ۀր*���߀ۀր¾*����߀ہ»ʿ'����y���ڠ�Hÿʿ'����y��ܾ�Vʿ$�����v��I+րüʾ!�����&v��fƿʾ!�����v�ۀ¹ʾ��������ۀüʾ�������� ƿʾ������w� ,ʾ�������Y�gۀºʾ��������-��ۀ ûʾ������€�ۀ üʾ����� y���żʾ!������㦃��wǾʾ!������䈁�xʾ!����ʾ!����øʾ'���!ùvnnʿ'���$Ļ{slifddegimptʿ'���$Ƽxsnljjklnqsvz-����zwts ttvy|~0��ú~|} ]����ž Ɇ����º ��ƿ ��5ijvzw|��rA�> ��4c؄��j�#�dy �� dt]�@�`4Hʁ�� m��5e�1�Fу ¿��9��Z�G%��+ր ���.3� �F�u܀�ڀ¿��ߌ � Z��$�`5�\��x � k�� D� �TÄ��m3�9��Bn��;K�y'YDŽ�� �Lh�d�e�(z�Fy�rʄ����,�{$� �  �� ΄��A�i��xx�T-�J9�ɀЄ���!P.�UL���Y҄���f$a�H�Մ��{��� " LH�Hׄ��AX �^�U ڄ��v����0e ۄ��|E��"COeT!F& ܄��#�=: lٻ ݄��� ț4�Wބ��N�d�b��2߄��$��龛m� ���ۃ8����W��t� �� �'=yvQ/��W���� IwմX% �C��� q$fƘq5E��pgة|0B���� !Hm ȟuS-��H�� �AlۆG ��[�����p�w����%f�����%�j� ����O��<Ɂ�0ʀ������Ё B�T�����kѸꨖ#}Q�������1[ AQL)3K��)﬌����X� ��a���f�^��H_���}� $4 H�<����� `9C?����� L(��H�}��S���F�"h ��L��L9�ʄ����(�t �  ������ �Kk �ML�f���Lt�t�����r-�'\��An��Ig�+R����-� A��1B�_���� � !��(7�W���� � ��W� x����3��r�\�[ ���z�eb�7h� .� YՀ���c�A�7R����zw � !�]���q5�? �$\���߹ron{���������������������������������[��������@�0��`�`��`�`� @�����Ђ�Ѐ��Ђ�Ѐ�@�� @�0�@�0�@��@� @@0@ ��@ � @@ �� @�0� @@ ���@�@�@@�@��@� ��0 �� ��  ���@�@�@@�@��@�"���������P��@�@@�@��@�*�������������������`��@�@@�@��@� �����`����������@�@�@@�@��@� ������0 ���������@�@�@�@@�@��@� ������p@������Ё@�0�� p�@�@�@�@�`��@� �����������0����@�@���@� ������`��`��`�� 0��0`�0`��00�0`� ������``��``��`����0�0����P���`� �������������߂�݀ րΤ��߂܀Հ¿���ހہÿ_���ހہ¿+���ހہ¾0��߀ۀր-��߀ۀր*���߀ۀր¾*����߀ہ»ʿ'����y���ڠ�Hÿʿ'����y��ܾ�Vʿ$�����v��I+րüʾ!�����&v��fƿʾ!�����v�ۀ¹ʾ��������ۀüʾ�������� ƿʾ������w� ,ʾ�������Y�gۀºʾ��������-��ۀ ûʾ������€�ۀ üʾ����� y���żʾ!������㦃��wǾʾ!�������䈁�xʾ!����ʾ!�����øʾ'���!ùvnnʿ'���$Ļ{slifddegimptʿ'���$Ƽxsnljjklnqsvz-����zwts ttvy|~0��ú~|} ]����ž Ɇ����º ��ƿ ��5��#̺؄��(ɮŭ �� ȹвϲʁ��ȩͨۻǡс ¿��ᷣåĤլր ��֪ ذΧٳ܀�ڀ¿��ӧ8ܸ֭װ��̥ݼܴͧÄ��Ҫ£޽۵DŽ��ּۨ,ͥǡ݀ʄ���DꬣʮجϦȦЧ΄��.𺢦ؼ޿ոڮ۱Є��ԥɯԵ΀ ̤҄��ꬣػڂ ޺ϨՄ��Р܀�܅ ٵ۵ׄ��뮲ɸڊŤ ڄ��տʩހ�܌�܀ӫ ۄ��Ҵݒ۳֮ ܄��箨IJȥր ݄��֡ܒ܀۰ބ��򿣁ݙ ֻ߄��򲤁ܛĽ ���嬥ܘ°��ݩؗȨ̀� ��ЧӘξ�� Ӣܗ¸���ͫۀ�ܞǿ��̪݀ܝ݀�� ѣޘۀ ɿ��ԧܖô����ۨܖϽ���欤ܗЫ���� ݜϬ���� ݁�ܔ݀ƣ�����٠߀݂ܒڴ���顼ܑƣ׷ԃ�����عݒ۵����ʸ߀܋�܀Ӭ��� ܉Ƥȹ���Т ˰݅۵����流 ֺڂ�Ӏ ۳Ѫ���֤"ʮڳá���/ּ֧˦ڱ���.쭣ɭӪЦ˦ѥ���� ۨӽ۶Ǥƥҿ́�����ѩ׹޽޼®���Ϩܴͯݴ���Ц¦լ۱��� ګЧ ͨݸ���� 굡ᾢŤͦ��Эợۼˮ���ǭĢҲž����ŨƬ���͵�����������������������������������Ԧ��֦��֦��֦�����Ȁ�Ȃ�Ȁ�ȁӼ���؁���ӱ�� Ӏ ����ӦӦӦӀހޱޱނ馦ށޱ��ށӦӦӦӀ"ӦӦ馦Ӄ���€�ހӦӦӀ*㬦馦馦郦���ӀȦӦӦӀ 馦馦馦馦馦郦��ӦӦӦӀ 馦馦 馦馦馦�郦��ӦӦӦӀ 馦馦ͼ馦馦馦��� ͦӦӦӦȦӀ 馦馦馦馦؃��ӦӦӀ 馦馦馦馦ރ��޷ȦȦހ޷Ȁ ئئئ馦ȁެ��æ鍦��㍦���Ӄ����ȁ���֦��xE1,,%�%4DWgx{naP9(�����������߂�݀ րΤ��߁ ׀Ԁ���ހہÿ_����ހہ¿+���ހہ¾0��߀ۀր-��߀ۀր*���߀ۀր¾*����߀ہ»ʿ'����y���ڠ�Hÿʿ'����y��ܾ�Vʿ$�����v��I+րüʾ!�����&v��fƿʾ!�����v�ۀ¹ʾ��������ۀüʾ�������� ƿʾ������w� ,ʾ�������Y�gۀºʾ��������-��ۀ ûʾ������€�ۀ üʾ����� y���żʾ!������㦃��wǾʾ!�����䈁�xʾ!����ʾ!����øʾ'���!ùvnnʿ'���$Ļ{slifddegimptʿ'���$Ƽxsnljjklnqsvz-���zwts ttvy|~0��ú~|} ]����ž Ɇ����º ��ƿ ���5��#ȕ؄��(Wɛ �� ݆2CπϹ/҂|+ʁ��Ⱥc��;Ң |ӂҧLу ¿��`��_Ԇ�ZˁՕր ��Ȁժ�a�7̀M�܀�ڀ¿��Ȃ8м�;�Ҁ���уи�xз�վP��7΀Ä��p΁ӡ��bԚ ��vҞ/�$ԺhDŽ��ёzҀ}�8z�Oڬ�%jѕ+jʄ��� R�Cg�V�2K�%Nӽ_0΄��ѻ%�yi�m3�� Ԓ(� Є��ɀӍ�L዁��7� =ֽe ��è҄�� R����ޔ%�3ρՄ�� ҳ�JC� c�Ճׄ�� ֒Z@LՁ�� �V˂ˋ ڄ��h�GJ�&ة( ۄ��<dW�*ܴ� ~˗& ܄��﷿ϝ4�]t�#1]  4D7 �M݄�� ָ�*M� � ބ��ȁ|���~߄��Ɂ]� 2M[v ��ɂH�b��Ƀш?�K̓߀� ��ïj&�:qـ�� ɷmC( � !;c���xX3�,Rp��yO$� Di�� õrN2� +Lm׀��˵xK � ^ہ����ɂd �3t˃��� γ{*�2҃���� ѺxZM:�5Ё����ӟ*�T̀�����̺#��<>� ����r�"5,��EQ�Sӳh�η����� >Ķ�ѲL� @Z<q���� ?F�#c�>���̓ԁ��� V͔S=O}���ɃҲ�B1�/W � م����ɁO�Ѣ��"�)�-π���Ɂ ֑��Fb�*� >� ^g��eˀ���ѹ+�y"�d?�ő�Cё,���� O�Ip�&[�.)�@e,���� Б%vӏ� x��Qg� Tђ,p����� jѯ�՛ ��uӐ��zԁ׼a���πa��;и!�Ҥ�ӃЇ���0��d@�Я�ӂ܁��� (�.с b�92�ց����<�oقԅ�XԄ��:��u�|ׂҠ z_ �C���8QˁϹ,ӀԢN2g����їUʀ���ˁ ��� ��������������������������������ʄ��ʄ��ʄ��ʄ���׀�ԁ�ހ�ނ�ހ�ށױʄ������ʄ�� уу�с�ԁхʄ��уʄ��ʀ"ʄ���ۀ�*ʄ��� ʀʄ�� ʀ ʄ�ʄ�� ʀ�ԃʄ�� ʀʄ�� ʀʄ��Ԁހ ʀށ̓ʄ��ʄ��ʄ����ۍʄ���ށ�юʄ��ʄ��V>86-� -?TivcF2��������t8mk��@����������������  �������������������������������������������������������������  �����������������������������������������������������������E ����������������������������������������������������������  9 ��������������������������������������������������������� ,n �������������������������������������������������������� %6| ������������������������������������������������������� *>Y �����������������������������������������������������.EZ ����������������������������������������������������1I[ ���������������������������������������������������3KZ ��������������������������������������������������3LZ �������������������������������������������������3LZ ������������������������������������������������3M[ �����������������������������������������������3M[ ����������������������������������������������3M[ ���������������������������������������������3M\ ��������������������������������������������3M\ �������������������������������������������3M\ ������������������������������������������3M\ �����������������������������������������3M\ ����������������������������������������3M\ ���������������������������������������3M\ ��������������������������������������3M[ �������������������������������������3M[ ������������������������������������3M[ �����������������������������������3M[ ����������������������������������3MZ ���������������������������������3MZ ��������������������������������3MZ �������������������������������3MZ ������������������������������3MY �����������������������������3MG ����������������������������3M'����������������������������3M$ ���������������������������3MD ���������������������������3M' ��������������������������3M0��������������������������3M7# ��������������������������3M>( ��������������������������3MC, ��������������������������3MG/��������������������������3MI1�������������������������3MJ2�������������������������3MK3�������������������������3ML3�������������������������3ML3�������������������������3ML3�������������������������3ML3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3MM3�������������������������3LL3�������������������������3LL3�������������������������3KK3�������������������������1II1�������������������������.EE.�������������������������� *>>* ��������������������������� %6Ygr~µ~zti[I6% ��������������������������� ,;IU]befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb]UI;, ���������������������������  ,6>EIKLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLKIE>6,  ���������������������������%*.133333333333333333333333333333333333333333333333333333333333333333333333333333331.*%����������������������������  ������������������������������  ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/MacOS/keepme��������������������������������������������000644 �000765 �000000 �00000000000 12402075701 023015� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tcl.framework/�������������������������������000755 �000765 �000000 �00000000000 12634602226 025537� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tk.framework/��������������������������������000755 �000765 �000000 �00000000000 12634602226 025373� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tksao.framework/�����������������������������000755 �000765 �000000 �00000000000 12634602226 026076� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tksao.framework/Resources/�������������������000755 �000765 �000000 �00000000000 12634602226 030050� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tksao.framework/Resources/Info.plist���������000644 �000765 �000000 �00000003503 12547557226 032035� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!-- Copyright (C) 1999-2015 Smithsonian Astrophysical Observatory, Cambridge, MA, USA For conditions of distribution and use, see copyright notice in "copyright" this file, and for a DISCLAIMER OF ALL WARRANTIES. <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>Tk</string> <key>CFBundleGetInfoString</key> <string>Tk AQUA 8.6.1, Copyright © 1989-2013 Tcl Core Team, Copyright © 2002-2013 Daniel A. Steffen, Copyright © 2001-2009 Apple Inc., Copyright © 2001-2002 Jim Ingham &amp; Ian Reid</string> <key>CFBundleIdentifier</key> <string>com.tcltk.tklibrary</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>Tk AQUA 8.6</string> <key>CFBundlePackageType</key> <string>FMWK</string> <key>CFBundleShortVersionString</key> <string>8.6.1</string> <key>CFBundleSignature</key> <string>Tk </string> <key>CFBundleVersion</key> <string>8.6.1</string> </dict> </plist> --> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>English</string> <key>CFBundleExecutable</key> <string>Tk</string> <key>CFBundleGetInfoString</key> <string>Tksao 7.4, Copyright 1999-2015 Smithsonian Astrophysical Observatory"</string> <key>CFBundleIdentifier</key> <string>com.sao.tksao</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string></string> <key>CFBundlePackageType</key> <string>BNDL</string> <key>CFBundleShortVersionString</key> <string>7.4</string> <key>CFBundleSignature</key> <string>Tksao </string> <key>CFBundleVersion</key> <string>7.4</string> </dict> </plist> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tk.framework/Resources/����������������������000755 �000765 �000000 �00000000000 12634602226 027345� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tk.framework/Resources/keepme����������������000644 �000765 �000000 �00000000000 12402076007 030517� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tcl.framework/Resources/���������������������000755 �000765 �000000 �00000000000 12634602226 027511� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/macosx/SAOImage DS9.app/Contents/Frameworks/Tcl.framework/Resources/keepme���������������000644 �000765 �000000 �00000000000 12402075754 030673� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/2mass.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000006512 12544316735 016276� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc 2MASSDef {} { global twomass global itwomass set itwomass(top) .twomass set itwomass(mb) .twomassmb set twomass(sky) fk5 set twomass(rformat) arcmin set twomass(width) 15 set twomass(height) 15 set twomass(mode) new set twomass(save) 0 set twomass(valid) 0 set twomass(survey) j } proc 2MASSDialog {} { global twomass global itwomass global wcs if {[winfo exists $itwomass(top)]} { raise $itwomass(top) return } set varname dtwomass upvar #0 $varname var global $varname set var(top) $itwomass(top) set var(mb) $itwomass(mb) set var(sky) $twomass(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $twomass(rformat) set var(width) $twomass(width) set var(height) $twomass(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(mode) $twomass(mode) set var(save) $twomass(save) set var(valid) $twomass(valid) set var(survey) $twomass(survey) IMGSVRInit $varname "IPAC-2MASS [msgcat::mc {Server}]" 2MASSExec 2MASSAck $var(mb) add cascade -label Survey -menu $var(mb).survey menu $var(mb).survey $var(mb).survey add radiobutton -label {2MASS (J Band)} \ -variable ${varname}(survey) -value j $var(mb).survey add radiobutton -label {2MASS (H Band)} \ -variable ${varname}(survey) -value h $var(mb).survey add radiobutton -label {2MASS (K Band)} \ -variable ${varname}(survey) -value k IMGSVRUpdate $varname 1 } proc 2MASSExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set var(fn) [tmpnam ds92mass {.fits.gz}] } # size - convert to arcsec switch -- $var(rformat) { degrees { set ww [expr $var(width)*60.*60.] set hh [expr $var(height)*60.*60.] } arcmin { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcsec { set ww $var(width) set hh $var(height) } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] if {$rr>1024} { set rr 1024 } set foo "$var(x) $var(y)" set var(query) [http::formatQuery objstr $foo size $rr band $var(survey)] set var(url) "http://irsa.ipac.caltech.edu/cgi-bin/Oasis/2MASSImg/nph-2massimg" IMGSVRLoad $varname } proc 2MASSAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the 2MASS This publication makes use of data products from the Two Micron All Sky Survey, which is a joint project of the University of Massachusetts and the Infrared Processing and Analysis Center/California Institute of Technology, funded by the National Aeronautics and Space Administration and the National Science Foundation. } SimpleTextDialog "${varname}ack" [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc Process2MASSCmd {varname iname} { upvar $varname var upvar $iname i 2MASSDialog IMGSVRProcessCmd $varname $iname dtwomass } proc ProcessSend2MASSCmd {proc id param} { 2MASSDialog IMGSVRProcessSendCmd $proc $id $param dtwomass } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/3d.tcl���������������������������������������������������������������������������000644 �000765 �000000 �00000033150 12514261632 015545� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc 3DDef {} { global threed global ithreed global pthreed set ithreed(top) .threed set ithreed(mb) .threedmb set ithreed(status) 0 set threed(az) 0 set threed(el) 0 set threed(scale) 1 set threed(method) mip set threed(background) none set threed(highlite) 1 set threed(highlite,color) cyan set threed(border) 1 set threed(border,color) blue set threed(compass) 0 set threed(compass,color) green array set pthreed [array get threed] unset pthreed(az) unset pthreed(el) } # used by backup proc 3DDialog {} { global threed global ithreed global ds9 # see if we already have a window visible if {[winfo exists $ithreed(top)]} { raise $ithreed(top) return } # create the 3d window set w $ithreed(top) set mb $ithreed(mb) Toplevel $w $mb 6 [msgcat::mc {3D}] 3DDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Render}] -menu $mb.render $mb add cascade -label [msgcat::mc {Highlite}] -menu $mb.highlite $mb add cascade -label [msgcat::mc {Border}] -menu $mb.border # $mb add cascade -label [msgcat::mc {Compass}] -menu $mb.compass menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command 3DApplyDialog $mb.file add command -label [msgcat::mc {Reset}] -command 3DResetDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command 3DDestroyDialog EditMenu $mb ithreed menu $mb.render $mb.render add radiobutton -label [msgcat::mc {MIP}] \ -variable threed(method) -value {mip} -command 3DRenderMethod $mb.render add radiobutton -label [msgcat::mc {AIP}] \ -variable threed(method) -value {aip} -command 3DRenderMethod $mb.render add separator $mb.render add radiobutton -label [msgcat::mc {None}] \ -variable threed(background) -value {none} -command 3DBackground $mb.render add radiobutton -label [msgcat::mc {Azimuth}] \ -variable threed(background) -value {azimuth} -command 3DBackground $mb.render add radiobutton -label [msgcat::mc {Elevation}] \ -variable threed(background) -value {elevation} -command 3DBackground menu $mb.highlite $mb.highlite add checkbutton -label [msgcat::mc {Show}] \ -variable threed(highlite) -command 3DHighlite $mb.highlite add separator $mb.highlite add cascade -label [msgcat::mc {Color}] \ -menu $mb.highlite.color ColorMenu $mb.highlite.color threed highlite,color 3DHighliteColor menu $mb.border $mb.border add checkbutton -label [msgcat::mc {Show}] \ -variable threed(border) -command 3DBorder $mb.border add separator $mb.border add cascade -label [msgcat::mc {Color}] \ -menu $mb.border.color ColorMenu $mb.border.color threed border,color 3DBorderColor menu $mb.compass $mb.compass add checkbutton -label [msgcat::mc {Show}] -variable threed(compass) -command 3DCompass $mb.compass add separator $mb.compass add cascade -label [msgcat::mc {Color}] -menu $mb.compass.color ColorMenu $mb.compass.color threed compass,color 3DCompassColor # Param set f [ttk::frame $w.param] slider $f.elslider -90 90 [msgcat::mc {Elevation}] threed(el) \ [list 3DViewMotion] slider $f.azslider -180 180 [msgcat::mc {Azimuth}] threed(az) \ [list 3DViewMotion] bind $f.elslider.slider <ButtonPress-1> {3DViewButton} bind $f.elslider.slider <ButtonRelease-1> {3DViewRelease} bind $f.azslider.slider <ButtonPress-1> {3DViewButton} bind $f.azslider.slider <ButtonRelease-1> {3DViewRelease} grid $f.azslider -padx 2 -pady 2 -sticky ew grid $f.elslider -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # for order of focus raise $f.elslider # Scale set f [ttk::frame $w.scale] ttk::label $f.tscale -text [msgcat::mc {Z Axis Scale}] ttk::entry $f.scale -textvariable threed(scale) -width 7 grid $f.tscale $f.scale -padx 2 -pady 2 -sticky ew # Status set f [ttk::frame $w.status] ttk::label $f.tstatus -text [msgcat::mc {Status}] ttk::progressbar $f.status -variable ithreed(status) -length 350 grid $f.tstatus $f.status -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command 3DApplyDialog ttk::button $f.reset -text [msgcat::mc {Reset}] -command 3DResetDialog ttk::button $f.close -text [msgcat::mc {Close}] -command 3DDestroyDialog pack $f.apply $f.reset $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal ttk::separator $w.sep2 -orient horizontal ttk::separator $w.sep3 -orient horizontal pack $w.buttons $w.sep $w.status $w.sep2 -side bottom -fill x pack $w.param $w.sep3 $w.scale -side top -fill x Update3DDialog } proc 3DDestroyDialog {} { global threed global ithreed if {[winfo exists $ithreed(top)]} { destroy $ithreed(top) destroy $ithreed(mb) } } proc 3DApplyDialog {} { global threed global current global grid if {$current(frame) != {}} { $current(frame) 3d view $threed(az) $threed(el) $current(frame) 3d scale $threed(scale) if {$grid(view)} { GridUpdateCurrent } } } proc 3DResetDialog {} { global threed set threed(az) 0 set threed(el) 0 3DViewPoint set threed(scale) 1 3DScale } proc Update3DDialog {} { global threed global ithreed global current global debug if {$debug(tcl,update)} { puts stderr "Update3DDialog" } set w $ithreed(top) if {[winfo exists $ithreed(top)] && $current(frame) != {}} { set rr [$current(frame) get 3d view] set threed(az) [lindex $rr 0] set threed(el) [lindex $rr 1] set threed(scale) [$current(frame) get 3d scale] set threed(method) [$current(frame) get 3d method] set threed(background) [$current(frame) get 3d background] set threed(highlite) [$current(frame) get 3d highlite] set threed(highlite,color) [$current(frame) get 3d highlite color] set threed(border) [$current(frame) get 3d border] set threed(border,color) [$current(frame) get 3d border color] set threed(compass) [$current(frame) get 3d compass] set threed(compass,color) [$current(frame) get 3d compass color] } } proc 3DBackup {ch which} { puts $ch "$which 3d view [$which get 3d view]" puts $ch "$which 3d scale [$which get 3d scale]" puts $ch "$which 3d method [$which get 3d method]" puts $ch "$which 3d highlite [$which get 3d highlite]" puts $ch "$which 3d border [$which get 3d border]" puts $ch "$which 3d background [$which get 3d background]" } proc 3DViewPoint {} { global threed global current global grid if {$current(frame) != {}} { $current(frame) 3d view $threed(az) $threed(el) if {$grid(view)} { GridUpdateCurrent } } } proc 3DViewButton {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d view begin $threed(az) $threed(el) } } proc 3DViewMotion {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d view motion $threed(az) $threed(el) } } proc 3DViewRelease {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d view end $threed(az) $threed(el) } } proc 3DScale {} { global threed global current global grid if {$current(frame) != {}} { $current(frame) 3d scale $threed(scale) if {$grid(view)} { GridUpdateCurrent } } } proc 3DRenderMethod {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d method $threed(method) } } proc 3DHighlite {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d highlite $threed(highlite) } } proc 3DHighliteColor {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d highlite color $threed(highlite,color) } } proc 3DBorder {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d border $threed(border) } } proc 3DBorderColor {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d border color $threed(border,color) } } proc 3DCompass {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d compass $threed(compass) } } proc 3DCompassColor {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d compass color $threed(compass,color) } } proc 3DBackground {} { global threed global current if {$current(frame) != {}} { $current(frame) 3d background $threed(background) } } # Prefs proc PrefsDialog3d {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {3D}] lappend dprefs(tabs) [ttk::frame $w.threed] set f [ttk::labelframe $w.threed.misc -text [msgcat::mc {Render}]] ttk::label $f.tmethod -text [msgcat::mc {Method}] ttk::menubutton $f.method -textvariable pthreed(method) \ -menu $f.method.menu ttk::label $f.tbackground -text [msgcat::mc {Background}] ttk::menubutton $f.background -textvariable pthreed(background) \ -menu $f.background.menu grid $f.tmethod $f.method -padx 2 -pady 2 -sticky w grid $f.tbackground $f.background -padx 2 -pady 2 -sticky w set m $f.method.menu menu $m $m add radiobutton -label [msgcat::mc {MIP}] \ -variable pthreed(method) -value {mip} $m add radiobutton -label [msgcat::mc {AIP}] \ -variable pthreed(method) -value {aip} set m $f.background.menu menu $m $m add radiobutton -label [msgcat::mc {None}] \ -variable pthreed(background) -value {none} $m add radiobutton -label [msgcat::mc {Azimuth}] \ -variable pthreed(background) -value {azimuth} $m add radiobutton -label [msgcat::mc {Elevation}] \ -variable pthreed(background) -value {elevation} set f [ttk::labelframe $w.threed.highlite -text [msgcat::mc {Highlite}]] ttk::checkbutton $f.show -text [msgcat::mc {Show}] \ -variable pthreed(highlite) ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color pthreed highlite,color {} grid $f.show -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w set f [ttk::labelframe $w.threed.border -text [msgcat::mc {Border}]] ttk::checkbutton $f.show -text [msgcat::mc {Show}] \ -variable pthreed(border) ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color pthreed border,color {} grid $f.show -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w # set f [ttk::labelframe $w.threed.compass -text [msgcat::mc {Compass}]] # ttk::checkbutton $f.show -text [msgcat::mc {Show}] -variable pthreed(compass) # ttk::label $f.tcolor -text [msgcat::mc {Color}] # ColorMenuButton $f.color pthreed compass,color {} grid $f.show -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w pack $w.threed.misc $w.threed.highlite $w.threed.border \ -side top -fill both -expand true } proc Process3DCmd {varname iname} { upvar $varname var upvar $iname i global threed 3DDialog switch -- [string tolower [lindex $var $i]] { open {} close {3DDestroyDialog} az { incr i set threed(az) [lindex $var $i] 3DViewPoint } el { incr i set threed(el) [lindex $var $i] 3DViewPoint } view - vp { incr i set threed(az) [lindex $var $i] incr i set threed(el) [lindex $var $i] 3DViewPoint } scale { incr i set threed(scale) [lindex $var $i] 3DScale } method { incr i set threed(method) [lindex $var $i] 3DRenderMethod } background { incr i set threed(background) [lindex $var $i] 3DBackground } highlite { incr i switch [string tolower [lindex $var $i]] { color { incr i set threed(highlite,color) [lindex $var $i] 3DHighliteColor } default { set threed(highlite) [FromYesNo [lindex $var $i]] 3DHighlite } } } border { incr i switch [string tolower [lindex $var $i]] { color { incr i set threed(border,color) [lindex $var $i] 3DBorderColor } default { set threed(border) [FromYesNo [lindex $var $i]] 3DBorder } } } compass { incr i switch [string tolower [lindex $var $i]] { color { incr i set threed(compass,color) [lindex $var $i] 3DCompassColor } default { set threed(compass) [FromYesNo [lindex $var $i]] 3DCompass } } } default {Create3DFrame; incr i -1} } } proc ProcessSend3DCmd {proc id param} { global threed switch -- [string tolower [lindex $param 0]] { az {$proc $id "$threed(az)\n"} el {$proc $id "$threed(el)\n"} view - vp {$proc $id "$threed(az) $threed(el)\n"} scale {$proc $id "$threed(scale)\n"} method {$proc $id "$threed(method)\n"} background {$proc $id "$threed(background)\n"} highlite { switch [string tolower [lindex $param 1]] { color {$proc $id "$threed(highlite,color)\n"} default {$proc $id [ToYesNo $threed(highlite)]} } } border { switch [string tolower [lindex $param 1]] { color {$proc $id "$threed(border,color)\n"} default {$proc $id [ToYesNo $threed(border)]} } } compass { switch [string tolower [lindex $param 1]] { color {$proc $id "$threed(compass,color)\n"} default {$proc $id [ToYesNo $threed(compass)]} } } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/analysis.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000121267 12632117565 017077� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc AnalysisDef {} { global ianalysis global panalysis global ds9 set ianalysis(menu,count) 0 set ianalysis(menu,hmenu,count) 0 set ianalysis(menu,hmenu) {} set ianalysis(bind,count) 0 set ianalysis(param,count) 0 set ianalysis(param,seq) 0 set ianalysis(file) ".$ds9(app).ans" set ianalysis(alt) ".$ds9(app).analysis" # prefs only set panalysis(log) 0 set panalysis(autoload) 1 set panalysis(user) {} set panalysis(user2) {} set panalysis(user3) {} set panalysis(user4) {} } proc OpenAnalysisMenu {} { set fn [OpenFileDialog analysisfbox] if {$fn != {}} { ProcessAnalysisFile $fn } } proc ClearAnalysisMenu {} { global pds9 if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message [msgcat::mc {Clear External Analysis Commands?}]] != {ok}} { return } } ClearAnalysis } # Analysis Menu Delete proc ClearAnalysis {} { global ds9 global ianalysis # is something loaded? if {$ianalysis(menu,count) == 0} { return } # delete cascade menus for {set ii 0} {$ii<$ianalysis(menu,hmenu,count)} {incr ii} { destroy [lindex $ianalysis(menu,hmenu) $ii] } set ianalysis(menu,hmenu) {} set ianalysis(menu,hmenu,count) 0 # clear menu $ds9(mb).analysis delete $ds9(menu,size,analysis) end for {set ii 0} {$ii<$ianalysis(menu,count)} {incr ii} { unset ianalysis(menu,$ii,parent) unset ianalysis(menu,$ii,item) unset ianalysis(menu,$ii,template) unset ianalysis(menu,$ii,cmd) unset ianalysis(menu,$ii,inuse) unset ianalysis(menu,$ii,var) } set ianalysis(menu,count) 0 # clear all bindings, first foreach ff $ds9(frames) { for {set ii 0} {$ii<$ianalysis(bind,count)} {incr ii} { $ds9(canvas) bind $ff "$ianalysis(bind,$ii,item)" {} } } # clear bindings for {set ii 0} {$ii<$ianalysis(bind,count)} {incr ii} { unset ianalysis(bind,$ii,item) unset ianalysis(bind,$ii,template) unset ianalysis(bind,$ii,cmd) unset ianalysis(bind,$ii,inuse) } set ianalysis(bind,count) 0 # clear params for {set ii 0} {$ii<$ianalysis(param,count)} {incr ii} { for {set jj 0} {$jj<$ianalysis(param,$ii,count)} {incr jj} { unset ianalysis(param,$ii,$jj,var) unset ianalysis(param,$ii,$jj,type) unset ianalysis(param,$ii,$jj,title) unset ianalysis(param,$ii,$jj,default) unset ianalysis(param,$ii,$jj,last) unset ianalysis(param,$ii,$jj,value) unset ianalysis(param,$ii,$jj,info) } unset ianalysis(param,$ii,count) unset ianalysis(param,$ii) } set ianalysis(param,count) 0 } proc InitAnalysisFile {} { global ianalysis global panalysis global ds9 set done {} # autoload if {$panalysis(autoload)} { foreach dir [list {.} "[GetEnvHome]/bin" {/usr/local/bin} {/opt/local/bin} {/soft/saord/bin}] { foreach fn [glob -directory $dir -nocomplain "*.ds9"] { if {[file exists $fn]} { ProcessAnalysisFile $fn lappend done $fn } } } } # default name ds9.ans # backward compatible ds9.analysis foreach ff {{.} {~}} { foreach gg {{} {.}} { foreach ext {{ans} {analysis}} { set fn "$ff/$gg$ds9(app).$ext" if {[file exists $fn]} { if {[lsearch $done $fn] == -1} { ProcessAnalysisFile $fn lappend done $fn } } } } } # user specified foreach ii {{user} {user2} {user3} {user4}} { if {[info exists panalysis($ii)]} { set fn $panalysis($ii) if {[file exists $fn]} { if {[lsearch $done $fn] == -1} { ProcessAnalysisFile $fn lappend done $fn } } } } UpdateAnalysisMenu } proc ProcessAnalysisFile {fn} { global env # check for simple file if {[file exists "$fn"] && [file isfile "$fn"] && ![file executable "$fn"] && ![file isdirectory "$fn"]} { set ch [open $fn r] set data [read $ch] close $ch if {![ProcessAnalysis data]} { Error "[msgcat::mc {Unable to process Analysis file}] $fn" return } # add directory to path set env(PATH) "[file dirname $fn]:$env(PATH)" } else { Error "[msgcat::mc {Unable to open file}] $fn" } } proc ProcessAnalysis {varname} { upvar $varname var global ds9 global ianalysis # simple check for ascii data if {![string is ascii $var]} { return 0 } set state 1 set baseparent $ds9(mb).analysis set currentparent $baseparent set parentstack $baseparent $baseparent add separator set lines [split $var \n] set l [llength $lines] for {set ii 0} {$ii<$l} {incr ii} { set line [string trim [lindex $lines $ii]] # eat empty lines and comments for all except help if {$state != 6} { # empty line if {[string length $line] == 0} continue # comments if {[string range $line 0 0] == "\#"} continue # strip any end of line comments set id [string first "\#" $line] if {$id > 0} { set line [string range $line 0 [expr $id-1]] } } switch -- $state { 1 { # param if {[lindex $line 0] == {param}} { if {[lindex $line 1] != {}} { set ianalysis(param,$ianalysis(param,count)) \ [lindex $line 1] set ianalysis(param,$ianalysis(param,count),count) 0 set state 5 } continue } # help if {[lindex $line 0] == {help}} { set id [string first " " $line] if {$id > 0} { set item [string range $line [expr $id+1] end] } else { set item Help } set i $ianalysis(menu,count) set ianalysis(menu,$i,parent) $currentparent set ianalysis(menu,$i,item) $item set ianalysis(menu,$i,template) {*} set ianalysis(menu,$i,cmd) {help} set ianalysis(menu,$i,inuse) 0 set ianalysis(menu,$i,var) {} $currentparent add command -label $item \ -command [list AnalysisTask $i menu] set state 6 continue } # hmenu if {[lindex $line 0] == {hmenu}} { set id [string first " " $line] if {$id > 0} { set item [string range $line [expr $id+1] end] } else { set item Tasks } # make the menu label unique set nmenu "$currentparent.hmenu$ianalysis(menu,hmenu,count)" lappend ianalysis(menu,hmenu) $nmenu incr ianalysis(menu,hmenu,count) menu $nmenu $currentparent add cascade -label "$item" -menu $nmenu set currentparent $nmenu lappend parentstack $currentparent continue } # end hmenu if {[lindex $line 0] == {endhmenu} || [lindex $line 0] == {end}} { set parentstack [lreplace $parentstack end end] set currentparent [lindex $parentstack end] continue } if {[lindex $line 0] == {---}} { $currentparent add separator continue } # assume new command set item "$line" set template {} set type {} set cmd {} set state 2 } 2 { set template "$line" set state 3 } 3 { set type "$line" set state 4 } 4 { set cmd "$line" if {$item != {} && $template != {} && $type != {} && $cmd != {}} { switch -- [lindex $type 0] { bind { set b [lindex $type 1] if {$b != {}} { set i $ianalysis(bind,count) set ianalysis(bind,$i,item) "<$b>" set ianalysis(bind,$i,template) "$template" set ianalysis(bind,$i,cmd) "$cmd" set ianalysis(bind,$i,inuse) 0 incr ianalysis(bind,count) } } web { set i $ianalysis(menu,count) set ianalysis(menu,$i,parent) $currentparent set ianalysis(menu,$i,item) $item set ianalysis(menu,$i,template) "$template" set ianalysis(menu,$i,cmd) {web} set ianalysis(menu,$i,inuse) 0 set ianalysis(menu,$i,var) "$cmd" $currentparent add command -label "$item" \ -command [list AnalysisTask $i menu] incr ianalysis(menu,count) } menu { set i $ianalysis(menu,count) set ianalysis(menu,$i,parent) $currentparent set ianalysis(menu,$i,item) "$item" set ianalysis(menu,$i,template) "$template" set ianalysis(menu,$i,cmd) "$cmd" set ianalysis(menu,$i,inuse) 0 set ianalysis(menu,$i,var) {} $currentparent add check -label "$item" \ -command [list AnalysisTask $i menu] \ -variable ianalysis(menu,$i,inuse) \ -selectcolor green incr ianalysis(menu,count) } default { # something really wrong here, abort return 0 } } } set state 1 } 5 { # end param if {[lindex $line 0] == {endparam} || [lindex $line 0] == {end}} { incr ianalysis(param,count) set state 1 continue } if {[string range $line 0 0] == {@}} { ParseIRAFParam [string range $line 1 end] continue } set i $ianalysis(param,count) set j $ianalysis(param,$i,count) set ianalysis(param,$i,$j,var) [lindex $line 0] set ianalysis(param,$i,$j,type) [lindex $line 1] set ianalysis(param,$i,$j,title) [lindex $line 2] # default can contain the full menu 'aaa|bbb|ccc' set ianalysis(param,$i,$j,default) [lindex $line 3] # set last to first item set ianalysis(param,$i,$j,last) \ [lindex [split [lindex $line 3] |] 0] # and set value to last set ianalysis(param,$i,$j,value) \ $ianalysis(param,$i,$j,last) set ianalysis(param,$i,$j,info) [lindex $line 4] incr ianalysis(param,$i,count) } 6 { # end help if {[lindex $line 0] == {endhelp} || [lindex $line 0] == {end}} { incr ianalysis(menu,count) set state 1 continue } set i $ianalysis(menu,count) append ianalysis(menu,$i,var) "$line\n" } } } # events UnBindEventsCanvas BindEventsCanvas UpdateAnalysisMenu return 1 } proc AnalysisTask {i which {frame {}} {x 0} {y 0} {sync 0}} { global ianalysis global current if {$frame == {}} { set frame $current(frame) } switch -- $ianalysis($which,$i,cmd) { help { AnalysisText "at${which}${i}" $ianalysis($which,$i,item) \ $ianalysis($which,$i,var) insert } web { if {$frame != {}} { AnalysisWebDoit $i $which $frame $x $y $sync } } default { if {$frame != {}} { AnalysisTaskDoit $i $which $frame $x $y $sync } } } } proc AnalysisWebDoit {i which frame x y sync} { global ianalysis global panalysis set cmd "$ianalysis($which,$i,var)" # do select macro expansion # escaped macros SetEscapedMacros cmd # $xpa_method ParseXPAMethodMacro cmd # $xpa ParseXPAMacro cmd # $vo_method ParseVOMethodMacro cmd # $xdim,$ydim,$bitpix ParseXYBitpixMacro cmd $frame # $filename[$regions] ParseFilenameRegionMacro cmd $frame # $filename ParseFilenameMacro cmd $frame # $filedialog ParseFileDialogMacro cmd # $regions ParseRegionMacro cmd $frame # $env ParseEnvMacro cmd # $pan ParsePanMacro cmd $frame # $value ParseValueMacro cmd $frame $x $y # $x,$y ParseXYMacro cmd $frame $x $y # $z ParseZMacro cmd $frame # escaped macros UnsetEscapedMacros cmd if {$panalysis(log)} { SimpleTextDialog acmd [msgcat::mc {Analysis Commands}] \ 80 20 append bottom "$cmd\n" } HVAnalysisCmd "at${which}${i}" "$ianalysis($which,$i,item)" "$cmd" $sync } proc AnalysisTaskDoit {i which frame x y sync} { global ianalysis global pds9 if {[info exists ianalysis($which,$i,pid)]} { set ianalysis($which,$i,inuse) 1 if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message [msgcat::mc {This analysis task is already running. Do you wish to kill it?}]] != {ok}} { return } } if {[info exists ianalysis($which,$i,pid)]} { if {$ianalysis($which,$i,pid)>0} { eval "exec kill -9 $ianalysis($which,$i,pid)" } else { HVAnalysisCancel $which $i } } return } # don't turn on til task has started set ianalysis($which,$i,inuse) 0 set ianalysis($which,$i,start) {} set ianalysis($which,$i,start,fn) {} set ianalysis($which,$i,start,url) {} set ianalysis($which,$i,finish) {} set ianalysis($which,$i,result) {} set ianalysis($which,$i,plot,title) {} set ianalysis($which,$i,plot,xaxis) {} set ianalysis($which,$i,plot,yaxis) {} set ianalysis($which,$i,plot,dim) 2 set ianalysis($which,$i,image) {} set cmd $ianalysis($which,$i,cmd) # escaped macros SetEscapedMacros cmd # $data ParseDataMacro cmd $which $i # $xpa_method ParseXPAMethodMacro cmd # $xpa ParseXPAMacro cmd # $vo_method ParseVOMethodMacro cmd # $xdim,$ydim,$bitpix ParseXYBitpixMacro cmd $frame # $filename[$regions] ParseFilenameRegionMacro cmd $frame # $filename ParseFilenameMacro cmd $frame # $filedialog ParseFileDialogMacro cmd # $regions ParseRegionMacro cmd $frame # $env ParseEnvMacro cmd # $cen ParsePanMacro cmd $frame # $value ParseValueMacro cmd $frame $x $y # $x,$y ParseXYMacro cmd $frame $x $y # $z ParseZMacro cmd $frame # $message if {![ParseMessageMacro cmd]} { AnalysisTaskEnd $which $i return } # $entry if {![ParseEntryMacro cmd]} { AnalysisTaskEnd $which $i return } # $param if {![ParseParamMacro cmd]} { AnalysisTaskEnd $which $i return } # $text ParseTextMacro cmd $which $i # $plot ParsePlotMacro cmd $which $i # $null ParseNullMacro cmd $which $i # $url ParseURLMacro cmd $which $i # $geturl # do this next to last ParseGetURLMacro cmd $which $i # $image # do this last ParseImageMacro cmd $which $i # escaped macros UnsetEscapedMacros cmd # ok, we are off and running set ianalysis($which,$i,inuse) 1 switch -- $ianalysis($which,$i,start) { geturl { AnalysisGetURL $which $i $sync } default { AnalysisPipe $which $i $cmd $sync } } } proc AnalysisPipe {which i cmd sync} { global ianalysis global panalysis global current switch -- $ianalysis($which,$i,start) { data {$current(frame) save fits image file "\{$ianalysis($which,$i,start,fn)\}"} url {GetFileURL $ianalysis($which,$i,start,url) ianalysis($which,$i,start,fn)} } # last step, change all '][' into ',' so that multiple filters work right regsub -all {\]\[} $cmd "," cmd # log the command, if necessary if {$panalysis(log)} { SimpleTextDialog acmd [msgcat::mc {Analysis Commands}] \ 80 20 append bottom "$cmd\n" } switch -- $ianalysis($which,$i,finish) { null { # nothing is returned, so there is aways an error, # however, the command will be executed. catch {open "| $cmd"} global errorInfo set errorInfo {} AnalysisTaskEnd $which $i return } default { if {[catch {set ch [open "| $cmd"]}]} { Error [msgcat::mc {An error has occurred invoking the Analysis task}] AnalysisTaskEnd $which $i return } set ianalysis($which,$i,pid) [pid $ch] switch -- $ianalysis($which,$i,finish) { image { switch -- $ianalysis($which,$i,image) { new {CreateFrame} rgb {CreateRGBFrame} 3d {Create3DFrame} current {} } global loadParam set loadParam(load,type) channel set loadParam(load,layer) {} set loadParam(channel,name) $ch set loadParam(file,type) fits set loadParam(file,mode) {} set loadParam(file,name) \ "[string tolower [lindex $ianalysis($which,$i,item) 0]].fits" StartLoad ProcessLoad FinishLoad AnalysisTaskEnd $which $i } default { if {$sync} { AnalysisReaderAppend $ch $which $i AnalysisReaderFinish $ch $which $i } else { fileevent $ch readable \ [list AnalysisReader $ch $which $i] fconfigure $ch -blocking 0 -buffering none } } } } } } proc AnalysisReader {ch which i} { global ianalysis if {[eof $ch]} { AnalysisReaderFinish $ch $which $i return } AnalysisReaderAppend $ch $which $i } proc AnalysisReaderAppend {ch which i} { global ianalysis set r [read $ch] # for real-time update switch -- $ianalysis($which,$i,finish) { text { AnalysisText "at${which}${i}" $ianalysis($which,$i,item) $r append global debug if {$debug(tcl,idletasks)} { puts stderr "AnalysisReader" } update idletasks } } append ianalysis($which,$i,result) $r } proc AnalysisReaderFinish {ch which i} { global ianalysis catch {close $ch} switch -- $ianalysis($which,$i,finish) { null - image - text {} plot { PlotLine "at${which}${i}" \ $ianalysis($which,$i,item) \ $ianalysis($which,$i,plot,title) \ $ianalysis($which,$i,plot,xaxis) \ $ianalysis($which,$i,plot,yaxis) \ $ianalysis($which,$i,plot,dim) \ $ianalysis($which,$i,result) } plotstdin { AnalysisPlotStdin line "at${which}${i}" $ianalysis($which,$i,item) \ $ianalysis($which,$i,result) } default {puts stdout $ianalysis($which,$i,result)} } AnalysisTaskEnd $which $i } proc AnalysisPlotStdin {type w wtt result} { # if no result, just return if {$result == {}} { return } # check for $ERROR set id [string first {$ERROR} $result] if {$id >= 0} { AnalysisText "${w}e" $wtt \ [string range $result [expr $id+1] end] append return } # check for ERROR: set id [string first {ERROR:} $result] if {$id >= 0} { AnalysisText "${w}e" $wtt [string range $result $id end] append return } # check for $BEGINTEXT/$ENDTEXT # assume each is followed by a \n, so skip it if {[string range $result 0 9] == {$BEGINTEXT}} { set eid [string first {$ENDTEXT} $result] if {$eid > 0} { AnalysisText "${w}t" $wtt \ [string range $result 11 [expr $eid-1]] append set result [string range $result [expr $eid+9] end] } else { # looks like all text AnalysisText "${w}t" $wtt [string range $result 11 end] append return } } # now find the title, x axis label, y axis label, and dimension set id [string first "\n" $result] set tt [string range $result 0 $id] set rr [string range $result [expr $id+1] end] set l [llength $tt] set t [join [lrange $tt 0 [expr $l-4]]] set x [lindex $tt [expr $l-3]] set y [lindex $tt [expr $l-2]] set d [lindex $tt [expr $l-1]] if {$d != {} && $rr != {}} { switch $type { line {PlotLine $w $wtt $t $x $y $d $rr} bar {PlotBar $w $wtt $t $x $y $d $rr} scatter {PlotScatter $w $wtt $t $x $y $d $rr} } } else { Error "[msgcat::mc {Error}] [string range $tt 0 40]" } } proc AnalysisGetURL {which i sync} { global ianalysis global panalysis if {![ParseURL $ianalysis($which,$i,start,url) r]} { Error [msgcat::mc {An error has occurred invoking the Analysis task}] AnalysisTaskEnd $which $i return } # format all spaces and brackets set url {} regsub -all { } $ianalysis($which,$i,start,url) "%20" url regsub -all {\[} $url "%5B" url regsub -all {\]} $url "%5D" url if {$panalysis(log)} { SimpleTextDialog acmd [msgcat::mc {Analysis Commands}] \ 80 20 append bottom "$url\n" } set ianalysis($which,$i,pid) -1 HVAnalysisURL $which $i $url $sync } proc AnalysisProcessGetURL {which i result} { global ianalysis set ianalysis($which,$i,result) $result switch -- $ianalysis($which,$i,finish) { text {AnalysisText "at${which}${i}" $ianalysis($which,$i,item) \ $ianalysis($which,$i,result) append} plot {PlotLine "at${which}${i}" \ $ianalysis($which,$i,item) \ $ianalysis($which,$i,plot,title) \ $ianalysis($which,$i,plot,xaxis) \ $ianalysis($which,$i,plot,yaxis) \ $ianalysis($which,$i,plot,dim) \ $ianalysis($which,$i,result)} plotstdin {AnalysisPlotStdin line "at${which}${i}" \ $ianalysis($which,$i,item) \ $ianalysis($which,$i,result)} image { set fn "[string tolower [lindex $ianalysis($which,$i,item) 0]].fits" LoadVar result $fn {} {} } default {Error $ianalysis($which,$i,result)} } } proc AnalysisTaskEnd {which i} { global ianalysis set ianalysis($which,$i,inuse) 0 if {$ianalysis($which,$i,start,fn) != {}} { if {[file exists $ianalysis($which,$i,start,fn)]} { catch {file delete -force $ianalysis($which,$i,start,fn)} } } if {[info exists ianalysis($which,$i,pid)]} { unset ianalysis($which,$i,pid) } unset ianalysis($which,$i,start) unset ianalysis($which,$i,start,fn) unset ianalysis($which,$i,start,url) unset ianalysis($which,$i,finish) unset ianalysis($which,$i,result) unset ianalysis($which,$i,plot,title) unset ianalysis($which,$i,plot,xaxis) unset ianalysis($which,$i,plot,yaxis) unset ianalysis($which,$i,plot,dim) unset ianalysis($which,$i,image) } proc SetEscapedMacros {cmdname} { upvar $cmdname cmd global xpa set seq "WaJaWaJaW" if {[regexp {\$\$} $cmd]} { # fill with tempory sequence regsub -all {\$\$} $cmd $seq cmd } } proc UnsetEscapedMacros {cmdname} { upvar $cmdname cmd global xpa set seq "WaJaWaJaW" if {[regexp $seq $cmd]} { # reset to $ regsub -all $seq $cmd {\$} cmd } } proc ParseDataMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\$data.?\|} if {[regexp $exp $cmd]} { set ianalysis($which,$i,start) data set ianalysis($which,$i,start,fn) [tmpnam ds9ans {.fits}] regsub $exp $cmd "cat \{$ianalysis($which,$i,start,fn)\} |" cmd } } proc ParseVOMethodMacro {cmdname} { upvar $cmdname cmd global pvo if {[regexp {\$vo_method} $cmd]} { regsub -all {\$vo_method} $cmd $pvo(method) cmd } } proc ParseXPAMethodMacro {cmdname} { upvar $cmdname cmd global ds9 if {[regexp {\$xpa_method} $cmd]} { regsub -all {\$xpa_method} $cmd [XPAMethod] cmd } } proc ParseXPAMacro {cmdname} { upvar $cmdname cmd global ds9 if {[regexp {\$xpa} $cmd]} { regsub -all {\$xpa} $cmd $ds9(title) cmd } } proc ParseXYBitpixMacro {cmdname frame} { upvar $cmdname cmd if {$frame != {}} { if {[regexp {\$width} $cmd]} { regsub -all {\$width} $cmd [$frame get fits width] cmd } if {[regexp {\$height} $cmd]} { regsub -all {\$height} $cmd [$frame get fits height] cmd } if {[regexp {\$depth} $cmd]} { regsub -all {\$depth} $cmd [$frame get fits depth 2] cmd } if {[regexp {\$bitpix} $cmd]} { regsub -all {\$bitpix} $cmd [$frame get fits bitpix] cmd } if {[regexp {\$xdim} $cmd]} { regsub -all {\$xdim} $cmd [$frame get fits width] cmd } if {[regexp {\$ydim} $cmd]} { regsub -all {\$ydim} $cmd [$frame get fits height] cmd } } } proc ParseFilenameRegionMacro {cmdname frame} { upvar $cmdname cmd set exp {(\$filename)\[(\$regions\(([^)]*)\))\]} while {[regexp $exp $cmd foo fn reg pp]} { set type ds9 set prop {} set sys physical set sky fk5 set format degrees # default for mosaics if {$frame != {}} { if {[$frame has fits mosaic]} { set sys wcs } } foreach p [split $pp ,] { switch -- $p { ds9 - ciao - saotng - saoimage - pros - xy {set type $p} include {append prop {include = yes }} exclude {append prop {include = no }} source {append prop {source = yes }} background {append prop {source = no }} image - physical - detector - amplifier wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {set sys $p} fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic { if {"$sys"=="physical"} { set sys wcs } set sky $p } hms {set format sexagesimal} sexagesimal - degrees {set format $p} } } SubstFilenameRegion cmd $frame $exp $type $prop $sys $sky $format } set exp {(\$filename)\[(\$regions)\]} while {[regexp $exp $cmd foo fn reg]} { set type ds9 set prop {} set sys physical set sky fk5 set format degrees # default for mosaics if {$frame != {}} { if {[$frame has fits mosaic]} { set sys wcs } } SubstFilenameRegion cmd $frame $exp $type $prop $sys $sky $format } } proc SubstFilenameRegion {cmdname frame exp type prop sys sky format} { upvar $cmdname cmd global ianalysis set fn [$frame get fits file name full] set region [string trimright [$frame marker list $type $sys $sky $format yes $prop] ";"] if {$region != {}} { set sub {} foreach f $fn { append sub "$f\[$region\] " } } else { set sub $fn } # substitute # ok, we need to check the length if {[string length $region] > 256} { # since we are writing to a file, # we don't have to worry about quoting # special characters set fn [tmpnam ds9ans {.reg}] incr ianalysis(param,seq) if {![catch {set ch [open "$fn" w]}]} { puts $ch "$sub" close $ch } regsub $exp $cmd "\@$fn" cmd } else { CleanFileName sub regsub $exp $cmd $sub cmd } } proc ParseFilenameMacro {cmdname frame} { upvar $cmdname cmd set exp {\$filename\(([^)]*)\)} if {[regexp $exp $cmd foo pp]} { switch $pp { root - root,base { set sub [join [$frame get fits file name root base]] CleanFileName sub regsub -all $exp $cmd $sub cmd } full - full,base { set sub [join [$frame get fits file name full base]] CleanFileName sub regsub -all $exp $cmd $sub cmd } } } set exp {\$filename} if {[regexp $exp $cmd]} { set sub [join [$frame get fits file name full]] CleanFileName sub regsub -all $exp $cmd $sub cmd } } proc ParseFileDialogMacro {cmdname} { upvar $cmdname cmd set exp {\$filedialog\(open\)} if {[regexp $exp $cmd]} { set sub [OpenFileDialog analysisparamfbox] regsub -all $exp $cmd $sub cmd } set exp {\$filedialog\(save\)} if {[regexp $exp $cmd]} { set sub [SaveFileDialog analysisparamfbox] regsub -all $exp $cmd $sub cmd } } proc CleanFileName {varname} { upvar $varname sub # we have to quote {"}, else problems down the road regsub -all {\"} $sub {\\"} sub # we have to quote {&}, else problems down the road regsub -all {\&} $sub {\\&} sub } proc ParseRegionMacro {cmdname frame} { upvar $cmdname cmd set exp {\$regions\(([^)]*)\)} while {[regexp $exp $cmd foo pp]} { set type ds9 set prop {} set sys physical set sky fk5 set format degrees # default for mosaics if {$frame != {}} { if {[$frame has fits mosaic]} { set sys wcs } } foreach p [split $pp ,] { switch -- $p { ds9 - ciao - saotng - saoimage - pros - xy {set type $p} include {append prop {include = yes }} exclude {append prop {include = no }} source {append prop {source = yes }} background {append prop {source = no }} image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {set sys $p} fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic { if {"$sys"=="physical"} { set sys wcs } set sky $p } hms {set format sexagesimal} sexagesimal - degrees {set format $p} } } SubstRegion cmd $frame $exp $type $prop $sys $sky $format } # SAOtng format set exp {\$((|include|exclude|source|background)_)?regions(_(|degrees|hms|pixels))?} while {[regexp $exp $cmd foo a prop b sys]} { # check valid props switch -- $prop { include {set prop {include = yes}} exclude {set prop {include = no}} source {set prop {source = yes}} background {set prop {source = no}} default {set prop {}} } # check valid coordinate systems set sky fk5 switch -- $sys { degrees {set sys wcs; set format degrees} hms {set sys wcs; set format sexagesimal} pixels - default {set sys physical; set format degrees} } SubstRegion cmd $frame $exp ds9 $prop $sys $sky $format } } proc SubstRegion {cmdname frame exp type prop sys sky format} { upvar $cmdname cmd global ianalysis # get any regions set region [string trimright [$frame marker list $type $sys $sky $format yes $prop] ";"] # substitute # ok, we need to check the length if {[string length $region] > 8192} { # since we are writing to a file, we don't have to worry about quoting # special characters set fn [tmpnam ds9ans {.reg}] incr ianalysis(param,seq) if {![catch {set ch [open "$fn" w]}]} { puts $ch "$region" close $ch } regsub $exp $cmd "\@$fn" cmd } else { # we have to quote {"}, else problems down the road regsub -all {\"} $region {\\"} region # we have to quote {&}, else problems down the road regsub -all {\&} $region {\\&} region regsub $exp $cmd $region cmd } } proc ParseEnvMacro {cmdname} { upvar $cmdname cmd global env set exp {\$env\(([^)]*)\)} if {[regexp $exp $cmd foo ee]} { if {[info exists env($ee)]} { regsub -all $exp $cmd "$env($ee)" cmd } else { regsub -all $exp $cmd {} cmd } } } proc ParsePanMacro {cmdname frame} { upvar $cmdname cmd set exp {\$pan\(([^)]*)\)} if {[regexp $exp $cmd foo pp]} { set sys physical set sky fk5 set format degrees foreach p [split $pp ,] { switch -- $p { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {set sys $p} fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic {set sky $p; set sys wcs} hms {set format sexagesimal} sexagesimal - degrees {set format $p} } } set coord [$frame get cursor $sys $sky $format] regsub -all $exp $cmd "[lindex $coord 0],[lindex $coord 1]" cmd return } # no args set exp {\$pan} if {[regexp $exp $cmd foo1]} { set coord [$frame get cursor physical] regsub -all $exp $cmd "[lindex $coord 0],[lindex $coord 1]" cmd } } proc ParseValueMacro {cmdname frame x y} { upvar $cmdname cmd # menu items will not have a frame arg if {$frame == {}} { return } set exp1 {\$value} if {[regexp $exp1 $cmd foo]} { set vv [$frame get value canvas $x $y] regsub -all $exp1 $cmd "$vv" cmd } } proc ParseXYMacro {cmdname frame x y} { upvar $cmdname cmd # menu items will not have a frame arg if {$frame == {}} { return } set exp1 {\$x\(([^)]*)\)} set exp2 {\$y\(([^)]*)\)} if {[regexp $exp1 $cmd foo pp] && [regexp $exp2 $cmd foo2 pp2]} { set sys physical set sky fk5 set format degrees foreach p [split $pp ,] { switch -- $p { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {set sys $p} fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic {set sky $p; set sys wcs} hms {set format sexagesimal} sexagesimal - degrees {set format $p} } } switch -- $sys { image - physical - detector - amplifier {set coord [$frame get coordinates $x $y $sys]} default {set coord [$frame get coordinates $x $y $sys $sky $format]} } regsub -all $exp1 $cmd [lindex $coord 0] cmd regsub -all $exp2 $cmd [lindex $coord 1] cmd return } # no args set exp1 {\$x} set exp2 {\$y} if {[regexp $exp1 $cmd foo1] && [regexp $exp2 $cmd foo2]} { set coord [$frame get coordinates $x $y physical] regsub -all $exp1 $cmd [lindex $coord 0] cmd regsub -all $exp2 $cmd [lindex $coord 1] cmd } } proc ParseZMacro {cmdname frame} { upvar $cmdname cmd # menu items will not have a frame arg if {$frame == {}} { return } set sl [$frame get fits slice] # args set exp1 {\$z\(([^)]*)\)} if {[regexp $exp1 $cmd foo pp]} { set sys $pp set coord [$frame get coordinates $sl image $sys 2] regsub -all $exp1 $cmd "$coord" cmd return } # no args # look for '$z"' set exp1 {\$z\"} if {[regexp $exp1 $cmd foo1]} { regsub -all $exp1 $cmd "$sl\"" cmd } # look for "$z " set exp1 {\$z\s} if {[regexp $exp1 $cmd foo1]} { regsub -all $exp1 $cmd "$sl " cmd } } proc ParseMessageMacro {cmdname} { upvar $cmdname cmd # two args set exp {\|?.?\$message\((ok|okcancel|yesno),([^)]*)\).?\|?} while {[regexp $exp $cmd foo type message]} { regsub $exp $cmd {} cmd if {![AnalysisMessage $type $message]} { return 0 } } # one args set exp {\|?.?\$message\(([^)]*)\).?\|?} while {[regexp $exp $cmd foo message]} { regsub $exp $cmd {} cmd AnalysisMessage ok $message } return 1 } proc ParseEntryMacro {cmdname} { upvar $cmdname cmd # one args set exp {\|?.?\$entry\(([^)]*)\).?\|?} while {[regexp $exp $cmd foo message]} { set result {} if {![AnalysisEntry $message result]} { return 0 } regsub $exp $cmd $result cmd } return 1 } proc ParseParamMacro {cmdname} { upvar $cmdname cmd global ianalysis set exp {\$param\(([^)]*)\).?;?} while {[regexp $exp $cmd foo param]} { regsub $exp $cmd {} cmd if {![AnalysisParam cmd $param]} { return 0 } } return 1 } proc ParseTextMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp1 {\|.?\$text} set exp2 {\|\&.?\$text} if {[regexp $exp1 $cmd]} { regsub $exp1 $cmd {} cmd set ianalysis($which,$i,finish) text } elseif {[regexp $exp2 $cmd]} { regsub $exp2 $cmd { 2>@ stdout} cmd set ianalysis($which,$i,finish) text } } proc ParseNullMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\|.?\$null} if {[regexp $exp $cmd]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) null } } proc ParsePlotMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\|.?\$plot\(([^,]+),([^,]+),([^,]+),([^)]+)\)} if {[regexp $exp $cmd foo \ ianalysis($which,$i,plot,title) \ ianalysis($which,$i,plot,xaxis) \ ianalysis($which,$i,plot,yaxis) \ ianalysis($which,$i,plot,dim)]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) plot } set exp {\|.?\$plot\(stdin\)} if {[regexp $exp $cmd]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) plotstdin } set exp {\|.?\$plot} if {[regexp $exp $cmd]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) plot } } proc ParseURLMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\$url\((.*)\) \|} if {[regexp $exp $cmd foo ianalysis($which,$i,start,url)]} { set ianalysis($which,$i,start) url set ianalysis($which,$i,start,fn) [tmpnam ds9ans {.fits}] regsub $exp $cmd "cat \{$ianalysis($which,$i,start,fn)\} |" cmd } } proc ParseGetURLMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\$geturl\((.*)\)} if {[regexp $exp $cmd foo ianalysis($which,$i,start,url)]} { set ianalysis($which,$i,start) geturl set ianalysis($which,$i,start,fn) [tmpnam ds9ans {.fits}] regsub $exp $cmd {} cmd } } proc ParseImageMacro {cmdname which i} { upvar $cmdname cmd global ianalysis set exp {\|.?\$image\(([^)]*)\)} if {[regexp $exp $cmd foo ianalysis($which,$i,image)]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) image } set exp {\|.?\$image} if {[regexp $exp $cmd]} { regsub $exp $cmd {} cmd set ianalysis($which,$i,finish) image } } proc AnalysisText {tt title txt method} { if {$txt != {} && $txt != "\n"} { SimpleTextDialog ${tt}txt $title 80 20 $method bottom $txt } } proc AnalysisMessage {type message} { if {$type == {}} { set type ok } switch -- [tk_messageBox -message $message -type $type] { ok {return 1} yes {return 1} cancel {return 0} default {return 0} } } proc AnalysisEntry {message resultvar} { upvar $resultvar result return [EntryDialog [msgcat::mc {Entry}] $message 60 result] } proc AnalysisPrefOpen {varname} { upvar $varname var FileLast analysisfbox $var set var [OpenFileDialog analysisfbox] } # Cmds proc ProcessAnalysisCmd {varname iname buf fn} { upvar $varname var upvar $iname i global ime global ianalysis switch -- [string tolower [lindex $var $i]] { message { incr i switch [string tolower [lindex $var $i]] { ok - okcancel - retrycancel - yesno - yesnocancel { AnalysisMessage [lindex $var $i] [lindex $var [expr $i+1]] incr i } default { AnalysisMessage ok [lindex $var $i] } } } text { if {$buf != {}} { AnalysisText apXPA Analysis $buf append } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set txt [read $ch] close $ch AnalysisText apXPA Analysis $txt append } } else { incr i AnalysisText apXPA Analysis [lindex $var $i] append } } plot { # for backward compatibility # used by chandra-ed # use xpa plot instead incr i if {$buf != {}} { ProcessAnalysisPlotCmd $varname $iname $buf } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set rr [read $ch] close $ch ProcessAnalysisPlotCmd $varname $iname $rr } } else { ProcessAnalysisPlotCmd $varname $iname {} } } load { if {$buf != {}} { ProcessAnalysis buf } elseif {$fn != {}} { ProcessAnalysisFile $fn } else { incr i ProcessAnalysisFile [lindex $var $i] } } clear { ClearAnalysis incr i switch -- [lindex $var $i] { load { if {$buf != {}} { ProcessAnalysis buf } elseif {$fn != {}} { ProcessAnalysisFile $fn } else { incr i ProcessAnalysisFile [lindex $var $i] } } default {incr i -1} } } mode { incr i switch -- [lindex $var $i] { stats - statistics {set ime(task) stats} hist - histogram {set ime(task) hist} radial - radialprofile {set ime(task) radial} 2d - plot2d {set ime(task) plot2d} 3d - plot3d {set ime(task) plot3d} } ProcessRealizeDS9 IMEChangeTask } task { incr i if {[string is integer [lindex $var $i]]} { AnalysisTask [lindex $var $i] menu } else { # invoke by name for {set ii 0} {$ii<$ianalysis(menu,count)} {incr ii} { if {[string equal -nocase $ianalysis(menu,$ii,item) [lindex $var $i]]} { AnalysisTask $ii menu } } } } default { if {[string is integer [lindex $var $i]]} { AnalysisTask [lindex $var $i] menu } else { ProcessAnalysisFile [lindex $var $i] } } } } proc ProcessAnalysisPlotCmd {varname iname buf} { upvar 2 $varname var upvar 2 $iname i global iap switch -- [string tolower [lindex $var $i]] { stdin {AnalysisPlotStdin line $iap(tt) {} $buf} default { PlotLine $iap(tt) Plot \ [lindex $var [expr $i+0]] \ [lindex $var [expr $i+1]] \ [lindex $var [expr $i+2]] \ [lindex $var [expr $i+3]] \ $buf incr i 3 } } } proc ProcessSendAnalysisCmd {proc id param sock fn} { global ianalysis global ime set result {} switch -- [string tolower [lindex $param 0]] { entry { AnalysisEntry [lrange $param 1 end] result append result "\n" $proc $id $result } mode {$proc $id "$ime(task)\n"} task { # invoke by name for {set ii 0} {$ii<$ianalysis(menu,count)} {incr ii} { append result "$ii $ianalysis(menu,$ii,item)\n" } $proc $id $result } lock {$proc $id "$ime(lock)\n"} default { for {set i 0} {$i<$ianalysis(menu,count)} {incr i} { append result "\#$i menu" append result "\n$ianalysis(menu,$i,item)" append result "\n$ianalysis(menu,$i,template)" if {$ianalysis(menu,$i,cmd) != {web}} { append result "\nmenu" append result "\n$ianalysis(menu,$i,cmd)" } else { append result "\n$ianalysis(menu,$i,cmd)" append result "\n$ianalysis(menu,$i,var)" } append result "\n\n" } for {set i 0} {$i<$ianalysis(bind,count)} {incr i} { set key [string range $ianalysis(bind,$i,item) 1 1] append result "\#$i bind" append result "\nbind key $ianalysis(bind,$i,item)" append result "\n$ianalysis(bind,$i,template)" append result "\nbind $key" append result "\n$ianalysis(bind,$i,cmd)" append result "\n\n" } ProcessSend $proc $id $sock $fn {.ans} $result } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/analysisparam.tcl����������������������������������������������������������������000644 �000765 �000000 �00000010665 12464211202 020101� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc AnalysisParam {strname param} { upvar $strname str global ianalysis global ed global ds9 global pds9 # find it for {set i 0} {$i<$ianalysis(param,count)} {incr i} { if {$ianalysis(param,$i) == "$param"} { break } } if {$i == $ianalysis(param,count)} { return } set w {.param} set ed(ok) 0 DialogCreate $w $param ed(ok) # Param set f [ttk::frame $w.param] for {set j 0} {$j<$ianalysis(param,$i,count)} {incr j} { set ianalysis(param,$i,$j,value) $ianalysis(param,$i,$j,last) ttk::label $f.l$j -text "$ianalysis(param,$i,$j,title)" switch -- $ianalysis(param,$i,$j,type) { entry { ttk::entry $f.a$j \ -textvariable ianalysis(param,$i,$j,value) \ -width 40 } checkbox { ttk::checkbutton $f.a$j -text {} \ -variable ianalysis(param,$i,$j,value) } menu { set l [split $ianalysis(param,$i,$j,default) |] ttk::menubutton $f.a$j \ -text "$ianalysis(param,$i,$j,value)" \ -menu $f.a$j.menu set m [menu $f.a$j.menu] for {set k 0} {$k<[llength $l]} {incr k} { $m add command -label [lindex $l $k] \ -command "AnalysisParamMenu ianalysis(param,$i,$j,value) [lindex $l $k] $f.a$j" } } } ttk::label $f.i$j -text "$ianalysis(param,$i,$j,info)" \ -font "{$ds9(times)} $pds9(font,size) normal italic" grid $f.l$j $f.a$j $f.i$j -padx 2 -pady 2 -sticky w } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok DialogDismiss $w if {$ed(ok)} { for {set j 0} {$j<$ianalysis(param,$i,count)} {incr j} { set exp "\\\$$ianalysis(param,$i,$j,var)" if {[regexp $exp $str]} { regsub -all $exp $str "$ianalysis(param,$i,$j,value)" str } set ianalysis(param,$i,$j,last) $ianalysis(param,$i,$j,value) } } set rr $ed(ok) unset ed return $rr } proc AnalysisParamMenu {varname value menu} { upvar $varname var set var $value $menu configure -text $value } proc ParseIRAFParam {filename} { global ianalysis global env # we are only concerned with unix like os set uparm {} if {[info exists env(UPARM)]} { set uparm "$env(UPARM)/$filename" } set iraf {} if {[info exists env(HOME)]} { set iraf "$env(HOME)/$filename" } if {[file exists "$filename"]} { catch {set ch [open "$filename"]} } elseif {[file exists "$uparm"]} { catch {set ch [open "$uparm"]} } elseif {[file exists "$iraf"]} { catch {set ch [open "$iraf"]} } else { return } set i $ianalysis(param,count) while {[gets $ch line] >= 0} { set exp {([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)} if {[regexp $exp $line foo p1 p2 p3 p4 p5 p6 p7]} { if {$p1 != {mode}} { regsub -all {\"} $p4 {} p4 regsub -all {\"} $p7 {} p7 set j $ianalysis(param,$i,count) set ianalysis(param,$i,$j,var) "$p1" if {$p3 == {h}} { set ianalysis(param,$i,$j,title) "(${p1})" } else { set ianalysis(param,$i,$j,title) "$p1" } set ianalysis(param,$i,$j,info) "$p7" incr ianalysis(param,$i,count) switch -- $p2 { b { set ianalysis(param,$i,$j,type) checkbox set ianalysis(param,$i,$j,default) [FromYesNo $p4] set ianalysis(param,$i,$j,last) [FromYesNo $p4] set ianalysis(param,$i,$j,value) [FromYesNo $p4] } s { if {$p5 != {}} { set ianalysis(param,$i,$j,type) menu set ianalysis(param,$i,$j,default) "$p5" } else { set ianalysis(param,$i,$j,type) entry set ianalysis(param,$i,$j,default) "$p4" } set ianalysis(param,$i,$j,last) "$p4" set ianalysis(param,$i,$j,value) "$p4" } default { set ianalysis(param,$i,$j,type) entry set ianalysis(param,$i,$j,default) "$p4" set ianalysis(param,$i,$j,last) "$p4" set ianalysis(param,$i,$j,value) "$p4" } } } } } close $ch } ���������������������������������������������������������������������������saods9/ds9/library/annulus.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000011123 12514261632 016720� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc AnnulusDialog {varname} { upvar #0 $varname var global $varname global pmarker # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord set var(method) dist # procs set var(which) annulus set var(proc,apply) AnnulusApply set var(proc,close) AnnulusClose set var(proc,generate) AnnulusGenerate set var(proc,coordCB) AnnulusCoordCB set var(proc,editCB) AnnulusEditCB set var(proc,distCB) AnnulusDistCB # base MarkerBaseAnnulusDialog $varname # menus MarkerBaseAnnulusMethodMenu $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisRadialDialog $varname # callbacks $var(frame) marker $var(id) callback edit AnnulusEditCB $varname $var(frame) marker $var(id) callback end edit AnnulusEditCB $varname set f $var(top).param # Annuli ttk::label $f.tinner -text [msgcat::mc {Inner}] ttk::label $f.touter -text [msgcat::mc {Outer}] ttk::label $f.tradius -text [msgcat::mc {Radius}] ttk::entry $f.inner -textvariable ${varname}(inner) -width 13 ttk::entry $f.outer -textvariable ${varname}(outer) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list AnnulusDistCB $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat ttk::label $f.tannuli -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable ${varname}(annuli) -width 13 grid x $f.tinner $f.touter -padx 2 -pady 2 -sticky w grid $f.tradius $f.inner $f.outer $f.uradius -padx 2 -pady 2 -sticky w grid $f.tannuli $f.annuli -padx 2 -pady 2 -sticky w # Radius set f [ttk::labelframe $var(top).radius -text [msgcat::mc {Radius}] \ -padding 2] set var(annulitxt) [text $f.txt \ -height 10 \ -width 15 \ -wrap none \ -font [font actual TkDefaultFont] \ -yscrollcommand [list $f.yscroll set] \ ] ttk::scrollbar $f.yscroll -command [list $var(annulitxt) yview] \ -orient vertical grid $var(annulitxt) $f.yscroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Radius Fini grid $var(top).radius -row 0 -column 1 -sticky news grid rowconfigure $var(top) 0 -weight 1 grid columnconfigure $var(top) 1 -weight 1 # init - do this last AnnulusDistCB $varname } # actions proc AnnulusClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback edit AnnulusEditCB $var(frame) marker $var(id) delete callback end edit AnnulusEditCB MarkerBaseCenterClose $varname } proc AnnulusApply {varname} { upvar #0 $varname var global $varname set levels {} regsub -all "\n" "[$var(annulitxt) get 1.0 end]" " " levels # and trim any trailing spaces set levels [string trimright $levels " "] if {$levels != {}} { $var(frame) marker $var(id) annulus radius "\{$levels\}" \ $var(dcoord) $var(dformat) } MarkerBaseCenterApply $varname } proc AnnulusGenerate {varname} { upvar #0 $varname var global $varname MarkerBaseAnnulusGenerateCircle $varname } # callbacks proc AnnulusCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "AnnulusCoordCB" } MarkerAnalysisRadialSystem $varname MarkerAnalysisStatsSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname } proc AnnulusEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "AnnulusEditCB" } set t [$var(frame) get marker $var(id) annulus radius \ $var(dcoord) $var(dformat)] set last [expr [llength $t]-1] set var(inner) [lindex $t 0] set var(outer) [lindex $t $last] set var(annuli) $last $var(annulitxt) delete 1.0 end $var(annulitxt) insert end "$t" } proc AnnulusDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "AnnulusDistCB" } AnnulusEditCB $varname } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/ar.tcl���������������������������������������������������������������������������000644 �000765 �000000 �00000011116 12542051131 015627� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ARInit {varname next} { upvar #0 $varname var global $varname set var(sync) 0 set var(proc,next) $next set var(name) {} set var(x) {} set var(y) {} set var(status) {} } proc ARApply {varname} { upvar #0 $varname var global $varname ARStatus $varname {} $var(mb).file entryconfig [msgcat::mc {Retrieve}] -state disabled $var(mb).file entryconfig [msgcat::mc {Cancel}] -state normal $var(apply) configure -state disabled $var(cancel) configure -state normal } proc ARCancel {varname} { upvar #0 $varname var global $varname # set state to 0 so that we don't process the finish proc set var(active) 0 if {[info exists var(token)]} { http::reset $var(token) } } proc ARDestroy {varname} { upvar #0 $varname var global $varname ARCancel $varname if {[winfo exists $var(top)]} { destroy $var(top) destroy $var(mb) } unset $varname } proc ARReset {varname} { upvar #0 $varname var global $varname set var(active) 0 if {[info exists var(token)]} { http::cleanup $var(token) unset var(token) } $var(mb).file entryconfig [msgcat::mc {Retrieve}] -state normal $var(mb).file entryconfig [msgcat::mc {Cancel}] -state disabled $var(apply) configure -state normal $var(cancel) configure -state disabled } proc ARDone {varname} { upvar #0 $varname var global $varname set var(status) {Done} ARReset $varname } proc ARCancelled {varname} { upvar #0 $varname var global $varname set var(status) {Cancelled} ARReset $varname } proc ARError {varname message} { upvar #0 $varname var global $varname set var(status) $message ARReset $varname } proc ARStatus {varname message} { upvar #0 $varname var global $varname set var(status) $message } proc ARClear {varname} { upvar #0 $varname var global $varname set var(name) {} set var(x) {} set var(y) {} set var(status) {} } proc ARCoord {varname} { upvar #0 $varname var global $varname global ds9 global pds9 switch -- $var(sky) { fk4 - fk5 - icrs { $var(xname) configure -text "\u03b1" \ -font "$ds9(times) $pds9(font,size)" $var(yname) configure -text "\u03b4" \ -font "$ds9(times) $pds9(font,size)" } galactic { $var(xname) configure -text {l} \ -font "{$ds9(times)} $pds9(font,size) normal italic" $var(yname) configure -text {b} \ -font "{$ds9(times)} $pds9(font,size) normal italic" } ecliptic { $var(xname) configure -text "\u03bb" \ -font "$ds9(times) $pds9(font,size)" $var(yname) configure -text "\u03b2" \ -font "$ds9(times) $pds9(font,size)" } } } proc AREditMenu {varname} { upvar #0 $varname var global $varname global ds9 $var(mb) add cascade -label [msgcat::mc {Edit}] -menu $var(mb).edit EditMenu $var(mb) $varname $var(mb).edit add separator $var(mb).edit add command -label [msgcat::mc {Clear}] \ -command "ARClear $varname" } proc ARSkyFormat {w varname} { upvar #0 $varname var global $varname set ${varname}(skyformat,msg) [msgcat::mc $var(skyformat)] ttk::menubutton $w -textvariable ${varname}(skyformat,msg) -menu $w.menu menu $w.menu $w.menu add radiobutton -label [msgcat::mc {Degrees}] \ -variable ${varname}(skyformat) -value degrees \ -command "ARSkyFormatMenu $varname" $w.menu add radiobutton -label {Sexagesimal} \ -variable ${varname}(skyformat) -value sexagesimal \ -command "ARSkyFormatMenu $varname" } proc ARSkyFormatMenu {varname} { upvar #0 $varname var global $varname set ${varname}(skyformat,msg) $var(skyformat) } proc ARRFormat {w varname} { upvar #0 $varname var global $varname set ${varname}(rformat,msg) [msgcat::mc $var(rformat)] ttk::menubutton $w -textvariable ${varname}(rformat,msg) -menu $w.menu menu $w.menu $w.menu add radiobutton -label [msgcat::mc {Degrees}] \ -variable ${varname}(rformat) -value degrees \ -command "ARRFormatMenu $varname" $w.menu add radiobutton -label [msgcat::mc {ArcMin}] \ -variable ${varname}(rformat) -value arcmin \ -command "ARRFormatMenu $varname" $w.menu add radiobutton -label [msgcat::mc {ArcSec}] \ -variable ${varname}(rformat) -value arcsec \ -command "ARRFormatMenu $varname" } proc ARRFormatMenu {varname} { upvar #0 $varname var global $varname set ${varname}(rformat,msg) $var(rformat) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/array.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000006017 12464211202 016347� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ImportArrayFile {fn layer} { global loadParam set loadParam(file,type) array set loadParam(file,mode) {} set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer # check for stdin/gz ConvertArrayFile ProcessLoad } proc ImportArrayAlloc {path fn layer} { global loadParam set loadParam(file,type) array set loadParam(file,mode) {} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc ImportArraySocket {sock fn layer} { global loadParam set loadParam(file,type) array set loadParam(file,mode) {} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc ExportArrayFile {fn opt} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save array file "\{$fn\}" $opt } proc ExportArraySocket {sock opt} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save array socket $sock $opt } proc ProcessArrayCmd {varname iname sock fn} { upvar $varname var upvar $iname i if {[ProcessArrayBackwardCmd $varname $iname $sock $fn]} { return } global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not suppported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![ImportArraySocket $sock $param $layer]} { InitError xpa ImportArrayFile $param $layer } } else { # comm if {$fn != {}} { ImportArrayAlloc $fn $param $layer } else { ImportArrayFile $param $layer } } FinishLoad } proc ProcessSendArrayCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } set opt [string tolower [lindex $param 0]] if {$sock != {}} { # xpa ExportArraySocket $sock $opt } elseif {$fn != {}} { # comm ExportArrayFile $fn $opt $proc $id {} $fn } } # backward compatibility proc ProcessArrayBackwardCmd {varname iname sock fn} { upvar 2 $varname var upvar 2 $iname i set vvar $var set ii $i switch -- [string tolower [lindex $var $i]] { rgb { set vvar [lreplace $var 0 0] ProcessRGBArrayCmd vvar ii $sock $fn return 1 } new { switch -- [string tolower [lindex $var [expr $i+1]]] { rgb { set vvar [lreplace $var 1 1] ProcessRGBArrayCmd vvar ii $sock $fn return 1 } } } } return 0 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/backup.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000046210 12632364542 016512� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BackupDialog {} { set fn [SaveFileDialog backupfbox] if {[string length $fn] != 0} { Backup $fn } } proc Backup {fn} { global ds9 global current switch $ds9(wm) { x11 - aqua {} win32 {set fn [file normalize [file nativename $fn]]} } # script, always overwrite if present if {[catch {set ch [open $fn w]}]} { Error [msgcat::mc {An error has occurred during backup}] return } # aux directory, create if needed set dir "${fn}.dir" if {[file exists $dir]} { if {![file isdirectory $dir]} { Error [msgcat::mc {An error has occurred during backup}] return } } else { if {[catch {file mkdir $dir}]} { Error [msgcat::mc {An error has occurred during backup}] return } } # update any tags if {$current(frame) != {}} { $current(frame) colorbar tag "\{[$current(colorbar) get tag]\}" } # check for newer backup version puts $ch "global ds9" puts $ch "set vv [lindex $ds9(version) 0]" puts $ch "\# this is a check for to ensure a match between the" puts $ch "\# current ds9 version matches the prefs version" puts $ch "switch -- \[string compare \$vv \[lindex \$ds9(version)\ 0\]\] {" puts $ch " -1 {" puts $ch " if {\[tk_messageBox -type yesno -icon question -message \[msgcat::mc {DS9 has detected an older backup file, do you wish to continue?}\]\] == {no}} {" puts $ch " return" puts $ch " }" puts $ch " }" puts $ch " 0 {}" puts $ch " 1 {" puts $ch " tk_messageBox -type ok -icon warning -message \[msgcat::mc {DS9 has detected a newer version of a backup file and therefore will not process this file.}\]" puts $ch " return" puts $ch " }" puts $ch "}" # and file find proc puts $ch "proc BackupFindFile {varname} {" puts $ch " upvar \$varname var" puts $ch "" puts $ch " set id \[string first \"\\\[\" \$var(file,name)\]" puts $ch " if {\$id > 0} {" puts $ch " set fn \[string range \$var(file,name) 0 \[expr \$id-1\]\]" puts $ch " set ext \[string range \$var(file,name) \$id end\]" puts $ch " } else {" puts $ch " set fn \$var(file,name)" puts $ch " set ext {}" puts $ch " }" puts $ch "" puts $ch " if {!\[file exists \$fn\]} {" puts $ch " Error \"\[msgcat::mc {Unable to load}\] \$fn\"" puts $ch " global fitsfbox" puts $ch " set fn \[OpenFileDialog fitsfbox\]" puts $ch " if {\$fn == {}} {" puts $ch " Error \[msgcat::mc {An error has occurred during restore}\]" puts $ch " return 0" puts $ch " }" puts $ch " if {!\[file exists \$fn\]} {" puts $ch " Error \[msgcat::mc {An error has occurred during restore}\]" puts $ch " return 0" puts $ch " }" puts $ch " set var(file,name) \"\$fn\$ext\"" puts $ch " }" puts $ch "" puts $ch " return 1" puts $ch "}" # Panner PannerBackup $ch # Colorbar ColorbarBackupCmaps $ch $dir ColorbarBackup $ch colorbar ColorbarBackup $ch colorbarrgb # Frames foreach ff $ds9(frames) { if {![$ff has iis]} { BackupFrame $ch $ff $dir } } # Geometry BackupGUI $ch # User Plots PlotBackup $ch $dir # all done close $ch } proc RestoreDialog {} { set fn [OpenFileDialog backupfbox] if {[string length $fn] != 0} { Restore $fn } } proc Restore {fn} { global ds9 global pds9 if {[string length $fn] == 0} { return } switch $ds9(wm) { x11 - aqua {} win32 {set fn [file normalize [file nativename $fn]]} } # clear all frames DeleteAllFrames # kill all dialogs foreach dlg [list dtwomass dsao deso dstsci dvla dnvss dskyview] { global $dlg if {[array exists $dlg]} { ARDestroy $dlg } } # kill all cats global icat foreach varname $icat(cats) { CATDestroy $varname } # kill all plots global iap foreach varname $iap(windows) { PlotDestroy $varname } set dir [file dirname $fn] set ffn [lindex [file split $fn] end] set cd [pwd] cd $dir # fix a problem with 6.1.2 global prefs set rr $prefs(version) # ok, this is a major kludge to fix a major booboo. # Beta versions generated backup save sets with vv set to # something like '7.4b7'. We need to remove the 'b7' part. set src {} if {![catch {set ch [open "$ffn" r]}]} { set src [read $ch] close $ch } else { Error [msgcat::mc {An error has occurred during restore}] return } set aa [string first {set vv } $src] set bb [string first {# this is} $src] if {$aa != -1 && $bb != -1 && $aa < $bb} { set bb [expr $bb -2] set ver [string range $src $aa $bb] set ll [string first {b} $ver] if {$ll != -1} { set ll [expr $ll -1] set src [string replace $src $aa $bb [string range $ver 0 $ll]] } } else { Error [msgcat::mc {An error has occurred during restore}] return } # and load the world if {[catch {eval $src}]} { Error [msgcat::mc {An error has occurred during restore}] global debug if {$debug(tcl,restore)} { global errorInfo puts stderr "$errorInfo" } return } # historical note, vv contains version number of save set originator if {![info exists vv]} { set vv [lindex $ds9(version) 0] } # fix 6.1.2 if {$vv == {6.1.2}} { set prefs(version) $rr } # fix any prefs FixPrefs $vv # reset standard dialog switch $ds9(wm) { x11 {set pds9(dialog) motif} aqua - win32 {set pds9(dialog) native} } # return to start dir cd $cd # and update it UpdateGraphGrid LayoutOrient UpdateActiveFrames ChangeMode UpdateDS9 } proc BackupFrame {ch which dir} { set fdir [file join $dir $which] set rdir "./[lindex [file split $dir] end]/$which" # create dir if needed if {![file isdirectory $fdir]} { if {[catch {file mkdir $fdir}]} { Error [msgcat::mc {An error has occurred during backup}] return } } # frame set type [$which get type] puts $ch "CreateNameNumberFrame $which $type" switch -- $type { base {BackupFrameLoad $ch $which $fdir $rdir {}} 3d { BackupFrameLoad $ch $which $fdir $rdir {} puts $ch "3DDialog" } rgb { foreach cc {{} red green blue} { BackupFrameLoad $ch $which $fdir $rdir $cc } puts $ch "RGBDialog" } } MagnifierFrameBackup $ch $which ColorFrameBackup $ch $which ColormapFrameBackup $ch $which DS9Backup $ch $which CubeBackup $ch $which RGBBackup $ch $which 3DBackup $ch $which BinBackup $ch $which ScaleBackup $ch $which PanZoomBackup $ch $which # Block need to be before Crop BlockBackup $ch $which CropBackup $ch $which MarkerBackup $ch $which $fdir $rdir CentroidBackup $ch $which WCSBackup $ch $which $fdir $rdir MaskBackup $ch $which SmoothBackup $ch $which ContourBackup $ch $which $fdir $rdir GridBackup $ch $which CATBackup $ch $which $fdir $rdir } proc BackupFrameLoad {ch which fdir rdir channel} { set base $which$channel set seq 1 set varname $base global $varname if {![info exists $varname]} { # special case set varname "$base.$seq" global $varname } while {[info exists $varname]} { if {$channel != {}} { puts $ch "$which rgb channel $channel" } array set param [array get $varname] switch $param(load,type) { mmap - mmapincr - smmap - shared - sshared { if {![BackupFrameLoadMMap param $fdir $rdir]} { Error [msgcat::mc {An error has occurred during backup}] return } } alloc - allocgz { if {![BackupFrameLoadMMap param $fdir $rdir]} { BackupFrameLoadAlloc $which param $fdir $rdir } } channel - socket - socketgz - var {BackupFrameLoadAlloc $which param $fdir $rdir} photo { if {[BackupFrameLoadMMap param $fdir $rdir]} { puts $ch "global bcktmp" puts $ch "if {\[catch {image create photo -file $param(file,name)} bcktmp\]} {" puts $ch "Error \[msgcat::mc {An error has occurred during restore}\]" puts $ch "return" puts $ch "}" } else { BackupFrameLoadAlloc $which param $fdir $rdir } } } puts $ch "global loadParam" puts $ch "array set loadParam \[list [array get param]\]" switch $param(load,type) { photo { puts $ch "set loadParam(var,name) \$bcktmp" } } puts $ch "if \[BackupFindFile loadParam\] {" puts $ch " ProcessLoad" puts $ch "}" switch $param(load,type) { photo { puts $ch "image delete \$bcktmp" } } incr seq set varname "$base.$seq" global $varname } } proc BackupFrameLoadMMap {varname fdir rdir} { upvar $varname param global pds9 set id [string first "\[" $param(file,name)] if {$id > 0} { set fn [string range $param(file,name) 0 [expr $id-1]] set ext [string range $param(file,name) $id end] } else { set fn $param(file,name) set ext {} } if {![file exists $fn]} { return 0 } # special case, we use 'stdin' for input from stdin, ignore if {$fn == {stdin}} { return 0 } if {$pds9(backup)} { # look for sym links switch [file type $fn] { file {} link {set fn [file readlink $fn]} default { return 0 } } set src [lindex [file split $fn] end] if {![file exists [file join $fdir $src]]} { if {[catch {file copy $fn $fdir}]} { return 0 } } set param(file,name) "$rdir/[lindex [file split $fn] end]$ext" } else { if {[file pathtype $param(file,name)] == {relative}} { set param(file,name) [file join [pwd] $param(file,name)] } } # special case: mmap to allocgz via ConvertFitsFile/ConvertArrayFile if {[info exists param(file,fn)]} { set param(file,fn) $param(file,name) } return 1 } proc BackupFrameLoadAlloc {which varname fdir rdir} { upvar $varname param set ff [$which get fits file name root base] set id [string first "\[" $ff] if {$id > 0} { set fn [string range $ff 0 [expr $id-1]] } else { set fn $ff } if {$ff == {}} { set ff ds9.fits set fn ds9.fits } set ffn [file join $fdir $fn] switch $param(file,type) { fits { switch $param(file,mode) { {} { if {[$which has fits bin]} { $which save fits table file \"$ffn\" } else { $which save fits image file \"$ffn\" } } {rgb cube} {$which save fits rgb cube file \"$ffn\"} {rgb image} {$which save fits rgb image file \"$ffn\"} {ext cube} {$which save fits image file \"$ffn\"} default { if {[string range $param(file,mode) 0 5] == {mosaic}} { $which save fits mosaic image file "\{$ffn\}" } } } } array { switch $param(file,mode) { {} {$which save fits image file \"$ffn\"} {rgb cube} {$which save fits rgb cube file \"$ffn\"} } } nrrd {$which save fits image file \"$ffn\"} photo { switch -- [$which get type] { base - 3d {$which save fits image file \"$ffn\"} rgb { $which save fits rgb cube file \"$ffn\" set param(file,mode) {rgb cube} } } } } set param(load,type) mmapincr set param(file,type) fits # use $fn as we are not saving multiple extentions if present set param(file,name) "[file join $rdir $fn]" } proc BackupGUI {ch} { # Basic global pds9 puts $ch "global pds9" puts $ch "array set pds9 \{ [array get pds9] \}" global current puts $ch "global current" puts $ch "array set current \{ [array get current] \}" global pcurrent puts $ch "global pcurrent" puts $ch "array set pcurrent \{ [array get pcurrent] \}" global view puts $ch "global view" puts $ch "array set view \{ [array get view] \}" global pview puts $ch "global pview" puts $ch "array set pview \{ [array get pview] \}" global canvas puts $ch "global canvas" puts $ch "array set canvas \{ [array get canvas] \}" global phttp puts $ch "global phttp" puts $ch "array set phttp \{ [array get phttp] \}" global pbuttons puts $ch "global pbuttons" puts $ch "array set pbuttons \{ [array get pbuttons] \}" global ppanner puts $ch "global ppanner" puts $ch "array set ppanner \{ [array get ppanner] \}" global pmagnifier puts $ch "global pmagnifier" puts $ch "array set pmagnifier \{ [array get pmagnifier] \}" global colorbar puts $ch "global colorbar" puts $ch "array set colorbar \{ [array get colorbar] \}" global saveimage puts $ch "global saveimage" puts $ch "array set saveimage \{ [array get saveimage] \}" # don't save prefs(version), keep the current, not the save set version # removed after 6.1.2 # global prefs # puts $ch "global prefs" # puts $ch "array set prefs \{ [array get prefs] \}" global debug puts $ch "global debug" puts $ch "array set debug \{ [array get debug] \}" # File global ps puts $ch "global ps" puts $ch "array set ps \{ [array get ps] \}" global pps puts $ch "global pps" puts $ch "array set pps \{ [array get pps] \}" # Frame global rgb puts $ch "global rgb" puts $ch "array set rgb \{ [array get rgb] \}" global threed puts $ch "global threed" puts $ch "array set threed \{ [array get threed] \}" global blink puts $ch "global blink" puts $ch "array set blink \{ [array get blink] \}" global pblink puts $ch "global pblink" puts $ch "array set pblink \{ [array get pblink] \}" global tile puts $ch "global tile" puts $ch "array set tile \{ [array get tile] \}" global ptile puts $ch "global ptile" puts $ch "array set ptile \{ [array get ptile] \}" global crosshair puts $ch "global crosshair" puts $ch "array set crosshair \{ [array get crosshair] \}" global cube puts $ch "global cube" puts $ch "array set cube \{ [array get cube] \}" # Bin global bin puts $ch "global bin" puts $ch "array set bin \{ [array get bin] \}" global pbin puts $ch "global pbin" puts $ch "array set pbin \{ [array get pbin] \}" # Zoom global panzoom puts $ch "global panzoom" puts $ch "array set panzoom \{ [array get panzoom] \}" global ppanzoom puts $ch "global ppanzoom" puts $ch "array set ppanzoom \{ [array get ppanzoom] \}" # Crop global crop puts $ch "global crop" puts $ch "array set crop \{ [array get crop] \}" # Scale global scale puts $ch "global scale" puts $ch "array set scale \{ [array get scale] \}" global pscale puts $ch "global pscale" puts $ch "array set pscale \{ [array get pscale] \}" global minmax puts $ch "global minmax" puts $ch "array set minmax \{ [array get minmax] \}" global pminmax puts $ch "global pminmax" puts $ch "array set pminmax \{ [array get pminmax] \}" global zscale puts $ch "global zscale" puts $ch "array set zscale \{ [array get zscale] \}" global pzscale puts $ch "global pzscale" puts $ch "array set pzscale \{ [array get pzscale] \}" # Region global marker puts $ch "global marker" puts $ch "array set marker \{ [array get marker] \}" global pmarker puts $ch "global pmarker" puts $ch "array set pmarker \{ [array get pmarker] \}" global centroid puts $ch "global centroid" puts $ch "array set centroid \{ [array get centroid] \}" # WCS global wcs puts $ch "global wcs" puts $ch "array set wcs \{ [array get wcs] \}" global pwcs puts $ch "global pwcs" puts $ch "array set pwcs \{ [array get pwcs] \}" # Analysis global ime puts $ch "global ime" puts $ch "array set ime \{ [array get ime] \}" global pime puts $ch "global pime" puts $ch "array set pime \{ [array get pime] \}" global pgraph puts $ch "global pgraph" puts $ch "array set pgraph \{ [array get pgraph] \}" global pcoord puts $ch "global pcoord" puts $ch "array set pcoord \{ [array get pcoord] \}" global pexamine puts $ch "global pexamine" puts $ch "array set pexamine \{ [array get pexamine] \}" global pixel puts $ch "global pixel" puts $ch "array set pixel \{ [array get pixel] \}" global mask puts $ch "global mask" puts $ch "array set mask \{ [array get mask] \}" global pmask puts $ch "global pmask" puts $ch "array set pmask \{ [array get pmask] \}" global contour puts $ch "global contour" puts $ch "array set contour \{ [array get contour] \}" global pcontour puts $ch "global pcontour" puts $ch "array set pcontour \{ [array get pcontour] \}" global grid puts $ch "global grid" puts $ch "array set grid \{ [array get grid] \}" global pgrid puts $ch "global pgrid" puts $ch "array set pgrid \{ [array get pgrid] \}" global block puts $ch "global block" puts $ch "array set block \{ [array get block] \}" global pblock puts $ch "global pblock" puts $ch "array set pblock \{ [array get pblock] \}" global smooth puts $ch "global smooth" puts $ch "array set smooth \{ [array get smooth] \}" global psmooth puts $ch "global psmooth" puts $ch "array set psmooth \{ [array get psmooth] \}" global nres puts $ch "global nres" puts $ch "array set nres \{ [array get nres] \}" global pnres puts $ch "global pnres" puts $ch "array set pnres \{ [array get pnres] \}" global sao puts $ch "global sao" puts $ch "array set sao \{ [array get sao] \}" global eso puts $ch "global eso" puts $ch "array set eso \{ [array get eso] \}" global stsci puts $ch "global stsci" puts $ch "array set stsci \{ [array get stsci] \}" global twomass puts $ch "global twomass" puts $ch "array set twomass \{ [array get twomass] \}" global nvss puts $ch "global nvss" puts $ch "array set nvss \{ [array get nvss] \}" global skyview puts $ch "global skyview" puts $ch "array set skyview \{ [array get skyview] \}" global cat puts $ch "global cat" puts $ch "array set cat \{ [array get cat] \}" global pcat puts $ch "global pcat" puts $ch "array set pcat \{ [array get pcat] \}" global vla puts $ch "global vla" puts $ch "array set vla \{ [array get vla] \}" global pvo puts $ch "global pvo" puts $ch "array set pvo \{ [array get pvo] \}" global pap puts $ch "global pap" puts $ch "array set pap \{ [array get pap] \}" global panalysis puts $ch "global panalysis" puts $ch "array set panalysis \{ [array get panalysis] \}" global active puts $ch "global active" puts $ch "array set active \{ [array get active] \}" } proc ProcessBackupCmd {varname iname} { upvar $varname var upvar $iname i set fn [lindex $var $i] if {$fn != {}} { FileLast backupfbox $fn Backup $fn } else { Error [msgcat::mc {Unable to open file}] } } proc ProcessRestoreCmd {varname iname} { upvar $varname var upvar $iname i set fn [lindex $var $i] if {$fn != {}} { FileLast backupfbox $fn Restore $fn } else { Error [msgcat::mc {Unable to open file}] } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/bin.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000051314 12622671075 016017� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BinDef {} { global bin global ibin global pbin global tcl_platform set ibin(top) .bl set ibin(mb) .blmb set bin(lock) 0 set bin(function) sum set bin(factor) { 1 1 } set bin(depth) 1 set bin(buffersize) 1024 array set pbin [array get bin] # prefs only set pbin(wheel) 0 set pbin(wheel,factor) 1.2 # special case switch -- $tcl_platform(os) { Darwin { switch [lindex [split $tcl_platform(osVersion) {.}] 0] { 11 {set pbin(wheel,factor) 1.01} } } } } proc Bin {bx by} { global current if {$current(frame) != {}} { BinFrame $current(frame) $bx $by } } proc BinFrame {which bx by} { global bin global current global rgb RGBEvalLock rgb(lock,bin) $which [list $which bin factor $bx $by] if {$which == $current(frame)} { set bin(factor) "[$current(frame) get bin factor]" } UpdateBin } proc BinAbout {x y} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin about $x $y] UpdateBin } } proc BinAboutCenter {} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin about center] UpdateBin } } proc BinCols {x y z} { global bin global current global rgb if {$current(frame) != {}} { if {![$current(frame) has bin column $x]} { Error "[msgcat::mc {Invalid Column Name}] $x" return } if {![$current(frame) has bin column $y]} { Error "[msgcat::mc {Invalid Column Name}] $y" return } if {$z!={""}} { if {![$current(frame) has bin column $z]} { Error "[msgcat::mc {Invalid Column Name}] $z" return } } RGBEvalLockCurrent rgb(lock,bin) "$current(frame) bin cols \{$x\} \{$y\} \{$z\}" UpdateBin } } proc BinFilter {str} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) "$current(frame) bin filter \{\{$str\}\}" UpdateBin } } proc BinToFit {} { global current global bin global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin to fit] set bin(factor) "[$current(frame) get bin factor]" UpdateBin } } proc ChangeBinFactor {} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin factor to $bin(factor)] UpdateBin } } proc ChangeBinDepth {} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin depth $bin(depth)] UpdateBin } } proc ChangeBinFunction {} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin function $bin(function)] UpdateBin } } proc ChangeBinBufferSize {} { global bin global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,bin) [list $current(frame) bin buffer size $bin(buffersize)] UpdateBin } } proc UpdateBin {} { global current global debug if {$debug(tcl,update)} { puts stderr "UpdateBin" } LockBinCurrent UpdateBinDialog UpdateCrosshairDialog UpdateCropDialog UpdateCubeDialog UpdateScaleDialog UpdateContourScale UpdateContourDialog UpdateWCSDialog UpdateGraphXAxis $current(frame) UpdateGraphYAxis $current(frame) UpdateMain } proc BinDialog {} { global bin global ibin global dbin global ds9 # see if we already have a window visible if {[winfo exists $ibin(top)]} { raise $ibin(top) return } # create the window set w $ibin(top) set mb $ibin(mb) Toplevel $w $mb 6 [msgcat::mc {Binning Parameters}] BinDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Method}] -menu $mb.method $mb add cascade -label [msgcat::mc {Bin}] -menu $mb.bin $mb add cascade -label [msgcat::mc {Buffer}] -menu $mb.buffer menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command BinApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Update Filter}] \ -command BinUpdateFilterDialog $mb.file add command -label [msgcat::mc {Clear Filter}] \ -command BinClearFilterDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command BinDestroyDialog EditMenu $mb ibin menu $mb.method $mb.method add radiobutton -label [msgcat::mc {Average}] \ -variable bin(function) -value average -command ChangeBinFunction $mb.method add radiobutton -label [msgcat::mc {Sum}] \ -variable bin(function) -value sum -command ChangeBinFunction menu $mb.bin $mb.bin add command -label [msgcat::mc {Bin In}] \ -command {Bin .5 .5} $mb.bin add command -label [msgcat::mc {Bin Out}] \ -command {Bin 2 2} $mb.bin add command -label [msgcat::mc {Bin Fit}] \ -command BinToFit $mb.bin add separator $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 1" \ -variable bin(factor) -value { 1 1 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 2" \ -variable bin(factor) -value { 2 2 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 4" \ -variable bin(factor) -value { 4 4 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 8" \ -variable bin(factor) -value { 8 8 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 16" \ -variable bin(factor) -value { 16 16 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 32" \ -variable bin(factor) -value { 32 32 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 64" \ -variable bin(factor) -value { 64 64 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 128" \ -variable bin(factor) -value { 128 128 } -command ChangeBinFactor $mb.bin add radiobutton -label "[msgcat::mc {Bin}] 256" \ -variable bin(factor) -value { 256 256 } -command ChangeBinFactor menu $mb.buffer $mb.buffer add radiobutton -label {128x128} \ -variable bin(buffersize) -value 128 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {256x256} \ -variable bin(buffersize) -value 256 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {512x512} \ -variable bin(buffersize) -value 512 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {1024x1024} \ -variable bin(buffersize) -value 1024 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {2048x2048} \ -variable bin(buffersize) -value 2048 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {4096x4096} \ -variable bin(buffersize) -value 4096 -command ChangeBinBufferSize $mb.buffer add radiobutton -label {8192x8192} \ -variable bin(buffersize) -value 8192 -command ChangeBinBufferSize # Columns set f [ttk::labelframe $w.cols -text [msgcat::mc {Bin Columns}] -padding 2] ttk::label $f.title -text [msgcat::mc {Column}] ttk::label $f.titlefactor -text [msgcat::mc {Bin}] ttk::label $f.titlemin -text [msgcat::mc {Min}] ttk::label $f.titlemax -text [msgcat::mc {Max}] ttk::menubutton $f.x -textvariable dbin(xcol) -menu $f.x.m -width 10 ttk::entry $f.xfactor -textvariable dbin(factor,x) -width 8 ttk::label $f.xmin -textvariable dbin(xcol,min) -width 12 -relief groove ttk::label $f.xmax -textvariable dbin(xcol,max) -width 12 -relief groove ttk::menubutton $f.y -textvariable dbin(ycol) -menu $f.y.m -width 10 ttk::entry $f.yfactor -textvariable dbin(factor,y) -width 8 ttk::label $f.ymin -textvariable dbin(ycol,min) -width 12 -relief groove ttk::label $f.ymax -textvariable dbin(ycol,max) -width 12 -relief groove grid $f.title $f.titlefactor $f.titlemin $f.titlemax -padx 2 -pady 2 grid $f.x $f.xfactor $f.xmin $f.xmax -padx 2 -pady 2 grid $f.y $f.yfactor $f.ymin $f.ymax -padx 2 -pady 2 # Center set f [ttk::labelframe $w.center -text [msgcat::mc {Bin Center}] -padding 2] ttk::entry $f.x -textvariable dbin(x) -width 12 ttk::entry $f.y -textvariable dbin(y) -width 12 ttk::checkbutton $f.auto -text [msgcat::mc {or center of data}] \ -variable dbin(auto) grid $f.x $f.y $f.auto -padx 2 -pady 2 # Filter set f [ttk::labelframe $w.filter -text [msgcat::mc {Bin Filter}] -padding 2] set dbin(filter,entry) \ [ttk::entry $f.filter -textvariable dbin(filter) -width 40] grid $f.filter -padx 2 -pady 2 # Bin 3rd Column set f [ttk::labelframe $w.z -text [msgcat::mc {Bin 3rd Column}] -padding 2] ttk::label $f.title -text [msgcat::mc {Column}] ttk::label $f.titledepth -text [msgcat::mc {Depth}] ttk::label $f.titlemin -text [msgcat::mc {Min}] ttk::label $f.titlemax -text [msgcat::mc {Max}] ttk::menubutton $f.z -textvariable dbin(zcol) -menu $f.z.m -width 10 ttk::entry $f.depth -textvariable dbin(depth) -width 8 ttk::entry $f.min -textvariable dbin(zcol,min) -width 12 ttk::entry $f.max -textvariable dbin(zcol,max) -width 12 grid $f.title $f.titledepth $f.titlemin $f.titlemax -padx 2 -pady 2 grid $f.z $f.depth $f.min $f.max -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command BinApplyDialog ttk::button $f.update -text [msgcat::mc {Update Filter}] \ -command BinUpdateFilterDialog ttk::button $f.clear -text [msgcat::mc {Clear Filter}] \ -command BinClearFilterDialog ttk::button $f.close -text [msgcat::mc {Close}] -command BinDestroyDialog pack $f.apply $f.update $f.clear $f.close \ -side left -expand true -padx 2 -pady 4 # Fini grid $w.cols -sticky news grid $w.center -sticky news grid $w.filter -sticky news grid $w.z -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid rowconfigure $w 2 -weight 1 grid rowconfigure $w 3 -weight 1 grid columnconfigure $w 0 -weight 1 $w.cols.xfactor select range 0 end set dbin(auto) 0 set dbin(minmax) 1 UpdateBinDialog } proc PopUp {b m l cmd} { global ds9 destroy $m menu $m -tearoff 0 set cnt -1 for {set ii 0} {$ii<[llength $l]} {incr ii} { $m add command -label [lindex $l $ii] \ -command "global dbin;set $b [lindex $l $ii]; $cmd" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $m entryconfig $ii -columnbreak 1 } } } proc BlankPopUp {m} { destroy $m menu $m -tearoff 0 } proc UpdateBinDialog {} { global bin global ibin global dbin global current global debug if {$debug(tcl,update)} { puts stderr "UpdateBinDialog" } if {![winfo exists $ibin(top)]} { return } if {$current(frame) == {}} { return } set w $ibin(top) set bf "[$current(frame) get bin factor]" set dbin(factor,x) [lindex $bf 0] set dbin(factor,y) [lindex $bf 1] set dbin(depth) [$current(frame) get bin depth] if {[$current(frame) has fits bin]} { set cols [$current(frame) get bin cols] set colslist "[$current(frame) get bin list]" set dbin(xcol) [lindex $cols 0] set dbin(ycol) [lindex $cols 1] PopUp dbin(xcol) $w.cols.x.m $colslist UpdateXCol PopUp dbin(ycol) $w.cols.y.m $colslist UpdateYCol set mm [$current(frame) get bin cols minmax \{$dbin(xcol)\}] set dbin(xcol,min) [lindex $mm 0] set dbin(xcol,max) [lindex $mm 1] set mm [$current(frame) get bin cols minmax \{$dbin(ycol)\}] set dbin(ycol,min) [lindex $mm 0] set dbin(ycol,max) [lindex $mm 1] set cursor [$current(frame) get bin cursor] set dbin(x) [lindex $cursor 0] set dbin(y) [lindex $cursor 1] set dbin(filter) [$current(frame) get bin filter] set dbin(zcol) [lindex $cols 2] PopUp dbin(zcol) $w.z.z.m $colslist UpdateZCol set mm [$current(frame) get bin cols dim \{$dbin(zcol)\}] set dbin(zcol,min) [lindex $mm 0] set dbin(zcol,max) [lindex $mm 1] } else { set dbin(xcol) {} set dbin(xcol,min) {} set dbin(xcol,max) {} set dbin(ycol) {} set dbin(ycol,min) {} set dbin(ycol,max) {} set dbin(x) {} set dbin(y) {} set dbin(filter) {} set dbin(zcol) {} set dbin(zcol,min) {} set dbin(zcol,max) {} BlankPopUp $w.cols.x.m BlankPopUp $w.cols.y.m BlankPopUp $w.z.z.m } } proc UpdateXCol {} { global current global dbin if {$current(frame) != {} && [$current(frame) has fits bin] && $dbin(xcol) != {}} { set mm [$current(frame) get bin cols minmax \{$dbin(xcol)\}] set dbin(xcol,min) [lindex $mm 0] set dbin(xcol,max) [lindex $mm 1] } else { set dbin(xcol,min) {} set dbin(xcol,max) {} } } proc UpdateYCol {} { global current global dbin if {$current(frame) != {} && [$current(frame) has fits bin] && $dbin(ycol) != {}} { set mm [$current(frame) get bin cols minmax \{$dbin(ycol)\}] set dbin(ycol,min) [lindex $mm 0] set dbin(ycol,max) [lindex $mm 1] } else { set dbin(ycol,min) {} set dbin(ycol,max) {} } } proc UpdateZCol {} { global current global dbin if {$current(frame) != {} && [$current(frame) has fits bin] && $dbin(zcol) != {}} { if {$dbin(minmax)} { set mm [$current(frame) get bin cols dim \{$dbin(zcol)\}] set dbin(zcol,min) [lindex $mm 0] set dbin(zcol,max) [lindex $mm 1] } } else { set dbin(zcol,min) {} set dbin(zcol,max) {} } } proc BinApplyDialog {} { global bin global dbin global current global rgb if {$current(frame) == {}} { # reset set dbin(auto) 0 return } # clean up filter if needed set dbin(filter) [string trimleft $dbin(filter)] set dbin(filter) [string trimright $dbin(filter)] # delete any markers if needed if {[$current(frame) has fits bin]} { set foo [$current(frame) get bin cols] set xcol [lindex $foo 0] set ycol [lindex $foo 1] if {$xcol != $dbin(xcol) || $ycol != $dbin(ycol)} { $current(frame) marker delete all } } if {$dbin(depth)>1} { CubeDialog if {$dbin(auto)} { if {$dbin(factor,x) != {} && $dbin(factor,y) != {} && $dbin(depth) != {} && $dbin(zcol,min) != {} && $dbin(zcol,max) != {} && $dbin(xcol) != {} && $dbin(ycol) != {} && $dbin(zcol) != {}} { RGBEvalLockCurrent rgb(lock,bin) \ [list $current(frame) bin to $dbin(factor,x) $dbin(factor,y) $dbin(depth) $dbin(zcol,min) $dbin(zcol,max) about center \{$dbin(xcol)\} \{$dbin(ycol)\} \{$dbin(zcol)\} \{$dbin(filter)\}] } } else { if {$dbin(factor,x) != {} && $dbin(factor,y) != {} && $dbin(depth) != {} && $dbin(zcol,min) != {} && $dbin(zcol,max) != {} && $dbin(x) != {} && $dbin(y) != {} && $dbin(xcol) != {} && $dbin(ycol) != {} && $dbin(zcol) != {}} { RGBEvalLockCurrent rgb(lock,bin) \ [list $current(frame) bin to $dbin(factor,x) $dbin(factor,y) $dbin(depth) $dbin(zcol,min) $dbin(zcol,max) about $dbin(x) $dbin(y) \{$dbin(xcol)\} \{$dbin(ycol)\} \{$dbin(zcol)\} \{$dbin(filter)\}] } } } else { if {$dbin(auto)} { if {$dbin(factor,x) != {} && $dbin(factor,y) != {} && $dbin(xcol) != {} && $dbin(ycol) != {}} { RGBEvalLockCurrent rgb(lock,bin) \ [list $current(frame) bin to $dbin(factor,x) $dbin(factor,y) about center \{$dbin(xcol)\} \{$dbin(ycol)\} \{$dbin(filter)\}] } } else { if {$dbin(factor,x) != {} && $dbin(factor,y) != {} && $dbin(x) != {} && $dbin(y) != {} && $dbin(xcol) != {} && $dbin(ycol) != {}} { RGBEvalLockCurrent rgb(lock,bin) \ [list $current(frame) bin to $dbin(factor,x) $dbin(factor,y) about $dbin(x) $dbin(y) \{$dbin(xcol)\} \{$dbin(ycol)\} \{$dbin(filter)\}] } } } UpdateScaleMenu UpdateBinMenu UpdateBin # reset set dbin(auto) 0 } proc BinUpdateFilterDialog {} { global dbin global current $dbin(filter,entry) delete 0 end if {$current(frame) != {}} { $dbin(filter,entry) insert 0 \ [$current(frame) marker list ds9 physical fk5 degrees yes] } } proc BinClearFilterDialog {} { global dbin $dbin(filter,entry) delete 0 end } proc BinDestroyDialog {} { global ibin global dbin if {[winfo exists $ibin(top)]} { destroy $ibin(top) destroy $ibin(mb) } unset dbin } proc MatchBinCurrent {} { global current if {$current(frame) != {}} { MatchBin $current(frame) } } proc MatchBin {which} { global ds9 global rgb set factor [$which get bin factor] set depth [$which get bin depth] set filter [$which get bin filter] set size [$which get bin buffer size] set function [$which get bin function] set cols [$which get bin cols] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,bin) $ff [list $ff bin factor to $factor] RGBEvalLock rgb(lock,bin) $ff [list $ff bin depth $depth] RGBEvalLock rgb(lock,bin) $ff "$ff bin filter \{\{$filter\}\}" RGBEvalLock rgb(lock,bin) $ff [list $ff bin buffer size $size] RGBEvalLock rgb(lock,bin) $ff [list $ff bin function $function] RGBEvalLock rgb(lock,bin) $ff "$ff bin cols \{\{[lindex $cols 0]\}\} \{\{[lindex $cols 1]\}\} \{\{[lindex $cols 2]\}\}" } } } proc LockBinCurrent {} { global current if {$current(frame) != {}} { LockBin $current(frame) } } proc LockBin {which} { global bin if {$bin(lock)} { MatchBin $which } } proc BinBackup {ch which} { switch [$which get type] { base - 3d {BinBackupBase $ch $which} rgb {BinBackupRGB $ch $which} } } proc BinBackupBase {ch which} { puts $ch "$which bin factor to [$which get bin factor]" puts $ch "$which bin depth [$which get bin depth]" puts $ch "$which bin filter \{\"[$which get bin filter]\"\}" puts $ch "$which bin buffer size [$which get bin buffer size]" set pos [$which get bin cursor] if {$pos != {}} { puts $ch "$which bin about $pos" } puts $ch "$which bin function [$which get bin function]" set cols [$which get bin cols] if {$cols != {}} { puts $ch "$which bin cols \{\"[lindex $cols 0]\"\} \{\"[lindex $cols 1]\"\} \{\"[lindex $cols 2]\"\} " } } proc BinBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" BinBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } # Process Cmds proc ProcessBinCmd {varname iname} { upvar $varname var upvar $iname i global bin switch -- [string tolower [lindex $var $i]] { close {BinDestroyDialog} open {BinDialog} match {MatchBinCurrent} lock { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set bin(lock) [FromYesNo [lindex $var $i]] } else { set bin(lock) 1 incr i -1 } LockBinCurrent } about { incr i switch [lindex $var $i] { center { BinAboutCenter } default { BinAbout [lindex $var [expr $i+0]] [lindex $var [expr $i+1]] incr i } } } buffersize { incr i set bin(buffersize) [lindex $var $i] ChangeBinBufferSize } cols { BinCols \"[lindex $var [expr $i+1]]\" \"[lindex $var [expr $i+2]]\" \"\" incr i 2 } colsz { BinCols \"[lindex $var [expr $i+1]]\" \"[lindex $var [expr $i+2]]\" \"[lindex $var [expr $i+3]]\" incr i 3 } factor { incr i set bx [lindex $var $i] set by [lindex $var [expr $i+1]] # note: the spaces are needed so that the menus are in sync if {$by != {} && [string is double $by]} { set bin(factor) " $bx $by " incr i } else { set bin(factor) " $bx $bx " } ChangeBinFactor } depth { incr i set bin(depth) [lindex $var $i] ChangeBinDepth } filter { incr i BinFilter [lindex $var $i] } function { incr i set bin(function) [string tolower [lindex $var $i]] ChangeBinFunction } in {Bin .5 .5} out {Bin 2 2} to { # eat the 'fit' incr i BinToFit } } } proc ProcessSendBinCmd {proc id param} { global bin global current switch -- [string tolower [lindex $param 0]] { lock {$proc $id [ToYesNo $bin(lock)]} about { if {$current(frame) != {}} { $proc $id "[$current(frame) get bin cursor]\n" } } buffersize {$proc $id "$bin(buffersize)\n"} cols { if {$current(frame) != {}} { $proc $id "[$current(frame) get bin cols]\n" } } factor {$proc $id "$bin(factor)\n"} depth {$proc $id "$bin(depth)\n"} filter { if {$current(frame) != {}} { $proc $id "[$current(frame) get bin filter]\n" } } function {$proc $id "$bin(function)\n"} } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/block.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000017455 12622671075 016351� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BlockDef {} { global iblock global block global pblock set iblock(top) .blk set iblock(mb) .blkmb set block(lock) 0 set block(factor) { 1 1 } array set pblock [array get block] } proc BlockToFit {} { global block global current SetWatchCursor if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,block) [list $current(frame) block to fit] set block(factor) [$current(frame) get block factor] UpdateBlock } UnsetWatchCursor } proc ChangeBlock {} { global block global current SetWatchCursor if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,block) [list $current(frame) block to $block(factor)] UpdateBlock } UnsetWatchCursor } proc Block {bx by} { global block global current SetWatchCursor if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,block) [list $current(frame) block $bx $by] set block(factor) [$current(frame) get block factor] UpdateBlock } UnsetWatchCursor } proc UpdateBlock {} { global current LockBlockCurrent UpdateBlockDialog UpdateCrosshairDialog UpdateCropDialog UpdateCubeDialog UpdateScaleDialog UpdateContourScale UpdateContourDialog UpdateWCSDialog UpdateGraphXAxis $current(frame) UpdateGraphYAxis $current(frame) UpdateMain UpdateHeaderDialog } proc BlockDialog {} { global block global iblock global dblock global ds9 global current # see if we already have a window visible if {[winfo exists $iblock(top)]} { raise $iblock(top) return } # create the window set w $iblock(top) set mb $iblock(mb) Toplevel $w $mb 6 [msgcat::mc {Block Parameters}] \ BlockDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Block}] -menu $mb.block menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command BlockApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command BlockDestroyDialog EditMenu $mb iblock menu $mb.block $mb.block add command -label [msgcat::mc {Block In}] -command {Block .5 .5} $mb.block add command -label [msgcat::mc {Block Out}] -command {Block 2 2} $mb.block add command -label [msgcat::mc {Block Fit}] -command BlockToFit $mb.block add separator $mb.block add radiobutton -label "[msgcat::mc {Block}] 1" \ -variable block(factor) -value { 1 1 } -command ChangeBlock $mb.block add radiobutton -label "[msgcat::mc {Block}] 2" \ -variable block(factor) -value { 2 2 } -command ChangeBlock $mb.block add radiobutton -label "[msgcat::mc {Block}] 4" \ -variable block(factor) -value { 4 4 } -command ChangeBlock $mb.block add radiobutton -label "[msgcat::mc {Block}] 8" \ -variable block(factor) -value { 8 8 } -command ChangeBlock $mb.block add radiobutton -label "[msgcat::mc {Block}] 16" \ -variable block(factor) -value { 16 16 } -command ChangeBlock $mb.block add radiobutton -label "[msgcat::mc {Block}] 32" \ -variable block(factor) -value { 32 32 } -command ChangeBlock # Param set f [ttk::frame $w.param] ttk::label $f.blocktitle -text [msgcat::mc {Block}] ttk::entry $f.blockx -textvariable dblock(x) -width 14 ttk::entry $f.blocky -textvariable dblock(y) -width 14 grid $f.blocktitle $f.blockx $f.blocky -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command BlockApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command BlockDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true $w.param.blockx select range 0 end UpdateBlockDialog } proc BlockApplyDialog {} { global block global iblock global dblock global current SetWatchCursor if {$current(frame) != {}} { set block(factor) "$dblock(x) $dblock(y)" RGBEvalLockCurrent rgb(lock,block) [list $current(frame) block to $block(factor)] LockFrameCurrent UpdateGraphXAxis $current(frame) UpdateBlockDialog RefreshInfoBox $current(frame) } UnsetWatchCursor } proc BlockDestroyDialog {} { global iblock global dblock if {[winfo exists $iblock(top)]} { destroy $iblock(top) destroy $iblock(mb) } unset dblock } proc UpdateBlockDialog {} { global block global iblock global dblock global current global debug if {$debug(tcl,update)} { puts stderr "UpdateBlockDialog" } if {![winfo exists $iblock(top)]} { return } if {$current(frame) != {}} { set zz [$current(frame) get block factor] set dblock(x) [lindex $zz 0] set dblock(y) [lindex $zz 1] } else { set dblock(x) {} set dblock(y) {} } } proc UpdateBlockMenu {} { global block global current global debug if {$debug(tcl,update)} { puts stderr "UpdateBlockMenu" } if {$current(frame) != {}} { set block(factor) [$current(frame) get block factor] } } proc MatchBlockCurrent {} { global current if {$current(frame) != {}} { MatchBlock $current(frame) } } proc MatchBlock {which} { global ds9 global rgb set factor [$which get block factor] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,block) $ff [list $ff block to $factor] } } } proc LockBlockCurrent {} { global current if {$current(frame) != {}} { LockBlock $current(frame) } } proc LockBlock {which} { global block if {$block(lock)} { MatchBlock $which } } proc BlockBackup {ch which} { switch [$which get type] { base - 3d {BlockBackupBase $ch $which} rgb {BlockBackupRGB $ch $which} } } proc BlockBackupBase {ch which} { set factor [$which get block factor] puts $ch "$which block to $factor" } proc BlockBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" BlockBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } proc ProcessBlockCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global block switch -- [string tolower [lindex $var $i]] { open {BlockDialog} close {BlockDestroyDialog} match {MatchBlockCurrent} lock { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set block(lock) [FromYesNo [lindex $var $i]] } else { set block(lock) 1 incr i -1 } LockBlockCurrent } in {Block .5 .5} out {Block 2 2} to { switch -- [string tolower [lindex $var [expr $i+1]]] { fit { BlockToFit incr i } default { set b1 [lindex $var [expr $i+1]] set b2 [lindex $var [expr $i+2]] if {[string is double $b2] && $b2 != {}} { set block(factor) " $b1 $b2 " incr i 2 } else { set block(factor) " $b1 $b1 " incr i } ChangeBlock } } } default { set b1 [lindex $var $i] set b2 [lindex $var [expr $i+1]] if {[string is double $b2] && $b2 != {}} { Block $b1 $b2 incr i } else { Block $b1 $b1 } } } } proc ProcessSendBlockCmd {proc id param} { global block switch -- [lindex $param 0] { lock {$proc $id [ToYesNo $block(lock)]} default { set z1 [lindex $block(factor) 0] set z2 [lindex $block(factor) 1] if {$z1 != $z2} { $proc $id "$block(factor)\n" } else { $proc $id "$z1\n" } } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/box.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000006164 12514261632 016034� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BoxDialog {varname} { upvar #0 $varname var global $varname global pmarker # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord # procs set var(proc,apply) BoxApply set var(proc,close) BoxClose set var(proc,coordCB) BoxCoordCB # base MarkerBaseCenterDialog $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisHistogramDialog $varname MarkerAnalysisPlot3dDialog $varname # init BoxEditCB $varname MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback edit BoxEditCB $varname $var(frame) marker $var(id) callback rotate \ MarkerBaseCenterRotateCB $varname set f $var(top).param # Radius ttk::label $f.tradius -text Size ttk::entry $f.radius1 -textvariable ${varname}(radius1) -width 13 ttk::entry $f.radius2 -textvariable ${varname}(radius2) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list BoxEditCB $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.tradius $f.radius1 $f.radius2 $f.uradius -padx 2 -pady 2 -sticky w grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w } # actions proc BoxClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback edit BoxEditCB $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc BoxApply {varname} { upvar #0 $varname var global $varname if {$var(radius1) != {} && $var(radius2) !={}} { $var(frame) marker $var(id) box radius \ $var(radius1) $var(radius2) $var(dcoord) $var(dformat) } MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } # callbacks proc BoxCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "BoxCoordCB" } MarkerAnalysisStatsSystem $varname MarkerAnalysisPlot3dSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } proc BoxEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "BoxEditCB" } set r [$var(frame) get marker $var(id) box radius \ $var(dcoord) $var(dformat)] set var(radius1) [lindex $r 0] set var(radius2) [lindex $r 1] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/boxannulus.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000001475 12514261632 017442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BoxAnnulusDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(which) boxannulus set var(proc,apply) MarkerBaseAnnulusRectApply set var(proc,close) MarkerBaseAnnulusRectClose set var(proc,generate) MarkerBaseAnnulusGenerateBox set var(proc,coordCB) MarkerBaseAnnulusRectCoordCB set var(proc,editCB) MarkerBaseAnnulusRectEditCB set var(proc,distCB) MarkerBaseAnnulusRectDistCB # base MarkerBaseAnnulusRectDialog $varname size Width Height } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/bpanda.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000001702 12514261632 016462� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BpandaDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(which) bpanda set var(proc,apply) MarkerBasePandaRectApply set var(proc,close) MarkerBasePandaRectClose set var(proc,generate) BpandaGenerate set var(proc,coordCB) MarkerBasePandaRectCoordCB set var(proc,editCB) MarkerBasePandaRectEditCB set var(proc,distCB) MarkerBasePandaRectDistCB # base panda rect dialog MarkerBasePandaRectDialog $varname } proc BpandaGenerate {varname} { upvar #0 $varname var global $varname MarkerBaseAnnulusGenerateBox $varname MarkerBasePandaGenerateAngles $varname } ��������������������������������������������������������������saods9/ds9/library/buttons.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000017313 12464211202 016730� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ButtonsDef {} { global pbuttons # TButtonBar class bindings ttk::copyBindings TButton TButtonBar bind TButtonBar <Enter> {} bind TButtonBar <Leave> {} ButtonsFileDef ButtonsEditDef ButtonsViewDef ButtonsFrameDef ButtonsBinDef ButtonsZoomDef ButtonsScaleDef ButtonsColorDef ButtonsRegionDef ButtonsWCSDef ButtonsAnalysisDef ButtonsHelpDef } proc CreateButtons {} { global ds9 global buttons set ds9(buttons) [ttk::frame $ds9(main).buttons] set ds9(buttons,sep) [ttk::separator $ds9(main).sbuttons -orient horizontal] set buttons(majorPrev) $ds9(buttons).file set buttons(majorCurrent) $ds9(buttons).file ttk::frame $ds9(buttons).major RadioButton $ds9(buttons).major.file \ [string tolower [msgcat::mc {File}]] \ buttons(majorCurrent) $ds9(buttons).file MajorButton RadioButton $ds9(buttons).major.edit \ [string tolower [msgcat::mc {Edit}]] \ buttons(majorCurrent) $ds9(buttons).edit MajorButton RadioButton $ds9(buttons).major.view \ [string tolower [msgcat::mc {View}]] \ buttons(majorCurrent) $ds9(buttons).view MajorButton RadioButton $ds9(buttons).major.frame \ [string tolower [msgcat::mc {Frame}]] \ buttons(majorCurrent) $ds9(buttons).frame MajorButton RadioButton $ds9(buttons).major.bin \ [string tolower [msgcat::mc {Bin}]] \ buttons(majorCurrent) $ds9(buttons).bin MajorButton RadioButton $ds9(buttons).major.zoom \ [string tolower [msgcat::mc {Zoom}]] \ buttons(majorCurrent) $ds9(buttons).zoom MajorButton RadioButton $ds9(buttons).major.scale \ [string tolower [msgcat::mc {Scale}]] \ buttons(majorCurrent) $ds9(buttons).scale MajorButton RadioButton $ds9(buttons).major.color \ [string tolower [msgcat::mc {Color}]] \ buttons(majorCurrent) $ds9(buttons).color MajorButton RadioButton $ds9(buttons).major.region \ [string tolower [msgcat::mc {Region}]] \ buttons(majorCurrent) $ds9(buttons).region MajorButton RadioButton $ds9(buttons).major.wcs \ [string tolower [msgcat::mc {WCS}]] \ buttons(majorCurrent) $ds9(buttons).wcs MajorButton RadioButton $ds9(buttons).major.analysis \ [string tolower [msgcat::mc {Analysis}]] \ buttons(majorCurrent) $ds9(buttons).analysis MajorButton RadioButton $ds9(buttons).major.help \ [string tolower [msgcat::mc {Help}]] \ buttons(majorCurrent) $ds9(buttons).help MajorButton global pbuttons array set pbuttons { major,file 1 major,edit 1 major,view 1 major,frame 1 major,bin 1 major,zoom 1 major,scale 1 major,color 1 major,region 1 major,wcs 1 major,analysis 1 major,help 1 } set buttons(major) " $ds9(buttons).major.file pbuttons(major,file) $ds9(buttons).major.edit pbuttons(major,edit) $ds9(buttons).major.view pbuttons(major,view) $ds9(buttons).major.frame pbuttons(major,frame) $ds9(buttons).major.bin pbuttons(major,bin) $ds9(buttons).major.zoom pbuttons(major,zoom) $ds9(buttons).major.scale pbuttons(major,scale) $ds9(buttons).major.color pbuttons(major,color) $ds9(buttons).major.region pbuttons(major,region) $ds9(buttons).major.wcs pbuttons(major,wcs) $ds9(buttons).major.analysis pbuttons(major,analysis) $ds9(buttons).major.help pbuttons(major,help) " CreateButtonsFile CreateButtonsEdit CreateButtonsView CreateButtonsFrame CreateButtonsBin CreateButtonsZoom CreateButtonsScale CreateButtonsColor CreateButtonsRegion CreateButtonsWCS CreateButtonsAnalysis CreateButtonsHelp LayoutButtons } proc ButtonButton {button text cmd} { ttk::button $button \ -class TButtonBar \ -text $text \ -command $cmd \ -width -1 \ -takefocus 0 } proc RadioButton {button text varname value cmd} { ttk::button $button \ -class TButtonBar \ -text $text \ -width -1 \ -takefocus 0 \ -command "RadioButtonSim $button $varname \{$value\} \{$cmd\}" # setup trace on $varname, so that all buttons that use this variable # will be updated when the variable is changed uplevel #0 trace variable $varname w \ [list "RadioButtonCB $button \{$value\}"] # setup <Map> event so that anytime the button is redrawn, # it is updated bind $button <Map> "ButtonMap %W $varname" } proc CheckButton {button text varname cmd} { ttk::button $button \ -class TButtonBar \ -text $text \ -width -1 \ -takefocus 0 \ -command "CheckButtonSim $button $varname \{$cmd\}" uplevel #0 trace variable $varname w [list "CheckButtonCB $button"] bind $button <Map> "ButtonMap %W $varname" } proc ButtonMap {button varname} { upvar #0 $varname var set vv $var # delay slightly, I don't know why this is needed after 10 [list set $varname $vv] } proc RadioButtonSim {button varname value cmd} { uplevel #0 [list set $varname $value] eval $cmd } proc RadioButtonCB {button value varname id op} { upvar #0 $varname var global $varname global ds9 if {[$button cget -state] != {disabled}} { switch $ds9(wm) { x11 { if {$var($id) == $value} { $button configure -state active } else { $button configure -state normal } } aqua - win32 { if {$var($id) == $value} { $button configure -default active } else { $button configure -default normal } } } } } proc CheckButtonSim {button varname cmd} { upvar #0 $varname var uplevel #0 [list set $varname [expr !$var]] eval $cmd } proc CheckButtonCB {button varname id op} { upvar #0 $varname var global $varname global ds9 if {[$button cget -state] != {disabled}} { switch $ds9(wm) { x11 { if {$var($id)} { $button configure -state active } else { $button configure -state normal } } aqua - win32 { if {$var($id)} { $button configure -default active } else { $button configure -default normal } } } } } proc LayoutButtons {} { global ds9 global buttons global view pack forget $ds9(buttons).major switch $view(layout) { horizontal { $ds9(buttons) configure -width 0 pack propagate $ds9(buttons) on pack $ds9(buttons).major -side top -fill x -expand true } vertical { $ds9(buttons) configure -width 125 pack propagate $ds9(buttons) off pack $ds9(buttons).major -side top -fill x -expand true -anchor n } } UpdateButtons buttons(major) UpdateButtons buttons(file) UpdateButtons buttons(edit) UpdateButtons buttons(view) UpdateButtons buttons(frame) UpdateButtons buttons(bin) UpdateButtons buttons(zoom) UpdateButtons buttons(scale) UpdateButtons buttons(color) UpdateButtons buttons(region) UpdateButtons buttons(wcs) UpdateButtons buttons(analysis) UpdateButtons buttons(help) MajorButton } proc MajorButton {} { global buttons global view pack forget $buttons(majorPrev) switch $view(layout) { horizontal { pack $buttons(majorCurrent) -side top -fill x -expand true } vertical { pack $buttons(majorCurrent) -side bottom -fill x -expand true -anchor s } } set buttons(majorPrev) $buttons(majorCurrent) } proc UpdateButtons {varname} { upvar #0 $varname var foreach {which what} $var { pack forget $which } foreach {which what} $var { ShowButton $which $what } } proc ShowButton {which varname} { upvar #0 $varname var global view if {$var} { switch $view(layout) { horizontal {pack $which -side left -fill both -expand true} vertical {pack $which -side top -fill both -expand true} } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/cat.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000117116 12576561043 016022� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATDef {} { global cat global icat global pcat global wcs set icat(cats) {} set icat(rformat) arcmin set icat(width) 15 set icat(height) 15 set icat(max) 5000 set icat(allrows) 1 set icat(allcols) 0 set icat(show) 1 set icat(edit) 0 set icat(panto) 1 set icat(minrows) 20 set icat(mincols) 10 set icat(key) {} set icat(key,update) {} set icat(match1) {} set icat(match2) {} set icat(return) 1and2 set icat(error) 5 set icat(eformat) arcsec set icat(function) 1and2 set icat(unique) 1 set icat(def) { \ {- {Database} db} \ {{NED} catned ned ned} \ {{SIMBAD} catsimbad simbad simbad} \ {{DENIS} catdenis cds {B/denis}} \ {{SkyBot} catskybot skybot skybot} \ {- {Optical} opt} \ {{ASCC-2.5} catascss cds {I/280A/ascc01}} \ {{AAVSO} cataavso cds {B/vsx}} \ {{Carlsberg Meridian 14} catcmc cds {I/304}}\ {{GSC 1.2} catgsc1 cds {I/254/out}} \ {{GSC 2.2} catgsc2 cds {I/271/out}} \ {{GSC 2.3} catgsc3 cds {I/305/out}} \ {{AC 2000.2} catac cds {I/275/ac2002}} \ {{NOMAD} catnomad cds {I/297/out}} \ {{PPMX} catppmx cds {I/312}} \ {{SAO J2000} catsao cds {I/131A/sao}} \ {{SDSS Release 5} catsdss5 cds {II/276}} \ {{SDSS Release 6} catsdss6 cds {II/282}} \ {{SDSS Release 7} catsdss7 cds {II/294}} \ {{SDSS Release 8} catsdss8 cds {II/306}} \ {{SDSS Release 9} catsdss9 cds {V/139}} \ {{Tycho-2} cattycho cds {I/259/tyc2}} \ {{USNO-A2.0} catua2 cds {I/252/out}} \ {{USNO-B1.0} catub1 cds {I/284/out}} \ {{USNO UCAC2} catucac2 cds {I/289/out}} \ {{USNO UCAC2 Bright Star Sup} catucac2sup cds {I/294A}} \ {{USNO UCAC3} catucac3 cds {I/315}} \ {{USNO UCAC4} catucac4 cds {I/322A}} \ {{USNO URAT1} caturat1 cds {I/329}} \ {- {Infrared} ir} \ {{2MASS Point Sources} cat2mass cds {II/246/out}}\ {{IRAS Point Sources} catiras cds {II/125}}\ {- {High Energy} hea} \ {{Chandra Source} catcsc cxc {Current Release}} {{2XMMi Source} catxmm cds {IX/40/xmm2is}} \ {{Second ROSAT PSPC} catrosat cds {IX/30}} \ {- {Radio} radio} \ {{FIRST Survey} catfirst cds {VIII/71/first}} \ {{NVSS} catnvss cds {VIII/65/nvss}} \ {- {Observation Logs} log} \ {{Chandra Archive} catchandralog cds {B/chandra/chandra}} \ {{CFHT Exposures} catcfhtlog cds {B/cfht/chfht}} \ {{ESO Science Archive} catesolog cds {B/eso/safcat}} \ {{HST Archive} cathstlog cds {B/hst/hstlog}} \ {{XMM Observation} catxmmlog cds {B/xmm/xmmlog}} \ } set cat(id) 0 set cat(sym,font,msg) {} # prefs only set pcat(server) cds set pcat(loc) 500 set pcat(sym,shape) {circle point} set pcat(sym,color) green set pcat(sym,width) 1 set pcat(sym,dash) 0 set pcat(sym,units) physical set pcat(sym,font) helvetica set pcat(sym,font,size) 10 set pcat(sym,font,weight) normal set pcat(sym,font,slant) roman set pcat(vot) 1 } # Load via HTTP proc CATGetURL {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATGetURL $varname $var(url)?$var(query)" } ARStatus $varname [msgcat::mc {Loading}] global ihttp if {$var(sync)} { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -query $var(query) \ -timeout $ihttp(timeout) \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 CATGetURLFinish $varname $var(token) } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } else { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -query $var(query) \ -timeout $ihttp(timeout) \ -command \ [list CATGetURLFinish $varname] \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } } proc CATGetURLIncr {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATGetURLIncr $varname $var(url)?$var(query)" } ARStatus $varname [msgcat::mc {Loading}] global ihttp if {$var(sync)} { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -query $var(query) \ -timeout $ihttp(timeout) \ -handler \ [list $var(proc,reader) $var(catdb)] \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 CATGetURLFinish $varname $var(token) } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } else { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -query $var(query) \ -timeout $ihttp(timeout) \ -handler \ [list $var(proc,reader) $var(catdb)] \ -command \ [list CATGetURLFinish $varname] \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } } proc CATGetURLFinish {varname token} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATGetURLFinish $varname" } if {!($var(active))} { ARCancelled $varname return } upvar #0 $token t # Code set code [http::ncode $token] # Meta set meta $t(meta) # Log it HTTPLog $token # Result? switch -- $code { {} - 200 - 203 - 404 - 503 { if {[info exist ${varname}(proc,parser)]} { eval [list $var(proc,parser) $var(catdb) $token] } ARDone $varname eval $var(proc,done) $varname } 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $meta { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,cat)} { puts stderr "CATGetURLFinish redirect $code to $value" } # clean up and resubmit http::cleanup $token unset var(token) set var(url) $value eval $var(proc,load) $varname } } } default {ARError $varname "[msgcat::mc {Error code was returned}] $code"} } } proc CATLoad {varname} { upvar #0 $varname var global $varname # clear previous db global $var(catdb) if {[info exists $var(catdb)]} { unset $var(catdb) } global debug if {$debug(tcl,cat)} { puts stderr "CATLoad $varname $var(url)?$var(query)" } set var(proc,done) CATLoadDone set var(proc,load) CATLoad CATGetURL $varname return } proc CATLoadIncr {varname} { upvar #0 $varname var global $varname # clear previous db global $var(catdb) if {[info exists $var(catdb)]} { unset $var(catdb) } global debug if {$debug(tcl,cat)} { puts stderr "CATLoadIncr $varname $var(url)?$var(query)" } set var(proc,done) CATLoadDone set var(proc,load) CATLoadIncr CATGetURLIncr $varname return } proc CATLoadDone {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATLoadDone $varname" } CATSortMenu $varname CATConfigCols $varname CATColsMenu $varname CATTable $varname CATDialogUpdate $varname } # Load via File proc CATLoadSBFile {varname} { upvar #0 $varname var global $varname set fn [OpenFileDialog catfbox] if {$fn != {}} { CATLoadFn $varname $fn starbase_read } } proc CATLoadVOTFile {varname} { upvar #0 $varname var global $varname set fn [OpenFileDialog catvotfbox] if {$fn != {}} { CATLoadFn $varname $fn CATVOTRead } } proc CATLoadTSVFile {varname} { upvar #0 $varname var global $varname set fn [OpenFileDialog cattsvfbox] if {$fn != {}} { CATLoadFn $varname $fn CATTSVRead } } # used by backup proc CATLoadFn {varname fn reader} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATLoadFn $varname $fn $reader" } ARStatus $varname [msgcat::mc {Loading Catalog}] CATOff $varname CATSet $varname {} {} $fn set var(name) {} set var(x) {} set var(y) {} set var(width) {} set var(height) {} if {[file exists $fn]} { $reader $var(catdb) $fn } else { Error "[msgcat::mc {Unable to open file}] $fn" return } ARDone $varname CATLoadDone $varname } # Save via File proc CATSaveSBFile {varname} { set fn [SaveFileDialog catfbox] CATSaveFn $varname $fn starbase_write } proc CATSaveVOTFile {varname} { set fn [SaveFileDialog catvotfbox] CATSaveFn $varname $fn CATVOTWrite } proc CATSaveTSVFile {varname} { set fn [SaveFileDialog cattsvfbox] CATSaveFn $varname $fn CATTSVWrite } proc CATSaveFn {varname fn writer} { upvar #0 $varname var global $varname global $var(tbldb) if {$fn == {}} { return } # do we have a db? if {![CATValidDB $var(tbldb)]} { return } ARStatus $varname [msgcat::mc {Writing Catalog}] $writer $var(tbldb) $fn ARDone $varname } # Other procedures proc CATStatusRows {varname rowlist} { upvar #0 $varname var global $varname # rowlist start at 1 if {[llength $rowlist]>0} { ARStatus $varname "[msgcat::mc {Row}] [join $rowlist {,}]" } else { ARStatus $varname {} } } proc CATOff {varname} { upvar #0 $varname var global $varname global $var(catdb) if {[info exists $var(catdb)]} { unset $var(catdb) } global $var(tbldb) if {[info exists $var(tbldb)]} { unset $var(tbldb) } set db $var(tbldb) set ${db}(Nrows) {} $var(tbl) selection clear all if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { $var(frame) marker catalog $varname delete } } CATSortMenu $varname CATColsMenu $varname set var(filter) {} set var(sort) {} set var(colx) {} set var(coly) {} set var(blink) 0 # plot window? if {$var(plot)} { PlotDestroy $var(plot,var) set var(plot) 0 set var(plot,var) {} set var(plot,x) {} set var(plot,xerr) {} set var(plot,y) {} set var(plot,yerr) {} } CATDialogUpdate $varname } # used by backup proc CATTable {varname} { upvar #0 $varname var global $varname global $var(catdb) global icat global debug if {$debug(tcl,cat)} { puts stderr "CATTable $varname" } if {![CATValidDB $var(catdb)]} { return } # delete any previous tbldb set db ${varname}tbldb global $db if {[info exists $db]} { unset $db } # clear the selection $var(tbl) selection clear all # clear regions if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { $var(frame) marker catalog $varname delete } } if {$var(filter) == {} && $var(sort) == {}} { set var(tbldb) $var(catdb) } else { set var(tbldb) ${varname}tbldb global $var(tbldb) if {![CATFltSort $varname]} { Error "[msgcat::mc {Unable to evaluate filter}] $var(filter)" if {[info exists $var(tbldb)]} { unset $var(tbldb) } set var(tbldb) $var(catdb) } } global $var(tbldb) $var(tbl) configure -variable $var(tbldb) $var(found) configure -textvariable ${var(tbldb)}(Nrows) # starbase_writefp $var(catdb) stdout # starbase_writefp $var(tbldb) stdout if {[starbase_nrows $var(tbldb)] == 0} { ARStatus $varname [msgcat::mc {No Items Found}] return } set nc [starbase_ncols $var(tbldb)] if { $nc > $icat(mincols)} { $var(tbl) configure -cols $nc } else { $var(tbl) configure -cols $icat(mincols) } # add header set nr [expr [starbase_nrows $var(tbldb)]+1] if {$nr > $icat(minrows)} { $var(tbl) configure -rows $nr } else { $var(tbl) configure -rows $icat(minrows) } CATGenerate $varname # regenerate the plot if needed if {$var(plot)} { CATPlotGenerate $varname } set nr [starbase_nrows $var(tbldb)] if {$nr >= $var(max) && !$var(allrows)} { ARStatus $varname "$nr [msgcat::mc {rows of data have been downloaded. More may be available. You may wish to adjust the maximum allowed}]" } } proc CATGenerate {varname} { upvar #0 $varname var global $varname global $var(tbldb) global debug if {$debug(tcl,cat)} { puts stderr "CATGenerate $varname" } # do we have a db? if {![CATValidDB $var(tbldb)]} { return } ARStatus $varname [msgcat::mc {Plotting Regions}] # delete any previous if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { $var(frame) marker catalog $varname delete } } if {$var(show)} { global reg set reg {} CATReg $varname {} 1 reg if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { if {[catch {$var(frame) marker catalog command ds9 var reg}]} { ARError $varname "[msgcat::mc {Internal Parse Error}]" return } } } } ARStatus $varname {Done} } proc CATGenerateRegions {varname} { upvar #0 $varname var global $varname global $var(tbldb) global debug if {$debug(tcl,cat)} { puts stderr "CATGenerateRegions $varname" } # do we have a db? if {![CATValidDB $var(tbldb)]} { return } ARStatus $varname [msgcat::mc {Generating Regions}] global reg set reg {} CATReg $varname {} 0 reg if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { if {[catch {$var(frame) marker command ds9 var reg}]} { ARError $varname "[msgcat::mc {Internal Parse Error}]" return } } } ARStatus $varname {Done} } proc CATGenerateUpdate {varname row} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATGenerateUpdate $varname $row" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } set id [$var(frame) get marker catalog "\{${varname}.${row}\}" id] set sel [$var(frame) get marker catalog $id select] set hh [$var(frame) get marker catalog $id highlite] $var(frame) marker catalog "\{${varname}.${row}\}" delete global reg set reg {} CATReg $varname $row 1 reg if {$reg != {}} { $var(frame) marker catalog command ds9 var reg set id [$var(frame) get marker catalog "\{${varname}.${row}\}" id] if {$sel} { $var(frame) marker catalog "\{${varname}.${row}\}" select } if {$hh} { $var(frame) marker catalog "\{${varname}.${row}\}" highlite } } unset reg } proc CATSet {varname format catalog title} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSet $varname :$format:$catalog:$title:" } set var(format) $format set var(catalog) $catalog set var(title) $title set var(filter) {} set var(colx) {} set var(coly) {} set var(sort) {} set var(sort,dir) "-increasing" } proc CATValidDB {varname} { upvar #0 $varname var global $varname if {[info exists var(Nrows)] && [info exists var(Ncols)] && [info exists var(HLines)] && [info exists var(Header)]} { return 1 } else { return 0 } } proc CATCatalogMenu {} { global icat global ds9 set mm "$ds9(mb).analysis.cat" set nn {} foreach ff $icat(def) { set ll [lindex $ff 0] set ww [lindex $ff 1] set ss [lindex $ff 2] set cc [lindex $ff 3] if {$ll != {-}} { $mm.$nn add command -label $ll \ -command [list CATDialog $ww $ss $cc $ll apply] } else { set nn "$ss" menu $mm.$nn $mm add cascade -label $ww -menu $mm.$nn } } } proc CATServerMenu {varname} { upvar #0 $varname var global $varname $var(mb) add cascade -label [msgcat::mc {Catalog Server}] \ -menu $var(mb).server menu $var(mb).server $var(mb).server add radiobutton -label {CDS, Strasbourg France} \ -variable ${varname}(server) -value cds $var(mb).server add radiobutton -label {CFA, Boston USA} \ -variable ${varname}(server) -value sao $var(mb).server add radiobutton -label {CADC, Canada} \ -variable ${varname}(server) -value cadc $var(mb).server add radiobutton -label {ADAC, Tokyo Japan} \ -variable ${varname}(server) -value adac $var(mb).server add radiobutton -label {IUCAA, Pune India} \ -variable ${varname}(server) -value iucaa $var(mb).server add radiobutton -label {INASAN, Russia} \ -variable ${varname}(server) -value inasan $var(mb).server add radiobutton -label {BEJING, China} \ -variable ${varname}(server) -value bejing $var(mb).server add radiobutton -label {CAMBRIDGE, UK} \ -variable ${varname}(server) -value cambridge $var(mb).server add radiobutton -label {UKIRT, Hawaii USA} \ -variable ${varname}(server) -value ukirt } proc CATSortMenu {varname} { upvar #0 $varname var global $varname global $var(catdb) global ds9 set m $var(sortmenu).menu catch {destroy $m} menu $m -tearoff 0 $m add command -label {} -command "CATSortCmd $varname {}" if {[CATValidDB $var(catdb)]} { set cnt -1 foreach col [starbase_columns $var(catdb)] { $m add command -label $col -command "CATSortCmd $varname \{$col\}" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $m entryconfig $col -columnbreak 1 } } } } proc CATSortCmd {varname val} { upvar #0 $varname var global $varname set ${varname}(sort) $val CATTable $varname } # backward backup compatibility version 6.1 proc CATRADECMenu {varname} { CATColsMenu $varname } # used by backup proc CATColsMenu {varname} { upvar #0 $varname var global $varname global $var(catdb) global ds9 set m $var(ramenu).menu catch {destroy $m} menu $m -tearoff 0 if {[CATValidDB $var(catdb)]} { set cnt -1 foreach col [starbase_columns $var(catdb)] { $m add command -label $col -command "CATColXCmd $varname \{$col\}" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $m entryconfig $col -columnbreak 1 } } } set m $var(decmenu).menu catch {destroy $m} menu $m -tearoff 0 if {[CATValidDB $var(catdb)]} { set cnt -1 foreach col [starbase_columns $var(catdb)] { $m add command -label $col -command "CATColYCmd $varname \{$col\}" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $m entryconfig $col -columnbreak 1 } } } } proc CATColXCmd {varname val} { upvar #0 $varname var global $varname set ${varname}(colx) $val CATGenerate $varname } proc CATColYCmd {varname val} { upvar #0 $varname var global $varname set ${varname}(coly) $val CATGenerate $varname } proc CATColsCmd {varname} { upvar #0 $varname var global $varname CATColsUpdate $varname CATGenerate $varname } proc CATConfigCols {varname} { upvar #0 $varname var global $varname global $var(catdb) set var(colx) {} set var(coly) {} if {![CATValidDB $var(catdb)]} { return } if {[starbase_ncols $var(catdb)] < 2} { return } # determine psystem/psky if present in cat header # psystem has already been adjusted based on loaded fits at menu creation switch -- $var(psystem) { image - physical - amplifier - detector { set cols { "X" "Y" } foreach {colx coly} $cols { if {!([lsearch [starbase_columns $var(catdb)] $colx] == -1) && !([lsearch [starbase_columns $var(catdb)] $coly] == -1)} { set var(colx) $colx set var(coly) $coly return } # try lower case set colx [string tolower $colx] set coly [string tolower $coly] if {!([lsearch [starbase_columns $var(catdb)] $colx] == -1) && !([lsearch [starbase_columns $var(catdb)] $coly] == -1)} { set var(colx) $colx set var(coly) $coly return } } # default set var(colx) [starbase_colname $var(catdb) 1] set var(coly) [starbase_colname $var(catdb) 2] return } default { if {[info commands $var(frame)] == {}} { # linear set var(colx) [starbase_colname $var(catdb) 1] set var(coly) [starbase_colname $var(catdb) 2] return } elseif {![$var(frame) has wcs equatorial $var(psystem)]} { # linear set var(colx) [starbase_colname $var(catdb) 1] set var(coly) [starbase_colname $var(catdb) 2] return } else { if {![catch {starbase_hdrget $var(catdb) equinox} sys]} { switch -- $sys { 1950.0 - B1950 { set var(psystem) wcs set var(psky) fk4 } 2000.0 - J2000 { set var(psystem) wcs set var(psky) fk5 } } } switch -- $var(psky) { fk5 - icrs { set cols { "_RAJ2000" "_DEJ2000" "_RAJ2000" "_DECJ2000" "RAJ2000" "DEJ2000" "RAJ2000" "DECJ2000" "RA_J2000" "DE_J2000" "RA_J2000" "DEC_J2000" "RA (J2000)" "Dec (J2000)" "RA" "DEC" "RA" "DECL" "RA" "Dec" "RA(deg)" "DEC(deg)" } if {[CATConfigColsSearch $varname $cols]} { return } # next, look for an UCD (via VOTABLE) set db $var(catdb) upvar #0 $db T for {set cc 0} {$cc < $T(Ncols)} {incr cc} { if {[info exists ${db}(Ucd)]} { switch -- [string tolower [string range [lindex $T(Ucd) $cc] 0 8]] { pos.eq.ra {set var(colx) [lindex $T(Header) $cc]} pos.eq.de {set var(coly) [lindex $T(Header) $cc]} } } } if {$var(colx) != {} && $var(coly) != {}} { return } } fk4 { set cols { "_RAB1950" "_DEB1950" "RA_B1950" "DEC_B1950" "RA (B1950)" "Dec (1950)" "RA" "DEC" "RA" "DECL" "RA" "Dec" "RA(deg)" "DEC(deg)" } if {[CATConfigColsSearch $varname $cols]} { return } } galactic { set cols { "_GLON" "_GLAT" "LON" "LAT" "LON.Gal(deg)" "LAT.Gal(deg)" } if {[CATConfigColsSearch $varname $cols]} { return } } ecliptic { set cols { "_ELON" "_ELAT" "LON.Ecl(deg)" "LAT.Ecl(deg)" } if {[CATConfigColsSearch $varname $cols]} { return } } } # default set var(colx) [starbase_colname $var(catdb) 1] set var(coly) [starbase_colname $var(catdb) 2] } } } } proc CATConfigColsSearch {varname cols} { upvar #0 $varname var global $varname global $var(catdb) foreach {colx coly} $cols { if {!([lsearch [starbase_columns $var(catdb)] $colx] == -1) && !([lsearch [starbase_columns $var(catdb)] $coly] == -1)} { set var(colx) $colx set var(coly) $coly return 1 } # try lower case set colx [string tolower $colx] set coly [string tolower $coly] if {!([lsearch [starbase_columns $var(catdb)] $colx] == -1) && !([lsearch [starbase_columns $var(catdb)] $coly] == -1)} { set var(colx) $colx set var(coly) $coly return 1 } } return 0 } # Other interface proc CATTool {} { CATDialog cattool {} {} {} none } proc CATClearFrame {} { global current if {$current(frame) != {}} { $current(frame) marker catalog delete all } } proc CATUpdateWCS {} { global icat global current if {$current(frame) != {}} { $current(frame) marker catalog delete all foreach varname $icat(cats) { upvar #0 $varname var global $varname CATGenerate $varname # regenerate the plot if needed if {$var(plot)} { CATPlotGenerate $varname } } } } proc CATBackup {ch which fdir rdir} { global icat foreach varname $icat(cats) { upvar #0 $varname var global $varname if {$var(frame) == $which} { set catdb ${varname}catdb global $catdb puts $ch "CATDialog $varname {} {} {} none" if {[starbase_nrows $var(catdb)]>500} { # external file set fn $fdir/${varname}.cat set rfn $rdir/${varname}.cat catch {file delete -force $fn} CATSaveFn $varname "$fn" CATVOTWrite puts $ch "CATLoadFn $varname \"$rfn\" CATVOTRead" } else { # internal var puts $ch "global $catdb" puts $ch "array set $catdb \{ [array get $catdb] \}" } puts $ch "global $varname" puts $ch "array set $varname \{ [array get $varname] \}" set symdb ${varname}symdb global $symdb puts $ch "global $symdb" puts $ch "array set $symdb \{ [array get $symdb] \}" puts $ch "CATColsMenu $varname" puts $ch "CATTable $varname" } } } proc PrefsDialogCatalog {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Catalogs}] lappend dprefs(tabs) [ttk::frame $w.cat] # Catalog set f [ttk::labelframe $w.cat.param -text [msgcat::mc {Catalogs}]] ttk::label $f.stitle -text [msgcat::mc {Server}] ttk::menubutton $f.svr -textvariable pcat(server) -menu $f.svr.menu ttk::label $f.shtitle -text [msgcat::mc {Shape}] ttk::menubutton $f.shape -textvariable pcat(sym,shape) -menu $f.shape.menu ttk::checkbutton $f.vot -variable pcat(vot) \ -text [msgcat::mc {Download VOTABLE format if available}] ttk::label $f.loctitle -text [msgcat::mc {IAU Location Code}] ttk::entry $f.loc -textvariable pcat(loc) -width 7 global pcat ttk::label $f.ctitle -text [msgcat::mc {Color}] ColorMenuButton $f.color pcat sym,color {} ttk::label $f.cwidth -text [msgcat::mc {Width}] WidthDashMenuButton $f.width pcat sym,width sym,dash {} {} ttk::label $f.ftitle -text [msgcat::mc {Font}] FontMenuButton $f.font pcat sym,font sym,font,size \ sym,font,weight, sym,font,slant {} menu $f.svr.menu $f.svr.menu add radiobutton -label {CDS} \ -variable pcat(server) -value cds $f.svr.menu add radiobutton -label {SAO} \ -variable pcat(server) -value sao $f.svr.menu add radiobutton -label {CADC} \ -variable pcat(server) -value cadc $f.svr.menu add radiobutton -label {ADAC} \ -variable pcat(server) -value adac $f.svr.menu add radiobutton -label {IUCAA} \ -variable pcat(server) -value iucaa $f.svr.menu add radiobutton -label {BEJING} \ -variable pcat(server) -value bejing $f.svr.menu add radiobutton -label {CAMBRIDGE UK} \ -variable pcat(server) -value cambridge $f.svr.menu add radiobutton -label {UKIRT HAWAII} \ -variable pcat(server) -value ukirt menu $f.shape.menu $f.shape.menu add radiobutton -label [msgcat::mc {Circle}] \ -variable pcat(sym,shape) -value circle $f.shape.menu add radiobutton -label [msgcat::mc {Ellipse}] \ -variable pcat(sym,shape) -value ellipse $f.shape.menu add radiobutton -label [msgcat::mc {Box}] \ -variable pcat(sym,shape) -value box $f.shape.menu add radiobutton -label [msgcat::mc {Text}] \ -variable pcat(sym,shape) -value text $f.shape.menu add cascade -label [msgcat::mc {Point}] \ -menu $f.shape.menu.point menu $f.shape.menu.point $f.shape.menu.point add radiobutton -label [msgcat::mc {Circle}] \ -variable pcat(sym,shape) -value {circle point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Box}] \ -variable pcat(sym,shape) -value {box point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Diamond}] \ -variable pcat(sym,shape) -value {diamond point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Cross}] \ -variable pcat(sym,shape) -value {cross point} $f.shape.menu.point add radiobutton -label [msgcat::mc {X}] \ -variable pcat(sym,shape) -value {x point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Arrow}] \ -variable pcat(sym,shape) -value {arrow point} $f.shape.menu.point add radiobutton -label [msgcat::mc {BoxCircle}] \ -variable pcat(sym,shape) -value {boxcircle point} $f.shape.menu.point add separator grid $f.stitle $f.svr -padx 2 -pady 2 -sticky w grid $f.shtitle $f.shape -padx 2 -pady 2 -sticky w grid $f.ctitle $f.color -padx 2 -pady 2 -sticky w grid $f.cwidth $f.width -padx 2 -pady 2 -sticky w grid $f.ftitle $f.font -padx 2 -pady 2 -sticky w grid $f.loctitle - - $f.loc -padx 2 -pady 2 -sticky w grid $f.vot - - - -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } # Process Cmds proc ProcessCatalogCmd {varname iname} { upvar $varname var upvar $iname i global icat # we need to be realized ProcessRealizeDS9 set item [string tolower [lindex $var $i]] switch -- $item { {} { # blank CATTool return } file - import - load { # load incr i set reader CATVOTRead switch -- [lindex $var $i] { xml - vot {incr i; set reader CATVOTRead} sb - starbase {incr i; set reader starbase_read} csv - tsv {incr i; set reader CATTSVRead} } set fn [lindex $var $i] if {$fn != {}} { CATDialog cattool {} {} {} none CATLoadFn [lindex $icat(cats) end] $fn $reader FileLast catfbox $fn } return } allcols - allrows - cancel - clear - close - coordinate - crosshair - dec - edit - export - filter - header - hide - location - match - maxrows - name - panto - plot - print - psky - psystem - ra - regions - retrieve - samp - save - server - show - size - sky - skyformat - sort - symbol - system - update - x - y {ProcessCatalog $varname $iname [lindex $icat(cats) end]} default { # existing cat or load new one? set ref $item # backward compatibility if {[string range $ref 0 2] == {cat}} { set ref [string range $ref 3 end] } incr i set item [string tolower [lindex $var $i]] switch -- $item { file - import - load { # processed above incr i -1 return } allcols - allrows - cancel - clear - close - coordinate - crosshair - dec - edit - export - filter - header - hide - location - match - maxrows - name - panto - plot - print - psky - psystem - ra - regions - retrieve - samp - save - server - show - size - sky - skyformat - sort - symbol - system - update - x - y {ProcessCatalog $varname $iname cat${ref}} default { # ok, new catalog incr i -1 set item [string tolower [lindex $var $i]] # another command if {[string range $item 0 0] == "-"} { CATTool incr i -1 return } # backward compatibility switch $item { cds {incr i; set item [string tolower [lindex $var $i]]} cxc {set item csc} } # see if its from our list of cats foreach mm $icat(def) { set ll [lindex $mm 0] set ww [lindex $mm 1] set ss [lindex $mm 2] set cc [lindex $mm 3] if {$ll != {-} && "cat${item}" == $ww} { CATDialog $ww $ss $cc $ll sync return } } # not a default, assume other name CATDialog catcds cds $item $item sync } } } } } proc ProcessCatalog {varname iname cvarname} { upvar 2 $varname var upvar 2 $iname i global icat global pcat global current # we should have a catalog now global $cvarname upvar #0 $cvarname cvar if {![info exists cvar(top)]} { Error "[msgcat::mc {Unable to find catalog window}] $cvarname" return } if {![winfo exists $cvar(top)]} { Error "[msgcat:: mc {Unable to find catalog window}] $cvarname" return } # now, process it set item [string tolower [lindex $var $i]] switch -- $item { allrows {set cvar(allrows) 1} allcols {set cvar(allcols) 1} cancel {ARCancel $cvarname} clear {CATOff $cvarname} close {CATDestroy $cvarname} coordinate { incr i set cvar(x) [lindex $var $i] incr i set cvar(y) [lindex $var $i] incr i set cvar(sky) [lindex $var $i] } crosshair {CATCrosshair $cvarname} edit { incr i set cvar(edit) [FromYesNo [lindex $var $i]] CATEdit $cvarname } export - save { incr i set writer CATVOTWrite switch -- [lindex $var $i] { xml - vot {incr i; set writer CATVOTWrite} sb - starbase {incr i; set writer starbase_write} csv - tsv {incr i; set writer CATTSVWrite} } set fn [lindex $var $i] CATSaveFn $cvarname $fn $writer FileLast catfbox $fn } filter { incr i set item [lindex $var $i] switch -- $item { load { incr i set fn [lindex $var $i] if {[catch {open $fn r} fp]} { Error "[msgcat::mc {Unable to open file}] $fn: $fp" return } set flt [read -nonewline $fp] catch {regsub {\n} $flt " " $flt} set cvar(filter) [string trim $flt] catch {close $fp} } default { set cvar(filter) $item } } CATTable $cvarname } header {CATHeader $cvarname} hide { set cvar(show) 0 CATGenerate $cvarname } location { incr i set cvar(loc) [lindex $var $i] CATGenerate $cvarname } match { incr i set item [lindex $var $i] switch -- $item { error { incr i set icat(error) [lindex $var $i] incr i set icat(eformat) [lindex $var $i] } function {incr i; set icat(function) [lindex $var $i]} unique {incr i; set icat(unique) [FromYesNo [lindex $var $i]]} return {incr i; set icat(return) [lindex $var $i]} default { set icat(match1) "cat[lindex $var $i]" incr i set icat(match2) "cat[lindex $var $i]" CATMatch $current(frame) $icat(match1) $icat(match2) } } } maxrows { incr i set cvar(max) [lindex $var $i] } name { incr i set cvar(name) [lindex $var $i] } panto { incr i set cvar(panto) [FromYesNo [lindex $var $i]] } plot { incr i set cvar(plot,x) [lindex $var $i] incr i set cvar(plot,y) [lindex $var $i] incr i set cvar(plot,xerr) [lindex $var $i] incr i set cvar(plot,yerr) [lindex $var $i] CATPlotGenerate $cvarname } print {CATPrint $cvarname} psky { incr i set cvar(psky) [lindex $var $i] CATGenerate $cvarname } psystem { incr i set cvar(psystem) [lindex $var $i] CATGenerate $cvarname } regions {CATGenerateRegions $cvarname} retrieve - retreive {CATApply $cvarname 1} samp { global ds9 global samp incr i switch -- [string tolower [lindex $var $i]] { send { incr i set name [string tolower [lindex $var $i]] if {[info exists samp]} { foreach arg $samp(apps,votable) { foreach {key val} $arg { if {[string tolower $val] == $name} { SAMPSendTableLoadVotable $key $cvarname break } } } } else { Error [msgcat::mc {SAMP: not connected}] } } broadcast {SAMPSendTableLoadVotable {} $cvarname} default { SAMPSendTableLoadVotable {} $cvarname incr i -1 } } } server { incr i set $cvar(server) [lindex $var $i] } size { incr i set cvar(width) [lindex $var $i] incr i set cvar(height) [lindex $var $i] incr i set cvar(rformat) [lindex $var $i] set cvar(rformat,msg) $cvar(rformat) } show { set cvar(show) 1 CATGenerate $cvarname } sky { incr i set cvar(sky) [lindex $var $i] CoordMenuButtonCmd $cvarname system sky \ [list CATWCSMenuUpdate $cvarname] } skyformat { incr i set cvar(skyformat) [lindex $var $i] } sort { incr i set cvar(sort) [lindex $var $i] incr i switch -- [lindex $var $i] { incr { set cvar(sort,dir) "-increasing" } decr { set cvar(sort,dir) "-decreasing" } } CATTable $cvarname } symbol { global $cvar(symdb) set row 1 incr i if {[string is integer [lindex $var $i]]} { set row [lindex $var $i] incr i } switch -- [lindex $var $i] { add { set row [expr [starbase_nrows $cvar(symdb)]+1] starbase_rowins $cvar(symdb) $row starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) shape] $pcat(sym,shape) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) color] $pcat(sym,color) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) width] $pcat(sym,width) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) font] $pcat(sym,font) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontsize] \ $pcat(sym,font,size) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontweight] \ $pcat(sym,font,weight) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontslant] \ $pcat(sym,font,slant) starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) units] $pcat(sym,units) CATGenerate $cvarname } angle { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) angle] [lindex $var $i] CATGenerate $cvarname } color { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) color] [lindex $var $i] CATGenerate $cvarname } condition { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) condition] \ [lindex $var $i] CATGenerate $cvarname } font { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) font] [lindex $var $i] CATGenerate $cvarname } fontsize { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontsize] [lindex $var $i] CATGenerate $cvarname } fontweight { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontweight] \ [lindex $var $i] CATGenerate $cvarname } fontslant { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) fontslant] \ [lindex $var $i] CATGenerate $cvarname } load { incr i set fn [lindex $var $i] if {[file exists $fn]} { starbase_read $cvar(symdb) $fn CATGenerate $cvarname } else { Error "[msgcat::mc {Unable to open file}] $fn" return } } remove { starbase_rowdel $cvar(symdb) $row CATGenerate $cvarname } save { incr i starbase_write $cvar(symdb) [lindex $var $i] } size { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) size] [lindex $var $i] CATGenerate $cvarname } size2 { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) size2] [lindex $var $i] CATGenerate $cvarname } shape { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) shape] [lindex $var $i] CATGenerate $cvarname } text { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) text] [lindex $var $i] CATGenerate $cvarname } units { incr i starbase_set $cvar(symdb) $row \ [starbase_colnum $cvar(symdb) units] [lindex $var $i] CATGenerate $cvarname } } } system { incr i set cvar(system) [lindex $var $i] CoordMenuButtonCmd $cvarname system sky \ [list CATWCSMenuUpdate $cvarname] } update {CATUpdate $cvarname} x - ra { incr i set cvar(colx) [lindex $var $i] CATGenerate $cvarname } y - dec { incr i set cvar(coly) [lindex $var $i] CATGenerate $cvarname } } } proc ProcessSendCatalogCmd {proc id param sock fn} { global icat set cc [lindex $icat(cats) end] switch -- [string tolower [lindex $param 0]] { header {} default { set cc [lindex $param 0] set param [lreplace $param 0 0] } } switch -- [string tolower [lindex $param 0]] { {} {$proc $id "$icat(cats)\n"} header {ProcessSend $proc $id $sock $fn {.txt} "[CATGetHeader $cc]\n"} } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catcds.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000011716 12527716223 016511� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATCDS {varname} { upvar #0 $varname var global $varname global pcat global debug if {$debug(tcl,cat)} { puts stderr "CATCDS $varname" } # go for votable or tsv if {$pcat(vot)} { set var(proc,parser) CATVOTParse } else { set var(proc,reader) CATCDSReader } # url set site [CATCDSURL $var(server)] set cgidir {viz-bin} if {$pcat(vot)} { set script {votable} } else { set script {asu-tsv} } set var(url) "http://$site/$cgidir/$script" # query switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { switch -- $var(sky) { fk4 - fk5 - icrs {set xx [h2d [Sex2H $var(x)]]} galactic - ecliptic {set xx [Sex2D $var(x)]} } set yy [Sex2D $var(y)] } } if {$yy>0} { set yy "+$yy" } switch -- $var(sky) { fk4 {set eq "B1950"} fk5 - icrs {set eq "J2000"} galactic {set eq "Gal"} ecliptic {set eq "Ecl"} } switch -- $var(rformat) { degrees {set cr "-c.rd"} arcmin {set cr "-c.rm"} arcsec {set cr "-c.rs"} } set ww $var(width) set hh $var(height) set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] set query [http::formatQuery -source $var(catalog) -c $xx$yy -c.eq $eq $cr $rr -oc.form dec] if {$pcat(vot)} { append query "&[http::formatQuery -out.form VOTable]" } else { append query "&[http::formatQuery -out.form Tab-Separated-Values]" } switch -- $var(psky) { fk4 {append query "&[http::formatQuery -out.add _RAB,_DEB]"} fk5 - icrs {append query "&[http::formatQuery -out.add _RAJ,_DEJ]"} galactic {append query "&[http::formatQuery -out.add _GLON,_GLAT]"} ecliptic {append query "&[http::formatQuery -out.add _ELON,_ELAT]"} } # options if {!$var(allrows)} { append query "&-out.max=$var(max)" } if {$var(allcols)} { append query "&-out.all" } # url?query set var(query) $query if {$pcat(vot)} { CATLoad $varname } else { CATLoadIncr $varname } } proc CATCDSReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) 1 } 1 { # process header incr ${t}(HLines) set n $T(HLines) if {[gets $sock line] == -1} { set T(state) -1 set T(HLines) [expr $T(HLines) - 1] set T(Nrows) 0 set T(Ncols) 0 return 0 } set result [string length "$line"] set T(H_$n) $line if {[regexp -- {^ *(-)+ *(\t *(-)+ *)*} $line]} { # remove units line, but save first unset T(H_$n) incr ${t}(HLines) -1 incr n -1 set units $T(H_$n) set T(H_$n) $line # clean up header column name set hh $T(H_[expr $n-1]) regsub -all {\[} $hh {} hh regsub -all {\]} $hh {} hh set T(H_[expr $n-1]) $hh # cols set T(Header) [split $T(H_[expr $n-1]) "\t"] set T(Unit) [split $units "\t"] set T(Dashes) [split $T(H_$n) "\t"] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 2 } } 2 { # process table if {[gets $sock line] == -1} { set T(state) 0 } else { set result [string length "$line"] set line [string trim $line] if {$line != {}} { # check for beginning of another table if {[string range $line 0 0] == "#"} { set T(state) 3 return $result } # check for garbage at start of line if {![string is double [lindex $line 0]]} { set T(state) 3 return $result } # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line "\t"] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } } } 3 { # finished, eat everything else if {[gets $sock line] == -1} { set T(state) 0 } } } return $result } proc CATCDSURL {server} { switch -- $server { cds {return {vizier.u-strasbg.fr}} sao {return {vizier.cfa.harvard.edu}} cadc {return {vizier.hia.nrc.ca}} adac {return {vizier.nao.ac.jp}} iucaa {return {vizier.iucaa.ernet.in}} inasan {return {vizier.inasan.ru}} bejing {return {data.bao.ac.cn}} cambridge {return {vizier.ast.cam.ac.uk}} ukirt {return {www.ukirt.jach.hawaii.edu}} } } proc CATCDSAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for CDS This research has made use of the VizieR catalogue access tool, CDS, Strasbourg, France. VizieR is a joint effort of CDS (Centre de Données astronomiques de Strasbourg) and ESA-ESRIN (Information Systems Division). } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } ��������������������������������������������������saods9/ds9/library/catcdssrch.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000024701 12627140260 017360� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATCDSSrchDef {} { global icatcdssrch set icatcdssrch(minrows) 11 set icatcdssrch(mincols) 2 set icatcdssrch(list,wave,param) {-kw.Wavelength} set icatcdssrch(list,wave) [list none Radio IR optical UV EUV X-ray Gamma-ray] set icatcdssrch(list,mission,param) {-kw.Mission} set icatcdssrch(list,mission) [list none AKARI ANS ASCA BeppoSAX CGRO Chandra COBE Copernicus CoRoT Einstein ESO EUVE EXOSAT FAUST Fermi FUSE GALEX GINGA GRANAT Herschel HEAO Hipparcos HST HUT INTEGRAL IRAS ISO IUE Kepler MSX OAO-2 ORFEUS Planck ROSAT RXTE SAS-1 SAS-2 SMM SOHO Spitzer STEREO Suzaku Swift TD1 UIT ULYSSES WISE WMAP WUPPE XMM] set icatcdssrch(list,astro,param) {-kw.Astronomy} set icatcdssrch(list,astro) [list none Abundances Ages AGN Associations Atomic_Data Binaries:cataclysmic Binaries:eclipsing Binaries:spectroscopic BL_Lac_objects Blue_objects Clusters_of_galaxies Constellations Diameters Earth Ephemerides Equivalent_widths Extinction Galaxies Galaxies:Markarian Galaxies:spectra Globular_Clusters Gravitational_lensing HII_regions Interstellar_Medium Magnetic_fields Masers Masses Models Multiple_Stars Nebulae Nonstellar Novae Obs_Log Open_Clusters Orbits Parallaxes Photometry Photometry:intermediate-band Photometry:narrow-band Photometry:surface Photometry:wide-band Planetary_Nebulae Planets+Asteroids Polarization Positional_Data Proper_Motions Pulsars QSOs Redshifts Rotational_Velocities Seyfert_Galaxies Spectral_Classification Spectrophotometry Spectroscopy Stars Stars:early-typeStars:Emission Stars:late-type Stars:peculiar Stars:variable Stars:white_dwarf Stars:WR Sun SuperNovae SuperNovae_Remnants Velocities YSOs] } proc CATCDSSrchLoadFile {varname} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchLoad $varname" } if {[info exists $var(catdb)]} { unset $var(catdb) } set fn [OpenFileDialog catcdssrchfbox] if {$fn != {}} { if {[file exists $fn]} { starbase_read $var(catdb) $fn } else { Error "[msgcat::mc {Unable to open file}] $fn" return } CATCDSSrchTable $varname } } proc CATCDSSrchSaveFile {varname} { upvar #0 $varname var global $varname global $var(catdb) set fn [SaveFileDialog catcdssrchfbox] if {$fn != {}} { starbase_write $var(catdb) $fn } } proc CATCDSSrchClear {varname} { upvar #0 $varname var global $varname global $var(catdb) if {[info exists $var(catdb)]} { unset $var(catdb) } } proc CATCDSSrchCatalog {varname} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchCatalog $varname" } set row 0 foreach ss [$var(tbl) curselection] { set rr [lindex [split $ss ,] 0] if {$rr != $row} { set id [starbase_get $var(catdb) $rr 1] set title [starbase_get $var(catdb) $rr 2] if {$id != {}} { # can't use id, it may have / or + CATDialog catcds cds $id $title apply } set row $rr } } } proc CATCDSSrch {varname} { upvar #0 $varname var global $varname global pcat global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrch $varname" } # go for votable or tsv if {$pcat(vot)} { set var(proc,parser) CATCDSSrchVOTParse } else { set var(proc,reader) CATCDSSrchReader } #url set site [CATCDSURL $var(server)] set cgidir {viz-bin} if {$pcat(vot)} { set script {votable} } else { set script {asu-tsv} } set var(url) "http://$site/$cgidir/$script" # defaults set query {-meta} append query "&[http::formatQuery -out.max 1000]" if {$pcat(vot)} { append query "&[http::formatQuery -out.form VOTable]" } else { append query "&[http::formatQuery -out.form Tab-Separated-Values]" } if {$var(source) != {}} { append query "&[http::formatQuery -source $var(source)]" } if {$var(words) !={}} { append query "&[http::formatQuery -words $var(words)]" } if {$var(wave) !={}} { append query "&[http::formatQuery $var(list,wave,param) $var(wave)]" } if {$var(mission) !={}} { append query "&[http::formatQuery $var(list,mission,param) $var(mission)]" } if {$var(astro) !={}} { append query "&[http::formatQuery $var(list,astro,param) $var(astro)]" } set var(query) $query if {$pcat(vot)} { CATCDSSrchLoad $varname } else { CATCDSSrchLoadIncr $varname } } proc CATCDSSrchLoad {varname} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchLoad $varname" } if {[info exists $var(catdb)]} { unset $var(catdb) } set var(proc,done) CATCDSSrchDone set var(proc,load) CATCDSSrchLoad CATGetURL $varname return } proc CATCDSSrchLoadIncr {varname} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchLoadIncr $varname" } if {[info exists $var(catdb)]} { unset $var(catdb) } set var(proc,done) CATCDSSrchDone set var(proc,load) CATCDSSrchLoadIncr CATGetURLIncr $varname return } proc CATCDSSrchDone {varname} { upvar #0 $varname var global $varname CATCDSSrchTable $varname } proc CATCDSSrchReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 # create header incr ${t}(HLines) set n $T(HLines) set T(H_$n) "Resource\tDescription" set T(Header) [split $T(H_$n) "\t"] incr ${t}(HLines) set n $T(HLines) set T(H_$n) "--------\t-----------" set T(Dashes) [split $T(H_$n) "\t"] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 1 } 1 { # process RESOURCE if {[gets $sock line] == -1} { set T(state) 0 return $result } set result [string length "$line"] set line [string trim $line] if {$line != {}} { switch -- [string range $line 0 4] { "#RESO" { incr ${t}(Nrows) set r $T(Nrows) set T($r,1) {} set T($r,2) {} set T(state) 2 } } } } 2 { # process Description if {[gets $sock line] == -1} { set T(state) 0 return $result } set result [string length "$line"] set line [string trim $line] set r $T(Nrows) if {$line != {}} { switch -- [string range $line 0 4] { "#Name" { set T($r,1) [string trim [lindex [split $line {:}] 1]] set T(state) 3 } } } } 3 { # new style process description if {[gets $sock line] == -1} { set T(state) 0 return $result } set result [string length "$line"] set line [string trim $line] if {$line != {}} { switch -- [string range $line 0 4] { "#Titl" { # eat it } default { set r $T(Nrows) if {$r>0} { set val [string trim [string range $line 5 end]] catch {set T($r,2) "$val"} set T(state) 1 } } } } } } return $result } proc CATCDSSrchVOTParse {t token} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { set fp [open debug.xml w] puts $fp [http::data $token] close $fp } set xml [xml::parser \ -characterdatacommand [list CATCDSSrchVOTCharCB $t] \ -elementstartcommand [list CATCDSSrchVOTElemStartCB $t] \ -elementendcommand [list CATCDSSrchVOTElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,state) {} set T(tree,prev) {} if {[catch {$xml parse [http::data $token]} err]} { if {$debug(tcl,cat)} { puts stderr "CATCDSSrchVOTParse: $err" } } $xml free } proc CATCDSSrchVOTCharCB {t data} { upvar #0 $t T global $t global debug switch -- $T(tree,state) { DESCRIPTION { set data [string trim $data] if {$data != {}} { switch -- $T(tree,prev) { RESOURCE { set r $T(Nrows) set T($r,2) [lindex [split $data "\n"] 0] set T(tree,prev) {} } } } } } # sometimes, we get a bogus call, (ignore whitespace does not work) set T(tree,state) {} return {} } proc CATCDSSrchVOTElemStartCB {t name attlist args} { upvar #0 $t T global $t global debug switch -- $name { VOTABLE { # init db set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 # create header incr ${t}(HLines) set n $T(HLines) set T(H_$n) "Resource\tDescription" set T(Header) [split $T(H_$n) "\t"] incr ${t}(HLines) set n $T(HLines) set T(H_$n) "--------\t-----------" set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Header)] starbase_colmap $t } RESOURCE { set fname {} set id {} set type {} foreach {key value} $attlist { switch -- [string tolower $key] { name {set fname "$value"} id {set id "$value"} type {set type $value} } } incr ${t}(Nrows) set r $T(Nrows) set T($r,1) $fname set T($r,2) {} set T(tree,prev) $name } } set ${t}(tree,state) $name return {} } proc CATCDSSrchVOTElemEndCB {t name args} { upvar #0 $t T global $t global debug # we can't count on this being called for all end-tags switch -- $name { VOTABLE { # ok, we're done return -code break } } return {} } proc CATCDSSrchTable {varname} { upvar #0 $varname var global $varname global $var(catdb) global icatcdssrch global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchTable $varname" } # starbase_writefp $var(catdb) stdout global $var(catdb) $var(tbl) configure -variable $var(catdb) if {[starbase_nrows $var(catdb)] == 0} { ARStatus $varname [msgcat::mc {No Items Found}] return } set nc [starbase_ncols $var(catdb)] $var(tbl) configure -cols $nc # add header row set nr [expr [starbase_nrows $var(catdb)]+1] if {$nr > $icatcdssrch(minrows)} { $var(tbl) configure -rows $nr } else { $var(tbl) configure -rows $icatcdssrch(minrows) } ARStatus $varname "[starbase_nrows $var(catdb)] [msgcat::mc {Items Found}]" } ���������������������������������������������������������������saods9/ds9/library/catcdssrchdialog.tcl�������������������������������������������������������������000644 �000765 �000000 �00000030627 12514261632 020546� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATCDSSrchDialog {varname} { upvar #0 $varname var global $varname global ds9 global pcat global icatcdssrch global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchDialog $varname" } # main dialog set var(top) ".${varname}" set var(mb) ".${varname}mb" if {[winfo exists $var(top)]} { raise $var(top) return } # defaults # maybe modified if pcat(vot) set var(list,wave,param) $icatcdssrch(list,wave,param) set var(list,wave) $icatcdssrch(list,wave) set var(list,mission,param) $icatcdssrch(list,mission,param) set var(list,mission) $icatcdssrch(list,mission) set var(list,astro,param) $icatcdssrch(list,astro,param) set var(list,astro) $icatcdssrch(list,astro) # AR variables set var(status) {} set var(sync) 0 # CATCDSSrch variables set var(catdb) ${varname}catdb set var(server) $pcat(server) set var(source) {} set var(words) {} set var(wave) {} set var(mission) {} set var(astro) {} # create the window set w $var(top) set mb $var(mb) Toplevel $w $mb 7 [msgcat::mc {Search for Catalogs}] \ "CATCDSSrchDestroy $varname" # file $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Retrieve}] \ -command "CATCDSSrchApply $varname" $mb.file add command -label [msgcat::mc {Cancel}] \ -command "ARCancel $varname" $mb.file add command -label [msgcat::mc {Catalog}] \ -command "CATCDSSrchCatalog $varname" $mb.file add command -label [msgcat::mc {Clear}] \ -command "CATCDSSrchClear $varname" $mb.file add separator $mb.file add command -label "[msgcat::mc {Load}]..." \ -command "CATCDSSrchLoadFile $varname" $mb.file add command -label "[msgcat::mc {Save}]..." \ -command "CATCDSSrchSaveFile $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "CATCDSSrchDestroy $varname" # edit AREditMenu $varname # catalog server CATServerMenu $varname # Param set f [ttk::frame $w.param] ttk::frame $f.name ttk::frame $f.words ttk::frame $f.srch pack $f.name -side top -fill x -expand true pack $f.words -side top -fill x -expand true pack $f.srch -side bottom -fill both -expand true # param name ttk::label $f.name.title -text [msgcat::mc {Name or Designation}] ttk::entry $f.name.source -textvariable ${varname}(source) pack $f.name.title -side top -anchor w -padx 2 -pady 2 pack $f.name.source -side top -anchor w -padx 2 -pady 2 -fill x -expand true # param keywords ttk::label $f.words.title \ -text [msgcat::mc {Words matching title, description}] ttk::entry $f.words.key -textvariable ${varname}(words) -width 45 pack $f.words.title -side top -anchor w -padx 2 -pady 2 pack $f.words.key -side top -anchor w -padx 2 -pady 2 -fill x -expand true # param search ttk::frame $f.srch.wave ttk::frame $f.srch.mission ttk::frame $f.srch.astro pack $f.srch.wave $f.srch.mission $f.srch.astro \ -side left -fill both -expand true -padx 2 -pady 2 # param search wave ttk::frame $f.srch.wave.f ttk::label $f.srch.wave.title -text [msgcat::mc {Wavelength}] pack $f.srch.wave.title -side top -anchor w pack $f.srch.wave.f -side bottom -fill both -expand true \ -anchor w -padx 2 -pady 2 ttk::scrollbar $f.srch.wave.f.scroll \ -command [list $f.srch.wave.f.list yview] set ${varname}(listbox,wave) [listbox $f.srch.wave.f.list \ -yscroll \ [list $f.srch.wave.f.scroll set] \ -setgrid true \ -selectmode browse \ -exportselection 0 \ -listvariable ${varname}(list,wave)] grid $f.srch.wave.f.list $f.srch.wave.f.scroll -sticky news grid rowconfigure $f.srch.wave.f 0 -weight 1 grid columnconfigure $f.srch.wave.f 0 -weight 1 # param search mission ttk::frame $f.srch.mission.f ttk::label $f.srch.mission.title -text [msgcat::mc {Mission}] pack $f.srch.mission.title -side top -anchor w pack $f.srch.mission.f -side bottom -fill both -expand true \ -anchor w -padx 2 -pady 2 ttk::scrollbar $f.srch.mission.f.scroll \ -command [list $f.srch.mission.f.list yview] set ${varname}(listbox,mission) [listbox $f.srch.mission.f.list \ -yscroll \ [list $f.srch.mission.f.scroll set] \ -setgrid true \ -selectmode browse \ -exportselection 0 \ -listvariable ${varname}(list,mission)] grid $f.srch.mission.f.list $f.srch.mission.f.scroll \ -sticky news grid rowconfigure $f.srch.mission.f 0 -weight 1 grid columnconfigure $f.srch.mission.f 0 -weight 1 # param search astro ttk::frame $f.srch.astro.f ttk::label $f.srch.astro.title -text [msgcat::mc {Astronomy}] pack $f.srch.astro.title -side top -anchor w pack $f.srch.astro.f -side bottom -fill both -expand true \ -anchor w -padx 2 -pady 2 ttk::scrollbar $f.srch.astro.f.scroll \ -command [list $f.srch.astro.f.list yview] set ${varname}(listbox,astro) [listbox $f.srch.astro.f.list \ -yscroll \ [list $f.srch.astro.f.scroll set] \ -setgrid true \ -selectmode browse \ -exportselection 0 \ -listvariable ${varname}(list,astro)] grid $f.srch.astro.f.list $f.srch.astro.f.scroll -sticky news grid rowconfigure $f.srch.astro.f 0 -weight 1 grid columnconfigure $f.srch.astro.f 0 -weight 1 # Table set f [ttk::frame $w.tbl] set var(tbl) [table $f.t \ -state disabled \ -usecommand 0 \ -variable $var(catdb) \ -colorigin 1 \ -roworigin 0 \ -cols $icatcdssrch(mincols) \ -rows $icatcdssrch(minrows) \ -colstretchmode all \ -width -1 \ -height -1 \ -maxwidth 400 \ -maxheight 190 \ -titlerows 1 \ -xscrollcommand [list $f.xscroll set]\ -yscrollcommand [list $f.yscroll set]\ -selecttype row \ -selectmode extended \ -anchor w \ -font [font actual TkDefaultFont] ] ttk::scrollbar $f.yscroll -command [list $var(tbl) yview] \ -orient vertical ttk::scrollbar $f.xscroll -command [list $var(tbl) xview] \ -orient horizontal grid $var(tbl) $f.yscroll -sticky news grid $f.xscroll -stick news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Status set f [ttk::frame $w.status] ttk::label $f.title -text [msgcat::mc {Status}] ttk::label $f.item -textvariable ${varname}(status) pack $f.title $f.item -side left -anchor w -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] set var(apply) [ttk::button $f.apply \ -text [msgcat::mc {Retrieve}] \ -command "CATCDSSrchApply $varname"] set var(cancel) [ttk::button $f.cancel \ -text [msgcat::mc {Cancel}] \ -command "ARCancel $varname" -state disabled] ttk::button $f.catalog -text [msgcat::mc {Catalog}] \ -command "CATCDSSrchCatalog $varname" ttk::button $f.clear -text [msgcat::mc {Clear}] \ -command "CATCDSSrchClear $varname" ttk::button $f.close -text [msgcat::mc {Close}] \ -command "CATCDSSrchDestroy $varname" pack $f.apply $f.cancel $f.catalog $f.clear $f.close \ -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal ttk::separator $w.stbl -orient horizontal ttk::separator $w.sstatus -orient horizontal pack $w.buttons $w.sstatus $w.status $w.stbl -side bottom -fill x pack $w.param $w.sep -side top -fill x pack $w.tbl -side top -fill both -expand true ARStatus $varname {} # initialize $var(listbox,wave) selection set 0 $var(listbox,mission) selection set 0 $var(listbox,astro) selection set 0 $w.param.name.source select range 0 end } proc CATCDSSrchApply {varname} { upvar #0 $varname var global $varname global icatcdssrch global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchApply $varname" } set id [$var(listbox,wave) curselection] if {$id > 0} { set var(wave) [lindex $var(list,wave) $id] } else { set var(wave) {} } set id [$var(listbox,mission) curselection] if {$id > 0} { set var(mission) [lindex $var(list,mission) $id] } else { set var(mission) {} } set id [$var(listbox,astro) curselection] if {$id > 0} { set var(astro) [lindex $var(list,astro) $id] } else { set var(astro) {} } ARApply $varname ARStatus $varname [msgcat::mc {Searching for catalogs}] CATCDSSrch $varname } proc CATCDSSrchDestroy {varname} { upvar #0 $varname var global $varname global $var(catdb) global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchDestroy $varname" } if {[info exists $var(catdb)]} { unset $var(catdb) } ARDestroy $varname } proc CATCDSSrchConfig {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchConfig $varname" } set site [CATCDSURL $var(server)] set cgidir {viz-bin} set script {votable} set var(url) "http://$site/$cgidir/$script" set var(query) [http::formatQuery -meta.aladin all] CATCDSSrchConfigLoad $varname return } proc CATCDSSrchConfigLoad {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchConfigLoad $varname" } set var(proc,parser) CATCDSSrchConfigParse set var(proc,done) CATCDSSrchConfigDone set var(proc,load) CATCDSSrchConfigLoad CATGetURL $varname return } proc CATCDSSrchConfigDone {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchConfigDone $varname" } CATCDSSrchConfigParse } proc CATCDSSrchConfigParse {t token} { upvar #0 $t T global $t global debug global debug if {$debug(tcl,cat)} { puts stderr "CATCDSSrchConfigParse" } if {$debug(tcl,cat)} { set fp [open debug.xml w] puts $fp [http::data $token] close $fp } set xml [xml::parser \ -elementstartcommand [list CATCDSSrchConfigElemStartCB $t] \ -elementendcommand [list CATCDSSrchConfigElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,enable) 0 set T(tree,state) {} if {[catch {$xml parse [http::data $token]} err]} { if {$debug(tcl,cat)} { puts stderr "CATCDSSrchConfigParse: $err" } } unset ${t}(tree,enable) unset ${t}(tree,state) $xml free } proc CATCDSSrchConfigElemStartCB {t name attlist args} { upvar #0 $t T global $t global debug # hardcoded set varname catcdssrch1 upvar #0 $varname var global $varname switch -- $name { RESOURCE { set id {} set type {} foreach {key value} $attlist { switch -- [string tolower $key] { type {set type "$value"} id {set id "$value"} } } if {[string tolower $id] == "vizier"} { set T(tree,enable) 1 set ${varname}(list,wave) [list none] set ${varname}(list,mission) [list none] set ${varname}(list,astro) [list none] } } PARAM { if {$T(tree,enable)} { set id {} set fname {} foreach {key value} $attlist { switch -- [string tolower $key] { name {set fname "$value"} id {set id "$value"} } } set T(tree,state) [string trim [string tolower $id]] switch -- $T(tree,state) { wavelength {set ${varname}(list,wave,param) $fname} mission {set ${varname}(list,mission,param) $fname} astronomy {set ${varname}(list,astro,param) $fname} } } } VALUES {} OPTION { if {$T(tree,enable)} { set item {} foreach {key value} $attlist { switch -- [string tolower $key] { value {set item "$value"} } } if {$item != {}} { global icatcdssrch switch -- $T(tree,state) { wavelength {lappend ${varname}(list,wave) $item} mission {lappend ${varname}(list,mission) $item} astronomy {lappend ${varname}(list,astro) $item} } } } } } return {} } proc CATCDSSrchConfigElemEndCB {t name args} { upvar #0 $t T global $t global debug # we can't count on this being called for all end-tags switch -- $name { RESOURCE { # ok, we're done set T(tree,enable) 0 return -code break } } return {} } ���������������������������������������������������������������������������������������������������������saods9/ds9/library/catcmd.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000035620 12514261632 016476� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Table Commands proc CATSelectCmd {varname ss rc} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSelectCmd $varname $ss $rc" } if {$var(edit)} { CATSelectEditCmd $varname $ss $rc } else { CATSelectBrowseCmd $varname $ss $rc } } proc CATSelectEditCmd {varname ss rc} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSelectEditCmd $varname $rc" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } $var(frame) marker catalog $varname unselect set last [lindex [split $ss ,] 0] set next [lindex [split $rc ,] 0] if {[string is integer -strict $last]} { CATGenerateUpdate $varname $last } if {[string is integer -strict $next]} { set mk "\{${varname}.${next}\}" CATPanTo $varname $mk $var(frame) marker catalog $mk select } } proc CATSelectBrowseCmd {varname ss rc} { upvar #0 $varname var global $varname # starts at 1 global debug if {$debug(tcl,cat)} { puts stderr "CATSelectBrowseCmd $varname ss=$ss rc=$rc" } global $var(catdb) if {![CATValidDB $var(catdb)]} { return } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } $var(frame) marker catalog $varname unhighlite # init timer vars set var(blink,count) 0 set var(blink,marker) {} # now see the current selection set last [lindex [split $ss ,] 0] set row [lindex [split $rc ,] 0] # needed for plot, status, samp # starts at 0 set rowlist {} foreach sel [$var(tbl) curselection] { set rr [lindex [split $sel ,] 0] lappend rowlist $rr } set rowlist [lsort -unique $rowlist] # kludge # tktable can return bogus numbers if arrow keys are used # try to fix if {$row == 0} { set row 1 } if {[llength $rowlist] <= 1} { set rowlist $row } foreach rr $rowlist { lappend ${varname}(blink,marker) "\{${varname}.${rr}\}" } # status CATStatusRows $varname $rowlist # plot if {$var(plot)} { PlotHighliteElement $var(plot,var) $rowlist } # samp SAMPSendTableRowListCmd $varname $rowlist # panto CATPanTo $varname [lindex $var(blink,marker) 0] # start timer, if needed if {!$var(blink)} { set var(blink) 1 CATSelectTimer $varname } } proc CATSelectRows {varname src rowlist} { upvar #0 $varname var global $varname # just in case? set rowlist [lsort -unique $rowlist] # rows start at 1 global debug if {$debug(tcl,cat)} { puts stderr "CATSelectRows $varname $src $rowlist" } if {![info exists ${varname}(top)]} { return } global $var(catdb) if {![CATValidDB $var(catdb)]} { return } # rowlist can be empty if {$rowlist == {}} { if {[info exists ${varname}(tbl)]} { $var(tbl) selection clear all } $var(frame) marker catalog $varname unhighlite return } if {[info exists ${varname}(tbl)]} { $var(tbl) selection clear all foreach rr $rowlist { $var(tbl) selection set $rr,1 } $var(tbl) see [lindex $rowlist 0],1 } $var(frame) marker catalog $varname unhighlite # init timer vars set var(blink,count) 0 set var(blink,marker) {} foreach rr $rowlist { lappend ${varname}(blink,marker) "\{${varname}.${rr}\}" } # status CATStatusRows $varname $rowlist # source of call switch $src { samp { if {$var(plot)} { PlotHighliteElement $var(plot,var) $rowlist } } plot { SAMPSendTableRowListCmd $varname $rowlist } } # panto CATPanTo $varname [lindex $var(blink,marker) 0] # start timer, if needed if {!$var(blink)} { set var(blink) 1 CATSelectTimer $varname } } proc CATPanTo {varname mk} { upvar #0 $varname var global $varname if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } # pan to first region if {$var(panto) && $mk != {}} { set tt [$var(frame) get marker catalog $mk tag] if {$tt!={}} { set cc [$var(frame) get marker catalog $tt center \ $var(psystem) $var(psky)] PanToFrame $var(frame) [lindex $cc 0] [lindex $cc 1] \ $var(psystem) $var(psky) } } } proc CATSelectTimer {varname} { upvar #0 $varname var global $varname switch -- $var(blink) { 0 { set var(blink) 0 set var(blink,count) 0 set var(blink,marker) {} } 1 { foreach mm $var(blink,marker) { if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { $var(frame) marker catalog $mm highlite } } } incr ${varname}(blink,count) if {$var(blink,count) < 5} { set var(blink) 2 } else { set var(blink) 0 } after 250 [list CATSelectTimer $varname] } 2 { foreach mm $var(blink,marker) { if {[info commands $var(frame)] != {}} { if {[$var(frame) has fits]} { $var(frame) marker catalog $mm unhighlite } } } set var(blink) 1 after 250 [list CATSelectTimer $varname] } } } # Marker Callbacks # call backs can't call other procs proc CATHighliteCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATHighliteCB $tag $id" } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] upvar #0 $varname var global $varname if {![info exists ${varname}(top)]} { return } if {!$var(blink)} { if {[info exists ${varname}(tbl)]} { $var(tbl) selection set $row,1 $var(tbl) see $row,1 } } } proc CATUnhighliteCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATUnhighliteCB $tag $id" } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] upvar #0 $varname var global $varname if {![info exists ${varname}(top)]} { return } if {!$var(blink)} { if {[info exists ${varname}(tbl)]} { $var(tbl) selection clear $row,1 } } } proc CATEditCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATEditCB $tag $id" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] set szcol [lindex $t 2] set sz2col [lindex $t 3] set units [lindex $t 4] set angcol [lindex $t 5] upvar #0 $varname var global $varname global $var(tbldb) if {![info exists ${varname}(top)]} { return } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } # shape set shape [$var(frame) get marker catalog $id type] # skyformat switch -- $units { degrees - arcmin - arcsec { set skyformat $units } default { set skyformat degrees } } # get center and format switch $shape { circle { if {$szcol>0} { set rr [$var(frame) get marker catalog $id $shape radius \ $var(psystem) $skyformat] starbase_set $var(tbldb) $row $szcol $rr } } ellipse - box { if {$szcol>0 && $sz2col>0} { set rr [$var(frame) get marker catalog $id $shape radius \ $var(psystem) $skyformat] starbase_set $var(tbldb) $row $szcol [lindex $rr 0] starbase_set $var(tbldb) $row $sz2col [lindex $rr 1] } } vector { if {$szcol>0} { set ll [$var(frame) get marker catalog $id $shape length \ $var(psystem) $skyformat] starbase_set $var(tbldb) $row $szcol $ll } if {$angcol>0} { set ang [$var(frame) get marker catalog $id angle \ $var(psystem) $p(sky)] starbase_set $var(tbldb) $row $angcol $ang } } default {} } } proc CATMoveCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATMoveCB $tag $id" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] upvar #0 $varname var global $varname global $var(tbldb) if {![info exists ${varname}(top)]} { return } # center set coord [$var(frame) get marker catalog $id center \ $var(psystem) $var(sky) degrees] starbase_set $var(tbldb) $row [starbase_colnum $var(tbldb) $var(colx)] \ [lindex $coord 0] starbase_set $var(tbldb) $row [starbase_colnum $var(tbldb) $var(coly)] \ [lindex $coord 1] } proc CATRotateCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATRotateCB $tag $id" } global debug if {$debug(tcl,cat)} { puts stderr "CATMoveCB $tag $id" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] set angcol [lindex $t 2] upvar #0 $varname var global $varname global $var(tbldb) if {[info commands $var(frame)] == {}} { return } if {![info exists ${varname}(top)]} { return } # shape set shape [$var(frame) get marker catalog $id type] # get center and format switch $shape { ellipse - box { if {$angcol>0} { set ang [$var(frame) get marker catalog $id angle \ $var(psystem) $var(sky)] starbase_set $var(tbldb) $row $angcol $ang } } default {} } } proc CATDeleteCB {tag id} { global debug if {$debug(tcl,cat)} { puts stderr "CATDeleteCB $tag $id" } } # Tcl Commands proc CATButton {which x y} { global imarker global debug if {$debug(tcl,cat)} { puts stderr "CATButton $which $x $y" } # if nothing is loaded, abort if {![$which has fits]} { return } # see if we are on a handle set h [$which get marker catalog handle $x $y] set id [lindex $h 0] set imarker(handle) [lindex $h 1] if {$imarker(handle)} { $which marker catalog $id edit begin $imarker(handle) set imarker(motion) beginEdit return } # else, see if we are on a segment of a polygon set h [$which get marker catalog polygon segment $x $y] set id [lindex $h 0] set segment [lindex $h 1] if {$segment} { $which marker catalog $id create polygon vertex $segment $x $y $which marker catalog $id edit begin $imarker(handle) set imarker(handle) [expr 4+$segment+1] set imarker(motion) beginEdit return } # else, see if we are on a marker set id [$which get marker catalog id $x $y] if {$id != 0} { # select if {[$which get marker catalog $id property select]} { $which marker catalog select only $x $y $which marker catalog move begin $x $y set imarker(motion) beginMove return } # highlite if {[$which get marker catalog $id property highlite]} { $which marker catalog $id highlite only $which marker catalog $id move back set imarker(motion) none return } } # see if any markers are selected if {[$which get marker catalog select number]>0} { $which marker catalog unselect all set imarker(motion) none return } # see if any markers are selected if {[$which get marker catalog highlite number]>0} { $which marker catalog unhighlite all set imarker(motion) none return } set imarker(motion) none set imarker(handle) -1 } proc CATShift {which x y} { global imarker global debug if {$debug(tcl,cat)} { puts stderr "CATShift $which $x $y" } # if nothing is loaded, abort if {![$which has fits]} { return } # see if we are on a handle set h [$which get marker catalog handle $x $y] set id [lindex $h 0] set imarker(handle) [lindex $h 1] if {$imarker(handle)} { $which marker catalog $id rotate begin set imarker(motion) beginRotate return } # else, see if we are on a marker if {[$which marker catalog select toggle $x $y]} { $which marker catalog move begin $x $y set imarker(motion) beginMove return } if {[$which marker catalog highlite toggle $x $y]} { set imarker(motion) none return } # else, start a region select $which region catalog select begin $x $y # $which region catalog highlite begin $x $y set imarker(motion) shiftregion } proc CATMotion {which x y} { global imarker global debug if {$debug(tcl,cat)} { puts stderr "CATMotion $which $x $y" } # if nothing is loaded, abort if {![$which has fits]} { return } switch -- $imarker(motion) { none {} beginMove - move { $which marker catalog move motion $x $y set imarker(motion) move } beginEdit - edit { $which marker catalog edit motion $x $y $imarker(handle) set imarker(motion) edit } beginRotate - rotate { $which marker catalog rotate motion $x $y $imarker(handle) set imarker(motion) rotate } region - shiftregion { $which region catalog select motion $x $y # $which region catalog highlite motion $x $y } } } proc CATRelease {which x y} { global imarker global samp global debug if {$debug(tcl,cat)} { puts stderr "CATRelease $which $x $y" } # if nothing is loaded, abort if {![$which has fits]} { return } switch -- $imarker(motion) { none {} beginMove - beginRotate {} beginEdit {} move {$which marker catalog move end} edit {$which marker catalog edit end} rotate {$which marker catalog rotate end} region { $which region catalog select end $which region catalog catalog highlite end } shiftregion { $which region catalog select shift end $which region catalog highlite shift end } } set imarker(motion) none set imarker(handle) -1 # plot, stats, samp set rr {} foreach mm [$which get marker catalog highlite] { lappend rr [string trim [lindex [$which get marker catalog $mm tag] 1]] } if {$rr != {}} { set rr [lsort $rr] set varname {} set rowlist {} foreach ss $rr { set tt [split $ss {.}] set varr [lindex $tt 0] set row [lindex $tt 1] if {$varname != $varr} { # dump what we have if {$varname != {}} { upvar #0 $varname var global $varname # status CATStatusRows $varname $rowlist # plot if {$var(plot)} { PlotHighliteElement $var(plot,var) $rowlist } # samp if {[info exists samp]} { if {$samp(apps,votable) != {}} { SAMPSendTableRowListCmd $varname $rowlist } } } # now a new list set varname $varr set rowlist {} } lappend rowlist $row } if {$varname != {}} { upvar #0 $varname var global $varname # status CATStatusRows $varname $rowlist #plot if {$var(plot)} { PlotHighliteElement $var(plot,var) $rowlist } # samp if {[info exists samp]} { if {$samp(apps,votable) != {}} { SAMPSendTableRowListCmd $varname $rowlist } } } } } ����������������������������������������������������������������������������������������������������������������saods9/ds9/library/catcxc.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000017624 12527716223 016521� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATCXC {varname} { upvar #0 $varname var global $varname global pcat global debug if {$debug(tcl,cat)} { puts stderr "CATCXC $varname" } # go for votable or tsv if {$pcat(vot)} { CATCXCVOT $varname } else { CATCXCTSV $varname } } proc CATCXCVOT {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATCXCVOT $varname" } set var(proc,parser) CATVOTParse # coord (degrees) switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { set xx [h2d [Sex2H $var(x)]] set yy [Sex2D $var(y)] } } # size (arcmin) switch $var(rformat) { degrees { set ww $var(width) set hh $var(height) } arcmin { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } arcsec { set ww [expr $var(width)/60./60.] set hh [expr $var(height)/60./60.] } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] # output if {$var(allcols)} { set type 3 } else { set type 2 } # query set var(query) [http::formatQuery RA $xx DEC $yy SR $rr VERB $type] set var(url) "http://cda.cfa.harvard.edu/cscvo/coneSearch" CATLoad $varname } proc CATCXCTSV {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATCXCTSV $varname" } set var(proc,reader) CATCXCReader # coord (degrees) switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { switch -- $var(sky) { fk4 - fk5 - icrs {set xx [h2d [Sex2H $var(x)]]} galactic - ecliptic {set xx [Sex2D $var(x)]} } set yy [Sex2D $var(y)] } } # size (arcmin) switch $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] # output if {$var(allcols)} { set type observation } else { set type master } # query set var(query) "ra=$xx&dec=$yy&sr=$rr&type=$type" # rows if {!$var(allrows)} { append var(query) "&rows=$var(max)" } set var(url) "http://cda.cfa.harvard.edu/cscds9/coneSearch" CATLoadIncr $varname } proc CATCXCReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) 1 } 1 { # process header if {[gets $sock line] == -1} { set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) -1 return $result } set result [string length "$line"] incr ${t}(HLines) set n $T(HLines) set T(H_$n) $line if {[regexp -- {^ *(-)+ *(\t *(-)+ *)*} $line]} { # clean up header column name set hh $T(H_[expr $n-1]) regsub -all {\[} $hh {} hh regsub -all {\]} $hh {} hh set T(H_[expr $n-1]) $hh # cols set T(Header) [split $T(H_[expr $n-1]) "\t"] set T(Dashes) [split $T(H_$n) "\t"] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 2 # these are hard coded set T(Id) $T(Header) set T(DataType) {} set T(ArraySize) {} set T(Unit) {} set T(Ucd) {} # name lappend T(DataType) {char} lappend T(ArraySize) {*} lappend T(Unit) {} lappend T(Ucd) {} # ra lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {pos.eq.ra;meta.main} # dec lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {pos.eq.dec;meta.main} # err_ellipse_r0 lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # err_ellipse_r1 lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # err_ellipse_ang lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {} # conf_flag lappend T(DataType) {boolean} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # extent_flag lappend T(DataType) {boolean} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # sat_src_flag lappend T(DataType) {boolean} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # flux_aper90_b lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # flux_aper90_hilim_b lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # flux_aper90_lolim_b lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # significance lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # hard_hm lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # hard_ms lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # var_intra_index_b lappend T(DataType) {int} lappend T(ArraySize) {} lappend T(Unit) {} # var_inter_index_b lappend T(DataType) {int} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} if {[llength $T(Header)] > 17} { # obsid lappend T(DataType) {int} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # ra_aper lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {} # dec_aper lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {} # mjr_axis_aper lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # mnr_axis_aper lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {} lappend T(Ucd) {} # pos_angle_aper lappend T(DataType) {float} lappend T(ArraySize) {} lappend T(Unit) {deg} lappend T(Ucd) {} } } } 2 { # process table if {[gets $sock line] == -1} { set T(state) 0 } else { set result [string length "$line"] set line [string trim $line] if {$line != {}} { # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line "\t"] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } } } } return $result } proc CATCXCAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for CXC Request for Acknowledgment of Use of the Chandra Source Catalog Users are kindly requested to acknowledge in the acknowledgment section of any resulting publications their use of the Chandra Source Catalog. This will help us greatly to keep track of catalog usage, information that is essential for providing full accountability of our work and services, as well as for planning future services. The following language is suggested: This research has made use of data obtained from the Chandra Source Catalog, provided by the Chandra X-ray Center (CXC) as part of the Chandra Data Archive. We would like to remind you that it is also very helpful for us if you could include Dataset Identifiers in the manuscript. The Dataset Identifier for the Chandra Source Catalog is: ADS/Sa.CXO#CSC } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } ������������������������������������������������������������������������������������������������������������saods9/ds9/library/catdialog.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000110105 12542051131 017152� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # used by backup proc CATDialog {varname format catalog title action} { global cat global icat global pcat global ds9 global pds9 global wcs # first determine if aready in use, then increment if {[lsearch $icat(cats) $varname] >= 0} { incr cat(id) append varname $cat(id) } upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATDialog $varname:$format:$catalog:$title:$action" } # main dialog set var(top) ".${varname}" set var(mb) ".${varname}mb" if {[winfo exists $var(top)]} { raise $var(top) return } global current if {$current(frame) == {}} { return } # AR variables ARInit $varname CATServer # CAT variables lappend icat(cats) $varname set var(catdb) ${varname}catdb set var(tbldb) ${varname}tbldb set var(symdb) ${varname}symdb set var(symdl) ${varname}symdl set var(fltdl) ${varname}fltdl set var(frame) $current(frame) set var(server) $pcat(server) set var(loc) $pcat(loc) set var(system) $wcs(system) set var(sky) $wcs(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $icat(rformat) set var(width) $icat(width) set var(height) $icat(height) set var(max) $icat(max) set var(allrows) $icat(allrows) set var(allcols) $icat(allcols) set var(show) $icat(show) set var(edit) $icat(edit) set var(panto) $icat(panto) set var(psystem) $var(system) set var(psky) $var(sky) set var(blink) 0 set var(blink,count) 0 set var(blink,marker) {} set var(plot) 0 set var(plot,var) {} set var(plot,x) {} set var(plot,xerr) {} set var(plot,y) {} set var(plot,yerr) {} CATSet $varname $format $catalog $title CATSymDBInit $varname # create the window set w $var(top) set mb $var(mb) if {$title!= {}} { set tt $title } else { set tt [msgcat::mc {Catalog Tool}] } Toplevel $w $mb 7 $tt "CATDestroy $varname" $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit CATServerMenu $varname NSVRServerMenu $varname $mb add cascade -label [msgcat::mc {Symbol}] -menu $mb.symbol $mb add cascade -label [msgcat::mc {Preferences}] -menu $mb.prefs # file menu $mb.file $mb.file add command -label "[msgcat::mc {Load}]..." \ -command [list CATLoadVOTFile $varname] $mb.file add command -label "[msgcat::mc {Save}]..." \ -command [list CATSaveVOTFile $varname] $mb.file add separator $mb.file add cascade -label [msgcat::mc {Import}] -menu $mb.file.import $mb.file add cascade -label [msgcat::mc {Export}] -menu $mb.file.export $mb.file add separator $mb.file add command -label [msgcat::mc {Retrieve}] \ -command [list CATApply $varname 0] $mb.file add command -label [msgcat::mc {Cancel}] \ -command [list ARCancel $varname] $mb.file add separator $mb.file add command -label [msgcat::mc {Filter}] \ -command [list CATTable $varname] $mb.file add command -label [msgcat::mc {Clear}] \ -command [list CATOff $varname] $mb.file add separator $mb.file add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(show) -command [list CATGenerate $varname] $mb.file add checkbutton -label [msgcat::mc {Edit}] \ -variable ${varname}(edit) -command [list CATEdit $varname] $mb.file add separator $mb.file add cascade -label [msgcat::mc {SAMP}] -menu $mb.file.samp $mb.file add command -label [msgcat::mc {Plot}] \ -command [list CATPlot $varname] $mb.file add separator $mb.file add command -label "[msgcat::mc {Display Header}]..." \ -command [list CATHeader $varname] $mb.file add command -label [msgcat::mc {Acknowledgment}] \ -command [list CATAck $varname] $mb.file add separator $mb.file add command -label [msgcat::mc {Update from Current Frame}] \ -command [list CATUpdate $varname] $mb.file add command \ -label [msgcat::mc {Update from Current Crosshair}] \ -command [list CATCrosshair $varname] $mb.file add separator $mb.file add command -label [msgcat::mc {Copy to Regions}] \ -command [list CATGenerateRegions $varname] $mb.file add separator $mb.file add command -label "[msgcat::mc {Print}]..." \ -command [list CATPrint $varname] $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command [list CATDestroy $varname] # Import menu $mb.file.import $mb.file.import add command -label "[msgcat::mc {Starbase}]..." \ -command [list CATLoadSBFile $varname] $mb.file.import add command -label "[msgcat::mc {Tab-Separated-Value}]..." \ -command [list CATLoadTSVFile $varname] # Export menu $mb.file.export $mb.file.export add command -label "[msgcat::mc {Starbase}]..." \ -command [list CATSaveSBFile $varname] $mb.file.export add command -label "[msgcat::mc {Tab-Separated-Value}]..." \ -command [list CATSaveTSVFile $varname] # SAMP menu $mb.file.samp $mb.file.samp add command -label [msgcat::mc {Connect}] \ -command SAMPConnect $mb.file.samp add command -label [msgcat::mc {Disconnect}] \ -command SAMPDisconnect $mb.file.samp add separator $mb.file.samp add cascade -label [msgcat::mc {Send}] \ -menu $mb.file.samp.send menu $mb.file.samp.send $mb.file.samp.send add command -label [msgcat::mc {Broadcast}] \ -command [list SAMPSendTableLoadVotable {} $varname] $mb.file.samp.send add separator # edit menu $mb.edit $mb.edit add command -label [msgcat::mc {Cut}] \ -command "CATCut $varname" -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command "CATCopy $varname" -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -command "EntryPaste $var(top)" -accelerator "${ds9(ctrl)}V" $mb.edit add separator $mb.edit add command -label [msgcat::mc {Clear}] \ -command [list ARClear $varname] # symbol global $var(symdb) set flt $var(symdb) set sn [starbase_colnum $var(symdb) shape] set cn [starbase_colnum $var(symdb) color] set wn [starbase_colnum $var(symdb) width] set dn [starbase_colnum $var(symdb) dash] set fn [starbase_colnum $var(symdb) font] set fs [starbase_colnum $var(symdb) fontsize] set fw [starbase_colnum $var(symdb) fontweight] set fl [starbase_colnum $var(symdb) fontslant] menu $mb.symbol $mb.symbol add cascade -label [msgcat::mc {Shape}] -menu $mb.symbol.shape $mb.symbol add cascade -label [msgcat::mc {Color}] -menu $mb.symbol.color $mb.symbol add cascade -label [msgcat::mc {Width}] -menu $mb.symbol.width $mb.symbol add cascade -label [msgcat::mc {Font}] -menu $mb.symbol.font $mb.symbol add separator $mb.symbol add command -label "[msgcat::mc {Advanced}]..." \ -command [list CATSymDialog $varname] menu $mb.symbol.shape $mb.symbol.shape add radiobutton -label [msgcat::mc {Circle}] \ -variable ${flt}(1,$sn) -value circle \ -command [list CATGenerate $varname] $mb.symbol.shape add radiobutton -label [msgcat::mc {Ellipse}] \ -variable ${flt}(1,$sn) -value ellipse \ -command [list CATGenerate $varname] $mb.symbol.shape add radiobutton -label [msgcat::mc {Box}] \ -variable ${flt}(1,$sn) -value box \ -command [list CATGenerate $varname] $mb.symbol.shape add radiobutton -label [msgcat::mc {Text}] \ -variable ${flt}(1,$sn) -value text \ -command [list CATGenerate $varname] $mb.symbol.shape add cascade -label [msgcat::mc {Point}] \ -menu $mb.symbol.shape.point menu $mb.symbol.shape.point $mb.symbol.shape.point add radiobutton -label [msgcat::mc {Circle}] \ -variable ${flt}(1,$sn) -value {circle point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {Box}] \ -variable ${flt}(1,$sn) -value {box point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {Diamond}] \ -variable ${flt}(1,$sn) -value {diamond point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {Cross}] \ -variable ${flt}(1,$sn) -value {cross point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {X}] \ -variable ${flt}(1,$sn) -value {x point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {Arrow}] \ -variable ${flt}(1,$sn) -value {arrow point} \ -command [list CATGenerate $varname] $mb.symbol.shape.point add radiobutton -label [msgcat::mc {BoxCircle}]\ -variable ${flt}(1,$sn) -value {boxcircle point} \ -command [list CATGenerate $varname] ColorMenu $mb.symbol.color $flt 1,$cn [list CATGenerate $varname] WidthDashMenu $mb.symbol.width $flt 1,$wn 1,$dn \ [list CATGenerate $varname] [list CATGenerate $varname] FontMenu $mb.symbol.font $flt 1,$fn 1,$fs 1,$fw 1,$fl \ [list CATGenerate $varname] menu $mb.prefs $mb.prefs add checkbutton -label [msgcat::mc {Pan To}] \ -variable ${varname}(panto) $mb.prefs add separator $mb.prefs add checkbutton -label [msgcat::mc {All Rows}] \ -variable ${varname}(allrows) $mb.prefs add checkbutton -label [msgcat::mc {All Columns}] \ -variable ${varname}(allcols) # Catalog set f [ttk::labelframe $w.cat -text [msgcat::mc {Catalog}] -padding 2] ttk::label $f.ttitle -text [msgcat::mc {Name}] ttk::label $f.title -textvariable ${varname}(title) \ -relief groove -width 60 -anchor w ttk::label $f.tcat -text [msgcat::mc {Identification}] ttk::label $f.cat -textvariable ${varname}(catalog) \ -relief groove -width 60 -anchor w ttk::label $f.tref -text [msgcat::mc {Reference}] ttk::label $f.ref -text [string range $varname 3 end] \ -relief groove -width 13 -anchor w ttk::label $f.loctitle -text [msgcat::mc {IAU Location Code}] ttk::entry $f.loc -textvariable ${varname}(loc) -width 7 grid $f.ttitle $f.title -padx 2 -pady 2 -sticky w grid $f.tcat $f.cat -padx 2 -pady 2 -sticky w grid $f.tref $f.ref -padx 2 -pady 2 -sticky w grid $f.loctitle $f.loc -padx 2 -pady 2 -sticky w # Object set f [ttk::labelframe $w.obj -text [msgcat::mc {Object}] -padding 2] ttk::label $f.nametitle -text [msgcat::mc {Name}] ttk::entry $f.name -textvariable ${varname}(name) -width 60 set var(xname) [ttk::label $f.xtitle -text {} -width 1] ttk::entry $f.x -textvariable ${varname}(x) -width 14 set var(yname) [ttk::label $f.ytitle -text {} -width 1] ttk::entry $f.y -textvariable ${varname}(y) -width 14 CoordMenuButton $f.coord $varname system 0 sky skyformat \ [list CATWCSMenuUpdate $varname] CoordMenuEnable $f.coord.menu $varname system 0 sky skyformat ttk::button $f.update -text [msgcat::mc {Update}] \ -command [list CATUpdate $varname] ttk::label $f.wtitle -text [msgcat::mc {Width}] ttk::entry $f.w -textvariable ${varname}(width) -width 14 ttk::label $f.htitle -text [msgcat::mc {Height}] ttk::entry $f.h -textvariable ${varname}(height) -width 14 ARRFormat $f.rformat $varname grid $f.nametitle $f.name - - - - -padx 2 -pady 2 -sticky w grid $f.xtitle $f.x $f.ytitle $f.y $f.coord $f.update \ -padx 2 -pady 2 -sticky w grid $f.wtitle $f.w $f.htitle $f.h $f.rformat -padx 2 -pady 2 -sticky w # Param set f [ttk::labelframe $w.param -text [msgcat::mc {Table}] -padding 2] ttk::label $f.mfilter -text [msgcat::mc {Filter}] ttk::entry $f.filter -textvariable ${varname}(filter) -width 50 ttk::button $f.bfilter -text [msgcat::mc {Edit}] \ -command [list CATEditDialog $varname filter $var(catdb)] ttk::label $f.msort -text [msgcat::mc {Sort}] set var(sortmenu) [ttk::menubutton $f.sort \ -textvariable ${varname}(sort) \ -menu $f.sort.menu -width 14] ttk::radiobutton $f.isort -text [msgcat::mc {Increase}] \ -variable ${varname}(sort,dir) -value "-increasing" \ -command [list CATTable $varname] ttk::radiobutton $f.dsort -text [msgcat::mc {Decrease}] \ -variable ${varname}(sort,dir) -value "-decreasing" \ -command [list CATTable $varname] ttk::label $f.mtitle -text [msgcat::mc {Max Rows}] ttk::entry $f.max -textvariable ${varname}(max) -width 14 ttk::label $f.ftitle -text [msgcat::mc {Found}] set var(found) [ttk::label $f.found \ -width 14 -relief groove -anchor w] set var(raname) [ttk::label $f.ra -text {} -width 3] set var(ramenu) [ttk::menubutton $f.ram -textvariable \ ${varname}(colx) -menu $f.ram.menu -width 14] set var(decname) [ttk::label $f.dec -text {} -width 3] set var(decmenu) [ttk::menubutton $f.decm -textvariable \ ${varname}(coly) -menu $f.decm.menu -width 14] CoordMenuButton $f.pcoord $varname psystem 1 psky {} \ [list CATColsCmd $varname] CoordMenuEnable $f.pcoord.menu $varname psystem 1 psky {} grid $f.mfilter $f.filter - - $f.bfilter \ -padx 2 -pady 2 -sticky w grid $f.msort $f.sort $f.isort $f.dsort \ -padx 2 -pady 2 -sticky w grid $f.mtitle $f.max $f.ftitle $f.found \ -padx 2 -pady 2 -sticky w grid $var(raname) $var(ramenu) $var(decname) $var(decmenu) $f.pcoord \ -padx 2 -pady 2 -sticky w # Table set f [ttk::frame $w.tbl] set var(tbl) [table $f.t \ -state disabled \ -usecommand 0 \ -variable $var(tbldb) \ -colorigin 1 \ -roworigin 0 \ -cols $icat(mincols) \ -rows $icat(minrows) \ -width -1 \ -height -1 \ -maxwidth 300 \ -maxheight 300 \ -titlerows 1 \ -xscrollcommand [list $f.xscroll set]\ -yscrollcommand [list $f.yscroll set]\ -selecttype row \ -selectmode extended \ -anchor w \ -font [font actual TkDefaultFont] \ -browsecommand [list CATSelectCmd $varname %s %S] \ ] ttk::scrollbar $f.yscroll -command [list $var(tbl) yview] -orient vertical ttk::scrollbar $f.xscroll -command [list $var(tbl) xview] -orient horizontal grid $var(tbl) $f.yscroll -sticky news grid $f.xscroll -stick news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Status set f [ttk::frame $w.status] ttk::label $f.title -text [msgcat::mc {Status}] ttk::label $f.item -textvariable ${varname}(status) grid $f.title $f.item -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ButtonButton $f.load [msgcat::mc {Load}] [list CATLoadVOTFile $varname] ButtonButton $f.save [msgcat::mc {Save}] [list CATSaveVOTFile $varname] set var(apply) [ttk::button $f.apply \ -text [msgcat::mc {Retrieve}] \ -command "CATApply $varname 0"] set var(cancel) [ttk::button $f.cancel -text \ [msgcat::mc {Cancel}] \ -command "ARCancel $varname" -state disabled] ttk::button $f.filter -text [msgcat::mc {Filter}] \ -command [list CATTable $varname] ttk::button $f.clear -text [msgcat::mc {Clear}] \ -command [list CATOff $varname] set var(samp) [ttk::button $f.samp \ -text [msgcat::mc {SAMP}] \ -command "SAMPSendTableLoadVotable {} $varname"] ttk::button $f.plot -text [msgcat::mc {Plot}] \ -command [list CATPlot $varname] ttk::button $f.close -text [msgcat::mc {Close}] \ -command [list CATDestroy $varname] pack $f.apply $f.cancel $f.filter $f.clear $f.samp $f.plot $f.close \ -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.stbl -orient horizontal ttk::separator $w.sstatus -orient horizontal pack $w.buttons $w.sstatus $w.status $w.stbl -side bottom -fill x pack $w.cat $w.obj $w.param -side top -fill x pack $w.tbl -side top -fill both -expand true # needs to go after sort menu button is defined CATSortMenu $varname CATColsMenu $varname CATColsUpdate $varname switch $var(format) { cds {$mb entryconfig [msgcat::mc {Catalog Server}] -state normal} cxc - ned - skybot - sdss - simbad { $mb entryconfig [msgcat::mc {Catalog Server}] -state disabled } } ARCoord $varname CATUpdate $varname CATDialogUpdate $varname ARStatus $varname {} switch -- $action { apply {CATApply $varname 0} sync {CATApply $varname 1} none {} } # return the actual varname return $varname } proc CATDialogUpdate {varname} { upvar #0 $varname var global $varname global ds9 global samp global debug if {$debug(tcl,cat)} { puts stderr "CATDialogUpdate $varname" } # do we have a db? if {[CATValidDB $var(tbldb)]} { $var(mb).file entryconfig [msgcat::mc {Filter}] -state normal $var(mb).file entryconfig [msgcat::mc {Clear}] -state normal $var(mb).file entryconfig [msgcat::mc {Plot}] -state normal $var(mb).file entryconfig "[msgcat::mc {Display Header}]..." \ -state normal $var(mb).file entryconfig [msgcat::mc {Copy to Regions}] -state normal $var(mb).file entryconfig "[msgcat::mc {Print}]..." -state normal $var(top).buttons.filter configure -state normal $var(top).buttons.clear configure -state normal $var(top).buttons.plot configure -state normal } else { $var(mb).file entryconfig [msgcat::mc {Filter}] -state disabled $var(mb).file entryconfig [msgcat::mc {Clear}] -state disabled $var(mb).file entryconfig [msgcat::mc {Plot}] -state disabled $var(mb).file entryconfig "[msgcat::mc {Display Header}]..." \ -state disabled $var(mb).file entryconfig [msgcat::mc {Copy to Regions}] -stat disabled $var(mb).file entryconfig "[msgcat::mc {Print}]..." -state disabled $var(top).buttons.filter configure -state disabled $var(top).buttons.clear configure -state disabled $var(top).buttons.plot configure -state disabled } set m $var(mb).file.samp set ss [expr $ds9(menu,start)+2] if {[info exists samp]} { # menu $m entryconfig [msgcat::mc {Send}] -state normal $m entryconfig [msgcat::mc {Connect}] -state disabled $m entryconfig [msgcat::mc {Disconnect}] -state normal if {[$m.send index end] >= $ss} { $m.send delete $ss end } foreach args $samp(apps,votable) { foreach {id name} $args { $m.send add command -label $name \ -command "SAMPSendTableLoadVotable $id $varname" } } # button $var(samp) configure -state normal } else { # menu $m entryconfig [msgcat::mc {Send}] -state disabled $m entryconfig [msgcat::mc {Connect}] -state normal $m entryconfig [msgcat::mc {Disconnect}] -state disabled # button $var(samp) configure -state disabled } } proc CATAck {varname} { upvar #0 $varname var global $varname switch $var(format) { cds {CATCDSAck $varname} cxc {CATCXCAck $varname} ned {CATNEDAck $varname} skybot {CATSkyBotAck $varname} sdss {CATSDSSAck $varname} simbad {CATSIMBADAck $varname} } } proc CATApply {varname sync} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATApply $varname $sync" } if {$var(catalog) == {}} { Error [msgcat::mc {No Catalog specified}] return } set var(sync) $sync ARApply $varname if {$var(name) != {}} { set var(sky) fk5 CoordMenuButtonCmd $varname system sky {} CATWCSMenuUpdate $varname NSVRServer $varname } else { CATServer $varname } } proc CATCopy {varname} { upvar #0 $varname var global $varname set w [focus -displayof $var(top)] if {$w == $var(tbl)} { CATCopyTable $varname } else { EntryCopy $var(top) } } proc CATCopyTable {varname} { upvar #0 $varname var global $varname set w [focus -displayof $var(top)] set sel [$var(tbl) curselection] set data {} set row [lindex [split [lindex $sel 0] ,] 0] foreach ss $sel { set rr [lindex [split $ss ,] 0] if {$rr != $row} { append data "\n" set row $rr } else { if {$data != {}} { append data "\t" } } append data "[$var(tbl) get $ss]" } append data "\n" clipboard clear -displayof $w clipboard append -displayof $w $data } proc CATCut {varname} { upvar #0 $varname var global $varname set w [focus -displayof $var(top)] if {$w == $var(tbl)} { CATCopyTable $varname } else { EntryCut $var(top) } } proc CATCrosshair {varname} { upvar #0 $varname var global $varname if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } if {[$var(frame) has wcs equatorial $var(system)]} { set coord [$var(frame) get crosshair \ $var(system) $var(sky) $var(skyformat)] set var(x) [lindex $coord 0] set var(y) [lindex $coord 1] set var(name) {} } } proc CATDestroy {varname} { upvar #0 $varname var global $varname global $var(catdb) global $var(tbldb) global $var(symdb) global $var(symdl) global icat global debug if {$debug(tcl,cat)} { puts stderr "CATDestroy $varname" } # stop timer if needed if {$var(blink)} { set var(blink) 0 after cancel [list CATSelectTimer $varname] } # frame may have been deleted if {[info commands $var(frame)] != {}} { # unhighlite any makers if {[$var(frame) has fits]} { $var(frame) marker catalog $varname unhighlite } } upvar #0 $var(symdl) svar if {[info exists svar(top)]} { if {[winfo exists $svar(top)]} { CATSymDestroy $var(symdl) } } if {[info exists $var(symdb)]} { unset $var(symdb) } if {[info exists $var(tbldb)]} { unset $var(tbldb) } if {[info exists $var(catdb)]} { unset $var(catdb) } set i [lsearch $icat(cats) $varname] if {$i>=0} { set icat(cats) [lreplace $icat(cats) $i $i] } # plot window? if {$var(plot)} { PlotDestroy $var(plot,var) } ARDestroy $varname } proc CATEdit {varname} { upvar #0 $varname var global $varname global $var(tbldb) if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } $var(frame) marker catalog unselect all $var(frame) marker catalog unhighlite all CATGenerate $varname # regenerate the plot if needed if {$var(plot)} { CATPlotGenerate $varname } if {$var(edit)} { $var(tbl) configure \ -state normal \ -selectmode single } else { $var(tbl) configure \ -state disabled \ -selectmode extended } } proc CATGetHeader {varname} { upvar #0 $varname var global $varname global $var(tbldb) set t $var(tbldb) upvar #0 $t T if {[CATValidDB $var(tbldb)]} { set hdr {} # header set nl [expr $T(HLines)-2] for {set ll 1} {$ll <= $nl} {incr ll} { append hdr "$T(H_$ll)\n" } append hdr "\n" # dump cols stats set nc $T(Ncols) for {set cc 1} {$cc <= $nc} {incr cc} { append hdr "# name=[lindex $T(Header) [expr $cc-1]] " if {[info exists ${t}(DataType)]} { append hdr "datatype=[lindex $T(DataType) [expr $cc-1]] " } if {[info exists ${t}(Id)]} { if {[lindex $T(Id) [expr $cc-1]] != {}} { append hdr "id=[lindex $T(Id) [expr $cc-1]] " } } if {[info exists ${t}(ArraySize)]} { if {[lindex $T(ArraySize) [expr $cc-1]] != {}} { append hdr "arraysize=[lindex $T(ArraySize) [expr $cc-1]] " } } if {[info exists ${t}(Width)]} { if {[lindex $T(Width) [expr $cc-1]] != {}} { append hdr "width=[lindex $T(Width) [expr $cc-1]] " } } if {[info exists ${t}(Precision)]} { if {[lindex $T(Precision) [expr $cc-1]] != {}} { append hdr "precision=[lindex $T(Precision) [expr $cc-1]] " } } if {[info exists ${t}(Unit)]} { if {[lindex $T(Unit) [expr $cc-1]] != {}} { append hdr "unit=[lindex $T(Unit) [expr $cc-1]] " } } if {[info exists ${t}(Ref)]} { if {[lindex $T(Ref) [expr $cc-1]] != {}} { append hdr "ref=[lindex $T(Ref) [expr $cc-1]] " } } if {[info exists ${t}(Ucd)]} { if {[lindex $T(Ucd) [expr $cc-1]] != {}} { append hdr "ucd=[lindex $T(Ucd) [expr $cc-1]] " } } if {[info exists ${t}(Description)]} { if {[lindex $T(Description) [expr $cc-1]] != {}} { append hdr "[lindex $T(Description) [expr $cc-1]] " } } append hdr "\n" } return $hdr } return {} } proc CATHeader {varname} { upvar #0 $varname var global $varname global $var(tbldb) SimpleTextDialog ${varname}hdr "$var(title) [msgcat::mc {Header}]" \ 80 20 insert top [CATGetHeader $varname] } proc CATKey {which key} { global icat global ds9 set icat(key) $key set icat(key,update) {} $which marker catalog key foreach rr $icat(key,update) { eval "CATGenerateUpdate [lindex $rr 0] [lindex $rr 1]" } set icat(key) {} set icat(key,update) {} } proc CATPageSetup {varname} { upvar #0 $varname var global $varname global ds9 switch $ds9(wm) { x11 - aqua {} win32 {win32 pm pagesetup} } } proc CATPrint {varname} { upvar #0 $varname var global $varname global $var(tbldb) global ds9 switch $ds9(wm) { x11 - aqua {CATPSPrint $varname} win32 {win32 pm print text [::textutil::tabify::untabify2 [starbase_write_ $var(tbldb)] 12]} } } proc CATPSPrint {varname} { upvar #0 $varname var global $varname if {[PRPrintDialog]} { if {[catch {CATPostScript $varname} printError]} { Error "[msgcat::mc {An error has occurred while printing}] $printError" } } } proc CATPostScript {varname} { upvar #0 $varname var global $varname global $var(tbldb) global ps if {$ps(dest) == "file"} { set ch [open "| cat > $ps(filename,txt)" w] } else { set ch [open "| $ps(cmd)" w] } starbase_writefp $var(tbldb) $ch close $ch } proc CATServer {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATServer $varname" } if {($var(x) != {}) && ($var(y) != {}) && ($var(width) != {}) && ($var(height) != {})} { ARStatus $varname "Searching [string range $var(title) 0 50]" switch $var(format) { cds {CATCDS $varname} cxc {CATCXC $varname} ned {CATNED $varname} skybot {CATSkyBot $varname} sdss {CATSDSS $varname} simbad {CATSIMBAD $varname} } } else { ARStatus $varname [msgcat::mc {Please specify width, height, and either name or (ra,dec)}] $var(mb).file entryconfig [msgcat::mc {Retrieve}] -state normal $var(mb).file entryconfig [msgcat::mc {Cancel}] -state disabled $var(apply) configure -state normal $var(cancel) configure -state disabled } } proc CATUpdate {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATUpdate $varname" } if {[info commands $var(frame)] == {}} { return } if {![$var(frame) has fits]} { return } if {[$var(frame) has wcs equatorial $var(system)]} { set coord [$var(frame) get fits center \ $var(system) $var(sky) $var(skyformat)] set var(x) [lindex $coord 0] set var(y) [lindex $coord 1] set size [$var(frame) get fits size \ $var(system) $var(sky) $var(rformat)] set var(width) [lindex $size 0] set var(height) [lindex $size 1] set var(name) {} } } proc CATWCSMenuUpdate {varname} { upvar #0 $varname var global $varname ARCoord $varname set var(psystem) $var(system) set var(psky) $var(sky) CoordMenuButtonCmd $varname psystem psky {} CATColsUpdate $varname } proc CATColsUpdate {varname} { upvar #0 $varname var global $varname global ds9 global pds9 switch $var(psystem) { image - physical - detector - amplifier { $var(raname) configure -text {X} \ -font [font actual TkDefaultFont] $var(decname) configure -text {Y} \ -font [font actual TkDefaultFont] } default { if {[$var(frame) has wcs equatorial $var(psystem)]} { switch $var(psky) { fk4 - fk5 - icrs { $var(raname) configure -text "\u03b1" \ -font "$ds9(times) $pds9(font,size)" $var(decname) configure -text "\u03b4" \ -font "$ds9(times) $pds9(font,size)" } galactic { $var(raname) configure -text {l} \ -font "{$ds9(times)} $pds9(font,size) normal italic" $var(decname) configure -text {b} \ -font "{$ds9(times)} $pds9(font,size) normal italic" } ecliptic { $var(raname) configure -text "\u03bb" \ -font "$ds9(times) $pds9(font,size)" $var(decname) configure -text "\u03b2" \ -font "$ds9(times) $pds9(font,size)" } } } else { $var(raname) configure -text {X} \ -font [font actual TkDefaultFont] $var(decname) configure -text {Y} \ -font [font actual TkDefaultFont] } } } } # Edit Dialog proc CATEditDialog {varname which db} { upvar #0 $varname var global $varname global ds9 global ed set w ".${varname}edit" set mb ".${varname}editmb" set ed(ok) 0 set ed(text) $w.param.txt DialogCreate $w [msgcat::mc {Edit}] ed(ok) $w configure -menu $mb menu $mb # file $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command {set ed(ok) 1} $mb.file add command -label [msgcat::mc {Clear}] \ -command CATEditClear $mb.file add separator $mb.file add command -label "[msgcat::mc {Load}]..." \ -command CATEditLoad $mb.file add command -label "[msgcat::mc {Save}]..." \ -command CATEditSave $mb.file add separator $mb.file add command -label [msgcat::mc {Cancel}] \ -command {set ed(ok) 0} # edit $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.edit $mb.edit add command -label [msgcat::mc {Undo}] \ -command "$ed(text) edit undo" -accelerator "${ds9(ctrl)}Z" $mb.edit add command -label [msgcat::mc {Redo}] \ -command "$ed(text) edit redo" -accelerator "${ds9(shiftctrl)}Z" $mb.edit add separator $mb.edit add command -label [msgcat::mc {Cut}] \ -command "tk_textCut $ed(text)" -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command "tk_textCopy $ed(text)" -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -command "tk_textPaste $ed(text)" -accelerator "${ds9(ctrl)}V" global $db # column $mb add cascade -label [msgcat::mc {Column}] -menu $mb.col if {[info exists $mb.col]} { destroy $mb.col } menu $mb.col if {[CATValidDB $db]} { set cnt -1 foreach col [starbase_columns $db] { $mb.col add command -label "$col" \ -command "$ed(text) insert insert \{\$$col\}" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $mb.col entryconfig $col -columnbreak 1 } } } # operator $mb add cascade -label [msgcat::mc {Operator}] -menu $mb.op menu $mb.op $mb.op add command -label {-} \ -command "$ed(text) insert insert {-}" $mb.op add command -label {!} \ -command "$ed(text) insert insert {!}" $mb.op add command -label {(} \ -command "$ed(text) insert insert {(}" $mb.op add command -label {)} \ -command "$ed(text) insert insert {)}" $mb.op add separator $mb.op add command -label {*} \ -command "$ed(text) insert insert {*}" $mb.op add command -label {/} \ -command "$ed(text) insert insert {/}" $mb.op add command -label {%} \ -command "$ed(text) insert insert {%}" $mb.op add command -label {+} \ -command "$ed(text) insert insert {+}" $mb.op add command -label {-} \ -command "$ed(text) insert insert {-}" $mb.op add separator $mb.op add command -label {<} \ -command "$ed(text) insert insert {<}" $mb.op add command -label {>} \ -command "$ed(text) insert insert {>}" $mb.op add command -label {<=} \ -command "$ed(text) insert insert {<=}" $mb.op add command -label {>=} \ -command "$ed(text) insert insert {>=}" $mb.op add command -label {==} \ -command "$ed(text) insert insert {==}" $mb.op add command -label {!=} \ -command "$ed(text) insert insert {!=}" $mb.op add separator $mb.op add command -label {&&} \ -command "$ed(text) insert insert {&&}" $mb.op add command -label {||} \ -command "$ed(text) insert insert {||}" # operator $mb add cascade -label [msgcat::mc {Math Function}] -menu $mb.math menu $mb.math $mb.math add command -label {acos} \ -command "$ed(text) insert insert {acos()}" $mb.math add command -label {asin} \ -command "$ed(text) insert insert {asin()}" $mb.math add command -label {atan} \ -command "$ed(text) insert insert {atan()}" $mb.math add command -label {atan2} \ -command "$ed(text) insert insert {atan2(,)}" $mb.math add command -label {ceil} \ -command "$ed(text) insert insert {ceil()}" $mb.math add command -label {cos} \ -command "$ed(text) insert insert {cos()}" $mb.math add command -label {cosh} \ -command "$ed(text) insert insert {cosh()}" $mb.math add command -label {exp} \ -command "$ed(text) insert insert {exp()}" $mb.math add command -label {floor} \ -command "$ed(text) insert insert {floor()}" $mb.math add command -label {fmod} \ -command "$ed(text) insert insert {fmod(,)}" $mb.math add command -label {hypot} \ -command "$ed(text) insert insert {hypot(,)}" $mb.math add command -label {log} \ -command "$ed(text) insert insert {log()}" $mb.math add command -label {log10} \ -command "$ed(text) insert insert {log10()}" $mb.math add command -label {pow} \ -command "$ed(text) insert insert {pow(,)}" $mb.math add command -label {sin} \ -command "$ed(text) insert insert {sin()}" $mb.math add command -label {sinh} \ -command "$ed(text) insert insert {sinh()}" $mb.math add command -label {sqrt} \ -command "$ed(text) insert insert {sqrt()}" $mb.math add command -label {tan} \ -command "$ed(text) insert insert {tan()}" $mb.math add command -label {tanh} \ -command "$ed(text) insert insert {tanh()}" $mb.math add command -label {abs} \ -command "$ed(text) insert insert {abs()}" $mb.math add command -label {double} \ -command "$ed(text) insert insert {double()}" $mb.math add command -label {int} \ -command "$ed(text) insert insert {int()}" $mb.math add command -label {round} \ -command "$ed(text) insert insert {round()}" # Text set f [ttk::frame $w.param] text $f.txt \ -height 10 \ -width 60 \ -yscrollcommand "$f.yscroll set" \ -xscrollcommand "$f.xscroll set" \ -undo true \ -wrap none ttk::scrollbar $f.yscroll -command [list $ed(text) yview] \ -orient vertical ttk::scrollbar $f.xscroll -command [list $ed(text) xview] \ -orient horizontal grid $ed(text) $f.yscroll -sticky news grid $f.xscroll -stick news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.clear -text [msgcat::mc {Clear}] -command CATEditClear ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.clear $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.param -side top -fill both -expand true pack $w.buttons $w.sep -side bottom -fill x $ed(text) insert end $var($which) $ed(text) see end DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok if {$ed(ok)} { set flt [$ed(text) get 1.0 end] catch {regsub {\n} $flt " " flt} set var($which) [string trim $flt] } DialogDismiss $w destroy $mb set rr $ed(ok) unset ed return $rr } proc CATEditClear {} { global ed $ed(text) delete 1.0 end } proc CATEditSave {} { global ed set fn [SaveFileDialog catfltfbox] if {$fn != {}} { if {[catch {open $fn w} fp]} { Error "[msgcat::mc {Unable to open file}] $fn: $fp" return } set flt [$ed(text) get 1.0 end] catch {regsub {\n} $flt " " flt} puts $fp [string trim $flt] catch {close $fp} } } proc CATEditLoad {} { global ed set fn [OpenFileDialog catfltfbox] if {$fn != {}} { if {[catch {open $fn r} fp]} { Error "[msgcat::mc {Unable to open file}] $fn: $fp" return } $ed(text) delete 1.0 end $ed(text) insert end [read -nonewline $fp] $ed(text) see end catch {close $fp} } } proc UpdateCATDialog {} { global icat foreach varname $icat(cats) { CATDialogUpdate $varname } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catflt.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000006010 12611726635 016516� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATFltSort {varname} { upvar #0 $varname var global $varname global $var(catdb) global $var(tbldb) upvar #0 $var(catdb) catsrc upvar #0 $var(tbldb) catdest # create header set catdest(Header) $catsrc(Header) starbase_colmap catdest set catdest(Ndshs) [llength $catdest(Header)] set catdest(Nrows) 0 set catdest(HLines) $catsrc(HLines) set catdest(Dashes) $catsrc(Dashes) # optional if {[info exists catsrc(DataType)]} { set catdest(DataType) $catsrc(DataType) } if {[info exists catsrc(Id)]} { set catdest(Id) $catsrc(Id) } if {[info exists catsrc(ArraySize)]} { set catdest(ArraySize) $catsrc(ArraySize) } if {[info exists catsrc(Width)]} { set catdest(Width) $catsrc(Width) } if {[info exists catsrc(Precision)]} { set catdest(Precision) $catsrc(Precision) } if {[info exists catsrc(Unit)]} { set catdest(Unit) $catsrc(Unit) } if {[info exists catsrc(Ref)]} { set catdest(Ref) $catsrc(Ref) } if {[info exists catsrc(Ucd)]} { set catdest(Ucd) $catsrc(Ucd) } if {[info exists catsrc(Description)]} { set catdest(Description) $catsrc(Description) } for {set ii 1} {$ii<=$catsrc(HLines)} {incr ii} { set catdest(H_$ii) $catsrc(H_$ii) } for {set jj 1} {$jj<=$catsrc(Ncols)} {incr jj} { set catdest(0,$jj) $catsrc(0,$jj) } # sort? set order {} if {$var(sort) != {}} { set col $catsrc($var(sort)) for {set ii 1} {$ii<=$catsrc(Nrows)} {incr ii} { set val $catsrc($ii,$col) # if blank, set to 0 if {$val == {}} { set val 0 } lappend order "[list $ii $val]" } # first try as real, if error, then ascii if {[catch {lsort $var(sort,dir) -real -index 1 $order} oo]} { set oo [lsort $var(sort,dir) -ascii -index 1 $order] } set order $oo } else { for {set ii 1} {$ii<=$catsrc(Nrows)} {incr ii} { lappend order "[list $ii {}]" } } # data set kk 0 for {set ii 1} {$ii<=$catsrc(Nrows)} {incr ii} { set id [lindex [lindex $order [expr $ii-1]] 0] # now filter set pass 1 if {$var(filter) != {}} { # eval all colnames foreach col $catsrc(Header) { set col [string trim $col] set val $catsrc($id,$catsrc($col)) # here's a tough one-- # what to do if the column is blank # for now, just set it to '0' if {[string trim "$val"] == {}} { set val 0 } eval "set \{$col\} \{$val\}" } # subst any columv vars if {[catch {subst $var(filter)} ff]} { return 0 } # evaluate filter if {[catch {expr $ff} result]} { return 0 } # do we keep the row? if {!$result} { set pass 0 } } if {$pass} { incr kk for {set jj 1} {$jj<=$catsrc(Ncols)} {incr jj} { set catdest($kk,$jj) $catsrc($id,$jj) } } } # success set catdest(Nrows) $kk return 1 } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catmatch.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000041141 12464211202 017012� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATMatchFrame {} { global icat global current # find all cats for frame set cats {} foreach varname $icat(cats) { upvar #0 $varname var global $varname if {$var(frame) == $current(frame)} { lappend cats $varname } } if {[llength $cats] < 2} { Warning [msgcat::mc {At least 2 different catalogs are required}] return } if {[CATMatchDialog $cats]} { if {$icat(match1) != {} && $icat(match2) != {} && $icat(match1) != $icat(match2)} { CATMatch $current(frame) $icat(match1) $icat(match2) } else { Warning [msgcat::mc {At least 2 different catalogs are required}] } } } proc CATMatchDialog {cats} { global ds9 global ed global icat set w {.catmat} set mb {.catmatmb} set ed(top) $w set ed(mb) $mb set ed(ok) 0 set ed(match1) [lindex $cats 0] set varname $ed(match1) upvar #0 $varname var global $varname set ed(match1,msg) $var(title) set ed(match2) [lindex $cats 1] set varname $ed(match2) upvar #0 $varname var global $varname set ed(match2,msg) $var(title) set ed(error) $icat(error) set ed(rformat) $icat(eformat) set ed(function) $icat(function) set ed(unique) $icat(unique) set ed(return) $icat(return) DialogCreate $w [msgcat::mc {Match}] ed(ok) $w configure -menu $mb menu $mb # file $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command {set ed(ok) 1} $mb.file add command -label [msgcat::mc {Cancel}] -command {set ed(ok) 0} # edit $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit EditMenu $mb ed # param set f [ttk::frame $w.param] ttk::label $f.tmatch -text [msgcat::mc {Match}] ttk::menubutton $f.match1 -textvariable ed(match1,msg) -menu $f.match1.menu ttk::label $f.tand -text [msgcat::mc {and}] ttk::menubutton $f.match2 -textvariable ed(match2,msg) -menu $f.match2.menu CATMatchDialogCatsMenu $f match1 $cats CATMatchDialogCatsMenu $f match2 $cats ttk::label $f.terror -text [msgcat::mc {Error}] ttk::entry $f.error -textvariable ed(error) -width 14 ARRFormat $f.eformat ed ttk::label $f.tfunction -text [msgcat::mc {Function}] ttk::menubutton $f.function -textvariable ed(function,msg) \ -menu $f.function.menu menu $f.function.menu -tearoff 0 $f.function.menu add radiobutton -variable ed(function) \ -label "1 [msgcat::mc {and}] 2" \ -value 1and2 -command [list CATMatchDialogFunctionMenu $f] $f.function.menu add radiobutton -variable ed(function) \ -label "1 [msgcat::mc {not}] 2" \ -value 1not2 -command [list CATMatchDialogFunctionMenu $f] $f.function.menu add radiobutton -variable ed(function) \ -label "2 [msgcat::mc {not}] 1" \ -value 2not1 -command [list CATMatchDialogFunctionMenu $f] ttk::checkbutton $f.unique -text [msgcat::mc {Unique}] -variable ed(unique) ttk::label $f.treturn -text [msgcat::mc {Return}] ttk::menubutton $f.return -textvariable ed(return,msg) \ -menu $f.return.menu menu $f.return.menu -tearoff 0 $f.return.menu add radiobutton -variable ed(return) \ -label "1 [msgcat::mc {and}] 2" \ -value 1and2 -command [list CATMatchDialogReturnMenu $f] $f.return.menu add radiobutton -variable ed(return) \ -label "1 [msgcat::mc {only}]" \ -value 1only -command [list CATMatchDialogReturnMenu $f] $f.return.menu add radiobutton -variable ed(return) \ -label "2 [msgcat::mc {only}]" \ -value 2only -command [list CATMatchDialogReturnMenu $f] grid $f.tmatch $f.match1 $f.tand $f.match2 -padx 2 -pady 2 -sticky ew grid $f.terror $f.error x $f.eformat -padx 2 -pady 2 -sticky w grid $f.tfunction $f.function x $f.unique -padx 2 -pady 2 -sticky ew grid $f.treturn $f.return -padx 2 -pady 2 -sticky ew # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.param -side top -fill both -expand true pack $w.buttons $w.sep -side bottom -fill x CATMatchDialogFunctionMenu $w.param CATMatchDialogReturnMenu $w.param DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok if {$ed(ok)} { set icat(match1) $ed(match1) set icat(match2) $ed(match2) set icat(error) $ed(error) set icat(eformat) $ed(rformat) set icat(function) $ed(function) set icat(unique) $ed(unique) set icat(return) $ed(return) } DialogDismiss $w destroy $mb set rr $ed(ok) unset ed return $rr } proc CATMatchDialogFunctionMenu {f} { global ed switch $ed(function) { 1and2 { $f.unique configure -state normal $f.return configure -state normal set ed(function,msg) "1 [msgcat::mc {and}] 2" } 1not2 { $f.unique configure -state disabled $f.return configure -state disabled set ed(function,msg) "1 [msgcat::mc {not}] 2" } 2not1 { $f.unique configure -state disabled $f.return configure -state disabled set ed(function,msg) "2 [msgcat::mc {not}] 1" } } } proc CATMatchDialogReturnMenu {f} { global ed switch $ed(return) { 1and2 { set ed(return,msg) "1 [msgcat::mc {and}] 2" } 1only { set ed(return,msg) "1 [msgcat::mc {only}]" } 2only { set ed(return,msg) "2 [msgcat::mc {only}]" } } } proc CATMatchDialogCatsMenu {f which cats} { global ed set m $f.$which.menu menu $m -tearoff 0 foreach varname $cats { upvar #0 $varname var global $varname $m add radiobutton -variable ed($which) -label $var(title) \ -value $varname -command [list set ed($which,msg) $var(title)] } } proc CATMatch {frame varname1 varname2} { global icat global debug if {$debug(tcl,cat)} { puts stderr "CATMatch $frame $varname1 $varname2" } upvar #0 $varname1 var1 global $varname1 global $var1(tbldb) set t1 $var1(tbldb) upvar #0 $t1 T1 upvar #0 $varname2 var2 global $varname2 global $var2(tbldb) set t2 $var2(tbldb) upvar #0 $t2 T2 if {![CATValidDB $var1(tbldb)] || ![CATValidDB $var2(tbldb)]} { return } if {$T1(Nrows)==0 || $T2(Nrows)==0} { Warning [msgcat::mc {Match Catalog requires at least 1 row per catalog}] return } # cat1 set nrows1 [starbase_nrows $var1(tbldb)] set cols1 [starbase_columns $var1(tbldb)] set colx1 [starbase_colnum $var1(tbldb) $var1(colx)] set coly1 [starbase_colnum $var1(tbldb) $var1(coly)] set nrows2 [starbase_nrows $var2(tbldb)] set cols2 [starbase_columns $var2(tbldb)] set colx2 [starbase_colnum $var2(tbldb) $var2(colx)] set coly2 [starbase_colnum $var2(tbldb) $var2(coly)] global xx1 yy1 global xx2 yy2 global rr set xx1 {} set yy1 {} set xx2 {} set yy2 {} set rr {} for {set ii 1} {$ii <= $nrows1} {incr ii} { lappend xx1 [starbase_get $var1(tbldb) $ii $colx1] lappend yy1 [starbase_get $var1(tbldb) $ii $coly1] } for {set jj 1} {$jj <= $nrows2} {incr jj} { lappend xx2 [starbase_get $var2(tbldb) $jj $colx2] lappend yy2 [starbase_get $var2(tbldb) $jj $coly2] } global current $current(frame) match xx1 yy1 $var1(system) $var1(sky) \ xx2 yy2 $var2(system) $var2(sky) \ $icat(error) $var1(system) $icat(eformat) rr switch $icat(function) { 1and2 { if {$icat(unique)} { set aa [lsort -index 0 -integer -unique $rr] set rr [lsort -index 1 -integer -unique $aa] } else { set rr [lsort -index 0 -integer $rr] } } 1not2 {} 2not1 {} } if {[llength $rr] == 0} { Info [msgcat::mc {No Items Found}] return } switch $icat(function) { 1and2 { switch $icat(return) { 1and2 {CATMatchAnd1and2 $varname1 $varname2 rr} 1only {CATMatchAnd1only $varname1 $varname2 rr} 2only {CATMatchAnd2only $varname1 $varname2 rr} } } 1not2 {CATMatchNot $varname1 $varname2 rr} 2not1 {CATMatchNot $varname2 $varname1 rr} } } proc CATMatchAnd1and2 {varname1 varname2 rrname} { upvar $rrname rr upvar #0 $varname1 var1 global $varname1 global $var1(tbldb) set t1 $var1(tbldb) upvar #0 $t1 T1 upvar #0 $varname2 var2 global $varname2 global $var2(tbldb) set t2 $var2(tbldb) upvar #0 $t2 T2 set varname [CATDialog catmatch {} {} {} none] upvar #0 $varname var global $varname global $var(catdb) set db $var(catdb) upvar #0 $db T ARStatus $varname [msgcat::mc {Loading Catalog}] CATOff $varname CATSet $varname {} "$var1(catalog) and $var2(catalog)" \ "$var1(title) and $var2(title)" set var(name) {} set var(x) {} set var(y) {} set var(width) {} set var(height) {} # required set T(Header) $T1(Header) foreach ll $T2(Header) { # make cols unique lappend T(Header) "2_$ll" } set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(Header) {-}] set T(Ndshs) [expr $T1(Ndshs)+$T2(Ndshs)] set T(H_1) $T(Header) set T(H_2) $T(Dashes) set T(HLines) 2 set T(Nrows) 0 starbase_colmap T # optional if {[info exists ${t1}(DataType)]} { set T(DataType) $T1(DataType) if {[info exists ${t2}(DataType)]} { append T(DataType) " $T2(DataType)" } } if {[info exists ${t1}(Id)]} { set T(Id) $T1(Id) if {[info exists ${t2}(Id)]} { append T(Id) " $T2(Id)" } } if {[info exists ${t1}(ArraySize)]} { set T(ArraySize) $T1(ArraySize) if {[info exists ${t2}(ArraySize)]} { append T(ArraySize) " $T2(ArraySize)" } } if {[info exists ${t1}(Width)]} { set T(Width) $T1(Width) if {[info exists ${t2}(Width)]} { append T(Width) " $T2(Width)" } } if {[info exists ${t1}(Precision)]} { set T(Precision) $T1(Precision) if {[info exists ${t2}(Precision)]} { append T(Precision) " $T2(Precision)" } } if {[info exists ${t1}(Unit)]} { set T(Unit) "$T1(Unit) " if {[info exists ${t2}(Unit)]} { append T(Unit) " $T2(Unit)" } } if {[info exists ${t1}(Ref)]} { set T(Ref) $T1(Ref) if {[info exists ${t2}(Ref)]} { append T(Ref) " $T2(Ref)" } } if {[info exists ${t1}(Ucd)]} { set T(Ucd) $T1(Ucd) if {[info exists ${t2}(Ucd)]} { append T(Ucd) " $T2(Ucd)" } } if {[info exists ${t1}(Description)]} { set T(Description) $T1(Description) if {[info exists ${t2}(Description)]} { append T(Description) " $T2(Description)" } } set ll 0 foreach {r1 r2} [join $rr] { incr ll for {set ii 1} {$ii<=$T1(Ncols)} {incr ii} { set T($ll,$ii) $T1($r1,$ii) } for {set jj 1} {$jj<=$T2(Ncols)} {incr jj} { set T($ll,[expr $ii+$jj-1]) $T2($r2,$jj) } incr T(Nrows) } ARDone $varname CATLoadDone $varname } proc CATMatchAnd1only {varname1 varname2 rrname} { upvar $rrname rr upvar #0 $varname1 var1 global $varname1 global $var1(tbldb) set t1 $var1(tbldb) upvar #0 $t1 T1 upvar #0 $varname2 var2 global $varname2 global $var2(tbldb) set t2 $var2(tbldb) upvar #0 $t2 T2 set varname [CATDialog catmatch {} {} {} none] upvar #0 $varname var global $varname global $var(catdb) set db $var(catdb) upvar #0 $db T ARStatus $varname [msgcat::mc {Loading Catalog}] CATOff $varname CATSet $varname {} "$var1(catalog) and $var2(catalog)" \ "$var1(title) and $var2(title)" set var(name) {} set var(x) {} set var(y) {} set var(width) {} set var(height) {} # required set T(Header) $T1(Header) set T(Dashes) $T1(Dashes) set T(Ndshs) $T1(Ndshs) set T(HLines) $T1(HLines) for {set ii 1} {$ii<=$T1(HLines)} {incr ii} { set T(H_$ii) $T1(H_$ii) } set T(Nrows) 0 starbase_colmap T # optional if {[info exists ${t1}(DataType)]} { set T(DataType) $T1(DataType) } if {[info exists ${t1}(Id)]} { set T(Id) $T1(Id) } if {[info exists ${t1}(ArraySize)]} { set T(ArraySize) $T1(ArraySize) } if {[info exists ${t1}(Width)]} { set T(Width) $T1(Width) } if {[info exists ${t1}(Precision)]} { set T(Precision) $T1(Precision) } if {[info exists ${t1}(Unit)]} { set T(Unit) $T1(Unit) } if {[info exists ${t1}(Ref)]} { set T(Ref) $T1(Ref) } if {[info exists ${t1}(Ucd)]} { set T(Ucd) $T1(Ucd) } if {[info exists ${t1}(Description)]} { set T(Description) $T1(Description) } set ll 0 foreach {r1 r2} [join $rr] { incr ll for {set ii 1} {$ii<=$T1(Ncols)} {incr ii} { set T($ll,$ii) $T1($r1,$ii) } incr T(Nrows) } ARDone $varname CATLoadDone $varname } proc CATMatchAnd2only {varname1 varname2 rrname} { upvar $rrname rr upvar #0 $varname1 var1 global $varname1 global $var1(tbldb) set t1 $var1(tbldb) upvar #0 $t1 T1 upvar #0 $varname2 var2 global $varname2 global $var2(tbldb) set t2 $var2(tbldb) upvar #0 $t2 T2 set varname [CATDialog catmatch {} {} {} none] upvar #0 $varname var global $varname global $var(catdb) set db $var(catdb) upvar #0 $db T ARStatus $varname [msgcat::mc {Loading Catalog}] CATOff $varname CATSet $varname {} "$var1(catalog) and $var2(catalog)" \ "$var1(title) and $var2(title)" set var(name) {} set var(x) {} set var(y) {} set var(width) {} set var(height) {} # required set T(Header) $T2(Header) set T(Dashes) $T2(Dashes) set T(Ndshs) $T2(Ndshs) set T(HLines) $T2(HLines) for {set ii 1} {$ii<=$T2(HLines)} {incr ii} { set T(H_$ii) $T2(H_$ii) } set T(Nrows) 0 starbase_colmap T # optional if {[info exists ${t2}(DataType)]} { set T(DataType) $T2(DataType) } if {[info exists ${t2}(Id)]} { set T(Id) $T2(Id) } if {[info exists ${t2}(ArraySize)]} { set T(ArraySize) $T2(ArraySize) } if {[info exists ${t2}(Width)]} { set T(Width) $T2(Width) } if {[info exists ${t2}(Precision)]} { set T(Precision) $T2(Precision) } if {[info exists ${t2}(Unit)]} { set T(Unit) $T2(Unit) } if {[info exists ${t2}(Ref)]} { set T(Ref) $T2(Ref) } if {[info exists ${t2}(Ucd)]} { set T(Ucd) $T2(Ucd) } if {[info exists ${t2}(Description)]} { set T(Description) $T2(Description) } set ll 0 foreach {r1 r2} [join $rr] { incr ll for {set ii 1} {$ii<=$T2(Ncols)} {incr ii} { set T($ll,$ii) $T2($r2,$ii) } incr T(Nrows) } ARDone $varname CATLoadDone $varname } proc CATMatchNot {varname1 varname2 rrname} { upvar $rrname rr upvar #0 $varname1 var1 global $varname1 global $var1(tbldb) set t1 $var1(tbldb) upvar #0 $t1 T1 upvar #0 $varname2 var2 global $varname2 global $var2(tbldb) set t2 $var2(tbldb) upvar #0 $t2 T2 set varname [CATDialog catmatch {} {} {} none] upvar #0 $varname var global $varname global $var(catdb) set db $var(catdb) upvar #0 $db T ARStatus $varname [msgcat::mc {Loading Catalog}] CATOff $varname CATSet $varname {} "$var1(catalog) and not $var2(catalog)" \ "$var1(title) and not $var2(title)" set var(name) {} set var(x) {} set var(y) {} set var(width) {} set var(height) {} # required set T(Header) $T1(Header) set T(Dashes) $T1(Dashes) set T(Ndshs) $T1(Ndshs) set T(HLines) $T1(HLines) for {set ii 1} {$ii<=$T1(HLines)} {incr ii} { set T(H_$ii) $T1(H_$ii) } set T(Nrows) 0 starbase_colmap T # optional if {[info exists ${t1}(DataType)]} { set T(DataType) $T1(DataType) } if {[info exists ${t1}(Id)]} { set T(Id) $T1(Id) } if {[info exists ${t1}(ArraySize)]} { set T(ArraySize) $T1(ArraySize) } if {[info exists ${t1}(Width)]} { set T(Width) $T1(Width) } if {[info exists ${t1}(Precision)]} { set T(Precision) $T1(Precision) } if {[info exists ${t1}(Unit)]} { set T(Unit) $T1(Unit) } if {[info exists ${t1}(Ref)]} { set T(Ref) $T1(Ref) } if {[info exists ${t1}(Ucd)]} { set T(Ucd) $T1(Ucd) } if {[info exists ${t1}(Description)]} { set T(Description) $T1(Description) } set ss {} foreach {r1 r2} [join $rr] { lappend ss $r1 } set ss [lsort -integer -unique $ss] set ll 0 for {set jj 1} {$jj<=$T1(Nrows)} {incr jj} { if {[lsearch -integer -sorted $ss $jj] == -1} { incr ll for {set ii 1} {$ii<=$T1(Ncols)} {incr ii} { set T($ll,$ii) $T1($jj,$ii) } incr T(Nrows) } } ARDone $varname CATLoadDone $varname } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catned.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000007447 12527716223 016514� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATNED {varname} { upvar #0 $varname var global $varname global pcat global debug if {$debug(tcl,cat)} { puts stderr "CATNED $varname" } # parser if {$pcat(vot)} { set var(proc,parser) CATVOTParse } else { set var(proc,reader) CATNEDReader } # query switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { switch -- $var(sky) { fk4 - fk5 - icrs {set xx [h2d [Sex2H $var(x)]]} galactic - ecliptic {set xx [Sex2D $var(x)]} } set yy [Sex2D $var(y)] } } switch -- $var(rformat) { degrees { set ww $var(width) set hh $var(height) } arcmin { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } arcsec { set ww [expr $var(width)/60./60.] set hh [expr $var(height)/60./60.] } } set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] if {$pcat(vot)} { set out "xml_main" } else { set out "ascii_tab" } switch -- $var(sky) { fk4 { set sky "Equatorial" set eq "B1950.0" } fk5 - icrs { set sky "Equatorial" set eq "J2000.0" } galactic { set sky "Galactic" set eq {} } ecliptic { set sky "Ecliptic" set eq {} } } switch -- $var(psky) { fk4 { set psky "Equatorial" set peq "B1950.0" } fk5 - icrs { set psky "Equatorial" set peq "J2000.0" } galactic { set psky "Galactic" set peq {} } ecliptic { set psky "Ecliptic" set peq {} } } # url set var(query) {} set query [http::formatQuery search_type "Near Position Search" RA $xx DEC $yy SR $rr of $out in_csys $sky in_equinox $eq out_csys $psky out_equinox $peq] set var(url) "http://ned.ipac.caltech.edu/cgi-bin/nph-objsearch?$query" if {$pcat(vot)} { CATLoad $varname } else { CATLoadIncr $varname } } proc CATNEDReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) 1 } 1 { # process header if {[gets $sock line] == -1} { set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) -1 return $result } set result [string length "$line"] # start of data? if {[string range $line 0 2] == {No.}} { # cols incr ${t}(HLines) set n $T(HLines) set T(H_$n) $line set T(Header) [split $T(H_$n) "\t"] # dashes set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 2 } } 2 { # process table if {[gets $sock line] == -1} { set T(state) 0 } else { set result [string length "$line"] set line [string trim $line] if {$line != {}} { # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line "\t"] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } } } } return $result } proc CATNEDAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for NED This research has made use of the NASA/IPAC Extragalactic Database (NED) which is operated by the Jet Propulsion Laboratory, California Institute of Technology, under contract with the National Aeronautics and Space Administration. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catopt.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000002316 12464211202 016521� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # sample CATKeyCB # Allow the user to define callbacks to be called when # the user presses a key with selected regions while in edit mode. if {0} { # add to CATReg # callback=key CATKeyCB {${varname}.\${ii}.a} proc CATKeyCB {tag id} { global icat global debug if {$debug(tcl,cat)} { puts stderr "CATKeyCB $tag $id" } set t [split $tag .] set varname [lindex $t 0] set row [lindex $t 1] set key [lindex $t 2] upvar #0 $varname var global $varname global $var(tbldb) if {![info exists ${varname}(top)]} { return } if {$icat(key) == $key} { switch -- $key { a { puts stderr "Key: $key $row" return # column name 'TooManySrcs' set tcol [starbase_colnum $var(tbldb) {TooManySrcs}] # toggle between '0' and '1' set tt [starbase_get $var(tbldb) $row $tcol] if {$tt == {1}} { starbase_set $var(tbldb) $row $tcol {0} } else { starbase_set $var(tbldb) $row $tcol {1} } lappend icat(key,update) [list $varname $row] } } } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catplot.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000013364 12532116754 016716� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATPlot {varname} { upvar #0 $varname var global $varname # do we have a db? if {![CATValidDB $var(tbldb)]} { return } if {$var(plot,x) == {}} { set var(plot,x) "\$$var(colx)" } if {$var(plot,y) == {}} { set var(plot,y) "\$$var(coly)" } if {[CATPlotDialog $varname]} { if {$var(plot,x) != {} && $var(plot,y) != {}} { CATPlotGenerate $varname } } } proc CATPlotGenerate {varname} { upvar #0 $varname var global $varname if {$var(plot,xerr) == {} && $var(plot,yerr) == {}} { set dim xy } elseif {$var(plot,xerr) != {} && $var(plot,yerr) == {}} { set dim xyex } elseif {$var(plot,xerr) == {} && $var(plot,yerr) != {}} { set dim xyey } else { set dim xyexey } global $var(tbldb) set nrows [starbase_nrows $var(tbldb)] set cols [starbase_columns $var(tbldb)] set rr {} for {set ii 1} {$ii <= $nrows} {incr ii} { foreach col $cols { set val [starbase_get $var(tbldb) $ii \ [starbase_colnum $var(tbldb) $col]] # here's a tough one-- what to do if the col is blank # for now, just set it to '0' if {[string trim "$val"] == {}} { set val 0 } eval "set \{$col\} \{$val\}" } switch $dim { xy {append rr [subst "$var(plot,x), $var(plot,y)\n"]} xyex {append rr [subst "$var(plot,x), $var(plot,y), $var(plot,xerr)\n"]} xyey {append rr [subst "$var(plot,x), $var(plot,y), $var(plot,yerr)\n"]} xyexey {append rr [subst "$var(plot,x), $var(plot,y), $var(plot,xerr), $var(plot,yerr)\n"]} } } set xtitle [regsub -all {\$*} $var(plot,x) {}] set ytitle [regsub -all {\$*} $var(plot,y) {}] set vvarname plot${varname} upvar #0 $vvarname vvar global $vvarname set ping [PlotPing $vvarname] if {!$ping} { PlotScatterDialog $vvarname $var(title) {} {} {} set vvar(callback) "CATSelectRows $varname plot" set var(plot) 1 set var(plot,var) $vvarname } PlotClearData $vvarname PlotDataSet $vvarname $dim $rr PlotTitle $vvarname $var(title) $xtitle $ytitle $vvar(proc,updategraph) $vvarname PlotStats $vvarname PlotList $vvarname } proc CATPlotDialog {varname} { upvar #0 $varname var global $varname global ds9 global ed2 set w ".${varname}plot" set mb ".${varname}plotmb" set ed2(ok) 0 set ed2(x) $var(plot,x) set ed2(xerr) $var(plot,xerr) set ed2(y) $var(plot,y) set ed2(yerr) $var(plot,yerr) DialogCreate $w [msgcat::mc {Plot}] ed2(ok) $w configure -menu $mb menu $mb # file $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command {set ed2(ok) 1} $mb.file add command -label [msgcat::mc {Cancel}] -command {set ed2(ok) 0} # edit $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit EditMenu $mb $varname # param set f [ttk::frame $w.param] ttk::label $f.taxis -text {Axis} ttk::label $f.terr -text {Error} ttk::label $f.tx -text {X} ttk::entry $f.x -textvariable ed2(x) -width 21 ttk::button $f.bx -text [msgcat::mc {Edit}] \ -command "CATEditDialog ed2 x $var(catdb)" ttk::entry $f.xerr -textvariable ed2(xerr) -width 21 ttk::button $f.bxerr -text [msgcat::mc {Edit}] \ -command "CATEditDialog ed2 xerr $var(catdb)" ttk::menubutton $f.mx -text {Cols} -menu $f.mx.menu ttk::menubutton $f.mxerr -text {Cols} -menu $f.mxerr.menu CATPlotDialogColsMenu $varname $f.mx x CATPlotDialogColsMenu $varname $f.mxerr xerr ttk::label $f.ty -text {Y} ttk::entry $f.y -textvariable ed2(y) -width 21 ttk::button $f.by -text [msgcat::mc {Edit}] \ -command "CATEditDialog ed2 y $var(catdb)" ttk::entry $f.yerr -textvariable ed2(yerr) -width 21 ttk::button $f.byerr -text [msgcat::mc {Edit}] \ -command "CATEditDialog ed2 yerr $var(catdb)" ttk::menubutton $f.my -text {Cols} -menu $f.my.menu ttk::menubutton $f.myerr -text {Cols} -menu $f.myerr.menu CATPlotDialogColsMenu $varname $f.my y CATPlotDialogColsMenu $varname $f.myerr yerr grid x $f.taxis x $f.terr -padx 2 -pady 2 -sticky ew grid $f.tx $f.x $f.bx $f.xerr $f.bxerr -padx 2 -pady 2 -sticky ew grid x $f.mx x $f.mxerr -padx 2 -pady 2 -sticky ew grid $f.ty $f.y $f.by $f.yerr $f.byerr -padx 2 -pady 2 -sticky ew grid x $f.my x $f.myerr -padx 2 -pady 2 -sticky ew # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.param -side top -fill both -expand true pack $w.buttons $w.sep -side bottom -fill x DialogCenter $w DialogWait $w ed2(ok) $w.buttons.ok if {$ed2(ok)} { set var(plot,x) $ed2(x) set var(plot,xerr) $ed2(xerr) set var(plot,y) $ed2(y) set var(plot,yerr) $ed2(yerr) } DialogDismiss $w destroy $mb set rr $ed2(ok) unset ed2 return $rr } proc CATPlotDialogColsMenu {varname f ww} { upvar #0 $varname var global $varname global $var(catdb) global ed2 global ds9 set m $f.menu menu $m -tearoff 0 if {[CATValidDB $var(catdb)]} { set cnt -1 foreach col [starbase_columns $var(catdb)] { $m add command -label $col -command "set ed2($ww) \\$$col" # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 0 $m entryconfig $col -columnbreak 1 } } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catreg.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000024243 12514261632 016507� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # catreg -- convert catalog table into region string proc CATReg {varname row interactive resultname} { upvar $resultname result upvar #0 $varname var global $varname global $var(tbldb) global $var(symdb) # init result set result {} # How to process each field of a filter # ------------------------------------- # condition: subst/expr # shape: constant # color: constant # width: constant # dash: constant # font: constant # fontsize: constant # fontweight: constant # fontslant: constant # text: subst # size1: expr # size2: expr # angle: expr # valid cols? if {$var(colx) == {} || $var(coly) == {}} { return } set colx [starbase_colnum $var(tbldb) $var(colx)] set coly [starbase_colnum $var(tbldb) $var(coly)] # do we have formats for colx and coly? if {[catch {starbase_hdrget $var(tbldb) UFMT} ff]} { set ff {} global errorInfo set errorInfo {} } set xformat [lindex $ff 0] set yformat [lindex $ff 1] # else, do we have T(Units), i.e. votable set db $var(tbldb) upvar #0 $db T if {[info exists T(Unit)]} { set xformat [string trim [lindex $T(Unit) [expr $colx-1]] {"}] set yformat [string trim [lindex $T(Unit) [expr $coly-1]] {"}] } # process prologue append result "# Region file format: DS9 version 4.0\n" # for speed... # tbldb set nrows [starbase_nrows $var(tbldb)] set cols [starbase_columns $var(tbldb)] # system switch $var(psystem) { image - physical - detector - amplifier {set sys $var(psystem)} default {set sys "$var(psystem); $var(psky)"} } # symdb set snrows [starbase_nrows $var(symdb)] set sncond [starbase_colnum $var(symdb) condition] set snshape [starbase_colnum $var(symdb) shape] set sncolor [starbase_colnum $var(symdb) color] set snwidth [starbase_colnum $var(symdb) width] set sndash [starbase_colnum $var(symdb) dash] set snfont [starbase_colnum $var(symdb) font] set snfontsize [starbase_colnum $var(symdb) fontsize] set snfontweight [starbase_colnum $var(symdb) fontweight] set snfontslant [starbase_colnum $var(symdb) fontslant] set sntext [starbase_colnum $var(symdb) text] set snsize [starbase_colnum $var(symdb) size] set snsize2 [starbase_colnum $var(symdb) size2] set snunits [starbase_colnum $var(symdb) units] set snangle [starbase_colnum $var(symdb) angle] # for each row in the catalog table ... if {[string is integer -strict $row]} { set start $row set end $row } else { set start 1 set end $nrows } # look for need to eval colnames (only used for conditionals and text set doEval 0 for {set jj 1} {$jj <= $snrows} {incr jj} { set cond [starbase_get $var(symdb) $jj $sncond] set text [starbase_get $var(symdb) $jj $sntext] set sz [starbase_get $var(symdb) $jj $snsize] set sz2 [starbase_get $var(symdb) $jj $snsize2] set angle [starbase_get $var(symdb) $jj $snangle] if {$cond!={} || $text!={} || $sz!={} || $sz2!={} || $angle!={}} { set doEval 1 } } for {set ii $start} {$ii <= $end} {incr ii} { if {$doEval} { # define each colunm variable foreach col $cols { set val [starbase_get $var(tbldb) $ii \ [starbase_colnum $var(tbldb) $col]] # here's a tough one-- what to do if the col is blank # for now, just set it to '0' if {[string trim "$val"] == {}} { set val 0 } eval "set \{$col\} \{$val\}" } } # look through each filter for {set jj 1} {$jj <= $snrows} {incr jj} { # eval condition set cond [starbase_get $var(symdb) $jj $sncond] if {$cond != {}} { set found 0 # subst any column vars if {[catch {subst $cond} cc]} { Error "Unable to evaluate condition $cc" return } # evaluate filter if {[catch {expr $cc} found]} { Error "Unable to evaluate condition $cc" return } } else { set found 1 } # if not true, goto the next filter if {!$found} { continue } # shape set shape [starbase_get $var(symdb) $jj $snshape] if {$shape == {}} { set shape circle } # xx set xx [starbase_get $var(tbldb) $ii $colx] switch $xformat { {h:m:s} - {d:m:s} {set xx [uformat $xformat d $xx]} } # yy set yy [starbase_get $var(tbldb) $ii $coly] if {$yformat == {d:m:s}} { set yy [uformat $yformat d $yy] } # size/angle set szcol {} set sz2col {} set angcol {} set units [starbase_get $var(symdb) $jj $snunits] switch -- $units { image {set unitval i} physical {set unitval p} degrees {set unitval d} arcmin {set unitval {'}} arcsec {set unitval {"}} default {set unitval p} } switch -- $shape { text - point - {circle point} - {box point} - {diamond point} - {cross point} - {x point} - {arrow point} - {boxcircle point} {set size {}} circle { set sz [starbase_get $var(symdb) $jj $snsize] set szcolnm [string range $sz 1 end] if {[lsearch -exact $cols $szcolnm] != -1} { set szcol [starbase_colnum $var(tbldb) $szcolnm] } if {$sz != {}} { if {[catch {expr $sz} ss]} { Error "Unable to evaluate size $sz" return } else { set sz $ss } } else { set sz 5 } set size "${sz}${unitval}" } vector { set sz [starbase_get $var(symdb) $jj $snsize] set szcolnm [string range $sz 1 end] if {[lsearch -exact $cols $szcolnm] != -1} { set szcol [starbase_colnum $var(tbldb) $szcolnm] } if {$sz != {}} { if {[catch {expr $sz} ss]} { Error "Unable to evaluate size $sz" return } else { set sz $ss } } else { set sz 5 } set angle [starbase_get $var(symdb) $jj $snangle] set angcolnm [string range $angle 1 end] if {[lsearch -exact $cols $angcolnm] != -1} { set angcol [starbase_colnum $var(tbldb) $angcolnm] } if {$angle != {}} { if {[catch {expr $angle} aa]} { Error "Unable to evaluate angle $angle" return } else { set angle $aa } } else { set angle 0 } set size "${sz}${unitval} ${angle}" } ellipse - box { # size set sz [starbase_get $var(symdb) $jj $snsize] set szcolnm [string range $sz 1 end] if {[lsearch -exact $cols $szcolnm] != -1} { set szcol [starbase_colnum $var(tbldb) $szcolnm] } if {$sz != {}} { if {[catch {expr $sz} ss]} { Error "Unable to evaluate size $sz" return } else { set sz $ss } } else { set sz 5 } # size2 set sz2 [starbase_get $var(symdb) $jj $snsize2] set sz2colnm [string range $sz2 1 end] if {[lsearch -exact $cols $sz2colnm] != -1} { set sz2col [starbase_colnum $var(tbldb) $sz2colnm] } if {$sz2 != {}} { if {[catch {expr $sz2} ss]} { Error "Unable to evaluate size $sz2" return } else { set sz2 $ss } } else { set sz2 5 } # angle set angle [starbase_get $var(symdb) $jj $snangle] set angcolnm [string range $angle 1 end] if {[lsearch -exact $cols $angcolnm] != -1} { set angcol [starbase_colnum $var(tbldb) $angcolnm] } if {$angle != {}} { if {[catch {expr $angle} aa]} { Error "Unable to evaluate angle $angle" return } else { set angle $aa } } else { set angle 0 } # put it all together set size "${sz}${unitval} ${sz2}${unitval} ${angle}" } } # color set color [starbase_get $var(symdb) $jj $sncolor] if {$color == {}} { set color green } # width set width [starbase_get $var(symdb) $jj $snwidth] if {$width == {}} { set width 1 } # dash set dash [starbase_get $var(symdb) $jj $sndash] if {$dash == {}} { set dash 0 } #font set font [starbase_get $var(symdb) $jj $snfont] if {$font == {}} { set font helvetica } set fontsize [starbase_get $var(symdb) $jj $snfontsize] if {$fontsize == {}} { set fontsize 10 } set fontweight [starbase_get $var(symdb) $jj $snfontweight] if {$fontweight == {}} { set fontweight normal } set fontslant [starbase_get $var(symdb) $jj $snfontslant] if {$fontslant == {}} { set fontslant roman } # text set text [starbase_get $var(symdb) $jj $sntext] if {$text != {}} { if {[catch {subst $text} tt]} { Error "Unable to evaluate text $text" return } else { set text $tt } } if {$shape == {text} && $text == {}} { set text "$ii" } # final substitution and append result # init result for substitutions if {$interactive} { if {$var(edit)} { set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} font=\{${font} ${fontsize} ${fontweight} ${fontslant}\} text=\{\${text}\} tag={${varname}} tag={${varname}.\${ii}} select=1 edit=1 move=1 rotate=1 delete=1 highlite=0 callback=select CATHighliteCB {${varname}.\${ii}} callback=unselect CATUnhighliteCB {${varname}.\${ii}} callback=edit CATEditCB {${varname}.\${ii}.\${szcol}.\${sz2col}.\${units}.\${angcol}} callback=move CATMoveCB {${varname}.\${ii}} callback=rotate CATRotateCB {${varname}.\${ii}.\${angcol}} callback=delete CATDeleteCB {${varname}.\${ii}}\n" } else { set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} font=\{${font} ${fontsize} ${fontweight} ${fontslant}\} text=\{\${text}\} tag={${varname}} tag={${varname}.\${ii}} select=0 edit=0 move=0 rotate=0 delete=1 highlite=1 callback=delete CATDeleteCB {${varname}.\${ii}} callback=highlite CATHighliteCB {${varname}.\${ii}} callback=unhighlite CATUnhighliteCB {${varname}.\${ii}}\n" } } else { set template "\${sys};\${shape}(\${xx} \${yy} \${size}) # color=\${color} width=\${width} dash=\${dash} text=\{\${text}\} tag=$varname\n" } append result [subst $template] # ok, we are done break } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catsdss.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000007564 12527716223 016722� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATSDSS {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSDSS $varname" } set var(proc,reader) CATSDSSReader # coord (degrees) switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { set xx [h2d [Sex2H $var(x)]] set yy [Sex2D $var(y)] } } # size (arcmin) switch $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] set query {} append query "ra=$xx&" append query "dec=$yy&" append query "radius=$rr&" # append query "min_ra=[expr $xx-$ww/2.]&max_ra=[expr $xx+$ww/2.]&" # append query "min_dec=[expr $yy-$hh/2.]&max_dec=[expr $yy+$hh/2.]&" # output if {$var(allrows)} { append query "entries=all&" } else { append query "topnum=$var(max)&" } append query "format=csv&" set var(url) "http://cas.sdss.org/astrodr${var(catalog)}/en/tools/search/x_radial.asp?$query" set var(query) {} CATLoadIncr $varname } proc CATSDSSReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) 1 } 1 { # process header if {[gets $sock line] == -1} { return } if {[string equal $line "No objects have been found"]} { return } # cols incr ${t}(HLines) set n $T(HLines) set result [string length "$line"] set T(H_$n) $line set T(Header) [split $T(H_$n) ","] # dashes set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 2 } 2 { # process table if {[gets $sock line] == -1} { set T(state) 0 } else { set result [string length "$line"] set line [string trim $line] if {$line != {}} { # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line ","] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } } } } return $result } proc CATSDSSAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for SDSS Funding for the Sloan Digital Sky Survey (SDSS) has been provided by the Alfred P. Sloan Foundation, the Participating Institutions, the National Aeronautics and Space Administration, the National Science Foundation, the U.S. Department of Energy, the Japanese Monbukagakusho, and the Max Planck Society. The SDSS Web site is http://www.sdss.org/. The SDSS is managed by the Astrophysical Research Consortium (ARC) for the Participating Institutions. The Participating Institutions are The University of Chicago, Fermilab, the Institute for Advanced Study, the Japan Participation Group, The Johns Hopkins University, the Korean Scientist Group, Los Alamos National Laboratory, the Max-Planck-Institute for Astronomy (MPIA), the Max-Planck-Institute for Astrophysics (MPA), New Mexico State University, University of Pittsburgh, University of Portsmouth, Princeton University, the United States Naval Observatory, and the University of Washington. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } ��������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catsimbad.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000011041 12527716223 017166� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATSIMBAD {varname} { upvar #0 $varname var global $varname global pcat global debug if {$debug(tcl,cat)} { puts stderr "CATSIMBAD $varname" } # parser if {$pcat(vot)} { set var(proc,parser) CATSIMBADParse } else { set var(proc,reader) CATSIMBADReader } # query set qq {} if {$pcat(vot)} { append qq "output script=off\n" append qq "output console=off\n" } if {$pcat(vot)} { append qq "votable v1 " } else { append qq "format object f1 " } switch -- $var(psky) { fk4 {set psky "FK4;1950;1950"} fk5 {set psky "FK5;2000;2000"} icrs {set psky "ICRS"} galactic {set psky "GAL"} ecliptic {set psky "ECL"} } if {$pcat(vot)} { append qq "{ coo(d;$psky), main_id, otype(S), pmra, pmdec, plx, z_value, flux(B), flux(V), sp }\n" append qq "votable open v1\n" } else { append qq {"%COO(d;A)\t%COO(d;D)\t%IDLIST(1)\t%OTYPE(S)\t%PM(A)\t%PM(D)\t%PLX(V)\t%RV(Z)\t%FLUXLIST(B;F)\t%FLUXLIST(V;F)\t%SP(S)\n"} append qq "\n" } switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { switch -- $var(sky) { fk4 - fk5 - icrs {set xx [h2d [Sex2H $var(x)]]} galactic - ecliptic {set xx [Sex2D $var(x)]} } set yy [Sex2D $var(y)] } } append qq "query coo $xx " if {$yy>0} { append qq "+$yy" } else { append qq "$yy" } set ww $var(width) set hh $var(height) set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] append qq " radius=$rr" switch -- $var(rformat) { degrees {append qq "d"} arcmin {append qq "m"} arcsec {append qq "s"} } switch -- $var(sky) { fk4 {append qq " frame=FK4 epoch=B1950 equinox=1950"} fk5 {append qq " frame=FK5 epoch=J2000 equinox=2000"} icrs {append qq " frame=ICRS"} galactic {append qq " frame=GAL"} ecliptic {append qq " frame=ECL"} } if {$pcat(vot)} { append qq "\nvotable close\n" } else { append qq "\n" } # url set var(url) "http://simbad.u-strasbg.fr/simbad/sim-script" set var(query) [http::formatQuery script $qq] if {$pcat(vot)} { CATLoad $varname } else { CATLoadIncr $varname } } proc CATSIMBADParse {t token} { upvar #0 $t T global $t global debug # we can't trust simbad to turn off any error messages variable $token upvar 0 $token state set id [string first {<?xml} $state(body)] set ${token}(body) [string range $state(body) $id end] CATVOTParse $t $token } proc CATSIMBADReader {t sock token} { upvar #0 $t T global $t set result 0 if { ![info exists ${t}(state)] } { set T(state) 0 } switch -- $T(state) { 0 { # init db fconfigure $sock -blocking 1 set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) 1 } 1 { # process header if {[gets $sock line] == -1} { set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) -1 return $result } set result [string length "$line"] # error? if {[string range $line 0 8] == {::error::}} { set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(state) -1 return $result } # start of data? if {[string range $line 0 7] == {::data::}} { # cols set line "RA\tDEC\tIdentifier\tObject\tPMRA\tPMDEC\tPX\tRV(z)\tB\tV\tSpectralType" incr ${t}(HLines) set n $T(HLines) set T(H_$n) $line set T(Header) [split $T(H_$n) "\t"] # dashes set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t set T(state) 2 } } 2 { # process table if {[gets $sock line] == -1} { set T(state) 0 } else { set result [string length "$line"] set line [string trim $line] if {$line != {}} { # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line "\t"] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } } } } return $result } proc CATSIMBADAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for SIMBAD This research has made use of the SIMBAD database, operated at CDS, Strasbourg, France. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catskybot.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000007710 12527716223 017252� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATSkyBot {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSkyBot $varname" } CATSkyBotVOT $varname } proc CATSkyBotVOT {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,cat)} { puts stderr "CATSkyBotVOT $varname" } set var(proc,parser) CATVOTParse # coord (degrees) switch $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { switch -- $var(sky) { fk4 - fk5 - icrs {set xx [h2d [Sex2H $var(x)]]} galactic - ecliptic {set xx [Sex2D $var(x)]} } set yy [Sex2D $var(y)] } } # size (arcmin) switch $var(rformat) { degrees { set ww $var(width) set hh $var(height) } arcmin { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } arcsec { set ww [expr $var(width)/60./60.] set hh [expr $var(height)/60./60.] } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] # output if {$var(allcols)} { set type 3 } else { set type 2 } # figure out a epoch (DATE-OBS, then DATE) global current set epoch [string trim [$current(frame) get fits header keyword DATE-OBS]] if {$epoch == {}} { set epoch [string trim [$current(frame) get fits header keyword DATE_OBS]] } if {$epoch == {}} { set epoch [string trim [$current(frame) get fits header keyword DATE]] } if {$epoch == {}} { ARError $varname [msgcat::mc {Unable to determine date of observation}] return } # do we have a time? else check UT, UTC-OBS, UTIME, TIME-OBS set ut {} if {[string first {T} $epoch] == -1} { set ut [string trim [$current(frame) get fits header keyword UT]] if {$ut == {}} { set ut [string trim [$current(frame) get fits header keyword UTC-OBS]] } if {$ut == {}} { set ut [string trim [$current(frame) get fits header keyword UTIME]] } if {$ut == {}} { set ut [string trim [$current(frame) get fits header keyword TIME-OBS]] } if {$ut == {}} { set ut [string trim [$current(frame) get fits header keyword TIME_OBS]] } if {$ut != {}} { append epoch "T$ut" } else { ARError $varname [msgcat::mc {Unable to determine time of observation}] return } } # do we finally have a date with time? set dt [split $epoch {T}] set dd [lindex $dt 0] set tt [lindex $dt 1] if {$tt != {}} { # do we have EXPTIME or EXP_TIME? set exp [string trim [$current(frame) get fits header keyword EXPTIME]] if {$exp == {}} { set exp [string trim [$current(frame) get fits header keyword EXP_TIME]] } if {$exp != {} && [string is double $exp]} { # ok, rebuild epoch set ttt [split $tt {:}] set total [expr [lindex $ttt 0]*60.*60. + [lindex $ttt 1]*60. + [lindex $ttt 2] + [expr $exp/2.]] set hh [format "%02d" [expr int($total/60./60.)]] set total [expr $total - $hh*60.*60.] set mm [format "%02d" [expr int($total/60.)]] set ss [format "%02.1f" [expr $total - $mm*60.]] set epoch "${dd}T${hh}:${mm}:${ss}" } } # query set var(query) [http::formatQuery EPOCH $epoch RA $xx DEC $yy SR $rr VERB $type -mime votable -loc $var(loc) -filter=0] set var(url) "http://vo.imcce.fr/webservices/skybot/skybotconesearch_query.php" CATLoad $varname } proc CATSkyBotAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for SkyBot Request for Acknowledgment of Use of SkyBot If SkyBoT was helpful for your research work, the following acknowledgment would be appreciated: "This research has made use of IMCCE's SkyBoT VO tool", or cite the following article 2006ASPC..351..367B. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 10 insert top $msg } ��������������������������������������������������������saods9/ds9/library/catsym.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000040562 12514261632 016544� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATSymDef {} { global icatsym set icatsym(minrows) 8 set icatsym(mincols) 8 } proc CATSymDialog {parent} { upvar #0 $parent pvar global $parent set varname $pvar(symdl) upvar #0 $varname var global $varname global ds9 global icatsym # main dialog set var(top) ".${varname}" set var(mb) ".${varname}mb" if {[winfo exists $var(top)]} { raise $var(top) return } # variables set var(parent) $parent set var(symdb) $pvar(symdb) global $var(symdb) set var(row) 1 # initialize if {$var(row) <= [starbase_nrows $var(symdb)]} { set var(condition) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) condition]] set var(shape) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) shape]] set var(color) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) color]] set var(width) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) width]] set var(dash) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) dash]] set var(font) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) font]] set var(font,size) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontsize]] set var(font,weight) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontweight]] set var(font,slant) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontslant]] set var(text) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) text]] set var(size) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size]] set var(size2) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size2]] set var(units) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) units]] set var(angle) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) angle]] } # create the window set w $var(top) set mb $var(mb) Toplevel $w $mb 7 [msgcat::mc {Symbol Editor}] "CATSymDestroy $varname" $mb add cascade -label [msgcat::mc {File}] -menu $mb.file # menu menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command "CATSymApply $varname" $mb.file add separator $mb.file add command -label "[msgcat::mc {Save}]..." \ -command "CATSymSave $varname" $mb.file add command -label "[msgcat::mc {Load}]..." \ -command "CATSymLoad $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Add}] \ -command "CATSymAdd $varname" $mb.file add command -label [msgcat::mc {Delete}] \ -command "CATSymRemove $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "CATSymDestroy $varname" # Param set f [ttk::frame $w.param] ttk::label $f.tcondition -text [msgcat::mc {If}] ttk::entry $f.condition -textvariable ${varname}(condition) -width 40 ttk::button $f.bcondition -text [msgcat::mc {Edit}] \ -command "CATEditDialog $varname condition $pvar(catdb)" ttk::label $f.tthen -text [msgcat::mc {Then}] ttk::label $f.tshape -text [msgcat::mc {Shape}] ttk::menubutton $f.shape -textvariable ${varname}(shape) -menu $f.shape.menu ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color $varname color {} ttk::label $f.twidth -text [msgcat::mc {Width}] WidthDashMenuButton $f.width $varname width dash {} {} ttk::label $f.tfont -text [msgcat::mc {Font}] FontMenuButton $f.font $varname font font,size font,weight font,slant {} ttk::label $f.ttext -text [msgcat::mc {Text}] ttk::entry $f.text -textvariable ${varname}(text) -width 40 ttk::button $f.btext -text [msgcat::mc {Edit}] \ -command "CATEditDialog $varname text $pvar(catdb)" ttk::label $f.tsize -text [msgcat::mc {Size/Radius}] ttk::entry $f.size -textvariable ${varname}(size) -width 40 ttk::button $f.bsize -text [msgcat::mc {Edit}] \ -command "CATEditDialog $varname size $pvar(catdb)" ttk::label $f.tsize2 -text "[msgcat::mc {Size/Radius}] 2" ttk::entry $f.size2 -textvariable ${varname}(size2) -width 40 ttk::button $f.bsize2 -text [msgcat::mc {Edit}] \ -command "CATEditDialog $varname size2 $pvar(catdb)" ttk::label $f.tunits -text [msgcat::mc {Units}] tk_optionMenu $f.units ${varname}(units) \ image physical degrees arcmin arcsec $f.units.menu configure ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 40 ttk::button $f.bangle -text [msgcat::mc {Edit}] \ -command "CATEditDialog $varname angle $pvar(catdb)" menu $f.shape.menu $f.shape.menu add radiobutton -label [msgcat::mc {Circle}] \ -variable ${varname}(shape) -value {circle} $f.shape.menu add radiobutton -label [msgcat::mc {Ellipse}] \ -variable ${varname}(shape) -value {ellipse} $f.shape.menu add radiobutton -label [msgcat::mc {Box}] \ -variable ${varname}(shape) -value {box} $f.shape.menu add radiobutton -label [msgcat::mc {Vector}] \ -variable ${varname}(shape) -value {vector} $f.shape.menu add radiobutton -label [msgcat::mc {Text}] \ -variable ${varname}(shape) -value {text} $f.shape.menu add cascade -label [msgcat::mc {Point}] \ -menu $f.shape.menu.point menu $f.shape.menu.point $f.shape.menu.point add radiobutton -label [msgcat::mc {Circle}] \ -variable ${varname}(shape) -value {circle point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Box}] \ -variable ${varname}(shape) -value {box point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Diamond}] \ -variable ${varname}(shape) -value {diamond point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Cross}] \ -variable ${varname}(shape) -value {cross point} $f.shape.menu.point add radiobutton -label [msgcat::mc {X}] \ -variable ${varname}(shape) -value {x point} $f.shape.menu.point add radiobutton -label [msgcat::mc {Arrow}] \ -variable ${varname}(shape) -value {arrow point} $f.shape.menu.point add radiobutton -label [msgcat::mc {BoxCircle}] \ -variable ${varname}(shape) -value {boxcircle point} grid $f.tcondition $f.condition $f.bcondition -padx 2 -pady 2 -sticky w grid $f.tthen -padx 2 -pady 2 -sticky w grid $f.tshape $f.shape -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w grid $f.twidth $f.width -padx 2 -pady 2 -sticky w grid $f.tfont $f.font -padx 2 -pady 2 -sticky w grid $f.ttext $f.text $f.btext -padx 2 -pady 2 -sticky w grid $f.tsize $f.size $f.bsize -padx 2 -pady 2 -sticky w grid $f.tsize2 $f.size2 $f.bsize2 -padx 2 -pady 2 -sticky w grid $f.tunits $f.units -padx 2 -pady 2 -sticky w grid $f.tangle $f.angle $f.bangle -padx 2 -pady 2 -sticky w # Table set f [ttk::frame $w.tbl] set var(tbl) [table $f.t \ -state disabled \ -usecommand 0 \ -variable $var(symdb) \ -colorigin 1 \ -roworigin 0 \ -cols $icatsym(mincols) \ -rows $icatsym(minrows) \ -width -1 \ -height -1 \ -maxwidth 550 \ -maxheight 300 \ -titlerows 1 \ -xscrollcommand [list $f.xscroll set]\ -yscrollcommand [list $f.yscroll set]\ -selecttype row \ -selectmode single \ -anchor w \ -font [font actual TkDefaultFont] \ -browsecommand [list CATSymSelectCB $varname] ] ttk::scrollbar $f.yscroll -command [list $var(tbl) yview] -orient vertical ttk::scrollbar $f.xscroll -command [list $var(tbl) xview] -orient horizontal grid $var(tbl) $f.yscroll -sticky news grid $f.xscroll -stick news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command "CATSymApply $varname" ttk::button $f.add -text [msgcat::mc {Add}] \ -command "CATSymAdd $varname" ttk::button $f.remove -text [msgcat::mc {Delete}] \ -command "CATSymRemove $varname" ttk::button $f.close -text [msgcat::mc {Close}] \ -command "CATSymDestroy $varname" pack $f.apply $f.add $f.remove $f.close \ -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sparam -orient horizontal ttk::separator $w.sstatus -orient horizontal pack $w.buttons $w.sstatus -side bottom -fill x pack $w.param $w.sparam -side top -fill x pack $w.tbl -side top -fill both -expand true CATSymTable $varname $var(tbl) selection set $var(row),1 } proc CATSymDestroy {varname} { upvar #0 $varname var global $varname destroy $var(top) destroy $var(mb) unset var } proc CATSymApply {varname} { upvar #0 $varname var global $varname global $var(symdb) if {$var(row) != {}} { if {$var(row) <= [starbase_nrows $var(symdb)]} { starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) condition] $var(condition) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) shape] $var(shape) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) color] $var(color) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) width] $var(width) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) dash] $var(dash) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) font] $var(font) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontsize] $var(font,size) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontweight] $var(font,weight) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontslant] $var(font,slant) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) text] $var(text) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size] $var(size) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size2] $var(size2) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) units] $var(units) starbase_set $var(symdb) $var(row) \ [starbase_colnum $var(symdb) angle] $var(angle) } } CATSymUpdate $varname } proc CATSymAdd {varname} { upvar #0 $varname var global $varname global $var(symdb) global pcat set row [expr [starbase_nrows $var(symdb)]+1] starbase_rowins $var(symdb) $row starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) shape] $pcat(sym,shape) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) color] $pcat(sym,color) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) width] $pcat(sym,width) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) dash] $pcat(sym,dash) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) font] $pcat(sym,font) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) fontsize] $pcat(sym,font,size) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) fontweight] $pcat(sym,font,weight) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) fontslant] $pcat(sym,font,slant) starbase_set $var(symdb) $row \ [starbase_colnum $var(symdb) units] $pcat(sym,units) $var(tbl) selection clear all $var(tbl) selection set $row,1 $var(tbl) see $row,1 CATSymSelectCB $varname CATSymTable $varname } proc CATSymRemove {varname} { upvar #0 $varname var global $varname global $var(symdb) set ss "[$var(tbl) curselection]" set var(row) [string trim [lindex [split $ss ,] 0]] if {$var(row) != {}} { set nr [starbase_nrows $var(symdb)] if {$nr > 1 && $var(row) <= $nr} { starbase_rowdel $var(symdb) $var(row) set var(row) {} } } CATSymClear $varname CATSymTable $varname } proc CATSymSave {varname} { upvar #0 $varname var global $varname global $var(symdb) set fn [SaveFileDialog catsymfbox] if {$fn != {}} { starbase_write $var(symdb) $fn } } proc CATSymLoad {varname} { upvar #0 $varname var global $varname global $var(symdb) set fn [OpenFileDialog catsymfbox] if {$fn != {}} { if {[file exists $fn]} { if {[info exists $var(symdb)]} { unset $var(symdb) } starbase_read $var(symdb) $fn CATSymUpdate $varname } else { Error "[msgcat::mc {Unable to open file}] $fn" return } } } proc CATSymClear {varname} { upvar #0 $varname var global $varname $var(tbl) selection clear all set var(row) {} set var(condition) {} set var(shape) {} set var(color) {} set var(width) {} set var(dash) {} set var(font) {} set var(font,size) {} set var(font,weight) {} set var(font,slant) {} set var(text) {} set var(size) {} set var(size2) {} set var(units) {} set var(angle) {} } # Support proc CATSymDBInit {varname} { upvar #0 $varname var global $varname global $var(symdb) global pcat if {[info exists $var(symdb)]} { unset $var(symdb) } starbase_new $var(symdb) condition shape color width dash \ font fontsize fontweight fontslant text size size2 units angle starbase_rowins $var(symdb) 1 starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) shape] $pcat(sym,shape) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) color] $pcat(sym,color) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) width] $pcat(sym,width) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) dash] $pcat(sym,dash) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) font] $pcat(sym,font) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) fontsize] $pcat(sym,font,size) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) fontweight] $pcat(sym,font,weight) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) fontslant] $pcat(sym,font,slant) starbase_set $var(symdb) 1 \ [starbase_colnum $var(symdb) units] $pcat(sym,units) } proc CATSymUpdate {varname} { upvar #0 $varname var global $varname CATGenerate $var(parent) } proc CATSymTable {varname} { upvar #0 $varname var global $varname global $var(symdb) global icatsym set nc [starbase_ncols $var(symdb)] if { $nc > $icatsym(mincols)} { $var(tbl) configure -cols $nc } else { $var(tbl) configure -cols $icatsym(mincols) } # add header row set nr [expr [starbase_nrows $var(symdb)]+1] if {$nr > $icatsym(minrows)} { $var(tbl) configure -rows $nr } else { $var(tbl) configure -rows $icatsym(minrows) } } proc CATSymSelectCB {varname} { upvar #0 $varname var global $varname global $var(symdb) set ss "[$var(tbl) curselection]" set var(row) [string trim [lindex [split $ss ,] 0]] if {$var(row) != {}} { if {$var(row) <= [starbase_nrows $var(symdb)]} { set var(condition) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) condition]] set var(shape) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) shape]] set var(color) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) color]] set var(width) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) width]] set var(dash) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) dash]] set var(font) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) font]] set var(font,size) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontsize]] set var(font,weight) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontweight]] set var(font,slant) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) fontslant]] set var(text) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) text]] set var(size) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size]] set var(size2) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) size2]] set var(units) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) units]] set var(angle) [starbase_get $var(symdb) $var(row) \ [starbase_colnum $var(symdb) angle]] return } } CATSymClear $varname } ����������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/cattsv.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000005611 12464211202 016534� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATTSVRead {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { puts stderr "CATTSVRead" } if {$fn == {}} { return } catch { set fp [open $fn r] # init db set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 # ok, get first non comment line while (true) { if {[gets $fp line] == -1} { return } # skip any comments if {[string range $line 0 0] != "#"} { break; } } # reduce number of spaces regsub -all { +} $line { } line # strip any quotes regsub -all {\"} $line {} line # determine separator if {[llength [split $line "\t"]] > 1} { set ss "\t" } elseif {[llength [split $line ","]] > 1} { set ss "," } elseif {[llength [split $line ":"]] > 1} { set ss ":" } else { set ss " " } # determine header set first {} set foo [split $line $ss] if {([string is integer [lindex $foo 0]] || [string is double [lindex $foo 0]]) && ([string is integer [lindex $foo 1]] || [string is double [lindex $foo 1]])} { # determine num cols set cnt [llength $foo] # we need to build an header set first $line set line "X${ss}Y" for {set ii 2} {$ii<$cnt} {incr ii} { append line "${ss}column[expr $ii+3]" } } # process header # cols incr ${t}(HLines) set n $T(HLines) set T(H_$n) $line set T(Header) [split $T(H_$n) $ss] # dashes set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Dashes)] starbase_colmap $t # process table if {$first == {}} { gets $fp line } else { set line $first } while {![eof $fp]} { # skip any comments if {[string range $line 0 0] == "#"} { set line {} } # reduce number of spaces regsub -all { +} $line { } line set line [string trim $line] # do we have something? if {$line != {}} { # ok, save it incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols $t] set c 1 foreach val [split $line $ss] { set T($r,$c) $val incr c } for {} {$c <= $NCols} {incr c} { set T($r,$c) {} } } gets $fp line } close $fp } } proc CATTSVWrite {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { puts stderr "CATTSVWrite" } if {$fn == {}} { return } set fp [open $fn w] set nr $T(Nrows) set nc $T(Ncols) # header for {set cc 1} {$cc < $nc} {incr cc} { puts -nonewline $fp "[lindex $T(Header) [expr $cc-1]]\t" } puts $fp "[lindex $T(Header) [expr $nc-1]]" # data for {set rr 1} {$rr <= $nr} {incr rr} { for {set cc 1} {$cc < $nc} {incr cc} { puts -nonewline $fp "$T($rr,$cc)\t" } puts $fp "$T($rr,$nc)" } close $fp } �����������������������������������������������������������������������������������������������������������������������saods9/ds9/library/catvot.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000021140 12514261632 016533� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CATVOTParse {t token} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { set fp [open debug.xml w] puts $fp [http::data $token] close $fp } set xml [xml::parser \ -characterdatacommand [list CATVOTCharCB $t] \ -elementstartcommand [list CATVOTElemStartCB $t] \ -elementendcommand [list CATVOTElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,state) {} set T(tree,prev) {} if {[catch {$xml parse [http::data $token]} err]} { if {$debug(tcl,cat)} { puts stderr "CATVOTParse: $err" } } $xml free } proc CATVOTRead {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { puts stderr "CATVOTRead" } if {$fn == {}} { return } catch { set fp [open $fn r] set xml [xml::parser \ -characterdatacommand [list CATVOTCharCB $t]\ -elementstartcommand [list CATVOTElemStartCB $t] \ -elementendcommand [list CATVOTElemEndCB $t] \ -ignorewhitespace 1 \ ] set T(tree,state) {} set T(tree,prev) {} if {[catch {$xml parse [read $fp]} err]} { if {$debug(tcl,cat)} { puts stderr "CATVOTRead: $err" } } $xml free close $fp } } proc CATVOTWrite {t fn} { upvar #0 $t T global $t global debug if {$debug(tcl,cat)} { puts stderr "CATVOTWriteFile" } if {$fn == {}} { return } set fp [open $fn w] set nr $T(Nrows) set nc $T(Ncols) puts $fp {<?xml version="1.0" encoding="UTF-8"?>} puts $fp {<VOTABLE version="1.1">} puts $fp {<RESOURCE>} puts $fp {<TABLE>} # header puts -nonewline $fp {<DESCRIPTION>} set nh [expr $T(HLines)-1] for {set hh 1} {$hh < $nh} {incr hh} { puts $fp [XMLQuote "$T(H_$hh)"] } puts $fp {</DESCRIPTION>} # cols for {set cc 1} {$cc <= $nc} {incr cc} { puts -nonewline $fp {<FIELD } # required puts -nonewline $fp "name=\"[XMLQuote [lindex $T(Header) [expr $cc-1]]]\" " # required if {[info exists ${t}(DataType)]} { puts -nonewline $fp "datatype=\"[XMLQuote [lindex $T(DataType) [expr $cc-1]]]\" " } else { puts -nonewline $fp "datatype=\"char\" arraysize=\"*\" " } if {[info exists ${t}(Id)]} { if {[lindex $T(Id) [expr $cc-1]] != {}} { puts -nonewline $fp "ID=\"[XMLQuote [lindex $T(Id) [expr $cc-1]]]\" " } } if {[info exists ${t}(ArraySize)]} { if {[lindex $T(ArraySize) [expr $cc-1]] != {}} { puts -nonewline $fp "arraysize=\"[XMLQuote [lindex $T(ArraySize) [expr $cc-1]]]\" " } } if {[info exists ${t}(Width)]} { if {[lindex $T(Width) [expr $cc-1]] != {}} { puts -nonewline $fp "width=\"[XMLQuote [lindex $T(Width) [expr $cc-1]]]\" " } } if {[info exists ${t}(Precision)]} { if {[lindex $T(Precision) [expr $cc-1]] != {}} { puts -nonewline $fp "precision=\"[XMLQuote [lindex $T(Precision) [expr $cc-1]]]\" " } } if {[info exists ${t}(Unit)]} { if {[lindex $T(Unit) [expr $cc-1]] != {}} { puts -nonewline $fp "unit=\"[XMLQuote [lindex $T(Unit) [expr $cc-1]]]\" " } } if {[info exists ${t}(Ref)]} { if {[lindex $T(Ref) [expr $cc-1]] != {}} { puts -nonewline $fp "ref=\"[XMLQuote [lindex $T(Ref) [expr $cc-1]]]\" " } } if {[info exists ${t}(Ucd)]} { if {[lindex $T(Ucd) [expr $cc-1]] != {}} { puts -nonewline $fp "ucd=\"[XMLQuote [lindex $T(Ucd) [expr $cc-1]]]\" " } } puts $fp {>} if {[info exists ${t}(Description)]} { if {[lindex $T(Description) [expr $cc-1]] != {}} { puts -nonewline $fp {<DESCRIPTION>} puts -nonewline $fp "[XMLQuote [lindex $T(Description) [expr $cc-1]]]" puts $fp {</DESCRIPTION>} } } puts $fp {</FIELD>} } # data puts $fp {<DATA>} puts $fp {<TABLEDATA>} for {set rr 1} {$rr <= $nr} {incr rr} { puts -nonewline $fp {<TR>} for {set cc 1} {$cc <= $nc} {incr cc} { puts -nonewline $fp "<TD>[XMLQuote $T($rr,$cc)]</TD>" } puts $fp {</TR>} } # clean up puts $fp {</TABLEDATA>} puts $fp {</DATA>} puts $fp {</TABLE>} puts $fp {</RESOURCE>} puts $fp {</VOTABLE>} close $fp } # Callbacks proc CATVOTCharCB {t data} { upvar #0 $t T global $t global debug switch -- $T(tree,state) { TD { set r $T(Nrows) set c $T(cnt) set T($r,$c) [string trim $data] } DESCRIPTION { set data [string trim $data] if {$data != {}} { switch -- $T(tree,prev) { VOTABLE - RESOURCE - TABLE { foreach ll [split [string trim $data] "\n"] { incr ${t}(HLines) set n $T(HLines) if {[string range $ll 0 0] == {#}} { set T(H_$n) "$ll" } else { set T(H_$n) "# $ll" } } } FIELD { set T(Description) \ [lreplace $T(Description) end end $data] } } } } } # sometimes, we get a bogus call, (ignore whitespace does not work) set T(tree,state) {} return {} } proc CATVOTElemStartCB {t name attlist args} { upvar #0 $t T global $t global debug switch -- $name { VOTABLE { # init db set T(Nrows) 0 set T(Ncols) 0 set T(Header) {} set T(HLines) 0 set T(tree,prev) $name } FIELD { set fname {} set id {} set datatype {} set arraysize {} set width {} set precision {} set unit {} set ref {} set ucd {} foreach {key value} $attlist { switch -- [string tolower $key] { name {set fname "$value"} id {set id "$value"} datatype {set datatype $value} arraysize {set arraysize $value} width {set width $value} precision {set precision $value} unit {set unit "$value"} ref {set ref "$value"} ucd {set ucd "$value"} } } lappend ${t}(Header) "$fname" lappend ${t}(Id) "$id" lappend ${t}(DataType) $datatype lappend ${t}(ArraySize) $arraysize lappend ${t}(Width) $width lappend ${t}(Precision) $precision lappend ${t}(Unit) "$unit" lappend ${t}(Ref) "$ref" lappend ${t}(Ucd) "$ucd" # filled in later lappend ${t}(Description) {} set T(tree,prev) $name } TABLEDATA { # ok, we now need to build the header incr ${t}(HLines) set n $T(HLines) set T(H_$n) [join $T(Header)] set T(Dashes) [regsub -all {[A-Za-z0-9]} $T(H_$n) {-}] set T(Ndshs) [llength $T(Header)] incr ${t}(HLines) set n $T(HLines) set T(H_$n) [join $T(Dashes)] starbase_colmap $t } TR { incr ${t}(Nrows) set T(cnt) 0 } TD { incr ${t}(cnt) set r $T(Nrows) set c $T(cnt) set T($r,$c) {} } RESOURCE - TABLE { set T(tree,prev) $name } FIELDref - DESCRIPTION - COOSYS - PARAM - PARAMref - INFO - LINK - GROUP - DATA - BINARY - STREAM - FITS - VALUES - MIN - MAX - OPTION - DEFINITIONS {} default {return -code error} } set ${t}(tree,state) $name return {} } proc CATVOTElemEndCB {t name args} { upvar #0 $t T global $t global debug # we can't count on this being called for all end-tags switch -- $name { TABLEDATA { # ok, we're done return -code break } VOTABLE - FIELD - FIELDref - TR - TD - RESOURCE - TABLE - DESCRIPTION - COOSYS - PARAM - PARAMref - INFO - LINK - GROUP - DATA - BINARY - STREAM - FITS - VALUES - MIN - MAX - OPTION - DEFINITIONS {} default {return -code error} } return {} } # SAMP proc CATVOTURL {url catalog title} { if {[string length $url] == 0} { return } ParseURL $url r switch -- $r(scheme) { ftp {CATVOTFTP $r(authority) $r(path)} file {CATVOTFile $r(path)} http - default {CATVOTHTTP $url $catalog $title} } } proc CATVOTFTP {host path} { global loadParam global ds9 global debug set ftp [ftp::Open $host "ftp" "-ds9@" -mode passive] if {$ftp > -1} { set fn "$ds9(tmpdir)/[file tail $path]" set ftp::VERBOSE $debug(tcl,ftp) set "ftp::ftp${ftp}(Output)" FTPLog ftp::Type $ftp binary if {[ftp::Get $ftp $path $fn]} { CATVOTFile $fn } ftp::Close $ftp if {[file exists $fn]} { catch {file delete -force $fn} } } } proc CATVOTHTTP {url catalog title} { global icat CATDialog catvot {} $catalog $title none set varname [lindex $icat(cats) end] upvar #0 $varname var global $varname set ${varname}(query) {} set ${varname}(url) $url set ${varname}(proc,parser) CATVOTParse CATLoad $varname } proc CATVOTFile {fn} { global icat CATDialog catvot {} {} {} none if {$fn != {}} { CATLoadFn [lindex $icat(cats) end] $fn CATVOTRead } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/centroid.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000005655 12514261632 017057� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CentroidDef {} { global centroid global icentroid set icentroid(top) .centroid set icentroid(mb) .centroidmb } proc CentroidDialog {} { global centroid global icentroid global ds9 # see if we already have a window visible if {[winfo exists $icentroid(top)]} { raise $icentroid(top) return } # create the window set w $icentroid(top) set mb $icentroid(mb) Toplevel $w $mb 6 [msgcat::mc {Centroid Parameters}] CentroidDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command CentroidApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command CentroidDestroyDialog EditMenu $mb icentroid UpdateCentroidDialog # Param set f [ttk::frame $w.param] slider $f.islider 1 100 [msgcat::mc {Iteration}] \ marker(centroid,iteration) [list CentroidApplyDialog] slider $f.rslider 0 50 [msgcat::mc {Radius}] \ marker(centroid,radius) [list CentroidApplyDialog] grid $f.islider -padx 2 -pady 2 -sticky ew grid $f.rslider -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command CentroidApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command CentroidDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true } proc CentroidDestroyDialog {} { global icentroid if {[winfo exists $icentroid(top)]} { destroy $icentroid(top) destroy $icentroid(mb) } } proc CentroidApplyDialog {} { global current global marker if {$current(frame) != {}} { $current(frame) marker centroid radius $marker(centroid,radius) $current(frame) marker centroid iteration $marker(centroid,iteration) } } proc UpdateCentroidDialog {} { global centroid global icentroid global current global marker global debug if {$debug(tcl,update)} { puts stderr "UpdateCentroidDialog" } if {[winfo exists $icentroid(top)]} { if {$current(frame) != {}} { set marker(centroid,radius) \ [$current(frame) get marker centroid radius] set marker(centroid,iteration) \ [$current(frame) get marker centroid iteration] } } } proc CentroidBackup {ch which} { puts $ch "$which marker centroid radius [$which get marker centroid radius]" puts $ch "$which marker centroid iteration [$which get marker centroid iteration]" } �����������������������������������������������������������������������������������saods9/ds9/library/circle.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000004705 12514261632 016504� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CircleDialog {varname} { upvar #0 $varname var global $varname global pmarker # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord # procs set var(proc,apply) CircleApply set var(proc,close) CircleClose set var(proc,coordCB) CircleCoordCB # base MarkerBaseCenterDialog $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisHistogramDialog $varname MarkerAnalysisPlot3dDialog $varname # init CircleEditCB $varname # callbacks $var(frame) marker $var(id) callback edit CircleEditCB $varname set f $var(top).param # Radius ttk::label $f.tradius -text [msgcat::mc {Radius}] ttk::entry $f.radius -textvariable ${varname}(radius) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list CircleEditCB $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat grid $f.tradius $f.radius $f.uradius -padx 2 -pady 2 -sticky w } # actions proc CircleClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback edit CircleEditCB MarkerBaseCenterClose $varname } proc CircleApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) circle radius $var(radius) \ $var(dcoord) $var(dformat) MarkerBaseCenterApply $varname } # callbacks proc CircleCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "CircleCoordCB" } MarkerAnalysisStatsSystem $varname MarkerAnalysisPlot3dSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname } proc CircleEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "CircleEditCB" } set var(radius) [$var(frame) get marker $var(id) circle radius \ $var(dcoord) $var(dformat)] } �����������������������������������������������������������saods9/ds9/library/colorbar.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000105740 12610232041 017034� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ColorbarDef {} { global colorbar global icolorbar global pcolorbar global ds9 set icolorbar(top) .clrbar set icolorbar(mb) .clrbarmb set icolorbar(vertical,width) 75 set icolorbar(horizontal,height) 45 set icolorbar(num) 1024 set icolorbar(start) $ds9(menu,start) set icolorbar(end) 0 set icolorbar(count) 0 set icolorbar(h5) 0 set icolorbar(h5,fn) [list h5_autumn.sao h5_bluered.sao h5_bone.sao h5_cool.sao h5_copper.sao h5_dkbluered.sao h5_gray.sao h5_green.sao h5_hot.sao h5_hsv.sao h5_jet.sao h5_pink.sao h5_spring.sao h5_summer.sao h5_winter.sao h5_yarg.sao h5_yellow.sao ] set icolorbar(matplotlib) 0 set icolorbar(matplotlib,fn) [list viridis.lut] set icolorbar(cubehelix) 0 set icolorbar(cubehelix,fn) [list ch05m151008.sao ch05m151010.sao ch05m151012.sao ch05m151410.sao ch05p151010.sao ch20m151010.sao - cubehelix0.sao cubehelix1.sao] set icolorbar(gist) 0 set icolorbar(gist,fn) [list gist_earth.sao gist_heat.sao gist_rainbow.sao gist_yarg.sao gist_gray.sao gist_ncar.sao gist_stern.sao] set icolorbar(topo) 0 set icolorbar(topo,fn) [list tpglarf.sao tpglhcf.sao tpglhwf.sao tpglpof.sao tpglarm.sao tpglhcm.sao tpglhwm.sao tpglpom.sao] set icolorbar(user) 0 set icolorbar(user,fn) {} set colorbar(lock) 0 set colorbar(size) 20 set colorbar(ticks) 11 set colorbar(map) grey set colorbar(invert) 0 set colorbar(numerics) 1 set colorbar(space) 0 set colorbar(orientation) horizontal set colorbar(tag) red set colorbar(font) helvetica set colorbar(font,size) 9 set colorbar(font,weight) normal set colorbar(font,slant) roman array set pcolorbar [array get colorbar] } proc CreateColorbar {} { global icolorbar global ds9 global canvas global view $ds9(canvas) create colorbar$ds9(visual)$ds9(depth) \ -colors 2048 \ -tag colorbar \ -anchor nw \ -helvetica $ds9(helvetica) \ -courier $ds9(courier) \ -times $ds9(times) $ds9(canvas) bind colorbar <Motion> [list ColorbarMotion %x %y] $ds9(canvas) bind colorbar <Enter> [list ColorbarEnter %x %y] $ds9(canvas) bind colorbar <Leave> [list ColorbarLeave] $ds9(canvas) bind colorbar <Button-1> [list ColorbarButton1 %x %y] $ds9(canvas) bind colorbar <B1-Motion> [list ColorbarMotion1 %x %y] $ds9(canvas) bind colorbar <ButtonRelease-1> [list ColorbarRelease1 %x %y] $ds9(canvas) bind colorbar <Double-1> [list ColorbarDouble1 %x %y] $ds9(canvas) bind colorbar <Double-ButtonRelease-1> \ [list ColorbarDoubleRelease1 %x %y] $ds9(canvas) bind colorbar <Key> [list ColorbarKey %K %A %x %y] $ds9(canvas) bind colorbar <KeyRelease> \ [list ColorbarKeyRelease %K %A %x %y] $ds9(canvas) create colorbarrgb$ds9(visual)$ds9(depth) \ -colors 2048 \ -tag colorbarrgb \ -anchor nw \ -helvetica $ds9(helvetica) \ -courier $ds9(courier) \ -times $ds9(times) $ds9(canvas) bind colorbarrgb <Motion> [list ColorbarMotion %x %y] $ds9(canvas) bind colorbarrgb <Enter> [list ColorbarEnter %x %y] $ds9(canvas) bind colorbarrgb <Leave> [list ColorbarLeave] LayoutColorbar } proc InitColorbar {} { global colorbar global current set current(colorbar) colorbar $current(colorbar) map "{$colorbar(map)}" $current(colorbar) invert $colorbar(invert) } proc ResetColormap {} { global colorbar global current global rgb $current(colorbar) reset if {$current(frame) != {} } { RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap [$current(colorbar) get colormap]] set colorbar(invert) [$current(colorbar) get invert] } LockColorCurrent UpdateColorDialog } proc LoadColormap {} { LoadColormapFile [OpenFileDialog colorbarfbox] } # used by backup proc LoadColormapFile {filename} { global colorbar global icolorbar global current global ds9 if {$filename != {}} { colorbar load "\{$filename\}" set id [colorbar get id] set colorbar(map) [colorbar get name] $ds9(mb).color.user add radiobutton \ -label "$colorbar(map)" \ -variable colorbar(map) \ -command [list ChangeColormapID $id] if {[winfo exists $icolorbar(top)]} { $icolorbar(mb).colormap.user add radiobutton \ -label "$colorbar(map)" \ -variable colorbar(map) \ -command [list ChangeColormapID $id] } incr icolorbar(count) ChangeColormapID $id } } proc SaveColormap {} { FileLast colorbarfbox [colorbar get file name] SaveColormapFile [SaveFileDialog colorbarfbox] } proc SaveColormapFile {filename} { if {$filename != {}} { colorbar save "\{$filename\}" } } proc LoadContrastBias {} { global dcolorbar set filename [OpenFileDialog contrastbiasfbox] if {$filename != {}} { if {![catch {set ch [open $filename r]}]} { set ll [gets $ch] close $ch set dcolorbar(contrast) [lindex $ll 0] set dcolorbar(bias) [lindex $ll 1] ApplyColormap } } } proc SaveContrastBias {} { global dcolorbar set filename [SaveFileDialog contrastbiasfbox] if {$filename != {}} { if {![catch {set ch [open $filename w]}]} { puts $ch "$dcolorbar(contrast) $dcolorbar(bias)" close $ch } } } proc ColorbarEnter {x y} { global current global ds9 global debug if {$debug(tcl,events)} { puts stderr "ColorbarEnter" } # check to see if this event was generated while processing other events if {$ds9(b1) || $ds9(sb1) || $ds9(cb1) || $ds9(csb1) || $ds9(b2) || $ds9(b3)} { return } $ds9(canvas) focus $current(colorbar) switch -- $current(colorbar) { colorbar {UpdateFrameInfoBox base} colorbarrgb {UpdateFrameInfoBox rgb} } } proc ColorbarLeave {} { global current global ds9 global debug if {$debug(tcl,events)} { puts stderr "ColorbarLeave" } # check to see if this event was generated while processing other events if {$ds9(b1) || $ds9(sb1) || $ds9(cb1) || $ds9(csb1) || $ds9(b2) || $ds9(b3)} { return } $ds9(canvas) focus {} ClearInfoBoxCoords } proc ColorbarMotion {x y} { global current global infobox global debug if {$debug(tcl,events)} { puts stderr "ColorbarMotion $x $y" } switch -- $current(colorbar) { colorbar { set infobox(value) [$current(colorbar) get value $x $y] } colorbarrgb { set vv [$current(colorbar) get value $x $y] switch -- $current(rgb) { red {set infobox(value,red) $vv} green {set infobox(value,green) $vv} blue {set infobox(value,blue) $vv} } } } } proc ColorbarKey {K A xx yy} { global current global ds9 # MacOSX and Ubuntu returns bogus values in xx,yy # calculate our own values set xx [expr {[winfo pointerx $ds9(canvas)] - [winfo rootx $ds9(canvas)]}] set yy [expr {[winfo pointery $ds9(canvas)] - [winfo rooty $ds9(canvas)]}] global debug if {$debug(tcl,events)} { puts stderr "ColorbarKey $K $A $xx $yy" } switch -- $current(mode) { colorbar { switch -- $K { Delete - BackSpace { $current(colorbar) tag delete $xx $yy if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } } } } } proc ColorbarKeyRelease {K A xx yy} { global current global ds9 # MacOSX and Ubuntu returns bogus values in xx,yy # calculate our own values set xx [expr {[winfo pointerx $ds9(canvas)] - [winfo rootx $ds9(canvas)]}] set yy [expr {[winfo pointery $ds9(canvas)] - [winfo rooty $ds9(canvas)]}] global debug if {$debug(tcl,events)} { puts stderr "ColorbarKeyRelease $K $A $xx $yy" } } proc ColorbarButton1 {x y} { global icolorbar global colorbar global ds9 global current global icursor global debug if {$debug(tcl,events)} { puts stderr "ColorbarButton1" } # let others know that the mouse is down set ds9(b1) 1 # turn off blinking cursor if {$icursor(timer)} { catch {after cancel $icursor(id)} set icursor(id) 0 } # are we on a tag? else create switch -- $current(mode) { colorbar {$current(colorbar) tag edit begin $x $y $colorbar(tag)} } } proc ColorbarMotion1 {x y} { global icolorbar global current global ds9 global debug if {$debug(tcl,events)} { puts stderr "ColorbarMotion1" } # abort if we are here by accident (such as a double click) if {($ds9(b1) == 0) && ($ds9(sb1) == 0) && ($ds9(cb1) == 0) && ($ds9(csb1) == 0)} { return } switch -- $current(mode) { colorbar { $current(colorbar) tag edit motion $x $y if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } } } proc ColorbarRelease1 {x y} { global icolorbar global current global icursor global ds9 global debug if {$debug(tcl,events)} { puts stderr "ColorbarRelease1" } # abort if we are here by accident (such as a double click) if {($ds9(b1) == 0) && ($ds9(sb1) == 0) && ($ds9(cb1) == 0) && ($ds9(csb1) == 0)} { return } # and turn on blinking cursor if needed if {$icursor(timer)} { CursorTimer } switch -- $current(mode) { colorbar { $current(colorbar) tag edit end $x $y if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } } # let others know that the mouse is up set ds9(b1) 0 set ds9(sb1) 0 set ds9(cb1) 0 set ds9(csb1) 0 } proc ColorbarDouble1 {x y} { global current global debug if {$debug(tcl,events)} { puts stderr "ColorbarDouble1" } switch -- $current(mode) { colorbar {ColorTagDialog $x $y} } } proc ColorbarDoubleRelease1 {x y} { global current global debug if {$debug(tcl,events)} { puts stderr "ColorbarDoubleRelease1" } } proc ColorbarButton3 {x y} { global icolorbar global current global rgb global icursor # turn off blinking cursor if {$icursor(timer)} { catch {after cancel $icursor(id)} set icursor(id) 0 } if {$current(frame) != {}} { # we need to hold the current frame, since we may be blinking set icolorbar(frame) $current(frame) $icolorbar(frame) colormap begin } } proc ColorbarMotion3 {x y} { global icolorbar global current global canvas # X sets bias set bias [expr double($x)/$canvas(width)] # Y sets contrast set contrast [expr double($y)/$canvas(height) * 10] RGBEvalLockColorbar [list $current(colorbar) adjust $contrast $bias] if {$icolorbar(frame) != {}} { # only update the current colorbar frame $icolorbar(frame) colormap motion [$current(colorbar) get colormap] } UpdateColorDialog } proc ColorbarRelease3 {x y} { global icolorbar global current global rgb global icursor # and turn on blinking cursor if needed if {$icursor(timer)} { CursorTimer } # only update the current colorbar frame if {$icolorbar(frame) != {}} { $icolorbar(frame) colormap end set icolorbar(frame) {} } LockColorCurrent UpdateColorDialog } proc ChangeColormapID {id} { global colorbar global current colorbar map $id if {$current(frame) != {} } { $current(frame) colormap [colorbar get colormap] set colorbar(map) [colorbar get name] set colorbar(invert) [colorbar get invert] } LockColorCurrent UpdateColorDialog } proc MatchColorCurrent {} { global current if {$current(frame) != {}} { MatchColor $current(frame) } } proc MatchColor {which} { global ds9 global current global colorbar set tt [$which get type] foreach ff $ds9(frames) { if {$ff != $which} { switch -- [$ff get type] { base - 3d { if {$tt != {rgb}} { $ff colormap [colorbar get colormap] } } rgb { if {$tt == {rgb}} { $ff colormap [colorbarrgb get colormap] } } } } } } proc LockColorCurrent {} { global current if {$current(frame) != {}} { LockColor $current(frame) } } proc LockColor {which} { global colorbar if {$colorbar(lock)} { MatchColor $which } } proc InvertColorbar {} { global colorbar global current $current(colorbar) invert $colorbar(invert) if {$current(frame) != {} } { $current(frame) colormap [$current(colorbar) get colormap] } LockColorCurrent UpdateColorDialog } proc UpdateColormapLevel {} { global icolorbar global current global debug if {$debug(tcl,update)} { puts stderr "UpdateColormapLevel" } if {$current(frame) != {}} { $current(colorbar) colormap level \ [$current(frame) get colormap level $icolorbar(num)] } else { $current(colorbar) colormap level } } proc UpdateColormapLevelMosaic {which x y sys} { global icolorbar global current global current global scale global debug if {$debug(tcl,update)} { puts stderr "UpdateColormapLevelMosaic" } if {$current(frame) == {}} { $current(colorbar) colormap level return } if {($current(frame) == $which) && ($scale(scope) == "local") && [$which has fits mosaic]} { set ext [$which get fits ext $sys $x $y] if {$current(ext) != $ext} { $current(colorbar) colormap level \ [$current(frame) get colormap level $icolorbar(num) $sys $x $y] } set current(ext) $ext } else { set current(ext) {} } } proc ColorFrameBackup {ch which} { puts $ch "$which colorbar tag \"\{[$which get colorbar tag]\}\"" puts $ch "colorbar tag \"\{[$which get colorbar tag]\}\"" } proc ColorbarSizeDialog {} { global colorbar global ds9 switch $ds9(wm) { x11 - win32 { if {[EntryDialog [msgcat::mc {Colorbar}] [msgcat::mc {Size}] 10 colorbar(size)]} { UpdateView } } aqua { # we have a race condition here. the main window needs focus # back from the dialog before UpdateView is run, otherwise, # our pretty blue buttons are not activated if {[EntryDialog [msgcat::mc {Colorbar}] [msgcat::mc {Size}] 10 colorbar(size)]} { after 100 UpdateView } } } } proc TicksDialog {} { global colorbar global ds9 switch $ds9(wm) { x11 - win32 { if {[EntryDialog [msgcat::mc {Colorbar}] [msgcat::mc {Number of Ticks}] 10 colorbar(ticks)]} { UpdateView } } aqua { # we have a race condition here. the main window needs focus # back from the dialog before UpdateView is run, otherwise, # our pretty blue buttons are not activated if {[EntryDialog [msgcat::mc {Colorbar}] [msgcat::mc {Number of Ticks}] 10 colorbar(ticks)]} { after 100 UpdateView } } } } proc OpenColorTag {} { LoadColorTag [OpenFileDialog colortagfbox] } proc LoadColorTag {fn} { global current if {$fn != {}} { $current(colorbar) tag load "\{$fn\}" if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } } proc SaveColorTag {} { global current set fn [SaveFileDialog colortagfbox] if {$fn != {}} { $current(colorbar) tag save "\{$fn\}" } } proc DeleteColorTag {} { global current $current(colorbar) tag delete if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } proc ColorTagDialog {x y} { global ds9 global current global colorbar global ed2 set w {.ctagd} set rr [$current(colorbar) get tag $x $y] set ed2(ok) 0 set ed2(id) [lindex $rr 0] set ed2(start) [lindex $rr 1] set ed2(stop) [lindex $rr 2] set ed2(color) [lindex $rr 3] DialogCreate $w [msgcat::mc {Color}] ed2(ok) # Param set f [ttk::frame $w.param] ttk::label $f.tstart -text [msgcat::mc {Start}] ttk::entry $f.start -textvariable ed2(start) -width 10 ttk::label $f.tstop -text [msgcat::mc {Stop}] ttk::entry $f.stop -textvariable ed2(stop) -width 10 ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color ed2 color {} grid $f.tstart $f.start -padx 2 -pady 2 -sticky w grid $f.tstop $f.stop -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { $current(colorbar) tag $ed2(id) $ed2(start) $ed2(stop) $ed2(color) if {$current(frame) != {}} { $current(frame) colormap [$current(colorbar) get colormap] } } set rr $ed2(ok) unset ed2 return $rr } proc ColormapDialog {} { global colorbar global icolorbar global dcolorbar global ds9 # see if we already have a window visible if {[winfo exists $icolorbar(top)]} { raise $icolorbar(top) return } # create the window set w $icolorbar(top) set mb $icolorbar(mb) Toplevel $w $mb 6 [msgcat::mc {Colormap Parameters}] ColormapDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Colormap}] -menu $mb.colormap $mb add cascade -label [msgcat::mc {Color}] -menu $mb.color menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command ApplyColormap $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Colormap}]..." \ -command LoadColormap $mb.file add command -label "[msgcat::mc {Save Colormap}]..." \ -command SaveColormap $mb.file add separator $mb.file add command -label "[msgcat::mc {Download Colormap}]..." \ -command {HV cpt CPT-CITY http://soliton.vm.bytemark.co.uk/pub/cpt-city} $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Contrast/Bias}]..."\ -command LoadContrastBias $mb.file add command -label "[msgcat::mc {Save Contrast/Bias}]..." \ -command SaveContrastBias $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Color Tags}]..."\ -command OpenColorTag $mb.file add command -label "[msgcat::mc {Save Color Tags}]..." \ -command SaveColorTag $mb.file add command -label "[msgcat::mc {Delete Color Tags}]..." \ -command DeleteColorTag $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command ColormapDestroyDialog EditMenu $mb icolorbar ColorMenu $mb.color colorbar tag {} menu $mb.colormap menu $mb.colormap.h5 menu $mb.colormap.matplotlib menu $mb.colormap.cubehelix menu $mb.colormap.gist menu $mb.colormap.topo menu $mb.colormap.user set id [colorbar list id] ColormapCreateMenu id $mb.colormap \ 0 $icolorbar(end) ColormapCreateMenu id $mb.colormap.h5 \ $icolorbar(h5) $icolorbar(matplotlib) ColormapCreateMenu id $mb.colormap.matplotlib \ $icolorbar(matplotlib) $icolorbar(cubehelix) ColormapCreateMenu id $mb.colormap.cubehelix \ $icolorbar(cubehelix) $icolorbar(gist) ColormapCreateMenu id $mb.colormap.gist \ $icolorbar(gist) $icolorbar(topo) ColormapCreateMenu id $mb.colormap.topo \ $icolorbar(topo) $icolorbar(user) ColormapCreateMenu id $mb.colormap.user \ $icolorbar(user) $icolorbar(count) $mb.colormap add separator $mb.colormap add cascade -label [msgcat::mc {h5utils}] \ -menu $mb.colormap.h5 $mb.colormap add cascade -label [msgcat::mc {Matplotlib}] \ -menu $mb.colormap.matplotlib $mb.colormap add cascade -label [msgcat::mc {Cubehelix}] \ -menu $mb.colormap.cubehelix $mb.colormap add cascade -label [msgcat::mc {Gist}] \ -menu $mb.colormap.gist $mb.colormap add cascade -label [msgcat::mc {Topographic}] \ -menu $mb.colormap.topo $mb.colormap add cascade -label [msgcat::mc {User}] \ -menu $mb.colormap.user $mb.colormap add separator $mb.colormap add checkbutton \ -label [msgcat::mc {Invert Colormap}] \ -variable colorbar(invert) -command InvertColorbar $mb.colormap add command -label [msgcat::mc {Reset Colormap}] \ -command ResetColormap UpdateColorDialog # Param set f [ttk::frame $w.param] slider $f.cslider 0. 10. [msgcat::mc {Contrast}] \ dcolorbar(contrast) [list AdjustColormap] slider $f.bslider 0. 1. [msgcat::mc {Bias}] \ dcolorbar(bias) [list AdjustColormap] grid $f.cslider -padx 2 -pady 2 -sticky ew grid $f.bslider -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 bind $f.cslider.slider <Button-1> BeginAdjustColormap bind $f.cslider.slider <ButtonRelease-1> EndAdjustColormap bind $f.bslider.slider <Button-1> BeginAdjustColormap bind $f.bslider.slider <ButtonRelease-1> EndAdjustColormap # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command ApplyColormap ttk::button $f.close -text [msgcat::mc {Close}] \ -command ColormapDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true } proc ColormapCreateMenu {varname which start stop} { upvar $varname var for {set ii $start} {$ii<$stop} {incr ii} { set jj [lindex $var $ii] set name [colorbar get name $jj] $which add radiobutton \ -label [msgcat::mc $name] \ -variable colorbar(map) -value $name \ -command "ChangeColormapID $jj" } } proc ColormapDestroyDialog {} { global icolorbar global dcolorbar if {[winfo exists $icolorbar(top)]} { destroy $icolorbar(top) destroy $icolorbar(mb) } unset dcolorbar } proc ApplyColormap {} { global dcolorbar global current global rgb RGBEvalLockColorbar [list $current(colorbar) adjust $dcolorbar(contrast) $dcolorbar(bias)] if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap [$current(colorbar) get colormap]] LockColorCurrent } } proc BeginAdjustColormap {} { global icolorbar global current global rgb set icolorbar(adjustok) 1 if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap begin] } } proc AdjustColormap {} { global icolorbar global dcolorbar global current global rgb if {[info exists icolorbar(adjustok)]} { RGBEvalLockColorbar [list $current(colorbar) adjust $dcolorbar(contrast) $dcolorbar(bias)] if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap motion [$current(colorbar) get colormap]] } } } proc EndAdjustColormap {} { global icolorbar global current global rgb if {[info exists icolorbar(adjustok)]} { unset icolorbar(adjustok) if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap end] LockColorCurrent } } } proc UpdateColorDialog {} { global icolorbar global dcolorbar global current global debug if {$debug(tcl,update)} { puts stderr "UpdateColorDialog" } if {[winfo exists $icolorbar(top)]} { set dcolorbar(contrast) [$current(colorbar) get contrast] set dcolorbar(bias) [$current(colorbar) get bias] set end [expr $icolorbar(end)+$icolorbar(start)] if {$current(frame) != {}} { switch -- [$current(frame) get type] { base - 3d { $icolorbar(mb).file entryconfig \ "[msgcat::mc {Load Colormap}]..." -state normal $icolorbar(mb).file entryconfig \ "[msgcat::mc {Save Colormap}]..." -state normal for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $icolorbar(mb).colormap entryconfig $ii -state normal } $icolorbar(mb).colormap entryconfig \ [msgcat::mc {h5utils}] -state normal $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Matplotlib}] -state normal $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Cubehelix}] -state normal $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Gist}] -state normal $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Topographic}] -state normal $icolorbar(mb).colormap entryconfig \ [msgcat::mc {User}] -state normal } rgb { $icolorbar(mb).file entryconfig \ "[msgcat::mc {Load Colormap}]..." -state disabled $icolorbar(mb).file entryconfig \ "[msgcat::mc {Save Colormap}]..." -state disabled for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $icolorbar(mb).colormap entryconfig $ii -state disabled } $icolorbar(mb).colormap entryconfig \ [msgcat::mc {h5utils}] -state disabled $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Matplotlib}] -state disabled $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Cubehelix}] -state disabled $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Gist}] -state disabled $icolorbar(mb).colormap entryconfig \ [msgcat::mc {Topographic}] -state disabled $icolorbar(mb).colormap entryconfig \ [msgcat::mc {User}] -state disabled } } } else { $icolorbar(mb).file entryconfig \ "[msgcat::mc {Load Colormap}]..." -state normal $icolorbar(mb).file entryconfig \ "[msgcat::mc {Save Colormap}]..." -state normal for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $icolorbar(mb).colormap entryconfig $ii -state normal } $icolorbar(mb).colormap entryconfig [msgcat::mc {h5utils}] \ -state normal $icolorbar(mb).colormap entryconfig [msgcat::mc {Matplotlib}] \ -state normal $icolorbar(mb).colormap entryconfig [msgcat::mc {Cubehelix}] \ -state normal $icolorbar(mb).colormap entryconfig [msgcat::mc {Gist}] \ -state normal $icolorbar(mb).colormap entryconfig [msgcat::mc {Topographic}] \ -state normal $icolorbar(mb).colormap entryconfig [msgcat::mc {User}] \ -state normal } } } proc LayoutColorbar {} { global colorbar global icolorbar global ds9 global canvas colorbar configure \ -size $colorbar(size) \ -ticks $colorbar(ticks) \ -numerics $colorbar(numerics) \ -space $colorbar(space) \ -font $colorbar(font) \ -fontsize $colorbar(font,size) \ -fontweight $colorbar(font,weight) \ -fontslant $colorbar(font,slant) \ colorbarrgb configure \ -size $colorbar(size) \ -ticks $colorbar(ticks) \ -numerics $colorbar(numerics) \ -space $colorbar(space) \ -font $colorbar(font) \ -fontsize $colorbar(font,size) \ -fontweight $colorbar(font,weight) \ -fontslant $colorbar(font,slant) \ switch -- $colorbar(orientation) { horizontal { set xx 0 set yy [expr $canvas(height) + $canvas(gap)] colorbar configure -x $xx -y $yy \ -width $canvas(width) \ -height $icolorbar(horizontal,height) \ -orientation 0 colorbarrgb configure -x $xx -y $yy \ -width $canvas(width) \ -height $icolorbar(horizontal,height) \ -orientation 0 } vertical { set xx [expr $canvas(width) + $canvas(gap)] set yy 0 colorbar configure -x $xx -y $yy \ -width $icolorbar(vertical,width) \ -height $canvas(height) \ -orientation 1 colorbarrgb configure -x $xx -y $yy \ -width $icolorbar(vertical,width) \ -height $canvas(height) \ -orientation 1 } } } proc ColorbarBackup {ch which} { global colorbar puts $ch "$which configure -size $colorbar(size)" puts $ch "$which configure -ticks $colorbar(ticks)" puts $ch "$which configure -numerics $colorbar(numerics)" puts $ch "$which configure -space $colorbar(space)" switch $colorbar(orientation) { horizontal {puts $ch "$which configure -orientation 0"} vertical {puts $ch "$which configure -orientation 1"} } puts $ch "$which configure -font $colorbar(font)" puts $ch "$which configure -fontsize $colorbar(font,size)" puts $ch "$which configure -fontweight $colorbar(font,weight)" puts $ch "$which configure -fontslant $colorbar(font,slant)" puts $ch "$which colorbar [$which get colorbar]" puts $ch "$which tag \"\{[$which get tag]\}\"" } proc ColormapFrameBackup {ch which} { switch -- [$which get type] { base - 3d { puts $ch "set sav \[colorbar get colorbar\]" puts $ch "colorbar colorbar [$which get colorbar]" puts $ch "$which colormap \[colorbar get colormap\]" puts $ch "colorbar colorbar \$sav" } rgb { puts $ch "set sav \[colorbarrgb get colorbar\]" puts $ch "colorbarrgb colorbar [$which get colorbar]" puts $ch "$which colormap \[colorbarrgb get colormap\]" puts $ch "colorbarrgb colorbar \$sav" } } } proc ColorbarBackupCmaps {ch dir} { global icolorbar set rdir "./[lindex [file split $dir] end]" # delete old cmaps foreach ff [glob -directory $dir -nocomplain "*.sao"] { catch {file delete -force $ff} } foreach ff [glob -directory $dir -nocomplain "*.lut"] { catch {file delete -force $ff} } # save any loaded cmaps set id [colorbar list id] if {$icolorbar(user)<[llength $id]} { for {set ii $icolorbar(user)} {$ii<[llength $id]} {incr ii} { set which [lindex $id $ii] set nn [lindex [file split [colorbar get file name $which]] end] colorbar save $which \"[file join $dir $nn]\" puts $ch "LoadColormapFile \"[file join $rdir $nn]\"" } } } # Process Cmds proc ProcessCmapCmd {varname iname} { upvar $varname var upvar $iname i global colorbar global current global ds9 global current global rgb # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { open {ColormapDialog} close {ColormapDestroyDialog} match { # backward compatibility MatchColorCurrent } lock { # backward compatibility incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set colorbar(lock) [FromYesNo [lindex $var $i]] } else { set colorbar(lock) 1 incr i -1 } LockColorCurrent } load - file { incr i set fn [lindex $var $i] LoadColormapFile $fn FileLast colormapfbox $fn } save { incr i set fn [lindex $var $i] SaveColormapFile $fn FileLast colormapfbox $fn } invert { incr i set colorbar(invert) [FromYesNo [lindex $var $i]] InvertColorbar } tag { incr i set item [string tolower [lindex $var $i]] switch $item { load {incr i; LoadColorTag [lindex $var $i]} save {incr i; $current(colorbar) tag save [lindex $var $i]} delete {DeleteColorTag} } } value { incr i set c [lindex $var $i] incr i set b [lindex $var $i] if {$current(frame) != {}} { RGBEvalLockColorbar [list $current(colorbar) adjust $c $b] RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap begin] RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap motion [$current(colorbar) get colormap]] RGBEvalLockCurrent rgb(lock,colorbar) [list $current(frame) colormap end] } LockColorCurrent UpdateColorDialog } default { switch -- [$current(frame) get type] { base - 3d { set cmap [lindex $var $i] # common variants on spellings switch -- [string tolower $cmap] { gray {set cmap grey} } set id [colorbar list id] set found 0 foreach ii $id { set title [colorbar get name $ii] if {[string equal -nocase $title $cmap]} { set colorbar(map) $title colorbar map "{$colorbar(map)}" $current(frame) colormap [colorbar get colormap] set colorbar(invert) [colorbar get invert] set found 1 break } } if {!$found} { Error "[msgcat::mc {Unknown Colormap}] $cmap" } } rgb {} } LockColorCurrent UpdateColorDialog } } } proc ProcessSendCmapCmd {proc id param} { global colorbar global current switch -- [string tolower $param] { file {$proc $id "[$current(colorbar) get file name]\n"} invert {$proc $id [ToYesNo $colorbar(invert)]} value {$proc $id "[$current(colorbar) get contrast] [$current(colorbar) get bias]\n"} lock {$proc $id [ToYesNo $colorbar(lock)]} {} {$proc $id "[$current(colorbar) get name]\n"} } } proc ProcessColorbarCmd {varname iname} { upvar $varname var upvar $iname i global colorbar global view set item [string tolower [lindex $var $i]] switch -- $item { match { # backward compatibility MatchColorCurrent } lock { # backward compatibility incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set colorbar(lock) [FromYesNo [lindex $var $i]] } else { set colorbar(lock) 1 incr i -1 } LockColorCurrent } numerics { incr i set yesno [string tolower [lindex $var $i]] set colorbar(numerics) [FromYesNo $yesno] UpdateView } space { incr i switch -- [string tolower [lindex $var $i]] { value {set item 1} default {set item 0} } set colorbar(space) $item UpdateView } font { incr i set item [string tolower [lindex $var $i]] set colorbar(font) $item UpdateView } fontsize { incr i set item [lindex $var $i] set colorbar(font,size) $item UpdateView } fontweight { incr i set item [string tolower [lindex $var $i]] set colorbar(font,weight) $item UpdateView } fontslant { incr i set item [string tolower [lindex $var $i]] set colorbar(font,slant) $item UpdateView } fontstyle { # backward compatibility incr i set item [string tolower [lindex $var $i]] switch $item { normal { set colorbar(font,weight) normal set colorbar(font,slant) roman } bold { set colorbar(font,weight) bold set colorbar(font,slant) roman } italic { set colorbar(font,weight) normal set colorbar(font,slant) italic } } UpdateView } orientation { incr i set item [string tolower [lindex $var $i]] set colorbar(orientation) $item UpdateView } vertical - horizontal { set colorbar(orientation) $item UpdateView } size { incr i set item [lindex $var $i] set colorbar(size) $item UpdateView } ticks { incr i set item [lindex $var $i] set colorbar(ticks) $item UpdateView } default { set yesno [string tolower [lindex $var $i]] set view(colorbar) [FromYesNo $yesno] UpdateView } } } proc ProcessSendColorbarCmd {proc id param} { global colorbar global view switch -- [string tolower [lindex $param 0]] { lock { #backward compatibility $proc $id [ToYesNo $colorbar(lock)] } orientation {$proc $id "$colorbar(orientation)\n"} numerics {$proc $id [ToYesNo $colorbar(numerics)]} space { if {$colorbar(space)} { $proc $id "value\n" } else { $proc $id "distance\n" } } font {$proc $id "$colorbar(font)\n"} fontsize {$proc $id "$colorbar(font,size)\n"} fontstyle - fontweight {$proc $id "$colorbar(font,weight)\n"} fontslant {$proc $id "$colorbar(font,slant)\n"} size {$proc $id "$colorbar(size)\n"} ticks {$proc $id "$colorbar(ticks)\n"} default {$proc $id [ToYesNo $view(colorbar)]} } } ��������������������������������saods9/ds9/library/comm.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000024247 12576612222 016204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # used to access ProcessSend*Cmd via tcl proc CommReturn {id rr} { return "$id $rr" } proc CommSet {fn paramlist} { global debug if {$debug(tcl,hv) || $debug(tcl,samp)} { puts stderr "CommSet:$fn:$paramlist" } set cmd [lindex $paramlist 0] set param [lrange $paramlist 1 end] set len 0 set i 0 catch { switch -- $cmd { 2mass {Process2MASSCmd param i} 3d {Process3DCmd param i} about {} align {ProcessAlignCmd param i} analysis {ProcessAnalysisCmd param i {} $fn} array {ProcessArrayCmd param i {} $fn} bg - background {ProcessBgCmd param i} backup {ProcessBackupCmd param i} blink {ProcessBlinkCmd param i} bin {ProcessBinCmd param i} block {ProcessBlockCmd param i} cat - catalog {ProcessCatalogCmd param i} cd {ProcessCDCmd param i} cmap {ProcessCmapCmd param i} colorbar {ProcessColorbarCmd param i} console {ProcessConsoleCmd param i} contours - contour {ProcessContourCmd param i} crop {ProcessCropCmd param i} crosshair {ProcessCrosshairCmd param i} cursor {ProcessCursorCmd param i} data {} datacube - cube {ProcessCubeCmd param i} dss - dsssao {ProcessSAOCmd param i} dsseso {ProcessESOCmd param i} dssstsci {ProcessSTSCICmd param i} envi {ProcessENVICmd param i {} $fn} export {ProcessExportCmd param i} file {ProcessFileCmd param i {} {} {}} fits {ProcessFitsCmd param i {} $fn} frame {ProcessFrameCmd param i} gif {ProcessGIFCmd param i {} $fn} grid {ProcessGridCmd param i} header {ProcessHeaderCmd param i} height {ProcessHeightCmd param i} iconify {ProcessIconifyCmd param i} iexam - imexam {} iis {ProcessIISCmd param i} irafalign { # backward compatibility ProcessIRAFAlignCmd param i } jpg - jpeg {ProcessJPEGCmd param i {} $fn} lock {ProcessLockCmd param i} lower {ProcessLowerCmd param i} magnifier {ProcessMagnifierCmd param i} mask {ProcessMaskCmd param i} match {ProcessMatchCmd param i} mecube {ProcessMECubeCmd param i {} $fn} minmax {ProcessMinMaxCmd param i} mode {ProcessModeCmd param i} mosaic {ProcessMosaicCmd param i {} $fn} mosaicimage {ProcessMosaicImageCmd param i {} $fn} mosaicwcs { # backward compatibility ProcessMosaicWCSCmd param i {} $fn } mosaiciraf { # backward compatibility ProcessMosaicIRAFCmd param i {} $fn } mosaicimagewcs { # backward compatibility ProcessMosaicImageWCSCmd param i {} $fn } mosaicimageiraf { # backward compatibility ProcessMosaicImageIRAFCmd param i {} $fn } mosaicimagewfpc2 { # backward compatibility ProcessMosaicImageWFPC2Cmd param i {} $fn } savempeg - movie {ProcessMovieCmd param i} memf - multiframe {ProcessMultiFrameCmd param i {} $fn} nameserver {ProcessNRESCmd param i} nan {ProcessNanCmd param i} nrrd {ProcessNRRDCmd param i {} $fn} nvss {ProcessNVSSCmd param i} orient {ProcessOrientCmd param i} {page setup} - pagesetup {ProcessPageSetupCmd param i} pspagesetup {ProcessPSPageSetupCmd param i} pan {ProcessPanCmd param i} pixeltable {ProcessPixelTableCmd param i} plot {ProcessPlotCmd param i {} $fn} png {ProcessPNGCmd param i {} $fn} prefs {ProcessPrefsCmd param i} preserve {ProcessPreserveCmd param i} print {ProcessPrintCmd param i} psprint {ProcessPSPrintCmd param i} exit - quit {ProcessQuitCmd param i} raise {ProcessRaiseCmd param i} restore {ProcessRestoreCmd param i} region - regions {ProcessRegionsCmd param i {} $fn} rgb {ProcessRGBCmd param i} rgbarray {ProcessRGBArrayCmd param i {} $fn} rgbcube {ProcessRGBCubeCmd param i {} $fn} rgbimage {ProcessRGBImageCmd param i {} $fn} rotate {ProcessRotateCmd param i} samp {ProcessSAMPCmd param i} savefits - save {ProcessSaveCmd param i} saveimage {ProcessSaveImageCmd param i} scale {ProcessScaleCmd param i} sfits { # backward compatibility ProcessSFitsCmd param i {} $fn } single {ProcessSingleCmd param i} shm {ProcessShmCmd param i 0} skyview {ProcessSkyViewCmd param i} sleep {ProcessSleepCmd param i} smosaic { # backward compatibility ProcessSMosaicCmd param i {} $fn } smosaicwcs { # backward compatibility ProcessSMosaicWCSCmd param i {} $fn } smosaiciraf { # backward compatibility ProcessSMosaicIRAFCmd param i {} $fn } smooth {ProcessSmoothCmd param i} source {ProcessSourceCmd param i} srgbcube {ProcessSRGBCubeCmd param i {} $fn} tcl {ProcessTclCmd param i {} $fn} theme { # backward compatibility ProcessThemeCmd param i } threads {ProcessThreadsCmd param i} tif - tiff {ProcessTIFFCmd param i {} $fn} tile {ProcessTileCmd param i} update {ProcessUpdateCmd param i} url {ProcessURLFitsCmd param i} version {} view {ProcessViewCmd param i} vla - first {ProcessVLACmd param i} vo {ProcessVOCmd param i} wcs {ProcessWCSCmd param i {} $fn} web {ProcessWebCmd param i} width {ProcessWidthCmd param i} xpa {ProcessXPACmd param i} zoom {ProcessZoomCmd param i} zscale {ProcessZScaleCmd param i} default {Error "[msgcat::mc {Unknown command}]: $cmd"} } } } proc CommGet {proc id paramlist fn} { global debug if {$debug(tcl,samp)} { puts stderr "CommGet:$proc:$id:$paramlist:$fn" } set cmd [lindex $paramlist 0] set param [lrange $paramlist 1 end] catch { switch -- $cmd { 2mass {ProcessSend2MASSCmd $proc $id $param} 3d {ProcessSend3DCmd $proc $id $param} about {ProcessSendAboutCmd $proc $id $param {} $fn} align {ProcessSendAlignCmd $proc $id $param} analysis {ProcessSendAnalysisCmd $proc $id $param {} $fn} array {ProcessSendArrayCmd $proc $id $param {} $fn} bg - background {ProcessSendBgCmd $proc $id $param} blink {ProcessSendBlinkCmd $proc $id $param} bin {ProcessSendBinCmd $proc $id $param} block {ProcessSendBlockCmd $proc $id $param} cat - catalog {ProcessSendCatalogCmd $proc $id $param {} $fn} cd {ProcessSendCDCmd $proc $id $param} cmap {ProcessSendCmapCmd $proc $id $param} colorbar {ProcessSendColorbarCmd $proc $id $param} console {} contours - contour {ProcessSendContourCmd $proc $id $param {} $fn} crop {ProcessSendCropCmd $proc $id $param} crosshair {ProcessSendCrosshairCmd $proc $id $param} cursor {} data {ProcessSendDataCmd $proc $id $param {} $fn} datacube - cube {ProcessSendCubeCmd $proc $id $param} dss - dsssao {ProcessSendSAOCmd $proc $id $param} dsseso {ProcessSendESOCmd $proc $id $param} dssstsci {ProcessSendSTSCICmd $proc $id $param} envi {} exit {} export {} file {ProcessSendFileCmd $proc $id $param} fits {ProcessSendFitsCmd $proc $id $param {} $fn} frame {ProcessSendFrameCmd $proc $id $param} gif {ProcessSendGIFCmd $proc $id $param {} $fn} grid {ProcessSendGridCmd $proc $id $param} header {} height {ProcessSendHeightCmd $proc $id $param} iconify {ProcessSendIconifyCmd $proc $id $param} iexam - imexam {ProcessSendIExamCmd $proc $id $param} iis {ProcessSendIISCmd $proc $id $param} irafalign { # backward compatibility ProcessSendIRAFAlignCmd $proc $id $param } jpg - jpeg {ProcessSendJPEGCmd $proc $id $param {} $fn} lock {ProcessSendLockCmd $proc $id $param} lower {} magnifier {ProcessSendMagnifierCmd $proc $id $param} mask {ProcessSendMaskCmd $proc $id $param} match {} mecube {ProcessSendMECubeCmd $proc $id $param {} $fn} minmax {ProcessSendMinMaxCmd $proc $id $param} mode {ProcessSendModeCmd $proc $id $param} mosaic {ProcessSendMosaicCmd $proc $id $param {} $fn} mosaicimage {ProcessSendMosaicImageCmd $proc $id $param {} $fn} mosaicwcs { # backward compatibility ProcessSendMosaicWCSCmd $proc $id $param {} $fn } mosaiciraf { # backward compatibility } mosaicimagewcs { # backward compatibility ProcessSendMosaicImageWCSCmd $proc $id $param {} $fn } mosaicimageiraf { # backward compatibility } mosaicimagewfpc2 { # backward compatibility } savempeg - movie {} memf - multiframe {} nameserver {ProcessSendNRESCmd $proc $id $param} nan {ProcessSendNanCmd $proc $id $param} nrrd {ProcessSendNRRDCmd $proc $id $param {} $fn} nvss {ProcessSendNVSSCmd $proc $id $param} orient {ProcessSendOrientCmd $proc $id $param} {page setup} - pagesetup {ProcessSendPageSetupCmd $proc $id $param} pan {ProcessSendPanCmd $proc $id $param} pixeltable {ProcessSendPixelTableCmd $proc $id $param {} $fn} plot {ProcessSendPlotCmd $proc $id $param} png {ProcessSendPNGCmd $proc $id $param {} $fn} prefs {ProcessSendPrefsCmd $proc $id $param} preserve {ProcessSendPreserveCmd $proc $id $param} pspagesetup {ProcessSendPSPageSetupCmd $proc $id $param} print {ProcessSendPrintCmd $proc $id $param} psprint {ProcessSendPSPrintCmd $proc $id $param} exit - quit {} raise {} region - regions {ProcessSendRegionsCmd $proc $id $param {} $fn} rgb {ProcessSendRGBCmd $proc $id $param} rgbarray {ProcessSendRGBArrayCmd $proc $id $param {} $fn} rgbcube {ProcessSendRGBCubeCmd $proc $id $param {} $fn} rgbimage {ProcessSendRGBImageCmd $proc $id $param {} $fn} rotate {ProcessSendRotateCmd $proc $id $param} samp {} savefits - save {} saveimage {} scale {ProcessSendScaleCmd $proc $id $param} sfits { # backward compatibility } single {ProcessSendSingleCmd $proc $id $param} shm {ProcessSendShmCmd $proc $id $param} skyview {ProcessSendSkyViewCmd $proc $id $param} smosaic { # backward compatibility } smosaiciraf { # backward compatibility } smosaicwcs { # backward compatibility } smooth {ProcessSendSmoothCmd $proc $id $param} source {} srgbcube {} tcl {} theme { # backward compatibility ProcessSendThemeCmd $proc $id $param } threads {ProcessSendThreadsCmd $proc $id $param} tif - tiff {ProcessSendTIFFCmd $proc $id $param {} $fn} tile {ProcessSendTileCmd $proc $id $param} update {} url {} version {ProcessSendVersionCmd $proc $id $param} view {ProcessSendViewCmd $proc $id $param} vla - first {ProcessSendVLACmd $proc $id $param} vo {ProcessSendVOCmd $proc $id $param} wcs {ProcessSendWCSCmd $proc $id $param} web {ProcessSendWebCmd $proc $id $param} width {ProcessSendWidthCmd $proc $id $param} xpa {} zscale {ProcessSendZScaleCmd $proc $id $param} zoom {ProcessSendZoomCmd $proc $id $param} default { Error "[msgcat::mc {Unknown command}]: $cmd" $proc $id {} } } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/command.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000047362 12616732023 016667� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc BadVisualError {} { global ds9 Error [msgcat::mc {Sorry, DS9 requires a Truecolor8, Truecolor16, Truecolor24 visual be available}] exit } proc ProcessCommandLineFirst {} { global argc global argv global icolorbar global ds9 global pds9 set i 0 while {$i < $argc} { set item [lindex $argv $i] switch -- $item { -help { puts "For more information, use --help" QuitDS9 } -debug {incr i; ProcessDebugTclCmd argv i} -private { # backward compatibility } -title { incr i set ds9(title) [lindex $argv $i] set t "SAOImage $ds9(title)" wm title $ds9(top) "$t" wm iconname $ds9(top) "$t" } -language { incr i set pds9(language) [lindex $argv $i] set pds9(language,name) [LanguageToName $pds9(language)] } -msg { incr i set pds9(language,dir) [lindex $argv $i] } -xpa {incr i; ProcessXPACmd argv i} } incr i } } proc ProcessCommandLine {} { global argc global argv ProcessCommand $argv $argc } proc ds9Cmd {argv} { ProcessCommand $argv [llength $argv] } proc ProcessCommand {argv argc} { global ds9 global pds9 global help global current global contour global colorbar global debug global wcs global view global grid global bin global scale global minmax global zscale global iis global file set file(type) fits set file(mode) {} set file(layer) {} set file(mosaic) wcs set load 0 set noopts 0 set i 0 # Note: -help is processed previously for fv (temporary) set item {} while {$i < $argc} { set item [lindex $argv $i] switch -- $item { -- {set noopts 1} -? - -help - --help {HelpCommand} -version { ProcessSendVersionCmd puts stdout {} QuitDS9 } -2mass {incr i; Process2MASSCmd argv i} -3d - -3D {incr i; Process3DCmd argv i} -about {ProcessSendAboutCmd puts stdout {} {} {}} -align {incr i; ProcessAlignCmd argv i} -analysis {incr i; ProcessAnalysisCmd argv i {} {}} -array {set file(type) array} -asinh {set scale(type) asinh; ChangeScale} -bg - -background {incr i; ProcessBgCmd argv i} -backup {incr i; ProcessBackupCmd argv i} -bin {incr i; ProcessBinCmd argv i} -block {incr i; ProcessBlockCmd argv i} -blink {incr i; ProcessBlinkCmd argv i} -blue {set current(rgb) blue; RGBChannel} -cat - -catalog {incr i; ProcessCatalogCmd argv i} -cd {incr i; ProcessCDCmd argv i} -cmap {incr i; ProcessCmapCmd argv i} -colorbar {incr i; ProcessColorbarCmd argv i} -console {ProcessConsoleCmd argv i} -contours - -contour {incr i; ProcessContourCmd argv i} -nocontour {set contour(view) 0; ContourUpdate} -crop {incr i; ProcessCropCmd argv i} -crosshair {incr i; ProcessCrosshairCmd argv i} -cursor {incr i; ProcessCursorCmd argv i} -datacube - -cube {incr i; ProcessCubeCmd argv i} -debug {incr i; ProcessDebugCmd argv i} -dss - -dsssao {incr i; ProcessSAOCmd argv i} -dsseso {incr i; ProcessESOCmd argv i} -dssstsci {incr i; ProcessSTSCICmd argv i} -envi {set file(type) envi} -export {incr i; ProcessExportCmd argv i} -exit - -quit {ProcessQuitCmd argv i} -frame {incr i; ProcessFrameCmd argv i} -fifo { incr i set fifo [lindex $argv $i] if {$fifo!="none"} { set iis(ififo) ${fifo}i set iis(ofifo) ${fifo}o } else { set iis(ififo) none set iis(ofifo) none } } -fifo_only { set iis(port) 0 set iis(unix) none } -file - -fits {set file(type) fits; CommandFitsCmd argv i} -geometry { # already processed } -gif {set file(type) gif} -green {set current(rgb) green; RGBChannel} -grid {incr i; ProcessGridCmd argv i} -nogrid {set grid(view) 0; GridUpdateCurrent} -header {incr i; ProcessHeaderCmd argv i} -height {incr i; ProcessHeightCmd argv i} -histequ {set scale(type) histequ; ChangeScale} -horzgraph { # backward compatibility set view(graph,horz) 1 UpdateView } -nohorzgraph { # backward compatibility set view(graph,horz) 0 UpdateView } -iconify {incr i; ProcessIconifyCmd argv i} -iis {incr i; ProcessIISCmd argv i} -info { # backward compatibility set view(info) 1 UpdateView } -noinfo { # backward compatibility set view(info) 0 UpdateView } -invert {set colorbar(invert) 1; InvertColorbar} -jpg - -jpeg {set file(type) jpeg} -language { # already processed incr i } -lock {incr i; ProcessLockCmd argv i} -linear {set scale(type) linear; ChangeScale} -log {set scale(type) log; ChangeScale} -lower {ProcessLowerCmd argv i} -magnifier {incr i; ProcessMagnifierCmd argv i} -nomagnifier { # backward compatibility set view(magnifier) 0 UpdateView } -mask {incr i; set file(layer) [ProcessMaskCmd argv i]} -nomask {set file(layer) {}} -match {incr i; ProcessMatchCmd argv i} -mecube {set file(type) mecube} -memf - -multiframe {set file(type) multiframe} -minmax {incr i; ProcessMinMaxCmd argv i} -minmaxmode { # backward compatibility incr i set minmax(mode) [lindex $argv $i] } -minmaxsample { # backward compatibility incr i } -mode {incr i; ProcessModeCmd argv i} -mosaic { set file(type) mosaic CommandMosaicCmd argv i } -mosaicimage { set file(type) mosaicimage CommandMosaicImageCmd argv i } -mosaicimageiraf { # backward compatibility set file(type) mosaicimage set file(mosaic) iraf } -mosaicimagewcs { # backward compatibility set file(type) mosaicimage set file(mosaic) wcs } -mosaicimagewfpc2 { # backward compatibility set file(type) mosaicimage set file(mosaic) wfpc2 } -mosaiciraf { # backward compatibility set file(type) mosaic set file(mosaic) iraf } -mosaicwcs { # backward compatibility set file(type) mosaic set file(mosaic) wcs } -savempeg - -movie {incr i; ProcessMovieCmd argv i} -msg { # already processed incr i } -nameserver {incr i; ProcessNRESCmd argv i} -nan {incr i; ProcessNanCmd argv i} -nrrd {set file(type) nrrd} -nvss {incr i; ProcessNVSSCmd argv i} -orient {incr i; ProcessOrientCmd argv i} -pagesetup {incr i; ProcessPageSetupCmd argv i} -pspagesetup {incr i; ProcessPSPageSetupCmd argv i} -pan {incr i; ProcessPanCmd argv i} -panner { # backward compatibility set view(panner) 1 UpdateView } -nopanner { # backward compatibility set view(panner) 0 UpdateView } -photo { # backward compatibility set file(type) tiff } -pixeltable {incr i; ProcessPixelTableCmd argv i} -nopixeltable {PixelTableDestroyDialog} -plot {incr i; ProcessPlotCmd argv i {} {}} -png {set file(type) png} -port {incr i; set iis(port) [lindex $argv $i]} -inet_only - -port_only { set iis(ififo) none set iis(ofifo) none set iis(unix) none } -pow {set scale(type) pow; ChangeScale} -prefs {incr i; ProcessPrefsCmd argv i} -preserve {incr i; ProcessPreserveCmd argv i} -print {incr i; ProcessPrintCmd argv i} -psprint {incr i; ProcessPSPrintCmd argv i} -private { #already processed } -raise {ProcessRaiseCmd argv i} -red {set current(rgb) red; RGBChannel} -region - -regions - -regionfile {incr i; ProcessRegionsCmd argv i {} {}} -restore {incr i; ProcessRestoreCmd argv i} -rgb {incr i; ProcessRGBCmd argv i} -rgbcube {set file(type) rgbcube} -srgbcube { # backward compatibility set file(type) srgbcube } -rgbimage {set file(type) rgbimage} -rgbarray {set file(type) rgbarray} -rotate {incr i; ProcessRotateCmd argv i} -samp {incr i; ProcessSAMPCmd argv i} -savefits - -save {incr i; ProcessSaveCmd argv i} -saveimage {incr i; ProcessSaveImageCmd argv i} -scale - -ztrans {incr i; ProcessScaleCmd argv i} -scalelims - -scalelimits { #backward compatibility incr i set scale(min) [lindex $argv $i] incr i set scale(max) [lindex $argv $i] ChangeScaleLimit } -scalemode { #backward compatibility incr i set scale(mode) [string tolower [lindex $argv $i]] ChangeScaleMode } -scalescope { #backward compatibility incr i set scale(scope) [string tolower [lindex $argv $i]] ChangeScaleScope } -sfits { # backward compatibility set file(type) sfits CommandSFitsCmd argv i } -shm {incr i; ProcessShmCmd argv i 1} -single {ProcessSingleCmd argv i} -sinh {set scale(type) sinh; ChangeScale} -skyview {incr i; ProcessSkyViewCmd argv i} -sleep {incr i; ProcessSleepCmd argv i} -slice {set file(mode) slice} -noslice {set file(mode) {}} -smooth {incr i; ProcessSmoothCmd argv i} -smosaic { # backward compatibility set file(type) smosaic CommandMosaicCmd argv i } -smosaiciraf { # backward compatibility set file(type) smosaic set file(mosaic) iraf } -smosaicwcs { # backward compatibility set file(type) smosaic set file(mosaic) wcs } -squared {set scale(type) squared; ChangeScale} -sqrt {set scale(type) sqrt; ChangeScale} -source {incr i; ProcessSourceCmd argv i} -tcl {incr i; set pds9(tcl) [FromYesNo [lindex $argv $i]]} -theme { # backward compatibility incr i; ProcessThemeCmd argv i } -threads {incr i; ProcessThreadsCmd argv i} -tif - -tiff {set file(type) tiff} -tile {incr i; ProcessTileCmd argv i} -title { #already processed incr i } -unix {incr i; set iis(unix) [lindex $argv $i]} -unix_only { set iis(ififo) none set iis(ofifo) none set iis(port) 0 } -url {set file(type) url} -update {incr i; ProcessUpdateCmd argv i} -vertgraph { #backward compatibility set view(graph,vert) 1 UpdateView } -novertgraph { #backward compatibility set view(graph,vert) 0 UpdateView } -view {incr i; ProcessViewCmd argv i} -visual { #already processed } -vla - -first {incr i; ProcessVLACmd argv i} -vo {incr i; ProcessVOCmd argv i} -wcs {incr i; ProcessWCSCmd argv i {} {}} -wcsformat { #backward compatibility incr i set wcs(format,) [lindex $argv $i] } -web {incr i; ProcessWebCmd argv i} -width {incr i; ProcessWidthCmd argv i} -xpa {incr i; ProcessXPACmd argv i} -z1 { #backward compatibility incr i set scale(min) [lindex $argv $i] ChangeScaleLimit } -z2 { #backward compatibility incr i set scale(max) [lindex $argv $i] ChangeScaleLimit } -zscale {incr i; ProcessZScaleCmd argv i} -zmax {set scale(mode) zmax; ChangeScaleMode} -zoom {incr i; ProcessZoomCmd argv i} default { # allow abc, -, and -[foo] but not -abc if {!$noopts && [regexp -- {^-[a-zA-Z]+} $item]} { puts stderr "[msgcat::mc {Unknown command}]: $item" puts stderr "[msgcat::mc {For more information, use --help}]" return } if {$load == 0} { StartLoad incr load } switch $ds9(wm) { x11 - aqua {CommandLineLoad $item argv i} win32 { # if win32 and envoked via DOS shell # we must expand wildcards ourselves if {[catch {glob $item} fns]} { # cygwin/double click/DOS Shell no wildcards CommandLineLoad $item argv i } else { # DOS Shell with wildcards foreach fn $fns { CommandLineLoad $fn argv i } } } } FinishLoadPre } } incr i } if {$load != 0} { FinishLoadPost } } proc CommandLineLoad {item argvname iname} { upvar $argvname argv upvar $iname i global file global current if {$current(frame) != {}} { switch -- [$current(frame) get type] { base {CommandLineLoadBase $item $argvname $iname} rgb {CommandLineLoadRGB $item $argvname $iname} 3d {CommandLineLoad3D $item $argvname $iname} } } else { CommandLineLoadBase $item $argvname $iname } SetFileLast $file(type) $item } proc CommandLineLoadBase {item argvname iname} { upvar 2 $argvname argv upvar 2 $iname i global file global ds9 switch -- $file(type) { fits { # under windows, a double click on a # data file comes here switch $ds9(wm) { x11 {} aqua {} win32 { # normalize for "abc" but not "-abc", "-", and "-[foo]" # otherwise, things get weird if {![regexp -- {^-} $item]} { set item [file normalize [file nativename $item]] } } } MultiLoad $file(layer) $file(mode) LoadFitsFile $item $file(layer) $file(mode) } url { MultiLoad $file(layer) $file(mode) LoadURLFits $item $file(layer) $file(mode) } rgbimage { CreateRGBFrame LoadRGBImageFile $item } rgbcube { CreateRGBFrame LoadRGBCubeFile $item } mecube { MultiLoad LoadMECubeFile $item } multiframe { MultiLoad LoadMultiFrameFile $item } mosaicimage { MultiLoad $file(layer) switch -- $file(mosaic) { iraf {LoadMosaicImageIRAFFile $item $file(layer)} wfpc2 {LoadMosaicImageWFPC2File $item} default {LoadMosaicImageWCSFile $item $file(layer) $file(mosaic)} } } mosaic { switch -- $file(mosaic) { iraf {LoadMosaicIRAFFile $item $file(layer)} default {LoadMosaicWCSFile $item $file(layer) $file(mosaic)} } } sfits { #backward compatibility incr i MultiLoad $file(layer) $file(mode) LoadSFitsFile $item [lindex $argv $i] $file(layer) $file(mode) } srgbcube { #backward compatibility CreateRGBFrame incr i LoadSRGBCubeFile $item [lindex $argv $i] } smosaic { #backward compatibility incr i switch -- $file(mosaic) { iraf {LoadSMosaicIRAFFile $item [lindex $argv $i] $file(layer)} default {LoadSMosaicWCSFile $item [lindex $argv $i] $file(layer) $file(mosaic)} } } array { MultiLoad $file(layer) ImportArrayFile $item $file(layer) } rgbarray { CreateRGBFrame ImportRGBArrayFile $item } nrrd { MultiLoad $file(layer) ImportNRRDFile $item $file(layer) } envi { MultiLoad set fn $item set fn2 [lindex $argv [expr $i+1]] if {$fn2 == {} || [string range $fn2 0 0] == {-}} { set fn2 [FindENVIDataFile $fn] } else { incr i } ImportENVIFile $fn $fn2 } gif - tiff - jpeg - png { MultiLoad {} $file(mode) ImportPhotoFile $item $file(mode) } } } proc CommandLineLoadRGB {item argvname iname} { upvar 2 $argvname argv upvar 2 $iname i global file switch -- $file(type) { fits {LoadFitsFile $item {} $file(mode)} url {LoadURLFits $item {} $file(mode)} rgbimage { MultiLoadRGB LoadRGBImageFile $item } rgbcube { MultiLoadRGB LoadRGBCubeFile $item } mecube {LoadMECubeFile $item} multiframe { # not supported } mosaicimage { switch -- $file(mosaic) { iraf {LoadMosaicImageIRAFFile $item {}} wfpc2 {LoadMosaicImageWFPC2File $item} default {LoadMosaicImageWCSFile $item {} $file(mosaic)} } } mosaic { switch -- $file(mosaic) { iraf {LoadMosaicIRAFFile $item {}} default {LoadMosaicWCSFile $item {} $file(mosaic)} } } sfits { #backward compatibility incr i LoadSFitsFile $item [lindex $argv $i] {} $file(mode) } srgbcube { #backward compatibility MultiLoadRGB incr i LoadSRGBCubeFile $item [lindex $argv $i] } smosaic { #backward compatibility incr i switch -- $file(mosaic) { iraf {LoadMosaicIRAFSFitsFile $item [lindex $argv $i] {}} default {LoadMosaicWCSSFitsFile $item [lindex $argv $i] {} $file(mosaic)} } } array {ImportArrayFile $item {}} rgbarray { MultiLoadRGB ImportRGBArrayFile $item } nrrd {ImportNRRDFile $item {}} envi {} gif - tiff - jpeg - png { MultiLoadRGB ImportPhotoFile $item $file(mode) } } } proc CommandLineLoad3D {item argvname iname} { upvar 2 $argvname argv upvar 2 $iname i global file switch -- $file(type) { fits { MultiLoad {} $file(mode) LoadFitsFile $item {} $file(mode) } url { MultiLoad {} $file(mode) LoadURLFits $item {} $file(mode) } rgbimage { CreateRGBFrame LoadRGBImageFile $item } rgbcube { CreateRGBFrame LoadRGBCubeFile $item } mecube { MultiLoad LoadMECubeFile $item } multiframe { MultiLoad LoadMultiFrameFile $item } mosaicimage { MultiLoad switch -- $file(mosaic) { iraf {LoadMosaicImageIRAFFile $item {}} wfpc2 {LoadMosaicImageWFPC2File $item} default {LoadMosaicImageWCSFile $item {} $file(mosaic)} } } mosaic { switch -- $file(mosaic) { iraf {LoadMosaicIRAFFile $item {}} default {LoadMosaicWCSFile $item {} $file(mosaic)} } } sfits { #backward compatibility incr i MultiLoad {} $file(mode) LoadSFitsFile $item [lindex $argv $i] {} $file(mode) } srgbcube { #backward compatibility CreateRGBFrame incr i LoadSRGBCubeFile $item [lindex $argv $i] } smosaic { #backward compatibility incr i switch -- $file(mosaic) { iraf {LoadMosaicIRAFSFitsFile $item [lindex $argv $i] {}} default {LoadMosaicWCSSFitsFile $item [lindex $argv $i] {} $file(mosaic)} } } array { MultiLoad ImportArrayFile $item {} } rgbarray { CreateRGBFrame ImportRGBArrayFile $item } nrrd { MultiLoad ImportNRRDFile $item {} } envi { set fn $item set fn2 [lindex $argv [expr $i+1]] if {$fn2 == {} || [string range $fn2 0 0] == {-}} { set fn2 [FindENVIDataFile $fn] } else { incr i } ImportENVIFile $fn $fn2 } gif - tiff - jpeg - png { MultiLoad {} $file(mode) ImportPhotoFile $item $file(mode) } } } proc CommandFitsCmd {varname iname} { upvar $varname var upvar $iname i global file set item [string tolower [lindex $var [expr $i+1]]] switch -- $item { mosaicimage - mosaic { set file(type) $item incr i set item [string tolower [lindex $var [expr $i+1]]] switch -- $item { wfpc2 {incr i; set file(mosaic) wfpc2} default {CommandMosaicType $item $iname} } } mecube - multiframe - rgbcube - rgbimage { set file(type) $item incr i } } } proc CommandSFitsCmd {varname iname} { upvar $varname var upvar $iname i global file set item [string tolower [lindex $var [expr $i+1]]] switch -- $item { mosaic { set file(type) smosaic incr i set item [string tolower [lindex $var [expr $i+1]]] switch -- $item { wfpc2 {incr i; set file(mosaic) wfpc2} default {CommandMosaicType $item $iname} } } rgbcube { set file(type) srgbcube incr i } } } proc CommandMosaicImageCmd {varname iname} { upvar $varname var upvar $iname i global file set item [string tolower [lindex $var [expr $i+1]]] switch -- $item { wfpc2 {incr i; set file(mosaic) wfpc2} default {CommandMosaicType $item $iname} } } proc CommandMosaicCmd {varname iname} { upvar $varname var upvar $iname i global file set item [string tolower [lindex $var [expr $i+1]]] CommandMosaicType $item $iname } proc CommandMosaicType {sys iname} { upvar 2 $iname i global file switch $sys { iraf - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz { incr i set file(mosaic) $sys } default {set file(mosaic) wcs} } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/compass.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000004707 12514261632 016712� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CompassDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set arrows [$var(frame) get marker $var(id) compass arrow] set var(narrow) [lindex $arrows 0] set var(earrow) [lindex $arrows 1] set labels [$var(frame) get marker $var(id) compass label] set var(north) [lindex $labels 0] set var(east) [lindex $labels 1] set s [$var(frame) get marker $var(id) compass system] set var(system) [lindex $s 0] set var(sky) [lindex $s 1] set var(skyformat) degrees # procs set var(which) compass set var(proc,apply) CompassApply set var(proc,close) CompassClose set var(proc,coordCB) CompassCoordCB # base MarkerBaseCenterDialog $varname set f $var(top).param # Labels ttk::label $f.ntitle -text [msgcat::mc {North}] ttk::entry $f.north -textvariable ${varname}(north) -width 13 ttk::checkbutton $f.narrow -variable ${varname}(narrow) \ -text [msgcat::mc {Arrow}] -command "CompassArrow $varname" ttk::label $f.etitle -text [msgcat::mc {East}] ttk::entry $f.east -textvariable ${varname}(east) -width 13 ttk::checkbutton $f.earrow -variable ${varname}(earrow) \ -text [msgcat::mc {Arrow}] -command "CompassArrow $varname" grid $f.ntitle $f.north $f.narrow -padx 2 -pady 2 -sticky w grid $f.etitle $f.east $f.earrow -padx 2 -pady 2 -sticky w } # actions proc CompassClose {varname} { upvar #0 $varname var global $varname MarkerBaseCenterClose $varname } proc CompassApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) compass label "\{$var(north)\}" "\{$var(east)\}" MarkerBaseCenterApply $varname } proc CompassArrow {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) compass arrow $var(narrow) $var(earrow) } # callbacks proc CompassCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "CompassCoordCB" } MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname $var(frame) marker $var(id) compass system $var(system) $var(sky) } ���������������������������������������������������������saods9/ds9/library/composite.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000006164 12514261632 017246� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CompositeDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set var(global) [$var(frame) get marker $var(id) composite global] # procs set var(proc,apply) CompositeApply set var(proc,close) CompositeClose set var(proc,coordCB) CompositeCoordCB # base MarkerBaseCenterDialog $varname # init MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback rotate CompositeRotateCB $varname set f $var(top).param # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] ttk::label $f.tcomp -text [msgcat::mc {Angle Complement}] ttk::label $f.comp -textvariable ${varname}(comp) -width 13 -anchor w ttk::label $f.ucomp -text [msgcat::mc {Degrees}] # Global ttk::label $f.tglobal -text [msgcat::mc {Global Properties}] ttk::checkbutton $f.global -variable ${varname}(global) \ -command "CompositeGlobal $varname" grid $f.tangle $f.angle x $f.uangle -padx 2 -pady 2 -sticky w grid $f.tcomp $f.comp x $f.ucomp -padx 2 -pady 2 -sticky w grid $f.tglobal $f.global -padx 2 -pady 2 -sticky w CompositeCompAngle $varname } # actions proc CompositeClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback rotate CompositeRotateCB MarkerBaseCenterClose $varname } proc CompositeApply {varname} { upvar #0 $varname var global $varname CompositeRotate $varname MarkerBaseCenterApply $varname } proc CompositeRotate {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) angle $var(angle) $var(system) $var(sky) CompositeCompAngle $varname } proc CompositeCompAngle {varname} { upvar #0 $varname var global $varname set comp [expr 360-$var(angle)] if {[::math::fuzzy::tge $comp 360]} { set comp [expr $comp - 360] } if {[::math::fuzzy::tlt $comp 0]} { set comp [expr $comp + 360] } set var(comp) $comp } proc CompositeGlobal {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) composite global $var(global) } # callbacks proc CompositeCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "CompositeCoordCB" } MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } proc CompositeRotateCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "CompositeRotateCB" } set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] CompositeCompAngle $varname } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/contour.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000070270 12620205542 016730� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ContourDef {} { global contour global icontour global pcontour set icontour(top) .ct set icontour(mb) .ctmb set contour(view) 0 set contour(copy) {} set contour(scale) linear set contour(log) 1000 set contour(mode) minmax set contour(min) {} set contour(max) {} # used for command line options set contour(init,scale) 0 set contour(init,mode) 0 set contour(init,limits) 0 set contour(method) block set contour(color) green set contour(width) 1 set contour(dash) 0 set contour(smooth) 4 set contour(numlevel) 5 set pcontour(view) $contour(view) set pcontour(method) $contour(method) set pcontour(color) $contour(color) set pcontour(width) $contour(width) set pcontour(dash) $contour(dash) set pcontour(smooth) $contour(smooth) set pcontour(numlevel) $contour(numlevel) } # special kludge to work around a infinit loop caused by cube.tcl and idletasks proc ContourUpdate {} { SetWatchCursor ContourUpdateNow UnsetWatchCursor } proc ContourUpdateNow {} { global contour global icontour global dcontour global current if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {$contour(view)} { ContourCheckParams if {[winfo exists $icontour(top)]} { set levels [$dcontour(txt) get 1.0 end] # remove endl and trim regsub -all "\n" $levels " " levels set levels [string trimright $levels " "] if {$levels == {}} { ContourGenerateDialog set levels [$dcontour(txt) get 1.0 end] # remove endl and trim regsub -all "\n" $levels " " levels set levels [string trimright $levels " "] } if {$levels != {} && [ContourCheckMinMax]} { $current(frame) contour create \ $contour(color) $contour(width) $contour(dash) \ $contour(method) $contour(numlevel) \ $contour(smooth) \ $contour(scale) $contour(log) $contour(mode) \ $contour(min) $contour(max) \ "\"$levels\"" } } else { set contour(scale) [$current(frame) get colorscale] set contour(log) [$current(frame) get colorscale log] set contour(mode) [$current(frame) get clip mode] set limits [$current(frame) get clip $contour(mode)] set contour(min) [lindex $limits 0] set contour(max) [lindex $limits 1] if {[ContourCheckMinMax]} { $current(frame) contour create \ $contour(color) $contour(width) $contour(dash) \ $contour(method) $contour(numlevel) \ $contour(smooth) \ $contour(scale) $contour(log) $contour(mode) \ $contour(min) $contour(max) \ "{}" } } } else { $current(frame) contour delete } } } } proc ContourCheckParams {} { global contour if {$contour(smooth) < 1} { set contour(smooth) 1 } if {$contour(numlevel) < 1} { set contour(numlevel) 1 } } proc ContourCheckMinMax {} { global contour if {$contour(min) != {} && $contour(max) != {} && !($contour(min) eq "nan") && !($contour(max) eq "nan") && [string is double $contour(min)] && [string is double $contour(max)] } { return 1 } else { return 0 } } proc ContourDialog {} { global contour global icontour global dcontour global current global ds9 # see if we already have a ctr window visible if {[winfo exists $icontour(top)]} { raise $icontour(top) return } # create the contour window set w $icontour(top) set mb $icontour(mb) Toplevel $w $mb 6 [msgcat::mc {Contour Parameters}] ContourDestroyDialog # local variables $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Color}] -menu $mb.color $mb add cascade -label [msgcat::mc {Width}] -menu $mb.width $mb add cascade -label [msgcat::mc {Scale}] -menu $mb.scale $mb add cascade -label [msgcat::mc {Limits}] -menu $mb.limit $mb add cascade -label [msgcat::mc {Method}] -menu $mb.method menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command ContourApplyDialog $mb.file add command -label [msgcat::mc {Generate}] \ -command ContourGenerateDialog $mb.file add command -label [msgcat::mc {Clear}] \ -command ContourOffDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Copy Contours}] \ -command ContourCCopyDialog $mb.file add command -label "[msgcat::mc {Paste Contours}]..." \ -command ContourCPasteDialog $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Contours}]..." \ -command ContourLoadDialog $mb.file add command -label "[msgcat::mc {Save Contours}]..." \ -command ContourSaveDialog $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Contour Levels}]..." \ -command ContourLoadLevels $mb.file add command -label "[msgcat::mc {Save Contour Levels}]..." \ -command ContourSaveLevels $mb.file add separator $mb.file add command -label [msgcat::mc {Convert to Polygons}] \ -command Contour2Polygons $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command ContourDestroyDialog menu $mb.edit $mb.edit add command -label [msgcat::mc {Cut}] \ -command ContourCutDialog -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command ContourCopyDialog -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -command ContourPasteDialog -accelerator "${ds9(ctrl)}V" ColorMenu $mb.color contour color ContourColorDialog WidthDashMenu $mb.width contour width dash \ ContourWidthDialog ContourDashDialog menu $mb.scale $mb.scale add radiobutton -label [msgcat::mc {Linear}] \ -variable contour(scale) -value linear $mb.scale add radiobutton -label [msgcat::mc {Log}] \ -variable contour(scale) -value log $mb.scale add radiobutton -label [msgcat::mc {Power}] \ -variable contour(scale) -value pow $mb.scale add radiobutton -label [msgcat::mc {Square Root}] \ -variable contour(scale) -value sqrt $mb.scale add radiobutton -label [msgcat::mc {Squared}] \ -variable contour(scale) -value squared $mb.scale add radiobutton -label {ASINH} \ -variable contour(scale) -value asinh $mb.scale add radiobutton -label {SINH} \ -variable contour(scale) -value sinh $mb.scale add radiobutton \ -label [msgcat::mc {Histogram Equalization}] \ -variable contour(scale) -value histequ $mb.scale add separator $mb.scale add command -label "[msgcat::mc {Log Exponent}]..." \ -command ContourLogDialog menu $mb.limit $mb.limit add radiobutton -label [msgcat::mc {Min Max}] \ -variable contour(mode) -value minmax -command ContourModeDialog $mb.limit add separator $mb.limit add radiobutton -label {99.5%} \ -variable contour(mode) -value 99.5 -command ContourModeDialog $mb.limit add radiobutton -label {99%} \ -variable contour(mode) -value 99 -command ContourModeDialog $mb.limit add radiobutton -label {98%} \ -variable contour(mode) -value 98 -command ContourModeDialog $mb.limit add radiobutton -label {95%} \ -variable contour(mode) -value 95 -command ContourModeDialog $mb.limit add radiobutton -label {90%} \ -variable contour(mode) -value 90 -command ContourModeDialog $mb.limit add separator $mb.limit add radiobutton -label {ZScale} \ -variable contour(mode) -value zscale -command ContourModeDialog $mb.limit add radiobutton -label {ZMax} \ -variable contour(mode) -value zmax -command ContourModeDialog $mb.limit add radiobutton -label [msgcat::mc {User}] \ -variable contour(mode) -value user -command ContourModeDialog menu $mb.method $mb.method add radiobutton -label [msgcat::mc {Block}] \ -variable contour(method) -value block $mb.method add radiobutton -label [msgcat::mc {Smooth}] \ -variable contour(method) -value smooth # Param set f [ttk::labelframe $w.param -text [msgcat::mc {Contour}] -padding 2] slider $f.nslider 0 50 [msgcat::mc {Levels}] contour(numlevel) {} slider $f.rslider 0 32 [msgcat::mc {Smoothness}] contour(smooth) {} ttk::label $f.title -text [msgcat::mc {Limits}] ttk::label $f.ltitle -text [msgcat::mc {Low}] ttk::entry $f.low -textvariable contour(min) -width 10 ttk::label $f.htitle -text [msgcat::mc {High}] ttk::entry $f.high -textvariable contour(max) -width 10 grid $f.nslider -columnspan 6 -padx 2 -pady 2 grid $f.rslider -columnspan 6 -padx 2 -pady 2 grid $f.title $f.ltitle $f.low $f.htitle $f.high -padx 2 -pady 2 # Levels set f [ttk::labelframe $w.levels -text [msgcat::mc {Levels}] -padding 2] set dcontour(txt) [text $f.text \ -wrap none \ -width 15 \ -height 10 \ -font [font actual TkDefaultFont] \ -yscrollcommand [list $f.yscroll set] \ ] ttk::scrollbar $f.yscroll -command [list $dcontour(txt) yview] \ -orient vertical grid $f.text $f.yscroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command ContourApplyDialog ttk::button $f.generate -text [msgcat::mc {Generate}] \ -command ContourGenerateDialog ttk::button $f.clear -text [msgcat::mc {Clear}] \ -command ContourOffDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command ContourDestroyDialog pack $f.apply $f.generate $f.clear $f.close \ -side left -expand true -padx 2 -pady 4 # Fini grid $w.param $w.levels -sticky news grid $w.buttons - -sticky ew grid rowconfigure $w 0 -weight 1 grid columnconfigure $w 1 -weight 1 UpdateContourDialog } proc ContourApplyDialog {} { global contour set contour(view) 1 ContourUpdate } proc ContourDestroyDialog {} { global contour global icontour global dcontour if {[winfo exists $icontour(top)]} { destroy $icontour(top) destroy $icontour(mb) } unset dcontour } proc ContourGenerateDialog {} { global contour global dcontour global current ContourCheckParams $dcontour(txt) delete 1.0 end if {$current(frame) != {}} { if {([$current(frame) has fits]) && [ContourCheckMinMax]} { set ll [$current(frame) get colorscale level $contour(numlevel) \ $contour(min) $contour(max) \ $contour(scale) $contour(log)] regsub -all " " "$ll" "\n" ll $dcontour(txt) insert end "$ll" } } } proc ContourOffDialog {} { global contour global current set contour(view) 0 if {$current(frame) != {}} { $current(frame) contour delete all } UpdateContourScale UpdateContourDialog } proc ContourCutDialog {} { global icontour global dcontour if {[winfo exists $icontour(top)]} { set w [focus -displayof $icontour(top)] if {$w == $dcontour(txt)} { tk_textCut $w } else { EntryCut $icontour(top) } } } proc ContourCopyDialog {} { global icontour global dcontour if {[winfo exists $icontour(top)]} { set w [focus -displayof $icontour(top)] if {$w == $dcontour(txt)} { tk_textCopy $w } else { EntryCopy $icontour(top) } } } proc ContourPasteDialog {} { global icontour global dcontour if {[winfo exists $icontour(top)]} { set w [focus -displayof $icontour(top)] if {$w == $dcontour(txt)} { tk_textPaste $w } else { EntryPaste $icontour(top) } } } proc ContourCCopyDialog {} { global contour global current set contour(copy) $current(frame) UpdateContourDialog } proc ContourCPasteDialog {} { global contour global current if {$current(frame) != {} && $contour(copy) != {}} { ContourParamsDialog paste {} } } proc ContourColorDialog {} { global contour global current if {$current(frame) != {}} { $current(frame) contour color $contour(color) } } proc ContourWidthDialog {} { global contour global current if {$current(frame) != {}} { $current(frame) contour width $contour(width) } } proc ContourDashDialog {} { global contour global current if {$current(frame) != {}} { $current(frame) contour dash $contour(dash) } } proc ContourModeDialog {} { global current global contour if {$current(frame) != {}} { set limits [$current(frame) get clip $contour(mode)] set contour(min) [lindex $limits 0] set contour(max) [lindex $limits 1] } } proc ContourLoadLevels {} { set fn [OpenFileDialog contourlevfbox] ContourLoadLevelsNow $fn } proc ContourLoadLevelsNow {fn} { global dcontour if {$fn != {}} { set id [open $fn r] $dcontour(txt) delete 1.0 end $dcontour(txt) insert end [read $id] close $id } } proc ContourSaveLevels {} { set fn [SaveFileDialog contourlevfbox] ContourSaveLevelsNow $fn } proc ContourSaveLevelsNow {fn} { global dcontour if {$fn != {}} { set id [open $fn w] puts -nonewline $id "[$dcontour(txt) get 1.0 end]" close $id } } proc ContourSaveDialog {} { global current set fn [SaveFileDialog contourfbox] if {$fn != {}} { if {$current(frame) != {}} { ContourParamsDialog save $fn } } } proc ContourLoadDialog {} { global current set fn [OpenFileDialog contourfbox] if {$fn != {}} { if {$current(frame) != {}} { ContourParamsDialog load $fn } } } proc Contour2Polygons {} { global current global contour if {$current(frame) != {}} { $current(frame) contour create polygon \ color = $contour(color) width = $contour(width) $current(frame) contour delete } } proc UpdateContourMenu {} { global contour global current global debug if {$debug(tcl,update)} { puts stderr "UpdateContourMenu" } if {($current(frame) == {})} { return } if {[$current(frame) has fits]} { set contour(view) [$current(frame) has contour] } if {[$current(frame) has fits] && [$current(frame) has contour]} { set contour(method) [$current(frame) get contour method] set contour(color) [$current(frame) get contour color] set contour(width) [$current(frame) get contour width] set contour(dash) [$current(frame) get contour dash] set contour(numlevel) [$current(frame) get contour number level] set contour(smooth) [$current(frame) get contour smooth] } UpdateContourScale } proc UpdateContourScale {} { global contour global current global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateContourScale" } if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {[$current(frame) has contour]} { set contour(scale) [$current(frame) get contour colorscale] set contour(log) [$current(frame) get contour colorscale log] set contour(mode) [$current(frame) get contour clip mode] set limits [$current(frame) get contour clip] set contour(min) [lindex $limits 0] set contour(max) [lindex $limits 1] } else { if {!($ds9(init) && $contour(init,scale))} { set contour(scale) [$current(frame) get colorscale] set contour(log) [$current(frame) get colorscale log] } if {!($ds9(init) && $contour(init,mode))} { set contour(mode) [$current(frame) get clip mode] } if {!($ds9(init) && $contour(init,limits))} { set limits [$current(frame) get clip $contour(mode)] set contour(min) [lindex $limits 0] set contour(max) [lindex $limits 1] } } } } } proc UpdateContourDialog {} { global contour global icontour global dcontour global current global debug if {$debug(tcl,update)} { puts stderr "UpdateContourDialog" } if {[winfo exists $icontour(top)]} { if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {[$current(frame) has contour]} { set levels [$current(frame) get contour level] regsub -all "\n" "$levels" " " levels set levels [join $levels "\n"] if {$levels != {}} { $dcontour(txt) delete 1.0 end $dcontour(txt) insert end $levels } else { ContourGenerateDialog } } else { ContourGenerateDialog } } } } } proc ContourLogDialog {} { global contour EntryDialog [msgcat::mc {Scale}] [msgcat::mc {Log Exponent}] 10 contour(log) } proc ContourParamsDialog {action fn} { global ds9 global current global contour global ed global wcs set w {.ctld} set ed(ok) 0 set ed(system) wcs set ed(sky) fk5 set ed(color) green set ed(width) 1 set ed(dash) 0 set ed(frame) $current(frame) SetCoordSystem ed system sky {} AdjustCoordSystem ed system DialogCreate $w [msgcat::mc {Contour Parameters}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.coordtitle -text [msgcat::mc {Coordinate System}] switch -- $action { paste { CoordMenuButton $f.coordbutton ed system 1 {} {} {} CoordMenuEnable $f.coordbutton.menu ed system 1 {} {} } load - save { CoordMenuButton $f.coordbutton ed system 1 sky {} {} CoordMenuEnable $f.coordbutton.menu ed system 1 sky {} } } ttk::label $f.colortitle -text [msgcat::mc {Color}] ColorMenuButton $f.colorbutton ed color {} ttk::label $f.widthtitle -text [msgcat::mc {Width}] ttk::menubutton $f.widthbutton -textvariable ed(width) \ -menu $f.widthbutton.menu WidthDashMenu $f.widthbutton.menu ed width dash {} {} grid $f.coordtitle $f.coordbutton -padx 2 -pady 2 -sticky w if {$action != "save"} { grid $f.colortitle $f.colorbutton -padx 2 -pady 2 -sticky w grid $f.widthtitle $f.widthbutton -padx 2 -pady 2 -sticky w } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set ed(color) [string tolower $ed(color)] switch -- $action { paste { if {$current(frame) == $contour(copy)} { set sys image set ed(system) image } else { switch -- $ed(system) { image - physical - detector - amplifier {set sys $ed(system)} default {set sys [lindex [$contour(copy) get wcs] 0]} } } set ptr [$contour(copy) contour copy $sys fk5] if {$ptr != {}} { $current(frame) contour paste $ed(color) \ $ed(width) $ed(dash) $ptr $ed(system) fk5 } } load { switch -- $ed(system) { image - physical - detector - amplifier {set sys $ed(system)} default {set sys [lindex [$current(frame) get wcs] 0]} } $current(frame) contour load $ed(color) $ed(width) $ed(dash) "\{$fn\}" $sys $ed(sky) } save { switch -- $ed(system) { image - physical - detector - amplifier {set sys $ed(system)} default {set sys [lindex [$current(frame) get wcs] 0]} } $current(frame) contour save "\{$fn\}" $sys $ed(sky) } } UpdateContourDialog } set rr $ed(ok) unset ed return $rr } proc ContourBackup {ch which fdir rdir} { switch [$which get type] { base - 3d {ContourBackupBase $ch $which $fdir $rdir} rgb {ContourBackupRGB $ch $which $fdir $rdir} } } proc ContourBackupBase {ch which fdir rdir} { if {[$which has contour]} { set color [$which get contour color] set width [$which get contour width] set dash [$which get contour dash] set method [$which get contour method] set numlevel [$which get contour number level] set smooth [$which get contour smooth] set scale [$which get contour colorscale] set log [$which get contour colorscale log] set mode [$which get contour clip mode] set limits [$which get contour clip] set levels [$which get contour level] puts $ch "$which contour create $color $width $dash $method $numlevel $smooth $scale $log $mode $limits \{\"$levels\"\}" } # delete old contours foreach ff [glob -directory $fdir -nocomplain "aux*.con"] { catch {file delete -force $ff} } $which contour aux head set ii 0 while {[$which has contour aux]} { set fn $fdir/aux${ii}.con set rfn $rdir/aux${ii}.con set color [$which get contour aux color] set width [$which get contour aux width] set dash [$which get contour aux dash] $which contour aux save \"$fn\" physical fk5 puts $ch "$which contour load $color $width $dash \{\"$rfn\"\} physical fk5" incr ii $which contour aux next } } proc ContourBackupRGB {ch which fdir rdir} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" ContourBackupBase $ch $which $fdir $rdir } $which rgb channel $sav puts $ch "$which rgb channel $sav" } proc PrefsDialogContour {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Contours}] lappend dprefs(tabs) [ttk::frame $w.contour] set f [ttk::labelframe $w.contour.param -text [msgcat::mc {Contours}]] ttk::label $f.mtitle -text [msgcat::mc {Method}] ttk::menubutton $f.method -textvariable pcontour(method) \ -menu $f.method.menu global pcontour ttk::label $f.ctitle -text [msgcat::mc {Color}] ColorMenuButton $f.color pcontour color {} ttk::label $f.wtitle -text [msgcat::mc {Width}] ttk::menubutton $f.width -textvariable pcontour(width) -menu $f.width.menu WidthDashMenu $f.width.menu pcontour width dash {} {} grid $f.mtitle $f.method -padx 2 -pady 2 -sticky w grid $f.ctitle $f.color -padx 2 -pady 2 -sticky w grid $f.wtitle $f.width -padx 2 -pady 2 -sticky w set m $f.method.menu menu $m $m add radiobutton -label [msgcat::mc {Block}] \ -variable pcontour(method) -value block $m add radiobutton -label [msgcat::mc {Smooth}] \ -variable pcontour(method) -value smooth pack $f -side top -fill both -expand true } proc ProcessContourCmd {varname iname} { upvar $varname var upvar $iname i global contour global current # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { open {ContourDialog} close {ContourDestroyDialog} clear {ContourOffDialog} load { incr i set fn [lindex $var $i] incr i set sys [lindex $var $i] incr i set sky [lindex $var $i] incr i set color [lindex $var $i] incr i set width [lindex $var $i] incr i set dash [lindex $var $i] incr i [ProcessContourFix sys sky color width dash] if {$fn != {}} { $current(frame) contour load \ $color $width $dash "\{$fn\}" $sys $sky } FileLast contourfbox $fn UpdateContourDialog } save { incr i set fn [lindex $var $i] incr i set sys [lindex $var $i] incr i set sky [lindex $var $i] incr i set color {} incr i set width {} incr i set dash {} incr i [ProcessContourFix sys sky color width dash] if {$fn != {}} { $current(frame) contour save "\{$fn\}" $sys $sky } FileLast contourfbox $fn } convert {Contour2Polygons} loadlevels { ContourDialog incr i ContourLoadLevelsNow [lindex $var $i] ContourUpdate } savelevels { ContourDialog incr i ContourSaveLevelsNow [lindex $var $i] } copy {ContourCCopyDialog} paste { incr i set sys [lindex $var $i] incr i set sky [lindex $var $i] incr i set color [lindex $var $i] incr i set width [lindex $var $i] incr i set dash [lindex $var $i] incr i [ProcessContourFix sys sky color width dash] if {$current(frame) != {} && $contour(copy) != {}} { set ptr [$contour(copy) contour copy $sys $sky] if {$ptr != {}} { $current(frame) contour paste \ $color $width $dash $ptr $sys $sky } } } color { incr i set contour(color) [lindex $var $i] ContourColorDialog } width { incr i set contour(width) [lindex $var $i] ContourWidthDialog } dash { incr i set contour(dash) [FromYesNo [lindex $var $i]] ContourDashDialog } smooth { ContourDialog incr i set contour(smooth) [lindex $var $i] ContourGenerateDialog ContourUpdate } method { ContourDialog incr i set contour(method) [lindex $var $i] ContourGenerateDialog ContourUpdate } nlevels { ContourDialog incr i set contour(numlevel) [lindex $var $i] ContourGenerateDialog ContourUpdate } scale { set contour(init,scale) 1 ContourDialog incr i set contour(scale) [string tolower [lindex $var $i]] ContourGenerateDialog ContourUpdate } log { set contour(init,scale) 1 ContourDialog incr i switch -- [string tolower [lindex $var $i]] { exp { incr i set contour(log) [string tolower [lindex $var $i]] } default { incr i -1 set contour(log) [string tolower [lindex $var $i]] } } ContourGenerateDialog ContourUpdate } mode { set contour(init,mode) 1 ContourDialog incr i set contour(mode) [lindex $var $i] ContourModeDialog ContourGenerateDialog ContourUpdate } limits { set contour(init,limits) 1 ContourDialog incr i set contour(min) [lindex $var $i] incr i set contour(max) [lindex $var $i] ContourGenerateDialog ContourUpdate } levels { ContourDialog global dcontour $dcontour(txt) delete 1.0 end incr i $dcontour(txt) insert end [lindex $var $i] ContourUpdate } generate { ContourDialog ContourGenerateDialog ContourUpdate } yes - true - on - 1 - no - false - off - 0 { set contour(view) [FromYesNo [lindex $var $i]] ContourUpdate } default { set contour(view) 1 ContourUpdate incr i -1 } } } proc ProcessContourFix {sysname skyname colorname widthname dashname} { upvar $sysname sys upvar $skyname sky upvar $colorname color upvar $widthname width upvar $dashname dash global current set rr 0 switch -- $sys { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {} default { set dash $width set width $color set color $sky set sky $sys if {[$current(frame) has wcs wcs]} { set sys wcs } else { set sys physical } incr rr -1 } } switch -- $sky { fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic {} default { set dash $width set width $color set color $sky set sky fk5 incr rr -1 } } switch -- $color { white - black - red - green - blue - cyan - magenta - yellow {} default { if {[string range $color 0 0] != "#"} { set dash $width set width $color set color green incr rr -1 } } } if {![string is integer $width] || $width == {}} { set dash $width set width 1 incr rr -1 } switch -- $dash { yes - no - on - off - true - false - 0 - 1 {set dash [FromYesNo $dash]} default { set dash 0 incr rr -1 } } return $rr } proc ProcessSendContourCmd {proc id param sock fn} { global contour switch -- [lindex $param 0] { {} {$proc $id [ToYesNo $contour(view)]} color {$proc $id "$contour(color)\n"} width {$proc $id "$contour(width)\n"} dash {$proc $id [ToYesNo $contour(dash)]} smooth {$proc $id "$contour(smooth)\n"} method {$proc $id "$contour(method)\n"} nlevels {$proc $id "$contour(numlevel)\n"} scale {$proc $id "$contour(scale)\n"} log - {log exp} {$proc $id "$contour(log)\n"} mode {$proc $id "$contour(mode)\n"} limits {$proc $id "$contour(min) $contour(max)\n"} levels { global dcontour ContourDialog $proc $id "[$dcontour(txt) get 1.0 end]" } default { global current if {$current(frame) != {}} { ProcessSend $proc $id $sock $fn {.con} \ [$current(frame) get contour [lindex $param 0] [lindex $param 1]] } } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/convert.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000011567 12464211203 016720� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 set M_PI 3.14159265358979323846 # hours to degrees proc h2d {h} { return [expr ($h + 0.0) * 15.0] } # degrees to hours proc d2h {d} { return [expr ($d + 0.0) / 15.0] } # degrees to radians -- returns 0 <= r < PI proc d2r {d} { global M_PI while {[::math::fuzzy::tge $d 360.0]} { set d [expr $d - 360.0] } return [expr ($d + 0.0) * ($M_PI / 360.0)] } # radians to degrees -- returns 0 <= d < PI proc r2d {r} { global M_PI while {[::math::fuzzy::tge $r $M_PI]} { set r [expr $r - $M_PI] } return [expr ($r + 0.0) * (360.0 / $M_PI)] } # # strtod -- convert string to double # # Supports sexagesimal values: # 12:30:45.6 12h30m45.6s 12d30m45.6s "12 30 45.6" # Supports 12.5d (degrees) 12.5r (radians) # # A hidden global _strtod returns the number of arguments in the input. # if this value is 3 or 4, then hms or dms was input. This can be used # to determine that hms was input for ra so that you can convert hours # to degrees. # # set _strtod 0 proc strtod {d} { global _strtod set d [string trim $d] set d [string trimleft $d 0] if { $d == {} } { set d 0 } if { [string first - $d] >= 0 } { set sign "-" regsub -all -- "-" $d {} d } elseif { [string first + $d] >= 0 } { set sign {} regsub -all -- {\+} $d {} d } else { set sign {} } regsub -all {[ \t]*[hms][ \t]*} $d ":" d set arglist [split $d ": "] set _strtod 0 foreach arg $arglist { set args($_strtod) [string trimleft $arg 0] if { $args($_strtod) == {} } { set args($_strtod) 0 } incr _strtod } switch $_strtod { 2 { error "ERROR: strtod h:m:s|d:m:s|d" } 3 { set d [expr double($args(0)) + 0.0]; set m [expr double($args(1)) + 0.0]; set s [expr double($args(2)) + 0.0]; } 4 { set d [expr double($args(0)) + 0.0]; set m [expr double($args(1)) + 0.0]; set s [expr double($args(2)) + 0.0]; } default { set c [string range $d end end] if { $c == "r" } { set d [string trimright $d r] set d [r2d $d] } elseif { $c == "d" } { set d [string trimright $d d] } set m 0 set s 0 } } set val [expr $d + ($m / 60.0) + ($s / 3600.0)] # we don't want this. it rounds off to a precision of 6, which can # cause problems with h:m:s to degree convertions # set val [format "%s%g" $sign $val] set val "$sign$val" return $val } # # _uformat -- primative unit format converter to convert a float to a string # output format can be: # # or : (output in sexagesimal) or d (output in decimal) # proc _uformat {oformat value} { if { $value < 0.0 } { set sign "-" set d [expr -$value] } else { set sign {} set d $value } switch $oformat { {#} { set m [expr ($d - (int($d))) * 60] if { $m < 0 } { set m 0.0 } set s [expr ($m - (int($m))) * 60] if { $s < 0 } { set s 0.0 } return [format "%s%d %d %.3f" \ $sign [expr int($d)] [expr int($m)] $s] } : { set m [expr ($d - (int($d))) * 60] if { $m < 0 } { set m 0.0 } set s [expr ($m - (int($m))) * 60] if { $s < 0 } { set s 0.0 } return [format "%s%d:%d:%.3f" \ $sign [expr int($d)] [expr int($m)] $s] } d { return [format "%s%f" $sign $d] } } } # # uformat -- unit format converter # # uformat input_format output_format value # # where input format can be: # h (hours) d (degrees) m (minutes) s (seconds) # and output format can be the same, with a suffix of: # # or : (output in sexagesimal) or d (output in decimal) # proc uformat {iformat oformat value} { set itype [string index $iformat 0] set otype [string index $oformat 0] set oform [string index $oformat 1] if { $oform == {} } { set oform d } set value [strtod $value] switch $itype { h { switch $otype { h {return [_uformat $oform $value]} d {return [_uformat $oform [h2d $value]]} m {return [_uformat $oform [h2d $value]*60]} s {return [_uformat $oform [h2d $value]*60*60]} } } d { switch $otype { h {return [_uformat $oform [d2h $value]]} d {return [_uformat $oform $value]} m {return [_uformat $oform [expr $value*60]]} s {return [_uformat $oform [expr $value*60*60]]} } } m { switch $otype { h {return [_uformat $oform [d2h $value/60]]} d {return [_uformat $oform [expr $value/60]]} m {return [_uformat $oform $value]} s {return [_uformat $oform [expr $value*60]]} } } s { switch $otype { h {return [_uformat $oform [h2d $value/60/60]]} d {return [_uformat $oform [expr $value/60/60]]} m {return [_uformat $oform [expr $value/60]]} s {return [_uformat $oform $value]} } } } } �����������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/coord.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000011606 12527716223 016354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CoordDef {} { global pcoord # prefs only set pcoord(filename) 0 set pcoord(value) 1 set pcoord(image) 1 set pcoord(physical) 0 set pcoord(amplifier) 0 set pcoord(detector) 0 set pcoord(wcs) 1 foreach l {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} { set "pcoord(wcs$l)" 0 } } proc SetCoordSystem {varname system sky skyformat} { upvar #0 $varname var global $varname global current switch $var(system) { image - physical - detector - amplifier {} default { if {$current(frame) != {}} { set rr [$current(frame) get wcs] set var($system) [lindex $rr 0] if {$sky != {}} { set var($sky) [lindex $rr 1] } if {$skyformat != {}} { set var($skyformat) [lindex $rr 2] } } } } } proc AdjustCoordSystem {varname system} { upvar #0 $varname var global $varname global current switch -- $var($system) { image - physical - amplifier - detector {} wcs { if {$current(frame) != {}} { if {![$current(frame) has wcs $var($system)]} { set ${varname}($system) physical } } } default { if {$current(frame) != {}} { if {![$current(frame) has wcs $var($system)]} { if {[$current(frame) has wcs wcs]} { set ${varname}($system) wcs } else { set ${varname}($system) physical } } } } } } proc AdjustCoordSystem3d {varname system} { upvar #0 $varname var global $varname global current switch -- $var($system) { image {} wcs { if {$current(frame) != {}} { if {![$current(frame) has wcs 3d $var($system)]} { set ${varname}($system) image } } } default { if {$current(frame) != {}} { if {![$current(frame) has wcs 3d $var($system)]} { if {[$current(frame) has wcs wcs]} { set ${varname}($system) wcs } else { set ${varname}($system) image } } } } } } proc DisplayCoordDialog {which x y} { global pcoord global wcs set r {} if {$pcoord(filename)} { append r "[$which get fits file name full]" } foreach l {{} 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} { if {"$pcoord(wcs$l)" && [$which has wcs "wcs$l"]} { set cd "[$which get coordinates $x $y wcs$l $wcs(sky) $wcs(skyformat)]" if {[$which has wcs equatorial "wcs$l"]} { append r " [lindex $cd 0] [lindex $cd 1] $wcs(sky)" } else { set name [$which get wcs name "wcs$l"] if {$name != {}} { append r " [lindex $cd 0] [lindex $cd 1] $name" } else { append r " [lindex $cd 0] [lindex $cd 1] [lindex $cd 3]" } } } } if {$pcoord(detector) && [$which has detector]} { append r " [$which get coordinates $x $y detector] detector" } if {$pcoord(amplifier) && [$which has amplifier]} { append r " [$which get coordinates $x $y amplifier] amplifier" } if {$pcoord(physical) && [$which has physical]} { append r " [$which get coordinates $x $y physical] physical" } if {$pcoord(image)} { append r " [$which get coordinates $x $y image]" } if {$pcoord(value)} { append r " [$which get value canvas $x $y]" } append r " \n" SimpleTextDialog coordtxt [msgcat::mc {Coordinates}] \ 80 20 append bottom "$r" } proc PrefsDialogCoord {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Print Coordinates}] lappend dprefs(tabs) [ttk::frame $w.coord] # Print set f [ttk::labelframe $w.coord.print -text [msgcat::mc {Print}]] ttk::checkbutton $f.filename -text [msgcat::mc {Filename}] \ -variable pcoord(filename) ttk::checkbutton $f.value -text [msgcat::mc {Value}] \ -variable pcoord(value) ttk::checkbutton $f.wcs -text [msgcat::mc {WCS}] -variable pcoord(wcs) ttk::menubutton $f.mwcs -text [msgcat::mc {Multiple WCS}] -menu $f.mwcs.menu ttk::checkbutton $f.image -text [msgcat::mc {Image}] \ -variable pcoord(image) ttk::checkbutton $f.physical -text [msgcat::mc {Physical}] \ -variable pcoord(physical) ttk::checkbutton $f.amplifier -text [msgcat::mc {Amplifier}] \ -variable pcoord(amplifier) ttk::checkbutton $f.detector -text [msgcat::mc {Detector}] \ -variable pcoord(detector) set m $f.mwcs.menu menu $m foreach l {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} { $m add checkbutton -label "[msgcat::mc {WCS}] $l" \ -variable "pcoord(wcs$l)" } grid $f.filename -padx 2 -pady 2 -sticky w grid $f.value -padx 2 -pady 2 -sticky w grid $f.wcs $f.mwcs -padx 2 -pady 2 -sticky w grid $f.image -padx 2 -pady 2 -sticky w grid $f.physical -padx 2 -pady 2 -sticky w grid $f.amplifier -padx 2 -pady 2 -sticky w grid $f.detector -padx 2 -pady 2 -sticky w pack $w.coord.print -side top -fill both -expand true } ��������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/cpanda.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000006120 12514261632 016462� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PandaDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(which) panda set var(proc,apply) PandaApply set var(proc,close) PandaClose set var(proc,generate) PandaGenerate set var(proc,coordCB) PandaCoordCB set var(proc,editCB) PandaEditCB set var(proc,distCB) PandaDistCB # base panda dialog MarkerBasePandaDialog $varname set f $var(top).param # Radius ttk::label $f.tinner -text [msgcat::mc {Inner}] ttk::label $f.touter -text [msgcat::mc {Outer}] ttk::label $f.tradius -text [msgcat::mc {Radius}] ttk::entry $f.inner -textvariable ${varname}(inner) -width 13 ttk::entry $f.outer -textvariable ${varname}(outer) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list $var(proc,distCB) $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat # Annuli ttk::label $f.tannuli -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable ${varname}(annuli) -width 13 grid x $f.tinner $f.touter -padx 2 -pady 2 -sticky w grid $f.tradius $f.inner $f.outer $f.uradius -padx 2 -pady 2 -sticky w grid $f.tannuli $f.annuli -padx 2 -pady 2 -sticky w # init - do this last PandaDistCB $varname } # actions proc PandaClose {varname} { upvar #0 $varname var global $varname MarkerBasePandaClose $varname } proc PandaApply {varname} { upvar #0 $varname var global $varname MarkerBasePandaApply $varname } proc PandaGenerate {varname} { upvar #0 $varname var global $varname MarkerBaseAnnulusGenerateCircle $varname MarkerBasePandaGenerateAngles $varname } # callbacks proc PandaCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "PandaCoordCB" } MarkerBasePandaCoordCB $varname } proc PandaEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "PandaEditCB" } set t [$var(frame) get marker $var(id) panda radius \ $var(dcoord) $var(dformat)] set last [expr [llength $t]-1] set var(inner) [lindex $t 0] set var(outer) [lindex $t $last] set var(annuli) $last $var(annulitxt) delete 1.0 end $var(annulitxt) insert end "$t" set a [$var(frame) get marker $var(id) panda angle $var(system) $var(sky)] set last [expr [llength $a]-1] set var(ang1) [lindex $a 0] set var(ang2) [lindex $a $last] set var(angnum) $last $var(angtxt) delete 1.0 end $var(angtxt) insert end "$a" } proc PandaDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "PandaDistCB" } MarkerBasePandaDistCB $varname } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/crop.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000025201 12620674214 016202� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CropDef {} { global crop global icrop set icrop(top) .cr set icrop(mb) .crmb set crop(lock) none set crop(system) wcs set crop(sky) fk5 set crop(skyformat) degrees set crop(dcoord) wcs set crop(dformat) degrees set crop(rcoord) wcs } proc CropReset {} { global current if {$current(frame) != {}} { $current(frame) crop UpdateCrop $current(frame) } } proc CropButton {which x y} { global rgb RGBEvalLock rgb(lock,crop) $which [list $which crop begin $x $y] } proc CropMotion {which x y} { $which crop motion $x $y } proc CropRelease {which x y} { global rgb RGBEvalLock rgb(lock,crop) $which [list $which crop end $x $y] UpdateCrop $which } proc Crop3dButton {which x y zz} { $which crop 3d begin $x $y $zz } proc Crop3dMotion {which x y zz} { $which crop 3d motion $x $y $zz } proc Crop3dRelease {which x y zz} { $which crop 3d end $x $y $zz UpdateCrop $which } proc UpdateCrop {which} { global current global debug if {$debug(tcl,update)} { puts stderr "UpdateCrop" } LockCrop $which UpdateCropDialog UpdateCubeDialog UpdateContourScale UpdateContourDialog UpdateScaleDialog GridUpdateZoom UpdateGraphXAxis $which UpdateGraphYAxis $which UpdateInfoBoxBase UpdateMain } proc CropDialog {} { global crop global icrop global dcrop global ds9 global current # see if we already have a window visible if {[winfo exists $icrop(top)]} { raise $icrop(top) return } # create the window set w $icrop(top) set mb $icrop(mb) Toplevel $w $mb 6 [msgcat::mc {Crop Parameters}] \ CropDestroyDialog # for CoordMenuButton set crop(frame) $current(frame) $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command CropApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Reset}] -command CropReset $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command CropDestroyDialog EditMenu $mb icrop # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Center}] ttk::entry $f.x -textvariable dcrop(x) -width 14 ttk::entry $f.y -textvariable dcrop(y) -width 14 set dcrop(cb) $f.center CoordMenuButton $dcrop(cb) crop system 1 sky skyformat UpdateCropDialog ttk::label $f.stitle -text [msgcat::mc {Size}] ttk::entry $f.w -textvariable dcrop(w) -width 14 ttk::entry $f.h -textvariable dcrop(h) -width 14 set dcrop(db) $f.size DistMenuButton $dcrop(db) crop dcoord 1 dformat UpdateCropDialog ttk::label $f.rtitle -text [msgcat::mc {3D}] ttk::entry $f.from -textvariable dcrop(zmin) -width 14 ttk::entry $f.to -textvariable dcrop(zmax) -width 14 set dcrop(rb) $f.range CoordMenuButton $dcrop(rb) crop rcoord 2 {} {} UpdateCropDialog grid $f.title $f.x $f.y $dcrop(cb) -padx 2 -pady 2 grid $f.stitle $f.w $f.h $dcrop(db) -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command CropApplyDialog ttk::button $f.reset -text [msgcat::mc {Reset}] -command CropReset ttk::button $f.close -text [msgcat::mc {Close}] \ -command CropDestroyDialog pack $f.apply $f.reset $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true $w.param.x select range 0 end UpdateCropDialog } proc CropApplyDialog {} { global crop global icrop global dcrop global current if {$current(frame) != {}} { $current(frame) crop center $dcrop(x) $dcrop(y) \ $crop(system) $crop(sky) \ $dcrop(w) $dcrop(h) $crop(dcoord) $crop(dformat) if {[$current(frame) has fits cube]} { $current(frame) crop 3d $dcrop(zmin) $dcrop(zmax) $crop(rcoord) } UpdateCrop $current(frame) } } proc CropDestroyDialog {} { global icrop global dcrop if {[winfo exists $icrop(top)]} { destroy $icrop(top) destroy $icrop(mb) } unset dcrop } proc UpdateCropMenu {} { # can be changed by wcs SetCoordSystem crop system sky skyformat } proc UpdateCropDialog {} { global crop global icrop global dcrop global current global debug if {$debug(tcl,update)} { puts stderr "UpdateCropDialog" } if {![winfo exists $icrop(top)]} { return } set w $icrop(top) if {$current(frame) != {}} { set crop(frame) $current(frame) if {[$current(frame) has fits]} { # now make sure we have the coord systems AdjustCoordSystem crop system CoordMenuEnable $dcrop(cb).menu crop system 1 sky skyformat CoordMenuButtonCmd crop system sky {} AdjustCoordSystem crop dcoord DistMenuEnable $dcrop(db).menu crop dcoord 1 dformat DistMenuButtonCmd crop dcoord dformat {} AdjustCoordSystem3d crop rcoord CoordMenuEnable $dcrop(rb).menu crop rcoord 2 {} {} CoordMenuButtonCmd crop rcoord {} {} set rr [$current(frame) get crop center \ $crop(system) $crop(sky) $crop(skyformat) \ $crop(dcoord) $crop(dformat)] set dcrop(x) [lindex $rr 0] set dcrop(y) [lindex $rr 1] set dcrop(w) [lindex $rr 2] set dcrop(h) [lindex $rr 3] if {[$current(frame) has fits cube]} { set ss [$current(frame) get crop 3d $crop(rcoord)] set dcrop(zmin) [lindex $ss 0] set dcrop(zmax) [lindex $ss 1] grid $w.param.rtitle $w.param.from $w.param.to $dcrop(rb) \ -padx 2 -pady 2 } else { set dcrop(zmin) {} set dcrop(zmax) {} grid forget $w.param.rtitle $w.param.from $w.param.to $dcrop(rb) } return } } grid forget $w.param.rtitle $w.param.from $w.param.to $dcrop(rb) CoordMenuReset $dcrop(cb).menu crop system 1 sky skyformat DistMenuReset $dcrop(db).menu crop dcoord 1 dformat CoordMenuReset $dcrop(rb).menu crop rcoord 2 {} {} set dcrop(x) {} set dcrop(y) {} set dcrop(w) {} set dcrop(h) {} set dcrop(zmin) {} set dcrop(zmax) {} } proc MatchCropCurrent {sys} { global current if {$current(frame) != {}} { MatchCrop $current(frame) $sys } } proc MatchCrop {which sys} { global ds9 global rgb # make sure matrices have been updated RealizeDS9 set tt [$which has crop] set datasec [$which get datasec] if {$tt} { switch -- $sys { image - physical - amplifier - detector { set rr [$which get crop center $sys fk5 degrees $sys degrees] set r(x) [lindex $rr 0] set r(y) [lindex $rr 1] set r(w) [lindex $rr 2] set r(h) [lindex $rr 3] set qq [$which get crop 3d image] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,crop) $ff [list $ff datasec $datasec] RGBEvalLock rgb(lock,crop) $ff [list $ff crop center $r(x) $r(y) $sys fk5 $r(w) $r(h) $sys degrees] RGBEvalLock rgb(lock,crop) $ff [list $ff crop 3d $qq image] } } } wcs { set ss [lindex [$which get wcs] 0] if {[$which has wcs $ss]} { set rr [$which get crop center $ss fk5 degrees $ss degrees] set r(x) [lindex $rr 0] set r(y) [lindex $rr 1] set r(w) [lindex $rr 2] set r(h) [lindex $rr 3] set qq [$which get crop 3d $ss] foreach ff $ds9(frames) { if {$ff != $which} { if {[$ff has wcs $ss]} { RGBEvalLock rgb(lock,crop) $ff [list $ff crop center $r(x) $r(y) $ss fk5 $r(w) $r(h) $ss degrees] RGBEvalLock rgb(lock,crop) $ff [list $ff crop 3d $qq $ss] } } } } } } } else { foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,crop) $ff [list $ff crop] RGBEvalLock rgb(lock,crop) $ff [list $ff crop 3d] } } } } proc LockCropCurrent {} { global current if {$current(frame) != {}} { LockCrop $current(frame) } } proc LockCrop {which} { global crop switch -- $crop(lock) { none {} default {MatchCrop $which $crop(lock)} } } proc CropBackup {ch which} { switch [$which get type] { base - 3d {CropBackupBase $ch $which} rgb {CropBackupRGB $ch $which} } } proc CropBackupBase {ch which} { if {[$which has crop]} { set rr [$which get crop physical fk5 degrees] puts $ch "$which crop $rr physical fk5" if {[$which has fits cube]} { set ss [$which get crop 3d image] puts $ch "$which crop 3d $ss image" } } } proc CropBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" CropBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } # Process Cmds proc ProcessCropCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global crop global current switch -- [string tolower [lindex $var $i]] { match { incr i MatchCropCurrent [lindex $var $i] } lock { incr i set crop(lock) [lindex $var $i] LockCropCurrent } open {CropDialog} close {CropDestroyDialog} reset {CropReset} 3d { incr i 1 set zmin [lindex $var [expr $i+0]] set zmax [lindex $var [expr $i+1]] set sys [lindex $var [expr $i+2]] incr i 1 incr i [FixSpecSystem sys physical] $current(frame) crop 3d $zmin $zmax $sys } default { set x [lindex $var [expr $i+0]] set y [lindex $var [expr $i+1]] set w [lindex $var [expr $i+2]] set h [lindex $var [expr $i+3]] set sys [lindex $var [expr $i+4]] set sky [lindex $var [expr $i+5]] set dformat [lindex $var [expr $i+6]] incr i 3 incr i [FixSpec sys sky dformat physical fk5 degrees] $current(frame) crop center $x $y $sys $sky $w $h $sys $dformat } } } proc ProcessSendCropCmd {proc id param} { global crop global current switch -- [string tolower [lindex $param 0]] { lock {$proc $id "$crop(lock)\n"} 3d { set sys [lindex $param 1] FixSpecSystem sys physical if {$current(frame) != {}} { $proc $id "[$current(frame) get crop 3d $sys]\n" } } default { set sys [lindex $param 0] set sky [lindex $param 1] set format [lindex $param 2] set dformat [lindex $param 3] FixSpec sys sky format physical fk5 degrees if {$current(frame) != {}} { $proc $id "[$current(frame) get crop center $sys $sky $format $sys $dformat]\n" } } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/crosshair.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000015564 12600065137 017243� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CrosshairDef {} { global crosshair global icrosshair set icrosshair(top) .ch set icrosshair(mb) .chmb set crosshair(lock) none # set via wcs() set crosshair(system) wcs set crosshair(sky) fk5 set crosshair(skyformat) degrees } proc CrosshairButton {which x y} { global ds9 global crosshair $which crosshair canvas $x $y UpdateCrosshairDialog LockCrosshair $which } proc CrosshairArrowKey {which x y} { global ds9 global crosshair $which crosshair warp $x $y UpdateCrosshairDialog LockCrosshair $which set coord [$which get crosshair canvas] set X [lindex $coord 0] set Y [lindex $coord 1] UpdateColormapLevelMosaic $which $X $Y canvas UpdateInfoBox $which $X $Y canvas UpdatePixelTableDialog $which $X $Y canvas UpdateGraph $which $X $Y canvas } proc CrosshairTo {x y sys sky} { global crosshair global current global ds9 set current(mode) crosshair ChangeMode if {$current(frame) != {}} { $current(frame) crosshair $sys $sky $x $y set coord [$current(frame) get crosshair canvas] UpdateColormapLevelMosaic $current(frame) \ [lindex $coord 0] [lindex $coord 1] canvas UpdateInfoBox $current(frame) \ [lindex $coord 0] [lindex $coord 1] canvas if {$crosshair(lock) != "none"} { set coord [$current(frame) get crosshair $crosshair(lock) scientific] foreach f $ds9(frames) { if {$f != $current(frame) && [$f has system $crosshair(lock)]} { $f crosshair $crosshair(lock) $coord } } } } } proc MatchCrosshairCurrent {sys} { global current if {$current(frame) != {}} { MatchCrosshair $current(frame) $sys } } proc MatchCrosshair {which sys} { global crosshair global ds9 global current if {$current(mode) != {crosshair}} { return } switch -- $sys { image - physical - amplifier - detector { set coord [$which get crosshair $sys scientific] foreach ff $ds9(frames) { if {$ff != $which} { $ff crosshair $sys $coord } } } wcs { set ss [lindex [$which get wcs] 0] if {[$which has wcs $ss]} { set coord [$which get crosshair $ss scientific] foreach ff $ds9(frames) { if {$ff != $which} { if {[$ff has wcs $ss]} { $ff crosshair $ss $coord } } } } } } } proc LockCrosshairCurrent {} { global current if {$current(frame) != {}} { LockCrosshair $current(frame) } } proc LockCrosshair {which} { global crosshair switch -- $crosshair(lock) { none {} default {MatchCrosshair $which $crosshair(lock)} } } proc CrosshairDialog {} { global crosshair global icrosshair global dcrosshair global current # see if we already have a window visible if {[winfo exists $icrosshair(top)]} { raise $icrosshair(top) return } # create the window set w $icrosshair(top) set mb $icrosshair(mb) Toplevel $w $mb 6 [msgcat::mc {Crosshair Parameters}] \ CrosshairDestroyDialog # for CoordMenuButton set crosshair(frame) $current(frame) $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command CrosshairApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command CrosshairDestroyDialog EditMenu $mb icrosshair # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Crosshair}] ttk::entry $f.x -textvariable dcrosshair(x) -width 14 ttk::entry $f.y -textvariable dcrosshair(y) -width 14 set dcrosshair(cb) $f.system CoordMenuButton $dcrosshair(cb) crosshair system 1 sky skyformat \ UpdateCrosshairDialog grid $f.title $f.x $f.y $f.system -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command CrosshairApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command CrosshairDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true $w.param.x select range 0 end UpdateCrosshairDialog } proc CrosshairApplyDialog {} { global crosshair global dcrosshair CrosshairTo $dcrosshair(x) $dcrosshair(y) $crosshair(system) $crosshair(sky) } proc CrosshairDestroyDialog {} { global icrosshair global dcrosshair if {[winfo exists $icrosshair(top)]} { destroy $icrosshair(top) destroy $icrosshair(mb) } unset dcrosshair } proc UpdateCrosshairDialog {} { global crosshair global icrosshair global dcrosshair global current global debug if {$debug(tcl,update)} { puts stderr "UpdateCrosshairDialog" } if {![winfo exists $icrosshair(top)]} { return } if {$current(frame) != {}} { set crosshair(frame) $current(frame) if {[$current(frame) has fits]} { # now make sure we have the coord systems AdjustCoordSystem crosshair system CoordMenuEnable $dcrosshair(cb).menu crosshair system 1 sky skyformat CoordMenuButtonCmd crosshair system sky {} } else { CoordMenuReset $dcrosshair(cb).menu crosshair system 1 sky skyformat } } if {$current(frame) != {}} { set coord [$current(frame) get crosshair $crosshair(system) \ $crosshair(sky) $crosshair(skyformat)] set dcrosshair(x) [lindex $coord 0] set dcrosshair(y) [lindex $coord 1] } else { set dcrosshair(x) {} set dcrosshair(y) {} } } proc ProcessCrosshairCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { match { incr i MatchCrosshairCurrent [lindex $var $i] } lock { incr i set crosshair(lock) [lindex $var $i] LockCrosshairCurrent } default { set x [lindex $var [expr $i+0]] set y [lindex $var [expr $i+1]] set sys [lindex $var [expr $i+2]] set sky [lindex $var [expr $i+3]] set format {} incr i 1 incr i [FixSpec sys sky format physical fk5 degrees] CrosshairTo $x $y $sys $sky UpdateCrosshairDialog } } } proc ProcessSendCrosshairCmd {proc id param} { global crosshair global current switch -- [string tolower $param] { lock {$proc $id "$crosshair(lock)\n"} default { set sys [lindex $param 0] set sky [lindex $param 1] set format [lindex $param 2] FixSpec sys sky format physical fk5 degrees if {$current(frame) != {}} { $proc $id "[$current(frame) get crosshair $sys $sky $format]\n" } } } } ��������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/cube.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000044660 12632104003 016152� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CubeDef {} { global icube global cube set icube(top) .cube set icube(mb) .cubemb set icube(id) 0 set cube(lock) none set cube(lock,axes) 0 # needs work, at high values, but cropped, causes problems # set cube(format) {%.5g} # axes cnt starts at 0 set cube(axis) 2 set cube(system) wcs set cube(axes) 123 } proc MatchCubeCurrent {sys} { global current if {$current(frame) != {}} { MatchCube $current(frame) $sys } } proc MatchCube {which sys} { global cube global ds9 global rgb set naxes [$which get fits naxes] for {set ii 2} {$ii<$naxes} {incr ii} { set slice($ii) [$which get fits slice $ii $sys] } foreach ff $ds9(frames) { if {$ff != $which} { for {set ii 2} {$ii<$naxes} {incr ii} { RGBEvalLock rgb(lock,slice) $ff "$ff update fits slice $ii $slice($ii) $sys" } } } } proc LockCubeCurrent {} { global current if {$current(frame) != {}} { LockCube $current(frame) } } proc LockCube {which} { global cube switch -- $cube(lock) { none {} default {MatchCube $which $cube(lock)} } } proc CubeSlice {slice} { global dcube global cube global current global rgb RGBEvalLockCurrent rgb(lock,slice) "$current(frame) update fits slice $cube(axis) $slice" set dcube(image,$cube(axis)) $slice set dcube(wcs,$cube(axis)) [$current(frame) get coordinates $slice image $cube(system) $cube(axis)] UpdateCube } proc CubeStop {} { global icube if {$icube(id)>0} { after cancel $icube(id) set icube(id) 0 } } proc CubePlay {} { global icube if {$icube(id) == 0} { CubeTimer } } proc CubeTimer {} { global icube global dcube global cube global current global blink global rgb if {$current(frame) != {}} { if {[$current(frame) has fits]} { set slice [$current(frame) get fits slice $cube(axis)] if {$cube(axis)==2} { # get cropped version set ss [$current(frame) get crop 3d image] set first [lindex $ss 0] set last [lindex $ss 1] } else { set first 1 set last [$current(frame) get fits depth $cube(axis)] } if {$slice == $last} { set slice $first } else { set slice [expr $slice+1] } CubeSlice $slice } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } set icube(id) [after $blink(interval) CubeTimer] } proc CubeFirst {} { global dcube global cube global current global rgb CubeStop if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {$cube(axis)==2} { # get cropped version set ss [$current(frame) get crop 3d image] set first [lindex $ss 0] } else { set first 1 } CubeSlice $first } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } } proc CubePrev {} { global dcube global cube global current global rgb CubeStop if {$current(frame) != {}} { if {[$current(frame) has fits]} { set slice [$current(frame) get fits slice $cube(axis)] if {$cube(axis)==2} { # get cropped version set ss [$current(frame) get crop 3d image] set first [lindex $ss 0] set last [lindex $ss 1] } else { set first 1 set last [$current(frame) get fits depth $cube(axis)] } if {$slice == $first} { set slice $last } else { set slice [expr $slice-1] } CubeSlice $slice } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } } proc CubeNext {} { global dcube global cube global current global rgb CubeStop if {$current(frame) != {}} { if {[$current(frame) has fits]} { set slice [$current(frame) get fits slice $cube(axis)] if {$cube(axis)==2} { # get cropped version set ss [$current(frame) get crop 3d image] set first [lindex $ss 0] set last [lindex $ss 1] } else { set first 1 set last [$current(frame) get fits depth $cube(axis)] } if {$slice == $last} { set slice $first } else { set slice [expr $slice+1] } CubeSlice $slice } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } } proc CubeLast {} { global dcube global cube global current global rgb CubeStop if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {$cube(axis)==2} { # get cropped version set ss [$current(frame) get crop 3d image] set last [lindex $ss 1] } else { set last [$current(frame) get fits depth $cube(axis)] } CubeSlice $last } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } } proc CubeApply {ii} { global dcube global cube global current global rgb CubeStop if {$current(frame) != {}} { if {[$current(frame) has fits]} { set ss [expr int([$current(frame) get coordinates $dcube(wcs,$ii) $cube(system) image $cube(axis)])] if {$ss<1} { set ss 1 } set depth [$current(frame) get fits depth $ii] if {$ss>$depth} { set ss $depth } set dcube(image,$ii) $ss set dcube(wcs,$ii) [$current(frame) get coordinates $dcube(image,$ii) image $cube(system) $cube(axis)] RGBEvalLockCurrent rgb(lock,slice) "$current(frame) update fits slice $ii $ss" } else { set dcube(image,$cube(axis)) 1 set dcube(wcs,$cube(axis)) 1 } UpdateCube } } proc UpdateCube {} { global current LockCubeCurrent UpdateScaleDialog UpdateContourScale UpdateContourDialog UpdateGraphYAxis $current(frame) UpdateInfoBoxBase UpdateMain } # used by backup proc CubeDialog {} { global icube global dcube global cube global current global ds9 global blink # see if we already have a window visible if {[winfo exists $icube(top)]} { raise $icube(top) return } # create the cube window set w $icube(top) set mb $icube(mb) Toplevel $w $mb 6 [msgcat::mc {Cube}] CubeDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Interval}] -menu $mb.blink $mb add cascade -label [msgcat::mc {Coordinate}] -menu $mb.coord $mb add cascade -label [msgcat::mc {Axes Order}] -menu $mb.axes menu $mb.file $mb.file add command -label [msgcat::mc {First}] -command CubeFirst $mb.file add command -label [msgcat::mc {Previous}] -command CubePrev $mb.file add command -label [msgcat::mc {Stop}] -command CubeStop $mb.file add command -label [msgcat::mc {Play}] -command CubePlay $mb.file add command -label [msgcat::mc {Next}] -command CubeNext $mb.file add command -label [msgcat::mc {Last}] -command CubeLast $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command CubeDestroyDialog EditMenu $mb icube menu $mb.blink $mb.blink add radiobutton -label ".125 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 125 $mb.blink add radiobutton -label ".25 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 250 $mb.blink add radiobutton -label ".5 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 500 $mb.blink add radiobutton -label "1 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 1000 $mb.blink add radiobutton -label "2 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 2000 $mb.blink add radiobutton -label "4 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 4000 $mb.blink add radiobutton -label "8 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 8000 CoordMenu $mb.coord cube system 2 {} {} UpdateCubeDialog menu $mb.axes $mb.axes add radiobutton -label {1 2 3} -variable cube(axes) \ -value 123 -command CubeAxes $mb.axes add radiobutton -label {1 3 2} -variable cube(axes) \ -value 132 -command CubeAxes $mb.axes add radiobutton -label {2 1 3} -variable cube(axes) \ -value 213 -command CubeAxes $mb.axes add radiobutton -label {2 3 1} -variable cube(axes) \ -value 231 -command CubeAxes $mb.axes add radiobutton -label {3 1 2} -variable cube(axes) \ -value 312 -command CubeAxes $mb.axes add radiobutton -label {3 2 1} -variable cube(axes) \ -value 321 -command CubeAxes # Param set f [ttk::frame $w.param] set dcube(taxis) [ttk::label $f.taxis -text [msgcat::mc {Axis}]] set dcube(tslice) [ttk::label $f.tslice -text [msgcat::mc {Slice}]] set dcube(twcs) [ttk::label $f.twcs -textvariable dcube(vcoord) \ -anchor center] for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { set dcube(chk,$ii) [ttk::radiobutton $f.chk$ii \ -text [expr $ii+1] \ -variable cube(axis) \ -value $ii] set dcube(lslice,$ii) [ttk::label $f.slice$ii \ -textvariable dcube(image,$ii) \ -width 5 -anchor center] set dcube(sslice,$ii) [slider $f.scale$ii 0 100 {} \ dcube(wcs,$ii) [list CubeApply $ii] 4 10] } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.first -text [msgcat::mc {First}] -width -6 -command CubeFirst ttk::button $f.prev -text [msgcat::mc {Previous}] -width -6 \ -command CubePrev ttk::button $f.stop -text [msgcat::mc {Stop}] -width -6 -command CubeStop ttk::button $f.play -text [msgcat::mc {Play}] -width -6 -command CubePlay ttk::button $f.next -text [msgcat::mc {Next}] -width -6 -command CubeNext ttk::button $f.last -text [msgcat::mc {Last}] -width -6 -command CubeLast pack $f.first $f.prev $f.stop $f.play $f.next $f.last \ -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true UpdateCubeDialog } proc CubeDestroyDialog {} { global icube global dcube CubeStop if {[winfo exists $icube(top)]} { destroy $icube(top) destroy $icube(mb) } unset dcube } proc UpdateCubeMenu {} { global cube global current global debug if {$debug(tcl,update)} { puts stderr "UpdateCubeMenu" } if {$current(frame) != {}} { set cube(axes) [$current(frame) get cube axes] } # can be changed by wcs SetCoordSystem cube system {} {} } proc UpdateCubeDialog {} { global icube global dcube global cube global current global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateCubeDialog" } CubeStop if {![winfo exists $icube(top)]} { return } if {$current(frame) != {}} { if {[$current(frame) has fits]} { # now make sure we have the coord systems AdjustCoordSystem3d cube system CoordMenuEnable $icube(mb).coord cube system 2 {} {} } else { CoordMenuReset $icube(mb).coord cube system 2 {} {} } } # get number of axes if {$current(frame) != {}} { set naxes [$current(frame) get fits naxes] } else { set naxes 2 } # set from/to set depth 1 if {$naxes == 2} { set dcube(from,2) 1 set dcube(to,2) 1 } else { for {set ii 2} {$ii<$naxes} {incr ii} { set dcube(from,$ii) 1 set dcube(to,$ii) 1 if {$ii==2} { # get cropped version set ss [$current(frame) get crop 3d $cube(system)] set dcube(from,$ii) [lindex $ss 0] set dcube(to,$ii) [lindex $ss 1] } else { set depth [$current(frame) get fits depth $ii] set dcube(from,$ii) [$current(frame) get coordinates 1 image $cube(system) $ii] set dcube(to,$ii) [$current(frame) get coordinates $depth image $cube(system) $ii] } } } # forget everything grid forget $dcube(tslice) $dcube(taxis) $dcube(twcs) for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { grid forget $dcube(chk,$ii) $dcube(sslice,$ii) $dcube(lslice,$ii) } # show it if {$naxes <= 3} { # special chase, no checkbox grid columnconfigure $icube(top).param 1 -weight 1 grid columnconfigure $icube(top).param 2 -weight 0 grid $dcube(tslice) $dcube(twcs) -padx 2 -pady 2 -sticky ew grid $dcube(lslice,2) $dcube(sslice,2) -padx 2 -pady 2 -sticky ew } else { grid columnconfigure $icube(top).param 1 -weight 0 grid columnconfigure $icube(top).param 2 -weight 1 grid $dcube(taxis) $dcube(tslice) $dcube(twcs) \ -padx 2 -pady 2 -sticky ew for {set ii 2} {$ii<$naxes} {incr ii} { grid $dcube(chk,$ii) $dcube(lslice,$ii) \ $dcube(sslice,$ii) -padx 2 -pady 2 -sticky ew } } # set intervals if {$naxes == 2} { SliderMinMax $dcube(sslice,2) $dcube(from,2) $dcube(to,2) 4 set dcube(vcoord) $cube(system) } else { for {set ii 2} {$ii<$naxes} {incr ii} { set dcube(vcoord) $cube(system) switch $cube(system) { image { set dcube(from,$ii) [expr int($dcube(from,$ii))] set dcube(to,$ii) [expr int($dcube(to,$ii))] } default { set w [string range $cube(system) 3 3] set key "CTYPE[expr $cube(axis)+1]$w" set tt [string trim [$current(frame) get fits header keyword \{$key\}]] if {$tt != {}} { set dcube(vcoord) $tt } } } SliderMinMax $dcube(sslice,$ii) $dcube(from,$ii) $dcube(to,$ii) 4 } } # reset cube(axis) if needed if {$cube(axis) > [expr $naxes-1]} { set cube(axis) [expr $naxes-1] if {$cube(axis) < 2} { set cube(axis) 2 } } # we must do this after the scale has been configured if {$naxes == 2} { set dcube(image,2) 1 set dcube(wcs,2) 1 } else { for {set ii 2} {$ii<$naxes} {incr ii} { set slice [$current(frame) get fits slice $ii] set dcube(image,$ii) $slice set dcube(wcs,$ii) [$current(frame) get coordinates $slice image $cube(system) $ii] } } } proc CubeBackup {ch which} { switch [$which get type] { base - 3d {CubeBackupBase $ch $which} rgb {CubeBackupRGB $ch $which} } } proc CubeBackupBase {ch which} { global ds9 set axes [$which get cube axes] puts $ch "$which cube axes $axes" if {[$which has fits cube]} { for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { set depth [$which get fits depth $ii] if {$depth>1} { puts $ch "$which update fits slice $ii [$which get fits slice $ii]" } else { break } } puts $ch "CubeDialog" } } proc CubeBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" CubeBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } proc MatchAxesCurrent {} { global current if {$current(frame) != {}} { MatchAxes $current(frame) } } proc MatchAxes {which} { global cube global ds9 global rgb global grid set axes [$which get cube axes] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,axes) $ff "$ff cube axes $axes" # grid if {[$ff has grid]} { array set ogrid [array get grid] array set grid [$ff get grid var] GridUpdate $ff array set grid [array get ogrid] } } } } proc LockAxesCurrent {} { global current if {$current(frame) != {}} { LockAxes $current(frame) } } proc LockAxes {which} { global cube if {$cube(lock,axes)} { MatchAxes $which } } proc CubeAxes {} { global cube global current global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,axes) \ "$current(frame) cube axes $cube(axes)" LockAxesCurrent UpdateHeaderDialog UpdateWCS UpdateDS9 UpdateMain } } # Process Cmds proc ProcessCubeCmd {varname iname} { upvar $varname var upvar $iname i global cube global dcube global blink global current global rgb CubeDialog switch -- [string tolower [lindex $var $i]] { match { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { switch -- [lindex $var $i] { {} {MatchCubeCurrent image} default {MatchCubeCurrent [lindex $var $i]} } } else { MatchCubeCurrent image incr i -1 } } lock { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { switch -- [lindex $var $i] { {} - yes - 1 {set cube(lock) image} no - 0 {set cube(lock) none} default {set cube(lock) [lindex $var $i]} } } else { set cube(lock) image incr i -1 } LockCubeCurrent } open {} close {CubeDestroyDialog} play {CubePlay} stop {CubeStop} next {CubeNext} prev {CubePrev} first {CubeFirst} last {CubeLast} interval { incr i set blink(interval) [expr int([lindex $var $i]*1000)] } axis { incr i; set item [lindex $var $i] if {[string is integer $item]} { set cube(axis) [expr $item-1] if {$cube(axis) < 2} { set cube(axis) 2 } } } axes - order { incr i; switch -- [string tolower [lindex $var $i]] { lock { incr i; if {!([string range [lindex $var $i] 0 0] == "-")} { set cube(lock,axes) [FromYesNo [lindex $var $i]] } else { set cube(lock,axes) 1 incr i -1 } LockAxesCurrent } default { set cube(axes) [lindex $var $i] CubeAxes } } } default { # defaults set ss [lindex $var $i] set sys image set axis 2 # sys set item [lindex $var [expr $i+1]] if {$item != {}} { if {!([string range $item 0 0] == "-")} { incr i if {[string is integer $item]} { set axis [expr $item-1] } else { set sys $item } # axis set item [lindex $var [expr $i+1]] if {$item != {}} { if {!([string range $item 0 0] == "-")} { incr i if {[string is integer $item]} { set axis [expr $item-1] } } } } } if {[string is double $ss]} { set dcube(wcs,$axis) $ss set cube(system) $sys set cube(axis) $axis if {$cube(axis) < 2} { set cube(axis) 2 } CubeApply $cube(axis) } } } } proc ProcessSendCubeCmd {proc id param} { global cube global current global blink switch -- [string tolower [lindex $param 0]] { lock {$proc $id "$cube(lock)\n"} axes - order { switch -- [string tolower [lindex $param 1]] { lock {$proc $id [ToYesNo $cube(lock,axes)]} default {$proc $id "$cube(axes)\n"} } } interval {$proc $id "[expr $blink(interval)/1000.]\n"} axis {$proc $id "$cube(axis)\n"} default { if {$current(frame) != {}} { $proc $id "[$current(frame) get fits slice $cube(axis)]\n" } else { $proc $id "1\n" } } } } ��������������������������������������������������������������������������������saods9/ds9/library/debug.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000016157 12576344400 016340� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc DebugDef {} { global debug set debug(tcl,events) 0 set debug(tcl,update) 0 set debug(tcl,idletasks) 0 set debug(tcl,layout) 0 set debug(tcl,info) 0 set debug(tcl,marker) 0 set debug(tcl,watch) 0 set debug(tcl,hv) 0 set debug(tcl,cat) 0 set debug(tcl,ime) 0 set debug(tcl,samp) 0 set debug(tcl,grid) 0 set debug(tcl,restore) 0 set debug(tcl,http) 0 set debug(tcl,ftp) 0 set debug(tcl,xpa) 0 set debug(tcl,image) 0 set debug(tksao,ast) 0 set debug(tksao,mosaic) 0 set debug(tksao,parser) 0 set debug(tksao,perf) 0 set debug(tksao,wcs) 0 set debug(tksao,bin) 0 set debug(tksao,block) 0 set debug(tksao,compress) 0 set debug(tksao,gz) 0 set debug(tksao,rgb) 0 set debug(tksao,crop) 0 set debug(iis) 0 } proc Debug {which varname} { upvar $varname var global current if {$current(frame) != {}} { $current(frame) debug $which $var } } proc DebugMenu {} { global ds9 global debug if {[winfo exists $ds9(mb).debug]} { return } $ds9(mb) add cascade -label {Debug} -menu $ds9(mb).debug menu $ds9(mb).debug $ds9(mb).debug add cascade -label {Tcl} -menu $ds9(mb).debug.tcl $ds9(mb).debug add cascade -label {TKSAO} -menu $ds9(mb).debug.tksao $ds9(mb).debug add cascade -label {IIS} -menu $ds9(mb).debug.iis menu $ds9(mb).debug.tcl $ds9(mb).debug.tcl add checkbutton -label {Events} \ -variable debug(tcl,events) $ds9(mb).debug.tcl add checkbutton -label {Update} \ -variable debug(tcl,update) $ds9(mb).debug.tcl add checkbutton -label {Idletasks} \ -variable debug(tcl,idletasks) $ds9(mb).debug.tcl add checkbutton -label {Layout} \ -variable debug(tcl,layout) $ds9(mb).debug.tcl add checkbutton -label {Info} \ -variable debug(tcl,info) $ds9(mb).debug.tcl add checkbutton -label {Marker} \ -variable debug(tcl,marker) $ds9(mb).debug.tcl add checkbutton -label {Watch} \ -variable debug(tcl,watch) $ds9(mb).debug.tcl add checkbutton -label {HV} \ -variable debug(tcl,hv) $ds9(mb).debug.tcl add checkbutton -label {Catalog} \ -variable debug(tcl,cat) $ds9(mb).debug.tcl add checkbutton -label {IME} \ -variable debug(tcl,ime) $ds9(mb).debug.tcl add checkbutton -label {SAMP} \ -variable debug(tcl,samp) $ds9(mb).debug.tcl add checkbutton -label {Grid} \ -variable debug(tcl,grid) $ds9(mb).debug.tcl add checkbutton -label {Restore} \ -variable debug(tcl,restore) $ds9(mb).debug.tcl add checkbutton -label {HTTP} \ -variable debug(tcl,http) $ds9(mb).debug.tcl add checkbutton -label {FTP} \ -variable debug(tcl,ftp) $ds9(mb).debug.tcl add checkbutton -label {XPA} \ -variable debug(tcl,xpa) $ds9(mb).debug.tcl add checkbutton -label {IMAGE} \ -variable debug(tcl,image) menu $ds9(mb).debug.tksao $ds9(mb).debug.tksao add checkbutton -label {AST} \ -variable debug(tksao,ast) \ -command "Debug ast debug(tksao,ast)" $ds9(mb).debug.tksao add checkbutton -label {Mosaic} \ -variable debug(tksao,mosaic) \ -command "Debug mosaic debug(tksao,mosaic)" $ds9(mb).debug.tksao add checkbutton -label {Parser} \ -variable debug(tksao,parser) \ -command "Debug parser debug(tksao,parser)" $ds9(mb).debug.tksao add checkbutton -label {Perf} \ -variable debug(tksao,perf) \ -command "Debug perf debug(tksao,perf)" $ds9(mb).debug.tksao add checkbutton -label {WCS} \ -variable debug(tksao,wcs) \ -command "Debug wcs debug(tksao,wcs)" $ds9(mb).debug.tksao add checkbutton -label {Bin} \ -variable debug(tksao,bin) \ -command "Debug bin debug(tksao,bin)" $ds9(mb).debug.tksao add checkbutton -label {Block} \ -variable debug(tksao,block) \ -command "Debug block debug(tksao,block)" $ds9(mb).debug.tksao add checkbutton -label {Compress} \ -variable debug(tksao,compress) \ -command "Debug compress debug(tksao,compress)" $ds9(mb).debug.tksao add checkbutton -label {GZ} \ -variable debug(tksao,gz) \ -command "Debug gz debug(tksao,gz)" $ds9(mb).debug.tksao add checkbutton -label {RGB} \ -variable debug(tksao,rgb) \ -command "Debug rgb debug(tksao,rgb)" $ds9(mb).debug.tksao add checkbutton -label {Crop} \ -variable debug(tksao,crop) \ -command "Debug crop debug(tksao,crop)" menu $ds9(mb).debug.iis $ds9(mb).debug.iis add checkbutton -label {IIS} \ -variable debug(iis) -command IISDebug } proc DumpURL {varname} { upvar $varname r puts stderr "r(scheme)=$r(scheme)" puts stderr "r(authority)=$r(authority)" puts stderr "r(path)=$r(path)" puts stderr "r(query)=$r(query)" puts stderr "r(fragment)=$r(fragment)" } proc DumpCallStack {} { for {set x [expr [info level]-1]} {$x>0} {incr x -1} { puts stderr "$x: [info level $x]" } } proc DumpArray {varname} { upvar $varname var global $varname foreach f [array names $varname] { puts stderr "${varname}($f) = $var($f)" } } # Process Cmds proc ProcessDebugTclCmd {varname iname} { upvar $varname var upvar $iname i # default debug dialog if {[info proc bgerror] != {}} { rename bgerror {} } global debug switch -- [string tolower [lindex $var $i]] { events {set debug(tcl,events) 1} update {set debug(tcl,update) 1} idletasks {set debug(tcl,idletasks) 1} layout {set debug(tcl,layout) 1} info {set debug(tcl,info) 1} marker {set debug(tcl,marker) 1} watch {set debug(tcl,watch) 1} hv {set debug(tcl,hv) 1} cat {set debug(tcl,cat) 1} ime {set debug(tcl,ime) 1} samp {set debug(tcl,samp) 1} grid {set debug(tcl,grid) 1} restore {set debug(tcl,restore) 1} http {set debug(tcl,http) 1} ftp {set debug(tcl,ftp) 1} xpa {set debug(tcl,xpa) 1} image { set debug(tcl,hv) 1 set debug(tcl,http) 1 set debug(tcl,image) 1 } } } proc ProcessDebugCmd {varname iname} { upvar $varname var upvar $iname i DebugMenu global debug switch -- [string tolower [lindex $var $i]] { ast { set debug(tksao,ast) 1 Debug ast debug(tksao,ast) } mosaic { set debug(tksao,mosaic) 1 Debug mosaic debug(tksao,mosaic) } parser { set debug(tksao,parser) 1 Debug parser debug(tksao,parser) } perf { set debug(tksao,perf) 1 Debug perf debug(tksao,perf) } wcs { set debug(tksao,wcs) 1 Debug wcs debug(tksao,wcs) } bin { set debug(tksao,bin) 1 Debug bin debug(tksao,bin) } block { set debug(tksao,block) 1 Debug block debug(tksao,block) } compress { set debug(tksao,compress) 1 Debug compress debug(tksao,compress) } gz { set debug(tksao,gz) 1 Debug gz debug(tksao,gz) } iis { set debug(iis) 1 IISDebug } rgb { set debug(tksao,rgb) 1 Debug rgb debug(tksao,rgb) } crop { set debug(tksao,crop) 1 Debug crop debug(tksao,crop) } events - update - idletasks - layout - info - marker - watch - hv - cat - ime - samp - grid - restore - http - ftp - xpa - image {} default { incr ${iname} -1 } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/dialog.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000031316 12464211203 016471� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc DialogCreate {top title varname} { global ds9 eval {toplevel $top} switch $ds9(wm) { x11 - win32 {} aqua { ::tk::unsupported::MacWindowStyle style $top document "closeBox fullZoom collapseBox resizable" } } wm title $top "$title" wm iconname $top "$title" upvar #0 varname var wm protocol $top WM_DELETE_WINDOW "set $varname 1" } proc DialogCenter {w} { global debug if {$debug(tcl,idletasks)} { puts stderr "DialogCenter" } global ds9 ::tk::PlaceWindow $w widget $ds9(top) } proc DialogWait {top varname {focus {}}} { upvar $varname var if {[string length $focus] == 0} { set focus $top } set old [focus -displayof $top] focus $focus catch {tkwait visibility $top} catch {grab $top} tkwait variable $varname catch {grab release $top} focus $old # reset errorInfo global errorInfo set errorInfo {} } proc DialogDismiss {w} { destroy $w } # Simple List Box proc SLBDialog {varname title width} { upvar $varname var global ed set w {.slb} set ed(ok) 0 DialogCreate $w $title ed(ok) # Lists set f [ttk::frame $w.ed] ttk::scrollbar $f.scroll -command "$f.box yview" set ed(listbox) [listbox $f.box \ -yscroll "$f.scroll set" \ -setgrid 1 \ -selectmode single] grid $f.box $f.scroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] \ -command {set ed(ok) 1} ttk::button $f.cancel -text [msgcat::mc {Cancel}] \ -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.ed -side top -fill both -expand true # init for {set i 1} {$i <= $var(count)} {incr i} { $w.ed.box insert end $var($i,item) } $w.ed.box selection set 0 bind $w <Double-1> {set ed(ok) 1} bind $w <Return> {set ed(ok) 1} bind $w <Up> "SLBArrow $ed(listbox) -1" bind $w <Down> "SLBArrow $ed(listbox) 1" DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok if {$ed(ok)} { set i [expr [$ed(listbox) curselection]+1] if {$i > 0 && $i <= $var(count)} { set var(item) $var($i,item) set var(value) $var($i,value) } } DialogDismiss $w set rr $ed(ok) unset ed return $rr } proc SLBArrow {lb dir} { set which [$lb curselection] if {$which == {}} { set which 0 } set end [$lb index end] $lb selection clear 0 end incr which $dir if {$which < 0} { set which 0 } if {$which >= $end} { set which [expr $end -1] } $lb selection set $which } # Entry Dialog proc EntryDialog {title message size varname} { upvar $varname var global ds9 global ed set w {.entry} set mb {.entrymb} set ed(top) $w set ed(ok) 0 set ed(text) $var DialogCreate $w $title ed(ok) $w configure -menu $mb menu $mb $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit EditMenu $mb ed # Param set f [ttk::frame $w.param] ttk::label $f.title -text $message ttk::entry $f.txt -textvariable ed(text) -width $size if {$size < 30} { grid $f.title $f.txt -padx 2 -pady 2 } else { grid $f.title -padx 2 -pady 2 -sticky w grid $f.txt -padx 2 -pady 2 } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w $w.param.txt select range 0 end DialogWait $w ed(ok) $w.param.txt if {$ed(ok)} { set var $ed(text) } DialogDismiss $w destroy $mb set rr $ed(ok) unset ed return $rr } # Entry Cut/Copy/Paste proc EntryCut {top} { set w [focus -displayof $top] if {![catch {set data [string range [$w get] [$w index sel.first] [expr {[$w index sel.last] - 1}]]}]} { clipboard clear -displayof $w clipboard append -displayof $w $data $w delete sel.first sel.last } } proc EntryCopy {top} { set w [focus -displayof $top] if {![catch {set data [string range [$w get] [$w index sel.first] [expr {[$w index sel.last] - 1}]]}]} { clipboard clear -displayof $w clipboard append -displayof $w $data } } proc EntryPaste {top} { set w [focus -displayof $top] catch {$w delete sel.first sel.last} if {![catch {$w insert insert [GetSelection $w]}]} { tk::EntrySeeInsert $w } } proc GetSelection {w} { if { ![catch {selection get -displayof $w -type UTF8_STRING} txt] || ![catch {selection get -displayof $w} txt] || ![catch {selection get -displayof $w -selection CLIPBOARD} txt] } { return $txt } } # Simple Text Dialog proc SimpleTextDialog {varname title width height action pos txt {destroyCB {}} {destroyParam {}}} { upvar #0 $varname var global $varname global ds9 global pds9 set var(top) ".${varname}" set var(mb) ".${varname}mb" if {[winfo exists $var(top)]} { raise $var(top) } else { # create window Toplevel $var(top) $var(mb) 7 $title "SimpleTextDestroy $varname" set var(search) {} set var(destroyCB) $destroyCB set var(destroyParam) $destroyParam set var(font) $pds9(text,font) set var(font,size) $pds9(text,font,size) set var(font,weight) $pds9(text,font,weight) set var(font,slant) $pds9(text,font,slant) $var(mb) add cascade -label [msgcat::mc {File}] -menu $var(mb).file menu $var(mb).file $var(mb).file add command -label "[msgcat::mc {Save}]..." \ -command "SimpleTextSave $varname" switch $ds9(wm) { x11 - aqua { $var(mb).file add separator $var(mb).file add command -label "[msgcat::mc {Print}]..." \ -command "SimpleTextPrint $varname" } win32 {} } $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Close}] \ -command "SimpleTextDestroy $varname" $var(mb) add cascade -label [msgcat::mc {Edit}] -menu $var(mb).edit menu $var(mb).edit $var(mb).edit add command -label [msgcat::mc {Cut}] \ -command "SimpleTextCut $varname" -accelerator "${ds9(ctrl)}X" $var(mb).edit add command -label [msgcat::mc {Copy}] \ -command "SimpleTextCopy $varname" -accelerator "${ds9(ctrl)}C" $var(mb).edit add command -label [msgcat::mc {Paste}] \ -state disabled -accelerator "${ds9(ctrl)}V" $var(mb).edit add command -label [msgcat::mc {Clear}] \ -command "SimpleTextClear $varname" $var(mb).edit add separator $var(mb).edit add command -label [msgcat::mc {Select All}] \ -command "SimpleTextSelectAll $varname" $var(mb).edit add command -label [msgcat::mc {Select None}] \ -command "SimpleTextSelectNone $varname" $var(mb).edit add separator switch $ds9(wm) { x11 - win32 { $var(mb).edit add command -label "[msgcat::mc {Find}]..." \ -command "SimpleTextFind $varname" \ -accelerator "${ds9(ctrl)}F" } aqua { # Known bug in Tk, can't have dialogs invoked by accelerator $var(mb).edit add command -label "[msgcat::mc {Find}]..." \ -command "SimpleTextFind $varname" } } $var(mb).edit add command -label [msgcat::mc {Find Next}] \ -command "SimpleTextFindNext $varname" -accelerator "${ds9(ctrl)}G" $var(mb) add cascade -label [msgcat::mc {Font}] -menu $var(mb).font FontMenu $var(mb).font $varname font font,size font,weight font,slant \ [list SimpleTextFont $varname] # create the text and scroll widgets set var(text) [text $var(top).text -height $height -width $width \ -wrap none \ -yscrollcommand [list $var(top).yscroll set] \ -xscrollcommand [list $var(top).xscroll set] \ ] ttk::scrollbar $var(top).yscroll -command [list $var(text) yview] \ -orient vertical ttk::scrollbar $var(top).xscroll -command [list $var(text) xview] \ -orient horizontal grid $var(text) $var(top).yscroll -sticky news grid $var(top).xscroll -stick news grid rowconfigure $var(top) 0 -weight 1 grid columnconfigure $var(top) 0 -weight 1 # Bindings switch $ds9(wm) { x11 - win32 { bind $var(top) <<Find>> [list SimpleTextFind $varname] } aqua { # Known bug in Tk, can't have dialogs invoked by accelerator } } bind $var(top) <<FindNext>> [list SimpleTextFindNext $varname] # some window managers need a hint raise $var(top) } $var(text) configure -state normal if {$action != {append}} { $var(text) delete 1.0 end } $var(text) insert end "$txt" switch -- $pos { top {$var(text) see 1.0} bottom {$var(text) see end} } SimpleTextFont $varname } proc SimpleTextDestroy {varname} { upvar #0 $varname var global $varname if {$var(destroyCB) != {}} { eval $var(destroyCB) $var(destroyParam) } if {[winfo exists $var(top)]} { destroy $var(top) destroy $var(mb) } unset $varname } proc SimpleTextFont {varname} { upvar #0 $varname var global $varname global ds9 $var(text) configure -font \ "{$ds9($var(font))} $var(font,size) $var(font,weight) $var(font,slant)" } proc SimpleTextCut {varname} { upvar #0 $varname var global $varname tk_textCut $var(text) } proc SimpleTextCopy {varname} { upvar #0 $varname var global $varname tk_textCopy $var(text) } proc SimpleTextClear {varname} { upvar #0 $varname var global $varname $var(text) configure -state normal $var(text) delete 1.0 end $var(text) configure -state disabled } proc SimpleTextSelectAll {varname} { upvar #0 $varname var global $varname $var(text) tag add sel 1.0 end } proc SimpleTextSelectNone {varname} { upvar #0 $varname var global $varname $var(text) tag remove sel 1.0 end } proc SimpleTextFind {varname} { upvar #0 $varname var global $varname $var(text) tag remove sel 1.0 end set result "$var(search)" if {[EntryDialog [msgcat::mc {Search}] [msgcat::mc {Enter Search Expression}] 40 result]} { set var(search) "$result" set start [$var(text) search -nocase -count cnt \ -regexp -- $result 1.0 end] if {$start != {}} { $var(text) tag add sel $start "$start + $cnt chars" $var(text) see $start } else { Error "$var(search) [msgcat::mc {Not Found}]" } } } proc SimpleTextFindNext {varname} { upvar #0 $varname var global $varname if {$var(search) != {}} { if {[$var(text) tag ranges sel] != {}} { set ss {sel.last} } else { set ss {1.0} } set start [$var(text) search -nocase -count cnt \ -regexp -- $var(search) $ss end] if {$start != {}} { $var(text) tag remove sel 1.0 end $var(text) tag add sel $start "$start + $cnt chars" $var(text) see $start } else { # wrap set start [$var(text) search -nocase -count cnt \ -regexp -- $var(search) 1.0 end] if {$start != {}} { $var(text) tag remove sel 1.0 end $var(text) tag add sel $start "$start + $cnt chars" $var(text) see $start } else { Error "$var(search) [msgcat::mc {Not Found}]" } } } } proc SimpleTextPrint {varname} { upvar #0 $varname var global $varname global ds9 switch $ds9(wm) { x11 - aqua {SimpleTextPSPrint $varname} win32 {win32 pm print text [$var(text) get 1.0 end]} } } proc SimpleTextPSPrint {varname} { upvar #0 $varname var global $varname if {[PRPrintDialog]} { if {[catch {SimpleTextPostScript $varname} printError]} { Error "[msgcat::mc {An error has occurred while printing}] $printError" } } } proc SimpleTextPostScript {varname} { upvar #0 $varname var global $varname global ps if {$ps(dest) == "file"} { set ch [open "| cat > $ps(filename,txt)" w] } else { set ch [open "| $ps(cmd)" w] } puts -nonewline $ch [$var(text) get 1.0 end] close $ch } proc SimpleTextPageSetup {varname} { upvar #0 $varname var global $varname global ds9 switch $ds9(wm) { x11 - aqua {} win32 {win32 pm pagesetup} } } proc SimpleTextSave {varname} { upvar #0 $varname var global $varname set filename [SaveFileDialog textfbox] if {$filename != {}} { if {[catch {set ch [open "| cat > \"$filename\"" w]}]} { Error [msgcat::mc {An error has occurred while saving}] return } puts -nonewline $ch [$var(text) get 1.0 end] close $ch } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/ds9.tcl��������������������������������������������������������������������������000755 �000765 �000000 �00000026773 12632624340 015756� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" proc DS9Def {} { global ds9 global pds9 set ds9(title) "$ds9(app)" # for beta version, MUST have space set ds9(version) {7.4} set ds9(top) . set ds9(mb) .mb set ds9(visual) {} set ds9(depth) 8 set ds9(FTY_MAXAXES) 10 switch $ds9(wm) { x11 { set ds9(helvetica) [font configure TkDefaultFont -family] set ds9(courier) [font configure TkFixedFont -family] set ds9(times) serif # These look better if normal weight font configure TkCaptionFont -weight normal font configure TkHeadingFont -weight normal eval font create DefaultFont [font actual TkDefaultFont] eval font create DefaultMenuFont [font actual TkMenuFont] eval font create DefaultTextFont [font actual TkTextFont] } aqua { set ds9(helvetica) [font configure TkDefaultFont -family] set ds9(courier) [font configure TkFixedFont -family] set ds9(times) times } win32 {} } set ds9(main) {} set ds9(image) {} set ds9(canvas) {} set ds9(panel) {} set ds9(info) {} set ds9(panner) {} set ds9(magnifier) {} set ds9(buttons) {} set ds9(graph,sp) {} set ds9(graph,horz) {} set ds9(graph,vert) {} set ds9(frames) {} set ds9(active) {} set ds9(active,num) 0 set ds9(lock) 0 set ds9(next) {} set ds9(next,num) 1 set ds9(last) {} set ds9(event,opendoc) {} set ds9(event,printdoc) {} set ds9(tmpdir) {} switch $ds9(wm) { x11 {set ds9(menu,start) 1} aqua {set ds9(menu,start) 0} win32 {set ds9(menu,start) 1} } set ds9(menu,size,frame,goto) [expr $ds9(menu,start)+0] set ds9(menu,size,frame,active) [expr $ds9(menu,start)+3] # IME # set ds9(menu,size,analysis) [expr $ds9(menu,start)+35] set ds9(menu,size,analysis) [expr $ds9(menu,start)+33] set ds9(menu,size,wrap) 20 set ds9(display) single set ds9(bg) white set ds9(array,x) 512 set ds9(array,y) 512 set ds9(array,bitpix) -32 set ds9(array,skip) 0 set ds9(array,arch) bigendian set ds9(idletasks) 1 set ds9(row) -1 set ds9(freeze) 0 set ds9(b1) 0 set ds9(b2) 0 set ds9(b3) 0 set ds9(sb1) 0 set ds9(sb2) 0 set ds9(sb3) 0 set ds9(cb1) 0 set ds9(cb2) 0 set ds9(cb3) 0 set ds9(csb1) 0 set ds9(csb2) 0 set ds9(csb3) 0 set ds9(modifier) 0 set ds9(ext,file) ".$ds9(app).fil" set ds9(ext,alt) ".$ds9(app).file" set ds9(msg) {} set ds9(msg,level) info set ds9(msg,src) {} set ds9(msg,timeout) 1000 set ds9(prefs) 0 switch $ds9(wm) { x11 { set ds9(ctrl) "Control-" set ds9(shiftctrl) "Shift-Control-" } aqua { set ds9(ctrl) "Command-" set ds9(shiftctrl) "Shift-Command-" } win32 { set ds9(ctrl) "Control-" set ds9(shiftctrl) "Shift-Control-" } } # prefs only InitDefaultFont InitDefaultTextFont set pds9(backup) 1 set pds9(automarker) 1 set pds9(tcl) 0 set pds9(xpa) 1 set pds9(samp) 1 set pds9(confirm) 1 set pds9(bg) white set pds9(nan) white set pds9(iraf) 1 switch $ds9(wm) { x11 {set pds9(dialog) motif} aqua - win32 {set pds9(dialog) native} } set pds9(dialog,center) 0 set pds9(dialog,all) 0 set pds9(language) locale set pds9(language,name) [LanguageToName $pds9(language)] set pds9(language,dir) {} set pds9(threads) 12 } # if we have a problem at this point, dump simple message and exit if {[catch {tk windowingsystem} ds9(wm)]} { puts stderr "Unable to initialize window system." exit } # who are we? set ds9(app) [file tail [info nameofexecutable]] # Themes are now hardcoded switch $ds9(wm) { x11 { # set bg for non ttk widgets set bg [ttk::style lookup "." -background] # standard widgets option add {*Text.Background} $bg option add {*Listbox.Background} $bg option add {*PlotBackground} $bg # ttk widgets ttk::style configure TLabel -borderwidth 2 -padding 1 ttk::style configure TEntry -fieldbackground $bg -padding 1 } aqua { # set bg for non ttk widgets set bg [ttk::style lookup "." -background] # standard widgets option add {*PlotBackground} $bg } win32 {ttk::style theme use xpnative} } switch $ds9(wm) { x11 { # set to absolute path so that if -cd command is used, # so we can still find our files set ds9(root) [file normalize [file join [pwd] zvfsmntpt]] if {![namespace exists msgcat]} { source $ds9(root)/tcl8/8.5/msgcat-1.5.2.tm } if {![namespace exists http]} { source $ds9(root)/tcl8/8.6/http-2.8.8.tm } source $ds9(root)/tk8.6/tearoff.tcl source $ds9(root)/tk8.6/comdlg.tcl source $ds9(root)/tk8.6/focus.tcl source $ds9(root)/tk8.6/mkpsenc.tcl source $ds9(root)/tk8.6/msgbox.tcl source $ds9(root)/tk8.6/optMenu.tcl source $ds9(root)/tk8.6/unsupported.tcl source $ds9(root)/tcllib1.15/base64/base64.tcl source $ds9(root)/tcllib1.15/log/log.tcl source $ds9(root)/tcllib1.15/ftp/ftp.tcl source $ds9(root)/tcllib1.15/textutil/repeat.tcl source $ds9(root)/tcllib1.15/textutil/tabify.tcl source $ds9(root)/tcllib1.15/math/fuzzy.tcl source $ds9(root)/tkcon2.5/tkcon.tcl source $ds9(root)/xmlrpc0.3/xmlrpc.tcl source $ds9(root)/tkblt3.0/graph.tcl source $ds9(root)/library/source.tcl # fix ::tk and msgcat rename ::tk::msgcat::mc {} rename ::tk::msgcat::mcmax {} namespace import ::msgcat::mc namespace import ::msgcat::mcmax ::msgcat::mcload [file join $::tk_library msgs] # fix ::tk::dialog::file set ::tk::dialog::file::showHiddenVar 0 set ::tk::dialog::file::showHiddenBtn 1 } aqua { # hard code scaling as calcuated value is incorrect tk scaling 1.33333 set res [file normalize [file dirname [file dirname $argv0]]] lappend auto_path $res set ds9(root) [file normalize [file join [file dirname $argv0] ".."]] package require http package require msgcat package require base64 package require log package require ftp package require textutil package require math package require tkcon package require xmlrpc package require DS9 proc ::tk::mac::ShowPreferences {} { PrefsDialog } proc ::tk::mac::ReopenApplication {} { if {[wm state .] eq "withdrawn"} { wm state . normal } else { wm deiconify . } raise . } proc ::tk::mac::OpenDocument {args} { global ds9 set ds9(event,opendoc) $args if {!$ds9(init)} { MacOSXOpenDocEvent 1 } } proc ::tk::mac::PrintDocument {args} { global ds9 set ds9(event,printdoc) $args if {!$ds9(init)} { MacOSXPrintDocEvent 0 } } proc ::tk::mac::Quit {args} { QuitDS9 } proc ::tk::mac::ShowHelp {args} { HelpRef } } win32 {} } # Define Variables DS9Def 2MASSDef 3DDef AnalysisDef BinDef BlinkDef BlockDef ButtonsDef CanvasDef CATDef CATSymDef CATCDSSrchDef CentroidDef ColorbarDef ContourDef CoordDef CrosshairDef CubeDef CurrentDef CursorDef DebugDef ESODef ExamineDef ExportDef GraphDef GridDef GroupDef HelpDef HTTPDef HVDef IExamDef IISDef IMEDef MagnifierDef MarkerDef MaskDef MinMaxDef MovieDef NRESDef NVSSDef PannerDef PanZoomDef CropDef PixelDef PlotDef PrefsDef PSDef RGBDef SAMPDef SAODef SaveDef SaveImageDef ScaleDef SkyViewDef SmoothDef STSCIDef TemplateDef TileDef ViewDef VLADef VODef WCSDef ZScaleDef # let's start set ds9(init) 1 # set up signal trap # not supported under windows switch $tcl_platform(platform) { unix {signal add SIGINT QuitDS9} windows {} } # environment vars # we don't want to see any error messages if xpa is not available if { [info exists env(XPA_VERBOSITY)] == 0 } { set env(XPA_VERBOSITY) 0 } # set filter ptype to contained (default is process) set env(FILTER_PTYPE) c # set filter error proc so it will not kill ds9 set env(GERROR) 0 # Events event add <<Open>> <${ds9(ctrl)}o> event add <<Save>> <${ds9(ctrl)}s> event add <<PageSetup>> <${ds9(ctrl)}P> event add <<Print>> <${ds9(ctrl)}p> event add <<SelectAll>> <${ds9(ctrl)}a> event add <<Find>> <${ds9(ctrl)}f> event add <<FindNext>> <${ds9(ctrl)}g> # Init Temporary Dir before prefs InitTempDir # Init the filter compiler InitFilterCompiler # Load any preferences here, before we do any real work LoadPrefs switch $ds9(wm) { x11 {} aqua { ::tk::unsupported::MacWindowStyle style $ds9(top) document "closeBox fullZoom collapseBox resizable" # we need to map the top window so we can get the proper truecolor masks update idletasks } win32 {} } # We want to withdraw the window til everything is ready to go wm withdraw $ds9(top) wm title $ds9(top) "SAOImage $ds9(title)" wm iconname $ds9(top) "SAOImage $ds9(title)" wm protocol $ds9(top) WM_DELETE_WINDOW QuitDS9 # we need to set certain variables before anything else # such as color, title, language ProcessCommandLineFirst # initialize language switch $pds9(language) { locale { switch $ds9(wm) { x11 { foreach ee {LC_MESSAGES LC_ALL LANG} { if {[info exists env($ee)]} { set ll [string tolower [string range $env($ee) 0 1]] if {[SetLanguage $ll]} { break } } } } aqua { foreach ll [MacOSXGetLocale] { if {[SetLanguage $ll]} { break } } } win32 {} } } default {SetLanguage $pds9(language)} } # set the visual set ds9(visual) [winfo visual .] set ds9(depth) [winfo depth .] switch $ds9(wm) { x11 { if {$ds9(depth)==15} { set ds9(depth) 16 } if {$ds9(depth)==32} { set ds9(depth) 24 } } aqua { if {$ds9(depth)==15} { set ds9(depth) 16 } } win32 { if {$ds9(depth)==32} { set ds9(depth) 24 } } } switch -- $ds9(visual)$ds9(depth) { truecolor8 {} truecolor16 {} truecolor24 {} default {BadVisualError} } # create our main frame set ds9(main) [ttk::frame ${ds9(top)}ds9] pack $ds9(main) -fill both -expand true # Create image canvas CreateCanvas # Create Colorbar-- Create this first, so in case of a private colormap, # gui colors will be allocated in the new colormap, not the default colormap CreateColorbar # Create other parts of the display CreateMenuBar CreateInfoPanel CreatePanner CreateMagnifier CreateButtons CreateGraphs # Make sure that the wm knows when to swap in the colormap (if needed) wm colormapwindows . "$ds9(main) $ds9(canvas)" # Initialize the display InitColorbar InitPanner InitDialogBox # Set our current state of things ChangeMode # force a update, then layout update ConfigureView # our first frame CreateFrame # do this last so we don't get an ConfigureView event InitCanvas # ok, ready to show the window wm deiconify $ds9(top) update # Init external File Formats # we want this before processing the command line InitExternalFile # Init analysis file formats InitAnalysisFile # Configure HTTP ConfigHTTP # SAMP InitSAMP # XPA InitXPA # and process any command line items # we want to see something before any fits files are loaded ProcessCommandLine # Initialize IIS # after command line options to set port/fifo/unix... catch {IISInit} # any os events received? switch $ds9(wm) { x11 {} aqua { MacOSXOpenDocEvent 0 MacOSXPrintDocEvent 1 } win32 {} } # Load any initalization tcl code SourceInitFile {.ini} # do we have the correct prefs file? CheckPrefs # any post-prefs work? PostPrefs # kludge for aqua. We need to trigger the trap to update buttons vars switch $ds9(wm) { x11 {} aqua { set current(display) $current(display) set colorbar(map) $colorbar(map) } win32 {} } # start error monitor after $ds9(msg,timeout) [list ErrorTimer] # ok, we're done set ds9(init) 0 �����saods9/ds9/library/ellipse.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000006266 12514261632 016704� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc EllipseDialog {varname} { upvar #0 $varname var global $varname global pmarker # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord # procs set var(proc,apply) EllipseApply set var(proc,close) EllipseClose set var(proc,coordCB) EllipseCoordCB # base MarkerBaseCenterDialog $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisHistogramDialog $varname MarkerAnalysisPlot3dDialog $varname # init EllipseEditCB $varname MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback edit EllipseEditCB $varname $var(frame) marker $var(id) callback rotate \ MarkerBaseCenterRotateCB $varname set f $var(top).param # Radius ttk::label $f.tradius -text Radius ttk::entry $f.radius1 -textvariable ${varname}(radius1) -width 13 ttk::entry $f.radius2 -textvariable ${varname}(radius2) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list EllipseEditCB $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.tradius $f.radius1 $f.radius2 $f.uradius -padx 2 -pady 2 -sticky w grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w } # actions proc EllipseClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback edit EllipseEditCB $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc EllipseApply {varname} { upvar #0 $varname var global $varname if {$var(radius1) != {} && $var(radius2) !={}} { $var(frame) marker $var(id) ellipse radius \ $var(radius1) $var(radius2) $var(dcoord) $var(dformat) } MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } # callbacks proc EllipseCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "EllipseCoordCB" } MarkerAnalysisStatsSystem $varname MarkerAnalysisPlot3dSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } proc EllipseEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "EllipseEditCB" } set r [$var(frame) get marker $var(id) ellipse radius \ $var(dcoord) $var(dformat)] set var(radius1) [lindex $r 0] set var(radius2) [lindex $r 1] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/ellipseannulus.tcl���������������������������������������������������������������000644 �000765 �000000 �00000001512 12514261632 020277� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc EllipseAnnulusDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(which) ellipseannulus set var(proc,apply) MarkerBaseAnnulusRectApply set var(proc,close) MarkerBaseAnnulusRectClose set var(proc,generate) MarkerBaseAnnulusGenerateEllipse set var(proc,coordCB) MarkerBaseAnnulusRectCoordCB set var(proc,editCB) MarkerBaseAnnulusRectEditCB set var(proc,distCB) MarkerBaseAnnulusRectDistCB # base MarkerBaseAnnulusRectDialog $varname radius Major Minor } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/envi.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000003303 12464211203 016166� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ImportENVIFile {hdr fn} { global loadParam set loadParam(file,type) envi set loadParam(file,mode) {} set loadParam(load,type) smmap set loadParam(file,name) $fn set loadParam(file,header) $hdr set loadParam(load,layer) {} ProcessLoad } proc ExportENVIFile {hdr fn opt} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save envi file "\{$hdr\}" "\{$fn\}" $opt } proc ProcessENVICmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i # not supported } slice { incr i # not supported } } StartLoad if {$sock != {}} { # xpa if {0} { # not supported } else { set fn [lindex $var $i] set fn2 [lindex $var [expr $i+1]] if {$fn2 == {}} { set fn2 [FindENVIDataFile $fn] } ImportENVIFile $fn $fn2 } } else { # comm if {0} { # not supported } else { set fn [lindex $var $i] set fn2 [lindex $var [expr $i+1]] if {$fn2 == {}} { set fn2 [FindENVIDataFile $fn] } ImportENVIFile $fn $fn2 } } FinishLoad } proc FindENVIDataFile {fn} { set rn [file rootname $fn] foreach ff {{bil} {bip} {bsq} {raw} {cube}} { set fn2 "$rn.$ff" if {[file exists $fn2]} { return $fn2 } } return {} } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/epanda.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000001721 12514261632 016466� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc EpandaDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(which) epanda set var(proc,apply) MarkerBasePandaRectApply set var(proc,close) MarkerBasePandaRectClose set var(proc,generate) EpandaGenerate set var(proc,coordCB) MarkerBasePandaRectCoordCB set var(proc,editCB) MarkerBasePandaRectEditCB set var(proc,distCB) MarkerBasePandaRectDistCB # base panda rect dialog MarkerBasePandaRectDialog $varname } # actions proc EpandaGenerate {varname} { upvar #0 $varname var global $varname MarkerBaseAnnulusGenerateEllipse $varname MarkerBasePandaGenerateAngles $varname } �����������������������������������������������saods9/ds9/library/error.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000003054 12464211203 016361� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # capture general errors # this only captures gui errors, not xpa errors proc bgerror {err} { global icursor tk_messageBox -type ok -icon error \ -message "[msgcat::mc {An internal error has been detected}] $err" # reset cursor set icursor(count) 0 UnsetWatchCursor } # force capture xpa/samp/hv/interactive errors proc InitError {which} { global ds9 set ds9(msg) {} set ds9(msg,level) info set ds9(msg,src) $which global errorInfo set errorInfo {} } proc Info {message} { ProcessMessage info $message } proc Warning {message} { ProcessMessage warning $message } # used by backup proc Error {message} { ProcessMessage error $message } proc ProcessMessage {level message} { global ds9 global pds9 set ds9(msg,level) $level switch -- $ds9(msg,src) { xpa - hv - samp {set ds9(msg) $message} default { if {$pds9(confirm)} { tk_messageBox -message $message -type ok -icon $level } } } } # here is where errors from within the canvas widgets # will try to get our attention. # XPA, HV, and SAMP will have already seen any problems proc ErrorTimer {} { global ds9 global pds9 if {$ds9(msg) != {}} { if {$pds9(confirm)} { tk_messageBox -message $ds9(msg) -type ok -icon $ds9(msg,level) } InitError tcl } # set again after $ds9(msg,timeout) ErrorTimer } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/eso.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000011107 12544316735 016033� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ESODef {} { global eso global ieso set ieso(top) .eso set ieso(mb) .esomb set eso(sky) fk5 set eso(rformat) arcmin set eso(width) 15 set eso(height) 15 set eso(mode) new set eso(save) 0 set eso(valid) 0 set eso(survey) {DSS1} } proc ESODialog {} { global eso global ieso global wcs if {[winfo exists $ieso(top)]} { raise $ieso(top) return } set varname deso upvar #0 $varname var global $varname set var(top) $ieso(top) set var(mb) $ieso(mb) set var(sky) $eso(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $eso(rformat) set var(width) $eso(width) set var(height) $eso(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(survey) $eso(survey) set var(mode) $eso(mode) set var(save) $eso(save) set var(valid) $eso(valid) set w $var(top) IMGSVRInit $varname "ESO-DSS [msgcat::mc {Server}]" ESOExec ESOAck $var(mb) add cascade -label Survey -menu $var(mb).survey menu $var(mb).survey # these must be Caps, the server will not accept lower case $var(mb).survey add radiobutton -label {DSS1} \ -variable ${varname}(survey) -value DSS1 $var(mb).survey add radiobutton -label {DSS2-red} \ -variable ${varname}(survey) -value DSS2-red $var(mb).survey add radiobutton -label {DSS2-blue} \ -variable ${varname}(survey) -value DSS2-blue $var(mb).survey add radiobutton -label {DSS2-infrared} \ -variable ${varname}(survey) -value DSS2-infrared IMGSVRUpdate $varname 1 } proc ESOExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set mime "application/x-fits" set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set mime "display/gz-fits" set var(fn) [tmpnam ds9eso ".fits.gz"] } # size - convert to arcmin switch -- $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } if {$ww>60} { set ww 60 } if {$hh>60} { set hh 60 } # query set query [http::formatQuery ra $var(x) dec $var(y) equinox J2000 x $ww y $hh mime-type $mime Sky-Survey $var(survey)] set var(query) {} # Load image # we can't use -query because eso needs a GET not a POST set var(url) "http://archive.eso.org/dss/dss?$query" IMGSVRLoad $varname } proc ESOAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the ESO The Digitized Sky Surveys were produced at the Space Telescope Science Institute under U.S. Government grant NAG W-2166. The images of these surveys are based on photographic data obtained using the Oschin Schmidt Telescope on Palomar Mountain and the UK Schmidt Telescope. The plates were processed into the present compressed digital form with the permission of these institutions. The National Geographic Society - Palomar Observatory Sky Atlas (POSS-I) was made by the California Institute of Technology with grants from the National Geographic Society. The Second Palomar Observatory Sky Survey (POSS-II) was made by the California Institute of Technology with funds from the National Science Foundation, the National Geographic Society, the Sloan Foundation, the Samuel Oschin Foundation, and the Eastman Kodak Corporation. The Oschin Schmidt Telescope is operated by the California Institute of Technology and Palomar Observatory. The UK Schmidt Telescope was operated by the Royal Observatory Edinburgh, with funding from the UK Science and Engineering Research Council (later the UK Particle Physics and Astronomy Research Council), until 1988 June, and thereafter by the Anglo-Australian Observatory. The blue plates of the southern Sky Atlas and its Equatorial Extension (together known as the SERC-J), as well as the Equatorial Red (ER), and the Second Epoch [red] Survey (SES) were all taken with the UK Schmidt. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessESOCmd {varname iname} { upvar $varname var upvar $iname i ESODialog IMGSVRProcessCmd $varname $iname deso } proc ProcessSendESOCmd {proc id param} { ESODialog IMGSVRProcessSendCmd $proc $id $param deso } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/examine.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000017246 12464211203 016666� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ExamineDef {} { global pexamine # prefs only set pexamine(mode) new set pexamine(zoom) 4 } proc ExamineButton {which x y} { if {![$which has fits]} { return } switch -- [$which get type] { base {ExamineButtonBase $which $x $y} rgb {ExamineButtonRGB $which $x $y} 3d {ExamineButton3D $which $x $y} } } proc ExamineButtonBase {which x y} { global current global ds9 global pexamine # this code will not handle mosaics. # current coord set coord [$which get coordinates $x $y physical] # find filename/slice set fn [$which get fits file name full canvas $x $y] for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { set slice($ii) [$which get fits slice $ii] } # so the new frame will have all of the parent frame when created set ds9(next) $which GotoFrame # create frame if needed switch -- $pexamine(mode) { new {CreateFrame} one { if {[info exists pexamine(one)]} { if {$which == $pexamine(one)} { # do nothing, we clicked in the examine frame return } DeleteSingleFrame $pexamine(one) CreateFrame set pexamine(one) $current(frame) } else { CreateFrame set pexamine(one) $current(frame) } } } # go to tile mode in case set current(display) tile DisplayMode # load data LoadFitsFile $fn {} {} RealizeDS9 # set slice for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { $current(frame) update fits slice $ii $slice($ii) } # zoom to about if {[$current(frame) has fits bin]} { set bf "[$current(frame) get bin factor]" set bx [expr [lindex $bf 0]/$pexamine(zoom)] set by [expr [lindex $bf 1]/$pexamine(zoom)] $current(frame) bin factor to $bx $by about \ [lindex $coord 0] [lindex $coord 1] } else { $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ about physical [lindex $coord 0] [lindex $coord 1] } # back to original frame set ds9(next) $which GotoFrame # update any dialogs UpdateDS9 } proc ExamineButtonRGB {which x y} { global current global ds9 global pexamine # this code is far from perfect. It assumes data is loaded into the red # and it is the keychannel. Furthermore, it assumes either images or bin # tables are loaded into each channel, but not both. # this code will not handle mosaics. # save current channel set channel [$which get rgb channel] # current coord $which rgb channel red set coord [$which get coordinates $x $y physical] # find filename/slice foreach cc {red green blue} { $which rgb channel $cc set fn($cc) [$which get fits file name full canvas $x $y] for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { set slice($cc,$ii) [$which get fits slice $ii] } } # so the new frame will have all of the parent frame when created set ds9(next) $which GotoFrame # create frame if needed switch -- $pexamine(mode) { new {CreateRGBFrame} one { if {[info exists pexamine(one)]} { if {$which == $pexamine(one)} { # do nothing, we clicked in the examine frame return } DeleteSingleFrame $pexamine(one) CreateRGBFrame set pexamine(one) $current(frame) } else { CreateRGBFrame set pexamine(one) $current(frame) } } } # go to tile mode in case set current(display) tile DisplayMode # load data foreach cc {red green blue} { $current(frame) rgb channel $cc if {$fn($cc) != {}} { LoadFitsFile $fn($cc) {} {} } } RealizeDS9 # set slice foreach cc {red green blue} { $current(frame) rgb channel $cc for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { $current(frame) update fits slice $ii $slice($cc,$ii) } } # zoom to about $current(frame) rgb channel red if {[$current(frame) has fits bin]} { foreach cc {red green blue} { $which rgb channel $cc $current(frame) rgb channel $cc set bf "[$current(frame) get bin factor]" set bx [expr [lindex $bf 0]/$pexamine(zoom)] set by [expr [lindex $bf 1]/$pexamine(zoom)] $current(frame) bin factor to $bx $by about \ [lindex $coord 0] [lindex $coord 1] } } else { $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ about image [lindex $coord 0] [lindex $coord 1] } # set channel $current(frame) rgb channel $channel # back to original frame set ds9(next) $which GotoFrame $current(frame) rgb channel $channel # update any dialogs UpdateDS9 } proc ExamineButton3D {which x y} { global current global ds9 global pexamine # this code will not handle mosaics. # current coord set coord [$which get coordinates $x $y physical] # find filename/slice set fn [$which get fits file name full canvas $x $y] for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { set slice($ii) [$which get fits slice $ii] } # and 3d info set rr [$current(frame) get 3d view] set az [lindex $rr 0] set el [lindex $rr 1] set method [$current(frame) get 3d method] # so the new frame will have all of the parent frame when created set ds9(next) $which GotoFrame # create frame if needed switch -- $pexamine(mode) { new {Create3DFrame} one { if {[info exists pexamine(one)]} { if {$which == $pexamine(one)} { # do nothing, we clicked in the examine frame return } DeleteSingleFrame $pexamine(one) Create3DFrame set pexamine(one) $current(frame) } else { Create3DFrame set pexamine(one) $current(frame) } } } # go to tile mode in case set current(display) tile DisplayMode # load data LoadFitsFile $fn {} {} RealizeDS9 # set slice for {set ii 2} {$ii<$ds9(FTY_MAXAXES)} {incr ii} { $current(frame) update fits slice $ii $slice($ii) } # zoom to about if {[$current(frame) has fits bin]} { set bf "[$current(frame) get bin factor]" set bx [expr [lindex $bf 0]/$pexamine(zoom)] set by [expr [lindex $bf 1]/$pexamine(zoom)] $current(frame) bin factor to $bx $by about \ [lindex $coord 0] [lindex $coord 1] } else { $current(frame) zoom $pexamine(zoom) $pexamine(zoom) \ about physical [lindex $coord 0] [lindex $coord 1] } # set 3d $current(frame) 3d view $az $el $current(frame) 3d method $method # back to original frame set ds9(next) $which GotoFrame # update any dialogs UpdateDS9 } # Prefs proc PrefsDialogExamine {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Examine}] lappend dprefs(tabs) [ttk::frame $w.examine] # Examine set f [ttk::labelframe $w.examine.mode -text [msgcat::mc {Mode}]] ttk::radiobutton $f.new -text [msgcat::mc {New Frame each Time}] \ -variable pexamine(mode) -value new ttk::radiobutton $f.one -text [msgcat::mc {Examine Frame}] \ -variable pexamine(mode) -value one grid $f.new -padx 2 -pady 2 -sticky w grid $f.one -padx 2 -pady 2 -sticky w set f [ttk::labelframe $w.examine.mag -text [msgcat::mc {Magnification}]] ttk::radiobutton $f.x1 -text {1x} -variable pexamine(zoom) -value 1 ttk::radiobutton $f.x2 -text {2x} -variable pexamine(zoom) -value 2 ttk::radiobutton $f.x4 -text {4x} -variable pexamine(zoom) -value 4 ttk::radiobutton $f.x8 -text {8x} -variable pexamine(zoom) -value 8 ttk::radiobutton $f.x16 -text {16x} -variable pexamine(zoom) -value 16 grid $f.x1 $f.x2 $f.x4 $f.x8 $f.x16 -padx 2 -pady 2 -sticky w pack $w.examine.mode $w.examine.mag -side top -fill both -expand true } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/export.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000020465 12464211203 016556� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ExportDef {} { global export set export(array,endian) native set export(nrrd,endian) native set export(envi,endian) native set export(jpeg,quality) 75 set export(tiff,compress) none } proc Export {fn format fn2} { global export switch $format { array {ExportArrayFile $fn $export(array,endian)} rgbarray {ExportRGBArrayFile $fn $export(array,endian)} nrrd {ExportNRRDFile $fn $export(nrrd,endian)} envi {ExportENVIFile $fn $fn2 $export(envi,endian)} gif {ExportPhotoFile $fn $format {}} tiff {ExportPhotoFile $fn $format $export(tiff,compress)} jpeg {ExportPhotoFile $fn $format $export(jpeg,quality)} png {ExportPhotoFile $fn $format {}} } } # Process Cmds proc ProcessExportCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 set format {} set fn [lindex $var $i] set fn2 {} if {$fn == {}} { return } switch -- $fn { array - rgbarray - nrrd - envi - gif - tiff - jpeg - png { set format $fn set fn {} incr i } jpg { set format jpeg set fn {} incr i } tif { set format tiff set fn {} incr i } } # one last time if {$fn == {}} { set fn [lindex $var $i] if {$fn == {}} { return } } if {$format == {}} { set format [ExtToFormat $fn] } global export set param [string tolower [lindex $var [expr $i+1]]] switch $format { array - rgbarray { switch $param { native - big - bigendian - little - littleendian { set export(array,endian) $param incr i } } } nrrd { switch $param { native - big - bigendian - little - littleendian { set export(nrrd,endian) $param incr i } } } envi { switch $param { {} {set fn2 "[file rootname $fn].bsq"} native - big - bigendian - little - littleendian { set fn2 "[file rootname $fn].bsq" set export(envi,endian) $param incr i } default { if {[string range $param 0 0] == {-}} { set fn2 "[file rootname $fn].bsq" } else { set fn2 $param incr i set param [string tolower [lindex $var [expr $i+1]]] switch $param { native - big - bigendian - little - littleendian { set export(envi,endian) $param incr i } } } } } } gif {} jpeg { if {$param != {} && [string is integer $param]} { set export(jpeg,quality) $param incr i } } tiff { switch $param { none - jpeg - packbits - deflate { set export(tiff,compress) $param incr i } } } png {} } global arrayfbox global rgbarrayfbox global giffbox global jpegfbox global tifffbox global pngfbox global nrrdfbox global envifbox global envi2fbox switch -- $format { array {FileLast arrayfbox $fn} rgbarray {FileLast rgbarrayfbox $fn} nrrd {FileLast nrrdfbox $fn} envi { FileLast envifbox $fn FileLast envi2fbox $fn2 } gif {FileLast giffbox $fn} jpeg {FileLast jpegfbox $fn} tiff {FileLast tifffbox $fn} png {FileLast pngfbox $fn} } Export $fn $format $fn2 } # Support proc ExportDialog {format} { global export global arrayfbox global rgbarrayfbox global nrrdfbox global envifbox global envi2fbox global giffbox global jpegfbox global tifffbox global pngfbox switch -- $format { array {set fn [SaveFileDialog arrayfbox]} rgbarray {set fn [SaveFileDialog rgbarrayfbox]} nrrd {set fn [SaveFileDialog nrrdfbox]} envi {set fn [SaveFileDialog envifbox]} gif {set fn [SaveFileDialog giffbox]} jpeg {set fn [SaveFileDialog jpegfbox]} tiff {set fn [SaveFileDialog tifffbox]} png {set fn [SaveFileDialog pngfbox]} } set fn2 {} if {$fn != {}} { set ok 1 switch -- $format { array {set ok [ArrayExportDialog export(array,endian)]} rgbarray {} nrrd {set ok [ArrayExportDialog export(nrrd,endian)]} envi { set fn2 "[file rootname $fn].bsq" SetFileLast envi2 $fn2 # set fn2 [SaveFileDialog envi2fbox] # if {$fn2 == {}} { # set ok 0 # } if {$ok} { set ok [ArrayExportDialog export(envi,endian)] } } gif {} jpeg {set ok [JPEGExportDialog export(jpeg,quality)]} tiff {set ok [TIFFExportDialog export(tiff,compress)]} png {} } if {$ok} { Export $fn $format $fn2 } } } proc ArrayExportDialog {varname} { upvar $varname var global ed2 set w {.arr} set ed2(ok) 0 set ed2(arch) $var DialogCreate $w [msgcat::mc {Export Array}] ed2(ok) # Arch set f [ttk::labelframe $w.arch -text [msgcat::mc {Architecture}] -padding 2] ttk::radiobutton $f.native -text {Native} -variable ed2(arch) \ -value native ttk::radiobutton $f.big -text {Big-Endian} -variable ed2(arch) \ -value big ttk::radiobutton $f.little -text {Little-Endian} -variable ed2(arch) \ -value little grid $f.native -padx 2 -pady 2 -sticky w grid $f.big -padx 2 -pady 2 -sticky w grid $f.little -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini grid $w.arch -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set var $ed2(arch) } set rr $ed2(ok) unset ed2 return $rr } proc TIFFExportDialog {varname} { upvar $varname var global ed2 set w {.savetiff} set ed2(ok) 0 set ed2(compress) $var DialogCreate $w {TIFF} ed2(ok) # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Compression}] ttk::radiobutton $f.none -text [msgcat::mc {None}] \ -variable ed2(compress) -value none ttk::radiobutton $f.jpeg -text {JPEG} \ -variable ed2(compress) -value jpeg ttk::radiobutton $f.packbits -text {Packbits} \ -variable ed2(compress) -value packbits ttk::radiobutton $f.deflate -text {Deflate} \ -variable ed2(compress) -value deflate grid $f.title -padx 2 -pady 2 -sticky w grid $f.none -padx 2 -pady 2 -sticky w grid $f.jpeg -padx 2 -pady 2 -sticky w grid $f.packbits -padx 2 -pady 2 -sticky w grid $f.deflate -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set var $ed2(compress) } set rr $ed2(ok) unset ed2 return $rr } proc JPEGExportDialog {varname} { upvar $varname var global ed2 set w {.savejpeg} set ed2(ok) 0 set ed2(quality) $var DialogCreate $w {JPEG} ed2(ok) # Param set f [ttk::frame $w.param] slider $f.squality 0 100 [msgcat::mc {JPEG Quality Factor}] \ ed2(quality) {} grid $f.squality -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set var $ed2(quality) } set rr $ed2(ok) unset ed2 return $rr } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/external.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000002375 12514261632 017066� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc InitExternalFile {} { global ds9 if {[file exists "./$ds9(ext,file)"]} { ProcessExternalFile "./$ds9(ext,file)" } elseif {[file exists "./$ds9(ext,alt)"]} { ProcessExternalFile "./$ds9(ext,alt)" } elseif {[file exists "~/$ds9(ext,file)"]} { ProcessExternalFile "~/$ds9(ext,file)" } elseif {[file exists "~/$ds9(ext,alt)"]} { ProcessExternalFile "~/$ds9(ext,alt)" } } proc ProcessExternalFile {fn} { global extFits set status 1 if {[file exists "$fn"]} { set id [open $fn r] while {[gets $id line] >= 0} { # empty line if {[string length $line] == 0} continue # comments if {[string range $line 0 0] == "\#"} continue # else switch -- $status { 1 { # eat the line set template {} set status 2 } 2 { set template "$line" set status 3 } 3 { # eat the line set status 4 } 4 { if {"$template" != {} && "$line" != {}} { foreach t $template { set extFits($t) "$line" } } set status 1 } } } close $id } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/file.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000015636 12464211203 016160� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # backward compatibility proc ProcessFileCmd {varname iname sock ch fn} { upvar $varname var upvar $iname i set vvar $var set ii $i set zero $i set one [expr $i+1] set two [expr $i+2] set three [expr $i+3] switch -- [string tolower [lindex $var $zero]] { new { switch -- [string tolower [lindex $var $one]] { slice {ProcessFitsCmd vvar ii $sock $fn} fits { set vvar [lreplace $var $one $one] ProcessFitsCmd vvar ii $sock $fn } sfits { set vvar [lreplace $var $one $one] ProcessSFitsCmd vvar ii $sock $fn } rgbimage { set vvar [lreplace $var $one $one] ProcessRGBImageCmd vvar ii $sock $fn } rgbcube { set vvar [lreplace $var $one $one] ProcessRGBCubeCmd vvar ii $sock $fn } srgbcube { set vvar [lreplace $var $one $one] ProcessSRGBCubeCmd vvar ii $sock $fn } mecube { set vvar [lreplace $var $one $one] ProcessMECubeCmd vvar ii $sock $fn } memf - multiframe { set vvar [lreplace $var $one $one] ProcessMultiFrameCmd vvar ii $sock $fn } mosaicimage { set vvar [lreplace $var $one $one] ProcessMosaicImageCmd vvar ii $sock $fn } mosaicimagewcs { set vvar [lreplace $var $one $one] ProcessMosaicImageWCSCmd vvar ii $sock $fn } mosaicimageiraf { set vvar [lreplace $var $one $one] ProcessMosaicImageIRAFCmd vvar ii $sock $fn } mosaicimagewfpc2 { set vvar [lreplace $var $one $one] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn } mosaic { set vvar [lreplace $var $one $one] ProcessMosaicCmd vvar ii $sock $fn } mosaicwcs { set vvar [lreplace $var $one $one] ProcessMosaicWCSCmd vvar ii $sock $fn } mosaiciraf { set vvar [lreplace $var $one $one] ProcessMosaicIRAFCmd vvar ii $sock $fn } smosaic { set vvar [lreplace $var $one $one] ProcessSMosaicCmd vvar ii $sock $fn } smosaicwcs { set vvar [lreplace $var $one $one] ProcessSMosaicWCSCmd vvar ii $sock $fn } smosaiciraf { set vvar [lreplace $var $one $one] ProcessSMosaicIRAFCmd vvar ii $sock $fn } url { set vvar [lreplace $var $one $one] ProcessURLFitsCmd vvar ii } array { set vvar [lreplace $var $one $one] ProcessArrayCmd vvar ii $sock $fn } rgbarray { set vvar [lreplace $var $one $one] ProcessRGBArrayCmd vvar ii $sock $fn } photo { set vvar [lreplace $var $one $one] ProcessTIFFCmd vvar ii $ch $fn } default {ProcessFitsCmd vvar ii $sock $fn} } } mask { switch -- [string tolower [lindex $var $one]] { fits { set vvar [lreplace $var $one $one] ProcessFitsCmd vvar ii $sock $fn } sfits { set vvar [lreplace $var $one $one] ProcessSFitsCmd vvar ii $sock $fn } mosaicimage { set vvar [lreplace $var $one $one] ProcessMosaicImageCmd vvar ii $sock $fn } mosaicimagewcs { set vvar [lreplace $var $one $one] ProcessMosaicImageWCSCmd vvar ii $sock $fn } mosaicimageiraf { set vvar [lreplace $var $one $one] ProcessMosaicImageIRAFCmd vvar ii $sock $fn } mosaicimagewfpc2 { set vvar [lreplace $var $one $one] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn } mosaic { set vvar [lreplace $var $one $one] ProcessMosaicCmd vvar ii $sock $fn } mosaicwcs { set vvar [lreplace $var $one $one] ProcessMosaicWCSCmd vvar ii $sock $fn } mosaiciraf { set vvar [lreplace $var $one $one] ProcessMosaicIRAFCmd vvar ii $sock $fn } smosaic { set vvar [lreplace $var $one $one] ProcessSMosaicCmd vvar ii $sock $fn } smosaicwcs { set vvar [lreplace $var $one $one] ProcessSMosaicWCSCmd vvar ii $sock $fn } smosaiciraf { set vvar [lreplace $var $one $one] ProcessSMosaicIRAFCmd vvar ii $sock $fn } array { set vvar [lreplace $var $one $one] ProcessArrayCmd vvar ii $sock $fn } default {ProcessFitsCmd vvar ii $sock $fn} } } slice {ProcessFitsCmd vvar ii $sock $fn} fits { set vvar [lreplace $var $zero $zero] ProcessFitsCmd vvar ii $sock $fn } sfits { set vvar [lreplace $var $zero $zero] ProcessSFitsCmd vvar ii $sock $fn } rgbimage { set vvar [lreplace $var $zero $zero] ProcessRGBImageCmd vvar ii $sock $fn } rgbcube { set vvar [lreplace $var $zero $zero] ProcessRGBCubeCmd vvar ii $sock $fn } srgbcube { set vvar [lreplace $var $zero $zero] ProcessSRGBCubeCmd vvar ii $sock $fn } mecube { set vvar [lreplace $var $zero $zero] ProcessMECubeCmd vvar ii $sock $fn } memf - multiframe { set vvar [lreplace $var $zero $zero] ProcessMultiFrameCmd vvar ii $sock $fn } mosaicimage { set vvar [lreplace $var $zero $zero] ProcessMosaicImageCmd vvar ii $sock $fn } mosaicimagewcs { set vvar [lreplace $var $zero $zero] ProcessMosaicImageWCSCmd vvar ii $sock $fn } mosaicimageiraf { set vvar [lreplace $var $zero $zero] ProcessMosaicImageIRAFCmd vvar ii $sock $fn } mosaicimagewfpc2 { set vvar [lreplace $var $zero $zero] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn } mosaic { set vvar [lreplace $var $zero $zero] ProcessMosaicCmd vvar ii $sock $fn } mosaicwcs { set vvar [lreplace $var $zero $zero] ProcessMosaicWCSCmd vvar ii $sock $fn } mosaiciraf { set vvar [lreplace $var $zero $zero] ProcessMosaicIRAFCmd vvar ii $sock $fn } smosaic { set vvar [lreplace $var $zero $zero] ProcessSMosaicCmd vvar ii $sock $fn } smosaicwcs { set vvar [lreplace $var $zero $zero] ProcessSMosaicWCSCmd vvar ii $sock $fn } smosaiciraf { set vvar [lreplace $var $zero $zero] ProcessSMosaicIRAFCmd vvar ii $sock $fn } url { set vvar [lreplace $var $zero $zero] ProcessURLFitsCmd vvar ii } array { set vvar [lreplace $var $zero $zero] ProcessArrayCmd vvar ii $sock $fn } rgbarray { set vvar [lreplace $var $zero $zero] ProcessRGBArrayCmd vvar ii $sock $fn } photo { set vvar [lreplace $var $zero $zero] ProcessTIFFCmd vvar ii $ch $fn } save { set which image set fn {} switch -- [string tolower [lindex $var $one]] { resample { set which resample switch -- [string tolower [lindex $var $two]] { gz { # ignore set fn [lindex $var $three] } default {set fn [lindex $var $two]} } } gz { # ignore set fn [lindex $var $two] } default {set fn [lindex $var $one]} } SaveFitsFile $which $fn } default {ProcessFitsCmd vvar ii $sock $fn} } } proc ProcessSendFileCmd {proc id param} { global current if {$current(frame) != {}} { $proc $id "[$current(frame) get fits file name full]\n" } } ��������������������������������������������������������������������������������������������������saods9/ds9/library/fits.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000020615 12520761536 016213� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadFitsFile {fn layer mode} { global loadParam global current global pds9 global marker set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer ConvertFitsFile # save load type, since ProcessLoad will clear loadParam if {$loadParam(load,type) == "mmapincr"} { set mmap 1 } else { set mmap 0 } ProcessLoad # now autoload markers if {$pds9(automarker) && $mmap} { # now, load fits[REGION] if present set id [string first "\[" $fn] if {$id > 0} { set base [string range $fn 0 [expr $id-1]] } else { set base $fn } set reg "${base}\[REGION\]" if {[$current(frame) fitsy has ext "\"$reg\""]} { RealizeDS9 catch { $current(frame) marker load fits "\"$reg\"" $marker(color) $marker(dashlist) $marker(width) "\{$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\}" } } } } proc LoadFitsAlloc {path fn layer mode} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc LoadFitsSocket {sock fn layer mode} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc SaveFitsFile {which fn} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits $which file "\{$fn\}" } proc SaveFitsSocket {which sock} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits $which socket $sock } proc ProcessFitsCmd {varname iname sock fn} { upvar $varname var upvar $iname i if {[ProcessFitsBackwardCmd $varname $iname $sock $fn]} { return } global loadParam global current set layer {} set mode {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i set mode slice } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadFitsSocket $sock $param $layer $mode]} { InitError xpa LoadFitsFile $param $layer $mode } } else { # comm if {$fn != {}} { LoadFitsAlloc $fn $param $layer $mode } else { LoadFitsFile $param $layer $mode } } FinishLoad } proc ProcessSendFitsCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } set which image switch -- [string tolower [lindex $param 0]] { width { $proc $id "[$current(frame) get fits width]\n" return } height { $proc $id "[$current(frame) get fits height]\n" return } depth { $proc $id "[$current(frame) get fits depth 2]\n" return } bitpix { $proc $id "[$current(frame) get fits bitpix]\n" return } size { set sys [lindex $param 1] set sky [lindex $param 2] set format [lindex $param 3] if {$sys == {} && $sky == {} && $format == {}} { $proc $id "[$current(frame) get fits size]\n" } else { FixSpec sys sky format image fk5 degrees $proc $id "[$current(frame) get fits size $sys $sky $format]\n" } return } header { switch -- [llength $param] { 1 {ProcessSend $proc $id {} $fn {.txt} "[$current(frame) get fits header 1]\n"} 2 {ProcessSend $proc $id {} $fn {.txt} "[$current(frame) get fits header [lindex $param 1]]\n"} 3 { set key [lindex $param 2] set key [string trim $key \'] set key [string trim $key \{] set key [string trim $key \}] $proc $id "[string trim [$current(frame) get fits header keyword \{$key\}]]\n" } 4 { set key [lindex $param 3] set key [string trim $key \'] set key [string trim $key \{] set key [string trim $key \}] $proc $id "[string trim [$current(frame) get fits header [lindex $param 1] keyword \{$key\}]]\n" } } return } type { if {[$current(frame) has fits bin]} { $proc $id "table\n" } else { $proc $id "image\n" } return } table {set which table} image {} slice {set which slice} resample {set which resample} } if {$sock != {}} { # xpa SaveFitsSocket $which $sock } elseif {$fn != {}} { # comm SaveFitsFile $which $fn $proc $id {} $fn } } # backward compatibility proc ProcessFitsBackwardCmd {varname iname sock fn} { upvar 2 $varname var upvar 2 $iname i set vvar $var set ii $i switch -- [string tolower [lindex $var $i]] { new { switch -- [string tolower [lindex $var [expr $i+1]]] { rgbimage { set vvar [lreplace $var 1 1] ProcessRGBImageCmd vvar ii $sock $fn return 1 } rgbcube { set vvar [lreplace $var 1 1] ProcessRGBCubeCmd vvar ii $sock $fn return 1 } datacube - mecube - medatacube { set vvar [lreplace $var 1 1] ProcessMECubeCmd vvar ii $sock $fn return 1 } mosaicimage { set vvar [lreplace $var 1 1] ProcessMosaicImageCmd vvar ii $sock $fn return 1 } mosaicimagewcs { set vvar [lreplace $var 1 1] ProcessMosaicImageWCSCmd vvar ii $sock $fn return 1 } mosaicimageiraf { set vvar [lreplace $var 1 1] ProcessMosaicImageIRAFCmd vvar ii $sock $fn return 1 } mosaicimagewfpc2 { set vvar [lreplace $var 1 1] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn return 1 } mosaic { set vvar [lreplace $var 1 1] ProcessMosaicCmd vvar ii $sock $fn return 1 } mosaicwcs { set vvar [lreplace $var 1 1] ProcessMosaicWCSCmd vvar ii $sock $fn return 1 } mosaiciraf { set vvar [lreplace $var 1 1] ProcessMosaicIRAFCmd vvar ii $sock $fn return 1 } } } mask { switch -- [string tolower [lindex $var [expr $i+1]]] { mosaicimage { set vvar [lreplace $var 1 1] ProcessMosaicImageCmd vvar ii $sock $fn return 1 } mosaicimagewcs { set vvar [lreplace $var 1 1] ProcessMosaicImageWCSCmd vvar ii $sock $fn return 1 } mosaicimageiraf { set vvar [lreplace $var 1 1] ProcessMosaicImageIRAFCmd vvar ii $sock $fn return 1 } mosaicimagewfpc2 { set vvar [lreplace $var 1 1] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn return 1 } mosaic { set vvar [lreplace $var 1 1] ProcessMosaicCmd vvar ii $sock $fn return 1 } mosaicwcs { set vvar [lreplace $var 1 1] ProcessMosaicWCSCmd vvar ii $sock $fn return 1 } mosaiciraf { set vvar [lreplace $var 1 1] ProcessMosaicIRAFCmd vvar ii $sock $fn return 1 } } } datacube - mecube - medatacube { set vvar [lreplace $var 0 0] ProcessMECubeCmd vvar ii $sock $fn return 1 } memf - multiframe { set vvar [lreplace $var 0 0] ProcessMultiFrameCmd vvar ii $sock $fn return 1 } rgbimage { set vvar [lreplace $var 0 0] ProcessRGBImageCmd vvar ii $sock $fn return 1 } rgbcube { set vvar [lreplace $var 0 0] ProcessRGBCubeCmd vvar ii $sock $fn return 1 } mosaicimage { set vvar [lreplace $var 0 0] ProcessMosaicImageCmd vvar ii $sock $fn return 1 } mosaicimagewcs { set vvar [lreplace $var 0 0] ProcessMosaicImageWCSCmd vvar ii $sock $fn return 1 } mosaicimageiraf { set vvar [lreplace $var 0 0] ProcessMosaicImageIRAFCmd vvar ii $sock $fn return 1 } mosaicimagewfpc2 { set vvar [lreplace $var 0 0] ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn return 1 } mosaic { set vvar [lreplace $var 0 0] ProcessMosaicCmd vvar ii $sock $fn return 1 } mosaicwcs { set vvar [lreplace $var 0 0] ProcessMosaicWCSCmd vvar ii $sock $fn return 1 } mosaiciraf { set vvar [lreplace $var 0 0] ProcessMosaicIRAFCmd vvar ii $sock $fn return 1 } } return 0 } �������������������������������������������������������������������������������������������������������������������saods9/ds9/library/frame.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000151643 12616732023 016341� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Public Procedures proc CreateFrame {} { CreateNamedFrame base } proc CreateRGBFrame {} { CreateNamedFrame rgb RGBDialog } proc Create3DFrame {} { CreateNamedFrame 3d 3DDialog } proc CreateNamedFrame {type} { global ds9 # find the first open slot set num $ds9(next,num) while {1} { set which "Frame$num" if {[lsearch $ds9(frames) $which]==-1} { CreateNameNumberFrame $which $type set ds9(next,num) [expr $num+1] return } incr num } } proc CreateGotoFrame {num type} { global ds9 global active set which "Frame$num" if {[lsearch $ds9(frames) $which]==-1} { CreateNameNumberFrame $which $type set ds9(next,num) [expr $num+1] } else { if {$active($which)==0} { set active($which) 1 UpdateActiveFrames } set ds9(next) $which GotoFrame } } # used by backup proc CreateNameNumberFrame {which type} { global ds9 global pds9 global active global current global ipanner global ppanner global imagnifier global pmagnifier global bin global wcs global colorbar global scale global minmax global zscale global marker global pmarker global centroid global panzoom global block global smooth global pthreed global threed global cube set ds9(next) $which # update frame lists lappend ds9(frames) $ds9(next) lappend ds9(active) $ds9(next) set ds9(active,num) [llength $ds9(active)] set active($ds9(next)) 1 # and create the frame switch -- $type { base { $ds9(canvas) create frame$ds9(visual)$ds9(depth) \ -command $ds9(next) $ds9(next) colormap [colorbar get colormap] } rgb { $ds9(canvas) create framergb$ds9(visual)$ds9(depth) \ -command $ds9(next) $ds9(next) colormap [colorbarrgb get colormap] } 3d { $ds9(canvas) create frame3d$ds9(visual)$ds9(depth) \ -command $ds9(next) $ds9(next) colormap [colorbar get colormap] } } $ds9(next) configure -x 0 -y 0 \ -anchor nw \ -tag $ds9(next) \ -helvetica $ds9(helvetica) \ -courier $ds9(courier) \ -times $ds9(times) $ds9(next) panner 'panner' $ipanner(size) $ipanner(size) $ds9(next) magnifier 'magnifier' $imagnifier(size) $imagnifier(size) $ds9(next) magnifier zoom $pmagnifier(zoom) $ds9(next) magnifier graphics $pmagnifier(region) $ds9(next) magnifier cursor $pmagnifier(cursor) $ds9(next) zoom to $current(zoom) $ds9(next) rotate to $current(rotate) $ds9(next) orient $current(orient) $ds9(next) wcs align $current(align) $ds9(next) pan preserve $panzoom(preserve) # set so prefs (pwcs) will work # may cause other problems, but can't remember why $ds9(next) wcs $wcs(system) $wcs(sky) $wcs(skyformat) $ds9(next) datasec $scale(datasec) $ds9(next) bg color $pds9(bg) $ds9(next) nan color $pds9(nan) $ds9(next) threads $pds9(threads) $ds9(next) iraf align $pds9(iraf) $ds9(next) marker epsilon $pmarker(epsilon) $ds9(next) marker show $marker(show) $ds9(next) marker show text $marker(show,text) $ds9(next) marker centroid auto $marker(centroid,auto) $ds9(next) marker centroid radius $marker(centroid,radius) $ds9(next) marker centroid iteration $marker(centroid,iteration) $ds9(next) marker preserve $marker(preserve) # Frame type items switch -- [$ds9(next) get type] { base - rgb {} 3d { $ds9(next) 3d method $pthreed(method) $ds9(next) 3d background $pthreed(background) $ds9(next) 3d border $pthreed(border) $ds9(next) 3d border color $pthreed(border,color) $ds9(next) 3d compass $pthreed(compass) $ds9(next) 3d compass color $pthreed(compass,color) $ds9(next) 3d highlite $pthreed(highlite) $ds9(next) 3d highlite color $pthreed(highlite,color) } } # channel dependent items switch -- [$ds9(next) get type] { base - 3d { $ds9(next) colorscale $scale(type) $ds9(next) colorscale log $scale(log) $ds9(next) clip scope $scale(scope) $ds9(next) clip mode $scale(mode) $ds9(next) clip user $scale(min) $scale(max) $ds9(next) clip minmax mode $minmax(mode) $ds9(next) clip zscale contrast $zscale(contrast) $ds9(next) clip zscale sample $zscale(sample) $ds9(next) clip zscale line $zscale(line) $ds9(next) bin function $bin(function) $ds9(next) bin factor to $bin(factor) $ds9(next) bin depth $bin(depth) $ds9(next) bin buffer size $bin(buffersize) $ds9(next) block to $block(factor) $ds9(next) cube axes $cube(axes) if {$smooth(view)} { $ds9(next) smooth $smooth(function) $smooth(radius) } } rgb { foreach c {red green blue} { $ds9(next) rgb channel $c $ds9(next) colorscale $scale(type) $ds9(next) colorscale log $scale(log) $ds9(next) clip scope $scale(scope) $ds9(next) clip mode $scale(mode) $ds9(next) clip user $scale(min) $scale(max) $ds9(next) datasec $scale(datasec) $ds9(next) clip minmax mode $minmax(mode) $ds9(next) clip zscale contrast $zscale(contrast) $ds9(next) clip zscale sample $zscale(sample) $ds9(next) clip zscale line $zscale(line) $ds9(next) bin function $bin(function) $ds9(next) bin factor to $bin(factor) $ds9(next) bin depth $bin(depth) $ds9(next) bin buffer size $bin(buffersize) $ds9(next) block to $block(factor) $ds9(next) cube axes $cube(axes) if {$smooth(view)} { $ds9(next) smooth $smooth(function) $smooth(radius) } } $ds9(next) rgb channel red } } switch $current(mode) { crosshair - analysis { $ds9(next) crosshair on } } UpdateFrameMenuItems UpdateDS9Static if {$current(frame) != {}} { $current(frame) colorbar tag "\{[$current(colorbar) get tag]\}" } set current(frame) $ds9(next) set ds9(next) {} DisplayMode } proc DeleteAllFramesMenu {} { global pds9 if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message [msgcat::mc {Delete All Frames?}]] != {ok}} { return } } DeleteAllFrames } proc DeleteCurrentFrame {} { global current if {$current(frame) != {}} { DeleteSingleFrame $current(frame) } } proc DeleteAllFrames {} { global ds9 foreach ff $ds9(frames) { DeleteFrame $ff } set ds9(next,num) 1 UpdateFrameMenuItems UpdateActiveFrames UpdateDS9Static ClearInfoBox PixelTableClearDialog ClearGraphData } proc DeleteSingleFrame {which} { DeleteFrame $which UpdateFrameMenuItems UpdateActiveFrames UpdateDS9Static PixelTableClearDialog ClearGraphData } proc DeleteFrame {which} { global ds9 global active global current global contour global marker # clear any loaded images ClearFrame $which # contour copy if {$contour(copy) == $which} { set contour(copy) {} } # marker copy if {$marker(copy) == $which} { set marker(copy) {} } # delete canvas widget $ds9(canvas) delete $which # setup for next frame set ii [lsearch $ds9(active) $which] if {$ii>0} { set ds9(next) [lindex $ds9(active) [expr $ii-1]] set ds9(active) [lreplace $ds9(active) $ii $ii] set ds9(active,num) [llength $ds9(active)] unset active($which) } else { set ds9(next) {} } # delete it from the frame list set ii [lsearch $ds9(frames) $which] set ds9(frames) [lreplace $ds9(frames) $ii $ii] } proc UpdateCurrentFrame {} { global current UpdateFrame $current(frame) } proc UpdateAllFrame {} { global ds9 foreach f $ds9(frames) { UpdateFrame $f } } proc UpdateFrame {which} { if {$which != {}} { $which update } } # Event Processing proc BindEventsFrame {which} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "BindEventsFrame $which" } $ds9(canvas) bind $which <Motion> [list MotionFrame $which %x %y] $ds9(canvas) bind $which <Shift-Motion> \ [list ShiftMotionFrame $which %x %y] $ds9(canvas) bind $which <Control-Motion> \ [list ControlMotionFrame $which %x %y] $ds9(canvas) bind $which <Enter> [list EnterFrame $which %x %y] $ds9(canvas) bind $which <Leave> [list LeaveFrame $which] $ds9(canvas) bind $which <Button-1> [list Button1Frame $which %x %y] $ds9(canvas) bind $which <Shift-Button-1> \ [list ShiftButton1Frame $which %x %y] $ds9(canvas) bind $which <Control-Button-1> \ [list ControlButton1Frame $which %x %y] $ds9(canvas) bind $which <Control-Shift-Button-1> \ [list ControlShiftButton1Frame $which %x %y] $ds9(canvas) bind $which <B1-Motion> [list Motion1Frame $which %x %y] $ds9(canvas) bind $which <ButtonRelease-1> \ [list Release1Frame $which %x %y] $ds9(canvas) bind $which <Double-1> [list Double1Frame $which %x %y] $ds9(canvas) bind $which <Double-ButtonRelease-1> \ [list DoubleRelease1Frame $which %x %y] switch $ds9(wm) { x11 - win32 { $ds9(canvas) bind $which <Button-2> \ [list Button2Frame $which %x %y] $ds9(canvas) bind $which <Shift-Button-2> \ [list ShiftButton2Frame $which %x %y] $ds9(canvas) bind $which <B2-Motion> \ [list Motion2Frame $which %x %y] $ds9(canvas) bind $which <ButtonRelease-2> \ [list Release2Frame $which %x %y] } aqua { # swap button-2 and button-3 on the mighty mouse $ds9(canvas) bind $which <Button-3> \ [list Button2Frame $which %x %y] $ds9(canvas) bind $which <Shift-Button-3> \ [list ShiftButton2Frame $which %x %y] $ds9(canvas) bind $which <B3-Motion> \ [list Motion2Frame $which %x %y] $ds9(canvas) bind $which <ButtonRelease-3> \ [list Release2Frame $which %x %y] # x11 option key emulation $ds9(canvas) bind $which <Option-Button-1> \ [list Button2Frame $which %x %y] $ds9(canvas) bind $which <Option-B1-Motion> \ [list Motion2Frame $which %x %y] $ds9(canvas) bind $which <Option-ButtonRelease-1> \ [list Release2Frame $which %x %y] # x11 command key emulation # we need this to eat the Button-1 events # so it passes to the canvas $ds9(canvas) bind $which <Command-Button-1> {set foo bar} $ds9(canvas) bind $which <Command-B1-Motion> {set foo bar} $ds9(canvas) bind $which <Command-ButtonRelease-1> {set foo bar} } } switch $ds9(wm) { x11 { $ds9(canvas) bind $which <Button-4> \ [list Button4Frame $which %x %y] $ds9(canvas) bind $which <Button-5> \ [list Button5Frame $which %x %y] } aqua {} win32 {} } BindEventsFrameKey $which } proc BindEventsFrameKey {which} { global ds9 global ianalysis global debug if {$debug(tcl,events)} { puts stderr "BindEventsFrameKey $which" } $ds9(canvas) bind $which <Key> [list KeyFrame $which %K %A %x %y] $ds9(canvas) bind $which <KeyRelease> \ [list KeyReleaseFrame $which %K %A %x %y] for {set i 0} {$i<$ianalysis(bind,count)} {incr i} { $ds9(canvas) bind $which "$ianalysis(bind,$i,item)" \ [list AnalysisTask $i bind $which %x %y] } } proc UnBindEventsFrame {which} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "UnBindEventsFrame $which" } $ds9(canvas) bind $which <Button-4> {} $ds9(canvas) bind $which <Button-5> {} $ds9(canvas) bind $which <Motion> {} $ds9(canvas) bind $which <Shift-Motion> {} $ds9(canvas) bind $which <Control-Motion> {} $ds9(canvas) bind $which <Enter> {} $ds9(canvas) bind $which <Leave> {} $ds9(canvas) bind $which <Button-1> {} $ds9(canvas) bind $which <Shift-Button-1> {} $ds9(canvas) bind $which <Control-Button-1> {} $ds9(canvas) bind $which <Control-Shift-Button-1> {} $ds9(canvas) bind $which <B1-Motion> {} $ds9(canvas) bind $which <ButtonRelease-1> {} $ds9(canvas) bind $which <Double-1> {} $ds9(canvas) bind $which <Double-ButtonRelease-1> {} switch $ds9(wm) { x11 - win32 { $ds9(canvas) bind $which <Button-2> {} $ds9(canvas) bind $which <Shift-Button-2> {} $ds9(canvas) bind $which <B2-Motion> {} $ds9(canvas) bind $which <ButtonRelease-2> {} } aqua { $ds9(canvas) bind $which <Command-Button-1> {} $ds9(canvas) bind $which <Command-B1-Motion> {} $ds9(canvas) bind $which <Command-ButtonRelease-1> {} $ds9(canvas) bind $which <Button-3> {} $ds9(canvas) bind $which <Shift-Button-3> {} $ds9(canvas) bind $which <B3-Motion> {} $ds9(canvas) bind $which <ButtonRelease-3> {} $ds9(canvas) bind $which <Option-Button-1> {} $ds9(canvas) bind $which <Option-B1-Motion> {} $ds9(canvas) bind $which <Option-ButtonRelease-1> {} } } switch $ds9(wm) { x11 { $ds9(canvas) bind $which <Button-4> {} $ds9(canvas) bind $which <Button-5> {} } aqua {} win32 {} } UnBindEventsFrameKey $which } proc UnBindEventsFrameKey {which} { global ds9 global ianalysis global debug if {$debug(tcl,events)} { puts stderr "UnBindEventsFrameKey $which" } $ds9(canvas) bind $which <Key> {} $ds9(canvas) bind $which <KeyRelease> {} for {set i 0} {$i<$ianalysis(bind,count)} {incr i} { $ds9(canvas) bind $which "$ianalysis(bind,$i,item)" {} } } proc EnterFrame {which x y} { global ds9 global current global view global debug if {$debug(tcl,events)} { puts stderr "EnterFrame $which" } # check to see if this event was generated while processing other events if {$ds9(b1) || $ds9(sb1) || $ds9(cb1) || $ds9(csb1) || $ds9(b2) || $ds9(b3)} { return } $ds9(canvas) focus $which switch -- $current(mode) { crosshair - analysis { set coord [$which get crosshair canvas] set x [lindex $coord 0] set y [lindex $coord 1] } none - pointer - region - catalog - pan - zoom - rotate - crop - colorbar - examine - iexam {} } EnterInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateGraphXAxis $which UpdateGraphYAxis $which UpdateMagnifier $which $x $y if {$view(magnifier)} { # don't turn on the magnifier until we've finished the init process # this a real problem with 3d frames if {!$ds9(init)} { $which magnifier on } } UpdateEditMenu } proc LeaveFrame {which} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "LeaveFrame $which" } # check to see if this event was generated while processing other events if {$ds9(b1) || $ds9(sb1) || $ds9(cb1) || $ds9(csb1) || $ds9(b2) || $ds9(b3)} { return } $ds9(canvas) focus {} switch -- $current(mode) { crosshair - analysis {} none - pointer - region - colorbar - pan - zoom - rotate - crop - catalog - examine - iexam { LeaveInfoBox PixelTableClearDialog ClearGraphData } } $which magnifier off magnifier clear } proc MotionFrame {which x y} { global debug if {$debug(tcl,events)} { puts stderr "MotionFrame $which" } DoMotion $which $x $y sizing fleur } proc ShiftMotionFrame {which x y} { global debug if {$debug(tcl,events)} { puts stderr "ShiftMotionFrame $which" } DoMotion $which $x $y exchange fleur } proc ControlMotionFrame {which x y} { global debug if {$debug(tcl,events)} { puts stderr "ControlMotionFrame $which" } DoMotion $which $x $y sizing draped_box } proc DoMotion {which x y cursor1 cursor2} { global ds9 global current # if button 3 is down, ignore this event, we are doing something already if {$ds9(b3) || $ds9(b2)} { return } switch -- $current(mode) { pointer - region - catalog - analysis { if {$which == $current(frame)} { MarkerCursor $which $x $y $cursor1 $cursor2 } UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas } none - colorbar - pan - zoom - rotate - crop - examine - iexam { UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas } crosshair {} } UpdateMagnifier $which $x $y } proc Button1Frame {which x y} { global ds9 global current global imarker global debug if {$debug(tcl,events)} { puts stderr "Button1Frame $which" } # let others know that the mouse is down set ds9(b1) 1 switch -- $current(mode) { none { if {$which == $current(frame)} { } else { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set ds9(next) $which GotoFrame } UpdateMagnifier $which $x $y } pointer - region { if {$which == $current(frame)} { MarkerButton $which $x $y } else { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set ds9(next) $which GotoFrame } UpdateMagnifier $which $x $y } crosshair { CrosshairButton $which $x $y UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } colorbar { ColorbarButton3 $x $y } pan { PanButton $which $x $y UpdateMagnifier $which $x $y } zoom { ZoomButton $which $x $y UpdateMagnifier $which $x $y } rotate {RotateButton $which $x $y} crop { CropButton $which $x $y UpdateMagnifier $which $x $y } catalog { if {$which == $current(frame)} { CATButton $which $x $y } else { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set ds9(next) $which GotoFrame } UpdateMagnifier $which $x $y } analysis { IMEButton $which $x $y UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } examine {ExamineButton $which $x $y} iexam {IExamButton $which $x $y} } } proc ShiftButton1Frame {which x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "ShiftButton1Frame $which" } # let others know that the mouse is down set ds9(sb1) 1 switch -- $current(mode) { none {} pointer - region { if {$which == $current(frame)} { MarkerShift $which $x $y } UpdateMagnifier $which $x $y } crosshair {} colorbar {} pan {} zoom {ZoomShift $which} rotate - crop { Crop3dButton $which $x $y 0 UpdateMagnifier $which $x $y } catalog { if {$which == $current(frame)} { CATShift $which $x $y } UpdateMagnifier $which $x $y } analysis { IMEShift $which $x $y UpdateMagnifier $which $x $y } examine - iexam {} } } proc ControlButton1Frame {which x y} { global ds9 global current global imarker global debug if {$debug(tcl,events)} { puts stderr "ControlButton1Frame $which" } # let others know that the mouse is down set ds9(cb1) 1 switch -- $current(mode) { none {} pointer - region - catalog { if {$which == $current(frame)} { MarkerControl $which $x $y } else { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 } UpdateMagnifier $which $x $y } crosshair - colorbar - pan - zoom - rotate {} crop { Crop3dButton $which $x $y 1 UpdateMagnifier $which $x $y } analysis {} examine - iexam {} } } proc ControlShiftButton1Frame {which x y} { global ds9 global current global imarker global debug if {$debug(tcl,events)} { puts stderr "ControlShiftButton1Frame $which" } # let others know that the mouse is down set ds9(csb1) 1 switch -- $current(mode) { none {} pointer - region - catalog { if {$which == $current(frame)} { MarkerControlShift $which $x $y } else { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 } UpdateMagnifier $which $x $y } crosshair - colorbar - pan - zoom - rotate - crop - analysis {} examine - iexam {} } } proc Motion1Frame {which x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "Motion1Frame $which $x $y $ds9(b1) $ds9(sb1) $ds9(cb1)" } # abort if we are here by accident (such as a double click) if {($ds9(b1) == 0) && ($ds9(sb1) == 0) && ($ds9(cb1) == 0) && ($ds9(csb1) == 0)} { return } switch -- $current(mode) { none {UpdateMagnifier $which $x $y} pointer - region { if {$which == $current(frame)} { MarkerMotion $which $x $y } UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } crosshair { if {$ds9(b1)} { CrosshairButton $which $x $y UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } } colorbar { if {$ds9(b1)} { ColorbarMotion3 $x $y } } pan { if {$ds9(b1)} { PanMotion $which $x $y UpdateMagnifier $which $x $y } } zoom {UpdateMagnifier $which $x $y} rotate { if {$ds9(b1)} { RotateMotion $which $x $y } } crop { if {$ds9(b1)} { CropMotion $which $x $y } if {$ds9(sb1)} { Crop3dMotion $which $x $y 0 } if {$ds9(cb1)} { Crop3dMotion $which $x $y 1 } UpdateMagnifier $which $x $y } catalog { if {$which == $current(frame)} { CATMotion $which $x $y } UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } analysis { IMEMotion $which $x $y UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas UpdateMagnifier $which $x $y } examine - iexam {} } } proc Release1Frame {which x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "Release1Frame $which" } # abort if we are here by accident (such as a double click) if {($ds9(b1) == 0) && ($ds9(sb1) == 0) && ($ds9(cb1) == 0) && ($ds9(csb1) == 0)} { return } switch -- $current(mode) { pointer - region { if {$which == $current(frame)} { MarkerRelease $which $x $y } } crosshair { if {$ds9(b1)} { CrosshairButton $which $x $y UpdateColormapLevelMosaic $which $x $y canvas UpdateInfoBox $which $x $y canvas UpdatePixelTableDialog $which $x $y canvas UpdateGraph $which $x $y canvas } } colorbar { if {$ds9(b1)} { ColorbarRelease3 $x $y } } pan { if {$ds9(b1)} { PanRelease $which $x $y } } zoom {} rotate { if {$ds9(b1)} { RotateRelease $which $x $y } } crop { if {$ds9(b1)} { CropRelease $which $x $y } if {$ds9(sb1)} { Crop3dRelease $which $x $y 0 } if {$ds9(cb1)} { Crop3dRelease $which $x $y 1 } } catalog { if {$which == $current(frame)} { CATRelease $which $x $y } } none {} analysis { IMERelease $which $x $y } examine - iexam {} } # let others know that the mouse is up set ds9(b1) 0 set ds9(sb1) 0 set ds9(cb1) 0 set ds9(csb1) 0 UpdateEditMenu UpdateMagnifier $which $x $y } proc Double1Frame {which x y} { global current global debug if {$debug(tcl,events)} { puts stderr "Double1Frame $which" } switch -- $current(mode) { pointer - region { if {$which == $current(frame)} { MarkerDouble $which $x $y UpdateMagnifier $which $x $y } } none - crosshair - colorbar - pan - zoom - rotate - crop - catalog {} analysis { IMEDouble $which $x $y UpdateMagnifier $which $x $y } examine - iexam {} } } proc DoubleRelease1Frame {which x y} { global current global debug if {$debug(tcl,events)} { puts stderr "DoubleRelease1Frame $which" } switch -- $current(mode) { none - pointer - region - crosshair - colorbar - pan - zoom - rotate - crop - catalog - analysis - examine - iexam {} } UpdateEditMenu UpdateMagnifier $which $x $y } proc Button2Frame {which x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "Button2Frame" } set ds9(b2) 1 PanButton $which $x $y } proc ShiftButton2Frame {which x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "ShiftButton2Frame $which" } set ds9(sb2) 1 } proc Motion2Frame {which x y} { global debug if {$debug(tcl,events)} { puts stderr "Motion2Frame $which" } PanMotion $which $x $y } proc Release2Frame {which x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "Release2Frame $which" } PanRelease $which $x $y # let others know that the mouse is up set ds9(b2) 0 set ds9(sb2) 0 } proc Button4Frame {which x y} { global ppanzoom global pbin global debug if {$debug(tcl,events)} { puts stderr "Button4Frame $which $x $y" } if {[$which has fits bin]} { if {$pbin(wheel)} { set zz $pbin(wheel,factor) BinFrame $which $zz $zz return } } if {$ppanzoom(wheel)} { set zz [expr 1./$ppanzoom(wheel,factor)] ZoomFrame $which $zz $zz } } proc Button5Frame {which x y} { global ppanzoom global pbin global debug if {$debug(tcl,events)} { puts stderr "Button5Frame $which $x $y" } if {[$which has fits bin]} { if {$pbin(wheel)} { set zz [expr 1./$pbin(wheel,factor)] BinFrame $which $zz $zz return } } if {$ppanzoom(wheel)} { set zz $ppanzoom(wheel,factor) ZoomFrame $which $zz $zz } } # used by aqua and win32 proc MouseWheelFrame {X Y dd} { global ds9 global view global debug if {$debug(tcl,events)} { puts stderr "MouseWheel $X $Y $dd" } # macosx returns main window coords in X,Y switch $ds9(wm) { x11 {} aqua { switch $view(layout) { horizontal { set aa [winfo height $ds9(main)] set bb [winfo height $ds9(image)] set Y [expr $Y-$aa+$bb] } vertical { set aa [winfo width $ds9(main)] set bb [winfo width $ds9(image)] set X [expr $X-$aa+$bb] } } } win32 {} } set id [$ds9(canvas) find closest $X $Y] set which [lindex [$ds9(canvas) gettags $id] 0] if {[string equal -length 5 {Frame} $which]} { set orig [$ds9(canvas) coords $which] set x [expr $X-int([lindex $orig 0])] set y [expr $Y-int([lindex $orig 1])] if {$dd>0} { Button5Frame $which $x $y } else { Button4Frame $which $x $y } } } proc KeyFrame {which K A xx yy} { global ds9 global current # MacOSX and Ubuntu returns bogus values in xx,yy # calculate our own values set xx [expr {[winfo pointerx $ds9(canvas)] - [winfo rootx $ds9(canvas)]}] set yy [expr {[winfo pointery $ds9(canvas)] - [winfo rooty $ds9(canvas)]}] global debug if {$debug(tcl,events)} { puts stderr "KeyFrame $which $K $A $xx $yy" } if {$K == {Control_R} || $K == {Control_L} || $K == {Meta_R} || $K == {Meta_L} || $K == {Alt_R} || $K == {Alt_L} || $K == {Super_R} || $K == {Super_L} || $K == {??}} { set ds9(modifier) 1 return } # modal bindings switch -- $current(mode) { none { switch -- $K { c { if {!$ds9(modifier)} { DisplayCoordDialog $which $xx $yy } } plus {CubeNext} minus {CubePrev} Up - k {$which warp 0 -1} Down - j {$which warp 0 1} Left - h {$which warp -1 0} Right - l {$which warp 1 0} } } pointer - region { switch -- $K { c { if {!$ds9(modifier)} { DisplayCoordDialog $which $xx $yy } } plus {CubeNext} minus {CubePrev} Delete - BackSpace {MarkerDeleteKey $which $xx $yy} Up - k {MarkerArrowKey $which 0 -1} Down - j {MarkerArrowKey $which 0 1} Left - h {MarkerArrowKey $which -1 0} Right - l {MarkerArrowKey $which 1 0} i {$which marker property include 1 $xx $yy} e {$which marker property include 0 $xx $yy} s {$which marker property source 1 $xx $yy} b {$which marker property source 0 $xx $yy} g {GroupCreate} G {GroupCreateSilent} } } crosshair { switch -- $K { c { if {!$ds9(modifier)} { DisplayCoordDialog $which $xx $yy } } plus {CubeNext} minus {CubePrev} Up - k {CrosshairArrowKey $which 0 -1} Down - j {CrosshairArrowKey $which 0 1} Left - h {CrosshairArrowKey $which -1 0} Right - l {CrosshairArrowKey $which 1 0} } } pan { switch -- $K { Up - k {Pan 0 1 canvas} Down - j {Pan 0 -1 canvas} Left - h {Pan 1 0 canvas} Right - l {Pan -1 0 canvas} } UpdateMagnifier $which $xx $yy } catalog { switch -- $K { Up - k {MarkerArrowKey $which 0 -1} Down - j {MarkerArrowKey $which 0 1} Left - h {MarkerArrowKey $which -1 0} Right - l {MarkerArrowKey $which 1 0} } CATKey $which $K } analysis { switch -- $K { plus {CubeNext} minus {CubePrev} Up {IMEArrowKey $which 0 -1} Down {IMEArrowKey $which 0 1} Left {IMEArrowKey $which -1 0} Right {IMEArrowKey $which 1 0} default {IMEKey $which $K $xx $yy} } } iexam {IExamKey $which $K $xx $yy} colorbar - zoom - rotate - crop - examine {} } UpdateEditMenu } proc KeyReleaseFrame {which K A xx yy} { global ds9 # MacOSX and Ubuntu returns bogus values in xx,yy # calculate our own values set xx [expr {[winfo pointerx $ds9(canvas)] - [winfo rootx $ds9(canvas)]}] set yy [expr {[winfo pointery $ds9(canvas)] - [winfo rooty $ds9(canvas)]}] global debug if {$debug(tcl,events)} { puts stderr "KeyReleaseFrame $which $K $A $xx $yy" } if {$K == {Control_R} || $K == {Control_L} || $K == {Meta_R} || $K == {Meta_L} || $K == {Alt_R} || $K == {Alt_L} || $K == {Super_R} || $K == {Super_L}} { set ds9(modifier) 0 } } # Other Public Routines proc CopyFrame {} { global current switch -- $current(mode) { pointer - region {MarkerCopy} } } proc CutFrame {} { global current switch -- $current(mode) { pointer - region {MarkerCut} } } proc PasteFrame {} { global current switch -- $current(mode) { pointer - region {MarkerPaste} } } proc UndoFrame {} { global current switch -- $current(mode) { pointer - region {MarkerUndo} } } proc FirstFrame {} { global ds9 set ds9(next) [lindex $ds9(active) 0] GotoFrame } proc PrevFrame {} { global ds9 global current set ii [lsearch $ds9(active) $current(frame)] if {$ii>0} { set ds9(next) [lindex $ds9(active) [expr $ii-1]] } else { set ds9(next) [lindex $ds9(active) [expr $ds9(active,num)-1]] } GotoFrame } proc NextFrame {} { global ds9 global current set ii [lsearch $ds9(active) $current(frame)] if {$ii < [expr $ds9(active,num)-1]} { set ds9(next) [lindex $ds9(active) [expr $ii+1]] } else { set ds9(next) [lindex $ds9(active) 0] } GotoFrame } proc LastFrame {} { global ds9 set ds9(next) [lindex $ds9(active) [expr $ds9(active,num)-1]] GotoFrame } proc MoveFirstFrame {} { global ds9 global current set i [lsearch $ds9(frames) $current(frame)] set ds9(frames) [lreplace $ds9(frames) $i $i] set ds9(frames) [linsert $ds9(frames) 0 $current(frame)] UpdateFrameMenuItems UpdateActiveFrames } proc MovePrevFrame {} { global ds9 global current set i [lsearch $ds9(frames) $current(frame)] set ds9(frames) [lreplace $ds9(frames) $i $i] if {$i>0} { set ds9(frames) [linsert $ds9(frames) [expr $i-1] $current(frame)] } else { set ds9(frames) [linsert $ds9(frames) end $current(frame)] } UpdateFrameMenuItems UpdateActiveFrames } proc MoveNextFrame {} { global ds9 global current set i [lsearch $ds9(frames) $current(frame)] set ds9(frames) [lreplace $ds9(frames) $i $i] set last [llength $ds9(frames)] if {$i<$last} { set ds9(frames) [linsert $ds9(frames) [expr $i+1] $current(frame)] } else { set ds9(frames) [linsert $ds9(frames) 0 $current(frame)] } UpdateFrameMenuItems UpdateActiveFrames } proc MoveLastFrame {} { global ds9 global current set i [lsearch $ds9(frames) $current(frame)] set ds9(frames) [lreplace $ds9(frames) $i $i] set ds9(frames) [linsert $ds9(frames) end $current(frame)] UpdateFrameMenuItems UpdateActiveFrames } proc UpdateActiveFrames {} { global ds9 global active global current global debug if {$debug(tcl,update)} { puts stderr "UpdateActiveFrames" } # reset active list set ds9(active) {} set ds9(active,num) 0 foreach f $ds9(frames) { if {$active($f)} { lappend ds9(active) $f $ds9(mb).frame.goto entryconfig \ "[msgcat::mc {Frame}] [string range $f 5 end]" -state normal } else { $ds9(mb).frame.goto entryconfig \ "[msgcat::mc {Frame}] [string range $f 5 end]" -state disabled } } set ds9(active,num) [llength $ds9(active)] # New layout if needed if {$ds9(active,num) > 0} { if {[lsearch $ds9(active) $current(frame)] == -1} { if {$ds9(next) != {}} { set current(frame) $ds9(next) } else { set current(frame) [lindex $ds9(active) 0] set ds9(next) $current(frame) } } } DisplayMode } proc ActiveFrameAll {} { global ds9 global active foreach f $ds9(frames) { set active($f) 1 } UpdateActiveFrames } proc ActiveFrameNone {} { global ds9 global active foreach f $ds9(frames) { set active($f) 0 } UpdateActiveFrames } proc GotoFrame {} { global ds9 global current global active if {$current(frame) != {} && $current(frame) != $ds9(next)} { $current(frame) highlite off $current(frame) panner off switch -- $ds9(display) { blink - single { $current(frame) hide UnBindEventsFrame $current(frame) } tile {} } } if {$current(frame) != $ds9(next)} { if {$current(frame) != {}} { $current(frame) colorbar tag "\{[$current(colorbar) get tag]\}" } set current(frame) $ds9(next) set ds9(next) {} FrameToFront } } proc DisplayMode {} { global ds9 global current global tile global blink global iblink switch -- $current(display) { single {set ds9(display) $current(display)} tile { if {$ds9(active,num) > 1} { set ds9(display) $current(display) } else { switch -- $tile(grid,mode) { automatic {set ds9(display) single} manual {set ds9(display) $current(display)} } } } blink { if {$ds9(active,num) > 1} { set ds9(display) $current(display) } else { set ds9(display) single } } } switch -- $ds9(display) { single - tile { # turn off blink if on if {$iblink(id)>0} { after cancel $iblink(id) set iblink(id) 0 set iblink(index) -1 } LayoutFrames } blink { # ignore if we are already blinking if {$iblink(id)==0} { LayoutFrames BlinkTimer } } } } proc BlinkTimer {} { global blink global iblink global ds9 if {$ds9(active,num) > 0} { incr iblink(index) if {$iblink(index) >= $ds9(active,num)} { set iblink(index) 0 } set ds9(next) [lindex $ds9(active) $iblink(index)] GotoFrame } set iblink(id) [after $blink(interval) BlinkTimer] } proc ResetCurrentFrame {} { global current ResetFrame $current(frame) } proc ResetAllFrame {} { global ds9 foreach f $ds9(frames) { ResetFrame $f } } proc ResetFrame {which} { if {$which != {}} { if {[$which has iis]} { IISCursorModeCmd 0 } $which reset RefreshInfoBox $which PixelTableClearDialog ClearGraphData LockFrame $which UpdatePanZoomDialog UpdateCrosshairDialog UpdateCropDialog GridUpdateZoom UpdateZoomMenu UpdateScaleMenu UpdateScaleDialog UpdateGraphXAxis $which UpdateGraphYAxis $which SAMPSendCoordPointAtSkyCmd $which } } proc ClearCurrentFrame {} { global current ClearFrame $current(frame) ClearInfoBox PixelTableClearDialog ClearGraphData UpdateDS9 } proc ClearAllFrame {} { global ds9 foreach f $ds9(frames) { ClearFrame $f } ClearInfoBox PixelTableClearDialog ClearGraphData UpdateDS9 } proc ClearFrame {which} { if {$which == {}} { return } DestroyHeader $which $which clear # delete saved loadParams foreach cc {{} red green blue} { set varname $which$cc global $varname if {[info exists $varname]} { unset $varname } } } # Private Procedures proc FrameToFront {} { global ds9 global current global view global colorbar global blink set which $current(frame) # process proper colorbar switch -- [$which get type] { base - 3d { if {$view(colorbar)} { colorbar show } else { colorbar hide } colorbarrgb hide set current(colorbar) colorbar colorbar colorbar [$which get colorbar] colorbar tag "\{[$which get colorbar tag]\}" set colorbar(map) [colorbar get name] $ds9(canvas) raise colorbar colorbarrgb } rgb { colorbar hide if {$view(colorbar)} { colorbarrgb show } else { colorbarrgb hide } set current(colorbar) colorbarrgb colorbarrgb colorbar [$which get colorbar] colorbarrgb rgb channel [$which get rgb channel] $ds9(canvas) raise colorbarrgb colorbar } } set colorbar(invert) [$current(colorbar) get invert] $ds9(canvas) raise $which $which show switch -- $ds9(display) { single - blink { if {!$ds9(freeze)} { BindEventsFrame $which } } tile {$which highlite on} } if {$view(panner)} { $which panner on } UpdateDS9 } proc TileDialog {} { global tile global itile global dtile global ds9 # see if we already have a window visible if {[winfo exists $itile(top)]} { raise $itile(top) return } # create window set w $itile(top) set mb $itile(mb) Toplevel $w $mb 6 [msgcat::mc {Tile Parameters}] TileDestroyDialog set dtile(mode) $tile(grid,mode) set dtile(dir) $tile(grid,dir) set dtile(row) $tile(grid,row) set dtile(col) $tile(grid,col) set dtile(gap) $tile(grid,gap) $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command TileApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command TileDestroyDialog EditMenu $mb itile # Grid set f [ttk::labelframe $w.grid -text [msgcat::mc {Grid}] -padding 2] ttk::radiobutton $f.auto -text [msgcat::mc {Automatic}] \ -variable dtile(mode) -value automatic ttk::radiobutton $f.manual -text [msgcat::mc {Manual}] \ -variable dtile(mode) -value manual grid $f.auto $f.manual -padx 2 -pady 2 -sticky w # Grid Direction set f [ttk::labelframe $w.dir -text [msgcat::mc {Direction}] -padding 2] ttk::radiobutton $f.x -text [msgcat::mc {X}] \ -variable dtile(dir) -value x ttk::radiobutton $f.y -text [msgcat::mc {Y}] \ -variable dtile(dir) -value y grid $f.x $f.y -padx 2 -pady 2 -sticky w # Layout set f [ttk::labelframe $w.layout -text [msgcat::mc {Layout}] -padding 2] ttk::label $f.tcol -text [msgcat::mc {Columns}] ttk::label $f.trow -text [msgcat::mc {Rows}] ttk::entry $f.col -textvariable dtile(col) -width 6 ttk::label $f.tx -text {x} ttk::entry $f.row -textvariable dtile(row) -width 6 grid $f.tcol x $f.trow -padx 2 -pady 2 -sticky w grid $f.col $f.tx $f.row -padx 2 -pady 2 -sticky w # Gap set f [ttk::labelframe $w.gap -text [msgcat::mc {Gap}] -padding 2] ttk::entry $f.gap -textvariable dtile(gap) -width 6 ttk::label $f.ugap -text [msgcat::mc {Pixels}] grid $f.gap - $f.ugap -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command TileApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] -command TileDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini grid $w.grid -sticky news grid $w.dir -sticky news grid $w.layout -sticky news grid $w.gap -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid rowconfigure $w 2 -weight 1 grid rowconfigure $w 3 -weight 1 grid columnconfigure $w 0 -weight 1 } proc TileDestroyDialog {} { global itile global dtile if {[winfo exists $itile(top)]} { destroy $itile(top) destroy $itile(mb) } unset dtile } proc TileApplyDialog {} { global tile global dtile set tile(mode) grid set tile(grid,mode) $dtile(mode) set tile(grid,dir) $dtile(dir) set tile(grid,row) $dtile(row) set tile(grid,col) $dtile(col) set tile(grid,gap) $dtile(gap) DisplayMode } # Process Cmds proc ProcessFrameCmd {varname iname} { upvar $varname var upvar $iname i global current global active global panzoom catch { switch -- [string tolower [lindex $var $i]] { match { incr i MatchFrameCurrent [lindex $var $i] } lock { incr i set panzoom(lock) [lindex $var $i] LockFrameCurrent } center { incr i switch -- [lindex $var $i] { all {CenterAllFrame} {} {CenterCurrentFrame; incr i -1} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" CenterFrame $f } else { CenterCurrentFrame; incr i -1 } } } } clear { incr i switch -- [lindex $var $i] { all {ClearAllFrame} {} {ClearCurrentFrame; incr i -1} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" ClearFrame $f } else { ClearCurrentFrame; incr i -1 } } } } delete { incr i switch -- [lindex $var $i] { all {DeleteAllFrames} {} {DeleteCurrentFrame; incr i -1} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" DeleteSingleFrame $f } else { DeleteCurrentFrame; incr i -1 } } } } new { incr i switch -- [lindex $var $i] { rgb {CreateRGBFrame} 3d {Create3DFrame} default {CreateFrame; incr i -1} } } reset { incr i switch -- [lindex $var $i] { all {ResetAllFrame} {} {ResetCurrentFrame; incr i -1} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" ResetFrame $f } else { ResetCurrentFrame; incr i -1 } } } } refresh { incr i switch -- [lindex $var $i] { all {UpdateAllFrame} {} {UpdateCurrentFrame; incr i -1} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" UpdateFrame $f } else { UpdateCurrentFrame; incr i -1 } } } } hide { incr i switch -- [lindex $var $i] { all {ActiveFrameNone} {} { set active($current(frame)) 0 UpdateActiveFrames incr i -1 } default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" set active($f) 0 UpdateActiveFrames } else { set active($current(frame)) 0 UpdateActiveFrames incr i -1 } } } } show { incr i switch -- [lindex $var $i] { all {ActiveFrameAll} default { if {[string is integer [lindex $var $i]]} { set f "Frame[lindex $var $i]" set active($f) 1 UpdateActiveFrames } else { incr i -1 } } } } move { incr i switch -- [lindex $var $i] { first {MoveFirstFrame} back {MovePrevFrame} forward {MoveNextFrame} last {MoveLastFrame} } } first {FirstFrame} prev {PrevFrame} next {NextFrame} last {LastFrame} frameno {incr i; CreateGotoFrame [lindex $var $i] base} default {CreateGotoFrame [lindex $var $i] base} } } } proc ProcessSendFrameCmd {proc id param} { global ds9 global current global rgb global panzoom switch -- [lindex $param 0] { lock {$proc $id "$panzoom(lock)\n"} active { set r {} foreach f $ds9(active) { append r "[string range $f 5 end] " } $proc $id "$r\n" } all { set r {} foreach f $ds9(frames) { append r "[string range $f 5 end] " } $proc $id "$r\n" } has { if {$current(frame) == {}} { Error [msgcat::mc {No current frame}] return } switch [lindex $param 1] { amplifier - datamin - datasec - detector - grid - iis - irafmin - physical - smooth {$proc $id [ToYesNo [$current(frame) has [lindex $param 1]]]} contour { switch [lindex $param 2] { aux {$proc $id [ToYesNo [$current(frame) has contour aux]]} default {$proc $id [ToYesNo [$current(frame) has contour]]} } } fits { switch [lindex $param 2] { bin - cube - mosaic {$proc $id [ToYesNo [$current(frame) has fits [lindex $param 2]]]} default {$proc $id [ToYesNo [$current(frame) has fits]]} } } marker { switch [lindex $param 2] { highlite - paste - select - undo {$proc $id [ToYesNo [$current(frame) has marker [lindex $param 2]]]} } } system {$proc $id [ToYesNo [$current(frame) has system [lindex $param 2]]]} wcs { switch [lindex $param 2] { equatorial - linear {$proc $id [ToYesNo [$current(frame) has wcs [lindex $param 2] [lindex $param 3]]]} default {$proc $id [ToYesNo [$current(frame) has wcs [lindex $param 2]]]} } } } } default {$proc $id "[string range $current(frame) 5 end]\n"} } } proc ProcessSingleCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global current set current(display) single DisplayMode } proc ProcessSendSingleCmd {proc id param} { global current if {$current(display) == "single"} { $proc $id [ToYesNo 1] } else { $proc $id [ToYesNo 0] } } proc ProcessTileCmd {varname iname} { upvar $varname var upvar $iname i global current global tile switch -- [string tolower [lindex $var $i]] { mode { incr i set tile(mode) [lindex $var $i] } grid { incr i switch -- [string tolower [lindex $var $i]] { mode { incr i set tile(grid,mode) [lindex $var $i] } direction { incr i set tile(grid,dir) [lindex $var $i] } layout { incr i set tile(grid,col) [lindex $var $i] incr i set tile(grid,row) [lindex $var $i] set tile(grid,mode) {manual} } gap { incr i set tile(grid,gap) [lindex $var $i] } default { if {[string range [lindex $var $i] 0 0] != {-}} { set tile(mode) grid } else { incr i -1 } } } } column { set tile(mode) column } row { set tile(mode) row } yes - true - on - 1 - no - false - off - 0 { if {[FromYesNo [lindex $var $i]]} { set current(display) tile } else { set current(display) single } } default { set current(display) tile incr i -1 } } DisplayMode } proc ProcessSendTileCmd {proc id param} { global current global tile switch -- [lindex $param 0] { mode {$proc $id "$tile(mode)\n"} grid { switch -- [lindex $param 1] { mode {$proc $id "$tile(grid,mode)\n"} direction {$proc $id "$tile(grid,dir)\n"} layout {$proc $id "$tile(grid,col) $tile(grid,row)\n"} gap {$proc $id "$tile(grid,gap)\n"} } } default { if {$current(display)=="tile"} { $proc $id [ToYesNo 1] } else { $proc $id [ToYesNo 0] } } } } proc ProcessBlinkCmd {varname iname} { upvar $varname var upvar $iname i global current global blink switch -- [string tolower [lindex $var $i]] { interval { incr i set blink(interval) [expr int([lindex $var $i]*1000)] } yes - true - on - 1 - no - false - off - 0 { if {[FromYesNo [lindex $var $i]]} { set current(display) blink } else { set current(display) single } } default { set current(display) blink incr i -1 } } DisplayMode } proc ProcessSendBlinkCmd {proc id param} { global current global blink switch -- [lindex $param 0] { interval {$proc $id "[expr $blink(interval)/1000.]\n"} default { if {$current(display) == {blink}} { $proc $id [ToYesNo 1] } else { $proc $id [ToYesNo 0] } } } } proc ProcessLockCmd {varname iname} { upvar $varname var upvar $iname i global panzoom global crop global crosshair global cube global ime global bin global scale global colorbar global block global smooth # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { frame - frames { incr i set panzoom(lock) [lindex $var $i] LockFrameCurrent } crosshair - crosshairs { incr i set crosshair(lock) [lindex $var $i] LockCrosshairCurrent } crop { incr i set crop(lock) [lindex $var $i] LockCropCurrent } slice - cube - datacube { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { switch -- [lindex $var $i] { {} - yes - 1 {set cube(lock) image} no - 0 {set cube(lock) none} default {set cube(lock) [lindex $var $i]} } } else { set cube(lock) image incr i -1 } LockCubeCurrent } bin { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set bin(lock) [FromYesNo [lindex $var $i]] } else { set bin(lock) 1 incr i -1 } LockBinCurrent } axes - order { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set cube(lock,axes) [FromYesNo [lindex $var $i]] } else { set cube(lock,axes) 1 incr i -1 } LockAxesCurrent } scale - scales { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set scale(lock) [FromYesNo [lindex $var $i]] } else { set scale(lock) 1 incr i -1 } LockScaleCurrent } limits - scalelimits { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set scale(lock,limits) [FromYesNo [lindex $var $i]] } else { set scale(lock,limits) 1 incr i -1 } LockScaleLimitsCurrent } color - colormap - colorbar - colorbars { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set colorbar(lock) [FromYesNo [lindex $var $i]] } else { set colorbar(lock) 1 incr i -1 } LockColorCurrent } block { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set block(lock) [FromYesNo [lindex $var $i]] } else { set block(lock) 1 incr i -1 } LockBlockCurrent } smooth { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set smooth(lock) [FromYesNo [lindex $var $i]] } else { set smooth(lock) 1 incr i -1 } LockSmoothCurrent } } } proc ProcessSendLockCmd {proc id param} { global panzoom global crop global crosshair global cube global ime global bin global scale global colorbar global block global smooth switch -- [lindex $param 0] { frame - frames {$proc $id "$panzoom(lock)\n"} crosshair - crosshairs {$proc $id "$crosshair(lock)\n"} crop {$proc $id "$crop(lock)\n"} slice - cube - datacube {$proc $id "$cube(lock)\n"} analysis {$proc $id "$ime(lock)\n"} bin {$proc $id [ToYesNo $bin(lock)]} axes - order {$proc $id [ToYesNo $cube(lock,axes)]} scale - scales {$proc $id [ToYesNo $scale(lock)]} limits - scalelimits {$proc $id [ToYesNo $scale(lock,limits)]} color - colormap - colorbar - colorbars {$proc $id [ToYesNo $colorbar(lock)]} block {$proc $id [ToYesNo $block(lock)]} smooth {$proc $id [ToYesNo $smooth(lock)]} } } proc ProcessMatchCmd {varname iname} { upvar $varname var upvar $iname i global current # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { frame - frames { incr i MatchFrameCurrent [lindex $var $i] } crosshair - crosshairs { incr i MatchCrosshairCurrent [lindex $var $i] } crop { incr i MatchCropCurrent [lindex $var $i] } slice - cube - datacube { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { switch -- [lindex $var $i] { {} {MatchCubeCurrent image} default {MatchCubeCurrent [lindex $var $i]} } } else { MatchCubeCurrent image incr i -1 } } bin {MatchBinCurrent} axes - order {MatchAxesCurrent} scale - scales {MatchScaleCurrent} limits - scalelimits {MatchScaleLimitsCurrent} color - colormap - colorbar - colorbars {MatchColorCurrent} block {MatchBlockCurrent} smooth {MatchSmoothCurrent} } } ���������������������������������������������������������������������������������������������saods9/ds9/library/graph.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000025663 12620205542 016346� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc GraphDef {} { global igraph global pgraph set igraph(horz,id) 0 set igraph(vert,id) 0 set igraph(size) 150 set igraph(gap,x) 50 set igraph(gap,y) 25 set igraph(x,min) 0 set igraph(x,max) 10 set igraph(y,min) 1 set igraph(y,max) 100 global graphHorzX graphHorzY global graphVertX graphVertY global histX histY blt::vector create graphHorzX graphHorzY blt::vector create graphVertX graphVertY blt::vector create histX histY # prefs only set pgraph(horz,grid) 1 set pgraph(horz,log) false set pgraph(vert,grid) 1 set pgraph(vert,log) false } proc CreateGraphs {} { global igraph global ds9 global canvas # Horizontal Graph set ds9(graph,horz) [blt::graph $ds9(main).horz \ -width $canvas(width) -height $igraph(size) \ -takefocus 0 \ -background $ds9(bg) \ -highlightthickness 0 \ -plotborderwidth 2 \ -plotrelief groove \ -plotbackground $ds9(bg) \ -font [font actual TkDefaultFont] \ ] # we need to manually set the element foreground color, i.e. use graph fg set fgcolor [$ds9(graph,horz) cget -foreground] $ds9(graph,horz) legend configure -hide yes $ds9(graph,horz) crosshairs configure -color green $ds9(graph,horz) xaxis configure -hide no -showticks no -bg $ds9(bg) $ds9(graph,horz) x2axis configure -hide yes $ds9(graph,horz) yaxis configure -hide yes $ds9(graph,horz) y2axis configure -hide no -bg $ds9(bg) \ -tickfont [font actual TkDefaultFont] $ds9(graph,horz) element create line1 -xdata graphHorzX -ydata graphHorzY \ -color $fgcolor -symbol none bind $ds9(graph,horz) <Enter> [list EnterGraph $ds9(graph,horz) 1] bind $ds9(graph,horz) <Leave> [list LeaveGraph $ds9(graph,horz)] bind $ds9(graph,horz) <Button-1> \ [list MotionGraph $ds9(graph,horz) %x %y 1] bind $ds9(graph,horz) <B1-Motion> \ [list MotionGraph $ds9(graph,horz) %x %y 1] bind $ds9(graph,horz) <Up> [list ArrowKeyGraph $ds9(graph,horz) 0 -1 1] bind $ds9(graph,horz) <Down> [list ArrowKeyGraph $ds9(graph,horz) 0 1 1] bind $ds9(graph,horz) <Left> [list ArrowKeyGraph $ds9(graph,horz) -1 0 1] bind $ds9(graph,horz) <Right> [list ArrowKeyGraph $ds9(graph,horz) 1 0 1] # Vertical Graph set ds9(graph,vert) [blt::graph $ds9(main).vert \ -width $igraph(size) -height $canvas(height) \ -invertxy yes \ -takefocus 0 \ -background $ds9(bg) \ -highlightthickness 0 \ -plotrelief groove \ -plotborderwidth 2 \ -plotbackground $ds9(bg) ] $ds9(graph,vert) legend configure -hide yes $ds9(graph,vert) crosshairs configure -color green $ds9(graph,vert) xaxis configure -hide yes -descending yes $ds9(graph,vert) x2axis configure -hide no -descending yes \ -showticks no -bg $ds9(bg) $ds9(graph,vert) yaxis configure -hide no -descending yes \ -bg $ds9(bg) -tickfont [font actual TkDefaultFont] $ds9(graph,vert) y2axis configure -hide yes -descending yes $ds9(graph,vert) element create line1 -xdata graphVertX -ydata graphVertY \ -color $fgcolor -symbol none bind $ds9(graph,vert) <Enter> [list EnterGraph $ds9(graph,vert) 0] bind $ds9(graph,vert) <Leave> [list LeaveGraph $ds9(graph,vert)] bind $ds9(graph,vert) <Button-1> \ [list MotionGraph $ds9(graph,vert) %x %y 0] bind $ds9(graph,vert) <B1-Motion> \ [list MotionGraph $ds9(graph,vert) %x %y 0] bind $ds9(graph,vert) <Up> [list ArrowKeyGraph $ds9(graph,vert) 0 -1 0] bind $ds9(graph,vert) <Down> [list ArrowKeyGraph $ds9(graph,vert) 0 1 0] bind $ds9(graph,vert) <Left> [list ArrowKeyGraph $ds9(graph,vert) -1 0 0] bind $ds9(graph,vert) <Right> [list ArrowKeyGraph $ds9(graph,vert) 1 0 0] UpdateGraphGrid } proc UpdateGraphFont {} { global ds9 $ds9(graph,horz) y2axis configure -tickfont [font actual TkDefaultFont] $ds9(graph,vert) yaxis configure -tickfont [font actual TkDefaultFont] } proc UpdateGraphGrid {} { global pgraph global ds9 $ds9(graph,horz) xaxis configure -grid $pgraph(horz,grid) -tickdefault 4 $ds9(graph,horz) y2axis configure -grid $pgraph(horz,grid) $ds9(graph,vert) x2axis configure -grid $pgraph(vert,grid) $ds9(graph,vert) yaxis configure -grid $pgraph(vert,grid) -tickdefault 4 } proc UpdateGraphXAxis {which} { global ds9 global view # don't update if {!$ds9(idletasks)} { return } global debug if {$debug(tcl,update)} { puts stderr "UpdateGraphXAxis" } if {$view(graph,horz) || $view(graph,vert)} { global debug if {$debug(tcl,idletasks)} { puts stderr "UpdateGraphXAxis" } update idletasks } if {$view(graph,horz)} { UpdateGraphXAxisHV $which $ds9(graph,horz) graphHorzX graphHorzY 1 } if {$view(graph,vert)} { UpdateGraphXAxisHV $which $ds9(graph,vert) graphVertX graphVertY 0 } } proc UpdateGraphXAxisHV {which what vectorX vectorY cut} { global igraph global graphHorzX graphHorzY global graphVertX graphVertY if {$which != {}} { set xMin [expr "$$vectorX\(min\)"] set xMax [expr "$$vectorX\(max\)"] $what xaxis configure -min $xMin -max $xMax $what x2axis configure -min $xMin -max $xMax } else { $what xaxis configure -min $igraph(x,min) -max $igraph(x,max) $what x2axis configure -min $igraph(x,min) -max $igraph(x,max) } } proc UpdateGraphYAxis {which} { global pgraph global ds9 global view # don't update if {!$ds9(idletasks)} { return } global debug if {$debug(tcl,update)} { puts stderr "UpdateGraphYAxis" } if {$view(graph,horz) || $view(graph,vert)} { global debug if {$debug(tcl,idletasks)} { puts stderr "UpdateGraphYAxis" } update idletasks } if {$view(graph,horz)} { UpdateGraphYAxisHV $which $ds9(graph,horz) $pgraph(horz,log) } if {$view(graph,vert)} { UpdateGraphYAxisHV $which $ds9(graph,vert) $pgraph(vert,log) } } proc UpdateGraphYAxisHV {which what log} { global igraph if {$which != {}} { set minmax [$which get clip] set yMin [lindex $minmax 0] set yMax [lindex $minmax 1] # must use .eq. since "nan" is a legal double value if {$yMin eq "nan" || $yMax eq "nan"} { set yMin 0 set yMax 1 } if {$yMin >= $yMax} { set yMax [expr $yMin + 1] } $what yaxis configure -min $yMin -max $yMax -logscale $log -tickdefault 4 $what y2axis configure -min $yMin -max $yMax -logscale $log -tickdefault 4 } else { $what yaxis configure -min $igraph(y,min) -max $igraph(y,max) \ -logscale $log -tickdefault 4 $what y2axis configure -min $igraph(y,min) -max $igraph(y,max) \ -logscale $log -tickdefault 4 } } proc ShowGraphData {which} { global ds9 global view if {$view(graph,horz)} { ShowGraphDataHV $which $ds9(graph,horz) } if {$view(graph,vert)} { ShowGraphDataHV $which $ds9(graph,vert) } } proc ShowGraphDataHV {which what} { if {$which != {}} { if {[$which has fits]} { $what element configure line1 -hide no } else { $what element configure line1 -hide yes } } else { $what element configure line1 -hide yes } } proc ClearGraphData {} { global ds9 global view if {$view(graph,horz)} { $ds9(graph,horz) element configure line1 -hide yes } if {$view(graph,vert)} { $ds9(graph,vert) element configure line1 -hide yes } } proc UpdateGraph {which x y sys} { global ds9 global view if {[$which has fits]} { if {$view(graph,horz)} { $which get horizontal cut graphHorzX graphHorzY $x $y $sys $ds9(graph,horz) element configure line1 -hide no } if {$view(graph,vert)} { $which get vertical cut graphVertX graphVertY $x $y $sys $ds9(graph,vert) element configure line1 -hide no } } } proc EnterGraph {which horz} { global current focus $which $which crosshairs on if {$current(frame) != {}} { switch $current(mode) { crosshair - analysis { set x [$which crosshairs cget -x] set y [$which crosshairs cget -y] set coord [$current(frame) get crosshair canvas] set X [lindex $coord 0] set Y [lindex $coord 1] if {$horz} { EnterInfoBox $current(frame) $x $Y canvas UpdatePixelTableDialog $current(frame) $x $Y canvas } else { EnterInfoBox $current(frame) $X $y canvas UpdatePixelTableDialog $current(frame) $X $y canvas } } } } } proc LeaveGraph {which} { focus {} $which crosshairs off LeaveInfoBox PixelTableClearDialog } proc MotionGraph {which x y horz} { global current $which crosshairs configure -x $x -y $y if {$current(frame) != {}} { switch $current(mode) { crosshair - analysis { set coord [$current(frame) get crosshair canvas] set X [lindex $coord 0] set Y [lindex $coord 1] if {$horz} { UpdateInfoBox $current(frame) $x $Y canvas UpdatePixelTableDialog $current(frame) $x $Y canvas } else { UpdateInfoBox $current(frame) $X $y canvas UpdatePixelTableDialog $current(frame) $X $y canvas } } } } } proc ArrowKeyGraph {which x y horz} { set cx [$which crosshairs cget -x] set cy [$which crosshairs cget -y] set cx [expr $cx+$x] set cy [expr $cy+$y] MotionGraph $which $cx $cy $horz } proc LayoutGraphs {} { global igraph global ds9 global canvas global view global colorbar global icolorbar set cbh [expr $view(colorbar) && \ [string equal $colorbar(orientation) {horizontal}]] set cbv [expr $view(colorbar) && \ [string equal $colorbar(orientation) {vertical}]] set grh [expr $view(graph,horz)] set grv [expr $view(graph,vert)] if {$grh} { set xx 0 set yy [expr $canvas(height) + $canvas(gap)] if {$cbh} { incr yy $icolorbar(horizontal,height) } if {$grv && !$cbh} { incr yy $igraph(gap,y) } if {$igraph(horz,id) == 0} { set igraph(horz,id) [$ds9(canvas) create window $xx $yy \ -window $ds9(graph,horz) -anchor nw] } else { $ds9(canvas) coords $igraph(horz,id) $xx $yy } set ww [expr $canvas(width)+$igraph(gap,x)] $ds9(graph,horz) configure -width $ww } else { if {$igraph(horz,id)>0} { $ds9(canvas) delete $igraph(horz,id) set igraph(horz,id) 0 } } if {$grv} { set yy 0 set xx [expr $canvas(width) + $canvas(gap)] if {$cbv} { incr xx $icolorbar(vertical,width) } if {$grh && !$cbv} { incr xx $igraph(gap,x) } if {$igraph(vert,id) == 0} { set igraph(vert,id) [$ds9(canvas) create window $xx $yy \ -window $ds9(graph,vert) -anchor nw] } else { $ds9(canvas) coords $igraph(vert,id) $xx $yy } set hh [expr $canvas(height)+$igraph(gap,y)] $ds9(graph,vert) configure -height $hh } else { if {$igraph(vert,id)>0} { $ds9(canvas) delete $igraph(vert,id) set igraph(vert,id) 0 } } } �����������������������������������������������������������������������������saods9/ds9/library/grid.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000122402 12520501015 016150� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc GridDef {} { global igrid global grid global pgrid set igrid(top) .grid set igrid(mb) .gridmb set grid(view) 0 array set pgrid [array get grid] GridDefault } proc GridDefault {} { global grid set grid(type) analysis set grid(system) wcs set grid(sky) fk5 set grid(skyformat) sexagesimal set grid(grid) 1 set grid(grid,color) blue set grid(grid,width) 1 set grid(grid,style) 0 set grid(grid,gap1) {} set grid(grid,gap2) {} set grid(grid,gap3) {} set grid(grid,gapunit1) {} set grid(grid,gapunit2) {} set grid(grid,gapunit3) {} set grid(axes) 1 set grid(axes,color) red set grid(axes,width) 1 set grid(axes,style) 0 set grid(axes,type) interior set grid(axes,origin) lll set grid(tick) 1 set grid(tick,color) white set grid(tick,width) 1 set grid(tick,style) 0 set grid(border) 1 set grid(border,color) blue set grid(border,width) 1 set grid(border,style) 0 set grid(format1) {} set grid(format2) {} set grid(numlab) 1 set grid(numlab,font) helvetica set grid(numlab,size) 10 set grid(numlab,weight) normal set grid(numlab,slant) roman set grid(numlab,color) green set grid(numlab,gap1) {} set grid(numlab,gap2) {} set grid(numlab,gap3) {} set grid(numlab,type) interior set grid(numlab,vertical) 0 set grid(title) 1 set grid(title,text) {} set grid(title,def) 1 set grid(title,gap) {} set grid(title,font) helvetica set grid(title,size) 12 set grid(title,weight) normal set grid(title,slant) roman set grid(title,color) black set grid(textlab) 1 set grid(textlab,text1) {} set grid(textlab,text2) {} set grid(textlab,def1) 1 set grid(textlab,def2) 1 set grid(textlab,gap1) {} set grid(textlab,gap2) {} set grid(textlab,font) helvetica set grid(textlab,size) 10 set grid(textlab,weight) normal set grid(textlab,slant) roman set grid(textlab,color) black } proc GridUpdateCurrent {} { global current if {$current(frame) != {}} { GridUpdate $current(frame) } } proc GridUpdate {which} { global grid GridAdjustOptions $which if {$grid(view) && [$which has fits]} { $which grid create $grid(system) $grid(sky) \ $grid(skyformat) $grid(type) \ [GridBuildOptions $which] "\"[array get grid]\"" } else { $which grid delete } } proc GridUpdateZoom {} { global grid if {$grid(type) == "publication"} { GridUpdateCurrent } } proc GridAdjustOptions {which} { global grid if {$which != {}} { if {[$which has fits]} { # change values if needed for coordmenu AdjustCoordSystem grid system } } set grid(grid,gapunit1) pixels set grid(grid,gapunit2) pixels set grid(grid,gapunit3) pixels # adjust units switch -- $grid(system) { image - physical - amplifier - detector {} default { if {$which != {}} { if {[$which has wcs celestrial $grid(system)]} { set grid(grid,gapunit1) degrees set grid(grid,gapunit2) degrees } if {[$which has wcs 3d $grid(system)]} { set tt [string trim [$which get fits header keyword CTYPE3]] if {$tt != {}} { set grid(grid,gapunit3) $tt } } } } } } proc GridBuildOptions {which} { global grid global current set opt "\"" # Grid append opt " Grid=$grid(grid)," append opt " Colour(grid)=[GridColor2Ast $grid(grid,color)]," append opt " Width(grid)=$grid(grid,width)," append opt " Style(grid)=$grid(grid,style)," # Axes append opt " DrawAxes=$grid(axes)," append opt " Colour(axes)=[GridColor2Ast $grid(axes,color)]," append opt " Width(axes)=$grid(axes,width)," append opt " Style(axes)=$grid(axes,style)," # Format if {$grid(format1) != {}} { append opt " Format(1)=$grid(format1)," } else { set ff [GridDefaultFormat1] if {$ff != {}} { append opt " Format(1)=$ff," } } if {$grid(format2) != {}} { append opt " Format(2)=$grid(format2)," } else { set ff [GridDefaultFormat2] if {$ff != {}} { append opt " Format(2)=$ff," } } # Ticks if {!$grid(tick)} { append opt " MajTickLen=0," append opt " MinTick(1)=0," append opt " MinTick(2)=0," switch -- $grid(type) { analysis {} publication { switch -- [$which get type] { base - rgb {} 3d {append opt " MinTick(3)=0,"} } } } } append opt " Colour(ticks)=[GridColor2Ast $grid(tick,color)]," append opt " Width(ticks)=$grid(tick,width)," append opt " Style(ticks)=$grid(tick,style)," # Border append opt " Border=$grid(border)," append opt " Colour(border)=[GridColor2Ast $grid(border,color)]," append opt " Width(border)=$grid(border,width)," append opt " Style(border)=$grid(border,style)," # Labels append opt " Labelling=$grid(axes,type)," switch -- [$which get type] { base - rgb {append opt " LabelUp=$grid(numlab,vertical),"} 3d {append opt " LabelUp=1,"} } # NumLab append opt " NumLab=$grid(numlab)," set opt "$opt Font(numlab)=[GridFont2Ast $grid(numlab,font) $grid(numlab,weight) $grid(numlab,slant)]," append opt " Size(numlab)=$grid(numlab,size)," append opt " Colour(numlab)=[GridColor2Ast $grid(numlab,color)]," # TextLab switch -- $grid(type) { analysis {append opt " TextLab=0,"} publication { switch -- [$which get type] { base - rgb {append opt " TextLab=$grid(textlab),"} 3d {append opt " TextLab=0,"} } } } if {!$grid(textlab,def1)} { append opt " Label(1)=[GridStripComma $grid(textlab,text1)] ," } if {!$grid(textlab,def2)} { append opt " Label(2)=[GridStripComma $grid(textlab,text2)] ," } set opt "$opt Font(textlab)=[GridFont2Ast $grid(textlab,font) $grid(textlab,weight) $grid(textlab,slant)]," append opt " Size(textlab)=$grid(textlab,size)," append opt " Colour(textlab)=[GridColor2Ast $grid(textlab,color)]," # Title switch -- $grid(type) { analysis {append opt " DrawTitle=0,"} publication { switch -- [$which get type] { base - rgb {append opt " DrawTitle=$grid(title),"} 3d {append opt " DrawTitle=0,"} } } } if {$grid(title,def)} { set t [GridStripComma "[$which get fits object name]"] if {$t != {}} { append opt " Title=$t ," } } else { set t [GridStripComma "$grid(title,text)"] if {$t != {}} { append opt " Title=$t ," } } set opt "$opt Font(title)=[GridFont2Ast $grid(title,font) $grid(title,weight) $grid(title,slant)]," append opt " Size(title)=$grid(title,size)," append opt " Colour(title)=[GridColor2Ast $grid(title,color)]," # Grid Spacing if {$grid(grid,gap1) != {}} { if {$grid(grid,gapunit1) == "degrees"} { append opt " Gap(1)=[expr 3.14159/180.*$grid(grid,gap1)]," } else { append opt " Gap(1)=$grid(grid,gap1)," } } if {$grid(grid,gap2) != {}} { if {$grid(grid,gapunit2) == "degrees"} { append opt " Gap(2)=[expr 3.14159/180.*$grid(grid,gap2)]," } else { append opt " Gap(2)=$grid(grid,gap2)," } } switch -- [$which get type] { base - rgb {} 3d { if {$grid(grid,gap3) != {}} { if {$grid(grid,gapunit3) == "degrees"} { append opt " Gap(3)=[expr 3.14159/180.*$grid(grid,gap3)]," } else { append opt " Gap(3)=$grid(grid,gap3)," } } } } # axes numerics set flip 0 set numx 0 set numy 0 switch -- $grid(type) { analysis { switch -- [$which get type] { base - rgb { set numx -.03 set numy -.03 } 3d {} } } publication { switch -- [$which get type] { base - rgb { set numx -.02 set numy -.01 switch -- $grid(axes,type) { interior {} exterior { switch -- $grid(numlab,type) { interior {} exterior {set flip 1} } } } } 3d {} } } } # override if {$grid(numlab,gap1) != {}} { set numx [expr -$grid(numlab,gap1)/100.] } if {$grid(numlab,gap2) != {}} { set numy [expr -$grid(numlab,gap2)/100.] } if {$grid(numlab,gap3) != {}} { set numy [expr -$grid(numlab,gap3)/100.] } if {$flip} { set numx [expr -$numx] set numy [expr -$numy] } append opt " NumLabGap(1)=$numx," append opt " NumLabGap(2)=$numy," # Label gaps switch -- $grid(type) { analysis { set axisx 0 set axisy 0 set title 0 } publication { if {$grid(textlab,gap1) != {}} { set axisx [expr $grid(textlab,gap1)/100.] } else { set axisx 0 } if {$grid(textlab,gap2) != {}} { set axisy [expr $grid(textlab,gap2)/100.] } else { set axisy .1 } if {$grid(title,gap) != {}} { set title [expr $grid(title,gap)/100.] } else { set title .30 } } } append opt " TextLabGap(1)=$axisx," append opt " TextLabGap(2)=$axisy," append opt " TitleGap=[expr -1-$title]," # Orientation switch -- [$which get type] { base - rgb { append opt " Edge(1)=top," append opt " Edge(2)=left," } 3d { switch -- $grid(type) { analysis { append opt " Edge(1)=bottom," append opt " Edge(2)=left," } publication { append opt " RootCorner=$grid(axes,origin)," } } } } # 3D Normal switch -- $grid(type) { analysis {} publication { switch -- [$which get type] { base - rgb {} 3d {append opt " Norm(1)=0, Norm(2)=0, Norm(3)=-1,"} } } } # The End append opt " \"" global debug if {$debug(tcl,grid)} { puts stderr "GridBuildOptions" puts stderr "$opt" } return $opt } proc GridAst2Color {ast} { switch -- $ast { 0 {return {black}} 1 {return white} 2 {return red} 3 {return green} 4 {return blue} 5 {return cyan} 6 {return magenta} 7 {return yellow} 16777215 {return {white}} 16711680 {return {red}} 65280 {return {green}} 255 {return {blue}} 65535 {return {cyan}} 16711935 {return {magenta}} 16776960 {return {yellow}} default {return "#[format %x $ast]"} } } proc GridColor2Ast {which} { switch -- $which { black {return [expr 0x000000]} white {return [expr 0xffffff]} red {return [expr 0xff0000]} green {return [expr 0x00ff00]} blue {return [expr 0x0000ff]} cyan {return [expr 0x00ffff]} magenta {return [expr 0xff00ff]} yellow {return [expr 0xffff00]} default { if {[string range $which 0 0] == "#"} { return [expr 0x[string range $which 1 end]] } else { return [expr $which] } } } } proc GridAst2Font {ast fnvar fwvar fsvar} { upvar $fnvar fn upvar $fwvar fw upvar $fsvar fs switch -- $ast { 0 - 2 - 3 {set fn "helvetica"; set fw "normal"; set fs "roman"} 1 {set fn "times"; set fw "normal"; set fs "roman"} 4 {set fn "courier"; set fw "normal"; set fs "roman"} 10 - 12 - 13 {set fn "helvetica"; set fw "bold"; set fs "roman"} 11 {set fn "times"; set fw "bold"; set fs "roman"} 14 {set fn "courier"; set fw "bold"; set fs "roman"} 20 - 22 - 23 {set fn "helvetica"; set fw "normal"; set fs "italic"} 21 {set fn "times"; set fw "normal"; set fs "italic"} 24 {set fn "courier"; set fw "normal"; set fs "italic"} 30 - 32 - 33 {set fn "helvetica"; set fw "bold"; set fs "italic"} 31 {set fn "times"; set fw "bold"; set fs "italic"} 34 {set fn "courier"; set fw "bold"; set fs "italic"} default {set fn "helvetica"; set fw "normal"; set fs "roman"} } } proc GridFont2Ast {fn fw fs} { if {$fn == "times" && $fw == "normal" && $fs == "roman"} { return 1; } elseif {$fn == "helvetica" && $fw == "normal" && $fs == "roman"} { return 2; } elseif {$fn == "courier" && $fw == "normal" && $fs == "roman"} { return 4; } elseif {$fn == "times" && $fw == "bold" && $fs == "roman"} { return 11; } elseif {$fn == "helvetica" && $fw == "bold" && $fs == "roman"} { return 12; } elseif {$fn == "courier" && $fw == "bold" && $fs == "roman"} { return 14; } elseif {$fn == "times" && $fw == "normal" && $fs == "italic"} { return 21; } elseif {$fn == "helvetica" && $fw == "normal" && $fs == "italic"} { return 22; } elseif {$fn == "courier" && $fw == "normal" && $fs == "italic"} { return 24; } elseif {$fn == "times" && $fw == "bold" && $fs == "italic"} { return 31; } elseif {$fn == "helvetica" && $fw == "bold" && $fs == "italic"} { return 32; } elseif {$fn == "courier" && $fw == "bold" && $fs == "italic"} { return 34; } else { return 2; } } proc GridDialog {} { global igrid global grid global current global ds9 # see if we already have a window visible if {[winfo exists $igrid(top)]} { raise $igrid(top) return } # create the window set w $igrid(top) set mb $igrid(mb) Toplevel $w $mb 6 [msgcat::mc {Coordinate Grid Parameters}] \ GridDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Type}] -menu $mb.type $mb add cascade -label [msgcat::mc {Coordinate}] -menu $mb.coord $mb add cascade -label [msgcat::mc {Grid}] -menu $mb.grid $mb add cascade -label [msgcat::mc {Axes}] -menu $mb.axes $mb add cascade -label [msgcat::mc {Numerics}] -menu $mb.numlab $mb add cascade -label [msgcat::mc {Labels}] -menu $mb.textlab $mb add cascade -label [msgcat::mc {Tickmarks}] -menu $mb.tick $mb add cascade -label [msgcat::mc {Title}] -menu $mb.title $mb add cascade -label [msgcat::mc {Border}] -menu $mb.border # File menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command GridApplyDialog $mb.file add command -label [msgcat::mc {Reset}] -command GridResetDialog $mb.file add command -label [msgcat::mc {Clear}] -command GridClearDialog $mb.file add separator $mb.file add command -label "[msgcat::mc {Load Configuration}]..." \ -command GridLoadDialog $mb.file add command -label "[msgcat::mc {Save Configuration}]..." \ -command GridSaveDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command GridDestroyDialog # Edit EditMenu $mb igrid # Type menu $mb.type $mb.type add radiobutton -label [msgcat::mc {Analysis}] \ -variable grid(type) -value analysis -command GridApplyDialog $mb.type add radiobutton -label [msgcat::mc {Publication}] \ -variable grid(type) -value publication -command GridApplyDialog $mb.type add separator $mb.type add radiobutton -label [msgcat::mc {Interior Axes}] \ -variable grid(axes,type) -value interior -command GridApplyDialog $mb.type add radiobutton -label [msgcat::mc {Exterior Axes}] \ -variable grid(axes,type) -value exterior -command GridApplyDialog $mb.type add separator $mb.type add radiobutton -label [msgcat::mc {Interior Numerics}] \ -variable grid(numlab,type) -value interior -command GridApplyDialog $mb.type add radiobutton -label [msgcat::mc {Exterior Numerics}] \ -variable grid(numlab,type) -value exterior -command GridApplyDialog $mb.type add separator $mb.type add checkbutton -label [msgcat::mc {Vertical Text}] \ -variable grid(numlab,vertical) -command GridApplyDialog # Coordinate CoordMenu $mb.coord grid system 1 sky skyformat GridApplyDialog # Grid menu $mb.grid $mb.grid add checkbutton -label [msgcat::mc {Show}] \ -variable grid(grid) -command GridApplyDialog $mb.grid add separator $mb.grid add cascade -label [msgcat::mc {Color}] -menu $mb.grid.color $mb.grid add cascade -label [msgcat::mc {Line}] -menu $mb.grid.line ColorMenu $mb.grid.color grid grid,color GridApplyDialog GridCreateLineMenu $mb.grid.line grid,width grid,style # Axes menu $mb.axes $mb.axes add checkbutton -label [msgcat::mc {Show}] \ -variable grid(axes) -command GridApplyDialog $mb.axes add separator $mb.axes add cascade -label [msgcat::mc {Color}] -menu $mb.axes.color $mb.axes add cascade -label [msgcat::mc {Line}] -menu $mb.axes.line $mb.axes add separator $mb.axes add cascade -label [msgcat::mc {Origin}] -menu $mb.axes.origin ColorMenu $mb.axes.color grid axes,color GridApplyDialog GridCreateLineMenu $mb.axes.line axes,width axes,style menu $mb.axes.origin $mb.axes.origin add radiobutton -label [msgcat::mc {Lower Left Front}] \ -variable grid(axes,origin) -value lll -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Lower Right Front}] \ -variable grid(axes,origin) -value ull -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Upper Right Front}] \ -variable grid(axes,origin) -value uul -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Upper Left Front}] \ -variable grid(axes,origin) -value lul -command GridApplyDialog $mb.axes.origin add separator $mb.axes.origin add radiobutton -label [msgcat::mc {Lower Left Back}] \ -variable grid(axes,origin) -value llu -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Lower Right Back}] \ -variable grid(axes,origin) -value ulu -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Upper Right Back}] \ -variable grid(axes,origin) -value uuu -command GridApplyDialog $mb.axes.origin add radiobutton -label [msgcat::mc {Upper Left Back}] \ -variable grid(axes,origin) -value luu -command GridApplyDialog # Numerics menu $mb.numlab $mb.numlab add checkbutton -label [msgcat::mc {Show}] \ -variable grid(numlab) -command GridApplyDialog $mb.numlab add separator $mb.numlab add cascade -label [msgcat::mc {Color}] \ -menu $mb.numlab.color $mb.numlab add cascade -label [msgcat::mc {Font}] \ -menu $mb.numlab.font ColorMenu $mb.numlab.color grid numlab,color GridApplyDialog FontMenu $mb.numlab.font \ grid numlab,font numlab,size numlab,weight numlab,slant \ GridApplyDialog # Labels menu $mb.textlab $mb.textlab add checkbutton -label [msgcat::mc {Show}] \ -variable grid(textlab) -command GridApplyDialog $mb.textlab add separator $mb.textlab add cascade -label [msgcat::mc {Color}] \ -menu $mb.textlab.color $mb.textlab add cascade -label [msgcat::mc {Font}] \ -menu $mb.textlab.font ColorMenu $mb.textlab.color grid textlab,color GridApplyDialog FontMenu $mb.textlab.font \ grid textlab,font textlab,size textlab,weight textlab,slant \ GridApplyDialog # Tickmarks menu $mb.tick $mb.tick add checkbutton -label [msgcat::mc {Show}] \ -variable grid(tick) -command GridApplyDialog $mb.tick add separator $mb.tick add cascade -label [msgcat::mc {Color}] \ -menu $mb.tick.color $mb.tick add cascade -label [msgcat::mc {Line}] \ -menu $mb.tick.line ColorMenu $mb.tick.color grid tick,color GridApplyDialog GridCreateLineMenu $mb.tick.line tick,width tick,style # Title menu $mb.title $mb.title add checkbutton -label [msgcat::mc {Show}] \ -variable grid(title) -command GridApplyDialog $mb.title add separator $mb.title add cascade -label [msgcat::mc {Color}] -menu $mb.title.color $mb.title add cascade -label [msgcat::mc {Font}] -menu $mb.title.font ColorMenu $mb.title.color grid title,color GridApplyDialog FontMenu $mb.title.font \ grid title,font title,size title,weight title,slant \ GridApplyDialog # Border menu $mb.border $mb.border add checkbutton -label [msgcat::mc {Show}] \ -variable grid(border) -command GridApplyDialog $mb.border add separator $mb.border add cascade -label [msgcat::mc {Color}] -menu $mb.border.color $mb.border add cascade -label [msgcat::mc {Line}] -menu $mb.border.line ColorMenu $mb.border.color grid border,color GridApplyDialog GridCreateLineMenu $mb.border.line border,width border,style # Labels set f [ttk::labelframe $w.label -text [msgcat::mc {Labels}] -padding 2] ttk::label $f.label -text [msgcat::mc {Title}] ttk::entry $f.title -textvariable grid(title,text) \ -width 60 ttk::checkbutton $f.default -text [msgcat::mc {Default}] \ -variable grid(title,def) -command GridApplyDialog ttk::label $f.label1 -text "[msgcat::mc {Axis}] 1" ttk::entry $f.title1 -textvariable grid(textlab,text1) \ -width 60 ttk::checkbutton $f.default1 -text [msgcat::mc {Default}] \ -variable grid(textlab,def1) -command GridApplyDialog ttk::label $f.label2 -text "[msgcat::mc {Axis}] 2" ttk::entry $f.title2 -textvariable grid(textlab,text2) \ -width 60 ttk::checkbutton $f.default2 -text [msgcat::mc {Default}] \ -variable grid(textlab,def2) -command GridApplyDialog grid $f.label $f.title $f.default -padx 2 -pady 2 -sticky ew grid $f.label1 $f.title1 $f.default1 -padx 2 -pady 2 -sticky ew grid $f.label2 $f.title2 $f.default2 -padx 2 -pady 2 -sticky ew grid columnconfigure $f 1 -weight 1 # Params set f [ttk::labelframe $w.param -text [msgcat::mc {Spacing}] -padding 2] ttk::label $f.lspace -text "[msgcat::mc {Label}] %" ttk::label $f.ngap -text "[msgcat::mc {Numerics}] %" ttk::label $f.lformat -text [msgcat::mc {Format}] ttk::label $f.lgap -text [msgcat::mc {Grid Gap}] ttk::label $f.titlet -text [msgcat::mc {Title}] ttk::entry $f.spacet -textvariable grid(title,gap) \ -width 8 ttk::label $f.title1 -text "[msgcat::mc {Axis}] 1" ttk::entry $f.tspace1 -textvariable grid(textlab,gap1) -width 8 ttk::entry $f.nspace1 -textvariable grid(numlab,gap1) -width 8 ttk::entry $f.format1 -textvariable grid(format1) -width 8 ttk::entry $f.gap1 -textvariable grid(grid,gap1) -width 8 ttk::label $f.gapunit1 -textvariable grid(grid,gapunit1) ttk::label $f.title2 -text "[msgcat::mc {Axis}] 2" ttk::entry $f.tspace2 -textvariable grid(textlab,gap2) -width 8 ttk::entry $f.nspace2 -textvariable grid(numlab,gap2) -width 8 ttk::entry $f.format2 -textvariable grid(format2) -width 8 ttk::entry $f.gap2 -textvariable grid(grid,gap2) -width 8 ttk::label $f.gapunit2 -textvariable grid(grid,gapunit2) ttk::label $f.title3 -text "[msgcat::mc {Axis}] 3" ttk::entry $f.nspace3 -textvariable grid(numlab,gap3) -width 8 ttk::entry $f.format3 -textvariable grid(format3) -width 8 ttk::entry $f.gap3 -textvariable grid(grid,gap3) -width 8 ttk::label $f.gapunit3 -textvariable grid(grid,gapunit3) grid x $f.lspace $f.ngap $f.lformat $f.lgap -padx 2 -pady 2 -sticky w grid $f.titlet $f.spacet -padx 2 -pady 2 -sticky w grid $f.title1 $f.tspace1 $f.nspace1 $f.format1 $f.gap1 $f.gapunit1 \ -padx 2 -pady 2 -sticky w grid $f.title2 $f.tspace2 $f.nspace2 $f.format2 $f.gap2 $f.gapunit2 \ -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command GridApplyDialog ttk::button $f.reset -text [msgcat::mc {Reset}] -command GridResetDialog ttk::button $f.clear -text [msgcat::mc {Clear}] -command GridClearDialog ttk::button $f.close -text [msgcat::mc {Close}] -command GridDestroyDialog pack $f.apply $f.reset $f.clear $f.close -side left -expand true \ -padx 2 -pady 4 bind $w <Return> "GridApplyDialog" # Fini grid $w.label -sticky news grid $w.param -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 # some window managers need a hint raise $w UpdateGridDialog } proc GridApplyDialog {} { global grid set grid(view) 1 GridUpdateCurrent } proc GridResetDialog {} { GridDefault GridUpdateCurrent } proc GridClearDialog {} { global grid set grid(view) 0 GridUpdateCurrent } proc GridDestroyDialog {} { global igrid if {[winfo exists $igrid(top)]} { destroy $igrid(top) destroy $igrid(mb) } } proc UpdateGridMenu {} { global grid global current global wcs global debug if {$debug(tcl,update)} { puts stderr "UpdateGridMenu" } if {($current(frame) == {})} { return } # set menu if {[$current(frame) has fits]} { set grid(view) [$current(frame) has grid] } # reassign system and format if {[$current(frame) has fits] && [$current(frame) has grid]} { set ll [$current(frame) get grid] set grid(system) [lindex $ll 0] set grid(sky) [lindex $ll 1] set grid(skyformat) [lindex $ll 2] set grid(type) [lindex $ll 3] # fix for grids create with old backup command if {[$current(frame) get grid var] == {}} { $current(frame) grid delete $current(frame) grid create $grid(system) $grid(sky) \ $grid(skyformat) $grid(type) \ [GridBuildOptions $current(frame)] "\"[array get grid]\"" } array set grid [$current(frame) get grid var] } else { # can be changed by wcs SetCoordSystem grid system sky skyformat } } proc UpdateGridDialog {} { global current global igrid global grid set mb $igrid(mb) global debug if {$debug(tcl,update)} { puts stderr "UpdateGridDialog" } GridAdjustOptions $current(frame) if {[winfo exists $igrid(top)]} { set f $igrid(top).label set g $igrid(top).param if {$current(frame) != {}} { switch -- [$current(frame) get type] { base - rgb { $mb entryconfig [msgcat::mc {Labels}] -state normal $mb entryconfig [msgcat::mc {Title}] -state normal $mb.type entryconfig [msgcat::mc {Interior Numerics}] \ -state normal $mb.type entryconfig [msgcat::mc {Exterior Numerics}] \ -state normal $mb.type entryconfig [msgcat::mc {Vertical Text}] \ -state normal $mb.axes entryconfig [msgcat::mc {Origin}] \ -state disable $f.label configure -state normal $f.title configure -state normal $f.default configure -state normal $f.label1 configure -state normal $f.title1 configure -state normal $f.default1 configure -state normal $f.label2 configure -state normal $f.title2 configure -state normal $f.default2 configure -state normal $g.lspace configure -state normal $g.spacet configure -state normal $g.tspace1 configure -state normal $g.tspace2 configure -state normal grid forget $g.title3 $g.nspace3 $g.format3 $g.gap3 \ $g.gapunit3 } 3d { $mb entryconfig [msgcat::mc {Labels}] -state disabled $mb entryconfig [msgcat::mc {Title}] -state disabled $mb.type entryconfig [msgcat::mc {Interior Numerics}] \ -state disabled $mb.type entryconfig [msgcat::mc {Exterior Numerics}] \ -state disabled $mb.type entryconfig [msgcat::mc {Vertical Text}] \ -state disabled $mb.axes entryconfig [msgcat::mc {Origin}] -state normal $f.label configure -state disabled $f.title configure -state disabled $f.default configure -state disabled $f.label1 configure -state disabled $f.title1 configure -state disabled $f.default1 configure -state disabled $f.label2 configure -state disabled $f.title2 configure -state disabled $f.default2 configure -state disabled $g.lspace configure -state disabled $g.spacet configure -state disabled $g.tspace1 configure -state disabled $g.tspace2 configure -state disabled grid $g.title3 x $g.nspace3 $g.format3 $g.gap3 $g.gapunit3 \ -padx 2 -pady 2 -sticky w } } set grid(frame) $current(frame) if {[$current(frame) has fits]} { CoordMenuEnable $igrid(mb).coord grid system 1 sky skyformat } else { CoordMenuReset $igrid(mb).coord grid system 1 sky skyformat } } } } proc GridCreateLineMenu {which width dash} { global igrid global grid WidthDashMenu $which grid $width $dash GridApplyDialog GridApplyDialog } proc GridLoadDialog {} { GridLoad [OpenFileDialog gridfbox] } proc GridLoad {filename} { global grid if {$filename != {}} { source $filename } # backward compatibility FixFontVar grid(numlab,weight) grid(numlab,slant) grid(numlab,style) FixFontVar grid(textlab,weight) grid(textlab,slant) grid(textlab,style) FixFontVar grid(title,weight) grid(title,slant) grid(title,style) set grid(view) 1 GridUpdateCurrent } proc GridSaveDialog {} { GridSave [SaveFileDialog gridfbox] } proc GridSave {filename} { global grid if {$filename != {}} { set file [open $filename w] puts $file "global grid" puts $file "array set grid \{ [array get grid] \}" close $file } } proc GridStripComma {str} { # strip ',' set t {} regsub -all "," "$str" " " t return $t } proc GridDefaultFormat1 {} { global grid global current switch $grid(system) { image - physical - detector - amplifier {return {}} default { if {[$current(frame) has wcs equatorial $grid(system)]} { switch $grid(sky) { fk4 - fk5 - icrs { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {hms.1}} hms {return {lhms.1}} } } galactic - ecliptic { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {dms.1}} hms {return {ldms}} } } } return {} } if {[$current(frame) has wcs celestrial $grid(system)]} { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {dms.1}} hms {return {ldms}} } return {} } } } } proc GridDefaultFormat2 {} { global grid global current switch $grid(system) { image - physical - detector - amplifier {return {}} default { if {[$current(frame) has wcs equatorial $grid(system)]} { switch $grid(sky) { fk4 - fk5 - icrs { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {dms.1}} hms {return {ldms.1}} } } galactic - ecliptic { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {dms.1}} hms {return {ldms}} } } } return {} } if {[$current(frame) has wcs celestrial $grid(system)]} { switch $grid(skyformat) { degrees {return {d.3}} sexagesimal {return {dms.1}} hms {return {ldms}} } return {} } } } } proc GridBackup {ch which} { global grid if {[$which has grid]} { set ll [$which get grid] set system [lindex $ll 0] set sky [lindex $ll 1] set skyformat [lindex $ll 2] set type [lindex $ll 3] set opts [$which get grid option] set vars [array get grid] puts $ch "$which grid create $system $sky $skyformat $type \{\"$opts\"\} \{\"$vars\"\}" } } # Process Cmds proc ProcessGridCmd {varname iname} { upvar $varname var upvar $iname i global grid switch -- [string tolower [lindex $var $i]] { open {GridDialog} close {GridDestroyDialog} yes - true - on - 1 - no - false - off - 0 { set grid(view) [FromYesNo [lindex $var $i]] GridUpdateCurrent } type { incr i switch -- [string tolower [lindex $var $i]] { axes { # backward compatible incr i; set grid(axes,type) [lindex $var $i] } numerics { # backward compatible incr i; set grid(numlab,type) [lindex $var $i] } default {set grid(type) [lindex $var $i]} } GridUpdateCurrent } system {incr i; set grid(system) [lindex $var $i]; GridUpdateCurrent} sky {incr i set grid(sky) [string tolower [lindex $var $i]] GridUpdateCurrent } skyformat { incr i switch -- [string tolower [lindex $var $i]] { deg - degree - degrees {set grid(skyformat) degrees} default {set grid(skyformat) [string tolower [lindex $var $i]]} } GridUpdateCurrent } grid { incr i switch -- [string tolower [lindex $var $i]] { color {incr i; set grid(grid,color) [lindex $var $i]} width {incr i; set grid(grid,width) [lindex $var $i]} style {incr i; set grid(grid,style) [lindex $var $i]} gap1 {incr i; set grid(grid,gap1) [lindex $var $i]} gap2 {incr i; set grid(grid,gap2) [lindex $var $i]} gap3 {incr i; set grid(grid,gap3) [lindex $var $i]} default {set grid(grid) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } axes { incr i switch -- [string tolower [lindex $var $i]] { color {incr i; set grid(axes,color) [lindex $var $i]} width {incr i; set grid(axes,width) [lindex $var $i]} style {incr i; set grid(axes,style) [lindex $var $i]} type {incr i; set grid(axes,type) [lindex $var $i]} origin {incr i; set grid(axes,origin) [lindex $var $i]} default {set grid(axes) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } format1 { incr i; set grid(format1) [lindex $var $i] GridUpdateCurrent } format2 { incr i; set grid(format2) [lindex $var $i] GridUpdateCurrent } tickmark - tickmarks - tick { incr i switch -- [string tolower [lindex $var $i]] { color {incr i; set grid(tick,color) [lindex $var $i]} width {incr i; set grid(tick,width) [lindex $var $i]} style {incr i; set grid(tick,style) [lindex $var $i]} default {set grid(tick) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } border { incr i switch -- [string tolower [lindex $var $i]] { color {incr i; set grid(border,color) [lindex $var $i]} width {incr i; set grid(border,width) [lindex $var $i]} style {incr i; set grid(border,style) [lindex $var $i]} default {set grid(border) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } numeric - numerics - numlab { incr i switch -- [string tolower [lindex $var $i]] { font {incr i; set grid(numlab,font) [lindex $var $i]} fontsize {incr i; set grid(numlab,size) [lindex $var $i]} fontweight {incr i; set grid(numlab,weight) [lindex $var $i]} fontslant {incr i; set grid(numlab,slant) [lindex $var $i]} fontstyle { incr i switch [lindex $var $i] { normal { set grid(numlab,weight) normal set grid(numlab,slant) roman } bold { set grid(numlab,weight) bold set grid(numlab,slant) roman } italic { set grid(numlab,weight) normal set grid(numlab,slant) italic } } } color {incr i; set grid(numlab,color) [lindex $var $i]} gap1 {incr i; set grid(numlab,gap1) [lindex $var $i]} gap2 {incr i; set grid(numlab,gap2) [lindex $var $i]} gap3 {incr i; set grid(numlab,gap3) [lindex $var $i]} type {incr i; set grid(numlab,type) [lindex $var $i]} vertical {incr i; set grid(numlab,vertical) [FromYesNo [lindex $var $i]]} default {set grid(numlab) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } title { incr i switch -- [string tolower [lindex $var $i]] { text {incr i; set grid(title,text) [lindex $var $i]} def {incr i; set grid(title,def) [FromYesNo [lindex $var $i]]} gap {incr i; set grid(title,gap) [lindex $var $i]} font {incr i; set grid(title,font) [lindex $var $i]} fontsize {incr i; set grid(title,size) [lindex $var $i]} fontweight {incr i; set grid(title,weight) [lindex $var $i]} fontslant {incr i; set grid(title,slant) [lindex $var $i]} fontstyle { incr i switch [lindex $var $i] { normal { set grid(title,weight) normal set grid(title,slant) roman } bold { set grid(title,weight) bold set grid(title,slant) roman } italic { set grid(title,weight) normal set grid(title,slant) italic } } } color {incr i; set grid(title,color) [lindex $var $i]} default {set grid(title) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } label - labels - textlab { incr i switch -- [string tolower [lindex $var $i]] { text1 {incr i; set grid(textlab,text1) [lindex $var $i]} text2 {incr i; set grid(textlab,text2) [lindex $var $i]} def1 {incr i; set grid(textlab,def1) [FromYesNo [lindex $var $i]]} def2 {incr i; set grid(textlab,def2) [FromYesNo [lindex $var $i]]} gap1 {incr i; set grid(textlab,gap1) [lindex $var $i]} gap2 {incr i; set grid(textlab,gap2) [lindex $var $i]} font {incr i; set grid(textlab,font) [lindex $var $i]} fontsize {incr i; set grid(textlab,size) [lindex $var $i]} fontweight {incr i; set grid(textlab,weight) [lindex $var $i]} fontslant {incr i; set grid(textlab,slant) [lindex $var $i]} fontstyle { incr i switch [lindex $var $i] { normal { set grid(textlab,weight) normal set grid(textlab,slant) roman } bold { set grid(textlab,weight) bold set grid(textlab,slant) roman } italic { set grid(textlab,weight) normal set grid(textlab,slant) italic } } } color {incr i; set grid(textlab,color) [lindex $var $i]} default {set grid(textlab) [FromYesNo [lindex $var $i]]} } GridUpdateCurrent } view { # backward compatable incr i switch -- [string tolower [lindex $var $i]] { grid {incr i; set grid(grid) [FromYesNo [lindex $var $i]]} axes { incr i switch -- [string tolower [lindex $var $i]] { numbers {incr i; set grid(numlab) \ [FromYesNo [lindex $var $i]]} tickmarks {incr i; set grid(tick) \ [FromYesNo [lindex $var $i]]} label {incr i; set grid(textlab) \ [FromYesNo [lindex $var $i]]} default {set grid(axes) [FromYesNo [lindex $var $i]]} } } title {incr i; set grid(title) [FromYesNo [lindex $var $i]]} border {incr i; set grid(border) [FromYesNo [lindex $var $i]]} vertical { incr i set grid(numlab,vertical) [FromYesNo [lindex $var $i]] } } GridUpdateCurrent } reset {GridResetDialog} load { incr i set fn [lindex $var $i] FileLast gridfbox $fn GridLoad $fn } save { incr i set fn [lindex $var $i] FileLast gridfbox $fn GridSave $fn } default { set grid(view) 1 GridUpdateCurrent incr i -1 } } } proc ProcessSendGridCmd {proc id param} { global grid switch -- [lindex $param 0] { type { switch -- [lindex $param 1] { axes { # backward compatible $proc $id "$grid(axes,type)\n" } numerics { # backward compatible $proc $id "$grid(numlab,type)\n" } default {$proc $id "$grid(type)\n"} } } system {$proc $id "$grid(system)\n"} sky {$proc $id "$grid(sky)\n"} skyformat {$proc $id "$grid(skyformat)\n"} grid { switch -- [lindex $param 1] { color {$proc $id "$grid(grid,color)\n"} width {$proc $id "$grid(grid,width)\n"} style {$proc $id "$grid(grid,style)\n"} gap1 {$proc $id "$grid(grid,gap1)\n"} gap2 {$proc $id "$grid(grid,gap2)\n"} gap3 {$proc $id "$grid(grid,gap3)\n"} default {$proc $id [ToYesNo $grid(grid)]} } } axes { switch -- [lindex $param 1] { color {$proc $id "$grid(axes,color)\n"} width {$proc $id "$grid(axes,width)\n"} style {$proc $id "$grid(axes,style)\n"} type {$proc $id "$grid(axes,type)\n"} origin {$proc $id "$grid(axes,origin)\n"} default {$proc $id [ToYesNo $grid(axes)]} } } format1 {$proc $id "$grid(format1)\n"} format2 {$proc $id "$grid(format2)\n"} tickmark - tickmarks - tick { switch -- [lindex $param 1] { color {$proc $id "$grid(tick,color)\n"} width {$proc $id "$grid(tick,width)\n"} style {$proc $id "$grid(tick,style)\n"} default {$proc $id [ToYesNo $grid(tick)]} } } border { switch -- [lindex $param 1] { color {$proc $id "$grid(border,color)\n"} width {$proc $id "$grid(border,width)\n"} style {$proc $id "$grid(border,style)\n"} default {$proc $id [ToYesNo $grid(border)]} } } numeric - numerics - numlab { switch -- [lindex $param 1] { font {$proc $id "$grid(numlab,font)\n"} fontsize {$proc $id "$grid(numlab,size)\n"} fontstyle - fontweight {$proc $id "$grid(numlab,weight)\n"} fontslant {$proc $id "$grid(numlab,slant)\n"} color {$proc $id "$grid(numlab,color)\n"} gap1 {$proc $id "$grid(numlab,gap1)\n"} gap2 {$proc $id "$grid(numlab,gap2)\n"} gap3 {$proc $id "$grid(numlab,gap3)\n"} type {$proc $id "$grid(numlab,type)\n"} vertical {$proc $id "$grid(numlab,vertical)\n"} default {$proc $id [ToYesNo $grid(numlab)]} } } title { switch -- [lindex $param 1] { text {$proc $id "$grid(title,text)\n"} def {$proc $id [ToYesNo $grid(title,def)]} gap {$proc $id "$grid(title,gap)\n"} font {$proc $id "$grid(title,font)\n"} fontsize {$proc $id "$grid(title,size)\n"} fontstyle - fontweight {$proc $id "$grid(title,weight)\n"} fontslant {$proc $id "$grid(title,slant)\n"} color {$proc $id "$grid(title,color)\n"} default {$proc $id [ToYesNo $grid(title)]} } } label - labels - textlab { switch -- [lindex $param 1] { text1 {$proc $id "$grid(textlab,text1)\n"} text2 {$proc $id "$grid(textlab,text2)\n"} def1 {$proc $id [ToYesNo $grid(textlab,def1)]} def2 {$proc $id [ToYesNo $grid(textlab,def2)]} gap1 {$proc $id "$grid(textlab,gap1)\n"} gap2 {$proc $id "$grid(textlab,gap2)\n"} font {$proc $id "$grid(textlab,font)\n"} fontsize {$proc $id "$grid(textlab,size)\n"} fontstyle - fontweight {$proc $id "$grid(textlab,weight)\n"} fontslant {$proc $id "$grid(textlab,slant)\n"} color {$proc $id "$grid(textlab,color)\n"} default {$proc $id [ToYesNo $grid(textlab)]} } } view { # backward compatible switch -- [lindex $param 1] { grid {$proc $id [ToYesNo $grid(grid)]} axes { switch -- [lindex $param 2] { numbers {$proc $id [ToYesNo $grid(numlab)]} tickmarks {$proc $id [ToYesNo $grid(tick)]} label {$proc $id [ToYesNo $grid(textlab)]} default {$proc $id [ToYesNo $grid(axes)]} } } title {$proc $id [ToYesNo $grid(title)]} border {$proc $id [ToYesNo $grid(border)]} vertical {$proc $id [ToYesNo $grid(numlab,vertical)]} } } default {$proc $id [ToYesNo $grid(view)]} } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/group.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000011430 12514261632 016370� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc GroupDef {} { global igroup global dgroup set igroup(top) .grp set igroup(mb) .grpmb set dgroup(list) {} } proc GroupCreate {} { global current if {$current(frame) != {}} { set name [$current(frame) get marker tag default name] if {[EntryDialog [msgcat::mc {New Group}] [msgcat::mc {Enter Group Name}] 30 name]} { $current(frame) marker tag "\{$name\}" UpdateGroupDialog } } } proc GroupCreateSilent {} { global current if {$current(frame) != {}} { set name [$current(frame) get marker tag default name] $current(frame) marker tag "\{$name\}" UpdateGroupDialog } } proc GroupDialog {} { global ds9 global igroup global dgroup # see if we already have a window visible if {[winfo exists $igroup(top)]} { raise $igroup(top) return } # create the window set w $igroup(top) set mb $igroup(mb) Toplevel $w $mb 6 [msgcat::mc {Groups}] GroupDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Update Group}] \ -command GroupUpdateDialog $mb.file add separator $mb.file add command -label [msgcat::mc {New Group}] \ -command GroupCreate $mb.file add command -label [msgcat::mc {Edit Group Name}] \ -command GroupEditDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Delete Group}] \ -command GroupDeleteDialog $mb.file add command -label [msgcat::mc {Delete All Groups}] \ -command GroupDeleteAllDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command GroupDestroyDialog # List set f [ttk::frame $w.param] ttk::scrollbar $f.scroll -command [list $f.box yview] -orient vertical set dgroup(list) [listbox $f.box \ -yscroll [list $f.scroll set] \ -setgrid true \ -selectmode multiple \ ] grid $f.box $f.scroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 bind $dgroup(list) <<ListboxSelect>> GroupButtonDialog # Buttons set f [ttk::frame $w.buttons] ttk::button $f.update -text [msgcat::mc {Update}] \ -command GroupUpdateDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command GroupDestroyDialog pack $f.update $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -fill both -expand true UpdateGroupDialog } proc GroupButtonDialog {} { global dgroup global current if {$current(frame) != {}} { $current(frame) marker unselect all set rr [$dgroup(list) curselection] foreach ii $rr { if {[string length $ii] != 0} { $current(frame) marker "\{[$dgroup(list) get $ii]\}" select } } } } proc GroupDestroyDialog {} { global igroup if {[winfo exists $igroup(top)]} { destroy $igroup(top) destroy $igroup(mb) } } proc GroupUpdateDialog {} { global dgroup global current if {$current(frame) != {}} { set ll [$dgroup(list) curselection] if {[string length $ll] != 0} { $current(frame) marker tag update "\{[$dgroup(list) get $ll]\}" } } } proc GroupEditDialog {} { global dgroup global current if {$current(frame) != {}} { set i [$dgroup(list) curselection] if {[string length $i] != 0} { set which [$dgroup(list) get $i] if {[EntryDialog [msgcat::mc {Group Name}] [msgcat::mc {Enter Group Name}] 40 which]} { $current(frame) marker tag edit "\{[$dgroup(list) get $i]\}" "\{$which\}" UpdateGroupDialog } } } } proc GroupDeleteDialog {} { global dgroup global current if {$current(frame) != {}} { set i [$dgroup(list) curselection] if {[string length $i] != 0} { set which [$dgroup(list) get $i] $current(frame) marker tag delete "\{$which\}" UpdateGroupDialog } } } proc GroupDeleteAllDialog {} { global current global pds9 if {$current(frame) != {}} { if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message \ [msgcat::mc {Delete All Groups?}]] != {ok}} { return } } $current(frame) marker tag delete all UpdateGroupDialog } } proc UpdateGroupDialog {} { global igroup global dgroup global current global debug if {$debug(tcl,update)} { puts stderr "UpdateGroupDialog" } if {[winfo exists $igroup(top)]} { # clear the list $dgroup(list) delete 0 end if {$current(frame) != {}} { set grps [lsort [$current(frame) get marker tag all]] foreach f $grps { $dgroup(list) insert end $f } } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/header.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000010170 12607515146 016471� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc DisplayHeaderMenu {} { global current # possible cases # image primary # image xtension # compressed primary # compressed xtension # bin table xtension # hpx xtension # cube primary # cube xtension # multiple xtension cube # multiple file cube # mosaic extension # mosaic image xtension # mosaic cube xtension # mosaic image cube xtension set cnt [$current(frame) get fits count] if {$cnt > 0} { set slb(count) 0 # check for primary set fn [$current(frame) get fits file name 1] set xten \ [string trim [$current(frame) get fits header 1 keyword {XTENSION}]] if {$xten != {}} { set bb [string first {[} $fn] if {$bb>0} { set pn [string range $fn 0 [expr $bb-1]] } else { set pn $fn } incr slb(count) set slb($slb(count),item) $pn set slb($slb(count),value) -1 } set last {} for {set ii 1} {$ii <= $cnt} {incr ii} { set fn [$current(frame) get fits file name $ii] set bb [string first {[} $fn] if {$bb<0} { set nn [$current(frame) get fits ext $ii] if {$nn > 0} { set fn "$fn\[\]" } } if {$fn != $last} { incr slb(count) set slb($slb(count),item) $fn set slb($slb(count),value) $ii set last $fn } } if {$slb(count) <= 1} { DisplayHeader $current(frame) 1 $fn } else { if {[SLBDialog slb {Select Header} 40]} { DisplayHeader $current(frame) $slb(value) $slb(item) } } } } proc DisplayHeader {frame id title} { global current set varname "hd-$frame-$id" upvar #0 $varname var global $varname SimpleTextDialog $varname $title 80 40 insert top \ [$current(frame) get fits header $id] # create a special text tag for keywords $var(text) tag configure keyword -foreground blue # color tag keywords set stop [$var(text) index end] for {set ii 1.0} {$ii<$stop} {set ii [expr $ii+1]} { $var(text) tag add keyword $ii "$ii +8 chars" } } proc UpdateHeaderDialog {} { global current set frame $current(frame) set cnt 1 if {[$frame has fits mosaic]} { set cnt [$frame get fits count] } for {set id 1} {$id <= $cnt} {incr id} { set varname "hd-$frame-$id" upvar #0 $varname var global $varname if {![info exists var(top)]} { continue } if {![winfo exists $var(top)]} { continue } $var(text) delete 1.0 end $var(text) insert end [$frame get fits header $id] # color tag keywords set stop [$var(text) index end] for {set ii 1.0} {$ii<$stop} {set ii [expr $ii+1]} { $var(text) tag add keyword $ii "$ii +8 chars" } } } proc DestroyHeader {frame} { set cnt 1 if {[$frame has fits mosaic]} { set cnt [$frame get fits count] } for {set id 1} {$id <= $cnt} {incr id} { set varname "hd-$frame-$id" upvar #0 $varname var global $varname if {[info exists $varname]} { if {[winfo exists $var(top)]} { SimpleTextDestroy $varname } } } } proc ProcessHeaderCmd {varname iname} { upvar $varname var upvar $iname i set item [string tolower [lindex $var $i]] switch -- $item { close - save {incr i} } if {[lindex $var $i] != {} && [string is integer [lindex $var $i]]} { set jj [lindex $var $i] incr i } else { set jj 1 } global current if {$current(frame) != {}} { switch -- $item { close { set vvarname "hd[string range $current(frame) end end]-$jj" upvar #0 $vvarname vvar global $vvarname if {[info exists vvar(top)]} { SimpleTextDestroy $vvarname } incr i -1 } save { set fn [lindex $var $i] if {$fn != {}} { if {[catch {set ch [open "| cat > \"$fn\"" w]}]} { Error [msgcat::mc {An error has occurred while saving}] return } puts -nonewline $ch [$current(frame) get fits header $jj] close $ch } } default { catch {DisplayHeader $current(frame) $jj \ [$current(frame) get fits file name $jj]} incr i -1 } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/help.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000005427 12567651230 016202� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc HelpDef {} { global help global ds9 set help(refman) "$ds9(root)/doc/ref/index.html" set help(command) "$ds9(root)/doc/ref/command.html" set help(userman) "$ds9(root)/doc/user/index.html" set help(keyboard) "$ds9(root)/doc/ref/keyboard.html" set help(faq) "$ds9(root)/doc/faq.html" set help(new) "$ds9(root)/doc/new.html" set help(release) "$ds9(root)/doc/release/r7.0.html" set help(helpdesk) "$ds9(root)/doc/helpdesk.html" set help(story) "$ds9(root)/doc/story.html" set help(ack) "$ds9(root)/doc/acknowledgment.html" set help(vo) "$ds9(root)/doc/ref/vo.html" set help(about) "SAOImage DS9\nVersion $ds9(version)\n\nAuthors\nWilliam Joye (Smithsonian Astrophysical Observatory)\nEric Mandel (Smithsonian Astrophysical Observatory)\nSteve Murray (Smithsonian Astrophysical Observatory)\nJohn Roll (Smithsonian Astrophysical Observatory)\n\nSAOImage DS9 development has been made possible by funding from NASA's Applied Information Systems Research Program, Chandra X-ray Science Center (CXC), and the High Energy Astrophysics Science Archive Center (HEASARC). Additional funding was provided by the JWST Mission office at Space Telescope Science Institute to improve capabilities for 3D data visualization.\n\nColormaps\nh5utils: Steven Johnson (MIT)\nViridis: Eric Firing (UW)\nCubehelix: Dave Green (Cavendish)\nGist: David Munro (LLNL)\nTopographic: Tom Patterson (US National Park Service) " } proc HelpRef {} { global help HV hlpref [msgcat::mc {Reference Manual}] $help(refman) } proc HelpCommand {} { global help HV hlpcmd [msgcat::mc {Command}] $help(command) } proc HelpUser {} { global help HV hlpuser [msgcat::mc {User Manual}] $help(userman) } proc HelpKeyboard {} { global help HV hlpkeyboard [msgcat::mc {Keyboard Shortcuts}] $help(keyboard) } proc HelpFAQ {} { global help HV hlpfaq [msgcat::mc {FAQ}] $help(faq) } proc HelpNew {} { global help HV hlpnew [msgcat::mc {New Features}] $help(new) } proc HelpRelease {} { global help HV hlprelease [msgcat::mc {Release Notes}] $help(release) } proc HelpDesk {} { global help HV hlpdsk [msgcat::mc {Help Desk}] $help(helpdesk) } proc HelpStory {} { global help HV hlpstory [msgcat::mc {Story of SAOImage DS9}] $help(story) } proc HelpAck {} { global help HV hlpack [msgcat::mc {Acknowledgment}] $help(ack) } proc HelpVO {} { global help HV hlvo [msgcat::mc {Virtual Observatory}] $help(vo) } proc ProcessSendAboutCmd {proc id param sock fn} { global help ProcessSend $proc $id $sock $fn {.txt} "$help(about)\n" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/http.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000003403 12464211203 016205� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc HTTPDef {} { global ihttp global phttp # 1 minute set ihttp(timeout) 60000 # prefs only set phttp(proxy) 0 set phttp(proxy,host) {} set phttp(proxy,port) {} set phttp(auth) 0 set phttp(auth,user) {} set phttp(auth,passwd) {} } proc PrefsDialogHTTP {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {HTTP}] lappend dprefs(tabs) [ttk::frame $w.http] set f [ttk::labelframe $w.http.params -text [msgcat::mc {HTTP}]] ttk::label $f.tproxy -text [msgcat::mc {Use Proxy}] ttk::checkbutton $f.proxy -variable phttp(proxy) ttk::label $f.thost -text [msgcat::mc {Proxy Host}] ttk::entry $f.host -textvariable phttp(proxy,host) -width 50 ttk::label $f.tport -text [msgcat::mc {Proxy Port}] ttk::entry $f.port -textvariable phttp(proxy,port) -width 10 ttk::label $f.tauth -text [msgcat::mc {Use Authentication}] ttk::checkbutton $f.auth -variable phttp(auth) ttk::label $f.tuser -text [msgcat::mc {Username}] ttk::entry $f.user -textvariable phttp(auth,user) -width 30 ttk::label $f.tpasswd -text [msgcat::mc {Password}] ttk::entry $f.passwd -textvariable phttp(auth,passwd) -show "*" -width 10 grid $f.tproxy $f.proxy -padx 2 -pady 2 -sticky w grid $f.thost $f.host -padx 2 -pady 2 -sticky w grid $f.tport $f.port -padx 2 -pady 2 -sticky w grid $f.tauth $f.auth -padx 2 -pady 2 -sticky w grid $f.tuser $f.user -padx 2 -pady 2 -sticky w grid $f.tpasswd $f.passwd -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/hv.tcl���������������������������������������������������������������������������000644 �000765 �000000 �00000066520 12627140310 015655� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc HVDef {} { global ihv set ihv(unique) 0 set ihv(windows) {} } # Public proc HV {varname title url {init {}} {sync 0}} { upvar #0 $varname var global $varname global ds9 global ihv global debug if {$debug(tcl,hv)} { puts stderr "HV $varname $title $url $init $sync" } set var(top) ".${varname}" set var(mb) ".${varname}mb" set w $var(top) set mb $var(mb) # see if we already have a window visible if {[winfo exists $w]} { raise $w } else { # add it to our xpa list lappend ihv(windows) $varname set var(widget) {} set var(status) {} set var(sync) $sync set var(frame) new set var(save) 0 set var(title) "$title" set var(copy) {} set var(search) {} set var(search,start) 0 set var(active) 0 set var(index) 0 set var(font) $ds9(times) switch $ds9(wm) { x11 {set var(font,size) 10} aqua {set var(font,size) 16} win32 {set var(font,size) 14} } set var(font,weight) normal set var(font,slant) roman set var(init) $init set var(cookies) {} set var(images,forward) ${varname}forward set var(images,back) ${varname}back set var(images,reload) ${varname}reload set var(images,stop) ${varname}stop set var(images,gray) ${varname}gray # init some vars HVClearAll $varname set var(delete) 0 # create window Toplevel $w $mb 7 $title "HVDestroy $varname" $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {View}] -menu $mb.view $mb add cascade -label [msgcat::mc {Frame}] -menu $mb.frame menu $mb.file $mb.file add command -label [msgcat::mc {Open URL}] \ -command "HVURLDialogCmd $varname" $mb.file add command -label [msgcat::mc {Open File}] \ -command "HVFileDialogCmd $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Clear}] \ -command "HVClearCmd $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "HVDestroy $varname" menu $mb.edit $mb.edit add command -label [msgcat::mc {Cut}] \ -state disabled -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command "HVCopyCmd $varname" -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -state disabled -accelerator "${ds9(ctrl)}V" $mb.edit add separator switch $ds9(wm) { x11 - win32 { $mb.edit add command -label "[msgcat::mc {Find}]..." \ -command "HVFindCmd $varname" -accelerator "${ds9(ctrl)}F" } aqua { # Known bug in Tk, can't have dialogs invoked by accelerator $mb.edit add command -label "[msgcat::mc {Find}]..." \ -command "HVFindCmd $varname" } } $mb.edit add command -label [msgcat::mc {Find Next}] \ -command "HVFindNextCmd $varname" -accelerator "${ds9(ctrl)}G" $mb.edit add separator $mb.edit add command -label [msgcat::mc {Clear Cache}] \ -command "HVClearCache $varname" menu $mb.view $mb.view add command -label [msgcat::mc {Back}] \ -command "HVBackCmd $varname" $mb.view add command -label [msgcat::mc {Forward}] \ -command "HVForwardCmd $varname" $mb.view add separator $mb.view add command -label [msgcat::mc {Stop}] \ -command "HVStopCmd $varname" $mb.view add command -label [msgcat::mc {Reload}] \ -command "HVReloadCmd $varname" $mb.view add separator $mb.view add command -label [msgcat::mc {Page Source}] \ -command "HVPageSourceCmd $varname" menu $mb.frame $mb.frame add checkbutton \ -label [msgcat::mc {Save Image on Download}] \ -variable ${varname}(save) $mb.frame add separator $mb.frame add radiobutton \ -label [msgcat::mc {Create New Frame on Download}] \ -variable ${varname}(frame) -value new $mb.frame add radiobutton \ -label [msgcat::mc {Use Current Frame on Download}] \ -variable ${varname}(frame) -value current image create photo $var(images,back) -data {R0lGODlhDwANAKL/AM///8DAwJD//y/I/y+X/y9n/wAAAAAAACH5BAEAAAEALAAAAAAPAA0AAAM0GLq2/qE0+AqYVFmB6eZFKEoRIAyCaaYCYWxDLM9uYBAxoe/7dA8ug3AoZOg6mRsyuUxmEgA7} image create photo $var(images,forward) -data {R0lGODlhDwANAKL/AM///8DAwJD//y/I/y+X/y9n/wAAAAAAACH5BAEAAAEALAAAAAAPAA0AAAM3GLpa/K8YSMuYlBVwV/kgCAhdsAFoig7ktA1wLA9SQdw4DkuB4f8/Ag2TMRB4GYUBmewRm09FAgA7} image create photo $var(images,stop) -data {R0lGODlhDQANALP/AP///1Lq81I5Of+EhCEAAHsAAMYAAP+UQv9zCHuMjP8AMf8AKf+MnK1CSv8QIQAAACH5BAEAAAEALAAAAAANAA0AAARWMMjUTC1J6ubOQYdiCBuIIMuiiCT1OWu6Ys05AMPC4ItBGB8dYMdI+RoHR4qY6v1CwlvRcEQ4brndwFAgJAwIRdPIzVTEYiqXJBEU1FQCW5Mg2O0ZSQQAOw==} image create photo $var(images,reload) -data {R0lGODlhDAANALP/AP///zk5OVJSUoSEhKWlpcDAwP//1v//xr3erZTOezGcEFKtSimce3NzezkxOQAAACH5BAEAAAUALAAAAAAMAA0AAARRcJBJyRilEMC5AcjQaB1wHMYkCFuXLKDQONsBLIuynEBAGAcJAnYy0AyGBOLENPg4qGUISTMdEIoEg4A6ohK6BND4YyqBqCdyve453vB44BEBADs=} image create photo $var(images,gray) -data {R0lGODdhPAA+APAAALi4uAAAACwAAAAAPAA+AAACQISPqcvtD6OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbzCY1Kp9Sq9YrNFgsAO} # Buttons set f [ttk::frame $w.buttons] ttk::button $f.back -image $var(images,back) -takefocus 0 \ -command "HVBackCmd $varname" ttk::button $f.forward -image $var(images,forward) -takefocus 0 \ -command "HVForwardCmd $varname" ttk::button $f.stop -image $var(images,stop) -takefocus 0 \ -command "HVStopCmd $varname" ttk::button $f.reload -image $var(images,reload) -takefocus 0 \ -command "HVReloadCmd $varname" pack $f.back $f.forward $f.stop $f.reload -side left # Param set f [ttk::frame $w.param] set var(widget) [html $f.html \ -yscrollcommand "$f.yscroll set" \ -xscrollcommand "$f.xscroll set" \ -padx 5 \ -pady 9 \ -formcommand "HVFormCB $varname" \ -imagecommand "HVImageCB $varname" \ -scriptcommand "HVScriptCB $varname"\ -appletcommand "HVAppletCB $varname" \ -framecommand "HVFrameCB $varname" \ -underlinehyperlinks 1 \ -bg white \ -width 640 \ -height 512 \ -fontcommand "HVFontCB $varname" \ -tablerelief raised \ ] $var(widget) token handler {NOSCRIPT} "HVNoScriptCB $varname" $var(widget) token handler {/NOSCRIPT} "HVNoScriptCB $varname" ttk::scrollbar $f.yscroll -orient vertical \ -command "$f.html yview" ttk::scrollbar $f.xscroll -orient horizontal \ -command "$f.html xview" grid $f.html $f.yscroll -sticky news grid $f.xscroll -stick news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 bind $var(widget).x <Motion> "HVMotion $varname %x %y" bind $var(widget).x <Button-1> "HVButton1 $varname %x %y" bind $var(widget).x <B1-Motion> "HVMotion1 $varname %x %y" bind $var(widget).x <ButtonRelease-1> "HVRelease1 $varname %x %y" bind $w <Up> "$f.html yview scroll -1 units" bind $w <Down> "$f.html yview scroll 1 units" bind $w <Right> "$f.html xview scroll 1 units" bind $w <Left> "$f.html xview scroll -1 units" bind $w <<Copy>> "HVCopyCmd $varname" switch $ds9(wm) { x11 { bind $w <Button-4> "HVMouseWheel $varname 1" bind $w <Button-5> "HVMouseWheel $varname -1" bind $w <<Find>> [list HVFindCmd $varname] } aqua { bind $w <MouseWheel> "HVMouseWheel $varname %D" # Known bug in Tk, can't have dialogs invoked by accelerator } win32 { bind $w <MouseWheel> "HVMouseWheel $varname %D" bind $w <<Find>> [list HVFindCmd $varname] } } bind $w <<FindNext>> [list HVFindNextCmd $varname] # Status set f [ttk::frame $w.status] ttk::label $f.status -textvariable ${varname}(status) \ -width 120 -anchor w pack $f.status -side left # Fini ttk::separator $w.sep -orient horizontal pack $w.status $w.sep -side bottom -fill x pack $w.buttons -side top -fill x pack $w.param -side top -fill both -expand true # we have a problem with the html widget. first time thur, some # structures are not allocated/initialized. if we first display # a blank page, all seems ok $var(widget) clear $var(widget) parse "<html>\n<body>\n<form method=\"get\" action=\"foo\">\n</form>\n</body>\n</html>" global debug if {$debug(tcl,idletasks)} { puts stderr "HV" } update idletasks } selection handle $w [list HVExportSelection $varname] if {$url != {}} { # no need to resolve HVLoadURL $varname $url {} $var(sync) } } # Bindings proc HVMotion {varname x y} { upvar #0 $varname var global $varname global ds9 set url [$var(widget) href $x $y] if {[string length $url] > 0} { switch $ds9(wm) { x11 - win32 {$var(widget) configure -cursor hand2} aqua {$var(widget) configure -cursor pointinghand} } } else { $var(widget) configure -cursor {} } HVStatus $varname $url } proc HVButton1 {varname x y} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVButton1" } $var(widget) selection clear set var(sel,x) -1 set var(sel,y) -1 HVClearIndex $varname $var(index) set url [$var(widget) href $x $y] if {[string length $url] != 0} { HVResolveURL $varname $url } else { set var(sel,x) $x set var(sel,y) $y } } proc HVMotion1 {varname x y} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVMotion1" } if {$var(sel,x) != -1 && $var(sel,y) != -1} { $var(widget) selection set @$var(sel,x),$var(sel,y) @$x,$y } } proc HVRelease1 {varname x y} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVRelease1" } if {$var(sel,x) != -1 && $var(sel,y) != -1} { set var(copy) [$var(widget) text ascii @$var(sel,x),$var(sel,y) @$x,$y] selection own -command [list HVLostSelection $varname] $var(top) } } proc HVMouseWheel {varname cnt} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVMouseWheel" } $var(widget) yview scroll [expr -$cnt] units } # Commands proc HVClearCmd {varname} { upvar #0 $varname var global $varname # clear the widge and all images $var(widget) clear HVClearCache $varname HVClearAll $varname } proc HVCopyCmd {varname} { upvar #0 $varname var global $varname clipboard clear -displayof $var(top) clipboard append -displayof $var(top) $var(copy) } proc HVExportSelection {varname offset bytes} { upvar #0 $varname var global $varname if {$var(copy) != {}} { return [string range $var(copy) $offset [expr $offset+$bytes]] } } proc HVLostSelection {varname} { upvar #0 $varname var global $varname $var(widget) selection clear set var(copy) {} } proc HVURLDialogCmd {varname} { upvar #0 $varname var global $varname global debug set url "$var(url)" if {[EntryDialog [msgcat::mc {URL}] [msgcat::mc {Enter URL}] 80 url]} { if {[string length $url] == 0} { return } ParseURL $url r switch -- $r(scheme) { {} { # append 'http://' if needed if {[string range $r(path) 0 0] == "/"} { set url "http:/$url" } else { set url "http://$url" } if {$debug(tcl,hv)} { puts stderr "HVURLDialogCmd new $url" } } } # clear the base $var(widget) config -base {} HVClearIndex $varname 0 HVClearAll $varname # no need to resolve HVLoadURL $varname $url {} } } proc HVFileDialogCmd {varname} { upvar #0 $varname var global $varname global debug set fn [OpenFileDialog hvhtmlfbox] if {"$fn" != {}} { HVFileDialog $varname "$fn" } } proc HVFileDialog {varname fn} { upvar #0 $varname var global $varname global debug # clear the base $var(widget) config -base {} HVClearIndex $varname 0 HVClearAll $varname # no need to resolve HVLoadURL $varname "$fn" {} } proc HVBackCmd {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVBackCmd index $var(index)" } incr ${varname}(index) -1 if {[info exists ${varname}(index,$var(index))]} { set url [lindex $var(index,$var(index)) 0] set query [lindex $var(index,$var(index)) 1] if {$debug(tcl,hv)} { puts stderr "HVBackCmd :$var(index):$url:$query:" } # clear the base $var(widget) config -base {} # HVGotoHTML will incr the index again incr ${varname}(index) -1 # no need to resolve HVLoadURL $varname $url $query $var(sync) } else { incr ${varname}(index) } } proc HVFind {varname} { upvar #0 $varname var global $varname set toks [$var(widget) token list 1.0 end] set aa -1 set bb 0 set cc -1 set dd 0 set id -1 set ss $var(search,start) while {$ss<[llength $toks] && $cc==-1} { set pat [lindex $var(search) 0] set id [lsearch -glob -start $ss $toks "Text *$pat*"] if {$id != -1} { set ok 1 set aa $id set ss $id set tt [string first $pat [lindex [lindex $toks $aa] 1]] if {$tt != -1} { set bb $tt } for {set ii 1} {$ii<[llength $var(search)]} {incr ii} { set pat [lindex $var(search) $ii] set str [lindex [lindex $toks [expr $id+$ii*2]] 1] if {[string compare -length [string length $pat] $pat $str]} { incr ss set ok 0 break } } if {$ok} { set cc [expr $aa+([llength $var(search)]-1)*2] set tt [string last $pat [lindex [lindex $toks $cc] 1]] if {$tt != -1} { set dd [expr $tt+[string length $pat]] } } } else { break } } if {$aa == -1 || $cc == -1} { return 0 } else { set var(search,start) [expr $cc+1] $var(widget) selection set "[expr $aa+1].$bb" "[expr $cc+1].$dd" $var(widget) yview text "[expr $aa+1].$bb" return 1 } } proc HVFindCmd {varname} { upvar #0 $varname var global $varname set result "$var(search)" if {[EntryDialog [msgcat::mc {Search}] [msgcat::mc {Enter Search Expression}] 40 result]} { set var(search) "$result" set var(search,start) 0 $var(widget) selection clear if {![HVFind $varname]} { Error "$var(search) [msgcat::mc {Not Found}]" } } } proc HVFindNextCmd {varname} { upvar #0 $varname var global $varname if {$var(search,start) == 0} { HVFindCmd $varname } else { if {![HVFind $varname]} { # wrap set var(search,start) 0 if {![HVFind $varname]} { Error "$var(search) [msgcat::mc {Not Found}]" } } } } proc HVForwardCmd {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVForwardCmd $var(index)" } incr ${varname}(index) if {[info exists ${varname}(index,$var(index))]} { set url [lindex $var(index,$var(index)) 0] set query [lindex $var(index,$var(index)) 1] if {$debug(tcl,hv)} { puts stderr "HVForwardCmd :$var(index):$url:$query:" } # clear the base $var(widget) config -base {} # HVGotoHTML will incr the index again incr ${varname}(index) -1 # no need to resolve HVLoadURL $varname $url $query $var(sync) } else { incr ${varname}(index) -1 } } proc HVGotoCmd {varname nn} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVGotoCmd $nn" } set var(index) $nn if {[info exists ${varname}(index,$var(index))]} { set url [lindex $var(index,$var(index)) 0] set query [lindex $var(index,$var(index)) 1] if {$debug(tcl,hv)} { puts stderr "HVGotoCmd :$var(index):$url:$query:" } # clear the base $var(widget) config -base {} # HVGotoHTML will incr the index again incr ${varname}(index) -1 # no need to resolve HVLoadURL $varname $url $query $var(sync) } else { incr ${varname}(index) } } proc HVReloadCmd {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVReloadCmd" } # clear the base $var(widget) config -base {} # HVGotoHTML will incr the index again incr ${varname}(index) -1 # no need to resolve HVLoadURL $varname $var(url) $var(query) $var(sync) } proc HVStopCmd {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "\n*** HVStopCmd ***\n" } HVCancel $varname } proc HVPageSourceCmd {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVPageSourceCmd" } SimpleTextDialog ${varname}txt $var(url) 80 20 insert top $var(data) } proc HVArchUserCmd {varname title url} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVArchUserCmd" } if {[string length $url] == 0} { return } ParseURL $url r switch -- $r(scheme) { {} { # append 'http://' if needed if {[string range $r(path) 0 0] == "/"} { set url "http:/$url" } else { set url "http://$url" } if {$debug(tcl,hv)} { puts stderr "HVArchUserCmd new $url" } } } HV $varname $title $url } proc HVAnalysisCmd {varname title url sync} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVAnalysisCmd $varname $title $url $sync" } if {[string length $url] == 0} { HV $varname "$title" {} {} $sync } else { ParseURL $url r switch -- $r(scheme) { {} { # append 'http://' if needed if {[string range $r(path) 0 0] == "/"} { set url "http:/$url" } else { set url "http://$url" } if {$debug(tcl,hv)} { puts stderr "HVAnalysisCmd new $url" } } } HV $varname "$title" $url {} $sync } } proc HVAnalysisURL {which i url sync} { set varname "at${which}${i}" global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVAnalysisURL $which $i $url" } set ${varname}(cookies) {} set ${varname}(sync) $sync HVClearAll $varname HVSetAnalysis $varname 1 $which $i HVLoadURL $varname $url {} $sync } proc HVAnalysisCancel {which i} { set varname "at${which}${i}" global $varname HVCancel $varname } # Archive Servers proc HVArchChandraChaser {} { global current set coord {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 degrees] set size \ [expr [lindex [$current(frame) get fits size wcs fk5 arcmin] 0]/2.] } } set l {} if {[string length $coord] != 0} { lappend l "1 lon [lindex $coord 0]" lappend l "1 lat [lindex $coord 1]" lappend l "1 radius $size" } global hvchandrachaser HV hvchandrachaser {Chandra Chaser} http://cda.harvard.edu/chaser/mainEntry.do $l } proc HVArchChandraPop {} { global current set coord {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 degrees] set size \ [expr [lindex [$current(frame) get fits size wcs fk5 arcmin] 0]/2.] } } set l {} if {[string length $coord] != 0} { lappend l "1 lon [lindex $coord 0]" lappend l "1 lat [lindex $coord 1]" lappend l "1 radius $size" lappend l "1 searchBy position" } global hvchandrapop HV hvchandrapop {Chandra Popular} http://cda.harvard.edu/pop/mainEntry.do $l } proc HVArchChandraFTP {} { global current set ra {} set dec {} set wid {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] set ra [lindex $coord 0] set dec [lindex $coord 1] set wid [lindex [$current(frame) get fits size wcs fk5 degrees] 0] } } set l {} if {[string length $ra] != 0} { lappend l "1 ra \{$ra\}" lappend l "1 dec \{$dec\}" lappend l "1 wid \{$wid\}" } global hvchandraftp HV hvchandraftp {Chandra FTP} \ http://www.cfa.harvard.edu/archive/chandra/search $l } proc HVArchRosat {} { global current set ra {} set dec {} set cprd {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] set ra [split [lindex $coord 0] :] set dec [split [lindex $coord 1] :] set raa "[lindex $ra 0]h[lindex $ra 1]m[lindex $ra 2]s" set decc "[lindex $dec 0]d[lindex $dec 1]m[lindex $dec 2]s" } } set l {} if {[string length $ra] != 0} { lappend l "1 lon \{$raa\}" lappend l "1 lat \{$decc\}" } lappend l "1 cprd im1 \{photon image 0.1-2.4 keV (fits)\}" global hvrosat HV hvrosat {Rosat All-Sky} \ http://www.xray.mpe.mpg.de/cgi-bin/rosat/rosat-survey $l } proc HVArchNVSS {} { global current set ra {} set dec {} set sra 1 set sdec 1 if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] regsub -all {:} [lindex $coord 0] { } ra regsub -all {:} [lindex $coord 1] { } dec set s [$current(frame) get fits size wcs fk5 degrees] set sra [lindex $s 0] set sdec [lindex $s 1] if {$sra > 2} { set sra 2 } if {$sdec > 2} { set sdec 2 } } } set l {} if {[string length $ra] != 0} { lappend l "1 RA \{$ra\}" lappend l "1 Dec \{$dec\}" lappend l "1 Size \{$sra $sdec\}" } lappend l "1 Type \{image/x-fits\} \{FITS Image\}" global hvnvss HV hvnvss NVSS http://www.cv.nrao.edu/nvss/postage.shtml $l } proc HVArch4MASS {} { global current set ra {} set dec {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] regsub -all {:} [lindex $coord 0] { } ra regsub -all {:} [lindex $coord 1] { } dec } } set l {} if {[string length $ra] != 0} { lappend l "1 RA \{$ra\}" lappend l "1 Dec \{$dec\}" } global hvmass4 HV hvmass4 4MASS http://www.cv.nrao.edu/4mass/findFITS.shtml $l } proc HVArchSIRTF {} { global current set ra {} set dec {} set sra 1 set sdec 1 if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] regsub -all {:} [lindex $coord 0] { } ra regsub -all {:} [lindex $coord 1] { } dec set s [$current(frame) get fits size wcs fk5 arcmin] set sra [lindex $s 0] set sdec [lindex $s 1] } } set l {} if {[string length $ra] != 0} { lappend l "1 RA \{$ra\}" lappend l "1 Dec \{$dec\}" lappend l "1 Size \{$sra $sdec\}" } lappend l "1 Type \{image/x-fits\} \{FITS Image\}" global hvsirtf HV hvsirtf SIRTF http://www.cv.nrao.edu/sirtf_fls/SFpostage.shtml $l } proc HVArchFirst {} { global current set value {} set size {4.5} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set value [$current(frame) get fits center wcs fk5 sexagesimal] set size [lindex [$current(frame) get fits size wcs fk5 arcmin] 0] } } set l {} if {[string length $value] != 0} { lappend l "1 RA \{$value\}" lappend l "1 ImageSize \{$size\}" lappend l "1 ImageType \{FITS Image\}" } global hvfirst HV hvfirst First http://third.ucllnl.org/cgi-bin/firstcutout $l } proc HVArchStripe82 {} { global current set value {} set size {4.5} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set value [$current(frame) get fits center wcs fk5 sexagesimal] set size [lindex [$current(frame) get fits size wcs fk5 arcmin] 0] } } set l {} if {[string length $value] != 0} { lappend l "1 RA \{$value\}" lappend l "1 ImageSize \{$size\}" lappend l "1 ImageType \{FITS Image\}" } global hvstripe82 HV hvstripe82 Stripe82 http://third.ucllnl.org/cgi-bin/stripe82cutout $l } # Other proc HVArchDASCHE {} { global current set ra {} set dec {} set sra 1 set sdec 1 if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 sexagesimal] set ra [lindex $coord 0] set dec [lindex $coord 1] set radius [$current(frame) get fits size wcs fk5 arcsec] } } set l {} if {[string length $ra] != 0} { lappend l "1 rightAscension \{$ra\}" lappend l "1 declination \{$dec\}" lappend l "1 radius $radius" } global hvdasche HV hvdasche {DASCHE} http://dasch.rc.fas.harvard.edu/search.php $l } proc HVArchMontage {} { global current set value {} set size {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 degrees] set value "[lindex $coord 0] [lindex $coord 1] eq" set size [lindex [$current(frame) get fits size wcs fk5 degrees] 0] } } set l {} if {[string length $value] != 0} { lappend l "1 locstr \{$value\}" lappend l "1 size \{$size\}" } global hvmontage HV hvmontage {Montage} http://hachi.ipac.caltech.edu:8080/montage/ $l } proc HVArchAKARI {} { global current set value {} set size {} if {$current(frame) != {}} { if {[$current(frame) has wcs equatorial wcs]} { set coord [$current(frame) get fits center wcs fk5 degrees] set value "[lindex $coord 0],[lindex $coord 1]" set size [lindex [$current(frame) get fits size wcs fk5 degrees] 0] } } set l {} if {[string length $value] != 0} { lappend l "1 position \{$value\}" lappend l "1 radius \{$size\}" } global hvakari HV hvakari {AKARI} http://www.ir.isas.jaxa.jp/AKARI/Archive/Images/FISMAP/ $l } # Process Cmds proc ProcessWebCmd {varname iname} { global ihv set w {hvweb} upvar $varname var upvar $iname i # determine which web browser window switch -- [string tolower [lindex $var $i]] { new { incr i set ii [lsearch $ihv(windows) $w] if {$ii>=0} { append w $ihv(unique) incr ihv(unique) } } close - clear - click {set w [lindex $ihv(windows) end]} default { set ii [lsearch $ihv(windows) [lindex $var $i]] if {$ii>=0} { set w [lindex $var $i] incr i } } } switch -- [string tolower [lindex $var $i]] { close {HVDestroy $w} clear {HVClearCmd $w} click { set vvarname $w upvar #0 $vvarname vvar global $vvarname incr i switch -- [string tolower [lindex $var $i]] { back {HVBackCmd $vvarname} forward {HVForwardCmd $vvarname} stop {HVStopCmd $vvarname} reload {HVReloadCmd $vvarname} default { set id [lindex $var $i] if {![info exists vvar(widget)]} { return } set tokens [$vvar(widget) token list 1.0 end] set cnt 0 for {set ii 0} {$ii<[llength $tokens]} {incr ii} { set tok [lindex $tokens $ii] if {[string tolower [lindex $tok 0]] == "markup" && [string tolower [lindex $tok 2]] == "href"} { set url [lindex $tok 3] incr cnt if {$cnt == $id} { HVResolveURL $vvarname [$vvar(widget) resolve $url] break; } } } } } } default { set url [lindex $var $i] if {[string length $url] == 0} { HV $w Web {} {} 1 } else { ParseURL $url r switch -- $r(scheme) { {} { # append 'http://' if needed if {[string range $r(path) 0 0] == "/"} { set url "http:/$url" } else { set url "http://$url" } } } HV $w Web $url {} 1 } } } } proc ProcessSendWebCmd {proc id param} { global ihv $proc $id "$ihv(windows)\n" } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/hvform.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000031545 12514261632 016546� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc HVFormCB {varname n cmd args} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVFormCB $varname $n $cmd $args" } switch -- [string tolower $cmd] { form {HVFormForm $varname $n args} flush {HVFormFlush $varname $n args} input {HVFormInput $varname $n args} select {HVFormSelect $varname $n args} textarea {HVFormTextArea $varname $n args} } } proc HVFormForm {varname n a} { upvar #0 $varname var global $varname upvar $a args global debug if {$debug(tcl,hv)} { puts stderr "HVFormForm $n $args" } # try to clean up lose vars from previous forms HVFormFlush $varname $n {} set aa [lindex $args 2] set var(form,$n,action) [lindex $args 0] set var(form,$n,method) [HVattrs method $aa get] if {$debug(tcl,hv)} { puts stderr "HVFormForm method $var(form,$n,method)" puts stderr "HVFormForm action $var(form,$n,action)" } } proc HVFormFlush {varname n a} { upvar #0 $varname var global $varname upvar $a args global debug if {$debug(tcl,hv)} { puts stderr "HVFormFlush $n" } # unset all var(form,$n,*) foreach x [array names $varname "form,$n,*"] { unset ${varname}($x) } bind $var(top) <Return> {} } proc HVFormInput {varname n a} { upvar #0 $varname var global $varname upvar $a args global debug set path [lindex $args 0] set attrs [lindex $args 1] if {$debug(tcl,hv)} { puts stderr "HVFormInput $n $path $attrs" } set id [lindex [split $path .] end] set type [HVattrs type $attrs {}] set disabled [HVattrs disabled $attrs normal] set readonly [HVattrs readonly $attrs normal] switch -- [string tolower $type] { checkbox { set name [HVattrs name $attrs var] set value [HVattrs value $attrs on] set checked [HVattrs checked $attrs nochecked] set var(form,$n,name,$id) $name if {$checked != "nochecked"} { set var(form,$n,var,$id) $value } else { set var(form,$n,var,$id) {} } set var(form,$n,init,$id) $$var(form,$n,var,$id) ttk::checkbutton $path -variable ${varname}(form,$n,var,$id) \ -onvalue $value -offvalue {} -state $disabled } radio { set name [HVattrs name $attrs var] # we need this so that all share the same variable set id $name set value [HVattrs value $attrs on] set checked [HVattrs checked $attrs nochecked] set var(form,$n,name,$id) $name if {$checked != "nochecked"} { set var(form,$n,var,$id) $value set var(form,$n,init,$id) $var(form,$n,var,$id) } # override init value foreach f $var(init) { if {$n == [lindex $f 0] && $name == [lindex $f 1] && $value == [lindex $f 2]} { set var(form,$n,var,$id) $value set var(form,$n,init,$id) $var(form,$n,var,$id) } } ttk::radiobutton $path -variable ${varname}(form,$n,var,$id) \ -value $value -state $disabled } button { set name [HVattrs name $attrs submit] set value [HVattrs value $attrs "Submit"] ttk::button $path -text $value \ -command "HVSubmitForm $varname $n \{$name\} \{$value\}" } submit { set name [HVattrs name $attrs submit] set value [HVattrs value $attrs "Submit"] ttk::button $path -text $value \ -command "HVSubmitForm $varname $n \{$name\} \{$value\}" bind $var(top) <Return> \ "HVSubmitForm $varname $n \{$name\} \{$value\}" } reset { set name [HVattrs name $attrs reset] set value [HVattrs value $attrs "Reset"] ttk::button $path -text $value -command "HVResetForm $varname $n" } image { set name [HVattrs name $attrs submit] set value [HVattrs value $attrs "Submit"] set src [HVattrs src $attrs {}] set img [HVImageCB $varname [$var(widget) resolve $src]] if {$img != "$var(images,gray)"} { ttk::button $path -image $img \ -command "HVSubmitForm $varname $n \{$name\} \{$value\}" } else { ttk::button $path -text $value -state $disabled \ -command "HVSubmitForm $varname $n \{$name\} \{$value\}" } return } hidden { set name [HVattrs name $attrs var] set value [HVattrs value $attrs {}] set var(form,$n,name,$id) $name set var(form,$n,var,$id) $value } password { set name [HVattrs name $attrs var] set value [HVattrs value $attrs {}] set size [HVattrs size $attrs 20] set var(form,$n,name,$id) $name set var(form,$n,var,$id) $value set var(form,$n,init,$id) $var(form,$n,var,$id) ttk::entry $path -textvariable ${varname}(form,$n,var,$id) \ -width $size -show "*" -state $readonly } file { set name [HVattrs name $attrs var] set value [HVattrs value $attrs {}] set size [HVattrs size $attrs 20] set var(form,$n,name,$id) $name set var(form,$n,var,$id) [HVInitVar $varname $n $name $value] set var(form,$n,init,$id) $var(form,$n,var,$id) ttk::entry $path -textvariable ${varname}(form,$n,var,$id) \ -width $size -state $readonly } text - default { set name [HVattrs name $attrs var] set value [HVattrs value $attrs {}] set size [HVattrs size $attrs 20] set var(form,$n,name,$id) $name set var(form,$n,var,$id) [HVInitVar $varname $n $name $value] set var(form,$n,init,$id) $var(form,$n,var,$id) ttk::entry $path -textvariable ${varname}(form,$n,var,$id) \ -width $size -state $readonly } } } proc HVFormSelect {varname n a} { upvar #0 $varname var global $varname upvar $a args global ds9 global debug set path [lindex $args 0] set attrs [lindex $args 1] set choices [lindex $args 2] set initial [lindex $args 3] if {$debug(tcl,hv)} { puts stderr "HVFormSelect :$n:$path:$attrs:$choices:$initial:" } set id [lindex [split $path .] end] set name [HVattrs name $attrs var] set size [HVattrs size $attrs 0] set multiple [HVattrs multiple $attrs single] if {[string length $multiple] == 0} { set multiple multiple } switch -- $multiple { single { set var(form,$n,name,$id) $name ttk::menubutton $path -textvariable ${varname}(form,$n,single,$id) \ -menu $path.m menu $path.m -tearoff 0 set l 0 set first 1 foreach f $choices { set i [lindex $f 0] set v [lindex $f 1] set m [lindex $f 2] if {[string length $v] == 0} { set v $m } if {$i || $first} { set var(form,$n,var,$id) $v set var(form,$n,init,$id) $v set var(form,$n,single,$id) $m set var(form,$n,singleinit,$id) $m set first 0 } if {[string length $m]>$l} { set l [string length $m] } $path.m add command -label $m -command \ "upvar #0 $varname var; set var(form,$n,var,$id) \"$v\"; set var(form,$n,single,$id) \"$m\"" } # override init value foreach f $var(init) { if {$n == [lindex $f 0] && $name == [lindex $f 1]} { set v [lindex $f 2] set m [lindex $f 3] set var(form,$n,var,$id) $v set var(form,$n,init,$id) $v set var(form,$n,single,$id) $m set var(form,$n,singleinit,$id) $m } } $path configure -width $l } multiple { set var(form,$n,name,$id) $name set var(form,$n,multivar,$id) {} set var(form,$n,multiinit,$id) {} set var(form,$n,multimenu,$id) {} set l 0 set long {} set ii 0 foreach f $choices { if {[lindex $f 0]} { lappend var(form,$n,multiinit,$id) $ii } set foo [lindex $f 1] if {[string length $foo] == 0} { set foo [lindex $f 2] } lappend var(form,$n,multivar,$id) $foo lappend var(form,$n,multimenu,$id) [lindex $f 2] set m [lindex $f 2] if {[string length $m]>$l} { set long $m set l [string length $m] } incr ii } set var(form,$n,multiple,$id) $path # we have a problem # the frame we create will not resize itself based on the # interior size of the listbox and the scrollbar # so, we need to set the frame size by hand set font "$var(font) $var(font,size) $var(font,weight) $var(font,slant)" ttk::frame $path ttk::scrollbar $path.scroll -command "$path.list yview" listbox $path.list -selectmode multiple \ -width 0 -height $size \ -listvar ${varname}(form,$n,multimenu,$id) \ -font $font \ -yscroll "$path.scroll set" \ -exportselection false set w [expr [font measure $font $long]+30] set h [expr $size*[font metrics $font -linespace]] $path configure -width $w -height $h pack $path.list $path.scroll -side left -fill y -expand 1 foreach ii $var(form,$n,multiinit,$id) { $path.list selection set $ii } } } } proc HVFormTextArea {varname n a} { upvar #0 $varname var global $varname upvar $a args set path [lindex $args 0] set attrs [lindex $args 1] set initial [string range [lindex $args 2] 1 end] global debug if {$debug(tcl,hv)} { puts stderr "HVFormTextArea $n $path $attrs $initial" } set id [lindex [split $path .] end] set name [HVattrs name $attrs var] set rows [HVattrs rows $attrs 4] set cols [HVattrs cols $attrs 20] set readonly [HVattrs disabled $attrs normal] # update initial set initial [HVInitVar $varname $n $name $initial] text $path -height $rows -width $cols -wrap none -state $readonly $path insert end $initial set var(form,$n,name,$id) $name set var(form,$n,var,$id) $initial set var(form,$n,init,$id) $var(form,$n,var,$id) set var(form,$n,textarea,$id) $path } proc HVattrs {k l def} { # break list up into key/value pairs set key {} set value {} set w 1 foreach f $l { if {$w} { lappend key [string tolower $f] set w 0 } else { lappend value $f set w 1 } } set a [lsearch -exact $key [string tolower $k]] if {$a>=0} { return [lindex $value $a] } else { return $def } } proc HVSubmitForm {varname n name value} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVSubmitForm $n" } bind $var(top) <Return> {} # update textareas foreach x [array names $varname "form,$n,textarea,*"] { set f [split $x ,] set id [lindex $f 3] set path $var($x) set var(form,$n,var,$id) [$path get 1.0 end] } set query {} # append button name=value append query "[http::formatQuery $name $value]&" # append normal vars foreach x [array names $varname "form,$n,var,*"] { set f [split $x ,] set id [lindex $f 3] set v [string trim $var($x)] if {[string length $v] != 0} { append query "[http::formatQuery $var(form,$n,name,$id) $v]&" } } # append multiple select foreach x [array names $varname "form,$n,multiple,*"] { set f [split $x ,] set id [lindex $f 3] set path $var($x) set iii [$path.list curselection] foreach ii $iii { set v [string trim [lindex $var(form,$n,multivar,$id) $ii]] if {[string length $v] != 0} { append query "[http::formatQuery $var(form,$n,name,$id) $v]&" } } } # remove last '&' set query [string trimright $query &] HVClearIndex $varname $var(index) # and do it # already resolved switch -- [string tolower $var(form,$n,method)] { get {HVLoadURL $varname "$var(form,$n,action)?$query" {} $var(sync)} post {HVLoadURL $varname "$var(form,$n,action)" "$query" $var(sync)} } } proc HVResetForm {varname n} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVResetForm $n" } foreach x [array names $varname "form,$n,init,*"] { set f [split $x ,] set var(form,$n,var,[lindex $f 3]) $var($x) } #update single select foreach x [array names $varname "form,$n,singleinit,*"] { set f [split $x ,] set var(form,$n,single,[lindex $f 3]) $var($x) } # update multiple select foreach x [array names $varname "form,$n,multiinit,*"] { set f [split $x ,] set path $var(form,$n,multiple,[lindex $f 3]) $path.list selection clear 0 foreach ii $var($x) { $path.list selection set $ii } } # update textareas foreach x [array names $varname "form,$n,textarea,*"] { set f [split $x ,] set path $var($x) $path delete 1.0 end $path insert end $var(form,$n,init,[lindex $f 3]) } } proc HVInitVar {varname n name def} { upvar #0 $varname var global $varname foreach f $var(init) { if {$n == [lindex $f 0] && $name == [lindex $f 1]} { return [lindex $f 2] } } return $def } proc HVFixHTMLForm {varname} { upvar #0 $varname var global $varname global debug if {[regexp -nocase {<form [^>]*} $var(data) r]} { if {![regexp -nocase {action=} $r]} { if {$debug(tcl,hv)} { puts stderr "HVFixFormHTML action fixed" } set rr "$r action=[$var(widget) cget -base]" regsub -nocase {<form [^>]*} $var(data) $rr var(data) } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/hvsup.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000124432 12514261632 016410� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc HVCancel {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVCancel" } # set state to 0 so that we don't process the finish proc set var(active) 0 # stop any refresh if {$var(refresh,id)>0} { after cancel $var(refresh,id) set var(refresh,id) 0 } # analysis if {$var(analysis)} { AnalysisTaskEnd $var(analysis,which) $var(analysis,i) HVSetAnalysis $varname 0 {} 0 } # clean up HVClearTmpFile $varname if {[info exists var(token)]} { http::reset $var(token) } if {[info exists var(widget)]} { $var(widget) configure -cursor {} } } proc HVDestroy {varname} { upvar #0 $varname var global $varname global ihv global debug if {$debug(tcl,hv)} { puts stderr "HVDestroy" } HVCancel $varname # clear the widge and all images $var(widget) clear # clear image cache foreach x [array names $varname "images,*"] { image delete $var($x) unset ${varname}($x) } # clear cache HVClearCache $varname # destroy the window and menubar if {[winfo exists $var(top)]} { destroy $var(top) destroy $var(mb) } # delete it from the xpa list set ii [lsearch $ihv(windows) $varname] if {$ii>=0} { set ihv(windows) [lreplace $ihv(windows) $ii $ii] } # clear varname unset $varname } proc HVReset {varname} { upvar #0 $varname var global $varname set var(active) 0 if {[info exists var(token)]} { global debug if {$debug(tcl,hv)} { puts stderr "HVReset ***cleanup***" } http::cleanup $var(token) unset var(token) } } proc HVDone {varname} { upvar #0 $varname var global $varname HVStatus $varname {} HVReset $varname } proc HVCancelled {varname} { upvar #0 $varname var global $varname HVStatus $varname {} HVReset $varname } proc HVError {varname err} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVError $err" } HVReset $varname Error $err } proc HVStatus {varname message} { upvar #0 $varname var global $varname set var(status) $message } proc HVResolveURL {varname url} { upvar #0 $varname var global $varname global debug global pvo if {$debug(tcl,hv)} { puts stderr "HVResolveURL $varname $url" } set sync $var(sync) # sub xpa method set exp {%40%40XPA_METHOD%40%40|@@XPA_METHOD@@} if {[regexp $exp $url]} { regsub -all $exp $url [XPAMethod] url if {$debug(tcl,hv)} { puts stderr "HVResolveURL XPA_METHOD $url" } } # sub vo method set exp {%40%40VO_METHOD%40%40|@@VO_METHOD@@} if {[regexp $exp $url]} { regsub -all $exp $url $pvo(method) url if {$debug(tcl,hv)} { puts stderr "HVResolveURL VO_METHOD $url" } } # if pvo(method) is xpa, HV has to be async if {$pvo(method) == {xpa}} { set sync 0 } # some old sites have a problem with '?' in the query not encoded ParseURL $url rr if {$rr(query) != {}} { if {[regsub -all {\?} $rr(query) {%25} query]} { set newurl "$rr(scheme)://$rr(authority)$rr(path)?$query" if {$rr(fragment) != {}} { append newurl "#$rr(fragment)" } HVLoadURL $varname $newurl {} $sync } else { HVLoadURL $varname $url {} $sync } } else { HVLoadURL $varname $url {} $sync } } # this is the main entry point, everybody calls here proc HVLoadURL {varname url query {sync 0}} { upvar #0 $varname var global $varname # this assumes the url has been already resolved global debug if {$debug(tcl,hv)} { puts stderr "HVLoadURL :$varname:$url:$query:$sync:" } # do we have anything? if {$url == {}} { return } HVStatus $varname {} # parse url ParseURL $url r if {$debug(tcl,hv)} { puts stderr "HVLoadURL |$r(scheme)|$r(authority)|$r(path)|$r(query)|$r(fragment)|$query|" } switch -- $r(scheme) { file - {} {HVProcessURLFile $varname $url $query r} ftp {HVProcessURLFTP $varname $url $query r} http {HVProcessURLHTTP $varname $url $query r $sync} default {HVError $varname "[msgcat::mc {Sorry, DS9 does not support}] $r(scheme)"} } } proc HVProcessURLFile {varname url query rr} { upvar #0 $varname var global $varname upvar $rr r global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVProcessURLFile" } if {[file exists $r(path)]} { if {[file isdirectory $r(path)]} { HVSetURL $varname $url {} {} HVSetResult $varname 200 "text/html" HVSetData $varname \ [HVFileHtmlList $r(path) [HVDirList $r(path)]] {} set var(delete) 0 HVParse $varname } else { HVSetURL $varname $url {} $r(fragment) set var(delete) 0 HVLoadFile $varname $r(path) } } } proc HVProcessURLFTP {varname url query rr} { upvar #0 $varname var global $varname upvar $rr r global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVProcessURLFTP" DumpURL r } set fn "$ds9(tmpdir)/[file tail $r(path)]" set ftp [ftp::Open $r(authority) "ftp" "-ds9@" -mode passive] if {$ftp > -1} { # first try to get as file set ftp::VERBOSE $debug(tcl,ftp) set "ftp::ftp${ftp}(Output)" FTPLog ftp::Type $ftp binary if {[ftp::Get $ftp $r(path) "$fn"]} { ftp::Close $ftp if {$debug(tcl,hv)} { puts stderr "HVProcessURLFTP get $fn" } HVSetURL $varname $url {} $r(fragment) set var(delete) 1 HVLoadFile $varname "$fn" HVClearTmpFile $varname } else { # from the prev attempt catch {file delete -force "$fn"} # is it a dir or file that could not be download? if {[file extension $r(path)] == {}} { if {$debug(tcl,hv)} { puts stderr "HVProcessURLFTP list" } # now as a directory set list [ftp::List $ftp $r(path)] ftp::Close $ftp HVSetURL $varname $url {} {} HVSetResult $varname 200 "text/html" HVSetData $varname [HVFTPHtmlList $r(authority) $r(path) $list] {} set var(delete) 0 HVParse $varname } else { HVError $varname "[msgcat::mc {Unable to open file}] $r(path)" return } } } } proc HVProcessURLHTTP {varname url query rr sync} { upvar #0 $varname var global $varname upvar $rr r global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTP" } # stop any refresh if {[info exists ${varname}(refresh,id)]} { if {$var(refresh,id)>0} { after cancel $var(refresh,id) } } # do we already have it in cache? if {[info exists ${varname}(cache,file,$url,$query)]} { # has it expired? if {($var(cache,expire,$url,$query) == 0) || ($var(cache,expire,$url,$query) > [clock seconds])} { # just in case if {[file exists $var(cache,file,$url,$query)]} { # ok, to it if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTP found $url at $var(cache,file,$url,$query)" } HVSetURL $varname $url $query $r(fragment) set var(delete) 0 HVSetResult $varname 200 $var(cache,mime,$url,$query) HVSetData $varname {} $var(cache,file,$url,$query) HVParse $varname return } } # expired or invalid, clean up if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTP expired or invalid $var(cache,file,$url,$query)" } catch {file delete $var(cache,file,$url,$query)} unset var(cache,file,$url,$query) unset var(cache,mime,$url,$query) unset var(cache,expire,$url,$query) } HVSetURL $varname $url $query $r(fragment) HVSetResult $varname {} {} HVSetData $varname {} {} set var(ch) {} # do we have html? if so, use a var ParseURL $url r # geturl as file set var(fn) [tmpnam ds9 .http] if {[catch {open "$var(fn)" w} ${varname}(ch)]} { HVError $varname "[msgcat::mc {Unable to open file}] $var(fn)" return } # disable timeouts for analysis global ihttp set timeout $ihttp(timeout) if {$var(analysis)} { set timeout 0 } if {$sync} { if {![catch {set var(token) [http::geturl $url \ -protocol 1.0 \ -query "$query" \ -timeout $timeout \ -headers "[HVHTTPHeader $varname]" \ -progress [list HVProgress $varname] \ -binary 1 \ -channel $var(ch)] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 set var(delete) 1 HVProcessURLHTTPFinish $varname $var(token) } else { catch {close $var(ch)} HVError $varname "[msgcat::mc {Unable to locate URL}] $url" } } else { if {![catch {set var(token) [http::geturl $url \ -protocol 1.0 \ -query "$query" \ -timeout $timeout \ -headers "[HVHTTPHeader $varname]" \ -progress [list HVProgress $varname] \ -binary 1 \ -channel $var(ch) \ -command [list HVProcessURLHTTPFinish $varname]] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 set var(delete) 1 } else { catch {close $var(ch)} HVError $varname "[msgcat::mc {Unable to locate URL}] $url" } } } proc HVProcessURLHTTPFinish {varname token} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTPFinish" } catch {close $var(ch)} if {!($var(active))} { HVCancelled $varname return } upvar #0 $token t # Code set var(code) [http::ncode $token] # Meta set var(meta) $t(meta) # Cache defaults set var(cache) 1 set var(cache,images) 1 set var(expire) 0 HVParseMeta $varname # Log it HTTPLog $token # Result? switch -- $var(code) { 200 - 203 - 404 - 503 { if {$var(cache)} { if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTPFinish cacheing:$var(url),$var(query):$var(fn)" } set url $var(url) set query $var(query) set var(cache,file,$url,$query) $var(fn) set var(cache,mime,$url,$query) $var(mime) set var(cache,expire,$url,$query) $var(expire) set var(delete) 0 } HVParse $varname HVDone $varname } 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $var(meta) { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,hv)} { puts stderr "HVProcessURLHTTPFinish redirect $var(code) to $value" } # clean up and resubmit http::cleanup $token unset var(token) HVClearTmpFile $varname if {[info exists var(widget)]} { HVLoadURL $varname [$var(widget) resolve $value] {} $var(sync) } else { HVLoadURL $varname $value {} $var(sync) } } } } default {HVError $varname "HTTP [msgcat::mc {Error}] $var(code)"} } } proc HVHTTPHeader {varname} { upvar #0 $varname var global $varname set domain {} ParseURL $var(url) rr regexp {[^:]*} $rr(authority) domain set result "[ProxyHTTP]" foreach cc $var(cookies) { if {$domain == [lindex $cc 2]} { append result " Cookie [lindex $cc 0]=[lindex $cc 3]" } } global debug if {$debug(tcl,hv)} { puts stderr "HVHTTPHeader:$result" } return $result } proc HVParseMeta {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseMeta: $var(meta)" } foreach {name value} $var(meta) { switch -- [string tolower $name] { content-type { regexp -nocase {([^;]*);?(.*)} $value foo \ ${varname}(mime) ${varname}(mime,param) set var(mime) [string tolower $var(mime)] } content-length {} content-encoding { switch -- [string tolower $value] { gzip - x-gzip {set var(encoding) gzip} bzip2 {set var(encoding) bzip2} compress - Z {set var(encoding) compress} pack - z {set var(encoding) pack} default {} } } content-transfer-encoding { switch -- [string tolower $value] { binary - base64 {set var(transfer) [string tolower $value]} default {} } } refresh { set f [split $value \;] set var(refresh,time) [lindex $f 0] set var(refresh,url) [string range [lindex $f 1] 4 end] if {$var(refresh,url) != {} & $var(refresh,time) != {}} { set var(refresh,id) [after [expr $var(refresh,time)*1000] "HVLoadURL $varname \{$var(refresh,url)\} {} $var(sync)"] } else { set var(refresh,id) 0 } } expires { if {[catch {set ss [clock scan $value]}]} { set var(cache) 0 } else { set var(cache) 1 set var(expire) $ss } } cache-control { foreach cc [split $value {,}] { foreach {nn vv} [split $cc {=}] { switch $nn { public {set var(cache) 1} private {set var(cache) 1} no-cache {set var(cache) 0} no-store {set var(cache) 1} s-maxage - min-fresh - max-age { set var(cache) 1 set var(expire) \ [expr [file mtime $var(fn)]+$vv] } max-stale {} no-transform {} only-if-cached {} cache-extension {} must-revalidate {} proxy-revalidate {} } } } } pragma { switch $value { no-cache {set var(cache) 0} } } last-modified { } if-none-match { } set-cookie { set cname {} set cpath {/} set cdomain {} set cvalue {} ParseURL $var(url) rr regexp {[^:]*} $rr(authority) cdomain foreach cc [split $value {;}] { foreach {nn vv} [split $cc {=}] { switch [string tolower [string trim $nn]] { httponly {} expires {} path {set cpath $vv} domain {set cdomain $vv} {} {append cvalue {=}} default { if {$nn != {}} { set cname $nn set cvalue $vv } } } } } if {$cname != {}} { lappend ${varname}(cookies) [list $cname $cpath $cdomain $cvalue] } } } } if {$debug(tcl,hv)} { puts stderr "HVParseMeta Content-Type:$var(mime):$var(mime,param):" puts stderr "HVParseMeta Content-Encoding:$var(encoding):" puts stderr "HVParseMeta Content-Transfer-Encoding:$var(transfer):" puts stderr "HVParseMeta Refresh:$var(refresh,time):$var(refresh,url):" puts stderr "HVParseMeta Cache:$var(cache)" puts stderr "HVParseMeta Expires:$var(expire)" puts stderr "HVParseMeta Cookies:$var(cookies)" } } proc HVLoadFile {varname path} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVLoadFile $path" } HVSetResult $varname 200 {} HVSetData $varname {} $path # content-encoding switch -- [string tolower [file extension $path]] { .gz { set path [file rootname $path] set var(encoding) gzip } .bz2 { set path [file rootname $path] set var(encoding) bzip2 } .Z { set path [file rootname $path] set var(encoding) compress } .z { set path [file rootname $path] set var(encoding) pack } } switch -- [string tolower [file extension $path]] { .html - .htm {set var(mime) "text/html"} .gif {set var(mime) "image/gif"} .jpeg - .jpg {set var(mime) "image/jpeg"} .tiff - .tif {set var(mime) "image/tiff"} .png {set var(mime) "image/png"} .fits - .fit - .fts {set var(mime) "image/fits"} .ftz - .fits.gz - .fgz { set var(mime) "image/fits" set var(encoding) "gzip" } .text - .txt {set var(mime) "text/plain"} .multi { set var(mime) "multipart/mixed" set var(xpa,target) "*:*" if {[file exists "$path"]} { set ch [open "$path" r] if {[gets $ch line] >= 0} { set var(mime,param) "Content-Type: multipart/mixed; Boundary=[string range $line 2 end]" } catch {close $ch} } } .sao {set var(mime) "text/x-cmap-sao"} default { switch -- $var(encoding) { gzip - bzip2 - compress - pack {set var(mime) "application/octet-stream"} default {set var(mime) "text/plain"} } } } HVParse $varname } proc HVParse {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParse" } switch -- $var(mime) { "multipart/alternative" - "multipart/parallel" - "multipart/digest" - "multipart/related" - "multipart/signed" - "multipart/encrypted" - "multipart/report" {} "multipart/x-mixed-replace" - "multipart/mixed" { HVParseMulti $varname HVClearCache $varname } default {HVParseSingle $varname} } if {$var(analysis)} { AnalysisTaskEnd $var(analysis,which) $var(analysis,i) HVSetAnalysis $varname 0 {} 0 } } proc HVParseMulti {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseMulti" } # do it now, to be restored later if {[info exists var(index)]} { incr ${varname}(index) set var(index,$var(index)) [list $var(url) $var(query)] set index $var(index) } set fn $var(fn) set del $var(delete) if {[file exists "$var(fn)"]} { if {[catch {open "$var(fn)" r} ch]} { HVError $varname "[msgcat::mc {Unable to open file}] $var(fn)" return } } set boundary [HVParseMimeParam $varname "boundary"] if {[string equal "$boundary" {}]} { HVError $varname [msgcat::mc {Invalid formated multipart/mixed mime type message}] return } set state 1 set var(ch) {} HVSetResult $varname 200 {} HVSetData $varname {} {} while {[gets $ch line] >= 0} { if {$debug(tcl,hv)} { puts stderr "HVParseMulti $state:$line" } switch -- $state { 1 { # boundary if {[string equal "--$boundary" $line]} { set state 2 } } 2 { # header if {[string length $line] == 0} { HVParseMeta $varname # save to a file set var(fn) [tmpnam ds9 .http] set var(delete) 1 if {[catch {open "$var(fn)" w} ${varname}(ch)]} { HVError $varname "[msgcat::mc {Unable to open file}] $var(fn)" return } switch $var(transfer) { binary - base64 { fconfigure $var(ch) \ -translation binary -encoding binary } } set state 3 } else { if {[regexp -nocase {^([^:]+):(.+)$} $line x key value]} { lappend var(meta) $key [string trim $value] } } } 3 { # body if {[string equal "--$boundary" $line]} { catch {close $var(ch)} HVParseSingle $varname HVClearTmpFile $varname set var(ch) {} HVSetResult $varname 200 {} # we want to preserve var(text) # HVSetData $varname {} {} set var(data) {} set var(fn) {} set state 2 } elseif {[string equal "--$boundary--" $line]} { catch {close $var(ch)} catch {close $ch} HVParseSingle $varname HVClearTmpFile $varname # reset file values set var(fn) $fn set var(delete) $del if {[info exists var(index)]} { # reset index set var(index) $index HVClearIndex $varname $index } return } else { switch $var(transfer) { binary {puts -nonewline $var(ch) $line} base64 { puts -nonewline $var(ch) [base64::decode $line] } default {puts $var(ch) $line} } } } } } # clean up catch {close $ch} set var(fn) $fn } proc HVParseSingle {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseSingle $var(url)" } switch -- $var(mime) { "text/html" - "text/plain" - "application/octet-stream" { # its never fails, someone can't get there mime types correct. # Override the mime type based on path ParseURL $var(url) r set path [file tail $r(path)] # set content-encoding switch -- [file extension $path] { .gz { set path [file rootname $path] set var(encoding) gzip } .bz2 { set path [file rootname $path] set var(encoding) bzip2 } .Z { set path [file rootname $path] set var(encoding) compress } .z { set path [file rootname $path] set var(encoding) pack } } # set Content-Type switch -- [file extension $path] { .html - .htm {set var(mime) "text/html"} .gif {set var(mime) "image/gif"} .jpeg - .jpg {set var(mime) "image/jpeg"} .tiff - .tif {set var(mime) "image/tiff"} .png {set var(mime) "image/png"} .fits - .fit - .fts {set var(mime) "image/fits"} .ftz - .fgz { set var(mime) "image/fits" set var(encoding) "gzip" } .xml - .vot - .votable {set var(mime) "text/xml"} .text - .txt {set var(mime) "text/plain"} .sao {set var(mime) "text/x-cmap-sao"} } } } switch -- $var(mime) { "text/html" {HVParseHTML $varname} "text/plain" {HVParseText $varname} "application/octet-stream" {HVParseSave $varname} "image/gif" - "image/jpeg" - "image/tiff" - "image/png" {HVParseImg $varname} "image/fits" - "application/fits" {HVParseFITS $varname} "application/fits-image" - "application/fits-table" - "application/fits-group" {HVParseFITS $varname} "image/x-fits" - "binary/x-fits" - "application/x-fits" {HVParseFITS $varname} "image/x-gfits" - "binary/x-gfits" - "image/gz-fits" - "application/x-gzip" - "display/gz-fits" { set var(encoding) gzip HVParseFITS $varname } "image/bz2-fits" - "display/bz2-fits" { set var(encoding) bzip2 HVParseFITS $varname } "image/x-cfits" - "binary/x-cfits" { set var(encoding) compress HVParseFITS $varname } "image/x-zfits" - "binary/x-zfits" { set var(encoding) pack HVParseFITS $varname } "image/fits-hcompress" - "image/x-fits-h" {HVParseFITS $varname} "text/xml" - "application/xml" - "application/x-votable+xml" {HVParseVOT $varname} "x-xpa/xpaget" {} "x-xpa/xpaset" {HVParseXPASet $varname} "x-xpa/xpainfo" {} "x-xpa/xpaaccess" {} "text/x-cmap-sao" {HVParseColormap $varname} default {HVParseSave $varname} } } proc HVParseText {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseText" } if {[string length $var(data)] == 0} { if {[file exists "$var(fn)"]} { if {[catch {open "$var(fn)" r} ch]} { HVError $varname "[msgcat::mc {Unable to open file}] $var(fn)" return } set var(data) [read $ch] close $ch } } if {$var(analysis)} { if {$debug(tcl,hv)} { puts stderr "HVParseText Analysis" } AnalysisProcessGetURL $var(analysis,which) $var(analysis,i) $var(data) } else { append var(text) $var(data) set var(data) \ "<html>\n<body>\n$var(text)\n</body>\n</html>" HVSetResult $varname 200 "text/html" HVParseHTML $varname } HVClearCache $varname } proc HVParseHTML {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseHTML" } if {[string length $var(data)] == 0} { if {[file exists "$var(fn)"]} { if {[catch {open "$var(fn)" r} ch]} { HVError $varname "[msgcat::mc {Unable to open file}] $var(fn)" return } set var(data) [read $ch] close $ch } } # figure out the base # we don't want any query or fragments ParseURL $var(url) r set base {} # scheme switch $r(scheme) { http {append base "$r(scheme)://"} ftp {} file {} } # authority if {[string length $r(authority)] != 0} { append base "$r(authority)" } # path if {[string length $r(path)] != 0} { append base "$r(path)" } else { append base "/" } # query if {[string length $r(query)] != 0} { append base "?$r(query)" } # spaces? # regsub { } $base {\ } base $var(widget) config -base $base if {$debug(tcl,hv)} { DumpURL r puts stderr "HVParseHTML base [$var(widget) cget -base]" } # we have a valid html $var(widget) clear # fix forms with no action HVFixHTMLForm $varname # and now, parse it $var(widget) parse $var(data) HVGotoHTML $varname } proc HVParseImg {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseImg $var(url)" } if {$var(save)} { switch -- $var(mime) { "image/gif" {set fn [SaveFileDialog giffbox]} "image/jpeg" {set fn [SaveFileDialog jpegfbox]} "image/tiff" {set fn [SaveFileDialog tifffbox]} "image/png" {set fn [SaveFileDialog pngfbox]} } if {[string length "$fn"] != 0} { if {![catch {file rename -force "$var(fn)" "$fn"}]} { set var(fn) "$fn" set var(delete) 0 } } } switch -- $var(frame) { new {MultiLoadBase} current {} } ImportPhotoFile $var(fn) {} HVClearTmpFile $varname HVClearAll $varname HVUpdateDialog $varname } proc HVParseFITS {varname} { upvar #0 $varname var global $varname global ds9 global debug if {$var(save)} { switch -- $var(encoding) { gzip {FileLast savefitsfbox "ds9.fits.gz"} bzip2 {FileLast savefitsfbox "ds9.fits.bz2"} compress {FileLast savefitsfbox "ds9.fits.Z"} pack {FileLast savefitsfbox "ds9.fits.z"} default {FileLast savefitsfbox "ds9.fits"} } set fn [SaveFileDialog savefitsfbox] if {[string length "$fn"] != 0} { if {![catch {file rename -force "$var(fn)" "$fn"}]} { set var(fn) "$fn" set var(delete) 0 } } } switch -- $var(frame) { new {MultiLoadBase} current {} } StartLoad global loadParam set loadParam(load,type) allocgz set loadParam(load,layer) {} set loadParam(file,type) fits set loadParam(file,mode) {} set loadParam(file,name) "$var(fn)" set loadParam(file,fn) $loadParam(file,name) # may have to convert the file, based on content-encoding switch -- "$var(encoding)" { bzip2 { catch {set ch [open "| bunzip2 < $var(fn) " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } compress { catch {set ch [open "| uncompress < $var(fn) " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } pack { catch {set ch [open "| pcat $var(fn) " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } } ProcessLoad FinishLoad HVClearTmpFile $varname HVClearAll $varname HVUpdateDialog $varname } proc HVParseColormap {varname} { upvar #0 $varname var global $varname global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVParseColormap" } set fn [HVParseMimeParam $varname "name"] if {$fn == {}} { ParseURL $var(url) r set fn [file tail $r(path)] } if {![catch {file rename -force $var(fn) $ds9(tmpdir)/$fn}]} { LoadColormapFile $ds9(tmpdir)/$fn } HVClearAll $varname HVUpdateDialog $varname } proc HVParseVOT {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseVOT" } if {[file exists "$var(fn)"]} { CATVOTFile "$var(fn)" } HVClearTmpFile $varname HVClearAll $varname HVUpdateDialog $varname } proc HVParseSave {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVParseSave" } set fn [HVParseMimeParam $varname "name"] if {$fn == {}} { ParseURL $var(url) r set fn [file tail $r(path)] } FileLast savefitsfbox $fn set fn [SaveFileDialog savefitsfbox] if {[string length "$fn"] != 0} { if {![catch {file rename -force "$var(fn)" "$fn"}]} { set var(delete) 0 } } HVClearAll $varname HVUpdateDialog $varname } proc HVParseXPASet {varname} { upvar #0 $varname var global $varname global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVParseXPASet: [HVParseMimeParam $varname paramlist]" } if {[info exists var(xpa,target)]} { set target $var(xpa,target) } else { set target [HVParseMimeParam $varname target] } if {$target == "$ds9(title)" || $target == "DS9:*" || $target == "DS9:$ds9(title)" || $target == "*:$ds9(title)" || $target == "*:*" || $target == [XPAMethod]} { InitError hv CommSet $var(fn) [HVParseMimeParam $varname paramlist] } else { HVError $varname "[msgcat::mc {Unable to match target with XPA Mime request}] $url" } } proc HVGotoHTML {varname} { upvar #0 $varname var global $varname incr ${varname}(index) set var(index,$var(index)) [list $var(url) $var(query)] global debug if {$debug(tcl,hv)} { puts stderr "HVGotoHTML $var(index) |$var(url)|$var(query)|$var(fragment)|" } if {[string length $var(fragment)] != 0} { if {$debug(tcl,idletasks)} { puts stderr "HVGotoHTML" } update idletasks $var(widget) yview $var(fragment) } else { $var(widget) yview moveto 0 } HVUpdateDialog $varname } proc HVClearCache {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVClearCache $varname" } foreach x [array names $varname "cache,file,*"] { catch {file delete $var($x)} } foreach x [array names $varname "cache,*"] { unset ${varname}($x) } } proc HVClearIndex {varname n} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVClearIndex $varname $n" } foreach x [array names $varname "index,*"] { set f [split $x ,] if {[lindex $f 1] > $n} { unset ${varname}($x) } } set var(index) $n } proc HVClearTmpFile {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVClearTmpFile" } if {$var(delete) && [string length "$var(fn)"] != 0} { if {[file exists "$var(fn)"]} { if {$debug(tcl,hv)} { puts stderr "HVClearTmpFile delete $var(fn)" } file delete "$var(fn)" } set var(fn) {} set var(delete) 0 } } proc HVUpdateDialog {varname} { upvar #0 $varname var global $varname # in case we've set the cursor $var(widget) configure -cursor {} global debug if {$debug(tcl,hv)} { puts stderr "HVUpdateDialog\n" } set id $var(index) set id [incr id -1] if {[info exists ${varname}(index,$id)]} { $var(mb).view entryconfig [msgcat::mc {Back}] -state normal } else { $var(mb).view entryconfig [msgcat::mc {Back}] -state disabled } set id $var(index) set id [incr id 1] if {[info exists ${varname}(index,$id)]} { $var(mb).view entryconfig [msgcat::mc {Forward}] -state normal } else { $var(mb).view entryconfig [msgcat::mc {Forward}] -state disabled } } proc HVRefresh {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVRefresh" } set var(delete) 0 HVParse $varname } proc HVProgress {varname token totalsize currentsize} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVProgress:$varname" } if {$totalsize != 0} { HVStatus $varname "$currentsize bytes of $totalsize bytes [expr int(double($currentsize)/$totalsize*100)]%" } else { HVStatus $varname "$currentsize bytes" } } proc HVFTPHtmlList {host path list} { global debug if {$debug(tcl,hv)} { puts stderr "HVFTPHtmlList $host $path" } if {[string range $path end end] != "/"} { append path {/} } set html {} append html "<html>\n" append html "<head>\n" append html "<title>Index of $path on $host</title>\n" append html "</head>\n" append html "<body>\n" append html "<h1>Index on $path on $host</h1>\n" append html "<hr>\n" append html "<pre>\n" foreach l $list { switch -- [llength $l] { 8 {set offset 4} 9 {set offset 5} 10 {set offset 4} 11 {set offset 5} default {set offset 5} } set ii [lindex $l [expr $offset+3]] switch -- [string range $l 0 0] { d { set new "<a href=\"ftp://$host$path$ii/\">$ii</A>" } l { set new "<a href=\"ftp://$host$path$ii\">$ii</A>" } default { set new "<a href=\"ftp://$host$path$ii\">$ii</A>" } } regsub $ii $l $new l append html "$l\n" } append html "</pre>\n" append html "</hr>\n" append html "</body>\n" return $html } proc HVFileHtmlList {path list} { global debug if {$debug(tcl,hv)} { puts stderr "HVFileHtmlList $path" } if {[string range $path end end] != "/"} { append path {/} } set html {} append html "<html>\n" append html "<head>\n" append html "<title>Index of $path</title>\n" append html "</head>\n" append html "<body>\n" append html "<h1>Index on $path</h1>\n" append html "<hr>\n" append html "<pre>\n" foreach l $list { switch -- [llength $l] { 8 {set offset 4} 9 {set offset 5} 10 {set offset 4} 11 {set offset 5} default {set offset 5} } set ii [lindex $l [expr $offset+3]] switch -- [string range $l 0 0] { d { set new "<a href=\"file:$path$ii/\">$ii</A>" } l { set new "<a href=\"file:$path$ii\">$ii</A>" } default { set new "<a href=\"file:$path$ii\">$ii</A>" } } regsub $ii $l $new l append html "$l\n" } append html "</pre>\n" append html "</hr>\n" append html "</body>\n" return $html } proc HVDirList {path} { global debug if {$debug(tcl,hv)} { puts stderr "HVDirList $path" } return [split [exec ls -l $path] \n] } proc HVSetURL {varname url query fragment} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVSetURL $url $query $fragment" } set var(url) $url set var(query) $query set var(fragment) $fragment } proc HVSetResult {varname code mime} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVSetResult $code $mime" } set var(code) $code set var(meta) {} set var(mime) $mime set var(mime,param) {} set var(cache) 0 set var(cache,images) 1 set var(expire) 0 set var(encoding) {} set var(transfer) {} set var(refresh,time) 0 set var(refresh,url) {} set var(refresh,id) 0 } proc HVSetData {varname data fn} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVSetData $fn" } set var(data) $data set var(text) {} set var(fn) "$fn" } proc HVSetAnalysis {varname aa which ii} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVSetAnalysis" } set var(analysis) $aa set var(analysis,which) $which set var(analysis,i) $ii } proc HVClearAll {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVClearAll" } HVSetURL $varname {} {} {} HVSetResult $varname {} {} HVSetData $varname {} {} HVSetAnalysis $varname 0 {} 0 } # CallBacks proc HVImageCB {varname args} { upvar #0 $varname var global $varname global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVImageCB $varname args: $args" } set url [lindex $args 0] if {$debug(tcl,hv)} { puts stderr "HVImageCB url: $url" } # do we have anything? if {[string length $url] == 0} { return } # do we have a width/height? set aa [lindex $args 3] set width [HVattrs width $aa 0] set height [HVattrs height $aa 0] set src [HVattrs src $aa 0] # check for percent (100%) in width/height if {![string is integer $width]} { set width 0 } if {![string is integer $height]} { set height 0 } if {$debug(tcl,hv)} { puts stderr "HVImageCB src: $width $height $src" } # we have a problem in that htmlwidget will not properly resolve a windows # file name, there for we may have a bad file name url # double check with the src attribute global tcl_platform switch $tcl_platform(platform) { unix {} windows { ParseURL $url r switch -- $r(scheme) { {} - file { if {![file exists $url]} { # bad, try src if {[file exists $src]} { set url $src } } } } } } set img [HVImageURL $varname $url $width $height] if {[string length $img] != 0} { return $img } else { if {$debug(tcl,hv)} { puts stderr "HVImageCB FAIL $url" } return $var(images,gray) } } proc HVImageURL {varname url width height} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVImageURL $varname $url $width $height" } # do we already have the image? if {[info exists ${varname}(images,$url)]} { if {$debug(tcl,hv)} { puts stderr "HVImageURL found image a $url" } return $var(images,$url) } ParseURL $url r set fn {} switch -- $r(scheme) { {} - file { if {[file exists $r(path)]} { # can't use -file for zvfs # catch {image create photo -file $r(path)} img set ch [open $r(path) r] fconfigure $ch -translation binary -encoding binary set dd [read $ch] close $ch unset ch catch {image create photo -data "$dd"} img unset dd } } ftp { set fn [tmpnam ds9 [file extension $r(path)]] set ftp [ftp::Open $r(authority) "ftp" "-ds9@" -mode passive] if {$ftp > -1} { set ftp::VERBOSE $debug(tcl,ftp) set "ftp::ftp${ftp}(Output)" FTPLog ftp::Type $ftp binary if {[ftp::Get $ftp $r(path) "$fn"]} { ftp::Close $ftp if {[file size "$fn"] == 0} { catch {file delete -force "$fn"} return {} } if {[catch {image create photo -file "$fn"} img]} { catch {file delete -force "$fn"} return {} } } } } http { set ch {} set fn [tmpnam ds9 [file extension $r(path)]] for {set ii 5} {$ii>0} {incr ii -1} { if {[catch {open "$fn" w} ch]} { HVError $varname "[msgcat::mc {Unable to open file}] $fn" return {} } global ihttp if {[catch {set token \ [http::geturl $url \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -progress [list HVProgress $varname] \ -channel $ch \ -binary 1 \ -headers "[HVHTTPHeader $varname]" \ ]}]} { # if there is a problem, just bail set ii 0 continue } # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} catch {close $ch} upvar #0 $token t set code [http::ncode $token] set meta $t(meta) # result? switch -- $code { 200 - 203 - 503 {set ii 0} 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $meta { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,hv)} { puts stderr "HVImageURL redirect $code to $value" } # clean up and resubmit set url $value http::cleanup $token catch {file delete -force "$fn"} } } } default { # in general, we don't want to know about this if {$debug(tcl,hv)} { puts stderr "HVImageURL HTTP Error: $code" } set ii 0 } } } catch {http::cleanup $token} if {[file size "$fn"] == 0} { catch {file delete -force "$fn"} return {} } if {[catch {image create photo -file "$fn"} img]} { catch {file delete -force "$fn"} return {} } } } # do we have an img? if {![info exists img]} { return {} } if {$debug(tcl,hv)} { puts stderr "HVImageURL got image $img" } # adjust image size if needed if {$width != 0 || $height != 0} { set iw [image width $img] set ih [image height $img] set doit 1 # check for one dimension of 0. calculate to maintain aspect ratio if {$width == 0} { set width [expr $iw*$height/$ih] # see if we have a bad resample dimension set wf [expr double($iw)*$height/$ih] if {$width != $wf} { if {$debug(tcl,hv)} { puts stderr "HVImageURL abort resample image $img width $wf" } set doit 0 } } if {$height == 0} { set height [expr $ih*$width/$iw] # see if we have a bad resample dimension set hf [expr double($ih)*$width/$iw] if {$height != $hf} { if {$debug(tcl,hv)} { puts stderr \ "HVImageURL abort resample image $img height $hf" } set doit 0 } } # check to resample if {$doit && ($width != $iw || $height != $ih)} { if {$debug(tcl,hv)} { puts stderr "HVImageURL resample image $iw->$width $ih->$height" } set img2 \ [image create photo -width $width -height $height] if {[catch {blt::winop image resample $img $img2 box} ]} { # just use existing img if {$debug(tcl,hv)} { puts stderr "HVImageURL error resample image $img" } } else { set tmp $img set img $img2 catch {image delete $tmp} } } } # delete any tmp files if {"$fn" != {}} { catch {file delete -force "$fn"} } if {$var(cache,images)} { set var(images,$url) $img } return $img } proc HVFontCB {varname sz args} { upvar #0 $varname var global $varname global ds9 global debug if {$debug(tcl,hv)} { puts stderr "HVFontCB $varname $sz $args" } set family $var(font) set size $var(font,size) set weight $var(font,weight) set slant $var(font,slant) global ds9 foreach ff [concat [lindex $args 0]] { switch -- $ff { fixed { set family $ds9(courier) set sz [expr $sz-1] } bold {set weight bold} italic {set slant italic} } } switch -- $sz { 0 {incr size -3} 1 {incr size -2} 2 {incr size -1} 3 {} 4 {incr size 6} 5 {incr size 12} 6 {incr size 24} 7 {incr size 36} } if {$debug(tcl,hv)} { puts stderr "HVFontCB \{$family\} $size $weight $slant" } return "\{$family\} $size $weight $slant" } proc HVNoScriptCB {varname n tag args} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { # puts stderr "HVNoScriptCB $varname $n $tag $args" } } proc HVScriptCB {varname args} { upvar #0 $varname var global debug if {$debug(tcl,hv)} { # puts stderr "HVScriptCB $varname $args" } } proc HVFrameCB {varname args} { upvar #0 $varname var global $varname if {$debug(tcl,hv)} { puts stderr "HVFrameCB $varname $args" } } proc HVAppletCB {varname w args} { upvar #0 $varname var global $varname global debug if {$debug(tcl,hv)} { puts stderr "HVAppletCB $varname $w $args" } } proc HVParseMimeParam {varname key} { upvar #0 $varname var global $varname foreach {pp} [split $var(mime,param) {;}] { set id [string first {=} $pp] set name [string trim [string range $pp 0 [expr $id-1]]] set value [string trim [string range $pp [expr $id+1] end]] if {[string equal -nocase $name $key]} { return [string trim $value {"'}] } } return {} } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/iexam.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000007177 12520745345 016361� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc IExamDef {} { global iexam set iexam(button) 0 set iexam(key) 0 set iexam(any) 0 set iexam(frame) {} set iexam(x) {} set iexam(y) {} set iexam(event) {} set iexam(mode) {} } proc IExamButton {which xx yy} { global iexam global imarker if {$iexam(button) || $iexam(any)} { # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set iexam(frame) $which set iexam(x) $xx set iexam(y) $yy if {$iexam(any)} { set iexam(event) {<1>} } set iexam(button) 0 set iexam(any) 0 } } proc IExamKey {which K xx yy} { global iexam if {$iexam(key) || $iexam(any)} { set iexam(frame) $which set iexam(x) $xx set iexam(y) $yy set iexam(event) $K set iexam(key) 0 set iexam(any) 0 } } proc ProcessSendIExamCmd {proc id param} { global iexam global icursor global current set iexam(frame) {} set iexam(x) {} set iexam(y) {} set iexam(event) {} set iexam(mode) $current(mode) set current(mode) iexam set iexam(button) 0 set iexam(key) 0 set iexam(any) 0 # turn on blinking cursor set icursor(timer) 1 CursorTimer switch -- [string tolower [lindex $param 0]] { button { set iexam(button) 1 set varname {iexam(button)} set param [join [lreplace $param 0 0]] } key { set iexam(key) 1 set varname {iexam(key)} set param [join [lreplace $param 0 0]] } any { set iexam(any) 1 set varname {iexam(any)} set param [join [lreplace $param 0 0]] } default { set iexam(button) 1 set varname {iexam(button)} } } switch -- [string tolower [lindex $param 0]] { value - data { vwait $varname set w [lindex $param 1] set h [lindex $param 2] if {$w == {}} { set w 1 } if {$h == {}} { set h 1 } $proc $id "$iexam(event) [$iexam(frame) get data canvas $iexam(x) $iexam(y) $w $h]\n" } coordinate { set sys [lindex $param 1] set sky [lindex $param 2] set skyformat [lindex $param 3] switch -- $skyformat { {} {set skyformat degrees} } switch -- $sky { {} {set sky fk5} } switch -- $sys { {} {set sys physical} fk4 - fk5 - icrs - galactic - ecliptic {set sky $sys; set sys wcs} } vwait $varname $proc $id "$iexam(event) [$iexam(frame) get coordinates $iexam(x) $iexam(y) $sys $sky $skyformat]\n" } {} { vwait $varname $proc $id "$iexam(event) [$iexam(frame) get coordinates $iexam(x) $iexam(y) image fk5 degrees]\n" } default { vwait $varname set cmd $param # $width,$height,$depth,$bitpix ParseXYBitpixMacro cmd $iexam(frame) # $filename[$regions] ParseFilenameRegionMacro cmd $iexam(frame) # $filename ParseFilenameMacro cmd $iexam(frame) # $regions ParseRegionMacro cmd $iexam(frame) # $env ParseEnvMacro cmd # $pan ParsePanMacro cmd $iexam(frame) # $value ParseValueMacro cmd $iexam(frame) $iexam(x) $iexam(y) # $x,$y ParseXYMacro cmd $iexam(frame) $iexam(x) $iexam(y) # $z ParseZMacro cmd $iexam(frame) $proc $id "$iexam(event) $cmd\n" } } # turn off blinking cursor set icursor(timer) 0 set current(mode) $iexam(mode) set iexam(button) 0 set iexam(key) 0 set iexam(frame) {} set iexam(x) {} set iexam(y) {} set iexam(event) {} set iexam(mode) {} } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/iis.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000017102 12610232041 016007� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc IISDef {} { global iis # all internal set iis(state) 0 set iis(width) 512 set iis(height) 512 set iis(x) -1 set iis(y) -1 set iis(frame) {} set iis(ififo) "/dev/imt1i" set iis(ofifo) "/dev/imt1o" set iis(port) 5137 set iis(unix) "/tmp/.IMT%d" } proc IISInit {} { global iis global debug if {$debug(iis)} { puts stderr "IISInit:" } iis open $iis(ififo) $iis(ofifo) $iis(port) $iis(unix) } proc IISClose {} { global debug if {$debug(iis)} { puts stderr "IISClose:" } iis close } proc IISDebug {} { global debug iis debug $debug(iis) } # Callbacks proc IISInitializeCmd {w h} { global iis global debug if {$debug(iis)} { puts stderr "IISInitializeCmd: $w $h" } # default frame size set iis(width) $w set iis(height) $h } proc IISInitFrameCmd {which} { global debug if {$debug(iis)} { puts stderr "IISInitFrameCmd: $which" } } proc IISSetDisplayFrameCmd {which w h} { global iis global debug if {$debug(iis)} { puts stderr "IISSetDisplayFrameCmd: $which $w $h" } IISGotoFrame $which IISLoadFrame $which } proc IISSetRefFrameCmd {which} { global iis global ds9 global debug if {$debug(iis)} { puts stderr "IISSetRefFrameCmd: $which" } if {[lsearch $ds9(frames) Frame$which] == -1} { return {[NOSUCHFRAME]} } if {[Frame$which has iis]} { return {} } set filename [Frame$which get iis file name $iis(x) $iis(y)] if {![string equal [string index $filename 0] "/"] } { set filename [file join [pwd] $filename] } return "$filename 1. 0. 0. 1. 0. 0. 1. 32767. 1." } proc IISEraseFrameCmd {which} { global debug if {$debug(iis)} { puts stderr "IISEraseFrameCmd: $which" } Frame$which iis erase IISResetTimer $which } proc IISMessageCmd {message} { global current global debug if {$debug(iis)} { puts stderr "IISMessageCmd: $message" } $current(frame) iis message "\"$message\"" RefreshInfoBox $current(frame) } proc IISWritePixelsCmd {which ptr x y dx dy} { global debug if {$debug(iis)} { # puts stderr "IISWritePixelsCmd: $which $x $y $dx $dy" } Frame$which iis set $ptr $x $y $dx $dy IISResetTimer $which } proc IISReadPixelsCmd {which ptr x y dx dy} { global current global debug if {$debug(iis)} { # puts stderr "IISReadPixelsCmd: $which $x $y $dx $dy" } if {$which > 0} { Frame$which get iis $ptr $x $y $dx $dy } else { $current(frame) get iis $ptr $x $y $dx $dy } # IISResetTimer $which } proc IISWCSCmd {which a b c d e f z1 z2 zt} { global debug if {$debug(iis)} { puts stderr "IISWCSCmd: $which $a $b $c $d $e $f $z1 $z2 $zt" } # if there is a change in config, we are not told until now if {$which > 0} { IISLoadFrame $which Frame$which iis wcs $a $b $c $d $e $f $z1 $z2 $zt } } proc IISSetCursorPosCmd {x y} { global current global debug if {$debug(iis)} { puts stderr "***IISSetCursorPosCmd: $x $y" } $current(frame) iis cursor $x $y image } proc IISGetCursorPosCmd {} { global current global debug if {$debug(iis)} { puts stderr "***IISGetCursorPosCmd:" } if {[$current(frame) has iis]} { # assume frame name 'Framexxx' set num [string range $current(frame) 5 end] return "[$current(frame) get iis cursor] $num" } else { # default to first frame return "1 1 0" } } proc IISCursorModeCmd {state} { global iis global current global icursor global ds9 global debug if {$debug(iis)} { puts stderr "IISCursorModeCmd: $iis(state)=$state $current(frame)=$iis(frame)" } if {$state != $iis(state)} { # iis(frame) may have been deleted if {[lsearch $ds9(frames) $iis(frame)] == -1} { set iis(frame) {} } if {$iis(frame) == {}} { set which $current(frame) } else { set which $iis(frame) } set iis(state) $state $which iis cursor mode $state if {$state} { bind $ds9(canvas) <Key> [list IISCursorKey %K %A %x %y] bind $ds9(canvas) <f> {} UnBindEventsFrameKey $which if {$icursor(timer,abort)} { set icursor(timer,abort) 0 set icursor(timer) 1 } else { set icursor(timer) 1 CursorTimer } } else { bind $ds9(canvas) <Key> {} bind $ds9(canvas) <f> {ToggleBindEvents} BindEventsFrameKey $which set icursor(timer,abort) 1 set icursor(timer) 0 set iis(frame) [lindex [$ds9(canvas) gettags current] 0] } } } proc IISLoadFrame {which} { global iis global ds9 global debug if {$debug(iis)} { puts stderr "IISLoadFrame: $which" } if {$which > 0} { if {(![Frame$which has iis]) || \ ([Frame$which get fits width] != $iis(width)) || \ ([Frame$which get fits height] != $iis(height))} { StartLoad Frame$which iis new $iis(width) $iis(height) FinishLoad } else { # make sure any previous data is rendered Frame$which update now } } } proc IISGotoFrame {which} { global current global debug if {$debug(iis)} { puts stderr "IISGotoFrame: $which" } if {$which > 0} { if {$current(frame) != "Frame$which"} { CreateGotoFrame $which base } } } proc IISResetTimer {which} { global iis if {![info exists iis(timer$which)]} { after 500 IISTimer $which } set iis(timer$which) 1 } proc IISTimer {which} { global iis if {$iis(timer$which)} { after 500 IISTimer $which set iis(timer$which) 0 } else { if {$which > 0} { Frame$which iis update # re-execute FinishLoad again since we are finally done loading FinishLoad } unset iis(timer$which) } } proc IISCursorKey {sym key xx yy} { global current global iis global ds9 # MacOSX and Ubuntu returns bogus values in xx,yy # calculate our own values set xx [expr {[winfo pointerx $ds9(canvas)] - [winfo rootx $ds9(canvas)]}] set yy [expr {[winfo pointery $ds9(canvas)] - [winfo rooty $ds9(canvas)]}] global debug if {$debug(iis)} { puts stderr "IISCursorKey: $sym $key $xx $yy" } set which [lindex [$ds9(canvas) gettags current] 0] if {$which == {}} { return } set iis(x) $xx set iis(y) $yy switch -- $sym { Up {$which warp 0 -1} Down {$which warp 0 1} Left {$which warp -1 0} Right {$which warp 1 0} default { if {$key!={}} { set num [string range $which end end] set coord [$which get coordinates $xx $yy physical] if {$coord == {}} { switch -- $key { : - q {set coord "0 0"} default {return} } } $which iis cursor $xx $yy canvas iis retcur [lindex $coord 0] [lindex $coord 1] $key $num } } } } # Cmds proc ProcessIISCmd {varname iname} { upvar $varname var upvar $iname i global current switch -- [string tolower [lindex $var $i]] { filename { if {[string is integer [lindex $var [expr $i+2]]]} { if {$current(frame) != {}} { $current(frame) iis set file name \ [lindex $var [expr $i+1]] [lindex $var [expr $i+2]] } incr i 2 } else { if {$current(frame) != {}} { $current(frame) iis set file name [lindex $var [expr $i+1]] } incr i } } } } proc ProcessSendIISCmd {proc id param} { global current switch -- [string tolower [lindex $param 0]] { filename { if {$current(frame) != {}} { $proc $id \ "[$current(frame) get iis file name [lindex $param 1]]\n" } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/ime.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000026256 12527716223 016027� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc IMEDef {} { global iime global ime global pime set ime(task) stats set ime(shape) circle array set pime [array get ime] } proc IMEChangeTask {} { global current if {$current(frame) == {}} { return } if {$current(mode) != {analysis}} { return } UpdateTaskMenu IMEChangeShape } proc IMEChangeShape {} { global ime global ds9 global current switch $ime(task) { stats - hist { switch $ime(shape) { circle - ellipse - box - polygon {} default {set ime(shape) circle} } } radial { switch $ime(shape) { annulus - ellipseannulus - boxannulus {} default {set ime(shape) annulus} } } plot2d {} plot3d { switch $ime(shape) { circle - ellipse - box - polygon - point {} default {set ime(shape) point} } } } foreach ff $ds9(frames) { $ff marker analysis unselect all set coord [$ff get crosshair canvas] set XX [lindex $coord 0] set YY [lindex $coord 1] $ff analysis shape $ime(shape) $XX $YY if {$current(frame) == $ff} { IMEDoTask $current(frame) } } } proc IMEDoTask {which} { global ime if {![$which has fits]} { return } switch $ime(task) { stats {IMEStatsTask $which} hist {IMEHistTask $which} radial {IMERadialTask $which} plot2d {IMEPlot2DTask $which} plot3d {IMEPlot3DTask $which} } } proc IMEKey {which K xx yy} { global ime # always available switch $K { question { IMEHelp return } } if {![$which has fits]} { return } switch $K { a { # FWHM (Aperture Sum) } b { # Box Coords? } c { # Column Cut } d { # remap (Load Display) set ime(task) plot3d IMEKeyTask $which $xx $yy } e { # remap (Contour) } f { # remap (Redraw) } g { # remap (Graphics Cursor) } h { set ime(task) hist IMEKeyTask $which $xx $yy } i { # remap (Image Cursor) } j { # Line Guassian Fit } k { # Col Gaussian Fit } l { # Line Cut } m { set ime(task) stats IMEKeyTask $which $xx $yy } n { # remap (Next Frame) } o { # remap (Overplot) } p { # remap (Prev Frame) } q { # remap (Quit) } r { set ime(task) radial IMEKeyTask $which $xx $yy } s { # Surface Plot } t { # remap (Output Image) } u { # Vector Plot } v { set ime(task) plot2d IMEKeyTask $which $xx $yy } w { # remap (Toggle Logfile) } x { # Print coords/values } y { # remap (Set Origin) } z { # Print value grid } , { # Quick Profile Photometry } . { # Quick Radial Profile Plot and Fit } } } proc IMEKeyTask {which xx yy} { global ime $which crosshair canvas $xx $yy $which analysis shape $ime(shape) $xx $yy IMEDoTask $which UpdateColormapLevelMosaic $which $xx $yy canvas UpdateInfoBox $which $xx $yy canvas UpdatePixelTableDialog $which $xx $yy canvas UpdateGraph $which $xx $yy canvas } proc IMEButton {which xx yy} { global ime global imarker global debug if {$debug(tcl,ime)} { puts stderr "IMEButton $which $xx $yy" } # see if we are on a handle set hh [$which get marker analysis handle $xx $yy] set id [lindex $hh 0] set imarker(handle) [lindex $hh 1] if {$imarker(handle)} { $which marker analysis $id edit begin $imarker(handle) set imarker(motion) beginEdit return } # else, see if we are on a segment of a polygon set hh [$which get marker analysis polygon segment $xx $yy] set id [lindex $hh 0] set segment [lindex $hh 1] if {$segment} { $which marker analysis $id create polygon vertex $segment $xx $yy $which marker analysis $id edit begin $imarker(handle) set imarker(handle) [expr 4+$segment+1] set imarker(motion) beginEdit return } # see if any markers are selected if {[$which get marker analysis select number]>0} { # else, see if we are on a marker if {[$which get marker analysis id $xx $yy]} { $which marker analysis $id move begin set imarker(motion) beginMove return } else { $which marker analysis unselect all set imarker(motion) none return } } $which marker analysis $id move begin set imarker(motion) beginMove $which crosshair canvas $xx $yy $which analysis shape $ime(shape) $xx $yy IMEDoTask $which } proc IMEShift {which xx yy} { global ime global imarker global debug if {$debug(tcl,ime)} { puts stderr "IMEShift $which $xx $yy" } # see if we are on a handle set hh [$which get marker analysis handle $xx $yy] set id [lindex $hh 0] set imarker(handle) [lindex $hh 1] if {$imarker(handle)} { $which marker analysis $id rotate begin set imarker(motion) beginRotate } } proc IMEDouble {which xx yy} { global ime global imarker global debug if {$debug(tcl,ime)} { puts stderr "IMEDouble $which $xx $yy" } if {[$which get marker analysis id $xx $yy]} { $which marker analysis select only $xx $yy } } proc IMEMotion {which xx yy} { global ime global imarker global debug if {$debug(tcl,ime)} { puts stderr "IMEMotion $which $xx $yy" } switch -- $imarker(motion) { none {} beginMove - move { $which marker analysis move motion $x $y set imarker(motion) move $which crosshair canvas $xx $yy $which analysis shape $ime(shape) $xx $yy IMEDoTask $which } beginEdit - edit { set imarker(motion) edit $which marker analysis edit motion $xx $yy $imarker(handle) IMEDoTask $which } beginRotate - rotate { set imarker(motion) rotate $which marker analysis rotate motion $xx $yy $imarker(handle) IMEDoTask $which } region - shiftregion {} } } proc IMERelease {which xx yy} { global ime global imarker global debug if {$debug(tcl,ime)} { puts stderr "IMERelease $which $xx $yy" } switch -- $imarker(motion) { none {} beginMove - beginRotate {} beginEdit {} move { $which marker analysis move end IMEDoTask $which } edit { $which marker analysis edit end IMEDoTask $which } rotate { $which marker analysis rotate end IMEDoTask $which } region - shiftregion {} } set imarker(motion) none set imarker(handle) -1 } proc IMEArrowKey {which xx yy} { global ime global ds9 global debug if {$debug(tcl,ime)} { puts stderr "IMEArrow $which $xx $yy" } $which crosshair warp $xx $yy set coord [$which get crosshair canvas] set XX [lindex $coord 0] set YY [lindex $coord 1] $which analysis shape $ime(shape) $XX $YY IMEDoTask $which UpdateColormapLevelMosaic $which $XX $YY canvas UpdateInfoBox $which $XX $YY canvas UpdatePixelTableDialog $which $XX $YY canvas UpdateGraph $which $XX $YY canvas } proc IMEHelp {} { global ime set rr "\tAnalysis Help\n\n?\tPrint Help\nd\tPlot 3D\nm\tStatistics\nv\tPlot 2D\n" SimpleTextDialog imehlp "Analysis Help" 80 20 insert top $rr } proc IMEStatsTask {which} { global ime set rr [$which get marker analysis hide analysis stats physical fk5] SimpleTextDialog "imestat" "Statistics" 80 20 insert top $rr } proc IMEHistTask {which} { global iime global ime set id 0 set varname imehist global $varname upvar #0 $varname var set vvarname analysishist upvar #0 $vvarname vvar global $vvarname set xdata ${vvarname}x set ydata ${vvarname}y global $xdata $ydata set ping [PlotPing $vvarname] if {!$ping} { PlotLineDialog $vvarname Histogram {} Values Counts set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata } $which get marker analysis hide analysis histogram $xdata $ydata 512 if {!$ping} { PlotExternal $vvarname set vvar(smooth) step set vvar(fill) 1 $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } proc IMERadialTask {which} { global iime global ime set varname imerad global $varname upvar #0 $varname var set vvarname analysisrad upvar #0 $vvarname vvar global $vvarname set vvar(system) physical set xdata ${vvarname}x set ydata ${vvarname}y set yedata ${vvarname}ye global $xdata $ydata $yedata set ping [PlotPing $vvarname] if {!$ping} { PlotLineDialog $vvarname "Radial Profile" {} physical {} MarkerAnalysisRadialAxisTitle $vvarname set vvar(manage) 0 set vvar(dim) xyey set vvar(xdata) $xdata set vvar(ydata) $ydata set vvar(yedata) $yedata blt::vector create $xdata $ydata $yedata } $which get marker analysis hide analysis radial $xdata $ydata $yedata physical if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } proc IMEPlot2DTask {which} { global iime global ime set varname imeplot2d global $varname upvar #0 $varname var set vvarname analysisplot2d upvar #0 $vvarname vvar global $vvarname set vvar(system) physical set vvar(sky) fk5 set vvar(method) average set xdata ${vvarname}x set ydata ${vvarname}y set xcdata ${vvarname}xc set ycdata ${vvarname}yc global $xdata $ydata $xcdata $ycdata set ping [PlotPing $vvarname] if {!$ping} { PlotLineDialog $vvarname Plot2D {} physical Counts MarkerAnalysisPlot2dXAxisTitle $vvarname MarkerAnalysisPlot2dYAxisTitle $vvarname # setup our own formatting set vvar(graph,format) 0 set vvar(xcdata) $xcdata set vvar(ycdata) $ycdata $vvar(graph) xaxis configure \ -command "MarkerAnalysisPlot2dXAxis $vvarname" set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata $xcdata $ycdata } $which get marker analysis hide analysis plot2d $xdata $ydata $xcdata $ycdata physical fk5 average if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } proc IMEPlot3DTask {which} { global iime global ime set varname imeplot3d global $varname upvar #0 $varname var set vvarname analysisplot3d upvar #0 $vvarname vvar global $vvarname set vvar(system) image set vvar(method) average set xdata ${vvarname}x set ydata ${vvarname}y global $xdata $ydata set ping [PlotPing $vvarname] if {!$ping} { PlotLineDialog $vvarname Plot3D {} image Counts MarkerAnalysisPlot3dXAxisTitle $vvarname MarkerAnalysisPlot3dYAxisTitle $vvarname set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata } $which get marker analysis hide analysis plot3d $xdata $ydata physical average if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/imgsvr.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000031300 12610246271 016540� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc IMGSVRInit {varname title exec ack} { upvar #0 $varname var global $varname global ds9 global pds9 # AR variables ARInit $varname IMGSVRServer # IMG variables set var(proc,exec) $exec set var(proc,ack) $ack set var(current) {} set var(frame) {} set var(rgb) {} # create the window set w $var(top) set mb $var(mb) Toplevel $w $mb 6 $title "ARDestroy $varname" $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Retrieve}] \ -command "IMGSVRApply $varname 0" $mb.file add command -label [msgcat::mc {Cancel}] \ -command "ARCancel $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Update from Current Frame}] \ -command "IMGSVRUpdate $varname 1" $mb.file add command \ -label [msgcat::mc {Update from Current Crosshair}] \ -command "IMGSVRCrosshair $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Acknowledgment}] \ -command "IMGSVRAck $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "ARDestroy $varname" AREditMenu $varname NSVRServerMenu $varname $mb add cascade -label [msgcat::mc {Preferences}] -menu $mb.prefs menu $mb.prefs $mb.prefs add checkbutton -label [msgcat::mc {Save Image on Download}] \ -variable ${varname}(save) $mb.prefs add separator $mb.prefs add radiobutton -label [msgcat::mc {New Frame}] \ -variable ${varname}(mode) -value new $mb.prefs add radiobutton -label [msgcat::mc {Current Frame}] \ -variable ${varname}(mode) -value current # Param set f [ttk::frame $w.param] ttk::label $f.nametitle -text [msgcat::mc {Object}] ttk::entry $f.name -textvariable ${varname}(name) -width 50 ttk::label $f.sky -textvariable ${varname}(sky) -anchor w set var(xname) [ttk::label $f.xtitle -text {} -width 1] ttk::entry $f.x -textvariable ${varname}(x) -width 14 set var(yname) [ttk::label $f.ytitle -text {} -width 1] ttk::entry $f.y -textvariable ${varname}(y) -width 14 ARSkyFormat $f.skyformat $varname ttk::label $f.wtitle -text [msgcat::mc {Width}] ttk::entry $f.w -textvariable ${varname}(width) -width 14 ttk::label $f.htitle -text [msgcat::mc {Height}] ttk::entry $f.h -textvariable ${varname}(height) -width 14 ARRFormat $f.format $varname grid $f.nametitle x $f.name - - - - -padx 2 -pady 2 -sticky ew grid $f.sky $f.xtitle $f.x $f.ytitle $f.y $f.skyformat \ -padx 2 -pady 2 -sticky w grid $f.wtitle x $f.w $f.htitle $f.h $f.format -padx 2 -pady 2 -sticky w # Status set f [ttk::frame $w.status] ttk::label $f.title -text [msgcat::mc {Status}] ttk::label $f.item -textvariable ${varname}(status) grid $f.title $f.item -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] set var(apply) [ttk::button $f.apply -text [msgcat::mc {Retrieve}] \ -command "IMGSVRApply $varname 0"] set var(cancel) [ttk::button $f.cancel -text [msgcat::mc {Cancel}] \ -command "ARCancel $varname" -state disabled] ttk::button $f.close -text [msgcat::mc {Close}] \ -command "ARDestroy $varname" pack $f.apply $f.cancel $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal ttk::separator $w.sep2 -orient horizontal pack $w.buttons $w.sep $w.status $w.sep2 -side bottom -fill x pack $w.param -side top -fill both -expand true ARCoord $varname ARStatus $varname {} } proc IMGSVRApply {varname sync} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRApply $varname $sync" } set var(sync) $sync ARApply $varname set var(frame) {} set var(rgb) {} if {($var(name) != {})} { set var(sky) fk5 ARCoord $varname # remember where we are global current switch -- $var(mode) { current { set var(frame) $current(frame) set var(rgb) $current(rgb) } new {} } NSVRServer $varname } else { IMGSVRServer $varname } } proc IMGSVRAck {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRAck $varname" } eval "$var(proc,ack) $varname" } proc IMGSVRUpdate {varname force} { upvar #0 $varname var global $varname global current global wcs global debug if {$debug(tcl,image)} { puts stderr "IMGSVRUpdate $varname $force" } if {$debug(tcl,update)} { puts stderr "IMGSVRUpdate" } if {[winfo exists $var(top)]} { set var(name) {} if {$current(frame) != {} } { set fn [$current(frame) get fits file name] if {($fn != $var(current)) || $force} { set var(current) $fn if {[$current(frame) has wcs equatorial $wcs(system)]} { set coord [$current(frame) get fits center \ $wcs(system) $var(sky) $var(skyformat)] set var(x) [lindex $coord 0] set var(y) [lindex $coord 1] set size [$current(frame) get fits size \ $wcs(system) $var(sky) $var(rformat)] set var(width) [lindex $size 0] set var(height) [lindex $size 1] return } } } else { set var(x) {} set var(y) {} set var(width) {} set var(height) {} } } } proc IMGSVRCrosshair {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRCrosshair $varname" } global current global wcs if {[winfo exists $var(top)]} { set var(name) {} if {$current(frame) != {} } { if {[$current(frame) has wcs equatorial $wcs(system)]} { set coord [$current(frame) get crosshair \ $wcs(system) $var(sky) $var(skyformat)] set var(x) [lindex $coord 0] set var(y) [lindex $coord 1] return } } set var(x) {} set var(y) {} } } proc IMGSVRServer {varname} { upvar #0 $varname var global $varname global current global debug if {$debug(tcl,image)} { puts stderr "IMGSVRServer $varname" } if {($var(x) != {}) && ($var(y) != {})} { switch -- $var(mode) { new {MultiLoadBase} current {} } # remember where we are if {$var(frame) == {}} { set var(frame) $current(frame) } if {$var(rgb) == {}} { set var(rgb) $current(rgb) } ARStatus $varname "Contacting Image Server" eval "$var(proc,exec) $varname" } else { ARStatus $varname "Please specify Coordinates" ARReset $varname } } proc IMGSVRLoad {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRLoad $varname $var(url) $var(query)" } set var(ch) [open "$var(fn)" w] global ihttp if {$var(sync)} { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -channel $var(ch) \ -progress \ [list IMGSVRProgress $varname] \ -binary 1 \ -headers "[ProxyHTTP]" \ -query "$var(query)"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 IMGSVRLoadFinish $varname $var(token) } else { catch {close $var(ch)} ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } else { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -channel $var(ch) \ -command \ [list IMGSVRLoadFinish $varname] \ -progress \ [list IMGSVRProgress $varname] \ -binary 1 \ -headers "[ProxyHTTP]" \ -query "$var(query)"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 } else { catch {close $var(ch)} ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } } proc IMGSVRLoadFinish {varname token} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRLoadFinish $varname" } global current global ds9 global loadParam catch {close $var(ch)} if {!($var(active))} { ARCancelled $varname return } upvar #0 $token t # Code set code [http::ncode $token] # Meta set meta $t(meta) # Log it HTTPLog $token # Result? switch -- $code { 200 - 203 - 404 - 503 {IMGSVRParse $varname} 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $meta { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,hv)} { puts stderr "IMGSVRLoadFinish redirect $code to $value" } # clean up and resubmit http::cleanup $token unset var(token) set var(url) $value IMGSVRLoad $varname } } } default {ARError $varname "[msgcat::mc {Error code was returned}] $code"} } } proc IMGSVRParse {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "IMGSVRParse $varname" } global current global ds9 global loadParam # do we check for valid FITS? if {$var(valid)} { if {![ValidFits $var(fn)]} { ARError $varname "[msgcat::mc {No data available at }] $var(x) $var(y)" return } } # goto to frame if {$var(frame) != {}} { if {$current(frame) != $var(frame)} { set ds9(next) $var(frame) GotoFrame } } # got to channel if {$var(rgb) != {}} { if {$current(rgb) != $var(rgb)} { set current(rgb) $var(rgb) RGBChannel } } StartLoad # alloc it because we are going to delete it after load set loadParam(load,type) allocgz set loadParam(load,layer) {} set loadParam(file,type) fits set loadParam(file,mode) {} set loadParam(file,name) $var(fn) set loadParam(file,fn) $loadParam(file,name) ProcessLoad if {!$var(save)} { if {[file exists $var(fn)]} { catch {file delete -force $var(fn)} } } FinishLoad ARDone $varname } proc IMGSVRProgress {varname token totalsize currentsize} { upvar #0 $varname var global $varname # sometimes we get nothing if {$totalsize == {} || $currentsize == {}} { ARStatus $varname {} } elseif {$totalsize != 0} { ARStatus $varname "$currentsize bytes of $totalsize bytes [expr int(double($currentsize)/$totalsize*100)]%" } else { ARStatus $varname "$currentsize bytes" } } proc IMGSVRProcessCmd {varname iname vvarname} { upvar 2 $varname var upvar 2 $iname i upvar #0 $vvarname vvar switch -- [string tolower [lindex $var $i]] { {} { if {$vvar(name) != {} || ($vvar(x) != {} && $vvar(y) != {})} { IMGSVRApply $vvarname 1 } } open {} close {ARDestroy $vvarname} save { incr i set vvar(save) [FromYesNo [lindex $var $i]] } frame { incr i set vvar(mode) [string tolower [lindex $var $i]] } survey { incr i set vvar(survey) [lindex $var $i] } size { incr i set vvar(width) [lindex $var $i] incr i set vvar(height) [lindex $var $i] incr i if {[lindex $var $i] != {} && \ [string range [lindex $var $i] 0 0] != {-}} { set vvar(rformat) [lindex $var $i] set vvar(rformat,msg) $vvar(rformat) } else { incr i -1 } } pixels { incr i set vvar(width,pixels) [lindex $var $i] incr i set vvar(height,pixels) [lindex $var $i] } update { incr i switch [string tolower [lindex $var $i]] { frame {IMGSVRUpdate $vvarname 1} crosshair {IMGSVRCrosshair $vvarname} } IMGSVRApply $vvarname 1 } coord { incr i set vvar(x) [lindex $var $i] incr i set vvar(y) [lindex $var $i] incr i if {[lindex $var $i] != {} && \ [string range [lindex $var $i] 0 0] != {-}} { set vvar(skyformat) [lindex $var $i] set vvar(skyformat,msg) $vvar(skyformat) } else { incr i -1 } IMGSVRApply $vvarname 1 } name { incr i set vvar(name) [lindex $var $i] if {$vvar(name) != {}} { IMGSVRApply $vvarname 1 } } default { set vvar(name) [lindex $var $i] if {$vvar(name) != {}} { IMGSVRApply $vvarname 1 } } } } proc IMGSVRProcessSendCmd {proc id param vvarname} { upvar #0 $vvarname vvar switch -- [string tolower [lindex $param 0]] { save {$proc $id [ToYesNo $vvar(save)]} frame {$proc $id "$vvar(mode)\n"} survey {$proc $id "$vvar(survey)\n"} size {$proc $id "$vvar(width) $vvar(height) $vvar(rformat)\n"} pixels {$proc $id "$vvar(width,pixels) $vvar(height,pixels)\n"} coord {$proc $id "$vvar(x) $vvar(y) $vvar(skyformat)\n"} name - default {$proc $id "$vvar(name)\n"} } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/import.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000013737 12464211203 016553� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc Import {fn format layer mode fn2} { global current if {$fn == {}} { return } StartLoad switch -- $format { array {ImportArrayFile $fn $layer} rgbarray { switch -- [$current(frame) get type] { base - 3d {CreateRGBFrame} rgb {} } ImportRGBArrayFile $fn } nrrd {ImportNRRDFile $fn $layer} envi {ImportENVIFile $fn $fn2} gif - tiff - jpeg - png {ImportPhotoFile $fn $mode} } FinishLoad } # Support proc ImportDialog {format {layer {}} {mode {}}} { global arrayfbox global rgbarrayfbox global nrrdfbox global envifbox global envi2fbox global giffbox global jpegfbox global tifffbox global pngfbox switch -- $format { array {set fn [OpenFileDialog arrayfbox]} rgbarray {set fn [OpenFileDialog rgbarrayfbox]} nrrd {set fn [OpenFileDialog nrrdfbox]} envi {set fn [OpenFileDialog envifbox]} gif {set fn [OpenFileDialog giffbox]} jpeg {set fn [OpenFileDialog jpegfbox]} tiff {set fn [OpenFileDialog tifffbox]} png {set fn [OpenFileDialog pngfbox]} } set fn2 {} if {$fn != {}} { set ok 1 switch -- $format { array { # do we have an array spec tag'd on if {![regexp -nocase {(.*)(\[.*\])} $fn foo base ext]} { set ext {} set ok [ArrayImportDialog 1 ext] if {$ok} { append fn "$ext" } } } rgbarray { # do we have an array spec tag'd on if {![regexp -nocase {(.*)(\[.*\])} $fn foo base ext]} { set ext {} set ok [ArrayImportDialog 3 ext] if {$ok} { append fn "$ext" } } } envi { set fn2 [FindENVIDataFile $fn] if {$fn2 == {}} { set fn2 "[file rootname $fn].bsq" SetFileLast envi2 $fn2 set fn2 [OpenFileDialog envi2fbox] if {$fn2 == {}} { set ok 0 } } } nrrd - gif - jpeg - tiff - png {} } if {$ok} { Import $fn $format $layer $mode $fn2 } } } proc ArrayImportDialog {depth varname} { upvar $varname var global env global ed global ds9 set w {.arr} set ed(ok) 0 set ed(x) $ds9(array,x) set ed(y) $ds9(array,y) set ed(z) $depth set ed(bitpix) $ds9(array,bitpix) set ed(skip) $ds9(array,skip) set ed(arch) $ds9(array,arch) if {[info exists env(DS9_ARRAY)]} { if {[regexp {.*(dims.?=)([0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(x) $item set ed(y) $item } if {[regexp {.*(dim.?=)([0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(x) $item set ed(y) $item } if {[regexp {.*(xdim.?=)([0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(x) $item } if {[regexp {.*(ydim.?=)([0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(y) $item } if {[regexp {.*(zdim.?=)([0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(z) $item } if {[regexp {.*(bitpix.?=)(-?[0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(bitpix) $item } if {[regexp {.*(skip.?=)(-?[0-9]+)} $env(DS9_ARRAY) foo f1 item]} { set ed(skip) $item } if {[regexp {.*arch.?=bigendian} $env(DS9_ARRAY) foo item]} { set ed(arch) $item } if {[regexp {.*arch.?=littleendian} $env(DS9_ARRAY) foo item]} { set ed(arch) $item } } DialogCreate $w [msgcat::mc {Import Array}] ed(ok) # Dim set f [ttk::labelframe $w.dim -text [msgcat::mc {Dimension}] -padding 2] ttk::entry $f.x -textvariable ed(x) -width 6 ttk::entry $f.y -textvariable ed(y) -width 6 ttk::entry $f.z -textvariable ed(z) -width 6 grid $f.x $f.y $f.z -padx 2 -pady 2 -sticky w # Bitpix set f [ttk::labelframe $w.bitpix -text [msgcat::mc {Pixel Size}] -padding 2] ttk::radiobutton $f.char -text {Char} -variable ed(bitpix) -value 8 ttk::radiobutton $f.short -text {Short} -variable ed(bitpix) -value 16 ttk::radiobutton $f.ushort -text {UShort} -variable ed(bitpix) -value -16 ttk::radiobutton $f.long -text {Long} -variable ed(bitpix) -value 32 ttk::radiobutton $f.float -text {Float} -variable ed(bitpix) -value -32 ttk::radiobutton $f.double -text {Double} -variable ed(bitpix) -value -64 grid $f.char -padx 2 -pady 2 -sticky w grid $f.short $f.ushort $f.long -padx 2 -pady 2 -sticky w grid $f.float $f.double -padx 2 -pady 2 -sticky w # Skip set f [ttk::labelframe $w.skip -text [msgcat::mc {Header}] -padding 2] ttk::label $f.t1 -text [msgcat::mc {Skip First}] ttk::label $f.t2 -text [msgcat::mc {Bytes}] ttk::entry $f.skip -textvariable ed(skip) -width 6 grid $f.t1 $f.skip $f.t2 -padx 2 -pady 2 -sticky w # Arch set f [ttk::labelframe $w.arch -text [msgcat::mc {Architecture}] -padding 2] ttk::radiobutton $f.big -text {Big-Endian} -variable ed(arch) \ -value bigendian ttk::radiobutton $f.little -text {Little-Endian} -variable ed(arch) \ -value littleendian grid $f.big $f.little -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini grid $w.dim -sticky news grid $w.bitpix -sticky news grid $w.skip -sticky news grid $w.arch -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid rowconfigure $w 2 -weight 1 grid rowconfigure $w 3 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set ds9(array,x) $ed(x) set ds9(array,y) $ed(y) set ds9(array,bitpix) $ed(bitpix) set ds9(array,skip) $ed(skip) set ds9(array,arch) $ed(arch) set var "\[xdim=$ed(x),ydim=$ed(y),zdim=$ed(z),bitpix=$ed(bitpix),skip=$ed(skip),arch=$ed(arch)\]" } set rr $ed(ok) unset ed return $rr } ���������������������������������saods9/ds9/library/info.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000100700 12622660614 016171� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CreateInfoPanel {} { global ds9 global pds9 global view global infobox # Panel Frame set ds9(panel) [ttk::frame $ds9(main).panel] set ds9(panel,sep) [ttk::separator $ds9(main).spanel -orient horizontal] # Info set ds9(info) [ttk::frame $ds9(panel).info] ttk::frame $ds9(info).dummy ttk::label $ds9(info).fileTitle -text [msgcat::mc {File}] ttk::label $ds9(info).fileValue -relief groove \ -textvariable infobox(filename) ttk::label $ds9(info).objTitle -text [msgcat::mc {Object}] ttk::label $ds9(info).objValue -relief groove \ -textvariable infobox(object) ttk::entry $ds9(info).keyWord -textvariable view(info,keyvalue) ttk::label $ds9(info).keyValue -relief groove \ -textvariable infobox(keyvalue) ttk::label $ds9(info).minmaxTitle \ -text "[msgcat::mc {Min}] [msgcat::mc {Max}]" ttk::label $ds9(info).minValue -relief groove \ -textvariable infobox(min) -anchor center ttk::label $ds9(info).maxValue -relief groove \ -textvariable infobox(max) -anchor center ttk::label $ds9(info).lowhighTitle \ -text "[msgcat::mc {Low}] [msgcat::mc {High}]" ttk::label $ds9(info).lowValue -relief groove \ -textvariable infobox(low) -anchor center ttk::label $ds9(info).highValue -relief groove \ -textvariable infobox(high) -anchor center ttk::label $ds9(info).valueTitle -text [msgcat::mc {Value}] ttk::label $ds9(info).value -relief groove \ -textvariable infobox(value) -anchor center ttk::label $ds9(info).valueRTitle -text [msgcat::mc {r}] ttk::label $ds9(info).valueR -relief groove \ -textvariable infobox(value,red) -anchor center ttk::label $ds9(info).valueGTitle -text [msgcat::mc {g}] ttk::label $ds9(info).valueG -relief groove \ -textvariable infobox(value,green) -anchor center ttk::label $ds9(info).valueBTitle -text [msgcat::mc {b}] ttk::label $ds9(info).valueB -relief groove \ -textvariable infobox(value,blue) -anchor center ttk::label $ds9(info).bunitTitle -text [msgcat::mc {Units}] ttk::label $ds9(info).bunitValue -relief groove \ -textvariable infobox(bunit) foreach ll {{} 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} { set infobox(wcs$ll,sys) "[msgcat::mc {WCS}] $ll" ttk::label $ds9(info).wcsLabel$ll -textvariable infobox(wcs$ll,sys) set infobox(wcs$ll,x,nm) [ttk::label $ds9(info).wcsXLabel$ll -text {}] ttk::label $ds9(info).wcsXValue$ll -relief groove \ -textvariable infobox(wcs$ll,x) -anchor center set infobox(wcs$ll,y,nm) [ttk::label $ds9(info).wcsYLabel$ll -text {}] ttk::label $ds9(info).wcsYValue$ll -relief groove \ -textvariable infobox(wcs$ll,y) -anchor center set infobox(wcs$ll,z,nm) [ttk::label $ds9(info).wcsZLabel$ll -text {}] ttk::label $ds9(info).wcsZValue$ll -relief groove \ -textvariable infobox(wcs$ll,z) -anchor center } ttk::label $ds9(info).detectorTitle -text [msgcat::mc {Detector}] ttk::label $ds9(info).detectorXLabel -text {X} ttk::label $ds9(info).detectorXValue -relief groove \ -textvariable infobox(detector,x) -anchor center ttk::label $ds9(info).detectorYLabel -text {Y} ttk::label $ds9(info).detectorYValue -relief groove \ -textvariable infobox(detector,y) -anchor center ttk::label $ds9(info).detectorZLabel -text {Z} ttk::label $ds9(info).detectorZValue -relief groove \ -textvariable infobox(detector,) -anchor center ttk::label $ds9(info).amplifierTitle -text [msgcat::mc {Amplifier}] ttk::label $ds9(info).amplifierXLabel -text {X} ttk::label $ds9(info).amplifierXValue -relief groove \ -textvariable infobox(amplifier,x) -anchor center ttk::label $ds9(info).amplifierYLabel -text {Y} ttk::label $ds9(info).amplifierYValue -relief groove \ -textvariable infobox(amplifier,y) -anchor center ttk::label $ds9(info).amplifierZLabel -text {Z} ttk::label $ds9(info).amplifierZValue -relief groove \ -textvariable infobox(amplifier,z) -anchor center ttk::label $ds9(info).physicalTitle -text [msgcat::mc {Physical}] ttk::label $ds9(info).physicalXLabel -text {X} ttk::label $ds9(info).physicalXValue -relief groove \ -textvariable infobox(physical,x) -anchor center ttk::label $ds9(info).physicalYLabel -text {Y} ttk::label $ds9(info).physicalYValue -relief groove \ -textvariable infobox(physical,y) -anchor center ttk::label $ds9(info).physicalZLabel -text {Z} ttk::label $ds9(info).physicalZValue -relief groove \ -textvariable infobox(physical,z) -anchor center ttk::label $ds9(info).imageTitle -text [msgcat::mc {Image}] ttk::label $ds9(info).imageXLabel -text {X} ttk::label $ds9(info).imageXValue -relief groove \ -textvariable infobox(image,x) -anchor center ttk::label $ds9(info).imageYLabel -text {Y} ttk::label $ds9(info).imageYValue -relief groove \ -textvariable infobox(image,y) -anchor center ttk::label $ds9(info).imageZLabel -text {Z} ttk::label $ds9(info).imageZValue -relief groove \ -textvariable infobox(image,z) -anchor center ttk::label $ds9(info).frame -textvariable infobox(frame) \ -width [expr [string length [msgcat::mc {Frame}]]+4] ttk::label $ds9(info).zoomtitle -text [msgcat::mc {x}] ttk::label $ds9(info).zoomValue -relief groove \ -textvariable infobox(zoom) -anchor center ttk::label $ds9(info).angleTitle -text {} ttk::label $ds9(info).angleValue -relief groove \ -textvariable infobox(angle) -anchor center } proc UpdateFrameInfoBox {which} { global ds9 global view global debug if {$debug(tcl,events)} { puts stderr "UpdateFrameInfoBox" } switch -- $which { base { grid forget $ds9(info).valueRTitle $ds9(info).valueR \ $ds9(info).valueGTitle $ds9(info).valueG \ $ds9(info).valueBTitle $ds9(info).valueB switch -- $view(layout) { vertical { grid $ds9(info).value \ -row $ds9(info,row,value) \ -column 1 -padx 2 -sticky w } horizontal { grid $ds9(info).value \ -row $ds9(info,row,value) \ -column 2 -padx 2 -sticky w } } foreach ll {{} 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} { grid forget $ds9(info).wcsZLabel$ll grid forget $ds9(info).wcsZValue$ll } grid forget $ds9(info).detectorZLabel $ds9(info).detectorZValue grid forget $ds9(info).amplifierZLabel $ds9(info).amplifierZValue grid forget $ds9(info).physicalZLabel $ds9(info).physicalZValue grid forget $ds9(info).imageZLabel $ds9(info).imageZValue } rgb { grid forget $ds9(info).value switch $view(layout) { vertical { grid $ds9(info).valueRTitle \ -row $ds9(info,row,value,red) \ -column 0 -sticky w grid $ds9(info).valueR -row $ds9(info,row,value,red) \ -column 1 -padx 2 -sticky w grid $ds9(info).valueGTitle \ -row $ds9(info,row,value,green) \ -column 0 -sticky w grid $ds9(info).valueG \ -row $ds9(info,row,value,green) \ -column 1 -padx 2 -sticky w grid $ds9(info).valueBTitle \ -row $ds9(info,row,value,blue) \ -column 0 -sticky w grid $ds9(info).valueB \ -row $ds9(info,row,value,blue) \ -column 1 -padx 2 -sticky w } horizontal { grid $ds9(info).valueRTitle \ -row $ds9(info,row,value,red) \ -column 1 -sticky w grid $ds9(info).valueR \ -row $ds9(info,row,value,red) \ -column 2 -padx 2 -sticky w grid $ds9(info).valueGTitle \ -row $ds9(info,row,value,green) \ -column 3 -sticky w grid $ds9(info).valueG \ -row $ds9(info,row,value,green) \ -column 4 -padx 2 -sticky w grid $ds9(info).valueBTitle \ -row $ds9(info,row,value,blue) \ -column 5 -sticky w grid $ds9(info).valueB \ -row $ds9(info,row,value,blue) \ -column 6 -padx 2 -sticky w } } foreach ll {{} 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} { grid forget $ds9(info).wcsZLabel$ll grid forget $ds9(info).wcsZValue$ll } grid forget $ds9(info).detectorZLabel $ds9(info).detectorZValue grid forget $ds9(info).amplifierZLabel $ds9(info).amplifierZValue grid forget $ds9(info).physicalZLabel $ds9(info).physicalZValue grid forget $ds9(info).imageZLabel $ds9(info).imageZValue } 3d { grid forget $ds9(info).valueRTitle $ds9(info).valueR \ $ds9(info).valueGTitle $ds9(info).valueG \ $ds9(info).valueBTitle $ds9(info).valueB switch -- $view(layout) { vertical { grid $ds9(info).value -row $ds9(info,row,value) \ -column 1 -padx 2 -sticky w foreach ll {{} 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} { if {$view(info,wcs$ll)} { grid $ds9(info).wcsZLabel$ll \ -row $ds9(info,row,wcs$ll) \ -column 0 -sticky w grid $ds9(info).wcsZValue$ll \ -row $ds9(info,row,wcs$ll) \ -column 1 -padx 2 incr row } else { grid forget $ds9(info).wcsZLabel$ll grid forget $ds9(info).wcsZValue$ll } } if {$view(info,detector)} { grid $ds9(info).detectorZLabel \ -row $ds9(info,row,detector) \ -column 0 -sticky w grid $ds9(info).detectorZValue \ -row $ds9(info,row,detector) \ -column 1 -padx 2 } else { grid forget $ds9(info).detectorZLabel \ $ds9(info).detectorZValue } if {$view(info,amplifier)} { grid $ds9(info).amplifierZLabel \ -row $ds9(info,row,amplifier) \ -column 0 -sticky w grid $ds9(info).amplifierZValue \ -row $ds9(info,row,amplifier) \ -column 1 -padx 2 } else { grid forget $ds9(info).amplifierZLabel \ $ds9(info).amplifierZValue } if {$view(info,physical)} { grid $ds9(info).physicalZLabel \ -row $ds9(info,row,physical) \ -column 0 -sticky w grid $ds9(info).physicalZValue \ -row $ds9(info,row,physical) \ -column 1 -padx 2 } else { grid forget $ds9(info).physicalZLabel \ $ds9(info).physicalZValue } if {$view(info,image)} { grid $ds9(info).imageZLabel \ -row $ds9(info,row,image) \ -column 0 -sticky w grid $ds9(info).imageZValue \ -row $ds9(info,row,image) \ -column 1 -padx 2 } else { grid forget $ds9(info).imageZLabel \ $ds9(info).imageZValue } } horizontal { grid $ds9(info).value -row $ds9(info,row,value) \ -column 2 -padx 2 -sticky w foreach ll {{} 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} { if {$view(info,wcs$ll)} { grid $ds9(info).wcsZLabel$ll \ -row $ds9(info,row,wcs$ll) \ -column 5 -sticky w grid $ds9(info).wcsZValue$ll \ -row $ds9(info,row,wcs$ll) \ -column 6 -padx 2 incr row } else { grid forget $ds9(info).wcsZLabel$ll grid forget $ds9(info).wcsZValue$ll } } if {$view(info,detector)} { grid $ds9(info).detectorZLabel \ -row $ds9(info,row,detector) \ -column 5 -sticky w grid $ds9(info).detectorZValue \ -row $ds9(info,row,detector) \ -column 6 -padx 2 } else { grid forget $ds9(info).detectorZLabel \ $ds9(info).detectorZValue } if {$view(info,amplifier)} { grid $ds9(info).amplifierZLabel \ -row $ds9(info,row,amplifier) \ -column 5 -sticky w grid $ds9(info).amplifierZValue \ -row $ds9(info,row,amplifier) \ -column 6 -padx 2 } else { grid forget $ds9(info).amplifierZLabel \ $ds9(info).amplifierZValue } if {$view(info,physical)} { grid $ds9(info).physicalZLabel \ -row $ds9(info,row,physical) \ -column 5 -sticky w grid $ds9(info).physicalZValue \ -row $ds9(info,row,physical) \ -column 6 -padx 2 } else { grid forget $ds9(info).physicalZLabel \ $ds9(info).physicalZValue } if {$view(info,image)} { grid $ds9(info).imageZLabel \ -row $ds9(info,row,image) \ -column 5 -sticky w grid $ds9(info).imageZValue \ -row $ds9(info,row,image) \ -column 6 -padx 2 } else { grid forget $ds9(info).imageZLabel \ $ds9(info).imageZValue } } } } } } proc EnterInfoBox {which x y sys} { global infobox global ds9 global debug if {$debug(tcl,events)} { puts stderr "EnterInfoBox $which $x $y $sys" } UpdateFrameInfoBox [$which get type] UpdateWCSInfoBox $which UpdateInfoBox $which $x $y $sys set infobox(frame) "[msgcat::mc {Frame}] [string range $which 5 end]" set infobox(angle) [$which get rotate fixed] set z [$which get zoom fixed] set z1 [lindex $z 0] set z2 [lindex $z 1] if {$z1 != $z2} { set infobox(zoom) "$z1 $z2" } else { set infobox(zoom) $z1 } } proc EnterInfoBoxFrame {which} { global infobox global ds9 global debug if {$debug(tcl,events)} { puts stderr "EnterInfoBoxFrame $which" } UpdateFrameInfoBox [$which get type] UpdateWCSInfoBox $which ClearInfoBoxCoords set infobox(frame) "[msgcat::mc {Frame}] [string range $which 5 end]" set infobox(angle) [$which get rotate fixed] set z [$which get zoom fixed] set z1 [lindex $z 0] set z2 [lindex $z 1] if {$z1 != $z2} { set infobox(zoom) "$z1 $z2" } else { set infobox(zoom) $z1 } } proc LeaveInfoBox {} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "LeaveInfoBox" } ClearInfoBoxCoords } proc ClearInfoBox {} { global infobox global debug if {$debug(tcl,info)} { puts stderr "ClearInfoBox" } set infobox(filename) {} set infobox(object) {} set infobox(keyvalue) {} set infobox(bunit) {} set infobox(min) {} set infobox(max) {} set infobox(low) {} set infobox(high) {} ClearInfoBoxCoords set infobox(frame) [msgcat::mc {Frame}] set infobox(zoom) {} set infobox(angle) {} } proc ClearInfoBoxCoords {} { global infobox global debug if {$debug(tcl,info)} { puts stderr "ClearInfoBoxCoords" } set infobox(value) {} set infobox(value,red) {} set infobox(value,green) {} set infobox(value,blue) {} foreach ll {{} 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} { set infobox(wcs$ll,sys) "WCS $ll" $infobox(wcs$ll,x,nm) configure -text {} $infobox(wcs$ll,y,nm) configure -text {} $infobox(wcs$ll,z,nm) configure -text {} set infobox(wcs$ll,x) {} set infobox(wcs$ll,y) {} set infobox(wcs$ll,z) {} } set infobox(detector,x) {} set infobox(detector,y) {} set infobox(detector,z) {} set infobox(amplifier,x) {} set infobox(amplifier,y) {} set infobox(amplifier,z) {} set infobox(physical,x) {} set infobox(physical,y) {} set infobox(physical,z) {} set infobox(image,x) {} set infobox(image,y) {} set infobox(image,z) {} } proc RefreshInfoBox {which} { global ds9 global current global debug if {$debug(tcl,info)} { puts stderr "RefreshInfoBox" } if {$which != {}} { switch -- $current(mode) { crosshair - analysis { set coord [$which get crosshair canvas] set x [lindex $coord 0] set y [lindex $coord 1] EnterInfoBox $which $x $y canvas } none - pointer - region - colorbar - pan - zoom - rotate - crop - catalog - examine - iexam {EnterInfoBoxFrame $which} } } return } proc UpdateInfoBoxBase {} { global debug if {$debug(tcl,info)} { puts stderr "UpdateInfoBoxBase" } global current global infobox if {$current(frame) != {}} { $current(frame) get info infobox } } proc UpdateInfoBox {which x y sys} { global debug if {$debug(tcl,info)} { puts stderr "UpdateInfoBox $sys" } global ds9 global pds9 global infobox global view $which get info $sys $x $y infobox set infobox(bunit) [$which get fits header keyword BUNIT] if {$view(info,keyvalue) != ""} { set infobox(keyvalue) \ [$which get fits header keyword \'$view(info,keyvalue)\'] } else { set infobox(keyvalue) {} } foreach ll {{} 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} { if {$view(info,wcs$ll)} { if {![$which has fits]} { set infobox(wcs$ll,sys) "WCS $ll" $infobox(wcs$ll,x,nm) configure -text {} $infobox(wcs$ll,y,nm) configure -text {} } elseif {[$which has wcs equatorial wcs$ll]} { switch -- $infobox(wcs$ll,sys) { fk4 - fk5 - icrs { $infobox(wcs$ll,x,nm) configure -text "\u03b1" \ -font "$ds9(times) $pds9(font,size)" $infobox(wcs$ll,y,nm) configure -text "\u03b4" \ -font "$ds9(times) $pds9(font,size)" } galactic { $infobox(wcs$ll,x,nm) configure -text {l} \ -font "{$ds9(times)} $pds9(font,size) normal italic" $infobox(wcs$ll,y,nm) configure -text {b} \ -font "{$ds9(times)} $pds9(font,size) normal italic" } ecliptic { $infobox(wcs$ll,x,nm) configure -text "\u03bb" \ -font "$ds9(times) $pds9(font,size)" $infobox(wcs$ll,y,nm) configure -text "\u03b2" \ -font "$ds9(times) $pds9(font,size)" } } } elseif {[$which has wcs celestrial wcs$ll]} { set infobox(wcs$ll,sys) "WCS $ll" $infobox(wcs$ll,x,nm) configure -text {l} \ -font "{$ds9(times)} $pds9(font,size) normal italic" $infobox(wcs$ll,y,nm) configure -text {b} \ -font "{$ds9(times)} $pds9(font,size) normal italic" } else { set infobox(wcs$ll,sys) "WCS $ll" $infobox(wcs$ll,x,nm) configure -text {x} \ -font "{$ds9(times)} $pds9(font,size) normal italic" $infobox(wcs$ll,y,nm) configure -text {y} \ -font "{$ds9(times)} $pds9(font,size) normal italic" } } } } proc LayoutInfoPanel {} { global ds9 global view # reset grid columnconfigure $ds9(info) 7 -weight 0 if {$ds9(row) > -1} { grid rowconfigure $ds9(info) $ds9(row) -weight 0 set ds9(row) -1 } # layout switch $view(layout) { vertical {LayoutInfoPanelVert} horizontal {LayoutInfoPanelHorz} } } proc LayoutInfoPanelHorz {} { global ds9 global view set ww 11 set xx 40 set row 0 grid columnconfigure $ds9(info) 7 -weight 1 # filename if {$view(info,filename)} { $ds9(info).fileValue configure -width $xx grid $ds9(info).fileTitle -row $row -column 0 -sticky w grid $ds9(info).fileValue -row $row -column 2 -padx 2 \ -sticky ew -columnspan 6 incr row } else { grid forget $ds9(info).fileTitle grid forget $ds9(info).fileValue } # object if {$view(info,object)} { $ds9(info).objValue configure -width $xx grid $ds9(info).objTitle -row $row -column 0 -sticky w grid $ds9(info).objValue -row $row -column 2 -padx 2 \ -sticky ew -columnspan 6 incr row } else { grid forget $ds9(info).objTitle grid forget $ds9(info).objValue } # keyword if {$view(info,keyword)} { $ds9(info).keyWord configure -width $ww $ds9(info).keyValue configure -width $xx grid $ds9(info).keyWord -row $row -column 0 -sticky w grid $ds9(info).keyValue -row $row -column 2 -padx 2 \ -sticky w -columnspan 6 incr row } else { grid forget $ds9(info).keyWord grid forget $ds9(info).keyValue } # minmax if {$view(info,minmax)} { $ds9(info).minValue configure -width $ww $ds9(info).maxValue configure -width $ww grid $ds9(info).minmaxTitle -row $row -column 0 -sticky w grid $ds9(info).minValue -row $row -column 2 -padx 2 -sticky w grid $ds9(info).maxValue -row $row -column 4 -padx 2 -sticky w incr row } else { grid forget $ds9(info).minmaxTitle grid forget $ds9(info).minValue grid forget $ds9(info).maxValue } # lowhigh if {$view(info,lowhigh)} { $ds9(info).lowValue configure -width $ww $ds9(info).highValue configure -width $ww grid $ds9(info).lowhighTitle -row $row -column 0 -sticky w grid $ds9(info).lowValue -row $row -column 2 -padx 2 -sticky w grid $ds9(info).highValue -row $row -column 4 -padx 2 -sticky w incr row } else { grid forget $ds9(info).lowhighTitle grid forget $ds9(info).lowValue grid forget $ds9(info).highValue } # value $ds9(info).value configure -width $ww $ds9(info).valueR configure -width $ww $ds9(info).valueG configure -width $ww $ds9(info).valueB configure -width $ww grid $ds9(info).valueTitle -row $row -column 0 -sticky w set ds9(info,row,value) $row set ds9(info,row,value,red) $row set ds9(info,row,value,green) $row set ds9(info,row,value,blue) $row incr row UpdateFrameInfoBox base # unit if {$view(info,bunit)} { $ds9(info).bunitValue configure -width $ww grid $ds9(info).bunitTitle -row $row -column 0 -sticky w grid $ds9(info).bunitValue -row $row -column 2 -padx 2 -sticky w incr row } else { grid forget $ds9(info).bunitTitle grid forget $ds9(info).bunitValue } # wcs foreach ll {{} 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} { $ds9(info).wcsLabel$ll configure -width $ww $ds9(info).wcsXValue$ll configure -width $ww $ds9(info).wcsYValue$ll configure -width $ww $ds9(info).wcsZValue$ll configure -width $ww if {$view(info,wcs$ll)} { grid $ds9(info).wcsLabel$ll -row $row -column 0 -sticky w grid $ds9(info).wcsXLabel$ll -row $row -column 1 -sticky w grid $ds9(info).wcsXValue$ll -row $row -column 2 -padx 2 grid $ds9(info).wcsYLabel$ll -row $row -column 3 -sticky w grid $ds9(info).wcsYValue$ll -row $row -column 4 -padx 2 set ds9(info,row,wcs$ll) $row incr row } else { grid forget $ds9(info).wcsLabel$ll grid forget $ds9(info).wcsXLabel$ll grid forget $ds9(info).wcsXValue$ll grid forget $ds9(info).wcsYLabel$ll grid forget $ds9(info).wcsYValue$ll } } # detector if {$view(info,detector)} { $ds9(info).detectorXValue configure -width $ww $ds9(info).detectorYValue configure -width $ww $ds9(info).detectorZValue configure -width $ww grid $ds9(info).detectorTitle -row $row -column 0 -sticky w grid $ds9(info).detectorXLabel -row $row -column 1 -sticky w grid $ds9(info).detectorXValue -row $row -column 2 -padx 2 grid $ds9(info).detectorYLabel -row $row -column 3 -sticky w grid $ds9(info).detectorYValue -row $row -column 4 -padx 2 set ds9(info,row,detector) $row incr row } else { grid forget $ds9(info).detectorTitle grid forget $ds9(info).detectorXLabel grid forget $ds9(info).detectorXValue grid forget $ds9(info).detectorYLabel grid forget $ds9(info).detectorYValue } # amplifier if {$view(info,amplifier)} { $ds9(info).amplifierXValue configure -width $ww $ds9(info).amplifierYValue configure -width $ww $ds9(info).amplifierZValue configure -width $ww grid $ds9(info).amplifierTitle -row $row -column 0 -sticky w grid $ds9(info).amplifierXLabel -row $row -column 1 -sticky w grid $ds9(info).amplifierXValue -row $row -column 2 -padx 2 grid $ds9(info).amplifierYLabel -row $row -column 3 -sticky w grid $ds9(info).amplifierYValue -row $row -column 4 -padx 2 set ds9(info,row,amplifier) $row incr row } else { grid forget $ds9(info).amplifierTitle grid forget $ds9(info).amplifierXLabel grid forget $ds9(info).amplifierXValue grid forget $ds9(info).amplifierYLabel grid forget $ds9(info).amplifierYValue } # physical if {$view(info,physical)} { $ds9(info).physicalXValue configure -width $ww $ds9(info).physicalYValue configure -width $ww $ds9(info).physicalZValue configure -width $ww grid $ds9(info).physicalTitle -row $row -column 0 -sticky w grid $ds9(info).physicalXLabel -row $row -column 1 -sticky w grid $ds9(info).physicalXValue -row $row -column 2 -padx 2 grid $ds9(info).physicalYLabel -row $row -column 3 -sticky w grid $ds9(info).physicalYValue -row $row -column 4 -padx 2 set ds9(info,row,physical) $row incr row } else { grid forget $ds9(info).physicalTitle grid forget $ds9(info).physicalXLabel grid forget $ds9(info).physicalXValue grid forget $ds9(info).physicalYLabel grid forget $ds9(info).physicalYValue } # image if {$view(info,image)} { $ds9(info).imageXValue configure -width $ww $ds9(info).imageYValue configure -width $ww $ds9(info).imageZValue configure -width $ww grid $ds9(info).imageTitle -row $row -column 0 -sticky w grid $ds9(info).imageXLabel -row $row -column 1 -sticky w grid $ds9(info).imageXValue -row $row -column 2 -padx 2 grid $ds9(info).imageYLabel -row $row -column 3 -sticky w grid $ds9(info).imageYValue -row $row -column 4 -padx 2 set ds9(info,row,image) $row incr row } else { grid forget $ds9(info).imageTitle grid forget $ds9(info).imageXLabel grid forget $ds9(info).imageXValue grid forget $ds9(info).imageYLabel grid forget $ds9(info).imageYValue } # frame, zoom, angle if {$view(info,frame)} { $ds9(info).zoomValue configure -width $ww $ds9(info).angleValue configure -width $ww grid $ds9(info).frame -row $row -column 0 -sticky w grid $ds9(info).zoomtitle -row $row -column 1 -sticky w grid $ds9(info).zoomValue -row $row -column 2 -padx 2 -sticky w grid $ds9(info).angleValue -row $row -column 4 -padx 2 -sticky w grid $ds9(info).angleTitle -row $row -column 5 -sticky w incr row } else { grid forget $ds9(info).frame grid forget $ds9(info).zoomtitle grid forget $ds9(info).zoomValue grid forget $ds9(info).angleTitle grid forget $ds9(info).angleValue } # dummy grid forget $ds9(info).dummy } proc LayoutInfoPanelVert {} { global ds9 global view set ww 13 set row 0 # filename if {$view(info,filename)} { $ds9(info).fileValue configure -width $ww grid $ds9(info).fileTitle -row $row -column 1 -sticky w incr row grid $ds9(info).fileValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).fileTitle grid forget $ds9(info).fileValue } # object if {$view(info,object)} { $ds9(info).objValue configure -width $ww grid $ds9(info).objTitle -row $row -column 1 -sticky w incr row grid $ds9(info).objValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).objTitle grid forget $ds9(info).objValue } # keyword if {$view(info,keyword)} { $ds9(info).keyWord configure -width $ww $ds9(info).keyValue configure -width $ww grid $ds9(info).keyWord -row $row -column 1 -sticky w incr row grid $ds9(info).keyValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).keyWord grid forget $ds9(info).keyValue } # minmax if {$view(info,minmax)} { $ds9(info).minValue configure -width $ww $ds9(info).maxValue configure -width $ww grid $ds9(info).minmaxTitle -row $row -column 1 -sticky w incr row grid $ds9(info).minValue -row $row -column 1 -padx 2 -sticky w incr row grid $ds9(info).maxValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).minmaxTitle grid forget $ds9(info).minValue grid forget $ds9(info).maxValue } # lowhigh if {$view(info,lowhigh)} { $ds9(info).lowValue configure -width $ww $ds9(info).highValue configure -width $ww grid $ds9(info).lowhighTitle -row $row -column 1 -sticky w incr row grid $ds9(info).lowValue -row $row -column 1 -padx 2 -sticky w incr row grid $ds9(info).highValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).lowhighTitle grid forget $ds9(info).lowValue grid forget $ds9(info).highValue } # value $ds9(info).value configure -width $ww $ds9(info).valueR configure -width $ww $ds9(info).valueG configure -width $ww $ds9(info).valueB configure -width $ww grid $ds9(info).valueTitle -row $row -column 1 -sticky w incr row set ds9(info,row,value) $row set ds9(info,row,value,red) $row incr row set ds9(info,row,value,green) $row incr row set ds9(info,row,value,blue) $row incr row UpdateFrameInfoBox base # units if {$view(info,bunit)} { $ds9(info).bunitValue configure -width $ww grid $ds9(info).bunitTitle -row $row -column 1 -sticky w incr row grid $ds9(info).bunitValue -row $row -column 1 -padx 2 -sticky w incr row } else { grid forget $ds9(info).bunitTitle grid forget $ds9(info).bunitValue } # wcs foreach ll {{} 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} { $ds9(info).wcsLabel$ll configure -width $ww $ds9(info).wcsXValue$ll configure -width $ww $ds9(info).wcsYValue$ll configure -width $ww $ds9(info).wcsZValue$ll configure -width $ww if {$view(info,wcs$ll)} { grid $ds9(info).wcsLabel$ll -row $row -column 1 -sticky ew incr row grid $ds9(info).wcsXLabel$ll -row $row -column 0 -sticky e grid $ds9(info).wcsXValue$ll -row $row -column 1 -padx 2 incr row grid $ds9(info).wcsYLabel$ll -row $row -column 0 -sticky e grid $ds9(info).wcsYValue$ll -row $row -column 1 -padx 2 incr row set ds9(info,row,wcs$ll) $row incr row } else { grid forget $ds9(info).wcsLabel$ll grid forget $ds9(info).wcsXLabel$ll grid forget $ds9(info).wcsXValue$ll grid forget $ds9(info).wcsYLabel$ll grid forget $ds9(info).wcsYValue$ll } } # detector if {$view(info,detector)} { $ds9(info).detectorXValue configure -width $ww $ds9(info).detectorYValue configure -width $ww $ds9(info).detectorZValue configure -width $ww grid $ds9(info).detectorTitle -row $row -column 1 -sticky ew incr row grid $ds9(info).detectorXLabel -row $row -column 0 -sticky e grid $ds9(info).detectorXValue -row $row -column 1 -padx 2 incr row grid $ds9(info).detectorYLabel -row $row -column 0 -sticky e grid $ds9(info).detectorYValue -row $row -column 1 -padx 2 incr row set ds9(info,row,detector) $row incr row } else { grid forget $ds9(info).detectorTitle grid forget $ds9(info).detectorXLabel grid forget $ds9(info).detectorXValue grid forget $ds9(info).detectorYLabel grid forget $ds9(info).detectorYValue } # amplifier if {$view(info,amplifier)} { $ds9(info).amplifierXValue configure -width $ww $ds9(info).amplifierYValue configure -width $ww $ds9(info).amplifierZValue configure -width $ww grid $ds9(info).amplifierTitle -row $row -column 1 -sticky ew incr row grid $ds9(info).amplifierXLabel -row $row -column 0 -sticky e grid $ds9(info).amplifierXValue -row $row -column 1 -padx 2 incr row grid $ds9(info).amplifierYLabel -row $row -column 0 -sticky e grid $ds9(info).amplifierYValue -row $row -column 1 -padx 2 incr row set ds9(info,row,amplifier) $row incr row } else { grid forget $ds9(info).amplifierTitle grid forget $ds9(info).amplifierXLabel grid forget $ds9(info).amplifierXValue grid forget $ds9(info).amplifierYLabel grid forget $ds9(info).amplifierYValue } # physical if {$view(info,physical)} { $ds9(info).physicalXValue configure -width $ww $ds9(info).physicalYValue configure -width $ww $ds9(info).physicalZValue configure -width $ww grid $ds9(info).physicalTitle -row $row -column 1 -sticky ew incr row grid $ds9(info).physicalXLabel -row $row -column 0 -sticky e grid $ds9(info).physicalXValue -row $row -column 1 -padx 2 incr row grid $ds9(info).physicalYLabel -row $row -column 0 -sticky e grid $ds9(info).physicalYValue -row $row -column 1 -padx 2 incr row set ds9(info,row,physical) $row incr row } else { grid forget $ds9(info).physicalTitle grid forget $ds9(info).physicalXLabel grid forget $ds9(info).physicalXValue grid forget $ds9(info).physicalYLabel grid forget $ds9(info).physicalYValue } # image if {$view(info,image)} { $ds9(info).imageXValue configure -width $ww $ds9(info).imageYValue configure -width $ww $ds9(info).imageZValue configure -width $ww grid $ds9(info).imageTitle -row $row -column 1 -sticky ew incr row grid $ds9(info).imageXLabel -row $row -column 0 -sticky e grid $ds9(info).imageXValue -row $row -column 1 -padx 2 incr row grid $ds9(info).imageYLabel -row $row -column 0 -sticky e grid $ds9(info).imageYValue -row $row -column 1 -padx 2 incr row set ds9(info,row,image) $row incr row } else { grid forget $ds9(info).imageTitle grid forget $ds9(info).imageXLabel grid forget $ds9(info).imageXValue grid forget $ds9(info).imageYLabel grid forget $ds9(info).imageYValue } # frame, zoom, angle if {$view(info,frame)} { $ds9(info).zoomValue configure -width $ww $ds9(info).angleValue configure -width $ww grid $ds9(info).frame -row $row -column 1 -sticky ew incr row grid $ds9(info).zoomtitle -row $row -column 0 -sticky e grid $ds9(info).zoomValue -row $row -column 1 -padx 2 incr row grid $ds9(info).angleTitle -row $row -column 0 -sticky e grid $ds9(info).angleValue -row $row -column 1 -padx 2 incr row } else { grid forget $ds9(info).frame grid forget $ds9(info).zoomtitle grid forget $ds9(info).zoomValue grid forget $ds9(info).angleTitle grid forget $ds9(info).angleValue } # dummy global ds9 set ds9(row) $row grid $ds9(info).dummy -row $row -column 1 grid rowconfigure $ds9(info) $row -weight 1 } ����������������������������������������������������������������saods9/ds9/library/layout.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000054625 12520761536 016573� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CanvasDef {} { global canvas global icanvas global ds9 switch $ds9(wm) { x11 {set icanvas(horz,width) 680} aqua {set icanvas(horz,width) 760} win32 {set icanvas(horz,width) 760} } set icanvas(horz,height) 450 set icanvas(vert,width) 640 set icanvas(vert,height) 640 set canvas(width) $icanvas(horz,width) set canvas(height) $icanvas(horz,height) set canvas(gap) 4 switch $ds9(wm) { x11 { # this is not fool proof. it does not take into account redirecting # the DISPLAY. There must be a better way. global tcl_platform switch -- $tcl_platform(os) { Darwin {set canvas(gap,bottom) 14} default {set canvas(gap,bottom) 0} } } aqua {set canvas(gap,bottom) 14} win32 {set canvas(gap,bottom) 0} } } proc BlinkDef {} { global blink global iblink global pblink set iblink(id) 0 set iblink(index) -1 set blink(interval) 500 array set pblink [array get blink] } proc TileDef {} { global tile global itile global ptile set itile(top) .tile set itile(mb) .tilemb set tile(mode) grid set tile(grid,row) 10 set tile(grid,col) 10 set tile(grid,mode) automatic set tile(grid,dir) x set tile(grid,gap) 4 array set ptile [array get tile] } proc ViewDef {} { global view global pview set view(layout) horizontal set view(info) 1 set view(panner) 1 set view(magnifier) 1 set view(buttons) 1 set view(colorbar) 1 set view(graph,horz) 0 set view(graph,vert) 0 set view(info,filename) 1 set view(info,object) 1 set view(info,keyvalue) {} set view(info,keyword) 0 set view(info,minmax) 0 set view(info,lowhigh) 0 set view(info,bunit) 0 set view(info,wcs) 1 foreach l {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} { set "view(info,wcs$l)" 0 } set view(info,detector) 0 set view(info,amplifier) 0 set view(info,physical) 1 set view(info,image) 1 set view(info,frame) 1 array set pview [array get view] } # canvas proc CreateCanvas {} { global ds9 global canvas LayoutViewAdjust diff set ww [expr $canvas(width)+$diff(x)] set hh [expr $canvas(height)+$diff(y)] global debug if {$debug(tcl,layout)} { puts stderr "CreateCanvas $canvas(width) $canvas(height) ${ww}x${hh}" } set ds9(image) [ttk::frame $ds9(main).f] set ds9(canvas) [canvas $ds9(image).c -width $ww -height $hh \ -highlightthickness 0 -insertofftime 0 -bg $ds9(bg)] grid rowconfigure $ds9(image) 0 -weight 1 grid columnconfigure $ds9(image) 0 -weight 1 grid $ds9(canvas) -row 0 -column 0 -sticky news # extra space for window tab if {$canvas(gap,bottom)>0} { set f [frame $ds9(image).b -width 1 -height $canvas(gap,bottom) \ -bg $ds9(bg)] grid $f -row 1 -column 0 -sticky ew } # needed to realize window so Layout routines will work grid $ds9(image) } proc InitCanvas {} { global ds9 # Bindings bind $ds9(canvas) <Tab> [list NextFrame] bind $ds9(canvas) <Shift-Tab> [list PrevFrame] switch $ds9(wm) { x11 {bind $ds9(canvas) <ISO_Left_Tab> [list PrevFrame]} aqua {} win32 {} } bind $ds9(canvas) <Configure> [list ConfigureView] switch $ds9(wm) { x11 - aqua { bind $ds9(canvas) <Enter> [list focus $ds9(canvas)] bind $ds9(canvas) <Leave> [list focus {}] } win32 {} } switch $ds9(wm) { x11 {} aqua - win32 {bind $ds9(canvas) <MouseWheel> [list MouseWheelFrame %x %y %D]} } # backward compatible bindings switch $ds9(wm) { x11 - win32 { bind $ds9(canvas) <Button-3> {Button3Canvas %x %y} bind $ds9(canvas) <B3-Motion> {Motion3Canvas %x %y} bind $ds9(canvas) <ButtonRelease-3> {Release3Canvas %x %y} } aqua { # swap button-2 and button-3 on the mighty mouse bind $ds9(canvas) <Button-2> {Button3Canvas %x %y} bind $ds9(canvas) <B2-Motion> {Motion3Canvas %x %y} bind $ds9(canvas) <ButtonRelease-2> {Release3Canvas %x %y} # x11 command key emulation bind $ds9(canvas) <Command-Button-1> {Button3Canvas %x %y} bind $ds9(canvas) <Command-B1-Motion> {Motion3Canvas %x %y} bind $ds9(canvas) <Command-ButtonRelease-1> {Release3Canvas %x %y} } } # freeze bind $ds9(canvas) <f> {ToggleBindEvents} } proc Button3Canvas {x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "Button3Canvas" } set ds9(b3) 1 ColorbarButton3 $x $y } proc Motion3Canvas {x y} { global debug if {$debug(tcl,events)} { puts stderr "Motion3Canvas" } ColorbarMotion3 $x $y } proc Release3Canvas {x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "Release3Canvas" } set ds9(b3) 0 ColorbarRelease3 $x $y } proc UnBindEventsCanvas {} { global ds9 foreach f $ds9(active) { UnBindEventsFrame $f } } proc BindEventsCanvas {} { global ds9 global current switch -- $ds9(display) { single - blink {BindEventsFrame $current(frame)} tile { foreach f $ds9(active) { BindEventsFrame $f } } } } # view proc ConfigureView {} { global ds9 global canvas global debug if {$debug(tcl,layout)} { puts stderr "ConfigureView old $canvas(width) $canvas(height)" } # calculate ds9(canvas) size LayoutViewAdjust diff # adjust window size set canvas(width) [expr [winfo width $ds9(canvas)]-$diff(x)] set canvas(height) [expr [winfo height $ds9(canvas)]-$diff(y)] if {$debug(tcl,layout)} { puts stderr "ConfigureView new $canvas(width) $canvas(height)" } LayoutView } proc UpdateView {} { global ds9 global canvas # note: assume canvas(width) and canvas(height) have been set to desired # values. global debug if {$debug(tcl,layout)} { puts stderr "UpdateView to $canvas(width) x $canvas(height)" } # save current size set wo [winfo width $ds9(top)] set ho [winfo height $ds9(top)] # calculate ds9(canvas) size LayoutViewAdjust diff # adjust window size set ww [expr $canvas(width)+$diff(x)] set hh [expr $canvas(height)+$diff(y)] # determine how much to change set wc [winfo width $ds9(canvas)] set hc [winfo height $ds9(canvas)] set wt [winfo width $ds9(top)] set ht [winfo height $ds9(top)] if {$debug(tcl,layout)} { puts stderr "UpdateView before ds9(top) $wt x $ht" } set w [expr $ww - $wc + $wt] set h [expr $hh - $hc + $ht] if {$debug(tcl,layout)} { puts stderr "UpdateView after ds9(top) $w x $h" } # change window size wm geometry $ds9(top) ${w}x${h} LayoutView } proc LayoutView {} { global view global debug if {$debug(tcl,layout)} { puts stderr "LayoutView" } switch $view(layout) { horizontal {LayoutViewHorz} vertical {LayoutViewVert} } LayoutInfoPanel LayoutButtons LayoutFrames LayoutColorbar LayoutGraphs } proc LayoutViewAdjust {varname} { upvar $varname var global debug if {$debug(tcl,layout)} { puts stderr "LayoutViewAdjust" } global view global colorbar global icolorbar global igraph global canvas global ds9 set var(x) 0 set var(y) 0 set cbh [expr $view(colorbar) && \ [string equal $colorbar(orientation) {horizontal}]] set cbv [expr $view(colorbar) && \ [string equal $colorbar(orientation) {vertical}]] set grh $view(graph,horz) set grv $view(graph,vert) if {$colorbar(numerics)} { # ww horizontal: tickgap set ww 12 # hh vertical: approx number of numerals to display set hh 7 set icolorbar(horizontal,height) \ [expr int($colorbar(size) + $colorbar(font,size)*[tk scaling]+$ww)] set icolorbar(vertical,width) \ [expr $colorbar(size) + $colorbar(font,size)*$hh] } else { set icolorbar(horizontal,height) [expr $colorbar(size) +2] set icolorbar(vertical,width) [expr $colorbar(size) +2] } # basics if {$cbh} { incr var(y) $icolorbar(horizontal,height) } if {$cbv} { incr var(x) $icolorbar(vertical,width) } if {$grh} { incr var(y) $igraph(size) } if {$grv} { incr var(x) $igraph(size) } # canvas gap if {$cbh || $grh} { incr var(y) $canvas(gap) } if {$cbv || $grv} { incr var(x) $canvas(gap) } # graph gap if {$grv && !$cbh} { incr var(y) $igraph(gap,y) } if {$grh && !$cbv} { incr var(x) $igraph(gap,x) } global debug if {$debug(tcl,layout)} { puts stderr "LayoutViewAdjust $var(x) $var(y)" } } proc LayoutOrient {} { global ds9 global canvas global debug if {$debug(tcl,layout)} { puts stderr "LayoutOrient" } # save original canvas size set ww $canvas(width) set hh $canvas(height) # horizontal grid rowconfigure $ds9(main) 4 -weight 0 grid columnconfigure $ds9(main) 0 -weight 0 # vertical grid rowconfigure $ds9(main) 0 -weight 0 grid columnconfigure $ds9(main) 4 -weight 0 grid forget $ds9(panel) grid forget $ds9(panel,sep) grid forget $ds9(buttons) grid forget $ds9(buttons,sep) grid forget $ds9(image) pack forget $ds9(info) pack forget $ds9(panner) pack forget $ds9(magnifier) UpdateView update # restore original canvas size set canvas(width) $ww set canvas(height) $hh UpdateView } proc LayoutViewHorz {} { global ds9 global current global view # canvas grid rowconfigure $ds9(main) 4 -weight 1 grid columnconfigure $ds9(main) 0 -weight 1 grid $ds9(image) -row 4 -column 0 -sticky news # info panel if {$view(info) || $view(magnifier) || $view(panner)} { grid $ds9(panel) -row 0 -column 0 -sticky ew -columnspan 3 $ds9(panel,sep) configure -orient horizontal grid $ds9(panel,sep) -row 1 -column 0 -sticky ew -columnspan 3 } else { grid forget $ds9(panel) grid forget $ds9(panel,sep) } if {$view(info)} { pack $ds9(info) -side left -anchor nw -padx 2 -pady 2 \ -fill x -expand true } else { pack forget $ds9(info) } if {$view(panner)} { pack $ds9(panner) -side right -padx 2 -pady 2 } else { pack forget $ds9(panner) } if {$view(magnifier)} { pack $ds9(magnifier) -side right -padx 2 -pady 2 if {$view(panner)} { pack $ds9(magnifier) -before $ds9(panner) } } else { pack forget $ds9(magnifier) } # buttons if {$view(buttons)} { grid $ds9(buttons) -row 2 -sticky ew -columnspan 3 $ds9(buttons,sep) configure -orient horizontal grid $ds9(buttons,sep) -row 3 -column 0 -sticky ew -columnspan 3 } else { grid forget $ds9(buttons) grid forget $ds9(buttons,sep) } } proc LayoutViewVert {} { global ds9 global current global view # canvas grid rowconfigure $ds9(main) 0 -weight 1 grid columnconfigure $ds9(main) 4 -weight 1 grid $ds9(image) -row 0 -column 4 -sticky news # info panel if {$view(info) || $view(magnifier) || $view(panner)} { grid $ds9(panel) -row 0 -column 0 -sticky ns $ds9(panel,sep) configure -orient vertical grid $ds9(panel,sep) -row 0 -column 1 -sticky ns } else { grid forget $ds9(panel) grid forget $ds9(panel,sep) } if {$view(magnifier)} { pack $ds9(magnifier) -side top -padx 2 -pady 2 } else { pack forget $ds9(magnifier) } if {$view(info)} { pack $ds9(info) -side top -padx 2 -pady 2 -fill y -expand true if {$view(magnifier)} { pack $ds9(info) -after $ds9(magnifier) } } else { pack forget $ds9(info) } if {$view(panner)} { pack $ds9(panner) -side bottom -padx 2 -pady 2 } else { pack forget $ds9(panner) } # buttons if {$view(buttons)} { grid $ds9(buttons) -row 0 -column 2 -sticky ns $ds9(buttons,sep) configure -orient vertical grid $ds9(buttons,sep) -row 0 -column 3 -sticky ns } else { grid forget $ds9(buttons) grid forget $ds9(buttons,sep) } } proc LayoutFrames {} { global ds9 global current global tile global view global colorbar # turn everything off foreach f $ds9(frames) { $f hide $f highlite off $f panner off $f magnifier off UnBindEventsFrame $f } if {$ds9(active,num) > 0} { switch -- $ds9(display) { single {TileOne} tile { switch -- $tile(mode) { row {TileRect 1 $ds9(active,num) $tile(grid,gap)} column {TileRect $ds9(active,num) 1 $tile(grid,gap)} grid { switch -- $tile(grid,mode) { automatic { TileRect [expr int(sqrt($ds9(active,num)-1))+1] \ [expr int(sqrt($ds9(active,num))+.5)] \ $tile(grid,gap) } manual { TileRect \ $tile(grid,col) \ $tile(grid,row) \ $tile(grid,gap) } } } } } blink {TileOne} } } else { set current(frame) {} set ds9(next) {} # panner if {$view(panner)} { panner clear } # magnifier if {$view(magnifier)} { magnifier clear } # process proper colorbar colorbar show colorbarrgb hide $ds9(canvas) raise colorbar colorbarrgb set current(colorbar) colorbar set colorbar(map) [colorbar get name] set colorbar(invert) [colorbar get invert] # update menus/dialogs UpdateDS9 } } # This procedure is called when we have only 1 frames to display proc TileOne {} { global ds9 global view global current global canvas global colorbar set ww $canvas(width) set hh $canvas(height) set xx 0 set yy 0 foreach f $ds9(active) { $f configure -x $xx -y $yy -width $ww -height $hh -anchor nw } # only show the current frame $current(frame) show FrameToFront } proc TileRect {numx numy gap} { global view global canvas global tile set ww $canvas(width) set hh $canvas(height) set w [expr int(($ww-$gap*($numx-1))/$numx)] set h [expr int(($hh-$gap*($numy-1))/$numy)] switch $tile(grid,dir) { x { for {set jj 0} {$jj<$numy} {incr jj} { for {set ii 0} {$ii<$numx} {incr ii} { set nn [expr $jj*$numx + $ii] set x($nn) [expr ($w+$gap)*$ii] set y($nn) [expr ($h+$gap)*$jj] } } } y { for {set ii 0} {$ii<$numx} {incr ii} { for {set jj 0} {$jj<$numy} {incr jj} { set nn [expr $ii*$numy + $jj] set x($nn) [expr ($w+$gap)*$ii] set y($nn) [expr ($h+$gap)*$jj] } } } } TileIt $w $h x y [expr $numx*$numy] } proc TileIt {ww hh xvar yvar nn} { upvar $xvar x upvar $yvar y global ds9 global current set ii 0 foreach ff $ds9(active) { if {$ii<$nn} { $ff configure -x $x($ii) -y $y($ii) \ -width $ww -height $hh -anchor nw $ff show $ds9(canvas) raise $ff if {!$ds9(freeze)} { BindEventsFrame $ff } } incr ii } # if manual grid, current frame could be not included if {$current(frame) != {}} { $current(frame) colorbar tag "\{[$current(colorbar) get tag]\}" } if {$ds9(active,num) > $nn} { set current(frame) [lindex $ds9(active) 0] } FrameToFront } proc DisplayDefaultDialog {} { global canvas global ed set w {.defdpy} set ed(ok) 0 set ed(x) $canvas(width) set ed(y) $canvas(height) DialogCreate $w [msgcat::mc {Display Size}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.xTitle -text {X} ttk::label $f.yTitle -text {Y} ttk::entry $f.x -textvariable ed(x) -width 10 ttk::entry $f.y -textvariable ed(y) -width 10 ttk::label $f.xunit -text [msgcat::mc {Pixels}] ttk::label $f.yunit -text [msgcat::mc {Pixels}] grid $f.xTitle $f.x $f.xunit -padx 2 -pady 2 -sticky w grid $f.yTitle $f.y $f.yunit -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w $w.param.x select range 0 end DialogWait $w ed(ok) $w.param.x DialogDismiss $w if {$ed(ok)} { set canvas(width) $ed(x) set canvas(height) $ed(y) UpdateView } set rr $ed(ok) unset ed return $rr } proc ViewHorzCmd {} { global canvas global icanvas set canvas(width) $icanvas(horz,width) set canvas(height) $icanvas(horz,height) LayoutOrient } proc ViewVertCmd {} { global canvas global icanvas set canvas(width) $icanvas(vert,width) set canvas(height) $icanvas(vert,height) LayoutOrient } # Process Cmds proc ProcessHeightCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized # can't use ProcessRealize RealizeDS9 global canvas set canvas(height) [lindex $var $i] UpdateView } proc ProcessSendHeightCmd {proc id param} { global canvas $proc $id "$canvas(height)\n" } proc ProcessWidthCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized # can't use ProcessRealize RealizeDS9 global canvas set canvas(width) [lindex $var $i] UpdateView } proc ProcessSendWidthCmd {proc id param} { global canvas $proc $id "$canvas(width)\n" } proc ProcessViewCmd {varname iname} { upvar $varname var upvar $iname i global view global rgb global canvas global icanvas set item [string tolower [lindex $var $i]] switch -- $item { layout { incr i set item [string tolower [lindex $var $i]] switch -- $item { horizontal { set view(layout) $item ViewHorzCmd } vertical { set view(layout) $item ViewVertCmd } } } keyvalue { incr i set view(info,keyvalue) [lindex $var $i] } horizontal { # backward compatibility set view(layout) $item ViewHorzCmd } vertical { # backward compatibility set view(layout) $item ViewVertCmd } default { set yesno [lindex $var [expr $i+1]] switch -- $yesno { 1 - 0 - yes - no - on - off - true - false {incr i} default { set yesno 1 } } switch -- $item { info - panner - magnifier - buttons - colorbar {set view($item) [FromYesNo $yesno]} colorbarnumerics { # backward compatibility set colorbar(numerics) [FromYesNo $yesno] } graph { incr i set item [string tolower [lindex $var $i]] switch -- $item { horizontal { set yesno [lindex $var [expr $i+1]] switch -- $yesno { 1 - 0 - yes - no - on - off - true - false {incr i} default { set yesno 1 } } set view(graph,horz) [FromYesNo $yesno] } vertical { set yesno [lindex $var [expr $i+1]] switch -- $yesno { 1 - 0 - yes - no - on - off - true - false {incr i} default { set yesno 1 } } set view(graph,vert) [FromYesNo $yesno] } } } horzgraph { # backward compatibility set view(graph,horz) [FromYesNo $yesno] } vertgraph { # backward compatibility set view(graph,vert) [FromYesNo $yesno] } filename - object - keyword - minmax - lowhigh - units - detector - amplifier - physical - image - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz - frame {set view(info,$item) [FromYesNo $yesno]} red - green - blue {set rgb($item) [FromYesNo $yesno]; RGBView} } UpdateView } } } proc ProcessSendViewCmd {proc id param} { global view switch -- [string tolower [lindex $param 0]] { layout {$proc $id "$view(layout)\n"} keyvalue {$proc $id "$view(info,keyvalue)\n"} info {$proc $id [ToYesNo $view(info)]} panner {$proc $id [ToYesNo $view(panner)]} magnifier {$proc $id [ToYesNo $view(magnifier)]} buttons {$proc $id [ToYesNo $view(buttons)]} colorbar {$proc $id [ToYesNo $view(colorbar)]} colorbarnumerics { # backward compatibility $proc $id [ToYesNo $colorbar(numerics)] } graph { switch -- [string tolower [lindex $param 1]] { horizontal {$proc $id [ToYesNo $view(graph,horz)]} vertical {$proc $id [ToYesNo $view(graph,vert)]} } } horzgraph { # backward compatibility $proc $id [ToYesNo $view(graph,horz)] } vertgraph { # backward compatibility $proc $id [ToYesNo $view(graph,vert)] } filename {$proc $id [ToYesNo $view(info,filename)]} object {$proc $id [ToYesNo $view(info,object)]} keyword {$proc $id [ToYesNo $view(info,keyword)]} minmax {$proc $id [ToYesNo $view(info,minmax)]} lowhigh {$proc $id [ToYesNo $view(info,lowhigh)]} units {$proc $id [ToYesNo $view(info,bunit)]} detector {$proc $id [ToYesNo $view(info,detector)]} amplifier {$proc $id [ToYesNo $view(info,amplifier)]} physical {$proc $id [ToYesNo $view(info,physical)]} image {$proc $id [ToYesNo $view(info,image)]} wcs {$proc $id [ToYesNo $view(info,wcs)]} wcsa {$proc $id [ToYesNo $view(info,wcsa)]} wcsb {$proc $id [ToYesNo $view(info,wcsb)]} wcsc {$proc $id [ToYesNo $view(info,wcsc)]} wcsd {$proc $id [ToYesNo $view(info,wcsd)]} wcse {$proc $id [ToYesNo $view(info,wcse)]} wcsf {$proc $id [ToYesNo $view(info,wcsf)]} wcsg {$proc $id [ToYesNo $view(info,wcsg)]} wcsh {$proc $id [ToYesNo $view(info,wcsh)]} wcsi {$proc $id [ToYesNo $view(info,wcsi)]} wcsj {$proc $id [ToYesNo $view(info,wcsj)]} wcsk {$proc $id [ToYesNo $view(info,wcsk)]} wcsl {$proc $id [ToYesNo $view(info,wcsl)]} wcsm {$proc $id [ToYesNo $view(info,wcsm)]} wcsn {$proc $id [ToYesNo $view(info,wcsn)]} wcso {$proc $id [ToYesNo $view(info,wcso)]} wcsp {$proc $id [ToYesNo $view(info,wcsp)]} wcsq {$proc $id [ToYesNo $view(info,wcsq)]} wcsr {$proc $id [ToYesNo $view(info,wcsr)]} wcss {$proc $id [ToYesNo $view(info,wcss)]} wcst {$proc $id [ToYesNo $view(info,wcst)]} wcsu {$proc $id [ToYesNo $view(info,wcsu)]} wcsv {$proc $id [ToYesNo $view(info,wcsv)]} wcsw {$proc $id [ToYesNo $view(info,wcsw)]} wcsx {$proc $id [ToYesNo $view(info,wcsx)]} wcsy {$proc $id [ToYesNo $view(info,wcsy)]} wcsz {$proc $id [ToYesNo $view(info,wcsz)]} frame {$proc $id [ToYesNo $view(info,frame)]} default { # backward compatibility $proc $id "$view(layout)\n" } } } �����������������������������������������������������������������������������������������������������������saods9/ds9/library/line.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000005314 12514261632 016167� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LineDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set arrows [$var(frame) get marker $var(id) line arrow] set var(p1arrow) [lindex $arrows 0] set var(p2arrow) [lindex $arrows 1] # procs set var(which) line set var(proc,apply) LineApply set var(proc,coordCB) LineCoordCB set var(proc,editCB) LineEditCB set var(proc,distCB) LineDistCB # base MarkerBaseLineDialog $varname 375 150 # raise plot? global marker set var(plot2d) $marker(plot2d) # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis # plot2d MarkerAnalysisPlot2dDialog $varname set f $var(top).param # Arrows ttk::label $f.tarrow -text [msgcat::mc {Arrow}] ttk::checkbutton $f.p1arrow -variable ${varname}(p1arrow) \ -text [msgcat::mc {Left}] -command "LineArrow $varname" ttk::checkbutton $f.p2arrow -variable ${varname}(p2arrow) \ -text [msgcat::mc {Right}] -command "LineArrow $varname" grid $f.tarrow $f.p1arrow $f.p2arrow -padx 2 -pady 2 -sticky w } # actions proc LineApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) line point $var(system) $var(sky) \ $var(x) $var(y) $var(x2) $var(y2) MarkerBaseLineApply $varname } # support proc LineArrow {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) line arrow $var(p1arrow) $var(p2arrow) } # callbacks proc LineCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "LineCoordCB" } MarkerAnalysisPlot2dSystem $varname MarkerBaseCoordCB $varname LineEditCB $varname } proc LineEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "LineEditCB" } MarkerBaseLineEditCB $varname set var(dist) [$var(frame) get marker $var(id) line length \ $var(dcoord) $var(dformat)] set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] } proc LineDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "LineDistCB" } set var(dist) [$var(frame) get marker $var(id) line length \ $var(dcoord) $var(dformat)] } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/load.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000024716 12622660614 016171� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MultiLoad {{layer {}} {mode {}}} { global ds9 global current global debug if {$debug(tcl,layout)} { puts stderr "MultiLoad" } if {$layer != {} || $mode != {}} { return } if {$current(frame) != {}} { if {![$current(frame) has fits]} { return } switch -- [$current(frame) get type] { base - 3d {CreateFrame} rgb {} } } else { CreateFrame return } # go into tile mode if more than one set cnt [llength $ds9(frames)] if {$cnt > 1 && $current(display) != "tile"} { set current(display) tile DisplayMode } } proc MultiLoadBase {} { global ds9 global current global debug if {$debug(tcl,layout)} { puts stderr "MultiLoadBase" } if {$current(frame) != {}} { if {![$current(frame) has fits]} { return } CreateFrame } else { CreateFrame return } # go into tile mode if more than one set cnt [llength $ds9(frames)] if {$cnt > 1 && $current(display) != "tile"} { set current(display) tile DisplayMode } } proc MultiLoadRGB {} { global ds9 global current global debug if {$debug(tcl,layout)} { puts stderr "MultiLoadRGB" } if {$current(frame) != {}} { if {![$current(frame) has fits]} { return } CreateRGBFrame } else { CreateRGBFrame return } # go into tile mode if more than one set cnt [llength $ds9(frames)] if {$cnt > 1 && $current(display) != "tile"} { set current(display) tile DisplayMode } } # used by backup proc ProcessLoad {{err 1}} { global current global loadParam if {[catch { switch -- $loadParam(load,type) { alloc - allocgz {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ \{$loadParam(file,fn)\} \ $loadParam(load,layer)} channel { fconfigure $loadParam(channel,name) -translation binary \ -encoding binary $current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(channel,name) \ $loadParam(load,layer) # clean up catch {close $loadParam(channel,name)} } mmap - mmapincr {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(load,layer)} smmap {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,header)\} \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(load,layer)} shared {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(shared,idtype) \ $loadParam(shared,id) \ $loadParam(load,layer)} sshared {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(shared,idtype) \ $loadParam(shared,hdr) \ $loadParam(shared,id) \ $loadParam(load,layer)} socket - socketgz {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(socket,id) \ $loadParam(load,layer)} var {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ \{$loadParam(file,name)\} \ $loadParam(load,type) \ $loadParam(var,name) \ $loadParam(load,layer)} photo {$current(frame) load $loadParam(file,type) \ $loadParam(file,mode) \ $loadParam(var,name) \{$loadParam(file,name)\} } } } rr]} { if {$err} { Error "[msgcat::mc {Unable to load}] $loadParam(file,type) $loadParam(file,mode) $loadParam(file,name)" } return 0 } # save loadParam if {$loadParam(load,layer) == {}} { switch -- [$current(frame) get type] { base - 3d {ProcessLoadSaveParams $current(frame)} rgb { switch -- $loadParam(file,mode) { {rgb image} - {rgb cube} {ProcessLoadSaveParams $current(frame)} default { ProcessLoadSaveParams \ "$current(frame)[$current(frame) get rgb channel]" } } } } } unset loadParam return 1 } proc ProcessLoadSaveParams {varname} { global loadParam global current switch $loadParam(file,mode) { slice - {mosaic wcs} - {mosaic iraf} { # special case global $varname if {[info exists $varname]} { set varname "$varname.[$current(frame) get fits count]" } } } global $varname if {[info exists $varname]} { unset $varname } array set $varname [array get loadParam] # always save absolute path upvar #0 $varname var if {[file pathtype $var(file,name)] == {relative}} { set var(file,name) [file join [pwd] $var(file,name)] } } proc StartLoad {} { SetWatchCursor } proc FinishLoadPre {} { global loadParam global current global threed UpdateWCS # generate grid so updatemenu is correct GridUpdateCurrent # generate contour so updatemenu is correct UpdateContourScale ContourUpdate # just in case, frame may have been deleted before FinishLoad during startup if {$current(frame) == {}} { return } # if header(s) were open, remove them DestroyHeader $current(frame) # Cube? if {[$current(frame) has fits cube]} { CubeDialog } } proc FinishLoadPost {} { UpdateDS9 UnsetWatchCursor } proc FinishLoad {} { FinishLoadPre FinishLoadPost } proc IsLocalFile {fn} { # strip any brackets set aa [string first "\[" $fn] if {$aa > 0} { set fn [string range $fn 0 [expr $aa-1]] } if {![file exists $fn]} { return 0 } if {![file isfile $fn]} { return 0 } if {[file isdirectory $fn]} { return 0 } if {[file readable $fn]} { return 1 } else { return 0 } } proc ConvertFitsFile {} { foreach t {Stdin ExternalFits GzipFile BZip2File CompressFile PackFile} { if {[$t]} { return } } } proc ConvertArrayFile {} { foreach t {Stdin GzipFile BZip2File CompressFile PackFile} { if {[$t]} { return } } } # File Types proc Stdin {} { global loadParam # find -, -[], -[foo] but not -abc if {[regexp -- {^-(\[.*)?$} $loadParam(file,name)]} { set loadParam(load,type) allocgz set loadParam(file,name) "stdin[string range $loadParam(file,name) 1 end]" set loadParam(file,fn) $loadParam(file,name) return 1 } elseif {[string range $loadParam(file,name) 0 4] == "stdin" || [string range $loadParam(file,name) 0 4] == "STDIN"} { set loadParam(load,type) allocgz set loadParam(file,name) "stdin[string range $loadParam(file,name) 5 end]" set loadParam(file,fn) $loadParam(file,name) return 1 } return 0 } proc BZip2File {} { global loadParam if { [regexp {(.*)\.bz2($|\[)} $loadParam(file,name) matched root] } { if {[catch {set ch [open "| bunzip2 < $root.bz2 " r]}]} { return 0 } set loadParam(load,type) channel set loadParam(channel,name) $ch return 1 } return 0 } proc CompressFile {} { global loadParam if {[regexp {(.*)\.Z($|\[)} $loadParam(file,name) matched root]} { if {[catch {set ch [open "| uncompress < $root.Z " r]}]} { return 0 } set loadParam(load,type) channel set loadParam(channel,name) $ch return 1 } return 0 } proc PackFile {} { global loadParam if {[regexp {(.*)\.z($|\[)} $loadParam(file,name) matched root]} { if {[catch {set ch [open "| pcat $root.z " r]}]} { return 0 } set loadParam(load,type) channel set loadParam(channel,name) $ch return 1 } return 0 } proc GzipFile {} { global loadParam set fn $loadParam(file,name) set id [string first "\[" $fn] if {$id > 0} { set fn [string range $fn 0 [expr $id-1]] } catch { set ch [open $fn r] fconfigure $ch -encoding binary -translation binary set bb [read $ch 2] close $ch binary scan $bb H4 cc if {$cc == {1f8b}} { set loadParam(load,type) allocgz set loadParam(file,fn) $loadParam(file,name) return 1 } } return 0 } proc ExternalFits {} { global loadParam global extFits foreach id [array names extFits] { if {[string match $id "$loadParam(file,name)"]} { regsub -all {\$filename} $extFits($id) "$loadParam(file,name)" \ result set cmd "| $result" if {[catch {set ch [open "$cmd" r]} err]} { Error "open $cmd failed: $err" return 0 } set loadParam(load,type) channel set loadParam(channel,name) $ch return 1 } } return 0 } # Preserve proc ProcessPreserveCmd {varname iname} { upvar $varname var upvar $iname i global ds9 global scale global panzoom global marker switch -- [string tolower [lindex $var $i]] { pan { incr i set panzoom(preserve) [FromYesNo [lindex $var $i]] PreservePan } marker - regions { incr i set marker(preserve) [FromYesNo [lindex $var $i]] MarkerPreserve } } } proc ProcessSendPreserveCmd {proc id param} { global scale global panzoom global marker switch -- [string tolower $param] { scale { # backward compatibility $proc $id "no\n" } pan {$proc $id [ToYesNo $panzoom(preserve)]} regions {$proc $id [ToYesNo $marker(preserve)]} } } # Update proc ProcessUpdateCmd {varname iname} { upvar $varname var upvar $iname i global current global ds9 if {$current(frame) == {}} { return } if {[lindex $var $i] != {} && [string range [lindex $var $i] 0 0] != {-}} { switch -- [string tolower [lindex $var $i]] { on - yes {set ds9(idletasks) 1} no - off {set ds9(idletasks) 0} now { if {[string is integer [lindex $var [expr $i+1]]]} { $current(frame) update now \ [lindex $var [expr $i+1]] \ [lindex $var [expr $i+2]] [lindex $var [expr $i+3]] \ [lindex $var [expr $i+4]] [lindex $var [expr $i+5]] incr i 5 } else { $current(frame) update now } } {} { $current(frame) update incr i -1 } default { $current(frame) update \ [lindex $var $i] \ [lindex $var [expr $i+1]] [lindex $var [expr $i+2]] \ [lindex $var [expr $i+3]] [lindex $var [expr $i+4]] incr i 4 } } } else { $current(frame) update incr i -1 } } ��������������������������������������������������saods9/ds9/library/macosx.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000002706 12464211203 016525� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MacOSXOpenDocEvent {fc} { global ds9 if {$ds9(event,opendoc) != {}} { StartLoad foreach f $ds9(event,opendoc) { MultiLoad LoadFitsFile $f {} {} FileLast fitsfbox $f } FinishLoad } } proc MacOSXPrintDocEvent {bye} { global ds9 if {$ds9(event,printdoc) != {}} { set fc 0 foreach f $ds9(event,printdoc) { RealizeDS9 StartLoad MultiLoad LoadFitsFile $f {} {} FileLast fitsfbox $f FinishLoad PostScript } if {$bye} { Quit } } } proc MacOSXGetLocale {} { return [macosx locale] } #proc MacOSXPrint {} { # global ds9 # # we need to be realized # RealizeDS9 # need the colorbar levels updated # UpdateColormapLevel # # if {[macosx pm print begin [winfo width $ds9(canvas)] [winfo height $ds9(canvas)] yes]} { # foreach f $ds9(frames) { # $f macosx print # } # colorbar macosx print # colorbarrgb macosx print # macosx pm print end # } #} #proc MacOSXPrintPre {} { # global ds9 # if {[macosx pm print begin [winfo width $ds9(canvas)] [winfo height $ds9(canvas)] no]} { # foreach f $ds9(frames) { # $f macosx print # } # colorbar macosx print # colorbarrgb macosx print # macosx pm print end # } #} #proc MacOSXPageSetup {} { # macosx pm pagesetup #} ����������������������������������������������������������saods9/ds9/library/magnifier.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000010561 12464211203 017172� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CreateMagnifier {} { global imagnifier global ds9 set ds9(magnifier) [canvas $ds9(panel).mag -width $imagnifier(size) \ -height $imagnifier(size) \ -relief groove \ -borderwidth 2 \ -highlightthickness 0 \ -insertofftime 0 \ -takefocus 0] $ds9(magnifier) create magnifier$ds9(visual) \ -width $imagnifier(size) \ -height $imagnifier(size) \ -command magnifier \ -tag magnifier \ -helvetica $ds9(helvetica) \ -courier $ds9(courier) \ -times $ds9(times) } proc MagnifierDef {} { global imagnifier global pmagnifier set imagnifier(size) 128 # prefs only set pmagnifier(cursor) 1 set pmagnifier(zoom) 4 set pmagnifier(region) 1 set pmagnifier(color) white } proc UpdateMagnifier {which x y} { global view if {$view(magnifier)} { $which magnifier update $x $y } } proc MagnifierFrameBackup {ch which} { global pmagnifier puts $ch "$which magnifier graphics $pmagnifier(region)" puts $ch "$which magnifier cursor $pmagnifier(cursor)" puts $ch "$which magnifier zoom $pmagnifier(zoom)" puts $ch "$which magnifier color $pmagnifier(color)" } # Prefs Cmds proc MagnifierRegion {} { global pmagnifier global ds9 foreach ff $ds9(frames) { $ff magnifier graphics $pmagnifier(region) } } proc MagnifierCursor {} { global pmagnifier global ds9 foreach ff $ds9(frames) { $ff magnifier cursor $pmagnifier(cursor) } } proc MagnifierZoom {} { global pmagnifier global ds9 foreach ff $ds9(frames) { $ff magnifier zoom $pmagnifier(zoom) } } proc MagnifierColor {} { global pmagnifier global ds9 foreach ff $ds9(frames) { $ff magnifier color $pmagnifier(color) } } # Prefs proc PrefsDialogMagnifier {} { global dprefs global pmagnifier set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Magnifier}] lappend dprefs(tabs) [ttk::frame $w.magnifier] set f [ttk::labelframe $w.magnifier.param -text [msgcat::mc {Magnifier}]] ttk::label $f.tshow -text [msgcat::mc {Show}] ttk::checkbutton $f.graphics -text [msgcat::mc {Graphics}] \ -variable pmagnifier(region) -command MagnifierRegion ttk::checkbutton $f.cursor -text [msgcat::mc {Cursor}] \ -variable pmagnifier(cursor) -command MagnifierCursor ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color pmagnifier color MagnifierColor ttk::label $f.tx -text [msgcat::mc {Magnification}] ttk::radiobutton $f.x1 -text {1x} \ -variable pmagnifier(zoom) -value 1 -command MagnifierZoom ttk::radiobutton $f.x2 -text {2x} \ -variable pmagnifier(zoom) -value 2 -command MagnifierZoom ttk::radiobutton $f.x4 -text {4x} \ -variable pmagnifier(zoom) -value 4 -command MagnifierZoom ttk::radiobutton $f.x8 -text {8x} \ -variable pmagnifier(zoom) -value 8 -command MagnifierZoom ttk::radiobutton $f.x16 -text {16x} \ -variable pmagnifier(zoom) -value 16 -command MagnifierZoom grid $f.tshow $f.graphics - $f.cursor - -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color - - -padx 2 -pady 2 -sticky w grid $f.tx $f.x1 $f.x2 $f.x4 $f.x8 $f.x16 -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } # Process Cmds proc ProcessMagnifierCmd {varname iname} { upvar $varname var upvar $iname i global pmagnifier global view switch -- [string tolower [lindex $var $i]] { color { incr i set pmagnifier(color) [lindex $var $i] MagnifierColor } zoom { incr i set pmagnifier(zoom) [lindex $var $i] MagnifierZoom } cursor { incr i set pmagnifier(cursor) [FromYesNo [lindex $var $i]] MagnifierCursor } region { incr i set pmagnifier(region) [FromYesNo [lindex $var $i]] MagnifierRegion } default { # backward compatibility set view(magnifier) 1 UpdateView incr i -1 } } } proc ProcessSendMagnifierCmd {proc id param} { global pmagnifier switch -- [string tolower [lindex $param 0]] { color {$proc $id "$pmagnifier(color)\n"} zoom {$proc $id "$pmagnifier(zoom)\n"} cursor {$proc $id [ToYesNo $pmagnifier(cursor)]} region {$proc $id [ToYesNo $pmagnifier(region)]} } } �����������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/Makefile�������������������������������������������������������������������������000644 �000765 �000000 �00000005547 12553467543 016220� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������SCRIPTS = \ 2mass.tcl \ 3d.tcl \ array.tcl \ analysis.tcl \ analysisparam.tcl \ annulus.tcl \ ar.tcl \ backup.tcl \ bin.tcl \ box.tcl \ boxannulus.tcl \ bpanda.tcl \ buttons.tcl \ cat.tcl \ catcds.tcl \ catcdssrch.tcl \ catcdssrchdialog.tcl \ catcmd.tcl \ catcxc.tcl \ catdialog.tcl \ catflt.tcl \ catmatch.tcl \ catned.tcl \ catopt.tcl \ catplot.tcl \ catreg.tcl \ catsdss.tcl \ catsimbad.tcl \ catskybot.tcl \ catsym.tcl \ cattsv.tcl \ catvot.tcl \ centroid.tcl \ circle.tcl \ colorbar.tcl \ comm.tcl \ command.tcl \ compass.tcl \ composite.tcl \ contour.tcl \ convert.tcl \ coord.tcl \ cpanda.tcl \ crop.tcl \ crosshair.tcl \ cube.tcl \ debug.tcl \ dialog.tcl \ ellipse.tcl \ ellipseannulus.tcl \ envi.tcl \ epanda.tcl \ error.tcl \ eso.tcl \ examine.tcl \ export.tcl \ external.tcl \ file.tcl \ fits.tcl \ frame.tcl \ graph.tcl \ grid.tcl \ group.tcl \ header.tcl \ help.tcl \ http.tcl \ hv.tcl \ hvform.tcl \ hvsup.tcl \ iis.tcl \ imexam.tcl \ imgsvr.tcl \ import.tcl \ info.tcl \ layout.tcl \ line.tcl \ load.tcl \ magnifier.tcl \ marker.tcl \ markeranalysispanda.tcl \ markeranalysisplot2d.tcl \ markeranalysisplot3d.tcl \ markeranalysisradial.tcl \ markeranalysisstats.tcl \ markerbase.tcl \ markerbaseannulus.tcl \ markerbaseannulusrect.tcl \ markerbasecenter.tcl \ markerbaseline.tcl \ markerbasepanda.tcl \ markerbasepandarect.tcl \ markerdialog.tcl \ mask.tcl \ manalysis.tcl \ mbin.tcl \ mcolor.tcl \ mecube.tcl \ medit.tcl \ menu.tcl \ mfile.tcl \ mframe.tcl \ mhelp.tcl \ macosx.tcl \ macosxextra.tcl \ mosaicimage.tcl \ mosaicimageiraf.tcl \ mosaicimagewcs.tcl \ mosaicimagewfpc2.tcl \ mosaic.tcl \ mosaiciraf.tcl \ mosaicwcs.tcl \ movie.tcl \ mregion.tcl \ mscale.tcl \ multiframe.tcl \ mview.tcl \ mwcs.tcl \ mzoom.tcl \ nameres.tcl \ nrrd.tcl \ nsvr.tcl \ nvss.tcl \ pagesetup.tcl \ panner.tcl \ panzoom.tcl \ pixel.tcl \ photo.tcl \ plot.tcl \ plotbar.tcl \ plotdialog.tcl \ plotelement.tcl \ plotline.tcl \ plotprint.tcl \ plotprocess.tcl \ plotscatter.tcl \ point.tcl \ polygon.tcl \ prefs.tcl \ prefsdialog.tcl \ print.tcl \ projection.tcl \ open.tcl \ rgb.tcl \ rgbarray.tcl \ rgbcube.tcl \ rgbimage.tcl \ ruler.tcl \ samp.tcl \ sao.tcl \ save.tcl \ saveimage.tcl \ scale.tcl \ segment.tcl \ sfits.tcl \ shm.tcl \ skyview.tcl \ slider.tcl \ smosaic.tcl \ smosaiciraf.tcl \ smosaicwcs.tcl \ smooth.tcl \ source.tcl \ srgbcube.tcl \ starbase.tcl \ stdfbox.tcl \ stsci.tcl \ template.tcl \ text.tcl \ tkfbox.tcl \ url.tcl \ util.tcl \ var.tcl \ vector.tcl \ vla.tcl \ vo.tcl \ wcs.tcl \ win32.tcl \ xmfbox.tcl \ xpa.tcl msgs : FORCE grep 'msgcat::mc' $(SCRIPTS) | cut -d[ -f2 | sed -e 's/::mc/::mcset AAA /' -e 's/]/ ""/' | sort | uniq > ../msgs/tmpl.tcl clean : FORCE $(RM) core *~ *# distclean : clean FORCE : ���������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/manalysis.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000054763 12632117565 017262� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc AnalysisMainMenu {} { global ds9 # WARNING: this is a variable length menu. # Be sure to update ds9(menu,size,analysis) menu $ds9(mb).analysis # IME # $ds9(mb).analysis add cascade -label [msgcat::mc {Task}] # -menu $ds9(mb).analysis.task # $ds9(mb).analysis add separator $ds9(mb).analysis add command -label "[msgcat::mc {Pixel Table}]..." \ -command PixelTableDialog $ds9(mb).analysis add command -label "[msgcat::mc {Mask Parameters}]..." \ -command MaskDialog $ds9(mb).analysis add separator $ds9(mb).analysis add checkbutton -label [msgcat::mc {Contours}] \ -variable contour(view) -command ContourUpdate $ds9(mb).analysis add command -label "[msgcat::mc {Contour Parameters}]..."\ -command ContourDialog $ds9(mb).analysis add separator $ds9(mb).analysis add checkbutton -label [msgcat::mc {Coordinate Grid}] \ -variable grid(view) -command GridUpdateCurrent $ds9(mb).analysis add command \ -label "[msgcat::mc {Coordinate Grid Parameters}]..." \ -command GridDialog $ds9(mb).analysis add separator $ds9(mb).analysis add cascade -label [msgcat::mc {Block}] \ -menu $ds9(mb).analysis.block $ds9(mb).analysis add command -label "[msgcat::mc {Block Parameters}]..."\ -command BlockDialog $ds9(mb).analysis add separator $ds9(mb).analysis add checkbutton -label [msgcat::mc {Smooth}] \ -variable smooth(view) -command SmoothUpdate $ds9(mb).analysis add command -label "[msgcat::mc {Smooth Parameters}]..." \ -command SmoothDialog $ds9(mb).analysis add separator $ds9(mb).analysis add command \ -label "[msgcat::mc {Crosshair Parameters}]..." \ -command CrosshairDialog $ds9(mb).analysis add separator $ds9(mb).analysis add command -label "[msgcat::mc {Name Resolution}]..." \ -command NRESDialog $ds9(mb).analysis add separator $ds9(mb).analysis add cascade -label [msgcat::mc {Image Servers}] \ -menu $ds9(mb).analysis.image $ds9(mb).analysis add cascade -label [msgcat::mc {Archives}] \ -menu $ds9(mb).analysis.arch $ds9(mb).analysis add cascade -label [msgcat::mc {Catalogs}] \ -menu $ds9(mb).analysis.cat $ds9(mb).analysis add separator $ds9(mb).analysis add command -label "[msgcat::mc {Catalog Tool}]..." \ -command CATTool $ds9(mb).analysis add command -label "[msgcat::mc {Line Plot Tool}]..." \ -command PlotLineTool $ds9(mb).analysis add command -label "[msgcat::mc {Bar Plot Tool}]..." \ -command PlotBarTool $ds9(mb).analysis add command -label "[msgcat::mc {Scatter Plot Tool}]..." \ -command PlotScatterTool $ds9(mb).analysis add separator $ds9(mb).analysis add command \ -label "[msgcat::mc {Virtual Observatory}]..."\ -command VODialog $ds9(mb).analysis add command -label "[msgcat::mc {Web Browser}]..." \ -command {HV web Web {}} $ds9(mb).analysis add separator $ds9(mb).analysis add checkbutton \ -label [msgcat::mc {Analysis Command Log}] \ -variable panalysis(log) $ds9(mb).analysis add separator $ds9(mb).analysis add command \ -label "[msgcat::mc {Load Analysis Commands}]..." \ -command OpenAnalysisMenu $ds9(mb).analysis add command \ -label [msgcat::mc {Clear Analysis Commands}] \ -command ClearAnalysisMenu menu $ds9(mb).analysis.task $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Statistics}] \ -variable ime(task) -value stats -command IMEChangeTask $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Histogram}] \ -variable ime(task) -value hist -command IMEChangeTask $ds9(mb).analysis.task add radiobutton \ -label [msgcat::mc {Radial Profile}] \ -variable ime(task) -value radial -command IMEChangeTask $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Plot 2D}] \ -variable ime(task) -value plot2d -command IMEChangeTask $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Plot 3D}] \ -variable ime(task) -value plot3d -command IMEChangeTask $ds9(mb).analysis.task add separator $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Circle}] \ -variable ime(shape) -value circle -command IMEChangeShape $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Ellipse}] \ -variable ime(shape) -value ellipse -command IMEChangeShape $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Box}] \ -variable ime(shape) -value box -command IMEChangeShape $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Polygon}] \ -variable ime(shape) -value polygon -command IMEChangeShape $ds9(mb).analysis.task add separator $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Point}] \ -variable ime(shape) -value point -command IMEChangeShape $ds9(mb).analysis.task add separator $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Annulus}] \ -variable ime(shape) -value annulus -command IMEChangeShape $ds9(mb).analysis.task add radiobutton \ -label [msgcat::mc {Ellipse Annulus}] \ -variable ime(shape) -value ellipseannulus -command IMEChangeShape $ds9(mb).analysis.task add radiobutton -label [msgcat::mc {Box Annulus}] \ -variable ime(shape) -value boxannulus -command IMEChangeShape menu $ds9(mb).analysis.block $ds9(mb).analysis.block add command -label [msgcat::mc {Block In}] \ -command {Block .5 .5} $ds9(mb).analysis.block add command -label [msgcat::mc {Block Out}] \ -command {Block 2 2} $ds9(mb).analysis.block add command -label [msgcat::mc {Block Fit}] \ -command BlockToFit $ds9(mb).analysis.block add separator $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 1" \ -variable block(factor) -value { 1 1 } -command ChangeBlock $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 2" \ -variable block(factor) -value { 2 2 } -command ChangeBlock $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 4" \ -variable block(factor) -value { 4 4 } -command ChangeBlock $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 8" \ -variable block(factor) -value { 8 8 } -command ChangeBlock $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 16" \ -variable block(factor) -value { 16 16 } -command ChangeBlock $ds9(mb).analysis.block add radiobutton -label "[msgcat::mc {Block}] 32" \ -variable block(factor) -value { 32 32 } -command ChangeBlock menu $ds9(mb).analysis.image $ds9(mb).analysis.image add command \ -label {SAO-DSS} -command SAODialog $ds9(mb).analysis.image add command \ -label {ESO-DSS I/II} -command ESODialog $ds9(mb).analysis.image add command \ -label {STSCI-DSS I/II} -command STSCIDialog $ds9(mb).analysis.image add command \ -label {IPAC-2MASS} -command 2MASSDialog $ds9(mb).analysis.image add command \ -label {NRAO-VLA} -command VLADialog $ds9(mb).analysis.image add command \ -label {NRAO-NVSS} -command NVSSDialog $ds9(mb).analysis.image add command \ -label {HEASARC-SkyView} -command SkyViewDialog menu $ds9(mb).analysis.cat $ds9(mb).analysis.cat add command \ -label [msgcat::mc {Search for Catalogs}] \ -command "CATCDSSrchDialog catcdssrch1" $ds9(mb).analysis.cat add command -label [msgcat::mc {Clear All}] \ -command CATClearFrame $ds9(mb).analysis.cat add command -label [msgcat::mc {Match}] \ -command CATMatchFrame $ds9(mb).analysis.cat add separator CATCatalogMenu # Analysis Archive Menu menu $ds9(mb).analysis.arch $ds9(mb).analysis.arch add command -label {HCO DASCHE} \ -command HVArchDASCHE $ds9(mb).analysis.arch add command -label {NVO Image Mosaic Service} \ -command HVArchMontage $ds9(mb).analysis.arch add separator $ds9(mb).analysis.arch add cascade -label {Chandra} \ -menu $ds9(mb).analysis.arch.chandra $ds9(mb).analysis.arch add command -label {ROSAT All-Sky (MPE/MPG)} \ -command HVArchRosat $ds9(mb).analysis.arch add separator $ds9(mb).analysis.arch add command -label {NVSS (NRAO)} \ -command HVArchNVSS $ds9(mb).analysis.arch add command -label {4MASS (NRAO)} \ -command HVArch4MASS $ds9(mb).analysis.arch add command -label {SIRTF FLS/VLA (NRAO)} \ -command HVArchSIRTF $ds9(mb).analysis.arch add command -label {VLA First (LLNL)} \ -command HVArchFirst $ds9(mb).analysis.arch add command -label {VLA Stripe82 (LLNL)} \ -command HVArchStripe82 # $ds9(mb).analysis.arch add separator # $ds9(mb).analysis.arch add command # -label {AKARI Far-infrared All-Sky (ISAS/JAXA)} -command HVArchAKARI menu $ds9(mb).analysis.arch.chandra $ds9(mb).analysis.arch.chandra add command \ -label {Chaser (NASA/SAO)} -command HVArchChandraChaser $ds9(mb).analysis.arch.chandra add command \ -label {Fast Image (NASA/SAO)} -command HVArchChandraPop $ds9(mb).analysis.arch.chandra add command \ -label {Public FTP (SAO)} -command HVArchChandraFTP menu $ds9(mb).analysis.arch.simbad $ds9(mb).analysis.arch.simbad add command -label {SAO} \ -command HVArchSIMBADSAO $ds9(mb).analysis.arch.simbad add command -label {CDS} \ -command HVArchSIMBADCDS menu $ds9(mb).analysis.arch.ads $ds9(mb).analysis.arch.ads add command -label {SAO} \ -command HVArchADSSAO $ds9(mb).analysis.arch.ads add command -label {CDS} \ -command HVArchADSCDS } proc PrefsDialogAnalysisMenu {w} { global ds9 set f [ttk::labelframe $w.manalysis -text [msgcat::mc {Analysis}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarAnalysis $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m # IME # $m add cascade -label [msgcat::mc {Task}] # -menu $m.task # $m add separator $m add checkbutton -label [msgcat::mc {Contours}] \ -variable pcontour(view) $m add checkbutton -label [msgcat::mc {Coordinate Grid}] \ -variable pgrid(view) $m add separator $m add cascade -label [msgcat::mc {Block}] \ -menu $m.block $m add checkbutton -label [msgcat::mc {Smooth}] \ -variable psmooth(view) menu $m.task $m.task add radiobutton -label [msgcat::mc {Statistics}] \ -variable pime(task) -value stats $m.task add radiobutton -label [msgcat::mc {Histogram}] \ -variable pime(task) -value hist $m.task add radiobutton -label [msgcat::mc {Radial Profile}] \ -variable pime(task) -value radial $m.task add radiobutton -label [msgcat::mc {Plot 2D}] \ -variable pime(task) -value plot2d $m.task add radiobutton -label [msgcat::mc {Plot 3D}] \ -variable pime(task) -value plot3d menu $m.block $m.block add radiobutton -label "[msgcat::mc {Block}] 1" \ -variable pblock(factor) -value { 1 1 } $m.block add radiobutton -label "[msgcat::mc {Block}] 2" \ -variable pblock(factor) -value { 2 2 } $m.block add radiobutton -label "[msgcat::mc {Block}] 4" \ -variable pblock(factor) -value { 4 4 } $m.block add radiobutton -label "[msgcat::mc {Block}] 8" \ -variable pblock(factor) -value { 8 8 } $m.block add radiobutton -label "[msgcat::mc {Block}] 16" \ -variable pblock(factor) -value { 16 16 } $m.block add radiobutton -label "[msgcat::mc {Block}] 32" \ -variable pblock(factor) -value { 32 32 } pack $f -side top -fill both -expand true } # Buttons proc ButtonsAnalysisDef {} { global pbuttons array set pbuttons { analysis,contours 1 analysis,grid 1 analysis,smooth 1 analysis,bin 1 analysis,bout 1 analysis,bfit 1 analysis,b1 1 analysis,b2 1 analysis,b4 1 analysis,b8 0 analysis,b16 0 analysis,b32 0 } # IME # analysis,none 1 # analysis,stats 1 # analysis,hist 1 # analysis,radial 1 # analysis,plot2d 1 # analysis,plot3d 1 } proc CreateButtonsAnalysis {} { global buttons global ds9 ttk::frame $ds9(buttons).analysis # IME # RadioButton $ds9(buttons).analysis.stats # [string tolower [msgcat::mc {Stats}]] # ime(task) stats IMEChangeTask # RadioButton $ds9(buttons).analysis.hist # [string tolower [msgcat::mc {Histogram}]] # ime(task) hist IMEChangeTask # RadioButton $ds9(buttons).analysis.radial # [string tolower [msgcat::mc {Radial}]] # ime(task) radial IMEChangeTask # RadioButton $ds9(buttons).analysis.plot2d # [string tolower [msgcat::mc {Plot 2D}]] # ime(task) plot2d IMEChangeTask # RadioButton $ds9(buttons).analysis.plot3d # [string tolower [msgcat::mc {Plot 3D}]] # ime(task) plot3d IMEChangeTask CheckButton $ds9(buttons).analysis.contours \ [string tolower [msgcat::mc {Contours}]] \ contour(view) ContourUpdate CheckButton $ds9(buttons).analysis.grid \ [string tolower [msgcat::mc {Grid}]] \ grid(view) GridUpdateCurrent ButtonButton $ds9(buttons).analysis.bin \ [string tolower [msgcat::mc {Block In}]] {Block .5 .5} ButtonButton $ds9(buttons).analysis.bout \ [string tolower [msgcat::mc {Block Out}]] {Block 2 2} ButtonButton $ds9(buttons).analysis.bfit \ [string tolower [msgcat::mc {Block Fit}]] BlockToFit RadioButton $ds9(buttons).analysis.b1 \ "[string tolower [msgcat::mc {Block}]] 1" \ block(factor) { 1 1 } ChangeBlock RadioButton $ds9(buttons).analysis.b2 \ "[string tolower [msgcat::mc {Block}]] 2" \ block(factor) { 2 2 } ChangeBlock RadioButton $ds9(buttons).analysis.b4 \ "[string tolower [msgcat::mc {Block}]] 4" \ block(factor) { 4 4 } ChangeBlock RadioButton $ds9(buttons).analysis.b8 \ "[string tolower [msgcat::mc {Block}]] 8" \ block(factor) { 8 8 } ChangeBlock RadioButton $ds9(buttons).analysis.b16 \ "[string tolower [msgcat::mc {Block}]] 16" \ block(factor) { 16 16 } ChangeBlock RadioButton $ds9(buttons).analysis.b32 \ "[string tolower [msgcat::mc {Block}]] 32" \ block(factor) { 32 32 } ChangeBlock CheckButton $ds9(buttons).analysis.smooth \ [string tolower [msgcat::mc {Smooth}]] \ smooth(view) SmoothUpdate set buttons(analysis) " $ds9(buttons).analysis.contours pbuttons(analysis,contours) $ds9(buttons).analysis.grid pbuttons(analysis,grid) $ds9(buttons).analysis.bin pbuttons(analysis,bin) $ds9(buttons).analysis.bout pbuttons(analysis,bout) $ds9(buttons).analysis.bfit pbuttons(analysis,bfit) $ds9(buttons).analysis.b1 pbuttons(analysis,b1) $ds9(buttons).analysis.b2 pbuttons(analysis,b2) $ds9(buttons).analysis.b4 pbuttons(analysis,b4) $ds9(buttons).analysis.b8 pbuttons(analysis,b8) $ds9(buttons).analysis.b16 pbuttons(analysis,b16) $ds9(buttons).analysis.b32 pbuttons(analysis,b32) $ds9(buttons).analysis.smooth pbuttons(analysis,smooth) " # IME # $ds9(buttons).analysis.stats pbuttons(analysis,stats) # $ds9(buttons).analysis.hist pbuttons(analysis,hist) # $ds9(buttons).analysis.radial pbuttons(analysis,radial) # $ds9(buttons).analysis.plot2d pbuttons(analysis,plot2d) # $ds9(buttons).analysis.plot3d pbuttons(analysis,plot3d) } proc PrefsDialogButtonbarAnalysis {f} { global ds9 global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m # IME # $m add checkbutton -label [msgcat::mc {Statistics}] # -variable pbuttons(analysis,stats) # -command {UpdateButtons buttons(analysis)} # $m add checkbutton -label [msgcat::mc {Histogram}] # -variable pbuttons(analysis,hist) # -command {UpdateButtons buttons(analysis)} # $m add checkbutton -label [msgcat::mc {Radial Profile}] # -variable pbuttons(analysis,radial) # -command {UpdateButtons buttons(analysis)} # $m add checkbutton -label [msgcat::mc {Plot 2D}] # -variable pbuttons(analysis,plot2d) # -command {UpdateButtons buttons(analysis)} # $m add checkbutton -label [msgcat::mc {Plot 3D}] # -variable pbuttons(analysis,plot3d) # -command {UpdateButtons buttons(analysis)} # $m add separator $m add checkbutton -label [msgcat::mc {Contours}] \ -variable pbuttons(analysis,contours) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label [msgcat::mc {Grid}] \ -variable pbuttons(analysis,grid) \ -command {UpdateButtons buttons(analysis)} $m add separator $m add checkbutton -label [msgcat::mc {Block In}] \ -variable pbuttons(analysis,bin) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label [msgcat::mc {Block Out}] \ -variable pbuttons(analysis,bout) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label [msgcat::mc {Block Fit}] \ -variable pbuttons(analysis,bfit) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 1" \ -variable pbuttons(analysis,b1) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 2" \ -variable pbuttons(analysis,b2) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 4" \ -variable pbuttons(analysis,b4) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 8" \ -variable pbuttons(analysis,b8) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 16" \ -variable pbuttons(analysis,b16) \ -command {UpdateButtons buttons(analysis)} $m add checkbutton -label "[msgcat::mc {Block}] 32" \ -variable pbuttons(analysis,b32) \ -command {UpdateButtons buttons(analysis)} $m add separator $m add checkbutton -label [msgcat::mc {Smooth}] \ -variable pbuttons(analysis,smooth) \ -command {UpdateButtons buttons(analysis)} } proc UpdateAnalysisMenuStatic {} { global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateAnalysisMenuStatic" } if {$ds9(active,num) > 0} { $ds9(mb) entryconfig [msgcat::mc {Analysis}] -state normal } else { $ds9(mb) entryconfig [msgcat::mc {Analysis}] -state disabled } } proc UpdateAnalysisMenu {} { global ds9 global current global ianalysis global debug if {$debug(tcl,update)} { puts stderr "UpdateAnalysisMenu" } if {$current(frame) != {}} { for {set ii 0} {$ii<$ianalysis(menu,count)} {incr ii} { if {[$current(frame) has fits]} { set fn [$current(frame) get fits file name 1] } else { set fn {none} } # disable by default $ianalysis(menu,$ii,parent) entryconfig $ianalysis(menu,$ii,item) \ -state disabled foreach tt $ianalysis(menu,$ii,template) { if {[regexp ".$tt" $fn]} { $ianalysis(menu,$ii,parent) entryconfig \ $ianalysis(menu,$ii,item) -state normal break } } } } } proc PrefsDialogAnalysis {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Analysis}] lappend dprefs(tabs) [ttk::frame $w.analysis] set f [ttk::labelframe $w.analysis.file \ -text [msgcat::mc {Analysis File}]] ttk::checkbutton $f.auto -text [msgcat::mc {Autoload}] \ -variable panalysis(autoload) ttk::entry $f.pre -textvariable panalysis(user) -width 60 ttk::button $f.browse -text [msgcat::mc {Browse}] \ -command "AnalysisPrefOpen panalysis(user)" ttk::entry $f.pre2 -textvariable panalysis(user2) -width 60 ttk::button $f.browse2 -text [msgcat::mc {Browse}] \ -command "AnalysisPrefOpen panalysis(user2)" ttk::entry $f.pre3 -textvariable panalysis(user3) -width 60 ttk::button $f.browse3 -text [msgcat::mc {Browse}] \ -command "AnalysisPrefOpen panalysis(user3)" ttk::entry $f.pre4 -textvariable panalysis(user4) -width 60 ttk::button $f.browse4 -text [msgcat::mc {Browse}] \ -command "AnalysisPrefOpen panalysis(user4)" grid $f.auto -padx 2 -pady 2 -sticky w grid $f.pre $f.browse -padx 2 -pady 2 -sticky w grid $f.pre2 $f.browse2 -padx 2 -pady 2 -sticky w grid $f.pre3 $f.browse3 -padx 2 -pady 2 -sticky w grid $f.pre4 $f.browse4 -padx 2 -pady 2 -sticky w set f [ttk::labelframe $w.analysis.log -text [msgcat::mc {Analysis Log}]] ttk::checkbutton $f.log -text [msgcat::mc {Show Command}] \ -variable panalysis(log) grid $f.log -padx 2 -pady 2 -sticky w pack $w.analysis.file $w.analysis.log -side top -fill both -expand true } # Support proc UpdateTaskMenu {} { global ds9 global ime switch $ime(task) { stats - hist { $ds9(mb).analysis.task entryconfig [msgcat::mc {Circle}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Box}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Polygon}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Point}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Box Annulus}] \ -state disabled } radial { $ds9(mb).analysis.task entryconfig [msgcat::mc {Circle}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Box}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Polygon}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Point}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Annulus}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse Annulus}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Box Annulus}] \ -state normal } plot2d { $ds9(mb).analysis.task entryconfig [msgcat::mc {Circle}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Box}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Polygon}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Point}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Box Annulus}] \ -state disabled } plot3d { $ds9(mb).analysis.task entryconfig [msgcat::mc {Circle}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Box}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Polygon}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Point}] \ -state normal $ds9(mb).analysis.task entryconfig [msgcat::mc {Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Ellipse Annulus}] \ -state disabled $ds9(mb).analysis.task entryconfig [msgcat::mc {Box Annulus}] \ -state disabled } } } �������������saods9/ds9/library/marker.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000131546 12606000674 016527� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerDef {} { global marker global imarker global pmarker set imarker(id) -1 set imarker(x) -1 set imarker(y) -1 set imarker(motion) none set imarker(handle) -1 set imarker(prefix,dialog) {mkr} set imarker(prefix,plot3d) {plot3d} set imarker(prefix,plot2d) {plot2d} set imarker(prefix,stats) {stats} set imarker(prefix,radial) {radial} set imarker(prefix,panda) {panda} set imarker(prefix,histogram) {hist} set marker(show) 1 set marker(show,text) 1 set marker(centroid,auto) 0 set marker(centroid,iteration) 30 set marker(centroid,radius) 10 set marker(shape) circle set marker(color) green set marker(dashlist) {8 3} set marker(width) 1 set marker(dash) 0 set marker(fixed) 0 set marker(edit) 1 set marker(move) 1 set marker(rotate) 1 set marker(delete) 1 set marker(include) 1 set marker(source) 1 set marker(font) helvetica set marker(font,size) 10 set marker(font,weight) normal set marker(font,slant) roman set marker(preserve) 0 set marker(plot2d) 0 set marker(plot3d) 0 set marker(stats) 0 set marker(copy) {} set marker(copy,system) {} set marker(maxdialog) 48 set marker(load) current set marker(format) ds9 # these are only used for save/load/list and are set from current wcs values set marker(system) physical set marker(sky) fk5 set marker(skyformat) degrees set marker(strip) 0 array set pmarker [array get marker] unset pmarker(copy) unset pmarker(copy,system) unset pmarker(maxdialog) unset pmarker(load) unset pmarker(system) unset pmarker(sky) unset pmarker(skyformat) unset pmarker(strip) set pmarker(epsilon) 3 set pmarker(dformat) degrees set pmarker(circle,radius) 20 set pmarker(annulus,inner) 15 set pmarker(annulus,outer) 30 set pmarker(annulus,annuli) 1 set pmarker(panda,inner) 15 set pmarker(panda,outer) 30 set pmarker(panda,annuli) 1 set pmarker(panda,ang1) 0 set pmarker(panda,ang2) 360 set pmarker(panda,angnum) 4 set pmarker(ellipse,radius1) 40 set pmarker(ellipse,radius2) 20 set pmarker(ellipseannulus,radius1) 40 set pmarker(ellipseannulus,radius2) 20 set pmarker(ellipseannulus,radius3) 60 set pmarker(ellipseannulus,annuli) 1 set pmarker(epanda,radius1) 40 set pmarker(epanda,radius2) 20 set pmarker(epanda,radius3) 60 set pmarker(epanda,annuli) 1 set pmarker(epanda,ang1) 0 set pmarker(epanda,ang2) 360 set pmarker(epanda,angnum) 4 set pmarker(box,radius1) 80 set pmarker(box,radius2) 40 set pmarker(boxannulus,radius1) 80 set pmarker(boxannulus,radius2) 40 set pmarker(boxannulus,radius3) 120 set pmarker(boxannulus,annuli) 1 set pmarker(bpanda,radius1) 80 set pmarker(bpanda,radius2) 40 set pmarker(bpanda,radius3) 120 set pmarker(bpanda,annuli) 1 set pmarker(bpanda,ang1) 0 set pmarker(bpanda,ang2) 360 set pmarker(bpanda,angnum) 4 set pmarker(compass,radius) 40 set pmarker(polygon,width) 20 set pmarker(polygon,height) 20 set pmarker(projection,thick) 0 set pmarker(point,size) 11 set pmarker(segment,length) 20 } # procs shared between region and catalog mode proc MarkerControl {which x y} { global imarker global current # if nothing is loaded, abort if {![$which has fits]} { return } # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set id [$which get marker $current(mode) id $x $y] if {$id} { # are we on a selected annulus? if {[$which get marker $current(mode) select $x $y] == $id} { switch -- [$which get marker $current(mode) $id type] { annulus { set imarker(handle) \ [$which marker $current(mode) $id create annulus radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } panda { set imarker(handle) \ [$which marker $current(mode) $id create panda radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } ellipseannulus { set imarker(handle) \ [$which marker $current(mode) $id create ellipseannulus radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } epanda { set imarker(handle) \ [$which marker $current(mode) $id create epanda radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } boxannulus { set imarker(handle) \ [$which marker $current(mode) $id create boxannulus radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } bpanda { set imarker(handle) \ [$which marker $current(mode) $id create bpanda radius $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } } } } } proc MarkerControlShift {which x y} { global imarker global current # if nothing is loaded, abort if {![$which has fits]} { return } # we need this cause MarkerMotion maybe called, # and we don't want it set imarker(motion) none set imarker(handle) -1 set id [$which get marker $current(mode) id $x $y] if {$id} { # are we on a selected annulus? if {[$which get marker $current(mode) select $x $y] == $id} { switch -- [$which get marker $current(mode) $id type] { panda { set imarker(handle) \ [$which marker $current(mode) $id create panda angle $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } epanda { set imarker(handle) \ [$which marker $current(mode) $id create epanda angle $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } bpanda { set imarker(handle) \ [$which marker $current(mode) $id create bpanda angle $x $y] $which marker $current(mode) $id edit begin $imarker(handle) set imarker(motion) edit } } } } } proc MarkerCursor {which x y handleCursor overCursor} { global current # if nothing is loaded, abort if {![$which has fits]} { return } # are we over any selected marker handles? # remember, handles are outside of a marker set h [$which get marker $current(mode) handle $x $y] set id [lindex $h 0] set handle [lindex $h 1] if {$handle} { if {$handle < 5} { # edit/rotate handle SetCursor $handleCursor } else { # polygon/segment/annulus vertex SetCursor dotbox } return } # else, see if we are on a segement of a polygon/segment set h [$which get marker $current(mode) polygon segment $x $y] if {[lindex $h 0]} { SetCursor draped_box return } set h [$which get marker $current(mode) segment segment $x $y] if {[lindex $h 0]} { SetCursor draped_box return } # are we over a marker? set id [$which get marker $current(mode) select $x $y] if {$id} { # are we on a selected annulus and control key down? switch -- [$which get marker $current(mode) $id type] { annulus - panda - ellipseannulus - epanda - boxannulus - bpanda {SetCursor $overCursor} default {SetCursor fleur} } return } # else, set no cursor SetCursor {} } proc MarkerArrowKey {which x y} { global current $which warp $x $y $which marker $current(mode) move $x $y } # Marker only proc MarkerButton {which x y} { global marker global imarker global itemplate global ds9 # if nothing is loaded, abort if {![$which has fits]} { return } # see if we are on a handle set h [$which get marker handle $x $y] set id [lindex $h 0] set imarker(handle) [lindex $h 1] if {$imarker(handle)} { $which marker $id edit begin $imarker(handle) set imarker(motion) beginEdit return } # else, see if we are on a segment of a polygon set h [$which get marker polygon segment $x $y] set id [lindex $h 0] set segment [lindex $h 1] if {$segment} { $which marker $id create polygon vertex $segment $x $y $which marker $id edit begin $imarker(handle) set imarker(handle) [expr 4+$segment+1] set imarker(motion) beginEdit return } # else, see if we are on a segment of a segment set h [$which get marker segment segment $x $y] set id [lindex $h 0] set segment [lindex $h 1] if {$segment} { $which marker $id create segment vertex $segment $x $y $which marker $id edit begin $imarker(handle) set imarker(handle) [expr 4+$segment+1] set imarker(motion) beginEdit return } # else, see if we are on a marker if {[$which get marker id $x $y]} { $which marker select only $x $y $which marker move begin $x $y set imarker(motion) beginMove UpdateRegionMenu return } # see if any markers are selected if {[$which get marker select number]>0} { $which marker unselect all set imarker(motion) none UpdateRegionMenu return } # else, create a marker set imarker(handle) 0 set imarker(motion) none switch -- $marker(shape) { circle - annulus - panda - ellipse - ellipseannulus - epanda - box - boxannulus - bpanda - polygon - line - vector - projection - segment - text - ruler - compass - {circle point} - {box point} - {diamond point} - {cross point} - {x point} - {arrow point} - {boxcircle point} {MarkerCreateShape $which $x $y} default { set fn "$ds9(root)/template/$itemplate($marker(shape))" set ch [open $fn r] global vardata set vardata [read $ch] close $ch $which marker create template var vardata $x $y } } } proc MarkerShift {which x y} { global imarker # if nothing is loaded, abort if {![$which has fits]} { return } # see if we are on a handle set h [$which get marker handle $x $y] set id [lindex $h 0] set imarker(handle) [lindex $h 1] if {$imarker(handle)} { $which marker $id rotate begin set imarker(motion) beginRotate return } # else, see if we are on a marker if {[$which marker select toggle $x $y]} { UpdateRegionMenu $which marker move begin $x $y set imarker(motion) beginMove return } # else, start a region select $which region select begin $x $y set imarker(motion) shiftregion } proc MarkerMotion {which x y} { global imarker # if nothing is loaded, abort if {![$which has fits]} { return } switch -- $imarker(motion) { none {} beginCreate - create { $which marker edit motion $x $y $imarker(handle) set imarker(motion) create } beginMove - move { $which marker move motion $x $y set imarker(motion) move } beginEdit - edit { $which marker edit motion $x $y $imarker(handle) set imarker(motion) edit } beginRotate - rotate { $which marker rotate motion $x $y $imarker(handle) set imarker(motion) rotate } region - shiftregion {$which region select motion $x $y} } } proc MarkerRelease {which x y} { global marker global imarker global current # if nothing is loaded, abort if {![$which has fits]} { return } switch -- $imarker(motion) { none {} beginCreate { # the user has just clicked, so resize to make visible or delete # assumes imarker(id) from create $which marker edit end MarkerDefault $which if {$imarker(id)>=0} { if {$marker(centroid,auto)} { $which marker centroid $imarker(id) } MarkerReleaseCB $which } set imarker(id) -1 set imarker(x) -1 set imarker(y) -1 } create { $which marker edit end # determine if this is an accident and just create the default set diffx [expr $x-$imarker(x)] set diffy [expr $y-$imarker(y)] if {[expr sqrt($diffx*$diffx + $diffy*$diffy)]<2} { MarkerDefault $which } if {$imarker(id)>=0} { if {$marker(centroid,auto)} { $which marker centroid $imarker(id) } MarkerReleaseCB $which } set imarker(id) -1 set imarker(x) -1 set imarker(y) -1 } beginMove - beginRotate {} beginEdit {} move { $which marker move end if {$marker(centroid,auto)} { $which marker centroid } } edit { $which marker edit end if {$marker(centroid,auto)} { $which marker centroid } } rotate { $which marker rotate end if {$marker(centroid,auto)} { $which marker centroid } } region {$which region select end} shiftregion {$which region select shift end} } set imarker(motion) none set imarker(handle) -1 } proc MarkerReleaseCB {which} { global marker global imarker global current # special callbacks switch [$which get marker $imarker(id) type] { projection {MarkerAnalysisPlot2d $which $imarker(id) 1} line - vector { if {$marker(plot2d)} { MarkerAnalysisPlot2d $which $imarker(id) 1 } } circle - ellipse - box - polygon - point { if {$marker(plot3d)} { MarkerAnalysisPlot3d $which $imarker(id) 1 } if {$marker(stats)} { MarkerAnalysisStats $which $imarker(id) 1 } } } } proc MarkerDouble {which x y} { global imarker # if nothing is loaded, abort if {![$which has fits]} { return } set id [$which get marker id $x $y] if {$id} { if {[$which get marker $id PROPERTY SELECT]} { MarkerDialog $which $id switch [$which get marker $id type] { projection - line - vector - circle - ellipse - box - polygon - point { set vvarname proj${id}${which} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } } } } } proc MarkerCreateShape {which x y} { global marker global imarker global pmarker global current global wcs # for compass/ruler global ed set ed(system) $wcs(system) set ed(sky) $wcs(sky) set ed(format) degrees AdjustCoordSystem ed system set cmd "$which marker create $marker(shape) $x $y" switch -- $marker(shape) { circle {append cmd " 0"} annulus {append cmd " .001 .002 $pmarker(annulus,annuli)"} panda {append cmd " $pmarker(panda,ang1) $pmarker(panda,ang2) $pmarker(panda,angnum) .001 .002 $pmarker(panda,annuli)"} ellipse {append cmd " 0 0"} ellipseannulus {append cmd " .001 .001 .002 $pmarker(ellipseannulus,annuli)"} epanda {append cmd " $pmarker(epanda,ang1) $pmarker(epanda,ang2) $pmarker(epanda,angnum) .001 .001 .002 $pmarker(epanda,annuli)"} box {append cmd " 0 0"} boxannulus {append cmd " .002 .002 .004 $pmarker(boxannulus,annuli)"} bpanda {append cmd " $pmarker(bpanda,ang1) $pmarker(bpanda,ang2) $pmarker(bpanda,angnum) .001 .001 .002 $pmarker(bpanda,annuli)"} polygon {append cmd " .001 .001"} line {append cmd " $x $y"} vector {append cmd " $x $y"} projection {append cmd " $x $y $pmarker(projection,thick) "} segment {append cmd " .001 .001"} text { set txt "Region" set r [EntryDialog "Text Region" "Enter Text:" 40 txt] if {$r == 1 && $txt != {}} { append cmd " 0 text = \{\{$txt\}\}" } else { return } } ruler {append cmd " $x $y $ed(system) $ed(sky) $ed(system) $ed(format)"} compass {append cmd " 15 $ed(system) $ed(sky) "} {circle point} - {box point} - {diamond point} - {cross point} - {x point} - {arrow point} - {boxcircle point} {append cmd " $pmarker(point,size)"} } append cmd " color = $marker(color)" append cmd " width = $marker(width)" append cmd " font = \{\"$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\"\}" append cmd " dash = $marker(dash)" append cmd " fixed = $marker(fixed)" append cmd " edit = $marker(edit)" append cmd " move = $marker(move)" append cmd " rotate = $marker(rotate)" append cmd " delete = $marker(delete)" append cmd " include = $marker(include)" append cmd " source = $marker(source)" $which marker unselect all set imarker(id) [eval $cmd] set imarker(motion) beginCreate set imarker(x) $x set imarker(y) $y switch -- $marker(shape) { circle - annulus - panda - ellipse - ellipseannulus - epanda - box - boxannulus - bpanda - compass - polygon - segment { set imarker(handle) 1 $which marker $imarker(id) edit begin $imarker(handle) } line - vector - ruler - projection { set imarker(handle) 2 $which marker $imarker(id) edit begin $imarker(handle) } } } proc MarkerDefault {which} { global imarker global pmarker global current # scale the default size to take into account the current set z1 double([lindex $current(zoom) 0]) set z2 double([lindex $current(zoom) 1]) if {$z1>$z2} { set zz $z1 } else { set zz $z2 } set item [$which get marker $imarker(id) type] switch -- $item { circle { $which marker $imarker(id) circle radius \ [expr ($pmarker(circle,radius)/$zz)] \ image degrees } annulus { $which marker $imarker(id) annulus radius \ [expr ($pmarker(annulus,inner)/$zz)] \ [expr ($pmarker(annulus,outer)/$zz)] \ $pmarker(annulus,annuli) image degrees } panda { $which marker $imarker(id) panda edit \ $pmarker(panda,ang1) $pmarker(panda,ang2) \ $pmarker(panda,angnum) \ [expr ($pmarker(panda,inner)/$zz)] \ [expr ($pmarker(panda,outer)/$zz)] \ $pmarker(panda,annuli) image } ellipse { $which marker $imarker(id) ellipse radius \ [expr ($pmarker(ellipse,radius1)/$z1)] \ [expr ($pmarker(ellipse,radius2)/$z2)] \ image degrees } ellipseannulus { $which marker $imarker(id) ellipseannulus radius \ [expr ($pmarker(ellipseannulus,radius1)/$z1)] \ [expr ($pmarker(ellipseannulus,radius2)/$z2)] \ [expr ($pmarker(ellipseannulus,radius3)/$z1)] \ $pmarker(ellipseannulus,annuli) image } epanda { $which marker $imarker(id) epanda edit \ $pmarker(epanda,ang1) $pmarker(epanda,ang2) \ $pmarker(epanda,angnum) \ [expr ($pmarker(epanda,radius1)/$z1)] \ [expr ($pmarker(epanda,radius2)/$z2)] \ [expr ($pmarker(epanda,radius3)/$z1)] \ $pmarker(epanda,annuli) image } box { $which marker $imarker(id) box radius \ [expr ($pmarker(box,radius1)/$z1)] \ [expr ($pmarker(box,radius2)/$z2)] \ image degrees } boxannulus { $which marker $imarker(id) boxannulus radius \ [expr ($pmarker(boxannulus,radius1)/$z1)] \ [expr ($pmarker(boxannulus,radius2)/$z2)] \ [expr ($pmarker(boxannulus,radius3)/$z1)] \ $pmarker(boxannulus,annuli) image } bpanda { $which marker $imarker(id) bpanda edit \ $pmarker(bpanda,ang1) $pmarker(bpanda,ang2) \ $pmarker(bpanda,angnum) \ [expr ($pmarker(bpanda,radius1)/$z1)] \ [expr ($pmarker(bpanda,radius2)/$z2)] \ [expr ($pmarker(bpanda,radius3)/$z1)] \ $pmarker(bpanda,annuli) image } compass { $which marker $imarker(id) compass radius \ $pmarker(compass,radius) image degrees } polygon { $which marker $imarker(id) polygon reset \ [expr ($pmarker(polygon,width)/$z1)] \ [expr ($pmarker(polygon,height)/$z2)] \ image degrees } segment { $which marker $imarker(id) segment reset \ [expr ($pmarker(segment,length)/$z1)] \ [expr ($pmarker(segment,length)/$z2)] \ image degrees } line - vector - ruler - projection { $which marker $imarker(id) delete set imarker(id) -1 set imarker(x) -1 set imarker(y) -1 } } } proc MarkerDeleteKey {which x y} { # if nothing is loaded, abort if {![$which has fits]} { return } # see if we are on a polygon/segment set h [$which get marker handle $x $y] set id [lindex $h 0] set handle [lindex $h 1] set t [$which get marker $id type] switch -- $t { polygon - segment - annulus - panda - ellipseannulus - epanda - boxannulus - bpanda { if {$handle > 4} { switch -- $t { polygon {$which marker $id delete polygon vertex $handle} segment {$which marker $id delete segment vertex $handle} annulus {$which marker $id delete annulus $handle} panda {$which marker $id delete panda $handle} ellipseannulus {$which marker $id delete \ ellipseannulus $handle} epanda {$which marker $id delete epanda $handle} boxannulus {$which marker $id delete boxannulus $handle} bpanda {$which marker $id delete bpanda $handle} } } else { # delete polygon/segment $which marker delete UpdateGroupDialog } } default { # delete marker $which marker delete UpdateGroupDialog } } } proc MarkerEpsilon {} { global ds9 global pmarker foreach ff $ds9(frames) { $ff marker epsilon $pmarker(epsilon) } } proc MarkerShow {} { global current global marker if {$current(frame) != {}} { $current(frame) marker show $marker(show) } } proc MarkerShowText {} { global current global marker if {$current(frame) != {}} { $current(frame) marker show text $marker(show,text) } } proc MarkerPreserve {} { global current global marker if {$current(frame) != {}} { $current(frame) marker preserve $marker(preserve) } } proc MarkerCentroid {} { global current if {$current(frame) != {}} { $current(frame) marker centroid } } proc MarkerCentroidAuto {} { global current global marker if {$current(frame) != {}} { $current(frame) marker centroid auto $marker(centroid,auto) } } proc MarkerCentroidRadius {} { global current global marker if {$current(frame) != {}} { $current(frame) marker centroid radius $marker(centroid,radius) } } proc MarkerCentroidIteration {} { global current global marker if {$current(frame) != {}} { $current(frame) marker centroid iteration $marker(centroid,iteration) } } proc MarkerFront {} { global current if {$current(frame) != {}} { $current(frame) marker move front } } proc MarkerBack {} { global current if {$current(frame) != {}} { $current(frame) marker move back $current(frame) marker unselect all } } proc MarkerSelectAll {} { global current if {$current(frame) != {}} { $current(frame) marker select all } UpdateEditMenu } proc MarkerUnselectAll {} { global current if {$current(frame) != {}} { $current(frame) marker unselect all } UpdateEditMenu } proc MarkerSelectInvert {} { global current if {$current(frame) != {}} { $current(frame) marker select toggle } UpdateEditMenu } proc MarkerDeleteSelect {} { global current if {$current(frame) != {}} { $current(frame) marker delete UpdateGroupDialog } UpdateEditMenu } proc MarkerDeleteAllMenu {} { global current global pds9 if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message [msgcat::mc {Delete All Regions?}]] != {ok}} { return } } MarkerDeleteAll } proc MarkerDeleteAll {} { global current if {$current(frame) != {}} { $current(frame) marker delete all UpdateGroupDialog } UpdateEditMenu } proc MarkerColor {} { global current global marker if {$current(frame) != {}} { $current(frame) marker color $marker(color) } } proc MarkerWidth {} { global current global marker if {$current(frame) != {}} { $current(frame) marker width $marker(width) } } proc MarkerProp {prop} { global current global marker if {$current(frame) != {}} { $current(frame) marker property $prop $marker($prop) } } proc MarkerFont {} { global current global marker if {$current(frame) != {}} { $current(frame) marker font \"$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\" } } proc MarkerList {} { global current global marker if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } if {[MarkerSaveDialog [msgcat::mc {List Regions}]]} { SimpleTextDialog markertxt [msgcat::mc {Region}] 80 20 insert top \ [$current(frame) marker list $marker(format) $marker(system) \ $marker(sky) $marker(skyformat) $marker(strip)] } } proc MarkerLoad {} { global ds9 global current global marker if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } set fns [OpenFileDialog markerfbox] if {$fns != {}} { if {[MarkerLoadDialog]} { switch -- $marker(load) { current {set frames $current(frame)} all {set frames $ds9(frames)} } MarkerLoadFrames $fns $frames \ $marker(format) $marker(system) $marker(sky) } } } proc MarkerLoadFrames {str frames format sys sky} { if {$str == {}} { return } if {[catch {glob $str} fns]} { # reset errors, we don't want to hear about it InitError tcl # could be an unique name, i.e. foo[bar], just try to load foreach fr $frames { if {[catch {MarkerLoadFile $str $fr $format $sys $sky}]} { return } } } else { foreach fn $fns { foreach fr $frames { if {[catch {MarkerLoadFile $fn $fr $format $sys $sky}]} { return } } } } } proc MarkerLoadFile {filename which format sys sky} { global current global marker if {$filename == {}} { return } if {![$which has fits]} { return } # determine if its a fits file # first, strip the filename if {![regexp -nocase {(.*)(\[.*\])} $filename foo base ext]} { set base $filename set ext {} } if {[catch {open $base} fd]} { Error [msgcat::mc {Unable to load region file}] return -code error } set ll [read $fd 9] close $fd # is it a fits file? if {$ll == "SIMPLE ="} { # see if we need to add an extension if {$ext == {}} { set filename "$base\[REGION\]" } # open it if {[catch {$which marker load fits "\{$filename\}" $marker(color) $marker(dashlist) $marker(width) "\{$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\}"}]} { if {$ext == {}} { # ok now try the first extension set filename "$base\[1\]" if {[catch {$which marker load fits "\{$filename\}" $marker(color) $marker(dashlist) $marker(width) "\{$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\}"}]} { Error [msgcat::mc {Unable to load region file}] return -code error } # reset errors, we don't want to hear about it InitError tcl } else { Error [msgcat::mc {Unable to load region file}] return -code error } } } else { # no, its ascii if {[catch {$which marker load $format "\{$filename\}" $sys $sky}]} { Error [msgcat::mc {Unable to load region file}] return -code error } } FileLast markerfbox $filename UpdateGroupDialog } proc MarkerSave {} { global current global marker if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } set filename [SaveFileDialog markerfbox] if {$filename == {}} { return } if {[MarkerSaveDialog [msgcat::mc {Save Regions}]]} { $current(frame) marker save "\{$filename\}" \ $marker(format) $marker(system) $marker(sky) \ $marker(skyformat) $marker(strip) } } proc MarkerInfo {} { global current global marker global pds9 if {$current(frame) != {}} { set ll [$current(frame) get marker select] if {$ll != {}} { set ii 0 foreach dd $ll { incr ii if {$ii > $marker(maxdialog)} { return } MarkerDialog $current(frame) $dd } } else { if {$pds9(confirm)} { tk_messageBox -type ok -icon info -message [msgcat::mc {Please Select a Region}] } } } } proc MarkerDialog {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set var(frame) $frame set var(id) $id set var(top) ".${varname}" set var(mb) ".${varname}mb" switch -- [$frame get marker $id type] { circle {CircleDialog $varname} annulus {AnnulusDialog $varname} panda {PandaDialog $varname} ellipse {EllipseDialog $varname} ellipseannulus {EllipseAnnulusDialog $varname} epanda {EpandaDialog $varname} box {BoxDialog $varname} boxannulus {BoxAnnulusDialog $varname} bpanda {BpandaDialog $varname} polygon {PolygonDialog $varname} line {LineDialog $varname} vector {VectorDialog $varname} projection {ProjectionDialog $varname} segment {SegmentDialog $varname} text {TextDialog $varname} ruler {RulerDialog $varname} compass {CompassDialog $varname} point {PointDialog $varname} composite {CompositeDialog $varname} } } proc MarkerCopy {} { global current global marker global wcs if {$current(frame) != {}} { $current(frame) marker copy set marker(copy) $current(frame) set marker(copy,system) $wcs(system) } UpdateEditMenu } proc MarkerCut {} { global current global marker global wcs if {$current(frame) != {}} { $current(frame) marker cut set marker(copy) $current(frame) set marker(copy,system) $wcs(system) } UpdateEditMenu UpdateGroupDialog } proc MarkerUndo {} { global current if {$current(frame) != {}} { $current(frame) marker undo } UpdateEditMenu UpdateGroupDialog } proc MarkerPaste {} { global current global marker global wcs # if nothing is loaded, abort if {$current(frame) == {}} { return } if {$marker(copy) == {} || $marker(copy,system) == {}} { return } if {(![$current(frame) has fits]) || (![$marker(copy) has fits])} { return } # same frame? if {$current(frame) == $marker(copy)} { # use internal $current(frame) marker paste } else { global cmd # do we have a valid wcs? if {[$marker(copy) has wcs $marker(copy,system)] && [$current(frame) has wcs $wcs(system)]} { # do we have an equatorial wcs? if {[$marker(copy) has wcs equatorial $marker(copy,system)] && [$current(frame) has wcs equatorial $wcs(system)]} { # then use wcs set cmd "[$marker(copy) marker paste $marker(copy,system) $wcs(system)]" } else { # mix of equatorial and non-equatorial wcs, use physical set cmd "[$marker(copy) marker paste physical physical]" } } else { # default, use physical set cmd "[$marker(copy) marker paste physical physical]" } $current(frame) marker command ds9 var cmd unset cmd } UpdateEditMenu UpdateGroupDialog } proc CompositeCreate {} { global current global marker if {$current(frame) != {}} { set cmd "$current(frame) marker create composite" append cmd " color = $marker(color)" append cmd " width = $marker(width)" append cmd " font = \{\"$marker(font) $marker(font,size) $marker(font,weight) $marker(font,slant)\"\}" append cmd " dash = $marker(dash)" append cmd " edit = $marker(edit)" append cmd " move = $marker(move)" append cmd " rotate = $marker(rotate)" append cmd " delete = $marker(delete)" append cmd " fixed = $marker(fixed)" append cmd " include = $marker(include)" append cmd " source = $marker(source)" eval $cmd } } proc CompositeDelete {} { global current if {$current(frame) != {}} { $current(frame) marker composite delete } } proc MarkerBackup {ch which fdir rdir} { if {[$which get marker number] > 0} { set fn $fdir/ds9.reg set rfn $rdir/ds9.reg catch {file delete -force $fn} if {[$which has wcs equatorial wcs]} { $which marker save \"$fn\" ds9 wcs fk5 degrees 0 } else { $which marker save \"$fn\" ds9 physical fk5 degrees 0 } puts $ch "$which marker load ds9 \{\"$rfn\"\}" } } # Process Cmds proc ProcessRegionsCmd {varname iname sock fn} { upvar $varname var upvar $iname i global ds9 global current global marker global pmarker # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { epsilon { incr i set pmarker(epsilon) [lindex $var $i] MarkerEpsilon } show { incr i set marker(show) [FromYesNo [lindex $var $i]] MarkerShow } showtext { incr i set marker(show,text) [FromYesNo [lindex $var $i]] MarkerShowText } getinfo {MarkerInfo} centroid { incr i switch -- [string tolower [lindex $var $i]] { auto { incr i set marker(centroid,auto) [FromYesNo [lindex $var $i]] MarkerCentroidAuto } radius { incr i set marker(centroid,radius) [lindex $var $i] MarkerCentroidRadius } iteration { incr i set marker(centroid,iteration) [lindex $var $i] MarkerCentroidIteration } default { incr i -1 MarkerCentroid } } } autocentroid { # backward compatibilty incr i set marker(centroid,auto) [FromYesNo [lindex $var $i]] MarkerCentroidAuto } movefront {MarkerFront} moveback {MarkerBack} move { incr i switch -- [string tolower [lindex $var $i]] { front {MarkerFront} back {MarkerBack} } } selectall {MarkerSelectAll} selectnone {MarkerUnselectAll} select { incr i switch -- [string tolower [lindex $var $i]] { group { # backward compatibility, use group <> select incr i if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker "\{[lindex $var $i]\}" select } } } all {MarkerSelectAll} none {MarkerUnselectAll} invert {MarkerSelectInvert} } } deleteall {MarkerDeleteAll} delete { incr i switch -- [string tolower [lindex $var $i]] { select {MarkerDeleteSelect} all {MarkerDeleteAll} } } format { incr i set marker(format) [string tolower [lindex $var $i]] } coord - system { # for backward compatibility incr i switch -- [string tolower [lindex $var $i]] { fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic { incr i set marker(system) wcs set marker(sky) [string tolower [lindex $var $i]] } default {set marker(system) [string tolower [lindex $var $i]]} } } sky { incr i set marker(sky) [string tolower [lindex $var $i]] } coordformat - skyformat { incr i switch -- [string tolower [lindex $var $i]] { deg - degree - degrees {set marker(skyformat) degrees} default { set marker(skyformat) [string tolower [lindex $var $i]] } } } strip { incr i set marker(strip) [FromYesNo [lindex $var $i]] } delim { incr i if {[lindex $var $i] != "nl"} { set marker(strip) 1 } else { set marker(strip) 0 } } shape { incr i set marker(shape) [string tolower [lindex $var $i]] } color { incr i set marker(color) [string tolower [lindex $var $i]] MarkerColor } width { incr i set marker(width) [lindex $var $i] MarkerWidth } fixed { incr i set marker(fixed) [FromYesNo [lindex $var $i]] MarkerProp fixed } edit { incr i set marker(edit) [FromYesNo [lindex $var $i]] MarkerProp edit } rotate { incr i set marker(rotate) [FromYesNo [lindex $var $i]] MarkerProp rotate } delete { incr i set marker(delete) [FromYesNo [lindex $var $i]] MarkerProp delete } include { set marker(include) 1 MarkerProp include } exclude { set marker(include) 0 MarkerProp include } source { set marker(source) 1 MarkerProp source } background { set marker(source) 0 MarkerProp source } tag - tags - group - groups { incr i if {[string tolower [lindex $var $i]] == {new}} { if {$current(frame) != {}} { if {[$current(frame) has fits]} { set name [$current(frame) get marker tag default name] $current(frame) marker tag "\{$name\}" UpdateGroupDialog } } } else { set tag "\{[lindex $var $i]\}" incr i switch -- [string tolower [lindex $var $i]] { new { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker tag $tag UpdateGroupDialog } } } update { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker tag update $tag UpdateGroupDialog } } } delete { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag delete UpdateGroupDialog } } } select { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag select } } } color { incr i if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag color \ [string tolower [lindex $var $i]] } } } copy { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag copy } } } cut { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag cut } } } font { incr i if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag font \ "\{[lindex $var $i]\}" } } } move { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag move \ [lindex $var [expr $i+1]] \ [lindex $var [expr $i+2]] } } incr i 2 } movefront { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag move front } } } moveback { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag move back } } } property { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker $tag property \ [lindex $var [expr $i+1]] \ [lindex $var [expr $i+2]] } } incr i 2 } } } } copy {MarkerCopy} cut {MarkerCut} paste { set marker(paste,system) [string tolower [lindex $var [expr $i+1]]] switch -- $marker(paste,system) { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {} default {set marker(paste,system) wcs} } # backward compatibility if {[string range [lindex $var [expr $i+2]] 0 0] == {-}} { incr i 1 } else { incr i 2 } MarkerPaste } undo {MarkerUndo} composite {CompositeCreate} desolve - dissove {CompositeDelete} template { incr i set ff [lindex $var $i] incr i switch -- [string tolower [lindex $var $i]] { at { incr i set ra [lindex $var $i] incr i set dec [lindex $var $i] incr i set sys [string tolower [lindex $var $i]] incr i set sky [string tolower [lindex $var $i]] switch -- $sys { fk4 - fk5 - icrs - galatic - ecliptic { set sky $sys set sys wcs incr i -1 } } LoadTemplateMarkerAt $ff $ra $dec $sys $sky FileLast templatefbox $ff } default { LoadTemplateMarker $ff FileLast templatefbox $ff incr i -1 } } } savetemplate { incr i set ff [lindex $var $i] if {$ff != {}} { if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker save template "\{$ff\}" } } FileLast templatefbox $ff } } command { incr i if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker command $marker(format) \ "\{[lindex $var $i]\}" } } UpdateGroupDialog } list { incr i switch -- [string tolower [lindex $var $i]] { close {SimpleTextDestroy markertxt} default { if {$current(frame) != {}} { if {[$current(frame) has fits]} { SimpleTextDialog markertxt [msgcat::mc {Region}] \ 80 20 insert top \ [$current(frame) marker list $marker(format) \ $marker(system) $marker(sky) \ $marker(skyformat) $marker(strip)] } } incr i -1 } } } save { incr i set ff [lindex $var $i] if {$ff == {}} { return } if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker save "\{$ff\}" \ $marker(format) $marker(system) $marker(sky) \ $marker(skyformat) $marker(strip) } } FileLast markerfbox $ff } file - load { incr i switch -- [string tolower [lindex $var $i]] { all { incr i set frames $ds9(frames) } default { set frames $current(frame) } } MarkerLoadFrames [lindex $var $i] $frames \ $marker(format) $marker(system) $marker(sky) } default { set format $marker(format) set sys $marker(system) set sky $marker(sky) while {[string range [lindex $var $i] 0 0] == "-"} { switch -- [string tolower [lindex $var $i]] { -format { incr i set format [lindex $var $i] } -sys - -coord - -system { incr i # for backward compatibility switch -- [lindex $var $i] { fk4 - fk5 - icrs - galactic - ecliptic { set sys wcs set sky [lindex $var $i] } default { set sys [lindex $var $i] } } } -sky { incr i set sky [lindex $var $i] } default { Error "Illegal option: [lindex $var $i]" return } } incr i } if {$sock != {}} { # xpa path if {[lindex $var $i] != {}} { MarkerLoadFrames [lindex $var $i] $current(frame) \ $format $sys $sky } else { # fits regions files not supported if {$current(frame) != {}} { if {[$current(frame) has fits]} { $current(frame) marker load $format $sock $sys $sky } } UpdateGroupDialog } } elseif {$fn != {}} { # samp path if {[lindex $var $i] != {}} { MarkerLoadFrames [lindex $var $i] $current(frame) \ $format $sys $sky } else { MarkerLoadFrames $fn $current(frame) \ $format $sys $sky } } else { # this will open a fits regions file MarkerLoadFrames [lindex $var $i] $current(frame) \ $format $sys $sky } } } } proc ProcessSendRegionsCmd {proc id param sock fn} { global current global marker global pmarker if {$current(frame) == {}} { return } switch -- [lindex $param 0] { epsilon {$proc $id "$pmarker(epsilon)\n"} show {$proc $id [ToYesNo $marker(show)]} showtext {$proc $id [ToYesNo $marker(show,text)]} centroid { switch -- [lindex $param 1] { auto {$proc $id [ToYesNo $marker(centroid,auto)]} radius {$proc $id "$marker(centroid,radius)\n"} iteration {$proc $id "$marker(centroid,iteration)\n"} } } autocentroid {$proc $id [ToYesNo $marker(centroid,auto)]} format {$proc $id "$marker(format)\n"} coord - system {$proc $id "$marker(system)\n"} sky {$proc $id "$marker(sky)\n"} coordformat - skyformat {$proc $id "$marker(skyformat)\n"} strip {$proc $id [ToYesNo $marker(strip)]} delim { if {$marker(strip)} { $proc $id "semicolon\n" } else { $proc $id "nl\n" } } shape {$proc $id "$marker(shape)\n"} color {$proc $id "$marker(color)\n"} width {$proc $id "$marker(width)\n"} tag - tags - group - groups {$proc $id "[lsort [$current(frame) get marker tag all]]\n"} default { set format $marker(format) set sys $marker(system) set sky $marker(sky) set skyformat $marker(skyformat) set strip $marker(strip) set select {} set props {} set tags {} set i 0 set l [llength $param] while {$i < $l} { switch -- [lindex $param $i] { -format {incr i; set format [lindex $param $i]} -sys - -coord - -system { incr i # for backward compatibility switch -- [lindex $param $i] { fk4 - fk5 - icrs - galactic - ecliptic { set sys wcs set sky [lindex $param $i] } default {set sys [lindex $param $i]} } } -sky {incr i; set sky [lindex $param $i]} -coordformat - -skyformat { incr i switch -- [lindex $param $i] { deg - degree - degrees {set skyformat degrees} default {set skyformat [lindex $param $i]} } } -strip { incr i; set strip [FromYesNo [lindex $param $i]] } -delim { incr i; if {[lindex $param $i] != "nl"} { set strip 1 } else { set strip 0 } } include {append props " include = 1"} exclude {append props " include = 0"} source {append props " source = 1"} background {append props " source = 0"} selected {set select "select"} -prop { append props " [lindex $param [expr $i+1]] = [lindex $param [expr $i+2]]" incr i 2 } -tag - -group { incr i append tags "tag = \{[lindex $param $i]\}" } } incr i } switch -- $format { xml {set ext {.xml}} default {set ext {.rgn}} } ProcessSend $proc $id $sock $fn $ext \ [$current(frame) marker list $select $format \ $sys $sky $skyformat $strip $props $tags] } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysishist.tcl�����������������������������������������������������������000644 �000765 �000000 �00000005063 12522457643 021166� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerAnalysisHistogramDialog {varname} { upvar #0 $varname var global $varname global imarker set id $var(id) set frame $var(frame) set vvarname ${imarker(prefix,histogram)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(histogram) [info exists ${vvarname}(top)] $var(mb).analysis add checkbutton -label [msgcat::mc {Histogram}] \ -variable ${varname}(histogram) \ -command "MarkerAnalysisHistogramCmd $varname" } # support proc MarkerAnalysisHistogramCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisHistogram $var(frame) $var(id) $var(histogram) } proc MarkerAnalysisHistogram {frame id plot} { global imarker $frame marker $id analysis histogram $plot if {$plot} { MarkerAnalysisHistogramCB $frame $id set vvarname ${imarker(prefix,histogram)}${id}${frame} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } else { MarkerAnalysisHistogramDeleteCB $frame $id } } # hardcoded marker.C proc MarkerAnalysisHistogramCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,histogram)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set vvar(frame) $frame set vvar(id) $id set vvar(nbins) 512 set xdata ${vvarname}x set ydata ${vvarname}y global $xdata $ydata set ping [PlotPing $vvarname] if {!$ping} { set tt [string totitle [$frame get marker $id type]] PlotLineDialog $vvarname $tt Histogram Values Counts set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata } $frame get marker $id analysis histogram $xdata $ydata $vvar(nbins) if {!$ping} { PlotExternal $vvarname set vvar(smooth) step set vvar(fill) 1 $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } # hardcoded marker.C proc MarkerAnalysisHistogramDeleteCB {frame id} { # this routine could be called by the region # after the dialog has been deleted global imarker set vvarname ${imarker(prefix,histogram)}${id}${frame} upvar #0 $vvarname vvar global $vvarname # clear any errors global errorInfo set errorInfo {} PlotDestroy $vvarname } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysispanda.tcl����������������������������������������������������������000644 �000765 �000000 �00000007175 12522457643 021310� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerAnalysisPandaDialog {varname} { upvar #0 $varname var global $varname global imarker set id $var(id) set frame $var(frame) set vvarname ${imarker(prefix,panda)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(panda) [info exists ${vvarname}(top)] $var(mb).analysis add checkbutton -label [msgcat::mc {Radial Profile}] \ -variable ${varname}(panda) \ -command "MarkerAnalysisPandaCmd $varname" } proc MarkerAnalysisPandaCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisPanda $var(frame) $var(id) $var(panda) } proc MarkerAnalysisPanda {frame id panda} { global imarker $frame marker $id analysis panda $panda if {$panda} { MarkerAnalysisPandaCB $frame $id set vvarname ${imarker(prefix,panda)}${id}${frame} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } else { MarkerAnalysisPandaDeleteCB $frame $id } } proc MarkerAnalysisPandaSystem {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,panda)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(panda)]} { if {$var(panda)} { MarkerAnalysisPandaCB $var(frame) $var(id) MarkerAnalysisPandaAxisTitle $vvarname } } } # hardcoded marker.C proc MarkerAnalysisPandaCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,panda)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set vvar(frame) $frame set vvar(id) $id if {[info exists var(system)]} { set vvar(system) $var(system) set sys $var(system) } elseif {[info exists vvar(system)]} { set sys $vvar(system) } else { global wcs set vvar(system) $wcs(system) set sys $wcs(system) } set ping [PlotPing $vvarname] if {!$ping} { set tt [string totitle [$frame get marker $id type]] PlotLineDialog $vvarname $tt "Radial Profile" $sys {} MarkerAnalysisPandaAxisTitle $vvarname } PlotClearData $vvarname PlotDataSet $vvarname 3 [$frame get marker $id analysis panda $sys] $vvar(proc,updategraph) $vvarname PlotStats $vvarname PlotList $vvarname } proc MarkerAnalysisPandaDeleteCB {frame id} { # this routine could be called by the region # after the dialog has been deleted global imarker set vvarname ${imarker(prefix,panda)}${id}${frame} upvar #0 $vvarname vvar global $vvarname # clear any errors global errorInfo set errorInfo {} PlotDestroy $vvarname } proc MarkerAnalysisPandaAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname switch -- $vvar(system) { image - physical - amplifier - detector { set xtitle "Avg Radius (pixels)" set ytitle "Surface Brightness (cnts/pixels**2)" } default { if {[$vvar(frame) has wcs equatorial $vvar(system)]} { set xtitle "Avg Radius (arcsecs)" set ytitle "Surface Brightness (cnts/arcsec**2)" } else { set xtitle "Avg Radius (pixels)" set ytitle "Surface Brightness (cnts/pixels**2)" } } } # set for plot code set vvar(graph,xaxis) $xtitle set vvar(graph,yaxis) $ytitle # update now (may not make it into plot code) $vvar(graph) xaxis configure -title $vvar(graph,xaxis) $vvar(graph) yaxis configure -title $vvar(graph,yaxis) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysisplot2d.tcl���������������������������������������������������������000644 �000765 �000000 �00000014273 12522457643 021426� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # support proc MarkerAnalysisPlot2dDialog {varname} { upvar #0 $varname var global $varname global imarker set id $var(id) set frame $var(frame) set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(plot2d) [info exists ${vvarname}(top)] set var(method) average $var(mb).analysis add checkbutton -label [msgcat::mc {Plot 2D}] \ -variable ${varname}(plot2d) \ -command "MarkerAnalysisPlot2dCmd $varname" $var(mb).analysis add separator $var(mb).analysis add cascade \ -label [msgcat::mc {Method}] \ -menu $var(mb).analysis.method menu $var(mb).analysis.method $var(mb).analysis.method add radiobutton \ -label [msgcat::mc {Average}] \ -variable ${varname}(method) -value average \ -command "MarkerAnalysisPlot2dMethod $varname" $var(mb).analysis.method add radiobutton \ -label [msgcat::mc {Sum}] \ -variable ${varname}(method) -value sum \ -command "MarkerAnalysisPlot2dMethod $varname" } proc MarkerAnalysisPlot2dCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisPlot2d $var(frame) $var(id) $var(plot2d) } proc MarkerAnalysisPlot2d {frame id plot} { global imarker $frame marker $id analysis plot2d $plot if {$plot} { MarkerAnalysisPlot2dCB $frame $id set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } else { MarkerAnalysisPlot2dDeleteCB $frame $id } } proc MarkerAnalysisPlot2dMethod {varname} { upvar #0 $varname var global $varname global imarker set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(plot2d)]} { if {$var(plot2d)} { MarkerAnalysisPlot2dCB $var(frame) $var(id) MarkerAnalysisPlot2dYAxisTitle $vvarname } } } proc MarkerAnalysisPlot2dSystem {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(plot2d)]} { if {$var(plot2d)} { MarkerAnalysisPlot2dCB $var(frame) $var(id) MarkerAnalysisPlot2dXAxisTitle $vvarname } } } # hardcoded marker.C proc MarkerAnalysisPlot2dCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set vvar(frame) $frame set vvar(id) $id if {[info exists var(system)]} { set vvar(system) $var(system) set sys $var(system) } elseif {[info exists vvar(system)]} { set sys $vvar(system) } else { global wcs set vvar(system) $wcs(system) set sys $wcs(system) } if {[info exists var(sky)]} { set vvar(sky) $var(sky) set sky $var(sky) } elseif {[info exists vvar(sky)]} { set sky $vvar(sky) } else { global wcs set sky $wcs(sky) } if {[info exists var(method)]} { set vvar(method) $var(method) set method $var(method) } elseif {[info exists vvar(method)]} { set method $vvar(method) } else { set vvar(method) average set method average } set xdata ${vvarname}x set ydata ${vvarname}y set xcdata ${vvarname}xc set ycdata ${vvarname}yc global $xdata $ydata $xcdata $ycdata set ping [PlotPing $vvarname] if {!$ping} { set tt [string totitle [$frame get marker $id type]] PlotLineDialog $vvarname $tt Plot2D $sys Counts MarkerAnalysisPlot2dXAxisTitle $vvarname MarkerAnalysisPlot2dYAxisTitle $vvarname # setup our own formatting set vvar(graph,format) 0 set vvar(xcdata) $xcdata set vvar(ycdata) $ycdata $vvar(graph) xaxis configure \ -command "MarkerAnalysisPlot2dXAxis $vvarname" set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata $xcdata $ycdata } $frame get marker $id analysis plot2d $xdata $ydata $xcdata $ycdata \ $sys $sky $method if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } proc MarkerAnalysisPlot2dDeleteCB {frame id} { # this routine could be called by the region # after the dialog has been deleted global imarker set vvarname ${imarker(prefix,plot2d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set xcdata ${vvarname}xc set ycdata ${vvarname}yc # clear extra vectors global $xcdata $ycdata catch {blt::vector destroy $xcdata $ycdata} # clear any errors global errorInfo set errorInfo {} PlotDestroy $vvarname } proc MarkerAnalysisPlot2dXAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname switch -- $vvar(system) { image - physical - amplifier - detector {set title "$vvar(system)"} default { if {[$vvar(frame) has wcs equatorial $vvar(system)]} { set title "$vvar(system)" } else { set title "[$vvar(frame) get wcs name $vvar(system)]" } } } # set for plot code set vvar(graph,xaxis) $title # update now (may not make it into plot code) $vvar(graph) xaxis configure -title $vvar(graph,xaxis) } proc MarkerAnalysisPlot2dYAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname # set for plot code set vvar(graph,yaxis) "Counts [string totitle $vvar(method)]" # update now (may not make it into plot code) $vvar(graph) yaxis configure -title $vvar(graph,yaxis) } proc MarkerAnalysisPlot2dXAxis {vvarname w xx} { upvar #0 $vvarname vvar global $vvarname set x [expr $xx-1] global $vvar(xcdata) $vvar(ycdata) # sometimes, $x equals $vvar(xcdata) length set ll [$vvar(xcdata) length] if {($ll>=1) && ($x>=0) && ($x<$ll)} { set a [format "%6.3f" [expr "$$vvar(xcdata)\($x\)"]] set b [format "%6.3f" [expr "$$vvar(ycdata)\($x\)"]] return "$a\n$b" } else { return {} } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysisplot3d.tcl���������������������������������������������������������000644 �000765 �000000 �00000012314 12522457643 021421� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerAnalysisPlot3dDialog {varname} { upvar #0 $varname var global $varname global imarker set id $var(id) set frame $var(frame) set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(plot3d) [info exists ${vvarname}(top)] set var(method) average $var(mb).analysis add checkbutton -label [msgcat::mc {Plot 3D}] \ -variable ${varname}(plot3d) \ -command "MarkerAnalysisPlot3dCmd $varname" $var(mb).analysis add separator $var(mb).analysis add cascade \ -label [msgcat::mc {Method}] \ -menu $var(mb).analysis.method menu $var(mb).analysis.method $var(mb).analysis.method add radiobutton \ -label [msgcat::mc {Average}] \ -variable ${varname}(method) -value average \ -command "MarkerAnalysisPlot3dMethod $varname" $var(mb).analysis.method add radiobutton \ -label [msgcat::mc {Sum}] \ -variable ${varname}(method) -value sum \ -command "MarkerAnalysisPlot3dMethod $varname" } # support proc MarkerAnalysisPlot3dCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisPlot3d $var(frame) $var(id) $var(plot3d) } proc MarkerAnalysisPlot3d {frame id plot} { global imarker $frame marker $id analysis plot3d $plot if {$plot} { MarkerAnalysisPlot3dCB $frame $id set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } else { MarkerAnalysisPlot3dDeleteCB $frame $id } } proc MarkerAnalysisPlot3dMethod {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(plot3d)]} { if {$var(plot3d)} { MarkerAnalysisPlot3dCB $frame $id MarkerAnalysisPlot3dYAxisTitle $vvarname } } } proc MarkerAnalysisPlot3dSystem {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(plot3d)]} { if {$var(plot3d)} { MarkerAnalysisPlot3dCB $frame $id MarkerAnalysisPlot3dXAxisTitle $vvarname } } } # hardcoded marker.C proc MarkerAnalysisPlot3dCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set vvar(frame) $frame set vvar(id) $id if {[info exists var(system)]} { set vvar(system) $var(system) set sys $var(system) } elseif {[info exists vvar(system)]} { set sys $vvar(system) } else { global wcs set vvar(system) $wcs(system) set sys $wcs(system) } if {[info exists var(method)]} { set vvar(method) $var(method) set method $var(method) } elseif {[info exists vvar(method)]} { set method $vvar(method) } else { set vvar(method) average set method average } set xdata ${vvarname}x set ydata ${vvarname}y global $xdata $ydata set ping [PlotPing $vvarname] if {!$ping} { set tt [string totitle [$frame get marker $id type]] PlotLineDialog $vvarname $tt Plot3D $sys Counts MarkerAnalysisPlot3dXAxisTitle $vvarname MarkerAnalysisPlot3dYAxisTitle $vvarname set vvar(manage) 0 set vvar(dim) xy set vvar(xdata) $xdata set vvar(ydata) $ydata blt::vector create $xdata $ydata } $frame get marker $id analysis plot3d $xdata $ydata $sys $method if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } # hardcoded marker.C proc MarkerAnalysisPlot3dDeleteCB {frame id} { # this routine could be called by the region # after the dialog has been deleted global imarker set vvarname ${imarker(prefix,plot3d)}${id}${frame} upvar #0 $vvarname vvar global $vvarname # clear any errors global errorInfo set errorInfo {} PlotDestroy $vvarname } proc MarkerAnalysisPlot3dXAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname switch -- $vvar(system) { image - physical - amplifier - detector {set title "$vvar(system)"} default { set w [string range $vvar(system) 3 3] set tt [string trim [$vvar(frame) get fits header keyword \{CTYPE3$w\}]] if {$tt != {}} { set title "$tt" } else { set title "$vvar(system)" } } } # set for plot code set vvar(graph,xaxis) $title # update now (may not make it into plot code) $vvar(graph) xaxis configure -title $vvar(graph,xaxis) } proc MarkerAnalysisPlot3dYAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname # set for plot code set vvar(graph,yaxis) "Counts [string totitle $vvar(method)]" # update now (may not make it into plot code) $vvar(graph) yaxis configure -title $vvar(graph,yaxis) } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysisradial.tcl���������������������������������������������������������000644 �000765 �000000 �00000010222 12522457643 021444� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerAnalysisRadialDialog {varname} { upvar #0 $varname var global $varname global imarker set id $var(id) set frame $var(frame) set vvarname ${imarker(prefix,radial)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(radial) [info exists ${vvarname}(top)] $var(mb).analysis add checkbutton -label [msgcat::mc {Radial Profile}] \ -variable ${varname}(radial) \ -command "MarkerAnalysisRadialCmd $varname" } proc MarkerAnalysisRadialCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisRadial $var(frame) $var(id) $var(radial) } proc MarkerAnalysisRadial {frame id radial} { global imarker $frame marker $id analysis radial $radial if {$radial} { MarkerAnalysisRadialCB $frame $id set vvarname ${imarker(prefix,radial)}${id}${frame} upvar #0 $vvarname vvar global $vvarname PlotRaise $vvarname } else { MarkerAnalysisRadialDeleteCB $frame $id } } proc MarkerAnalysisRadialSystem {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,radial)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(radial)]} { if {$var(radial)} { MarkerAnalysisRadialCB $var(frame) $var(id) MarkerAnalysisRadialAxisTitle $vvarname } } } # hardcoded marker.C proc MarkerAnalysisRadialCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,radial)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set vvar(frame) $frame set vvar(id) $id if {[info exists var(system)]} { set vvar(system) $var(system) set sys $var(system) } elseif {[info exists vvar(system)]} { set sys $vvar(system) } else { global wcs set vvar(system) $wcs(system) set sys $wcs(system) } set xdata ${imarker(prefix,radial)}${id}${frame}x set ydata ${imarker(prefix,radial)}${id}${frame}y set yedata ${imarker(prefix,radial)}${id}${frame}ye global $xdata $ydata $yedata set ping [PlotPing $vvarname] if {!$ping} { set tt [string totitle [$frame get marker $id type]] PlotLineDialog $vvarname $tt "Radial Profile" $sys {} MarkerAnalysisRadialAxisTitle $vvarname set vvar(manage) 0 set vvar(dim) xyey set vvar(xdata) $xdata set vvar(ydata) $ydata set vvar(yedata) $yedata blt::vector create $xdata $ydata $yedata } $frame get marker $id analysis radial $xdata $ydata $yedata $sys if {!$ping} { PlotExternal $vvarname $vvar(proc,updateelement) $vvarname $vvar(proc,updategraph) $vvarname } PlotStats $vvarname PlotList $vvarname } proc MarkerAnalysisRadialDeleteCB {frame id} { # this routine could be called by the region # after the dialog has been deleted global imarker set vvarname ${imarker(prefix,radial)}${id}${frame} upvar #0 $vvarname vvar global $vvarname # clear any errors global errorInfo set errorInfo {} PlotDestroy $vvarname } proc MarkerAnalysisRadialAxisTitle {vvarname} { upvar #0 $vvarname vvar global $vvarname switch -- $vvar(system) { image - physical - amplifier - detector { set xtitle "Avg Radius (pixels)" set ytitle "Surface Brightness (cnts/pixels**2)" } default { if {[$vvar(frame) has wcs equatorial $vvar(system)]} { set xtitle "Avg Radius (arcsecs)" set ytitle "Surface Brightness (cnts/arcsec**2)" } else { set xtitle "Avg Radius (pixels)" set ytitle "Surface Brightness (cnts/pixels**2)" } } } # set for plot code set vvar(graph,xaxis) $xtitle set vvar(graph,yaxis) $ytitle # update now (may not make it into plot code) $vvar(graph) xaxis configure -title $vvar(graph,xaxis) $vvar(graph) yaxis configure -title $vvar(graph,yaxis) $vvar(graph) xaxis configure -title $xtitle $vvar(graph) yaxis configure -title $ytitle } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markeranalysisstats.tcl����������������������������������������������������������000644 �000765 �000000 �00000004423 12464211203 021335� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerAnalysisStatsDialog {varname} { upvar #0 $varname var global $varname global imarker set frame $var(frame) set id $var(id) set vvarname ${imarker(prefix,stats)}${id}${frame} upvar #0 $vvarname vvar global $vvarname set var(stats) [info exists ${vvarname}(top)] $var(mb).analysis add checkbutton \ -label [msgcat::mc {Statistics}] \ -variable ${varname}(stats) \ -command "MarkerAnalysisStatsCmd $varname" } proc MarkerAnalysisStatsCmd {varname} { upvar #0 $varname var global $varname MarkerAnalysisStats $var(frame) $var(id) $var(stats) } proc MarkerAnalysisStats {frame id stats} { $frame marker $id analysis stats $stats if {$stats} { MarkerAnalysisStatsCB $frame $id } else { MarkerAnalysisStatsDeleteCB $frame $id } } proc MarkerAnalysisStatsSystem {varname} { upvar #0 $varname var global $varname if {[info exists var(stats)]} { if {$var(stats)} { MarkerAnalysisStatsCB $var(frame) $var(id) } } } # hardcoded marker.C proc MarkerAnalysisStatsCB {frame id} { global imarker set varname ${imarker(prefix,dialog)}${id}${frame} global $varname upvar #0 $varname var set vvarname ${imarker(prefix,stats)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists var(system)]} { set vvar(system) $var(system) set sys $var(system) } elseif {[info exists vvar(system)]} { set sys $vvar(system) } else { global wcs set sys $wcs(system) } if {[info exists var(sky)]} { set vvar(sky) $var(sky) set sky $var(sky) } elseif {[info exists vvar(sky)]} { set sky $vvar(sky) } else { global wcs set sky $wcs(sky) } set tt [string totitle [$frame get marker $id type]] set rr [$frame get marker $id analysis stats $sys $sky] SimpleTextDialog $vvarname $tt 80 20 insert top $rr } proc MarkerAnalysisStatsDeleteCB {frame id} { global imarker set vvarname ${imarker(prefix,stats)}${id}${frame} upvar #0 $vvarname vvar global $vvarname if {[info exists $vvarname]} { SimpleTextDestroy $vvarname } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbase.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000022267 12464211203 017353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBaseDialog {varname} { upvar #0 $varname var global $varname set tt [$var(frame) get marker $var(id) type] switch -- [lindex $tt 1] { point {set type "[string totitle [lindex $tt 0]] [string totitle [lindex $tt 1]]"} {} {set type [string totitle [lindex $tt 0]]} } # variables - some may already be initialized (compass,ruler) if {![info exists var(system)]} { set rr [$var(frame) get wcs] set var(system) [lindex $rr 0] set var(sky) [lindex $rr 1] set var(skyformat) [lindex $rr 2] } AdjustCoordSystem $varname system # init MarkerBaseTextCB $varname MarkerBaseColorCB $varname MarkerBaseLineWidthCB $varname MarkerBasePropertyCB $varname MarkerBaseFontCB $varname $var(proc,coordCB) $varname # callbacks $var(frame) marker $var(id) callback delete MarkerBaseDeleteCB $varname $var(frame) marker $var(id) callback text MarkerBaseTextCB $varname $var(frame) marker $var(id) callback color MarkerBaseColorCB $varname $var(frame) marker $var(id) callback width MarkerBaseLineWidthCB $varname $var(frame) marker $var(id) callback property MarkerBasePropertyCB $varname $var(frame) marker $var(id) callback font MarkerBaseFontCB $varname # window Toplevel $var(top) $var(mb) 6 [msgcat::mc "$type"] \ "$var(proc,close) $varname" # menus MarkerBaseMenu $varname MarkerBaseFileMenu $varname EditMenu $var(mb) $varname ColorMenu $var(mb).color $varname color [list MarkerBaseColor $varname] WidthDashMenu $var(mb).width $varname linewidth dash \ [list MarkerBaseLineWidth $varname] \ [list MarkerBaseProperty $varname dash] MarkerBasePropertyMenu $varname FontMenu $var(mb).font $varname font font,size font,weight \ font,slant [list MarkerBaseFont $varname] # Param set f [ttk::frame $var(top).param] ttk::label $f.tid -text [msgcat::mc {Number}] ttk::label $f.id -text "$var(id)" ttk::label $f.ttext -text [msgcat::mc {Text}] ttk::entry $f.text -textvariable ${varname}(text) -width 45 grid $f.tid $f.id -padx 2 -pady 2 -sticky w grid $f.ttext $f.text - - - -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $var(top).buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command "$var(proc,apply) $varname" ttk::button $f.close -text [msgcat::mc {Close}] \ -command "$var(proc,close) $varname" pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 bind $var(top) <Return> "$var(proc,apply) $varname" # Fini ttk::separator $var(top).sep -orient horizontal pack $var(top).buttons $var(top).sep -side bottom -fill x pack $var(top).param -side top -fill both -expand true # some window managers need a hint raise $var(top) } # actions proc MarkerBaseClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback delete MarkerBaseDeleteCB $var(frame) marker $var(id) delete callback text MarkerBaseTextCB $var(frame) marker $var(id) delete callback color MarkerBaseColorCB $var(frame) marker $var(id) delete callback width MarkerBaseLineWidthCB $var(frame) marker $var(id) delete callback property MarkerBasePropertyCB $var(frame) marker $var(id) delete callback font MarkerBaseFontCB MarkerBaseDeleteCB $varname unset $varname } proc MarkerBaseApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) text \{$var(text)\} UpdateRegionMenu } proc MarkerBaseColor {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) color $var(color) } proc MarkerBaseLineWidth {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) width $var(linewidth) } proc MarkerBaseProperty {varname prop} { upvar #0 $varname var global $varname $var(frame) marker $var(id) property $prop $var($prop) } proc MarkerBaseFont {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) font \ \"$var(font) $var(font,size) $var(font,weight) $var(font,slant)\" } # callbacks proc MarkerBaseDeleteCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseDeleteCB" } # variables foreach m [array names marker] { set mm [split $m ,] if {[lindex $mm 0] == $var(frame) && [lindex $mm 1] == $var(id)} { unset marker($m) } } # destroy the window and menubar if {[winfo exists $var(top)]} { destroy $var(top) destroy $var(mb) } } proc MarkerBaseTextCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseTextCB" } set var(text) [$var(frame) get marker $var(id) text] } proc MarkerBaseColorCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseColorCB" } set var(color) [$var(frame) get marker $var(id) color] } proc MarkerBaseLineWidthCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseLineWidthCB" } set var(linewidth) [$var(frame) get marker $var(id) width] } proc MarkerBasePropertyCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePropertyCB" } set var(dash) [$var(frame) get marker $var(id) property dash] set var(fixed) [$var(frame) get marker $var(id) property fixed] set var(edit) [$var(frame) get marker $var(id) property edit] set var(move) [$var(frame) get marker $var(id) property move] set var(rotate) [$var(frame) get marker $var(id) property rotate] set var(delete) [$var(frame) get marker $var(id) property delete] set var(include) [$var(frame) get marker $var(id) property include] set var(source) [$var(frame) get marker $var(id) property source] } proc MarkerBaseFontCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseFontCB" } set f [$var(frame) get marker $var(id) font] set var(font) [lindex $f 0] set var(font,size) [lindex $f 1] set var(font,weight) [lindex $f 2] set var(font,slant) [lindex $f 3] } proc MarkerBaseCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseCoordCB" } AdjustCoordSystem $varname system } # menus proc MarkerBaseMenu {varname} { upvar #0 $varname var global $varname $var(mb) add cascade -label [msgcat::mc {File}] -menu $var(mb).file $var(mb) add cascade -label [msgcat::mc {Edit}] -menu $var(mb).edit $var(mb) add cascade -label [msgcat::mc {Color}] -menu $var(mb).color $var(mb) add cascade -label [msgcat::mc {Width}] -menu $var(mb).width $var(mb) add cascade -label [msgcat::mc {Property}] -menu $var(mb).properties $var(mb) add cascade -label [msgcat::mc {Font}] -menu $var(mb).font } proc MarkerBaseFileMenu {varname} { upvar #0 $varname var global $varname menu $var(mb).file $var(mb).file add command -label [msgcat::mc {Apply}] \ -command "$var(proc,apply) $varname" $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Close}] \ -command "$var(proc,close) $varname" } proc MarkerBasePropertyMenu {varname} { upvar #0 $varname var global $varname menu $var(mb).properties $var(mb).properties add checkbutton -label [msgcat::mc {Fixed in Size}] \ -variable ${varname}(fixed) \ -command "MarkerBaseProperty $varname fixed" $var(mb).properties add separator $var(mb).properties add checkbutton -label [msgcat::mc {Can Edit}] \ -variable ${varname}(edit) \ -command "MarkerBaseProperty $varname edit" $var(mb).properties add checkbutton -label [msgcat::mc {Can Move}] \ -variable ${varname}(move) \ -command "MarkerBaseProperty $varname move" $var(mb).properties add checkbutton -label [msgcat::mc {Can Rotate}] \ -variable ${varname}(rotate) \ -command "MarkerBaseProperty $varname rotate" $var(mb).properties add checkbutton -label [msgcat::mc {Can Delete}] \ -variable ${varname}(delete) \ -command "MarkerBaseProperty $varname delete" $var(mb).properties add separator $var(mb).properties add radiobutton -label [msgcat::mc {Include}] \ -variable ${varname}(include) -value 1 \ -command "MarkerBaseProperty $varname include" $var(mb).properties add radiobutton -label [msgcat::mc {Exclude}] \ -variable ${varname}(include) -value 0 \ -command "MarkerBaseProperty $varname include" $var(mb).properties add separator $var(mb).properties add radiobutton -label [msgcat::mc {Source}] \ -variable ${varname}(source) -value 1 \ -command "MarkerBaseProperty $varname source" $var(mb).properties add radiobutton -label [msgcat::mc {Background}] \ -variable ${varname}(source) -value 0 \ -command "MarkerBaseProperty $varname source" } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbaseannulus.tcl������������������������������������������������������������000644 �000765 �000000 �00000017220 12464211203 020752� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBaseAnnulusDialog {varname} { upvar #0 $varname var global $varname set t [$var(frame) get marker $var(id) type] switch -- $t { ellipseannulus {set type "Ellipse Annulus"} boxannulus {set type "Box Annulus"} default {set type [string totitle $t]} } # variables set rr [$var(frame) get wcs] set var(system) [lindex $rr 0] set var(sky) [lindex $rr 1] set var(skyformat) [lindex $rr 2] AdjustCoordSystem $varname system set var(x) 0 set var(y) 0 # init MarkerBaseTextCB $varname MarkerBaseColorCB $varname MarkerBaseLineWidthCB $varname MarkerBasePropertyCB $varname MarkerBaseFontCB $varname $var(proc,coordCB) $varname MarkerBaseCenterMoveCB $varname # callbacks $var(frame) marker $var(id) callback delete MarkerBaseDeleteCB $varname $var(frame) marker $var(id) callback text MarkerBaseTextCB $varname $var(frame) marker $var(id) callback color MarkerBaseColorCB $varname $var(frame) marker $var(id) callback width MarkerBaseLineWidthCB $varname $var(frame) marker $var(id) callback property MarkerBasePropertyCB $varname $var(frame) marker $var(id) callback font MarkerBaseFontCB $varname $var(frame) marker $var(id) callback move MarkerBaseCenterMoveCB $varname # window Toplevel $var(top) $var(mb) 6 [msgcat::mc "$type"] \ "$var(proc,close) $varname" # menus MarkerBaseMenu $varname MarkerBaseAnnulusFileMenu $varname EditMenu $var(mb) $varname ColorMenu $var(mb).color $varname color [list MarkerBaseColor $varname] WidthDashMenu $var(mb).width $varname linewidth dash \ [list MarkerBaseLineWidth $varname] \ [list MarkerBaseProperty $varname dash] MarkerBasePropertyMenu $varname FontMenu $var(mb).font $varname font font,size font,weight \ font,slant [list MarkerBaseFont $varname] # Param set f [ttk::labelframe $var(top).param -text [msgcat::mc "Parameters"] \ -padding 2] ttk::label $f.tid -text [msgcat::mc {Number}] ttk::label $f.id -text "$var(id)" ttk::label $f.ttext -text [msgcat::mc {Text}] ttk::entry $f.text -textvariable ${varname}(text) -width 45 ttk::label $f.tcenter -text [msgcat::mc {Center}] ttk::entry $f.centerx -textvariable ${varname}(x) -width 13 ttk::entry $f.centery -textvariable ${varname}(y) -width 13 CoordMenuButton $f.ucenter $varname system 1 sky skyformat \ [list $var(proc,coordCB) $varname] CoordMenuEnable $f.ucenter.menu $varname system 1 sky skyformat grid $f.tid $f.id -padx 2 -pady 2 -sticky w grid $f.ttext $f.text - - - -padx 2 -pady 2 -sticky w grid $f.tcenter $f.centerx $f.centery $f.ucenter \ -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $var(top).buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] \ -command "$var(proc,apply) $varname" ttk::button $f.generate -text [msgcat::mc {Generate}] \ -command "$var(proc,generate) $varname" ttk::button $f.close -text [msgcat::mc {Close}] \ -command "$var(proc,close) $varname" pack $f.apply $f.generate $f.close -side left -expand true -padx 2 -pady 4 bind $var(top) <Return> "$var(proc,apply) $varname" # Fini grid $var(top).param -sticky news grid $var(top).buttons - - -sticky ew # some window managers need a hint raise $var(top) } proc MarkerBaseAnnulusFileMenu {varname} { upvar #0 $varname var global $varname menu $var(mb).file $var(mb).file add command -label [msgcat::mc {Apply}] \ -command "$var(proc,apply) $varname" $var(mb).file add command -label [msgcat::mc {Generate}] \ -command "$var(proc,generate) $varname" $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Close}] \ -command "$var(proc,close) $varname" } proc MarkerBaseAnnulusMethodMenu {varname} { upvar #0 $varname var global $varname $var(mb) add cascade -label [msgcat::mc {Method}] -menu $var(mb).method menu $var(mb).method $var(mb).method add radiobutton -label [msgcat::mc {Equal Distance}] \ -variable ${varname}(method) -value dist $var(mb).method add radiobutton -label [msgcat::mc {Equal Area}] \ -variable ${varname}(method) -value area } proc MarkerBaseAnnulusGenerateCircle {varname} { upvar #0 $varname var global $varname $var(annulitxt) delete 1.0 end if {$var(annuli) < 1} { set var(annuli) 1 } set inner $var(inner) set outer $var(outer) set annuli $var(annuli) if {($inner != {}) && ($outer != {}) && ($annuli != {})} { switch -- $var(method) { dist { for {set i 0} {$i<=$annuli} {incr i} { $var(annulitxt) insert end \ "[expr ((($outer-$inner)/double($annuli))*$i)+$inner]\n" } } area { set pi 3.14159265358979323846 set area [expr $pi*(($outer*$outer)-($inner*$inner))/$annuli] set r0 $inner $var(annulitxt) insert end "$r0\n" for {set i 0} {$i<$annuli} {incr i} { set r1 [expr sqrt(($area+($pi*$r0*$r0))/$pi)] $var(annulitxt) insert end \ [format "%.4f\n" $r1] set r0 $r1 } } } } } proc MarkerBaseAnnulusGenerateEllipse {varname} { upvar #0 $varname var global $varname $var(annulitxt) delete 1.0 end if {$var(annuli) < 1} { set var(annuli) 1 } set radius1 $var(radius1) set radius2 $var(radius2) set radius3 $var(radius3) set annuli $var(annuli) if {($radius1 != {}) && ($radius2 != {}) && \ ($radius3 != {}) && ($annuli != {})} { switch -- $var(method) { dist { for {set i 0} {$i<=$annuli} {incr i} { set major [expr ((($radius1-$radius3)/double($annuli))*$i)\ +$radius3] set minor [expr $major*$radius2/$radius1] $var(annulitxt) insert end "$major $minor\n" } } area { set pi 3.14159265358979323846 set r [expr double($radius2)/$radius1] set area [expr $pi*(($radius1*$radius2)-($radius3*$radius3*$r))\ /$annuli] set major0 $radius3 set minor0 [expr $radius3*$r] $var(annulitxt) insert end "$major0 $minor0\n" for {set i 0} {$i<$annuli} {incr i} { set major1 [expr sqrt(($area+($pi*$major0*$minor0)) / \ ($pi*$r))] set minor1 [expr $major1*$r] $var(annulitxt) insert end \ [format "%.4f %.4f\n" $major1 $minor1] set major0 $major1 set minor0 $minor1 } } } } } proc MarkerBaseAnnulusGenerateBox {varname} { upvar #0 $varname var global $varname $var(annulitxt) delete 1.0 end if {$var(annuli) < 1} { set var(annuli) 1 } set radius1 $var(radius1) set radius2 $var(radius2) set radius3 $var(radius3) set annuli $var(annuli) if {($radius1 != {}) && ($radius2 != {}) && \ ($radius3 != {}) && ($annuli != {})} { if {$radius1<=0} { set radius1 1 } if {$radius2<=0} { set radius2 1 } switch -- $var(method) { dist { for {set i 0} {$i<=$annuli} {incr i} { set major [expr ((($radius1-$radius3)/$annuli)*$i)+$radius3] set minor [expr $major*$radius2/$radius1] $var(annulitxt) insert end "$major $minor\n" } } area { set r [expr double($radius2)/$radius1] set area [expr (($radius1*$radius2)-($radius3*$radius3*$r)) \ /$annuli] set major0 $radius3 set minor0 [expr $radius3*$r] $var(annulitxt) insert end "$major0 $minor0\n" for {set i 0} {$i<$annuli} {incr i} { set major1 [expr sqrt(($area+($major0*$minor0))/$r)] set minor1 [expr $major1*$r] $var(annulitxt) insert end \ [format "%.4f %.4f\n" $major1 $minor1] set major0 $major1 set minor0 $minor1 } } } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbaseannulusrect.tcl��������������������������������������������������������000644 �000765 �000000 �00000012477 12514261632 021650� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBaseAnnulusRectDialog {varname unit major minor} { upvar #0 $varname var global $varname global pmarker set unit2 [string totitle $unit] # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord set var(method) dist # base MarkerBaseAnnulusDialog $varname # menus MarkerBaseAnnulusMethodMenu $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisRadialDialog $varname # callbacks # $var(frame) marker $var(id) callback move $var(proc,editCB) $varname $var(frame) marker $var(id) callback edit $var(proc,editCB) $varname $var(frame) marker $var(id) callback end edit $var(proc,editCB) $varname $var(frame) marker $var(id) callback rotate MarkerBaseCenterRotateCB $varname set f $var(top).param # Radius ttk::label $f.majorTitle -text $major ttk::label $f.minorTitle -text $minor ttk::label $f.outerTitle -text [msgcat::mc "Outer"] ttk::entry $f.radius1 -textvariable ${varname}(radius1) -width 13 ttk::entry $f.radius2 -textvariable ${varname}(radius2) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list $var(proc,distCB) $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat ttk::label $f.innerTitle -text [msgcat::mc "Inner"] ttk::entry $f.radius3 -textvariable ${varname}(radius3) -width 13 # Annulus ttk::label $f.tannuli -text [msgcat::mc {Annuli}] ttk::entry $f.vannuli -textvariable ${varname}(annuli) -width 13 # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.vangle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid x $f.majorTitle $f.minorTitle -padx 2 -pady 2 -sticky w grid $f.outerTitle $f.radius1 $f.radius2 $f.uradius \ -padx 2 -pady 2 -sticky w grid $f.innerTitle $f.radius3 -padx 2 -pady 2 -sticky w grid $f.tannuli $f.vannuli -padx 2 -pady 2 -sticky w grid $f.tangle $f.vangle $f.uangle -padx 2 -pady 2 -sticky w # Annuli set f [ttk::labelframe $var(top).annuli -text [msgcat::mc {Annuli}] \ -padding 2] set var(annulitxt) [text $f.txt \ -height 10 \ -width 15 \ -wrap none \ -font [font actual TkDefaultFont] \ -yscrollcommand [list $f.yscroll set] \ ] ttk::scrollbar $f.yscroll -command [list $var(annulitxt) yview] \ -orient vertical grid $var(annulitxt) $f.yscroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Fini grid $var(top).annuli -row 0 -column 1 -sticky news grid rowconfigure $var(top) 0 -weight 1 grid columnconfigure $var(top) 1 -weight 1 # init - do this last $var(proc,distCB) $varname MarkerBaseCenterRotateCB $varname } # actions proc MarkerBaseAnnulusRectClose {varname} { upvar #0 $varname var global $varname # $var(frame) marker $var(id) delete callback move $var(proc,editCB) $var(frame) marker $var(id) delete callback edit $var(proc,editCB) $var(frame) marker $var(id) delete callback end edit $var(proc,editCB) $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc MarkerBaseAnnulusRectApply {varname} { upvar #0 $varname var global $varname set levels {} regsub -all "\n" "[$var(annulitxt) get 1.0 end]" " " levels # and trim any trailing spaces set levels [string trimright $levels " "] if {$levels != {}} { $var(frame) marker $var(id) $var(which) radius "\{$levels\}" \ $var(dcoord) $var(dformat) } MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } # callbacks proc MarkerBaseAnnulusRectCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseAnnulusRectCoordCB" } MarkerAnalysisRadialSystem $varname MarkerAnalysisStatsSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } proc MarkerBaseAnnulusRectEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseAnnulusRectEditCB" } set t [$var(frame) get marker $var(id) $var(which) radius \ $var(dcoord) $var(dformat)] set last [llength $t] set var(annuli) [expr $last/2-1] set var(radius1) [lindex $t [expr $last-2]] set var(radius2) [lindex $t [expr $last-1]] set var(radius3) [lindex $t 0] $var(annulitxt) delete 1.0 end $var(annulitxt) insert end "$t" } proc MarkerBaseAnnulusRectDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseAnnulusRectDistCB" } $var(proc,editCB) $varname } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbasecenter.tcl�������������������������������������������������������������000644 �000765 �000000 �00000004167 12464211203 020553� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBaseCenterDialog {varname} { upvar #0 $varname var global $varname # variables set var(x) 0 set var(y) 0 # base MarkerBaseDialog $varname # init MarkerBaseCenterMoveCB $varname # callbacks $var(frame) marker $var(id) callback move MarkerBaseCenterMoveCB $varname set f $var(top).param # Center ttk::label $f.tcenter -text [msgcat::mc {Center}] ttk::entry $f.centerx -textvariable ${varname}(x) -width 13 ttk::entry $f.centery -textvariable ${varname}(y) -width 13 CoordMenuButton $f.ucenter $varname system 1 sky skyformat \ [list $var(proc,coordCB) $varname] CoordMenuEnable $f.ucenter.menu $varname system 1 sky skyformat grid $f.tcenter $f.centerx $f.centery $f.ucenter -padx 2 -pady 2 -sticky w } proc MarkerBaseCenterClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback move MarkerBaseCenterMoveCB MarkerBaseClose $varname } proc MarkerBaseCenterApply {varname} { upvar #0 $varname var global $varname if {$var(x) != {} && $var(y) != {}} { $var(frame) marker $var(id) move to $var(system) $var(sky) \ $var(x) $var(y) } MarkerBaseApply $varname } proc MarkerBaseCenterRotate {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) angle $var(angle) $var(system) $var(sky) } # callbacks proc MarkerBaseCenterMoveCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseCenterMoveCB" } set center [$var(frame) get marker $var(id) center $var(system) $var(sky) \ $var(skyformat)] set var(x) [lindex $center 0] set var(y) [lindex $center 1] } proc MarkerBaseCenterRotateCB {varname {dummy {}}} { upvar #0 $varname var global $varname set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbaseline.tcl���������������������������������������������������������������000644 �000765 �000000 �00000005523 12464211203 020217� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBaseLineDialog {varname width height} { upvar #0 $varname var global $varname global pmarker # variables - some may already initialized (ruler) if {![info exists ${varname}(dcoord)]} { set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) } AdjustCoordSystem $varname dcoord # procs set var(proc,close) MarkerBaseLineClose # base MarkerBaseDialog $varname # init $var(proc,distCB) $varname # callbacks $var(frame) marker $var(id) callback move "$var(proc,editCB)" $varname $var(frame) marker $var(id) callback edit "$var(proc,editCB)" $varname set f $var(top).param # Points ttk::label $f.title -text [msgcat::mc {Points}] ttk::entry $f.x -textvariable ${varname}(x) -width 13 ttk::entry $f.y -textvariable ${varname}(y) -width 13 CoordMenuButton $f.coord $varname system 1 sky skyformat \ [list $var(proc,coordCB) $varname] CoordMenuEnable $f.coord.menu $varname system 1 sky skyformat ttk::entry $f.x2 -textvariable ${varname}(x2) -width 13 ttk::entry $f.y2 -textvariable ${varname}(y2) -width 13 # Length ttk::label $f.dtitle -text [msgcat::mc {Length}] ttk::label $f.dist -textvariable ${varname}(dist) \ -relief groove -width 12 DistMenuButton $f.udist $varname dcoord 1 dformat \ [list $var(proc,distCB) $varname] DistMenuEnable $f.udist.menu $varname dcoord 1 dformat # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::label $f.angle -textvariable ${varname}(angle) \ -relief groove -width 12 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.title $f.x $f.y $f.coord -padx 2 -pady 2 -sticky w grid x $f.x2 $f.y2 -padx 2 -pady 2 -sticky w grid $f.dtitle $f.dist $f.udist -padx 2 -pady 2 -sticky w grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w } proc MarkerBaseLineClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback move "$var(proc,editCB)" $var(frame) marker $var(id) delete callback edit "$var(proc,editCB)" MarkerBaseClose $varname } proc MarkerBaseLineApply {varname} { upvar #0 $varname var global $varname MarkerBaseApply $varname } proc MarkerBaseLineEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBaseLineEditCB" } set p [$var(frame) get marker $var(id) $var(which) point $var(system) \ $var(sky) $var(skyformat)] set var(x) [lindex $p 0] set var(y) [lindex $p 1] set var(x2) [lindex $p 2] set var(y2) [lindex $p 3] } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbasepanda.tcl��������������������������������������������������������������000644 �000765 �000000 �00000013124 12464211203 020347� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBasePandaDialog {varname} { upvar #0 $varname var global $varname global pmarker # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord set var(method) dist set var(init) 0 # base MarkerBaseAnnulusDialog $varname # menus MarkerBaseAnnulusMethodMenu $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisPandaDialog $varname # callbacks # $var(frame) marker $var(id) callback move $var(proc,editCB) $varname $var(frame) marker $var(id) callback edit $var(proc,editCB) $varname $var(frame) marker $var(id) callback end edit $var(proc,editCB) $varname set f $var(top).param # Angles ttk::label $f.tang1 -text [msgcat::mc {Start}] ttk::label $f.tang2 -text [msgcat::mc {End}] ttk::label $f.tangles -text [msgcat::mc {Angles}] ttk::entry $f.ang1 -textvariable ${varname}(ang1) -width 13 ttk::entry $f.ang2 -textvariable ${varname}(ang2) -width 13 ttk::label $f.uangles -text [msgcat::mc {Degrees}] ttk::label $f.tangnum -text [msgcat::mc {Number}] ttk::entry $f.angnum -textvariable ${varname}(angnum) -width 13 grid x $f.tang1 $f.tang2 -padx 2 -pady 2 -sticky w grid $f.tangles $f.ang1 $f.ang2 $f.uangles -padx 2 -pady 2 -sticky w grid $f.tangnum $f.angnum -padx 2 -pady 2 -sticky w # Radius set f [ttk::labelframe $var(top).radius -text [msgcat::mc {Radius}] \ -padding 2] set var(annulitxt) [text $f.txt \ -height 15 \ -width 15 \ -wrap none \ -font [font actual TkDefaultFont] \ -yscrollcommand [list $f.yscroll set] \ ] ttk::scrollbar $f.yscroll -command [list $var(annulitxt) yview] \ -orient vertical grid $var(annulitxt) $f.yscroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Radius Fini grid $var(top).radius -row 0 -column 1 -sticky news grid rowconfigure $var(top) 0 -weight 1 grid columnconfigure $var(top) 1 -weight 1 # Angles set f [ttk::labelframe $var(top).angles -text [msgcat::mc {Angles}] \ -padding 2] set var(angtxt) [text $f.txt \ -height 15 \ -width 15 \ -wrap none \ -font [font actual TkDefaultFont] \ -yscrollcommand [list $f.yscroll set] \ ] ttk::scrollbar $f.yscroll -command [list $var(angtxt) yview] \ -orient vertical grid $var(angtxt) $f.yscroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 # Angles Fini grid $var(top).angles -row 0 -column 2 -sticky news grid rowconfigure $var(top) 0 -weight 1 grid columnconfigure $var(top) 2 -weight 1 set var(init) 1 } # actions proc MarkerBasePandaClose {varname} { upvar #0 $varname var global $varname # $var(frame) marker $var(id) delete callback move $var(proc,editCB) $var(frame) marker $var(id) delete callback edit $var(proc,editCB) $var(frame) marker $var(id) delete callback end edit $var(proc,editCB) MarkerBaseCenterClose $varname } proc MarkerBasePandaApply {varname} { upvar #0 $varname var global $varname set levels {} regsub -all "\n" "[$var(annulitxt) get 1.0 end]" " " levels # and trim any trailing spaces set levels [string trimright $levels " "] set angles {} regsub -all "\n" "[$var(angtxt) get 1.0 end]" " " angles # and trim any trailing spaces set angles [string trimright $angles " "] if {($levels != {}) && ($angles != {})} { $var(frame) marker $var(id) $var(which) edit \ "\{$angles\}" "\{$levels\}" $var(system) $var(sky) \ $var(dcoord) $var(dformat) } MarkerBaseCenterApply $varname } proc MarkerBasePandaGenerateAngles {varname} { upvar #0 $varname var global $varname $var(angtxt) delete 1.0 end set ang1 $var(ang1) set ang2 $var(ang2) set angnum $var(angnum) if {($ang1 != {}) && ($ang2 != {}) && ($angnum != {})} { # normalize between 0 <= ang < 360 if {[::math::fuzzy::tgt $ang1 0]} { while {[::math::fuzzy::tge $ang1 360]} { set ang1 [expr $ang1-360] } } else { while {[::math::fuzzy::tlt $ang1 0]} { set ang1 [expr $ang1+360] } } if {[::math::fuzzy::tgt $ang2 0]} { while {[::math::fuzzy::tge $ang2 360]} { set ang2 [expr $ang2-360] } } else { while {[::math::fuzzy::tlt $ang2 0]} { set ang2 [expr $ang2+360] } } # with ang2 > ang1 while {[::math::fuzzy::tge $ang1 $ang2]} { set ang2 [expr $ang2+360] } for {set i 0} {$i<=$angnum} {incr i} { set v [expr ((($ang2-$ang1)/double($angnum))*$i)+$ang1] $var(angtxt) insert end "$v\n" } } } # callbacks proc MarkerBasePandaCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePandaCoordCB" } MarkerAnalysisPandaSystem $varname MarkerAnalysisStatsSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname if {$var(init)} { $var(proc,editCB) $varname } } proc MarkerBasePandaDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePandaDistCB" } $var(proc,editCB) $varname } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/markerbasepandarect.tcl����������������������������������������������������������000644 �000765 �000000 �00000006734 12464211203 021236� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerBasePandaRectDialog {varname} { upvar #0 $varname var global $varname # base panda dialog MarkerBasePandaDialog $varname # callbacks $var(frame) marker $var(id) callback rotate \ MarkerBaseCenterRotateCB $varname set f $var(top).param # Radius ttk::label $f.tmajor -text [msgcat::mc {Major}] ttk::label $f.tminor -text [msgcat::mc {Minor}] ttk::label $f.touter -text [msgcat::mc {Outer}] ttk::entry $f.radius1 -textvariable ${varname}(radius1) -width 13 ttk::entry $f.radius2 -textvariable ${varname}(radius2) -width 13 DistMenuButton $f.uradius $varname dcoord 1 dformat \ [list $var(proc,distCB) $varname] DistMenuEnable $f.uradius.menu $varname dcoord 1 dformat ttk::label $f.tinner -text [msgcat::mc {Inner}] ttk::entry $f.radius3 -textvariable ${varname}(radius3) -width 13 # Annuli ttk::label $f.tannuli -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable ${varname}(annuli) -width 13 grid x $f.tmajor $f.tminor -padx 2 -pady 2 -sticky w grid $f.touter $f.radius1 $f.radius2 $f.uradius -padx 2 -pady 2 -sticky w grid $f.tinner $f.radius3 -padx 2 -pady 2 -sticky w grid $f.tannuli $f.annuli -padx 2 -pady 2 -sticky w # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w # init - do this last $var(proc,distCB) $varname MarkerBaseCenterRotateCB $varname } # actions proc MarkerBasePandaRectClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBasePandaClose $varname } proc MarkerBasePandaRectApply {varname} { upvar #0 $varname var global $varname MarkerBasePandaApply $varname MarkerBaseCenterRotate $varname } # callbacks proc MarkerBasePandaRectCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePandaRectCoordCB" } MarkerBasePandaCoordCB $varname MarkerBaseCenterRotateCB $varname } proc MarkerBasePandaRectEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePandaRectEditCB" } set t [$var(frame) get marker $var(id) epanda radius \ $var(dcoord) $var(dformat)] set last [llength $t] set var(annuli) [expr $last/2-1] set var(radius1) [lindex $t [expr $last-2]] set var(radius2) [lindex $t [expr $last-1]] set var(radius3) [lindex $t 0] $var(annulitxt) delete 1.0 end $var(annulitxt) insert end "$t" set a [$var(frame) get marker $var(id) $var(which) angle \ $var(system) $var(sky)] set last [expr [llength $a]-1] set var(ang1) [lindex $a 0] set var(ang2) [lindex $a $last] set var(angnum) $last $var(angtxt) delete 1.0 end $var(angtxt) insert end "$a" } proc MarkerBasePandaRectDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "MarkerBasePandaRectDistCB" } MarkerBasePandaDistCB $varname } ������������������������������������saods9/ds9/library/markerdialog.tcl�����������������������������������������������������������������000644 �000765 �000000 �00000020422 12464211203 017667� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MarkerLoadDialog {} { global marker global ed global current global wcs set w {.mkd} set ed(ok) 0 set ed(format) $marker(format) set ed(load) $marker(load) set ed(frame) $current(frame) set ed(system) $wcs(system) set ed(sky) $wcs(sky) set ed(skyformat) $wcs(skyformat) AdjustCoordSystem ed system DialogCreate $w [msgcat::mc {Load Regions}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.formattitle -text [msgcat::mc {Format}] set m $f.formatbutton.menu ttk::menubutton $f.formatbutton -textvariable ed(format) -menu $m ttk::label $f.coordtitle -text [msgcat::mc {Coordinate System}] set ed(cb) $f.coordbutton CoordMenuButton $ed(cb) ed system 1 sky skyformat {} ttk::radiobutton $f.current -text [msgcat::mc {Load into Current Frame}] \ -variable ed(load) -value current ttk::radiobutton $f.all -text [msgcat::mc {Load into All Frames}] \ -variable ed(load) -value all menu $m $m add radiobutton -label {DS9/Funtools} -variable ed(format) -value ds9 \ -command UpdateMarkerLoadDialog $m add radiobutton -label {XML} -variable ed(format) -value xml \ -command UpdateMarkerLoadDialog $m add radiobutton -label {CIAO} -variable ed(format) -value ciao \ -command UpdateMarkerLoadDialog $m add radiobutton -label {SAOtng} -variable ed(format) -value saotng \ -command UpdateMarkerLoadDialog $m add radiobutton -label {SAOimage} -variable ed(format) -value saoimage \ -command UpdateMarkerLoadDialog $m add radiobutton -label {IRAF PROS} -variable ed(format) -value pros \ -command UpdateMarkerLoadDialog $m add radiobutton -label {X Y} -variable ed(format) -value xy \ -command UpdateMarkerLoadDialog grid $f.formattitle $f.formatbutton -padx 2 -pady 2 -sticky w grid $f.coordtitle $f.coordbutton -padx 2 -pady 2 -sticky w grid $f.current - -padx 2 -pady 2 -sticky w grid $f.all - -padx 2 -pady 2 -sticky w # Button set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true UpdateMarkerLoadDialog DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set marker(format) $ed(format) set marker(system) $ed(system) set marker(sky) $ed(sky) set marker(skyformat) $ed(skyformat) set marker(load) $ed(load) } set rr $ed(ok) unset ed return $rr } proc UpdateMarkerLoadDialog {} { global ed global current set mm $ed(cb).menu set ed(frame) $current(frame) CoordMenuEnable $mm ed system 1 sky skyformat switch -- $ed(format) { xy {$ed(cb) configure -state normal} default {$ed(cb) configure -state disabled} } AdjustCoordSystem ed system CoordMenuButtonCmd ed system sky {} } proc MarkerSaveDialog {title} { global marker global ed global current global wcs set w {.mkd} set ed(ok) 0 set ed(format) $marker(format) set ed(frame) $current(frame) set ed(system) $wcs(system) set ed(sky) $wcs(sky) set ed(skyformat) $wcs(skyformat) AdjustCoordSystem ed system DialogCreate $w $title ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.formattitle -text [msgcat::mc {Format}] set m $f.formatbutton.menu ttk::menubutton $f.formatbutton -textvariable ed(format) -menu $m ttk::label $f.coordtitle -text [msgcat::mc {Coordinate System}] set ed(cb) $f.coordbutton CoordMenuButton $ed(cb) ed system 1 sky skyformat UpdateMarkerSaveDialog menu $m $m add radiobutton -label {DS9/Funtools} -variable ed(format) -value ds9 \ -command UpdateMarkerSaveDialog $m add radiobutton -label {XML} -variable ed(format) -value xml \ -command UpdateMarkerSaveDialog $m add radiobutton -label {CIAO} -variable ed(format) -value ciao \ -command UpdateMarkerSaveDialog $m add radiobutton -label {SAOtng} -variable ed(format) -value saotng \ -command UpdateMarkerSaveDialog $m add radiobutton -label {SAOimage} -variable ed(format) -value saoimage \ -command UpdateMarkerSaveDialog $m add radiobutton -label {IRAF PROS} -variable ed(format) -value pros \ -command UpdateMarkerSaveDialog $m add radiobutton -label {X Y} -variable ed(format) -value xy \ -command UpdateMarkerSaveDialog grid $f.formattitle $f.formatbutton -padx 2 -pady 2 -sticky w grid $f.coordtitle $f.coordbutton -padx 2 -pady 2 -sticky w # Button set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true UpdateMarkerSaveDialog DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set marker(format) $ed(format) set marker(system) $ed(system) set marker(sky) $ed(sky) set marker(skyformat) $ed(skyformat) } set rr $ed(ok) unset ed return $rr } proc UpdateMarkerSaveDialog {} { global ed global current set mm $ed(cb).menu set ed(frame) $current(frame) CoordMenuEnable $mm ed system 1 sky skyformat switch -- $ed(format) { ds9 - xml - xy {} ciao { switch -- $ed(system) { detector - amplifier - physical - image {set ed(system) physical} wcs - default {set ed(system) wcs} } set ed(sky) fk5 set ed(skyformat) sexagesimal $mm entryconfig [msgcat::mc {Multiple WCS}] -state disabled $mm entryconfig [msgcat::mc {Image}] -state disabled $mm entryconfig [msgcat::mc {Amplifier}] -state disabled $mm entryconfig [msgcat::mc {Detector}] -state disabled $mm entryconfig [msgcat::mc {FK4}] -state disabled $mm entryconfig [msgcat::mc {ICRS}] -state disabled $mm entryconfig [msgcat::mc {Galactic}] -state disabled $mm entryconfig [msgcat::mc {Ecliptic}] -state disabled $mm entryconfig [msgcat::mc {Degrees}] -state disabled } saotng { switch -- $ed(system) { detector - amplifier - image - physical {set ed(system) image} wcs - default {set ed(system) wcs} } $mm entryconfig [msgcat::mc {Multiple WCS}] -state disabled $mm entryconfig [msgcat::mc {Physical}] -state disabled $mm entryconfig [msgcat::mc {Amplifier}] -state disabled $mm entryconfig [msgcat::mc {Detector}] -state disabled } saoimage { set ed(system) image $mm entryconfig [msgcat::mc {WCS}] -state disabled $mm entryconfig [msgcat::mc {Multiple WCS}] -state disabled $mm entryconfig [msgcat::mc {Physical}] -state disabled $mm entryconfig [msgcat::mc {Amplifier}] -state disabled $mm entryconfig [msgcat::mc {Detector}] -state disabled $mm entryconfig [msgcat::mc {FK4}] -state disabled $mm entryconfig [msgcat::mc {FK5}] -state disabled $mm entryconfig [msgcat::mc {ICRS}] -state disabled $mm entryconfig [msgcat::mc {Galactic}] -state disabled $mm entryconfig [msgcat::mc {Ecliptic}] -state disabled $mm entryconfig [msgcat::mc {Degrees}] -state disabled $mm entryconfig {Sexagesimal} -state disabled } pros { switch -- $ed(system) { detector - physical - amplifier {set ed(system) physical} image {} wcs - default {set ed(system) wcs} } if {$ed(sky) == {icrs}} { set ed(sky) fk5 } $mm entryconfig [msgcat::mc {Multiple WCS}] -state disabled $mm entryconfig [msgcat::mc {Amplifier}] -state disabled $mm entryconfig [msgcat::mc {Detector}] -state disabled $mm entryconfig [msgcat::mc {ICRS}] -state disabled } } AdjustCoordSystem ed system CoordMenuButtonCmd ed system sky {} } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mask.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000015725 12613477345 016214� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MaskDef {} { global mask global imask global pmask set imask(top) .msk set imask(mb) .mskmb set mask(color) red set mask(mark) 1 set mask(transparency) 0 array set pmask [array get mask] } proc MaskTransparency {} { global mask global current if {$current(frame) != {}} { $current(frame) mask transparency $mask(transparency) } } proc MaskClear {} { global current if {$current(frame) != {}} { $current(frame) mask clear } } proc MaskDialog {} { global mask global imask global current global ds9 # see if we already have a ctr window visible if {[winfo exists $imask(top)]} { raise $imask(top) return } # create the mask window set w $imask(top) set mb $imask(mb) Toplevel $w $mb 6 [msgcat::mc {Mask Parameters}] MaskDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label "[msgcat::mc {Open}]..." \ -command [list OpenDialog fits mask] $mb.file add cascade -label [msgcat::mc {Open as}] \ -menu $mb.file.open $mb.file add separator $mb.file add cascade -label [msgcat::mc {Import}] \ -menu $mb.file.import $mb.file add separator $mb.file add command -label [msgcat::mc {Apply}] -command MaskApplyDialog $mb.file add command -label [msgcat::mc {Clear}] -command MaskClear $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command MaskDestroyDialog menu $mb.file.open $mb.file.open add command \ -label "[msgcat::mc {Mosaic WCS}]..." \ -command [list OpenDialog mosaicimagewcs mask] $mb.file.open add command \ -label "[msgcat::mc {Mosaic WCS Segment}]..." \ -command [list OpenDialog mosaicwcs mask] $mb.file.open add command \ -label "[msgcat::mc {Mosaic IRAF}]..." \ -command [list OpenDialog mosaicimageiraf mask] $mb.file.open add command \ -label "[msgcat::mc {Mosaic IRAF Segment}]..." \ -command [list OpenDialog mosaiciraf mask] menu $mb.file.import $mb.file.import add command \ -label "[msgcat::mc {Array}]..." \ -command [list ImportDialog array mask] $mb.file.import add command \ -label "[msgcat::mc {NRRD}]..." \ -command [list ImportDialog nrrd mask] EditMenu $mb imask # Param set f [ttk::frame $w.param] slider $f.slider 0 100 [msgcat::mc {Transparency}] \ mask(transparency) [list MaskTransparency] grid $f.slider -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command MaskApplyDialog ttk::button $f.clear -text [msgcat::mc {Clear}] -command MaskClear ttk::button $f.close -text [msgcat::mc {Close}] -command MaskDestroyDialog pack $f.apply $f.clear $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true } proc MaskApplyDialog {} { global mask MaskTransparency } proc MaskDestroyDialog {} { global imask if {[winfo exists $imask(top)]} { destroy $imask(top) destroy $imask(mb) } } proc UpdateMaskMenu {} { global mask global current global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateMaskMenu" } if {$current(frame) == {}} { return } set mask(color) [$current(frame) get mask color] set mask(mark) [$current(frame) get mask mark] set mask(transparency) [$current(frame) get mask transparency] switch -- [$current(frame) get type] { base { $ds9(mb).analysis entryconfig \ "[msgcat::mc {Mask Parameters}]..." -state normal } 3d - rgb { $ds9(mb).analysis entryconfig \ "[msgcat::mc {Mask Parameters}]..." -state disabled } } } proc MaskLoad {} { global current global mask set rr [MaskParamsDialog] if {$current(frame) != {}} { if {$rr} { $current(frame) mask color $mask(color) $current(frame) mask mark $mask(mark) } } return $rr } proc MaskParamsDialog {} { global mask global ed set w {.mskd} set ed(ok) 0 set ed(color) $mask(color) set ed(mark) $mask(mark) DialogCreate $w [msgcat::mc {Mask Parameters}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.colortitle -text [msgcat::mc {Color}] ColorMenuButton $f.colorbutton ed color {} ttk::label $f.marktitle -text [msgcat::mc {Block}] ttk::radiobutton $f.markz -text [msgcat::mc {Zero}] \ -variable ed(mark) -value 0 ttk::radiobutton $f.marknz -text [msgcat::mc {Non-zero}] \ -variable ed(mark) -value 1 ttk::label $f.marktitle2 -text [msgcat::mc {Value}] grid $f.colortitle $f.colorbutton - -padx 2 -pady 2 -sticky w grid $f.marktitle $f.markz $f.marknz $f.marktitle2 -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set mask(color) [string tolower $ed(color)] set mask(mark) $ed(mark) } set rr $ed(ok) unset ed return $rr } proc MaskBackup {ch which} { puts $ch "$which mask color [$which get mask color]" puts $ch "$which mask mark [$which get mask mark]" puts $ch "$which mask transparency [$which get mask transparency]" } proc ProcessMaskCmd {varname iname} { upvar $varname var upvar $iname i global mask global current set rr {} switch -- [string tolower [lindex $var $i]] { open {MaskDialog} close {MaskDestroyDialog} color { incr i set mask(color) [lindex $var $i] if {$current(frame) != {}} { $current(frame) mask color $mask(color) } } mark { incr i set mask(mark) [lindex $var $i] if {$current(frame) != {}} { $current(frame) mask mark $mask(mark) } } transparency { incr i set mask(transparency) [lindex $var $i] if {$current(frame) != {}} { $current(frame) mask transparency $mask(transparency) } MaskTransparency } clear { MaskClear } default { set rr mask incr i -1 } } return $rr } proc ProcessSendMaskCmd {proc id param} { global mask switch -- [string tolower $param] { color {$proc $id "$mask(color)\n"} mark {$proc $id "$mask(mark)\n"} transparency {$proc $id "$mask(transparency)\n"} } } �������������������������������������������saods9/ds9/library/mbin.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000031313 12464211204 016155� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menu proc BinMainMenu {} { global ds9 menu $ds9(mb).bin $ds9(mb).bin add radiobutton -label [msgcat::mc {Average}] \ -variable bin(function) -value average -command ChangeBinFunction $ds9(mb).bin add radiobutton -label [msgcat::mc {Sum}] \ -variable bin(function) -value sum -command ChangeBinFunction $ds9(mb).bin add separator $ds9(mb).bin add command -label [msgcat::mc {Bin In}] \ -command {Bin .5 .5} $ds9(mb).bin add command -label [msgcat::mc {Bin Out}] \ -command {Bin 2 2} $ds9(mb).bin add command -label [msgcat::mc {Bin Fit}] \ -command BinToFit $ds9(mb).bin add separator $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 1" \ -variable bin(factor) -value { 1 1 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 2" \ -variable bin(factor) -value { 2 2 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 4" \ -variable bin(factor) -value { 4 4 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 8" \ -variable bin(factor) -value { 8 8 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 16" \ -variable bin(factor) -value { 16 16 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 32" \ -variable bin(factor) -value { 32 32 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 64" \ -variable bin(factor) -value { 64 64 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 128" \ -variable bin(factor) -value { 128 128 } -command ChangeBinFactor $ds9(mb).bin add radiobutton -label "[msgcat::mc {Bin}] 256" \ -variable bin(factor) -value { 256 256 } -command ChangeBinFactor $ds9(mb).bin add separator $ds9(mb).bin add radiobutton -label {128x128} \ -variable bin(buffersize) -value 128 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {256x256} \ -variable bin(buffersize) -value 256 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {512x512} \ -variable bin(buffersize) -value 512 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {1024x1024} \ -variable bin(buffersize) -value 1024 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {2048x2048} \ -variable bin(buffersize) -value 2048 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {4096x4096} \ -variable bin(buffersize) -value 4096 -command ChangeBinBufferSize $ds9(mb).bin add radiobutton -label {8192x8192} \ -variable bin(buffersize) -value 8192 -command ChangeBinBufferSize $ds9(mb).bin add separator $ds9(mb).bin add command -label "[msgcat::mc {Binning Parameters}]..." \ -command BinDialog } proc PrefsDialogBinMenu {w} { set f [ttk::labelframe $w.mbin -text [msgcat::mc {Bin}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarBin $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add radiobutton -label [msgcat::mc {Average}] \ -variable pbin(function) -value average $m add radiobutton -label [msgcat::mc {Sum}] \ -variable pbin(function) -value sum $m add separator $m add radiobutton -label "[msgcat::mc {Bin}] 1" \ -variable pbin(factor) -value { 1 1 } $m add radiobutton -label "[msgcat::mc {Bin}] 2" \ -variable pbin(factor) -value { 2 2 } $m add radiobutton -label "[msgcat::mc {Bin}] 4" \ -variable pbin(factor) -value { 4 4 } $m add radiobutton -label "[msgcat::mc {Bin}] 8" \ -variable pbin(factor) -value { 8 8 } $m add radiobutton -label "[msgcat::mc {Bin}] 16" \ -variable pbin(factor) -value { 16 16 } $m add radiobutton -label "[msgcat::mc {Bin}] 32" \ -variable pbin(factor) -value { 32 32 } $m add radiobutton -label "[msgcat::mc {Bin}] 64" \ -variable pbin(factor) -value { 64 64 } $m add radiobutton -label "[msgcat::mc {Bin}] 128" \ -variable pbin(factor) -value { 128 128 } $m add radiobutton -label "[msgcat::mc {Bin}] 256" \ -variable pbin(factor) -value { 256 256 } $m add separator $m add radiobutton -label {128x128} -variable pbin(buffersize) -value 128 $m add radiobutton -label {256x256} -variable pbin(buffersize) -value 256 $m add radiobutton -label {512x512} -variable pbin(buffersize) -value 512 $m add radiobutton -label {1024x1204} -variable pbin(buffersize) -value 1024 $m add radiobutton -label {2048x2048} -variable pbin(buffersize) -value 2048 $m add radiobutton -label {4096x4096} -variable pbin(buffersize) -value 4096 $m add radiobutton -label {8192x8192} -variable pbin(buffersize) -value 8192 pack $f -side top -fill both -expand true } proc PrefsDialogBin {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Bin}] lappend dprefs(tabs) [ttk::frame $w.bin] # Mouse set f [ttk::labelframe $w.bin.mouse -text [msgcat::mc {Mouse Wheel Bin}]] ttk::checkbutton $f.click -text [msgcat::mc {Enable}] \ -variable pbin(wheel) ttk::label $f.title2 -text [msgcat::mc {Factor}] ttk::entry $f.factor -textvariable pbin(wheel,factor) -width 10 grid $f.click $f.title2 $f.factor -padx 2 -pady 2 -sticky w pack $w.bin.mouse -side top -fill both -expand true } # Buttons proc ButtonsBinDef {} { global pbuttons array set pbuttons { bin,average 0 bin,sum 0 bin,in 1 bin,out 1 bin,fit 1 bin,1 1 bin,2 1 bin,4 1 bin,8 1 bin,16 1 bin,32 1 bin,64 1 bin,128 0 bin,256 0 bin,128x 0 bin,256x 0 bin,512x 0 bin,1024x 0 bin,2048x 0 bin,4096x 0 bin,8192x 0 bin,params 0 } } proc CreateButtonsBin {} { global buttons global ds9 ttk::frame $ds9(buttons).bin RadioButton $ds9(buttons).bin.average \ [string tolower [msgcat::mc {Average}]] \ bin(function) average ChangeBinFunction RadioButton $ds9(buttons).bin.sum \ [string tolower [msgcat::mc {Sum}]] \ bin(function) sum ChangeBinFunction ButtonButton $ds9(buttons).bin.in \ [string tolower [msgcat::mc {Bin In}]] {Bin .5 .5} ButtonButton $ds9(buttons).bin.out \ [string tolower [msgcat::mc {Bin Out}]] {Bin 2 2} ButtonButton $ds9(buttons).bin.fit \ [string tolower [msgcat::mc {Bin Fit}]] BinToFit RadioButton $ds9(buttons).bin.1 \ "[string tolower [msgcat::mc {Bin}]] 1" \ bin(factor) { 1 1 } ChangeBinFactor RadioButton $ds9(buttons).bin.2 \ "[string tolower [msgcat::mc {Bin}]] 2" \ bin(factor) { 2 2 } ChangeBinFactor RadioButton $ds9(buttons).bin.4 \ "[string tolower [msgcat::mc {Bin}]] 4" \ bin(factor) { 4 4 } ChangeBinFactor RadioButton $ds9(buttons).bin.8 \ "[string tolower [msgcat::mc {Bin}]] 8" \ bin(factor) { 8 8 } ChangeBinFactor RadioButton $ds9(buttons).bin.16 \ "[string tolower [msgcat::mc {Bin}]] 16" \ bin(factor) { 16 16 } ChangeBinFactor RadioButton $ds9(buttons).bin.32 \ "[string tolower [msgcat::mc {Bin}]] 32" \ bin(factor) { 32 32 } ChangeBinFactor RadioButton $ds9(buttons).bin.64 \ "[string tolower [msgcat::mc {Bin}]] 64" \ bin(factor) { 64 64 } ChangeBinFactor RadioButton $ds9(buttons).bin.128 \ "[string tolower [msgcat::mc {Bin}]] 128" \ bin(factor) { 128 128 } ChangeBinFactor RadioButton $ds9(buttons).bin.256 \ "[string tolower [msgcat::mc {Bin}]] 256" \ bin(factor) { 256 256 } ChangeBinFactor RadioButton $ds9(buttons).bin.128x {128x128} \ bin(buffersize) 128 ChangeBinBufferSize RadioButton $ds9(buttons).bin.256x {256x256} \ bin(buffersize) 256 ChangeBinBufferSize RadioButton $ds9(buttons).bin.512x {512x512} \ bin(buffersize) 512 ChangeBinBufferSize RadioButton $ds9(buttons).bin.1024x {1024x1024} \ bin(buffersize) 1024 ChangeBinBufferSize RadioButton $ds9(buttons).bin.2048x {2048x2048} \ bin(buffersize) 2048 ChangeBinBufferSize RadioButton $ds9(buttons).bin.4096x {4096x4096} \ bin(buffersize) 4096 ChangeBinBufferSize RadioButton $ds9(buttons).bin.8192x {8192x8192} \ bin(buffersize) 8192 ChangeBinBufferSize ButtonButton $ds9(buttons).bin.params \ [string tolower [msgcat::mc {Parameters}]] BinDialog set buttons(bin) " $ds9(buttons).bin.average pbuttons(bin,average) $ds9(buttons).bin.sum pbuttons(bin,sum) $ds9(buttons).bin.in pbuttons(bin,in) $ds9(buttons).bin.out pbuttons(bin,out) $ds9(buttons).bin.fit pbuttons(bin,fit) $ds9(buttons).bin.1 pbuttons(bin,1) $ds9(buttons).bin.2 pbuttons(bin,2) $ds9(buttons).bin.4 pbuttons(bin,4) $ds9(buttons).bin.8 pbuttons(bin,8) $ds9(buttons).bin.16 pbuttons(bin,16) $ds9(buttons).bin.32 pbuttons(bin,32) $ds9(buttons).bin.64 pbuttons(bin,64) $ds9(buttons).bin.128 pbuttons(bin,128) $ds9(buttons).bin.256 pbuttons(bin,256) $ds9(buttons).bin.128x pbuttons(bin,128x) $ds9(buttons).bin.256x pbuttons(bin,256x) $ds9(buttons).bin.512x pbuttons(bin,512x) $ds9(buttons).bin.1024x pbuttons(bin,1024x) $ds9(buttons).bin.2048x pbuttons(bin,2048x) $ds9(buttons).bin.4096x pbuttons(bin,4096x) $ds9(buttons).bin.8192x pbuttons(bin,8192x) $ds9(buttons).bin.params pbuttons(bin,params) " } proc PrefsDialogButtonbarBin {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Average}] \ -variable pbuttons(bin,average) -command {UpdateButtons buttons(bin)} $m add checkbutton -label [msgcat::mc {Sum}] \ -variable pbuttons(bin,sum) -command {UpdateButtons buttons(bin)} $m add separator $m add checkbutton -label [msgcat::mc {Bin In}] \ -variable pbuttons(bin,in) -command {UpdateButtons buttons(bin)} $m add checkbutton -label [msgcat::mc {Bin Out}] \ -variable pbuttons(bin,out) -command {UpdateButtons buttons(bin)} $m add checkbutton -label [msgcat::mc {Bin Fit}] \ -variable pbuttons(bin,fit) -command {UpdateButtons buttons(bin)} $m add separator $m add checkbutton -label "[msgcat::mc {Bin}] 1" \ -variable pbuttons(bin,1) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 2" \ -variable pbuttons(bin,2) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 4" \ -variable pbuttons(bin,4) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 8" \ -variable pbuttons(bin,8) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 16" \ -variable pbuttons(bin,16) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 32" \ -variable pbuttons(bin,32) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 64" \ -variable pbuttons(bin,64) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 128" \ -variable pbuttons(bin,128) -command {UpdateButtons buttons(bin)} $m add checkbutton -label "[msgcat::mc {Bin}] 256" \ -variable pbuttons(bin,256) -command {UpdateButtons buttons(bin)} $m add separator $m add checkbutton -label {128x128} \ -variable pbuttons(bin,128x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {256x256} \ -variable pbuttons(bin,256x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {512x512} \ -variable pbuttons(bin,512x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {1024x1204} \ -variable pbuttons(bin,1024x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {2048x2048} \ -variable pbuttons(bin,2048x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {4096x4096} \ -variable pbuttons(bin,4096x) -command {UpdateButtons buttons(bin)} $m add checkbutton -label {8192x8192} \ -variable pbuttons(bin,8192x) -command {UpdateButtons buttons(bin)} $m add separator $m add checkbutton -label "[msgcat::mc {Binning Parameters}]..." \ -variable pbuttons(bin,params) -command {UpdateButtons buttons(bin)} } # Support proc UpdateBinMenu {} { global ds9 global current global bin global debug if {$debug(tcl,update)} { puts stderr "UpdateBinMenu" } if {$current(frame) != {}} { if {[$current(frame) has fits]} { if {[$current(frame) has fits bin]} { $ds9(mb) entryconfig [msgcat::mc {Bin}] -state normal } else { $ds9(mb) entryconfig [msgcat::mc {Bin}] -state disabled } } else { $ds9(mb) entryconfig [msgcat::mc {Bin}] -state normal } set bin(function) [$current(frame) get bin function] set bin(factor) "[$current(frame) get bin factor]" set bin(depth) [$current(frame) get bin depth] set bin(buffersize) [$current(frame) get bin buffer size] } else { $ds9(mb) entryconfig [msgcat::mc {Bin}] -state disabled } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mcolor.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000036150 12567631621 016544� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus # Default colormap names # [msgcat::mc {grey}] # [msgcat::mc {red}] # [msgcat::mc {green}] # [msgcat::mc {blue}] # [msgcat::mc {heat}] # [msgcat::mc {cool}] # [msgcat::mc {rainbow}] # [msgcat::mc {standard}] # [msgcat::mc {staircase}] # [msgcat::mc {color}] proc ColorMainMenu {} { global colorbar global icolorbar global ds9 menu $ds9(mb).color set id [colorbar list id] # base foreach jj $id { set name [colorbar get name $jj] $ds9(mb).color add radiobutton \ -label [msgcat::mc $name] \ -variable colorbar(map) -value $name \ -command "ChangeColormapID $jj" incr icolorbar(count) } set icolorbar(end) $icolorbar(count) set icolorbar(h5) $icolorbar(count) set icolorbar(matplotlib) $icolorbar(count) set icolorbar(cubehelix) $icolorbar(count) set icolorbar(gist) $icolorbar(count) set icolorbar(topo) $icolorbar(count) set icolorbar(user) $icolorbar(count) $ds9(mb).color add separator $ds9(mb).color add cascade -label [msgcat::mc {h5utils}] \ -menu $ds9(mb).color.h5 $ds9(mb).color add cascade -label [msgcat::mc {Matplotlib}] \ -menu $ds9(mb).color.matplotlib $ds9(mb).color add cascade -label [msgcat::mc {Cubehelix}] \ -menu $ds9(mb).color.cubehelix $ds9(mb).color add cascade -label [msgcat::mc {Gist}] \ -menu $ds9(mb).color.gist $ds9(mb).color add cascade -label [msgcat::mc {Topographic}] \ -menu $ds9(mb).color.topo $ds9(mb).color add cascade -label [msgcat::mc {User}] \ -menu $ds9(mb).color.user $ds9(mb).color add separator $ds9(mb).color add checkbutton -label [msgcat::mc {Invert Colormap}] \ -variable colorbar(invert) -command InvertColorbar $ds9(mb).color add command -label [msgcat::mc {Reset Colormap}] \ -command ResetColormap $ds9(mb).color add separator $ds9(mb).color add cascade -label [msgcat::mc {Colorbar}] \ -menu $ds9(mb).color.colorbar $ds9(mb).color add separator $ds9(mb).color add command -label "[msgcat::mc {Colormap Parameters}]..." \ -command ColormapDialog menu $ds9(mb).color.h5 menu $ds9(mb).color.matplotlib menu $ds9(mb).color.cubehelix menu $ds9(mb).color.gist menu $ds9(mb).color.topo menu $ds9(mb).color.user menu $ds9(mb).color.colorbar $ds9(mb).color.colorbar add cascade -label [msgcat::mc {Orientation}] \ -menu $ds9(mb).color.colorbar.orient $ds9(mb).color.colorbar add cascade -label [msgcat::mc {Numerics}] \ -menu $ds9(mb).color.colorbar.numerics $ds9(mb).color.colorbar add cascade -label [msgcat::mc {Font}] \ -menu $ds9(mb).color.colorbar.cb $ds9(mb).color.colorbar add separator $ds9(mb).color.colorbar add command \ -label "[msgcat::mc {Size}]..." \ -command ColorbarSizeDialog $ds9(mb).color.colorbar add command \ -label "[msgcat::mc {Number of Ticks}]..." \ -command TicksDialog menu $ds9(mb).color.colorbar.orient $ds9(mb).color.colorbar.orient add radiobutton \ -label [msgcat::mc {Horizontal}] -variable colorbar(orientation) \ -value horizontal -command UpdateView $ds9(mb).color.colorbar.orient add radiobutton \ -label [msgcat::mc {Vertical}] -variable colorbar(orientation) \ -value vertical -command UpdateView menu $ds9(mb).color.colorbar.numerics $ds9(mb).color.colorbar.numerics add checkbutton \ -label [msgcat::mc {Show}] -variable colorbar(numerics) \ -command UpdateView $ds9(mb).color.colorbar.numerics add separator $ds9(mb).color.colorbar.numerics add radiobutton \ -label [msgcat::mc {Space Equal Value}] -variable colorbar(space) \ -value 1 -command UpdateView $ds9(mb).color.colorbar.numerics add radiobutton \ -label [msgcat::mc {Space Equal Distance}] -variable colorbar(space) \ -value 0 -command UpdateView FontMenu $ds9(mb).color.colorbar.cb colorbar font font,size font,weight \ font,slant UpdateView CreateExColorMenu h5 CreateExColorMenu matplotlib CreateExColorMenu cubehelix CreateExColorMenu gist CreateExColorMenu topo CreateExColorMenu user } proc CreateExColorMenu {which} { global ds9 global icolorbar # save start location set icolorbar($which) $icolorbar(count) foreach fn $icolorbar($which,fn) { if {[lindex $fn 0] == {-}} { $ds9(mb).color.$which add separator } else { set ch [open "$ds9(root)/cmaps/$fn" r] global vardata set vardata [read $ch] close $ch colorbar load var "\{$fn\}" vardata set id [colorbar get id] set map [colorbar get name] incr icolorbar(count) $ds9(mb).color.$which add radiobutton \ -label "$map" \ -variable colorbar(map) \ -command [list ChangeColormapID $id] } } } proc PrefsDialogColorMenu {w} { global colorbar global icolorbar global pcolorbar set f [ttk::labelframe $w.mcolor -text [msgcat::mc {Color}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarColor $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 -sticky w set m $f.menu.menu menu $m set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] $m add radiobutton -label [msgcat::mc $name] \ -variable pcolorbar(map) -value $name } $m add separator $m add checkbutton -label [msgcat::mc {Invert Colormap}] \ -variable pcolorbar(invert) $m add separator $m add cascade -label [msgcat::mc {Colorbar}] -menu $m.colorbar menu $m.colorbar $m.colorbar add cascade -label [msgcat::mc {Orientation}] \ -menu $m.colorbar.orient $m.colorbar add cascade -label [msgcat::mc {Numerics}] \ -menu $m.colorbar.numerics $m.colorbar add cascade -label [msgcat::mc {Font}] \ -menu $m.colorbar.cb menu $m.colorbar.orient $m.colorbar.orient add radiobutton -label [msgcat::mc {Horizontal}] \ -variable pcolorbar(orientation) -value horizontal $m.colorbar.orient add radiobutton -label [msgcat::mc {Vertical}] \ -variable pcolorbar(orientation) -value vertical menu $m.colorbar.numerics $m.colorbar.numerics add checkbutton -label [msgcat::mc {Show}] \ -variable pcolorbar(numerics) $m.colorbar.numerics add separator $m.colorbar.numerics add radiobutton \ -label [msgcat::mc {Space Equal Value}] \ -variable pcolorbar(space) -value 1 $m.colorbar.numerics add radiobutton \ -label [msgcat::mc {Space Equal Distance}] \ -variable pcolorbar(space) -value 0 FontMenu $m.colorbar.cb pcolorbar font font,size font,weight \ font,slant {} pack $f -side top -fill both -expand true } proc PrefsDialogColor {} { global dprefs global colorbar global icolorbar global pcolorbar set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Color}] lappend dprefs(tabs) [ttk::frame $w.color] set f [ttk::labelframe $w.color.colorbar -text [msgcat::mc {Colorbar}]] ttk::label $f.tsize -text [msgcat::mc {Colorbar Size}] ttk::entry $f.size -textvariable pcolorbar(size) -width 10 ttk::label $f.tticks -text [msgcat::mc {Number of Ticks}] ttk::entry $f.ticks -textvariable pcolorbar(ticks) -width 10 ttk::label $f.tcolor -text [msgcat::mc {Color}] ColorMenuButton $f.color pcolorbar tag {} grid $f.tsize $f.size -padx 2 -pady 2 -sticky w grid $f.tticks $f.ticks -padx 2 -pady 2 -sticky w grid $f.tcolor $f.color -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } # Buttons proc ButtonsColorDef {} { global pbuttons # we have a chicken or the egg problem # the colorbar has not been defined yet, but we must define vars # before prefs are processed, so hard code all default cmaps array set pbuttons { color,grey 1 color,red 0 color,green 0 color,blue 0 color,a 1 color,b 1 color,bb 1 color,he 1 color,i8 1 color,aips0 1 color,sls 0 color,hsv 0 color,heat 1 color,cool 1 color,rainbow 1 color,standard 0 color,staircase 0 color,color 0 color,invert 0 color,reset 0 color,horz 0 color,vert 0 color,numerics 0 color,numvalue 0 color,numspace 0 color,params 0 } } proc CreateButtonsColor {} { global buttons global ds9 global colorbar global icolorbar ttk::frame $ds9(buttons).color set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] RadioButton $ds9(buttons).color.$name [msgcat::mc $name] \ colorbar(map) $name "ChangeColormapID $jj" } CheckButton $ds9(buttons).color.invert \ [string tolower [msgcat::mc {Invert}]] colorbar(invert) InvertColorbar ButtonButton $ds9(buttons).color.reset \ [string tolower [msgcat::mc {Reset}]] ResetColormap RadioButton $ds9(buttons).color.horz \ [string tolower [msgcat::mc {Horizontal}]] \ colorbar(orientation) horizontal UpdateView RadioButton $ds9(buttons).color.vert \ [string tolower [msgcat::mc {Vertical}]] \ colorbar(orientation) vertical UpdateView CheckButton $ds9(buttons).color.numerics \ [string tolower [msgcat::mc {Numerics}]] \ colorbar(numerics) UpdateView RadioButton $ds9(buttons).color.numvalue \ [string tolower [msgcat::mc {Value}]] \ colorbar(space) 1 UpdateView RadioButton $ds9(buttons).color.numspace \ [string tolower [msgcat::mc {Distance}]] \ colorbar(space) 0 UpdateView ButtonButton $ds9(buttons).color.params \ [string tolower [msgcat::mc {Parameters}]] ColormapDialog set buttons(color) {} set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] append buttons(color) "$ds9(buttons).color.$name pbuttons(color,$name) " } append buttons(color) "$ds9(buttons).color.invert pbuttons(color,invert) " append buttons(color) "$ds9(buttons).color.reset pbuttons(color,reset) " append buttons(color) "$ds9(buttons).color.horz pbuttons(color,horz) " append buttons(color) "$ds9(buttons).color.vert pbuttons(color,vert) " append buttons(color) "$ds9(buttons).color.numerics pbuttons(color,numerics) " append buttons(color) "$ds9(buttons).color.numvalue pbuttons(color,numvalue) " append buttons(color) "$ds9(buttons).color.numspace pbuttons(color,numspace) " append buttons(color) "$ds9(buttons).color.params pbuttons(color,params) " } proc PrefsDialogButtonbarColor {f} { global icolorbar global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] $m add checkbutton -label [msgcat::mc $name] \ -variable pbuttons(color,$name) \ -command {UpdateButtons buttons(color)} } $m add separator $m add checkbutton -label [msgcat::mc {Invert Colormap}] \ -variable pbuttons(color,invert) \ -command {UpdateButtons buttons(color)} $m add checkbutton -label [msgcat::mc {Reset Colormap}] \ -variable pbuttons(color,reset) \ -command {UpdateButtons buttons(color)} $m add separator $m add cascade -label [msgcat::mc {Colorbar}] -menu $m.colorbar $m add separator $m add checkbutton -label "[msgcat::mc {Colormap Parameters}]..." \ -variable pbuttons(color,params) \ -command {UpdateButtons buttons(color)} menu $m.colorbar $m.colorbar add cascade -label [msgcat::mc {Orientation}] \ -menu $m.colorbar.orient $m.colorbar add cascade -label [msgcat::mc {Numerics}] \ -menu $m.colorbar.numerics menu $m.colorbar.orient $m.colorbar.orient add checkbutton -label [msgcat::mc {Horizontal}] \ -variable pbuttons(color,horz) \ -command {UpdateButtons buttons(color)} $m.colorbar.orient add checkbutton -label [msgcat::mc {Vertical}] \ -variable pbuttons(color,vert) \ -command {UpdateButtons buttons(color)} menu $m.colorbar.numerics $m.colorbar.numerics add checkbutton -label [msgcat::mc {Show}] \ -variable pbuttons(color,numerics) \ -command {UpdateButtons buttons(color)} $m.colorbar.numerics add separator $m.colorbar.numerics add checkbutton -label [msgcat::mc {Equal Value}] \ -variable pbuttons(color,numvalue) \ -command {UpdateButtons buttons(color)} $m.colorbar.numerics add checkbutton -label [msgcat::mc {Equal Spacing}] \ -variable pbuttons(color,numspace) \ -command {UpdateButtons buttons(color)} } # Support proc UpdateColorMenu {} { global icolorbar global ds9 global current global buttons global debug if {$debug(tcl,update)} { puts stderr "UpdateColorMenu" } set end [expr $icolorbar(end)+$icolorbar(start)] if {$current(frame) != {}} { switch [$current(frame) get type] { base - 3d { # menus # base for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $ds9(mb).color entryconfig $ii -state normal } $ds9(mb).color entryconfig [msgcat::mc {h5utils}] \ -state normal $ds9(mb).color entryconfig [msgcat::mc {Matplotlib}] \ -state normal $ds9(mb).color entryconfig [msgcat::mc {Cubehelix}] \ -state normal $ds9(mb).color entryconfig [msgcat::mc {Gist}] \ -state normal $ds9(mb).color entryconfig [msgcat::mc {Topographic}] \ -state normal $ds9(mb).color entryconfig [msgcat::mc {User}] \ -state normal # buttons set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] $ds9(buttons).color.$name configure -state normal } } rgb { # menus # base for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $ds9(mb).color entryconfig $ii -state disabled } $ds9(mb).color entryconfig [msgcat::mc {h5utils}] \ -state disabled $ds9(mb).color entryconfig [msgcat::mc {Matplotlib}] \ -state disabled $ds9(mb).color entryconfig [msgcat::mc {Cubehelix}] \ -state disabled $ds9(mb).color entryconfig [msgcat::mc {Gist}] \ -state disabled $ds9(mb).color entryconfig [msgcat::mc {Topographic}] \ -state disabled $ds9(mb).color entryconfig [msgcat::mc {User}] \ -state disable # buttons set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] $ds9(buttons).color.$name configure -state disabled } } } } else { # menus # base for {set ii $icolorbar(start)} {$ii<$end} {incr ii} { $ds9(mb).color entryconfig $ii -state normal } $ds9(mb).color entryconfig [msgcat::mc {h5utils}] -state normal $ds9(mb).color entryconfig [msgcat::mc {Matplotlib}] -state normal $ds9(mb).color entryconfig [msgcat::mc {Cubehelix}] -state normal $ds9(mb).color entryconfig [msgcat::mc {Gist}] -state normal $ds9(mb).color entryconfig [msgcat::mc {Topographic}] -state normal $ds9(mb).color entryconfig [msgcat::mc {User}] -state normal # buttons set id [colorbar list id] # base for {set ii 0} {$ii<$icolorbar(end)} {incr ii} { set jj [lindex $id $ii] set name [colorbar get name $jj] $ds9(buttons).color.$name configure -state normal } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mecube.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000004515 12464211204 016474� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMECubeFile {fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {ext cube} set loadParam(load,type) mmapincr set loadParam(file,name) $fn # mask not supported set loadParam(load,layer) {} ConvertFitsFile ProcessLoad } proc LoadMECubeAlloc {path fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {ext cube} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path # mask not supported set loadParam(load,layer) {} ProcessLoad } proc LoadMECubeSocket {sock fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {ext cube} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock # mask not supported set loadParam(load,layer) {} return [ProcessLoad 0] } proc SaveMECubeFile {fn} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits ext cube file "\{$fn\}" } proc SaveMECubeSocket {sock} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits ext cube socket $sock } proc ProcessMECubeCmd {varname iname sock fn} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMECubeSocket $sock $param]} { InitError xpa LoadMECubeFile $param } } else { # comm if {$fn != {}} { LoadMECubeAlloc $fn $param } else { LoadMECubeFile $param } } FinishLoad } proc ProcessSendMECubeCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } if {$sock != {}} { # xpa SaveMECubeSocket $sock } elseif {$fn != {}} { # comm SaveMECubeFile $fn $proc $id {} $fn } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/medit.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000025271 12632117565 016354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc EditMainMenu {} { global ds9 global current menu $ds9(mb).edit $ds9(mb).edit add command -label [msgcat::mc {Undo}] -command UndoFrame \ -accelerator "${ds9(ctrl)}Z" $ds9(mb).edit add separator $ds9(mb).edit add command -label [msgcat::mc {Cut}] -command CutFrame \ -accelerator "${ds9(ctrl)}X" $ds9(mb).edit add command -label [msgcat::mc {Copy}] -command CopyFrame \ -accelerator "${ds9(ctrl)}C" $ds9(mb).edit add command -label [msgcat::mc {Paste}] -command PasteFrame \ -accelerator "${ds9(ctrl)}V" $ds9(mb).edit add separator $ds9(mb).edit add radiobutton -label [msgcat::mc {None}] \ -variable current(mode) -value none -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Region}] \ -variable current(mode) -value region -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Crosshair}] \ -variable current(mode) -value crosshair -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Colorbar}] \ -variable current(mode) -value colorbar -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Pan}] \ -variable current(mode) -value pan -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Zoom}] \ -variable current(mode) -value zoom -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Rotate}] \ -variable current(mode) -value rotate -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Crop}] \ -variable current(mode) -value crop -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Catalog}] \ -variable current(mode) -value catalog -command ChangeMode # IME # $ds9(mb).edit add radiobutton -label [msgcat::mc {Analysis}] # -variable current(mode) -value analysis -command ChangeMode $ds9(mb).edit add radiobutton -label [msgcat::mc {Examine}] \ -variable current(mode) -value examine -command ChangeMode switch $ds9(wm) { x11 - win32 { $ds9(mb).edit add separator $ds9(mb).edit add command -label "[msgcat::mc {Preferences}]..." \ -command PrefsDialog } aqua {} } # Bindings bind $ds9(top) <<Undo>> UndoFrame bind $ds9(top) <<Cut>> CutFrame bind $ds9(top) <<Copy>> CopyFrame bind $ds9(top) <<Paste>> PasteFrame } proc PrefsDialogEditMenu {w} { global ds9 set f [ttk::labelframe $w.medit -text [msgcat::mc {Edit}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarEdit $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add radiobutton -label [msgcat::mc {None}] \ -variable pcurrent(mode) -value none $m add radiobutton -label [msgcat::mc {Region}] \ -variable pcurrent(mode) -value region $m add radiobutton -label [msgcat::mc {Crosshair}] \ -variable pcurrent(mode) -value crosshair $m add radiobutton -label [msgcat::mc {Colorbar}] \ -variable pcurrent(mode) -value colorbar $m add radiobutton -label [msgcat::mc {Pan}] \ -variable pcurrent(mode) -value pan $m add radiobutton -label [msgcat::mc {Zoom}] \ -variable pcurrent(mode) -value zoom $m add radiobutton -label [msgcat::mc {Rotate}] \ -variable pcurrent(mode) -value rotate $m add radiobutton -label [msgcat::mc {Crop}] \ -variable pcurrent(mode) -value crop $m add radiobutton -label [msgcat::mc {Catalog}] \ -variable pcurrent(mode) -value catalog # IME # $m add radiobutton -label [msgcat::mc {Analysis}] # -variable pcurrent(mode) -value analysis $m add radiobutton -label [msgcat::mc {Examine}] \ -variable pcurrent(mode) -value examine pack $f -side top -fill both -expand true } # Buttons proc ButtonsEditDef {} { global pbuttons array set pbuttons { edit,undo 0 edit,cut 0 edit,copy 0 edit,paste 0 edit,none 1 edit,region 1 edit,crosshair 1 edit,colorbar 1 edit,pan 1 edit,zoom 1 edit,rotate 1 edit,crop 1 edit,catalog 1 edit,examine 1 edit,prefs 0 } # IME # edit,analysis 1 } proc CreateButtonsEdit {} { global buttons global ds9 global current ttk::frame $ds9(buttons).edit ButtonButton $ds9(buttons).edit.undo \ [string tolower [msgcat::mc {Undo}]] UndoFrame ButtonButton $ds9(buttons).edit.cut \ [string tolower [msgcat::mc {Cut}]] CutFrame ButtonButton $ds9(buttons).edit.copy \ [string tolower [msgcat::mc {Copy}]] CopyFrame ButtonButton $ds9(buttons).edit.paste \ [string tolower [msgcat::mc {Paste}]] PasteFrame RadioButton $ds9(buttons).edit.none \ [string tolower [msgcat::mc {None}]] \ current(mode) none ChangeMode RadioButton $ds9(buttons).edit.region \ [string tolower [msgcat::mc {Region}]] \ current(mode) region ChangeMode RadioButton $ds9(buttons).edit.crosshair \ [string tolower [msgcat::mc {Cross}]] \ current(mode) crosshair ChangeMode RadioButton $ds9(buttons).edit.colorbar \ [string tolower [msgcat::mc {Colorbar}]] \ current(mode) colorbar ChangeMode RadioButton $ds9(buttons).edit.pan \ [string tolower [msgcat::mc {Pan}]] \ current(mode) pan ChangeMode RadioButton $ds9(buttons).edit.zoom \ [string tolower [msgcat::mc {Zoom}]] \ current(mode) zoom ChangeMode RadioButton $ds9(buttons).edit.rotate \ [string tolower [msgcat::mc {Rotate}]] \ current(mode) rotate ChangeMode RadioButton $ds9(buttons).edit.crop \ [string tolower [msgcat::mc {Crop}]] \ current(mode) crop ChangeMode RadioButton $ds9(buttons).edit.catalog \ [string tolower [msgcat::mc {Cat}]] \ current(mode) catalog ChangeMode # IME # RadioButton $ds9(buttons).edit.analysis # [string tolower [msgcat::mc {Analysis}]] # current(mode) analysis ChangeMode RadioButton $ds9(buttons).edit.examine \ [string tolower [msgcat::mc {Exam}]] \ current(mode) examine ChangeMode ButtonButton $ds9(buttons).edit.prefs \ [string tolower [msgcat::mc {Preferences}]] PrefsDialog set buttons(edit) " $ds9(buttons).edit.undo pbuttons(edit,undo) $ds9(buttons).edit.cut pbuttons(edit,cut) $ds9(buttons).edit.copy pbuttons(edit,copy) $ds9(buttons).edit.paste pbuttons(edit,paste) $ds9(buttons).edit.none pbuttons(edit,none) $ds9(buttons).edit.region pbuttons(edit,region) $ds9(buttons).edit.crosshair pbuttons(edit,crosshair) $ds9(buttons).edit.colorbar pbuttons(edit,colorbar) $ds9(buttons).edit.pan pbuttons(edit,pan) $ds9(buttons).edit.zoom pbuttons(edit,zoom) $ds9(buttons).edit.rotate pbuttons(edit,rotate) $ds9(buttons).edit.crop pbuttons(edit,crop) $ds9(buttons).edit.catalog pbuttons(edit,catalog) $ds9(buttons).edit.examine pbuttons(edit,examine) $ds9(buttons).edit.prefs pbuttons(edit,prefs) " # IME # $ds9(buttons).edit.analysis pbuttons(edit,analysis) } proc PrefsDialogButtonbarEdit {f} { global ds9 global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Undo}] \ -variable pbuttons(edit,undo) -command {UpdateButtons buttons(edit)} $m add separator $m add checkbutton -label [msgcat::mc {Cut}] \ -variable pbuttons(edit,cut) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Copy}] \ -variable pbuttons(edit,copy) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Paste}] \ -variable pbuttons(edit,paste) -command {UpdateButtons buttons(edit)} $m add separator $m add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(edit,none) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Region}] \ -variable pbuttons(edit,region) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Crosshair}] \ -variable pbuttons(edit,crosshair) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Colorbar}] \ -variable pbuttons(edit,colorbar) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Pan}] \ -variable pbuttons(edit,pan) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Zoom}] \ -variable pbuttons(edit,zoom) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Rotate}] \ -variable pbuttons(edit,rotate) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Crop}] \ -variable pbuttons(edit,crop) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Catalog}] \ -variable pbuttons(edit,catalog) -command {UpdateButtons buttons(edit)} # IME # $m add checkbutton -label [msgcat::mc {Analysis}] # -variable pbuttons(edit,analysis) -command {UpdateButtons buttons(edit)} $m add checkbutton -label [msgcat::mc {Examine}] \ -variable pbuttons(edit,examine) -command {UpdateButtons buttons(edit)} $m add separator $m add checkbutton -label [msgcat::mc {Preferences}] \ -variable pbuttons(edit,prefs) -command {UpdateButtons buttons(edit)} } # Support proc UpdateEditMenu {} { global ds9 global current global marker global debug if {$debug(tcl,update)} { puts stderr "UpdateEditMenu" } switch -- $current(mode) { pointer - region { if {$current(frame) != {}} { set l [$current(frame) has marker undo] if {$l != {}} { $ds9(mb).edit entryconfig [msgcat::mc {Undo}] \ -state normal } else { $ds9(mb).edit entryconfig [msgcat::mc {Undo}] \ -state disabled } if {[$current(frame) has marker select]} { $ds9(mb).edit entryconfig [msgcat::mc {Cut}] \ -state normal $ds9(mb).edit entryconfig [msgcat::mc {Copy}] \ -state normal } else { $ds9(mb).edit entryconfig [msgcat::mc {Cut}] \ -state disabled $ds9(mb).edit entryconfig [msgcat::mc {Copy}] \ -state disabled } if {$marker(copy) != {} } { if {[$marker(copy) has marker paste]} { $ds9(mb).edit entryconfig [msgcat::mc {Paste}] \ -state normal } else { $ds9(mb).edit entryconfig [msgcat::mc {Paste}] \ -state disabled } } else { $ds9(mb).edit entryconfig [msgcat::mc {Paste}] \ -state disabled } } else { $ds9(mb).edit entryconfig [msgcat::mc {Undo}] -state disabled $ds9(mb).edit entryconfig [msgcat::mc {Cut}] -state disabled $ds9(mb).edit entryconfig [msgcat::mc {Copy}] -state disabled $ds9(mb).edit entryconfig [msgcat::mc {Paste}] -state disabled } } none - crosshair - colorbar - pan - zoom - rotate - crop - catalog - analysis - examine - iexam {$ds9(mb).edit entryconfig [msgcat::mc {Undo}] -state disabled} } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/menu.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000043346 12514261632 016213� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CreateMenuBar {} { global ds9 # we need this first, before the configure command menu $ds9(mb) AppleMenu $ds9(mb) $ds9(top) configure -menu $ds9(mb) $ds9(mb) add cascade -label [msgcat::mc {File}] -menu $ds9(mb).file $ds9(mb) add cascade -label [msgcat::mc {Edit}] -menu $ds9(mb).edit $ds9(mb) add cascade -label [msgcat::mc {View}] -menu $ds9(mb).view $ds9(mb) add cascade -label [msgcat::mc {Frame}] -menu $ds9(mb).frame $ds9(mb) add cascade -label [msgcat::mc {Bin}] -menu $ds9(mb).bin $ds9(mb) add cascade -label [msgcat::mc {Zoom}] -menu $ds9(mb).zoom $ds9(mb) add cascade -label [msgcat::mc {Scale}] -menu $ds9(mb).scale $ds9(mb) add cascade -label [msgcat::mc {Color}] -menu $ds9(mb).color $ds9(mb) add cascade -label [msgcat::mc {Region}] -menu $ds9(mb).region $ds9(mb) add cascade -label [msgcat::mc {WCS}] -menu $ds9(mb).wcs $ds9(mb) add cascade -label [msgcat::mc {Analysis}] -menu $ds9(mb).analysis FileMainMenu EditMainMenu ViewMainMenu FrameMainMenu BinMainMenu ZoomMainMenu ScaleMainMenu ColorMainMenu RegionMainMenu WCSMainMenu AnalysisMainMenu HelpMainMenu } proc AppleMenu {mb} { global ds9 switch $ds9(wm) { x11 {} aqua { # apple menu menu $mb.apple $mb add cascade -menu $mb.apple $mb.apple add command \ -label [msgcat::mc {About SAOImage DS9}] \ -command AboutBox # -command ::tk::mac::standardAboutPanel } win32 {} } } # CoordMenu proc CoordMenu {w varname system other sky skyformat cmd} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label [msgcat::mc {WCS}] \ -variable ${varname}($system) -value wcs -command $cmd $w add cascade -label [msgcat::mc {Multiple WCS}] -menu $w.wcs menu $w.wcs foreach l {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} { $w.wcs add radiobutton -label "[msgcat::mc {WCS}] $l" \ -variable ${varname}($system) -value "wcs$l" -command $cmd } switch -- $other { 1 { $w add separator $w add radiobutton -label [msgcat::mc {Image}] \ -variable ${varname}($system) -value image -command $cmd $w add radiobutton -label [msgcat::mc {Physical}] \ -variable ${varname}($system) -value physical -command $cmd $w add radiobutton -label [msgcat::mc {Amplifier}] \ -variable ${varname}($system) -value amplifier -command $cmd $w add radiobutton -label [msgcat::mc {Detector}] \ -variable ${varname}($system) -value detector -command $cmd } 2 { $w add separator $w add radiobutton -label [msgcat::mc {Image}] \ -variable ${varname}($system) -value image -command $cmd } } if {$sky != {}} { $w add separator $w add radiobutton -label [msgcat::mc {FK4}] \ -variable ${varname}($sky) -value fk4 -command $cmd $w add radiobutton -label [msgcat::mc {FK5}] \ -variable ${varname}($sky) -value fk5 -command $cmd $w add radiobutton -label [msgcat::mc {ICRS}] \ -variable ${varname}($sky) -value icrs -command $cmd $w add radiobutton -label [msgcat::mc {Galactic}] \ -variable ${varname}($sky) -value galactic -command $cmd $w add radiobutton -label [msgcat::mc {Ecliptic}] \ -variable ${varname}($sky) -value ecliptic -command $cmd } if {$skyformat != {}} { $w add separator $w add radiobutton -label [msgcat::mc {Degrees}] \ -variable ${varname}($skyformat) -value degrees -command $cmd $w add radiobutton -label {Sexagesimal} \ -variable ${varname}($skyformat) -value sexagesimal -command $cmd } } proc CoordMenuButton {w varname system other sky skyformat cmd} { upvar #0 $varname var global $varname CoordMenuButtonCmd $varname $system $sky {} ttk::menubutton $w -textvariable ${varname}($system,msg) -menu $w.menu CoordMenu $w.menu $varname $system $other $sky $skyformat \ [list CoordMenuButtonCmd $varname $system $sky $cmd] } proc CoordMenuButtonCmd {varname system sky cmd} { upvar #0 $varname var global $varname set ${varname}($system,msg) [msgcat::mc $var($system)] if {$sky != {}} { switch -- $var($system) { image - physical - amplifier - detector {} default { if {[info exists var(frame)]} { if {$var(frame) != {}} { if {[$var(frame) has wcs equatorial $var($system)]} { set ${varname}($system,msg) [msgcat::mc $var($sky)] } } } } } } if {$cmd != {}} { eval $cmd } } proc CoordMenuEnable {w varname system other sky skyformat} { upvar #0 $varname var global $varname if {![info exists var(frame)]} { return } if {$var(frame) == {}} { return } if {[$var(frame) has wcs wcs]} { $w entryconfig [msgcat::mc {WCS}] -state normal } else { $w entryconfig [msgcat::mc {WCS}] -state disabled } $w entryconfig [msgcat::mc {Multiple WCS}] -state normal foreach ll {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} { if {[$var(frame) has wcs "wcs${ll}"]} { $w.wcs entryconfig "[msgcat::mc {WCS}] $ll" -state normal } else { $w.wcs entryconfig "[msgcat::mc {WCS}] $ll" -state disabled } } switch -- $other { 1 { $w entryconfig [msgcat::mc {Image}] -state normal $w entryconfig [msgcat::mc {Physical}] -state normal $w entryconfig [msgcat::mc {Amplifier}] -state normal $w entryconfig [msgcat::mc {Detector}] -state normal } 2 { $w entryconfig [msgcat::mc {Image}] -state normal } } if {$sky != {}} { if {[$var(frame) has wcs equatorial $var($system)]} { $w entryconfig [msgcat::mc {FK4}] -state normal $w entryconfig [msgcat::mc {FK5}] -state normal $w entryconfig [msgcat::mc {ICRS}] -state normal $w entryconfig [msgcat::mc {Galactic}] -state normal $w entryconfig [msgcat::mc {Ecliptic}] -state normal } else { $w entryconfig [msgcat::mc {FK4}] -state disabled $w entryconfig [msgcat::mc {FK5}] -state disabled $w entryconfig [msgcat::mc {ICRS}] -state disabled $w entryconfig [msgcat::mc {Galactic}] -state disabled $w entryconfig [msgcat::mc {Ecliptic}] -state disabled } } if {$skyformat != {}} { if {[$var(frame) has wcs celestrial $var($system)]} { $w entryconfig [msgcat::mc {Degrees}] -state normal $w entryconfig {Sexagesimal} -state normal } else { $w entryconfig [msgcat::mc {Degrees}] -state disabled $w entryconfig {Sexagesimal} -state disabled } } } proc CoordMenuReset {w varname system other sky skyformat} { upvar #0 $varname var global $varname $w entryconfig [msgcat::mc {WCS}] -state normal $w entryconfig [msgcat::mc {Multiple WCS}] -state normal foreach l {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} { $w.wcs entryconfig "[msgcat::mc {WCS}] $l" -state normal } switch -- $other { 1 { $w entryconfig [msgcat::mc {Image}] -state normal $w entryconfig [msgcat::mc {Physical}] -state normal $w entryconfig [msgcat::mc {Amplifier}] -state normal $w entryconfig [msgcat::mc {Detector}] -state normal } 2 { $w entryconfig [msgcat::mc {Image}] -state normal } } if {$sky != {}} { $w entryconfig [msgcat::mc {FK4}] -state normal $w entryconfig [msgcat::mc {FK5}] -state normal $w entryconfig [msgcat::mc {ICRS}] -state normal $w entryconfig [msgcat::mc {Galactic}] -state normal $w entryconfig [msgcat::mc {Ecliptic}] -state normal } if {$skyformat != {}} { $w entryconfig [msgcat::mc {Degrees}] -state normal $w entryconfig {Sexagesimal} -state normal } } # DistMenu proc DistMenu {w varname system other format cmd} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label [msgcat::mc {WCS}] \ -variable ${varname}($system) -value wcs -command $cmd $w add cascade -label [msgcat::mc {Multiple WCS}] \ -menu $w.wcs menu $w.wcs foreach l {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} { $w.wcs add radiobutton -label "[msgcat::mc {WCS}] $l" \ -variable ${varname}($system) -value "wcs$l" -command $cmd } if {$other} { $w add separator $w add radiobutton -label [msgcat::mc {Image}] \ -variable ${varname}($system) -value image -command $cmd $w add radiobutton -label [msgcat::mc {Physical}] \ -variable ${varname}($system) -value physical -command $cmd $w add radiobutton -label [msgcat::mc {Amplifier}] \ -variable ${varname}($system) -value amplifier -command $cmd $w add radiobutton -label [msgcat::mc {Detector}] \ -variable ${varname}($system) -value detector -command $cmd } if {$format != {}} { $w add separator $w add radiobutton -label [msgcat::mc {Degrees}] \ -variable ${varname}($format) -value degrees -command $cmd $w add radiobutton -label [msgcat::mc {ArcMin}] \ -variable ${varname}($format) -value arcmin -command $cmd $w add radiobutton -label [msgcat::mc {ArcSec}] \ -variable ${varname}($format) -value arcsec -command $cmd } } proc DistMenuButton {w varname system other format cmd} { upvar #0 $varname var global $varname DistMenuButtonCmd $varname $system $format {} ttk::menubutton $w -textvariable ${varname}($system,msg) -menu $w.menu DistMenu $w.menu $varname $system $other $format \ [list DistMenuButtonCmd $varname $system $format $cmd] } proc DistMenuButtonCmd {varname system format cmd} { upvar #0 $varname var global $varname set ${varname}($system,msg) [msgcat::mc $var($system)] if {$format != {}} { switch -- $var($system) { image - physical - amplifier - detector {} default { if {[info exists var(frame)]} { if {$var(frame) != {}} { if {[$var(frame) has wcs equatorial $var($system)]} { set ${varname}($system,msg) [msgcat::mc $var($format)] } } } } } } if {$cmd != {}} { eval $cmd } } proc DistMenuEnable {w varname system other format} { upvar #0 $varname var global $varname if {![info exists var(frame)]} { return } if {$var(frame) == {}} { return } if {[$var(frame) has wcs wcs]} { $w entryconfig [msgcat::mc {WCS}] -state normal } else { $w entryconfig [msgcat::mc {WCS}] -state disabled } $w entryconfig [msgcat::mc {Multiple WCS}] -state normal foreach ll {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} { if {[$var(frame) has wcs "wcs${ll}"]} { $w.wcs entryconfig "[msgcat::mc {WCS}] $ll" -state normal } else { $w.wcs entryconfig "[msgcat::mc {WCS}] $ll" -state disabled } } if {$other} { $w entryconfig [msgcat::mc {Image}] -state normal $w entryconfig [msgcat::mc {Physical}] -state normal $w entryconfig [msgcat::mc {Amplifier}] -state normal $w entryconfig [msgcat::mc {Detector}] -state normal } if {$format != {}} { if {[$var(frame) has wcs celestrial $var($system)]} { $w entryconfig [msgcat::mc {Degrees}] -state normal $w entryconfig [msgcat::mc {ArcMin}] -state normal $w entryconfig [msgcat::mc {ArcSec}] -state normal } else { $w entryconfig [msgcat::mc {Degrees}] -state disabled $w entryconfig [msgcat::mc {ArcMin}] -state disabled $w entryconfig [msgcat::mc {ArcSec}] -state disabled } } } proc DistMenuReset {w varname system other format} { upvar #0 $varname var global $varname $w entryconfig [msgcat::mc {WCS}] -state normal $w entryconfig [msgcat::mc {Multiple WCS}] -state normal foreach ll {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} { $w.wcs entryconfig "[msgcat::mc {WCS}] $ll" -state normal } if {$other} { $w entryconfig [msgcat::mc {Image}] -state normal $w entryconfig [msgcat::mc {Physical}] -state normal $w entryconfig [msgcat::mc {Amplifier}] -state normal $w entryconfig [msgcat::mc {Detector}] -state normal } if {$format != {}} { $w entryconfig [msgcat::mc {Degrees}] -state normal $w entryconfig [msgcat::mc {ArcMin}] -state normal $w entryconfig [msgcat::mc {ArcSec}] -state normal } } # EditMenu proc EditMenu {mb varname} { upvar #0 $varname var global $varname global ds9 menu $mb.edit $mb.edit add command -label [msgcat::mc {Cut}] \ -command "EntryCut $var(top)" -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command "EntryCopy $var(top)" -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -command "EntryPaste $var(top)" -accelerator "${ds9(ctrl)}V" } # ColorMenu proc ColorMenu {w varname color cmd} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label [msgcat::mc {Black}] \ -variable ${varname}($color) -value black -command $cmd $w add radiobutton -label [msgcat::mc {White}] \ -variable ${varname}($color) -value white -command $cmd $w add radiobutton -label [msgcat::mc {Red}] \ -variable ${varname}($color) -value red -command $cmd $w add radiobutton -label [msgcat::mc {Green}] \ -variable ${varname}($color) -value green -command $cmd $w add radiobutton -label [msgcat::mc {Blue}] \ -variable ${varname}($color) -value blue -command $cmd $w add radiobutton -label [msgcat::mc {Cyan}] \ -variable ${varname}($color) -value cyan -command $cmd $w add radiobutton -label [msgcat::mc {Magenta}] \ -variable ${varname}($color) -value magenta -command $cmd $w add radiobutton -label [msgcat::mc {Yellow}] \ -variable ${varname}($color) -value yellow -command $cmd $w add separator $w add command -label "[msgcat::mc {Other Color}]..." \ -command [list ColorMenuOther $varname $color $cmd] } proc ColorMenuOther {varname color cmd} { upvar #0 $varname var global $varname if {[EntryDialog [msgcat::mc {Color}] [msgcat::mc {Enter Color}] 20 ${varname}($color)]} { eval $cmd } } proc ColorMenuButton {w varname color cmd} { upvar #0 $varname var global $varname ttk::menubutton $w -textvariable ${varname}($color) -menu $w.menu ColorMenu $w.menu $varname $color $cmd } # FontMenu proc FontMenu {w varname font size weight slant cmd} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label {Times} -variable ${varname}($font) \ -value times -command $cmd $w add radiobutton -label {Helvetica} -variable ${varname}($font) \ -value helvetica -command $cmd $w add radiobutton -label {Courier} -variable ${varname}($font) \ -value courier -command $cmd $w add separator $w add radiobutton -label {9} -variable ${varname}($size) \ -value 9 -command $cmd $w add radiobutton -label {10} -variable ${varname}($size) \ -value 10 -command $cmd $w add radiobutton -label {12} -variable ${varname}($size) \ -value 12 -command $cmd $w add radiobutton -label {14} -variable ${varname}($size) \ -value 14 -command $cmd $w add radiobutton -label {16} -variable ${varname}($size) \ -value 16 -command $cmd $w add radiobutton -label {20} -variable ${varname}($size) \ -value 20 -command $cmd $w add radiobutton -label {24} -variable ${varname}($size) \ -value 24 -command $cmd $w add radiobutton -label {30} -variable ${varname}($size) \ -value 30 -command $cmd $w add radiobutton -label {36} -variable ${varname}($size) \ -value 36 -command $cmd $w add radiobutton -label {72} -variable ${varname}($size) \ -value 72 -command $cmd $w add separator $w add command -label "[msgcat::mc {Other Font Size}]..." \ -command [list FontMenuSize $varname $size $cmd] $w add separator $w add radiobutton -label [msgcat::mc {Normal}] \ -variable ${varname}($weight) -value normal -command $cmd $w add radiobutton -label [msgcat::mc {Bold}] \ -variable ${varname}($weight) -value bold -command $cmd $w add separator $w add radiobutton -label [msgcat::mc {Roman}] \ -variable ${varname}($slant) -value roman -command $cmd $w add radiobutton -label [msgcat::mc {Italic}] \ -variable ${varname}($slant) -value italic -command $cmd } proc FontMenuSize {varname size cmd} { upvar #0 $varname var global $varname if {[EntryDialog [msgcat::mc {Font Size}] [msgcat::mc {Enter Font Size}] 20 ${varname}($size)]} { eval $cmd } } proc FontMenuButton {w varname font size weight slant cmd} { upvar #0 $varname var global $varname ttk::menubutton $w -textvariable ${varname}($font) -menu $w.menu FontMenu $w.menu $varname $font $size $weight $slant $cmd } # WidthDashMenu proc WidthDashMenu {w varname width dash cmd1 cmd2} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label {1} -variable ${varname}($width) \ -value 1 -command $cmd1 $w add radiobutton -label {2} -variable ${varname}($width) \ -value 2 -command $cmd1 $w add radiobutton -label {3} -variable ${varname}($width) \ -value 3 -command $cmd1 $w add radiobutton -label {4} -variable ${varname}($width) \ -value 4 -command $cmd1 if {$dash != {}} { $w add separator $w add checkbutton -label [msgcat::mc {Dash}] \ -variable ${varname}($dash) -command $cmd2 } } proc WidthDashMenuButton {w varname width dash cmd1 cmd2} { upvar #0 $varname var global $varname ttk::menubutton $w -textvariable ${varname}($width) -menu $w.menu WidthDashMenu $w.menu $varname $width $dash $cmd1 $cmd2 } # Prefs proc PrefsDialogMenu {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Menus and Buttons}] lappend dprefs(tabs) [ttk::frame $w.menu] PrefsDialogFileMenu $w.menu PrefsDialogEditMenu $w.menu PrefsDialogViewMenu $w.menu PrefsDialogFrameMenu $w.menu PrefsDialogBinMenu $w.menu PrefsDialogZoomMenu $w.menu PrefsDialogScaleMenu $w.menu PrefsDialogColorMenu $w.menu PrefsDialogRegionMenu $w.menu PrefsDialogWCSMenu $w.menu PrefsDialogAnalysisMenu $w.menu PrefsDialogHelpMenu $w.menu } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mfile.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000057562 12514261632 016350� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc FileMainMenu {} { global ds9 menu $ds9(mb).file $ds9(mb).file add command -label "[msgcat::mc {Open}]..." \ -command [list OpenDialog fits] -accelerator "${ds9(ctrl)}O" $ds9(mb).file add cascade -label [msgcat::mc {Open as}] \ -menu $ds9(mb).file.open $ds9(mb).file add separator $ds9(mb).file add command -label "[msgcat::mc {Save}]..." \ -command [list SaveDialog fits] -accelerator "${ds9(ctrl)}S" $ds9(mb).file add cascade -label [msgcat::mc {Save as}] \ -menu $ds9(mb).file.save $ds9(mb).file add separator $ds9(mb).file add cascade -label [msgcat::mc {Import}] \ -menu $ds9(mb).file.import $ds9(mb).file add cascade -label [msgcat::mc {Export}] \ -menu $ds9(mb).file.export $ds9(mb).file add separator $ds9(mb).file add cascade -label [msgcat::mc {Save Image}] \ -menu $ds9(mb).file.saveimage $ds9(mb).file add command -label "[msgcat::mc {Create Movie}]..." \ -command MovieDialog $ds9(mb).file add separator $ds9(mb).file add command -label "[msgcat::mc {Backup}]..." \ -command BackupDialog $ds9(mb).file add command -label "[msgcat::mc {Restore}]..." \ -command RestoreDialog $ds9(mb).file add separator $ds9(mb).file add command -label "[msgcat::mc {Display Header}]..." \ -command DisplayHeaderMenu $ds9(mb).file add cascade -label [msgcat::mc {Preserve During Load}] \ -menu $ds9(mb).file.preserve $ds9(mb).file add separator $ds9(mb).file add cascade -label [msgcat::mc {XPA}] \ -menu $ds9(mb).file.xpa $ds9(mb).file add cascade -label [msgcat::mc {SAMP}] \ -menu $ds9(mb).file.samp $ds9(mb).file add separator $ds9(mb).file add command -label "[msgcat::mc {Open TCL Console}]..." \ -command OpenConsole $ds9(mb).file add command -label "[msgcat::mc {Source TCL}]..." \ -command OpenSource $ds9(mb).file add separator switch $ds9(wm) { x11 { $ds9(mb).file add command -label "[msgcat::mc {Page Setup}]..." \ -command PSPageSetup -accelerator "${ds9(shiftctrl)}P" $ds9(mb).file add command -label "[msgcat::mc {Print}]..." \ -command PSPrint -accelerator "${ds9(ctrl)}P" } aqua { # accelerators don't work with dialog box $ds9(mb).file add command -label "[msgcat::mc {Page Setup}]..." \ -command PSPageSetup $ds9(mb).file add command -label "[msgcat::mc {Print}]..." \ -command PSPrint # $ds9(mb).file add command -label "[msgcat::mc {Postscript Page Setup}]..." -command PSPageSetup # $ds9(mb).file add command -label "[msgcat::mc {Postscript Print}]..." -command PSPrint # $ds9(mb).file add separator # $ds9(mb).file add command -label "[msgcat::mc {Page Setup}]..." -command MacOSXPageSetup # $ds9(mb).file add command -label "[msgcat::mc {Print}]..." -command MacOSXPrint } win32 {} } switch $ds9(wm) { x11 - win32 { $ds9(mb).file add separator $ds9(mb).file add command \ -label [msgcat::mc {Exit}] -command QuitDS9 } aqua {} } # File Open Menu menu $ds9(mb).file.open $ds9(mb).file.open add command -label "[msgcat::mc {Slice}]..." \ -command [list OpenDialog fits {} slice] $ds9(mb).file.open add separator $ds9(mb).file.open add command \ -label "[msgcat::mc {RGB Image}]..." \ -command [list OpenDialog rgbimage] $ds9(mb).file.open add command \ -label "[msgcat::mc {RGB Cube}]..."\ -command [list OpenDialog rgbcube] $ds9(mb).file.open add separator $ds9(mb).file.open add command \ -label "[msgcat::mc {Multiple Extension Cube}]..." \ -command [list OpenDialog mecube] $ds9(mb).file.open add command \ -label "[msgcat::mc {Multiple Extension Frames}]..." \ -command [list OpenDialog multiframe] $ds9(mb).file.open add separator $ds9(mb).file.open add command \ -label "[msgcat::mc {Mosaic WCS}]..." \ -command [list OpenDialog mosaicimagewcs] $ds9(mb).file.open add command \ -label "[msgcat::mc {Mosaic WCS Segment}]..." \ -command [list OpenDialog mosaicwcs] $ds9(mb).file.open add command \ -label "[msgcat::mc {Mosaic IRAF}]..." \ -command [list OpenDialog mosaicimageiraf] $ds9(mb).file.open add command \ -label "[msgcat::mc {Mosaic IRAF Segment}]..." \ -command [list OpenDialog mosaiciraf] $ds9(mb).file.open add command \ -label "[msgcat::mc {Mosaic WFPC2}]..." \ -command [list OpenDialog mosaicimagewfpc2] $ds9(mb).file.open add separator $ds9(mb).file.open add command \ -label "[msgcat::mc {URL}]..." \ -command [list OpenURLFits] # File Save Menu menu $ds9(mb).file.save $ds9(mb).file.save add command -label "[msgcat::mc {Slice}]..." \ -command [list SaveDialog slice] $ds9(mb).file.save add separator $ds9(mb).file.save add command \ -label "[msgcat::mc {RGB Image}]..." \ -command [list SaveDialog rgbimage] $ds9(mb).file.save add command \ -label "[msgcat::mc {RGB Cube}]..."\ -command [list SaveDialog rgbcube] $ds9(mb).file.save add separator $ds9(mb).file.save add command \ -label "[msgcat::mc {Multiple Extension Cube}]..." \ -command [list SaveDialog mecube] $ds9(mb).file.save add separator $ds9(mb).file.save add command \ -label "[msgcat::mc {Mosaic WCS}]..." \ -command [list SaveDialog mosaicimagewcs] $ds9(mb).file.save add command \ -label "[msgcat::mc {Mosaic WCS Segment}]..." \ -command [list SaveDialog mosaicwcs] # File Import Menu menu $ds9(mb).file.import $ds9(mb).file.import add cascade -label [msgcat::mc {Slice}] \ -menu $ds9(mb).file.import.slice $ds9(mb).file.import add separator $ds9(mb).file.import add command -label "[msgcat::mc {Array}]..." \ -command [list ImportDialog array] $ds9(mb).file.import add command -label {NRRD...} \ -command [list ImportDialog nrrd] $ds9(mb).file.import add command -label {ENVI...} \ -command [list ImportDialog envi] $ds9(mb).file.import add separator $ds9(mb).file.import add command -label "[msgcat::mc {RGB Array}]..." \ -command [list ImportDialog rgbarray] $ds9(mb).file.import add separator $ds9(mb).file.import add command -label {GIF...} \ -command [list ImportDialog gif] $ds9(mb).file.import add command -label {TIFF...} \ -command [list ImportDialog tiff] $ds9(mb).file.import add command -label {JPEG...} \ -command [list ImportDialog jpeg] $ds9(mb).file.import add command -label {PNG...} \ -command [list ImportDialog png] # File Import Slice Menu menu $ds9(mb).file.import.slice $ds9(mb).file.import.slice add command -label {GIF...} \ -command [list ImportDialog gif {} slice] $ds9(mb).file.import.slice add command -label {TIFF...} \ -command [list ImportDialog tiff {} slice] $ds9(mb).file.import.slice add command -label {JPEG...} \ -command [list ImportDialog jpeg {} slice] $ds9(mb).file.import.slice add command -label {PNG...} \ -command [list ImportDialog png {} slice] # File Export Menu menu $ds9(mb).file.export $ds9(mb).file.export add command -label "[msgcat::mc {Array}]..." \ -command [list ExportDialog array] $ds9(mb).file.export add command -label {NRRD...} \ -command [list ExportDialog nrrd] $ds9(mb).file.export add command -label {ENVI...} \ -command [list ExportDialog envi] $ds9(mb).file.export add separator $ds9(mb).file.export add command -label "[msgcat::mc {RGB Array}]..." \ -command [list ExportDialog rgbarray] $ds9(mb).file.export add separator $ds9(mb).file.export add command -label {GIF...} \ -command [list ExportDialog gif] $ds9(mb).file.export add command -label {TIFF...} \ -command [list ExportDialog tiff] $ds9(mb).file.export add command -label {JPEG...} \ -command [list ExportDialog jpeg] $ds9(mb).file.export add command -label {PNG...} \ -command [list ExportDialog png] # File Saveimage Menu menu $ds9(mb).file.saveimage $ds9(mb).file.saveimage add command -label {FITS...} \ -command [list SaveImageDialog fits] $ds9(mb).file.saveimage add command -label {EPS...} \ -command [list SaveImageDialog eps] $ds9(mb).file.saveimage add command -label {GIF...} \ -command [list SaveImageDialog gif] $ds9(mb).file.saveimage add command -label {TIFF...} \ -command [list SaveImageDialog tiff] $ds9(mb).file.saveimage add command -label {JPEG...} \ -command [list SaveImageDialog jpeg] $ds9(mb).file.saveimage add command -label {PNG...} \ -command [list SaveImageDialog png] # File Preserve Menu menu $ds9(mb).file.preserve $ds9(mb).file.preserve add checkbutton -label [msgcat::mc {Pan}] \ -variable panzoom(preserve) -command PreservePan $ds9(mb).file.preserve add checkbutton -label [msgcat::mc {Region}] \ -variable marker(preserve) -command MarkerPreserve menu $ds9(mb).file.samp $ds9(mb).file.samp add command -label [msgcat::mc {Connect}] \ -command SAMPConnect $ds9(mb).file.samp add command -label [msgcat::mc {Disconnect}] \ -command SAMPDisconnect $ds9(mb).file.samp add separator $ds9(mb).file.samp add cascade -label [msgcat::mc {Image}] \ -menu $ds9(mb).file.samp.image $ds9(mb).file.samp add cascade -label [msgcat::mc {Table}] \ -menu $ds9(mb).file.samp.table menu $ds9(mb).file.samp.image $ds9(mb).file.samp.image add command -label [msgcat::mc {Broadcast}] \ -command "SAMPSendImageLoadFits {}" $ds9(mb).file.samp.image add separator menu $ds9(mb).file.samp.table $ds9(mb).file.samp.table add command -label [msgcat::mc {Broadcast}] \ -command "SAMPSendTableLoadFits {}" $ds9(mb).file.samp.table add separator menu $ds9(mb).file.xpa $ds9(mb).file.xpa add command -label "[msgcat::mc {Information}]..." \ -command XPAInfo $ds9(mb).file.xpa add separator $ds9(mb).file.xpa add command -label [msgcat::mc {Connect}] \ -command XPAConnect $ds9(mb).file.xpa add command -label [msgcat::mc {Disconnect}] \ -command XPADisconnect # Bindings bind $ds9(top) <<Open>> [list OpenDialog fits] bind $ds9(top) <<Save>> [list SaveDialog fits] switch $ds9(wm) { x11 { bind $ds9(top) <<PageSetup>> PSPageSetup bind $ds9(top) <<Print>> PSPrint } aqua { # Known bug in Tk, can't have dialogs invoked by accelerator } win32 {} } } proc PrefsDialogFileMenu {w} { set f [ttk::labelframe $w.mfile -text [msgcat::mc {File}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarFile $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add cascade -label [msgcat::mc {Preserve During Load}] \ -menu $m.preserve global pscale global ppanzoom global pmarker menu $m.preserve $m.preserve add checkbutton -label [msgcat::mc {Pan}] \ -variable ppanzoom(preserve) $m.preserve add checkbutton -label [msgcat::mc {Region}] \ -variable pmarker(preserve) pack $f -side top -fill both -expand true } # Buttons proc ButtonsFileDef {} { global pbuttons array set pbuttons { file,open 1 file,save 1 file,movie 0 file,backup 0 file,restore 0 file,header 1 file,xpa,info 0 file,samp,image 0 file,samp,table 0 file,console 0 file,tcl 0 file,pspage 0 file,psprint 0 file,page 1 file,print 1 file,exit 1 } } proc CreateButtonsFile {} { global ds9 global buttons ttk::frame $ds9(buttons).file ButtonButton $ds9(buttons).file.open \ [string tolower [msgcat::mc {Open}]] \ [list OpenDialog fits] ButtonButton $ds9(buttons).file.save \ [string tolower [msgcat::mc {Save}]] \ [list SaveDialog fits] ButtonButton $ds9(buttons).file.movie \ [string tolower [msgcat::mc {Create Movie}]] MovieDialog ButtonButton $ds9(buttons).file.backup \ [string tolower [msgcat::mc {Backup}]] BackupDialog ButtonButton $ds9(buttons).file.restore \ [string tolower [msgcat::mc {Restore}]] RestoreDialog ButtonButton $ds9(buttons).file.header \ [string tolower [msgcat::mc {Header}]] DisplayHeaderMenu ButtonButton $ds9(buttons).file.xpainfo \ [string tolower {XPA Info}] XPAInfo ButtonButton $ds9(buttons).file.sampimage \ [string tolower [msgcat::mc {SAMP Image}]] "SAMPSendImageLoadFits {}" ButtonButton $ds9(buttons).file.samptable \ [string tolower [msgcat::mc {SAMP Table}]] "SAMPSendTableLoadFits {}" ButtonButton $ds9(buttons).file.console \ [string tolower [msgcat::mc {Console}]] OpenConsole ButtonButton $ds9(buttons).file.tcl \ [string tolower {TCL}] OpenSource ButtonButton $ds9(buttons).file.pspage \ [string tolower [msgcat::mc {PS Page Setup}]] PSPageSetup ButtonButton $ds9(buttons).file.psprint \ [string tolower [msgcat::mc {PS Print}]] PSPrint switch $ds9(wm) { x11 { ButtonButton $ds9(buttons).file.page \ [string tolower [msgcat::mc {Page Setup}]] PSPageSetup ButtonButton $ds9(buttons).file.print \ [string tolower [msgcat::mc {Print}]] PSPrint } aqua { ButtonButton $ds9(buttons).file.page \ [string tolower [msgcat::mc {Page Setup}]] PSPageSetup ButtonButton $ds9(buttons).file.print \ [string tolower [msgcat::mc {Print}]] PSPrint # ButtonButton $ds9(buttons).file.page [string tolower [msgcat::mc {Page Setup}]] MacOSXPageSetup # ButtonButton $ds9(buttons).file.print [string tolower [msgcat::mc {Print}]] MacOSXPrint } win32 {} } ButtonButton $ds9(buttons).file.exit \ [string tolower [msgcat::mc {Exit}]] QuitDS9 set buttons(file) " $ds9(buttons).file.open pbuttons(file,open) $ds9(buttons).file.save pbuttons(file,save) $ds9(buttons).file.movie pbuttons(file,movie) $ds9(buttons).file.backup pbuttons(file,backup) $ds9(buttons).file.restore pbuttons(file,restore) $ds9(buttons).file.header pbuttons(file,header) $ds9(buttons).file.xpainfo pbuttons(file,xpa,info) $ds9(buttons).file.sampimage pbuttons(file,samp,image) $ds9(buttons).file.samptable pbuttons(file,samp,table) $ds9(buttons).file.console pbuttons(file,console) $ds9(buttons).file.tcl pbuttons(file,tcl) $ds9(buttons).file.pspage pbuttons(file,pspage) $ds9(buttons).file.psprint pbuttons(file,psprint) $ds9(buttons).file.page pbuttons(file,page) $ds9(buttons).file.print pbuttons(file,print) $ds9(buttons).file.exit pbuttons(file,exit) " } proc PrefsDialogButtonbarFile {f} { global buttons global pbuttons global ds9 ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label "[msgcat::mc {Open}]..." \ -variable pbuttons(file,open) -command {UpdateButtons buttons(file)} $m add checkbutton -label "[msgcat::mc {Save}]..." \ -variable pbuttons(file,save) -command {UpdateButtons buttons(file)} $m add separator $m add checkbutton -label "[msgcat::mc {Create Movie}]..." \ -variable pbuttons(file,movie) -command {UpdateButtons buttons(file)} $m add separator $m add checkbutton -label "[msgcat::mc {Backup}]..." \ -variable pbuttons(file,backup) -command {UpdateButtons buttons(file)} $m add checkbutton -label "[msgcat::mc {Restore}]..." \ -variable pbuttons(file,restore) -command {UpdateButtons buttons(file)} $m add separator $m add checkbutton -label "[msgcat::mc {Display Header}]..." \ -variable pbuttons(file,header) -command {UpdateButtons buttons(file)} $m add separator $m add cascade -label [msgcat::mc {XPA}] -menu $m.xpa $m add cascade -label [msgcat::mc {SAMP}] -menu $m.samp $m add separator $m add checkbutton -label "[msgcat::mc {Open TCL Console}]..." \ -variable pbuttons(file,console) -command {UpdateButtons buttons(file)} $m add checkbutton -label "[msgcat::mc {Source TCL}]..." \ -variable pbuttons(file,tcl) -command {UpdateButtons buttons(file)} $m add separator switch $ds9(wm) { x11 { $m add checkbutton \ -label "[msgcat::mc {Page Setup}]..." \ -variable pbuttons(file,page) \ -command {UpdateButtons buttons(file)} $m add checkbutton \ -label "[msgcat::mc {Print}]..." \ -variable pbuttons(file,print) \ -command {UpdateButtons buttons(file)} } aqua { $m add checkbutton \ -label "[msgcat::mc {Page Setup}]..." \ -variable pbuttons(file,page) \ -command {UpdateButtons buttons(file)} $m add checkbutton \ -label "[msgcat::mc {Print}]..." \ -variable pbuttons(file,print) \ -command {UpdateButtons buttons(file)} # $m add checkbutton -label "[msgcat::mc {Postscript Page Setup}]..." -variable pbuttons(file,pspage) -command {UpdateButtons buttons(file)} # $m add checkbutton -label "[msgcat::mc {Postscript Print}]..." -variable pbuttons(file,psprint) -command {UpdateButtons buttons(file)} # $m add separator # $m add checkbutton -label "[msgcat::mc {Page Setup}]..." -variable pbuttons(file,page) -command {UpdateButtons buttons(file)} # $m add checkbutton -label "[msgcat::mc {Print}]..." -variable pbuttons(file,print) -command {UpdateButtons buttons(file)} } win32 {} } $m add separator $m add checkbutton -label [msgcat::mc {Exit}] \ -variable pbuttons(file,exit) -command {UpdateButtons buttons(filew)} menu $m.xpa $m.xpa add checkbutton -label "[msgcat::mc {Information}]..." \ -variable pbuttons(file,xpa,info) \ -command {UpdateButtons buttons(file)} menu $m.samp $m.samp add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(file,samp,image) \ -command {UpdateButtons buttons(file)} $m.samp add checkbutton -label [msgcat::mc {Table}] \ -variable pbuttons(file,samp,table) \ -command {UpdateButtons buttons(file)} } # Support proc UpdateFileMenuStatic {} { global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateFileMenuStatic" } if {$ds9(active,num) > 0} { $ds9(mb).file entryconfig "[msgcat::mc {Open}]..." \ -state normal $ds9(mb).file entryconfig [msgcat::mc {Open as}] \ -state normal $ds9(mb).file entryconfig [msgcat::mc {Import}] \ -state normal $ds9(buttons).file.open configure -state normal } else { $ds9(mb).file entryconfig "[msgcat::mc {Open}]..." \ -state disabled $ds9(mb).file entryconfig [msgcat::mc {Open as}] \ -state disabled $ds9(mb).file entryconfig [msgcat::mc {Import}] \ -state disabled $ds9(buttons).file.open configure -state disabled } } proc UpdateFileMenu {} { global ds9 global current global samp global xpa global debug if {$debug(tcl,update)} { puts stderr "UpdateFileMenu" } set mm $ds9(mb).file set bb $ds9(buttons).file if {$current(frame) != {}} { if {[$current(frame) has fits]} { $mm entryconfig "[msgcat::mc {Save}]..." -state normal $mm entryconfig [msgcat::mc {Save as}] -state normal $mm entryconfig [msgcat::mc {Export}] -state normal $mm entryconfig [msgcat::mc {Save Image}] -state normal $mm entryconfig "[msgcat::mc {Create Movie}]..." -state normal $mm entryconfig "[msgcat::mc {Display Header}]..." -state normal if {[$current(frame) has fits mosaic]} { $mm.save entryconfig "[msgcat::mc {Mosaic WCS}]..." -state normal $mm.save entryconfig "[msgcat::mc {Mosaic WCS Segment}]..." -state normal } else { $mm.save entryconfig "[msgcat::mc {Mosaic WCS}]..." -state disabled $mm.save entryconfig "[msgcat::mc {Mosaic WCS Segment}]..." -state disabled } $bb.save configure -state normal $bb.movie configure -state normal $bb.header configure -state normal } else { $mm entryconfig "[msgcat::mc {Save}]..." -state disabled $mm entryconfig [msgcat::mc {Save as}] -state disabled $mm entryconfig [msgcat::mc {Export}] -state disabled $mm entryconfig [msgcat::mc {Save Image}] -state disabled $mm entryconfig "[msgcat::mc {Create Movie}]..." -state disabled $mm entryconfig "[msgcat::mc {Display Header}]..." -state disabled $bb.save configure -state disabled $bb.movie configure -state disabled $bb.header configure -state disabled } switch -- [$current(frame) get type] { base { $mm.open entryconfig \ "[msgcat::mc {RGB Image}]..." -state disabled $mm.open entryconfig \ "[msgcat::mc {RGB Cube}]..." -state disabled $mm.save entryconfig \ "[msgcat::mc {RGB Image}]..." -state disabled $mm.save entryconfig \ "[msgcat::mc {RGB Cube}]..." -state disabled $mm.import entryconfig \ "[msgcat::mc {RGB Array}]..." -state disabled $mm.export entryconfig \ "[msgcat::mc {RGB Array}]..." -state disabled } rgb { $mm.open entryconfig \ "[msgcat::mc {RGB Image}]..." -state normal $mm.open entryconfig \ "[msgcat::mc {RGB Cube}]..." -state normal $mm.save entryconfig \ "[msgcat::mc {RGB Image}]..." -state normal $mm.save entryconfig \ "[msgcat::mc {RGB Cube}]..." -state normal $mm.import entryconfig \ "[msgcat::mc {RGB Array}]..." -state normal $mm.export entryconfig \ "[msgcat::mc {RGB Array}]..." -state normal } 3d { $mm.open entryconfig \ "[msgcat::mc {RGB Image}]..." -state disabled $mm.open entryconfig \ "[msgcat::mc {RGB Cube}]..." -state disabled $mm.save entryconfig \ "[msgcat::mc {RGB Image}]..." -state disabled $mm.save entryconfig \ "[msgcat::mc {RGB Cube}]..." -state disabled $mm.import entryconfig \ "[msgcat::mc {RGB Array}]..." -state disabled $mm.export entryconfig \ "[msgcat::mc {RGB Array}]..." -state disabled } } if {[info exists samp]} { set ss [expr $ds9(menu,start)+2] if {[$current(frame) has fits]} { $mm.samp entryconfig [msgcat::mc {Image}] \ -state normal if {[$mm.samp.image index end] >= $ss} { $mm.samp.image delete $ss end } foreach args $samp(apps,image) { foreach {id name} $args { $mm.samp.image add command -label $name \ -command "SAMPSendImageLoadFits $id" } } $bb.sampimage configure -state normal if {[$current(frame) has fits bin]} { $mm.samp entryconfig [msgcat::mc {Table}] -state normal if {[$mm.samp.table index end] >= $ss} { $mm.samp.table delete $ss end } foreach args $samp(apps,table) { foreach {id name} $args { $mm.samp.table add command -label $name \ -command "SAMPSendTableLoadFits $id" } } $bb.samptable configure -state normal } else { $mm.samp entryconfig [msgcat::mc {Table}] -state disabled $bb.samptable configure -state disabled } } else { $mm.samp entryconfig [msgcat::mc {Image}] -state disabled $mm.samp entryconfig [msgcat::mc {Table}] -state disabled $bb.sampimage configure -state disabled $bb.samptable configure -state disabled } } else { $mm.samp entryconfig [msgcat::mc {Image}] -state disabled $mm.samp entryconfig [msgcat::mc {Table}] -state disabled $bb.sampimage configure -state disabled $bb.samptable configure -state disabled } } else { $mm entryconfig "[msgcat::mc {Save}]..." -state disabled $mm entryconfig [msgcat::mc {Save as}] -state disabled $mm entryconfig [msgcat::mc {Export}] -state disabled $mm entryconfig [msgcat::mc {Save Image}] -state disabled $mm entryconfig "[msgcat::mc {Create Movie}]..." -state disabled $mm entryconfig "[msgcat::mc {Display Header}]..." -state disabled $bb.save configure -state disabled $bb.movie configure -state disabled $bb.header configure -state disabled $mm.samp entryconfig [msgcat::mc {Image}] -state disabled $mm.samp entryconfig [msgcat::mc {Table}] -state disabled $bb.sampimage configure -state disabled $bb.samptable configure -state disabled } # XPA if {[info exists xpa]} { $mm.xpa entryconfig "[msgcat::mc {Information}]..." -state normal $mm.xpa entryconfig [msgcat::mc {Disconnect}] -state normal } else { $mm.xpa entryconfig "[msgcat::mc {Information}]..." -state disabled $mm.xpa entryconfig [msgcat::mc {Disconnect}] -state disabled } # SAMP if {[info exists samp]} { $mm.samp entryconfig [msgcat::mc {Connect}] -state disabled $mm.samp entryconfig [msgcat::mc {Disconnect}] -state normal } else { $mm.samp entryconfig [msgcat::mc {Connect}] -state normal $mm.samp entryconfig [msgcat::mc {Disconnect}] -state disabled } } ����������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mframe.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000145132 12527427333 016520� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc FrameMainMenu {} { global ds9 global current menu $ds9(mb).frame $ds9(mb).frame add command -label [msgcat::mc {New Frame}] \ -command CreateFrame $ds9(mb).frame add command -label [msgcat::mc {New Frame RGB}] \ -command CreateRGBFrame $ds9(mb).frame add command -label [msgcat::mc {New Frame 3D}] \ -command Create3DFrame $ds9(mb).frame add separator $ds9(mb).frame add command -label [msgcat::mc {Delete Frame}] \ -command DeleteCurrentFrame $ds9(mb).frame add command -label [msgcat::mc {Delete All Frames}] \ -command DeleteAllFramesMenu $ds9(mb).frame add separator $ds9(mb).frame add command -label [msgcat::mc {Clear Frame}] \ -command ClearCurrentFrame $ds9(mb).frame add command -label [msgcat::mc {Reset Frame}] \ -command ResetCurrentFrame $ds9(mb).frame add command -label [msgcat::mc {Refresh Frame}] \ -command UpdateCurrentFrame $ds9(mb).frame add separator $ds9(mb).frame add radiobutton -label [msgcat::mc {Single Frame}] \ -variable current(display) -value single -command DisplayMode $ds9(mb).frame add radiobutton -label [msgcat::mc {Tile Frames}] \ -variable current(display) -value tile -command DisplayMode $ds9(mb).frame add radiobutton -label [msgcat::mc {Blink Frames}] \ -variable current(display) -value blink -command DisplayMode $ds9(mb).frame add separator $ds9(mb).frame add cascade -label [msgcat::mc {Match}] \ -menu $ds9(mb).frame.match $ds9(mb).frame add cascade -label [msgcat::mc {Lock}] \ -menu $ds9(mb).frame.lock $ds9(mb).frame add separator $ds9(mb).frame add cascade -label [msgcat::mc {Goto Frame}] \ -menu $ds9(mb).frame.goto $ds9(mb).frame add cascade -label [msgcat::mc {Show/Hide Frames}] \ -menu $ds9(mb).frame.active $ds9(mb).frame add cascade -label [msgcat::mc {Move Frame}] \ -menu $ds9(mb).frame.move $ds9(mb).frame add separator $ds9(mb).frame add command -label [msgcat::mc {First Frame}] \ -command FirstFrame $ds9(mb).frame add command -label [msgcat::mc {Previous Frame}] \ -command PrevFrame $ds9(mb).frame add command -label [msgcat::mc {Next Frame}] \ -command NextFrame $ds9(mb).frame add command -label [msgcat::mc {Last Frame}] \ -command LastFrame $ds9(mb).frame add separator $ds9(mb).frame add command -label "[msgcat::mc {Cube}]..." \ -command CubeDialog $ds9(mb).frame add command -label "[msgcat::mc {RGB}]..." \ -command RGBDialog $ds9(mb).frame add command -label "[msgcat::mc {3D}]..." \ -command 3DDialog $ds9(mb).frame add separator $ds9(mb).frame add cascade -label [msgcat::mc {Frame Parameters}] \ -menu $ds9(mb).frame.params # match menu $ds9(mb).frame.match $ds9(mb).frame.match add cascade -label [msgcat::mc {Frame}] \ -menu $ds9(mb).frame.match.frame $ds9(mb).frame.match add cascade -label [msgcat::mc {Crosshair}] \ -menu $ds9(mb).frame.match.crosshair $ds9(mb).frame.match add cascade -label [msgcat::mc {Crop}] \ -menu $ds9(mb).frame.match.crop $ds9(mb).frame.match add cascade -label [msgcat::mc {Slice}] \ -menu $ds9(mb).frame.match.cube $ds9(mb).frame.match add command -label [msgcat::mc {Bin}] \ -command MatchBinCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Axes Order}] \ -command MatchAxesCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Scale}] \ -command MatchScaleCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Scale and Limits}] \ -command MatchScaleLimitsCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Colorbar}] \ -command MatchColorCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Block}] \ -command MatchBlockCurrent $ds9(mb).frame.match add command -label [msgcat::mc {Smooth}] \ -command MatchSmoothCurrent menu $ds9(mb).frame.match.frame $ds9(mb).frame.match.frame add command -label [msgcat::mc {WCS}] \ -command {MatchFrameCurrent wcs} $ds9(mb).frame.match.frame add separator $ds9(mb).frame.match.frame add command -label [msgcat::mc {Image}] \ -command {MatchFrameCurrent image} $ds9(mb).frame.match.frame add command -label [msgcat::mc {Physical}] \ -command {MatchFrameCurrent physical} $ds9(mb).frame.match.frame add command -label [msgcat::mc {Amplifier}] \ -command {MatchFrameCurrent amplifier} $ds9(mb).frame.match.frame add command -label [msgcat::mc {Detector}] \ -command {MatchFrameCurrent detector} menu $ds9(mb).frame.match.crosshair $ds9(mb).frame.match.crosshair add command -label [msgcat::mc {WCS}] \ -command {MatchCrosshairCurrent wcs} $ds9(mb).frame.match.crosshair add separator $ds9(mb).frame.match.crosshair add command -label [msgcat::mc {Image}] \ -command {MatchCrosshairCurrent image} $ds9(mb).frame.match.crosshair add command -label [msgcat::mc {Physical}] \ -command {MatchCrosshairCurrent physical} $ds9(mb).frame.match.crosshair add command -label [msgcat::mc {Amplifier}] \ -command {MatchCrosshairCurrent amplifier} $ds9(mb).frame.match.crosshair add command -label [msgcat::mc {Detector}] \ -command {MatchCrosshairCurrent detector} menu $ds9(mb).frame.match.crop $ds9(mb).frame.match.crop add command -label [msgcat::mc {WCS}] \ -command {MatchCropCurrent wcs} $ds9(mb).frame.match.crop add separator $ds9(mb).frame.match.crop add command -label [msgcat::mc {Image}] \ -command {MatchCropCurrent image} $ds9(mb).frame.match.crop add command -label [msgcat::mc {Physical}] \ -command {MatchCropCurrent physical} $ds9(mb).frame.match.crop add command -label [msgcat::mc {Amplifier}] \ -command {MatchCropCurrent amplifier} $ds9(mb).frame.match.crop add command -label [msgcat::mc {Detector}] \ -command {MatchCropCurrent detector} menu $ds9(mb).frame.match.cube $ds9(mb).frame.match.cube add command -label [msgcat::mc {WCS}] \ -command {MatchCubeCurrent wcs} $ds9(mb).frame.match.cube add separator $ds9(mb).frame.match.cube add command -label [msgcat::mc {Image}] \ -command {MatchCubeCurrent image} # lock menu $ds9(mb).frame.lock $ds9(mb).frame.lock add cascade -label [msgcat::mc {Frame}] \ -menu $ds9(mb).frame.lock.frame $ds9(mb).frame.lock add cascade -label [msgcat::mc {Crosshair}] \ -menu $ds9(mb).frame.lock.crosshair $ds9(mb).frame.lock add cascade -label [msgcat::mc {Crop}] \ -menu $ds9(mb).frame.lock.crop $ds9(mb).frame.lock add cascade -label [msgcat::mc {Slice}] \ -menu $ds9(mb).frame.lock.cube $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Bin}] \ -variable bin(lock) -command {LockBinCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Axes Order}] \ -variable cube(lock,axes) -command {LockAxesCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Scale}] \ -variable scale(lock) -command {LockScaleCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Scale and Limits}] \ -variable scale(lock,limits) -command {LockScaleLimitsCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Colorbar}] \ -variable colorbar(lock) -command {LockColorCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Block}] \ -variable block(lock) -command {LockBlockCurrent} $ds9(mb).frame.lock add checkbutton -label [msgcat::mc {Smooth}] \ -variable smooth(lock) -command {LockSmoothCurrent} menu $ds9(mb).frame.lock.frame $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {None}] \ -variable panzoom(lock) -value none -command LockFrameCurrent $ds9(mb).frame.lock.frame add separator $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {WCS}] \ -variable panzoom(lock) -value wcs -command LockFrameCurrent $ds9(mb).frame.lock.frame add separator $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {Image}] \ -variable panzoom(lock) -value image -command LockFrameCurrent $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {Physical}] \ -variable panzoom(lock) -value physical -command LockFrameCurrent $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {Amplifier}] \ -variable panzoom(lock) -value amplifier -command LockFrameCurrent $ds9(mb).frame.lock.frame add radiobutton -label [msgcat::mc {Detector}] \ -variable panzoom(lock) -value detector -command LockFrameCurrent menu $ds9(mb).frame.lock.crosshair $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {None}] -variable crosshair(lock) \ -value none -command LockCrosshairCurrent $ds9(mb).frame.lock.crosshair add separator $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {WCS}] -variable crosshair(lock) \ -value wcs -command LockCrosshairCurrent $ds9(mb).frame.lock.crosshair add separator $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {Image}] -variable crosshair(lock) \ -value image -command LockCrosshairCurrent $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {Physical}] -variable crosshair(lock) \ -value physical -command LockCrosshairCurrent $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {Amplifier}] -variable crosshair(lock) \ -value amplifier -command LockCrosshairCurrent $ds9(mb).frame.lock.crosshair add radiobutton \ -label [msgcat::mc {Detector}] -variable crosshair(lock) \ -value detector -command LockCrosshairCurrent menu $ds9(mb).frame.lock.crop $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {None}] \ -variable crop(lock) -value none -command LockCropCurrent $ds9(mb).frame.lock.crop add separator $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {WCS}] \ -variable crop(lock) -value wcs -command LockCropCurrent $ds9(mb).frame.lock.crop add separator $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {Image}] \ -variable crop(lock) -value image -command LockCropCurrent $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {Physical}] \ -variable crop(lock) -value physical -command LockCropCurrent $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {Amplifier}] \ -variable crop(lock) -value amplifier -command LockCropCurrent $ds9(mb).frame.lock.crop add radiobutton -label [msgcat::mc {Detector}] \ -variable crop(lock) -value detector -command LockCropCurrent menu $ds9(mb).frame.lock.cube $ds9(mb).frame.lock.cube add radiobutton -label [msgcat::mc {None}] \ -variable cube(lock) -value none -command LockCubeCurrent $ds9(mb).frame.lock.cube add separator $ds9(mb).frame.lock.cube add radiobutton -label [msgcat::mc {WCS}] \ -variable cube(lock) -value wcs -command LockCubeCurrent $ds9(mb).frame.lock.cube add separator $ds9(mb).frame.lock.cube add radiobutton -label [msgcat::mc {Image}] \ -variable cube(lock) -value image -command LockCubeCurrent # active menu $ds9(mb).frame.active $ds9(mb).frame.active add command -label [msgcat::mc {Show All}] \ -command ActiveFrameAll $ds9(mb).frame.active add command -label [msgcat::mc {Hide All}] \ -command ActiveFrameNone $ds9(mb).frame.active add separator # move menu $ds9(mb).frame.move $ds9(mb).frame.move add command -label [msgcat::mc {First}] \ -command MoveFirstFrame $ds9(mb).frame.move add command -label [msgcat::mc {Back}] \ -command MovePrevFrame $ds9(mb).frame.move add command -label [msgcat::mc {Forward}] \ -command MoveNextFrame $ds9(mb).frame.move add command -label [msgcat::mc {Last}] \ -command MoveLastFrame menu $ds9(mb).frame.goto # params menu $ds9(mb).frame.params $ds9(mb).frame.params add cascade -label [msgcat::mc {Tile}] \ -menu $ds9(mb).frame.params.tile $ds9(mb).frame.params add cascade -label [msgcat::mc {Blink Interval}] \ -menu $ds9(mb).frame.params.blink $ds9(mb).frame.params add command -label [msgcat::mc {Display Size}] \ -command DisplayDefaultDialog menu $ds9(mb).frame.params.tile $ds9(mb).frame.params.tile add radiobutton -label [msgcat::mc {Grid}] \ -variable tile(mode) -value grid -command DisplayMode $ds9(mb).frame.params.tile add radiobutton -label [msgcat::mc {Columns}] \ -variable tile(mode) -value column -command DisplayMode $ds9(mb).frame.params.tile add radiobutton -label [msgcat::mc {Rows}] \ -variable tile(mode) -value row -command DisplayMode $ds9(mb).frame.params.tile add separator $ds9(mb).frame.params.tile add command \ -label "[msgcat::mc {Tile Parameters}]..." -command TileDialog menu $ds9(mb).frame.params.blink $ds9(mb).frame.params.blink add radiobutton \ -label ".125 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 125 $ds9(mb).frame.params.blink add radiobutton \ -label ".25 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 250 $ds9(mb).frame.params.blink add radiobutton \ -label ".5 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 500 $ds9(mb).frame.params.blink add radiobutton \ -label "1 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 1000 $ds9(mb).frame.params.blink add radiobutton \ -label "2 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 2000 $ds9(mb).frame.params.blink add radiobutton \ -label "4 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 4000 $ds9(mb).frame.params.blink add radiobutton \ -label "8 [msgcat::mc {Seconds}]" \ -variable blink(interval) -value 8000 } proc PrefsDialogFrameMenu {w} { set f [ttk::labelframe $w.mframe -text [msgcat::mc {Frame}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarFrame $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add radiobutton -label [msgcat::mc {Single Frame}] \ -variable pcurrent(display) -value single $m add radiobutton -label [msgcat::mc {Tile Frames}] \ -variable pcurrent(display) -value tile $m add radiobutton -label [msgcat::mc {Blink Frames}] \ -variable pcurrent(display) -value blink $m add separator $m add cascade -label [msgcat::mc {Frame Parameters}] \ -menu $m.params menu $m.params $m.params add cascade -label [msgcat::mc {Tile}] \ -menu $m.params.tile $m.params add cascade -label [msgcat::mc {Blink Interval}] \ -menu $m.params.blink menu $m.params.tile $m.params.tile add radiobutton -label [msgcat::mc {Grid}] \ -variable ptile(mode) -value grid $m.params.tile add radiobutton -label [msgcat::mc {Columns}] \ -variable ptile(mode) -value column $m.params.tile add radiobutton -label [msgcat::mc {Rows}] \ -variable ptile(mode) -value row menu $m.params.blink $m.params.blink add radiobutton -label ".125 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 125 $m.params.blink add radiobutton -label ".25 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 250 $m.params.blink add radiobutton -label ".5 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 500 $m.params.blink add radiobutton -label "1 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 1000 $m.params.blink add radiobutton -label "2 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 2000 $m.params.blink add radiobutton -label "4 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 4000 $m.params.blink add radiobutton -label "8 [msgcat::mc {Seconds}]" \ -variable pblink(interval) -value 8000 pack $f -side top -fill both -expand true } # Buttons proc ButtonsFrameDef {} { global pbuttons array set pbuttons { frame,new 1 frame,newrgb 1 frame,new3d 1 frame,delete 1 frame,deleteall 0 frame,clear 1 frame,reset 0 frame,refresh 0 frame,single 1 frame,tile 1 frame,blink 1 frame,match,bin 0 frame,match,axes 0 frame,match,scale 0 frame,match,scalelimits 0 frame,match,color 0 frame,match,smooth 0 frame,match,frame,wcs 0 frame,match,frame,image 0 frame,match,frame,physical 0 frame,match,frame,detector 0 frame,match,frame,amplifier 0 frame,match,crosshair,wcs 0 frame,match,crosshair,image 0 frame,match,crosshair,physical 0 frame,match,crosshair,detector 0 frame,match,crosshair,amplifier 0 frame,match,crop,wcs 0 frame,match,crop,image 0 frame,match,crop,physical 0 frame,match,crop,detector 0 frame,match,crop,amplifier 0 frame,match,cube,wcs 0 frame,match,cube,image 0 frame,lock,bin 0 frame,lock,axes 0 frame,lock,scale 0 frame,lock,scalelimits 0 frame,lock,color 0 frame,lock,smooth 0 frame,lock,frame,none 0 frame,lock,frame,wcs 0 frame,lock,frame,image 0 frame,lock,frame,physical 0 frame,lock,frame,detector 0 frame,lock,frame,amplifier 0 frame,lock,crosshair,none 0 frame,lock,crosshair,wcs 0 frame,lock,crosshair,image 0 frame,lock,crosshair,physical 0 frame,lock,crosshair,detector 0 frame,lock,crosshair,amplifier 0 frame,lock,crop,none 0 frame,lock,crop,wcs 0 frame,lock,crop,image 0 frame,lock,crop,physical 0 frame,lock,crop,detector 0 frame,lock,crop,amplifier 0 frame,lock,cube,none 0 frame,lock,cube,wcs 0 frame,lock,cube,image 0 frame,movefirst 0 frame,moveprev 0 frame,movenext 0 frame,movelast 0 frame,first 1 frame,prev 1 frame,next 1 frame,last 1 frame,cube 0 frame,rgb 0 frame,3d 0 frame,size 0 } } proc CreateButtonsFrame {} { global buttons global ds9 global current ttk::frame $ds9(buttons).frame ButtonButton $ds9(buttons).frame.new \ [string tolower [msgcat::mc {New}]] CreateFrame ButtonButton $ds9(buttons).frame.newrgb \ [string tolower [msgcat::mc {RGB}]] CreateRGBFrame ButtonButton $ds9(buttons).frame.new3d \ [string tolower [msgcat::mc {3D}]] Create3DFrame ButtonButton $ds9(buttons).frame.delete \ [string tolower [msgcat::mc {Delete}]] DeleteCurrentFrame ButtonButton $ds9(buttons).frame.deleteall \ [string tolower [msgcat::mc {Delete All}]] DeleteAllFramesMenu ButtonButton $ds9(buttons).frame.clear \ [string tolower [msgcat::mc {Clear}]] ClearCurrentFrame ButtonButton $ds9(buttons).frame.reset \ [string tolower [msgcat::mc {Reset}]] ResetCurrentFrame ButtonButton $ds9(buttons).frame.refresh \ [string tolower [msgcat::mc {Refresh}]] UpdateCurrentFrame RadioButton $ds9(buttons).frame.single \ [string tolower [msgcat::mc {Single}]] \ current(display) single DisplayMode RadioButton $ds9(buttons).frame.tile \ [string tolower [msgcat::mc {Tile}]] \ current(display) tile DisplayMode RadioButton $ds9(buttons).frame.blink \ [string tolower [msgcat::mc {Blink}]] \ current(display) blink DisplayMode ButtonButton $ds9(buttons).frame.matchbin \ [string tolower [msgcat::mc {Match Bin}]] MatchBinCurrent ButtonButton $ds9(buttons).frame.matchaxes \ [string tolower [msgcat::mc {Match Axes}]] MatchAxesCurrent ButtonButton $ds9(buttons).frame.matchscale \ [string tolower [msgcat::mc {Match Scale}]] MatchScaleCurrent ButtonButton $ds9(buttons).frame.matchscalelimits \ [string tolower [msgcat::mc {Match Limits}]] \ MatchScaleLimitsCurrent ButtonButton $ds9(buttons).frame.matchcolor \ [string tolower [msgcat::mc {Match Color}]] MatchColorCurrent ButtonButton $ds9(buttons).frame.matchsmooth \ [string tolower [msgcat::mc {Match Smooth}]] MatchSmoothCurrent ButtonButton $ds9(buttons).frame.matchframewcs \ [string tolower [msgcat::mc {Match Frame WCS}]] \ {MatchFrameCurrent wcs} ButtonButton $ds9(buttons).frame.matchframeimage \ [string tolower [msgcat::mc {Match Frame Image}]] \ {MatchFrameCurrent image} ButtonButton $ds9(buttons).frame.matchframephysical \ [string tolower [msgcat::mc {Match Frame Physical}]] \ {MatchFrameCurrent physical} ButtonButton $ds9(buttons).frame.matchframedetector \ [string tolower [msgcat::mc {Match Frame Detector}]] \ {MatchFrameCurrent detector} ButtonButton $ds9(buttons).frame.matchframeamplifier \ [string tolower [msgcat::mc {Match Frame Amplifier}]] \ {MatchFrameCurrent amplifier} ButtonButton $ds9(buttons).frame.matchcrosshairwcs \ [string tolower [msgcat::mc {Match Crosshair WCS}]] \ {MatchCrosshairCurrent wcs} ButtonButton $ds9(buttons).frame.matchcrosshairimage \ [string tolower [msgcat::mc {Match Crosshair Image}]] \ {MatchCrosshairCurrent image} ButtonButton $ds9(buttons).frame.matchcrosshairphysical \ [string tolower [msgcat::mc {Match Crosshair Physical}]] \ {MatchCrosshairCurrent physical} ButtonButton $ds9(buttons).frame.matchcrosshairdetector \ [string tolower [msgcat::mc {Match Crosshair Detector}]] \ {MatchCrosshairCurrent detector} ButtonButton $ds9(buttons).frame.matchcrosshairamplifier \ [string tolower [msgcat::mc {Match Crosshair Amplifier}]] \ {MatchCrosshairCurrent amplifier} ButtonButton $ds9(buttons).frame.matchcropwcs \ [string tolower [msgcat::mc {Match Crop WCS}]] \ {MatchCropCurrent wcs} ButtonButton $ds9(buttons).frame.matchcropimage \ [string tolower [msgcat::mc {Match Crop Image}]] \ {MatchCropCurrent image} ButtonButton $ds9(buttons).frame.matchcropphysical \ [string tolower [msgcat::mc {Match Crop Physical}]] \ {MatchCropCurrent physical} ButtonButton $ds9(buttons).frame.matchcropdetector \ [string tolower [msgcat::mc {Match Crop Detector}]] \ {MatchCropCurrent detector} ButtonButton $ds9(buttons).frame.matchcropamplifier \ [string tolower [msgcat::mc {Match Crop Amplifier}]] \ {MatchCropCurrent amplifier} ButtonButton $ds9(buttons).frame.matchcubewcs \ [string tolower [msgcat::mc {Match Slice WCS}]] \ {MatchCubeCurrent wcs} ButtonButton $ds9(buttons).frame.matchcubeimage \ [string tolower [msgcat::mc {Match Slice Image}]] \ {MatchCubeCurrent image} CheckButton $ds9(buttons).frame.lockbin \ [string tolower [msgcat::mc {Lock Bin}]] bin(lock) LockBinCurrent CheckButton $ds9(buttons).frame.lockaxes \ [string tolower [msgcat::mc {Lock Axes}]] \ cube(lock,axes) LockAxesCurrent CheckButton $ds9(buttons).frame.lockscale \ [string tolower [msgcat::mc {Lock Scale}]] scale(lock) LockScaleCurrent CheckButton $ds9(buttons).frame.lockscalelimits \ [string tolower [msgcat::mc {Lock Limits}]] \ scale(lock,limits) LockScaleLimitsCurrent CheckButton $ds9(buttons).frame.lockcolor \ [string tolower [msgcat::mc {Lock Color}]] color(lock) LockColorCurrent CheckButton $ds9(buttons).frame.locksmooth \ [string tolower [msgcat::mc {Lock Smooth}]] \ smooth(lock) LockSmoothCurrent RadioButton $ds9(buttons).frame.lockframenone \ [string tolower [msgcat::mc {Lock Frame None}]] \ panzoom(lock) none LockFrameCurrent RadioButton $ds9(buttons).frame.lockframewcs \ [string tolower [msgcat::mc {Lock Frame WCS}]] \ panzoom(lock) wcs LockFrameCurrent RadioButton $ds9(buttons).frame.lockframeimage \ [string tolower [msgcat::mc {Lock Frame Image}]] \ panzoom(lock) image LockFrameCurrent RadioButton $ds9(buttons).frame.lockframephysical \ [string tolower [msgcat::mc {Lock Frame Physical}]] \ panzoom(lock) physical LockFrameCurrent RadioButton $ds9(buttons).frame.lockframedetector \ [string tolower [msgcat::mc {Lock Frame Detector}]] \ panzoom(lock) detector LockFrameCurrent RadioButton $ds9(buttons).frame.lockframeamplifier \ [string tolower [msgcat::mc {Lock Frame Amplifier}]] \ panzoom(lock) amplifier LockFrameCurrent RadioButton $ds9(buttons).frame.lockcrosshairnone \ [string tolower [msgcat::mc {Lock Crosshair None}]] \ crosshair(lock) none LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcrosshairwcs \ [string tolower [msgcat::mc {Lock Crosshair WCS}]] \ crosshair(lock) wcs LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcrosshairimage \ [string tolower [msgcat::mc {Lock Crosshair Image}]] \ crosshair(lock) image LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcrosshairphysical \ [string tolower [msgcat::mc {Lock Crosshair Physical}]] \ crosshair(lock) physical LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcrosshairdetector \ [string tolower [msgcat::mc {Lock Crosshair Detector}]] \ crosshair(lock) detector LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcrosshairamplifier \ [string tolower [msgcat::mc {Lock Crosshair Amplifier}]] \ crosshair(lock) amplifier LockCrosshairCurrent RadioButton $ds9(buttons).frame.lockcropnone \ [string tolower [msgcat::mc {Lock Crop None}]] \ crop(lock) none LockCropCurrent RadioButton $ds9(buttons).frame.lockcropwcs \ [string tolower [msgcat::mc {Lock Crop WCS}]] \ crop(lock) wcs LockCropCurrent RadioButton $ds9(buttons).frame.lockcropimage \ [string tolower [msgcat::mc {Lock Crop Image}]] \ crop(lock) image LockCropCurrent RadioButton $ds9(buttons).frame.lockcropphysical \ [string tolower [msgcat::mc {Lock Crop Physical}]] \ crop(lock) physical LockCropCurrent RadioButton $ds9(buttons).frame.lockcropdetector \ [string tolower [msgcat::mc {Lock Crop Detector}]] \ crop(lock) detector LockCropCurrent RadioButton $ds9(buttons).frame.lockcropamplifier \ [string tolower [msgcat::mc {Lock Crop Amplifier}]] \ crop(lock) amplifier LockCropCurrent RadioButton $ds9(buttons).frame.lockcubenone \ [string tolower [msgcat::mc {Lock Slice None}]] \ cube(lock) none LockCubeCurrent RadioButton $ds9(buttons).frame.lockcubewcs \ [string tolower [msgcat::mc {Lock Slice WCS}]] \ cube(lock) wcs LockCubeCurrent RadioButton $ds9(buttons).frame.lockcubeimage \ [string tolower [msgcat::mc {Lock Slice Image}]] \ cube(lock) image LockCubeCurrent ButtonButton $ds9(buttons).frame.movefirst \ [string tolower [msgcat::mc {Move First}]] MoveFirstFrame ButtonButton $ds9(buttons).frame.moveprev \ [string tolower [msgcat::mc {Move Back}]] MovePrevFrame ButtonButton $ds9(buttons).frame.movenext \ [string tolower [msgcat::mc {Move Forward}]] MoveNextFrame ButtonButton $ds9(buttons).frame.movelast \ [string tolower [msgcat::mc {Move Last}]] MoveLastFrame ButtonButton $ds9(buttons).frame.first \ [string tolower [msgcat::mc {First}]] FirstFrame ButtonButton $ds9(buttons).frame.prev \ [string tolower [msgcat::mc {Prev}]] PrevFrame ButtonButton $ds9(buttons).frame.next \ [string tolower [msgcat::mc {Next}]] NextFrame ButtonButton $ds9(buttons).frame.last \ [string tolower [msgcat::mc {Last}]] LastFrame ButtonButton $ds9(buttons).frame.cube \ [string tolower "[msgcat::mc {Cube}]..."] CubeDialog ButtonButton $ds9(buttons).frame.rgb \ [string tolower "[msgcat::mc {RGB}]..."] RGBDialog ButtonButton $ds9(buttons).frame.3d \ [string tolower "[msgcat::mc {3D}]..."] 3DDialog ButtonButton $ds9(buttons).frame.size \ [string tolower [msgcat::mc {Size}]] DisplayDefaultDialog set buttons(frame) " $ds9(buttons).frame.new pbuttons(frame,new) $ds9(buttons).frame.newrgb pbuttons(frame,newrgb) $ds9(buttons).frame.new3d pbuttons(frame,new3d) $ds9(buttons).frame.delete pbuttons(frame,delete) $ds9(buttons).frame.deleteall pbuttons(frame,deleteall) $ds9(buttons).frame.clear pbuttons(frame,clear) $ds9(buttons).frame.reset pbuttons(frame,reset) $ds9(buttons).frame.refresh pbuttons(frame,refresh) $ds9(buttons).frame.single pbuttons(frame,single) $ds9(buttons).frame.tile pbuttons(frame,tile) $ds9(buttons).frame.blink pbuttons(frame,blink) $ds9(buttons).frame.matchbin pbuttons(frame,match,bin) $ds9(buttons).frame.matchaxes pbuttons(frame,match,axes) $ds9(buttons).frame.matchscale pbuttons(frame,match,scale) $ds9(buttons).frame.matchscalelimits pbuttons(frame,match,scalelimits) $ds9(buttons).frame.matchcolor pbuttons(frame,match,color) $ds9(buttons).frame.matchsmooth pbuttons(frame,match,smooth) $ds9(buttons).frame.matchframewcs pbuttons(frame,match,frame,wcs) $ds9(buttons).frame.matchframeimage pbuttons(frame,match,frame,image) $ds9(buttons).frame.matchframephysical pbuttons(frame,match,frame,physical) $ds9(buttons).frame.matchframedetector pbuttons(frame,match,frame,detector) $ds9(buttons).frame.matchframeamplifier pbuttons(frame,match,frame,amplifier) $ds9(buttons).frame.matchcrosshairwcs pbuttons(frame,match,crosshair,wcs) $ds9(buttons).frame.matchcrosshairimage pbuttons(frame,match,crosshair,image) $ds9(buttons).frame.matchcrosshairphysical pbuttons(frame,match,crosshair,physical) $ds9(buttons).frame.matchcrosshairdetector pbuttons(frame,match,crosshair,detector) $ds9(buttons).frame.matchcrosshairamplifier pbuttons(frame,match,crosshair,amplifier) $ds9(buttons).frame.matchcropwcs pbuttons(frame,match,crop,wcs) $ds9(buttons).frame.matchcropimage pbuttons(frame,match,crop,image) $ds9(buttons).frame.matchcropphysical pbuttons(frame,match,crop,physical) $ds9(buttons).frame.matchcropdetector pbuttons(frame,match,crop,detector) $ds9(buttons).frame.matchcropamplifier pbuttons(frame,match,crop,amplifier) $ds9(buttons).frame.matchcubewcs pbuttons(frame,match,cube,wcs) $ds9(buttons).frame.matchcubeimage pbuttons(frame,match,cube,image) $ds9(buttons).frame.lockbin pbuttons(frame,lock,bin) $ds9(buttons).frame.lockaxes pbuttons(frame,lock,axes) $ds9(buttons).frame.lockscale pbuttons(frame,lock,scale) $ds9(buttons).frame.lockscalelimits pbuttons(frame,lock,scalelimits) $ds9(buttons).frame.lockcolor pbuttons(frame,lock,color) $ds9(buttons).frame.locksmooth pbuttons(frame,lock,smooth) $ds9(buttons).frame.lockframenone pbuttons(frame,lock,frame,none) $ds9(buttons).frame.lockframewcs pbuttons(frame,lock,frame,wcs) $ds9(buttons).frame.lockframeimage pbuttons(frame,lock,frame,image) $ds9(buttons).frame.lockframephysical pbuttons(frame,lock,frame,physical) $ds9(buttons).frame.lockframedetector pbuttons(frame,lock,frame,detector) $ds9(buttons).frame.lockframeamplifier pbuttons(frame,lock,frame,amplifier) $ds9(buttons).frame.lockcrosshairnone pbuttons(frame,lock,crosshair,none) $ds9(buttons).frame.lockcrosshairwcs pbuttons(frame,lock,crosshair,wcs) $ds9(buttons).frame.lockcrosshairimage pbuttons(frame,lock,crosshair,image) $ds9(buttons).frame.lockcrosshairphysical pbuttons(frame,lock,crosshair,physical) $ds9(buttons).frame.lockcrosshairdetector pbuttons(frame,lock,crosshair,detector) $ds9(buttons).frame.lockcrosshairamplifier pbuttons(frame,lock,crosshair,amplifier) $ds9(buttons).frame.lockcropnone pbuttons(frame,lock,crop,none) $ds9(buttons).frame.lockcropwcs pbuttons(frame,lock,crop,wcs) $ds9(buttons).frame.lockcropimage pbuttons(frame,lock,crop,image) $ds9(buttons).frame.lockcropphysical pbuttons(frame,lock,crop,physical) $ds9(buttons).frame.lockcropdetector pbuttons(frame,lock,crop,detector) $ds9(buttons).frame.lockcropamplifier pbuttons(frame,lock,crop,amplifier) $ds9(buttons).frame.lockcubenone pbuttons(frame,lock,cube,none) $ds9(buttons).frame.lockcubewcs pbuttons(frame,lock,cube,wcs) $ds9(buttons).frame.lockcubeimage pbuttons(frame,lock,cube,image) $ds9(buttons).frame.movefirst pbuttons(frame,movefirst) $ds9(buttons).frame.moveprev pbuttons(frame,moveprev) $ds9(buttons).frame.movenext pbuttons(frame,movenext) $ds9(buttons).frame.movelast pbuttons(frame,movelast) $ds9(buttons).frame.first pbuttons(frame,first) $ds9(buttons).frame.prev pbuttons(frame,prev) $ds9(buttons).frame.next pbuttons(frame,next) $ds9(buttons).frame.last pbuttons(frame,last) $ds9(buttons).frame.cube pbuttons(frame,cube) $ds9(buttons).frame.rgb pbuttons(frame,rgb) $ds9(buttons).frame.3d pbuttons(frame,3d) $ds9(buttons).frame.size pbuttons(frame,size) " } proc PrefsDialogButtonbarFrame {f} { global buttons global pbuttons global ds9 ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {New Frame}] \ -variable pbuttons(frame,new) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {New Frame RGB}] \ -variable pbuttons(frame,newrgb) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {New Frame 3D}] \ -variable pbuttons(frame,new3d) -command {UpdateButtons buttons(frame)} $m add separator $m add checkbutton -label [msgcat::mc {Delete Frame}] \ -variable pbuttons(frame,delete) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Delete All Frames}] \ -variable pbuttons(frame,deleteall) -command {UpdateButtons buttons(frame)} $m add separator $m add checkbutton -label [msgcat::mc {Clear Frame}] \ -variable pbuttons(frame,clear) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Reset Frame}] \ -variable pbuttons(frame,reset) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Refresh Frame}] \ -variable pbuttons(frame,refresh) -command {UpdateButtons buttons(frame)} $m add separator $m add checkbutton -label [msgcat::mc {Single Frame}] \ -variable pbuttons(frame,single) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Tile Frames}] \ -variable pbuttons(frame,tile) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Blink Frames}] \ -variable pbuttons(frame,blink) -command {UpdateButtons buttons(frame)} $m add separator $m add cascade -label [msgcat::mc {Match}] -menu $m.match $m add cascade -label [msgcat::mc {Lock}] -menu $m.lock $m add separator $m add cascade -label [msgcat::mc {Move Frame}] -menu $m.move $m add separator $m add checkbutton -label [msgcat::mc {First Frame}] \ -variable pbuttons(frame,first) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Previous Frame}] \ -variable pbuttons(frame,prev) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Next Frame}] \ -variable pbuttons(frame,next) -command {UpdateButtons buttons(frame)} $m add checkbutton -label [msgcat::mc {Last Frame}] \ -variable pbuttons(frame,last) -command {UpdateButtons buttons(frame)} $m add separator $m add checkbutton -label "[msgcat::mc {Cube}]..." \ -variable pbuttons(frame,cube) -command {UpdateButtons buttons(frame)} $m add checkbutton -label "[msgcat::mc {RGB}]..." \ -variable pbuttons(frame,rgb) -command {UpdateButtons buttons(frame)} $m add checkbutton -label "[msgcat::mc {3D}]..." \ -variable pbuttons(frame,3d) -command {UpdateButtons buttons(frame)} $m add separator $m add cascade -label [msgcat::mc {Frame Parameters}] -menu $m.params # match menu $m.match $m.match add cascade -label [msgcat::mc {Frame}] \ -menu $m.match.frame $m.match add cascade -label [msgcat::mc {Crosshair}] \ -menu $m.match.crosshair $m.match add cascade -label [msgcat::mc {Crop}] \ -menu $m.match.crop $m.match add cascade -label [msgcat::mc {Slice}] \ -menu $m.match.cube $m.match add checkbutton -label [msgcat::mc {Bin}] \ -variable pbuttons(frame,match,bin) \ -command {UpdateButtons buttons(frame)} $m.match add checkbutton -label [msgcat::mc {Axes Order}] \ -variable pbuttons(frame,match,axes) \ -command {UpdateButtons buttons(frame)} $m.match add checkbutton -label [msgcat::mc {Scale}] \ -variable pbuttons(frame,match,scale) \ -command {UpdateButtons buttons(frame)} $m.match add checkbutton -label [msgcat::mc {Scale and Limits}] \ -variable pbuttons(frame,match,scalelimits) \ -command {UpdateButtons buttons(frame)} $m.match add checkbutton -label [msgcat::mc {Color}] \ -variable pbuttons(frame,match,color) \ -command {UpdateButtons buttons(frame)} $m.match add checkbutton -label [msgcat::mc {Smooth}] \ -variable pbuttons(frame,match,smooth) \ -command {UpdateButtons buttons(frame)} menu $m.match.frame $m.match.frame add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,match,frame,wcs) \ -command {UpdateButtons buttons(frame)} $m.match.frame add separator $m.match.frame add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,match,frame,image) \ -command {UpdateButtons buttons(frame)} $m.match.frame add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,match,frame,physical) \ -command {UpdateButtons buttons(frame)} $m.match.frame add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,match,frame,detector) \ -command {UpdateButtons buttons(frame)} $m.match.frame add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,match,frame,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.match.crosshair $m.match.crosshair add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,match,crosshair,wcs) \ -command {UpdateButtons buttons(frame)} $m.match.crosshair add separator $m.match.crosshair add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,match,crosshair,image) \ -command {UpdateButtons buttons(frame)} $m.match.crosshair add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,match,crosshair,physical) \ -command {UpdateButtons buttons(frame)} $m.match.crosshair add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,match,crosshair,detector) \ -command {UpdateButtons buttons(frame)} $m.match.crosshair add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,match,crosshair,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.match.crop $m.match.crop add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,match,crop,wcs) \ -command {UpdateButtons buttons(frame)} $m.match.crop add separator $m.match.crop add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,match,crop,image) \ -command {UpdateButtons buttons(frame)} $m.match.crop add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,match,crop,physical) \ -command {UpdateButtons buttons(frame)} $m.match.crop add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,match,crop,detector) \ -command {UpdateButtons buttons(frame)} $m.match.crop add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,match,crop,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.match.cube $m.match.cube add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,match,cube,wcs) \ -command {UpdateButtons buttons(frame)} $m.match.cube add separator $m.match.cube add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,match,cube,image) \ -command {UpdateButtons buttons(frame)} # lock menu $m.lock $m.lock add cascade -label [msgcat::mc {Frame}] \ -menu $m.lock.frame $m.lock add cascade -label [msgcat::mc {Crosshair}] \ -menu $m.lock.crosshair $m.lock add cascade -label [msgcat::mc {Crop}] \ -menu $m.lock.crop $m.lock add cascade -label [msgcat::mc {Slice}] \ -menu $m.lock.cube $m.lock add checkbutton -label [msgcat::mc {Bin}] \ -variable pbuttons(frame,lock,bin) \ -command {UpdateButtons buttons(frame)} $m.lock add checkbutton -label [msgcat::mc {Axes Order}] \ -variable pbuttons(frame,lock,axes) \ -command {UpdateButtons buttons(frame)} $m.lock add checkbutton -label [msgcat::mc {Scale}] \ -variable pbuttons(frame,lock,scale) \ -command {UpdateButtons buttons(frame)} $m.lock add checkbutton -label [msgcat::mc {Scale and Limits}] \ -variable pbuttons(frame,lock,scalelimits) \ -command {UpdateButtons buttons(frame)} $m.lock add checkbutton -label [msgcat::mc {Color}] \ -variable pbuttons(frame,lock,color) \ -command {UpdateButtons buttons(frame)} $m.lock add checkbutton -label [msgcat::mc {Smooth}] \ -variable pbuttons(frame,lock,smooth) \ -command {UpdateButtons buttons(frame)} menu $m.lock.frame $m.lock.frame add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(frame,lock,frame,none) \ -command {UpdateButtons buttons(frame)} $m.lock.frame add separator $m.lock.frame add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,lock,frame,wcs) \ -command {UpdateButtons buttons(frame)} $m.lock.frame add separator $m.lock.frame add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,lock,frame,image) \ -command {UpdateButtons buttons(frame)} $m.lock.frame add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,lock,frame,physical) \ -command {UpdateButtons buttons(frame)} $m.lock.frame add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,lock,frame,detector) \ -command {UpdateButtons buttons(frame)} $m.lock.frame add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,lock,frame,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.lock.crosshair $m.lock.crosshair add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(frame,lock,crosshair,none) \ -command {UpdateButtons buttons(frame)} $m.lock.crosshair add separator $m.lock.crosshair add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,lock,crosshair,wcs) \ -command {UpdateButtons buttons(frame)} $m.lock.crosshair add separator $m.lock.crosshair add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,lock,crosshair,image) \ -command {UpdateButtons buttons(frame)} $m.lock.crosshair add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,lock,crosshair,physical) \ -command {UpdateButtons buttons(frame)} $m.lock.crosshair add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,lock,crosshair,detector) \ -command {UpdateButtons buttons(frame)} $m.lock.crosshair add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,lock,crosshair,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.lock.crop $m.lock.crop add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(frame,lock,crop,none) \ -command {UpdateButtons buttons(frame)} $m.lock.crop add separator $m.lock.crop add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,lock,crop,wcs) \ -command {UpdateButtons buttons(frame)} $m.lock.crop add separator $m.lock.crop add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,lock,crop,image) \ -command {UpdateButtons buttons(frame)} $m.lock.crop add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(frame,lock,crop,physical) \ -command {UpdateButtons buttons(frame)} $m.lock.crop add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(frame,lock,crop,detector) \ -command {UpdateButtons buttons(frame)} $m.lock.crop add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(frame,lock,crop,amplifier) \ -command {UpdateButtons buttons(frame)} menu $m.lock.cube $m.lock.cube add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(frame,lock,cube,none) \ -command {UpdateButtons buttons(frame)} $m.lock.cube add separator $m.lock.cube add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(frame,lock,cube,wcs) \ -command {UpdateButtons buttons(frame)} $m.lock.cube add separator $m.lock.cube add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(frame,lock,cube,image) \ -command {UpdateButtons buttons(frame)} # move menu $m.move $m.move add checkbutton -label [msgcat::mc {First}] \ -variable pbuttons(frame,movefirst) \ -command {UpdateButtons buttons(frame)} $m.move add checkbutton -label [msgcat::mc {Back}] \ -variable pbuttons(frame,moveprev) \ -command {UpdateButtons buttons(frame)} $m.move add checkbutton -label [msgcat::mc {Forward}] \ -variable pbuttons(frame,movenext) \ -command {UpdateButtons buttons(frame)} $m.move add checkbutton -label [msgcat::mc {Last}] \ -variable pbuttons(frame,movelast) \ -command {UpdateButtons buttons(frame)} # params menu $m.params $m.params add checkbutton -label [msgcat::mc {Display Size}] \ -variable pbuttons(frame,size) -command {UpdateButtons buttons(frame)} } # Support proc UpdateFrameMenuStatic {} { global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateFrameMenuStatic" } $ds9(mb).frame entryconfig [msgcat::mc {New Frame RGB}] -state normal $ds9(buttons).frame.newrgb configure -state normal if {$ds9(active,num) > 0} { $ds9(mb).frame entryconfig [msgcat::mc {Delete Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Delete All Frames}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Clear Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Reset Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Refresh Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Single Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Tile Frames}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Blink Frames}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Match}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Lock}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Move Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {First Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Previous Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Next Frame}] -state normal $ds9(mb).frame entryconfig [msgcat::mc {Last Frame}] -state normal $ds9(buttons).frame.delete configure -state normal $ds9(buttons).frame.deleteall configure -state normal $ds9(buttons).frame.clear configure -state normal $ds9(buttons).frame.reset configure -state normal $ds9(buttons).frame.refresh configure -state normal $ds9(buttons).frame.single configure -state normal $ds9(buttons).frame.tile configure -state normal $ds9(buttons).frame.blink configure -state normal $ds9(buttons).frame.movefirst configure -state normal $ds9(buttons).frame.moveprev configure -state normal $ds9(buttons).frame.movenext configure -state normal $ds9(buttons).frame.movelast configure -state normal $ds9(buttons).frame.first configure -state normal $ds9(buttons).frame.prev configure -state normal $ds9(buttons).frame.next configure -state normal $ds9(buttons).frame.last configure -state normal } else { $ds9(mb).frame entryconfig [msgcat::mc {Delete Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Delete All Frames}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Clear Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Reset Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Refresh Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Single Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Tile Frames}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Blink Frames}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Match}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Lock}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Move Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {First Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Previous Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Next Frame}] -state disabled $ds9(mb).frame entryconfig [msgcat::mc {Last Frame}] -state disabled $ds9(buttons).frame.delete configure -state disabled $ds9(buttons).frame.deleteall configure -state disabled $ds9(buttons).frame.clear configure -state disabled $ds9(buttons).frame.reset configure -state disabled $ds9(buttons).frame.refresh configure -state disabled $ds9(buttons).frame.single configure -state disabled $ds9(buttons).frame.tile configure -state disabled $ds9(buttons).frame.blink configure -state disabled $ds9(buttons).frame.movefirst configure -state disabled $ds9(buttons).frame.moveprev configure -state disabled $ds9(buttons).frame.movenext configure -state disabled $ds9(buttons).frame.movelast configure -state disabled $ds9(buttons).frame.first configure -state disabled $ds9(buttons).frame.prev configure -state disabled $ds9(buttons).frame.next configure -state disabled $ds9(buttons).frame.last configure -state disabled } } proc UpdateFrameMenu {} { global ds9 global current global debug if {$debug(tcl,update)} { puts stderr "UpdateFrameMenu" } if {$current(frame) != {}} { $ds9(mb).frame entryconfig "[msgcat::mc {Cube}]..." \ -state normal $ds9(buttons).frame.cube configure -state normal switch -- [$current(frame) get type] { base { $ds9(mb).frame entryconfig "[msgcat::mc {RGB}]..." \ -state disabled $ds9(mb).frame entryconfig "[msgcat::mc {3D}]..." \ -state normal $ds9(buttons).frame.rgb configure -state disabled $ds9(buttons).frame.3d configure -state normal } rgb { $ds9(mb).frame entryconfig "[msgcat::mc {RGB}]..." \ -state normal $ds9(mb).frame entryconfig "[msgcat::mc {3D}]..." \ -state disabled $ds9(buttons).frame.rgb configure -state normal $ds9(buttons).frame.3d configure -state disabled } 3d { $ds9(mb).frame entryconfig "[msgcat::mc {RGB}]..." \ -state disabled $ds9(mb).frame entryconfig "[msgcat::mc {3D}]..." \ -state normal $ds9(buttons).frame.rgb configure -state disabled $ds9(buttons).frame.3d configure -state normal } } } else { $ds9(mb).frame entryconfig "[msgcat::mc {Cube}]..." \ -state disabled $ds9(mb).frame entryconfig "[msgcat::mc {RGB}]..." \ -state disabled $ds9(mb).frame entryconfig "[msgcat::mc {3D}]..." \ -state disabled $ds9(buttons).frame.cube configure -state disabled $ds9(buttons).frame.rgb configure -state disabled $ds9(buttons).frame.3d configure -state disabled } } proc UpdateFrameMenuItems {} { global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateFrameMenuItems" } # Goto Frame Menu if {[$ds9(mb).frame.goto index end] >= $ds9(menu,size,frame,goto)} { $ds9(mb).frame.goto delete $ds9(menu,size,frame,goto) end } set cnt $ds9(menu,size,frame,goto) foreach f $ds9(frames) { set which "[msgcat::mc {Frame}] [string range $f 5 end]" $ds9(mb).frame.goto add radiobutton -label $which \ -variable ds9(next) -value $f -command GotoFrame # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 1 $ds9(mb).frame.goto entryconfig $which -columnbreak 1 } } # Active Frame Menu if {[$ds9(mb).frame.active index end] >= $ds9(menu,size,frame,active)} { $ds9(mb).frame.active delete $ds9(menu,size,frame,active) end } set cnt $ds9(menu,size,frame,active) foreach f $ds9(frames) { set which "[msgcat::mc {Frame}] [string range $f 5 end]" $ds9(mb).frame.active add checkbutton -label $which \ -variable active($f) -command UpdateActiveFrames # wrap if needed incr cnt if {$cnt>=$ds9(menu,size,wrap)} { set cnt 1 $ds9(mb).frame.active entryconfig $which -columnbreak 1 } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mhelp.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000012221 12464211204 016332� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menu proc HelpMainMenu {} { global ds9 switch $ds9(wm) { x11 {} aqua { # window menu menu $ds9(mb).window $ds9(mb) add cascade -label [msgcat::mc {Window}] \ -menu $ds9(mb).window } win32 {} } $ds9(mb) add cascade -label [msgcat::mc {Help}] -menu $ds9(mb).help menu $ds9(mb).help switch $ds9(wm) { x11 { $ds9(mb).help add command -label [msgcat::mc {Reference Manual}]\ -command HelpRef } aqua {} win32 {} } $ds9(mb).help add command -label [msgcat::mc {User Manual}]\ -command HelpUser $ds9(mb).help add command -label [msgcat::mc {Mouse and Keyboard}] \ -command HelpKeyboard $ds9(mb).help add separator $ds9(mb).help add command -label [msgcat::mc {FAQ}] \ -command HelpFAQ $ds9(mb).help add command -label [msgcat::mc {New Features}] \ -command HelpNew $ds9(mb).help add command -label [msgcat::mc {Release Notes}] \ -command HelpRelease $ds9(mb).help add command -label [msgcat::mc {Help Desk}] \ -command HelpDesk $ds9(mb).help add separator $ds9(mb).help add command -label [msgcat::mc {Story of SAOImage DS9}] \ -command HelpStory $ds9(mb).help add command -label [msgcat::mc {Acknowledgment}] \ -command HelpAck switch $ds9(wm) { x11 - win32 { $ds9(mb).help add separator $ds9(mb).help add command \ -label "[msgcat::mc {About SAOImage DS9}]..." \ -command AboutBox } aqua {} } } proc PrefsDialogHelpMenu {w} { set f [ttk::labelframe $w.mhelp -text [msgcat::mc {Help}]] PrefsDialogButtonbarHelp $f.buttonbar grid $f.buttonbar -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } # Buttons proc ButtonsHelpDef {} { global pbuttons array set pbuttons { help,ref 1 help,user 1 help,keyboard 1 help,faq 0 help,new 0 help,release 1 help,desk 1 help,story 0 help,ack 1 help,about 1 } } proc CreateButtonsHelp {} { global buttons global ds9 ttk::frame $ds9(buttons).help ButtonButton $ds9(buttons).help.ref \ [string tolower [msgcat::mc {Reference}]] HelpRef ButtonButton $ds9(buttons).help.user \ [string tolower [msgcat::mc {User}]] HelpUser ButtonButton $ds9(buttons).help.keyboard \ [string tolower [msgcat::mc {Keyboard}]] HelpKeyboard ButtonButton $ds9(buttons).help.faq \ [string tolower [msgcat::mc {FAQ}]] HelpFAQ ButtonButton $ds9(buttons).help.new \ [string tolower [msgcat::mc {New Features}]] HelpNew ButtonButton $ds9(buttons).help.release \ [string tolower [msgcat::mc {Release}]] HelpRelease ButtonButton $ds9(buttons).help.desk \ [string tolower [msgcat::mc {Help Desk}]] HelpDesk ButtonButton $ds9(buttons).help.story \ [string tolower [msgcat::mc {Story}]] HelpStory ButtonButton $ds9(buttons).help.ack \ [string tolower [msgcat::mc {Acknowledgment}]] HelpAck ButtonButton $ds9(buttons).help.about \ [string tolower [msgcat::mc {About}]] AboutBox set buttons(help) " $ds9(buttons).help.ref pbuttons(help,ref) $ds9(buttons).help.user pbuttons(help,user) $ds9(buttons).help.keyboard pbuttons(help,keyboard) $ds9(buttons).help.faq pbuttons(help,faq) $ds9(buttons).help.new pbuttons(help,new) $ds9(buttons).help.release pbuttons(help,release) $ds9(buttons).help.desk pbuttons(help,desk) $ds9(buttons).help.story pbuttons(help,story) $ds9(buttons).help.ack pbuttons(help,ack) $ds9(buttons).help.about pbuttons(help,about) " } proc PrefsDialogButtonbarHelp {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Reference Manual}]\ -variable pbuttons(help,ref) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {User Manual}]\ -variable pbuttons(help,user) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {Mouse and Keyboard}] \ -variable pbuttons(help,keyboard) -command {UpdateButtons buttons(help)} $m add separator $m add checkbutton -label [msgcat::mc {FAQ}] \ -variable pbuttons(help,faq) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {New Features}] \ -variable pbuttons(help,new) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {Release Notes}] \ -variable pbuttons(help,release) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {Help Desk}] \ -variable pbuttons(help,desk) -command {UpdateButtons buttons(help)} $m add separator $m add checkbutton -label [msgcat::mc {Story of SAOImage DS9}] \ -variable pbuttons(help,story) -command {UpdateButtons buttons(help)} $m add checkbutton -label [msgcat::mc {Acknowledgment}] \ -variable pbuttons(help,ack) -command {UpdateButtons buttons(help)} $m add separator $m add checkbutton -label "[msgcat::mc {About SAOImage DS9}]..." \ -variable pbuttons(help,about) -command {UpdateButtons buttons(help)} } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaic.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000001436 12464211204 016506� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ProcessMosaicCmd {varname iname sock fn} { upvar $varname var upvar $iname i set vvar $var set ii $i switch -- [string tolower [lindex $var $i]] { iraf { incr ii ProcessMosaicIRAFCmd vvar ii $sock $fn } wfpc2 {} default {ProcessMosaicWCSCmd vvar ii $sock $fn} } } proc ProcessSendMosaicCmd {proc id param sock fn} { switch -- [string tolower [lindex $param 0]] { iraf {} wfpc2 {} wcs { set param [lindex $param 1 end] ProcessSendMosaicWCSCmd $proc $id $param $sock $fn } default {ProcessSendMosaicWCSCmd $proc $id $param $sock $fn} } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaicimage.tcl������������������������������������������������������������������000644 �000765 �000000 �00000001575 12464211204 017515� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ProcessMosaicImageCmd {varname iname sock fn} { upvar $varname var upvar $iname i set vvar $var set ii $i switch -- [string tolower [lindex $var $i]] { iraf { incr ii ProcessMosaicImageIRAFCmd vvar ii $sock $fn } wfpc2 { incr ii ProcessMosaicImageWFPC2Cmd vvar ii $sock $fn } default {ProcessMosaicImageWCSCmd vvar ii $sock $fn} } } proc ProcessSendMosaicImageCmd {proc id param sock fn} { switch -- [string tolower [lindex $param 0]] { iraf {} wfpc2 {} wcs { set param [lindex $param 1 end] ProcessSendMosaicImageWCSCmd $proc $id $param $sock $fn } default {ProcessSendMosaicImageWCSCmd $proc $id $param $sock $fn} } } �����������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaicimageiraf.tcl��������������������������������������������������������������000644 �000765 �000000 �00000003453 12464211204 020354� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMosaicImageIRAFFile {fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image iraf} set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer ConvertFitsFile ProcessLoad } proc LoadMosaicImageIRAFAlloc {path fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image iraf} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc LoadMosaicImageIRAFSocket {sock fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image iraf} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc ProcessMosaicImageIRAFCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMosaicImageIRAFSocket $sock $param $layer]} { InitError xpa LoadMosaicImageIRAFFile $param $layer } } else { # comm if {$fn != {}} { LoadMosaicImageIRAFAlloc $fn $param $layer } else { LoadMosaicImageIRAFFile $param $layer } } FinishLoad } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaicimagewcs.tcl���������������������������������������������������������������000644 �000765 �000000 �00000005252 12464211204 020226� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMosaicImageWCSFile {fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic image $sys] set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer ConvertFitsFile ProcessLoad } proc LoadMosaicImageWCSAlloc {path fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic image $sys] set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc LoadMosaicImageWCSSocket {sock fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic image $sys] set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc SaveMosaicImageWCSFile {fn} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits mosaic image file "\{$fn\}" } proc SaveMosaicImageWCSSocket {sock} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits mosaic image socket $sock } proc ProcessMosaicImageWCSCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } if {[string range [lindex $var $i] 0 2] == {wcs}} { set opt [lindex $var $i] incr i } else { set opt wcs } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMosaicImageWCSSocket $sock $param $layer $opt]} { InitError xpa LoadMosaicImageWCSFile $param $layer $opt } } else { # comm if {$fn != {}} { LoadMosaicImageWCSAlloc $fn $param $layer $opt } else { LoadMosaicImageWCSFile $param $layer $opt } } FinishLoad } proc ProcessSendMosaicImageWCSCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } if {$sock != {}} { # xpa SaveMosaicImageWCSSocket $sock } elseif {$fn != {}} { # comm SaveMosaicImageWCSFile $fn $proc $id {} $fn } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaicimagewfpc2.tcl�������������������������������������������������������������000644 �000765 �000000 �00000003473 12464211204 020456� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMosaicImageWFPC2File {fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image wfpc2} set loadParam(load,type) mmapincr set loadParam(file,name) $fn # mask not supported set loadParam(load,layer) {} ConvertFitsFile ProcessLoad } proc LoadMosaicImageWFPC2Alloc {path fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image wfpc2} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path # mask not supported set loadParam(load,layer) {} ProcessLoad } proc LoadMosaicImageWFPC2Socket {sock fn} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic image wfpc2} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock # mask not supported set loadParam(load,layer) {} return [ProcessLoad 0] } proc ProcessMosaicImageWFPC2Cmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMosaicImageWFPC2Socket $sock $param]} { InitError xpa LoadMosaicImageWFPC2File $param } } else { # comm if {$fn != {}} { LoadMosaicImageWFPC2Alloc $fn $param } else { LoadMosaicImageWFPC2File $param } } FinishLoad } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaiciraf.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000003361 12464211204 017347� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMosaicIRAFFile {fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic iraf} set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer ConvertFitsFile ProcessLoad } proc LoadMosaicIRAFAlloc {path fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic iraf} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc LoadMosaicIRAFSocket {sock fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic iraf} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc ProcessMosaicIRAFCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMosaicIRAFSocket $sock $param $layer]} { InitError xpa LoadMosaicIRAFFile $param $layer } } else { # comm if {$fn != {}} { LoadMosaicIRAFAlloc $fn $param $layer } else { LoadMosaicIRAFFile $param $layer } } FinishLoad } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mosaicwcs.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000005324 12464211204 017223� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMosaicWCSFile {fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic $sys] set loadParam(load,type) mmapincr set loadParam(file,name) $fn set loadParam(load,layer) $layer ConvertFitsFile ProcessLoad } proc LoadMosaicWCSAlloc {path fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic $sys] set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc LoadMosaicWCSSocket {sock fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic $sys] set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc SaveMosaicWCSFile {fn opt} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } if {$opt == {}} { set opt 1 } $current(frame) save fits mosaic file "\{$fn\}" $opt } proc SaveMosaicWCSSocket {sock opt} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } if {$opt == {}} { set opt 1 } $current(frame) save fits mosaic socket $sock $opt } proc ProcessMosaicWCSCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } if {[string range [lindex $var $i] 0 2] == {wcs}} { set opt [lindex $var $i] incr i } else { set opt wcs } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadMosaicWCSSocket $sock $param $layer $opt]} { InitError xpa LoadMosaicWCSFile $param $layer $opt } } else { # comm if {$fn != {}} { LoadMosaicWCSAlloc $fn $param $layer $opt } else { LoadMosaicWCSFile $param $layer $opt } } FinishLoad } proc ProcessSendMosaicWCSCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } set opt [lindex $param 0] if {$sock != {}} { # xpa SaveMosaicWCSSocket $sock $opt } elseif {$fn != {}} { # comm SaveMosaicWCSFile $fn $opt $proc $id {} $fn } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/movie.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000027704 12514261632 016366� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc MovieDef {} { global imovie global movie global tcl_platform set imovie(top) .moviestatus set imovie(mb) .moviestatusmb set movie(action) slice # must be >=5, or sometimes will generate bad data set movie(quality) 5 set movie(num) 24 set movie(az,from) 45 set movie(az,to) -45 set movie(el,from) 30 set movie(el,to) 30 set movie(sl,from) 1 set movie(sl,to) 1 set movie(repeat) oscillate set movie(repeat,num) 0 set movie(status) 0 set movie(abort) 0 set aa [msgcat::mc {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.}] set bb [msgcat::mc {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.}] switch $tcl_platform(os) { Darwin { switch [lindex [split $tcl_platform(osVersion) {.}] 0] { 10 - 11 {set movie(error) $bb} 8 - 9 - default {set movie(error) $aa} } } default {set movie(error) $aa} } } proc MovieDialog {} { global movie global mpegfbox global ed global current set w {.movie} set ed(ok) 0 set ed(action) $movie(action) DialogCreate $w [msgcat::mc {Create Movie}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Format}] ttk::radiobutton $f.slice -text {Slice Movie} \ -variable ed(action) -value slice ttk::radiobutton $f.frame -text {Frames Movie} \ -variable ed(action) -value frame ttk::radiobutton $f.3d -text {3D Movie} \ -variable ed(action) -value 3d grid $f.slice -padx 2 -pady 2 -sticky w grid $f.frame -padx 2 -pady 2 -sticky w grid $f.3d -padx 2 -pady 2 -sticky w switch [$current(frame) get type] { base - rgb {$f.3d configure -state disabled} 3d {$f.3d configure -state normal} } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set movie(action) $ed(action) set fn [SaveFileDialog mpegfbox] if {$fn != {}} { set ok 1 switch $movie(action) { slice - frame {} 3d {set ok [Movie3dDialog]} } if {$ok} { Movie $fn } } } set rr $ed(ok) unset ed return $rr } proc Movie {fn} { global ds9 global movie global current global saveimage if {$fn == {} || ![$current(frame) has fits]} { return } switch $ds9(wm) { x11 {} aqua - win32 { Error $saveimage(error) return } } # besure we are on top raise $ds9(top) # we need single mode if {$ds9(display) != {single}} { set modesav $ds9(display) set current(display) single DisplayMode } switch $movie(action) { slice {MovieSlice $fn} frame {MovieFrame $fn} 3d {Movie3d $fn} } if {[info exists modesav]} { set current(display) $modesav DisplayMode } } proc MovieSlice {fn} { global current global movie global cube set depth [$current(frame) get fits depth $cube(axis)] set slice [$current(frame) get fits slice $cube(axis)] if {$cube(axis)==2} { set ss [$current(frame) get crop 3d image] set from [lindex $ss 0] set to [lindex $ss 1] } else { set from 1 set to [$current(frame) get fits depth $cube(axis)] } # loop thru cube set movie(first) 1 for {set ii $from} {$ii <= $to} {incr ii} { $current(frame) update fits slice $cube(axis) $ii if {[MoviePhoto $fn]} { break } } mpeg close # reset current slice $current(frame) update fits slice $cube(axis) $slice } proc MovieFrame {fn} { global ds9 global current global movie # loop thru all active frames set movie(first) 1 set framesav $current(frame) foreach ff $ds9(active) { set ds9(next) $ff GotoFrame if {[MoviePhoto $fn]} { break } } mpeg close set ds9(next) $framesav GotoFrame } proc Movie3d {fn} { global movie global current global cube set slice [$current(frame) get fits slice $cube(axis)] set vp [$current(frame) get 3d view] set azincr [expr 1.*($movie(az,to)-$movie(az,from))/$movie(num)] set elincr [expr 1.*($movie(el,to)-$movie(el,from))/$movie(num)] set slincr [expr 1.*($movie(sl,to)-$movie(sl,from))/$movie(num)] # loop over az/el/slice set movie(status) 0 set movie(abort) 0 set movie(first) 1 set az $movie(az,from) set el $movie(el,from) set sl $movie(sl,from) for {set rr 0} {$rr<=$movie(repeat,num)} {incr rr} { for {set nn 0} {$nn<=$movie(num)} {incr nn} { MovieStatusDialog if {$movie(abort)} { break } set movie(status) [expr 1.*$nn/$movie(num)*100] update idletasks $current(frame) 3d view $az $el $current(frame) update fits slice $cube(axis) [expr int($sl)] if {[MoviePhoto $fn]} { break } set az [expr $az+$azincr] set el [expr $el+$elincr] set sl [expr $sl+$slincr] } switch $movie(repeat) { repeat { set az $movie(az,from) set el $movie(el,from) set sl $movie(sl,from) } oscillate { set azincr [expr -$azincr] set elincr [expr -$elincr] set slincr [expr -$slincr] } } } mpeg close MovieStatusDestroyDialog # reset $current(frame) 3d view $vp $current(frame) update fits slice $cube(axis) $slice Update3DDialog UpdateCubeDialog } # Support proc MoviePhoto {fn} { global ds9 global movie global current # yes, we need this UpdateDS9 RealizeDS9 1 set rr [catch {image create photo -format window -data $ds9(canvas)} ph] if {$rr} { Error $movie(error) return $rr } if {$movie(first)} { set w [image width $ph] set h [image height $ph] mpeg create "$fn" $w $h 25 1 $movie(quality) set movie(first) 0 } mpeg add $ph image delete $ph return 0 } proc Movie3dDialog {} { global movie global ed2 global current global cube set w {.movie3d} set ed2(ok) 0 set ed2(num) $movie(num) set ed2(az,from) $movie(az,from) set ed2(az,to) $movie(az,to) set ed2(el,from) $movie(el,from) set ed2(el,to) $movie(el,to) set ed2(sl,from) [$current(frame) get fits slice $cube(axis)] set ed2(sl,to) $ed2(sl,from) set ed2(repeat) $movie(repeat) set ed2(repeat,num) $movie(repeat,num) DialogCreate $w [msgcat::mc {Save 3D Movie}] ed2(ok) # Param set f [ttk::frame $w.param] ttk::label $f.tnum -text [msgcat::mc {Number}] ttk::entry $f.num -textvariable ed2(num) -width 7 ttk::label $f.tframes -text [msgcat::mc {Frames}] ttk::label $f.taz -text [msgcat::mc {Azimuth}] ttk::label $f.tazfrom -text [msgcat::mc {From}] ttk::entry $f.azfrom -textvariable ed2(az,from) -width 7 ttk::label $f.tazto -text [msgcat::mc {To}] ttk::entry $f.azto -textvariable ed2(az,to) -width 7 ttk::label $f.tel -text [msgcat::mc {Elevation}] ttk::label $f.telfrom -text [msgcat::mc {From}] ttk::entry $f.elfrom -textvariable ed2(el,from) -width 7 ttk::label $f.telto -text [msgcat::mc {To}] ttk::entry $f.elto -textvariable ed2(el,to) -width 7 ttk::label $f.tsl -text [msgcat::mc {Slice}] ttk::label $f.tslfrom -text [msgcat::mc {From}] ttk::entry $f.slfrom -textvariable ed2(sl,from) -width 7 ttk::label $f.tslto -text [msgcat::mc {To}] ttk::entry $f.slto -textvariable ed2(sl,to) -width 7 ttk::radiobutton $f.repeat -text [msgcat::mc {Repeat}] \ -variable ed2(repeat) -value repeat ttk::radiobutton $f.oscillate -text [msgcat::mc {Oscillate}] \ -variable ed2(repeat) -value oscillate ttk::entry $f.repeatnum -textvariable ed2(repeat,num) -width 7 ttk::label $f.ttimes -text [msgcat::mc {Times}] grid $f.tnum x $f.num $f.tframes -padx 2 -pady 2 -sticky w grid $f.taz $f.tazfrom $f.azfrom $f.tazto $f.azto -padx 2 -pady 2 -sticky w grid $f.tel $f.telfrom $f.elfrom $f.telto $f.elto -padx 2 -pady 2 -sticky w grid $f.tsl $f.tslfrom $f.slfrom $f.tslto $f.slto -padx 2 -pady 2 -sticky w grid $f.oscillate x $f.repeatnum $f.ttimes -padx 2 -pady 2 -sticky w grid $f.repeat -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set movie(num) $ed2(num) set movie(az,from) $ed2(az,from) set movie(az,to) $ed2(az,to) set movie(el,from) $ed2(el,from) set movie(el,to) $ed2(el,to) set movie(sl,from) $ed2(sl,from) set movie(sl,to) $ed2(sl,to) set movie(repeat) $ed2(repeat) set movie(repeat,num) $ed2(repeat,num) } set rr $ed2(ok) unset ed2 return $rr } proc MovieStatusDialog {} { global imovie global movie # see if we already have a window visible if {[winfo exists $imovie(top)]} { raise $imovie(top) return } # create the 3d window set w $imovie(top) set mb $imovie(mb) Toplevel $w $mb 6 [msgcat::mc {Movie}] MovieStatusDestroyDialog raise $imovie(top) # Status set f [ttk::frame $w.param] ttk::label $f.tstatus -text [msgcat::mc {Status}] ttk::progressbar $f.status -variable movie(status) -length 350 grid $f.tstatus $f.status -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.abort -text [msgcat::mc {Abort}] \ -command MovieStatusAbortDialog pack $f.abort -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill x } proc MovieStatusDestroyDialog {} { global movie global imovie if {[winfo exists $imovie(top)]} { destroy $imovie(top) destroy $imovie(mb) } } proc MovieStatusAbortDialog {} { global movie set movie(abort) 1 } # Process Cmds proc ProcessMovieCmd {varname iname} { upvar $varname var upvar $iname i global movie # we need to be realized # already implemented # ProcessRealizeDS9 set item [string tolower [lindex $var $i]] switch -- $item { slice - frame - 3d { set movie(action) $item incr i } default { # backward compatibility set movie(action) frame } } set fn [lindex $var $i] set go 1 while {$go} { incr i set item [string tolower [lindex $var $i]] switch -- $item { number { incr i set movie(num) [lindex $var $i] } azfrom { incr i set movie(az,from) [lindex $var $i] } azto { incr i set movie(az,to) [lindex $var $i] } elfrom { incr i set movie(el,from) [lindex $var $i] } elto { incr i set movie(el,to) [lindex $var $i] } slfrom { incr i set movie(sl,from) [lindex $var $i] } slto { incr i set movie(sl,to) [lindex $var $i] } oscillate { incr i set movie(repeat) oscillate set movie(repeat,num) [lindex $var $i] } repeat { incr i set movie(repeat) repeat set movie(repeat,num) [lindex $var $i] } default { incr i -1 set go 0 } } } Movie $fn } ������������������������������������������������������������saods9/ds9/library/mregion.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000127623 12576340574 016723� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc RegionMainMenu {} { global ds9 global marker menu $ds9(mb).region $ds9(mb).region add command -label "[msgcat::mc {Get Information}]..." \ -command MarkerInfo $ds9(mb).region add separator $ds9(mb).region add cascade -label [msgcat::mc {Shape}] \ -menu $ds9(mb).region.shape $ds9(mb).region add cascade -label [msgcat::mc {Composite Region}] \ -menu $ds9(mb).region.composite $ds9(mb).region add cascade -label [msgcat::mc {Instrument FOV}] \ -menu $ds9(mb).region.fov $ds9(mb).region add cascade -label [msgcat::mc {Template}] \ -menu $ds9(mb).region.template $ds9(mb).region add separator $ds9(mb).region add cascade -label [msgcat::mc {Color}] \ -menu $ds9(mb).region.color $ds9(mb).region add cascade -label [msgcat::mc {Width}] \ -menu $ds9(mb).region.width $ds9(mb).region add cascade -label [msgcat::mc {Properties}] \ -menu $ds9(mb).region.properties $ds9(mb).region add cascade -label [msgcat::mc {Font}] \ -menu $ds9(mb).region.font $ds9(mb).region add separator $ds9(mb).region add command -label [msgcat::mc {Centroid}] \ -command MarkerCentroid $ds9(mb).region add command -label [msgcat::mc {Move to Front}] \ -command MarkerFront $ds9(mb).region add command -label [msgcat::mc {Move to Back}] \ -command MarkerBack $ds9(mb).region add separator $ds9(mb).region add command -label [msgcat::mc {Select All}] \ -command MarkerSelectAll -accelerator "${ds9(ctrl)}A" $ds9(mb).region add command -label [msgcat::mc {Select None}] \ -command MarkerUnselectAll $ds9(mb).region add command -label [msgcat::mc {Invert Selection}] \ -command MarkerSelectInvert $ds9(mb).region add separator $ds9(mb).region add command -label [msgcat::mc {Delete Selected Regions}] \ -command MarkerDeleteSelect $ds9(mb).region add command -label [msgcat::mc {Delete All Regions}] \ -command MarkerDeleteAllMenu $ds9(mb).region add separator $ds9(mb).region add command -label [msgcat::mc {New Group}] \ -command GroupCreate $ds9(mb).region add command -label "[msgcat::mc {Groups}]..." \ -command GroupDialog $ds9(mb).region add separator $ds9(mb).region add command -label "[msgcat::mc {List Regions}]..." \ -command MarkerList $ds9(mb).region add command -label "[msgcat::mc {Load Regions}]..." \ -command MarkerLoad $ds9(mb).region add command -label "[msgcat::mc {Save Regions}]..." \ -command MarkerSave $ds9(mb).region add separator $ds9(mb).region add cascade -label [msgcat::mc {Region Parameters}] \ -menu $ds9(mb).region.params menu $ds9(mb).region.shape $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Circle}] \ -variable marker(shape) -value circle $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Ellipse}] \ -variable marker(shape) -value ellipse $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Box}] \ -variable marker(shape) -value box $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Polygon}] \ -variable marker(shape) -value polygon $ds9(mb).region.shape add separator $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Line}] \ -variable marker(shape) -value line $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Vector}] \ -variable marker(shape) -value vector $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Projection}] \ -variable marker(shape) -value projection $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Segment}] \ -variable marker(shape) -value segment $ds9(mb).region.shape add separator $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Text}] \ -variable marker(shape) -value text $ds9(mb).region.shape add cascade -label [msgcat::mc {Point}] \ -menu $ds9(mb).region.shape.point $ds9(mb).region.shape add separator $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Ruler}] \ -variable marker(shape) -value ruler $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Compass}] \ -variable marker(shape) -value compass $ds9(mb).region.shape add separator $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Annulus}] \ -variable marker(shape) -value annulus $ds9(mb).region.shape add radiobutton \ -label [msgcat::mc {Elliptical Annulus}] \ -variable marker(shape) -value ellipseannulus $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Box Annulus}] \ -variable marker(shape) -value boxannulus $ds9(mb).region.shape add separator $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Panda}] \ -variable marker(shape) -value panda $ds9(mb).region.shape add radiobutton \ -label [msgcat::mc {Elliptical Panda}]\ -variable marker(shape) -value epanda $ds9(mb).region.shape add radiobutton -label [msgcat::mc {Box Panda}] \ -variable marker(shape) -value bpanda menu $ds9(mb).region.shape.point $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {Circle}] \ -variable marker(shape) -value {circle point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {Box}] \ -variable marker(shape) -value {box point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {Diamond}] \ -variable marker(shape) -value {diamond point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {Cross}] \ -variable marker(shape) -value {cross point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {X}] \ -variable marker(shape) -value {x point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {Arrow}] \ -variable marker(shape) -value {arrow point} $ds9(mb).region.shape.point add radiobutton -label [msgcat::mc {BoxCircle}]\ -variable marker(shape) -value {boxcircle point} menu $ds9(mb).region.composite $ds9(mb).region.composite add command -label [msgcat::mc {Create}] \ -command CompositeCreate $ds9(mb).region.composite add command -label [msgcat::mc {Dissolve}] \ -command CompositeDelete CreateFOVMenu menu $ds9(mb).region.template $ds9(mb).region.template add command -label "[msgcat::mc {Load}]..." \ -command OpenTemplateMarker $ds9(mb).region.template add command -label "[msgcat::mc {Save}]..." \ -command SaveAsTemplateMarker ColorMenu $ds9(mb).region.color marker color MarkerColor WidthDashMenu $ds9(mb).region.width marker width dash \ MarkerWidth [list MarkerProp dash] menu $ds9(mb).region.properties $ds9(mb).region.properties add checkbutton \ -label [msgcat::mc {Fixed in Size}] \ -variable marker(fixed) -command {MarkerProp fixed} $ds9(mb).region.properties add separator $ds9(mb).region.properties add checkbutton \ -label [msgcat::mc {Can Edit}] \ -variable marker(edit) -command {MarkerProp edit} $ds9(mb).region.properties add checkbutton \ -label [msgcat::mc {Can Move}] \ -variable marker(move) -command {MarkerProp move} $ds9(mb).region.properties add checkbutton \ -label [msgcat::mc {Can Rotate}] \ -variable marker(rotate) -command {MarkerProp rotate} $ds9(mb).region.properties add checkbutton \ -label [msgcat::mc {Can Delete}] \ -variable marker(delete) -command {MarkerProp delete} $ds9(mb).region.properties add separator $ds9(mb).region.properties add radiobutton \ -label [msgcat::mc {Include}] \ -variable marker(include) -value 1 -command {MarkerProp include} $ds9(mb).region.properties add radiobutton \ -label [msgcat::mc {Exclude}] \ -variable marker(include) -value 0 -command {MarkerProp include} $ds9(mb).region.properties add separator $ds9(mb).region.properties add radiobutton \ -label [msgcat::mc {Source}] \ -variable marker(source) -value 1 -command {MarkerProp source} $ds9(mb).region.properties add radiobutton \ -label [msgcat::mc {Background}] \ -variable marker(source) -value 0 -command {MarkerProp source} FontMenu $ds9(mb).region.font marker font font,size font,weight \ font,slant MarkerFont menu $ds9(mb).region.params $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Show}] \ -variable marker(show) -command MarkerShow $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Show Text}] \ -variable marker(show,text) -command MarkerShowText $ds9(mb).region.params add separator $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Auto Plot 2D}] -variable marker(plot2d) $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Auto Plot 3D}] -variable marker(plot3d) $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Auto Plot Statistics}] -variable marker(stats) $ds9(mb).region.params add separator $ds9(mb).region.params add checkbutton \ -label [msgcat::mc {Auto Centroid}] \ -variable marker(centroid,auto) -command MarkerCentroidAuto $ds9(mb).region.params add command \ -label "[msgcat::mc {Centroid Parameters}]..." \ -command CentroidDialog # Bindings bind $ds9(top) <<SelectAll>> MarkerSelectAll } proc PrefsDialogRegionMenu {w} { set f [ttk::labelframe $w.mregion -text [msgcat::mc {Region}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarRegion $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 -sticky w set m $f.menu.menu menu $m $m add cascade -label [msgcat::mc {Shape}] -menu $m.shape $m add separator $m add cascade -label [msgcat::mc {Color}] -menu $m.color $m add cascade -label [msgcat::mc {Width}] -menu $m.width $m add cascade -label [msgcat::mc {Properties}] -menu $m.properties $m add cascade -label [msgcat::mc {Font}] -menu $m.font $m add separator $m add cascade -label [msgcat::mc {Region Parameters}] -menu $m.params menu $m.shape $m.shape add radiobutton -label [msgcat::mc {Circle}] \ -variable pmarker(shape) -value circle $m.shape add radiobutton -label [msgcat::mc {Ellipse}] \ -variable pmarker(shape) -value ellipse $m.shape add radiobutton -label [msgcat::mc {Box}] \ -variable pmarker(shape) -value box $m.shape add radiobutton -label [msgcat::mc {Polygon}] \ -variable pmarker(shape) -value polygon $m.shape add separator $m.shape add radiobutton -label [msgcat::mc {Line}] \ -variable pmarker(shape) -value line $m.shape add radiobutton -label [msgcat::mc {Vector}] \ -variable pmarker(shape) -value vector $m.shape add radiobutton -label [msgcat::mc {Projection}] \ -variable pmarker(shape) -value projection $m.shape add radiobutton -label [msgcat::mc {Segment}] \ -variable pmarker(shape) -value segment $m.shape add separator $m.shape add radiobutton -label [msgcat::mc {Text}] \ -variable pmarker(shape) -value text $m.shape add cascade -label [msgcat::mc {Point}] \ -menu $m.shape.point $m.shape add separator $m.shape add radiobutton -label [msgcat::mc {Ruler}] \ -variable pmarker(shape) -value ruler $m.shape add radiobutton -label [msgcat::mc {Compass}] \ -variable pmarker(shape) -value compass $m.shape add separator $m.shape add radiobutton -label [msgcat::mc {Annulus}] \ -variable pmarker(shape) -value annulus $m.shape add radiobutton -label [msgcat::mc {Elliptical Annulus}] \ -variable pmarker(shape) -value ellipseannulus $m.shape add radiobutton -label [msgcat::mc {Box Annulus}] \ -variable pmarker(shape) -value boxannulus $m.shape add separator $m.shape add radiobutton -label [msgcat::mc {Panda}] \ -variable pmarker(shape) -value panda $m.shape add radiobutton -label [msgcat::mc {Elliptical Panda}] \ -variable pmarker(shape) -value epanda $m.shape add radiobutton -label [msgcat::mc {Box Panda}] \ -variable pmarker(shape) -value bpanda menu $m.shape.point $m.shape.point add radiobutton -label [msgcat::mc {Circle}] \ -variable pmarker(shape) -value {circle point} $m.shape.point add radiobutton -label [msgcat::mc {Box}] \ -variable pmarker(shape) -value {box point} $m.shape.point add radiobutton -label [msgcat::mc {Diamond}] \ -variable pmarker(shape) -value {diamond point} $m.shape.point add radiobutton -label [msgcat::mc {Cross}] \ -variable pmarker(shape) -value {cross point} $m.shape.point add radiobutton -label [msgcat::mc {X}] \ -variable pmarker(shape) -value {x point} $m.shape.point add radiobutton -label [msgcat::mc {Arrow}] \ -variable pmarker(shape) -value {arrow point} $m.shape.point add radiobutton -label [msgcat::mc {BoxCircle}]\ -variable pmarker(shape) -value {boxcircle point} ColorMenu $m.color pmarker color {} WidthDashMenu $m.width pmarker width dash {} {} menu $m.properties $m.properties add checkbutton -label [msgcat::mc {Fixed in Size}] \ -variable pmarker(fixed) $m.properties add separator $m.properties add checkbutton -label [msgcat::mc {Can Edit}] \ -variable pmarker(edit) $m.properties add checkbutton -label [msgcat::mc {Can Move}] \ -variable pmarker(move) $m.properties add checkbutton -label [msgcat::mc {Can Rotate}] \ -variable pmarker(rotate) $m.properties add checkbutton -label [msgcat::mc {Can Delete}] \ -variable pmarker(delete) $m.properties add separator $m.properties add radiobutton -label [msgcat::mc {Include}] \ -variable pmarker(include) -value 1 $m.properties add radiobutton -label [msgcat::mc {Exclude}] \ -variable pmarker(include) -value 0 $m.properties add separator $m.properties add radiobutton -label [msgcat::mc {Source}] \ -variable pmarker(source) -value 1 $m.properties add radiobutton -label [msgcat::mc {Background}] \ -variable pmarker(source) -value 0 FontMenu $m.font pmarker font font,size font,weight font,slant {} menu $m.params $m.params add checkbutton -label [msgcat::mc {Show}] \ -variable pmarker(show) $m.params add checkbutton -label [msgcat::mc {Show Text}] \ -variable pmarker(show,text) $m.params add separator $m.params add checkbutton -label [msgcat::mc {Auto Centroid}] \ -variable pmarker(centroid,auto) pack $f -side top -fill both -expand true } proc PrefsDialogRegion {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Region}] lappend dprefs(tabs) [ttk::frame $w.region] # Format set f [ttk::labelframe $w.region.format -text [msgcat::mc {Default Format}]] ttk::menubutton $f.format -textvariable pmarker(format) \ -menu $f.format.menu grid $f.format -padx 2 -pady 2 -sticky w menu $f.format.menu $f.format.menu add radiobutton -label {DS9/Funtools} \ -variable pmarker(format) -value ds9 $f.format.menu add radiobutton -label {XML} \ -variable pmarker(format) -value xml $f.format.menu add radiobutton -label {CIAO} \ -variable pmarker(format) -value ciao $f.format.menu add radiobutton -label {SAOtng} \ -variable pmarker(format) -value saotng $f.format.menu add radiobutton -label {SAOimage} \ -variable pmarker(format) -value saoimage $f.format.menu add radiobutton -label {IRAF PROS} \ -variable pmarker(format) -value pros $f.format.menu add radiobutton -label {X Y} \ -variable pmarker(format) -value xy # Length set f [ttk::labelframe $w.region.dformat \ -text [msgcat::mc {Default Length}]] ttk::menubutton $f.dformat -textvariable pmarker(dformat) \ -menu $f.dformat.menu grid $f.dformat -padx 2 -pady 2 -sticky w menu $f.dformat.menu $f.dformat.menu add radiobutton -label {Degrees} \ -variable pmarker(dformat) -value degrees $f.dformat.menu add radiobutton -label {ArcMin} \ -variable pmarker(dformat) -value arcmin $f.dformat.menu add radiobutton -label {ArcSec} \ -variable pmarker(dformat) -value arcsec # Epsilon set f [ttk::labelframe $w.region.epsilon \ -text [msgcat::mc {Mouse Click Epsilon}]] ttk::label $f.title -text [msgcat::mc {Pixels}] ttk::menubutton $f.epsilon -textvariable pmarker(epsilon) \ -menu $f.epsilon.menu grid $f.title $f.epsilon -padx 2 -pady 2 -sticky w menu $f.epsilon.menu $f.epsilon.menu add radiobutton -label {2} -variable pmarker(epsilon) \ -value 2 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {3} -variable pmarker(epsilon) \ -value 3 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {4} -variable pmarker(epsilon) \ -value 4 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {5} -variable pmarker(epsilon) \ -value 5 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {6} -variable pmarker(epsilon) \ -value 6 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {8} -variable pmarker(epsilon) \ -value 8 -command MarkerEpsilon $f.epsilon.menu add radiobutton -label {10} -variable pmarker(epsilon) \ -value 10 -command MarkerEpsilon grid $f.title $f.epsilon -padx 2 -pady 2 -sticky w # Centroid set f [ttk::labelframe $w.region.centroid -text [msgcat::mc {Centroid}]] ttk::label $f.ititle -text [msgcat::mc {Iteration}] ttk::entry $f.iteration -textvariable pmarker(centroid,iteration) -width 10 ttk::label $f.rtitle -text [msgcat::mc {Radius}] ttk::entry $f.radius -textvariable pmarker(centroid,radius) -width 10 grid $f.ititle $f.iteration $f.rtitle $f.radius -padx 2 -pady 2 -sticky w # Plots set f [ttk::labelframe $w.region.plot -text [msgcat::mc {Auto Plot}]] ttk::checkbutton $f.2d -text [msgcat::mc {2D}] -variable pmarker(plot2d) ttk::checkbutton $f.3d -text [msgcat::mc {3D}] -variable pmarker(plot3d) ttk::checkbutton $f.stats -text [msgcat::mc {Statistics}] \ -variable pmarker(stats) grid $f.2d $f.3d -padx 2 -pady 2 -sticky w grid $f.stats -padx 2 -pady 2 -sticky w # Circle set f [ttk::labelframe $w.region.circle -text [msgcat::mc {Circle}]] ttk::label $f.title -text [msgcat::mc {Radius}] ttk::entry $f.radius -textvariable pmarker(circle,radius) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] grid $f.title $f.radius $f.unit -padx 2 -pady 2 -sticky w # Ellipse set f [ttk::labelframe $w.region.ellipse -text [msgcat::mc {Ellipse}]] ttk::label $f.title -text "Radius 1" ttk::entry $f.radius1 -textvariable pmarker(ellipse,radius1) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.title2 -text "Radius 2" ttk::entry $f.radius2 -textvariable pmarker(ellipse,radius2) -width 10 ttk::label $f.unit2 -text [msgcat::mc {Image}] grid $f.title $f.radius1 $f.unit -padx 2 -pady 2 -sticky w grid $f.title2 $f.radius2 $f.unit2 -padx 2 -pady 2 -sticky w # Box set f [ttk::labelframe $w.region.box -text [msgcat::mc {Box}]] ttk::label $f.title -text "Size 1" ttk::entry $f.radius1 -textvariable pmarker(box,radius1) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.title2 -text "Size 2" ttk::entry $f.radius2 -textvariable pmarker(box,radius2) -width 10 ttk::label $f.unit2 -text [msgcat::mc {Image}] grid $f.title $f.radius1 $f.unit -padx 2 -pady 2 -sticky w grid $f.title2 $f.radius2 $f.unit2 -padx 2 -pady 2 -sticky w # Projection set f [ttk::labelframe $w.region.projection -text [msgcat::mc {Projection}]] ttk::label $f.title -text [msgcat::mc {Thickness}] ttk::entry $f.thick -textvariable pmarker(projection,thick) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] grid $f.title $f.thick $f.unit -padx 2 -pady 2 -sticky w # Point set f [ttk::labelframe $w.region.point -text [msgcat::mc {Point}]] ttk::label $f.title -text [msgcat::mc {Size}] ttk::entry $f.size -textvariable pmarker(point,size) -width 10 ttk::label $f.unit -text [msgcat::mc {Pixels}] grid $f.title $f.size $f.unit -padx 2 -pady 2 -sticky w pack $w.region.format $w.region.dformat $w.region.epsilon \ $w.region.centroid $w.region.plot \ $w.region.circle $w.region.ellipse \ $w.region.box $w.region.projection $w.region.point \ -side top -fill both -expand true } proc PrefsDialogAnnulus {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Annulus}] lappend dprefs(tabs) [ttk::frame $w.annulus] # Annulus set f [ttk::labelframe $w.annulus.annulus -text [msgcat::mc {Annulus}]] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::label $f.radiusTitle -text [msgcat::mc {Radius}] ttk::entry $f.inner -textvariable pmarker(annulus,inner) -width 10 ttk::entry $f.outer -textvariable pmarker(annulus,outer) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(annulus,annuli) -width 10 grid x $f.innerTitle $f.outerTitle -padx 2 -pady 2 -sticky w grid $f.radiusTitle $f.inner $f.outer $f.unit -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w # Ellipse Annulus set f [ttk::labelframe $w.annulus.ellipseannulus \ -text [msgcat::mc {Elliptical Annulus}]] ttk::label $f.majorTitle -text [msgcat::mc {Major}] ttk::label $f.minorTitle -text [msgcat::mc {Minor}] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::entry $f.radius1 -textvariable pmarker(ellipseannulus,radius1) \ -width 10 ttk::entry $f.radius2 -textvariable pmarker(ellipseannulus,radius2) \ -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::entry $f.radius3 -textvariable pmarker(ellipseannulus,radius3) \ -width 10 ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(ellipseannulus,annuli) -width 10 grid x $f.majorTitle $f.minorTitle -padx 2 -pady 2 -sticky w grid $f.innerTitle $f.radius1 $f.radius2 $f.unit -padx 2 -pady 2 -sticky w grid $f.outerTitle $f.radius3 -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w # Box Annulus set f [ttk::labelframe $w.annulus.boxannulus \ -text [msgcat::mc {Box Annulus}]] ttk::label $f.majorTitle -text [msgcat::mc {Width}] ttk::label $f.minorTitle -text [msgcat::mc {Height}] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::entry $f.radius1 -textvariable pmarker(boxannulus,radius1) -width 10 ttk::entry $f.radius2 -textvariable pmarker(boxannulus,radius2) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::entry $f.radius3 -textvariable pmarker(boxannulus,radius3) -width 10 ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(boxannulus,annuli) -width 10 grid x $f.majorTitle $f.minorTitle -padx 2 -pady 2 -sticky w grid $f.innerTitle $f.radius1 $f.radius2 $f.unit -padx 2 -pady 2 -sticky w grid $f.outerTitle $f.radius3 -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w pack $w.annulus.annulus $w.annulus.ellipseannulus $w.annulus.boxannulus \ -side top -fill both -expand true } proc PrefsDialogPanda {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Panda}] lappend dprefs(tabs) [ttk::frame $w.panda] # Panda set f [ttk::labelframe $w.panda.panda -text [msgcat::mc {Panda}]] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::label $f.radiusTitle -text [msgcat::mc {Radius}] ttk::entry $f.inner -textvariable pmarker(panda,inner) -width 10 ttk::entry $f.outer -textvariable pmarker(panda,outer) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(panda,annuli) -width 10 grid x $f.innerTitle $f.outerTitle -padx 2 -pady 2 -sticky w grid $f.radiusTitle $f.inner $f.outer $f.unit -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w ttk::label $f.ang1Title -text [msgcat::mc {Start}] ttk::label $f.ang2Title -text [msgcat::mc {Stop}] ttk::label $f.angTitle -text [msgcat::mc {Angles}] ttk::entry $f.ang1 -textvariable pmarker(panda,ang1) -width 10 ttk::entry $f.ang2 -textvariable pmarker(panda,ang2) -width 10 ttk::label $f.angunit -text [msgcat::mc {Degrees}] ttk::label $f.angnumTitle -text [msgcat::mc {Number}] ttk::entry $f.angnum -textvariable pmarker(panda,angnum) -width 10 grid x $f.ang1Title $f.ang2Title -padx 2 -pady 2 -sticky w grid $f.angTitle $f.ang1 $f.ang2 $f.angunit -padx 2 -pady 2 -sticky w grid $f.angnumTitle $f.angnum -padx 2 -pady 2 -sticky w # Elliptical Panda set f [ttk::labelframe $w.panda.epanda \ -text [msgcat::mc {Elliptical Panda}]] ttk::label $f.majorTitle -text [msgcat::mc {Major}] ttk::label $f.minorTitle -text [msgcat::mc {Minor}] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::entry $f.radius1 -textvariable pmarker(epanda,radius1) -width 10 ttk::entry $f.radius2 -textvariable pmarker(epanda,radius2) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::entry $f.radius3 -textvariable pmarker(epanda,radius3) -width 10 ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(epanda,annuli) -width 10 grid x $f.majorTitle $f.minorTitle -padx 2 -pady 2 -sticky w grid $f.innerTitle $f.radius1 $f.radius2 $f.unit -padx 2 -pady 2 -sticky w grid $f.outerTitle $f.radius3 -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w ttk::label $f.ang1Title -text [msgcat::mc {Start}] ttk::label $f.ang2Title -text [msgcat::mc {Stop}] ttk::label $f.angTitle -text [msgcat::mc {Angles}] ttk::entry $f.ang1 -textvariable pmarker(epanda,ang1) -width 10 ttk::entry $f.ang2 -textvariable pmarker(epanda,ang2) -width 10 ttk::label $f.angunit -text [msgcat::mc {Degrees}] ttk::label $f.angnumTitle -text [msgcat::mc {Number}] ttk::entry $f.angnum -textvariable pmarker(epanda,angnum) -width 10 grid x $f.ang1Title $f.ang2Title -padx 2 -pady 2 -sticky w grid $f.angTitle $f.ang1 $f.ang2 $f.angunit -padx 2 -pady 2 -sticky w grid $f.angnumTitle $f.angnum -padx 2 -pady 2 -sticky w # Default Box Panda set f [ttk::labelframe $w.panda.bpanda -text [msgcat::mc {Box Panda}]] ttk::label $f.majorTitle -text [msgcat::mc {Major}] ttk::label $f.minorTitle -text [msgcat::mc {Minor}] ttk::label $f.innerTitle -text [msgcat::mc {Inner}] ttk::entry $f.radius1 -textvariable pmarker(bpanda,radius1) -width 10 ttk::entry $f.radius2 -textvariable pmarker(bpanda,radius2) -width 10 ttk::label $f.unit -text [msgcat::mc {Image}] ttk::label $f.outerTitle -text [msgcat::mc {Outer}] ttk::entry $f.radius3 -textvariable pmarker(bpanda,radius3) -width 10 ttk::label $f.annuliTitle -text [msgcat::mc {Annuli}] ttk::entry $f.annuli -textvariable pmarker(bpanda,annuli) -width 10 grid x $f.majorTitle $f.minorTitle -padx 2 -pady 2 -sticky w grid $f.innerTitle $f.radius1 $f.radius2 $f.unit -padx 2 -pady 2 -sticky w grid $f.outerTitle $f.radius3 -padx 2 -pady 2 -sticky w grid $f.annuliTitle $f.annuli -padx 2 -pady 2 -sticky w ttk::label $f.ang1Title -text [msgcat::mc {Start}] ttk::label $f.ang2Title -text [msgcat::mc {Stop}] ttk::label $f.angTitle -text [msgcat::mc {Angles}] ttk::entry $f.ang1 -textvariable pmarker(bpanda,ang1) -width 10 ttk::entry $f.ang2 -textvariable pmarker(bpanda,ang2) -width 10 ttk::label $f.angunit -text [msgcat::mc {Degrees}] ttk::label $f.angnumTitle -text [msgcat::mc {Number}] ttk::entry $f.angnum -textvariable pmarker(bpanda,angnum) -width 10 grid x $f.ang1Title $f.ang2Title -padx 2 -pady 2 -sticky w grid $f.angTitle $f.ang1 $f.ang2 $f.angunit -padx 2 -pady 2 -sticky w grid $f.angnumTitle $f.angnum -padx 2 -pady 2 -sticky w pack $w.panda.panda $w.panda.epanda $w.panda.bpanda \ -side top -fill both -expand true } # Buttons proc ButtonsRegionDef {} { global pbuttons array set pbuttons { region,info 1 region,circle 0 region,ellipse 0 region,box 0 region,polygon 0 region,line 0 region,vector 0 region,projection 0 region,segment 0 region,text 0 region,point 0 region,ruler 0 region,compass 0 region,annulus 0 region,ellipseannulus 0 region,boxannulus 0 region,panda 0 region,epanda 0 region,bpanda 0 region,create 0 region,dissolve 0 region,loadtemplate 0 region,savetemplate 0 region,centroid 0 region,front 1 region,back 1 region,all 1 region,none 1 region,invert 0 region,delete 1 region,deleteall 0 region,newgroup 0 region,group 0 region,list 1 region,load 1 region,save 1 region,show 0 region,showtext 0 region,autocentroid 0 } } proc CreateButtonsRegion {} { global buttons global ds9 ttk::frame $ds9(buttons).region ButtonButton $ds9(buttons).region.info \ [string tolower [msgcat::mc {Information}]] MarkerInfo RadioButton $ds9(buttons).region.circle \ [string tolower [msgcat::mc {Circle}]] \ marker(shape) circle {} RadioButton $ds9(buttons).region.ellipse \ [string tolower [msgcat::mc {Ellipse}]] \ marker(shape) ellipse {} RadioButton $ds9(buttons).region.box \ [string tolower [msgcat::mc {Box}]] \ marker(shape) box {} RadioButton $ds9(buttons).region.polygon \ [string tolower [msgcat::mc {Polygon}]] \ marker(shape) polygon {} RadioButton $ds9(buttons).region.line \ [string tolower [msgcat::mc {Line}]] \ marker(shape) line {} RadioButton $ds9(buttons).region.vector \ [string tolower [msgcat::mc {Vector}]] \ marker(shape) vector {} RadioButton $ds9(buttons).region.projection \ [string tolower [msgcat::mc {Projection}]] \ marker(shape) projection {} RadioButton $ds9(buttons).region.segment \ [string tolower [msgcat::mc {Segment}]] \ marker(shape) segment {} RadioButton $ds9(buttons).region.text \ [string tolower [msgcat::mc {Text}]] \ marker(shape) text {} RadioButton $ds9(buttons).region.point \ [string tolower [msgcat::mc {Point}]] \ marker(shape) {circle point} {} RadioButton $ds9(buttons).region.ruler \ [string tolower [msgcat::mc {Ruler}]] \ marker(shape) ruler {} RadioButton $ds9(buttons).region.compass \ [string tolower [msgcat::mc {Compass}]] \ marker(shape) compass {} RadioButton $ds9(buttons).region.annulus \ [string tolower [msgcat::mc {Annulus}]] \ marker(shape) annulus {} RadioButton $ds9(buttons).region.ellipseannulus \ [string tolower [msgcat::mc {Elliptical Annulus}]] \ marker(shape) ellipseannulus {} RadioButton $ds9(buttons).region.boxannulus \ [string tolower [msgcat::mc {Box Annulus}]] \ marker(shape) boxannulus {} RadioButton $ds9(buttons).region.panda \ [string tolower [msgcat::mc {Panda}]] \ marker(shape) panda {} RadioButton $ds9(buttons).region.epanda \ [string tolower [msgcat::mc {Ellipse Panda}]] \ marker(shape) epanda {} RadioButton $ds9(buttons).region.bpanda \ [string tolower [msgcat::mc {Box Panda}]] \ marker(shape) bpanda {} ButtonButton $ds9(buttons).region.create \ [string tolower [msgcat::mc {Composite}]] CompositeCreate ButtonButton $ds9(buttons).region.dissolve \ [string tolower [msgcat::mc {Dissolve}]] CompositeDelete ButtonButton $ds9(buttons).region.loadtemplate \ [string tolower [msgcat::mc {Load Template}]] OpenTemplateMarker ButtonButton $ds9(buttons).region.savetemplate \ [string tolower [msgcat::mc {Save Template}]] SaveAsTemplateMarker ButtonButton $ds9(buttons).region.centroid \ [string tolower [msgcat::mc {Centroid}]] MarkerCentroid ButtonButton $ds9(buttons).region.front \ [string tolower [msgcat::mc {Front}]] MarkerFront ButtonButton $ds9(buttons).region.back \ [string tolower [msgcat::mc {Back}]] MarkerBack ButtonButton $ds9(buttons).region.all \ [string tolower [msgcat::mc {All}]] MarkerSelectAll ButtonButton $ds9(buttons).region.none \ [string tolower [msgcat::mc {None}]] MarkerUnselectAll ButtonButton $ds9(buttons).region.invert \ [string tolower [msgcat::mc {Invert}]] MarkerSelectInvert ButtonButton $ds9(buttons).region.delete \ [string tolower [msgcat::mc {Delete}]] MarkerDeleteSelect ButtonButton $ds9(buttons).region.deleteall \ [string tolower [msgcat::mc {Delete All}]] MarkerDeleteAllMenu ButtonButton $ds9(buttons).region.newgroup \ [string tolower [msgcat::mc {New Group}]] GroupCreate ButtonButton $ds9(buttons).region.group \ [string tolower [msgcat::mc {Groups}]] GroupDialog ButtonButton $ds9(buttons).region.list \ [string tolower [msgcat::mc {List}]] MarkerList ButtonButton $ds9(buttons).region.load \ [string tolower [msgcat::mc {Load}]] MarkerLoad ButtonButton $ds9(buttons).region.save \ [string tolower [msgcat::mc {Save}]] MarkerSave CheckButton $ds9(buttons).region.show \ [string tolower [msgcat::mc {Show}]] \ marker(show) MarkerShow CheckButton $ds9(buttons).region.showtext \ [string tolower [msgcat::mc {Show Text}]] \ marker(show,text) MarkerShowText CheckButton $ds9(buttons).region.autocentroid \ [string tolower [msgcat::mc {Auto Centroid}]] \ marker(centroid,auto) MarkerCentroidAuto set buttons(region) " $ds9(buttons).region.info pbuttons(region,info) $ds9(buttons).region.circle pbuttons(region,circle) $ds9(buttons).region.ellipse pbuttons(region,ellipse) $ds9(buttons).region.box pbuttons(region,box) $ds9(buttons).region.polygon pbuttons(region,polygon) $ds9(buttons).region.line pbuttons(region,line) $ds9(buttons).region.vector pbuttons(region,vector) $ds9(buttons).region.projection pbuttons(region,projection) $ds9(buttons).region.segment pbuttons(region,segment) $ds9(buttons).region.text pbuttons(region,text) $ds9(buttons).region.point pbuttons(region,point) $ds9(buttons).region.ruler pbuttons(region,ruler) $ds9(buttons).region.compass pbuttons(region,compass) $ds9(buttons).region.annulus pbuttons(region,annulus) $ds9(buttons).region.ellipseannulus pbuttons(region,ellipseannulus) $ds9(buttons).region.boxannulus pbuttons(region,boxannulus) $ds9(buttons).region.panda pbuttons(region,panda) $ds9(buttons).region.epanda pbuttons(region,epanda) $ds9(buttons).region.bpanda pbuttons(region,bpanda) $ds9(buttons).region.create pbuttons(region,create) $ds9(buttons).region.dissolve pbuttons(region,dissolve) $ds9(buttons).region.loadtemplate pbuttons(region,loadtemplate) $ds9(buttons).region.savetemplate pbuttons(region,savetemplate) $ds9(buttons).region.centroid pbuttons(region,centroid) $ds9(buttons).region.front pbuttons(region,front) $ds9(buttons).region.back pbuttons(region,back) $ds9(buttons).region.all pbuttons(region,all) $ds9(buttons).region.none pbuttons(region,none) $ds9(buttons).region.invert pbuttons(region,invert) $ds9(buttons).region.delete pbuttons(region,delete) $ds9(buttons).region.deleteall pbuttons(region,deleteall) $ds9(buttons).region.newgroup pbuttons(region,newgroup) $ds9(buttons).region.group pbuttons(region,group) $ds9(buttons).region.list pbuttons(region,list) $ds9(buttons).region.load pbuttons(region,load) $ds9(buttons).region.save pbuttons(region,save) $ds9(buttons).region.show pbuttons(region,show) $ds9(buttons).region.showtext pbuttons(region,showtext) $ds9(buttons).region.autocentroid pbuttons(region,autocentroid) " } proc PrefsDialogButtonbarRegion {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label "[msgcat::mc {Get Information}]..." \ -variable pbuttons(region,info) \ -command {UpdateButtons buttons(region)} $m add separator $m add cascade -label [msgcat::mc {Shape}] -menu $m.shape $m add cascade -label [msgcat::mc {Composite Region}] -menu $m.composite $m add cascade -label [msgcat::mc {Template}] -menu $m.template $m add separator $m add checkbutton -label [msgcat::mc {Centroid}] \ -variable pbuttons(region,centroid) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label [msgcat::mc {Move to Front}] \ -variable pbuttons(region,front) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label [msgcat::mc {Move to Back}] \ -variable pbuttons(region,back) \ -command {UpdateButtons buttons(region)} $m add separator $m add checkbutton -label [msgcat::mc {Select All}] \ -variable pbuttons(region,all) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label [msgcat::mc {Select None}] \ -variable pbuttons(region,none) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label [msgcat::mc {Invert Selection}] \ -variable pbuttons(region,invert) \ -command {UpdateButtons buttons(region)} $m add separator $m add checkbutton -label [msgcat::mc {Delete Selected Regions}] \ -variable pbuttons(region,delete) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label [msgcat::mc {Delete All Regions}] \ -variable pbuttons(region,deleteall) \ -command {UpdateButtons buttons(region)} $m add separator $m add checkbutton -label [msgcat::mc {New Group}] \ -variable pbuttons(region,newgroup) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label "[msgcat::mc {Groups}]..." \ -variable pbuttons(region,group) \ -command {UpdateButtons buttons(region)} $m add separator $m add checkbutton -label "[msgcat::mc {List Regions}]..." \ -variable pbuttons(region,list) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label "[msgcat::mc {Load Regions}]..." \ -variable pbuttons(region,load) \ -command {UpdateButtons buttons(region)} $m add checkbutton -label "[msgcat::mc {Save Regions}]..." \ -variable pbuttons(region,save) \ -command {UpdateButtons buttons(region)} $m add separator $m add cascade -label [msgcat::mc {Region Parameters}] -menu $m.params menu $m.shape $m.shape add checkbutton -label [msgcat::mc {Circle}] \ -variable pbuttons(region,circle) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Ellipse}] \ -variable pbuttons(region,ellipse) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Box}] \ -variable pbuttons(region,box) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Polygon}] \ -variable pbuttons(region,polygon) \ -command {UpdateButtons buttons(region)} $m.shape add separator $m.shape add checkbutton -label [msgcat::mc {Line}] \ -variable pbuttons(region,line) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Vector}] \ -variable pbuttons(region,vector) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Projection}] \ -variable pbuttons(region,projection) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Segment}] \ -variable pbuttons(region,segment) \ -command {UpdateButtons buttons(region)} $m.shape add separator $m.shape add checkbutton -label [msgcat::mc {Text}] \ -variable pbuttons(region,text) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Point}] \ -variable pbuttons(region,point) \ -command {UpdateButtons buttons(region)} $m.shape add separator $m.shape add checkbutton -label [msgcat::mc {Ruler}] \ -variable pbuttons(region,ruler) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Compass}] \ -variable pbuttons(region,compass) \ -command {UpdateButtons buttons(region)} $m.shape add separator $m.shape add checkbutton -label [msgcat::mc {Annulus}] \ -variable pbuttons(region,annulus) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Elliptical Annulus}] \ -variable pbuttons(region,ellipseannulus) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Box Annulus}] \ -variable pbuttons(region,boxannulus) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Panda}] \ -variable pbuttons(region,panda) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Elliptical Panda}]\ -variable pbuttons(region,epanda) \ -command {UpdateButtons buttons(region)} $m.shape add checkbutton -label [msgcat::mc {Box Panda}] \ -variable pbuttons(region,bpanda) \ -command {UpdateButtons buttons(region)} menu $m.composite $m.composite add checkbutton -label [msgcat::mc {Create}] \ -variable pbuttons(region,create) \ -command {UpdateButtons buttons(region)} $m.composite add checkbutton -label [msgcat::mc {Dissolve}] \ -variable pbuttons(region,dissolve) \ -command {UpdateButtons buttons(region)} menu $m.template $m.template add checkbutton -label "[msgcat::mc {Load}]..." \ -variable pbuttons(region,loadtemplate) \ -command {UpdateButtons buttons(region)} $m.template add checkbutton -label "[msgcat::mc {Save}]..." \ -variable pbuttons(region,savetemplate) \ -command {UpdateButtons buttons(region)} menu $m.params $m.params add checkbutton -label [msgcat::mc {Show}] \ -variable pbuttons(region,show) \ -command {UpdateButtons buttons(region)} $m.params add checkbutton -label [msgcat::mc {Show Text}] \ -variable pbuttons(region,showtext) \ -command {UpdateButtons buttons(region)} $m.params add separator $m.params add checkbutton -label [msgcat::mc {Auto Centroid}] \ -variable pbuttons(region,autocentroid) \ -command {UpdateButtons buttons(region)} } # Support proc UpdateRegionMenu {} { global current global marker global pmarker global ds9 if {$current(frame) != {}} { $ds9(mb) entryconfig [msgcat::mc {Region}] -state normal set marker(show) [$current(frame) get marker show] set marker(show,text) [$current(frame) get marker show text] set marker(centroid,auto) [$current(frame) get marker centroid auto] set marker(centroid,radius) [$current(frame) get marker centroid radius] set marker(centroid,iteration) \ [$current(frame) get marker centroid iteration] set marker(preserve) [$current(frame) get marker preserve] switch -- $current(mode) { pointer - region { if {[$current(frame) get marker select number] == 1} { set marker(color) \ [$current(frame) get marker color] set marker(width) \ [$current(frame) get marker width] set marker(dash) \ [$current(frame) get marker property dash] set marker(fixed) \ [$current(frame) get marker property fixed] set marker(edit) \ [$current(frame) get marker property edit] set marker(move) \ [$current(frame) get marker property move] set marker(rotate) \ [$current(frame) get marker property rotate] set marker(delete) \ [$current(frame) get marker property delete] set marker(include) \ [$current(frame) get marker property include] set marker(source) \ [$current(frame) get marker property source] set f [$current(frame) get marker font] set marker(font) [lindex $f 0] set marker(font,size) [lindex $f 1] set marker(font,weight) [lindex $f 2] set marker(font,slant) [lindex $f 3] } else { # defaults set marker(color) $pmarker(color) set marker(width) $pmarker(width) set marker(dash) $pmarker(dash) set marker(fixed) $pmarker(fixed) set marker(edit) $pmarker(edit) set marker(move) $pmarker(move) set marker(rotate) $pmarker(rotate) set marker(delete) $pmarker(delete) set marker(include) $pmarker(include) set marker(source) $pmarker(source) set marker(font) $pmarker(font) set marker(font,size) $pmarker(font,size) set marker(font,weight) $pmarker(font,weight) set marker(font,slant) $pmarker(font,slant) } } } } else { $ds9(mb) entryconfig [msgcat::mc {Region}] -state disabled } } �������������������������������������������������������������������������������������������������������������saods9/ds9/library/mscale.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000040224 12616732023 016503� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menu proc ScaleMainMenu {} { global ds9 menu $ds9(mb).scale $ds9(mb).scale add radiobutton -label [msgcat::mc {Linear}] \ -variable scale(type) -command ChangeScale -value linear $ds9(mb).scale add radiobutton -label [msgcat::mc {Log}] \ -variable scale(type) -command ChangeScale -value log $ds9(mb).scale add radiobutton -label [msgcat::mc {Power}] \ -variable scale(type) -command ChangeScale -value pow $ds9(mb).scale add radiobutton -label [msgcat::mc {Square Root}] \ -variable scale(type) -command ChangeScale -value sqrt $ds9(mb).scale add radiobutton -label [msgcat::mc {Squared}] \ -variable scale(type) -command ChangeScale -value squared $ds9(mb).scale add radiobutton -label {ASINH} \ -variable scale(type) -command ChangeScale -value asinh $ds9(mb).scale add radiobutton -label {SINH} \ -variable scale(type) -command ChangeScale -value sinh $ds9(mb).scale add radiobutton \ -label [msgcat::mc {Histogram Equalization}] \ -variable scale(type) -command ChangeScale -value histequ $ds9(mb).scale add separator $ds9(mb).scale add command -label "[msgcat::mc {Log Exponent}]..." \ -command ScaleLogDialog $ds9(mb).scale add separator $ds9(mb).scale add radiobutton -label [msgcat::mc {Min Max}] \ -variable scale(mode) -command ChangeScaleMode -value minmax $ds9(mb).scale add radiobutton -label {99.5%} \ -variable scale(mode) -command ChangeScaleMode -value 99.5 $ds9(mb).scale add radiobutton -label {99%} \ -variable scale(mode) -command ChangeScaleMode -value 99 $ds9(mb).scale add radiobutton -label {98%} \ -variable scale(mode) -command ChangeScaleMode -value 98 $ds9(mb).scale add radiobutton -label {97%} \ -variable scale(mode) -command ChangeScaleMode -value 97 $ds9(mb).scale add radiobutton -label {96%} \ -variable scale(mode) -command ChangeScaleMode -value 96 $ds9(mb).scale add radiobutton -label {95%} \ -variable scale(mode) -command ChangeScaleMode -value 95 $ds9(mb).scale add radiobutton -label {92.5%} \ -variable scale(mode) -command ChangeScaleMode -value 92.5 $ds9(mb).scale add radiobutton -label {90%} \ -variable scale(mode) -command ChangeScaleMode -value 90 $ds9(mb).scale add radiobutton -label {ZScale} \ -variable scale(mode) -command ChangeScaleMode -value zscale $ds9(mb).scale add radiobutton -label {ZMax} \ -variable scale(mode) -command ChangeScaleMode -value zmax $ds9(mb).scale add radiobutton -label [msgcat::mc {User}] \ -variable scale(mode) -command ChangeScaleMode -value user $ds9(mb).scale add separator $ds9(mb).scale add radiobutton -label [msgcat::mc {Global}] \ -variable scale(scope) -command ChangeScaleScope -value global $ds9(mb).scale add radiobutton -label [msgcat::mc {Local}] \ -variable scale(scope) -command ChangeScaleScope -value local $ds9(mb).scale add separator $ds9(mb).scale add cascade -label [msgcat::mc {Min Max}] \ -menu $ds9(mb).scale.minmax $ds9(mb).scale add command -label {ZScale...} -command ZScaleDialog $ds9(mb).scale add separator $ds9(mb).scale add checkbutton -label "[msgcat::mc {Use}] DATASEC" \ -variable scale(datasec) -command ChangeDATASEC $ds9(mb).scale add separator $ds9(mb).scale add command -label "[msgcat::mc {Scale Parameters}]..." \ -command ScaleDialog menu $ds9(mb).scale.minmax $ds9(mb).scale.minmax add radiobutton -label [msgcat::mc {Scan}] \ -variable minmax(mode) -value scan -command ChangeMinMax $ds9(mb).scale.minmax add radiobutton -label {DATAMIN DATAMAX} \ -variable minmax(mode) -value datamin -command ChangeMinMax $ds9(mb).scale.minmax add radiobutton -label {IRAF-MIN IRAF-MAX} \ -variable minmax(mode) -value irafmin -command ChangeMinMax } proc PrefsDialogScaleMenu {w} { set f [ttk::labelframe $w.mscale -text [msgcat::mc {Scale}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarScale $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 -sticky w set m $f.menu.menu menu $m $m add radiobutton -label [msgcat::mc {Linear}] \ -variable pscale(type) -value linear $m add radiobutton -label [msgcat::mc {Log}] \ -variable pscale(type) -value log $m add radiobutton -label [msgcat::mc {Power}] \ -variable pscale(type) -value pow $m add radiobutton -label [msgcat::mc {Square Root}]\ -variable pscale(type) -value sqrt $m add radiobutton -label [msgcat::mc {Squared}] \ -variable pscale(type) -value squared $m add radiobutton -label {ASINH} \ -variable pscale(type) -value asinh $m add radiobutton -label {SINH} \ -variable pscale(type) -value sinh $m add radiobutton -label [msgcat::mc {Histogram Equalization}] \ -variable pscale(type) -value histequ $m add separator $m add radiobutton -label [msgcat::mc {Min Max}] \ -variable pscale(mode) -value minmax $m add radiobutton -label {99.5%} -variable pscale(mode) -value 99.5 $m add radiobutton -label {99%} -variable pscale(mode) -value 99 $m add radiobutton -label {98%} -variable pscale(mode) -value 98 $m add radiobutton -label {97%} -variable pscale(mode) -value 97 $m add radiobutton -label {96%} -variable pscale(mode) -value 96 $m add radiobutton -label {95%} -variable pscale(mode) -value 95 $m add radiobutton -label {92.5%} -variable pscale(mode) -value 92.5 $m add radiobutton -label {90%} -variable pscale(mode) -value 90 $m add radiobutton -label {ZScale} -variable pscale(mode) -value zscale $m add radiobutton -label {ZMax} -variable pscale(mode) -value zmax $m add radiobutton -label [msgcat::mc {User}] \ -variable pscale(mode) -value user $m add separator $m add radiobutton -label [msgcat::mc {Global}] \ -variable pscale(scope) -value global $m add radiobutton -label [msgcat::mc {Local}] \ -variable pscale(scope) -value local $m add separator $m add cascade -label [msgcat::mc {Min Max}] -menu $m.minmax $m add separator $m add checkbutton -label "[msgcat::mc {Use}] DATASEC" \ -variable pscale(datasec) menu $m.minmax $m.minmax add radiobutton -label [msgcat::mc {Scan}] \ -variable pminmax(mode) -value scan $m.minmax add radiobutton -label {DATAMIN DATAMAX} \ -variable pminmax(mode) -value datamin $m.minmax add radiobutton -label {IRAF-MIN IRAF-MAX} \ -variable pminmax(mode) -value irafmin pack $f -side top -fill both -expand true } proc PrefsDialogScale {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Scale}] lappend dprefs(tabs) [ttk::frame $w.scale] # Log set f [ttk::labelframe $w.scale.log -text [msgcat::mc {Log Exponent}]] ttk::entry $f.log -textvariable pscale(log) -width 10 grid $f.log -padx 2 -pady 2 -sticky w # Zscale set f [ttk::labelframe $w.scale.zscale \ -text [msgcat::mc {ZScale Parameters}]] slider $f.scontrast 0. 1. [msgcat::mc {Contrast}] \ pzscale(contrast) {} slider $f.ssize 0 1000 [msgcat::mc {Number of Samples}] \ pzscale(sample) {} slider $f.sline 0 500 [msgcat::mc {Samples per Line}] \ pzscale(line) {} grid $f.scontrast -padx 2 -pady 2 -sticky ew grid $f.ssize -padx 2 -pady 2 -sticky ew grid $f.sline -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 pack $w.scale.log $w.scale.zscale -side top -fill both -expand true } # Buttons proc ButtonsScaleDef {} { global pbuttons array set pbuttons { scale,linear 1 scale,log 1 scale,pow 1 scale,sqrt 1 scale,squared 1 scale,asinh 1 scale,sinh 1 scale,hist 1 scale,minmax 1 scale,995 0 scale,99 0 scale,98 0 scale,97 0 scale,96 0 scale,95 0 scale,925 0 scale,90 0 scale,zscale 1 scale,zmax 0 scale,user 0 scale,global 0 scale,local 0 scale,datasec 0 scale,params 0 } } proc CreateButtonsScale {} { global buttons global ds9 global scale ttk::frame $ds9(buttons).scale RadioButton $ds9(buttons).scale.linear \ [string tolower [msgcat::mc {Linear}]] \ scale(type) linear ChangeScale RadioButton $ds9(buttons).scale.log \ [string tolower [msgcat::mc {Log}]] \ scale(type) log ChangeScale RadioButton $ds9(buttons).scale.pow \ [string tolower [msgcat::mc {Power}]] \ scale(type) pow ChangeScale RadioButton $ds9(buttons).scale.sqrt \ [string tolower [msgcat::mc {Sqrt}]] \ scale(type) sqrt ChangeScale RadioButton $ds9(buttons).scale.squared \ [string tolower [msgcat::mc {Squared}]] \ scale(type) squared ChangeScale RadioButton $ds9(buttons).scale.asinh \ [string tolower {ASINH}] \ scale(type) asinh ChangeScale RadioButton $ds9(buttons).scale.sinh \ [string tolower {SINH}] \ scale(type) sinh ChangeScale RadioButton $ds9(buttons).scale.hist \ [string tolower [msgcat::mc {Histogram}]] \ scale(type) histequ ChangeScale RadioButton $ds9(buttons).scale.minmax \ [string tolower [msgcat::mc {Min Max}]] \ scale(mode) minmax ChangeScaleMode RadioButton $ds9(buttons).scale.995 {99.5%} scale(mode) 99.5 ChangeScaleMode RadioButton $ds9(buttons).scale.99 {99%} scale(mode) 99 ChangeScaleMode RadioButton $ds9(buttons).scale.98 {98%} scale(mode) 98 ChangeScaleMode RadioButton $ds9(buttons).scale.97 {97%} scale(mode) 97 ChangeScaleMode RadioButton $ds9(buttons).scale.96 {96%} scale(mode) 96 ChangeScaleMode RadioButton $ds9(buttons).scale.95 {95%} scale(mode) 95 ChangeScaleMode RadioButton $ds9(buttons).scale.925 {92.5%} scale(mode) 92.5 ChangeScaleMode RadioButton $ds9(buttons).scale.90 {90%} scale(mode) 90 ChangeScaleMode RadioButton $ds9(buttons).scale.zscale {zscale} \ scale(mode) zscale ChangeScaleMode RadioButton $ds9(buttons).scale.zmax {zmax} \ scale(mode) zmax ChangeScaleMode RadioButton $ds9(buttons).scale.user \ [string tolower [msgcat::mc {User}]] \ scale(mode) user ChangeScaleMode RadioButton $ds9(buttons).scale.global \ [string tolower [msgcat::mc {Global}]] \ scale(scope) global ChangeScaleScope RadioButton $ds9(buttons).scale.local \ [string tolower [msgcat::mc {Local}]] \ scale(scope) local ChangeScaleScope CheckButton $ds9(buttons).scale.datasec {datasec} \ scale(datasec) ChangeDATASEC ButtonButton $ds9(buttons).scale.params \ [string tolower [msgcat::mc {Parameters}]] ScaleDialog set buttons(scale) " $ds9(buttons).scale.linear pbuttons(scale,linear) $ds9(buttons).scale.log pbuttons(scale,log) $ds9(buttons).scale.pow pbuttons(scale,pow) $ds9(buttons).scale.sqrt pbuttons(scale,sqrt) $ds9(buttons).scale.squared pbuttons(scale,squared) $ds9(buttons).scale.asinh pbuttons(scale,asinh) $ds9(buttons).scale.sinh pbuttons(scale,sinh) $ds9(buttons).scale.hist pbuttons(scale,hist) $ds9(buttons).scale.minmax pbuttons(scale,minmax) $ds9(buttons).scale.995 pbuttons(scale,995) $ds9(buttons).scale.99 pbuttons(scale,99) $ds9(buttons).scale.98 pbuttons(scale,98) $ds9(buttons).scale.97 pbuttons(scale,97) $ds9(buttons).scale.96 pbuttons(scale,96) $ds9(buttons).scale.95 pbuttons(scale,95) $ds9(buttons).scale.925 pbuttons(scale,925) $ds9(buttons).scale.90 pbuttons(scale,90) $ds9(buttons).scale.zscale pbuttons(scale,zscale) $ds9(buttons).scale.zmax pbuttons(scale,zmax) $ds9(buttons).scale.user pbuttons(scale,user) $ds9(buttons).scale.global pbuttons(scale,global) $ds9(buttons).scale.local pbuttons(scale,local) $ds9(buttons).scale.datasec pbuttons(scale,datasec) $ds9(buttons).scale.params pbuttons(scale,params) " } proc PrefsDialogButtonbarScale {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Linear}] \ -variable pbuttons(scale,linear) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Log}] \ -variable pbuttons(scale,log) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Power}] \ -variable pbuttons(scale,pow) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Square Root}] \ -variable pbuttons(scale,sqrt) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Squared}] \ -variable pbuttons(scale,squared) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {ASINH} \ -variable pbuttons(scale,asinh) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {SINH} \ -variable pbuttons(scale,sinh) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Histogram Equalization}] \ -variable pbuttons(scale,hist) -command {UpdateButtons buttons(scale)} $m add separator $m add checkbutton -label [msgcat::mc {Min Max}] \ -variable pbuttons(scale,minmax) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {99.5%} \ -variable pbuttons(scale,995) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {99%} \ -variable pbuttons(scale,99) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {98%} \ -variable pbuttons(scale,98) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {97%} \ -variable pbuttons(scale,97) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {96%} \ -variable pbuttons(scale,96) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {95%} \ -variable pbuttons(scale,95) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {92.5%} \ -variable pbuttons(scale,925) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {90%} \ -variable pbuttons(scale,90) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {ZScale} \ -variable pbuttons(scale,zscale) -command {UpdateButtons buttons(scale)} $m add checkbutton -label {ZMax} \ -variable pbuttons(scale,zmax) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {User}] \ -variable pbuttons(scale,user) -command {UpdateButtons buttons(scale)} $m add separator $m add checkbutton -label [msgcat::mc {Global}] \ -variable pbuttons(scale,global) -command {UpdateButtons buttons(scale)} $m add checkbutton -label [msgcat::mc {Local}] \ -variable pbuttons(scale,local) -command {UpdateButtons buttons(scale)} $m add separator $m add checkbutton -label "[msgcat::mc {Use}] DATASEC" \ -variable pbuttons(scale,datasec) -command {UpdateButtons buttons(scale)} $m add separator $m add checkbutton -label "[msgcat::mc {Scale Parameters}]..." \ -variable pbuttons(scale,params) -command {UpdateButtons buttons(scale)} } # Support proc UpdateScaleMenu {} { global ds9 global current global scale global debug if {$debug(tcl,update)} { puts stderr "UpdateScaleMenu" } if {$current(frame) != {}} { if {![$current(frame) has iis]} { $ds9(mb) entryconfig [msgcat::mc {Scale}] -state normal set scale(type) [$current(frame) get colorscale] set scale(log) [$current(frame) get colorscale log] set scale(scope) [$current(frame) get clip scope] set scale(mode) [$current(frame) get clip mode] set scale(datasec) [$current(frame) get datasec] set minmax(mode) [$current(frame) get clip minmax mode] set zscale(contrast) [$current(frame) get clip zscale contrast] set zscale(sample) [$current(frame) get clip zscale sample] set zscale(line) [$current(frame) get clip zscale line] # DATAMIN/MAX IRAFMIN/MAX if {[$current(frame) has fits]} { if {[$current(frame) has datamin]} { $ds9(mb).scale.minmax entryconfig {DATAMIN DATAMAX} \ -state normal } else { $ds9(mb).scale.minmax entryconfig {DATAMIN DATAMAX} \ -state disabled } if {[$current(frame) has irafmin]} { $ds9(mb).scale.minmax entryconfig {IRAF-MIN IRAF-MAX} \ -state normal } else { $ds9(mb).scale.minmax entryconfig {IRAF-MIN IRAF-MAX} \ -state disabled } } else { $ds9(mb).scale.minmax entryconfig {DATAMIN DATAMAX} \ -state normal $ds9(mb).scale.minmax entryconfig {IRAF-MIN IRAF-MAX} \ -state normal } } else { $ds9(mb) entryconfig [msgcat::mc {Scale}] -state disabled } } else { $ds9(mb) entryconfig [msgcat::mc {Scale}] -state disabled } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/multiframe.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000006411 12514261632 017404� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadMultiFrameFile {fn} { set path {} if {[string range $fn 0 4] == "stdin" || [string range $fn 0 4] == "STDIN" || [string range $fn 0 0] == "-"} { set path [tmpnam ds9 {.fits}] catch { set ch [open "$path" w] fconfigure stdin -translation binary -encoding binary fconfigure $ch -translation binary -encoding binary puts -nonewline $ch [read stdin] close $ch } } LoadMultiFrameAlloc $path $fn } proc LoadMultiFrameSocket {sock fn} { global loadParam global current global ds9 set path [tmpnam ds9 {.fits}] catch { set ch [open "$path" w] fconfigure $ch -translation binary -encoding binary fconfigure $sock -translation binary -encoding binary puts -nonewline $ch [read $sock] close $ch } return [LoadMultiFrameAlloc $path $fn] } proc LoadMultiFrameAlloc {path fn} { global loadParam global current global ds9 set ext 0 set cnt 0 set did 0 set need 0 # start with new frame? if {$current(frame) != {}} { switch -- [$current(frame) get type] { base { if {[$current(frame) has fits]} { CreateFrame set did 1 } } rgb - 3d { CreateFrame set did 1 } } } else { CreateFrame } while {1} { # create a new frame if {$need} { CreateFrame set did 1 } # ProcessLoad will clear loadParam each time set loadParam(file,type) fits set loadParam(file,mode) {} if {$path != {}} { set loadParam(load,type) allocgz set loadParam(file,name) "stdin\[$ext\]" set loadParam(file,fn) "$path\[$ext\]" } else { set loadParam(load,type) mmapincr set loadParam(file,name) "$fn\[$ext\]" } set loadParam(load,layer) {} if {![ProcessLoad 0]} { if {$ext} { InitError xpa if {$did} { DeleteCurrentFrame incr ds9(next,num) -1 } if {!$cnt} { Error "[msgcat::mc {Unable to load}] $loadParam(file,type) $loadParam(file,mode) $loadParam(file,name)" return 0 } break; } } else { # ignore any bin tables if {![$current(frame) has fits bin]} { incr cnt set need 1 } else { set need 0 } } incr ext } if {$path != {}} { catch {file delete -force $path} } # go into tile mode if more than one if {$cnt && $current(display) != "tile"} { set current(display) tile DisplayMode } return 1 } proc ProcessMultiFrameCmd {varname iname sock fn} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { new { incr i # not supported } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS { if {![LoadMultiFrameSocket $sock $param]} { InitError xpa LoadMultiFrameFile $param } } {Windows NT} {LoadMultiFrameFile $param} } } else { # comm if {$fn != {}} { LoadMultiFrameAlloc $fn $param } else { LoadMultiFrameFile $param } } FinishLoad } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/mview.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000033645 12520501015 016364� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc ViewMainMenu {} { global ds9 menu $ds9(mb).view $ds9(mb).view add radiobutton -label [msgcat::mc {Horizontal Layout}] \ -variable view(layout) -value horizontal -command {ViewHorzCmd} $ds9(mb).view add radiobutton -label [msgcat::mc {Vertical Layout}] \ -variable view(layout) -value vertical -command {ViewVertCmd} $ds9(mb).view add separator $ds9(mb).view add checkbutton -label [msgcat::mc {Information Panel}] \ -variable view(info) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Panner}] \ -variable view(panner) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Magnifier}] \ -variable view(magnifier) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Buttons}] \ -variable view(buttons) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Colorbar}] \ -variable view(colorbar) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Horizontal Graph}] \ -variable view(graph,horz) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Vertical Graph}] \ -variable view(graph,vert) -command UpdateView $ds9(mb).view add separator $ds9(mb).view add checkbutton -label [msgcat::mc {Filename}] \ -variable view(info,filename) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Object}] \ -variable view(info,object) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Keyword}] \ -variable view(info,keyword) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Min Max}] \ -variable view(info,minmax) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Low High}] \ -variable view(info,lowhigh) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Units}] \ -variable view(info,bunit) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {WCS}] \ -variable view(info,wcs) -command UpdateView $ds9(mb).view add cascade -label [msgcat::mc {Multiple WCS}] \ -menu $ds9(mb).view.mwcs $ds9(mb).view add checkbutton -label [msgcat::mc {Image}] \ -variable view(info,image) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Physical}] \ -variable view(info,physical) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Amplifier}] \ -variable view(info,amplifier) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Detector}] \ -variable view(info,detector) -command UpdateView $ds9(mb).view add checkbutton -label [msgcat::mc {Frame Information}] \ -variable view(info,frame) -command UpdateView # View Info Panel WCS menu $ds9(mb).view.mwcs foreach l {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} { $ds9(mb).view.mwcs add checkbutton \ -label "[msgcat::mc {WCS}] $l" \ -variable "view(info,wcs$l)" \ -command UpdateView } } proc PrefsDialogViewMenu {w} { set f [ttk::labelframe $w.mview -text [msgcat::mc {View}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarView $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add radiobutton -label [msgcat::mc {Horizontal Layout}] \ -variable pview(layout) -value horizontal $m add radiobutton -label [msgcat::mc {Vertical Layout}] \ -variable pview(layout) -value vertical $m add separator $m add checkbutton -label [msgcat::mc {Information Panel}] \ -variable pview(info) $m add checkbutton -label [msgcat::mc {Panner}] \ -variable pview(panner) $m add checkbutton -label [msgcat::mc {Magnifier}] \ -variable pview(magnifier) $m add checkbutton -label [msgcat::mc {Buttons}] \ -variable pview(buttons) $m add checkbutton -label [msgcat::mc {Colorbar}] \ -variable pview(colorbar) $m add checkbutton -label [msgcat::mc {Horizontal Graph}] \ -variable pview(graph,horz) $m add checkbutton -label [msgcat::mc {Vertical Graph}] \ -variable pview(graph,vert) $m add separator $m add checkbutton -label [msgcat::mc {Filename}] \ -variable pview(info,filename) $m add checkbutton -label [msgcat::mc {Object}] \ -variable pview(info,object) $m add checkbutton -label [msgcat::mc {Keyword}] \ -variable pview(info,keyword) $m add checkbutton -label [msgcat::mc {Min Max}] \ -variable pview(info,minmax) $m add checkbutton -label [msgcat::mc {Low High}] \ -variable pview(info,lowhigh) $m add checkbutton -label [msgcat::mc {Units}] \ -variable pview(info,bunit) $m add checkbutton -label [msgcat::mc {WCS}] \ -variable pview(info,wcs) $m add cascade -label [msgcat::mc {Multiple WCS}] -menu $m.wcs $m add checkbutton -label [msgcat::mc {Image}] \ -variable pview(info,image) $m add checkbutton -label [msgcat::mc {Physical}] \ -variable pview(info,physical) $m add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pview(info,amplifier) $m add checkbutton -label [msgcat::mc {Detector}] \ -variable pview(info,detector) $m add checkbutton -label [msgcat::mc {Frame Information}]\ -variable pview(info,frame) menu $m.wcs foreach l {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} { $m.wcs add checkbutton -label "[msgcat::mc {WCS}] $l" \ -variable "pview(info,wcs$l)" } pack $f -side top -fill both -expand true } proc PrefsDialogGraph {} { global dprefs global ds9 global pds9 global pmagnifier global current set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Graphs}] lappend dprefs(tabs) [ttk::frame $w.graph] set f [ttk::labelframe $w.graph.horz -text [msgcat::mc {Horizontal}]] ttk::label $f.htitle -text [msgcat::mc {Default}] ttk::checkbutton $f.hgrid -text [msgcat::mc {Grid}] \ -variable pgraph(horz,grid) -command UpdateGraphGrid ttk::radiobutton $f.hlinear -text [msgcat::mc {Linear}] \ -variable pgraph(horz,log) -value false \ -command "UpdateGraphYAxis $current(frame)" ttk::radiobutton $f.hlog -text [msgcat::mc {Log}] \ -variable pgraph(horz,log) -value true \ -command "UpdateGraphYAxis $current(frame)" grid $f.htitle $f.hgrid $f.hlinear $f.hlog -padx 2 -pady 2 -sticky w set f [ttk::labelframe $w.graph.vert -text [msgcat::mc {Vertical}]] ttk::label $f.vtitle -text [msgcat::mc {Default}] ttk::checkbutton $f.vgrid -text [msgcat::mc {Grid}] \ -variable pgraph(vert,grid) -command UpdateGraphGrid ttk::radiobutton $f.vlinear -text [msgcat::mc {Linear}] \ -variable pgraph(vert,log) -value false \ -command "UpdateGraphYAxis $current(frame)" ttk::radiobutton $f.vlog -text [msgcat::mc {Log}] \ -variable pgraph(vert,log) -value true \ -command "UpdateGraphYAxis $current(frame)" grid $f.vtitle $f.vgrid $f.vlinear $f.vlog -padx 2 -pady 2 -sticky w pack $w.graph.horz $w.graph.vert -side top -fill both -expand true } # Buttons proc ButtonsViewDef {} { global pbuttons array set pbuttons { view,horizontal 0 view,vertical 0 view,info 1 view,panner 1 view,magnifier 1 view,buttons 1 view,colorbar 1 view,graphhorz 1 view,graphvert 1 view,filename 0 view,object 0 view,minmax 0 view,lowhigh 0 view,bunit 0 view,wcs 0 view,image 0 view,physical 0 view,amplifier 0 view,detector 0 view,frame 0 } } proc CreateButtonsView {} { global buttons global ds9 global view ttk::frame $ds9(buttons).view RadioButton $ds9(buttons).view.horizontal \ [string tolower [msgcat::mc {Layout Horz}]] \ view(layout) horizontal {ViewHorzCmd} RadioButton $ds9(buttons).view.vertical \ [string tolower [msgcat::mc {Layout Vert}]] \ view(layout) vertical {ViewVertCmd} CheckButton $ds9(buttons).view.info \ [string tolower [msgcat::mc {Information}]] \ view(info) UpdateView CheckButton $ds9(buttons).view.panner \ [string tolower [msgcat::mc {Panner}]] \ view(panner) UpdateView CheckButton $ds9(buttons).view.magnifier \ [string tolower [msgcat::mc {Magnifier}]] \ view(magnifier) UpdateView CheckButton $ds9(buttons).view.buttons \ [string tolower [msgcat::mc {Buttons}]] \ view(buttons) UpdateView CheckButton $ds9(buttons).view.colorbar \ [string tolower [msgcat::mc {Colorbar}]] \ view(colorbar) UpdateView CheckButton $ds9(buttons).view.graphhorz \ [string tolower [msgcat::mc {Graph Horz}]] \ view(graph,horz) UpdateView CheckButton $ds9(buttons).view.graphvert \ [string tolower [msgcat::mc {Graph Vert}]] \ view(graph,vert) UpdateView CheckButton $ds9(buttons).view.filename \ [string tolower [msgcat::mc {Filename}]] \ view(info,filename) UpdateView CheckButton $ds9(buttons).view.object \ [string tolower [msgcat::mc {Object}]] \ view(info,object) UpdateView CheckButton $ds9(buttons).view.keyword \ [string tolower [msgcat::mc {Keyword}]] \ view(info,keyword) UpdateView CheckButton $ds9(buttons).view.minmax \ [string tolower [msgcat::mc {Min Max}]] \ view(info,minmax) UpdateView CheckButton $ds9(buttons).view.lowhigh \ [string tolower [msgcat::mc {Low High}]] \ view(info,lowhigh) UpdateView CheckButton $ds9(buttons).view.bunit \ [string tolower [msgcat::mc {Units}]] \ view(info,bunit) UpdateView CheckButton $ds9(buttons).view.wcs \ [string tolower [msgcat::mc {WCS}]] \ view(info,wcs) UpdateView CheckButton $ds9(buttons).view.image \ [string tolower [msgcat::mc {Image}]] \ view(info,image) UpdateView CheckButton $ds9(buttons).view.physical \ [string tolower [msgcat::mc {Physical}]] \ view(info,physical) UpdateView CheckButton $ds9(buttons).view.amplifier \ [string tolower [msgcat::mc {Amplifier}]] \ view(info,amplifier) UpdateView CheckButton $ds9(buttons).view.detector \ [string tolower [msgcat::mc {Detector}]] \ view(info,detector) UpdateView CheckButton $ds9(buttons).view.frame \ [string tolower [msgcat::mc {Frame}]] \ view(info,frame) UpdateView set buttons(view) " $ds9(buttons).view.horizontal pbuttons(view,horizontal) $ds9(buttons).view.vertical pbuttons(view,vertical) $ds9(buttons).view.info pbuttons(view,info) $ds9(buttons).view.panner pbuttons(view,panner) $ds9(buttons).view.magnifier pbuttons(view,magnifier) $ds9(buttons).view.buttons pbuttons(view,buttons) $ds9(buttons).view.colorbar pbuttons(view,colorbar) $ds9(buttons).view.graphhorz pbuttons(view,graphhorz) $ds9(buttons).view.graphvert pbuttons(view,graphvert) $ds9(buttons).view.filename pbuttons(view,filename) $ds9(buttons).view.object pbuttons(view,object) $ds9(buttons).view.minmax pbuttons(view,minmax) $ds9(buttons).view.lowhigh pbuttons(view,lowhigh) $ds9(buttons).view.bunit pbuttons(view,bunit) $ds9(buttons).view.wcs pbuttons(view,wcs) $ds9(buttons).view.image pbuttons(view,image) $ds9(buttons).view.physical pbuttons(view,physical) $ds9(buttons).view.amplifier pbuttons(view,amplifier) $ds9(buttons).view.detector pbuttons(view,detector) $ds9(buttons).view.frame pbuttons(view,frame) " } proc PrefsDialogButtonbarView {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Horizontal Layout}] \ -variable pbuttons(view,horizontal) \ -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Vertical Layout}] \ -variable pbuttons(view,vertical) \ -command {UpdateButtons buttons(view)} $m add separator $m add checkbutton -label [msgcat::mc {Information Panel}] \ -variable pbuttons(view,info) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Panner}] \ -variable pbuttons(view,panner) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Magnifier}] \ -variable pbuttons(view,magnifier) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Buttons}] \ -variable pbuttons(view,buttons) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Colorbar}] \ -variable pbuttons(view,colorbar) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Horizontal Graph}] \ -variable pbuttons(view,graphhorz) \ -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Vertical Graph}] \ -variable pbuttons(view,graphvert) \ -command {UpdateButtons buttons(view)} $m add separator $m add checkbutton -label [msgcat::mc {Filename}] \ -variable pbuttons(view,filename) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Object}] \ -variable pbuttons(view,object) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Min Max}] \ -variable pbuttons(view,minmax) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Low High}] \ -variable pbuttons(view,lowhigh) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Unists}] \ -variable pbuttons(view,bunit) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {WCS}] \ -variable pbuttons(view,wcs) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Image}] \ -variable pbuttons(view,image) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Physical}] \ -variable pbuttons(view,physical) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Amplifier}] \ -variable pbuttons(view,amplifier) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Detector}] \ -variable pbuttons(view,detector) -command {UpdateButtons buttons(view)} $m add checkbutton -label [msgcat::mc {Frame Information}] \ -variable pbuttons(view,frame) -command {UpdateButtons buttons(view)} } �������������������������������������������������������������������������������������������saods9/ds9/library/mwcs.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000007660 12464211204 016211� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menu proc WCSMainMenu {} { global ds9 global wcs CoordMenu $ds9(mb).wcs wcs system 0 sky skyformat UpdateWCS $ds9(mb).wcs add separator $ds9(mb).wcs add command -label "[msgcat::mc {WCS Parameters}]..." \ -command WCSDialog } proc UpdateWCSMenu {} { global wcs global ds9 global current global bin global debug if {$debug(tcl,update)} { puts stderr "UpdateWCSMenu" } if {$current(frame) != {}} { $ds9(mb) entryconfig [msgcat::mc {WCS}] -state normal set ww [$current(frame) get wcs] set wcs(system) [lindex $ww 0] set wcs(sky) [lindex $ww 1] set wcs(skyformat) [lindex $ww 2] set wcs(frame) $current(frame) if {[$current(frame) has fits]} { CoordMenuEnable $ds9(mb).wcs wcs system 0 sky skyformat } else { CoordMenuReset $ds9(mb).wcs wcs system 0 sky skyformat } UpdateWCSInfoBox $current(frame) } else { $ds9(mb) entryconfig [msgcat::mc {WCS}] -state disabled } } proc PrefsDialogWCSMenu {w} { set f [ttk::labelframe $w.mwcs -text [msgcat::mc {WCS}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarWCS $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 -sticky w CoordMenu $f.menu.menu pwcs system 0 sky skyformat {} pack $f -side top -fill both -expand true } # Buttons proc ButtonsWCSDef {} { global pbuttons array set pbuttons { wcs,fk4 1 wcs,fk5 1 wcs,icrs 1 wcs,galactic 1 wcs,ecliptic 1 wcs,degrees 1 wcs,sexagesimal 1 } } proc CreateButtonsWCS {} { global buttons global ds9 global wcs ttk::frame $ds9(buttons).wcs RadioButton $ds9(buttons).wcs.fk4 {fk4} \ wcs(sky) fk4 UpdateWCS RadioButton $ds9(buttons).wcs.fk5 {fk5} \ wcs(sky) fk5 UpdateWCS RadioButton $ds9(buttons).wcs.icrs \ [string tolower [msgcat::mc {ICRS}]] \ wcs(sky) icrs UpdateWCS RadioButton $ds9(buttons).wcs.galactic \ [string tolower [msgcat::mc {Galactic}]] \ wcs(sky) galactic UpdateWCS RadioButton $ds9(buttons).wcs.ecliptic \ [string tolower [msgcat::mc {Ecliptic}]] \ wcs(sky) ecliptic UpdateWCS RadioButton $ds9(buttons).wcs.degrees \ [string tolower [msgcat::mc {Degrees}]] \ wcs(skyformat) degrees UpdateWCS RadioButton $ds9(buttons).wcs.sexagesimal {sexagesimal} \ wcs(skyformat) sexagesimal UpdateWCS set buttons(wcs) " $ds9(buttons).wcs.fk4 pbuttons(wcs,fk4) $ds9(buttons).wcs.fk5 pbuttons(wcs,fk5) $ds9(buttons).wcs.icrs pbuttons(wcs,icrs) $ds9(buttons).wcs.galactic pbuttons(wcs,galactic) $ds9(buttons).wcs.ecliptic pbuttons(wcs,ecliptic) $ds9(buttons).wcs.degrees pbuttons(wcs,degrees) $ds9(buttons).wcs.sexagesimal pbuttons(wcs,sexagesimal) " } proc PrefsDialogButtonbarWCS {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {FK4}] \ -variable pbuttons(wcs,fk4) -command {UpdateButtons buttons(wcs)} $m add checkbutton -label [msgcat::mc {FK5}] \ -variable pbuttons(wcs,fk5) -command {UpdateButtons buttons(wcs)} $m add checkbutton -label [msgcat::mc {ICRS}] \ -variable pbuttons(wcs,icrs) -command {UpdateButtons buttons(wcs)} $m add checkbutton -label [msgcat::mc {Galactic}] \ -variable pbuttons(wcs,galactic) -command {UpdateButtons buttons(wcs)} $m add checkbutton -label [msgcat::mc {Ecliptic}] \ -variable pbuttons(wcs,ecliptic) -command {UpdateButtons buttons(wcs)} $m add separator $m add checkbutton -label [msgcat::mc {Degrees}] \ -variable pbuttons(wcs,degrees) -command {UpdateButtons buttons(wcs)} $m add checkbutton -label [msgcat::mc {Sexagesimal}] \ -variable pbuttons(wcs,sexagesimal) -command {UpdateButtons buttons(wcs)} } ��������������������������������������������������������������������������������saods9/ds9/library/mzoom.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000037113 12517741504 016407� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # Menus proc ZoomMainMenu {} { global ds9 menu $ds9(mb).zoom $ds9(mb).zoom add command -label [msgcat::mc {Center Image}] \ -command CenterCurrentFrame $ds9(mb).zoom add checkbutton -label [msgcat::mc {Align}] \ -variable current(align) -command AlignWCSFrame $ds9(mb).zoom add separator $ds9(mb).zoom add command -label [msgcat::mc {Zoom In}] \ -command {Zoom 2 2} $ds9(mb).zoom add command -label [msgcat::mc {Zoom Out}] \ -command {Zoom .5 .5} $ds9(mb).zoom add command -label [msgcat::mc {Zoom Fit}] \ -command ZoomToFit $ds9(mb).zoom add separator $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/32" \ -variable current(zoom) -value { 0.03125 0.03125 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/16" \ -variable current(zoom) -value { 0.0625 0.0625 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/8" \ -variable current(zoom) -value { 0.125 0.125 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/4" \ -variable current(zoom) -value { 0.25 0.25 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/2" \ -variable current(zoom) -value { 0.5 0.5 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 1" \ -variable current(zoom) -value { 1 1 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 2" \ -variable current(zoom) -value { 2 2 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 4" \ -variable current(zoom) -value { 4 4 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 8" \ -variable current(zoom) -value { 8 8 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 16" \ -variable current(zoom) -value { 16 16 } -command ChangeZoom $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Zoom}] 32" \ -variable current(zoom) -value { 32 32 } -command ChangeZoom $ds9(mb).zoom add separator $ds9(mb).zoom add radiobutton -label [msgcat::mc {None}] \ -variable current(orient) -value none -command ChangeOrient $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Invert}] X" \ -variable current(orient) -value x -command ChangeOrient $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Invert}] Y" \ -variable current(orient) -value y -command ChangeOrient $ds9(mb).zoom add radiobutton -label "[msgcat::mc {Invert}] XY" \ -variable current(orient) -value xy -command ChangeOrient $ds9(mb).zoom add separator $ds9(mb).zoom add radiobutton -label "0 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 0 -command ChangeRotate $ds9(mb).zoom add radiobutton -label "90 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 90 -command ChangeRotate $ds9(mb).zoom add radiobutton -label "180 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 180 -command ChangeRotate $ds9(mb).zoom add radiobutton -label "270 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 270 -command ChangeRotate $ds9(mb).zoom add separator $ds9(mb).zoom add command -label "[msgcat::mc {Crop Parameters}]..." \ -command CropDialog $ds9(mb).zoom add separator $ds9(mb).zoom add command \ -label "[msgcat::mc {Pan Zoom Rotate Parameters}]..." \ -command PanZoomDialog } proc PrefsDialogZoomMenu {w} { set f [ttk::labelframe $w.mzoom -text [msgcat::mc {Zoom}]] ttk::menubutton $f.menu -text [msgcat::mc {Menu}] -menu $f.menu.menu PrefsDialogButtonbarZoom $f.buttonbar grid $f.menu $f.buttonbar -padx 2 -pady 2 set m $f.menu.menu menu $m $m add checkbutton -label [msgcat::mc {Align}] \ -variable pcurrent(align) $m add separator $m add radiobutton -label "[msgcat::mc {Zoom}] 1/32" \ -variable pcurrent(zoom) -value { 0.03125 0.03125 } $m add radiobutton -label "[msgcat::mc {Zoom}] 1/16" \ -variable pcurrent(zoom) -value { 0.0625 0.0625 } $m add radiobutton -label "[msgcat::mc {Zoom}] 1/8" \ -variable pcurrent(zoom) -value { 0.125 0.125 } $m add radiobutton -label "[msgcat::mc {Zoom}] 1/4" \ -variable pcurrent(zoom) -value { 0.25 0.25 } $m add radiobutton -label "[msgcat::mc {Zoom}] 1/2" \ -variable pcurrent(zoom) -value { 0.5 0.5 } $m add radiobutton -label "[msgcat::mc {Zoom}] 1" \ -variable pcurrent(zoom) -value { 1 1 } $m add radiobutton -label "[msgcat::mc {Zoom}] 2" \ -variable pcurrent(zoom) -value { 2 2 } $m add radiobutton -label "[msgcat::mc {Zoom}] 4" \ -variable pcurrent(zoom) -value { 4 4 } $m add radiobutton -label "[msgcat::mc {Zoom}] 8" \ -variable pcurrent(zoom) -value { 8 8 } $m add radiobutton -label "[msgcat::mc {Zoom}] 16" \ -variable pcurrent(zoom) -value { 16 16 } $m add radiobutton -label "[msgcat::mc {Zoom}] 32" \ -variable pcurrent(zoom) -value { 32 32 } $m add separator $m add radiobutton -label [msgcat::mc {None}] \ -variable pcurrent(orient) -value none $m add radiobutton -label "[msgcat::mc {Invert}] X" \ -variable pcurrent(orient) -value x $m add radiobutton -label "[msgcat::mc {Invert}] Y" \ -variable pcurrent(orient) -value y $m add radiobutton -label "[msgcat::mc {Invert}] XY" \ -variable pcurrent(orient) -value xy $m add separator $m add radiobutton -label "0 [msgcat::mc {Degrees}]" \ -variable pcurrent(rotate) -value 0 $m add radiobutton -label "90 [msgcat::mc {Degrees}]" \ -variable pcurrent(rotate) -value 90 $m add radiobutton -label "180 [msgcat::mc {Degrees}]" \ -variable pcurrent(rotate) -value 180 $m add radiobutton -label "270 [msgcat::mc {Degrees}]" \ -variable pcurrent(rotate) -value 270 pack $f -side top -fill both -expand true } proc PrefsDialogZoom {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Zoom}] lappend dprefs(tabs) [ttk::frame $w.zoom] # PanZoom set f [ttk::labelframe $w.zoom.panzoom -text [msgcat::mc {Pan Zoom}]] ttk::radiobutton $f.click -text [msgcat::mc {Click to Center}] \ -variable ppanzoom(mode) -value click ttk::radiobutton $f.drag -text [msgcat::mc {Drag to Center}] \ -variable ppanzoom(mode) -value drag ttk::radiobutton $f.panzoom -text [msgcat::mc {Pan then Zoom}] \ -variable ppanzoom(mode) -value panzoom grid $f.click $f.drag $f.panzoom -padx 2 -pady 2 -sticky w # Mouse set f [ttk::labelframe $w.zoom.mouse -text [msgcat::mc {Mouse Wheel Zoom}]] ttk::checkbutton $f.click -text [msgcat::mc {Enable}] \ -variable ppanzoom(wheel) ttk::label $f.title2 -text [msgcat::mc {Factor}] ttk::entry $f.factor -textvariable ppanzoom(wheel,factor) -width 10 grid $f.click $f.title2 $f.factor -padx 2 -pady 2 -sticky w pack $w.zoom.panzoom $w.zoom.mouse -side top -fill both -expand true } # Buttons proc ButtonsZoomDef {} { global pbuttons array set pbuttons { zoom,center 0 zoom,align 0 zoom,in 1 zoom,out 1 zoom,fit 1 zoom,i32 0 zoom,i16 0 zoom,i8 0 zoom,i4 1 zoom,i2 1 zoom,1 1 zoom,2 1 zoom,4 1 zoom,8 0 zoom,16 0 zoom,32 0 zoom,none 0 zoom,x 0 zoom,y 0 zoom,xy 0 zoom,0 0 zoom,90 0 zoom,180 0 zoom,270 0 zoom,crop 0 zoom,params 0 } } proc CreateButtonsZoom {} { global buttons global ds9 ttk::frame $ds9(buttons).zoom ButtonButton $ds9(buttons).zoom.center \ [string tolower [msgcat::mc {Center}]] CenterCurrentFrame CheckButton $ds9(buttons).zoom.align \ [msgcat::mc {Align}] current(align) AlignWCSFrame ButtonButton $ds9(buttons).zoom.in \ [string tolower [msgcat::mc {Zoom In}]] {Zoom 2 2} ButtonButton $ds9(buttons).zoom.out \ [string tolower [msgcat::mc {Zoom Out}]] {Zoom .5 .5} ButtonButton $ds9(buttons).zoom.fit \ [string tolower [msgcat::mc {Zoom Fit}]] ZoomToFit RadioButton $ds9(buttons).zoom.i32 \ "[string tolower [msgcat::mc {Zoom}]] 1/32" \ current(zoom) { 0.03125 0.03125 } ChangeZoom RadioButton $ds9(buttons).zoom.i16 \ "[string tolower [msgcat::mc {Zoom}]] 1/16" \ current(zoom) { 0.0625 0.0625 } ChangeZoom RadioButton $ds9(buttons).zoom.i8 \ "[string tolower [msgcat::mc {Zoom}]] 1/8" \ current(zoom) { 0.125 0.125 } ChangeZoom RadioButton $ds9(buttons).zoom.i4 \ "[string tolower [msgcat::mc {Zoom}]] 1/4" \ current(zoom) { 0.25 0.25 } ChangeZoom RadioButton $ds9(buttons).zoom.i2 \ "[string tolower [msgcat::mc {Zoom}]] 1/2" \ current(zoom) { 0.5 0.5 } ChangeZoom RadioButton $ds9(buttons).zoom.1 \ "[string tolower [msgcat::mc {Zoom}]] 1" \ current(zoom) { 1 1 } ChangeZoom RadioButton $ds9(buttons).zoom.2 \ "[string tolower [msgcat::mc {Zoom}]] 2" \ current(zoom) { 2 2 } ChangeZoom RadioButton $ds9(buttons).zoom.4 \ "[string tolower [msgcat::mc {Zoom}]] 4" \ current(zoom) { 4 4 } ChangeZoom RadioButton $ds9(buttons).zoom.8 \ "[string tolower [msgcat::mc {Zoom}]] 8" \ current(zoom) { 8 8 } ChangeZoom RadioButton $ds9(buttons).zoom.16 \ "[string tolower [msgcat::mc {Zoom}]] 16" \ current(zoom) { 16 16 } ChangeZoom RadioButton $ds9(buttons).zoom.32 \ "[string tolower [msgcat::mc {Zoom}]] 32" \ current(zoom) { 32 32 } ChangeZoom RadioButton $ds9(buttons).zoom.none \ [string tolower [msgcat::mc {None}]] \ current(orient) none ChangeOrient RadioButton $ds9(buttons).zoom.x {x} current(orient) x ChangeOrient RadioButton $ds9(buttons).zoom.y {y} current(orient) y ChangeOrient RadioButton $ds9(buttons).zoom.xy {xy} current(orient) xy ChangeOrient RadioButton $ds9(buttons).zoom.0 {0} current(rotate) 0 ChangeRotate RadioButton $ds9(buttons).zoom.90 {90} current(rotate) 90 ChangeRotate RadioButton $ds9(buttons).zoom.180 {180} current(rotate) 180 ChangeRotate RadioButton $ds9(buttons).zoom.270 {270} current(rotate) 270 ChangeRotate ButtonButton $ds9(buttons).zoom.crop \ [string tolower [msgcat::mc {Crop}]] CropDialog ButtonButton $ds9(buttons).zoom.params \ [string tolower [msgcat::mc {Parameters}]] PanZoomDialog set buttons(zoom) " $ds9(buttons).zoom.center pbuttons(zoom,center) $ds9(buttons).zoom.align pbuttons(zoom,align) $ds9(buttons).zoom.in pbuttons(zoom,in) $ds9(buttons).zoom.out pbuttons(zoom,out) $ds9(buttons).zoom.fit pbuttons(zoom,fit) $ds9(buttons).zoom.i32 pbuttons(zoom,i32) $ds9(buttons).zoom.i16 pbuttons(zoom,i16) $ds9(buttons).zoom.i8 pbuttons(zoom,i8) $ds9(buttons).zoom.i4 pbuttons(zoom,i4) $ds9(buttons).zoom.i2 pbuttons(zoom,i2) $ds9(buttons).zoom.1 pbuttons(zoom,1) $ds9(buttons).zoom.2 pbuttons(zoom,2) $ds9(buttons).zoom.4 pbuttons(zoom,4) $ds9(buttons).zoom.8 pbuttons(zoom,8) $ds9(buttons).zoom.16 pbuttons(zoom,16) $ds9(buttons).zoom.32 pbuttons(zoom,32) $ds9(buttons).zoom.none pbuttons(zoom,none) $ds9(buttons).zoom.x pbuttons(zoom,x) $ds9(buttons).zoom.y pbuttons(zoom,y) $ds9(buttons).zoom.xy pbuttons(zoom,xy) $ds9(buttons).zoom.0 pbuttons(zoom,0) $ds9(buttons).zoom.90 pbuttons(zoom,90) $ds9(buttons).zoom.180 pbuttons(zoom,180) $ds9(buttons).zoom.270 pbuttons(zoom,270) $ds9(buttons).zoom.crop pbuttons(zoom,crop) $ds9(buttons).zoom.params pbuttons(zoom,params) " } proc PrefsDialogButtonbarZoom {f} { global buttons global pbuttons ttk::menubutton $f -text [msgcat::mc {Buttonbar}] -menu $f.menu set m $f.menu menu $m $m add checkbutton -label [msgcat::mc {Center Image}] \ -variable pbuttons(zoom,center) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label [msgcat::mc {Align}] \ -variable pbuttons(zoom,align) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label [msgcat::mc {Zoom In}] \ -variable pbuttons(zoom,in) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label [msgcat::mc {Zoom Out}] \ -variable pbuttons(zoom,out) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label [msgcat::mc {Zoom Fit}] \ -variable pbuttons(zoom,fit) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label "[msgcat::mc {Zoom}] 1/32" \ -variable pbuttons(zoom,i32) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 1/16" \ -variable pbuttons(zoom,i16) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 1/8" \ -variable pbuttons(zoom,i8) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 1/4" \ -variable pbuttons(zoom,i4) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 1/2" \ -variable pbuttons(zoom,i2) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 1" \ -variable pbuttons(zoom,1) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 2" \ -variable pbuttons(zoom,2) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 4" \ -variable pbuttons(zoom,4) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 8" \ -variable pbuttons(zoom,8) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 16" \ -variable pbuttons(zoom,16) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Zoom}] 32" \ -variable pbuttons(zoom,32) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label [msgcat::mc {None}] \ -variable pbuttons(zoom,none) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Invert}] X" \ -variable pbuttons(zoom,x) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Invert}] Y" \ -variable pbuttons(zoom,y) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "[msgcat::mc {Invert}] XY" \ -variable pbuttons(zoom,xy) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label "0 [msgcat::mc {Degrees}]" \ -variable pbuttons(zoom,0) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "90 [msgcat::mc {Degrees}]" \ -variable pbuttons(zoom,90) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "180 [msgcat::mc {Degrees}]" \ -variable pbuttons(zoom,180) -command {UpdateButtons buttons(zoom)} $m add checkbutton -label "270 [msgcat::mc {Degrees}]" \ -variable pbuttons(zoom,270) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label "[msgcat::mc {Crop Parameters}]..." \ -variable pbuttons(zoom,crop) -command {UpdateButtons buttons(zoom)} $m add separator $m add checkbutton -label "[msgcat::mc {Pan Zoom Rotate Parameters}]..." \ -variable pbuttons(zoom,params) -command {UpdateButtons buttons(zoom)} } # Support proc UpdateZoomMenuStatic {} { global ds9 global debug if {$debug(tcl,update)} { puts stderr "UpdateZoomMenuStatic" } if {$ds9(active,num) > 0} { $ds9(mb) entryconfig [msgcat::mc {Zoom}] -state normal } else { $ds9(mb) entryconfig [msgcat::mc {Zoom}] -state disabled } } proc UpdateZoomMenu {} { global ds9 global current global panzoom global debug if {$debug(tcl,update)} { puts stderr "UpdateZoomMenu" } if {$current(frame) == {}} { $ds9(mb).zoom entryconfig [msgcat::mc {Align}] -state disabled } else { $ds9(mb).zoom entryconfig [msgcat::mc {Align}] -state normal set panzoom(preserve) [$current(frame) get pan preserve] set current(zoom) [$current(frame) get zoom] set current(rotate) [$current(frame) get rotate] set current(orient) [$current(frame) get orient] set current(align) [$current(frame) get wcs align] } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/nameres.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000013647 12514261632 016702� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc NRESDef {} { global nres global inres global pnres set inres(top) .nres set inres(mb) .nresmb # set via wcs() set nres(system) wcs set nres(sky) fk5 set nres(skyformat) degrees # prefs only set pnres(server) simbad-cds } proc NRESApply {varname sync} { upvar #0 $varname var global $varname set var(sync) $sync ARApply $varname if {$var(name)!={}} { NSVRServer $varname } else { ARStatus $varname "Please specify an Object Name" ARReset $varname } } proc NRESDialog {} { global nres global inres global ds9 global pds9 if {[winfo exists $inres(top)]} { raise $inres(top) return } set varname dnres upvar #0 $varname var global $varname # AR variables ARInit $varname {} # Variables set var(top) $inres(top) set var(mb) $inres(mb) set var(system) $nres(system) set var(sky) $nres(sky) set var(skyformat) $nres(skyformat) # create the window set w $var(top) set mb $var(mb) Toplevel $w $mb 6 [msgcat::mc {Name Resolution}] "ARDestroy $varname" # file $mb add cascade -label File -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Retrieve}] \ -command "NRESApply $varname 0" $mb.file add command -label [msgcat::mc {Cancel}] \ -command "ARCancel $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Pan To}] \ -command "NRESPan $varname" $mb.file add command -label [msgcat::mc {Crosshair To}] \ -command "NRESCrosshair $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "ARDestroy $varname" # edit AREditMenu $varname # name server NSVRServerMenu $varname # Param set f [ttk::frame $w.param] ttk::label $f.nametitle -text [msgcat::mc {Object}] ttk::entry $f.name -textvariable ${varname}(name) -width 48 ttk::label $f.sky -textvariable ${varname}(sky) -anchor w set var(xname) [ttk::label $f.xtitle -text {} -width 1] ttk::label $f.x -textvariable ${varname}(x) -width 14 -relief groove set var(yname) [ttk::label $f.ytitle -text {} -width 1] ttk::label $f.y -textvariable ${varname}(y) -width 14 -relief groove ARSkyFormat $f.skyformat $varname grid $f.nametitle x $f.name - - - - -padx 2 -pady 2 -sticky w grid $f.sky $f.xtitle $f.x $f.ytitle $f.y $f.skyformat \ -padx 2 -pady 2 -sticky w # Status set f [ttk::frame $w.status] ttk::label $f.tstatus -text [msgcat::mc {Status}] ttk::label $f.status -textvariable ${varname}(status) grid $f.tstatus $f.status -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] set var(apply) [ttk::button $f.apply -text [msgcat::mc {Retrieve}] \ -command "NRESApply $varname 0"] set var(cancel) [ttk::button $f.cancel -text [msgcat::mc {Cancel}] \ -command "ARCancel $varname" -state disabled] ttk::button $f.close -text [msgcat::mc {Close}] \ -command "ARDestroy $varname" pack $f.apply $f.cancel $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal ttk::separator $w.sep2 -orient horizontal pack $w.buttons $w.sep $w.status $w.sep2 -side bottom -fill x pack $w.param -side top -fill both -expand true ARCoord $varname ARStatus $varname {} } proc NRESPan {varname} { upvar #0 $varname var global $varname if {($var(x) != {}) && ($var(y) != {})} { PanTo $var(x) $var(y) $var(system) $var(sky) } } proc NRESCrosshair {varname} { upvar #0 $varname var global $varname global current if {($current(frame) != {})} { if {[$current(frame) has wcs equatorial $var(system)]} { if {($var(x) != {}) && ($var(y) != {})} { set current(mode) crosshair ChangeMode $current(frame) crosshair \ $var(system) $var(sky) $var(x) $var(y) } } } } # Prefs proc PrefsDialogNRES {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Name Server}] lappend dprefs(tabs) [ttk::frame $w.namesvr] set f [ttk::labelframe $w.namesvr.params -text [msgcat::mc {Name Server}]] ttk::label $f.tsvr -text [msgcat::mc {Default}] ttk::menubutton $f.svr -textvariable pnres(server) -menu $f.svr.menu menu $f.svr.menu NSVRServerMenuItems $f.svr.menu grid $f.tsvr $f.svr -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } # Process Cmds proc ProcessNRESCmd {varname iname} { upvar $varname var upvar $iname i set vvarname dnres upvar #0 $vvarname vvar global $vvarname global nres global pnres NRESDialog switch -- [string tolower [lindex $var $i]] { {} - open {} close {ARDestroy $vvarname} server { incr i set pnres(server) [lindex $var $i] } pan {NRESPan $vvarname} crosshair {NRESCrosshair $vvarname} format - skyformat { incr i switch -- [string tolower [lindex $var $i]] { deg - degree - degrees { set vvar(skyformat) degrees set vvar(skyformat,msg) $vvar(skyformat) } default { set vvar(skyformat) [string tolower [lindex $var $i]] set vvar(skyformat,msg) $vvar(skyformat) } } } name { incr i set vvar(name) [lindex $var $i] NRESApply $vvarname 1 } default { set vvar(name) [lindex $var $i] NRESApply $vvarname 1 } } } proc ProcessSendNRESCmd {proc id param} { global nres global pnres global dnres NRESDialog switch -- [string tolower [lindex $param 0]] { server {$proc $id "$pnres(server)\n"} format - skyformat {$proc $id "$dnres(skyformat)\n"} name - {} {$proc $id "$dnres(name)\n"} default { set dnres(name) [lindex $param 0] NRESApply dnres 1 $proc $id "$dnres(x) $dnres(y)\n" } } } �����������������������������������������������������������������������������������������saods9/ds9/library/nrrd.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000005167 12464211204 016205� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ImportNRRDFile {fn layer} { global loadParam set loadParam(file,type) nrrd set loadParam(file,mode) {} set loadParam(load,layer) $layer # find stdin if {[string range $fn 0 4] == "stdin" || [string range $fn 0 4] == "STDIN" || [string range $fn 0 0] == "-"} { set loadParam(load,type) alloc set loadParam(file,name) stdin set loadParam(file,fn) $loadParam(file,name) } else { set loadParam(load,type) mmap set loadParam(file,name) $fn } ProcessLoad } proc ImportNRRDAlloc {path fn layer} { global loadParam set loadParam(file,type) nrrd set loadParam(file,mode) {} set loadParam(load,type) alloc set loadParam(file,name) $fn set loadParam(file,fn) $path set loadParam(load,layer) $layer ProcessLoad } proc ImportNRRDSocket {sock fn layer} { global loadParam set loadParam(file,type) nrrd set loadParam(file,mode) {} set loadParam(load,type) socket set loadParam(file,name) $fn set loadParam(socket,id) $sock set loadParam(load,layer) $layer return [ProcessLoad 0] } proc ExportNRRDFile {fn opt} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save nrrd file "\{$fn\}" $opt } proc ExportNRRDSocket {sock opt} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save nrrd socket $sock $opt } proc ProcessNRRDCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![ImportNRRDSocket $sock $param $layer]} { InitError xpa ImportNRRDFile $param $layer } } else { # comm if {$fn != {}} { ImportNRRDAlloc $fn $param $layer } else { ImportNRRDFile $param $layer } } FinishLoad } proc ProcessSendNRRDCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } set opt [string tolower [lindex $param 0]] if {$sock != {}} { # xpa ExportNRRDSocket $sock $opt } elseif {$fn != {}} { # comm ExportNRRDFile $fn $opt $proc $id {} $fn } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/nsvr.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000013545 12464211204 016227� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc NSVRServer {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "NSVRServer $varname" } global nres global pnres ARStatus $varname "Looking up $var(name)" set ss [split $pnres(server) {-}] switch -- [lindex $ss 1] { eso - sao {set var(url) {http://vizier.cfa.harvard.edu/viz-bin/nph-sesame}} cds {set var(url) {http://cdsweb.u-strasbg.fr/cgi-bin/nph-sesame}} } append ${varname}(url) {/-ox} switch -- [lindex $ss 0] { ned {append ${varname}(url) {/N}} simbad {append ${varname}(url) {/S}} vizier {append ${varname}(url) {/V}} } set var(query) [http::formatQuery $var(name)] NSVRLoad $varname } proc NSVRLoad {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "NSVRLoad $varname $var(url) $var(query)" } set var(ra) {} set var(dec) {} set var(pos) {} global ihttp # -query will not work, do it manually if {$var(sync)} { if {![catch {set var(token) [http::geturl $var(url)?$var(query) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 NSVRLoadFinish $varname $var(token) } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } else { if {![catch {set var(token) [http::geturl $var(url)?$var(query) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -command \ [list NSVRLoadFinish $varname] \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 } else { ARError $varname "[msgcat::mc {Unable to locate URL}] $var(url)" } } } proc NSVRLoadFinish {varname token} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "NSVRLoadFinish $varname" } if {!($var(active))} { ARCancelled $varname return } upvar #0 $token t # Code set code [http::ncode $token] # Meta set meta $t(meta) # Log it HTTPLog $token # Result? switch -- $code { 200 - 203 - 404 - 503 {NSVRSESAME $varname} 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $meta { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,image)} { puts stderr "NSVRLoadFinish redirect $code to $value" } # clean up and resubmit http::cleanup $token unset var(token) # strip query from url set var(url) [lindex [split $value {?}] 0] NSVRLoad $varname } } } default {ARError $varname "[msgcat::mc {Error code was returned}] $code"} } } proc NSVRSESAME {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "NSVRSESAME $varname" } set pp [xml::parser \ -characterdatacommand [list NSVRSESAMECharCB $varname]\ -elementstartcommand [list NSVRSESAMEElemStartCB $varname] \ -elementendcommand [list NSVRSESAMEElemEndCB $varname] \ -ignorewhitespace 1 \ ] set var(parse) {} if {[catch {$pp parse [http::data $var(token)]} err]} { $pp free NSVRParse $varname {} {} return } switch -- $var(skyformat) { degrees { if {$var(ra) != {} && $var(dec) != {}} { NSVRParse $varname $var(ra) $var(dec) } else { NSVRParse $varname {} {} } } sexagesimal { if {$var(pos) != {}} { # can have extra space chars, must clean up set ss [split [string trim $var(pos)]] NSVRParse $varname [lindex $ss 0] [lindex $ss end] } else { NSVRParse $varname {} {} } } } } proc NSVRSESAMECharCB {t data} { upvar #0 $t T global $t set state [lindex $T(parse) end] set prev [lindex $T(parse) end-1] switch -- $state { jpos { set T(pos) $data } jradeg { set T(ra) $data } jdedeg { set T(dec) $data } } return {} } proc NSVRSESAMEElemStartCB {t name attlist args} { upvar #0 $t T global $t lappend ${t}(parse) $name return {} } proc NSVRSESAMEElemEndCB {t name args} { upvar #0 $t T global $t set ${t}(parse) [lreplace $T(parse) end end] return {} } proc NSVRParse {varname x y} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "NSVRParse $varname $x $y" } set var(x) $x set var(y) $y if {($var(x) == {}) || ($var(y) == {})} { set var(x) {} set var(y) {} ARStatus $varname "$var(name) not found" ARReset $varname } else { if {$var(proc,next) != {}} { if {[info exists var(token)]} { http::cleanup $var(token) unset var(token) } eval $var(proc,next) $varname } else { ARDone $varname } } } proc NSVRServerMenu {varname} { upvar #0 $varname var global $varname $var(mb) add cascade -label [msgcat::mc {Name Server}] -menu $var(mb).name menu $var(mb).name NSVRServerMenuItems $var(mb).name } proc NSVRServerMenuItems {mm} { global nres $mm add radiobutton -label {NED@SAO} -variable pnres(server) \ -value ned-sao $mm add radiobutton -label {NED@CDS} -variable pnres(server) \ -value ned-cds $mm add separator $mm add radiobutton -label {SIMBAD@SAO} -variable pnres(server) \ -value simbad-sao $mm add radiobutton -label {SIMBAD@CDS} -variable pnres(server) \ -value simbad-cds $mm add separator $mm add radiobutton -label {VIZIER@SAO} -variable pnres(server) \ -value vizier-sao $mm add radiobutton -label {VIZIER@CDS} -variable pnres(server) \ -value vizier-cds } �����������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/nvss.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000011155 12544316735 016241� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc NVSSDef {} { global nvss global invss set invss(top) .nvss set invss(mb) .nvssmb set nvss(sky) fk5 set nvss(rformat) arcmin set nvss(width) 15 set nvss(height) 15 set nvss(mode) new set nvss(save) 0 set nvss(valid) 1 set nvss(survey) nvss } proc NVSSDialog {} { global nvss global invss global wcs if {[winfo exists $invss(top)]} { raise $invss(top) return } set varname dnvss upvar #0 $varname var global $varname set var(top) $invss(top) set var(mb) $invss(mb) set var(sky) $nvss(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $nvss(rformat) set var(width) $nvss(width) set var(height) $nvss(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(mode) $nvss(mode) set var(save) $nvss(save) set var(valid) $nvss(valid) set var(survey) $nvss(survey) set w $var(top) IMGSVRInit $varname "NVSS [msgcat::mc {Server}]" NVSSExec NVSSAck IMGSVRUpdate $varname 1 } proc NVSSExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set var(fn) [tmpnam ds9nvss ".fits"] } # skyformat switch -- $var(skyformat) { degrees { set xx [uformat d h: $var(x)] set yy [uformat d d: $var(y)] } sexagesimal { set xx $var(x) set yy $var(y) } } regsub -all {:} $xx { } xx regsub -all {:} $yy { } yy # size - convert to arcmin switch -- $var(rformat) { degrees { set ww [expr $var(width)] set hh [expr $var(height)] } arcmin { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } arcsec { set ww [expr $var(width)/60./60.] set hh [expr $var(height)/60./60.] } } set var(query) [http::formatQuery submit Submit! Equinox J2000 PolType I RA $xx Dec $yy Size "$ww $hh" Cells "15.0 15.0" MAPROJ SIN Type image/x-fits rotate "0.0"] # set var(query) [http::formatQuery .submit "Extract the Cutout" RA "$xx $yy" Equinox J2000 ImageSize $rr MaxInt 10 .cgifields ImageType ImageType "FITS Image"] set var(url) "http://www.cv.nrao.edu/cgi-bin/postage.pl" IMGSVRLoad $varname } proc NVSSAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the NRAO VLA Sky Survey This major undertaking has received the generous technical and scientific support of many individuals. The NRAO staff has provided extremely valuable assistance in many aspects of the observations themselves and in the area of software support; in particular, we are grateful to Rick Perley, Ken Sowinski, Barry Clark, and Bill Cotton in this regard. The support of the NRAO Director, Paul van den Bout, and the yeoman service provided by Frazer Owen as Chair of the Survey Oversight Committee are also greatly appreciated. We also thank the members of the Oversight Committee (Ken Chambers, Eric Feigelson, Jackie Hewitt, Gillian Knapp, and Rogier Windhorst) for their time and wise counsel in this enterprise. Acknowledgment is also due our colleagues who are involved in the ongoing NVSS effort, including Richard McMahon and Isobel Hook. This work is supported in part under the auspices of the Department of Energy by Lawrence Livermore National Laboratory under contract No. W-7405-ENG-48 and the Institute for Geophysics and Planetary Physics, whose director Charles Alcock has been particularly supportive. We also acknowledge a generous planning grant from the CalSpace Institute; support from the STScI archive group, STScI director Bob Williams, and the STScI Director's Discretionary Research Fund; computing resources from Columbia University; a grant from the National Science Foundation; a gift of computing equipment from Sun Microsystems; a NATO travel grant to support our collaboration with Richard McMahon; and an award from the National Geographic Society which, in the spirit of their support 40 years ago for the Palomar Observatory Sky Survey, will be providing funds to continue our charting of the Universe. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessNVSSCmd {varname iname} { upvar $varname var upvar $iname i NVSSDialog IMGSVRProcessCmd $varname $iname dnvss } proc ProcessSendNVSSCmd {proc id param} { NVSSDialog IMGSVRProcessSendCmd $proc $id $param dnvss } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/open.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000005336 12464211204 016177� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc Open {fn format layer mode sys} { if {$fn == {}} { return } StartLoad switch -- $format { fits {LoadFitsFile $fn $layer $mode} mosaicimagewcs {LoadMosaicImageWCSFile $fn $layer $sys} mosaicimageiraf {LoadMosaicImageIRAFFile $fn $layer} mosaicimagewfpc2 {LoadMosaicImageWFPC2File $fn} mosaicwcs {LoadMosaicWCSFile $fn $layer $sys} mosaiciraf {LoadMosaicIRAFFile $fn $layer} mecube {LoadMECubeFile $fn} multiframe {LoadMultiFrameFile $fn} rgbimage {LoadRGBImageFile $fn} rgbcube {LoadRGBCubeFile $fn} } FinishLoad } # Support proc OpenDialog {format {layer {}} {mode {}}} { global current global fitsfbox set fn [OpenFileDialog fitsfbox] # just in case (could be invoked via a menu keyshortcut) if {$current(frame) == {}} { CreateFrame } set sys wcs if {$fn != {}} { set ok 1 switch -- $format { mosaicimagewcs {set ok [MosaicWCSDialog sys]} mosaicwcs {set ok [MosaicWCSDialog sys]} } if {$ok} { switch -- $layer { mask {set ok [MaskLoad]} } } if {$ok} { Open $fn $format $layer $mode $sys } } } proc MosaicWCSDialog {varname} { upvar $varname var global ed set w {.wcs} set ed(ok) 0 set ed(sys) wcs set ed(label) WCS DialogCreate $w [msgcat::mc {Load Mosaic}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Select Coordinate System }] ttk::menubutton $f.sys -textvariable ed(label) \ -menu $f.sys.m -width 10 menu $f.sys.m $f.sys.m add radiobutton -label [msgcat::mc {WCS}] \ -variable ed(sys) -value "wcs" -command [list set ed(label) WCS] $f.sys.m add separator foreach l {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} { $f.sys.m add radiobutton -variable ed(sys) \ -label "[msgcat::mc {WCS}] $l" \ -value "wcs$l" \ -command [list set ed(label) "[msgcat::mc {WCS}] $l"] } grid $f.title $f.sys # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { set var $ed(sys) } set rr $ed(ok) unset ed return $rr } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/pagesetup.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000014472 12464211204 017234� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PSPageSetup {} { global ps global ed set ed(ok) 0 array set ed [array get ps] set w {.pagesetup} DialogCreate $w [msgcat::mc {Page Setup}] ed(ok) # Layout set f [ttk::labelframe $w.layout -text {Layout}] ttk::label $f.torient -text [msgcat::mc {Orientation}] ttk::radiobutton $f.portrait -text [msgcat::mc {Portrait}] \ -variable ed(orient) -value portrait ttk::radiobutton $f.landscape -text [msgcat::mc {Landscape}] \ -variable ed(orient) -value landscape ttk::label $f.tscale -text [msgcat::mc {Scale}] ttk::entry $f.scale -textvariable ed(scale) -width 7 ttk::label $f.uscale -text {%} grid $f.torient $f.portrait $f.landscape -padx 2 -pady 2 -sticky w grid $f.tscale $f.scale $f.uscale -padx 2 -pady 2 -sticky w # Page Size set f [ttk::labelframe $w.size -text {Page Size}] ttk::radiobutton $f.letter -text "[msgcat::mc {Letter}](8.5 x 11 in)"\ -variable ed(size) -value letter ttk::radiobutton $f.legal -text "[msgcat::mc {Legal}](8.5 x 14 in)"\ -variable ed(size) -value legal ttk::radiobutton $f.tabloid -text "[msgcat::mc {Tabloid}](11 x 17 in)"\ -variable ed(size) -value tabloid ttk::radiobutton $f.poster -text "[msgcat::mc {Poster}](36 x 48 in)"\ -variable ed(size) -value poster ttk::radiobutton $f.a4 -text {A4(210 x 297 mm)} \ -variable ed(size) -value a4 ttk::radiobutton $f.other -text "[msgcat::mc {Other}] (inches)" \ -variable ed(size) -value other ttk::radiobutton $f.othermm -text "[msgcat::mc {Other}] (mm)" \ -variable ed(size) -value othermm ttk::label $f.title3 -text [msgcat::mc {Width}] ttk::entry $f.width -textvariable ed(width) -width 10 ttk::label $f.title4 -text [msgcat::mc {Height}] ttk::entry $f.height -textvariable ed(height) -width 10 grid $f.letter -padx 2 -pady 2 -sticky w grid $f.legal -padx 2 -pady 2 -sticky w grid $f.tabloid -padx 2 -pady 2 -sticky w grid $f.poster -padx 2 -pady 2 -sticky w grid $f.a4 -padx 2 -pady 2 -sticky w grid $f.other $f.title3 $f.width -padx 2 -pady 2 -sticky w grid $f.othermm $f.title4 $f.height -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini grid $w.layout -sticky news grid $w.size -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok DialogDismiss $w if {$ed(ok)} { array set ps [array get ed] } set rr $ed(ok) unset ed return $rr } proc PrefsDialogPageSetup {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Page Setup}] lappend dprefs(tabs) [ttk::frame $w.pagesetup] # Layout set f [ttk::labelframe $w.pagesetup.layout -text {Layout}] ttk::label $f.torient -text [msgcat::mc {Orientation}] ttk::radiobutton $f.portrait -text [msgcat::mc {Portrait}] \ -variable pps(orient) -value portrait ttk::radiobutton $f.landscape -text [msgcat::mc {Landscape}] \ -variable pps(orient) -value landscape ttk::label $f.tscale -text [msgcat::mc {Scale}] ttk::entry $f.scale -textvariable pps(scale) -width 7 ttk::label $f.uscale -text {%} grid $f.torient $f.portrait $f.landscape -padx 2 -pady 2 -sticky w grid $f.tscale $f.scale $f.uscale -padx 2 -pady 2 -sticky w # Page Size set f [ttk::labelframe $w.pagesetup.size -text {Page Size}] ttk::radiobutton $f.letter -text "[msgcat::mc {Letter}](8.5 x 11 in)"\ -variable pps(size) -value letter ttk::radiobutton $f.legal -text "[msgcat::mc {Legal}](8.5 x 14 in)"\ -variable pps(size) -value legal ttk::radiobutton $f.tabloid -text "[msgcat::mc {Tabloid}](11 x 17 in)"\ -variable pps(size) -value tabloid ttk::radiobutton $f.poster -text "[msgcat::mc {Poster}](36 x 48 in)"\ -variable pps(size) -value poster ttk::radiobutton $f.a4 -text {A4(210 x 297 mm)} \ -variable pps(size) -value a4 ttk::radiobutton $f.other -text "[msgcat::mc {Other}] (inches)" \ -variable pps(size) -value other ttk::radiobutton $f.othermm -text "[msgcat::mc {Other}] (mm)" \ -variable pps(size) -value othermm ttk::label $f.title3 -text [msgcat::mc {Width}] ttk::entry $f.width -textvariable pps(width) -width 10 ttk::label $f.title4 -text [msgcat::mc {Height}] ttk::entry $f.height -textvariable pps(height) -width 10 grid $f.letter -padx 2 -pady 2 -sticky w grid $f.legal -padx 2 -pady 2 -sticky w grid $f.tabloid -padx 2 -pady 2 -sticky w grid $f.poster -padx 2 -pady 2 -sticky w grid $f.a4 -padx 2 -pady 2 -sticky w grid $f.other $f.title3 $f.width -padx 2 -pady 2 -sticky w grid $f.othermm $f.title4 $f.height -padx 2 -pady 2 -sticky w pack $w.pagesetup.layout $w.pagesetup.size \ -side top -fill both -expand true } # Process Cmds proc ProcessPageSetupCmd {varname iname} { upvar $varname var upvar $iname i global ds9 switch $ds9(wm) { x11 {ProcessPSPageSetupCmd var i} aqua { ProcessPSPageSetupCmd var i # MacOSXPageSetup } win32 {Win32PageSetup} } } proc ProcessSendPageSetupCmd {proc id param} { global ds9 switch $ds9(wm) { x11 {ProcessSendPSPageSetupCmd $proc $id $param} aqua {} win32 {} } } proc ProcessPSPageSetupCmd {varname iname} { upvar $varname var upvar $iname i global ps switch -- [string tolower [lindex $var $i]] { orientation - orient {incr i; set ps(orient) [string tolower [lindex $var $i]]} pagescale - scale {incr i; set ps(scale) [lindex $var $i]} pagesize - size {incr i; set ps(size) [string tolower [lindex $var $i]] } } } proc ProcessSendPSPageSetupCmd {proc id param} { global ps switch -- [string tolower $param] { orientation - orient {$proc $id "$ps(orient)\n"} pagescale - scale {$proc $id "$ps(scale)\n"} pagesize - size {$proc $id "$ps(size)\n"} } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/panner.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000014335 12464211204 016520� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CreatePanner {} { global ipanner global ds9 set ds9(panner) [canvas $ds9(panel).pan -width $ipanner(size) \ -height $ipanner(size) \ -relief groove \ -borderwidth 2 \ -highlightthickness 0 \ -insertofftime 0 \ -takefocus 0] $ds9(panner) create panner$ds9(visual) \ -width $ipanner(size) \ -height $ipanner(size) \ -command panner \ -tag panner \ -helvetica $ds9(helvetica) \ -courier $ds9(courier) \ -times $ds9(times) } proc PannerDef {} { global ipanner global ppanner set ipanner(size) 128 # prefs only set ppanner(compass) 1 } proc InitPanner {} { global ds9 global ppanner # other bindings BindEventsPanner bind $ds9(panner) <Tab> [list NextFrame] bind $ds9(panner) <Shift-Tab> [list PrevFrame] switch $ds9(wm) { x11 {bind $ds9(panner) <ISO_Left_Tab> [list PrevFrame]} aqua {} win32 {} } switch $ds9(wm) { x11 - aqua { bind $ds9(panner) <Enter> [list focus $ds9(panner)] bind $ds9(panner) <Leave> [list focus {}] } win32 {} } # compass panner compass $ppanner(compass) } proc BindEventsPanner {} { global ds9 $ds9(panner) bind panner <Enter> [list EnterPanner %x %y] $ds9(panner) bind panner <Leave> [list LeavePanner] $ds9(panner) bind panner <Motion> [list MotionPanner %x %y] $ds9(panner) bind panner <Button-1> [list Button1Panner %x %y] $ds9(panner) bind panner <B1-Motion> [list Motion1Panner %x %y] $ds9(panner) bind panner <ButtonRelease-1> [list Release1Panner %x %y] switch $ds9(wm) { x11 - win32 { $ds9(panner) bind panner <ButtonRelease-2> \ [list Release2Panner %x %y] } aqua { $ds9(panner) bind panner <ButtonRelease-3> \ [list Release2Panner %x %y] } } $ds9(panner) bind panner <Up> [list ArrowKeyPanner 0 -1] $ds9(panner) bind panner <Down> [list ArrowKeyPanner 0 1] $ds9(panner) bind panner <Left> [list ArrowKeyPanner -1 0] $ds9(panner) bind panner <Right> [list ArrowKeyPanner 1 0] } proc UnBindEventsPanner {} { global ds9 $ds9(panner) bind panner <Enter> {} $ds9(panner) bind panner <Leave> {} $ds9(panner) bind panner <Motion> {} $ds9(panner) bind panner <Button-1> {} $ds9(panner) bind panner <B1-Motion> {} $ds9(panner) bind panner <ButtonRelease-1> {} switch $ds9(wm) { x11 - win32 {$ds9(panner) bind panner <ButtonRelease-2> {}} aqua {$ds9(panner) bind panner <ButtonRelease-3> {}} } $ds9(panner) bind panner <Up> {} $ds9(panner) bind panner <Down> {} $ds9(panner) bind panner <Left> {} $ds9(panner) bind panner <Right> {} } proc EnterPanner {x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "EnterPanner" } switch $ds9(wm) { x11 - aqua { focus $ds9(panner) $ds9(panner) focus panner } win32 {} } if {$current(frame) != {}} { EnterInfoBox $current(frame) $x $y panner UpdatePixelTableDialog $current(frame) $x $y panner UpdateGraph $current(frame) $x $y panner } } proc LeavePanner {} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "LeavePanner" } panner highlite off switch $ds9(wm) { x11 - aqua { $ds9(panner) focus {} focus {} } win32 {} } LeaveInfoBox PixelTableClearDialog ClearGraphData } proc MotionPanner {x y} { global current global debug if {$debug(tcl,events)} { puts stderr "MotionPanner" } panner highlite $x $y if {$current(frame) != {}} { UpdateColormapLevelMosaic $current(frame) $x $y panner UpdateInfoBox $current(frame) $x $y panner UpdatePixelTableDialog $current(frame) $x $y panner UpdateGraph $current(frame) $x $y panner } } proc Button1Panner {x y} { global ds9 global debug if {$debug(tcl,events)} { puts stderr "Button1Panner" } panner pan begin $x $y } proc Motion1Panner {x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "Motion1Panner" } panner pan motion $x $y if {$current(frame) != {}} { UpdateColormapLevelMosaic $current(frame) $x $y panner UpdateInfoBox $current(frame) $x $y panner UpdatePixelTableDialog $current(frame) $x $y panner UpdateGraph $current(frame) $x $y panner } } proc Release1Panner {x y} { global ds9 global current global debug if {$debug(tcl,events)} { puts stderr "Release1Panner" } if {$current(frame) != {}} { panner pan end $x $y $current(frame) pan bbox [panner get bbox] UpdateColormapLevelMosaic $current(frame) $x $y panner UpdateInfoBox $current(frame) $x $y panner UpdatePixelTableDialog $current(frame) $x $y panner UpdateGraph $current(frame) $x $y panner LockFrameCurrent UpdateGraphXAxis $current(frame) UpdatePanZoomDialog SAMPSendCoordPointAtSkyCmd $current(frame) } } proc Release2Panner {x y} { global ds9 global current if {$current(frame) != {}} { panner pan to $x $y $current(frame) pan bbox [panner get bbox] UpdateColormapLevelMosaic $current(frame) $x $y panner UpdateInfoBox $current(frame) $x $y panner UpdatePixelTableDialog $current(frame) $x $y panner UpdateGraph $current(frame) $x $y panner LockFrameCurrent UpdateGraphXAxis $current(frame) UpdatePanZoomDialog SAMPSendCoordPointAtSkyCmd $current(frame) } } proc ArrowKeyPanner {x y} { global current panner warp $x $y SAMPSendCoordPointAtSkyCmd $current(frame) } proc PannerBackup {ch} { global ppanner puts $ch "panner compass $ppanner(compass)" } # Prefs proc PrefsDialogPanner {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Panner}] lappend dprefs(tabs) [ttk::frame $w.panner] set f [ttk::labelframe $w.panner.param -text [msgcat::mc {Panner}]] ttk::checkbutton $f.compass \ -text [msgcat::mc {Show Compass}] \ -variable ppanner(compass) -command PrefsPannerCompass grid $f.compass -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } proc PrefsPannerCompass {} { global ppanner panner compass $ppanner(compass) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/panzoom.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000045543 12572112116 016727� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PanZoomDef {} { global panzoom global ipanzoom global ppanzoom global tcl_platform set ipanzoom(top) .pz set ipanzoom(mb) .pzmb set ipanzoom(speed) 512 set ipanzoom(x) 0 set ipanzoom(last) {0 0} set ipanzoom(state) 1 set panzoom(preserve) 0 set panzoom(lock) none # set via wcs() set panzoom(system) wcs set panzoom(sky) fk5 set panzoom(skyformat) degrees set ppanzoom(preserve) $panzoom(preserve) # prefs only set ppanzoom(mode) click set ppanzoom(wheel) 1 set ppanzoom(wheel,factor) 1.2 # special case switch -- $tcl_platform(os) { Darwin { switch [lindex [split $tcl_platform(osVersion) {.}] 0] { 11 {set ppanzoom(wheel,factor) 1.01} } } } } # Pan proc CenterCurrentFrame {} { global current CenterFrame $current(frame) } proc CenterAllFrame {} { global ds9 foreach ff $ds9(frames) { CenterFrame $ff } } proc CenterFrame {which} { if {$which != {}} { $which center UpdatePan $which UpdateZoomMenu } } proc Pan {x y sys {sky {}}} { global current if {$current(frame) != {}} { switch -- $sys { canvas {$current(frame) pan $x $y} default {$current(frame) pan $sys $sky $x $y} } UpdatePan $current(frame) } } proc PanTo {x y sys sky} { global current PanToFrame $current(frame) $x $y $sys $sky } proc PanToFrame {which x y sys sky} { global current if {$which != {}} { $which pan to $sys $sky $x $y UpdatePan $which } } proc PanButton {which x y} { global ppanzoom switch -- $ppanzoom(mode) { click {} drag {$which pan motion begin $x $y} panzoom {} } } proc PanMotion {which x y} { global ppanzoom switch -- $ppanzoom(mode) { click {} drag {$which pan motion $x $y} panzoom {} } } proc PanRelease {which x y} { global panzoom global ipanzoom global ppanzoom global current switch -- $ppanzoom(mode) { click {$which pan to $x $y} drag {$which pan motion end $x $y} panzoom { if {$ipanzoom(last) != "$x $y"} { set ipanzoom(state) 1 } switch -- $ipanzoom(state) { 1 { $which pan to $x $y $which update now set cc [$which get cursor canvas] set xx [expr int([lindex $cc 0])] set yy [expr int([lindex $cc 1])] $which warp to $xx $yy set ipanzoom(last) "$xx $yy" set z [$current(frame) get zoom] if {$z < 2} { set ipanzoom(state) 2 } elseif {$z < 4} { set ipanzoom(state) 3 } elseif {$z < 8} { set ipanzoom(state) 4 } else { set ipanzoom(state) 5 } } 2 { $which zoom to 2 2 about $x $y set ipanzoom(state) 3 } 3 { $which zoom to 4 4 about $x $y set ipanzoom(state) 4 } 4 { $which zoom to 8 8 about $x $y set ipanzoom(state) 5 } 5 { $which zoom to 1 1 about $x $y set ipanzoom(state) 2 } } if {$which == $current(frame)} { set current(zoom) [$current(frame) get zoom] } } } UpdatePan $which } proc PreservePan {} { global current global panzoom if {$current(frame) != {}} { $current(frame) pan preserve $panzoom(preserve) } } proc UpdatePan {which} { LockFrame $which UpdateGraphXAxis $which UpdatePanZoomDialog SAMPSendCoordPointAtSkyCmd $which } # Zoom proc ZoomToFit {} { global current global grid if {$current(frame) != {}} { # we need to update the grid because titles are zoom dependant if {$grid(view) && $grid(type) == "publication"} { # recalculate to make room for labels $current(frame) zoom to fit .8 set current(zoom) [$current(frame) get zoom] } else { $current(frame) zoom to fit set current(zoom) [$current(frame) get zoom] } UpdateZoom $current(frame) } } proc ChangeZoom {} { global current if {$current(frame) != {}} { $current(frame) zoom to $current(zoom) UpdateZoom $current(frame) } } proc Zoom {zx zy} { global current if {$current(frame) != {}} { ZoomFrame $current(frame) $zx $zy } } proc ZoomFrame {which zx zy} { global current $which zoom $zx $zy if {$which == $current(frame)} { set current(zoom) [$current(frame) get zoom] } UpdateZoom $which } proc ZoomButton {which x y} { global current $which zoom 2 2 about $x $y if {$current(frame) == $which} { set current(zoom) [$current(frame) get zoom] } UpdateZoom $which } proc ZoomShift {which} { global current $which zoom .5 .5 if {$current(frame) == $which} { set current(zoom) [$current(frame) get zoom] } UpdateZoom $which } proc UpdateZoom {which} { LockFrame $which UpdateGraphXAxis $which UpdatePanZoomDialog GridUpdateZoom RefreshInfoBox $which } # Orient proc ChangeOrient {} { global current if {$current(frame) != {}} { $current(frame) orient $current(orient) UpdateRotate $current(frame) } } # Rotate proc Rotate {value} { global current if {$current(frame) != {}} { $current(frame) rotate $value set current(rotate) [$current(frame) get rotate] UpdateRotate $current(frame) } } proc ChangeRotate {} { global current if {$current(frame) != {}} { $current(frame) rotate to $current(rotate) UpdateRotate $current(frame) } } proc RotateButton {which x y} { global ipanzoom $which rotate motion begin set ipanzoom(x) $x } proc RotateMotion {which x y} { global current global ipanzoom global icursor $which rotate motion [expr double($ipanzoom(x)-$x)/$ipanzoom(speed) * 180.] if {$current(frame) == $which} { set current(rotate) [$which get rotate fixed] } RefreshInfoBox $which } proc RotateRelease {which x y} { global current $which rotate motion end if {$current(frame) == $which} { set current(rotate) [$which get rotate fixed] } UpdateRotate $which } proc UpdateRotate {which} { LockFrame $which UpdateGraphXAxis $which UpdatePanZoomDialog RefreshInfoBox $which } proc PanZoomDialog {} { global panzoom global ipanzoom global dpanzoom global ds9 global current # see if we already have a window visible if {[winfo exists $ipanzoom(top)]} { raise $ipanzoom(top) return } # create the window set w $ipanzoom(top) set mb $ipanzoom(mb) Toplevel $w $mb 6 [msgcat::mc {Pan Zoom Rotate Parameters}] \ PanZoomDestroyDialog # for CoordMenuButton set panzoom(frame) $current(frame) $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Pan}] -menu $mb.pan $mb add cascade -label [msgcat::mc {Zoom}] -menu $mb.zoom $mb add cascade -label [msgcat::mc {Orientation}] -menu $mb.orient $mb add cascade -label [msgcat::mc {Rotate}] -menu $mb.rotate menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command PanZoomApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command PanZoomDestroyDialog EditMenu $mb ipanzoom menu $mb.pan $mb.pan add command -label [msgcat::mc {Center Image}] \ -command CenterCurrentFrame $mb.pan add checkbutton -label [msgcat::mc {Align}] \ -variable current(align) -command AlignWCSFrame menu $mb.zoom $mb.zoom add command -label [msgcat::mc {Zoom In}] -command {Zoom 2 2} $mb.zoom add command -label [msgcat::mc {Zoom Out}] -command {Zoom .5 .5} $mb.zoom add command -label [msgcat::mc {Zoom Fit}] -command ZoomToFit $mb.zoom add separator $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/32" \ -variable current(zoom) -value { 0.03125 0.03125 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/16" \ -variable current(zoom) -value { 0.0625 0.0625 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/8" \ -variable current(zoom) -value { 0.125 0.125 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/4" \ -variable current(zoom) -value { 0.25 0.25 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1/2" \ -variable current(zoom) -value { 0.5 0.5 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 1" \ -variable current(zoom) -value { 1 1 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 2" \ -variable current(zoom) -value { 2 2 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 4" \ -variable current(zoom) -value { 4 4 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 8" \ -variable current(zoom) -value { 8 8 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 16" \ -variable current(zoom) -value { 16 16 } -command ChangeZoom $mb.zoom add radiobutton -label "[msgcat::mc {Zoom}] 32" \ -variable current(zoom) -value { 32 32 } -command ChangeZoom menu $mb.orient $mb.orient add radiobutton -label [msgcat::mc {None}] \ -variable current(orient) -value none -command ChangeOrient $mb.orient add radiobutton -label "[msgcat::mc {Invert}] X" \ -variable current(orient) -value x -command ChangeOrient $mb.orient add radiobutton -label "[msgcat::mc {Invert}] Y" \ -variable current(orient) -value y -command ChangeOrient $mb.orient add radiobutton -label "[msgcat::mc {Invert}] XY" \ -variable current(orient) -value xy -command ChangeOrient menu $mb.rotate $mb.rotate add radiobutton -label "0 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 0 -command ChangeRotate $mb.rotate add radiobutton -label "90 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 90 -command ChangeRotate $mb.rotate add radiobutton -label "180 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 180 -command ChangeRotate $mb.rotate add radiobutton -label "270 [msgcat::mc {Degrees}]" \ -variable current(rotate) -value 270 -command ChangeRotate # Param set f [ttk::frame $w.param] ttk::label $f.zoomtitle -text [msgcat::mc {Zoom}] ttk::entry $f.zoomx -textvariable dpanzoom(zoom,x) -width 14 ttk::entry $f.zoomy -textvariable dpanzoom(zoom,y) -width 14 ttk::label $f.rottitle -text [msgcat::mc {Rotate}] ttk::entry $f.rotvalue -textvariable dpanzoom(rotate) -width 14 ttk::label $f.rottitle2 -text [msgcat::mc {Degrees}] ttk::label $f.pantitle -text [msgcat::mc {Pan}] ttk::entry $f.panx -textvariable dpanzoom(x) -width 14 ttk::entry $f.pany -textvariable dpanzoom(y) -width 14 set dpanzoom(cb) $f.pansystem CoordMenuButton $dpanzoom(cb) panzoom system 1 sky skyformat \ UpdatePanZoomDialog grid $f.zoomtitle $f.zoomx $f.zoomy -padx 2 -pady 2 grid $f.rottitle $f.rotvalue $f.rottitle2 -padx 2 -pady 2 -sticky w grid $f.pantitle $f.panx $f.pany $f.pansystem -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command PanZoomApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] \ -command PanZoomDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true $w.param.zoomx select range 0 end UpdatePanZoomDialog } proc PanZoomApplyDialog {} { global panzoom global ipanzoom global dpanzoom global current if {$current(frame) != {}} { set current(zoom) "$dpanzoom(zoom,x) $dpanzoom(zoom,y)" set current(rotate) $dpanzoom(rotate) $current(frame) zoom to $current(zoom) about \ $panzoom(system) $panzoom(sky) $dpanzoom(x) $dpanzoom(y) $current(frame) rotate to $current(rotate) LockFrameCurrent UpdateGraphXAxis $current(frame) UpdatePanZoomDialog GridUpdateZoom RefreshInfoBox $current(frame) UpdateZoomMenu SAMPSendCoordPointAtSkyCmd $current(frame) } } proc PanZoomDestroyDialog {} { global ipanzoom global dpanzoom if {[winfo exists $ipanzoom(top)]} { destroy $ipanzoom(top) destroy $ipanzoom(mb) } unset dpanzoom } proc UpdatePanZoomMenu {} { # can be changed by wcs SetCoordSystem panzoom system sky skyformat } proc UpdatePanZoomDialog {} { global panzoom global ipanzoom global dpanzoom global current global debug if {$debug(tcl,update)} { puts stderr "UpdatePanZoomDialog" } if {![winfo exists $ipanzoom(top)]} { return } if {$current(frame) != {}} { set panzoom(frame) $current(frame) if {[$current(frame) has fits]} { # now make sure we have the coord systems AdjustCoordSystem panzoom system CoordMenuEnable $dpanzoom(cb).menu panzoom system 1 sky skyformat CoordMenuButtonCmd panzoom system sky {} } else { CoordMenuReset $dpanzoom(cb).menu panzoom system 1 sky skyformat } } if {$current(frame) != {}} { set zz [$current(frame) get zoom] set dpanzoom(zoom,x) [lindex $zz 0] set dpanzoom(zoom,y) [lindex $zz 1] set dpanzoom(rotate) [$current(frame) get rotate] set coord [$current(frame) get cursor $panzoom(system) \ $panzoom(sky) $panzoom(skyformat)] set dpanzoom(x) [lindex $coord 0] set dpanzoom(y) [lindex $coord 1] } else { set dpanzoom(zoom,x) {} set dpanzoom(zoom,y) {} set dpanzoom(rotate) {} set dpanzoom(x) {} set dpanzoom(y) {} } } # Other proc AlignWCSFrame {} { global current global ds9 if {$current(frame) != {}} { $current(frame) wcs align $current(align) LockFrameCurrent UpdateGraphXAxis $current(frame) UpdatePanZoomDialog } } proc MatchFrameCurrent {sys} { global current if {$current(frame) != {}} { MatchFrame $current(frame) $sys } } proc MatchFrame {which sys} { global ds9 global current # NO-make sure matrices have been updated # really messes up mousewheel events, just assume all is good # RealizeDS9 switch -- $sys { image - physical - amplifier - detector { set current(align) 0 $which wcs align 0 set pan [$which get cursor $sys scientific] set zoom [$which get zoom] set rotate [$which get rotate] set orient [$which get orient] foreach ff $ds9(frames) { if {$ff != $which} { $ff pan to $sys $pan $ff zoom to $zoom $ff rotate to $rotate $ff orient $orient $ff wcs align 0 } } } wcs { set www [$which get wcs] set sys [lindex $www 0] set sky [lindex $www 1] if {[$which has wcs $sys]} { set current(align) 1 $which wcs align 1 set align [$which get wcs align pointer] set pan [$which get cursor $sys FK5 scientific] set zoom [$which get zoom] set rotate [$which get rotate] set orient [$which get orient] foreach ff $ds9(frames) { if {$ff != $which} { if {[$ff has wcs $sys]} { $ff pan to $sys FK5 $pan $ff zoom to $zoom $ff rotate to $rotate $ff orient $orient $ff wcs align $align } } } } } } } proc LockFrameCurrent {} { global current if {$current(frame) != {}} { LockFrame $current(frame) } } proc LockFrame {which} { global panzoom switch -- $panzoom(lock) { none {} default {MatchFrame $which $panzoom(lock)} } } # Backup proc PanZoomBackup {ch which} { puts $ch "$which pan preserve [$which get pan preserve]" puts $ch "$which pan to physical [$which get cursor physical]" # this must come after pan to puts $ch "$which 3d view point [$which get 3d view point]" puts $ch "$which zoom to [$which get zoom]" puts $ch "$which rotate to [$which get rotate]" puts $ch "$which orient [$which get orient]" puts $ch "$which wcs align [$which get wcs align]" } # Process Cmds proc ProcessPanCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 switch -- [string tolower [lindex $var $i]] { open {PanZoomDialog} close {PanZoomDestroyDialog} to { set x [lindex $var [expr $i+1]] set y [lindex $var [expr $i+2]] set sys [lindex $var [expr $i+3]] set sky [lindex $var [expr $i+4]] set format {} incr i 2 incr i [FixSpec sys sky format physical fk5 degrees] PanTo $x $y $sys $sky } default { set x [lindex $var [expr $i+0]] set y [lindex $var [expr $i+1]] set sys [lindex $var [expr $i+2]] set sky [lindex $var [expr $i+3]] set format {} incr i 1 incr i [FixSpec sys sky format physical fk5 degrees] Pan $x $y $sys $sky } } } proc ProcessSendPanCmd {proc id param} { global current set sys [lindex $param 0] set sky [lindex $param 1] set format [lindex $param 2] FixSpec sys sky format physical fk5 degrees if {$current(frame) != {}} { $proc $id "[$current(frame) get cursor $sys $sky $format]\n" } } proc ProcessZoomCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global current switch -- [string tolower [lindex $var $i]] { open {PanZoomDialog} close {PanZoomDestroyDialog} in {Zoom 2 2} out {Zoom .5 .5} to { switch -- [string tolower [lindex $var [expr $i+1]]] { fit { ZoomToFit incr i } default { set z1 [lindex $var [expr $i+1]] set z2 [lindex $var [expr $i+2]] if {[string is double $z2] && $z2 != {}} { set current(zoom) " $z1 $z2 " incr i 2 } else { set current(zoom) " $z1 $z1 " incr i } ChangeZoom } } } default { set z1 [lindex $var $i] set z2 [lindex $var [expr $i+1]] if {[string is double $z2] && $z2 != {}} { Zoom $z1 $z2 incr i } else { Zoom $z1 $z1 } } } } proc ProcessSendZoomCmd {proc id param} { global current set z1 [lindex $current(zoom) 0] set z2 [lindex $current(zoom) 1] if {$z1 != $z2} { $proc $id "$current(zoom)\n" } else { $proc $id "$z1\n" } } proc ProcessOrientCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global current switch -- [string tolower [lindex $var $i]] { open {PanZoomDialog} close {PanZoomDestroyDialog} default { set current(orient) [string tolower [lindex $var $i]] ChangeOrient } } } proc ProcessSendOrientCmd {proc id param} { global current $proc $id "$current(orient)\n" } proc ProcessRotateCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 global current switch -- [string tolower [lindex $var $i]] { open {PanZoomDialog} close {PanZoomDestroyDialog} to { set current(rotate) [lindex $var [expr $i+1]] ChangeRotate incr i } default {Rotate [lindex $var $i]} } } proc ProcessSendRotateCmd {proc id param} { global current $proc $id "$current(rotate)\n" } �������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/photo.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000013626 12464211204 016370� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ImportPhotoFile {fn mode} { global loadParam set loadParam(file,type) photo set loadParam(file,mode) $mode set loadParam(load,type) photo # find stdin if {[string range $fn 0 4] == "stdin" || [string range $fn 0 4] == "STDIN" || [string range $fn 0 0] == "-"} { fconfigure stdin -translation binary -encoding binary if {[catch {image create photo -data [read -nonewline stdin]} ph]} { Error [msgcat::mc {An error has occurred while reading image.}] return } set loadParam(file,name) stdin } else { if {[catch {image create photo -file $fn} ph]} { Error [msgcat::mc {An error has occurred while reading image.}] return } set loadParam(file,name) $fn } set loadParam(var,name) $ph # mask not supported set loadParam(load,layer) {} ProcessLoad image delete $ph } proc ImportPhotoAlloc {path fn mode} { global loadParam set loadParam(file,type) photo set loadParam(file,mode) $mode set loadParam(load,type) photo if {[catch {image create photo -file $path} ph]} { Error [msgcat::mc {An error has occurred while reading image.}] return } set loadParam(file,name) $fn set loadParam(var,name) $ph # mask not supported set loadParam(load,layer) {} ProcessLoad image delete $ph } proc ImportPhotoSocket {ch fn mode} { global loadParam set loadParam(file,type) photo set loadParam(file,mode) $mode set loadParam(load,type) photo set loadParam(file,name) $fn fconfigure $ch -translation binary -encoding binary if {[catch {image create photo -data [read $ch]} ph]} { Error [msgcat::mc {An error has occurred while reading image.}] return 0 } set loadParam(var,name) $ph # mask not supported set loadParam(load,layer) {} set rr [ProcessLoad 0] image delete $ph return $rr } proc ExportPhotoFile {fn format opt} { global export global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } if {[catch {image create photo} ph]} { Error [msgcat::mc {An error has occurred while creating image.}] return } $current(frame) save photo $ph set ff $format switch -- $format { jpeg { if {$opt == {}} { set opt $export(jpeg,quality) } set ff [list $format -quality $opt] } tiff { if {$opt == {}} { set opt $export(tiff,compress) } set ff [list $format -compression $opt] } } if {[catch {$ph write $fn -format $ff}]} { Error [msgcat::mc {An error has occurred while writing image.}] } image delete $ph } proc ExportPhotoSocket {ch format opt} { global export global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } if {[catch {image create photo} ph]} { Error [msgcat::mc {An error has occurred while creating image.}] return } $current(frame) save photo $ph fconfigure $ch -translation binary -encoding binary set ff $format switch -- $format { jpeg { if {$opt == {}} { set opt $export(jpeg,quality) } set ff [list $format -quality $opt] } tiff { if {$opt == {}} { set opt $export(tiff,compress) } set ff [list $format -compression $opt] } } if {[catch {$ph data -format $ff} data]} { Error [msgcat::mc {An error has occurred while writing image.}] return } puts -nonewline $ch [base64::decode $data] image delete $ph } # Process Cmds proc ProcessGIFCmd {varname iname ch fn} { upvar $varname var upvar $iname i ProcessPhotoCmd $varname $iname $ch $fn } proc ProcessJPEGCmd {varname iname ch fn} { upvar $varname var upvar $iname i ProcessPhotoCmd $varname $iname $ch $fn } proc ProcessPNGCmd {varname iname ch fn} { upvar $varname var upvar $iname i ProcessPhotoCmd $varname $iname $ch $fn } proc ProcessTIFFCmd {varname iname ch fn} { upvar $varname var upvar $iname i ProcessPhotoCmd $varname $iname $ch $fn } proc ProcessPhotoCmd {varname iname ch fn} { upvar 2 $varname var upvar 2 $iname i global loadParam global current set mode {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i # not supported } slice { incr i set mode slice } } set param [lindex $var $i] StartLoad if {$ch != {}} { # xpa global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS { if {![ImportPhotoSocket $ch $param $mode]} { InitError xpa ImportPhotoFile $param $mode } } {Windows NT} {ImportPhotoFile $param $mode} } } else { # comm if {$fn != {}} { ImportPhotoAlloc $fn $param $mode } else { ImportPhotoFile $param $mode } } FinishLoad } proc ProcessSendGIFCmd {proc id param ch fn} { global current ProcessSendPhotoCmd gif $proc $id $param $ch $fn } proc ProcessSendJPEGCmd {proc id param ch fn} { global current ProcessSendPhotoCmd jpeg $proc $id $param $ch $fn } proc ProcessSendPNGCmd {proc id param ch fn} { global current ProcessSendPhotoCmd png $proc $id $param $ch $fn } proc ProcessSendTIFFCmd {proc id param ch fn} { global current ProcessSendPhotoCmd tiff $proc $id $param $ch $fn } proc ProcessSendPhotoCmd {format proc id param ch fn} { global current global export if {$current(frame) == {}} { return } set opt [string tolower [lindex $param 0]] if {$ch != {}} { # xpa global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ExportPhotoSocket $ch $format $opt} {Windows NT} {} } } elseif {$fn != {}} { # comm ExportPhotoFile $fn $format $opt $proc $id {} $fn } } ����������������������������������������������������������������������������������������������������������saods9/ds9/library/pixel.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000014756 12464211204 016365� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PixelDef {} { global pixel global ipixel global dpixel global ppixel set ipixel(top) .pixel set ipixel(mb) .pixelmb set ipixel(max) 13 set pixel(size) 5 array set ppixel [array get pixel] set dpixel(copy) {} set dpixel(tbl) {} } proc UpdatePixelTableDialog {which x y sys} { global pixel global ipixel global dpixel if {[winfo exists $ipixel(top)]} { $which get pixel table $sys $x $y $pixel(size) $pixel(size) dpixel } } proc PixelTableDialog {} { global pixel global ipixel global dpixel global ds9 if {[winfo exists $ipixel(top)]} { raise $ipixel(top) return } # create the pixel table window set w $ipixel(top) set mb $ipixel(mb) Toplevel $w $mb 6 [msgcat::mc {Pixel Table}] PixelTableDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Size}] -menu $mb.size menu $mb.file $mb.file add command -label "[msgcat::mc {Save}]..." \ -command PixelTableSaveDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command PixelTableDestroyDialog menu $mb.edit $mb.edit add command -label [msgcat::mc {Cut}] \ -state disabled -accelerator "${ds9(ctrl)}X" $mb.edit add command -label [msgcat::mc {Copy}] \ -command PixelTableCopyDialog -accelerator "${ds9(ctrl)}C" $mb.edit add command -label [msgcat::mc {Paste}] \ -state disabled -accelerator "${ds9(ctrl)}V" menu $mb.size for {set ii 3} {$ii<=$ipixel(max)} {incr ii 2} { $mb.size add radiobutton -label "${ii}x${ii}" -variable pixel(size) \ -value $ii -command PixelTableConfigure } set f [ttk::frame $w.tbl] set dpixel(tbl) [table $f.t \ -state disabled \ -anchor w \ -font [font actual TkDefaultFont] \ -variable dpixel \ -usecommand 0 \ -maxwidth 1200 \ ] $dpixel(tbl) tag col coord 0 $dpixel(tbl) tag row coord 0 $dpixel(tbl) tag configure coord -foreground blue $dpixel(tbl) tag configure center -foreground red grid $f.t -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 0 -weight 1 set f [ttk::frame $w.buttons] ttk::button $w.buttons.close -text [msgcat::mc {Close}] \ -command PixelTableDestroyDialog pack $w.buttons.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.tbl -side top -fill both -expand true selection handle $w PixelTableExportSelection PixelTableConfigure # dummy info for {set jj 0} {$jj<=$pixel(size)} {incr jj} { for {set ii 0} {$ii<=$pixel(size)} {incr ii} { set dpixel($ii,$jj) {} } } } proc PixelTableDestroyDialog {} { global ipixel global dpixel if {[winfo exists $ipixel(top)]} { destroy $ipixel(top) destroy $ipixel(mb) } if {[info exists dpixel]} { unset dpixel } } proc PixelTableCopyDialog {} { global ipixel global dpixel set dpixel(copy) [PixelTableRender] selection own -command PixelTableLostSelection $ipixel(top) clipboard clear clipboard append $dpixel(copy) } proc PixelTableClearDialog {} { global pixel global ipixel global dpixel global dpixel if {[winfo exists $ipixel(top)]} { for {set jj 0} {$jj<=$pixel(size)} {incr jj} { for {set ii 0} {$ii<=$pixel(size)} {incr ii} { set dpixel($ii,$jj) {} } } } } proc PixelTableSaveDialog {} { set filename [SaveFileDialog pixelfbox] if {$filename != {}} { set file [open $filename w] puts -nonewline $file [PixelTableRender] close $file } } # support proc PixelTableConfigure {} { global pixel global ipixel global dpixel set ss [expr $pixel(size)+1] $dpixel(tbl) configure -rows $ss -cols $ss for {set ii 1} {$ii<=$ipixel(max)} {incr ii} { $dpixel(tbl) tag cell {} $ii,$ii } set hh [expr int($ss/2.)] $dpixel(tbl) tag cell center $hh,$hh } proc PixelTableRender {} { global pixel global dpixel set rr {} # col header append rr " " for {set ii 1} {$ii<=$pixel(size)} {incr ii} { set msg [format "%12s" $dpixel(0,${ii})] append rr "$msg" } append rr "\n" append rr " " for {set ii 1} {$ii<=$pixel(size)} {incr ii} { append rr " -----------" } append rr "\n" # body for {set jj 1} {$jj<=$pixel(size)} {incr jj} { set msg [format "%10s" $dpixel(${jj},0)] append rr "$msg |" for {set ii 1} {$ii<=$pixel(size)} {incr ii} { set msg [format "%12.11s" $dpixel($jj,$ii)] append rr "$msg" } append rr "\n" } return $rr } proc PixelTableExportSelection {offset bytes} { global dpixel if {$dpixel(copy) != {}} { return [string range $dpixel(copy) $offset [expr $offset+$bytes]] } } proc PixelTableLostSelection {} { global dpixel set dpixel(copy) {} } proc PrefsDialogPixelTable {} { global dprefs global ppixel set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Pixel Table}] lappend dprefs(tabs) [ttk::frame $w.pixel] set f [ttk::labelframe $w.pixel.param -text [msgcat::mc {Pixel Table}]] ttk::label $f.tsize -text [msgcat::mc {Size}] PrefsDialogPixelTableButtonCmd $ppixel(size) ttk::menubutton $f.size -textvariable dprefs(pixeltable,msg) \ -menu $f.size.menu global ipixel set m $f.size.menu menu $m for {set ii 3} {$ii<=$ipixel(max)} {incr ii 2} { $m add radiobutton -label "${ii}x${ii}" -variable ppixel(size) \ -value $ii -command [list PrefsDialogPixelTableButtonCmd $ii] } grid $f.tsize $f.size -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } proc PrefsDialogPixelTableButtonCmd {ii} { global dprefs global pixel set dprefs(pixeltable,msg) "${ii}x${ii}" } proc ProcessPixelTableCmd {varname iname} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { open - yes - true - on - 1 {PixelTableDialog} close - no - false - off - 0 {PixelTableDestroyDialog} default { PixelTableDialog incr i -1 } } } proc ProcessSendPixelTableCmd {proc id param sock fn} { PixelTableDialog ProcessSend $proc $id $sock $fn {.txt} [PixelTableRender] } ������������������saods9/ds9/library/plot.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000103026 12527716223 016222� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PlotDef {} { global pap global iap set iap(tt) {ap} set iap(windows) {} set iap(unique) 0 set pap(graph,title) {} set pap(graph,title,family) helvetica set pap(graph,title,size) 12 set pap(graph,title,weight) normal set pap(graph,title,slant) roman set pap(legend) 0 set pap(legend,title) Legend set pap(legend,position) right set pap(legend,title,family) helvetica set pap(legend,title,size) 10 set pap(legend,title,weight) normal set pap(legend,title,slant) roman set pap(legend,font,family) helvetica set pap(legend,font,size) 9 set pap(legend,font,weight) normal set pap(legend,font,slant) roman set pap(axis,x,title) {} set pap(axis,x,grid) 1 set pap(axis,x,log) 0 set pap(axis,x,flip) 0 set pap(axis,x,auto) 1 set pap(axis,x,min) {} set pap(axis,x,max) {} set pap(axis,x,format) {} set pap(axis,y,title) {} set pap(axis,y,grid) 1 set pap(axis,y,log) 0 set pap(axis,y,flip) 0 set pap(axis,y,auto) 1 set pap(axis,y,min) {} set pap(axis,y,max) {} set pap(axis,y,format) {} set pap(axis,title,family) helvetica set pap(axis,title,size) 9 set pap(axis,title,weight) normal set pap(axis,title,slant) roman set pap(axis,font,family) helvetica set pap(axis,font,size) 9 set pap(axis,font,weight) normal set pap(axis,font,slant) roman set pap(show) 1 set pap(shape,symbol) none set pap(shape,fill) 1 set pap(shape,color) red set pap(smooth) linear set pap(color) black set pap(fill) 0 set pap(fill,color) black set pap(width) 1 set pap(dash) 0 set pap(error) 1 set pap(error,cap) 0 set pap(error,color) red set pap(error,width) 1 set pap(bar,relief) raised set pap(bar,mode) normal } proc PlotAxisFormat {varname axis w nn} { upvar #0 $varname var global $varname return [format $var(axis,$axis,format) $nn] } proc PlotClearData {varname} { upvar #0 $varname var global $varname global ds9 if {$var(data,total) == 0} { return } # first set can be external set clear $var(1,manage) for {set nn 1} {$nn<=$var(data,total)} {incr nn} { if {$var($nn,manage)} { # delete elements foreach el [$var(graph) element names] { set f [split $el -] if {[lindex $f 1] == $nn} { $var(graph) element delete $el } } # destroy vectors blt::vector destroy $var($nn,xdata) $var($nn,ydata) switch $var($nn,dim) { xy {} xyex {blt::vector destroy $var($nn,xedata)} xyey {blt::vector destroy $var($nn,yedata)} xyexey {blt::vector destroy $var($nn,xedata) $var($nn,yedata)} } foreach x [array names $varname] { set f [split $x ,] if {([lindex $f 0] == $nn)} { unset ${varname}($x) } } } } if {$clear} { set var(data,total) 0 set var(data,current) 0 set var(name) {} set var(xdata) {} set var(ydata) {} set var(xedata) {} set var(yedata) {} # reset other variables set var(axis,x,auto) 1 set var(axis,x,min) {} set var(axis,x,max) {} set var(axis,x,format) {} set var(axis,y,auto) 1 set var(axis,y,min) {} set var(axis,y,max) {} set var(axis,y,format) {} $var(mb).select delete $ds9(menu,start) end $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } else { set var(data,total) 1 set var(data,current) 1 $var(mb).select delete [expr $ds9(menu,start)+1] end PlotCurrentData $varname $var(proc,updategraph) $varname } } proc PlotCurrentData {varname} { upvar #0 $varname var global $varname if {$var(data,total) > 0} { set nn $var(data,current) set var(manage) $var($nn,manage) set var(dim) $var($nn,dim) set var(xdata) $var($nn,xdata) set var(ydata) $var($nn,ydata) set var(xedata) $var($nn,xedata) set var(yedata) $var($nn,yedata) PlotSetVar $varname $nn } PlotStats $varname PlotList $varname } proc PlotDataSet {varname dim data} { upvar #0 $varname var global $varname switch -- $dim { 4 { # first data set PlotDataSetOne $varname "4.1" $data # set color set cc $var(color) set var(color) [PlotNextColor $var(color)] # second data set PlotDataSetOne $varname "4.2" $data set var(color) $cc } 5 { # first data set PlotDataSetOne $varname "5.1" $data # set color set cc $var(color) set var(color) [PlotNextColor $var(color)] # second data set PlotDataSetOne $varname "5.2" $data set var(color) $cc } default {PlotDataSetOne $varname $dim $data} } } proc PlotDataSetOne {varname dim data} { upvar #0 $varname var global $varname # look for no data if {[string length $data] == 0} { return } # total length set ll [llength $data] set ii 0 while {$ii<$ll} { # incr count incr ${varname}(data,total) set nn $var(data,total) set var(data,current) $nn # new vector names set xdata ap${varname}xx${nn} set ydata ap${varname}yy${nn} set xedata ap${varname}xe${nn} set yedata ap${varname}ye${nn} # basics xy set var(manage) 1 set var(name) "Dataset $nn" set var(xdata) $xdata set var(ydata) $ydata global $var(xdata) $var(ydata) blt::vector create $var(xdata) $var(ydata) # substitute all separtors regsub -all {[\n\r\t, ]+} $data { } data # remove all non-numeric data regsub -all {[^0-9.e\- ]+} $data {} data set ox [lindex $data $ii] set x {} set y {} set xe {} set ye {} switch -- $dim { 2 - xy { set var(dim) xy set var(xedata) {} set var(yedata) {} for {} {$ii<$ll} {incr ii 2} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] } } $var(xdata) set $x $var(ydata) set $y } xyex { set var(dim) xyex set var(xedata) $xedata set var(yedata) {} global $var(xedata) blt::vector create $var(xedata) for {} {$ii<$ll} {incr ii 3} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend xe [lindex $data [expr $ii+2]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend xe [lindex $data [expr $ii+2]] } } $var(xdata) set $x $var(ydata) set $y $var(xedata) set $xe } 3 - xyey { set var(dim) xyey set var(xedata) {} set var(yedata) $yedata global $var(yedata) blt::vector create $var(yedata) for {} {$ii<$ll} {incr ii 3} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } } $var(xdata) set $x $var(ydata) set $y $var(yedata) set $ye } xyexey { set var(dim) xyexey set var(xedata) $xedata set var(yedata) $yedata global $var(xedata) $var(yedata) blt::vector create $var(xedata) $var(yedata) for {} {$ii<$ll} {incr ii 4} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend xe [lindex $data [expr $ii+2]] lappend ye [lindex $data [expr $ii+3]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend xe [lindex $data [expr $ii+2]] lappend ye [lindex $data [expr $ii+3]] } } $var(xdata) set $x $var(ydata) set $y $var(xedata) set $xe $var(yedata) set $ye } 4.1 { set var(dim) xyey set var(xedata) {} set var(yedata) $yedata global $var(yedata) blt::vector create $var(yedata) for {} {$ii<$ll} {incr ii 4} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } } $var(xdata) set $x $var(ydata) set $y $var(yedata) set $ye } 4.2 { set var(dim) xy set var(xedata) {} set var(yedata) {} for {} {$ii<$ll} {incr ii 4} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+3]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+3]] } } $var(xdata) set $x $var(ydata) set $y } 5.1 { set var(dim) xyey set var(xedata) {} set var(yedata) $yedata global $var(yedata) blt::vector create $var(yedata) for {} {$ii<$ll} {incr ii 5} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+1]] lappend ye [lindex $data [expr $ii+2]] } } $var(xdata) set $x $var(ydata) set $y $var(yedata) set $ye } 5.2 { set var(dim) xyey set var(xedata) {} set var(yedata) $yedata global $var(yedata) blt::vector create $var(yedata) for {} {$ii<$ll} {incr ii 5} { set tx [lindex $data $ii] if {$var(seq)} { if {$ox<=$tx} { set ox $tx lappend x $tx lappend y [lindex $data [expr $ii+3]] lappend ye [lindex $data [expr $ii+4]] } else { break } } else { lappend x $tx lappend y [lindex $data [expr $ii+3]] lappend ye [lindex $data [expr $ii+4]] } } $var(xdata) set $x $var(ydata) set $y $var(yedata) set $ye } } set var($nn,manage) 1 set var($nn,dim) $var(dim) set var($nn,xdata) $var(xdata) set var($nn,ydata) $var(ydata) set var($nn,xedata) $var(xedata) set var($nn,yedata) $var(yedata) PlotGetVar $varname $nn # update data set menu $var(mb).select add radiobutton -label "$var(name)" \ -variable ${varname}(data,current) -value $nn \ -command [list PlotCurrentData $varname] PlotCreateElement $varname $var(proc,updateelement) $varname } } proc PlotDupData {varname mm} { upvar #0 $varname var global $varname if {$var(data,total) == 0} { return } # incr count incr ${varname}(data,total) set nn $var(data,total) set pp [expr $nn-1] # new vector names set var($nn,name) "Dataset $nn" set var($nn,xdata) ap${varname}xx${nn} set var($nn,ydata) ap${varname}yy${nn} set var($nn,xedata) ap${varname}xe${nn} set var($nn,yedata) ap${varname}ye${nn} global $var($mm,xdata) $var($mm,ydata) $var($mm,xedata) $var($mm,yedata) global $var($nn,xdata) $var($nn,ydata) $var($nn,xedata) $var($nn,yedata) $var($mm,xdata) dup $var($nn,xdata) $var($mm,ydata) dup $var($nn,ydata) if {$var($mm,xedata) != {}} { $var($mm,xedata) dup $var($nn,xedata) } else { set var($nn,xedata) {} } if {$var($mm,yedata) != {}} { $var($mm,yedata) dup $var($nn,yedata) } else { set var($nn,yedata) {} } set var($nn,manage) 1 set var($nn,dim) $var($mm,dim) set var($nn,show) $var($mm,show) set var($nn,shape,symbol) $var($mm,shape,symbol) set var($nn,shape,fill) $var($mm,shape,fill) set var($nn,shape,color) $var($mm,shape,color) set var($nn,smooth) $var($mm,smooth) set var($nn,color) [PlotNextColor $var($mm,color)] set var($nn,fill) $var($mm,fill) set var($nn,fill,color) [PlotNextColor $var($mm,fill,color)] set var($nn,width) $var($mm,width) set var($nn,dash) $var($mm,dash) set var($nn,error) $var($mm,error) set var($nn,error,cap) $var($mm,error,cap) set var($nn,error,color) $var($mm,error,color) set var($nn,error,width) $var($mm,error,width) set var($nn,bar,relief) $var($mm,bar,relief) # update data set menu $var(mb).select add radiobutton -label "$var($nn,name)" \ -variable ${varname}(data,current) -value $nn \ -command [list PlotCurrentData $varname] # make current set var(data,current) $nn set var(manage) $var($nn,manage) set var(dim) $var($nn,dim) set var(xdata) $var($nn,xdata) set var(ydata) $var($nn,ydata) set var(xedata) $var($nn,xedata) set var(yedata) $var($nn,yedata) PlotSetVar $varname $nn PlotCreateElement $varname $var(proc,updateelement) $varname $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } proc PlotDestroy {varname} { upvar #0 $varname var global $varname global iap # see if it still is around if {![PlotPing $varname]} { return } for {set nn 1} {$nn<=$var(data,total)} {incr nn} { switch $var($nn,dim) { xy { blt::vector destroy $var($nn,xdata) $var($nn,ydata) } xyex { blt::vector destroy $var($nn,xdata) $var($nn,ydata) \ $var($nn,xedata) } xyey { blt::vector destroy $var($nn,xdata) $var($nn,ydata) \ $var($nn,yedata) } xyexey { blt::vector destroy $var($nn,xdata) $var($nn,ydata) \ $var($nn,xedata) $var($nn,yedata) } } } destroy $var(top) destroy $var(mb) # stats window? if {$var(stats)} { SimpleTextDestroy "${varname}stats" } # list window? if {$var(list)} { SimpleTextDestroy "${varname}list" } # delete it from the xpa list set ii [lsearch $iap(windows) $varname] if {$ii>=0} { set iap(windows) [lreplace $iap(windows) $ii $ii] } unset $varname } proc PlotExternal {varname} { upvar #0 $varname var global $varname # incr count incr ${varname}(data,total) set nn $var(data,total) set var(data,current) $nn set var(name) "Dataset $nn" set var($nn,manage) $var(manage) set var($nn,dim) $var(dim) set var($nn,xdata) $var(xdata) set var($nn,ydata) $var(ydata) set var($nn,xedata) $var(xedata) set var($nn,yedata) $var(yedata) PlotGetVar $varname $nn # update data set menu $var(mb).select add radiobutton -label "[msgcat::mc {Dataset}] $nn" \ -variable ${varname}(data,current) -value $nn \ -command "PlotCurrentData $varname" PlotCreateElement $varname } proc PlotList {varname} { upvar #0 $varname var global $varname if {!$var(list)} { return } set rr [PlotListGenerate $varname] SimpleTextDialog "${varname}list" [msgcat::mc {Data}] \ 40 20 insert top $rr PlotListDestroyCB $varname } proc PlotListGenerate {varname} { upvar #0 $varname var global $varname set rr {} if {$var(xdata) != {}} { global $var(xdata) $var(ydata) $var(xedata) $var(yedata) set ll [$var(xdata) length] set xx [$var(xdata) range] set yy [$var(ydata) range] switch $var(dim) { xy { for {set ii 0} {$ii<$ll} {incr ii} { append rr "[lindex $xx $ii] [lindex $yy $ii]\n" } } xyex { set xe [$var(xedata) range] for {set ii 0} {$ii<$ll} {incr ii} { append rr "[lindex $xx $ii] [lindex $yy $ii] [lindex $xe $ii]\n" } } xyey { set ye [$var(yedata) range] for {set ii 0} {$ii<$ll} {incr ii} { append rr "[lindex $xx $ii] [lindex $yy $ii] [lindex $ye $ii]\n" } } xyexey { set xe [$var(xedata) range] set ye [$var(yedata) range] for {set ii 0} {$ii<$ll} {incr ii} { append rr "[lindex $xx $ii] [lindex $yy $ii] [lindex $xe $ii] [lindex $ye $ii]\n" } } } } return $rr } proc PlotListDestroyCB {varname} { upvar #0 $varname var global $varname set var(list) 0 } proc PlotLoadConfig {varname} { upvar #0 $varname var global $varname PlotLoadConfigFile $varname [OpenFileDialog apconfigfbox] } # used by backup proc PlotLoadConfigFile {varname filename} { upvar #0 $varname var global $varname if {$filename != {}} { source $filename array set $varname [array get analysisplot] unset analysisplot # backward compatibility FixVar ${varname}(axis,x,grid) ${varname}(graph,x,grid) FixVar ${varname}(axis,x,log) ${varname}(graph,x,log) FixVar ${varname}(axis,x,flip) ${varname}(graph,x,flip) FixVar ${varname}(axis,y,grid) ${varname}(graph,y,grid) FixVar ${varname}(axis,y,log) ${varname}(graph,y,log) FixVar ${varname}(axis,y,flip) ${varname}(graph,y,flip) FixVar ${varname}(graph,title,family) ${varname}(titleFont) FixVar ${varname}(graph,title,size) ${varname}(titleSize) FixVar ${varname}(graph,title,weight) ${varname}(titleWeight) FixVar ${varname}(graph,title,slant) ${varname}(titleSlant) FixVar ${varname}(axis,title,family) ${varname}(textlabFont) FixVar ${varname}(axis,title,size) ${varname}(textlabSize) FixVar ${varname}(axis,title,weight) ${varname}(textlabWeight) FixVar ${varname}(axis,title,slant) ${varname}(textlabSlant) FixVar ${varname}(axis,font,family) ${varname}(numlabFont) FixVar ${varname}(axis,font,size) ${varname}(numlabSize) FixVar ${varname}(axis,font,weight) ${varname}(numlabWeight) FixVar ${varname}(axis,font,slant) ${varname}(numlabSlant) FixVar ${varname}(show) ${varname}(linear) FixVar ${varname}(shape,color) ${varname}(discrete,color) FixVar ${varname}(shape,fill) ${varname}(discrete,fill) FixVar ${varname}(width) ${varname}(linear,width) FixVar ${varname}(color) ${varname}(linear,color) if {[info exists ${varname}(linear,dash)]} { set var(linear,dash) [FromYesNo $var(linear,dash)] } FixVar ${varname}(dash) ${varname}(linear,dash) if {[info exists ${varname}(discrete)]} { if {$var(discrete)} { FixVar ${varname}(shape,symbol) ${varname}(discrete,symbol) } else { FixVarRm ${varname}(discrete,symbol) } } FixVarRm ${varname}(bar) FixVarRm ${varname}(bar,color) FixVarRm ${varname}(discrete) FixVarRm ${varname}(quadratic) FixVarRm ${varname}(quadratic,width) FixVarRm ${varname}(quadratic,color) FixVarRm ${varname}(quadratic,dash) FixVarRm ${varname}(step) FixVarRm ${varname}(step,color) FixVarRm ${varname}(step,dash) FixVarRm ${varname}(step,width) if {[info exists var(grid)]} { set var(axis,x,grid) $var(grid) set var(axis,y,grid) $var(grid) unset var(grid) } if {[info exists var(format)]} { set var(graph,format) $var(format) set var(axis,x,format) $var(format,x) set var(axis,y,format) $var(format,y) unset var(format) unset var(format,x) unset var(format,y) } if {[info exists var(grid,log)]} { switch $var(grid,log) { linearlinear { set var(axis,x,log) 0 set var(axis,y,log) 0 } linearlog { set var(axis,x,log) 0 set var(axis,y,log) 1 } loglinear { set var(axis,x,log) 1 set var(axis,y,log) 0 } loglog { set var(axis,x,log) 1 set var(axis,y,log) 1 } } unset var(grid,log) } $var(proc,updategraph) $varname $var(proc,updateelement) $varname } } proc PlotLoadData {varname} { upvar #0 $varname var global $varname set filename [OpenFileDialog apdatafbox] if {$filename != {}} { set dim xy if {[PlotDataFormatDialog dim]} { PlotLoadDataFile $varname $filename $dim } } } # used by backup proc PlotLoadDataFile {varname filename dim} { upvar #0 $varname var global $varname set ch [open $filename] set data [read $ch] close $ch PlotRaise $varname PlotDataSet $varname $dim $data $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } proc PlotNextColor {which} { switch -- $which { black {return red} red {return green} green {return blue} blue {return cyan} cyan {return magenta} magenta {return yellow} yellow {return black} white {return white} default {return red} } } proc PlotPing {varname} { upvar #0 $varname var global $varname if {[info exists var(top)]} { if {[winfo exists $var(top)]} { return 1 } } return 0 } proc PlotRaise {varname} { upvar #0 $varname var global $varname if {[PlotPing $varname]} { raise $var(top) return 1 } return 0 } proc PlotSaveConfig {varname} { upvar #0 $varname var global $varname PlotSaveConfigFile $varname [SaveFileDialog apconfigfbox] } proc PlotSaveConfigFile {varname filename} { upvar #0 $varname var global $varname if {$filename == {}} { return } set ch [open $filename w] set analysisplot(graph,title) $var(graph,title) set analysisplot(graph,title,family) $var(graph,title,family) set analysisplot(graph,title,size) $var(graph,title,size) set analysisplot(graph,title,weight) $var(graph,title,weight) set analysisplot(graph,title,slant) $var(graph,title,slant) set analysisplot(legend) $var(legend) set analysisplot(legend,title) $var(legend,title) set analysisplot(legend,position) $var(legend,position) set analysisplot(legend,title,family) $var(legend,title,family) set analysisplot(legend,title,size) $var(legend,title,size) set analysisplot(legend,title,weight) $var(legend,title,weight) set analysisplot(legend,title,slant) $var(legend,title,slant) set analysisplot(legend,font,family) $var(legend,font,family) set analysisplot(legend,font,size) $var(legend,font,size) set analysisplot(legend,font,weight) $var(legend,font,weight) set analysisplot(legend,font,slant) $var(legend,font,slant) set analysisplot(axis,x,title) $var(axis,x,title) set analysisplot(axis,x,grid) $var(axis,x,grid) set analysisplot(axis,x,log) $var(axis,x,log) set analysisplot(axis,x,flip) $var(axis,x,flip) set analysisplot(axis,x,auto) $var(axis,x,auto) set analysisplot(axis,x,min) $var(axis,x,min) set analysisplot(axis,x,max) $var(axis,x,max) set analysisplot(axis,x,format) $var(axis,x,format) set analysisplot(axis,y,title) $var(axis,y,title) set analysisplot(axis,y,grid) $var(axis,y,grid) set analysisplot(axis,y,log) $var(axis,y,log) set analysisplot(axis,y,flip) $var(axis,y,flip) set analysisplot(axis,y,auto) $var(axis,y,auto) set analysisplot(axis,y,min) $var(axis,y,min) set analysisplot(axis,y,max) $var(axis,y,max) set analysisplot(axis,y,format) $var(axis,y,format) set analysisplot(axis,title,family) $var(axis,title,family) set analysisplot(axis,title,size) $var(axis,title,size) set analysisplot(axis,title,weight) $var(axis,title,weight) set analysisplot(axis,title,slant) $var(axis,title,slant) set analysisplot(axis,font,family) $var(axis,font,family) set analysisplot(axis,font,size) $var(axis,font,size) set analysisplot(axis,font,weight) $var(axis,font,weight) set analysisplot(axis,font,slant) $var(axis,font,slant) set analysisplot(show) $var(show) set analysisplot(shape,symbol) $var(shape,symbol) set analysisplot(shape,fill) $var(shape,fill) set analysisplot(shape,color) $var(shape,color) set analysisplot(smooth) $var(smooth) set analysisplot(color) $var(color) set analysisplot(fill) $var(fill) set analysisplot(fill,color) $var(fill,color) set analysisplot(width) $var(width) set analysisplot(dash) $var(dash) set analysisplot(error) $var(error) set analysisplot(error,cap) $var(error,cap) set analysisplot(error,color) $var(error,color) set analysisplot(error,width) $var(error,width) set analysisplot(bar,relief) $var(bar,relief) set analysisplot(bar,mode) $var(bar,mode) puts $ch "array set analysisplot \{ [array get analysisplot] \}" close $ch } proc PlotSaveData {varname} { upvar #0 $varname var global $varname if {$var(xdata) == {}} { return } PlotSaveDataFile $varname [SaveFileDialog apdatafbox] } proc PlotSaveDataFile {varname filename} { upvar #0 $varname var global $varname if {$var(xdata) == {}} { return } if {$filename == {}} { return } global $var(xdata) $var(ydata) $var(xedata) $var(yedata) set ll [$var(xdata) length] set xx [$var(xdata) range] set yy [$var(ydata) range] set ch [open $filename w] switch $var(dim) { xy { for {set ii 0} {$ii<$ll} {incr ii} { puts $ch "[lindex $xx $ii] [lindex $yy $ii]" } } xyex { set xe [$var(xedata) range] for {set ii 0} {$ii<$ll} {incr ii} { puts $ch "[lindex $xx $ii] [lindex $yy $ii] [lindex $xe $ii]" } } xyey { set ye [$var(yedata) range] for {set ii 0} {$ii<$ll} {incr ii} { puts $ch "[lindex $xx $ii] [lindex $yy $ii] [lindex $ye $ii]" } } xyexey { set xe [$var(xedata) range] set ye [$var(yedata) range] for {set ii 0} {$ii<$ll} {incr ii} { puts $ch "[lindex $xx $ii] [lindex $yy $ii] [lindex $xe $ii] [lindex $ye $ii]" } } } close $ch PlotRaise $varname } proc PlotStats {varname} { upvar #0 $varname var global $varname if {!$var(stats)} { return } set rr [PlotStatsGenerate $varname] SimpleTextDialog "${varname}stats" [msgcat::mc {Statistics}] \ 40 20 insert top $rr PlotStatsDestroyCB $varname } proc PlotStatsGenerate {varname} { upvar #0 $varname var global $varname set min {} set max {} set mean {} set median {} set varr {} set sdev {} if {$var(ydata) != {}} { if {[$var(ydata) length] > 0} { set min [format "%6.3f" [blt::vector expr min($var(ydata))]] set max [format "%6.3f" [blt::vector expr max($var(ydata))]] set mean [format "%6.3f" [blt::vector expr mean($var(ydata))]] set median [format "%6.3f" [blt::vector expr median($var(ydata))]] set varr [format "%6.3f" [expr [blt::vector expr var($var(ydata))]]] set sdev [format "%6.3f" [expr [blt::vector expr sdev($var(ydata))]]] } } set rr {} append rr "min $min\n" append rr "max $max\n" append rr "mean $mean\n" append rr "median $median\n" append rr "var $varr\n" append rr "sdev $sdev\n" return $rr } proc PlotStatsDestroyCB {varname} { upvar #0 $varname var global $varname set var(stats) 0 } proc PlotTitle {varname title xaxis yaxis} { upvar #0 $varname var global $varname set var(graph,title) "$title" set var(axis,x,title) "$xaxis" set var(axis,y,title) "$yaxis" } proc PlotUpdateGraph {varname} { upvar #0 $varname var global $varname global ds9 if {$var(axis,x,auto)} { set xmin {} set xmax {} } else { set xmin $var(axis,x,min) set xmax $var(axis,x,max) } if {$var(axis,y,auto)} { set ymin {} set ymax {} } else { set ymin $var(axis,y,min) set ymax $var(axis,y,max) } $var(graph) xaxis configure -min $xmin -max $xmax \ -descending $var(axis,x,flip) $var(graph) yaxis configure -min $ymin -max $ymax \ -descending $var(axis,y,flip) if {$var(graph,format)} { if {$var(axis,x,format) != {}} { $var(graph) xaxis configure \ -command [list PlotAxisFormat $varname x] } else { $var(graph) xaxis configure -command {} } if {$var(axis,y,format) != {}} { $var(graph) yaxis configure \ -command [list PlotAxisFormat $varname y] } else { $var(graph) yaxis configure -command {} } } # Menus if {$var(xdata) != {}} { $var(mb).file entryconfig "[msgcat::mc {Save Data}]..." -state normal $var(mb).file entryconfig [msgcat::mc {Clear Data}] -state normal $var(mb).file entryconfig [msgcat::mc {Statistics}] -state normal $var(mb).file entryconfig [msgcat::mc {List Data}] -state normal if {$var(1,manage)} { $var(mb).file entryconfig [msgcat::mc {Duplicate Data}] \ -state disabled } else { $var(mb).file entryconfig [msgcat::mc {Duplicate Data}] \ -state normal } } else { $var(mb).file entryconfig "[msgcat::mc {Save Data}]..." -state disabled $var(mb).file entryconfig [msgcat::mc {Clear Data}] -state disabled $var(mb).file entryconfig [msgcat::mc {Duplicate Data}] -state disabled $var(mb).file entryconfig [msgcat::mc {Statistics}] -state disabled $var(mb).file entryconfig [msgcat::mc {List Data}] -state disabled } # Graph $var(graph) configure -plotpadx 0 -plotpady 0 \ -title $var(graph,title) \ -font "{$ds9($var(graph,title,family))} $var(graph,title,size) $var(graph,title,weight) $var(graph,title,slant)" $var(graph) xaxis configure \ -grid $var(axis,x,grid) -logscale $var(axis,x,log) \ -title $var(axis,x,title) \ -tickfont "{$ds9($var(axis,font,family))} $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "{$ds9($var(axis,title,family))} $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) yaxis configure \ -grid $var(axis,y,grid) -logscale $var(axis,y,log) \ -title $var(axis,y,title) \ -tickfont "{$ds9($var(axis,font,family))} $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "{$ds9($var(axis,title,family))} $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) legend configure -hide [expr !$var(legend)] \ -position $var(legend,position) -title $var(legend,title) \ -font "{$ds9($var(legend,font,family))} $var(legend,font,size) $var(legend,font,weight) $var(legend,font,slant)" \ -titlefont "{$ds9($var(legend,title,family))} $var(legend,title,size) $var(legend,title,weight) $var(legend,title,slant)" } proc PlotCreateElement {varname} { upvar #0 $varname var global $varname # warning: uses current vars if {$var(data,total) == 0} { return } # delete current elements set nn $var(data,current) foreach el [$var(graph) element names] { set f [split $el -] if {[lindex $f 1] == $nn} { $var(graph) element delete $el } } global $var(xdata) $var(ydata) $var(graph) element create "d-${nn}" -xdata $var(xdata) -ydata $var(ydata) if {$var(xedata) != {}} { if {[$var(xedata) length] != 0} { $var(graph) element configure "d-${nn}" -xerror $var(xedata) } } if {$var(yedata) != {}} { if {[$var(yedata) length] != 0} { $var(graph) element configure "d-${nn}" -yerror $var(yedata) } } } proc PlotColorMenu {w varname color cmd} { upvar #0 $varname var global $varname menu $w $w add radiobutton -label [msgcat::mc {Black}] \ -variable ${varname}($color) -value black -command $cmd $w add radiobutton -label [msgcat::mc {White}] \ -variable ${varname}($color) -value white -command $cmd $w add radiobutton -label [msgcat::mc {Red}] \ -variable ${varname}($color) -value red -command $cmd $w add radiobutton -label [msgcat::mc {Green}] \ -variable ${varname}($color) -value green -command $cmd $w add radiobutton -label [msgcat::mc {Blue}] \ -variable ${varname}($color) -value blue -command $cmd $w add radiobutton -label [msgcat::mc {Cyan}] \ -variable ${varname}($color) -value cyan -command $cmd $w add radiobutton -label [msgcat::mc {Magenta}] \ -variable ${varname}($color) -value magenta -command $cmd $w add radiobutton -label [msgcat::mc {Yellow}] \ -variable ${varname}($color) -value yellow -command $cmd $w add separator $w add command -label "[msgcat::mc {Other Color}]..." \ -command [list ColorMenuOther $varname $color $cmd] } proc PlotSetVar {varname nn} { upvar #0 $varname var global $varname set var(name) $var($nn,name) set var(show) $var($nn,show) set var(shape,symbol) $var($nn,shape,symbol) set var(shape,fill) $var($nn,shape,fill) set var(shape,color) $var($nn,shape,color) set var(smooth) $var($nn,smooth) set var(color) $var($nn,color) set var(fill) $var($nn,fill) set var(fill,color) $var($nn,fill,color) set var(width) $var($nn,width) set var(dash) $var($nn,dash) set var(error) $var($nn,error) set var(error,cap) $var($nn,error,cap) set var(error,color) $var($nn,error,color) set var(error,width) $var($nn,error,width) set var(bar,relief) $var($nn,bar,relief) } proc PlotGetVar {varname nn} { upvar #0 $varname var global $varname set var($nn,name) $var(name) set var($nn,show) $var(show) set var($nn,shape,symbol) $var(shape,symbol) set var($nn,shape,fill) $var(shape,fill) set var($nn,shape,color) $var(shape,color) set var($nn,smooth) $var(smooth) set var($nn,color) $var(color) set var($nn,fill) $var(fill) set var($nn,fill,color) $var(fill,color) set var($nn,width) $var(width) set var($nn,dash) $var(dash) set var($nn,error) $var(error) set var($nn,error,cap) $var(error,cap) set var($nn,error,color) $var(error,color) set var($nn,error,width) $var(error,width) set var($nn,bar,relief) $var(bar,relief) } proc PlotBackup {ch dir} { global iap set rdir "./[lindex [file split $dir] end]" # only save ap plots foreach tt $iap(windows) { if {[string range $tt 0 1] == {ap}} { set fdir [file join $dir $tt] set varname $tt upvar #0 $varname var global $varname # create dir if needed if {![file isdirectory $fdir]} { if {[catch {file mkdir $fdir}]} { Error [msgcat::mc {An error has occurred during backup}] return } } switch $var(type) { line {puts $ch "PlotLineTool"} bar {puts $ch "PlotBarTool"} scatter {puts $ch "PlotScatterTool"} } set save $var(data,current) for {set ii 1} {$ii<=$var(data,total)} {incr ii} { set ${varname}(data,current) $ii PlotCurrentData $varname PlotSaveDataFile $varname "$fdir/plot$ii.dat" PlotSaveConfigFile $varname "$fdir/plot$ii.plt" puts $ch "PlotLoadDataFile $varname $fdir/plot$ii.dat $var(dim)" puts $ch "PlotLoadConfigFile $varname $fdir/plot$ii.plt" } set ${varname}(data,current) $save PlotCurrentData $varname } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/plotbar.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000013576 12464211204 016706� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # used by backup proc PlotBarTool {} { global iap PlotBar $iap(tt) [msgcat::mc {Bar Plot Tool}] {} {} {} 2 {} } proc PlotBar {tt wtt title xaxis yaxis dim data} { global iap # make the window name unique set ii [lsearch $iap(windows) $tt] if {$ii>=0} { incr iap(unique) append tt $iap(unique) } # set the window title if none if {$wtt == {}} { set wtt $tt } set varname $tt upvar #0 $varname var global $varname PlotBarProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogBar $varname PlotDataSet $varname $dim $data $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } proc PlotBarDialog {varname wtt title xaxis yaxis} { upvar #0 $varname var global $varname PlotBarProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogBar $varname } proc PlotBarProc {varname} { upvar #0 $varname var global $varname set var(proc,updategraph) PlotBarUpdateGraph set var(proc,updateelement) PlotBarUpdateElement set var(proc,highlite) PlotBarHighliteElement set var(proc,button) PlotBarButton } proc PlotDialogBar {varname} { upvar #0 $varname var global $varname global ds9 set var(seq) 1 # Graph $var(mb).graph add separator $var(mb).graph add cascade -label "[msgcat::mc {Mode}]..." \ -menu $var(mb).graph.mode # Graph Mode menu $var(mb).graph.mode $var(mb).graph.mode add radiobutton -label [msgcat::mc {Normal}] \ -variable ${varname}(bar,mode) -value normal \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.mode add radiobutton -label [msgcat::mc {Stacked}] \ -variable ${varname}(bar,mode) -value stacked \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.mode add radiobutton -label [msgcat::mc {Aligned}] \ -variable ${varname}(bar,mode) -value aligned \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.mode add radiobutton -label [msgcat::mc {Overlap}] \ -variable ${varname}(bar,mode) -value overlap \ -command [list $var(proc,updategraph) $varname] # Dataset $var(mb).dataset add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(show) \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset add separator $var(mb).dataset add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.color $var(mb).dataset add cascade -label [msgcat::mc {Relief}] \ -menu $var(mb).dataset.relief $var(mb).dataset add cascade -label [msgcat::mc {Error}] \ -menu $var(mb).dataset.error $var(mb).dataset add separator $var(mb).dataset add command -label "[msgcat::mc {Name}]..." \ -command [list DatasetNameDialog $varname] PlotColorMenu $var(mb).dataset.color $varname color \ [list PlotBarUpdateElement $varname] # Relief menu $var(mb).dataset.relief $var(mb).dataset.relief add radiobutton -label [msgcat::mc {Flat}] \ -variable ${varname}(bar,relief) -value flat \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.relief add radiobutton -label [msgcat::mc {Sunken}] \ -variable ${varname}(bar,relief) -value sunken \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.relief add radiobutton -label [msgcat::mc {Raised}] \ -variable ${varname}(bar,relief) -value raised \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.relief add radiobutton -label [msgcat::mc {Solid}] \ -variable ${varname}(bar,relief) -value solid \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.relief add radiobutton -label [msgcat::mc {Groove}] \ -variable ${varname}(bar,relief) -value groove \ -command [list PlotBarUpdateElement $varname] # Error menu $var(mb).dataset.error $var(mb).dataset.error add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(error) \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.error add checkbutton -label [msgcat::mc {Cap}] \ -variable ${varname}(error,cap) \ -command [list PlotBarUpdateElement $varname] $var(mb).dataset.error add separator $var(mb).dataset.error add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.error.color $var(mb).dataset.error add cascade -label [msgcat::mc {Width}] \ -menu $var(mb).dataset.error.width PlotColorMenu $var(mb).dataset.error.color $varname error,color \ [list PlotBarUpdateElement $varname] WidthDashMenu $var(mb).dataset.error.width $varname error,width {} \ [list PlotBarUpdateElement $varname] {} # graph set var(type) bar set var(graph) [blt::barchart $var(top).bar \ -width 600 \ -height 500 \ -highlightthickness 0 \ ] $var(graph) xaxis configure -grid no -stepsize 0 $var(graph) yaxis configure -grid yes pack $var(graph) -expand yes -fill both PlotChangeMode $varname } proc PlotBarUpdateGraph {varname} { upvar #0 $varname var global $varname PlotUpdateGraph $varname $var(graph) configure -barmode $var(bar,mode) } proc PlotBarUpdateElement {varname} { upvar #0 $varname var global $varname set nn $var(data,current) PlotGetVar $varname $nn if {$var(error)} { set show both } else { set show none } if {$var(error,cap)} { set cap [expr $var(error,width)+3] } else { set cap 0 } $var(graph) element configure "d-${nn}" \ -label $var(name) -hide [expr !$var(show)] \ -relief $var(bar,relief) -color $var(color) \ -showerrorbars $show -errorbarcolor $var(error,color) \ -errorbarwidth $var(error,width) -errorbarcap $cap } proc PlotBarButton {varname x y} { upvar #0 $varname var global $varname } proc PlotBarHighliteElement {varname rowlist} { upvar #0 $varname var global $varname } ����������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/plotdialog.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000041502 12464211204 017367� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PlotDialog {varname wtt title xaxis yaxis} { upvar #0 $varname var global $varname global ds9 global pap if {[PlotRaise $varname]} { return } # add it to our xpa list global iap lappend iap(windows) $varname set var(top) ".${varname}" set var(mb) ".${varname}mb" set var(stats) 0 set var(list) 0 set var(mode) zoom set var(callback) {} set var(data,total) 0 set var(data,current) 0 set var(name) {} set var(xdata) {} set var(ydata) {} set var(xedata) {} set var(yedata) {} array set $varname [array get pap] set var(graph,title) "$title" set var(axis,x,title) "$xaxis" set var(axis,y,title) "$yaxis" # can be turned off for external line plots set var(graph,format) 1 # create window Toplevel $var(top) $var(mb) 7 $wtt [list PlotDestroy $varname] $var(mb) add cascade -label [msgcat::mc {File}] -menu $var(mb).file $var(mb) add cascade -label [msgcat::mc {Edit}] -menu $var(mb).edit $var(mb) add cascade -label [msgcat::mc {Graph}] -menu $var(mb).graph $var(mb) add cascade -label [msgcat::mc {Dataset}] -menu $var(mb).dataset $var(mb) add cascade -label [msgcat::mc {Select}] -menu $var(mb).select menu $var(mb).file $var(mb).file add command -label "[msgcat::mc {Load Data}]..." \ -command [list PlotLoadData $varname] $var(mb).file add command -label "[msgcat::mc {Save Data}]..." \ -command [list PlotSaveData $varname] $var(mb).file add command -label [msgcat::mc {Clear Data}] \ -command [list PlotClearData $varname] $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Duplicate Data}] \ -command [list PlotDupData $varname 1] $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Statistics}] \ -command "set ${varname}(stats) 1; PlotStats $varname" $var(mb).file add command -label [msgcat::mc {List Data}] \ -command "set ${varname}(list) 1; PlotList $varname" $var(mb).file add separator $var(mb).file add command -label "[msgcat::mc {Load Configuration}]..." \ -command [list PlotLoadConfig $varname] $var(mb).file add command -label "[msgcat::mc {Save Configuration}]..." \ -command [list PlotSaveConfig $varname] $var(mb).file add separator switch $ds9(wm) { x11 { $var(mb).file add command \ -label "[msgcat::mc {Page Setup}]..." \ -command PSPageSetup $var(mb).file add command -label "[msgcat::mc {Print}]..." \ -command [list PlotPSPrint $varname] } aqua { $var(mb).file add command \ -label "[msgcat::mc {Page Setup}]..." \ -command PSPageSetup $var(mb).file add command -label "[msgcat::mc {Print}]..." \ -command [list PlotPSPrint $varname] # $var(mb).file add command -label "[msgcat::mc {Postscript Page Setup}]..." -command PSPageSetup # $var(mb).file add command -label "[msgcat::mc {Postscript Print}]..." -command [list PlotPSPrint $varname] } win32 {} } $var(mb).file add separator $var(mb).file add command -label [msgcat::mc {Close}] \ -command [list PlotDestroy $varname] menu $var(mb).edit $var(mb).edit add command -label [msgcat::mc {Cut}] \ -state disabled -accelerator "${ds9(ctrl)}X" $var(mb).edit add command -label [msgcat::mc {Copy}] \ -state disabled -accelerator "${ds9(ctrl)}C" $var(mb).edit add command -label [msgcat::mc {Paste}] \ -state disabled -accelerator "${ds9(ctrl)}V" $var(mb).edit add command -label [msgcat::mc {Clear}] \ -state disabled $var(mb).edit add separator $var(mb).edit add radiobutton -label [msgcat::mc {Pointer}] \ -variable ${varname}(mode) -value pointer \ -command [list PlotChangeMode $varname] $var(mb).edit add radiobutton -label [msgcat::mc {Zoom}] \ -variable ${varname}(mode) -value zoom \ -command [list PlotChangeMode $varname] # Graph menu $var(mb).graph $var(mb).graph add cascade -label [msgcat::mc {Axes}] \ -menu $var(mb).graph.axes $var(mb).graph add cascade -label [msgcat::mc {Legend}] \ -menu $var(mb).graph.legend $var(mb).graph add cascade -label [msgcat::mc {Font}] \ -menu $var(mb).graph.font $var(mb).graph add separator $var(mb).graph add command -label "[msgcat::mc {Title}]..." \ -command [list PlotTitleDialog $varname] menu $var(mb).graph.axes $var(mb).graph.axes add checkbutton -label [msgcat::mc {X Grid}] \ -variable ${varname}(axis,x,grid) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add checkbutton -label [msgcat::mc {Log}] \ -variable ${varname}(axis,x,log) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add checkbutton -label [msgcat::mc {Flip}] \ -variable ${varname}(axis,x,flip) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add separator $var(mb).graph.axes add checkbutton -label [msgcat::mc {Y Grid}] \ -variable ${varname}(axis,y,grid) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add checkbutton -label [msgcat::mc {Log}] \ -variable ${varname}(axis,y,log) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add checkbutton -label [msgcat::mc {Flip}] \ -variable ${varname}(axis,y,flip) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.axes add separator $var(mb).graph.axes add command -label "[msgcat::mc {Range}]..." \ -command [list PlotRangeDialog $varname] menu $var(mb).graph.legend $var(mb).graph.legend add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(legend) \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.legend add separator $var(mb).graph.legend add radiobutton -label [msgcat::mc {Right}] \ -variable ${varname}(legend,position) -value right \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.legend add radiobutton -label [msgcat::mc {Left}] \ -variable ${varname}(legend,position) -value left \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.legend add radiobutton -label [msgcat::mc {Top}] \ -variable ${varname}(legend,position) -value top \ -command [list $var(proc,updategraph) $varname] $var(mb).graph.legend add radiobutton -label [msgcat::mc {Bottom}] \ -variable ${varname}(legend,position) -value bottom \ -command [list $var(proc,updategraph) $varname] menu $var(mb).graph.font $var(mb).graph.font add cascade -label [msgcat::mc {Title}] \ -menu $var(mb).graph.font.title $var(mb).graph.font add cascade -label [msgcat::mc {Axes Title}] \ -menu $var(mb).graph.font.textlab $var(mb).graph.font add cascade -label [msgcat::mc {Axes Number}] \ -menu $var(mb).graph.font.numlab $var(mb).graph.font add cascade -label [msgcat::mc {Legend Title}] \ -menu $var(mb).graph.font.legendtitle $var(mb).graph.font add cascade -label [msgcat::mc {Legend}] \ -menu $var(mb).graph.font.legend FontMenu $var(mb).graph.font.title $varname graph,title,family graph,title,size graph,title,weight graph,title,slant [list $var(proc,updategraph) $varname] FontMenu $var(mb).graph.font.textlab $varname axis,title,family axis,title,size axis,title,weight axis,title,slant [list $var(proc,updategraph) $varname] FontMenu $var(mb).graph.font.numlab $varname axis,font,family axis,font,size axis,font,weight axis,font,slant [list $var(proc,updategraph) $varname] FontMenu $var(mb).graph.font.legendtitle $varname legend,title,family legend,title,size legend,title,weight legend,title,slant [list $var(proc,updategraph) $varname] FontMenu $var(mb).graph.font.legend $varname legend,font,family legend,font,size legend,font,weight legend,font,slant [list $var(proc,updategraph) $varname] # dataset menu $var(mb).dataset # select menu $var(mb).select } proc PlotChangeMode {varname} { upvar #0 $varname var global $varname global ds9 blt::RemoveBindTag $var(graph) zoom-$var(graph) bind $var(graph) <1> {} switch $var(mode) { pointer {bind $var(graph) <1> [list PlotButton $varname %x %y]} zoom { switch $ds9(wm) { x11 - win32 {Blt_ZoomStack $var(graph) -mode release} aqua {Blt_ZoomStack $var(graph) -mode release -button "ButtonPress-2"} } } } } proc PlotDataFormatDialog {xarname} { upvar $xarname xar global ed set w {.apdata} set ed(ok) 0 set ed(dim) $xar DialogCreate $w [msgcat::mc {Data Format}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.title -text [msgcat::mc {Data Format}] ttk::radiobutton $f.xy -text {X Y} -variable ed(dim) -value xy ttk::radiobutton $f.xyex -text {X Y XErr} -variable ed(dim) -value xyex ttk::radiobutton $f.xyey -text {X Y YErr} -variable ed(dim) -value xyey ttk::radiobutton $f.xyexey -text {X Y XErr YErr} -variable ed(dim) \ -value xyexey grid $f.title -padx 2 -pady 2 -sticky w grid $f.xy -padx 2 -pady 2 -sticky w grid $f.xyex -padx 2 -pady 2 -sticky w grid $f.xyey -padx 2 -pady 2 -sticky w grid $f.xyexey -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) $w.param.xy DialogDismiss $w if {$ed(ok)} { set xar $ed(dim) } set rr $ed(ok) unset ed return $rr } proc PlotRangeDialog {varname} { upvar #0 $varname var global $varname global ed set w {.aptitle} set ed(ok) 0 set ed(x,auto) $var(axis,x,auto) set ed(x,min) $var(axis,x,min) set ed(x,max) $var(axis,x,max) set ed(x,format) $var(axis,x,format) set ed(y,auto) $var(axis,y,auto) set ed(y,min) $var(axis,y,min) set ed(y,max) $var(axis,y,max) set ed(y,format) $var(axis,y,format) DialogCreate $w [msgcat::mc {Range}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.t -text [msgcat::mc {Axis}] ttk::label $f.tto -text [msgcat::mc {To}] ttk::label $f.tfrom -text [msgcat::mc {From}] ttk::label $f.tformat -text [msgcat::mc {Format}] ttk::label $f.tauto -text [msgcat::mc {Automatic}] ttk::label $f.x -text [msgcat::mc {X}] ttk::entry $f.xmin -textvariable ed(x,min) -width 12 ttk::entry $f.xmax -textvariable ed(x,max) -width 12 ttk::entry $f.xformat -textvariable ed(x,format) -width 8 ttk::checkbutton $f.xauto -variable ed(x,auto) ttk::label $f.y -text [msgcat::mc {Y}] ttk::entry $f.ymin -textvariable ed(y,min) -width 12 ttk::entry $f.ymax -textvariable ed(y,max) -width 12 ttk::entry $f.yformat -textvariable ed(y,format) -width 8 ttk::checkbutton $f.yauto -variable ed(y,auto) grid $f.t $f.tfrom $f.tto $f.tformat $f.tauto -padx 2 -pady 2 -sticky w grid $f.x $f.xmin $f.xmax $f.xformat $f.xauto -padx 2 -pady 2 -sticky w grid $f.y $f.ymin $f.ymax $f.yformat $f.yauto -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) $w.param.xmin DialogDismiss $w if {$ed(ok)} { set var(axis,x,auto) $ed(x,auto) set var(axis,x,min) $ed(x,min) set var(axis,x,max) $ed(x,max) set var(axis,x,format) $ed(x,format) set var(axis,y,auto) $ed(y,auto) set var(axis,y,min) $ed(y,min) set var(axis,y,max) $ed(y,max) set var(axis,y,format) $ed(y,format) $var(proc,updategraph) $varname } set rr $ed(ok) unset ed return $rr } proc PlotTitleDialog {varname} { upvar #0 $varname var global $varname global ed set w {.aptitle} set ed(ok) 0 set ed(graph,title) $var(graph,title) set ed(axis,x,title) $var(axis,x,title) set ed(axis,y,title) $var(axis,y,title) set ed(legend,title) $var(legend,title) DialogCreate $w [msgcat::mc {Title}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.label -text [msgcat::mc {Plot Title}] ttk::entry $f.title -textvariable ed(graph,title) -width 30 ttk::label $f.xlabel -text [msgcat::mc {X Axis Title}] ttk::entry $f.xtitle -textvariable ed(axis,x,title) -width 30 ttk::label $f.ylabel -text [msgcat::mc {Y Axis Title}] ttk::entry $f.ytitle -textvariable ed(axis,y,title) -width 30 ttk::label $f.legendlabel -text [msgcat::mc {Legend Title}] ttk::entry $f.legendtitle -textvariable ed(legend,title) -width 30 grid $f.label $f.title -padx 2 -pady 2 -sticky ew grid $f.xlabel $f.xtitle -padx 2 -pady 2 -sticky ew grid $f.ylabel $f.ytitle -padx 2 -pady 2 -sticky ew grid $f.legendlabel $f.legendtitle -padx 2 -pady 2 -sticky ew grid columnconfigure $f 1 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) $w.param.title DialogDismiss $w if {$ed(ok)} { set var(graph,title) $ed(graph,title) set var(axis,x,title) $ed(axis,x,title) set var(axis,y,title) $ed(axis,y,title) set var(legend,title) $ed(legend,title) $var(proc,updategraph) $varname } set rr $ed(ok) unset ed return $rr } proc DatasetNameDialog {varname} { upvar #0 $varname var global $varname global ed set w {.aptitle} set ed(ok) 0 set ed(name) $var(name) DialogCreate $w [msgcat::mc {Dataset}] ed(ok) # Param set f [ttk::frame $w.param] ttk::label $f.label -text [msgcat::mc {Dataset Name}] ttk::entry $f.name -textvariable ed(name) -width 30 grid $f.label $f.name -padx 2 -pady 2 -sticky ew grid columnconfigure $f 1 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) $w.param.name DialogDismiss $w if {$ed(ok)} { $var(mb).select entryconfig "$var(name)" -label "$ed(name)" set var(name) $ed(name) $var(proc,updateelement) $varname } set rr $ed(ok) unset ed return $rr } proc PlotButton {varname x y} { upvar #0 $varname var global $varname $var(proc,button) $varname $x $y } proc PlotLineShapeMenu {which var} { menu $which $which add radiobutton -label [msgcat::mc {None}] \ -variable $var -value none $which add radiobutton -label [msgcat::mc {Circle}] \ -variable $var -value circle $which add radiobutton -label [msgcat::mc {Square}] \ -variable $var -value square $which add radiobutton -label [msgcat::mc {Diamond}] \ -variable $var -value diamond $which add radiobutton -label [msgcat::mc {Plus}] \ -variable $var -value plus $which add radiobutton -label [msgcat::mc {Cross}] \ -variable $var -value cross $which add radiobutton -label [msgcat::mc {Simple Plus}] \ -variable $var -value splus $which add radiobutton -label [msgcat::mc {Simple Cross}] \ -variable $var -value scross $which add radiobutton -label [msgcat::mc {Triangle}] \ -variable $var -value triangle $which add radiobutton -label [msgcat::mc {Arrow}] \ -variable $var -value arrow } proc PlotLineSmoothMenu {which var} { menu $which $which add radiobutton -label [msgcat::mc {Step}] \ -variable $var -value step $which add radiobutton -label [msgcat::mc {Linear}] \ -variable $var -value linear $which add radiobutton -label [msgcat::mc {Cubic}] \ -variable $var -value cubic $which add radiobutton -label [msgcat::mc {Quadratic}] \ -variable $var -value quadratic $which add radiobutton -label [msgcat::mc {Catrom}] \ -variable $var -value catrom } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/plotelement.tcl������������������������������������������������������������������000644 �000765 �000000 �00000000663 12464211204 017564� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PlotHighliteElement {varname rowlist} { upvar #0 $varname var global $varname # rowlist starts at 1 set result {} foreach rr $rowlist { append result "[expr $rr-1] " } $var(proc,highlite) $varname $result } �����������������������������������������������������������������������������saods9/ds9/library/plotline.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000020534 12464211204 017061� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # used by backup proc PlotLineTool {} { global iap PlotLine $iap(tt) [msgcat::mc {Line Plot Tool}] {} {} {} 2 {} } proc PlotLine {tt wtt title xaxis yaxis dim data} { global iap # make the window name unique set ii [lsearch $iap(windows) $tt] if {$ii>=0} { incr iap(unique) append tt $iap(unique) } # set the window title if none if {$wtt == {}} { set wtt $tt } set varname $tt upvar #0 $varname var global $varname PlotLineProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogLine $varname PlotDataSet $varname $dim $data $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } proc PlotLineDialog {varname wtt title xaxis yaxis} { upvar #0 $varname var global $varname PlotLineProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogLine $varname } proc PlotLineProc {varname} { upvar #0 $varname var global $varname set var(proc,updategraph) PlotUpdateGraph set var(proc,updateelement) PlotLineUpdateElement set var(proc,highlite) PlotLineHighliteElement set var(proc,button) PlotLineButton } proc PlotDialogLine {varname} { upvar #0 $varname var global $varname global ds9 set var(seq) 1 # Dataset $var(mb).dataset add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(show) \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset add separator $var(mb).dataset add cascade -label [msgcat::mc {Shape}] \ -menu $var(mb).dataset.shape $var(mb).dataset add cascade -label [msgcat::mc {Smooth}] \ -menu $var(mb).dataset.smooth $var(mb).dataset add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.color $var(mb).dataset add cascade -label [msgcat::mc {Width}] \ -menu $var(mb).dataset.width $var(mb).dataset add cascade -label [msgcat::mc {Fill}] \ -menu $var(mb).dataset.fill $var(mb).dataset add cascade -label [msgcat::mc {Error}] \ -menu $var(mb).dataset.error $var(mb).dataset add separator $var(mb).dataset add command -label "[msgcat::mc {Name}]..." \ -command [list DatasetNameDialog $varname] # Shape menu $var(mb).dataset.shape $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {None}] \ -variable ${varname}(shape,symbol) -value none \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Circle}] \ -variable ${varname}(shape,symbol) -value circle \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Square}] \ -variable ${varname}(shape,symbol) -value square \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Diamond}] \ -variable ${varname}(shape,symbol) -value diamond \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Plus}] \ -variable ${varname}(shape,symbol) -value plus \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Cross}] \ -variable ${varname}(shape,symbol) -value cross \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Simple Plus}] \ -variable ${varname}(shape,symbol) -value splus \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Simple Cross}] \ -variable ${varname}(shape,symbol) -value scross \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Triangle}] \ -variable ${varname}(shape,symbol) -value triangle \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Arrow}] \ -variable ${varname}(shape,symbol) -value arrow \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add separator $var(mb).dataset.shape add checkbutton \ -label [msgcat::mc {Fill}] \ -variable ${varname}(shape,fill) \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.shape add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.shape.color PlotColorMenu $var(mb).dataset.shape.color $varname shape,color \ [list PlotLineUpdateElement $varname] # Smooth menu $var(mb).dataset.smooth $var(mb).dataset.smooth add radiobutton \ -label [msgcat::mc {Step}] \ -variable ${varname}(smooth) -value step \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.smooth add radiobutton \ -label [msgcat::mc {Linear}] \ -variable ${varname}(smooth) -value linear \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.smooth add radiobutton \ -label [msgcat::mc {Cubic}] \ -variable ${varname}(smooth) -value cubic \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.smooth add radiobutton \ -label [msgcat::mc {Quadratic}] \ -variable ${varname}(smooth) -value quadratic \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.smooth add radiobutton \ -label [msgcat::mc {Catrom}] \ -variable ${varname}(smooth) -value catrom \ -command [list PlotLineUpdateElement $varname] # Color PlotColorMenu $var(mb).dataset.color $varname color \ [list PlotLineUpdateElement $varname] # Width WidthDashMenu $var(mb).dataset.width $varname width dash \ [list PlotLineUpdateElement $varname] \ [list PlotLineUpdateElement $varname] # Fill menu $var(mb).dataset.fill $var(mb).dataset.fill add checkbutton \ -label [msgcat::mc {Show}] \ -variable ${varname}(fill) \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.fill add separator $var(mb).dataset.fill add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.fill.color PlotColorMenu $var(mb).dataset.fill.color $varname fill,color \ [list PlotLineUpdateElement $varname] # Error menu $var(mb).dataset.error $var(mb).dataset.error add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(error) \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.error add checkbutton -label [msgcat::mc {Cap}] \ -variable ${varname}(error,cap) \ -command [list PlotLineUpdateElement $varname] $var(mb).dataset.error add separator $var(mb).dataset.error add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.error.color $var(mb).dataset.error add cascade -label [msgcat::mc {Width}] \ -menu $var(mb).dataset.error.width PlotColorMenu $var(mb).dataset.error.color $varname error,color \ [list PlotLineUpdateElement $varname] WidthDashMenu $var(mb).dataset.error.width $varname error,width {} \ [list PlotLineUpdateElement $varname] {} # graph set var(type) line set var(graph) [blt::graph $var(top).line \ -width 600 \ -height 500 \ -highlightthickness 0 \ ] pack $var(graph) -expand yes -fill both PlotChangeMode $varname } proc PlotLineUpdateElement {varname} { upvar #0 $varname var global $varname # warning: uses current vars if {$var(data,total) == 0} { return } set nn $var(data,current) PlotGetVar $varname $nn if {$var(fill)} { set fillClr $var(fill,color) } else { set fillClr {} } if {$var(shape,fill)} { set clr $var(shape,color) } else { set clr {} } if {$var(dash)} { set dash {8 3} } else { set dash { } } if {$var(error)} { set show both } else { set show none } if {$var(error,cap)} { set cap [expr $var(error,width)+3] } else { set cap 0 } $var(graph) element configure "d-${nn}" \ -label $var(name) -hide [expr !$var(show)] \ -symbol $var(shape,symbol) -fill $clr -scalesymbols no \ -pixels 5 -outline $var(shape,color) \ -smooth $var(smooth) \ -color $var(color) -areabackground $fillClr \ -linewidth $var(width) -dashes $dash \ -showerrorbars $show -errorbarcolor $var(error,color) \ -errorbarwidth $var(error,width) -errorbarcap $cap } proc PlotLineButton {varname x y} { upvar #0 $varname var global $varname } proc PlotLineHighliteElement {varname rowlist} { upvar #0 $varname var global $varname } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/plotprint.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000007674 12464211204 017300� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PlotPSPrint {varname} { upvar #0 $varname var global $varname if {[PlotPrintDialog]} { if {[catch {PlotPostScript $varname} printError]} { Error "[msgcat::mc {An error has occurred while printing}] $printError" } } } proc PlotPostScript {varname} { upvar #0 $varname var global $varname global ps global ds9 global debug if {$debug(tcl,idletasks)} { puts stderr "PlotPostScript" } # set postscript fonts $var(graph) configure \ -font "$var(graph,title,family) $var(graph,title,size) $var(graph,title,weight) $var(graph,title,slant)" $var(graph) xaxis configure \ -tickfont "$var(axis,font,family) $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "$var(axis,title,family) $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) yaxis configure \ -tickfont "$var(axis,font,family) $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "$var(axis,title,family) $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) legend configure \ -font "$var(legend,font,family) $var(legend,font,size) $var(legend,font,weight) $var(legend,font,slant)" \ -titlefont "$var(legend,title,family) $var(legend,title,size) $var(legend,title,weight) $var(legend,title,slant)" set options "-decorations false" # Color switch -- $ps(color) { rgb - cmyk {append options " -greyscale no"} gray {append options " -greyscale yes"} } # Size set ww [expr [winfo width $var(top)]*$ps(scale)/100./[tk scaling]] set hh [expr [winfo height $var(top)]*$ps(scale)/100./[tk scaling]] append options " -width $ww -height $hh" # Page size switch -- $ps(size) { letter {append options " -paperwidth 8.5i -paperheight 11.i"} legal {append options " -paperwidth 8.5i -paperheight 14.i"} tabloid {append options " -paperwidth 11i -paperheight 17.i"} poster {append options " -paperwidth 36.i -paperheight 48.i"} a4 {append options " -paperwidth 195m -paperheight 282m"} other { if {$ps(width) != {} && $ps(height) != {}} { set pgww "[append ps(width) i]" set pghh "[append ps(height) i]" append options " -paperwidth $pgww -paperheight pghh" } } othermm { if {$ps(width) != {} && $ps(height) != {}} { set pgww "[append ps(width) m]" set pghh "[append ps(height) m]" append options " -paperwidth $pgww -paperheight pghh" } } } # Orientation switch -- $ps(orient) { portrait {append options " -landscape false"} landscape {append options " -landscape true"} } if {$ps(dest) == "file" && $ps(filename) != {}} { eval $var(graph) postscript output $ps(filename) $options } else { set ch [open "| $ps(cmd)" w] puts $ch [eval $var(graph) postscript output $options] close $ch } # reset fonts $var(graph) configure \ -font "{$ds9($var(graph,title,family))} $var(graph,title,size) $var(graph,title,weight) $var(graph,title,slant)" $var(graph) xaxis configure \ -tickfont "{$ds9($var(axis,font,family))} $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "{$ds9($var(axis,title,family))} $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) yaxis configure \ -tickfont "{$ds9($var(axis,font,family))} $var(axis,font,size) $var(axis,font,weight) $var(axis,font,slant)" \ -titlefont "{$ds9($var(axis,title,family))} $var(axis,title,size) $var(axis,title,weight) $var(axis,title,slant)" $var(graph) legend configure \ -font "{$ds9($var(legend,font,family))} $var(legend,font,size) $var(legend,font,weight) $var(legend,font,slant)" \ -titlefont "{$ds9($var(legend,title,family))} $var(legend,title,size) $var(legend,title,weight) $var(legend,title,slant)" } ��������������������������������������������������������������������saods9/ds9/library/plotprocess.tcl������������������������������������������������������������������000644 �000765 �000000 �00000070345 12464211204 017615� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PrefsDialogPlot {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Plot}] lappend dprefs(tabs) [ttk::frame $w.plot] # Grid set f [ttk::labelframe $w.plot.grid -text [msgcat::mc {Grid}]] ttk::label $f.ttitle -text [msgcat::mc {Title}] FontMenuButton $f.title pap graph,title,family graph,title,size graph,title,weight graph,title,slant {} grid $f.ttitle $f.title -padx 2 -pady 2 -sticky w # Axis set f [ttk::labelframe $w.plot.axis -text [msgcat::mc {Axis}]] ttk::label $f.xtitle -text [msgcat::mc {X}] ttk::checkbutton $f.x -text [msgcat::mc {Grid}] -variable pap(axis,x,grid) ttk::radiobutton $f.xlinear -text [msgcat::mc {Linear}] \ -variable pap(axis,x,log) -value 0 ttk::radiobutton $f.xlog -text [msgcat::mc {Log}] \ -variable pap(axis,x,log) -value 1 ttk::label $f.ytitle -text [msgcat::mc {Y}] ttk::checkbutton $f.y -text [msgcat::mc {Grid}] -variable pap(axis,y,grid) ttk::radiobutton $f.ylinear -text [msgcat::mc {Linear}] \ -variable pap(axis,y,log) -value 0 ttk::radiobutton $f.ylog -text [msgcat::mc {Log}] \ -variable pap(axis,y,log) -value 1 ttk::label $f.ttextlab -text [msgcat::mc {Axis Title}] FontMenuButton $f.textlab pap axis,title,family axis,title,size axis,title,weight axis,title,slant {} ttk::label $f.tnumlab -text [msgcat::mc {Axis Numbers}] FontMenuButton $f.numlab pap axis,font,family axis,font,size axis,font,weight axis,font,slant {} grid $f.xtitle $f.x $f.xlinear $f.xlog -padx 2 -pady 2 -sticky w grid $f.ytitle $f.y $f.ylinear $f.ylog -padx 2 -pady 2 -sticky w grid $f.ttextlab $f.textlab -padx 2 -pady 2 -sticky w grid $f.tnumlab $f.numlab -padx 2 -pady 2 -sticky w # Dataset set f [ttk::labelframe $w.plot.dataset -text [msgcat::mc {Dataset}]] # Show ttk::checkbutton $f.show -text [msgcat::mc {Show}] -variable pap(show) grid $f.show -padx 2 -pady 2 -sticky w # Shape ttk::label $f.shapetitle -text [msgcat::mc {Shape}] ttk::menubutton $f.shape -textvariable pap(shape,symbol) \ -menu $f.shape.menu PlotLineShapeMenu $f.shape.menu pap(shape,symbol) ttk::checkbutton $f.shapefill -text [msgcat::mc {Fill}] \ -variable pap(shape,fill) ColorMenuButton $f.shapecolor pap shape,color {} grid $f.shapetitle $f.shape $f.shapefill $f.shapecolor \ -padx 2 -pady 2 -sticky w # Smooth ttk::label $f.smoothtitle -text [msgcat::mc {Smooth}] ttk::menubutton $f.smooth -textvariable pap(smooth) \ -menu $f.smooth.menu PlotLineSmoothMenu $f.smooth.menu pap(smooth) grid $f.smoothtitle $f.smooth -padx 2 -pady 2 -sticky w # Color ttk::label $f.colortitle -text [msgcat::mc {Color}] ColorMenuButton $f.color pap color {} grid $f.colortitle $f.color -padx 2 -pady 2 -sticky w # Width ttk::label $f.widthtitle -text [msgcat::mc {Width}] ttk::menubutton $f.width -textvariable pap(width) -menu $f.width.menu WidthDashMenu $f.width.menu pap width dash {} {} grid $f.widthtitle $f.width -padx 2 -pady 2 -sticky w # Error ttk::label $f.errortitle -text [msgcat::mc {Error}] ttk::checkbutton $f.error -text [msgcat::mc {Show}] \ -variable pap(error) ttk::checkbutton $f.errorcap -text [msgcat::mc {Cap}] \ -variable pap(error,cap) ColorMenuButton $f.errorcolor pap error,color {} ttk::menubutton $f.errorwidth -textvariable pap(error,width) \ -menu $f.errorwidth.menu WidthDashMenu $f.errorwidth.menu pap width dash {} {} grid $f.errortitle $f.error $f.errorcap $f.errorcolor $f.errorwidth \ -padx 2 -pady 2 -sticky w pack $w.plot.grid $w.plot.axis $w.plot.dataset \ -side top -fill both -expand true } proc ProcessPlotCmd {xarname iname buf fn} { upvar $xarname xar upvar $iname i global iap set varname $iap(tt) set id 0 # check for next command line option if {[string range [lindex $xar $i] 0 0] != {-}} { # determine which plot switch -- [string tolower [lindex $xar $i]] { {} - bar - scatter - new {} data - load - save - clear - dup - duplicate - stats - statistics - list - loadconfig - saveconfig - page - pagesetup - print - close - mode - axis - legend - font - title - show - color - fill - fillcolor - error - errorbar - barmode - name - shape - relief - smooth - width - dash - dataset - select - graph - line - view { set varname [lindex $iap(windows) end] set id [lsearch $iap(windows) $varname] } default { set varname [lindex $xar $i] set id [lsearch $iap(windows) $varname] incr i } } } # we better have a tt by now if {$id == -1} { Error "[msgcat::mc {Unable to find plot window}] $varname" return } upvar #0 $varname var global $varname # check for next command line option if {[string range [lindex $xar $i] 0 0] != {-}} { # now, process plot command switch -- [string tolower [lindex $xar $i]] { {} - bar - scatter { if {$buf != {}} { ProcessPlotNew $varname $xarname $iname $buf } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set txt [read $ch] close $ch ProcessPlotNew $varname $xarname $iname $txt } } else { ProcessPlotNew $varname $xarname $iname {} } } new { incr i switch -- [lindex $xar $i] { name { set varname [lindex $xar [expr $i+1]] incr i 2 } } if {$buf != {}} { ProcessPlotNew $varname $xarname $iname $buf } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set txt [read $ch] close $ch ProcessPlotNew $varname $xarname $iname $txt } } else { ProcessPlotNew $varname $xarname $iname {} } } data { incr i if {$buf != {}} { ProcessPlotData $varname $xarname $iname $buf } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set txt [read $ch] close $ch ProcessPlotData $varname $xarname $iname $txt } } } load { # File Menu set ff [lindex $xar [expr $i+1]] set dim [lindex $xar [expr $i+2]] incr i 2 PlotLoadDataFile $varname $ff $dim FileLast apdatafbox $ff } save { # File Menu incr i set ff [lindex $xar $i] PlotSaveDataFile $varname $ff FileLast apdatafbox $ff } clear { # File Menu PlotClearData $varname } dup - duplicate { # File Menu incr i set mm [lindex $xar $i] if {$mm == {}} { set mm 1 } elseif {![string is integer $mm]} { set mm 1 incr i -1 } PlotDupData $varname $mm } stats - statistics { # File Menu set var(stats) 1 PlotStats $varname } list { # File Menu set var(list) 1 PlotList $varname } loadconfig { # File Menu incr i set ff [lindex $xar $i] PlotLoadConfigFile $varname $ff FileLast apconfigfbox $ff } saveconfig { # File Menu incr i set ff [lindex $xar $i] PlotSaveConfigFile $varname $ff FileLast apconfigfbox $ff } page - pagesetup { # File Menu incr i ProcessPlotPageSetup $varname $xarname $iname } print { # File Menu incr i ProcessPlotPrint $varname $xarname $iname } close { # File Menu PlotDestroy $varname } mode { # Edit Menu incr i set var(mode) [lindex $xar $i] PlotChangeMode $varname } axis { # Graph Menu incr i ProcessPlotAxis $varname $xarname $iname } legend { # Graph Menu incr i ProcessPlotLegend $varname $xarname $iname } font { # Graph Menu incr i ProcessPlotFont $varname $xarname $iname } title { # Graph Menu incr i ProcessPlotTitle $varname $xarname $iname } barmode { incr i set var(bar,mode) [lindex $xar $i] $var(proc,updategraph) $varname } show { # Dataset Menu incr i set var(show) [FromYesNo [lindex $xar $i]] $var(proc,updateelement) $varname } color { incr i ProcessPlotColor $varname $xarname $iname } fill { incr i set var(fill) [FromYesNo [lindex $xar $i]] $var(proc,updateelement) $varname } fillcolor { incr i set var(fill,color) [lindex $xar $i] $var(proc,updateelement) $varname } error - errorbar { # Dataset Menu incr i ProcessPlotErrorBar $varname $xarname $iname } name { # Dataset Menu incr i set var(name) [lindex $xar $i] $var(proc,updateelement) $varname } shape { # Dataset Line Menu incr i ProcessPlotShape $varname $xarname $iname } relief { # Dataset Bar Menu incr i set var(bar,relief) [lindex $xar $i] $var(proc,updateelement) $varname } smooth { # Dataset Line Menu incr i set var(smooth) [lindex $xar $i] $var(proc,updateelement) $varname } width { # Dataset Line Menu incr i set var(width) [lindex $xar $i] $var(proc,updateelement) $varname } dash { # Dataset Line Menu incr i set var(dash) [FromYesNo [lindex $xar $i]] $var(proc,updateelement) $varname } dataset - select { # Select Menu incr i set var(data,current) [lindex $xar $i] PlotCurrentData $varname } graph { # backward compatibility incr i ProcessPlotGraph $varname $xarname $iname } line { # backward compatibility incr i ProcessPlotLine $varname $xarname $iname } view { # backward compatibility incr i ProcessPlotView $varname $xarname $iname } } } else { ProcessPlotNew $varname $xarname $iname {} } # force update update idletasks } proc ProcessPlotNew {varname xarname iname buf} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i # check for next command line option if {[string range [lindex $xar $i] 0 0] != {-}} { switch -- [string tolower [lindex $xar $i]] { line {incr i; ProcessPlotNewOne line $varname $xarname $iname $buf} bar {incr i;ProcessPlotNewOne bar $varname $xarname $iname $buf} scatter { incr i ProcessPlotNewOne scatter $varname $xarname $iname $buf } default {ProcessPlotNewOne line $varname $xarname $iname $buf} } } else { PlotLine $varname {} {} {} {} xy $buf incr i -1 } } proc ProcessPlotNewOne {which varname xarname iname buf} { upvar #0 $varname var global $varname upvar 3 $xarname xar upvar 3 $iname i if {[string range [lindex $xar $i] 0 0] != {-}} { switch -- [string tolower [lindex $xar $i]] { stdin {incr i; AnalysisPlotStdin $which $varname {} $buf} {} { switch $which { line {PlotLine $varname {} {} {} {} xy $buf} bar {PlotBar $varname {} {} {} {} xy $buf} scatter {PlotScatter $varname {} {} {} {} xy $buf} } } default { switch $which { line { PlotLine $varname {} \ [lindex $xar $i] \ [lindex $xar [expr $i+1]] \ [lindex $xar [expr $i+2]] \ [lindex $xar [expr $i+3]] \ $buf } bar { PlotBar $varname {} \ [lindex $xar $i] \ [lindex $xar [expr $i+1]] \ [lindex $xar [expr $i+2]] \ [lindex $xar [expr $i+3]] \ $buf } scatter { PlotScatter $varname {} \ [lindex $xar $i] \ [lindex $xar [expr $i+1]] \ [lindex $xar [expr $i+2]] \ [lindex $xar [expr $i+3]] \ $buf } } incr i 3 } } } else { switch $which { line {PlotLine $varname {} {} {} {} xy $buf} bar {PlotBar $varname {} {} {} {} xy $buf} scatter {PlotScatter $varname {} {} {} {} xy $buf} } incr i -1 } } proc ProcessPlotData {varname xarname iname buf} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i PlotRaise $varname PlotDataSet $varname [lindex $xar $i] $buf $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } # File Menu proc ProcessPlotPrint {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i global ps global current switch -- [string tolower [lindex $xar $i]] { destination {incr i; set ps(dest) [lindex $xar $i]} command {incr i; set ps(cmd) [lindex $xar $i]} filename {incr i; set ps(filename) [lindex $xar $i] } palette - color {incr i; set ps(color) [lindex $xar $i] } {} {PlotPostScript $varname} default {incr i -1; PlotPostScript $varname} } } proc ProcessPlotPageSetup {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i global ps switch -- [string tolower [lindex $xar $i]] { orientation - orient {incr i; set ps(orient) [lindex $xar $i]} pagesize - size {incr i; set ps(size) [lindex $xar $i] } } } # Graph Menu proc ProcessPlotAxis {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { x { incr i switch -- [string tolower [lindex $xar $i]] { grid {incr i; set var(axis,x,grid) [FromYesNo [lindex $xar $i]]} log {incr i; set var(axis,x,log) [FromYesNo [lindex $xar $i]]} flip {incr i; set var(axis,x,flip) [FromYesNo [lindex $xar $i]]} auto {incr i; set var(axis,x,auto) [FromYesNo [lindex $xar $i]]} min {incr i; set var(axis,x,min) [lindex $xar $i]} max {incr i; set var(axis,x,max) [lindex $xar $i]} format {incr i; set var(axis,x,format) [lindex $xar $i]} } } y { incr i switch -- [string tolower [lindex $xar $i]] { grid {incr i; set var(axis,y,grid) [FromYesNo [lindex $xar $i]]} log {incr i; set var(axis,y,log) [FromYesNo [lindex $xar $i]]} flip {incr i; set var(axis,y,flip) [FromYesNo [lindex $xar $i]]} auto {incr i; set var(axis,y,auto) [FromYesNo [lindex $xar $i]]} min {incr i; set var(axis,y,min) [lindex $xar $i]} max {incr i; set var(axis,y,max) [lindex $xar $i]} format {incr i; set var(axis,y,format) [lindex $xar $i]} } } } $var(proc,updategraph) $varname } proc ProcessPlotLegend {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { position {incr i; set var(legend,position) [lindex $xar $i]} default {set var(legend) [FromYesNo [lindex $xar $i]]} } $var(proc,updategraph) $varname } proc ProcessPlotFont {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { title { incr i switch -- [string tolower [lindex $xar $i]] { family - font {incr i; set var(graph,title,family) [lindex $xar $i]} size {incr i; set var(graph,title,size) [lindex $xar $i]} weight {incr i; set var(graph,title,weight) [lindex $xar $i]} slant {incr i; set var(graph,title,slant) [lindex $xar $i]} style { incr i switch [string tolower [lindex $xar $i]] { normal { set var(graph,title,weight) normal set var(graph,title,slant) roman } bold { set var(graph,title,weight) bold set var(graph,title,slant) roman } italic { set var(graph,title,weight) normal set var(graph,title,slant) italic } } } } } axestitle - labels { incr i switch -- [string tolower [lindex $xar $i]] { family - font {incr i; set var(axis,title,family) [lindex $xar $i]} size {incr i; set var(axis,title,size) [lindex $xar $i]} weight {incr i; set var(axis,title,weight) [lindex $xar $i]} slant {incr i; set var(axis,title,slant) [lindex $xar $i]} style { incr i switch [string tolower [lindex $xar $i]] { normal { set var(axis,title,weight) normal set var(axis,title,slant) roman } bold { set var(axis,title,weight) bold set var(axis,title,slant) roman } italic { set var(axis,title,weight) normal set var(axis,title,slant) italic } } } } } axesnumbers - numbers { incr i switch -- [string tolower [lindex $xar $i]] { family - font {incr i; set var(axis,font,family) [lindex $xar $i]} size {incr i; set var(axis,font,size) [lindex $xar $i]} weight {incr i; set var(axis,font,weight) [lindex $xar $i]} slant {incr i; set var(axis,font,slant) [lindex $xar $i]} style { incr i switch [string tolower [lindex $xar $i]] { normal { set var(axis,font,weight) normal set var(axis,font,slant) roman } bold { set var(axis,font,weight) bold set var(axis,font,slant) roman } italic { set var(axis,font,weight) normal set var(axis,font,slant) italic } } } } } legendtitle { incr i switch -- [string tolower [lindex $xar $i]] { family - font {incr i; set var(legend,title,family) [lindex $xar $i]} size {incr i; set var(legend,title,size) [lindex $xar $i]} weight {incr i; set var(legend,title,weight) [lindex $xar $i]} slant {incr i; set var(legend,title,slant) [lindex $xar $i]} } } legend { incr i switch -- [string tolower [lindex $xar $i]] { family - font {incr i; set var(legend,font,family) [lindex $xar $i]} size {incr i; set var(legend,font,size) [lindex $xar $i]} weight {incr i; set var(legend,font,weight) [lindex $xar $i]} slant {incr i; set var(legend,font,slant) [lindex $xar $i]} } } } $var(proc,updategraph) $varname } proc ProcessPlotTitle {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { x - xaxis {incr i; set var(axis,x,title) [lindex $xar $i]} y - yaxis {incr i; set var(axis,y,title) [lindex $xar $i]} legend {incr i; set var(legend,title) [lindex $xar $i]} default {set var(graph,title) [lindex $xar $i]} } $var(proc,updategraph) $varname } proc ProcessPlotErrorBar {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { cap {incr i; set var(error,cap) [FromYesNo [lindex $xar $i]]} color {incr i; set var(error,color) [lindex $xar $i]} width {incr i; set var(error,width) [lindex $xar $i]} default {set var(error) [FromYesNo [lindex $xar $i]]} } $var(proc,updateelement) $varname } # Dataset Menu proc ProcessPlotShape {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { fill {incr i; set var(shape,fill) [FromYesNo [lindex $xar $i]]} color {incr i; set var(shape,color) [lindex $xar $i]} default {set var(shape,symbol) [lindex $xar $i]} } $var(proc,updateelement) $varname } proc ProcessPlotColor {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { discrete - line - linear - step - quadratic - bar { # backward compatibility incr i set var(color) [lindex $xar $i] } error - errorbar { # backward compatibility incr i set var(error,color) [lindex $xar $i] } default { # Dataset Menu set var(color) [lindex $xar $i] } } $var(proc,updateelement) $varname } # backward compatibility proc ProcessPlotGraph {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { grid { incr i; switch -- [string tolower [lindex $xar $i]] { x {incr i; set var(axis,x,grid) [FromYesNo [lindex $xar $i]]} y {incr i; set var(axis,y,grid) [FromYesNo [lindex $xar $i]]} default { # backward compatibility set var(axis,y,grid) [FromYesNo [lindex $xar $i]] set var(axis,x,grid) [FromYesNo [lindex $xar $i]] } } } log { incr i; switch -- [string tolower [lindex $xar $i]] { x {incr i; set var(axis,x,log) [FromYesNo [lindex $xar $i]]} y {incr i; set var(axis,y,log) [FromYesNo [lindex $xar $i]]} } } flip { incr i; switch -- [string tolower [lindex $xar $i]] { x {incr i; set var(axis,x,flip) [FromYesNo [lindex $xar $i]]} y {incr i; set var(axis,y,flip) [FromYesNo [lindex $xar $i]]} } } format { incr i switch -- [string tolower [lindex $xar $i]] { x {incr i; set var(axis,x,format) [lindex $xar $i]} y {incr i; set var(axis,y,format) [lindex $xar $i]} } } range { incr i switch -- [string tolower [lindex $xar $i]] { x { incr i switch -- [string tolower [lindex $xar $i]] { auto { incr i set var(axis,x,auto) [FromYesNo [lindex $xar $i]] } min {incr i; set var(axis,x,min) [lindex $xar $i]} max {incr i; set var(axis,x,max) [lindex $xar $i]} } } y { incr i switch -- [string tolower [lindex $xar $i]] { auto { incr i set var(axis,y,auto) [FromYesNo [lindex $xar $i]] } min {incr i; set var(axis,y,min) [lindex $xar $i]} max {incr i; set var(axis,y,max) [lindex $xar $i]} } } } } labels { incr i switch -- [string tolower [lindex $xar $i]] { title {incr i; set var(graph,title) [lindex $xar $i]} xaxis {incr i; set var(axis,x,title) [lindex $xar $i]} yaxis {incr i; set var(axis,y,title) [lindex $xar $i]} legend {incr i; set var(legend,title) [lindex $xar $i]} } } type { # backward compatibility incr i switch -- [string tolower [lindex $xar $i]] { line - bar {} } } scale { # backward compatibility incr i switch -- [string tolower [lindex $xar $i]] { linearlinear { set var(axis,x,log) 0 set var(axis,y,log) 0 } linearlog { set var(axis,x,log) 0 set var(axis,y,log) 1 } loglinear { set var(axis,x,log) 1 set var(axis,y,log) 0 } loglog { set var(axis,x,log) 1 set var(axis,y,log) 1 } } } } $var(proc,updategraph) $varname } # backward compatibility proc ProcessPlotView {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { discrete { incr i set var(show) [FromYesNo [lindex $xar $i]] } line - linear { incr i if {[FromYesNo [lindex $xar $i]]} { set var(show) 1 set var(smooth) linear } } step { incr i if {[FromYesNo [lindex $xar $i]]} { set var(show) 1 set var(smooth) step } } quadratic { incr i if {[FromYesNo [lindex $xar $i]]} { set var(show) 1 set var(smooth) quadratic } } error - errorbar { incr i set var(error) [FromYesNo [lindex $xar $i]] } } $var(proc,updateelement) $varname } # backward compatibility proc ProcessPlotLine {varname xarname iname} { upvar #0 $varname var global $varname upvar 2 $xarname xar upvar 2 $iname i switch -- [string tolower [lindex $xar $i]] { discrete { incr i set var(shape,symbol) [lindex $xar $i] } line - linear - step - quadratic - error - errorbar { incr i switch -- [string tolower [lindex $xar $i]] { width { incr i set var(width) [lindex $xar $i] } dash { incr i set var(dash) [FromYesNo [lindex $xar $i]] } style { incr i set var(error) 1 } } } } $var(proc,updateelement) $varname } proc ProcessSendPlotCmd {proc id param} { global iap set i 0 # determine which plot switch -- [string tolower [lindex $param $i]] { {} - stats - statistics - list - mode - axis - legend - font - title - barmode - show - color - error - errorbar - name - shape - relief - smooth - width - dash - dataset - select { set varname [lindex $iap(windows) end] set idd [lsearch $iap(windows) $varname] } default { set varname [lindex $param $i] set idd [lsearch $iap(windows) $varname] incr i } } # we better have a tt by now if {$idd == -1} { Error "[msgcat::mc {Unable to find plot window}] $varname" return } upvar #0 $varname var global $varname # now, process plot command switch -- [string tolower [lindex $param $i]] { {} {$proc $id "$iap(windows)\n"} stats - statistics {$proc $id "[PlotStatsGenerate $varname]"} list {$proc $id "[PlotListGenerate $varname]"} mode {$proc $id "$var(mode)\n"} axis { incr i switch -- [string tolower [lindex $param $i]] { x { incr i switch -- [string tolower [lindex $param $i]] { grid {$proc $id [ToYesNo $var(axis,x,grid)]} log {$proc $id [ToYesNo $var(axis,x,log)]} flip {$proc $id [ToYesNo $var(axis,x,flip)]} auto {$proc $id [ToYesNo $var(axis,x,auto)]} min {$proc $id "$var(axis,x,min)\n"} max {$proc $id "$var(axis,x,max)\n"} format {$proc $id "$var(axis,x,format)\n"} } } y { incr i switch -- [string tolower [lindex $param $i]] { grid {$proc $id [ToYesNo $var(axis,y,grid)]} log {$proc $id [ToYesNo $var(axis,y,log)]} flip {$proc $id [ToYesNo $var(axis,y,flip)]} auto {$proc $id [ToYesNo $var(axis,y,auto)]} min {$proc $id "$var(axis,y,min)\n"} max {$proc $id "$var(axis,y,max)\n"} format {$proc $id "$var(axis,y,format)\n"} } } } } legend { incr i switch -- [string tolower [lindex $param $i]] { position {$proc $id "$var(legend,position)\n"} default {$proc $id [ToYesNo $var(legend)]} } } font { incr i switch -- [string tolower [lindex $param $i]] { title { incr i switch -- [string tolower [lindex $param $i]] { family - font {$proc $id "$var(graph,title,family)\n"} size {$proc $id "$var(graph,title,size)\n"} weight {$proc $id "$var(graph,title,weight)\n"} slant {$proc $id "$var(graph,title,slant)\n"} } } axestitle - labels { incr i switch -- [string tolower [lindex $param $i]] { family - font {$proc $id "$var(axis,title,family)\n"} size {$proc $id "$var(axis,title,size)\n"} weight {$proc $id "$var(axis,title,weight)\n"} slant {$proc $id "$var(axis,title,slant)\n"} } } axesnumbers - numbers { incr i switch -- [string tolower [lindex $param $i]] { family - font {$proc $id "$var(axis,font,family)\n"} size {$proc $id "$var(axis,font,size)\n"} weight {$proc $id "$var(axis,font,weight)\n"} slant {$proc $id "$var(axis,font,slant)\n"} } } legendtitle { incr i switch -- [string tolower [lindex $param $i]] { family - font {$proc $id "$var(legend,title,family)\n"} size {$proc $id "$var(legend,title,size)\n"} weight {$proc $id "$var(legend,title,weight)\n"} slant {$proc $id "$var(legend,title,slant)\n"} } } legend { incr i switch -- [string tolower [lindex $param $i]] { family - font {$proc $id "$var(legend,font,family)\n"} size {$proc $id "$var(legend,font,size)\n"} weight {$proc $id "$var(legend,font,weight)\n"} slant {$proc $id "$var(legend,font,slant)\n"} } } } } title { incr i switch -- [string tolower [lindex $param $i]] { x - xaxis {$proc $id "$var(axis,x,title)\n"} y - yaxis {$proc $id "$var(axis,y,title)\n"} legend {$proc $id "$var(legend,title)\n"} default {$proc $id "$var(graph,title)\n"} } } barmode {$proc $id "$var(bar,mode)\n"} show {$proc $id [ToYesNo $var(show)]} color {$proc $id "$var(color)\n"} fill {$proc $id [ToYesNo $var(fill)]} fillcolor {$proc $id "$var(fill,color)\n"} error - errorbar { incr i switch -- [string tolower [lindex $param $i]] { cap {$proc $id [ToYesNo $var(error,cap)]} color {$proc $id "$var(error,color)\n"} width {$proc $id "$var(error,width)\n"} default {$proc $id [ToYesNo $var(error)]} } } name {$proc $id "$var(name)\n"} shape { incr i switch -- [string tolower [lindex $param $i]] { fill {$proc $id [ToYesNo $var(shape,fill)]} color {$proc $id "$var(shape,color)\n"} default {$proc $id "$var(shape,symbol)\n"} } } relief {$proc $id "$var(bar,relief)\n"} smooth {$proc $id "$var(smooth)\n"} width {$proc $id "$var(width)\n"} dash {$proc $id [ToYesNo $var(dash)]} dataset - select {$proc $id "$var(data,current)\n"} } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/plotscatter.tcl������������������������������������������������������������������000644 �000765 �000000 �00000016107 12464211204 017600� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # used by backup proc PlotScatterTool {} { global iap PlotScatter $iap(tt) [msgcat::mc {Scatter Plot Tool}] {} {} {} 2 {} } proc PlotScatter {tt wtt title xaxis yaxis dim data} { global iap # make the window name unique set ii [lsearch $iap(windows) $tt] if {$ii>=0} { incr iap(unique) append tt $iap(unique) } # set the window title if none if {$wtt == {}} { set wtt $tt } set varname $tt upvar #0 $varname var global $varname PlotScatterProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogScatter $varname PlotDataSet $varname $dim $data $var(proc,updategraph) $varname PlotStats $varname PlotList $varname } proc PlotScatterDialog {varname wtt title xaxis yaxis} { upvar #0 $varname var global $varname PlotScatterProc $varname PlotDialog $varname $wtt $title $xaxis $yaxis PlotDialogScatter $varname } proc PlotScatterProc {varname} { upvar #0 $varname var global $varname set var(proc,updategraph) PlotUpdateGraph set var(proc,updateelement) PlotScatterUpdateElement set var(proc,highlite) PlotScatterHighliteElement set var(proc,button) PlotScatterButton } proc PlotDialogScatter {varname} { upvar #0 $varname var global $varname global ds9 set var(seq) 0 # Dataset $var(mb).dataset add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(show) \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset add separator $var(mb).dataset add cascade -label [msgcat::mc {Shape}] \ -menu $var(mb).dataset.shape $var(mb).dataset add cascade -label [msgcat::mc {Error}] \ -menu $var(mb).dataset.error $var(mb).dataset add separator $var(mb).dataset add command -label "[msgcat::mc {Name}]..." \ -command [list DatasetNameDialog $varname] # Shape menu $var(mb).dataset.shape $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Circle}] \ -variable ${varname}(shape,symbol) -value circle \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Square}] \ -variable ${varname}(shape,symbol) -value square \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Diamond}] \ -variable ${varname}(shape,symbol) -value diamond \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Plus}] \ -variable ${varname}(shape,symbol) -value plus \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Cross}] \ -variable ${varname}(shape,symbol) -value cross \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Simple Plus}] \ -variable ${varname}(shape,symbol) -value splus \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Simple Cross}] \ -variable ${varname}(shape,symbol) -value scross \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Triangle}] \ -variable ${varname}(shape,symbol) -value triangle \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add radiobutton \ -label [msgcat::mc {Arrow}] \ -variable ${varname}(shape,symbol) -value arrow \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add separator $var(mb).dataset.shape add checkbutton \ -label [msgcat::mc {Fill}] \ -variable ${varname}(shape,fill) \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.shape add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.shape.color # Color PlotColorMenu $var(mb).dataset.shape.color $varname shape,color \ [list PlotScatterUpdateElement $varname] # Error menu $var(mb).dataset.error $var(mb).dataset.error add checkbutton -label [msgcat::mc {Show}] \ -variable ${varname}(error) \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.error add checkbutton -label [msgcat::mc {Cap}] \ -variable ${varname}(error,cap) \ -command [list PlotScatterUpdateElement $varname] $var(mb).dataset.error add separator $var(mb).dataset.error add cascade -label [msgcat::mc {Color}] \ -menu $var(mb).dataset.error.color $var(mb).dataset.error add cascade -label [msgcat::mc {Width}] \ -menu $var(mb).dataset.error.width PlotColorMenu $var(mb).dataset.error.color $varname error,color \ [list PlotScatterUpdateElement $varname] WidthDashMenu $var(mb).dataset.error.width $varname error,width {} \ [list PlotScatterUpdateElement $varname] {} # graph set var(type) scatter set var(graph) [blt::graph $var(top).scatter \ -width 600 \ -height 500 \ -highlightthickness 0 \ ] pack $var(graph) -expand yes -fill both PlotChangeMode $varname } proc PlotScatterUpdateElement {varname} { upvar #0 $varname var global $varname # warning: uses current vars if {$var(data,total) == 0} { return } set nn $var(data,current) PlotGetVar $varname $nn if {$var(shape,symbol) == "none"} { set var(shape,symbol) circle } if {$var(shape,fill)} { set clr $var(shape,color) } else { set clr {} } if {$var(error)} { set show both } else { set show none } if {$var(error,cap)} { set cap [expr $var(error,width)+3] } else { set cap 0 } $var(graph) element configure "d-${nn}" \ -label "$var(name)" -hide [expr !$var(show)] \ -symbol $var(shape,symbol) \ -fill $clr -outline $var(shape,color) \ -linewidth 0 -pixels 5 -scalesymbols no \ -showerrorbars $show -errorbarcolor $var(error,color) \ -errorbarwidth $var(error,width) -errorbarcap $cap $var(graph) pen configure active -color blue \ -symbol $var(shape,symbol) \ -linewidth 0 -pixels 5 \ -showerrorbars $show -errorbarcolor $var(error,color) \ -errorbarwidth $var(error,width) -errorbarcap $cap } proc PlotScatterButton {varname x y} { upvar #0 $varname var global $varname if {$var(data,total) == 0} { return } if {$var(callback) == {}} { return } set rr [$var(graph) element closest $x $y] set elem [lindex $rr 1] set row [lindex $rr 3] if {$elem != {}} { if {$row != {}} { $var(graph) element deactivate $elem $var(graph) element activate $elem $row # rows start at 1 eval "$var(callback) [expr $row+1]" } else { $var(graph) element deactivate $elem eval "$var(callback) {}" } } } proc PlotScatterHighliteElement {varname rowlist} { upvar #0 $varname var global $varname if {$var(data,total) == 0} { return } if {$var(show)} { $var(graph) element deactivate d-1 if {$rowlist != {}} { # can have multiple rows eval "$var(graph) element activate d-1 $rowlist" } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/point.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000005637 12514261633 016402� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PointDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(proc,apply) PointApply set var(proc,close) PointClose set var(proc,coordCB) PointCoordCB # base MarkerBaseCenterDialog $varname # menus $var(mb) add cascade -label [msgcat::mc {Shape}] -menu $var(mb).shape menu $var(mb).shape $var(mb).shape add radiobutton -label [msgcat::mc {Circle}] \ -variable ${varname}(shape) -value circle \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {Box}] \ -variable ${varname}(shape) -value box \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {Diamond}] \ -variable ${varname}(shape) -value diamond \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {Cross}] \ -variable ${varname}(shape) -value cross \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {X}] \ -variable ${varname}(shape) -value x \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {Arrow}] \ -variable ${varname}(shape) -value arrow \ -command "PointShape $varname" $var(mb).shape add radiobutton -label [msgcat::mc {BoxCircle}] \ -variable ${varname}(shape) -value boxcircle \ -command "PointShape $varname" # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis # plot3d MarkerAnalysisPlot3dDialog $varname # init set var(shape) [$var(frame) get marker $var(id) point shape] set var(size) [$var(frame) get marker $var(id) point size] set f $var(top).param # size ttk::label $f.tsize -text [msgcat::mc {Size}] ttk::entry $f.size -textvariable ${varname}(size) -width 13 ttk::label $f.usize -text [msgcat::mc {Pixels}] grid $f.tsize $f.size $f.usize -padx 2 -pady 2 -sticky w } # actions proc PointClose {varname} { upvar #0 $varname var global $varname MarkerBaseCenterClose $varname } proc PointApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) point size $var(size) MarkerBaseCenterApply $varname } # callbacks proc PointCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "PointCoordCB" } MarkerAnalysisPlot3dSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname } # support proc PointShape {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) point shape $var(shape) } �������������������������������������������������������������������������������������������������saods9/ds9/library/polygon.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000003665 12514261633 016737� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PolygonDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(proc,apply) PolygonApply set var(proc,close) PolygonClose set var(proc,coordCB) PolygonCoordCB # base MarkerBaseCenterDialog $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis MarkerAnalysisStatsDialog $varname MarkerAnalysisHistogramDialog $varname MarkerAnalysisPlot3dDialog $varname # init MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback rotate MarkerBaseCenterRotateCB $varname set f $var(top).param # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w } # actions proc PolygonClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc PolygonApply {varname} { upvar #0 $varname var global $varname MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } # callbacks proc PolygonCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "PolygonCoordCB" } MarkerAnalysisStatsSystem $varname MarkerAnalysisPlot3dSystem $varname MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } ���������������������������������������������������������������������������saods9/ds9/library/prefs.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000063543 12630076010 016360� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PrefsDef {} { global prefs global iprefs global ds9 set iprefs(top) .pf set iprefs(mb) .pfmb set iprefs(tabs) {} set prefs(version) [lindex $ds9(version) 0] } proc LoadPrefs {} { global ds9 global prefs set ds9(prefs) [SourceInitFile {.prf}] if {$ds9(prefs)} { # ok, this is a major kludge to fix a major booboo. # Beta versions generated prefs with version set to # something like '7.4b7'. We need to remove the 'b7' part. set ll [string first {b} $prefs(version)] if {$ll != -1} { set ll [expr $ll -1] set prefs(version) [string range $prefs(version) 0 $ll] } FixPrefs $prefs(version) } } proc PostPrefs {} { global ds9 if {$ds9(prefs)} { PrefsDefaultFont set ds9(prefs) 0 } } proc CheckPrefs {} { global ds9 global prefs set rr [string compare $prefs(version) [lindex $ds9(version) 0]] switch $rr { -1 { if {[tk_messageBox -type yesno -icon question -message [msgcat::mc {DS9 has detected an older preferences file, do you wish to update?}]] == {yes}} { SavePrefs } } 0 {} 1 { tk_messageBox -type ok -icon warning -message [msgcat::mc {DS9 has detected a newer version of a preferences file.}] } } } proc ClearPrefs {} { DeleteInitFile {.prf} # Info [msgcat::mc {Preferences have been reset to the default values. Please restart DS9 for these changes to take effect}] } proc SavePrefs {} { global ds9 # make sure old prefs files are removed DeleteInitFile {.prf} # open prefs file if {[catch {set ch [open [file join [GetEnvHome] ".$ds9(app).prf"] w]}]} { Error [msgcat::mc {An error has occurred while saving}] return } puts $ch "global ds9" puts $ch "global prefs" puts $ch "set prefs(version) [lindex $ds9(version) 0]" # check for wrong prefs puts $ch "\# this is a check for to ensure a match between the" puts $ch "\# current ds9 version matches the prefs version" puts $ch "if {\[string compare \$prefs(version) \[lindex \$ds9(version)\ 0\]] == 1} {" puts $ch " return" puts $ch "}" # Basic global pds9 puts $ch "global pds9" puts $ch "array set pds9 \{ [array get pds9] \}" global current global pcurrent puts $ch "global current" puts $ch "global pcurrent" puts $ch "array set pcurrent \{ [array get pcurrent] \}" puts $ch {array set current [array get pcurrent]} global view global pview puts $ch "global view" puts $ch "global pview" puts $ch "array set pview \{ [array get pview] \}" puts $ch {array set view [array get pview]} global phttp puts $ch "global phttp" puts $ch "array set phttp \{ [array get phttp] \}" global pbuttons puts $ch "global pbuttons" puts $ch "array set pbuttons \{ [array get pbuttons] \}" global ppanner puts $ch "global ppanner" puts $ch "array set ppanner \{ [array get ppanner] \}" global pmagnifier puts $ch "global pmagnifier" puts $ch "array set pmagnifier \{ [array get pmagnifier] \}" # File global ps global pps puts $ch "global ps" puts $ch "global pps" puts $ch "array set pps \{ [array get pps] \}" puts $ch {array set ps [array get pps]} global pr global ppr puts $ch "global pr" puts $ch "global ppr" puts $ch "array set ppr \{ [array get ppr] \}" puts $ch {array set pr [array get ppr]} # Frame global blink global pblink puts $ch "global blink" puts $ch "global pblink" puts $ch "array set pblink \{ [array get pblink] \}" puts $ch {array set blink [array get pblink]} global tile global ptile puts $ch "global tile" puts $ch "global ptile" puts $ch "array set ptile \{ [array get ptile] \}" puts $ch {array set tile [array get ptile]} global threed global pthreed puts $ch "global threed" puts $ch "global pthreed" puts $ch "array set pthreed \{ [array get pthreed] \}" puts $ch {array set threed [array get pthreed]} # Bin global bin global pbin puts $ch "global bin" puts $ch "global pbin" puts $ch "array set pbin \{ [array get pbin] \}" puts $ch {array set bin [array get pbin]} # Zoom global panzoom global ppanzoom puts $ch "global panzoom" puts $ch "global ppanzoom" puts $ch "array set ppanzoom \{ [array get ppanzoom] \}" puts $ch {array set panzoom [array get ppanzoom]} # Scale global scale global pscale puts $ch "global scale" puts $ch "global pscale" puts $ch "array set pscale \{ [array get pscale] \}" puts $ch {array set scale [array get pscale]} global minmax global pminmax puts $ch "global minmax" puts $ch "global pminmax" puts $ch "array set pminmax \{ [array get pminmax] \}" puts $ch {array set minmax [array get pminmax]} global zscale global pzscale puts $ch "global zscale" puts $ch "global pzscale" puts $ch "array set pzscale \{ [array get pzscale] \}" puts $ch {array set zscale [array get pzscale]} # Region global marker global pmarker puts $ch "global marker" puts $ch "global pmarker" puts $ch "array set pmarker \{ [array get pmarker] \}" puts $ch {array set marker [array get pmarker]} # WCS global wcs global pwcs puts $ch "global wcs" puts $ch "global pwcs" puts $ch "array set pwcs \{ [array get pwcs] \}" puts $ch {array set wcs [array get pwcs]} # Analysis global ime global pime puts $ch "global pime" puts $ch "array set pime \{ [array get pime] \}" puts $ch {array set ime [array get pime]} global pgraph puts $ch "global pgraph" puts $ch "array set pgraph \{ [array get pgraph] \}" global pcoord puts $ch "global pcoord" puts $ch "array set pcoord \{ [array get pcoord] \}" global pexamine puts $ch "global pexamine" puts $ch "array set pexamine \{ [array get pexamine] \}" global pixel global ppixel puts $ch "global pixel" puts $ch "global ppixel" puts $ch "array set ppixel \{ [array get ppixel] \}" puts $ch {array set pixel [array get ppixel]} global mask global pmask puts $ch "global mask" puts $ch "global pmask" puts $ch "array set pmask \{ [array get pmask] \}" puts $ch {array set mask [array get pmask]} global contour global pcontour puts $ch "global contour" puts $ch "global pcontour" puts $ch "array set pcontour \{ [array get pcontour] \}" puts $ch {array set contour [array get pcontour]} global grid global pgrid puts $ch "global grid" puts $ch "global pgrid" puts $ch "array set pgrid \{ [array get pgrid] \}" puts $ch {array set grid [array get pgrid]} global block global pblock puts $ch "global block" puts $ch "global pblock" puts $ch "array set pblock \{ [array get pblock] \}" puts $ch {array set block [array get pblock]} global smooth global psmooth puts $ch "global smooth" puts $ch "global psmooth" puts $ch "array set psmooth \{ [array get psmooth] \}" puts $ch {array set smooth [array get psmooth]} global nres global pnres puts $ch "global nres" puts $ch "global pnres" puts $ch "array set nres \{ [array get pnres] \}" puts $ch {array set nres [array get pnres]} global pcat puts $ch "global pcat" puts $ch "array set pcat \{ [array get pcat] \}" global pvo puts $ch "global pvo" puts $ch "array set pvo \{ [array get pvo] \}" global pap puts $ch "global pap" puts $ch "array set pap \{ [array get pap] \}" global panalysis puts $ch "global panalysis" puts $ch "array set panalysis \{ [array get panalysis] \}" # Other puts $ch "" puts $ch "\# Colorbar prefs" global colorbar global pcolorbar puts $ch "global colorbar" puts $ch "global pcolorbar" puts $ch "array set pcolorbar \{ [array get pcolorbar] \}" puts $ch {array set colorbar [array get pcolorbar]} # and close close $ch } # Backward Compatibility proc FixVar {varname ovarname} { global aa bb set aa $varname set bb $ovarname uplevel #0 { if {[info exists $bb]} { set $aa [expr $$bb] unset $bb } } } proc FixVarRm {ovarname} { global aa set aa $ovarname uplevel #0 { if {[info exists $aa]} { unset $aa } } } proc FixFontVar {weightname slantname stylename} { global aa bb cc set aa $weightname set bb $slantname set cc $stylename uplevel #0 { if {[info exists $cc]} { switch [expr $$cc] { normal { set $aa normal set $bb roman } bold { set $aa bold set $bb roman } italic { set $aa normal set $bb italic } } unset $cc } } } # we only support 6.x and higher proc FixPrefs {version} { set major [lindex [split $version {.}] 0] if {$major == {5}} { set version 5.x } switch $version { 5.x { FixPrefs5.xto6.0 FixPrefs6.0to6.1 FixPrefs6.1to6.2 FixPrefs6.2to7.0 FixPrefs7.0to7.1 FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 6.0 { FixPrefs6.0to6.1 FixPrefs6.1to6.2 FixPrefs6.2to7.0 FixPrefs7.0to7.1 FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 6.1 - 6.1.1 - 6.1.2 { FixPrefs6.1to6.2 FixPrefs6.2to7.0 FixPrefs7.0to7.1 FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 6.2 { FixPrefs6.2to7.0 FixPrefs7.0to7.1 FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 7.0 { FixPrefs7.0to7.1 FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 7.1 { FixPrefs7.1to7.2 FixPrefs7.2to7.3 } 7.2 { FixPrefs7.2to7.3 } 7.3 - 7.3.1 - 7.3.2 { } } } proc FixPrefs7.2to7.3 {} { global current if {$current(mode) == {pointer}} { set current(mode) region } FixVar pbuttons(edit,region) pbuttons(edit,pointer) FixVar pbuttons(frame,match,cube,image) pbuttons(frame,match,cube) FixVar pbuttons(frame,lock,cube,image) pbuttons(frame,lock,cube) FixVar pap(axis,x,grid) pap(graph,x,grid) FixVar pap(axis,x,log) pap(graph,x,log) FixVar pap(axis,x,flip) pap(graph,x,flip) FixVar pap(axis,y,grid) pap(graph,y,grid) FixVar pap(axis,y,log) pap(graph,y,log) FixVar pap(axis,y,flip) pap(graph,y,flip) FixVar pap(graph,title,family) pap(titleFont) FixVar pap(graph,title,size) pap(titleSize) FixVar pap(graph,title,weight) pap(titleWeight) FixVar pap(graph,title,slant) pap(titleSlant) FixVar pap(axis,title,family) pap(textlabFont) FixVar pap(axis,title,size) pap(textlabSize) FixVar pap(axis,title,weight) pap(textlabWeight) FixVar pap(axis,title,slant) pap(textlabSlant) FixVar pap(axis,font,family) pap(numlabFont) FixVar pap(axis,font,size) pap(numlabSize) FixVar pap(axis,font,weight) pap(numlabWeight) FixVar pap(axis,font,slant) pap(numlabSlant) FixVar pap(show) pap(linear) FixVar pap(shape,color) pap(discrete,color) FixVar pap(shape,fill) pap(discrete,fill) FixVar pap(width) pap(linear,width) FixVar pap(color) pap(linear,color) if {[info exists pap(linear,dash)]} { set pap(linear,dash) [FromYesNo $pap(linear,dash)] } FixVar pap(dash) pap(linear,dash) if {[info exists pap(discrete)]} { if {$pap(discrete)} { FixVar pap(shape,symbol) pap(discrete,symbol) } else { FixVarRm pap(discrete,symbol) } } FixVarRm pap(bar) FixVarRm pap(bar,color) FixVarRm pap(discrete) FixVarRm pap(linear,dash) FixVarRm pap(quadratic) FixVarRm pap(quadratic,width) FixVarRm pap(quadratic,color) FixVarRm pap(quadratic,dash) FixVarRm pap(step) FixVarRm pap(step,color) FixVarRm pap(step,dash) FixVarRm pap(step,width) } proc FixPrefs7.1to7.2 {} { FixVar pbuttons(file,xpa,info) pbuttons(file,xpa) FixVar pcurrent(align) pwcs(align) } proc FixPrefs7.0to7.1 {} { global pap if {[info exists pap(grid)]} { set pap(grid,x) $pap(grid) set pap(grid,y) $pap(grid) switch $pap(grid,log) { linearlinear { set pap(grid,xlog) 0 set pap(grid,ylog) 0 } linearlog { set pap(grid,xlog) 0 set pap(grid,ylog) 1 } loglinear { set pap(grid,xlog) 1 set pap(grid,ylog) 0 } loglog { set pap(grid,xlog) 1 set pap(grid,ylog) 1 } } unset pap(grid) unset pap(grid,log) } } proc FixPrefs6.2to7.0 {} { global ps global pps switch $pps(scale) { scaled - fixed { set ps(scale) 100 set pps(scale) 100 } } global colorbar global pcolorbar set colorbar(map) [string tolower $colorbar(map)] set pcolorbar(map) [string tolower $pcolorbar(map)] FixVar pbuttons(frame,match,frame,wcs) pbuttons(frame,matchframe,wcs) FixVar pbuttons(frame,match,frame,image) pbuttons(frame,matchframe,image) FixVar pbuttons(frame,match,frame,physical) pbuttons(frame,matchframe,physical) FixVar pbuttons(frame,match,frame,amplifier) pbuttons(frame,matchframe,amplifier) FixVar pbuttons(frame,match,frame,detector) pbuttons(frame,matchframe,detector) FixVar pbuttons(bin,match) pbuttons(frame,matchbin) FixVar pbuttons(scale,match) pbuttons(frame,matchscale) FixVar pbuttons(color,match) pbuttons(frame,matchcolor) FixVar ppanner(compass) ppanner(compass,image) FixVarRm ppanner(compass,wcs,system) FixVarRm ppanner(compass,wcs,sky) global pmarker FixVarRm pmarker(dialog,system) FixVarRm pmarker(dialog,sky) FixVarRm pmarker(dialog,skyformat) FixVarRm pmarker(dialog,dist,system) FixVarRm pmarker(dialog,dist,format) # mousewheel MacOSX Lion global tcl_platform global ppanzoom global pbin switch -- $tcl_platform(os) { Darwin { switch [lindex [split $tcl_platform(osVersion) {.}] 0] { 11 { set ppanzoom(wheel,factor) 1.01 set pbin(wheel,factor) 1.01 } } } } global pcoord FixVarRm pcoord(sky) FixVarRm pcoord(skyformat) } proc FixPrefs6.1to6.2 {} { FixVar pbuttons(frame,matchframe,wcs) pbuttons(frame,matchframe) global pds9 switch -- $pds9(font) { helvetica - courier - times {} default {set pds9(font) helvetica} } switch -- $pds9(font,size) { 10 {set pds9(font,size) 9} } FixVar pmarker(centroid,auto) pmarker(autocentroid) FixVarRm marker(autocentroid) FixFontVar pds9(font,weight) pds9(font,slant) pds9(font,style) FixFontVar pmarker(font,weight) pmarker(font,slant) pmarker(font,style) FixFontVar pcolorbar(font,weight) pcolorbar(font,slant) \ pcolorbar(font,style) } proc FixPrefs6.0to6.1 {} { # ds9 FixVar pds9(automarker) ds9(automarker) FixVar pds9(xpa) ds9(xpa) FixVar pds9(samp) ds9(samp,auto) FixVar pds9(confirm) ds9(confirm) FixVar pds9(bg) ds9(bg,color) FixVar pds9(nan) ds9(nan,color) FixVar pds9(dialog) ds9(dialog) FixVar pds9(language) ds9(language) FixVar pds9(language,name) ds9(language,name) FixVar pds9(language,dir) ds9(language,dir) FixVar pds9(font) ds9(font) FixVar pds9(font,size) ds9(font,size) FixVar pds9(font,style) ds9(font,style) FixVar pcurrent(display) ds9(display,user) FixVar pcurrent(mode) pds9(mode) # note: versions 5.3 to 6.0 have array set ds9 [array get pds9] # which will set following ds9(var), so delete FixVarRm ds9(samp) FixVarRm ds9(backup) FixVarRm ds9(tcl) FixVarRm ds9(nan) # which will overwrite the following ds9(var), so reset global ds9 set ds9(bg) white # analysis FixVar panalysis(user) ds9(analysis,user) FixVar panalysis(user2) ds9(analysis,user2) FixVar panalysis(user3) ds9(analysis,user3) FixVar panalysis(user4) ds9(analysis,user4) global analysis catch {unset analysis} # magnifier FixVar pmagnifier(region) magnifier(region) FixVar pmagnifier(zoom) magnifier(zoom) FixVar pmagnifier(cursor) magnifier(cursor) global magnifier catch {unset magnifier} # panner FixVar ppanner(compass,image) panner(compass,image) FixVar ppanner(compass,wcs) panner(compass,wcs) FixVar ppanner(compass,wcs,system) panner(compass,wcs,system) FixVar ppanner(compass,wcs,sky) panner(compass,wcs,sky) global panner catch {unset panner} # examine FixVar pexamine(mode) examine(mode) FixVar pexamine(zoom) examine(zoom) global examine catch {unset examine} # vo FixVar pvo(server) vo(server) FixVar pvo(hv) vo(hv) FixVar pvo(method) vo(method) FixVar pvo(delay) vo(delay) global vo catch {unset vo} # http FixVar phttp(proxy) http(proxy) FixVar phttp(proxy,host) http(proxy,host) FixVar phttp(proxy,port) http(proxy,port) FixVar phttp(auth) http(auth) FixVar phttp(auth,user) http(auth,user) FixVar phttp(auth,passwd) http(auth,passwd) global http catch {unset http} # nres FixVar pnres(server) nres(server) # graph FixVar pgraph(horz,grid) graph(horz,grid) FixVar pgraph(horz,log) graph(horz,log) FixVar pgraph(vert,grid) graph(vert,grid) FixVar pgraph(vert,log) graph(vert,log) global graph catch {unset graph} # cat FixVar pcat(server) cat(server) FixVar pcat(sym,shape) cat(sym,shape) FixVar pcat(sym,color) cat(sym,color) FixVar pcat(vot) cat(vot) # contour FixVarRm pcontour(color,msg) # coords global coord catch {unset coord} # scale FixVarRm pscale(min) FixVarRm pscale(max) FixVarRm pscale(xaxis) FixVarRm pscale(yaxis) # marker FixVarRm pmarker(maxdialog) FixVarRm pmarker(load) FixVarRm pmarker(paste,system) FixVarRm pmarker(paste,sky) FixVarRm pmarker(system) FixVarRm pmarker(sky) FixVarRm pmarker(skyformat) FixVarRm pmarker(strip) FixVarRm marker(dialog,system) FixVarRm marker(dialog,sky) FixVarRm marker(dialog,skyformat) FixVarRm marker(dialog,dist,system) FixVarRm marker(dialog,dist,format) FixVarRm marker(circle,radius) FixVarRm marker(annulus,inner) FixVarRm marker(annulus,outer) FixVarRm marker(annulus,annuli) FixVarRm marker(panda,inner) FixVarRm marker(panda,outer) FixVarRm marker(panda,annuli) FixVarRm marker(panda,ang1) FixVarRm marker(panda,ang2) FixVarRm marker(panda,angnum) FixVarRm marker(ellipse,radius1) FixVarRm marker(ellipse,radius2) FixVarRm marker(ellipseannulus,radius1) FixVarRm marker(ellipseannulus,radius2) FixVarRm marker(ellipseannulus,radius3) FixVarRm marker(ellipseannulus,annuli) FixVarRm marker(epanda,radius1) FixVarRm marker(epanda,radius2) FixVarRm marker(epanda,radius3) FixVarRm marker(epanda,annuli) FixVarRm marker(epanda,ang1) FixVarRm marker(epanda,ang2) FixVarRm marker(epanda,angnum) FixVarRm marker(box,radius1) FixVarRm marker(box,radius2) FixVarRm marker(boxannulus,radius1) FixVarRm marker(boxannulus,radius2) FixVarRm marker(boxannulus,radius3) FixVarRm marker(boxannulus,annuli) FixVarRm marker(bpanda,radius1) FixVarRm marker(bpanda,radius2) FixVarRm marker(bpanda,radius3) FixVarRm marker(bpanda,annuli) FixVarRm marker(bpanda,ang1) FixVarRm marker(bpanda,ang2) FixVarRm marker(bpanda,angnum) FixVarRm marker(polygon,width) FixVarRm marker(polygon,height) FixVarRm marker(projection,thick) FixVarRm marker(compass,radius) FixVarRm marker(point,size) } proc FixPrefs5.xto6.0 {} { FixVar pap(grid) prefs(ap,grid) FixVar pap(grid,log) prefs(ap,grid,log) FixVar pap(discrete) prefs(ap,discrete) FixVar pap(discrete,symbol) prefs(ap,discrete,symbol) FixVar pap(discrete,color) prefs(ap,discrete,color) FixVar pap(linear) prefs(ap,linear) FixVar pap(linear,width) prefs(ap,linear,width) FixVar pap(linear,color) prefs(ap,linear,color) FixVar pap(linear,dash) prefs(ap,linear,dash) FixVar pap(step) prefs(ap,step) FixVar pap(step,width) prefs(ap,step,width) FixVar pap(step,color) prefs(ap,step,color) FixVar pap(step,dash) prefs(ap,step,dash) FixVar pap(quadratic) prefs(ap,quadratic) FixVar pap(quadratic,width) prefs(ap,quadratic,width) FixVar pap(quadratic,color) prefs(ap,quadratic,color) FixVar pap(quadratic,dash) prefs(ap,quadratic,dash) FixVar pap(error,color) prefs(ap,error,color) FixVar pap(error,width) prefs(ap,error,width) FixVar pap(error,style) prefs(ap,error,style) FixVar pap(titleFont) prefs(ap,titleFont) FixVar pap(titleSize) prefs(ap,titleSize) FixVar pap(titleStyle) prefs(ap,titleStyle) FixVar pap(textlabFont) prefs(ap,textlabFont) FixVar pap(textlabSize) prefs(ap,textlabSize) FixVar pap(textlabStyle) prefs(ap,textlabStyle) FixVar pap(numlabFont) prefs(ap,numlabFont) FixVar pap(numlabSize) prefs(ap,numlabSize) FixVar pap(numlabStyle) prefs(ap,numlabStyle) FixVar pcurrent(zoom) prefs(zoom) FixVar pcurrent(orient) prefs(orient) FixVar pcurrent(rotate) prefs(rotate) FixVar panalysis(log) prefs(analysis,log) FixVar pds9(mode) prefs(ds9,mode) FixVar pblink(interval) prefs(blink,interval) FixVar ptile(mode) prefs(tile,mode) FixVar pcolorbar(map) prefs(colorbar,map) FixVar pcolorbar(invert) prefs(colorbar,invert) FixVar pmarker(shape) prefs(marker,shape) FixVar pmarker(color) prefs(marker,color) FixVar pmarker(width) prefs(marker,width) FixVar pmarker(fixed) prefs(marker,fixed) FixVar pmarker(edit) prefs(marker,edit) FixVar pmarker(move) prefs(marker,move) FixVar pmarker(rotate) prefs(marker,rotate) FixVar pmarker(delete) prefs(marker,delete) FixVar pmarker(include) prefs(marker,include) FixVar pmarker(source) prefs(marker,source) FixVar pmarker(font) prefs(marker,font) FixVar pmarker(font,size) prefs(marker,font,size) FixVar pmarker(font,style) prefs(marker,font,style) FixVar pmarker(format) prefs(marker,format) FixVar pmarker(strip) prefs(marker,strip) FixVar pmarker(system) prefs(marker,system) FixVar pmarker(sky) prefs(marker,sky) FixVar pmarker(skyformat) prefs(marker,skyformat) FixVarRm prefs(marker,wcs) FixVarRm marker(wcs) FixVarRm marker(polygon,width) FixVarRm marker(polygon,height) FixVar pmarker(dialog,system) marker(dialog,system) FixVar pmarker(dialog,sky) marker(dialog,sky) FixVar pmarker(dialog,skyformat) marker(dialog,skyformat) FixVar pmarker(dialog,dist,system) marker(dialog,dist,system) FixVar pmarker(dialog,dist,format) marker(dialog,dist,format) FixVar pmarker(circle,radius) marker(circle,radius) FixVar pmarker(annulus,inner) marker(annulus,inner) FixVar pmarker(annulus,outer) marker(annulus,outer) FixVar pmarker(annulus,annuli) marker(annulus,annuli) FixVar pmarker(panda,inner) marker(panda,inner) FixVar pmarker(panda,outer) marker(panda,outer) FixVar pmarker(panda,annuli) marker(panda,annuli) FixVar pmarker(panda,ang1) marker(panda,ang1) FixVar pmarker(panda,ang2) marker(panda,ang2) FixVar pmarker(panda,angnum) marker(panda,angnum) FixVar pmarker(ellipse,radius1) marker(ellipse,radius1) FixVar pmarker(ellipse,radius2) marker(ellipse,radius2) FixVar pmarker(ellipseannulus,radius1) marker(ellipseannulus,radius1) FixVar pmarker(ellipseannulus,radius2) marker(ellipseannulus,radius2) FixVar pmarker(ellipseannulus,radius3) marker(ellipseannulus,radius3) FixVar pmarker(ellipseannulus,annuli) marker(ellipseannulus,annuli) FixVar pmarker(epanda,radius1) marker(epanda,radius1) FixVar pmarker(epanda,radius2) marker(epanda,radius2) FixVar pmarker(epanda,radius3) marker(epanda,radius3) FixVar pmarker(epanda,annuli) marker(epanda,annuli) FixVar pmarker(epanda,ang1) marker(epanda,ang1) FixVar pmarker(epanda,ang2) marker(epanda,ang2) FixVar pmarker(epanda,angnum) marker(epanda,angnum) FixVar pmarker(box,radius1) marker(box,radius1) FixVar pmarker(box,radius2) marker(box,radius2) FixVar pmarker(boxannulus,radius1) marker(boxannulus,radius1) FixVar pmarker(boxannulus,radius2) marker(boxannulus,radius2) FixVar pmarker(boxannulus,radius3) marker(boxannulus,radius3) FixVar pmarker(boxannulus,annuli) marker(boxannulus,annuli) FixVar pmarker(bpanda,radius1) marker(bpanda,radius1) FixVar pmarker(bpanda,radius2) marker(bpanda,radius2) FixVar pmarker(bpanda,radius3) marker(bpanda,radius3) FixVar pmarker(bpanda,annuli) marker(bpanda,annuli) FixVar pmarker(bpanda,ang1) marker(bpanda,ang1) FixVar pmarker(bpanda,ang2) marker(bpanda,ang2) FixVar pmarker(bpanda,angnum) marker(bpanda,angnum) FixVar pmarker(projection,thick) marker(projection,thick) FixVar pmarker(point,size) marker(point,size) # buttons global buttons global pbuttons if {[info exists buttons(file,about)]} { foreach nn [array names buttons] { set aa [split $nn ,] if {[lindex $aa 1] != {}} { switch [lindex $aa 0] { file - edit - view - frame - bin - zoom - scale - color - region - wcs - help { set pbuttons($nn) $buttons($nn) unset buttons($nn) } } } } FixVar pbuttons(scale,995) buttons(scale,99.5) FixVar pbuttons(scale,925) buttons(scale,92.5) FixVar pbuttons(zoom,i32) buttons(zoom,1/32) FixVar pbuttons(zoom,i16) buttons(zoom,1/16) FixVar pbuttons(zoom,i8) buttons(zoom,1/8) FixVar pbuttons(zoom,i4) buttons(zoom,1/4) FixVar pbuttons(zoom,i2) buttons(zoom,1/2) FixVarRm pbuttons(scale,92.5) FixVarRm pbuttons(scale,99.5) FixVarRm pbuttons(zoom,1/32) FixVarRm pbuttons(zoom,1/16) FixVarRm pbuttons(zoom,1/8) FixVarRm pbuttons(zoom,1/4) FixVarRm pbuttons(zoom,1/2) } } �������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/prefsdialog.tcl������������������������������������������������������������������000644 �000765 �000000 �00000021453 12576612222 017544� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PrefsDialog {{which {}}} { global ds9 global iprefs global dprefs # see if we already have a window visible if {[winfo exists $iprefs(top)]} { raise $iprefs(top) return } # create the window set w $iprefs(top) set mb $iprefs(mb) Toplevel $w $mb 6 [msgcat::mc {Preferences}] PrefsDialogSave $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Clear Preferences}] \ -command PrefsDialogClear $mb.file add separator $mb.file add command -label [msgcat::mc {Save}] -command PrefsDialogSave $mb.file add command -label [msgcat::mc {Close}] -command PrefsDialogClose EditMenu $mb iprefs # List set f [ttk::frame $w.param] ttk::scrollbar $f.scroll -command [list $f.box yview] set dprefs(list) [listbox $f.box \ -yscroll [list $f.scroll set] \ -selectmode browse \ -setgrid true \ -width 18 -height 28 \ ] grid $f.box $f.scroll -sticky news grid rowconfigure $f 0 -weight 1 grid columnconfigure $f 2 -weight 1 bind $dprefs(list) <<ListboxSelect>> [list PrefsDialogListUpdate] set dprefs(tab) $f set dprefs(tabs) {} PrefsDialogGeneral PrefsDialogStartup PrefsDialogMenu PrefsDialogPanner PrefsDialogMagnifier PrefsDialog3d PrefsDialogGraph PrefsDialogScale PrefsDialogColor PrefsDialogBin PrefsDialogZoom PrefsDialogRegion PrefsDialogAnnulus PrefsDialogPanda PrefsDialogAnalysis PrefsDialogPixelTable PrefsDialogContour PrefsDialogSmooth PrefsDialogCatalog PrefsDialogNRES PrefsDialogPlot PrefsDialogVO PrefsDialogPrint PrefsDialogPageSetup PrefsDialogCoord PrefsDialogExamine PrefsDialogHTTP # Buttons set f [ttk::frame $w.buttons] ttk::button $f.save -text [msgcat::mc {Save}] \ -command PrefsDialogSave ttk::button $f.close -text [msgcat::mc {Close}] \ -command PrefsDialogClose ttk::button $f.clear -text [msgcat::mc {Clear Preferences}] \ -command PrefsDialogClear pack $f.clear $f.save $f.close \ -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -fill both -expand true # http is hard coded to be last switch $which { http {$dprefs(list) selection set end} default {$dprefs(list) selection set 0} } PrefsDialogListUpdate } proc PrefsDialogListUpdate {} { global dprefs set which [$dprefs(list) curselection] if {$which == {}} { set which 0 } foreach tab $dprefs(tabs) { grid forget $tab } grid [lindex $dprefs(tabs) $which] -row 0 -column 2 -sticky new } proc PrefsDialogSave {} { global iprefs if {[winfo exists $iprefs(top)]} { destroy $iprefs(top) destroy $iprefs(mb) } SavePrefs } proc PrefsDialogClose {} { global iprefs global dprefs if {[winfo exists $iprefs(top)]} { destroy $iprefs(top) destroy $iprefs(mb) } unset dprefs } proc PrefsDialogClear {} { global iprefs global dprefs global pds9 if {$pds9(confirm)} { if {[tk_messageBox -type okcancel -icon question -message [msgcat::mc {Clear Preferences?}]] != {ok}} { return } } ClearPrefs PrefsDialogClose } # Pref Frames proc PrefsDialogGeneral {} { global dprefs global ds9 global pds9 global pmagnifier set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {General}] lappend dprefs(tabs) [ttk::frame $w.general] # General set f [ttk::labelframe $w.general.misc -text [msgcat::mc {General}]] ttk::checkbutton $f.backup \ -text [msgcat::mc {Always save files during Backup}] \ -variable pds9(backup) ttk::checkbutton $f.auto -text [msgcat::mc {Autoload FITS Regions}] \ -variable pds9(automarker) ttk::checkbutton $f.confirm \ -text [msgcat::mc {Enable Confirmation Dialogs}] \ -variable pds9(confirm) ttk::label $f.tthreads -text [msgcat::mc {Number of Threads}] ttk::entry $f.threads -textvariable pds9(threads) \ -validate focusout -validatecommand PrefsThreads -width 8 grid $f.backup -padx 2 -pady 2 -sticky w grid $f.auto -padx 2 -pady 2 -sticky w grid $f.confirm -padx 2 -pady 2 -sticky w grid $f.tthreads $f.threads -padx 2 -pady 2 -sticky w # Language set f [ttk::labelframe $w.general.lang -text [msgcat::mc {Language}]] ttk::menubutton $f.lang -textvariable pds9(language,name) -menu $f.lang.menu set m $f.lang.menu menu $m $m add radiobutton -label [LanguageToName locale] \ -variable pds9(language,name) -command "set pds9(language) locale" $m add separator $m add radiobutton -label [LanguageToName cs] \ -variable pds9(language,name) -command "set pds9(language) cs" $m add radiobutton -label [LanguageToName da] \ -variable pds9(language,name) -command "set pds9(language) da" $m add radiobutton -label [LanguageToName de] \ -variable pds9(language,name) -command "set pds9(language) de" $m add radiobutton -label [LanguageToName en] \ -variable pds9(language,name) -command "set pds9(language) en" $m add radiobutton -label [LanguageToName es] \ -variable pds9(language,name) -command "set pds9(language) es" $m add radiobutton -label [LanguageToName fr] \ -variable pds9(language,name) -command "set pds9(language) fr" $m add radiobutton -label [LanguageToName ja] \ -variable pds9(language,name) -command "set pds9(language) ja" $m add radiobutton -label [LanguageToName pt] \ -variable pds9(language,name) -command "set pds9(language) pt" $m add radiobutton -label [LanguageToName zh] \ -variable pds9(language,name) -command "set pds9(language) zh" grid $f.lang -padx 2 -pady 2 -sticky w # GUI Font set f [ttk::labelframe $w.general.font -text [msgcat::mc {GUI Font}]] FontMenuButton $f.font pds9 font \ font,size font,weight font,slant PrefsDefaultFont ttk::button $f.reset -text [msgcat::mc {Reset}] \ -command InitDefaultFont grid $f.font $f.reset -padx 2 -pady 2 -sticky w # Text Font set f [ttk::labelframe $w.general.textfont -text [msgcat::mc {Text Font}]] FontMenuButton $f.textfont pds9 text,font \ text,font,size text,font,weight text,font,slant {} ttk::button $f.textreset -text [msgcat::mc {Reset}] \ -command InitDefaultTextFont grid $f.textfont $f.textreset -padx 2 -pady 2 -sticky w # Color set f [ttk::labelframe $w.general.color -text [msgcat::mc {Color}]] ttk::label $f.tbg -text [msgcat::mc {Background Color}] ColorMenuButton $f.bg pds9 bg PrefsBgColor ttk::label $f.tnan -text [msgcat::mc {Blank/Inf/NaN Color}] ColorMenuButton $f.nan pds9 nan PrefsNanColor grid $f.tbg $f.bg -padx 2 -pady 2 -sticky w grid $f.tnan $f.nan -padx 2 -pady 2 -sticky w # Mosaic set f [ttk::labelframe $w.general.mosaic -text [msgcat::mc {Mosaic}]] ttk::checkbutton $f.align -text {IRAF DETSEC Align} -variable pds9(iraf) \ -command PrefsIRAFAlign grid $f.align -padx 2 -pady 2 -sticky w # Dialog Box set f [ttk::labelframe $w.general.box -text [msgcat::mc {Dialog Box}]] ttk::radiobutton $f.motif -text {Motif} -variable pds9(dialog) \ -value motif ttk::radiobutton $f.windows -text {Windows} -variable pds9(dialog) \ -value windows grid $f.motif $f.windows -padx 2 -pady 2 -sticky w switch $ds9(wm) { x11 {} aqua - win32 { ttk::radiobutton $f.native -text [msgcat::mc {Native Dialog}] \ -variable pds9(dialog) -value native grid $f.native -row 0 -column 2 -padx 2 -pady 2 -sticky w } } ttk::checkbutton $f.center -text [msgcat::mc {Center Non-modal Dialogs}] \ -variable pds9(dialog,center) ttk::checkbutton $f.all -text [msgcat::mc {Default All Files}] \ -variable pds9(dialog,all) grid $f.center - -padx 2 -pady 2 -sticky w grid $f.all - -padx 2 -pady 2 -sticky w pack $w.general.misc $w.general.lang $w.general.font \ $w.general.textfont $w.general.color $w.general.mosaic \ $w.general.box \ -side top -fill both -expand true } proc PrefsDialogStartup {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Startup}] lappend dprefs(tabs) [ttk::frame $w.startup] set f [ttk::labelframe $w.startup.params -text [msgcat::mc {At Startup}]] ttk::checkbutton $f.xpa -text [msgcat::mc {Initialize XPA}] \ -variable pds9(xpa) ttk::checkbutton $f.samp -text [msgcat::mc {Connect SAMP}] \ -variable pds9(samp) grid $f.xpa -padx 2 -pady 2 -sticky w grid $f.samp -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true -anchor nw } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/print.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000040163 12514261633 016376� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc PSDef {} { global ds9 global ps global pps set ps(dest) printer set ps(cmd) {lp} set ps(filename) {ds9.ps} set ps(filename,txt) {ds9.txt} set ps(color) rgb set ps(level) 2 set ps(resolution) 150 set ps(orient) portrait set ps(scale) 100 set ps(size) letter set ps(width) 8.5 set ps(height) 11 array set pps [array get ps] } # Print procs proc PSPrint {} { if {[PSPrintDialog ps]} { if {[catch {PostScript} printError]} { Error "[msgcat::mc {An error has occurred while printing}] $printError" } } } proc PostScript {} { global ds9 global ps global view global canvas global colorbar global current # we need to be realized RealizeDS9 # need the colorbar levels updated UpdateColormapLevel set options " " # Orientation switch -- $ps(orient) { portrait {append options " -rotate false"} landscape {append options " -rotate true"} } # Page size switch -- $ps(size) { letter {PostScriptPageSize 4.25i 5.5i 7.5i 10.i options} legal {PostScriptPageSize 4.25i 7.i 7.5i 13.i options} tabloid {PostScriptPageSize 5.5i 8.5i 10.i 16.i options} poster {PostScriptPageSize 18.i 24.i 35.i 47.i options} a4 {PostScriptPageSize 105m 148.5m 185m 272m options} other { if {$ps(width) != {} && $ps(height) != {}} { set x [expr double($ps(width))/2.] set y [expr double($ps(height))/2.] set w [expr $ps(width)-1.] set h [expr $ps(height)-1.] PostScriptPageSize [append x i] [append y i] \ [append w i] [append h i] options } } othermm { if {$ps(width) != {} && $ps(height) != {}} { set x [expr double($ps(width))/2.] set y [expr double($ps(height))/2.] set w [expr $ps(width)-1.] set h [expr $ps(height)-1.] PostScriptPageSize [append x m] [append y m] \ [append w m] [append h m] options } } } # Printer vs File set channel {} switch -- $ps(dest) { "file" { append options " -file \{$ps(filename)\}" } "printer" { set channel [open "| $ps(cmd)" w] append options " -channel $channel" } } # set color specific postscript options colorbar postscript level $ps(level) colorbar postscript colorspace $ps(color) colorbar postscript resolution $ps(resolution) colorbarrgb postscript level $ps(level) colorbarrgb postscript colorspace $ps(color) colorbarrgb postscript resolution $ps(resolution) # set frame specific postscript options foreach ff $ds9(frames) { $ff postscript level $ps(level) $ff postscript colorspace $ps(color) $ff postscript resolution $ps(resolution) } # setting the scale for one widget sets it for the entire print run # reduce slightly to make room for numerics if {$current(frame) != {}} { $current(frame) postscript scale [expr .95*$ps(scale)/100.] } # graphs if {$view(graph,vert)} { $ds9(graph,vert) configure -plotbackground white -bg white } if {$view(graph,horz)} { $ds9(graph,horz) configure -plotbackground white -bg white } # now invoke canvas postscript command if {[catch {eval $ds9(canvas) postscript $options} rr]} { Error "[msgcat::mc {A postscript generation error has occurred}] $rr" } switch -- $ps(dest) { "file" {} "printer" { if {$channel != {}} { close $channel } } } # reset graphs if {$view(graph,vert)} { $ds9(graph,vert) configure -plotbackground $ds9(bg) -bg $ds9(bg) } if {$view(graph,horz)} { $ds9(graph,horz) configure -plotbackground $ds9(bg) -bg $ds9(bg) } } proc EPS {fn} { global ds9 global ps global view global canvas global colorbar global current # we need to be realized RealizeDS9 # need the colorbar levels updated UpdateColormapLevel set color rgb set level 2 set resolution 72 set options {} # Page size set width [winfo width $ds9(canvas)] set height [winfo height $ds9(canvas)] append options " -pagex 0 -pagey 0 -pageanchor sw" if ($width>$height) { append options " -pagewidth $width" } else { append options " -pageheight $height" } # File append options " -file \{$fn\}" # set color specific postscript options colorbar postscript level $level colorbar postscript colorspace $color colorbar postscript resolution $resolution colorbarrgb postscript level $level colorbarrgb postscript colorspace $color colorbarrgb postscript resolution $resolution # set frame specific postscript options foreach ff $ds9(frames) { $ff postscript level $level $ff postscript colorspace $color $ff postscript resolution $resolution } # setting the scale for one widget sets it for the entire print run if {$current(frame) != {}} { $current(frame) postscript scale 1.0 } # graphs if {$view(graph,vert)} { $ds9(graph,vert) configure -plotbackground white -bg white } if {$view(graph,horz)} { $ds9(graph,horz) configure -plotbackground white -bg white } # now invoke canvas postscript command if {[catch {eval $ds9(canvas) postscript $options} rr]} { Error "[msgcat::mc {A postscript generation error has occurred}] $rr" } # reset graphs if {$view(graph,vert)} { $ds9(graph,vert) configure -plotbackground $ds9(bg) -bg $ds9(bg) } if {$view(graph,horz)} { $ds9(graph,horz) configure -plotbackground $ds9(bg) -bg $ds9(bg) } } proc PostScriptPageSize {x y w h optname} { upvar $optname options global ds9 global ps append options " -pagex $x -pagey $y" set width [winfo width $ds9(canvas)] set height [winfo height $ds9(canvas)] set wo [string trim $w "icmp"] set ho [string trim $h "icmp"] switch -- $ps(orient) { portrait { if {[expr double($wo)/$width] < [expr double($ho)/$height]} { append options " -pagewidth $w" } else { append options " -pageheight $h" } } landscape { if {[expr double($wo)/$width] > [expr double($ho)/$height]} { append options " -pageheight $w" } else { append options " -pagewidth $h" } } } } # Print Dialog procs proc PSPrintDialog {which} { global ps global ed set ed(ok) 0 array set ed [array get ps] set w {.print} DialogCreate $w [msgcat::mc {Print}] ed(ok) # PrintTo set f [ttk::labelframe $w.pt -text [msgcat::mc {Print To}]] ttk::radiobutton $f.printer -text [msgcat::mc {Printer}] \ -variable ed(dest) -value printer ttk::label $f.tcmd -text [msgcat::mc {Command}] ttk::entry $f.cmd -textvariable ed(cmd) -width 20 ttk::radiobutton $f.file -text [msgcat::mc {File}] \ -variable ed(dest) -value file ttk::label $f.tname -text [msgcat::mc {Name}] ttk::entry $f.name -textvariable ed(filename) -width 20 ttk::button $f.browse -text [msgcat::mc {Browse}] \ -command "PSPrintBrowse ed(filename)" grid $f.printer $f.tcmd $f.cmd -padx 2 -pady 2 -sticky ew grid $f.file $f.tname $f.name $f.browse -padx 2 -pady 2 -sticky ew grid columnconfigure $f 2 -weight 1 # Options set f [ttk::labelframe $w.ps -text [msgcat::mc {Postscript}]] ttk::label $f.color -text [msgcat::mc {Color}] ttk::radiobutton $f.rgb -text [msgcat::mc {RGB}] \ -variable ed(color) -value rgb ttk::radiobutton $f.cmyk -text [msgcat::mc {CMYK}] \ -variable ed(color) -value cmyk ttk::radiobutton $f.gray -text [msgcat::mc {Grayscale}] \ -variable ed(color) -value gray ttk::label $f.level -text [msgcat::mc {Level}] ttk::radiobutton $f.level1 -text "[msgcat::mc {Level}] 1" \ -variable ed(level) -value 1 ttk::radiobutton $f.level2 -text "[msgcat::mc {Level}] 2" \ -variable ed(level) -value 2 ttk::radiobutton $f.level3 -text "[msgcat::mc {Level}] 3" \ -variable ed(level) -value 3 ttk::label $f.dpi -text [msgcat::mc {DPI}] tk_optionMenu $f.resolution ed(resolution) 53 72 75 150 300 600 grid $f.color $f.rgb $f.cmyk $f.gray -padx 2 -pady 2 -sticky w grid $f.level $f.level3 $f.level2 $f.level1 -padx 2 -pady 2 -sticky w grid $f.dpi $f.resolution -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini grid $w.pt -sticky news grid $w.ps -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok DialogDismiss $w if {$ed(ok)} { array set ps [array get ed] } set rr $ed(ok) unset ed return $rr } proc PSPrintBrowse {varname} { upvar $varname var FileLast pssavfbox $var set var [SaveFileDialog pssavfbox] } # Used for plots proc PlotPrintDialog {} { global ps global ed set ed(ok) 0 array set ed [array get ps] set w {.print} DialogCreate $w [msgcat::mc {Print}] ed(ok) # PrintTo set f [ttk::labelframe $w.pt -text [msgcat::mc {Print To}]] ttk::radiobutton $f.printer -text [msgcat::mc {Printer}] \ -variable ed(dest) -value printer ttk::label $f.tcmd -text [msgcat::mc {Command}] ttk::entry $f.cmd -textvariable ed(cmd) -width 20 ttk::radiobutton $f.file -text [msgcat::mc {File}] \ -variable ed(dest) -value file ttk::label $f.tname -text [msgcat::mc {Name}] ttk::entry $f.name -textvariable ed(filename) -width 20 ttk::button $f.browse -text [msgcat::mc {Browse}] \ -command "PlotPrintBrowse ed(filename)" grid $f.printer $f.tcmd $f.cmd -padx 2 -pady 2 -sticky ew grid $f.file $f.tname $f.name $f.browse -padx 2 -pady 2 -sticky ew grid columnconfigure $f 2 -weight 1 # Options set f [ttk::labelframe $w.ps -text [msgcat::mc {Postscript}]] ttk::label $f.color -text [msgcat::mc {Color}] ttk::radiobutton $f.rgb -text [msgcat::mc {RGB}] \ -variable ed(color) -value rgb ttk::radiobutton $f.gray -text [msgcat::mc {Grayscale}] \ -variable ed(color) -value gray grid $f.color $f.rgb $f.gray -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini grid $w.pt -sticky news grid $w.ps -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok DialogDismiss $w if {$ed(ok)} { array set ps [array get ed] } set rr $ed(ok) unset ed return $rr } proc PlotPrintBrowse {varname} { upvar $varname var FileLast apsavfbox $var set var [SaveFileDialog apsavfbox] } # Used for SimpleText and Catalog proc PRPrintDialog {} { global ps global ed set ed(ok) 0 array set ed [array get ps] set w {.print} DialogCreate $w [msgcat::mc {Print}] ed(ok) # PrintTo set f [ttk::labelframe $w.pt -text [msgcat::mc {Print To}]] ttk::radiobutton $f.printer -text [msgcat::mc {Printer}] \ -variable ed(dest) -value printer ttk::label $f.tcmd -text [msgcat::mc {Command}] ttk::entry $f.cmd -textvariable ed(cmd) -width 20 ttk::radiobutton $f.file -text [msgcat::mc {File}] \ -variable ed(dest) -value file ttk::label $f.tname -text [msgcat::mc {Name}] ttk::entry $f.name -textvariable ed(filename,txt) -width 20 ttk::button $f.browse -text [msgcat::mc {Browse}] \ -command "PRPrintBrowse ed(filename,txt)" grid $f.printer $f.tcmd $f.cmd -padx 2 -pady 2 -sticky ew grid $f.file $f.tname $f.name $f.browse -padx 2 -pady 2 -sticky ew grid columnconfigure $f 2 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini grid $w.pt -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid columnconfigure $w 0 -weight 1 DialogCenter $w DialogWait $w ed(ok) $w.buttons.ok DialogDismiss $w if {$ed(ok)} { array set ps [array get ed] } set rr $ed(ok) unset ed return $rr } proc PRPrintBrowse {varname} { upvar $varname var FileLast prsavfbox $var set var [SaveFileDialog prsavfbox] } proc PrefsDialogPrint {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Postscript}] lappend dprefs(tabs) [ttk::frame $w.print] # PrintTo set f [ttk::labelframe $w.print.printto -text [msgcat::mc {Print To}]] ttk::radiobutton $f.printer -text [msgcat::mc {Printer}] \ -variable pps(dest) -value printer ttk::label $f.tcmd -text [msgcat::mc {Command}] ttk::entry $f.cmd -textvariable pps(cmd) -width 20 ttk::radiobutton $f.file -text [msgcat::mc {File}] \ -variable pps(dest) -value file ttk::label $f.tname -text [msgcat::mc {Name}] ttk::entry $f.name -textvariable pps(filename) -width 20 ttk::button $f.browse -text [msgcat::mc {Browse}] \ -command "PSPrintBrowse pps(filename)" grid $f.printer $f.tcmd $f.cmd -padx 2 -pady 2 -sticky w grid $f.file $f.tname $f.name $f.browse -padx 2 -pady 2 -sticky w # Options set f [ttk::labelframe $w.print.ps -text [msgcat::mc {Postscript}]] ttk::label $f.color -text [msgcat::mc {Color}] ttk::radiobutton $f.rgb -text [msgcat::mc {RGB}] \ -variable pps(color) -value rgb ttk::radiobutton $f.cmyk -text [msgcat::mc {CMYK}] \ -variable pps(color) -value cmyk ttk::radiobutton $f.gray -text [msgcat::mc {Grayscale}] \ -variable pps(color) -value gray ttk::label $f.level -text [msgcat::mc {Level}] ttk::radiobutton $f.level1 -text "[msgcat::mc {Level}] 1" \ -variable pps(level) -value 1 ttk::radiobutton $f.level2 -text "[msgcat::mc {Level}] 2" \ -variable pps(level) -value 2 ttk::radiobutton $f.level3 -text "[msgcat::mc {Level}] 3" \ -variable pps(level) -value 3 ttk::label $f.dpi -text [msgcat::mc {DPI}] tk_optionMenu $f.resolution pps(resolution) 53 72 75 150 300 600 grid $f.color $f.rgb $f.cmyk $f.gray -padx 2 -pady 2 -sticky w grid $f.level $f.level3 $f.level2 $f.level1 -padx 2 -pady 2 -sticky w grid $f.dpi $f.resolution -padx 2 -pady 2 -sticky w pack $w.print.printto $w.print.ps \ -side top -fill both -expand true } # Process Cmds proc ProcessPrintCmd {varname iname} { upvar $varname var upvar $iname i global ds9 switch $ds9(wm) { x11 {ProcessPSPrintCmd var i} aqua { ProcessPSPrintCmd var i # MacOSXPrint } win32 {Win32Print} } } proc ProcessSendPrintCmd {proc id param} { global ds9 switch $ds9(wm) { x11 {ProcessSendPSPrintCmd $proc $id $param} aqua {} win32 {} } } proc ProcessPSPrintCmd {varname iname} { upvar $varname var upvar $iname i global ps switch -- [string tolower [lindex $var $i]] { destination {incr i; set ps(dest) [lindex $var $i]} command {incr i; set ps(cmd) [lindex $var $i]} filename {incr i; set ps(filename) [lindex $var $i]} palette - color {incr i; set ps(color) [lindex $var $i]} level {incr i; set ps(level) [lindex $var $i]} interpolate {incr i} resolution {incr i; set ps(resolution) [lindex $var $i]} {} {PostScript} default {incr i -1; PostScript} } } proc ProcessSendPSPrintCmd {proc id param} { global ps switch -- [string tolower $param] { destination {$proc $id "$ps(dest)\n"} command {$proc $id "$ps(cmd)\n"} filename {$proc $id "$ps(filename)\n"} palette - color {$proc $id "$ps(color)\n"} level {$proc $id "$ps(level)\n"} interpolate {$proc $id "0\n"} resolution {$proc $id "$ps(resolution)\n"} } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/projection.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000005776 12514261633 017431� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ProjectionDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(tcoord) [lindex $rr 0] set var(tformat) degrees AdjustCoordSystem $varname tcoord # procs set var(which) projection set var(proc,apply) ProjectionApply set var(proc,coordCB) ProjectionCoordCB set var(proc,editCB) ProjectionEditCB set var(proc,distCB) ProjectionDistCB # base MarkerBaseLineDialog $varname 500 200 # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis # plot2d MarkerAnalysisPlot2dDialog $varname # init ProjectionThickCB $varname set f $var(top).param # Thick ttk::label $f.tthick -text [msgcat::mc {Thickness}] ttk::entry $f.thick -textvariable ${varname}(thick) -width 13 DistMenuButton $f.uthick $varname tcoord 1 tformat \ [list ProjectionThickCB $varname] DistMenuEnable $f.uthick.menu $varname tcoord 1 tformat grid $f.tthick $f.thick $f.uthick -padx 2 -pady 2 -sticky w } # actions proc ProjectionApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) projection $var(system) $var(sky) \ $var(x) $var(y) $var(x2) $var(y2) \ $var(thick) $var(tcoord) $var(tformat) MarkerBaseLineApply $varname } # callbacks proc ProjectionCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "ProjectionCoordCB" } MarkerAnalysisPlot2dSystem $varname MarkerBaseCoordCB $varname ProjectionEditCB $varname } proc ProjectionEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "ProjectionEditCB" } MarkerBaseLineEditCB $varname set var(dist) [$var(frame) get marker $var(id) projection length \ $var(dcoord) $var(dformat)] set var(thick) [$var(frame) get marker $var(id) projection thick \ $var(tcoord) $var(tformat)] set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] } proc ProjectionDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "ProjectionDistCB" } set var(dist) [$var(frame) get marker $var(id) projection length \ $var(dcoord) $var(dformat)] } proc ProjectionThickCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "ProjectionThickCB" } set var(thick) [$var(frame) get marker $var(id) projection thick \ $var(tcoord) $var(tformat)] } ��saods9/ds9/library/rgb.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000021270 12527427333 016017� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc RGBDef {} { global rgb global irgb set irgb(top) .rgb set irgb(mb) .rgbmb set rgb(red) 1 set rgb(green) 1 set rgb(blue) 1 set rgb(system) wcs set rgb(lock,wcs) 0 set rgb(lock,crop) 0 set rgb(lock,slice) 0 set rgb(lock,bin) 0 set rgb(lock,axes) 0 set rgb(lock,scale) 0 set rgb(lock,scalelimits) 0 set rgb(lock,colorbar) 0 set rgb(lock,block) 0 set rgb(lock,smooth) 0 } proc RGBEvalLockCurrent {varname cmd} { global current global rgb global crop global cube global bin global scale global colorbar global block global smooth RGBEvalLock $varname $current(frame) $cmd } proc RGBEvalLock {varname which cmd} { upvar $varname var global rgb global crop global cube global bin global scale global colorbar global block global smooth if {$var && [$which get type] == {rgb}} { set ch [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc eval $cmd } $which rgb channel $ch } else { eval $cmd } } proc RGBEvalLockColorbar {cmd} { global current global scale global rgb if {$rgb(lock,colorbar) && [$current(frame) get type] == {rgb}} { set ch $current(rgb) foreach c {red green blue} { colorbarrgb rgb channel $c eval $cmd } set current(rgb) $ch colorbarrgb rgb channel $current(rgb) } else { eval $cmd } } proc RGBChannel {} { global current if {$current(frame) != {}} { if {[$current(frame) get type] == {rgb}} { colorbarrgb rgb channel $current(rgb) } $current(frame) rgb channel $current(rgb) UpdateDS9 } } proc RGBView {} { global current global rgb if {$current(frame) != {}} { $current(frame) rgb view $rgb(red) $rgb(green) $rgb(blue) } } proc RGBSystem {} { global current global rgb if {$current(frame) != {}} { $current(frame) rgb system $rgb(system) } } # used by backup proc RGBDialog {} { global rgb global irgb global current global ds9 # see if we already have a window visible if {[winfo exists $irgb(top)]} { raise $irgb(top) return } # create the rgb window set w $irgb(top) set mb $irgb(mb) Toplevel $w $mb 6 [msgcat::mc {RGB}] RGBDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Align}] -menu $mb.align $mb add cascade -label [msgcat::mc {Lock}] -menu $mb.lock menu $mb.file $mb.file add command -label [msgcat::mc {Close}] -command RGBDestroyDialog CoordMenu $mb.align rgb system 1 {} {} RGBSystem menu $mb.lock $mb.lock add checkbutton -label [msgcat::mc {WCS}] \ -variable rgb(lock,wcs) $mb.lock add checkbutton -label [msgcat::mc {Crop}] \ -variable rgb(lock,crop) $mb.lock add checkbutton -label [msgcat::mc {Slice}] \ -variable rgb(lock,slice) $mb.lock add checkbutton -label [msgcat::mc {Bin}] \ -variable rgb(lock,bin) $mb.lock add checkbutton -label [msgcat::mc {Axes Order}] \ -variable rgb(lock,axes) $mb.lock add checkbutton -label [msgcat::mc {Scale}] \ -variable rgb(lock,scale) $mb.lock add checkbutton -label [msgcat::mc {Scale and Limits}] \ -variable rgb(lock,scalelimits) $mb.lock add checkbutton -label [msgcat::mc {Colorbar}] \ -variable rgb(lock,colorbar) $mb.lock add checkbutton -label [msgcat::mc {Block}] \ -variable rgb(lock,block) $mb.lock add checkbutton -label [msgcat::mc {Smooth}] \ -variable rgb(lock,smooth) # Param set f [ttk::frame $w.param] ttk::label $f.currenttitle -text [msgcat::mc {Current}] ttk::label $f.viewtitle -text [msgcat::mc {View}] ttk::label $f.redtitle -text [msgcat::mc {Red}] ttk::label $f.bluetitle -text [msgcat::mc {Blue}] ttk::label $f.greentitle -text [msgcat::mc {Green}] ttk::radiobutton $f.redcurrent -variable current(rgb) \ -value red -command RGBChannel ttk::radiobutton $f.greencurrent -variable current(rgb) \ -value green -command RGBChannel ttk::radiobutton $f.bluecurrent -variable current(rgb) \ -value blue -command RGBChannel ttk::checkbutton $f.redview -variable rgb(red) -command RGBView ttk::checkbutton $f.greenview -variable rgb(green) -command RGBView ttk::checkbutton $f.blueview -variable rgb(blue) -command RGBView grid x $f.currenttitle $f.viewtitle -padx 2 -pady 2 -sticky w grid $f.redtitle $f.redcurrent $f.redview -padx 2 -pady 2 -sticky w grid $f.greentitle $f.greencurrent $f.greenview -padx 2 -pady 2 -sticky w grid $f.bluetitle $f.bluecurrent $f.blueview -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.close -text [msgcat::mc {Close}] \ -command RGBDestroyDialog pack $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true } proc RGBDestroyDialog {} { global irgb if {[winfo exists $irgb(top)]} { destroy $irgb(top) destroy $irgb(mb) } } proc UpdateRGBMenu {} { # can be changed by wcs SetCoordSystem rgb system {} {} } proc UpdateRGBDialog {} { global rgb global irgb global current global debug if {$debug(tcl,update)} { puts stderr "UpdateRGBDialog" } if {![winfo exists $irgb(top)]} { return } if {$current(frame) != {}} { set rgb(frame) $current(frame) if {[$current(frame) has fits]} { # now make sure we have the coord systems AdjustCoordSystem rgb system CoordMenuEnable $irgb(mb).align rgb system 1 {} {} } else { CoordMenuReset $irgb(mb).align rgb system 1 {} {} } } if {$current(frame) != {}} { set current(rgb) [$current(frame) get rgb channel] set r [$current(frame) get rgb view] set rgb(red) [lindex $r 0] set rgb(green) [lindex $r 1] set rgb(blue) [lindex $r 2] set rgb(system) [$current(frame) get rgb system] } } proc RGBBackup {ch which} { puts $ch "$which rgb channel [$which get rgb channel]" puts $ch "$which rgb view [$which get rgb view]" puts $ch "$which rgb system [$which get rgb system]" } # Process Cmds proc ProcessRGBCmd {varname iname} { upvar $varname var upvar $iname i global current global rgb RGBDialog switch -- [string tolower [lindex $var $i]] { open {} close {RGBDestroyDialog} red - green - blue { set current(rgb) [string tolower [lindex $var $i]] RGBChannel } channel { incr i set current(rgb) [string tolower [lindex $var $i]] RGBChannel } lock { incr i set item [string tolower [lindex $var $i]] incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set rr [FromYesNo [lindex $var $i]] } else { set rr 1 incr i -1 } switch -- $item { wcs {set rgb(lock,wcs) $rr} crop {set rgb(lock,crop) $rr} slice {set rgb(lock,slice) $rr} bin {set rgb(lock,bin) $rr} axes - order {set rgb(lock,axes) $rr} scale {set rgb(lock,scale) $rr} limits - scalelimits {set rgb(lock,scalelimits) $rr} color - colormap - colorbar {set rgb(lock,colorbar) $rr} block {set rgb(lock,block) $rr} smooth {set rgb(lock,smooth) $rr} } } system { incr i set rgb(system) [string tolower [lindex $var $i]] RGBSystem } view { set w [lindex $var [expr $i+1]] set yesno [lindex $var [expr $i+2]] switch -- [string tolower $w] { red {set rgb(red) [FromYesNo $yesno]; RGBView} green {set rgb(green) [FromYesNo $yesno]; RGBView} blue {set rgb(blue) [FromYesNo $yesno]; RGBView} } incr i 2 } default { CreateRGBFrame incr i -1 } } } proc ProcessSendRGBCmd {proc id param} { global current global rgb switch -- [lindex $param 0] { channel {$proc $id "$current(rgb)\n"} lock { switch -- [string tolower [lindex $param 1]] { wcs {$proc $id [ToYesNo $rgb(lock,wcs)]} crop {$proc $id [ToYesNo $rgb(lock,crop)]} slice {$proc $id [ToYesNo $rgb(lock,slice)]} bin {$proc $id [ToYesNo $rgb(lock,bin)]} axes - order {$proc $id [ToYesNo $rgb(lock,axes)]} scale {$proc $id [ToYesNo $rgb(lock,scale)]} limits - scalelimits {$proc $id [ToYesNo $rgb(lock,scalelimits)]} colorbar {$proc $id [ToYesNo $rgb(lock,colorbar)]} block {$proc $id [ToYesNo $rgb(lock,block)]} smooth {$proc $id [ToYesNo $rgb(lock,smooth)]} } } system {$proc $id "$rgb(system)\n"} view { switch -- [lindex $param 1] { red {$proc $id [ToYesNo $rgb(red)]} green {$proc $id [ToYesNo $rgb(green)]} blue {$proc $id [ToYesNo $rgb(blue)]} } } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/rgbarray.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000007051 12464211204 017043� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ImportRGBArrayFile {fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d {return} rgb {} } set loadParam(file,type) array set loadParam(file,mode) {rgb cube} set loadParam(load,type) mmapincr # if no zdim is present, insert one set exp {.*\[.*zdim[ ]*=[ ]*[0-9]+} if {![regexp $exp $fn]} { set i [string last "\]" $fn] set fn "[string range $fn 0 [expr $i-1]],zdim=3\]" } set loadParam(file,name) $fn # mask not supported set loadParam(load,layer) {} # check for stdin/gz ConvertArrayFile ProcessLoad } proc ImportRGBArrayAlloc {path fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d {return} rgb {} } set loadParam(file,type) array set loadParam(file,mode) {rgb cube} set loadParam(load,type) allocgz # if no zdim is present, insert one set exp {.*\[.*zdim[ ]*=[ ]*[0-9]+} if {![regexp $exp $fn]} { set i [string last "\]" $fn] set fn "[string range $fn 0 [expr $i-1]],zdim=3\]" } if {![regexp $exp $path]} { set i [string last "\]" $path] set path "[string range $path 0 [expr $i-1]],zdim=3\]" } set loadParam(file,name) $fn set loadParam(file,fn) $path # mask not supported set loadParam(load,layer) {} ProcessLoad } proc ImportRGBArraySocket {sock fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d {return} rgb {} } set loadParam(file,type) array set loadParam(file,mode) {rgb cube} set loadParam(load,type) socketgz # if no zdim is present, insert one set exp {.*\[.*zdim[ ]*=[ ]*[0-9]+} if {![regexp $exp $fn]} { set i [string last "\]" $fn] set fn "[string range $fn 0 [expr $i-1]],zdim=3\]" } set loadParam(file,name) $fn set loadParam(socket,id) $sock # mask not supported set loadParam(load,layer) {} return [ProcessLoad 0] } proc ExportRGBArrayFile {fn opt} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save array rgb cube file "\{$fn\}" $opt } proc ExportRGBArraySocket {sock opt} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save array rgb cube socket $sock $opt } proc ProcessRGBArrayCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current switch -- [string tolower [lindex $var $i]] { new { incr i CreateRGBFrame } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![ImportRGBArraySocket $sock $param]} { InitError xpa ImportRGBArrayFile $param } } else { # comm if {$fn != {}} { ImportRGBArrayAlloc $fn $param } else { ImportRGBArrayFile $param } } FinishLoad } proc ProcessSendRGBArrayCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } set opt [string tolower [lindex $param 0]] if {$sock != {}} { # xpa ExportRGBArraySocket $sock $opt } elseif {$fn != {}} { # comm ExportRGBArrayFile $fn $opt $proc $id {} $fn } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/rgbcube.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000005563 12464211204 016651� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadRGBCubeFile {fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb cube} set loadParam(load,type) mmapincr set loadParam(file,name) $fn # mask not supported set loadParam(load,layer) {} ConvertFitsFile ProcessLoad } proc LoadRGBCubeAlloc {path fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb cube} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path # mask not supported set loadParam(load,layer) {} ProcessLoad } proc LoadRGBCubeSocket {sock fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb cube} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock # mask not supported set loadParam(load,layer) {} return [ProcessLoad 0] } proc SaveRGBCubeFile {fn} { global current if {$fn == {} || $current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits rgb cube file "\{$fn\}" } proc SaveRGBCubeSocket {sock} { global current if {$current(frame) == {}} { return } if {![$current(frame) has fits]} { return } $current(frame) save fits rgb cube socket $sock } proc ProcessRGBCubeCmd {varname iname sock fn} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { new { incr i CreateRGBFrame } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadRGBCubeSocket $sock $param]} { InitError xpa LoadRGBCubeFile $param } } else { # comm if {$fn != {}} { LoadRGBCubeAlloc $fn $param } else { LoadRGBCubeFile $param } } FinishLoad } proc ProcessSendRGBCubeCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } if {$sock != {}} { # xpa SaveRGBCubeSocket $sock } elseif {$fn != {}} { # comm SaveRGBCubeFile $fn $proc $id {} $fn } } ���������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/rgbimage.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000006303 12464211204 017006� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadRGBImageFile {fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb image} set loadParam(load,type) mmapincr set loadParam(file,name) $fn # mask not supported set loadParam(load,layer) {} ConvertFitsFile ProcessLoad } proc LoadRGBImageAlloc {path fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb image} set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $path # mask not supported set loadParam(load,layer) {} ProcessLoad } proc LoadRGBImageSocket {sock fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb image} set loadParam(load,type) socketgz set loadParam(file,name) $fn set loadParam(socket,id) $sock # mask not supported set loadParam(load,layer) {} return [ProcessLoad 0] } proc SaveRGBImageFile {fn} { global current if {$fn == {} || $current(frame) == {}} { return } switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to save RGB image from a non-rgb frame}] return } rgb {} } if {![$current(frame) has fits]} { return } $current(frame) save fits rgb image file "\{$fn\}" } proc SaveRGBImageSocket {sock} { global current if {$current(frame) == {}} { return } switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to save RGB image from a non-rgb frame}] return } rgb {} } if {![$current(frame) has fits]} { return } $current(frame) save fits rgb image socket $sock } proc ProcessRGBImageCmd {varname iname sock fn} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { new { incr i CreateRGBFrame } mask { incr i # not supported } slice { incr i # not supported } } set param [lindex $var $i] StartLoad if {$sock != {}} { # xpa if {![LoadRGBImageSocket $sock $param]} { InitError xpa LoadRGBImageFile $param } } else { # comm if {$fn != {}} { LoadRGBImageAlloc $fn $param } else { LoadRGBImageFile $param } } FinishLoad } proc ProcessSendRGBImageCmd {proc id param sock fn} { global current if {$current(frame) == {}} { return } if {$sock != {}} { # xpa SaveRGBImageSocket $sock } elseif {$fn != {}} { # comm SaveRGBImageFile $fn $proc $id {} $fn } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/ruler.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000005325 12514261633 016374� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc RulerDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set s [$var(frame) get marker $var(id) ruler system] set var(system) [lindex $s 0] set var(sky) [lindex $s 1] set var(skyformat) degrees set var(dcoord) [lindex $s 2] set var(dformat) [lindex $s 3] # procs set var(which) ruler set var(proc,apply) RulerApply set var(proc,coordCB) RulerCoordCB set var(proc,editCB) RulerEditCB set var(proc,distCB) RulerDistCB # base MarkerBaseLineDialog $varname 375 200 set f $var(top).param # Axis Length ttk::label $f.tlen -text [msgcat::mc {Axis Length}] ttk::label $f.rx -textvariable ${varname}(distx) -relief groove -width 12 ttk::label $f.ry -textvariable ${varname}(disty) -relief groove -width 12 ttk::label $f.ulen -textvariable ${varname}(dcoord,msg) grid $f.tlen $f.rx $f.ry $f.ulen -padx 2 -pady 2 -sticky w } # actions proc RulerApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) ruler point $var(system) $var(sky) \ $var(x) $var(y) $var(x2) $var(y2) MarkerBaseLineApply $varname } # callbacks proc RulerCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "RulerCoordCB" } MarkerBaseCoordCB $varname $var(frame) marker $var(id) ruler system $var(system) $var(sky) \ $var(dcoord) $var(dformat) RulerEditCB $varname } proc RulerEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "RulerEditCB" } MarkerBaseLineEditCB $varname set d [$var(frame) get marker $var(id) ruler length \ $var(dcoord) $var(dformat)] set var(dist) [lindex $d 0] set var(distx) [lindex $d 1] set var(disty) [lindex $d 2] set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] } proc RulerDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "RulerDistCB" } $var(frame) marker $var(id) ruler system $var(system) $var(sky) \ $var(dcoord) $var(dformat) set d [$var(frame) get marker $var(id) ruler length \ $var(dcoord) $var(dformat)] set var(dist) [lindex $d 0] set var(distx) [lindex $d 1] set var(disty) [lindex $d 2] } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/samp.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000103230 12630076010 016165� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SAMPDef {} { global isamp set isamp(timeout) 1000 } proc InitSAMP {} { global pds9 if {$pds9(samp)} { catch {SAMPConnect 0} } } # Cmds proc SAMPConnect {{verbose 1}} { global ds9 global isamp global samp global sampmap # connected? if {[info exists samp]} { if {$verbose} { Error [msgcat::mc {SAMP: already connected}] } return } # reset samp array catch {unset samp} set samp(apps,image) {} set samp(apps,table) {} set samp(apps,votable) {} # these are to try to prevent feedback problems with # other probgrams set samp(rcvd,lock) 0 set samp(send,lock) 0 # delete any old tmp files SAMPDelTmpFiles # can we find a hub? if {![SAMPParseHub]} { if {$verbose} { Error [msgcat::mc {SAMP: unable to locate HUB}] } catch {unset samp} return } # register set params [list "string $samp(secret)"] if {![SAMPSend {samp.hub.register} $params rr]} { if {$verbose} { Error [msgcat::mc {SAMP: internal error}] } catch {unset samp} return } set rr [lindex $rr 1] foreach ff $rr { foreach {key val} $ff { switch -- $key { samp.hub-id {set samp(hub) $val} samp.self-id {set samp(self) $val} samp.private-key {set samp(private) $val} } } } # declare metadata catch {unset sampmap} set sampmap(samp.name) {string "SAOImage DS9"} set sampmap(samp.description.text) {string "SAOImage DS9 is an astronomical visualization application"} set sampmap(samp.icon.url) {string "http://ds9.si.edu/doc/sun.gif"} set sampmap(samp.documentation.url) {string "http://ds9.si.edu/doc/ref/index.html"} set sampmap(home.page) {string "http://ds9.si.edu/"} set sampmap(author.name) {string "William Joye"} set sampmap(author.email) {string "saord@cfa.harvard.edu"} set sampmap(author.affiliation) {string "Smithsonian Astrophysical Observatory"} set sampmap(ds9.version) "string [lindex $ds9(version) 0]" set param1 [list "string $samp(private)"] set param2 [list "struct sampmap"] set params "$param1 $param2" if {![SAMPSend {samp.hub.declareMetadata} $params rr]} { if {$verbose} { Error [msgcat::mc {SAMP: internal error}] } catch {unset samp} return } # who are we set samp(port) [lindex [fconfigure [xmlrpc::serve 0] -sockname] 2] set samp(home) "[info hostname]:$samp(port)" # callback set param1 [list "string $samp(private)"] set param2 [list "string http://$samp(home)"] set params "$param1 $param2" if {![SAMPSend {samp.hub.setXmlrpcCallback} $params rr]} { if {$verbose} { Error [msgcat::mc {SAMP: internal error}] } catch {unset samp} return } # declare subscriptions catch {unset sampmap} set sampmap(samp.app.ping) {struct mapPing} set sampmap(samp.hub.event.shutdown) {struct mapShutdown} set sampmap(samp.hub.event.register) {struct mapRegister} set sampmap(samp.hub.event.unregister) {struct mapUnregister} set sampmap(samp.hub.disconnect) {struct mapDisconnect} set sampmap(image.load.fits) {struct mapImageLoadFits} set sampmap(table.load.fits) {struct mapTableLoadFits} set sampmap(table.load.votable) {struct mapTableLoadVotable} set sampmap(table.highlight.row) {struct mapTableHighlightRow} set sampmap(table.select.rowList) {struct mapTableSelectRowList} set sampmap(coord.pointAt.sky) {struct mapCoordPointAtSky} set sampmap(client.env.get) {struct mapClientEnvGet} set sampmap(ds9.get) {struct mapDS9Get} set sampmap(ds9.set) {struct mapDS9Set} set param1 [list "string $samp(private)"] set param2 [list "struct sampmap"] set params "$param1 $param2" if {![SAMPSend {samp.hub.declareSubscriptions} $params rr]} { if {$verbose} { Error [msgcat::mc {SAMP: internal error}] } catch {unset samp} return } after $isamp(timeout) SAMPUpdate } proc SAMPDisconnect {} { global ds9 global samp # connected? if {![info exists samp]} { Error [msgcat::mc {SAMP: not connected}] return } # disconnect if {[info exists samp(private)]} { set params [list "string $samp(private)"] set rr {} SAMPSend {samp.hub.unregister} $params rr SAMPShutdown } UpdateFileMenu UpdateCATDialog } proc SAMPSendImageLoadFits {id} { global ds9 global current global isamp global samp global sampmap global sampmap2 global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendImageLoadFits" } # connected? if {![info exists samp]} { Error [msgcat::mc {SAMP: not connected}] return } # are we locked? if {$samp(rcvd,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Rcvd locked" } return } # got something to send? if {![$current(frame) has fits]} { return } # save current frame set fn [tmpnam ds9samp {.fits}] catch {$current(frame) save fits image file "\{$fn\}"} # name to use set fnb [$current(frame) get fits file name root base] if {[regexp {(.*)\[.*\]} $fnb aa bb]} { set fnb $bb } # cmd catch {unset sampmap} set sampmap(samp.mtype) {string "image.load.fits"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(url) "string \"[XMLQuote file://localhost/$fn]\"" set sampmap2(name) "string \"[XMLQuote $fnb]\"" set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendTableLoadFits {id} { global ds9 global current global isamp global samp global sampmap global sampmap2 global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendTableLoadFits" } # connected? if {![info exists samp]} { Error [msgcat::mc {SAMP: not connected}] return } # are we locked? if {$samp(rcvd,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Rcvd locked" } return } # got something to send? if {![$current(frame) has fits] && [$current(frame) has fits bin]} { return } # save current frame set fn [tmpnam ds9samp {.fits}] catch {$current(frame) save fits table file "\{$fn\}"} # name to use set fnb [$current(frame) get fits file name root base] if {[regexp {(.*)\[.*\]} $fnb aa bb]} { set fnb $bb } # cmd catch {unset sampmap} set sampmap(samp.mtype) {string "table.load.fits"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(url) "string \"[XMLQuote file://localhost/$fn]\"" set sampmap2(name) "string \"[XMLQuote $fnb]\"" set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendTableLoadVotable {id varname} { global ds9 global isamp global samp global sampmap global sampmap2 upvar #0 $varname var global $varname global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendTableLoadVotable $id $varname" } # connected? if {![info exists samp]} { Error [msgcat::mc {SAMP: not connected}] return } # are we locked? if {$samp(rcvd,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Rcvd locked" } return } # remember set samp(icat,$varname$samp(port)) $varname set samp(ocat,$varname) $varname$samp(port) # save votable set fn [tmpnam ds9samp {.xml}] CATSaveFn $varname $fn CATVOTWrite # cmd catch {unset sampmap} set sampmap(samp.mtype) {string "table.load.votable"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(url) "string \"[XMLQuote file://localhost/$fn]\"" set sampmap2(table-id) "string [XMLQuote $varname$samp(port)]" set sampmap2(name) "string \"[XMLQuote $var(title)]\"" set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendTableHighlightRow {id varname row} { global isamp global samp global sampmap global sampmap2 # row starts at 1 upvar #0 $varname var global $varname global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendTableHighlightRow $samp(ocat,$varname) $row" } catch {unset sampmap} set sampmap(samp.mtype) {string "table.highlight.row"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(table-id) "string [XMLQuote $samp(ocat,$varname)]" set sampmap2(row) "string [XMLQuote [expr $row-1]]" set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendTableSelectRowList {id varname rows} { global isamp global samp global sampmap global sampmap2 # rows start at 1 upvar #0 $varname var global $varname global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendTableSelectRowList $samp(ocat,$varname) $rows" } catch {unset sampmap} set sampmap(samp.mtype) {string "table.select.rowList"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(table-id) "string [XMLQuote $samp(ocat,$varname)]" set ss {} foreach rr $rows { lappend ss "string [expr $rr-1]" } set sampmap2(row-list) [list array $ss] set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendTableRowListCmd {varname rowlist} { global ds9 global samp # connected? if {![info exists samp]} { return } if {$samp(apps,votable) == {}} { return } # are we good? if {![info exists samp(ocat,$varname)]} { return } # are we locked? if {$samp(rcvd,lock)} { global debug if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Rcvd locked" } return } switch -- [llength $rowlist] { 0 {} 1 {SAMPSendTableHighlightRow {} $varname $rowlist} default {SAMPSendTableSelectRowList {} $varname $rowlist} } } proc SAMPSendCoordPointAtSky {id coord} { global isamp global samp global sampmap global sampmap2 global debug if {$debug(tcl,samp)} { puts stderr "SAMPSendCoordPointAtSky $id $coord" } catch {unset sampmap} set sampmap(samp.mtype) {string "coord.pointAt.sky"} set sampmap(samp.params) {struct sampmap2} catch {unset sampmap2} set sampmap2(ra) "string [XMLQuote [lindex $coord 0]]" set sampmap2(dec) "string [XMLQuote [lindex $coord 1]]" set param1 [list "string $samp(private)"] if {$id != {}} { set param2 [list "string $id"] } else { set param2 {} } set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {$id != {}} { SAMPSend {samp.hub.notify} $params rr } else { SAMPSend {samp.hub.notifyAll} $params rr } # set lock set samp(send,lock) 1 after $isamp(timeout) SAMPClearSendLock } proc SAMPSendCoordPointAtSkyCmd {which} { global ds9 global samp # connected? if {![info exists samp]} { return } # are we locked? if {$samp(rcvd,lock)} { global debug if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Rcvd locked" } return } if {$samp(apps,image) == {} || $samp(apps,table) == {}} { return } if {[$which has wcs equatorial wcs]} { set coord [$which get coordinates [$which get cursor canvas] wcs fk5 degrees] if {$coord != {}} { SAMPSendCoordPointAtSky {} "$coord" } } } # Support proc SAMPShutdown {} { global ds9 global samp # delete any files SAMPDelTmpFiles # close the server socket if still up catch {close $xmlrpc::acceptfd} # update the menus set samp(apps,image) {} set samp(apps,table) {} set samp(apps,votable) {} UpdateFileMenu UpdateCATDialog # unset samp array catch {unset samp} } proc SAMPUpdate {} { # this routine is run after a delay since it needs to # call the hub for metadata # connected? we might have already disconnected. global samp if {![info exists samp]} { return } global debug if {$debug(tcl,samp)} { puts stderr "SAMPUpdate" } # image fits set param1 [list "string $samp(private)"] set param2 [list "string image.load.fits"] set params "$param1 $param2" if {![SAMPSend {samp.hub.getSubscribedClients} $params rr]} { return } set samp(apps,image) {} foreach arg [lindex $rr 1] { foreach {key val} $arg { if {$key != {}} { lappend samp(apps,image) [list $key [SAMPGetAppName $key]] } } } # table fits set param1 [list "string $samp(private)"] set param2 [list "string table.load.fits"] set params "$param1 $param2" if {![SAMPSend {samp.hub.getSubscribedClients} $params rr]} { return } set samp(apps,table) {} foreach arg [lindex $rr 1] { foreach {key val} $arg { if {$key != {}} { lappend samp(apps,table) [list $key [SAMPGetAppName $key]] } } } # votable set param1 [list "string $samp(private)"] set param2 [list "string table.load.votable"] set params "$param1 $param2" if {![SAMPSend {samp.hub.getSubscribedClients} $params rr]} { return } set samp(apps,votable) {} foreach arg [lindex $rr 1] { foreach {key val} $arg { if {$key != {}} { lappend samp(apps,votable) [list $key [SAMPGetAppName $key]] } } } if {$debug(tcl,samp)} { puts stderr "SAMPUpdate: image apps: $samp(apps,image)" puts stderr "SAMPUpdate: table apps: $samp(apps,table)" puts stderr "SAMPUpdate: votable apps: $samp(apps,votable)" } UpdateFileMenu UpdateCATDialog } proc SAMPSend {method params resultVar} { upvar $resultVar result global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPSend: $method $params" } if {[catch {set result [xmlrpc::call $samp(url) $samp(method) $method $params]}]} { if {$debug(tcl,samp)} { puts stderr "SAMPSend Error: $result" } return 0 } # reset error if needed # xmlrpc leaves error msgs InitError samp if {$debug(tcl,samp)} { puts stderr "SAMPSend Result: $result" } return 1 } proc SAMPReply {msgid status {result {}} {url {}} {error {}}} { global samp global sampmap global sampmap2 global sampmap3 global debug if {$debug(tcl,samp)} { puts stderr "SAMPReply:$msgid:$status:$result:$url:$error:" } catch {unset sampmap} catch {unset sampmap2} catch {unset sampmap3} switch -- $status { OK { set sampmap(samp.status) {string "samp.ok"} set sampmap(samp.result) {struct sampmap2} if {$result != {}} { set sampmap2(value) "string \"[XMLQuote $result]\"" } if {$url != {}} { set sampmap2(url) "string \"[XMLQuote $url]\"" } } WARNING { set sampmap(samp.status) {string "samp.warning"} set sampmap(samp.result) {struct sampmap2} set sampmap(samp.error) {struct sampmap3} if {$result != {}} { set sampmap2(value) "string \"[XMLQuote $result]\"" } if {$url != {}} { set sampmap2(url) "string \"[XMLQuote $url]\"" } set sampmap3(samp.errortxt) "string \"[XMLQuote $error]\"" } ERROR { set sampmap(samp.status) {string "samp.error"} set sampmap(samp.error) {struct sampmap3} set sampmap3(samp.errortxt) "string \"[XMLQuote $error]\"" } } set param1 [list "string $samp(private)"] set param2 [list "string $msgid"] set param3 [list "struct sampmap"] set params "$param1 $param2 $param3" if {![SAMPSend {samp.hub.reply} $params rr]} { return } } proc SAMPClearSendLock {} { global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPClearSendLock" } set samp(send,lock) 0 } # receiveNotification(string sender-id, map message) proc samp.client.receiveNotification {args} { global debug if {$debug(tcl,samp)} { puts stderr "SAMPReceivedNotification: $args" } set secret [lindex $args 0] set id [lindex $args 1] set map [lindex $args 2] set mtype {} set params {} foreach mm $map { foreach {key val} $mm { switch -- $key { samp.mtype {set mtype $val} samp.params {set params $val} } } } switch -- $mtype { samp.hub.event.shutdown { SAMPRcvdEventShutdown params } samp.hub.event.register { SAMPRcvdEventRegister params } samp.hub.event.unregister { SAMPRcvdEventUnregister params } samp.hub.disconnect { SAMPRcvdDisconnect params } image.load.fits { SAMPRcvdImageLoadFits params } table.load.fits { SAMPRcvdTableLoadFits params } table.load.votable { SAMPRcvdTableLoadVotable params } table.highlight.row { SAMPRcvdTableHighlightRow params } table.select.rowList { SAMPRcvdTableSelectRowList params } coord.pointAt.sky { SAMPRcvdCoordPointAtSky params } ds9.set { SAMPRcvdDS9Set {} params } default { if {$debug(tcl,samp)} { puts stderr "SAMP samp.client.receiveNotification: bad mtype $mtype" } } } return {string OK} } # receiveCall(string sender-id, string msg-id, map message) proc samp.client.receiveCall {args} { global debug if {$debug(tcl,samp)} { puts stderr "SAMPReceivedCall: $args" } set secret [lindex $args 0] set id [lindex $args 1] set msgid [lindex $args 2] set map [lindex $args 3] set mtype {} set params {} foreach mm $map { foreach {key val} $mm { switch -- $key { samp.mtype {set mtype $val} samp.params {set params $val} } } } switch -- $mtype { samp.app.ping { SAMPReply $msgid OK } image.load.fits { SAMPRcvdImageLoadFits params SAMPReply $msgid OK } table.load.fits { SAMPRcvdTableLoadFits params SAMPReply $msgid OK } table.load.votable { SAMPRcvdTableLoadVotable params SAMPReply $msgid OK } table.highlight.row { SAMPRcvdTableHighlightRow params SAMPReply $msgid OK } table.select.rowList { SAMPRcvdTableSelectRowList params SAMPReply $msgid OK } coord.pointAt.sky { SAMPRcvdCoordPointAtSky params SAMPReply $msgid OK } client.env.get { SAMPRcvdClientEnvGet $msgid params } ds9.get { SAMPRcvdDS9Get $msgid params } ds9.set { SAMPRcvdDS9Set $msgid params } default { SAMPReply $msgid ERROR {} {} "[msgcat::mc {Unknown command}]: $mtype" if {$debug(tcl,samp)} { puts stderr "SAMP samp.client.receiveCall: bad mtype $mtype" } } } return {string OK} } # receiveResponse(string responder-id, string msg-tag, map response) proc samp.client.receiveResponse {args} { global debug if {$debug(tcl,samp)} { puts stderr "SAMPReceivedResponse: $args" } set msgtag [lindex $args 0] set value [lindex $args 1] set map [lindex $args 2] return {string OK} } # Support proc SAMPParseHub {} { global samp global env set fn {} if {[info exists env(SAMP_HUB)]} { if {$env(SAMP_HUB) != {}} { set exp {std-lockurl:(.*)} if {[regexp $exp $env(SAMP_HUB) dummy url]} { ParseURL $url rr switch -- $rr(scheme) { ftp { set fn [tmpnam ds9samp {.samp}] GetFileFTP $rr(authority) $rr(path) $fn } file {set fn $rr(path)} http - default { set fn [tmpnam ds9samp {.samp}] GetFileHTTP $url $fn } } } } } if {$fn == {}} { # look in home directory for .samp global tcl_platform switch $tcl_platform(platform) { unix { set fn [file join [GetEnvHome] {.samp}] } windows { set fn [file join "$env(HOMEDRIVE)$env(HOMEPATH)" {.samp}] } } } # no hub to be found if {![file exist $fn]} { return 0 } set samp(secret) {} set samp(url) {} set samp(metod) {} set fp [open $fn r] while {1} { if {[gets $fp line] == -1} { break } # skip any comments if {[string range $line 0 0] == "#"} { continue; } if {[regexp -nocase {samp.secret=(.*)} $line foo ss]} { set samp(secret) $ss } if {[regexp -nocase {samp.hub.xmlrpc.url=(.*)} $line foo url]} { if {[ParseURL $url r]} { set samp(url) $r(scheme)://$r(authority) set samp(method) [string range $r(path) 1 end] } } } catch {close $fp} if {$samp(secret) == {} || $samp(url) == {}} { SAMPDelTmpFiles return 0 } global debug if {$debug(tcl,samp)} { puts stderr "SAMPParseHub: $samp(secret) $samp(url) $samp(method)" } return 1 } proc SAMPGetAppName {id} { global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPGetAppName: $id" } set param1 [list "string $samp(private)"] set param2 [list "string $id"] set params "$param1 $param2" if {![SAMPSend {samp.hub.getMetadata} $params rr]} { return } set name {} foreach arg [lindex $rr 1] { foreach {key val} $arg { switch -- $key { samp.name {set name [XMLUnQuote $val]} } } } return $name } # CallBacks # Hub proc SAMPRcvdEventShutdown {varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdEventShutdown: $args" } SAMPShutdown } proc SAMPRcvdEventRegister {varname} { upvar $varname args global isamp global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdEventRegister: $args" } foreach arg $args { foreach {key val} $arg { switch -- $key { id { # check to see if its just us if {$samp(self) == $val} { return } } } } } # wait after $isamp(timeout) SAMPUpdate } proc SAMPRcvdEventUnregister {varname} { upvar $varname args global isamp global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdEventUnregister: $args" } foreach arg $args { foreach {key val} $arg { switch -- $key { id { # check to see if its just us if {$samp(self) == $val} { return } } } } } # wait after $isamp(timeout) SAMPUpdate } proc SAMPRcvdDisconnect {varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdDisconnect: $args" } set msg {} foreach arg $args { foreach {key val} $arg { switch -- $key { reason {set msg [XMLUnQuote $val]} } } } SAMPShutdown } # HTTPClient proc SAMPRcvdImageLoadFits {varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdImageLoadFits: $args" } global current global samp # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set imageid {} set name {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} image-id {set imageid [XMLUnQuote $val]} name {set name [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdImageLoadFits: $url $imageid $name" } if {$url != {}} { MultiLoad LoadURLFits $url {} {} } } proc SAMPRcvdTableLoadFits {varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableLoadFits: $args" } global current global samp # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set imageid {} set name {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} image-id {set imageid [XMLUnQuote $val]} name {set name [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableLoadFits: $url $imageid $name" } if {$url != {}} { MultiLoad LoadURLFits $url {} {} } } proc SAMPRcvdTableLoadVotable {varname} { upvar $varname args global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableLoadVotable: $args" } # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set tabid {} set name {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} table-id {set tabid [XMLUnQuote $val]} name {set name [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableLoadVotable: $url $tabid $name" } global icat if {$url != {}} { CATVOTURL $url $name $tabid if {$tabid != {}} { set catid [lindex $icat(cats) end] set samp(icat,$tabid) $catid set samp(ocat,$catid) $tabid } } } proc SAMPRcvdTableHighlightRow {varname} { upvar $varname args global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableHighlightRow: $args" } # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set tabid {} set row {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} table-id {set tabid [XMLUnQuote $val]} row {set row [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableHighlightRow: $url $tabid $row" } if {$tabid != {} && $row != {}} { if {[info exists samp(icat,$tabid)]} { CATSelectRows $samp(icat,$tabid) samp [expr $row+1] } } } proc SAMPRcvdTableSelectRowList {varname} { upvar $varname args global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableSelectRowList: $args" } # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set tabid {} set rowlist {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} table-id {set tabid [XMLUnQuote $val]} row-list { foreach rr [XMLUnQuote $val] { lappend rowlist [expr $rr+1] } } } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdTableSelectRowList: $url $tabid $rowlist" } if {$tabid != {} && [llength $rowlist] != 0} { if {[info exists samp(icat,$tabid)]} { CATSelectRows $samp(icat,$tabid) samp $rowlist } } } proc SAMPRcvdCoordPointAtSky {varname} { upvar $varname args global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdCoordPointAtSky: $args" } # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set ra {} set dec {} foreach arg $args { foreach {key val} $arg { switch -- $key { ra {set ra [XMLUnQuote $val]} dec {set dec [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdCoordPointAtSky: $ra $dec" } global current if {$ra != {} && $dec != {} && [$current(frame) has wcs equatorial wcs]} { set samp(rcvd,lock) 1 PanTo $ra $dec wcs fk5 set samp(rcvd,lock) 0 } } proc SAMPRcvdClientEnvGet {msgid varname} { upvar $varname args global samp global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdClientEnvGet: $msgid $args" } # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set name {} foreach arg $args { foreach {key val} $arg { switch -- $key { name {set name [XMLUnQuote $val]} } } } if {$debug(tcl,samp)} { puts stderr "SAMPRcvdClientEnvGet: $name" } global env if {[catch {set rr $env($name)}]} { SAMPReply $msgid ERROR {} {} [lindex [split $errorInfo "\n"] 0] global errorInfo set errorInfo {} } else { SAMPReply $msgid OK $rr } } proc SAMPRcvdDS9Set {msgid varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdDS9Set: $msgid $args" } global current global samp # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set cmd {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} cmd {set cmd [XMLUnQuote $val]} } } } set fn {} InitError samp if {$url != {}} { set fn [tmpnam ds9samp {.http}] GetFileURL $url fn } CommSet $fn $cmd if {$msgid != {}} { SAMPRcvdDS9SetReply $msgid } } proc SAMPRcvdDS9SetReply {msgid} { global ds9 global icursor global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdDS9SetReply: $msgid" } global errorInfo if {$errorInfo != {} || $ds9(msg) != {}} { if {$ds9(msg) != {}} { switch $ds9(msg,level) { info - warning {SAMPReply $msgid OK $ds9(msg)} error - fatal {SAMPReply $msgid ERROR {} {} $ds9(msg)} } } else { SAMPReply $msgid ERROR {} {} [lindex [split $errorInfo "\n"] 0] } InitError samp # reset cursor set icursor(count) 0 UnsetWatchCursor } else { SAMPReply $msgid OK } } proc SAMPRcvdDS9Get {msgid varname} { upvar $varname args global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdDS9Get: $args" } global current global samp # are we locked? if {$samp(send,lock)} { if {$debug(tcl,samp)} { puts stderr "SAMP: ABORT Send locked" } return } set url {} set cmd {} foreach arg $args { foreach {key val} $arg { switch -- $key { url {set url [XMLUnQuote $val]} cmd {set cmd [XMLUnQuote $val]} } } } set fn [tmpnam ds9samp {}] InitError samp CommGet SAMPRcvdDS9GetReply $msgid $cmd $fn } proc SAMPRcvdDS9GetReply {msgid msg {fn {}}} { global ds9 global icursor global debug if {$debug(tcl,samp)} { puts stderr "SAMPRcvdDS9GetReply: $msgid $msg $fn" } global errorInfo if {$errorInfo != {} || $ds9(msg) != {}} { if {$ds9(msg) != {}} { switch $ds9(msg,level) { info - warning {SAMPReply $msgid OK $ds9(msg)} error - fatal {SAMPReply $msgid ERROR {} {} $ds9(msg)} } } else { SAMPReply $msgid ERROR {} {} [lindex [split $errorInfo "\n"] 0] } InitError samp # reset cursor set icursor(count) 0 UnsetWatchCursor } else { # be sure to white space any newlines, backslashes, and trim set value [string trim [string map {\n { } \\ {}} $msg]] # create url set url {} if {$fn != {}} { set url "file://localhost/$fn" } SAMPReply $msgid OK $value $url } } proc SAMPDelTmpFiles {} { global ds9 # delete any previous files foreach fn [glob -directory $ds9(tmpdir) -nocomplain {ds9samp*}] { catch {file delete -force "$fn"} } } # Cmds proc ProcessSAMPCmd {varname iname} { upvar $varname var upvar $iname i global samp global ds9 global env # we need to be realized ProcessRealizeDS9 SAMPUpdate switch -- [string tolower [lindex $var $i]] { send { incr i switch -- [string tolower [lindex $var $i]] { image { incr i set name [string tolower [lindex $var $i]] if {[info exists samp]} { foreach arg $samp(apps,image) { foreach {key val} $arg { if {[string tolower $val] == $name} { SAMPSendImageLoadFits $key break } } } } else { Error [msgcat::mc {SAMP: not connected}] } } table { incr i set name [string tolower [lindex $var $i]] if {[info exists samp]} { foreach arg $samp(apps,table) { foreach {key val} $arg { if {[string tolower $val] == $name} { SAMPSendTableLoadFits $key break } } } } else { Error [msgcat::mc {SAMP: not connected}] } } default { set name [string tolower [lindex $var $i]] if {[info exists samp]} { foreach arg $samp(apps,image) { foreach {key val} $arg { if {[string tolower $val] == $name} { SAMPSendImageLoadFits $key break } } } } else { Error [msgcat::mc {SAMP: not connected}] } } } } broadcast { incr i switch -- [string tolower [lindex $var $i]] { image {SAMPSendImageLoadFits {}} table {SAMPSendTableLoadFits {}} default { incr i -1 SAMPSendImageLoadFits {} } } } default { if {[FromYesNo [lindex $var $i]]} { SAMPConnect } else { SAMPDisconnect } } } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/sao.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000007162 12544316735 016035� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SAODef {} { global sao global isao set isao(top) .sao set isao(mb) .saomb set sao(sky) fk5 set sao(rformat) arcmin set sao(width) 15 set sao(height) 15 set sao(mode) new set sao(save) 0 set sao(valid) 0 set sao(survey) dss } proc SAODialog {} { global sao global isao global wcs if {[winfo exists $isao(top)]} { raise $isao(top) return } set varname dsao upvar #0 $varname var global $varname set var(top) $isao(top) set var(mb) $isao(mb) set var(sky) $sao(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $sao(rformat) set var(width) $sao(width) set var(height) $sao(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(mode) $sao(mode) set var(save) $sao(save) set var(valid) $sao(valid) set var(survey) $sao(survey) set w $var(top) IMGSVRInit $varname "SAO-DSS [msgcat::mc {Server}]" SAOExec SAOAck IMGSVRUpdate $varname 1 } proc SAOExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set compress no set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set compress gzip set var(fn) [tmpnam ds9sao ".fits.gz"] } # skyformat switch -- $var(skyformat) { degrees { set xx [uformat d h: $var(x)] set yy [uformat d d: $var(y)] } sexagesimal { set xx $var(x) set yy $var(y) } } # size - convert to arcmin switch -- $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } if {$ww>60} { set ww 60 } if {$hh>60} { set hh 60 } # query set var(query) [http::formatQuery r $xx d $yy e J2000 w $ww h $ww c $compress] set var(url) "http://www.cfa.harvard.edu/archive/dss" IMGSVRLoad $varname } proc SAOAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the DSS-SAO The Digitized Sky Surveys were produced at the Space Telescope Science Institute under U.S. Government grant NAG W-2166. The images of these surveys are based on photographic data obtained using the Oschin Schmidt Telescope on Palomar Mountain and the UK Schmidt Telescope. The plates were processed into the present compressed digital form with the permission of these institutions. The Oschin Schmidt Telescope is operated by the California Institute of Technology and Palomar Observatory. The UK Schmidt Telescope was operated by the Royal Observatory Edinburgh, with funding from the UK Science and Engineering Research Council (later the UK Particle Physics and Astronomy Research Council), until 1988 June, and thereafter by the Anglo-Australian Observatory. The blue plates of the southern Sky Atlas and its Equatorial Extension (together known as the SERC-J), as well as the Equatorial Red (ER), and the Second Epoch [red] Survey (SES) were all taken with the UK Schmidt. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessSAOCmd {varname iname} { upvar $varname var upvar $iname i SAODialog IMGSVRProcessCmd $varname $iname dsao } proc ProcessSendSAOCmd {proc id param} { SAODialog IMGSVRProcessSendCmd $proc $id $param dsao } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/save.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000011350 12464211204 016165� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SaveDef {} { global savefits set savefits(type) image set savefits(mosaic) 1 } proc Save {format fn} { global savefits switch -- $format { fits {SaveFitsFile $savefits(type) $fn} sfits {} rgbimage {SaveRGBImageFile $fn} rgbcube {SaveRGBCubeFile $fn} srgbcube {} mecube {SaveMECubeFile $fn} multiframe {} mosaicimage - mosaicimagewcs {SaveMosaicImageWCSFile $fn} mosaicimageiraf {} mosaicimagewfpc {} mosaic - mosaicwcs {SaveMosaicWCSFile $fn $savefits(mosaic)} mosaiciraf {} smosaicwcs {} smosaiciraf {} } } # Process Cmds proc ProcessSaveCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized ProcessRealizeDS9 set format {} set fn [lindex $var $i] if {$fn == {}} { return } switch -- $fn { fits - sfits - rgbimage - rgbcube - srgbcube - mecube - multiframe - mosaicimagewcs - mosaicimageiraf - mosaicimagewfpc - mosaicwcs - mosaiciraf - smosaicwcs - smosaiciraf { set format $fn set fn {} incr i } mosaicimage - mosaic { set format $fn set fn {} incr i # eat any wcs if {[string range [lindex $var $i] 0 2] == {wcs}} { incr i } } } # one last time if {$fn == {}} { set fn [lindex $var $i] if {$fn == {}} { return } } if {$format == {}} { set format [ExtToFormat $fn] } global savefits set param [string tolower [lindex $var [expr $i+1]]] switch $format { fits { switch $param { slice - image - table { set savefits(type) $param incr i } default {set savefits(type) image} } } mosaic - mosaiciraf - mosaicwcs { if {[string is integer -strict $param]} { set savefits(mosaic) $param incr i } } } global savefitsfbox FileLast savefitsfbox $fn Save $format $fn } # Support proc SaveDialog {format} { global savefits global current set fn [SaveFileDialog savefitsfbox] set which image if {$fn != {}} { set ok 1 if {$current(frame) != {}} { switch -- $format { fits { if {[$current(frame) has fits bin]} { set ok [SaveParams savefits] } } slice { set format fits set savefits(type) slice } mosaicwcs - mosaiciraf { if {[$current(frame) has fits mosaic]} { set ok [SaveMosaicParams savefits] } } } } if {$ok} { Save $format $fn } } } proc SaveParams {varname} { upvar $varname var global ed2 set w {.savefits} set ed2(ok) 0 set ed2(type) $var(type) DialogCreate $w {Fits} ed2(ok) # Param set f [ttk::frame $w.param] ttk::label $f.tfits -text [msgcat::mc {Fits}] ttk::radiobutton $f.image -text [msgcat::mc {Image}] \ -variable ed2(type) -value image ttk::radiobutton $f.table -text {Table} \ -variable ed2(type) -value table grid $f.tfits $f.image $f.table -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set var(type) $ed2(type) } set rr $ed2(ok) unset ed2 return $rr } proc SaveMosaicParams {varname} { upvar $varname var global ed2 set w {.savefits} set ed2(ok) 0 set ed2(mosaic) $var(mosaic) DialogCreate $w {Mosaic} ed2(ok) # Param set f [ttk::frame $w.param] ttk::label $f.tmosaic -text [msgcat::mc {Mosaic}] ttk::entry $f.mosaic -textvariable ed2(mosaic) -width 8 grid $f.tmosaic $f.mosaic -padx 2 -pady 2 -sticky w # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed2(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed2(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed2(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed2(ok) DialogDismiss $w if {$ed2(ok)} { set var(mosaic) $ed2(mosaic) } set rr $ed2(ok) unset ed2 return $rr } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/saveimage.tcl��������������������������������������������������������������������000644 �000765 �000000 �00000011743 12632624340 017204� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SaveImageDef {} { global saveimage set saveimage(jpeg,quality) 75 set saveimage(tiff,compress) none set aa [msgcat::mc {An error has occurred while creating the image. Please be sure that the entire image window is visible on the screen.}] set bb [msgcat::mc {An error has occurred while creating the image. Please be sure that the ds9 window is in the upper left corner of the default screen and the entire window is visible.}] set cc [msgcat::mc {This function is not currently supported for this port.}] global ds9 switch $ds9(wm) { x11 { global tcl_platform switch $tcl_platform(os) { Darwin { switch [lindex [split $tcl_platform(osVersion) {.}] 0] { 10 - 11 {set saveimage(error) $bb} 8 - 9 - default {set saveimage(error) $aa} } } default {set saveimage(error) $aa} } } aqua - win32 {set saveimage(error) $cc} } } proc SaveImageDialog {format} { global saveimage global fitsfbox global epsfbox global giffbox global jpegfbox global tifffbox global pngfbox switch -- $format { fits {set fn [SaveFileDialog fitsfbox]} eps {set fn [SaveFileDialog epsfbox]} gif {set fn [SaveFileDialog giffbox]} jpeg {set fn [SaveFileDialog jpegfbox]} tiff {set fn [SaveFileDialog tifffbox]} png {set fn [SaveFileDialog pngfbox]} } if {$fn != {}} { set ok 1 switch -- $format { fits - eps - gif - png {} jpeg {set ok [JPEGExportDialog saveimage(jpeg,quality)]} tiff {set ok [TIFFExportDialog saveimage(tiff,compress)]} } if {$ok} { SaveImage $fn $format } } } proc SaveImage {fn format} { global ds9 global current global saveimage global cube if {$fn == {} || ![$current(frame) has fits]} { return } # besure we are on top raise $ds9(top) # and no highlite $current(frame) highlite off # and refresh screen RealizeDS9 switch -- $format { fits {$current(frame) save fits resample file "\{$fn\}"} eps {EPS $fn} gif - tiff - jpeg - png {SaveImagePhoto $fn $format} } # reset switch -- $ds9(display) { single - blink {} tile {$current(frame) highlite on} } # and refresh screen RealizeDS9 } # Support proc SaveImagePhoto {fn format} { global ds9 global saveimage switch $ds9(wm) { x11 {} aqua - win32 { Error $saveimage(error) return } } set rr [catch {image create photo -format window -data $ds9(canvas)} ph] if {$rr != 0} { Error $saveimage(error) } switch -- $format { gif - png {$ph write $fn -format $format} jpeg {$ph write $fn \ -format [list $format -quality $saveimage(jpeg,quality)]} tiff {$ph write $fn \ -format [list $format -compression $saveimage(tiff,compress)]} } image delete $ph } # Process Cmds proc ProcessSaveImageCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized # yes, really need this # ProcessRealizeDS9 UpdateDS9 RealizeDS9 set format {} set param {} set fn [lindex $var $i] if {$fn == {}} { return } # backward compatibility switch $fn { fits - eps - gif - tiff - jpeg - png { set format $fn set fn {} incr i } jpg { set format jpeg set fn {} incr i } tif { set format tiff set fn {} incr i } mpeg { # backward compatibility global movie incr i set fn [lindex $var $i] if {[string is integer -strict $fn]} { incr i set fn [lindex $var $i] } set movie(action) slice Movie $fn } } # try again if {$fn == {}} { set fn [lindex $var $i] if {$fn == {}} { return } if {[string is integer -strict $fn] || $fn == {none} || $fn == {jpeg} || $fn == {backbits} || $fn == {deflate}} { set param $fn set fn {} incr i } } # one last time if {$fn == {}} { set fn [lindex $var $i] if {$fn == {}} { return } } global saveimage if {$format == {}} { set format [ExtToFormat $fn] } if {$param == {}} { set param [string tolower [lindex $var [expr $i+1]]] switch $format { fits - eps - gif - png {} jpeg { if {[string is integer -strict $param]} { set saveimage(jpeg,quality) $param incr i } } tiff { switch $param { none - jpeg - packbits - deflate { set saveimage(tiff,compress) $param incr i } } } } } global fitsfbox global epsfbox global giffbox global jpegfbox global tifffbox global pngfbox switch -- $format { fits {FileLast fitsfbox $fn} eps {FileLast epsfbox $fn} gif {FileLast giffbox $fn} jpeg {FileLast jpegfbox $fn} tiff {FileLast tifffbox $fn} png {FileLast pngfbox $fn} } SaveImage $fn $format } �����������������������������saods9/ds9/library/scale.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000063016 12620205542 016326� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ScaleDef {} { global scale global iscale global pscale set iscale(top) .scale set iscale(mb) .scalemb set scale(min) 1 set scale(max) 100 set scale(xaxis) full set scale(yaxis) log set scale(bins) 512 set scale(lock) 0 set scale(lock,limits) 0 set scale(type) linear set scale(log) 1000 set scale(mode) minmax set scale(scope) local set scale(datasec) 1 set pscale(type) $scale(type) set pscale(log) $scale(log) set pscale(mode) $scale(mode) set pscale(scope) $scale(scope) set pscale(datasec) $scale(datasec) } proc MinMaxDef {} { global minmax global pminmax set minmax(mode) scan array set pminmax [array get minmax] } proc ZScaleDef {} { global zscale global pzscale set zscale(contrast) .25 set zscale(sample) 600 set zscale(line) 120 array set pzscale [array get zscale] } proc ChangeDATASEC {} { global current global scale global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) datasec $scale(datasec)] UpdateScale } } proc ChangeScale {} { global current global scale global rgb if {$current(frame) != {}} { if {[$current(frame) has iis]} { return {} } RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) colorscale log $scale(log)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) colorscale $scale(type)] UpdateScale } } proc ChangeScaleMode {} { global current global scale global rgb if {$current(frame) != {}} { if {[$current(frame) has iis]} { return {} } RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip mode $scale(mode)] UpdateScale } } proc ChangeScaleLimit {} { global current global scale global rgb if {$current(frame) != {}} { if {[$current(frame) has iis]} { return {} } set scale(mode) user RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip user $scale(min) $scale(max)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip mode $scale(mode)] UpdateScale } } proc ChangeScaleScope {} { global current global scale global rgb if {$current(frame) != {}} { if {[$current(frame) has iis]} { return {} } RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip scope $scale(scope)] UpdateScale } } proc ChangeMinMax {} { global current global minmax global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip minmax mode $minmax(mode)] UpdateScale } } proc ChangeZScale {} { global current global zscale global rgb if {$current(frame) != {}} { RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip zscale contrast $zscale(contrast)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip zscale sample $zscale(sample)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip zscale line $zscale(line)] UpdateScale } } proc UpdateScale {} { global current global debug if {$debug(tcl,update)} { puts stderr "UpdateScale" } LockScaleCurrent LockScaleLimitsCurrent UpdateScaleMenu UpdateScaleDialog UpdateContourScale UpdateGraphYAxis $current(frame) UpdateInfoBoxBase UpdateMain } proc ScaleDialog {} { global scale global iscale global dscale global current global ds9 global minmax global canvas # see if we already have a window visible if {[winfo exists $iscale(top)]} { raise $iscale(top) return } # create the window set w $iscale(top) set mb $iscale(mb) Toplevel $w $mb 6 [msgcat::mc {Scale Parameters}] ScaleDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {Scale}] -menu $mb.scale $mb add cascade -label [msgcat::mc {Limits}] -menu $mb.limit $mb add cascade -label [msgcat::mc {Scope}] -menu $mb.scope $mb add cascade -label [msgcat::mc {Min Max}] -menu $mb.minmax $mb add cascade -label [msgcat::mc {Parameters}] -menu $mb.param $mb add cascade -label [msgcat::mc {Graph}] -menu $mb.graph menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command ScaleApplyDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command ScaleDestroyDialog EditMenu $mb iscale menu $mb.scale $mb.scale add radiobutton -label [msgcat::mc {Linear}] \ -variable scale(type) -command ChangeScale -value linear $mb.scale add radiobutton -label [msgcat::mc {Log}] \ -variable scale(type) -command ChangeScale -value log $mb.scale add radiobutton -label [msgcat::mc {Power}] \ -variable scale(type) -command ChangeScale -value pow $mb.scale add radiobutton -label [msgcat::mc {Square Root}] \ -variable scale(type) -command ChangeScale -value sqrt $mb.scale add radiobutton -label [msgcat::mc {Squared}] \ -variable scale(type) -command ChangeScale -value squared $mb.scale add radiobutton -label {ASINH} \ -variable scale(type) -command ChangeScale -value asinh $mb.scale add radiobutton -label {SINH} \ -variable scale(type) -command ChangeScale -value sinh $mb.scale add radiobutton -label [msgcat::mc {Histogram Equalization}] \ -variable scale(type) -command ChangeScale -value histequ $mb.scale add separator $mb.scale add command -label "[msgcat::mc {Log Exponent}]..." \ -command ScaleLogDialog menu $mb.limit $mb.limit add radiobutton -label [msgcat::mc {Min Max}] \ -variable scale(mode) -command ChangeScaleMode -value minmax $mb.limit add separator $mb.limit add radiobutton -label {99.5%} \ -variable scale(mode) -command ChangeScaleMode -value 99.5 $mb.limit add radiobutton -label {99%} \ -variable scale(mode) -command ChangeScaleMode -value 99 $mb.limit add radiobutton -label {98%} \ -variable scale(mode) -command ChangeScaleMode -value 98 $mb.limit add radiobutton -label {97%} \ -variable scale(mode) -command ChangeScaleMode -value 97 $mb.limit add radiobutton -label {96%} \ -variable scale(mode) -command ChangeScaleMode -value 96 $mb.limit add radiobutton -label {95%} \ -variable scale(mode) -command ChangeScaleMode -value 95 $mb.limit add radiobutton -label {92.5%} \ -variable scale(mode) -command ChangeScaleMode -value 92.5 $mb.limit add radiobutton -label {90%} \ -variable scale(mode) -command ChangeScaleMode -value 90 $mb.limit add separator $mb.limit add radiobutton -label {ZScale} \ -variable scale(mode) -command ChangeScaleMode -value zscale $mb.limit add radiobutton -label {ZMax} \ -variable scale(mode) -command ChangeScaleMode -value zmax $mb.limit add radiobutton -label [msgcat::mc {User}] \ -variable scale(mode) -command ChangeScaleMode -value user menu $mb.scope $mb.scope add radiobutton -label [msgcat::mc {Global}] \ -variable scale(scope) -command ChangeScaleScope -value global $mb.scope add radiobutton -label [msgcat::mc {Local}] \ -variable scale(scope) -command ChangeScaleScope -value local menu $mb.minmax $mb.minmax add radiobutton -label [msgcat::mc {Scan}] \ -variable minmax(mode) -value scan -command ChangeMinMax $mb.minmax add radiobutton -label {DATAMIN DATAMAX} \ -variable minmax(mode) -value datamin -command ChangeMinMax $mb.minmax add radiobutton -label {IRAF-MIN IRAF-MAX} \ -variable minmax(mode) -value irafmin -command ChangeMinMax menu $mb.param $mb.param add checkbutton -label "[msgcat::mc {Use}] DATASEC" \ -variable scale(datasec) -command ChangeDATASEC $mb.param add separator $mb.param add command -label {ZScale...} -command ZScaleDialog menu $mb.graph $mb.graph add radiobutton -label [msgcat::mc {Linear}] \ -value linear -variable scale(yaxis) -command ScaleYAxisDialog $mb.graph add radiobutton -label [msgcat::mc {Log}] \ -value log -variable scale(yaxis) -command ScaleYAxisDialog $mb.graph add separator $mb.graph add radiobutton -label [msgcat::mc {Full Range}] \ -value full -variable scale(xaxis) -command ScaleXAxisDialog $mb.graph add radiobutton -label [msgcat::mc {Current Range}] \ -value current -variable scale(xaxis) -command ScaleXAxisDialog # Param set f [ttk::frame $w.param] # Graph set dscale(hist) [blt::graph $f.chart \ -width 500 \ -height 200 \ -title [msgcat::mc {Pixel Distribution}] \ -font [font actual TkDefaultFont] \ -plotrelief groove \ -plotborderwidth 2 \ ] $dscale(hist) legend configure -hide yes $dscale(hist) xaxis configure -hide yes -grid no -ticklength 3 \ -tickfont [font actual TkDefaultFont] $dscale(hist) yaxis configure -hide yes -grid yes -ticklength 3 \ -tickfont [font actual TkDefaultFont] set dscale(xdata) histX set dscale(ydata) histY blt::vector create $dscale(xdata) $dscale(ydata) $dscale(hist) element create bar1 -smooth step -areabackground black \ -xdata $dscale(xdata) -ydata $dscale(ydata) # Cut Lines $dscale(hist) marker bind min <B1-Motion> \ [list ScaleMotionDialog %x %y dscale(min)] $dscale(hist) marker bind max <B1-Motion> \ [list ScaleMotionDialog %x %y dscale(max)] $dscale(hist) marker bind up <ButtonRelease-1> ScaleReleaseDialog set dscale(histmin) [$dscale(hist) marker create line -element bar1 \ -outline red -bindtags [list min up]] set dscale(histmax) [$dscale(hist) marker create line -element bar1 \ -outline green -bindtags [list max up]] # Cut Levels ttk::label $f.title -text [msgcat::mc {Limits}] ttk::label $f.ltitle -text [msgcat::mc {Low}] ttk::entry $f.lvalue -textvariable dscale(min) -width 13 ttk::label $f.htitle -text [msgcat::mc {High}] ttk::entry $f.hvalue -textvariable dscale(max) -width 13 pack $dscale(hist) -fill both -expand true pack $f.title $f.ltitle $f.lvalue $f.htitle $f.hvalue \ -side left -padx 2 -pady 2 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command ScaleApplyDialog ttk::button $f.close -text [msgcat::mc {Close}] -command ScaleDestroyDialog pack $f.apply $f.close -side left -expand true -padx 2 -pady 4 # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true UpdateScaleDialog } proc ScaleApplyDialog {} { global scale global dscale global current global rgb if {$current(frame) != {} && $dscale(min) != {} && $dscale(max) != {}} { $dscale(hist) marker configure $dscale(histmin) \ -coords "$dscale(min) -Inf $dscale(min) Inf" $dscale(hist) marker configure $dscale(histmax) \ -coords "$dscale(max) -Inf $dscale(max) Inf" set scale(min) $dscale(min) set scale(max) $dscale(max) set scale(mode) user RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip user $scale(min) $scale(max)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip mode $scale(mode)] UpdateScale } } proc ScaleDestroyDialog {} { global scale global iscale global dscale if {[winfo exists $iscale(top)]} { destroy $iscale(top) destroy $iscale(mb) } blt::vector destroy $dscale(xdata) $dscale(ydata) unset dscale } proc ScaleMotionDialog {x y varname} { upvar $varname var global scale global dscale set var [lindex [$dscale(hist) invtransform $x $y] 0] if {$dscale(min) > $dscale(max)} { if {$varname == "dscale(min)"} { set var $dscale(max) } else { set var $dscale(min) } } $dscale(hist) marker configure $dscale(histmin) \ -coords "$dscale(min) -Inf $dscale(min) Inf" $dscale(hist) marker configure $dscale(histmax) \ -coords "$dscale(max) -Inf $dscale(max) Inf" } proc ScaleReleaseDialog {} { global scale global dscale global current global rgb if {$current(frame) != {} && $dscale(min) != {} && $dscale(max) != {}} { set scale(min) $dscale(min) set scale(max) $dscale(max) set scale(mode) user RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip user $scale(min) $scale(max)] RGBEvalLockCurrent rgb(lock,scale) [list $current(frame) clip mode $scale(mode)] UpdateScale ScaleXAxisDialog } } proc UpdateScaleDialog {} { global scale global iscale global dscale global current global debug if {$debug(tcl,update)} { puts stderr "UpdateScaleDialog" } if {![winfo exists $iscale(top)]} { return } set dscale(min) {} set dscale(max) {} if {$current(frame) != {}} { set limits [$current(frame) get clip] set dscale(min) [lindex $limits 0] set dscale(max) [lindex $limits 1] # "nan" will not pass if {[$current(frame) has fits] && ![$current(frame) has iis] && ($dscale(min)<$dscale(max))} { set limits [$current(frame) get minmax] set dscale(minmin) [lindex $limits 0] set dscale(minmax) [lindex $limits 1] $current(frame) get histogram \ $dscale(xdata) $dscale(ydata) $scale(bins) # we seem to need to do this so that the min/max values are known blt::vector expr min($dscale(ydata)) blt::vector expr max($dscale(ydata)) $dscale(hist) element configure bar1 -hide no $dscale(hist) xaxis configure -hide no $dscale(hist) yaxis configure -hide no -min 1 $dscale(hist) marker configure $dscale(histmin) \ -coords "$dscale(min) -Inf $dscale(min) Inf" $dscale(hist) marker configure $dscale(histmax) \ -coords "$dscale(max) -Inf $dscale(max) Inf" if {[$current(frame) has datamin]} { $iscale(mb).minmax \ entryconfig {DATAMIN DATAMAX} -state normal } else { $iscale(mb).minmax \ entryconfig {DATAMIN DATAMAX} -state disabled } if {[$current(frame) has irafmin]} { $iscale(mb).minmax \ entryconfig {IRAF-MIN IRAF-MAX} -state normal } else { $iscale(mb).minmax \ entryconfig {IRAF-MIN IRAF-MAX} -state disabled } ScaleYAxisDialog ScaleXAxisDialog return } } $dscale(hist) element configure bar1 -hide yes $dscale(hist) xaxis configure -hide yes $dscale(hist) yaxis configure -hide yes $iscale(mb) entryconfig [msgcat::mc {Scope}] -state normal $iscale(mb).minmax entryconfig {DATAMIN DATAMAX} -state normal $iscale(mb).minmax entryconfig {IRAF-MIN IRAF-MAX} -state normal } proc UpdateScaleDialogFont {} { global iscale global dscale if {![winfo exists $iscale(top)]} { return } $dscale(hist) configure -font [font actual TkDefaultFont] $dscale(hist) xaxis configure -tickfont [font actual TkDefaultFont] $dscale(hist) yaxis configure -tickfont [font actual TkDefaultFont] } proc ScaleYAxisDialog {} { global scale global dscale switch -- $scale(yaxis) { linear {$dscale(hist) yaxis configure -logscale 0 -min 0} log {$dscale(hist) yaxis configure -logscale 1 -min 1} } } proc ScaleXAxisDialog {} { global scale global dscale switch -- $scale(xaxis) { full { set width [expr abs(1.0*($dscale(minmax)-$dscale(minmin))/ \ [$dscale(xdata) length])] $dscale(hist) xaxis configure \ -min [expr $dscale(minmin)-$width] \ -max [expr $dscale(minmax)+$width] } current { set width [expr abs(1.0*($dscale(max)-$dscale(min))/ \ [$dscale(xdata) length])] if {[expr abs($dscale(max)-$dscale(min)) > 0]} { set diff [expr $dscale(max)-$dscale(min)] set per .10 set a [expr $dscale(min)-($diff*$per)] set b [expr $dscale(max)+($diff*$per)] $dscale(hist) xaxis configure -min $a -max $b } } } } proc ScaleLogDialog {} { global scale if {[EntryDialog [msgcat::mc {Scale}] [msgcat::mc {Log Exponent}] 10 scale(log)]} { ChangeScale } } proc ZScaleDialog {} { global zscale if {[ZScaleTemplate zscale]} { ChangeZScale } } proc ZScaleTemplate {varname} { upvar $varname var global $varname global ed set w {.zscale} set ed(ok) 0 array set ed [array get ${varname}] DialogCreate $w "ZScale [msgcat::mc {Parameters}]" ed(ok) # Param set f [ttk::frame $w.param] slider $f.scontrast 0. 1. [msgcat::mc {Contrast}] ed(contrast) {} slider $f.ssize 0 1000 [msgcat::mc {Number of Samples}] ed(sample) {} slider $f.sline 0 500 [msgcat::mc {Samples per Line}] ed(line) {} grid $f.scontrast -padx 2 -pady 2 -sticky ew grid $f.ssize -padx 2 -pady 2 -sticky ew grid $f.sline -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active ttk::button $f.cancel -text [msgcat::mc {Cancel}] -command {set ed(ok) 0} pack $f.ok $f.cancel -side left -expand true -padx 2 -pady 4 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w if {$ed(ok)} { if {$ed(line) == 0} { set ed(line) 1 } array set ${varname} [array get ed] } set rr $ed(ok) unset ed return $rr } proc MatchScaleCurrent {} { global current if {$current(frame) != {}} { MatchScale $current(frame) } } proc MatchScaleLimitsCurrent {} { global current if {$current(frame) != {}} { MatchScaleLimits $current(frame) } } proc MatchScale {which} { global ds9 global rgb global scale set type [$which get colorscale] set log [$which get colorscale log] #waj set limits [$which get clip] set mode [$which get clip mode] set scope [$which get clip scope] set mmmode [$which get clip minmax mode] set zscontrast [$which get clip zscale contrast] set zssample [$which get clip zscale sample] set zsline [$which get clip zscale line] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,scale) $ff [list $ff colorscale $type] RGBEvalLock rgb(lock,scale) $ff [list $ff colorscale log $log] RGBEvalLock rgb(lock,scale) $ff [list $ff clip user $limits] RGBEvalLock rgb(lock,scale) $ff [list $ff clip mode $mode] RGBEvalLock rgb(lock,scale) $ff [list $ff clip scope $scope] RGBEvalLock rgb(lock,scale) $ff [list $ff clip minmax mode $mmmode] RGBEvalLock rgb(lock,scale) $ff [list $ff clip zscale contrast $zscontrast] RGBEvalLock rgb(lock,scale) $ff [list $ff clip zscale sample $zssample] RGBEvalLock rgb(lock,scale) $ff [list $ff clip zscale line $zsline] } } } proc MatchScaleLimits {which} { global ds9 global rgb global scale #waj set limits [$which get clip] set mode user set type [$which get colorscale] set log [$which get colorscale log] set scope [$which get clip scope] set mmmode [$which get clip minmax mode] set zscontrast [$which get clip zscale contrast] set zssample [$which get clip zscale sample] set zsline [$which get clip zscale line] foreach ff $ds9(frames) { if {$ff != $which} { RGBEvalLock rgb(lock,scalelimits) $ff [list $ff colorscale $type] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff colorscale log $log] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip user $limits] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip mode $mode] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip scope $scope] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip minmax mode $mmmode] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip zscale contrast $zscontrast] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip zscale sample $zssample] RGBEvalLock rgb(lock,scalelimits) $ff [list $ff clip zscale line $zsline] } } } proc LockScaleCurrent {} { global current if {$current(frame) != {}} { LockScale $current(frame) } } proc LockScaleLimitsCurrent {} { global current if {$current(frame) != {}} { LockScaleLimits $current(frame) } } proc LockScale {which} { global scale if {$scale(lock)} { MatchScale $which } } proc LockScaleLimits {which} { global scale if {$scale(lock,limits)} { MatchScaleLimits $which } } proc ScaleBackup {ch which} { switch -- [$which get type] { base - 3d {ScaleBackupBase $ch $which} rgb {ScaleBackupRGB $ch $which} } } proc ScaleBackupBase {ch which} { puts $ch "$which colorscale [$which get colorscale]" puts $ch "$which colorscale log [$which get colorscale log]" puts $ch "$which datasec [$which get datasec]" #waj puts $ch "$which clip user [$which get clip]" puts $ch "$which clip mode [$which get clip mode]" puts $ch "$which clip scope [$which get clip scope]" puts $ch "$which clip minmax mode [$which get clip minmax mode]" puts $ch "$which clip zscale contrast [$which get clip zscale contrast]" puts $ch "$which clip zscale sample [$which get clip zscale sample]" puts $ch "$which clip zscale line [$which get clip zscale line]" } proc ScaleBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" ScaleBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } # Process Cmds proc ProcessScaleCmd {varname iname} { upvar $varname var upvar $iname i global scale switch -- [string tolower [lindex $var $i]] { match { incr i switch -- [string tolower [lindex $var $i]] { limits - scalelimits { MatchScaleLimitsCurrent } default { incr i -1 MatchScaleCurrent } } } lock { incr i switch -- [string tolower [lindex $var $i]] { limits - scalelimits { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set scale(lock,limits) [FromYesNo [lindex $var $i]] } else { set scale(lock,limits) 1 incr i -1 } LockScaleLimitsCurrent } default { if {!([string range [lindex $var $i] 0 0] == "-")} { set scale(lock) [FromYesNo [lindex $var $i]] } else { set scale(lock) 1 incr i -1 } LockScaleCurrent } } } open {ScaleDialog} close {ScaleDestroyDialog} linear - pow - sqrt - squared - asinh - sinh - histequ { set scale(type) [string tolower [lindex $var $i]] ChangeScale } log { incr i switch -- [string tolower [lindex $var $i]] { exp { incr i set scale(log) [string tolower [lindex $var $i]] ChangeScale } default { incr i -1 set scale(type) [string tolower [lindex $var $i]] ChangeScale } } } datasec { incr i set scale(datasec) [FromYesNo [lindex $var $i]] ChangeDATASEC } limits - scalelimits { incr i set scale(min) [lindex $var $i] incr i set scale(max) [lindex $var $i] ChangeScaleLimit } minmax - zscale - zmax - user { set scale(mode) [string tolower [lindex $var $i]] ChangeScaleMode } mode { incr i set scale(mode) [string tolower [lindex $var $i]] ChangeScaleMode } local - global { set scale(scope) [string tolower [lindex $var $i]] ChangeScaleScope } scope { incr i set scale(scope) [string tolower [lindex $var $i]] ChangeScaleScope } } } proc ProcessSendScaleCmd {proc id param} { global current global scale switch -- [string tolower $param] { lock {$proc $id [ToYesNo $scale(lock)]} {lock limits} {$proc $id [ToYesNo $scale(lock,limits)]} datasec {$proc $id "$scale(datasec)\n"} limits { if {$current(frame) != {}} { set lims [$current(frame) get clip] $proc $id "[lindex $lims 0] [lindex $lims 1]\n" } } mode {$proc $id "$scale(mode)\n"} scope {$proc $id "$scale(scope)\n"} log - {log exp} {$proc $id "$scale(log)\n"} default {$proc $id "$scale(type)\n"} } } proc ProcessMinMaxCmd {varname iname} { upvar $varname var upvar $iname i global minmax global scale switch -- [string tolower [lindex $var $i]] { sample - auto { # backward compatibility set minmax(mode) scan ChangeMinMax } scan - datamin - irafmin { set minmax(mode) [string tolower [lindex $var $i]] ChangeMinMax } mode { incr i set minmax(mode) [string tolower [lindex $var $i]] ChangeMinMax } interval { incr i # backward compatibility } default { # for backward compatibility set scale(mode) minmax ChangeScaleMode incr i -1 } } } proc ProcessSendMinMaxCmd {proc id param} { global minmax switch -- [string tolower $param] { mode {$proc $id "$minmax(mode)\n"} interval { # for backward compatibility $proc $id "1\n" } default { # for backward compatibility $proc $id "$minmax(mode)\n" } } } proc ProcessZScaleCmd {varname iname} { upvar $varname var upvar $iname i global zscale global scale switch -- [string tolower [lindex $var $i]] { contrast { incr i set zscale(contrast) [lindex $var $i] ChangeZScale } sample { incr i set zscale(sample) [lindex $var $i] ChangeZScale } line { incr i set zscale(line) [lindex $var $i] ChangeZScale } default { # for backward compatibility set scale(mode) zscale ChangeScaleMode incr i -1 } } } proc ProcessSendZScaleCmd {proc id param} { global zscale switch -- [string tolower $param] { contrast {$proc $id "$zscale(contrast)\n"} sample {$proc $id "$zscale(sample)\n"} line {$proc $id "$zscale(line)\n"} } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/segment.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000003160 12514261633 016700� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SegmentDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # procs set var(proc,apply) SegmentApply set var(proc,close) SegmentClose set var(proc,coordCB) SegmentCoordCB # base MarkerBaseCenterDialog $varname # init MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback rotate MarkerBaseCenterRotateCB $varname set f $var(top).param # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w } # actions proc SegmentClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc SegmentApply {varname} { upvar #0 $varname var global $varname MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } # callbacks proc SegmentCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "SegmentCoordCB" } MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/sfits.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000002220 12464211204 016353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadSFitsFile {hdr fn layer mode} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) smmap set loadParam(file,name) $fn set loadParam(file,header) $hdr set loadParam(load,layer) $layer ProcessLoad } proc ProcessSFitsCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} set mode {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i set mode slice } } StartLoad if {$sock != {}} { # xpa if {0} { # not supported } else { LoadSFitsFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $mode } } else { # comm if {0} { # not supported } else { LoadSFitsFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $mode } } FinishLoad } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/shm.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000014543 12464211204 016025� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ProcessShmCmd {varname iname ml} { upvar $varname var upvar $iname i global loadParam global current global ds9 StartLoad set done 0 while {!$done} { # defaults set loadParam(load,type) shared set loadParam(file,type) fits set loadParam(file,mode) {} # mask not supported set loadParam(load,layer) {} set nn [lindex $var [expr $i+4]] if {$nn == {} || [string range $nn 0 0] == "-"} { set def 1 } else { set def 0 } switch -- [lindex $var $i] { key - shmid { if {$ml} { MultiLoad } set loadParam(shared,idtype) [lindex $var $i] set loadParam(shared,id) [lindex $var [expr $i+1]] set loadParam(file,name) [lindex $var [expr $i+2]] incr i 2 } fits { if {$ml} { MultiLoad } set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } sfits { if {$ml} { MultiLoad } set loadParam(load,type) sshared set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,hdr) [lindex $var [expr $i+2]] set loadParam(shared,id) [lindex $var [expr $i+3]] set loadParam(file,name) [lindex $var [expr $i+4]] incr i 4 } mosaicimage { if {$ml} { MultiLoad } if {$def} { set loadParam(file,mode) {mosaic image iraf} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } else { set loadParam(file,mode) \ [list mosaic image [lindex $var [expr $i+1]]] set loadParam(shared,idtype) [lindex $var [expr $i+2]] set loadParam(shared,id) [lindex $var [expr $i+3]] set loadParam(file,name) [lindex $var [expr $i+4]] incr i 4 } } mosaic { if {$def} { set loadParam(file,mode) {mosaic iraf} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } else { set loadParam(file,mode) \ [list mosaic [lindex $var [expr $i+1]]] set loadParam(shared,idtype) [lindex $var [expr $i+2]] set loadParam(shared,id) [lindex $var [expr $i+3]] set loadParam(file,name) [lindex $var [expr $i+4]] incr i 4 } } smosaic { set loadParam(load,type) sshared set loadParam(file,mode) \ [list mosaic [lindex $var [expr $i+1]]] set loadParam(shared,idtype) [lindex $var [expr $i+2]] set loadParam(shared,hdr) [lindex $var [expr $i+3]] set loadParam(shared,id) [lindex $var [expr $i+4]] set loadParam(file,name) [lindex $var [expr $i+5]] incr i 5 } mosaicimageiraf { # backward compatibility if {$ml} { MultiLoad } set loadParam(file,mode) {mosaic image iraf} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } mosaiciraf { # backward compatibility set loadParam(file,mode) {mosaic iraf} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } mosaicimagewcs { # backward compatibility if {$ml} { MultiLoad } set loadParam(file,mode) {mosaic image wcs} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } mosaicwcs { # backward compatibility set loadParam(file,mode) {mosaic wcs} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } mosaicimagewfpc2 { # backward compatibility if {$ml} { MultiLoad } set loadParam(file,mode) {mosaic image wfpc2} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } rgbcube { if {$ml} { CreateRGBFrame } set loadParam(file,mode) {rgb cube} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } srgbcube { if {$ml} { CreateRGBFrame } set loadParam(load,type) sshared set loadParam(file,mode) {rgb cube} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,hdr) [lindex $var [expr $i+2]] set loadParam(shared,id) [lindex $var [expr $i+3]] set loadParam(file,name) [lindex $var [expr $i+4]] incr i 4 } rgbimage { if {$ml} { CreateRGBFrame } set loadParam(file,mode) {rgb image} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } rgbarray { if {$ml} { CreateRGBFrame } set loadParam(file,type) array set loadParam(file,mode) {rgb cube} set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } array { if {$ml} { MultiLoad } set loadParam(file,type) array set loadParam(shared,idtype) [lindex $var [expr $i+1]] set loadParam(shared,id) [lindex $var [expr $i+2]] set loadParam(file,name) [lindex $var [expr $i+3]] incr i 3 } default { if {$ml} { MultiLoad } set loadParam(shared,idtype) key set loadParam(shared,id) [lindex $var $i] set loadParam(file,name) [lindex $var [expr $i+1]] incr i 1 } } ProcessLoad # more to come? incr i if {([lindex $var $i] == "-shm") || ([lindex $var $i] == "shm")} { set done 0 incr i } else { set done 1 incr i -1 } } FinishLoad } proc ProcessSendShmCmd {proc id param} { global current if {$current(frame) != {}} { $proc $id "[$current(frame) get fits file name full]\n" } } �������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/skyview.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000053061 12544316735 016753� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SkyViewDef {} { global skyview global iskyview set iskyview(top) .skyview set iskyview(mb) .skyviewmb set skyview(sky) fk5 set skyview(rformat) arcsec set skyview(width) 300 set skyview(height) 300 set skyview(width,pixels) 300 set skyview(height,pixels) 300 set skyview(mode) new set skyview(save) 0 set skyview(valid) 0 set skyview(survey) dss } proc SkyViewDialog {} { global skyview global iskyview global wcs if {[winfo exists $iskyview(top)]} { raise $iskyview(top) return } global debug if {$debug(tcl,image)} { puts stderr "SkyViewDialog" } set varname dskyview upvar #0 $varname var global $varname set var(top) $iskyview(top) set var(mb) $iskyview(mb) set var(sky) $skyview(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $skyview(rformat) set var(width) $skyview(width) set var(height) $skyview(height) set var(width,pixels) $skyview(width,pixels) set var(height,pixels) $skyview(height,pixels) set var(mode) $skyview(mode) set var(save) $skyview(save) set var(valid) $skyview(valid) set var(survey) $skyview(survey) set w $var(top) IMGSVRInit $varname "HEASARC-SkyView [msgcat::mc {Server}]" \ SkyViewExec SkyViewAck # pixels size set f $w.param ttk::label $f.pimage -text [msgcat::mc {Image}] ttk::entry $f.pw -textvariable ${varname}(width,pixels) -width 14 ttk::entry $f.ph -textvariable ${varname}(height,pixels) -width 14 ttk::label $f.ptitle -text [msgcat::mc {Pixels}] grid $f.pimage x $f.pw x $f.ph $f.ptitle -padx 2 -pady 2 -sticky w menu $var(mb).survey $var(mb) add cascade -label Survey -menu $var(mb).survey $var(mb).survey add cascade -label {Gamma Ray} \ -menu $var(mb).survey.gamma $var(mb).survey add cascade -label {Hard X-ray} \ -menu $var(mb).survey.hard $var(mb).survey add cascade -label {Swift BAT} \ -menu $var(mb).survey.bat $var(mb).survey add cascade -label {Soft X-ray} \ -menu $var(mb).survey.soft $var(mb).survey add cascade -label {Diffuse X-ray} \ -menu $var(mb).survey.diffuse $var(mb).survey add cascade -label {UV} \ -menu $var(mb).survey.uv $var(mb).survey add cascade -label {Optical:DSS} \ -menu $var(mb).survey.dss $var(mb).survey add cascade -label {Optical:SDSS} \ -menu $var(mb).survey.sdss $var(mb).survey add cascade -label {Other Optical} \ -menu $var(mb).survey.other $var(mb).survey add cascade -label {Infrared High Res} \ -menu $var(mb).survey.ir $var(mb).survey add cascade -label {IRAS} \ -menu $var(mb).survey.iras $var(mb).survey add cascade -label {Planck} \ -menu $var(mb).survey.planck $var(mb).survey add cascade -label {WMAP/COBE} \ -menu $var(mb).survey.wmap $var(mb).survey add cascade -label {Radio} \ -menu $var(mb).survey.radio $var(mb).survey add cascade -label {GOODS/HDF/CDF} \ -menu $var(mb).survey.goods set f $var(mb).survey.gamma menu $f $f add radiobutton -label {Fermi 5} \ -variable ${varname}(survey) -value {Fermi 5} $f add radiobutton -label {Fermi 4} \ -variable ${varname}(survey) -value {Fermi 4} $f add radiobutton -label {Fermi 3} \ -variable ${varname}(survey) -value {Fermi 3} $f add radiobutton -label {Fermi 2} \ -variable ${varname}(survey) -value {Fermi 2} $f add radiobutton -label {Fermi 1} \ -variable ${varname}(survey) -value {Fermi 1} $f add separator $f add radiobutton -label {EGRET (3D)} \ -variable ${varname}(survey) -value {EGRET (3D)} $f add radiobutton -label {EGRET <100 Mev} \ -variable ${varname}(survey) -value {EGRET <100 Mev} $f add radiobutton -label {EGRET >100 Mev} \ -variable ${varname}(survey) -value {EGRET >100 Mev} $f add separator $f add radiobutton -label {COMPTEL} \ -variable ${varname}(survey) -value {COMPTEL} set f $var(mb).survey.hard menu $f $f add radiobutton -label {INT GAL 17-35 Flux} \ -variable ${varname}(survey) -value {INT GAL 17-35 Flux} $f add radiobutton -label {INT GAL 17-60 Flux} \ -variable ${varname}(survey) -value {INT GAL 17-60 Flux} $f add radiobutton -label {INT GAL 35-80 Flux} \ -variable ${varname}(survey) -value {INT GAL 35-80 Flux} $f add separator $f add radiobutton -label {INTEGRAL/SPI GC} \ -variable ${varname}(survey) -value {INTEGRAL/SPI GC} $f add radiobutton -label {GRANAT/SIGMA} \ -variable ${varname}(survey) -value {GRANAT/SIGMA} $f add separator $f add radiobutton -label {RXTE Allsky 3-8keV Flux} \ -variable ${varname}(survey) -value {RXTE Allsky 3-8keV Flux} $f add radiobutton -label {RXTE Allsky 3-20keV Flux} \ -variable ${varname}(survey) -value {RXTE Allsky 3-20keV Flux} $f add radiobutton -label {RXTE Allsky 8-20keV Flux} \ -variable ${varname}(survey) -value {RXTE Allsky 8-20keV Flux} set f $var(mb).survey.bat menu $f $f add radiobutton -label {BAT SNR 14-195} \ -variable ${varname}(survey) -value {BAT SNR 14-195} $f add radiobutton -label {BAT SNR 14-20} \ -variable ${varname}(survey) -value {BAT SNR 14-20} $f add radiobutton -label {BAT SNR 20-24} \ -variable ${varname}(survey) -value {BAT SNR 20-24} $f add radiobutton -label {BAT SNR 24-35} \ -variable ${varname}(survey) -value {BAT SNR 24-35} $f add radiobutton -label {BAT SNR 35-50} \ -variable ${varname}(survey) -value {BAT SNR 35-50} $f add radiobutton -label {BAT SNR 50-75} \ -variable ${varname}(survey) -value {BAT SNR 50-75} $f add radiobutton -label {BAT SNR 75-100} \ -variable ${varname}(survey) -value {BAT SNR 75-100} $f add radiobutton -label {BAT SNR 100-150} \ -variable ${varname}(survey) -value {BAT SNR 100-150} $f add radiobutton -label {BAT SNR 150-195} \ -variable ${varname}(survey) -value {BAT SNR 150-195} set f $var(mb).survey.soft menu $f $f add radiobutton -label {RASS-Cnt Soft} \ -variable ${varname}(survey) -value {RASS-Cnt Soft} $f add radiobutton -label {RASS-Cnt Hard} \ -variable ${varname}(survey) -value {RASS-Cnt Hard} $f add radiobutton -label {RASS-Cnt Broad} \ -variable ${varname}(survey) -value {RASS-Cnt Broad} $f add separator $f add radiobutton -label {PSPC 2.0 Deg-Int} \ -variable ${varname}(survey) -value {PSPC 2.0 Deg-Int} $f add radiobutton -label {PSPC 1.0 Deg-Int} \ -variable ${varname}(survey) -value {PSPC 1.0 Deg-Int} $f add radiobutton -label {PSPC 0.6 Deg-Int} \ -variable ${varname}(survey) -value {PSPC 0.6 Deg-Int} $f add separator $f add radiobutton -label {HRI} \ -variable ${varname}(survey) -value {HRI} $f add radiobutton -label {HEAO 1 A-2} \ -variable ${varname}(survey) -value {HEAO 1 A-2} set f $var(mb).survey.diffuse menu $f $f add radiobutton -label {RASS Background 1} \ -variable ${varname}(survey) -value {RASS Background 1} $f add radiobutton -label {RASS Background 2} \ -variable ${varname}(survey) -value {RASS Background 2} $f add radiobutton -label {RASS Background 3} \ -variable ${varname}(survey) -value {RASS Background 3} $f add radiobutton -label {RASS Background 4} \ -variable ${varname}(survey) -value {RASS Background 4} $f add radiobutton -label {RASS Background 5} \ -variable ${varname}(survey) -value {RASS Background 5} $f add radiobutton -label {RASS Background 6} \ -variable ${varname}(survey) -value {RASS Background 6} $f add radiobutton -label {RASS Background 7} \ -variable ${varname}(survey) -value {RASS Background 7} set f $var(mb).survey.uv menu $f $f add radiobutton -label {GALEX Near UV} \ -variable ${varname}(survey) -value {GALEX Near UV} $f add radiobutton -label {GALEX Far UV} \ -variable ${varname}(survey) -value {GALEX Far UV} $f add separator $f add radiobutton -label {ROSAT WFC F1} \ -variable ${varname}(survey) -value {ROSAT WFC F1} $f add radiobutton -label {ROSAT WFC F2} \ -variable ${varname}(survey) -value {ROSAT WFC F2} $f add separator $f add radiobutton -label {EUVE 171 A} \ -variable ${varname}(survey) -value {EUVE 171 A} $f add radiobutton -label {EUVE 405 A} \ -variable ${varname}(survey) -value {EUVE 405 A} $f add radiobutton -label {EUVE 555 A} \ -variable ${varname}(survey) -value {EUVE 555 A} set f $var(mb).survey.dss menu $f $f add radiobutton -label {DSS} \ -variable ${varname}(survey) -value {DSS} $f add separator $f add radiobutton -label {DSS1 Blue} \ -variable ${varname}(survey) -value {DSS1 Blue} $f add radiobutton -label {DSS1 Red} \ -variable ${varname}(survey) -value {DSS1 Red} $f add separator $f add radiobutton -label {DSS2 Red} \ -variable ${varname}(survey) -value {DSS2 Red} $f add radiobutton -label {DSS2 Blue} \ -variable ${varname}(survey) -value {DSS2 Blue} $f add separator $f add radiobutton -label {DSS2 IR} \ -variable ${varname}(survey) -value {DSS2 IR} set f $var(mb).survey.sdss menu $f $f add radiobutton -label {SDSSg} \ -variable ${varname}(survey) -value {SDSSg} $f add radiobutton -label {SDSSi} \ -variable ${varname}(survey) -value {SDSSi} $f add radiobutton -label {SDSSr} \ -variable ${varname}(survey) -value {SDSSr} $f add radiobutton -label {SDSSu} \ -variable ${varname}(survey) -value {SDSSu} $f add radiobutton -label {SDSSz} \ -variable ${varname}(survey) -value {SDSSz} $f add separator $f add radiobutton -label {SDSSdr7g} \ -variable ${varname}(survey) -value {SDSSdr7g} $f add radiobutton -label {SDSSdr7i} \ -variable ${varname}(survey) -value {SDSSdr7i} $f add radiobutton -label {SDSSdr7r} \ -variable ${varname}(survey) -value {SDSSdr7r} $f add radiobutton -label {SDSSdr7u} \ -variable ${varname}(survey) -value {SDSSdr7u} $f add radiobutton -label {SDSSdr7z} \ -variable ${varname}(survey) -value {SDSSdr7z} set f $var(mb).survey.other menu $f $f add radiobutton -label {Mellinger Red} \ -variable ${varname}(survey) -value {Mellinger Red} $f add radiobutton -label {Mellinger Green} \ -variable ${varname}(survey) -value {Mellinger Green} $f add radiobutton -label {Mellinger Blue} \ -variable ${varname}(survey) -value {Mellinger Blue} $f add separator $f add radiobutton -label {NEAT} \ -variable ${varname}(survey) -value {NEAT} $f add radiobutton -label {H-Alpha Comp} \ -variable ${varname}(survey) -value {H-Alpha Comp} $f add separator $f add radiobutton -label {SHASSA H} \ -variable ${varname}(survey) -value {SHASSA H} $f add radiobutton -label {SHASSA CC} \ -variable ${varname}(survey) -value {SHASSA CC} $f add radiobutton -label {SHASSA C} \ -variable ${varname}(survey) -value {SHASSA C} $f add radiobutton -label {SHASSA Sm} \ -variable ${varname}(survey) -value {SHASSA Sm} set f $var(mb).survey.ir menu $f $f add radiobutton -label {2MASS-J} \ -variable ${varname}(survey) -value {2MASS-J} $f add radiobutton -label {2MASS-H} \ -variable ${varname}(survey) -value {2MASS-H} $f add radiobutton -label {2MASS-K} \ -variable ${varname}(survey) -value {2MASS-K} $f add separator $f add radiobutton -label {UKIDSS-Y} \ -variable ${varname}(survey) -value {UKIDSS-Y} $f add radiobutton -label {UKIDSS-J} \ -variable ${varname}(survey) -value {UKIDSS-J} $f add radiobutton -label {UKIDSS-H} \ -variable ${varname}(survey) -value {UKIDSS-H} $f add radiobutton -label {UKIDSS-K} \ -variable ${varname}(survey) -value {UKIDSS-K} $f add separator $f add radiobutton -label {WISE 3.4} \ -variable ${varname}(survey) -value {WISE 3.4} $f add radiobutton -label {WISE 4.6} \ -variable ${varname}(survey) -value {WISE 4.6} $f add radiobutton -label {WISE 12} \ -variable ${varname}(survey) -value {WISE 12} $f add radiobutton -label {WISE 22} \ -variable ${varname}(survey) -value {WISE 22} set f $var(mb).survey.iras menu $f $f add radiobutton -label {IRIS 12} \ -variable ${varname}(survey) -value {IRIS 12} $f add radiobutton -label {IRIS 25} \ -variable ${varname}(survey) -value {IRIS 25} $f add radiobutton -label {IRIS 60} \ -variable ${varname}(survey) -value {IRIS 160} $f add radiobutton -label {IRIS 100} \ -variable ${varname}(survey) -value {IRIS 100} $f add separator $f add radiobutton -label {SFD100m} \ -variable ${varname}(survey) -value {SFD100m} $f add radiobutton -label {SFD Dust Map} \ -variable ${varname}(survey) -value {SFD Dust Map} $f add separator $f add radiobutton -label {IRAS 12 micron} \ -variable ${varname}(survey) -value {IRAS 12 micron} $f add radiobutton -label {IRAS 25 micron} \ -variable ${varname}(survey) -value {IRAS 25 micron} $f add radiobutton -label {IRAS 60 micron} \ -variable ${varname}(survey) -value {IRAS 60 micron} $f add radiobutton -label {IRAS 100 micron} \ -variable ${varname}(survey) -value {IRAS 100 micron} set f $var(mb).survey.planck menu $f $f add radiobutton -label {Planck 857} \ -variable ${varname}(survey) -value {Planck 857} $f add radiobutton -label {Planck 545} \ -variable ${varname}(survey) -value {Planck 545} $f add radiobutton -label {Planck 353} \ -variable ${varname}(survey) -value {Planck 353} $f add radiobutton -label {Planck 217} \ -variable ${varname}(survey) -value {Planck 217} $f add radiobutton -label {Planck 143} \ -variable ${varname}(survey) -value {Planck 143} $f add radiobutton -label {Planck 100} \ -variable ${varname}(survey) -value {Planck 100} $f add radiobutton -label {Planck 070} \ -variable ${varname}(survey) -value {Planck 070} $f add radiobutton -label {Planck 044} \ -variable ${varname}(survey) -value {Planck 044} $f add radiobutton -label {Planck 030} \ -variable ${varname}(survey) -value {Planck 030} set f $var(mb).survey.wmap menu $f $f add radiobutton -label {WMAP Ka} \ -variable ${varname}(survey) -value {WMAP Ka} $f add radiobutton -label {WMAP K} \ -variable ${varname}(survey) -value {WMAP K} $f add radiobutton -label {WMAP Q} \ -variable ${varname}(survey) -value {WMAP Q} $f add radiobutton -label {WMAP V} \ -variable ${varname}(survey) -value {WMAP V} $f add radiobutton -label {WMAP W} \ -variable ${varname}(survey) -value {WMAP W} $f add separator $f add radiobutton -label {COBE DIRBE/AAM} \ -variable ${varname}(survey) -value cobeaam $f add radiobutton -label {COBE DIRBE/ZSMA} \ -variable ${varname}(survey) -value cobezsma set f $var(mb).survey.radio menu $f $f add radiobutton -label {GB6 (4850MHZ)} \ -variable ${varname}(survey) -value {GB6 (4850MHZ)} $f add radiobutton -label {VLA FIRST (1.4 GHz)} \ -variable ${varname}(survey) -value {VLA FIRST (1.4 GHz)} $f add radiobutton -label {NVSS} \ -variable ${varname}(survey) -value {NVSS} $f add radiobutton -label {Stripe82VLA} \ -variable ${varname}(survey) -value {Stripe82VLA} $f add radiobutton -label {1420MHz (Bonn)} \ -variable ${varname}(survey) -value {1420MHz (Bonn)} $f add radiobutton -label {nH} \ -variable ${varname}(survey) -value {nH} $f add radiobutton -label {SUMSS 843 MHz} \ -variable ${varname}(survey) -value {SUMSS 843 MHz} $f add radiobutton -label {0408MHz} \ -variable ${varname}(survey) -value {0408MHz} $f add radiobutton -label {WENSS} \ -variable ${varname}(survey) -value {WENSS} $f add radiobutton -label {CO} \ -variable ${varname}(survey) -value {CO} $f add radiobutton -label {VLSSr} \ -variable ${varname}(survey) -value {VLSSr} $f add radiobutton -label {0035MHz} \ -variable ${varname}(survey) -value {0035MHz} set f $var(mb).survey.goods menu $f $f add radiobutton -label {GOODS: Chandra ACIS HB} \ -variable ${varname}(survey) -value {GOODS: Chandra ACIS HB} $f add radiobutton -label {GOODS: Chandra ACIS FB} \ -variable ${varname}(survey) -value {GOODS: Chandra ACIS FB} $f add radiobutton -label {GOODS: Chandra ACIS SB} \ -variable ${varname}(survey) -value {GOODS: Chandra ACIS SB} $f add separator $f add radiobutton -label {GOODS: VLT VIMOS U} \ -variable ${varname}(survey) -value {GOODS: VLT VIMOS U} $f add radiobutton -label {GOODS: VLT VIMOS R} \ -variable ${varname}(survey) -value {GOODS: VLT VIMOS R} $f add separator $f add radiobutton -label {GOODS: HST ACS B} \ -variable ${varname}(survey) -value {GOODS: HST ACS B} $f add radiobutton -label {GOODS: HST ACS V} \ -variable ${varname}(survey) -value {GOODS: HST ACS V} $f add radiobutton -label {GOODS: HST ACS I} \ -variable ${varname}(survey) -value {GOODS: HST ACS I} $f add radiobutton -label {GOODS: HST ACS Z} \ -variable ${varname}(survey) -value {GOODS: HST ACS Z} $f add separator $f add radiobutton -label {Hawaii HDF U} \ -variable ${varname}(survey) -value {Hawaii HDF U} $f add radiobutton -label {Hawaii HDF B} \ -variable ${varname}(survey) -value {Hawaii HDF B} $f add radiobutton -label {Hawaii HDF V0201} \ -variable ${varname}(survey) -value {Hawaii HDF V0201} $f add radiobutton -label {Hawaii HDF V0401} \ -variable ${varname}(survey) -value {Hawaii HDF V0401} $f add radiobutton -label {Hawaii HDF R} \ -variable ${varname}(survey) -value {Hawaii HDF R} $f add radiobutton -label {Hawaii HDF I} \ -variable ${varname}(survey) -value {Hawaii HDF I} $f add radiobutton -label {Hawaii HDF Z} \ -variable ${varname}(survey) -value {Hawaii HDF Z} $f add radiobutton -label {Hawaii HDF HK} \ -variable ${varname}(survey) -value {Hawaii HDF HK} $f add separator $f add radiobutton -label {GOODS: HST NICMOS} \ -variable ${varname}(survey) -value {GOODS: HST NICMOS} $f add radiobutton -label {GOODS: VLT ISAAC J} \ -variable ${varname}(survey) -value {GOODS: VLT ISAAC J} $f add radiobutton -label {GOODS: VLT ISAAC H} \ -variable ${varname}(survey) -value {GOODS: VLT ISAAC H} $f add radiobutton -label {GOODS: VLT ISAAC Ks} \ -variable ${varname}(survey) -value {GOODS: VLT ISAAC Ks} $f add radiobutton -label {HUDF: VLT ISAAC Ks} \ -variable ${varname}(survey) -value {HUDF: VLT ISAAC Ks} $f add separator $f add radiobutton -label {GOODS: Spitzer IRAC 3.6} \ -variable ${varname}(survey) -value {GOODS: Spitzer IRAC 3.6} $f add radiobutton -label {GOODS: Spitzer IRAC 4.5} \ -variable ${varname}(survey) -value {GOODS: Spitzer IRAC 4.5} $f add radiobutton -label {GOODS: Spitzer IRAC 5.8} \ -variable ${varname}(survey) -value {GOODS: Spitzer IRAC 5.8} $f add radiobutton -label {GOODS: Spitzer IRAC 8.0} \ -variable ${varname}(survey) -value {GOODS: Spitzer IRAC 8.0} $f add radiobutton -label {GOODS: Spitzer MIPS 24} \ -variable ${varname}(survey) -value {GOODS: Spitzer MIPS 24} $f add separator $f add radiobutton -label {GOODS: Herschel 100} \ -variable ${varname}(survey) -value {GOODS: Herschel 100} $f add radiobutton -label {GOODS: Herschel 100} \ -variable ${varname}(survey) -value {GOODS: Herschel 100} $f add radiobutton -label {GOODS: Herschel 250} \ -variable ${varname}(survey) -value {GOODS: Herschel 250} $f add radiobutton -label {GOODS: Herschel 350} \ -variable ${varname}(survey) -value {GOODS: Herschel 350} $f add radiobutton -label {GOODS: Herschel 500} \ -variable ${varname}(survey) -value {GOODS: Herschel 500} $f add separator $f add radiobutton -label {CDFS: LESS} \ -variable ${varname}(survey) -value {CDFS: LESS} $f add radiobutton -label {GOODS: VLA North} \ -variable ${varname}(survey) -value {GOODS: VLA North} IMGSVRUpdate $varname 1 } proc SkyViewExec {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "SkyViewExec $varname" } if {$var(save)} { set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set var(fn) [tmpnam ds9skyview ".fits"] } # skyformat switch -- $var(skyformat) { degrees { set xx $var(x) set yy $var(y) } sexagesimal { set xx [h2d [Sex2H $var(x)]] set yy [Sex2D $var(y)] } } # size - convert to arcsec switch -- $var(rformat) { degrees { set ww $var(width) set hh $var(height) } arcmin { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } arcsec { set ww [expr $var(width)/60./60.] set hh [expr $var(height)/60./60.] } } if {$ww>5} { set ww 5 } if {$hh>5} { set hh 5 } # now average set rr [expr ($ww+$hh)/2.] # query set var(query) [http::formatQuery Position $xx,$yy Survey $var(survey) Size $ww,$hh Pixels $var(width,pixels),$var(height,pixels) Return FITS] set var(url) "http://skyview.gsfc.nasa.gov/cgi-bin/images" IMGSVRLoad $varname } proc SkyViewAck {varname} { upvar #0 $varname var global $varname global debug if {$debug(tcl,image)} { puts stderr "SkyViewAck $varname" } set msg {Acknowledgments for the Skyview SkyView has been developed with generous support from the NASA AISR and ADP programs (P.I. Thomas A. McGlynn) under the auspices of the High Energy Astrophysics Science Archive Research Center (HEASARC) at the NASA/ GSFC Astrophysics Science Division. We gratefully acknowledge the support of NASA and contributors of SkyView surveys. Maintained by: Laura McDonald lmm@skyview.gsfc.nasa.gov } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessSkyViewCmd {varname iname} { upvar $varname var upvar $iname i SkyViewDialog IMGSVRProcessCmd $varname $iname dskyview } proc ProcessSendSkyViewCmd {proc id param} { SkyViewDialog IMGSVRProcessSendCmd $proc $id $param dskyview } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/slider.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000003412 12464211204 016511� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc slider {w from to label varname cmd {num {5}} {width {7}}} { ttk::frame $w ttk::scale $w.slider \ -length 300 \ -orient horizontal \ -variable $varname \ -takefocus 0 \ -command [list SliderCmd $w $varname $cmd] ttk::label $w.label -text $label ttk::entry $w.entry -textvariable $varname -width $width grid $w.label -sticky w -columnspan $num grid $w.slider -row 1 -columnspan $num -padx 2 -pady 2 -sticky news grid $w.entry -row 1 -column $num -padx 2 -pady 2 for {set ii 0} {$ii<$num} {incr ii} { ttk::label $w.t$ii -width $width -anchor center grid $w.t$ii -row 2 -column $ii grid columnconfigure $w $ii -weight 1 } grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 grid rowconfigure $w 2 -weight 1 bind $w.entry <Return> $cmd SliderMinMax $w $from $to $num return $w } proc SliderMinMax {w from to num} { $w.slider configure -from $from -to $to if {$from == $to} { for {set ii 0} {$ii<$num} {incr ii} { $w.t$ii configure -text {} } } else { for {set ii 0} {$ii<$num} {incr ii} { set vv [expr ($to*1.-$from)/($num-1)*$ii + $from] if {[string is integer $from] && [string is integer $to]} { set vv [expr int($vv)] } else { set vv [format {%.5g} $vv] } $w.t$ii configure -text $vv } } } proc SliderCmd {w varname cmd vv} { upvar $varname var set from [$w.slider cget -from] set to [$w.slider cget -to] if {[string is integer $from] && [string is integer $to]} { set var [expr int($vv)] } if {$cmd != {}} { eval $cmd } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/smooth.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000015652 12616501401 016551� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc SmoothDef {} { global smooth global ismooth global psmooth set ismooth(top) .sm set ismooth(mb) .smmb set smooth(lock) 0 set smooth(view) 0 set smooth(function) gaussian set smooth(radius) 3 array set psmooth [array get smooth] } proc SmoothUpdate {} { global smooth global current global rgb SetWatchCursor if {$current(frame) != {}} { if {$smooth(view)} { RGBEvalLockCurrent rgb(lock,smooth) [list $current(frame) smooth $smooth(function) $smooth(radius)] } else { RGBEvalLockCurrent rgb(lock,smooth) [list $current(frame) smooth delete] } } LockSmoothCurrent UpdateCubeDialog UpdateContourScale UpdateContourDialog UpdateScaleDialog UpdateGraphXAxis $current(frame) UpdateMain UnsetWatchCursor } proc SmoothDialog {} { global ds9 global smooth global ismooth # see if we already have a window visible if {[winfo exists $ismooth(top)]} { raise $ismooth(top) return } # create the window set w $ismooth(top) set mb $ismooth(mb) Toplevel $w $mb 6 [msgcat::mc {Smooth Parameters}] SmoothDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command SmoothApplyDialog $mb.file add command -label [msgcat::mc {Clear}] -command SmoothOffDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command SmoothDestroyDialog EditMenu $mb ismooth # Function set f [ttk::labelframe $w.func -text [msgcat::mc {Function}] -padding 2] ttk::radiobutton $f.boxcar -text [msgcat::mc {Boxcar}] \ -variable smooth(function) -value boxcar ttk::radiobutton $f.tophat -text [msgcat::mc {Tophat}] \ -variable smooth(function) -value tophat ttk::radiobutton $f.gaussian -text [msgcat::mc {Gaussian}] \ -variable smooth(function) -value gaussian grid $f.boxcar $f.tophat $f.gaussian -padx 2 -pady 2 # Kernal set f [ttk::labelframe $w.rad -text [msgcat::mc {Kernel}] -padding 2] slider $f.slider 1 20 {Radius} smooth(radius) {} grid $f.slider -padx 2 -pady 2 -sticky ew grid columnconfigure $f 0 -weight 1 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command SmoothApplyDialog ttk::button $f.clear -text [msgcat::mc {Clear}] -command SmoothOffDialog ttk::button $f.close -text [msgcat::mc {Close}] -command SmoothDestroyDialog pack $f.apply $f.clear $f.close -side left -expand true -padx 2 -pady 4 # Fini grid $w.func -sticky news grid $w.rad -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 } proc SmoothApplyDialog {} { global smooth set smooth(view) 1 SmoothUpdate } proc SmoothDestroyDialog {} { global ismooth if {[winfo exists $ismooth(top)]} { destroy $ismooth(top) destroy $ismooth(mb) } } proc SmoothOffDialog {} { global smooth set smooth(view) 0 SmoothUpdate } proc UpdateSmoothMenu {} { global smooth global current global debug if {$debug(tcl,update)} { puts stderr "UpdateSmoothMenu" } if {$current(frame) != {}} { set smooth(view) [$current(frame) has smooth] set smooth(function) [$current(frame) get smooth function] set smooth(radius) [$current(frame) get smooth radius] } } proc MatchSmoothCurrent {} { global current if {$current(frame) != {}} { MatchSmooth $current(frame) } } proc MatchSmooth {which} { global ds9 global rgb set view [$which has smooth] set function [$which get smooth function] set radius [$which get smooth radius] foreach ff $ds9(frames) { if {$ff != $which} { if {$view} { RGBEvalLock rgb(lock,smooth) $ff [list $ff smooth $function $radius] } else { RGBEvalLock rgb(lock,smooth) $ff [list $ff smooth delete] } } } } proc LockSmoothCurrent {} { global current if {$current(frame) != {}} { LockSmooth $current(frame) } } proc LockSmooth {which} { global smooth if {$smooth(lock)} { MatchSmooth $which } } proc SmoothBackup {ch which} { switch [$which get type] { base - 3d {SmoothBackupBase $ch $which} rgb {SmoothBackupRGB $ch $which} } } proc SmoothBackupBase {ch which} { if {[$which has smooth]} { set function [$which get smooth function] set radius [$which get smooth radius] puts $ch "$which smooth $function $radius" } } proc SmoothBackupRGB {ch which} { set sav [$which get rgb channel] foreach cc {red green blue} { $which rgb channel $cc puts $ch "$which rgb channel $cc" SmoothBackupBase $ch $which } $which rgb channel $sav puts $ch "$which rgb channel $sav" } proc PrefsDialogSmooth {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {Smooth}] lappend dprefs(tabs) [ttk::frame $w.smooth] set f [ttk::labelframe $w.smooth.param -text [msgcat::mc {Smooth}]] ttk::label $f.title -text [msgcat::mc {Function}] ttk::menubutton $f.function -textvariable psmooth(function) \ -menu $f.function.menu menu $f.function.menu $f.function.menu add radiobutton -label [msgcat::mc {Boxcar}] \ -variable psmooth(function) -value boxcar $f.function.menu add radiobutton -label [msgcat::mc {Tophat}] \ -variable psmooth(function) -value tophat $f.function.menu add radiobutton -label [msgcat::mc {Gaussian}] \ -variable psmooth(function) -value gaussian grid $f.title $f.function -padx 2 -pady 2 -sticky w pack $f -side top -fill both -expand true } proc ProcessSmoothCmd {varname iname} { upvar $varname var upvar $iname i global smooth switch -- [string tolower [lindex $var $i]] { open {SmoothDialog} close {SmoothDestroyDialog} match {MatchSmoothCurrent} lock { incr i if {!([string range [lindex $var $i] 0 0] == "-")} { set smooth(lock) [FromYesNo [lindex $var $i]] } else { set smooth(lock) 1 incr i -1 } LockSmoothCurrent } radius { incr i set smooth(radius) [lindex $var $i] SmoothUpdate } function { incr i set smooth(function) [lindex $var $i] SmoothUpdate } yes - true - on - 1 - no - false - off - 0 { set smooth(view) [FromYesNo [lindex $var $i]] SmoothUpdate } default { set smooth(view) 1 SmoothUpdate incr i -1 } } } proc ProcessSendSmoothCmd {proc id param} { global smooth switch -- [lindex $param 0] { lock {$proc $id [ToYesNo $smooth(lock)]} function {$proc $id "$smooth(function)\n"} radius {$proc $id "$smooth(radius)\n"} default {$proc $id [ToYesNo $smooth(view)]} } } ��������������������������������������������������������������������������������������saods9/ds9/library/smosaic.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000001110 12464211204 016656� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc ProcessSMosaicCmd {varname iname sock fn} { upvar $varname var upvar $iname i set vvar $var set ii $i switch -- [string tolower [lindex $var $i]] { iraf { incr ii ProcessSMosaicIRAFCmd vvar ii $sock $fn } {} { set vvar [linsert $var $i wcs] ProcessSMosaicWCSCmd vvar ii $sock $fn } default {ProcessSMosaicWCSCmd vvar ii $sock $fn} } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/smosaiciraf.tcl������������������������������������������������������������������000644 �000765 �000000 �00000002374 12464211204 017535� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadSMosaicIRAFFile {hdr fn layer} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) {mosaic iraf} set loadParam(load,type) smmap set loadParam(file,name) $fn set loadParam(file,header) $hdr set loadParam(load,layer) $layer ProcessLoad } proc ProcessSMosaicIRAFCmd {varname iname sock fn layer} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } set opt [lindex $var $i] if {$opt != {}} { incr i } else { set opt wcs } StartLoad if {$sock != {}} { # xpa if {0} { # not supported } else { LoadSMosaicIRAFFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $opt } } else { # comm if {0} { # not supported } else { LoadSMosaicIRAFFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $opt } } FinishLoad } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/smosaicwcs.tcl�������������������������������������������������������������������000644 �000765 �000000 �00000002377 12464211204 017413� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadSMosaicWCSFitsFile {hdr fn layer sys} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) [list mosaic $sys] set loadParam(load,type) smmap set loadParam(file,name) $fn set loadParam(file,header) $hdr set loadParam(load,layer) $layer ProcessLoad } proc ProcessSMosaicWCSCmd {varname iname sock fn} { upvar $varname var upvar $iname i global loadParam global current set layer {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i # not supported } } set opt [lindex $var $i] if {$opt != {}} { incr i } else { set opt wcs } StartLoad if {$sock != {}} { # xpa if {0} { # not supported } else { LoadSMosaicWCSFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $opt } } else { # comm if {0} { # not supported } else { LoadSMosaicWCSFile [lindex $var $i] [lindex $var [expr $i+1]] \ $layer $opt } } FinishLoad } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/source.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000015726 12556717727 016571� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 source $ds9(root)/library/2mass.tcl source $ds9(root)/library/3d.tcl source $ds9(root)/library/array.tcl source $ds9(root)/library/analysis.tcl source $ds9(root)/library/analysisparam.tcl source $ds9(root)/library/annulus.tcl source $ds9(root)/library/ar.tcl source $ds9(root)/library/backup.tcl source $ds9(root)/library/bin.tcl source $ds9(root)/library/block.tcl source $ds9(root)/library/box.tcl source $ds9(root)/library/boxannulus.tcl source $ds9(root)/library/bpanda.tcl source $ds9(root)/library/buttons.tcl source $ds9(root)/library/cat.tcl source $ds9(root)/library/catcds.tcl source $ds9(root)/library/catcdssrch.tcl source $ds9(root)/library/catcdssrchdialog.tcl source $ds9(root)/library/catcmd.tcl source $ds9(root)/library/catcxc.tcl source $ds9(root)/library/catdialog.tcl source $ds9(root)/library/catflt.tcl source $ds9(root)/library/catmatch.tcl source $ds9(root)/library/catned.tcl source $ds9(root)/library/catopt.tcl source $ds9(root)/library/catplot.tcl source $ds9(root)/library/catreg.tcl source $ds9(root)/library/catsdss.tcl source $ds9(root)/library/catsimbad.tcl source $ds9(root)/library/catskybot.tcl source $ds9(root)/library/catsym.tcl source $ds9(root)/library/cattsv.tcl source $ds9(root)/library/catvot.tcl source $ds9(root)/library/centroid.tcl source $ds9(root)/library/circle.tcl source $ds9(root)/library/colorbar.tcl source $ds9(root)/library/comm.tcl source $ds9(root)/library/command.tcl source $ds9(root)/library/compass.tcl source $ds9(root)/library/composite.tcl source $ds9(root)/library/contour.tcl source $ds9(root)/library/convert.tcl source $ds9(root)/library/coord.tcl source $ds9(root)/library/cpanda.tcl source $ds9(root)/library/crop.tcl source $ds9(root)/library/crosshair.tcl source $ds9(root)/library/cube.tcl source $ds9(root)/library/debug.tcl source $ds9(root)/library/dialog.tcl source $ds9(root)/library/ellipse.tcl source $ds9(root)/library/ellipseannulus.tcl source $ds9(root)/library/envi.tcl source $ds9(root)/library/epanda.tcl source $ds9(root)/library/error.tcl source $ds9(root)/library/eso.tcl source $ds9(root)/library/examine.tcl source $ds9(root)/library/export.tcl source $ds9(root)/library/external.tcl source $ds9(root)/library/file.tcl source $ds9(root)/library/fits.tcl source $ds9(root)/library/frame.tcl source $ds9(root)/library/graph.tcl source $ds9(root)/library/grid.tcl source $ds9(root)/library/group.tcl source $ds9(root)/library/header.tcl source $ds9(root)/library/help.tcl source $ds9(root)/library/http.tcl source $ds9(root)/library/hv.tcl source $ds9(root)/library/hvform.tcl source $ds9(root)/library/hvsup.tcl source $ds9(root)/library/iexam.tcl source $ds9(root)/library/iis.tcl source $ds9(root)/library/ime.tcl source $ds9(root)/library/imgsvr.tcl source $ds9(root)/library/import.tcl source $ds9(root)/library/info.tcl source $ds9(root)/library/layout.tcl source $ds9(root)/library/line.tcl source $ds9(root)/library/load.tcl source $ds9(root)/library/magnifier.tcl source $ds9(root)/library/marker.tcl source $ds9(root)/library/markeranalysishist.tcl source $ds9(root)/library/markeranalysispanda.tcl source $ds9(root)/library/markeranalysisplot2d.tcl source $ds9(root)/library/markeranalysisplot3d.tcl source $ds9(root)/library/markeranalysisradial.tcl source $ds9(root)/library/markeranalysisstats.tcl source $ds9(root)/library/markerbase.tcl source $ds9(root)/library/markerbaseannulus.tcl source $ds9(root)/library/markerbaseannulusrect.tcl source $ds9(root)/library/markerbasecenter.tcl source $ds9(root)/library/markerbaseline.tcl source $ds9(root)/library/markerbasepanda.tcl source $ds9(root)/library/markerbasepandarect.tcl source $ds9(root)/library/markerdialog.tcl source $ds9(root)/library/mask.tcl source $ds9(root)/library/manalysis.tcl source $ds9(root)/library/mbin.tcl source $ds9(root)/library/mcolor.tcl source $ds9(root)/library/mecube.tcl source $ds9(root)/library/medit.tcl source $ds9(root)/library/menu.tcl source $ds9(root)/library/mfile.tcl source $ds9(root)/library/mframe.tcl source $ds9(root)/library/mhelp.tcl source $ds9(root)/library/mosaicimage.tcl source $ds9(root)/library/mosaicimageiraf.tcl source $ds9(root)/library/mosaicimagewcs.tcl source $ds9(root)/library/mosaicimagewfpc2.tcl source $ds9(root)/library/mosaic.tcl source $ds9(root)/library/mosaiciraf.tcl source $ds9(root)/library/mosaicwcs.tcl source $ds9(root)/library/movie.tcl source $ds9(root)/library/mregion.tcl source $ds9(root)/library/mscale.tcl source $ds9(root)/library/multiframe.tcl source $ds9(root)/library/mview.tcl source $ds9(root)/library/mwcs.tcl source $ds9(root)/library/mzoom.tcl source $ds9(root)/library/nameres.tcl source $ds9(root)/library/nsvr.tcl source $ds9(root)/library/nrrd.tcl source $ds9(root)/library/nvss.tcl source $ds9(root)/library/open.tcl source $ds9(root)/library/pagesetup.tcl source $ds9(root)/library/panner.tcl source $ds9(root)/library/panzoom.tcl source $ds9(root)/library/photo.tcl source $ds9(root)/library/pixel.tcl source $ds9(root)/library/plot.tcl source $ds9(root)/library/plotbar.tcl source $ds9(root)/library/plotdialog.tcl source $ds9(root)/library/plotelement.tcl source $ds9(root)/library/plotline.tcl source $ds9(root)/library/plotprint.tcl source $ds9(root)/library/plotprocess.tcl source $ds9(root)/library/plotscatter.tcl source $ds9(root)/library/point.tcl source $ds9(root)/library/polygon.tcl source $ds9(root)/library/prefs.tcl source $ds9(root)/library/prefsdialog.tcl source $ds9(root)/library/print.tcl source $ds9(root)/library/projection.tcl source $ds9(root)/library/rgb.tcl source $ds9(root)/library/rgbarray.tcl source $ds9(root)/library/rgbcube.tcl source $ds9(root)/library/rgbimage.tcl source $ds9(root)/library/ruler.tcl source $ds9(root)/library/samp.tcl source $ds9(root)/library/sao.tcl source $ds9(root)/library/save.tcl source $ds9(root)/library/saveimage.tcl source $ds9(root)/library/scale.tcl source $ds9(root)/library/segment.tcl source $ds9(root)/library/sfits.tcl source $ds9(root)/library/shm.tcl source $ds9(root)/library/skyview.tcl source $ds9(root)/library/slider.tcl source $ds9(root)/library/smosaic.tcl source $ds9(root)/library/smosaiciraf.tcl source $ds9(root)/library/smosaicwcs.tcl source $ds9(root)/library/smooth.tcl source $ds9(root)/library/srgbcube.tcl source $ds9(root)/library/starbase.tcl source $ds9(root)/library/stdfbox.tcl source $ds9(root)/library/stsci.tcl source $ds9(root)/library/template.tcl source $ds9(root)/library/text.tcl source $ds9(root)/library/tkfbox.tcl source $ds9(root)/library/url.tcl source $ds9(root)/library/util.tcl source $ds9(root)/library/var.tcl source $ds9(root)/library/vector.tcl source $ds9(root)/library/vla.tcl source $ds9(root)/library/vo.tcl source $ds9(root)/library/wcs.tcl source $ds9(root)/library/xmfbox.tcl source $ds9(root)/library/xpa.tcl switch [tk windowingsystem] { x11 {} aqua {source $ds9(root)/library/macosx.tcl} win32 {source $ds9(root)/library/win32.tcl} } ������������������������������������������saods9/ds9/library/srgbcube.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000002366 12464211205 017033� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadSRGBCubeFile {hdr fn} { global loadParam global current switch -- [$current(frame) get type] { base - 3d { Error [msgcat::mc {Unable to load RGB image into a non-rgb frame}] return } rgb {} } set loadParam(file,type) fits set loadParam(file,mode) {rgb cube} set loadParam(load,type) smmap set loadParam(file,name) $fn set loadParam(file,header) $hdr # mask not supported set loadParam(load,layer) {} ProcessLoad } proc ProcessSRGBCubeCmd {varname iname sock fn} { upvar $varname var upvar $iname i switch -- [string tolower [lindex $var $i]] { new { incr i CreateRGBFrame } mask { incr i # not supported } slice { incr i # not supported } } StartLoad if {$sock != {}} { # xpa if {0} { # not supported } else { LoadSRGBCubeFile [lindex $var $i] [lindex $var [expr $i+1]] } } else { # comm if {0} { # not supported } else { LoadSRGBCubeFile [lindex $var $i] [lindex $var [expr $i+1]] } } FinishLoad } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/starbase.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000025445 12464211205 017046� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # #### # # starbase.tcl -- Tcl interface to starbase # # #### # Starbase Tables Interface # set starbase_debug 0 proc Starbase {} { global Starbase return $Starbase(version) } set Starbase(version) "Starbase Tcl Driver 1.0" proc starbase_nrows { D } { upvar $D data; return $data(Nrows) } proc starbase_ncols { D } { upvar $D data; return $data(Ncols) } proc starbase_get { D row col } { upvar $D data; return $data($row,$col) } proc starbase_set { D row col val } { upvar $D data; set data($row,$col) $val; } proc starbase_colname { D num } { upvar $D data; return $data(0,$num) } #proc starbase_columns { D } { upvar $D data; return $data(Header) } proc starbase_colnum { D name } { upvar $D data; return $data($name) } proc starbase_columns {t} { upvar $t T set row {} set Ncols $T(Ncols) for { set c 1 } { $c <= $Ncols } { incr c } { lappend row $T(0,$c) } return $row } proc starbase_init { t } { upvar t T set T(Nrows) 0 set T(Ncols) 0 set T(Header) "" } # Set up a starbase data array for use with ted # proc starbase_driver { Dr } { upvar $Dr driver set driver(nrows) starbase_nrows set driver(ncols) starbase_ncols set driver(get) starbase_get set driver(set) starbase_set set driver(colname) starbase_colname set driver(colnum) starbase_colnum set driver(columns) starbase_columns set driver(colins) starbase_colins set driver(coldel) starbase_coldel set driver(colapp) starbase_colapp set driver(rowins) starbase_rowins set driver(rowdel) starbase_rowdel set driver(rowapp) starbase_rowapp } starbase_driver Starbase proc starbase_new { t args } { upvar $t T set T(Header) $args set T(Ndshs) [llength $T(Header)] set T(HLines) 2 starbase_colmap T set T(Nrows) 0 } proc starbase_colmap { h } { upvar $h H set c 0 foreach column $H(Header) { incr c set column [string trim $column] set H($column) $c set H(0,$c) $column } set H(Ncols) $c } proc starbase_coldel { t here } { upvar $t T set Ncols $T(Ncols) set T(Header) [lreplace $T(Header) [expr $here - 1] [expr $here - 1] starbase_colmap T for { set row 1 } { $row <= $T(Nrows) } { incr row } { for { set col $here } { $col < $Ncols } { incr col } { if { [catch { set val $T($row,[expr $col + 1]) }] } { set T($row,$col) "" } else { set T($row,$col) $val } } } } proc starbase_colins { t name here } { upvar $t T if { [info exists $T(Header)] == 0 } { set T(Header) $name } else { set T(Header) [linsert $T(Header) [expr $here - 1] $name] } starbase_colmap T for { set row 1 } { $row <= $T(Nrows) } { incr row } { for { set col $T(Ncol) } { $col > $here } { incr col -1 } { if { [catch { set val $T($row,[expr $col - 1]) }] } { set T($row,$col) "" } else { set T($row,$col) $val } } } for { set row 1 } { $row <= $T(Nrows) } { incr row } { set T($row,$here) "" } } proc starbase_header { h fp } { upvar $h H global starbase_line set N 1 if { [info exists starbase_line] } { set line $starbase_line set n 1 set H(H_$n) $line if { [regexp -- {^ *(-)+ *(\t *(-)+ *)*} $line] } break if { $n >= 2 } { set ind [string first "\t" $H(H_[expr $n-1])] if { $ind >= 0 } { set name [string range $H(H_[expr $n-1]) 0 [expr $ind - 1]] incr ind set H(H_$name) [string range $H(H_[expr $n-1]) $ind end] set H(N_$name) [expr $n-1] } # set l [split $H(H_[expr $n-1]) "\t"] # if { [llength $l] > 1 } { # set name [lindex $l 0] # set H(H_$name) [lrange $l 1 end] # set H(N_$name) [expr $n-1] # } } unset starbase_line set N 2 } for { set n $N } { [set eof [gets $fp line]] != -1 } { incr n } { set H(H_$n) $line if { [regexp -- {^ *(-)+ *(\t *(-)+ *)*} $line] } break if { $n >= 2 } { set ind [string first "\t" $H(H_[expr $n-1])] if { $ind >= 0 } { set name [string range $H(H_[expr $n-1]) 0 [expr $ind - 1]] incr ind set H(H_$name) [string range $H(H_[expr $n-1]) $ind end] set H(N_$name) [expr $n-1] } # set l [split $H(H_[expr $n-1]) "\t"] # if { [llength $l] > 1 } { # set name [lindex $l 0] # set H(H_$name) [lrange $l 1 end] # set H(N_$name) [expr $n-1] # } } } if { $eof == -1 } { error "ERROR: in starbase_header: unexpected eof" } set H(H_$n) $line set H(HLines) $n set H(Header) [split $H(H_[expr $n-1]) "\t"] set H(Dashes) [split $H(H_$n) "\t"] set H(Ndshs) [llength $H(Dashes)] starbase_colmap H return H(Header) } proc starbase_hdrget { h name } { upvar $h H return $H(H_$name) } proc starbase_hdrset { h name value } { upvar #0 $h H if { ![info exists H(H_$name)] } { set n [incr H(HLines)] set H(H_[expr $n-0]) $H(H_[expr $n-1]) set H(H_[expr $n-1]) $H(H_[expr $n-2]) set H(N_$name) [expr $n-2] } set H(H_$name) $value set H(H_$H(N_$name)) "$name $value" } proc starbase_hdrput { h fp } { upvar $h H if { ![info exists H(HLines)] || ($H(HLines) == 0) } { return } set nl [expr $H(HLines) - 2] for { set l 1 } { $l <= $nl } { incr l } { puts $fp $H(H_$l) } if { ![info exists H(Ncols)] || ($H(Ncols) == 0) } { return } set nc $H(Ncols) for { set c 1 } { $c <= $nc } { incr c } { puts -nonewline $fp "$H(0,$c)" if { $c != $nc } { puts -nonewline $fp "\t" } else { puts -nonewline $fp "\n" } } for { set c 1 } { $c <= $nc } { incr c } { set len [string length $H(0,$c)] for { set d 1 } { $d <= $len } { incr d } { puts -nonewline $fp "-" } if { $c != $nc } { puts -nonewline $fp "\t" } else { puts -nonewline $fp "\n" } } } proc starbase_hdrput_ { h varname } { upvar $h H upvar $varname var if { ![info exists H(HLines)] || ($H(HLines) == 0) } { return } set nl [expr $H(HLines) - 2] for { set l 1 } { $l <= $nl } { incr l } { append var "$H(H_$l)\n" } if { ![info exists H(Ncols)] || ($H(Ncols) == 0) } { return } set nc $H(Ncols) for { set c 1 } { $c <= $nc } { incr c } { append var "$H(0,$c)" if { $c != $nc } { append var "\t" } else { append var "\n" } } for { set c 1 } { $c <= $nc } { incr c } { set len [string length $H(0,$c)] for { set d 1 } { $d <= $len } { incr d } { append var "-" } if { $c != $nc } { append var "\t" } else { append var "\n" } } } proc starbase_readfp { t fp } { upvar $t T starbase_header T $fp set NCols [starbase_ncols T] for { set r 1 } { [gets $fp line] != -1 } { incr r } { if { [string index $line 0] == "\f" } { global starbase_line set starbase_line [string range $line 1 end] break } set c 1 foreach val [split $line "\t"] { set T($r,$c) [string trim $val] incr c } for { } { $c <= $NCols } { incr c } { set T($r,$c) {} } } set T(Nrows) [expr $r-1] } proc starbase_read { t file } { upvar $t T set fp [open $file] starbase_readfp T $fp close $fp set T(filename) $file } proc starbase_writefp { t fp } { upvar $t T starbase_hdrput T $fp if { ![info exists T(Nrows)] || ($T(Nrows) == 0) } { return } set nr $T(Nrows) set nc $T(Ncols) for { set r 1 } { $r <= $nr } { incr r } { for { set c 1 } { $c < $nc } { incr c } { if { [catch { set val $T($r,$c) }] } { set val "" } puts -nonewline $fp "$val " } if { [catch { set val $T($r,$c) }] } { set val "" } puts $fp $val } } proc starbase_write { t file } { upvar $t T set fp [open $file w] starbase_writefp T $fp close $fp } proc starbase_write_ { t } { upvar $t T set rr {} starbase_hdrput_ T rr if { ![info exists T(Nrows)] || ($T(Nrows) == 0) } { return } set nr $T(Nrows) set nc $T(Ncols) for { set r 1 } { $r <= $nr } { incr r } { for { set c 1 } { $c < $nc } { incr c } { if { [catch { set val $T($r,$c) }] } { set val "" } append rr "$val " } if { [catch { set val $T($r,$c) }] } { set val "" } append rr "$val\n" } return $rr } proc starbase_rowins { t row } { upvar $t T incr T(Nrows) set nr $T(Nrows) set nc $T(Ncols) for { set r $nr } { $r > $row } { set r [expr $r-1] } { for { set c 1 } { $c <= $nc } { incr c } { if { [catch { set val $T([expr $r-1],$c) }] } { set val "" } set T($r,$c) $val } } for { set c 1 } { $c <= $nc } { incr c } { set T($r,$c) "" } } proc starbase_rowdel { t row } { upvar $t T incr T(Nrows) -1 set nr $T(Nrows) set nc $T(Ncols) for { set r $row } { $r <= $nr } { incr r } { for { set c 1 } { $c <= $nc } { incr c } { if { [catch { set val $T([expr $r+1],$c) }] } { set val "" } set T($r,$c) $val } } for { set c 1 } { $c <= $nc } { incr c } { set T($r,$c) "" } } proc starbase_httpreader { t wait sock http } { global $t global starbase_debug upvar #0 $wait W upvar #0 $t T set T(http) $http if { ![info exists T(state)] } { error "ERROR: starbase_httpreader not properly initialized" } switch -- $T(state) { 0 { fconfigure $sock -blocking 1 set T(state) 1 set T(Nrows) 0 set T(HLines) 0 } 1 { incr ${t}(HLines) set n $T(HLines) if { [gets $sock line] == -1 } { set T(state) -1 set T(HLines) [expr $T(HLines) - 1] set T(Nrows) 0 return } set T(H_$n) $line set l [split $line] if { [llength $l] > 1 } { set T(H_[lindex $l 0]) [lrange $l 1 end] } set T(H_$n) $line if { [regexp -- {^ *(-)+ *(\t *(-)+ *)*} $line] } { set T(Header) [split $T(H_[expr $n-1]) "\t"] set T(Dashes) [split $T(H_$n) "\t"] set T(Ndshs) [llength $T(Dashes)] starbase_colmap T set T(state) 2 } } 2 { if { [gets $sock line] == -1 } { set T(state) 0 } else { if { $starbase_debug } { puts [format "starbase_httpreader: %s" $line] } incr ${t}(Nrows) set r $T(Nrows) set NCols [starbase_ncols T] set c 1 foreach val [split $line "\t"] { set T($r,$c) $val incr c } for { } { $c <= $NCols } { incr c } { set T($r,$c) {} } } } default { error "ERROR: unknown switch in starbase_httpreader" } } } proc starbase_cancel { t wait http } { upvar #0 $wait W upvar #0 $t T # set T(state) 0 set W 1 } proc starbase_http { t url wait } { upvar #0 $t T set T(state) 0 set T(http) [http::geturl $url \ -handler [list starbase_httpreader $t $wait] \ -command [list starbase_cancel $t $wait]] } proc starbase_httpkill { t } { upvar #0 $t T http::reset $T(http) } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/stdfbox.tcl����������������������������������������������������������������������000644 �000765 �000000 �00000027376 12613476052 016731� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 # do this after the language has been defined and the prefs sourced proc InitDialogBox {} { global ds9 global pds9 global env global fitsurl set fitsurl {} global fitsfbox set fitsfbox(file) {ds9.fits} set fitsfbox(dir) {} set fitsfbox(types) [list \ [list {FITS} {*.fits}] \ [list {FITS} {*.FITS}] \ [list {FITS} {*.fit}] \ [list {FITS} {*.FIT}] \ [list {FITS} {*.fts}] \ [list {FITS} {*.FTS}] \ [list {FITS} {*.ds}] \ [list {FITS} {*.DS}] \ [list {FITS} {*.fits.gz}] \ [list {FITS} {*.fits.bz2}] \ [list {FITS} {*.fits.Z}] \ [list {FITS} {*.fits.z}] \ [list {FITS} {*.fitz}] \ [list {FITS} {*.FITZ}] \ [list {FITS} {*.ftz}] \ [list {FITS} {*.FTZ}] \ [list {FITS} {*.fz}] \ [list {FITS} {*.FZ}] \ ] global savefitsfbox set savefitsfbox(file) {ds9.fits} set savefitsfbox(dir) {} set savefitsfbox(types) [list \ [list {FITS} {*.fits}] \ [list {FITS} {*.fit}] \ [list {FITS} {*.fts}] \ [list {FITS} {*.fits.gz}] \ [list {FITS} {*.fits.bz2}] \ [list {FITS} {*.fits.Z}] \ [list {FITS} {*.fits.z}] \ ] global epsfbox set epsfbox(file) {ds9.eps} set epsfbox(dir) {} set epsfbox(types) [list \ [list {EPS} {*.eps}] \ ] global arrayfbox set arrayfbox(file) {ds9.arr} set arrayfbox(dir) {} set arrayfbox(types) [list \ [list [::msgcat::mc {Array}] {*.arr}] \ ] global rgbarrayfbox set rgbarrayfbox(file) {ds9.rgb} set rgbarrayfbox(dir) {} set rgbarrayfbox(types) [list \ [list [::msgcat::mc {RGB Array}] {*.rgb}] \ ] global nrrdfbox set nrrdfbox(file) {ds9.nrrd} set nrrdfbox(dir) {} set nrrdfbox(types) [list \ [list {NRRD} {*.nrrd}] \ ] global envifbox set envifbox(file) {ds9.hdr} set envifbox(dir) {} set envifbox(types) [list \ [list {ENVI} {*.hdr}] \ ] global envi2fbox set envi2fbox(file) {ds9.bsq} set envi2fbox(dir) {} set envi2fbox(types) [list \ [list {ENVI2} {*.bil}] \ [list {ENVI2} {*.bip}] \ [list {ENVI2} {*.bsq}] \ [list {ENVI2} {*.cube}] \ ] global giffbox set giffbox(file) {ds9.gif} set giffbox(dir) {} set giffbox(types) [list \ [list {GIF} {*.gif}] \ ] global jpegfbox set jpegfbox(file) {ds9.jpeg} set jpegfbox(dir) {} set jpegfbox(types) [list \ [list {JPEG} {*.jpeg}] \ [list {JPEG} {*.jpg}] \ ] global tifffbox set tifffbox(file) {ds9.tiff} set tifffbox(dir) {} set tifffbox(types) [list \ [list {TIFF} {*.tiff}] \ [list {TIFF} {*.tif}] \ ] global pngfbox set pngfbox(file) {ds9.png} set pngfbox(dir) {} set pngfbox(types) [list \ [list {PNG} {*.png}] \ ] global mpegfbox set mpegfbox(file) {ds9.mpeg} set mpegfbox(dir) {} set mpegfbox(types) [list \ [list {MPEG} {*.mpeg}] \ [list {MPEG} {*.mpg}] \ ] global pixelfbox set pixelfbox(file) {ds9.pix} set pixelfbox(dir) {} set pixelfbox(types) [list \ [list {PIX} {*.pix}] \ ] global markerfbox set markerfbox(file) {ds9.reg} set markerfbox(dir) {} set markerfbox(types) [list \ [list {REG} {*.reg}] \ [list {FITS} {*.fits}] \ [list {XML} {*.xml}] \ ] global templatefbox set templatefbox(file) {ds9.tpl} set templatefbox(dir) {} set templatefbox(types) \ [list [list {TPL} {*.tpl}] [list [::msgcat::mc {All}] {*}] ] global colorbarfbox set colorbarfbox(file) {ds9.sao} set colorbarfbox(dir) {} set colorbarfbox(types) [list \ [list [::msgcat::mc {Colormap}] {*.sao}] \ [list [::msgcat::mc {Colormap}] {*.lut}] \ ] global contrastbiasfbox set contrastbiasfbox(file) {ds9.cb} set contrastbiasfbox(dir) {} set contrastbiasfbox(types) [list \ [list {CB} {*.cb}] \ ] global colortagfbox set colortagfbox(file) {ds9.tag} set colortagfbox(dir) {} set colortagfbox(types) [list \ [list {Colortag} {*.tag}] \ ] global pssavfbox set pssavfbox(file) {ds9.ps} set pssavfbox(dir) {} set pssavfbox(types) [list \ [list {PS} {*.ps}] \ ] global prsavfbox set prsavfbox(file) {ds9.txt} set prsavfbox(dir) {} set prsavfbox(types) [list \ [list {TXT} {*.txt}] \ ] global contourfbox set contourfbox(file) {ds9.con} set contourfbox(dir) {} set contourfbox(types) [list \ [list {CON} {*.con}] \ ] global contourlevfbox set contourlevfbox(file) {ds9.lev} set contourlevfbox(dir) {} set contourlevfbox(types) [list \ [list {LEV} {*.lev}] \ ] global gridfbox set gridfbox(file) {ds9.grd} set gridfbox(dir) {} set gridfbox(types) [list \ [list {GRD} {*.grd}] \ ] global catfbox set catfbox(file) {ds9.cat} set catfbox(dir) {} set catfbox(types) [list \ [list [::msgcat::mc {Catalog}] {*.cat}] \ [list [::msgcat::mc {Catalog}] {*.rdb}] \ ] global cattsvfbox set cattsvfbox(file) {ds9.tsv} set cattsvfbox(dir) {} set cattsvfbox(types) [list \ [list [::msgcat::mc {Catalog}] {*.tsv}] \ [list [::msgcat::mc {Catalog}] {*.csv}] \ ] global catvotfbox set catvotfbox(file) {ds9.xml} set catvotfbox(dir) {} set catvotfbox(types) [list \ [list [::msgcat::mc {Catalog}] {*.xml}] \ [list [::msgcat::mc {Catalog}] {*.vot}] \ [list [::msgcat::mc {Catalog}] {*.votable}] \ ] global catfltfbox set catfltfbox(file) {ds9.flt} set catfltfbox(dir) {} set catfltfbox(types) [list \ [list {FLT} {*.flt}] \ ] global catsymfbox set catsymfbox(file) {ds9.sym} set catsymfbox(dir) {} set catsymfbox(types) [list \ [list {SYM} {*.sym}] \ ] global catcdssrchfbox set catcdssrchfbox(file) {ds9.cds} set catcdssrchfbox(dir) {} set catcdssrchfbox(types) [list \ [list {CDS} {*.cds}] \ ] global analysisfbox set analysisfbox(file) {ds9.ans} set analysisfbox(dir) {} set analysisfbox(types) [list \ [list [::msgcat::mc {Analysis}] {*.ans}] \ [list [::msgcat::mc {Analysis}] {*.ds9}] \ ] global analysisparamfbox set analysisparamfbox(file) {} set analysisparamfbox(dir) {} set analysisparamfbox(types) [list \ ] global apsavfbox set apsavfbox(file) {ds9.ps} set apsavfbox(dir) {} set apsavfbox(types) [list \ [list {PS} {*.ps}] \ ] global apdatafbox set apdatafbox(file) {ds9.dat} set apdatafbox(dir) {} set apdatafbox(types) [list \ [list {DAT} {*.dat}] \ ] global apconfigfbox set apconfigfbox(file) {ds9.plt} set apconfigfbox(dir) {} set apconfigfbox(types) [list \ [list {PLT} {*.plt}] \ ] global textfbox set textfbox(file) {ds9.txt} set textfbox(dir) {} set textfbox(types) [list \ [list {TXT} {*.txt}] \ ] global tclfbox set tclfbox(file) {ds9.tcl} set tclfbox(dir) {} set tclfbox(types) [list \ [list {TCL} {*.tcl}] \ ] global hvhtmlfbox set hvhtmlfbox(file) {ds9.html} set hvhtmlfbox(dir) {} set hvhtmlfbox(types) [list \ [list {HTML} {*.html}] \ [list {HTML} {*.htm}] \ ] global wcsfbox set wcsfbox(file) {ds9.wcs} set wcsfbox(dir) {} set wcsfbox(types) [list \ [list {WCS} {*.wcs}] \ ] global backupfbox set backupfbox(file) {ds9.bck} set backupfbox(dir) {} set backupfbox(types) [list \ [list {BCK} {*.bck}] \ ] } proc SetFileLast {format item} { switch $format { mecube - multiframe - mosaic - mosaicimage - rgbcube - rgbimage - fits {FileLast fitsfbox $item} array {FileLast arrayfbox $item} rgbarray {FileLast rgbarrayfbox $item} envi {FileLast envifbox $item} envi2 {FileLast envi2fbox $item} gif {FileLast giffbox $item} jpeg {FileLast jpegfbox $item} nrrd {FileLast nrrdfbox $item} tiff {FileLast tifffbox $item} png {FileLast pngfbox $item} sfits - srgbcube - sfits - smosaic - url {} } } proc ExtToFormat {fn} { switch -- [file extension $fn] { .fits - .FITS - .fit - .FIT - .fts - .FTS - .ds - .DS - .fits.gz - .fits.bz2 - .fits.Z - .fits.z - .fitz - .FITZ - .ftz - .FTZ - .fz - .FZ {return fits} .arr - .array {return array} .rgb {return rgbarray} .nrrd {return nrrd} .eps - .epsf {return eps} .gif - .giff {return gif} .jpg - .jpeg {return jpeg} .tif - .tiff {return tiff} .png {return png} .mpg - .mpeg {return mpeg} .hdr - .bil - .bip - .bsq - .cube {return envi} } } # used by backup proc OpenFileDialog {varname} { return [FileDialog $varname tk_getOpenFile] } proc SaveFileDialog {varname} { return [FileDialog $varname tk_getSaveFile] } proc FileDialog {varname which} { global pds9 switch -- $pds9(dialog) { motif {return [FileDialogMotif $varname $which]} windows {return [FileDialogWindows $varname $which]} native {return [FileDialogNative $varname $which]} } } proc FileDialogMotif {varname which} { upvar #0 $varname var global ds9 global pds9 switch -- $which { tk_getOpenFile {set type open} tk_getSaveFile {set type save} } if {$pds9(dialog,all)} { set types [linsert $var(types) 0 [list [::msgcat::mc {All}] {*}]] } else { set types [linsert $var(types) end [list [::msgcat::mc {All}] {*}]] } set result [::tk::MotifFDialog $type \ -filetypes $types \ -initialdir $var(dir) \ -initialfile $var(file) \ -parent $ds9(top)] if {$result != {}} { set var(file) [file tail $result] set var(dir) [file dirname $result] } return $result } proc FileDialogWindows {varname which} { upvar #0 $varname var global ds9 global pds9 switch -- $which { tk_getOpenFile {set type open} tk_getSaveFile {set type save} } if {$pds9(dialog,all)} { set types [linsert $var(types) 0 [list [::msgcat::mc {All}] {*}]] } else { set types [linsert $var(types) end [list [::msgcat::mc {All}] {*}]] } set result [::tk::dialog::file:: $type \ -filetypes $types \ -initialdir $var(dir) \ -initialfile $var(file) \ -parent $ds9(top)] if {$result != {}} { set var(file) [file tail $result] set var(dir) [file dirname $result] } return $result } proc FileDialogNative {varname which} { upvar #0 $varname var global ds9 global pds9 if {$pds9(dialog,all)} { set types [linsert $var(types) 0 [list [::msgcat::mc {All}] {*}]] } else { set types [linsert $var(types) end [list [::msgcat::mc {All}] {*}]] } if {[catch {$which \ -filetypes $types \ -initialdir $var(dir) \ -initialfile $var(file) \ -parent $ds9(top)} result]} { # must have a bad file name, just clear and try again set var(file) {} set var(dir) {} if {[catch {$which \ -filetypes $types \ -parent $ds9(top)} result]} { #ok, something is really wrong catch {$which -parent $ds9(top)} result } } if {$result != {}} { set var(file) [file tail $result] set var(dir) [file dirname $result] } return $result } proc FileLast {varname fn} { upvar #0 $varname var global ds9 switch $ds9(wm) { x11 { set var(file) [file tail $fn] set var(dir) [file dirname $fn] } aqua { # don't conflict with native dialog } win32 {} } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/stsci.tcl������������������������������������������������������������������������000644 �000765 �000000 �00000012242 12544316735 016373� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc STSCIDef {} { global stsci global istsci set istsci(top) .stsci set istsci(mb) .stscimb set stsci(sky) fk5 set stsci(rformat) arcmin set stsci(width) 15 set stsci(height) 15 set stsci(mode) new set stsci(save) 0 set stsci(valid) 0 set stsci(survey) {all} } proc STSCIDialog {} { global stsci global istsci global wcs if {[winfo exists $istsci(top)]} { raise $istsci(top) return } set varname dstscii upvar #0 $varname var global $varname set var(top) $istsci(top) set var(mb) $istsci(mb) set var(sky) $stsci(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $stsci(rformat) set var(width) $stsci(width) set var(height) $stsci(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(mode) $stsci(mode) set var(save) $stsci(save) set var(valid) $stsci(valid) set var(survey) $stsci(survey) set w $var(top) IMGSVRInit $varname "STSCI-DSS [msgcat::mc {Server}]" STSCIExec STSCIAck menu $var(mb).survey $var(mb) add cascade -label Survey -menu $var(mb).survey $var(mb).survey add radiobutton -label {POSS2/UKSTU Red} \ -variable ${varname}(survey) -value poss2ukstu_red $var(mb).survey add radiobutton -label {POSS2/UKSTU Infrared} \ -variable ${varname}(survey) -value poss2ukstu_ir $var(mb).survey add radiobutton -label {POSS2/UKSTU Blue} \ -variable ${varname}(survey) -value poss2ukstu_blue $var(mb).survey add radiobutton \ -label {POSS1 (First Generation) Blue} \ -variable ${varname}(survey) -value poss1_blue $var(mb).survey add radiobutton \ -label {POSS1 (First Generation) Red} \ -variable ${varname}(survey) -value poss1_red $var(mb).survey add radiobutton \ -label {Best of a combined list of all plates} \ -variable ${varname}(survey) -value all $var(mb).survey add radiobutton \ -label {Quick-V Survey} \ -variable ${varname}(survey) -value quickv $var(mb).survey add radiobutton \ -label {HST Phase 2 Target Positioning (GSC 2)} \ -variable ${varname}(survey) -value phase2_gsc2 $var(mb).survey add radiobutton \ -label {HST Phase 2 Target Positioning (GSC 1)} \ -variable ${varname}(survey) -value phase2_gsc1 IMGSVRUpdate $varname 1 } proc STSCIExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set compress none set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set compress gz set var(fn) [tmpnam ds9stsci ".fits.gz"] } # size - convert to arcmin switch -- $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } if {$ww>60} { set ww 60 } if {$hh>60} { set hh 60 } # query set var(query) [http::formatQuery r $var(x) d $var(y) e J2000 w $ww h $hh f fits c $compress v $var(survey)] set var(url) "http://stdatu.stsci.edu/cgi-bin/dss_search" IMGSVRLoad $varname } proc STSCIAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the DSS-STSCI The Digitized Sky Surveys were produced at the Space Telescope Science Institute under U.S. Government grant NAG W-2166. The images of these surveys are based on photographic data obtained using the Oschin Schmidt Telescope on Palomar Mountain and the UK Schmidt Telescope. The plates were processed into the present compressed digital form with the permission of these institutions. The National Geographic Society - Palomar Observatory Sky Atlas (POSS-I) was made by the California Institute of Technology with grants from the National Geographic Society. The Second Palomar Observatory Sky Survey (POSS-II) was made by the California Institute of Technology with funds from the National Science Foundation, the National Geographic Society, the Sloan Foundation, the Samuel Oschin Foundation, and the Eastman Kodak Corporation. The Oschin Schmidt Telescope is operated by the California Institute of Technology and Palomar Observatory. The UK Schmidt Telescope was operated by the Royal Observatory Edinburgh, with funding from the UK Science and Engineering Research Council (later the UK Particle Physics and Astronomy Research Council), until 1988 June, and thereafter by the Anglo-Australian Observatory. The blue plates of the southern Sky Atlas and its Equatorial Extension (together known as the SERC-J), as well as the Equatorial Red (ER), and the Second Epoch [red] Survey (SES) were all taken with the UK Schmidt. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessSTSCICmd {varname iname} { upvar $varname var upvar $iname i STSCIDialog IMGSVRProcessCmd $varname $iname dstscii } proc ProcessSendSTSCICmd {proc id param} { STSCIDialog IMGSVRProcessSendCmd $proc $id $param dstscii } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/template.tcl���������������������������������������������������������������������000644 �000765 �000000 �00000006774 12464211205 017061� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc TemplateDef {} { global itemplate # chandra set itemplate(chandra,acis,acis-i) {chandra/acis/acis-i.tpl} set itemplate(chandra,acis,acis-s) {chandra/acis/acis-s.tpl} set itemplate(chandra,acis,acis-is) {chandra/acis/acis-is.tpl} set itemplate(chandra,acis,acis-si) {chandra/acis/acis-si.tpl} set itemplate(chandra,hrc,hrc-i) {chandra/hrc/hrc-i.tpl} set itemplate(chandra,hrc,hrc-s) {chandra/hrc/hrc-s.tpl} # xmm set itemplate(xmm,epicmos1) {xmm/epicmos1.tpl} set itemplate(xmm,epicmos2) {xmm/epicmos2.tpl} set itemplate(xmm,epicpn) {xmm/epicpn.tpl} # heasarc # suzaku set itemplate(heasarc,suzaku,hxd) {heasarc/suzaku/hxd.tpl} set itemplate(heasarc,suzaku,xis) {heasarc/suzaku/xis.tpl} set itemplate(heasarc,suzaku,xrs) {heasarc/suzaku/xrs.tpl} # mmt # megacam set itemplate(mmt,megacam,megacam-amp) {mmt/megacam/megacam-amp.tpl} set itemplate(mmt,megacam,megacam-amp-guide) {mmt/megacam/megacam-amp-guide.tpl} set itemplate(mmt,megacam,megacam-chip) {mmt/megacam/megacam-chip.tpl} set itemplate(mmt,megacam,megacam-chip-guide) {mmt/megacam/megacam-chip-guide.tpl} # hecto set itemplate(mmt,hecto,hectospec) {mmt/hecto/hectospec.tpl} set itemplate(mmt,hecto,hectochelle) {mmt/hecto/hectochelle.tpl} # mmirs set itemplate(mmt,mmirs,image) {mmt/mmirs/image.tpl} set itemplate(mmt,mmirs,longslit) {mmt/mmirs/longslit.tpl} set itemplate(mmt,mmirs,mask) {mmt/mmirs/mask.tpl} # others set itemplate(mmt,swirc) {mmt/swirc.tpl} set itemplate(mmt,binospec) {mmt/binospec.tpl} } proc CreateFOVMenu {} { global ds9 global itemplate global marker set mm $ds9(mb).region.fov menu $mm set l0 {} set l1 {} set l2 {} foreach t [lsort [array names itemplate]] { set tt [split $t ","] set t0 [lindex $tt 0] set t1 [lindex $tt 1] set t2 [lindex $tt 2] if {$l0 != $t0} { menu $mm.$t0 $mm add cascade -label [string toupper $t0] -menu $mm.$t0 set l0 $t0 set l1 {} set l2 {} } if {$l1 != $t1} { if {$t2 != {}} { menu $mm.$t0.$t1 $mm.$t0 add cascade -label [string toupper $t1] \ -menu $mm.$t0.$t1 set l1 $t1 set l2 {} } else { $mm.$t0 add radiobutton \ -label [string toupper $t1] -variable marker(shape) \ -value $t continue } } $mm.$t0.$t1 add radiobutton -label [string toupper $t2] \ -variable marker(shape) -value $t } } proc OpenTemplateMarker {} { LoadTemplateMarker [OpenFileDialog templatefbox] } proc LoadTemplateMarker {fn} { global ds9 global current if {$current(frame) != {} && $fn != {}} { set cc [$ds9(canvas) coords $current(frame)] set ww [lindex [$current(frame) configure -width] 4] set hh [lindex [$current(frame) configure -height] 4] set xx [expr [lindex $cc 0]+$ww/2.0] set yy [expr [lindex $cc 1]+$hh/2.0] catch {$current(frame) marker create template "\{$fn\}" $xx $yy} } } proc LoadTemplateMarkerAt {fn ra dec sys sky} { global current if {$current(frame) != {} && $fn != {}} { catch {$current(frame) marker create template "\{$fn\}" $sys $sky $ra $dec} } } proc SaveAsTemplateMarker {} { global current if {$current(frame) != {}} { set fn [SaveFileDialog templatefbox] if {$fn != {}} { $current(frame) marker save template "\{$fn\}" } } } ����saods9/ds9/library/text.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000004061 12514261633 016223� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc TextDialog {varname} { upvar #0 $varname var global $varname # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set var(canrotate) [$var(frame) get marker $var(id) text rotate] # procs set var(which) text set var(proc,apply) TextApply set var(proc,close) TextClose set var(proc,coordCB) TextCoordCB # base MarkerBaseCenterDialog $varname # init MarkerBaseCenterRotateCB $varname # callbacks $var(frame) marker $var(id) callback rotate MarkerBaseCenterRotateCB \ $varname set f $var(top).param # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] # Rotate ttk::label $f.trotate -text [msgcat::mc {Rotate}] ttk::checkbutton $f.rotate -variable ${varname}(canrotate) \ -command "TextRotate $varname" grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w grid $f.trotate $f.rotate -padx 2 -pady 2 -sticky w } # actions proc TextClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback rotate MarkerBaseCenterRotateCB MarkerBaseCenterClose $varname } proc TextApply {varname} { upvar #0 $varname var global $varname MarkerBaseCenterRotate $varname MarkerBaseCenterApply $varname } proc TextRotate {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) text rotate $var(canrotate) } # callbacks proc TextCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "TextCoordCB" } MarkerBaseCoordCB $varname MarkerBaseCenterMoveCB $varname MarkerBaseCenterRotateCB $varname } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/tkfbox.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000112746 12144243140 016536� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# tkfbox.tcl -- # # Implements the "TK" standard file selection dialog box. This dialog # box is used on the Unix platforms whenever the tk_strictMotif flag is # not set. # # The "TK" standard file selection dialog box is similar to the file # selection dialog box on Win95(TM). The user can navigate the # directories by clicking on the folder icons or by selecting the # "Directory" option menu. The user can select files by clicking on the # file icons or by entering a filename in the "Filename:" entry. # # Copyright (c) 1994-1998 Sun Microsystems, Inc. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # namespace eval ::tk::dialog {} namespace eval ::tk::dialog::file { namespace import -force ::tk::msgcat::* variable showHiddenBtn 0 variable showHiddenVar 1 # Create the images if they did not already exist. if {![info exists ::tk::Priv(updirImage)]} { set ::tk::Priv(updirImage) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/gD+AP7rGN SCAAAACXBIWXMAAA3WAAAN1gGQb3mcAAAACXZwQWcAAAAWAAAAFgDcxelYAAAENUlE QVQ4y7WUbWiVZRjHf/f9POcc9+Kc5bC2aIq5sGG0XnTzNU13zAIlFMNc9CEhTCKwCC JIgt7AglaR0RcrolAKg14+GBbiGL6xZiYyy63cmzvu7MVznnOe537rw7bDyvlBoT/c n+6L3/3nf13XLZLJJP+HfICysjKvqqpq+rWKysvLR1tbW+11g+fPn/+bEGIe4KYqCs Owu66u7oG2trah6wJrrRc0NTVhjME5h7Vj5pxzCCE4duxYZUdHx/aGhoZmgJ+yb+wF uCO19RmAffv25f8LFslkktraWtvU1CS6u7vRWmOtxVpbAPu+T0tLS04pFU/J34Wd3S cdFtlfZWeZBU4IcaS5uXn1ZLAEMMY4ay1aa4wx/zpKKYIgoL6+vmjxqoXe5ZLTcsPq bTyycjODpe1y3WMrvDAMV14jCuW0VhhjiJQpOJ5w7Zwjk8/y9R+vsHHNNq6oFMrkeX BxI+8d2sktap3YvOPD0lRQrH+Z81fE7t3WB4gihVKazsuaA20aKSUgAG/seQdy2l6W 37+EyopqTv39I6HJUT2zlnlza2jLdgiTaxwmDov6alLHcZUTzXPGGAauWJbfO4dHl9 bgJs3HyfNf0N4ZsOa+jbT3/ownY/hO09p1kBULtjBw+Tvq7xzwauds4dWPDleAcP5E xlprgtBRUZRgYCRPTzoHwEi2g6OnX+eFrW/RM9qBE4p43CeTz5ATaU6nDrFm2cPs/+ E1SopqkZ7MFJqntXZaa7IKppckwIEvJbg8LWd28OT6nVihCPQQ8UScWCLGqO4hXuQx qDtJ204eWrqWb1ufRspwtABWaqx5gRKUFSdwDnxPcuLcyyxbuIyaqntIBV34MY9YzC Owg+S9YeJFkniRpGPkCLMrZzG3+jbktA/KClMxFoUhiKC0OAbAhd79CO8i6xe/STyW 4O7KVRgUJ/sP0heeJV4kEVKw/vZd40sFKxat4mLvp6VLdvnb/XHHGGPIKwBBpC1/9n 3DpfRZnn9/AwCxRII9O79kVPdjvByxuET6Ai8mePeTt4lyheXzhOSpCcdWa00uckTG kckbGu76nEhbIm2xznH4VB3OWYaiXqQn8GKSWGIMHuXyPL76LBcupmhp69pz4uMnXi w4VloTGcdQRtGdzmHs1f+RdYZslMZJhzUOHVnceN1ooEiP5JUzdqCQMWCD0JCIeQzn NNpO+clhrCYf5rC+A2cxWmDUWG2oHEOZMEKIwclgMnnLrTeXUV7sUzpNXgU9DmijWV v9LEKCkAIhKIBnlvpks6F21qUZ31u/sbExPa9h0/RzwzMov2nGlG5TmW1YOzzlnSfL mVnyGf19Q7lwZHBp+1fPtflAIgiC7389n9qkihP+lWyeqfUO15ZwQTqlw9H+o2cOvN QJCAHEgEqgYnI0NyALjAJdyWQy7wMa6AEujUdzo3LjcAXwD/XCTKIRjWytAAAAJXRF WHRjcmVhdGUtZGF0ZQAyMDA5LTA0LTA2VDIxOjI1OjQxLTAzOjAw8s+uCAAAACV0RV h0bW9kaWZ5LWRhdGUAMjAwOC0wMS0wM1QxNTowODoyMS0wMjowMJEc/44AAAAZdEVY dFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC }] } if {![info exists ::tk::Priv(folderImage)]} { set ::tk::Priv(folderImage) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiA AAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBl Lm9yZ5vuPBoAAAHCSURBVDiNpZAxa5NRFIafc+9XLCni4BC6FBycMnbrLpkcgtDVX6 C70D/g4lZX/4coxLlgxFkpiiSSUGm/JiXfveee45AmNlhawXc53HvPee55X+l2u/yP qt3d3Tfu/viatwt3fzIYDI5uBJhZr9fr3TMzzAx3B+D09PR+v98/7HQ6z5fNOWdCCG U4HH6s67oAVDlnV1UmkwmllBUkhMD29nYHeLuEAkyn06qU8qqu64MrgIyqYmZrkHa7 3drc3KTVahFjJITAaDRiPB4/XFlQVVMtHH5IzJo/P4EA4MyB+erWPQB7++zs7ccYvl U5Z08pMW2cl88eIXLZeDUpXzsBkNQ5eP1+p0opmaoCTgzw6fjs6gLLsp58FB60t0Dc K1Ul54yIEIMQ43Uj68pquDmCeJVztpwzuBNE2LgBoMVpslHMCUEAFgDVxQbzVAiA+a K5uGPmmDtZF3VpoUm2ArhqQaRiUjcMf81p1G60UEVhcjZfAFTVUkrgkS+jc06mDX9n vq4YhJ9nlxZExMwMEaHJRutOdWuIIsJFUoBSuTvHJ4YIfP46unV4qdlsjsBRZRtb/X fHd5+C8+P7+J8BIoxFwovfRxYhnhxjpzEAAAAASUVORK5CYII= }] } if {![info exists ::tk::Priv(fileImage)]} { set ::tk::Priv(fileImage) [image create photo -data { iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gva eTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QQWFA84umAmQgAAANpJREFU OMutkj1uhDAQhb8HSLtbISGfgZ+zbJkix0HmFhwhUdocBnMBGvqtTIqIFSReWKK8ai x73nwzHrVt+zEMwwvH9FrX9TsA1trpqKy10+yUzME4jnjvAZB0LzXHkojjmDRNVyh3 A+89zrlVwlKSqKrqVy/J8lAUxSZBSMny4ZLgp54iyPM8UPHGNJ2IomibAKDv+9VlWZ bABbgB5/0WQgSSkC4PF2JF4JzbHN430c4vhAm0TyCJruuClefph4yCBCGT3T3Isoy/ KDHGfDZNcz2SZIx547/0BVRRX7n8uT/sAAAAAElFTkSuQmCC }] } } # ::tk::dialog::file:: -- # # Implements the TK file selection dialog. This dialog is used when the # tk_strictMotif flag is set to false. This procedure shouldn't be # called directly. Call tk_getOpenFile or tk_getSaveFile instead. # # Arguments: # type "open" or "save" # args Options parsed by the procedure. # proc ::tk::dialog::file:: {type args} { variable ::tk::Priv variable showHiddenBtn set dataName __tk_filedialog upvar ::tk::dialog::file::$dataName data Config $dataName $type $args if {$data(-parent) eq "."} { set w .$dataName } else { set w $data(-parent).$dataName } # (re)create the dialog box if necessary # if {![winfo exists $w]} { Create $w TkFDialog } elseif {[winfo class $w] ne "TkFDialog"} { destroy $w Create $w TkFDialog } else { set data(dirMenuBtn) $w.contents.f1.menu set data(dirMenu) $w.contents.f1.menu.menu set data(upBtn) $w.contents.f1.up set data(icons) $w.contents.icons set data(ent) $w.contents.f2.ent set data(typeMenuLab) $w.contents.f2.lab2 set data(typeMenuBtn) $w.contents.f2.menu set data(typeMenu) $data(typeMenuBtn).m set data(okBtn) $w.contents.f2.ok set data(cancelBtn) $w.contents.f2.cancel set data(hiddenBtn) $w.contents.f2.hidden SetSelectMode $w $data(-multiple) } if {$showHiddenBtn} { $data(hiddenBtn) configure -state normal grid $data(hiddenBtn) } else { $data(hiddenBtn) configure -state disabled grid remove $data(hiddenBtn) } # Make sure subseqent uses of this dialog are independent [Bug 845189] unset -nocomplain data(extUsed) # Dialog boxes should be transient with respect to their parent, so that # they will always stay on top of their parent window. However, some # window managers will create the window as withdrawn if the parent window # is withdrawn or iconified. Combined with the grab we put on the window, # this can hang the entire application. Therefore we only make the dialog # transient if the parent is viewable. if {[winfo viewable [winfo toplevel $data(-parent)]]} { wm transient $w $data(-parent) } # Add traces on the selectPath variable # trace add variable data(selectPath) write \ [list ::tk::dialog::file::SetPath $w] $data(dirMenuBtn) configure \ -textvariable ::tk::dialog::file::${dataName}(selectPath) # Cleanup previous menu # $data(typeMenu) delete 0 end $data(typeMenuBtn) configure -state normal -text "" # Initialize the file types menu # if {[llength $data(-filetypes)]} { # Default type and name to first entry set initialtype [lindex $data(-filetypes) 0] set initialTypeName [lindex $initialtype 0] if {$data(-typevariable) ne ""} { upvar #0 $data(-typevariable) typeVariable if {[info exists typeVariable]} { set initialTypeName $typeVariable } } foreach type $data(-filetypes) { set title [lindex $type 0] set filter [lindex $type 1] $data(typeMenu) add command -label $title \ -command [list ::tk::dialog::file::SetFilter $w $type] # [string first] avoids glob-pattern char issues if {[string first ${initialTypeName} $title] == 0} { set initialtype $type } } SetFilter $w $initialtype $data(typeMenuBtn) configure -state normal $data(typeMenuLab) configure -state normal } else { set data(filter) "*" $data(typeMenuBtn) configure -state disabled -takefocus 0 $data(typeMenuLab) configure -state disabled } UpdateWhenIdle $w # Withdraw the window, then update all the geometry information # so we know how big it wants to be, then center the window in the # display (Motif style) and de-iconify it. ::tk::PlaceWindow $w widget $data(-parent) wm title $w $data(-title) # Set a grab and claim the focus too. ::tk::SetFocusGrab $w $data(ent) $data(ent) delete 0 end $data(ent) insert 0 $data(selectFile) $data(ent) selection range 0 end $data(ent) icursor end # Wait for the user to respond, then restore the focus and return the # index of the selected button. Restore the focus before deleting the # window, since otherwise the window manager may take the focus away so we # can't redirect it. Finally, restore any grab that was in effect. vwait ::tk::Priv(selectFilePath) ::tk::RestoreFocusGrab $w $data(ent) withdraw # Cleanup traces on selectPath variable # foreach trace [trace info variable data(selectPath)] { trace remove variable data(selectPath) {*}$trace } $data(dirMenuBtn) configure -textvariable {} return $Priv(selectFilePath) } # ::tk::dialog::file::Config -- # # Configures the TK filedialog according to the argument list # proc ::tk::dialog::file::Config {dataName type argList} { upvar ::tk::dialog::file::$dataName data set data(type) $type # 0: Delete all variable that were set on data(selectPath) the # last time the file dialog is used. The traces may cause troubles # if the dialog is now used with a different -parent option. foreach trace [trace info variable data(selectPath)] { trace remove variable data(selectPath) {*}$trace } # 1: the configuration specs # set specs { {-defaultextension "" "" ""} {-filetypes "" "" ""} {-initialdir "" "" ""} {-initialfile "" "" ""} {-parent "" "" "."} {-title "" "" ""} {-typevariable "" "" ""} } # The "-multiple" option is only available for the "open" file dialog. # if {$type eq "open"} { lappend specs {-multiple "" "" "0"} } # The "-confirmoverwrite" option is only for the "save" file dialog. # if {$type eq "save"} { lappend specs {-confirmoverwrite "" "" "1"} } # 2: default values depending on the type of the dialog # if {![info exists data(selectPath)]} { # first time the dialog has been popped up set data(selectPath) [pwd] set data(selectFile) "" } # 3: parse the arguments # tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList if {$data(-title) eq ""} { if {$type eq "open"} { set data(-title) [mc "Open"] } else { set data(-title) [mc "Save As"] } } # 4: set the default directory and selection according to the -initial # settings # if {$data(-initialdir) ne ""} { # Ensure that initialdir is an absolute path name. if {[file isdirectory $data(-initialdir)]} { set old [pwd] cd $data(-initialdir) set data(selectPath) [pwd] cd $old } else { set data(selectPath) [pwd] } } set data(selectFile) $data(-initialfile) # 5. Parse the -filetypes option # set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)] if {![winfo exists $data(-parent)]} { return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ "bad window path name \"$data(-parent)\"" } # Set -multiple to a one or zero value (not other boolean types like # "yes") so we can use it in tests more easily. if {$type eq "save"} { set data(-multiple) 0 } elseif {$data(-multiple)} { set data(-multiple) 1 } else { set data(-multiple) 0 } } proc ::tk::dialog::file::Create {w class} { set dataName [lindex [split $w .] end] upvar ::tk::dialog::file::$dataName data variable ::tk::Priv global tk_library toplevel $w -class $class if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog} pack [ttk::frame $w.contents] -expand 1 -fill both #set w $w.contents # f1: the frame with the directory option menu # set f1 [ttk::frame $w.contents.f1] bind [::tk::AmpWidget ttk::label $f1.lab -text [mc "&Directory:"]] \ <<AltUnderlined>> [list focus $f1.menu] set data(dirMenuBtn) $f1.menu if {![info exists data(selectPath)]} { set data(selectPath) "" } set data(dirMenu) $f1.menu.menu ttk::menubutton $f1.menu -menu $data(dirMenu) -direction flush \ -textvariable [format %s(selectPath) ::tk::dialog::file::$dataName] menu $data(dirMenu) -tearoff 0 $data(dirMenu) add radiobutton -label "" -variable \ [format %s(selectPath) ::tk::dialog::file::$dataName] set data(upBtn) [ttk::button $f1.up] $data(upBtn) configure -image $Priv(updirImage) $f1.menu configure -takefocus 1;# -highlightthickness 2 pack $data(upBtn) -side right -padx 4 -fill both pack $f1.lab -side left -padx 4 -fill both pack $f1.menu -expand yes -fill both -padx 4 # data(icons): the IconList that list the files and directories. # if {$class eq "TkFDialog"} { if { $data(-multiple) } { set fNameCaption [mc "File &names:"] } else { set fNameCaption [mc "File &name:"] } set fTypeCaption [mc "Files of &type:"] set iconListCommand [list ::tk::dialog::file::OkCmd $w] } else { set fNameCaption [mc "&Selection:"] set iconListCommand [list ::tk::dialog::file::chooseDir::DblClick $w] } set data(icons) [::tk::IconList $w.contents.icons \ -command $iconListCommand -multiple $data(-multiple)] bind $data(icons) <<ListboxSelect>> \ [list ::tk::dialog::file::ListBrowse $w] # f2: the frame with the OK button, cancel button, "file name" field # and file types field. # set f2 [ttk::frame $w.contents.f2] bind [::tk::AmpWidget ttk::label $f2.lab -text $fNameCaption -anchor e]\ <<AltUnderlined>> [list focus $f2.ent] # -pady 0 set data(ent) [ttk::entry $f2.ent] # The font to use for the icons. The default Canvas font on Unix is just # deviant. set ::tk::$w.contents.icons(font) [$data(ent) cget -font] # Make the file types bits only if this is a File Dialog if {$class eq "TkFDialog"} { set data(typeMenuLab) [::tk::AmpWidget ttk::label $f2.lab2 \ -text $fTypeCaption -anchor e] # -pady [$f2.lab cget -pady] set data(typeMenuBtn) [ttk::menubutton $f2.menu \ -menu $f2.menu.m] # -indicatoron 1 set data(typeMenu) [menu $data(typeMenuBtn).m -tearoff 0] # $data(typeMenuBtn) configure -takefocus 1 -relief raised -anchor w bind $data(typeMenuLab) <<AltUnderlined>> [list \ focus $data(typeMenuBtn)] } # The hidden button is displayed when ::tk::dialog::file::showHiddenBtn is # true. Create it disabled so the binding doesn't trigger if it isn't # shown. if {$class eq "TkFDialog"} { set text [mc "Show &Hidden Files and Directories"] } else { set text [mc "Show &Hidden Directories"] } set data(hiddenBtn) [::tk::AmpWidget ttk::checkbutton $f2.hidden \ -text $text -state disabled \ -variable ::tk::dialog::file::showHiddenVar \ -command [list ::tk::dialog::file::UpdateWhenIdle $w]] # -anchor w -padx 3 # the okBtn is created after the typeMenu so that the keyboard traversal # is in the right order, and add binding so that we find out when the # dialog is destroyed by the user (added here instead of to the overall # window so no confusion about how much <Destroy> gets called; exactly # once will do). [Bug 987169] set data(okBtn) [::tk::AmpWidget ttk::button $f2.ok \ -text [mc "&OK"] -default active];# -pady 3] bind $data(okBtn) <Destroy> [list ::tk::dialog::file::Destroyed $w] set data(cancelBtn) [::tk::AmpWidget ttk::button $f2.cancel \ -text [mc "&Cancel"] -default normal];# -pady 3] # grid the widgets in f2 # grid $f2.lab $f2.ent $data(okBtn) -padx 4 -pady 3 -sticky ew grid configure $f2.ent -padx 2 if {$class eq "TkFDialog"} { grid $data(typeMenuLab) $data(typeMenuBtn) $data(cancelBtn) \ -padx 4 -sticky ew grid configure $data(typeMenuBtn) -padx 0 grid $data(hiddenBtn) -columnspan 2 -padx 4 -sticky ew } else { grid $data(hiddenBtn) - $data(cancelBtn) -padx 4 -sticky ew } grid columnconfigure $f2 1 -weight 1 # Pack all the frames together. We are done with widget construction. # pack $f1 -side top -fill x -pady 4 pack $f2 -side bottom -pady 4 -fill x pack $data(icons) -expand yes -fill both -padx 4 -pady 1 # Set up the event handlers that are common to Directory and File Dialogs # wm protocol $w WM_DELETE_WINDOW [list ::tk::dialog::file::CancelCmd $w] $data(upBtn) configure -command [list ::tk::dialog::file::UpDirCmd $w] $data(cancelBtn) configure -command [list ::tk::dialog::file::CancelCmd $w] bind $w <KeyPress-Escape> [list $data(cancelBtn) invoke] bind $w <Alt-Key> [list tk::AltKeyInDialog $w %A] # Set up event handlers specific to File or Directory Dialogs # if {$class eq "TkFDialog"} { bind $data(ent) <Return> [list ::tk::dialog::file::ActivateEnt $w] $data(okBtn) configure -command [list ::tk::dialog::file::OkCmd $w] bind $w <Alt-t> [format { if {[%s cget -state] eq "normal"} { focus %s } } $data(typeMenuBtn) $data(typeMenuBtn)] } else { set okCmd [list ::tk::dialog::file::chooseDir::OkCmd $w] bind $data(ent) <Return> $okCmd $data(okBtn) configure -command $okCmd bind $w <Alt-s> [list focus $data(ent)] bind $w <Alt-o> [list $data(okBtn) invoke] } bind $w <Alt-h> [list $data(hiddenBtn) invoke] bind $data(ent) <Tab> [list ::tk::dialog::file::CompleteEnt $w] # Build the focus group for all the entries # ::tk::FocusGroup_Create $w ::tk::FocusGroup_BindIn $w $data(ent) [list \ ::tk::dialog::file::EntFocusIn $w] ::tk::FocusGroup_BindOut $w $data(ent) [list \ ::tk::dialog::file::EntFocusOut $w] } # ::tk::dialog::file::SetSelectMode -- # # Set the select mode of the dialog to single select or multi-select. # # Arguments: # w The dialog path. # multi 1 if the dialog is multi-select; 0 otherwise. # # Results: # None. proc ::tk::dialog::file::SetSelectMode {w multi} { set dataName __tk_filedialog upvar ::tk::dialog::file::$dataName data if { $multi } { set fNameCaption [mc "File &names:"] } else { set fNameCaption [mc "File &name:"] } set iconListCommand [list ::tk::dialog::file::OkCmd $w] ::tk::SetAmpText $w.contents.f2.lab $fNameCaption $data(icons) configure -multiple $multi -command $iconListCommand return } # ::tk::dialog::file::UpdateWhenIdle -- # # Creates an idle event handler which updates the dialog in idle time. # This is important because loading the directory may take a long time # and we don't want to load the same directory for multiple times due to # multiple concurrent events. # proc ::tk::dialog::file::UpdateWhenIdle {w} { upvar ::tk::dialog::file::[winfo name $w] data if {[info exists data(updateId)]} { return } set data(updateId) [after idle [list ::tk::dialog::file::Update $w]] } # ::tk::dialog::file::Update -- # # Loads the files and directories into the IconList widget. Also sets up # the directory option menu for quick access to parent directories. # proc ::tk::dialog::file::Update {w} { # This proc may be called within an idle handler. Make sure that the # window has not been destroyed before this proc is called if {![winfo exists $w]} { return } set class [winfo class $w] if {($class ne "TkFDialog") && ($class ne "TkChooseDir")} { return } set dataName [winfo name $w] upvar ::tk::dialog::file::$dataName data variable ::tk::Priv variable showHiddenVar global tk_library unset -nocomplain data(updateId) set folder $Priv(folderImage) set file $Priv(fileImage) set appPWD [pwd] if {[catch { cd $data(selectPath) }]} then { # We cannot change directory to $data(selectPath). $data(selectPath) # should have been checked before ::tk::dialog::file::Update is # called, so we normally won't come to here. Anyways, give an error # and abort action. tk_messageBox -type ok -parent $w -icon warning -message [mc \ "Cannot change to the directory \"%1\$s\".\nPermission denied."\ $data(selectPath)] cd $appPWD return } # Turn on the busy cursor. BUG?? We haven't disabled X events, though, # so the user may still click and cause havoc ... # set entCursor [$data(ent) cget -cursor] set dlgCursor [$w cget -cursor] $data(ent) configure -cursor watch $w configure -cursor watch update idletasks $data(icons) deleteall set showHidden $showHiddenVar # Make the dir list. Note that using an explicit [pwd] (instead of '.') is # better in some VFS cases. $data(icons) add $folder [GlobFiltered [pwd] d 1] if {$class eq "TkFDialog"} { # Make the file list if this is a File Dialog, selecting all but # 'd'irectory type files. # $data(icons) add $file [GlobFiltered [pwd] {f b c l p s}] } # Update the Directory: option menu # set list "" set dir "" foreach subdir [file split $data(selectPath)] { set dir [file join $dir $subdir] lappend list $dir } $data(dirMenu) delete 0 end set var [format %s(selectPath) ::tk::dialog::file::$dataName] foreach path $list { $data(dirMenu) add command -label $path -command [list set $var $path] } # Restore the PWD to the application's PWD # cd $appPWD if {$class eq "TkFDialog"} { # Restore the Open/Save Button if this is a File Dialog # if {$data(type) eq "open"} { ::tk::SetAmpText $data(okBtn) [mc "&Open"] } else { ::tk::SetAmpText $data(okBtn) [mc "&Save"] } } # turn off the busy cursor. # $data(ent) configure -cursor $entCursor $w configure -cursor $dlgCursor } # ::tk::dialog::file::SetPathSilently -- # # Sets data(selectPath) without invoking the trace procedure # proc ::tk::dialog::file::SetPathSilently {w path} { upvar ::tk::dialog::file::[winfo name $w] data set cb [list ::tk::dialog::file::SetPath $w] trace remove variable data(selectPath) write $cb set data(selectPath) $path trace add variable data(selectPath) write $cb } # This proc gets called whenever data(selectPath) is set # proc ::tk::dialog::file::SetPath {w name1 name2 op} { if {[winfo exists $w]} { upvar ::tk::dialog::file::[winfo name $w] data UpdateWhenIdle $w # On directory dialogs, we keep the entry in sync with the currentdir. if {[winfo class $w] eq "TkChooseDir"} { $data(ent) delete 0 end $data(ent) insert end $data(selectPath) } } } # This proc gets called whenever data(filter) is set # proc ::tk::dialog::file::SetFilter {w type} { upvar ::tk::dialog::file::[winfo name $w] data set data(filterType) $type set data(filter) [lindex $type 1] $data(typeMenuBtn) configure -text [lindex $type 0] ;#-indicatoron 1 # If we aren't using a default extension, use the one suppled by the # filter. if {![info exists data(extUsed)]} { if {[string length $data(-defaultextension)]} { set data(extUsed) 1 } else { set data(extUsed) 0 } } if {!$data(extUsed)} { # Get the first extension in the list that matches {^\*\.\w+$} and # remove all * from the filter. set index [lsearch -regexp $data(filter) {^\*\.\w+$}] if {$index >= 0} { set data(-defaultextension) \ [string trimleft [lindex $data(filter) $index] "*"] } else { # Couldn't find anything! Reset to a safe default... set data(-defaultextension) "" } } $data(icons) see 0 UpdateWhenIdle $w } # tk::dialog::file::ResolveFile -- # # Interpret the user's text input in a file selection dialog. Performs: # # (1) ~ substitution # (2) resolve all instances of . and .. # (3) check for non-existent files/directories # (4) check for chdir permissions # (5) conversion of environment variable references to their # contents (once only) # # Arguments: # context: the current directory you are in # text: the text entered by the user # defaultext: the default extension to add to files with no extension # expandEnv: whether to expand environment variables (yes by default) # # Return vaue: # [list $flag $directory $file] # # flag = OK : valid input # = PATTERN : valid directory/pattern # = PATH : the directory does not exist # = FILE : the directory exists by the file doesn't exist # = CHDIR : Cannot change to the directory # = ERROR : Invalid entry # # directory : valid only if flag = OK or PATTERN or FILE # file : valid only if flag = OK or PATTERN # # directory may not be the same as context, because text may contain a # subdirectory name # proc ::tk::dialog::file::ResolveFile {context text defaultext {expandEnv 1}} { set appPWD [pwd] set path [JoinFile $context $text] # If the file has no extension, append the default. Be careful not to do # this for directories, otherwise typing a dirname in the box will give # back "dirname.extension" instead of trying to change dir. if { ![file isdirectory $path] && ([file ext $path] eq "") && ![string match {$*} [file tail $path]] } then { set path "$path$defaultext" } # we want to strip any filtering/ext/blocking instructions # from the file name set aa [string first "\[" $path] if {$aa > 0} { set fn [string range $path 0 [expr $aa-1]] } else { set fn $path } if {[catch {file exists $fn}]} { # This "if" block can be safely removed if the following code stop # generating errors. # # file exists ~nonsuchuser # return [list ERROR $path ""] } if {[file exists $fn]} { if {[file isdirectory $path]} { if {[catch {cd $path}]} { return [list CHDIR $path ""] } set directory [pwd] set file "" set flag OK cd $appPWD } else { if {[catch {cd [file dirname $path]}]} { return [list CHDIR [file dirname $path] ""] } set directory [pwd] set file [file tail $path] set flag OK cd $appPWD } } else { set dirname [file dirname $path] if {[file exists $dirname]} { if {[catch {cd $dirname}]} { return [list CHDIR $dirname ""] } set directory [pwd] cd $appPWD set file [file tail $path] # It's nothing else, so check to see if it is an env-reference if {$expandEnv && [string match {$*} $file]} { set var [string range $file 1 end] if {[info exist ::env($var)]} { return [ResolveFile $context $::env($var) $defaultext 0] } } if {[regexp {[*?]} $file]} { set flag PATTERN } else { set flag FILE } } else { set directory $dirname set file [file tail $path] set flag PATH # It's nothing else, so check to see if it is an env-reference if {$expandEnv && [string match {$*} $file]} { set var [string range $file 1 end] if {[info exist ::env($var)]} { return [ResolveFile $context $::env($var) $defaultext 0] } } } } return [list $flag $directory $file] } # Gets called when the entry box gets keyboard focus. We clear the selection # from the icon list . This way the user can be certain that the input in the # entry box is the selection. # proc ::tk::dialog::file::EntFocusIn {w} { upvar ::tk::dialog::file::[winfo name $w] data if {[$data(ent) get] ne ""} { $data(ent) selection range 0 end $data(ent) icursor end } else { $data(ent) selection clear } if {[winfo class $w] eq "TkFDialog"} { # If this is a File Dialog, make sure the buttons are labeled right. if {$data(type) eq "open"} { ::tk::SetAmpText $data(okBtn) [mc "&Open"] } else { ::tk::SetAmpText $data(okBtn) [mc "&Save"] } } } proc ::tk::dialog::file::EntFocusOut {w} { upvar ::tk::dialog::file::[winfo name $w] data $data(ent) selection clear } # Gets called when user presses Return in the "File name" entry. # proc ::tk::dialog::file::ActivateEnt {w} { upvar ::tk::dialog::file::[winfo name $w] data set text [$data(ent) get] if {$data(-multiple)} { foreach t $text { VerifyFileName $w $t } } else { VerifyFileName $w $text } } # Verification procedure # proc ::tk::dialog::file::VerifyFileName {w filename} { upvar ::tk::dialog::file::[winfo name $w] data set list [ResolveFile $data(selectPath) $filename $data(-defaultextension)] foreach {flag path file} $list { break } switch -- $flag { OK { if {$file eq ""} { # user has entered an existing (sub)directory set data(selectPath) $path $data(ent) delete 0 end } else { SetPathSilently $w $path if {$data(-multiple)} { lappend data(selectFile) $file } else { set data(selectFile) $file } Done $w } } PATTERN { set data(selectPath) $path set data(filter) $file } FILE { if {$data(type) eq "open"} { tk_messageBox -icon warning -type ok -parent $w \ -message [mc "File \"%1\$s\" does not exist." \ [file join $path $file]] $data(ent) selection range 0 end $data(ent) icursor end } else { SetPathSilently $w $path if {$data(-multiple)} { lappend data(selectFile) $file } else { set data(selectFile) $file } Done $w } } PATH { tk_messageBox -icon warning -type ok -parent $w \ -message [mc "Directory \"%1\$s\" does not exist." $path] $data(ent) selection range 0 end $data(ent) icursor end } CHDIR { tk_messageBox -type ok -parent $w -icon warning -message \ [mc "Cannot change to the directory\ \"%1\$s\".\nPermission denied." $path] $data(ent) selection range 0 end $data(ent) icursor end } ERROR { tk_messageBox -type ok -parent $w -icon warning -message \ [mc "Invalid file name \"%1\$s\"." $path] $data(ent) selection range 0 end $data(ent) icursor end } } } # Gets called when user presses the Alt-s or Alt-o keys. # proc ::tk::dialog::file::InvokeBtn {w key} { upvar ::tk::dialog::file::[winfo name $w] data if {[$data(okBtn) cget -text] eq $key} { $data(okBtn) invoke } } # Gets called when user presses the "parent directory" button # proc ::tk::dialog::file::UpDirCmd {w} { upvar ::tk::dialog::file::[winfo name $w] data if {$data(selectPath) ne "/"} { set data(selectPath) [file dirname $data(selectPath)] } } # Join a file name to a path name. The "file join" command will break if the # filename begins with ~ # proc ::tk::dialog::file::JoinFile {path file} { if {[string match {~*} $file] && [file exists $path/$file]} { return [file join $path ./$file] } else { return [file join $path $file] } } # Gets called when user presses the "OK" button # proc ::tk::dialog::file::OkCmd {w} { upvar ::tk::dialog::file::[winfo name $w] data set filenames {} foreach item [$data(icons) selection get] { lappend filenames [$data(icons) get $item] } if { ([llength $filenames] && !$data(-multiple)) || ($data(-multiple) && ([llength $filenames] == 1)) } then { set filename [lindex $filenames 0] set file [JoinFile $data(selectPath) $filename] if {[file isdirectory $file]} { ListInvoke $w [list $filename] return } } ActivateEnt $w } # Gets called when user presses the "Cancel" button # proc ::tk::dialog::file::CancelCmd {w} { upvar ::tk::dialog::file::[winfo name $w] data variable ::tk::Priv bind $data(okBtn) <Destroy> {} set Priv(selectFilePath) "" } # Gets called when user destroys the dialog directly [Bug 987169] # proc ::tk::dialog::file::Destroyed {w} { upvar ::tk::dialog::file::[winfo name $w] data variable ::tk::Priv set Priv(selectFilePath) "" } # Gets called when user browses the IconList widget (dragging mouse, arrow # keys, etc) # proc ::tk::dialog::file::ListBrowse {w} { upvar ::tk::dialog::file::[winfo name $w] data set text {} foreach item [$data(icons) selection get] { lappend text [$data(icons) get $item] } if {[llength $text] == 0} { return } if {$data(-multiple)} { set newtext {} foreach file $text { set fullfile [JoinFile $data(selectPath) $file] if { ![file isdirectory $fullfile] } { lappend newtext $file } } set text $newtext set isDir 0 } else { set text [lindex $text 0] set file [JoinFile $data(selectPath) $text] set isDir [file isdirectory $file] } if {!$isDir} { $data(ent) delete 0 end $data(ent) insert 0 $text if {[winfo class $w] eq "TkFDialog"} { if {$data(type) eq "open"} { ::tk::SetAmpText $data(okBtn) [mc "&Open"] } else { ::tk::SetAmpText $data(okBtn) [mc "&Save"] } } } elseif {[winfo class $w] eq "TkFDialog"} { ::tk::SetAmpText $data(okBtn) [mc "&Open"] } } # Gets called when user invokes the IconList widget (double-click, Return key, # etc) # proc ::tk::dialog::file::ListInvoke {w filenames} { upvar ::tk::dialog::file::[winfo name $w] data if {[llength $filenames] == 0} { return } set file [JoinFile $data(selectPath) [lindex $filenames 0]] set class [winfo class $w] if {$class eq "TkChooseDir" || [file isdirectory $file]} { set appPWD [pwd] if {[catch {cd $file}]} { tk_messageBox -type ok -parent $w -icon warning -message \ [mc "Cannot change to the directory \"%1\$s\".\nPermission denied." $file] } else { cd $appPWD set data(selectPath) $file } } else { if {$data(-multiple)} { set data(selectFile) $filenames } else { set data(selectFile) $file } Done $w } } # ::tk::dialog::file::Done -- # # Gets called when user has input a valid filename. Pops up a dialog # box to confirm selection when necessary. Sets the # tk::Priv(selectFilePath) variable, which will break the "vwait" loop # in ::tk::dialog::file:: and return the selected filename to the script # that calls tk_getOpenFile or tk_getSaveFile # proc ::tk::dialog::file::Done {w {selectFilePath ""}} { upvar ::tk::dialog::file::[winfo name $w] data variable ::tk::Priv if {$selectFilePath eq ""} { if {$data(-multiple)} { set selectFilePath {} foreach f $data(selectFile) { lappend selectFilePath [JoinFile $data(selectPath) $f] } } else { set selectFilePath [JoinFile $data(selectPath) $data(selectFile)] } set Priv(selectFile) $data(selectFile) set Priv(selectPath) $data(selectPath) if {($data(type) eq "save") && $data(-confirmoverwrite) && [file exists $selectFilePath]} { set reply [tk_messageBox -icon warning -type yesno -parent $w \ -message [mc "File \"%1\$s\" already exists.\nDo you want\ to overwrite it?" $selectFilePath]] if {$reply eq "no"} { return } } if { [info exists data(-typevariable)] && $data(-typevariable) ne "" && [info exists data(-filetypes)] && [llength $data(-filetypes)] && [info exists data(filterType)] && $data(filterType) ne "" } then { upvar #0 $data(-typevariable) typeVariable set typeVariable [lindex $data(filterType) 0] } } bind $data(okBtn) <Destroy> {} set Priv(selectFilePath) $selectFilePath } # ::tk::dialog::file::GlobFiltered -- # # Gets called to do globbing, returning the results and filtering them # according to the current filter (and removing the entries for '.' and # '..' which are never shown). Deals with evil cases such as where the # user is supplying a filter which is an invalid list or where it has an # unbalanced brace. The resulting list will be dictionary sorted. # # Arguments: # dir Which directory to search # type List of filetypes to look for ('d' or 'f b c l p s') # overrideFilter Whether to ignore the filter for this search. # # NB: Assumes that the caller has mapped the state variable to 'data'. # proc ::tk::dialog::file::GlobFiltered {dir type {overrideFilter 0}} { variable showHiddenVar upvar 1 data(filter) filter if {$filter eq "*" || $overrideFilter} { set patterns [list *] if {$showHiddenVar} { lappend patterns .* } } elseif {[string is list $filter]} { set patterns $filter } else { # Invalid list; assume we can use non-whitespace sequences as words set patterns [regexp -inline -all {\S+} $filter] } set opts [list -tails -directory $dir -type $type -nocomplain] set result {} catch { # We have a catch because we might have a really bad pattern (e.g., # with an unbalanced brace); even [glob -nocomplain] doesn't like it. # Using a catch ensures that it just means we match nothing instead of # throwing a nasty error at the user... foreach f [glob {*}$opts -- {*}$patterns] { if {$f eq "." || $f eq ".."} { continue } lappend result $f } } return [lsort -dictionary -unique $result] } proc ::tk::dialog::file::CompleteEnt {w} { variable showHiddenVar upvar ::tk::dialog::file::[winfo name $w] data set f [$data(ent) get] if {$data(-multiple)} { if {![string is list $f] || [llength $f] != 1} { return -code break } set f [lindex $f 0] } # Get list of matching filenames and dirnames set files [if {[winfo class $w] eq "TkFDialog"} { GlobFiltered $data(selectPath) {f b c l p s} }] set dirs2 {} foreach d [GlobFiltered $data(selectPath) d] {lappend dirs2 $d/} set targets [concat \ [lsearch -glob -all -inline $files $f*] \ [lsearch -glob -all -inline $dirs2 $f*]] if {[llength $targets] == 1} { # We have a winner! set f [lindex $targets 0] } elseif {$f in $targets || [llength $targets] == 0} { if {[string length $f] > 0} { bell } return } elseif {[llength $targets] > 1} { # Multiple possibles if {[string length $f] == 0} { return } set t0 [lindex $targets 0] for {set len [string length $t0]} {$len>0} {} { set allmatch 1 foreach s $targets { if {![string equal -length $len $s $t0]} { set allmatch 0 break } } incr len -1 if {$allmatch} break } set f [string range $t0 0 $len] } if {$data(-multiple)} { set f [list $f] } $data(ent) delete 0 end $data(ent) insert 0 $f return -code break } ��������������������������saods9/ds9/library/url.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000011451 12514261633 016042� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc OpenURLFits {{layer {}} {mode {}}} { global fitsurl set url $fitsurl if {[EntryDialog [msgcat::mc {URL}] [msgcat::mc {Enter URL}] 80 url]} { StartLoad LoadURLFits $url $layer $mode FinishLoad set fitsurl $url } } proc LoadURLFits {url layer mode} { if {[string length $url] == 0} { return } ParseURL $url r switch -- $r(scheme) { ftp {LoadURLFitsFTP $r(authority) $r(path) $layer $mode} file {LoadURLFitsFile $r(path) $layer $mode} http - default {LoadURLFitsHTTP $url $layer $mode} } } proc LoadURLFitsFTP {host path layer mode} { global loadParam global ds9 global debug set ftp [ftp::Open $host "ftp" "-ds9@" -mode passive] if {$ftp > -1} { set fn "$ds9(tmpdir)/[file tail $path]" set ftp::VERBOSE $debug(tcl,ftp) set "ftp::ftp${ftp}(Output)" FTPLog ftp::Type $ftp binary if {[ftp::Get $ftp $path $fn]} { LoadURLFitsFile $fn $layer $mode } ftp::Close $ftp if {[file exists $fn]} { catch {file delete -force $fn} } } } proc LoadURLFitsFile {fn layer mode} { global loadParam # alloc it because we can't assume it will last set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $loadParam(file,name) set loadParam(load,layer) $layer ProcessLoad } proc LoadURLFitsHTTP {url layer mode} { global ds9 global ihttp ParseURL $url r set fn "$ds9(tmpdir)/[file tail $r(path)]" set code 200 set meta {} set mime "application/fits" set encoding {} set ch [open $fn w] set token [http::geturl $url \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -channel $ch \ -binary 1 \ -headers "[ProxyHTTP]"] # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} catch {close $ch} upvar #0 $token t # Code set code [http::ncode $token] # Meta set meta $t(meta) # Mime-type # we want to strip and extra info after ';' regexp -nocase {([^;])*} $t(type) mime # Content-Encoding foreach {name value} $meta { if {[regexp -nocase ^content-encoding $name]} { switch -- [string tolower $value] { gzip - x-gzip {set encoding gzip} compress - bzip2 {set encoding bzip2} Z {set encoding compress} pack - z {set encoding pack} default {} } } } HTTPLog $token # Result? switch -- $code { 200 {} default { Error "HTTP [msgcat::mc {Error}] $code" return } } http::cleanup $token global debug if {$debug(tcl,hv)} { puts stderr "Load HTTP: fn $fn : code $code : meta $meta : mime $mime : encoding $encoding" } # NOTE: error notices may come as text/html switch -- [string tolower $mime] { "text/plain" {} "image/fits" - "application/fits" {} "application/fits-image" - "application/fits-table" - "application/fits-group" {} "image/x-fits" - "binary/x-fits" - "application/x-fits" {} "image/x-gfits" - "binary/x-gfits" - "image/gz-fits" - "display/gz-fits" {set encoding gzip} "image/bz2-fits" - "display/bz2-fits" {set encoding bzip2} "image/x-cfits" - "binary/x-cfits" {set encoding compress} "image/x-zfits" - "binary/x-zfits" {set encoding pack} default { Error "[msgcat::mc {File not Found or Unable to load FITS data MIME type}] $mime" return } } # alloc it because we are going to delete it after load StartLoad global loadParam set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) allocgz set loadParam(file,name) $fn set loadParam(file,fn) $loadParam(file,name) set loadParam(load,layer) $layer # may have to convert the file, based on content-encoding switch -- "$encoding" { bzip2 { catch {set ch [open "| bunzip2 < $fn " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } compress { catch {set ch [open "| uncompress < $fn " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } pack { catch {set ch [open "| pcat $fn " r]} set loadParam(load,type) channel set loadParam(channel,name) $ch } } ProcessLoad FinishLoad if {[file exists $fn]} { catch {file delete -force $fn} } } proc ProcessURLFitsCmd {varname iname} { upvar $varname var upvar $iname i set layer {} set mode {} switch -- [string tolower [lindex $var $i]] { new { incr i CreateFrame } mask { incr i set layer mask } slice { incr i set mode slice } } LoadURLFits [lindex $var $i] $layer $mode } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/util.tcl�������������������������������������������������������������������������000644 �000765 �000000 �00000073224 12600065137 016220� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc CurrentDef {} { global current global pcurrent global ds9 set current(frame) {} set current(ext) {} set current(colorbar) {} set current(cursor) {} set current(rgb) red set current(display) single set current(mode) none set current(zoom) { 1 1 } set current(rotate) 0 set current(orient) none set current(align) 0 set pcurrent(display) $current(display) set pcurrent(mode) $current(mode) set pcurrent(zoom) $current(zoom) set pcurrent(rotate) $current(rotate) set pcurrent(orient) $current(orient) set pcurrent(align) $current(align) } proc CursorDef {} { global icursor set icursor(save) {} set icursor(count) 0 set icursor(id) 0 set icursor(timer) 0 set icursor(timer,abort) 0 } proc UpdateDS9Static {} { # This routine is only called when an frame is added or deleted # we only change menu items which require at least one frame global debug if {$debug(tcl,update)} { puts stderr "UpdateDS9Static begin..." } UpdateFileMenuStatic UpdateFrameMenuStatic UpdateZoomMenuStatic UpdateAnalysisMenuStatic if {$debug(tcl,update)} { puts stderr "UpdateDS9Static end...\n" } } proc UpdateDS9 {} { global ds9 global current # This routine is called when ever there is a state change within ds9 # for example, a image is loaded, current(frame) is changed, etc global debug if {$debug(tcl,update)} { puts stderr "UpdateDS9 begin..." } UpdateFileMenu UpdateEditMenu UpdateFrameMenu UpdateBinMenu UpdateZoomMenu UpdateScaleMenu UpdateColorMenu UpdateRegionMenu # wcs(system) set here UpdateWCSMenu UpdateAnalysisMenu UpdateTaskMenu UpdateMaskMenu UpdateContourMenu UpdateGridMenu UpdateBlockMenu UpdateSmoothMenu UpdateCubeMenu UpdateRGBMenu UpdatePanZoomMenu UpdateBinDialog UpdatePanZoomDialog UpdateCrosshairDialog UpdateCropDialog UpdateScaleDialog UpdateColorDialog UpdateWCSDialog UpdateGroupDialog UpdateCATDialog UpdateCentroidDialog UpdateCubeDialog UpdateRGBDialog Update3DDialog UpdateContourDialog UpdateGridDialog UpdateGraphXAxis $current(frame) UpdateGraphYAxis $current(frame) RefreshInfoBox $current(frame) UpdateColormapLevel if {$debug(tcl,update)} { puts stderr "UpdateDS9 end...\n" } } # changes to other dialogs can affect the infobox and pixeltable proc UpdateMain {} { global current global debug if {$debug(tcl,update)} { puts stderr "UpdateMain" } RefreshInfoBox $current(frame) UpdateColormapLevel switch -- $current(mode) { crosshair - analysis { if {$current(frame) != {}} { set coord [$current(frame) get crosshair canvas] set x [lindex $coord 0] set y [lindex $coord 1] # just in case we hae a mosaic UpdateColormapLevelMosaic $current(frame) $x $y canvas UpdatePixelTableDialog $current(frame) $x $y canvas UpdateGraph $current(frame) $x $y canvas } } none - pointer - region - catalog - colorbar - pan - zoom - rotate - crop - examine - iexam {} } } proc ProcessSend {proc id sock fn ext rr} { if {$sock != {}} { # not implemented } elseif {$fn != {}} { append fn $ext set ch [open $fn w] puts $ch $rr close $ch $proc $id {} $fn } else { $proc $id $rr } } proc Toplevel {w mb style title proc} { global ds9 toplevel $w switch $ds9(wm) { x11 {} aqua { switch $style { 6 {::tk::unsupported::MacWindowStyle style $w document "closeBox collapseBox"} 7 {::tk::unsupported::MacWindowStyle style $w document "closeBox fullZoom collapseBox resizable"} } } win32 {} } wm title $w $title wm iconname $w $title wm group $w $ds9(top) wm protocol $w WM_DELETE_WINDOW $proc # we need this first, before the configure command menu $mb AppleMenu $mb $w configure -menu $mb global pds9 if {$pds9(dialog,center)} { DialogCenter $w } } proc GetFileURL {url fname} { upvar $fname fn ParseURL $url rr switch -- $rr(scheme) { ftp {GetFileFTP $rr(authority) $rr(path) $fn} file {set fn $rr(path)} http - default {GetFileHTTP $url $fn} } } proc GetFileFTP {host path fn} { global debug set ftp [ftp::Open $host {ftp} {-ds9@} -mode passive] if {$ftp > -1} { set ftp::VERBOSE $debug(tcl,ftp) set "ftp::ftp${ftp}(Output)" FTPLog ftp::Type $ftp binary ftp::Get $ftp $path $fn ftp::Close $ftp # clear error from tcllib ftp global errorInfo set errorInfo {} } } proc GetFileHTTP {url fn} { global ihttp set ch [open $fn w] if {[catch {http::geturl $url \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -channel $ch \ -binary 1 \ -headers "[ProxyHTTP]"} token]} { close $ch return } # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} close $ch if {[info exists token]} { HTTPLog $token http::cleanup $token } } proc SourceInitFile {ext} { global ds9 global env foreach ff {{.} {}} { set fn $ff$ds9(app)$ext foreach dir [list {.} [GetEnvHome] {/usr/local/lib} {/opt/local/lib}] { set ff [file join $dir $fn] if {[file exist $ff]} { # can't make this a debug command line option # prefs set before options parsed if {[catch {source $ff}]} { Error "[msgcat::mc {An error has occurred while executing}] $ff. [msgcat::mc {DS9 will complete the initialization process}]" return 0 } return 1 } } } return 0 } proc DeleteInitFile {ext} { global ds9 global env foreach ff {{.} {}} { set fn $ff$ds9(app)$ext foreach dir [list {.} [GetEnvHome]] { set ff [file join $dir $fn] if {[file exist $ff]} { catch {file delete -force $ff} return } } } } proc LanguageToName {which} { switch $which { locale {return {Locale}} cs {return "\u010Cesky"} da {return {Dansk}} de {return {Deutsch}} en {return {English}} es {return {Espaol}} fr {return {Franais}} ja {return [encoding convertfrom euc-jp "\xc6\xfc\xcb\xdc\xb8\xec"]} pt {return {Portugus}} zh {return [encoding convertfrom big5 "\xA4\xA4\xA4\xE5"]} } } proc SetLanguage {ll} { global ds9 global pds9 set pds9(language,name) [LanguageToName $ll] set x 0 msgcat::mclocale $ll msgcat::mcload [file join $::tk_library msgs] # we need to find if we support this language if {[msgcat::mcload [file join $ds9(root) msgs]]} { incr x } if {$pds9(language,dir) != {}} { if {[msgcat::mcload $pds9(language,dir)]} { incr x } } # if english, always return found if {[string equal [string range $ll 0 1] {en}]} { incr x } if {$x} { return 1 } else { return 0 } } proc GetEnvHome {} { global env # return current directory by default set home {} global tcl_platform switch $tcl_platform(platform) { unix { if {[info exists env(HOME)]} { set home $env(HOME) } } windows { if {[info exists env(HOME)]} { set hh [file normalize [file nativename $env(HOME)]] if {[file isdirectory $hh]} { set home $hh } } # this is just a backup, the above should always work if {$home == {} && [info exists env(HOMEDRIVE)] && [info exists env(HOMEPATH)]} { set home "$env(HOMEDRIVE)$env(HOMEPATH)" } } } # if there is a problem, just return current directory if {![file isdirectory $home]} { set home {.} } return $home } proc InitTempDir {} { global ds9 global env # check environment vars first # windows is very picky as to file name format if {[info exists env(TEMP)]} { set ds9(tmpdir) [file normalize [file nativename $env(TEMP)]] } elseif {[info exists env(TMP)]} { set ds9(tmpdir) [file normalize [file nativename $env(TMP)]] } # nothing so far, go with defaults if {$ds9(tmpdir) == {}} { global tcl_platform switch $tcl_platform(platform) { unix {set ds9(tmpdir) "/tmp"} windows {set ds9(tmpdir) "C:/WINDOWS/Temp"} } } # see if it is valid, else current directory if {![file isdirectory $ds9(tmpdir)]} { set ds9(tmpdir) {.} } } proc tmpnam {base ext} { global ds9 for {set ii 0} {$ii<10} {incr ii} { set fn "$ds9(tmpdir)/$base[clock clicks]$ext" if {![file exists $fn]} { return $fn } } # give up return $ds9(tmpdir)/$base$ext } # which compiler do we use for filtering? proc InitFilterCompiler {} { global ds9 global env global argv0 # if the user did not explicitly specify one ... if {![info exists env(FILTER_CC)]} { switch -- $ds9(wm) { x11 {} aqua { if {![file exists /usr/bin/gcc]} { # pcc is hardwired to be installed in /tmp set pccroot "/tmp/pcc" set pcc "$pccroot/bin/pcc" set tar "pcc-i386-snowleopard.tar.gz" if {[file readable "$ds9(root)/$tar"]} { exec cp "$ds9(root)/$tar" "/tmp/$tar" exec tar xfPz "/tmp/$tar" -C /tmp exec rm -f "/tmp/$tar" } if {[file exists $pcc]} { set env(FILTER_CC) $pcc set env(FILTER_CFLAGS) "-isystem $pccroot/lib/pcc" set env(PATH) "$pccroot/bin:$env(PATH)" } } } win32 { set tcc [file join [file dirname $argv0] tcc/tcc.exe] if {[file exists $tcc]} { set env(FILTER_CC) [file nativename [file attributes [file normalize $tcc] -shortname]] set env(FILTER_TMPDIR) [file nativename [file attributes [file normalize $ds9(tmpdir)] -shortname]] } } } } } proc ToYesNo {value} { if {$value == 1} { return "yes\n" } else { return "no\n" } } proc FromYesNo {value} { set v [string tolower $value] if {$v == "no" || $v == "false" || $v == "off" || $v == 0} { return 0 } else { return 1 } } proc ProcessRealizeDS9 {} { global ds9 global current # this can really slow down scripts so use ds9(last) # to remember last update if {$ds9(last) != $current(frame)} { RealizeDS9 set ds9(last) $current(frame) } } proc RealizeDS9 {{preserve 0}} { # this has to come first, to realize the canvas global debug if {$debug(tcl,idletasks)} { puts stderr "RealizeDS9" } # update all frames global ds9 foreach ff $ds9(frames) { if {$preserve} { $ff 3d preserve } $ff update now } # idletasks fails for windows. we need to process all events to make # sure all windows are realized # update idletasks update } proc Sex2H {str} { scan $str "%d:%d:%f" h m s return [expr $h+($m/60.)+($s/(60.*60.))] } proc Sex2Hs {str} { scan $str "%d %d %f" h m s return [expr $h+($m/60.)+($s/(60.*60.))] } proc Sex2D {str} { set sign 1 set degree 0 set min 0 set sec 0 scan $str "%d:%f:%f" degree min sec if {$degree != 0} { if {$degree < 0} { set sign -1 } } else { if {[string range $str 0 0] == {-}} { set sign -1 } } return [expr $sign * (abs($degree)+($min/60.)+($sec/(60.*60.)))] } proc SetCursor {cursor} { global ds9 global iis global current # if init phase, don't change cursor if {$ds9(init)} { return } # if iis cursor mode, don't change cursor if {$iis(state)} { return } if {($current(cursor) != $cursor)} { set current(cursor) $cursor if {$cursor != {}} { $ds9(canvas) configure -cursor $cursor } else { $ds9(canvas) configure -cursor {} } } } proc SetWatchCursor {} { global ds9 global icursor # if init phase, don't change cursor if {$ds9(init)} { return } # don't change cursor/update if {!$ds9(idletasks)} { return } global debug if {$debug(tcl,watch)} { puts stderr "SetWatchCursor Start $icursor(count)" } if {$icursor(count) == 0} { set icursor(save) [$ds9(canvas) cget -cursor] $ds9(canvas) configure -cursor {} $ds9(main) configure -cursor watch global debug if {$debug(tcl,idletasks)} { puts stderr "SetWatchCursor" } update idletasks } incr icursor(count) if {$debug(tcl,watch)} { puts stderr "SetWatchCursor End $icursor(count)" } } proc UnsetWatchCursor {} { global ds9 global icursor # if init phase, don't change cursor if {$ds9(init)} { return } # don't change cursor/update if {!$ds9(idletasks)} { return } global debug if {$debug(tcl,watch)} { puts stderr "UnsetWatchCursor Start $icursor(count)" } if {$icursor(count)>0} { incr icursor(count) -1 } if {$icursor(count) == 0} { $ds9(main) configure -cursor {} $ds9(canvas) configure -cursor $icursor(save) global debug if {$debug(tcl,idletasks)} { puts stderr "UnsetWatchCursor" } update idletasks } if {$debug(tcl,watch)} { puts stderr "UnsetWatchCursor End $icursor(count)" } } proc CursorTimer {} { global ds9 global icursor switch -- $icursor(timer) { 0 { set icursor(timer,abort) 0 set icursor(timer) 0 set icursor(id) 0 $ds9(canvas) configure -cursor {} } 1 { $ds9(canvas) configure -cursor circle set icursor(timer) 2 set icursor(id) [after 1000 CursorTimer] } 2 { $ds9(canvas) configure -cursor dot set icursor(timer) 1 set icursor(id) [after 1000 CursorTimer] } } } proc AboutBox {} { global help global ds9 global ed set w {.abt} set ed(ok) 0 DialogCreate $w [msgcat::mc {About SAOImage DS9}] ed(ok) # Param set f [frame $w.param -background white] canvas $f.c -background white -height 450 -width 500 pack $f.c -fill both -expand true # can't use -file for zvfs # set ed(sun) [image create photo -format gif -file $ds9(root)/doc/sun.gif] set ch [open $ds9(root)/doc/sun.gif r] fconfigure $ch -translation binary -encoding binary set dd [read $ch] close $ch unset ch set ed(sun) [image create photo -format gif -data "$dd"] unset dd $f.c create image 0 0 -image $ed(sun) -anchor nw $f.c create text 120 22 -text $help(about) -anchor nw -width 350 # Buttons set f [ttk::frame $w.buttons] ttk::button $f.ok -text [msgcat::mc {OK}] -command {set ed(ok) 1} \ -default active pack $f.ok -padx 2 -pady 2 bind $w <Return> {set ed(ok) 1} # Fini ttk::separator $w.sep -orient horizontal pack $w.buttons $w.sep -side bottom -fill x pack $w.param -side top -fill both -expand true DialogCenter $w DialogWait $w ed(ok) DialogDismiss $w image delete $ed(sun) unset ed } proc QuitDS9 {} { global ds9 # shutdown SAMP global samp if {[info exists samp]} { catch {SAMPDisconnect} } # close IIS ports catch {IISClose} # close out XPA global xpa if {[info exists xpa]} { catch {xpafree $xpa} } # close all HV windows, they may have tmp files global ihv foreach hh $ihv(windows) { if {[winfo exists $hh]} { catch {HVDestroy $hh} } } focus {} exit } proc OpenSource {} { set filename [OpenFileDialog tclfbox] if {$filename != {}} { uplevel #0 "source \{$filename\}" } } proc OpenConsole {} { if {[winfo exists ".tkcon"]} { tkcon show } else { set ::tkcon::OPT(exec) {} set ::tkcon::OPT(font) [font actual TkFixedFont] tkcon::Init } } proc ToggleBindEvents {} { global ds9 if {$ds9(freeze)} { set ds9(freeze) 0 BindEventsCanvas BindEventsPanner } else { set ds9(freeze) 1 UnBindEventsCanvas UnBindEventsPanner } } proc ChangeMode {} { global ds9 global current bind $ds9(canvas) <Button-1> {} bind $ds9(canvas) <B1-Motion> {} bind $ds9(canvas) <ButtonRelease-1> {} foreach ff $ds9(frames) { $ff crosshair off $ff analysis reset $ff marker catalog unselect all $ff marker catalog unhighlite all $ff marker unselect all $ff marker unhighlite all } UpdateRegionMenu RefreshInfoBox $current(frame) PixelTableClearDialog ClearGraphData switch -- $current(mode) { none - pointer - region - catalog {SetCursor {}} crosshair { foreach ff $ds9(frames) { $ff crosshair on } SetCursor crosshair } colorbar {SetCursor center_ptr} zoom {SetCursor sizing} pan {SetCursor fleur} rotate {SetCursor exchange} crop {SetCursor {}} analysis { foreach ff $ds9(frames) { $ff crosshair on } SetCursor crosshair IMEChangeShape } examine {SetCursor target} iexam {} } } # Font procs proc InitDefaultFont {} { global ds9 global pds9 switch $ds9(wm) { x11 { eval font configure TkDefaultFont [font actual DefaultFont] eval font configure TkMenuFont [font actual DefaultMenuFont] eval font configure TkTextFont [font actual DefaultTextFont] set pds9(font) helvetica set pds9(font,size) \ [PixelsToPoints [font configure TkDefaultFont -size]] set pds9(font,weight) [font configure TkDefaultFont -weight] set pds9(font,slant) [font configure TkDefaultFont -slant] } aqua { # can't change Aqua font defs, see font configure doc set pds9(font) helvetica set pds9(font,size) 13 set pds9(font,weight) normal set pds9(font,slant) roman } win32 {} } } proc PrefsDefaultFont {} { global ds9 global pds9 switch $ds9(wm) { x11 { font configure TkDefaultFont -family $ds9($pds9(font)) \ -size $pds9(font,size) -weight $pds9(font,weight) \ -slant $pds9(font,slant) font configure TkMenuFont -family $ds9($pds9(font)) \ -size $pds9(font,size) -weight $pds9(font,weight) \ -slant $pds9(font,slant) font configure TkTextFont -family $ds9($pds9(font)) \ -size $pds9(font,size) -weight $pds9(font,weight) \ -slant $pds9(font,slant) } aqua { # can't change Aqua font defs, see font configure doc } win32 {} } UpdateScaleDialogFont UpdateGraphFont } proc InitDefaultTextFont {} { global pds9 set pds9(text,font) courier set pds9(text,font,size) [PixelsToPoints [font actual TkFixedFont -size]] set pds9(text,font,weight) [font actual TkFixedFont -weight] set pds9(text,font,slant) [font actual TkFixedFont -slant] } proc PixelsToPoints {size} { if {$size < 0} { return [expr int(abs($size)/[tk scaling]+.5)] } else { return $size } } proc PrefsBgColor {} { global ds9 global pds9 foreach ff $ds9(frames) { $ff bg color $pds9(bg) } } proc PrefsNanColor {} { global ds9 global pds9 foreach ff $ds9(frames) { $ff nan color $pds9(nan) } } proc PrefsThreads {} { global ds9 global pds9 foreach ff $ds9(frames) { $ff threads $pds9(threads) } return true } proc PrefsIRAFAlign {} { global ds9 global pds9 foreach ff $ds9(frames) { $ff iraf align $pds9(iraf) } } proc DisplayLog {item} { SimpleTextDialog ftptxt [msgcat::mc {Message Log}] 80 40 append bottom $item } proc ParseURL {url varname} { upvar $varname r set r(scheme) {} set r(authority) {} set r(path) {} set r(query) {} set r(fragment) {} set exp {^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?} if {![regexp -nocase $exp $url x a r(scheme) c r(authority) r(path) f r(query) h r(fragment)]} { return 0 } # check for windows disk drives global tcl_platform switch $tcl_platform(platform) { unix { switch -- $r(scheme) { ftp { # strip any username/passwd set id [string first {@} $r(authority)] if { $id != -1} { set r(authority) [string range $r(authority) [expr $id+1] end] } } } } windows { switch -- $r(scheme) { {} - ftp - http - file { if {[regexp {/([A-Z]:)(/.*)} $r(path) a b c]} { set r(path) "$b$c" } } default { set r(path) "$r(scheme):$r(path)" set r(scheme) {} } } } } return 1 } proc BreakUp {str} { set r {} set l [string length $str] for {set i 0} {$i < $l} {incr i} { set c [string index $str $i] append r $c if {$c=="\}"} { append r "\n" } } return $r } proc InPath {which} { global env global tcl_platform switch $tcl_platform(platform) { unix { set target ${which} set paths [split $env(PATH) :] } windows { set target ${which}.exe set paths [split $env(PATH) \;] } } foreach p $paths { if {[file executable [file join $p $target]]} { return 1 } } return 0 } proc FTPLog {s msg state} { global debug if {$debug(tcl,ftp)} { DisplayLog "$s $msg $state\n" } } proc HTTPLog {token} { global debug if {$debug(tcl,http)} { upvar #0 $token t DisplayLog "url: $t(url)\n" DisplayLog "http: $t(http)\n" DisplayLog "type: $t(type)\n" DisplayLog "currentsize: $t(currentsize)\n" DisplayLog "totalsize: $t(totalsize)\n" DisplayLog "status: $t(status)\n" if {[info exists t(error)]} { DisplayLog "error: $t(error)\n" } DisplayLog "meta: [BreakUp $t(meta)]\n" } } proc ConfigHTTP {} { global phttp # set the User-Agent http::config -useragent ds9 # set the proxy if requested if {$phttp(proxy)} { http::config -proxyhost $phttp(proxy,host) -proxyport $phttp(proxy,port) } } proc ProxyHTTP {} { global phttp set auth {} if {$phttp(proxy) && $phttp(auth)} { set auth [list "Proxy-Authorization" [concat "Basic" [base64::encode $phttp(auth,user):$phttp(auth,passwd)]]] } return $auth } proc ValidFits {filename} { if {$filename == {}} { return 0 } # determine if its a fits file # first, strip the filename if {![regexp -nocase {(.*)(\[.*\])} $filename foo base ext]} { set base $filename set ext {} } set fd [open $base] if {$fd != {}} { set l [read $fd 9] close $fd } if {$l == "SIMPLE ="} { return 1 } else { return 0 } } proc FixSpec {sysname skyname formatname defsys defsky defformat} { upvar $sysname sys upvar $skyname sky upvar $formatname format set rr 0 switch -- $sys { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {incr rr} fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic { set format $sky set sky $sys set sys wcs } default { set format $sky set sky $sys set sys $defsys } } switch -- $sky { fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic {incr rr} default { set format $sky set sky $defsky } } switch -- $format { degrees - arcmin - arcsec - sexagesimal {incr rr} default { set format $defformat } } return $rr } proc FixSpecSystem {sysname defsys} { upvar $sysname sys set rr 0 switch -- $sys { image - physical - detector - amplifier - wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz {incr rr} default { set sys $defsys } } return $rr } proc DS9Backup {ch which} { global pds9 puts $ch "$which bg color $pds9(bg)" puts $ch "$which nan color $pds9(nan)" } # Process Cmds proc ProcessPrefsCmd {varname iname} { upvar $varname var upvar $iname i global pds9 switch -- [string tolower [lindex $var $i]] { clear {ClearPrefs} bgcolor { # backward compatibility incr i set pds9(bg) [lindex $var $i] PrefsBgColor } nancolor { # backward compatibility incr i set pds9(nan) [lindex $var $i] PrefsNanColor } threads { # backward compatibility incr i set pds9(threads) [lindex $var $i] PrefsThreads } irafalign { incr i set pds9(iraf) [FromYesNo [lindex $var $i]] PrefsIRAFAlign } } } proc ProcessSendPrefsCmd {proc id param} { global pds9 # backward compatibility switch -- [string tolower [lindex $param 0]] { bgcolor {$proc $id "$pds9(bg)\n"} nancolor {$proc $id "$pds9(nan)\n"} threads {$proc $id "$pds9(threads)\n"} irafalign {$proc $id [ToYesNo $pds9(iraf)]} } } proc ProcessBgCmd {varname iname} { upvar $varname var upvar $iname i global pds9 set pds9(bg) [lindex $var $i] PrefsBgColor } proc ProcessSendBgCmd {proc id param} { global pds9 $proc $id "$pds9(bg)\n" } proc ProcessNanCmd {varname iname} { upvar $varname var upvar $iname i global pds9 set pds9(nan) [lindex $var $i] PrefsNanColor } proc ProcessSendNanCmd {proc id param} { global pds9 $proc $id "$pds9(nan)\n" } proc ProcessThreadsCmd {varname iname} { upvar $varname var upvar $iname i global pds9 set pds9(threads) [lindex $var $i] PrefsThreads } proc ProcessSendThreadsCmd {proc id param} { global pds9 $proc $id "$pds9(threads)\n" } proc ProcessIRAFAlignCmd {varname iname} { upvar $varname var upvar $iname i global pds9 set pds9(iraf) [FromYesNo [lindex $var $i]] PrefsIRAFAlign } proc ProcessSendIRAFAlignCmd {proc id param} { global pds9 $proc $id [ToYesNo $pds9(iraf)] } proc ProcessCDCmd {varname iname} { upvar $varname var upvar $iname i cd [lindex $var $i] } proc ProcessSendCDCmd {proc id param} { $proc $id "[pwd]\n" } proc ProcessConsoleCmd {varname iname} { upvar $varname var upvar $iname i OpenConsole # ignore error message about ActiveTcl global ds9 InitError $ds9(msg,src) } proc ProcessCursorCmd {varname iname} { upvar $varname var upvar $iname i global current if {$current(frame) != {}} { set x [lindex $var $i] incr i set y [lindex $var $i] switch -- $current(mode) { none {$current(frame) warp $x $y} pointer - region {MarkerArrowKey $current(frame) $x $y} catalog {MarkerArrowKey $current(frame) $x $y} crosshair {CrosshairArrowKey $current(frame) $x $y} colorbar {} pan {Pan $x $y canvas} zoom - rotate - crop {} analysis {IMEArrowKey $current(frame) $x $y} examine - iexam {} } } } proc ProcessSendDataCmd {proc id param sock fn} { global cube global blink global current if {$current(frame) != {}} { set sys [lindex $param 0] set sky [lindex $param 1] set x [lindex $param 2] set y [lindex $param 3] set w [lindex $param 4] set h [lindex $param 5] set strip [lindex $param 6] switch -- $sys { image - physical - detector - amplifier { set strip $h set h $w set w $y set y $x set x $sky set sky fk5 } fk4 - b1950 - fk5 - j2000 - icrs - galactic - ecliptic { set strip $h set h $w set w $y set y $x set x $sky set sky $sys set sys wcs } } set strip [FromYesNo $strip] $current(frame) get data $sys $sky $x $y $w $h rr set ss {} foreach ii [array names rr] { if {$strip} { append ss "$rr($ii)\n" } else { append ss "$ii = $rr($ii)\n" } } ProcessSend $proc $id $sock $fn {.dat} $ss } } proc ProcessIconifyCmd {varname iname} { upvar $varname var upvar $iname i global ds9 switch -- [string tolower [lindex $var $i]] { yes - true - on - 1 {wm iconify $ds9(top)} no - false - off - 0 {wm deiconify $ds9(top)} default { wm iconify $ds9(top) incr i -1 } } } proc ProcessSendIconifyCmd {proc id param} { global ds9 if {[wm state $ds9(top)] == "normal"} { $proc $id "no\n" } else { $proc $id "yes\n" } } proc ProcessLowerCmd {varname iname} { upvar $varname var upvar $iname i global ds9 lower $ds9(top) } proc ProcessModeCmd {varname iname} { upvar $varname var upvar $iname i global current set current(mode) [string tolower [lindex $var $i]] # backward compatibility switch $current(mode) { pointer {set current(mode) region} } ChangeMode } proc ProcessQuitCmd {varname iname} { upvar $varname var upvar $iname i QuitDS9 } proc ProcessSendModeCmd {proc id param} { global current $proc $id "$current(mode)\n" } proc ProcessRaiseCmd {varname iname} { upvar $varname var upvar $iname i global ds9 raise $ds9(top) } proc ProcessSleepCmd {varname iname} { upvar $varname var upvar $iname i # yes, we need this UpdateDS9 RealizeDS9 set sec 1 if {[lindex $var $i] != {} && [string range [lindex $var $i] 0 0] != {-}} { set sec [lindex $var $i] } else { incr i -1 } after [expr int($sec*1000)] } proc ProcessSourceCmd {varname iname} { upvar $varname var upvar $iname i # we need to be realized # you never know what someone will try to do ProcessRealizeDS9 set fn [lindex $var $i] uplevel #0 "source $fn" } proc ProcessTclCmd {varname iname buf fn} { upvar $varname var upvar $iname i global pds9 if {!$pds9(tcl)} { Error [msgcat::mc {Executing TCL code is not enabled}] return } if {$buf != {}} { uplevel #0 $buf } elseif {$fn != {}} { if {[file exists $fn]} { set ch [open $fn r] set cmd [read $ch] close $ch uplevel #0 $cmd } } elseif {[lindex $var $i] != {}} { # special case uplevel #0 $var } } # backward compatibility proc ProcessThemeCmd {varname iname} { upvar $varname var upvar $iname i } # backward compatibility proc ProcessSendThemeCmd {proc id param} { global pds9 $proc $id "native\n" } proc ProcessSendVersionCmd {proc id param} { global ds9 $proc $id "$ds9(title) [lindex $ds9(version) 0]\n" } proc XMLQuote {val} { return [string map {& &amp; < &lt; > &gt; \' &apos; \" &quot;} $val] } proc XMLUnQuote {val} { return [string map {&amp; & &lt; < &gt; > &apos; \' &quot; \"} $val] } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/var.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000000773 12464211205 016027� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc LoadVar {varname fn layer mode} { global loadParam set loadParam(file,type) fits set loadParam(file,mode) $mode set loadParam(load,type) var set loadParam(var,name) $varname set loadParam(file,name) "$fn" # mask not supported set loadParam(load,layer) {} ProcessLoad } �����saods9/ds9/library/vector.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000010230 12514261633 016534� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc VectorDialog {varname} { upvar #0 $varname var global $varname global pmarker # see if we already have a header window visible if {[winfo exists $var(top)]} { raise $var(top) return } # variables set rr [$var(frame) get wcs] set var(dcoord) [lindex $rr 0] set var(dformat) $pmarker(dformat) AdjustCoordSystem $varname dcoord set var(arrow) [$var(frame) get marker $var(id) vector arrow] # procs set var(which) vector set var(proc,apply) VectorApply set var(proc,close) VectorClose set var(proc,coordCB) VectorCoordCB set var(proc,editCB) VectorEditCB set var(proc,distCB) VectorDistCB # base MarkerBaseDialog $varname # analysis $var(mb) add cascade -label [msgcat::mc {Analysis}] -menu $var(mb).analysis menu $var(mb).analysis # plot2d MarkerAnalysisPlot2dDialog $varname # raise plot? global marker set var(plot2d) $marker(plot2d) # init VectorDistCB $varname # callbacks $var(frame) marker $var(id) callback move "VectorEditCB" $varname $var(frame) marker $var(id) callback edit "VectorEditCB" $varname set f $var(top).param # Point ttk::label $f.tpt -text [msgcat::mc {Point}] ttk::entry $f.x -textvariable ${varname}(x) -width 13 ttk::entry $f.y -textvariable ${varname}(y) -width 13 CoordMenuButton $f.upt $varname system 1 sky skyformat \ [list $var(proc,coordCB) $varname] # Length ttk::label $f.tdist -text [msgcat::mc {Length}] ttk::entry $f.dist -textvariable ${varname}(dist) -width 13 DistMenuButton $f.udist $varname dcoord 1 dformat \ [list VectorDistCB $varname] DistMenuEnable $f.udist.menu $varname dcoord 1 dformat # Angle ttk::label $f.tangle -text [msgcat::mc {Angle}] ttk::entry $f.angle -textvariable ${varname}(angle) -width 13 ttk::label $f.uangle -text [msgcat::mc {Degrees}] # Arrow ttk::label $f.tarrow -text [msgcat::mc {Arrow}] ttk::checkbutton $f.arrow -variable ${varname}(arrow) \ -command "VectorArrow $varname" grid $f.tpt $f.x $f.y $f.upt -padx 2 -pady 2 -sticky w grid $f.tdist $f.dist $f.udist -padx 2 -pady 2 -sticky w grid $f.tangle $f.angle $f.uangle -padx 2 -pady 2 -sticky w grid $f.tarrow $f.arrow -padx 2 -pady 2 -sticky w } # actions proc VectorClose {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) delete callback move "VectorEditCB" $var(frame) marker $var(id) delete callback edit "VectorEditCB" MarkerBaseClose $varname } proc VectorApply {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) vector point $var(system) $var(sky) \ $var(x) $var(y) $var(dcoord) $var(dformat) $var(dist) $var(angle) MarkerBaseLineApply $varname } proc VectorArrow {varname} { upvar #0 $varname var global $varname $var(frame) marker $var(id) vector arrow $var(arrow) } # callbacks proc VectorCoordCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "VectorCoordCB" } MarkerAnalysisPlot2dSystem $varname MarkerBaseCoordCB $varname VectorEditCB $varname } proc VectorEditCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "VectorEditCB" } set p [$var(frame) get marker $var(id) vector point \ $var(system) $var(sky) $var(skyformat)] set var(x) [lindex $p 0] set var(y) [lindex $p 1] set var(dist) [$var(frame) get marker $var(id) vector length \ $var(dcoord) $var(dformat)] set var(angle) [$var(frame) get marker $var(id) angle \ $var(system) $var(sky)] } proc VectorDistCB {varname {dummy {}}} { upvar #0 $varname var global $varname global debug if {$debug(tcl,marker)} { puts stderr "VectorDistCB" } set var(dist) [$var(frame) get marker $var(id) vector length \ $var(dcoord) $var(dformat)] } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/vla.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000011304 12544316735 016026� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc VLADef {} { global vla global ivla set ivla(top) .vla set ivla(mb) .vlatmb set vla(sky) fk5 set vla(rformat) arcmin set vla(width) 15 set vla(height) 15 set vla(mode) new set vla(save) 0 set vla(valid) 1 set vla(survey) first } proc VLADialog {} { global vla global ivla global wcs if {[winfo exists $ivla(top)]} { raise $ivla(top) return } set varname dvla upvar #0 $varname var global $varname set var(top) $ivla(top) set var(mb) $ivla(mb) set var(sky) $vla(sky) set var(skyformat) $wcs(skyformat) set var(rformat) $vla(rformat) set var(width) $vla(width) set var(height) $vla(height) # not used set var(width,pixels) 300 set var(height,pixels) 300 set var(mode) $vla(mode) set var(save) $vla(save) set var(valid) $vla(valid) set var(survey) $vla(survey) set w $var(top) IMGSVRInit $varname "VLA [msgcat::mc {Server}]" VLAExec VLAAck menu $var(mb).survey $var(mb) add cascade -label Survey -menu $var(mb).survey $var(mb).survey add radiobutton -label {First} \ -variable ${varname}(survey) -value first $var(mb).survey add radiobutton -label {Stripe 82} \ -variable ${varname}(survey) -value stripe82 IMGSVRUpdate $varname 1 } proc VLAExec {varname} { upvar #0 $varname var global $varname if {$var(save)} { set var(fn) [SaveFileDialog savefitsfbox] if {$var(fn) == {}} { return } } else { set var(fn) [tmpnam ds9first ".fits"] } # skyformat switch -- $var(skyformat) { degrees { set xx [uformat d h: $var(x)] set yy [uformat d d: $var(y)] } sexagesimal { set xx $var(x) set yy $var(y) } } # size - convert to arcmin switch -- $var(rformat) { degrees { set ww [expr $var(width)*60.] set hh [expr $var(height)*60.] } arcmin { set ww $var(width) set hh $var(height) } arcsec { set ww [expr $var(width)/60.] set hh [expr $var(height)/60.] } } # now to radius set rr [expr sqrt($ww*$ww+$hh*$hh)/2.] if {$rr>60} { set rr 60 } set var(query) [http::formatQuery .submit "Extract the Cutout" RA "$xx $yy" Equinox J2000 ImageSize $rr MaxInt 10 .cgifields ImageType ImageType "FITS Image"] set var(url) "http://third.ucllnl.org/cgi-bin/$var(survey)cutout" IMGSVRLoad $varname } proc VLAAck {varname} { upvar #0 $varname var global $varname set msg {Acknowledgments for the VLA This major undertaking has received the generous technical and scientific support of many individuals. The NRAO staff has provided extremely valuable assistance in many aspects of the observations themselves and in the area of software support; in particular, we are grateful to Rick Perley, Ken Sowinski, Barry Clark, and Bill Cotton in this regard. The support of the NRAO Director, Paul van den Bout, and the yeoman service provided by Frazer Owen as Chair of the Survey Oversight Committee are also greatly appreciated. We also thank the members of the Oversight Committee (Ken Chambers, Eric Feigelson, Jackie Hewitt, Gillian Knapp, and Rogier Windhorst) for their time and wise counsel in this enterprise. Acknowledgment is also due our colleagues who are involved in the ongoing FIRST effort, including Richard McMahon and Isobel Hook. This work is supported in part under the auspices of the Department of Energy by Lawrence Livermore National Laboratory under contract No. W-7405-ENG-48 and the Institute for Geophysics and Planetary Physics, whose director Charles Alcock has been particularly supportive. We also acknowledge a generous planning grant from the CalSpace Institute; support from the STScI archive group, STScI director Bob Williams, and the STScI Director's Discretionary Research Fund; computing resources from Columbia University; a grant from the National Science Foundation; a gift of computing equipment from Sun Microsystems; a NATO travel grant to support our collaboration with Richard McMahon; and an award from the National Geographic Society which, in the spirit of their support 40 years ago for the Palomar Observatory Sky Survey, will be providing funds to continue our charting of the Universe. } SimpleTextDialog ${varname}ack [msgcat::mc {Acknowledgment}] \ 80 40 insert top $msg } # Process Cmds proc ProcessVLACmd {varname iname} { upvar $varname var upvar $iname i VLADialog IMGSVRProcessCmd $varname $iname dvla } proc ProcessSendVLACmd {proc id param} { VLADialog IMGSVRProcessSendCmd $proc $id $param dvla } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/vo.tcl���������������������������������������������������������������������������000644 �000765 �000000 �00000032642 12547523212 015671� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc VODef {} { global ivo global pvo set ivo(top) .vo set ivo(mb) .vomb set ivo(server,host) {} set ivo(server,title) {} set ivo(server,url) {} set ivo(server,button) {} set ivo(ka,id) {} # prefs only set pvo(server) {http://cxc.harvard.edu/chandraed/list.txt} set pvo(hv) 1 set pvo(method) mime set pvo(delay) 15 } proc VOKeepAlive {doka} { global ivo global pvo global xpa # if not xpa, return if {$pvo(method) != {xpa}} { return } # if keep-alive turned off, return if {$pvo(delay) <= 0} { return } # count the connections set n 0 for {set ii 0} {$ii < [llength $ivo(server,button)]} {incr ii} { if {$ivo(b$ii)} { incr n break } } # no connections => kill existing keep-alive, if necessary if {$n == 0} { if {$ivo(ka,id) != {}} { after cancel $ivo(ka,id) set ivo(ka,id) {} } } else { # yes connections # send a keep-alive, if necessary if {$doka} { # puts [format "send keepalive: %s (%d)" [exec date] $pvo(delay)] xpanskeepalive $xpa } # arrange for the next one set ivo(ka,id) [after [expr $pvo(delay) * 60 * 1000] VOKeepAlive 1] } } proc VOCancel {varname} { upvar #0 $varname var global $varname # set state to 0 so that we don't process the finish proc set var(active) 0 if {[info exists var(token)]} { http::reset $var(token) } } proc VODestroy {varname} { upvar #0 $varname var global $varname VOCancel $varname if {[winfo exists $var(top)]} { destroy $var(top) destroy $var(mb) } unset $varname } proc VOReset {varname} { upvar #0 $varname var global $varname set var(active) 0 if {[info exists var(token)]} { http::cleanup $var(token) unset var(token) } } proc VODone {varname} { upvar #0 $varname var global $varname VOReset $varname } proc VOCancelled {varname} { upvar #0 $varname var global $varname VOReset $varname } proc VOError {varname message} { upvar #0 $varname var global $varname Error $message VOReset $varname } proc VODialog {{sync 0}} { global ivo global pvo global ds9 if {[winfo exists $ivo(top)]} { raise $ivo(top) return } set varname voi upvar #0 $varname var global $varname # variables set var(top) $ivo(top) set var(mb) $ivo(mb) set var(sync) $sync set var(url) {} # create the window set w $var(top) set mb $var(mb) Toplevel $w $mb 6 [msgcat::mc {Virtual Observatory}] "VODestroy $varname" $mb add cascade -label [msgcat::mc {File}] -menu $mb.file menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] \ -command "VOApply $varname" $mb.file add command -label [msgcat::mc {Cancel}] \ -command "VOCancel $varname" $mb.file add separator $mb.file add command -label [msgcat::mc {Help Me Choose}] \ -command HelpVO $mb.file add command -label [msgcat::mc {Configure}] \ -command [list PrefsDialog http] $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] \ -command "VODestroy $varname" # Sites ttk::labelframe $w.param -text [msgcat::mc {Sites}] -padding 2 # Browser set f [ttk::labelframe $w.opt -text [msgcat::mc {Browser}] -padding 2] set var(hv,button) [ttk::checkbutton $w.opt.hv \ -text [msgcat::mc {Use Internal Web Browser}] \ -variable pvo(hv) \ -command SavePrefs] ttk::radiobutton $w.opt.xpa \ -text [msgcat::mc {Connect Directly}] \ -variable pvo(method) -value xpa -command PrefsVOMethod ttk::radiobutton $w.opt.http \ -text [msgcat::mc {Connect Using Web Proxy}] \ -variable pvo(method) -value mime -command PrefsVOMethod grid $w.opt.hv -padx 2 -pady 2 -sticky w grid $w.opt.xpa $w.opt.http -padx 2 -pady 2 -sticky w set f [ttk::frame $w.buttons] ttk::button $f.help -text [msgcat::mc {Help Me Choose}] \ -command HelpVO ttk::button $f.proxy -text [msgcat::mc {Configure}] \ -command [list PrefsDialog http] ttk::button $f.close -text [msgcat::mc {Close}] \ -command "VODestroy $varname" pack $f.help $f.proxy $f.close -side left -expand true -padx 2 -pady 4 # Fini grid $w.param -sticky news grid $w.opt -sticky news grid $w.buttons -sticky ew grid rowconfigure $w 0 -weight 1 grid rowconfigure $w 1 -weight 1 grid columnconfigure $w 0 -weight 1 if {[string length $ivo(server,host)] == 0} { VOApply $varname } else { set l [llength $ivo(server,host)] for {set ii 0} {$ii<$l} {incr ii} { set b [lindex $ivo(server,button) $ii] ttk::checkbutton $b -text "[lindex $ivo(server,title) $ii] ([lindex $ivo(server,url) $ii])" -variable ivo(b$ii) -command "VOCheck $varname $ii" pack $b -anchor w -padx 2 -pady 2 } } } proc VOApply {varname} { upvar #0 $varname var global $varname global ivo global pvo global xpa set w $var(top) # delete old servers for {set ii 0} {$ii < [llength $ivo(server,button)]} {incr ii} { catch {xparemote $xpa [lindex $ivo(server,host) $ii] - -proxy} catch {destroy [lindex $ivo(server,button) $ii]} catch {unset ivo(b$ii)} } set ivo(server,host) {} set ivo(server,title) {} set ivo(server,url) {} set ivo(server,button) {} VOFindServer $varname if {$var(url) != {}} { VOLoad $varname } else { VOLoadDefault $varname } # start or stop the keep-alive, as needed VOKeepAlive 0 } proc VOLoadDefault {varname} { upvar #0 $varname var global $varname # hardcode VOError $varname "Unable to access VO server list, please verify internet connection. Using default list." set rr {chandra-ed.cfa.harvard.edu:28571 CFA Chandra-Ed Archive Server http://chandra-ed.cfa.harvard.edu/archive.html xray1.physics.rutgers.edu:28571 Rutgers Primary MOOC X-ray Analysis Server http://xray1.physics.rutgers.edu/archive.html rinzai.rutgers.edu:28571 Rutgers X-ray Analysis Server #2 http://rinzai.rutgers.edu/archive.html} VOParse $varname $rr } proc VOFindServer {varname} { upvar #0 $varname var global $varname global pvo if {[VOCheckServer $varname $pvo(server)]} { return } if {[VOCheckServer $varname {http://cxc.harvard.edu/chandraed/list.txt}]} { return } if {[VOCheckServer $varname {http://cxc.harvard.edu/chandraed/test.txt}]} { return } if {[VOCheckServer $varname {http://chandra-ed.rutgers.edu/vo/list.txt}]} { return } if {[VOCheckServer $varname {http://chandra-ed.cfa.harvard.edu/vo/list.txt}]} { return } } proc VOCheckServer {varname url} { upvar #0 $varname var global $varname ParseURL $url rr set var(url) $url if {[checkdns $rr(authority) 3 1] == 0} { set var(url) $url return 1 } else { set var(url) {} return 0 } } proc VOLoad {varname} { upvar #0 $varname var global $varname global ihttp if {$var(sync)} { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 VOFinish $varname $var(token) } else { VOLoadDefault $varname } } else { if {![catch {set var(token) [http::geturl $var(url) \ -protocol 1.0 \ -timeout $ihttp(timeout) \ -command [list VOFinish $varname] \ -headers "[ProxyHTTP]"] }]} { # reset errorInfo (may be set in http::geturl) global errorInfo set errorInfo {} set var(active) 1 } else { VOLoadDefault $varname } } } proc VOFinish {varname token} { upvar #0 $varname var global $varname if {!($var(active))} { VOCancelled $varname return } upvar #0 $token t # Code set code [http::ncode $token] # Meta set meta $t(meta) # Log it HTTPLog $token # Result? switch -- $code { 200 - 203 - 503 { VOParse $varname [http::data $var(token)] VODone $varname } 201 - 300 - 301 - 302 - 303 - 305 - 307 { foreach {name value} $meta { if {[regexp -nocase ^location$ $name]} { global debug if {$debug(tcl,hv)} { puts stderr "VOFinish redirect $code to $value" } # clean up and resubmit http::cleanup $token unset var(token) set var(url) $value VOLoad $varname } } } default {VOError $varname [msgcat::mc {An error has occurred while updating VO server list}]} } } proc VOParse {varname rr} { upvar #0 $varname var global $varname global ivo set w $var(top) set data [string trimright $rr \n] set lines [split $data \n] set len [llength $lines] for {set ii 0} {$ii<$len} {incr ii} { set line [lindex $lines $ii] set b "$w.param.b$ii" set ll [split $line \t] lappend ivo(server,host) [lindex $ll 0] lappend ivo(server,title) [lindex $ll 1] lappend ivo(server,url) [lindex $ll 2] lappend ivo(server,button) $b set ivo(b$ii) 0 ttk::checkbutton $b -text "[lindex $ivo(server,title) $ii] ([lindex $ivo(server,url) $ii])" -variable ivo(b$ii) -command "VOCheck $varname $ii" pack $b -anchor w -padx 2 -pady 2 } } proc VOCheck {varname ii} { upvar #0 $varname var global $varname global ivo global pvo global xpa set w $var(top) set b "$w.param.b$ii" if {$ivo(b$ii)} { switch $pvo(method) { mime {} xpa { if {[info exists xpa]} { if {[catch {xparemote $xpa [lindex $ivo(server,host) $ii] + -proxy}]} { Info [msgcat::mc {Unable to connect directly: using Web Proxy}] set pvo(method) mime } } } } if {$pvo(hv)} { set url [lindex $ivo(server,url) $ii] ParseURL $url r HV "vo$ii" "$r(authority)" $url {} $var(sync) } } else { switch $pvo(method) { mime {} xpa { catch {xparemote $xpa [lindex $var(server,host) $ii] - -proxy} } } } # start or stop the keep-alive, as needed VOKeepAlive 0 } proc PrefsVOMethod {} { global pvo switch $pvo(method) { mime {set pvo(hv) 1} xpa {} } } proc PrefsDialogVO {} { global dprefs set w $dprefs(tab) $dprefs(list) insert end [msgcat::mc {VO}] lappend dprefs(tabs) [ttk::frame $w.vo] # Browser set f [ttk::labelframe $w.vo.browser -text [msgcat::mc {Browser}]] ttk::checkbutton $f.web -text [msgcat::mc {Use Internal Web Browser}] \ -variable pvo(hv) ttk::radiobutton $f.xpa -text [msgcat::mc {Connect Directly}] \ -variable pvo(method) -value xpa -command PrefsVOMethod ttk::radiobutton $f.mime -text [msgcat::mc {Connect Using Web Proxy}] \ -variable pvo(method) -value mime -command PrefsVOMethod grid $f.web -padx 2 -pady 2 -sticky w grid $f.xpa $f.mime -padx 2 -pady 2 -sticky w # Server set f [ttk::labelframe $w.vo.server -text [msgcat::mc {VO Server}]] ttk::label $f.stitle -text [msgcat::mc {Default}] ttk::entry $f.server -textvariable pvo(server) -width 50 grid $f.stitle $f.server -padx 2 -pady 2 -sticky w # Keep-Alive set f [ttk::labelframe $w.vo.keep -text [msgcat::mc {Keep-Alive}]] ttk::label $f.dtitle -text [msgcat::mc {Minutes}] ttk::entry $f.delay -textvariable pvo(delay) -width 5 grid $f.dtitle $f.delay -padx 2 -pady 2 -sticky w pack $w.vo.browser $w.vo.server $w.vo.keep -side top -fill both -expand true } proc ProcessVOCmd {varname iname} { upvar $varname var upvar $iname i set vvarname voi upvar #0 $vvarname vvar global $vvarname global ivo global pvo switch -- [string tolower [lindex $var $i]] { open {VODialog} close {VODestroy $vvarname} method { incr i set pvo(method) [lindex $var $i] } server { incr i set pvo(server) [lindex $var $i] } internal { incr i set pvo(hv) [FromYesNo [lindex $var $i]] } delay { incr i set pvo(delay) [lindex $var $i] } connect { incr i VODialog 1 # find best match set ii [lsearch $ivo(server,url) "*[lindex $var $i]*"] if {$ii>=0} { set ivo(b$ii) 1 VOCheck $vvarname $ii } } disconnect { incr i VODialog 1 # find best match set ii [lsearch $ivo(server,url) "*[lindex $var $i]*"] if {$ii>=0} { set ivo(b$ii) 0 VOCheck $vvarname $ii } } default { VODialog 1 # find best match set ii [lsearch $ivo(server,url) "*[lindex $var $i]*"] if {$ii>=0} { set ivo(b$ii) 1 VOCheck $vvarname $ii } } } } proc ProcessSendVOCmd {proc id param} { global ivo global pvo switch -- [string tolower $param] { method {$proc $id "$pvo(method)\n"} server {$proc $id "$pvo(server)\n"} internal {$proc $id [ToYesNo $pvo(hv)]} delay {$proc $id "$pvo(delay)\n"} connect { # current connections set len [llength $ivo(server,button)] set rr {} for {set ii 0} {$ii<$len} {incr ii} { if {$ivo(b$ii)} { append rr "[lindex $ivo(server,host) $ii] [lindex $ivo(server,title) $ii] [lindex $ivo(server,url) $ii] $ivo(b$ii)\n" } } $proc $id $rr } default { VODialog 1 # all possible connections set len [llength $ivo(server,button)] set rr {} for {set ii 0} {$ii<$len} {incr ii} { append rr "[lindex $ivo(server,host) $ii] [lindex $ivo(server,title) $ii] [lindex $ivo(server,url) $ii] $ivo(b$ii)\n" } $proc $id $rr } } } ����������������������������������������������������������������������������������������������saods9/ds9/library/wcs.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000075035 12632372306 016045� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc WCSDef {} { global wcs global pwcs global iwcs set iwcs(top) .wcs set iwcs(mb) .wcsmb set wcs(system) wcs set wcs(sky) fk5 set wcs(skyformat) sexagesimal array set pwcs [array get wcs] } proc UpdateWCS {} { global wcs global ds9 global current # frame if {$current(frame) != {}} { $current(frame) wcs $wcs(system) $wcs(sky) $wcs(skyformat) AlignWCSFrame set wcs(frame) $current(frame) if {[$current(frame) has fits]} { CoordMenuEnable $ds9(mb).wcs wcs system 0 sky skyformat } else { CoordMenuReset $ds9(mb).wcs wcs system 0 sky skyformat } UpdateWCSInfoBox $current(frame) } # grid global grid set grid(system) $wcs(system) set grid(sky) $wcs(sky) set grid(skyformat) $wcs(skyformat) GridUpdateCurrent # panzoom dialog global panzoom set panzoom(system) $wcs(system) set panzoom(sky) $wcs(sky) set panzoom(skyformat) $wcs(skyformat) UpdatePanZoomDialog # crosshair dialog global crosshair set crosshair(system) $wcs(system) set crosshair(sky) $wcs(sky) set crosshair(skyformat) $wcs(skyformat) UpdateCrosshairDialog # crop dialog global crop set crop(system) $wcs(system) set crop(sky) $wcs(sky) set crop(skyformat) $wcs(skyformat) UpdateCropDialog # cube global cube set cube(system) $wcs(system) UpdateCubeDialog # rgb global rgb set rgb(system) $wcs(system) RGBSystem # regions global marker set marker(system) $wcs(system) set marker(sky) $wcs(sky) set marker(skyformat) $wcs(skyformat) } proc UpdateWCSInfoBox {which} { global wcs global view # if one wcs coord system is visible, change it set cnt 0 set vv {} foreach ll {{} 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} { if {$view(info,wcs$ll)} { incr cnt set vv wcs$ll } } if {$cnt == 1} { set ww [lindex [$which get wcs] 0] if {$view(info,$vv) != $view(info,$ww)} { foreach ll {{} 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} { set view(info,wcs$ll) 0 } set view(info,$ww) 1 LayoutInfoPanel } } } proc WCSBackup {ch which fdir rdir} { # simple case puts $ch "$which wcs [$which get wcs]" if {[$which has wcs alt]} { set fn $fdir/ds9.wcs set rfn $rdir/ds9.wcs catch {file delete -force $fn} WCSToVar [$which get fits header wcs 1] WCSSaveFile $fn puts $ch "WCSLoadFile $rfn" puts $ch "$which wcs replace text 1 \\\{\[WCSFromVar\]\\\}" } } proc WCSDialog {} { global wcs global iwcs global dwcs global ds9 # see if we already have a window visible if {[winfo exists $iwcs(top)]} { raise $iwcs(top) return } # create the window set w $iwcs(top) set mb $iwcs(mb) # vars set dwcs(system) $wcs(system) set dwcs(ext) 1 set dwcs(prev) {} Toplevel $w $mb 6 [msgcat::mc {WCS Parameters}] WCSDestroyDialog $mb add cascade -label [msgcat::mc {File}] -menu $mb.file $mb add cascade -label [msgcat::mc {Edit}] -menu $mb.edit $mb add cascade -label [msgcat::mc {WCS}] -menu $mb.wcs $mb add cascade -label [msgcat::mc {Extention}] -menu $mb.ext menu $mb.file $mb.file add command -label [msgcat::mc {Apply}] -command WCSApplyDialog $mb.file add command -label [msgcat::mc {Reset}] -command WCSResetDialog $mb.file add separator $mb.file add command -label "[msgcat::mc {Load}]..." -command WCSLoadDialog $mb.file add command -label "[msgcat::mc {Save}]..." -command WCSSaveDialog $mb.file add separator $mb.file add command -label [msgcat::mc {Close}] -command WCSDestroyDialog EditMenu $mb iwcs menu $mb.wcs $mb.wcs add radiobutton -label [msgcat::mc {WCS}] \ -variable dwcs(system) -value wcs -command ConfigWCSDialog $mb.wcs add separator foreach l {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} { $mb.wcs add radiobutton -label "[msgcat::mc {WCS}] $l" \ -variable dwcs(system) -value "wcs$l" -command ConfigWCSDialog } # configured later menu $mb.ext # Param set tt [ttk::notebook $w.param] set base [ttk::frame $tt.base] set pv00 [ttk::frame $tt.pv00] set pv12 [ttk::frame $tt.pv12] set pv24 [ttk::frame $tt.pv24] set ab0 [ttk::frame $tt.ab0] set ab2 [ttk::frame $tt.ab2] set ab4 [ttk::frame $tt.ab4] set apbp0 [ttk::frame $tt.apbp0] set apbp2 [ttk::frame $tt.apbp2] set apbp4 [ttk::frame $tt.apbp4] $tt add $base -text {Keyword} $tt add $pv00 -text {PVi_00} $tt add $pv12 -text {PVi_12} $tt add $pv24 -text {PVi_24} $tt add $ab0 -text {A_0} $tt add $ab2 -text {A_2} $tt add $ab4 -text {A_4} $tt add $apbp0 -text {AP_0} $tt add $apbp2 -text {AP_2} $tt add $apbp4 -text {AP_4} $tt select $base ttk::label $base.tmjdobs -text "MJD-OBS" ttk::entry $base.mjdobs -textvariable dwcs(mjd-obs) -width 14 ttk::label $base.tdateobs -text "DATE-OBS" ttk::entry $base.dateobs -textvariable dwcs(date-obs) -width 14 ttk::label $base.tdate -text "DATE" ttk::entry $base.date -textvariable dwcs(date) -width 14 ttk::label $base.tepoch -text "EPOCH" ttk::entry $base.epoch -textvariable dwcs(epoch) -width 14 foreach aa {{} 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} { set bb [string toupper $aa] ttk::label $base.twcsname${aa} -text "WCSNAME${bb}" ttk::entry $base.wcsname${aa} \ -textvariable dwcs(wcsname${aa}) -width 14 ttk::label $base.tradesys${aa} -text "RADESYS${bb}" ttk::entry $base.radesys${aa} \ -textvariable dwcs(radesys${aa}) -width 14 ttk::label $base.tequinox${aa} -text "EQUINOX${bb}" ttk::entry $base.equinox${aa} \ -textvariable dwcs(equinox${aa}) -width 14 ttk::label $base.tlatpole${aa} -text "LATPOLE${bb}" ttk::entry $base.latpole${aa} \ -textvariable dwcs(latpole${aa}) -width 14 ttk::label $base.tlonpole${aa} -text "LONPOLE${bb}" ttk::entry $base.lonpole${aa} \ -textvariable dwcs(lonpole${aa}) -width 14 for {set ii 1} {$ii<=2} {incr ii} { ttk::label $base.tctype${ii}${aa} -text "CTYPE${ii}${bb}" ttk::entry $base.ctype${ii}${aa} \ -textvariable dwcs(ctype${ii}${aa}) -width 14 ttk::label $base.tcrpix${ii}${aa} -text "CRPIX${ii}${bb}" ttk::entry $base.crpix${ii}${aa} \ -textvariable dwcs(crpix${ii}${aa}) -width 14 ttk::label $base.tcrval${ii}${aa} -text "CRVAL${ii}${bb}" ttk::entry $base.crval${ii}${aa} \ -textvariable dwcs(crval${ii}${aa}) -width 14 ttk::label $base.tcunit${ii}${aa} -text "CUNIT${ii}${bb}" ttk::entry $base.cunit${ii}${aa} \ -textvariable dwcs(cunit${ii}${aa}) -width 14 ttk::label $base.tcdelt${ii}${aa} -text "CDELT${ii}${bb}" ttk::entry $base.cdelt${ii}${aa} \ -textvariable dwcs(cdelt${ii}${aa}) -width 14 for {set jj 1} {$jj<=2} {incr jj} { ttk::label $base.tcd${ii}_${jj}${aa} -text "CD${ii}_${jj}${bb}" ttk::entry $base.cd${ii}_${jj}${aa} \ -textvariable dwcs(cd${ii}_${jj}${aa}) -width 14 } for {set jj 1} {$jj<=2} {incr jj} { ttk::label $base.tpc${ii}_${jj}${aa} \ -text "PC${ii}_${jj}${bb}" ttk::entry $base.pc${ii}_${jj}${aa} \ -textvariable dwcs(pc${ii}_${jj}${aa}) -width 14 } for {set mm 0} {$mm<12} {incr mm} { ttk::label $pv00.tpv${ii}_${mm}${aa} \ -text "PV${ii}_${mm}${bb}" ttk::entry $pv00.pv${ii}_${mm}${aa} \ -textvariable dwcs(pv${ii}_${mm}${aa}) -width 14 } for {set mm 12} {$mm<24} {incr mm} { ttk::label $pv12.tpv${ii}_${mm}${aa} \ -text "PV${ii}_${mm}${bb}" ttk::entry $pv12.pv${ii}_${mm}${aa} \ -textvariable dwcs(pv${ii}_${mm}${aa}) -width 14 } for {set mm 24} {$mm<36} {incr mm} { ttk::label $pv24.tpv${ii}_${mm}${aa} \ -text "PV${ii}_${mm}${bb}" ttk::entry $pv24.pv${ii}_${mm}${aa} \ -textvariable dwcs(pv${ii}_${mm}${aa}) -width 14 } } } # only in primary ttk::label $ab0.ta -text "A_ORDER" ttk::entry $ab0.a -textvariable dwcs(a_order) -width 14 for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab0.ta_${mm}_${nn} -text "A_${mm}_${nn}" ttk::entry $ab0.a_${mm}_${nn} \ -textvariable dwcs(a_${mm}_${nn}) -width 14 } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab2.ta_${mm}_${nn} -text "A_${mm}_${nn}" ttk::entry $ab2.a_${mm}_${nn} \ -textvariable dwcs(a_${mm}_${nn}) -width 14 } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab4.ta_${mm}_${nn} -text "A_${mm}_${nn}" ttk::entry $ab4.a_${mm}_${nn} \ -textvariable dwcs(a_${mm}_${nn}) -width 14 } } ttk::label $ab0.tb -text "B_ORDER" ttk::entry $ab0.b -textvariable dwcs(b_order) -width 14 for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab0.tb_${mm}_${nn} -text "B_${mm}_${nn}" ttk::entry $ab0.b_${mm}_${nn} \ -textvariable dwcs(b_${mm}_${nn}) -width 14 } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab2.tb_${mm}_${nn} -text "B_${mm}_${nn}" ttk::entry $ab2.b_${mm}_${nn} \ -textvariable dwcs(b_${mm}_${nn}) -width 14 } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $ab4.tb_${mm}_${nn} -text "B_${mm}_${nn}" ttk::entry $ab4.b_${mm}_${nn} \ -textvariable dwcs(b_${mm}_${nn}) -width 14 } } ttk::label $apbp0.tap -text "AP_ORDER" ttk::entry $apbp0.ap -textvariable dwcs(ap_order) -width 14 for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp0.tap_${mm}_${nn} -text "AP_${mm}_${nn}" ttk::entry $apbp0.ap_${mm}_${nn} \ -textvariable dwcs(ap_${mm}_${nn}) -width 14 } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp2.tap_${mm}_${nn} -text "AP_${mm}_${nn}" ttk::entry $apbp2.ap_${mm}_${nn} \ -textvariable dwcs(ap_${mm}_${nn}) -width 14 } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp4.tap_${mm}_${nn} -text "AP_${mm}_${nn}" ttk::entry $apbp4.ap_${mm}_${nn} \ -textvariable dwcs(ap_${mm}_${nn}) -width 14 } } ttk::label $apbp0.tbp -text "BP_ORDER" ttk::entry $apbp0.bp -textvariable dwcs(bp_order) -width 14 for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp0.tbp_${mm}_${nn} -text "BP_${mm}_${nn}" ttk::entry $apbp0.bp_${mm}_${nn} \ -textvariable dwcs(bp_${mm}_${nn}) -width 14 } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp2.tbp_${mm}_${nn} -text "BP_${mm}_${nn}" ttk::entry $apbp2.bp_${mm}_${nn} \ -textvariable dwcs(bp_${mm}_${nn}) -width 14 } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { ttk::label $apbp4.tbp_${mm}_${nn} -text "BP_${mm}_${nn}" ttk::entry $apbp4.bp_${mm}_${nn} \ -textvariable dwcs(bp_${mm}_${nn}) -width 14 } } # Buttons set f [ttk::frame $w.buttons] ttk::button $f.apply -text [msgcat::mc {Apply}] -command WCSApplyDialog ttk::button $f.reset -text [msgcat::mc {Reset}] -command WCSResetDialog ttk::button $f.close -text [msgcat::mc {Close}] -command WCSDestroyDialog pack $f.apply $f.reset $f.close -side left -expand true -padx 2 -pady 4 # Fini pack $w.buttons -side bottom -fill x pack $w.param -side top -fill both -expand true ConfigWCSDialog UpdateWCSDialog } proc WCSApplyDialog {} { global dwcs global current global rgb if {$current(frame) != {}} { RGBEvalLock rgb(lock,wcs) $current(frame) "$current(frame) wcs replace text $dwcs(ext) \{\{[WCSFromVar]\}\}" UpdateWCS CATUpdateWCS } } proc WCSResetDialog {} { global dwcs global current global rgb if {$current(frame) != {}} { RGBEvalLock rgb(lock,wcs) $current(frame) [list $current(frame) wcs reset $dwcs(ext)] UpdateWCS CATUpdateWCS UpdateWCSDialog } } proc WCSDestroyDialog {} { global iwcs global dwcs if {[winfo exists $iwcs(top)]} { destroy $iwcs(top) destroy $iwcs(mb) } unset dwcs } proc WCSSaveDialog {} { global dwcs set fn [SaveFileDialog wcsfbox] WCSSaveFile $fn } # used by backup proc WCSSaveFile {fn} { if {[catch {open $fn w} fp]} { Error "[msgcat::mc {Unable to open file}] $fn: $fp" return } puts $fp [WCSFromVar] catch {close $fp} } proc WCSLoadDialog {} { global dwcs set fn [OpenFileDialog wcsfbox] WCSLoadFile $fn } # used by backup proc WCSLoadFile {fn} { if {$fn != {}} { if {[catch {open $fn r} fp]} { Error "[msgcat::mc {Unable to open file}] $fn: $fp" return } WCSToVar [read -nonewline $fp] catch {close $fp} } } proc UpdateWCSDialog {} { global iwcs global current global debug if {$debug(tcl,update)} { puts stderr "UpdateWCSDialog" } if {![winfo exists $iwcs(top)]} { return } ConfigWCSDialogExtMenu UpdateWCSVars } proc UpdateWCSVars {} { global dwcs global current if {$current(frame) != {}} { if {[$current(frame) has fits]} { WCSToVar [$current(frame) get fits header wcs $dwcs(ext)] return } } WCSToVar {} } proc ConfigWCSDialog {{force {0}}} { global wcs global iwcs global dwcs global current global debug if {$debug(tcl,update)} { puts stderr "ConfigWCSDialog" } if {![winfo exists $iwcs(top)]} { return } # do we need to re-grid wcs vars? if {!$force && $dwcs(prev) == $dwcs(system)} { return } set tt $iwcs(top).param set base $tt.base set pv00 $tt.pv00 set pv12 $tt.pv12 set pv24 $tt.pv24 set ab0 $tt.ab0 set ab2 $tt.ab2 set ab4 $tt.ab4 set apbp0 $tt.apbp0 set apbp2 $tt.apbp2 set apbp4 $tt.apbp4 grid forget $base.tmjdobs $base.mjdobs grid forget $base.tdateobs $base.dateobs grid forget $base.tdate $base.date grid forget $base.tepoch $base.epoch # forget current sys vars set aa [string tolower [string range $dwcs(prev) 3 3]] grid forget $base.twcsname${aa} $base.wcsname${aa} grid forget $base.tradesys${aa} $base.radesys${aa} grid forget $base.tequinox${aa} $base.equinox${aa} grid forget $base.tlatpole${aa} $base.latpole${aa} grid forget $base.tlonpole${aa} $base.lonpole${aa} for {set ii 1} {$ii<=2} {incr ii} { grid forget $base.tctype${ii}${aa} $base.ctype${ii}${aa} grid forget $base.tcunit${ii}${aa} $base.cunit${ii}${aa} grid forget $base.tcrpix${ii}${aa} $base.crpix${ii}${aa} grid forget $base.tcrval${ii}${aa} $base.crval${ii}${aa} grid forget $base.tcdelt${ii}${aa} $base.cdelt${ii}${aa} for {set jj 1} {$jj<=2} {incr jj} { grid forget $base.tcd${ii}_${jj}${aa} $base.cd${ii}_${jj}${aa} grid forget $base.tpc${ii}_${jj}${aa} $base.pc${ii}_${jj}${aa} } for {set mm 0} {$mm<12} {incr mm} { grid forget $pv00.tpv${ii}_${mm}${aa} $pv00.pv${ii}_${mm}${aa} } for {set mm 12} {$mm<24} {incr mm} { grid forget $pv12.tpv${ii}_${mm}${aa} $pv12.pv${ii}_${mm}${aa} } for {set mm 24} {$mm<36} {incr mm} { grid forget $pv24.tpv${ii}_${mm}${aa} $pv24.pv${ii}_${mm}${aa} } } # only in primary grid forget $ab0.ta $ab0.a for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab0.ta_${mm}_${nn} $ab0.a_${mm}_${nn} } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab2.ta_${mm}_${nn} $ab2.a_${mm}_${nn} } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab4.ta_${mm}_${nn} $ab4.a_${mm}_${nn} } } grid forget $ab0.tb $ab0.b for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab0.tb_${mm}_${nn} $ab0.b_${mm}_${nn} } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab2.tb_${mm}_${nn} $ab2.b_${mm}_${nn} } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $ab4.tb_${mm}_${nn} $ab4.b_${mm}_${nn} } } grid forget $apbp0.tap $apbp0.ap for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp0.tap_${mm}_${nn} $apbp0.ap_${mm}_${nn} } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp2.tap_${mm}_${nn} $apbp2.ap_${mm}_${nn} } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp4.tap_${mm}_${nn} $apbp4.ap_${mm}_${nn} } } grid forget $apbp0.tbp $apbp0.bp for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp0.tbp_${mm}_${nn} $apbp0.bp_${mm}_${nn} } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp2.tbp_${mm}_${nn} $apbp2.bp_${mm}_${nn} } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid forget $apbp4.tbp_${mm}_${nn} $apbp4.bp_${mm}_${nn} } } # display new sys vars set dwcs(prev) $dwcs(system) set aa [string tolower [string range $dwcs(system) 3 3]] grid $base.twcsname${aa} $base.wcsname${aa} -padx 2 -pady 2 -sticky w grid $base.tradesys${aa} $base.radesys${aa} -padx 2 -pady 2 -sticky w grid $base.tequinox${aa} $base.equinox${aa} \ $base.tepoch $base.epoch -padx 2 -pady 2 -sticky w grid $base.tmjdobs $base.mjdobs -padx 2 -pady 2 -sticky w grid $base.tdateobs $base.dateobs \ $base.tdate $base.date -padx 2 -pady 2 -sticky w grid $base.tctype1${aa} $base.ctype1${aa} \ $base.tctype2${aa} $base.ctype2${aa} -padx 2 -pady 2 -sticky w grid $base.tcrpix1${aa} $base.crpix1${aa} \ $base.tcrpix2${aa} $base.crpix2${aa} -padx 2 -pady 2 -sticky w grid $base.tcrval1${aa} $base.crval1${aa} \ $base.tcrval2${aa} $base.crval2${aa} -padx 2 -pady 2 -sticky w grid $base.tcunit1${aa} $base.cunit1${aa} \ $base.tcunit2${aa} $base.cunit2${aa} -padx 2 -pady 2 -sticky w grid $base.tcdelt1${aa} $base.cdelt1${aa} \ $base.tcdelt2${aa} $base.cdelt2${aa} -padx 2 -pady 2 -sticky w grid $base.tcd1_1${aa} $base.cd1_1${aa} \ $base.tcd2_1${aa} $base.cd2_1${aa} -padx 2 -pady 2 -sticky w grid $base.tcd1_2${aa} $base.cd1_2${aa} \ $base.tcd2_2${aa} $base.cd2_2${aa} -padx 2 -pady 2 -sticky w grid $base.tpc1_1${aa} $base.pc1_1${aa} \ $base.tpc2_1${aa} $base.pc2_1${aa} -padx 2 -pady 2 -sticky w grid $base.tpc1_2${aa} $base.pc1_2${aa} \ $base.tpc2_2${aa} $base.pc2_2${aa} -padx 2 -pady 2 -sticky w grid $base.tlatpole${aa} $base.latpole${aa} \ $base.tlonpole${aa} $base.lonpole${aa} -padx 2 -pady 2 -sticky w for {set mm 0} {$mm<12} {incr mm} { grid $pv00.tpv1_${mm}${aa} $pv00.pv1_${mm}${aa} \ $pv00.tpv2_${mm}${aa} $pv00.pv2_${mm}${aa} \ -padx 2 -pady 2 -sticky w } for {set mm 12} {$mm<24} {incr mm} { grid $pv12.tpv1_${mm}${aa} $pv12.pv1_${mm}${aa} \ $pv12.tpv2_${mm}${aa} $pv12.pv2_${mm}${aa} \ -padx 2 -pady 2 -sticky w } for {set mm 24} {$mm<36} {incr mm} { grid $pv24.tpv1_${mm}${aa} $pv24.pv1_${mm}${aa} \ $pv24.tpv2_${mm}${aa} $pv24.pv2_${mm}${aa} \ -padx 2 -pady 2 -sticky w } # only in primary grid $ab0.ta $ab0.a $ab0.tb $ab0.b -padx 2 -pady 2 -sticky w for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $ab0.ta_${mm}_${nn} $ab0.a_${mm}_${nn} \ $ab0.tb_${mm}_${nn} $ab0.b_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $ab2.ta_${mm}_${nn} $ab2.a_${mm}_${nn} \ $ab2.tb_${mm}_${nn} $ab2.b_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $ab4.ta_${mm}_${nn} $ab4.a_${mm}_${nn} \ $ab4.tb_${mm}_${nn} $ab4.b_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } grid $apbp0.tap $apbp0.ap $apbp0.tbp $apbp0.bp -padx 2 -pady 2 -sticky w for {set mm 0} {$mm<2} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $apbp0.tap_${mm}_${nn} $apbp0.ap_${mm}_${nn} \ $apbp0.tbp_${mm}_${nn} $apbp0.bp_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } for {set mm 2} {$mm<4} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $apbp2.tap_${mm}_${nn} $apbp2.ap_${mm}_${nn} \ $apbp2.tbp_${mm}_${nn} $apbp2.bp_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } for {set mm 4} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { grid $apbp4.tap_${mm}_${nn} $apbp4.ap_${mm}_${nn} \ $apbp4.tbp_${mm}_${nn} $apbp4.bp_${mm}_${nn} \ -padx 2 -pady 2 -sticky w } } } proc ConfigWCSDialogExtMenu {} { global iwcs global dwcs global ds9 global current $iwcs(mb).ext delete $ds9(menu,start) end set dwcs(ext) 1 set nn 0 set last {} set cnt [$current(frame) get fits count] for {set ii 1} {$ii <= $cnt} {incr ii} { set fn [$current(frame) get fits file name $ii] if {$fn != $last} { incr nn set item($nn) $fn set val($nn) $ii set last $fn } } if {$nn > 1} { $iwcs(mb) entryconfig [msgcat::mc {Extention}] -state normal for {set ii 1} {$ii<=$nn} {incr ii} { $iwcs(mb).ext add radiobutton -label $item($ii) \ -variable dwcs(ext) -value $val($ii) -command UpdateWCSVars } } else { $iwcs(mb) entryconfig [msgcat::mc {Extention}] -state disabled } } # used by backup proc WCSToVar {txt} { global wcs global dwcs global iwcs # clear all set dwcs(mjd-obs) {} set dwcs(date-obs) {} set dwcs(date) {} set dwcs(epoch) {} foreach aa {{} 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} { set dwcs(wcsname${aa}) {} set dwcs(radesys${aa}) {} set dwcs(equinox${aa}) {} set dwcs(latpole${aa}) {} set dwcs(lonpole${aa}) {} for {set ii 1} {$ii<=2} {incr ii} { set dwcs(ctype${ii}${aa}) {} set dwcs(cunit${ii}${aa}) {} set dwcs(crpix${ii}${aa}) {} set dwcs(crval${ii}${aa}) {} set dwcs(cdelt${ii}${aa}) {} for {set jj 1} {$jj<=2} {incr jj} { set dwcs(cd${ii}_${jj}${aa}) {} set dwcs(pc${ii}_${jj}${aa}) {} } for {set mm 0} {$mm<36} {incr mm} { set dwcs(pv${ii}_${mm}${aa}) {} } } } # primary only set dwcs(a_order) {} for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { set dwcs(a_${mm}_${nn}) {} } } set dwcs(b_order) {} for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { set dwcs(b_${mm}_${nn}) {} } } set dwcs(ap_order) {} for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { set dwcs(ap_${mm}_${nn}) {} } } set dwcs(bp_order) {} for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { set dwcs(bp_${mm}_${nn}) {} } } set lines [split $txt "\n"] # check for fits header, do it the hard way if {[llength $lines] == 1} { set lines {} while {"$txt" != {}} { lappend lines "[string range $txt 0 79]" set txt "[string replace $txt 0 79]" } } for {set ll 0} {$ll<[llength $lines]} {incr ll} { set line [lindex $lines $ll] set pp [split $line {=}] set key [string tolower [string trim [lindex $pp 0]]] # drop comments # some keywords can have '/' in the value (such as a date) # try the easy approach first set ee [lindex $pp 1] set dd [split $ee {/}] switch [llength $dd] { 0 - 1 - 2 {set aa [lindex $dd 0]} default { set ff [string first { /} $ee] if {$ff > 0} { set aa [string range $ee 0 $ff] } else { set aa [lindex $dd 0] } } } # drop any white space set bb [string trim $aa] # drop any single quotes set cc [string trim $bb {'}] # drop any white space set val [string trim $cc] # sanity check if {$key == {longpole}} { set key lonpole } if {$key == {radecsys}} { set key radesys } switch [string range $key 0 6] { mjd-obs - date-ob { set dwcs($key) $val } } switch [string range $key 0 5] { wcsnam - radesy - equino - latpol - lonpol - ctype1 - ctype2 - cunit1 - cunit2 - crpix1 - crpix2 - crval1 - crval2 - cdelt1 - cdelt2 - a_orde - b_orde - ap_ord - bp_ord { set dwcs($key) $val } } switch [string range $key 0 3] { epoc - date - cd1_ - cd1_ - cd2_ - cd2_ - pc1_ - pc1_ - pc2_ - pc2_ - pv1_ - pv2_ { set dwcs($key) $val } } switch [string range $key 0 2] { ap_ - bp_ { set dwcs($key) $val } } switch [string range $key 0 1] { a_ - b_ { set dwcs($key) $val } } } } # used by backup proc WCSFromVar {} { global wcs global dwcs global iwcs set rr {} if {$dwcs(mjd-obs) != {}} { append rr "MJD-OBS = $dwcs(mjd-obs)\n" } if {$dwcs(date-obs) != {}} { append rr "DATE-OBS = '$dwcs(date-obs)'\n" } if {$dwcs(date) != {}} { append rr "DATE = '$dwcs(date)'\n" } if {$dwcs(epoch) != {}} { append rr "EPOCH = $dwcs(epoch)\n" } foreach aa {{} 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} { set bb [string toupper $aa] if {$dwcs(wcsname${aa}) != {}} { append rr "WCSNAME${bb} = '$dwcs(wcsname${aa})'\n" } if {$dwcs(radesys${aa}) != {}} { append rr "RADESYS${bb} = '$dwcs(radesys${aa})'\n" } if {$dwcs(equinox${aa}) != {}} { append rr "EQUINOX${bb} = $dwcs(equinox${aa})\n" } if {$dwcs(latpole${aa}) != {}} { append rr "LATPOLE${bb} = $dwcs(latpole${aa})\n" } if {$dwcs(lonpole${aa}) != {}} { append rr "LONPOLE${bb} = $dwcs(lonpole${aa})\n" } for {set ii 1} {$ii<=2} {incr ii} { if {$dwcs(ctype${ii}${aa}) != {}} { append rr "CTYPE${ii}${bb} = '$dwcs(ctype${ii}${aa})'\n" } if {$dwcs(cunit${ii}${aa}) != {}} { append rr "CUNIT${ii}${bb} = '$dwcs(cunit${ii}${aa})'\n" } if {$dwcs(crpix${ii}${aa}) != {}} { append rr "CRPIX${ii}${bb} = $dwcs(crpix${ii}${aa})\n" } if {$dwcs(crval${ii}${aa}) != {}} { append rr "CRVAL${ii}${bb} = $dwcs(crval${ii}${aa})\n" } if {$dwcs(cdelt${ii}${aa}) != {}} { append rr "CDELT${ii}${bb} = $dwcs(cdelt${ii}${aa})\n" } for {set jj 1} {$jj<=2} {incr jj} { if {$dwcs(cd${ii}_${jj}${aa}) != {}} { append rr "CD${ii}_${jj}${bb} = $dwcs(cd${ii}_${jj}${aa})\n" } if {$dwcs(pc${ii}_${jj}${aa}) != {}} { append rr "PC${ii}_${jj}${bb} = $dwcs(pc${ii}_${jj}${aa})\n" } } for {set mm 0} {$mm<36} {incr mm} { if {$dwcs(pv${ii}_${mm}${aa}) != {}} { append rr "PV${ii}_${mm}${bb} = $dwcs(pv${ii}_${mm}${aa})\n" } } } } if {$dwcs(a_order) != {}} { append rr "A_ORDER = $dwcs(a_order)\n" } for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { if {$dwcs(a_${mm}_${nn}) != {}} { append rr "A_${mm}_${nn} = $dwcs(a_${mm}_${nn})\n" } } } if {$dwcs(b_order) != {}} { append rr "B_ORDER = $dwcs(b_order)\n" } for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { if {$dwcs(b_${mm}_${nn}) != {}} { append rr "B_${mm}_${nn} = $dwcs(b_${mm}_${nn})\n" } } } if {$dwcs(ap_order) != {}} { append rr "AP_ORDER = $dwcs(ap_order)\n" } for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { if {$dwcs(ap_${mm}_${nn}) != {}} { append rr "AP_${mm}_${nn} = $dwcs(ap_${mm}_${nn})\n" } } } if {$dwcs(bp_order) != {}} { append rr "BP_ORDER = $dwcs(bp_order)\n" } for {set mm 0} {$mm<6} {incr mm} { for {set nn 0} {$nn<6} {incr nn} { if {$dwcs(bp_${mm}_${nn}) != {}} { append rr "BP_${mm}_${nn} = $dwcs(bp_${mm}_${nn})\n" } } } return $rr } # Process Cmds proc ProcessWCSCmd {varname iname sock fn} { upvar $varname var upvar $iname i global wcs global current global rgb set item [string tolower [lindex $var $i]] switch -- $item { open {WCSDialog} close {WCSDestroyDialog} system { incr i set wcs(system) [string tolower [lindex $var $i]] UpdateWCS } sky { incr i set wcs(sky) [string tolower [lindex $var $i]] UpdateWCS } format - skyformat { incr i switch -- [string tolower [lindex $var $i]] { deg - degree - degrees {set wcs(skyformat) degrees} default {set wcs(skyformat) [string tolower [lindex $var $i]]} } UpdateWCS } align { incr i set current(align) [FromYesNo [lindex $var $i]] AlignWCSFrame } reset { set ext 1 set nn [lindex $var [expr $i+1]] if {[string is integer -strict $nn]} { incr i set ext $nn } RGBEvalLock rgb(lock,wcs) $current(frame) [list $current(frame) wcs reset $ext] UpdateWCS } replace - append { set ext 1 set nn [lindex $var [expr $i+1]] if {[string is integer -strict $nn]} { incr i set ext $nn } if {$sock != {}} { incr i if {[lindex $var $i] == {}} { RGBEvalLock rgb(lock,wcs) $current(frame) [list $current(frame) wcs $item $ext $sock] incr i -1 } else { RGBEvalLock rgb(lock,wcs) $current(frame) "$current(frame) wcs $item $ext \{\{[lindex $var $i]\}\}" } } elseif {$fn != {}} { RGBEvalLock rgb(lock,wcs) $current(frame) "$current(frame) wcs $item $ext \{\{$fn\}\}" } else { incr i if {[lindex $var $i] == "file"} { incr i } RGBEvalLock rgb(lock,wcs) $current(frame) "$current(frame) wcs $item $ext \{\{[lindex $var $i]\}\}" } UpdateWCS } fk4 - fk5 - icrs - galactic - ecliptic { set wcs(sky) $item UpdateWCS } degrees - sexagesimal { set wcs(skyformat) $item UpdateWCS } wcs - wcsa - wcsb - wcsc - wcsd - wcse - wcsf - wcsg - wcsh - wcsi - wcsj - wcsk - wcsl - wcsm - wcsn - wcso - wcsp - wcsq - wcsr - wcss - wcst - wcsu - wcsv - wcsw - wcsx - wcsy - wcsz { set wcs(system) $item UpdateWCS } } } proc ProcessSendWCSCmd {proc id param} { global current global wcs switch -- [string tolower $param] { align {$proc $id [ToYesNo $current(align)]} system {$proc $id "$wcs(system)\n"} sky {$proc $id "$wcs(sky)\n"} format - skyformat {$proc $id "$wcs(skyformat)\n"} default {$proc $id "$wcs(system)\n"} } } # backward compatibilty proc ProcessAlignCmd {varname iname} { upvar $varname var upvar $iname i global current switch -- [string tolower [lindex $var $i]] { yes - true - on - 1 - no - false - off - 0 { set current(align) [FromYesNo [lindex $var $i]] AlignWCSFrame } default { set current(align) 1 AlignWCSFrame incr i -1 } } } proc ProcessSendAlignCmd {proc id param} { global current $proc $id [ToYesNo $current(align)] } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/win32.tcl������������������������������������������������������������������������000755 �000765 �000000 �00000001136 12464211205 016176� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc Win32Print {} { global ds9 # we need to be realized RealizeDS9 # need the colorbar levels updated UpdateColormapLevel if {[win32 pm print begin [winfo width $ds9(canvas)] [winfo height $ds9(canvas)] yes]} { foreach f $ds9(frames) { $f win32 print } colorbar win32 print colorbarrgb win32 print win32 pm print end } } proc Win32PageSetup {} { win32 pm pagesetup } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/xmfbox.tcl�����������������������������������������������������������������������000644 �000765 �000000 �00000063435 12424000472 016544� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# xmfbox.tcl -- # # Implements the "Motif" style file selection dialog for the # Unix platform. This implementation is used only if the # "::tk_strictMotif" flag is set. # # Copyright (c) 1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Scriptics Corporation # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. namespace eval ::tk::dialog {} namespace eval ::tk::dialog::file {} # ::tk::MotifFDialog -- # # Implements a file dialog similar to the standard Motif file # selection box. # # Arguments: # type "open" or "save" # args Options parsed by the procedure. # # Results: # When -multiple is set to 0, this returns the absolute pathname # of the selected file. (NOTE: This is not the same as a single # element list.) # # When -multiple is set to > 0, this returns a Tcl list of absolute # pathnames. The argument for -multiple is ignored, but for consistency # with Windows it defines the maximum amount of memory to allocate for # the returned filenames. proc ::tk::MotifFDialog {type args} { variable ::tk::Priv set dataName __tk_filedialog upvar ::tk::dialog::file::$dataName data set w [MotifFDialog_Create $dataName $type $args] # Set a grab and claim the focus too. ::tk::SetFocusGrab $w $data(sEnt) $data(sEnt) selection range 0 end # Wait for the user to respond, then restore the focus and # return the index of the selected button. Restore the focus # before deleting the window, since otherwise the window manager # may take the focus away so we can't redirect it. Finally, # restore any grab that was in effect. vwait ::tk::Priv(selectFilePath) set result $Priv(selectFilePath) ::tk::RestoreFocusGrab $w $data(sEnt) withdraw return $result } # ::tk::MotifFDialog_Create -- # # Creates the Motif file dialog (if it doesn't exist yet) and # initialize the internal data structure associated with the # dialog. # # This procedure is used by ::tk::MotifFDialog to create the # dialog. It's also used by the test suite to test the Motif # file dialog implementation. User code shouldn't call this # procedure directly. # # Arguments: # dataName Name of the global "data" array for the file dialog. # type "Save" or "Open" # argList Options parsed by the procedure. # # Results: # Pathname of the file dialog. proc ::tk::MotifFDialog_Create {dataName type argList} { upvar ::tk::dialog::file::$dataName data MotifFDialog_Config $dataName $type $argList if {$data(-parent) eq "."} { set w .$dataName } else { set w $data(-parent).$dataName } # (re)create the dialog box if necessary # if {![winfo exists $w]} { MotifFDialog_BuildUI $w } elseif {[winfo class $w] ne "TkMotifFDialog"} { destroy $w MotifFDialog_BuildUI $w } else { set data(fEnt) $w.top.f1.ent set data(dList) $w.top.f2.a.l set data(fList) $w.top.f2.b.l set data(sEnt) $w.top.f3.ent set data(okBtn) $w.bot.ok set data(filterBtn) $w.bot.filter set data(cancelBtn) $w.bot.cancel } MotifFDialog_SetListMode $w # Dialog boxes should be transient with respect to their parent, # so that they will always stay on top of their parent window. However, # some window managers will create the window as withdrawn if the parent # window is withdrawn or iconified. Combined with the grab we put on the # window, this can hang the entire application. Therefore we only make # the dialog transient if the parent is viewable. if {[winfo viewable [winfo toplevel $data(-parent)]] } { wm transient $w $data(-parent) } MotifFDialog_FileTypes $w MotifFDialog_Update $w # Withdraw the window, then update all the geometry information # so we know how big it wants to be, then center the window in the # display (Motif style) and de-iconify it. ::tk::PlaceWindow $w wm title $w $data(-title) return $w } # ::tk::MotifFDialog_FileTypes -- # # Checks the -filetypes option. If present this adds a list of radio- # buttons to pick the file types from. # # Arguments: # w Pathname of the tk_get*File dialogue. # # Results: # none proc ::tk::MotifFDialog_FileTypes {w} { upvar ::tk::dialog::file::[winfo name $w] data set f $w.top.f3.types destroy $f # No file types: use "*" as the filter and display no radio-buttons if {$data(-filetypes) eq ""} { set data(filter) * return } # The filetypes radiobuttons # set data(fileType) $data(-defaulttype) # Default type to first entry set initialTypeName [lindex $data(-filetypes) 0 0] if {$data(-typevariable) ne ""} { upvar #0 $data(-typevariable) typeVariable if {[info exists typeVariable]} { set initialTypeName $typeVariable } } set ix 0 set data(fileType) 0 foreach fltr $data(-filetypes) { set fname [lindex $fltr 0] if {[string first $initialTypeName $fname] == 0} { set data(fileType) $ix break } incr ix } MotifFDialog_SetFilter $w [lindex $data(-filetypes) $data(fileType)] #don't produce radiobuttons for only one filetype if {[llength $data(-filetypes)] == 1} { return } ttk::frame $f set cnt 0 if {$data(-filetypes) ne {}} { foreach type $data(-filetypes) { set title [lindex [lindex $type 0] 0] set filter [lindex $type 1] ttk::radiobutton $f.b$cnt \ -text $title \ -variable ::tk::dialog::file::[winfo name $w](fileType) \ -value $cnt \ -command [list tk::MotifFDialog_SetFilter $w $type] pack $f.b$cnt -side left incr cnt } } $f.b$data(fileType) invoke pack $f -side bottom -fill both return } # This proc gets called whenever data(filter) is set # proc ::tk::MotifFDialog_SetFilter {w type} { upvar ::tk::dialog::file::[winfo name $w] data variable ::tk::Priv set data(filter) [lindex $type 1] set Priv(selectFileType) [lindex [lindex $type 0] 0] MotifFDialog_Update $w } # ::tk::MotifFDialog_Config -- # # Iterates over the optional arguments to determine the option # values for the Motif file dialog; gives default values to # unspecified options. # # Arguments: # dataName The name of the global variable in which # data for the file dialog is stored. # type "Save" or "Open" # argList Options parsed by the procedure. proc ::tk::MotifFDialog_Config {dataName type argList} { upvar ::tk::dialog::file::$dataName data set data(type) $type # 1: the configuration specs # set specs { {-defaultextension "" "" ""} {-filetypes "" "" ""} {-initialdir "" "" ""} {-initialfile "" "" ""} {-parent "" "" "."} {-title "" "" ""} {-typevariable "" "" ""} } if {$type eq "open"} { lappend specs {-multiple "" "" "0"} } if {$type eq "save"} { lappend specs {-confirmoverwrite "" "" "1"} } set data(-multiple) 0 set data(-confirmoverwrite) 1 # 2: default values depending on the type of the dialog # if {![info exists data(selectPath)]} { # first time the dialog has been popped up set data(selectPath) [pwd] set data(selectFile) "" } # 3: parse the arguments # tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList if {$data(-title) eq ""} { if {$type eq "open"} { if {$data(-multiple) != 0} { set data(-title) "[mc {Open Multiple Files}]" } else { set data(-title) [mc "Open"] } } else { set data(-title) [mc "Save As"] } } # 4: set the default directory and selection according to the -initial # settings # if {$data(-initialdir) ne ""} { if {[file isdirectory $data(-initialdir)]} { set data(selectPath) [lindex [glob $data(-initialdir)] 0] } else { set data(selectPath) [pwd] } # Convert the initialdir to an absolute path name. set old [pwd] cd $data(selectPath) set data(selectPath) [pwd] cd $old } set data(selectFile) $data(-initialfile) # 5. Parse the -filetypes option. It is not used by the motif # file dialog, but we check for validity of the value to make sure # the application code also runs fine with the TK file dialog. # set data(-filetypes) [::tk::FDGetFileTypes $data(-filetypes)] if {![info exists data(filter)]} { set data(filter) * } if {![winfo exists $data(-parent)]} { return -code error -errorcode [list TK LOOKUP WINDOW $data(-parent)] \ "bad window path name \"$data(-parent)\"" } } # ::tk::MotifFDialog_BuildUI -- # # Builds the UI components of the Motif file dialog. # # Arguments: # w Pathname of the dialog to build. # # Results: # None. proc ::tk::MotifFDialog_BuildUI {w} { set dataName [lindex [split $w .] end] upvar ::tk::dialog::file::$dataName data # Create the dialog toplevel and internal frames. # toplevel $w -class TkMotifFDialog set top [ttk::frame $w.top -relief raised -borderwidth 1] set bot [ttk::frame $w.bot -relief raised -borderwidth 1] pack $w.bot -side bottom -fill x pack $w.top -side top -expand yes -fill both set f1 [ttk::frame $top.f1] set f2 [ttk::frame $top.f2] set f3 [ttk::frame $top.f3] pack $f1 -side top -fill x pack $f3 -side bottom -fill x pack $f2 -expand yes -fill both set f2a [ttk::frame $f2.a] set f2b [ttk::frame $f2.b] grid $f2a -row 0 -column 0 -rowspan 1 -columnspan 1 -padx 4 -pady 4 \ -sticky news grid $f2b -row 0 -column 1 -rowspan 1 -columnspan 1 -padx 4 -pady 4 \ -sticky news grid rowconfigure $f2 0 -minsize 0 -weight 1 grid columnconfigure $f2 0 -minsize 0 -weight 1 grid columnconfigure $f2 1 -minsize 150 -weight 2 # The Filter box # bind [::tk::AmpWidget ttk::label $f1.lab -text [mc "Fil&ter:"] -anchor w] \ <<AltUnderlined>> [list focus $f1.ent] ttk::entry $f1.ent pack $f1.lab -side top -fill x -padx 6 -pady 4 pack $f1.ent -side top -fill x -padx 4 -pady 0 set data(fEnt) $f1.ent # The file and directory lists # set data(dList) [MotifFDialog_MakeSList $w $f2a \ [mc "&Directory:"] DList] set data(fList) [MotifFDialog_MakeSList $w $f2b \ [mc "Fi&les:"] FList] # The Selection box # bind [::tk::AmpWidget ttk::label $f3.lab -text [mc "&Selection:"] -anchor w] \ <<AltUnderlined>> [list focus $f3.ent] ttk::entry $f3.ent pack $f3.lab -side top -fill x -padx 6 -pady 0 pack $f3.ent -side top -fill x -padx 4 -pady 4 set data(sEnt) $f3.ent # The buttons # set maxWidth [::tk::mcmaxamp &OK &Filter &Cancel] set maxWidth [expr {$maxWidth<6?6:$maxWidth}] set data(okBtn) [::tk::AmpWidget ttk::button $bot.ok -text [mc "&OK"] \ -width $maxWidth \ -command [list tk::MotifFDialog_OkCmd $w]] set data(filterBtn) [::tk::AmpWidget ttk::button $bot.filter -text [mc "&Filter"] \ -width $maxWidth \ -command [list tk::MotifFDialog_FilterCmd $w]] set data(cancelBtn) [::tk::AmpWidget ttk::button $bot.cancel -text [mc "&Cancel"] \ -width $maxWidth \ -command [list tk::MotifFDialog_CancelCmd $w]] pack $bot.ok $bot.filter $bot.cancel -padx 10 -pady 10 -expand yes \ -side left # Create the bindings: # bind $w <Alt-Key> [list ::tk::AltKeyInDialog $w %A] bind $data(fEnt) <Return> [list tk::MotifFDialog_ActivateFEnt $w] bind $data(sEnt) <Return> [list tk::MotifFDialog_ActivateSEnt $w] bind $w <Escape> [list tk::MotifFDialog_CancelCmd $w] bind $w.bot <Destroy> {set ::tk::Priv(selectFilePath) {}} wm protocol $w WM_DELETE_WINDOW [list tk::MotifFDialog_CancelCmd $w] } proc ::tk::MotifFDialog_SetListMode {w} { upvar ::tk::dialog::file::[winfo name $w] data if {$data(-multiple) != 0} { set selectmode extended } else { set selectmode browse } set f $w.top.f2.b $f.l configure -selectmode $selectmode } # ::tk::MotifFDialog_MakeSList -- # # Create a scrolled-listbox and set the keyboard accelerator # bindings so that the list selection follows what the user # types. # # Arguments: # w Pathname of the dialog box. # f Frame widget inside which to create the scrolled # listbox. This frame widget already exists. # label The string to display on top of the listbox. # under Sets the -under option of the label. # cmdPrefix Specifies procedures to call when the listbox is # browsed or activated. proc ::tk::MotifFDialog_MakeSList {w f label cmdPrefix} { bind [::tk::AmpWidget ttk::label $f.lab -text $label -anchor w] \ <<AltUnderlined>> [list focus $f.l] listbox $f.l -width 12 -height 5 -exportselection 0\ -xscrollcommand [list $f.h set] -yscrollcommand [list $f.v set] ttk::scrollbar $f.v -orient vertical -takefocus 0 -command [list $f.l yview] ttk::scrollbar $f.h -orient horizontal -takefocus 0 -command [list $f.l xview] grid $f.lab -row 0 -column 0 -sticky news -rowspan 1 -columnspan 2 \ -padx 2 -pady 2 grid $f.l -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news grid $f.v -row 1 -column 1 -rowspan 1 -columnspan 1 -sticky news grid $f.h -row 2 -column 0 -rowspan 1 -columnspan 1 -sticky news grid rowconfigure $f 0 -weight 0 -minsize 0 grid rowconfigure $f 1 -weight 1 -minsize 0 grid columnconfigure $f 0 -weight 1 -minsize 0 # bindings for the listboxes # set list $f.l bind $list <<ListboxSelect>> [list tk::MotifFDialog_Browse$cmdPrefix $w] bind $list <Double-ButtonRelease-1> \ [list tk::MotifFDialog_Activate$cmdPrefix $w] bind $list <Return> "tk::MotifFDialog_Browse$cmdPrefix [list $w]; \ tk::MotifFDialog_Activate$cmdPrefix [list $w]" bindtags $list [list Listbox $list [winfo toplevel $list] all] ListBoxKeyAccel_Set $list return $f.l } # ::tk::MotifFDialog_InterpFilter -- # # Interpret the string in the filter entry into two components: # the directory and the pattern. If the string is a relative # pathname, give a warning to the user and restore the pattern # to original. # # Arguments: # w pathname of the dialog box. # # Results: # A list of two elements. The first element is the directory # specified # by the filter. The second element is the filter # pattern itself. proc ::tk::MotifFDialog_InterpFilter {w} { upvar ::tk::dialog::file::[winfo name $w] data set text [string trim [$data(fEnt) get]] # Perform tilde substitution # set badTilde 0 if {[string index $text 0] eq "~"} { set list [file split $text] set tilde [lindex $list 0] if {[catch {set tilde [glob $tilde]}]} { set badTilde 1 } else { set text [eval file join [concat $tilde [lrange $list 1 end]]] } } # If the string is a relative pathname, combine it # with the current selectPath. set relative 0 if {[file pathtype $text] eq "relative"} { set relative 1 } elseif {$badTilde} { set relative 1 } if {$relative} { tk_messageBox -icon warning -type ok \ -message "\"$text\" must be an absolute pathname" $data(fEnt) delete 0 end $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ $data(filter)] return [list $data(selectPath) $data(filter)] } set resolved [::tk::dialog::file::JoinFile [file dirname $text] [file tail $text]] if {[file isdirectory $resolved]} { set dir $resolved set fil $data(filter) } else { set dir [file dirname $resolved] set fil [file tail $resolved] } return [list $dir $fil] } # ::tk::MotifFDialog_Update # # Load the files and synchronize the "filter" and "selection" fields # boxes. # # Arguments: # w pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_Update {w} { upvar ::tk::dialog::file::[winfo name $w] data $data(fEnt) delete 0 end $data(fEnt) insert 0 \ [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)] $data(sEnt) delete 0 end $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ $data(selectFile)] MotifFDialog_LoadFiles $w } # ::tk::MotifFDialog_LoadFiles -- # # Loads the files and directories into the two listboxes according # to the filter setting. # # Arguments: # w pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_LoadFiles {w} { upvar ::tk::dialog::file::[winfo name $w] data $data(dList) delete 0 end $data(fList) delete 0 end set appPWD [pwd] if {[catch {cd $data(selectPath)}]} { cd $appPWD $data(dList) insert end ".." return } # Make the dir and file lists # # For speed we only have one glob, which reduces the file system # calls (good for slow NFS networks). # # We also do two smaller sorts (files + dirs) instead of one large sort, # which gives a small speed increase. # set top 0 set dlist "" set flist "" foreach f [glob -nocomplain .* *] { if {[file isdir ./$f]} { lappend dlist $f } else { foreach pat $data(filter) { if {[string match $pat $f]} { if {[string match .* $f]} { incr top } lappend flist $f break } } } } eval [list $data(dList) insert end] [lsort -dictionary $dlist] eval [list $data(fList) insert end] [lsort -dictionary $flist] # The user probably doesn't want to see the . files. We adjust the view # so that the listbox displays all the non-dot files $data(fList) yview $top cd $appPWD } # ::tk::MotifFDialog_BrowseDList -- # # This procedure is called when the directory list is browsed # (clicked-over) by the user. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_BrowseDList {w} { upvar ::tk::dialog::file::[winfo name $w] data focus $data(dList) if {[$data(dList) curselection] eq ""} { return } set subdir [$data(dList) get [$data(dList) curselection]] if {$subdir eq ""} { return } $data(fList) selection clear 0 end set list [MotifFDialog_InterpFilter $w] set data(filter) [lindex $list 1] switch -- $subdir { . { set newSpec [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)] } .. { set newSpec [::tk::dialog::file::JoinFile [file dirname $data(selectPath)] \ $data(filter)] } default { set newSpec [::tk::dialog::file::JoinFile [::tk::dialog::file::JoinFile \ $data(selectPath) $subdir] $data(filter)] } } $data(fEnt) delete 0 end $data(fEnt) insert 0 $newSpec } # ::tk::MotifFDialog_ActivateDList -- # # This procedure is called when the directory list is activated # (double-clicked) by the user. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_ActivateDList {w} { upvar ::tk::dialog::file::[winfo name $w] data if {[$data(dList) curselection] eq ""} { return } set subdir [$data(dList) get [$data(dList) curselection]] if {$subdir eq ""} { return } $data(fList) selection clear 0 end switch -- $subdir { . { set newDir $data(selectPath) } .. { set newDir [file dirname $data(selectPath)] } default { set newDir [::tk::dialog::file::JoinFile $data(selectPath) $subdir] } } set data(selectPath) $newDir MotifFDialog_Update $w if {$subdir ne ".."} { $data(dList) selection set 0 $data(dList) activate 0 } else { $data(dList) selection set 1 $data(dList) activate 1 } } # ::tk::MotifFDialog_BrowseFList -- # # This procedure is called when the file list is browsed # (clicked-over) by the user. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_BrowseFList {w} { upvar ::tk::dialog::file::[winfo name $w] data focus $data(fList) set data(selectFile) "" foreach item [$data(fList) curselection] { lappend data(selectFile) [$data(fList) get $item] } if {[llength $data(selectFile)] == 0} { return } $data(dList) selection clear 0 end $data(fEnt) delete 0 end $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ $data(filter)] # $data(fEnt) xview end # if it's a multiple selection box, just put in the filenames # otherwise put in the full path as usual $data(sEnt) delete 0 end if {$data(-multiple) != 0} { $data(sEnt) insert 0 $data(selectFile) } else { $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \ [lindex $data(selectFile) 0]] } # $data(sEnt) xview end } # ::tk::MotifFDialog_ActivateFList -- # # This procedure is called when the file list is activated # (double-clicked) by the user. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_ActivateFList {w} { upvar ::tk::dialog::file::[winfo name $w] data if {[$data(fList) curselection] eq ""} { return } set data(selectFile) [$data(fList) get [$data(fList) curselection]] if {$data(selectFile) eq ""} { return } else { MotifFDialog_ActivateSEnt $w } } # ::tk::MotifFDialog_ActivateFEnt -- # # This procedure is called when the user presses Return inside # the "filter" entry. It updates the dialog according to the # text inside the filter entry. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_ActivateFEnt {w} { upvar ::tk::dialog::file::[winfo name $w] data set list [MotifFDialog_InterpFilter $w] set data(selectPath) [lindex $list 0] set data(filter) [lindex $list 1] MotifFDialog_Update $w } # ::tk::MotifFDialog_ActivateSEnt -- # # This procedure is called when the user presses Return inside # the "selection" entry. It sets the ::tk::Priv(selectFilePath) # variable so that the vwait loop in tk::MotifFDialog will be # terminated. # # Arguments: # w The pathname of the dialog box. # # Results: # None. proc ::tk::MotifFDialog_ActivateSEnt {w} { variable ::tk::Priv upvar ::tk::dialog::file::[winfo name $w] data set selectFilePath [string trim [$data(sEnt) get]] if {$selectFilePath eq ""} { MotifFDialog_FilterCmd $w return } if {$data(-multiple) == 0} { set selectFilePath [list $selectFilePath] } if {[file isdirectory [lindex $selectFilePath 0]]} { set data(selectPath) [lindex [glob $selectFilePath] 0] set data(selectFile) "" MotifFDialog_Update $w return } set newFileList "" foreach item $selectFilePath { if {[file pathtype $item] ne "absolute"} { set item [file join $data(selectPath) $item] } elseif {![file exists [file dirname $item]]} { tk_messageBox -icon warning -type ok \ -message [mc {Directory "%1$s" does not exist.} \ [file dirname $item]] return } # we want to strip any filtering/ext/blocking instructions # from the file name set aa [string first "\[" $item] if {$aa > 0} { set fn [string range $item 0 [expr $aa-1]] } else { set fn $item } if {![file exists $fn]} { if {$data(type) eq "open"} { tk_messageBox -icon warning -type ok \ -message [mc {File "%1$s" does not exist.} $fn] return } } elseif {$data(type) eq "save" && $data(-confirmoverwrite)} { set message [format %s%s \ [mc "File \"%1\$s\" already exists.\n\n" $selectFilePath] \ [mc {Replace existing file?}]] set answer [tk_messageBox -icon warning -type yesno \ -message $message] if {$answer eq "no"} { return } } lappend newFileList $item } # Return selected filter if {[info exists data(-typevariable)] && $data(-typevariable) ne "" && [info exists data(-filetypes)] && $data(-filetypes) ne ""} { upvar #0 $data(-typevariable) typeVariable set typeVariable [lindex $data(-filetypes) $data(fileType) 0] } if {$data(-multiple) != 0} { set Priv(selectFilePath) $newFileList } else { set Priv(selectFilePath) [lindex $newFileList 0] } # Set selectFile and selectPath to first item in list set Priv(selectFile) [file tail [lindex $newFileList 0]] set Priv(selectPath) [file dirname [lindex $newFileList 0]] } proc ::tk::MotifFDialog_OkCmd {w} { upvar ::tk::dialog::file::[winfo name $w] data MotifFDialog_ActivateSEnt $w } proc ::tk::MotifFDialog_FilterCmd {w} { upvar ::tk::dialog::file::[winfo name $w] data MotifFDialog_ActivateFEnt $w } proc ::tk::MotifFDialog_CancelCmd {w} { variable ::tk::Priv set Priv(selectFilePath) "" set Priv(selectFile) "" set Priv(selectPath) "" } proc ::tk::ListBoxKeyAccel_Set {w} { bind Listbox <Any-KeyPress> "" bind $w <Destroy> [list tk::ListBoxKeyAccel_Unset $w] bind $w <Any-KeyPress> [list tk::ListBoxKeyAccel_Key $w %A] } proc ::tk::ListBoxKeyAccel_Unset {w} { variable ::tk::Priv catch {after cancel $Priv(lbAccel,$w,afterId)} unset -nocomplain Priv(lbAccel,$w) Priv(lbAccel,$w,afterId) } # ::tk::ListBoxKeyAccel_Key-- # # This procedure maintains a list of recently entered keystrokes # over a listbox widget. It arranges an idle event to move the # selection of the listbox to the entry that begins with the # keystrokes. # # Arguments: # w The pathname of the listbox. # key The key which the user just pressed. # # Results: # None. proc ::tk::ListBoxKeyAccel_Key {w key} { variable ::tk::Priv if { $key eq "" } { return } append Priv(lbAccel,$w) $key ListBoxKeyAccel_Goto $w $Priv(lbAccel,$w) catch { after cancel $Priv(lbAccel,$w,afterId) } set Priv(lbAccel,$w,afterId) [after 500 \ [list tk::ListBoxKeyAccel_Reset $w]] } proc ::tk::ListBoxKeyAccel_Goto {w string} { variable ::tk::Priv set string [string tolower $string] set end [$w index end] set theIndex -1 for {set i 0} {$i < $end} {incr i} { set item [string tolower [$w get $i]] if {[string compare $string $item] >= 0} { set theIndex $i } if {[string compare $string $item] <= 0} { set theIndex $i break } } if {$theIndex >= 0} { $w selection clear 0 end $w selection set $theIndex $theIndex $w activate $theIndex $w see $theIndex event generate $w <<ListboxSelect>> } } proc ::tk::ListBoxKeyAccel_Reset {w} { variable ::tk::Priv unset -nocomplain Priv(lbAccel,$w) } proc ::tk_getFileType {} { variable ::tk::Priv return $Priv(selectFileType) } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/library/xpa.tcl��������������������������������������������������������������������������000644 �000765 �000000 �00000133167 12574043075 016045� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Copyright (C) 1999-2015 # Smithsonian Astrophysical Observatory, Cambridge, MA, USA # For conditions of distribution and use, see copyright notice in "copyright" package provide DS9 1.0 proc InitXPA {} { global ds9 global pds9 global env if {!$pds9(xpa)} { return } # this is needed # if there is a problem (usually with VPN), XPA will hang # so preempt and set to local before XPAINIT if {[info exists env(XPA_METHOD)]} { if {$env(XPA_METHOD) != {local}} { if {[checkdns {} 5]} { set env(XPA_METHOD) local Error [msgcat::mc {XPA unable to verify hostname, setting XPA_METHOD to LOCAL}] } } } else { if {[checkdns {} 5]} { set env(XPA_METHOD) local Error [msgcat::mc {XPA unable to verify hostname, setting XPA_METHOD to LOCAL}] } } switch -- $ds9(wm) { x11 {} aqua {set env(PATH) "$ds9(root):$env(PATH)"} win32 {} } catch {CreateXPA} UpdateFileMenu } proc CreateXPA {} { global xpa global ds9 set xpa [xpacmdnew "DS9" $ds9(title)] xpacmdadd $xpa 2mass \ {} \ XPASend2MASS {} {} \ XPARcvd2MASS {} "fillbuf=false" xpacmdadd $xpa 3d \ {} \ XPASend3D {} {} \ XPARcvd3D {} "fillbuf=false" xpacmdadd $xpa 3D \ {} \ XPASend3D {} {} \ XPARcvd3D {} "fillbuf=false" xpacmdadd $xpa about \ {} \ XPASendAbout {} {} \ {} {} {} xpacmdadd $xpa align \ {} \ XPASendAlign {} {} \ XPARcvdAlign {} {} xpacmdadd $xpa analysis \ {} \ XPASendAnalysis {} {} \ XPARcvdAnalysis {} {} xpacmdadd $xpa array \ {} \ XPASendArray {} {} \ XPARcvdArray {} "fillbuf=false" xpacmdadd $xpa background \ {} \ XPASendBg {} {} \ XPARcvdBg {} {} xpacmdadd $xpa backup \ {} \ {} {} {} \ XPARcvdBackup {} {} xpacmdadd $xpa bg \ {} \ XPASendBg {} {} \ XPARcvdBg {} {} xpacmdadd $xpa blink \ {} \ XPASendBlink {} {} \ XPARcvdBlink {} "fillbuf=false" xpacmdadd $xpa bin \ {} \ XPASendBin {} {} \ XPARcvdBin {} "fillbuf=false" xpacmdadd $xpa block \ {} \ XPASendBlock {} {} \ XPARcvdBlock {} "fillbuf=false" xpacmdadd $xpa cat \ {} \ XPASendCAT {} {} \ XPARcvdCAT {} "fillbuf=false" xpacmdadd $xpa catalog \ {} \ XPASendCAT {} {} \ XPARcvdCAT {} "fillbuf=false" xpacmdadd $xpa cd \ {} \ XPASendCD {} {} \ XPARcvdCD {} "fillbuf=false" xpacmdadd $xpa cmap \ {} \ XPASendCmap {} {} \ XPARcvdCmap {} "fillbuf=false" xpacmdadd $xpa colorbar \ {} \ XPASendColorbar {} {} \ XPARcvdColorbar {} "fillbuf=false" xpacmdadd $xpa console \ {} \ {} {} {} \ XPARcvdConsole {} "fillbuf=false" xpacmdadd $xpa contour \ {} \ XPASendContour {} {} \ XPARcvdContour {} "fillbuf=false" xpacmdadd $xpa contours \ {} \ XPASendContour {} {} \ XPARcvdContour {} "fillbuf=false" xpacmdadd $xpa crop \ {} \ XPASendCrop {} {} \ XPARcvdCrop {} "fillbuf=false" xpacmdadd $xpa crosshair \ {} \ XPASendCrosshair {} {} \ XPARcvdCrosshair {} "fillbuf=false" xpacmdadd $xpa cube \ {} \ XPASendCube {} {} \ XPARcvdCube {} "fillbuf=false" xpacmdadd $xpa cursor \ {} \ {} {} {} \ XPARcvdCursor {} "fillbuf=false" xpacmdadd $xpa data \ {} \ XPASendData {} {} \ {} {} {} xpacmdadd $xpa datacube \ {} \ XPASendCube {} {} \ XPARcvdCube {} "fillbuf=false" xpacmdadd $xpa dss \ {} \ XPASendSAO {} {} \ XPARcvdSAO {} "fillbuf=false" xpacmdadd $xpa dsssao \ {} \ XPASendSAO {} {} \ XPARcvdSAO {} "fillbuf=false" xpacmdadd $xpa dsseso \ {} \ XPASendESO {} {} \ XPARcvdESO {} "fillbuf=false" xpacmdadd $xpa dssstsci \ {} \ XPASendSTSCI {} {} \ XPARcvdSTSCI {} "fillbuf=false" xpacmdadd $xpa envi \ {} \ {} {} {} \ XPARcvdENVI {} "fillbuf=false" xpacmdadd $xpa exit \ {} \ {} {} {} \ XPARcvdExit {} "fillbuf=false" xpacmdadd $xpa export \ {} \ {} {} {} \ XPARcvdExport {} "fillbuf=false" xpacmdadd $xpa file \ {} \ XPASendFile {} {} \ XPARcvdFile {} "fillbuf=false" xpacmdadd $xpa first \ {} \ XPASendVLA {} {} \ XPARcvdVLA {} "fillbuf=false" xpacmdadd $xpa fits \ {} \ XPASendFits {} "fillbuf=false" \ XPARcvdFits {} "fillbuf=false" xpacmdadd $xpa frame \ {} \ XPASendFrame {} {} \ XPARcvdFrame {} "fillbuf=false" xpacmdadd $xpa gif \ {} \ XPASendGIF {} {} \ XPARcvdGIF {} "fillbuf=false" xpacmdadd $xpa grid \ {} \ XPASendGrid {} {} \ XPARcvdGrid {} "fillbuf=false" xpacmdadd $xpa header \ {} \ {} {} {} \ XPARcvdHeader {} "fillbuf=false" xpacmdadd $xpa height \ {} \ XPASendHeight {} {} \ XPARcvdHeight {} "fillbuf=false" xpacmdadd $xpa iconify \ {} \ XPASendIconify {} {} \ XPARcvdIconify {} "fillbuf=false" xpacmdadd $xpa iexam \ {} \ XPASendIExam {} {} \ {} {} {} xpacmdadd $xpa iis \ {} \ XPASendIIS {} {} \ XPARcvdIIS {} "fillbuf=false" # backward compatibility xpacmdadd $xpa imexam \ {} \ XPASendIExam {} {} \ {} {} {} xpacmdadd $xpa jpg \ {} \ XPASendJPEG {} {} \ XPARcvdJPEG {} "fillbuf=false" xpacmdadd $xpa jpeg \ {} \ XPASendJPEG {} {} \ XPARcvdJPEG {} "fillbuf=false" xpacmdadd $xpa lock \ {} \ XPASendLock {} {} \ XPARcvdLock {} "fillbuf=false" xpacmdadd $xpa lower \ {} \ {} {} {} \ XPARcvdLower {} "fillbuf=false" xpacmdadd $xpa magnifier \ {} \ XPASendMagnifier {} {} \ XPARcvdMagnifier {} "fillbuf=false" xpacmdadd $xpa mask \ {} \ XPASendMask {} {} \ XPARcvdMask {} "fillbuf=false" xpacmdadd $xpa match \ {} \ {} {} {} \ XPARcvdMatch {} "fillbuf=false" xpacmdadd $xpa mecube \ {} \ XPASendMECube {} "fillbuf=false" \ XPARcvdMECube {} "fillbuf=false" xpacmdadd $xpa memf \ {} \ {} {} {} \ XPARcvdMultiFrame {} "fillbuf=false" xpacmdadd $xpa minmax \ {} \ XPASendMinMax {} {} \ XPARcvdMinMax {} "fillbuf=false" xpacmdadd $xpa mode \ {} \ XPASendMode {} {} \ XPARcvdMode {} "fillbuf=false" xpacmdadd $xpa mosaic \ {} \ XPASendMosaic {} {} \ XPARcvdMosaic {} "fillbuf=false" xpacmdadd $xpa mosaicimage \ {} \ XPASendMosaicImage {} {} \ XPARcvdMosaicImage {} "fillbuf=false" # backward compatibility xpacmdadd $xpa mosaicwcs \ {} \ XPASendMosaicWCS {} {} \ XPARcvdMosaicWCS {} "fillbuf=false" # backward compatibility xpacmdadd $xpa mosaiciraf \ {} \ {} {} {} \ XPARcvdMosaicIRAF {} "fillbuf=false" # backward compatibility xpacmdadd $xpa mosaicimagewcs \ {} \ XPASendMosaicImageWCS {} {} \ XPARcvdMosaicImageWCS {} "fillbuf=false" # backward compatibility xpacmdadd $xpa mosaicimageiraf \ {} \ {} {} {} \ XPARcvdMosaicImageIRAF {} "fillbuf=false" # backward compatibility xpacmdadd $xpa mosaicimagewfpc2 \ {} \ {} {} {} \ XPARcvdMosaicImageWFPC2 {} "fillbuf=false" xpacmdadd $xpa multiframe \ {} \ {} {} {} \ XPARcvdMultiFrame {} "fillbuf=false" xpacmdadd $xpa movie \ {} \ {} {} {} \ XPARcvdMovie {} "fillbuf=false" xpacmdadd $xpa nameserver \ {} \ XPASendNRES {} {} \ XPARcvdNRES {} "fillbuf=false" xpacmdadd $xpa nan \ {} \ XPASendNan {} {} \ XPARcvdNan {} {} xpacmdadd $xpa nrrd \ {} \ XPASendNRRD {} {} \ XPARcvdNRRD {} "fillbuf=false" xpacmdadd $xpa nvss \ {} \ XPASendNVSS {} {} \ XPARcvdNVSS {} "fillbuf=false" xpacmdadd $xpa orient \ {} \ XPASendOrient {} {} \ XPARcvdOrient {} "fillbuf=false" xpacmdadd $xpa {page setup} \ {} \ XPASendPageSetup {} {} \ XPARcvdPageSetup {} "fillbuf=false" xpacmdadd $xpa pagesetup \ {} \ XPASendPageSetup {} {} \ XPARcvdPageSetup {} "fillbuf=false" xpacmdadd $xpa pspagesetup \ {} \ XPASendPSPageSetup {} {} \ XPARcvdPSPageSetup {} "fillbuf=false" xpacmdadd $xpa pan \ {} \ XPASendPan {} {} \ XPARcvdPan {} "fillbuf=false" xpacmdadd $xpa pixeltable \ {} \ XPASendPixelTable {} {} \ XPARcvdPixelTable {} "fillbuf=false" xpacmdadd $xpa plot \ {} \ XPASendPlot {} {} \ XPARcvdPlot {} {} xpacmdadd $xpa png \ {} \ XPASendPNG {} {} \ XPARcvdPNG {} "fillbuf=false" xpacmdadd $xpa prefs \ {} \ XPASendPrefs {} {} \ XPARcvdPrefs {} "fillbuf=false" xpacmdadd $xpa preserve \ {} \ XPASendPreserve {} {} \ XPARcvdPreserve {} "fillbuf=false" xpacmdadd $xpa print \ {} \ XPASendPrint {} {} \ XPARcvdPrint {} "fillbuf=false" xpacmdadd $xpa psprint \ {} \ XPASendPSPrint {} {} \ XPARcvdPSPrint {} "fillbuf=false" xpacmdadd $xpa quit \ {} \ {} {} {} \ XPARcvdExit {} "fillbuf=false" xpacmdadd $xpa raise \ {} \ {} {} {} \ XPARcvdRaise {} "fillbuf=false" xpacmdadd $xpa region \ {} \ XPASendRegions {} {} \ XPARcvdRegions {} "fillbuf=false" xpacmdadd $xpa regions \ {} \ XPASendRegions {} {} \ XPARcvdRegions {} "fillbuf=false" xpacmdadd $xpa restore \ {} \ {} {} {} \ XPARcvdRestore {} {} xpacmdadd $xpa rgb \ {} \ XPASendRGB {} {} \ XPARcvdRGB {} "fillbuf=false" xpacmdadd $xpa rgbarray \ {} \ XPASendRGBArray {} {} \ XPARcvdRGBArray {} "fillbuf=false" xpacmdadd $xpa rgbcube \ {} \ XPASendRGBCube {} {} \ XPARcvdRGBCube {} "fillbuf=false" xpacmdadd $xpa rgbimage \ {} \ XPASendRGBImage {} {} \ XPARcvdRGBImage {} "fillbuf=false" xpacmdadd $xpa rotate \ {} \ XPASendRotate {} {} \ XPARcvdRotate {} "fillbuf=false" xpacmdadd $xpa samp \ {} \ {} {} {} \ XPARcvdSAMP {} "fillbuf=false" xpacmdadd $xpa save \ {} \ {} {} {} \ XPARcvdSave {} "fillbuf=false" xpacmdadd $xpa saveimage \ {} \ {} {} {} \ XPARcvdSaveImage {} "fillbuf=false" # backward compatibility xpacmdadd $xpa savefits \ {} \ {} {} {} \ XPARcvdSave {} "fillbuf=false" # backward compatibility xpacmdadd $xpa savempeg \ {} \ {} {} {} \ XPARcvdMovie {} "fillbuf=false" xpacmdadd $xpa scale \ {} \ XPASendScale {} {} \ XPARcvdScale {} "fillbuf=false" # backward compatibility xpacmdadd $xpa sfits \ {} \ {} {} {} \ XPARcvdSFits {} "fillbuf=false" xpacmdadd $xpa single \ {} \ XPASendSingle {} {} \ XPARcvdSingle {} "fillbuf=false" xpacmdadd $xpa shm \ {} \ XPASendShm {} {} \ XPARcvdShm {} "fillbuf=false" xpacmdadd $xpa skyview \ {} \ XPASendSkyView {} {} \ XPARcvdSkyView {} "fillbuf=false" xpacmdadd $xpa sleep \ {} \ {} {} {} \ XPARcvdSleep {} "fillbuf=false" xpacmdadd $xpa slice \ {} \ XPASendCube {} {} \ XPARcvdCube {} "fillbuf=false" # backward compatibility xpacmdadd $xpa smosaic \ {} \ {} {} {} \ XPARcvdSMosaic {} "fillbuf=false" # backward compatibility xpacmdadd $xpa smosaicwcs \ {} \ {} {} {} \ XPARcvdSMosaicWCS {} "fillbuf=false" # backward compatibility xpacmdadd $xpa smosaiciraf \ {} \ {} {} {} \ XPARcvdSMosaicIRAF {} "fillbuf=false" xpacmdadd $xpa smooth \ {} \ XPASendSmooth {} {} \ XPARcvdSmooth {} "fillbuf=false" xpacmdadd $xpa source \ {} \ {} {} {} \ XPARcvdSource {} "fillbuf=false" # backward compatibility xpacmdadd $xpa srgbcube \ {} \ {} {} {} \ XPARcvdSRGBCube {} "fillbuf=false" xpacmdadd $xpa tcl \ {} \ {} {} {} \ XPARcvdTcl {} {} # backward compatibility xpacmdadd $xpa theme \ {} \ XPASendTheme {} {} \ XPARcvdTheme {} "fillbuf=false" xpacmdadd $xpa threads \ {} \ XPASendThreads {} {} \ XPARcvdThreads {} {} xpacmdadd $xpa tif \ {} \ XPASendTIFF {} {} \ XPARcvdTIFF {} "fillbuf=false" xpacmdadd $xpa tiff \ {} \ XPASendTIFF {} {} \ XPARcvdTIFF {} "fillbuf=false" xpacmdadd $xpa tile \ {} \ XPASendTile {} {} \ XPARcvdTile {} "fillbuf=false" xpacmdadd $xpa update \ {} \ {} {} {} \ XPARcvdUpdate {} "fillbuf=false" xpacmdadd $xpa url \ {} \ {} {} {} \ XPARcvdURLFits {} {} xpacmdadd $xpa version \ {} \ XPASendVersion {} {} \ {} {} {} xpacmdadd $xpa view \ {} \ XPASendView {} {} \ XPARcvdView {} "fillbuf=false" xpacmdadd $xpa vla \ {} \ XPASendVLA {} {} \ XPARcvdVLA {} "fillbuf=false" xpacmdadd $xpa vo \ {} \ XPASendVO {} {} \ XPARcvdVO {} "fillbuf=false" xpacmdadd $xpa wcs \ {} \ XPASendWCS {} {} \ XPARcvdWCS {} "fillbuf=false" xpacmdadd $xpa web \ {} \ XPASendWeb {} {} \ XPARcvdWeb {} "fillbuf=false" xpacmdadd $xpa width \ {} \ XPASendWidth {} {} \ XPARcvdWidth {} "fillbuf=false" xpacmdadd $xpa zscale \ {} \ XPASendZScale {} {} \ XPARcvdZScale {} "fillbuf=false" xpacmdadd $xpa zoom \ {} \ XPASendZoom {} {} \ XPARcvdZoom {} "fillbuf=false" } proc XPASend2MASS {xpa cdata param} { InitError xpa catch {ProcessSend2MASSCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvd2MASS {xpa cdata param buf len} { XPADebug "XPARcvd2MASS" $param InitError xpa catch {set i 0; Process2MASSCmd param i} XPACatchError $xpa } proc XPASend3D {xpa cdata param} { InitError xpa catch {ProcessSend3DCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvd3D {xpa cdata param buf len} { XPADebug "XPARcvd3D" $param InitError xpa catch {set i 0; Process3DCmd param i} XPACatchError $xpa } proc XPASendAbout {xpa cdata param} { InitError xpa catch {ProcessSendAboutCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPASendAlign {xpa cdata param} { InitError xpa catch {ProcessSendAlignCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdAlign {xpa cdata param buf len} { XPADebug "XPARcvdAlign" $param InitError xpa catch {set i 0; ProcessAlignCmd param i} XPACatchError $xpa } proc XPASendAnalysis {xpa cdata param} { InitError xpa catch {ProcessSendAnalysisCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPARcvdAnalysis {xpa cdata param buf len} { XPADebug "XPARcvdAnalysis" $param InitError xpa catch {set i 0; ProcessAnalysisCmd param i $buf {}} XPACatchError $xpa } proc XPASendArray {xpa cdata param} { InitError xpa catch {ProcessSendArrayCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdArray {xpa cdata param buf len} { XPADebug "XPARcvdArray" $param InitError xpa catch {set i 0; ProcessArrayCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendBg {xpa cdata param} { InitError xpa catch {ProcessSendBgCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdBg {xpa cdata param buf len} { XPADebug "XPARcvdBg" $param InitError xpa catch {set i 0; ProcessBgCmd param i} XPACatchError $xpa } proc XPARcvdBackup {xpa cdata param buf len} { XPADebug "XPARcvdBackup" $param InitError xpa catch {set i 0; ProcessBackupCmd param i} XPACatchError $xpa } proc XPASendBlink {xpa cdata param} { InitError xpa catch {ProcessSendBlinkCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdBlink {xpa cdata param buf len} { XPADebug "XPARcvdBlink" $param InitError xpa catch {set i 0; ProcessBlinkCmd param i} XPACatchError $xpa } proc XPASendBin {xpa cdata param} { InitError xpa catch {ProcessSendBinCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdBin {xpa cdata param buf len} { XPADebug "XPARcvdBin" $param InitError xpa catch {set i 0; ProcessBinCmd param i} XPACatchError $xpa } proc XPASendBlock {xpa cdata param} { InitError xpa catch {ProcessSendBlockCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdBlock {xpa cdata param buf len} { XPADebug "XPARcvdBlock" $param InitError xpa catch {set i 0; ProcessBlockCmd param i} XPACatchError $xpa } proc XPASendCAT {xpa cdata param} { InitError xpa catch {ProcessSendCatalogCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPARcvdCAT {xpa cdata param buf len} { XPADebug "XPARcvdCat" $param InitError xpa catch {set i 0; ProcessCatalogCmd param i} XPACatchError $xpa } proc XPASendCD {xpa cdata param} { InitError xpa catch {ProcessSendCDCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdCD {xpa cdata param buf len} { XPADebug "XPARcvdCD" $param InitError xpa catch {set i 0; ProcessCDCmd param i} XPACatchError $xpa } proc XPARcvdConsole {xpa cdata param buf len} { XPADebug "XPARcvdConsole" $param InitError xpa catch {set i 0; ProcessConsoleCmd param i} XPACatchError $xpa } proc XPASendContour {xpa cdata param} { InitError xpa catch {ProcessSendContourCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPARcvdContour {xpa cdata param buf len} { XPADebug "XPARcvdContour" $param InitError xpa catch {set i 0; ProcessContourCmd param i} XPACatchError $xpa } proc XPASendCmap {xpa cdata param} { InitError xpa catch {ProcessSendCmapCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdCmap {xpa cdata param buf len} { XPADebug "XPARcvdCmap" $param InitError xpa catch {set i 0; ProcessCmapCmd param i} XPACatchError $xpa } proc XPASendColorbar {xpa cdata param} { InitError xpa catch {ProcessSendColorbarCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdColorbar {xpa cdata param buf len} { XPADebug "XPARcvdColorbar" $param InitError xpa catch {set i 0; ProcessColorbarCmd param i} XPACatchError $xpa } proc XPASendCrop {xpa cdata param} { InitError xpa catch {ProcessSendCropCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdCrop {xpa cdata param buf len} { XPADebug "XPARcvdCrop" $param InitError xpa catch {set i 0; ProcessCropCmd param i} XPACatchError $xpa } proc XPASendCrosshair {xpa cdata param} { InitError xpa catch {ProcessSendCrosshairCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdCrosshair {xpa cdata param buf len} { XPADebug "XPARcvdCrosshair" $param InitError xpa catch {set i 0; ProcessCrosshairCmd param i} XPACatchError $xpa } proc XPASendCube {xpa cdata param} { InitError xpa catch {ProcessSendCubeCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdCube {xpa cdata param buf len} { XPADebug "XPARcvdCube" $param InitError xpa catch {set i 0; ProcessCubeCmd param i} XPACatchError $xpa } proc XPARcvdCursor {xpa cdata param buf len} { XPADebug "XPARcvdCursor" $param InitError xpa catch {set i 0; ProcessCursorCmd param i} XPACatchError $xpa } proc XPASendData {xpa cdata param} { InitError xpa catch {ProcessSendDataCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPASendSAO {xpa cdata param} { InitError xpa catch {ProcessSendSAOCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdSAO {xpa cdata param buf len} { XPADebug "XPARcvdSAO" $param InitError xpa catch {set i 0; ProcessSAOCmd param i} XPACatchError $xpa } proc XPASendESO {xpa cdata param} { InitError xpa catch {ProcessSendESOCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdESO {xpa cdata param buf len} { XPADebug "XPARcvdESO" $param InitError xpa catch {set i 0; ProcessESOCmd param i} XPACatchError $xpa } proc XPASendSTSCI {xpa cdata param} { InitError xpa catch {ProcessSendSTSCICmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdSTSCI {xpa cdata param buf len} { XPADebug "XPARcvdSTSCI" $param InitError xpa catch {set i 0; ProcessSTSCICmd param i} XPACatchError $xpa } proc XPARcvdENVI {xpa cdata param buf len} { XPADebug "XPARcvdENVI" $param InitError xpa catch {set i 0; ProcessENVICmd param i {} {}} XPACatchError $xpa } proc XPARcvdExit {xpa cdata param buf len} { XPADebug "XPARcvdExit" $param InitError xpa catch {set i 0; ProcessQuitCmd param i} XPACatchError $xpa } proc XPARcvdExport {xpa cdata param buf len} { XPADebug "XPARcvdExport" $param InitError xpa catch {set i 0; ProcessExportCmd param i} XPACatchError $xpa } proc XPASendFile {xpa cdata param} { InitError xpa catch {ProcessSendFileCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdFile {xpa cdata param buf len} { XPADebug "XPARcvdFile" $param InitError xpa catch { # do not send socket as it does not contain data, only filenames set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessFileCmd param i {} [xparec $xpa datachan] {}} {Windows NT} {ProcessFileCmd param i {} dummy {}} } } XPACatchError $xpa } proc XPASendFits {xpa cdata param} { InitError xpa catch {ProcessSendFitsCmd xpasetbuf $xpa $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdFits {xpa cdata param buf len} { XPADebug "XPARcvdFits" $param InitError xpa catch {set i 0; ProcessFitsCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendFrame {xpa cdata param} { InitError xpa catch {ProcessSendFrameCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdFrame {xpa cdata param buf len} { XPADebug "XPARcvdFrame" $param InitError xpa catch {set i 0; ProcessFrameCmd param i} XPACatchError $xpa } proc XPASendGIF {xpa cdata param} { InitError xpa catch { global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessSendGIFCmd {} {} $param [xparec $xpa datachan] {}} {Windows NT} {ProcessSendGIFCmd {} {} $param dummy {}} } } XPACatchError $xpa } proc XPARcvdGIF {xpa cdata param buf len} { XPADebug "XPARcvdGIF" $param InitError xpa catch { set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessGIFCmd param i [xparec $xpa datachan] {}} {Windows NT} {ProcessGIFCmd param i dummy {}} } } XPACatchError $xpa } proc XPASendGrid {xpa cdata param} { InitError xpa catch {ProcessSendGridCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdGrid {xpa cdata param buf len} { XPADebug "XPARcvdGrid" $param InitError xpa catch {set i 0; ProcessGridCmd param i} XPACatchError $xpa } proc XPARcvdHeader {xpa cdata param buf len} { XPADebug "XPARcvdHeader" $param InitError xpa catch {set i 0; ProcessHeaderCmd param i} XPACatchError $xpa } proc XPASendHeight {xpa cdata param} { InitError xpa catch {ProcessSendHeightCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdHeight {xpa cdata param buf len} { XPADebug "XPARcvdHeight" $param InitError xpa catch {set i 0; ProcessHeightCmd param i} XPACatchError $xpa } proc XPASendIconify {xpa cdata param} { InitError xpa catch {ProcessSendIconifyCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdIconify {xpa cdata param buf len} { XPADebug "XPARcvdIconify" $param InitError xpa catch {set i 0; ProcessIconifyCmd param i} XPACatchError $xpa } proc XPASendIExam {xpa cdata param} { InitError xpa catch {ProcessSendIExamCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPASendIIS {xpa cdata param} { InitError xpa catch {ProcessSendIISCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdIIS {xpa cdata param buf len} { XPADebug "XPARcvdIIS" $param InitError xpa catch {set i 0; ProcessIISCmd param i} XPACatchError $xpa } proc XPASendJPEG {xpa cdata param} { InitError xpa catch { global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessSendJPEGCmd {} {} $param [xparec $xpa datachan] {}} {Windows NT} {ProcessSendJPEGCmd {} {} $param dummy {}} } } XPACatchError $xpa } proc XPARcvdJPEG {xpa cdata param buf len} { XPADebug "XPARcvdJPEG" $param InitError xpa catch { set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessJPEGCmd param i [xparec $xpa datachan] {}} {Windows NT} {ProcessJPEGCmd param i dummy {}} } } XPACatchError $xpa } proc XPASendLock {xpa cdata param} { InitError xpa catch {ProcessSendLockCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdLock {xpa cdata param buf len} { XPADebug "XPARcvdLock" $param InitError xpa catch {set i 0; ProcessLockCmd param i} XPACatchError $xpa } proc XPARcvdLower {xpa cdata param buf len} { XPADebug "XPARcvdLower" $param InitError xpa catch {set i 0; ProcessLowerCmd param i} XPACatchError $xpa } proc XPASendMagnifier {xpa cdata param} { InitError xpa catch {ProcessSendMagnifierCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdMagnifier {xpa cdata param buf len} { XPADebug "XPARcvdMagnifier" $param InitError xpa catch {set i 0; ProcessMagnifierCmd param i} XPACatchError $xpa } proc XPASendMask {xpa cdata param} { InitError xpa catch {ProcessSendMaskCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdMask {xpa cdata param buf len} { XPADebug "XPARcvdMask" $param InitError xpa catch {set i 0; ProcessMaskCmd param i} XPACatchError $xpa } proc XPARcvdMatch {xpa cdata param buf len} { XPADebug "XPARcvdMatch" $param InitError xpa catch {set i 0; ProcessMatchCmd param i} XPACatchError $xpa } proc XPASendMECube {xpa cdata param} { InitError xpa catch {ProcessSendMECubeCmd xpasetbuf $xpa $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdMECube {xpa cdata param buf len} { XPADebug "XPARcvdMECube" $param InitError xpa catch {set i 0; ProcessMECubeCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendMinMax {xpa cdata param} { InitError xpa catch {ProcessSendMinMaxCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdMinMax {xpa cdata param buf len} { XPADebug "XPARcvdMinMax" $param InitError xpa catch {set i 0; ProcessMinMaxCmd param i} XPACatchError $xpa } proc XPASendMode {xpa cdata param} { InitError xpa catch {ProcessSendModeCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdMode {xpa cdata param buf len} { XPADebug "XPARcvdMode" $param InitError xpa catch {set i 0; ProcessModeCmd param i} XPACatchError $xpa } proc XPASendMosaic {xpa cdata param} { InitError xpa catch {ProcessSendMosaicCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdMosaic {xpa cdata param buf len} { XPADebug "XPARcvdMosaic" $param InitError xpa catch {set i 0; ProcessMosaicCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendMosaicImage {xpa cdata param} { InitError xpa catch {ProcessSendMosaicImageCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdMosaicImage {xpa cdata param buf len} { XPADebug "XPARcvdMosaicImage" $param InitError xpa catch {set i 0; ProcessMosaicImageCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPASendMosaicWCS {xpa cdata param} { InitError xpa catch {ProcessSendMosaicWCSCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdMosaicWCS {xpa cdata param buf len} { XPADebug "XPARcvdMosaicWCS" $param InitError xpa catch {set i 0; ProcessMosaicWCSCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdMosaicIRAF {xpa cdata param buf len} { XPADebug "XPARcvdMosaicIRAF" $param InitError xpa catch {set i 0; ProcessMosaicIRAFCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPASendMosaicImageWCS {xpa cdata param} { InitError xpa catch {ProcessSendMosaicImageWCSCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdMosaicImageWCS {xpa cdata param buf len} { XPADebug "XPARcvdMosaicImageWCS" $param InitError xpa catch {set i 0; ProcessMosaicImageWCSCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdMosaicImageIRAF {xpa cdata param buf len} { XPADebug "XPARcvdMosaicImageIRAF" $param InitError xpa catch {set i 0; ProcessMosaicImageIRAFCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdMosaicImageWFPC2 {xpa cdata param buf len} { XPADebug "XPARcvdMosaicImageWFPC2" $param InitError xpa catch {set i 0; ProcessMosaicImageWFPC2Cmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdMovie {xpa cdata param buf len} { XPADebug "XPARcvdMovie" $param InitError xpa catch {set i 0; ProcessMovieCmd param i} XPACatchError $xpa } proc XPARcvdMultiFrame {xpa cdata param buf len} { XPADebug "XPARcvdMultiFrame" $param InitError xpa catch { set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessMultiFrameCmd param i [xparec $xpa datachan] {}} {Windows NT} {ProcessMultiFrameCmd param i dummy {}} } } XPACatchError $xpa } proc XPASendNan {xpa cdata param} { InitError xpa catch {ProcessSendNanCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdNan {xpa cdata param buf len} { XPADebug "XPARcvdNan" $param InitError xpa catch {set i 0; ProcessNanCmd param i} XPACatchError $xpa } proc XPASendNRES {xpa cdata param} { InitError xpa catch {ProcessSendNRESCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdNRES {xpa cdata param buf len} { XPADebug "XPARcvdNRES" $param InitError xpa catch {set i 0; ProcessNRESCmd param i} XPACatchError $xpa } proc XPASendNRRD {xpa cdata param} { InitError xpa catch {ProcessSendNRRDCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdNRRD {xpa cdata param buf len} { XPADebug "XPARcvdNRRD" $param InitError xpa catch {set i 0; ProcessNRRDCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendNVSS {xpa cdata param} { InitError xpa catch {ProcessSendNVSSCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdNVSS {xpa cdata param buf len} { XPADebug "XPARcvdNVSS" $param InitError xpa catch {set i 0; ProcessNVSSCmd param i} XPACatchError $xpa } proc XPASendOrient {xpa cdata param} { InitError xpa catch {ProcessSendOrientCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdOrient {xpa cdata param buf len} { XPADebug "XPARcvdOrient" $param InitError xpa catch {set i 0; ProcessOrientCmd param i} XPACatchError $xpa } proc XPASendPageSetup {xpa cdata param} { InitError xpa catch {ProcessSendPageSetupCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPageSetup {xpa cdata param buf len} { XPADebug "XPARcvdPageSetup" $param InitError xpa catch {set i 0; ProcessPageSetupCmd param i} XPACatchError $xpa } proc XPASendPSPageSetup {xpa cdata param} { InitError xpa catch {ProcessSendPSPageSetupCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPSPageSetup {xpa cdata param buf len} { XPADebug "XPARcvdPSPageSetup" $param InitError xpa catch {set i 0; ProcessPSPageSetupCmd param i} XPACatchError $xpa } proc XPASendPan {xpa cdata param} { InitError xpa catch {ProcessSendPanCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPan {xpa cdata param buf len} { XPADebug "XPARcvdPan" $param InitError xpa catch {set i 0; ProcessPanCmd param i} XPACatchError $xpa } proc XPASendPixelTable {xpa cdata param} { InitError xpa catch {ProcessSendPixelTableCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPARcvdPixelTable {xpa cdata param buf len} { XPADebug "XPARcvdPixelTable" $param InitError xpa catch {set i 0; ProcessPixelTableCmd param i} XPACatchError $xpa } proc XPASendPlot {xpa cdata param} { InitError xpa catch {ProcessSendPlotCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPlot {xpa cdata param buf len} { XPADebug "XPARcvdPlot" $param InitError xpa catch {set i 0; ProcessPlotCmd param i $buf {}} XPACatchError $xpa } proc XPASendPNG {xpa cdata param} { InitError xpa catch { global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessSendPNGCmd {} {} $param [xparec $xpa datachan] {}} {Windows NT} {ProcessSendPNGCmd {} {} $param dummy {}} } } XPACatchError $xpa } proc XPARcvdPNG {xpa cdata param buf len} { XPADebug "XPARcvdPNG" $param InitError xpa catch { set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessPNGCmd param i [xparec $xpa datachan] {}} {Windows NT} {ProcessPNGCmd param i dummy {}} } } XPACatchError $xpa } proc XPASendPrefs {xpa cdata param} { InitError xpa catch {ProcessSendPrefsCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPrefs {xpa cdata param buf len} { XPADebug "XPARcvdPrefs" $param InitError xpa catch {set i 0; ProcessPrefsCmd param i} XPACatchError $xpa } proc XPASendPreserve {xpa cdata param} { InitError xpa catch {ProcessSendPreserveCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPreserve {xpa cdata param buf len} { XPADebug "XPARcvdPreserve" $param InitError xpa catch {set i 0; ProcessPreserveCmd param i} XPACatchError $xpa } proc XPASendPrint {xpa cdata param} { InitError xpa catch {ProcessSendPrintCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPrint {xpa cdata param buf len} { XPADebug "XPARcvdPrint" $param InitError xpa catch {set i 0; ProcessPrintCmd param i} XPACatchError $xpa } proc XPASendPSPrint {xpa cdata param} { InitError xpa catch {ProcessSendPSPrintCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdPSPrint {xpa cdata param buf len} { XPADebug "XPARcvdPSPrint" $param InitError xpa catch {set i 0; ProcessPSPrintCmd param i} XPACatchError $xpa } proc XPARcvdRaise {xpa cdata param buf len} { XPADebug "XPARcvdRaise" $param InitError xpa catch {set i 0; ProcessRaiseCmd param i} XPACatchError $xpa } proc XPASendRegions {xpa cdata param} { InitError xpa catch {ProcessSendRegionsCmd xpasetbuf $xpa $param {} {}} XPACatchError $xpa } proc XPARcvdRegions {xpa cdata param buf len} { XPADebug "XPARcvdRegions" $param InitError xpa catch {set i 0; ProcessRegionsCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdRestore {xpa cdata param buf len} { XPADebug "XPARcvdRestore" $param InitError xpa catch {set i 0; ProcessRestoreCmd param i} XPACatchError $xpa } proc XPASendRGB {xpa cdata param} { InitError xpa catch {ProcessSendRGBCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdRGB {xpa cdata param buf len} { XPADebug "XPARcvdRGB" $param InitError xpa catch {set i 0; ProcessRGBCmd param i} XPACatchError $xpa } proc XPASendRGBArray {xpa cdata param} { InitError xpa catch {ProcessSendRGBArrayCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdRGBArray {xpa cdata param buf len} { XPADebug "XPARcvdRGBArray" $param InitError xpa catch {set i 0; ProcessRGBArrayCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendRGBCube {xpa cdata param} { InitError xpa catch {ProcessSendRGBCubeCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdRGBCube {xpa cdata param buf len} { XPADebug "XPARcvdRGBCube" $param InitError xpa catch {set i 0; ProcessRGBCubeCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendRGBImage {xpa cdata param} { InitError xpa catch {ProcessSendRGBImageCmd {} {} $param [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdRGBImage {xpa cdata param buf len} { XPADebug "XPARcvdRGBImage" $param InitError xpa catch {set i 0; ProcessRGBImageCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendRotate {xpa cdata param} { InitError xpa catch {ProcessSendRotateCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdRotate {xpa cdata param buf len} { XPADebug "XPARcvdRotate" $param InitError xpa catch {set i 0; ProcessRotateCmd param i} XPACatchError $xpa } proc XPARcvdSAMP {xpa cdata param buf len} { XPADebug "XPARcvdSamp" $param InitError xpa catch {set i 0; ProcessSAMPCmd param i} XPACatchError $xpa } proc XPARcvdSave {xpa cdata param buf len} { XPADebug "XPARcvdSave" $param InitError xpa catch {set i 0; ProcessSaveCmd param i} XPACatchError $xpa } proc XPARcvdSaveImage {xpa cdata param buf len} { XPADebug "XPARcvdSaveImage" $param InitError xpa catch {set i 0; ProcessSaveImageCmd param i} XPACatchError $xpa } proc XPASendScale {xpa cdata param} { InitError xpa catch {ProcessSendScaleCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdScale {xpa cdata param buf len} { XPADebug "XPARcvdScale" $param InitError xpa catch {set i 0; ProcessScaleCmd param i} XPACatchError $xpa } # backward compatibility proc XPARcvdSFits {xpa cdata param buf len} { XPADebug "XPARcvdSFits" $param InitError xpa catch {set i 0; ProcessSFitsCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendSingle {xpa cdata param} { InitError xpa catch {ProcessSendSingleCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdSingle {xpa cdata param buf len} { XPADebug "XPARcvdSingle" $param InitError xpa catch {set i 0; ProcessSingleCmd param i} XPACatchError $xpa } proc XPASendShm {xpa cdata param} { InitError xpa catch {ProcessSendShmCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdShm {xpa cdata param buf len} { XPADebug "XPARcvdShm" $param InitError xpa catch {set i 0; ProcessShmCmd param i 0} XPACatchError $xpa } proc XPASendSkyView {xpa cdata param} { InitError xpa catch {ProcessSendSkyViewCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdSkyView {xpa cdata param buf len} { XPADebug "XPARcvdSkyView" $param InitError xpa catch {set i 0; ProcessSkyViewCmd param i} XPACatchError $xpa } proc XPARcvdSleep {xpa cdata param buf len} { XPADebug "XPARcvdSleep" $param InitError xpa catch {set i 0; ProcessSleepCmd param i} XPACatchError $xpa } # backward compatibility proc XPARcvdSMosaic {xpa cdata param buf len} { XPADebug "XPARcvdSMosaic" $param InitError xpa catch {set i 0; ProcessSMosaicCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdSMosaicWCS {xpa cdata param buf len} { XPADebug "XPARcvdSMosaicWCS" $param InitError xpa catch {set i 0; ProcessSMosaicWCSCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } # backward compatibility proc XPARcvdSMosaicIRAF {xpa cdata param buf len} { XPADebug "XPARcvdSMosaicIRAF" $param InitError xpa catch {set i 0; ProcessSMosaicIRAFCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendSmooth {xpa cdata param} { InitError xpa catch {ProcessSendSmoothCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdSmooth {xpa cdata param buf len} { XPADebug "XPARcvdSmooth" $param InitError xpa catch {set i 0; ProcessSmoothCmd param i} XPACatchError $xpa } proc XPARcvdSource {xpa cdata param buf len} { XPADebug "XPARcvdSource" $param InitError xpa catch {set i 0; ProcessSourceCmd param i} XPACatchError $xpa } # backward compatibility proc XPARcvdSRGBCube {xpa cdata param buf len} { XPADebug "XPARcvdSRGBCube" $param InitError xpa catch {set i 0; ProcessSRGBCubeCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPARcvdTcl {xpa cdata param buf len} { XPADebug "XPARcvdTcl" $param InitError xpa catch {set i 0; ProcessTclCmd param i $buf {}} XPACatchError $xpa } # backward compatibility proc XPASendTheme {xpa cdata param} { InitError xpa catch {ProcessSendThemeCmd xpasetbuf $xpa $param} XPACatchError $xpa } # backward compatibility proc XPARcvdTheme {xpa cdata param buf len} { XPADebug "XPARcvdTheme" $param InitError xpa catch {set i 0; ProcessThemeCmd param i} XPACatchError $xpa } proc XPASendThreads {xpa cdata param} { InitError xpa catch {ProcessSendThreadsCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdThreads {xpa cdata param buf len} { XPADebug "XPARcvdThreads" $param InitError xpa catch {set i 0; ProcessThreadsCmd param i} XPACatchError $xpa } proc XPASendTIFF {xpa cdata param} { InitError xpa catch { global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessSendTIFFCmd {} {} $param [xparec $xpa datachan] {}} {Windows NT} {ProcessSendTIFFCmd {} {} $param dummy {}} } } XPACatchError $xpa } proc XPARcvdTIFF {xpa cdata param buf len} { XPADebug "XPARcvdTIFF" $param InitError xpa catch { set i 0 global tcl_platform switch $tcl_platform(os) { Linux - Darwin - SunOS {ProcessTIFFCmd param i [xparec $xpa datachan] {}} {Windows NT} {ProcessTIFFCmd param i dummy {}} } } XPACatchError $xpa } proc XPASendTile {xpa cdata param} { InitError xpa catch {ProcessSendTileCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdTile {xpa cdata param buf len} { XPADebug "XPARcvdTile" $param InitError xpa catch {set i 0; ProcessTileCmd param i} XPACatchError $xpa } proc XPARcvdUpdate {xpa cdata param buf len} { XPADebug "XPARcvdUpdate" $param InitError xpa catch {set i 0; ProcessUpdateCmd param i} XPACatchError $xpa } proc XPARcvdURLFits {xpa cdata param buf len} { XPADebug "XPARcvdURLFits" $param InitError xpa catch {set i 0; ProcessURLFitsCmd param i} XPACatchError $xpa } proc XPASendVersion {xpa cdata param} { InitError xpa catch {ProcessSendVersionCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPASendView {xpa cdata param} { InitError xpa catch {ProcessSendViewCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdView {xpa cdata param buf len} { XPADebug "XPARcvdView" $param InitError xpa catch {set i 0; ProcessViewCmd param i} XPACatchError $xpa } proc XPASendVLA {xpa cdata param} { InitError xpa catch {ProcessSendVLACmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdVLA {xpa cdata param buf len} { XPADebug "XPARcvdVLA" $param InitError xpa catch {set i 0; ProcessVLACmd param i} XPACatchError $xpa } proc XPASendVO {xpa cdata param} { InitError xpa catch {ProcessSendVOCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdVO {xpa cdata param buf len} { XPADebug "XPARcvdVO" $param InitError xpa catch {set i 0; ProcessVOCmd param i} # someone is setting the error state InitError xpa } proc XPASendWCS {xpa cdata param} { InitError xpa catch {ProcessSendWCSCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdWCS {xpa cdata param buf len} { XPADebug "XPARcvdWCS" $param InitError xpa catch {set i 0; ProcessWCSCmd param i [xparec $xpa datafd] {}} XPACatchError $xpa } proc XPASendWeb {xpa cdata param} { InitError xpa catch {ProcessSendWebCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdWeb {xpa cdata param buf len} { XPADebug "XPARcvdWeb" $param InitError xpa catch {set i 0; ProcessWebCmd param i} # someone is setting an error state InitError xpa } proc XPASendWidth {xpa cdata param} { InitError xpa catch {ProcessSendWidthCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdWidth {xpa cdata param buf len} { XPADebug "XPARcvdWidth" $param InitError xpa catch {set i 0; ProcessWidthCmd param i} XPACatchError $xpa } proc XPASendZoom {xpa cdata param} { InitError xpa catch {ProcessSendZoomCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdZoom {xpa cdata param buf len} { XPADebug "XPARcvdZoom" $param InitError xpa catch {set i 0; ProcessZoomCmd param i} XPACatchError $xpa } proc XPASendZScale {xpa cdata param} { InitError xpa catch {ProcessSendZScaleCmd xpasetbuf $xpa $param} XPACatchError $xpa } proc XPARcvdZScale {xpa cdata param buf len} { XPADebug "XPARcvdZScale" $param InitError xpa catch {set i 0; ProcessZScaleCmd param i} XPACatchError $xpa } proc XPAConnect {} { global xpa if {[info exists xpa]} { catch {xpafree $xpa} unset xpa } InitXPA UpdateFileMenu } proc XPADisconnect {} { global xpa if {[info exists xpa]} { if {[catch {xpafree $xpa} result]} { Error "$result" } unset xpa } else { Error "[msgcat::mc {XPA not initialized}]" } UpdateFileMenu } proc XPAInfo {} { global xpa if {[info exists xpa]} { set r {} append r "[format "XPA_VERSION:\t%s" [xparec $xpa version]]\n" append r "[format "XPA_CLASS:\t%s" [xparec $xpa class]]\n" append r "[format "XPA_NAME:\t%s" [xparec $xpa name]]\n" append r "[format "XPA_METHOD:\t%s" [xparec $xpa method]]\n" SimpleTextDialog xpatxt "[msgcat::mc {XPA Information}]" \ 80 20 append bottom $r } else { Error "[msgcat::mc {XPA not initialized}]" } } # unwind xpa errors # requires catch {} to allow a check to take place proc XPADebug {which param} { global debug if {$debug(tcl,xpa)} { puts stderr "$which $param" } } proc XPACatchError {xpa} { global ds9 global icursor global errorInfo if {$errorInfo != {} || $ds9(msg) != {}} { if {$ds9(msg) != {}} { xpaerror $xpa $ds9(msg) } else { xpaerror $xpa [lindex [split $errorInfo "\n"] 0] } InitError xpa # reset cursor set icursor(count) 0 UnsetWatchCursor } } proc XPAMethod {} { global xpa if {[info exists xpa]} { return [xparec $xpa method] } else { return {} } } # Process Cmds proc ProcessXPACmd {varname iname} { upvar $varname var upvar $iname i global ds9 global pds9 global env switch -- [string tolower [lindex $var $i]] { unix - inet - local - localhost {set env(XPA_METHOD) [lindex $var $i]} noxpans {set env(XPA_NSREGISTER) false} tcl {incr i; set pds9(tcl) [FromYesNo [lindex $var $i]]} yes - true - on - 1 - no - false - off - 0 {set pds9(xpa) [FromYesNo [lindex $var $i]]} } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/acknowledgment.html������������������������������������������������������������������000644 �000765 �000000 �00000002706 12022177210 017517� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Acknowledgment</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="sun.gif" height="98" align="middle" width="100"> SAOImage DS9 Acknowledgment</h3> <blockquote> <p>SAOImage DS9 development has been made possible by funding from the Chandra X-ray Science Center (CXC) (NAS8-03060) and the High Energy Astrophysics Science Archive Center (HEASARC) (NCC5-568). Additional funding was provided by the JWST Mission office at Space Telescope Science Institute (NAS-03127) to improve capabilities for 3-D data visualization.<br> </p> <p>If you have found SAOImage DS9 to be helpful in your research, the following acknowledgment would be appreciated</p> <p><i> </i></p> <blockquote> <p><i>"This research has made use of SAOImage DS9, developed by Smithsonian Astrophysical Observatory" </i></p> </blockquote> <p>or reference the following paper<a href="http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=2003adass..12..489J">2003adass..12..489J</a></p> </blockquote> </body> </html> ����������������������������������������������������������saods9/ds9/doc/faq.html�����������������������������������������������������������������������������000644 �000765 �000000 �00000120267 12305173406 015276� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 FAQ</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" vlink="#551a8b" text="#000000"> <h3> <img alt="" src="sun.gif" align="middle" height="98" width="100"> SAOImage DS9 FAQ</h3> <blockquote> <p>This FAQ is a new, on going project, and it is far from being complete. But as common questions on DS9 are received, the FAQ will be updated. </p> <p><b>Contents</b></p> <blockquote><a href="#Copyright">Copyright</a><br> <a href="#General">General</a><br> <a href="#Fonts">Fonts</a><br> <a href="faq.html#Linux">Linux</a> <br> <a href="faq.html#Windows">Windows</a> <br> <a href="#MacOSX">MacOSX</a><br> <a href="faq.html#X11">X11</a> <br> <a href="#IRAF">IRAF</a> <br> <a href="#Coordinates">Coordinates</a> <br> <a href="#Regions">Regions</a> <br> <a href="#Printing">Printing</a> <br> <a href="#XPA">XPA</a><br> <a href="#VO">VO</a><br> </blockquote> </blockquote> <blockquote> <p> <b><a name="Copyright"></a>Copyright</b></p> <blockquote> <p>SAOImage DS9 is composed of approximately 20 open source packages, all of which are distributed under their own open source license agreements, usually GPL, LGPL, or BSD. In addition, several open source packages have been developed here at the Smithsonian Astrophysical Observatory, Cambridge, MA, USA and are distributed under the terms of the GNU General Public License as published by the Free Software Foundation. As long as you continue to adhere to the provisions of the licenses, you are free to distribute SAOImage DS9 along with your software.</p> <p>The <a href="http://www.gnu.org/copyleft/gpl.html">GNU site</a> contains an excellent FAQ on the the dos and donts of GPL.</p> </blockquote> <p><b><a name="General"></a>General</b></p> <blockquote> <p><b>The web browser, catalog tool, image server, and other Analysis functions don't appear to work. Whats going on?<br> </b></p> <p>For a number of the Analysis functions, DS9 requires temporary disk space to download and store data. By default, this directory is defined by the TMP or TEMP environment variable. This is usually defined as <tt>/tmp</tt> for Linux and MacOSX users. For Windows users, this will vary, depending on which version of Windows you have. In any case, if the temp directory is not writable, or you have specified an invalid directory in the preferences, these functions will fail with a variety of error messages.<br> </p> <p><b>My system admin stripped the DS9 binary and now DS9 fails to start with the following error message:</b></p> <p><tt>Application initialization failed: Can't find a usable tk.tcl in the following directories...</tt></p> <p>DS9 is based on tcl/tk which is a scripting language which requires many support files. To create a stand alone application, we <i>fool</i> tcl/tk into thinking that it has a valid installation. To do this, DS9 is really an application, along with an zip archive attached. The first thing DS9 does is to create a virtual file system in memory and unpack that archive into memory. The application DS9 is already stripped of debugging symbols when built. </p> <p>It appears that the <tt>strip</tt> command is <i>stripping</i> part of the archive, hence DS9 is unable to un-compress it. In summary, don't <tt>strip</tt> the DS9 binary and everything works fine. </p> <p><b>When I open my FITS image, all I see is 'white'. Yet everything, including the color bar seems to work?</b></p> <p>New with version 2.1, is support for the DATASEC keyword. This keyword specifies what portion of the image is valid data, for calculating min / max and for displaying. This is very important for images created from CCDs with over scan and bias strips. By default, this support is enabled. However, a number of fits images with this keyword, have invalid values. Therefor, when DS9 opens the image, it finds no valid data to display. To correct this problem, either disable DATASEC support, via the Scale menu, or correct the the value of DATASEC in the fits header. You can also change the default behavior by disabling DATASEC from the preferences menu.<br> </p> </blockquote> <p> <b><a name="Fonts"></a>Fonts</b></p> <blockquote> <p><b>Where is the Symbol Font? How do I enter special characters into an entry dialog?</b> </p> <p>The concept of a separate <tt>SYMBOL</tt> font is no longer implemented with the latest OS font and scripting support, especially with scalable anti-alias fonts such as Xft for Linux. Most newer fonts (if not all) now have greek characters as part of the font. The greek chars start at unicode \u0391 for 'A' and \u03b1 for 'a'. Each OS has a tool used to build and copy a string of characters. Then use the Edit:Paste menu of DS9 to insert the character string.</p> <p>Linux- Gnome: <b>gucharmap<br> </b>Linux- KDE: <b>kcharselect<br> </b>MacOSX: <b>Character Viewer</b> (Select <tt>Edit:Special Characters</tt>) Now click and drag the characters to a terminal window. Then select the string and select <tt>Edit:Copy</tt>.<br> Windows: <b>Character Map</b> (from <tt>Start</tt> button, select <tt>All Programs</tt>, <tt>Accessories</tt>, <tt>System Tools</tt> and then <tt>Character Map</tt>)<br> </p> </blockquote> <p> <b><a name="Linux"></a>Linux</b></p> <blockquote> <p><b>My /tmp directory is mounted -noexec and bin table filtering does not work.</b></p> <p>Set the environment variable FILTER_TMPDIR to a directory that is both writable and can execute.<br> </p> <p><b>I have Red Hat 7, and I'm running KDE. The magnifier keeps going blank after a few seconds, what's going on?</b> </p> <p>The problem was in KDE. If the user has decided to hide the panel taskbar and&nbsp; sets a delay time for when it appears if the mouse is moved to the panel&nbsp; location, then it appears that KDE creates mouse events that fool DS9 into&nbsp; thinking the mouse is outside and it blanks the magnifier. By turning off the&nbsp; hide panel, the effect goes away. The alternative is to update to KDE2.1Beta&nbsp; where this method of dealing with the hidden panel is not used and all is&nbsp; well, as it was for KDE </p> <p><b>I have FreeBSD. When I run ds9, I get the following error:</b> <tt>&nbsp; <b>ELF binary type "0" not known</b> </tt><b>Whats going on?</b></p> <p>The solution was to use the <b><tt>brandelf</tt></b> utility on the file to ensure that the machine understood that it &nbsp;was a Linux program.</p> <p><tt>% brandelf -t Linux (file name)<br> </tt></p> <blockquote> </blockquote> </blockquote> <p> <b><a name="Windows"></a>Windows</b></p> <blockquote> <p><b>When I do Save Image, I get the same result (and this is true for either .gif, .jpeg, .tiff, .png and .ppm) : it saves only a stripe at the top of my image.<br> </b></p> <p>This problem seems to be caused by running DS9 in Windows XP compatibility mode. Please un-check the compatibility option in the properties dialog.<br> </p> <p><b>How can I open a FITS file with an extension name?</b></p> <p><b> </b>By default, the windows port of DS9 uses the Windows standard dialog box to open and save files. This can be a problem in that the native Windows dialog will not allow extensions to the file name, such as <tt>foo.fits[2]</tt>. You must use the Unix like standard dialogs to be able to specify an extension. Select <tt>Edit-&gt;Preferences-&gt;General:Dialogbox</tt> to change the default standard dialog.</p> <p><b>Every time I create an auxiliary window in ds9, such as a Pixel Table, or Analysis Plot, it will retreat behind the main ds9 window. Then, when I bring the auxiliary window to the front and move the mouse out of it, it automatically goes behind the main ds9 window again. What can I do to fix things so that the auxiliary window stays on top of the ds9 window?</b> </p> <p>To fix things so that the auxiliary window stays on top of the ds9 window, do the following: </p> <blockquote> <p><tt>Go to the icon task bar at the bottom of the screen.</tt><tt> Bring the auxiliary window to the front by clicking on its icon in the icon task bar.</tt><tt> While the mouse still is on the aux window icon, press the mouse button, and keeping it pressed, move the mouse off the task bar.</tt><tt> Release the mouse while off the task bar.</tt><tt> The auxiliary window will now stay on top of the main ds9 window.</tt></p> <blockquote> </blockquote> </blockquote> </blockquote> <p><b><a name="MacOSX"></a>MacOSX</b><br> </p> <blockquote> <p><b>I can't invoke the 'Save Image' function from the MacOSX X11 version. I get an error message "An error has occurred while creating the image. Please make sure entire image is visible on screen."<br> </b></p> Up until MacOSX 10.8 (Mountain Lion), Apple provided their own version of a X11 server. At first, it was based on XFree86 (X11R6.6) and available with versions up to MacOSX 10.4. Later with MacOSX versions 10.5 to 10.7, the Apple's X11 server was based upon X.org (X11R7.2). <br> <br> The Apple version of X11 server for MacOSX 10.5 to 10.7 contains a bug which fails if you invoke certain X11 calls on a window if its location is not at 0,0 on the screen. Hence, within DS9, if you 'Save Image' and your window is not exactly in the upper left corner, it will fail.<br> <br> Again, this only affects users of MacOSX 10.5 to 10.7.<br> <br> Starting with MacOSX 10.8, Apple no longer provides a X11 window server. The user must go to the XQuartz site and download/install directly. The current version is 2.7.3.<br> <p><b>When I invoke DS9 MacOSX Aqua from the command line, I get weird errors such as<tt>:</tt></b></p> <blockquote> <p><tt>The document "foo.fits" could not be opened. SAOImage DS9 cannot open files in the "Flexible Image Transport System" format.</tt></p> </blockquote> <p><b><tt> </tt></b>When opening MacOSX Aqua from the command line, it is better to use the <tt>OPEN</tt> application as opposed to specifying the binary directly. The <tt>OPEN</tt> application sets up the environment just as it is when a user double clicks.</p> <tt> # good</tt><br> <tt>% open /Applications/SAOImage\ DS9.app foo.fits<br> <br> # bad<br> % /Applications/SAOImage\ DS9.app/Contents/MacOS/ds9 bar.fits</tt><br> <p><b>How can I open a FITS file with an extension name?</b></p> <p><b> </b>By default, DS9 MacOSX Aqua uses the MacOSX standard dialog box to open and save files. This can be a problem in that the native MacOSX dialog will not allow extensions to the file name, such as <tt>foo.fits[2]</tt>. You must use the Unix like standard dialogs to be able to specify an extension. Select <tt>Edit-&gt;Preferences-&gt;General</tt> to change the default standard dialog.</p> <p><b>How do I set my PATH environment variable under MacOSX for use with external analysis programs, such as funtools?<br> </b></p> <p>When you double click on a MacOSX application, it does not parse any shell startup files, such as ~/.profile. Instead, the environment is defined using a special environment file, <tt>.MacOSX/environment.plist</tt>. This file can be created with the MacOSX utility <tt>/Developer/Applications/PropertyListEditor.app. </tt>For further information, please click <a href="http://developer.apple.com/qa/qa2001/qa1067.html">here</a>.<br> </p> <blockquote> </blockquote> </blockquote> <p> <b><a name="X11"></a>X11</b><br> </p> <blockquote> <p><b>Is it possible to work in batch mode without a physical display?<br> </b></p> <p>DS9 is written as an interactive, window client program, and as a result, does require a window server to be available for rendering (X11, Windows, or MacOSX).<br> <br> Therefore, using DS9 as a batch process can be cumbersome. We recommend using <tt>xvfb</tt> under X11. Just set up a virtual display buffer, reset your DISPLAY variable, then invoke DS9 with a number of command line options or use xpa from a shell script as a batch processor. Example:<br> </p> <p><tt>% export DISPLAY=:1</tt><tt><br> </tt><tt>% Xvfb :1 -screen 0 1024x768x16 &amp;</tt><tt><br> </tt><tt>% ds9 -file cmap.fits -zoom to fit -cmap b -grid skyformat degrees -grid yes -regions ../EMS-names.reg -saveimage png mytest.png -exit</tt><br> </p> <p><b>When I start DS9, I get the following error message:</b></p> <tt>_X11TransSocketINETConnect: Can't get address for foo.bar.edu </tt><br> <tt>couldn't connect to display "foo.bar.edu:0.0"</tt> &nbsp; <br> <p>DS9 is unable to determine a valid X11 Display server, because of a number of reasons. Most often this is seen when you have a laptop configured for a network, but is not physically connected. You need to set the DISPLAY environment variable to :0.0 </p> <blockquote><tt>$ xhost + </tt><br> <tt>$ set DISPLAY=:0.0 </tt><br> <tt>$ export DISPLAY </tt><br> </blockquote> <p><b>Under Solaris, when I start DS9, my twm window manager crashes!</b></p> <p>TWM distributed with X11R5 had a major bug, that was corrected around 1996. DS9 will trigger this bug, and will cause TWM to crash. If you are running Solaris, and have X11R5 installed, be sure that /usr/openwin/bin is in your path before X11R5/bin. This will insure that you are running the correct version of TWM . </p> <p><b>When I run ds9 with the tvtwm window manager, sometimes the open file dialog box does not appear?</b> </p> <p>If you are running tvtwm, and you are currently viewing a virtual screen other than the first, when you open a file, the dialog box will appear in the first virtual screen, not your current. This is a bug with tvtwm and not ds9.</p> </blockquote> <blockquote> <p> </p> </blockquote> </blockquote> <blockquote> <p><b><a name="IRAF"></a>IRAF</b></p> </blockquote> <blockquote> <blockquote> <blockquote> <blockquote> </blockquote> </blockquote> <p><b>I can't use more than 9 frames with the IMEXAMINE task?</b><br> </p> <p>The task <tt>IMEXAMINE</tt> can not be used with frame numbers greater than 9.</p> <p><b>Can I display from IRAF to DS9 running under Windows or MacOSX?</b> </p> <p>Yes, DS9 for Windows and MacOSX is also a fully functional IRAF display server. To direct image output from IRAF to DS9 running under Windows or MacOSX, use the IMTDEV environment variable. For example, if the machine is named 'foo.bar.edu', define IMTDEV to the follow value before entering IRAF. </p> <blockquote><tt>$ setenv IMTDEV inet:5137:foo.bar.edu </tt><br> <tt>$ cl </tt><br> <tt>cl&gt; display dev$pix</tt><br> </blockquote> <blockquote> <blockquote> </blockquote> </blockquote> <p><b>I'm having problems with </b><b>mscred task </b><b>msczero?</b></p> DS9 now supports IRAF's new IIS image display protocol. However, there is one minor problem with the <b>mscred</b> task <b>msczero.</b> Before using <b>msczero</b>, issue the following command in the cl:<br> <br> <tt>cl&gt; set disable_wcs_maps=""<br> cl&gt; flpr</tt><br> <p><b>I find that there is a frustrating delay in performing operations on images displayed from IRAF - there's a wait of a second or two before an image is (re)displayed, whereas <i>saoimage</i> reacts virtually instantly for the same type of operation. This makes running imexamine on a batch of images a pain, and using the mouse to change color gamma/bias to desired values basically impossible.</b> </p> <p>DS9 and <i>saoimage</i> are similar in speed when working with IRAF. In fact, DS9 uses&nbsp; the same code to interface with IRAF as saoimage and ximtool. The only&nbsp; difference is that DS9 is double buffered, whereas, <i>saoimage</i> and <i>ximtool</i> only&nbsp; use a single buffer. So with <i>saoimage</i> and <i>ximtool</i>, you see incremental progress,&nbsp; where DS9 will render the image all at one time. However, the overall time to&nbsp; finish rendering should almost be the same. </p> <p>DS9 runs in both 8 bit and 24 bit environments, but <i>saoimage</i> is restricted to 8 bit. If you are running DS9 and <i>saoimage</i> at the same time, then you must be in 8 bit mode. You should not see any&nbsp; delay in changing the color bias/contrast between the two. </p> <p>However, if you are running DS9 in 24 bit mode, then you will see slower&nbsp; performance in changing the bias/contrast, as compared to 8 bit mode. Instead of&nbsp; changing a color look up table, as in 8 bit mode, DS9 has to update every pixel&nbsp; on the screen. If your cpu speed is slow, you can select the&nbsp; Edit:Preferences:True Colorbar to tell DS9 not to update the entire screen,&nbsp; only a part of the screen. This should only be needed if your machine is slower&nbsp; than 200 MHz. Again <i>saoimage</i> does not even run in 24 bit mode, so there are no&nbsp; comparisons. </p> <p><b>I try to display an image from IRAF and I get the following error message:</b></p> <p><tt>Cannot open device (node!imtool,,512,512)</tt></p> <p> </p> <p>DS9 works the same way as <tt>ximtool,</tt> <tt>saoimage,</tt> and <tt>saotng.</tt> No special scripts&nbsp; should be needed. If you have one of the above currently working, DS9 should&nbsp; work <i>out of the box</i>. </p> <p>IRAF can use one of three methods to communicate with DS9: fifo, socket, and unix&nbsp; domain name. The DS9 defaults are:</p> <blockquote><tt>fifo /dev/imt1</tt> <br> <tt>port 5137</tt> <br> <tt>unix /tmp/.IMT%d</tt> </blockquote> <p>If your IRAF configuration is set up different (i.e., a different port number, or&nbsp; via a fifo), you need to tell DS9 how to communicate with iraf. DS9 uses the same&nbsp; command line options as XIMTOOL: </p> <blockquote><tt>-fifo </tt> <br> <tt> -fifo_only </tt><br> <tt> -inet_only </tt> <br> <tt> -port </tt> <br> <tt> -port_only </tt> <br> <tt> -unix </tt> <br> <tt> -unix_only </tt> </blockquote> </blockquote> </blockquote> <blockquote> </blockquote> <blockquote> <blockquote> <p><b>I try to display an image, I see something, but it's corrupted and I get multiple error messages from DS9...</b></p> <p><b> </b>An IRAF image server (<i>ximtool</i>, <i>saoimage</i>, DS9, etc...) uses a configuration file&nbsp; to specify the number of available buffers and their sizes. What actually passes&nbsp; from IRAF is not the buffer size, but an index number into this file. </p> <p>So when an image server starts (DS9), it will attempt to locate this file as&nbsp; $HOME/.imtoolrc and /usr/local/lib/imtoolrc. If not found, it will look for shell&nbsp; environment variables IMTOOLRC and imtoolrc, that contains the name of the configuration file. </p> <p>If no configuration file is found, DS9 will assume the following default configuration: </p> <blockquote><tt>&nbsp;1&nbsp; 2&nbsp; 512&nbsp; 512&nbsp; # imt1|imt512 </tt><br> <tt>&nbsp;2&nbsp; 2&nbsp; 800&nbsp; 800&nbsp; # imt2|imt800 </tt><br> <tt>&nbsp;3&nbsp; 2 1024 1024&nbsp; # imt3|imt1024 </tt><br> <tt>&nbsp;4&nbsp; 1 1600 1600&nbsp; # imt4|imt1600 </tt><br> <tt>&nbsp;5&nbsp; 1 2048 2048&nbsp; # imt5|imt2048 </tt><br> <tt>&nbsp;6&nbsp; 1 4096 4096&nbsp; # imt6|imt4096 </tt><br> <tt>&nbsp;7&nbsp; 1 8192 8192&nbsp; # imt7|imt8192 </tt><br> <tt>&nbsp;8&nbsp; 1 1024 4096&nbsp; # imt8|imt1x4 </tt><br> <tt>&nbsp;9&nbsp; 2 1144&nbsp; 880&nbsp; # imt9|imtfs full screen (1152x900 minus frame) </tt><br> <tt>10&nbsp; 2 1144&nbsp; 764&nbsp; # imt10|imtfs35 full screen at 35mm film aspect ratio </tt><br> <tt>11&nbsp; 2&nbsp; 128&nbsp; 128&nbsp; # imt11|imt128 </tt><br> <tt>12&nbsp; 2&nbsp; 256&nbsp; 256&nbsp; # imt12|imt256 </tt><br> <tt>13&nbsp; 2&nbsp; 128 1056&nbsp; # imt13|imttall128 tall &amp; narrow for spectro. </tt><br> <tt>14&nbsp; 2&nbsp; 256 1056&nbsp; # imt14|imttall256 tall &amp; wider for spectro. </tt><br> <tt>15&nbsp; 2 1056&nbsp; 128&nbsp; # imt15|imtwide128 wide &amp; thin for spectro. </tt><br> <tt>16&nbsp; 2 1056&nbsp; 256&nbsp; # imt16|imtwide256 wide &amp; fatter for spectro. </tt><br> <tt>17&nbsp; 2 1008&nbsp; 648&nbsp; # imt17|imtssy Solitaire fmt w/ imtool border </tt><br> <tt>18&nbsp; 2 1024&nbsp; 680&nbsp; # imt18|imtssn Solitaire fmt w/out imtool border </tt><br> <tt>19&nbsp; 1 4096 1024&nbsp; # imt19|imt4x1</tt><br> </blockquote> <p>If on the other hand, IRAF assumes a different buffer size, the image will appear corrupted and DS9 may issue a number of error messages. </p> <p>Another problem is that this file must be in sync with dev$graphcap. If your&nbsp; system administrator has made changes to graphcap, they must also be implemented in imtoolrc. </p> <p>Here is a note from NOAO: </p> <blockquote> <p><tt>The messages means that there is no /usr/local/lib/imtoolrc file </tt><tt>on the machine. This is created as a symlink to dev$imtoolrc by the </tt><tt>iraf install script but only if the /usr/local/lib dir already exists on the </tt><tt>machine. The fix is the create the dir and rerun the install script or </tt><tt>else make the link by hand.&nbsp; Users can also just copy dev$imtoolrc </tt><tt>to $HOME/.imtoolrc and restart the server to also workaround it. Note </tt><tt>that an existing .imtoolrc might define old frame buffer configs which </tt><tt>might confuse things, so if the system file exists check for a private </tt><tt>copy screwing things up. </tt></p> </blockquote> </blockquote> </blockquote> <blockquote> <blockquote> <p><b>Where do I find this .imtoolrc file?</b> </p> <p>Again, here a note from NOAO concerning this issue: </p> <blockquote> <p><tt>In a smooth installation the imtoolrc file is installed as a </tt><tt>/usr/local/lib/imtoolrc symlink pointing to the dev$imtoolrc file in the </tt><tt>iraf system.&nbsp; This is normally what's used but XImtool (and DS9?) also </tt><tt>allow a $HOME/.imtoolrc and IMTOOLRC environment variable defining the </tt><tt>path as fallbacks.&nbsp; There are several practical problems with&nbsp; this:&nbsp; for </tt><tt>some reason (I'm trying to fix) the imtoolrc link won't be created if </tt><tt>the /usr/local/lib directory doesn't exist when the install script is </tt><tt>run on the machine, even though it's run as root and the file can be </tt><tt>directory easily.&nbsp; On PC-IRAF systems there is also a typo in the install </tt><tt>script (extra logical or at line 515) which causes it to exit before </tt><tt>the display setup is run (i.e. no /dev fifos or imtoolrc). If users don't </tt><tt>catch this or see it in the README file they'll think everything went </tt><tt>fine. Lastly, the local iraf admin might not have run the install script </tt><tt>on the local iraf NFS client machine at all.</tt></p> </blockquote> </blockquote> </blockquote> <blockquote> <blockquote> <p><b>When I display an image from IRAF, the SCALE menu option is not active, Why?</b> </p> <p>When you display an image from IRAF into DS9, IRAF actually does the color scale&nbsp; distribution. In Display, use the ztrans and z1,z2 parameters to set the upper/lower bounds and distribution. You can also use the zscale parameter to auto determine z1,z2.Here are the DISPLAY parameters in question: </p> <blockquote><tt>ztrans=[linear|log|none|user] </tt><br> <tt>z1=min </tt><br> <tt>z2=max </tt><br> <tt>zscale=[yes|no]</tt></blockquote> <p>What actually is sent from IRAF to DS9 is one byte per pixel, values 0-200,&nbsp; which already has applied both the upper and lower clipping bounds and the distribution. So this is why, the SCALE menu is disabled in DS9 when it receives a image from IRAF.</p> </blockquote> </blockquote> <blockquote> <p> <b><a name="Coordinates"></a>Coordinates</b></p> </blockquote> <blockquote> <blockquote> <p><b>Why don't I see PHYSICAL/WCS/WCSA...WCSZ coordinates displayed when I load my image?</b></p> <p>DS9 supports the following coordinate systems: </p> <blockquote><tt>WCS Sky coords (fk4,fk5,icrs,galactic,ecliptic) <br> </tt><tt>WCS Linear coords <br> </tt><tt>Image (also known as Logical) <br> </tt><tt>Physical (also known as CCD)<br> Detector<br> Amplifier &nbsp; </tt><br> </blockquote> <p>DS9 uses the following FITS keywords in the header to define a coordinate system: &nbsp;</p> </blockquote> <center> <table nosave="" border="1" cellpadding="4" width="75%"> <tbody> <tr> <td><b>Coordinate System</b></td> <td><b>Keyword Values</b></td> </tr> <tr nosave=""> <td nosave=""><tt>WCS / WCSA...WCSZ</tt></td> <td><tt>CRVAL,CRPIX,CRDELT,CD... (for images) <br> TCRVL,TCRPX,TCDLT,... (for tables)</tt></td> </tr> <tr> <td><tt>Image</tt></td> <td><tt>none required</tt></td> </tr> <tr> <td><tt>Physical</tt></td> <td><tt>WCSNAMEP='PHYSICAL' or LTMx_x/LTVx</tt></td> </tr> <tr> <td valign="top"><tt>Detector</tt><br> </td> <td valign="top"><tt>DTMx_x/DTVx</tt><br> </td> </tr> <tr> <td valign="top"><tt>Amplifier</tt><br> </td> <td valign="top"><tt>ATMx_x/ATVx</tt><br> </td> </tr> </tbody> </table> </center> <blockquote> <p>If the required keywords are not present, values for those coordinates are not displayed. </p> <p>Note: For PHYSICAL, DS9 will first look for an alternative WCS with WCSNAMEx='PHYSICAL'. If not found, DS9 will then look for the LTMx_x LTVx keywords.</p> </blockquote> </blockquote> <blockquote> <p> <b><a name="Regions"></a>Regions</b></p> <blockquote> <p><b>How do I indicate distance on my printed images?</b>&nbsp; </p> <p>You have two choices, the RULER region and the LINE region. The ruler region is mainly used for interactive measurements. For printed output, use the LINE region to create a distance indicator. In the line region dialog, there is a read-only entry that indicates the length in pixels, degrees, arcmin, or arcsec. Edit to the desired distance and enter the desired label, including ' or ", in the region text labile entry. You have the option of arrows at each end of the line. </p> </blockquote> </blockquote> <blockquote> <p> <b><a name="Printing"></a>Printing</b></p> <blockquote> <p><b>I can make some wonderful color images in DS9 and save them as postscript files that look great, but often when I print them they appear washed out or very different than they do on the screen. My question then is what, if anything, can I do about this?</b> </p> <p>The problem is that you create an image on a display, which is the product of&nbsp; RGB colors (red, green, and blue) and print the image on a printer, which is the&nbsp; product of CMYK colors (cyan, yellow, magenta, and black). Furthermore, every&nbsp; monitor is different in how it will display a certain color, and every printing&nbsp; technology is different in how well it will reproduce that color. And finally,&nbsp; the translation between RGB and CMYK is not symmetric, i.e. its not possible to&nbsp; translate some colors back and forth. </p> <p>It's possible to calibrate your monitor and your printer, to create a&nbsp; translation matrix, to correct for problems outlined above (in the Macintosh&nbsp; world, this is what ColorSync does). The idea is to <i>apply</i> a gamma correction to the output of DS9, so&nbsp; that it will print much more in line with what you expect. To do this you'd need&nbsp; special software and hardware, and its only valid for your monitor and your&nbsp; printer. </p> <p>In summary, its not worth it. Especially in the case of publication, such as ApJ,&nbsp; where you have no idea on what printing technology will be used to reproduce&nbsp; your image. So the only control you have is to calibrate your monitor and to&nbsp; hope for the best. </p> <p>However, there are some <i>rules of thumb </i>that might help. First, printers have a very hard time with <i>blues</i> and <i>purples</i>, as they tend to be washed out. Either avoid these colors, or over compensate these colors.&nbsp;</p> <p>ApJ has a good idea in that you send in both an electronic version and a hard copy of your color image. That way, they can manually adjust the printers to&nbsp; try to match your output.</p> <p><i>NOTE: Even though ApJ requests images in CMYK, we recommend RGB. From personal experience, if you send RGB, the printed results will be closer to the original.</i></p> <p><b>We used DS9 to generate 300 dpi CMYK eps figures, as per the ApJ specifications, but the color scheme on&nbsp; our proofs is wrong.&nbsp; In the proofs, the violet is washed out and looks similar to the black, and the blue is not nearly as intense.</b></p> <p><b> </b>There are two issues here: first,&nbsp; color printers are notorious for failure to reproduce blues and purples correctly. Second,&nbsp; not all colors in RGB space can be reproduced correctly in CMYK space, blues being the prime example. Below is an excerpt from an industry pamphlet:</p> <blockquote> <p><tt>Be aware that it is possible to see colors in RGB that you can't make with CMYK. They are said to be "out of the CMYK color gamut". What happens is that the RGB-to-CMYK translator just gets as close as possible to the appearance of the original and that's as good as it can be. It's something that everyone in the industry puts up with. So it's best to select any colors you use for fonts or other design elements in your layout using CMYK definitions instead of RGB. That way, you will have a better idea of how they will appear in your printed piece. Here's a common example: many programs translate the 100% Blue in RGB into a somewhat purple-looking color in CMYK. We recommend a CMYK value of 100-65-0-0 to get a nice clean blue.<font size="-1"><br> </font></tt></p> </blockquote> <p>For this reason, you may wish to use the RGB color space or colormaps without deep blues and purples, such as <tt>BB</tt> or <tt>Heat.</tt></p> </blockquote> </blockquote> <blockquote> <p> <b><a name="XPA"></a>XPA</b></p> <blockquote> <p><b>How can I use XPA to display from a client machine to DS9 on a server machine?<br> </b></p> <p>Assuming you have direct IP reachability between the machines (i.e. one host can successfully connect() to the other), XPA does allow you to have an XPA-enabled server like DS9 on one machine and a client on another. To make this work, you need to do two things (let's assume DS9 is running on a machine called "server_host" and you want to send xpa commands from "client_host"):<br> </p> <ol> <li>The XPA server program (i.e. DS9) must allow the client host to send XPA commands. Access can be permitted in one of two ways:<br> <ol style="list-style-type: lower-alpha;"> <li>Send the XPA server an acl request by running xpaset on the same host on which the server is running (i.e. on the server_host):<br> <br> <span style="font-family: monospace;">% xpaset -p ds9 -acl client_host +<br> <br> </span></li> <li>For more permanent access, add permissions in ~acls.xpa:<br> <br> <span style="font-family: monospace;">% cat &gt; ~/acls.xpa</span><br style="font-family: monospace;"> <span style="font-family: monospace;">DS9:ds9 client_host +<br> </span><br> You can check the acls for an XPA server using xpaget: <br> <br> <span style="font-family: monospace;">% xpaget ds9 -acl<br> </span><br> </li> </ol> </li> <li>On the client side, the client needs to communicate with the xpansname server program on the server machine to find the XPA server communication info. This also can be done in two ways:<br> <ol style="list-style-type: lower-alpha;"> <li>use the -i [host] switch to override <span style="font-family: monospace;">XPA_NSINET</span> for this execution (The default port is 14285):<br> <span style="font-family: monospace;"><br> % xpaget -i 'server_host:14285<span style="font-family: monospace;">' ds9</span></span><br> <br> </li> <li>Set the <span style="font-family: monospace;">XPA_NSINET</span> variable for more permanent selection of xpans on the server host:<br> <br> <span style="font-family: monospace;">% setenv XPA_NSINET 'server_host:14285'</span><br> </li> </ol> </li> </ol> <p>Once these two setup steps are performed, you should be able to send commands to DS9 and receive data from DS9. You can look at the <a href="http://hea-www.harvard.edu/saord/xpa/acl.html">xpaacl man page</a> for more information.</p> <p><b>I have a laptop, that most of the time, is connected to a network. DS9 runs fine. However, when I'm not connected to a network and I start DS9, it hangs. What's going on?</b></p> <p>&nbsp;DS9 uses XPA for interprocess communication. When DS9 starts, XPA initializes itself. XPA uses either IP sockets or UNIX sockets, based if your machine is configured to connect to the internet. In the case where your machine is configured for the internet, but you are not currently connected, XPA gets very confused. So, you can define a shell variable, XPA_METHOD, that tells XPA which method to use. </p> <p>The following is from the XPA documentation: </p> <blockquote> <p><tt>Determines the socket connection method used by this session of XPA. The choices are: inet (to use INET or Internet-based sockets) and local (unix) (to use UNIX sockets). The default is INET. Using the inet method will allow access from other machines (subject to access controls) but using local will not. Local is most useful for private access and when the machine in question is not connected to the Internet</tt></p> </blockquote> <p>More information is available on XPA shell variables at: <a href="http://hea-www.harvard.edu/RD/xpa/env.html">The XPA Environment</a><br> </p> </blockquote> </blockquote> <blockquote> <blockquote> <p> </p> </blockquote> </blockquote> <blockquote> <p><b><a name="VO"></a>VO</b></p> <blockquote> <p><b>I can't connect to any of the virtual observatories. What do I do now?</b></p> <p>The DS9 help facility now contains a tutorial on how to configure DS9 to by pass network firewalls. See <a href="ref/vo.html">Virtual Observatory Reference</a> for more information.</p> </blockquote> </blockquote> </body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/helpdesk.html������������������������������������������������������������������������000644 �000765 �000000 �00000001374 11425634103 016321� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Help Desk</title> </head> <body link="#0000ee" text="#000000" vlink="#551a8b" alink="#ff0000" bgcolor="#ffffff"> <h3> <img alt="" src="sun.gif" height="98" width="100" align="middle"> SAOImage DS9 Help Desk</h3> <blockquote> <p>If you encounter any problems or have suggestions with SAOImage DS9, please contact us:<br> saord @ cfa.harvard.edu</p> <p>William Joye<br> Smithsonian Astrophysical Observatory<br> 60 Garden St.<br> Cambridge, MA 02138 USA </p> </blockquote> <br> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/install.html�������������������������������������������������������������������������000644 �000765 �000000 �00000004544 11425634103 016172� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> <title>DS9 Installation Instructions</title> </head> <body> <h3> <img alt="" src="sun.gif" height="98" width="100" align="middle"> SAOImage DS9 Installation Instructions <a href="#windows"></a><br> </h3> <blockquote> <blockquote> <p><b>Solaris / Linux Installation</b></p> DS9 for Solaris and Linux is a self contained application and does not require any installation procedures or support files.<br> <ol> <li>Download DS9. This is a gzip'ed tar file.<br> </li> <li>Use the following command line to extract DS9: <br> </li> <tt>$ gzcat ds9.&lt;port&gt;.&lt;version&gt;.tar.gz | tar -xvf -</tt> <li>Move the DS9 executable into a directory in your path.</li> </ol> <p><b>MacOSX</b></p> There are versions of DS9 for 10.4 (Tiger) and 10.5 (Leopard)<br> </blockquote> <blockquote> <ol> <li> Download DS9 for MacOSX. This is an universal application that contains binaries for both PPC and Intel Macs. Drag to your Applications folder.<br> </li> </ol> <p><b>Darwin</b></p> There are versions of DS9 for 10.4 (Tiger) and 10.5 (Leopard). Darwin is only recommended for experienced users of unix and linux. For other users, we recommend DS9 for MacOSX.<br> <br> DS9 Darwin requires X11.&nbsp; DS9 for Darwin is a unix executable and must be run from the command line of a Terminal window.<br> <ol> <li>Download DS9 for Darwin. This is a gzip'ed tar file.</li> <li>Open a Terminal window.</li> <li>Use the following command line to extract DS9: <br> </li> <tt>$ gzcat ds9.darwin&lt;arch&gt;.&lt;version&gt;.tar.gz | tar -xvf -</tt> <li>(Optional) Move the DS9 executable into a directory in your path.<br> </li> </ol> <p><b>Windows 7/Vista/XP</b><br> </p> </blockquote> <blockquote> <ol> <li>Download DS9 for Windows NT/2000/XP. This is a WinZip.exe install file.</li> <li>Execute the install file. DS9 will be installed by default in <tt>C:\Program Files\ds9</tt>. It will contain two files, the DS9 application and cygwin.dll.</li> <li>To run, go to <tt>C:\Program Files\ds9</tt> and double click on the DS9 icon.</li> </ol> </blockquote> </blockquote> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/new.html�����������������������������������������������������������������������������000644 �000765 �000000 �00000040304 12413573626 015321� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]"> <title>DS9 New Features</title> </head> <body bgcolor="#ffffff" alink="#ff0000" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 7 New Features</h3> <blockquote> <p><b><b><b>Version 7.3<br> </b></b></b></p> <blockquote> <p><b><b><b>64 bit Applications</b></b></b><br> </p> <p>DS9 now fully supports 64 bit applications across all platforms. New support for 64 bit MacOSX Aqua has been added, along with 64 bit Windows Cygwin.</p> <p><b><b><b>2D Plots</b></b></b></p> </blockquote> <blockquote>New and improved GUI<br> Support for data set legend<br> Improvements in rendering<br> Error bar caps are now supported</blockquote> <blockquote> <p><b><b><b>Mouse Mode</b></b></b></p> <p>The default mouse mode is now <b><tt>NONE</tt></b> and not <b><tt>REGION</tt></b> or <b><tt>POINTER</tt></b>. This prevents unwanted region creation went bringing the DS9 window to the front in most Window managers.</p> <p><b><b><b>Other Enhancements</b></b></b></p> </blockquote> <blockquote>Improved rendering of rotated text<br> Support for ENVI data format<br> 3D Image caching<br> 3D Background Image rendering<br> Dramatic improvements in analysis speed of large 3D data sets<br> New Segment region</blockquote> </blockquote> <blockquote> <p><b><b>Version 7.2<br> </b></b></p> <blockquote> <p><b>FITS</b></p> </blockquote> <blockquote> <p>DS9 now fully supports complex FITS images such as data cubes, multiple extension data cubes, mosaics, RGB images, and 3D images. In addition, DS9 can be use to create complex FITS images from multiple FITS files and other image formats. Furthermore, complex FITS images can be easily disassembled into individual images and saved in FITS or other image formats.</p> </blockquote> <blockquote> <p><b>Common API</b></p> </blockquote> <blockquote> <p>XPA and SAMP now share the same API as the command line interface. Backward compatibility is maintained to previous versions of DS9.</p> </blockquote> <blockquote> <p><b>Other Enhancements</b></p> </blockquote> <blockquote>More robust handling of SEGV and SIGBUS events<br> DS9 now distinguishes between BLANK/NAN/INF values<br> <b>saveimage</b> now supports EPS<br> Support for NRRD (Nearly RAW Raster Data) data format<br> Added support for exporting RGB images in TIFF, JPEG, or PNG<br> Improvement for FITS compression support<br> Released under GPL v3<br> </blockquote> <b><b> </b></b> <p><b>Version 7.1<br> </b></p> <blockquote> <p><b>Catalog Matching</b><br> </p> <p> DS9 now supports catalog matching. From the Catalog menu option, the user selects two currently loaded catalogs, an error radius, and matching function. The user may request all sources that are present in both catalogs, or in one catalog and not in the other. Each catalog need not to be specified in the same world coordinate system.<br> </p> <p><b>Enhanced Plot Tool</b><br> </p> <p> In addition to a Line Plot Tool, DS9 now supports additional Bar and Scatter Plots Tools. The GUI for the Plot Tools have been enhanced and new features have been added including statistics and data lists. Each Plot Tool supports multiple data sets and custom plotting options.</p> <p><b>Catalog Scatter Plots</b><br> </p> <p>The user may now plot the results of two columns of a loaded catalog as a scatter plot. A selected region on the image will highlight the corresponding row and plot point. Likewise, a selected row or plot point will highlight the corresponding image region.<br> </p> <p><b>Interactive Region Analysis</b><br> </p> <p> DS9 regions now support interactive region analysis. The analysis tasks are enabled by selecting the Analysis Menu in a region's dialog box. Interactive analysis tasks includes statistics, data cuts in 2D and 3D, and radial profiles.<br> </p> <p><b>Other Enhancements</b><br> </p> </blockquote> <blockquote>3D scaling along the z axis of data cubes<br> Lock/Match Smoothing option<br> WCS dialog support for non-linear projections such as TAN-SIP and SCAMP<br> Support for FITS files larger than 2Gb has been improved<br> </blockquote> </blockquote> <blockquote> <p><b>Version 7.0<br> </b></p> <blockquote> <p><b>3-D Data Visualization</b><br> </p> <p> Previous versions of SAOImage DS9 would allow users to load 3-D data into traditional 2-D frames, and would allow users to step through successive z-dimension pixel slices of the data cube. To visualize 3-D data in DS9 v. 7.0, a new module, encompassed by the new <tt>Frame 3D</tt> option, allows users to load and view data cubes in multiple dimensions.</p> <p>The new module implements a simple ray-trace algorithm. For each pixel on the screen, a ray is projected back into the view volume, based on the current viewing parameters, returning a data value if the ray intersects the FITS data cube. To determine the value returned, there are 2 methods available, Maximum Intensity Projection (MIP) and Average Intensity Projection (AIP). MIP returns the maximum value encountered, AIP returns an average of all values encountered. At this point, normal DS9 operations are applied, such as scaling, clipping and applying a color map.<br> </p> <p>Rendering time is independent of the actual data cube size. Instead, the time it takes to render is based on how many rays are needed to project the data cube upon the screen in the view volume and the current zoom factor. The new module requires no special hardware or graphical processor unit (GPU) and the rendering time is adequate for interactive GUI manipulation on most computers. The rendering engine is developed using the POSIX thread library, allowing multiple light weight processes to be spawned to complete an image in parallel. The number of threads actually generated is a user specified parameter. Since all modern hardware contain multiple CPU cores, the default value is 8 threads. For larger work stations, this number can be increase. For every doubling in the number of CPU cores available, rendering times decrease approximately 75%.<br> </p> <p>The new module is support on all hardware platforms currently supported by DS9, including 32-bit and 64-bit versions of Linux and MacOSX, and 32-bit versions of Windows and Solaris.<br> </p> <p>All 2-D graphics, regions, cross hairs, contours, and coordinate grids, are applied to the current slice, which is selected by the user. When the user wishes to match or lock a 2-D image and to a 3-D data cube, the current slice is used to determine the rendering solution. The user can crop the data cube for all 3 axes via the command line or the GUI. The new module also supports FITS event files binned into a data cube.<br> </p> <p>All printing support has been extended to the new 3-D module. The user may generate 3-D images in Postscript, JPEG, TIFF, and other formats, just as in the 2-D case. Furthermore, native printing is supported for the Windows version.<br> </p> <p>DS9 analysis macros have been enhanced to fully support the new 3-D module, allowing the user to invoke external analysis tasks based on the current view parameters and to return results back into DS9 in the form of text, plot, 2-D image, or 3-D image.<br> </p> <p>Funding for 3-D data visualization was provided by the JWST Mission office at Space Telescope Science Institute (NAS-03127) </p> <p><b>Color Tags</b><br> </p> The purpose of color tags are to highlight (or hide) certain values of data, regardless of the color map selected. The user creates, edits, and deletes color tags via the GUI. To create a color tag, enter the Colorbar Mode, and click once on the colorbar. This creates a default color tag. Click and drag to change the values. Click and drag on one side to increase or decrease the value. Double click to manually edit the values and color. Place the cursor over the color tag and press the delete key to delete it. From the color parameters dialog, the user can load, save, and delete all color tags for that frame.<br> <p><b>Regions<br> </b></p> Regions now support analysis tasks unique to each region type. In the menu of the region dialog, the <tt>Analysis</tt> menu will contain any type specific analysis tasks. The <tt>Circle</tt>, <tt>Ellipse</tt>, <tt>Box</tt>, <tt>Polygon</tt>, and <tt>Point</tt> regions now support interactive 1-D cuts along the 3rd axis of 3-D data cubes. The <tt>Line</tt>, <tt>Vector</tt>, and <tt>Projection</tt> regions support 2-D cuts through the current slice of 2-D and 3-D data. The <tt>Auto Plot</tt> option under the regions preferences can be used to specify if a plot is automatically generated when the region is created.<br> <p><b>Analysis<br> </b></p> DS9 analysis macros have been enhanced to fully support the new 3-D module, allowing the user to invoke external analysis tasks on the current slice of 3-D data cube. The macro <tt>$z</tt> is now supported for 3-D data. In support of <tt>Funtools</tt>, the <tt>PLANE</tt> keyword is supported.<br> <p><b>Slice</b><br> </p> DS9 now allows the user to load a 3-D data cube one slice at a time via the GUI or from the command line. Use the option <tt>-slice </tt>to specify that all following 2-D files are to be interpreted as a slice of a 3-D data cube.<br> <p><b>Photo</b><br> </p> DS9 can now load images in TIFF, JPEG, and PNG file format directly. When loaded into a <tt>Frame</tt>, the average of the luminosity is used. When loaded into a <tt>Frame RGB</tt>, each channel is loaded directly. Use the <tt>-photo</tt> command line option to specify that all following files are to be interpreted as a photo image.<br> <p><b>Export</b><br> </p> DS9 will export the current image in TIFF, JPEG, or PNG file format with the current colorbar parameters applied. The entire image is exported (not just the visible portion) at the native resolution.<br> <p><b>Lock/Match</b><br> </p> The support for the Lock/Match functionality of DS9 has been greatly enhanced. The user may choose to lock/match frames, the cross hair, cropping, the current slice, binning parameters, scale parameters, or color map parameters.<br> <p><b>Crop<br> </b></p> DS9 now supports cropping the current image, via the GUI, command line, or XPA/SAMP in both 2-D and 3-D. The user may specify a rectangular region of the image data as a center and width/height in any coordinate system via the Crop Dialog, or can interactively select the region of the image to display by clicking and dragging while in Crop Mode. For 3-D frames, the <i>shift-click</i> to change the front clip plane, and <i>control-click</i> to change the back clip plane. From the command line, cropping parameters can be specified in IRAF format.<br> <p><b>ASINH Scale<br> </b></p> A new scale function has been added, <tt>ashinh</tt>, based on the arc sinh function. This new function has similar properties as the <tt>log</tt> function, with <tt>a=10</tt>.<br> <p><b>All new GUI<br> </b></p> <p>DS9 now supports basic GUI elements (buttons, menus, etc) via the native window manager API. Each port of DS9 will have a native look and feel of each hardware platform. DS9 will take advantage of the current user selected <i>Theme </i>if supported by the native windowing system.<br> </p> <p><b>Postscript</b><b><br> </b></p> DS9 now generates identical postscript code for a particular image, regardless of which hardware platform was used to generate the image.<br> <p><b>Catalogs</b><b><br> </b></p> The user may now specify coordinates in any equatorial system (not just FK5) for a catalog search and receive results in any equatorial system, to be plotted or saved. Local catalogs in any equatorial system are now supported.<br> <p><b>New WCS support</b><br> </p> <p>New WCS support for non-FITS WCS projections have been added to DS9: TNX, ZPX, SCAMP, SIP and HEALPIX.&nbsp; The keyword WCSDEP is now supported.<br> </p> <p>Enhancements and improvements have been made in the support for the following FITS WCS projections: COD, COO, COE, COP, ZEA, and CAR.<br> </p> <p>DS9 now supports non-equatorial long/lat coordinate systems in the form of xLON/xLAT and xyLN/xyLT. This includes solar WCS HPLN/HPLT, HGLN/HGLT, and HRLN/HRLT systems.<br> </p> <p>DS9 now fully supports multiple alternative celestial WCS, if specified. All cut/paste/copy operations, catalog, image server, contour, regions, and coordinate grids will now use the default WCS as selected by the user, via the WCS menu item.<br> </p> <p><b>HEALPIX</b><br> </p> <p>DS9 now supports native HEALPIX maps, in both FITS binary table and ascii table form. Any table with keyword PIXTYPE=HEALPIX or NSIDE=x will be processed as an HEALPIX image. The user may specify HEALPIX parameters within the file specification to indicate RING (default) or NESTED order, Coordinate System (default is Unknown),&nbsp; Quadrant (default is first), and Equator (default), North, or South layout. The appropriate WCS is generated for the image.<br> </p> <p><b>External Analysis</b><b> Files<br> </b></p> DS9 will now look for external analysis files in the following locations at start up: the current directory, <tt>$HOME/bin, /usr/local/bin</tt>, <tt>/opt/local/bin,</tt> and <tt>/soft/saord/bin</tt> in the form of <tt>*.ds9</tt>. If found, they will be automatically loaded. Users may disable this feature via the presences analysis panel. DS9 will continue to load <tt>ds9.ans</tt> and <tt>ds9.analysis</tt> if found, and users specified analysis files as before. DS9 will verify that the same analysis file is not loaded twice to avoid duplication of analysis menus. </blockquote> <p><b> For more detailed information, Please see <a href="release/r7.0.html">Release Notes</a></b></p> </blockquote> </body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/���������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014407� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/�����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015253� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/story.html���������������������������������������������������������������������������000644 �000765 �000000 �00000006025 11556324124 015704� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Story of SAOImage DS9</title> </head> <body link="#0000ee" text="#000000" vlink="#551a8b" alink="#ff0000" bgcolor="#ffffff"> <h3> <img alt="" src="sun.gif" height="98" width="100" align="middle"> The Story of SAOImage DS9: How DS9 got its name<br> </h3> <blockquote> <p>In 1990, Mike Van Hilst, at the Smithsonian Astrophysical Observatory, Center for Astrophysics, Harvard University, developed SAOImage. SAOImage was first implemented in X10, then reimplemented in X11. In fact, it was one of the first X11 based applications publicly made available. SAOImage was a brilliant program, implementing techniques in scientific visualization 20 years ago that are still being used by today's applications. Since Mike's departure from SAO, SAOImage has been maintained by Doug Mink.</p> <p>In the mid 1990's, with the administrative support of Steve Murray, Eric Mandel developed SAOtng, or (SAOImage, The Next Generation), named after the Star Trek series. TNG was based on IRAF's XIMTOOL graphics libraries and Tcl. It explored new GUI interfaces and supported a new external analysis interface. In particular, it utilized XPA, (X11 Public Access, also written by Eric) which allowed TNG to be scripted via a shell, or from other application.</p> <p>In 1998, while working with Eric, William Joye began a complete rewrite of TNG, based on the experience developed while supporting TNG. This project was funded by the NASA Applied Information Systems Research Program, under the title "Future Directions for Astronomical Image Display". For lack of a name, the new project was referred to as DS9, the logical extension of the Star Trek series. The name continues to be in use. Current funding is provided by the NASA High Energy Astrophysics Science Archive Center and the Chandra X-ray Science Center.<br> </p> <p>DS9 is a Tcl/Tk application. The GUI is implemented as a very thin layer of Tk. A number of Tk Canvas widgets in C++ were created to support all the functionality needed. Basically, all the real work is done in C++. DS9 inherited TNG's support of regions, XPA, external analysis support, and the general GUI. However, all the visualization techniques come directly from SAOImage.</p> <p>The current version of DS9 is composed of the Tk widgets created along with support from about 20 other open source products (including Tcl/Tk, AST, BLT, HCompress, HTMLWidget, plio, rics, tcllib, tclxml, tkcon, tkimg, tktable, wcssubs, xmlrpc, XPA, zip, zlib, and zvfs). The distributed binaries consist of a self-contained self-extracting archive and application, which provides an independent Tcl/Tk environment without installation.</p> <p>The first versions of SAOImage DS9 were made available in 1999. Since then, the popularity of DS9 has grown far beyond expectations.<br> </p> </blockquote> </body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/sun.gif������������������������������������������������������������������������������000644 �000765 �000000 �00000007042 10414777120 015132� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89ad�b�������������� #(3;JPhvocSF8( �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��?�,����d�b���H*\ȰÇ#JHŋ3jȱ#,P(Ad ,nx\9q":hp@�8@@ >(ˣ_MHM  SI*TͨY"ִࠢSmfB%:D�Y -. w b!*8 6s‡ :<E�<pᣇDEp݇ x#Y7dT#GV8aZ=V\@�-tP;{ǏulZzl0uBq�{ p4 QA{C 7$L׃q%&L@� 4YT" 2J&,Xd%H֎o@fu)tw")c G�T`%yÈ:Aw bHfXG%D�A Vx5Ԁ&v6Ev^TP&_!i)0* Rcؑ@Sg'.IB(ԹPi`pa< f) ʺ[b-=`֦ [4`0 <B=psjC  Pڽm=аm�"h$S)f<3HY8/[@ qXE@ �`mYIbC[>p$b tZNtC:WY>SjVe@CöYhɜ:p*.*-fyfn_FQ~+q*0@sy C bFsh B ht 0DFڵ.yiNʱ_ltZ3"->)m!`Jv.V6>$�0 ::!Lk_0כQ-.�9|�)ZL~:+Z]臬A`q&̡;+\li ɀnR'>/O7\Rʄ�A 3#$2q@l@" YN US#ā6 Rp 3  ~dVyj,"wX'ؚ)g)6 ANou:VC4щC"!$yL Lb&3 $ &-9-Iє> %e`zYrZ6XA (9u AW*SA L\`G\gmhSO+{<`)ʔbզ:Ax+e{B Lltzk�z7@u2!L\D x &O9Iz [ICm7cSG`ǔ0*fقXu<UKWեV婗-}Vʒ) J ;؀�&T`hk_WZ$�"c 8ɴN!mxL$p*TSȞ֣P[{U(RŊWBm2XuAZ>9; bIX*Wv蔤 ոΝI*`T& `w„ 11bQǜ*!`}u'Hh�[5'  3mLsf�+,RM Հj<n ذ@t+*"P8 hE e%O L "&ƛfMفP1~$ъIũ&`SD-:B@Ku%G(-HIŵV̙Nj)ȁG?%5 )(܂̭@ ovڜ`k!xdx5XH@�2bs.]`'@`;YfI3Iҭrd @b=[`0WB@թ/mJ L5*N \p-FKs<`$(Nڑajz"`|Jc5JOv2dqr)a�<n{lnk ��e24*8'eIƲ8 Rof48^ 3Agڨ!oҔLBc Iո߬P i{eI4Hǜ{:_,6 uD"' #):FEl�d -o,T@fgg8}D [y]'^YK>)&>ʙ >(pUJ7e&ͼ $ȁ&5^(Lyͯ-rL CI*m4ov ߉.5%\se%W8Vw{w�9*}±'qgG'#4AmđJ|R4#"0+PPoq2 E& �-8'3&bx G'd&&H',8v'bfb!viHdQ}#*@CCZq!P+Us5&A.Hr"mC�+Qps -l7<A7uvu' Sh;RP4H"*@#`'/@m,}!'%h4"_)rXw+!m*~;%)P/sw%*"`-Q${"[2@؋ "@<G"޲+phl48!�P�p6�P;& KC-&_[A�( /P&7q;�D!$!"*(y($ 294Y�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/tutorial.html������������������������������������������������������������������������000644 �000765 �000000 �00000001603 11231165151 016355� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]"> <title>SAOImage: Tutorials</title> </head> <body style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);" alink="#ff0000" link="#0000ee" vlink="#551a8b"> <h2> <img src="sun.gif" alt="" align="middle" height="98" width="100"> SAOImage DS9: Tutorials<br> </h2> <blockquote>Below is a list of instructional tutorials which are currently available. This list is updated regularly as new material becomes available.<br> <br> <a href="http://www.cfa.harvard.edu/dvlwrap/special/ds9/May52009.ram"><b>Exploring Advanced Features of SAOImage DS9</b></a><br> <i>CFA Head Lunch Talk: May 5, 2009</i><br> <br> </blockquote> <br> </body> </html> �����������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/��������������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 014611� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016235� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/�����������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016406� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016302� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015375� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/index.html����������������������������������������������������������������������000644 �000765 �000000 �00000003203 11332126233 016575� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Users Manual</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h2><img alt="" src="../sun.gif" align="middle" height="98" width="100">SAOImage DS9 Users Manual</h2> <p> The DS9 Users Manual leads the user step-by-step through many features of ds9, such as data binning and contours. For an in-depth description of all of ds9's capabilities, refer to the <a href="../ref/index.html">Reference Manual</a> </p> <ul type="none"> <li> <p> <strong><a href="gui/index.html">Introduction to the ds9 Interface</a></strong> </p> </li> <li> <p> <strong><a href="binning/index.html">Binning and Filtering FITS Event Files</a></strong> </p> </li> <li> <p> <strong><a href="contour/index.html">Contours</a></strong> </p> </li> <li> <p> <strong><a href="rgb/index.html">Create a True Color Image in an RGB frame</a></strong> </p> </li> <li> <p> <strong><a href="scripts/index.html">Scripting ds9</a></strong> </p> </li> <li> <p> <strong><a href="catalogs/index.html">Catalogs</a></strong> </p> </li> </ul> <p> If there are topics that you would like to see covered in the Users Manual, please email: saord @ cfa.harvard.edu. </p> </body> </html> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015363� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/scripts/������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 016300� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/scripts/contour.png�������������������������������������������������������������000644 �000765 �000000 �00001363727 11332353406 020517� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��:��r���B!���bKGD������ pHYs�� �� ����tIME),q�� �IDATxwXǿ3 ,K,X1K,XHSHMl$%h, 5v1(QK]0RT0͘<<sۜsϜsϽC՚'~ۼ^=" NO_{孡D^A^#\V!g$ RQVt @׫JF" eTrMXPlI^U):<�JVQW $IUԕNQWZB]L*p8U,;AJ<ާsu^ZZ”EEE<@TH+iZF (..( Ĕ15 t"6Ok.V>WL.)YڃXFVi jI3o#sy^4*yaJOcۿ0=mPX"3n\.Y222`4%6� 6Q+,lu5+%Ug[=an|'%Jbz01 @ӓ⛒$RLuE$T$Oka#^[*`qXSUʭ.ݰzsm[8ےQP%<F�nm}YݖWNv@"F/\ڷt^8q|N~R1IahRXm+f|'zrZcz9�A4DA&=$Ҫ~;yمe5$ xѻݙ)JJܺ*HZP[qbg֣ lRo$$W̪Rky|8|Ns] +"JSP -qڷt{sK f$>* YlvofkY^Q%>u))Cg雝JoiT,`@:h4āTVѱUw=d9ÿ_[QO43fxO V]:*ܚt tl9| @}:i݇N9QUaUm"O,=8ǂ:QYelGHRcՃa{I-3Z_ZrjJE{kKW[kϕ{-lnf}n.͢#�Nc%~=}Bh뵇lٵgL7um#@rzKK+.aog'elJ,C=;v9)Y/+=N i1=D$z�,kҀ.nvF#*ձ'hf+۩f;)%rC#m[WW]$kBbcMz$ҳiN65 HUf#h6yP􂷻h4٠֌uE˦,5Ai,L3FQp]쥎9PXZRk#<-8%IEU5d5wvl?)QJDvR N+b%+IVS3iD ytTI)OJpp9{+hDrjfnA[AUUUgS=*#+w.C{_ 3pD$a}*Q3 x^yo܂b�^.v>Jzik-W:J rc ,$jW(R uhg`\ $`�GheJ#iV&�IRPASgVowH6d{*O?S{H@n"̭F[]uNYf` |kl.Y'`.˔+[8J=v ~]#jT)W<.�?aKDžA F#,6W�I@՘{X}[8"swTʪ Q"Uk6K#IqV޶v �jdCP5\.W:Z%RGHwVɕ{Sؾ^l�jYIiFoLzw}7{k{kJb`пQ' =@+$@֤'ǧ>=$FԮ" @N~!8'wQ$@0 @}Ө*@Z{j+* ʗHڰXg�l{:~5SZp$`ҧ _(q9ޮ7SrJEkJT"tn͋UV,`tj@$aK@ɏ2*5f4F#A/0YF\^ukeUee:BeA `0%IA�';]>Nl[Y:aXDQi$+ $=wE&LQ;{$Ih$jUѩ| Kf?{F4jA}u#R& 8)x"y5<_Sn+skb݃p+ fviYUA-^aL$èU]m-z8/FA͵RjO"F$&m,l2-3Ά: %b�Z[ϕV <!$Am~qE[o=:(N69�}\s :pl> "aPUr;eb#u/w eZ{ԝR]KZJ5:A{"`zN#oqL;N0huek <<@ұѠGHʪlu}e4i%|[HO_,WhpwlJݥaYynչDQ}̑_x"UTZ!WT ² h4V*EZN՗Ȫ*r:fֱM̜JyBw{;[?:`z?KڽWV 7 %WlMNop'M[yeH~L I.6pFѳWR;h㎜9r*W,esyuƹ尹h05ޭiD@\~RtQ$wAP!FopXU 墕Z`B)w]0)P FN{PQYI˸l B6$m=j\3َ$pvXYD2�kWVE,ĚFeL%[bEUZ)7$Z-\^eeLlebsʋD kTmaSU+RJ$4 ׻Z.WȺk5w݇_{$skRJ d"R, WTɊ:-3$cii+K 'ڪ"Nb"@,as4^Y-]LZ夫Uu;gw�,ʼn:Q)d/͛VU Kdޭy3G*T){1%KK=�dddRTeݻZc]f :Pދds:[B'9Ш+=thvBK)| Y$eF$b�lOleKXl6-uI @$)Il%v.$MX6ܨҸ\>OdA,[le'iFAZz8jg0-E_[R{,8\@ X�/dqyԢ��`,OM+IC8\Il6d``x٤fHtp|-F٢'lӍK:\[CnKX:X\6_L}FPKTi,[L<ˤ <WGPl{^HXn<tbIS]RzQFFAVr ˪H,d$IR[?Z̯9Lf``xpE%]_`I[UWOdl62`Xlei �X<WSV./רI$B/Xl;2000< @V7cb6rE%eEE/HO,ШMFaf]T8^mօ:k ρ+F&6 $c[62=_8|WA-6 b\0W :Pn#;ivmۜëJ:x*!5f3: ?/5FVedkάb````+F]1000000ꊁQW ݚ͛濈D"77n+ 1}MHHJ:t�p-Z5уTZZ Yf@M_p^+WT*.](;w6kʬLRȠ>۷lYT*Օ+W\]]=<<H Ν;^-Tpu$klL'DK.xyyݼyStټ.y J/Wc#3&%%dnݺ5R�/:>8w\#o:Z'WVwkhcVL7a„-[tL&ƎrR:vx]^PPеkWq6''_~i۶mAA[oegg̙pٳgS_O7XYYq8??Q5PRՀ~gj* \\\8re>|֭[Imܸ7I/%33s̙ׯ_///OLLܾ} "//gϞb{ŋ_ڵk EhhhqpȐ!>>>Ɏ9rB0==ٳ/_ݻ%CM8W^,7ߜ0a?8eʔ7nDEE%''SSL;wLKK֭=/pܹ_|EUUU#3N>}ט8۩S'F՘zsmVTT 4޽{ZGTD:0 JŋS,Y"M4͌3QQQ>>>M::JtO?駟R_juEE^p>}iӦ1%O8K,;wѣG̙j�}]JJ ={>|UUU_|E||ѣGΝKaq~!22rٲe#FHJJS1c,Y`ҤI۷8q"/#ܼys [f[oUQQhs>|ƍ'MԮ]F8eC||'ΝO_~iccsҥݻw9w˽|rFFF6mݏ=J ?/7o>|CBBΟ?߮]:©3gO?5%K4:.Y䧟~ڸqchhh>} 333-[Fz(N6}666pY#u222֬Y3k֬:R{K.͝;wɒ%}�pƍm۶x˗/2FEEm۶)22GIII~iPP… ?~rsٰaٳ SXXv5k򜜜5kք]|l߾=11eLewѣ�ZhHUP0T7ҥKXX yɹǏ?~޻yfxxxuuq_nݺ_R丸!C�h׮k#K zܾ}]zuݺuK.6lX۶mΝ{ĉSN5%''?~G_cdddxx8Ϗ ٳEv=o޼۷;::FFF޺ut'Oť:uj6mj49ɥKf̘1viӦ1 <<<##c<裏8駟>|>|wbbb/]t2y䯾w-Z8sLXXX}72l&ŋ׮]>cƌK.5[YYQM=<zhL~qƙRN6->>t322-Z4s̸8R_\`Appqn߾}…>?mڴq/]tݺuÆ ͛ssso߾MVVVVcǎmݺuttT*ݻ˧Nz̙;U*մiӼƎAUl߾}޼yw^hQϞ=Mw$..ÇT9qqq˗/_reXX̙3Ϟ=K VgϞ9s_XXʕ+/_hw۷Ms3U~~~HHHHH/RbR㥦6uk#GP%0*77uƍuI"4pg积oqpp0rss$X,.***))9~xII{gJ߫W!CDEE5 QsN�Fۻϟwww7AAANNN~~~2ɓ'F* BMj@rr2Ն7nڵ˩)+dgg:tĈӧO<JAAA ";;%((@jj*ťUV!((J%_}ekkkUVQN'V4gΜׯٳgR妤z*{FFFuuT*Dr [[۠ HIIa٦HIU~'CHH_||oFIU HR^ZTTTZZaՙNNNAAAl62)188{{w}ꢔzgM6xzz޸qoݼys?~ln6F*$ըAi#G;w.00Ғ;4AAA˖-[` zh"Riooշo3gΘF ,[`0$$$MHBBBLT*ǜ 6O?&8.^H},:G3ӻɠAV^M}NHH>p?Ev?V\i�|7\.\.6TjbM~WIPN¸|T'fYh4HMhժT1xo޼t RiVX}gm۶ݿ=,jɓ'gϞݩSw/$F}ŋ? ^J=8qZ2l]r׺e˖W\߿P(yfpp{bbbIII~֯_?cƌ>Gvvv(!!JΟ?.##ʕ+�8]GQQQHtqqtZҥ Ù?njӡCA|ׯߊ+FeFY[n ~d{¢ֻ,@v//,+СCMzLݻqd2WC֭[dI@@5ZMKKj}ٱclmm gh׮]֭f^5+0s̀:'...:::::zȑg7o7n˗Qoݻw.]=gΜ-[ٳ~!y@@e㫞8qbqqcǨ.jժGd f?~|lllppSTǏoٲeLLLllݹs յkcǎ,]ʕ++V<y22m,ٳ|ȑ˗/?DHNM^/]t͚5C2<@K.4h̙3Ҷl蕿 ;;iӦԙlR7sޱ'߽{wذaM}NHH`aa1o޼1cl߾}ܸq+ ?ǏoF|oޣGoooRI8f̘'wߥR[2kBBB ?S9fee=KEEEݺu+<<<337h5Ezz:%DGGo߾]T<yɓq۷oGGG{xxL8qϞ=׮]gݻwH?~SNҥKDGGϟ?zZX`?zjxx8aDM6jzΜ9r͛G=Ցy&MY}\.\غukvN<W_Q ޽{WooK~T\.4h}3�� �IDATR}Y ^HO>`ggge2Y䷴߻woRRRqqLw={%UF=]vc;88|Wݺuӧ "zڹ'ťӆ<jU,� B!5WyBaGi02R///LVTT斓# |~II;ǫjōZ̴jH$999J�(_-uM6E]yyyJO( +QZZJ#%[ u6i!)U999u4Hc<++|-%JDԨp***y:בbRM>[ZZR8GקΑjF**j&sLM:\$55`0�h֬eJJ\8SGFc</((hƌTKfؼysf$''GV_G\2Հ/GSGteZIF;* ML9s`4 2o<*S_JJJe|>k7 BRc+VQr~j"[gW̼{ꊁU`f͊JҐdfJLLlR8"ë@tt+n߾G:H_ĻᆱRΞ= `֬Ye] 99 ݻw3_G6mF$<e?~�6fW!C452▁_�u+F]100000*Ԋ Nb͕O*z޽^Ex~,ßA\%u|o�$I>.qrꊡJ͛^'|~90`PZK.(^_F]E%Iwg00K9uСC뼀QW ۤjdHf;;;S 4 #?c>O]]] ///''I&15QQQqΝ;w֭|ޣF:z(%~SM)gΜGp8ӧOp̙7n�pss5jX3p@??oo�6n(ƍ~T9Æ zj+WׯyϡαNbS�>CBۻwv/9--�&Mdl3j(YYYׯݻwI&ضm[n:wlj*ácӳM4)!!ʕ+!޽җ%׮]adXuf;;3g/ 0QWp8__eV?#�k׮=|ҥKO>o޼fS1bܨ(77Ξ=[.w}֬YÇwqq?^ ۱cGVVҥKP111...A 0`vvvu2诿}ٚ5k=z᯾꧟~:{]^jژ &oݼy9zzzRΛ7$KKUjjjLL̔)Sx<^LLLN(aX:bbbwe�?[חjjDDި>};@iiiVw~ԩR]^{!]`?I%@k@<< _*, )g�pZO4^,m߾B0vvv @o�et]T%'5g'{�$m1M^<Dgztxv�@k/ m�@/,,zhl3v=zo޴0ѣG&L`Xz~͛7](#F(**2 cƌ)))8p u7n[dĉ}}}ǎm0I&%$$XYYG<xpAAݻe2tR[[[ķ~{ .LHHpss{qHH_TTTRRҒ%Kݻwi???$If'G.pfffJR& 0bչz'O1={|w$IOvZ~ݻ===O>=e˖Z #GBBB†ᑗwrSi .ܼy37o:::n߾u W^ݡCWWWsP۷ooii !U*ܹsWXѾ}{OOϩS5jv d&RRR LmڴiӦMqq1�OOO*}VVVbbbdddY,VDDĭ[L蘒{߿,@avΘl~7KQ&A@ʩ1P ( @� �Wkz{_Tί@%8ڙ 4t PN66;RAZPYԭZbvf~dѲ��dfJol� 5p>HQ(@.+P^c5`H_}T�ÀPY1;Ktվ�Nr.٭[}jZ++&XW� ERRu?:99UNy氰Ν;7yJŋw9uT??Ç6mzQII|pԩW|嗾vrvv4hȑ#,+**Fj*ooxɽNZUUյkEQuذa IhTUVݻBO:u&Lpvv?~o]TTt=ggJ$N۱cʕ+wan3}嗿+!::ѣGl6{ӦM}۵ksӧOiOyy9!IlժCqqRtRT"�h4T2�&~籱Ç̙}UV]xձza4xUv�Q K@(1LS-08H*!T /j=Pj6^oc6`p�Ke+(@,.hְk5&sM(sˣ<8CuN}C,?'x.hKuc!,;P)&KQ, =RgzUԸ=Pghd(Y3w0/[3-�x˻|n:�fͪ4;;{߾}9vؾ}9s̙3l6{С ,ذaC˖-,8:"""&Nx6ɓ'ºw>|pꐿzzBhOo۷o_bEHHȳ$&&x<j~ϟhѢ燄9={|׋/0`@<xഴȑ#G:t R^ӤNڶmkzX`){hh ߆-[|"h]l:�G ~ ȁN�^^_ \H j;A@hTf5:>p�pL6+98DހY @VƢ2RCh|L@(ۀ|of\6kVuup4?;%2A.<*2.79Ct^&wÆ :R f{Y`AdddEESN<yɟ)StbŊI/^1f̘7ȑ#7nJJJoC7lذzj*DYTTTΝ;E�Fmڴڵk;vXx_=lذyҥ999f͚2eȑ#: :t`!CBBzc___ʶLiL&[jUn&OMe˖ׁ "TϽFB@\huT>*�@3@gn)u�8IL$`m,%;UoP Jz@ ׀S@o@ 4‚x\X wq!*,L@][)BSq9vwlZu+xt3uDEE}III^[ 狊ڹs#Gj9A6l8{ltt4u/^ܺu+Yzuzz߽{&3gܹA{=8[[*�{0aU*gkk7|j͸n߾=::b몢iӦ :hѢ{n믿h4?ʕ+_x 'N9p@cNyTETVVYf{رӦMxSi݀ �hd63;(ǀ 8N,rϦp\`-H�F`�ږ,Xܵ~hh |Q-025UDׁˀ;p6L�0\R5JDR!g_ ^Q$@v1sBpjR$�.eY�Qߟ#�èvRT=}6tEWCZ\ͱMK^ZQtY@K֧P9Jk(f%/,,,D"髥P(xb9r> )--_cR3fضm[xxxHH<.$ ?~ÇT*?쳞={ -[7$$D.>|xܸq!!!eeeG^r+8v- f̘f{5{lڻwoZ;�H$B@``H$>| 3nڴ ǠNsu8ԩӂ VXqFHT�8tѣM!`߾}|I֭oݺe*sӦM׮]X,y% I111ׯo 6|xLo߾:.$ŋ|3g(@͕JiL$k.%Hx<5]�AuvvްaCtt45ضm[z Z�-�"} L xQ@gNp <~l@ggY/%p6gYtޣB p �=#WVHB9o#8m}i.9'=Aa [Mi;Wp#IkXQe6;B& rNvAT[mhb_lExH=3KMk*3׍9>Uy# 'ȩ }R\.=ⶎkÇ={dv6olG ;k0M{#FjAu .,Y�#� B`FM~(yY�+.Ҁ^6?~&^Դ@P�� bs/pȪ&�`_EG@  .vY瀮NW1Ç۵kצM3gzՒzj0 ob^̙MaGbFl& p&ܪ ]-tXH 냸4Yq%|0Y N~F5D2}Y�@ 0>7WWWLevfcgiif4T=xZQy2St:ΝnE'' Ν;׫W/T~ƍF%-0@ �\@6p0BʞM[0wX`n@ (N@1A;X?<,":X#��x8i@Gθ WYӟgR3׽~цiԕv )}f%~Ś-10@gO:°IYPG`%[ae)QA5�#cv|_\U:@KNF]1ԢJ fZjeZOa4'Np34X�Ā) wT@(0hS][ Nzv/�Y}-`QHL 57 !�GO3L%@|C˙ �(6s�!SWrI8 L81̂G홼2n:%t�2<*s 9kKF:6@9na:1�@>RhuAcS`Y*SV5hA2/ѣG5{f{tʕ (8櫶_H ,&0 %@j}Sf:'�zL*乢}' Hl΀ $@_(�"E8w�  vz43nα֐Hy.{ڦAa'˨If ¨i=ş^suue^WGf#]"o5 ] `3&7xBP ſpziwbT`( P ./�Aǧz�,�.08ǴM�-�: lDO�T f"G�60<cVl) xU@9=2; @ A#B 9PJ7GD,nUVR1Bo�I5TWg']v)!S%5!Hjxk< j *$ nrzyѡj:O<906Ν;~ԕ,6p-!437*2c}!l`5 ݁T mjt ^@=uX,  O@'t@+9#5Դ~ XLӈZ�- T-0]@�:dbIl l[;�PCQcH!c+pz�x t)iC淘 c6@KYCڗ0^F]5>}ÿtooojKj/큻pՕ px kf.c�n�.fIt.ր7@&!ph <gd\M|] H�oH)pⷄptg*C!5xbo=3^OU"˸(xQĩVxŶA挺j? dgx=y󦇇dzbY k=>@ T:`s47R - �[6�A�j`�mDPEOii&8�GJ X@Y5smD/K6%k{>KWOk$_ƼԘin{x~U㰭Ps_P@Ts1]F]100EN17;M/P �zȁM@P Ȁ8V-UP;)Q&%J; p@u:.�e�deEsH�,6D 1XV49/M˩3NS_@;~¯g+�6[P@<KƣBVRL|D9kbo~\|"�rQ �-@YF鏭ā0 E�ti \Gcn6ҏ/z& 7@ؠL[۷'$$Ç�VZ�Yfݻ{ݻoepa%KTWWBHKK;vCᇼVZjjʕ*qUA�>tlۮ@kJG LB@| �` {�~@p^i̞+@6N5Ozo�TI`4W'ZmH@>!TA+?ә�@u�.@�>dž@�d@.ZeF $F G @[m ->HsOr>-./XB]/yRB\ؽIFz݊O%Ŕ&kBtO籞WP  -b>XJ6cfv|�� �IDAT&_E74ں:xy⋱c.ZhС;v0 h49rٹ]vÇ4Pvv۷x}sUcǎoܸQVVƍ UFRM>_~ <q… ǎۧOѣGo۶mժUwܩy/lٲE^z}w6l3gN׮]۷o  ڛ@`gawCoG%pZMf0;jAg "&#s~GG{ nC n� ;v~<j(o �5=FAΑzG"`+r�;A{<�'Q@ҴeXꁱZ#^xV<Ǧe ܻo>g>V;VcÈղ#բ8id-1O$P^L?K0SWy˖-.X`ƍV׭[+W,[;gϞhڷouEyyy}"_]|yyyZSW[lܱcǜ9s۾};v�8yd~~)Sڶmcǎ:{.Zh}3gμL|<ëFpdtWZ+K:<J= z��g Fo��I8XOLLӀ7% IM%bP:<cMW|�>pXg )P�HW4[hee--z nћ[ux: /M.5JS%&Q b!&~.�gC@/Rӕ֐;艬fju1Mkcr! "ph1քB$qLt`X?htwakj\-kja Ez} +e9xxxc֭/͜I=[nݳgo}Νe˖l288ή[n| An-[^"gϞ/R(>}zΜ9ڐ~ժU\cPYYO,0U%|ы!d!��:ڴZ�C@3PT |]Yj�@6@ry(�dE@��ѯ8{[ h�$ZC~?Rt ܞ"hY_]%<Oq?{*U@"(b^?[EKטĞh,1&bnTP "Hy7N3sg9<z|z $Q_p5rֵ QȕÉY[䀇y՝Ѹd;$l]X<es ¨ilϤG+P<s:H-uly@~ |3iξj4Wmڴy򠠠;w+`>4 ѣTLh^:nܸ>`ԨQ K_֮]kooߵk׻wZVVp͚5X 2+CsȄJ;VZp\*~4/G!pOPEAxI* HJ "Pأ~X  ؀5ADCI(]rIy LL,[TI1|WWv@wvhq' 6i=QQݯ>Iiccf^!aC-{Y}W_\IPre`lȁI]Pϙ+gϞ9;;?~T/""⥢Ǐ9rMLLJU*ÇJST*?;hРRBݻ{yy#G4tņ6mڴi(vŋDDDT {|jS9n$NdH,ZԠC�,ǰk Ū†K� e؃N`_MM6M)  l  2J( ,HcYn0H_ 2#)$T .�{R$ BX)yG`*%jJx(tK5>UL{z$Qkflos0AU]vq#$Vlu} yFu4 lKЦ5]/"' Z5YbO c/Pȋ2Ӝ/(̚JKJ6sל?ŃEʯ0W{<xرcy睥K0`…˗/רQ#www///Q?$$d޽s}||jԨqԩk׮_~ݻw7ݻcDDD޽{33nݺvÇn޼ٱcDZc?~<44TرmX1$f(,b 7ׇ` R{D!ԅzC0%4XM6$h3 kׅPKJdmT Cd%'gp T[!^ bH#*;m0Gx~pb xECs� {QO+T8gw�I䋶TW%\o /qhO3~d >ͨ0~3+2ȵ29H/pM9Vb>鈴,ky{ZceiR̷4 eߦ83g"yW^,D~+,bժUHMM:tȑ#VZ}' ؽ{%K:w,JNTVmgϞMMM:u8L/] ,^k׮9s=<<  ЪUҟC С=55SHwy~/'4kѱC.Z+wX!pL$Q*+>-9dPzp_*vRy&qHPWtz>9t2Rݱ Am!E7` dơ(1" }EKx% $@"$\ɨO^ u+~߃ p`O:md Ƭ$%cӗ翲:53_01<#yU\ Ţ)%c|u|g,fL?auرK5j$&[nݺuk׮]v/lV~ǿ?D[[~U[vܹ%vrr%@N]nI$5:HKe@K!A$3c $suC( ' ppo:F:]:ئUdx�:4lSCGm%Rah1܀]zz9&OؽB%sXV,+|ōF_A(_z}Ro5_A{~V]ũw}GU r6tqx($&YG?r3DeذaChh#G*?? JH#ٰYƔJ꽠 l8't�C8 =zVڷGfbbVXEU?Hܑ*y{ ȅ0 t2df pr3cz-X=-{D%f[L$˔0S`(/bUs�Vgc*hۅ/D0[돟{O3b]J-D%eQyAZ_nɥ)n~eP4kE.6'|7hf={p>ra O㹾me8�:"5N" |)b%#ɞ jĈ#Fw+F K/Sk RlDn \;w`Mg` [a�dlv,=جYr&l@)B P[02$C$COh7`&,kp'` 1p>**GHx B'? ps!.pIb*g?TdX`\ X06PeUK;Ԫdm0s%/ u�Z;Ռ[3{>=`zҕ*4EߐXЉEpp-ֲ,SiU+䳔zWa39999?nnnrKӎAPYr, #ԀK`'MAcsH5CcG'`LDHj+2X1j{EGGZGtP @ĀVr ) nPIO $>2S!+7C�| ۟$V<GQ*^V(ЕGs:cϰ"yU/w /2~/+46HÐ!ۥV>S %{<2?AHNN622\BUKNGQ,}]xC6<eZh -Hn * h` %FpzIgafw;(]n͠esB"t[*wB>ԑxg0}(Op_Hx ICo쥨 �h"fIIi`$zk3`覺'sBGhE ӫtΛ,:&c$a%FV.IZh@sWt,vMU;unXTtTP`'ú[,ӌ[[v 2S3X7Y?+Rx)r+KKKOOd  9uAKđ7r ~tJ Y p GrD 7 pW1ڣw81x6t&�tf ݳsT4͞TKGl ˲9+h7! ES]^:~4˕GC}(zTZ"ڽK@.Ys;$JRvRs%)o0|6j=k8eaxha]q|| c5Jc>ԑL] ZֈE||yR7\QYGk`M5-~ ԞN̈́yp;+C%s Pw0iFU*!\C1'%P"LV b0RF˨*-P]G p;  _%E9%@f%}6\s(P XL; r8 ] G H&B.@n'O߁N AG{Q%Oχ}f{3/1Zxӌ 77?R+{I'Dհ&7yk}eB8S6k$Tivj]ok̗m~<p goJ ;{1g_jpx5B0C< S)'Nވ+{Ĺ7kk!lECp֣ȫ Z*VA\- u[)|0|<+  x@,;$z~ .<� $I, ZA0;zzb /eJ-`OL4LwT7M)r{BM;ή㛛 d;̤\IV*)( (0L,2i?`K@(c~TaL2KX6d)3^#I,1ǗW<B~:p@zzX ۷pDDD8q[nժU!HOOߵdzȐ!}R (Chn a4 3w!`C]yPO5zPF0۷V^#j nU.:]DC F` w@ 1"-lp3o4\V`p txC-#܁ WXB1ɛQϔ^X:UhUz:1O֬myMOk?� JH\�W+Tϩ̝Kz-rv;iO r(aݤFg|�ۊV츾3KϑXW͠K@+o߾ts*M6Xm͛'6V1c~g+PpTwTZl@+ slFz3I"P wV$˙!Ԅ@0%UbN䳻{:8 5+<P h�AHp 2`dKEj�!E"PA㗽C(*tW�ju~wDV}~de!ʗ|H KZj?D49\gY�vOR)U~ \iĉe<x}˗/q~F^u֙!!![Vh>f̘y~?~C*7@i삶yPΰ @x��ILb�.y>w.9'%_(�ϹD9R�y" pnl< ;r=p0[H`)Bl&A&(%UŸ,t3.IK#.c0yLڜ7 ws^+' W سuz�ԁh�Y@y V^ G8bĈVZjժT)<<\xݻw:u4lذ -Zip+WީSsΊ_ C!0 Nw\ȅl) #6ACpc +P@$?BH02hz}7tp@θ! l 8A:DZԒc%4K )C܁}$\>Ȅ{0F/\&8Zp^_K@$KQRi27e6LfUU ZZ$ciO*-5|g5 M3e2[t_"U]@BdϺV�u3ߋ 9|7NM2p s';ϾUL*ֹ/ke8+Fh{W=;@\tC/S h۶mVZURGj_ٮ ZӧGŢ*ر˗[h1pި_ l:RB�@#IBSc<�iZBZAZh Cay#'JO 2Pxh Ĺlؠc>tpq�klpG@\ү]`�(;Fkˎrїa�(N~Yj}r|3'2dG\Sse'CUV;MPe2u�:IWnLJm>2yLoBi9 A�ԟ|kyY }{tmwuvfBt IWqҖ` g,^s),,5kƍ_';###<<w@h:!Ji8O~Ȁ<A(% +$uPC"-Рӻ(A(Iِ"2ˑM6;X\-{[$WR�YJD` RA)O~nngb`lO,;{ݣ:~qQXh{Zٺv Fn&Ert;,\̩H\"e/^<lذ5jdgg&M6m/!g >y9'JFM6 5ǠA6m:z芮́np2_EsU(Ɋ>P,{}w`((}B<V0\,)0_*D�y)~p@w@?1�4pR$f)C04F/JuȀ` .Jb"!bԂ ə�qV A>Q@?0'PїeZJS,/Ջ/ޚ߄볠aeu=,ʚo1'qd6ѣ6,gsL[Ҷ9hz.ߙ'`YȆ8Bµ8hz_`/ּ@cRW222j޼a lllW\hѢ'N,\000proԩɓ'é|�� �IDATlmmׯ_?w .Ǘ W8z]v%&&~7R-@J!#ޖ0168Xge`�&0 �_/(@Tև90LavpIV0}pTFe|ȇ R}̇Bā#] D W Bd?& PO5QJ^H{A:fb#,QG<h}pz{e!G()z1hTO onOu ZRR]fÈL>`E++yxj,n(Zi*'TG,J-߯`Dq@N:NdPwCRrWxW@˖-K^JKKʤyĈ_V^ ۷o߾_N:EFFVCIU .e9J_`7 !: H�ch C tzU2Y%|*DW>m[~2b帪b"k$cl`#( c@K�BRJtl ? XCn y*\0 I#~a[9j7s<[&զz`Sz+QRyRt<^~nΎVaKGG):4.Ii)<y_ygQMSjI 6\bxE*Pׁ(!ėc-iݒ"CehϠ;0nI2 -СJJh<eһ3fl@/a%Uhʒ W܀Ur?b J;8[o= `$n O ~Po*x E �axp(/0T�]BG)*-qZCHRZ8lFbI @"lY}|Afn{PI2١woɞ9, ^uHƴhQ7[r5.Άle2pn$,<eo4.Fj] F#U{R sU T_[9L0d%J:ym @& fi9| t\0Wh၌ru9VsСQ,[+ Հd925B05$POP�ԅ|^H4k]TIJ ZdXXT�"^6w$se�C^2 (9GVʛڹ&58ۙ{ o%N15밫c6V,,[{vm30TwY�ж$`AuRѤG!U87aY"x*T?%Ku,p`%TC�\R0WǏ;*$(+�:(_=&(O' _  ᒀē-$Ch >|% YjL\1 3)(|U*2Ibr5\G‡|!6?u5;) @8Hђ Y$I~a/c!*0z_guaMMa5�Nǻ]s:v,ScGVp&eA?H u.xwPGy�YTyz ֋SLֵHY +j+W_XRRAQ%YrR۟1u0AIty!5 G!.>3 t\Ld(詡|& 3L2 p#̔FD咐W16 (ɗ HO:ˈע] ְ A-8�`'eb5|%D+:Be3D#s\*+2+or q9?"%? 800규%W)ZF)2J Xǘo>@T=TdR(Xžz/@C R`fIBc%gtweV:<V٥Blc4̊ VaeWx~v ]vbbbBCC-,,#keeOн|B6(AYŀ 7)0PdpA0D) 48!X ԄN[4A _dlx"ڄbLv: ܜyV|LBv:2܄iw1N$9NԈ&BfWG+tISIȄ!eC}Kc`"݂g'տj5[�D,bIGF9!pZoRIVlZƘXլ :4ض2*z+Wg*ibdѳ-?AShlSjk)UK.=A9fnъ]hCiEdp4`]fb�9Bs;+xiAI�@+Iz\JTRcǎ?CA||kaa_s8oo 䵢kժ?Rp;0,h(h B3p&P .B+007{,K#8p� ə$KQ~JaN$\H]U'˘9bJx4R`<S 4ԁg,!l48IiemO V?2/WdY 4jf{XT1Rѧ3<b={ <7ɶ<uRrd/׫1tHA-w|E\24vvvk׮۷Oq{J_ ^~VZS~.ZLx6<o�F-7.KMB$$Mkh硉 X1t \xV@fMf nCCd pՐK):C2i`@tD 78YP, 4T^U>ZysX Ė_2oywP5*NO2Lf.ٙMoɇ^PNj0yvl쪿P0T:Uy$3fo?bRa*#GwC ٿE!JOCߚ&ʨa%C{x %s5 >7x* JBF TB 2%z%jÝqM#7(sm<v ! -`lf@w_q폥 1ZE^v RB²iU}O r8 Kh @XdlذBoh㴌Y oZJu'4Q/BOQl4}z(wd|ї ApKA@Yv, &gknE8Ô^B/c6%358(1&�++IEt!Ss3`~~~"""ݗ-[$''׬Ys޼yaêV*n#\/_*.\f@@9ػw{Æ ƍ7f̘ƍ7iwy.$SPP0g??f͚u%333++gϞM6mذ)S_tww5k֤7o< w<ɓ'$`JR֭{m۶->ṹӦM7___ww˗/?̌6ld~~~_nJy󦧧g@@@:u.\{۩[{ZZ˗}}}zx7}�90J` Rf]d9$hxqqDDvXӦ;: HO>59G!\vf>2jU"߉"3.G1Er ȺGoM)(F I( e\ lN#a쁛DQTqA2LQb/Zpi&~dADE"w#ҡ$BRRF>R EG!B0MU~&/ :fBqMȡ0! ݽzt,f'~ NKtVme�5GE\:wkĻb>_=4+ ;Z;QA&qTu/$8@*X2@�%Ԕ>wWNCJbbbrrr{1ƍV={,陚v돡&MgRSS<x_F2226lxʕ+o޼X~]N:eoo4gΜWѣG7nrqqMMMϝ;ݻ Tի/QTcǎIHH8{;uԳgO>?_~ <)gz|||̙ӥK֥ӧsrrߟ'%K�ً-:J vss;3gK'D3gFGGeggOcǎ Y~37nܽ{֭[޽{ݻw| SNMNN˗/kS|� ȡ([A7(v5jҙ3$^Vp_T&`$7lx.)d0[1& # 8 ;oLl*QhK46U&)md>$GcM -Z[A|Hr i[!& -,1 $�0"0_ƚL=;9jPٶ5U>8 1q@kjG cKG'lp1,+C0;MsU &/*fLf'ORZi@B߂7n8uTV>s`Ϟ=7o?~|PPPݺu;t7;nٲeŊ۷?~o['s⒛7oٳW^ .]|С 6gΜz[no̬z͛7&O \|9 �ظqSE33<yMĽJѮ]rMJJJJJ裏{ &NuѣG+ʷ~f͚ٸqIIǏ7lذh"oo>}9rѢE#Fpqqy˗/8p`7oӧϢE~É9sرc;ܧ~ڴiӰ0T-F [h @ JA E"Cn߾76TnqL2A8ȩ- ?=th<љ3&nĩ` 9Jdc%C0 G9T-I/@Y5upzF Yc!& s|*e 9b B?S;,g|P"o [dԖj^-Q3w-t% aO\aEC*&;yuw',e_iVӤ|{@& KBdo}& <KbK bN"}wIJγC0F]NABr\ jHqkzш#ӧrŋsPb{Mlٲ-[V^]zݻwC Z_ SN-**>|ѣ{UZUg˫_~aaeQQ66w֮]_lذCUT9)S_iyWi\Nk}m׮ܹs?#F" AAAmڴ裏~:rȎ;R':thM6,YҢE yذaë26oܣG-<wUV1ƍۉ)Q\xŋ[Sp$m{# XK4 />{8gg;`%2zOMkm;'(ɑ" r +Yq%21/O9yw"a GE(i!K ANYvOgXTg4a _S.=9+צc(o!�ż^ӊT2ZЭ!>]`#g5W2̌6wDcrW\9ca^phEZi̟gLޔhg*1WGXvY=*/ 5ٸf2t';"y�jDԘ5jf<(Ø;MysU?\3pttLMMg O?>>>>>>odɒ200]VZQ-;;;#!1bĵk׆ޢELgٳg?$**Cf ѣG%ś6mZdɖ-[SmРݻŰsNBѿQnj?3fΝKo'M6Woݺ5qĄSN-[\hׯ_…RjO>=h ظ#;;ڵksqvvlmm_СCEO7###667nٳ=ݴiӉ'Ed@P$i^XZe+L�38u3g̠ A$h,W>uk քZ:Acb5#A҈b'L)N#6t#[C qWOb4N֘$a(4:&P 4-Ewc0+7&AG|aYzi(R+Y̺Jlϴu,^D]d`f" }u&9{?]GDۡ|օDkT {{+W:th֭+Vu?/bccJezzzqqqjjoĉ7nٳ{}AAANNNΝ,X :=|} >};J#)))jK*ǦZvӦM7oS7lPXX(}||BCCcbblll\]]+UmVVVfff~~я;w܄ ǏX"((HV}ell, z=y|111_TTkoo-+UbeeU:Iljj*>9666Te:uF`Ei*V` "]KIA4P@77ɇBr20 ;{371޲;tZ1o�c: H7aBk= &\$:qy!Bu9l N@@ V%tmOuF较Pru5YT U dAay>׆bD2Qa!IJO'lŸv <^{UܵZX2 mFInQn LHcl'scqӵFb % 1ujhM4۸c;8`ypAR-CRn132fQ9[ջڕ\iaڟ5wݻwkС[srrkԨ7 6k֬gϞlٲ5kҲL[vrrq\.lԨ0eʔ .ԫWݻZhQF ww`KKK'''///w&Mnܸ!$?|?={v|||5V*:1bR|A@@# EPPo߾coolٲwN:ӧ[V(F͞=;44ALP(D55AA8(1`�oo3g{edd4iD*zUw^ǎ-ZԢE<x0,,Lu?~\\8?8|ݻwnzذa q6mfff-釺m Gd Ǥ *]4z۠9vہ Jt(>]3s3PSޖT&1g8 Ұk˹\d=Mb2 ZNDB$y9<+L C)gV#|C Z Y ):,YS0 fY#@T֡#;ەzJ0.;|@2:۫7}ʖ~\kʠTDCiv tY=߫a?Ήƶ aիc^jb)}BbA Jlm,/eQ'asj�NXU�� �IDATq `^WeJ8#H.yEqmK^ATDE;bAc bAM0Fh[)j^[hD;vlDlؐpewlV@^0;9s9uoQ{NSKi^R˖-H6111uvv:v옕ծ]-Z$$$aÆuܹ:tɩ_~ΝR'OJed.../.H$jժ;88ԯ_?%%%==[n}pB u֤I6mL<v...2_~}*˫I&UT144LOOOOO733ݻ}||ȑ#�==֭[krbnnۯ_J*Ǜ7ӳCO<IOOQƬY4qAE'fjժkcc#}Μ9%dffT*{{Z4iҤW^Bќ VT*m޼ƾ...E+GOOM6P8R+Tdee'w!;;;==VZs111H$UT񱱱100S`|||2334h0gΜ}ܺuӳ|_B#0-<h !Ys:-|Mo}{+W  ,> zXjU5!?#)ؑR 8nfGa:S5;呭b |nBJFc)Ԥ~{ {<d8 U=.fϪP`/dvCKܺujժk֬)Z ty>@4̥g/y~aL$M=׊A^B IsCJ}rOY %LR)9:_,**=k?fS?-Ř8:EKS itvvԩSe䟏~\Lz,0`B+މ)i5SFzݡq{dddܼy}ő#G:uTFFBQ~wbϞ=Æ $LB#?uTppߝ@.ȡ3Ch�S8 ` p V sxA7 ?@ ' w%`IHQPwi^ 8PzRS%wU| g٧ QQXږc@>p@t\OT˗/ׯfĞ={6mZh:pt0>A_?cj?FW&U|M̨yRT4I۪5;`&U)o}iY˾|ʺaܪeH,"ڂ]M y6fpd۶m.\haaVcV<473:V t%q$ %c p3!+sP ڀ+bb}P608S1C15I6$ a@V:i+`�4Vāa)\SrKM,(`L[=C8 '@q,%y&T0Cg<[*uFv:Eu(T!dQ&R<YCٖqkQ^3(TWSL.U> $`Ւ'/4̩J A! Bj#⁖o~<w0?rFCkĘ~Xhb_:sՎqx[Qުb:2]4u 8PQ8(v#.&N3BWmD/% Ba>-ȗQ>_I 1CYL[qJi]N&--G* X8'�J�Cs8 M14`!` &`YZp,�!�vI6(OP}qW Z<eSFb /f�iH ^W7Sc_C}9 PB~a";$VQY/vD�]&X[ixG<ʿlLg 3R:FGg^[r+W.7+IIIꈷ\ۂ;+hfN! "!92<W'ǖ;&I!6 Tc'^*HS=&dqNE�@$ppp!g.z%I@ C`: /y$^ fFUι0`R #~rVԮѠFnw~?vrNS5 99T;-Fdd&wb/_,hE_>TM^A_{" ĔJ!'p *C iG2"AEⓩJU`L�#%iRzw*l40'=#6h0\! ba =h"m8sf F}Pi>h:lu1|)$8k۩Wó+)ybD:Gn/ hOkpފE5,Cr= lHv"je|b}6h{?5+]8TU wq۝U_C#zM :.ߝ-oK8/JNC8,VR}>.*x˩~6Z'e.XJVRŔ*ܥ3R yMbyR1_q̀C(LQXpjQҠ5 {lvO-"p\jUh�y�:"rhb 6ağ;Z@\˕ug0!ό,@gn-@G|H-Szȍl Kd^dS˃w prg~řǢ6R+ J髛v"3\Qȥ'OiӦ&Z,--+WO[ J3(@x0P5`T ʘYآ"Ӏj2՘:3dvTMB(&ښ\`/p=)f't�2L<4 9 S�� )6oW\ͭsڏW!ΣoyAg[ճ $#JRTz|0.%ZOqKk+뜁wAV&Oj]ؼX9�(=ȃ[`508B. 褦djSsaYKQjrlIVAzlN>V5$,*0r$,PBCpzS p :)( P S HhR!D*gP�B DXH+6Mc O=ciK�-g7c-PPYYA? uDLO \op<MR�5OC y4}.6663r8IZ M̕FlEϒ.+-[hK_mҤ%?VZUCWr666ݻw/wP/՗ )*U�mۺ Cf._|A3I#l8x`epO>0=:..?)bƎ[loBV6lغukɓ'k{noo J^5vؘ#G�|}{'kaa1h q�666C?>|mB(/HH+X=D�Se\5,"I5ܕ2@MF&:rxR.{< K)JÉIib'xAG H m? BRSRFrBbuEeЬxqu L; ]UA,%m&"/vt-ۈ/P} xNLT~P}wH oQLњϒB8%3Ο?ƍW2eJPP__<_B)Ξ={ӦMriӦݹs>}zXX~ U*0QQQӦM JLL2eJXX-[fΜlNNPPҦNnhhlٲ%K g3rJB<uꔦqjR400j),,,(((!!aԩ'N044\xeE*߽{7(((22@xQQQ3fزeO.N>lp~$pZ`.|Kȁ% Lb * Uh ۥ8#d8�?/n)Q@eG"irvpj@¯eh%{߱X^&?)WBn𙬢\|:^7UhiɇG5j(;;;N… DZcǺtrY͛]t8إK.]=ۅ7\K.b#G { k׮r加2i$++sʝYf 6,%%%""BHkӦMB @6lА ?~F^z: lܸ+e2ّ#G<==GemmgϞ_vCTZxݻjժИb„ Ư:X 6lԨQ>\nլY,Y"ܿ/̠^z͟?ԨQ}l׮ݨQ222?ۯ_ݻ߾}ƍ:U̡-,P'8A-�U􁪰,UTg[.**<57ո |"end񥒃*~co,&N#8 #xB0ޢ51f_ɇpj}|{[%g}[ַeg) zp\y搐={O2͛wiڴiLL̟;x/;v/^ŋMMMWZr޺u+<<<44400XF7m8qrʥrg[[[[[۠'Nԯ__ Y={v~~W_}ejjVWƻܢE#Fj!CGbAFd2٭[ׯƍ^z dXpuHFGGM4TR-֭[y挌]viNST׮]իWRRҡCtfu& Wp�o8K$A 0nL(FF%OR?ءϧ4zU3;9*t aS Qze5G?! �T9*09 G B՞Ai rV 3 oޣtK#׈T3O@!F,h8<WP1ʩS<[f`5/(r{G�6�܆UE2P4RӴ߄sVaÆ-[1gϞ-ڵ1c&NشiaÆ1bСߗd#G={Ν;5\./(( ##}<y2""ݻ|9C"xzzvuӦMAAA6D)byyyNNN-Z|yPPpĉFիW/,,lŊ!!!K 2|pD06&M4xӧOW䮫e˖W1cܹs bŊҺ;w֯_aÆzT8v؊+6nܨ?ƍ;6<YЭ͵k45ߧOST {zAM=Vp 0܈  NR+ӐNh%Mm0I $%T0PM/` qQA 8P@3H兾˨k7JZڏTŢ�!IWh?nd8SBY%8?D~}e@˝V (vEOZ~gAi?sz 4k֬ o~ٳgA3E˛7o޵k&Ojժ7]ZǏ_lvٳ-[&؞ׯ_cǎQյkWAVcҥxМ[ *8�^,[Pj8CVdHh0R>gH P꨹TJ&MAh2X" A:( �zA;ֲ3|o.7IP Gpbi࿢4C[fMfz 뇅MXx$7o޼^z?ټyÇHg̘qҥ5k4nwر&L(W7N0Auk VfΜXXX�cǎmѢŘ1c4:ujSLow{|e[nB,uMsNXXؑ#GfΜ9o޼vL)XsA p Ak=l!]M n2xH%E$ԃ. އWȆ#0n@*CN [ jyUv�>w¶ϴ҂#;${5rS0T<%ƅG$h<Wi<uj%,)+epM\􌳋+]{q,K<XX}H_ںΥlE]>}tܹsiiiAAA>̙3#Gj֬ټysAM6>>>4iR3:tݽq@ǎe2ӧK\իWxĈfffAAA… L&߿Ϟ=5ݻwwܹVZ'NܴiÇ7o ܻwoÆ ۴iS۴inݺZj-ZCݻwI;;ÇϜ9S[6h@`xE7nloo_{077SLQ`kk1eʔ fddܹr͛lٲ:u*&&...cǎ;wejժ5w\s 0GYC!!ݎ/'W1J|\ .9ꨩb)́>'| ރo!z !r-5Lj!/٘(.Ȼ}quE{pY\yRȷDs�^S:s~Q$^�Z%Os 5Y-n޼)H4҄=JnRT3G]f͛7=D"Hbccm۶ Q0m lk[UBVKΖ˗//TB{|g'OJ=zT` &lkfkcǎD 5{flٲoV_h֬Ai UxҤI Hґ#G>\ТE43Xž{VWAЕhz9+6`G%p%!t 2>h $)IQ` ౸~5 m!$. VPffƍ&L~ ][U>/jhy_i/<T:?R,u FG.J LB5p% 0T`5xP `�]De ZvZ!%\Pd1BO Q+ 4kx/9Ts^Z&SiL+_$Rk$uu ^eֽ{w7:ޞ_*fC"hD 7�La<ZB*mK/4NpԆ?Jt}))v \ɵf|DwKƾ\w.2]+{̅�2W!"_ ,i!f 8sQXW[-jӦM6m2&&֭[o}瓚Z)^v-!!᭯XLvlW uZ�>jpB@"  \� P ceAPGkD8B:ۿsdUTy kllYPTɷ$in^m>$`HFPzq )z,,`$A� jȃ0A `Ѓx²r9@r fZ!vJ_IK!D%.*vȨ%(uT -u`I}(V:sU^x葆wb---wqdp)| =X4ȡ:xtC'}`. �;MANBv Vd_ZPKq�xPtQUR\օDE"Q*8;;w0n3�� �IDATVZnj^^^ȣG\\\:h W9:@A� ß΋F@[;W ޮ :sP(o.]TT%#??_L>}Ei!_RnSA%%Ji P %C.TC) \c )4S֙+tA 7ad X Q4WM C> P\jX7Z4[!b7+lP% FS Xh-pXfqC@SN9'^[Y |R$(F7Q1],kIȒJZf=jԨu)T&M7S)((|||e2ٴiZhѪU?PS*<77wС[nѢŜ9sd2YVVp&M*{zz4l0**jZZZz,X }qzROH&͙3E[:thnnnNNN>}7o`Lƍ޽[ۯ?DEE5lhҤpNVV”*b! 4Un8X W߈ZtG!~8H(5!A.$pbhь�N))ԤHPDC4պꞸLdkTb*9bZD_ j]"jSwZhP\UśhrE5_/7JMMKLL|䉍0C.į?x@ 577_vuWWWӧO SnnnoD%ԨQ111k׾rJffSk׮yٳnݺÇڵngg׸q5kΙ3ߖ/_, ۷oGGGnٲER>}:$$dܸq]t۷ƍ ҥKm*70fׯRʭ[~Ym۶UVٳQFÇߺukTTѣG?>d77kkӧOϟ?>r劳32Ç޾}{ڵSLiذa@@@vn:f̘.]>}zܸqs̙2eJƍ맡rסy0~JH+|w]`�i ZRZjwwދ/:99\r% ##c-jҤɌ3Vz+VL4M66lX|Ŵiwڵk6667n7nܤIzz1c|Jz~u=zpss۽{s|ʹiӴ)n:u4bĈO?]v2JQ4i7c%TpBolx Ipܠ2y,}8qJEw${F\h\)E'[MqtωRPdO#1oE2T+-%W\ %%K,xuVȊ~]6k&o;vh]v]hɓ'-[?t~عsݻww)w}gffhѢ'\-Yd3gʔQKTT*a]ŋގWW>}EFFv:a„?~|嚠I&M<YCFB 'a >` -vU NZs6 Rpr 檕hbG<;- O1Ȟjb2�S%Nqi�(cBP?_ua)w "ER}~ccc09عsb6ċ/,͛7:}ΝnݺGP[_pa 6mڼy |UFرcݗ,Yfoo_~eԨQA۶mCxu79d YjAQuvEٳ'((hݺuu5R4Tk׮ڵkW_~O>cƌ<yG}Ԯ]}[~~~RR ,XpBa>?((STKV*U,k;ѣtSSS777 TBBBj<Xqdx` z XP>8a[("Uk9E|1X2`X}J@!XSfg9Iф4H98ˬL(nW~ VZ6nBzZjcǎ'O޽͛[l^zy-)WmݺiҤI[;66>ڵ0rvvVٳg-,,֭;p0jfǎcƌYxӈ#6mjkk{Xggի z۷o7j'!!ɾHVzugg .$&&ں .\lYTTTZۃ.Y޽{^^^*U~… 7o} XYY&''<x0!!ܼQFo>x\.oժΒv+!B~�9X!$P"+ T` 0ŗL—Kq˝Ȟz""SbDʾ@Yϥ~jsZJ4-*E{{mۚ(Fݻnݺ>LKK3gNbbb.]6l2xЮ]~gO<:ujEبѳHJBѪU+h@&C'M&M?~ߺu3g AYYY*aljmmݦM[[[R)hWZ[[(QFuԩCjSNIII5k֜?0IJ~ZJ Stqqi׮sb*Z<x --W^i{Z3fL۶mSSS㭭jԨV}}} ">|hbb2iҤ XZWZYfqqq^^^_~kd֭[2.ѣG"v .dB>T QqY+A2G׮]MLL<<<4ĭ[VfQFI$5 NJ,ߓY+qW[󊛦*Ν:u2222rG?.Pg&=t0Ĕ)_ezȑ˗/,_|Ĉ7oo]`8rHN² EV={ 6’0 ԩS" އ˗OCgϞM6lq7/7҄Zhq i( ntj?ڶmpB gggZj癧)eV ??7dSAJ' )g'g$-7f|t'-7t4*_4q{1pȸ>A8'^5CE@gVρ,_:R6W~#2eO t?)77wƷ\_"{*HT'@Z{`5*9[sZщ�Q^NMFfZCC'xxg OIIy;KKKbyqrr[_eTeFuxQ RSS------߅^vͭ|zQժUߝՑR%L]U!5)¡JG/YE^pVޭjĝ%Ϫh][4xT#FǼb 3W cccw9,677w*V__ �*` U@^_Ez qy5p2W\{U\ (/hV% ;Rtoyus!T:s:033srr&}[SnBo*8|p@@NTqH|p@V 幹\wbulPmťR{0-1N<eZE!"YՎxm ѢTѰCqiAUq;(%en\>4k3-Ӭ d2ܚ7o^޽{333ƍ7lذ_~;88$&&j,ʭ/^ڵK*gffWׯ\XYYZSqΝgBVϜ9s]Zj۷/8tAWAy71E>aEjw.]qf>5,&VZGqxV:M^T"#˗(K.1cĉ?O &[l8qbeظq̙3'NsBBCC'O1mڴ%K,]4777,,lƌIII3f ]t%K!111ӧO8q3^VWZU",aeM;yP #ӧO?tPnn_|qӧOO:͛SL9tPǡuoٝE 6lk@@ÇD?^&͘1#<<\أ9* 4'?|>JvZnгgO!NNNK,,ɓ'Qxx޽{̙0gΜ{ G˚E/&?|pzzz```NΟ?m۶UR%00aÆ{MKKۻwoÆ Tm۶rhqqq666{? Ο?pɉ'N8Q8g}v@@޽{B;[Ο?ߩSÇk%%%?~'00Pף{=t;wu:f7$B"SN:u1!x[l ߿C~'RqƑ#GߴiӇ~waÆխ[Wlm߾{oTϋR:4uԙ3g>K;Ń6l̘1;v߿Ϟ= 6 :m۶jzƍڵѣGˮ===-#--mĈn۶Eg̘qĉ~k׮ժU[bݻ t}W??߿W``ڵku |- gfTtxpT-e?8C֨9T`qFUZˀZG5h�n8qg뛫hAXoҥ_~9l0ĉѩJRPdeeٙ=yDPDGGgeeeddQ:xѣGFFFvvvFFF٦vvvRT111U(JRȹ`u|deeŝ8q";;[9o޼f͚ +˫V~zhL]}N=P 3ڟuh48WOE7q.:H` w˰^u;j"f%={Cڶm>`�R HNN>p@ׯ_Mc۶mNNN>>>k:tعsF2%T*Gq4:蠃/e^˗;88,\p/)pM6]t˰jժ+V|w_͛7O[|`ƒn޼y%CBBӧψ#O^Amذr-:P66Zݬ%:-2jϗElKRo ih͢,D$i43AT>X3^l͕ܹs֭KK߰aÄ ݻxRoK,˭\rԩB6lpqq5k?pWFe;;YfEFF=u6lݻG,Ydɒoŋѻv=z0M5jԨz4i2~-[$$$|圱֭[=:88xڵB�=zsN2e;v�.]jeeuĉO?@0??x;ѣG :*j֬yܹ";k|R.6b.)E+]/[Q _Dh nXXX=$OJR`c^^_@R T*RJrX"h VT*Lfhhګ q1kb{LLLFFFRӧBe2ZT5newV5)jd2a٬WSɀR SLLLJ+wUӧOo߾-H~ �H$ڵJy]) RTЫhM. /}ޕCTTJ!C4/Ȟ={ EJPT[vtt|B]LEݥwXVT{^meO;3/k($v޴@R镺 `_~YW^fbAQ3SB 폞wk000nРFD[ l;884HW-EՅt$L:# 8P"ܾ}~tu[nn*J -[g+Ngiiiw^¨BYo%z:#Й;]nS,ݽN:o}J$ 0A/X[[nZ. -7[%h*wbsrrto:200(4۬:蠃oc3W7n(6NtASr7WfffbuAt@*f+43WGySke|||켴ZW(fffªjRBT qqfffo䱾 ryJ*hFRSaU">qcQTo.YpsVw^9TRtlllJJD"L7nׯ[.UWW*U(7㞞+W.((АT(<y;vH$yyyYtekLP][Z Ɏ?ޥK ###jԨV+HDz~ ѳn:CŇ\頃:3W:蠃:fٳg4hӱc+Wnڴ_~۷?uꔏOxx8gg|||Tg|OݪU#4@[N~'Ksuu=rHůpSN6w^rÙ3g\]]mVf\ʅ vڦMUVegg 󩩩<gDDP^=GGDz,RyIaQFW^W^VVVFF <<<.\ѣ5jzNnݺЦM==Gݻwy ,xRSSGGz]z577w244<{@Pzj@@T*;ּy .8;;?}499rqqpPN kkF}eHOOT͂ oܸ,VZe<yR3ݼyskLqBB­[�CCC9%$$dggW\B+Bhr@ʕ .Bz;T*UjjpB<G\!l{yyYXX]~]痟* e4""ZjJRZE訧cQͪÇ\-Xݽ*@hr)֩S'22RPlRs�SSSsgff7nhذmvvF[Pd2!ujڽ:s x޽?~|Ϟ=¡~mڴi~… TRꕵyŋ͛75kVpp z왔$Jϟ??dȐ7iZի7ogbb믿Ο?ӽ{۷G}g5m4//ѣG۷o۷?ݻ)S̙Sŋr<--͛7o8q+222܀7o|7yyyfff'O\lYAAĉ{Ǐ?}tɒ%emݺu~~~G*Ç;v7oީS$ŋk֬Y9rD.GFF;waaaԩӁ<r/"%%aÆ7|5j]t) +++,,,884]6u5e&d�� �IDATj\toOs]r=vL8Qرcׯ_vرc~~~ӦM7oޟٲeKr4܅^'[._xQxJ7o{n֬aDDĉwQ4ݺu۰a)Sƌube˖>w&Mڳg{޽.\{ Z]N;w\¢PYv-[ן;w7|#oI7(((&&O>9tP͚5mll(�E"{ 88{v튍-Z|yՃ׷7N Y- <Xxׯ_߻wQV*:tPttiƍwňO?Xr ٳԇ~hffVv=z{oʕ}3f̢E&Nxcǎk֬ ݻ}f͚~9Ν;wǎvZ :tмy5kh5ԪUkBQs<xp~~WX|]vu=88XwգGiӦEGG`+VQ#"".^7o޼%%%/YgϞ˖-Ӽ!WXQv-[B/U!n~ʕe wEGGǕ+WBV&(de˖zbjhh8pի/_rJM|/YfEGG:thgϮTvŋ9LIZle˖5k4o<88vڅڿT*ܹsXX?a(Ej;vLII)Sitttǎ?~UV+W.뤋o>+W|'VVV' 6L۩S'Úk׮]ƍ-á͚5,Xзoߗ޽{9,ppphٖ֬-[ѣ W_xǜ9s = >}hO>۷a4j֬) :+Wܽ{Kz;9jގVZ ^W*W_}UrXn݂˗/wѣG'Lpss+kU:u긹]V={655GǏgOݻ1bݺu'e+++__ߣGjQQQw)$mjffqV,seeeowq^WإmaYt^VXDD7(71&DM1&~o&7jQ ]z]laaw�j^^g̜93sΙZTT{//?ޱcǩSՎ]j?։N:m۶'N.ң>}sss7nf͚<xu{쉉2Ν;SO=1x_͛y<xo7o]wpFBBBJJʛoy?3u֭dΝÇWԩS=sE5\cFT_x"J_y啀ԚS :tݠAڵkn:66M6=̝͛7襤̙3gذaO<DRRmv5jO~ÇG*** O~#{~̙yAcȐ!EEEsye˖Ǧ_z͚5_1NIIҥKdcǎ{ W^Y`;/^<eʔ <S~ddd/X`=zXvgS׮]Ν_ꦛnZrGƍ_mݺu+M6mڴ>}͙>}zAA!Cvjժӧ~\r%뮆 iӦGן>}O<q׮Y_~HLLLMMi8er<xݻO}{ݻƍk97}-[=x{Ι3ַUCO?}Ԍ8~[ӧϝw޹xf͚?|ڵ;vdɒӧ:W^y뭷ƌ3mڴ;iӦ "'6vs̹~Tx'׮]ꉧ[wۼmҲo۶-8_rРASʭ[֫WoҤIA,/WUUU]]]V*?5w1hР/833k׮}IJJ4hPF?¡C})***--mҤI||PRCO˖-k 3~FmٲСC_^!::++m۶UUU]v۷ 0:::55ɫ۷onݪڴi3dȐf͚qyyy[8p`VVVuuuZZRM6EEEz뭑泱m۶zdD?ԱcׯGIII4hP˖-۷o?dȐ  <855xIOOSNllq߽{K.0j'Oܴi=zgee}[ߪNOO<xpR[jUYYyx(<tЎ;ڴiWYY/kk׮]˖-nz+⪫۷oݺu7n_~5cݺu ${XC@ӦMy͛0 95r#'rzzz\!NVjժSQQ/uuuVVV`>+w7/I\"'']v)�UUU]t߿%&&6iҤSN;v3f׿.]|˫[nRRqZ%nѢ/;wo~qqq<xpя~}sׯo߾ Vo8\`{Ԉ?-c o>Xn3gΚ]=30>> ?3N:gK3o6nܸ/<++ '=xFI~ȑ# .]y ),敕mY>gqgqDrrogeem޼Y|ADEEEGG{gqgqnSٞ3g<Y::88�^]EGG2+_EEEIIIϋ-:k׮`oC@687a˖-;ݻ懏? dQdY{ժUp{QSkٹsuI v T 1,VIpW111{>-ʠIC: AeYYKIIAyyHޱ&%%UWWLzUUU?\ }TgxժUb<1i&xRRiY|"SSSuHQKFO'藄-Z's =,ԪUsQEi.*H~&#..y'Q.'u=(jUU9K";&&1,GQxt2011l]vLLqne8ػwo\\\\\\ڵYد6b׮] qqq_mؽ{w|||BBBZΪ+>\\\W^pV'<;Xff?5[PZZUq3g=zt\\ܡC[F̘1K. 4x~%o w/F^^޶mۂ_wU̙3kV p3,,,8,,*,,i >~ݻT^qGa߾}gqzqOX%%%wKEEEglƒd⮲&Ny8qbpHY<37cڴig>=ze#}3'睏<Hff<O?C^<N!L/bQQ\s{+"==}˖-ӦM ~w_~̙cǎm֬o~Ν;ر^ ʀHLL-Z4k楗^j߾Q~ nݺf梢; ԀWZ5gΜK.y۷o׆޹s7A3jԨȻϻwZPPjժe˖թSgȑ>Q?E^uy᯽Zp+` tZ&̖-[FիWСC5lٲ(::z1115Cfbbbnݚ\QQQ\\9]xԩ3~xգ{^z5 :u|5^k޼}$2mڴQF[PL>}4GMڵk5/<|o~H%rرcx饗&M0W^W;u̎zA`Μ9V N^K/W^3gLLL6lXAA_o޼yϞ=WZ[n9d\sM`nᆲԞ={jj>׿v=..Y~+>cƌYxO޽{fϞ={{ケݻw'_YYo|cС-Z7n\|||޽|⫮lĉ`ڵ&Mn߾>~{lƍO=T֭g͚uٳg׌/>jG`џ7eqΝ;wРA/{׿{gϞ=sΏ߿ 222.]zw/9zs6lX3>?~HNNNKK~PZZڢEo(ڵkɳfzꩧKJJ~<3;w>='pIQ\ݴiSzzݻVXw lݺu߾}u]|y\\\||ڵk+++k׮k׮ ߿?>>~͇>{׮]\Ϯ^_ߵkW˖-7lpڵGq_>J<Ef͚UVV6~{キ,33?Auuunn?~{$'<|;o޼{ժU[~ǒo|GEEE?;t?]ty?^r%O<D_~5//1bԩ3g4hФI6nسg_;vׯܹs׭[w7m0`M7ݴz괴zhݺuM6}'7n|WEYf'O?SO=o߾{[n'Ox~|^x7Xy?O;voo۶+ҥT++V|HHHhӦ?t|ĉyyy7|sǎ?꫷z{キjժaÆ 4N= 9r &oѢEfM6馛ڵk7cƌ}͝;K.&LHNN #ѫW􄄄; -ׯ߄ _~رclٲrʹs<x3xӦMۺu>)))?s„ 3f;vx͛7?Ǐ;v3&Lpfgg۷7oذ^z&L<a„`k~G|9\rС7xcM䕟?~;oڵ6l8Ν;>|s9SNqqqڵٳg-+YQRRҢ-ZԫWԲe˸QO1Fy5ڵ?<_|_H9N6-##㦛njٲ%{q֬Ykg̘?8->|_o߾^z wyѣ7lذf͚nf8mڴ͛O0!##(1mڴ¼?pTTԬY233'Lаas=q#Ҙ1cxЍ78tЕ+W`߾}AtX 7rرcpeii˖-ʚ0aB [ou&L/š0qoG>YԩS窫lW)KBfffʪlӦMpCM{サ_|Ř g?KIIMKKKMM̜>}wqWܬ6m|WXqu5h`ƍu)7.::M63 (++7oޖ-[:uꔘxС g?>>.ڴisH֭[wiiiv?M69?^|ĦMXAjժv999Gz׏V~VVÇJ|+W0aOӟgM4+:t(۷?7VN:ETdffKqqqrl޼#[۴iӨQM׿ RRR~~I8 ?///;;vw}<Wk,ejk׮/nGph _yɓ'̞^̙3'))'?I 6|߾۲klӃ>اOO>>`E8yUr۱cǤI.{=JSN}7&OܳgSϙ{ݻnݺ+W,))Y`AÆ zw#:q:udggqGy"l4iRvvO<qM7\Iǒ%Kj/o)A}4hPvv>;y]VV34i;سg짟~&p[:ϟ5w3T*--]piyٓ'O+׮];q+(FK;e]Vn)S_.---..~7/_~ק]~ϟ2eJaaĉ;uԿW_}5W_}5;77Te˖#F1cƔ)S֭{e_nԚ1~;~w&}k׮MNNƍN2/͝1cFՆ __ZZ:eʔ|_\F999Fƍ+,,ܰaQr1bDFF/G}駟)FIIҥK 7n\V_>)))66v۶m[:t(##LpTrFԩoyկjԴiѣGϞ={ʔ)w}M΄<3 6袋 Ү]7gH roްaÔ)S瞣Z%WXq/\0PﴴzѢESLWXٳ'f͊O6mo1bĈœ ѣ4inٲSۮ]SL7uW^yeO>c=;f'@^u?d@F\uwn[x뵗4in>9sfiiiFFFllƍָq+V :4%%%???h&^UV[nĈgZo$&&@;Ozƍ~שSgԨQO>u5o޼w5cD׮]۶m[C%Krrr.h6mѣs?o8_ZZZsو#oGFruّ7ӻwȬ  4wOcaaa +7o^Nueeeuo~h۶m׮]O@)ka_ÝTk׮]QQRTT ?HƦ۷,11qΜ9ڵKOO?x`b: wI j :n߾=HΝSXXxE,Y$m3&P`>~AUUU}E?뮻 =P秤jjɒ%YYY}Qbb+[;w>Jk^XYYo?gee\T_3?۷_z5\]|y|||NNΤI^{9"a_ 4iҤ^xaݺu:tܹski1XM˧RA&&&&1"F*//H/** Oq̘19%ۼ-wuQqW',tՙz{ޏ~={fddxO?wW'_l�� �IDATٳgktWg,NoSN}gy䑙3g//Bஆ r/9)jǎuTXw,AZZZ׮]ϐ{hd9r˖-<ꪓN/ϊ#11k׮.`?*4hРk׮vf͚u:⬻p AYK|k_׾f8 _$>OCVVQKzƍ7nܸ˓z(8,7<˂88꭮‡FD.\xZN�~زe|VUò~+=K'</@,[bſmFsUcyTw+v+tmlllEEEZZW_㣢*++l:tPτ]z'QQQZn}܏~zURR\xV'<~*++*++KJJrdGnZ<ȸo8PUUUFuuA}A>|+cqqqdw16oF-T6|Q]Z:>M8PA}̧g/&O94{[0^j6CnMF18 ={F"ԃjHGo$>^D|VJ X/m*h>iF]慤KImL &ΫT|e'"FkЖt`[^NJi~cRҌì5;EUI:vc3xqG1W c7ZNlS˨d7"ك^9=f>y.Ot Cխ2 u?f(}G:@:!Yt ), AL=9MhR02Z*B` Xʱ#}3HZÜ@U#u2ڟ "D6N=9",&6`1VI}phB\U_ .dw{wv Ȥ;݈ *h$0O/ bQcHb$aUHdd-6c`A'Ff|@+<6*Qa61ɥ/ H|3\2m 9H[bYҜ޼G99!"J[|ҧmQI]yTUԥ!)t^Jɠ's"3 m,`# '|DCF$9w#q0(\A;4t3%bȥ!q2,achN%y g2@6RʇDӑ, H6B8d0Th0,}jq5S1#O6UH:)U>`$e.;h22XBh!M\ޥ39PLu5xAӞE8B7ЄOэ'ɣkB7ߋ?ә.06aF+#4 p.3) }M ԋrc*{OdP5, 0u̫W-EIMSc%tf)۔SBb 6992 dy4d9+I}M>qf)!Gz@ZNK+<Ԝ!s"@H9yp/j1/0Z!t]x}غu==ކ DdXV 9L);V#0":Laײ7¥Ws(TnLP#c1i@Vhnb.%p?^,`l(=:b YJl fGa x Y2X2,&/`f0=Zҏry0HF<FDBLG30t-1iNX߭2c<DP|a.|HEh;)k(MI;KMC~^&V&0Rh2SJM2p?CNn#"ʘD}1a?hk$REnfc=%\PR:%d&xVta)cK{"f+U#$< ivF0VІc)E\\6'ת*Ji@2E, C~oՖyFJa'TqTQs)-bsz~JSY Z-VKJMo ٹ<\i 6V5 8t2<e,҈$0( zїCŬ"o1ei YŒjIc;N]갉;CWd ;ݸ|KLj87?T%a]Ǥ҉%`%-Mhk/\G1}C1k( R\` C9Ք_Ľ8&~É<=V.0kጋe(+Ul`[NI7\ rzZ"D1T:}jqI+Y}-%ZT 8xf'֐DrYeM6g-!:1bVSD 1jvW6B6k RQR6q 1JT0|R%!uU~~nCz>](`.uLFxhpvqw^V9Qd;It `;rOYH4;lR~INF.Chpqx\ɥ.YLKC,CA<D6 Mu`8 YLp"1e "F5qe4K& Ҕӛq[7xbrduyTs b#< B3,e 'Y0H3S q+ bj4e4g3ld7ͫ6 /|CȣH`ԡ*iIJ3Ε\?XV.KTCgf29F3Ds1n -|40tU<x(a.GN ƥ,`1;(ﰁ6y짚}t& N~ |"*O%BCG73;<1wP6q簑";lb?WMt8E >dF`Sh?k bUZ}`.䳜\X>?M.`={Gt#B ]!6K4u(8Ư'ђw#r-%T|VVNӛ <3F0=ڈX 4f=LT'Mg G}FPד$ Լ`eӈ,-{a6kXCsJiG e&le.%~ YƤy34{iHl# TN? 4{iO5[TLeVy7{T7JxR25TBm߉E2(a8oVq#E\~E 7ѕiaP(I/y\ =!d-YKEъ Z4b;żBZ0x/<JD_\j2,LV2B 7R|:q[6jS/4d8Y4e>B u>Mp=k(g{IayKId]0GCpD^єs.-Z4$3+Tx8Dg^S'ҵ 'CSUZɏC[s tё$$,czǟaVIݔs4{ ""ͳv6sAXc +zn;I\K=hzSA0|64`7U!Y^KIpy!( ɕO4 #ZBK6qE"O%(c$Y K9jj#|0}ElG8 A8ڲaTArf0j{K,b4 m9,'(gfYD,RK>](+a#NԽ ,\ޣ6-&pcH5(!GGDju8v=(fྈ-4 VZӇlfN9+̕,\\FӚ yMT&1TrzjEim|>rc�e4Вx沞t9 !18@iI#]d0cJgK"1s!sIauFi4b Bn,Ch 0*b̾0:H!m 35ɍ KynjX҃& 5 T�9,Y.хVҊ?%aDw3\6Q$Q]kvҊW(&j9] F3&aa-2S^r9ȫs?2RiT563A[H'6҈>41Y A;L5) #Oܩ$lb|ȇlb 8,vMR곍$s(3B57Mԧ?:r26ёt& )`jȟ@Dz4DZG7@zLFI-?jX2Y͹lg]Dъd"%l#- iMp \ ʙǁ>&Dn 9tdz�ۏHXbChNYN=.9Lc0VA2|u}JW]*[GƳ%`!(dB|ihGZJkYAmք߸akD3X4Q[kg'u8̨߶|:p=+•VcưBf,n Ԝ9C!)LaR%!Jj{|LO>$fz*Λ!J"F=>dT_^5akh hG0QεRH y0t4d5iL)a lqO9aUQ"t'yUU'1{dab8.chɿ[(a3u6$FgsRt&lx0ĆFH+MXb*YaGp kFQiͥ # ʰ+ τRJH=Yv6PH=#aНڲ[}>b% e4=F0PtdL,761&,RJIfW؂.j0fѕg*N= Bh"(-,SiڬA2|h%8څ4|H. WIgM1<q e:SȄAŎ}, .>$>ы9TS!X$ߐ=rA41rl:8x2%J n037˨ϲ*XXA :Qq/s-mc)NIw>vՀ!,cD9ց䇥CxbV5Ƃ0]P}\6qEȬBt-ΧCX(ޣwϝ 6>"up1U68jW-u]:"80b9ZFWT[K 0T0\b�SCI=6q8%ODv2C0v]-ti!Әr?;o;a1 ׂ=μ#;q=Hc^E #=aM>Wѐi 㭠�(f>KHмzֱ<l9?ӈ6e.rhHf5l\2Ж cIep(ưzṣc 7 ߡZpa;0;)#b 4lec;ke41OSNKƹꟕmv?KpѰ),!moQnaH`=9:քinҜkb*fq>cH&X$fApb) 4&ҒX6r.\~ƠAkC+4} &L7{"ciiCAjdS1 jֻ{!1,BW7l VҖnla=?bz8 !LJ c"JhC*I`HXV5’С]q۷D 6$jm7:cnĄ%t&PDHm$ᡱ~C2uI'6lJ^ɳxR /񈞨Pd.5_5K(#0)7Rdqn‘vc D4׍9$iL&-<̣<Jzx1"sĄAS:d1.4I?Rrr ߤ8jqMC&Q(Ȣ'C9?,w=FD1qQ7juĆҏTZvd Gtr1x᧼/X.W6QĒG4(|炿M /rDs#ψU2'iJke87zqL7=yj.3ohLXEh]&a7-\ $ƷߙD27шfr?3J^j`;2x1MH%O+G!Pp<x#CC%gy~C-R?J-nW!sz1Dba 4Q'uHNZ0KH3Q/W$y %u) -xO~H檐sS8q @!S%3!\"=r!cS;"EQi�iq.2!45645ь)v5Yy[Hv\C#xP;BủѤO֭,^|ÿp-ǮJlb4/r5<@e2XH2B΅Ŕ Aw^ 3hVDO糁$S;%̪WG>h^ 0{G }ib5;az"C32yԢj>d2jR;LiAT38ҎDeahSƐёi BZÇ'OR}сvwlyDq>%�Apu$%!9t;)a]6⨠ y9QQ@mb@o �""(f}A2계2UJ06J2YNb:JAq_UnG XF}'cXnJ=.eQsaK^}᠆ш(¦4ײG ҰUY.C~UG3\EʕaVT3#xא|2<ЎhΡ#ay6焫 mIH280\2C AOstfkG<WFe?Kh6Th(V2>O}) 7|:jְ{fV3'">WGodu@ūNO2?;\g0 }�7EtA,Q`Ib4MbzMv<Iv1$bGEEz/a( 0qsͻН:<<g_uCHG6R+U/-s)Ɯ7$g`䆸YG1{rƋ8IFؑQ8 cblYֆZrɅ~I1A()i2m-dOEgQ)tMv KG38 4-iR*s.FJk ܟC,lpi/eԉM<,ֳ<]^gpvs#COdXEsWr,}hoL%Ӕ=l `zPEC,`^tڳ#di3ZēqsSȪUyҟ +T88ITM<SNޣ'7Q"uC5iӢ__yd}8e2ڰ)Ora4`)GɰBe =6;jPgW.f1 )ЖMt)=iSvR6#+ m[цBXĀO+#&y'd]eC8'jqg gѽiB9&Ռ&QBYy&e,aX\_CYhv3b |Ջb4!_W=t.4%Dư6-e9} XJG^Qv@Gїi o�L MO2{\M08h�� �IDATMsZ8U@OӒXEfњXZ48ԎLeYHwxB.1e4>֎ɏu ^ eY DNGj EL-c� Ѿ%z(XVr1cmԌ1 VM %%L>fJORҜ<ْQ3MR:=lX'ʻBNNG)c4y|:1Ky`vQEOZTכq,i_X+ujS!487S?&CNBaUJR\;9~>bޡ{Gn(iVVp,nLbxe!C~0ÞSHS!@'ƣXN eڌ|#[I#yAZ3%D_a 4-v#nE g`k[}leo@Q,0-Jl#V&1$U̎ռǷP{ZQvaM̉mzi1Ԏmw3ry6|I!+AKnE9q57K a.c 96KS@~&N~f˸}Rh&8y<Б'CC*Azz8JL&D?Iޞs$.7.~FI�L`-Ӹٔ|We7peδt8܄5 椵uE x:)wM$cX<fPa,}('ăܘ!CwP'*[w0 wqRn ~^Wb2LC* RE=qfpzL=YZڳ3nzZU>�7Ɯah/of=EIzVR2vt5VVD}&grYn0K.Wp=BP>SQpҗ,`*9؜ :zr\"F7-Xf.f`LZjMg)35ଵp7YJ֖UuZ>uE>K/N|2ꖇ,e'G {_2(t ] 6W}/x?9 nS9? 4oq7g)Z?z.g"OҞY>wќE,`&q U|QMsJ".r0qe |F*wpop01#(VN9<z2$VLNψX /14ҝT:3# ;3j BjIn,|pYl#?tػ9KC~ŞN%f9q9 8ʝQlB>hkͱ\X\n8`~|9 GYaʅ#!JǤHce{9nO3$&uL{g8@S,ӘRY- I7PLdkfk6:LJ&m 1YCli*yԊw8ɥ!И1Јa;A]1g2J6vqcce/eSf?*: ")ևW芅`N Ƴ LB1-3>~&d/{8nvq6>񲏓OSA.)Ĵ]triOiF[NG^!Kmn 3f rnz΅ sWڝy{2,-lhVU7:],~ZLF'ppsY9dzq[ 'Hp pEG >}!RS,aQlI hllf9 xR˩^fSJ NӂK&*../Mri e'}y?)V~ޠnd}3e c=S9b膠a+VPMUb>OYZpIvTҌ2L$rF#qa <{xB,,KcqmzĬ90߄E'xnuVa*8 W__e%#Ưd:NyFqL?,3$ZSs-/|ghLS*8+QQ#n׸94e$gټ! 0[B`-SΧ8M ANd ŁQhigxh̾MbYzь/bfce f.r[hD?Q3}CEv ) -x=631becPo` Bkӑ18} GO~}0,庰HpqF|dńhWNb&F*Pɪ0&KԥX<ecSy)֏ЁAn_٘MwO*)۴wNe�)fs6U갎JbN '3'l<C.Q!,?Ud"Ǣ镸8'+1ZG(+I>h6`E8i+Ҋ.Cr^=_F-~Zp9s(X84RZRuqrNg>�Fq9tw@�uYOE1˘)ne1#98ccY5j<,c8Kȿӗ#18 G^kE)m8pӹ%TNiqQt%K?R9 кQFev,uk+?go'{.=#_9*t1yGS?e]@hzАf.x5 %qUӓ[iĖme?sؘq#Oҗi79CTzd"ʳa^sl7㬦߹$W<[FǮƴb5qLpi{:sE(S [gY;ld` +R HwD$K#,(aU|{`q#^ &iC7hƪظIa) 8bv%&?E҆hg?+hK!0;vEMs&>3.$Kc&Qt�=D{*cҀvqoT wr2a1k؈V\x|fmz[7қѓ_jYp=}ڱ+sV4{ I`e(tB)XUp^͋imTʨ@$T "kI), hYmJpih(7r SJ w҈9ӬQfVee\& ڰs}9;,c%<5`"MC- f9]q\{:1@7OОy<E3I FRCGМ7D>YƸaiONVӬ e>9Z%p>XgE;lt.:M&|ŰuYf?{HBn/%c|}᭨;78,_TOk&n$}yy%c #ֳd�GXA1Q2n&]%q}G 1%,S0:Pְ4BD*ZAAuK <gїz?tfbЙ^cy,ҝIA Wkż9!zLݜI)*7)%|J+z!(d0/sa㨸P!*ɧ2z%B[9r:0p;iuډ s3bEɲЊÉqMuS_šXD$+(LnnRmfhN!(!X]_FiwA, G96tuPCI�a7X<xQ#b;_$y=f0t1 A3:EYcXCM|[ ԐǤPc>l&:5q#^\6eulZq5&TO֓, 4(b3c3&xr OQ, YrwmνpyR;&r :~^c%~ f|Nڀ7i[Cf~}ޣy M cȍe^~j$VrO MtΓɨ5W2 ҍMlzN[`dif_Ipx*Ò|-ˣ+,iN/f0fo_bYsv|'|h!d kݱ! |6cX6q-k+uF Á5u!T7.2 M8ֱ͌UV׸/hI�^lT3v~7:('c20aǢN2ă~TК\G#fSũ( u[Mt2r0}>YFUL`yE�}y?4tsKoڲz\̜9S cgI7 }e'Ӵr3KE}^abIIiӯgUn1? MڗMfW4>͊ZI Ug9эJpMĪRԄ ˝aJ?fQl ~΂(;rׂRJgzDp@#d)73Gy J#| joڑ5YO:~GeQ]Q>(g9rd9cP8ԉtdk!,c79*kFv5V*Tr#7)>N֜?:M%(ԡ]+ix2P]d Ty*FYC^ʻT][O0iuv\yCL u<U'ڳLVk^1A `(c]ؘ=0q9y"kcox$b.(F,bͭd}X UƄ豜7> m!-;oy&]S)Iq.vwͼvBlg-B Nga+e3CkKSh5Ye*rr !"u:ԓ)? (ތDOxF93ChӸ2Y%6DA \Lї]cO b"Ӂց-=`|0T10WblHVPHyϲxsҤ JFOԏPgj8I21 @ŪQ qe=ߌVni*kd E\ό5D Vs:vNi9Wj^1Y,Uug_�C:u)4l"^U~EhhxTe,B#K?ss(orA%ByWc6CTD@d9gL˲Py!u&gClڀ lO93Di-r6N\r<& Z4{tCǺ:6Ա#J$`/P Rl"6 cؐS;Mej`&|R~Qaqrӌf~dH~Ng7E%3fmXg&%}4fko||,465<n? ӈ#,Г\ cm9Kyi=?2;8D iIk%~BWeS4>G+&<K+ -h*LK6RλkooYM$OpNSl?Z*v,ٹ:DA]~Vk;()hYJ 1Mx1 g?o-%lwOވF (yѧ6?re|@汃0]7giI3dG'G b IYBͤ8 G } w| LfM 'm8J=Qs<H!V} K"aکDIqXPd66]ͩyQ7"m .Dag곀S*L_ hDgmp5DvF69vi=ը̈́�Q[A45sc9үaJ T0 WRZF v%*TQ=_O͒9Ԝ0w�H*_( ]ޜ&Q#<!ϧΪs�q #;÷|wQץIh9j4$RR˚rXӐ,PNKmxFIE(@<u1 gϣ7y|BPD=NЉW'*Zs9 XձC-Ze|.=mXl b/+rSD,`]!em m),#FOdB-D=S`g=c+ׄ5x,22fsb#ώĿ3,e;h0ȯrҕt:Dž 3 "Eza+g<Mi0N:�KА sYUtfa'\y`E1 a>m! z y3ZC"8CH~B0i9 pxâ;C!~xs"o@ce{A`A:t0c;湴B&tHl0$3i./ƸzcZъ̋Z/^`TJ,\±9gb@Nے4=srIIiӇNW6]Msg2,}[P e>a?¿9:OSr<h-?rG稏2\/3<&0apn<O|$y;^C5 Ec[y'Ut!.7MrNN҆N0"`ӊyn͜O,\*4XMfX_@uo4?*/y_&(n~R&4vѕqV39A!3(bt1f47lb&SBV8-y,y쉓z-y嘟s9g4F$ wsnܙs.Nt"{<$"PLi+PLf;kB8)盾+C,r{;l\՜TEYPYN^ bq3/>ș(k(4[iH Hs<} e<͝r:{G0_qfgu<3 :1q43+�[cIw|({ǟx1L]iYv v'ܞ0B؉ W 'C {ɓ)mq9{G35jWyn?{О?*l~hwFe岜l@|Cd/FHpQffeg3XMXz˥s#ZG<eZiH,Tэc* pet*Po𒟊ձH@F(ه,T`>vNE.%XR\h5fMd Fkp;$d:$rkR󗩠c$/Uj=+D<?3dfla}CGompWůrck_5ilfR5ZNGBe/gt‹.NL::z*-Gyg|z&UBsYa<ޘxpϱ~ )bu3!x9͆|]3˞׌0N9 7vy P1'ݙɤVFdO!7tq6M9#8>F\4ޥ-+FVFeZJ8=P+staKUX30b{61WYM/E}kƄc:FY%A39[e\M_I3o!ֲ2*Q3Uj&,k{5?Y).1)8c_7 &J.geUhx/[nwg2s\ 0/Tϩ^4&d1v#b@! ijT<gv #RU >b?*+#hYF)94b%fOsܘ/p=Xt6F0K9Q.dKRyK6d7V0 ҇l< {G{'�� �IDATg=9Ȝ#6TLOX |5xaDa2CM]ZwN ao!˩Rn>Qmg!{4=z]yOc{v|8}2o\R�׭v_gV8(WZ&]ԏtyt@gmVlW,!E\>d8CB(F부\(6a*ֿ<Ǘ"6z#w0kE$h7`!㲶eg4/PYd2{yl:q)E1gh:4y>A)-&WDXoP6ћN}p1|,?8x2Cz1iǯYCrtT!WjƲB9 ׳6*lX 싢Р̉P̥0ƒ|c2f ^09ЃЕ paaXneGiÕ>^q${xd[Ofѱ>o0jvpUw)*)Hlb1&#qH~DAԖO6F };c}'S* sn"gqfKTYkn&iAyDQO04))Ĵ}=m 6Ɩp ʸc<\&Xd%戜U*S;fQ`MЬ;)۱X COZ ^#^P;üIeg":għцCFJ.Ŵ (b'{C!rdsN PrG1:3 SGWч8}Zs 5\i=R"ezӢYݼzj'_vjѷC^5yySLݩ9Ѝ? >ЮV)ŲolS¡_ld3 㡈y|8hF048I)hMMI 0y^,?O M'*o=&;F[;&co0F^2>nX֋q. ]>%M]*hZRXG7Z .ŦQ2GL[!Zz{Yk]!'Q vcU^`-Gíg9?&1&^uR jϞm׃f}y\1/Jo㌠<YEa-| D泐ɩH7󮀃=y/g3s0MdB'G o%=ma*]|Ꭸk<6T1-{Lv o N}u-dGLQNRPrjh$MsF.aIbL/)Y;m1]ff?̚t.W- s;;$*l[cȆ$EP#[c>ͧC3q;IwN)^FHh9});)a5%440ZhK{$Gⱎk;p/Pa(dK$ʧ-QG~_q+hUN0 yJ1CI1!8LޞDۖOV6MXwWucp5'K|ɲ.:<OYdJҼȱT׾:Z("% *Z{`VӉ/gckPތ~y2V3.s5ﳝd,cF*�p>\zv:ձVtte&{y)fqvj!R`)ʬYP㌧uPB*Bfdx\:,TPl'WXėt:.PVɧQ??F˞ o~޵Q`?.<emOҭ%TЗ9I'6w9b2[>晚5;꫉>ƭi>IGI! jbRFF&;)6Tød.,Cx/ԥEe)̵B)CQ¹C]òvd=j08n2m1^=̲&6_呜96Jtc&9*xm* �lr^c(2nPR2y~b,+sJwX0 ?n9%+Ukgְ\&6!4;78Z쌅s\=9`-hPT5 dw 0*8Io^ Fn"!Mlઘ'RzgSh:Fc D$!myTf+mYKs jm.C eq.ßpwí{\m~>;;=S Yrc?Y\iM/?Xog32Z]-zګkHG2jE6fQ/Ƙfnt g}E8}b(:~i?:㶬jsE'&ELRCI ҇׸y&d4jE%c#3 ړXtBj>kf f4gr2%ֳ5uYqaEB'dȀOǬZ2wO?:xYʽd M>ơڈ 8_Is Q4T vXCxLݦ|hTZuzg=AuF|aO%<O8M/r)sx"soЏAҠ:)%m&Ƒ.�׳00'i>O1gu Jn! Ԇf{w f'QZ0&1<KRS@CN*8|)+4"GW%/zpw52m6WRʦt$C( PBz1niGSwp,72UEhz[O<W)WQ*ǿF8NC^t>;BPdô1'cr6RPv<x5ʰ^{\3g#yOyDS'B` wO#E%L0yk;Io{.ݸOuƵse-l{篮9Wl6׎)/5Xm, q]uN"x&uIp5L1oq S5_yvы&X0wb$2HPX`.=@ A9ӛc0x:=)q2Cxtc,{,"P7�Bcǰd8 lĆ6q8ɷy<\[2"7! X|N<µ AF`Ę-g'iX:N.,Dױ[XNRTЏPN26*̵O"h*}(ɠ>Gg,#CLcғ?Ҍf.AS> q]WԾ/ 㻴LHLxE<mlsax =p g$[hjc 5Lekj(a81ߏbUSDaLb6](V80)g ?%\M ޡ:gӏc\#lf?e aBx-)ϝ3;3ɯ5715;gэOFrf9_74d7꩘%uNÅ!ͩ=!}*p q[NJw7n Ccy| C_9Ǚ eȷNzqHLR 8'߽a|Z(8xLpb|d`Kԇ1~1~`ߐ{s3449m~U({3lva[% s}hL;Mq9]xr_Mo)NT1A 4bOs Op}9MhIW~XB<{y8m>7ǯhl| TɸFL` R0/+$0ߥ-9_i ͮ|эG_~<@k:q.qК?&2{YiOp"娊*n` E{Z;>M (FOkÏ/Joǿ;39L!=0:{*֋~I ɓ鎈i,<-(7ѝPBn?ePуIdb 1H e }gUyߞ:Co� @ ɨ \ǎر'qIʼn(-KVޙ6LY5VX>SuudT|Xi-76 ]n24q;dI}!nftrhEd}_[|YΊzzdrx=}Zĕ3G Fzwe\F'ɿ0QS,MX,%)N]qO2(�OӬ pVy&9GƑ6*~uctee%\ nf--YJ\H/e%9Lv(#4m$ftɉ-y[Ł1'd-i``=XV 99dNGҒVtg/(&>ֽ*K"x5_ cee81~l@ÿH~7$H3цSCKj&uZЋ]WlFK42G!_0p^%q}e |ږo;zJeJZݻsgZ}:կ{==QҠq_,fZòXV42+I<B#1(.)JM"O(Nob9G~DVџAw|GB2WreqM_&YOc5jXF+nc@v1 Q*) tbu5RFQN1Mld>;L'gTfg kB ="(,O# SX<v(X/>Z8Oi8E'zi 2LgIzn]72Yp(NJH;G._:GYL|he] ZG`l[^t8燵vqYT4q?l ^aͣ%^Et[=L5^LIZӮRM!GuQe-ӛ{CЕ1<Od. q#2lcrPCӁN5ы};*I^5sCPCSNґ!OS>#.s"!3g7|t[΢IH͚,5Oi0A^3T�v t( AJ3#jN`iO3GخК^f;Ë33\QVӟv.sI` 6&;~A)EzE@_Gr�?Dcp:.N{~iFĵtb&x UQqQޠ 7(ZiLH.0<q(iZ5ЊS rLV;Ы#vvW>jy5]ٱ'?o/m-ʷm{4ۚ5(e3һ8ԕuWB tb3Ync P !yV,%ɱ7QD)Dm莌K5u9dK9{>ࣤ/v<[OދoL]) AkzЀ7NԙN[њ8я]sL'9#0O Y{7'J 4^Hݑ)P]sG}2 4f y#T5ǡ&|d щc\(~Bo!DJ v*hGψ[' qHtRUh8x=AGgo.jm8|es)G{'ZЛ呒>fy#ci-/3 2\znoYU]75qC%-h4(>s yӁ 0<~IZrCD~K-{o>!9N1]"rMXjX>*s!$)J<SwijOUĒekNј5{,Wi {&|яY7ܬ/cWVCoZpn&ٔc{!KO.G- _k)txik8F+ZĪ.%cZSAE8v/_7Ap7}1"N~|;G<nOn!D� z8ɴx<Zqs]OqVq-7™B/oE@>9a5KcVƈDw|_٘q?˹XvK\cQ&Vl:gqlfGߺ؄} J8EXǨOOc&78"=8q8Ύc#}cM,nL%<cjm59oLd0RW) Qku#O1;<T[61sy<19^OM|Zs<N?>d/9E7\Oczj8LmfGGd&3 A9<k}!=A>TH0J̦y(X4е1OZ諯!z,7xmY:rֳ":Ӣ b%1 C)6i$;(p\M]>+(L~Mq~p.hXN7q0c7mktKHJ_ˑx#+h˭ߕ1k q<G87CiTYCY A( XiVyL7W jR|c~,'㑿AN:^5Yϳ*(8kC\5ו0]w Efrw\y38xaNP!a%#;'.߮HoKkص] A Ug\ofXӑ<!HeT= fj`s0|uqg~ݜJk)gW̫g-yJ=~Ū0pv -ƤJ0ְ&C(d5Eܗ0!є~ MN!skzvVٚK|sŁg^?~s }F|ղo}& ϟW4/P#qq#<CTdה[0a? x mg!GOfqsd Jgzm]S~1iL>c_&xDmX`g|fr#o1xKhI4xfhqzWtc76<ROp4ZW&CRvZ cH/0ڼO;<9~n--ǒf ݰ?g[_f!aDoo4ѡ|?Vs7g,K)<d*Y̤?Sgh}T>43-,3d9w<!vP,,Ә[ďb9 @ T0T̙qilbI\Z6SK ()f=i%6m9 b ?<hladvpOۈL(�EnD6o[Cys!;K"_uyy,7F8dqg" ~eyAcfhn=-lɰ29S]ͫ%Okt '@e&tXXҞrX +un`78dr.qo�j7ChМDߡ {Kð?D}TDyUq6Nq7?M┰(ATN 2c'cq63I9w�լ1-^Qs7e5<*w_,Q>b} RA?|=y}\lY(iNMfJU*F.2 $cmzʇs.>&#ܯp@SPTrŰSה|9T{x]t/d}f-&,yR;@W^5W)c #\ )g8D{^-9ks �9\fK#7j;~DG~Hi#f%mlb%bOL]~MhtMh\z &u=FE2S"nm]Vaβ,b\/ʩ+E|6iIa|)WU8:q:7ǭsjBA�� �IDATᶳm4^$t-5n^kXq=Sνlc4c9y7b(R؋b(E<sq3BF4彵d_PnS^ƻl6 M'>e45_%¢eNrqIg4ff/.kHm_6gB639ǘI=ſSf') /`scDٖ$"}G-aI(GĨdj?Z7"em"ԗCw7W&m1B!'B.w8:{dlmrͫ1Y=!1 _*8 gyݴoDa:訶P&NPa!k͏iP69%=l7,^nŕ ;j2}Uu0_I2p/fϨ,4aI }.͉b[zLq$ё:Džں0#AgZz`zK/ų};(-ۣM2mǍab~_̸1c/EfMc;O?#ٕt IyfלTsmHTNE\ 54{X`FNyЏ( ŔqS) SYFz8L=2;c>\ 9|8瘘5X ^.S^l+M^û4DIL;^g7&r. ^eaDu$ph҆L5i[Is2VE-MFw8)&vƖivцr=!K3"[=õ<Q;UYҔt^JmU֏bΐ3"Cק�Dz:2I2RĊ >1i=\>ǮյfLA5)()ee/"wsg|yl;;c;mlBZvR$7)]a+͘ȇt'ת)-8HpX`b B 3 og#l.A) -8MYQ;R%2W~7)`l1jn1NF\%uК23a1[Te t (&k'wOu*=(YfC_ܪKcfJ0]V{~(NL 8,ײI 3:%zħ%,=cq:]S8cpb=iRehR:EJnl`p}9L/oq 0}\`{�ߚ*}^;;hEiӕ(s}J6ml9e*LSws3L2gZ ,3i4nx>uz< _E )H YƄjԌ Io2Jӏl Ѽ@!%YOw͞ց!, A.yF}vnYj? q {Rü@K t`/Whna9Dgy-+# F#zQ"8ݹԕ31i 4}74# q)B{/Ņ&k)c]QtLb?Cj:726ҁ[8Wiˑ-`#HV1_qGɫWXxGV<K>D+J% >eXV6?e19U|(kUKn]]b[beN#3_L4+9d:dʸܺ:MLe ncgrUC>`hNvsx"\uXKp0eYJxNN$rBQPSA,1tlZ/RL{"Vhe^"򃐊.U{6gܜ˕+Zɀer1zoOJRMl86R!ڛzRxOr͒:|'^DA{FGBNQ7xҜ�SN;T29^q KS@(gWSKKc"mtgi H&a$,~s;?;k+811#z:ە<}zjopL8s) :xk2yWҍf|\ܟ9<_n)R[>ZӏƼ|oӮlJIWΪOv?)D4VўMASYAKx+c$86QH&3/ #4fMn:Ś݌,�ò➧qU^a7zg#qzNeMC󙉽Ne_<=]�^|XVp"YӬd E7yJ9/!>,4k*|Քq BHkYǯ/Κ=/-W?)++}Xk#s/6p 8A mJ#C_*nc8p*( $ ˢ8k#FD6N[$3 .r@R~v x]% 1eY7Љ,t|.G!Rz8o0m|zsyγsnJ+]6wEwhD86oS<999RRHi('1G:ǐ%,ߡo38dL/UOjSi}љ|P?g5'"WRM59Db7<Nlʹ\L1>.B&4팢Ľa'ZWSgJSfvDWa#KsQI*i@#1<:eLL j{' yUa=G'Ґqd #9x0(]Ѕ{%[ՑDk&R4;Cq aUuF3#\ȉf|&H;pz=ݔъ;x<19J1O)f1iw(k`n=Ccފ PK7L4zGiFV:M =irwb XAZ1|r gJ(rXJ:0K[HWr7y!P c7:%Sx'$#k䎈'uԤ-k<Gޭ8dRئwZWT3&VӬt&x?%gix4oPg[jXe/Ũ(m68;,jQY3\`j.ѝ鑁:9\&|̽"[Y?b39ДB^3p<J>WhlS}jit6Җ>L;x, GE[-^9RQAn}h ЀݱH-I(jzʂaؗ ;߰4 j%G\f=h}C{#OGeV𶢯?_ˋؿ/Z?Bݼh] IE1N"X+Ptb%S78G֤ΐ)3U/q' 2:Zo[Gghpgx)k;JEZU+'G=3 O81ҙ_?18:s\as?dVm1B}4F7j Qq:32q=s8L09!Br:QcZل_y%8:*01pJYU+O#2>贈l59EwQwŕU<L1;14H!Ӊ}h2Oc5IR\EoNR,"]O2f6s)sPvґoی@͍ c"e3ՁMa) =TG1V6驙lњĞPB 0>>pC:ZN x^l9})#2 "!u5C9Ќ,b{KiW :Κ}_ZJʎ|R"?^mM >-͠z8#erWhmN!%Nud>[!͢ZOoxHSa1shk"[(b }˓S=wضҟY*ܬax)LIϱ$i)> Ue-]\Tq1ڵѭ"R:͘JW.ӈAt.g,x749GbH-5K;l)EK6,d41%;/ (>gq-dƔ x$f#I Se-"Ҩ cMGc޶!)cHX1Nyz\49QK.]F*= hl0M]RVG!t⏔29HSi3$uNiH 9[c%}]z2Us46G)A^M q!<ӹ/3\2hԩsA}:7\1xE)B4=Gy$]E9 p,We/r$8s&|ìY@'an9ӌ J, &ZP1tȪ s)g^Z@� ?8h< 1zoh.fK*}GM#&p6}ɥKRPinz1㩕{`ԫ\dYĻ)YGNf'1XB&4=?|l5#jgc_)PK_.0,ט/JB %:H#5{_Zv-zfyFA|R|IS"oHK1/%-L%71@Y&d@9e+\eI+LI]aNi{b X:T3oRfy+*ab8Lun @Wa6sXG J)ilJ0XZ2A1:=f(+h.G1[# Tqezrޑle-gr^+ي77` M9D њf/eijv9\N}Y3XE3# 861z@> ,b!x'@D;{09˩\wp#ȧ*qc%hqM929Z'u]揉T&EK*st˘ɮp2.n`GY&O$~MF?^wʇ`4iIVOJ2JuthEXYĞ9 f2272t#ͩdmĴ]6#l EqtplF\^@xS%^>U8n (dcT9bNXKBӑ[0/.d=Ȣʥ8\%^q6KSB+vV䛷a*koӚ1Ӣi{B1YN+w(}\(*` 9\=GlyzftXӅ!<<a hKiҮ{* t9b5GhέcERGAQ.`bЄ>EjRYYUaIy2+=%{y Bq8k&?TD&SYԌt!O!(ilֵLa۹`Y0=fo{^~G8PΣ 0w#Χ xscL !qM҅]%х&w%1X}d;GkDLq;"RZ&Ֆ'3B-VЍ,"a$M&Ғ8ɌH8ʬetb-yFL]{ˌe.i2y/GXG}ӈM y ,EI HӅuc I=ofLtd8KT>!$Բ&s9y - 7B2p sCDSq[ڥ>\IEZ&3&L^ґ;mr0>42{+׆(|+w؛AX#rCyW[, Cpߟ_EYNQm]86)g͸-]%d qGma6[9H*8FKFE=z+yvNWd{`or(^K$:!#f!%(kc7w,T<M#![C-2Qwi wyr0j5CE&Ǒ }Cbr+?Y:㏚074x*/qv]gGfқ!,"Є-"2Eѫ meRZP"7 XF2 EaǙ[Vz m5;BZ?~KB,EJz_Yg>b'Kr:#մ$vI7Oet|M4ClYw>cUˍq5;045Gx yzq"Ҍl D>⛼Nj$f lD&42rrMN,c^\Dv mjzOqý”~,;"|G|L{:r"~ÌOD!x$:~t6q<ɯr'36vr-֗SJ5y*#YQe^O d:o׺+Q(u/L[g 94 yajHS2gFҊZO8ht5JKjU8>$ݩqp\K:MJ6q%|V:]|_D'p-/PP #p}Eq6L}`R,]s"6v̂Pd&Fn)pgC50Fo~Ysd+kO)!_ W 7`1ŹnX(=В /ƄQ)"Jb6;g+ˑԉI|&ί\"7ݳDz*$-B2=c1[jҝF羕)/XmsrFr#ʣ^`իO5Mre Aum$tcjIYYP ׄG2a:S/Vׄ%Cc1XgX] b}|Īhק t3 M,C6W8[S{kHE7e5y0ձ)Е'T~O c1<w QǬl|~ЀlKNe78N':ә{L|uy\;| .3K1 A <̔4<frLac Y1t$͸K:<Q =XECޡ1߰ZכF]9[J|iƋL _Ѩ\ذ %ױ㑐b?zt%Y#]Ӗqa4(S3B)Xxp%[KSXƴ\w%vVrmD_H[J_Cc4U6 b# h$4+cRu&ʩWS3ԋ 9y?3 V-[{/ZPoќI:fұbr~!N3!lb8S7|]>aI+Iuv8-}D&^f7׎l`m)~qŜ!\-l8Y[le0ޘY!y U:"ҝ :"%. V0ETb}̪" F6]MڪlhH[II⟉Cp#(j(vpрl.()ղlI;N:@x0c^לt #B6"kcGh@DfvҐ.=ؒXE:gt@1r"a}Pxܗ(oѓct0$Kb2ě>h UO4 5|"9¨7 12%Sej{z9Az;I �$]z/0/͸A{EO帙:\ZLlQ^ P憷Gk1n--aNicNҐ.<NB $?f"fGXC9Y*^.egk$z:r=mbqCVwegs.L*vF3/ k5r c"e! *$ͤE9ܛ,o BYڷ@.S#>"=৑N;ԡ,KiMKF6l]I0Me YH!?xDz'JlNK_*3ld<Sx5|aIL8o&P>$l)GȋgAZHة@�� �IDATL}10(<MʈR@k!Α8g}P9Yo uXrMbN+[yl9)A.mrRbFEIOf(}"75 Ռ iB*wy ES{;n|xġ.$y Όʡl`58τTBU2YӯF t8ͩ<J >elez-軜g1]arQGri^ `N1j16zibJ'?|`NVL>T4fGH/q}͝SqÌ̶hgsJ([) n)Pl<0+8VQJsj8\4d**wu<+(/F5!Ѓ(oRZa;m`2#/g�S-_g8W^Rgs4a)4 Dp^ ١ >^3|9DjE0BVIOUg=)>q#?,{?lHeB^Qe˓υI9$uWbO\wƅ l=ۃz9cH3 |zbn`oI ?p)dǹ?@V`j7&u̙3l_rsi&nDvWV¿$6Ґ/ˬU07(A[ CD?6c#70-krec):46Rq吽Dl7N/FYaCˣ!<>K e|T۹c09&i i|H:F#iIK3 ?y9j#@E'}G M>1(j (Vl>M}OT =:Ǭ^Ɇ}Ƈw37(6 &d4`YwP>} sԗw[X/$1Ns { bw*HS="8n@ c̣,&Vp'㳄7gPۚir*lprwzzU:*UDTa.Ęl9;dgmb,DA@Pz# ?x'O0kᆵϗi1i,ay^g >{38/~G!X!- pnD@BF{"nOl敀͌}\ 2-52/2QJX„8] p_d_u9p7op1S\ϋ58~ZvqK ruI,u<O9T6&T*-o37R1D78�.l\SN)lg:bEp'xhna.h䂝;'<ڥŬW~L\Ғ[8y|Hl1O`eAP&\ !@⺵vZ:NUO~KW1XIUU0:(؀3>26H._B9t6=WV$ҥ&UYX70j$~*(r>[H)GF{}^`Tvqdh.ɉ|1ZJx-؝LLռ8#*S 0]ا&{,=0>4 ^F~ .IN/G|l?3kғq~a̭0 -ɇ4"? oWM6yLf0Ǣj~ )І߾i])/o])(䉰<B>BbQ#ůc;Y<у#>f2*Z,L<Ĭ7X!*) fRH9* JŗXD/.؂U("xZ{)ʼ_W{#"!reB/R,fnZ7�ͥqj<Hǹ\saIH<=j9S'XN)aW3m~Y%Z3*`F)O>.Aq39DC*Mp\~2j!RcONY#'̬GBVhg}YF2/PNFy͙ v-{A's{-h5Ά`W;Mq#Ł24 Xm|LwFqf+bt'YQ`x)LF<.u\609 EP@p)њ1Ϩj} ̙93X'bH_^^ZQ[iB>h{+<ȣSؼ. RXeQ"꩜Ns9m{bӑuw7 zHcF2~:?1WXAY+9v&'ʋC ق1q( <Q~GjnUa'ʘ{XPeqHSc1= >.'MCތ/U~OI3VdSʔyO0Y R'+-+./҄s坢Uڐl611VRSf˟AfA]<O8qiHv/sWaz~[4mC (~^<#⃡8z ضH>;B=8V|R5mynQFQ-,U-Fe3]veZB{0`} (g+?wS|sVYI oE {c<$^3"lyHiw0 NҖs#4}u/Һ&tLscH:4Қ%Ljz e<̤h짒QTĉ][2-d= LGš�^ q `%Bp6Q@]ZѝGߨy!% gEqE8p,5yӉ8:,~9uQ"<ITy:6]ѝ6<"_3oSB9@3+̱8v8lII2eu[mID>&b :/ꐯk)RKx"֜Tɶ=ܮ37CСUUVěK"g\^bst[Ǽ(I1IcV_|Ea30<BFr4< 洊_Ľ&| PY%ʍҐ\.pe'Rw Vs6̏UzX`a E, EMߵuE,8`Lpdcs;|b,/&~GZ/YA)ZVvՊ=.%ѿQRgsqնCC,Q t=4S=4Rb6#hT7kX͢Џ4KlGMuES<628K8{r1׽ð#&011mNMt!>i 9KO(4}wĹ>MMzOPrOgRyl<PǩBͪ\Z)Y 7< XLI% gʚvc~orJNMpٙZgVQ gFtauI'twFt19o=9ZE^P 14kJW.p#(a[eL~#Qc9sNeOqvp!- ANqYMn\=Y=7T*+0,Fų3ʏ(d35O.XS%z籵7TulsL@갟>֣o$ʟ)UeVU5y{IJz=/;8}y/\_Sfӟ8jДJ6 }xN1]UkUiE=WYJbONd^<-?Fs슈?iZ/g<;,8z9kU&8 D=4EyCi!t/.>r;vZyWLwFJ"F_G%fYhrA ^RL$vM"V)׵".¹lӼ$yJYG!oЕ1q9 Z0ݜ 1#.Qai+9ȇ4z6^uRF6/0:/Poa ola<c_j4X0Ћnwbߋ3CDZ`D0?ԏF>]"tcaXD)׳XUgeNBgG硜sͬb=(&ޣԼæPE@"&\Nt sj|szd5ckG >,t'|:3Xf/mf-B<E'#3Md/0.g\L@j2oGҲ(.ЊQ6d"CxjT$383Cϧ_L 7Мř]K)_̙ࣟPGz\Œ 464#p,z$`8!\.p2Z&GJd:fW7AIJw{36yǘH!%e% lp(te+Uޣwł>\ZմCK>euDP&-c9(gbg]^J,<&̉謜|K!ytdCL͇/0mՌ"scUíBUmM&<$!{) HJ+ Y+/Q=DOǁv6FmQ Oow,m9QMȳ]J8ߓ/?F)_Odr\,Vtm zw:2;Y &f<s.L\ʹW-cN%BzfcL"z3$Nu :\AT%p=%kTMʔ$l vE$.CS&\E5ӍŜKV LU;wx(6ŕO</3Q>,?3MNјY[\A>萙A)ih \k3%x sIy˼p,m23Eqr 3?[BEl`r%3c"|dv2(ܐiRL?^!p<]fZdn0IsېĹ/DHM㜥E1{c ݗ3"wN3d~77x+Nz卨l/;8OЗ_5#9c [&cfBltgC4[s҇Xؼr\CwQ0Pʽw-=D5ȪZ!Y>5.ysXǥ,Z^ Bf#c 8&l2/$N.b3f- CEQ>xE9UY ,b- m*sin[f?7*mu7K;fII{d@>$+XRʮ7MmW˧ĸhE Pƿa>dl �_jN-gA*lT n*GEB^ ݆7 ApW$1BďQshSA@,xp.{U\uIh{XHF99;h)1us;yYt-gNsB@[�OPE97hG2"u?o3vѰ4g ߧyM{ځ`~=mjr.hIEe p\ .A)79AS%8BCY:y<ŵ,^`ӅXb1 eZD0 ӳ}x;r|JWֱ.4k79Iᅿo3I3mPT>2ޜ-)иEy19e5LO~RÃn1^=yK9Hjefe>t }Фan.Eޣ?|Q~ zv09<s`.\f(/8H 'Y,4͢|% 1$O�QPn\/歠1?]+](q40dO>׵|wChTY̋NUJh&Z/Lć0AklzEKiISx*T1vldɹŜbOй0 WhS˂41saԖR:U(.:CJa9Ѱo݅l`Z mp<NB?i4q);T(ҟlhĭc>M- \ˇɴ PGiӃXA7*M ,<oQ@;�r氝>WA`bޠ4/]"#R땨bhΩ8_"!IЙO@{ӔhAhv2!0CTq. ռNR.>]>u#XP 6ӓ'F3ZӇ><FocӐk Cf0LA~pl-s-_୼yfȨ[֬&zuzq[�\ng>iz. =nw$f6ӊ7hxӬ@sg1`sbEr73Yȧ<^r5kiaHoE!i_fU0 RZ`A'ϫJ[u6YہXК&\pkp.[x4yG4> z[*&;h Nsv}^Ae0̂&' 0[9#rjnNC#x.%aLNL-4weRhYm"uWq~ 3jۓlz[- :^kCMi1ϡ/YǸ4ִe>t*TYi3cx-F+&93GC 3-*pIVAƹl?x^XR@ש]//e]DcSJԊaʞ0|TR!0KBSlaR⫪vaSXzRr0+=WDO >R9WM;q /Dtd8hE>ژ:{8[ 5ό`(HFYюLYo(e s&,[*0Q!&qvcߛ"r)_vbKn9 lc504L鷮 .N18H'p>TkǢVĹbsE)_ qdXI7-ƓF;icրiYnjsX^:Pg i)f@ЋsRY?̳=U< ehqVDGw#JCFvyxBP0N/F92g8+-wެG\E5P<D!nΙW()B6!ʩf?UvU_b@fm/ 4QR8)|,+kR}5===b[Yc: KƙjݙI%)b)fN'^;_w\8,Vt Ud 862V|Ԡ?D_Yɬh̊:4Cp[#mr,Sg}ET-E YSi2=.~5G_[>ۢ L.$TkzDGo4 +П=wt�; .2bvy@9䣞JɕYE7zNp54T07>X9`ɵWjr$pU82 )9 _RKqRq22f$kU@aH-Yn ;#"cJYsYfkԆp'֞aFYJ{6M 73q vf:hC=fPxZa-:+F�,#bHD;- ْjBTg% PN ȳdP' 8zilK8 , PV2w >o)@+6&cp%`/k!.iZ̢8㒜YMh*Fg"[ p$S{$+0)v)2C(SV<{gQ+QrJРO۹מ yljތݎdy�� �IDATPէm J357P!oq]]3];?gh;\~exVӥ?NQc.Zg5!29em=ma5`"[ Rj6Ql bӭ'Z+ơ@Bg(yótoSĹ @�N/a+2shloX &u|B9 2SSw11[MswPw8Ǣ:ZF7B}W]5_Xg j%oT)]38v 3?bQ֒#_\|MSjay! W @.~giD%R"SWίc1'h<.Gp¾mң$ȟ tɆ݅, j:XGIs1iz5ky qf6 L!X4RǬeG9Z9mmr|QVs}s)#7+]@Rfр2o( N@Vmw~7;#ħtF+uB_zpDfTiDqhF,gO#<Iߦ!ҝv薒 2{ Ϲyf"3 3:(YbIVr# hB3k#7Kn?j/FxdaMU,;+i=OI=F,f iD=e2{/yy9TР~ 4ww)gU5_?1>ji$ o+մ7FׇYc+3Ly/m| |C'D5[owC"*y?Cpߌ!ܗik,Ws;eyr!9֗yAS+kY1V3b(k4q YR8k]0Lf(h ت"' o>R84&H ֱf5+9?B[1G"Ba):ieOY-Ldhj7%tbqe|Q2Q.ng(by/.%0'8P\\qvթ|wh]7>osgP֒*$w;ȪOo-5R/*gJnVθGFR[i'I^G~0MZs7֤š#Īpcz*h$mH&(ʜ|ӬN28SA7z>eV\DWrq-n2O%u,$aj=W^גEn.xS4)M\z/b,Q9ެboNiVp=p%5(ݱUI m}u? Y 8I۠ύQmfPpy8{8Dذa_49S1RmF7!1et/Ovrggt1Kgʠ`6$ $V&3e*J<Yݜ+8;<dӷTg|U.U<9.]x%SfM \y"_cܹ' sG uT(ESVdze,-Wr{^qa,&_N0lG#\!$!&F2v&jΕ9]ޤ8З嬡#g:yׄ\ MI@M?6'MU3LJGlg6 Oz9|U&-a9? Fkr¤Yl]zqnO{ǔRc =dN[EI?FŬ,8 _3`q7M϶ߕnF֦Րo M(d!h $ISmlpGPfV g7JލSg#)2Л~-8Yk=M/)ɍaS HNPԋh\YF8֤^ p&!= dfS߸Ky'"2$aװ74D0(r f@®⧮`&} jƬ.1Wр~TQFvPxފ!m:UZG3:puL97fYcA8me$ fGzs~{օ0hFPA3>jJf\ꝩ_Ϧ"߬V)�˶0. @>jlT,oNHhDjhXx6Y<K 4jzdGY`N`i�sz!;Yy "{~ b=;e5%cB6c8,QN }ysѝ v<@}C^5a8Ȣę.| U�%Z2ҘQ z.%=N |$qP+;A%VaU Ѓ\ŽZ41C&wh$_XTD+6ɱ pq<hT rƻ0Dy: yE &{Xwix)$$($І̼֜Bj1|Sp.VQ︔&T'__)-.0 `ϧ#K<"RɤR:Dk8'4aFO6~:)u>||M%\j}xf #D[Zѓi4&ؓ D1qX5!yKˆzx&ga% h4W8k~}+a'ZQp3X ̤ElizњWhFHם̍c- ݔՀupЁ89=l Zp;jWSf[.åyaAe!Vb~ Tr!MBز6E2[k(g$;8H#`) M爭K˘C .g99H}\]&s~<ȾOНt`ô9! 乡EtQ$iy/ߕ۷af U|i_lfӍy:JhN` \4f XAgfҘN'mBĔ { GkW'5GxѦU.s} >@bm8|ɁQhZ\`93c4p4]Kp L`UXF32Hmb "Lda&+Łљ@LC0fdw8rZ12ڰ~1<Kө>%O+3s#`o61E4f9\1<Sc;(d6=F]۾*ӀLKd/()bV݆ Ljx<Kl�<SQP#FAxkQSU'C!-0!'Jܬq7ǹuXǓc\ަ/Y9 H YJz&02S >E>Åɹ-% (DK8?cԼάfi]ʨҜojŗ">'4ﳎt`? a~Z[Gvs>?8N. YbXc)>mcxvA{$t(ե_ЃAp?-r6}&nE^;N%6aaLG\B8#_.A)22` M~TEkaJ2XqH?үe o/1+tFW񤻏[þDxb8^Ri88zz4V1tc $͜ìBų_y<,dQGDx~߫YÍ%,d+ؗY1gJB#3_AHmcZDmuf@˟ǽ*͒Lz2jG 3:.COM{0m!U;T%!.0b,.$9F=-r><v!?,cJ87D?31<H9FDnmȥB]y-R?> ,͐N]QM8S'aϫ\m#`VфEnXqNQ=|y%NL$;Łɳ|4d=1~ϻgI?~%06#1=1o jWk4y\"8g.:BаPE7eHc\$@_0Q2]3<Z%N΍n, I;YThP~̳1O6uiӯe q_^{fy[͛u> z'<Ssy)o^䣈<? ԣЇ|^[|,~_`[ ܘ9P)Pvnt_q"sx |a1fndWkyha)p+҂Ǝ`,5e√~+*އ9 3xz>Y;wdO`l LH!C++B$(M)DIԘHLk<W]m hElʴv5Oy EOP >tVEu~os1q\VG"UtY gk/85vQdLQ Gxɵm4z1<ڃ'(w&[FQ x!Kx YC4fĬ4Y͵=$Itk` %ȡh_KA<1E}A^7=#$ǝ 9U1[M>Mg:#,rqUK QP?b{� AYl3k͙ZURʨ̽YC87=Os+YA`4`W4RYdvG lEu&Tl!v+!"ږG�AzFQWcMԘ4/͍6m9WxdZ*+s9 8͉~5CJ߮lϬsor ЁJэG0,vOym%) d+B3I@ݼi|ul39nʩSvaoĖ/=eXy㤵6,/^4I+(f '9D4*?cOEѥ5+d{9)W(x}T8l,}9szSYY^ ˼E+)LX+wd6Yz!rn�#}gS#P{Cȩϗ/1DoI)L)#ye2>C[N_@pnwah2/f`cVTP8:p"^)fi>މ'�Yԣ??>y G4S6S ^BuUI ?-e֞5K_$[ }) 2 YRJF,g\d>#k"@s.kA˞2{q$8> WG m+ӝ㵦V\즩W|Mתb=ޣ=7Kx?xnj:xs)KShQv7e]nR\DHa"qF,XXwґl` 9IcڇsO?l 5i]ra cJܨB*pC~Wґ>0'C$r걞 b7[*̮vyDW|S pLSh4=/Lg%n-i*Y'lu999 \y.Rf x 1B2!Y61N:}x" X.yPF -؛75ԣ7CN4bYs4c7_eE@$a]%eLX@Isٜ{Q&~ytf9tYOp?ZNr4!;y+;\`tr>iٗ?|w HG)AV!TbMT&_7fc]1wY4 6@Q{gLo~_g)}]y9hk{MzEV[e_j.`7s%4HK8SĊPV:SS׉ݒX6�JJmz-sO hGYOcS?ڗYreq>0 tg� APj2!t1ǹRӘfuZ}f7=,$Ã0sQFp<ZhEӨNVR`q.ZB?Q~n/9N20eLlt>-C5W%miŸ?|8v`l'\EUy_!DNe%煰p�OvtYajH}ure\؈!EfqQHCɸ"1 h,q F!t=AL)|"Fn~A1υd =~Ƭӿce"d}{cVL`3kzy̎컜 %\Op fg7b5\z#dC)0uʘgYu}7Y:_$f/ dfNvSJk`1cs6"Q’H"e?!-̸ O"rМq>Al _ d!f) ԎTm=9ec  OCֵԱGim`trƥkpoeW0$x!q!WД0QGyYB^gALd/0b$<eY,Mk=^nKޜNY@y=RU_sG$B&.28og]6HOmdx:xs'&&~GJ%x'w1#r 3'ppna㻜BXO̢G/`)"T,/¿kio}'=)`8SlP,lh!CL4xw &s(լf3͢Q(8Ut8PlQ,<31z-ЏiI`|w0(^6ݷCfvc&}] 1!>,mzlh P%...vի!>#S:/*lf2dEĠz$[{Q44mJ4^<"*KX$+0{/< KM9)en3!LCX]Ρ+YG ~X2i\%Sos(Te_WpyICaCx2Igۘ͵,4#bZ3g \j<6r53>'e_a(m&q+Yr[ERB+8 ?,sx '<Dy׸9,ǻhLY/YBq~ Q빆`523;0wZpu{Ѭvv 1t,R1y>hjg2 =וgYʥtijRߤ9sy#9]r:>`41҅՞b?p~T3&UܥYw0*xVoo)`F,@^CM-nO4L5E9]]JRz4b}~ӊ[gZHp y2JQ^ƬE YZ8[dgW+Lⵢ8b2>3d` hR ٌՑup\Klbpp(${Lٸ7AZK%] vq,bUXN2Dpj}6 VwaKLmMֆSLeq8t ϲ3ȋy|q= KYxp7MgGIl?SnfO|0'B2m"WB͋hGi<1ޥ? &\8sIU2Xf|F{ {4]qи#;cu3 }.9eB:ЖitK}" ԑ\$.v&FwhӜ 9.;HA0ٶ�� �IDAT.NwJN4$J AYReՊG JB)ϰ ~EL/KXr4IG#y͈~V1�fZr)+y#4>E~&&{)[FE3ɎSE N\S_ >33/gTG4wjTD^ {lg;%4 :ÃYAkSK;Ֆ#orr(<7 Rjfw/'4w_s^B+'G &pJzkYWm<jޛ_R&$k{'/M\ɇ o7 a:^gg-MyYL4s8=<�8iNw7f1g=ܼtq m[YKk;C#n'H9Лlx=<#v1dfNtF xZS@Mõ]x 塥jqSC:^K+q0(:r&PO# +ǚ(tRMБ.5ʢ@2I3.(wM r.K2^\nL 't& 8Xz ,.[n߶yeeٜ%ޤ{m `cܲ#Cw\Dr0 ]ٶ_UӅ�\^(ckhZUfAƇK=F_ÈƙWj�Аqb8/rsH/ Ix% _A^)4i,UGm&dg E-M XԺ4UN&o*=?^f蔕a<3{ t # nSfTۘc%[/#ciǍaU(Ċ0rU`%JD6�A@ӋaJGjkJf,f>s(fЌ[A xe>{y*{9M/^)0E?]/tg1kc:;¿<0{5r6s04>'M |jIDD*<'m 57$'&fq95~P:ɨݍl^ZnܖXs-ޣ8YUHݗiTVH2KsK)sӋK(+vm"@@pVEH?t_##}03#EM ^*nKOO sͳz\ªMgS1:S�}$RH83c,Ngڈ,D)K7r/wbh˿[bO09Ց9λ0{M=QbrbF݂ڊEtahJR C(X{9W\Zgk]G4C9C j/-.>e~W28vry5ݨ!٬K䨮(]h@?s,oxs7JJ) JG'q9r8c 2,eiV1el" Yb+fpD߶,Uol B_[Y[FqS?Cne(.\- ˵n&1ʞQ_>n۠k*,dd}!4r "QF =rnf $VLaUd/pw+Z6Red+ EJK>q!nż"ë;Q+A ZR:ƣ ݙN^I ܞjA 4n"tf=s&f f"mpZ|NDhEމ'[;ș^:/Hn;*.=l^PrwKl'W$ԲdVґ=ZDr X25=\s[5->y]k;βiIh?gM Y}g6s1U!&<OXN<*|il Glg$8H Q싸3aÿu℆pyp-?gŮKhM.x"Մa9P~5FKj?aUv юi|?kMjATTZ6XnZqV,j*ޜ\'$&>e1E\@}3t,;t.sƥǧ.nNЇyVp;+Ϲ4Cq]eN2皋E1Üؑ/d"%gmG13-t @:&sJN<nNlJlUZ\/<r aaXDž[ngp=bq :;|aNӒi)Q?0IsQHPBc[C|#CynqdvHL|kembӓY>LLއ1Mb&"춈oǥc b#RQ? co@Քe._ 4Ib>NI=ώSM,H]zAj\"q!0aVb{ey8x᝘޿&d /eP|/ӂzt`3(O1mc`0xo5"qvco ofM'^b>`vx|]9e?'/yowKiPyUt^b3ښV.-@)fQTkVҳ__{u-LFgssum}^g=1LLKTl,ut-0iZ|̵'$jhI}myKM_u+j n1qfǀygWowV/w7<WMtH]jax?MApp~QGvvs 9C!m9C0}$<=b9T)̲H)[R?ET}곆z (tj^rKH(2٩U|9X7F==$cCsjΚxg"?G_\ۄ)줊ҌC$ 5(C'5Xb.=a9MGQA�##:gPiHwSIcFqҎ 潀3T[`澼}<DD`bt D"c،b`{܎buYs{QB5goP$p |uq8-}&0_3OSu9zNs>Mh?vTf@ VX+cXf[8|bKKi[iXH%RL9[)on ՚ ̦N%.ld 3iϋ`rŷߋc7:LWWE*8Ƶ Cцe ݜ {LbKbk|pygs5OӁftet-,tn5LrcL8O1$Yyޒ4<WIE]I65W掰cUoަơmXi٭L�'V*CFj R7뚏.?~L^\ڭ.Nv./tmޢ'Z4-+pA~W4U[ҙ%Tu*ğI!<j/>NW\Hx[ҁVtd37PIgvЙ lWSNH3Ȉ'ȶT+~ê 'ravr<6aʸXFʲ)fI^Bq3,pDz]Qsh\bMCeNT6i v :pĶ1+$ě#0ke1"ueGZ�|ObV]\oLz e (Utb^u^P;~ɛQW҄)\˪/c4f]9I3va}�Hўlrrk(aBLY>5Mqkhdvڇ2)Mjʨd<sy+X-BK @3̶!_CEzBš ܯ E^Ƥfoa~XM;G aKȾ^¿݌Haġ,58)lF0Bss4ތʸc8;B83ETM|1v`F'^?71;*24y{4@}3i|%ue!)fTRlqs۬GkL}y|&BWL<~dYjO<{~Գ4ulIs*mrU;O;>]>̝ YO;$wI,趤r&V{yKW.r)]` ץx'LwT^oښ:%* V5^f<9RmC5y( yܞ6utJS)G<)S:7o1?msm .<p%2'&pPa5 Ī(EP+c&҃\Z[rsL)0|FtxW5SwCEq{{qYSOo汒VѠJgGrtVW= Eǐaq\é`Uӂ3lIlW5$ytTiⲟ1^ϵ TFA:& NquUA1nIJ ;OWY$tG#2r^g)f8d=Ecڰ)sXRSU~B}(١l|X53[^xdmX*usNLbT3ҝ&!絬;/^yj>3}3,m <:p:_Q+۬8׵e1&lԣi Z@찓3zU<fҐ)ai^OqΞT[!,_rM}a 3s~T|!B2deCfS9SSxQ9MR/E0/rG4ݤ95/U6НAny҃ʼn i]tKN睗':uBDH4j>dRo2zpNGGtqҡ+51SKSwxj+xjlnjs <@T"I3KpF3?'*g!|#8^|6y&zq5Ee[ph`3r1Ö.Z]]mh=M$+眝jàHI 9 n.am3b^(tC9S;~ֶSЀqEg (�pyxS($G mn5gXM{#G ҅Ѽɒg[( b΀&^Gh!:5ϙg|D[ڕI ) V&\qalq7q {9Z`i:ЅM_^|H**>Utho_'Z^uc�JY˨ ).nu->UZѣP$9Gi?Hx5,%tUQf=ִvlSЛ2(@SߘճsCt .8d;A ӈ{TC%}pR.d-G ciGJ>սɦ1`E|+5[Z+zG3Z19+p\>tI+"2MG>7,ALt{qYbX=*3  l%=eHk Փ0 H.pmJTњ6,sA,q=bqĵ4 \a6Ʃ5rFgNAe$-LB #7xJ9DAFKH H4LU)K;шjOQ+X l c+)pWjxaJ;vp^S Zlt?vu.{R+rkB?YT%:v(p0D3cN9KiQ9M.n))/&5=1ϦyܟF|׊*Kպ!ܛ<o}4ԨҎ3jtdE2o5+}Fxrv&7LV҅鑞8.c~24is-| =7s%BrAimчq< +q̉U5+1ӑ ݝKZ},v14~Ncq3kFM/օ@j]e%b ;°۰F`Y >e8LH9"/bܾ!=&Cx/8։_;L*$Hz1>lN핝&Re ͋Geeg-zf]lxTm~Ъ/0%Tr+\ci ˽i_28C�q JE;F0sedrSP!>'*F1|D O}ski aTԱXc?LyO[^əD_`EȪNEi&1N# !:Zc&6ԃQdoG.zv�g$]Cy)󸜧1Y].VnKb*-1ƝL=Ӽuu.lx SJ q{zr;mN!p<|fTJIPR3?wk6oVSj$itld3RAA3j; {ґq^BfY|vRLfaeZijt+C Ljs*_JzWk_IO]lxk\euFT;z;6U{~t=ew|i6 ʳT=rp3&;@z{ѭ)s 1x;xk!)](dQIľ5{ m3f)>#Êng~g3e;=B}5ԹnP(q+KXXǤD42&{�WS4skT#M70+b"Љw C5҅ì[MP &YLകEѾ8Z2.>hdtPT)b֜*yC*OKne]}ZV6}tbO gYl+߫Uߥ;9 A)-O 'vY@.ǃ%6FUMB>~6SF}05̻憐gZ;Ss4GXS<[�{yѼ$>`3%l<R7b)":ƼŌ!BncMA_ZUaC9sUČ<- n!Shl,x(PKQq-ǂcՎoRa27Ekix;GOs;x4-09=X E>f,m)òS pPt?`n R^)385(;71x8f=$> eTkQ߹,K8kK\V4SD3\WӌBJ(oW*C{%d^˼]4hH=+4iR}S}S%iI ۾6}T8'qiV+|7kOx9kk,.R+}P|[sm:w =la+6T>ߪR7g?J)R?]mDYSt}+bw^g1>%i S39<I;ֱ)5\GYH%AëFtc`�[sSF( 5УQ|\s#a"G)xͧY7)+HjEYGfPZ Xk<&ϷG7G6_%J8%/r UEu&1493Dʖ҈.ARRԪlCڇat {dхxڰ +8=̦g|;dyl_4@8-boSͽFGgK2,Jbr3ƉȿJߏ(ҽR|PѺKR2Dra&ڳ-S7oS\Υ7S6/15Rj[ӆ!9i;) -ӑ^t ?` [TMbM--_Խ/󵒇0b%ߏB}:3PsG/�� �IDAT1ەQ}{qY):{y<K!Y?s2 xۣl ͻتrml%N~Zva"' \:mՅih}79}eo,>i'<q˞˛NpY =P,զ%TaXNfsa+A3F77&մڞDER9Vyܼ%b+{mpcTTc[Z{؟6&v%%5,?!95,=u$yjIoXK۝TYɾI^}Xy#W7OO(=u K{;XXkߟYvRO}2P^vXx>\DK GsM̓:FeY^V36Sŭ3_=79ܒj&ђ f-U׾C g,qfDh1k' M5B\*G"E;8#x�v!ŨUvf:ª;әr(Bvxaa ]\[nTt-H MB!Y`P nqz d687!CVީKnLY͂ث2JіzuJ챊ʔ2A1-Y�Nr,Y�S C[ީD,tʛfh.~^JHjF-KFΒ}a׌(3!FkQ,.lQ/¶9sȽV3TD`& y3Y "1>Mj3ǹt 5ҹe<҅><|in i&=uRf,VS8F/Ur5[L$GhvZs9Xa0M)3>y~OaYֲхod8͔telBEZkfͱ/mV~龴dv•lnB,*0^>nbp$jT^Dzvy nJMll1Ow &yRjhUq hyRhnG wӪڨ̩7.mZADY⼤6˱+Cv;kWuޣ,tuE^eNԊcv_vCҫE2@z<Q6d'˼pqh^C3~ V4鴊k|23Ld {VhwM-&HObq6wr"k"I| Lx>$zwa.+ߑeN>ǢQʥC[*wL:)t&!B21Ma=91G99%qM`~:Y1фsh:Pڱ"OD6Vp^f5CD)#14N{YK_7 _Mv&J* nԔRΜPk㬈z&z<7uzӍÛN`Z |!|) 5 d�' i þHnJіMŗ9 ̢W!3RiAluQ&0vGt?7pQŐ DW^c >$� )%zɾ4j΄t*z7ٗx[Xƣ&P_2"+sn\{c/#}w1w'5<'H|#"-s=/ 8oeZQ޼E DP0= @Tj<:Gx \yޖqT\jNf .a2f ug/j:&-5aէ7n [kxұbY}*O8HQ{yv':ڜvr` p1#x,aG�f>gG =*7oe5&G{Skl6=DsNtbLn֓2S;z,=g@McJ&u\P~^7Ny'ysL(՘P%jmZp#ˬW'WS"WUXo\'*.aEEތ2d-}O= E9PK1)!=fELYsa ^b]=]ȅwP]Mh\ b{~CȧnF<Aeg:N}f{:0Y5-V[�0$60=ߍ4y?՜3GLbUU`h.dfGEv0Y@DUr?]brތqg<3ӑ#|{,c3Rhn 6Tgќ}죚oJY w8mq⸄@op%{GRcɝAaZG&p0 kjRNs9I>t%|Nuen73,s8V3E%,-i60"vg9UA, nOl('U,];1edCھ52)]ES3c23O0<G003b Ͽ0r{Xא<4ъƼqmº&95eL;xQ;g┥Ņίz=yZ;iZ&UAeNz~Ukk)8vuw˒$K7m ƍ:R A$f&I&I#mIj L1`;W9gGys1N~~hQ㬜GbggL8=3F'(򡜪GedQE$kaOY&:/+-xY chM >Fp^`Vg5{~,NXP͡L(ZU#?KT9Y>1]ց9>rGNě+r~uYY<XPQpyQPtm3?|kLd`UL>͇!?iH6t^El_0L kp>nf;D>XE3vF&0&zX9*'nH<ÞpѩL`ا*N.e-AjZi\ 9\!}4LFլν5ڠ /\V>Cǹ좕ma^Յڮ\B %/.gU0]aW0* FE a-le3)Ub(yl(g\1->ke>۸_s ܩ!yvmǍ, Se g-h(,S,fyJz1;Oqn3x+ S#rIЯ[ߤa㣞tc33"MYpؙ̒یayeL9X]ķv'>V0e&G"-ra`A#$^Yž7nN@q>vNF>S䫱-,a,-G")agm\g4<um)Ua�gCWh0c} WϜVG^8&�˙EG"FgA#mPe3.kTKLgGb&Fp19{2w<Ybu95EOe'. _A>WAu`*'[HpY֨1~->ϕ-Z8$=%E~Ɵb|D>Qlhl4g_Ybz#r+CEޢ}d||ZnNmVP'48]y#| ' 3Qa1!}& X-="M7*Bjz;H:@EMq ~Enb.Op1A{"4Ed#}}7o QR#!zNcabͬ4�7 36%ƥ8R ) Ԃvfi+kA#▖87oEBio>DP*2S1%\>hdjBKۑf8ׄLYčc 0A!S_f 7e| _C:˳A$(IL:6}*Kx^Ma1!P^|"e|0c4 0>M]C3EsCYțF.`)zf7hE Qvxt<˘Û\pjϥ4a &2/[17+x"1&\tbZ) 䟹ۘQjhTRG=dBp곪 GK~-CŸX@ XCmeY^E>1-<93%v}&Mj_oQ UE.fM[[o&~ι#J-qU¬?P:tO|LS%48^nj<K %ޱVfy k,28բ^nmvvbF_Ϩou'|-jF5^Ϊ)V\poz7$-̼HIebU|;G=gg8uDò&ҳ;'iPGe23ɣ.v\ I>MAO{a֔c5a}-Vfezs6WRF=aq8A +l Kªn'ijW6>ʹ*18 G04<Ȋtwϧ~ Nv2ue&[Ȱ,=|:6|7pMhg&Oӟ ׏%@nAT|\+R�r11bnW[Z% p3ePީ�@* |akpM shF3>l-nN Nb=}BEěK)gAaKyN}/P!*۝CNkHتRϱ^)T渆ckؠW# +Y AxR`$N>~P{: \Da&v=aš"ҝ,g9WRF5h`+pSIM&aCs*p_qgBx.e7C)kv!7?2(;XΠ2p&=� 6q"?0,Bg_H:%"P>̓ғ|@HO Lex<r,d#3dsM.<j|+aJǨz};m6j-ݛVwW' ffT'NZnmӭ`tHuˠnzxHW&2ה &CmZ,2RXHynt׺idze3%3hSQ2u]t)QD W8ؑ2 e LG}f~ew8CbCjNDަ2{{pevxϺЗ zȨ6wdeK%q+N2;R=0 ><Қ[B[~=q J@+;c3y 1}wO@~?\6egX~֩Dz0{O&)fDMwP 7uQ.ΰ%c-6IqasŻDaglb91>#[I*t"R()I0X |e}viNI)z;HJCnӂ z)/,w1}};h?##9EG`Ԇ=usYĥ٦sXBK(/pSXv3'15AƬ�iNy5Ih<օñ*08\`k.}c0*/kgoSա,SKS賘ni,dAѕ\ĻL _Z6/s2&%+߱^cOG_e T0">IBRO%-;fc)OeqZ M32ȝq^@e4۸9g>s~mzrfTљ{_I+~ٞm9H""ҰY%cQ݂ N+A8R(ү،a9 Mk]XȔXi7y.odd`N±4Q]iHf#c}FڳNFf2~9 ve\7%X-fe4E][#{[hH_z%4C8HHįǩ蕕kND; ,-c=9B%s(`x~ԯwIB 4L- Ja3M@JƯulf4'C g}9‰uV0&rd:u*<騔pYndh mS8ía#,zt(. g!M&ʚ@P* Pq+hw2 d4`[q;‹f:`]rabrffWo|NGGuzH_4�=ʮA5̣_e| iɡ\Pf0-)tZ [ υ7Bl~ܴF? :O>L!1T6BE |*^#hbf!?KxQ�Yẹ\D~O`/\ޔ6N|f [_!ǧ4;kҠ3m42]lNvT!tV7m&bO0f2;|~9+AkbMb}ƄmYc ǸWY^&SwKEnf%[ghZ~Ǩc})7.qO- eO=x m+77DoTBȂ\oTSSdtְ=yUOLDfZ%8Sdn;j68ef9^nr&dvN"ʪiX YW;SǓcM%zibX-';10Pﷹ*lWUb0Q~Ů[Y^Hj|&Vs[73"Nƪb8Y*ңE#<Skd?O%6+b"CxW\D37q\vn˫=߮wjуe:i.hb3x|GXNj6b*)f{(II18@|?|Z#f3:v}\sm b-8&p+Xz#'ء)ӹ.pW3,Z‡9q ut+q*tҙ_Oc(,))tcb0~B*zY/2rϲ#& ٺi*S.Q tCdx(]C)bRߢ{}k*QE9s[Q~leC){(ctj_ o㓡ȼ5gc9pNBFyf.l/Y <Y "ȫԱ, %n3UAMK/;K)s!;Lf#|U<Hop& :z"ēJ@nj^ ș"~M-OJ_cq"jO>8bq3�;c8l 졔Rb^b |N?~7PY+I򩋓^\Y䆸yt_QkqJj\^ñ,mmhKT7uP$.olS_r(/;>`e8*=bmw#j6#VҼ5Y-ۮO$*swb|A&Κ[lPl U'랸7ʌh(.W,Q˖@ ]ͩtEij"KTJܒ8M[s)H"/I s+MY5u2&6ro>/QQ฾WyL2}m\?wM,[<82iUtt«<Aff0l jV`(TBEUt �� �IDAT=8{p'v# =7 %y}p8~Dr*;z07ܝ PFB@�]u]dsb9w40}=v]b'y> G Kg^b_g$۸? wiie631K;ÁMOpLS8.ὀbJB2qs<Їu~j wNbq8DUƁ50kZk_11Ild8e|<icmEȱ> v'=BPZ^8ݭJ}u#дu0&[I `Phߧ9JN&CKysʫ,&s+xsN#0D yl)>KK"_!b,W7ETdMY{:K!Mrgcqcm]fp׺vϲ,!wR\"oPA6p+uV]~feKǹ{ُ'M$1cւ73pbY`i mrwӅ.V重.n! UeEmfMеHuaT8of6xƣV]fx12un]gtl%Ht͡]W -2\ߜGl,3ֵ;^ƵD;*Z6ؖ1#;ez[:1wM{Nl&1obu"=s'c\ܑMna_˟o}CSoo1˜t'֦+i,Da;YQHXː.ZY6!^#O]硻od{f'`91:b2=<f�ӓ+|߱Gs(ȿ*_8Fse 8M_*yQ\J.d|kBNӘK` gsCY�̢_Tu@3@HS<* .vۖ1<14wwS8-T҇Nsqq6NfXOkyN0#hi0;UF14T'ΘkE7*Kj-+9hֆRf }22*,ԜGеsbY~| /qMބ6=HB/Λ84 =|*9?jN2Z3K-71*t@wn`zû3f~I7YƮ]UP%,t:#焣8*x*cx/e* zzGid(FGC"5̤XI >ܧq'8FTU-bVFKS83 G׊)`{"Oj.bOg:8{2N'j/tE]ؕt44~H2_-1- ~]K\>g\hL7zVdio+kve-Y8G{]qjˍnֳcc/PX^6VKԖ{A&{7olGU}@ș2%Z"%Tլ!wuZ)cBֵ'^wNlϵ:իe\OjJ`]vڳ2v$t(H^E..Sob-YėYA5DrCs5ӕzfl{%.{q՝0%g:U4 71*x10 C_eS<E/ᤛqp0DyI9l75Yjd}7Xlo |0xR@bHX@+PsW}vr )a/-e8w՛uۓ 쒿`*<Hɇ"_*w5YRx/e3$짒ݜf{Q`xGByA YAQĴ I8TO2; ?=/wRfBd@Hƀ Sd*;h`IP `Icҥ/Nic w)c!nm'^2)\mof`0 Fr @!&јx%M:BQy'2΋D,a2/0hr 60C;äv=9J Bnb͌ (Ĺ, |")#,x۸ᶥTXA=%Ua_} _Xd`n=郵6ġUϋ/kag5?W:*Vo}ב} Gi'Ы}<:.iK?J7ʣvf⑂!ڌMDv:-,bf'sյm(Pƕ^]hp삂=h0zg$97z&L*S9vv999\X6Ā<CRtVȟ =QE "?kA)OGTdw؛ֈy塾ъ{Y692O;f09) .c;y*Xw7)Ć6fC$k~Gl874%'tZ氍}0w$�wWE. =~i;WF>XPQVUn0ۘ{d!>= fi;"hpM3w<2ʙī40qb[zz<мG Ni~(jIKKZީ@i> K¹Qwyf&2YޘHO,c~<0}2*s'3=�<N,>x|7ZP<V0d_ 7:iqrAR;FfKOvx>dSJyyD*e Ó\А&^pL^a+tg "q?U+yNGz+cWƠD#pYFQ u]^7XDNc{C!|Abw\Ȯt_0:&F]BlD|R[| 9MBT�wb?g_ ]ʳ<fxwxK~wsKaSv ;٘7Rhmm{&Tۉܝ])7r&u/y=Q(#:gQY *cj|3mjK;5U*v昡\oc#JņVYgwHUWSyR3ӑ96gMmٱ65ye/j>nKlW*Q3*柳i䆼 H41+27'/[o-*Jk2D⭑kvK*26oyґCu#rMnY $r3*?b =Y­Sg{ay<k cSG5 ۹3p~ڋ{ߘpGPPNs#f-}|2e)X'e3G MI� aYLn`Sy&J﷐\ʒk4>JYO= o 6 GBoyycv<G|r?]Ҳ<h{aNiB6(|,M *wSᱣnt Wᒔ$N(`-1QF#�~B5%4|7PE+-΋l|u9G wԐgf=f:z1|%ya8ӅQ4P8(fwث;Ol)~M)EATp=Ů,Xt(XÞSQeb[Gn7q Ć&&b(]``x;y= pƩbi]I|fr'bV,1וޣ{xת4NAPmϝ&}Q-]\x60MW朌 i7]}觼qljlyd}үz4QQ䞬%"K(6on;(8u?18Wo'ʦ3)Mln_-Xf}Fkk'<Wzzْ7gPĂ5^Y]leO;vg;QH'Tf O1#kbl)gg]ɉ" TĽyUݮK<~'{ɹ}\⒓Z,3kY>ctlOAp2ؓ8P,ۗحn!2fvw]nd9VKBGs@|Lla!{CAX:"GB=T\OP疆5?F#Oɻ:NDZgDy@-_jF-Bfs|n#ǿr}H(KA+8kC=t3 P㫡66#CU[-eL fcʫLe6?$5\NG+MxdHa+dQtc+\%U*׮G3lcF讎;A`ۿ a"zP˼r1]8|I&JDyhcDX!a !.>HgfgR`K9Lc<,Ʋ|tRE?r BPR)NF|wyWRibw5_c?9J9tWO4~Df2O$$YOftM2RGkj163yi>DDI|}u*fK `;Yg"tjv/g4^{Ƈ"2.LcXp87&քt sLe>Vn=/]EG: .pQW218#}m+J:ؓdO=oՔ8J J8~qqbQƐĬ8e3&d3oIne(N|5LƉĦ&J~5.<XnXJղŸ6GF%*:.zۤy+fDZKe{TlRθ2#9e{Id75yΚR윅T{-rM6wjiS{ l@Abb3%&*NSFC^(t)8ؔ+coFFغl˕؝ݙ㔳nh-pهS>.`/塗vg Y_C};\MsJ W8މ0!^(SV7l*OC_)쥏"L:9.9QVw"#BdQXI7 9H@f;ՙ G: kj ~DVrQ_M3=wӭ@aHX1&8͔3AD<et#fLp$ 3c\:O08;;: c:qG"0Rq V?ĉ*;O'ҝi=?r)e0S4?tq:_kiBKc s)qy2 6tIn a#�zH&?C`ڜi)zQ *2.g0᪍$0uf30>O%jc.c*g, , _pQ;H3{x1D7Hi16kz:Tb#-(#'3GrvS̎HYPGw!&/^kSnۻ\TZhisX+2J +2n4UIUMSFD/vs$o]7Ӭ6=kVhM̍ MJlkXPe)-X_z^ymz uiZ-UV Kp`IMƺDѷTة2C,m1RkƜ)Hsqޚ6E jnbsgC^6QF<]ܼ^EP)*`ִRZ} ,N>٦!ѕitMD|0cU]\F!vN3Q֧[^ȆLGQ"vR\0/]u{ pƵ:ƌi&f !S‡ n =B!%FBA L!3=,/TΌD'M+�. 2'p/ֆdZQ8!.B $2M?5`Hx[|J(BZfor(>p_S&[c"X Fr8@?JџՁb_n%nuvFKKca>bO,Da?R$s",bFuF`;Si;vf{�f78pR;B h줂9fO kO .YZoi0*Sx4PCx$#a@lsKsiz}+dr[i? e:MR^堐uhھNmՇ\qBboƭ㉗Ƿ<Ylf{{=Y }3x/ cnƦϰ ||,x 8$B90K[<IT-p# :/sꮃȺr]^O$ {-^1`IbA伌 Cvs~vg`6E|4K]dfJ3\ʙ6%Y<RANْIVT=T5ʄ6}s6dXjިO5ѿ_h0:')87V:ˁC?qKd$o3.8*k3' x6q~zwiwgriB{BݻxX=ת-vml?WMKL*-0rZg2%3Ii@(a ߾UTԭX�- ґj*!!!!$Lzdz[XsczIf뾯:٘>YZh]o^Bm1 ̚4>+Iiv^ȸ,+Fl(3<:Mj̘`>͏ 9vad<Z2dDFS s8P\sP|*:x]M`SY2=XhӜ�FW.O0()4RI \̚`j‘3<v^VуLyn@kee"C&B9BAO6"/9a:4_O2?dq"`8ykCF]z^v p[d .b slNzsa&@TIOٶ+7ktwN !&at^`} xcAs"4dx%)DFX8[{OzQ)A6ZxY?X:.T:&- pO:(cp3pրX΋a&Qv~Bhr4_a`z.'- cK4d)?61?mYlmܟ+:8 ^c\FU춸J %6YAqc/qP_b Y>@*e`X/c|/su{ U}ˏq&=#u_iߤ}Z kc:NKGFeMe겺kP֘6(%Lhd˒#ط3NDluh]]ʕQYbY- 7kxld]~QZѫ0mdպ凙=CvFC{$G6{ ?ԗ9#cWV[<]ɲ :{T'.|aO)W]fy6=&D&f}ԔRgqziZ2 7LMYsM6Y_V+:v]ư 3+ l6,:͙ qmkh]5{y0HF-uo/Sf: g#/$o,k_a>+lI{Y|:,bCC}4%jO=x)P~snN%O"ߑ`Y#Ci(8i{?䐄^(qzY,ǫĜA./<ΐ⶜WY S�Qؗ1Gz5O*9w 'Þ cI9: M`>y**gdg0 r^1\C!i h x<T.q?J8Z64zn!a]'9zwK t =4�� �IDAT[x,5\N.*-\O11g68L>v$tJM;'d_�2FNEՑeI7FcDO줚KXn`O)Ah6 WX%l`3  <\*}26_~a�#oPTv/v"c|#Ë䃜3Rp6eLzfA~(p"p6E>.η750/ƷEFIC;7:jٙtbuYͱ'y]nH遤 _Y< RܞoZݬ{xRWf{Va+XmK{9l_ڈBXnzy  JuXY 33f҃Jο41E҃uH:7,X)|®ٷ""SgIX\X4UQ`r_TХBksTbD_߁oI' 8̔vg,pZAGu]kzI_NIA}R-wtz}R)ц} YIqd^MIwiF9+tS nLʤ1Dyڤv<SXYy/\"sfY0:| Qb3<gMɪb b"N<B:L}! MPl6P_B;FVLԏcNXm9JBxL@Bvh |^azױ:~F]8V2,dn&!W&K(=|�"hv=2l!Gc:*434h9s$4T{Qya?) 3 B$`YHOXvsx0|1.$xY.d /˒ܠT"`A'שL"R J3XҌZ #LOC'{"rfQbӎPMsyC!/|2K"Ttrޜ3oݴQZحgK즖nO6lOS\Ff=g0}*>.B}p_vCE;negNO bs}IJir$#YO}cL뺍~?քb qy҇K!RW594yngf6y%)6K)xb0mK{A~[[kA%k[)um.J%vMQ!_o{R̺u9r^BSڻ])F4VLk?wu[_-;/62<YVt{aZ HeKuHh9M5јMoki1x!=u&'L㍄ 4u˸l}Dz]j/w:ܨ#29remN$R#e 18,Œs| uiu2 Fy#9i@.[b}$9FE|*=RN1ѻ:$l(a$xH #\C-0#_gnΊt$$=,7椻f.bOI Vȣԇ gy-ljs~?:9$)c0oe60/k :ʰ,\Ishc2 fs0TCqΣ3 Ƴ:GpaG-#!'<n倊ISbg{1 ^#Cy<mu7㪝}NLpP2d(oogNjr� "9I!R%dYf.6z5 3hz&=> ʟ㌢1l@K~04Mlq<,1Lc�=R~09ke$#+1d4Ua3u1p+9ٖqd`0s9JXʡ S mZjkvu:9DTr^qv0mhk.729rI˜_Z6y*.!ì%<A345짛;6۾D2cI8m6d#y! /g5•,  Οu]H^ٝtfdAdH+գ3 yzm鳿~N/Wj\i":v$ix>H<߿fZ4eecId&JG-ƿQy~ko]_vؤDFwl]MחK)YGNϬ&:иwBߟ?mԹ'N IK=xlђΑm*>O(px iO5t#yy!F$Di3krf*݆D^KLkP(OMi{b"QlFB~B:iJؔK-)2"XMm=vDFfuLܴ:ڝnX2<cv_?akMVZbuz5֒'#[xG.?ԗ8yYTSCOӳCG\>9`cC"mJ,#c#Xw-d(yb{p8GrאIǡ@<'~n29E!)"Æ2f%5,�T<GY�%,D0^g )̎ e b(/@0sCh.r~吘^氺H:UUgnv\~1\t.e#?倂Ot̵9+~I>E  W1 ޛ@QDqsfZΛqx)] 乳ݐ0[y%9cj9M좊FQ8x4A'Ё;O'%y3ii`ϭj\w_i25\x;z> xqJX;|$מGd M!|_ZnIbdx6Ʋ?d@e_1GqEEs0JƏfnf^_f3Z1-HuadrXkvBg0.j2(qNOUujֶQ o~8'H۝5B 8Gu>:{+hSj(-9ÑʪG{gs3/ˆ>1ӘNe~޳u隿ۻjA)|lJ  _'j?z>zpE_*:Ƹ";|3i aO}/fz྅]_V^֌I)GbEC owJ4%.,U֭:"%MYY_z嫍ft846mhƦq+z+b{4w*h5v$.8Yd03}FK kLKPXf35r;L; ֝~�G>NZJQvxk=tA2R.a-L)粓wc(A='xIsAޱ,Gf%<Qg%ʉ˒DΈ.&a+90(8Ŀ*t$GToa9@>եD9;r @C%�-}9p WUnv\_b3oUn Y@"0d0s e ?g NO{:)z>@63#&$oSʱA4^e+PSA\A3Lgr4H(C˹sM|8a<J~<Q#tl0048y5=;Xy9A2y ïpE7<d2o2 t'L5wr9Cv)ƙ԰QYos/cE.a#|:/sk xp7d ώiÕ ˮ=[ HEȪeNPw;s|/]}*ݾm,^N4ѓҬ G&eMjy{}#"لj5JuvgI9qy o11Z]>_]T3[OqxbBd"t`liϗ¶ּTۊK$^0ax;.^}]Q_q=KUt6̱Dى{nppſ*xiNǤڶic\pz݈M'uG_Nؖʵ^{*ŽXѥy\nZiYI~Qi~ʪL8-i-Fd,a`NyEnkӦV"=)0&"3"y췮Rw^_Z⬹k<3õ-=fz>~SnWɅd?vYl?#|N|+7o7Gƞb~Omj"J gsyzb3o3.O#& pom~Lt]o>�/2-d%�h \҇X_9'CS: Nu^d[(Mgx, ?L+Cyc|$xXs5hHX�us&Hlt.8@L6sI)ʩggsel[BőAsE ]& 0ld 3u #>rXz�l9FSƱX0*{6 !F `q'22ԄQrSHX^xKF5BH-a6!ǺnHy(dX<\ؕgp3e| eɱ'ù; x餘/`ϸ>ܵeb;e<żJQG7o1/y T&RH6m“Ld?* aSPcB)^Vőwzе_xATyᨦ]F5奬IY輬E<GWw1 n+oRM2<QdtڱXyl`짬tשXlP6?K9_˽J:ʓW[qۓ%˟b[֔z\sZԬ4YGQOUw3{ Nѷd[>*tA[ su"cck-=_{:??{TG\Syc;6O|AۿS꼏##ZZAu,]\֪_^ќV6GR{6XwҭŖFi8.όZ-e}fUjJ*];o37Z-A9|J4);$vG }`�Fc7N:=mhĕtyU ̚l"=PLJM<Ao4 S璲g2CJiăr1 K O"࠷=TNV?e>o/c jTCeUGXN04aSʐz?;$;V. >ڍ\vP�uo02 sZ,)g9}60g Sđ̠!P.1hբ1!|tR}2쓜t)OT]BY܏!C> !�q6VIO]zIibQɟ~<,r9>FGhf>ﰎ9\9t2'̳a6Kxz. daP| doͩ1g=D^'H-"vd0<%�.%XB=sXȽlj-0'[BCͰ;2{Glufpy av*9<N0 oQ 0 w} RS ΁Id+%P(9yk�p>S [e,(266fm3u9wqǿ\yla1 X\5esl 00r G[ҊB aP9rEҔR)/fՕ;rE¨byEeJk%\Ȼ[;l0׶hW0[ɺyGz&)kgow|;tv'kC Չ̝?w(#pDꙝg}lfos(Z7'iQaqlW[;U%K0˞iՒ)C+T<״ӓ[l`ِpQm % J͞EkI-z3=xԤ]%=PIFE1N2C Kh+7hB2e̋NؗURnIz|B]|UȜqI#mU6ENp3k8NT%9O v4+E$ m"?[(fRe*YJ` e奰+:'ا24H;Hja0cC;4qrNn9fh�2AŐ*>^VA%S )08@*9i <!~Ȗk9!l?Q|8Rs[Ue+;;Vww"x~/RvQ!6xq/di͏ ADM`6eJK)K%< 3CoSp]$䶝W:p•\ƹg7{cl,y ~Ne9@Cț9D=|9l Vp~u?5,I}=T25|RP^d$EbrGLʾ܅ _#&XE f[,kX&΃Gºt(-Yߢ-ZX4| y`X|48s6;=ʚ{vG?Wf󩜮%w}fy}}c'͏L(g&x>_mJGˆ:c:mΘ@2a`XUkkJGkJ]ʄ LH._o>n1&|}u%33;&XyeMN(ܱwVXԠ7}ýU,*+t))>{֍(۰P}P ʾ1ꧺW`lv?atb?6GVL):<Eeݢ(-:ZBT1%3twۿ<1`㴌 fT<5W;gva{āp^¡m1RI7H:\ꠖGc̡)DsBM&Sؚ!20tϧ#g=kY %r(vq*㸛4"*)dYbs1|-9gX̐@^7jYH!�`fΝD_ F@x0ڐU]\>2I4Es€xY916,wF^Wk.5Mdk=+%燝|6pMUU5+;&uw~Ar<dԞȭr軁409PJ>[X^#׸v;lZ14Iq {/,_|, "׉*^fr;mSv ۿAa4P+lldS nY =C4u6pJz|Er2sMO[}2 37AFڃu '!N$y4v{)I#gO&~f.b2p%Ffd Y!˪Hxy\4m4i~™tIDZe\s|jf$pȼPbbsk%_6ި~V?Zufוie ,:ez51@BKgKVU$cjU閨23rz~<X5"$mLRP#&Tv_ۮ[ձqnP[Q}] *knU2wѐR#9,spcg_~mߢ{սv=vOøVS<hk{/mxoRxu uȸ w&nx7f0ZE#ٹ+F&~372ÏGj֒v6ϘiY)NyS/ۿl>{k]ޖ+R V<~MC *UwRS-+Ԥzeʚѫ#P&ff 1*ZYάLȡƴXe =aM"V>0b{oJ-`r`O77&?B*e 7ql-p93oM~\kj }_|:?U@ m8ʞP39\n` gP|]4P\2OHިi�� �IDATɜOkB]NFuk烡QY@ov$['e6 _%qRe{ҽo cy2 Qwsv#m U|qu/.%q&Z(((Xr�տ{ ׄFvr$h1o`C{'L4⦲ üɆAwr-{gheqfP';Cܑoao# x?K ?G GұKy+@bXK|ne餔VvWIvpԅT l3Le!g;g|δ3d޿{"TІ<@zx'#cxZd0gJey0RYcY)O SQղNhS~%Υx8%5 P?نԝnXջƯŞw}ބ̋ vMI[bb'V׸L@}w2 w'\] \2y)Yagn^d#$ NPh=_YRtVd 锟|D|]v]Bm^OwEG.]ß/\a(1~EZxmQsE -eO_=s)<}7?ww]_KɦdA23Dy[ǧߺu]7Ԭ;C٥)EƴKOG65j6.2aRPRf}-ڟxnJ+0"hҘXK#5Y0ر|#x X7S3#?*򾌿yL'FҴHsw0 '3<[m ?YE+^;.:nlfwMs?p+XcsP;E'YʧC|>>rj=/2 } <z V#33TG<$G ˃g^@|Or!M 2Ԇ]4 =WYdp`3!8gngDnd!I#I& H,|F)9i3$Dn*}V gi?XDos*e TȼF-ڬȨH79īdhTjHF~m!vJt @$F905I5'6*)؛D&|=p\]|c?S<#  d�_G4&],f<k^̬#] i|4 Bw+s÷)BNxX>:ܜŲ#]Cq`_TQì.|A!V]U;c`qn*M36vJ;iR)4Ǝ1OY)]̈MMxDE^ҜXڲBQe"(%,hHRUJem8TR UL">wUK}C+vVt*O;zTT_h"u0qշ'rcfZqp>j)X:䞙}% yKovd_yoh0s|N9/y+sR&答ځ& *R1L׉ ~/pÇ魖nG2|Cr_G<>5*Oi쭲DQiEmVX*ߨ~_ K]y>k;=f-bDlGץ3k\dJdC8=)9@@}++>氒-|"XXׂ/젧Z7fJObΡ.><I-SEẟO2 tJ\nzD 8 W2l nv 4PhgL ӈY{p+Bra1$(&rISM3fm e͢gxz6?DOt,u9�OR>tK7h'Qd8?q= 8Cy 1^̰qAmt=IRANӉt0^%6T`пR4f<^ّqs�[;œ Zw>Yox-d+{G9 Mgmz!\L#b G)7-rЩ*v04$2>KA4Q@88xx=~Au%WZ4*Sx83Okّ48jPH! l^L;zzQ7Għeu"e i֛_d5gF\L䬄؁}IgdKWhrX:>ijFffkTXSD=RIcNHw:QFf]+s~wz_R{.X׾tuv9Um՝J;aجHcF]"5G7V*.vS+U\a^'<*j̮)S;ʓ͓4;ҭidz%}_sS~3jYfÉcPu|}gQ+Ncz5{ajݗ]r/n;C ٤[Gd Gy-CһR7%-HSOfZ F Uɘ<)ľ> "ó 8H_TusaTdgl¥o%vGOy&IFp+{lQXZGGgVM䔽A%?g.�Ҥq?!"{=g`2cbX5D11>7sҠĿ |B9bz0E1>0ʴ?hrۜτTsAtȵL zZ@N}Gy8/;9HS}꽱b6bpaٔK5E\RPUםW?~|(ѕC'k mR5 /DoK{06l;@^AgkxD^8_`}w.$,^ewz-kiT댎eO=:#(A H!vvvok+u^]}*nT{; 1=bp O6IbV)z#~Kkbbc0Ia~q΢TpA {fna!{8|>c^D%gP,#$\o&83%([co/i$\,?2&%\H<Nbq̌Z_SlE?_6ofb_}}ge)reUދ9Q pa´tƜe4Ҝ1>ʲeFOl}Yqe镫6[{o|΍L\_p] hW9Kz޺(ӜOW۵2aCvGGnbv)CjmIDz?i~ey%T521>X H2񭩇I2qp;Y;޺~>-ndʄIH2oamsj\Zfϴ~_Il\iJFŻOY1NUne""Flȩd(ܜz"gZs_u11"Uk=Sm~¼ L%沆,9m_.|/^6J˘}LD\D13xTv}ڂ"`L8(2_x3yNΠ^^sq<B^?!g 44mHJ̞z/ D߉_&vèwRL/\z e zcy:$D{7qJ9iev8arʗC =7|9q|dR-p.\d= > wSwr L < b1 X !ޠz&p;y?xxPQn: !.PƧ an8>ZՑcq tPFp?gYRK6VrkI3=<D󃍮<@i^wYIs? v-9EPYK/vsnt\Iq'F>C<A=4h<ʒ"v+`侐C>B0Xl&#/*uDu=W3ؔ,*zO9bX`Kkz?_7kae9<lh͸F6ȈB’dz&2cbUd͋ٚɎ}Әu(2)i&W\kaJm$Up/פz!{ןҷ;<wv3]ۛ4/L#ulYܭg*3;~cW㏥_~_??>.76R)K;)mR3厘3vćL/UhsY)Sbɽ?Y/ޕcC#-gk.ݱqڪ?43c%vc_tj)X23Blᖧ#~evO7Y$-]fQNK΄HeL.5{U9=-U0S)Uh1-kJi#2(vqdfΓ%T68P/ajH[,hd{k@ unQ.Xoxx80k; 9^:ޤ>(8`7ϳ`%A 6g(p`;W,z %GYA[frqE?IJI( $ \jzIVq 81F|hJȇ8|x̎XdВl x:T Ⱦ3s;/(p5.,j<xOTRQŰ;'f`x*xaRj+NRn+mY�GQGCF29=)kh?7r407y0: Ri2 ;dy8)?` .lal`2ͳ4#K p)Ei\@I<T8ٚ4rWr")~gRV99[$$ |Z ͂ty3E(WO >}O-cw:@'T .o?Xׯg7mD<M4y=`(Wha.?,sscϹUʇ9x<gZ{22#okDh·U1ؘՃc1#ßeeknӼsu/tNtWf Գ6+9Mc%?-t%#~鞿|*Ԫ!Y1/%TN^i̬z29 M4fYƽ}kЈv3BcؐiCEݻn.o|w7p3G:=r$O(#&50w;]Joޱ}G|ےiu3j2MbG;(򗸉ίԸ=d|d0Ö Ռ+WՑuI8 ]p^+2%}j.Hh&՘ݼ5dnڏcU5E#Fnݠ%7ktkLk4cPf6 >sy¢ȆKj <% 0SYGkp)uǷ8Eg9U 19l%7f1Y>ޣ: >7Yŕa*.g3T g avp!kp8e",h$o$J|WHxqcCC)WQ*21#fQŇ7ȜTp r%󿸈AXIY#QG*d6N�!ΰ!yYJFNARdre+,vTx$9p2G4} 2"ZI0- &X*."#\͟E'@Ŀ;dD{xVx$Ke`v29æaݬeNf Sx~&2d#xxqq<=5eQ+tg1<`|o(2OkWXrWyϲ]u*rM>3[~_?jϏtÁ[R&|np=fnjQSYoNtd&IThxʋUf[w gސ&y c /-_3MtĂM37]%Íͫ1DLNC6N:\gߩ;߈.t?8XQY. CÔ+F%'K>Mu-j MکGK*;`fwt2NkA] /- lXoszmuO=<bT}GTō2nMiҭno&Ty)),wk^߾avO|{ҍFڟ2%ѫF&,)alܱ%:-[̈xLr /u^wb= u.h7)>߰rߊ|J'n~dt)KGV3FEe^y_ őzNa 팡2tw R0wDڙx)p�nUX E, H:؍Obi 1W<Axpg`dPT\F?dO$@fYqΤ]A== 69v1'vS,zsBTNmh8wJ*C_B_JN^, *gI1gr2`M$@|ARLXً̞e!XƆ g b|A벐6>UW›xzNbNЉe5|qV.4Eia N&Ζd*=at{宠D]'hx'pX«\Nꨠ7].cDq,r4$=22^g]沖΢374t1D& $p 2kY`}@%o4mi힛P M7ҽR\~f%}=z;7XR'ۻ_ w "օQOǵԛ1ee)Tsv!kp J)8[h%j^Nsq:|S\Ty%O~h0,UfOYzH"O+1n&?Nh瘘>=^c^li3RUl)wYJ -W2IԜVV)>dr}IZ*R2׶. iS 궔l(/,Q2crg7_%?^OQ5q9fRj ܶ"bz6W40q_W ?R()\tl\!vf#es~4Jc|A-+x`^J%rjb1cv'\-)N:1}jВxܲqc#yW{okߒ_=<2Ȼ43i⮎ytbn7BpOl8|wd<Sd s]!g, 1C dPAw9aZS,nYeYY2q;|?ecf_~RGe<}ldeNa= M[aI&H{]_ %g0\;!ޯu WpYgwU:c..I泙+N i(ȱ1\(ڂpIX:A:8˖U$»l,մ!,r&%K` 3ŬX\\gTqq|#籑xEbO;`A/C(ζt>?4(h"V`;?=՜zf9TP>ɼA|i|8y3TXʽ\O'x>jXi>2 KQOrySNEVx]uR &q[ Z Vn_Z/γu$ XĂmܘW/s{ wu8X6' wxD%Ŏ�� �IDAT>٠7ב WΥƆ,O?o\Q)w{1,f3֟Ԟ+ )gLۗ61*[oyk)ۣ.#0e9UȥM+㨑-LNƼVҹ$ziJpZ*ejUwMQ%nt{9o-mV\iy2{mG*mg`kKm<shյ5zMg_}m﯆PȚ!s&dĦ_Lihџ5wO&|ӕkڤ Էy騐I+ #srm7pL#i#鸉I1*f\#cRϸ d̊>I^4ȂYXyN)=&m{{ht{ Ӛ"y7|u)"3=|y3@y^؝s`z� ޡ,nbFT 0l9s#, 9ϒ 4<2gr$SOIb oKcO!RzYƐa?KCԇx',fOMʲx54l+N꥟;sf]&F97:odd(!C oRVZˍ<̻/8+;baUվCtjk|nKޠGaA`#t=g=>l3YP-I7Gf&XϽ.v23mxúO�\2a/d5JdCU-%n+( a0#>"2 ly))'ŵפg6^EuϲlfSq3")p#?3n>ʮxFÑ&iše%H.>ieѷdu"<{ЁcnOsJdndEN|cւJ &n^>w`̄Iy+rŐ]%5>ط077``d }6̠&5Ly;Ij ~fd>fsC%.&{hC#X ?Ρîn钟-0Qfa1em!}5̱uYW9IwV?~Lt@rY:J!=ZwiP=P11m 7>_g,LO)5СTa2aRom)j?V&nJ}ǜ)tm9^cuTOђlUm>; FX~F2doV9%13Y<y\<>'L1Gv0+WG5Ɣ#@ as|R_ nf n$/yx8//_9۸&0ͩ|",qfޣbj=|g6Ѡ{0{9PvN!Z_ cg ۦ:0qnd"͘y?$?2]h_Z("OPGkhxo;*kAV>a38J-ϒc'AQO;C|GAQZx9 2;o dG̺ Q^9ؘ)&)%ll!(0$C\3\>_I^|Rmq3/Ad$W'ϋL&\.dk8C>DY6'(d \@kХ*V̏XbR�E|:&$crI 0i|YLE1H HDz:>ƇD¤ ըH91aRI$&닻w~!}/pk ~ι)+ ]Qz,3x+Oz݃1>ޢ1 "G"s#檤y$Д2tz<WgLDt.(VJ){#6GZ+X2RחѰsf5I4ꑬSfaĐAb'Ke9٥Rh:鼚Ҫ6GF5(-jd"5#Vu==7;]9<ޥ׃cNiKΰƃ: Mۧ7f0Gz4JTM]s-Q٩񨚴5emӮ^G#F<'>Yr} m|ʫ/Ա}}0= TT+=7<u%gNX\E#=0SZTRuA!~TJʭKPR`{LCQ >[&歉H;gƶF<9%ƅBv> {cSD*Hpq7GҼCkx f*9p*GiK|*r!4nqڹ! Z�7f1qs0 !GMh4{h}Š 6h"]A,@s)9hJj;w2Vt/eKA0vΣ2 ,:zyS!yhW [~ƨ!8*F`u]\±E2iLD yfRUF! heulc (<LQx8Lb2!nx!*&d1TaV0&0Ċі@-eD ;0ts2*˪#|S}1C{8"k9.IKbF\Q- Ws!`igc"k1NLes?q2 9y<`\- b qǑ)ׯv4hS~zpx% ;5!)邼C dz݆5D- )d%-x=JMJMgH{_eUM1'n=k Ů|3ҠՃ/~ ܘگ>[SV ҄.3ir:RfbajR; ɕ`NV44Fkda7K=(3F*Kݣ=kNofSkl_|s].zU9M*Mz_<OD!gsJl 7_l@ic 5.j24u.Ӿ?(wvO t+nnq]Mԡ<@ӷ?%z̔> 62n\t5k%쳥clA*_!<gblŜ$ccGeϮ]Rwv+P;|#L\ۨOP&+uH#qO&Q >9vZdesnr$˚pX�Ǹ<7J1!�2<+19Hf&1 ~3S䍯Đ!Fld*eC!Ȫh`+y76b?8-Aa1HZ PwTqZj:ť\&dōN(I9:5%@p!|}#lڊHLyZbޕtUB>3Ti2Nfk|ju0P}Y2R`WxŘl 좋xJ:H<C'ߣ6rĥ,,u*$԰m~d+B_g*:N<<1\M{x̩q2JE4H'B9dY MߔCesq[~o<?)ycdu'L1:sbdmɍg(3,: ٜYr!,N[2)攼Ҽ4yI'SW7IjLΘcFō< jMgCw*uO잋*beF;T"}D֜2GK!RGoo%իqؐF}(5~ӥf!NH'}`۠YUIOikQ;:љd+Ӛ̜RI?%w'(]njL;ZeN=Piv0d(3 J{dF84ڙv&lY#ct }g&UզU$vXA_ֈ.+L~3>:&,֔^_}zvQZ&0H_Aoia/EkM5PӇ<Y7fu ܵ:#17E"*IǬ T-T3]屸lr\nGy13KlW%΄)T0c+13y c3q0+ý4'f洋ٌgWEpżL e Clda#/ z)QCT\Ng4]A8]8ߗiY}uV) Ԉ2pE*Un>NS87۸>Du1(}!~C<KYAD}Tp.p xfpf';2?vr#F+s2bjHq<gx] _A? qG>C7 %<,ilCa6UL ʽTrJ.>^eh 1q6 :fU 5OTpiRl]q7yI<•0+>OO)D F^ - (0ݜ‡+9y%(G3ynp*V+w)d'ŝVgT´蘭 3 ~ĄZe%fλpT87„FG~%FS 5j?h`H0S{\ec I=z޾ 3l=[?<y\to,7Tv$%m(́R\rV7T7*UW"y.Ou[= 5zӪ *k3S5c 3Fؑ<ŮC3g>'k]wuu3וv1*o}Dy:T'Ӯ۸1TdViT. 洆FtZUʔU{Q͋KW.6Bul~^וo7謾¯~Sڏ; i #{s1;f4THsu҄tҜcN.zP""}΍DY/G{G^-8;qŬL N㭠z8#ge=xSxװIL+￰yJ:? i#l UQX 7,!}>kOn3Di6;)x: '\s,! 'vN)p,%z &mT19rEK4ń׊q!r?]#7<UfR3(j1`@eH!i/e!os w|*5�OYEm.\,{3;I!I|<r=j Npi%,DTgGtD"漨.ԟRz_5r >ʽVI8gFPpNg>4?3Za_.uA70&S3ϱ+ydf"-ǁH -\$~CkY9l0k?,>DOi4A4?ᣜCx!̸HM|/f^917ٻɛ<Y˅,pszg",(xi1(xե=' ^%r_cF圔Ui+>-pUYqS2MAQCNV0"&|eҳgW54nLL iyU1]Pܿ-('u;9Ag0ᰒ*9c*3p{ÌhtATV5v\KJEw Ϲo6g6;Tɦj-Rͺ7]YŽ2SFr (^ M}*@̳s'k\$ׯQIv5:bHuxNgPڤ궒Q v׈Bb 7ǃѝpSZNCf{kvE?&cGBG2/e/ Mџ #*Ty%-0'aJ;9;9%h}͑4v\@AQ?|YU~\3&)]΋09fTt42%dv)yx3s#fppL M8NNТ{uHȤxݔpg 㳬 •1Y|&sJ0\y*r00V%Tp7vH0;nŹV6+=Ÿhνy`)֓pIC37WT([YD)\ہ25ĝL*Pv[5!V,D˼FnV{!) q-_Nuj4|PrJ񙵈<Ośb#mR+ WޠH[A3:З;YOq2taPb]`>t<|%xk3r&y>G߶<<ЯS)>,b7*� ǘ@K?tzjNIF⮋ ȆI4"fvҕ9D~+xHj j81 Wiɹ"bVF9f*?tGG7㗵+1L̀[9?:jΫKus~=nx?v50:qd>]jK;%6hwcq%#ေ̙_e.mdzU0Oc:ZHNc:uSD 5^)6ԚTVϰRsGcFg-%&r!L9zCNmfHbU ǰc$=bBNMJYBViFt1S&Q&0_~q{(tHIa*];D]==[X:g`GSO-kK^99蜆žhؑ7ǾxJ0]iREִFMIݔWMZRHέDV,jr^"?>8\?$>'fMLK7[y!B#Is rSj6[I?aeY{G3Hޛ%Kq܍MKńIɁ p9@1`cܛl˖dYdL}[y?hͬ5λ~_.d9q5DYXރr :�\ }_ՔQf]q^0sVv:Sô'銜ab^cۑ9Sx;ӌa2C؃Եʡ5jyqn}U6ʷN[y,<i`LƝIYrCYݼ{ӰI' Pirla^g} BW-N6Ͳ@C#ϛw($gi~նC_`o)}28~uztIel]WUۂudw*f>dS<,mBaHO?ʼnة<=젊aP5.L\6r Z&sXLa(**|8x GVD ,a<vw#d;ieiLrdDs6F^䚘)] Eʧl\YӺ 5X:a|t/xLɄri/WhZIS֗ʥ,{`c3gؼ> D43Rgs#gjΪRW6qJU@Bj‹rΪ+H.R^fjB<:'k48pTOY#f-V(Sg8&>L~%:,njFsV$S}2rA*U,5YmJ6{HE N,7vLsjL)LX:^YÓ&bZKfmY3z~eq*/8cƯz e'=?Wg(Y3 $'saNڸࢸ+"oLi g$s'횲1+R졓lt*~Ya{qOQhyyG}:3RKl8sNn:…JV;�� �IDAT`8AOTG-QFP)eWU瞶P_.a-4q%,b6w&<h" R}ŧ-ߤ%7y5PbJLoEd16r:-p{9+ak8ϳ 55ko\-J^ Z(a/raP= T7sNڍ| tN[y׸k h86s.qCARx+_ 1 L}}izMв I0E^jaKY$eC\:Vpϱnn3lCOZd~l J˵AE-gqͩ ɃNgws_01!z 溄Dt*r{|8v<uE4{ s/$"_MLFSz˧Lbu~i5<Kc G}{փxu-PF3Ӣ趚 nL߬Iȳ1w$-˷ [1Er:j'ݺ+]žu-t~FG2#s f,)uq;YX 5L+c3y-+haQ7<']ajŒ93T(M(j1P`UBuJӒmtM5YU|'/6;PZ:<#ۡvtR楕j6Ql.nWlFјG|55F<H7,Zp)G%f̦4*LEa55uDjKV*J)*DtRII*͝+Wt̫=;ӓ<~*Zl6qLZ%'u㮌b⥖Mrg1 y"g;#br>jc<YTSXg׃,:ui Q֓M`La)EFr~M91G~)vQMU*q;ַ\ϹJ&w~Ӗ/`YCMPⰬ- HqFD9)8ul JHq`K*b9&I ^JC\gNEnc[M͑[*WJ~ q= woߎoJp;e7Bm+ya:wG<ÞpϯBlVCw:Lscg9Hp/2qpiz-l@[s. h (s r촀|�'a/m'e #X(g8y5?�{zvP׃ӧr7i2|IR "rv9=t<wg#?(\' z[#/<Ñ, ?ޖi̫-3%ԧOE=&UI[X4*43~G9s=6{ZSOd3<Բ9ɘXmsG9I5}tVʹi_gfלiS<H f*M4z7X[)hVPejcQz3ҝ*M6gvP ǵoQQל1 6y=chJk '7ZӢ2rR*zɎiXf*5>x\{/[6 o΍Es¬XTFΩϚ?q3z9lެmgMnzrxm7.xh/g,HƜU.)pFr_L0&t^Nju[&:%9A <!{f"9|;qϋGXgg&,?d9{4>6zY9ӝb?<b&?M()G:j /IWD6m<a63n60MyDOcNb2Z;z<o&8J9@�1@:UF70y!ޏsp'8P54KVnaX˻ k/&r(񅚚osT~J3+TYfi|O8 |r+h,U8J O+w7xMs5s y^=a'~4�C|2(o_) Ć|aR)\-x$WL.r 1fx'Ck|x~nj ė9.hq`x/>ŵA;9MTz,󜛘8_1&<nbnJhv^ Y}7c&(CMϲߎzI R7fqgcfb#{3uAL"g)&(+wxYn#k|Nj,I*J_3<g}hIױ u_ܟ&\X4LbF5HZV#] 1ÎD (+2+JԫGrժ:)\פ\ٌK献kZS^dFq L?:|Ǖ0ū/H.VXzɓ漑QM;b٬F9U(RzT]cՖW360z\GcU>>-O$LJs9['.V]Τ*sC)_ʚZjU_VJOѰc;RSCh"=NΞ_K]H8ٜs]&tglLU_(>mlHٴdnKi*27i rj>RU*y0O;t=>=`J<s=1S<{y-t\39ߣ,ÿL?y"|VgG8יќc|'ŒҀ-$!n!`'/0J+".g&ְ! O> Y>ȳx?Mva^Un E!rjNJd_d:0cB,$J"|֨ osj0TU}tc<N`��ϳ.泝 _ri+bӶXJ 8A?yƮɹdw"_9v01ɘt-N)|(f/m;掘Gs)3Boa|4W^"@ hߡ3(K }?Z:{ c-!@ƺO?w 8[98mp{iCqE<|ʩhlQWlƒF[RYwx YSSæ|/sV̹U^JiȒ\׹,ӑ*CY%WHL̆gSH7G?4%4x"gRSm^1i&Tq|SGGwl){WNALCx̘SLHb%:(+'tCG-U<БrSy%8ebXq*&^;m|#(9)SlWs MJ'TV)tn;T[@J]`<`3 tU7OʔDgxˬHNK4q}WΩ,78i^"Γi7[䍸DBQm6TeUF_2:WdΌݾ ELM_CUv,HuDE̬#sqL>)J)3버k|+eIHܯV"^єr(R;=G/ִ?ڒz͉g~@²H `&߈&3crE -r!Ws<Ϲ\őϝ 6W8ujEXdqX/X@ [бdy}[ Y &Y daZh'fFQHO~_ CD{ɯTMM;Z8AQNwk2iA B.H6vQ\/HRydo1{9F=q)c et`ñ:-sy&@̛RH-}11kt,Lpة/<Nu 3իI2I-+y <B.e?_="^y>rS/$@@'Xg&#<M/K%s-?Qr'f1qI:YI]/|} ox(cbUy0O9W/,}Zbb ֟HeP]*i=LL霵*Yfι3iNrn/'7xqD=sd{_Hg bw~1M<y*359m|@bj8}m2;mFR*bfTNI j2@QKeg̗ɤ[P$>m!eJV;>&+9)֭ߑ9c6d+^k_Hvʔ TVct˼N(2T%W 1+đ Ulզ*8ı֖Kʰҵf&l4rBmX3rL̘sf'sJsfjUڛy*f.~vkcBT7%>52VjA: l2=k0#֪up\uF<]̴(QW5s%3:5]Òi3,\{`Q呈LɭG r'.3:E�?I]R(hW9Ѕ &aj@8ͳº_G1LsXLmlWLQ@M声ElihP|)L2<Q6&^|]x`C=L?ȼYY> W8EY�axw\JW~A0g"]sMM˭w^yR8_ɞ`9 V28dy 4 .aa!>bne'1(O{syf,&geg%\kD,01ݼFa$+r%?l3*6 {d'h=70/ ]s 9vﱑjFV~B^M<c6YC9;<r&2aVF�E poܜglN(&}2m;_*>/S*ɁhW{r/ 5$sǼ+aUtj(]Ӕ0{>c5-ڒF#I fu4;kǬm\j3$ݐ5HSǩrdUJ]ڜԉg۫OZ3q:~Qe^_gjNIK*lR=ikRZ,Y,4٩2'33 M)5aQ\nuղsufMJ$:Nf3i0:"#Q޾Q 鳰LSUʇďZR`nZ?o&*+W'I\㸦 %&JjSvc*,?a]99qՕN,P1~BX"ig/sSIପtF.#*KퟧfH[sY2&i>wEkq?p}u?zRMyBxRHdJ_rć<F|(rhJmkYjrǼ/)gX\,>m!?yWšHmA={¯ Ad0vʙ`v`ũg X#C@kpv?]Q'4S�f_ ϝ@J2ˇHd0f-{y'b;7N~*vz3j4\K/M<B7g<\A?x'N7q62idM͉T*UVgO&y3ۃ:)1A5= ʐ1bn�+d W(ǃ voȬ-,/ sy\*#/a*Cxp|Ԭ2�c+C@CeIAą:6D9kՍv^cc Lyn 8'? _<ӴsR\R)HO9<Ya~") jy>.5�Kz#"re_Ϋ ({uxG=5~RA4"5U$41kh9+ǜŪڤݓ4fuE:Og193Wlq{M1ktG~2άƘ]sZjΔW6S&;^i.Y"T5a}''2N4(7<sr<@aV [[cXMG:^Ĭr3T٦#i%r )`ƝWRJjظ*K[^\LjTUXNA琎JZħ5dݱ65hqY[f|zJUܰGmv!',mҷP &'ܸ*'-RPI*JD[tW[6jK]f&tN) VKI:d-p\,=۵| 2UytNQw^)#9[G<F˘qՑJi_H"rqEq>{!g")Z"A-22W2(- #Vs_Vx ܙ0^J_!Zr7{:~L+B X%>zTבe_N˃Wfۇ{iVzjXF ¼^yc\Y?8IGe;K!1!e6#~6&>_ qfL=l55Uq;+㺐 !mTy)IF c],z~B 3<ʟGy,.}|$c' ?\Wx?GGzVQA0MxB GG}>xyߐf;8=� qj^#.h%A<_W( I?<7B`)M:'gMi}-!¸{(eoge9/G #zx&ᾌ_]-!<U^2Ȩv6 |:<3 >#_]cIf]6frhBe|7 jL&9,)yxǀ%Y_G911>="g$KQ^c.a2+KKc[5>z3GVt.ʵ~>U|G6VYyGΙJ';8𴊴GS}r=$zpIS6Yu]aI4Tq̂Z2'LidO5:LPӧd*WDbc -IT`Nk62}(zͯ73UK)װɄHl~#EU7-S:I {,_jFm(3ani ,j4R%6Xϛ',6PDz)3ڔo}g 6y& 9Y%r7I[֗#s={V!1n^"(i%CNUd"R0b[3;Y'sK|lJ+_ƻKpr|" v _PL*6�EԇEWPux@WR~po˧& ?!!g 44h#.Rx8(M4ap)J0icfʂ4@+i }1#]fv QpMM򷔫Tj+ϓxRsa9VI7o|#!Sg00Z3Jfi(:|Γv[W8bz)1KYy5޿p%ɶнm[zYI7:40ɠ>xP%o AR'R6m9۸7lj΃,^j;<4(#Ak'`\EtQOy_oЛSME=fOsVk+x!9rwĽ>zG +\7雮˾*UMMM6lX:ܜ0* X^RYg]Vfs$qO̚y-f0n=WUٔ0oHFRgE{鉑mL\:X13;-Kɱ�� �IDAT0{S^ycE^>$$SⵉT_Q~4RKU.c1W9>bN|Ž&3*'T*,7(%z44[(&HҫfygUi2ԥXGʦϩyiR<g:$c>uFOJ%5e{ͯ16*S {hZ#rI |I۴LxFzLEV FLq)3ʨ["R]-ӫ;卌M'4f=QD ~+vG#5fsr<9!!ÙL'eZ4pyiוL۔"n,2UB<B"!ys(a.2sF_r)|KNN/p w4x䧑!yzh<<+sv袄 > 0#+6ɶ1*<k-Rg41,?7dia:SdC >Ξcy&ڎs44^`/3?,8QSS[Tj/3yd\JZun(ȏ?~:'e$ê:idcw3EB.R5'A~5�$S\Lk _ =ag$XA{9A(cs<N̑&ޢoSIN4Kz<CSV~JeX(wi!8gSᘞ1"CT!1":6gn D^p x%hF*b9KR6B*s^Y{7~LYgSʒ!7wrȞv\LThqp֋ Yq#~=aBqƙ9cqOD15'1>cagfeKsťō4 Y2T=X實xyچa'Ԍ);sifjSmi&jĦ$W$9OzsbYEcj7RIɄQ5+RKUUfdbdcYVє%Xi\F.pRѸ1U-dG$(3/zEq )2oI'Ӑ5T(Q&QPe:&2X0R:PVEF+/01l^c2>"P,)6fZo9 BG'$ҷ3;Yl4XQHZG"cOy1i614D6欞Ӛ3j6g3sJc"SSl.~Z)?>'=[aQb+ j\FI+0ۨ %1 q7^Aw0 >9N(#uN;^OCQCO,O$ssBS$b&xj=)渔ǂ8#Ya9Ru.fj/3SRInl(E)ͱ_O'oQ;_M߷8ĕHPCW ^h j*j䯊80'\N03RgSXytCc!˂.%B\+♤ʙAqm!e= )rvaQWq'=2sX}&?'~"3J'8vN4[` aA2Bf{vq9/p-p5S!~R&#9#e%l\Sy�,9Iq&J#'ٟMYa^T�;NW:U|& ռs s9#gkWQ^ݛM^.9Y1H'Fs&5}.¸lZj_e$#MGz"] j[g.x7Κ}rׯﰪL2knᣚL$,׬dΪiVj6 XgtZ{ͯ0QeG1cjۍ,qrμ~-c!YkXqK5M˩)H.gEj nݘR6sNfBe}-`l# vjJ'5tYE:#{k55-\~3&;ѣB/i:dJYϿj7>tHIv톊UB]GQW9RY֢%V/5߯"6ƶY׺%#>xݏ$LPܤCWjȣӎf|,|5u*L4gDS# 9nz+=Ҙu(̩^K\ŕ Dbk2>Z<s]bXT奫Ym K#g,f;f9J_9ocQż#lʸ:NpMEkbcq~eSȨlHss FyR~*M 1vwCtcXW< j6Q^ }L3?_,iVPB;;9ȱ09I/98Tr3$(k mU6⷗oR\hz~NrnG:>:wyS}SgyPT"f8@ü0Gya'dxg!8dq.p$(&#UAZb,<GA!x27 {=|_1HC`a_{E~N%$yq:8W  8 ASG&}:!w죍G# a\$b3-kXc<銜Qhd:Y52PCRw?uQv?MI3*lWllpć@8IH!$Л cᎋ,Vm}Oٳx)}^֚ef^}(iYZ=:m x%֌ГﺼwFky.Sp%6|V[#'S"_₼O\vhOEKӹշ;̼5ҽRfZg-ik5R=&d4(?cQXAy-vSN9Q:f"eݾ`sT,d:ju&:ґJs,z1&i6ѣ쌪2xZ YQohJnee=N lfqbHh2?iZajLIۧ\B\QUmg4Ґz\<ctJ㨣y 2f%v1/rBiD RF44kނF ܩ?_$O<}{z~n,߮QSju \+SHj⚼$uLg)M6LW<Wp ኜD@̳ W{Oعl5|":inVmĢgK2bwlXS^)~M j O(.0<1WR ȹb:n+f&p^5~@S"\F#<\`20fE/yiz:^żʃ$:3aQ7-alW :4!xdH)~f5uj}|aU,I^&?<לCv\*U)g- +Qf(dŒc>4!az|E|^U!籗Njd)r-C̄71W8J"; f)caD$|6 sd QD <VKq^e<5\31s|5|ET]xlj;| B]^M N-vfm Q6~WXgWߧ#|3K+6s=)<IY+|0  K&xEX' 5Z՗_ixdTٝ,IOٞ!c ${mZ} oY㥖d\b˼iVfm`~LsF`u^m;2kaJ]Κr[<_ĠѴǎ:$~Rx߼ | ZhhD[DmHֱjmsEefNXc&*mFvVy35r.xyG4H3ӤbVUBp!mkMO_PӖ,2ӧk #cZLɄԀ*9f댔v:uҙi3:Jz<.-1C%NkjIyiuuɣVGLWʷ983dDCXFSKvz.[ȯ}>89eGSN(;Ufڟ:%l-21YxY{ .(8:-ŧUynGb6"si% h2Ak~$U>.ߙh1E>M}s579!sK%–hbvpeK[顏2k΄Mfc8[㡪~vjU<,9ZaXEYN{C>z-#Jw(SႪhO}.*09 <`~ʩ[J~='PI;մ[_}ߵTm\KrA.&x52X(;)FL"B9vI>~t(c4Rʲ0*3g'Xp- , 'a�c|p=kYεCBbE2ȼ9tez3i+! gy*0иyE=t8!izJ9@GA5x̱g$4"2$qVbbKQ4/-w …Xcg6uA`Ջ]QkԤK }1ߊ޲5o)Pl딧|N9&Hr[y-J3Y =<.dFK'ڟ8ZGJ_ B5ҟ}Ms6;Q!}R[TIdL-ё5ס⸊RZJwϻIl\$. ګ6ЦENL(-˨i<L>z"2LpqPg߱MoLFIٳ>;̼eR)F,Y) Qs k8>g%r@cȬkD#t:Ϣ9qu]51ܼ9%UNNz*LskJS+kLj3eY )YC:d|DTM'L,JSmYVIRsDGh`҄E15Rk65oYxjgX1+}|?p%*Vs/ŝZ'Zwo:�?u)g{QxL#u,c;I[x-&^;?t.(ufPqrڻo:E@Łha)kΓW_ 6EyƦu̱,uc#i*oPPq c\xz>NDǡK"iX-KVʋ{]JVPA}|y~>_b L.N)\0B{\^z diUŝ WqJ -bh8h6p8f"orcl#qW@̅ B o U,KÃ]4̩zsى&4'ĨF~%"6ׅ깈H7PpH[e8Q;T `gd8; =X_^1ΆԒ[}PzD%>W?y7OᏱ-o]^:ēe!_>x:7-?5 m7Yq)%y)#uYOY0GaSޒۖfbFf\?9=ҝ-#Q(ɉԉ'}S0id޽1h:S,WUU*P،'-2ܣoL) *)T.-HhK99nHDlDBg9u3 VbGL`VUeQ%uDL8ǴUNh^*c|̤Q~fEDL֚is|Zͼ٬]Kw(S[pF6)1W"=fWHD\3,OgKr_hٙ [7^nN+"*%e5{V\kə]iblf c<+xRUYlvwXSVJSl^4tef:@'留8M4<r59Ny(.=1+C\5itG yzR >b,O+ aֳ=TN%ĩ~ûw zUG8*^s#} Ћ=G" `3gʹ2fJ)n:u1b>z(v%: 1v0nnf7C#p{7W(nIqs(x CXV1:6*yqb|+4,yBbjwI]<x+e<a؊l& NqE$$t ark()DYO5'CW2t PEx1J?b;9|%\}WH7) 4u {87YI̺ISa"0x~N(lRVw*]Օw Fc?7PT?^ޑtW 7@!5~y&icGi3uVtΘEUlȩʋ\nQu>e1KD窴ʴه)]ŜDEfhX¨UTʌ[,YY&/OhXXCtĺjs*fU&Ռ%/m0gB}#ZbWeCϫ)4뵼lZhi6Y*֧pؤCu,wWCt=Z:t~Nr"-FN*YĀGԥdUy:5f*d: ̎J/~ɴQI$4OhEKɩh2W)OHYZPQ'PHHǬ3Z.&;il.ymzfij29@owrny1~Qp}VYv}^x8۩e#@]ϚZFshʫ>DA!⺴Vf;bM^>[<Jm!v/e|1a$b/COr!*;8\ۼc̰%</&CQ Y>NbAIH;oGyTwc(aхhQQd!~3\Ƌb7' C3Mla.>c0IfW(V(>_AT[QNߣ!Ry7g"ƹ0gH/0 T7s sT\OBeG+oxĪ@d2Udi oi"~t(\By 9cυ3GB�G?&^=W~EfDZ C|50X~+y]pQAE?r\BV2wL9>O}:8j#"|15ϳ^$x0dY_I/|a0Ʒ}<,|9|L9ە9y3Yv"!K2gl6ҔoW`5UKm:fไ36>'|=[Ƙ-QlvD3$Ng2ҧ/*UtFUV1snj,֭wztS>KRj\[)vX"?9QKfNYX![cPN"'~ZbclL쵱OcFi&*dsJ¨xxVc,UBߐa% ˼2V2!LZ_E!+hWKl٣L,ɟ3e]_(Y`r1M:7Pl~Xa%z:%o}VEmf|W9:eyyպU62"^x{ޡuf5UٗR52fq5Z"*λ+b&nťNfCф𓂳o\H};ٔG|#%~{ S -xJJm~hm2'QwF- ʟQ4�b7_f;.Rw�� �IDAT~̏ycdYHgܣw1,kfS߲~.a ʸ28 ^ijCii E, gHTES$`c+r8 \BYh3:N EpT9RT_x߃w!:jj]T@RS0\}U8hf=b 1Ĺ1D5$QpH=9Gy9d'و9Zp_5%9+|,rSr"! Fibu(:3e~uS‡B*'ɱIv\ӤNq³Yr/ǭ=Ⓛ<n4v)y+9=\`W\5QJO9wiwƬRmѓ53Ni;~UR1{ .ȉx<+ks5Qe3I'#,w$辠t[ 3;S%%̶z!im^kJoԙ m]P!$yV݅f US%Wۂ.I=+)gv׀5Ni)ԙֻ2-&V$ ԷCf-p>e%NOZ4jPņ{z9%[hhBRøhJ Gfe"*78|ВJgce&CjNw8UGAK)hh\B:[L/7ԯqJyN! <}T%畎(Q6)1#RVLFGٴ wyqkHZRETGD(3=#S}V_IzN^=XjMስ, L3֨"6fMiYo tˏR+q(W3 <C"o70R1Kˆa.Ls 8R2dȎ9Hk 43,Y:z)0l; 9B? T1&.Xr:+x2$0+9* ߍM_\8+2B:9T4%s'P0K#9D[}=x׮^Iy#D=aYNJq9h ?>PR|Q~>b^~빘yC=,rIoH_ k8K BǷ<M y!x+wCҶN#حavgQuUh'!B.A9+Zăs[pN|y|9H"OX@ແGu1G+fΡ_gK>kV'v|>Vٕe9@/#u+Bho/1gJݙn-ibKLk(d\NRݼCȫJӞSPp IC䜅55U"1˔5ˍkzFUBA[VrRid#U5Be%UfeVBl5t,uQ^!*s9R17}-DJe:S"l彺3J*UW2V-7\"ZX䴺01`Y^i/V*2P$"'ާqcG,JEK퍘kN֛ͨ,T$resy˪R&U930&S>ʎ9NgVPibZ b#:Q[eeܩyOG]uC17P|XuqVY;/#SB̒@Ğ+9wa`2 //N duPaUSC (e"�, \28V3F%9BXI"uw?h =fgq? =|+9ૡ_xI~Wm egC48 gX]qJ73fAXrEq1]]8fE-Kj8M}bwb*u hf \@G84FJ^";F7o0F&dZ0<<P3C Ga9?2v4sN-\if~'f49w._=/tȋzWgQn ፨(3D"73C{hk\t-p\q*4b>h`yD,m֒gu!Id?2![H4۸mOiD a9wwdҁ>{E-{v\PҚ1~^6JLu e.Ik*X%#k/'`;)PȲ/nADٔXV\0A3|.m.ck~nT̨?gEUJ˨,N;=qRUN[R!cSĸڬθVۭ6CtJT*1kT~щ|\ `lZIZL,vrP{Tz:6Wg2pĊ6CӪ[4ҘgW*6_zbGȫ[)c]f h+I6.7i1- 81+E;;t̺Ҹ|\Ʉ*SZU6ˉ8ڢ,¢TDd㖔 l23!5ji|e+Ue͙</od#+ȕ81gym^U 9Jq bXR]Qk:fXUX ű,kN/AZ6 WWۚJ€G)#Is7?d;'FbO# 3Ȳ9f yU %wo| -WA;9J-V"y0:\[sT w<c'ފ0VWYʥ 7ASmW"q#>ч3¿⛼^hخf2mFO9M|&xCl% \i>ns q2ĭ v0'ys4j3Ha !Kb&C[\18_^ _ԣ|& l�wWOĹF3?eƌc~x2`M`oqÌϳﳒ]Q C"'85+g[q,]w`H<%_.Ե枻)ДpWTI m'bCD}y@i´j$o%bpa). ,k?8d˦av@ GyާJ?_rzM }'ر&q3%JtbG*YP3 Z)s] K7iq3/Jj umN<hzt&5:l2j$6$!jTڜļi5{ jZTiճj$OKl0ӫ'z6C=N%զOڽ6CDDKe[3RrGt^톗:y<PdY1p*k_!=%\>*5PffXk%k>2'.;eѤa TODO~|-kueiJxa\ּdAfҕyk",1>pIޔ2Õ҈O1+;`u2~H.@<rDeWყfKʦM<`;~0v`O:h!3|2L(5.7yf0-7I�;ӵg90t nsfqa b=¦X,(x1rdD#Ó.Y@SX#\5/*91Kxe_ C_1z}U d×Z,U /h4GpZg( U4 Bt1Ul2dF}0e[cC&% yZB8cQ4�CRn!K8 %EE܊2VQ} ra~r4 .D p)#wpˋ>fsw2ÓBiRG-wSssљ@jy$_Qs+)I$Nb[<r_:.  ޼lUAYܫLU!b]γq Gd|Χ#$s­XgYдC<&KL\}es+]v[SBu,#©΁z䖯KeOLnqoN؝ixr'wGA-3b vRTDfPkwI\x7+QZkEu.ROKrU,1azӳƥtN=öUVSg*&_*=1mϪJ1]gFِ3ɽmcԅĪ:"sUf*y˚Zs;l,\CZU^tZI^ &:¤3VhcoYzБ:,QY5jħ֛(iFO <Hw0fCFe\K}J U+5 YgU'M[=gK5vA57Rޓ6F7P[xMS 4b[哒:9ݓ>`^cŁ:%6G~c<tqg";"?,1x]32~e-D *(psñ;x.6pO 3.d:l W4~-DBѣ, -y<?y5e Ӵr;{µ<{i>̿PpثӍ9jI6ݟ~# @)a/ ^3fMsS}|Wrn%MSh8b<+pḊ҃w[cL.U\! $QhcWl$2Cq6e*[9{w.DV<@ \|YH,zφxwsEkR\_y9q[^% *(p:T⸫ ~,;jRQuY�7ך&sjE]+&ic \/N.HǨ1{hq䁟F~)ƒ= wo͒(SY||ԽV&dX?j/SZ˘ b]/Vdꛟt>D}]KޑsFg1Z[֥eGW f{W8:̦ԆK̺;Дr"2tU;Mv22)svRrr~]" M8=zHm*yeqK&tuWDeEcMJ\)u8ca񤚅z fN(ܫ "t;]Kԙi(͋e;lVR} kML)O)2fvHOѴy%ě 4Z9tVeA^n^yNrj,ɖ3%U2m [vxB{ ""QK;;=,m`ҋ<Zy]'ϗ {4&b"F#cZQOYf󄁜G QWZK~Vp;pr&|1ie9F=H1Xw؝\OjY=ʧ"#'n}֥tߎs_`=G)0q :-{τfЕr%!7^f!K0U>v4r, 8m 1x4JAxɭ|N+bb.mqyFcyag顗WC4voҕ0 L�{(gyW@bI ܳr 3Hg2u6660=!pJ.g9ʹo+:g l*"&3O%g"=,!XA+@5u\ [:tx0=d s!x͡7\6n7WoC+fqn6t|1w)c -l/0ot=KSf%x""7_G(ɇHs ^$glg7Vŋg%q~rns"߽+=_)d{4}R'jU|#Q:9_f*ِ;X`QԵ1=/Blq%yfzqO޼|=۲' oiOZ?3X7tf+v55dW jM j X&*R&Qw'4̪׼)kk,Wէ_Or; i0(rӉ1IF $4fUHEU4adDUdVVCj:4*4ϋk3>".Rf/p&/Wn>/q\wlVfj[=`ŬUtf NjSMܾJz?-5(q’9'Ti4V`<Ȉ.0>svދH-ro  N i@B8o t݀  n%[XVҌ4]h眰^\Z~z羿FNJ.7!>%>}Ęymɍ0ԖMO]ښE#}3 Nyᔺ5Y;=Eb F]32ᨫxJL(YrY \ՙ$ҜQ7ZŔܙ>kĂAMª`q8̟MCle9?hh PaҜdvXy]a Q;A) c3[ʲ*L}q�Sl[Ϸc1ǹ,,`CX3s{h )y kih iO;̵rHvǨ"q~h ymS-|3A~ScQ6;Æ&ʩ`ug9N}H'yw"^õ8OMaSG꼀{cJ襂~-Nް^6Q\GMT y4cO-24m~y^�Lz6S699뛛P_HÌ{y5_ql s^tyM<~|"WѬ?;n<4/N7z((]{TO/\^YH$-hϚqgN{<'[4dm |\=1+䙊[JoO۝G8쵧4,Y\ӆ=kD.^$*ox\rOM u9/3X * L;pV*+hwȸ ~efKMv+=|pL6OzBS rR/f5HQ/jfjД/ӥUTVpu*i5'4+Ve4hRY!gUH*ڜI=iIkU>rWlXYOM(곲t>j-7HGؤ`H<ݝj=HNi TVS"wYG+!,OyTEHŞ ڽ,dKK7ufLIJEѥfͰ!5 D-RBZ\;) vS >Np) f-hP3/�]==|z5e ^aub#9'xD\A\H |!v#( , Ÿpú5<'CE<FXm\Ml<\!>ɱ9+3|251І~y4O-y v]?xj%'$accx=\=˶UvaJwW%r|+hTx/8̭"ʍL>>B!`_͛ :ӡLe .%a7KR\‹ad3\~D NB|:Z>EN9>p"`K؛Xs$9HX 'R^u88fX�� �IDAT.+8I ygtx'U&gX!Ü1#op3kt{;:s5x/o0{S,d7CԻ*͇n\依b5& z=)s1942fgeNCȬYʘΌm9jˤk>ָt}7IKeޙ{EV\깅Ҫg/\jm|-Ͻe%mWob´ȘmdL/B5&FT3^aX4вЙ'S\RL ERQVWZ//":|]?UjDCEW\Dy{?nIu-FUwJ,hOFW~K򊑨e2RR JdjqyOt\kRq|]eH`8Uyfer*^T^-3*K՘nlKecCz2 iT9ڡ"7w.P3[su9mTSŒlLIJrύp٬.6P;ϾښА=w^RZu%e<q]{gcみF]+jl9zB-izvAQ^y˓3 ['y ϱ+x;anr. r'18S pI]5줉n,0jp{~GxYycLA4lc9\B" plżf5LVs+{{}q.eSfmg8Qux8@2bd"SfC4 {w-E#3L"/e:Nt胛0͌W+Ȳm<1&R&\Gxb^))!R\:01x."mސ!u,`Q<'Xp'9g*bWrkP>^!͵{CGrnZu-\(d8@%("ǹ.# Cl![=g 0WUڧaM.x-OMw2NW<Ү2"3^]d_ڃwF?Եɼ[x{.brܢu9=~jќM9= ߙ8SSX(֬9#j`V3h<qUF<("|ɒNO)S(02M?Xֽ%n,Iߠ0'ڧiF# dH%Z 2Fo44Ԕ*ٵhjvnKbru8dUT2טL9NˤŪMkw<ig|ZnfcO/1󤫳W93h-bR62-P:<_:.;*th](茦^-}"5:W0`b@Q QݪJ5 *}~Fm|U*"V;T4X3[Fsx_@gQgndD+%(PSD4k:ꂌhL~S^3S:oIz%@mjN]?!&\39FZH^I3lmtߏu~ĈoKA'_34#<̝oP4̻AC5='[.;LQ sP*X�ߤ| TV) r0Շլ% n& @1Z)$fB c g%a@^nۡQn ÁV*sCP*)q(WBQ\)*2Yje541p!̣ eFa(/ig)?+Ȱ62/g[S".cETM˙tE]E <P2S23$b0fBgCYfJ-YdxmА;=ăaTf^NEdO-PĖf0ƚo™܀og;oQBG9~"VD7#QUgw#^h}DJ!/U#`zSWnE][*3(v[8u0#ɺ,a4`@&[LmQ٬K';ԝ`yIJ\GWAbA EyC2\'7!LgmLe>iSWJ=Qa}J$#6ir-62!t'Uӥ}:\i, +>>錖 yhHJOqd isƢy&{4ij֓'Ӫ+*ȉ&E~SڊL}厜V5[T9$jV3E:;'=vuW=&"^ uTeeT>Y&)Jc23GU1 ۧ6_n e*'4hқfuqMVP"٨|@Bzүr9Tv|LA2y5 w:AjB~ˣ.:=K3<:c]R_ƎJ[nl,֗>a9/D\1gsND]Ņ:jR29 1w>K >gGZAm}7GTM cay7<VX <G@g8f0YB9JS2~9A8p{}NRL{ؙ:!^UKl: Ѧs'U?] T́B8E6d%!P<yWzNyjb7D925<:D&fe}*L}0ua.Ivq6b=q(Og4pYB]_<C { S)X*vP:oXT́QqbEdRu.8;Q a:k}LG ۹.lR_ELc+Bd>K8P90a0n]┆)NP'Y<ƛNNh%5<;2nN{$Xņ7Խj|ʿ.%Pv_zS،޴Og rcHJcV.b6WLz=EƘ G<)i~~d~ca끒ݘ1ڃ?1+q ȭ&X 92ʼnl" L2DްS*K刧,HA:-)0S&Ynj"QUhZ޸|=e韕߬ s~YQNdNPV$9Tj#qAqA}X^{#%$-1RԌ⨠lHJYnUF_EUTwiudE[MjK˯м@ZkATgV v *dedef-k@fEYIi&DN*7<a"}ߏkլ gz@Ƥ .j g 1Xښz4Gf쏺 PT۬Y]Sv%-ŶɸQyrFUH}NdKcq&9;-)Cj? IN/Mg#':SMϳg9F`)kyF-2 [8$CvWɐ&J/ylbG``yFvqY[Wp"5g#%i#͇?j ?pEɣ_B;YQO9ߧfF]țՕUU]}TZ9xb '( BMdp9PV8ڭwŇfΪ|$e'~1 Cad33j{ t1F7͓gϡJYx0Zd5aaXW-a̛AĽ)Cv\7$)4^Bѹ^_)m*.~J\`1:ֲk(FYp#}ŽcNl>qn R ,Ni˝8iV6Z0ծHZd\O29" +[${5譈<w8o&7 5[iIg7yzrE2fK$ŷ(אU4.t4fѰ&iPծ } 鷺H|#O[X,Qm@rXm֔5{Z$ 4Pe*OfDu\&+6I7 En[$G~.>5zR{55鋓רoK魔ΈﳶA_%^Et8)SulB</w:HrPSfJ'^M蠺بmv*h**5´bݧ-01aZ٨6&M%g|z'ITJ9\-/=bUV;֔2{{$}Ľ/t | p%y)9!m1M/(k6hD\˪ Q siJE=8сыr] Dx;R86۹^ lE^>~ ;{ӮEFۛ+-^W\f4*ƹpCM<zang?]hp=Mz}kȤ\k ϯ*µyWII*6^UX̜H}Ւuɰvuc<l*Fqι5DϾz~THL.h5h$/$# EG-<=s#!E JWƩnV1K,3!j.Np$QUڄAur3mɛ *Aż6bO 1VvnTB_J,|+'Ŷ|,Dnd>;żTq9k9j爖S\;1~' M^G=itK򨤋<iLɹwG|%\ = a?~6;oMYI~ڨM8ӫ8g@ iZ;ntÀ@߸$#?&p?KՑip*jYЕppMX5QhNm<}5ef87{FK!)tTS*Skm70ΤTmy(EfIeIؠQUPұ1'UI;^Vw߿߾ w^_q-($vX`Ot\eQU&8rƧIo;+%7 D59Uj*`Q5Y &եVmwXP&KyI]Jz ƇMyi`Vьy#*W_KcAM*:7=nyҶV|eJ W)o_ƉfMgOoL<i͙3c_1;jo-OٖRTY9QqͬϨԿN5ʈ<|dN1l鸪ծH;1!.EM RjF( ;1VqQag&۹ VQʕB!9{G". 繂6Az(9D1Ut1.2 sZn&.ϑ} Ls1¯ky/"\ķxi%IAN+qn0 ?,Jœ*)N E3C!79D Q@WU'M$>Tti`H3e(mGDVR̶+Dޚ(@ؔT11bq|. 6Ls=_ Ws~Ĺ"$U;8Lυ~\hS7R0m丆y3Zs5ϳ h9IgC~9ȣh^M<Ae!y 5bSն"E\:%[(_(Ș:JeK-/P`9\W>!E hD~4;͖u2. MG-uF|PsF |h'"vF(T7 Fg*b)}5n:cZuMNS?dd\.m|v]O\|7!jy:qꑫ+6kɰ%U 䙮 Y-/1dQKڜ1>Ԡf*]3gU3Q 'PԠd:#*o0̱~9lˏWVKK(<Z78?=S>Q3ǵ h.4;dT WYcxfxiA&7%RqY# dMT0_w)e9јܴҘlz $h)7l<C+4A1i-7Q6.N^d .tfP6coYfħUV֘s:8줪ag KT&O&*/i}vE~WlJ#I)䦌iԜYlIgfs2;vmC5nI;gIȸ##p-1כ񥸻 PQϦY3yG 6k*jQ? ,>΄%|&_fwZqF~G;Q^!vN!C;Hϥ <q\ƒ|+uA1sײw{40Ʒ~ªW5nq?92*h!/4=S 5\4S!ar}%fԽqw<MA=e[9񝪪w~?A 7]Bw @Gb5,e/4QB'!}1"R+UY)&)2(r;9lwZvs P,V,-QS0Oz<5n,[%_U`Bk€0D?/jxCL#Kh vP+b ۃsfwraQC6=E AHp.+2ž^3H,ҭA+6tsv+c6c1G3spatɄJ7= @OT{.bm@K~ZuiL*rQI[օSg6&aۋS۞`tptha/&>і'\44+W:_e\TZ!/"NiLTrZlSJtkT p꠶Jˋ ho`^M,[`1UYJc&KL'd ,~7ODjUlp̒EǾ{W3VfrT2 d *8ߙKN ޲#nѮ[I-hUjĬGKM,_k|XIWOyEJE:,(U>.OHas vaAlZ+&>R]CZFRYZ*0`wFQߛ: Ge2L'Ux냩qI#9iJ[1"D,H%-(6q_w){-ZVˆڈ:v2d#*:ZNqǂ\φƿ f#E30.s �`gٸ\U1WQ@&I1U6d0QR Qz kXñpױ5lp3 YB3K9 en 9Ay!pXoQV's)Y71|xmu(&ؗ8 4rc7KXo,Ѫ:'5D!!i.)i tO#R)d/Z~A9L2;Γ 5Gc2 )s뢹 3gX&f>}\Ƌ :600 `L>'/pס3]^CM!e. 9u/6EZYnS`$c9įiu`3Q5|#0AW ԅ$ ahP{K\ᷤy1jỈ{tQ#l1rRYk"ͳ1֤)%icސ!t PDK܌z ݆#23+RMwyi8<X,Qy]k{Q+* Z3 l/10?⚲rqZ}W)i6ܥv'4QPi6ܱ2 9G5ls`LUbSNSX"&uz}Cx�� �IDATP}%90,-*8_TPg %@r ՚\xijKL(o7hJ{RէuGw}-߻r(ٲ ko/jU yL{tѴNω$|[>s}y>tփA=%IyV6&du%8AHD<lL9"] Z2o[G{,>"I-ӛ02%.+?-5v\ӧrt'DEaISRs匁@&[Bg?™1*RZii ǵdLfY[0)Umyz36Dd_f]9EgS3 =oP߸!70tCg^&#P&'+j*B߆c["ia0J*rފ}.~hZJ^dq+ RfIﲚ.tq4Uw>$'%f W[Ntx >+b8+4<ɱ"vɽs q+Bn:3D"] .v,e//\#|8;riF&^ "BCs=y$o]<3C1.ҤXCy/s(9oQG8/?'a?{Z:9.;{_+'=rYMboFVitp#O2p-Qj!w#:h c`+{$ mqCiOqwͲ_Şy|&뎴ʄkr1z$jE*MU23LFS=%ڈ(,⪜Θ)9DS֬=/JY]}zeeO \| K~yʂ'gXy֊j4Fm砖e>? /1?@F<*7nHiE,T_m4_*-EwZyH?z{^ۖ+vTZָǾgfTUw50O)(GmZ3򲵳7ze*$M}ҥߺ~t%gwXTd@*.ӧW}~Kݮv7NԜ;߼xϪi;a鈊J2U eqYF6ʊWH+țѴұΌ)HGf箋%_~<^vb_>UX8dTSTM`ɬu4esi:bj"V GS=kc2Ngdf>#>numVe(+9^.g9t<gO+/G9< %ҡ(#zy-Wrsa?75o!o.Т3$&}L/CK)I+ x4]|^ ֯&wFSRI�\9,SaɫYNQRv3^s+DH Y;TE$6slɹ8骪{rD">SDB00[缇TXRcB|Ya^`q8A7{Bu>|1^}z~>jFJ&qI0 =;ן1Q8؝kr&p&nĚ)_e-/dQ x3Kyޔqn䭜DY\B{}-Ρh/SyQQ ,+\K!p7>x7"gHqj,uٴ$ 1GSm1r\qKV*=Uʓ9G,(8jZ}2y~͙fYdY9-Df.=ϷDnGDm`ꞥeSX52Y1'MqRst)mHBXnP!}nțk4Y;iE N.]lKz$^hWhLE9Z7{eEC[j6½uWzʗ?n%*J>v|v<kuW.u,騈{qʯ4+K kZ̝Kͣtlɾ/~tƧ=@}%~3tCg*&_gp3׿ 'g;5=í.ޕcwƋe&.HSAe'7p` *Gğu^{(J+uV! ZU5 ,)zcr|[OlK~5-˛ z|8MAtļ7Ϥ\0c}T"n5tY6!(?TL^N_LY ,6ʜ{K%)C9&FO}uN2kU- nKI M{ \ \b_pq*7Y%[;;3su_?cF9~U%Ț3⨩YExTETX[".OwPN> ϐ}\˼q'$l#h-7o"泝B!I 4S#W{Ydc ͭ΋aܳ-tY.l培u6qLhem6InqU:|t&wAx#̑fካ9Z{Ss>ζw Gz9f n~ޓCq',G8'4Or2vG ds#S"tq38 ! #I=><x2?>y>+Zרc?ͪZp+aW,s<C-lY.1!,7\@sYǭܩ\]G,[h8b>$"m17RE|Zfqƌf*2Ձ[ˎEr'_vO|>G3gIl4ΟpZHʱ dSdy-(27";8j`+gdTF|[ Gr˟޺k%lm9~Pg[}WVm?.ؼ,!4[CƦ(fQTQڢ$L,q0BDy3g{kFQy#&bMf);ه^;5_-7Jpޥ!&W˕4ˊK^xsV:"MZF/_'QmeZ3*&^dž.=W_)3ElwƽgWK]+vՏDK={:]++*+OVuGFs{:ۿ0{dA45S^op\CqQmiUtY9nӴubޜ4TÌxFؠL_N8/,͘4(72n\t4yВksƿ@++GoɎWw~&;n_ܟ*.sik WČKw[=J+`[KgTCcn%J5缙@F6kK\;lsɸH΁%|� v?dѨky+V2k_mIrvp"4PB5D/9A~•w\QZJo`9;fFKEb?񐜛'uV`>3a&♰Z/ I2"L$'ifQ!)3﯂o [;eVXNxMuj\R`&a>C,GaJ00>2we=a/T8y+{߶+{F w!]h)7i?pof ,c!kcm,2.a&$'9QF ¤W9 >g-}s>1`/P9CE}3,&i:a;l 1l&DzY2愑tP`;rzdW$В=Xk:5BX%{/x>k'F,X0"l*$#ck̙1:ffa%j~Ze<m&(_3֗Wm`~qjb┺n05OO<|wîr WӫFgdbS'͍'M"'KNQC:Z֯I_#+_9Ǜm)1!uŌD^Դ:"=-\r5}gT|YE]#缘rNHZDohTlWsu FѿBiHT0GOɪ gv>?wϟ?}1*_Ѝ=F͞N?8:SrdHz^o Gۨ?&_fҘ5j2*1JSsb^ rz,.No^qq )HBFI-.sIPԪe ۮ*{躥۽`,?3U)+gMω;ז|LkʆI s^VhږC q,ia9L{,K0* u s.,fh ?DpIy5?,ee.be|:pt.|y׆[!4jh {pz9 ¼iL N s;4{ 6:e#fOX1g%,/.x[ } 0M5u<UCSzu!P0[B짏ֈ5w5~J ݐ[Cy>!9d%I&'B)C .3RZΪUd⋌b[9@4OP^v7?oë�c\NI8~}jNr;oR2ޠQrDx¡5;ײ)drsMVFJx/GaIEpy <@+0[)4k:uaGafux8+Dx* _qA6$&"ICL{KQs6Yݷѓv2WZњuEEI3H&N'QS-)_8mqEM[H%Gk77(QV='5ȖN`5AN'o|9)lXu|BIeR#%Q.mQSv@KA)%zˤh$rRo~Mu_KXXasOHik0`lb3sKDYR*a O\{Te=߸_;{:q|'W&p"Nv9nm*;)ơ5=lȉ5sOm>7F.y 7s)7Xau]j2*Z;VowTwL(qшSqa^6;SUj70OUԂ%45UF[z(9Yk*cU߽)ȷXw^eQirQ\#Pวk\2h+kU'39/2w[D>P\b"*2.(#ŭWE<ueJ[E#][I褍i".!`Bl bkh߰Z: 1uC\c SCX 4Pε,Mb pUwBQ{w Brp5U`#C9ΧjO<D]\joUBSF< O al9WԌq\*r'[F̥求2rd y7!ະþ3>?J$pR{x1f}x8\F%t9%<P֘YoE9i%Xþ: +[ aje#BM{a'y,Lsm$}T*x7[Axm\<fI).g+5ÆYO $Zg -\S 8 -<Qg~XFOF_X,2V3m#dm6yvơHs:޼(>8tcj͉gV=dVUX$g:2:H?2+'2{W真UΌ>KOHJe&Ԏ(?oQJbIZ͜cs\IU"NX*XDT{w>;}~Ħ=5Ig73l8zFi0nD :~T}Ln+9Vmt=O5=vTOJKt;yy%JxRrekGҵF[u'.N1w"N<m!llS\s_MUTM۰Dz5?/ڪ' 3ZNiKd47Pq7`DPjR'4ʗiʑ1hlWdPCڡICH>Jg:DfU6hxF>?@uDm-F͊|).(4o?Yvbגּmԣ$g})ﲜqWR5"7&b;}<+9gy}sza쿏ۈapTQ 9w|w3iyB:Pl5z9#{x!m Al2~'+Gf}ĸ 9a'<XX]6v0"ON srm.pMʆ[`2 Wjj@LTM[Lq;9I%fab#[$|2 x/k~"%0]%Vu*i >I0]Ah1:5fpy&s; oB0iWQ9ϓ>9Fle1Aig~ |+ZӼg p.揨fwVn䧜D_bw<Tl'"_}5SeLXV%3pCA-_)/VEM`C07GD1 qW 4eeΈ|G-ڸHE" lma:ܟsUԑ='읿,~um-&S>3wL~US֤eV;Ү_[Dj%϶{#K?W] d+M_@Z ..>Q\s+C28[5<1Jk 'YRn*› Օ]eK.5[G W+?KuDˑ˾*5)跥Cgzu`De˾WP)H>ǜqun~C Iɋ=}ѿ7)^xTyb<oⱿƒk{zE+<)^>TWVt#cb?n*onqL"ܥ=*?Tq~1ƣ3&2$҈'f?9/Ycꧤs(月s2;mOOd%r. 4JL;8s|sŒYqywm";Y|+殼/q$*\[buVSq-TϨI`!;>H#K9^6r[H$[ {o!w4$a{yGW BE<�/ǹͅ짂Z~T�,/4I9(cR>ɏqv Onb8\X4B6Sb3in9ϧR}g gm,SC~gJ>"';) mgY"90Eg?c[(F& cfYx*򔳑$Y^ ]ΤoNG) ݼ VO<L8ڐ:y14#^j NTaW2(cNĖm|E-$o{ TQYF g 7Pټ;"v,wM`gm`o>|^-~`{9K]Z浴&&[B6YVT@zAXgx".Ifyy?]/92w9^K|E5ؙ6ZV[۸1�� �IDATi H NINH:^dX@4iGYť&E[K܃Eq٭NQ;rj3'FiQA d VVVҧhuMe^Tæ'M9a@ᛷmoN'ih9u*53"՞ +5 Jv/8mT=TCt`o<j^t֜x|TpPqZ sMӟ4Kh4PbxO(k(:P3*[@Jm`w Eմ$4e$4|PƧ^MU?2 ػfzՒESF%8?0 K88;Ӓyu@Q/ΨuSg<Ǔ%,M3ϑ.\,& SŒ|'GD.,WS:We[/"dyq'+<&B|vr$hχ<I53餛ma-&3F:E,Έf61.3N,Oh:\zb$o)Rb K8*j?",4,A~5+C>j^(+x+Bŷ?87Rgrn: SA> ! \^Rh$.^,$H)2̣ (u s9 bN=FgY:XMO>+]K ?iEa<WbRsv H1.-l`EX@GëCE28ut=bQ|,p_86\D>|X㲔(a,$4%ɛYh]vQGYBg7]Cn<Ri}/jQ`GԾt4oeH(xYƖ*we1R">csL_ӎcVxLuἱXФUE&2PBfgt1uF3Qe~oKה%T:ȄbUfLEKQ c٠۴hsHi2ؔVZj-߸WZ.PѬoZy^@\nJy^!Q2q\F<4T_k8iȀA ;n}\Gv]}yE0.{W6.Z=쌲A+0=iNC^l٬ͭ]X۽וT#/:R3StQzHS`Ij)-zFj:zܜb'T,NP+?">8rPIs*NKDE"1II*w)E]%CݥEQ^ X0xp Kiځ bgG] <E" ŌLw%Θ$)KIV.KSf?hJ}x"?z:A"̜sK8V%,qf7]K_zn/i%lX7 e8E_1 *Y0*};7g%{U\K ;ƒaxBIn%L0_tP 1@KȊ+TɑB/ޠ4h0m6SyF׉{О DR mKp7-P*6s6—�(\V$Bc 'Bu+x[Ek+H'h^dAn>zQ.g_Yh FB�3SJv;Hg7\H gr F]ǁoH<~:>#N NY./cvnM|3V12�`Gb;7ͨѨxe:bu:0 W \xʤs3# {"Y]P 8j%x WhppS0V]벯f3QSzxHN=^*DYveY=@c0tɎ[Uԭ*[k4aԂ?<oC+gCH*jqrJrP}|LQ Tg^k,FsYn Sϴpau,dbd7-%[JM75RoI_:3 3ekJV[}Ir缺qUEo0x؂ D78^t}zۭT?D ?< 3]54S!JN7i".hW7oĞJ+Znxj<hI1FNx)I mNƴLF.I߉>fysG$b4/̚ S謚@gר.58%XB\)uQ+^}{~8ّ.Z²2yUy Nh!q$p:2JYavX`]sW ֘?$`/( gq+τOqXVOS$9B['֠o0-yq!;Cۈ c -{So3ƨ-9I/_XyZ8:=.S|zNX$.qRI見špĜj$`Wd?oOjg;p<A kgJ`=ϱ%ʷ Ǚ4vaP>N\͓sD4Y`S_C(2>&Bq 9i5V19-o`k] l>NԻOr)ϰ[y00l:X?yCrU>KgEyťg8-zgN8@-g-JysاPsGSN{iUˍ)OL+7[8~ lpʏX@hu4S1k[ӾrۈɨUћ*3f=- ,RuPbٓZ"-{tj=%,*Q%c}~L"ǻ><*ɥˌֶ֤~/YV*Z7"Fj7X&U$rkդoLڥ-ym=V5hUnfRET~Ĩ`MFu]ٝV5X@N|.g76\l298iXoy:妇m9pê&r4,}Ң^< 2˕vY2)Y$[iJY1f}L>SÓgZ㉉oXitd3+-N[+pxFk༤*9!nms2WYuϬV\׺@ڨƼ YH{r]TqT}z_qccAѵnAe',b<]x;y$ <F/'_ёq uBgx5)ѥ@C/�:hdApA7JE.f\H8@e1p+/pX˙J^'Cbs:{C4G',-ĶP*PL@@"nd#L?$@ o3Ĺ55oոM*UBJ.k Vkn|a]^{Q(.LbUq!C R |t*lWiIr1%oǪt{=S3ZȰ߄gG>dq(3>q~WYB [yӗ+8bn{\&I}<C짚 |40%<\�i %p:_fq筡N}Dq92Ş =,4YUaWڹ#w?ym]醈duY$+,Wۦq(ꎈhޢ~~bQYhJӊE2֖kR%#*U,˺.ݓmV}0kabmԷ9%*iUpؼGrβe9١? LBM3McuՎgg&ԬRyWN?}wN<#05Qo &j jq@%mmۯq\UltG}RrvYYϻdZYLdU`RĄFZT'M.p4ivLuV h,7=lV+7fgij/?3_<5\>%1jVڥԹ3o^xFJ*/U{LK*Oo ZVuXˆ͚q|cwUgR-JyҜZ-x^Pӟi->טMܟPsKBՔCnk49.7G,˹(/}[yԏDinՁ@@/F\1ӡ95[ g*o@`";y<$/CQ [:n kYWS?О>yjC`A9ȷ !pcE*k^I`55̰%T袉3= ~yF6|In 5r _ U5|}eJCt:p8sd!?eSl1T*BH%bVN? i˾ Ma~�gϲ. ^rh^<tqug3INsy l)~e qs0s86m MIZx,1B$B3HYJ XGx8gr9Eﳓϕeqm iQUY%bUkgUOͯᑴQNGׯ38VwZ[3Na9RO}4r 4zŜXE2/:LL3>LJV^=2gSEL[Y&Jϰ_?~dqDF./6t(M4Ppjd&mHV8?m<GzTTsP뀖:M'TNI+ݧ餖DSw釾/;F_]Vs㚻Voi2 %)s,=f^`@BGjc*fz+bUe,1:_ה'ԘZ5Fs-NV֡yy_SL.+hLWK Re|@cNlREDFr%25Ft߂9,;~;1+7=ױՏ9]Z˨2>hN`HqRCW9Y}VFrJk.U1GYؚ0S/Z|2~&=m4"ZFJ4԰?iլ_<Zʄ;rY&գ %-%|^E4baL 6f=$qgUb,Y'G-AqԒjE#ړfN5󮥋 X6yew(üE, 6On=/%M 9whXDF4k8d !8!e&v` ìc~IRa7tq lf +<|^*8:  !$htk.vW!e 'YHMMw\#0q}9)V1Daе|!hX`CMxaV9Ĺ#1M-, 4B,t ְ}! 3{8#d|v{  C+(#�azd.$ 4aK-by8 `e;%|E󈆨O^sPMg˚XveOiXf 1m "xs.Y^?Ihw~\+^5s %vL vy&M; qSSfҊ""Y/\ߢ\.g}1z,GNXQ>-V8'%?'~d^Z3KԔm7p\*]j0Y"Y&15%hXgtLx,UoХm8[Y%c{nkȷZ<ogچ4Um04M"Ur$c9񽖵Zk舚5ʎXQZm,$yzKdV/6ۭ5d@^*M34ۆw:2qEM&TVٱˊcNJ]gwVQ;?,ˁHL֟y{qhQVдy!EʦW69i±VMk]XFql.ͦg{B_F{iM /c&]}3m{Үz%ٲ ظ�6. $@B $$w!C  0 `pVoENyg^Jfg/;߇Ԣso\^42hEq\MƔjcZOi?ٔTLyFI۟3<-\.-+^"2Y%ҏ,i?X} g:8uA+&CL?G^TH*kJ8M83Ędbɲc#%IapRI!*Ui*<<{1B i y%%2{9\ j<Mq%g˘!B)xk*~J- 8ƶ $Cfuy"aw_Gߴw ;EQx}QR ]M,繜좇NVBb TrCXB|pǙtH^@c$.e:#.ҍx3K%ײ IF<߾n g*.49d ̮q]rB:*8{?ÕYƥarYC.naUݱ<FB?D\O ^%Er-C|1wYn>w_STiPU]_:b{ʻ|Üqff$<!~-m'ؗ[t>Wgm 9D< 9eiS~'F5Y"kOƴGTҠ&QLYTedcJu%DQ%k5QDzkO\^[uke7+S=SbI_yNj4IgUL+^S.ksdZQ4Un&/Vc%5W:2ucqqE2eR 덎?c^*ɽ֕4 DG4͉e 1JpY6r6?˾)P+[G r%U[==:VɕIvHVI^b@Kdܬq)1rR5Es뙱ouys.]d"埦uT&E!6p8 J\ݠ3֦%zޖWUu9Ҹ:ɴUXu)sJ2r4bۜ"QQsD=+B^ g|' >;s1IJR5g=N\ r$J ;G9OsoH>xmOMX裂&C~Ai Co^8ͼL"N4 Pm�SY2vRMh o~ 2;&C,Lne7樭=sW_Jn ktlX(iI~Lu|ahW)>&gCmsMDx3T:<0 01P*,tfZxZ=M<&*Z<DN x?"}Ïun}?d. wQukꐋI.~f?|J G"wINKss\es6r4QF݉+?_+^Uci؆ _kE^|Iw]Zo,iОsMVSx̟%;˚ӞvN,4cETфVҁVY@`Ɯx{* bs^jUWj͘'/6/rCQK,uXBKtV=RJS*[ ֜;vn^=qkmLomxAw}akɄ̬NYPDb\{U_IUfr-&U7,1["V<Cw"4l7P,{r3Y1{?�� �IDAT%f{G+t.qROZ\,=<hL]tuFx\շDV ݕ[Z2<ez*-7Mdz%5v83F+,8+63D٘ FfkQݬxTtDX6|EcwW“-1umvt)y]Kmm`cVPugƎ-N m^O>՘w|#XX38rU ̏BG{r꩷FPp}9SΉpnMǹCG:!usi;76YCv7idsOSE9R8\s\̳,u4N<}\^גȆbJ1cd.H vn︔1!v`mSCЧy8A5lS7[zE:̆0R ?={TZ w+C'}+3q52\.2l!d-\"~Nq)r鳰RW>FekH6+#7°F!? yZ 0KeHĖ i,�"1k(+n# |1 9tOm9Ť�$n <.%qj4 ԺtDWB^n'^7kvϾ{yǙ C7ZW/\ZtF4W+(u2ʼZF}6[QyGWmR/DJ\ͬ-~bbǕF>lɟʉιx.Gj .QomW72%vNZ-Q.39#kNӬ~Cd[Oiל7"7L5}ES]) z#mZ^oTaeƎZ֮E&dƄӊDҊM,rKGU+4#,t23M nC55&"]6uJ+*Zh 6ٕҖxSëLO̥{d5){N+*ޞt٠aqY�dOJWIVClͪrBE #bE^Ie]|t0ВJ+\8y/r&3CLk䉬x^<aoSn0,9<ۨZ(* >^,/6꡴TϦ[vyԢS%y2Mz_g_A^fxS&^X4d9$c^imrY|8Bѳ{-o);nxv:|.2~}! |s'석Vp?-z3S<?;>5$CE쥘8I?1<w2bv&^Ƕ7߼&oo7 {2*` >r"(cwÿ焫m/Y9<E?M$#ԑ,9HjGle5 pTr/sB5fMh' X88\&PV0ٿFU Ƕ?*�YL '`Av f24+Wẜ 0x.Q+y/WfOq&|ըy&l˼Jt2%,𺷤%+( \8|SKnvm\S}m/XyN/zeyA3\)op4jUp6;rq(Cq515*gyWgS3s^ "5hTD$W?֙9\oQ)nKz TuW00UPwF.#NWq HHG5lWcZ|&kLѶվ1սǶ/>mIjWװ-yfe|ʂՕZUwКk30Jա{KLȌhXPaE2h)-5`xy U]k]wT #YȬY%+% 55f+$;tħTuMk_n[{xdNY|$"T7R٧COJӚ4pyg46\TC.+SѦꔦnJt.Ψe"}gKh t *TZhuq-R2 7+Im3E8y]jj7.C3fJ4%TU|֣&7 x#p.iGNț9ǑK,fuT\딅nK۵XO R^ 6ˏ.>S,aaIijYVʺm c` NA[k!au;+Y], 6Υ#pZfgØYDIs1ǶP2>߄e*ԛ X6BC諭=T%*i&Evzzy0x,]ȅtG *g.iP.!L�orMzL9MM8!LIHTdg!V\~s'u4ExG`_1H [õ,4y<EΜGx6ldSnqvsq\C%<g ܥ!ܐ20o팳;}?:葯f$XK9iiMtGdwzU|?=ogghfsԔK"()ʻaOMǜjZ"szVU⬱r^H5USE6Ke O!c7z@˹gv4\t̼2ieD0إ~ʡ洌i ʥL7 *vHei$E "1) UEtNٙƙ "qz^qW+8QD$"Tu9FLΊO֞VܥHhD+7=:h*LGȊ{kls&/HpNL>.[mbB]l|BD*X&L+tԪCέ1QnXU:A?<+1%綘8c~FɈi05IM"96<PS|шHQuO?rQ 於,?rU9-Nd]<l]Dڲ..S?ga9?;bv0%]!3PPp`EU(>#zW98Xi0}^jòף]tj끲@)K"D<$Hg^m~x 8XNjApu=}0{9}<8n>^t_pطSF:)gs[Zpx*,egx/4AnY1_ T]!c,QXRpMX׸8<'.F7\[ϵ`4y|9y(2SFE*5/a'U敐MEa-ښOq%ϡ }Fֲ~&nk=le. o^f;%cTU\r>GtP~ L[pטc; P@g� ,)zx'|3z.y+԰3Zg3~G]pȯ. /r\vO}74º## Jj{f\-)6V:w)1c.͒͝yM:ÿ21::Vn9¼s6Wk(Q>+9i2R9eyW.)]dF'690\Xg߈jU3qz{e2ZW82.̴U^|toG]䂗}05ȏo[QS|F[tDPjvRuNtkuXTZ;լt̜y^?wS d4*LIrk&*MMPmΌMZTRUa"Ck1k~黩;?=_OBuK;eK8JFՕ4nڸlAkQѫXu^;#>k0{ӱ2 OmuzBNJ.οzoͶXqud3ؒO9+#V.W5kYf}1S.tm)sz-69dNutM9 Y Z^ 7|9/x`f(}ُrxGpV1/AWGo[9�dexʌ�f+N2VB7s|ZC]!iH8oxÎB_>106䓡N*aXJM|/ \�dRc�|P_jRHVYI%plwFBpdT+Y^>Ëa%*+/v6r?$܁ NLpqޏPuxM}p9s<Ol*v򾈅~ڍ|Q{h$ z//a=MiEFUr'W/|,畂&4?1`[#=:a1{cip%͹|$oa#>ɞG<f >O݌DKO|G={[b”oQBd_AO5?>⦱- Us: _dW%qAbkR',s]-Y>Y!o_I윖ᤁ))GS>]/p>Q(+#zoV\f[[V9pN)Ǔ.m5٩eFu^>`mI .2 91nӹ:41qЙ啧mӼm.9_]ucM+uwڱۼ\*U$ceogN<',D7;vL݄li9)eRNQRVnzP.h7R%YoeƖ81eט負^?ia,H+N+WԘ1k^k9ϫ?b現SN4L)ƥrM,Й֣60U"U>dC0t\ctJ}5ZIf[Kg?w_⊟~ŋ_<n|jwA_fӗO3RGrm:2)vSkE]Ч>o&>!PR#ΙPug=7 =Iۜ5g ToeRG֍žJ9P8Mm Vp]^| UtG-?|{%fwm~gp)zU/q6X:NwbYĈz8;F(V^bOZOχX̵es/LB_|/y"Na7<1JwkB/a원E|L Vpz@x i>߮K0Q$,燷ZV:{gtPcdJ.&n%mQIhS(It3eכ\&~^!1=�s@L} X k\u]Ī/9$dGHMV긌g{H+䉫u_"6}4)- jO%}r(ş<xhr+9Yfj"N~_[[{k%y0>H _ӕs ,Ș'),2ьӞs奚#&#r6G1?5g&)Hþ6\[&56NJԧS_*1.;NmL}m-:V|CU4,*1Wgl*{>#c >}wWޱtdbz<x|xIű?y?H-ܡ+*_kKGddu3Vn:&7~#V4 K8>\B4TVHTԸJS,stLITye-M)MZb '&DfŊkGYaTݐҹ`teo#"IMjRӪg$芪|62cf.]a&,Y2<ZL_;Nf+ekk+gw^23U<ivhd&`\sbJJ1e2^=izI<Ity[V1Ji`uyIY7E m}^B~DTm\=o7^r<qbw1/W jME(MGyrx,1xOs,fe sPZ8L0,Pb;H8rG9/>Nl$+sW(#d URs 'xz/,.' Ø2 ?viXW,�ğ mQg975e qN*i*lU &V`,} '<a^$˅tQB҅ MS-(!/~+ohO6erOhV,h/PZ? oxGíkl "$Qg�f~̂Sl"Nchz2o_ �% 8_ yƅH.jiLxYb4[3nSW`J^*On󮿍ݿ%pŚYz%]FcY撱Gr93GU\{@E̲@E`bZj )鮰07b^#Qx^},?pOųN9SjEUT&g;:Y޶a'E 5y"7nCgN嬑! &LJ7JϚTiXCQIqٍ֘*QTmL:+q-Yzy棙][Nu_Ίv1-sJ)EҳJNPSk|U贊@4+1_V9<tJe9QAq5ȜlFbFM)=}954.33]w"Zc;"vXS*Wc+,tl\CK7ѓ+F{[k2>h. NS۪{%sbR-qX>&:n%QGF$byY1wuwxdUg=_>-%, o[;%;@JkD\ԢiƓI].doO5'u]kUg˘_jۜdDU꼽QWɄb�b_+pۃvvpaѓOꝎ53qe9YMWr_/H=|j`QZy FYO(gR bls^./pK !n>[/SF58%3ȭ0;(ɯ%<&m=aq8l'( ~g%?_AYvч"!Ac̚v̄?JN28q2vD Ny!r]8| ۏ7$5Syy94OC{οaKHN8o3& hh?<Qxg=݈15YQ^b)W"2&'i`%^Sd( H_Ov|O2s3Q2佱=rQʒ_W/<e-2\Z@1o<ٜvγU\`+\4V4~Cv]g-˘ ,AZ64>+<Y3hQEi` c6f@٬T`&22-WN׌rursNYjCcgc<iꊤ1&kǜjbVZSCIȸySK<b6gzJUW7=YuVefkn֊ /q f6}sKxb]U&OY(33y[Vhw>mJd2DU Ֆm60T4ϙG7:׼y4.1Sa`ˉe#3"s bՌQ>Eܪ<գMIfXpPۅ$Q;*M3ΌQavJyʜiF }DhOD<5gzh�� �IDAT?ʹ93P GIrΈ9svELF,՞zιsF ܝ4m ,Ⲉ'.@YV07o+1畚HFuDUt 78'e<8e=-D5vԬ]( ΃eMgqj"<HfgEH@d'7ršB*7p;ߦDۋM[aK+c `'u, gs?EX4Yɇq1"$O2H4sEH[XJ?!�#E:*J2B Xa !0^~;_|3C5tno7֎1SX6n ً'BL%Gp#na :t885<4sv;x&i} ko0PH& *dl   ~q"tU0üF>.S9Zh8跁;XD8‡y.y8@SK?+ su&밁']w[>4cĕG?%-Mzʄ+_=6ȡI/|(~q$̇~?Ra ~hǜiWlg"Me=( e }S^|=㺄✟qCD/D9"=5!Rnx4K֘R:lfɬ*V7eiVo %NU j3v J՗jh% -돱׆s('_+v-TI .x}+8`}TD5ۓ3:c%UƗ:3+LiVc~B6hB|=S*3f[9pѨ SYgLjJ唊U%Uf͋v("Sq5 43V$@W}};4I7Ő|5ZHY5];%Lꙧ4ieTKRϬ؅NM+>6yqֻJrݙ`w,^ޘY֪|HqV}�QdSY=&֜?k>3c~2,g} ! Tve\q&yWQ(wDc"qpXμ˜s~e q6D>6q,z0zylz,}<{(pY~A>.V<Na'eo<!�]̐UxDsܷ^ Qu~ɰ PF!eB]Jw3͌qU7LFjk߳]4?~(ag9M)BQ:Di}O 2JKP^ [Q G͏=oW%v<6z$TxZcBg}iL4<"ɅxiB\󽼅k_qRrj.2L)o/<rz>6yޑLDӿI|4JN}ZL5zrH73 zJQ?4pĺCER[!ri̲4'c-Y)5+f,>%Gc6I}_fgdcYԢ}DƎ9g]Q_hQX{XKdVE2AV}9O,NZy S+u/Z4S:I99mWzX&;iqEҫ5ґf|yTq5RHͫ,{QuHZ|u/3rv8O]V-H+2z}f9lഅѓ*)I̋vYSec ˦v=s{O9.k=][cxD>kOk;%.3lYф5:h::{ޛ%˲dr%qBB(L(3gaJ8g8 �C C 9ۉ{%[z>/vY+YkI{mI뺾W&%/uzNer 1˜55U K +`Eo~2yUcy :h*Dhs])tJNeMM:p|{gA bsF]ϻʘwF{W/xWJo32r6P^w lcry4f c\PQqJ{xRGJ)läx;4Xŷ8[xKE_A{ܛjͼ'Z= r?)~:dtEȄ𛸔jp&UFRE[x2YH,�|:j~̑~" 8ë|<Oy k[KјY]d0tpǣ ĭ%>ʏ/ ъ9Ghfժ兯aG8?|+T[}ўzy׳o*dr 965_nb(;#^"sE<y pkWȓaw,r&P臡P6<Xd6.0Ԣieg >!p=+ccw. N}h!p*ӚNʲ¤N4lv^N({SҘȄe|FISuT%%47?VWZZ[l\{qrI#g7s e&NZV^"=:)Yݪ/T}XqZٕHҹRgwQekO)K)ј=nyJY@8|ZU x¬Yl^x=%Ǭh0:]o՝:[gJΕIL3* [PifVň*3E2jfTUSqF%O4!w]'UYԘNΩ0۫uNއ;8ƚ f 0hRuVٜ!M9 Fۭ{ʕ3*&3˘8ZRCe`.Z-,*qQ֒\JkhAE'-nTu<FL)K5vƼVEJONm5Cf˜-z/CP.-t8歵&SfBб {l?kg-Y,į[]v>ZtM!t8i , SGOpy$Y·yWV>/}"m m71K"DMne]v:^'$$Ɉ3ԲHEh5_sQ728C%z^%,5EFM&8҈5RP x!-ZRY="guQ@0$NEzѮ/:ir-eU[h׹> NJrD;&vp4 _"`uAY6QrjC93IxWϧ^+.vֱm<EGyQJsG-j)4#71 gn1}ӫ+W*iU >!vl̩n]Psbk.rcܼhi'X0X^Q95Br^dXx-T =suڷ6񭄏\3_#W!?UsWk˙ ;/Mk^.}qѹJW4f*4S3ί0?VXT6AEF;ӥ')Xx$Ħw8T_`MRUi$::aEx<\}tQML4 F5+9jU+SdlEf1Ԑ ٤=dͬA-˝(M*k1RzRW)5MZ܄zc`RMdL5qzc9jS9b*3՘6U*SŞ9#͗Jjn1xsZۜM+M)}ղUc*J:jI9Սad]Z)QxDhFCRbDYʞjYecN*eFiVrP"Ԟ?WZV2dxNgLUޏiZY}HI\ź1m75..m͑Jflt>*u{q�231[gCB<=}8=cTDy%h99T#lk9ěx$ؚ'(7[)C줄N.qAMdaQq;#dE3\W#E EeEm c'y[g7Fod"*lڠNPyh##SlY9}\ «,`9E h1go{%Іr 25( HG9,]rvFFDuy_,IJ8Ґf$몪E#z %$ %r,g4zGQҜ%iFV\/so B- ~M,`+Qc_b?�l湜?~˵4b$8l _㫯Z] <>u^|6mV^NjqאCui5O9Wpu}<N#,?IRR4x(n6\R{LK9:@<#O~ K77c8S_dȹzebY2AX<T SYT꠹%rOeS5fE&zW^o3̏_&^<l +ͩȋc\]J+s*+ 6ϨQұrsK/T.vdFf'XtLRY2%zr* ׯ\dB6'1"PDOJ霊]DtdQ {md_RySG7l 䤲gUHu3["Y`}%j㎭;zڂ&sJ; Pk#Df\m92'9MZل e}mgMm9wN(79Z+a1_v#Jo*қz9 ˻Kzy* d4;txwif !f&c\eC߿v_F&Hxg޿.*BE\Ϳ1=%f Du &1'q,#]RNҍ1'� Qi_3Oqddy 鉖oqģ1f.NF5Iw|ɨw'9�l -cG#f~Vp#<YYEf, .q"ŕLf? n&Ǹ\ V<V8mb #g9rp!ڸS\·Y/8Ifng5;Hs,4;W=AWIs53Xt͚�B"A9,ml8SNW-&4E=,a˻ HJ{Z M>/y,|lloސXp4fL&F}n߄z=D?26e=gF7W S7ga(ּʜ/m)c.];YF> SfƭI缔1}^{)l Z6/_?5{ġ25fˬ_luf{|#AϨ4muAg_u"&5Uy&9 UjNZ*2^˟m|!?vg ]fW9ReөiU9_2'G5iEz@ k*Y?XݙcV !סeNht\}J3h"ƚ ΪR}=.]b~FjGfT+SѪF} h4hd@ˈ7)x_bwwtMX2b +=hmzZ~p|M 5yZ-RQ+Ӗ͙+G~|In$Zb M@{?5બWS)N:;{ܑj %j-k-gɚXKMV[NW y-/}+NBvȸ(ᒼ`jKfv狎.fi8+{_tΧиeIT!~[)зC6T<F>n.:X[y'MMy}Xnokxx f0rF)z^Fe'őm3OGPnYfv*ۣ빝Lzh4W<rJffXuuUոzp.Y^|^ 9r>O 7b3MU$=LMԔx#Qi;\1ϲ9n`1(^%s4F"(/v G@F2X3Q~Ŀu>Bnp7o0$\8mťzIeĤC4ga̛7Nڈ/. Gm09y椮q=,9M8+5RǮ.v]h2yUT1JC BX5&JXGBe|c*&=]"KڕW8[wm.LyݡusFf|m/u`{+i(X1'vFE5<0jv)ehXgsVK9% <亸pc%zrk՞lj[4T:6O*T[l|Z>P0;䜊vY[ifTìZզ^m^񴪸c\`x:2ݩTzPKI51ሦ/s2VPrWGXqu9E1fYEZwјk66=cA뒝?rfeޔ|UNWbbJPf~uzTVۼ X$d<X>lZHͬٲ^lm>sPgL]y})ݥFsCKb>U[f&-:XGJLkP4mB\Yc^k:nqdh0|͞i^ =㺬X9fB_x)tUceCmiB'y_p`Nip.ӦoÑ-SEN=]d%ia)7 V~~h#mSRDU븅[jz (;G( 3bQ0~{-켄+`Lg7a8L[T`K#A~rg9΃*gysɦh?b/6Pשׂ }pՌFI=_B7L~f}`Pc8GIY>Fmab,Y,t:0^I%Ŝ^q%UQoX?4'z|hȼEeʅ*2i䱨 }|աy;v$"Oh&,(! 1u߾</:R73sz"$_U[1s>Oe*KY2`Z1;R_dCqWZbs3)UbleoY1fV\iÍTէl@5i+*t3W矹bhѢ<Img3ޖfʥ:YfxHSѬX^L% Ҫjv3ęWo\օέqhVE<Q0|-/^4v TK)6d+~ou2^˜ }̪(̳Q XN|^q\fC/U|^cd"VU&5Yl~F՘P+]Z7zeVEsJ' >UTiզJgTe,Xgd|//xNCtibK&.4uڻꔪ4j݁RT )Z4s9C)S)*m,nH}m{f/i*ބZ BE:̥eRrJ̓:ZghZQZSLyhF�� �IDAT0TNE7rM KcuP+e:/iLʇ.ל|l<<z ڲs3?Q#M?lx16*#EYLrqIy4j9L7D'jy0:sf3:h$ݼIN�x$:FZYv9GΨh@6p /b6g}<HXR|MQT`Գj2jx< #唳Kk">VWnm?1 e:H2M좕~~r3S3:v=jb!!%r}]Ng&AE$MG?49y{ h*r{9gUs 8?q%`|eEemx9-J ly1:9>t{=<Ģ"1 ec. 3`zq6x kͤ3ot+& h/O׊Z W(i r՘%Ŋ4eB1+BC5zʬN97+Ik[զ82OjFiKm'51'-Fͼb7mq[^j}̨˩\n\k_XL)Yc1z:MFYёC6̪*57LtI^jv4i(8w[Z.VQ\fB=e]$;TzJujmzuspNJ4ԙ7miVQ\nLb%ybpZUq~՝֦X]otJiU$;LlM%4w-WW?+jjvLk&b^F,|Hc s)alwbKJc2gW5LiIeؤ3Y+3ᕏt4K3bnr;~skHl9P݁lKC *-IX3Ĝ B)jM<Y,H; n WjoM(͡w4<䇾|+B= L??_l`{ˡ?FB#/XNq8!MyTZ>F-L H027`VmFv.߹5˛vT$L2~y6bR" GV2p#g_;z-g2oid WxۡYiž"j?긐W#*l ,W0’~+z7dD?-'H}.e?{4r~ks$iƙaOru' cq!$ęBe&V 4F6~I8_q/*1 >Tdvs y; ]|?XR( U1%qS W:?]p_ 6a"߿L9l<n_f,GP,k**FBw?Tl߈Մ-9Y Zvf=-k[VRq9s^-SZܗ_q_W?9Q1oۏ[Qc2ƕ/hjԂBe~X@Tw> 5P[bx-e K*7ʗ+~{u ׾C ST7Qؙ 3jR]qSjN:W{d ԥ:gW2S*}Fn˜\cjRMW,3%lBCoRZTHi5ѡ\Ԍ2g]2)85ZUͪ&,sjCEm^-bZrHZGZ:d^[g>fh+xpƪbPKw:?#cpڊ-yʢ/T9*U4'Y*CgY詘Pl%s5kL-ܤel֜q.|syBW OlTlyo 7?pC.SxS>>tKrW[ҋX!VN}Pr1bri}lbl+EGM;z3[)Ǹ6rLjs_]l`{rI-f Zf'+>3'_Y3~\l[#Gȼ.x]p(4w270Z6F;&-Q|H41XWw뭷mdYDޫ7$*z#_ʕ;^`w4 >(G>εb-? \oAȏ\<9U5cE4FxX n8Y>8v~J14-<S,cW?5"/w.K'akՍIBK97]X?[ VF.R G8%7<#+UPyL:m e#|_9yslHxe34 B7wOy,4u03ޡzy'2evYWdn~:tWNg~j//hqwc\tX+Yiu,,R9bcddW;|Z ^Ѷg7?W9:T(V$Q\"=yJq+ nIcaﺣݙiM:=e2aMS+̦;3Jjs,bϜ2rsz%&4[mhYS^&9*&c=ikPiܓMj4K+i-]s p$֥:[,g줭:djǬU٧ʂ󜠼S.o~lg7>PשwgW?ri<]_?ΝvFBI~1n;Ț1#fUN>Xr:9K%efrioNNń罅 nyc1P^.)2eFu(p! 8/nIk؞O̽1 ב L(1|{xO\?\K 8ZK#;xn62!/y#}aG4'5`͕0n~Z =QBE|ysdVEw<4'#gّ`j |q-$a8G<P09ʑb !rߏ^b{<M|l(UJ/hPFQ?V򨣹P̻ z{qdh縄?h\ Ӆv*ӒQE3F=בykyCn&OE<՜+n^Mc)$!n_b'5kOqFXE7],asUJ Lr'9M<"vm(|k = 3晉\ͯxӊF]|;lkuGmDK]$5z{³'>gn?d E+]\$2Ҝɺ#TR,Ł˲~> {>"JsRGVŪJaų2S3-| 2Vܜ#5lk2ѣj3<4jeB3kj6YoGR-KL J'FT*?}Hʹ*"g|UˆfUTԀNTljFќ^1{κ=:r؂`\rJZSHo06jBpJLlCόʴfCg-ƔSuI/0/]<U{i0;M_ sCa{mI*_p!V.Y"PswM,/T~V8OS]]:RN3Z5gVrL2fǍ'S'08z2ߺcK~S]_Ԣ3>nɪHHL*RcӴPc >-@W\o^9<!18YL(i!5y۲w3Dg[g-/?M*tW '| +p;{X1Yj롃en,;HbVhy11ϲ=<;8籑Sk[Y.-|?3yy#CgDO-|¼_1wgh09N"05phH.: t*x04cnl "ҡ6En ]WEZOM+幨 {eQetFeOd_Ym7W*L>N ۯ )gET.Yȅv2 ˧/NDZAE<Flj7"yX3E1Ou$f"~r; )0c?}lf.s,fN~�idjs:Y6Eaj]Z/"kBʭ^8F7yv>PΗ~W|ǡ~f㶄? Ɨ7Ks˗$CƕikUO7 *XhS1u%cmhWd8W2SnoBzJbެYq&.מ8:+sBc`v\*t>jR~WӐ]I|tk3J5UiZl}F|{4 ZPʢXC-,ˋ+NdLMS@ ]ؙ3;l[\.+APc]-K֘:kFeE,\ǒrs-,Ќʼx*3덏4[$3t\.WGV6LFјZcjSJ$RJO[2`aUo0܉aM $}]]5TK$^frG]0Tͼ% -7d\ '7>hє^[Zm -οwm߿yFPf]=[R?f=W/VIxb 3.hTxH+ygtiuބ B"=ޘq.TV\-ckʬ? e9%1WLWwwR5kYZ3%PȅNӸB'xy.{zeI{BEܙ-zcg]�tO턲G9Gyͧ#ٖ2gzi᭼:m+c9Ԇ%I}/gnru<ѳucԐw&:WH*h)c==GXtVGVF4jLe4cqz9;.`LPCs\1OrƸd]Uv5%WsaTjNp1)ƘO1 W1*c#mSG1ODW)6+w[ye]Hz@NED=+b%>fIPG}�Ȃ:~g8wYdOf]@?|u\hcaO< qfGxQE7EvJqz*}pu˴OUTwJ; :08,qQgQ7pa$@dI'}߫Q9̜WW'}u!r_gxΙ`n/VEPӞ XȰ.K=u{0)\k}֞*ɤQTku¢))īdi3;/ivN`Zm+uij+ZhiĴ-L;R~ Yٌ2ZCqy9ӊG4OKT'I=ENVIi*1;aPPixX}v]#N^3~&ƚ̘dQ5:'TOJȦMQzڼPȉfU&_ta/Q\gP%[T *MVS3ߩ^- eRE\|b"j؜i啦&TLNɟ_cPlJ^W:XcHaku9:ûEwQ{KQo"}6rxM =5bH]xQ e6ըX$33%+LVto۽NɌui?3){fLg펹"H_haՊbNO>fm w&Ϊ:G\kL>.o%K1BSkCB<36UCg,!}$orV1k`r=~GW`_)W4޳4ܑ;bvkV³tb.Qb o(q%%}rgD]ƭ PN)/2E/%:b=r.?Ts(2q ,wEc<OE Fq8J9oH^.0d85SH" ƽ+ m"@wћ0vQ* UX .OS 0H#וs8$;XQL׻},do|T e)<,-QB gb ~c#R 9y^afq OdLL�p6(`w+-C'5|s w%_HkiRq 8C;?bɷYEms?ۛGv&$z64YG&O23ܟ{<6?z$aE $瞜=܌)@?6}%kìg}oƲel8ڒugZ[&rޙ6Yfmɺ;m9UMqHc̊@cܒw=w o36d^S d۽~Зf50\=C3YÉ5FѴYWi;\RcYoP0WWkԞ_1_+Z1wJ2r)廜s(QWohJB'$Oפ"Ϸ`KmӵV=}ʤ+3`pTMnS*MW9=)Ƅ]Z\#J,14+U4XzD](ۦB'OXԱ.8de޸V^ۯ]gѥ:b%ҥfp^iYEz99qʻ͛lV3`JrDzծӧct_{]ۊlJٟ4i9<*@ܟ%_4:`ٔ$]6.T:}:0wT[ɘƔG2%y-Y|_|Ft.t?4<ฐ-_5:\Yr^]4O_P`O=sVsy70r~:2cj&y{׳N> _fY GY§y|TOr&vӑ^\r.u6u\*3Ĺ,Ҕ DeoӼB?e y9ā;uN3bvFT(^3XeI2ֽAuq.%0=?kkw^) ZiL޼,'`{~NGpgOyw17ƹx0Tt\|.a~>HM‡C\*e7Iϟo裚5w1]sx2qXƻ$Wa6o/g>WQ"Sayp#7ÏMrWV% Wd]q,o/e[*CCyB_ |kirJ.oSlӤ u꧝ rRMلKG4rĴ*GXbLJRk̦<{3}kh~LYDRj Sk]qs4;iCc҃.r&XSېd L)oә4Y*(3p}[X9zTK65B &V:8<g6U%OXTlVr|VIZq-9j&}kVQctZɴ.suV61ߩV{m(5[.*7=*h3 ZS*9SfU†l9֕H^cCU&5m_X6s~0i4Zj6#ޢo@c ͮpr\r:PZGg|a֍g|7e&uPwLQg[RZ5o&YPut>&ȋ%[Nyʫ)tԓUj>q aO~^jɐdl \I5/ȻZXMZ6gpCo(xs/XU1J)(ҝ?�� �IDATsko-r<03?sZ~C+|~il)vͫQ#?9qs-Ñ\cb~5A&g;QX`^MO>J1Sȑ`?`']Hs-etr}ÔA&#4p!%ݼ)"LK^g^ncWD*HT紐16VV)Jh U[wܶ+Wig,|4m`![#BkgO3\L!B"%ECG[y211?f_hyföHڟd3WGBdrdy #Wj߳s'�?f[C heVḨ,e)ل sC8ʟpZeqx|ϕ+]aN6N}͓77ׇl̚Z65{rmZUdN/A-yR҄n11KTd|g!S bUN9H CRXgҘz{陵ʉ~Yg)̢c6+ꍤ4,,5K~u)n՘2=a *J aм[*gW=4.?`H}u7/^erRePЭ-i|P}xY%yuڏYVE2qB0UBL*$._cOS^lVɸ UJ&U(cGkA^4C S-hwV"&?6(`ZEY%jRN<eך8׫Eڞ&PTe:M\d* wk=e΄R ̓Y-)ңYKΊԫ3O#Ld:;vXwؓ 'Ue#U4ץ^9Y;6fch*;B%Vv)θ'mY vD)0P_&/ .WjlM'Jc1B+_ur!d3N]yУ9mԲc  sYvakYS$O�e sI"BeJ_Xu;XB9ʻa-0!�Q_z6`/+ag8$b 즁3a#'äx$#l#@=)ZLyHrv |k*9 s3[#ZlG̤QvZdi=`_~\6EFV *@P.MP^yLAn,u=|u-<&^3\@C=}l"ZC{ɲ1Vnesy7Opzx \90)-UngTUyKގ9<ĹNؕ3gܻH /~ZrNt4h~ѣ,%ke`UYl^m`<f%sjB?˺&5^uF=UZPPS>ƪ@K\Q7'r.6&-3L &̷͛W'aCu35U]'5J'eORꀸ:cT)I+IM)SqSY- [neeK'[&G߶-x:Po5k{5wkM?ǫ**l5wO3 4(d'm t/trK6tBD:'VRbK+L͋50]"R֬lN|Pi*eʤ:,(`4[tV2LN"Ryoߝ,Zx>g *3ᔪbz}:}ĥNI%bg,:hV)7Ҫon;Z7[.,NË́4e%&C{26%yRl3a٨d k+5#FO^嬩Y]1+.g<O-6i|)o6,Lɪ`m.཮^8}7Gޓ l\{_%\5ןp"fXľNVq6VfSod4+D~$h'c'ohr-bgeƈi6Lcgm˳Q4 ~mJezEWU$>\oxUhtr6p. , z1,~cV5NѤz~}0*WG0IFNq?ft 33= vwGtkvDx9Ş Σ2zG+ƥP__*s4⯿<:#o,CqN0IXq:QN~gi4B((Λe/y;i-ibG9:i'Ȅ{Gsl^P%Kd^?r.壁P>g7%Uyg3YHt5C;)Ř 吝/7΢)fl[;ꜿK$; F})pnh{`zޓ~" ףxXS򤱸[ P+Z 쵮@\fV2%YkGR'˕)VFVѢ|^|^-k}{RnI_Ա p,ެoB9I)[TL8PÊdd%M*omF WoM)o0V Y>M3bŒbiU&a#X^5ƦUm4pIJ9u5谰ӮiG?}g_8d]:925mq>G [^$l]h32ErZ5 4_uQsd&dƏSmH-uzNgq(I瞜Mie2lN^]ޅԑ'17~ ~uq r4:?p(hgíEGudXP �t̙9kWLs{}X_Bߕmؙ󍌧x,$,m&F|i\e&]NJ .y?`bފ(p$"a%0K">>vl9W<?<7EEb4)\ISb.v.X XƵ|8 ;.yn 3An̦x' rbGdd!'`mD w<|xsa*u&:*yɈF}C*i_cj,[$G:G#gL>H_eU[�۹S7"6sN5g65<xulx,"dvp*D(f Ἴ)-rSWx8 / @h#ioa_+r5ɛ3-|G^.lkY;+3Ľ;4T܊ -NXB̴c|ts~7yqH̚ U+ %|LVc`]BcNQ9#kh>_6Vtd^Ë4Ԝq48Z%&Rꛌ4>eaL [Ҙ|:LYSңyc5FU\xӉiL~k̑˥$5?m^2`nJ;.s4*Y\S*LZoUazJ/;o@CxY%1\ZgxcCc8qJ2&UN+_B 5u8Hu]}ķ+W?vYi.ӯ[2,,=hI+VFgZI @cqayHQ }w|wgk~zD__z?}ׯr|<b'/&˱c'Eάڅc:<:ץ3.[K>g,른:s ųv0y-Sz>tgl -dUhULQ_Hy!^+\`PwƝƭ sfYF?~P۰_b+W 72vj_G;'ZOhYOyq!6(򱗗+RRz<4Yhg籛89)!{C^eaNDs1q9 \LWRiܺ9acC&(|I㯘|PXw Xm߼U33fb ʩfhXy%gy">6 ^e[4uڙoы&4Dj=!?D\{96-OC3<DL4qQ.D {9;jh1|V\<u<N.̛|)lyb|:n'_Sx?k_őpя= kWdoO3!k= ܒvNt&Cgt4�Wє14kcҔ. dǜǁKJȻ;t9 F\ʉ53jrsg' o- G8X(OsTk\Vwi+ZnhH:'UTnջ%Z[t7VFj\uY%y3j#_+6/vXU"FУuRH"`x?aqR+ ~9 X఺RVm<LVqK%ѦIB6,;-cx(6Ĕ"|^-%f4N+j;,VPPce]Z͵/yͭ;Lʖ:֮󘹳|I2Z͉UfPØ|a jeV]^%K|.C/?|憉o _| ?N朼SҶz 7d}&z=5dĊ]ݧtRЬwԧBqOPɉ|aCEYUا*ZUaI E6@MPM꼗͝RZkLo/1_02}NPK)C#k ?3S-J,:NF‡ B{6N?C?x/KnaѸ߰*ia97#x= K2._SJ=9 #.Us\ʹ</GA$H}+?7 4$pkHO1E(d2I0Ϸ|%r4F۟n|mq[+WϦR|"0h ={8S;粔NL?/R7)~Cu:7Fa+I`St+ H>jM'H>^aie <n%gXFN6.%cC:""^G[n"I JS̲OR8z}F^ ts1#!wIml%5Vpʞs?k?XL5'[ Xxj>^p-rٌ#yY:w;gyo\Sg<ąL< PZk1%}.GCQvBkNeܹŷoow>o{])MMȨKJ3Q%YtiUOTVCsnUт[udJac.w$/V$;>.?w?{ɵnlڣRuxa׭h(QVb6+ѯqjtW29.Y+eR  mR4s:ic[`VIeR Z##f 3IRs 5]%ҭz*LtX0&yW tkP[.嘚 U&weRE{35l;Tİdl'3|RuLN|9+TIǿi=0.68k Vg¬֜yX*0?bqBO]UL{k*b28/JrMpToBSqwqw|3p.^Km[͏69?']Gpfv,![8ĶХmyNp}\%V/aǑu&]z;Rg+y=92~BwVujG?'CY Ti)Z#r<G-*[XFL?Ћ^6R,"Zc+9Q2N^p'(%e"UKRIs(2N髭ۖwjG*u ) Ciܯ03,, I_UƯ#Z9 2C_ sH6zaE_(f> |x,&d媈\pssL/1/2.`̷qQq:xvs.;)"ʢLr|/,?fWS3COWCIf( ? k˵ Op7RZ"^菋= GX1M9M[܆"<r ͡ЗóQ{Cy3.),b^R6mMO];:.8+/CPފrIgHyFKvN?vδq3FTΚ_3TedOP5HVq AVI\A2^i@1Ejf֍ _EUb5aBP8HTi\Â"S{23q~9i%3fL,5QTj uUTIK5,9NH+N1sMK9ҧy΄ܬY%YE#j{5wi0 +v]g̛UWoړ?VmqNbLdZbvX8nYF.Qy LThwjLohQJlVJ#2sO[b6!kU,smi˘TZpTZbq2OB8SY#1-ޜǩMXH*PtE3~Wx>c6v*Pm^yؔpcX?9or^=2*"b}VR1*ɲ)깊Oy ^aڙpy=5#h=qD,7ȳH +S q}UB+^9: X[u0?BTQI43ʼٽj%e7#ޜ(bWc5ZZȳ9A?~2|0D(!e29LU{mw\p//_ aG5NnSџ4FIIV#2h6gwm <�oRu /yL@ڹO"k9^qX|ϰqOFnWQY]ykn8^mMfxoEz#G.em@-9$Y宎J6zn;pQ1UvTzKޛC=E>\wnKqGKr^I,$ẋ].6kiM>S(tеF*' 9D=>;sOOz[FshLY3*:$&ԘR3hNŐ댋u+OPu#%OM=ٺ}QP*G'<hq;,8dENd׬f˘d.m妋dZubiŅVLBdžZ#jBA(D%3 hoMT>MsX,]nhf଒^ [3^4yҝΟxۓoMZXbv&s5Z$ӬwBUbU#jcf4J2B.xJm֢fK$6zeq\iQ5J+]8D!`H۴!%^'d(s߄̬e]y֔_q&Ug󾆼GBKfuhsD`}̅33q큻}e:,iml8ż9|̭ܪ?597<ltr/0d"n_*̉_^z#vߢvEw Gh$˺ GF?8F'CD/QAsٝYkLR5ne/)<KKaTbx</zﱍ=Q(69DsK$%dWSIZ;<{hcng-Gy("6UfZN!16r"֝lgp 즋cPhF #k!o~Xz.�� �IDAT0mUv0}.?-2.ቜ ||$ 6#ڐmc"m Ermѧ6`7 ڹqv^d ?dh]l"k⩄kCw;HH=Ԅ~ZɻA-~ɷ=2Y�w:Sg\~j~=ˋ-YjҖi_=ec]|Ghs)^ۘy^eyܸ* }F}c<Zz_/CY7]@dg,[[<ՓL|qg.ي9j֛XtIC/+Hؔ)efyЊZ fYE(̋-QktTmɩH M+*o=U"ݮsZE!c.w ŒƦ(-xULH/5KK),ebœx젆T1HkZcRUBK{t،FmfIP3KN\BKs3t~RuF* hJ)K) ![m\,r訑^+V>O^Xsc>͟Tq0v}].k:mY\ Ϙhiԟj`Ocy[Ws(ET%Lj }̖BEK;5k:7t~ܗlCg=T9f^V~e/.:}{oS &<MYc3 q&I1'g)$KUTMeƾ+L# SQba죅r^|E+;Xȋ P9F#d<r^EV:"rЅ9[B25D|H x/H+y+9>rc4&'A!汞8ۘf}<3|?d#rvD/x0%+9IYIKʉGUc Rkvar?SwmU]U-Yl71`!TCB0`06{%[\duk5&C={wds&Pd F$s>$x+|C!~&8 ƙdz%?m.4?TIFclK4U;*hd')@2B񀗲6>4=& " $ݾn8M@8+p)3"p\m\Dx֘lOw[+,>,f]B:f6?wfZLB4-i"Pobxǔ/-41(FOgJR8x>N^d*.a9a<:b2iQppH]WLMMoR\ w1[z-RիNjJC ݪg(+SU4nVQU2R1:%]&Xej+ޱŎzӝc<=ZSJN69QUzFpi)%K)6s\[vj cdV>^T皑P|BE\Po '(>nqZ:&jO+JVW٧@ 1d3F;mn֭QoSUj:pJyBח>d2ӭd:T-3}\bLRƛWHiJaZekzV_~>49TY8cq\-ۜO [T&<{Po'  =RJӎ~SʜP{z4'm[P38駔6z4G$%류z6aQ,8XĦУq6;Cqky*~ͳl!x8$hg9Lyq"7?T;]K(}rb<d<^ =ٿE2o.7#QU^} uS.8b:0KG^g1rF8su4(<@H)qjIqe=z( ;ɕ|7cEt*5 iwF"}PÂh\}ELRGkj/"T'&} iN@^CiI|X'hd#h꜊nKyF%#mMH74p&ǽFo�-Qh9;vr>)Zh6\ȘЃJQ~ޛ1g$/WYwE>f&81.` 㖅2r*6|5T*4HsugbvrO9aY1+~|&naJ++Jo]WkVc!sJrF+08岘ʸc1OZXpYi[XN[4OtvŸ/qbUz,PKWoغBm2T9SԼW+ְD:zF[ӰNbZ0jrݣ*& ]P渰&5zhғV:,O+5ܭ%85Sڱ1rT{=14,pjRy1U1a.s.sh;}ߟ \rƬdLUP U0ӼJ)M5;hECjqJIOY0RsFaBMVU3|\Ոm[f6<?.3U.U(iL)k]ZFXlx5}ZW;ЧiA=PNǔ*m[%(V7kT ÞXm:")ecq3ƭ"iUښR >R:e͍ykvs Ъl <l∆ <p^LG?a?Wi[N'ͧ#~96AJcVPG S:XSstS4%, ͱyoZ1/PC7gX<Iƕs N|Yiĝ`!m<Qp\UX"DcѢkn lzf+ieQ^^B&#{[$=2\FUĘO/]2vrjj*ޘJ84c\vq$ֲ<}.Ir(Vq7WF4}YdfPQ:B,޵̿x"+;C U\S\^'hz0iC&bμ2])D `;IVOx1QO:Ḧ́8NV2ru4/"rh$~Bǜx=4^Br9SWYF }WiPjVa5t+IXVs,P)CIfCе9SnHZ9l;'5X\Lɸu`i,()]wJgjUvl74+kYB"7Y,ŚM0CjG5II3U*7@'5,י1R2~JEFIR%RG7y֭ms)JvkYX"3,r"'R8ib*LfスN5q3*L clL| 'gUجi c&}Le#qA2S k(Pq=ǔ`$xFQ(֧dʘp@ì UxRmJ5OL)_Q}({+z`܍ RNLyFjH<tq5fbOQ4LJӪӊjl/P'TФ_j̒P/O6>)6pOxݐo.0Uf61[* =zK^dFmݣ-3 /)έEy71rO$Gȳ4]b,'j ѳf0I Yu oy?`CLUAwM%|yчǁEF%  ^Co8׵'ܾ um ɾAO:qWDoxQg+$ r(<ټJ'zKP әoa3 ]R/0'#\E?x.Np 3gU$jb46Q=Jws(ƙ}.=$._h3ō [XB[䓌3|OrS4,B)~yȸ2A¹S4}lMs3<d>3yN>ʒ}?77JvPI1mqW}oZE'ȯ]i`PAJ]ܱУ.d=IkfT0ɬ3xZ m9?;;T`Xu48LNS }Sj):+qv+3 n'Đ9+Vz#.L h:G!j9ޣe,Xdh jqS5.9ᄶb5 +}K8^g()ޫFL+[>uzˍGƄ)G-6g%K9脊EJ+Yj[j_ t]g) e&&Ti~bKյP< oR[o@f@ì=֤L)TelVQ*cG,m9l KFwJio_i& d3E:5eW;0丯xG(uO9YiygN*O|`-CkB^i}kRviؓ3 +rJ+ M'i`*rє_ \Ȱ8T4;0>*<ƹ9-|?` '=ZZCE–=GAߧ~vz"ɬ{0 ]l&*,M yCf![<j9E\V.?˗ybK;L,G!8Oqkx_$ C0,e yQ<)^ݑyN9*jB.f 24Sv.IZΡ*,?e5e[If ^*Y=QSٻ8gڑ8HOʿS|ߊ,쓑:w襝#o$R-qΡ[l' .l7y/0q8a^e `?|ǹsϕ6!𧹅r.HC|U'ꇼ{(൨ ^z0>_Nmc޻'{w<~Y[bǂ Px[w<'uX޻b6GR.z̵.yje/9pGe"5ƚ Ɋ+|Jc(hѸ¤kT(Ht$u+_woL7_K&u֥lJ[>YU1 :k-PxY&9ep%˺3ج;**dLkL[`0!7Oא9]TfUYHJji00O㋜8iQ%Âi%FK*M$y7D wsWbUDFᘪP|#)%YiBcWc8`JYGlʶ%j7yiL) CK_n2 ̼dɀmN,5Ӧs\}L+8פ4'9|Ifm00iS1j' ~dŇ[ݎ&r*)myjٴ򌾸jcSY}M9CzsB_θ#:nMҺ bi VRVR1zPe .ŔIJbXg8=):i.k<éXVڹ45ְwn<săc|(dY43s1쎴?"Ӓ H7qִY 9ws[Y4g+=l0_c):fh=$H3A9~yF6ini^xetq2ct l^^i~Lfk;ϙ~]S_ORK2iv1Bue^DA(rkgh0#2"I^#I 'hEJ7vrTXM= 6v.br~$ >px&*^ƨ�_`~񽞗)[SZvN3A2UCqB-=t1,_{vwUĞg wl8u?KeG̜=y3yIJ-VH>93HZBܩ9\@˘$K9EwNYWx[q,Lg )`9F -`[Ό縩Yi2ƪ|Y):s*bےCL^褲::_bY:fT͚RkZj \B츾R]jkMQk fxRg{-.|łp΁%х6eV+\jMJLdٴڜd@EϠ69ޣP~&^qᄠfMSiŕ1ak<e~F&bQ5u>Mʏ1&?ۡ.{RW\kydc̤YEmLu1hSeZѥK˸B4)j2Z"uPa.U^)V.Uv]OO%;?,߾`ݞyEf%C5M+FJ9>&VXᘊ:#\CYZw~ Spm}qkCd=بgCBI:nslu$ 4()>eBNY <_ѹs9nn+YL<FIk|nRLYxx)Gi%M)LE#Q�+O ],F@ȧ\7D39}ӆ:?wVLQ8%|6SįR.nNe 5 Gu_q\7] $͌r<\>6r#).`/ 饃ȰI,8͵g2*ڢl% SM s*ۮU&:I3Cy<(m<ų�rs襂\D1?aAN-gQLŏ,zC-Fut~=ϓe$0}F/Q x<ZOf' Ceyl疈Ub+8t5L(. TH<*#wuaC\[<v 9  }3aKh^?XÂ+3X:uտ'>凗'"nՏ }.54L]Y fs`o)ǝ7?4NUج܄WbVِ}ֻZcFg (Rv*G? Lt ̘SeLǗə)6&K3bӶU;\aHiŦ3G j 6olS5r*ˤHCc^O׭عoׇOS:|㵆3 dJ9)UX J)TާqH]N".<Wנ*&4WRRRdOӔ|EȘ^MI0'A@)e+hĜeһׯq\U Vء)du۹ǚVqEkNI*<߫RF5ohOi,wiޘ) cAԢœim1UfO(ʨ~RKVQٔH2*fh+z:N$t,H \cX>c_xf>?ÉԖGë~gIp3}=Q7U;g:)zgQ44߲FUUh*itX͍6~ra "_ D!ݬ42nǣ:N"zCBu%L%*,kVq.Dٳ85H䌘L~\FTt/YDq.(cW"4%Bv11ERٹ+8+ԲMlpmOjW*t$#]D7t2|#Hz-7p#\F9OQm0oQVVq f5FLb"CG qVxb%$F]  #w4{9yJ3'1 `<Kxs!VE*a< c~">s.$m(C@SO�� �IDAT-װ7[R W%l 42^Yh[Sb&][fYݡvՐYs,iRCeWWhtIGBZH*51-”47'[G)صF65Z,gecZLYT8\zLQ*Q"]Uq f2'ѤwLYkRJOjU{#YEeUUt}o>9nfW*wo>0l؜!ufO)˃5,s(!Sݪ{ĜfI*,)2QЫiDMDLҰDa%R#L(.2PlP]R.[UxZC[,5^(8pdzw]5< uFft;0!6"WXc[פ@]´2Sf?B<=}O6&U˃~{Ωc/*K5h1>k1# Dvߨ^fBG١o%]w61kvdlhEЍSsvBS@Cu=<DZCus�[f|"YAGyPN19VEt~.&K7Ge�2*#[nf IO1ʹdqq"ΉF}D068[*&#ȼ7a(OG dmBGGNuGqp,BגX] vR,"BDM%7߶W?e( X309z\B~:=Γf&^ 0;{+p:m>MWT!ިw^.k~o0ɥQS<ϥz\B.e`\ 'F沒6&Yϱ/*l㫬eNy%auԵѻo};஗<5#sW{u^]}GoOWLp)B߉ٝ_yQqS1goftf.my-aq¹;l2Kܞ6X2+OɬsS [|ԷRZ͙ȥ?J[O{65RP0;9|99f5i%s$VxEUHE22 yhAgZq|tji1r`as&TN+mmrSg{9 " P|XRGY>_cƅ:ҊGL-zWaam.<j#Iljo9FQfzBgW>hAU*K;ޯeR2SJ 3D#9&Lխ6ygs^2;~߾<L*|@.8th]c4-?PW&U: M<l4Q gjgs.YNu 5ZJa%9՘D~ȍL0*..0/7._vVϳ>'}b{.Z.$On:H'5^Xd?9lyNs)SD/k Iz rY^YWxZ:v d UI}ydODzacz#i^naGxRi`sXGCQst?P Xq>n{O1çig2US3qm%%0?ĵ\}3i:"W Oa>ҴE\0_x^"z,S,Eֳp7\$,v^Yz6$Eˌ/10yA;Co*jYw{}p6I%poB͡הqb20/B:TxO&?V]R-#?$5>;߾8;>f^YY 7{pkg Wig?=ܑk(elW'yS't[KuMjb~4l\Cճ:X X2d-Xz؉iG m.p~\9q n]}Mkw?fZO 4HthXd"[%6V‰apf%aKSlv\v_N-->aAqZMQ|sOo/3جwLuVӼm4<؄6xt^T_"կxN"XBХO~5FȷkItiPY*5*)i^@EWN@n@bX P٨jcˤ*M뿷!9Un5fMtTn&Z`ƦE.*/0g׺eg{2{"ݿ_=}GY'}wsLCj% tҦ qBBu3Uʺc>23Ygp#YY bCY3p=*ʆ2P#eM7|3٤/p)7t'-x�/[3*'G;xsO^5=w+8ˎB86zCQ7o;S$I |lO*#`m p1p/r<v| e\Oo.: ZEV_SMQ56IyRO<Q/W xqC{ 8Ip+2 JH%hѵa8C yr*袚Iz2b:6vm&r<$0 5zm }>T8]:IEpdy=,5 CF(6.`/<K:kY^Vx'ǜ%-"W^Ĺu\) j9WIƸGCLw1o嫐J7u?l =E |HS\tۺWѧ[w:iWVrhKvmObhQ{5"_әv +SL:Q|z>Z} W1S.TI;y"Ui%C?'քC[C +3Ybs\^ڤ伔җr%g[S3%Wv]FkP3&z'[l!K UW R[&ˋI-z18eLi\jT͈*&W7 d:ޥGEk}㏯rSw=pNr@È9u.ԑ\ sT{#!kN(RHҺđnEf dgJƅ,7`\YᴒA*VٿyWգԖW0Dcf) NM1 (WU۠SD\W.>|; ,iȟnocӉdUd[oHψ*g z"Tx9;pUIW6{%e2 B]I# b7thՔpѬ8c{%g-<{}^S`]vgO7cS:&cZ‹hnWח=F1oEӑM WR"E!dM|NΏ:))c_ҧ3<Nag^:ICUe)#jNFzq%<i)9A{ΤGY473M]lvZ.%NeE+Qm@$5]\;Nq)'1'c" q'K)LW<3>J}\D]r (aUħ-{+^?sYE;y*1.2y[s~܆P3߉x*OCg>,y<W45RVpN(%f}դYwy{LKBqh m\O<{eG(I1/䪸l[=췾mp~㩸#旡I~AzCYok qgzēWW?b6+t wܡ_/{EcOύd8a eyE9R2ŤiV4!(P39kBP,P0rb+S|ddM _]wp7v-q7޵ؑoRCvjTXx#(85lLu7!c<f^t^KK9+c vhQk5ZÕO)јV6+VbjEf z55mKTQ(``TuBV4I5&e BƤ\-1Vڟm4Tm2YϨd>~F+3pp]퉺J|xĀeKdtvSUq┧SYTTOVp{}YRP {/ݶ0yҳSIAI9PYRm@iؤXP9#㶗{ߔas4 쮴0(}LsRc*fUW<-" e=kq[3']41pqb7:<C ( ?gxg߳zbɖ^8@HB H eS0 gh 5B=BCf'1{/rջ֒Vy+ߙW\$$?׺<+CO06$;bV`F`{(7$gDOW r̈r㑗HFϨCWAz1b[\J5ǢWbOq`Z6oSDE܍9�I9}>"-:cYڽٴRC "2rߣhH@2^#'?>81HPp\&)/{3)]⊨[#xH|�y=*~5GiAN2I3Q|I=,Cb)ZgGDEQ!SzԅY̏n�Ʌ13IV1=D1w<j M6w6wF|Ћϳrnr>j庨g7DlXMvt%E =Q~e)<+C/r1%p[ypc .2a m|!&XjNCM/?o 6„x"ԑ 2겾]4Uq%໬+)2(uqUi3kN`JdI^EYYCZ.}yu;V#CW7^g!#f$ڪLjLʜT6$)*)K wSdK%ǔu8ңcImb;MLh֓VzԌy/לU23g۞Z+VQm`drͺuФU=)ӭiRqtLHd^ n GUN)3Ч!`JEf,ӐINӛ=j搚=6,J=?9vE:ַU?khN٭& ̖ءuRSBJ&)k }?^umOM;gpê dOGFߔh'^>3@l!-۫7,AjҦe|)&s"vkqb< AC%%PG뼲Uy x50-w*(rK]u*oGΫ'h <coWU\@3I;K?{~^hO^.>rJB0oLq}\F;h* r&5D8q0bv�<Bgu\n`#EY4>J=(G$棈}ѭS,$ 8oQk?gq^cɵ<ESR9SȇP@IFF1:;\XTj;],ya>E?F$ټ.c4s<c乎H/zILr2:^Vƣ6.f +`#Hi s2#yzg+!QƫLۖpikoqNDFy wǽ?02"֨y']]ϳ2lf5;qNfwD2;~>ig<3sG 3L;nv.S ՅEY-atڔ?]suڼv:ys8R(̌#IaQӲ&!/l0=o@uq3&>3[*%8QIu:F[g7i{3n|}sKW?m9iMzN~ši 2U&M4bSʖY+Sq\MZX€4sm4ފ>䈪=̳oEm͹=z̓_Ɍ/͏Te G%e^f-ߠHm!^eݑa5R KLJ3s=h\y L+I)-7P^ˆJT^f\xM'\tLj#MɔwJf_LhIe3AbRi޼5[zc@[^>iMwMxˆ?~ҼcGκؓwYi^,\ k}\͍ &&Je|c֌ff,?lz2&,)+!ϒk2+ʅ-YYgpEH嗜)AkǤqwoˏ|pEI$/ ]ڷ[\d߰έuUt͵'h <SQ=ts|=1v1'fnc2}415\+ 8J#|G#6X\K tEs3FYsfRNh޼f5$!8(=t'x,%|aw\ISD /Gw{�hOwJ8Bc}!~Jv-8AD tĹZ5M泀4m8FqsOBKG 4}LxoD${ xKdMNJ#r?chI-eL^}g7}îm~e`sAw=7'ԏKz] ,P ?w٨}\{r7 ]7XjdHC^>#~NPR;Ҳq{&͟2J9PF3;7n;+Yex{^ yjqQ1hl%zKjїỦbbI'̌ŌlUhQ߫+:c"5sti@NbTeTl1mI~'.Ůx [z4u8\0mCA8]t]FTٟG㰚ZMʋ5 7{G;ҭGcLF_ZϝКW:js[s'Ngo?swgfH)Rs̃PGi2\&Td".[=/2WQU6Dz{*c9#0tv`W.ۑ?0VΊmP6*:vҍSFҁ⼯d&e0Ԙ4oa`ԯƴp"06Ĵ er^1ZYyW7#Vs&;Y7ný~<d܇T٬d\1ڲf٠_ёɕu_-f*ϣ-1큆}|'f#Ux#$.*)"k6~rnsg&"q:<}:od;/q6c̏#5b<TSɣc'GYN Wx`*;CkKR%\ūrW#nƩFDO(7XԦN E7FA_)D%/\! $SKnj\}+JN-f}̡EѸ;css]`(4d6GhB}OF'9}t$Bn}` 9:\ʣ LfqvqqT�� �IDAT4T_c.f!.b)~* F&I*H^oƔnTsEYGq) ,u5|$W<N:펇|&BwkYVvv~hާgL1żue^l2jY/ ;=Ҝl縶Ou*k|"Cy5͟˼Ǎ69D,_^*vuѢ=ZW=<jΕu]G )GUP? :Sb&BI펴=CWr)&&v]aQOԈ.-E2lJ(Ynk}ONmSv٥}jLiS(W :m*4֭yLkVf%ω0<2߼QUI cCj<VZCF[6qK4YitRwqj#mOz_ttB~=Ψ7S֥\Pe4mlDn#%_@$O?Zk_9+b??ܘ\+>LbWXnj [[1gZgڳ sJ\6fu!07ո#%c25㪒Mڑpژ[ʝr8fzhd̢1?~TKxt0GkqZrܫvuUiG–}rfRC-PX1^8 s:ƹ\Ge b2d&$90Ia5 VF\agc58b3kp4Q^N0>Vp:Ss x}lC $ܨ&bIt+5#x_-8~k|>҂t(g5 m>ny5ZTscZJjjozWeRl"|깄gQ(<J aQy/x#Z!Tm)sXnV)*P̦ ;Yk!x~wN<Wڢ"Z똪:dzh tE(uڟb\ϷZ΃36OQGK :` yCgE)/SA ץ5?xDYy?%sRxrO*$t71:Ze&w؆b+Lz/9#) dJ<:i- cfQJy偒r9?O3?>Kev^nអ]W WW.5QյS(UhFzBY-Z)SVڭ9e_fqpYq͚Фx*iVj1k~`ce{9'S⤩#u8RzsjKm606b\y>&0V*}М6cpBGxMCj5-8!cܸwmy_3%K˫;*-sR4JMT=$WcJf;ޫ<iHgnM>~}Se SW=jBq|| GOsnwjWCnP( k`RslRJUOZ3Z4co3#:<iDEq3=39 -|6sG&@E^K;-=XO =ؘh/$;d &nihJ.z2D/^璳;ڻ{WGcdxVh<NP'07H_mQ袄\Ms5 *lO*YE$8w^쯠Nbh)yB%Kla?*[9̠:uuQUe&6),_Fx^na35E8EwFp)Ry`Y(+9Ʌ>oa5x<t?q ]!6(OǢDS?tJ'y9c G#WSmKZ|79p7 !hMcV.:Yċtq#c,f9?'`oE}-Y'B<,.d2I9Y; modO N_z(i:j^<~tݜA ]$x,}DjJY*g渊9SI*BO/o"'=6fu|7M(k*Zm",T]gyF{qWxƇR3.8/XX}-MroW(5\Q!ܐθ3ŅaCZ%j0'/pamzk,14;uK]`.˪)7Ѣَ mSZxƦɣ_̾̂Ҭr1DAufYF=à WiڌdNuwYԠP\~ }7;{\B7~/&<aTk\G1f۔e KHY\{;Y5߄_Y߳CʨiIv_d}?U?y%GK;WNk(H@ځzKs"ВײzpaјP<xHhŔB D%m15zޘ7]-e8+\F<`93,aLfKzVpfc@o]tRV'lzW@{$An4J y%R}(`8]QK�q6#8ΛIInb35LD?[j;Y+h1.%L~10jvqΌX@'oΦ3F8ﷱn #oB*~(b;Ttj\=J`wp0R:c\ 'Ѐ""N籈?۸,D(ba2UK)9 aNzsJx_kq wSQ8m ᚼßyllcgu"C,`gq9^ G8I5 U񘵡fJWyM,O BS~YQWXj[B3I\ۯpi9ް4vgĆ2Â9n&gvN<8tު)793T*ӊ̚TF~󒼶z|wDwuʗSJC Ħ+Vygl 移~𚿍^RѰBe^1杨0jʹR+wlT[ߥIzXF耩IمzY֭y@ÀFAReC~ѧwAZO]N n5c] [f[Js4qlМ8mۇj_?uϝTۮ3&dYɔv#TV}ܥKW?Wcb&'\;|2ǵ/oy{Vu\=L\hW^br=fʏh%iRd}ax k&z1j5de'}Wмr996H{^iJ .{m9.*i8.&9l-H(9ܞseBSwp ͫ!˷RZ2c?|q šBo8O ]G'E[I[2⮘n{(a#G)CQv1^"US~!ry)c&$j`Q~zydhQU\\H?APCKEw2eR$\f9"B"hG_<�.q!DdzqyL/|HExɈ>i"6"*^9wp(snv1A^VNG9H* >Moy5R/#F\2n IW]̢r!;?@̤w0|J (ick;3()Gռ$Au<ݔs"1Jy)(b 1e@m`f`T'q/tgS:_ nLoP@2N$5Lz~ә5}~/$=#> ;&5|g>՞u>>3 w%%s>Y?gV蟒wkxܪP֘ {2v{$ŵ&NL1k< :骰wJuy'Bvm599 q%m\}~ǛƳFO9[ǔuy6I~PYtE8Y'_ix̄ 퇭^hO~RG%jT=M)_'8Yf׈;Q{Cj5 (ҰľړFU.5<y^ӏ{Ǔ{r`_q欰eu2U$ec<Uwk>`<58.kOucGǪeW/Ӝ_*uTsP Ceւ#Rj822Zrfy.4R >4RCj_+fm'rGa.GMn~ݼ͹}Ӫ˅&NZF  L85nTL~kޙY+B(ҧa*"@)9ϧ#AΗRqsra),dP[xp s'm@s^Zy;I>oyYL,кR8(_CBx91#Ĺf:EفBSj7| yk頓Ue`O9\/3Q6ȟ;Ir1[Y"{~ć(M9o[9J=W4(^Dd8 p\7GW4k"IA3{6FX 19۩˷Y$J%9/:r}l_ gq?f[,AyT(;Tӹ(L'O2bO1 I2U,䅈^Έ)\87cVT ZmJd&fuT&=N/oXxLE^1|ceIoxГltiVmB"sW=}O odRS>Ыv$ȺE,-,gS{bV6b@XT]ZƔ OQi$x3ھTM}c)j.zₓw3O$ >g{Ie17PSi}^0mܒ d*e?SQ/u*E !5V3lFrN5S*y9iE̔j56)0٥LiJLvx噎,-[k돕N(Ф'![kiW1Mo@Ji$ej 4!UFC#f0]=:xΞϴ747dlL¡R7jS٣Q!ʌUNH I; <QcY(%^"zR</ MIg9zfeqt<奄vN?8gw.~5?'oxx_Ǥ; ~CW 656a_yi *]2 aRghI,eŸ9N+Oj Ozc߬(ZWͱB]\@G7,)/q B 8Y0]ףtgSG'u\y|03� b d #hOM= Z>Ύ0RJNĝ$@QF(,Ƣ?y}#ICT�D1EPJ7|>pas{Zi2bsYϥL-ۚjGх"fA�|.2n9)o\͑ j=9l{S"l~w?"S| UH<1dYad9Lzҿp<AlyGȯC;{4/,sg]Io?B  RLA!X?$hlyO8B9c[4T\T\7dBU}%/37nun@[9xqk3rB-qɔ\ !Sb9[YSWWm^Or"ᑜޗ *2;;/x!nm I(ͫ)Y յV%~c+\Ljq -u2k7 t_+MfCMZrog+Kɹ]GPb_+;)l}F-S;PXnJ~RcXr֎x=η|yf(˚3(Q1I;-n ]bSu-UU+lrGU[3 <EEvWvrTڹYG5SwQcX^zETO dU4sDyVy1xXOr3f8Tg{֙Sv%S0iy`͝Rb?]>vA'᥉u;^ ,RzV4F,fvҖQWjR2ot\Y~Fa5y Оڪ=cʜW'pwCr]y9󟷱/nY6zWB1KbS%TMyj9H83_E/^8g:|=0( ag+,Hn%<O˘r(WE)B$pD=N-1gC3SLb:oa fDuUJF6Ôp3igNY2mL#F+8D4Ƣit5Yrv3щ4<E@!wGטRƥ62 Ktj\RϹ\"hx'(Ϝ$z9rfD‚j?O};?j_>Epäx+qr)lS2 y=^D9\ɡ=JjNg}D=a3{1ZM, .7BޜpQW6Kv[Ön}W|_[iwQݿ/52/ ;yxϕ?v͎^B{J5IG'ɚ󹼗/0Ahӳ~5-̸mY=s$喴*IoPQhG445ڲ^)ϔl9'9XԮ xצܦkβ-gTl5<{Y56^?9~'(1Xɐi]sSTizbrt;HbXMlXV]"AI9J?<-OSĔrYi4zRsL1T M'&s*;!XLV"tHVgRurmM*.؇GW~L.xd͝[VXrs8eVGTMCR<nܜd!>n1m|w9i<^_Q퍆{tZlZ]:-i Sg7& +d y*Ie1ɜm: ~S$͝H޻3jYN2aiu8ZNmI. %rjB? Swau|9o.=!&n;T$\Mա'^X?STpwr'>=z/C'ü%}ybFxN1wn([yx)FYΙWOa C]h0:rEoHW/EmQw`-Wg"7^Cpԉ@~" X4/{vEelfK8SDN!G_ $ui-{e;vM7WLU0ϱ͑-q&( =Q;j7I3EIBpxB-ldA!-3 ,/;9/^�9>O@%3y=&\\ Gռk=] |QvqglU+a޽E3}Qn.>~&5{9!;|DB�� �IDATǟ_&7*pUKw{XC{/1ae'ᬸ:P#<gb 'Y\xֹ1-y&~L&fv^YL@רgbb'LϨ&㟾7wͳK<7=By%]C 6J׆'|Bwno6Vg)=nF(U];:.qfvf0 }v)ikN *Pmfᘩr!uUJO<{8in"1 O;FJ:S\ilM3aKk\nTŕ 7=Onl̮{M__3JJTU眓rBBE0``cl80qq6&c!$Yjι+Cbg=Wtu3:WVaA^u]k~~~o%hܡ)}Yx\D]-cXE]&ƴMY&SYnAS2(iJhՆ^)<1\V۾&ˬ?.WDΫi & 57e5COH ҽtYܪָTY,(PY8EEҤidOq4c>%bmLXw3y.)tsha:q6_B}'i/ dݧ(̗gҰ=v^[[X (#iNQ-A)7-#Lg3,Y,6q5`)c'q6+:ɼCW_o|7F̪P;C+ Fho3 ~Yis1-QHo*˰qrUtqcThs#YLvP�O~$!Ds2T1t[#p>[qBb;/䮽[z*z]4jFQ*ݬ`7/'GF)QUWEl;`e. vq686p0;K/빈S)Y@1ah4w ?'<~6fBe"<E-\1QNa*UL)3x+1ʋ-|G, n̿zFybOOUwvfmvK  \('^>5duYy[mʜmܕ-6?)u~O޴ҌML[̼t&$IbbП0s8^Yj la UGn{hh̰k]U*2Og^l/zWz'cohJsŅ51Y K479֪Sݡי73*+Jo%'wTVϋzGmWVg[x&kSXd)0ICG63/+{}~El}~h/[N)1k_{b/<wXfbLW[Ң ՛鞥_rVgP6W>pCf䕸LϋV3Δ0i2M,X:ٴF՘*Z*А\bY׍}ehOsMk1lz(OIفKU;£;FÛr-' {+9PbSn4|963R._G*0+Hh4#)75gva'Ts#vqSs.y=I3B|4= UT]Ckm^y.a,\t#W5g+o92fOLƱ/GC^˨f)|(wSHP|1V* T s㾈㷏YdaY|sMቓjIGF;qN1Zh7Y(VqrGB&B1#kLb{8fq,p|O<E?-+Qhj^OTU<~ΡH{~ΙFaĮewyW9 Xi3y$ 7O'O/]dIVLs`)Q}x{ԮU3ori !pR&)>NpKKWfgSHڢy[mdܺHK$)b*7p܋0h?ZK< }HsK»r``Vl1|ײA3<i߾+eeNM/}&;b. }1gpSDRy W~J/ǜ:G. V wA`04;mv̱@e&SfXז4b[RsnȔ{Hł벃?{ce=9Mm,/7|F@~H"z ?yknGu+%dzJq(kH):"(4/̮@C`ڴ'F(=cLBBFĪ$;MĄ[T*.,Xz=GuO*Jꚬ}ZPy%<[ WixI~з Y4U/msN]}+9Yv?eTaNðn9cSY4p-&tfĆ i3ם/Q=bhA5(s_YTLS׌"Yg<ۓ^2X _=3as1@I̜ZF5Pe'L{ڮ cWZ荜DھZͬd@|F>/ SXEڅbKT&\8QF,K Nl^]Sv HU:/퀽 {۬/blނuO#s)j8(|` g L!tz#J,o..$"*;c&-?x1Fsvir͑x0Z̡'( ~ŴFݮ(BD^6n|aqSy좑 yP'rfFr1F>83NM0k8 du7mTb~8:D|z:HE#M(qfoMrFG[ r>j*hUVRċ)c0R۳YZGqJ1TD.'p9% |.dndd*)R\ʸ3WHFcSb/J9豾z8:@!/JgEm|#ޠ2>˳D5? \I\xWg:r& :*^pd0|.vwΏ fpF{ e--7HSj5i0/[,Ќb*f=,8痁g&ޢ&#qiL.P;IŰX^Rs%.Zݾ4Xӂ|eؔhKw^քI&&M>6- ;gk/7 /|RmBCLT4Ͳ#%0toSP=g~)JicԌ*5WKNUB&j;fRdRqÇ C|i[Ju Y`w=.^M}cZ]kʗJ G&MEϮ9[<I;5g9QfuizFG 6j@q &쑮pBՈ>b VS [lhT}QÑ]sX>`I'&y̡bi3qS%SwL.#$0!k\B f Ņ9jPG䄹rYϕS]hKF2gZ\6*#$h`339x4T5aB( K>&M]6ia>\hUɡ`Kγh#~.A3H27fq~1B[hKiN{s2{t"w#~CeG2RGwqύdC+e;P6Faq9H=gi<ƹQDS\]iq<ELyDmaxшoZn|^e=)TdFwg(X)<JW hbFf^vtWHM>Ln''#6r%OIWWFc.]w,>)azl9цr)OX\F=2w3D&q:O'&s?GXA X&Z^0uLg+(vU„Ke1Lx8BZT8 !&y";qNЙ۷]QK^$n~ίGMyB=k+ Y᜕,O Ky.0PS2MӲF)Ӝ6. vFe,mUtWR17g})tڬ-o}{͋viېU=`_ۿ16|gB;϶W*2oϕXfSp ,+ݤmC}NOX 7qЦmfŗؓ〖&*i3XBHpUpĉU}sstYȘ-4١]='nn޿E;džTLҾÜ Ýfn3#j&:^cRC kۤE:^6HPXC>[}IdU%m)ωlNggUTg2=+ʸ'Yi.{gX}/퇫\97jfpwftjO^2z *B|yLmSK'%y/aQxTKj <b&, %cCT1x8lc+ukdƏ?C?g)/qn\x,-^気O&JbNa<@(S?E߇yzvs !EŸCՔ׿O6Kt%x^?ftsO28R#K{xXyo^:q;iH4#p*QT\ Q;_|9[ys) 8Z Q7 R |a>,d :='("]wAAeQI㓡.~k< 2#0eL)N,x> \:Ӭ`0>Yχ\ɵgϰĎ*7\: yG3$$}~;} Q2l6L V{6cY(UŴ3m왼9o%=1; C29 9 ǁ3ܜiIOA\*'>2W?zWgvGU+Vh1wf8g_gd\hQʪ.>_\U M+4#?~5+?f$7⚾y<Y$JF,c-,7-7bAUL*=ɱAӜ3ż.] d}^S%[$eH+.3ɑZ} l*H)4dYl5Qo^A_vz}}m1,4Iutm7݄?kpEYGR)(+1 뛨s,w]GON∊Z=yn(5ئXd^qSES[^Z]wŃTB@s>Ou/#hqVwO''K i9_18ǔ0sa_s21Ƴ<y[R>7W-/\޿ۓz䜗J㈜1z_%5Q>nK ~ܝw2`Qoɽ}Gl>5 $7.௜KߍJl|pԑQ<(E/^9;~na/+9? /PrJ6b񔲀;1[t7xp&1&)a79\Õ(e?V Xf_9GxRM@#\# Q.\4 $c6qV񿗫RDk^穦0rDMxa|`8Ҩ-N#4@'eϤ" 8;/ 8"w=zh(2-eYwB~ ^Tr }gjbc)S!<2f{ {#J nFpƿbٹF'b>z_[ xi{{uNH4 w,yEU L{aa=y17`yڒ&Q=N$5C99Öɻ/yN/A:Ԥ)Yz/ݜ}c`?]PY/v8H~'mN-|*w<}k TLUtzɌ&݁wު}%5y)URJ{x{O.EPsNR?W. z3{(2: H)N)*Q=(@jACPep@IB..^c˘mpFU i+~DsL2Od#bH1) 76XnTm HePι K%m32(֪2/YʼTW.RՍre\,Lm7RSϩ Cnw<`ϨUFQ-^b CO^&2ץ7 TM:2D(SY|m&{&57sˮۚr;}Vӎ~PgBTM7v"rӧafvf7o9si-*:6as粓m|e" a 1=;;8 N5}26vFS,p$JmL@"M_\t{ xp F. 7Ƚt9%T- G=3qW ~\fGFfP`fF055g\{ûojb*ky&be5K2t0as1Ⱥ<7ZS}։R"t<vW@9\mdb0vޤ 40X>^)nMEFu<f3) c3=!9%cFA0>yV$˔[~[l�xJn5Nf cv0É\ZcjMLj\q?J^QoY̳Y\+qL>2yfпaINjMN,288ClfAn: ab338/P:sO\{wYQC͵LPfԾ2shüh?y# :sՕOiJ_mZu4'x2k t-Ly֪/V^f^҄ɺ-TSmpTQEM:FC5C贤И`- :ToJU@d.;V  4̈>,֚VLZXFvPU* \Tfsm81gTj(s B K*0鰊[FVsl,kIIG, ִ 2KGmMkƌylTw).Ƙ`+ǔĜ1f4q ѨwTxI1-hB_Ɣ $BI9{1IV>­sx`9!4u1? J6Ն$g˙<&XBO'7S6q `1c4 (Bh*0" 07a-8"qhefECp'W b"c<ϹH >O˘vKbRIFMY,bD,'1KCkhXE Q>B;6]>rJ`!#4RNK)`kjV^{.W9E5ײuLLQN31~E;HwYgm Oė"jvp6*""@�� �IDATr*5|=LY\m\͜]N4'mUh*lr`Cׂ+Y>]vm ̏YBs(f#zÄ]ʘE'7]^˾rAnfRñQ̣?*XPvX6/:?89c.i'|o!nl4'eMFwv9+zR*ڙyE 7s$TP\a+孄rGuz#q؀%Έ MP5bY|Yق#][3Ez~xC[[XyuUS[~)fјjnh#q _x,-{ ϰg UѲGOfDyJQ)U%5,%exD!>݅S6MS0f;nRcT64ЭK1- ;X^qM]2^ah02jsjMTܫXX&l.S11bNÛß}~$N1׼_)Gm=*׮)P=fzFBU|^^Ԧо}5ț>1OroC(Hƭ>_mahyc* N/z^*M eM՜[\5ugֵ>(]fsۘsQ`̌KYfQVKBkW^6$Y<鿚<w!fJ]eU-Sj\-&%4ï9)lt28p;M=qz4G_,a_g wP4Ril?8xd9 Dj<u}+>Ë$Q;v(h2ɌѕBh#њf*73QsAdR⒨YAawtFo"ܸo\1;&%?]&*X?@Q l]=J]JY5| x#d?S%^b7s:F=<Iyg;xi =tG*q c)Y`äS�;&&A 7/l(OpR/'؞lz#`CC],b!O3)b—3z̏6N=\~|t_7~{dcO̫J紵u)?{\`9=窴-qQpjNi iNY訚G(*Y;:j:2q }&uY y լQss3MJ,6Y_EN EMɉ#pg闯/JLJ.蚸etWL>eWߙYF?ՙѻ+7}= +?W_uuݸ6ͯVԯ.0aTi: (ڭF0p:2GT 2ZegFcHyKR6MWʥ <F((WدxꏛX ۩`ȱ*C&L l=fБtp;1dJŚ9戲SJdo~מ9&3 ^]1;p`쑫_N㙭l{߻5ZQԭjF=J&.sLC¥O z89E֏ؔ0oI,tV=W(55צGg?*SNL<1W`Ο8snHZ t2gDAJ{ռL}6Ijc=5m&>Eki}6/\ǿ6?/'nm9'9z8;9cvxӜSDsG'pEs&;ⅈ3>q (/v8q1b}v=5Fhd8k"hAY},Nhvr0xc DKy Qs);Df-:^pO<:MZdw^P[bTr=cQwĹJ ,L D|ɌFQC7Xi` y Ww>wM"&B IF֨Cq/)f+&eęɁìd2G6zvW0b%k#3VdVk輬 ԱHcPy_e@ N<1ʬ_[~vU>9%y54?5wLN]}I ̎&w]1|y Jp w x< *RFI]ͺ9 "BA=cN7^KJCF\uPuR.6!ꚦHenlvUґY;oh<Z׷sQѦ7 ~ϙ̯kk+kEwo<oɶ|[O auG+cty<"[31 />IoζA3c⣒9o6W2m-Ԙy!GUV\-U7ݕy۾O8Q86+4+A]=C}J3YwַL*TTI\6@wӣg7:vФk_qߪ,)~{H]^LɌ$7j-L}3zM߁og)KKi69k5:t`V^{O.p]Nv<nnx59cf (6ьz{Pm9E /m &8 ~Sy$\][=4yje|},= 99o}cm1TLh*4x[l Lbm>NfY41bg8ʋL of%|g1x L8ǢE%a= dY^b|ʹM.Bha"I B1 Sz*|jr1OD0B^RFC̉$FvF9*x!}5Ȱ3Sy)55\{*;8+dG<\1<"baz~;B&s3[PfcqBvpײV>«\}e5Cy(C4dyejBG~E%fc<xW%euqX~Jʬ|0u<^iX.RNM ush<^b uf-r&T%x n͙/{ꔘKB[CkVVu8~^ $c cz3xhL"W䕎x9!⡪ZvBõ˘P,)SB$+\2A8dn!%Z"‡μc6M_ og;l^:69:3~4\>Ty%߽%WlNsw>le MmZQ^Œ ,?bK^(VWm-cBVtʲ2"c2eśl՛V_._Luϰj%MMJɖ8>lglxLP|DzMzRFFe5UX5&^&9ӁY۳0)0Zo{ʼn"A4ʟ^Zk8l,*hmxk>sC-6^>w$n:/᢬ԚZ N2B ̊ ^Efm)2maz eX1!3e+8 t ;6ʻvT ThZ( 0;돼+z-ȌJ[}_]mq-ܬs9@q.$gSDk4+ptǿ#!u2 qd55<#G~Yy<o#PڈglF)Ҡ�s=GJ)g[db5Ff1 j8J^_2|cPx$Ǎ;_(-Xld* c'5 q1u#o 2$><zh9]uF:xD}7Gj;ں ["?YUG RC}u]Ի,Wٖljc$PB e s030f�JS;Kc;E$-B^\9-}~|^9>BŸ餅@zN>4pEd +vq ~ z3r'(AC|Mj\y-pmH%"3mwL+/fc'W՘:Du:Nig9Owv0eO'}#M$"O$̈<YİcF[ M=D39Z!=b6sΏ|3p5k",*2BCƾS04gG F*,+3͡N1doY[97ɮHC _qpYnKW/g&:Zvsꚇӹ/O=+Ew--rfҤ [rsʊu {+MS%٦!\_Z]Ñ 9d;ګi#{L(uZBsx܄lNUc&+?eF:FJYpȔB rHߡ{aEyUW_ZU<vvá6'7I{^un`LcNa[֟2p߆>)*[0vG ,x]IFc΄Vn%c6K4I\Z=iCފ <P"Qj`f c\>t $lI1=Y;;Hu N9TvPy ǿےGo[|x_aSuLg?X=}G8XIp^tՂ >V$/]RNDC<:byΤ?"v/]B5LY@cҊȟXFHŃÜ"&3dlbezĔuRc'濇|B̌:YhgI<<j'8;fM:a17Qlwmm?ޮj`ҥԲ\K+qbbW5LaZ l%Fc3eCMniKGwbeo<ě�͜_qEq}Ig8Qp5,x:?:P!X;I%yƅ mO|hpr䕼t3ڏO>?[w`&y=KQ4:~.՚PH,Ng!%IWF#m G&U xMԈGߒ&SYIп <d*aXSjK-CԘHr]BJ=wpF҄ZF E :4?g>S2Tu-2^sZc<-/T 1}F<Ta"%CvV Pޏ]ӧ>%߮VDB%5*;ts:ASA9K0V;ZjwjLlt͸n##~9.RuTr̔rA{j{<x}Q{Heƞ_7#~|Y7O.z*?g7[ʲ{/9%RʼPOd(6T9@AGd/P~Wh„WB+# Jt6s/FR1VrIA#ffBʚ/Ux|[^MԤ-wsa3;r},;񻮿ߕOٷ؎iU</$TSyd<WbQ.faoMU)ߌSOCh-p=8ic1V2@'iXp|6+NGjfZ4O6G㹸/~G:v~1B<g.8:X\{tp]<R2.zWNf|g"g$d8%ў'ϰb"9bߏ@YLf7+#+>,I ly{s-T3I;4jvr =C']4q#x,j>sX!ư4aE <BAy vl2JNhg}?DFRE{f. AԴCk* {?yOȩӭ| mNbev~b&Tم|''w_ڷCߣy[Mg=|(R|'w'QɊY3|R>p\GVed G3'))e7Dk,-`Y*Cf en =<{9Y)UyCSu ՊGd`twQ|7F7O^{e]лeB3FL;rw~^#*c H>4c$)(tH{dAVjfuKӥO~ȡApbq* M#+5EEqr 06)$aZJNJ/wд6et罔ոLPߐIG+EV;F.k^WM6{7,ִ9'+=mOe˧?M-uϝܗwl:wn=]0չcWi̛VdZ10\02 d^kJg*;I/rZ!N( t!oF^MHX0PrNA{YGㄽb_ڈzNY|;Ōc9IF" ?p q\o}wm%]\M9'>KJ}05lY-"54,<_,63hf s}r"a,["[_@OTV6PFY ɵbnY_drrz(XC!^rbPŢX-N>H7hc=/p8@qJ/YShG )Myxq8 Gw!'xqkygp4&}FxO"{#a/oPU %wٱ%eB|:RE|7|Ofnϲqbb_Mc:..瓌t.j[y6]λ<n-YeV\ALXU<8Ł1MP?g׌{6\j0QsyGz}tl%,(5ܟr}d)N|]\w89A7YEUF7.ZS_\թ`0K]9J\)hpð1XR)PJUR՗h4C[fG2ԥxj| `PZr goCMEnm9}YimEڊ<vuC֯ݖÇ ?h~C.R7ۑDdľ7 .XUTk+vhDTBC^AVOքF3*Z rԸ"H0MӀ=Y QE l=؍90 %x]>ܠcI9h|N8ьڟ6׶Iէe%kܿCW>]9}S /./L)фqZ 4+#^3BG:o=fuĀ]m(CsB4Zh4&W % I8;P_^Kl0/qbZ]Q4蝜%,.G *8/T ]pWҁf#r#^QeUSMIEy/Gu ߫5-a1~Jmku>VsC_b*}Ƨ47N8YۋQ,@<FQ$qftD 9%O?%.is:` VQ*P.9|Kh`ZnvRd#?0iQYNu\CT:ϝlg;(e3^>/F[㡻(#Ԓx]la1ar,0I:쮘u;rG�Q%E~fdzhK>Oxz4I:~m>U?4oDK|!g{iI Kz�� �IDATĔ4'#, ^D)q BL3,XzIRFRĩ+{FeN.<0OS(zf"]ɞ@:i."- s#x=a,g(#vG>ണ~Goc ٙ8)_46Y:kؕ* JeMeMRi$4^&O8ʕ~; 4'jXS00lV]2tWRyrވԠoL"8+iJ$PHʕi..rbp郅c=3b؋ )!YR1f+}S:Sou| Q]40LeaN*&2PM҇mFJopLc AHze*ew)r42ԗ;MnHArJiqFttVVrZ.a522Aɠa}R)@NM_{G7:&[ИWYm~ySꕶFttǪ7]=0gx֋܃ʆ?d!Uch͸G^H8B]ףH35FRKԖ(ڑpzIZ+"B'I{xh(A .4%5e(?ui1(#prZXe=2c3ZfB DBwN 剟?i[ظ"*o Nijy]j8HӐ)=g;|8ִ>eTp7b{8ĉ)0WSdf .XX8yaej`0PHH$xi4BV#RM7pRL`>iYA?K|S>%gNL乌O&D{@ /΢$GYicШw $Ma,kJ o YD#]\Ρ:3;v*){=_Lfo;tq$s]0LӊN!NIŸ^KģѝQ# q$E#(`ilt^a2 U@"gw8q{ qNQN$lsN`$rEg٤i2YRF̈ޭ(j-cV}= <9 ܰ-ط<FOh`D]p!-J tԼ[Q}u]fW [\44i\d_9O3 i6:4`~œ()td<WdQ-YќFZYPʎ;cj`f$2d*r;>.{œg7kOS9GZSp(C ԐV7<m^{z_/X??UW9OG/1IiA׿Q:"V)5gq:{9uCv5Ԡ{W3]]PD=#:`uiI;/kKuL6 LS*/i4J:V꼡 q'R?49x}OC :Jo#ӑPTcbIzSӚnÛ E퉜l"y)@bお * )VIZRJ쨖.XT7%mxm4NV8-͖f bmҋ~uuzE~+\E$̫՗jd3XJub/֨o6ϱ]FoUFfihOep;3J-/s2y[a*eZަ)~7UP&6\(~'rAB%{9KI�rSuI8۝dI<1]2|IL�I(v|F dX ^>z0<N9]q-^WGO WQ3S|ޠUg%_<D㍣ؔ%l*8hŇYb-XB*;FKG1a43NsA"hCq]wlG57 ?IYQ(_a5L?SdiΠ3s*w"0#{U̎cH8PG%tc"rW*7?nei'L 4DdnTN|,hL>`^ۼQN++Y[l\#㖂"u|*[ ;HgnXq\UjK4GyโPsNo>ИU\pqFm C)WGNU0?<9Lo)yU&N~LED Ŋ2R~02/Mil߷~J:/{ ɿ_PH63OxߠZ~slQYϱUƇ6)߂<5m''y ].hnMU37LT"'(R:,5߻[ܕu>CG*kRRu#cG{3HFuIU/sYYצ L1Wh雘xӣ]#upfu *V?}_Fy\U_/?~#;4H-۹sW^(} C|%JFTFFź B?/8`]>ZeȸHr3&&&H:`[Js$9h= O#ըzO?lv~3|cLa6-[TmN^h1O}MB`gd1|SR>i73yv&zY?~jjꉟ1NW oŸ{b"Գ<y=ak|{ޏab%SSF%<pGG=d {)qi0՜Ϧ<Cx'r4rn̚:1V~-qr/ T RDwxqn?!̿qXt"N=kmWog2AbGcq3sECȐ%SM:dUM:NaL`O [Ss9 (Gy6׹|mc K+%.g]&`+)Eލ楘Lhq@Ә9v>y  >ͣLӰKf2|(ᾔC[ Ww]^oQ@V]S<$1j\ KG|e ۣǧEJ ~ǏCGBo 8Ak^&jm=qBo >T!q*kvq0Ly ('GQ֡gC-i'dl:h8yHvķNȫϚPz#/f7Mx<gwz˘CLɻS=%>:{V'=?7>fVHv L,ҡ3 usւVS62˻93zzPaCm'*QۤRƎ6yW*אГwS+;ͩ3 ҊBc3X)nvƆ:ՇQ4"^j#J;Ңbjܛ BI%52)r_Ass2 eꮝHV7o'?\{+cuŽQ^Q<tiQG8%on} j 7)IWG#sRPvfhWC- ȅ}npC=:~LoIG Ô>g\̏kafTaV[^e#ܑlNϽV*8'nnz8\֔#igq9d$ndc\X1x'勑? .wi .NzM7Sħl\R 5fC<cI|]\Js4qH{K^"r^.~VƲ5s!O8l$o08m&o-BIrq+`5j=|h3qbtiu9>wyZ78;#jE&˜_h;Tg3'3l?=~oM5\Ʒ x<fnm5ng1|沘,0%,<�<jT?s=C8!aUEf|6fΎؼylw ; ʎ! @' {^Qp!Y*KwIN3GW˃eєnt&<XDhJkaYua.Ƴ|mhvd97+3E ]{\}iPUH,^'ݔ|;*ky_I[Qk t^:s>e֒Mp8/y 'x&PN٘5gH?>#v&[aǐ-+'fuwtdpo3凥9x/T>؉քɊhaѰ#j4l"HdmKt~p_cfѐZق^5U$0SC:[M}Օv:2tO6Iϔ)#%=J\5ڬlΔ99}ȹ{l-QZmLY-2Q;dvImJwyI=+g]\,);??r_yxiuУwn}3CZ+l}УោZ2ྼVaJ&p2S+Ly v1RC::B HEBUha/F#,ph(R,6׾~D˹Pq ŢkCy0=P'I "'0?ПE#/hF;gFэ chb3Sj› ֖B~%$C,`IY^a JFK7XPXz>;:,M,g/UH5l:&~nb5&9:0䗼?@]GDĂle&lvS416`x7 '0F3%, ͶX\il6:14sX .V3:D^qc97;t`{!NxX3 8tms9syT a/ _2..4q.4PN5mqq ǃ4q*PJ Ϗޝ&,'ݫBf3%~|Dm :zYJhy'" 4㤅%fG23>}<oPa-K XN:haQ#gm")'#9-̵grǿ6Z)PxsA8H}RS贶r01ZHʑm5ȷ9\cU/$,)W)Pc?+1oD^F&eK*5'U4k\~' JNNKKQ͡~]Ω)EjӹՏW+1|7qMæ<nNGnU=8t- [rǒ"SKdŚ:W 0.kCIæV،'U$hdzeTafFGY(5KUF٠ZZQl0%FIX?^‡C >$ ; ]-=̓ٿ˓;IwB3CÛ3K{qɷ^4$sZbԘ؟mLկ4nTf%ႂ1#C; )+LO>j]^\nPp)-!4,)X-r ץ]grɖL Uy#r/ik!#ЙQ^2ӫLK9BsXc31\~\>ݣ%i<>VƤnf2wLf621&Zf^ TG9Jjm b8wu2ꅺ1|uM|uPhJvQ$sG(FgZ^b/\e7e6s;l'd[ DIjޫE\FC\ˡd 2!)ЪMdyv.chDZ|7\ 9)WӞ<xgmLO)}󬦏b^d-Hgu)0O΄9mq:h<͋M2!8^̾bCsBGlJ%fp5K K8s(&G$e캘26^աȑqX4=`+GG/%]̤A[?d|`rաf33P},>IыW﬈Z+lZ\œHؗҜI%-͍l+؟Wj-xc"rͪGCjMH(ݼC#ɤP*&52JT7ζWMN|gVSr;K=3m}U? 9:M9'*'-4c,Uvio`yhc猯q,2!o_hZH>R!J"œޡHbE5*fPeAwPwICl 5;߶O k*rN΂dIy< X5: P eңo}hþɑI]WIڎ2ϜVȥCog~*_=Qϰ~?*2J2V I,ϟH'2cڈTgh $arf$4cȱִ ";B#C#[9%l9ޠ_<SZv'XIiqlh`j!)֪>Hyn_.nJ)X`RʚF7=hmwdPڸ[\v&OE1Jax8iqz{<غ;bG{%N/Zr>sx,X=E9F9h/sEg[ &cgY8L) 0\Ϋhc > m` \d(Fdh;b|T260sXk_Wq1ަAf':w88zCkh*Slg0Qm8;)fI1[Rl)}7K~dE2~^g; ~kQ2{ckxhY֒ow:~p tv )f A712#L; ׃/'s|$rbyI_e)9ތ =O+P6z~cMu LJ.xtO"q՛၂ gԶ!G4mԇǘˢjUn"2f- _NZʒqr]d=ReEE.tվj|ói- J)׆^9զ :rđ9-uRُ|yf~묰̘nL-E.\s.UGf{Ƃ. FJg$H|ƭ8aXP!Ȩz$Y{HȰ%ƪgfvڛ^#c}RKtJ2R&xDž'zmz}"{+3bt۬={+* WuG弶h8:Dt딤 mǒ_pOJvj*wMTfdeО<)/P>EӸ>Oy֔nOQ%N,\P:V2TŏP /1hi8` |nqMf\L}hamĦ˭țy/w9՜mc<JTwk2P.˞?_f jc`͊!q3vaV?k=7z bMƖSO'9朘rO$&Q[l (w{{Űrq<9olvR)x'ylc?`U'+̔zs"doa. pScЀdyg@Q"^/\ï顓 I%n\#*n>ۙŅg bBW{cںx-kz"V6 D^d21?d%V3]<?珫72o iY�� �IDAT9D%A, Nͽ9oW`B2Xr[)S 46%=X9? ?71o~het'"K)8&"N`r79qPg ̧ |:Gm|<QuvLF+W;H8[޸AW)wƅSaovRΗK(x>7zw;]IA|-4-`҆.8%>̔N*UIGiN:Cyhw\TʼgJ|Dk_S淕.*6G>aldCC",.=at>֕0>~aOSgNmi:Hs>U49LͲ]udpLejT݇ըRo]+1ö=T2DvUMtV}}3U__Z~;M+2dVW֭{:Tog?Xxn}+-'5TlLqCpiwԷ}g1S64NJA}gONG\e ;r&F>sY lNKjTf :LH4 դt/rm_<xKcV9/p}W{]\y &H:rRhg省쵊7+pK虼pg{Rl<z}uWp/{ z/jo`_IGo.i͜PBy"4 w+q*\Wy4DB̊˓S˺X ^ zfqw0lJ8ۗ\]\( cɠ�/ 9RS, @#~I< /J3gs)5i5'7y4^WGip&xrdP 9&!Y RO)9?>vz~G 6PO2L+f2#9@}B/%-EL G8,&\d4ЫUvcb"ˌd;gq%d)LIM+dW.k%8xx*>xӶo4PH Yi#K | 氁< XO)Pxzt) S~vY+2FNLA{ 5ol-dcœaY42g:+>PQ`Vrad`T8aHR&c]NuiC2JM,-urCmd^SѦ,NI6PU8iKH.WI6iTѣ6C-7/IVYԴ_$q۩d5(8vW!R]֖ͨN5P[y\dBA}FNe*kz T?^UJv*dUȨi=J{~A6|^T@LP_^zխ+GkWo{BSO'$-H%N/PCBs~!=@y|HS6em)QkK&a}3r2L4 I-uOٛN-00#5p~eU쁼٥곗"UF_":ܩ{x_sxk'vԔb\1~J7Zk탙dhBS9A\`}`%h Hzb |8&;1gh=0{8@NK#_L}B汊3c6ng3H7xhKs  CxaOyyT>rB^ ]q<'k GYc™@ܵ} Zi`o|OVx5v?Egc Dz$6g%sվ\}svL"o<&SD.죞VFǃ pGx%Fvħ ` ͌:R1?;Bc&iib8㝦r&Rͬe O{6'<F'5~yi7heO%}/:4Hk{|%|,@GхF41N<x_l4a[32w1&Ҧ#r(АɁ8Rjɜ&ړOgN Ȼ=ȓwTDw饞͛/ƯY,K"괓| J{*FjHikF{OXHPZ@e|MK+aό'5~}Y\|v)~GڅCt;9mӠWC_|YLHޥ&!TT֣ga}7fy* u{"5|- ԧfM rm[o18JGE SYlLBWV58Pǎ@ʁ*Nf{NaNeZ6Iy=;{ *2Pgw#zjƄF7h.Wq@cJ]΃ȣsCy:4]"#JM;(L q΄Y&E2ImmI[RPe|l]3fNl)K?fϢT v8}}gHXEJN@k"jya<t_"c;xD\D68{Y˧.wby-}bWȫ\!Fq98|$+H8U1=ԑ<O-;8r Ӟ:8aI=>tӜg[9)v5tŷ>O*_"Z([`a:(xyq:!&\k0F63,5Liq ~>eڙeMx)4N!$#.A:(N?Z^bY.yJ>LVo<Bl61B>Y72ys\02Ld:8H5s&O) a*8(%G~ {Q<A�GLLcL:Jv׾{-uP^=&E zK6<z^xeo5cVe4o]~97 bz#hqޔ>$PjXBGV;uHAd )4rIc&pBsN;9w\94,3L׼X/Uk|\hA]J"\ifޖv?da*~ΙŪ eGJXCwE29)z~kM'Uhȝ-.5H.z$%CfH2"gCRM~%]JfLZiZeBQTu|쉰5r`w],0ܾnuy*;pMuZoXӡ 0!_kH]tvNM*RqBPWکvg .Sew'O?`LkCbۊ5t FSh{&4tWAh0-* IZ/A^?4/\ 4U?L`CB=RF6&{<W|`c9o3gy5H=gP|"^b,KO7M517:'hŻVJ)x6GF#fm A%飉UTƥ,8>au N0~p {_bd)6D:xMD$bFS Ʊy$a^MSIșd%PO tp2Xfv>qrop [Tm'<gdWͬINXN2 rgf<WYile_4Wa1$hg1az%[fX88ё%MO!\Hv|[) =pFQm,% fp'ie>0id#x/N_ăpn̟z?&2t0)e“|%T:r&>B{8S5U,�\ϟY+s@+yJ<X1JҭnU6N:|/$c/[�}-K}1Ds;o\ZW^@ F9&f{ ɛԫ7J4FF$ a[n6p 9anRG32{;9!of*K#)'<M'jSXkxFHMuWNY#mM*o2SqݼWK"Rٖן5U:ߺ]v/^?Ԯ92fr[pXCE)--V+Q\f?ظ ՟78{݂l"X[,mvWeWBOl/|-O5R/UnF:% ԨՓŅ ӟVjhwK.od_ oNܗ;H+9{Dr|D`|TBuڻy7Jl;nN I]c bQdS#<x𔺼 # >7(؁8ȼBLvU=Nd,2w'xyR>ž^h+dʃm>%Gc^`-- NYXM4),j* 'SjaH|ß<;#U<>J9FQ<2V,3Jv&E^fR@- Xt#3K̉O!4 A5ǍnR:Mb`Pd_1p;ݜa%+8*-Lev'%>IiLcpƀGi:a>Dsv -t9̫خ^d0&P|<N.r23;Pp+sKsx48?SN/}|r*9n#F5qF'yl`5q23C7E+kA1',(W>Ք#c6`&_'C<B*XE1ibIhxܜCoрpwG>aEaXh r 1pisy%5ɧ9YocʦҮ=ǵ·[5cABCY/GR:ˇ>Y {x:PG'#ITgFdXf~7H.mbWgJaT-Ff4YeA2/u9ғQZ0q+wb7.IeVF޹s=W[+}[q\GR?5wۏ:%l _#j|*t_p_]66|\od2szPO)Yw sj!eW_,zaznk2ײ~qkڤҰ*T_4֚R(%l.Dž#RXP ltÕܜStV/ΑfݑWYZǿgMDs"eͮ#4/.IM8y?ӫ"{F6cm|!2Sc`\|&rg\2ӭ^t]F)`P䗑áRkڬk]RmniEh⃰hK?u.o<Y˫;+`]jڹwY`7~2֥,Vv< Qf1g6ݱli)R~jVC= !Zap='~HieidG]xn!o18&Ke2>ͩt8찞YB!u\^G9xձa:. ĩ9;8/GH'rIcGy)<}%@wxﳚX5򏧙㫬Q  |z3<??[⋻#3鋱bیdYGpL0C9wd7b 9Ei3-^VNMg*XDΧټ8̺ yzpj,;: 覩BEX<oa߈<&fHa. m"Ã"F:'Evof־])wjkH}wQ׶ƼIQN2/EȓWdԸ<croDwi $1(zLUF$R6֤jC <]nySl)3Cτ;<pF3*tL^Q 3T.(v25\SC= $h ͥF^v> oz\z/?6zߐB$% S].m,۔ʮ>KaIB/$jgoyIk&D2]U{q "窷{,mݪ>oad~e䒾+z:`*.XPDwԖ{͝{ꞿ=c_=^lHgFnPU˅E};'TPYʤw^It x5V PK pmެ#&E7C'ݜXyN8퇮bZpg<Y#Q u &x՝}oVV |:F0:mȦqN]Dk# 50Tp(P3sxב<'r'+bc�KzH#. : mX8Ϝg8~L a6cN<F3\~1%q[ޏ3Cj%W&-c1xqj a쥚] f||i4c''qo1b6`?qÜ6Lf B;o2AԐc0iflleYf|;覑\p&[^QHEHcl+2=2|Eyv0r"^ 'QVq^7;c8B tY3ĴB۳vo]>RѢ^{uc2Pf={9RdeLg8!BKi޻% ULч=hl. <Ha׸ҼCF:CPrqꬴ0mAR:4Ҍʒ M IaKőSYMe~+{E*"?5e$N(~rv罓u^椡tCO(lxK\UQhS3E%gTWM[ftؼk'~_8d֢hӕ%)!:R]_7-['z|?BҫnNTt[E^.&e>81 ꝟvRT% Tѧ8gtrCv s!f$#uK"59ĴHcryGJ4(o!'OK`[9$UVٯRXya5/uWجΤ"3x*{`2z' L48ef#Yt>;]]:c2[PLDĮQ-":f6Гt_jHe7˘=O:iOҨ3U/_lb+S@p7|98tH<:!ip=#8 F]TSĆrxLc?๝քf2KMw(<Txe6py k큚ZWq)I9Y0Nc3%`m#ft(r&nvrzm~Lϫc}55E<j5e<Õ&Py$v ܡ Թ氅.x|h^ iJpN6KټkxT0d||:z~Ϭ[dCv$fOH,ehG M5f7=PnB6,]Y# >z FI[[[o:zu/u Bff;Gl67ʼ#c"9cr"Oh \[฼3u$oVҾȽCԔ;ĬFG$͌L m^fQ bY3�� �IDATy)ZjqsavIWУ$mJEΉ.czhFΨ.KD6[kFdz/}s|[/0߾zFYyǫ7k44ԁ,ߤ##;-МA=9ˢXcxߦMW6 4+ZmȬ%BrٙNPyu) LhKC#s ]P$_#>]PgI}6Г75L6gdEhFFWȆzBrz30oVƼ̫{(}$l 3=}fFj._in^չzG 9I jEa djEMˣ% *9ݎc 0`p<3=Ԗ*JI9RLr΍{T[cΩ<@1hcg G8iMXhCUfbp׀c/*[Y2N^cy\3&yL!b]:#v_rp:)[>XXKy|gzNY4Zspjp"e;4fvzɁ54IڎLkjybz06ű2D{ d GHPjʙy021^>Oe >pZf"y]1~aUfE6Y,IndMP۲%|~ng <X`G4} \Z9\I 4+ܐ_{$YUK|+epMfXħ#3Ȱ(t*[l/kh冴O=wtF^wiNi) yȠC% t%Ȅiy55g9MCOklʘQ7 ]ү$xKpQYB '=ؐiTi[R>әՐ7yݑ -j v#M ASַYvBBiINI*-贡Fa]inL}6}%C{%ɽ79CVe۲MK־ub9k컣g[pTUT^+;k~qG_/]%ۿ:qiۏS: zɜIu*2>CSEI}R=$l3w"۲* L˹sF\cRL+H9~ tWy=&'L6T`Gf$mzF;eI`q! @SC9OȴHmdP:ܦ-F/.E.Tc5dM 9+z ;+ vRқr|h5/p.wD1,y^d0gr8W#)>Tnao]yc7g[b1c50Q9I<.!LM`Ndr ><"^`he@~vsM". Ęoe]LJGXOsx/죟towqD`q6i0{M$Jb[ , ULb <j7Vցu۸M'GܮS oVr#1)d&qlc 0f XT^݉a˸q!ֲܭ1CXpjxoHgx#>`1<AM C⬄w/<s?mn{Q8zLb&Tj([L'0'k>þK]Z]Zu_g<:M+E}  9i:1kjLKeBǾjq+䵓ݘۻt1+TtfF=D L6'G[B2^t86:~G"aRT_UV):׊ (̫Teid'=CZl9Tgu;Ow^q2kHx)2'zN(S{Ӧ:R_ɛ;9!kK Z N,xZH FUs ]}cg^Ǜid<TVǪ:ߘ.)w c4[GgxuJ_$DGjl,C9 Vj]zXci75- L&AoƇ2<[>Fem)Х=87erh<%!cr y"ijpN/׃&lj'@tZJӂ黢Uo]n.RlAz1UN 뜶3/h?kYΩt|ÑK8lLg3ʸ]t{xtƆ:>#jy 점ǣ>>XV>լ5 YY;t3}|Ή̈́rTq-x<7FkYpɇǪlok}-B+1ؑ8�$*U \f/9B?{yOʞb\:B1մ7G䨊yb_&l Ws@Z@OMMܮ&P`:Kw'Vq1'Y $\1m&p"Qn!v_oZ`*AMHj��pֳFFrUb"OQB"jJM<t%4!(;8:Y2:(b:skrՃ1¬}"1?p0099JlhپyŃ-9.`^"αA|Bz%{ʢkWy&+ם0ڒ-ӛVזЕ&85Txֱ~/p0o.P " e% *498108aJ%H.<Qkvδw^ҴRVkn3.iJ>8Py9oRPIP_&ױQiȐry. .ժ1atow!O$M *[ ?}轅7RFNy Dӓ;KMQybK՛#j,Z1:5.:S(P"i!(cT^=i[Jx.u9-Y _#QQ!>*.dɶ,[r ;$dR&$y2LH&3 nmmllpole`yf{o{CǺ}<=AY-RҞW7> Wc(bcRhgGHTT2k` >쳾ظ! ]i^# =; 5(<IpsºՌ&"Op cy;n_=Tܩ#ʄ.)47sm u->̔Pq@MP2= a~zl\kYjs]lIûb{*ڒFEGSj0G8ib:f-ɁՌmXhQẤiJ"J_Q{0&NouȊ?vSK+M=S)IS6&Ŧg>W "Wl#f210(fj<:LډbWkȈxU7?ǜ_f04D˙Ę[D;=E*j܄ ё 3V>wFw+k?jXse$=!k#.d3s}Jz8!rfELN͔^Q<G͜i+ûB8 9<0n6E&d8>R͓\q0֒ޛIRNo29(gE)$<Bn0o-&5FKVphvgz|UEK4f[̟(L) FLu I#C"J3鍂ݑ! AmOҐPQdGl|YYCUg7D>&VDzp2O%'`Pnݶ&[;0x;3l)#1m~n- >RXt)E5J¤HM )9]FԦTH4p~' RNȐ"Ei,U\hψT͟[ H`Lp0ڷ--I=jH% N6ܡTל4I+{LNJ5:IM[&"Y65-^Iѽ:[-\Q0 Bްn5ze.00.&^J-+wRHMN[*/wJY05 4!A`j`0#b%" 1`O5{|#Z7+sӖ[ ?/#~ }*|*}[>#*wu?sgODi(Yiby5Law6F$]J9Or:9m[`6klm죊@!:8fM|B/3z^34Veq ,a\ fqg,#I/_vq ,gcy*N]K3e8tq-K5WQAw̞_: G1? jΏu'b.`9{J?n^op5r|?0O3%ח\d6,"Oy̟,`e\2oDq9+8,L)<Yٞ|r7qRL".r4)Ϭdu<[v4 Yq=9e#9_0i7%`]\ ̊<ifCBcGR|>ʝ\A+"o0sYi'Y:dž 6ΖA&-~SƏw8:ÛS"FJڔPt~hbk9m D:'kg"^i9:j}vg/9*"Y>L47a�H:K}~5Y qJšaj ^l~Խ$!pJ!FdEN̙Ō.xݸ9>#cɶ91mZڎ¤t\Fs2HR#RJjtXmL5ev%ogF]VPfLA ¿֫Ҙj:8 2΂{(V>ݺ#uYovڛ7#RXPUp9# $ILL=:3itA<Q泥jzuj 0)vF;ȁ=D}Г##2}Ti:L5#? SfZ#IGK>'aX'in~_59swY|u3=K?lĭ= {:?úf][511a7ǂ;jgX?_M{[)Nc+ Rs[fr,4gFo1r)zxuo`Fjb.9@/_8V `79@w#C?Ţ{ _39,ʫ4Lx8\D)ZNfWQLrΦ F)S%&eLe ASd&C)WяwjkOtDl$[>Or-krElc \ZG3gg2|J,x C?[/<ΠS$I,QTkPbuN1GI1Wq2YQO>ֽ?1㤒7ZJ=; 2)燂qcM-RfԚԭJف/|7Jr+;_ 7ܝN\^AWSO de'yjw/r{TZuEs[BOT(r45 [þtO:.gqj`٧+K nK/0ݑSCQP LXԚW00Qyܠ.R?Gek :ȾĜ^4*48`iȂmpMTvOcw}ҢLAkBN8!:PlTAyV{(*#d^֗ͅAw\0mG£}1*gaA?{dPݬ!uv+*37m;{Ev& ?oFT;ԙ]^/&2<eP; gGi-lFCKEy6+2VGD6>+8#U=l ΌH}^M  #B6tGc0%"" \t}GyA15Y[quC#,;#92ܹcҍ?~?Ď"#85kݸ3iUixo)|v[f^< [+?׹bz޽ 7qu>1g.S8 E̦,en.n0>[XofRռQ',(n~ΥM>f!pqʀ|+}>%b#̃ieM-d4U>;^7�Ut<>">3}~_T1sXhFvbV}1`H/_,W!34awYF Y̍W 9^Vb^x5|V^g=jE;i drbm~J(n_߰$8۟ n"^%';= _ 4GGz`M_| })>fbEl]\~Këtp{1_|<hN5mc~dPhpϜgogSA/ (/Nxs 縄T ! e#"x\pNH*vqV"r`mN/UYbt-sv$Ցd֔;6F'[0Ww=S4,5ں=OC@kCe Sܣ!S.}T:J&RZXAd$e ?h{O' Y[žPp[vq ])(׶9Rj Z+YҘKI=ZV}-RP6(+M62ϔi+rU^?\32S:HM2<]-4B%_f<5K{`TÔ 3h ,Iٜp[d"ED2=ex( TSzH_6+'h.~BE 7eEgsu_rzY 7=|VN=0/&YuMYNRC/v;GQIv #Y% !v'St61a)|rKh)/0C62ix+y]쎧/8&=wLP0'41 LIGb3H,>V= r*]d0Aivƻ1qiyR#Ng q6 |1GRx'n~H7L0-Fklbo>}:$/W&;2J՟wvHvs+]eTR`.X e4,ֲi|/vxf()cQ0=R_4<~I#`N%x< �/Pǚx.Wl$>dtPC )DȌH2.%pmWs Y븂 Ly'ҞX-?(OGN[%{vG_z51om<4ʘzKGob)N:)queѸ7oo}P><a� )F%H& Oi f@{ c{IYS>x#oIΠ# hDb#ȘYIj $`}#3ZE^s*$"c"Y8/-PZsRm_goMo!<V٫6JzYL}쭪^wA-ISbۥ  ݃D_A:3<3seђSv~c 55os STW:Xfn"MCl2,2) vz횁V�� �IDAT@&azPk5C$KoIMU FGCIәR]"mFF~¥|JؘrlA)s bEf }_EVrKUg5EW:ൂ7н> 7?l~;dgl)1G߽}H*|ȉ\FV<sVV6\mtFܐӜC'8Ԛt[n3COgˆH@ **DFG>i!."Z|$3>Bod(IW442gvqLf7'r YJmA%oS`?LIݜ*J{is~ tB|pfBL:6VV1bM艿CұȢȥ.8+*F<wbLr̉I5YN7˱t8Wa$Jbq*bƳSY_c0peo^RL7./iM1Y820q.G||nVqOO`KXtEtİ 1I2L$lbsdq1߸̎L[Ld B crФH9 5(Rh@]=nfgɣOYRKZrnsrּC5QK(Q)o]E , 4y@*g۷_CC3cnHM"H)iC# !e|J^jhXaOG.J*a\(Sั65;)R ƫp�5=>4;܂y5 ( χ {')jR^oT, \W̠s 2ٰNGC;j{Z/#%j2IHOVWQ]S;uQ4bM|+w%[*!ɞ~rnuak*SR0@^[ZzDƈ@g̴a#e{9Ox gɛ u T6`i^6rNfGqFۦA]Fu޺RiJ\c4s1 }Ӂ#xgB[##<(RҖ0"齼ȫD@KBm3KW H/\kbx".GN/Eo{S"c4C}V2ގ,}3,f'2;<顋 9ı4V .xvC8龝7/6뽝W9kdXN3yyn>f#$8T?|ɽ=F1e&_izܼM[锻B8 -be<{6UqwŔ1#$&hxP*s cc,vD-lhs)8R0TQG ,h2d_\=[d] !O&&:p^ƌO8ed y񘮕R~sOM>ʟy)wG\+\BΥc'rk xSx,޺g̍SXxDk]8YgU1cE3<0+0-4qvN8'}/;bɲ젏8pjyᦁ7sy=L7D\Ƴjڝޣ4:pmr FŝlmA,ȕK2^ܘ85.RYgaSB/>41p",6DSdn[~9aY[ 5C3}Fdu:о"֚11K S;<M&oxD6w|vE~tY}O ꫢ;GwRwOQPTQf={Rn}朜5VacdߓO}nPs4gt N6yfK 1!'I% UNH5rU)Nh6}iE}1ИtB* {mhAhlN#RFu-faChhPuRP9nT>"c" #NHu$,`n۸X漥G>Npwy|tZti0?+\εަĪ7Us<8*}WY?˾XJϙ1<y$Uq%f1O cC*k8rgQsorǪ+YKE^2Z?/x*^Pܚ:]P~tjBcMx-GLZ$ᥬZ)$H U|Yl c8A~+Y%9OkIO*v6ƖxEon-sy{TbQ>MU쏩e9KbE -rNo5}j-g#+(E˅a丂?3VpVL+9Xʲ/yAØUY lJvR!4Q_[`PʺUnbe)k9@;]ts=B# α|"sUR U|ڋk"@)=$*8Bc8_5K *6V$ [Ɇznw M;5ݖ~OXkNg{RBShl< V=4Ri )u#%49wJ4ki$d3!g} Ys$?݊: y.(UF.OdhI5Cs-ÔvkSNZvu)Gѓ6(lÛ31SVBpo[p'8g[M1 %1EKFjʫjplWCᗋ{4/1B{y"oaCA`j|)r\" &-K(gtDYYݗscʬ@Y2J\0Zz q5Fu]: "uVȼƤWpVTX:vK)@H2Q ZbP$,wG wl|/;-ߜV2c5O<ǿmt=н~ lns?Ƿ\c?4yk,mtg89=Ծp\G3[XW9?~ė8>/)s>4p'>D\Fx+&�;XYF1[)O<wXsx˹+8f*|1 Ld6H6:V/7F *c81<Y!z⋼_NW*>]3SC=ƫNߢhߟ&fSԥr7`;uô YxGp˻"621+߰uf-5b|mXȬmCLE|2rB31Bx#eżĆX ["K8̗`}껁$M!HfmсuIS]Qp gD^}& ,'}!/\ť˽,jΝYMb>[:_#ELpgsG'?'\P]Nb )NꌜۯNR4!0:o>I3#N궱`cȈ@pz\"$_5Ȥ "mm*rd-&ai8I~uCm5־T wB9Piڒb@z<ZKlZp[?mgNyև[{/+BW(]zujlPHW8|HIJ3ǘi*TT\P7Q}J# A>tCP].vT=R^Gjzf8.tti["LrT"B}z„S#iuɉn9efyzf+^`@=LhMIF ^*R-뇥TX(! FN)<{{to{oIBS֙K3T- .UR ۼ8ĺ8pD_cϽ~A.f5<…<tIml g,c/Os*".HXYESFǡсi!ud*iCJ 籞yB2bNe<Uޡ|i d r/+bj?q>uˮhg5Oa#F$n'h%SI; >#92̥yL :b}i;'[@I|H8\owmet 86I;B1FFAcu<�71?7N#ޤ(GҜb9zZؙבgdq4Tq+y=Qgq<K hfO'죍)D.\U`<"|ā9 )ae<sS̭cmš5vux B>͝ѽYD"V3*t%Y8919T" *hy$25eDP#Rԣ!> 3>\Prd\pHMt9qQ;sZmJͩS\,\WO{޴iӮt6aCeTy7;X+6) nW[3.oViPΨM9R !!+'-c`& qVzuy[JD b>[HeiE`xtyAJ2vM /M5̀UԳGgJ};#OEy3vn>5BOw qRyc#+kt;煂FGMN{/kKk9D-36pY΀HCȿrSRm഼Dqu$:L}FsA!'+zrjgCe;Yy! c/5e.i|&7r73Ҋb /=/1W8}ܘ /3:ȑu.lc,h#tqG̣LmBo-jH2ha$H1<.w{.lf*CA0iU dgkB!6@GFg ef�Գ;^1Tc3p,Kc{}j$O39Hߒ12<Z'v&d"e9bhCY\M' O-%6Z/nj*_|dxY[7qL`_Źi2N~ WIC~MC!#<l?^Jj@˹&Z+Yv+Lx\5/9?&r\ǬC+CS"{hۼz-2ʬ=uY^CAs"kDb@1{hbCNoaK?9֔~Ϫ~xA>0#iPwGQ$Lsۋ$&TĤ'2rRFU-Rᆥr: U|.pERGdne cJLڡ>%eh-?\1˹I%h򤃔N^ NmW?Zp]D-}EsHIlRׯ˦u^ӪW^Ek`G׬2& i 4&oLA+UEBtP1 Iz ,4=IG8}ڂV֧\:Ň5 EС>Oz>Yk U3#'M1LeA-yά$&Q}*"OXւCP5 Lg C# 8,Oa^ $YI1f8VleyI?[|YIgk*Ak=Ż/Yӭ9FYVp2\Ȃ.q2irq{$e#h$G%y.LpG]1hc(?dK 8H n(T\K)";Coc`泴1#;AUvwbO<!9qS8{bU#ͅL'KqsLy)7s-﹀X4j9Y\ʁ~+-,R^ ͬSe4m,?*Sۓ bXҸ_83)<ho2 cf*tMe$Sy#~,_dװ݌cK6.^j8Xj8K}VRT�| I*!JHx#x/RcEkĹV6GQ`OC6PwQ(< ɁRòE /dI.-M!՟9I?X{9ƙmz[ul׺m@?X}y77{=|a4dc棒Nfy$d y=3gF45 #04athoHm^;8 Fc*S.`L_t%M`,rC%СB[m@h<lCVg\.I-L.H120)^t/_?v۝Ug$Kdɖml<cMlf y BJBfBIMiiH$0 a6l1lyY{XAZ}ܷχx]_ulik{~SÛW5^wCrYou:}IEUFevf%en3wSǂsSXڢ_?+O}:~=O p< *&) 6@gMIL錃v՚uީ|<Zrᣮlحrʼn0Ji.`ijT3O``lslH?+1㝸?g*_qBYā'ÞP溵;7Yu~nˡdyf:}4-^OO)a<y<X ~:6qtr-R=; FЙrf_rp _,e3臨=ƺ_Ma閡L;7h.d/=*%SJIs\Ic[8= g;iz oK]YߦIKƛD'2! ֭+OJ< _X .UM)lZ*9hO< lyְI4sw͓^w;ᓴ0vPd(}D3E'�3MK(OCa#_Z"xzVp;m?6aw!TbJ8p$;g>7&SIx|%<QnJï~Kwo /u$R튾q/c.wPDuFzzd%lF;\e,, !n)Q̗= Xyo'nOlrXsE_ _Yk jSOF%F&iFqW_Uo59hiPŇ\$#(1{Zz9nT&Rl)Tjq?sF$P6̨Gh<oÝmM{Td^&d j &/8LᏝ~՜vzv<^ң 78ħ; G$h ZKRo~E9lX䶢S봉+#"d\gF$2mNN8Z<2ÜmA j+{cy~qv,7J|2ƏuȢK'~U|qwF7HaPqji贇~y3L(qnҰő:_Orow:/Z` QLc]X_r}2^|wYBls-;\ƣlHg$"Ng.S9 )i? 8#z7ћYJc YY<T$u~'G~qGГ#Oe쾃ݒ} 6#31CTs0kt5ۙ/>ռé\KH+ҝT0!MGiDM%8:6zٓK_r<>["Ϻtk`qXu)BoD>ƣ,d,u 5PflߒM�� �IDATد`�ȟ33xp?ge;SiʻDM2 w"293=\ĄfA>N-XwX=*SBV Zʆtz8v[-|65xyG;xMJ*{ŵ+9+ ec1չwsO[uKOU\ѩ5>c@?tW0qr&uAvL֌�YËT94GK,-eEPަ*`AbGJ#UE&Ux=ഠ67UЖm9NQsiH!2146+X|Xm֌^jj 1^,NdL;*JTڜ׷LUE*<88bbAVT# 8мȗ>S搦6|,v 3$72:R,8j\ jɷYǸ,DcGr+*x6qw|J2ݘ;bH&ؘ1{lgRUeK@l}d*w'f w[4ԓ͞lgGKF+nHF ϊ[rկ SY^ |gC3y߲)Rhnz=r"J빊{s[XLJ '" x}Tď "d\z~x Y/2{y$C8ߤ)e3 S[{Jhjޡ5]l4PK0LaVJ ^?qU MM9ؕ [A'M4I{isX΢TVB,W7]BI̥ D/MuR8HgDի2˕sϼ ,:O^MÅ3I5~t<RNg'3yI{1D42sY˷#oE. bC֚h{o]슜 Iđ<^A%@VH\0X=Bo-;_I_%gyu_}iij޻DϚVƆ:znzZ[[BSKQ유_I*L-(K<ǘCq3k[4ՕUaN_>Ⱥ0K:lK|0,6b,QaH'h.of4ÔP{\R T^hDiR'rFd(2V pjZ6112kbWt:.ȵw &r|Ai mS#Xy}*p-1҇>FF$rc;*u6{^&v[I(Ĭ2@.6O<Q#׮<"Lk *7-\B)#x-8u.w%Z#p4xOK ^ .ȸ<UͦŮ z^NYǹ]2G:97T0r ۄQfۊZmQi֏z-}H voԒ0ƒ/Pɭc7 ݙ<_d'TQLJʸ(ȢHKﲜk\DL)NDٌO QI4ޡwm2i)!QV:^pRP861s .SbG|=җgXP8Ay1!(gu3*㽴ë֨{b5a M'ծ #1&mqo,MI''X:H(_Ő%UQδ\^NK)D91f'87S*2Vޣ<ɡi1Jg3wt{ S/^o>V)bf5rgM1s-I]#&S,yI2d~T*3>J5{7K}VVzRv犫5s <u|_Xwmx7{ؤ9Q~q_lؘHv ??h9WzznO= J*y,TeH炧"A# b[lm0[\qE, Np+2aux)I)7N##3g\>9A"븘13471opHlXP@gG.hcޱ'ckIyY#y4cn΁ 8z2tdLL>"3#YhsYw3&DXE|VK}c[y<\gLN7;2TmNPK>ϖVm3hwW0*R<uAߌ!*@_jX襄mQ[bV~(3>@XMhwJK7Ȱ`m&Lhސ]|y!g-W2=λå,fOphꩦh<T<H-jsR>~|xr.c1g.5ISp3FSsl 22 e{:j Vr<m\@p(e/p<K"JIlœlF]̚zfMAi:3H ҕ+EQ\>Hcoغ#SQ>uKb/U?!JC/?#Wd/q 金؞fHɄު짤񹍩\ݘsstO4[ igy WKPOL)uLw`WۻM3(KMy[aǨsE+;X?.J{<T2Lg/U3ENr}ͫAfΌ Hd+g\Z1 3,Ge^z9JeM$cB7B>.:n779kC(ݘܾ%\78H*6D/(3~^%Sr5KMf\u]ĂWH{XI#q`rѪą*R짢o'FSZv9TGZٜ/$h3!^<gY#vou i1Q:&j:ƟJB':h`H-ң2T=j3IUukmCCבm:yͶTDRLgo96ذi vY}81?,1Sggf.q -5y$r@y:x'͑%wK .FNdL䡢+ꃍ[#F-#^$ ZS3J8ݻ[6u>PZTHBA-p _Yoq+2$<v|ٺ c_ y9h4-X ͏X0+X7g9H[Gm=P [L)�^mcY?xv =vss1ۈWmHgTgO. ^9ztN/%PtI:\ϟH8;8cxcX_[[FFQrlsqS/OkbjNjㅈ褙5L06~tRd[!ʓPd#oEBc走/K3amY' 餍%K\Y泼ϙͬb'8u>0)<h]4eT x I{dxEla \˹)<y|'Q=d t؛E_.Zq}û2aW-e{ϳ;'M#Ǎd\y5aV])t`Mw*? N.є 4zD`pƸ^&M!WjRȮ%{io#}]+K:P]y#ˬ/:5щ-i"kloտQ`w >a~;ѮwO\22ѨȀE ^IL(s2 Fthm;XYhz3?Mzӿ&Ϲ,8QH7[ RbXфZq"%~Z:vhhFCb}wcY>bRг-Hvz_[)i_&Ϊ쥶_3f vf|5GJ?voUd>UeL Gd7-tdϪN]g2y( g-+ ]z1S4ò'CFboG>vC2W}3a&94͌EKSoSqs<̗9e43-5w]C ֕kidȐ<N-LZµf3bRO)/&(uv9v4^5ՂΦ4c[8Ml}QO:>bcƟ8T Xu;҂10rTޯulIDO_ͅb5ܞ&r(k⛬N>s4滋t;,$Z/.f$Sq{̦9uϽA633,%ԫ^]~6V.VSJpF&VݑY4!`@Y@:ifq ҃ <nnMwc.#b.<zEz3*D_o /且` bӳ.wr{r&뛩O<R*gOsgA_6$b%Egpޑ8RL'Zƕ]0+ecF0"/bE5mDEOV[9Vy)c`EҧFMJ(m6+24QkC1MJwE&NLgo EzzNI>oTd"G2G ~YӨȓC\UaM*rQ֛UsNI%P]`JXUKeK5Ţ=5CMLv >L)USeT^M^HfLq#2AKyuMr.x׋nhfdԷ+vUi6C2>-TŚ VpNZ.x/vY0.M1ǘJ5 "}YzUG: RhҾƉQu#|L_M)ceA5+1 4Жx97Vd"b%1fn賽 l$v0Y.fntU:Y)}_*` ,e&c*;#3cc)Ro&Ye7̻|RxBo1)08�Lx2/Jצ:_O ; a*YJ̦4b>įG]*&J9 %L^0Oea dxi/ǻ9zD//<nS Y?OLg2؜,_f|1PK?aB %<s1} %<)乒Xd&nO/Jmds kНdڟF">(WPF/V@Ƭȵe%:A_ ~y냧Bu؈:2קz\sw> cC.+Λ/|=\9ߕjq .qM9CO;9̠y ~Xoh^Us"rl'p&Ց3g$4i ge0<^bGѐ"<CYI bB,˘[X0 zrImbll*5.TdsNS _+dVG`w/+YAew;\UDKlD0TeíJZ5+P,W,k8ՑHEd|3kdvK8i\֠mBlVXi0N65UE|TP׮6 քu;"6F[ħ fE'jb"-)^1FϢmyKvn<2Ydw/smy s?`UK跋\٬Zȭw)EWZ9 m;E*CKnLQ7Kx*T27'2h?d#l?x\fOj\O점Wp)LJm] (/Ycy5%q3ܜme)) \AצS]>졓/֧`G >)~<弝cLCY^HNrR ҋSi9>a,ȧb 8Ds h`,- 2&@˩ 6:E5jbJ?$*OZtHz iyҽ%_v#vtQՄ ֥Ӎ,L7Iٺ_] pe7|+2*h1XJNK/?c?[M]Tdk̓1fs n&g\Pa 91"O0&.`>ﳉômN #< Zi`D哞_"CMlp삠_;9l_^h֙lidZdОw<KryΊ8mjmyKgj5;8k̫;@6FUENtl48ʃkVؙ95q~Ǘ&צ3h(u̒:'~INjr9 Nd >h:5]= 35.j4KvVxT%YSYwjΙ鴂 ёaAUFoic} b=9gVa+z[cEuyW:P1`mb9ﳡzH=<No7cAeW0!<lfv-coG. N?g3s؆؍L*.J1 . S½eien>cif? O,)LKΎȵ/ٳҡ1>#W;4g<�_ xZ;=Nѭ?n7ItM яXϱ4wFяNi\^Cyc'f!G#7d Ve'R>[PsTs khI Sza'22ٕGp9H-f)Miz><~AFFsLPR3ɰ4s*|,NW9#z"a[fw* \ȋiQ\j>f~F:,W'?]єkcR$֒6$I釟H'3<An p TDb8?%V+vyj^&WFee=X>E:jB\* ]Ќ"~wI/n'd-ܡY⻉x˶|=}{h>=<\oѻ\;-N%N|Ӿr_ vKhorOP*'8󀗮x>%>mS8`mfpvԭ-9#LȘ:X9?ЄU⢢AEClI$fk`ΙuMLcl)3L~Ţ:GƎqa%: fT;w83Nm4]Y%cc1֐;Xù; K+Y%EyCe|S\bL$7Q[ĜN  .I ~fL!30owŠw"/$;/E+@PNִ ],#˝RSO֒e+=6㻂,1?1$x9N}8=( jx4NpHo$N zPJ~%w:Y۰\;(cabSljnP>ʣ_y'}Z=?)jvݸ5ʽONߟg"8X7VTLt( {KB_=,gSNDd69~.ed 9qȏaIhc,e'k)=Gq15L/st!]TaY{<ʏ!i&U'b d7;Os7,US{R)tB!wi6\o9DTU1Qb פj[dLo#<?ϟbO08BlEo^H&�� �IDATJ+<v1: wvq++4=$l''4г+eo"\h�$s޷+83;r]|aOc$Gb=#3 M3Ah>ew5DF̎>#?zEnhtQE!`~X;6ڲ&6EEUf%"W5E3 rv--Vvx.R`_2;~Bבc4dT-jVbEA(+=Do-uĴ]ȕ95Xv9~LeÉȓ<gg".3cx]^HIp^]N{m}*>**r}#= *:3QIXEFtW9-uIHEA?8Zw%B+eO >VjI)mkx$ȼA9a U ͊OQ_W2*&XeSLU]ȟ1e遾j1+; Ps81UAYGRn֞g`6i9ZS=r_Wz_eYyn.ۡe0Éx*fR[,BПmǩ6n<ͱ_NO]dCa`h+&^zJ:mdz@=kxE:ݙKY s6LJ ]aE0˘á|՜M?>)i)?e}5!bMmV:w'm1=Nw+eciV�&uKU乇{adEi6l܅ u뱫6'"8)ЗrL4z6pf<YJop4'm- ReI)an0Ql`|lnۨb"ic)PI[28k%`?Rթ7Tҗ]J1sP<GQHgdm-52izØ\a9%<N+E{D32CaKpF͛LƹUп]燣<֖+n6{¬Ndo aW;s3}'<6%zlN7ljf$31Zf\?ȫS#7eB\碬3j9RUVY b&\RٜHMcf:+eifVdxpJlr_HJE^4ëȎȸ~%彔XH袉kRel@^g)**Hմy6f+,k#NlJ>u cKd ÙlF2>Y6#[Dux&e /q0M XLYGتWtNm=1Vh3".¸}Di94Q͉r3<aQ nb AHcAKKUuQ}I$bGʰ3" zU E]~?ƷF3zNr;3ʮosTAUR9G�!!!!mim6v;bccM9  BBB9c*pj{g͚5ӽfwZ}utq> mzu`>=ؓO¤iC6 #3#},wp81dL(>gS&h m�nB  681ilXd(0}8@1*6q3iGTl<Qى|rM b@*eD?st++9jO}RHv5(/PBX{R|Tļdd�<bzҍN5bmIENi !yVRIF?:SJi-LN$#I5,dE3ɋ3^l沁C`vp!tHɮgocz&r 85,:,طlmon|c8-Wd_)1;}W/ֿo <IQkpMy)o!P%ֶvyy~@f=.3_rUgG db'Ψag;C\5_4]wJ$T1ΑwtVtЉ'Ȳ@pLlE?v4VsZנ&kJ)Ցqi<=P/8BذiEҌȁ/i_OZ-0'19 *xLΠV[GZJ;lqu)zTؠ+]67bs:>l~-ՎF5z=2}+ǺŞ(Ы1f=eEU"]"q`ʴsfd %+hQtL)kZby֞]:bk*`rVV Lj`pqd |uIlY҄S#]bax!ouI}lLϸpfl5?Nm5e{l4wԵؠlY{XE?k3ZuN0#]UVpetHάaOGMuu\ѓ= !9-A i$qQ쇱%-紆48=I~́dso ȇ։Ǭ<FՎD GELKAYDxM?ga\0,Dv2U 'vԎO&!=O/s "Χωl'1̩͜xxLc'UMUHdP2jF8K|T.yZ U:&qj~u<?y'9V_?[.^D ~3Q 0Kؐ#6Qҁ,PZNp6e?Xlfm=P</:qu 髈l-"~Ƀ<3t`SiSau ljex1gBO7˼p7?{s/޴S>vEG&?m{~6CjN.^Jb?Ij# 'ʉ1,x<ց+k, >8l꡼}kbٔu}gDXEkՑ[95T{.;xԈ| ;슠Wn]4J �Z#?11zrv{36i_34vCA.>h1,??6jJ ȗRYL;6)hy;0vf5䌯 LIi}S*x3ɧޥ16ʹG|?gk/=]<9ٕ2.!1=5FmEey+6yp-7?^MЇM\ͤfZ@αcˮHYlBᢌ+-N}WvFXlJO˿Pbڧ~EXˬť,OY\˘V`V5n ,e$K#闌I铖a! $/S3 4A'x'.eҏ[˒3M$߲1YȽt@b%k)O9jxj\ XC<ܚqUd4YƫtA[tece$)YqB[YT2m 3Hn0#>կc=[ٞ M _oyݮ$ĪdK27.zPAF RnbqC\\>+'wVrCf%:j>dgG"\2{-f ҃C,95Q_WhMNa"sF6f$zq|y,y0Yr~Q, k$gEKtԾ\t{Q4mWgA;<uʏ}O/;LceFEsuߵUֿl}tCKbs<E-qߤEjcOfLi;{|+dF~YkHj-qw[|-2)YB*|y"[ѪzС=FNjC>0rvCzWHs">J=rDHۛȅNZծ&LhVۗMF* )+tKΦ Kt4TQ{Kvl; >.sQڞu`bNFПc8@2R m:ZAiǤ RI'L,. rd^KxvE~a9g򠊴Ñ>>L829یB[GjEaY6|G(wYŴxu};2KUWpcdjߤ͌jo2 ~*j$6}s2S # aFJt'#[I娕;XDc+9v'jO֕Njc|J_ag8XAPpKn*[>q4#x#I:W4%p 9&JW*9[^^J\؄ԃ\L!9u%FtM!p}r.Ⅴ5XkWsKCm<_9$_Lڏ-I;5XmLZrr%鿤頭?%Оt0C8ȵ!PHN0H H]VpױFz1} 1 }>J†gyRo$ s9b&Ulv21N{ZlHI 2=JYXEfqRƗY7OH]RؔF tVUGDz{(dnX96u[>ω3y;x Bm-WEFV΀Ro6Eo;oQ(7mkvLH DJtV3Fr$Iv&e|[PEsJrFM)WTYo$MGHDyPO뵋H)Tژr0kcbekHgג3M~srl^Mя\RӋ4"SfXGm4ɦ lpRշܤojRN2FnJy9MEyZ?`7ˌ;b.[sKdThj V:gPu!;s(T[767ilT&PWRY*"#z(c]mG,͸ +ZZ}c?%lmϺ32XDJ5gGΫ93K8Ho<Zoы>}#A/SR43Y fXO1oFRz M5X.*x*ɏvb3/1͌4JNm>!<gguL#,ƐD< a;WyteMgNHfy|~k#2Oz;=iC1*&jFJbXÏ =Uyr^&䛷IӯSǰtD#}()G?yuTEL_VC==y(`;%FK%-!EG3 0PK.ꠀT1aJ咔)@5&y�_cyeL`&8 1.c4s5/\TR*Y+uZۇ76=l칁qUGDEvŃ<ޠ3{D񑰭Tzs+b)i2&?  6m }›iAS9Di6Tc-6x&{ ~|EMwrrGZ=ꝴ#ovЭ\ޤ%gD&eD<^ű' WZG[ 2 s:(˼<Z2\qW=j}[c]J-.c;jiUYdOuvĽE&Qbai_dy@'^I@<dL-f?Bd DEލԳ$gz05;rЂr{hOJvP쏴 ])AA5=\S %7Gkszdjq-g Z o85MpNؿ,68,CV'6XRYZ<ӞWĞj^T+RlH-&R~Gy. Yk|;!_=9Z6#1 q?ݒY;:Cv4%)ԑK^mwQ6*nشdߝB>K |d; Ѧ9NbEhɔjL%nvs Q)?~v s ϲne;HǓxB&&m%ؙ0&$85s+B *3B%L$6װG>r d L W0:z=WukUsTkݽ,#$ZEbPK)sgTަzZhJ4({?k'vEOV5t ә|$X&sQf՛vO&kim@żJkX`AU`ZObM^vL7=;`jzx`;/#u-`|ڀ\IHe^o6b63tБj̉Ag:f\{yz/&d9@+c}c. mqA_2%gpf#2{kܑ*9AO63HCv[0֛]b;ڌCHtĖ"рت^7jФg4pNV*L+mR&wgrjeMJusW!8>;v$j̟ ܝ62K`@Z�( dQП_x-8-Kրؚ*wMJ"`ƪl0?x=V~Un_n\~C;m7wp0xFĂtġYDk<7]=Ƌid]6d_ m[ߢ8mvİ1N62,&~^3oTї?=eRӷ`I; b(*9hާk;"G\hΓ]B8)TI &ӡ=JͿ-j4ٓ*D<M=&:P,^MR4l>J6xbkd7'">j9ĚdN>7_;',%g] R4%u3N`5KOA͛%xdZ؛|LU?, ͜¦VI ;UPtw-N"ƻ%<a4p iI'I<g* xW78x\zrQE5NX-fS.|A牓҅-I#[JHq/` uN;,O { ^:ke^nhZX8(hs~i-n-svWk i#6@cc>厔X@ci'5'Rnʙ6メiz]sYX`-wη/S3NMެUHy \tJ]ͮ6<[CT5Fj`ηzvirq&/0A=UY j<XU<_1:K.ܗuU\ڴ:M`kolj"3LAuD3b:/g\*ap{hSڐi'y!PX]gsO+d6=_uُ.W^a-QuofLi9WP߂}- ,\ɀ|6ݸeS"D-8'}'.O>;qZ5xď\Gz(.6 !ʘ<BW]¶Gf'8 "nˢa5kr<Xg0Sx7ЃSi"{{{|0b O19.me�+d$Nwx+89weyBǘŀ$'By*r64U m'ϐ8Zn c9I\H\&1W1 9Ub]2W$SXՔ|s3s.&x3r죖cx.يs%#4S5n\u wTME=Mtݒ9VG*h m*f&8SMy0x2t$ˑNihy}%2.8'sSF+(c iYl"#XIU1XVb`l6=eEd|/E+8хZcqޙ[5m|34�� �IDATt~Q͜x؝s<~+N &sE_cs'aw°j;~hc1'8HA0?4aM$ǐBrH#Tˠgw{k׽c3ƅrK3!)4i[l-xiJK\_bKUl 'Kض^OW}5^Ȥs~vFYCć쌜+ fRalbG5 :9Ŧ9WR;SE]i"XrrvE&:'q*Kȸ*]b2>t`NF ~+D7?.)鶉-On"^YvOU883zw[Strg|E[wNgTa@̔ /fwNMN+9ꯜo>5][O;ww+r A{FzA_a=#oAE\޼uV1wI3<EkYF+I5z|q~'ynIVL.c+_~Nc94wT9젊Qyu\A0{Zu<l%Guz"#թ%j6r;YP@wӗ4QNR >KF-ʖĈWΝid#JЍWHa-Tr,sԪ$_UݮFrD!zV0>tmFC a�ݙ 85a8EXh#TП,xC:W$ӞLc*y/e|‹\Z𕴡 0蚜 G8iӂv _lOJ)\_Ů\R^kǦ6iwėVpЙ?F7L/f A){~~PuնpW>ҒRRYJ SY)C#)=jNv_5%>UB<XǴkNu} ooKXMei)NRzf\\ Vr?E-XV;)%Z=|HHό>[!.+UrYz["2f-A6^VTMsVSb+Qo0*/PQUt%.7Ş W@X )آ.݆bly:.tZ6p\]J7w<{5W-;E:`[?Ҿƣio;n~VE^X{s7;5n*MrY]k럼~goKp={z|1n8LR_Sĉ)Ͻ=EosA!;jN�d2NQYpQD+?s|hJOcQZ?Nk[@o*m-_Y;HS&0gk13bVю8}C )%\<Gi_&BV9Y_l-HGVmC氒2O"ZBp gXv~ B-3RJO=)a0Џ}k(bQ翻\>V+3'b`z"i^J_ ),C:4>M.x {ILN ؟׎$ v)ߌ, >bb8u|$I𢔿L{*XI=wC>n K&XT&.)tOp!f 2??nMvlkdud{Ρi*sy2 5l=۝~>wdYFSTIvʪqA/6EΈ툽9<\ы `&"t`KݚݚѤ82hdx'̠soj &39Рs&2BPGrWto6XI 6z74˨S LMTb1fM >fxnZs+b3;6'P)ހJ )Mը1i3R3'sVI[a$rybɔtҭIkJ W ?W4SmbcncUA|)Wn{W>,ʪP2?n(W9+awZ?pԚk"˂G9ЁkzOQQvs'Duug<{e3!z-w,zO̥ c*:fSb;-L%oeY 1A`�ML2gzwL1J*AGH3D>4.S.frbhlN@=#W21g3\/QC(xQpII5�.qz%`JБQBL '>Uә=JpT<q Dzg&j|.&2i/!H9ygrX.E\{8Bo`sxz>O`'2!ܟd6q'S|2algo0aR,XZxuH'R|U [> j=x|Dx;Q|.eOey}ҚvKޞf�g̎} a}fL*cBlC0Yϗ\i<<ÐuV4}/naSkqz,k '΢WOnj/)3=t;Җ~M<Y Ox~/ប[2NJ2%/ )+Þirg2)(lQPM9=c9Orb{_(Rάf:KPV" rDՂ&kl+0&-g~D7q64˷Iٴ9Vcifp_$mtLNk1cp<Ն潴24DZ>KkFh-3g˗> ϴ~R',ݘ15b4ۗ9@N3L! }iuxOkh F1=gM:Ӈlq,C9Aq!3Y0N\̽_%)P2fx%4vӏ̢Q .$`&11iL#G5vу0iNY]U\`jOg"oQd!;VD[ȲVm=4OhK9K4 vI+*~ȣd _TuDN/%v69wAcrx`�YH}[9|p.=b-X¶l*f#LQ#- "_o\@);j5sXȼYxX\hyE,+YG#ŕjgQd^ʸT%ԐTG6\%DT~4bGƥ2n}CgܠA:rN w*c'*VOBm+6kn߶3Q G]QC˳3o}=،Ai ~^b5ե9InW:&G< 2gw"߈Ksg'}rrڕҥMul.WƴiFPVRcd -ҥXScC*T Gt/ZzrnU\[Kzo>?Q|{U5m@/^ce|6mZ$wcGs,y!8>(*ГXCU,Θ\Ʉd$\)5igUxwtYvtEAAh_Pqr{ֵъHjf}'+SUd"[^}<70E'_bNon˨ eW{nN6u^z[tQJ8OEn*Eʘciߎ-)th=JzqZOۚ|čf_Ϭ*">MϱM�~:F0>2YMydПq {$73;iF=9sx *0Aa='"Xb;GՃQteUy'{ĊE}mI<{Ns)Ӹ(Yaf.-TS$Ij͜fnd! NITp!C%E6_\MOx(`Li#yLry4$8: qQƳTӝ aH>7yUxg+Wq[FXJɾgT}wQĿXtO叱'Ӵ&.|!}zu|6w(*ֲkx#zz'}cf+;Y]FE8cHcxq-{ XA+˝x0.5k 3ˮz&㆜:gjiZ}z-9Z/c\(x~ȵ9e+c)Ǵ#i}#AFΡ&' vSAZ-)rPߜc'alrf5Wql Be;jz NJLYƅI {U A/66rZ\2E*biJ4%. NJ*[(J ˸2)2xШR6YMX1tMg:==n_x}Z8f|HĠzjgfפ͓h _ZyvjN|0ڀ!E~YEG=B~%7V5({U[Fxر`M p O1&&%L!]8/e@dm,{ɱ<f >QJ=xy o78i<{WC{"=8H37;8=b;{]Wy9,ٲ܋ܻqcmz7R &eȤg2IH@ );6q^pw[Vqf>kYy;{--H{߿_wpK uZC606 ק'97s~<>eQI2E LX`-֪24�0̡}dZvP c1%p8=vҜ\:r9j�Оr91tdSWF5#Z4wUwz줵ꬓIwp"5(vu> Gv`1{yXCki0#*v_/3V)lf EHQo>Пjw`逸wT1Ƚbczda/[+kl/'1|&,F.ű+ye[Ltj}M} ,Q~^UzFlo\1.dbmߤ_l@QT%Vr=%魴.[BJȷޤ`]DuZgvG2Ż}/Q7!XӨsgBM&NtvVyl$F4 M6gS1"H޺&Q&"̰kdRKκbo9_#2kbm-r]+7;LGuoRM/*Aes055+87gF6D;bS ȶhjG/rX`?ccXdp8oY=G|#ǒ=*_~藽24BcΉ6b"Gcx;G#ߎwG*3'Fsed7dڜ f1Wʃ :~br*Rw\8 ^ v5"3by)2D>D<@[մ@1VMM>'X Z1+!Fjy? ޠ3s/2Z&҆t>-|n  g7tdS\WvnЃݬO51e 3Vgi`i=CH)U$˙la[HzP,-UzNgGX}R!ik\v_N;=H躔T8r>9HWb>l:v'XCtri'giKEdkDh9<> 4q>VjxfKrN w{>o_."= -b^>_~Z:c)Ҿ6щcddhPHJw[bÐ?mϿ]8~>ѻcGZs#3 +q(ׁAmpaޔ&\@Dv6[ M3v$6%c##ҙ5N F[v|Y= %Hx'fvվƜ EiVD>g[ XygYiMĚغ]<ʲR5"SQ4;YAC`vw,ΙKf'5Z@5ؕm5ȋFv:u6(2,14]FB�GC<O*f{YøEf7CLކR[Їm.9k|:QlCӡ~=g}%WS .UO8΄2lDtΒ$a.ìÀ`8Ddq* 2`Y1&БJٔξ҉“|~G1@ I)Ѫ|:*XOHnC?VTك DJ5s# j+g\접٩i0PSy!&>$HRnhqk@#K5¬/XԒHs!T\YDNW'rY4=Q2FqA 4@1!tM W .?ic?׳RJ4rC|rϤib'l�9"2eg}!99Nclk+]Wm e}*,ӣv5g�y+jm-۲֤ds9^M_DUg)]<8X\J` s4vyO$3m,0`m`E~hۆ82 R7W>uF~=ܳ--"/^n6,̙Ũ+E&8 d9/fݓx(c_55fj2DFvOeāCF%]H+7H&5ZDDE1 * ) 5өhFI[ef^sްEn(6Ɠͮk!.~dJ=O3!iWisG2&$i&՚U&EA +dsr z`,ga%?p H.#.iAelXD&=yUJccu/kfed~bt`dލz[=Iߌk9X+TFRBk }ᬰj pX]YONw|+c,5xT89(QjN/婴^!s5MY >B6s;븚Nb}le@.^TkX~fs/*vT wڴĖucr"q8Q_Ӄ;E&1^~l,=Ww[Y ^4աU|t])j~Zr`RLCa>Ojqw-~*#iʨA:5a-m2[n0›/:~n #L)Jv}˛;[7E$:V`^˕<ɝ}g#}1izV?s?fo7Foծ\{?鯟^ri%M#tlKbw{3gQps, g#NTEK .LαH.;C O\x+ºA*|h 5Em&mRTgMKZ2WYΥ옗>>`l4+2FĺDcN$א1 DVpC3KӨOxd"_Ht=Le:ZM_qnXC%h]<'';"g&D?Z-m\=\qaʜnHwU֐M8/Śj?ҐuI#VEu}?/3&Q4p<sL/DcWݗ wYnwwp}gk j^,|@7gЉ�� �IDAT2)e._/i)�yYKa(d*҇d+ůҍ&Sݬ,8Lw`̣'~1}Z%g6 h`(I\,*n`C4giZnur̠.m"ohJ9%W+C,j˯9?m#;> Hx##$g3Gg.Q+O+߼\Gt5S! s߸JZ=3#hfQTJ&Z!Mzyw Բt%f {x&};C'NW * U͑St+'jC_ nwz{Quˢv:ZgƸ7kW NG'lW>>ñ|\ǜXegr385<XG6EN f]bnǘul5%L%#f#Rhf' zIG3ԗt-_HN?lTd:a6 lxĞ;9'lϛ;#yg;,٠cA=%cP3yxBݝ[=ӓ>V4s?ɺ?@Ё"{:F=iD'>?bd6k2J AzQQYF62QbFo۪}"QFGA$_{4;%yyCgb;J8XI}{_ <s( Q1e gƮ V=[RE.Nl?|b? "ڑЎq%q6!Bc'Ӊ8tgvО縜GyE1+6EOa(v^Kρ>EA_.e 9@1 ,I1ϧB:3T^f? tLs烨b138N#gQM/3p94*;G|0TPKR;ґN|R5}\^QB[$ca(aakn3xr>Tsody`-tK!ė2eY7F| cg0Pw1}•tMʃ\;d}˙Y'3Z#Y53/*'ӟ "cc<Csm#p#? Fz-%va1mY&ވ\ 6yeSn ݃,N8#x79ԷsqD&ݵ1'Vhg`23K.չzZ" I*2K[GL0ʐJ -(>r˻Ġbq9,UjBY4&^vbW[)`LzxϤݸćFX ZSVג FZj J#y9$g}ͦVTkOӠ2Pl6|rW6چ& )>`1K4q& <^dAwrw\S!|fgs[fSmźV 5}hwg\8-\4?QOiؤڍtb,kxtP\-AoDwvԥj픱vlos8: -ӉL鹼J]7Ineg[` ,Hq=$wxے3 6QA{|Dc4̤n bSG(E`Z&msF}sF/ҐN?_RZ>r:bєSE?_ R&;4JzrяRZ]\IFNJŻt#2EIggԌj.c)Z8/'3Z/y'^e'|yO:[r.eO5,DNM&a9}"coцE.#a;p.IZ[*G:B]YVߙs1sоk>+]c;zAȣ#5sѰ5#ْQ Eދ]#8,TDDDN - PcP>2$YT ) zG]oS>`73TOL͊zBbkM zKQgŃ/3/Oq[q bs$t) K\UHy'T9Zm&nkr*cSq<N "nvqMmFC߿cN>{M*3>Q|ОH}mu^gM:rVdLY8Hd]O&s⎼ÍB8CW]]^!oFӂ:>\eedz/M6 ^0Ef v03E-w#әZzRU̸l6\o9>#nНy$0|2Iea~dO0Qb:q3C\ĮY&r;eaFP<jI?U)i$ͼ|v]9F~z+O.|4&݊XGӵ6f?ҟ}>جݩ8q"YF ieDD'AkV|&QK)+_/C iqr5a'1ܩ%s*r,gw*EO x-笔@x.YJpM #ӛ r9o]™<OOjR^e[H;4Y<,e;k9:?iyZJڵy O D?wZn_gsÃmoyB5<ތ|3*11L)y|,gECï_ Ꞧ?ϰOQYzЁn\RhLÃe!>>xG})]8DudNb.󾙘5kl'2-(UWbF}w8EҽqG#"XD㹴Is3 ْw8XЗQAh'oǼ2XYp.? ^o4ޤOb22] :b\sfW7zc01R2> igQs-9Jy- [46vs[J1%ۜ]~}١^><U>c߯U7AkZ8׳?5WV ĵ8^~{F6_,T;)Y#q;XB¥,ւ}˗ uavr7gJb'tFkkҦhFd$xS|=(x,c61lg?y*?QͧKanL3d T1' 1&I)K%b9QELYt*<LҟXD-'{SG�dc"y6BRߴL\O 70la!Xa 9`2}E +87rs)pWp)ljqoj}Yk#oPF5:-9#-[!g-+η̺78rK98k\xwS9m_65?o2^= KN-969㚼JNgW'$؜7><5ϦpoEQ%YOZ R`va^+v]kc>ϿmȜ`{NTIN)Zj.C#W¼#2*uw Uyoǻ`NK;jh[g3bo%:@^qD~y#J('n:U]A('v0.=+F4ۜޮ8NEV&(%8%ȄrV ˸%CJ=+7]QS}t<n7zd}1S0繍 Lb-oGd Ox)+2&oR*g4z [?vaG]Wg})l]woO;G#,ۍi^odk鬲3R4D7fёzѓ41*2Ρ3|0OX̿p0))t{ p G XxetlOwEi40Vkvd/e),5 =XC W0oX~с}4ӚI)uZgsVЁEK+%maq)mC+XªOF5=h{E?Z( &3KyH {IEib~Ir9rEMgvZVh,CDWڤd{YN#/CdY  l|ݱ+n`:GU9;sӏA}e+8l-Sx8qBw%t&qb!ʹgfN 3>pjbY"[lА1>soשuG/0vCli0J$7gaC.n>R;56:x9L,|J}:z=q@2Ⱦj _鉿871%vs0㱤ǭb$}b"erJѤwy]츲.Q͂b,նQ\}cAO^He֕Ή`@p49뭥mOl:*'jʴ W59!cEg2* T*7V5:5oCZBKbviX* nCгՙ&h.KmmVf1ln6Zغ͢u?J .Lg EFay sêzLD`%%_l^7_Gjv iUJy<20=jM,el\lKuRwYE\aLCc8DGfݒ6@5wPU(ӁYl8)eWH> !3y7_7KJpOQ"f#G#WK)b=')vٔq^:{)F@ù)`p),r#OxCM/I;&49xs'M)ؔ�6tcøKx?? IGkI;o`:-Wp% c|~z:|.b#ۙvQϠؒo)))BMZ4sя d3RC[q!Mj6qSMJ %c ()m?7<7>x,{ ?hҺگNќ=.bqe^"X poG{{{[`daQtX^k0>*h.Lc7Ǯh 'ubۋ>uwpjcAY؄@<v kV튝)_:;T ӧ9W6Z[hpVlbAuXhTbSv* ^22^Mr4ש;R?\JC{u*vaFfH]<:R~M,w23ӛ<cgT1#l]:5XaY &K-i4E2<kMΞgJk2D=8V" vبPvJm0/F2mI12:xM'.`Ӧxޢ75Vj6sXDwP:JŔQҁٟv D\@'zÜy)8:ibVѕ0-Q:90/l io(>Uh`6I)Ui@Qt+8"c>Ol:vЙbeHy0+Ray!5Wo/F̓}jƦг{x$]<"қ5) i`+=UL '8ŎM[NZ ӥi԰G︼@Co_N"|` 9jmb ~dN\ÒB`=xsҊ9;8]ngϲVK3e.b Kp'gJLcrHcc<@7W`Y6__?`~Mxky I] 7۶ H}XKY;oe٧1v.fc9Rdb FSqh>ELIjv;x39"%Qj"/" xY1G-5l qTGDN'#kDpy=rQdVO# ye,=d#rvֶ7E`[(&9ոl:b?m TV4bE Ji쉎=˨b/5A^cw~`UЎٱ|lxƘ.W[׻~De?./=ݾ(ܾ6PpN뻸^q. 3z7 ͿR׶ƊXc~[yp l3d z{=#;-|3ߒwNv]T[?v^1#rKȱaL?=>8( 涴u{3sXY\XH`*'"֦q&3<2�q9; D;'rIX- B: da2YG=G�1q˸L!?LbSI^f25^Vqgfz{NocT2cdDVI04Iٍ#}Q5\eO\u٘7y <=vuRfa3糎߹ L&njX|,}tf1[]d[a$ 89@ {/PWF 7˼rM1 gWedF9Keۯұ}u+;}PYdbHďB֢ol~r&޵:*Ró<͗~Wwކ6\^]nHN9L.BO/7yC$ ȹ}rQij:\Vw`u{pW/Uӝ/{.Bn(r_ }~ˊ3Tz49֑ٻukI58<Zfr3auGc%A-x-us>;ǜzuޣ6 ;[gZ/55 N$&Q86@a=ї_|Z# n "ǹEjnYT~b7R13 }cEӗ%+N)<JLaՅ@oF[7ݾgRUm'}JUO[`K)>V$C<PJҟL7;@3^$pZPYHGJrO4ThΡ(i)ʃܕrlS/ld;; ^Wf :~ =s8{TphLd;pY5e;T_w9JncJ7:ŸL=[9Q. 2DO%i >=0j@'(4QqJ,(jkyy\œn5_!~1L8&|].;b^=KtOtٖ9ZCȁVY%*F)ory8)2(uRͽ5"E&r9ߣ5ݙuKH+ϟΧxln&0"eYnaJ] I9RpPvo]34vԋ}iijNM; #K" veMO.ӿKKy$Y}s/TyG:UE 7ϭ\.m}`x7s0.sk:/cHwc#?]56tGHd8%?A;շ$t08Ƞ`Yy vI@X;W7ydlv{<Ԣ-.Ɛ_uÖ!ezFjciSTx2hSGv4RIw?{ }zU˲UcU eх%u}-+x)xްf_ 273ʮoK\* %HD  `811$D Bs(R^koOw9}7 T%\<uwYhO/k=Ԇ7RGX<X^|ǥ�� �IDATyW41ߌ},2sM v$=(|. jc/}ݜƯAW>|ަsZ2fΌ*N9븍ntgeKx&tM  &I>w\IMt'5jr!VЁZ~ LaKO Ӛ3)`'YDy"addITqj.fu1cLdߓ}.DԔ}IxʘA$~ 1 O5&K?L`%bSM pZ䴔SAǘQ҆JJʤ}#3e8Ѕ iגar2)ÃJk!OMO+֏)FwӞOi+)frqYzR-yf᳓@77q;)Xaf,[T Fz'VF~ECZ>t4-kq< lIv0e>cvJ~W-Thz;vvYV6gZYW  Zrqױ-Kq+482t/YAǑ82jv7ItcgW#kXeP=Af3zFZau2~QEQiu$μbQ6OIÑ/hٔҦ:Y̢maWH۴BRzmP G+\Pp2ҠI-57/1bo0֚ĕ$hH:RWgDjYZza x/%'рr3*,J> X8qf}*%ږ9I8b4 T31YM: c8Do zrd(;=81dE31iI*[ȍ~ 좒cg*ex˘vtJv0:-2C4Oro99{r{/- 3~IKlc(^^H4W'Y`;=շ|b`3}ihs'~4bk cِ}n8 1^ !7z*W9ZQlu~6(2*8^SE4d@VNfm|yAQ%<&J:r,(#U/ѠI#â >xCӪ#ݩaCE.<;Fʡ5N1VP~u}: ~Â;?*V#Su*?Yl\G1$3mXp0̟ZQo{) AYl#ҝ?pXFc4Р '+l,M `sLc%uAm=5?bbLYTЎOSӛWgC2l.֩oPW$HOd(AAzrw%MMʹUZ2.Ǜge3S+OĨoOOmfL(,fTYr{?K\iv</h@Zӂ׾ڜaJ5blGiVv4w>2hZg6)!VjƍݼvYg K<\ba0(487 ^^w" rvu”wYJ6sWʏ`gڍ`q}LS~?\g9i^>Zr)<D˔s  KKEt$ d auUڗ`^s,ݳOF"g&g'#lNh~Z2-YmXޥ%;X-XIl{0AIK-0'mY0[$SbPs(Kz[^ILʹYFk0D�H3WKYǞV%ݎ)U-n9GfE`8to?ЂO) -XvqJrKxWPp*2;]ai=ыE`/ҁgn{U{s`kyWE50WujW?{V13FV,6Lb*l\ߖAmb7ӝ8̝4q8XHۦ廾[ܣ \[g*\F4w Ɂ3sDN+SqfE4U+y _˘Q )F㬓u:ЀV: r7|i b[Y7z <ygܫ='O1q8Hy z6e>⃎~y/O5Up8J̳}V`{Gs~D͂G#w/ '" gA lmƾ6޸Ƶ5+segX6ʾJo3G~G)MS3#=x+N >{ù%Ii@< #)V+1rYc%mn˸13s-mC1p9×XXvБXlZ0/K>C9/J Cn\#f0r7Ј"Ӆ_=N>Ҍg"ﱅK |]B$фu"NiTz(/Ғshn6}ǵ?TU|9 5IZ}eqw|8K1A?֪\9kJ)y)Ǧ(wYڒ@Yrv7ԓ]'@A IL{%T/I^d<\#d;}Wk/.7n7=>=4ʸ9hJ)S@ۜdKw2{ ]U H9{,M(u"^A Zg WPΤ^W6<dLi\я'N~u"K777j/;e16oui+b?LOM*-x46}A1E8/eF^y*Sf 'b-2kߘӇn,YȠ[4vqSw s~{ А\N;sCV&naV|5~ʎSQ}43{⼠w7-bpSLO􀿤gS;Te_< ~Ȼ*y\0E+USDVEw:x*+)K7 5ZD}\k\PucG跩گy)+*x8K9BH93 xeL6r#td3I%0um|3*d`t`Xro8,7tczsv f1N Hx] Ua$'.?usbhCfu3[,?$.+;(d p8&Ŵe !7˒_NK^Єyu1kYb@2 įAJA?1iC+d1Ils\Wͮ|ZHϺleQ} .;clJ_gv^;?!C.Zoph=ƚ);=r1H>y.J9/7KnkCy^2W9bYy(e/MiL8&|Wݻ^\-)msRsYxg w*ӚmA`7モHQё!|u ~NoFzglڅUL!UKԇN[JcnY_ ;%AYf%YF:ϸ$zԑi7]Hp,`f\㱎JRD. /]:F^FFDHy%u-7)t/mZi[haS٫AEXiµB^n<4?Swv|0ku{5+f"&4%OAՆO;5'00;9m [8A_ޣ#Ø`WPW?}ˢl2 7b?UP.-O :ÌjLcG ?2 74eXƶkUcRB~iJet$D5rKLeA܏j̬4ȸ"!ﱏN/~)q:hL.ET2m g+B181=()װ9ϥ "a2V&r )c/&k'1^wސd㪌%̢Ӕ ʼD_Q&r|g2++l.Z:'(b(dYNߎeEL]9I8L:SttY1N%$z7]K� nƭdў4g:k"G; ')JsM ?&4t4t*RQg*my:zdV򁴨m #R,졏G_{>OW 'r[V$1PDNYJ)JW{(3% +s]&CF)e,[s|�Yȉ`NpW0&V9w"4-vQ>bM!((eZШ˱+xhbp\kJ~HQ$N^#9iUh3A1kXRd!'[FgmLMZcgyܫhCS^ ׆9\=)^9ucr򵬕b$m*-uF:LY׍iLKJcYM3jh)--erM;C&uԺ;^rR6[YD~p&ܑ.(u;]rHZ50wp7ϦkʹSr/Ds0*dg--H'KMMCtc E7`3!Z3%q|RS;хtMCX@_R&['(dp5:Җ %2Rk88kؖbTq6DeR'=I1W#RJ>s@V3RN{67fiRp6=̤_8ɠB_!GeG` 6Вt%ca+sl p}"X DSHu79gXևL1/ql -kՙ NUk{*8%]W/fnlzМFi>Q62ڗxVHac gD&6m$DV]̬:s( j(+eͯU|#ڦ̵?RLsìv b?eZC=TG.qs3z{-뼛qM .9344 naLӎE3ӸT]}-c[ӆ8S8ڟNq5۵=+uVe4}r.a!Ӄyٟ5*?VI/EZF5]>&FTZ!L^ nU5ASӮxxi(b81<rMPDu\)ڹ{@q`-LʍoT3w+lھj 0괋峌\B3VEő3(HBeDdZ`?sY:RFSr+cܚ~F'^7l'׸a,EgП~|Js$‘8L a8'|d5H7䤣 a) $eK"S1'A iMuL6R>6iHWq0o>O!bp {)sE%;8JYRÚqY |87I؆e\+C\4EWE_))?,pga#rV*,fBE<]ZOS/)eucp(Ly <=b+`EpNdMo G, ᪮-J!pnl?1Fd43mfl3j+;Mڴ"w/k^x4zˁ"]q9qF`{pf}=rMjX]X*.DhbtjQY;u*Lfj\krh CwcvR;׺~:UؙASi[DZնek]Z$/OXyܴ;~)'JDuNbAbR8pW]؇M5Ҙ<COjc_kLG-:uoy~mqS_=K>T>˃QAG2K<{̾H~ҝ/ύxYeX8&ߋkKT<+8/ύRKU׃qU r(ANc,KYWGYtq<g-4%0JruStf9H1shʧ\2JNJri&K6AQN/[f1Q4O<9L^RqN*T] (2Oqa%:ie*bџƬ%Os&jqS\M9bq ,c�]9 ]ϑgd8U^VRI1ǒndqٚSJL+WqzО$X>\\=(.ﱔ8m,Z/'ټ;|)X aۘqBs3c34s6.wmv3"Ocgp#G7KFm7[llw[{O{'F_|3/T1Rٍ oz ~4 +uoGCpE:^xU6ueQ"gJٝq_V>zŗoYkJVka2tta  iqkv[c&NjygHuSXp4}VLb3Z[y:d-UY %r$֦ibIupʘmsi^{ ~K O ZőŴØ)|UҁȠ~_sИVcBU"+>̰bI<h/kEGjϲwO}4)T5+o:G#'2n.&6\͞#\5V &\<sײy1 "Hyetv븇|rϹ]HSKwӘRsFKIs/r ,)>5FӞ5kƻ yqz@ Gc^\l'F'veRG\"$c\ֿ)LpԲKXϕd } vEbN.O+;Y #/078IZ89ьF&CVS@KNUg_qu$0/RU36kޣXO5[$-%_(9?g.%%I{3u +9}I*1FLNMVy(kl?O1"r@h&|+^BMw{`_a7~o9N7uF,g?d/Ǧ7,sɶӧxQ6N^Sbj,|.}uXW-Oϥ)_7yip8SES&ZCdTŞŀHnA)+eB;v]2o{z7f|54YPyƐogMάєƜG7E*4әBZz#+# xHpcFutj̙jc2ÜU;j}sjO*9M_<?ZÙ 5F|IͰtx 'b'f7 x6z|B`'n)0^b',0~+ﲀMw^iȣMgx>lMH78 Dtz~':W2!MORz+OW1R&0'a;0/dxYOCQ|Z1<.fssZ¦R3te>H%'Iq( ~Ic?(:.gk&o[q(q|OE `aS2!XCoNjXN!&ەp"A6NQ(rNi% H]rWwY(W&ܣf+w&O9\yE7d͙l:Tʈ伵N&60]td +g+Rs3ײE<ٗ2j*Mwҋ{R);i^URl`1{z~v"!f/R1`ImSNz&3_߾JZПsT$.cy.lr {4E�� �IDAT&?:hf1b`-V Sb^E!]ym]H 5 -L f732lO9#H^RXk2&ܴ[}佩g5wZ)1l)U]ྗRڳ?Lֈ>)SSϹiRN}QB[zQg22h[oE/M77wKv?ԣ$7iz<^uEa~tlBO o)S&4e{3Y}ڪ^" 4yikA60>֑tgQ˒.ߡ#Gz  nRK)91vdr'`!09dYFu/Qj2IV<#IHM@9?e .GI1,R>v<gCјF|J$ؙ"rܯ"DZ3J׳J&exВ=t  cxXυ,c 30M Jr~u#ӂI2aɉϩY~nlBU5r,}v$H(l-'̆}>`ؒ`SΑ^D25ylc2E zӑ*ڐE"yA3p>XMd]s4a'7߇lD#K;8$*5d^w\W]zǧߺ,f'C)qC:U@?0 NFh*VkaA\$crnjeYYwE̩1ڞ?x+$[WdwP+Hy%A/ZuNJ^-$;)MjƞjT/je]ryʶ`Yd1)xNib�Z /l='8ACvk3ʽ{}<mYod Oy4nȗ|F4wKЛ<dI[me`-M-?´*gٕASZ֛gi\zBꘘ1>(I1v墭tse2_G#Stc,9# Bc.`QB9cS,>%)nsۓ\Md{q,z9C+>#XOF f yJVY@ECn6Ix8iqqLSp=M )aOx9D%SXn3#IjPȊ8%&ި!Y) GlnIRb$?jnVf9bI:&9s?ivm�P%ݜ:X53Lg=G2uRȂ;=Zp.o9F+6J�OVN[^pg5B╏XcI3&u I]$l]5neꭰGiոwY8Y%RJE\x@j*j%[L;fZWV|-\k魥d뼜FWF9ȧW:?C6-m@˼1%xۤѷk vkknP5Fq]H]C :{Ǧh'fؠ8xky6b]Lq ?mgݳKWyFJ~ i$%C(W-|05*'z9w#;8ˠ~9k02(epzɔ_~WgkWU9_,,8; 8m.=e0M9H' ZgYJ=cYǝC(VRd+/1 )LfEKü,b3k@ raM;:c%W84;0mV' 2nsg5;Mcְۋ(Orj=�/B֑ ,븗 f0?b Dw6{MWbvR2$j[?dw?4.eir;Ɲ $[=߈B6'Kf`(yQDm 7(ܷ֫l΅SJwbn"<:֗,SOȧY|6` JYp\Nrcd;X!orU"fլϙaO3D6r'YlJigLY3 HswT=ﰻ{NfZ}Nv5<':̦ܳ) VGo`#TG?"<M uvϗs>y`ycx Jjz32*bOIs*eD5ʍ:T~jՐݺ/3jo -uTlPL<#ǣ{xéGtps_c:̎ʨ◾kCjU…Znt]~"sv{a{Nޣ,[J}tfF`;U5j8ꇞCZp'U|Hytn͙8pM\9T )߈=|Dov-tahZ?0Y\fEd[D4o.4 ?Oj9Xg=)0,"2kRf"uºȭiT0iϨޱId A+LAlHd ch8:RBf)b'cnrBFDz;g5򩡎`Y0 Е);u Ze/%v$6=9̣./ь-ن<D:'\ iaPu,4K}˓lE.׈X~«4fZ2 e;hNsꒃ56pu\DUfGY IhF/՟u%L^=39AQ%Yo&N#R> 9#ŃmU|♻KI9{(ϸ+۸0-)xa.]elv\諿Ke!5]'xv~-!omj#Ἆޚnѯ/I+؝!@^UxƷȶV7ӂCik 90M|:~kgH/)"-rfZw^*poe}vWt ܴ{ck\Hȭ!T[h3_a>ì*30{/ҫ"EPDE[1v5&;Qi&cb5AEEAE)қPu=/yϝ\88f{o]y~3S:*0 sm&%ʶk }S"M6QLMV0c2zꮶo0ƪW.L7}C_ވSV u sRؓ֗Y`^y$ad4&#KU߹\yGWzx ;Ok:X%%ePPȾ2yS]:檗xȥicS-|V&f7WʭDHC^g/<DꐛvYЗỊM`/su<S9 Ma/hV(`9d4wr(tǩK:ЉeVy6Tj]Ύd׃I?&t1&t`%fE''yI>O~+Qц;Hr;R'cԡ ]xOӋIXRƚ'4yUmЇj4J\IpyLsӁpgsNU"֨ŶӑUתrfd2&-fYs_u3N38\jzIj>HmF27AGZk/ \v̆*ԖjSF_0#ļ)ùCyfۻ]AA^8e 6&mtp(2-LuW=N7[^օLIIȵ3_ 鶓o.UMSZݙx6)E k/)X\.a,-H&Dۤ 2Dz[ UmۃW 6[3]׺PŦ=eNz!<,pfK ו_n4|;JmKI=0u=-]ytJ:Lem;-ҳo jٮT ^II)'mXiҍLmv e-0 ͆h_'=nwȾe#g+gx[73ڦ 撡/UT eດh4hn04Nt$CiJ._ҀY|xkК5zz:lVIi 0R6$.A)YAudp䲇ɬ3 g廏dw OCcҕ\6$Ld8<5H% é2kT0CP05!eGI\1mNDˬ1؜$p(\\qsI|%;R.Utd3 *[gӓ|'ðmgh/S[ĵ/*tͧ Xr yub3Ӕ%gm,gCYn'(lOiom|>i=!S3NjjEђ ˽\ydU^:7ZE"1R-O_54ۙȞP5Ɵ6g䖛SA&{͉;hGV?'-yxjI/i\L7VA)"G"5ifM:5*'G?Yߚr<Q+oBf+UMdaG [*Zx:ltalw^R? N)`(hLmڱ0rm)zlI7$l-ln rJ+$jh.sېjiŏ;+jFa5RHmZd6.9vӗV4c+zgkxCce3-t\sM PL;Du.f G (x=Ηgdp5;b,S#\|ji I6ӭ\IsQHABTi 3tK5iNg=ߎϺuVg?|%/Hb>r+QǠ%'bq-I/xO.GP=OT]Yxr8+LSlbY*%jտI,J7!z2I#bF0#Gs6QN^Q`v(gBs5rs{_q!,5-*}U%\D]<gD mST/55Gͱu{)eCug݂(5<f9Yboe>ur8M8=]&s*m<+fa(oZ{ ۸Ԧ=r~EzkUb[Cߌ?\.|bl_cNh6+[RѮ$ +5K^p|U:dۆLsӍ'>sINQaHE"ۻ 'x@5j7:ThϏI)y #5"e?JIJP-K6*;f FQWɩ۶ɶ' 5x(J#x?;d}y<Mf +/1̲`l bSBޤ^S,`rzu)Kqi!iO })L@qۙG%,dò`*aϔLJl(9nr;y>+Zv&3[lFHzYIUVvtL>;ygS?Ҁ:$r9໌NT}\pNSx@%JrP1(f6q)תZ%I. {X%`77E*2Nw(W7X�:&9֙=~[@gq){N=v5QIIMX 60eQ3/RcY\*8WjSv+F0"Nr7O#& jX>bS;wzyo98ZU4Pr`/_Dnc+n%Dg. ~t8P6&O!=JEn`E;ǭf|RHȞ [po_*92tw\iӣ2,yc*[}E+tu6L֡[^zCr]ҶL7Py#\驗2_geӺWئwͭwMm9۹4ue4uoP+N7y!tIPmf+<eB[K04g[_Q1'w׆eihnG:r< ɡp9@z0蕅{56T&7݂VAX ;),+OUqY06ra({Y0qRL"a4O:{8 Y�eE7wg8' Uݩ^f3irl%kL* $4Ϣ&4j 2 428r{YID^H%hŝ,a:<38.R`e_VbоrҀ3+7rT%|_nf=C�U&jMҶz3;YFR|JҔ'iT-IctbIu-&td-+4ݽ53#SϏ|Z}]}%\A8ƍR=J5SQ/Y^.aY {p)5*_9vf/~J`e< ⩴6yũDŽ;j>aD(J* 3O䤴2/ WP=o1/nE&eʴ)"3R6m؛Z>Nw1/zݞs#T5)][dϹ69Sut_ʟXXNE7:T/;:b'ݨ4w^ U//}}d<{Dcx<^cM FTVlHVmWy-<Fs>ArMHtF: ]W(<Yf0ĵb--i8fѕcL.g?as|<eYVw xGeK"c Ran}LjWF.e73/ 9<C6'F04!%=;K@cNњATГ1fi¿F .11*^$ iQ\*#R ^9ԣE>]Xr江/("Җs9Dr�Gavޜ<G?j l`'Z0ё˙z:6 (Iֲ,!$Y`r9T"dnGJ_0g<Of!,M101ɣ2ڼv!X@V0wړa/8QU2]KEpY^JU>!Z$ǏrG!]+]5,%3/kq"GP>p5-L(s˷B]^fp=ڗw2~ht o7ݲʓ_/Vܮ92ȧ=v0ҏ7RV\cWģ? jTzgE >|;zRFRׯ{[5slLhAM.N}&r1B6qfp0D\dc'mj(O=T- iy9:G=LKrxӆ&9HsVp0|e9aZҝ19lm6l'l+x/R7o"%LM>f6Iҏ`vrEc&$Z111bflQKӋ LIql5 ,9'XB!J7yg%3MU~ 7Bc^zy&b,L/r!iBNpS p4ZIx4RI97N0d1=x?7rޥQ1aYj.M8Јz #蒼ivgڪJTiw&R j$tJ4;@lPuL 6>'dNWg/Yֲ�� �IDAT'h,NS47_b3(9.2g_OZwuu*1c;9n;$?op 3o6Bݠ\Y^z;.‹鏿t\hzˆ4/b;z*3ze41+1<8q&@ y5ǣ'ɱO?]¹%ㇽz_UtepO(3rll_;o;swak'_e9Q <i jF14#ߡOtIs?QerM.w}=!ڇmu]7#(K<eHu;|-_6,4G*_-{OO &)"cl;͜hnqδ#GFWVD)Wk(TSO%sE!N70Ir$wY(ʭڡq3q\4cPQ-.B9p Ƿ(lz9e23P J\v$SSb#*H="F&9?bֳ;ѝ d8v Dcp$I$d( O2,;M]z4Q:dsO'Lc퉾"[eۻfhyg+'a;[ EX?+,Hi+:V$ըCO@qQ Q(d?Hܗ)ɼWf hZN9=m}3#&}ooeiX'<vrm_35幜=]ukZxy wEfa- d'iW^PUuֆ+-*iRݥa5?EW*m-ԮK7Wm|#x8V¾\シ79kl}y.6zқ~/z~N4ymw[L`+RiT-lfˉKRKeK_;g޻Gaȥkq%gF-fӕOv{o?5UpVˍ*48eij*`|/.˴6-DM Vo>m/}|HtK_919|[T-S2uR&= . T~:|ȹ<y,'kiWEp/ Y9c1r"H%P=;)[<~xs)eVGҙ-ULd3 =KϘF-ihF沆-B SJӋ}L5b%MN3%$tHzQ$2b5OJ' >b4=&54&c-X x1u l fd*dtrDwDUbl�1jRij ki2ٹ/yD<8;Gq )J jLp'HB0,SWZ^r.e?Ii ]KvZvF$Qh&9^Zs&EJcbߍ!ȴ57_A;e2Tm42Upg{EUXm 'oy.Yjzk14WbF{T [cO;5D9ύw4RTz˽T89QfsTZ.IG(6>VtJG<=Y3Jp8caD&7/]yWlG^wԴV-Sua;i)9e*[E.,gcCKҰ:7+LTu>n!qNk;+,״NL˶vV4Zz gvExP 2C{s >5v;EjrIɝo]6p8eDdEЛ Ju44f"XW x>~Bׂ̓ g# x*>'qGl"Kf=+r4ЏU 诈rr>qmRΜ! y?ɥ)۹I kc̣==aOHa7%; 1+yp$(>:ƐK 8ģ֞/O"Et z%]e\L`g_c&g%1qѬ< 8C<|+a4 p:IMTOў rտڒ$UbĹNs: lIl:u.>c:yt#‘HyJg`R0L㗔ю^\ $s,0ӏ3;º3/8U?-uh:/嗦v#kN;;:#&\bBa=;e)[j Zr;zv49JEdodHM+ޠ)d,K�Ym-6U2hQ3&)>Ayn7>aO#iOOWo_Ӹ8/CUz -;Oy VmWg|{s{i+=FOWq,>[]i\GE3k]nc7YF -dy-67<2(ewWTpTE%}֩ae3Є?{G\Sׄnڧw64kZ` ђyTT$/C4#Cs %i̓\LjSr$mVfGQ?ӆԦO33+(;ыcs$1'�ј4_e}<zP|,b)'Y0 i):МJi1Ӑ1;z8a`mhF)l E)( ,LW)&M7v!_#}V{\e$MpMĖ&ƵIagr!V$>\\sya[p,qO龍"(t/SIg'PrhH#UiPZo([Ykiځ' d1A^39ZV1% Ute05__'T[#)I=x3(jk.k=b0XÜW^L ǂf^?-hna?( FrYS"qZX*#(ow6h+5р8+E<\$_㸗 ŵyIN^=Vb#=EyǢgf<bP⠐ۓ(@)ʸ4a8ٙ -<Oyg5=|BAuVtl?c%oRG[h1oNuF4ukóVǮ7yݜ㹇=y =3Z0hǯ=v"K>kw)]MO</$ZeiwЙAӜauI)g։ >Ih#h5'9xZ(eh8ʥ,,<Tk@JTaa&[DM3WИgN9g8$6g))29lj2Cڐa\$/T[ϹRJ^hsAC_Y4u`|f!]iP+ y\py4ITPOXJ}f5St|@լd߮v:cP49F{y<4PBDG>e$ Nj\fޡ;m?.l9YO[Nrliq:MVa`\ǫ%J)#p7Qzա<?Ӏ_tVȍmltM8%Vf5XP3N)-a0I9,F-Cn4MYÝpYZ5hYf.?W=`vWX</ <~s.tJrQ0)#,.euʣg˾uȼ6Tר,lN}y}U/%~pPS2~B3+Fi_ߨx-wF>kK*[Z@<]165,QƏlޒYsjV2mҚ5\B.2>jʂ6Ʀz,6x#TePI7Tˊr0cN&i& s􏽝r:P:ȭfc8̾DM<,d;C×Rnsֱp)H1Kn! 9"CAn@BDWB)Ue~Pd9z2*;w&#"rF39+[XNm$| C-J88pyPL<N%@(N&8LYb%GU+cD?roP�%k-b.x\jxD]-vCDgV%<g7wr r\VwCN6+ bW9ysOםA\W.w[c{݉˂T3'2uhEV1 hb~E*8O3M󴟔{AкG9Kt,)<Qn&O|Բ˕uȘv1?kyS.4풰}(_9,cX6"e`1HzՃ)A+~j[j-rgnѱP)ՂL nqW3Δriq5:zi3r}oemݝ~\T6}mdZ/O<e%)qqu;];0ށ2ͥ-U4e6+ c-#wfi@mXL.)|cec_9cyF|D1tb-@{\,S a%9JpDS4?c}i g{s]Dw.*3=Zr 4<lI9@)'C >=pYx{l:9lbsv1{tb=WGR*HS =Q b*e`2yǨHȧ%|8 gcP,]LI,)EguY4gտ6 ?ZIg6ӖM xA$TI8۴lX27r(XGփiGd51sj\E? /뒣'6TUy},Omuu#vt-um|5Jڱ5z.+$EʕOQ2v SB)LK!rYMV,Χ.o]^ic5h\+hr6vY\RDU[@k*ôO6XR3+JL;pq٭O>oqC5PVKK3t0c?&|Hǔӵmjcׇ5SXG w<+j٥tz(rq~DXD Ҕᛪ ͸ר6}L5G1Nľu[)"CIcg߲m(6EG= D߸4<s)j%<֛iF*|cy& d2feI%G(\%>, ShaxeTմNږqKwGmb 4Dc+aeq;h_8Af&\4SsBUAR1ɵtn$h5]A'RZm뺈z5 ]Bc'\>*^< ei:z`bo51tˉ5Y]mnɴojWkפL jaj*SJ̡-4<Ɖ?^ouK {&k>Y\l3REh^WRr_=zj6F:QǑi3ͨ]rȄfZ+a Y6PJ[GhqTj2#'}1̼ʛ:Qfv"J[LpIR9H)r][\4vGvz܌64*Ӿ2%!Ɛl="?zDJ~t0as\I#?'=Sf彶v̖"?-w`$1*_"#*_$s#\NWr'iEK~6r#UX$lCڀlb1' W16\lgirRޱ#QL<QBSVRJ[R448D+9B.҄J1Ȇ  %\epۆ6Mh0F28ǚ(cC[sd\NM6ҋr-y-/퀄{ b?{CK6rE4cE [}@b͆'S,Z}S.^dN\] vp ͸g%a߻i~vPB zӒ.LOvqeQlY9tb56Nќ4૬SЀOVEP~ &h0H8$3+9HKkR/5da1Z0wmiΒ`0=lkc9A~E:KzrlsShX'+tzNޙkFs9E/ḗ I 6X2_YFȮ4vհ<Wjjm_|5:}"Z)h2mZ]w6nq&sH/ԨŵҐ2HASR_o5)Uj2p}YYm^kPA#(MI3j4w1b Vi{ЇY/֜y|/xZ  b C*k8x}}'<05Yrp/+s%/F%룹WV#;j{ m\K+2>ah۬LiH=X{ŒΏ!ur )$#l3;8dHX-Q@6Y2d3t\3 t3C {$R‘5˄/Su2GbUY0#gLDWZЃ|`AJC|f>CHmNehR< J.g�MCqٞjU9lMbvrRPs 8Dӆu\{7ToՄ>,c,QVʴS}RGe˜"6c5;Ȧ3=RUoWM;\Ƴ(<$s<I+<S\5UC OU<AI!i籔x.<.^/v*HEkCE;f2?bj} 6^`&a뇿{t4ǭEkUt~gj=KW+%K<:LJ}lۆ%VDfy)~@fiB^]\{>oTuzȱn*]#;jd;?0^IE\T[6<5gfz;2PڴQ3g.vd}V`Um]=uy\Ec bA^Œz|.ō]Tinugygr79pjT[ǜuˋ<G>G1s !$C,ԏۈn[FE0ݹ)|/"nlUPy OQ\ƛ)FQ7s)0x5be<H!P _G<L)= xq//.cu,ŭEh� &1L MTD_Ie%קh)3!bb9]G$jnx\4}fK+h'=e!u( ƵTnӗϦ(4o/2*ߗ?=)4wei hiGS6\.2Ȩ>Ӏg2Ҕ;Z&}GWq +]!$[ޕ?hmO{#/i ?ҕI9=vJʹn?Lwn]VqE؀HqUY)`Pڻ -0\*[-_SxEDOJ8)b7ˍ{ˣkUION='~-'Owkz_H :Ց\vӃ8ϛ9js1gkVp/WZKFNE]*biX0ŧӴlL滑-4ȤI2L.婴,eEdPƖ,kB%J$9,?YADO?~\6r;vЀ(v'�� �IDAT4s:Vj琞Ҥ3#bs3m9r}O .o+7чy z,q<OFΡ(+)JY6r -]~TF>I/w9 ;}�gbQGP|S) �L*U6&FS\&h@o/:q>QDЮlGV|8vm3_tգ=2L(UdX�Gޯgp5fvW_Y/-f*DG:PޤayqZy:&ISVхoX'Q4-֖zcvLKP[kLMܳ6UXGwyjj"8bZx%N0븥 ołk޳ݞrgze*B“9O~?i$˥Ni_x<p[[pFXpF<7~L%u%<ذVZApy,hOQkɭvT,22*\t<Gmq^lcHF9:Ri˯)M?V+Ngc ȵ4̊4MhY˖ʚX;,Vqȥ$<27^5[bK Z>YmLkOȊ++eNjSăg%J © žbs%&a@ZʗTlcKRзfx{vx;^,Ãl?As.("C%<:FLI.SVd+ŽF_QEIi'�X#v[Bpbmd1>7`FЊ)Pr7f&1HQNih>0]YMQPg [7_e&t {#| .B5ei䭤_5եlXXS1fOB0UtaBBxS:hK._5*1PFLb%\Q2tP߽_{H|46C;K;5|VY6$8U줱.z!&-QiK:'Af!'?fW,WbUV:_ {`2ipNnXgRtOJ[/qi?Xm6^\FKkV_a/ J"m#uk7Kڲ,f1CCgd9=zb˜Ƭ2xz)#93h.L9xVSiӄtl\,|3/VFLWJQVvӌC.TІ6ta^.'\OPH(" ӎ4+cձu 4vn^_#E2M*)-iE/IK?(>J:&DOEJNp hE-92 t^ss.Ѐ9D$E}ln a Lک) q&[B֋0a3CVc%Bd#NІ9Ξ0Y#C9DyaħQ;D cM&ӄClfq9ܬ|{\ˮJ0m!&)LlO(rz79Bˤ<1g X[(⟐~$~m:%ᢴ- _%?{<2ݞ׮[Ry;0u oSŖY3'\/%q8~9ͶYԛ:61˳uOYOC?Ys"R˗X{®[}xi*"۳K}2xm>a׵qu>\l"˯P֓ekXJ5H,l>2ScM^+wg^rNFPPPrH~uW5 lhnϲ|ȫiU5ǫ }g32kX/q@3G]n}Y%aR,od]=frzU cu� n=A'YgA 0lcurҒ&At<;˸ȨΔrɯdS`*,^,�+5suD58-si ͣ.×R^! b^\'l\<PP0!Xwؓ|ƞ@?YG eD- *bs@C!e9ۂ%S3`<sIĩ3X>"ʃ8e58D2m89t ē׵,氪Yu3-%Pvq:o3'O 7&}?m ;Xɍ Il;(M|b >{DܤFv;)/8u}zn"<U +J?SziR03-LFNP\ ՔiY Kmػm}5K8#3y*7q Sڜ 9 4}P\$9y+j3!-~g]\>6NhC0{?4]~ܭ=˕bqIW%1클1:mq֩֔9?ajdV\g/c[<%YV$*WZfA' M<0 k)AryȫITdX|~<ۙfOU."T0 q)l"2nY לHonUf0WF ( o(F%[RUC\1/r4 y/82,j1c^P9ݸY AO89\τ0ggjg{ʭT]0/3=zd-|N|<uy"5:М> $Z\[e'x,-eRD>^@H?9HKy= $oKoz&/223KYQi.Ucu{ua|HYCs Vt Y ϡ <Ci5,sRǟ˓[t5U2{|GO6W @*L&V{=8R1mLI%z4'QT0Mll_9{q78 O7y D1LNm0G#榛ή{m!#禼Ԣ" .K+Q,K\+jv]Yw#f)WLXZek*qiX>k*ct8`t8<Ȣb/؏}k"w5/xk2 (DS1"eK Jy0a7QX9O0Rs8_]%)*泮Ҡ>?)\ĉ)ƮeR)A 8lKZ18g YpF C#R^\JlݓlCkSLҙ2oEPaO<&ӸwIǖ08jQ̤-T.#(;:c.YuR/"7ĄV2 ^@]kqm�.`o8p%U0+@8y?]_67cx|AjqgBQI[Ҧq=LuY E*"4&1Bj6pǂ~?79 s6I`1JEҴ4] 6>yl|J~v0NKǶK*fwYua@o+kKmNkmEv{9p/Ŭ3i7yKVc+ G ؝,v Иu@O^RN= *lգL03!OQBǴoSZ[T:DnoBX&A8kL<d'4I4hb˄X t{"g&*?!DMjȯ7}kYw)ž8RE}cyK;!ٜ qfv%OG'(r-$d$M {x/wlF d^+8&^1Ǚb23cORM؂z5`}[OiN|!Cܼ;M+GZcz: ar- TWgfn5]JB\ʋve0G4Kʴy3LO8$EWb-(+PB[Fu U;ǧ; j 7lԢ ϻ(b?WЊYJO^DliP sU;^ecJٜŠ2/˽ }ulm8Kbsa#v<L."ٌ!;د bMB%C>qb!7ѮвO}|u{=mrMui`q/u|򅕟p&Koe>y|Nj�sQRulKlU=Y"mbo3kZCe2ѝ3پG~Mȡciždp;pV4%y9VY#+J?-MIu$tɲZK>Sicb3)DžDs*8<9& r{R57OåJƄ$_;8H)90Ҟ eC3Ȅݱ('XL|5o(JYi,g5@MKP4eu&iEd9LL2-idEmꓥfk(:: P7Ʊ!7`)Ofx`(v Rq fd`q[P5oWKr01gÏ ~CLh.Mp7h͛c>slㆤzsSl) "a{2v`e>JcS8Xbb[ʴXN#IJ>5ΐ6z22em1}[;c'Y6N�?P[؊t6Rcs"ȁ(ryIJvn-$y즴_dkȧxC:3Yީ)9.(~V߹\B>sdӼrKFy豆nD?_EJ/N99[)h@#'s%ssS}Pݩ]fcʃ<+e,(k ӏƤ4WleF&ous`b\,&4s.q�ae8o2%3 `wcɺ,oT{:\WiJf(׏gZT|ʩ| Ew'/ͼ^9iL1sKoP3;h͂Ѝ0E' La73N9酫O*Ѿm~~`9f;q|fӜ]CHW%5KzIQ7ݔ2x;q;WU]7ZpY)M<jSTe-kk|%yW,8J=5;Qў3佇Rok5*I7ߐ8g]֬*FSRZ%J8^-rﲐ3Ը%֚8CNc?7Lf Sy2 ؅񲑚fϼ|xUͺYa$]9?vM|Mk�pWh_` rF>~ϲMÔZl^ma8{|<&ld~W(no25Vdyi)Kltd4bʹ&;$t$Bݔc_(X\c7H8_S gQ.|ǹ,,#;!0m)pRscdkȜf#9I$\rv| M 'P6B@Lz9@ʸ0ؿ2᯹:l0|60yNPv҈hf]e�mGø<-] )#~ަyPWO#gT3s /ѣ\B3?5>7FV} ӮwVy5wVF @P\Ed<c{9pZ:q)=)`c#'<yy8$dّ]ԥWk?sE,^WYd 0/LmiL}lg HVR|nriT[?�D5 +K=JӇh0DwU'Iktvʳo~8md6eCcO$zǻ2PeQ09\eJckJ+tOiKxi줒)f@PfꞼ| k^% Eb>oGa8ӌTqX˿rh $BB2qq> |Ҋ_њ,g(@]{g=7|.c5g˰k@=.`7f%W1 )ъ0o~'9Ĉ`ʟZA`6oVvVq׉36r#a`C7B,CT'hRN =' :ߧ YQqNui8@VU) քl(x0[8f*ΡgQQp-q~m]+ZRHv` ^8l|LZC^<mUGl5xI&eäN"U%Q8ä6{ͨSc@'TH 8Oc(e'+c킛"#Qfs&bHA3K)MN,'�7Ъ<i]}f%?~g[YO@kB?& Kge'3HR@'V7WdӖCۢ&|3=934 PE6>m<8c;s 2l|䰔>i3C#҉i]E+f=34Ɗ(26-R4Τ!Xe8̢kj;9'u2-vVzc8Dq&Q8t[З|ve_ӐH) G7MYGyЌ2( W~`(G,R3='b'۸IX;Rv7WdVjn #نɾbCF9}ý4uASn Fc�Ӄla,f kHW6rkMkL`N{c5#93C4 s)%WM6R'2 am8FOfq!Xr9dvvۃ1\цb3պ*L}Φ x"2,v=0 #Y~5 knN,I#ZZ40l@dFLm [t si@i!uM(#h g ;(aCS@#gw*l',hƗ4g)0%d!Bߊfv\\%ԡet�iAsD b=E&Veqe~C 9'ثҕ $Lp,}X ʅtgP͈@(a9I� ,s~G)A;ɐgGQNbr:웙cI=Tfeb[ w&f\h a9q5:q4}B0YJgM =CdC&~ne*D>L;L.3: cs>}hFSn023ƠJ-T4+lt rZo`)t5b{p&bs#CLǔ)igrNS`gL q*iSYNc.-͘?xfskfڔUvR(sQ[9c[x[] 9Hv|b%fc=NY _N(3O (g8՜P=YBثЁ./'GvWi2+#c+_2iEe72Yj.a?*zrWvӖ,1&LFZb` yc )&kK`l{9N+B)~t#k�4XAWf8t/+sq sC'`%2r FЃel4 !3p)e&͘g`) iU %Nng7[(| iHU8O. ? ~{\J�� �IDATv`tSc/B硒%/S$Ďҗi|IJXXWEcF#f;8J}_swR#.&j(IMk\..<ޡEq&=Dmƭ43v5^)_0m\PRʤrβNŕl5䙠ppY|LniW;Y_Im.d Gpaq9J:NoAD=qOXt;RIU)~Ds:ѕh}cI3/QNVP@j-VpaZQa>(Z}Ib j;.'qJkȟpt S -JV;HAl8_J1V3dJn. 8|OH\. Muyc I4@ə;ys?[M*)빜 QFc~N+ϸw#O~f-̣*td{8]olFK8 9WӀR&p)<!>CmӄQ'|`6E5E $`1 4)gu�z\<]KArY ?ZrIh|:#D"(`tL'c|5:bV),f$)drǶM~37&msB^@b1"+rZ0J�C8K>7%4bnO_R\i>?U۔E3:m3ih^[JZKy2>#$m-k4iȩdќEl4Ԧ 3!.2zԕ60钴Wh,,d?+UK7d3:Nz1Ld/y?0Ŭ]ΝM fP!\qJv dM *z48BEDsVHbܐ@]13ACК ~Ʒ�Krq7c-P }H!yy7>vmiL>kBL;p"VOl|(S걘,1M|�b9Tь+xB24}nǹgf3EQ!MҞrxVe"lg&aӹ4s 2`F~AOnBr\N c}C> Yí=k W~{\tV UΆ]GDŽﲈ:1$>ad,D #HUu(2GbYν)cIW9UhZ3&#:f~ij-E˚UVm}',ZqZyƤ~y#?Ld`c? |waV?{O0 *XQl6LĖhF9)&cI4VQPA)aiLcCc4D<ߋkkg?΢Wk!4xZ(,ϗ7ZbsLJٙ1ubuQGݬ*~~GK:&BƒG)C[tZ+2| bl%E=éഴ.B^L1h$cBb؇9 Nِ҉ H؝=9&mp37Z�vK2v`._<WO>s=9L`_ۅdZRvˤy%XɗxFv#!z2Ԧ]RhC>EM݉ |&[,6m$]yFӝ!҆4Ѓ #e=-8yl=&$J9 [fU5f}8mC,*)6ӓH:&A8+>Z&PeԮ* ;.DO=hU@]B5lJ4&$8v^ z:qB0^AKd6X8^e~NŋJ. I,e+1&hg2.aV溾Vie*xgWc˾JwgS2>.</m x7XX#7GnƆWžȝOk[FQ]5svO+DGfY:V"3y\TbZӛa,ݸ})8xi6wCqOV1rs[cSK[JXƃΊYLrXΉ>Fc5w&'Vp854Y(E_S([HHs̚t!oc0f42֬C);يTLVOng wlrL`YF R3g91<,_`g{1,}ViY^KF"xs7&>Lg6iKqjhwn+4+eGvpƉARvdX<j ,1 U n+ﰎ6AW_u6H1\}X`Pð>-U42 (o4-|x^c\|j.~;&wZ%5%PAhE9эo7{lۻb/h\ ױKڽ!r gmPui8,\ Xc~ˆ +\Uk17Bi6SR 67q1w<%Uo( ڃtƭdnڕU q7i b2 㗴!_t.9Tbݩb%NfiRxQU^Bp088c#z7Ӄ9o5Dz'0+8399z~:ޡyx p*cyrvf?ƨ6ױ(ZA#$iZSz/2Zȡd26_&} |B%.b%Rkl#C#ojp#8b U^#3 !o-ȧHF^$E OPZs9<!, OSYKps2MӆpIqo; >\l*XCa(RuBWMEщ#QyW̧5ZY\wst~zyxar_[ɧH4[jMܼ`ֶҕuk6 r%C:Rv<:"̖_2W NWɢ+M>p>xr6K8qcx}dqb^ⵐvo08eiݹθJǖmIl-3Lf~Et9+c&349=P0S`H[&2@Ɵ}hՅ*rMxɔ"J ^ G{g<b:G[vh^$kp 5sB12.gk9ʹ/eabcչdQϐ0YL 0C_eYJ7͓SXBlq:+C? qi80\we+۶tzpmYY;Qa,?Н*ʨ̂EutiNw2E̠ cBIt2D8!h$>Rh g=/Ws<81WGէǖ`4S; =taאr+a9eM1lTrd}r[^z#;$~ʸ$maeL*:143y߻bcF'jUuړete ?| a8*%st *і:z҇?[C|3>a^ \ }:U*>9.XiɦVSrPwEP=*&UΘTż骔fYps04ד㫉WۘhIcTdc?#AVi }F7g(S&M:giGb497X 2Ag:/0a`u,_ S3Ͼ-K`12~LA}q_PQz)e>8ZqQH2niUh@'֋>2Qw KϠ}Z\^5 _cr#eiӓ<B?PvZSoJ: ܏b؋a,%N }[C<0 m )s4v}&ZxYVҬcOF8m8i,e힫ԉ#-۹8ֹx{2<z7+33IhڔS֧hN'\v'BV;$b*%E1PGWt!`0<fΡ7)5̡/XF`P>0N|ى'i,֔>i=XCl֤;U-dNILJ靶(73!}/DMŒZ dbZ0C 1<IwQG1R^u^O;AF KKT:pBjOn{(%(:Zڳ/{=LMv2iGclsxBRƷ1U/88i3ܝ;f- ^j#<nAO3 orZ*SV/mV՝!5qQ<f92Ѝ,f{{ȷ6hC'Q y uKxg`3:^W0r=+brqBE1NZ6z3$uSgѶLه_1rZ#=&PLgfӟPE\G66IOޔT$KgF{טIOJچ_WPwj?wRi (e.ϐ <co ǁh뒌1a#*GJo)gwzhzxx|$TNuy LkIIAF0Ff1y)_2iRzf>b;Z1f,]XL]:3S[ml`536[؋q&2-T3(e=A`}0Cp0J1O2YG=eVRH2l*ҌP `,G1%a]E9_ }:>*XLU8)7.�R:%Mh^ⰬK}Fu>aoFUÎ 3Mndћy$`s(_"{ll^oտa U7{=_b* l`mSl'˯TZهg87\I]o|8> eBLα[ƯsCz:pw'Nuy=ߤM*r䛧֖$2CNbZbo8K. f'r/:%-r2{gd$l1%q& 5M>'s<B1r'1W1oaRIf&M!s^Obқ9tNLY@~xX~C55Lc}䛼k˽tb1'rs9*䡵[<y,6W6kO7ў drXL6V)'ӗ?s>Ky%H5 XC&#HH8Ơt=xh`sbYރe$e�<^AV0_Fi(rgrb)Vs0%P֫l6ًOMXAoLyqSV:0eRFc8KϱL[40, *tm.x 5e*"sCy&ƪzj)8L%UF6LPG4p g5# jWO+KF7CNWVtc7ḥz{HfbqtcL43egڎ쮬*nPOdd6sx1es-YtNRM#޽(᫼䌹e!\Σ{;c ϰ\W62Z"E<|zsg:d{;SSdmɥ, x%|1k Lڦi֘jZ\kF+T`|xFjȰ*R6 um[Tq"w(Nc[P#pqȚ[RBZ19;+oUud4e+<r4˗ ( jc 0vizq* ̣5,OYj?\fr XnV^ WѝWHNmX<sVlKorX"cSAw.aBz֬cS;@tՉ,&Tǻʭ*O":~lg`u-QE{Z$)kϧoS8樅U3+@}ZFyidemڞ-5Ӑ*C^խƋX7Gc" =6<̠P`T؝`:e,,i-)T'|!AJqqZb.$nIћyi1QL#r.PT6nlms)Gx߲\ؗAa3s>]G'ަ+CeϾF1cYF`LRzJl:H>LƲ mQMrx%,H21*Ql`%u~ XDQ 7rՌb%#:sHnIE^(k-L;*ix d0іa\K%irXŞA1,E(ZjRrbYh~jd+Ic^1bzQ+2n20\4T}mi3x>q?)6mryU߅ - (;Eb.FH W2jBB!}e%!Ҕ#YfGћź,]e5ؐkt utff تK]<Q!^<N>40G[dRGʩ 0:_R6H*CN #xDBʱyedkJnG[vrzw><rB,ޔ$s˥1?MѐLogY)gPzϣ=hJtfy A;Cs7^ kH=s) Mq~Ӗ {ٔi|i軅qe9ʬ|vLdbO6*e\&c/sz+h[TPְ91fӃ=#NcؗgBؚ PobϲSe-ac))hrmv2Ռ"+z\4jdO Z-lu>xՔ6r+foQVRoVzՑͪ#;\O`'l,-[zq}҅ut )=ٝӖ^6z%y6d=(۵')UM m)$Ve5:idB~ZVrkWmO14<w:4}EE NW1e-{LT'4-iCn]x;8f3VD)=Rr26u=_J^ʈJ(H딱BI~G' :i[t;3iOq(6H+cUeO*2+ֆ߸8f3ٙ*TVUPNB#Hܫ;mRKMA]7vr*hI˔"J]3XN-a#)'TU5[ Od -ّe?d5Ȅ*�Op v^Q#ULs[WJ}d ӭ;_,K)EEEqE"H%kvtH$\tLo9IS"H$/h̡Gp,(<�s=3Vhk}"n#S$_Z&˜L]˼{VJ#-I@#ؿ~hk{A6]4}Jw_m񟹗?Ϲ~7֭ۼU3Ú |whq獵_^bN&iͮxq|f[L}")OyK&OǮ"H$9 H$pD"H WH$*D""H$*D"1\E"H$U$D"1\E"H$H$DbD"H WH$pD"G$?JHd*Ȅw}vՁ'8|$LZddH>Mdpd>; JL \��0IDAT>d l6cM~B_&IocT8V;/̮WXjO?ճ3usKwO8}wܧ>SƏ_SSًX'iD-ȉGƸ#>uM6nܸz15Z߅y;Ck5.9k֬Clҥn֢xE"aSN^RRri}M~w}wΝ>}2wNv7(]=vTD"C޽yo=''W^}Pku֭pɮ]Ʋ3ZP_[imn<"Heĉ^XXxa}ص>*2fF"Hs@ WH$*D""Hߓ.I&M׿5;t dL:5;gǎ_&Mj;I&p m۶ezgsfΜjժ+6'ZD"+ﯩks&Nx;h߾~w饗f?}7/Ydڴi\sM6=[okYr%\_s=3v}'x;<3'O|M7kԩSqq^msygwF3<K.ȑ#cD"q+sΚ5kITUU%Iyƚu}ֿeX`A6miӦ]ӧ`۶mX~}چM6Ե^dfϞ]__ߢEwH$p<ͻ+?vo喒aÆÅcD"ȇMvm}CU$D>?o/߸q_>]E": JR6mdl2Ndo;WWWWWWm۶!;ծ]l[9999m۶ݹUVmذ!N׊1\E"1c{ڴiYs9稣µ^/} /:vxAf<޽{~{/Ə஻2eʆ &Nxeaԩ't.ѣG/ζ~wY9/{ Kz^rD"󖬹5UY0#]E"Hs@ WH$*D"OTT::pƖ-ǝD"+oIsv Wyexr~;H$J-\ؾeS/H$ Pi3/n{$D"M~o?Itao����IENDB`�����������������������������������������saods9/ds9/doc/user/scripts/contourdss.png����������������������������������������������������������000644 �000765 �000000 �00001316104 11332353406 021214� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��:��r���B!���bKGD������ pHYs�� �� ����tIME3Y �� �IDATxwXǿ3wiKl(jĂ%JџIlQH"ƮXb,I4F]l *Ez]0`&Yfn;9{ F{[G#?xk)]ƵKȡ ={C*x (+H`0*"e5s"AN2uOHj&I�hJY%2 Q z�kԵJVj % 's'^"3K+}:sO@j\T$UJK3u&FUYTU$f1 Lt H k.v|^TR$-LԠ5ͼMxUЪUn!]\\"oooBCah4 FqvvȀdbK|�@$'IQUWZK%yٚPfM +J2N`f8+O9E*H& HO27% I%h H!IμكQߠ* TXSTm |~Q,rnlKDRHa4�9m~9wFCwlB& iyŮcK{L' '7<*R)Gz8ٶh& rʯ'ejtzspp $JB4*0AjHꇺ]XV+H0:۝h[ħgeAҲ'ŝ@bfJ7 &@ ʬ*NG > ]x ֖\Sr A%"AǖnoviIĽԌjn7ofUR[{Sc>pvٯVJF�ѠתkL&Sfqu4(PՔ**^oLt]9ǿ_ZQO4vEx]=hb A: f6]=l-Kkt:ޟO9QYGç[D̽95)&UOۊdY=B:뫍*PѨ |Xfiom_Xb+sC +[p}||K B�kd¥I*4Mֿ]{{)wRVYnmRHJ/8y^i6͎<̽Mz^Ɏcͤ⠶]ZIł){ZkᘞW"�7y`W_7; ʚZ4}۩+v|;%F/"HdׄIg-YmA1 DYfc)k] R.f^W;,Oi JTMUf$MBQXXZ<-89QEU 5wvy0s;?7';wG9)zooKUG6VV:mI2{=OLT[Y&R3s }ݝ :үNVY5Ue}:uֳ3 GFƽz@`vo-T[P .ĔL[kKEq~ ?/7ҼFU# i"_#m 3Hݼ0f6 Ij Hxl rt/,YJӏ)IM[j`TUeFL U/?&rfy]IL\rV>.�_<q[B F R_h�$i޾p,|[8"_(rwUUeGFgyf"\li&yo=vts Z8ِP(TktfROL"vWU;6}�ThJk+sgGGZ)aޙk-<i4F+uӮ4ZAdmxv`E~>$a2,2 z9/@%H$IKTV]}ڣ8̈|KK6<)�ϿG=/W1out&J]LCvKe"frNJdc=$:ZLnɪj&HzCU IտE7ʪjJ3& HD&3 0PTSsmEyUYY |FIdr<@QiclSp@>V RO8=m(*-7D}]8888^RqEAdH4պ1OF$I�MYtnF'’=? Z +PSW)䞁f6NJ:::_[n+sk=^s+RHfviYUm[ID% D AQQhcm!t'!2 -<mݾ䔝D<.4A|B'2llZU(ݝdoi&sK^s Uj<" $A5Z]~qE{o=; N69�jbd|ޯWTUY:;؜<-Xa&w3988ڡ,[kS?UJ3% yZICK IDE}:x0-]:8p۷7X-ʁɨȓʍ-�X80u(IDU:E҂of]_bLDZn<v˕\f>wmZf SJRY{̑߮D2WTZQ1eJTtzPRV4q7S̈́SPR^Y]T9qmYJuzhz/KڽJ˫/HVf$I w[f~񍤇$: \t3Db9rLsppp;UqO( Ih|b*sҒ{e #r$  (y^RxVp8d<Cvrk`uJ{}U22TS&V!unCeRҦ%`,);M&Se#h@(XZ ,,BdRU*fbL6 $/KͭBQe#Uʎ,m̭틲Sy|^]S]Q,1,UU U IPQJ̬|knZ e3R, :MuEVDbB. R:PdHU>2 Hb.7tUeEe3KPHEUY݅բ(']FbfitĜgԹ8Qjգ:y Ҫ`pkL$Q2ժmyiIľLĂWʲWk+fv˨+ zH- bR�޳ANj!g7Gx֎nA</�̬lIB x$eV2KjI'<M37*5P,<>7 4 x-={u0 2/L-=yhA<j � 6 EԢ�<H"$' $$ϙ988^j7\=uIdn{FޥE`.ޭCl3^gc/$,x<!_lFOLBi(x"4�Q<O{! uË+<9s<d^njj²*)3|$-x~ _ulW P\T\!KKu:MUz/ƢRWWfQV0<1N 'yvO �xjʪZM I\*%f<OC$ijii"㛄'@,hժe`iW�Wduu5uGg Hi#MF-/bI㳠Y˄MFL=0 &#;`kumۜkZ}T\j^>GugtJ%F8kjj`׀2L:k#\#;f_�'888888q+N\qppppp,4vk7oVVVd277{nŲ7 @  b:up-Z52{ٓ311@f|}}?ʑ4 sZٵkWRy__f͚X;�ӪdeeeddP[l(jʕ+&kRyuw.]'V(UpuJ96y e2٥K\\\n޼jt`w9\b962bbbB޽{#[�5p~x;Ν;^wVռB4nĉ۶m333KQ( bܸq/V=Z'$$􂂂nݺٜOO_}o]```#ӟ7o>w\Ϗ>o~~~Ɔj%oo_\ 8_~Dk֬!NNN/ÇoݺEUj}ӪdffΞ=;wl۶sk׫W/33=zܿ7X~R 3:/Q+J̱AΞ={>}Um?O4w<7ޘ8q?0u7nDDD%%%QSNwNKK޽;ss),,?_|QUUȈ}ʕ+?ƤΝ;s縹=h߾}EE`BBB0:Myan6~_5{ɒ%-V;k,wDDO*٩S'&eJO| F0 QQQ�=ڷo6m4&I&]|yɒ%?zhbby>|XSSoMNNЫW#F\/=z4_~M7oWX1r:9;vɒ%�&O߱cI&/JJJ�9͛7puֽZ#6o<y:42SR?bccO81|�KK.ݻyTTԹsB˗322ڴi~Qjo|E߿믿nݺuĈ :|4NUUռy(| %Khs\dO?y}fffXKF?ԣZuƌ;v:::R.##cݺus̩Ӫ�{ҥ/Y_~555�nܸc�"hʕTĈ;v899(11O> ?~\$EGGWWWSŞ7oަMΝ+4v_ׯ[:''gݺu!!!/_G�;wԧ Z1y(u_~ bFGhѢE#E_B8nܵkאsWǏ?~8{КǗpnݺ_R慤CСk#S z~\zuÆ ˗/>|xϟĉSN/cbb^:ϟ߹s1cbbb*ڵk׫Wŋݻw;w utt u֟.=IKK;uƍlBɥKf͚5nܸ3f9 444##c̘1ߟ6mUhh?L6ߎ tRXXXsڵ{W_ӧEgΜ 8Ǐw^hhB3f cׯ_>k֬K.5[YYQMϞ= 2fBz޽3!g̘<njŋϞ=;&&aTC-Z8~۷o_p!&&&###,,L,Θ1#---&&f񁁁˗/߰aC#30`_ߺuknn۷jܸq[}YrϜ9xcZ1c׸q¨J;w.X`޽/իvPqKJJbbb<x@rիW͞=ٳ`uٳg^zʕ{vPo߾E:tWAAAAAAkrHԭ19B<p\WW͛71S;'''KK'Ԑ[UUeiiiffVTTTRRr񒒒w} ߻wCFDD4 Qٽ{7�]PPpϻ39xa@@SffBxQzzVR*j Dƍ{rJ*GJl$Æ 9rG}$H߿/,--ݻT*]\\�RQ\\\ZjUQQa4rҥ/_Xf ettͻ~}6n(˅Barr`gddrLOi!/hLNN 077g"993ϑjUN4AAA~~~;ժD. ԢR__M6#dff:99|Jt@jdlllyR ͛76yƍe˖mݺSN>dkiʌ ZʹjDDu:]zzQΝ;׮]; XbѢE.\ݻwppŋU*}DDD~Μ9XZD"Ybh{DDD1-LuE\.96m---eO?&.^H4:… O3lF2xkRB/i~m۶ǏOKK[z5[zoB\]]Bam4 |VPNH$wޔ)S,< V4iIZ* 2a„[2x=\.oժwVXX߾}qȐ!Gm<*ɓ'Ν۹s焄0𷕼_~|AScyzz^x~XhիWO'Nܿ?00UVLFe/[liaaqʕHқ7o>Ǘƍf͚2eJϞ=Q\\N[p]FFƕ+W�欣̈sZ$Izzz\tItU ,\p…cǎԩmjժѣG;99m۶m۶h`ݺuݻw2duEP0g96IXe^^^ѡ/0'&&iZ?ܤ>}?^PxyyչaÆ%K[[[Sմ4N駟;vvUٳ'))iÆ ԬsffϞ_DFFFFF5͛Ǐ|2MHHHX|yvvyZlݫWDGGgzҤIǎܚ5kZ5* qf0aBttt``ȩi'&Lвe˨h;;s}"˫[nǎ+)))))Y|+WVZ{Q&ӦΝ;:(|G|rTTT[Tuj266v֭6l�-_|gNKK۶m'W6좣g̘_gRI9c722? MHH>|xSBCC/X`ر;w?~<yE<xp„ MΝ;{Rcǎ=~XYY)Hy* (&((ޞ0K`rtvvꘕ49q֭^{T޿?22~Ν*ɓ'Od͛CCCo߾1iҤ}]v ~z?ov(ǐǏWVVvy]v8 .<<<-ZDE^JYe2YF7oޡC\G-X&Ӫ ,<yrhhhrr|Wv^pa:t8yW_}UG00oݻw+++׮];|U�� �IDAT/9s&zS]]=x`R~i> ˀN>h"ggg k-ߟX\\<p@!<!!ٳvvvTrRvt֭W_u޽o߾M=jziZKVV``Vdff.((pvvJ\͛K>hd"R///BQTT斓#JbqIIH$r433k|{i4L[[[*GKKKGGǜJzr{{{�֖{MAAAee%+//OR1TRTJPo`0W8::SϑɱxVV{-2TQ@ <GgZ**‚ZQq CZZ�TQ)$U4`002ݪF@f,,,6v0=NL&DYfQ]z;(+y"(--$''GѰ#3L ==1+)ҨyGUR3Sejad2 :t*r%%%ԲKXrRTR=غuU|Ԁܠ](+3.7V\qpp s̉aaa ,2e5 Ŝ9s2jժ۷o?ӡs/wQgϞ0gΜD޽{9YM6Fj}W2&L0a�7fC63▃_�'888888q+N\qppppp,<h0N:5 ?`` ǿj888888^FX>m/  @pp?7�$T8tqQJuM8^%bqǎvght:]׮]xehQ}ZZZ9;_ʩS V�rN\qpp\PIt\ّwvv~hZM$u}Z~=s.S\\ɓeؼys.]w^n~~>uѣ=Jj۶mKEdBΞ=G >#�gΜq�77ѣGfA-[oРA�6o,ƏLQ-[F3|p//N[zu۶m9Tfr(>}tС~iii0yd9`YYY߿BB{<y2;vt޽K.LQ8l>裬,*G�vvv'Or 8^1^sPɽv횏&DƊu͞=-.^5p@N\ F6m>|xO9s֭[|>՞#G6hРsVWWcΜ9#FpqqYp` ٵkWVVPΜQQQ...A 8pƍvvvu"j4ȥK޻wO?]nѣG>W_OgϞݳgϋ=VN5q/[l֭:zzz2!,X@ȴ[~~~TTE*555**jԩ"(**sTcx:4�H/lذח*jXXuoDDD߾}Ǎtƌvvv㈈h4=z8uTrr+)�PG;k�%?8+v=�?{PFT9fyόN5H}gr;vT*Ο| k}}^6WHIпS@֓W$D@�?0^@WFHۀxJPc�/.~~~!!!ԑ& @[[!CjԳgώ;2 RRR&N Ï?ؼyWۄ2rȢ">vؒAQ߼yݒ%K&M;nܸlO<9$$$..JѤ�2dHAA޽{ ̙3/_nkk߿[o 2?sss{aPP_DDDbb%K޽{i???$Iv'gff։R ׮]o>ydedڷo߷~KO?gϞ7ݻ .\bŚ5k�9r$((($$dĈyyy///gRϷn ͛;wlݺ5uڵk;unU*bǎ-,,�0RVϟ?ժU;v>}ѣ gTcHNN.((`>{۴iӦMb�Tx[nM:199wJ�wT`FViO0(gN% z8�r`8G< 0�da7 x%r~*yՎ](i0'll$:;<H%zdD܄yhŨmj z}j4�YYdPЗƘ9Of ƒ<�%(jY//nt޽_~:ʪ �RHϩNNNܹ#nҥKWe^`JxݻOwe˖oٲ%%%dʔ)NzjNNΗ_~ggg5*&&NfffFYfwcӧO֭ŋ:|pR٤mj5kPӧO_vĉ'L[oݽ{9))$Iv]v^z׮]l/ߨ)))|>˖-}9sf|||\]]w~:)//:$IZrpp(..VTz>77W.[ZZjT0�L~gnÇϛ7oΝk֬xɪc G  �a4Dkl8�+b@� �^N@{X�l!ZVIx֙1w+>s@�X��hHЉ{�Y{?Qה 4TMhk9;`�0ch ��`=`�mHECr(Zmz�Lw75UUH ջݾDrcy6lذaCaaaxETTTxxܚ={v\\3%8zaÆlڴ)(()gҤI) c\\ܒ%KsV۶mFqƝ;wZE?p�5K?a/~GܷoҥK6 bnn?ACnٲbĉCo 4eeȂ .< AAAqqq ,9sa._ߐÚ @i >5n:P t,p:`8=0F 'sT���Xi�o�@ �@+X�б^D m袊j �颲/*J9ҲhW6=AV1= ۷hѢg|{>lԩ]v]jճͤ_رc_#Gܸq>kp )))ywmڴiڵӨ(,,?~-�9?ڴiӭ[:w_/]tMm˗̙3gԩFoԩC{׮]666nGv=� b͚5ݻwb3m u3Q2}Cc�.#�@>P�k���=do7dZ;Q'S5BonQD}9$`�TMp 84 V Z3€@\=e˖%&&{r狈ؽ{#G0ltHϵk^xq`ڵW}]=$Μ9{9s<M4bbblmm-�gĉ&LPՃ ߿mLL̈#:usHǖUEEE3f6lسxwnzҥZ~Xzs0iҤ6+W(rݺu|>O>ƍ1cf(H=d�,x3@m2s(� 8` vtXlE9{f5ol-ڄUD�ׁˀ;pVf@0f, Q)Agu`5ʟ 63naPVd.֧ӛB j ̦])SFO4oPǘ-XŒXҀɆ^D\d2O T*,--y<ޑ#GLTZZJyi| f͚cǎР {\"XZZ &>|_~*O?իhnضm[~ڶm{9r{իV:x^߻wT*MLL5kݻܹsFcjjj>}4Mxxo R*h׮L&1bs#nٲrǠ?s΋-Zj͛M&R3f .H8nݺ]vnbܲeŵk(ffVk$Im6**jƍ|GP(8PgՅŋb1em޼Jb&d2Yzz:S={x<KKKHDYk Λ6m�۷ovo`��@ J 8�(�@hX9L@=.h<6YB @6n=~ �==ՊJz]χ 8\eɳ,:QG!Z�]BykyZ�P+1ܯ{W�HEh:se#@ӌ' -SZX23EVkZS,+?PGMwأRW~quLC<ի?ɓ'CBBn:bĈ!!!ϟi?>rHT'p’%K�08@9 f�iCdқ\�L@�@Lv<h}4 xX� de Ia6 $<pt@x�̀?dw8tv]ƆݪСC6mWE qq]/z0 Y.�ǻpw6Gj/n(m=qu JjcY5-п]o�2(ѽgTdzXPeefenW ݻxk*8w\޽r?7]@D^�(T2`(8E@ 0l&"֗UtFnZ8F  [@�o3P x= �h5AY*G V^�>@ 3!�;�F{Xpzk{m`Xf@OjMBSpM�@R,kˠС%b�p �aZ>K`vRTJEγt>R(iĦ9YI^aLV&iҤI? m`By^JFZc3` ܡiKvL-@|(b&Iē97XCj{z| EB -g&�J[L8a |�a Ate̹Sc$e�콊QpnHPQxҢ `4r]_+"5xwIq�ͨ֐TYl<HݽC6bN\8)))III2q/C\o?{$U@,@|,s`Y mR8oulON@]�s  ~QRw X;ehU_mL K3s5d)aT�vt[=l |hV.M˥LLlpez}Օ;d)i=x�zw  �(en@�^<x(% T3cŀk4pÀHW ikXI[.7��J(Ԁz =laV@�H�`ΚX:u汚6{5f0 c|ohA)CR7mDQKЙh_jzM`�| A\o y Y+Ԭ+udeAYe$ Uܜրլ0~zq=zs Ht� 5�sz`m8?钧5!J57x6EM18U[��h�pɀǓZɁX�x" ȢG̃ :�#PE[� Y!qv簟w�;߇x(D%55utv "@/�Ơ˺ k"v ގۀy^@,{,_8Ю�OJ˅!z(/ �@ssqqq۷oc88{{{WW_{ Xf<@8 $X7 K\5%Ȥa[@ $�@ l@Tۀy@ؕ%f(IX軃oRtKO �T8TvK~rI08i x/Aw`aӭP/-1c8c9sܼy}ZeXLr CZ*�͟Ha��P/%m64hA�`0p��]�DPEOhV (90p�@>D;[+\nL) .6A X&SjD2cV<M\iXZފ&~N\qppsNvUnˇ--6B>@�Qj` 0Ji&ޮmz%T@*hhjq($@.5,z'p>"o ʒX[,~bW2=ׁ7 G‰0rhS sU󽉭C \:X[KK}_nص)J�9AGN!�V[xzyX u{Y[ >x�5kgV0`Μ9}i ѣG=z_exa%KoR6n8#~yyyZ jժի9e -7�!0uuS75P@ocLB@ ̤@le/�Bh=Wlѝ*aNc�r<,A@0F ,�@' jRwyiPZZi( �L:67�`F|7|17۠FT@MegcRS z3P$L 3~9uD92J*%rL0BӷZ rRI�W~ы\hdgj,quС |/^ 6lصk׌FV5LF�F>rȑ#Gbck;ܝ;w+׮]pƍojV?<xJĉT3&%%%22Ν;u<~m۶iZݻw/S[qc$K3A{X~Fz+8,\toz=H9г^Gۏ7S pw* <+x p6h'uPiMpRh玖@3Sh ~:R;FGҞ&O/5WbaS4>Q07 `s"�- jrE8v/hܷ9%$/ֳ}Y˖-SV-Zy5ktM&ӕ+WVXߞ?sj;vܾ}VP[�� �IDATŋ>䓶md~mʕ@^^^GǾl۶s׮]ۿǎwɓSNm߾]쵺xkۗDdee9s歷9^V.6"3햳ZYy vz> z�g �Fo << != .(@1P hBzT8޴E =4xe=O ȁ@լoa�$Cd9@".�[9: %W䬓rtwq!,BPZ�jP.Bj\6LL!ʥΊ|B�'ʤUn?m-WwK+Rlbq'-xxxsi@'O)߾}}z;wXe˖vvvݻwo� <_n۶9~߾}_~T*=}yž!5kf|bPYY,**W/+A@lFCR� :9�@@Ooho�yu<`(x<.œSks�X= HF@ a @PF{o-@"-G8ic&%c)<Z1Seװ,g4J]x^"V@>au, 򀇨u7ӏ!VP*0CgFa)Ҷ8F` Xx#n=,u .%F3bqճg]vϞ=UUURQ>� /_2eʴixTn � N>|P(\~=#88^>: ̀�XG&b 8I/~�Z{�@.::.i!abph?� Wj0`&0�kb�8@6�,CqX d<! �P d�F!0uGpļp4ڈ0U<w.Ėhp4{e]'o͟]xFix>>>NNN|>9/%%CgΜ9uԤ$Dœ\j߿X칼\kN8qbqq1!!CZl `ԩfzZ,P*^K.H$)))prS5αi-�轚Dod[Kt8 �X[C}|7�w&LDF4v8` lDztʬW �{@d@P|N@ v�@% LͥosF^'tA{QQ`GR<A.]@% fXF6@o]$1|� :�vx<2?ϾcDL?h|8ޙ˜eg;yEqoo޻X.hbXXƘ{ٍ[T m?ES~ބٝ>ߝ3]Ǔ54E%ʐ>E0)c71' k,`,sRňbE޺iv9lذwɒ% Z`ˁ={( ///]```dd]>>׷VZ'Nx5kϟ;ty׮][l[ k.̬{ ^2~GFEE �!!!vvvU*=wa9A=(Gzp Hvo*(5oءr)`HP!Q$-4hH`%e<U 7^RGby?zhipWOr-Cç DeFߦh0'x�p4b]NQA0M J1cH(⢽'>P'h;|@iX�V4m~JXϣeOl`=}�-w<%W9Mɢh&tK-kOeqmPKpkϊfjJ^O* 2hh,,,gff>ЪU>lРA;vXxqN˗/?uTffԩS%Knݺ-Zԭ[7`Μ9uԩ-;hРVZU~>|xϙ@!۠AgVwuuϚ7oԡCa@RU=&abU�C8m'D,+>):dPdzp P(r-bwjH47%ړЭډ0zpڊD1�~pqQI=K-a|&&1d!6Ow2P& 6W5 ?o erY bw7t`sK۲~+n6Q\mfV_a\ 0LAG|"Â穗8MA\\Ȧ Foh0PxΎ?^J@@@|f:}vڵkbϯC:uzWVM8-Y&!)9bd `" ,zZ1JV\͌=4͕?M 'FwF'VOtty|Ռsͅ-pn4X6祡'mEPJhW`;!$xma*VaRklB&N5lckC-G}k-)F3rЊjgoMKN()cOT{6d-{Yg暫WbڵQQQѫP}:>@*Aa+YvOG ց t\C8 2xJ׾=jE_@(|OLۓA!DDCx0`�Z = P& &<Gĉ :faڔ#rhÀl�2͊լ/s#K,uS0޶\:?4{"Ll]mՔ>6Œfkd ӗHm f}{@=ruFQ=_+]lĒt0WG=z.**ήzUoWş5hWrC0[̱ہv*F26 X!Dn-=ȬYR&  l@dڹB-0`&i00,܂` 1\A j@}ZZ 74*1a V-dP򇐂4`sd|[s&5pER#v/\s"i.nsﻆoLA nE鴩yYG)O*Cs.ځ_ia( =9�Њ?EX<VjTrPiI/Բq6,XA0'@,Ff,\{9@Г邩"C*d;DSSNp,'94rSJD0 C$Bu8GjJ_꿨nO~w_m6l wz/jZ.oPi<OkԶOqM/XnDjk3�XdܿX5 ,wGizendd9YLXS,t:J`5ٕ0D뱐 <#%`ă%4K'2*X1cfw?d1Yn̠;O+h cl{[TG\-) Ѹ =g r֐pmnL0 \B6$]\GM 8s0`NdL @BOّ&,;>&KԈ]M0i`8?83Q߬&gBQ#JTB>uQ^ұ_h6ѩe,}"ta%$W{ϩRE_\9D"8Vx�7QbUUCM(ȅː ·ΐ_J@! lM:1aOcxN%$:4gh&vC?1|TtzufI0;`@UЋ<N]642q4LҨ^2,+5lZPnJ BYi?s+;<PIA*jYx}1{AyK4`]#K64׾5՝:yY) ^^smxpxKڼ1܇/Rx!!W/*τ?!ѦMV[Sa `H8-"�ĂTe?Ca7߬Ƌ�"#y1VPh D>ߥ=t#~r-!D`pjX+c1 L@ P s+,BXy'P! ``VO$Wxr{5hK�sSl#׆?p){Y7 u0,4:9mƷ)0$55KKyLlG3$.L{St{[vENJv=m 4R*U6t:U*?4rx0Dz bdOHb3l/ OS-(jm6(#v*_CޞϴY8ס;y!`<LP`5� U@To !OUw*hPW<Tv ZB*hJ*"`B jd8{R M}c2xCSnnQ1fDG/Nf |)v }עd#U`Rl<z Y r}l|7Phuߖ/Ź(]7NH`|а<DRn&h$j̪<5+"I(-•,k8Y[ncjB/gϞaÆ/{رݻW o>ҲjLWAE td -`pAFx-=k 6zjLq='+1VP\ k#Jf'0Kȅb(h!~z! @% \ҋ`ס DJ0- J21bR03I؄} tkTK"o2ɪRHoBh"`*r+]nuSle|ڣ?>߀(aP.XomΏ~�f&e�؉N"Y<@ xc3LEI߆,7r8.Зڼy%O֯_bŊg;wж  ƍ?:::۷WPepE*Alm1]p!BH/T,6Tt"MVkR`PBLq) dF@Ȁ+pr`h=7}t . C(&B>" (~J `(noĚ4Hf`k�lw&)0eXӄ񬸎k~__o|8KFP?QJF e {jH74{__j4i$`ҥo޼y[_xcƌ֭[FFFV.Y3q177=zj@:|C["8 ΰ ԃpNC(܆@h7E%J3qtzAg[ Fm`hSq`3%\O8 `6\�p{ dMpa0[l p98  D#<qp~D9&FE> |q38рA?%.U֘?p{[>giLВZd%oJY[49*6gW.ė=<<%%%cƌ =ztVZjUݻB;Ǐ߸q#--cǎ#G?~Ν* 0..j4B$%NT@#R9BYA!T>duSa5, `&e)ލ /jg\}4pA6ܷ%5Re%4s!B$\Q} AA\peF"rOt[e6R*^2Ld4jkXyas`5boej KW;0se6~%L�$5۳GPi*M^nDlεnߵxB gi (ws_|$ոKϵ  ͺYnC+ՆyEi{E!l3#yخ8>ωF h۶mVZըQc.,,h^ct&!!yyyB*~GUFrK�x8*tH`4@M@F|&'@78 '/i@+@=] 塔 I8 -`- ZAWn\8 A` !4A2aYT*-8vPp�ۗ=A2$94 6<LR" -@h N~ZXIs\ߞ~<0ې /HH?YşTTTL C.Qu_IGǭ=mwhH-L܀\ 2.4 6UsĿ? '&&.Z(::zΜ9fZnݻw_؝sݾ} q*\]]7o޼yFUFryO;/*#֓'W ?A"@| ! ) w.%PACGJeҧO5'1a2>! &0Zd H`+DVFѕt�KfV` t=4<Y >+WW !NŻV]wuO!# *|/Ե<}NJz6 IZLKKˁ.Zhȑj&O<mڴ?/qMiӦ͛7cС͚5;vlPT῁@w8OTDB' dA?{d-K+|�{!2K' v"ut j;:4:H,P]%pȀʶ٠~q0sȂ`"nC-v bVL@DAi؂BlhU->:[룾5Yי[<iol]&iSW=%]?¤�@kgNp%$F$,o�1ιy߰:Q,xPкr.lLnp5辱PRʾȢXt`۬z]NkāD?4Ź222jѢaFlllW\pcǎ-X 44t޼yRt;v<~xPPPJJݚ5k>䓳g&''W+:v۷޽j@_$zK @Ppe7 PL4_Qe 10h�s`b-:6!(b8 A I10.,xNpR1 HBajr�\*PG1X\6뒏RF>J ڴ<2 (VSͶhdO'ݻJԬ|rW @VB\Rir9eר m#5 h36mJ" gg u7 ;I/{вe.aÆU^=zHD×_~ ߿UwoEǎ߿_5Ux3Pg?,xPOp2 ZAg B C[ء{Hwv \o>Y5O�$)*%X%G՜FFPS` ԆePK"VtKj6tlm ? XCty B0p,~۠`G˖M E3 d[4竓7�� �IDATglw7O]}Jki0t v� gȁ=!P{oP*TA/@$A]H~8B�\c봮TKp`?\pMlPF c|u42y_hy<hװӒdqJ+U! 9] C*ZdO4Rp/Dm (@Bh -@ P C%brNxxPKqe2ݎtTAH(2F-cf\ BfoM$FҴRi@i^]=NH*48$EyTtM)RmCFj M!s5r#Ɉ{vAqn Q=&ڷJX㌥-;p#E/5ϕ+I(UPJa҇ t7FKKB #)A4xA DCPY<<B(CpPnK*\BU@]-Z-ej˰ 2KQ])&$Q u\879􉔉>cZE0�k1/9 Q, /]剝CX&Zh -RiNuоsB'9ӜzFQ-0(6P[q)ٸnS _J:�pL@GZFe 8}{@GZasf͗tI,BMb>[ qB>k)UsZvU<q-TVq_*qqq厪U�-(!wߊB*Xu<k _ cQ'I@ h;|w95J &:ThS+Td#VI#,=ʱ%MaH U^ނBaj>1RDp)+CEy}I^ 4\ vP>p`ks&E“cJfw/%HШpxTlJ?un>Po͇t3'$ZzfzO�{1eY*4B^?d V+HR70 .Ę((TՑDҠ' pIjx[h3嬾s#A.: KJ fjXíS,xXHJ^eS]r0HXB4lDM.ki"!Y ˙&bCY!L4k@߉;@ @X'H&CDZ֔dhM0R&=1t_.7" lj"ky=z^}/5r\J֠T/Y;%UЮ&nP+U^31N$W@E|3w>;:hе5ȊI$O+l Poc}v2]v,,,!kee |0� >zP9P|N-BmULa8d1qPcX=aQ)&Wuqcc9ˆLSPZDB$l\b+gbM8 Jp?80\/5r`-X0KĮc(zU~ AGi yȆ'K=pqnYؗ` T/OOJNySw1{6%P'">u]PEW.η4lC,xR`Bʄ<{ޕD%]|qǴ+݀g4<^M^ebss[)q[eZԨQ#$$W$<6HNNvuu---kvӨQB{:uGZDm5.hp ghrBp/ 1w!Z| f GAAVXdۥo3ΠI$_#݃<cXS+wI7 Cx g`:h1%d g8u 빌U]a5gwɟ@Kכxݕh Huӗmx6}IIjeץ x`=ÅYI[</G+PL=fyxSrZE5,YbUPh{{?/ٳ_|yy?!$xҥ:uOI7:DN: F5.pAWa |k!@SbK#$lJ\x5>w ?UMq!h yK#t@[Fm nAVbf :W`=!=C^.4>g< p?$CѱON|=Ƕc^2-Nz+9)<;'YBի<ӱ|7Ậ2WUspCÇB1dY"B+!C{pM4WԂlX ឨ7xP 2qOcQ)cuT}52R$`G05tH~}}G45<BL5qI-`6PA o9$n'R*~pKt^ww9Ղxo8G#1Z#xUdH9jF_:Ers!fr꓆>*Cqm�L V9}jS­>[Dnpӟu=>䗨oʿU{F]l`%;�Rӵw E(u"%X:ku P(.] ׮]{ܹȑ#k֬),#\j/_P(_}B vR(7 ƍפIM<I緒9s7o޼k׮yyyzj֬YƍLR\TXXܶmێ; S[h԰a˗ݾ}[?2~ퟸ°iӦ [Æ  +MNN9BfȐ!>>> B=333&&FP̛7>KI~e#l[Pddd<x;((N:zg #8 f` P `.2 a AEbccb|9m$P`$<�C!9#WSJG[<)GK,ڔ2$PS ^B8;Pt0|#RX ;*QMdЂ't c\O])_ S P q#�?)B.hpZb"R^@iiHw`VHSx'8RNJ. 5miihy/$£lJ2K3VJR).X ̜̤G(q<BcvQSa%�!ni0}Gd`fK3U&ij{s UQQQ[&&&(ʘ=z̛7IIIM4ٻwhN:xzzfff=ӻ'ONJJ*((2[oV(۶msss4n8::z6l֬Y}'N8884lpժUs̹p`ݻn:///O?ӱwyw|}}Z"8yrΝ߯SRRl2a„0w0a€RRRLMM3gN׮]ߐ 'O,((xb ??…gΜ*//pss;sLxxxvvven֭@ZZ̙3㍌/_w]vMg̘ѣ磔2utR})S ><$$gϞ=�l@ (I C ,tb VCc1c&!W n Aΰއƍ]Ӓ{aŸ<-zu4B.6Ez&u(M/SKR̂2V(@Na&(I0AK8ʼnS� A)Vz=xE /[jL7A8Q9K- &6t8t{ӄ&EMu&p4F{JZC#a5'X[JG~Vs[:rZO#:[x0vS;d(e@d[+W8qUV9sΫWN0aժU:txoǍ7Xǧ}G}V++={Yfƌ”Wܹwﷳ ,Yqkv9<<… Fjذݻ<<<Zh|烂uUV}{!zٳgOa.Ҭ>#FL8[n;@8G`֬YMTqqqk׮]pOfff~ = ?~;vpttzj~.\8gΜ̺u+�زeѣG  ?r܄Xɓ'*h -XCK0஗(YW7.]#<<pL!աpp݇pkذ{&nĉ+IلT 󱒠3$')L,.H, FcWbV1b0J~ ]Qp'C&NX w!]08G @C05)B6v}:0t)䟇E 2y&&(շoG JφEƼ뼷EzE/6:paWdaO]>~i'*zel|OĘ\7Y54*mf3LioYIH(L(QZ)f{"uYx7:cݻ7zh`R@XGÇMtҿ G՗_~cǎ.] >r ֮]+|:uR ;vl޽+g͞=AvvvJR}'[o-[v:ԨQ̙3SLc6999%%eժUmڴ裏:tЖ-[FUYg<xpÆ ͚5/^,\ok׮}!%%eÆ =zhР  6Gm۶~ <pԩiӦ <!8ybo{# T j 貳~pwop5ݺUЯcc:р X`!AjB-Jm)O"IV;]FT\&G9RdfuH!% %Fg~Y⟥zDyCɼ$f FgfA굳 yk KRv sEi3#j}3yI(B,Dm $ H{vϔ6WMT.[Th<<)MXhbx sXzf0+&14H-3anψ{!]+;=&^P̕q�''L!:|˗/ox7\r,..nժegg~ѣG_x1,,,8rٳϜ9cbb:888̚5+&&G:uY~ŋ7n(jFvQTTy̙7QצM?2׮]4iRJJ бcǖ-[.\p޼yk֬9{lAh4'O:tWϿx9s;;_YW}ʕ^z999 :nܸ!C|rߏ4~|="*x_|< Ӱ &8yVxtG! #^^ݺUm01=2h?R10iz Spώ m@j<լ1IP(9Z&UgeY po?YEBBt?~5A2-+?OY6ǚ&OU)n+ϱ);/ M7;G!`҅N)2r�LNu/k]B1sl62hioPWcfff5ʕ+CCC<iӦ+V\vjIIIVVVeee|ǎ ]n]^KJJ :u4|U};mB9}-[TFV322T*Wny츸8SS^EO8qmێ=jffbŊUV*a!XX[[;::>D [ R`cc),,LMMuvv655a̎;5j!u1S@K1:-uȠæ]z:0 Ļnr:2gAGxm7ױ%7"̛rɒ|4qVj6^B$Rr ׀ӰYG:J !*V8n ]�}D,U]-)JkpaRB)` 6;1622'9bI{@u٤ɴP>]IJuiJgjHx"2Ua R}{kqan8Z#dZZYBs,bw@"OWz^VK@u^^34y*h$})k~J!5C6yi�%4f J;vݻۺuk~@PԪU 7oޫW!Cl򫯾˛2erj<==\"J---)SDDD={ƍ�kժP(""",--U <<yVr劐W(wOgϞ\V5k NL֭wa4mŋupph׮넄֭[dyٳH+dD"nj:Nӝ9sFhUnA̜9SX+''iӦBm4wޕߛ7o,\Oaaa;vhݺȑ#ZG>|P"V3.Яn�=p( ;8"*�5v %Gy3p`tBfO\G5TغguocIAuR |Im9'+c)3ƒvLOe@ZZ=δ0>0v@0<6Y. jJohֻPT.W]@C{ Y�ɰϥ|f6"hν,F  +@4ll�H14J0ׯ߱!goIP-A `W`1|A1O9|HKA?v@ף]_ GwkE%VҒF>FFFfiӦMx+ }[ LMMtoۮ]"oo;J_:(ʬ,ww 588¢Zjޙ999]v5jO׮]5jӲeˉ'֪U=--MTӧw€7j0'''''ܼgϞ?dÆ kӦ ɚ7o^~}f͚<~b̘1~~~ڵ+,,qss9s3{`mmms_9s~]"///O:::LբQF=z"lDPja@]]]Ri&M*cc`wwgGڲeJJD" vvv~fEaCPP)(( 88vڕ{tqqJT6nr=??Fw@ȓKE�` Ɛ$ԅ`pу5ݻ7nހhf`tXhDlGF.rReZSRHW'M)+H4Ai*s $㜉M%%h`Y=yTXJM ٵBx! d-zr+'֏LCإKSSS//ʧĽ{=V>m933U|خH z@ţTre (2mdxKKtm(Q`!A&+P;l 5BY^O^̶-tlkȥM,+Dfg`)I-_ -+:t022TEe$Ueyɒv>h3-3M9b2d[�� �IDATAnnݻw۶mOPСSUQRy{{T-<Ɗ0 s,Xe@!C9t NA _T +;` nYS_Yj)Z-LL|LF1fX5$�=RE$5RZCZV9?j9qyEum K/"]T XbGc`-(64Xcƈ5DX17ώkĆDRl8f\)g<gf^"%eZ A[~`j5k֘O;q]V"6=0 l;)pJd)kD16 E\8(ťeF @jv*G⣝eܐrhe v\>_a3n "éA}vնmӥK+y hPF\A'@<D3-8H#AA]X�1:ψ7Y-Sˊ$> r-R@m5A  `5X8aP>sp RΥm',z_s+)gK(ŋ<bY4Z}t21,T7aolneߛ;?:6\UUN#.=EJQ>m#A^f~1t(,td\< m+l3 ӤL "u@]?xl JWfјGvvû_TgxWn;8 a?Pa j9|]ua/܆P~]zH(`iȄ\j=K1FjnN4dEq)b a}*3Oa<h: f`�V $p>-TX4w⨊Qo -%A{$J?dnV˲$YJbu[|}Rł%x;@KّN& )]c<+UEB]_<Bh`qFE8 $V^/2rhUVK`aaQizWw^ﻂ+P Bu0`w C,`v j|xe`_1ʡF ̹kd2,OA;6ZN�Iȱ- 1 GA"�#0@S2\CځJ$hK97ش,݅?i~?˵bWs<Zr&MᎥ =nNk0}ѱ2;S9pvmuVʄ|r857 $%%{ÈRyT4>|hcc4˗w htA4 |� rR! q8�Y)tK`Yr=:婜R$QM)ְB. 8>*'|+\L#csb@@0Pn@,8Ђv` Vځr h1m4,&O1�Їv}*IU1˙F['_3'e2Og>_qұަoQ u6ʧRa^eژ+ʴn_%ULU߲*`h_5ahh(8kP033{( bS06SXqR{>N ҠlLŘɰ65ZQ10E;Z<9oN 9)a}ư<mh�PjZM6P�2`S(@)dArˀ 5g.h[!_疃fo˩juS8)zEB_j6C'u^ƧZi~[j*� $2!vjU0˺q] !&^$)v׋fKC5̕[\8s挗WmZXXN@{>} /}0 \  Q Gdp@F rѕr.tٴȁ\KRi 92*6VWX#gn?C?&S셎P3F t V�&�+q&TOl13{=Ygܫܙ*me <(%)^=3FDtU7 r6O$ nE9fj%_L򙷓N8d0N-И2}ͭ/v а999bڷ�r6Tp l! :+$y "R@yUa^@7'\'lag*0D,Q [S BM {)p6B p#"+$>+t@Iv.<#|c!0zr-!-Ǥ%sĂa{z^$1ƉnLk"@2Sg A'(xȷ< BL3mLɌA),T5gF)` V8_r Xl)t\Uo=jW4W!!!R_6m.#jժJϱjժݻwwHe/jY)HaY[[�mWP0x`0/^ZF?cǎ-17...mڴ??B)IIIwwwoԨQ[UuUi'O:Tnbb2hР˗/GFFUV#ٹm۶85쀶 R ;f`Q0\.AXKhO,Xf(  -$3Jiu|s1N~ 8%N?娘6rB3N*X*A]! tD2*C Od $'aCoSc/\ZjY.K2Z>hO,#bX ؕp;bAydAoZ&^숾םuJ|t| D�(tTQGwh]=3.^888XGGGGGgf }ٲH$2.^x͕q޼y۶m+;GEEM>ݻ3v l޼yB RD"Ν;uttBBBffVV֬Y~7iӦ^zŊ%f>f͚R8|٫R/tȳgϪ:*GD"Ν;g͚%tXbźurެYttt$ɍ7O~ 3go3fg̘qi;NpڀA8 Ƃ,XQ�{ \2k ^ȉF"v[ *Hs~ѕQ� a/aZ-85AR^.cEeV�V×e>Z{r6jD/ l<]rh Rs9/a8&K=&1ѐ/']y~vԨQFT4.]T<yk׮.\�nݺյkWo]vڵ0B޽[xÅ v"v9r"\Xظq+W=)STRe…rgAyyΜ9Æ KNNڶmФrܺubff6a„͛75FE׷I&AAAɹǏwuu.<p]ֱcGUoWURe:qZnc'NT1~uQRaذaF{ѦM̄F{T*]fYfkţF۷o\\\TTTvFvԩ~uΝ;7o` mad@8 h ۟c0�,䴃jpLXk3T98}X`%Ǥ# *zjh 73X #TNn4wrT~}- (\CEC[y .Kԇ1�^G8fJJ6e]Nlw<$'9&3*<p{{ؿLz|۷8p֭[wm޼yLL̟=x/<yr5jԸx񢡡u9"H>c;;?aaa;v(*:tضm۸qN>maaQ.w6777775kӧ6l(Λ7///}_~ejj}[l6bĈ8? 555##cȐ!Ϟ=o^%H7n{ ޼yW^B{/ %%%))I͋/HFGG*݌k׮.ryvvkzꕘxQyU<?aelN yG5؃TDW cqkԌTxa=LN\₂y ̗ [`4 `-)" \ ?)HC>L�k�bZ)lA3�2`uOD<O<z^)XC^Bqb p_2Qw<.o!awp0MJժV͞2ULړȳ郕0B9cBO^eU5c8]b\Fv׿w l嶶[liժՈ#zlٲnݺ3ϯyÆ 1bСC<x;ryݻW5HKR 2*̙3$+"յ[n۶m5kVY%^ ˗/ɱ[lٚ5kf͚>}ǧq?pZ``iZnݠAooooo!C >\%eSL<xs桫UVׯ9s… T^w{͛l'O VɎ<yD}ժU]&ӧOr%ف6 ji$|6!Uc]fWYC8ip,E芉Ѽ*ɜd<:` �$T3zA N3p�;5!�Z@)M^1PSP@|94Ty r^I`s[>Dkw)/&-fZyft;cTe_: ߣs:g&t>z*eźB9ڠKzn5jcǎoGFg7o^vv)S Գg+qi_>}СC߿ްE]~}ԩ֭.]upԩ˗/ >vؑ3zt:7olnn.p'Э[۷\ocǎ~Bv!srr6oܴivi N9!X$NX Lx4U@L*b6).*tL"Ba<8 a\( g8SP@ x>Us E(ƇK_V.Ǥߏ%p Ϫi`{5Rgo%K(aߑ[߱^בcǎNNN6lhѢEϞ=“'OwWEkǎ_|ۏ;F?sK.mذI&cǎJ'N,W6""88xĉЍ7 VnݚnƎ۲e1cƨRΞ=}vUVկ_?d*{V�SS)))~~E8rĉU;w<~ٳ-Z1W凳C{6h*>} ̴0g Hq'TxנQbd2΀|y�# p ~L8C&(נ^9bVV#AMت3,Ma]4*]J" ÔKgod'8UqVNe9gs7eGHpH?Yx:I�Bu:d+k|2L8FSyq%VS 4WeXӥK?#55u֬Y 6҇~#Gjrss<<<?eʔg=zh4it)77ܹsbFaddԠA?-22>߿Ϟ====;t啜_8::o۶m=ھ};pݻw6l۶m򊏏ߴie˾G޿̙3Ç={*wr,lԨue˖5iʪ`vvskB[?pĕ+Wv޽hѢիW/^ٳ111cǎ]pի.\(HH=z_c * pT0CN9# e~: Y  $@o<a3 ڐ�.o}B EYlt;ɑk^,% EJsv~s8y s܉v"(f rb`Q_KH7@MW-Qʦ]di(\*u^]hnݺmoo*+bCCCuZnݺU)D8Ǯ]@TO@6~U[UBQΦk֬)R߰0333yGCհ6l[[#9vXARR<7իW7B-ZPuHKKK"}Uջwo%K#G>\-[R<V5 Dk(v|OC0Ӣ zAa| � `ubrEXHV `D`#(Gh ) DpXxʲU/LcLfRV<d d*^ P k"efkR*YF'f2Տ7oN8Ap U|#?\P@)ꗔrR,*< R,s 5 P-V2v#̀-Aup� 0r,a='  GxBWr eo+TЁL0Ӆ}8㓌-$RL4b.i)\,=jQxpQ j^4JMU2Ֆ1S+ 1WeAjjjUh%AZ$̓Hhu;+n*'(NC=0W@#@MST DJ*:@"-J+-Cϸ 7A!/*3Vد/J5s(5W^^^^^^{sw~8III]wasss5 _c3#<qPB!#M  LH:QB�$Lx@3e@I|GS;OH”K9C(z%9dPBBaooomm>TVOOO%B!4hr|!2 7Oa0$@cK@ᔈd-J ZAZH lTx "N@KMob5]]jsR>X~# )݀6HbUmZQrIQ.T5H[Zlb%G%EE)먺Ls/UnܸaMMM*f+ ic T`&Kp[C h�3gx�l :0�,�4m89 7W4Xm(JO/HɃ~$o=ԚWI .B)Q PS&\2E[J%~8 C1W�{{.]ƍJƓ'OUVij͚5{Dbcc9ׁ(H+Ua93OhJ[UF@ ɪ`}*wk\; އK.;USxWq9{tt<\O9gw}اIL@)ԇlG!)CS zp�Ch g5m1WhG7(HnC\ 6CH^p O Br^5^ES(o_(s%]S:WeMQ_m@\KoG>�'_딛pen|"_!EUh- R.m0#wwQFۯK:yk�� �IDAT6mt型T*5k;}-[nO>yyn<<<ZhcvvСC۴iӲefddwkڴ;d2YDDˍ7l:99-YDNNN|MgtA6m9feemɒ%yyyNNNL:233=<<5kK7nxxxFDDd;v4mT8'##CcaqRa޺4QK?Wd)fP >dC"�%iV&s0K~1j i %mhpeTS)P4T 5(̷e:ϔS`W&2KKx--ϟWZD!>|(( TFׯ_vvv~zݺumllΝ;'lQ8;;RPfԮ]ʕ+vvvKLL̾}-ZԳgz >[n[n lҤIZ=zt…={3~ݺr&WsNttOݺuCBBrsǏڵk׾}2k׮To`ήmmm}턄a//euS`}}}Ν{ĉSN 2ɓIIIŷrΝ7k~3fL׮]ϝ;7~7iҤ_~aaa#Sxcjnoj7H18B <Qsfl\x񢝝]rr+W|||v޽lٲMΜ9SWWZjǎ H$SL޲e˚5kLLLOޯ_˗/׮]ZSO2gϞׯ3fܹs=''_5<<|ӦM@=4h~CCC{{-[HxW_}ӹs#FL<]v*ɓ]]]?)S9vڛ7ozxxhւ5t z+d‹-C>6mPS~Ql dpJX@f`\1Sy&Q:?)钎|75I{jg)w+2E _\{Qulٲ3gά^رw}w^{ݻWohٲe/4i[eVX1o޼ٳggJ +H AK&rT:bĈSXӨ[n>}vell1_or!&-@"A @<!IW) :ET.yjtA|9LSǟ%�^fZ__x-<\'|Gzzz*ar !!K.r$$$\x pN777ѣw#mv׮]C}7۶m۾}{ǎ+./^Yi]cH=UdAp:j!x-̚5kӦMSĿ&HOO][Uׯg̘1SNO۵kwСr`KLL43336)vJJIFT "..?ڷ>*iii84ۊ$xR0`3lOaCA@<ǰFm(P/y!NU+E8]5gdP_`d)-tèy.(4rt/ S,S-zvY/YYT/[ߐQ͛7%I֭4ibnnnzϞ=gΜٿ[BBBjԨ}uuu~';;)SS9}}͚5'W~++z+WܼyիWիgeeŋƍ1y'NQЪwiܸӧOCCC<==ߟmŊw4lذJ*aaa7nptt,ь]~{ҥnnnѡэ5RgRRRhhӧO=<<7n|Ν֭[k,Iea/�^J9[ @C0�W`[V-eբD)s[Jە!eA)l 5~~[U%OWWus5n8a$544Ba}ժUgϞqFppw}ץKy�/6444i[eTuT9y䊈SNPPСC"##Ǎ7m4@&]|9--/8p H"##%_ݼyMC$ 4˗/СCw}iӦvM\z{{[XXH$ˢ}oرڂڪU -[ ۪U+}}H :ulڴiڵ[ƺu9bĈٳgkHR)b F`Զ@9׆۠!f|!8`bk ɩ5Gժ`ǎǏ |Ϛ5kFm[nu}`8~xΝŠƃ 6l>Z8p`ذao- Ϟ=v7gm+֚5k맢>p@=]\f:T^qή+}7X >mvҥ&&& "iƺ_dg>vY-ڷo흛;`�!&F 4q?U$4 gc|0S%]rT#HiTirDQDYgj>Vs(E|P&cU9Δr6W666ǎ{#2/^t?ʪ47Ʒ :UBz\BtT*#EkQ꺳G^;Ԧ>*4VˢՔҠx7/) j!)V2ipc2111``jj*Hɟ*?NJJz"xRWC5^g_bjjjjj>TڵkΕWllljޟՐx%l޴?;V]0ZR/.iqE9QLIPVBeJ?gq[ymƔڜYsU>ӳyO*[bcca5/Z9\ * !pEm2T8TVRUZ*Ke\FFFvvvyyy|M=<<*M}P?v옏F\�MCok m&Pٕ\a5b*=/)V |A�J"P.PVTiD]"Ҋݹ(PUm Քc_\޽[=hrȑ-Zԯ_RAE-޽ͭȡM4qqqJ?p&!!A%`Qiuxbnʨ�޿7ׯ_r PJ"1w޽p'WޡCCc4xtZ,}qϗȥŎ~sUVǷ Jx*)nGQX NjbڪZ᧕r^is]fM@rʙ3g:uu !!!~~~R={޽{ڱcԩSçObŊ+Wfggܹs̙3gܹsgvvʕ+WXQ 1c̙3ت֭WӧOΞ:uQ>͘1ѣs >wܴinݺC3�kſ0*1lذ%K/>>>=Q""""77w̙aaaB0HLLT\Dթ]vmڴy:S(]\\܊+ӋxO(,,?^Ѳe&?vسg|}};w]vY[[<x055...ֻv_jR4""̙3~~~~~~9K,8p;w|||<>YZuر߳>|ѹsg__gϞ;vLu(11ԩSB9_ݻwC>|?(84YjRAAArrrٓ'O  033 ߿ѣGL<r~>|x۶m| V^=ACWbWC.=ztڴig>|xfs 6lؘ1c|}};uԿ={Ν;w˖-Cm۶B߿nN8QqRo#F<xp۶mMLLw>sӧOݺu֮^zPP 'L߿Yfŵ5E6?K�xAM kQŕK)ZF+=~Œ�eʹ.*^^�tJa8U+ *::Z[r%`ll`aÆONII̔dRR"dddXZZ=ٳgYYYiii4<wgtuu---uuuҤRiffX,6$ d2Pr6kȈ?}tff=rѢE-ZZ5;;;??Zj7oVzIttp=5xxQRHJkQ7rR@De)hVIERɾlr't *S+aIe3WP j׮]ԧJ ))ȑ# 6lذaEt]vi+U9ұcǽ{nܸ!F~4he2W8\fҥ/x/]t۶m.]*:[.((oU 55uѢEo5k'}K ,ާO#F̘1- \۲e˝;wK 4`8G!QK>V-jb֯Qx7>1tK^$aoUg&͕ݥK6mڔe˖'z{{߿)VXr[viӄl0gΜȑ#;v숈xKztVVVHH9s={6z6mlٲwޱ+VpppXbŪU.^o߾GFuUzӦM'LqUrڴi3z耀7 �8qĩS.\~={�+WRӧ'O,H <w{d=zྯˢVZGDAʿqnV�zXSd71iAA<$a[ C-̯lڛJK<VՋ/bSFNND"N^^\.חJzzz"HEWķB.rQ^^^.===P!@SWWW,xB(ynnBWݧ" *G՟D" aŸFtuud2j$,/׻*Ë/mmmܹ#H~�DJe]zzz�e(6Tx5'lllnܸ=L6d r"^ry6mlmm_BSd|R5ikk,P)cX,~͑Wc)S/?M*"Hl/@Zhiiz ̙3'33Fj*73MGGGPyDbff֨QFi U1444hY^Յ4$L(ܹ|6o9;;[VZiڳ\Pd)Nc<wv^7naz'Qѱh@cVVVɇvmDשSoUHTfh1W336mkii4[%hda4oH$Ev5@ 4`͛7K@ 4@ǣ͕Qe 4@ 4x#ř2]H/\YYY?~MxxxXZZ}iBWPP`ddTd*6@do-d2gddF/@Yj(^x!D%'Z'. ,rEz]v/\) ==ݻW~ft\f⒓5k&B&7ojkk׫Wzxxxݺue2D9uꔫT*UUxyDDDND"QNNN~s, ~v-}ې{ԩ]UO<**Ҳf͚ -X~7 QdK3@ 4\ih1WhhfՅ 5jѩS+Wԭ[w۶moJСٳg=<<€u~gY/-ywmРOݺu#F|䉇ǦM4/ 55nݺ_}SCխ[o녅yxx={Vӑѽ{ҽΟ?_n]vc٭[7//ueff )))>gxxdkk[%Μ)kܸYZZիW222ׯdɒ DFF֬YKrOzyyiii޿mɒ%oӍ7RRR�[[[''Wfgg?~޽{͚5ѹpႽ@Pz֭[e2ɓ'"##_xXYY5hƍ@:uRSS7n DEE WTٳgƩZ%Ko޼$ѱ"3gΨ܄2zzzO>}6#<G--OfffZXX۷Br@)x@S))) Å͚5311IMM~Ҿ}"E544 ^L&SV1tjii=~XTŋڠAG ZdI+.c:u Zj%9c9Ӂ7ogffz RRRrss֩SGh!{Esuy !!7o>uԁCwuKK˥KZ[[{cm߾}}9wۜ9s"##{왘(#"" *jE sׯ߾}{||/xsݻo߾~g}ּy󜜜دzw9tfiiٻwoWDxb~~~jj[¶oԾ}4ggg֭[VjРANNNttQݺuΜ9zjT<~ŋ+V[n?۷o?zhq=zgϞE={V$-_VZ󣢢sܹȑ#;w>rG9wd_~eժUO<YfjjK|||222vPA׮]6mZ͚5 .]7dffN<O>ĉo_2ɓ'+9n޼yƍ}ɓ'۷o?}E短ZG]Eݻ{~~ŋת|˖׻w-Z脇ٳxQ?-[3槟~JHH(!!!f+1¦LrwҥfJNN޿Y E:uݻvZ"ck!!!nذ… WZ%᯿w֬Y111&M:zhZVZ Z+r֭@@@@W-f͚5joݺ5!!a֭EqJ)j`3~GUZ5ѣGO>~/O<Xv�={VPOj׮ݣG!ڵk;f̘e˖]zɓ z}Сϙ3'&&~… ~k׮UAKKcǎnnn6lP)j ptt8pЪ… '<Ǡ WW׀Y&..n߾}ݻwPu}c666AAAT/,Zh„ ;wLLL XbEϞ=V^z;T!j׮ؠAo"/PTo~ڵ wE[[۵k~BQ. UVEF3p5jY �� �IDAT޾}kתΙ3'::ѣ 7ov/_|ȑJժUۇ$$$lذ- vEX,n֬Y.]v:" ֩S ]<ԩInݺEEg]<Cyxx\reҤIUTQ?aذa*Ν;ǎS:t]vM4رE%K[vyݻWB@M-BBBѣ W_xq ϟ_9%ӧO˖-'MԷo_OOaÆժUKtZXXt}ʕEގ|uªK/}VVV_~˗;u~gY:sE ԩSyƍW… )))=z8u8#|u}Ĉ B*U<==O8J9|7޽[DȨ}·\URСC>t!aC5LIIQ7{Сڵk5ϯW^E[[[?y͕JϞ=ҪRРAo\Q:vX  11zWWVz}?~„ ӦM{YhhhΝ7l`hh:dmmݡC##C-X 88<G ʪBm`U(7޵kPT ]rrr~~[B]jU}}mmϟWV΃=33'No~ҥcƌrveժU (T/GVZD'N,YW:*wm633ĉӧOv>|vˏ^^^O<ٸq[*0^^^fff 6T_@prr> ڵ+""">>>**jʕUVo*nڴ۷KO...UT9uGV\bbb֯_^5sttttt<|υsĶmVR͛z?p~a„ M6566>|ҥK|֭VZ oAҞWjjÇ?I&ikkh"&&Fժ/rzzÇ>|تUʧJKK;q℟ߌ3TE]zu7 uƌnnnQQQvvv۶m˗>ܮ]]vu~7n\j*ዤpޣɓ'N >|E o/?:4lYv ? L,ɜ  $bccL"|+$\.W(:::Ev,JDΝSSS̙coo陘G9;;zzzZYYu999]ve_233srrlmmuuuRUyj֬o߾VVV>6l؇~X {xxԮ][.lٲ,99Y,x2e˖rѱm۶ZZZvvv=H$ƍ{B3*kKN H@z' M:T# UTu}EFgtqAQX `@(CMn}?9wIR.gvdCBBPNrIFٳ၁AFD?Աcp az 8p`xx +++**j@\\\~~~~~~.]&LPXX(v֭͋[nnn~~~RRo[5p 1Ԗ-[z<]bFt:srrZnm0<۵m666̙3SL6mZ޽N8!O>9rdΝsss^y~bbb'z-xw_䨨(v\e˖FQӹ ~%%% CPN?3gμP/EvYYYm۶z;vطo_l6[fsrrGwر^sA H ,kѢŐ!CFuܹy kO^|رcv׎#nWmYAf}O/,;e֭[og`PPЍ3^]W@X,׷gd{Zgh0g`aa~qM4))) HKKn3q3)>|½{^ꅢg`Va߿樮8[cWFiFiHHHH}٤SN}G:Bh4Z}6QQ |Z%%%jݪѻjFiFi@+VGFP2ᕕWNϿgddhVTT$jN 8}wPZZ*8x "uZ7q{EZΝ;wPA233oQDFFUUU7a%\t={^ԟ$s$**JP-IC jkkomppt2@+1$6!!!:yFs/OZn-f<880<<yDQQQ~E~U&M. F1 -Z}>U<\H.i/k0%FF{%ji.^($`0\ypJ뽒~аu:ݍcXF l7&/VX,Nw ]JKK `X,ht5EEEfl6 e5^PM&l6p\UUU!00Pb@<^EWkoE2�vfq)))#G4 N{׋-IW#nݺ &y1u7|w.XΞ=+nY1%%EV lFiFi@QQQUaa$_^˃?Or}⥺:r~=JKn b03f\U3fMoO4˚5k6nxy?#ݺukT#x℄R^x!!! #rpgybi´tҊ `o޼yʔ)QQQO^f|ǎKII;vly: ñj*" lӧgddu]˖-1bDg|Zj%Bax]w a֬Y޴iӄ bbbWZ5dȐ:;b3b]t /((8|`طoj>|UzHOOСÐ!CVZ%Nҥˀ siAyjҤI``z< V[^^4i4o\ӝ9s&$$vWUU%K.Z'Ojo-[ַo_yX�j9s|WZs񽺯֌YfĈSNb�~b[.wd֬Y999e̙#ӣGDv_>,,`ӦMN=l2G)))6mO:URR"k?laKXӧ;1ݻl2;;{˖-_|ѥKp?DwJ Tŋ?=zݟ|I>}>Rټqƍ7ҥ˂ =O<1hР-Z7d2ᆱ6me؈/$33sΜ9>/>>~ܹfرc/҉'xVZmذy䑍7g*.F;&Ƭj/5dc0`ٲe7o۷>ZRRr-)//gFwYfue-9rdjjW_}5x`yܹs,Y2f̘'x"$$$22W^-Z/GOlذ70L?|~ ~:\F eՓ'OFEEEFF8p4,,̙3eee7 &)33X,ܢН;wLSN\;'0333!!A׋Kȑ#_uQQQll/˗SO=z7lp8&Oc9W^y>ǎ{ ^C]*v۶mg>|pV^z{[noVv tq… ^}U"4i/|C~7))) 3gΉ'w=''O>Gۢ瞸~w}G|g=ꫯ6m":RKUUUEEE/o.\7(++^Ν͛W_޽{ɒ%7nܺu1cfΜy_o?{)S:vxRO<lnݺ?w?3f˛9sf?쳕+W>7o>| p]n rÇ/铑!4ڶmnݺԎ;&''Zze6 v7 }INNxIƎ{CԜ}||͚5gΜywzЗ_~/Krrl^nرc'OSO:uꩧ<yرc׭[g6v횖VVVVǏ LNN<,b̝;wr:4hР{W'O<lذǏ_߹s\.Wee-ܒh0ڶm۽{-Z#Yj^/E2k0'^c>|]wUTT}Zۿ <Y&..ą=zaqu}ׯuy!Cs=eeeiii=zgȑǏ駟 O.}5k$''ٍ5k[?FٰaCBBBrrrDDk׮yND=z)Scۡ{wРAL&wb۷o/.'=egg۷/)))99Y<пٳg3Fn6m*|9r:g*jN6d2 _HIJJx<['d_g<y͛yK.t;vx7CCCsss###cǎy"v[n}Ig{k}aaa'NPqZm֭m6۵L~ǶmN>hٜN;L&EM&U]\nگFRՀ!CDFF-;^oҥKm6[tt^ղeKylӟ RV[lIJJr\~A۷:t(99o٬Y3`Ŋ?}A'VIbbRl2ǘ+9ضnݺI&?G믋ƃ\'KKK{gsteg_D洴+V̛7O4iӦ_=,,lԩǏg|4i~^zy睽zz駥EKKK͛wI)9s}iii~7|zyukn3 СC;v숈4hEA\]]}Vm:c ՚_/Σ>}Μ9iii}'> U={v-?3 0 --mS---p͚5]RRL6---m…~$.ܹS}Jgzzu{wZEnvΝ;˘͛6o޼SfffΘ1#!!!$$G W'N ?~^^^=/_n۫V^{'22rҤI/,,1cFbbb߾}W\Vw ͽ:tuϟ0qDѣG?1T=#Zزeٳ333CBBfΜ9nܸq&M]njDD-p=?˗/$"qܸqǏǡC-Zhܹ .FKuu޽{ M&SӦMFc\\\eecǂzٳg3g8θjUΣJLLfΜyȑ+W BPttȑ#7n8ٳg<yFx~;""bzk۶my睍7̜9G5kΝ;򎌌;322ϟ?k֬PNIIx;6lؠƧ'OqqqC^:ٹsʕ+P/#G6klŧOƣm۶W^=7gΜYbݻ,XK/ѣGΝ?裫hNwX}ЬY88%%n'N�M6=pABCC;Ç=ztС7n۵klˠ_y'Nj1b/rZZѣGcbbz)ԩS6mPٓ5~ˠZYfȑnv<lС6-;;{׮]jnܸQ6^ZgϞKzzzaaRSSzB1'bbbVѣGڵkwiiiM6:uE)0]9" bXnRhhhEEx|R+((eeefmڴm۶QQQ555"t"f\j݉Ǿ}FFF^Zc]yl׮n3ҡCgeeٳG6G-x^:%k׮{=bA燆lrϞ=IIIvlx֯_ߡCE.oxV^-NJJ,,,q׮]wqM&SVV֜9sVZU]]}y6Uh4gΜ?ѣiiiڵСdG GD6tPaGQ[[+_QQ!']y=ztVa߿樮8Ձ.WW~"2B nY~/ku=..{]pnoܸm۶~k W7\:#?v7|x^x!%%E \z뭗}W999Vfk)uJOԑN: 2|ӧO iӮ V]_j6q꯺lN:uoۄ D֒%K~9:ut}Ok޼yN.V>}6塇z衇kl6_vQ$?RCk3qƍ7gbw*hFiFiϻ*//feQɪ;w^BeHyyl\BDp|7ݻWtx/8pR[[+ˌ6mtҽYQJժo"tcǎ7zvGFFޤjd2i4sEj4#T]h4Zju㜏~}`0h4jqHc<^u \97xoaEo4nz7j<|Bq\7&Ǫ*ugp?56.Fi˖amsrrDJ/Dg'>p>?uhyԽ:JDLD/mESfyI@@@DDv{iivu*jHCns|Ln.H]ͫ*%Nޤ'uN\+K ^CѼ[}9biZu+W(V:FLT\ڮ�zH"q1TV[[[w|4^oӹopvmF(r2q"&;55O>(o`vNSxOVKjz,bǠ0:NQ[aA◿"Ksf^ v8pTUUFz{AYVg0n咦 Un#:@t:10^v JOr.4M``J I&X T.A^/bO&n+׆S v!!!fjuݵB�E)ZdGܯ}ihGFzZS jN+�#dD�� �IDAT�LM0N @0 `,l"-54)� 6nx1P^ ʡ p�Ffh[�¡0ނ" )w(uWSJ@_h4 ajp=;CPAM Vب< V.1۰ RObaPg0^>P}+(V;nf㈗ +?21 x˧>NW,`UgtvP+�VV8x4R N+'q><>vXpX!C5O~&o]P(i ŵҾ\.&TxOJɄsz.8a+++/n&) ,,d28΢ ybt:aפ_",&^i6\ٱ^tB_HⱰ!D tAAAx^1~ ǣH׉z Ր~R*ϓ p:Ng2>I^.\ n)<3 5z?fRX 8HA5jhh` X!\ǡ s� ga'a;8EP. mAH4Ѐx/,@ `|-ja%0w@4 \#4/~a<L0 p Ёc c~8`i8~�Z`N= BX <(`�%Moh!`76LJ9%8a`'x'D@K_#>lHeg/8A A%a7L]P [nx FA9.p2Q'L&_ $tU4J0_AX`+tӰ�0ha9AS81X0ޅCu;~0Qk:ة X[[+n%1OnYQo$){mtZ +#oR^^_XX(n\.ákz^7́%$$rԸ\27V']xjzJ�Fm 1:sb{S#fAn_Ԟ FzPϾDCz/г ֽPs� ׅHAE�ib!`/6FrH|xC1a$0 (T!&oaȅr;?|o4"aT%dSܔHV) Up`,Xs@5\j0C"ab.] DA>68P@ U n6xȆ ]1p+d a4Z=*m-OFe#Y"l0lTh k#Ta+@[X&:W 6J%!A&mI!<3 }ƀC>YC�Sj t m4.pH7P ̃DIPPj&BA|՛YuK{BHHdǥR}>`_?FʝNt 3L.nza@ɀุMVWW r9t:ݥM&P:[O$I *P*5McuG"$.q\.+ Rb[`XqQQQ6vXp x<6MFF*֫W䗥gn4-KqqqEE_xo!nֳ!ʇ#8U3ʡ> ->8tP!0la[ A.d-% p ;T`a9,W<~Pa9 L+34W4)_\0`4( &H>|Ȇ`| zC!%uʯ|�G_! R z^@1T=Ѱ`>F3Da lBE l2v� z�X\ b44.�AQHQ [!b`/�9 4X)ylģ0P¶:.5| ӰLUvp +n<W}-a@3͡BG?P1 j t"qUYY)"U#^fK=QVn/**`)E"t:Za.pN̉0ڥ&L&SPPf.A^SKS(0v"&2#zo(^RUO ƺ(0`0,Bq݋l xBCCKKKM&S]]ՃY^| D$<FDDX,�~ͪzC:tL*nB3ip\P ,& YX= MD J@9`0 Z *NxB7hyNS`'xh Z 8yհ@U�wSJx! VȂ!:fp"! RaUv Zp+$A<Qlk2#FH\p ^T2:l<(`/b 8�fhHS<~ [8`rUt,gT## 5a>isWro}1P(' FB(,SB kEFGRDDD\v_chfshhh۶mVkIIIxxx~~~qq_Ӛ^yꐑɆ~ϼ8ꤽ`e6zzZ8/Rו$fT࢜M*jg6M&eDh4'I\*`Z14 \ d6RZ"u(cɆ 9A)BCCW7+D,W~WwXv;~n A|UJ(*')ez^U(2ҔhOSPP$ /4|ȐP>%T$A(l/_)0>@a+�! ރJ,A*+#ZΗNA堁a$cCx *-"Hc-|]>XdwD$ ޅw!FTB/�m`+`8 ga�+ G M ;t!*U8;&p9\\肽:+C& 'p(8z)a "Uy^@<LP ]y{aLL*eP!\wX Ӡ !6`8Clt 0NH (E7U[VִiӖ-[ (..>~xqq֨QAD$~jmڴj4*~;eqj/P,rt:`HzMM~i>di5cB.jRC"TQ_l6k0iaɆ-D>LLqx<QERHXV?|b!~tV)F^U%u5t7 Q0@�a3x)$fPpR L& m@1xa:L< p+)�ߠFDY ?nH{hT"'0jSCONJsGQ>4DȁB: X Gx4?Ul{{!3d(`!j9TvxDH3;A^xV6i0(oqh KD z@( _@)4;nh nb}6r Aȇ�( 3XYoYx`;lC *,ot�M]!& x+k j]pVB@&9PDZLX `3`1 J e~浬 U;5@aJXy5@]zY/HLLLVڵk'BL:TmC1X,$ }VLIee�A8v ,TVVTUUD `s5=ѺgHly 5‡t1WS\dHȍetlwkHZܹsN *//////(()XYZﴪejȧSnxJJJˋkkk=$$DpjkkԵ W?_-I^@ɸ(P>쵋lQhBB9q`%J:`&l;-!L))Ve2<حENK` SH+`,B�hNX�Ѱ &A<K�,=xa�7EZ:yc 6 [0 P%'F`VXQP f`Ra 7q(dA&X6V`. [!0KP ۴e71Rbkm Cp,J/@+tB% @[Z] pNׁjȂ =aL ^ (Wi"V4 ِπrP Cs(`~ӊa@@(ٲh4$ eHHHMM Y}7b0DZo "p"Tum{LEu<VsBR8܏˒Y$1T1r`nWJ FQz}eepD.J[άD*!Ie.KĮn *9 jݹs\b"̺przJN,,"gxh4@f)_P'2>s/wr[\ ` t?&/^qV1$Z4> n7w@9X!"a9<�' sJv^HA.Vv0}0"hKN-J/Gܬ1Bt` aeT⦜Vhh6VJ\%ĂNA)h_T�A�U<`auPEq .pAP% G! "8 a ,PxQ!zC+PRi�`PI,Qbg`tp c=`%D{+06�~tm*`a U0FVwAA2 _"- y<l(++}Wu::$"iif\.(iC+++EO8х&bAs:"CޤS>iUu=i^`Õ@QI?g5b<Z\vϝ;gʌFB wb#MՌ_U`ɀ#r*++eL.THL]A7 JR"l ipc4< AP$@+Z}Xa3,!T]@)F7hIpPa%PX`8kaBv308i`0P�YP ?BgHj8>IS u|x 0 D`4h Rb(<|pJUll`*|OAT3ZpAXa0`?LPj<UgC-Ye=w7 KmLny�`" x0Jj*b`5Pt @8͡B»P1 ZlA^ȄÇp7TAkx*B1b^QQQPPzA/***((A׫=QLc4CBBd7EmLB%,0Slho+Y+i-1T9A<)v �4PV8EDyH^# W y~rvɟ9"f_!^p1/yA.hVbh~p%/ypՐ[&�`0귋\zC- 0ބalbHf R# .p}|@_(Y35쀍P0\ ^8%J !_(`'jȀ,={ KV :9x`D,UA3 ap -�&RB;xAհ;0R FGa/0*<Y+LWG !C,̄0>( H i'8 /`,TIx 85V ?d'l*xV-T($*ǡ*Ar`9xQa 9FxhkJ!j߼|a>J2?s+D8 f'!3Z688t n]NhhhHHHlllPP&bRkjjD2@^5DsPh.*4RE DZ 'ҥ]:+Ki>z"(jY E.P3LԕT~dհIP77)Ipu,eXD0r``PV% Xտh[u&wuv8` G 2=Ȅ#P $[ɯOןp 6~3|90 @{O6 a8!��"ljHPw X*ڵY]a x հ*`<lT@P!>u`8m3nA*/-ovok F\NAi: \�) %p4JbR ^5#N^^KwX!D.#L dA2t]@o$BX `A`#R(=A<| 0 tB.0ZBB < A4U7!Z0p`D4Bg Nȇ. op  2 ~a04=AO=�0A9 {`+DC_84x!�x )|_MLN�gΜٶm_KҥTUUrQbD؄D 111NS|B3!PRˢA *HJ]@SۭvYL&S*] bvUg!r8gUURXSS# bbdy7E#ԏ, P nBN|S]nh$n%2LNw W~M%FڨUA UIBؑ@w6`;wFxIGK݊ۓElkdEb/!&E䠦F6]l=q$-+Ȯ^.cp @()`CS�+`w-DC.P?CžB<| C`?Sl::ɀ&`*8x�6! L!߁J  :>�!A4TC,AoS1 v F z'Ԃ&C*A 8!CY%pNGp|[6Z&d@>X3T(. b}@ Aؠ=,p $8'T{I3 { vC0|ʶGȷ)P ?A=|a |sލfVP6?BRUn(Ph"-j roRQ'`(L2(TŸ ޅ:@BP 0N1h`, WUzzz ]T||YED eeeբT�O@@a�VFM4FRsݗe= sM մ1QX&:&\7|;N`}�� �IDAT.֋ 2%܋yԑl* S G<d�/"”bmD,٬nc(DB.$NH=K9Czk#9jP q]]v&Dz7#ShI,QIr"""NpU tJ7Z)LX@!| QF)M� b k?Q�|a<lpCsh nM40%$*(-D쌪\� 5C&0JeUw $O�1pA70mJ7;f  VB8:eMtJy.8Cjɫ ?yh[rhx&%0B{8cLXw40&AkZ9Ȁ`Tb>wqHɰZ+Tr)]-*jL�xsX@>㗠zjXTj B%Ϸ9 P*P7] aT0áp*,!m&Z&� KOBYxqW7"Oii8_*'B&B?%KBrJ%](jdv p%;^}/.O O"y~ٓ~Ǵt:/yu1=Y|IW5*-LVQI`T1A&(Q <Pn# Nx)x\K4 LX5"'oZamGx\esX@ %A CrL YxA* #у Px?4'>pR!gE2P" A u $^l!2PH'`C+XVQnSpv,HUVBwD JDNȄLG_VJpk:eɅEI[!R~Ce&qA/+ ûJVox^rJ1): 0vqVgfa H/Rl`AD,c%W&chMbccA%"}0s7™{zZ2ՔriGr*HW̤9jCkkka]cccUYYYqqquuN.1sw:']pr`ߑ` P2�+EB}�` TWiP7"ZbF"]s@qme_$KJ%O.ntGM@A*<o0!onnNt[P5:7wxqF ގf}9[6K4,rwޑyWӕO7QsCv3G=ed":"&rp9s$g"Y\v6Qq _=PFѝy!~,:9/㬬se-+6q#d!yhXӓ'!|9}򖱑@wFs\{yS)TDEkuJ'F;XmdNiXsʳ12,ż Ȳ<˕,>n&GGy;E8 lM=�9 56JpVjֳy{tg҃,q$MG7;fְL 1~0y(A&B7)1X /A$LT(7 @#'C^};3D=F#UPuHe7iu(ޒȇ'ᤩF$TK ?bƬBA{듞^qCe~W'lo#)-uALo4rg;=";SJnLvwVC1YWδ95|+:5T6Gs]ŵZWL_^adT2>+[Y|s.g$nb2̷SAx>hZ雳4M)<Inzt(ʸȾyqms0vނxزy-4p c wM:*友 LxSOO>=Q1Bn<nkbuqAo[XFda5iCccqR|;lyЛ}-Q VV1 /XFOFU?5BC$3M{l ᠶkm(TiuƊFN~(¹ɔ� I4'1I4<a1P@֤+"̲}[Gƒ^ �$A/`='-PaD9%4ÿ`uprO 'MY\\t^گg;骒,ﲈg@*if2+XE {udcG>GC\ㇰar{gEc_Ve bobl"#v r#ĉlb 't6џq+4su*VTX"F8ؼy]xr!X"=^:S bA?eCDf#Ԍ 9I1{AT2c9XJs8v=v\hfbH,g.~_OP~Ɍea)#I(X QR@/JL7,ӕy|yq(x{)F7/vy(R543Lf ~,U8[ael;ԙNW!N%R+Ð& lX)luͥ-]w粹{v<ypņ )Qy$&4Q.O RW/76:l0)&vQ]%Ýg! 5O�+R6 vw Y9bb|ҧO/:,{q6' \@nJjܜ7UZp$]<+F'Ղ=w8-_9;EdD0ZӍ8 uJYe<©,ۑ<}}n >Sg%c*俔S8}}zeTqX5#FͫM&WST>GSR1I'q Uv5?yP.=ؖ2W9R"}G'NL s,(~!1y<#X1Y|bPDT~nlϜ T1qt$rf:/&A@D:>G1ğc?s7fpg؛IC1dwV_dpjzғm&ӕTc.780x2ُSYi22b$GQ@"鰋NV_%;5vyI{2_^}Z[[\0g峎N[:%Đ jDng%PDC220sv!'^!tM׬/U!ׇ I.q)k7a_^UɊUVV 0,HiLO0ܙƿlUP'~M}Ou݅ s u){y/C~gٜEgw=7o~t_dQbQǡ01칎cZa7԰5p! 9{u"KcY͝tA!Z}d(og ϰ94潚LT;F p+ r~Y,ǝ\`$ϰ/q'w47c/53|Nq0 Ǐ^[EeJgf0zq,' {3eJ=}L泊bjM'~O#D~Ntsh^&y;,b+riDo8P6 YN}TSþ"f휱y',সٓc ZvmPu?2sۃ- К:;d֙u7uxy}hç _)WL7g+S5"CkGp0E/-- Y 8;IW’XaXʓ.σ}_yyyx,vSH.5dw:ohhزe֭[ ? :k+&N;k\(n,Hyyyxpٻz466߶mg6 Ǜ|`5z%1K<-:3w#Nhv/pm~]U[]8N?^Y\=e* X8-F$[Idvg hd dj.-FT1>qcsJT<:Oc|Wz3őu)F-6Dpj'GniZۼR>@M=kx#Rަ7_~K)S:Wʯ8yx9y XLWN'^!QR*y9ZNp-C9 ݙ>rZ<;D9l|l.fR^8Fվ#$/CI7Vs ?r. bRK:)?ͻ?;շh`<q97Rʵ|fV6>U'UiZU跴GVun{ڷ+Tuty<#Εq NXPZSzoy_ȗ~{|}{]])B:Lv X i".  "&3 $.j9qHBt~X4.乐`i%+ v-1[eee/ٟ䌝5?;l;uN wq[CAaJBI%<id#o~_RsWJ%a$DŽqtԉQ乣=wCKܹ|>'[$S߹۳7< |߭7:bI_;\%-"�ŝr-t\wy8_qň3,dcT�E%GomH\,0>.sï/2= J?eyU<iѯݑȵ_a7`&p: a<%5'Cnc;nks- bdG f?fŶJ?f;8YGbVQLcy*,-Ǜғ/r/ҍuQg.I$d4žlΟ}q\䤜R^bڜ򭮌;s:#qUa&�vN g ƌÕc O-+ru_7}ν-9lIQh̓cN{Ozҹ'T!': +񂔜HćCVΆU$|>@߂4b" ߅kbzo!_%q);Ӈ +46Z*!]B^Nn+P1>C ԷWl7:q?Ov'}\PUojW<%7y�6M$-\\` ê_KrmjNٞu{}j,i+{K-k%=mZ< O]FrG =8e ) yЇVNK|B+qQ(gj~FF%pfT?y&&QűBW>ƀ#y=mk,Wrt%}2ғIPv$q*nͨ Jr3JzO8'tXB-5 }f1(c"sa6Xr`FԤD/Pɳ#Fzf=i!{Gq)?'`<+ϖ"wNYA3Nc{0GG氜KFe|>[ B!Ҫov�%sdtg(OZ[!^%{o4qPIKI^ <k-rĖ[}}\ynM}mnWEA8kޙA2[*p-!%3Š4,IA81}D$pO銲7xulZ%to⒤оiGE0Cy۶ml6TWWh<tFLP6`'$ +<<`JdeeO�=,O#ӹs(ijG'q*vqRL[,Fw`iewmܭt*O/+k:?o=imUF>a/ߠnh[̱{e39&SitH.,̬p#ZSia?f3VFXB]~lʻR0iAz+y?po @g6gJY÷b_ϘQs9>'$Nu33x%S0Z&q+"6^c`Nu~a3Vή<V$yezQG1%K-O1ɹazP͙d<E"Wa%si\jg5 ҏi$`g%Y&ƞ4{Lr;pSάphmmMptٴ/~\Wٖm_Upc'o+ٶgÞ,yֳj `Ag|vFiV"h%,uQBxR8n!6|ǝ ViK^-`Q@JB49)XJF_SgQQQUUU§N<t5"8^hbܾӘޜ% cHQu3!Ζ\ίymlng?TxM׳Ә+~ֿ..FZhɯ69?2s-z=7竷zՄ0:5)KY40~Tr&1yO< !p?s&*LdUO |q4P~hDF21笔Cnm|ȠhxI]�>Q^l s^[g3Igb(tV3x8Op&~VJq)P6^a|J::{G+;1oC˹. Ԟƾ|<d;̧;9ҭ 5Neb, ?F6۳{~*|X`F 'fk�*\'[S%75SgVc[ &3PX�#B#(tZg׬^{M83ߪT-w~ntk^sΜմvmsD!Ӈ &Pn%¦Dx$4*` Jp1xwQܴ ۣ}͚](v `UUPņt;ߏΝ;<8`SR�8 Y0i_B dg"c1DZO#r!g=oeT./\178= }GκZn_X͟/mI][ @ન4, Y'^p9GZ.7ve\bM ,_=daN,i mN_m2w@{hb*YCt˸ةm^H<ņp!ff [wyjr:Gq/],_*>+/C;88١{c4 !zks&?x&ɐP!F5Q'\Cw~F9|f+m |y 9Υ=dYLb5Y*)!clja&Y× *]\}L?(cyN|(cT<TsQt]ǣ|co{9~Wy={#SՃoooR%ט뱨GS[S\Ac4hf׮]ۡ>B1Pؾs H6i)oa+-qp q=۷>t�� �IDAT%˒;*}$~46tJoۿs%Ab!IeDTD7N:e4p׹'ʒiP*@fCYO6VFx穌]꓋L_7ܫi붕5ۺsU5#m}]:}۾qzbJ3{ʸ:y'r,P0yA,2"Ps '([;JEYנ"沄跻hfNh%qI;Jd33XS�"YѱCr]wߛ)擨 rY˙ S{fA1SCoNK-Ow0O29Ly"eldiθ<4X|>UqOET3 a#hc#ٝ2c##G|[>NaXz/I1-:/̩l.bn}hd/f^ ˧M~k.MfkՖ7TOu_7eٱrvg*YcV/--}f D Ĭ}W`)TN"ui۫ +|z8\a|C?6iVVV|ty=5Lt p+ɑ WH/{QQQ^X_Ї xŝ%dOC*JP)WR2&Pn#Gݻw>}JKK 1H+++2VMuL@ �/ΣqGB[T>0d~ zV6O fs&S;ø꽳zWww}'Zunvoj3O}ݦWsqvb�-Ctg?8Cy5yx#ʱMp=s3<E6լmI1(5(~*Mnbj^gGhF/PAw0"aj&'e3[Ru'eE.*yV+F"y6&ә/6 bwQWƳѪqsT""~C_0;A xp&ibHVg{63>vbRe9;*/ȦC+GB߮`o2;&I|G">YQ7"1"n.['Ж 7f~!\:aUkv#4ڮmڭۆn{y;p=/R϶e~^wVLih"%`m۶%]yO3Fh!\Rҍ,Htө4CXq҆#AK)҄x0]w &$41܋_; ?Kխ[.@9k{ݤ KZUT]v~eQ+X Ů.rx-b70=vKv -W57c4+_YUModG_tk~<^M?q <fM31?jN9V<U|_^B^n<׹=k�? DZ y �r*X,s<HsxG 5sYH>fPYLe H{ۼtpQ]|*~ǹ ySj_Lga!Kl$9LQdwxxc; nU=ikNZ@jd 'CG +X!`QFYq$8'{3,="*59jޑ#ŹEnSΏy13qq.uӨHđSl?m(L{ڼăn?d}ЧnmY?A=>)?O ^v4+_ҭ=#HǦ?ZZZZ.]~u m.Id[ccc:aSoʉq�嗖VTT$E?eJPR1}{pg$8i%!֦;|L@{J0i^III$02 @QQiÆ A}*$hH _ݸL{`y&$}t*$#51w@fRw|j6*pÙ-~g<;8 %6f2eu יbAtb:<|,yf c-EhKx:d*+oTΉxޣ2)rFA1þSϟ7L w�}F=lᇼy\u9UHwhd+L94uЎ/O&-zƟĽLμ86LS9ø-,l(Qς6f_A@+gEt<P>Cl5YԌSߨlJgYWx#em]$V9i.,`Ws.d \N3Fz2 UP(tTBM=MWZ5jٞz=fՏ_=iOؼs8m>[ysgzrTR儡}N3§ #l>LJWq{;DF>~&0QJg^Kc�4toߕm/4F9X_VTTd٭[eMB�7a v0iɫ]"}Ť<imޒ.kX I.ݮLD\azhܜ.ӆ-+U9,heޤsޡo5rrFQFDŽsrsvʬ9k$~zSkg:]دfeo3;뮽‚g?~Ա"SXCޛ< .1ZYE2;*?3Vl29$cxc2զ=>uE83[-<Vs H msC ^a;{>mјƢ$}*Ցoh^q\3KOf{L{ղnw$/2寜VDǘ͜ȥ, 8A}ez<O,c 96#e)ˋl ktJ0/�OƙœpJ}kQΆhm)\ڐe;^Е~՜Lfe@{-yH UMȀW8źҿܞ=Z6zl;O^<k_wdԒs{LdEzf{1i4ܡF,HzHKP6 0b޽{uue! #7!vޡ}orδwQ&dlB.xτϔ6 IveeeA%WR\&h SԞvzV[`A�.Ch]¥=b)߉' 5j/c![XG?zx9o5y\VUVOګd0w3ekzm=sz~an-:Wu5!BҊS`~<3R1Z9uQTbxΛQ<eg Ϩc=*笣Ew,`&y@ a1c{(=aMI=|@_KyEX+rllg/` }!|rrl:#�a!1uEU=\O1cgtlG! _GrzwTg?r2tmƳy|e o&Zb`GE"诱,<1Z:EVi4QD{F6NʴȤދyWC3>"V<`ja[9E* Ϝ93 cT,lғ)q}t覦MVt^Q]{}mWXǖڞ[wۺ~#d҆V^軏NL&70>fP%MEEEvQHE5|2O***vںiӦv;tL$8ЗWWWU%J8jpzOq2GZ>A$CgzԔt q!tXIH tKK'_zsx * \j%`YAҒ$䛆3H3;^\\\% N4 R$Pt4j20cNCQެ(0^eOSqud&/{k}ZY+eG\LM^n^=Z#f|4Zi PF=UQh+r7wLixAFߑJlcGg ˚J?2k9< V9Ys2ٗ.<^yu,d;s1e[2)+)o6(=S6QB9`pPIʹo1c9(zqFQCL@#}Ns\t2m8h>d#Ţh6+RӇYX< ,`(N!8ֲ^#Rj-^cut.a +9Id9ad9fSā'9 (72ŬIZjٳ:LIF8U j^ڼ溡uU zY׫j}ԕ4 :xs{~s~WVl|i45$TL4P"ANwضJhi6*++ 禦p;|oj@ 'v=a=Gi\\ _)c@ 7 i}R҈+俐*ٗM@rz@ܐ 1=pA#"K撕 ]tg aԯݰaC XFNi}䒚C.@ E[z+**v yЃ6VP41U, `7nZcz6;&C+\jqL_3#SÆ�*}T;0T:.e&$ȰbsnC6/B&QG8.yF*m)>6ϳ8yx> p�wSC³\F>g#]y[6[( Z9Gx<fieu,>Έ'3<1/ɜG+#@|ӣ~(qjVKޯh lb^~K_/x[e30<="z3j8Ĺmަ= ^#LB^(rJơY e VяN cb*PV'm!a+8Ո]tg.}" ,x^VF&M 5Q-86tf4sZqemҥei N:ѝ:)k(%A<f-}%!7',Blhh%B׮]]aOߕ PFK$wA~4=( [y"nR}Rdžl K2io^ aWT^^Sd]/] Hc[�lIײ;t3`>]ʻ,UQM}ʸ~Z}3oQΈHyNG3ojjkupy">_dM5L DOO#|,Q㹘+hc{/W#;ĵY0p%$aEikwAkd=7Zj&a2wf>C\>nTW(~>!B):,6e_Qr)) <O qƱ5J6sAFbcۼô2yiCO\˹4*<mJZp!c393,ϰ2"6taG#b5h<L18y+I=!ߔӱ9MFG@giبjl-,RDd:v V_R2sml+o+m,.뺠"[)ɤ>%@5Fe&9.ᨯ/))/P.C:!'rsI@$ 5tJegoRh۩'pCӽ{, *GʪP&>ȝ6}=J3 ΆT"vaa{t_A]pV jv*�sQ$~ףZ5ZtL#yaKL18Lfu$N]GF_i׎IŨ4by hs\}|yB'eF y(-7Qg Џb1$<yZnba?BIk ,֧ y&%by2}V3΍Q_d]+DZ5;q2w蕔GNsx$lۘ^ssG݌7}ɉ̌ۙݼgH"䡒r:xcwl_e(p-+Q|u�Ng /Fa^PI M1ޤX1}'F/;**LHj>,Vk|Icܡx{\Z4aÞ}|w'@_olNM^UUU%%%ݺuK\n'rbFֿ147]dD)Y !˪-Q$Jm}}}{`#e˖KfSIU-IzK^JÍ7l޼$?"{:iO+lٲ%YYa ig ĹtEe$Sٟ|<N<&axy>fwަ'|q<Cxrkpk/t6SoYΣ 2&fp->z}8̣*/Z>{P6QJZsTЙmy Ƒ|\pz/|Ѳk,#kG+5QWág̤GLC0cX`pY/1gi|؃:gC缏#s72ydE΃E3>?n^6p#%\ Ӣ_ &1nOrN\-zp,7Iѣ2M,gA+Ōa,d,{1bߗ3 NP }"$z&ZJ(=ؚ,Y)$~%Jx-+%@)P7(hy&$OOtY30Lq?;ΪLɴd&B%B* EDEDy-@ tBh$ZB !dL%30 z}SZ{+%m(Zo%6՜9sbYӬOHߡsZoX L )BO5]S�ۻq(Qd\C ܯ^zWTT'g$!'>@"bHdY٣G}m>okkknnN� LagfK0T cŤY{24~Vw9 U/j׃cx[|]'Caېc?*ؐEo}vxQ&Ҙ6`(q=yW"}2#(.D4F1LMXwcp e氌9>UxneM^ d+䶈۝)Q)!\RQw˴V2a/sE#x/XL}o^Y'QVp12_oه4.Wﳀlc<,[Q98*e&W؆3^Qb=\cpԞ]uA~*gqQ<zEK|- !:yn2M[ akfrQ}.H胒_fh%gf'eMdRK!~AqkDt($Yp-G 9I*K\Yq0Ikkk(%(vV6-�Kp;Qe,IW%4>s UV,]4 Jjv5L6{5jTmmmϞ=̙Դx⤰[prI�6c!jj eX-iׇ.%'K@7ϛI�� �IDAT@3DXOw;4*0W{f41FNeC`Kk*<+A>٘=\kš)s9xv?m:xwcd/ЛScohFpGf&QMUAkԪY[d¢2;ӼG)1:S(:)'Wa\-E{F仼uTT"?3,eGp#WIXʋ;Qo d{Du/1qb_dysM`[fHΆy5<JOI^.6ļ y4Ƽq Xg/^2Ua8DcrWzȋw+x1iƬq^MkkkϞ=j^T)ģ�;?gͮKJ i !�Z*U׷r;H*;CD+)I fѡYbܹsV;LȲqHftUZB+/ #KaY� jd P5\^U.@Ϟ=kjj>W58"vtt|.;@{,㰞I8e�b:>+mwMW y"y Q/8ؘr)gDa%eJP<I7Fγ1\e*h231Tif;f. INq~C%0p3}~,f-cbs.:Vn׸1Ӹ9_N)f?"+_ <bsMؗYPnn*L?sؒuR_8G0}Ӹ.~St3c߲GDͼC>\Q\G?F�= WR)<ZMSd-a¾E*fl&p=5C )v笘[L/$s4<e�z11.8=7o({2,; M0kX,[�/v5z(@'r{{{%ʢ6�/v?ק{hHx!+d>lh][kpL֎Y2reee577rac% j3Gai(CW$^ܦj-Z|yccؘ앳tP 0+ؑ5]η[*1_ZEʙclsfެEGjlsG<l8<Le4e<K=6fm `#Tg* i ơɽg ftr#/pП Y\CTnyxǻ|3dc!qwpdQ(]CnefVE7q d^p_3xcHL~N1(0SȏmyLzj XX\ؑyی{qK,pXP滼Z*_qٚx wʙ\.97YEƻX s6bA֣̹=hחp*Xq/c[3x XŽ6LPl^^bh=O?y}m8&h`=ථK?=zkbeͅ0mF1|̙ܼp,49G,0 R^\$" a_%K7 d5ýHFLFi}RL|5SMQbf DmmmX{C{GUG%߻I)[pH+y'/$la  rd%9_@)7aNk' LylI5\ԼZV7F 09@k̋)'g C43:'|يeԲތOd+Fk g<3y?uje)ލ1atz2x >Ll:UYMV{>琜ʜ\4h#EqMi^v-F !r6~pE<洒VDRδ1T`\˦92f\@dm4(26~ ZXȔhe2ё4y$sT33$Nd_.fP&9E9.z6PvQ&b B;w/C\ b?33,*XM7ӥb.sؒ>ُ+fd$x3&_ %}804;:::;;H<Et¡>=9+Ns;Kkו!5$%j[ږ-[pA< O<:*i vCY^%<<Q?)t&R2g9UV7ޗ$rE# ښV?6߅† >@XՒ"Xm+n8wi(b3|oG\`;qI"`X͏e~T3X{S^}t eֶF3=Z7;pgOb8yTAg ل L:Z&^&0 E/h 'f:XPz3oП+00j-_-ufR'( tr^f]V#zŇ]w MCx=h3ܟFawj"p/> U0=c]7g$E`/m++5;ٝ<qEW5r}3$fllA? `_r#؜v^f{]a!cxf֥2#TEQluލ,>Oif>acMQ9wm[uui:$$]^^޿CQ.\V__ZZZ*H{0; =T>gW>)ef!r„&d%1QPwSkkk֣_TVHZ!wlfn\Y,_/P *e)"a*jѦFeځ)TEhDgH2:?7]m_#fa36 @,C+Zp'3:xo/Dm]-,O嶢Gxao&[s _ $\^ݸ,923p oAThc `Gq09>G8^Щ<Y#bJ[u8؜?.<ó4s)#ٕ>O|9t?sb|Gٚ|gLd=.e<]t@_|"r,۬d 1s 6,zU?'>ыQEcr^dWV2yw1 1ͺl͝a&mxu8_Gr+M*-L,fSEX*VTzD^`O2=JW {7RWBFֆx(JBe~ :KfEٿvU ژفP'Lrp j0D2Jԇ*!1}ݻw~ ,Ca_B^=zxdDyv %0*@fn6jZT'p|8p$$$a|FT2[]զ)r^�F~EU/Zm!Te(P'-,%ciV es)SPxt[=f/!\NtJ349yt<&p:+Hd\O#@ed$^m)wZQ<>̳-mTF9`mw\.CX,:3z,X$P}h-O32rF]FG9ASNaw2}{S˾Le%u,,ꗷ96;Ԝ#&E>hъl~ɜΝ,T\*^=I|ߙ@N瓄W,UΏss`n'̢7RN>g8<k վ +K$ 0 ̮y6455L6mܹOv)vo$o+\bڿJիWeeeMMM]]]XK6ڭP_(̙N YJ g+ K[TUUٳo߾ٳgPƫ\lYD"aǻ �ܦUVuWfoVpHo%|R͂&ָ]? 4 Y°ꪹX:pzp Xr*͝]$n`k ~ ;t@vr7 zΫؐj*MhPTfۏv6=ux̢3UГٝ@-O_AʢNhinΕE5ŬOET$j2fsӏDO^/5Q\�ƳN*8ػY ^| 8f߉g1v.a푉6o+eɫKوYOsΜ1f=>`'eb8{QgKأh"5Nd op,ez-b2wyc=)ڊޜD+[3s ^磜e(#8j#A{L4O'Ѷ(4uid*YXTM_ZTt/g d-XsAZ^mCsg~BVH}{8W+q(zá !s"\D---K. {\b꒘zW$qcRK4Ȭl`Dz*%T}ٰJ!Lt4mVR렫+gK,s.hPTWUU <aرkֺ;lذ!C߿_~xj}WRWW @0)L@@ %f8lIRvҭ 5}1&d]ĻHGjmmmVk*d.}^#Ŀ?C-F`^fQ#_Yi_?KhML?OQLa8c5:/g6)йlxC-3HmПY#&q>ٔqA{R(3L :sVl?9OWm%O'Mc 9!gs 4ȣ,ONyс2.$϶4R{O҃ P>2q,T.a$Gr֦$fQn*cѲa@OC۝عk-O=9~?(ߗ<OxXŷX*ϹoaUxc%ylq0<+%6/sec})WWWֆ^ 4˖- P( 4(t|`e@ QY]@N\X笈TbW VZc*ϳ3pKv ݷmP-ɲGۧO>}{t}}}PlѣG{{{kkkp {vc+*B2dYbg„w,=!ee'R NZߵ^-Vɥ|Xɾ$ }U3G;,!D_d!D1r<Pljõ>L?;q>f]fىwƎa-.;6-9EMv#<5Xwg%\fjFcd,u7;0Ů< TvjYicRd9K.g.10a.0MXI3ķsb"<*r'FӗgXGL0Ѓrtk2Pֱ_9'ټjƱce@f Lɛʆ,d8rOh>ʵ4NʝiqПyDA!tnL?1w>FZqpyoH:îl̪86Dfy&E,O8?;I(XCNদ4JG�1bDͨ,0N%˕ a Ρ ̦VXHJ(\A/&ѩVֿcLpU ƽDȬY%iXYY٧Oʑ#GVTT߿{={+<,u޲* HuXUUU>}BfTɂ+.% KV&9]qMmM/V']hhhY 2>wv%<Q0؝CG^ U/U|zzfB4uT]ɼd,L?8e1ã2 Q;\θr*9f.sg,/ڴin_xd+PHsJrn+Z9,c.:O.+YrN4әc'ڸ9=#ؗ籂-ˇL9G~2NHLr*]4.Y\='-[+l-,nVϫ㖨3T(: mI&3:$! |´\J0 'kpxmd}kpi㋶-X%l͔u<OΏjs5etD-q®yv`xo%v)z?nd_XTJq*\Țt>kKHO<Q(*Bkkk &!/74.\7<mduGeȤI+蠫vbVM<KxEP@[du6(gۡ]{_"T޽ ԧOP<hРN[xq*e릸 !-{:s|Y[[;` ϑY첇[7JKrY%SS{x$KJvBZ,sU+2y<+l|ݹO9ie"pvl v &5zC+-7X<PYE+C/GEΔ|6dor'qX jcFr: al«L5jqpomO猍5ɝzP_ ~9mE㹊O$}pd&Y<?N+q!ap957F± f9ò a,O1>-r:7CY z2MOe95إnp$r!w121ՅPpgpG?9&r?eia(X8lWu+•|:?q5;1y=xd~_a Ju<*|>$7UB7FV^#/NfK]A Dd6{:9kd% ~]c_v.ߺ+},'k+/LDj&T@|GJzP -0ʴٌR[K )9U<>bĈ744477˗/O]_72%OzVj y75N0䆞vӦ*DYEt5Ft=C_fr6>΢x@nd&}ѷ-bG>m0�6>Nΰyb*7 2rr\d63G|ȢVV_ol33\ͷÒNVEJ;p?=X7YJ 1XN۲6)3<N]S#`o]N`fgmGxk?eK<8>=̛kaL!lQTtZ9GhpZ$*jT܊VKZ52<Sh�Ezq1--nd8j -lĝlbx1ƱEHM{:S[l6)ycى;Ο㛢nMuFf5�ZUimgٲ2XA=k/¼*Dk ---BTJj)ঐޓouHj)|Vw.|DF]LoQ=KpEKkkk'YP1dXLd48 "XoZI7B4]O'!$FpvPWP/_rrLߨ]ҏ-xr^/wv=ir+ tRA{ejgOV**ŦM8>A7S><y38<+azǑ㢀ArΌ74FF1~jHT؈9~Xz#7҇8NQ�� �IDAT =Yᔨ ؗ;d*;yhq\\3ZT2)Qw8zɴ(qe|ʧ,ͱAz}x؎rbUsFA7c-3v`'^z1㩣L[jħ؉Uȡ9g-(wj_bX.^Өpqx2Ѷ8Xequ9(2ža#`gke|t"]y?r+؂YQ)6W�q'LCLt!�ei h<Rv Bt=vZ*-Y$|񫲲2ĸ* ƮcR)uWK֔RC( R8?kd`˭Nᆖn[[[]]]�׉!{N!H%.XXnòeB8챔u,ܴT,8ݚꙕR555aֿL骍,M GwQc*Ky(>`3:x U@6=,^`k Ur|d]GEK 1-#3 CXA9Ky|*vi5r-!*z{x&Vc K;c"`譢2r Y9\mSlÝN\<.2 "ol2s؉W¨,Vd,KXnAݿvb5Ӡrw}A/NڙA<.0jٜɔ <aӵ_LzMâ YXɦL)sl[W? d%E팯!Yα 9꯯JEO&2ŔG_EYEؒGBqCٰLx?kBmgOI` d.chR,{Ç0C]]g]y"կ%G�(B*|m B^2%v477V(H^eY:jQF<4"b]ti{{{Б `"9a_&U]iYQd:!A^(ȶժH|y:̂\nHo&qr^6e<Sь>a =;ч*s$3a;aч !XIf{2GA@6'Tr7;tpsqao1ˆRVrrɻ+z9Z^yVCyO_2S`n`bQ*S8˧\̽(~Ks#86&φQaÞ+}+K9 :*s5ɍEEz4nZFGs+1uTT8(ovіxzm&Ews-\ǫj`CFT86o%x! TrV{p|9GuJw Re%4/̈</lh<}y^CG$5>[I#_ܟ}jtdy+f]r]C[#|#۸ ѣGAtLcnrC<B8 4IOk,ܲtA`ҥKGv+x`I= \* VZ9O:r#a wRa,F+W Kn�O_qI M>ˋX]뚮6g}g f�3[ap;*#໊0"*hƢ*oe&oEY,d!9/Mٙ12+i'<#x+gGF<&38d`Nq9'| CmlIChx_H#1eeeq5=YyP!WDe#gE;Dyn؅Yc gG|cbh;m S\_p8k1' fZil.8~Ǝ̷}e.F?_թ}=hN,z 90 ?}­Wزӊ{8?Ljg{fUi=*Yĵ @[7YL#c9gJ Odvʣ4RQf DS(,Or_f>&LQ;ٳJB֕EwӳzEom%p0`@L%*qP {WȊ={&QSJ̡BF}ᥲ'xP-%urOW1G}JE-;"YZR_9gNuyχUJhOl^__ %,MɲUYMROY]Fhu>]c"9j[fSqvtX{lE3yT3wٔLVɘ+d(kosji"s=*)ЗSh8NvTR^o&0|L%욃u6=>fvO 1vp~-^r3#ld֥D;QM̎Еx-XA[NK>iV?*8+A a>[2OXȇџa"؎vq+X9k7=b7e X6 ) lz^e,ү&A}⥍(gic7e [9Q4a<NCO{7RImsVp%0gXnMʇe/ق})u7x(0؉wxha+٠{c`B| D(KMSSSI {B`곥HnHXɛfrh<f{WKaeyiAe"{YJ\ eR[5,ҥKms'bll\jeYwN}g69gX} urA7?T:ḐT@$XYsR:}"{-CYytp58'f>.Nvk}؜|%b%Ѿ=|,zkljaf6_cEFy-Q_r4;Wʜ83hGv`8\%0nX7)xdxt1hi*x5zϩ<HyN4.LLA#l8gؿyY\ԗK)Wu?مzcxn8 Q^C>ym݅ytL6M^Qw^Y?ʹaUn,fs6`[Yp-{vAԏ{̣ux)vʩe&Yvx{a9'0VV{-b&q{Êզ96ޗUhX.wي{]_fzi"jk='$ixVBM, +B &uc= cMq!iws w 8RѮĀN\ Qr)딵m|ƭZWʳhXgII2qvY)+S2  ëa;&9oJ_>}b0L=>oYJz])Y 2ve;V*3\6e+84SѕcuDVr:p*3Y7^*O\sUTh !x 4YEM4Oڇ+˹~e.ʻc\O+ Ww0aާ& a(alÅC'x0LcG[l,=Õ\s*vz11γuY>tʓO~F=F9yYT>r%4zos7O1u uE֧&o`y\ؒWy9ʨ�-_}h?lfZU +0(uhrU Kd[+Wcccyyyhg=&k^(l%Kb}L^]ɉV5#à~?r�Kڿ&�E|q2P%z>_䰑D ۅ$١cI#7vmV 9`AS=Y@ó@dNl6j%ML`{sؑIgDG al#1ύ8dp3>(-QSڹ3Ճ:N55~ˢMؓ+8؅ǓTyE9}S[؎:dïA ,q^MGli9}S#3o +YveӟPΉ_SNd(>ey=:؄|ьch؀Ve<ϡۜKaJ[:4Up2ORF9?Z�6cن~E| &2y~ ?9/a^+r.?"bxp9[c$n)=U|r.1iaFȾa:=:{9/\w%]),̀N̅ri*:Io=A1tMW_dL-}[#sԛ*V\Ҵ)qJKfEwBJwgu*+D;6L]QMOivDKοٹ]((SZ{-*4\)R.lf2[T̨HY c?w+m{d]ʮ2mǣdRr:L,yj?z[S%O1-2|ҍe&o#ͼG1-εVuwDqX I#3a|br16ou'0EÍT90*jW3L~glʦW$!JNhE*DQH%4AzHH{f̜9 zߕݙ3Ιo(n 8GL|uX[YȃT6<c/8o)%=v &d8!pք31 TJ8өe50#]()3|0:Hg0mt\:&#[oxXõ~G#.0nc-G[>4E tO(@u@cBIngE&/G <ORȸ."815~ɗ PIcs꣑t%^/p1&&4zGynp95˷ zFp؇y0zV'0z؊d m|c�M'.pt>7<Wӓ.r_9V!eQUUUx]T*c& v<mJRYCwBaNƩj풰XM1[Ǯ60]0h[bOK|+[-T:TJjv^9g 8fʿ}1W}Q8w6n)t?! wwW5<~IcDWɖQQ@ C# |GAzЁQxV18͔p0x8%<t` 8kxb^e3y!ˬ<Dnci,H31YLMh v& K9)@+'rgH ">&GV%n2K=Ӊ7! 6GYke?Nf{҉KLZ'$yZ&RX62[Qe֟ a~F3 Y˘2)wt 9:65E{ٿwfPQ>*rt&\O@ Mo3 *a^˜xi'TqN4ܜuV`?M#xx)rW#CrM~ -N~~nysd![`cccJ0mk#KȔ~ ߴB~XWvk i[.Wyyy>|8">LvwZ !="&[k[ gL0\ '-~ɖ;?߹&۷<1mZO=%v\�/<l?RͮBu,Ⱦ_"qۗʞ5zҗw9W@O*G02.l!dq7_A5y{f01{TYLXO|TBRk;EJo$&2 =K2 9]x5<sHGȱu]E&<N&le-1<M/~F"JXlzH;la02"m4z0JOIgg?WrLu-" 汞~0-N lɜM 듮n8E+IƺsOs[wY~,cxB>Lq/3Ys/3rsmHryV 偅|L+룎h`2>dO0Τ@ GЋ=XLiObd_IDz"v6"!aI=e_~Q(X6Ϸk1-.T֡M#+t4.DžH_`ώs/ _Iڋ ?l#1=؈i ;d ăVavښH$j8~F2<ypt:vڊU[njjf{޽ ya-89SL{3Ok ?NDrWq-r|vg55=)f?QopFT " <8<jJhF`>9H#,\Ca$ʾ/ZG jҾrnQ;2| xL>-,.aXY;y%rNwi̍B<f Mƾdw!EVE=˨ <*u`H,Dܯ67x"t_2"939NYZ^dٔrzfrm?o2Oץo>VCWuU<vI@:70/<f ԳirjnI?6^J;,XgO&9!/Ns'Qtes 9Rs~$XTdwfX': pQ 6r0? /dO?B m`<?9aw:6Crp鋤VH<33ܶm[懊Mib,F[wB1BD10Hb0{...ڴiSk'g2'm|دUW4d?e-츲E{mpгg/aq$+w5yt"I;y`Xb~$44`uޙ^oa-Te4e;4q]%>.]IT0=:j(fA:sG{Rny_PKsiB!75|b^WFWN!#tevBySs6{4r1<l姬H-ɳa WQM&3+39rkN_Շ,;wd.G2#}u@3[ViJ&72fD1npLnяu[󖄏X˩I'|UIR5׺vx-t9_`8yi> s)":Q8.l_xeΡlG<i9 9whU~wp4Pȯ~ܿK637Q<;/ol۶->CBDImmmċ|CCC Ep% {g}>|)[|Vayyy{ƿ|󒒒#n- acD"QߵCIvۭ:{(PX:wc_m/j)kfS-_wڧ:}joȠDçrm*o[<;-cYYY2)^]XQ&{!;$=qxg7{pT䄞?)Ұ!Q,YB=(0͔]3LaS#1!!7=y5ҒNb '2t_4& v$O&9q 9 g(u,?nV@ <:.f x:҉CR�� �IDAT nM;"oLpCINoe=o fc'!@orIǤ=i@fMg7jaTt 0p[{ŸUc R/$=SZK KhJ˞&֜=~BGN Z6QlږtVq f M`TK3Cݾ .a\|9jd)/s# 8wXx*X\I}�a|f$+` _eM3ZHZz<w;g|aʕӦMW ]E(z۟!c+M=>o aX]&PB &&س'< 5w&ߢ0uks---!1 I"LYx:#=ztСs1;u.?py$씬nڵkeee6:N] v%է[>E5e[AwI $DhkQe[\aYDSOE Ý7=;kIIIr)** \^ˮ9 p̾]imYZ5tHZ#AUH$Oo>q!CkԯL1 =FRϖ+J$C5K؏, oo1gdz;tf]B&iP ,MhMXi~l]XE MG sld E8q ӉH>R3;JaL1|= ֲ?OQhGɯ% le Yqww&4@?ewzLY#yML`Qfyo85+>7ӏ5u&,1lilx法 aQsӔ]X50|;e|lh4Ϟڭ`keMRA}I>"EH}cXB ~XJ.L`3 T^ +Ї&F(2ktxOf=q .ctV^=cƌx<4|hq^|�|- CBt=-VwIm0g_Ծz;؂gULU{64FQw~-!3F.Na>Zɘ(Fb_]͡xëJJJ˫KJJuRZ7[ov߰nm-e˞y%6n5kTrU2LQs>Ȣ{f`qaqZZZJ֕zלinq6N]Q+nP+ni766 ]ri|w+昡LUF CY7`| ٘eMnIRtc#*F2Cy/b>9Yg*V3yu9d#E\u ̉Q ; p�SX>:HF81'GHZ5GG5le {#ݻ9J ˤVNa,{NL,>z6K=zpDwA_y[lX؃a,!~F`7aF09XNk릱8)eUzk/&,1c)#P]c9{D\:y,b_c3kSfn=+9iK|tUѷo2E<)&ΥstTp[ʷr:E f]R#MMl( Ѓ9(p~űL1#&2mQaØ=+w;ͮڔ\B|`>u^AcY߷﫷q`%8Qi˗i<wk򉝾*..5w6,޾ņV22`opobeFTqqq,zަ;߿"M0ueʂM}qiԆԠ'{G7:cVӥK-[YnN6T7U'h̋cbĝ ; ~pgc⑯J[{)$ΛON(ڞkMŻ-}Q@NCEg/6d lO}֒ R˘Ͽ8<uz䲜tTzp(Wً/K8#RB3O_ dv`6gwRLa<gD 147-=Lb.1YQLK2Ps ghtH..c31(-+p~뺿{e <߸t=r1"_j&=uUR>tc9i.ʝ U6ۺ(*Y6gt Iz?_]?x]򐫳.-euk0fzwWm4)OI^[?~OD&s)5"fK`1 {:0,P$s8_3=ٝ.Д, Rx>D$Ep/D?ޑ| ts3m:MFX?}A_|gdeeeN 'ӮV7.;xYlaeYTH5L$5 ,rAqDPA0f7 S'tWL]<'':ٹ.DTl"aECCCMMMxt4%ߌs&;o޺|{iQf7nvyy可|瞏6!g$F_ӆpr64Zm9QIfOwЁ=tPF}@ƃs3x>"(di}ާuL/`N M!!PEga E$-G(q03/=n☴q0 \|ɁCt!*cJ˜\XFqnnjjy4X: 4sJ+ LjueLOuif5Ϻ uQ7 92b^XuAأc=>һx󴱧9 E~5eEƅ 3rYgc-5.$roU oSTgwn9&ژX|WVpX΄ =RsoёR~.*O4u!:.d8p(Na<s$/П`XǤ,ewNe:;ײst \)[1n` G r9xq*U۩`M6ù1OƭCWm40;X!Ri&}.񋸫(6xgWVlD8w=:K~)N ͕Kdˈ-{޽g¥(++۾ ą-lښH$+((d%w\ukWVIϭA ***´;/H [8lMݛtƟ 8Cq?MC_ʥ.Q}3.1xuqA]+677YvF/SQB\oͧhViiiyyy1ʬӓaίqȰXkx:dM4&af߃h* OxyhӃ $>c+0+帄 C <\4~NFZu %4*.v~F~p_1'k¹9)̦=gsLtOs"iEB- Cm#.Kɩd m_%\t#xIW0;0:ba؃Y@q|RAp2֏θ/lYMg5-7s>vXNU֢?$d5pLIS[]\lu'0'&^o6ϧܘqoou|Kˠ[w^]7fIZ-LuG27c]5Dki K<Ma=syF ?Y<a 6q.=%mT'8>0>,+ ?ʫi>_ħE@wҶ I cXp}04+1^8k|qd,f_6#r$aNYSSZXXfڲQ?2HS5CjdL$;Fu!zYQQѹs皚-[bx{p{1&GB_ZZZXXإK ]6<q/|Al-Dï:|eX vҕ^_["<~>;@IRqoP{ii%E,GSNP@* *Ӥ8Yb!ƳB9 &P AB-}42}HRv.LXNʙ~nRh~O-F<" #O !)\nI>IQ[A#y;|gE ؍xf&(N9-<D!kY͇|OJN }gʍYx#NW8$娬Na[8?8Aúj�o3堬"DNfDr)\I-ΡORYbŅ$%gxW]g_8񬴢sP'?-FW8-^b7Wz(roޓ8aapg98SA1;ݢ1X>Q ;Ȧ\u+kC /r8Cۯy܄&k/#X3껗k@׊G[bwSl/|ALD-6^rW廪[I|*4yq+_U2?7cTq†eeeݺu }LJ6w=w"uU^ D6?3L8^ym۶_>BGa!Dm@&E,dqqqC~`~wsLvEcg4 fPoGF cZX xͨ5g7rQeWzׅՊ] Asy}<+4:fP ZX,^9L{|kL(z K%ﱙ}%ɉLaBEMELe#EQ281ռWrY~4Nyud8>Z8yƛI4ۡ8JiBM/؃;M-Ipnz-iodL3lS))pJVMaV+1圖 V&OS@IM9Q:0i`N!;74 Vrۼ3Q-{o?cƦ~3{>0CwǺnت;,8"g ;Ķ6]1ulfF }i-3#Vx<'�܏ir4PJ.fe$D9M1ArdAd~[fDRaw9Ma}@</W2LMd2�S*ǵw+ywFbgB`ghm||wma)5t:6b6?L,z.]l۶_ojh=:v=o%rϡc\q!G,!?YZvWХ`Ɓ .h#BM,2C7?vt޷eɊ+F>1ӂNvZ2قl:??pH]5V[[[?##kzY=)6l}A4&A\|fA_^ĥ\0ً~Jwz"VN9SL rTқZP*95ЏdabwF}2҄s~Zna).e/uDSï 6w%ƬMjVV7 e771Y; rVQuA$QHh \w.#:f%i1aX•|:f3{ <yncI ֫Av6k-Y(jꔲ .(Jx#Kδ^Ge .}!s+{bϞ͐-¤S[HVZOҝYOCIru= '{4&19_R40<_)Khe2^%Hz)#܃O+*""j ED|?dX"D m$4<!Q\Ћai~ |sI>sZm`]a*:^{0.X\Keˬ/znsd"J P0YhDKKKX\ eCGB |L{>KV\ro{Op ^0CbObKKKkJvŢsm?o&䲹TS*Ff?ͣ6flHTXTT4޸ L3_U]fuiw+׷Nj﮺1.hjQN1XΌENy:S\IJJ7*p2ۨ` !ቤ{nbjW/Mr@F%8D9,jդaϩ/7r+؏t$B_p=ױo#,绔ry<R+`91e`qɘ1崰26pc)^<˓a&|#pBn͉?'goIHbs nMu9?3墑ה?0mLڵfҠr)7tMo$!¤qZm!o2 u<QKRoNP Rf<YG"*֫暌;[$ZEsV3'^s}aŸ/<|!͊xD,-p#%2MUƃab:: }oο=sê; {62viH?/dfL2:7tej y IXB-"[*8;u<S^à;<NqqqFőm�;5 q=-qS}|6zĊ6Ȉ|8~cINO {XE֭ڵkmS9m'j3^k^;lOlaUB%|[<G?a'[rO@!̾$GnRդO|39mML.Yxj-ŧNoKc؛WJ?cEyg2b޿ػlcYq)IZ=qu'/\Rڜl]1c13.,/%W+X]} `SqgV`+nK#'�zn<@n13=XN 籅K9̠9fswyڬ7e(lc  QO%M4Л8(є7(}Y1ڔ*X(ӛ40c#WW c_pأ{_KOD<iNV|=|o?f oqV<"Vϳ?qIo>-zwֻ}1gL`S)CzWa 9)̄ ,HO6鄹-I.e7Oʯ7bNY|Ϋ!ilJ:R0r ǒƶJ B%{N6PTt0{~<<:9sOB=ksn JG35/D6;ľ+n?eDB3Yfɤ)Aeʱ=9"͡e||nРqbpC<a@� ǯb⏋Z K!,mS?W,N8?Ѝ3Ӭw x5aY5$@*..+6/8aAKÇ s<rg r ehҘ/ Jffȟ~zaaaYYY(S&$ȧrz8vW+,iW2fݘ7ߘ> 'a?a.=++ Kl9Rղăڮmn-nN;7" jٸ~Ps{msqCqŝ(ll)+MPvg~�� �IDATVKJJȘpرߋM-Lȧwsĺ7هu$ML j2I(y"Hh|PX tc/psrFG{ L�CyS:}fuUN3HO{1y)d&^g*dH JE#@E 5'"r&V*`&&$9iq[znL`ZO6ZRK+POA`D`MBc_3p>Ej?奍pJY$cɟUB_OSgk'9l奜PƜ\StMFZVꔮYbyzK&|=@ZRNϪaK6,;`F ng%dS\sI呣l{ dN:C@ ,$q|HЙL {qDmS a10/SKpUgەHB(Z؎jj1jx78ʄ.d*Ypک:Ti닯pujZq؊.u SzxP~j'--P:AZL6 C08xD,nI644KpLAAAeee>=ǮVHZ)mٲ%WW׽ZS[;B@wE~C?R}L3wOؠ%g, ^PP(L R) l~ޙ�?ot|qA";mrW!"e|cf 98,g=ޢcɢ@!C]$<JOFEt{4Е^)A s:wRST])ι9V 泝Hf~9 3MIs&de8qӸ|\L8DUⷬv,dٔН:Ri'4ӕzW<Re٬bW')Kf]]18iYB::3uQMu#ff7C{=LJ7緁gA어Go咺fܿ­I$rѪ9Ʀq26Rw5k-Ʊpg}K3<TiI=݌VV iI-Hi#3*Kl93S~]8b?M8V)7_>u{ j9J1ѓH[ۨ h0Bvd:tj766n۶mW.a⡓d Pc;B*<~BPؼC 1q&,]WϜ?UU}孋O[ek k ᵇ e?RTTTQQҔ>l8ouE!&>N~:-TSW/v!4BX]iiiI\.Aŭ.P}aՇt:]X8Aae],g c#5;ȵ|5,a.*CE=j;F"<K)Hd+)+pk8)'!xbn,քNWѝSH|Cyqb$1nMY \Hs#ҝ'YStsByjVb &:O>f҃d!Kݼ=!8]Cl{(NT+rf4)n*eIKeldu?s2e|@6Zd7g(5No\%+Ui9,iF'"VY ˲j3$,Yx0C`U Nm0"8<plsW#%qOkWu4XΖr o3q:lȦUW\MNy- 2?.dϬNN{-ɼQ:<e֎888R?Et3)g]^Z<E+xɬ{\˳82b;-,~.E>}Q]c|2IMfFhCQdgO9b {mX_*_SSSѮUhC/:dTK*u3ѦM_FS1q ^6J Vou|?Cy{ !UW!Fv|2lO 3㖊56\KyKʇ>85ꬲ֪檊lE"H5?6<M#Ypu֍<&e |h.exmW<Go2GmXy?wu?眲}7d7遐D*HD ѫWl((ڥ  @)$lɎn >gϙ39~J71S 2fp_-eJ#6f)3yYppHb6WT&$؛h\XaKޜ#4Ԅ~Z*X\a$|'٤CL84GQI/sio6,gk4qbi<1=Yw:A!semlDFc=]uT%5v\lc4?B'n*r%CDfVY[99/$afBC#؛ah[1}2Kۻڞm) ,G/~z 5&&th楴IPB*gA'sB7XyFzfZ `bRVd p3]G47a tx)S&qB<۷3>B<[~"ϳ|޾^IUauib_co&2ynޢ02{Wׯ饗[%cyxbnRZZZ[[[__?yѣGWUUE D"Q`E m$-X:vx;o,\\sW-{}}ȑ#{S6b˖-\8YA*:f dD.O[>s=a>֋g5*EHuэSLꪫ#Q8P#+H[yKGݚhbi =Ik5ZސNw[n1@#˥[tpMftG7}``jSUܦBPTc A4q :HO<Yj*R29'ɚ}<l |}y`a;yldqO'>00�GxFjX\J& Z`<2&e:$'Qeڣ4&poRjULTxcU>Haƕpt7N*ʲ 6;b+y2q(9{3'Ags^M^+p2<-C'›@$'<Iu)ձ]$w os?**XΛE{KS*@ qJ tk1 Ç]KMΡ#^3YѠBN yQ\�98ҷV|".1;Чi.wH*[nX(,`N \@h~ z oȖP 91F~Ǽ# Nq09Z oܠ6)]S,a{kƔ9ޣ)w.(HaUʶ9D&xgY︃יU/nQ>CBNFrR zECQ5K*ʫjjj***#8Ωտ9y_<d:dq.3UcX48yEEET^+++kll1bDl\쌾 cd޶g橛BX,; toljTE@wnj;rUޢt'ҿ~QxN"LDHv&cOQů8Ɏa5dy<Zqt\d{ɸ7EhlYYY c`ږC[=t6~9 Wwždƣs=U9OVjD\8;QTq/$>8螅fV4%2>˘MGgZN?9'T[Auy.0&A!^ g؝߅ }7ٗcVRG Rʉ<^a 3W$w'3,d#IqYîxK,Fۜu Oߝ5iv\@KN{1t6[KIK&ɂЛTt{6*YΟEMҼ; _{i/\ܬ&XSC=9*B{1:o\EIyCi_6YpphNƸܻM_M(y0tUhmhI5 o*wZNeTjb p�gQs@hs޷/r0}i}m2poVWo_eA ;H :ܴ,$xR>۱EgRYY3l-dD?!5GiH[`ce(<&UtWH(NGk!JRÇooo61nȈɪ]e۶m===|d:&wlj|y% eqOlLl9jA#aVTTAinݺ׻l9^9/R%%<muu1#WQʘN=?+_{WAC8qf^X${,Ǐaj1NyPKS7lT0&SN̦+\*ً ~ŕes DKF+}z8c]m97-傼/4mNe a/IK\Q2[|,f/;ywq 3yqԄ܊AQl.]둌xc7FpjuFc})ޔŌ $)ᯁPQb߂:ۡUkvCڤ -gd΍/=z:}_YBSͪj 2+uNƚ7R8bPtsLnz w{=Qpmw>Lo7*m|)">IchE}pB;>e-&'}$kIڑ\ݑ>Π^H88}-Z48e{Q_ʶ{jj<I$UU+]U>s1 &QB%3Y2E+ø[o۫/AqR!Ѻ5u⴯5T&=!\!xOl! W1xuyFF1xlףoDߚwt{xo_^He9RMT+QS-r0 {zzlggg___l"%1]C GyyyOOO]'DLBvEm2*dl7Pc.q ӌC邳#dԲQ۪5ZL*2\EX�,Le,p?"&f1;c6s[!\41T`!~<ι ( [zx,Ք0sxL:?`Zh8ml ݙsK}3|ʋ9 ͡<΅j㏼s͠8( Ǐ9yCWQ'XQ-4Q,eʯa܏99Ҍx|A壕mVZw՝e-e^L+R⧡#K= Ԥd*ӣ)%th>kK>k˶LeM[oIWl^&P4uvpYJ;0/[])_ $;5@RIQFg]eT\֑FUs35`e-gGﳺ ;ϊӘ_˘L9}0~^r9՗–yu_Nl,mfzϭQu0!\˹ #U Eݡq.hhh^by\.&YY.mGGG1絛k֎Q555fͪ\n]gg-[c^I;W"!뫪FY~D񩧧'\2Zs\$ģ;%[uȍ| hbFגދ: EG"G"2(Eu"Eq-ҦUE S<9GpJDhl6їvuu qڌ.-z3fxgaESE%y엏|n|l}kVo+mjO7+lWW׿r_ + >2nKyż΋LPy>O=ů9z&wsO2<ԂxA-$+H&d x_06J[:%CeLAOqZLG}Ȍ<p>糕\Mʄ@;/7wq)GchLpEEԳ$x_pa. ̦!TFgv[B?H5 ӕDmgr)w*[LӶXspm-ȫs%9[NJ*}R Sz%B0Ju)+GsK,U8̰]nOH/ ZJPEUI . BէQnq=lKn'( ˺6ц~]3M=l9*觙>e=GV 7,�GyPzPON r#hf*)z؏6X;g8/Ĺ^#HsKxI*d՞B_,{VUUy.KnooO&QM]+555'NlllL+Wljj kznm__ӏ@|@!_l<1!hk3Em(, hG{(l^ŅQ'LFz|>'a12ǣd/:G3 #zkҸeg,{5zKuQo* e˺to:贇hp>ěC` no10hpr1 ?Lf s=oI? y}PZ6e-䇁h P2>˹lO 04wm(t~<Ñ<pS`]9 vg=G3*0#r]f"yt1f`sS&}.^e kY|Ap,0.Vh}};G#tx;P31'%]P8&UuVGUR~tX}@<7tTC#5 Xѣr I#)MH`>-PUń 65ԙj\j7`U]Z>\HM 4;dx-gDxK:p7 V|ŁzM(7TWLʷS6ffhm)WZuZƦ@yRAKQ<fz^߿>ͺ~~|3<3jF! C5ri)twwGI ֊ׅH`io[-bd6o\|(͊kjjFUZZKrm Xib:ׂ"診:EYBFylmz{޵gGڊ"}T苠.no 7Nc@Qő,*3F($;6fC( 9q29$Bg2Y2b{S[go]~W̼g&, ߼͹[=9\ v"ŊAd?Ay?PyE? i`19yߣQM,.�۩y ~rO/3+K'`Jp+Xow;1+<EC?5F6f삱dXα{pݾu'B?dv͕vk3׷/{÷fdrH9M*ِ;.벎o$]_Lʼ4brUZSfn{} <qCޯ慎l:}cjM,d8 zi=�� �IDAT7 zHHg3J쳮: <pnw?j_P{VH}ϷGbHY | SyZ4&MWݦy<j-OqHh@Ν})uhEFy-)O.+˜/hւ'ֆ#J<ўPƜ8?z,8sHSZЎm1-b`` Y2AU#ejH9S Q#[|vfh ZRM6UTTDݗ'WWwu<Ajjjd2 Wi6ZsO%.qw||ca+f!o9S+$ʁ"J|C3LTg5k(ČfE]1b*;(u"{̊kI" g1?fCO{tZ&}UUeʈLyhʋ_zK<!%@hx <_/f<A? p 9/edޟCYQL7mo jwq>w \\O)39_ /f\?Eϱ7;8<71}FIb#ؓ&6lao?y]QIid1gH.৏8B &$qV!J~o'1h6o )Ǚ}:(巁emʸ&p>˒IGf]rkms[^Oh:=mt'Un/D^e锟>_$u2[c0IX+> |1mĀtnӔdR*KеSMi$rIV2pJ;Ԕ7Y`cՂ=Z|^p&BÙwr CW$>M\^V.2NIe\w7[Cims5WN- 帝u?s<3 ~h$so.i\hI7̏\tǕ1CCq8MW8 -- IC:.ݻVYGCLD|>kA2Liii<"zc^,Ĺ]d;Lnذ!u tl6)^U.WWz;Jߕ8<ıӝ]sD+{ "U B\t!ťhf9X|8ez)PG]&5 ߵY6>P\LĨF%Di"&Լ]sԵG= e DjFǏnŞ5pwL}/q2 t(~Ǚ|4cy8P41fB@=%LO[|f(d`w-x&iN§ yIe9wlZy24_vX?XCOM`dy_ <Tg,3Da9eg G~גl}9)ƞk;/qw|,b_>Vݗ1ϻiYkX]py^G o0m_(n,gOZ^ \Y1iV4͒2Q^KK!r>ʄ[C_+PI붛4"v% V ҙ醄5#<PWh6Inr.usfJg%C 5ٚ;[;Y ~0KcK pehnRjfFO/(b_My R^#6q9oR7 3CM @}[KmDOLɥxiy!|%TZ &mNpFR?8"4+IF|dP z퐲MK|-vm/JxvT*0DV_QOOϐMwL<;q vCd2/sH]0v+ ¤'E_;wv~~Plo/ KgR|#[L/+CQA,yF,^Eh*r1qXբ=;K>Ə'b맱͘{<Ǥ4�P&;ZH^1] CesxgRE ,W_r&2c(e;3#`_X|c#PkMkRLb.Kv>)W=a؃ =O]NaA� Lgk'x:^A6fs3n>Np{m[p5춤y }jfP7]=ͺ,WP\Zgx5ali71#Y&afU&Ȅ,5w=օB \%w@ 3*+5z>+&4U7~c, =P~ dZtf[Mlta5Zʞ 3R_Yղ-uaN8#%>(8S԰'O%)$-%T2+TkwWJ[+y﷘yT%TU9=T=r+^ we; ^',%g8kك)\j1joH *J"eu*Z%؇DՇ>E/IFyyy!#|dQX^^^^^B3TۋkDqbzi\ƌO2ammm[nݴiӖ-[Z[[ 0]QQѰᕯ2cm[2{JΎ.$^=ZI+FZFȷhtXȈˉf]!IA`D '#.T<3;3 BbU{%(1>D۠B::H;*ڙ>ce8e16=x^v%,9KGW>Xl6wU]]=wjIs$/5J=x5@ϰL>^p2YFKA#<Fd>+�`)r,M؁LYgIB>0<aj^? x<2̻kXF_r9-0i"aTKXO i4D.^Ϧsݱ¹޴ΏNe7Y(edX$TP:Zl^fI*ݤs܅) =ńHs`8TZlẺcx7juh Y5ǖQpoRH*aCk Zr6-Xۦ/4lv #Me^%-6$|".ay/mڭ4j%N;Rk{-/1C%u7ccB9aTYؗ?1;ᙄsMQ!iBIkF喋fK.yǖkUNpFhP;I/䪝bLTՌ8^pR[[[SSĹQW#*V޵q$Z,lɢz```AF.%bд-`QPY2I[+iȼŜhNiRa*hfbl!M&EƸŎŶ,q+b p, fg"Nii^dl{wp]c6/Ym***l^E?eSjdoOw^jRËtP`$=)If.ؔtd%9>0ʔw.)iY^ t#RNz> 41) ,"S<<5Bft>sVevS]-)G&\0Z5ګPyJqχR_, Ƅ~2Χ&49)na1R9"O_V3ns(W0`j¹yy7 wx'kJIIF;|+C MRު,1'-|'Ο][Ze=+~sKG!.mW*ݠ=EA&OǗM5&N1wFeܮ>gMFiiUKerPսgIti)i0+?jS&V*]yz`v}y uvh(xw{M[M`d2ܽ:Q[;~uhBC yvѲXR4gm**{�jw{W݊x-UUUÇ6lXMMM$ɹGfeWш6"&oT ðs዇^g&40I{<G֊w;8E,zkPb8pxi5W"AYԫ{5_ #=ٶQ+1k񈓞E%c9Jǿ=۾={?]1%Yu滋 J>[ǾYۜS_J1\uS 3cCL'p ;`[1硳r><F;}}ؘ}>C K;ofY $piE9 in!<îӱ'* ީN:y5ivl!+0WyĤoUb%Ҫ%d{S <PpjK%4lW>*rTe˘Z|漪5s lLY𝾹gnskOzuŨ= k*/ԣpMKv'sVJ-)_'U'>T1Ƈԧfg3L`/ۭ>`9HYͯF#n.Y+rl_9WQowέ~rhjlJ:A&}ۋct8a0ၣ%|&+yB׳:L{ ׸lnąܒsG>6Е\h,FQE(R[cf$W~b!o`0c̢S,.ݝZ֐ūb̘1[Th3kYA~TLZB4($k7G!H{lcȥEF17h<Ựz^| _MӚؑQlEǼ<&_OfQ2l!p?fscb6U\MH2~&T}(;vqŧ#hTtQf<!Ŕwݥ$W?`i0꧊߲O`,I.!$d+8*u29Qp0ׇ0=2C|p}L`7a'28Χyc=g:wsT{V:Hz9AֱVzͻz]!Iu9τ3)i}R/Zc'-lKgOؐ$RrRaZpOҔ:OtIҭoY^0#tj7칮҈#$(O-QYoraJ*/SRoRYz̉~2yjbvwٯ핕=҃&Y_棿VIu M c)Gu&3;5\)]P{Zgכ[' ҡSx%)5Z5OmlNkk#/e+mO8g}*G<TĴsR{2%,5rsh w?s2~*MTؗz8}Nj#\r)K16PՃbrϏDG 9S$Ҋ1c`lL}o}ʊ58Gxʮ?m}5jLbڮa&CVÝ_,5.--mОK?HuvvU yܼ+ՁC=jYUu3EaZW۷CŖ#ّ폻m>ps|w;k vtttuupD@Q+IcYxݞح0ԭOkjj"AH1X8N w w0h/p/³B9ț,P0e!/n.=O{+1_Rt2X!,a ^<·xif5T0 t'ͭ,f,'C8#01kP0 8^dWÎYG$\IȖA0ԩ)gm8>]zV;$ߜO [J}~gL |aݘ@ʬXf$z詴o쎏ݛ= ZrmHOJǂ^(˥ߞ4Re3l)tiTdjmfӍ75zw C{w@wY>1b;_}Q+h!Y'[EkS +myGݞ0൜ɣՔMLOz ՂBV]>'L9#iYT{ 5Vۺ&pRm  4'=0.MޫmjRsQO]6˛ՂruJ MHVKU;4V2=if^żLw<20Yʼnlcڵk}Pc.^_iGvpDex ;CQ?X'ҫ0?*Z+//MMM`E7+q8^nZJf2H 6 1bp DYa뫶T5{I15-t;f H7GѸgW|IIIGll={aloܭf[M?m X-]\i囹O^dfI͢O.:&8ǹKe Qڞ^VCrYo؊ب%g +l职C$ĮQ?Qq톒dIǔֆ֒TɈCHQ oj)L/$.\@o֠E 9tp9 BJ N⏔Aq+']P844/p QV 0fP߯8N=R`dew+=МJs ZClස  $MHB<"Xϲ=mS'z,*м>\Hhis줽jQosʫi|)ϵ~OcS ^o5jæI)Ƿ.^ɊL$U +\ugp>GY9ʚ8{ںIJuϧl7.aj U͉cR#Glf_UźP60lB=3`&meSJ iT OX Z8>L LhCJ 3r3WF5#|Ч\wuuFm0[edk ˡyvF=XO!X4rwfK u,`` PSĆbvVX\.V}g[!ŭԓc16`&inn舥"v}>c_4#D2:uʽS$ġ;mU[\rřbAFmqlz'Q,\|ҚOoҴ#k;5ӝִi5IxcCv#ynu1ֹ?pDjQ[0;dWncbʸ4DO+D{DS0k:{aKQUZh5;AmtSr>Cs9xW9I7(b>J =}48|J\tYBs/ے.JLFfq3 ĥJjY)<Slf)SZโEy% #yVE&^Z~G5[Y<c,/<쭴r`hbhNPI2ɐI:Yy'E607z{1r ^A}ApH+Ӯ8Z=ՏZӤtZ4X/;^ڳr5󎏪3LzB �!"MAźWݵꪏkõ*VuQP:"&2r }y~a̽;sO-joxTF(0-]hlxXV0=.DY+:yVcc*Qo]iF P ҈fX$BC%Fd1~(/I.P3KLEE"L6.ɕitЂg(<!"34^iJv�� �IDATz[7+cܚ$d�t7dP KIQ /;0:3 Kǜ)Ȕ ́tyҡ¾4F*.x5^90'Q E"ab_^nT{ްwǝ;^.떄 ynD"`0xfiiֵ,^uMRpyaU%wzme ,i^uvkђ>t!ժ+c,Q�ͮu ܗiB[lmtIoܶm6!-/,ia! rBOn0#{LˏTj85dYgo>F#I{g!3s힫 p hȅN{脃>A8sP# Z`9\!hpB XAa(dTy͐67U>[ބ !-0@xWu$p7pqރRtvi,:g\"ШNWy &,3<-a*y C3%F^L2sb#N:#:hk+"de,yE*t!I4u! Ӆ%{9 ӑpr{B lvܖ#Pqps5nQ6 +|4E˒[oON^ ゖ}]^u*6~몋onohIwˤN[c+]`SxGN+ :yL#H0C1W$K=YI4%@/!TMQ2sj&NVp Xp΃`$bnpy]eYËI&A�Ԑ�1ރIXI2%2 mlrQ.+Vy •: w DtBsJi3qBNN8ڮ˸ 6k8 FP3 f(֨7UJketXDh 6TY]rYzECo4Yֈf'^p>㲭a7'.afޤJ#O'$v_{/]e Du'M:uNM,1}AB.aO>w<fck5'͎BnnP^⯡9؀lS�%i tHQVیxҊ b<ϤI^]]]!itS=wg㌫7a4ENָ[o8 ;`)=N  Qhw? +!u0�bt&Ap]0vVp& uh�\R>Ϟp| *_pʷ0S&S#K,2Z&K.ɁV ="�% 5 V)Q:ocA> U Lzq+5UBmÎШ!<WQcKY;L3X`d'X!}Qs7ޔnMZ~q@KH="-Z$z ,-h\8R/t2H66%c-|x)IW.E묆C"3҉(mg' 4S/8ԗU PhA@Ah",0AF\uL-ZJJ<_Qn#5W2WV(Q^óOR'zQ2794+iQTHv #w[� P+nX G=&xNiȀ.>vo0P~Bp՘Ɔf1bM]OQ̼�3n:fP Me W^}fu0|'Ks%G+: r3]<:eývw˟m4-P:jؓE8֟PEOv[%3fS4oL;4COZ|B'T4T?{a(t1$5*mJ›rzR)b82fǰ2QGiiMOOX,.ܧo񖴴4e"}RݾӞ*a7m`" 8MZXJۈlq�PK w8N^u|T: ,ZCp <˷8I%[zPW/B3xc’|I^/Ih6INY@!v\#=}i::x+ vq:H΅nz$ -F|.w!( |ЦQgK: MGdΰ+t2]mOYܕr_?žkr;߸ʏ"sT1ҒDxAmZvSVÝXxp(thw枧Y&'x*RGWžɿH-yGB-ag]&J|'U,iUQ%ܐLJE['_ZU#Dsۚ6j'i܃XeJvS=Iv=7d2{N2+H,(?Ey"k=x7P2[+I1ffֱ(7$/T'bQhF|c$6cKn:$ a.E % 2!EY4%̳nC$`GyGE.OJqn q1?Df|M$XmAKڛ7}PD-!($9g}D$gg&k g5xfcڡA7h0f�ueY9^Tj)!4zKMOi f ڬeԘjN=70/$yCfee䈢^^?уIɨ 꺙{LDaA ^0J�4y PD*LzK  c PBA<?A <P��v>LXdFvLvSaxfCgqH̥ý"ؕI L~ >@ liSdl򖯴?dMz-ܲlr-'#3Df(hvi2$fH@H$W./ WM8*xu2dHS w0 V#i�C%)9(񓧑t+?>z2HHtiHʆ!욫tĂƶ߿*~z2`o!+^zP/ܖjlZ 焽<dPIx9}3GcڋjoT'-I$'Pp9+iyMʠk[Jȷ'qHg@=##ӷ>:Ӓ_v./tfwzIH5adgKb@M S4{bx:eo(N>CsIIiTX Ȍ!Q$$oh#(5;`;LXALJE]D|"90^7FsB-n{T&M7n1 tn,mC'\uLzbe#ʐX,F 1T{^[13{gi:PII9g13 n*V=Q OhK?k=9r ycV.7kє20KMf5,0@5gU37C#n*̭)S3XO/o/Tu2H`NSUUER޶iBSӄ&OGlI1!4U.UOڣv%l1TU ȈFi;uƍ wW3z~/h-"7,CfdJKKn$I,ciDQ48.Y>rܤ_@;W �qxI.t?Yk p/| n ݐ`$> CaW�g)@2LS:9<> k*?KEoN(&(7A T 4LL ;'i0b}C 5,T~:wmkip:uH %cKcD|,-IMgo$ \e鲪h h)*hGO+ "¬=<Lニs?՞}Aؑ9ޛogPt~+wV)l>�w䫙|rv=YݟhFvBR}8llk)> -<Ih\RW&vuACCBN׆S;Xs�)UeP&AM-H LXa1vi'CʬN׹Hi aIvq@CC 2Ss%PNYx(vA=xaM &#X|Wv_�G4/7aG=ˌW]׾uLk6e4"gU3mVFVЀx<sU̚Q-%JJ(1bI$qO<Ix<E0jGcI?9|˓[|} [:dusOE.{oO~c{pxz<ەZKif6{׎ 9B6>o_w:#tsU]hK90񖩫m|H*٧b5{D'qQgs@*(8r�N CthvZNWuY n"(v! ǽ<ނ!UpjPa|y[�sQ* P/VÍ4X`)<$A=B-]\W"yLqϳz1g'/H)WPVX/:m"Ijt+fQe%ؕdLO"I ׌$+2}*c!UIV!QQFD̚揈$*m 2ҢhS~jv=Hff/w՟E277[8¶i|<ǣddH:vE[ l<H+"۱r:kPs!;xG0 ]"u!^;o:/tTvQEv.& hK[خ2=$K$O:#oOfT)I$Mo]6r#%mH^%#X;ɁwdnUAx\~QQc9J 2a0J Oa [N⪉9m~!۬͘<1j8A²bw:RFWr/70|A]M9}ТA5sk֟ Wuf0+nt__/CS�<y̽_+4˿ 3v{7|<tۤ yU4G )9Nl]?au&a5A3`+F6+Vq~fs$}7a&nrݎw;r\N`w[~0_71N;SiǏ>'\ `<l YTx<n~yvyd nx~/Pp*,8>I[sxl0Z&0TZa<H\gN0<zܠB LzX&0Md"i0z6B.5DfOsiongiΩIփf2HT60f*|C%Xt /0QtVA:IQ"+Du 8YvdEK'XB:lNraLFINl:YwxjU}rڭ*i=/ ' Pht:ǰ/F,}Jٱdc<P$އ@}Lvnkv%ρc8} 4**5i 7[a7u0J {aDQ z"+^6vyl\x7y5,|?lEd@i&:d5V2!Ch,dA΄v/E.mxGfX= [5:eˣTA$l-&p> V! &_iTUFA5j?v{'v_Fofy:t|G漜9i\ nX�߷oE';ӬXżkҷ';Ub5۰F2}];'iM|ydäiu}c${MTZsQI$'(dؕ 6x-UۚdԑӲlݦ8-IڝR֒&x4LH-mޛzb&Hi>M"a>iRŮRрZ[[u] ZDdHv̵[d p�0vk8a)HpA9+dK28\x $P hY_`�8} YehPS,4%U>;N p.Tއ<HPsTn ]x! G&G X-"4Ԫ\ ":_i h,1G. V9CQE$]e;4*)PKfQc[-}Ua0D]I}-Nڭ.HSS??BYDtCHxiCZ+fy:a{k8lՇJrtz J˥)@,P=ڒ&U-34M)kQITZ[{ZT^]i?acuiEsoaӳzD41hϡz^ f^{U(Nʪ9rS/P_LQ& caxumj Bo%`@D2GvAW~ OK�Ec! |ܟ_7Ġ+\dMc=v!Ll7ST6x1yE4j5ɹfT%7%.9m|[~0?/=vS 4 Mzḇ׈ͣc1YQߒ%ff;K!+?cw, 7F")S=˘3Mz\Cr(ΗL&K,Yj!j@ϻ+]RZqJI0]B˨<rQ%kKT׭rUlb+AelLgQcksMiNc&XH$kXr4 A#Q-szRO(´P VC3Ԁ!h028 Bip Y _j(.~0� :A \c M & (BPp\vq 5P BxuWs 8X_+o*:4$%nn{Ó%dCȭ1:h£xtΒ 3Er5":A Hq&$ W:b駱Nf`D;CJ ,љ�oBF;bdE6aM^pA݉Ej[ĸ9Z7{h..b&2%۵>+@L `Vv"I^&Kԁk *jo�dاON+PqY| ۔ݱ>N[iU<{X0ح99~y(I%'$reT$;Dy4Ig_J8TZzmVGQ-XNqlvġa "kx}:h9(UQӨILИEcu!�ې 5:!&C@;S&ffqeK 8 2z0 xRVu\f1�ljD"!uSIkϹT76!F2q `.LoO%*ݑ+GenщG]vfjo+*%Քe3L#S¨R |*k5O2LbOW#V\^Q=aJC)uNG/.X7�� �IDAT5q.ӫɍTU:5{W%jҡ:22L)*bd�SmC35lfDK+5ʆ*(&>]O  z<EUY[R<fi~fJ=wCߞL)]t:SeL (9Ff|o4d8nmmmkkoe]]D" uttt\ql7 `\ \TxDx΀'~caʳ*A1t pA' +?"a60r [a9'� <0V# nB%nPFxGx -(NAV–J.]ryL]Χ/%#>$qހ:p2q΂gT:hx Hr1Zt02H^ W,-TV$,c",{x AFA5v/ZYBeX?NBa;?L&q`zdiʨ:5G>G\a"qwAIra?Zljg0<o;lj7N$6&_zs'FnV (')yhn'tf1̋uJ9o =hغ. 69vj=J_1R_q"&@N"S8\ J.jiiiP˃+o}T5xIU@| 9p-+H$KK N;Y•k>Iӟ&rlN(PRwgFʲneokkFP(Lj yx<nSzL)ǸyA%S[lq_wZY`lALD-%͛2 /LMF3د&\r>u93k۾{=wǾ2[&Ge@秥!?_7o#g:''OoH?N $B5ku҅u]w{*LbU}n\W]E#҃OBժٴA]>/--͠L%Iݳ7SCQ&T6-!k|;>vьE||A8bZ˻A6h0zA;΅A lP' @?PiנNG! sی @PGa.*LlM\(2 5V+vP7wpI.>Xʅdlv, ~ PКx oKA&lҞ}o^ا41,4rڹRFb#47ηqy86uW@2"Vs "nr$# vyСOFͷWy~W,'GeQz< ES=V `RzaEP<ᅖ.O;KAґdu2y9˼Y)Ƀ&44#fD\}Q EȦ3+5~G<07 ~[8ġ.2k m>iA(.u햛fHx!v|ZD2KU5M<_X""Jz5 م$&qt"uR!"Yna]3CaUjtF4tXSD,8$ȟ1p5^~߷ŸU > Up541Z0ZRiii^~h.)L%5{9#:4(GF4٩ sn\ >qm#6x00w^3柱}D+WүK{83X:JuO]+)Hd׍NoH%f9+jYXc-ְd ۀi/Op/dk=nOtCe6N:QUnѧO|F  Dr".dDziVSل\F;l}Kgmz+~lt: QH �1739i2vEQ *pN9xʫiZ}*ETx8A 3]y?( 8j"Ȅxz r=�߀ M%/Bڠ4x 2C[a.In!`n- sRU Vϡ :3xO <NH;1T^Z bi{QuÍc! [`!ϷEh%n1vj٤ssX0ƒI@$B:j pCl|㫥~'PU0' /u\Ӆ7yn!JKYEMA3g4aE҆7˘>wdtE$[8Fc{I|-r!=-haFf@`:)r&2.]Q9m©2Ci}OOm{+p! >~eL\n䟹I$ UbBm]hgEQصx,nxVDՖ'A {*zltB-H(?4IpQvUy_ndƜV"t̉0\,>Y?JomƐ: 77,IdЄ{<2UL80دVb[˰jwƅ6aGV_PT~.;Q1꧵wT3xsF 0^O$P]t}p{zez*ւT[)!dL*.s_s:1GbF4j\=Lj5dVkݹu~\Э9όDzc^M1ITuMT]U-*>භMEZjnْ# 6(ydN8XeLŘ_h΁.Bfx*`~($lɐpDw0F>xfB�sEX`8@Kn0d;p%FgE>PdHli%ٮQ%ƫ+s9#<Hl \GBR�3A1=Rb~:vm<Bvm ŃED <䆩Rwt W[6SIDP$�t2أiHfQ@P;!Bv$Mzz&7|sĮ)$D FK4+BCP,ѝɅ(;um vd !& id@Pqh ЖCJ~{_L[&XDX%Q]4\lw &isB=QW8kk|"U",Vkb@k'Q*?"JTXIƩH:IEd0/[uAT.QU|P O+8e#nPک:71p8 Y,sFe셻ɧFmeoRfYʰoA樟V_xކ1z a2gSQ/f4YdK{U;ЅC*0҆jTE1ӕ$Iq_}2hۃRӕ(qKࢥ\L͵e93#@VɵT=w͖Z&9o?5EaƼ@߀j;.bù$Y<Ms,hB ßO\ jN[iU*з2̻3%Ra~4;6jMH'?uYx xo̊+zd`p> p6`%\ XҎ̅oa8< yp.| 8B`� KEP =`W`,Np̈b] B;Xp1j/]A `p<E;Ud/Puta[|;_b{l|4Y }<ڟC5l3L- 10h&2 cjiM"$vʓ!:U2w+</Pg3Ce.%6)؃?.:(:<?^~u= Y#esF݄1 o1 ^IÐpJX3qs>&2^$>-{p`0J\ȑ3Ϭ<8])� .?(2c;0E  쯢 9}7:f,yX_prтbkwd]"8d=IV:9 l*-Q"1e: MaeyV|Kc} !GIbmpD |p3#$[%P6onK[YYnH677~ScT]3]z*"5B L ˜EaE53o^m‡t 'C+^^lo\ǀQ#ٵo_%i5)O`*pZ<PId3'L!PxI ;˛Ħڢ k5R~f24]p\sR1Pn#sOf̟ـ2 8ק]qMAo><|MUwJZ#_i/Jm̄*u{B), 7>^ '5vٓeP $a _� QpVBgFB!,`a�un&+a1LGat@NJh% ә 2 p8]M08) Uzק 쑸QCO7v?4 ٰSc$|Gc/mf>\,8 dɀ2 VꜯrJS LJOgdӨNnnSlqɀX<}ny5*tGz 2$2e'\F}=>U<t8I+ވ0a?dy.^U WtP>&j;DT:'[)*E6F8~HiԹ*1LåM@UF樍 }Id!Աgo`C(V2qY70^`$X#ȵ4F)HyDmvy륤t-3G/KoL>/V\u|?+k~Up(aj]"&(kg8NE4lr<֗gq`] ~P! <`xW`]> _"�: LQ<Gh$b|3'20Q嘚F5Ly7 58&ό, |͕6t8 6Yƪ]wUن}o۳vfy<PrwaFCѷEӻRmѻfeT:UQ/;nv{=Y#' 9Э1SB*:UHfb.G#B!d[maڕ^ A{PsjWZWl 2M:S۞p8˲l< 04qj3dz:=$< gnR9\.]vրu:laQun3H %< 9)ojg'T1nsG{0rp/#Ðλ ] P(d ! &1[`- #N<X3a#tAr{ IP!~ȇ068WD٠1\>HK ta!Sm&YU9rꜧ{zrf 9\Q*@P1z HQ/a<La: Dz{}}Z^k}BaB~-ҵu^hܫZ zɧSbm8C�vG"8*bKm`NyDqŕJPR9#\`ǚ8gNP{av &j=];=(vV98N<s8z5./Yiam 3ɓsWp!  `SThq aQ«>VfpcVeF8uorj 6PR00F⡀4]'$]bŽ[& SG>nA:"SB?A S9&k&5?8FۂqVPӿd{U1י6<JlaNv7v)7d[D3?4<M#%6̝:O87WYR<$)q+ Yt:mC�dDd9 m[6z"8 o!#bQ8wfةSUB]!W,0cyy*tx؇ ;riodDQeGպ#0ͲPD䈢=S>l3Yv䓈3j& -ݙDKNe(ϐfm(e]e:V8GH}%ZjL]fty`N̫zQ]J$ށzB}KY3͙?ǖD?SjYZ,m늍JV'+Ƅ.X K?S/5!}0'ZxZMj Se;GN ?0l׫2V߂!S'5_Q0:o•\p-:iF &Q8t5LAs2%qdVM48Z!󤝋L.7!yxd\(BT qCmϿa/{<;˲_%W) ,nMF9;+,59(թ~�J)EW B09'1@j{A;9<hUȶad| Kȸ!&V@wt/uf�oi]]ȢQ2b02MLQFDs! rJh^LدBjۍ7%Feh wlU7R}!@V%+Unr?.}aFO8@2KLMBM:l'#4!T*֯yU- {#f")5Ő$~=]te^ﯩq\^7͎ipeF"@_s[+JJk܇,V?]I©u h|q+T9Z8-}C,%d29>>n+ad Xp{P1.2tczÝ]b@Vj^8[:ʆN@,3 ʰK_<9' ֽUnj'hMgOLSpt:K{Fԯg\t0"(6k�u! 5{aNM ]2|A& p(Q;[p&ظU#+` å`� o|6A� :~ |O!nQ1'))҉WU:2 <[ ̂1nHPkC$^P! Q)'3k|Cǐ8_BqLd)TdYynd^kp>2н򃟳mlV<"4asPbdOAd6RnNgtv Dݨ{U1ZF@"^ɤ䠌K̍�&r'S2ҌQKylWY9F_ 6Iy+dبqVSYd H9T|nsgF<$r$6Tz)Fm~#\[ ?流 7_ޅlf1)".%crQO&#ڵ0 dxl,1GvABN7I&p]ess@ǝI?$ hcF5\E@~&rbEd2iTofr 캺�� �IDATj00Ǜ . s+%4K'jW3e%DW!eeAhD#Q<uL:ܣWTes@gi 4'T"~X";MQf˭T&U@F{ee=Q申toEb,Ҫ-{(%e ;Іte3ZH7 辸wTF1#pERCLLJA?Vk`W>gC`! p,kL"`.&̂zxdd> s `{-4x"5.`.Q@ NAXOB�B!{!sWT3\Mt'8uVH|@j8yg%.5x̎Cqѯ#J!Nq?yP+aj;kldW3̖$z˖7zy#s\0`Ƽeɻġ,dr&qH~R8L ;:'F}nbrfCq\Fڼ8ҔOr󘯡V19Fo9\>A- c a?}9}ݳƨt⬣3Fm#]5vH�VrJ<Cdʂ]e5>&\N!FӪbh1",j'!T4ED9Ͻ/RB y)Qc&p!0+s+bU:OVL\n(9zetƮa7 ކ1$o4HdT B'`B!;_) j"@iCq+X{ -DXZj=EGe۝N uuulV??홶 m|w!Nh\Y=i^39|nO.v52:W&-*ahuY#EPR-cCѿlUF:.MK)!3J;]j5Xq wmeY]4l,dnvYhVn'KYJe[Vyov]+t0H;y˰�"0d n0@gzXDŽOB%,?l vÐQP ~XG_<_0d¹&ds&)3&-&2pllv.S 9LQ< Z.L3?Ln0|S2 o×'R!MA r,Ҹ� KCEj3Q_GJUHT{ߟ?%r_\EM;4gm_ϸS/\i|{1$uFYg_nOr&]6ӽ'w2hx1yYC6 n:^.<MTj c*> j0uܵ,lg36V0bnangrHfh&2cq>:.LK3SS~І{MIt*G .ET!_/t;^=oŔ̎' t'l,;d;oғX΢,_�xbgB ]6Α t@\J<jrӐ�MoP[�^1 <s8[niG& fK/~WȬbD"ͦi!k-3Y%}\.DscR飙=F_1VIMMM|^R5~v<`ש]s jno8z[]VjqV/UD,e`NY<M,FK9ܖ-p*ed SUrYgɓ^e%/c&5ߘOa"έTntO_e,�EPViwYig=/VwRHf(d4m[%۴sL'av*; o_K@ )C`nnp,xdxF! !)4p̳;.҉ 1u:p& Y*Qxg4m[ADF18Q09G|Vu\7N{{`[p164rnts)#Sً]]<gƠdCa`?;Ye<Ƌ080ԮxRm*}T8{g4͸d,vJzzR!f^v恔 wRaG/GM"Ug|+U~sH:4= J7Q.jcc{ tn%'߬%5A <IDzy.9]B/qQ'*'N&BTnFhea:dh3.%ڜDlВqqf>CU"zMv̯s\o5ܑ*ͫu }q28FOf8!F F68&Ajz~Nj~LbI|ŏ:l"(ȸ)Tn۶m``@>(MSCVe=W Ò5W~X6hMz<P(z[ZZsݶmuP_:e7.owgOjOUp4`JYX{Q+}!wGv"|TV<8XpD]u-~dq 4[_hzVxǽݧt~z#@z_Rfck"V6{ޮuٿ<$ B n sL ǂ� sc0C0 Lɜ /~Up<{ j2xVBl49`_~I]vppe7},f| j!#< @f2=<0?C>SM /Y.c+�斑uӔcOmvH%bcUN5ƣL%BU*|SN_gHƛ'8TCԕδ-VX QYaYLZF(4qE`{Iq&:u1ML!Fqm";@u"SY  ՃHjRA2)YH~ ℳS04ŨLhdw5�>d]>':!24,J2RId;Ȧ�~팸1&ЙJ<J,;OF)Bg =sKH&vTF4 2P ˱Ks:L&wTI&1ObS)s  L^2Ot()=0?$kcp,D-"{ufB(ҁe3-Д$pQ8K9tF4$,bdĄaU~2IHiu:(ibIJP{/ӒIx`\H$"ĄNľe~Oi1eP2,%2'i,IR4.-MC;k8IPHĎfu37)J02~Ҟ5}/kk[_izٳvhVmO\A</LJ#v`Xcpu{[*7UJőO,;jAl\$` \YmrKQ0:.XoBxd2OY_98k!l48p78gho^CP�3u]6e EPG�W0>Adrxn7Rb ;*'pvL'8?zYVTI,ѿwt]tSISC j Kgݒ׋~ _4F7sL67ǩ!j7C?шZq)^N'SHY/xDdYTm#5Hx 6(8z;RH TA"VHӒgÞcq|Qr6vķPz[9e9Cj>`[qq Ű8B|Kr1 s!8?Jdd)Rl5NѩO=]X < w| 9̾ѰȖ"/I\2xtJ0IC C=m:u2pxL6Րa1HP0g<ظ-ϝg6p%D6~)&륦 VK#ȧa ",r?^9MpDG8E.Q\pᵆ`OP&S2vXbm-U`0ht+jMVW.>4g(l> ?uj NxUW?l+*vW\.Lt:%*W֏NS];,];liC:I.EL8h/iY9j rMt7_b+TDri[W<C'Z_eާ 9 W_HB\ Q:Q>57߷om  plS V h41L 10y6lc Fu.]!^[I@<<̕M62hP5F h#MC<On0`6H8~>6(+Я)`-0 cifɢaJW~/Uy۩ 7F8w$_UWtCK3li¯$qSMuBC# Oe:j 4fF.ǃaO%crZ" ~9(ۍ^P#*2d᥼*.d>Na a_B0u!@}/R&XhN 7ph.`E> vpy%)KA3|ch $0r%(b8 l4yJD5FԷC6f}ަKI([v)NJX& #bSs$l1M8ODa!8tP!BP{LopU5*Z䤯p"`G~箘vVnKDdVJ ut }ӕ~v8kĖ/m|ϘgZ-%:đ౔)KB&OK666&*H|>Hd[l}o,҂4T$ufZɴtGd�x4?*5eRRy$.,?əƿ#*$*Ns"Vj^+kɚ˺o;EowۿZ)7DkrcH:N_o 葊Np8 kIpÃ\ O5"tG$|ơ�]Kat [HBep?54:raK1W=ԒÕ^{${ cy!qB`Lf8?js(ثsu"[\&;O*.7(o8'29YiyWEn[s~|vc/L=AU‏_91è{H&hj #4C%QIf ,r4b$TIbgx;+X?L s 8@CF"e Ʃbqtm;G;'=Ⱦa Qnapʃ& ƨq'J7ՔGUdIUFyfQHbH|G~w se)s[ͺ^1%aQ)dq-c+!K1n({_I^eqƯ9Qg=,Ht*K8rLhcSsr#eOaUظJ'&QLF%LL>w<ˤɯ* lذ[FE3+X.CBJBU\mjlZ=$ K(ԻE {l %~@6]5G}k5MbG܂V4y浴Bp8,|lX-:4w^HEwsȩ`0(Býfo# sޚ3>ߎ7_�c,.aʊ,eZA+,u,SjXjZ!گ1Ƭ'^ |7 mb,VWWPlpӨY$=g©䕁93딋=ʭF*.k k wkaU:]uqgxM)s;5w f3me-=zU Wcp7"81Pa.AV\?k۩MxwA,7`?\ , jh$uXjB2YɃaiqH X1,8OsLq;a &P JR3ð0tl$=gp&<M27&1?$[*'[ZG;Y{ VenvڮG:;L ُ$]Qav/D -Da_>0O&#%PYF]N_<52Iw>ZFD'> zr25 ;H gBgA;rpY*;NY (c,+20CqxAN{ fh*ЗaV3L"N�5W2Q(pi(&=kjOȐ'd;{1h&WZ06(g4$icY#Qk\\ƲuQnD=㡊tCM\`J)`6z(2<dPgdN5;o]#I=H^6(Ӊ<#QG8.#u;}/rqh\ƞQaP%٢e}EU:)5hN)dy;^3 -$)e2C obuuΦwdU"F %Sa Zfi~4FeeeGډ|>/hbm"Yy@tCG:RͰʧv=}4reB!פcT[u�W-)-m@l\Q4E%JXx' /Z WGBQK]-Gɬ*,!(V"X=E�k6(,ˇ_tt:E#JhhMcX>< kT,*}4aw%5kڟkx\}� ́7@ށ*a5lE(h>X q`#\u\x�fCPU`)1*vk~}Ep�±Ab5tBL5,ɳS~v(Lt2 1RD2i+ֹĞ%/w;YsEx-~pekߗ_8dg[%|r=F[}QO#$*"s撎vC 9sCx ܣT~ypVTLpvc #ql餇dA$m&Cx0XːbB58ǡ#̢^B B.+eR'eReo0+$TQ/cEr:Ҙ ^qn.Zzx=/|nAh|sFq'7Gu6hQ�UeCuqP"!]F4^w;4;jk;ɕU9J;_yL@XF3ṥs07Ӥb&\. Aմ/e;+6BOH$ :M[D'sX|{|;cKS-zyͭ^UI?.e|S_"f|>dzxG" t:lPU'*<})'Uo| _u;V?ZKjǶ;~ۡgC)%3hH1-M,pu$@/ wjݬ` Ga;b2|>ife|\o b5;KChahdjt "  3M3x(ز%Րژm|C,%kd\ .Q:UbJEOf }Kr#'/�� �IDAT]0 ?{+p2^cLtx/p>Fa9  oRx ס8NQ8Glx>i#S o c?02|~(pǹ6Ț0k250vX$E˴KQSY &yQ;4A?ϓ)KgɀF*.2$F  \gcG!<x[M\rMj?]Yl\Å{OaMq9S(,36-SS롐F4;U a&3'H+dU�hcxP=N&v0)cG 3 ѕh?1' $c Qk!TJF5EE^rY\&a$ԃ5L*P"<YdyrQ )$Ӭf|bydE  qWqNM)U2+$l֜U~mע>Ǥq/1J+b :W,`$*̆,r Tkd LeyנZ$,pYXMfE71Th1CLUt:]f+B8`XU�[ WR,Tje'"NDM|fEUڟkZY|oyjW%?ɝy1+x<JxD"d'0U3v[ҾS׿U?{lO#^;7ULY]Q:$CtKU-4KR)[p`INFҳ&-tTV?&G+k֛_>u&Ĝn5TUM$Wv{աo|!-1U& zQ:nU<N;KTUs:p5j1 Xs Y-p?L`5?WKrgM~np1 AW;ṗÙMʣE^~oWŒ鐸_[D?#PZ.H's¹&309 (2'έ𔁮o<l.ٔ`O'|NJ?EOگ>@8TZokvgCxFLbk�5/H969%D-C+wQ;I UGcNC:j&Dr8bB?uLDpvfeW$ RHHnE 4UGq`&Ps5;YNYcr~4貱 }߁1êT?2m*Z48ZMZ <F-fpYT &q:{mv5}#{Q�"JebE*2C,CZo-b{'.nAvz'eG"K!<=$ 1B,Ų6sm:gaeYp pbJ᫭,~1;pYÞ*piDϞ<c,|xa0}N@_x~ݫcڧ-eceYNӉDB'&&d)VY!SzZ7mfY| .c=+<3L?(eY]#.K6z@XN0U6<$\ҴtP$"(Nw cabXy8>gyҙ*\)p3g{ֽ1I>zEZjмgfԬA)d9L@(<o@&qP`?dp#Ș\`ZqX e .Dfh`tx i'@{x@uGoy1?Ğ ; @5=U5 I1xFؤq2ilM _TY <ora0}_+H4TudӜ[)j||y(uc$<أկҝOP?]~j̋c)鷺Ff?Si"Mm!cYI}} l_em,&;dq43hG${ W0EGƼMtڨ\~;rr51lL0J 8"6a:wp i]E8o3*j25Nt0BlQqz=3Hp Sv6v5m _kC~P8I]M$t %x:aN;]lyd2v wrM\pv :[l,5QMdw&ueɬ ,P)J<_9 Y >;d G|].XÚ ϔ̰^%{?w,Ba|^]]ksbDvWiG_8fdY:V(Ԕ`{gq9i3V 5;1ZV+x bKt͏7oWkrdUs[RnUQM=d5U4*O|&hZ-?DG4TUU g X:ʨi8Aqx:a'MZ ʺ`y5S6''Cg&VYRsأX !Mk0×w<3@a)� K-Lܠ Nx ^x3hg9dpe.4/+Nx ΀wAYep ?[U&&%괳oq.-(oO/-i c}S(|l<HAFMyN*rvw`u u~-49cFIiqwwFw 7�ۜ\�9Ciz:c|{e=IfM! $ 牦qlW%�:f1gC&u}z(+K}4hMAibT5 h$hM9@^jb$_E㈰%D ]8DN(�8a]S8^5&$ a&z1 Sih!ލ"Vdԅg2]J"Ac0+:I?,E+dvWypl1f $*>jRk+s~'9LAL'*7+~NKbL&\,yGc \ Jt<wV^k $N6xm=tZ|S\踯ÔMENt:<+e->w!X>z8W^w]V|{*gyd2)D|\~޽{v{yyy6d2G JץGGdsTL`={’$9|ۥ#[*Ve2\\VsSzu'NJᰔaM�wK B}%`3ѮZ/ TJ)i'DULLR@('nVMXZ 0kʞHun&r!ɖua;9@P%p,HIpBgyxt8΁ۡ~$1)cxnY th<)Tv ( {OX9vuu& HAQFiƙQftè#::WQ`@LrsžCu;?4V{{kyf/r.7w{.޵_>~R<�p3TY&hQR [ihClƈGM\0oB' Ich|NܦE]d>�yedu ӭc~`\q7GK]|U~=^4Gʑv` .ϲ}) O`;'TxIйØ;,I{)I%Q "=$|'i![ꤠewg`f% ĒݍTE)IHRxfș8f0Ir')iP֊JZ]¬^ D808<: _ 9.<*%aAZd$2lH4\p'KV`3.sL T}:BJw]x3A$2 .^p~s@-HbSFu}}9ON".JZ_쾛í{[B$|cэmLt:-dBV A]v!\<oҚk~T1Ge]/kj,,SʴOS˟�#X,' 666yD.DxAdS0_0Ƥ a9!p&DxSR>b @ěƖ x%ϒp룧.CX *̾x;k!&i ³^9Չ�@`[ƅ-̃>qƧn-hܭqO,[ٽjy3[OK<r7 Tu@I#aa[Y&9~$qB*qa9t*$3؁O>X}8Gi]I" 苸PE)r>L6c9 fby<rd52~ VS`^Ϡ�+d録Je,vi9zבBc(oNazKDT^jA)"$tQ'ĴN:}u22ȼDgLщCt8Ǩ0'^AP.S竹=DmpJ'q&D(2@LwPhrp~ }D<$얘,0/ȧӌgauҝ??qGK 4٧8;-1qWC $64"iO2l?иv2sN2KQ:8o hn:*"9e54$On Xبdzqћb1) yq-n14?h=ewϸ}c>ݬgf˒s42c#UB$rDnNǮ?>ה7̧ -Bd.{|~�s3.) Aw(R|^XϿ)䭧՝.Xi IHĞg.l)Sq1͊u}[B`,oa%uJKA%5dmO.<.AC 'q) 9(4¼_+ ߃ȁIcZ�9XN8 Gp?섢λ8b I4qLmaߦ &+xν1sw ~glk|V%Za+h:aU*-ǘt;)Yh[MD\9x\4WwjdœR 0�{sX̩lsV\il3X[X9d,1ZѰyȹɇG(pg iȬR Gs4AXZkc - DSmH*:٨jXT-h]Mh=9Yf|d.8e-^FV29AMm+\|Dvl 3[9,>Bo?gM2S8U4eq&fQ<&<S\FXmPOoaugW,x5;Vc*<E!\N*!s2V.  %^34UjRA臠T)c,*$\q#Ҏ|>f۷Rڪ֥gpJ#*d>;hU\uփ'yBH><96"/4Ka40DP3oEu(bKޒ#I Zm!Q/Kn766 XpQdt c`9NQ%>)tK8. X ch){T/u}W + fFmR46?NjŴ!W='}/Qzx aqD#/!`4Zc6p7yHmz~3y.o ΅n$: xasj;_{$ʿBrTOr' i#fE(vHH8 1;? ^x�TDJΝ./G98Arbent +g.Wuf ]naRM2Y33'<z&EZ[kANq"@t`#X&FMAA6L+zf,XrHdnU~nSh~l B!QbV *4c.\dz hɑwbKd|;yx{dDҴ#0IZ]}>'VJزxU:^L-Q&SDBLؑ=eR!U߈* wP@ucN ʮWi_4ڭKs9o Vr"p—:9/O$>>\!שJ 2=\QeR#2EE9J I'. O@J.7$a t;V>>>{nSN`s]w vJtO:ӚQ\=e7>~H yC Kf*jU *Hbz(NpE0&azd[w"AIUUf]7tfL:eDnOY=H2N9dzٓj 1RafYϹk0_LPH&tz K^(ݸA! 0"Y7XsƥmBڌ"hޝwov&fy3-I@9Ƹ/݉n$%ONF%X|}f8 ap@@�e#Q~ Hp.$ࣰ  ίu4m {ҞKgͰrzײJڳ2Q3dd /jM4şu>)x'&GV^ 0^>?:qPrnV!xfr*%2Tl,TQ ԠΦ<hi9͜Ӭ1.+_0QJ\7Z UΞEo$0G<;K Ddh {V|D,x(}%$6`cG3~Vwrb`'Xi3M%I8ng.EVZ*lbɁOcNnh31UYPGVBFM!,vL٩q)P]Wŕ(9VO`*ٸl-S5YT%=F FLL,SaJek2ӔMFFx4-J9`&]g9(m õC=XyEEIM4:e^ ٓ#$|�rB6KH8X!|_ йOGBVNP4|'\‘gخ]^o$HtYԧMS5FHM_>K{t%/k}.M&Iu{n&"Zֶ]mUoЭ4VV"+Կ!g?\h0,PDh)Z)[+QWBjxOD5 x Psk}&gĀ+QbT*Rt:r-ɆO1Rz|c^wP(ϟu=8\lZ΄d<&:G'UpeYlDSzZc}]qL+*\o WqI (C�fz ].GOiOJxuN@\ \ᨎxgJr: Ґs%u[\ 1W`4Su_xZHK׷藎`& &WVXa"}Q![䧔W* AWTg5&%-UvYTcNH8twXzU*7 ?e܃o\ iX0u q X#9tGgi//lcj/(5,Rq@ P+ qIۙ )Lav<n< MLY �� �IDAT@2ŭa簃E&Pߌbba O&I c[B-bTH>L $(XDde/EvseRXJ,I/J+h5>FxdS̨lnV/ s6b t&Tnxswu)Ngd˼(e!+*1tV)d%PyA%T -N[B T.Xo"LY%ZjL7*!GyʢO]>zOHSv3KB4aˈP\3?p6^sřKf\.UR|5imb!A5rN8Jo'+q 0x,1o50M8\YVg)-k{puru:~ z!0X=j/( J)m"3_<5c:E"J,h7.:f%)+:, > Nb>o;x�3&>&V5|cg`F^ d2֪Z:oթvdT>,t6<<>nָK*xN�p k Zp¿W&85:a= i;oMx2~<{xJgj$uVIHVh3:}&n:Asa'|7|sGc̄:7?Dμ%.4ZX6g-;d[SӑDU6Wk4hdh8\hS@P<$:6fNHd #rn&*xi5^c.8�);2vFW#ٕ@r+1lسRabP'c0bX\(YJ)>Rτ#6}Fff1+me|m8!Á_u`"D<o3F'&  &.rp:5ULedJc "*I \,#hni,1R:278H:z8|T<K2m YJZeH%]%4; T;[9ex"Cf/ .҉iM,rFZ]&::+|O|Z&cFP#]%A0D ,~z-}uw<!RkGچ?2uq҄^ ucC+SS#DMψF]Ҋ; l.˂.VQ.+oڅvJTgB[{Qrg6)#<.t%&JӅoѩr: hT\#3-]ѼNgxJ2Q_50/xn 9Kx^AKvm{Q`[![2h/GTiGB�0Q:X@s:a- GvaxLiHa;/^�?W97J6WrGAY~Uh&$a6s#Nޛ<M3Οc:Y UVzتhIv댨|0M˻FλV>urJ>x?!WV?=l2,)fqh֑rS"+9? :(Vr*izJAFΡt^A �8tpy.q3ItqE:y t9+ܘX b` 0BZN1(0TUӬ2 6E"` 1X&,zX?(7?BJf+V8[Xmcr_b'c6)<*Opv+ӛ_=\ZŭSJvTA"&Wr"չy&1[h'_YjZL| - *5n\fn*i8uv}qF,X.sKT pfQ\PRMیKeP -WMsK\=XiMYYǚoAFej7_2uZ ͢V]ɧk_A7bS<=-kַyÒCQz]hezxv,\zq꽚n-_. m<V#Q;#@\.׃KliyGkBSscp8n*J P\.Lx<rd Bhg+؅< Nx>A~~0T' [%~/ _h"^:|E ocv&x_8ꕹ 7C:^03.ӧ՘OA0[-/0 :;-9"bJ:-bO!/3y X~au.æD9$i2/a'K"GHC49EyaR#PaJt M15@D.<ASsDFiT9|X]L43#MӠ\+~|+㞠cϯ`Bm],~r:^ %5Mļ4PCT[,�8oQYylcVɕi2ri\E|K_/V4h<w0Ƀ&,W{S%me ʘUfU*:hl"%=CLke>bʦ ~2υ5 qʌkNgi=pdUҸب*2;5V(<3?1 i(C,j),)6>a{{+g-Ř`@@p=# 6E>Rj}5۝-DJ$g@O?w #o]cBtI i"_"UUva0#O05.CB¸O$+`8t_<RtZV:pb<`pW_d'Q.c+cA?7)FvxDb�.IA�06`;a,Fv,`G"6j<Z!I.:a> j@\A4vkjZ'r\�81șJr1ALƟHp,(1%8FsS3 (KՉa;HV\l7jQ9j~^nt9K h0iVid4XD`0ĻXOf4d& [{vQpYe02E6׈lyJ)![mQhw h(S9FfۘϦ*.F计X&34Lr7A%K\;OÜ 6 YX8A3e''%d5֬刄>NcO`uSPcʊa;?S$F17&"iü^erU+x:8BȍGM2Cgn|Tb5Sd6kT$۸&OeE!- e<fRxI/xJ%?۝<x wBbЮ#zR|�w격\g}}8Vj8MIG}˒e2:ds͵jﹿH^Qkxg|2r_VbX7HYCl!N6S8|/2C&ragsCʐ4 Э_zk甆u?mb-+Dl)CP3]-&;gϤ 6s 6pNB_39 &|}HF%q�yF, _*nR'~*&1Y2d,b6B66.kK8<_$!qt6TT$Npّ~BQkS4Wc|"+:f 46b&h2[(5,1\Yj b&p7siQXĞ4AsU$pJ31z ̺A v=PdrE/*fA%[V!kNs+} qhЭ^r>2DTLabӘL,Gh?H˲Dt¬l5HptnM15pX ^xfDNѣpQS%;ED;KsOW,/pQ#PN\qGiXKMvQ]MEh̽+)hEMb ɸN_W8dQZRlaQIz4:@Fq3]:qn" /k8G 7CIzr1Mcn7, ʲ`O,1__ko<JE#oIt%D=^y竎ѽe+P`y8D)VPe].@JeM>ۺdO]* <;%:o%vGƴ Ì\`a)Va ~SmE{P(x<X=3 BX+rFPX^?t?444x<Ѿzfx]eY>˞^V[_QosJZ*r\XNSj /x*VRb&BRy7Q�1AX .$ *_!@ˡaH]�zȜ<O|ZyVXRcP ?{FeQ<UU~VƢX' <ebcc:>uL@!3JZg#k~nME Y©<bZEMݖÝR7\R*rB~!{|E+;I4ty)/?ND2O,>2t2+!+ =|ӄppPe =}vSrFWqea1B/q:kX",hOa66M1l!gcAe2aL9+2"!r9'& c\2l#i类g7$2ZR;n2/LE:jT.3E=K;Ô#E nvAo9Cʵ%gU27\6TPä11GFSdKl0Je̪^yBe- e8LHc^SpE6~ ?I`F FV-a% IkHw9XvMV4ψZx鶗v~qg}F #�7w?ޭk= H4쎍&#oqh쪱?quw;Wz>SpǞpi\|Lrْ~1뫪c;E9b�#ϳX,r޹CQy %c T> ~ʭ >R>C\9ƿTBL&(PM4Ϡ+uT$N-|�C,bp…dACf2 A\w  lj =(uHBG{r횳đ-$!r@n:?٨r26*gM hH)n0#K/@‹ާ1hf|evq.M5HL{wur[펯gՖFڿ;,4y:GA FbĬ7M4~2Gm"3M�%MҵNL' 2A<<P|7 DԜTJ8T̋D˸sLœ$ 71!;Z' .\GX*F,H8`>%i<Dlx<ecȁ 6|/fqvH˙"z {+cD>RGX]["͌a/lb.?ׂ(2rb s8=vL.fLň-lH;>h*UQ )XVVU^_geU5MD4^FEedʗ<C q̂+B0E+uβУDJeGĉ=p2̽PrpQ?&,eo**Zs4T:~ӑ[m[LXQ@=ֲZ&tr\l,V*Cs*NejTǟ;jzeV͜= 5h " QsQVenllo8.aCiRQƿNHRPTNNB@qxZ?cw sQWNftzn7PAX!6ʫzǡ>QO7fc,JfL?$= 4f-K3g;0TxJb! gMzZxb0tr!:b$+yrC>.AYq!l6 XM:K᧔GQ/i>f't~5v3!1 +5^yev62Gy 8BɊ-Q/{6fjcMޡkUe#m';14kG׺i8TJcˊR^ct.NA͍tgV81MF!ƕؒ4v3C-B,E<. %a xt6Kfi?O``^ΐ|k_[�=t0+w2^j$'N9M)T~86@9]Xo ,DhQ`֐sۙ KP%bhb*!)LːFvf X5�ɳH*V1X̏&2]RՏyrt񨼤q~9F87Y;Gz6g;4:L\ *6cTb=#vf "Z +s_$<Pk2u~$\jĞ={ p5s.[f,!hHTʄ37֡ZʸlkP#&1ufzГZq=QkjxԷ v%ư]S Uչ熮Zܼ^j,8t^c/_`uW/w3Z^il0d @t]ƋtǠ׮ZzQWğW*%.nU@kҨe,.xm󶅦9Q1^ �-OPպ9xapH _1;"VkT(d_+@W`"Q]?Z8lqJ1U#-pHa г{X .KaP{xl'<o=aqk�)V' ӾkyJ)l d;%`9$7p-,(Ih~U9\&c=2+<aBւnj'w?={lڭ5ٯ@MkoRL/=!=ݓVcq?�*^6ٱ4j=,.r 3x ʸSlI""#kB[ U I -jc1G[Sf L܆K?9<-I(ZOcoe&!7b'$�0N*aUn ]/⌒N0MKx ;(:B*KN# +Z==3D5{/3a}:GS(˚CBEEn" |? f*0C(NC !Zh,::0>W=|/7Wj$>iC^A,NͰFUaAOc*|2+MlҘ*~ؠ1Z0d]:wdgC ȿ%hl-ud:t&''{J7չ3ӛŗ_cPX,Ξ5%m/5Wu C t6X>oU91Xo`40{άbr$U͐͊0j mВ)ʰ08]5ouol{6ےm>,n?לR3'j-5|s�� �IDAT'7D7ʌ# @2zuN \;KRmZRwj$:bF=\"h5#6(i]ũu* <p-Ճ\=cޠ6}>uP( (9bP0θ݁@to~h@}Wdrb$O^'MFmR]SBfxd[qR >j=\y-gw(\hm=C &.4LX>q*JNckU"2OƒxF1kcveR[VonyEƭڗw|C6:m:+*>KQ kd)&p; |?F_* }t o?ʜ-cw-֍БW^YeAYE-b 6l L2<HSyz' )e 9X03M^<FdLVF3DD4w;{sdDBdM+9%&fF9ZF)IN9N�+R1E{-INE#EC^+8d:o#3e6qxv }-GV3qV`N90R4h[HOў3LMŠ< MEX2E6Q-ô.`y930˝XB'4sMpqTŻbyK7M !>آr!xJ/t3۪Ң2(z'<d};t"N%.1q\1Y@�tpCŪ*G!Mf2D(,{;Og*rh_T2%wwKHGc>;=O�?>c&ߒ7'$) K%n>Xt*XiMZcc$}su 9ÁsƗ|Xzq"#XB6T*bQ' ㏈vE^Yo=\%7xm,Q5‚<|k+DFVl7(P#nl6+vTZ_O\rׂ�bPKN48 A3</0ŸA vĄ!a*q2 ϳ=l_W5UPI 4Sj kor³ K~bnm&Te_{tѐyu6>/G7%N=mρ-LP׋fƙM˚t˾fp^W8^-+j;/l, ij:fz(]EVb%E(%n(Eͣcs5L(eBƎ7˲<Yܓg5?gy{'(r� !cbc/`/ ,c`L @(fF3SOU~(;2o]|s?7 =ɢ 3> fa\X8df70:CMj\cR[d)Vd jdݻjVDpF(!rNQU=lxH9 R#!, ჴ<å9G^Ap>֡$M&K-^ORoD;Eh9¨r"nJdxEN`eư,;h21^|كrr(mU d$U˷OreqYXb+τh,) [`( )0؊R2P3xri9*�B*1/Xq6{ZX<Aq@md 7Be^fg?lzV=S{᳇^h꼮3lkZL/<4TӚjRo몦踺ccK&cҘ $UQ83YG9!eYe_߿gk>t)y3-Jr,OGV*Vj_ H{<ײ(]2\C}MBB6;u[+|tșS{I!J<id2'?֟o{iB)$R1O�]E7jq=m6-Y 5p~J X:ߡFa+5)8Ixs17U9xĥ*ߒiV>pI?2`(m2}eа>{ӖTgFLF1 U0-H +@̀L%8S8&az9ҷ@BRp{ݧ8 Fb">U9uLVŎz2a!YJn*/$mY0`C,ÄюS y7v,Z@$e9"@O g_5 Vy,xe| -HXN:&)dN2LqG7KPpɾF73mtS)/FDEjF3X9[E(NcH㯣X CV!(cfp& +%'3GI"4;3dͽ9<~RI\b$uISd+tR596!9X X$s[U\ MQFr>B#)zV*۹KS9T2peGXB)(0q+aS5e/w/dK %n}]ݷP Ϊ4N1'13@zh[$˓f54$Tl61iW#Ƨ3L5\=C]3}/˶~@ķ]gu5ڤOYL,"Ҟ[g L-^<Jmîu7z={ҫCh&Bp TM 7q!. P!YZXiZlvAݸDC>M]BX C6p8@UeYΎ֍6lo˕dgn.פ麽ھG3WE}ڼļgS5E'O?oŊIܞJd8"-|^p@V.hYp.{PpmeǮ0 f? )lSy_]ꅩ;?z7ZҌ JMFV8 7E2#Q DEz\fyF1FE㬱P&z~dhIF--&6o4Gր%d(R"ᮯ%^ &P%AQӨL%,D҄cJ$r"|f$J:8)W 4ԁ ,EV#CI(f4J0 kU`v/>!9 Dqug^Ld) 㸘),twHF*cq8uʥ "H9o#Ã,8D|qX,al2+LRJ>+DG9˧X9\_;d9O`X5*=`I[zr$c\h68$T^vqoJ"%)nf*º/ {h^+Yir-"6 $ߑbG`gxSrd^%S#?zbөB m}9A@:9zh ǰ o=\7@ŮsLJ7 CM)TҶV υbHhM>O3k:Ro 5;أvEP lG6N4_!NT(z爧%8:eXip5ϾRUx<G$<>aBig3Hh<d2ZjU+-\5XR{NmY.Q)댒yuWdZ,y*}쭏&''.Ǚ^~B S*<a &JKp}<<B'7@5\*~7otZd&}/)#9>3/dP ;I9!q |Vf.ϮJg yJb^~߼%G| {o qn}4o<%!``go8Dnp7qQ? fĠtbb?䎱wE@&\Rz8EY<zMdąt$- A|IlCLP}A_aXƨ`MXG`#"*a:vI>@Il"J5 =bJcN q`JF L`]ƾVjHT#rXF>VB102J8 ĺȧ%@&1fĦd0gHhdfH_CW (v qWX7pP\yS!+R7dj \b_U"y,*dfq S:K.h U{ph|vTt>Ǩcy*QC٥u/R`O;\1ZCg7Ȳ|@ PZZ˼e87>cjfF׍dTEM&:B&:?;¦&"j-4K|Ԛ׮K며 z :O[l6*i~QrgΌZM\.ƒܜa_8]f[kƬ?wcGs:븨qFKOk"|Bu#NOO[k>A%<A'?B5!,,*`&ثp-|އ(<qX-{E% عzmu,6pi# P#^;`BBE`\1B}*l9Z̎q.4`0+$!3\TšZF/$cMqdG8OҀ#gZItZraʜ4JZ%<IStr'Q*gp}7=ɦ4b'XX@$I[q\6`Q*;Ei P)u}|ήIkoTS (>STCx7*1b Q&rMHY@?9f'1w' 8yԞCx2m$Aam``R')c4, a<)*Id$1`DɆFNbA(5dG4aRKmBbL<~>݇gQ)=y9lpN7Y[}W1@ȇV r*2w$(\%a@} cYP`*K%Q0K|ΆWa:{:5opj [GpY㊎f^WsԞt�*6:AkxbW;6u?Y/$hz-*iԾV+^X#F={:eC|k/̉ 5Y`*Ե1/-o]EBi-:I�]O5ցM7+hx\۸hL\.FQ]0B'дIgf[`BʶWN;w?y=5  0}< Li~e> \M`k > kHp5A+` H`{!qWA. /|_uL  V U*'`-,.XQdc8ف4<dQJe*bX$EX;V'P/sM lfCʍWA1B&'jq\dO07F O]̜ D_:qʭ72>NK]M_ң#\NHAbbdIJ*LO13bl *g|q:--gy;]]u!n<i9{f[oYP:ukO<s#Qx)ejq<YFr:h;N*o+'e-{0U05Gx8IS~ƣ,`BD'1`cUɕVh`R*a07Ie?s) R ȻƘF1~PA2/1 ė&*N4pEz?_]8Np1!4kl,ID7`S%@@CH6Y"'єg3\Ay5!n"aV5rU^syd-h pfuwM;p'i =Ȳo^it<OLXEQNnl6[mmEq`` 2Цx>KǺL&OF 54sGW \N/$F-6-*lȦKZlmzɘ1gJ5 O^5{|3:vbz5`5hש:]~MPPi}&-HD[7]W3Xc;j+\HMdM 3j G %bKk]>''bXj%^`?\/O62#p;p BHM*;덆- JC1zf�׾Wp]Lj[R*0Цu=_WHZ<JZ8.i9d+-Bn,m\&LY CĪI<%LGS~`:ҞS'ɳ ᦒuf&,P9/ n2˨bMD YϞ)E.J@(cYg6QAdLBt Maf8(y5{>oI ɫRߺ{W7DzoSe#}wϕ<yn/xr34qX*0Pe"g&^4Rj#5@H wx `bat맾q*FPd�S 3-jF`0"j6c"0Kd8dgA38}XR¸ (! *V1DZP4E-rU<>] ِaHPT*U~#a=FebsiUZaU)fyK_]!QY >COKy1;wZKD5!ݮ҃ށ8*VG3e"r1om[+VbBJW ZJs?Ҏ¡B`m}Z.K㾇BH$"eT0tP˵&I,-x. YtZڪcީLzE'酊C˧疲X_JcjZLXW 4Ϭz!A>ThkTΒvCح([84-5tF=յd2H$i2D"hx Ft:L&,KYIJƼ>c[e ڌIi{L>w\{ ke58l2Wcj=ØU(C /—f0`�0 l\'92#T<7v(D 3bC,UyƱ#*9iS9U {Dvt XT);Bg~<a:\T.EZ`%i&\򺋋88ExR<Gx~ݻuX7"19!Qk%’dxSLV,a&FqئYaZ+"W2>Iq40rXǡݴ1 1g*8Ӕ,HXDH0,-df/|?0ZbJv%{abJn^@A".x>C$>`Xrp\*/̻/rnj&]D) dt<%K\`z2, fsX)1P&b&;FEK 07js6l4D$KǑ:Jb~z%c@g &Y7J2G&R&x5 !GE$44%HbC=<y|: @@c03Kd/F0qC0ΣYI6wM&^q?d28J$˓h5o'Y�� �IDAT^5o3=d&#Vx +nU:xxXcڡMCk$CB U} OF*<1t }kF4G)*R).*%;avJ(%sG/n85vX>j :?":1DB"Rp* z~Y_ZIP'hlìbW ?7K1v::)j 6}~%UK Hդj*L%aQ|3 /C.PPp.8%{^Y*pF7aNRK~?]Z䠏E xNa.X>Ǵ X66.ZdaI^Avf". ^mEaKX" [o{>6LO4*{rgh5}#.!QFcYJ0)نx Պ"VJiJL@{([q>88cZD?ERxoNPĖ+}=7ZIH ų]v9[]D&> !0ču%>G>۳۴Ŝ!R䊙Nbu/qg#c noM\ dp6<FX l13.b8ls  V1J-|gow09DX 1*f531Gś!/9Yb AF`麧dȫLBOzX|B&*1 ȼOsF &(,QrN%*G"|Z% *lZFQP>CIdžBkH]m\X?n6ukklĆ >ei$ì7t.GiE|Զ %9LGoy ^\`1O =Lk_B&VL ` Y# ]^S}YHU皑#t:X CΒ; wܟ-ɶ?^x {un8$d /Eƭ_]˷%=]FR.tI=:q4T^>-m9kTG87 6A# @Ku»嗅m ݼayڑ= zW%}'<f9~ ðYs6<_\ A[fL&ëp=Χ wΗb<ۓ|J&e<L"T^1X8 ,tp2$RYUF2BAJ 49 ^Rg7lN`Fلhhh ;0%ʼ?47f]yV.neԊj+T1fpI&9%>r3$?*A&F 2p_kVF7pdZtO!�^;~M7_sek7J4c7y0^sEL*Fr9%G#OEe;D c8qx7K5]ʉnעii};fs̓xQRXGC}1֖o3l`YG9U:9PY6" (6it!Ĭ: p g\KwYj&iA0ݻY\GX~ڟp;H*2,YF[ߘY]FXE2+X!(t[eFk!Rbƒ b84{JSDTG@ @v)\K"(|]f!ԩ'w9f}L9Ǵb$IRV^sGtSj(x|�*OjEZYhk_ii6KQVtqމ_nٴLbACoj;5/h5ned=b/)R\,ZN[@ߧ/{N+榍C}𺕼+-ΰs=_*,t`eB$\3nv)۷-i[5,tG,qZXJ% URDƞѝ�(y_Qgљ[Z=7lPt> 9UsDj$A p% D`+dP (s18W?r0k KOT/ЩNPby;J2˃n*gahWY瘄:(/|ni2ZJb<x&dl4KƀE`W=|(yq0OOYX{g+xz~= xHI&Y.ĝ1e"E, :7ķZ~N&7ћ~E8 R@i;'Vqoy.?7{?e/Dj>]8ywɈc/դt43ܯ]WX PUKS'-.jXPOt+otOѢ wJ K˿uAi̓q@WC3gFu_1E-!$40>ۘ3ͭr-Hg}Ӕ4qrV1Sd710\Lpleo lQ16efWLAFVd0N q#Ů;m=?-ф/¿(Jw~klS^~WXe.m J^| E)tEK2F$-6vgRP+l'yV X#r$ g<'mSSZ*u#&Z4EzYzA>Wt<I~=aLT*e:+Hx-Ϸ53Õbةg2owt|돶Sl*fa4>ո=~̈Fˌ(!sֹgfrr qו7_9`_)Wm3 yadH9}_l&m{c?]ᵠf5k`bT:Up :R~oъ5y<<I'#Ppm?LaPӳŸ߭9GQmj<y2:ugZ V8_R0߁!6O^a b o!?S87-=|O[*?R)T9 )*ʔ͢x=DA/&C**J7$JhJҪC a5*ƄY^x-k|Š Z}&ϩdzۯzf_6K  "# rG ͫq<IS\DBE<Ix+6:K1-e*J$CD8ss|YKNg:vSa""lqGDs7SeXvIo[ #L1YL>"hRQ$gBcd-{;X4qɕ_1k\r2W悲}S \X7< K<cX1pfέ/^%=/$(B@+n~)lӔ$73Km9ȵMcIQb{ #cfdS[ bkd&H!ΒfSKYbodDw3۷ٳ-{΋_zĽOɿ$#&Ic*v7kt Ii SR*%22~/D)UP x*]v"7TT!rL/"< SeRJ뽫={VHkh5fw+J;J iӺɐ' Bmϫ$yz]tѾ^mD"sss|O8NR, `H<<'{>.ŨT+8ϩO/ QX$<utZ@C!Y / ?,*PQ%U_yQ_oca3jR]!"^Oz];P<W_CeǾx,Qp͸)A0f]-o*N\# r֑8ZѶmpAQ1(!^OySٕVU kZjo8ƹicd?eM-yv+?~ε̝rbկW^ Ԋ՚SW\??:3p 6M0 ._8!A0A3 _ mހ [TކAxo>->}P.tdDT.8 NУ2(8; ޅ#Sd!4*آpF{Br#Yjk'(28%(t ;;LTbTÉg&ZK,LDhPi5Qn,U0[2S_L]�E&:GL峸=*dL5X,c\)J-/}#w+E=79HIbK`71 ᝢrhLר63&j"g@V3XziJULQt6'*ʷM*H3ɕ<ߵ>p eLqj ^s=uoΟ<VQh %O+O];S,D]xP,fIE3"* sJbN!52;ld<q27q#Y'10fg0Q̲/H)V7}]Vzg ONtS :_+xe\iaHf1R/ *zD6)1 *]EVMwVΞcDq΀0ƤR9:*hE Q0tQPh iPa5O&K~Ttʻ4=B"m5 ٬uzJ< У߿`w#wgk$=5Y{ʽE50Sp9J* Y_Soz: 0Q!bP>6R->5-imѩSHeT5{j"UlIxXw_,yޯm=yɦwL&Sё'>vbhӐoSbǴ@9鈮nk!eFWUֹfiCٻei_zlŘ5lkxxS.KDj*]Ah7[a:MZ@=vFle]j`3p$p3 #FpJHj-Ъ |.?n^~'6@<%r8G4q{Ȕ6Sb!lq1@*G3TJIŸ,pIAHUR#y > -JQfǥV,Vw]ppζAʆ,Qn"&i~b`Gd*X"}Tqt@ @%KK^JJ 8E=5r5\m5Gc8< UI3Q};+w˜V5E}e0{'wdn g[\ X 礝gU31HF2-DQOƯc-C{Q;7K.>]8I$vv !2Ƒ�GTR X( vh$G5 H=DqHo,"X1)Qk8{wSw/>"ʹ̐p) hURz{=XS[1Oar i!~ GmbKDE|X?BHD}p$lUbtB#+ =u5iN|ĂWx=Rj?˻򮓮B곦IUn탩TJw:щFc7jL&ɢ"t:Qtx\'45=4-MRhhPߧ5M])kUq36Ϫ=EqyL1KO9G;7Uk:x1밥mph%${=ChTJqOq)޻< M/u0Cs$ KGE#qh-,JE($&,L5 r&to AX?^Imq`؇yѶbJ{̴l6U.=30�(! ׁ.wO{X.Ua<._1ta |}N Ta\`I> H  Q1Í aU2Q2߄*\4D\)9l ?x2j`Al^,0+檥t~?kp|pﲬ)AsMsH P&$AFL)u22q|^m"^KfzD_Md6}ɆGzB+[H�uFr<@(,sǟeM�jcGV RvVNe\lj"+]}{\iʶq^#>[TBDBf8@>1+63/4;d'O$[D(X[eݱ]]78~1 ᅌ"2&5D8)Gvn*T,b$ i+by1f%f2#L%;羏E~#;QHeHtq�" *OelòLe2Lj5JD(O/~¦ 9(= k`s\#e`R{ %rJZ"*|<)HhTyRy]0vUFhK{w^pZC7m]}j"d2U`p:6MHh9c-ڢS_wkeWJ߯WtݿB7Z \7ևZ=ۘ Ҽ<ҴK>UdoxYU9+<V}ƼfX aϠg`@\m\,Q'V]OcG/j-@ 3̇I|ɲL& -&WA(9\["S̔z]ag:nc0λ,djOIբ>UN0orn 2V,pp]_S/$|Y !f_B׳*>_aRTM9UN@qw%2&~ggٕA!q0tE{Y(`"ɵ$D;$uLQ˄b*XITZ0YXʠ~~k[Ib sE͔(XVr$E@GurSvݴKhd/s3=Us}^]8BIYLMK˘$MO,a/ksY63!Q\K?qG;߆g;fžoxF3;>ӧWm;wh7-y/E4hK3(;Lς(zu$̔ɬa�uP"k ԍ;iu^gu!1csZxUb`.3n5fn̺]3 Nz~($yZlNoR /<'QPNeЈ{3<a#WYP(2@*xBi{8*}ﭜsu3ݓ 3 iAD "kXa ,UWD  0{R]+~xZ�~ѯ~UwU<OYfhB 1&o?ZޟءU]sJb`ښvm6ܻafLz[>hoDM쾅0^^H{޵ZkX^(Sz)UR*JQھHD.yqyؒyvL'ݺiӫnz Hi- BW{oAfeSy쎹5Vs^׷Ն ]v]Hyi>ͧ<NUBs%Oɔ1YVը6 !vCX;5c[`d%fOTl]u[ݒ4sz쥀BK/*][1v?LF= HIEĺxp5�� �IDAT`t@?QWA?@;l/lHP�;~_?NAu~>ZxVm,ϽE' C9Ir@BfYuV2YiΫt 4}4g7$5~M<%tg^C#s FsM u(D8Y'ClLI:X aQbZXS,H_hz Omoæf3xOD]F'4d F$IpYifuE=Ԫr5d ygcD 8/>7g"03ǹ^FRQd�1뎧FnK^|U!&1"vP<Ê"<C?}-rZH>ry~u20Vpfh"6(cQnX@ (f[ OP3SKMPo<_㬓<(+M{;zvIf/}08G+(:ح]X7:(0Y"%>@ .WɁdk mShu~N[-DG@PcJ*U&*xl/sY-ʓ/Ƞ)nȧY97F|ꭧڞl ԯȋnՋzh04c&ՒIvUF{PxD"U0ۑ&_@d(&|Xmmm"/" A 5 dNM$!P+z RKmcX\rBg 0mO 8`)#E#c噕 vR)cKJ=T66Q 2U14j,q A-=ۑLzěИ󝟓HH"Y�ѭ}3q:'mޗWdC; w  &GG)xbPG5!y>k-(HC&(+ѡK7ɿS>>(:[`QfV%I8LŜ\+$_\Ɣz;vs2rӮmvZLWF>H#?M u$*;0qYSߜbQb<TRƌtL9(> `='>7{]Vļ`i;z (r4dI$!)Y$"e!Dbݣ$ AQC>|u]g% [v _>7l`-c]D Y(dmS3s:[=5dqG#/ H`4jxf2:&isR(Ⱃ+=:Dj,w*cM j"<ˊ))>:Jس5X{uJNR&Lyu~>Nc$V:�s<JХ!m,<% $Rys f]KmG5Î�׹M0 pr:?YFWʃh%>b&$B[8lW6/ c`UbR%dDkN|rL@j%ȡz}f{-HBX\.<3ڡ . _N;sݿeF%QkO7sodSWr+_!;::nD%`F 6ܳard\j,_h5Y?:' fp ތpQ0>Z bT`t?=g&^Ga9  n :OZ8 p1|ZJC:*p;o<&ph<[xU[ޓ[x,2Fq@*i(.8 f 6'v;IN.2 #:'dw*]MDeL:IX,^蜦Zׯ>Yf\"LlB Q5C63 "?URhe~/33Ͳ,xhXUua rYo[ok=5NFJ3QрylgK/#fj)uL{5ϙ 7�ǽd'lefN 3Qw?H Lwm ̖eRd<d]}  h uǣ};LWfrew0ɶ1f[?+u*!qQ;Gs3y]3|h%Q8CJL1pBn`̱N Q+kt#^ӟ0`""EBN Ci AV< */R+-u>qJX 0'EHf[ UPd ,y57,2+qam_=!3lPh*[U~pF|K&gK(R|A'ݟ%L, Ӕɶd{~#~X,6b4$ş]N)NZd\4_pVFb[Ҟ/gg{-6t8Ͳ,iQƢG֯msx,7{~8lŞ( IATh N"zjط'()Jj59~ۋb1|&!'AAX N� dTi5A7x'\c~cW&3[*|<y>O>eo̬.C&sn[ -hENLs<5g !ɬse.}g61ˡ,\EzbyK!\rܲ4 �kaf&bgO`'Y:!Tj(4ѐ3)6,lߚoc `g 2F aN]cA& ayLйmLK?ij;% YX3smL2w9C9Ay }iY;Zr'E* >&o3seO1ý٧ uL9BK,TG%s40![gm7S3ǹ ^Ϣ7ݳT((k[৽X7<ɓ1oEӧgN^:6=fR2k$f2)sgtrJGyƢCg5 !qb}2k(çTSt,s|-ˇev25V-xHc5E?_g[xC;9H26ˍs,o9c 6@vT3%+rH˺uѺdt.8Iu"YPހ~@5q;qk/5si]bn\p7'<vFef~s]eO9p&rd2֮9a.Tޯ8x=~SxL%В-r(PMJP3u^grGIq|{QAx)$Q5H!ً-|>xn(ǁ~_^X5mQ`B&vi@? <#B^ͼR߅.M;@ƾ,@KK!iM\U&\2U\q[R^Νn$֕YlbMUf2P nZ}lR6ߝWjuMXd>JI-v( d,W1';NZH' X(w2%g=@:NX<<iVP=TZk[{?pr@gXq*2R4Kk&a:f7+ᚥu;)'qQ֑/(y-J Ӵu3VSS.c[$t0s/zZʋRuwPIAF`Cq8lQvRtH7d[G7ޯ<~IS:L||G;}FTS9Ȁhg:Ig܉@*Ӵ(uQQ]YE5{"vTGN˵ȩ*Y: )(srYJdj_W01."B9K"Oya9~tH\ O2/kT&Y8$.>v,₶F}"j11HiQb! 2m{ڮT@*r^{96dGUb)Xň`y/U]k'ߚOLOUsc\0'z$XuJ%dH|}>_(jiiEjt4Z3`Zy!|&jhq%FUfT*h3L8c9N!>ɰ/Sd`ΉǛɤ-jQGUս߻U<;u49IpxEfn13 r\EYM.:{uwM5Z(8["nbhb(o?r,h]Vfvttx<CY\QFexWI4eRD+A|]c^ A,{lʖl.Gr{.k<% 쒟B~6K-&Yw02*p DƉfqduE (3*dn�9\dp|+Ek2/d/ePyS3c䋌pNB1=se9 F̎-wk~'l`n54x_szLF;Cg%A8BPE:.ijgN4EEi+Uao"vyfFYv)O&&!c D-Ԛd2RPĀiڼdL1"2&h PXY >zu[3vfl<Ȍiٱm!&#4C<BDSlҞFbFSENaR񧰍k'&4ϊJ+kL*RبVyūR][6ɉ궴M߬=%d5b:R8d_f̺ d<n"edQ/D wJG56/?+| &cqhNq QXYtpABf<+2j|||޽\AL wN'V&23V[JTvbbY-{ʮ b..zg@yOWa(J #9FR|Yp/*pg �ᴴDfW~^Et0ĕSWL-l[;yRU$k͹.Kb0|F@@iW w3 >1g2<2X,3L2d2"Ux|>jrE樵n1&Mb+cEkM&#iUdwI;7.ÀȢ5�63ĺoo)g2q@ջ$]Ʃm5+EhGuav~3PPx<jU(={6o2+ $8 7%0ï2:F0u|&/̝o??J|{!cz"2%HٮtKE;V%{x 1 S .; hΣT 0qzaMyDvyȀ K+Od&M|2›A3S*eLX1OJƏ;MDVi!ds66U,6S6Ĉ$WX^w`ӽW_`Ys$vљF9w&F{?*9)hWIx:)Ln<CkPS|9UaUYvU,D2Xy1a0 5 gZN1EY)a/c ژ>Qz<daOӥ?9{{/B<U.]8_^7"9aE~ WR*YT9 <4)q<:2Tj>\:O3\R tWlݣn縴GgB-sFYA2Utons6c7!q 'o]1.٨cNd5v& ,+\ AWO0ɼ*$Q9 ]�blPO jMt'ܷfwqmͿ?C@ºZoԹMd<cVQJp$)<|fSBBjƒB6W4?ȅ57X5wmMj*0-a#m֜FWK^FfYJ ! 8jFPH4fe+6 RItqK63;g5K/N&vOt?]^@7F7yJ'vMe[OZhqZo?EZT%OCz^W;A^aWK: -:?$OH[;>7浓^Bl]O9ȹZ36:nkvb.ge|2#;@(񴆦2ysIfy�"3}2k%R 9~J64;kDS$_$>d"qÄ́K#̮`@& eev,s�AA#縝٬WhΉ+0{63W/wwnB$:\i;1$Ct:&Ey�Q#b`J5H}ae�bv!复rY (Y<,f5E5s4E9ꇛVf205w7WțRe,y\ų 8UVfs`%ek8=Av8׋�kTl5 <Z.P x<"̆۹B*lFﮩ qS9!ZxDg7l[i6$XW%)ѡ&5Br5H,t/qԠ Z=e~Z9~lbrxp *T5na. O{~ory2,t%ݲLoַeָ@sr]ҠXU(LzdO" "j\ʟIOPD4϶fˑ茽6D wGi4(( |,ؐp,8L%S)Xw^}KҒ,pU8Fe(2I12?k,~B߯q bXVK艉dV,`ýO>fy< 0rHW]0\2E+JR\.'l�llOWbsj[R, c-CB<=#o(S*RT,bD"L 8-KIx k\` \]8dokw>)]+qN~ mx>˿>M ;DZY2 kPZ+)iDujѰ%Zt2eβ^*uE<:4KX?Tߩ`O.vsܵ73q7 V.Xng|]Ľ0 *"^ fK|><uO42x#RŚmϺޡzˣ4:՜c,M9Ah-8t@{EEph~q"j. dc.7,Nm& -<"!"qu+83D_ 'ǵӴff5e!`{{%=5ZGcEYZwqȄ'$6Bo/)d/d_ `PxR|l<Weu*UpNHj"ؿe>oCANq:8 湰It:OX3 :*P<eg) ;d,2*<\\5�|Wq׹P%(N> 2_8u:tW]P�|Ԍ[pÒٕѴ1@Ў~i>S>tP|u<]q/?gTZ->__Mu3 8`e0eus}aキly% :nDs!*,fsPH(caStV|o{}쟎EE֎Wo#4^-K \Q,8_o r<`0(*qm"r,e %;�� �IDATR$K|3.eY'JU1wF͠rS$*<E:4T\TDSɖ붂mxpp0h)Z˨ uD\mZ-˂gXc7IRIWKXl\.JUX^w^fvqx^c:Y&s ߣyhJ~\泤0u(j_?*Xj;u9BЈF1dԉwJP"aV<zH�2[^;: &{qZVnH2[w˒'X5K8Ί"!7%3XNПŻ@I(52].*J鈓XCA)NP87~c?3Aɗ:}mŭ1e߷[mkS^`_ mL10lj,g$kmOBJGUYY`G~BTn@`sRhaO7oiڝxfhQPM٨)<6XM^|j|y]9ZsYD)Wyu3^j<ϳ~g =IA+2 <j OgU7E5Q$Tl<0ᦉavPp'rlѸ?JAI6YQ#ɥ ̚yYxVxnAwI`'5~gɶ2ECAI6?!ITa01/K5:d B@ń䚈Ѻ"NUUGH%R|z;ghf_g;kEjmjU3SWL:r;τǤ>1-38�mH)9V{m/Qmh<81"j51Ę|$%|~{ܽνkZ;3Q--\5N`0zC// BA%ѮWnT**("aaoL6feCˎpꮸu-M3v9"Px b0GBzy# !ƷѾ6vK U1FA Yu$ͬY.GKEqvu~W I['3MvC` c"dhv*gtIū'p?|A7㲰cP50Tb,5eVR^52}e٠q|:s G_&QK ViW~0f7;N˜iӊfEM.ai!Q /a9u3g SH0bBK":g7]!Zs%90쎌٭CE%LbEmLHFň^s 8Nt8a;%+U <& 8)qFYe:C2}C$픗1,]$eYV)0"`q~N!73W'<FϲGb` PvRanf>b _,~&=gV9fho6F[o'3`9;Q'14eѣdtfr}dcXM^WN֋OըTJ]5LSM0E%rS"Y'T,);lpNLJBN'L:R[]c,h*aIY!fNZןQty5xk(F<p5>.bioVI4q͢uh9"=_1̷o[Ù-J!,q2UP01]ۋP%|2H}tDHW_X0[r:3Mܦ9NdU{表nC#!/.LF܎-b$$+ )QEpAG"AjC"V(Gn  %CAuƂCۆ,9hGqdgy\. p8\.W0F"@/Bv_,OW"9Y[2wpT2p"`eSF/u  ٕ֝ e(@8gg|q;dNpXrC|^njw,"/OQ [|u.$\WIsV" ]Aʊ9BvP Թ?LB+t^;&cAie < %AOʤKEz:r*5 bf4CQ7OsZz/mpVA/GW {H'Bf'U$GAJiySrB31-Ngi)`:OeΛgiicD]AQ, I79+*;4nZcakQz#p?+9GGXjE7Eel>2l'3I07U sI0*<!Vd ғǹQ8 %9fҫtrBۨ3 ڪG7ƍcF4?\zFo\i (g<Dg;g!mpx-XI!pZ> ,!"0/ O ĭ|?ˑE6@w,KE=P eH)I$ʙ%[]  }㳪iZ6x@aKA82gմ1P-꩷@ף]Co yjm5N*pvbRL쥸JdPWoX^Ƽ^ժzn#eW*\.7==NQHnmIE1 + v.0//^e4E&qF. ;̆3@h|5,hiώh;n{ޖ߮ Xoo%c$ 5 n�^2̖]s玾hr2#|0}`%lc<)+,p58ʽ+[N7Q [_3*%yp- 85~sLoB2?7qV-̎si_ l+\Bj.,el BeQr T9gzW%`YgG*_v!H0k[!#{9" &? ZGMЩ:y0<[Zuf+-ꘒX:tυգ+~gͥ.q2!%t$t35'!tuvJ6mLI&-c8)p{?4S| O[ JcbnL͔GI0'<OSӗD )V9)2eAQdfeao|{iVo` ۀ   E?A3D/T1{IbM2RՏxeZ _jxp( UjR9tvE6'yXgJb e68i.)q+D\'[lgW B$Z$:EUu6$<j#kaCv{~tx@g]JW=K:Gq_򢤣p)e&;5G}d-Y(G}㙎�W:iD:et+Ya1B-)>I>G{>UUv.t(ExD7@O\].u~4!Ws&kYZsszPmK_aI5nJ̺x&W(T?g8%ȂK3Fd`j׻jKэi$!vVՃ|f=l  F,DEz w7ت(<>$1r5~ݼ៵z(솳=:t~ߙy3ʎ* 7BF7c]#+ A-ȩDƩ_x XVyM<nvZV]kvu~*fjgirqU3Nq u3m(</`p.џ尕iZ#5ΞXXC`jCVw@[\ [g%6Pںizlr/|M9.pJ!!H 9b sYVdz40I16, S`-` P1M##V̼ u.$D5L9#2F5FdeJ<N:rSg/#5#,sRJ2s8wU1sN)QXd>Y(粴2ǟ%h"5;K&,]sD(8;I%vFmo{glL+лrIwʌd5 JKw}YՙQؙ5KjńK=\dM >${2,[n;Q Iô·,WViy[xݣ|>|{/Xo8yAA4VgP3Q k\4͇#eFڬz<\$-؇%ŢzA[v.zRs>xTT17v/ i2nsf>wZufZJui@hd0MK42 3\SQ DVlpXLD=H$bXR)Jfc \.3fC/Q ۉ}I@7 . dg\KKFgHөNܡG\WNռ:sLm3F-/"ɒx΍oW5Ŧ :`Z"-ѱJ^_gWvX\ `n)Vzo) (gc<UL`71/7-2]0{5 Lxnh/qNA#$Bb-u0A558 lRTqV $H^īK˨?Y)}g<coIbW0kG*PTeXk$9N.Rqe0w1 PQ DK!}lۇq+_7u Wp0nGvgo |e&gl' e%xkH1"װX3%`j#Z%cbb\GyIƉt0@0@2>Etljp)qq1#lj%V!7M6C[2ڙ >XϤm[V e@*9N[{U.(d@w' 3<oڌI1;5#aQN_\R5@0e:$1R2Ԫ쭠xN?[8X :RTSNkB :=&`!MKU! B/]~;j~4CՇʎogLfu[]C {5հ%oq$*/pEUȇδߒ&B@*_get-/1(wu3zbVo T}#T6burd#s_J,Ʌ2(H:MDr~X4V7F,p1/_oLrp<_+J;Ә nӟUpWn9b ̂P>�_[( w.`O_pٛ,|f~oƝr{'K$*j D/ΙKe5r3{L%}ʎIQwݾ.|t˥[AL\n~K!5N?Gh_*?Hs7à2Ĺ)]W.\",cg «kx!X+\ ]GY3y/:PO4.RSi֙1[lL9g%݅ғ V+h5Sg(Id+-X8mtֈ"�LVpȪbx7p"NTEM:sO?wdeVU]չ{bLOaf р..FLVp5(k�b@QDra9t]]9~fSs֭s<3#ǖ`Hr&QuE?5R`�Kb(p(rT@JSPCO}@PԜxhQ8l w3DMa J8#Ht3&aakci Cgia SieJ‡^؞/+۩Q|dTO:E0NAeC,;rP3;ETÎKWBvRQJ; S찭>N}|ⱀ%ǫ J4 w Yk \ 7)!Xk9<v2Tb2=@.Ѹ-ϕ< ,?F~ֻ cR0dN^yRuvj@q{nE=^fx05"/E'3ޙ$!`FdjpUZ&YyD7("3 Z5e>n[޴wiiiΛ+ Gv$ f[g}cU?|p7Qw*G=\z2%9YT*%*LgYODq3mk8ѕaO#Y7>)WDjNG}}rMυr<l;xlͱdWr/W>9 gY̅yz1WYwtKb)<fD7?q+�}}h;zo�m|0x nq[4$FtY70Vf,Ҩhj1Npj_ TSDX5j=qwm jzxSc t[sYU,H)] y"F%E),c=w%D;Ja:|doú_x7^q$3}I>"]c}-[H96Hj(ST1aNLw3`, E\9HF[c(qFO+̈F5$Yq=ELI+hsD&i >Ȣe -cK),=NxE="p`qez)".;6L$NbiYf⬮"!x3hn4BUBJOQѸѿ|K_TkVZU^P$7"s2g̍qqƤ5%-24`eD/,S8WF2FP W`lTD5whؼR.[xGwV<\8g^׮?9{kZr '|#s3jk [| KxA+!^9K+^`QtlxxCnuG[]PQC`B`XX,V(2L6]1ŠdPEap8@SSSsss$ f9pmVc!XjA0UQGwUUԂ~2<<\9QYҢ={ɃK1Zшw̭,(e^xarEƷ7Ibre.s[2�o>ޚ=͎R2t_ej1l4wFfhSy!MMgS;5*`RpYWS>pBE0[q _1iIpt&FrM}/]XGq0Hw1;-!o7k!>G`�fN*(n&Ӵ 1$ }.&h[ɨ|~]sݑ>tW8d9�,yisN6sDژ(cUM̶05MTGƥ04EKo 2}4qҹSF$n anNFC$_,+I^ j#46fwә?MJ2 sNJ_LI'% mjfffEmLcc ]s'YV;H *#KT11K \ Qc[XѦ>v~^bk0�� �IDATe6O.ȿJ˭8_=g 5vZS [#h8$|H—t:4BXf +<m:zCpj,A:4nP(h,߂7:xl�|AYa>bd/;e ⾪]MRUп~GanbxrO`Rw|nǹw벹 -^_ʼn ]WS<<lxmf]狊:ś㼪5x.v;6qc7fx'K`( 7!lwAv]ٖK$"TR$^BV {LZr|>ڵk@2r{o~YRpoDTDRb S+D Md]r+zl}`ibgQ;{%)eU'mә^T-]Ge[_׷IVتq z >kc'*dG_peɨN?b0G7p;|g< ,68KcS{A^qW|. ]’C1Glmes1hL݂ez!y)CCYO-gF :P%"6KBU\4o㰓})Db7̾dM)yIN2'h(Vmm2ЙN=ueYF搇6vTw06G<N T?SNFV&غNqeF0݋pS9L` t0Vd-n "SÚZ Vp+VpNY.FG:7vY}V):q{HQ8AFs}+dk'Q}xN9#lSH=$ Zx6K*or#TK-'F*r̍'|j&ɍ𨕡oj=3$ q&yA7xƀYr.z*\mר.$iP ~*"+X{.&*wBB@tv7ը6_]W&y3ʡXfOYp*ӊ @s|Z ZVB7`V_y(k_ݾ]MgĚZ_g73ܺp[clùpNΉ"/s\B6&dvY73@oBDQtiTw"ޣY{{z&%䅋x<bV) .?AGij]ׅlWuV&% eI v&WJ523uXʙO%IJRf/Μb֫eu]WZ%YWj%<pq=/C +p;0 ;frג\ |K8~|4xFr*)t| r\bf)8G# pdI!(qJdeӼ"*}'[ȟ\,Xcnj qCFs2r s-h L'Io [)4='f. 2{cI:nf|r/6aj)'X8LRw3ĬmgZ1Mt /I제$}9¢w(u1HOƂd SsDpj(itIp:(O$F|pӽkx)LPT,EV#ug.*,(#ĩcYpe) ؟PB7!Au`!f!eUaT<]NILVn)*QycKLL'؁͠(qDMEmXghE?*$BI [;_;h샄;<6%Ӹ`%~6.A0QC*5i׫-&D,p}'}@KK}Gڦܕ*XgfyAs+m֯LND^<=҂!b̨p8LgXsKFWϱVf浪aտR1:-4)[&lN(7! {yd%T\^(g}ў{􂾐"y-|=q:@{y+J,fioζn9c ?CJ4 Ӎg퀿q/]q42n%~ OBS.ƕgE~[8a 1tX 4AVCznDSyXx,,Sif#dZ(}g:>)ZD+18 JdLO'v[:C^7;fBKvQtw{o/ZƉVgh'o9VE J*l3|dpO0q eVe1R3Dv(q4r0DI83*=8D"3&$(ZEsQ\S,ieQYy#{.IFqaV0 #Ki`a=²$+4ƉQ4F340$] } 4$'~ 7buQkg:.z7#+*'T+KU+-hHDt{ i6ޛ~eY+VtFnLA-sc#1YUP"`\e>V" W2ߝosB!}_o&uNJeݢ}e1#bԂj^xV4].4'%%4𦁊71*'Nm6fx g&)6B֬2`-|~m7u]BLXETPvCU( "Fw%fcRx<l6d <,7$zcٝ2zuӪ4]K>Ŭ$w"€ E7lwv3fWx,ne~p Xk@3| .\?W02#׬P>z< JVYWe?+X TX!o$vܪQozd yHΐ2P(6身 cn %(61#ӆ`3jUE 4"OB O5Ꮠct6G豠pem42A?ov^cU" m =Ȣ,H2R-SIS2aGV+,2C$SK8WsȂj*2ve)Z*1AAKБۘ8ª&f#e<XDyOȞik908aЗ~Nň u$J Bj(q*M$`~2uC+֒} |ddٯB2FC BMSeR"1hruX$(Ye2![ UֆVX֘ҰQ|&f+\b<t~}*2|W+Qyorޏi±ĊIVWԗ>}iSt<iPǑey>;GC!zbr0 keB]TlVͽu=|4klKR~U弚feOz0` @gԃKZ A91-S߶Rp8l�3[f<τgޤs=)"r:mrդ3 Π9 ?JDb$|ꉵ:6},7{+ mkw3PgIwv+y.cg4P1b@~%җߪpka0=:%RWYD|X9Ci PMe7 uCY\]&'3X@!7k߽_߾`K"(2.ΫA'9xquI6U$[cc#UVL(#tHN" A#39ff_F˛ezctLd/ǭ0ff{SͦGb;OpH&hhf&LiAR撄H4(}Q:#Ixp7#t V76&$ $!x)OL~$hhcM[UІIаC̮ 0=Jg ,e1e*k9Q `Y"=]S(aqEGVqqu-YCL 6imWYjxz_| 5ᩱ'E_ ~R~KtEw@'9>#]*gAT&F)TU4ma?@Ug;+n<_inl‡~2p$Xf\Jt$6ژd48vؖ('&9evE봍zYΟrƝg=x֎쐶KOK^ULwL-y7Wfl $ ]j31K\A ?Unș~^2�n8̫:ڲ M?]uS zZMj5YKނ\aQXf3#&܊{4y jqNx9sp>$A̶G45lK730$IB&ٗLV[63UD)kEx#lV~JƓϪGzHh ;|\%5g �ϫl:Q9Y{U{T) OOרG*8\tFHi/U.وfa4wk(EExˆLOMZ m3kFYd(se,9Q.UauqSq^榑ưq圪bRwpZVAR8WS]!e"qQdt& Z3zUSg/ffBjO5+<ª(Y}Lpac, ,aIy =Œd\$tAR{ٰN@rSXϾl RsR*.uQ9HC^wo<{ Ttn$hgpueK!6MFGmkql /h)zJ3cYxtK~k3!2bvљ4E2١R3xx9Cm,=IC^IE.Ѹ qخ8|Z22Z "OY dU;(}t!x0H\}(}Y,l6[BOɞ1O3Rz̍l{ 0uJWnيb4N}'0.*fpbǴ6+UI 0ߚJ$v"k4S›ùB^efBv՞.![H P4V@)�PdOr)bPnL} qz0}RV;zh}N+Ί}EK1EM><0y"]Dqa&D~1OTe2 +3/r9q_6.Ajlg*JtK|ZplP@?xuߺE{M*jta)iʊ%WzY3>Qt>%q̥>"Q;IAn5)1+,̉$Y~g"^e2J&ʗ\:C/i<n&9ӼQGn"X A`aOkR4p5xB~JmLLP}$Z!OcLnW7ÝʴzH`qm0Fὐg]ݰ]+rrNY+5'ض�fh,M ZF;71%{9d&nR3EKh8MH,E v-IK71kAˆ 읥i6 jb,M NEˆZPE #M 26mZ, J! 0n%i!.; �@qp#Y Jr*N@ϲ'F #tL8\l 75z$sxDbԼI |Ub.S,NF`h_~ !MíqHUv8 _f c&p^.g)%^׹ =Xcks)~SYK1R in[d:7&8͋&]%SbT\<YE2 0jڑ4j`Eqn08 Ez^nJ(p)g!o{b=zmڙX,(4E4EBV`L LvTUwƳ+祀"gocZU%Ut ͻ_xӎ!Is=b2zN"4E.nrdtg09-wu棽w:GS ~=vsa{i'BFS\uu9hp'VJ$:8EfEŐX퐳N*W%S }<$`{6hW C,-S׸ dO=i5^Jg g6yAc&qv@ WYY:1Zœ$�dF2q;jg gm]I01rߊy]Oq0�IZghvS,a Ĵm=r8tJ3ARi<W]6j%\6mLX٨v:Z@33̕qNӒ"!t*UG02d(3t$Qz9QƩpl ӽ<׿[ܹg`FC[ oY kǖoDm$xcڨ_yİ賏iL܍<NV r ҩH4+2QVea kФUm9*@:) A[fA`HI9-Q;GkV.pJ2Wi|2 o# /e[Rh7X"i EnUSzɠf4|(9{ž^0=Vcx6Ogw7m:KͲmVפx` Q2Dl^G08K}іZʴs8͗6 E̐!/8i/<t.y܅-MӊŢi.%T M 6e5^kd `0 |>AZ5\AQ.^UJufB&9Lk^5QĢC-/8bE<"S0GuCM'iMӤZ'JJ; M/ZqY*")c^@ݬ-0?كsVjfTycĻo^eYxX-<O=v: C 穷w3jok˰AB 5Σw'8\%3n#x FjL<QC0.1 apK&ɃuPjo],(>MƛM+.^V1'Nje 4К,?\ e"$YXbami rwLծ̹]%e jqz8L4*Kyb)!ctglO0';SlgpȂF##[:Lw kI*CdYP gwj50)ZY1Ҕ&',Dz9o M^0hGs[mC%61[fN!6Zdl vBҞ`u�<:SOw/Hj 7@D_[=xpزDe\efu9uT)Lx:逕IB%QzjԪ|ni Ob gk B?ԙZ˶2/ GuI ϵwW@n#8A\q= z՛G3rP( |>e'ybϛ>W3�� �IDATn[ef&}n!cPuT ͳͻ}#JRiC7-'z{CӷBQg}??P<ӲV"H8E`0x2陓6tzE:nT*ժ{ '^m)ZXSW:hsWRT/b^m m㴉pTeaU\ G^c¹3]ᷰF)!em߼Sbo3^%M>.7C~" *<˰ÎH8Sąۆuf,3Blu j2SLpNk8<iьhwm囔,]wĬ '3yv9rlfV!q&b\Y|fHfh R2Mt?9͕MR>eMBVGNRA^OPq+9j =6O&ٔ&lвQuS#R<ٳ}U*پ}+8Vu팷298ACs;OdMTK.g~̞{+3#qA9"6IZu0 w+ʡ; u}yˉ kv_͟)?K9.= eL 2Qd:nh'Y)]M )Uz1Ϛ"0J)~\ IA]US9F ]Z p_ ;3ܯd.$ߞ[{u1w?oy+/mV{*ΊwZ|qD1tLJzi*V_zzxe/}Ж/oT^kZO4fDP\y\i RnئM.KL0{W-(k꓌ٷ3D`a="ڪ.ҵh4xfffbP8mJaxfLU՝yW}-ym3Gnq/l)<OET(ђ8xE.bjمn'=:o$j].e~R=vݲ,b10|yYwc/3lq>`;a\O~Slh->tFW;G%VH| ] -:_RPFKX8U>X2a?5.V2ŋSXZNQ+#G '(,_g@c|4^HvlmG-3M:Q4<9r,_1,v Y1<$}#i^^ 9\*= |PcQ9;E{9",]Ή$!D-s\8_ĖC]3M M@M APC[FB-L`-Qeqڽ $p/{9#ڨ;6 uVh_$ޭ4FE { c dH<eoc shi^ep԰hnf&A`4.T9o .!GzZO_~Α|<eM8*'!ʧD4@'|JcI(84*:O!2Y<i~m7tBKܯrceN}P{:asOO7hAx?Z.J"�ߒnIs(\y*m3r@5(< l0iGA=O=\-Ǯhw-Ɖ՛ZzWzPVG/5p%˲ypR,t:/tGUUE'I]W3~%T IT/< QEPlI<bo슛$F꼞Vf*Vu{iكgP-e ty)Y$4gMສ'u_8݃G ſ]XE2a~T(1&cEhP01 Sr/=' Q*J=DȏVHlVpCyne:1�*(:ANAƏa>x(qTC:qlM2<:A̓8 'g뜐0P * ]Ly֨AeO?%?Ǩ)8X%vچ/Ba {\x3Gh4XXd Ute )JLn⻈5Y\O+N"%7FPb$EYrx=䋸%/g'! $F0'gXw�"4V&i RЦh�頼SғְY33o"89":ߧU¹S8%aL9Y�|g)8Ff Xxs$L|ԃ\4=B }1NJY,jK9|i &%BU_NJ.VSlX~�4ll2 ϩ&k"YsrmvLrK!)Nfc2]+5FDT8 2eG4*,6- Y!*251<մ=Ç|C:߀a3X""]siB[a^hktړ>JMHG*JD]0E1\Uߢ'"j;TyCWf+VEMrJIq)nNyjMEEˊ~U'xͲwIfoɼaLlbzh7 pg7Z$Q`}g<QAf:%BbZFWKZG{$X Tbk(sH75Lh&⚫za[dI8;ΨjQnq+` u.Agz8T]a ʹxh^(Ϡ_%R!NюfFc`@);wIjrk3e0#K\�u:I:Տ~ζJ2daEES WeЎ=tE2b` m$ʤL&HI)L<uWY.+}b;M�a0y<iDG<ª̬".b` k#1 j�i/�FrS`̂!oHLIH^'+dc4!,);@#2B0bx⡮]MJ̦9"5 RӋau?K'i=ΪeU"`+Ԫ8=b:9rgj'ۄƢs]) 7k4Ktj? Ge:a$f{`[ ޣb\y I¡'n<aJ# BP#Q` ΁KQBWC l][A"/'Z<<g=+[_?3 MՋ\SJ::BZwT*]UUJ1<y""N Cx<mp{<a!zipȫYsF\.lD: ^ç~M7!MH͵b崿<\UTr\:N&t:˙YY=‘KFWd _(:m x⍘7o�zy#!SQu]IZcKEL`%϶gή~x_ŮT~#:|Zf*"xھOrgθ%r>g! ۪D2=2(DK|n,2:?W'Aʴ||U\VC*R8,yC#^d5*u{‡W/a5Mv~.J<w)V.̡c \s,jeB:s2 gYJi| '%;ɲIZ-2zia1LR4=>' % %Dr0 uRzK 6&ҟ' xw1] ]G(Ul>X&#!q,6&r0}E\eNJ6ٴ#ZQ=lG"ljg$sxrM&k(8/#DaoD/♦G#*ez޵ZzG"17Nc\cc;Nbbaظ 6mνQ'{ٙg{+m˔3o@h6*cC *ZG>u{OqaIP7GQ稳Q,0 ^oIb&ad4|=T&H@6vV:/njWG?hN~:2>ջcj|Fa;Լzc뾶N6`)ֿk;2̹FV\q_EJX(ñ)wN"! ܝ5h1$HVֱN=<P*r92 C,oZNUXs`<񈥊inrb((TحX_%jO;Xêu,؊_`_*O4mF%iRm?Zu.bXuhKլR1A$)џh})T۶X̻ )H>I� x簽Xou@ϖ! _>GTU-3Nu,^7?j$b} 0nd>_+٣*?l+ӣҫe#vqhN S6&ɘ;~"]4O ɋsAL/rw9k'PGġPN^Pn`,fyTs{6p,HIRŴSuQtsǑ?~صE\rC/C戀!_Eme*D6&;#'LCT?NeKT8Ŋ]\ 4-a2Fu~!up?Ҽ9_OS<1䊸dy%FJuZNY"cةx]ßT*+N9cXQBtP$]aABK>Ų50~17Ρ1TIəy"I?2Z�~HlO>1Ƌ,cLl;ANe>p?ܑ')tH$;&?Gs:*-w626OK<[La$Mw[{4NCn4qLDv~nؠ$QobNs#pO7ߖ_ (ʚ[u.n`7[~ׂ4cI i)XDўZnљuVl.B!1HdR̮4Ms!7⚬ɛ_釛D_\ ٨C=»n(2%{!D-UX~KR2~b1նjdUVV. 򂠃deC* zdY\Zz缻{맶3vKMDXG6K'z]'"ZSdhm˱)(kFŻ*s?yDi~ẏM�Wv~+>Oam2!zaJx$d"lK~XRŮ1olL1ZJ<A nsFF&YS:/v0{+({+4xs٩tdGamHrﺹȟɼb +|d&IAoSj_0LSUYu[O@Qm!Rc^HKPUEҲgS z3451"TA9=Y$=M4YSGASGzHa 2(:,MJJӴ2;LEIN L8yzv#M@ ,L䙈m ?p2Zvѽ)u0QAp >:YE]S4==<Tɕ Æ4h/M7Xfi*/U>33aiV&bMy<K%&ulFQ&$qA6 vwyo!aL_<ov8 МW~ "< _}%쾶w/3`'L: 1KOo֞G{v;xza,p+&Łj h^%3#qS4jIU}ufS7ATl`0@ jPVi2f? ->I5펹mYY%o'ZgY @ -zKR&Һ*}ֺY]Zz oѡ-wGNdtpKR2b-t^[9W]U[ΦT;gR]%SՠwZ%he%T{ftom;^X)\ZGcEv^L0G{ɣG(y3Gpx U0 _%~ &BdD;)1`f'79$vX"Sl!;K,1 WadEM%Byu2o%s<Q,vyC cA'-^^� 2'T8^|]xuD!॒$x6&"V94?@Dc~?h#Ɣ fEE+I; &ftqNJ2y<NJ9|r,o"1夬`q/aDG)H*()ᚤ1FM s1d$S~?;vw4khfFƜuBbt6F,D$ ^ KTm0xd H;}y[/+n;Ѡ273`̒7~ƔMHxYsAR&Q62/$› D:1 TeyD#/_>-G񒶣RB]w9 e%Es8\f={(8-[t][NJbeO.C?/|`� ')"jί']-1.>^ւZ9P|ӑ<o!Bܼ|F#'''EB>pYDR"3tcZ؍Zp :/Z̠3CWNU*!+WH$ ՈL&hYkM`)|EIv' S }qefsV#2jEz6Llݕpcdby"r:RT,VX(zYBAB;KX+[1]Y�h:[̭_=?z>ߜ|@SCá#wY~hMYꂃqx*2 /~Zx`;>_* >30g YHDdޯI![U>EY~ 8 MNg釛|&=dps 8&M&$O}J~UJ^T.QUylx+i 1>?CDcA:A9)&ufeH4(~"6JDÓ [_wتRgKle0듄4WQ}d ѵ(NJB*U?'!z8,O8ʣtqzh!N )Gvf&bo,~2%n *UM0N|-G3sxaɘqU㟾:;L៥J}e3Z@~bt1+j 8et׍Nr Nz]Mmh}׊ؒ$-W6 PNhWʿIbK+ez`5 ND,5';_Ph 4N;aEo`=Ͼ*o^RQKp_B6 .֨oerZ_TtTqP8%X(,ITU-Jg}3 �� �IDAT.fZ9 L%ιGbhD7LeU;:mpDwD5s5q"lY(;1$ Ţ^™\C,Ro(b%XAuUk$4[֚[T* uJ'Ζa1=^!.ƈ[JҾkԺUMǠcIJD%PbT ϞUBYG n}SMtjZ Sd=eOzk0ek}mnAl$ ;I#*kJ[i?z:[m`0 6!f?6MDg 𤸲&|_셛]lw0nbxcߚG*uQ:I,+a>hl}dC8;F726M}k)LBoWʴ2$Tƴ,+Ӝ(J$4:R4HUTVp.F&+w9{$'XÛ8ay<K8 K8H,=*;Dv^`/W d8k {";Mhc2@7\ʋv*1Y꠼IBquRyIi-Gԟb=o'ԇ+o?017/eIzx l0p |dKN1OvFIxݝ_%g_|u}ka`x{to!ZK% GWYyvE% VM8&"p%i|.VXqc?|t3f xƿ1Xm7q2_T(k_ W(Lg#)?)5xH$a&XS g^\0Kn1AWď/X-"#'dӁ&gܩz- cl6+ܛX('t:mgZJTV2;J۔̱F6mZn=jV`D]+tpH&vj. ֚edIJjL=BCU{+nY>7MS9\d :_TV~g%3|5_Xv+2ƕvHZGQq־&)4p-B(I1&.w?ɶlK&n7~qcCsV*8tN 1)6O[mo!MS/eo`3]c+쇰&x�x>9b64l{Gr< A 1mKܢТ]x<.N~;ѡP4Xĕ$<u\lBqA k[^.?k9zWU=V Np)ϰCBb9F¬c.n&NB$Or Cl aO6yeH_qv&橛I�m fJu&n :JB=Z|t6@쏞u#ɎQۭ0e{Mm$8M| %vN$`OSjA?J]GOpq[&7<~=o&-vK'J$7R m<[P'$1r#liPxrS -Pt*A682CI㏠Ke C>**aY'a 7|}g ,8 UAnn0tVdžx# NfiΛ"\`0jDFEǝNg$|BbnnP(,Ns~c/W:N[¶S4[hGiu0hErエk�աnnMp~L^LpC|5\q\"{ 0)\EЪ_8+25j,5[]qTnwgg8%L:'·ggg3ŌH -9H #jzrm+?rRQÊw7Ǻwܹ(eXN.>,Jp8vU\PwAf= �&&[rj|캱ًg5;[.U4Mל-_['ˣ!?3ЬwFev |VCfyBlx$/Qh*5xZvԫ|4!f0*&G6HLс#m sV=N'T./_9 _)ESʸ=TReCtds&D*HD^͈3I@)H#Eq)Ɖ,epH33t01E=-.Y]RalR� J8 xx3Hp(NJ34L(E] ъ9"e^r .T>he~tqpw2+c֔顠kfhuQLtPiaGNA/c|5nk8&cبST}Gs;kkٵ'Y ]fipgTy~fIgq 8+1?%"`}gnWoҿ}gA20wr_72i1[Ė*2My9Q$/ +*MGgNBfLXaIMve٪`Yb+P%f$GLQ<+s]]zݽe77~gVx z |&x%8R͚]MLLٳ|DH;l%[?^?Xι> svȮm u;1)% \B l[bi^nkkkmmZvt4x#0iXtOբZ7N855sJ%!#d^o8ka]LBLJl6fמz#{4V"%iBW+.n_t%2yAV?Rd Ƭ!d>᰸ePh80J+;ԝrZhnEnw%aL)TfLw}PKW'; jSgayŔ'RpZ0QL[[gew3_^ø?_:Ga[YKǮz͗\P #8;h|a64ߖLaBN4;k :U^6UN+*FLBn5H*KUFaIClgf%&'<fY}Sjqd|N]^v:E0O @0p)I>DxCdU&[=s>wS]LP$>J&?N;r mr:: tP s xtThHÈY &$An52 Ȗqq6_<Uqi؄rowRV*8dF+?[3܈3EarNsQBHF5Pp9ї0!dEuteMRyKo1_HpELupAν>j0[x}N<ddI\桳' J*3UE1(Kh2I SFU9B/s̤M)z*y8V!AQcUeoQ8 A!膇a2A=p/�I&/LJuUm3fM -\5=M577 %V {<ap ՙ$B@\.4U5*>D$�,~bx#"]|>Q48ϸuĵ'vu}Ak+a[�.^&&f{bO4DeY$0bJB4�-ʹH/۰ܭ\PUUQZS{,%!Е!6X0oUL,NZ~ ^ˢ _|zհUĿ`f>ֿX/08VY).eUo4/AW42Kd&m3"Te"NP6K J9ϫ :.sUBD=t՝\Sc$Ph2B\rU^ROdU0=eěK4D+TƹAA؆#g D֓t 1=NoHR_Q? fKآUst Y}XIZU'"25 IicR6NIV1F"躻|?M$a$41%HJh q<ǎƅ $xn B&c88 ũFfghrQP- 2!a'#+6ls/]NS,ƻ#7N y * piw3L?ڧLFL6vnpZ e;aH`mo6R$N'5diQA*pϙ||JB+lW"jЩ9 F -NH+an#a2h |xDe5ېiTԊkxQLDnIY�@ /j}>Gb2^xZs?t\h 1F*ΝK";<O8.x PGvqAaBEGmaCjgNN ,vvVV,D|P([+t(N~b,M&DB,sf9<,˵+Ҟa[0ZwM2L2B/GK<c4xɋ~4T:"w"ߟ 1̠wp+|':O< I`ɏlTf3d +2 iqEI·  HB: &LVjh4"{ >At;phRX˙cJ�%a&̳dSWp{1Y-1~?ۇfx,# Nel&{GY-*% (<E6*%>. alhw0 M>MAy:<Ff战H4:) au,}Y42I٩p1 $HJ$bЮc^8x\mh( gO_qmbf-)ՌpVqHsDfi@`r+{`*M>+w�5@j٩ο6!Ѧsf"Wl˔ʄЫ<IDJ[d<M 'mlp Zq[6H l:eqKIbC <#&=%&n [ew5R]odSp0:`<s!nrNb1Y09ߔskN y'ߟOv'-H;ZȲq ByvAխhTi!* BU46y-Cu؊Zf+[Zܹ"ŊXqFdI9-Ap\G6%y"4(S\|^�,_QHxԂ`tVե+Pu\%*ڌj$eoQD"`Pk,-x|S.S6UmPe w*V&d�lUQĤڨZǜBU.T(W)A/)x=tgt$ p7\33S^[%c*L1[eN%2r&)ڑ4*ܓ�-PhN6x<oMTU[咝 T;J ;6_6v1ct]x}EO? s-Ylㄗ1u5Oq½$u]k8Gd {եq:L&fG虥qgO*R*؃5M NI<.4 S $UEM6ĭL戤x4-^rr3ژ,2L{ܗE %NJq[.K3M1F1:)aMByM:IHb:DZORv@LwS<x M:r9HMn(c) Ix6N$cS<_QRBIm8U$d5^ak%U&UV vXmZ !kD  %}wS _;$k2�;:S*X=O71:k/Ho_0e_~rGw=waQX.#r,u-tzlʹıZkDd̳uT e;7\`0(4~,}B]Ri٬TJѐt:\*=%$j-"YX3L!UlpHv .-3^ `bU(6V6ʹ\.]Ўkvuw?}ouj4Ylbu2BY &1udYt wа +m~ 2+^^j1$s_p%�G%N�rY8g\؝*,ƥ/ʔLLrDuCڤNaJb1$Z|e^-2L"k+]Ȩ6w}UWIawIV w;YJNv9գ8l ؃9Aou<]ۘ9<O k9Var.99L8fξ.1={:N)c*~QZO[캢#V^Փ\ʠ\l4A;*=NJ}0ghz߹Þ5[ZiGQհq!LR7#EP`dҴC&,0~as}\KI9)((B)Liz)b?Kk=GgirQS\HhMmоL}i$ $ncF3Nc &-&]v)`RaI`9liL٠J' UZ0`NIsQìA 8< >X OKvd6ycGcORvN2p <u6a;,fW /!1]MSjQh>0<,+JmFT'ʗb(T, q"MNNNOOf]>3a.v{t=G3+3XuW|ZyKTX\'C:LB80 eOص\2c,Ö&Rֈ`$×~<*WeMM@|,ʭyn;C`2ն,ؿN}5љ1zEt&7N:+frC$,nz^1erDV:y!kgb,(/LAq(SCI-nز5h6Y^j듮is{k@� �xy<&Y/"W,3:(\ ɼ $Qiёb202N$]&љCpݞ_>IՄ(&iW)*dz1D@SsRu!p@8J$m2f'c *"J?iHʄ4$!,EAIi 9/I]e w0"YYa.I(@+œARi /9ZMT%sBMAƈ,Q&Rp+SrGG3iZngF,>,6&爸)HW $mqQq03:Mf54+L͐*7>A<!&z.duuOKƫV^Xa)h $Lu .Ku 2738 <@NNhy$bF3 /4 T 0 .;wpeAqćf m[gnyb6u3Y 'Z?8Y['982 b[LYWKt9J�� �IDATiVGkUQeI%}v vEf֨\jÍH'tZ/Ep\.'"lm8L<h킕dHzU`"%(wDKvF\-BgX3#wb p82H$";Ύ b-BEE Xc[v-y`ݮ_.vݵpųLkSx5]<׻Y4~2ӳ0 a|vR"aBeηT\!a3 !\6xm,790?˴6UxN3l�':s + > ˂x+(EKҩ3a3Vv=sfk_E Q!\S!ct�nMZ %rDOqIg+*:N O'#T8p!g]>=Krl9T ;#Dr&QxC2^pSp Qc|{G1>LjkJ8#M@A$]'"'S5K`ef?Do{?ℝJ3QyՏJe/Eb̽s6ر <md%o塇xD,ӱ7QvvZ;R<\,[%R]dA;SNOhVq'thpAm<gX hr(&p/l[8GpK- 'ŀߘءQO"alMKؿ'a50 kM7CT®Uj9Rʙՙ7(Ҷ=r'WŃsARCֱRв{=ՅBdA1Zm\x<xp϶ŝ#wYw:+ٌ<VNZ LlVpTD"aU"kvo^zwjwD+tCtro@{-MAh|Y3UUEVܒ8RU5 |jb赊^nPxƇnym^w15Zgʲ|tQ6eW]"W]Dm' /!X>p@jCZ \:u.1ܭhxdpˠعAg#1H5KT'0ĭ&6٤!I 0%mb^"y.!26*Jm<�j963`2])=2[ PtN? FtMwggiK3u1:T3fIMRMyymh=m:Q>|0%w|l!6a]33  s IBAR849:J9'%Y1:ɪ~\{|⽫磭LM!v%JKT' ^HP 371PŖ&xIB<F5ctYŦU\6s]7> x|,rF%G'Ck B*|*\[9~fs0<V2ڒ-e4A$E(v"Z]lAc3O(_K: &"'%8;QërLwT֙H&wKO5Y /`ܯpO#&oiCN~nWbo %\wx=410!% p y<W7/͎_ Du%\'},*O(HZQWjƪ,$ItȺ -os]go8;yds"Ԧ5X B46yA{}HQֈ@΃/�[k*sVJD#~� u]+K5Um&�grlDFf"533 #c˜\'''gffAՕH6MxX�kC.|`+=b<G Bh0$Zi.h-|AR"v=˝߽1\z|)JB+x8[+93m-Ů/[j(],ƍ0J\!5M+} d*&P`R[Шsʮ.jd*ԛM /1Ey&}xJOpezT)0,)Ӟ,I*銯?~E1@}yvVG.MFWY縗Dt v rE)ZYl&T[g {/K2zxóCW M\2d4c)(4'v+{xɟeY2’�M&XFv*-DFE %\ 2aASlI +Sq"/cT\a.B|4A'<B+d'i:?.h5qQcގvSL@٤ C4Ln!6 m`V3$E[ ^6N@f<x+p 2՜KiV_FuKup[IHCAIfnDI g<Ub *󎳤n}v=''f`2 ((UWŰ*A@XP1$ 30Äa:xs?,o1u{sA/| l+NByq(Ԧh8sA`T+TR|u }'l2�8WA5-;G|@<8LWCCCo=dbH$DԦ1o\I <NB}yq$2DL1c9_1;"v7/ͤ0!]fr~+-s.p&WL4]"+g4,jM;ө3|T0K.`LޕY|JBCD$ &KLP̺M6L$[1Kܲ]ߵ77Eߋ&)ֳ0~b@FP=||py9=M{+=l0rwq38yoW [DbZ 6M/ѣkVz#޷U1uuUe|ҩgJi,_f})g 2nK\lĔ%nEHg$sxy9dCѦ HjLAz#y6H(I|ʃ%͜*VMSE{_I�tX;Ŭkʟx͓*'G )`ICX;{3DU0ጰ=d52Re<6yY\*'{r|3_;ʡj񅆎֤*IɅ¬\=],+e^G֑Gӑ˙ aW"T0#Q{ L_ '&vRpRH 0 ndt4p"[ARhb@ܤD!<Tm#ԧp J$v#V Q;&FɪxdntS?}֏FUH;6HqDqDY 24ؐœvz0hQ醇%N#qE?ڈEaON(Yde6Q ԏBA ^q ' d.^Sn^p 4 l٠Nc N9X2dYe[ ?b#I2 y[-- my3b 㟀2nb͞bγf+lAG)(\}Zw^rУ%.N fϋh6D$*6 RS%I:kzR (f�5 MbJ�}YӔ2/X$W{E2q\C$˲6c΁La2[(٤t^0 9W|ww;dU63G1MA0s̱@ŜƉ7Ώg8NS"Ǘ{.Yu*ϸkx2 /C$|<6ů2{9:7 _Poa+آ[i2o aHg(3xEe ӥ$fO`)ӱxdf`|* 06?_p55$u*p S7}VX)S¯چEME.`bA,UeEOv,eLj8i}_ ճ;{p++?ӑ~"]øUN42!<' E )|Ӹ^Zha/0ǩD+1(e^8; �)*+n` !2<%#yIJaFv .,WC9J<zr9CR5_$r'z y3扆)a%{gRYU`\9~\s E#ɯfTUԇ(HI4*l 5…%,''KMT~4"nH>دa- :;'�?Mp 7)BNrAx'VC_ vHdrnn.l~%bcaa" , F1&2[- exYo=E}5M]vH2D)<t:%UW=aoS+׾bUkm;9*v\$&P"fff-@ X,&jw,HW|ѱ 1eGiɵmO٣#W<yR)oi_)A\X=&`xUM:?<-Z<OyyyyyP0PO(4v]w O݊?y8�phsvf`Ln8 ?Q_Xi3 .P"+ŴƥXcyƳ:*_QOE#Oċ=y&33UQ.omae}[wxw2ykKo'\ rruY$ }.@ Zqj$ ߔs11J p Fi.` 蛮/ Y5mwORu·Q6@zOR%xݴk(wQ YQCէc&"pW3'&|~˘M#$aHa-!R<)i\nRY) ј!p[8Az[PC/lבUöZ96ȒI*GWdj{Xtq3sjcFs/G%6-]7rr{681nmޒ>|<,\OR4qQF)kcX7LS2ȿ|a (#ynq*iPÂ]PG<cpN0&#9$#8Ol8(M ?}8 fI|Vt#N>L[8�'?_73QKVY-W{嚥X)MLĂ}]1sj+ʋI}L40pހ-fyNGԱs%;%'JBD8fϙmY--(#~7I4=;,sб;P*{C⩛k6MUUQl �jO97S)ǽʠQ3&l鴘ù\byΫ:+W1}}=nw;x%I2B1 _Nbͅe1N|dYNT$v޴06ﲘ-JWN4\13>>pr:$oK7:#!'}jd XZ7R\Pj<Jh+Гy ʰՊ4BʕUb\W+Viˎo>Ѧ'<C7gXyꝇw/w >zP6_4 3|q~Z2ڏl(+T<uȹsx(˻03k% ^t{D+IT1OusZKgKETǨ혧4HXŒűk鴠 1)*؄\h"IcԮp$UBia%H&6 Jj[͡(AN2# b Su'xzhS4a:38>b>9Mhj_ki濜:(3:+:cFƝϫwZ=\yf54%St $̳^n.p5#r6+CάA>/UZ.,}ش?0nIlҘ:! ePB._Ƈoq=-V͑ &{~ eY;vABH̎-۟n/ [o{;$?7~[1X4�x( J1QraC;3{jV}lۘEԿT_zǷvhz=G/XS6 ",QS&M*^h{m\̻*?S|&j"gv M+ YtY_@"~KJqLq)w] x߾͟l*ؾӊx YC�yLWs:@ P^^x֮]+Ąi)%-LagN omb=xΫ;~p҂ϥZ75:?:8X!=a ev}Z;k+.֏_2I2:(4|N$=0GBLO 'qh>l9Khh)n4HsJFƤ9~vMˁ~zzUK42z)`pʼ䧢]B21H.Vi4Ǩs`E1Nmbw_<j&fcQMI*ZԖV3!%2+/^?,K" vRcm(hݴ[)FGP&rjw> Ѧ&\J_7ATH/4ylJӓT"G%6l`zMR$/mPEU8+dFkq*AI?!2Af ]1>ܧ5 x^3Qyt w);IS$t$'mi*Hۺg9 2?9duja�#29|stê0 KX -g J ?UO(\ $ȃYx ΋'_Ua-_eă2+t^~B[F5v. zX)~-aryGg :]rb6BjR KWt"jst(WidHu/)e-aC1Fɵzܱf̊-v}AN Ę^4x^xs\bt_gro'$iC1_2izDCbь/ӿ$RRujKKl` +]% m6[&I&Il̩9+^g tV+$j.yCgǏ:C^,Hk ŘY6#C1 ?/hBw^,EWTqCFw_grcP*wV| Ps\gLL9)iKJ,< g\,p3 U,=5Ħ(Q<Uo᨟i׷>kw?W?}Eo"r :h(X y l!Qh^rB M!rاЉQ&aMz! 5Uļ$*5'vӾ*Dm.94;?e,s^bYLr؅�kT3V a%!YB$L0HXFi"#A9!榨TЦdC%],>J$c_(Е9B!C婰:N[p2Β4a9*�n/-bݜ 6>];oNb1œc{TDFeD,q3Q^3O y \0 !?K fa+\ p{0Yy^AXRVphx$҅=ꟳ3 dr׸Lp_a sA nps;9|K{o:vAѶM3䙓qO/;./?~n�� �IDAT:L"RVNhF"3YaިwKƶɯȓ'M?Նat{vkWޚ[$+; N3sJcPЀX6,Ls%3SJ7['$[XD`V$-WZ;.{i`2M>Qz5]5;>Pzj-6(~ U@/^G*$illLD""ucc>Oc>�#GEoy֌c5Y䂫 r!= q>iӘC#*!3f<daA 8t ia2m01(eւ:p -0sCHǘ7]>MYZTU"kc#Ww<nߪ~<Fc72|d vijf7НTIϡ_CHCLd]ȂF)Gkz9'J PF*h\Jɍ N#Ly#n H(xI$PcA$+NނjA MJ,hTyID"ap"J! Ic=HN2nR9ox̿p4;;&PpJ Ŋr.dG'9:n\.#-e0rO4;sc@>8v M&cQpHęV"`x%GD /e ZB)! ci%` *eK)6tC)}P�*+l!n񛥌 @�4Nk%V8`/<)?7 x �@cr\QO3mXԷg쓧L{e{(yQM?*c$:LY07{w1-j>ֿX_~|ϸ'Xl+gv D͢�110&`Za8gW#abĻ u / Y�3MJ2onu{mI۲GKs^[e̷iMH%uiZxyxZ:se) XBi^:1Y!*ke*Q\`0%,zoPD"DDL;Xc-&[.;qى?T&SJskO:6c [^uv [ LT( l:#:#YMWtA%A ͲT8} 2` !n1ONfc ).`S ?{؟|6yƫێFΏK1^s9$FO7DCY\D@1ú:vYɶ̞!Ga%/6@ә|Ov l;_nNd(utR'Ag3>,2f˙Hqc4J!EZ(!2IU34O&R38dBuM aXM{hR1k:у 2kv>p 4Q* t8�Y/ZZqy=Ru~~˞حdآlNK̹ Ջ ΎQӯֹMM)9[GJsC~2g8J#*5VDfgZ xOt~ihpJ\6-|MeL>~D/VC[uC8mCpvr/\i ܭ~Fԙ:O -]v/�ceY$@pl)FʂTw8 9<b EQtE3km77yGm茟6^pm yӴ&,9$$K!oYS, cC[b5)Xef0MO'74G^iffJ,fp&Aw&84!~1-P%$Wؕ"dCي%qݡ;U)BI.pW)(=,V]<-KUW:%AuǮ?(v9oSʴC]*]O+V‚n?/q{>sa{|Xӟ\a4И"%+,:o#ˬͱOb,/\"�]p@_25 ,mTJk(TU^)KS%#e awr|JgnQ?<Aǧɏ\oHt q\"3zU^= { 908Y .HOD%LBh/R2C4 >Ca,J{i).e&J:^Q63)EWZ)a% 5/Y ;fq*cO 5\?GY]JaJ"sثE-99+8;KYL#CY={S0b4mU=Ee,SʹpΡQ#IBm(esU7?~9. Q#ҖvÉsdZ˭vb vK<&sJjswSfhV)4x3LcʹOpo 1^bd5F4pW*Y+`lps85"5w5)>n*regȼP AnإPUpl#2Ĵ>el9EO= W0T�\ o(r%Sa:eJ9%k1.x<.V Cf|UU;kifXCucTejc>YlyER%muD"`Pqb-$6\n(&IMz1pnmп9PHC5 .t&@h tU\Ᾰ XNC[E`K2]Sô0v&W`"˧[nNfy&[u\xuo8-2=P +V){$҉I[7,(\S"p,{I-l+*7v>ZFg ۚ>C1iyejj~tr\j8+_ڻ3R %1:Y%z9�t(B{Y ,=5*'|1b2:18*QSM23 ўfN#':KSRۀ~UƦyu| Khv)3!ΙAqZ*i;uTɏl!u&qJ \&Bhy<m/g6KY"OSxs6 T zH9( sOfofxMIotꮾ*T;$"B ز8dBs9 :r;9B 5Ēc,cu%2!V($*heu #aAgi#Jݎs -bGF}hWIPfC]BI6Adn2uύߞ+97p)=sۦVRU40+l0c|Tf[t WX,ό9d9V`-y&tG$f<8t4Y%<r2!XȜ#Gn .6+a `9^P Ts+ڲΡgt`=TA9`'PݻwZV;Wk.I~ņ]{[ķlLXC,].;^V{>p@4;fFmi[RErL׌bS|x2uaBpHksR&Q7eyGaM=嘧8]-MP~ZQ1LF6D#k'=NK J(P�R 3u+D84^xMMSo|K^\R{k[Weݞmf5"#~`i|,dJq>[!סá3Rj5VFi~)Hk$4+ͭ9gzτ`neD9O@@'Ӊx?9O*4ɫp>†Ry*E\,SV XudA(qИ#t#섇dVqF…]a4 Y~2ku>;mxuֆ c#k8 fJu-PVI"I4(+8LcWL.kLвC0E6]ԅlWʄ ZZ~jGvJm]}/LhǨog|z;wZƖs,1 a$3I\8`#?Dc[93*d(u*\P7H8;2FV?qt(qb%Q.+Q$p&ɺHW2=+t96ƃ'<}gP*~Km?\ՀwFw2VTf�y#) 4m[<Ź* +N-˾,]`   G5c!PqoLA)<�AxQc&]EOcQd&@i1Z /Oa!Phy |b ea?p86yb"tD{ev`L@nr B麹.'CO#YҾRɆ%Ob3."[cÃuSM[&rɰ6)+XD-krvDq>,1ȊrAPOJ I[E$iLm*~`쌱l0 ;+Yfͯ7d#x4߲[CG,߲)͚ߕ'0rHsMřU nu}lɪdXϳ9\<-{tSgy> 2+x`,ӮA`v w)F=1RiyR 50;@dSWJteSxH(lLsU-b4k18ӥ$&4F68n~**𬡷S(9O«ׁ 82],+gf * -0F 㚦| 4"H>Lj'lDZg})Dz[u~{*tN΂.(n})}KƂ!%&"TTh_ *I/8ɏ&*?إ_.*폗NjBg$G3=$k Ǩ 4>=|M!J%m]s4Gq#Q"|Ny ^ޞߕ y{89'yTYXS"ӜS͚KHXT?�;tUX>IItV3! uבT9G_4>.Тyp.< PI,<9cp)<H8ݷa=a�4a[Ϋ:Oթna u<[ΊD/? u^v<UoTY5`bfض8wfcrg pWW=nSK!>RPFą PĂCPh/gv,U~ڜ[,t:jx<!�bXܻh &G"ݗwWh|ѯ\$Y<ѣ7 tesR.xcM?T<, ֿ\&_Lb-&QXނՐQ›: l/q쐊rTg+|5Eg#k˴Kԗqsw7 A-�|Uzrd=**iF+Ya|= 2Hq푮;}eJl$Z C8f 6O;UlU:YzttOc yvsh&q%1| /% q#sn;)vY1({8~}9=,?׻i2].H*<qng{/ͶӰ� )  N7]l^-\n'7O+li{sx~nc3_/=w蚘YݥQyy)}u]Hc/#㬆%őҠ;Rj\a{:%Pi<]9}?h٧κY$;H-i)+er/R|Tg@Opi8,k[ђ\B˂ >6'|'ʤU( #pL$$�jvf5st_%)t; p`aVXyh3!Q7*p!60Ӌ'JO5=j zl&X4{-,@j @A|\C2l)?*1alPh/[0 'SÌuoӯROia9T+NWũ]S\&.xzݢ;nnLybK2=k6.$;U?^;"y.KTj]-Us1yAYR8դXQnߚx8(nuϿ /.1mvd*UK]ExA*O…PDE5m!IT&5r< sw�g#-[gi)Q':QЬ*Ѡul>UKLtCk"K}$HRVFʘ(з9J:Ҹi*DfdʹG\ I,[�4t*zІp%(I|II,]FW&Q~R2G={u=+~P#Rleg`@2D|x~bq|Tn` Qc_MD[8Ygy'-N2*Rmjʡu^8܎sU>\+E493$2<PVpШlpntBr7J.{`ӁQr|{-k `LfCvgirUd&1X!pBNF%P$:CN@5hWxFuY X a=l7~-HD ^°Д)A8 |  +0&Ѩs+aD}|8dL/v6lb U\x<nD6" >zf %"]/7x`cv]L?V兩9i,>:^kY{/ p1`A/f2bSּZsU3Ff9#ofUT3 BfP 2//}s-o%=S7m&%XdiMH`E;Lb b=Ԃbvg +7b{DM!+dҷpZ qxZ~(7x=pKt 'CE)~/q6h?Ap3|W0 *x%ʻ5ξ ^ߖBqfdl#V4y`Fr&m D:u{"3e'RnO,Eodzd:nsÉ ʆ`_ hTإEʮr<J f9rhG)nB~A:3BǩHbo +)MMSRBT ~  L_]l.g0fhUc;|dmGBG=8M,eeqNPSl k&|k:i6I_=WOXN L\;Kyn sJɸfȦ9a9>G #O"Gf:KɊԥ3:4mu8ߝht(}Ԛ/'cR۴垾4qɔp/eV;q.3^j 97M+7 H,/p̂`(IVÆ/T5xRfI,`<^e-!‡5Ua<�� �IDAT�<Gӻ_Th?YVn Pa15^RB4###?Yew#d"H$hT] ⷳ0fӦ*VDq:[_3S?Q]6;0WpJ%"J [c1WeM[k3gWf"&5GP;;Y-Af1dV?f u< mr1:OtbX2L&\N+ByOή05t^VPShʲ,oMD&emJo 0a5N/;eT}*V}0fx=iWq_PbG-I5u3 HhɊ~l24檆ׄuE{ Lxṯ=h޲4ﵹB0p;@- K]Z=%DB<S`G)5:'^.!* XGh!s+tbRQ9W0i6]>uyUއ϶;@)_b>:yd=qGyN=_K�eZh$$w聲b:sIhd9ʆJ6c Eoa^w=XF b`?yel\4Fm I:H8JЫud*wƦW^ ͍5/aPh"^:.ҫ#Xd $(vZ:ό`s-ܪׇ'VXQk9B%LeZAĎ0e@ʆ)S�uyG<TJ(Co Hr֣A18IKF[@->$f\a"ǭYf8i Z,8T`x{2{T/N'/}gFQAEDGEEGqGAPСEPYzozߓN:T,ϋˤa| ''N}TE~IUz{y aYak< >IAqb;EpF`:}Y"!?d>IN  bF| p^xFN0oCm$*d1v yoO?0Bd9k]_?`Ѡyfߚ]ʼni#GN{.i]̜y>1@$jT朲qfuʃrXl}o/'8Ȭ;4.bd pÊCu9津mk\1R>lN !zզCucX&w= %WMNZ\"xlj1Lxi`k>͖@ݾrx^E 9o9 _ 9y vhgZ:s5JP9 &_c:%i)ܜcG](rB .HNFǒ %Pg6/ggl88QEHP M<b<w}HJ7x/( c~SEbkx8+8\,Plft&~X pp  QЇY\IOMiIZ^PFhR` K D.+cΆ~Й %X6@k7.2ElYþJƞZ[YDřz,ħ>|.S&}d~@ 2QfIB,RC1O'@j/1/@TWNg Tp#4,ofI|^ͲNEGY chί牴iX)D[ٯQuU aML!Ȥu<:.#D0OpWHIy�\qªi .p2KU^ ~Y[]:WbJ-0 q-V}Vg} :A $.W&\ a:�lb8ObUydTgDUt9uNVc rw|ڵ (2<gxVA?m�tmn oWUx]ܪYUM 9i[k.3e)&)RvZ;ke&ͥ6;{6b)/&Y.h@v=|8AUЁP@<rO\KD˟[L0㘺1 w{c5Mذ\),F֎,EEtj8cV hݘo4)s(JqY%e1]e`c*B�.p(TTyc T8bw'# &7C`W˂4kY%"&{oXHWpK7}},ԨP"^io%se z8K*zW,cSjGC+97@?]%Z' zԅJ1X$*IƶIXjPU^B' .gv`9&�:1ButC(U+NaQ8N{߰_?ޅkMl ֬p?ӿR 0GT +$T'luy{iL=Bzlgs$g6#Zqap:ts+& P#뼜c<>r>'!9&Ruթ7|O *=:ÌGxUb~-Aj[9([7+nUS: M""Q 1j @DνGHa !̨"7I\!0[zZdLF-"EnB|na7<巯=MR'n\w\Ԇ*XWg;u0 RxQ 6P/OgB?} b&;q3h޻> _lO:2sOkUv[f;n3R~kU-YJi0ōLp8larܲmJMMi^ɲh}镦g[EW#+"=n9A1]'@+]Wwl,9'LY~@9{bku}iY&pp ط/6+VF^S9+!vS['fgM*Ins+%@)EoUGM?Xl-Z]輪vK2qq{Z$a#2[Ʒ=5 75*Si}"ak3qX*a(,E@~gO-0*Þ ;DZ´ka(Gk_5?xşqM⍋'ю3r~KHs ~Cw4ADG=5h{o~iI$5KU5~FIfnG(~�(NDއgH0zL-N bgp'DxӞŝ{Ƭznl=_:r 7R+ܿ##zdrŸՌC*׾5}׫>}cEqDݬӨR"2q:cN*ֲ?Ah HL5vIB 9HypYQx,ΜxWvf@@�ȅ:%W@TSW҂Pma5ŋkDRFx]&B hI :i8bLDZ r7y"pG5Ƨf@5:k?TgSDu>_xs{E\\~5 +jY|:g;!s�d.҈A(01Tx]ŶŎX<(f͝$*Ùטf5$  )37[FUVWݽ0 qxKsiBUÐ+h5ԘFM;/2?!<>,rFw'b1{$ f2١QUհW7<p{+b1Jw}Yxi>xeccKQ<ke�tcz|ɸW{֢[&/-]Y,cMnTYIG.͉u=:kߟs\.W.32Z:\pީx9t-K9lkޠQwkTW帩QeUF$272bP yÑ Zmi}uW}5s3fçv_;uV}p?T|Ydu#E+Ae6TD%xYgm/<;` T$Q$I DDUDG6aJ2._bb=IثsEkGngw-pF ӹil G*ʁ(gF.SGGvejf/m䈄M&,q%ѫ8l#ǫDi1IУSM4E@AFSn]l']YpS4R!XXgң#Rg˷-kxlG^\|p`^\Zw`n7C[ #Eu(!!$iZ'րG z5vJ3ad$|qIDi0>o-|MՊ_өOA%MVϱ?G/KV'>`6' n1|OX0V"UKeguR฀CS�f@¾"sP%Nr�TJ\ 8*2~ l\eNh"{ٺ .an8ߌϵ|Jߝ[vbO$!2\8�+ԀB0\`!beU0 @/W8uԶmލSWN(OWQWqP5{+1lD%$kj/n}c伈jW=C#] 7o\.d1y'i7l3)rǤ=o&|TSjZxV$hKukͺl{TWw<"͍-[4M,7'fLDgEl9Yp8cxzJl} 3Cc arS�' O&RT_[gomX,GTlJ&|zO5:XaiB!b<B85h)XBBdR(VuY琳6{.hB[-VSŢ8;hlL")xt5 ^eHdcƮ*D)m2p4 #(̂z8$R?`N�pj o*h\Ј-DD(GCxUx IC"~-9q6Ui/b8KZ#x Ą E~{6<rYE%yn{tJ UQ@A%Mw Њ Rk(As-hvR &TfГ'KƷy$YqӴsuOߚZ'QoQ<^cz_!7V팾&+vװ}Ǽwh\4 QDz (Q-Leh/"5:QBֳvF}0յE_bL*"_Ҙ 9^ͱz-j|lN"V1ACBW þ)˼NJĹ"v;5**p.<q<5d>qWg`@,(aHi4f4֩8J=gzg&�2~]@Y4X Ah=0./-:EZ Sp#l'mƍaؓп<{t ъNa IMӒӓ^i'Ķڒ Isp14p4EOӔ_{[ȵGv�kT=]n4Ab&\xq?F-X*_ieYIxf2;)&;O7vJ9iS&åܕs\.QN҉r͖yKw̧iZS4e :u}nL+T%Ɩ2~ƄV$fR>`k.xpiR9J .fڗLFMX?igh3VIS:SC/TS@ctYEGtUZ'>9c'D4�ʬSjU%Ztrj7,8TT,?%GsAu<u}WKGr:]5K2ý$%ƋXXj9\:l5}DT~l%ݭ'^C?uCfT[ <0qS] 2K#2M ?),.59űV i<~"2R{PP7;xIbXN2#8L]XdXi!Gv ~8'xp<\"N"E,b+ 8J6^^w6]dxDB:P:/cְ/Z/u\fyؔ64P&C2g9!2ׂێ;ONCK,2T"{cP -E�-"E�:`& *Иq5R:4( X<O16}Xg'8K腕2w(+haXs߹#:-<mgVWo/`]i8L-5| ؝q8i:b75XArbF;w z@PUUUv}+iSwC5wz=NUzQf dLڴfDV6m;4KN4ǔU45zcA`)߲鶊 n1}LaFTyr8-0߅9lb>1{lf,x(hϛL$8lJJKͨ?LLU媪`0X__z n6׼d*D\.a>ɕ05'rK5V2ߣ56"LGTt*t( < åP-)/;9CeN5\1 Aȁ ] Hf"Yh2DK|ESi/_9͜7| {´bTav_ %4Dg49�1J`fiҡf~})|ueki \O^Q]ߔQl"GZՂf8dzQƊLBo6հ6}$R)! v!&4FN5 5Y\E,^ ЃX`Q"[dX aBF Qn2tn%[5H|/iv*VTDd2s%Ƈ͆י>`5<}pATݼ8iАD|nϬ>U$ZБXSm\6s}Y ]TG(ERS9>W`o44nY΁!5 u\ ~Smi ix PubU<!. _lxZg+~Wg$ !OMF >w\3]moW]e&9S3�˛%F80!ij,nBpF6ʂ ذ_n>#+pfl^p]-~j.|eSTV[ukF++IwYeKfdr9Tmi9f(~S&?X[#w3_n#Փ:Ls.HnrY9~D/z@P/Wp=tDW6d[_}>fs\d٬y5uzoƻ{qO {}X( pNKs6"Eբs\�k$JD|W}twcP  ށ(µ`-{/`ZL)y8bI$upJfwCuJΦ9EM!Ji!.")urXzm ]Ʃǣ)`rMQ|l*en�� �IDATSOYn?#}v+EgO~Eߺ~{ yw7c{'Y`CvS&夨"ב;zm8l G945LJ9hʲBJ-`K8'"+%E~j(cS82UDN͢0 8M:Ն& Tp@GGcA8pFS3fj!#w0œT% Ds7U{ \HN(EҝEI0=Z%peNGڄȐDE-9B<v cQ# Eզ}2SΟH_D>BAFdLcH "W X!Ja%V(r fI8m4. \夐B<yKnA1.Y�u2;vx29XGd W~ȁ2 Ux}y]TNZnh[W3fw[S=L +Lt:R掵\(bN36 Fd䌼3N;~aGô:__(sG}ު0/jFh}YYG"`7n[ ӈd/-Sfgm''hPNH1Iӆ$\)*9=9>g<e[1)]y<xJR!&DM,O!͊6{=#6\ C%2H$ e $dfLGLYu ~i̭ZzY꼮U'7u39MmjFNL2~ &Ѩ, 0$% ^*g:{i@dos+hRx@gN@)9 c[=y: 5.#ibH(:بk$dQF U9~hƁ/YVFm12q%ٙMyЎcՊ6~qV9@'"Ro]Ix,lqz7&<4CHjAysHth؜dr$+bLy؜2BK% B:d@<AC!R6Js#>v[hm!buu#tY3g& 4pL0e(H]vYbp ~ѡlN{%AfaB E2DSIZ^dpaoNeZY:ਝiVZDJ< :":#^V8TEEHLk,L1(Ę@7Xh9^(lX3| 2ojAZ^~rGr X=)N1ѿ ^�wg0Mn 4A ? ۺmOQc0]#^Cs\.STy(?L&Xyh69+cWslڎke _k 6j+x,p؆l'/8Z/c}q9$iD#qcbC>A'+z"ogoMwkBFŜ28x:!5Cɤ<d\LAgP#Egq|x2 UIB!#i%!XhԗeR^#Eiɸ[Cɾ\}te$ Ư&/& [dި2Ms?N̙t{h%Yg$,ƴ4Yh!2k2)]sYШGV\ _{ pxJcFu(X$XtUD> Dč08�a/!LB(_(;fHNtuf\@/ndN9{\H4檥*OW"8R3xM"@hGqW1]* ,W si5 ^ 6%$;|!41f$̓ y+C~GQ\>ust2=ALf؁S! zJ:;(q:+KHs R�BEɝW,߫?iZVh%['yyi׼~k$*lL4BuY#H$8[Xt0Q$,]`Y$ N U:^ aQMr/$t:3tnx� 5%" AiѩX}DZaJjN?[ϿU(R"jf q%Gc8,vo�7.A�x5[,ɹ\ wW( ~,ZFp/&0 ȍ^nMbrWEN|CT}ʸB*cÄr䒒I#?uIX4Ne*"h ˑfMIM&ϨYcRlIZ2<<svYǘFVFj1& '+a־0iyM9I^UT*ND*ZaFc* c2juO9N)w]깪'?/GR)hL5YNSˎI�P?["~k|6T+TeZb *|\#F9',*nu\8DUpy(w5j',aKkY2NBEc \=*ԍӱ8} <# kǻ׏~F[um%őW"!;>{!^;(rZteDK?!p 8j|-~V^$;"laA9jpKEgBﰪmq Zhm2sT|͌Aklbv<̜At~M3o9-|YQEmDX; )X4;O+Ӡw5~+LFRlºBvMCVVY!"5I(n+"!8CiB% _噓gT~"z:Q# Vf(U:_&0ȿgtFx.K-:E5> X Ŷ'Jr=UVA\k:~ۡy8j3>YɆ34 p'Kv//'JХ1'uW7a?pu~b#O| sݗI\X,fBwl4 ֞q@7߲y+٬mgci&"VM _v5j\z=羰٢tm},)9J ,ds)PKRѴ0 Aw5JsIUNgTD6/HLKzdx5Vl̊TUEȅr;oͭ/XLd2dSJǯ<Y_bN8/1Y怚1Vf$??uքI#O;"'w߭dc]5>Ȓ(9nrMdޕO٭ FLxL,WCL# +,thԸ$oK8m)t$cPVgPCܯQ5U2%* <]^g@fy{oXqIK <F̻u_mP]4hkJ9/.[Zfۺ,PFK>ft/߽2z%YenVwl)?SW<\<u%2C9a!ƆMZA:BIWG7-.fFHGam $32Z9Bg=^9##ӗZO!Rv2yZƨ`'Wew4V xEe28.r/eU ]²zB/|mdJ&uOtfLo4{HI#Y%yEGi:c:v*kF,J!S#�%\4:U CTyQ>zuVxnUb~7عfЭ�&W pIiy~1rPWb8Ɖr(ePf-{<q蟘[q5̀;a f'F+$h-2=aԙ``[nnMʀ'L�`"N&{͜V1y\f e &{dNr1Et2Y;>^\oׅ]E{nlH-G[^5N7}_㾎;޸ iP`^Ruqw޶,1I0= ȋ||،SA:fn,9fl)dMXP5<e<1gB jIխz݊Wp`|o;s uN}^X6͡/06E1%f!hr{kNM J׾?X/F=i joU -˚bȢlC'Bސ#I54MԻʕT\ iL8``3앸34Nhl^*N~^I3' texJe@OO4lYqd@J'X\C 98pb:fUDyD 9Ӌ5E%^ s~C] UavhS*Z~|Ms /InV/K$˒c&^dzU 4h8휟#`%,.)Asr$=* *2c"Lx,,Hp tM9"AǷVY'(U㉠Q'bÌHG0 4DFisdqYPc G9_b 3gw/1 ̮r*GCH]49'l ~Ӊ]9~sDOꙥ@5Yuzlm\+QJppj*FUVjTE6,iM"Kt.2E 3x׽e4 ܢcѩؠU/QyN":BZQkB`  "Yʹ()Hjlp6� ބ x61|SƄon*>cB Lթ;ج9X:)ИC&lK~}w8o5ϬqJ%IY"5q:bM5#X*)KL:4iWt&ےd[2y~x̗f{F%Tn1UV8M (A?<o2&WUk{nܳ&wzOyu.R3_Ϟ|saHۈ%ci|qC4Ixr}g1I #T?IGlvlYo̢Dyv4uj8HyuR*WS47&% -Ҍi_!}S5:K@yjlz/|ħR4tX o[r·�_nXo!aa< g/\d9qy w$W**Y.wPڋM q: 'H!g(vYQ `cj7/}CcJ=U\"~=ڙmׁUS4H~"Q^+1aeE S,r gXwm)r39`bZ88i t3,<BcL:L Jz+X/aiL O)By X=)*XpL=bksF|Q[qM%5x7v`"ZGԓ~.RF] Ɖ:dR<;3 ,Ts$HP$I:lԙ'H##X @ 7%.|BT͠ %U@`;=c:[(.:Txa??�h fBdVܰ^a Êw P*�T XnE?UQ{[L<-1a 1kٽEnORajj:t]/Ic_]x}^|n;=jn}g!$QtN)O-'I⤰n('-E]wˌɋo#=5j֖ Cl3<sxKb7lih*PwNnn>qh,BMhG6{qݵ;t[o.{~^x$Da)C,OjI 'Mn< +2a:*,+qrP4^y�:~`tҸ"V&RGj9}RgWNXNC2_Q,ʑO&i%/cSm{^sa0v嘇crkKLuN6?Sg8^/U DѳԉD_=8{4c9L(O*Da44ّ@KԆHE#1;AwT�FzO$Gӑ,زLaGEk0⠀F&i ;9GD1ZDJGMԣ|17>?<{7/~=.Id9.JEb8am0 `+ J4>^u8j ,ySE, 5v(1/rOugG%6KtV9^d4v__$bJp]!` 1aA~Xga-<] \ /@ � ΘLn{iij1hqne(~? utt,]ts]`AKKK]]4up&HZ8|5#tV5J4 Q|ר̌nǤilIDmߏFVս]gt<(EdKenc 00-8!@! TBB <@ BxB-P 84c{d[dmv~?3Y$ $5g/;>7q|[W'9F0|vt7k^S ~XhYKq64YKU;diwz{\'wMr:T 3!cIn-Yx<nLLσZؙeOAT^W `ii`% 5Γi4N+/ e~�k|SWn(bCX4{ U4=DlC,>FNٖǮ.d8E�FIiޔi<-㙠3TEj ͥ<Qκt:Kr-{GAB( r)NvE~[e %"2K#<d&FJ@/BpPS#FKΜ\)q`F'<voeF-n}Tj@m8Qȶ])hdgȠe< %*W5tjk]~,b.Yn}dOK0&v<xO*.~梾YmBvߝ%;HΕP,S�:UcRgdSGYdvB(L։ z)񖄤1X< d >Rv@3 CL{Jn~ES3a6*'qU^]3~XNC+y)pArJhSI^ 3Ay ָKp.�쀣<ةq{#P*`IXbX܍Rf =7�êKkvfMPS~bD"sf})Oɸ2_W|gN)vv*,s6 aKZWK"_.TKϒ A_~:63 ̼�� �IDATsYKVR%kjC=gR߽3i|Q 6`_>g'fﰯhoCsXR@~Ft68KE"Ol 2]ק~:-0ByV/YTTY!Vw~wwC5p='6_Ԝg͗驚I&cęrU4Ш HLЙ.xK]gm3 =t%7vqj4'jD$8Ȃ 6Ѽ,U  $XG S˔J�~;CK-3]:$x vJzݎ5x<txIgo~/_> 3 7#u1eb-{.eyd({Nǖ[q -UѢu|nN2T& X(8Ƅ06gD5fVѓ苑^f2l2yAR1 S#\CnDo ]TȆ I k#$!o9ʡɤ?B>1g/*my)']eQ"|W~}]/Wv躓JCiGj0aE T/2?3O\a; %XVSKd_ C8'E,!oUYC< _ӸAA i>^ :h( Z+uALX5Ŷ+ۥH/S{ڹi \uЬ:ЧpB!"j9IkRѵ  @N vC yѧή(c|{ 6yժ-7mQ) +kV 88cKJJnwuuKw>[Up0Md˷7}1<8H4vu]/\S%;JBCY~sȵ0O˓͵]7n*3s1"1̎2)&e*Z }N+[hOyeW\~.RAuϼxqhoѱ%$kjx)k^RX\gB3 \.F 48bլk+ږ1a)pe`'?8spCxS#ή$$߸Ɔ#2!bIX$M{L:)!%( eHTj&_D)dMA `E!S&薨n%VrKOĵ/ nqҝ&.S'sʐLLJ:u-ei%5Nr`9Y6Ä(2X5 |aၲA삿DSLEJvWa fuOF.ݥ:)k)k q(J0!A tYU4꽃MW+XKH蔦. Xp RV$1+Ra ;v3Mfz`hXJ^WN&((!1[N<^,vq  Ib7RGfX!k^t3ckۘP):KJrq>z2{DTZI΍ TF4˔ytʜ5+CoUq~HTJ9 :YТs] NL'QxFPw70�>LY*ߔGN?yHgK7̇<Ā.hQ do|Mʅȏ͔V-xn6/rW/Fh 03)7B\А+h$K7@'m ܰp O GXa*H0N*(IҶ[r)>) N츨le50qNsE"`g4_(1:(*{n{gggӉM:pkg - zIrC𘹺_ǏR1*W )qj4-s nI5hvk^NXM8cth` ;`I2}Jw'կEЕl+%1nW>+]h\+C6Ekr|Fh d}Tp6ͿkSqNMt Oi=Z`Q#Ni,b׍ބRGO9jf~5d)1c_$]E*.?$I,> S.Mgӓqv<b6(-8λv(LJ2#d蕘&xBbc#l2 R.�>NS)U4ޙ1һ&iPj|˟P ~RԵ&[?=]i/ft+<"!04(s-yo#_gͅx&yST)KSGU$+z)~zdFVDP qsãbic`ObURey4azI"$7@q-AE5 YE q!sĂVDo�H*ڥ~[s[5wGeT[۾x%Q:Jv9[ٞ'i:Yۍ/lR"RjEȋ`BB8CQ]fh!b iP4C:+eX#H d vdYf©}X4HJa5ٯ+t3%v}Ⱥ<z۰34 @ A ։:5t\i2l9trvv(\0bfGxLM#t6 8AZB(� $waA|pFnڰa4&l+)ἃyf{n5qax<&ŏ1݌̷0hႢE.nN=Wo9 /WTЬLy[i=Y n \)<&ߘ"]zz/W!whkgʋ6l ۳9;Wݸ$V@_py]\qqS8ubӕ15ib*q2W,4mYšRwr_~W\w9rӕ)HoΖZbuͅy#yVvo+?|:+=hv7 F3+mL^M̿MW>CB{4%)n6ʶ:OQ5n( Cg,ԘQe, eIq\pMBYHk hK6L(ntdj|Òskjz7=+|/][7/$@ LqK�~PD]I<4)+(Ի)uQ,cQʉ'k2V))#>`1aJ*%2De!yVAoCxE6<&(((G Lż}:g&%vW>56DGq&cu+Ϩ,  ?0S5ucGug2ABY(p[')q^ ?N)m_W2!Eew!Ly#|A 2gX+8xS\( I`ɢꔀ Saӄm\"։,So3~}nϽ9{Svq4ۓ*a.B- ~y*7Lizn?7(ð GTtɳKoOC\,9SZ+ a9< > lP�%P/0#7]b/1*RX9zѲe4j3/m*3osCx_(mk*`ltf2Ѳ2VVC^*X[{Y@p8={cli)a6/57c$esӕq$Ʒr>m j0|;5o(v]ctL\=300rAHPUu׍*U(4/u/֨vlSt%IKRɻ1V +#/I֫n.wtgi?j$!J~"{헵WX,2`9p)OM-,JWMW$lb8^$ߥVh'4N̆~ĪNy >Jp,9Y=x>UC΋I,2IiRPc0CFEx?AI',3ogz*G!ot ;gޖ^ ;dA'8OƔ elY L 2LpP(hS=8.&%袯•c ɴXud$=Lqy/KeLcv>80+I^ JuIV0І nAN$'qthi;ﴼj$peJ^)]w+مNM݃(% W)^EÀ U]/t|%|%͡f"t"Â"8=CdsQPy/L:`BDTZa n�;P0UScV0<_iC|.Xsdy!F4s<:@><Dey҅GJ cO3{v>Ex R8UD+T+'C% LbKX0 oV*\j-[̑C_9TjA: #fQ"J^_JMR1;MWfPC5\ǰrӕ63L& #}bޣLQS٦%w/VVԜΙo,R~#0O_^v圖Mc.�fv4D@ ʈNtnf SQ%;%I%S7j ϜP-:HxʙF'H3V6L >3eMb;2 ]K;pɁ=b{!5k GiQKo,Whkps>j7̈́hGʘn#j" !Ul8 B%qz&މfUDy4e W+"$s76L@7ZwX,hdD0NH' :((bwO�9ŰN{F8'7pf٪Pik8jE4 Z6~qq1BIzmF[WqPmIR9EfCN!ID /6J2]p] e1|TT#g9rڽ(Wl!r,Bhql R,&0BwXnӆs ]Y.r C0[CvQd`!7ZwgEz$ډxҵ}o˾ Via{~oM]KEx)olvTA#qc!*S8tB,+,.5&z(t٨͚QY#Y bX!&pKa邫@X(?-]|<7ALAZCehI4&F> ]G-z �?<B3->{fa 8GbpL^ y B @58 �1xyf<}לrs#˲vܱ@r Yl/1N;&]]OWV-AufFeTUMӉDBMT&ci|Vo`ٍ5&pHs ofʶYViڈHqQXDREii޸fs9AW56m]֚ufõaYpqx|xۻuUn8VWeJӊw}>רL|ɅgcRa lrӠ1t",6MHVFuʭY(xIdMZmI[]%IYi \\uaym ၳe0z/KB6{ J -$Wf,G|q^WAF 㑱y>T<ch?]lurrFHf?(32> /`cpgANegf gQc8Y>=<B zmMOi[+܎@]` Rk .gdG#2OhӑHZC]OAfRy(#= zJuͰS'~=xf`V d^LwIzz)qA !&tR`u A!f)2Jo#2K9zF:Q6rG> [z i#߶wVi|*#Z?|}zy4C;'M-x5\GNފU ̻Nd8ppq*w̃킄Ј)H2 i|UF(—o-X?I4B >-bpC[:'.]Q7=hyS pMp@b`9\ Q'l Q8f"?C00p2�`"T1_飃S%!>GrJ:=.Ozz=Rpn@mtg۝[Ę`_Qf1c�(i%7giϴ9N=O߹`g*d2A&F]._?*/StK-zb u<Ov^ns׆-oi|}=/O$)[=xcUBZtߢ\ҷSUuc~L,j*2||(c"(ʺ3/4JGJU cHTJͪ*&r3KmR0t@?b]!!J=or%57zM$n;o;E""- #kC}p5KzڌQչ ڡ~.ت傗u~ c'#SʰI u~#8-4pGwk(Tha~TD`,kDikM܊~OWsQőC}Igu;_NJ7Ct -40eƐi?,m#Xw2]aԏ$E0% F7J^}Xu|0X,,NӸ&J\B3|nʓ8,̓.™?s 2vx"L}!$ЖLt>p'g+߾7 Is X ߺ(9l/-2�+G>\ēE`Eg@Ob:p2A<:t<aI- t!2S'U}Kgι}CEQl:>AKF AN}' _Ec쁅;wA�J@E `+o:/R*QSp4BdIA <'9: 8fP�#SF,-rUol (^l11"w>fnFolM <a>}e)_q!W6Su-Vk;͎ DdƠCdaf5Z$gTGN;20u`ޟׅ> eY&?3he2,h30;Pju.RbY 1nAw:J 'ɦ6M~uŃʼnHgrO<_jM$MWeÐ+@57rywƜ0*י {Ĥ0ntS2@#,ew 1p Cd+s]S<s˲|KgdJcbGtph:2C m3 W#\ceiF'0 1>5+ o_t˿sHhg1 {ieƚG~lFO:aA@_S\M]bs9ʄi2A\xFpH66tAڀ$'%Dm$Q;,MS-|/)}H*Iq{_=ԏ=g 4 ^_H_EKDwr :&+׷~AQFIdFc>X@1Y)pɗS@�� �IDAT{H 1) }$`B,_Ihq40Da?P$Jir &kTZPtGN AŰ9.<&b8 &أS$h<`?.;N;FX-2vYߛx�`<$aQ Q{a eBFNÊOV%d]΋eo!͐'0s}1̺Ĝp1pLIʻkծdy7{hv^o^___<ttנ~u; ͑"bf#}T)wo6;gVcZf2ftM4<`~-;2cY  qĵhp8Ѩjme`): EdD&QW_&la\+/3Ę?eTдOD<q5e k֬d2iӿ<�!!Y, 5p+|t:ln:<&I'Y ag"0>-VG~b 7hP@m97 ?2&2k |(5 D9ԑk*xfqh)ѨKzDȯtrPXm %~$+W7p{xb+7͠%~z{ LFxI2a';S>yY'*c+Ga #1lӹcJdžFbԖ;_ko{f."#dK=YzhL~e~uݗS{/^O>*ƐێUni|}8] Q'x:bm<{2M9(TZ�YA2G:ܟa1$*P%qiFbA :dN,\W'7$QQF,<D$æKxu6]o ʝ|?~ΗYd$Kx�k%p(<LaWৠM>!�>6Rp<�vOA <@7*?N+/RIc; Fi|S%n?d*#lt.Pܯiޘ;T\AK%0m_fȒ#T[@g=8߼}O xdƓIDOWn-p;>NFCmoqg{ܛw<_h:i;3o9 ֣gҸϓƌʌQ\cbYu*x !Ԏ)k2 ˅猁<EgM[]{G[il֨xL&|?ƍ1bBasd6W䳺c?f ni*iA#?]2T pAWum 8T˔tk[:4lI]H @~ٰJ*;7#IcC[>DDfE%f+xF!a7xfƘCNc/c>3#D>'zYZO,X\b܏J+¸xæV$^1a$\&" IYhe,}Xؗdp=!>Vh$wazU5kWVMIgi8. %:(NˮiЩ |>@"-S!\o _\W 93$ֺY%I˜NB7Z&w!w1G('ࠛ_N!VӜQyjt~ 1vh2-c9K@ouF팖.Rp}-.qBr,yiJ\}I^I{b2&$.wp*8xϴ_�tu̗uNzxDWb\dx@3�w.qĹ:a1!. �Ax$Q zFjI{GVqqT^e+fYY0ʔ c?+05шtHdEcGEhݴD #*W,9P2h3{%ŏ][? E!gFC+ƁOj.yͻjVL{v 6F8nQTTdx|,^.3t0fN&}vnj"YܬVXxD9 ձCho^ vwڗv8T'֓N06/>ul9VIX}@I;ˠl2);dX8^L#n SV/X,S#r ƜqHd^N2IPEN1S[XD-_H$WRa ҙǛ@g*i =3S -:-T3b|, U|=Kg-g^,uZMַ/׎BTanT?Z8iRR32Q k8C|b-2;:yV&P?͠ 4|nb#YaK߰;>G- ,EI#j4I%˴"$%܁HS"o>9Sl'NfO1ҙd/ub?r@ aNMWBzI0{u)v  JW"! }"3jxiq₝2%:azYaq23Mt;IIRsdi D C09 <Ω`+Syeoniy$qM 5a: J (Lݰ.UN^ p7>pA�F! xsEJ{7 n(JacUێqT(·ϧDc<FH'&TlTS-Lws=6~N`B1/fBvV5Jn.~:m.iR̴kk$4Cven;ǥ"H, 8ڐyFsa)wgZ15W<7}5Pz& UUGggh+b4oK/(eQF-iT`of{ǀ- mbIky8p[aƒTqbG) v!i˒ ͬ2t/g"t ?rAod|3l5%< ł"(84 N2A׉aR?AgD[LFHl&?>2WP_0:[㻂w;itq2ńYAQwC.DsTc5{.\LUpM1^)EQ!Q KԏS\xFi$$*aMqrS(!SoB87 !$ЫSN;/(Uu$[1Rs2kw=;GJ+<KgX\gx{ܱC_J_ytF_n'>t`~5Y6L1lerv"IN`Rd Nw t|0K 2,6)PkA㮉t*F)>('K0=WVM 48"„fyplA A Ǘry 0C0OKP !mn;̆xRТ-1-Oޕ~S ;.?L`(, E W>ϙ<<RZFcTcbLܘnFv0ɤ`b\yHKu8ɓ_<Ɂ�`[+ޫ9߽0.G6߶yu{OQuP`w|C^-=sȚsծ5VmQ֟n㛐p8o e= ^l6yXdc:>iFlκFZm^,wrw匜)Xp r~si\_1nqXDJ㪫I?WCZ-“$EiK11%+M`R=a&@MNH<SeޗY!;(_Fm*/ s _DC"ƉV#uNrz{/P'(LS<MDtX< F;qAJ@~# Nr<}z]2~:q+"4I'$]\OIZ­(OXsw?TDG2Og)J4"pHwDuIv-;tx=zy-&#uG1R2^eXT"ItB$[2~%*:Y3QqpH?444 'g.(m)Av8Gf}n::Cs1:G+0�SD"$37 ~\F} a D^pN& f8)t)R\[jxA]ڑa:ym iFxMjt#rx_ x=`<vxn0 R2P%F2̬""o%+luuul/5/sd>CcdŽ'}*)תDv2w,%1̈́2YZF:i$Kp VK$^K08P=i%XzVki/LuspoKigxi;n19<F|4**ӬM͹"o-{n̔XCCN)͆h4jl>gTL <2|TLƬ2=G2#ofW-fp̪#{.YVmwuIW2Jp[E5O;Ipifx|Oy )'D"@O`@W.Tr'r0E+B\ $ ໰.M0Kva-^B@ EnLe.UИ@85T De[!5? (P#xPgFr<1C=2%0fkZp3DBXǕF$ig|\LoҨw] 6`zBhJ@@$C7B l ɲԻ4Igagdz޵ֳgR]HD2*R,ɕ#_[O<uS؞Ė%C 4&g>j?_51}vt?j"#+ˤuW<to[k~o<)7F""%87^rK~1gsNΧgVpQ':THT'7 Q`˨_6 I2ݓ΋Lh.hᘽ)BoE-`HQg$980̽3r 6QNLqs 3qH%\#C]{f%xVf~!>q=\+qTrHȜ!?fzk:ؙ !I',4A�΄-П.ܜ"wnn>7n)X.h~QpEoB RwJ x9vW°~�/@<0΄RW!^}:aj{ͯ˵r[5]d0Q){wi-7UFݏ #5`du Lee0wfO {5ӋڷvD""Ǘm7lqQ֟l]WOxsu~euKѡ"))eW)U>瞔gceDeVk4̢4QjNG1fØpeyNpDpcΫ) L )nu7.nۜf#(<_+F|Z6N<cAG:X暴7kٺ:PM dD8̻jn n£*8Dʏ` %*1x.v=q3XbFċ#Cea5$E1 ">Vb %(U`AN !K03906aİ]+!t2~}<ٗmAZOۘ`f͉!M5GL 3-1+ˎR,M-֎DCpX9Fǚ]uIW+/3pcr"Oi|LY]#7?\\D#⼞.p n1T43|rV-)^e~DMi QWDX0>g\=a'WDhQP�gfsT!) Hx :<bćBNb4bI" 1$;%r2 Z=$çI9Hk0v^ C|*({U,/x8 ;O(>7B#\ N ܰ ܢ0@AcPp7ތ; A tBKb麮%+_냖dr[=ld[joF{!UϖV`;ٷ�&oO//' 6f3x5-mi7-kҜ3v붒m%{ 4OmrټlUKOi^<VjX:65L[gv˫?-a 'nLX9-DF?5e&f'{7qf3žnψ%a=p/l7I^rBա]3;44G崖`Cpq%Jwզҟ%ooֺ6m2,CŕL)&#~ jAp[fJhp<+GT w RƧi I7*蔨S6hyE]8 scRpn&(JSlef nUd-#Oݼ:q:u �J{@bA1x~yh e:_ ܾ\Ϊ0V-ȹtoʳ˧'ox6΁ PGʁY x):)2;E>xˡM?-%yG|m8%-wANJH& gfAs9T@I6JaF&�< 5]8TegN! K@FDGVIlh.|.{% HgAN:$K2U\ aa3\ ur d%8~:ỗKBJ;|"\_`1 @$M^iX̕cjf۪׼[ph| 0 “^%HpAxNF(x Kal`E(<<䬉 rL($b؉1dy0Ѫ죲ЊО L_Y^p88 &?mbadcI6Ħ/0eħg?1{;|U{fcqG@CxnhsQ&A"+F̰ks,lRY53N֋ 9kuꮪ |rf2xYm#aݥDÅ jDU'Ǫ15:&ڽ;Vz[g-[2"v $2|U2U1;L`*Û*g+#0(Tfr1,У`Ibʣ<h (w ?E1"1.?!膹1U ur $o 6I.Am&&PṘAfG"FL~\ if@07 tfP$oG!%|yYrCUG/ ZtZQiZpFC.[Kup8SfP:PI:tkYwN;t ¸`̡~5_&~[f́FES;O|y) Z%qvI_�� �IDAT Q8#(Y yNJbBAk:`<5`\[=T,aO2Y Mԉ&@�fB~za5Ó  S샍)BoJ 3e&h xc9Pz0 I ),`H<9)<\F#'sFIb@fG.'ҝ4l8ޅ0JNqp f~xB__!A@3a3$8 *쪹yӦMV*z%5kwi׬Oi~N#`[Khdlson~X]}0e2V_mN6:L SN}uz-+>\QX9<<ń&|-dN66:t(RZ[wVCUUw3mY[Ҏ7]e|._OE\LcG`s6в7<,vh_uDjy̡s?Z: ì !^wó' N5?oJmenV,ܙxif@~V*IҎ0uvp 9 AgSE{"d2#Ge+sͰ8,΋v~ә3fQ+ d*-A@y 6HTAg l̂uA. {2'n.:G?}h`,E} ,- iU>h.R)E4٘2;2p؝LqCj|R6 FH"nƥOɣLטA&刺P#xBɐpMqy</=<GE{~aNlF !6|k3>U}[#~{ݵWH2y <a(w <ft la>k $R� ܢ~8Ie$%2DTqs>.C{ZAd@yVXP 4 I.FA >!&BT�ncrPK鸍lqpͅ02OTB<)3'qtttn>vAlk 3U2߿+k`%4x*`DXfV \"| N!3ï Bc((>/[qjDd~[쪑U-%AKK[1<<l͸DQUU].dYk#[*ZGe7~l6[ `a}a9?o5h0K<()%);nOߐO+%wno9SM{ŷ/61h86歐}4M,n/0sX,694ێ(F<ٚ~!z+;qÁ@C:[(Ll=f->MTUᴧ!$Oop]'uo=h~v{̼扙SұXu90bÔ}KڤHdNRGgWn&L/o0f <^:S,$s.X# A2 f E P8,p^!4/ l;Qt"'$a` V<e9ݎ g2c ;ND< 62^V(P@JFOJW8%8HؘP*!U>%34x5qr.{&$2"6JVn^Nە$ ! ~J.Hp|H(!fO1Vi%8Th\WD6У0e*Zv RNS3AFE``Wܒ ̓Qs4tAܮr|ICK$ N;+T6i @VC/[-'9OٷJ|{,4P'B9TȸIJz唤~SDu}r-}+'uӍ-alҸZ.;PB_ c!:J\)႙�<0B+L<;}SVH 8 0C0΀rmeWmmm[lQ#H0f&a$eGHds.,RhL 3:X5Kܚg2/:dj#$v<zѬ_y]^|8700dP8Cj{$]*-źwهԁZVt/flviR⤌f.s3:W=lVv;‰Ѣw[I6s Ɍ2FW?o=v,r O Mj<7<P͚[Ҷmyuym`@,|Û+_D||vj'JlOy̎U dGo5iUE1ՐK9SȻπJ|/=ݴ(ܨU5:~xa^X$ԹE)ev!@᣶|B3\wJ!8C}Aw�E‘\7Lp _8Yc` @a;s5D$] 4xOaa&J$ Ƈs.+(r6J#8tp FF8J8lק Ȼ֎x5arc(N> ^i\qE8u!tu@%@a4[9IqmiK#Q;gQ1L qn`w.[3BDaOY["|ǎEZ6ɧp.2s dGWQ !&1(:68a+NC'{aFLK:,{% )d !8x{ŝ@V~; )MNXx8V n !䁟kE \/`>]l^O&,)4K v;j C�"x 8 2,L M#b_(J27ٵxqNsαw5Lu {#Ϳ.0NM9k^5ih�LiSbzzzLZ rw_c@24'fŜ*>zxU;ku s VCn7]Yd&ZVkj?#9B7cov5ڇ(yΪUhyu]-ҎqW(/еGrF`wA47*m̓rg=<p5`cQΓ91}<r{1.'zMٮk4`" P!<4 utH@ Bg>8(W`w:o\&2 fJ'1SB yyI~+3BJL^\Gm0jc2l1|: )*H:-A%)q B 27|ml|WKdH ~i1.47b mϼˋ?BXѼW=x@Sdx\[Ǎ!Q&lI TiRC8ziP+IAN h3zs·UN<, H,4R9u4*uTQO1I2 3=*pBJC=hX"- É4CTjpB/ zVЇ9<w)^~Z[v'IT.hV>+x~2] ZD(x .FpRvh,QYnB/A3� $N|ހ$̇Vv'Ȳ77\9.}q;*AbIսxqfJ֜+4ȲܵKA-'CKՍ%f|4ic:N{mYZN=�YGRUծjj!ŪѯzۼV,q#kTrҬoj]Y$73=ʞ߲:#&\ӳbӷ,f͒0VEͨQ[Onwjߤ{Xz󭻺kQWʱQejKҕt Y7 (p75Mk?a8ÎHedOL; y,#f]XEk:y&~WSxN9R_.O N|P)xFb(1Nr;g,uyk B>40Y8D>C-Hp)fE)) uqTVd1|X5 RPi.! }u:E_3)L dBq%$>iը 3C-3w[Z0ޚB&A' >0k6:IФ!=>0}Lvf;,v�"l]T z|UY#(f >CD$ .)698\@ '5ؑTfNu7鼑%.ICM˂8;E927$V5JR' )v*|K?mgW[$ qFM�\ Aa``LZq 夫4`<̼S8w|o5{g}TxN8_ W@/D@͠SZoij>HB7k%R:Og· \ B9?hp< S ~]0:m�/?ddJd3“CCwV0>-aga�NU]Qm2z?Nل4xJKKMFT)})n['i,U#2nE^)oJbI ,ۈNelhq LlQ^BP0=3s>IW7~CջUL@oW:69t:=P9Tsw~LsOxݖ�=տ=gf*Y~F^=d VTgZ eR4. A pC*(($%sΙ ~߅n:5QXӦ"쓘q_ KZK.shEP+9X> &&!t<p٩1 +?DD 2`XMNS0FV{g3~SewAGG)}$ `RV0lKq�}ltg03g6Ɩ$n+{)f[07H@琝%  4 2A u 2sef@{6b9\1:!"xΠBU9N'hvJs?Uxn1n56' o]WlX >R9^#٘fA>e6 Zj3V?zN,I܁g5~(s`* `e-.ao -P Vp.LuP ]p) zX%^%/-pgYT#ujZyi=ؤ&R0Gug݌DfώV7fMIִ4յGӟ.ՔH$̍-yQ_=uݚN_ʟ7,3|X M Zyo& IQaށGf[El1"E F0C?p\aWngEuuUEɂd }gwLtz~}s^oYYfK$'ST4&s3?gٓW:1h]1$o0[\]oP咟\ K`gʗ{]\jpAXd'$q@]5){$fIh.KrG"bRh<dL\ E:11*r AVE0+N {s%E)lLR4y$/seˍ Y.Fd!Tl85p\kX1֭/IwE'MXZuWm$Vl8O}ohFBO<H\sD.i얈\IO)blO\&i,TJeż4 l[!ȇnZ|Dž4ȼP WYjP! * ÃE['3&CSݠ$ !? _60DZݱ5'Sǿ;[ר0:Z9Q)?|]㑫tz%>~3`gI)d*[dTC#L&�ep453*h $Na+y*M^m[[u/Tɯ>2`~vozhp`+ZajDقGV0fXs ,'O.EV3ٛ_,qo>(l-K$CCCf404B*Z&'''z{gƫX4}C!wbsm9MNY?*G:WZiYZmM06,ŦlBycjΙU5&,꺮ٵS\1Wb]ms!q~G`N啕M0ԥzRlt̞$+ZMŻѢ]E#̮:ꈡ`曔t3b6,a{N8Bм{\r'8wdvB7(t|bz>|*1MS$v ɸ`LT)3VH ɄcI)<t&y=[™flR-W^3�(xa(01V;IcF^ ?H~)>0'4De4A~\}#~Z=egRk0\Үs\B4͛^ lēd<BK7%+@xT4?v+"醉ߺK?'}j9:2.^:] 8NB7Wi 0` G+3 D \N>OL R1g!7:0/j,ҙ'1]' `l ^.L I< R *`a`Ћ[pK7Je CIIA#I%}š6~#fH{PLnEj ad z4ɤ\|2~X uWI,~B_L&WرFғ2+3a3l(X aD@IsN8 ̇  [R`"B ,\n޼YQMŵ׏JxHe$´7arB9n NSUU+;b[#V&XM>&g{Û*G&k7v3X/-}rܓ6g'Hm,o(ŻvwdZ.LGy8_4bٙVӍku]ߛ:v-̀nMT*\YzbWVG-{pe¼iYMʀRqYv֕ۖ[yexFxs]vNO[ou4l?Om8[f4gPgv[4[sȽ^KW~+|;QP& GU<RV ҌҀjAPb_&(0P0ً] j!>IU _$ZBȭトALi�\`_IjP!Kt dA#C0r@ȃ$k-S b_&43?IMLTP2{ HƉe:2kE:oHDlBeO 9!VIq.u9##' 9)v% gPr?Lx -KiZ xRMI32/E*gO�� �IDATseIT'ďo8j0 sYe@L΁ KryOTD~Oa!ȑ`Am CbHA }DL",g `|�5tMM~0Ǜfn>l9C0 &FX)[#X a Y̫'-Q ×! QD@,F02Pk Y 68P΁w087]G_&O6cq䁩릺]rDN%Ak$֒ήhJ[8aY;+\Yٳ\֬姕R–hUmi%fvbyvr\>7V[:4([2c%JI{*Ye-Z**^1U2 \`.6ZI)wu묁6FԳʢu WGF WV5ʄ$IJtw/v=lYCy0 /~? ^y{!I[V ɖ?"F*ʭN̤~d 1ɔ!?ZW'V}*j%0AbmPfSԾ ?©I<4x5p=ܩHVYNe*'I;) h9'tt*?E]L΀J/?v:Ɛ%lpngo@G#C>@5X?0rt ?O!A>|%oEAw X7%ol-Cyo;aTRkTyl�Yfva�&t_nbw`xk!SMI��<d\ :(6H*ATAU~?)IbNBl�25?l%n(*3An9w#ܠs[?pRXb(7h|nw&qLOgٞAӉnI7;]Z<p*~E& !tM8Oɻ5_R"&1BŹ;~섳\�`CVp*f7B/(P9$Ұnῡ dõ|ހ'D!#HpQ4eG|ӞK^R-k1Cf2c_,3{?cKzthr,j,tj$N[KV1H$4ai4t9m6ǀ_o5y7"$JZ 5N`xxx { rZ G!#&ìb1>?fފ747ڏYH38`_\UU+>hּZޛ0cM®PU%Vn(WlBw{%tv-lO|ѣWS}qS X,;&b,ȕ WCNEz/?w?ǡ7$,\ p7A"5$ѓaK)qUi2D@0Z WbBc5ރQ.:>{hn nћ/٘sXZH@_ks祡"Ӣ0Ji(I,&"x )NR%*nHg9ao޳ĸo +\{aP O{QhF(9un2u6y蕷򲺊�$w8VJTE(l͉-~dSeNzV~ h$ @)ő+"i+X-8ak lh}`7t ö(y}4P#/l=Si*`MPOx,w)Iv^O=[' p yP/@ڪSyC8e=0#I ]8L/xIM}ΊPx2Kmxg6i4x<8+!WB+; 4rx.p=\ %x Nt&m0:bjO7/=bwƜ}|"_[o aXlHHӖj):;4 /.g#gKbD!t:-GW%3$`o)}z-_6}Ƌ3Q'1st: }>I|,UQLGF2l&Y>́5|Fjj+dK((fvS֤-)_6DBӴ794%Oܲ3F##WQ⧋AqN֛/^ԼӧOw\P(Fmx8F侲!{<H9k3i xWGxLdcȬA\!Q� 2p7~rSaP q(Q [`Sf['qBFΙvJD4^yS L^7`) \0#!eʜfa9(s:s9d1j,I;Ȝ\0L_R 3IZxtL陿u~ {?_[s˟} 22s(TJtZ섚0b[y"4z2$x6.I+rq%i�sS;L͘Z5"M<ʷ;2xY;rHI9M-Mg>De*nTHK^4=p<C+|xd=p< >:e/+љֻ 5r?KLO9!c$H7|S!4u$>g P)x"Ǥ6W-jwGN晭oza&< {`7,NB3!.9g{M)$JQDʵ7+z+bE@tB(RHdvM_L&s<y孼 z63[8d6TizinY}l㧁 .QK#;&в 2M־+u m1ci- lR/$U# ό2KK&&䏟~/|G5 =f=4kiq3:::88ߟ$֭[WiH{Ji3:若)eA&Q*;T:JJoGF4'm~fDF}y^i=ɥڵkժU)`ddw{<2}+ԂҏK RKMK.eZ2Dݤcļq*8<sk草E_Jj*8(znede˛{G >yoNr[ɡ͡sm걆i\<f 3ߦDSz2tBZ#jFq 3:'ԨuW6WϮr[c5wF0`{\]0ʇQy6gϴؔw֩)gFsf;::i?,pFp2*}67\rmZ;Մʙ?ucUx>t~vZK۲}8<4'ѝy}W$&."ډ;lH9Du?^k\Od5ќg-_MheQH/ 6N A_0W/.Ӥ¥@n';2M> oRKO睧7fnrXxs9GrGK~ɼj&x-T9vcYwJx ib鼚ĝ횴Ri2؋]6)^F)`"1000NyT}52B@G6}(Һ '?%AEΚ/H,RΝ;S$Pڍ|%)3?Ɖi}NE7^Xv~4g2>~M 5Ktq͇ƣȺ쑑t%/9A"NJ?e\sO??n0ae8ݝYڨ(wl3ΛiL,L|A2aULbJ1֔ƌ b'M7E[02#֖c#,j<YY`\БZΏ}2><f꼏 ؚh9S @4}!Ccv =ڊN36ɢ+ibybMbK3į+:w;n5kι_ գ_QTJx"T5bI7Bcz ,mO*Z*EeWF69.(K]b]&LwK`ct gg8 }`N&\hɏŎ.v{ZL\ZWZMO\<j6F=ymS4'6p2YX|toiᏁGfϱ#aOR(sSɝ9p|>$buM*jy8#g|(2G0.,z]s`i>@]~jaeuleoY4~=.$e/.oSqi{g/Z^2+2q%+6g ټ=gY|L 9Yس ׾emzoyMsԮbllwhh(˶^Hッ===iuOl5ʼneT\.%eNQ>C6Lfǧ4_bw_}ZG=em_G_hX~N{{% W tT,ӝR݄ꉅػ+{vw^lIߺ՗\ϛx(gZUN?i1 遆Ȧ.@cͼ-X>b:1\\im$n.(KCebk[]|g u l.J6PI1m#Z(䆪|L?~WydVnýs^α9n'6찺ܢrEzqV(7q7Q}kk\F_ ,NT $~Ku屼Ss|'ژe+bbqNKbt*~ ܓ8Aq^>rqNw޺GDAnEy|lXӤػ8"-.fvbN:CҒxU/5E&'$XtH<.ʣiWW뽛ښ =%aW}}545l~\Xy9Le 7DnJ;=|1ϑ0H 3Ts;xeo<#l1n"?W/2F___E)ҽ$aLiNCv.˨u՞7lh8GDwA_,jQ[[UwUqŝ;wtwwXtT�i3TB03kqלQ,nL6#L *3tiͺ#-Je^y@/ T$Q{m'o;{-rnmWFes5J<|eq j?U^M@*yll,2-QŻ{]^^LfW/G?qSt|^_(ݱ׏##0 'ie6SI|wvʧ|0S}zM)oqlܜ:#]89ml[=}QE m?ΕFe/3Q޼Ȏĺj̚dZ/6]oVA{c Xfu@dB}͈]^PWvz?]#]uf4[! ?{=ľF7yg+%ȣE5 h%gt~yj Œʼnn !t`Ϊ5Zuy4nD =֕7'Fi՚SS#b`h_s^xs+9H `QHWKh8myWG.J<hW]-s%t}1yѱc|!;/Y,#E3_sG#a>79,6>ʁw31=<b'Tp42'.{MqʞʽT?w}宺 'nu=Ȭ#7x=Κv'S#,Mw{RDb8S�a*�:IΚ)NythڢiɘN2M}/x%9euJxͺ:\!;&{uuuY5[&rǽ wٹ|E'tyǮ~qPnq_<ico;ew[RBvV{?m&~Uk]ora<ެ>c߅>3wdNKB;Q46^h&D?"dwPGZc&2lz: 2}IJU#&sۀ3b)t@,K$x܂ to')pW悎ռ1pV==bjK̟`$ӔWyz $n⾢8IcYK̟QQP1y_l[,NlksjIL#ěC屑~7:\KC !-DhEh];ZYԨ~Ԗ!ɦJU{Mс.6y >GWaW㫬3Z΍$vRE8"8yu7C]$xxƬؽ:<ƨW?}m>QE8� Gag#y/Ol:"3Js7sb.ϱ9&JN`y)#U^:^\Oso9xय़nvO~fO4<k]eE>Z(sN/ gvDi)g6UH8)v[*vRSx3\豗MEB`}K%33f(I|nqیh>cן )a(T@KlɒYܓ.篢; ԇCO*ٗn;̽}6U3TI]Vpϱ w9 qkZi27ߨ,S(˙T*Me04QRg$uiQPKh1meNEԵ 2֞⯉WGVc|i]9K{`vNY^M ܦQ.+@»Y1ҧYЮٚ3&<Bnf#G=#-Mڇ tǮM,WQeW?CdflCbL |#ȏ;=Av\nOTzh俋80KsTgbCPPcn@] &Ly_qdgyNN~ˬC-pZىX.5V r"O=Y/J9/|$(K=\Hs3v%s:g~*MJqȿ~Fo`$ B }$^l-4^^۞?Ѻqb3`?c}yuyeeeKP&pF 2OܚSlڑN}JB: K[:Oij, N^F61e ؘK^kuӻݶO :N)#CӞΙP/#~`yBz:l dslKC6J)V~ \ Iκ2UWS9Ih47uz9`֜3mFg7fEqa2ّ'ZX̖FahƘi\C.A?U5bD~D刃"\ƌ3c.:! ˈcFm Mr#T6_2+͞nNȕæ:<֕҂uEۋ6fd 3t ]99&>ɢ̊<_mZk9`4h(Nen�� �IDATˬ@d;m*:1V}C&-'g:}T,=W0-2qvޜ*8/Օ8%�u]"D#-9#Q"`4'6):_c? 1բj훷8A~48yjsq=w׺QN>6yFco/onj]\9[ysm9c/Xwl2ٗvNicZZq' m//n22%WN(n)j9%%Q_R{-[\[}mݎuҶ-V>ÀL; ʄ@ :d%Zc[$I˝q7"mf!8=OuEEEkkI҈q[$ dn?meqBGYR]UUURnia`Y}9 [2R3R$*Mf':&uF*juMkӎUo\5YfKivoau鞔Q'R* #ldC<nϪ};XQY`,kU Υ;w=S7P8|9|91N2+h_[}EY.-[H>!?~-p=Z7\ifT[# o n=!*ھ/"ͫŘvsmdܘ~. \X9nV+=,挂ˋVox}bBH=1;VUc'B)t5knuD.$w.G:m1s#Y"_Zo$gvY#c>RXam }0qVY C9C?KL/ZX(ʹ=n7Y6vTn`Uu:>!$șыNiaa/u3>$�$Ǚ|wr3m|MxP. $n+l7T8c!gD籎ŕ̠(Y<;Y"f'e)'G0 .s`{qmqxbg15kWzIK`!T 1q7gbjkkg̘1y䪪l'1Zg]2&&W*ܙ-VTL +["F) ]vd6rU۪}YԽ>縁Pu/ b-]E~( _:'´jn3oIl&g]Rgya*2Uw(oMb#\[1j8dm(*X!skU&L\w^(1~ZjX:j#s)鿆5E<+{m`Qjj{';Do޳- ecAޓ:x5kZlQpQtt=G:`+y2#ToUb,mi k,wv62fYɕf}a#G6=AD+H03oIhYQk }>pGW#7UxCbX_E7zB#e*NEy7+Ow jj*l;59o Wp}hZ`fd=-a<Ζ1oU8?1s,Ri.0w|Mo79U[58V~;nn椼}b1 šp>Ǽ86[v {lNV6p;?d_d{hs dz7,z]Ia󌕒O3U RQFtU/{e8keKL-j܂=ckeSt*eV{ԃJg*{B43t/}uTē7U^^Iԫ qBplSRYigEDeRݐtIq�J582'3T-nIƽY}_|gOlfgS=5)62x J}3nE<nOVfZ]]F*V[[{QEⶻµe 4K|;6dyG|;H"38c L ASC'1=4;DʝYkjاnԯ[lSG%î=sLN[0ʥeD'FuƆH7S-uYҪ_Sbmr*-n7iĴHGh4QҝwEe&=[AWXFR[)g 4$V<?yP͉$֜DH95\2Ʌ}5GNEf]o XXڑCb剚@MBp'BM{d |Q'ŕT6*YܣwԦ1H@0򜹁g1s�` 9~x~ym<K'ݔ,{`jO卾VYgcgSH sӨz^3cY 0^?:Xh %UO#{5Iĝ 9x),Yx%Yڼy?ẺnUPtB_VYB d(ԨqڞUiYBIJLynոY]ilO*S8b*X,$][蔂f 1)]eH,Mf%Qz=tOʲme9;SrS7y~gWn ʃ%kdž{z ̿#ky*K6{v mf[MMǞ0zRS<̣Hdtq#G%rc (2#>ͭi Z߼AlW@Gd2;;PޔXd[a3Unr3j[:L 9]T񋢷/l55^$2ĺ>EZ[XkDr"Չe<HaMwu*vjZorQ6l[jHv]vP~nkG&osψ}ĒЗ+=ק.O&0!V,ὡ:Ck iؿ* sV3Ufl ,\~`{ 4'9:=U-XC  pV5UFDt-q/ r$U? S99ژFΙ%5/1La ]\j/z)"6GxbfA;M<nd"vf$w-ٵ Y-zgk)*Cc/SIM˂TZrp___:HyKYZ++Igͳy^S4PcLi5v:K J ([ =b|%V/]@iϺ:\>P0oS aޭ:(~!XXѹnm]VKJkRט:.>[ce鞉Ⴛa!W]㜕ə?~w/ľdُjwSdX}e.XovU|3Cc>?}G|{@ M-s|5 p봜cbLl6i'Xi9Okl[ձ#<3jo IZ]Q:cOWy 4eZ49#~GH'ʜ[1"<¯v8#'6N] w\2ǯsG't xsnkpŐ7]{L}h̻4'&{\H-Nl徜}c%KQITSb7$gZScc \Tp݃lưOEb1?ޒ1O7~xJxxV^w>9iy|o;U_sg|K׺&6wFCJ> 1do/Kr&+_OS?MXJc8rߐ16></e.j6z~GtSYG?Gͼ&v۵}+.<iV!s-q,¦]t՜ nUyyyVpd]qY(#Ҧ'A0c(˦xEF(UݭqzGBmmmV0 a?Kw )$W2nj=N@zyOc- Z>T0<<Wƕ`If=;=偖n;iLW }}}]_RG;[åUzpdw[itQRf;*FY@ZiU Q/uD=E42BJݘI9ZΘGIFz!pdQ峈 8VuCZ oq*Nv38tfn'l(ÜZn \134D$mf+FVDvX_֜!|#O5CTdVG+ejdy/P_#ux‚Ꜿ sƜ&a& Ò&:9qɼ Xf$͝Wh/xɴz QHlȹd3;D'G]_p_l)/geݣ:yK#UCGϘDL q%|7jʋ:#OsqAA..3f\)8c몑ۿ碖Bg腌pMJN"f)_hWq~0?,ө ;5f79O$>#X*a~vŖr3 | pk\\̝lRsp*Aw )Pmoexe퉶 �mOM[>jWU  JdpppjNKT̰4Ќ#dq.*-VJkN!{Kf[&]QzH鰪٘aE,bSZ0lhhHeph]U|똊`10 G혰=386PU9<m؎ t3Li z"V0P:]msw {Z:L]UrOu=|#-O^|MRide96&4Olн >y27EͩTčj/DPa&juTm3gnd= a]͉:T[ Vc_ ̫#or~~Ag;\dqWMkAh\OSхw&VWέsИDxwJNhMmQU>Ԑ+BX[hj<qw]}cpo2bğ)w4,NtBrTYSCYXx$0Y͘#h`PGu'F~Ǟ4et7'*y}y>t$r;;jA))5oGl%qr9+ß ,p9a[|f?~׽rM"ZBSJDZ{N ,S.M7rtZexs>9R9OY7RΝƜwae- rkrQ8Cպu,y?N¤zI됮( Z6FRQE7$/uYۥ-3LӢsf.lm1&Jb3lSςl)T0FRYtY "&"ihhhppp``X,RDV驦;).MKH¤Pm>z֡)Nxbdml| > rmOM1)3PT?igJsϜOߓ%X;iR]9[YYY]]b&3NHW5噢8:oXYx<eLf0-q%CZC&C&0V>TmKa8*1V~,l4i864_^Wf}6RCc=) ]*P1_t!qC#n9lMîM,VNJZՑ)9l.ĠY2g@"Ң+ >xFU8 4FCʾ*ZvĖC'՘ZScҨhٜ $Վ ̎]Xu ܖ HmHo-}=^#F H<#y[mA`n.$Vks),q7h)QNȀ jPHM9?H*9cBBv(c~lS>I9ij\ؐA ~K^CB;rD%:=q:9!t: y)ffYkGJQ1y2E$Fy<ˉ/V_[X_ ذa7wBC\Տ-b|fO0ybcdS-~Ky'q2b#, n)%3Yٲ1nEQP͘u~R|AELYUU[h^D[h#&qbE XJYziQG찴Z,S@{iZ'E1VH3V-98{p1[];y(?u;7?\:C*}u/Mwv.o׶n=akmGm.Ε-fJV[yzUg0ssξur͐2Y+4reGgI?קۏ7&v$* <IW~N%<{^4#ƻz{6339&3tnU!62_俇I79R(_?Z>06Wo0O _kuN=C"[m$t_hS1B[-a~eb؝Fcs~VtrJ}CMKL5-PGUFǎĮ $'c-*ʅ{y΋V&nsJ5ا|D3e2RǤD- Gl/Gw'ﬢD{LWd[NG,EWEGh46rS죑|&ޗZYbY2f*j|Y'pUSُT?'Fc}l6EW.lICvt/Ҫŗlg)IM UF;!/b6{.cYtZI3S9E-\]LgOҕzڷ]4Va1m_w-bYKڸWZRdÏГz9NlrELK2qVZ]e8qgHT9ggIYfRY(?= k^@s<<RZ4ye(R34pw:pP&===U*,AдggYO3mkt8sTYXdk8Ii>(Vd;HBbԙt@p>@yy"f/+`?57r\='Г3h.c|f6S;ef' =5NoV>bM<_6VC2IOP9YC|͙ݪzPf8r]YZ КZPݑciL̈u%.t}⚼ȇ{t~)DCiy5Ú"(s`#n6msˆUؼ}9m tmbղ8%zfjBs}$狉Me޳7c{8C]\AyVW[R\<Fh~#kl70pИ ;q'm?K.<:lUUֿ&Fwv`qNE츼`+\g*Lÿ};Ȧ| -.ߺq)'8g؉U=q8'f?^NOki&yLf{}F#5G;q/;b"R,n".aKyϲz*bk"r륺DgKUW<;UV�� �IDAT1jOZv{: 1R1 FX{ʳsΙ=L2HI .[ZlպVkRmպhTdG$$=3Y9Λ w a2ssu_#h~}zAO%d+>T>Eq꯶gMYY.RBPV'*yIkZǥ===?GgOE6=֤ddsv ===Y0?:u;jEQ\A=nGɌ C!i�Eu\@@nwdF>ex\.6(ɸOMW'ʧ|Tt5QCt>J>LB0yِUtvHU uneoۈ+,h C''Suv*usm2N'éTCXPngb-AnT?"<cV6@FEw0L!_*4+"PXn1fr 'ɡ|FD uQ0\ W "xFP5N LAI`pe <ނk| 1ׂM"6XÕ.48!߶ uj 7CB``2d:B=4@3VJLFj&hl'tf w,x<Z4p?.' Q#<'._D6ңY<t._P{MKT אjLtd9hpeMY58NrA`1`<\�?+uK/pCdx �HEGx�vHp:dŸ ^\pJ8k[| !3>Ѐи%\m[p,]"GU^CCOhZ q`E&Kʜ!^#QR1ɝX˝6@ZZAvuELZR6r�JBViiiaHƧ7NmZ= =˂)yL; )eďU?|3nu)( 6\\è*쿥9!&9q䒑?j%O:[,><yfM+I..@ ?YOP-j0|?|o|ܫ?T{vRl0XNS4+L"`M !2*y # ;($2ȊӮP`HDqj` F :iE a脫 |1B;(6)pNm1L"ƄLpf' 'gZtB470ds`]eS3 _(jBaBlXep =&;)*VrzB= SlT< 1Q*\Y _O*1* jV`͞;,Xut?'nf啩`?ATXDa |#Ҩ0Hĵ|7R^,0ΛGe[xi8B% P7 L>P- r6y&pRsĜIv"!pBm6,1N `:4K0v`at.С `NBx:`r f0�*a(K`]nlf79rR&O$q<LF>Vd2dKw+YE)!O$Fb,- JB}Rd*[R$²F=Y4t2DJ@zzv:E ݹ\.YZY M?ٕf_zA%a]XYmqo<&%gyx!D{i94=xߓ/?N"wQi332GC!_YmJJl=?C;mMirlق, 58w|_䘄Zవ˱.xީ>{` [10 pL0Rd CCtzXZ\eH(LӸZMj/8:AqDT1GA𱓔, hL`(ؘn.wRk'3C@lyp &Ut?&w0]0KOMJu7iB_NNˠ'B}X /`N 2X:+8l34 {M>RY)J`xJcg&¤@L; Qa UiR+Ӡ sn3A7%0Q0F.D̍ aCAGMlgYN::Gs"E3M)nO@84x/a"IVV:S@9-0 A-x7<x l 0 ;8#6wQ=+A^` oB9G Ra7D!j`>LF( Zs"p& p5T@ TP `OZ8p`;;zҎ$.cdKH6m$EB7C-r@Jf+[CJ'Z9i"GULN<:rrSzO]ץS 48, m%Y,n%@E8F3&*ݡw<8`Ɋ,75YK*TcBG06-!{%P^B1!]v#u9촷C~z~"Α=xHV<K¢ZR}t~e/P>{VoPaI؇tB*Nz`I|c1:X C Ŝ/4BlaɿT+ ^Ϣ=o 昜_\X͠70)8 {1*04*lTȁLƀ! \ a'`D#0Ue�bݴD=u7JĤ{DM>9 q^5\THw U  <(zv&xl,2AC ́LV1`0 !(df82_],I((G)\02ħ:M<yoRܩf18DѹIqN65͇ȧ<<Y\|=_V<r;m]&3 z%6sy4~k\=pv.gZX\X/|[ϵ7ϩ? }f/ �yܰtX `1~@{v `_sD w;8\@P?@% ck$[&בqqt[{kbp$I?snW$.׿M&*%CGQ@:kIDrJ?nKkedaT^@$9Z[X}W #ّiOL+]SScw%"%dY;[ lhN=ҘbdXh@(<(WFUUU֜4MS剝 K ٫<*䤗t7 *ץ!AW=.}*OӐlX;V30k3 ؠ k2 6   6Ǚm Da|8q r ̄,8 Ze( &*O 3smI=b2C5Pgco%,Bǣ\`EO!CL'jp ꧻA eAm٘J 3MMR`|#hi**&AF!8*Bڑ4\0p d[:X&C|*H3+e&OpM{3/1^˝lr_7! YY 4@sfާ\1r)*ת9 Rom,KY{ KA"^|FR,@�_<{GV.f\fc8a u,V^atŨ0a{G}ֿ׎gKbv`2|  .ȁB ~xFbH@e۲ 8jګT=`$<' p1 %U]]݆ r'WU22'{!$*Jp$Z!z* aq-!N?aM<zTEǰ*!. D}LI,a_Yɓ&se'JX#jjхBἰ9;wD"a$j֮u}˰]zІAVT6-.i#PPMlН}pAwmBWW\Z^qPsFa[d*++BBB-27dpD"dw>.!}+Y̔#z69{TZT+s,"f beg)DWTW &XC\* uRgf\pNC ga&?6 t 7E1#P}L #B:>ҍ lWO#-cdn7v O: _xRM( Z]*A¬�gճU:𰃹,1-y:dB@W r"qb.ByaInz P[eAB`Ƨ&OBO Y#ܗBqWeJ#v26L,_Ie� )m/ m̝s/W10gIBoP? _@5y L_Wy)8>|1sTA\t7~$RGyF|5ÿ :vPa8`) mp'@<A+|Ci||pĠ ~&ޅCta OA,zX 1ǁֿkdqbXπo'+ȍdr3DFFp8ܟ#nrx,'n}% Y"ٱ"YRu<[#-I餎=6*7%#btrLhYKvV*PP('Zޠa==WUSByD]3YQ_tPbeՅۣ0xyqwiwWYsS.׆tm{b݌fզCvWkSkg?u\/,p8{zzSے>꼪TաڋmC%?Z5mۥ1|nƈ%o XXn5cYyѫKeĊ۾&DOmCBL Vkv>PH(c _OLk*U :A=Tlp!Ǒ_) &+)SC 5Qe?]| TW *5857~JW^Y`jH0QaB Ɲ&9>ڻ,HDh3-F >ոEtcSe'l ]!2MP_dO{2Y�qNX0< vp� a~@A(Y1WPeILj&`~:l<nXhyFvZvYyzJAlTY(_ڋr&gU)MA;wy8NN�500[: /E~D7JnVSLXSkd9ʪT͂A lpUN 0vk0 <0Nv(p<ca] t5N= ` | ah�| ]0�h�?LX ip5kքB!M©yuɊcZE[ofN#dpQteQ$yݪdб`VԌ,mu3[(^dD9LgHFd *zC&?( È⠳刟L!򳧥YJ2[ʄg5%Z,?N{HwӜ˶ݻxyqF~d#èb+\U]Uqy՘p}i+w+|+ i4Cg^¯ r¹6y}U>KI~:Kêcl6[gggGG3f;'t:^N_㨕h=} nk-͑H$bXJ$o^G".J_UG΃oўF�v^;7ʠ2AEq V'f\vxN]0VL:B!Zkq&uCaƽv䵒eWСАdm' A( L9)DAm B!m�!#2$f`v숰_lS^SC%(~oBDSfkx n30$xCW͂N4Gp nocT*q^ѸܐnOc&|q&p* h` ^[i߹C A(<&2qC:()-4n-s54eA[Y5*IF( 3CkkO د1bAnd6H{58XԌ§'pqk0J04 (3 `l�`m+x1(u  :dX �Q*,x*p�+}hsb�A"/@;|0 Dvp^r"i]?{Y{+.(\](^>vkn#H$JO]�SI󳔓->g?\.W(=jO kY[-dve4Liv{4bqL0Uwa~=*y]ƹx.dhDZmW5]S슕+O,]W*7"#<zYquEܛ)",К)_QK)*O+r9,RQ~|sџf.Y2'†RdqQic ^adLqTR`B$0ƌLa#+nȂG~P`f :*41`�peXZAq{a�&: Z "&>As:Ȃa`Ie: A\!;c /0&(Ib[ D,,A; ^񛌇F(tNna(Ql6hTxnO9כ{[S`,6B̖B3V |Pbc>!k„**ba=+*LCc)lTP NZƉ[ɶ m$ e 0LaY&M ֖Ӹ10Ƃ0 lw4@<a,̅0 j,.0~P{a40ބ"l$C5q C{B A# ]mڴfmo3+3= AUu9洕ԖȺ$H6?ՑtI>]VLDJ=pX >l,wTq 裖$'sG T<w;3̴hQz-&%!dq4 n\.rdu]� {Geugehט>K&` ;Kآ o⒊ 9O<{=p[5 ^1Xe{o*ݜk!^;o_iqu⠷jvUg ؒ5,dBHX=oiRZcWWv:^F[U~TNo,VQ3{.'oLg @3gU]=bJtz=O; | khL6`'<M ~`qv48OpF]!]aQH3B3.΃1F�� �IDAT1 d6&srp k1ptQ=E7ؤqlzXh?qv8i 0 +  wjʶ1p LFxR0He9!!޶1B _,6X  {& R/ vNR4ؘN8^ c,RUpmq-͕CSv:T�R(D#>D[/'C*[YܽY<q&ׅgxNJVs.F掕rEa߶i\YrDW 8RA聗|BdjT-vGv'|KiPi) yo4f4* p oj +4FB9 A&"B^WPpB'� ~?p#}U,ޝ=չVNr'%%Eb?}``0 cőH5XJ>#SG%L_7ݒsݲ;L"[a+jfyɓLL Á@@B5dff 2$//Tا7O xȄG&aﰿ)0Y<pLni}#ڷnk(8ý ^YtlFՍl8C=vPNH\.xN{ވ+w[gu6Na[^?eY9ot4>Zuer;24QYҺDGn1\J`v nֹ .QY v E*B0,E&;/8d:U66j8fAʈTE8DB#{ APPC 3(Qb#G:59LMwE(12mdȊ.FCV3T 7N()P.x5vb\AJpr46)?Y*~k^(<3&R!ՠU0KeB6x(]Ub.!_MG BysRd(hKTkpc|2u˨Y K@V+5 0__,|F{Ѫʯ^nJ+N6Yb00  2qp#CXȤMc2, ,-HnVWp dMp"ԁ {0 Rl13BTٸRPH&riP?poB�P [8<0CB � VuUZֹ,D{.)ݥ=z6YS;i4rA#cQ]Z&VEKCzKՔ+- =]]]CK]ԒH*$[c^+!veӚ'$e X~E4˝ao]̔،(P0 9cd%*):520ⲻC9hq-9U:rvaV-dE+~;fAMwi</Wy5Yfb1)Rl {xߏw(/vPف1q͎Uk%-+KL&06ɏ[JN6U),fEQ$ Q0%SWWU¦T 3 IE_pn`KczH=M4@TP0VaI31&:\,/8J e#!SI8dO N r@5QI P)�)9Y[SI1jC(^ŘYa 10B[!)4 ^V)(.;v7e iPi2X橈0[b)* rol %*7W) 5iQ$`Gx PcRp_-VhW<1:u*xȄ6hѸL= y*??-r6((U.~'m# #- Xq!]Ctw Hq^7 :TҪrakhۯNNQ *O\VByקjvVTç6PX�*Yh tkk wAhp p5*8�`/t0X SY(saz90YZ@3[?~X 0A0פq2L8tA `6?L`$|,>)od-f2<WnHe!"[1u"OPFM-ԕ8-A٥BdlJcgdɮ?']"!+S88Lh6V SSS+VjC솙 nT{bm K6#+Kr|gDᧅyGafH&ʵW7bTGd"OiM14\c{TUMJGfԔHv&QyvDr?%gwHrGiP6Z]B<$FU+%>USz'Mu U pdKŻ'|x&#(:``0@l8+ ErpX!df7L N 549 A !8U`E"HP2JM ä>fѡ[Pf/k | 7f,b!^1(DcfRAxlGNCS(<b} Rt@5\ kmLLMa GTFd`8uB1/q6zLC P!C1d)D@W k5 nV) EJ,=Dەu TV kY3-D}ƙ|R" +fuTb7L1yQጩlM0UU(vnWƗ)m rCʠbק=ll(z0c&n!CCxƃ;9\ ~`6t C>\LE h \n{,H)2 :aR (P qItB` LyV:pKngֻ;YYoJW݆L9·H~TUb1K(%Í4^&bJ^2vԆR# lU;7c"0*g�$,@qgZ ZBKKQjneQ#&<֖q(Ò> 8[fdfXpy.WY5Hl)R,OGW@Y3<#Hi˩!~3$mGȣ=ux<IM4g+K"9h&^}f%I@JeޣOJWv2㧙|wucr�lctaπ^I IPūmpܙ3M0EO;6 5Dj6RdrP0QeηY0NMcή,|휣*w)dFQLBw ~TZ'Mp-tY07p``]&R\('LB%>srY*08! )xMZnP[Z{u t0GC*a< ?<crt[M qKw Lh6x6 iH ߃E$GC'C&~Y^? ޅMIfN/5yXMA'/Dp^Oh-V>>w(_Ae0nwG 68>`(ka| @>Lf8AP Bc u|p5a,�A70d0`ءW/dȄ0x CE7e|'VZ\uϬx<:uft;y5j'O% -L BG{o#iE+&~ ڡ[]!ͻ5k,LޒBȟeI}LSX=U]37fja%xeVdW>8#kbXA+2cE\6q ^R3gjT|DY.SKƟ咩Ʋlh+S L&Hɒ{Lf6O+dlVc03AX#;'8 qTpBŸt~W$lY(ԅ"`LW4Q i`&ءAaAZIj\'%i9,Eʟya4 9:۸#Amd|dh$$\Fvsuq*@%ATVXg7 < wP&&2ؤ : јoAZ{CW .F^K:a)%#= 9H'xLbq.(`q#CaP [LW{ wژ>qk4,ܓ`A'nZ"xM^X h~,R/:1zހWiWY ax(!aʠ Ap#<[p t6 x$ Hj�g| X װ^`\-ɰ . #x_0΅Q_RaDI;g=7K6}[(d`@GnKŵ?`~ \dzu8g,F.O.eԐ@48`V$c\Hr ?*LӔ0l-\P'Tw =U&RXؒmJӧ5٥(Ji^助mIıkwq}>Z?x14[m Y4)DnhϚ^VrT+~$3Ƚ<ёUUC8! kgR<cN'a(1Ѥ^%WaBn&`K3 BDÄ1 Tw>x~ T{qa9Nn!^pȃ_e8CONn\ќKa$AJ  A-ӋΪ;=eg/MDa 2h%*QJ@ M`S xd2` \j瀟1a` x vdXʙ/;K)8EN'l<e޸giC0AwrPluA�0UPC�( g mWRHj-NZeju~:=0S]؍l]I`!~DET>[@1(F4z%pʣ`\ `~9/P/:5BrJ Ά;@/u(|'A>{a ׫q+KA3x @h@%`\ p9 QH$6n~&4% rkvH~8 Ѩ0ŭf2GS,2ދ- L>ɶOGd"~eKG)I ZohzH}2liL4OFkd4yR gZaH$HB!!Dʘ;ҕ0vױg-e*,4KJgmͲSxpr}53NB(A@ADAzr.GEJSQ"P$@zvzOvo3Js~ﺸ̞Y;k M#88|yyy H֝n+G<4"RarMe.K@-| "^$a]o /') 4 Xxļ$y:FHϩ UQQΊ=,ašZ졝B"p^H^!HiM)!ͽC&5_ZAȅ)25ejd�vy%gZ.J|Jki#r\ȯKY_%ڛ 28RM3\Aa8[i~É<GY_=[=Rg}\Ti|9t.-N,qHr LOYyA^x ꘔvJ)vK gsOne FsUޮ7ɪ1TҬe )21kWVgclOe1=ȾߛuamEDvF C [7݌5=Xk}֏ HY1ҢnӺpyU)9ޔ8i7E^i'fFvPD5Ūtib#E泍yDfE#@泄A%W1)̤bK_90._T=̹bG)2T0$;w.[,DOzq>|СC*++㩠}<]HPcJ<[c+qOO^?_'ÿ́/B Eje˳-cZ7UWyyzǻKl6(<%JaˤVQ?7'JWhg=+\¾Kr tgUhX{kWτmȃ6G>t\iڪ/$$|4I r&<7+Q̘X? ك;>zYSSSUUU___VV6`626kqEL=$6)'z|~.j"{y%9Y´]Qys-1pG]z4dj8$tv#V+BYg2eZ^{e>gA9E rYYPw[#e3̹3yM/JǶti+RYvy"斫znDZLgzډyEw UE6LaYʱ\`4y1Scy1쯳WCe\'Y%}&9ښ5VNZg -(Z( R*:Po.'<YX2nwFFs4L9NvS^>wՌMΦ"9'w}g{XO0a.=0 M39;M6ybWW&ohY<GH')11~U\l&Wvn*V0Wy;P |d'- Nz;S[Y|ruuu흝4U̸4hPcccW[G3b賷MɐoVP.Bb6S�Z ǚ_hXSZjR?r$Ţ>ʄaѱmU55r-[WKBIyUr44Q<yyXlK#zӽz&=]lA*NW1ķsdLXXc  Ϥ5 <r)+Rv+~xOݿ@*y5<lgohfd#4kTGz"gג 3""CLޠ.X@N;CZ:t?Zf -;I);y^i+V˖ƼodLTe}l&z&䴆vmpJɝ.dc#lʻ+2jv>2j"k#Y-iB#^;'9ZV>6?u]Д"|%$|zYȚȈNP'# \j[yh ]I m^oBG׸=?~ԕ }JC?`,gL~}RRxzCoe yG89L`>Kh0~G9<6:4xQ0r',⢸+LY7ȇ""5|Yx"0e<ʆț�Cdf,2݅_ʸXs~1#؏~%vWn:tH9)*bK&B('2\q,Չ_2*F#~VxW75$Ne+Vn/V?C)¯,<G&|O:(rJ::_ۋG?1z؂aq};fl:jS9s�� �IDATH_>RT<H>hР>}VPWߋlȻ0ρ2g2K.:i+zFۢ9uҴ<0(r#32Ŏ]&dd75vXVkTnS dzC|Ȼ*\rS"FiUiXC|ע^ 5 7-P ff}½!ͦ qC#9!chʧ|<g#KhcVO#偯\)Ks]<pST: sfTf;aoC|,a^ȘbC.}=/W(J"=|פv=d@Wo2;59odaJNet;85s~U/ h*^Ф"M :D`HWb"Qs\ij\3If4X6'|_id1x/wVu*f4y m4GPRnnMXąL=әLtBSؕH\&B%G2dWd]Dy.7ۆqޚ/]oBs\LٹqśWD+y.9t3V~hA{aǃ m?3_^)ͣjxQ2oT$R;x7]9j1er)kͷK/GyyyyyyK6ߔN7Чh &ILf/$yNgCgd)::vtڇW.:32k(ni{ZƷ>tw7WIG39H*#[tk ?Ӥ<#}DCr#U){"NGR=֏OV3ǏM÷9S�) Tw9w!> g-s{ѣ܉k:3x³%6Zn8;Yo9#-'⦡tvUQʑe.64mvݾ9uiO.rWN{I#sl}.> @vWj mkl[/[f@[Y 0oi _F..TveNy9>`!ke9rGϼd~5I99h C]Kmy:m`Wg]ϼ@z^.۸E)G2No.k 1i÷7_=]od=|>22׍[gQ '{'SjB ȱt`(0tK=)v <rUh'EzyUqxg%C84eF_Y&nenNc=Ws;3YPÝq:_VmL} H[lڻ{zz6mڴmܦˏz\.7pI-JJGQlOF,O \.WQQQZQ}q",I% LR ]=xkkk0AE   n zԁo 3kOƃS�3CZT^ Ë{DłIѐg%WSwzsP rWIgӑv¶$LRC_d2g6ۧhKHJvtt455Źj=]1#v,&peYRʼ3Y) ыW\E#|ηdUdMkʹ)U3&xW :,xjGJ:;nbۖN =iG*DKNRh T+ezƜ!66p[n>-2vyQ9 :^{HE 4_&^#25#2=`’|kd -ei#n,*rV?7jؖ턴!m&Lh_TGN<vd$ґsH[KD*؛vf$ۑm5<ixJ{+I9!rOR*UffO>56T㱳b4{Y҃>|0[yY lPZ2+_=+,;SvEf3o1a@8ݼ}̠ E%yȈNng m۱hY-,!J6Q^2p3{Kg=OeF >o|tãEl�T8S;/t}g`O\q %EO*엨i]%IEAQ ;a%F}I@cgyV(.w i[Ǡ\\o{}){V%K &GZ]]+F<="2+6Wg4Mnq3wo/JKKL/ljV~xv훼oǧc7.n ' HGeuaiXnE]Q? #N1,YJΡPQH=}IC---V,z3 2vpne*++Yb+i6qd2=/h fX( <`NP{*DFE~ݫR]fNrn'3t&˦g?aZ"2lceJgzy"wX.N;[w\vbȘ)V@WQ.k{=2'Sp:0<+[eVΨyc<T<xzuc|0އ\k@h]wJv2#cL]59XVې֝30jSɹ52M%,ၶwkTvt$`d=Ǽ7C }hk5X(%1(=V}|l3~{wpwƉtFhbI ڙ-ǗYmu~n ޟY6N3b38_XidTBXD+rQ`CQ|7`6xM3bD"W2ui6 if 2cf8YˎȲJ좇=l&H <tմQGT$QHelvs=7{n3{_Wl_?O,|0 ڃIW zX"tUv$%X +9p*+>iKqMtQ_ܫ2Q$_*Yh+_Mm~IT*XBF|ΪT[č^];x뒷NF>6O&Gm_rْv$ӕ[U7d΃骴4~xT&鶐S(^XCʱFR8!O{B-~`̷^)s"=T}>/u<˝ LIAT@o _2ml-N#Wږs S:\N Ìa{|/˽բ BBqBߋ}z=ҡ}^n |s#Dr)wg|7Hu΄9|T yYB9.dZ=8 ) v48q> w@pA_Bm>nLm-UѰ-j#?iSGM*1 ƪ+X]m3xӕ]Z?vڗmN L{γru~^n^͑0.YXwyW+3l,<&[E9ygYC/@c'r^y["7S#+9V*U {3ks ^`jʹfN"g%<J>ʏ=l1s)&&]I|7Ve+7$]< 0[Xɓj2Y5R`%WFhW.tyٞ2"C 4,k(m/MR0fnq>̄|3+yDHjKlTW W81K*bmJ8I`XG"3;W,7a_9~[{TqAsզ&;g/)vZfA}A.Nm8sCuG#RAk-'}d3֜fړӂ=wbAu}cVDhYן뎮VeIgZr $E7ߍ�'5@55=Sfh'_?_u'cݶөq^/Fv* Îf;,cLɅ*"\fvvZ</3(rdͺfzgx<.tf]D&F Tؼ\S>\jPCEeBՑLGB,5qGdN^PP&tM`p䅌cfe = 9#T]RI-OY,qO`~p'ug-<^~R3~P>n3 {/ݣeG3.+YFj:yU=-ʴq`ViE3R ZJR-SZN˯UF>O{>j亼}p͟+iX[Ŏ ]A=oni #}a=`58/0r2|^:'y/DZ".RD§hc-{B0=zYžX\&`Ɖ0'xq am&(/QK-=sM>˳|7`R Qv0\C>r{etq"dT%ug{?^ QQZZZVVkzd}JDO#.$Qr?u%B%dbp0v^y1ό~ޢрUc~!XH:uۃ[G6T:Ke3? v}x&dvQZ*MSTr j4ՑA) 79ɏy`LEEE{&Ye#Qz}**fmggg,1%:}T6]hwcND:}s\7LX:}\Ē=VOe,dJ&iraXQQqy nbZBODR]d-OG/몼׃T1͡?nf ^'t~g;o05XJ{m0/P,(X*nY˜кK#3BsDڮ3!rTόjޮrj?sb۸$/Pwk;ؒviUn%#2T0:B)|SZn2og56Nա F} tW92KwOrԾԃ[}gi|5̜Zuz7O2'gƧRy tiUz<5Z@}JmJqdEbfʭu敱ʊ JGF.sܹ;b#pu(oshG"#k 5r]vIg9}5,#DJYd{XN);9<fN56pq2FqΤ fβn=#dAm :ֳ!V2 S.`%V@|iڙ2,c3Gs$YjK-DV1jvSVCU{ƿ\;0ӛ)-D"&MqXotot[i҆>pV 5P>'" -9 =?`cdbࣿo Iı^MuoծY;oL0!_B`*]Ox5G4l>asA+1,c,C={pwҺBɨ(F,%箯]_ޓN|}5on\<(OlQťUS6g˳c[*5\=0ӕIJÄXaXYYYSj᭹ڕ}W_l @E oB5N:[ށ ӓF|$˾ U?0p}mjq8!pGn5rF@>(0-!5ͷ<2V|W^ͳ rcnciuy7)*C}^KE0|99KrOX)<HOY֫oW|##XvU^㰼A+2,vf2W -ڹڵ x{<67'?XCK/ܬJZ 3)ZҎ|+p|ࣁI[ 602ʨ+<җ>JYA?z/^괉 v[&i&囏SM\W.Zw˯_J̃MroSD� v)dziwu`./(h֯Qq:y<e7D]{$>/8<E# ]bdi"&q,y,,a 89zq;(N>_mGn[QWZѼ`#C)LJ|)$&}R]t%%P3"( ^ 6m˜-^4gh4I0dLonuzֺ~}X=SyϚ)wNI7[ջwƗApopG=7!ڱlCY<}\\\꽫MG<9"o[.pΆT65o'NybJ*jx~q}lQ# _Z9`9񩉏]_8]?2PE&wᇉ4sa+veƒĭQdTĆf]C\ͳ?BxDVNah%N=Uu`i֘6vֳ5Tʅ <VLԵC9BOr(<nFhl;HM)jCAijග9èhG#Xhqo9:mgkszCW2(<9±en72<_kw9W)UyB'i;w3|$zdW=;?+眧͙S6[vx#mwg輬G2eZEH&:uAi)&*8ߡms?Az;Bٍ֣seH)p~ٴ~v~nT쭏RYw/UM睞#q'/p6x<x߆sw1c i#͡H7COafOn!9$[4rԁ8Ls&e<y:K >J;xáZYF= a 6r*`!b)QE3sOŕK*;;;8c-r,ܒ7.*O}$V_({P#.&H Rt(%EAۈr~!ޅ_8pC7b(+f dEw.R/7<߰s媛sQ&Gv3`_Yk6Szh%Բު%UAsJgY{zX8z?;:]})msnsPE_=N٬* Ym}w]{>rE93+z|j"h+ ѐR̴gVྴ伒qtބT01z:Y١]\K,=SJM87 RrIeˑSC_KYx![r}ջSBSw5Ehzm)[}`4A]ay__wx;Q\ʥEK5!~8ZX;so |s!eYK[-Nw[!`x= 3^U<@UܝOEJrI|<m6}2|ouFfE23fM vL5/Q.wU1 n}\fuyUxyȇ9w-Y(rB)|-6$y)NnfD6\O qF z}y__\LV3Cy3\r>_n6<8_i,*x>FJ@z췓c\/(!*w'2-l.[$i_8]->=WKuO5Ŵ>p%iq4xC03Y�T8h�� �IDATU^s|p.kkk? ׾ܫ]Ao7N?7W$ڞ G\0\Mg5MѴ%,INJRԫ~uM:TỺcBBIII[T\(^Xe[*WO(ꎺW{5k|^=$\qn{W!a*zֵ];Ӈ/?-4XWWW+pi9hիR5jmm%Ee&:(NUqMYNqrW'VP}V?̳<pVhoƳ,Yx_u\}RF{BGɔɁ1\v2D*ʏ9Qtp 2TG:n2XZTng8^: }N3C?cSMo͔Q)glޔ3#t=2L.clhu{;,a'w3&*Z8[u{_\ɜ?졗Fj sb0'Y r#GNo憣_Ϳv|+Qțp^d2GRc|$;Mo72 ~s`ьEDJG[Z̥RpG~:kNx#\K ;7fE4bg@ʎȠ!?q:kcI?#:t,3e0?pO`|s0d6vgSFFrh`/sš r,1Z|6s˙`pŪM "ZI1f4<5QKzWkn~نtw:R p(wǗVÛ kJʩX.n3$݈ Uh r/E$j+GܟH"KΏ1"v())Si=J0 }i}c^:.CwvvƊT]=hIL m~gҵk֮|b>ICuuuOq;.Sz '$> ⸳wa;*s%WJ΢]eM5l{.Foʥቆ7,ug !8hAVx&W;UApqЊ'HrQQQ</ElsIj1ܻ])<[t0{ NozmgH95#e)"zևlf4u\Ɠ L%VnR΋9r EJiye^dQ)O8;#)e,6s%[#R\j{ZvndSt1={ϟy>Ry/xx{l*02;RD9c+td=};</ڞu*R~Gzp2Fc Ө a'Sh?aT`LʕѲvhäic�{O^r;0wjn7=8<5e]7zgF"5_J pXħӎ@ G kx 2N 4FǨǰ剴|Bswzv.h?F;Fv0r,laq*g{2fKHI#w_b5,6]YɉIڳh]cCJt: 7& ,SYTyc>',T#TZ(�/>OIc#M'6f"]QQ1z9rÆ K_&w80441RGGGgggWWWj&eÞ6dLeY_:2-8\ogX0r*HMѭ/ع{'mۼovOcb96}t{ ՃG=7*s˃;3d0]%ebZBCX$9 ' a $EU<_6%<,LWxW@Ə̿$5)Ԅ~YD>/M{nȉQՔA,@*ݔeDdqoXqDΓ<tW*6+0RIޒT粶qZ<[hLd)rRj>1>l n$ℙ1Ѓ|32r'vT+ӡx|3<yƄCӹ%?a#|۹ɧ]νT^by)Aڴ/ g-cOpa<I_8߇FPV-ӣ^~EQ~ֿEt#PI+owm>_tw|8|s;{ʇ f#g琼[#GD`>ۙ3y/~3Ft4pl`H("j VjS=JęZ`#r;9Մ 9pQH"3)x1q 1bE F2<<Ysx)vF}bV|tEys{'q+Җ544ȵk{zzbVz!GwvE6ߊ%SRdAs )cUKJ[ZbޡRSS3xy&&Ox~wæ"dKK(tEoVWYApMǺeee===|~0;&[BeSwLn5 Aopzkz7fc F>1M5휽sQQ:jְAD/Q?'zZ6N舯.^BdŒb $}}6ڧY/]F}fq+\WGs"J|t#_ (㘴Eu<ŵLM"𙼳#ewY' N!rgȇzSjksmΧisCsYJʶb"c\]z_|[;-_t%Y첌l Zt?w|T{L&d{I=@0A xas{oaAQDJ$Ho2dJ23{7I{~_83wX"EFz'a&ꂸ̜<ZZ U@|N0C1\o xi" T}U$HtSUywڂ<ެ=eaBz4VA` vA2XpEn"bCCKsM3\dŻe OٰȍA)!nA2WZCȂ�! v 7lga ΀k!.�`/4/ p? σ.FaX *Xh'RSpplt`*< 68,=VT1,P{:_jzԑȲȘc1]]eׂ]㶏Ȉz }T, Bbb |zwެYUqޒGJB5愒%irhf\yO{4~&5Y5_D?M} KRlp3+&Vhz۝E oL33@ vםT7A"ZX5kwGĴf[tUUdɐP4LB%нr"#Ɲ1@3}XwEDD.d7''#VTB!5nkDZRHvwA,`Pytyͫ=2U Ŵ-0_*bD*liAp6,$ A C35A? f8*QhPB~NZ7Ycbn ʕK_x�)5ANAK<<+IoÕyi_t9XAUh$ ݂10CpTLP$ȅ:=PS`£&b5.7|v>GCgf Yq/ޢeP�hP ]'/}<0N3SyY? L<ɜ56280 \\ \`h87/Hxb% ́ VY0tXҫ[[ ! nAFVxL9+&� O@A n5!vp5 ,be|.EA?e�+J럞tEwm|Ws<#M$G&t:-KUU\V B=7ryrc2vї!yW}%+4.\"&&&-B%XGCXK$>ٓ?}՛'DD֟Ӱ"BtC{ SOԤ'VYiȀdӞ5S=ؕvQpLpyyb=6o8K%J4 Eo֧O7&lUmkL## 8G#e5`O2_2/}9}!-][^Vr Le'@`.01nK$Qg`FMӧy7~h9+@^G.壳aysy1ja 9UA60p-~/+lbMp):nA:6LZlL ~$(nӑ; ø0O;~ _z9Ec2lf8T.tVAY; p�՝|U?kQw>hnP.4><IPb9snUϫھZn{xt7S\IEm0Ã-~n=,LoZz@)@f@dC ,X3 ¶Eh@(P�E^ |MvF^p5Ork `6<u*H_p>s  #| q |C^B!8wha, VO C8$@-0 a C8TzI ?A G>A�U02`ī:{uuP Ϙ&rcc=5XSiƑi nFfyoye0 תvvv*-Ks%4Obg^1{+U9M쿟7 @UUUKKKCCdg8ZSN)tρ$&|U S|’7q$S/cە_΁S3ǩSJk511B-o`s˞iL3vro,ѭC#""v=b*5eIwBcM[h,8 *1F̈́/iQ(V T ]bIl߉ ~/U l`ܻ0alβTÐ^n[ȾG7́)k ՠvN(ׁw,\7GtxGD;cI o30~'# c?K<7PL"Pq+e*}$Ƴ]QF 8Nd4nB:&f@3D1E~+B�~1d( "QAkC",qqFp+%<g+ܪTO8W Uʒū;\�wpBH<%BHXlȁ,|VzQ;ǀA. Pk9D'p!t%G8Pf6X |0I2�+,to v1o 0 `Y GJ(_D�G8S 4 �^Cr(!vDX 3qp�d8ߢWͨȴ-tVyVeJUJޏy4ް=OטkIxmXͦi#93OkC; W_rZw oiƹO=oMG/9ٟejEYkd4mǴq>O^4$P!Dd}'G~1ACbl0~C>OQդVLp t zh蕻3 S/i ؛&/ɖTP/s߰TƑƑ {&I&!ⵘ͡CDUDsoӟzH0eOB΍n;b9�y/ z<t?BޣXWkɟ*UpdjL<Z\y?& X SaBo8S0y[M_oczW;n`l21 p FX.6T \'y&n8c`FRjWutY@[#knWWzxOQ+E#An>OpPG(PyW'\P ̰M0Lv!�jA1\ _ )̪A,%  !\-;,ML<aw+=ᾒ`~!YZEp�'a^cQofnalx8+jl 0Ya3:K Ά BTB;ȏs0W^CMP #TO`4?x:AKtTB*DCo%P[` 8aLh8m ~Ep lKebolFA7Vh MIM_B3B";=t6NjLݒZvME#ڱz^cqaR u;l6چr%ȊsFXC؉VU7P)a*dT{82b- iOvC6m%tU+γZ$O6+Ɵ3WƥJ2,C&)::ZӴSmV_r0gػ鮚U.7:XثiiR  w`];2F6ĕ}nKҮ$ÕOV5tn7ކD(놱A3}xߛVHcD!ٚl6c/%jMJЗCEٮ ɋp<BTȅ.a0\: !?#ƭ<F)c{ b<~wv:*@TAFCa(uQ [,(z gvnTV^I30 > 4\Qnt.L| )M`tq7(Q#,-v$C7snW⋽y5k0݈6EiևgͳLxv2UO:L$84Oj<jyx9>i#W$1o;E;*ŗk'ŦO~vਨ²,G 4\(La>d@,V(lc(̆809N�J!YZ�<`8�7Z`>,s ad.aL酁P ^2I{ @=ܬҦ, #-8p 0 h*hSC=x >ɂR ʡf#ς YpQ}OĞ_*^1-pd]ót$ItM|>j755 !-555n[ڰخs*26ffEZzЀȍ,%i9a,9dYS"E(3j/ -ňHY!`#G=:ͩ._JvuuEU hҲ럻*ΪH(OvZuEu]JTTfGN>dϐH[ l{ Ӻ"<9]ы-nkwg4fH0互i[nN8qvwEG ԸFԋ[%]3e5<'LX!PnzCU4!t3'`lKu ]2[ftMuV�� �IDAT5/b1'M:*CˬNMlNf~k] ox9#qkJ{a;$VS幷@Wr1꣜e)y CS'puB(!En3Mt^|~ &\K0Ҷ8 ;*lݠѥpl4' `-0_XLqv|s:iUp5A*B>wkü\/%Nc,RnPnUZI[ƿ#U5_~`khY+"-bZDi0|XhHL ~ynjci._ 2u jy~GX.ٺ#ErkEi<Y�l*)> >\ 3`B h`KgLeA2q`V {I ,PA./^]&Qh,8?b4cY k9[fB9|+ȃ8C C@-ݰww=0g Pء0X`?|�uVB-̄ZXˠR TXp*$ã΄#pWmۖu/k:)wYnXw1j_6hVTί|u+NzwƎsv>ulkDc)Sp2PQR�ILTQ.S .)>p㖅$JyNKҒɢVI4ˈzO;;zF?:zO=XvIY] ]%ZVS-KZyګkIx-Twc~c?v&=縉QqCgH׺5S;9YyVeLe fݽA3sM{rKs>a ¸]t('Lh)-kؐ/5 ].l TjC>V)}p�P2~c:*ug95>ݕ2-.ؘsʧl~`|щ2Aِ`nnb 574ǚ/J|8Ge|^a8a@5*Q3S8_ cfn{moNq˳uuVb֏ `=4U*cVq_θQ@!| A 8ưBt [e_)s4cUlsiZI S ̢ lEwਅ v2\Kĝ8gQ ՅM<4'$B cW/㪽sN1Q>ZpRR0`U?Z,J:Nrh'{WVRIVeOZ4Gp=,(Thn# NuЪr) N?A%,޼ >p|Ep͂A2`x`1 bErH0b Dh9plzsB a0  ۠P^%C)4 {Hp r:(S!�U0vD �3`W555n%')&(Oֲ-)-1b&Xu49&=RT*,>7FKwaJCGvbYVbXԆΡ""#Z`DcGR؂BRIRƈkn봅•7-Lvgg;:;:+ ΊcG8:us,)[RFn[nӫOZ3[&tw]ϮvnW[:;kUVdddJHjО},Z]ii[_y؛%lm` U n7{ֿ+ Jl^ WtҠ]z$e]'{[8Cm#$i3\'Ɂa.+Ku[_("Ĩĸ8,JU+_Z8 VY5*^}x։cBDy+f(L0 M &mth >n3|tR ,95)Cb"B Ƃ�738@?.;Cep3`v|Q~'.say)2s_1Β%"ITRt+e@OA04n>=KytJYP եA4yibEI)wêxR#pB5q2Pgqv(ͳbnMI7K0}0zl!f \TZɂ <(ZqDsPnSx^'m2 LȆI &dȂ ,`3!۠Lo�T" 1P^TdX rý o;[p@!p@|[`?̄0^Y6A)@;(AB74Cp p;B5A*J ғ'P : BDזvZ.k(\#g :Nw7i U.\^T6T8YQ˚-M ҷG{Dzml᭑呖`OeU[zCtg4B<b#NBV[{GZ=6U3~ϒH&rGiuIǓ"<VwjԱ(e2wiZe16q5 =pOX�973vdQQ>|֑ ;Ým۲f>UGc_rU&m[Z/3ӑp:F7)feȮ!;J)Zp%wrF!{ptuuɠ?]hgxbm+>m_ ;Sp'W}Z2ܡd,01 qc*#iib;Į;+ Y,t| h\!/qWs#_lc X6k;{+ wZO6; Q/Gj7q `7:` %sxm(A,fwJҽlA+dM,/D<^<J3$(5?gi?3o:B2LM08z717s#ʨoTiwK= |-\�@ L .M! Kp2"]vȇ=EoagY9jj=H:\ u0=,ͽvF&CPu $B!<OC <a D�\zHXb .4pA\lh/ W x@1Pa (;7d:,$XA `X`<:!a5!CAf"ȃ`+ <8χeDKӜό7t3*fUȵ7uUy,dكG/:81{yvlUc#uG)/-x 1#4^a7l4=kWZ2e3STvuMziRޕ%|bX,# $K~ w0d47[1 T;6 X->|+ ¼aQPm9s<w<.:uH@ֲ3P9_6;~#p/֪D)tWjhc8 Ɍ|_r,?mmm.>H-3nn)_;<cB+@я⩃t~P tNoaSVѹUR&ꙿӃTzy>o^" <!W[ 4/ 0pg2%>$XMw0M~HsK域F[;c:lbPb?F \𰜯X( )H>zH{n\ӂxoY/J(Q?>#VF8.0D-r`F9uwV9l3a*Lqnn<LӔ bC c8sh ᠉DS: «fR (TjC< MMpmURi|^ m0}A6sg]0^WH6G;[!@2̇a�H 9|XO@=  ~muP  K p&KeQoH(L !99tz#脸>&L'՛7=Wi\?`πqǙC6M%OA[m !woF.Yv/הTvA+֤զpG9?ƾ0vû'=1KƼ7mhk~ĸw9-Κ kF9::9(x~su]'crC-01Pu^UNl)cmDې%C`_:]" |_C|y<Rl}fE}nG X 3DxYW5G'SP?meهѨi2m0ɰ/6XbZ Cy^ָ01S*rkX0Q  źY`睅ʑ&G_E~xP cYz@ P:ͳ߾+|p5VW 8[sK:0e=•mvE!bThpBtSsd  簳[?S@ݩ*&Wx}}yk.Y0ޫ4Gk [ X`ƒ:Pw?ww YE <QkP?Ài|wP@!dB \';0"-!)n}v/|^O0~&80 2$bpyP7YW1t.6sB4 nlIJ74̆΃*dvp=_ ?D:C$/(̆eC Q!B$ǐ PE_JhkF{`0ރ@0&B6̀=3 v" @ Pհ 4(3AY:,k/'e�0e['N smȳ-ckMap(B1 kkEƂ+#qr!b{RvƱ3[|0=rXIԽ1]1{ᣔ1M Q(㠘խ?]11ޑ75]c GTs44aHh3~ԕ Wޤ-!kxRc渺8+vwwTϨ8O.N 12H;xxa[MhCr9<6e1 D+Jbrd*1Йٙiih!_l ]46KNrFQ ֨rh$BgC'gttBB[PZ uCN KOOOLLLNNc[[D#F9 8?V! VZ**SAK~4\igv&)٦' J*.Z8-`\FQ"(rD$|a[K41:&jA&عI:uSܣvDיJo21a0tY4Y$Ylh˪PڈV-\Qp&C`8G`hĐ*7Xy{4u}8[v&< )4JU_emJx>CP >WQ_a(ר F5@`4k`Eo9a$8 ~N.g(lo9 @h10* 1rJbZ00`!e!ʰ {m_Cey S`Xa-L=`k`-CC3dC 8 v{lrz3`6lP )?@-@.xa*Dr¹&T*WQ7Ÿ B& oM FBW-;Z~uPķW j?{P[5fxŬ witG*qW^'=I~Ɩ TNx؟;)9ZܻZ1GbOY,uhԦ)u(%V'6g4 Uj{s[M.0dk6-<{{@wL0&δ-i"bC4hR7–-[}i>ݪv.2AAL½w-S>A\mvLև tKJDCMn4% MG=4VG9 }Ny1&ѐJk e0ԍ|y=Re,x<%X,P�lN ]Pw ^8 |=YϠ!-pk^?E|<7q7QKfٺzs\jq:5A4l**Aa{LcS˨H*>; !vO=o1 Î^Å,63c,vYVp?^`lq&@w/a,,P (0Q[zp1|Ye\*$qu*X&"444 2�`-BTA(kTN+DXBL6y�*xDP!x^:ܛr;L/@eJA' 2alk`!087{^~ACd Ӂv k _Xan+du<R`� fA6z' Š$Z7,M2aZUϐ`"Ęx^ Z`;!`/? 2xxc' u6~X},cX$WhZsZ 6敞^:3*޼wmN[Ye%4)U8QEj#@+ϰ2ѱRjڐ5C»+dCqߟ {k/]cČ=0wO]:5F$kn,uR><L_5h@ђ_o,@v-/.P]WEpgŕ$H >/iE+T-wZ(Q^$=8N$)|?0W\^]1|;4hT ӘCjN6M8rѯo* U|p G62.5r! L Lk@𦉋/@e_U.IGym�oQ:ҡg A鴭f&xU,g(Pp"C,)J` P t [n yf Af,_?�~xrDqe]�!BŽrJH*P+G hV6`3K7aLxpz,V= j3 JA-lC\qAO ?m(SK G0fb8 :`%\ACqW{ "Xk7A {@1`*Jpy[GAA.t2BC(`;!&4A5tA'̀肙p*H1 &_L`;Y 2n3Jyx/ɦ%I~C7.XyG76%5%mn{aYw_xbck%V9ks 5j4saVd{ %הO*`/QQn;YN*M2e?R$}>N `BBT]T=%$_wݾIfGK?ߖז%M2899*�� �IDAT6c]5?+=]q~Eڦ i[ZusDkWm>$Y<,,,**J&,K0 ?!59<4c,Θ@(Hrglh|?هq|9ˑ6I6}| ֟vW iFpWfKal,Iw67Y2SȬ#2A%˻;JYA{>bU-JkoSB\?峧o#ͨjɄMa)Zp}*81p['_g'4qo:WHUANj^ʫxn-2WY_?u DC t™6^}r'ȓfչ_a''6>.R QŰ^/ uއ_ = ܙ"Ja 0v.:ƚ)zVsHI2-|&@~i6;tJ'_"n'f8}f I'`j6`yPo':xUa&0n+0RASTpi\*Ɖf.xZpLu09p£bH@EM :n^j' Ǡ N"پd{ PD "*ggYγ]O< RCB )lߝkq毐~}<‡�!.m0 3~7  !6(%P o$x^`@4P`6dA�f @U9'#CU uOٖx<~կ!v?/j9';lkUki lPW_ 't:S$e|Ͼcs(Ys<'H+Ufo☪qUE7jD^ΫY"4*z=Sn}P/^:*M}rj-ŖVK5ɲQtVav^sc#swG A Dt^;ѭR% KO5iDelZ`P`lmg&ʂF51f+gLHk-j`mV}6zf|a NVigh_`2@SSSdu,GG ND(hXȬ US;Ϋ`^yA6] L%.}ǘy8"�/ݯk@&fq/<)1[@ 1$E/ml(((' ʆ#wx,\͇0<A+;y`ÝZ9bcRإnBfB~2oj8Ht9khJm� `iW̿n&sKn4J? nLdF*GnLfJhtmxON:H$\㛘#Ac4F}W9 ' aQ `6D hSw@_a'X*I*+s0W]�wHC!Q ~uP #KmXcu U( e@!,d"j qw0(l8V Z!:  ^8)A d4h4X^h  6!�{h 0o1]]PBa&\UWee{[F򊢸ݎoآc㫫jԍsf8NZm2cTkThokr+5QɠUEu^SlMgh BMV}) ^?^Ac0d{vtlQ̊i0:Z{S$K%P_E3ǩ4l6b~jm>/{c6 6׌!5&[#Z7'JLۖr%NZ3 r%ZN)KTScӎ?hi_7hߠ/ 4Kα#*j;A�y7 FӘОY:IGΈ*r<+܆ #  ࠑ#пW){iM~I,"+юv\@ aɖV];h4=U#x O\)FYGO %H#o`ճTЅEl;.D2,ȇ(;{|um]]2ȁIg1 t<g X[ߙxx3\;9wGt TJ,WQvPStd9aHwd2v[?d bB|\<^D TÜNVB&W~c7_pl$Z81"q+,pnƩjCJ4bõ+C0nffa1 Ea;B! 48!1Ba"T 1#1܋,bȀe+@< \oBKp Bh 10Pؠ.hV3apr�|.l_i s 0 NdadJ:1\PC`6l r!5cYȄv`@)7dF~̝hG^_ c U^R4)de82쪐')ZRZJ*Dm~$=H7__|魗N/<Ϲl?_sqW @Y;$$t/r&X "hUCۛu^ݠziE~v{Ƽ1 ^ogܳk h ƶ 夘wҮwk{ Z}HsSOt:$籹rN\X~arfdjkkv8Ro`2z~@ckI7+'~ {L_p2E_�nO#47uaL[X!Y$\(Dޫ; Z7QVo =:2^JQ_]X I*$̯VoFpa ~ M0Ka; �4C9C,12 1)P zN 4WP ݠ.R?({gSo pt0L2r |AR,Xau'2s+{"!q :QhV;66C+b0OQ5p112YJra*ϯn)}~rQ9} W7eܻ69 ]!CV"|/7�- -*wPe͢�- KA `\MpTF@L + 83`g=x!|걙 nX�!LXN->eBT�x:P{׀ VxhN( `m'hA?|`(G` l%,\P  h`:4@dlS~ȇUnXޚךv:m云3K+gT5a-ÒN&ًݩA] PV֌IޛM D�٨HH?dHTRsdvdL~?kXtvDWGZ|jT4rOߝ~\&Np|@Y[c#dt&sיCGNG1{uNkЪG[^!l` $I - N[~5`{8B ôV*jkͅV '(Kri^}ITp*v9Ϊžle9wP 1In5u3"NO;[x(DQO!حRP}Gq(e<d~< 42pO&Z{;C(a7 ;)PȄv۸8YT:Pa %+q0?tVhxqJ {Ͱtp/l1]*erch.~ʹl.zPb'+lxa[7+ꧩak)oöS<6etIp+rHmmd[ƨ%żUO˪/Y9DHqs vx(Wh�t!(h7% 1p'| w@?Nz~PKR4vV!6 @Ԇ CX UT*hzH5*S| ^% ?Ȁ-PIp%�^8hCcx*` aH�nT + qXƢNa4m*T.M`Xx"}`5Z8p:ҝ.+u?$ⰴgc#ǽ7lvђY6"7/#u)u)[5v{'9F9BPҡʘCIPb^u/K;tV,{3LNx@̜9[`[%I6=JRg\~Ί1 )(oرccbSRRdYהXdEh?Zp8"/(zۚFˣZK7EeD"EPpj7K[)jPx;Hѳ$ S0+u {`2ijL�?<yYz <bsk0]Ga%Rxc${"U`wt`Ri:�O!=χxDe!<Q#_u鹮/HG#*[=.Cp]8JfxJ.b7v4LcCa q v`̕ *+L !:ˉqmFyB)|op귌Sin p p&&¡SʷUR%멞O U 6|h,`#�`sAI\rLe>(샷53{ 5mp;W(zȃ*w? vMWB[ala | D<.Q"~h!Wm6ρKA F`?SA�vB4A%7p)`&|q@=$V U]Bz0ճMQ]Qt:C00)>)59Ug 4`gggMcMG|")FQl?3vfx/v.֮}H!IB 9X~IyԚ/Ծo65qK/%Pc*c�Ŧ!%-rzY-\ .}^-G]z}}:tآ%וh[3^$A5UܝN><tPYi.k`1o(JuuK!I=A-J.˥+#m6h_O&(ӂ5aC&娵U(IS@oXHٯ2[5e=Cuńb+@ިW`;n :-L¨0OBRr �(XE pxK2yT)2t S̷3"!NDqelL`ϥ\rhnFLEPcВ@GqY$hn#i sLf >`n(0tQ=Aꮷ pc -*#]6.x·|U[ybO?;Q;!EfJ5\ʹ0:F~IĒ1w}y2QfTBĕ= ` }'^04 0>*=Y*U6CcuA1UtpB3$'P f8�a&"萘)&;`i ̀ #a>=p1@x�7D<[`?JfA 4B))cp6TPa4ąq0 ' }alz"T@ h&A$ȅ D(@74DJ666;vL4L&SB|BfzSRR H‘'g{ӼؐӦ '+#aA*r-IR愓 /۬6R\7vJ*XNcH 5Mi6YaY$U^|"Ehz'|v;dw#|n]8D`Cq͒*彗g|>n_q|/1#}gD9dYn0!܀܉2G%923 tuu (fd"{^v=HB3I,~BBB^^^FFFVVy^!;t5H FEp֊f j.ќTϚDkbA '@5GJȡ]dR伋5sGz|f0y9T-3Hb}X:^t ?HfG 1IJ;ȔJ48Ig$#e~yiI(qT %&B]"&D $0G6yD? L_אkV Se].uP &x(**.ј`7{dU.yIN#"K!d�P,qHf*\[BdQPN`vb*-~)ImZI,7Xu8ePIiTjVX;<΃4(L BЬT!SpƀQDž*^=jOͰ(t.0@خcY"3\plP6Qq p? 1`�m| 4`0i`+`|H�&aA0PXR q0 L*!a4yF`LWoobDGG >VX,C!mCچ~cbQ[|+U[Foh뵍lseҎꛮ$.Ca2 6szsvf%%D7Dk}h{Qii3爴8 B^]_v қKM5U\[1ps;_DkƉʼn4jV2}hO92Z]V[֣^ zt2jJ"햢(ޢ9\&kGGGss,3fׯv #Ps1BM�"21-(`5#lYRDV=G"fYi7qt%8Rڙ}ݚκ Ɖ%=vz~/$I1]vF\i|5M1c^ضg1d '&QhC;| Q^5w_2ٰYv8 ]0\fB~GyҦyҏʁ#s5odz0q-l?&+uR4PLJo%e,B/1L`jvX)3Tbzj/d9,Ow/tT'a$1zXX˽?JW[xw*rM6S`yX>0(`SHVQbZbYaH^a`Ȅx B �KLRttȃPc0Q--x\He9ԄY5 hpR`.,@)9p�t kU! g RHpa A#Cp NHt=S+T2î@�5! Uu Z!./l%QA"LW!lp8--Mww2Q;FeVlN<UkfK^jF97h)`|P"X]ƶam!](t `4sO'%?n_h˲ܑ2%>n8xդ AKE@fz%wƲEez>./3uw髮pkU,kIUխ˯o,\CMoem2;@\IޮIGNšPK7t:E2`l:vNAq h3͚'Vi5 EBz)zq"I fB ޅ-Mz~�� �IDAT*ak+dQ\$QuM$t zxׁn~|d|'BytoQYQ(x{6(x%NQT!0l]8!ÐxL8)8Ii蔃l+$ʟ9VDa Um쾛oK8}1"/"#r[R >!6OF(Щ2mZ֑.UxV`Axnyo5OicJI].>!) j$s)j<ބ5\ 7*a|�uz҃&xVRA @\` p!l87OMxNA�\2u+ FUV|{4\ %¥ (a#UXSTa|0VA=~aahP?vݐ @=I*i%%[] J` aPÓ8 GBM# :-]yKkךMOhjt:ovEɊzSI|{,LD{5~msvhՕPv0ut.ݹF:u3;II8)&j[e+tLJU.X%G~52:%%_[??@|S|B[` S71 q$c{F$^\|YXh0@\$Y3Iȸ Mu&[-pbRIRlyl(KEiX,W]m?m;'\53b(n&z.J%u;ʈ@hUH$L pҌ5ȔqP9Ub}tk }A}괚X '@pݢ$Zy"hʄZe&�Z.I&j3zͮ֯IWp=G`?"9X>ڶP~?~*vH : yYުh!54YQmU@/Qox f߹`"bꭦSiB#u2 9qLA`YAZ4ש<]C2{g a3OY۳i(HL:V+EDvK570 .eC,V!]'9Զ{ E[S.| thZxCa 쒈U %na!$K6p5ܡROez^P a ?÷H'zR CP 7?' BmN> ?Lz d@a? a(T~P ρ$\.|  Õa`X60?ax B,P.hMN8 a ,c0 a1B;T@l2xjU'%%%ƊvsssRi )4+w@h m܍?f:ck jCR1Fjw?{2evl֠ՀKJve͈r:6զ{Px~s(}Hov{L0&&9gwa3)&E)$ئX${&^j!HV\{@3p/bCQ/@h6Ȁ.!{&}B$rDD3JM(-Еnpnt: &..(NSe NY9`$I$ξ=7mB 0Fb"Fzt#."ڕ&+NĊ%\dP<yڅ6]y=2 U`\AafbgFھ dkHT4)X 5N~<[FFG˕I*ΕYgWmcbFp,N99:q%'pI*tQ4`48^Hq!KeF9xZ9ut(`Mrg<Wbj.5KSf cS OCC$C" ) pKU>K$RU cWC8Aa}6hVQe@<[%K̂xB.q L-izX/%Ƥ+f60(4B5L0a&8p̃D0AAxJP7R*ޅ!<]0+ Фc,1O1LpË+]A6X-J;>atTxK Fha C|lBT2`4: a(CsD(qR4WP�n8 cN@'̆u0Z`VȂ0*"8HZ:?v"tb`h`TT]T[<әGJͦtވItLL*w˾ e Ranǐ?@ެܹ'` ğ?zъ+*K-m׫qͮԮwJȊ%L;q[tbFEVtV7Q<u,ӮXWCQ0LaI!N Eka4xibSLCGZj*z%^DݾDK{`0ّat{mf Rd['m嵸h5E[ZJ:Llgk [_ [HOgf+]y<F*u cKdZ.xNK�cE^>S)ob8 0gfSDiH8#W0Ceƪ�A~wjߦi-y ~,Хâ2S"Af ]c^ȲDVW1mG Gn)% C!Y ʕԟWd+%kO8@\ *=Xa/#%-5V5lN%2>Bn x`p@'1�(2cP0Xe(LU{ s:O|lV@%* 0 IpqةQ.TB]QKPl&p.A8-qFlF 9GBBPcJ%zA `4‘0~#4C̅l(! aŊ0$D 5 A)(`�\�) YB5`rP 02H̙aT-]Yب(/m>zp{/btb MB (=. !sP`&$ m&kŊtʲ*K(4X=FOfÐ>;$V0$FDWj[- 4)T;éԋ.jkks quCbb74i)`0_RS#)R$QSpPœ)1hklmQQ:AƝ/[*\.F8Ӳ Y шw "G8X%'snvorhѡ؊XsY QQQ{+]ޚ(O_ch %ZQ(#z5{M6Ny^jXùhs+}}w:)弓Q)U6<^hI8| X.Q>:2UKz,eMjORLB ,6xK|FNI28Ր޵7j=`Y'*2ҀC`S6%2 {u[P U*f (Ǻ>^N,6y.Z0cx0=#6` `z!M[)\%*PzDtThnȇŠ/.8 /P2#aa8P B@0@dȄ=<< +[|+-s�ɫP#aLXn�D -\:zȅC8"n0 >[hSɀ[a,,?]0f0پ-0 ˡ�[Qx &Xx9vP$xߛ*xVf|aù[ޚUiɱ-Adi7Cv ^%"9S===5lάŒ$Mz{R$ҽWy\lk6`Bm%g:lFCAŨ[xlcjb6--ʴӉJ2x CtCƆYE#1 JAW?~}JLxuYctgv?OJaJ䙅w|D7J55HHFjv}MӝS=:&ʕJN�m1ͦӴ WdS<@- Z흞YMD."yNs5> e,ڃDRг*.i8 O%3T6r?ph畇 U`Qq#8Bk<?xSƤ߈ Z 6C0=e.*k<dzxHʼ AnW9 gtgf=G},4CsŨEvV(_!Vy.POaon>$xn1RO w%_;JBy/ynKH؎8-P0^dxnvxTK$ d6x I:uUnS5!N�C[ˎt< ,TQւo}PQ ^ L&p<A!Pyt FȃA48! `4`� e0ğzz|\χ:7A�? pnu<w!s8B% !`78c$1#Eٵ]q)i˪y=m mnw/4 3+ݹOS?(]V3FHHqF^cho-=l`қz|1>9 KH N*I1 z<EQ=OU,ŨL|oElZǷ-.Pggmp%ƾ56Xx<1S~;0=g#c73uvmґՑ9a�{돾q_z-D7G[ZF4<@GZ@M<Z-/z<Q3i&rC/%ܾ=վgh?"5,U"Qycf$(kz5m?g5H 4Wap'áL ѠzpI zƑjأc‡\z[od ͤK̟R78ɉ4nC.d\oW}I_LxvsadX à 7AO Ti* fFr]kFgOasGW㟁˪.؍!ypX\E:(T* `)TAe;L2>�C) ]w6`{! E`dw)%*,WԛS KpjN"J=lN 7u0j`=| V,pLx0 !tܥPR#a \ #M֞# ja5L!0C4C`8r`hTf{�\_{ �`=�߇D^|.k]ZwmaJ٠2O'<>ܯs}>ߖg�C:_U3!"&]n㊗dWɲYUl|gc޲@wz/Χ NiIvӾϮO?}2eiooZgu%"~oyEKR4dit:5":E_e#Sv-ەX)RK?:9IW:R;{QQQښkoͨudI|qgb.|?HF{B[^9m&g}^8AuVr$KiKj oFwvUŸ1vpZY`bpNc(A ClG(@ZHӑ2NbإRj;siGeqy _J=©2 o"{&Vƨodvc ư|5 goa:P @.|'C ӌNfehx14(sN5PKT]ij a y= BʠCVD.#Ji4͇}IV®$P FL^Xl0 Zɫ,ٮw\e?ll*)@h%HQD z^+W T( $N $HHҳf͜IxΜ9m}[xndT9o6퀔p6Sьc 'P&&(s'#/1142=B2cx3ؗ.x9e}S5TOr=,=c <2&vq?dr?PO&XŒ^Z9 331<$Zb/ƒCXqPi?"r'EԲ)9D_y[90Wz8򑁛7o^jxkN޴iӶmB%Io>!vOxysiHh' :JTlam<xcӄ!m[m-m)-i+ u5oڹm¶{lm2%SXHi/s]޵~-[z|mU"7;㭱5)[mEE `}x{d} +OF*w_W#D姖� \.Ư+-\S"C Ld8KEE/?͡k28ASuP+V +:'�ä|x~�#GTo$|DŽb_m?<K@I/м t쎎|[UUU*ԦxN}_KbgUCiy:NcjPǴQ#Sd̺,24/H*#k0 5Q&W;aXh[g0W\Yk _^lj!zU 2On3`$Gp.i4Yfx qx*&P̎&- Vtc6tsXH-){3ՕfnL@ēQꦭNy][BМ-ey-|Jp">;%y.ή;1:oENqs7j/R+'##" q ts!ܨ"am82lf~)a0"]K?GSEUI?xy^ZX6vF9(}iL,aq Ͷ 9OFʁ+8J bnG8 4Űɬcv0gOW[lYjUE{555luuuEMMM l4rS[iiiEEEuuu$d§/?hՠ-)M{oڰ߆7-}ytsJjC?=rmO/∄șG7?8N]l޼yݺuMMM]]]wRN - hw+;D:aVU4V$-|ǯ\xL:3tD7(X&㓀o骻{WNaƃ7rIZ}3Wz}P!R@s(n+Z[8p`yyy@'h$:|Qt84NQ$Dð�ʠ2 ˑ|X y(Ы%ޝ|=ۂ*3[={wUVV槫훁03r{d*9WGF{H51h߬uo%r?'X5睜Sx!ҙ52r2Gej8Rҏ:)V}ɣOn}1urϽ\뇜 MiMb~),˕ hF:gWa%gdܔVd�W2b6#|�� �IDATDP/i.wsJI77ksf<̂S~u[AG-{y5<4<ŋ\ZVA,㜘KŜU[Wot~9ğ`Lcϓ^SYwb桱̠ksI&&F̊<YL#?_^f\Y3` x ~~˅<H|.幖M7m9E5[]f(oSoqpg9]8{)8,OiNX֛5;,d*2:CNMTdb)ثٹjժ]˗//..4࠘N=O2 3_',Q>JIí#55Ȏ}'EQC}qh&L|nb_UDÏvG%]ooo{{?B>fMm-`9k$D[[[ 5}5jBw蹽^ȚS]]] exKIMn7Ov"ikb"$SwXdop;sN*?|{H~24IɅ-^;T{'o<rO>]y=م۳:\uאz?<׻s>wGXMiȝaӑ?_+=vD Nɝu˽}yܐKCv~Hezw;7n 9k-` p�[ݥr]d|;,g3XOYg6o\8ȱ|6g˷zO|d)GR/yJq<ݜ $mn?yڨr/~6�:q 4Ɨ‹<L=ssy_gs7MԹSSﲍ\x(rBEhflu,XUܛwdW^c˚L_`#HQA#c?*V0*Z9NRg<s:W/". +j9.*9[2/3w1}Sb5#_"2;r&RL'q!Kc{SExF3qm&S3<|'?|~9m۶~s͹{{r ~559)A%yXr3 \5kk\vd֦\erTQ*Z:sGniӎFYRҰJBObЕ|o2؞v\~k꫗ Toy𧻓ZT-IG0d2G.xn/ƶt;}oooS%6eeeɡr=s^[S_>1KOLG@]"_\<lX=TTTL44H4SM_!@_uww'  -JaPg !П߾ft0gλ&M6y7F%%|h &ٝkhdgu="3sPZ <c)OcjhwuSmhhs\+Iv.`vʸ?3#.ә˽\F^jgkٍ$#{[iHJ; hRwΏgׯD WQtN% 2&mz.p|rWm3 J^깉i63]okJq0ZXþ2N<@錫r},3"Ή+ocY4Qmf\Ыq#xEL:P'Eq uHsZgzk43MI#y339'b_j3 Y,?pfp`[33 ?e}F a}ujy{w]؝-e' [l)..FMW\y_nmmjhhr=?;E:7Ěf)HzNc3q RR0)a7G%/0k()zGʒ{J|bI*6j?ڿ8ɤ3?VWzC &}BB @EQut!z"** Ϣ⢝#XcRcAz(e(agB< i;L˛DR~%DɿL>*'yz/cR\~XnHmsW~ٗ L(+ulX9N2Sy>1s(oUYChxC{hq/|jؕq/O9+LxK? &^lukLy ٳUYx;)_6qFaqUc˹,:yNiOqnc"ci2Ʊ)Ekvm%*;f<d*oG.eic .1g�d7gr`p=f b <)&KbEGM~FFђӛp^R)2p&ЖVP11 J9ؤ~ǞTq:VV`:ؕ'%jil 0u1=V+T6vg } d^`ŇҲEg?z^]8iaWc~6S۫o]QQ(BOB#_8(L;i/Q* )^Th9cNOVzsEIݝ,PAIzapeee;|gP Xzr4v477L j*q[!;a%j #mrǷbI (nPRP&(̝伝#1TwkmIhLb_01Xbu.K)H<fzyleOtju>A\L?FSQT3Ww8G~԰XC=bҁ1aJ;ݖS0GxScD)ߋRB̏l SRVf\yuf15]e9ecXf0:02vx,rtO's^2x1g3e<ͮ|vf0]ك yd߻|@†CR.bWV2I&2Y8'XhpLfVS,b7J䓬KY3XHfS:i*q62Ku`!'b0[bQsx#^e%y|?$Ghuj9,_aqֳwd&E֭[[o]Z͵kk'̛z\aLXDzDG5AA6 Q>I'4FA7)CyUbVDl.)RVP�Va***5#?O$*V]]]Dջa ȽnIR[[[^^^WWW___[[[ZZZaҒ0_($"YAQDFSf2Dd6e;dS2" yQBYGg2=[T*I)ڄV]]/q}u ؋<XfZ\te-6|ޡ[XN0dQkx9<C_R&rX.߼Ow~l[dp8[d9sHEzzF~UFr@÷Y{Te6G+=9Xm1ӏ#k 71S5<JpkXʃYYe/fE{ݔvT-3"p4i.旜><&ġqp9GRGycxƯi,foPnKr,N$}X:;k"]/i?٘|�/O?OJnd!w0+9F$O$8i'sCƏJ#U`^e+ }>suj/|Rl_3HTTf:3]ٮd`Bw',Ni>۴� :_hKb_-v`{ jB3UUU#Fhnn𓶶VR"p t;LoP`e Y<@}Iuo8|i8/N`/%|d1Կ$e2$-|K~8|俵%B.{/`/W:9emFE˺1rsr.yOrUڞ ӥ:(󵛋n%׭#8m4{ y(kYS#WyE>rS}pn{ͽ'-{y?=ev5xoA1<k])WE|xT\vewQ>HDj2'5Fs8sgC|8ɜ=rzBy㹓6zKC|ۍ~&Fu x)=zմq37b4 ̹pq3xFn?)\L2ud,.N]Ƥ/K1sZD"\0*N{\<.d-ina&A'q&qͱ0Q̐H# u!zp_Oy0޾.fUۏFEEEJI>/`ОtouoOmOG{GGu;H]r>hY$ 4I(05 T:M%%;]v%ܺ6Un*[_ݡU?ښy&keee}}}~FQWWWRR~{/'('pgC4OL:'ɯv~y n[EE"mQr$X|&\> &]2\Ko>鯼a"[ӕ6F,9ƌ=rkze"k^/26c 'ZU)%F259w.c\w\)(%ֲk9Ul7ǓEq1I-,L%*ﰉ||x~3iGLd>̈oUnrQ\095>ӻer0 TFe씋"p 3yO2=/S>[56s5 Ls{ҏ.O3[{0:0˨J,T8s9Or=%H#], ^3Øxxq0׉=od-,84x:MpmsYcWS4#=̣|i<,e=&m\<vaO!ѧUqe1"{]ƞs@"'ͫ`#+@ ~~CmC㮍(k.;'aq7i3cg( SUUU2HK ƽ-Xd(yds(mu`kͪ=o3١ʗd }~GO~: }-\2kkk P[[[RRYUU^ҴB0ѤG\ .$#{ \B @1ɟ{xL'Eg*0`2tG̔, kCʢ-2!%i><op *5>cv1le7jϮr7T3H+m:X,r&Y>H`gVh3sC|7b4iM<BRO%cS fF6ƽb"G} x0ecʨoxޚ59]rO2y.a5#9nsPIJs #85Le=a&cR}J+ُEM|ӘI@])ȈT_}v{Y2yv9Ȱg3SƠ`~LLe Ōi2xALfe}'gvdQG i'I5X&4ojYИvaU4vOv0qnq4Hޏ8g##LgmL>;wÀ#7r#׍ UEv�C[1j^}I%l#)PN|i Z>cyݞحl[/3D~ ."].d:xnȖe32Ig,mF ܺukKKKkk 3_6gXSJ y')$Q ך۷ 3ȑ#8a„`H2?Jk(cVL&,--Mpx*E- pMYSS;Ii'rsnu,md) cR83~<`Z>|#ifdSJK)Ϭ\c#8flALz(fC(ȡ2Ez2Ng%7ɱ/hPD}ys rHOY6SnEYk׽tQ&Cw(1yJ` ţ !9^Nڸ<ld Q )btd&Y*ϕl࡜4 YgQ8,zoeq�X W$ƒe'r?`#?`Ә{hR;F5CxLJXwGȱ>=KLN'/.@*)f0-}IJ,}Q ɸ |%.tO0gkjVd빼H1cwK<rsoiu#9A3iz~ EQ=ىM`Hgwg"F:fϝz|C ̏ځߚd6 |sgˆTg*@6v% ?IE }l6[ZQM)rF>5bcEdbT^^^^^lcHccckkkKKK./dPw%UBBJm{3D#i`%V>A@&+a!q;t7%h-VVVC-O]edt<OCO]_Jneec=O.~"P~ӽjSB‹ZnCh`+\ =7:ni2Mp>s>%q׫,ֿi.]Ѳrp 3f KXXNT+:1"z/lĘ<G<Vc 7/ 0Y8RZ ,Xg o,搥L!NIc X]V-c7ӹϤ\^)_x ia[9|c\J_؃A0hIj a_^r݌b)N&`:AgS2.[^]vfo#\@Wp]D﹈"ًMjǖfM0nrBx=iہcvrot'jˈ-sO;Q*MFb^ܺY?5!>r&lJ3bkg~sfJKK[J(I|Oq~O'&>2P[[[IK}isiP�<IZdc}@|ϟ7_W,k 6tttd0ljj %Hڨ 魠Iޙ,/t$Q; s&W L@;)|r(ؔ -_l?(pt>oo̗b \fDcwUO4p1<ͳԐӹ@c{7xf_YFYen#|-q'b+s1b{INw< <F^ Κ9̣ Ynb(388^ q/CS֞vR8h<K"m<Fq7S5OhNVdJt3TEuZ8|&h]8 Icf8Wy<ANhOJKdSN93 9W9_1,#ڧ&qCO?nanͬ :06J*.o,@Wtncq.9%2#e+~7G9 8Wx +,'c)Q瀸X٤;��IDAT}MbxKs:0mXO Ld_vyRTiy鶽4tuTUQ\\Ksi)NU]rueIqIy>W"TO7N(*i-)i-teHtk^.> ]SSӿQFTdYl\]TZZZZRښJw #(A#՚Z;ygDŽlyCMJy=4v>:xrÔ1Tl( ɴ$KKKdXg5QwJ&s'M0a(zA#{,Tq{{{Kg~e_$x"R`[qX9%8땕tN-l^:˺74q_MBoOe%is@%˩W~5.Qm3+znઇi 9Di sgX0e ٝ=ߥ8&Z5p$qr:m\ηYZ ũ,'q~;Ό{}?2 & ~-[C_L=`x$=</q`Q >hΦqd?mp?=~(39-_J1)L'R}글z^b&S/p+װ Rkψ؅Rn/QıT�g*iU6s/)t#nEihb- 8se FƮNe$|OC)dz(R>Ldid)Op\<6 3c9ø-{`v/XVoIs3;/'l֯_h ƆX #BV=OO,ܘX3&p7%nIIݡe~N `>W3 VUUU4VSSUP(01q5 -VDu'3[E4R֭[ep[linnnkk 2ImOz;ew )'!hA+V)*8:%ɸ[4w "7 %us!gWuԨo*H&ic9`~Sҥ_͜ cG" +B^LL~ [TI:(r 2yI4W,st6ŎG)_Řt>BYn b|,:̏沂)Y>>ޑ_e8fYH}eY]|9 sTg ?eb 3oR:Ʋ˩ڜELdd:G\q <Sy>q4[Y"1:gIdp$zx2em|V^OzN`3M9y'8"o0!CӸ 4A6"Fm&sly}O'Yzbam񤪜ja8x ʶW7d2lfⱳ?1؇yPɠ>k׀s 2%%%I&R^=cVrQƽ0nk?7 %ӂ$i}nVp(p (JUUUUUU H$B* $<%�Vw:)ik :4tvv&Tb-S2#L&tCV | "3tW! pN\B~HgA1y@i)\�x)8DD{?pM*^gNSUˋzLN!̬YD ^g~V3͋ͨh֎_?*N,<2db혤yvz*hjNe籒żƧ97.,,6e״[zr[WYɅtsUWs0_'@-ܖ=,+h~)I;.eJֳ6p#oqswFdl7kO#9Gsg$'q9=tp%W ru,:<_ 1c?_i>΃de*M,dfep od50笋 ~`0Xzgr=?BÀ872(rV02yly`8%L"2(r'Įf؟'YKT 7a(&u}x+ccY*6 Q$1}RT:>tvPRۏIMiiiɠ(~ϣuOBa'؇�JFeoE zWWƍ1uuuWBZ .]B(ߞ!5Olpv ][HxG"Rh/R?>,bX&ɗ@I;t 3Ihm||XKp7hU;κL:LZʌ9 8=S^)"?W}F i]sݓ_<3Y .aKǫ XݠbWL!b ߧE`G2b#,as.yȓEƮLbe*-,;,RϩQaO}lKx8 aci\tތxө ֱ;V.csy.4<Ξ,a_=Zֳ;q5_`[pMb7<gyZ.d%'gVQ!s*#G3KhdU] Nu6%ao2lhnf3 u|k%auzhu "Fkg̱EfF q~U}*Ng+k$qk&{0]47SȔ)<~555!]%KtJ2-D~mnEݠŃJ|vNd .+)l*D'RA8Z>fH 0�B,$%ŐƎ;lذ. 䗕!$ In-HXYɹ'fQb|٪ UWqqq{{{26 k@KA8D"_d}R#ƐKU2Kj=f+Z,VoB OcЛϟc 'cS>eee;]m`E9/E~$^e#G7C"WZd�#ŽWY:rys50ɧEDPL򫴟fŷكNXZIq(#Xå)I{ 0m$Mo 7s+ iK\^le7S )ߏ|g(bC_n)|^OR.l+ 9c؝؋66riRJ>E{;xyKbM12>RFVұ8EݱdWTۧ[#%RM-ϲH4EΌg=D wp07k9{i}S@1͉b%He7m%7Ƶi)ϋlK  R%CSYLg>q^f٘rK$ӾB7rpʹ,NЄu}ۻ}C<JVOKKK\֌[? vX $RLyf R婏KDdCyѰÿ&g֭EEE I+/hȆzƏNnݺwQUy;ә8A) UFAV%[qúDcVV55MT 1X!XLbvXS7kݢ4}`k>N[ՙ?NNLgZl'M3{~;#&)Xk-P&$&/FN%eohu8LvalFex6An׍xb~zzz80nb]$2ZJ FGVVjMOOR[{^mqWb[xdMzM@'.p p\Xvo`#ЇL|[w+6v#C{*A;p`Hz4lA%W ~ \*X�@p`_(xIA�^{+z |.߉^ū: �� ;@=(z2ߪ-YwX,v�>^T�` 򁨆?`@!pzW)�i`#0Ss[p+P |ܯR[}��?tVu*`!>SwG^c%Nwni`P@E`!Q/YbzLgM@c`p(G#8<|hL+P�bPk!3c!K51REǪiZ^^W_}e>3MӢZyi4)CiZ:q-$^Gc#LJK\ʙ=cLe(* d.fSP 2X7mD30L~&Sl#EeK"];281>qdmY8#999r=L Rw8 (hmxbuzX{ BH?M�ٳ{7;=->0* D% |H$}>XV1_B\|>#؉V'ALę#-1 RAhYYYiEW"ӥ˜.6K1'nF #Hit%Қӆ%uc7h"t:^m(L ,r\u ":J&5Y)YZnB 咤hgڧI2jZ;٨#ĕ4)Gr<'+` ArbUXX(>/ݒ?Ӽyv1lki3:q)L!A%/(7w[vSWqMLs }mW!qI#vg)x" dilr#ϴ]רa 1iMW7 \΅lTc+1kjtF5?L9L><BsTd44$HqVhxCSMkC#q&KK@tI+s*BgӷBI۽{?_\GWj!jIK5%I0+NkhBS *ʘ'6ZrDU*Mbǭ-Tq/IҦ8NB9^V6wz.WFѕFSS0~J@^,q졦嘱%*SrجUbsk'׮!&(!P\B!WB(!+B!B!BqE!P\B"B(!P\B!WBHX� w@TTcΪe$'zSxtSRU- MC4(i1gUDW<\:P:(5Zډ^Thʕc P{%_7L{vZ]';1i74]T29TcUYYY y25ϊfޑޤ6Ĵаzd_1B+WN*|<sҥKNgOUmmF!PRRRWW7KټydZfͱcΝ{՘>}&![yM\ܪe!Baaŋg{e…œJ5ŋ[֫,((Xhf Ng?_F!oV>X2p8ɦJ<dg,H!d@qE!B"o&O>񰢢Ν!---"N޻woEE?xEEŁ(!MMM"ݘU!&y@ PSS#BwuO?-޽ B:u*kkksss?;w۷o۶m>____oVVVnذ^P]][SS#Jߺu| %neee~~~˗/"Y,JJJdHGGP74i'B^H D""ŋc---� v�K.BP(D"CCC"[fUSSF?p8T4' !L'O677 )_e˖]52!Ip?gexb9CHqE!d 8~ݾ}{Y=]]]!nrrrzzz�(bE!NSUUfXDHvvv*e~p8233nD"b *++KeZVbq8"$33Sf٩jW2Yb Lmݺuڵ�jjj6m`Ϟ=s̹{z{{EӧS)СC'N�PVV39rd˖-vPWW~z�v*--SOҏ;&J$l+׳ڻsZd'2Chn1lki!Y�!+B!d*UPT?j.sB!d&pRZƈ+k9|lB!3EXlWUx88v!2�Ovxx-B!df qc����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/scripts/index.html��������������������������������������������������������������000644 �000765 �000000 �00000030271 11555611701 020277� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Scripting ds9 - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Scripting ds9</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> Scripting with ds9 can be done in several ways: by invoking the GUI with a number of command-line options or via the <a href="http://hea-www.harvard.edu/RD/xpa/index.html">XPA messaging system</a>. A third option, Simple Application Messaging Protocol (SAMP), is introduced but not included in the examples. </p> <p> To illustrate how to script ds9, we repeat the <a href="../contour/index.html">contours example</a> with both methods,. The examples use Chandra data from an observation of the galaxy cluster Abell 2142 (ObsID 5005). </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li><strong><a href="index.html#commandline">Command-line Scripting</a></strong></li> <li><strong><a href="index.html#xpa">XPA Scripting</a></strong></li> <li><strong><a href="index.html#samp">SAMP: Simple Application Messaging Protocol</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#clcontour">Figure 1: Command line: x-ray data with contours</a></li> <li><a href="#clcontourdss">Figure 2: Command line: x-ray and optical data with contours</a></li> <li><a href="#xpacontour">Figure 3: XPA: x-ray data with contours</a></li> <li><a href="#xpacontourdss">Figure 4: XPA: x-ray and optical data with contours</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="commandline">Command-line Scripting</a></h2> <p> The ds9 Reference Manual has <a href="../../ref/command.html">an extensive list of the available command line options</a>. The most important thing to note is that the commands are executed one at a time in the order they are listed. </p> <p> To create contours on a data image: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 acisf05005N002_evt2.fits -bin about 3800 3800 -bin factor 2 \ -scale log -cmap b \ -contour yes -contour limits 1 100 \ -contour smooth 5 -contour nlevels 6 -contour save ds9.con &amp; </pre></div> <p> This command line produces <a href="#clcontour">Figure 1</a>. </p> <div class="figure"> <div class="caption"><h3><a name="clcontour">Figure 1: Command line: x-ray data with contours</a></h3></div> <div><img alt="[Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.]" src="contour.png"></div> </div> <p> The options direct ds9 to: </p> <ol type="1"> <li> <tt>-bin about 3800 3800</tt> : center the image display at (x,y)=(3800,3800)</li> <li> <tt>-bin factor 2</tt> : bin the data by a factor of 2</li> <li> <tt>-scale log</tt> : set the display to log scale</li> <li> <tt>-cmap b</tt> : use the "b" colormap</li> <li> <tt>-contour yes</tt> : display contours</li> <li> <tt>-contour limits 1 100</tt> : set the minimum and maximum contour limits</li> <li> <tt>-contour smooth 5</tt> : set contour smoothness to "5"</li> <li> <tt>-contour nlevels 6</tt> : create six contour levels</li> <li> <tt>-contour save ds9.com</tt> : save the contours to the file "ds9.con"</li> </ol> <p> If you wish to add options to the command line after it has been processed, the whole command must be run again from the beginning. It is, however, possible to interact with the ds9 GUI that has been created. For instance, instead of including the "<tt>-bin about 3800 3800</tt>" modifier, the image could be recentered in ds9 interactively. </p> <p> The following command line builds on the previous example by retrieving a DSS image and copying the contours to the new frame: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 acisf05005N002_evt2.fits -bin about 3800 3800 -bin factor 2 \ -scale log -cmap b \ -contour yes -contour limits 1 100 \ -contour smooth 5 -contour nlevels 6 -contour copy \ -dsssao A2142 -cmap grey -contour paste \ -frame first -match frames wcs &amp; </pre></div> <p> The resulting image is shown in <a href="#clcontourdss">Figure 2</a>. </p> <div class="figure"> <div class="caption"><h3><a name="clcontourdss">Figure 2: Command line: x-ray and optical data with contours</a></h3></div> <div><img alt="[The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.]" src="contourdss.png"></div> </div> <p> The options which have been added from the previous command line are: </p> <ol type="1"> <li> <tt>-contour copy</tt> : copy the x-ray contours</li> <li> <tt>-dsssao A2142</tt> : retrieve a DSS image of A2142 from the DSS-SAO server (there are also a "dsseso" and "dssstsci" options)</li> <li> <tt>-cmap grey</tt> : use the "grey" colormap in the DSS frame</li> <li> <tt>-contour paste</tt> : paste the x-ray contours onto the optical data</li> <li> <tt>-frame first</tt> : select the first ds9 frame</li> <li> <tt>-match frames wcs</tt> : match the WCS of the DSS frame to the current (x-ray) frame</li> </ol> <p> At this point, we can end the ds9 session or modify the display interactively via the ds9 GUI. </p> <hr> </div> <div class="section"> <h2><a name="xpa">XPA Scripting</a></h2> <p> X Public Access (XPA) is a messaging system which provides communication between Unix programs through a set of access points. The two most common actions are retrieving information (<tt>xpaget</tt>) and issuing commands (<tt>xpaset</tt>). For more information, see the <a href="http://hea-www.harvard.edu/RD/xpa/">XPA Messaging System</a> page and the <a href="../../ref/xpa.html">XPA Access Points</a> section of the ds9 manual. </p> <p> XPA commands may be issued one at a time from the terminal or collected in a script to run in batch mode. Unlike the command line syntax, there is no predetermined stopping point - commands may be sent to ds9 as long as the GUI is open. </p> <p> First, open ds9 with the data file: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 acisf05005N002_evt2.fits &amp; </pre></div> <p> The <a href="http://hea-www.harvard.edu/RD/xpa/xpans.html">xpans name server</a> is used to manage the names and ports of XPA access points. Use "<tt>xpaget xpans</tt>" to see the list of available access points: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% xpaget xpans DS9 ds9 gs /tmp/.xpa/DS9_ds9.22972 username </pre></div> <p> Now that ds9 is running and linked to an XPA server, we can use xpaset to modify the display and add contours. (Refer to the <a href="http://hea-www.harvard.edu/RD/xpa/programs.html#xpaset">XPA documentation</a> for details on <tt>xpaset</tt> syntax.) </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% xpaset -p ds9 bin about 3800 3800 unix% xpaset -p ds9 bin factor 2 unix% xpaset -p ds9 scale log unix% xpaset -p ds9 cmap b unix% xpaset -p ds9 contour yes unix% xpaset -p ds9 contour limits 1 100 unix% xpaset -p ds9 contour smooth 5 unix% xpaset -p ds9 contour nlevels 6 unix% xpaset -p ds9 contour save xpa.con </pre></div> <p> This command line produces <a href="#xpacontour">Figure 3</a>. </p> <div class="figure"> <div class="caption"><h3><a name="xpacontour">Figure 3: XPA: x-ray data with contours</a></h3></div> <div><img alt="[Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.]" src="contour.png"></div> </div> <p> The options direct ds9 to: </p> <ol type="1"> <li> <tt>xpaset -p bin about 3800 3800</tt> : center the image display at (x,y)=(3800,3800)</li> <li> <tt>xpaset -p bin factor 2</tt> : bin the data by a factor of 2</li> <li> <tt>xpaset -p scale log</tt> : set the display to log scale</li> <li> <tt>xpaset -p cmap b</tt> : use the "b" colormap</li> <li> <tt>xpaset -p contour yes</tt> : display contours</li> <li> <tt>xpaset -p contour limits 1 100</tt> : set the minimum and maximum contour limits</li> <li> <tt>xpaset -p contour smooth 5</tt> : set contour smoothness to "5"</li> <li> <tt>xpaset -p contour nlevels 6</tt> : create six contour levels</li> <li> <tt>xpaset -p contour save xpa.com</tt> : save the contours to the file "xpa.con"</li> </ol> <p> As long as the ds9 GUI remains open, we can continue to modify the display. Here we build on the previous example by retrieving a DSS image and copying the contours to the new frame: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% xpaset -p ds9 contour copy unix% xpaset -p ds9 dsssao A2142 unix% xpaset -p ds9 cmap grey unix% xpaset -p ds9 contour paste unix% xpaset -p ds9 frame first unix% xpaset -p ds9 match frames wcs </pre></div> <p> The resulting image is shown in <a href="#clcontourdss">Figure 2</a>. </p> <div class="figure"> <div class="caption"><h3><a name="xpacontourdss">Figure 4: XPA: x-ray and optical data with contours</a></h3></div> <div><img alt="[The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.]" src="contourdss.png"></div> </div> <p> The options which have been added from the previous command line are: </p> <ol type="1"> <li> <tt>xpaset -p contour copy</tt> : copy the x-ray contours</li> <li> <tt>xpaset -p dsssao A2142</tt> : retrieve a DSS image of A2142 from the DSS-SAO server (there are also a "dsseso" and "dssstsci" options)</li> <li> <tt>xpaset -p cmap grey</tt> : use the "grey" colormap in the DSS frame</li> <li> <tt>xpaset -p contour paste</tt> : paste the x-ray contours onto the optical data</li> <li> <tt>xpaset -p frame first</tt> : select the first ds9 frame</li> <li> <tt>xpaset -p match frames wcs</tt> : match the WCS of the DSS frame to the current (x-ray) frame</li> </ol> <p> At this point, we can end the ds9 session, issue further XPA commands, or modify the display interactively via the ds9 GUI. </p> <hr> </div> <div class="section"> <h2><a name="samp">SAMP: Simple Application Messaging Protocol</a></h2> <p> A third method of scripting ds9 is via <a href="http://www.ivoa.net/Documents/latest/SAMP.html">SAMP</a>, a messaging protocol that enables astronomy software tools to interoperate and communicate. SAMP is also used by such applications as <a href="http://www.star.bris.ac.uk/~mbt/topcat/">TOPCAT</a>, an interactive graphical viewer and editor for tabular data and <a href="http://aladin.u-strasbg.fr/">Aladin</a>, an interactive software sky atlas. </p> <p> Information on the ds9 SAMP implementation is available in the <a href="../../ref/samp.html">ds9 Reference Manual</a>. </p> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">21 Sep 2009</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/scripts/thread.xml��������������������������������������������������������������000644 �000765 �000000 �00000024151 11343564747 020307� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="us-ascii" ?> <!DOCTYPE thread> <thread> <info> <name>scripts</name> <version>Sept 2009</version> <title> <long>Scripting ds9</long> </title> <history> <entry day="21" month="September" year="9" who="liz"> Original version <!-- scripted version of contours thread //--> </entry> </history> </info> <text> <overview> <synopsis> <p> Scripting with ds9 can be done in several ways: by invoking the GUI with a number of command-line options or via the <a href="http://hea-www.harvard.edu/RD/xpa/index.html">XPA messaging system</a>. A third option, Simple Application Messaging Protocol (SAMP), is introduced but not included in the examples. </p> <p> To illustrate how to script ds9, we repeat the <a href="../contour/index.html">contours example</a> with both methods,. The examples use Chandra data from an observation of the galaxy cluster Abell 2142 (ObsID 5005). </p> </synopsis> </overview> <sectionlist> <section id="commandline"> <title>Command-line Scripting</title> <p> The ds9 Reference Manual has <a href="../../ref/command.html">an extensive list of the available command line options</a>. The most important thing to note is that the commands are executed one at a time in the order they are listed. </p> <p> To create contours on a data image: </p> <screen> unix% ds9 acisf05005N002_evt2.fits -bin about 3800 3800 -bin factor 2 \ -scale log -cmap b \ -contour yes -contour limits 1 100 \ -contour smooth 5 -contour nlevels 6 -contour save ds9.con &amp; </screen> <p> This command line produces <figlink id="clcontour"/>. </p> <figure id="clcontour"> <title>Command line: x-ray data with contours</title> <description>Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.</description> <bitmap format="png">contour.png</bitmap> </figure> <p> The options direct ds9 to: </p> <list type="1"> <li><tt>-bin about 3800 3800</tt> : center the image display at (x,y)=(3800,3800)</li> <li><tt>-bin factor 2</tt> : bin the data by a factor of 2</li> <li><tt>-scale log</tt> : set the display to log scale</li> <li><tt>-cmap b</tt> : use the "b" colormap</li> <li><tt>-contour yes</tt> : display contours</li> <li><tt>-contour limits 1 100</tt> : set the minimum and maximum contour limits</li> <li><tt>-contour smooth 5</tt> : set contour smoothness to "5"</li> <li><tt>-contour nlevels 6</tt> : create six contour levels</li> <li><tt>-contour save ds9.com</tt> : save the contours to the file "ds9.con"</li> </list> <p> If you wish to add options to the command line after it has been processed, the whole command must be run again from the beginning. It is, however, possible to interact with the ds9 GUI that has been created. For instance, instead of including the "<tt>-bin about 3800 3800</tt>" modifier, the image could be recentered in ds9 interactively. </p> <p> The following command line builds on the previous example by retrieving a DSS image and copying the contours to the new frame: </p> <screen> unix% ds9 acisf05005N002_evt2.fits -bin about 3800 3800 -bin factor 2 \ -scale log -cmap b \ -contour yes -contour limits 1 100 \ -contour smooth 5 -contour nlevels 6 -contour copy \ -dsssao A2142 -cmap grey -contour paste \ -frame first -match frames wcs &amp; </screen> <p> The resulting image is shown in <figlink id="clcontourdss"/>. </p> <figure id="clcontourdss"> <title>Command line: x-ray and optical data with contours</title> <description>The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.</description> <bitmap format="png">contourdss.png</bitmap> </figure> <p> The options which have been added from the previous command line are: </p> <list type="1"> <li><tt>-contour copy</tt> : copy the x-ray contours</li> <li><tt>-dsssao A2142</tt> : retrieve a DSS image of A2142 from the DSS-SAO server (there are also a "dsseso" and "dssstsci" options)</li> <li><tt>-cmap grey</tt> : use the "grey" colormap in the DSS frame</li> <li><tt>-contour paste</tt> : paste the x-ray contours onto the optical data</li> <li><tt>-frame first</tt> : select the first ds9 frame</li> <li><tt>-match frames wcs</tt> : match the WCS of the DSS frame to the current (x-ray) frame</li> </list> <p> At this point, we can end the ds9 session or modify the display interactively via the ds9 GUI. </p> </section> <section id="xpa"> <title>XPA Scripting</title> <p> X Public Access (XPA) is a messaging system which provides communication between Unix programs through a set of access points. The two most common actions are retrieving information (<tt>xpaget</tt>) and issuing commands (<tt>xpaset</tt>). For more information, see the <a href="http://hea-www.harvard.edu/RD/xpa/">XPA Messaging System</a> page and the <a href="../../ref/xpa.html">XPA Access Points</a> section of the ds9 manual. </p> <p> XPA commands may be issued one at a time from the terminal or collected in a script to run in batch mode. Unlike the command line syntax, there is no predetermined stopping point - commands may be sent to ds9 as long as the GUI is open. </p> <p> First, open ds9 with the data file: </p> <screen> unix% ds9 acisf05005N002_evt2.fits &amp; </screen> <p> The <a href="http://hea-www.harvard.edu/RD/xpa/xpans.html">xpans name server</a> is used to manage the names and ports of XPA access points. Use "<tt>xpaget xpans</tt>" to see the list of available access points: </p> <screen> unix% xpaget xpans DS9 ds9 gs /tmp/.xpa/DS9_ds9.22972 username </screen> <p> Now that ds9 is running and linked to an XPA server, we can use xpaset to modify the display and add contours. (Refer to the <a href="http://hea-www.harvard.edu/RD/xpa/programs.html#xpaset">XPA documentation</a> for details on <tt>xpaset</tt> syntax.) </p> <screen> unix% xpaset -p ds9 bin about 3800 3800 unix% xpaset -p ds9 bin factor 2 unix% xpaset -p ds9 scale log unix% xpaset -p ds9 cmap b unix% xpaset -p ds9 contour yes unix% xpaset -p ds9 contour limits 1 100 unix% xpaset -p ds9 contour smooth 5 unix% xpaset -p ds9 contour nlevels 6 unix% xpaset -p ds9 contour save xpa.con </screen> <p> This command line produces <figlink id="xpacontour"/>. </p> <figure id="xpacontour"> <title>XPA: x-ray data with contours</title> <description>Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.</description> <bitmap format="png">contour.png</bitmap> </figure> <p> The options direct ds9 to: </p> <list type="1"> <li><tt>xpaset -p bin about 3800 3800</tt> : center the image display at (x,y)=(3800,3800)</li> <li><tt>xpaset -p bin factor 2</tt> : bin the data by a factor of 2</li> <li><tt>xpaset -p scale log</tt> : set the display to log scale</li> <li><tt>xpaset -p cmap b</tt> : use the "b" colormap</li> <li><tt>xpaset -p contour yes</tt> : display contours</li> <li><tt>xpaset -p contour limits 1 100</tt> : set the minimum and maximum contour limits</li> <li><tt>xpaset -p contour smooth 5</tt> : set contour smoothness to "5"</li> <li><tt>xpaset -p contour nlevels 6</tt> : create six contour levels</li> <li><tt>xpaset -p contour save xpa.com</tt> : save the contours to the file "xpa.con"</li> </list> <p> As long as the ds9 GUI remains open, we can continue to modify the display. Here we build on the previous example by retrieving a DSS image and copying the contours to the new frame: </p> <screen> unix% xpaset -p ds9 contour copy unix% xpaset -p ds9 dsssao A2142 unix% xpaset -p ds9 cmap grey unix% xpaset -p ds9 contour paste unix% xpaset -p ds9 frame first unix% xpaset -p ds9 match frames wcs </screen> <p> The resulting image is shown in <figlink id="clcontourdss"/>. </p> <figure id="xpacontourdss"> <title>XPA: x-ray and optical data with contours</title> <description>The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.</description> <bitmap format="png">contourdss.png</bitmap> </figure> <p> The options which have been added from the previous command line are: </p> <list type="1"> <li><tt>xpaset -p contour copy</tt> : copy the x-ray contours</li> <li><tt>xpaset -p dsssao A2142</tt> : retrieve a DSS image of A2142 from the DSS-SAO server (there are also a "dsseso" and "dssstsci" options)</li> <li><tt>xpaset -p cmap grey</tt> : use the "grey" colormap in the DSS frame</li> <li><tt>xpaset -p contour paste</tt> : paste the x-ray contours onto the optical data</li> <li><tt>xpaset -p frame first</tt> : select the first ds9 frame</li> <li><tt>xpaset -p match frames wcs</tt> : match the WCS of the DSS frame to the current (x-ray) frame</li> </list> <p> At this point, we can end the ds9 session, issue further XPA commands, or modify the display interactively via the ds9 GUI. </p> </section> <section id="samp"> <title>SAMP: Simple Application Messaging Protocol</title> <p> A third method of scripting ds9 is via <a href="http://www.ivoa.net/Documents/latest/SAMP.html">SAMP</a>, a messaging protocol that enables astronomy software tools to interoperate and communicate. SAMP is also used by such applications as <a href="http://www.star.bris.ac.uk/~mbt/topcat/">TOPCAT</a>, an interactive graphical viewer and editor for tabular data and <a href="http://aladin.u-strasbg.fr/">Aladin</a>, an interactive software sky atlas. </p> <p> Information on the ds9 SAMP implementation is available in the <a href="../../ref/samp.html">ds9 Reference Manual</a>. </p> </section> </sectionlist> </text> </thread> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/color.png�������������������������������������������������������������������000644 �000765 �000000 �00000745623 11332353405 017224� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��N���]{���bKGD������ pHYs�� �� ����tIMES�� �IDATxydY}}}=ںz $hh0<$d0X3#c#kg4X²XB�Y`0Zrxm̬ȈȥY/޻.$ `0 ]ϳ�m10 w賟{?X30 K/<#{.`00`0Qmcd2Sك}myuůMqT* ëug_f> cm /@Vzm�u^-~̛} O_-k鱮'=n籮 㮶 Nܹszܹs^|QVzm6*wIV?ğ=WHOD鼇/RK) cϘ~Aόͮ<̳B̑^׮?߄JY?h#?7?__}Im#ͯ;g/yO oz@c ӏʧ~];==&BX;O�斫>|vx~z2+Bo^/% �'\>D�^RɞȾ^{h!N.}3__6i!']?zOap[ϋ~ t㙿T㚭YZf<^<u/lYBXXK ˙bV cm�c󋢤�x{}p~g*g<g}{۪F6 2&O>䯿M;XZK@`CLc;N\|^峿/~Sj#o__Ix+_&_ "W;Q-K酌'>/%Ve pi橙#6sS*?"Q^{?s?;/=*jW?੿|BW?^KO_wwq�?SGLMatGͥ*c?2Mm7\g01GDgJKծ 96S~}>x| 75/3={Q5R9wzzp2\.b>bJB?i|S?m^OmĔhVVy̿Gh<]'T "?Wk^_8)A�NO|W'SGrnr$I쯿ld Fʂ;\,?9g/oV}+7\[Ș<o5p\>c|+Շ7}OZ {_ڪ7�ZcZڗq\7OѭUYm*ʬj[?56~Y;ժi�YOO:SG_}Q73:0w)g~S?s2 .Й֢;JOȉAaDW~G{c�b:83E]!z;/]~koy}σO}YSS�x>m9xaEA-o{NcsFo'>wc_5R_ݸa͓ScYx9k]'Q(?|dybfKO՘>2ȹOd;]U\¯[A?{O% @ٺTY:|סW/hz8Ɓ){?/_`}s|{چ/(/+:fR>JcY8:Le}i&Sej<cSψD}|9^+7}/6\"]W91u�F+"$ݹ\>OzaْjC^ I"]A~_Uy"p"(/kBٔ`8t㛗D;25�7󹩙;\Ww=3�*,o<&R {#F1#`Q~(>3>~C5;xwr_^lGUD٭W. /h芽t{<}o}o}m~]S^sϑ $CxuNMML�x XHP(d_['OC'*O_x8Rk82Q ȯ'h]�ybڈ Ib^[B6-J2~<w= OHkS}#^{fS_"7^] /\34/.\ \&`0wQLSچRg?x^ymw18 ZWzqI֤fWeHԼuw ?彮TM.|I=v(}}3GƏLƇO?>|#y�7^|=7uwh;Vt7v!("y;2F+dS qGxRkNO^XL'؜]D WZd"s?_sOq'^Rr=ZP7o/6?zﴮ_y/_:'1j6 O?Twz<o;+sslCҷ&Y^cg٩L$IIܸ©Ikzr\&RZۿ֟|ꋊ{|oOyϱ|ҍwSǦ>/=HI~\?w߹ry܉~+@%�O'Ow ~~^1�~Mg[n^|ҥKd ?xȅ7o~l;j9{i i8gF̒]Q]U'>ŏ}͒dDŔ;8 % O|_|oF]7 \¯;zەpKǔw7ogfIg9;EQ^X5h(OH詜k?续 8Y[[$HT+[YA$DVlG”7ޣ[+ ?=VrWZfeQgYV$qx2+]u0 ~W~?ǟW%R]*F9q (J*?f;X篹 ; Y8f;ǐz+Q@8yA +?Eduem&Q,LAU6;¹s>Q_U;qT~b/]K[7t(Z\V| NyVϞ:h4ׯjrx^L8qОϋ,O (ɒ� Q4 Q4K%_8 D+E8+*ծEj(H �0%L珀C[+%J~G9<2{cԱ4o9Q�TQk 8KoqBph(H'IbF J�jd Gx^ /HH*7Ǒ D$BD q 3a깞<g.~m͕[~T*B)y^F(# m9xIV҅E#&3vdĭ-R[OH#F&9y}\>¥㿨6Z$ dDTA�zO33٤س=cJ+wm#.]تW(y^U+;&ɪby�`0vY …T#E]RSBܤxQl󂨨ϳ]C cCpQTz}QʹjYof04!klZ`0N4+o�|I`0N>𑏯Ug0 |VLL qSOu]a~`0l`0m`0  ``060 `0`0FLu۶?>ʴ9sz7lgFX`WUgdGYu 7zsMۆ0yuy9f2mۣ-pϩa0 +~xJuEڍpI)6litov~+;ȷ~Qy0j9v^{?F;۲^Hcg=y )~eK<6=67~UW{_.+;80,O9nK3L^tFb4`ѯ[CtMq7;#[N{GR}A<e߂B{+z};ozfʨ>7@XUmuAއco)C2p7?l5릿Km!{7#>UÚM:˳w6SfgPy~=Gw�>=Ȇ͝Uh.5͝jNiK,Y7pzN<o3a,d.1ڪ$]:g]6z@3s7,`0} wz{?tc~^4;`0}sլfeK_x}3`=;c5 60z;"204 70 `0`0 f l`0m`0  `0`0 f l`0m`0  ``060 `0`0;6<=Ȏd0w3]:pJwVʮ?۶Q oL^;m]Gv.ήd`0fbK5Cݔ뿙LS}fN2~O,M `إoL 9ov7۴~) `0xaǚyomöTc}-+` co"(ۋ)u/[vf`32 f3:u؆qc`0ʳ4نO?cg1%؁wOIA9 &`=6`H8̕tX3 a m 1 D<U`0écwX l`0m`0  ``060 `7=oxꩧ\  x'P f ?A&HچSjol 4ڥ:qܡχ2 7rzue;$Y9NitPtz]JD\?rbta`0``060 `mu³muz!? ;6]KݝjZP>0V8$U`NuW L&]*vߊ=Sۜo^Q)Jg/W$❙v^{/ksym\wez춄?IF؎-Оp@> ~g.6Sz!6l7RLgO#otg4= փ:$GXu3nKlK,{cțfeao܇%ܟ3َj| nDqE�zjbAvQF[Cd۫߯Fz&5BnkPMÙanZ}%9=n0vkKڦ3z{¡B!8ڲin`c ip0=0 ߻;ڸdO0βuEoEja& .<q Co< 0z1 ӬB\zN[6H3%὇~[v}+d#/`?$c�0fH;(M=/9ߞz/ 0LMHٯ{Q}!{{-mp9`V!UW߷ѷpqI73 \b'60ȡޅL 0Ɓ ``0[;hCxTpJu*{?tcӕCuN:`0m|\2˥/<bJ F]\j>W:у͒-Uvi =;Xz`>D(HɁS۫R]Ŕ f l`0m`0 ƾچ͇WWT1J2;x?r![{X anL#چnfy༰*+p~d7G;[Yla!Y~%v)!0u[=#oOj[xTq@mா1-^umyF5Zz>򼆬v <B Ȗ S!+>wa^?-?$[-zDC?|IlYebp!GRqT=vYΓ;/0 7Hzf9< .RxFquˣu 7©>نa<# g$YC6ܖ`tpU~qb]a2ڲvL^wQ~ w[G;p[ýXV ,$>Th/6ǵ]iH!l]&{rطswQMڲᶛ؆Q=t }s.E3_~L^ /hVaޥdJ{vУzn6CDn*Yc[bp!GRH }D= lł2x\yjŮan{ FAaK=K )WhGiv0Z7Fq `a`a_6 &; n3;I2LL 70 `)=S|6a[T&֦wO}oJq>C7jN~8]|4`0x>q,._xr`BmÓO>Ʉ`0w%پ9>$I0𬲻+I)L$)1 dXð0`0zywۆmy%;l+.<ԔU� R70 Ǝ!wh 5 ;<Б,Tmk/P*j*{;t-qBm`0 DCېD`08PdaHck&5qgMMve2@᳘8,{>ͧ;ճmHu}v^lf aVwj{U`WϮ+ c4Ok;qFY,l607 ;1mC޷HJQz]A60g*~vǤ mU#ך;ݭom`0{p;w3ѦT]+}݅^J2h4Fr1`ܵGܦ0iPA(J#dv.W^ήlqwڃs@z=tP F$pK,}͘vBfA"׽ve{&d?^Km[GPaŢ HqMy`e7⋈;:6ӾеMm`0n_]~*չvj76=M6ÊsC=ޖ.Piw,[| r\ 꿅vP&60k뇜ѐh[&_`U$`E %к$"`n}HeK(p^֢Yojf'Qu}0n�Qdp+{*qza�"1~ b6DĢ A➦yXtv60#V"0>̎t4p8d"0Ӿu �N:$v =(7HuN�� �IDATi-ve~lbnI2d5]w؎C淶[uÚmfQ10p/p38:q�0pfq䌄5 ؀fFPPL PPN(}R@ԫwf@(̒ nծעW" plì>. *o' 䶫R7ȊkppZ}qoK&:*&]yt3\�"(-"h+n{rDx("сP54ۖ`BpL^(Zu `<XP�= \�Y XVBq[f\dzMbXG V~ҁkjm[V`4<Yցƪ1[rRL"x`�y<ng-Z�Shlѵpֶхc@~y.,h %tݓ;$I~ 60`l�w> @LEK/-:)g|,24~~Ji&ɅT<W4L.R6nZAV2HF@ h p\P0px"DH{}Z`) 6o)AڮppuÐ2f;ޭ-PsDmEOLzG`Sq@¯9&"9Kl*@H<bZjۺS7 r�8Ѐk p AQZUqr?*`*2g:y@XC` 8 L`J'�' / OW&(LQ죯H Q)Gba@,rJҁ,p8)&Qi F^5L-ڗØj[qW IQ\,9 PDTj4]a Ph*ͣUF0�3@�Tp(¡t(ֶ [NFS�LVﰾ A z6fƸZ;»YAzSb0\{pJҽ8)g`J,Y5 hAWM&(r$Aaゕ=}29I].D/kk" 3u$?QWOZMF6R@4c6 Eq$;t!�x 5D^i<Ђbh,\Zk/".uкYh{H6y=M:MѪ,by8�We1d Y:j.,�Pq[mufRiƧԥb H?uYw*h 6+[|;hѝl㎏k=_NG!\p<G2#)e`�s$Dg’dz23D$ `y>'!1H%+e-HVZԢ _7+ )R :uln9 IzC6nPx@dJgO< y@E.q3c[�%`qUGtVϩYHWz{y,h,p@$ @%@\CP @@ Pc!'Ѹn 6(zOES0mz-YS~ @ _\~ Z�F '1ݖ,�p�S}ok[,f ʀ E%l )<$D& bvb!a601 N% d-@!8B%S$d$f,3eZ@coa>2]E=9hUV |87mƓF\(+/%˘]tP㠫 @h1+'52qKN8ǹp%nU1{qMiJ'3bV9/T�d1U6ų**�!8 \\�mā hb+Z% 4 Z\1ZX]A*OM m@s'mm-ڽuT�Hv P Et#�M!PZ3*~Da_^[p;L<l#mM2 �tZ eJ0y;V; &SIBDDNet)01@Vty*IɄ,rŲ+lHHiN3Zb1+: .|,s\̚gM..<hq !U i9Ѩ4+b('8HGj-AI DQ,+ҕE T9z]A!/ۀDc� @�C qi4q@3GQ�4&(^�f,@*tTfЮDB@֜T�Xpa@U;6o{Tp<|G��0fwI�w!ҵ}S ʾƮ 1sO�Κ(@t 1@lJD +VƟNVœ_ Qhr5JȮ,飙$#˅(G1UWT GlAΌ[|z^K &rf\ K&0q'DTD #$D-K)HIZ0.ebM+RZ4HE#JƹeۣHEۊ;G:4 [N]p_A<g<J (DPƦӶ"M!q  T u[Inۿ ޠ) v{;a?�g76µH]2LF$Ɲd@ 4m!h=۟i1@dhE) lMU�0$FA!WvjK*Ki^\cjVK8bb9. BX_^k⸜~bWufLJ~! OfjSQ1xӢ@E#U :+fk1R͘ʤU1N$bT\V2'6�&IbPiAJc(íT+SHZ1灮\GM@@hR_HP^[cHA!4`$6<u:KCȟr6J ~A1hch$ 궣^oǯ x] 2b@m 4l.XMK/60;qB ix�Z2EpE]UFBl_ e�T%:z aޠs2E%2oN`O22s63IDu%rPe<e8d `7g"a]9|̧ICֽYjjD%A!EǪa%)vh%Nu,j$TMN̙TTEReZH4!:$x/pCM4sS:-!R&<ZSqhdh>~k1NhƮS;F7Q8[nvL˦83*NQx�P` r aieDµ}e%Nl6]J?@c`4Y=V!\wCMiXܖ0m`ֆƷh1_a�OLQ" \`t7!*O4%dl Ȃ%ƔdR%XSd`cⅼfUJHm  *.$詩aڑU'=NR5QJ*y΄+6ZlqҴT9 /* pY]-AqU,:*uq~tJ+5 VqZ7ś\|v,EB,!un065+tM(?KDOYfV֌hh7<z9l{Y%)ԚlD(%)R 0:jiC` 7+Rt.�]Jh^XW9'\_}n60nUpϬ]y" ^|3  WP'L5.aNb*A^r^uAP{m`h_8`)m$2q ¤J|hn7)'FEZ"*j|%^B1c. D͊MSm*J>J8J%4t+H|,LJrȣɛU]Z!$Qoep%4h_</|ܸ_ Z )յSA~0P*gRI-(m#5MD\8:Do+>Wm%ss (˶,7SQ3D-ڔ\rEIknNE\`3H_`ݮY@#Aˀ g,5H�,C!]E NJA=<}_;ڌN2fͷf?A@ � |q#0: rLs.ʉv ?V0'@EV�m95cK% 49acaFPmbddJi#klz)J5JԐWX[VLd%L"!ђW x!q$ .Tx%$ d#|+zՔ@t I"h|"p8:険?zKO _ V^1r#Y+t^KDL)RWVk#)϶?Ct zrb6M!;^W)48hS56QT=$ Ǫr^sqd):,d§*)YXة.n|˺3Sʧ_}jW7ϖ3M>rPໃl`hoR` dm�nuƞkmAI KuNElPFS�F{(!yGK@'FAx4dڨ[ D3.@TςC9B 81*4Ds4$xwƠȥbHra%両I@KDI&25I1g B ǶWh>Nb15hlrk*y/<gA8 Db1sTaC=7oDTWZUCY^dޢ'-LnNK5yqQxl6aAnzCQwIUXV!6G9M^ӑbS FHa*8N.&#"&^詰n-l(�/b~_.0[GGN![&hG2#{Jg^N:A@7!(:"lm,>f EX n4*6p#L)SeT$$%T U {3qBg_ߣ S'ɘqZ)*|7OM ^ ^#<_A%a5k~Lb.PCDND4cWe]Z1G#/Fm!~$U1QU&žmǓZAH)iH>8EuLeTOE -qb]j_PzA yr}6׌EӿވX4bZrE1LGDM WVuS%h]Nfyq<lO˴0u("E;_sן}@nZ=CWͻ}.ǝQt12zQ�Q|ZS8bB"<"5˰<MWCkj&%-ׯz 0&"v)0it�hpp%�8kX|� xW9<׬I0q�dNɊAX4.nwM"%Yr3FR@[I XP5yi8J|=i QDz6*ZEģJjo|ruQ%/Dvllr 1xRx=>JeI$RËQ[pKa%8-5Z5Z{Vhf[$B%D;ZjEBGSd|*=4-f F[3):\R =8`)udy<"A} 3@XuA.i;Z04d:ZS1a&yW_ɒ>F]ֿϼ=zȫP?ӎ,0B4huڰQ2}t~ AsjZKy!r:+a%@ݖ@8=B ԁ&h3dS' 5ZTQ/Ne|Su9 5Ւ$-% A:/z&(Sq.NB!ƒn'N.s+Hd\q HШŲCMJl1/{-3M!ium1P2rbJkHC&cxJ+(;QF"l)B$S#Y5s5<JތlSiʩ)-?6dY37\݆9 s�ZU "Wq뼸"*4vE\2U_P^H$KKc/6stF@`z݆Ӳe @@ac#"4B�M p�"B0!K:Uj!bֺ)lp "էD r]*:ƍ<WI S&|pڳGyF:g1 Glp.88 0 D&&PVVA%A9m 9>P!M)V4hq 8NPhFڑSWnxQCL�{< 9|GU)))KIcJHTܸsKV|3B`r eÄ74>s39)zzCDrɺA@WW$lRDu$UPjI 9rAjQXJK4/f\UOb+M'zjP9O2<QeC4TWr4 ^KnÕhiU^jS;̨NDӺɃ�%xCYn֜Rn[⃺B! BGHs@T9\ltvNq谺gp,͠P@ts#p_++gIqki)AJƗ3Rn:om:70]wdP7Er6r-"(s߀} 70e<g sK�f2 W {Ȣ s-ÜŜЈL(sZ0c,m&1k>=.%˲h榨<('/qW iI9=hDuM"BԒ8ߔz (br=$y P#psR,HR.9bJυ%! 1JD5l2 ^C x9rTeEOP0ȵbAT"Ԍ#"D"q|J1U=dj=52C,g0KO>OB{MGaSLPjVNJZJ&)[.\7E&&/#rj \ nvP sNa=xuq!^_ZO9qZV�d~qn JHgxJfMt0 wJޟ"XO�t3^BD`R?qxd^kjsxe$$Ǖ6͟bY214-QkDTTpVǎ F Gq;PWdhl7u"IpzSSSa&I-'>"S0Zk Y{"qDHPEL 3C/lNsYm9GՐS([<ZVS8GSoHx>RM4{5+3Ti"h* jhujVdLmeZ(q3QA>ɍڢ녚K,|Cw%jFt])qLHգ/Y_r#'|V;U&L1yMsoj-87^mIe'cgSF%i)V�n U@F~Q"CLv9(zVkF9 km5nw[\Cڬ6'ӮOYu6nP6%ay%m'.z)@YK31<`aۯ'(Dc qBl8@"T烒4QQ|*" Rؙ@=F&p1r4fx*>t9h?X:(vgH.7-󽛉d$"(w8Qի1Y+_ïζ*=% W({M9G"�� �IDATyU\3H抶R咆'~QF(XMkE@:1U_$gYOD$E"E ԳRNį7|9i4Dc-H%UE*EU%SŇHHsZ&Bn9qҕ|JB!+F9 ir-MMEpdRUx:,p^׳ڂ5+g/ciA̓6"J6,Hx22QwE2[AZ3 C~%{3�vl٠sQ=vdy�iz@.PKۜJ|p7_+J<1(۟@B&_@*"$f>D8[=92L 9їT@vTI#ۈi͈ HW5#J+pQ!Ԇa B9'2HpFtR_ +<yy~P=56/u[r,q2a4ԑDTb.Eę 4Q('H$j0r|52jkV*DSn|OJsq.rflQ f#芮R*wyUZ".T5ݦou.^Ǽ$TC UE8_ќky OVs| =')SRb0hYK'tiȘQkr[hE#+fN4h=GG>dIt`'d"8 TJpZG-"Pއo,�E }?'"EwL0pwy =>ɷgwU 2;@VMi@m S4F;Nk 4-DDQ&lx9@ n:�NN ɹaЀ7k#ľkHP(Ž=֚Q$IfzШapzebYBFGwCf Tb)6mM?E:ܯ;"پsw<[ "zNJY<yL(i7]#ng醫L= et)/iaddrVzQW)>gE4g*,'c7]Б ^'-Ed6.#h"nw+bt&mj:؋ 6m~׊?.iFb~!fkV"b#$ʍO7"t+.:)a)UF㹃z2z_&MZxr&/1M#A\p?Ny1VR5_o_ fzpeS jc'a<�Ϯ3^e M�Cy B?l017�von% / FVp-#kajݾ5L�~?ن?C|w} vwmH >G)ϵjoDUQ1gBVרVG hYv5;jM}ʪ\]vdBu 6O4K1ktk#?fֱ-#=T0BTe<A:H6yphM4FKiY^*1{lǪ1e1FY$b[ъFn*m}#b?e32i.MEv BӐvt BKx7ݹx/-!d1(z<Ѳ|ɿ+c;r@0!k5)4*_#)({(iijqktωXN\$ˆjh N\6?Vd>>stQzYGT: Va\ C@`P-s9��@I_mf^F^m87McP� [a>G WıT:-�T:}kn)`[}wm~7 �@#@9~/R9HQIÍk|pP� d 48" Qv~sep;R?G8؏I\z1g_梏WJT UqLHx2[Wb; GJg)k28GiAUjևpƍ(dEYzܿSxVu ۡ--[[j]/g eZBOLSQԾqZ$QrS82'Hzh=щ?LU,+m.nU\Ll3SmCCQ4Ϙ 8_vr۪gøwdBi؋ T|T\4M:WCqe=y<r>OHhMihT8`3f׻nm6j,sň(dA^ � ;c�-P PJ^߄߼GY8&;ћZE޶0 @.~ A=w8 @ ~;Ewgv[J.(ن70yww|]:/ dgG@V huQ ;xs2[#t A/3,a[6dܮ,4 0�%9W1ZE1yVփScK0E]n(ٿŁ~٣OM/Y+$]c'^P#χgLe(z&)ɄpO-r9lG8d_LkJ[Di4xŠ8\;YD  K˨` d=nRYՄ٥RY^%e`U\tОY(r&[w݄Kꎬi\XvBeu6LKLeu V$ؾE!kuԌh018b-dT Tpj_')DJӓݪGLz<4J_kA$+K)<=n|{8^XK]-^~C_}m|mv[>iBy +kK,^Ȏ9E[xr9I8޻a~Q9dFyx`|[5G=Y2'% n`<ZX#$8 (:Q(}Y`*$f'| 9 ~]a?%jtŋ v@~V\7*Lf\dj\f >Z'}_?㿘F'wvM]1ç936v8 "bI~׈'ieF0ѿEZoyY"}1D^ ;i*ъG`)FV$bE1ҭG[1:Ҝ}m+eA5 f̋G.4̅|Xif9sپ++)?\mߺFёJ>!M}1-o+b@N 7u/̀jHzyŧ8%Vӯt~0>T\Px{]AC7�G[j$=Tчboh | $�yy2| vn [,D} xMW�runw;%Nnp]kD@)%&&w@rȀq8ݍ!?P{s1z㝌͈.) +dmxQ]dUPHPd\yQ%n2x槾l7 U3E ! 15p8 Uh'WR-?.5 >iK?mMM7DGsb|oR}QEQe= +?;瓏a2~2-ʂ.$'nl,"E0ڱ[c} sιmOVuc֜ zDubٱ9_/u=6eߔ2v8lݐ6kߵLfD};$@~3n8sjxxv~5mSDQڑWw�B<tV FU{Jkw$j4A/\lƃ9}7xfp~cH <ō5Si%kZnG̃}zs8'g^߿o^X*߮~@,/uvyHd? }%<NoѬ(42�>l@nI`.0 _tyD层~[`FֶL  IËt6 Fx}I}*$2\Ժl!W֙Z-I/Svjmbb r$睉G�sVύdQo~9ر,y,2"( b +șt=Q ˏ|+CbMԣAƣBOr6qH0!$J}aڴUrTvtK 4ư OTɮl Lg洬w }j=^aOhXWlYC㺍y4EMye/惛>d3gbtXخqBFb|GER`ݬS r(j n-<}o >K))\i}?7oz'�%�4^7 7#j*x[f Cs䍽\ntNmPһq?Y_x[p Jzqzo' /_ iW/I?F (ny0V 3JJ{V $II$~mq(v$gJ4B/Zo6nF7Pǐ:FS2 Q<KG#emy(̣/\h3 =ȣ!1* ن:=N&8+0&;L+fn' 3SFD>O&F}g{Ǒ<XmNr9q@%|LX2&]S<c*\*+UC:a6F*g6I4s/S/lEjL!mFNTN&ykKEDұp>עdشQx&|{7ܙ!~Y1OLV%6_JT\J"3p~ `zk}5U`Q�YV8861f5xyM0b_R�Kwʚ0b8^E㕾6~`>ήon.olV#0gz] L4^BH 9GIdWP$MyݺtY95D:LaU5G:ZF&.7mDM&7#%C'eoP&I$s(++79a姱yv\ [.q*&`6[x:=q kV WtΆ^OmA/eQ"eɈDgO?S}.U< {;}ŋ.&3 Q+)H!G0Sh֍9g5W$}S5žAuT,:h᧨,Ȅ0]ҭWN! zp/<tSIOX|Bd 5LmT!np1T KQ)~#|ŦW TeuVE(vb8*Ho)@p|=+�z 8YH-(m!_/UynmSdP }J!Sw�{06owË{ݐ8^ܾeDc"`;0.b21fRϴLqB#)!v{3Vid/BKBq`.sι(8%k,��z%5EKiz$T;˵ Ɲz+)L>1;)_f}!I~8=>鋡eTg)7$ί;m:M1~T%h 'pV8LҩPs'8hȏ#_h8Cfb1|Y(CҔْfo,YxrX$uB6dc IBWb4)EJR (qmI4kG6}Fn$E;}sn,5G-.6.^%A˪UfJAwĝs6Z6 ,x&cHq~6,A$z.)0`FPh*p$İ7Df A_�W79b a*H|zh}GA֤M^+]{6pp'U͆(ѭς͐3ގ.W꧀+={t[Br 3ecS�y½a]D�a&3,b4YyE|p[ rZ8^$jҋr`y4مf,C8,]͹NCJLj~Slip Zn/Gu |gbQT'Ǟ�YYnCn~}*}|(3 8F lߌmIPX0pZO=ٖ}"$jlC(>HvaJDpr"&`Bmb,? b'c.tbf1Mm/FqIij562ԌV-hȝL(@I€jTq#- Xr)A@:MʊN3͢1^~eL-4ۉ#]êqN&'H|^v=;^-W,gjGß0M&jK̑$ATk b GY4�%}ܥ�M�Cq]~Wt>Mgc{@}\| ]𦍡\R|_w7.= -!L1MfkAh@ s˷9пB#&SJc +涧j&6b8ګuActCE I$%O@* j EQvmfղY- Nhm_I}23!? ͟'|gQdHuINgm5hLESyVB~˫nU~S]cKI] N49G9x ?ɘy#fWqǾ !vN5IO%$4 .&Н&IC8r饛xձyAi?1M~ I♗)iX1MeMso}!XΒ`kw ]88&4Rb|Po]UD==F`Q|p,tsRqt`i_0'6=b+$3DLKduw(KcG,4~Oюuiʍt},vJ?Mڨ n+:2ŹD3Hs$�ڻ*>PC_f_Wg pm[u8FzZZYy؆̱; ϓޓуz}6fb Ϯ �au 3uE@@ð@X^SdF CI^Nd9<8ˋO/-Y�E~L>2x�lYzGƦ_YߊYF<k?٨t'w{wO=_)YﶦU.%BG)³6)H/A8<bYKХv0BX{i=16u} &Xlq'_7ԺծF3Gs׳q΄I`x'DLhw1BGƿ#{9gQ4D4&HS:1[p!x靣=cl S&)"@"d;4'sN [S c'^M8n8IG6[aF/ز1dK곈l �� �IDATB&<BdmuE#qTD;͇6/:3au‰Xe1O?yrSMqsIIwМd_4Q6ٟ֛͕J$a>QOb"l-((bF^6l$_ C7dTb~+YoCndN)D Ӿv<vY̠Ս5V8}| 0?ToV @qmڏrq�Fݾ.lJ3s+xT.�3cLJjK|= x :h%Pft p5bOa՗.󣜒4$c!9~I FQD'$Ljk :g?IJ|**9=^Bٜ^É$;i-PU|c0V%qyI< < b0kq'?S'.q8L90t轜4BP6t]^GÄϷ<K۶ D?qM0-2&DRSJc܎N3">,HB*I2NQИH 3ZU�)s,HY uP[ӗ[G!;8HtOh9CȂjjA~0o(\ӅmNт)"[.eYSeU~ZYOm<bR>)_߰Q>*({X0FMrwBm>YA7eu�F<1r|vwO<P^\/) 0ܮн*\&jh|_]|9m�D䎏$wio0n~cCQ*ٗȗl?j'\C7= ,яU+o,U1(I]рǸR<DDHegCS$1#M"<IQ2<z  &"rZ]<9=|gݸʓi·f"Wia)Ga{0b:/hڶ5ٜk?R tю uΒ>Ӈ"t8O!H졡q%p[ dos͌[-uzw֯~GWZ UǾ<Iv7.[_5{*Y11Q@m#m[<=pc2F>Ac Ax(v{lF$mRD0=zrD*+{ʀ9Ef;}x䏢׍ .=QWݯ#uf7&rnY$6kffa|Etf9MʒE2;lj Xrԇ>DZpCJ:FyO&v̹PRAOny0@?ȍ/{_}&"a!@QZ}X5/|DL̺739Qo1 @ {o{;xyxc{K w:$}D b;:*d�I�-Y [KI|]H'2LI'#;@уdѡs ƄI[X)YqmϢ{I"؎(0釖E(d8K=-y>GYcWׄ޷Ͼ7x4M ud_|bA=Ҷ>Xdt?nJF;]z qʑ<A!ϩ:DM^(zN~Y~K#VϥPLm08#-S`4Ü4ҭYDIә1#!39a%TaDJ'QF3AZ?n12VHǓ֪ޅHqpH9WAN NiW6 j>D7gQ4r]ӱEr? Д %U;*hl:ks 5t^:A\^^ -4.^!@ <=.{~ۧ|YA pDpBߺ>Mr̀^0_[rkDe"p i!Hm' %�Ň^@J9RW2Kҵ�~)p(bD% L#�Zֈ�Kuۅe7X t?JN!{>ю W7vo<!2ΗQ_ɴR #Ҩ7mE.+b;MBSƒ`/NjgM7r 9z) ecHaR2Ìg'Vq$)n|gPL%Wz2y9-rbҔH>Ŗ$n&,x7~6ikm gr&VpóU"#-�/=,1DMß<ᙘQ\ch|[˜M.yര 2Xr‚kcy\,%$X"I FSIȜ@iRl/Jt8GCrS3vkZ`=u=YnYLECg21>ݤDdf Ҫ�*!Ipq:p?¥4.@]2=he&]<_ +m({N'Hи:�^v a5P$�vK#`A%aDmp[4%0I%S,nbN>� p)Q>x m=+lS q8#6Sn+U@i=k-1|Gb7z W .vQPd[^E $ Yœw3ILl^U`Fd7hTvE/FyoJ?Gg;~!Y+)*UA=Z׆AGCs_GZe]HM/jƟoClrˏK+/?u&t ~ )퇤1R\٬d`*,~AG+Rw j,ּ:Uu]ՠl#jjM!qZ$H-ωpRdGd}?3m$"(! J\A̫dT** KE_#iEf18  +.� )Ǝ:!SQB,G.dیhG.#p>`heNDQ\L͆FK]o?m6?" SHCd9fgĈN!Y` d�pn~vyFKḹ#%Hؠ(}?7M1 M~ ׸4Q r^wּ 彙RDH(JEq`J_;XO/{O]Aqj(ߞDXe.()t@rHfR`"`~)2̷(nc3@GDx(!}?XQPk{s :wT:lF$ωU,Zvbb`E3Ea!@0)-Byܿ` yA^M&dIo,J]HSeEP,aQZLs')K%,ymLczVYOXL 5$&;pё8JNFpx?K4ִRR5-\>#Q�Qd(*9{ĺ̎Q2R"LC^J^�$x 4CGf"JF)AlReyf$|k(TU^4J$cz2.j6.!s'tY(JT~K%my 3Hg a3ILR+69WZEF ͋lϹY;]Y궿m,<N,Ya݁7DT8}}à W8K6' :m1�./yqN�UJZ!=m {!?D6w~2iMKܳc9`=):5SXi=u #ubD^)z" B_og.)S\'SxxTjG}OEB0m+dec@xtN~+!aB86 |6DoW3d6n/8_"S2-8Ui͢'fy3ML؏'<;5h<[,*L;X!W;dx`Y,IJE<zhail}Ll_u̦ywF;PL Xe)ǴgGa$Իc3!O`mQ^[mv!P%K޶Wkhd|:Y7RE&2]L%xR. >V e'O+"Ii7g.$G*̌ 6n0Fi[#DJ湡u'}Zm܅^ƒ'.>b_fK/ؓR|u.COvM%!h }^` Z @��+'(w+\~Q^cczݺՃ/})9n#`~/j)e跔yK_mޭوoֽyۼF KGN� -6#@:k]BO1vC?C GPj9ÀvT �8o5ɸ˖UcuU_Nb"3ژg}>SdxڻݕH<j$A1t΁@O苧NZ# Ir͞_H=aI<. ڱBHe3~VdqA-$iY_Ŧ#Id~6{:P3FJ(Zrײo*2Ii/&MD.d.J4 Ӭ$(0W*Hn]7Ĵ>#l-@il<#*E=s6?&}G8^qxZhjZ #W#˷A*Ocb"ȠܙO3V1J ⁱ!BdL 28DDQhIw<Ck6O k,ot);|Njj4 ᯫz @Qf/dзg l# #d(˛}5c�D@q]zwhjd%r�_o^ZǷǷ{Z?l¼]5�XLZ]})I /wKڗ}^K%u9lxkX߭و˚5܇^C;y]!VHDdж!%Zu|Ik؏u9-o(t2Eo.R!lЃd˟O&~ƒ%DP=UXlJBVt[si#savWn*Hg=(0`>|4y;,�*uaOۇmg]7MsRϢ]}1o!g|6UY1 끶K˼:|=")[ }IFHV-A,|4!I6 .}DR|.oSgHN%UpQҡo".&&9-=%I6V#:sW) #zaL%a=ttsBZB#pzSab;.R )a|B)vhC}׹v\�Ү?wl1bWȝ$El&LH)fW8$R7E`M?smk1ȫ*"S(lhF0M&]El'Y>{3[py1朘HI*\n{xs?K_K(l 3CLgs?$I%%J6yo/X|rQת5L6Ww~/g&޿jHx~x+HM ^ =uמ-շGkoO$9NSf8o�HFaJ$&�G±#̢]<?/^Z�];]ux1'8�g}!$A d֤']\>4P o> @qog3;08T`BJMjJHXW1y~R7y( =I07,~Y[^v?ry4z NtJbT+Gm)8&8l"|]Cw3Q61㰡y>jWy)o7|Y "铊qI\`Yhd 5ϔV:.&\.l\h)d^&Mv|m"2%`q1 U"as`ɑȐ ܳeAf,!WaD&qF&n BrqJ"TD-, <dGWC攰r)7NOEoy"&g)r=xع[k//^Wi*я@$U++NIb.\~|{]/{YVʕ%S.f+FvN3]"_}]�շ~ kWP;V8oƫ5ۤZ�7ƱoMۻJϞzwe7w^` b?wI#,(�8  h@Cb>L[.^"zp1%\}^+kB05 USLy-@|1 7g#G MEJf [OzA_a|ks%Ďb,e+u̶gSZ\MMiZYr9=l2P咓 =<;lvN$+<Mi(KsoA9\-Y]W~9<Wt%H%g\K'%2.tI"mZێ;kLJ'T$Do`ht"5ESc \/J}%XQFC>1-m!h5"P(3F("u-.ު`TkCdά:'h%ه| yHΚ$v )Wi*1}midy~|6#RzJyjz�4Evl|w9cZfΎd.?nكI, %@I,HI;ܴ5g�h`[BO*%G+k06= pp`\y*aŗS} wAobٽ6Sygq׭r~vHc |4`}s�ER0?TG[y{Q pp\6 m_ͦ�Z9lT$  ƅLm~3EpH*Ayo7SLpqboz7Dmq59˗G",}č{0!q6a5ت&lk`V('ӗMT*; \}~ɓ"t߇3pwD5gC]ttx<LǴo+[iܰO@(Ԯ ҆L)m5v+ 3'K6eQ2d)CbYqiRI{8Y)2(bD)Ό0LRQJDSޮĻb@8ENqBʶ@QyY~ 6ARLn :E8KMX̢ sI# HD*'ij@+qUFPH{BiGx4|LdM4§1AIŠ2>E9Ah]`<R#bVЦ]Ӫ4̹ul6cp>=Otf]a۬RԱDrˈF7_a+bpڂ�dCw-/`tNyW�ZO[Q�&$X]]$�� �IDAT U-chwU (meĬ?g{]-,y6BpϿk`f`[&5}^6�"r[R@q&x?кY \0 550'3Ѓ`٣�HZV&Zt-?҅GXhwH,!ٱFױu&cC7x{)FgAY׶& E#8=\A$_uJ! &7ۏ+"*;.o6<dOg>U5BHB %5O9C!OA[<%1ܩ(j\Qb!JtI8)G<b e[͆!ʍȌYS=z)ZAD ccdcTzjBB^:A΃Ќ H1+&� ٸ+˙Ƶ<HL?Ha:"h<<)dc#Ψl{K漤sݐ,K1WʎeFvFDQb!LB#-iY6Ք2`Y.oVEZ{?ddj"i8t<۾spXC.%�D* V a6vo=j f�׍A3;! O �}?g.!ο]FxK߿/~~Ւ~E[ab1ܣ}힁~uݿhh 0iY%-"l7bq>;?@!fxϑ=R)DG #,>֜p;;IVdPb>+Z'x/7R[[A| bm˲A%FLK[nmW_#'>ˤmgh, lSmm'v^  U&~ J2TUi9cHø2Z{6$⨓U>?1UF"X2A<]VA"01P>JARai841eDNF!$3ɻ1&I=5TPNyU*gDdQJǓ)OdCYEY MHL8:n|uلbDxﰕRRlts^5YNfYYԏd~6 au*KksɒRsdQdC%lVܺUـPj)f9( ӵpد6|M&wQ~f! /j`|:}pb)y wGm@,#`kȥXpEz>7ϽB�<8�j ?#`o%,z`ncP cga`7h`%>�J0toJ-Y~jxcⶃP@ /&�$U/by>|m--Ѹ3Gb@<H=ŭ+K_ t9x^\=o'w!7@X>/2 $[j>_Q Y#+D⚸1P[=ջW$XêOlwQi铺1?:gUAONU:nFt^4*DǔE"{ͧeN}f 72>7*sK6h%%łN<J` U~08>H!9ir$E#3pTH114Q+ʸO &(S**n!5g!["S5-*QL0Aw" <ɬL= $BKdEfc?t2S" ~gz5G,oӁwQ 9(2CVVib:elKfc+H>ՄJ8#kԢ`lVS=ֆ׭{;p [Wz#q@6ft~6DZR]pǨhͬ­v+ /쇝x<V:@Zwce4rx%X %zW#]H o^׀5oדwI}xo]pQJf Ń5ZA$ vw'L�z �$d&WZA �O ,(?PJ^[؂<0%sҩq<7 <uD;i0j{dyŠV/*yAOٟX0beUpTɎnU)ip4 GK)%QuU KM6}܎.Á[yÄcx 72Ńe_p2z/DW-yڝmH8=C9ߝC]N DGӒeaS#\PрH&:xD%5 w12L)apHZ!2z OJӐ1xT DM3%Db d SHDD0DfKΘ@h&+ze"528hJ;G.Z/2t@d1Y+D9"Ky#R>EWb1h=r|JY<D𪙞jv3BӴiWrvP싎ɜ1qt氻qնzG+=K` >)'J8U+<o>S�JW G#68 .햁55P PZ- f϶ź H)ӥP"B}Mȁ /{~%4Re~q =_&akX<hKj]B85v Z^n{fA1bn>fA=o3#+ٺ^'"n *4VⅿދŬ;fgLVϱ_A�m'R {њn<rH`*& ϧ:qOHC X<[Z; dl6ӚrRpbyђ++OvT͊8\; uOWWĎ^lȿ& ;AeJD 'k"|5?VGGFts+ga7Ǖ8NTcGL*M:H-PlKi" 0=OOBR2D!cH £J(>s H}4\H\B|΀<`}iU!� 3I"%1Y'USI<P'b>(r$W)!YY;K,s脹}F3>+f"2m=C* ,nQ匊^WgxLU�V>K>>3zig9~9+ MHxڜ=hNJEqp0  bMSw[=ڲ~�0݀ #[OF׷-+fc[Ōm�|'5Ee$O{-R>gt)j^{ny)p@~_$ 5Ax`w^ 8dtU$ps{7H9櫹E'[slܫ9}3a؂1qm\NXC1EЦ;l)P,Af[x !u&5UOZ5y< WD*MvD$;neƘp\ Vմٮ $)pA&N0Ճ|Rpr67u]~G'V>Ud'1ץ<c=7}~a练C~::3Wjd6<b(v]ⰻ >Lڡ]QfKUvSLR9T |:j8+H$qv9sgaɌ6%^KCc kbNKh!)#˒ЅtcऋsC5-9ᑺDDR*MKgGQ><p9PIZk St6JDd10F1PGeb04D钤孯0TYuLQRBQI&<lE7#O'yҧdfYXǍ3U}s5+q%b[BF+A0 zȚ|һX`}&Բ^<=+ hK^_)Ŷd]+bމI{ȼUy(p-=9mv, , ۤݑ= 5pPJAsjb8`o#΍UM,/ܾ;Kxܷ}+'t)�3`/�K۴@}琙zqC`GXhflfÛݎNU%n<@HG[ + wDVB[>)$T˺!?ޚYȅbG(zҷb_Ul2q-_=>Z,ͷ\?t0/dqH+ݲ2WSVU|zq;1Ew0I殤uDUBE/s2I-W~iL/aٜ1WnUUu!u;%^P*+F ʉY ҏ;f"T܅`\BNP t PfЄVް 4$hWKr`A,ʓN<ph6zGh,He\P0*\&/hX#gLӜ1H`)j NR.xHL1 ()cA\(]I* <g:ESdyu%D3C<[-E&&a0|7$ei5p̘,!kBb3˞SRe8gYFK^=cs^\V0x|ę_njIZ@6@] GG_~GiH�q^ؾ y"]Cՙ �W@I<_6!X@?{nEǶ@WVI|C^fpX]B{/ǿAw w {ov7u_1H`X`}YF8f hAX^7 ?C>TKX|}xL{Wsez+.Npo cWe#<В�_,% $� !fxP.@H9 O*)RiFҌ3.eTS$&k7aCA=V˯P/H vIĤXyo s|lagM[k/1RYq;dY4mnof],$&^Q 4P#\8J[iyn<ՠK% |4h ;c €0nɮi)x9L9Ǵ'2ŠKi*O&:JU.Sj%)E-M R?D0JtH D2&Y&rxbd RP28|ɔR'P )]! K%ЊąH;O9QD`H96D\I1c]Υs+34YYe? WC']sHA&e1V^ vi-5򃏊|,ZYt0JJҞ$i02=Lv|I_4Βmsl=HG zG瓔%Dc= ȿFyC>o  rV Mպ4/صr.vGm_ -0u%Qo;|׼0Ƒ+k;ՓVHX2[4B~4`(#ȧ(DMeR*M􌟧.ݿHՒC@fPxf �( .2,}crSmIQjpu{܄m.韑*RjeE=g0F"$æ\wż3N~]jGS^4 Myy}( nH-׈ Zl)']BF3_`NW˽T uGY2R!OAMDgt?()Exz584+=Xg,A >7qV VI5 'y:))CrH&Ą B�`Ҕ#D<gHH Z'F D(w$˨ˊH ɑTDODh2>TԉB$%Did ,jJx^r۠ϼ 6 > *TiHCMȮ}[#s-BP*>cbg8V~7pI&NQ6f =Dvv0}ϸPus]Gvxȇ=]=P`c{[�3 %6c() (eo]W7 zC0_uUB^;;\@('[zo3k DzRzF7w\. H7.eڄ/f h{k͎r?~ "Hwʘ3z d^W]@ԃlA{L�&\YҏB� _<<#eg4 K#:JBOZU-ήiyw'GPCo?+ Wӣj9lv4yNBaQ/QL=GA0䶷n*_ALVXV31u#tfkc*/M߯꯼KͼxvXwaN{֛7/j"N1aw#*[B0V˼N h*zZۚM5_3IgUH%̸XvLdga}BS%XAR".͜+iQ=, Ռ^TF'i1RUiY:˴'H`HF(8;,BC$6I"yJQщ2cZ<CHH)eJ˜`)bc"#eG#qFf. TqF:$8#X!A{cHDdD;m}]޲wnH2\dq++? }=<۷n:B1R) I>E*Yp4h7և{Yn[R3~>E🦮/LU4w# 1FRNqh)_`hlwa=ރoWYCWZ=CvN򞝚w?3`19hoנ߂ {NN~heAfG)HP*{�o09F ӄ~β@$Q֕Wh:2!+,݂J}{>ޱ@eѯolڰw kazzT&Qz-Nk`W2^9ZYs W_~5ΒOv J ƹNg]IV'=7 rF܋5>(0kWG#Hi6v N;]>Km ld{ 3yz# 2‡؋aLxe<9Ύvi*M[” v:N[-EL\9l/n_͛qJtiuĉa]^TVҜQ Jep Al3IreL54Φ$R$њ3>:W-tI P خ\ %Xi 3dXQN"X0m&D)JR G˜,* ^H 5Ƀ΁@WRC"L#q&iH sN2i�I ^S@$ʂ Nvރaݍ=4,NXhittynXp%ȲUF!'ສ<KA<w)Da UKq9FhS53Y}$e5MDNpFۗ̐)ߞ[&i؎d;v~5!vq\۷6B=t/"ҧ{ C_VM`πT"}3&~pNa7m=d?Vo'M 6Z �� �IDAT;? u1k|8;c&#&1}&g@u7˘ 5`! Q[f� G_ō~(vYT1XۙQ 3bwk:XqtZY (,V:_Y.W,kW*l]N'8,O7E-'&;,]Wak� AVHѰ C} ƨU)> /'7/U] qV2dī^׶<t6{{ARE(QV&*ڭ,9WVGmW-۲͟A+L [[['|<=}*Rf]: lc&2b sav$dlgLIH!B:*nB3ʸ "yQ$IЎiA(2(%fl8 D2 us42@("CD$$M4qKЦܘID>A R".Cp&4ZQ")Bi�OSbD HD#0HL)KN9U3Bb�u >@0�N! AQEhGˬgCCƲd<5ݰyGՄU<Yx[k|QT]ZPu-!+,ҍ(}r&-2ڨF\8qcjN6/v#IGBm]vz`Pk@#KXDxm H<\�9.�ܶ ȁ�5a÷lx|>x/zo~my$@ ^1oq7}X"}̕}K7ξKkk]?*@?戋zM2mѦ>O% @1O<S6DQ+XYK"md%OZ[;``'Eq>9 Ya2.ZPq]Ș4̣?#äϵQ'9( rAd&22bx+ݡwJ5ЛʸWe&a'P\`FO8`j.^p8>T-Ե|K~hbCӿLu_uwi åMÀu䟙4*x̯6UB=)o'0f g6T*j3dD*Ej4,3D>OHѨ(4)0x o!C!} "h`41c$̱DaLp6aPBH#D JAh"qDbKmz *4j)4<!]HQ!)$|"2P922JDCMz,bS^,c44(h7ss*23MEc','EHFJ]S/ TojOg^Gn,wy#跸8nzuz D«v>@Èe@. .d=L8�sO2V�C1q{_cSwrFE'i{}|ָ)ޑnQ=4XOI?05w߿nٛ�s7SL%P7;ԀCcˏiFxHs Ažc A@L+%r>n೛~/G R[P�s zh m*M^)WI6WEsu$LRJ&KM4g2S5[0^MjUpaہy!x1)ů abIKd,:x<)UѐjKӕ?;ƾ:ú4m2dٝd7?uo\]3�@$LVES%Kѡ7Y?#n#dw*I,$MgdbIu߀{oX{ZTOvEbkw|L񸝪%[K7SkW-Xh{̼.H0fDs:WKN^)h !'9T۪E0.(8mlH 22&ƆFʐM,!X!ejot0|a@1HYymVF(SvȑD"LK6Gn'7i.2ɉdQ4I*&UV!), $cNDN 1ȉy9s&J 1) e^Y@}L^q+il> !&'RZ1s!(c}&јrD3ѝ dᗶ?sVug+5W~$g5>pQ= 9‹j1ǽ8�l qo�kNH?ds NwGo�^Z�%nY£?/zᏚ~<�plDqU>ΞFx2'|q"QyXD=eu6%3GXc\6t_4ʯ.4p M@ |xc=[ ؃&ύOW ҲK^և1yS?__]j,56a~#gI֭n_lPsM&_F1lM}:)φmk_*É9/Dђ֪nK5vY>ᴿz?/y.?-:]m*~zT)ţ=h2N'nlQO/\hv L++@U)ZsIh.Xn&-IuS.lHRfrD,F&/4 d %`8'%k VWdxLRW{)9He˄1 Q4ʜ(S"xTQ5s%lyAd!=SYi4s((I,J bBr3e. Jה '43`Q>GY!Jߒ|<Hg"0wI Ov"*vU.8w_TĸmUҲa5|-ɺ�X OSI:eEU1F !ȰblrX]zz^^boo�~'%_wcn/}utC%D=>޼:AզȁW{ XA ~TQoX@>f9K%9`z>˲ݍ +-SBX??hS?ޠRLUvܴC]kB=Gm*DZ{zs[VU5_eXzBl&7!�t/|)BJ-VF}Vm]A2nNn)z >))K\cZ%5UKk+^tS^Y'w41|Dz3]*m"F/xCeApbQ(.O3t V<M֡݋TJVm)þvrVޖe]IGݸ_9wkJ-mZ-ֈҢCME]Aοe t@Y%D)gBEŪuqij:22x7bu.iXj ^,3Z%%t R2AW1LLLO`ǔx&,l*xÂrJGCĤ89uɢIpEG晘%"YO$YT\VL2XRa(HR( b!!Zb MycI6 %\L.f+O3ec`͙Y.$76 5pϋf%Yl⨙.Xٌa<LDT2樖\5M6:lfD:M|-_Âh{m(_ƳP$|=k%F͏:u(ة.M\.GI&zmc{{ O_Eh*@~Z,S/@ @G9)! x>V 9`3:)/=ɣG@@^-]{\s}:s5HF Vt}+i:]cJ"G-1EYa} 9x~@W8>Zmbw/7.; ˓T0O?K=Y2n[ëBIGr :.O5os+h. >󛟜jjsldw):;4ިIҗ>߱&uRʇQg&'D6|/Qˇ7%+TX[+@_D0L &צSl0 _&׮�ąfe!v(B&f~S Zm^S<=qDKφFs]UŲ$(EJZKS3%P1ᢂV;"yhϳ+RB19%f,\9iŽ <g 0S,$AYp"s%|{Kn cx7V8X% θk g pDL9smJY 8<2.9AtY2@60N%f9% 4�:RR%ZH!5|]6$N\ѤєBڑT1֏ xWQR5Ra\kVTۢ mm>4D O1 vąӻ%|syR㲺eV;1&,컫G?7 %3oOءo}y۬__gt/*1z"wֆ?b1鏛EnGɣڽ(u|w/oaPX6ZX~TJ/<y29yIG'gnAy̥Q@gkd7qmH&O+z[CoxiҩFXۛaIٜnɓrU֒ku燦Ͼx<MSW!SQf å)0=D~ىhL5~1?*#X%սzg5vg:4+'\Q%ή4ߥ|nօ.v?eǪ{kEZG0G%n~-pe$bNPMbC"+2SC’6i>LAr#Q0YqߘTM$2AW1*`\j$,bBZJ0ȳ9JZ<aޅa8:X*8* }B-9deY)'bl4zsdCSSUպ*ʅ0 199 D8$ќ+!!RS.9礕`޺BHsH6D\gYV3 E6Eq bEns%uˤ2:Wh8."�juЖDپ*8^Ǧz!`q. L꫰͌Ы;=ٝ- 뻃π 8ř32^m<rxW8"ufΚhU~}_|{MW7hx쿃S?BϠ7B^goTmx{k-{]o.A! tΈJA46N`A+5Ǽ>ܦB~eY^Qy)ymG'@=> @\ǫxVsJ 6F}<Vq#HJf|&e@DTղբ 2ǵ cQ!Ҹ7v_4ͼ)*THoK9[so.+V<⟮ؓBݒ.n7'Jív~BJ׸]rVPSgo}7~?ua2\__!!Xjolgx$‘0\_[.ɟgd{jSz FTGJdȲZHj,Kd<&ZX%oJIQHxg"stF1)f�PEp/SV\@3(09xѻsJZcHlٓqqU1fcJ6:eCS<HgΌnnZ�QX1%cfY}*5Z$=L{ɽBЉ,TB*F`$2hed�E82!Ce=B)f.ڨ AeTĔ\Lpń*J(OF4ǦMm8g8cyG%"g�&b8,4xQU3|'<Ex.]*M87VY]r]*w?yw_hԣ_ĶOųbߎB%XB8vwqrK 7[L^�f4~ ~ƛZo8m~/g-{nqq}\^i0r}\O477tSᑵ i< =J\fizdg j\ЄиenB =}Kd]26FIV'_k>rVM<9ZbI|ybs?[?.IBy_˅n* cFl}g掦G'BL/]O[CY,ӕש[,[ gO>|9\46q"-- OFyZ?7/K5,m1օN:!l-f*莮/V6]l " BIP4NDBU4 SB. ;; ZWqւs6-X^@zD{H%-Rje&�)C,*=ơ"qRV<JH9#3E d_Py{XFTQ27 Jqet4"|bи9S")sGb@` "g@ $. 3bAD@d%)ɺJ2g4UJD# i~FUUw.iƘ"I LH11Ǹ%1\!f2qF;kwjQ40itC'R Li> JoSjl0y4|eP.Oc7UKFX\6o2*Uz G8@fKD ؂o_} )`/ߦC}�B}Si~''W|C ⾿z~&ћ_x|<[{a6Mõ~b $_ l� 断\|SO[^d<U#}, WtJ11�aB| Riߗi3)Mi桔Yڵn"%=ۛ@\V{]Ⰳ<PIHI;Pq|YWF!ץ$,7X?Sp< ~懍J+X\T>:MT\WS,3ZosZ>?ݚ+!/Ho1L]?rOdRV"\v�*'ϝbTRIfXҊ47d[ Ki}NLcZH"znBuƗ|6 p^L42g>{cEv%'#VԍsH)Z[8qnT2<Q#dNǔM+$M o 5yrBp3YJj 8AH]Q$} ;܂b�c<Qe2k;d5B:LAFȌ4SA2<&={ŕ)0`,E>m4Tj$ xp)AءJu4ݠ_x I#bLl~NiIl>noo׊VGW?EܾAm7wٺ6 7#>G /@D|| D{ xKnh/y#ޮ7'T·)2[xs$&3�� �IDATCpZ<p@U+K'=*`Qs =w{|5Uh"_]s?#ۤV[)f g|.]dt ;Tih_\2;f">d 9?r |<:*K6):ڝwrEM". MsVc7zn>t߀ kj"qՅtg\Dj2Bmh3:U:u]z;{79%bNZ͓MsOwEBu}Q[Aj]/f V!mPF?,.3-We(cPC<ҡiJɒ2 Ooô[gjydlhM궨j]r/g)\:ddjJ(9v<Lβ,sw<e*ɼ`J$>쥖57)<d3Ww ]/Bgn4E*מ!T(F^] !jј:<2DLF I\Hp9 0&)đ$rx29H0KT 2� XsMe 2yiWݑHQETMJV܄~f6́ԔR8ەtͥvj,,URrHX{_L=_i^7V~UU< 4wY/U7V^.*vvq֯#DWR$~6�<?ǁ-/qc5�C={#=ͽ]w8wo|z_6bq<#B@"$߮fyyg�2קtn_ذj tYS=7HalK1vG~'2u.5̌́dyr]J%О-_<8}&7))!Fhx V"<p"\5\?xŽii>|`R: ȸ b)4,0S7(k(O&W/2b7]Y)JR?q/ †A,/6iՀ;,wľ֜VRGKŰ Օtu)VdYf͑U%Nyp'h^i?+k ܦ]63hyB ."s%x&K7"U@%B BQ!GbwvdD!W5IC)ycH^"Pb!+#VW)H+*hȌsf$$ D#[<VR^^<2Jw1&ǐ\ĂJYj%_H,!;\d )(ܓK]a %dekK %�1RJw0<]|ֲn9BR+L$e>hpwRq@E;Brﲸ"O6׫ k1'?:LJ͠vURn:9`z`}!$� t->?@ȯ9IUZo4_ћozJ7?2 t_61bQŻݼ{ =`f@Z7 bw{cOW謮qݣ9=>k+'pDuAIx7E΋<]'6~,~f,j<w_w𢖷rt<-0KI5&k;B?o_78s 0rͲV*^~ 52]niz5ԝ'+t+ X HQ"e5F+w\<wzh}6z|<{_3+{Js?yKZ7X^;^:%C*zE )8{m Ul=pA^z ]B^%cd1&Fƥ5b#x+hX9 +P"q|YEYhzB& y8JJ"rs4ݒ?Z b<K"U JP R΄I8LiJW gTʺ"0`3 )#<8Z B(p )R<þYqΪqw\r2sN*ed=DAY)E|C ÖJ(Glظ C*_?y ,dԛKgWA!VQL:L/d9,Bl$*DxP tUS|T/0VOLߥa=P. BxوcO(v]-P�#l'}xBћv@^V ?Wg$W9 %z,r(HU6|oojS&A֯]N8{m-|ir_붫Q?}<Uv9 X�@ٯ .I1oe9_6y{#Kw-'Q;t܃C* t?KÍƋ:%%YCޖ܎؁qzZ4'6,[[Qp`E?AJ츸2CK;(ao9]թOrz3['&5+sų GwKc|@Ɛ~W1jJ6TUyX}Л64buS'(§'r)c^&.J|ۄjä2z?Ͻ4')^uE4uo %@v cIyq3:QR)%B`!XX!!ihdP,JI%.RX UdmDg$GJ +y"g.GLм !G.r EGRttabf9QvD<'P$ D9R"祋LJDcL*r΍"%B[/<9QCfAlL.%/M[֝IM8nW][9낳iZh)Ÿ\LV8T-ǖ-.D|m!QjK%9.ҭ}u'/?<kun Т! QL_We-PwЀ_of{A޽C ^K ��.Gjwxmpﴋ~+E-}+-doۻg|+^4O0Z?kZv$֟g/W;~עK((=ር)KiSwn};B쯏kݝy}{ȝpfKӦ;6`җs5E+1ӶUj!6cGu"\vcsj0g~ivǛnêV_ċL0sz?}tGP>` jEgIɜWU>JूjP}hYM+Z6rόU+!|Z9Q$!/!2P+x̺]؁PU-A6~]NsNJ-PJH&c}ϙrkaZJL|at6F7X$0E^pڂcTBx\ q 4LRh)$Q%SQ|$ȂfI!T�0e#XGecRV"3(i<N(m% +1LYBq$q)<qI>>xǕRDɸ1XɌ JY)EOU-*&M]:l3w\ضFHTiQʲIjlW,#nd{VTz4%>p)^԰~8_:7 U$~"ROu5Z٣qM%O嗟0>2B0(k| y']#+LY3tE5%|/{t?)qw+o?קE#*7p3xF5v.ftuP0ԉ>~: ~Ve5V2j“Op1B:RVq[V7 i ~AqRoM{AeLiΌywdy!xcbh7ªtq` n.{ Ci٪r~ؼ$ h?\q!~ee3d<@wu['λġ*hp*~d ܻ;)S!Q8Qlk~n]ss u"g_ kF9q>e#Sv|PLMn^ ADYOUM,òGU]#[ˏ]}2S<1"0z H,N$.($͝ck!JI%U2 )(xR)Qj0׎F##fiÎA WB(ɀ*L`�b20MIper<yR/bGǝ()U=&d(.iRӵ >7!$N&Eb*S̠̀*e|虃-%Q28'NBkYge>d0^ aI)ucXleUy.9㜫ϙByMĢ/̾\2΋G•MW+eRv5>_)~E,zTczm?އV?xp�p5B4x?_aq0$OZ`_׽.�7|sLΈ5;x Ed7�ݏo7MP!]R?Bd ~ yňt?kk[lw*.fI>uRg_d=9,pǽ1&J?3ZCI<?|qV/ȄJY9GD<< 3 g1H_JSpQdr_ߍiaz s7gϜb5C}bG{AwFnz:zPVt9}d;R|#<9I^\.*]qAmbVsfXLh9p4z?Y:틟Ms!gϴ`d{7]Bc|Y-T_Цoui!cT<_)uQNA亘U6>gX5SD#6}ݖc vQ^^NBzd�Lb֒ k!ūh Td!eGH:!N"eS,"8d8HB@d(V iL!8ag<9g#rԎR.1JpI R]{q%]4+W <\@D* AIH"w,00D2RNdJ킕A9`mDe%p>P*9qX;ٓfs~!nZWvѮ䫖ʏ2~ G'FSq󆉪m3$B*ӥx+%2wWvLP}n3p#_)v^pNF{�<z]7ρ{Wq2YZzz%wi|1MGU~Q!}CCۿ>>ソzbz4x,UgZ؍($Ld%$DvU!.~s6Vْܽeq%wȌP"f(3zSZf6Yj�*猈;ikBdHqvܛ'"/xXyxmnn'?_jIhZz7NigxobY~vZ]4OQL<]3z'-{ +#/骄1wŦIuޚy2O!8|^׍s6ތJ yܙvH.L'#*I!.'^c2trSZ]B MU/L$zCS4;nJNJ6r[_wxBBAm!UY^PNZdrhQэ,cU xH'-SN2ET:t4eȄ `^lvPV:(V(29 ]9!2,䦔*!E *JTyIhӘUZkW),i2hg/K,R8-\B.I$m"#Vry)0ce BK+TE)4dǘN1>]2pύkuB,JkY@sub$<1P);ljrw//oYw#JKÎ3ԤpboZ_Ei+!kzѿS(>v^w=r&T2u%4oImߨ_ڙ p"@�+ J-5 � o!? ܸpxO>~x'X<J6dJ{|6xt7?AO~Oޛ0{o)o-B #zpjWIC=<'37qڰErmYRqjy sQXC߅y>cӀ/󳟙ݭzlYCv,rT2Xş/2(]vJ3]WWZ^4zgZN}]X,z ->nT6jKӶVu߇!]_RyklrNY6BRk>_lүyNQJa}tӕܳGg"inrɝY$7L|@ĦސX~la;Fwȴ?<ƋxXU]!KWB]U dYYbx̳婖]Cc\TqXb>i^O)1[ T}*L6F5BHJDB'R_Cr+!QY8RFZgR,!)0NKL9)ųu>C1BH#-EVB.BsQq#bĤ\:ErXDEsrx5L1.֒&T):rZKW@r N"m3ژU`+*(TF)86aL>NdbD#+/m S7쿺_Μ)/au؝<N;-,;'խ}/E:\ @S Hdv  Cnٯw 7ǥoW>4sO=wzx(~9? T:\}طr3zy.|IHw ,%)tN_;nݹ]{9iځW}:X=:q '=GOm|7O'֘|lr1vW._y4^07/Q_i1ir<Wb߹l%1r(].>D.&?߭d:t偳[dM*L{C|SOh uΈSt¢4{<mUrrܳLxQ}]I=KkIvVLwf)4ˊ+.WmMWL,)g!WrZ<{_N5`LS ٫EfK"a9aeGkKk%sLif/9~r)*eUNaK8޶겡MU�ȜAj! !sF\<nlW8.n %\>/ȈEbtK*x[Rq4'=ã7IjL/Y)jF$ $$9gg+"IжHYHB%4&Y:)(@IrUV%Gʼ:)$jMv 4Kfe+et% $(!B%\@IFκ4sE$<ŌAYكʇiX[߭Ro-_^{/x9C>WUſҍ[9qOT$1z6Z Lo_cu8.F�} Rc\� 9?V/%dW7݇*톄Iߦh�� �IDAT_�à X2Oܶ&'Սz]o"/fWSA0/aThga_^q  _O~bi P ݹ«SjhqNߦħ? sZb2.ⶩN"Cż.FIn%]zwɶ}sn\Hʑ+=WDh+YK+])tb~9OhL[Ec]_ZjKs.?E4hU 4$r[~\7j%;%KV??] 3E9,!3眉DeGIPdrJi9eNӷ* yPcV>*c,UJٴ̬[r/5B4#IRTJD*XHkeꉕ$rC:_ItRT\(5;+y(j,YL ɓe T*劅-Y|J˵ c*JIXvRfm*BE,:JK ٟ"G1ޅD. lf2,{EDRKeLޑlIN%Hs*)8e#i-91 |*C^NXcJ)o6XK'we@Iaӭʥ7j;uep9i-bxVA)h0w$`Fޢw l�ZUB. _5_ wEB"q~_atyߣGF:\{_TlocpProdžo* n^iZ`6h<ȇ_@pUn! 8_p%?qՒwxj97:p 8x{A7L?|6ԬiqW+QtOJ4I9<o_q_~RN)UlZn6|5>tT^r򮙝GEHl1UD_nx#܊TU֫vULnVᜳoyǡY*\T yCuٶifԒDMwǥ|& $*+=͉,)vyQU%@kf0.894 U궵-Qϙ1}'i3Ȩ82bz:febXh$ikLղY#{[Yj)HY6F!^<Qs+4DV\1rfB-ՂGVЍnWZ!:2;a-Z4ZYgt0y]!>lHWi] 9'Iu(&9!{Wp5#<ZAEUU{@:`cQ(ZQ+Ty y)TJaJyaD g{GL jq;#T3M'~]~u8bq  Di~ѹҴ>i8ǢfuWb.4Y3;Nhm>;j<G/ih-$r�Ẽ~�!ُ@@t#v+A:oeԒ{z)?ɱcb -ʻ@` zdH3|Oh'=6Z\v}e箄x81c?m^.uL~ikK-i+S)OݦjJ6v$jLOD 6T~\xeɲʯ)wjX]KDW\"8E;Z'Uٶyʗ"{5, Vjr7*|CJOdU':&K^T/ R@ S*qɷT{S܇|wcN)/Vd;/+{mޢd,RUNtvIvDYsTot9N\!=Sg?K SLr+.qg".*6֭qQȪdI[' T֤2VNRTlBz'-용T>ƙ$.I d2jl"STC5E󒦬&P-YB.e]3 @԰'_Fh)g1sPRLKGC3JH1:1г"*{Rwdq^ RTj`1PN+QLF+cJ@Ri|# WkJZ̻j_1: sv-nE_^ݹN fV AtEч*uE/|ˈ6veSM~<48O.i~'2웵kv�ς~e$q?D#\p lZߓ+ T %~TpbN鏡z ,2%zXj[Sw Rr{Eފp[[} q8~JO<E]&ٵ:}PaZG|m ޟ'nqgj(S=r^K?d!N#ZY90t9a-5񽍸0,՞(_u6*/+/&!F!Mnzub5WV yA:-~I"E ",+yݸR\jW%t{ N]fN26^+.dɠR&Y+jڬmla!i8mt"WJ-y[_M*%?sl\ YnS_pɡ.u`bX5eUζ&W:$Q&[S2N9m$ҥJq UZ17)")8Wq I.b< 8PYKP'5E kɦ`KWB*DY$@&IdISc(EDZ&KCTPR@rϵׅJ/朥6ٰ,!3|2`cQ,Bl}%kҩh%LĪS7X-diEi~鸌7+GNs޹m]9'lk_7{%z}l\b9E?WᎺ?Iap]3An| ؟�LVwMM6僵Z{o \^ J^iUavQC-3/0T@mpw|q?Ŷ^BI_` 䇬8c.Ӹ�\℈z$ 1}u'/_"|{ۧ&@E>ws&T)MGE|<I;?@_F$0I ܿGs=M5y+%:kn\'xD] i7v\M;nDլu&ą+ ! G1h$8TɊ ͅ#iEn^ZCߕƦ*z Ce:وmnE#V%iDL*h5UtM2nKR~ }dB%z%/{SJ:ۊ*4./N"Tٖ1P/UR򣯅X7ƌ $tc|xE֕VVk!# "{S8QMFj1(tМ0DœZDS(NQe-:qB+'[Nv.i1  XTI S3MDbQXd={=(;.*P <"9+5bq8*4 af֬%tBQ0s1>G]T/1gEEGGETN4ɵ'icz)OQːrىHBXDӰ ~lj{BsgˇVQ762bUߝVOlzs{ r9!?1_gL4=@�ZeP="/7o^hN>ξ%T>yO40 m~2f&h_?eQC[Ĉw:?A/S#sbAqh 5vi2ZnDaYSB١&䉭E眷9Hźeys1(o/h3V'm]o]FB'3ˬ+ͲŜMn29ujdp$*D0daROt=$ȨZa1X.uҊ Hl zTژ!{e] j Sɘ䈎2Gk[Uյ!VʒM]K뒰,J9( F`!_ #l*j+E)|^BN3GYdZ*JW Y8r<zC .}~1Dы2EKKUֳFXc+gHsSq󴄐r,Pdu)T7dQ2R.N<)+DX'q\->?4,4-E <a^WN! 0 !Tؒb#�('4ϥRϪ9 @#1 .*KWIE\w]Y-X`Lvy$V&tTJ:!Wsr5"*V(fYX) ɘ)9̜,+Bg Qr♌JVqv$Iq_SL`e?/3hm-B֣$pG( 'Yp!2aGU#Oo.@|u^!>۔G@~2, ՒK`^`k~9 0 HM@yq\"T@<�>! kpæoei+"~w~-L hxsB:Q.x$>\/" lWK*P_Oy`̘(/R&JsM7LF=5S%=:~>:2 Ͱ>V+<!]UpG=Z/ٻ49V־1Ѝ Z 0{6RFf;NeKI"/i?FrR!4DQtJfV4KQn ߲2ыv}1]A/FHr{uk;ժnWrp$;)U#2 RVPkiUv[hGmkiIC^gM^uזr]g?Sz>SZ멪I]Z))X%4ͬUQyi^< c d2IifeIb&.Sr,$J gAXFNxjݲ!z'kTFnڬDI&DF$ʢI9@&IAR%X Ak'DK>" *QNԐTZZ"2Ac¨Ri!K'4+#$ )V2v eР8NYq2qcTE0JEͪ˵ c'"(vQ槍c%Km=u&jpztS? jʄ<'G|9x*aaڜaP@�kM~9Jl;3?;9N4-!w\^W*mp[Be}  cOn)kA3X1]A®x-~{x`Ʃ<XFLe{kdg.(\+}E|�fҭ.;k)ە>w-fb$N$c~CoͦGx1>޵gݽwí9$^pSPYu=olZH)B1/һbً*F%/yle8P- TJ*m7٩̨n]edBFR[!/smUuU_-,,(B-#HA`uj{!';g_#d+$lYYŤm{[s]j.W"`yv1*XZ [)QKD T([-e!-1.2&B0: Y͵o}v ZJƚ! oyXt%l]H)q|&=Ϲ%kX"0Fʦ)QB:R%N`Skm*"a9c@8$J$٨⤮lc\<1eE-TZWmc\4!Ak%d.Zh90,Ԑ)(Y@ 6AU'KUi&ޞ0pV^N';I9CI?WPtV7ҕTuhF_d7M[AlIYC{7?NL2c9#Ŏ$X!W27�Nؼ=}Q`}''5+{+zwp ABY돊 [/:~}%~�<{+}حFn q۽CLீQl~ σY  haY#=D:ߋaҸub{5qS chz<t;.|x>EUIww _ߩۋ3G #65bYfBz? &40ӥ髵 Nf,%1~F~"( NIJ,@)J>J2V(ä9!( (Q wZP@X &V%T,AtawS'Y4ۍeP%$4MtFܗP+N(|ZJZJmU-ۚ ($:]qTWMiZ %P\P. i�fiiKwuͳ2h*ɦPj_)Ȓ4R򈼜JI U. 9qBjIF9He҉S*gH;S,g Oi 3 PP"2SFR)#9[9yiBJ*i [v9+*Jʄ>#,9 "eXDeVkKvI_ =%fwjs L+ԛt:?x6luDy9{QNdYkX#JWd`MÔZ~%m+uI5_cep|2PފnTw>o2˘ȡk:͑Ps uNx =fЩof�7{~M!OB 8t}5W5 xз8yJ(X<"ʝڵEh7ݰηp\dbk,2*/g*<q B&gYa~Q%2T?}!I:T?t*N$t5,Y\:i/tqXɠ!MPvHSXH䄢 T""ʺI*4r/|֢J@`!jOe'-,D�1€<)05JS*7%Þ[Z]Lpc$^2f鴨qLYɽj Q%M>Y!eNC(K6.1F.2ˣ'JJK037~2W]hUtvWJJ碥J$99 Aj*K*EI ,(f!Z/KnA/I3DQYAQ 5U,5I&SN4hİY$R&,$dEIZxYbfUG(ry.N> JgYM)==t́8Ctǎni-;RI߆U(TQ*;]20Qj&blב!=yJO7A_9ɟGVue `7{� pGNGH_C}=~~Zޮsg+;={lB_?{^� `3>[594@,kCufp/'8=yeB@a jqTc˽!_d7վ#I__ZT7<~Tq/+t tr 2=߇s)HYo$7Z&/:E9aTXr&6;AZ-Z"E JQ\T>2'bј ᜫ %�� �IDATEK҂ Ede-3{J6)e*OJ4}q,g}!s1,x{O7 Mmk.Z*D1O ZR'MņF]zI5j6ʑh/<7STpLҚ&V0>h9'mkVyiܺ5vUS*$%U +" I恂'MJ9pɉLFj|J9̓o 7E.K-j C-Ήi!,ݤyX|C+M;䓏"9U ,\l)ȆZr1zI20$Ĕpbkk?s<.i<5Wz{l.]<xp,&^m\_Y[=8T_/.s<iGm]HIw?T9v8U^:) dKf~y~_+w8pģs#,iF�ӷV7rp-p & ?Oغ?ě ?>Ꮢпh_-OIp-땀(arzc~`ЅcyE,p"chUX]T&A&m-_hy+0][~} i,uv'_WOyqw٭Φ<VwN(bMDIauǘK䃀nVII(" 3*SIdnYKPsPfѢ"\HWXB9VA \( YLHy1y'71S9Hz8i8) ŌQeϧf帜ONm{nmV=۠! +Ej'N,=%4 I(G&DNxC<cTM7HCx:U̐,!Ф!K9 ӌS.x*!9HI=,5>J\ "d,8R>9D1yńD_3-9LT>kii&l!28j]sLhEIYAlTV9ʂ*d΂6V9Ki7j$Jkj)RJϩ,NumDP\b6 Nz=K%)PM!^xq%Kuг1aO19>@>RUxssiyˮOM6~vq.1ᅞ;m㳛gi>e7&~[-!�0S<=[@X3p˂!Ţ3  J_ey=&?J8GN={^}FlDO{J,3x;|�Dq*Jh;a=VwȒ*NgcEX-|w{"\VۡʚF nt �@`��+_��_I5T�_2�?V=Ϯ~l:{SsnR NmXQvq�kP ݾZZ |UGj>!ïf Z /U84<xiVTi]}&:,d>B˥Ya"lj&�F#FL*򈥨ȆUR&Yā=%ҪC�(JQFOYQrk@�peYf~څrx {[HmͫcBvelbWZi=BDQɻ Xz &dAt24q)eS,QI|dJp-W-$]@Kϴ=( X&!# ۽Ha9Q5*a&TdKKSI'@xeT9rTFE2-"X(x%J|5A.Uu;7l4!uQؓg֋5Ze% =: YJ\CʢDV̚\kZ,fjn�h$*6PWD8qr4 RA" ">&5qgFs@9R!pwz_vcvt_ംWJé GWWq]İxA~Y/_4?\7WE�ub~^^7~R\ -wLh}ZS|sw#`o'x' *G_ʙ??}n\P]R=<� 9./_ၾ }qJ-$7}k  '�x7^oNϚ5U|xb8k7%,S-^7<)Q_}.ΐ �U?>:/ Ko:/I6{"MmpIMV݇/O[ۢ(*;(쫥1XBq g%JQAbDj;EB qAx* "%XԢ(@@TidXB9Rqc5a`GΓRfu \}KİPqljR<c_@?xW_"J s7ߝtB{^uˮP\ئS$HOӌ$k[%|:2O2'E.b֊M.mz `F <ҟb&`qTfR>kۙS*-P�JipUU ie@T]]2 ql g渨uRP0:CXrքxZX6F m2 9CNhk1I ҡ[VW5'Z7"{PYL)BҕLy�H~DК-iFC? SOE5]OTwSj*?~:;+jca_+3J`-Tp[`~4M*n �^'` z _ȿt'#<`1�=B;,}zw `=(wRqx*; ']{��6eʮ Eke V{{`oX;}Y: +y |Kq`އ?F.!B([&|u ճZɴ?.Wؿh=r]ohF0>k;j;Ar.t n]2bQVL_8kf`rik1u*Z9+u"q%$,B;ղJA+aUѪӈP9V9�2,bɥjT)XCՇ"N/0fA8V$`\ 1/뇁\ƌ.K櫥Osp0)HSoF.EuG6*Y`D> +aVRDdʙS)#ɠkq|Xa@^͹= }f/i 6Pxr,d!�M+pP@pJiPι k!䲎s2 5)U9^17M&j@(mӡ%@*h)L5$$6H.-)K: y.x1+,c4 Ƽ j՘ZRR-AC2EJD6iZCk{9'3n2}\u.uFrᒖ)TUiJxiajjk//,<J8SS'a<v_$}gmT �5l4<)\aކ�Zn 7oG[ ظcwRVk'?e/oޛl:,} y>?YCD�|/E� `z|r½>ǿ_<[ON>ҍ>@l v%}~Ksg55kO)9�<؁>'q[<ȩq}LrɈ:bgd2탟%l $&\p|8~nO 9.Ӽ3=jktWbS6MU8;:vk1L{Ġ&ӲLԇ).T1PJZIg.IYARDg(#ITLUR5 %"(rĂD#D#*.kQ3΋8,y]mԂ@YjJXow%\LaIsv0d@lriQ;ˤ! eV9.-p~9ceQzlVBoOTu-/23&5fnڄ6D\ktAtВT \@CaJ9!: D,E̶VUJI@Z5Tiƪ�#6کr&M&7IV,5j6(*:n$HreE={|Q%^bчxHKY2Lg-V- 0ELםoFbpr8%"."%udIa*%f>R}⼺@含Sʯ[Q}}X[rOs5gU�  '�7=&;A<~+fp?zV� 3�BZD܄LM|Cc'ϡwOx"��n>�g<KVr/SAG�XT̠rz ~�ϟdWPf:*ݔ|u >L鬙ÝGh@|�p".BԷGKOsC]=,Hph1Yt<CNE4.]6V['uo~Ɂ(ɒ@ӧԮH?K-ܨa M1J6Wy?]3}VߦGr6Zeא?2PTjl$s1UgTEC\TꄖY6FRC %@L[XW[E\,jdȜKXLI0LT_RhigmzDi�LUb(vsgˀ ^@녔4Qw^Q-ot`5%/am.X}n 67 PLuPiЍ3^&1|XXg9#s(. x$P 1)! FB'8i\" *BXMFKq!ZP:J<r&^lI<!C+m4t}u TH PJ.v S5IGwwQW% (Ht�U";iQиL+NOaMi.ܑ6+w5xyegX _a-4!A$|1_OVǘ�B?XQ}wd!��+ ww� m~ a6/Sjоs~�;)Mo߾ pP-/e~i1m'ɞ;ڬdfx׸[3do[m DjM"nx~J_azMz>S GXͬ9/hjԚ3|Zeiݤi;H=yhY_"6Q qV^kͮ-'~!ă9?ZL"NqQ5JNI6ՑJX)"DVU 6u;H[,Kyq{ZiTꖬ2M?GID4yL9/JJ.r=-!ZmJӱSgЮ gT;N] ]Of"Ih9ee<Mqs*$ dBØFM6v6N7{e+,bXU(y*r&6DU<=1zAYpq̧L+ُ<ݔyTKw TKƕV&BkWU Y*b-AHS%ZӜC@I);fZL!וh!PTL Jb `F1'gr{_(J-UIBIM@ L,lZ~2<`ڤ$(yhraCՑ6)ܕSZk�..IǯZY|H/;$F.ѷq?ڼ" 0o\v.=/оRky1)C_j" ;av%|c `UAyÿSNޕ+7/X~xIm|3~�<ĮY zh& -4Rti)zR-!lAslSa]?χ\_.^MyPCqfl95r_BJEN9f~%԰xJV]ԫՄք@'9jŝ7r^]̐@ZNJ7NëO 6-i jGG]C%*,`ĉ% n K I )+ҪH+VY%'AP''w ;y$7rDwSX lփܔdxzӊYs@iP*bnJ7;ZpaXN|K"[!]ٚ$H.s8pRh^2 *W8r;9Ju D){Wd}1|QR.5i?'0H2BpY<%/�Xa ͦv%{F6JJh)U]gMh.8R! V!�X#һtX΍T1 %V[YZ'A0�&bh& \})R h+FJ$ J*Rf �"3 ;0^5Y2OFynQC;?¢ BXqƍ:ͧ]v0|7.nA�Tp4KdKa E[E>@ՏF.;+OЃp@rp;80~Om#hcn9uܤ-){r城4ǔ � �s~.-@]dr3'p k,X(7_Z²lj59>XSxdZ{s!>>δ[#6ߘ۴[B[4_מ<g\gxWGo~%62?x^A= h/ 4r]M哐�믉t?ZE<"+VMJtS H/ņB5lЯ7r%$k#ȒJ]!WɍRBKP:;/;-i5 0s%OާP|gR~݀+ŹtOWWD!p$h}Q4Yd QI~ K$UjK1u@9uKI8 Y`.Ī3=KC'{!B4Xca>(M#1@ h+WVY U꩑g(bR )%,E"8_7ԛM)rS_Tx,d/d5 X3ܥ89XdNOJ@F8b.yUυThTQ 5Ta`k^TI\ǜ=ZŤ4  BdEڐVq6$9RIJ4O a#$q}mOho3kut .9C_gҔnjX.-=<J&=,>i[el`iu d}5pp�ؽ|gJ؏~7B+cbq)GÆUA{3{D0 4S{f̆ζW+3o;l�3 v5a=Y8z�?`բ0] GX ?Lm[() ה:Uok̲,Kh4F>GuL3ͦ$:�� �IDAT+mo]g%Oi_jNeX_!\P8lL VezƢ#5hRc] ѷJSɩS]qLT!F]t%B-tKS 4E!D3,]gY)pL\ttgW'_ܞBOv,yf.|"w2a17ݢR1ڶgPtJs0edAL:i7fLp8A{Pϋ NfdX˭-Vg"۷Er\anDl$Dxcv5:*SpLZB9^b6Q.Uը+՚{E* jk#JԹ Aa1L� ""J"+ ÈYhlIH)(DlTXB 1+1RdZ(ښ@T>S7 ?3uo;%6U͐yJ!}* Mʰسxvጠ3'`li棯A# !Ap6xRc9�{Zwũ.%^#4v=6h l+@V÷q;o`WfLoO:ѾkY5]̀_7E�` sPw勇GyWVobI7PP|,mTAcX ><0_1xb֬rQa\sZq/&nDM]8m_:Wtz^imZ}.m@}a2.n>~x ^AjO֕up,96ttUW9VN], k]K_#۽MM BDR5Y :DB5,RtST*ePEbAO%/%٨ZI2s(ױ Fڕ]I7bKFF]nD=^@{=ggXrѱ z&DQ m!>|2B;L_Z]۬ժ{M~Km` УQДw4):߶JHUG]NR̚MIajZ0$&2PVYR K$Jl)\,.yRshDt'.,*JzZEUP_I9 G'[32ȂD5Vbmj8g@UpDEƙׁVT�2@RSU*QAU"ejkP9˚n]k2C+7-y+"uAGh^:t`isb\ihGgo3A csgJ9$g0 Cl�{=ob @ܕ7F: G ϡ߶0)fo(�LyH�}7WA$Pߋ�zcmp q .zP3ԗ`X~=9fK~[lAq,T hTq,G@LJes)s"7Pm/ '=ԢKk(~mo弗gzT�*0W28w&'}c˹N.4]g*5^ ut?�h9bXmЌ&3U(Yq1d-G^y]yUխrMIbJsPΑjeIuEZX^7r-JSy.$ 2VY,ʥj?q7'C, @Ꞻ{C[ZU(/']_s(_0XҘK' {$( c]|Tk \󫤚!egӦ<V֬ CݯP#wwo&a/³MsC:NW/*S^x piCD dnD LИYgf<i>\8|fdsFNJ5O`#s$c8gH.4)LL@bZӰT4ʚ-eX9Qɢ(D#X |$�. (b)xދ-ǭdA—Z0mR=(VJ\AzH(hJZ<ڭd=n]ndV�4~W{P~&Xov գ ^x7[==3%%^khkYvbݾ+Jiݼ?0.7H~⾧w5?4~`n޾?߃Ox#3oH_@z ǫ϶άXAl{ck^xzv=º1eHՓ<XmU8%|9jX>kQ{x�5$z I6}$1Ȝ4[ tP-;srt:$�#Z][, 'Hw֮Qˠ}AFg[BPo)KN\JM6&Hn٫usq[k 1cl$Rg))^R^0TÎZm:@)iL_~F\D/REjTnrh4@9N_:%u%j .yRF5# nʰXz/0/sϢ٬y5iQ6LXi9Fmj{֬W+-5Wt qvCO%ޮQeIfQT(\`Z!JJ2Ԍu)\UmkӪUYM(q.̣'X*1޴xRH>-*nN]'/Z>�̉kv#eQC9BWGUUJL(TUF+u+eNHfVG#BF+"1!e(Y!L. 2VX4a]8NPSڬ w;PwɛG]Td@�z ]^wvM4{W&}ŃY4P_ g\ 5o5h'xlWQ J#;>ߎ)1_k_?L84,?n;0 = } =7vџ! 庳rX0x)LkU6R⫴:46 u%-䵼ǖ?|vu(`{7)1> hXw!?%w *OX=?e?)#e{f,=(8dnINYVix;Z7$[=v%1;MeXsuEʞeeqKJ 0IXTdOiu,V%& BljNXFWBbWFRmtnG|:1V]e :A3Y5 :-œo>:^t�*ᢑ͟h{+̂I9x92lU7X`2ꕂU}*AVMKCu?tWV55SPKLFrBd\r2-/b9<)^`[.wb!<B{u헦F{4`L3C!:;-*gDvj  QJwM/X>zq[4 1U鵲MktMGf}1 jb]ZML˾F!eԄ (-XIȕ0AL"6e(Mf $)ƪ &J b]�UBC^*@,y< )  djEj"Gpv6]wƪL0Z~*CZvWF"�PHɝϞ{)]2t=g| IlBK⿧X3 �p%OҏQ=Lн/x Qo(%~V_31=Jhvwaڼ+ }=/]Z?*(塞{u9OmJ*xg כfoɾ 2r8jk3waniMQ1Yc{b_tɚ4l&nD8B||>=~D~KxP墈7CmEv@\j+rl1c dWIY]:@N}U�* rɡŹ䘳W9U2K'τQ d NHFolEΗ4͕Z5Fn'x~ {Py%cőgN ̭qv93QݨڳNAS+ Q`V-~.YT(Dj’j<h*Ktx,8v<ve!t2BT!�qѹ#;lvݰfI!~ƚ ENqʲ�ԂD YJPPX&*KbJUskڴX*ՍHD]^ 8J&7-W�}omd5R2HqaxBZW}i/[.55R>~#csj?&]/ &w?MA.6j|b4ps>w+#�Hn̗ojnq �{p!-~0Mh*##{ɷ?u#,7ۙpe-�7.=4~qyUm`5 7-D MTZ& E^ ;T'0Fp[.+tb�yۣ^ ]}m|Ҭ0itp4{#S Su~g RlvMZyUnz] T1[WbTM XQݦZyK>%>NEI㲘z\9aME:7+̥  GݛHegbmED.QYM6-- !@ЛO4.̈p7!3IBҐu|vY7AĨ {"|7å +A{SF�,>b%R#[Zi__`U:s]%Q8_4huTךZxryj˺޲yRC6fC+rE,z :6Q%)1̐~K@2(pCk_WNUC7]j`=t �C1 CcG3\+m7][Hv })ڲ<j%VHKɴFcT. Aىhh*hKIVRB  "2�P0-\ƙX E5΀)QL~cHħ$$+:TT5>+C Zt}Wز}‡]G/w2bT}Հna ϠVP`f?{?@Dy䁇J?P>h9c� Nſrl+'7͇Şy5Z�% �|13aئ]` y᯿7 @w?nv6ժh~E*4(h)iH걢4]2vnƑۀ[ Lvc&䑓1a0]e"l$R]ᖑrlV? d̵Em]IO@(`*]&ǘ+�0,KXt R,hn4䷱G`X,$fsM4z3&Yͫ.] QYJv@4Rv.f+UK_iWS!NFe}ay=O$6<=3W;!niSq g4{by,nA [W EH(ʛ@Q sLYBt! �ᘤgd/c  > JUkJqzL$+VbT%fsL)O$9z$� eQ�Ti|u꾯Z~S1w)=CR뫂LvKq+LY'J:"4(.1bTL+@q_0! M}Eɸ/0LPs*�(S 3(>iB{ƬkRw/+wWp!@~�7w%7ӄ wc8uA<U? V @o.7|{8-Tħ{p/ ۥ @�m<T3VwFz[@8`Ïf}}1�a8wOb÷Ys !G! ?훃k9y{!CķwpMfymAطIxi�B<b}LuO2.v?BFٯk~5ЈLp$,SBϙ-;# Y +$ Y?=BDˏcs,߀ދ| CK VaSUӔ4U�jϪMklӄ'\TY5U}Hr`XU<i}-mJTb$+)#@1#K穁"8+ 227 (),xeHqT̠'& /wn )uL!{3u(7֑o0/B r*qY)}{ǘ yyvxԆy>&D1س9C <ba]lJ0xb;HmI)k &x3zx  vr Å�cH7N {"|9B*KFTXT /糣ؔ #6f@b8A#jpfWT5<�%鑙CZLh #vjyUN2Vmq+X"  Xq̤ĂOu(L-u%hc\H0RH-$ p Bms!$bĂ-f|>@E 8yQ(As (THpwFNE b4Z( #~COU'YݙgUv+U| {_Pr+uU琮!ݤok@x>?F }wE @d{tי,}�+D�9{4?Ix=@FA�ΰ/f3�/_sna��>b/<\_mIEgV2B{~=/@ fgPo΢DqZ[^|לOnсNI8/ER"y̗h|By95�5mWn |ER Q7 cayITDYFL=67;5T!8*ҰX:*%ŷ)ieT#JE8v4.9!\ύ_#c*6!.#_\*0LlIJjQׂfpUʝ*´IBGn h'>_upi05&*H;k>p4WB k4R 4B UU[)Ϸ1?^'ZBÊ+K)RfL_$JrDR>Q.4ZrHmό60d'"vUKs7b) a<ŴG9H)$eć&L 0\y||G�sZSL0HLL<cN4\rs!!cH.%E .\Bd(J UƩ`",/b1x<PgB30b4b(& ()UITmJ6VȖ]p6 >iR(^2!nJO>7f[5pCl^K`TW=AQ_]iw+MD;^߸px=xx< �z`Su7m_Y-W" ( :~;#%�<1SPxv�� �IDATԜO5}ox<) K�Z58�߁?gτ8|~@Ed'|Bpa^t/rC;d[J^a X MԝEjQfju^F<|>:':5M '3& ;\o{asR¶9`3_`Ȇn3\LbutxB sE Pb %TpD3$ :PFR3Ch><L�'3'b:; sE bXk.uqƎ߈xb#I٬ţ_ϡ]*uy/|gID%gYS\i:/%~J_8'GRf)l yyT5d4g/|'Y;jF/2i"]MEZ<tSdF2_ `D$A(*r j:D#EXB- h`KuJU‚ 'AaaO㠐]Lōh8 <=<*PtzX iJp(ָ$(gT u`YX}Ef#4%!�%dI87 8HdUgBrPbG 1pI9M æ<g^|utE$&Gu 2@@>�7Wx!7+Ɛw#3ly|?I?5w x '!#<O%hhn��AH~}mq\r3G�ksd`8r3&.Ϳ%+s8}kK o5?Av@2��p>,Zzppj=ܷ͚[?6� J@Jc@/cB6دOiE_H-+P[l𫼥O�,'Î(6A%tmL&/?\kͦⱒ_j߅kV`mO y+xc|3#kzoQA",]`.$]w%/\=_ϦS&4ꔜ@ubhcBQÕZs4^ OlC4ӕKzjb9sF*؇!On}|1O:-i&"DD>f2tΞ`&iH_qE؉FN+[0ЊPR&)*EǨUQl?бt/tUq^\#˜Q-C6(X'3 AXfEÆ?.*b8x 9�Yg�Re#CEi'DG1X8YP1`s\ט(qrx}y47:Ј XNL.)& 1g ԗBqїԔ~0zCq")vDP2k1їS P�R*d [tOv$lmYgCۅn'^g4oJJxoj1DbwIk9F,8<У4 ycq矟3*A}=~'7皿n�qŋ- k'u��<8*�k�;+s3p3|yre~J ,N#q�8�~na6`#2f}iT/ 2 ,U'S8vj%™ ULTQoN^f[6Hq0->-g |-rٔTUKko"?Mu#"0hm0=k@Qѻ&T$>G*DAK̶t! +@hT)h2(dM^qq) A 96 oLX Bu扏ňĀUN_I%L QS'zgZM*p&Θ CBB\8YĿ .fG%8-fs_Ė2)v+^GŠ\r-3lv$E&&jn5&3N#KMԑjV|VL5Sf Ú0i"s݊-,F4֘i}CQ1bT Pad`$ek\X��-Oifs4\0b\á8 ~Vm-ΔU2|,�Ha'/1b.ep8;LxyĦ(0LSRCsV f:nO~#BfCQ갶NJJ) %y<J)lFC9r%ejA8K88ߐ /g`o n5;>u8m.�T+# w09@Vf;Iog<܄$כ-bԃ00xIϏ-`7}/cL.+X䷺?��o-c]E}.eVd0ʠT7}|D/@`K.[FL@vt/` b? =WBܜ} AQLBʗ/1w{?ҋ739P̿7ӯY5Sh5舊@PY_q=̒AJdf:P$�PII(Wq,JF -bh-0Dc46β "nY(s Ɖѣٸ;^̨>ڧsoנp6Zm=sFhSĐK(8?7G0kjw}'P [EOkԔT S"E\N>s^J^)w~ qީ^mZPYn4oVqBEZb&(9P:-t1.Ry#إż 혈E Z` �Sɶ!%LP KFl/f='gpco\$WosnA3vL&kp n!UѨʪRh AT~#Quٮ1c92DۭӒ3G2E~z!1 >XhӚZ;VJeMaE2CTݲ6u7FQ̏~˺. Gzs-Iw`UD%=ĀPpqv¬7a{>?"@�vO`�Zʛ+#H{n|^ ɓsj�0 {#o_mu@|c¿з_Li}O\y/U3�oD;<7Ob&�O7W`97)�6)ㅏ\a_ qq%p+Hqu1kwL;SKj9a;gjG~>AG98oQ]ok@WA B2PuY̒rAt^3"sCe:\i,2 XFkZޮKBM=wRX4 AD]qAB(g35eKÒ%Dlm®\//f dZ"�r9b8$B}fnƕ v,׭h6Ow+\s|GRY#*:FRc[],ņG)y7!g1цjeE6TLؔ'rtfSؖ1epS2/цI]2PlrJhHM=%3"jb^1َ[hj{\Q% 9l!).M-gL0̦j:UkJ͂yXuNKt#.=/˽B`ءy %`$PcD0JŠr"!)9Ŋ/h'<jKb (Frj%m|SK . b0))2e.U7OG/1]$Y^h|1qJ㶷*|tnN+{Y`~؄xA}K=~q[Z`oV2}*8��޾y� ٛ߄|?o��~ˠ'T? *Z(_R1*^0�w 0!2\mAC2>ǜӰjF Ӏjifǣ=uwBFЉu"TmJ!C´t 3w5xIQl/@~ȥAu3<e{-浘 ⺓E K<}Q H, ed2.xxB!!UH ѰѦ_G4 閌0oYf QX} .:f*Z8[ +8Ã3_tȲ07Ҽj_?rnP]{EV5|Wϛr˽{XC]-JS 刪P牔}c"6m Sm{<҆rFˢ%9τsnHa.SawyFVvQkW|D}&`-ԖZTXu0Yϥk{J+qd|,AG1Rv d:RXL(w>o&'Zs· 9p~Cu %xr$P&Z^9+ڄ*C@RQ}`keY evQ [ꕒEi%1&Z5Dc DSUI!\]w_4ts׋CytIdB2 PX1@L 2h/!mrOӨs wB Ȗ)|Cc�_0_u$oF;K\z,-@(_߽?rQ޿KͷqPd c=)"<h"\h:o²Ԝ*|>rb^lnc27ǜxA &vuz^}Wt^S.IwH.޷!0]up< :o~}״9Uc,;nƼ"jšlY|O!RL m.<֋Rv(;b5@7dQT.xwUY=p%͋XRP50T3aBTWQ�e݂:dQ8~8Gԡ=Vc$c>%hgz#,p.Z&~&PA]j:0b@~r_#5Hu%Bg˼$Io4L=I+"喢 BPkXr4ŏ=xE h8Ĉ-u!r:n) l d<LD<ٜ_h~ʪ]!X7pfP$k:DdW \INRƴ/Ax±`SnSDnKpZge|f'o=N3ɒZWTmԇ5KMHX2v9(H٤&JY#$ Ǘ>t*J+1&iy]ᇫV4?J.D!,팺cdطT <wW=2nJf8@[?zۡ8J `X0ݾC @@a|49�i?x`,MxjT8D'8OXvUO]ݷtr^ˏy _87ux*4yvBU-N>܊3܃; 2m!gWeV "=-;gGmze~gTqrt%+0@+D?'C|!Iw:jV$ѭ38!841cL2m Bd@1eaHFB=DX֥;0pQD('ZKt\%΄)vn십_ ne^.?"%t G QI؀_ΤVV_ȹ[O}Z\>A=#2\V&LhI6 �<cdG(]>Dd\G\*NIyp2=äѴ)(3i]�0?h(D#DԦ_Xsn44em+1fb#PHqҥ^)-p]qg BHdID<xQ! c80 OU#|1B3_쓟=൓mhs N�DZݺ8S֜L’i~UpaFt ٶlu?)Wl=t0L81aكOؤP3.SC^4= X3;Oi ~9�+0Cc}! �`p �p/"yO!|WT쿭�-| wz %LJgJ?>W}O\ j$0 |�`X�߾XmtGI &P̀~7v)Οů߭u>q1j H?oUX�H/2NWII=ݧmxp3m3 X%ԻbN٥:smxbMaHq ROy|RjnGŗ#+YP9& 2fGJ\\ +Dhq7cfa3Q0աTBJ(0ꫵcU)s]NyĂ�Qe2),$S �ܭsY p#r U`)(+[#%v_!cM:-&8Q,fb/O<G̖h1YEڝ=!we}bUV"VgA2 tB'iW$KH % !rrq$*"ϡ,<qSКK vXB5WV(9U>*H<fp'(,g\SǮK Yc kAy<!f"!a `LLhT Z e༤e?'Dlk88O*?3])DFIJA<qra!aE]ʰCEɅ!%2s\?dmq," l m]Eu[0+2$"hE(.9 2NsCW!$ b<Y򲝭Փ/n(w9�U$"@{Ag ݻw� _^_gl~NAT�7;K+*˟ﮓv<Tv`{} ` U6cލ@JH$Un�͇#ߡ[-i%b3EȶySWʤ̘aSӪ.6!1@zZsC{ӨrMտ4R@^+-oqAb?;w`y(<᪍<8aX41g,mkwai9ZW).018L$FK܈=oP(iq% 5O$>l�9Dc41T<[Xac8I9z_̇WfUəВ9cUUuBp{i PUqq9ȴq xmp8;FoC}j֏Vg0Px N(V_6u@Ȑs=+Ena&RD̓hVG3*D)) x'#^KhOs6 .#HKR�9�%O9T-nu7 �Ѽ ?xRFT Ne']a &ÖɃ.LTKd>b %d2)GN`.kezHYpz!݌:MOŃ穜Hę⅗5GcCU^^'3p:޾Cuy�� �IDATHja3aK1BxiF4/K&#z׽muc/w[9Do4kzhGO; E3 Uu[6 _l{_ 5��&xuz�7PA=Wa \N�1_3?`~wMoZ/� %�$eA[2<Y^K4K%|T_]~Tr5,b/9US`"e2XHH YH=UĐ ,CWݺL8m ] \ P4ݙ;Mx`+oif" Ԏ \&a9=5&${1eUЌ $BF`?u(U't9iPg8vuTLJx,:{ۗes.V(gi$PfaĩIMNS3|^_TQ dwX6Xw^/O 6.͹<ѵ]_S,g>)=۳{B"Keے!ױA ρŇ1<i7*%)[H$UYBUO$YH<mcU6 ň+(Ƃ@Sr#Zb񂛖V$Zx\tK4CK$)Tb^s 2B[HB20E)/Ρyq !+{^M:ۻܵťIJ--vc ̇[001�HDvuw5U$5@.73oD9:STRT1prbqqPա6|I*8n)8L:Ve #h9-ʲm;Uq^WЍ2Bi]Cw٬BuWk,aC 啯7]Gm&=#,օ1Ye4㊥c69=9韎OwX,NOQ0o';L�ZDtZ3ltX3 �N>1h K[7we <-_2z @7z !x'~#m#Oh!zݗZ;X>� oLVOff� l+}ZyeLtnG0{ ҈yNi>:ifhz 2ƢRX2##ji8QZ'|IzP"ćdOٳijI5R F:kgԤp//3[KH?edj~l sʜQҠ_'rrkU\`H Bg*fRgE=-&u0QLڟYȺ^!1U W n)|h??PFlQVutS?ʹ cOG3_ӧ\~j}4*MNPph%=q0 r,bqqsj=Llt)P'</M1J28l -̴7o둦&D{bHp\,-bepm `NH%c٧ r3, h LUwsHB],INDKTN.$"$DUģ 4aYv.?!LE}N<;$8<dfF]Ù~hZ5#( %e 9Q>%aN"7e.₦6rS))v}9ĸՖojaYBq'F5KcN~lҫlRzάLjD_YT#bWu2gWG]yD xrsvW 4 }k>rb-W6~3LA4%[dsB٢n ྦྷY3^0e�rO>{c9yiSav8HUBsfl#cb!8lE{1HR4əDžjQ:1:M̡TFهr�e&/4 /dua7=YxIeu}> N W/ϧuY\f'lde??}Wȼ)=YI cOfIO)Da4+ʲpsއtK )jM\[kWX K`ו^v!4%q⬷'RT4+I "0/c׃< bٳ9Uڰ)]w9 eS?gޔg?Ɋiq.F.g9|3Iǹ^ji5[)X$z]r⹳^WR)]+BѥK6lVm/ftM )$8i`"%Eҏ+f%AbrqX}9eV<K$ِ%Q¹HP0'硿}z&T+\xaGYv9V,>o7[֝h 4x#; -̨#H |*f 'ӵJ&QOm:\1YKSVtNj{ZMS/!Źj}NPj610DP dC˂z&4Yk@ixKD&IR$r" hN?Bo3D߉Ǫ'lx(#kU=Pi_UOzAY=$ K-= bၵDeUTߏM?(w韻+{#-|HFVf>ϳђΏ` );`8Xl|~@`8KֲEaÁDyR8K49V#ߞME]jdfY| RqGou ),BZ-QOgrK%ȼo,&?_}*C*/)Gȇ1;_䒦n#h>e,^0F;LH(%!!i-ɥ̲R3dAZ5WZ)BOK$j鶓ɭ0jNpafqJB^:ens>Lsr5Xb`aV[KHzStSW1v`cZO"ud")9JV |Q ؋{\Jbe\<#;" gJ^d xG}I%MEF<) 6GlG7’ESӸdD <(Y><q:.ӱ#;[()漮eCfCy4vuFDLeelcify1k aKOs3gRΨM֘VDIсO%mnWN1x=a4[g$Xm'jy׎dư)gI4a+2'A9J)-}W6]Wn#}T1&Cr(Sיw|)[cٮ)8BWG= 7'%ρ#i4 1<ˀѯ023Ü,�s'1TxoO~<}7C~G#j)?W{+NϿKۂfm9;<$^)aĭ6Idq:̿<ܭW]^uWuWDOIW'jUI2l2ʋ}Pb( yby=QNMsb*Bd?|:Z[52FUgeKNU9vC^f<ݪj=eʬEPrO0{N>EKO! R`ZP\ΩD\Bc+₯sTUULz@CDEC ؜ҚJU:U*5b1MLSĺpIvd#Ϟ ]AĺDʾ@cj5 nMtp85ϲV211|&APꑇ:$$Xiњ(!^Y(oH`ʺ x'Z4xJI ɼu%Y|T8.J|XiLY1d!U1HJaJ̆i]Eؔ3Im[wm'mȇWYD{pD7ԟ7RZv6EQŞ4+FQjJ:ЦYj։jNunb5~G0󰯫Œ݋4<ε驅l@VMҒ85z05rawK fqBGKJQ,CWդ<;%)RF譺 +>9/?DX~Bᒟer]w݅ P *ÿpiGB1{*΢vfhyon'o5=/n3awrV+*бX=��iF-h 0|uyj~l)2tu6e/>ͧ~y:xVltd?Q_S3jJjۙu`XSW-G MMep;Z*SLcgJ-N(߯c422{Ԍ N}Ld%IN}@fAՉPγ\4!1"=~n<Di2%NџRx$yJ`W=ocZ,EI%IigX`2,I@ %U': ,zٓ{ʬh3] 7PVԛ[5eX1Egv7/R}|gĺlRa!Oi^ Ժ1eri9K+.HMuVa؝nfEi&[tZs @925IAtAH$\A\-™x:cu O4')Mm֩q_<]ܝX{NjVejJxp.o+<+].t|H2$#hɔzg#DS&ّg@4 %˾?5R [e%Öo'ɳK Bd'Nji&JDq挺spy(Ju qOٞQjȘȂ)[/~O0KǫE5 ;MVK%/qQ3h8E1}~`N`�$@ Ry e(`>w1m- 78o; cL<]Nwܓᅁ[w;; (+Xޔ($'#2k_LXhuc\;gX57 :~H'p"ĎN,~)0\axrwI@Dǧs,Yvh?]ώ$+c[棶leC,ϙ܃ f#C͟F7E+i|IYcMQHޛ)EсKnb1K5̌%/9S%Ud cιv?LHiS~Pr<+q&R8*,#r9YO*bT|/?NCRL6y|*s~ :s!5uK@Tp J.Zٟ._ $KNWRҶUدW^Y%}CTf2OݤM-V}\ѹ\we^/5Oo, `];YD.0!hsS,h m&9~H>)ʢ.D$ܐaA뻣%QPɓ,&͖Cɧ2sR6}&9[]\%<pƲcb+$j)8R1"iliP0ݱZKnUZQ hDi"C9y?Sx̪B]Kzޢa;CӚ)) y"?[ў 珔-r$Ut=y?}0;Go?8la1=Jg/<C怑\5XX#1_!(…}ަC6yq϶}09p;v_|$댇 Ꝛ;@_W+ ;Pq�OCN OM[MH# 3{#GӸM,_ܰ뢣3]4frӟՑ")ӝƁLIGC鮓Ju礹egY:׆].b\lRY_ B\47!V13 XyUNDyT9/93 b(Z@Lc.R 9/!e&M/<*T$f~[.COmrnv%qsx_.jޭ?>]\~,+aZ>ao\sp%E]1ةiKًYi""Ru-\K1I36\ fRͭJBDq/ {v%NIzdD_"sɉ^ 6db3f.RR"2+TP]E1٤^ĥ$VLs�!Jp_^҉,ZjeKieYB_2.TeBc+ʱ]9 Haޗd`sؔ% æD*"6I&fRc6[k m,){crF}!.M9,lU`YҢ)P0㸰R꒩Rx?WY2V:|uT<-&lو:Δ/rw~j~NG~m(ox_FǯPuc ~WH$Brurz[[}͛Q_P~ϝiu ף884@Vq7 DT;8� `y⠐P|rJ?s^xwc>@R' u5C<ʂ;Kk!94YAI(0k"ŬۋG]E#GUuS_GEA\ daO(s%Tw-TXz(]VLC, WdqK>B͹EOHYJFBΟNQ۝ <TcBC'ގSf(#6byz#-Or@j+q;}0/U,i͋|Ѹ|Y,nqZ3f#_ub\wE}q^ZѮ44+ݳ/ACMIT5ꢬׄ9~PEiC$6u#v|E+əy8f%]lꐸMgA#&*1`Džr ^Q9N):J^V)Y%qb,"6l6R<R|!!Rf^j˨$8\TXDWc۩fjeԲ!3AFRJ #g(ћ�2HvJj%T=<gT}#hbs]NgEIML%&zjy]]*KO07LVdzۣX7b5o4fێ\Ӫ A2N)}ҡtX@V'?.FM' x\烆 |G_� p[]uwiI:+o ~��O"vG'5{?}oA p �L@L̫ч<E�X%>6 li'_)JrZ'-zf8Y?+6;_߇zl괪 VC b)^b}%h^ZBKgv\QP$ȮLvITVP 1Gy9I3iSbɓ`ia`SO6*iY GLEq|M&EQ SHIb4 n1>oJ ͆IYzV/4'-/]$گFkȤ7lb*?憇G{@Dd]d?VnG5Q:xdE9"Tu-:gǑ!8t$#Pr "p]9E) R*.YY!Й廒t5).n5�� �IDAT!VbȌJIH^ ΫxV稪ndV/eK 7R&vmVY@c#[-R)6n2-Ė]0X/38f6U%\E|E$bDlS-xqa%TJbo/=9\VבoQY<g5C)9ZWjK pO_N-[ 9raK/EZ$,Hʱ~$;3z^XrpNZ8MtY7PZxOsA 43"Ãz[y�s01<¿.FRn3|kn`k:?yJ H@?d~GV:}5A^X.(P {dWp8t}PaZgrbwgՂd;ќiXl *,�29qNcPxBSdӧT>`Qm/ל}xݜÆD}aۇ$OW>(5ٖ4t N[K 0ԁ@S(qP"Sx)tQ?\#tG% 4ͬD 8*zЙ쾢*S.�<U=K#9MwcY0)w]hJ ϙ_ɶ4uyFB]^` ;GLt`5y/zpo$ZD k˫S6.̽ qH:{$lֿhd/rf;󁪛_b\N~s=xMl$'u*JB3hBDԊ(֬pYҍ`#t/`tfNp"ZY%DJD]̍j&"KMӹlTS3e<ԢQ!ofc6BB.ZGUwѤRNkʥU,! "e-v7ռlx%l_zmT%*ҎE7Ԑiȥ95!$YA\�ѫ}W7ǞOGqsR+Go-L? !sGjY&9%efxJ%@))amJ3vapMY`U1s6Y}~S90rhe?8ҷ|t~0Qɼ1�8Xoq UI<DL{:4|l@~K `ӿyJH?6.c]{o6fp#,0 )V [OXmDP3M8K^?R<âo WTܭ,ћ闆?ùiט/jjSζ)=/Ұ YSOtaGGZL#Eҧ*/P"XX=#;u,"}rt*&QLWD RS/RF+ v>3 q88=X@Ž<ԧk$7qlo8LV25T׺l2J$Nds3'f<1{ ogO;*nyx|4Xu?aH(Ѳߎ泃ސ%4Fu$a(ts> O\:NiNMi7KDE$c>t_G֎<u%}O%#\RNeI`^ӊ/cq#P r$\V&dhEM:͊ I s"HM?nk^-ʏY n Ohx&CX\ZQS9on`**{鳍ebe^* ^:lRAqҀh΢c~٨W<XnKSqV@|jLj*db2cLdLt 1y >0$RbH¶XyA\&Cc Dd>1QB>$\u+a\1}"m<MB'%=<_~M=آPwHix  3zxn'@"&F�Џ֟Zg^?PY'HMxӴ*`z(r+ '_{vQ0CكexxtXnEer\k)tN<N2jȧvTPrH~76NPK;]?=5+ zggo)('E^u8-EZqRLI[J[%1>f9kTjɼ6Z&CGKTVDBI!8( ]1#YiW &D !IkQ43hc$qUX$5s[~F;j/ٮT=mm?n)"t8N1Ng~%?sw9#gřxd]Oߊ<Jrb4mZlޒ٢ɫ1aMHZ| .Ig~$'ӫCjJm 3/jRsɒ8H)jFj+.3ʩt-DIuq)ΰKSժ*.})ۙ(A&={EPj �=m ds.g)4mI)ˬID0F^ 1sZ:Ɉ%m$fOnm*Iv,)) 1du{QR%chBY!XlYZ0z!u*]Iؔ~-.忟Yu#t*ѼjT*p![[T2 !Sp1dSӜxOST{5Ԛ76E6ea;,gT2^zYU""RJ<nb(Lf�WSP �{Rpx � @k O3ɿ�O!}'j!8T DŽ GؾqDw|;5`fl|=�k2rn'+ Q43/Ҡ^?M)<|ic�V-k ћcGj/a S#2coUq'KF2/H,DdjKӇ*wmbEK(E7v(9:Q t$Z,*AZ*4xr6DaI0j^H$#]eô AZI%FPCi7bYX&S}Z>"&Ka+|ԒAc?ܲzZx''R/B'^oʌ_$^kis|4wծgR fYrGg?lTT%Q!znZs-bʸGe a[7cSk2@)Q猳\D4bN%j/xvsÃ( zsWlʓ9 ?IgCXxV\1GKS6QF{I+SwP/'dO<,2ts9t™g&)ɮQIڕJJUVc*RՕsl>ȘHLYXN+vD庆 O؅^8^cgGT7 K;< BK;-]'KPV Ɯ^|^kCg|`s]Gxu 1/*UևBL+<qu`4 оu# _{ ߿ {gGQfI9^@c079xGhg.?1x �i~fw]'RPx1r[@q+T@Q1u&Ǔyüym T |u+a}qdӾn6YZs~ mY_z?L 2_ͭ/D/*SSaZ܇f5'}=bɦcPSnH"MA:$qF[19f]*ֆIXvń\x$Q-2NbŸPiΕHD0 +tP&u[Cy/\->wL4ؾLuGt%_'DGhɮ+5!B]Ch/ⓍL]/ǭv{r!M+߫e2i׉."\"i;}:%y2]mZh8cYHgH,=oPzr-g%JnϤIMNsf"GTszLuTPmU3jcꏙyZLrѼ$(ub*`E]Dj1%>Jօ<0D c#C Ô_Kɱ9KLS!ғʕJd;%bҬH*ZKFJ A&!ZRf*z2H*e3Y^ǜO(xsS\Z,3&v%s>JW^6s$[f$}EC*wBN~SdoEI4-kjQmjN,H3R!C-B{Sg9 Iiufϯ0?l 7ҍ^#�H Q䯀0Xf/׹m� jZ$F迆/R&Mv\gw7@:v_ݻ6]UgwJR@0�" >^� A(R?̾sws}b{ņO�{{8(y1`G�od=bʼnP`ݭ|� w�oOf�aip= 1|MT<95'V}yFF aeuPs;KTB<E]ݟ (AO(&�8'?E-ǪEP"cByV|'m1)- Dm*SBQ$@ ӹk2hAA .n X͡5YBXjɱpd|iˣaw!x:>/ؖr=VL feYۖ%/CEϙDy?e"\Rޮ\fVu1VģSCԎ=c,ҀI\:|y)'[+Qx:aSq@j5QRT+Ih|AqxLcaOdt~IhR~vB(P>yYH3VlٹUء2;KFI>Xʔcb'#:=U,T:Ke`RĒeD,L.&";Ķ#p3~đ2b%߈yi0`MxN"%H0/�=agP̣`_G|g<)$d!]Ag7'a;Y)3FppmW|VaA˚4ʐ:̖ N @ (eɕU%]Y39:zq ؖfM V.8 �@Pp18쁃#�$_t��H<P"@>o pOo?mɇƃY=%Ksp?.y }J`�Þ �_Y?~�{y tA;GG� =<-{^V%V8~<#ݾ\)Uߩ\GpT6xi~%n 3?fJAl4vcjcns:KP8(@m @INU$AFYDJYV-pk2.(eD&RR�Rat1s 5K$CАa $aX �)% *�BQxˉٝea3(^[=>:<=N %P'O8 *"t;ݧq7 rՂ؟Ug$ˇb�Y˚HeE:D$4l= DaGZxdns_sM[#:^"ڕj 8oH3#3 9#6U23%ϻnT(E'L]-j^mVmB/2~ISX=1@/U䳡9Tqr~KKNMj�5Wq@Ba%4M6/J$ÌѪ0\ �[fQ60 I#&Sa"6>cq^M L@r~dggIH) &x,b!ՂEӪf5A.|Z D' LP#T/C* H-({8^tNjnIɗtpP("<g|P_��F[�x� - o |p Fs~8@@ZΙ~p ~z@�"z?tx c�kIX73||#5(oo{xংd{(1L\kA9_(H>t/"~}RVLw׽RjTήIrh5dVFwOy)Uu%ôh Ň%^J#*1g )hCd*rq>DGC8 c Ҧ "d#!j09R 8ZǙ[9F\ȏ2-(k_WuXmU:}ƈ(1SyD54Ok=qcI\_O7#~-ѫW-J(|=M�皉V8˓I!ϐsG|_fsd "1C TO #S(M`[!u]ڀnR~dw Y3d'/=+JAXG4iB"6y!!F?HMPY4<`pNg NYd\Fkv.'7t3S K"rh_(+(Hɧ<!6؏f\<2SL9`-a:RP$Ap" !;&*D$b3mJ ds; |Xs™ܝN+=J 9]tƗsh&";_2"̷ʴ{=Ip̢TեLpx`nru5]\*SML^yd̓̆q bzꏚ@-`;C{l AoC�<@ s7*&p؁ xxm|D׿D�'L`z~�;xH7xڻQp�ݎaz7>s7 ��`-X�<}׶ ?v\A�=WY&~JϠYXL:^|2yr:Wu ODTm1:H'U`,}".64hk6kFlWmT$ЂYآ 9J|Y$JZ@E />{M  cϳEĹ($CAL$OL@i{=@J EN%eXB&�S@%A^>ݦ)꺳,*|2' V`1N�c%=O$/ypK kTD9pn̓y~R"lKnȧzV yT+RܖĽ) #q|xh@V$d PD҈L#ĽR(Z]L>qqŋGRG}Pqkgad?<Ib<E3|q"^'ƅHr]I}3Y6ȵe�Kr斣Gd-kt'mlϓ$e<*nc(NjJQL4\ )"B͆X"\"!EKVR`R09M6iCpЇtg;׉Ոu\(JE ϱA!<&ǀJ VӳJ crѦs^җHՉN"$bHq)ynOna-gh2w00%o�x0 (�q{�!{�| ѓW Q5|:\3�~I?G1YZ7 <6n9LA[ 8o~ri�op��8{[fCxV ߟKy~n�� �IDAT��秋vxV3B]=yԁoٻ@~ ['4gzVFIS%6z">3cN~#~'TB c>pY%'�A GsZW!s/[w+ۆKnjI("&hH!BI! <$`%=+u05ҜFB1:7>L3))Nxiy5(2]f /1f#|S+q3BQhuI*5(n 2u,?Շݦ˶D&sڶ|ѧ-?q<ȵ8H%9wA,:x*L|YMXR<Oi|㎜U±u. &LeAs".)T0L dzSyQ(ʊQ Z0Xzٰ9<+|fuU64/ǘ3ў\Pȹ2Ɣ`D3-WG=$-Ti!%f^QJDZKYE.csUXi$Q u,{ft62Y%cq_W3F$H\pS& n%er43NGǵf^H Ϭ G*h9&!1茸gYMS69T1tVaRNVŤ8dž hzYA迣+s7Z(>nΪ]T_?|tH2=~]n;/ ײk }Y<�! /w�N@ _W|}]`# 0`9y+|о5K|U+`;_O0X| �pY ϬkZ|x) _Ec(J!<)H,+T\-Op""&qsl#^yfMU@-#cCҼǯPDmՇږ6L̍ Pd ^}$�: P )x,H{3/F"""Sa O; ;TL=1_Sx:nDܠWij(, N?#֡kod#;p֌yfLzKˎK៯IrfZZ�<)iX_)%r8*~^Dhu<B}\guR1�F{,Cp5-k5e+tǬb[sgfρL!Pɚd5iA Q00He'd6{O *mřc)Wϫj?ڻHcD3̺> {$p`4]0a̦aN%GJr+Sk^l#PH/9ܺpW#(+ $ LGf|B3̪{^U8nG&Isk.m5nK}AЃ%h@8$KnA@ " f HGi' b<"0=5CbC1e[S)Hd.SG?\K.5lhbL,4?'�0r*n$KC fhXZIiZ֬Ct{z}slP4>_@�ҿ~һ?�@GM4!OLne'OIpyú]SGewKb9:$4c�KWRZPnYj-WV%VH%f ~Ƙn7 cQo2Ai36H }OBYt Dk:1`B[0*Γ"jxֆ]EG_|ٻŹXl%9qb)Lg3Fd/VoB0vJ͢ 1vh؜Cqn{0鄅QX? }!DEoq+SAC3Y`qVm}tƓFp<Ju4@%!M.ME닪Za(r8GT"sDbIzlN48^IDɛ ,Kt<�Kv%)!<\0rɥr$F9qTLW)ssB6Wcy]s\3B\'{֞mCȧorbSőũZX2$i,K),Taԇ{}W:F !Ɛ`'!Z5 %PŁZb]y~pBh33B҅U%}q-s#:rK%V)(5 Zlx7!瑚J nۏbqsKq{vW E'6XT $*xH@AԸT#t ;QURM p @+yH�W=OؿKlQH&H?zKM G 5BoMWq+ .LC.G["6#/cjoV@YĹji<Z)բ˺ijYO S5DdTRgVJM)!9":t-ON@7ˀĀXY4aZ=ϰCp/8+&QS^b(@PcI^mx1KXB3 r9ĘSN= GV/fUpGCKݵYyL3I] \x vY1 ̊HYJLӴuLG!>j_+, 3 2 xN|k~ E-W8a,hJc/0.8_aXvk7vlȩ"*RF#Ӓ>Q|Jy8XeY": )"zA"RR+Y*^Z?_3 r@ap%yj^]]q@IXZ\߬vO*z<LqFchpNk y', 7cBD I^/st$P.D|>N&"V$WE![$^&Ҵ GT`​MqLr~q~@T]oHɖFZT'aWz'6EH <R|xΰk''+%UgӒ% ܤv7CL{IHțu5@_[!4@;}�`ᜏK~^ .��woM}hK-,yZ>𿂷ZD kH7�#!ЎS@_5lGNZ'@ )XV!EzCPaXbiEuskV-gf ay@(" PRLsq| !E0H!S`qa7( t_A;=}Q}IW @( O Po|œfUyE4 4A %c# Ġ]Ő Am<ݱ#^"'I ZɧH7A(ɝj剨jD=&j+Y[2[s^ݾ )1E%)&dQt $VG,X"=~|rDZKwzJ9/9ULzycg iڋ'UZZEOZFtfRzXJ*xv琟sg4Pxp91׾EB/` (lWq^Coao2Ρ'O_.3ػoܽ2cbi1LЊ =tT<E%p2'"0DQr .{'N9fO"S"Ej+$JP5dS=7Y?yw!5Z+U2s8dy'*1%b] 6Ʊ#Dq]pvH!J~IGuS h!δ;." Xt<Ő쮠 7񄚒?-iUmei-dG i��GxrvUwUoK:BC`⍍pxS8�oSݢ:+@�3~N+kl�o̷�?T �_; <!N=|7ץ\@G�E|s_6d6-;T hk{X@.cW*,>%5('ӑ*@vǛ_7"ex3.bƉYS!d(!nj)ʱbbW3MH\(\"hgd$la^*vP&1.b2u>K J8$QlI2`X#xpf*! 1i j W4 {ZV46ë0vzME9M*JWt'i)/,/(+P<@oBIVغm:ؗix!a0粇#_?7`BM^-DZ �a}Z2.~JB7yj9%/f(PC᳈,' I.3RqAL�C)>O2-xK( c@5i% `g8kB8)~9^/$).tZ%! mt8LWP(ȹ `@r\fsF$l r CHF͆ڵtɌ{\V=+jA#łRUOJ{eje9& 4\Vs% 9<ft>sv<F H];v2XiHʯfU QR+E.e8MQڑkɫp/PfZyPOCEڭ)wC{OK n!Ubw1vyo=wC ~_+QܿklS&GƵ~* \ߣxxT. d1�PN3`XpY6켫C&; 6$%=ZI'lNKFcR g[)#l2HeMx|I*` Π0 E)\#zJmf;`DӪB"hP,51M`u|4 cuGsH1̑~ ]q<LL `RSg˜K&-:cerT^`>/+wwGz? jxFi2OmMXX tkq~c{%xADrˀ6$;@5$ƴ,d묎s_kY=9fR7goTbY5.уtOꈀsT</fmAH)"%<SWaX풘N(u4O,E(S"[7@B 35w2/s166<]Ъos|M.W-O^]GPo{js9/ ?#rr\f<c QU. (p "g2#- gFGȞ /}[2_%\dE[@uxx fɢq1eb5 bf#ЊeZ@\s 2g=_824k։$C\wyV4:*W1t].+s[eT_v�nחݑwTȐbYHJ)|�j�׎$z>V>M"/F<5O ~ɈWX<|�-%,hF~vp̓veumf8[?Wݖ"ð9/rD.�(b|ul*sAU )& ":%҈dQ4GT5K`+,F3q(Y'W@9zXJ%RJ[* 30Φ>ekc!7MW YC8=tȵ3[hAfCJdI" P%WLh&) [\n7E)UH%YE_T=Hddt{^+ -C@Wg?p"6Ifu i>_j/<MPT+a:39rl>ު/wb~rGČjV { }K߭9ĀEیsVNSM%O3.ʖ(] nps3.[)J-TR`dX $5b' l^ܐևoS~s]pSCuX\Q弃=/c|q5\-{!D03Ojd:;d8/q32DŽ5Y-M:i"JJ6 [3`t@Wd >vXg`$\-.eѶ'`1{__jjBE @«.`>ah&M~[c"d Ѡa2 f{)0:Q ":@sCz o%Jntis EʶmC}EoY&\��{yc@j =Tv ۨGBh4>a򯊽aC X+m p @^߿S?g@Tzxf@C&3{oѲMg|FE'#'RčV^۾kt5"ʾF9E�/c׌ RER&1g\Ȕe@ĘFBgU 6 MHl˞�)�I ÄP@ hQ$B tzP4UzS[Y!!# PyD4!㒒宰"(bj%Ėc_v+6B~G(N EF%_'As+gBaBY4/"4T&A !:U JӃQ#ڝ_#D6H.]I1Jr|$FnsKʩb0a0O;Ԍ#$iF8 R͸>a<_WC(C]M+DFa69A|q),0ɒ. X(K 8le <C>=+T m a*X;4wlk?!pH֞oPHd8jJyL0w5 qsojtN/P˜xLDPN9DžH"):,tl$΋<I4P/g,j<V_T՚D ZcXE&h{:=R62&8s Ꚇ | .ݕ\1N0PR)SXɎw1xyY.ttνpWOKqKufvj׫D3܍%5q�y`[he ~P%X4Y)nϾ'O,ǁx8 xJ ^CéF_1Bx5�QM64�8w!}4^pgg� m=9-E_U3d%eT=t㳋\ݡ&"`AV.eg/U?'WAm- X%g\1aʈ0RR'IIBHS3[}A#|@t)8"4j)'|hXH,)dͲ-W2JB AfP82.Ϊ-ǵUFB&b)ۛ9ډ7"W/J>Kdj&xu;GuhfDŽyJ/"l}3} h kj:B??KWbKqR?w^ѱ:F+!Ձ֬#Ƒ^偝VȻ LSi)bʅ%Ly lngl(A&z5O8TvX?5]&kْM*ili*Qc6fh8#t%KJ49+g"&N/1|* <JQ*ktۻMV5I E{Rpd xhS6/rYwpԵ1~KA*c�� �IDATTR>ťnUT=ʄ-0.>+#`!T$uYWu(zcq-FTicD}S|OS+i%%Tn^дL0RQ9 :xU$><;S Bubt)Zd*:E9&,ir/?;ʽݛHYbvogfUlFzу^3M&\"׻nz̪, ]Ľw̾ss.\6&Ə6XG; %L1\\B kWY"Ng]syD,m4}?ڳG|Sۉ9[P9p'!0HT?w?!}w00�Ӏ=S3-@Ťe V58bȯp 8_z^54 Xq%q9ȥ+:E~6<!fp3[5eA)fu4Ol/ HM((-/8OQ NA"%㴱Y7)Z"dsHxb9WFi>Ş\Z1̄H9K\P\QwJ1Ls aJ"' "8ʕʥ"2YiQe.bS8R2d5.L6֯?ͺb)v+"D.ÕT #!W"e7ku-H}{B_q]=/ g++! ?i+!!':}REHy"r̩"Hvbs_(eyۚRڵI/r~\ OBRGTTyvnlX;Q1TWnsMv))2]%8{(!Z:1G:ϽdQr#@~Gr)ݢ}^.R7_C_H ϑQ8їW\UE.1QS]^J|;(L KYT^-qp`(Z>꜎g*Ze󶚕HB\YJd|0dr `~vtpKr &x%Liƪi)ҤU&,S="!Ehτm !o;OS%Rz/ ۟W· z<=L.0Ƚz>Mbl Tigזb2Z0/_@0x%K3E}o>%lxS;x8ãmã޳}qWS7p=n6ARޭ]>Y 0 n\"<\oC.Q`*u޼JM&q?SfbtzE&"TL!& zpO9I %Eb:&sLT^KT@ș")y ]Q@ ODYb#<\j)#*e$IHS6]̝0DHӬ]ilԙJ(`$bJ,I&Z&X̧EM#G)9+UV,EU&<Я3>dgwe v11gAע*4W֗2b\i<tCxǻDR3}YIF[mMn4^lؠ87~.CGC??9GvV Rr+pPTo9]<U]AS65y )̹Y]ɓT;7i\)PZ)'DAT)$-&OT53!$#$Wc+ e0c0rzU[j^W)ծٺZfb{χmo(;T=a"<IunZg^Op:dP-eF-}Rb]oыsۖ3 w %ׁPxiid# -R$5i(Q[׊}#M#, Y!f9r|Wsւ9)8<űUfΧ҃$пA] pU 2JB%@ ~l�aV"B~w@%"`?{ ~Rا?߷SB]Y v~߂$�@q>8 ޹X o9`?Y L?{-z_?:.zk:?ɑ&X'tHl̪5Q97n6T;^fe&cLx9sBȚ+'@ d9 Hݔ@( ,1Ј8 (f7Gj<3ʞRs1V*@\,߄XNXV@2(Q0'Ib 3K]6>[ #I6(BbU~&wJp[.2PېCޙ`d<R<eCԵG4o ͏{>TSӊfL蒼+vtN6)+u<4P9.Wf5f=K);gu~*.(&EG2btpml~.D{j XOu<oY~h='7|YH5E*yȰ^ !rȞ7hYKIBX|E]F5ScussTk(x_1Y 2$`E5g"$TeI+t#/Z Or,M#dW+URql2r{E/*˪ <{s$SEtD2Z"e dP2ptI$+PsȽ:)'I*2:g!4[Wc)GBhl 0u2v$hLNƥXt_YՋ7,: g( (^Q?c/y|XX+D5{ssmp;);w|Ghiß^g?5?u =='(Ļo_wRw~yߡxh{`::_}4x TǑ$&d7lU?oׇe̐]ELqN>ܯDq@zPj`3j8|4%TM NEYHBH,M8!'% J1 .e";g ! d&$Q'R(œJRLvHP6'u<S>g %10(p'L4ntaD>? 6lHJ{سKKr؜j}93. xcNԹi˜܍ҿUBXR(vquLԭ_9P+Nv,D_W+W7۴v-[SD#`a-LO>g|r*3<1:5bL{^I-{{zvP.-5Tc47'rмUg0rW_շbJ\y^|RtIbg*I{AZV:^E.4GRVZ|,v@Y_ezdBM 19q Fœx CSĨ̩jfLu[ JG`1YOZH1|ײ{.il:2TQ&"5J1�J/*cksѠILyK m=\TDV4 |!Hs"dݯ2O~_Ý?kܸo[]+Wpw.++Dy7LiDկQaWUwy]>¹3|g}qu\| 0Og;R !@'_Z1n 6}n p P=@FsZhdE<>2�p',r˅qÌ_m_M&9[A]%Z\] ,rX%s?dTbdXXRN%Hy2pKY@L!'J �@)4'2R1!"G2&$WxU%s%#2Y<DdtnG7\Yi}DV$) {d-e;EqqvBވ Px'^lf5n^^<^2xjY_rSI3߸ׄE 󂕆V/Äҷt;uȳ( /y}!&s?_U>M0h3Yr,[WђyMZ qaA)lΑdVLWs2v{] W3=;U wYu<F3Fj{LB薯dGaP:c $s̪Me'i<2'oR j +WtrivLrS0${q9Lae,bv7Ad<7v-[)Us^'\8EpH]@**& "ʔfw/@P,J9񵐓dj\ <*-j7R64Ѥsƹ|.ʖhS8YG6|@tr>[gSq~4K+<K>{kV*B,~?Pȷ6}E x<9@a՛DKt2:(N�@ݏnE 0vOP#}|. 8sv )9lCF}OC>~Jӊoؼwa }4ǐ @h!'0#+ }67Hsw<<Gy^~n[ÄENo橉Su`]鳧H́ljIBĉǍ%Oi.*/5;©KJ>*#\HQД+)a2 )g GA�x�KyH<H%q9DML9g."I>QyHQ1欨jJqoMr8z?*Ŋz:[%3Ve4.*(y5$l2>\ݔkN+8-5<˙!}qlB-Pʠ.E)߸ c@-ɭm|ٛϯ&L*:%bK_إQ� Q5ikY,c S)8ާJ&+(?sRS O)Х swJM`.򌷥 ՜E%Bk兯3Ңt AS'BeYb} p㏽]*=|eS1Qm´-vv+o̍Xc*- ^ܙӄbYa<«c(Kb*w+ɢ &M5,ˊBQWC ~ȅSB;)+xQ֒B,*c=I)Iw4#R3Y$f 1lWؤciI?x\TTQE|M(1І^4\^ㅗ}i`{&gfa)4pAqr`Oo! [c(<Ga\+v6˯ Nrz_Œtn)8=ؑ,N @4Oq8|Hp}8*10@~dx0vX+<@ |Vͯ/9/|6pv38MdSVDLqR*,fxjh$j13vrJ}:bTy`T@gG8IH3&<aF!3rV)rO1L1؜%`YG1lsX0DODYnuf pԄ4$Y:|&boι(6t|IԄj*0]ѯ~#PIen$]F3hi3a𹢇9Ү$V`Ʉr1zBh.\q=c˸m̨Iy?v{; s&ca8KFy$YIU1$7GD?%=t+텐@/EV-B;Gi9wE#VŹ^AlbKv)d4uԒ >_<J1UT̖nZq.w0ԗ.=o\JSyr{4 $`lsyNΡ>?/#tqΐP'iye]$vFAe6\N9DזQrKHU%F}dųZ˲TZF^eYM^abĀױXAPg#]P: Ee18[�IoؒPSbV0/o8\9e/J,$2L>;ϣ# ډ3KzkbvϚ οWX>" 3owwc@(ҁwPz`ESHxZOv#V.�ssퟒE7?mJ ܟ1,ZQѣk %#է$L }oN8n0Ad iW8΀! *\ oz}Eqh UR(g:_1@*Zv_M{hC{bSҹӈHD%T*eBfY'Ѥ#]Ll|iyrYhA<'S1(2;a8)SCrsg!+V)a$KTݶg7)a&ClM5›1c^Db6iH[f"_سm|( 1z8dSt,SMa+W؜)v➇wAL&p6T)71 7l&Iϔd={F jytQ隆w|Hf\񊴲&ux.ZJAv$!dJU.JL$l= )9hOMC+Yb95z7l($)aYD.b+ b쨐,0@y'St]zN?y23pNgfeS Ei-xV IEyeMn[hY "s=cZ7WAV)ƻ25u쬖Z<$wrf,Jg2V|!FEf9x \FʼκE y!a4(L(:# Hؕ%]FZ, Eȃ䆤>ӹ:K2\˅*z6:+i H O&k+b{#Gǧ-c,(6J[s{!� 8�;O8AT6] ,89P>aVL)$a{o'D~SSbY?EU:L??7pa%ܯTXrTs܄髻'/ʾH ~ Wy$E$+̒ΨSQ{ipD C cgWqA65̔F0*#y&a4<f,7ଳ*0>}?3C6%BV@2QP7n;ee#H/$& $@2KB(Vԅ+ab:+P6-L"wg+iXXiauKlLd{Yy"6<([*^=9r{7bA-]>*IYfR@}0sO|y['~}?ѓDa xU^ExNeyM%SL3҂rQt}ÒIm]ȒvQ|Cel fM؏d<RY]?Ȩo4Ѝn(S:Qz:b``uj! q]Cw?]m^z$q!"N2/ӣj MlS8LW,(>oaj! (ͳLҝ@*/Ԥn_=+~ʮU|<kT 5' mhB:2zsa|*Xx'BBZ$V ND*Zݚ*E/%/Be*TiD[ZԿaw{&TX a- j7*�|ĭw:-ůz 7R'Q>e,NG U#l 0E]F[�?/0mp0BTmsˠ+�� �IDATaY?l!a \-pƒ>0NFWNKbF85� Lj')N!a\:q2W2t(;o,2Le#H$&dΏָRƔ23R,hZRNvfm mbN\s8jAɉq">^:&RZiE yb2Yr^Mz) Oe|FYOJN]v",#ıNQ=6^,]&Dr`ߐW̩ӫ"W2>T? JuҎ&O$K!bQoڇ}-mNWNO}Ꭶax§duhByI:Ul)gpHd$TRbsz4Lyc>-ʠ= 9^e3HBtyQdm*.~3{:պ\H9D>M4S`:87ysv t[FDŽ=55rQyFE;Wx1t$2XCnysC:X&*w/ M˞jsguF3Kd\grjGy7“-%a|!Zt0d$MMr Oȧ6ϳO < ]^Js,,m̳f 8ZI٘>so/6{ 8ܮ':Mve7=JpPCaī$yodWqpʢ oQd"i~e|/ 2!IO{oxm~WpǖJOEaD)\t*BF @D%P{(DUzl-ܔe*blIKM/uu+CJ/vtbU >Oe>_Ϻۧ0un!G4B^'/Pzy^M%Q*RHcHcrc$ޙU? 6:%AH,=gmi߀؛,&-I䷖Ws R?fl%2D'1Q<=MLD uK 6Rot1)7l˖%*RB{6)RN?XIgú4{ 岝eY?J|z+j%i4?F 'x,-/vHU)E^+fwָ CR/<Yy{cm0l˶fU;Ņm˨hDּY'horJsKى$ __yRVH 1lϞRR[٦.SFZHGjcFy*xLe=?Or$lg0(Ny\CsڄC|L= Z3O֋Ն&d*،Vc$J & Buec5XBtQJ4vZ_RJ(ͮ\S"e# DҜ* r N|ʉ ƸԜ帾AI:0YSvJM3'{ξ"1ՅʻRΎ& .RD.pcAPPYxNKx3H.@^Yl_0:aq`wd�O�$gys5 K `ۡDn;Xx+-C`~N'Ӈ+? 3GA~e v0G{a(1^  xNZ�;8S(% !d;@e/4qS]/UsUID f:�Z ug1eF/.g)cPJL"|_m} 244~]uMܐa^Q̊e| rLx%L}I#UiƐLi" VTs#U?\ꬬLyg&FH='1 Fb([J&IU3kL:=QHJ{OS>;:妪pQ241c@׈Uפy.\껲t[u1x4v!CN"vl4w#eShE+p2?ίݽMNrmmfs`nrV^SZs-ɊVgy*=r )S.̝~?mvN*tM<z#sm."XlsQOhKC4WVϛgXȬ-nѦLҋXE:eQ!RARNr׫F4eSa0̧7Թ\4diD;=ɥw1DN)L!7cj9 Q DU B+8vNaM))Mk.˅g\渘hվQVQZ,Ɛe <& ) u&|@H'TMӒr+3<ͪ퍇Zq@ |)A x 줈?\#Sx@o>g�#`/Qp&Oۿu} <uJuqԻK`LX_<y-̌  j�<}T-St_\>8<5yfZ>_vc:8}8U*MxH%sE Y>S;g5#Id\Wy/=IfEff=3\NudMr_Ůȥ>)E 0*CIXdgqDrIbFl>! ZJ`'I^gN<+[j*ߞt C%ׅ#.'E٦6hD41UDdɏc>tU1+-)jC|:"4 v}6J-aj~K8ZOꊩJȳXƆywwق*s'~Ay/p@x#:ztR3bE{tJg6+ɸ,ԏփEAii'׮vL8qjE:gyI0"g4Zd.()iMnhZ'_b4S{˦;5~'+qObciil~74SIq76 t.ҷWOxi5hܗEZ5+֠&& 1vq&+{N1<IYٲYzIy>y{{;H3hj<#Ls'7SjuUY^p |6s>lLaZjY*h>ūDQl+jgWULZ ,/0:OtAĽ|8݀7qtlKqu4#CNH9 %CȠ\X1aK/ +į msMa=;gQݳܿ?z-ླ'1~Z>K 6@D  ]b#(P�3%a94]tUmp_Kz(NP7cUWQ=-3'o9U]]uU˗G?4faOkll,\}]PQ]|EmXJY,UȖA(F#HLd<1AL!FB&6?dW)CLYH2ݐpѓuOuVXf!>!:1G<} )3rŨRҕ0TF'7ߋX�tfɭa>OOr/kg:h8u>Wojt^|\ӥ/x(튱9&⋩88.cRDVXvf?C[ RކݫRNZѝSy"U4ˍR3֔ZCeu܉$QS>yk Kv[cOh$-]v[6l}mn4`%K8 BrdIݻ3һXft垉mj._ެI,s22zn @ hhW�JD%0I`0�׬%ozꞞ}LˈF<׏;?Sg&-ݒLN:UaT�9UrQ6oYvz׉XTP9�wspP^F4)ǵ},Vm ;Ӆ\TAÜLL }g,d<HyAEKL5R9_o_dEz چfYyM]Z̔F]c!/<)v /k=9A}>jsWs 7r~/@n�@~_.* \T]s:|k^3?O�IΊ�/oqN`[?45`Jf=s�@P�F� $H�1@ />|$gRµ?~4Ϝy~~BKXpwnXKhWyT˧1DeE/%>|!wi>񕫗ڹxViZ'aT9)EJVi"Îr.K0Jl+9<]HK ۪XXOdyp-I'&>Y"dEEX0/Un�F�KU(tl׵Wٛj!0CnuTN 䎚be">a~ԓUY6WJ4@ ߮u,Y>rkf٫{ 8jh`bI>g'} ubyݶ=yxo0nף93p6ȨZWq)ǰ?KɰT Qd 9f<fB̦̏Cݿn2ׂwyI}}\kldw$IsE(c=,1Mӱ8}A0Bzޙ ,,3gwnjWR p &EБg[Bja2$ХC+Muk#E @B{!vYlYmYB'UF,#l,dH"&"E[oW'!W0:\L{RV+Bl%WġB W]4i!WZ�𰨲X eQ`&Oa[J&}1:'k`^-h s{={;�*+Fkv׉7N}|[÷͛]uZ~3Yh~׿}~#'?g1ٽ^F9Cz-Ƙoyン4@/=K���_xD0؞w)8f`KŽOS3bqy@ƗS8b psՎF/vOkɴmZ0PT F ㌰dNum>JGp'J)͹ϔ\@B |톗9 7)2B(!%">R0@ i-ٚdRTVJqOEW<Z)Pڙ>~']ߣot6,cXIb(Y7I·Z^vK߽K٨sXJgM+cZ7C 9.1 v=mq9KJHV#sxxk^ۏuw4kܲIM!OapKC)ꂑSʋ#(E s~a~z&.#Ce삎w2!xObT0.Uhd{^`eb>2f$5Xh:+<b Q+cQ2X!4.=37Imږt\(t^r:iԕ^c5t)˓¾0*גbc:x[eɜ(cU#T㺂u&H'P @bXD44d<-i@LOR=`UQY(:W1d7pָ|E2=S?[gr 3Csc??pJپrs�[gL0=ysqGsX[z�mKKr5X�8@xzӽO@pPv߫^t�雮rN-!=\�H S`p?_ЭJ]nW>{ yI,:ADy~aŵ֭uVQ:̨tE-fF!P@aH T$Y599["m,F W̳$Pkaq.JEd…3`Ac"hAǝTJjT&`LC7" H a ܙV"̭δ&,,yA u-Q}^mλU㗪42/ =SFISIW󬣟7^/aI|"ee~*h!2u>/>e7I<K^p W˃*srU}a0 {ۭNmFx�y.}r}MYNu-R`(lksy 0|aG:]$ӗЖ y-:20Ƭ5 :Ղ-C%ĕBFҢU]ŇStfn63\mUe&9ڪ*1\T!ec4QHڗV щBE0X^RҞ 1:?"`/UtSOcaÁYXu뤰jqq]GAK-lSK2bP# gLy((Z$1BZmP-Vd q(jZi*TKZRҸQv纎AYXޏKt> LJ5 $<iMAya[ |^l  !ȯ<kXi�W](pA0~]?$S.ed oO7��7qd[a=y�؂41 WXCMw`fmen Y:?:_�"\Nsk.Zx()ſ"紪Uzrjtg联$ekRɐ2l8v $lA9r,;Sڣ`3U  ːT beKg<C P4)KV5+bQDRx)Fv} &*%UEh K#BIER|L:\,zp"$:ͲN[E(H4me!iȻg1dg:&x:enhSNjbBz/^,5ՅiٸYZ"]>GHlu#?%;m*&UhlnqU/T}lN$}'qΡ18Ʀ�2?d,+b?9<ϹE.J4`D-a(q\q[5^҉R}it}~I5wU_(]ؗbR'!h=[mjŠJTDB pL:P l*.W\B0r  V>+[FE:DjͶ֪1)A4HYlYgdr@Hb+R}N, ],EH}(yU;WY�(9dyoNRmϟK+@_!?\43 ,�B󔏋ydmc " |:8�`A7w@ A !?fa(䟠3 �m07JGP@=A;C60Aۚnyc'{8L/(Cp6Ot`w,<@2KO jmjN/n9^T Y x}1`i֖nZN#UT4E)ha9KV8T+,@Y;!KSnn LiZĎX"V6E[-Qv5 1Q %{ XnAkTX)TYB5:s6ή۞DFҍjX umwŨ](̵yhh'GI0ᑁuH$I *J/iSY)E/X՗1+f0lTjz Pe8NŌscS,T^Rܨe;>_j{!-S4JZQ<u~#nEβi[$%<3 .¡3eۨ:iG:(٭Lߵ)l8Q)LJ -5_h}%a,%)]}̜Դ!JZ; H6f��� �IDATF 6B)d eN=<c]62Qؒ+N$( f^n:j`T> rH1i,~?I#!BQ2isbJIX:QbQ0rӹICH5TSZO9-҂9۩:Nd >g<j˓H?�K~1s\u#5;H 7uꍁ@$�l^?a( |.跖ogYhȲ- |/œm4�A\~� _?mR0Sz:$ XA=p ]Lqc2�i+XiW42�_y�xי0d_MNZX=Su|ڶO8@s<0KjCvv,8:* ad'tELZHm*좞*DRB։ne3VR_ Zb9\fͩIYgR\4W4:^!J#Q Qw J-1#_Qr|F3NV#`ю@Ʉ ?l~vth6+Pnn0$֣~Zq>.G)l}RycAuB40mIA߱n4]7@Ў4qkVT*C_wn b4yLe)mg2}r[=Yֳ&})/#8j: ެS">92"0Ecx*]ˁt1@[za{z訦;i lM0Bi-u֭25V4Mc.Fu_9ra[nFATjN*:OI6~D>y&ٺWf^Gɬr8r,&hқDr,Tޚ*N 3{ZR)t9#O*J=7:yWb1i:wgD8])7aL4e5Ü)fc qͦ|+:MPIVR!OW�)]A+aGU}!h8l!nكD�"=@`�f$ x i?}o2?Eq.=MEؿQvsi�@;@Tގ� b DH�f F]l.>^+ϓy_zCrU 4_I+U#+mѷ2}eLzH4:[J^@T*3Θf%M*ZL}`5*<R+]T~QYI%,0 %jcYz-b D@E`)FDԆ;Iɠ QI脠TưF>K⪳3!#YN#_ݳAs9O\ʗ>SY<aZ(^Hi4WO<=lWT$Qw_7c<-Wilˍf/U@)мlAG?i_n5j+K3 RWqSx(ծw,}w/ٚ]9Y1+> PS^J,;@> b-mNޭ\^2\j Nk%iXes6*%ei(H1.x@ uM^5&y%h/&C?6}m(èAI#{1"Z1YNwRBE2W/&c (mnK5Bz9r!�2>GW; c^,gC@BWT=@-j:ܿ*.vn|j?=5@Ie� @fK0' uI<_ kMR*fH�`x@+Qvgt H+8#$ŷun|�8�ܷO먐�LA s)Rf��_OK'?S=ezl\kR%47Y0h!oz N?[$5b=F]�.T)7eY'Q4:gl Fo]t@PeKfnb@@ *U$K,PtDRتf%,z!U5bd641-8JZm ]5�d*) 2# U4P ː1YAr(qWY&~[57Op~s9nK\yuf~F6f?:rٶ8ȻΩ,>uC(P~qq3(m f|ϧꁵp6vH*4$ij?Dܟ ym~c1:/ĘF4bجK[�}M}Pb\j<Q/!o.3`/vl`:hOv:cnﭼax'"Ňu*m#JP TƼԸU5,7[Qjq , lYYIB]ԕѤ],bLX4 Y%p:k4$[,4{n&dSĂ!2Z(D"WA`XU vu5n-u[GV1'YsD|b*M% L't$ @ eOpy� O�& @|`א6px[�VN@J?=mm_ JoO?Hb}݃tz1s{X�rS4 I#܂>\ H(#5V\s[ʶbtK$E-ts ͛XVTWh\"hjCA9n|褒Ҹޚu5^i @1p�RK܋`TKeB)V K3! *Rkf-F$9#j<X, kᔘ"`">4HchI2N8,kW6j BBeQZЦ"djPX?LD,ZY|ln')|ə[賋5\ԣ#\0lVaY6WORo?Eat"Ϧv6hnHfiR( ěWޛ=8ԆfDBٜ@AJXod! "95>nO li峰3e>AsnFSUqeʓUEWt겻(b<%,�dE 3QO"-EA.sǒ4@]meK; dI-�]Q98T*RtŊK(˺cJbEZQ*F0R˅Ϥ^ FYđd} ʙ<no1;,  Q MGbeg W},oO_Tuw `X #w[yO D0  uL�[PE0һQ \zEff ?AD; f k�_|7mWoG�k�Op@ZVgH ,��Hv{j/@W_s(j*_:Uk`|N³u>,dN9KaJJ['*W!(4Dȃrhkѡ3ֺ Z(@ X  V2,`B$pZ*d"VLmV,ܠGP3:ѓ)E᠕U1NgRD,54.)O1k!( #Ĉ"psBflYG%CEa!-FHŔw2j ΠWLNn]y7y pzmvV3o3}'}A"1uyq._,~xwv럜ŗ᯿\M} (Ϣ\FJ[4$ƸJ|8a[<Ƹ}F3lpWݒ%-j8S~6ӫ{Np.v%=5) pVke $8~|VꠣwqȯLxRbԕF9NflZSd&pRro0J%\<-DtVeM'JV,/^yc5xapR~K/ڳ)J.R1-9)A l 8iA˚ !m(#iԚG Y% D"nMrpnή͘ 'Mxbjta[vtbax OA*eRuiC fKW+ེgh_J%l Ljw@_t w;:׃οW�D�cX~AUefmǩ(E (o۰ΝxxpA�-hc}uzUe<_.2njinDKP"xsAx脳aQ^)o蹇!.9t$cK,l1)! RZ\%% <LBF=Q+/f؂$kRr>:2>yXg-M55hX�u*4DLZl$;kQ4LRT<BY3/RQUԑCha̢B]$ESgiEt?9se<lR"UЍuIU)3j!U*B� g;bya'="Lmۨ84>)e],?8ciL߷<lnǽOgǩZs_7͟S'nKbgʨo? ۂR4,o"eq)^&\N7rfUg">V ykm:9s{6ҤMWǰ,WTî)g 1;@u\\vE8(|M"vmUszH(u XyR Ph!)b! %F{YY^ yX]r)A lLc�HTQVI̎sU)d b\D.|…S,TzL1}V$M)\2Ҟ,;{Gĺg/[JvQz֕Hۇm�_�~ 20A^zGVznS:wQ*W__}�s7;~3� y?㛤?>?L @}m5w2T4~sv`m'@ITΰ&l}Vz':φ4j#?6 <h͹ tQ0Ҍ"y\j$uyxg ( (#cUIϐ<@.e.Ryƒ*]r5=2udz-@6UN7;!t<A,@\j[r.T!%Ŋ9U8RkDAT Su@\kY)C IBRLPE!r0CY%5D}3Jvyҿ uQJeD탽hpuD%R!a&P' ŢҤr>x+#~&BS䴗c6sjn./dL^QF6αV*RJ݌LcX4Ű8H!dy<>brliy hZ BrgN'%>i̽J}c^6qCDf pε~:.X'*8̙К>v.qsPqۈTY(R+B+=Ͼ,QX'9 0lt0rt*a:.V9%!B)#et( g}2('UDzh;(oNpG#\ˮYUZ5,N#K\C%<kbVfwaug5=w6=p8J8ض0W� :9↷%J ]o-.}+8WH�Uy g;!K?}o�~ہ!�PnU�i,� ˷1k�HpsUzrǑ #MI-}~5kWӻs)N>h#*W@u�)/c~uD)56MV]1$BkVUs\ND`mYmQ1* rdc(yJLVPPnTpQJ1-2B"ydd294dUA̦;US "[YB)Z`m+Vj+~$[[dC%3aʧ}\O\΋mbmkSrZ Yc2Ϣ+ UC۵:&2S /)"6L/9 b:wԩ+/̶.U ~ |~Y\II5\];{L:[''wؘ6w \Twػe/& q_,kXd @Ee{c&򶭶&2jJ5O(t<)eZs=ObحGJ)R|ܗ&pAJΡ@1JzjQ4!9")a@gpk4M-RP^x-sWLK1Ud![b5젷HYWHNd,�2JK\ArH\-@ 9�w>M91Q<[Sd:6zU}\ f |~.}YdO6w=*&zU_� N|E3:ho2|-\jos|߽pi8 �-[nC|[Tj',p H�򭖓) f:{ynP0o y'Պ%STi6:B_?7'4%wvEVObܴ<grQXG\< .`E+RWҘ0W,Ƃ( Z3ĚUI )TҲM+u,a*hQHVk+ AC](: Ɣ1M|ia j:`A�eWiJe+I; Vb\K-X .hιU4r[ǚ sy+W|QՕٳrM4l+ ?GwA.vOQb2`ƃY4G+(ԮJmRw j2fwBo/Ui*=·:qhďs]+CPlgĿW*/&9!ng{]>j`NyJT.G>.D h7+bdfPШhI&d 5f38[~ʮiΒi浭T;..N4"9%\) i9h{PV`QNXFIQu̅1iTh(΃PW+JSE7KmqXipT+b>ܽٮ%W%ff{LƍA&sV ]ՂI[z׃$4jzRfɘL>L`HvDZݱ`kZ"p+*_! 1\/`j^m6v#JވZ]�%2D,5P0oSfOn 0�wU &]EGXMhzXW� .I T/�hx^U?Rf Zv^y}.SrԗŢ~͸yt[AU^ ܔ evsW!,\+)92ԉĮ!Z'R#. '0kFc IH0-N)DWRX$)f&CX{i5yVX- ;+\R !#QYAt$S4ݣ3LQeqafСnZ0Tsˢإ5w0j&*QIX?�Ef�)"]ӰV7jzB[�)>]Q n'dhNI0L|qalj-mӆ>iH56Gu4IAut$sen[ogCjlQ_ @ǐF.hy*�� �IDAT΢R:2l(;9^Fe7uUU}{s̺..M:7Oߪ|JRiYǻ4}u4lj[/oAѭEѽ֤KZ3_k_V||]g@l}΃)/SFi1}i09g˻x=ڷMpD>,fèT$yQB8LJzSU:uO[2@r9wnקc*؄RS5/!.-]T<9t'#/OU@T{:rj(WP[M` fx ' l*�çSoUj:%, i60�o ;w#wm�`x&F7�XpiL ]qwLV0W~;Y�j{;Tfh�=zY/�=zk$x;4_E7Op}[/<t YHH ,|OfTk>n02ʍFod&.kVjF CQ0$\BQ%oZm=FY) ӕPL VZ`1@BU&S\�#v6M,fB֐P:#Q>LVԎ>U|*TM>Nf[t 0"| &~@XMӿ 1-Uܘ8鳸{렜%KhS*꒻1x^ϸb*UoV06V[cx-Ҥ&,neS9ob &3OFʹ㥦+s^IUeOyIcU.[][3ܡ}CwP>?Cn)u tJ-еlZ]|\#FNN|s5U(%S,7pm@IYmjAbUEU樕MZ[h]!8QYJ2t\rf`7mZd畲3Θ^fS+b"(2`uQ$D|,1HYCc 5w\q^&fq_L9/oCM;L:sl' [c.n̋_܏ }ߜWmY<jGVx �.0 �Ǣ#OCQV/ (wrβ`lav:@A9|{HX>NB}h{K�ۘ✤5\Zsr5�eP5_CkloraMk 5NJMP X7M+ywy]0f b:JE>CS(cMi�)J)m"(c&`"FP RgO+�9g0V\ @H%6)!Qjj4%2H₭63Т<ĹuJqÊj :61GRrWdlǶE�ڬ`ӵI&{VPڪ٠&S$u.q[^SSZVo#60GW)lߚmo~7:Wy<T:Х.╃0e;bo}*˩hܶzl<׷kW~k*>.ؕQ7sY)GKM6TȮolZzS;Tct򵛆m #OdeYOeN[k]^ {JGi!dɵU^i4Q*SR Y\՝ɫAd ءA56Mx[R-KEQj!,J{.*R59mMjkkYlciEWqviCd2+m6iW5�3XSѬnaD^3<۟Һӛq5_ ?K0G7wG-p=`=$<_D�?0 *o #>s& |0U�H?҅n�*$ _@ n3t7` Fo}TO (?\oR}h#׊7VfO n> 5c7f}mC_MVRTݒݫ޵j"'m̔Ѭ(sɗsS֐(6`I Ԡ+BQDRNvFU"� 7|_^P6O^1P"$(Lmdl|im⢰j]HBG(%kLP)�(*|N Uuv%W'Ms.p`\)L$r5~CSVa#հ>+]1(9鹣9ar|<.<w. Oт캣3}00J)O\PVԃ$6 ~qa-9}zX:dkJ-pjW[%4R,|z14kN+=T9=k>*�-G17ZsMJB.Zid $IJw]Ҳ?5} crU=ZɅ$^x}|M^]T3Ja�SmjeY>]v ImX<" 8 ݆@4(^ĥ!Zu *0HV @cI隒ND.Gb0. ]\nGIPpgZ;:t޽j.+H;(*.и4 s㋝ArEwR y}>;-�$�9�'G3|6O_{WSmx yϰ&KОǴ8Y�w3ֻpͤZh>6Z~q 0��~ пP>dU'�돗Rs{/K|z-prWvvS54 k=vf׍14v6ki-X'擁!TIi Gփ.L+H(.J6M!lC`Q2#UrPE ֪jR(挊Gq'q 3r!" ­}Е͒UQ JE-I!vIoE\b\ɈX<FG3RUצaC$<wQ5:jD/&)W=͕FKr5kpѕdS#N$$Xx׮hT5uiOyYh@u^�yq(|8?_JuPUeii҆y׺P뗮+\۠ܥU'{[1Pe=MvnGYCMrLi.PBχ9cڥ]CcR.r}a0/*xLi4ͤKrXe_9߻ sh\P2%/lx^"Wa٩47mXRpN0sьKJb2[ 'phM>R#SibڨL\8g`KrQd j *Z!zN+l \"<:%)T;L�0w$M;"f> .Ǡ|v0geI;XiOfJ?UGkq Z �jީ ~ , [xs{w?SHLOͥ?*3>[yT簤wwS`.lS7`<EH}tu-F yB �3‘tx 9o*lpSmUF/dbe6$U3K Ŭr@&6ĂcJn:[ 牃i ٛRK*\EMvB(.�$I\YS&X�YvUΦB�E/Tey1dD]R6(Dq3\SJʺGuFȤiKŒ<ˤ`.!$-P@r I'rDKXAtH_p+Xu e.*\ݡ8€sջHh#:E+ji"2SYr.!?0TDٛM_zt: &*޹ֹd[?Qĵ?%MsQS=/VT~5ᬄyb2zc:=(^tǫUڶٙ>!Nikw g ]@}tPEe$n7+/N}WrLϬ]cwqǥZ"dU"mefAkY$gzUp\ &r�ܛC\LI|eV래jmHU Iƅ1rE(2UQ猞!x(KK}U 9:Oާ7_?E~,w.67#`ooSqn?z,BDv`K0yozi:GgῪq5]֓ @ߏnf8�}Iy ϟ@Jwú `4f?>kKl�<`2HtPpm~Ǐoz4U,|i{98lF?Vxm6PpUh{%JK7,@-KY8E Q1FMع$A�Zi8UU-(StT@ZJΈ1ȸ-=`-2+Pc׾+K) \lvSBUb̩Q@ TKǘǥ4ǟ˜3 Q֭$j<x\]DqH|bc1k&ӼzͲYH<On9M??ӃK͏OmPrQ\^lTuKۦoVˠM�Uxp8^qī5:kWvv^96Vu>/t=4V_,v㿞mگً5>]jyצ jW5▰Jg9W ӃQMP+j7 _ ˔|TmCrY.;e)4%sS T&gvbv,*^Ӧ MM-1/ B G.a*CPUMnN[:Qƒhf*bXUfPe:W%Yy~jޟx].HBV#T�himLqo%�VwPW-l:9�90ОYME} �j?b# �tgSfW.3Ű=@ ^ !3)4ϡZ5}+-;COdFG3?mѻ˒@!ǛSͷ>ca�3<8By I�<�L^rz;1>Ȱ]|Rp^=G}M ۈ0,%*\ 1c,#Ao{:Ut5VYi`רڨ :D�E3 .Xa"\½5RvKve0 WVjT)ez<R9sAQ6ED [T^C](\0upQToꈔ(ث3#jg[A2#IR>|^PT ADA.&\w=:֛_UH23XHڐӫ5t0h;вҫɪu3J]/ߟUN\_vX~X]XZ!,<X[NA9X$]C4gu7%vɮӪV\'/slc34̍KWed0E1 5[Q{0_еJ80jspnUחьI!tuEz~я86σ*~&{Ab/p6CRD�⪩iZ{I0X/ қmzN Fr3xzP8)+۞& +FWT**%bHi:FX*c)܎Ds<XEs&|tj=lXv= nڠs:_ 3@@?a>;Igfڒ'@<߹6w} foNk k&|aaXx~0 Ũ$Hۿ#~;/-Xt(k`BG@L�?LT,e S'ih5]hMm2s,zWdtPX K5 RDAhEDr.I*X%kDL*g 'GĺJTϋfThՠJX %J JQ4S1/ŖVMNsEMD ]["Ohِ!kT'蹺 jF[8E&eUᴓ`'8teDRmq֟T?!^l /񅢈M|2K:ݏRfВHMmAc5: s;fй]+)h(0\8ǧz[ie`B-49@|/<g;3)uAFuѨ]l[N>55aS/�es#tݯtvE]snnUC]+fXx׽~41^ZU9ML21=vK5ZCte7ph!W:ltGor$ECD0Mma&Bghנdm ےggA@M[R笨-)SS�։Eb:kfNRǑ/Ka]\.=*C_ qOO.W~}'-I__lMi4,*]˺1ƚ {X? % .joիy7s} ~V0,@^ Jr/>>? G-[;uK>,,)ͿבD~$)QN2�iCLy6g&`~~sWʹnwݯ:R'`?KçV�{ 0U<=k|?D uG�* hVڷ6IXZJT3f��D+eA!:3ǔ NF<uɩȥP$oP2"$QW"QJkB- ePY;JbX5U^x`${$ !]Kht �jVFB.9\t.n.hju%9+,IP"O+֑jtEuf+�*J}5`]Z�HB]ƜF1^.aq>΋z]rO>~谂@(4PeèDS:<<긱"C]W `Vrɔ؄:_Ӛay37fUkzI7m:@vqq?z͠FxhҼ}`eYl%hv]]m Tw˼Tύ]hDicu\Y O)HgSNn4[?x;xdrSh*=- ¦$#1]X2I8A1ج@2i,aІt]δlf9p[e_9=I<ZN]h[0<lqoߌܬeKRl/*sW%𗸁O|['"�,[>߯W]GGH?r!` Ĥ:o�S-~�z7p|ЇIPzN̺NgϐAֻ;Vij:N \oaA7Oww3j5]'# 5+ㆿ%F}|;8 �'GHCVkAh-&d ArHWg4SЍ@eR� IspQBUC� ڀC*l!GPQrQTE9TQ$L UE iIh.�8B"gae@baRj3搗%^/_<O9}eWV7ބPPDQ=(_mZmN_&&s(&ƛW~V0i>e�� �IDATVy *aէ\챺H;3w+׬t<.~m<'Z;tmQu ez %ZAN[LWcgl5\isy"4rQ"~-?3zKK9޶R/oGF} ;'.oʣ`J(: \wr Akt3J�kp iSМWSvÂ.: Vm-.:xk!7+2k�yB'^RP1.t*eUg_'кSP; CKr^x[n/U5 K9ĐcZr@'L <r [LGvCQ]uƭŘֽU] `; {_:x%˫ 0i ~ݯwSl6�ԯeljw$wq胐)3�ݰť;O`~ -:ӷoz�`apce {һw�ՇPV-[sL&x `ô-0ۯ`-K_xݤS/73hPY8Qaaiw yDйX Ūa!F@y XsiaS]|mrW^ r(Sm.Vs)G% Gd@qVȵdE"4ZsUE<h"D41j/ rQ,)b9H#;d. u,~,<Q^05FiEF+A*-us2RiJ"P\~JK&i"Uqm@KQ9SvEMi} }XSxάr9pއ4iӹVw jZ{Ф`hҼ2I0l R:ϡU5irLRޖs4iCGOjmhr-6NiCT!>m"{(^tt~)y vF5tkf'"[nuSm8 R\.EWX3AsZѨhPYfDS_gDF�%XɛFfXǘ<xI-:,SFr/t:G9MY@iǂ`+Yk 2DZ/#Cx;Yg?͡ \y7t `< )Lrw>�<rp �ދ3~`laZSA-k.KH!c 5c�zgZPg DnLcf8�8*LY�D_O^ >./3>3�F9/oݽ^ID jfFg(+ZWא((RHJ9d' G!4Ji6"E%ELJ(agcbhhqasWLm1DF@DYE3@ka`R� %3CHQ ("$Aې)'c-J/\:k!2ÅЏ%ğ΢er]ANHXY\-.@~n)E !&)xʪwUӥTJ~5iG⧄Wz`hU%)_x˫<Ycɗ3@H^>ϣM:;)ьD\dу.}1UQum9\DI}\d۬mNnw'8e}v]8xu>ZBo:^3Q\Nfqnkͷ ?5+DV+�YoZ_Z3T egzt`d7RygȢEZ<V*F>id sّMK3Bj<U&4I򝗹Sq1 nw{+Xґ;X=ze Yܾ@xGy̲ݶ!R{{;g%Y~{x�^w[H_ 7z=_~F�G �wO ~?d})A}qO0jM(>z!;jm8 / XxN'4�}#�"%( Wp%!A>- ,˳~Lei2-wsQh..JK6ӭUM>&Tg827"T׋/GٖD2x_5bŨ⬖bVå_kڇ!ܔ(TEUZ4d uFF�OT ų(ʜFSTh$*[*@[*sx1j :ksoLIxJ7A?gnQ"4es)f^]?o(esƋYpVVZ^h=Zԣ Ai"UA v f)P\CJ"kMʷi/j./?]վ]h5hZgKM/iKlTSB)yvLs;7m*†$GJb �s}}djyzl1ɨU4 nijq'UM.x bVg-R3*c(M)={d犥["PYMxw0fI2\\fG~wծHjQ1yEFՙV@4oCѢꜱ0Ɯ#.b!.(%31:Q3b{rNW!ފv=)p**OO༁x, H-uo#ٕ^ ;7C tTIUjQ*7jمT%dJ)R$3xd9Jiwsk ν|g3WaQfҨXe+Opb0ޠ;Xzπ(y"dxSϻn眧6?[. ,4�끗%t�-6Wk~}WaqH9xLof@�GqWyT;/92&EVb;m: $)љ>_Or7SI@RisEsb! YjO"2":'dȤR+h&I&Ti̬M0HXͥ@pepY $˚ .Pt,0a*emca0ҘҩJNP :bJNe={,"LK<;s#B%WE](Γ<A_.cQKZDߔ5^#9dŗ}oO/=99/2tRBX34RT;iEL4 +BHRFԧ¦z'qʬvgfdIFJg^CkZ*bѹ)X%x{Q3HQH+gT, c)K19(Y[Cbm^R?qEGIf5*k&_ C&p6ղ6:0njij#SU,ҦЪa6W}()%%- 1Z\J#!ZY7ՙUQ[d&AS2( CΔ*KI  :!17%!JBnařr T&x4ބ(Qfz|JwIX$isSxG ,Mf8Ng8}c>|"}г4(`� PlF= � i9� __;/Z] ?4pm8|C4BzD y)f[G~epU�n /9\ZE>.!)$En49n!l.\$Ü bq:i~iz2' ,g^r'sP" fK$`BSHHf=3RRE#+`^rI$뒕@8ʼ0eQfann l 30CIba*9XX4-#iA .4S'PQ|l1*g ?Wui^?(bىqr2*0 zv6Vx%$}tJ Zm6EF=k4ݴzI�F6b^# *2׋}ؖo_4K=vJYl<El'K,D)iǟ=|r^4op%oX'/r:!  M)\HUZxuPKCJ-c"W0bbHLGrXǜ\MvCE}\JN6Ҕ$zp#/}\.!TeZ3ͪT5"骒L5lsb ˒SZIQEi3˨ .'KAbŊ43iVac c"Fč[i2 n ^{_9J??^Iy"( _hsSwH#^Ӝ.eW pok}@ h}E5Ã:# * w~T;) g ^hpƭ0;Yݨ]3PB(5 <K#›8PG˦jTdbsq^?Z[}gP/?ۻVSZT!Y-S&rid8Cx%y d('2^qֹx _/ffꆚV%c+Eq6'>J?p5\h5eHm8e' C&D<ۚ5U5O+Iq�J áC!GIet ʥ'XWӡ=?mZCD]M *NdG)W4ו6[iTdš]y.3qnxioEhg]^ъa_|<K4U?+lsL0T}bs̤wGUּď+5Ӽ%rC$(Bsy?}i8iY߯Nn繈U\QqbG7C y?M"e("?Ҭ޴ɶbQ p+jy|ϧ<% 4ߓ"ZLۨT6AOҒT<w׳Y[hC.IJH8ai%pDNjmmX+QR)$RZU:dZ<#B4[ɅXXF,(Ixo,3ϕКSaKYԜ %rB]4<K8}*_ w_꿓53|6,҈*|\Fx@'^,8;;B'P;{  [ 'Ȁ `  `w�rjA�D~ %[><89 ?<a^B%k@ۇ;6 =j]7xfO۔ ~F?JY'4Fi !y1H\sJuW.>Lsc[Er_&#+\ȍp4Wu/*& *,bTSKCk&k0[KQ *URF -㏅8*4DZHS x^(ʈާH2ziM칆&)m"Ζhbf-.q@,CrƙҜs0`Xe*dBdŽpBK2Aؤd2L+5J82yC[)r)Rns)-"U)̋UwlݴUy%ifsհ:$}78ݞ+&ݎ]^.fvShcL<aΒI%^XI&֫ˏ|ɣek:#y.W(~N>pAPk{.`BNM2bNW}? |CQ'dkӛ4Ue8Fy͖-p`9k>FB.]$j˻NG$f5̉j^u$Q&y +JgKGΜ̊LGY ɰ^VU:simx�6T*BJJJI!ZR&I~b%NC'vسA-Eʿ<3,;tPtӠͳL }-w^c}$w7ɩNPf|"6D V 5(30|Ј!"8nHQ `x> |ui?yѿ1_p-> ͠ {mhﻢ=RW`�8A# l �=~ \>GH@Hª#$v7srՕzbG`;~A4eޥ(3L^ ,S2W oB1HD<e (Kv6nק!iE^̶nP"N\@gr(,',i"kSiUαdWE7 2,dYdD,i9sI8(qX*eNE Mq g4V@Mb2rX뛲>zFUFFCq@5)8>Wpˑ?vE^cϜ}ZKQ+Ua+*GZp˜I^|Fh=,f$qs^|PgeUq,M'T~ٓGϟVpKRP!QNt-mnmQLP0؏}?92wӞ*23͡s9T9[l牚[>&<M;*ţd#6Ac+u]lשAĕV\QTz6\Bu0S^M!!E>FUN2}83y#YNLXq ΥWTTN=e1FRF+Ts9朤,$մTB$YFSS;iS3̩JLzx_ GsUB2Rʘ0O"t+4I47KͰ)e_{WFD,vp ; CBQB|.G|@l֐\ޗTЛtA�x ҟIGm [zn?<AB_õu*̸?|ɛC؃1b&<c l޲KS7á  W\ ;tabvm-Y}x 0w�Q"Ҝaq/O m/«},qZ j٤ eraB~+HYpoŦ]Uz:ň3ńʬ*%+g&<r2\()j#W[+�,&!H3%AhI0 RFg!])hEL9)g(ԆC`bʥFk=8UUBV'Fj⹵ur|ϣ=f<^{13^D,?_tg\.1QrڶY&bDYI\gR?݆ےYw<%Ik"ܬkųj͟cn1}j'Iʢ #,</ӫOC?_LnxW�Mv߯cIi6잸 ե5ϲK/%\eUYyz=_3-Jn WW~4R` (B:RŐ7osSY@U2Vw5 2 IB2:Uv8D%ls.,ٍ1$**Z:k.T J_IP빔Q9pڿɧ& k,Rp۟azjRF<޽@- @VB(c=)ܱwÕ9;t+g)Tt# iNYBS=n` <sdžo ͇ jS_i{[\�3Gb`@+8 tC.9ߜ7gfp{#Q&Րٶ<(U1ޔ$ m͓z4N_#J�� �IDATM3Em^5B.R\ fծtui-\1IEJUE暘\`j&j+f~m,WI""D2dP|L(۶D-* 4g&"R nAo1/$JU2B~/,MTfPQX~Z,&TzXYfZ*Ֆ=hw+ß*9[7'z=%<S4#쩪#Xʶsc9,s5ǛqjLwnHwߔ(D_2AoTP6x.O֘/Tu˩KΔӤ4[WKjX$LȓcM?:ې=;RMȦb$Q?[P?i/>΢':VBQ/kđR 6uU2MzUt6<x ս-_bM,F>S}>I6YZ[))M2BL*YVZ$e5‹LB&FJ,pf@%%'dPgtĊgD˙ /e0~o r_0WoX͐\Lm5U{@Q2!͂ B~Z� vu^\_eqn^*9&V} �@<~YTiz?Ȍ9 'n?�7_ܰo/o1m4Ooût6x C03 oxb+v^_L!:l/':E%1yGq|<\vfQG#exȯy{wzѱfѪ!xx\LWEMtq9_XOU~eWO-CZTVy榶<HR։T..t,%шSvUk٬ȕ%0=+)8D%ul( ! N< "*TY8f% &cES1(&m}2, kw@n |t-THaW߳ee~tSb]5b&"辶K␉] CFd*m5g~ʧ)i҂X8ͳ'dvm|oiGvl3(,3wn?4tPZ\4}X!Fܝ_-$y5Eɲ 1Nos몕\jqtr믗|熏5/*EflV"cJmpe}pŒfC܎{S@6eVFE)B<onB6Ew )c8pʦ2ˋVέ0+Ĝ+R*7+1ߧ3$7Viej.3"1AgBTRy9frfߋ/|/էbW4aʴ9*($ͽA5?}fw)>EE3s6L~}ņe?n4 Mz5VH Nbbs�f|ؠ7lw#\Imƒhǒ?|pA`;�� X\* <88x3zNȇxp hBT?GEKdY@i?_'ie΄Uj'Seo1ت" -ν@32q<(lrG2gufǟYnri8͡D24feTڮ֍L sU<cESj8+BUk8(En8L%PS( Ręe3&s+BIeL Y!10 a)DžlX<r?i1" l3BbUY^C~bRZI3#r v=ݺ>K6(hav=Qj6uj7:E+͓e(@9\Ibk61=<sQKnwïƳs;57RUyg\;d % dk+$D]ͯFRhRswk6Zfuf?|[i"gɼ)] Gvsw[g]*clp%&wUgfBsšvt]ޑdElĆ-ږs8MŝֹY놕 #;(dͦkd)9nc+819.TbwdQle2+5]Y.3ϙ e0! Ԫ1VDKa9y)n0.* .2GM鶼Qo}bi<:֦ cr8FA+5Ԥc`AWq*\99֊p7b0g l0A|˜k< oԥص[3 e$+d~ß,~(OP7BTWizeg@8^\@ӛ^ :+&ZE�yݞ|9F EϵI#i>T MJ+tUkŲ71K ڝ%faRsuK}0(Y!jwijѫ%y(3> Sb+c*+)`N.1ʮf)8DJ93-$K)E2{"$,1Ȗ\R}sؿ^&Q|CL9Z1i/LE.9X!mlP-Ja=3R>ٶO&Y82oLE-JoD i0U:3urʳ^St5 ,/L\q_o1syKVeS . ߵnT16 Us9\\FsvҒg~}j&oϊ*Ǚ!zQi~W_=f3֧)SN;PS_jӗɍiUϵyÎrI˅A%RU/ cgw9q`.D[5?1ɻzJؕh? l77I-W֖9EԜP3K}Rs(GULBD)1qdS^fWn*9  >cRn)8)Dn.cĉ1ΝRqeS~aRn&@k ~oO{H|< \2=C%�`]^>l|55᫹$X-A12% =<P\IhtC7;9G g~f;_w"o (.=7g{NilRv�7f+&w^+opk;| nV6똺VSMq!/g\^ևLj-/!?taj�mGguLOMҖ;RJF{_@^B;C;/Vbb\7I^#I!NF'%S1YVhj �%/1C1)D J@3A.8S5�EHOI4r Fv_i1YUA=-mɻldWOjw֌[5[O~Tyb)9IgUV)h؞ZA)Y[ǚqKE"rv}Kҡ>dZ9uM3KtoDV6)֣T4dgITcӵH}y4y (1sҬRMUSVO]WYg/u4iD6/xsglGx\|V>kbfaBЙrXqytLu˲BVk,I䬰Jrps 4dNqql3LaD:RI< ^V%DU! >$K>8y~# TDu"dVx5~~lvMM;m~ծ9/ǧІ|7z SM�.I%uG+zsCt s;*\7T?5{ [�[5Uo'9q|ooLkΰR:�GJ�΁ H7' 9% |7c Wo ?}zH&6xRXR̔n!籷U~ < mwkLųRBZt.wagTv4cMsUVU7مU%4|Vz58gHFUbXY2|13) X ,̶\<H)R*bBY QD )DK(CJJ ,"sAL8(g߹t}iגY G++`gtTOFlϴj8XǴ[D_bsS<mL {t+#۸ufjtW+l" V\Jǖdɼ-r)\!.9"f`b[ͪ@D>Tk% tF |5$M&yʲ@ p5FYK7IvBfߞ>)&lX,QZP?vz<̫â.q$yu<[AD*x|mJ@[s_mXeCh+։pl\J*.dF /"h.*E煹n^LWVrPg,z\iIsFR1 a5 ͝,C~aއiNi:st'*7=-W 8⟈ϥ% %=oiZn Z[;bYT5#bz0;`q9 +_aq{ &]F o 1 �uDڷ9oɿ\ej aT+#�w77J?\`߷ 4>�-twx\%?NU0?m36)"x�:ݞ_eFPΗq^ 9 yɬm0fX#Nn桸XeJfv͚y[qb~bc[>KRo3W9/~vS&Z(#ZkmLʚLd5(e&"*-[tJ B&V(#P8#%c9ŸT`!t 2٣)h`r퀞RKULМ Se!B‰76g.¬huY?6k͠!|$G{ sd<g)%H3)WfQkͭZwv+E׾b˩c?F\d弭e)1qk,YRdaD4P"% c4rh`OZTNg<Y!ozҥVh 17}zίYSVLmYU+ΗZM9kT]AN=_wd+R߈%Mugί+z͓`p Yu1L ˜9+0唻gz$M:<$,qd4m2ImsF„|Qc/#YX7w l*Ux٫4^ HwϺp0h|`͉U9` Ahj>8Vby7Hs/!I}r� i}�]�Lo6[ፒ*Z&`=V peBw+LoN2?i}t9,8~H !0xR&- ,cpiBpWַ(N׿(v5~=zrNyYC`k-W%T9#t/rqZl?[?[\O}Yx۔%uvU u욓vE]piIMĜUf,IEa*E$ǙR9n '!SR~xȅFr!"9cc,-P! sԳ,f>-:V!TE3:%3Fυ/ ժq&#ɜrdC3ɚm%8Z wdD mV.C2ԴJ%$1'! ¨zL"JY,?ܣ<_ni]?ښFסaƻ^Ţ7MV\'> FdjfE9ٿj?�SWBeҝZ>UEt8'cls1e 87*0.l܍/8=M$O /2;}VuUZ.(6曪TvEŴ1ly5jN/)fZj)RY.6ĺ2SSe"R1u X1-LuҊ%Sʼ0d^Hx;zi/\Kg/^,kVEX؍KX^ln3W-/n`G;¸vG3@4@hT * -F:?#+g5 _LC|_n꫇2vd>kÀ~Έpa3(H ? 409 O=V~>�Խٲ%Gv|v w (�,V"MU_d2/K2XTȼy3g>n2DU)){h\)H/< N1�*zp5mO|f{F/zoõxR].[J}l4g:^}=GY-_j#U'w<Ӹ{'5=aeoR\#) r}FM(;*,`l5Z&EafTg%N\)}v_'j ^7u9/n/ѐ%% Q| B-LV]KΕTS:8f%rV"(%%ͲvE5S>M֞3)+2JBL0LRf:FoC Vj#e-xŪѹtE٥]=)쟍ȅHHkE6]l[nKac <PDjZRճ^u9R2Qxie?(%SެO}NbQ\:Vynlݣ.h &6G 52߭֋"~jJ*QB1!Z^Y̫SnjyJ�sI8\j3{sYg*t_5[uRbJd➣LRHļ(!(EUW~瑃81^yØHWƭD5++$d,\)qw¶L3v~$x8cX+۲ /K fW m\650w3t뛮_g4{f"N?!~ ;#�qfub)3WVV7S #D>>2H=aa̼+:okwr |ihG)o! koo`G-TKd ~xwx]o "DnN=*ƥy1iJIggv\ߜe`ʏyng0j+ 3eo.ό ֻ̲mZS֜-Ӯof4_^%&Em] a(ik嵖eQ X璃#%ӑB&o ;)Ke"! L4y`A:i6rJ%USu4,sL༑rQNVfKS%ΓPRUL㜎asM>i7}uZٚFUTNP񬑂*o^k˜p~9Z/|B'N$^?=^[R;P쳁]N9CjOoL[m+heۥ_=eD/k<莂86pGeM(*f\2TM\ߋwoSYEK0#'"o5=lEKiU%�Eu_beHW7΋ZT ClejbE}1G ID LE[:k5mY)j~JsDQ ZZ$>9̏8p7E?&mq=/KN!2:X;ʺ-7e8:zvwW깹EG5Tt c&WϾE-R�οx=ң�� �IDAT3 {!A˧Xo>xC �|XFjFF9TO0\axO] axY$Qq`w&sn ߳t?H6k.Mlv'gF̱h//p?ߕ:N"~_Hޑߺ~j<__twM͂+W&Ņbb1(l@Sy͈p%]sJT&j&dg"m![WPj%N$%$r -Yʅ#M:5>ۜRr4VޖSS[FI j Dfʞ?)8܍'~?vύ\s͊9RaǼ[똱n5>>#LXEQ4e?gvۑ YҲh1XD伝XɆI[a3k۩r[ur4ur"H\kB!)9:['ک?d>[B2b}+,:߭j#uRKgCg/F?ff^G?>rf>M+'\ɨh7}BطHl\$"_8(n7,)Q3/6F朄jd#(PѩDA$e&]xHL#E NFzKc"ApyjJT'caSq.fc/00/{4vTc7Q)UUʵDl1ŗ'x<7g{u'oαw ' 2CF=) ?g}`_CH`d#>!X`zl /+O=�rч|c{� h}Ⲁ V7#]ry]<oc!E> Y!o>L.wks> -ⳓ|vpNnT ؝nnOQN="I-2W:YM'6q`i?.ܗ1jbюgQ.ì<pUs9$2j*%Y%*$vA3LZʑ_&JBRLIUVTɭ'efns>ґtml ʣRT`۵]Sr㔊�R!suyƱq9]GHq* ׏iJx*`ꈒΰs'K&k|mֈ)7"ysr3iZr2yX&fn:<T4JJyV<hx][ݏ-9U{5y5ĉ SC~˽#+BEbI<OJ¿޿Ƨ)L.ܗcι{)(eORDL#5_l1<jwNR)9.;d>0f.i! ϒͨ!}1 k e)9 +<1GBj%WF5= ,fيFYԝX|FŸQQ W<gQc?~GX-vkğc>]99N# 2-Wpw8Fo"*Ph\MlCVmZA)R}WLJ O; n?@7G$E<f XNopq4oӅz%8t젏oOV~c`_M=2zwhE;Չწae\AfYm3{$?_5$ohN xC&ߢeQ?L՞)"ADC=W㖕SXͺ*+[+U%#a,k)DRJ"  K"T#êUDZkf9TPQ*\Y qZXN@YjK%)m;pq3YfYvLtH^qaVݔ(aJ>9~mC&֞ե5- Q`JS&~hE`R P]Jk:Zz3i("+f\=<IŬ !F[ Y20-5l00eYdSb/nӻ5?Rh *F$E~79\Y۵b/ujDNx̌jYS5_(k74 ؝28['\aa8-i4r=Nq\Br/Jbe&? ׀+%H&hjxCDyꀾrH.EƪP!M8*)á0? Y$V[CB K>)4r m !wxw`z$Ny@:l}6nV@W>AđLcMGaw擺U㾴X@/1 o7 �Uo|41;ޤ�Gپ!0N0㟕'8PkZ|?.o?ym`Lqh_q +`bW"o#;WJ }')Px\1ݬL?G ~{6sX^Lkvg˃oHM0b qF@ޅsG]%~¡/6\1-_ke:T99Nee3jTʵڝu$!'#H %xLT%ԬVP4ʸb 1TC݇=UÅTXp c}tHNqYQHD"W>CEjjj5[F!'_x<j|nآV]aPz8Ώ/RjպKn`e>DS &�/T'APX %) 6O)9G@N1D^g";)8niE$rR:&v8fg?C>t7Vѫ>o8&6}B42*xD˸;#>:UNdcܗ&/j (ƞ&I Lv,Cr\YaK[ foS-NCfʈLәQ�v ƨa.ҪnlasR*pbYrTƲ1cRRyXCfFJHSL݋$%UN8M+ɥRCqE}ag#obg=ϰP0gZ2|aPΐ,UjM˾^TXi9! /QޫQ>b#8 '?U9o5Q^*#A΀# @lڀ9]_D.=޲V߻COU$G-7Lpɰ0SɆm=iL6am?BMg]UeRAvx#^2~ܹrBe(*s*߳8L r,HzrPb\9ZDeHq ߘƝZ� )Lhd.x�(T)*P ey&8ZHr@ !92qsVyD6H6q +( HFZ&3GPNqc YM\"o OiYN6>I EU XӖvD!�27)Y̵IF}4<F=2KPzeD`V!Va#*:WO{5mHvݸ ۻoHdV\e}sRk'YQh85lȇz;PUETS p+;]A㹫7~u⑭tSȽCפd#g ujGQ :-C89XpQ˛R(Ң EhXGa{j.MrT+BsDHF釚lTxM$C-&K3QAPr3ԠsMIg&P<m(1uBm䃉3e7bxJ¿U܀^܍#ɗhǵ|pT67o}nU)%D=UTpKLNvXla,߳(`uu@տhUc?(Ǐڟw?_RT񯡻_C͐9zNs_o 48$ + +`ۂ x�)Ɵ Vg {mxrCiv]:0~ \\,y5hOD|VJTNLVԋf:''ύI{VK  ]<%0j޳YTq][o/(T2,kΓ[Z9) x YP$+B \3"Ea"9eΫ)<O!^4|-Tl w ۺV "?\4s\XnyV%Pܲݎ0 sQ!ivS+?Ӣq1-[öUk.}*>wS;*nH^d%%8rM+ݞ8(O"eaE-mݢȔ| YwuXk%Ӱo_|6>qWp?˥֦9Dzch+̫頊_ȥC#1}S-Uʓh'V"FQ,4Ӿg tk뜍q ˊ9ckea 7FZC9H59ex2| :Ir8yZeJ'5+]:2~Hz, Ejby"?g%L$dʖT%Ê 5I-̼bNZz#i6sx2\S?hr_y qpX4u-,YE=2ny1  /yIai'8/,J} 4%] L;Ynms^aۅc,f3h3D fh5b|YƼx�0O'*}l ӵm~BݍW1Q5,2!Op\NV�_kLlS42sҞ}juzL>tmp.x!@elZk]"̈jx)іUXE^{kEHㄾ2gg̴LʉP r"H$*bE$s AR "U**'-KUC L34x=h+$PjQ:ϼxPP\3,f];ԹLPRU,z/,Ďqy$չRb[Vl w+Kˎ5 PD!4JhDiRMȄ&hYT\ym^u4΋t &j!8mn?suKײl..K9[)܅}cq&jYc#W| 6&{P�#O2JwBL%狩w^ObIЖ<G~ZgT|s!! Kjt^1S5%9Bτ$B@y<ayvQ,yxj$CnQW2mPNt|2ITtnJPU@B4)Q!\U+KPYECmH6y3lùLJ. Wϙ(g1V%za�`KbW#.6Usj2=cg`<x?"Et@[[fNPދLW?pw;ˈǭ6H}h]'oAfܱ?_l =1{t#~`,U~qx3䭖_E|/�0Yh#l^>"p0c7e_ krQS> gGIxS|N,E()ُ^חVXu^SQ qE)VkC b'_ri~۴~ZZu{ÔJYPD#+Z\!tI)IY(0V⊠3rʝJxRQ-ytT8۩j,)\Q5d /5E`f^ts)l,3W/f=waѭvZJQ f5i׶p!IrY/v ;&eF0F:-ܚ(Ǟ]^:l2w<TX˜Sl͗7_զz: rT ti(G&brKX uJEJkXwwd~5,6\ۭ*Z<~5;.*]#v9eQK22Ƅ%pG0tZL!#�)RLAY1~ ,m6Ѻ[͵4 ҥj{NrcrR Vc1"T6B%YuLr͹.ƨqJ/)XG.NX1N/}9ݴ\ ]abl9ݶJ N.L7qGեl.صێ[/P?Dב|J #[#x@=hH@bp] �(bW!:Bq*Ap(o[?~}g Ngb?]B}w﫿' (�7%{ĈoqU4�{;_xn6_bӴX�7X>\=nT9\P8P;1ٍaedy:`啿}ӉJZ)ONBv'A.Q>D9AԵZy{RAh]ms d!SHI)*JB)YRaLT+YƝP-+XaR`9fdoVHܰV9L"qōn{״JYJ'ŹlL_5ܡVQAYS!93PN((T"K^0:6>T~FI \:($ƅ{8zjC1Y0r:Q OsHKS9zM JR-Bϳf /5#)U]g|3cf3 ^F]35K/Ϸ-B"3em :/ĸ<ylvpjbzHR=h]Rzv=:P1z,/k(M.l\+96!e^V$#)"MfWdp Ss&ޙ \T2D*' Z&6BJ!* $J*=K%&fb,MjSIYTqWO W2ЖHꕌ,EoRN{{.SbM~xpf4Bg^Ĵ}t"ǯk7< ow1hh-NwI2)$Te.:BQ�v ?O?f+%Xr֏ѳқw sF�ﱞ&%kq~I)֯<NoUz`|8UQ5 :^kEֱ<^WbRrWe67; Π cS })_U꓌jKlCBS nek:-eY\t9`x",< 3RFXřURYQRdQ,$2<O5$Gw9*eTL&t n Rp Z+%AT WEc 8R:E[y A!)nÉ۬`Vr.Y)bPv\ͩ\}鳴~hK7)ZFM)QCh:]vfŘ* KUx3q+Y0Tg+5|(yeIڳht^:PE9s- ?U"^YH(3Qw>`~i<߄_k~rv%/cmOt/7 6)T_:ϧȪق=J`R~"1 uj-Ejw2O8k(lEmZDžL4QٛnQQI5ι9ǁirzn-$@Yn1J&`!n&|#?}. ̂wϱ9 nW ~e~[ow\DSwOdtTa7Ox"7[,kп/D!€e�� �IDATJ!=G88ky>"8]@4o{`>,شXӷRz^J_ڿOP^#>[ez jXFı~b�-k6l7H}'KD@w1٥ϊ&܈ΤiFJ'@lM*qcc?s]f0rZ3Wj 'AJnCxpJwHy:4mZNe"l.H@F*g7F"7VN%W⑈ .LJ@#Ȝ«`$P(|%▓3bӒ3 - 1(Ӯx_1W!j-R\G"x99d8VFxP!y7YC41ȜuRdBie?ZL9WemQ*dx<!̾ It|_tQB%`Q#ɝ0m6-oB%~8Z9 ]ЭcNUoXt}7]j'exS e5l-3bDNkG;!NB st6/B(,Sa.O"SOn~6ībSWE11󇹫:8N!:i `!q/է()rb9P ϸ[3w3nGjdOy|Aksaƞ7Z'Z\z:v5iln16 9Bl^%/W YMt;~%`lO//+~< 8B5%5 G!Г0ߴ2F)~F<op [|Di ܔQr𻰇ߥG?Eo|3X+w؋7LU4~+UݔbF~gSa'UڟPJpWI֑l^|qwҭ9RP lLg&ʟ=U%y6S0DjZD#7\h9iUb|̩ؑYbuZXj%ɚxeJQkLQf*r'b;Wc* f)195{09\ҰE(P BOI41L%S!~|lP7TRm ~QY8LёÞ!~48&}5T6rEe)\W/cD)% p,/pk`<Y&G%,~f :msviz%pW1^L"BqFTwǰ"+oUɼQRUl &ux՜7ԥQgL__.OvսLMU&K;u#t,N[JazM~gNEVΣ^wZ|q"<ŠekW'x*Ƨ=54e>ڈ*Df ٞsHpL0|uSdU}fDoOԹ#ީ8U2PvRZX<}0vU6Wg/,6 p!(gOmܞ�GMx/^٧dp gԇa8Gl_exr?}<y{nmxK-)ճG߇!B p-^F3hejxXmt4YM8YBA/[SͰ <E=`bMO;nW2.lm2YpFm<YABF/8$^ߙCP]趿p JRT, pB-12\Y.sτL2X K<3)YPUc5H 0V@}RG;.tYSY *IAYYx/wf�ɂiTeYR3l E2Et"l4JWz\ܞAVfY֢h?=$&|6Td`;Mt6Ol()i$rN4帍<Cxy*>'<!FeZplsߴZԖ2,xuv̟CGR{4KWbjLQf+7sAqC30*2󉐮\dfUfj iD/{_};w \O j>|Hg+|"ۏtGf$O!%߿i>ٻdosL2Fyn0b}?&FƘAv?IL$DmWT|<'#8OqxZJKyza[xW>.oZbRY vʜLBML,I2j]) œiے}C^>qe^'=OӖdبC/DbH{úlEQSINj"Ku4a^n8Z &DjαR-&. X_9lzJ?E|Og} +=W%S3cX.PN�ߡo(`MB��J4.g _:#ef=>/uM56?_p ՝  v kuցe9N(y,Ϝ,Di 5SVQY {^tF߲x ]>"BPKbX'dh+ɄE*,U-\b>3IQ! y¡pFh(a5zd*dɲHAeAJdg&9jHV\R(ue ~IFiu4R‰6VҚaVL5O+Z#M9}BSHɻcdKж!Asjy")1Z_ڶLstӺx;/]qr%W k^N`gu峢 ~I O).˩YL|GC=RǞ>lj~kHZ 0G_V٧ _RB\F&J>DLNW_Լ?(MhXih{Ϋ¸.yCVsYrAvRZRyO6@"HH-%Ӽ(_̡ʜ ]6q2tEzn:M/20nb/ߵo-k, 7d|ڌ8E)-5Өzo;q_AwSbxc\,n ap^56#k�|=]q?|;NCbx# ?2 {7߾\-�kF"wr/�gP-|{L`<WOn`nFƂ!p L R+'X)rl%Ҋfj>AJ3W5;z7NiN<f.WÎB,nbP6< 4 WӬ #4"F^SN" "0I-9FW|TT2fJ 0F='pɅfRRZ*)xGLhldG˜Ȥ.y&SPiJdNTi]ZYf¸I.UPU(bI%IT]5uNDWQ\IJscN,Dʑr ?=%b2tfiˎRyqʨX]DʜCXWKWTFǘWTR?Tf/ɡo~&nMr5 rhOy:gŴdVXahbs]ܖVI1t($kQBO}}$F& m\IY8e1q.EwVh*"B(C{5G/TY-%Ĩ!ٔ)fѓpӁMI%f&!iz6?Nnr乣5P`jOh֑4xTWTnu6-Ny=wqH+3hr󌰓8(')(`,(_1jz= dWCTom<sWLz<+ʾ+(w2` 7N@SH__ Iu*noRc ӹE^f2Lo=7ut|9Fi{Qm06>/R mdn5_hJH./U HI*X,j\zȇ16j|gbKNX5הDc 20.O&)%lff)4#bJzFHu,R5mVQPJ+aPIr3J!T-DpDH>R%Ii*$&ʦRcFI9$Z4jk.+&T44M|fi4*Ĝ#׺,#a\T&'S5SAe.ydad#N)>L4qAiHǹ~\\27t2n.:7$B,т]b˾/yOb`#ܰBuơIhDdK>+qvlRV 1ХSiI.M5>W7ŰŽ~^RdZ+N{9ӗo?P[T9YfReg&Lz>a- G3fzޖc׎}iuȦb&m@fWCVLIݩXrY<GQO:sIc4rJit`%!cvɥcBE<*('rpsбUzPyhiK,*)!psӜ^ˁ.!ljwSɡ/@QT Ǫ'-_ѭ=_C� k%3LK%/ +Qqo!߱ ߟ9D?Mmkl4`4'j@}O߼5Ghz{-!~Aν+〇3_ %4(|7w`%e-'%UKgA>Ly)gwVE7 +Cb|YL9Vb%˲fN!7fٴ%qlr% %%[Qȩ=38xF׭***SvOfOVK!h)C(*ERJy>hBJ0^.(2I K,щ&Y ΰH%N. &dR[JZ*4%6.(d6p *,g֐3U:2JXX*aG#ce hQQ\R1NOJϙLN7N{^xvQc$SB[ YO꾵KM%Mb<4L!ʼn뉨]a?>-egz]b8Ii_X^ԗLSf{ć4/|l ?TWVFEeeZ>2$J߭s.>#)&i?:( - ->!A'I~|JPM 1(1E? _dMrnb,d @Iq}'4÷ul uƎL/DŽt&rS2OQtįDoG6"{&M~=л?Z,OS qA``_! B-Hvhj!O*p3'+0?�΀ i5!S ?b(]nj|ſs0(ς ,:ve_56+%os0*ۿ6%}jB)ֺFK{ *Tg#9d2DR+~湋>'Q0P a(%Duq< ^ȅ5e T|.8 YH"mB3(A.!:ƔGzBfT,b1  %HE) "F+:VBhSfi@m:"xTj%⊵^*BJIb : ,!r ½NKZX%c8<!<x9t`M$jRbNSr4%CLK"92Pfjj_rCreRWQR@D *بއ}Ҳ?1Xy^y׹>d﷏gLa_Fc+aIcQx)?ؤy N6j;2\sSLy o\RɟBꦸ7TGO6;<V٩h8? o `3+IxOۋ6.KbL e燠] $jsҳ~"#KKQ\ZHLD:&Rg):2yGkVʋ Y|>SIkr_l-2 3 {r3;\ 72-Zz ǩG0Fp%cJ&"~/H3n�dUxlF W=?x?.YgZ7`bo%WĆ5k5p_}hkCƎ?'!op+-&3#'쀍֢muB9.^ݠϿvy _BmW* y!WfCj .cIl㞍4M4T0*͔DP<l\G_fzeV aA9N8αܖ$R"M$CEÕ d8q,^@dU P`D RSE%$B\Ō{{&Yr08Tu$UtXi̺F!_Ǿ9Q!5TL zi8lzN+S\VJ5\CX#!U I7S͸⡔PscrcBO/,Kc].WidRSDʎُ>Mcu3 bqىؘa:ohʩA5Fxb)*0"<d{[tlnrMWti=#wލtde[ӳJ#.{K5$$[%͕dK)dgt?C5+jVj6r=qa0 IBK <SjLs:8B*g)['=^Zͺ bi2ڇ#I__6qN3<kW" ӚOg8Ǣr^|[uy/G*U 4BL5Dd<aIp~�c`!G`u5ph ܰB^oj?|?Amoc5gw}g X^b/'jVa$Xo<ԫX(62טp;NxƕOj0v pTˏhiͼ bWtњDUTJZQz&tG̋Zh|⃵" ]xrla9S0U,e$$R8gO>i} t&d 3q,I27*犱@iEMԇlS&TZi) ջhCI ؚ3I9Z"\)I .L`tWju .\"}'Y{Y_#C<`$fSzK+8"Q<R?DXR\&iLsZH([:zINi{inJu윟C)2yȔ4ph$ 6 m5jzo֜OgC?lJZd[k_^%c-%nKq Krb'ot҉Y/橏to %O7uc U?'B ]+Ma:+w(*_QN aҕ�O1aAU=.$xbm%gY-K.(-Q̾S3~t8@١"v)S5ūO ]6Æ+sEN- ?m� (5 D"P([z'wq\A,y�{+%A 0 q| `𭀹憌oOVz�moc_$SL{e�fx�� �IDAT+RD1}k$|s$Z3 Q^&^̅( ?[)k^ uR }Y̶Hʖ\Uv$!"Z 6Α1R#Jup14B#eRvmɣ7s,rv5nO{_O}}q44, ĕ@C959>ˉ"q!2!3-Ul- ҩ\[\]#w<ڔxZ1gN)]y4qIU[tSo~w"2/Ĕ j tjSpSp{>6L .LURs35.4L'KLY+bdӖR.s~ū hnqT{/Zf܁"=m۶ ULh:n9>>}g -a&w;wX˟^a݃3'mT\6C>]i?4iٗ^5 [u"j@XWgHwKʘI*LjЗxR1*}G\2i}:YѩbNItDr'|D9 ³LȈD=qXi!S.>iw{o<zȏb:Uk4Y2Y_Hˊi $q ce"79JQ ܢ/8#NAX'oqf)p-�i$OnK<ƛBn5_Gsz<ƻW_~=e_~#E~2u6^?#F3a (`_evr1&Ǯ%Nu鍬mSY:=e'^!9X huiy?C+3@ yNf'\z!\e-VH }y{vaIܚ ࣶhH!HeBi$6P%L2Ҝirob.B11)֙BUX A$\ <R TwvV5  r(UƩ&4.狥> 2Rzb"I$S}'5W1>vXˠm&VUUTwTf|OC![Kq>OΧ6bH/ Zu4J"E y(b[""[Nw&̈́epJ Ը\dg={,Fqvq:7xav|DxOVc'%3 b"Pgrg[A0MczslRBC(/"ښ+QE9ƅgk<B5T#yWcgpY1L}#Ug˳lQ !rH_ziFw}}c"|bS~|WH0V tO0!i0u bt.(}¯0"ʚǦ+ǚ:@P-Nap� o2Fb !hh~%c .߷Gz*?Xin 9~d(_3^~͉7Fy{` Td~/AukU"}ߴϣ cwa}\9]FE5C>;¾D#Z2/+n;cZ7GK e&j9%N.:_ђU|f52 ĘW,՚gg gΦEhÈbĂA@YQLW)k"$p$R+G #ʯHKlLjV#dbH>& $+TύVTN^+XḰ1H$@BMY% _0, H7=|%7{JI "༵J-ݼ/cVuU% fJJQα'!~$CJIbun5p'.OciB\cs0E?7Z_Q?ZP%p-evܵIJleq`ny4sI;*<գV@ֆ5I)/h\ҫT8#M/Wמ0mM;4BN^P_OV�]"˧K?OuwnRJeIu>U 5-ߎSLӈx;rhf:S%y|=lA)tu%BJ76%ڀǒ6ɏl=o/.ʽ{TC TO̵}5 � ķ#)_|FdwՎ>D�~7?v� \/ }�@k6IU#: ړ6tvѴb<g)հ`4Oc1wت< 0 ő&Id}xymOydJVW$i)̻̆_r)}@#+:>T<Ĥ$Ts -Iųm- >kP+ %I TS@"0)'Sduќx<�QÔilLԑ*IڧsJB%e֕ٔ\ݜtgBH%HIc?i.N:3 DB/"u.3.8f]$H]%y.Ydt^zO]rT t,JjAbh_E;Dd)<þ^ciəyg¡<_ݿ=^G,6h[b+>.vK#v%&?dTJmeHEUaγp"s7."-R霈+%v4W⛏BSNkOe;O-*U0I-T[>e#ˡ2;hb$#Z~-D-.L͜6b^i)϶TK @eW!<K~ri9̼_wl?2l./<ӄ6Xf/yFvS׃rҖlWE7E8CSDH9Un+@}sS0(PKt@A^^u1;@�fa_8@5 ֘ oJ~0=uOHۀ ^-@d ˌuX`P:p%^Q`$aD x戅G*Ǯܷ\؃-c}nB0/ N|xӝ:G}1ag.xOoýL_~?e!Yx2!gVaME%B:PS%,*nfT5yV@ٔRisbGU޳Zm(R5H4EjM#zZ Y Z%QkɉR{]MdǕ \zhk9`ag9XHzWbKge.۶5�{ )gIucy-t)</Y Z I LfPbitSYI4Jj?<�Oms#S %M|aN& {[UmTy">#Ŋ?tAK+>_͇_QU@]?uSVwCsocme55S62.u]MLmj֓_qʐԝW(.QLE!'dޛ #;~_ۋ9<#6joX*GYBj]KE8\ !{ȗ{󬇨7ky PͅvO{Kz#dQ85Dr3NcD6BXF}ع>0t 'j{kt!00-?(� �/${K |=n(M(7~X�Wnno_=w+9Wr_W @r3�8\kz4tF<<�"C[!Q䮣TD>dE ]Y/ nڱqg.ޜ~)A'"+ƹ0l@O@%J^TsVsjahX}rq]a:)*ӎmu䔨syX ]+4WF, ղhF'dc-L>"r%Ř2 qOTiE+H ƪTr Yd EYkMci$͡Lø Þ))u%LvsH*Qw4=?].V8B%Tl' \ y7(g!8THEQkʆ'U ѕ~@%VV4чq€t٦*"}GB 劚0RDe]SWK6g]N?lN1 #wUUSFԾ0rm= ydhf^$P}Mϔ%<,t:ǐzﻼbL+ZRYW[FkgnGYo '8ml_Re,iy5gBB##2R7gzzxG}-_'9NjLx6[~WtU<&#aC|̷ %f>zUڒ/؊}QigMQoQGPu`X�b 7@/Q 6}\wk` з?ջM?jw>co?J o9fMK)o^;,9 <#A| c/~A}=<y۟Jj�#׬yanލ;9\^u+³OŎh#,l] EB&#=F~۲Ysb=!'4?l3d<v`|Ech+Z4mVZ^J RT1i6sZ/iHY B3i$U¨'q$3M  h箉#D+e)&r+8v;O &j%F ] UWYbbzNF& E2~|!:GfPY#gC125*WJCS-oU#h^M'_I2A}CqyE&(Q&3lQO8yCt6M">Ң)>|Xa0-oj}ٺV{B=$G4I:vԲK٬˗Yܳ893 lyΎ L6#3mS8VG&nSJC "-ęGg$Ugc3\DZ"Y2 :UrOĴͪQZ5sNP6P!;Q Ը6F~ү A~:w1c]~/ChH65SϏϬާzAv_�־$}N?!ghS$F_pGzf6 y/C&8>Ov*VM~ ͟~h1+~X*zR!y#bg@ }tX\�9s. -�xs&v/<ﺼx׏; Dm~Y5AҖ㪯gdPx9?< Ṯ]'.?SX#UDorśW+߫)LG(2NUkж-9Ʀh"qݭm*%[k2UFJd A'0e"s, BKQb:IUR`/I0bD6 PS5X6z~"rG9PGcK1ףmmrYQH9 Ω`5+T8VX5$mr8#Bz$#”ܜk .]-*4ZDr[w[Jf%IUS y+e(ta%h:?#3wo$ǕfkH.vL-d_L&3IORLUMW $kwzH$ Xu2<<"#;9yvk)ez=: c;M%_uiAr[FTF3Ecʄ:WU.LMW%ftQ4eAi'[^%͔-Ѡ+S!^S!?Ųd/Gņ/rB7&.qv􇑴:%ݵ U<+ R~˾% twY'/ f 4սץoA7 KpHNP ,:;TX<2c9bw2z`�՝ͻƖHx~V'�:[`}~}N܄=v�K`.RΫ#jSd"SM~&#wC?d)?/HeK, 0z2R |% m#~;+V<< GYz 0;e?1G41 Q4-w#cQ&W@F`0ԝyV'Y{ƒRdezI�K'\AI.sP^(O$%\ B 4|`@RDDtpM ICkJ*`^?UHAG/RN<L$'h&AT>v:<cD1TqJh-j{-c6ΡH`F-} .cj͛ۡ2-mF6$(h %'R7tshY~"Mz9ZJX*'8(E'!{5?)Np| %CHVܲ愔{JdGHGfqǹ^FK0F4C20`"Fv4j)WӜ$PDYWY:0Ѷw!\uuh6dO!w~! NIJŷ<-Wߡ P!K*K{N @ZЯc _B� !)N!VUv=`. `itV&Ɇwa 0�=n_*cJ~4sw �usk ~3̻&o@PlSsX4v rbǞUn~tow}⛿I4dlWmA%9/k`Np4IkۨT#metZO%/?X3$<#Y "�%0RCؘG$߇!g1dΫwC&&cIV@IP�*l$a9$K$rnI<Sp qF AI3°groT`%yBiHdi%m5y=U ks %EM|0T>H><7P҆DF U$.w}N4qȾؿ.gҡ^pn0E/V;y.\[F٧2?.y[-}Lp: K*u]35xՊ6FCle0i:&Osi*oxٲ4UsBz"<=RE}Z5 ҴV9Y"0M Ls`XΪHNBWlB*M"[LZߏMk|}iϳG>|ȯ* I͋tbؿn]ZXH)3X)eiɛ`d^> 8`z?Jc@d"_q(`͗(-d,FAOkێ�{sN�(B;#&R`+5O77?'0B2ox.Gn #н1lrkO ʂe:$}bpneYtv2КŸvq<S&4F3]k)VFqH{6kiRdCD*WDק} )l9^/m+[B2Opt!c,&1yl6EƣW.0#Ǚ1%K9�� �IDAT*QC" ^xypa0s䣒*zbvMMY 7)#̳Lq~L>1 ?Nч&29y{Z3?PM33it,M/Rsv; vO\ XFy/L)J)O0Nا<\d$;=Bۇ^wzݤư]R]HfH9ojW$Y̘fM g^T�ϒaU(=fqGW))K(b/tc5 r縤dHNjt>[ձKB)! Ӳ<fQ% ^I awL"*A32;JXpbX>Z.KF{oD0)-LOR1ūQ0a<|gш_Tڸn^mL.S_6=`{+!6̭|?d/plC&BuԈ GK-s=zP6`p{LGحk¿U*p0yH ?SʷoZg^W"jfCᭋuD0Zdo'K~ğJ<g| ޾(sx,:TvcOe?9 ljlC 9tݫӮt_c sڕ.'IZe*c(])y%϶:W|JXc҆]{ov�Mj{p%ݗF.#lF\;L<2@&bndc e8\*S$ ΘbZ3d\,Ds *0D&3Ou;9~@?u; 4upaP_2e6doB#bd0EJE{KcgǢ*h;7SIpva]j"&Fl4qHs˜rΫ:g'FqOKJ>JE$PunYjv;9.ǧM5vE92Kbn3eOxw@kYld!R*Qy%a3^#!+Yt<MsNLj6ID}K qRaN67i<FKTi*|7[>w7d^(a[7((sW7Yg}p30qtێ<bapu$>A ޯGFss$9{j*rJpz(Dg9H\d-K;N ϸCPA #邺݌E ro! S �k@>Z$Za'?BfR;EaAmGh>C/,p'!wrCd@ @>jASӍdBؔ~_fnV'xQ惎hk~?߽ۗP 9ը ^~*p4:ćGqNRU)¦J%KM$^CT"M?;j E(N2Hq: ϲ=/Ug\BdNi޺B2ҨJi 4kdi xq9+aH2yfbag-#KH9BeR%*ɛQId_'wZ|'HH -x3K^N$y3+=WnNՁ\=d̔e4ʥv/+B22G+Sz8tgScFjΓU/TS=T`5$bX|.P4{N.kqS|�r 407Dy]ic=j?W2fe͊DٺT:<)/G{)hyy ƃ"NA>)px-(Ҳ:5tFdrG<qCpl :3ƨ#0tx5jڳOX"˥#K::)b1ξV@g*RZFe]ÍE:Ly{5l�3-l!J;|>A+DTn<F pWyp >`4~O [v XXģuӀGĠkH}.a W�v$'M?Z+ ?(v*9n(z<|ckxs3`�?eQ٠vcgx�Џ%Rp!zg p ~G,XU^fme_g-YU>g(eMJZ,.DPHd a?raN"@HD&V&iYPUfND-<arb8#SIeP2q)Sq"12I,%kUn˪(UWxŲ ҖDƑ2K, ϣ֘F:d,!.%j1aj\\ *&߶Զ+jV1_Գe6`|e7=ŢS[ժ\mt,?4u92O6{E,7`ӑNyPn4NDެbʔikdް`XIF͢oofǜR"25<D^.؋Ozb&v2;ĴJ3XRY5ᴳs/hPKMfD][QȤ)aG.kKQƐYn\&IJ"Y2z7c7uþHeuGAE'YZ7ձuײ՗|"BԖgB&~_wׇl=Cul,3�>3؏x-f(~F200?1`^̈́z3eo&^{c="A>t.�osے|1ƽ3e1]Y�ݟ; -A_O ؿes<ȁmCR?u=~?&#Z>50Zin9#=γܴ˛nV[6e7ٹ[k;>j)e9؏R]*mFvlF_~`eLO(_ƿ*)Yc)G3R+O)G~7YQ=VzfPU1i>щ,Di4CƇHB%1<Ь̳eeVDA@2 D6 g88 &htl88ȴ!ДԎ`BqJllQ$Qh<D@'mbDU ]5V|0GYr)'gOXD׹yq]MP0Ol{Y.,)R9Kk=<rnkwor_ 8o=kΎXVg 1oF:z8/EX墕s<j&GyMל"E塒`sy63^@d0ixԻ0jX iEQZZ|6wm[>I˳%jYq(rapSq) y!"A-'\n-$& F gik lhUBYֿf/r ;}>_[]0%ޗɳ0<CX �ZP3�r' AAjWf�>06#oQ8o )T=s]C0OP^b_8=hz߳W7TlYhz}�6 $Գ:)<;IRf0u0tᳵ㓿#<7V)QcO:,D䐩(>#S[Ła oXL(\[yr_ԫ*gpZir lc9{m[oy"HX{JnD0 4 iW& dP@((@`<<4#$ȔH=ڎL8&dxa(m 6HUԫyl_ђd4adM>u RF&iOkpu:8hC$ٜ;v뭛gƄ&RԄܧvVr)qH1~za,wo'ξLv!lΫ`Gfnk%'YD찥ghBֵ%glL~U}OIJG@5D06gV|S<#T%pN c„ 3D Ua!>oޥC(&̳iK2{CC4l*9dǹXsٙ`Țra($멪zRP Sr E>k_)Q؋ _`0}hVA>`-t�zqw|"T Ãl5P>2G X{` aɛţ 8c|n�[MY!D|f CQJ=�Fm6\'NNA88[NԶAjy[ m3 *`rkRWu+^CaG78(oiV![s:I9Ž,Ono;ة `V)8l\cu uEM)qcMt[\CRN 3[%V)%*!7trRrejpJҞ }:&L&S8$!#gDD=k}Ɋ4 q>avco.Lљ D܎pXáTh%y]#^XVtyԷ.=ӈ3I$WqDbȿ*+z|asT,ʋĬuw}7Uݬ;$3+֛nkmbmĠ0[zjGqOo5 sC:%ޤɍMQoŠ-mZaDr-2:.κrhwu˘L#JN E,%2pOY9< tH8^ғPIn"tkswh;qLS&Y^EskfJ_.E_+ vц-/ŶRFKZ4LT4N<^?&' M=0#ۭ +$([[V3_eafV;XmFvx3 On1Nr8:b �):(K ~}<.O~So^o%5p!#KI84t9lʀ!Phs`N( DkBqWm /V[u4kJ!YzVM~#GZ.a5O-+I$0iJW_"!㉖r$Zsꜜqedi7ލ ngdddRQϬaJLx'h[1w;I@\^M bt3aYL>X?y:#9{g{Yw~\SXbQ!ҨM^ڴ$Ў&bed$X|Č_{gGH%%[zȹq*WFBh4vvag7㢾܈ .|~DhuAHEF? ߨ-9șq2\/*bk/t`_p<O2z^UF7wCj{OH2T&NDy$# Y;QDO1,W\s-čUʹȍ1_}̫r0kڂ*y2wR2uJ,v\m:S#ص &'ngdi Nb6"Igєh?(#a[ !rgUj7?&oph)TMc^O뜊do`iY?QǍ ypj> |y z}l^>ڸY?�=phEh4:GN` @|�4$"·j0i`� mFPpq/TOPf􇟕~#륇edijf{NcDiV`GGC׀y7BXu~ru\_ Cs9LC;9iuѧ_T5*fQ'H&HM~(ؗ^j1c,j\jup&v螙ҩ]ƨXe {;R=HH&YߕB]z]-A%$,h8BI.x4H6Xk-m4Q'10=xm>؂Ţr-c1L4(6- bM4Y4#EvqVD&'TykAQ*rK"OGH<9,g;2tseL[3QT.Oe 38i~ mq~~,aNQTv$M5jҊ'tqyLI>BK#13XK`M芹pwֻgR&.XDBLN=*P%@_7D.r#ˬʌu[qsݻN )eͨwYv3}XLl0qc ٽ :MdGCd馹& Q򓣬Tu;/{h6o(`ǖgirqDzm'B۲vq4Q 98}YB_v׈3&\4XlT8Vh-xPxeX,p>#8AT?ulP D5?h7Qj]g~͠$ݓh/?\)|S?zj$1X{a|Tֹ*q[egjϦ@a%;g emL1TjWV&+sNЗ.e-Y7]4YUFIwuFκdmME5B@y&F4׌ekG!#҉0JZ#Q &k8S7hO$)* VČ [.du&#/*I3JfE ‘Dp{l^x0J¾xϢbI&eʞDX5.qMrg2O"mvLF,2Pd+4ΥkSq˶]%qSQ^mdXRN3z2 d\HISθ۬ p-4/lt V̓r>. 1gRD1wm ʇ<=Q0k%0׮")xU鍵݇1m,Hbqe^WќtdJ6q(+VIj/7!+O]u9XCm,0246ޤ#qȈ]6I~$V[=868oqLνRr_@ p}^w~K^){t|sD4/R{ @g̈́3*֟ ?db^#-1 \�{"-.O]/`#_ߣ�c7xc&^92 _p{:iU.돭<L4KnMe8YHM dY`>> ԏShAPSuW=ڊ&)nzOĐVYsK+NK1yYqTI&S@7#%eSHcpђ$mq|dJ_bM~@ǣHH4Ȩ7UngŕOl"F&Ĕy+Ӝ"2;`uYBP[hwkjmbbv5 b,#э^~GHe`+CҾoԨSNzX*H?wubVrwOw1NEƷdÐ'`ETё#b`ټRwVf.BRfIvoI.,Ua,,BZl3^sU^֋"XYo YS| {Ll$s^QzƃaE�� �IDATCErvBg?'0NNnXn5<+#/{j.|yz3SI%:kOcrvw0tzfvQb),b-jN^#cd83=AlЇՒn37q?BqOG9R,йǙ5ɗ̈́7�c�L3Sxo=�0p?`Vh~)W#`o2~0P#ɿ߲( 7 Vӏij(ގO8.whdsP$Ĉű7 XLre3lg`�F@.�`~!smC]i`}U<)RE1DHږ<}ؿyT%}Wۘw,#92fZq>wòsHL:bBf.CfSVJnIO[ K5%@JAF3(wKlFAD3Ҍ1ՈEʮ֡K+2kU$Sy rnz EoLݦHE=IsG~qWYK.13C!ض7)2dϽ&qW$C wSgxECև6,.;'uE.j,us9z{yN|o,'dL(GnppĪFHs븝yh,ʍlQt+Y.&Ȃ!pRL5K;SVf[SvulxV54YNyXO ;9QBdORƱ.kGӺ _(m478B]7C~Ze䅒S(7ձ=q/Ԍ:8J?b}� 3C{ Pu?45 4a>I<@z+7?؈=pmA,S>#_ţZ?r ތTx7> (':s'<ǓtՇ,SG ~H2Vkcן` =l O LvHs?ˤsz}:_ 9R«BG ~&/3w.-g_LݜȆg)N\gaK "^tWx=HFiˍj͞lfED/KGYҷ}1r[1)S>zG*ȹvN*guYr>Poe>cämr<>UQJ,z)WF˔Oq׊'"Q6lf;Ee RƩܪF0`pR2[":zd˔MO^6Ld1 "*S.aOXL2YSr\2 C^<JkӪʭNӜ7a6fU$5kIJL$NQE B .Jc e͜[MSȺ,dI 0<>TN鞦s03 Έݽv~ӓHޫ&N&0NK?%:dz(ɴ=łRe{]tsz>j~w=ѽro:*0{[d;s00Ke?~� ]><5[>oZk \Fþaܣ{?kq:Mh?Bs9͇ o `?%]�ܝxfN\g>C{i|,pjrU�_C7hËYp?-Ŀҫд�_`9ei "?˥g3/{$.e.`xޓvaa*ɧRW(pmWTpq 6+s댿ݯ/Ŷ+OޛHreYbkF&dih0 $A߫oFtk4TR2]f&Xm>DF1L&٥�]>z0w{.Q\ 1CNKĆ\ u5/W޶#&& 4mûTldGbePY$ s)!Q# MHJnRk  T9s$q8 cK3e3MNQp4pv7ERt_S=a%b f>Ռ/fr-{Y8HƁb!z5ݗ> jSQ2ʔ=rO%3`ȭSt%1Zc62U*KNIY,za }I딑hikJwT3n v:|`}L\ȦNO]=<rJaK# dWqlZ_^Rs܈e*u~痆bJuUXMUվ׿UUI`IA`1�7AKMu0M { u {g<9 J{<� oh+:|3歳c' {Ұp?/>0J͋5;Ƈ?E+ߺ?L`@q/` TI{9lG A86OabinhKsZ"XzIqG zsl3t_U *b/oL+9XBkd` r360WHe"L'R^h ӛt_5ڀ/GDDXƞv"/%w c{ua_^اNlK‡TdN68ߺk7\1U Q/Smo#x4NԈSoznڟh1e KxfdצHUwy<QtGL~C{;籘]MG3}%d""Ꮷ1^(t eE=̅ny6SټZzgüԳ;ߎTu F±+(%头BMG=b,'яCʮ =BSgrHn  p' r5!#dWi:gcm=ƻ~Du묺< ' qUki_ZFy2P;dgYeAҼ|-oFzR DNθ4^Xea$;r[]Q F{ 7#81o6v|S,u w;'|j0`W`k{(;8п-b~0͸3Ps{qT9ß{>o�q﬑pû`~Bbx_@�Ȼ\<Q*x arğ\: x~NS-d8QdW(?h~칟% ϚazO8΁Y#&|G>֍({26a 䔓-ߏ.ۯ=5 1,NĮ9-,T` њ B3q@JTQinL q$qwM纉LXf*A6 ҺA# &tޛu8@Ι4Zjczװ-- }*|!R%JL M"(T l^1sF35y(^J1Y/n|6к}J 3%aX9ؐC"-"u[~.MO$*8D0u;hi0AR,! #"=)R:+JT*SAM!.en]ۡ?bCNw+϶ *<tGyZ'*}E˸H 4L\5ôZ 9>y+@9k vl?x!8{HN>"U|o}-v%I-t-<RiQJM& p}<Av N=o~/�M=ΎoY ԑ17ު^/Fgo.G x}#AaiV4TvD!JweUnq~pb 5!+ ']دvw&hLj$6-&QSAǑ8? 4/]™k v$7l{Yx4-S}.ʥnftOZofglAW\ix8*`EswVEEw!Gmgu3MbꎶJOKEt>1Ԭx,ŊDf\z.=X~6`'3 wag`T §UԤ9rIa[%`cאy~t&tz>d#lZFr!Wtl|u8ocK8> :Hy܏u"s+ťz1Y$d149MR YB=;ъ-OA95Ut"RV91'nNƿ'm;*DX>OL;bΤ"cgĖav v: 4&7XGdd ҌzrR 570՗yeO&EY9Rzp1lFfSeDuk7knlAizZW O:m 8;M*7doLIB貫-tg{H]!X +%/5׸*[ې[8SZaK<mɱfx,w0mIS}Gwgީ$ ?ܐlޔQݍ.GAt�\7X�Hq{m0oD`[r3ٯ3 9C%0]yr& 9Y<aHˢ>!$[3UoGl>Rrc(FI7L ueF rhy6I<KN.4Czѳ[Ϳx:%/f4f?cƑB4[g(>fe?m2_lx5x-grB }ɍjdfmLRJS=HѐH1GcwlK$VD 7:dZ.WiJ$uyؕKl)dҍNBw!!P&kl+R<[S,A7x4d2cy|y=Y<|Nl),Ô,*ɊQ>u䪧YL吉J<% |nąy `n _[/ԉr(O A ^H-,D2Hc=u]LF\ӗ'/Vdd%$15yqXQyb8d|dT^OCPÅPa#+b_co-Wf,gGYvocl z2YБ5u 90B^꫽^ |w|SX|0CvLP0&,Lcycz\�B ߮pW,EOE�-|K6|y Aw]eoKr!7A Tg{6.pn/ˢ֯oTw]{ҫ~[Ey6_F_VqHGujkGf+_nC›\3߸KxYNy.flE~U{Ϣ+qyh/`Qٌj-PWDT/}l;\HNK4-}>סAi[}5F\-DPOgJ%{SO{0g2,iN 3,ixN-%㔐\df|T& |$#M+S/tg>Q,e+FZ"42 O gCN [4ҠLV)b +/+R<M4ĐK@>IwysSdJK8煐 igSv&K?K 8lyЁlASn|2t >7/TwY΅d0$`($ +kM(qֳAhyτON"uT7ni0-Exz ϣ< J=M|u03g\2#>[>juL*βB<EۼvoJB^LSPJZ%0kA;tu�.c0�Rꗠx~/(5G\0� m�3�;@cg_{ND à? }SO e@Q`e9 =/{sbMPhu-8Gѽt5)90ʫyTKs7M<V n_4<BZs"Y̢OtjjS�:,7$]:_Rv_&y1\ڃe3UK?b rt̷ ]wq;YR1$=uΨk t5ӘvW] <֔GoW‰Hnl> t4@Nt*5IJ`KqxNډ9ϪIqë$3QK29e6~MGvJII8w2NvlVw,0't-&"r3y#$KB=:dWGcZ"~ώep=;Fy$$(5p~1?8b1oX{ gu)Җiw2%cJyt d`z'Ǟ4 Ê 1a U7݈;&%]0sglk$E^^¥lB+jugG2êLFijy]\֋+Gʪ6OFO`w~&!A8umn~1xXh F/nz|^6~:gO?^K̈́xSLȷ&i@m`K\`4ַ oZX8`$hߌﻲrCPn+Ckd#.F"ü!2$ L 2RmS> S%íd>U<3Fz9Bu~rv?;OcԻJ@6xe۔"bLVnr-/2v=v9j}.4ֲw;&w[H<>,"w1g&X݀-m^0f,x*ST \n ΅#do\ޅrĬmO~۽I}5c;6cHΏ&ZPKj/z\us^$Sh0":YV^)W$U]f5ac*LL`s֭:Zvq*Rz�Q)JG1KώGTTNcMFa2„&}HCeir։& ֏uɧb2]rldcBGe=r`#n>e%AH bNH6j\1KeQQe<D\n]f9? r$q^ϓTH2#*K@s?7ҀtؔŤ*q</hFn.~ADJpxj%zul rwfxDUc1f1m?$b ww)too ( n6}. Y}� Pe/~o3þw7QS@pF k~uw  GI 4`L�ýy=3`B|vթ۝tÚ[p%TF7#c"(9eAd7[gW+t#$x#`d: ھ(A)Cy8:Mر7qt|>9[͐]85WVT�� �IDAT$be2Szn C~fb(_@5ae߭we*)zO9)EYeEʥ�C?bvv@I6Qg(C;voGiorE(l{c\GV.g)KuR-'q%]J/r~™i6Y1Sn 9ݣnGUN7Yyv?ՓJ(;F?-lhL 6cIcR8"&*XbD2 }wXH5 vcb !S%m�z2*ND2abeUͺᚇ{-p$2˭. DvnnJxۺf[c3?rٻfyj 7Α)3ْ^lf$3m~ܭ}eHW#Hoe~겙uK0%1nİ3MY"X(% T3.OTRAH(d9F%ч�f=π?#<'@%6orrxMAVpH�F:%wݫ&Aw"�f ;~qoIfuYc 0ȷ1Ʒ m1ewP])EN"4?c:.#=dOe%/=kHjaI^Fq3AOh`$-# M!?rlzwA s)Egl&OԷVFvbD=ǥf]k\xRCNt4iyk~Y]E)ֳ"= ON#;){6_ $FE3hr Fwp1Dgy;ۙԀm^ڲ9t?4%.m6̎ؒbIMv|uxyȇJ.D ^^Yy 1gL Slm΢IΔ:H#ڄtTYQŪy2/oUeXvtP>:,Ƣn߰tt7V)Mȁf..BHD\VsqH2R G5L&i&r|%YGwA45Q2g)d%+2anm1),'BA^jjy} Skm!a$X!b.oƱu/眐'V'lo/W L|]ߍ|wL߮r1˥KBf 0xRbA\i>9I<bM9u1 cP8B{ xm}߲ ;L5Dq>!i0Q[9*^}>`Ga/Α]0?cg?H|o_4Ú ?`b_'BWƧҺ ٌE|qe Ly"ܸIST`C^d/2{jE<�9TتKJys)grO|g{Zkwu)ذcW_'^{7w�/ �w;7^=2udp7gDv* Kw9INF>R1ľ&ӊ[;D{R6d9< y7yդ&QՠnKt}"Ϊf7xjLZ H_ZFns{"lǛ<eLf#II2k-QqJx䫜t_Ŕqʌ YΒ,R,$iKpA< sJM^Ă HK}B*Td33!"O{þ+*:Ěr)AWVoG0Լv+:1l~E_s<t:dM' !vs_Y*5lvxɢ<TZ^eF{ߥl./W#$S$3cpϮ9\%OM2tλEXZ.PDxV^=TRs׈ 7,p#zf,PԐ�=I�|}ish�tdccLs? v=|B.0lPGֻ%;&V'ߙG�A}د�|J_ h`�5wXgΌ.DoAoG2#|=G<B)|T,K{:%mQ/e3DP, T.c3 "o7F.U#,~n$e5vaO# lXEқ˓dX&b7tתOXۧM07~frK"zǚ, e1FS!;W&<,{jÒ+tؙg,‡q(㮿2 ."[YIIZrǩMҸRnl-5b$gVɎB2bėCȃ-҄|b@Z1f8ee3Q11 $G|*�*Ko1hu^% 9UR2OXpczG.4[G 3: hCպp $##CmӮ05Pns4wWnE^'L{ʰp&5̳ ?aL\寚 >o<9>>q OЦ>Zlgtk-JIbIЃ̲tufx2 KJ/=<qϔ;Ŧ$u( lKD@5N]at;9E y vaxOiqnW[CƫG�sdo+/]wC O ( \3% =#SZ,n2>K2yvYTɠx'!Yo%v,8Fjr0?MEK/ m<`![zMϺ".{SZ5>9)<NزTÝhn$Ѣr;,ƽ{>m>6 ʭ=q(n1+49v]nK; 2#7/M8YWiqҭ}cX.21!*AdY4Wl?1qîNŵ%I? b0X# ߈ȔP)a3*9Yܰyh̉ x6"IȖe q!+,V2jx ㅛ 854&$? YRLHM3Iy!c7x'7sLQib7~j:6¹sƎk6`*}Ug7@A X"?I)d`5H Yz7r]la)tX̓qx*g](9dcry`1LiO^-!tY/zN o)K8$~@*S�?yο^^"QɏLļ�}n6G0`-s6s70 eHzqze="`?᰾aI'w`s^6dP"UnPwJo 5NFM>'cfF <X ~%Z;ƽd9FD;9٪rۄ+XaAW#bwR$vR8?{yEWWJ-Ɇ(+odFG -Kʄ% OHR~45ぞ&= %m;mu%qvZoHQ!yQYC[Paui("9$BiIpnIW'Q$d!'$ω!$`3*r~PBT r" 7%4WjF qr0h\YTAލ`rAES kEDW;"^6z>tC3ײQ*-TSGلڿ'F/b+J/P Sl*G<Bd^eӸRJk&lAQ~Jǔ.uyzY@%F0"k$凇v9iv{bjelaˍ+kl{=VYx49݋LFK}!1�|ؤAej¾-s9�p@�g7=]d7|Xk ?ݟ/[s5́/oolX F�;50w$@e-|ȿrbp-κQ]O.*e3 3NY>Ql1:EQWD`8߼6 t1a{u_K{f0( |L CGmo{ $mZA/"Hɗ=;a rE 5&:ȭdcɔvxdhNt>{B IY9 vcK\SU7bXpqHZ?2CdRs6D^0j7:5%-2IJ VŜ[)=ͬ/#)|az*<z=^NXG獈U\$ȕOC76m.G*c"*(֑Gt͇Ak11~ˍYl)2ơeq&͑m:;%dv]-1rGnD6g$\`0XI}RŲl539٫^[ptjXAI$Bˤff:kkF0Z3)~]hנa,�ٯM`#5h8{㩰�2~'�5(44`/~7}VS[{�~StJIOg?_v^W�fҭ7>< z@SN+9y]+6Dg~sIDwlm|T{&k連IĬ&!  j<u:*~M/@>tKןةUygf;_ 24'q)g0bH $9v``h&@Cgk25X].tX6jwzyhJe|;M]foo7"5q0Q[=UcuUD64.oolq0A:f2p!>^-g 1òҕNj3.D;Ɨ15&G$ 1dzҺ5*hxez?Le,f(I%G)8Mt?^>sdtVlT ؋q_,R`y#:sJ8hޕG]7li؊uں,Yl�QőߋYx C F v(O9[+I{eC2TGƙ= <MecCS.* @ވs\_,lcx yq3:" �d|786#ܠ7zp�~?hz G^Lc>|T'+x~>}˖�Jm4R$@ pRiRBdL%jf'S`v#YnvtzJ<te^5vM?YaƝP>bNi>GlaQAV$:8/ֱ6=]?lw_VI؋*V O@Y] j% CSYs6#Yn,$@I:zb/7CT lƛː;:?6SIDYB-Ҷz. ;Du-wEWMt7VU)+R1vbid2R2#'iz$D?"=M%!^=HGGⴏ#APm{؁N~.TAtNn!^sy|ƓTɹC\~K1(}"As!Cö1,8+}hڱE$ f)k᱃-՟e D=yq _:gf A Y?9vUR&m?HhcOоb3d""BœaU}ðǸdSf%MK=zO:1݃\`Cx8#\<~aHI{bwAUSA~2_A<z\A +I P )P#s H\V8 8D 1ǡSٶw&FNQaN"JG0lp;tkdSٸyb� ܧP(G>/4/Af;5=%Ѝ׿9oH$@nBE;�=8{&95K{ (�ۭXF#4&iHfzPhڦ&ї$ 5"cpw=T�K_mS`I']f׃n3Oͷ6h(\.eiKҷjm~AքfuI-FFʹwK>."kKG% g fRHMb;^ ? ʱ=n,QU&jE (m̠QRH S%i#F)Ɣv]prqFnkt ty>e0w&eiapT݂ h0}n Kw3׫&GB<*%i|U5#K 6vU"giC߁=~p慁…`SM+cke-lPcpаԐտwDw5>00xBT)x Pj{=)*?CJQ—];kwXgj!ެC" F]bV;ּW/�k#R;mOU V<V`@>Eq� [˯Z`5$=H5"dVC]-t;}ƈ+'ukйv\/DgMw,ֵ}L5i#�ukHYQZTf,_ͥ` ,pʅ}UEZ�{C9֮:m~zHj:ى t-巻L\nFa֢.X6)A2&Ips:K%<OSe)1cV>'H2jwCG'woʱ5)Ld0wà;piG=ӊZ6,YB-uP.5"LIIM`@KdhقZ-:UIaWY"|SN3b-Zn[{w"XQ[ V[P*Üf[&?LN~d[Ķaf:iM\z&$sҁct̹ !$ݭGp@ZV0["}UPu_uwt-u|FxFnnGGcaP#6'z,:~D_Vogyw^@�vbӃUX@6h/B�F\^ (7@#3hQߎT|7psš U?J~߅m_F1%#Ko/w8KE`j^-@ZDS*Bͽ*8J; Saz6\bYBG©<wbEqxĩ쫺Y �\<l-Aq% _~4F[l K's١4@`ۂaUSP#ӮrI_�Cd1XSi:|2W]MbwV=o7$Π]lj=Ìۆ=I|Fl;iww9iw>a ://yCܑoq KO{Juo`nFMIWzX:Ii"uږRv)PRmJ"ip"^�� �IDAT{K^z΢C@dC[5uh7w-ZxM[=,.D24X7l:ưa| xѓaoE[-{Km3Y8$%*9 u5j. b/"wKL8?>P3u. l�^5ۖ?muRx<aq8ڤƿar9fv=^ioV| t[˗䵦{#4]1%*ཅƿ^ ?Vg޺f>/0YwuhAsG{ |ϛnJ!߱8]|`Ǡ w9z߷/=Œ*lؿmپp YOj7 ޢ_spHR .j ЎcIFg'姾j<X=^W�Gnc�ʊݖ4iWns`S%mx6#Z.t} 3VUfX>Р:t;C;G`QgzS2=b-%lm:ɘWtXѕL |K{}oe>Br8R%]P~#U;;ZזźzЬݮlݱ1NJJhUrɴNfӪN F 4V)PH6o8~O\nK6,Hxt'*ՉQnufog9}` 3L R~ELQOX?1տ&=DuW1PZ5{@6dH 98WmEFӇpBj.Յsl@܉f4pI6D}}z&nղS:dU)LG4k&@^ߋuq ^r-eP.VW)׫BnAwq=y{O-"q8wߞ#~yJPU oúyM]%@~μm-re;^?xo4g.Ћy \;ů< EvF`!KC̝K;OAHVKz:-^=b<upvVN0Lpv:AW8x fXyK쁔MbOfq&}8ueJߌ zݟp),G{_iHXVU,¬h?PT]s4:8eȶO\8t̘/z-, ʹ6Io#]̘PS.ƳDUt&4�Zx~[#@]bm9sL=-l+TύmzG U6BqJU]捕7F{ c-/~g<;*:r;)ܯƥNPv}e R3zh6y$_>Sw<a؅q-=S^u@mΉgYBףEz 㲫B4nz@xhLsȢ'Pv2|}cwo8dKM^-D6齸)ȋ˴GYsp8wFl ^ׂ7�|{)k}p}hX1z׋hM?��vo+[s[KZ"<[{w?䩨sku 9d�œiqbVV3k :!ҝivᨽ'cjya WF{1PX8�b)0 X L9)]F,hNS迆]"@2a(*-bQ=E! o3;I[Іϡ`q%g0bC_.`'ϧt,[.z lbȊJLxriz' hݷ'|pe$24~ojKlJt7.h6rsR^e9d2e{fVX5Re.ekeWfBힽtWy+IS sxo]4HIv-LuJ(z3]Vn{~(U]Kૡq2kn][ڦN(�dк1WM_i kU(l'. ~ Ռ`҉]+$;=wMWZt njؗvT ZKj/ :ƠdJ<#�m00 ݭ[Rvy!�` x.Bug/^s+[mS .L߃c'EJ/q^k<8hx 8o9es{>3 l:FeA^! +9س| g6O7r|r<lq?$v& bivBgZ5 iAs F5m<�/P|?䖀 l605{V-dh`n /8髊<`>D0r(lW<܉%w64 3DAlElMؤMo5Ur½hsV7Jnw-i}QT5Ud:}KUֹtŸe%N:ֶmo(VutJf šaA*Fy%t,E^mXr2߬kmEO츒7N gB$/)SHL=oU^aqG"걯N욉!ZnD@©7%kf#:)�RHHGcNH'cXcYhL1/=>s4Ύ|ݟ=]<v4e1¿zn=àE�wzUy ;J)/pMLVlmWzKNLsE?wO 潹C).iʯ�nz'.=xW= oԯ�ldr|CVcdy� x6|%mM'=DԽcObOIRߕpY)C`,wm-E}l&TP 2� R J �9W86匝#8pF"dǺNO. Pp'%c\p[~wQegp?(w64IgnWy/ęHn}Br*b0�&rI)*kwv<*j;G>jD=X;;0ݭEi&U1.xjW^e`PPsWۚ:ZJU1ј2IeXKdje7dc$[Z-$6{:i9jR5plg~r ¿z;5l/K%��]WV'ق=1^u [K *yΑ.A[\0rN:AՓ*w2#&~έ?,�:SD'߷$GqM`w^< bVz-0^MoZ풛+;OS 㟸.,z+ 0VoU[L^ۗh]! ,9zi D�gtmpW*4V_{=0f֏ĵNUc58C� \b�a|v[`}@$ex�x@G23"o53hG֧ݥ-sX;~K ıy"xu&Uҥԟ#z s\Xj \XDhl*2` B_<G}4Vh ]q$ՋDm|YG s%F" u}؊w~x1ki\2T]g/$K(-==ݾ8)oԡaa]w6Z=tő`+f2-Ըцy6/ ^|›FyhM>w.�G|n<]-R% "Ƹ]jgk/Π > z ),yP7@7)k K@ !M~ۦN7iQnV%{ԖzBvX6<$!$mە+Jä225}(DRJnu˚^NnP{ x- 8}mh.]"aKi�|M=6QV[|HfZ/BG즞%~EwDϜd7@9u 72d�s,IIg@`X)t 5 eZsXʹ>@%ڷ8yOU^jkqAXH785+W5 u:4_"ݴ؍z2A F>O"L84Ykzo@xP q`\17 qdce}L=t`=ܭM.ĸ )N}*&-FK؄E\Qr~`׍Kk!ֻo<<Z5H}Ejeb`>{`",- Uv ]kqXJ:t+ =` rκQ(D8dE}<ͦp c64з}I qРɷs|~sJJZbVsD,Ƙh�)h4|XamD -v/zwҿGgUa(3^bWn|&PC-yVrr`dQЧ<5<)[YG94(:a)"ΏӫXo <Tn pstwὅF?4'Bh/7^ɿ>c}:8 ;NmS4L A` w^I]C^[,ʩ:{j܊sdǠ3xjoc%C0;E}!bN,gaF?3)JI$-CX's^/a�(D�L#R; :gq~z 1qhx<UFOA@8rނl"+II/]  dCjmU_c^':mQ?pM&p:-g:%awU枵6MUVh Fo2;[m#EN6+ :t3bĉ ef^(ﺁJ8*d&:\Ag$ mƻkyå2AK"=jhj8]n"(T&NwMHU('fȤتW<W#nOps}C͎zi(`ۧWdcT6/4د6bqpda` <j;z xsI3r_rVr]-EhSK8 nH �(~Jvz[ܮR`"I�},?U.N@^&18.S w68p-핟�Tk5]QcylS\7_@ W0;bQ"ߝ8sml%P�xzY/pvb Élí -[MC}n䣾?A�8>bnoY; .cO>Ku1i*~+a2,hA{\lx?ͨ[w\9.E󗶣.g_dnu,W{!o&(i&,Ndݱ$o)9uKZ.NoX5Qcy1HqD`L&o!  `m$JA%Ǟ#ÿeQ$}MA4(Z/A0rg(3@'uR A1`bv"5 e7_{}3VajAp�:r~?^3fr=mU$Y&<Y8Ȫ'j-mG}ςH4l p uθ*nՏB]ѻ&)4O;>X_�[#~0%^ [CƅMg686XL^Nx�ghj6ih <DlYC؁sKH81u*#LG_A,C�m x#w A@H5Gz7�nbӖYW?lX=lo#/Y!QK6/j8 dko^B ˦l/!�K�6VnB , Dp ;0E ֖*'2 NEWRCl {.+._:1=.U;,=oEê͗SP2k^T:j`Vf_KWTTF O<w]sM7Z[ڱՒytF&Wv6Gz x T5YI?¾/xNz[4 9PK(�܇P-PKlߣ/Ww84E6tfG\ m2mF6@A> eBʏ>&b8#ReT\֟Y|4>p)Qs[K`,بW0Q&ɛ<@srUq#eoZz%rV~χ]~?㇠b}üOrW4 8+( , b G@\;]9�v@(c}YEncXqq |F -%'1qO$Ÿ|k/FXhT#?*NU4*ǻ@)u!nK�D% bd]MdƐ2-b#%@ fv� BK#/`۠39 8u g.}BKJ{z|9`FնӢ"<'1jXu{mlseKqðh:IC,-P|Vi:]Ԟm]vq]?iVXz u;<{[a7k!��}#96 k8-M9Tz㦎JЦ�E/te'س';w I')|jv g` ^Jo[-PH:}6&H|bϧJh5 5lDx;e/`nSGKk1_"*ϴ,P=ĀIlA?'6qt &@yN~GLz{G?oh9p3us�}w e#vM8ظ2Ë0 ҝu/]bMF>vS M 1x#GrݵFH:E p&,:\8w3mn&W \ܙ|lS63c �l*C$u"Egkbaـ k!`"(%nKXiЭG)%8-?ULoljT"@>9X}w{\3&`XFP(ta~CJ.Y� 4۬Gۥn]yCݩQ 6s=邙o*N~^ pA(vt;7f`}<hfHzS9P)])wOu }MSoi|ٟߜA`A( ؤ/XAUg@a B'Xo4-} k;ۺWU,�&Pď_ށ_$[Q{U{?~Vgxl]7+p�x}j6%X`-nzTՀoocy}N^sD@ EZi &ѿj<VƭՅ8 \L0e+V87z˜wr֤ ghEB!ɮS?vUj|bN=ڹ{TԢNuNP6(U[Ճ�� �IDATi8;*}{VY/ѥ@**r12[y{g<{uwɺ7p1EA K@P@P{7*yȫH/G/$i̽A8�hN!Ś.ˈUYr%B]R3e-C&&c=Dϋ%9]z[6 lHp:}*xHc3X'5ęEBq2X0+gσ遙Q$Bce{e8jNt..F7~Sz92Gh.P'v{m<ZɯF]f[ 4lU+dԈgK5(Tu{;鵕-yߢ};>*a?H9( [zp"`]A4/ХD$烫R�ǼHPL?,A1<ЉM @pivvК&wu9n{B\1%cM 6[F1|?r8{k8ՋU] v]ߗI !_b*@ a9YWuJS|0S)9#E}vYmS*dpm5" J^(:OH4+oњlٻ^ʵo~bk\+3|Y~1: +3۵@'{ojj=wP<<8Yf´J@( TRZ6H4@yBX K)'w/,OwU}ɒZ >hj_'b; >kLo@.W�WblݎzJbˁ[,u^1~CB�G2 G%l9ϷetG^8@& Ylq`K4wG[?r1XҐ?@vr"r(~?1~73o7WV3܌yz?'LJ}<ݦmjkAqa6W8a;sc{č |'X[]'{r ]Gj~CToZattDlЬ 4Q;b8=`WvF4tQPPP:zU\)N2YV'ebm(SވErhwaA<iN0%Jг]%[ЙtcG o5:櫽79 ղS +c8.c'X&P^G}x[ř3dB6;:±(8C=$kaΒ$*;_t%8U74j=oӸ TXJEgaUZi�G\zQ2nmq�GC }x=w|vg^جZփ:j}6#Rd:-|UxX� 0`<]]7y T3^H =GD;SRmcX[5(Bpr;c&{ׂχ|gq[`wެotn1&X'z<,[~/)H/ƮBPw| p 6!0BpF `vȁ`K*}Dz]v.\=t;s2l`ppW5nLՊ:V5i? aG\Dփ}~E 6}^�uV>E>KZMBj׳v[TRGsoobyjr!˩K e "V&vT~j0ʗ(BÂsux<O5nK&R3U^"\ I]tסƲְwԭ#@fp!8Z&K؋+3E4 |-K1ef 5K�0.۬<; m#zo$Zw6 A{vPI\,agQ<;8xt0&n_ JJ[xV✠Tb Ü^y.v)8O=@�c> E5h}D=Tz2Y)j*/QʻZ) )l.>pnL+'|� zf+-_L+Ws��DGy'ij{ʾ;cTK![m B.ǐB&3"d�R[]( 1e G!ppF>GCtV y+paFKgG)VNQa"N*1.( 2B=A ˞')pMW3^OlzM5cWV D#eXF8 hDC8MTɜY<ݑ]ZuhkW- G_n8HĚ2a:T !\ȁWTI !u3G,JgX=dKx׃gжkl>MVEg"h^M}oFb�#0LX>>{O>>LwnŬ*wW(`  #'a#/k 'HejcwV+r `6qaaann?xG׸ܕE{0Us{En*޻J-�;y/['Wu&иʑ|� >lOSf;'hj{~6V^o'3`�3 bw�M!+>�ת5̰7mk1_>;v&֬*΀qr).D~rlrR ,TPduIXqsA�;=eN/ۥC Hɑ)ݶZIݪh!%mH?098񜃏,/N/ne8q.f l8�&0O8 XJto߄*A;p Tʵwt]In tJc]g~R$\O=`#鐧S@}<Ov%j g-ǂ`Z^u#Vĺ5nREi9} 3 q!!cx�"u_޴lvrŒ�M꺺m-Ovt8_L|z"ўܾˬX@'~@\DJJu{'B 3O|ZE)Y7A]MS-G"5S)ǜ~X{n^kݺri͙ݫ]aq\Bo2eP|2gz,9 5KvL]|DH{8L׍;B(Vmr?|,ڹ|c^^<z<qֳ?:Y?iتO-O"5:׫l†t!hֆm 3>FsaoݎRK Ͱ%i-|5l͓%bϒPҼ(:32hGAWc.ZYtNV2 BPg6wKݮח*fv{5dx-uծGq} ^Sʢ4{Ib5qtxO(Kc/6,ΔE.%̎gzAh.*%)?y`xԈN!ye30/I"vRۯ.@(Ja tUf/:XW(H\A&.lUs"[rђbW(Q8ǕqΓ<MN藫"bѦ ):QCQM"axD }5}FgMYѹ5+Yը.#fN G ] BjSe;('v0h%QjDtJ_B(8$jH&0pViǙU_>AoMml;-dPnל. 3?ԱOߺKo'ҢWx+ߖ6X ûFLF Ujw IiP+ʨ[Ɇ͵vR,o_I[/S)ZJ-0ZT!wi3,{M,doTus0Ŝ\J('S'~cPtPVGD Ѥ*eےYޕv.Yr/0t)ܱ(ys [t!jsLі+E^6Iq:5hXE[=ES#]t(Pj3lah#W:ܑ3f t0&]2qexz( /,(09Tk M/qcm!45Ϧ 7\5uChȶw-:$,c5PXo.k3 ￿|U:U3¸~v m06EFde /iqN@QP +ŞB� x})?/R OFUĈ2>op BVԣkN9"[_^gM)$tT$Pݬj3rOuO/V G0$~INT0cO߶>Y,Yw5IIG·pIm^Ud򮩶kNKH.p6HeB8g[3CF<0KVdU'f& kܰzܛk<Zb+6E.~ ER i U;;;lyG]*SzM?LP^Ǐ PY!tsz FJXI3%-3"0&3.,%ME%Nն{v9 CVP$1(J_f~ fFKrʪoM]'nӪ3AKλנa,LYwD4gN;1lS3Kfr[Y U-!$ad"%-@tC&'#[|, ֑lMjTQ@q-UoQ[QG++UPZީwY0'-o(jҢ0e(X%Uծ2&Iq6WON䲛xhqfL:ZT5SG7% ',p0]sSm[d , 5LD; prk^1!6~4#J7p{1|}xo;z?,)T"EqKqo!s$Û M46TlέIGYoFa/kbC>jA(7dAzEQЖq4! iZᦉ3t2We~PBQ~_fu_{edA EWZUڬ!i U`8G;8Y9iD0]↶BX$'<G rɔD7D@8,+z/rd1Z�NɴXV/qG=L/>Nq*[yFJ;؉o6MwLKZYW4qerL'Q?Uyq*ȅQ@^@1aĴ,B9,'~+^tGQǓ|ڞ/AVΗSJһNJ}; CZ لВxy>wB9(ǜq&̳xHզB0RA,nR})gBl3FT嶘¸!֯Ee 0|gE`o3;,uNjր y_kQ]F;h!?_z^U6' J?dr[Wq)0*KM*TyT,`[5VBJ%P1mQxl>WARճ] 3Kɽ#H1-YԾ0TSi30X4Y6yFbVж&wm崳?FHi|8=b<yg\;I\JCRIBr4!TUj+hLnǁ( 5FaSqKeD6@p5͔5^pPwzj06wV., 'v )҉'29_%xyd {ᔘ9c1,vH%x IlUsʽ "۠Ή`Z󎭝Qh<B⋋z,S=MEI범=|3lY$чILYai6 k-P_i|OI_*d=#TP&~ gEk߰:0. Kmo66mfm]ЁR8;-}/6;lG ,o%2j̻ ,!^?"F}W/?{'(QަB "XGKPTs+HT!\~M<GLȶCA2x4/[.F!ߧXKlM̸p33 (_֘\r k FzSf^rPWtHd =r.%[C}8T. H7s5M1D\5P894/01 xzӹ֒gm[Voyy|Casx3 xV'20+94< :ֱnQ֋i`G<T 3j_i4@)ήtEYhc ,!Y/Ց9SG:C)<pyMoM2Y9eNΌy:k ]ۭ@XD%V"NJJMR*'ՋR^C cXB:ְjڜR;S 18?Kd#|MozN~T]0+e]?S)Sջ!~d'ͬ L%%l*V!HoF5.k7Y5oo)LD=Z\!MM0r;y@]>>}VZirל.6C)ewg<1QUU!ڊjE +Jl +#:&N1Ĉ A+0 ڞQ_+=\!)J%v#<TgJօ#ʇEJ 3U\E'0PE6e_Z/dM"m a}l ,Gu[;)lVXjg8(4@ ;c00^SEjhcOҩ^JFQ+գTjMa5+<-@!&[:vYl<,8"?񨙳`4E*@jG=/e~i_j&It!B:56(z(v#yP~VHܶ?OǾOv`uSȑ^ 恛s[I:tQ>+Fm,1PƠ;Ƥ ><3;Ts~''e3g_Oq |Y�v@pn}pJCU`K�7fdE!0h@v0w~ 14:,藅ETZ=d'aaFF ܄ RKtB 2΢*!@!yec oRfބE=N,ugzAd©bzߡ"}eWz_ ,2e+d\,@YeMU(^d̻ `z'VRŲX CD8ir,DUfZfii UTT[.] xY@_];۲RbLeӛs?kklq>iY]d)c?͞O1IB4$.a™5PC*ȀagrnMҾhj�5ZtaZ!�ǧ9G yF8]S U+qXUm+v&HVŹOUEv4RX-ȍi^R9GCh9MK[q+'M .+I˒]yt UԒ0G3F\*]@ N`o�� �IDAT/mTPI 7UBP!Mg-'D- TCq4EYN/ ɑYV m؋^n[$<L`HϥK̋e/XNSKPr . LF., ]z8lBaDw%cK/f,J+kEZU'fa]#o[`;d((|:] ;nSbw MCE[ k>pd1~bߧO<z^սA{ >N?XЧ7sq;;1YJхTӠB:]PTm|l&5hV Ql&t{֊oA2 0_.t] ERu-":LUJW89v.F 7$W `OYx=e_^)]q$G39v<ʦ˨Ѭq'_Qz W u ǡZYjF\58k>_Lհ\<ׄZv avN.侹3rcƻNZy7QhZ_mtW䎃loz.+TkGWj8<}f~$Qi.!F}@q)&/Jh*L Q4@("@$Utz|wdWgdQ.Q@E6$U9V!EQІX3@HVg&n+o{_NMAQQpFboRo+wwJ[-?) {m) 3$ u=�]a;Ā)_ɷ<lPnzK4G$]w+vFLm6;Gah/Vq@.z Q/y9ss1[ʢ̓n Q Wh8⻊ALYƨ16R<cTJZ'JH^'fJJoJʣErA}zGZy]Enש3{gcW!K oy!.yD[ێWMguHGZKRgjn2Vbe uwZNk!QqufJ::9f#+ 1;SX!+֨Mě1'YٚmYU`o%סdUp,we`AQ�BDM,)A@ 1>~եr^.]ok-HbDfS`@h{Ep=Cʝz}k\7J1|-@ @ !y?ɏ=>a׼ t\]]*`X ]7d  >%r:_<¡|ͣHY?1LpOpK9)IwBP>#A]XZKG_Rk>^t<aԧ(*H=n#!,#."2PFEѭ c;#ARc$ENk.kKSզ;EMA(Jqגf;gMn}~U4Usp_PFn{eV;Ծ@1R߭܁ar&jqPBvK/Z]M]"93_oXbɼ/ @A ,P2bIqE7`At(<&.#\-)HCrD7I5q հbnJ~IsЛ$-R; & A4u6:IB I�TӭlfM zݍ);(ۭBwsD|x+~5q5ƇƋunp1s%z6[+_ * oF^vN-˟%Us89ٍ\X, HQF+e`6c"t եZ"D/Pz9Wz+> ]ꈲ^A3`ls #};<|/;qL@=^,7LR轞z]2o}@%']8W9Չ}2M7YdMV;v1>mVS{eg9.v{a;#`/G /Y P-}B$o-6ﺣ-I9fІ;g G X4)6thBs26 i Z +lLB**z?Ärɝ+ q ߼![qUac5fI~~Ln=#9_}[i\EI!^u_GDΠxcUN9 5.R=c”YA䇃#rrYEָiWJ%]QG$/4v^cD-\V2Ɩr.h ̄V:@ R6S i 9A:2Ŋi@=.&<ItLο˪?_YT6i`Zc*ҰJ( /<#*>r(AhdBuR C%kӷ:r';G;Ձ/n.Ӵ.ĝQ)'3{mBX>4x|I!R-L6ⳢkivѶIV~WQ 檛K2KL?wq^] mzkU-Z5Jp /7i5,\κF[HzǦ1K}]ήR<`|俼ҧ!c~铑y(Pɹ7%)9H I B S5`xEvROEiAN!Dyue:oZyP.8{NƳ3†yZZ6.?Oz` C=t1QO d�X;q۬L γu R9M9|E<Ղs\4dM,=> O MD\0(Pkyq%eڤYaϑ*Wc%uKjD<ShuEsa.岕I9-shZ r!f{-aN&lL(yzq`[ZFr4 ryxXR~-0ʺy.5z1aev]r^ɸI1x΁*;\Q*c=`i(Bd:h̉ԎPzK~T3*9nstr  |a~L)ZGa/Qѱ;fjX?PVy*دHvGCۺiRQ/nd75Wsh][eD,d~M(kik0M5)Es͈\/gx3o 6 "+ifj̴ng &=UhkxN$Cf9A#~+j§$֛ ƞm& ^'gi_8L%Ր෼6(.^qQ�"13"sJ$9NL=6F8iT{e9[ ]+r$/$mH( @G,[Pq۹ӱԬf!TO*vg4-.Cc&$3 4by�:FɳW"]54Va{O5ޜ,&M9]Q[:ܓĉvN5ͯSXi3wˏ1~&&EC| Jfঘwѡ#V$ Uvc0I.j@};[r%^?a3�AN :~>#LCȿ6=h)8s\{k -WA"�դd Ys@ml�WIl:|>ᑔC9k8Նo0VƲFI{ՉA`Iv']űͅRv71-N*LC T|V0ROW6h(%/DS5IPJ<ZYAݴSV+EW: 9Ď[Cj"0]̜ԀaqL;2}.]dW\wn&Qд_􄣈Č"ݑ()Mb WyUg)'6bSBݫ6xG֠ /=zvs{J2"鷳 ?kJH9 '-Yۑ{3.YִOR>ئxdS 8D*Xtf[%@ZqP_Cc#h |#2HWL_̺2�boŐMa8 vϱ=\g|3'B h¯MST);δh97 $lFoMi؋DɉXH$v}h ضM'?{i,J?A ={2kݲS/y*^֨5LTjdG2r&G]>6rsgI ֪iH~Pg/p:.w:_9߉ێY㦨i2�O#wigYͬԯbȘ:$1~;C8 C à*PUyo;Ѕ!{}Lr\>C0zzpiFGrj:,%׋mL=N{Wv:NIR/\+[{xH*og PnnZFr؁_NcSS.Mdِ9\BRBˣ(r~O_`ٔ]Cq5 ?$7T(Ez9yM2QGRl "|=UO�~P@l#5Gy!Xɹ<}+O \'*Lx8Ld=qR50z(@DaY"Jc€^+툎) e\54P@syԇqiMmfJ}Qvj#Ww$R JN􋣼WNCobפpli)5>yT ѷUɽW/;] ~7| 'Nx(ݎ7>o)F9tT|7廳&-H7.Wy#@6&RVu;cn2w]o)9x[.Ӳ3tG O@}D>3p|ud\-u#U>\Ehl|wdZZ:Ac^I^KXA ȣk&y T%H Lw:;lSX;}= 0Tv|Rc=0qh �uJ5c"uĸ F8aiphYA,~+ Wf_&Q8ӑ+ 04f16nh_wW;=x}S-nv2<=ꉦ/=_R&5EY#mew@`)nq6zsucƚCsg=n\/~,y3v` LGת~O`%4w?r=Cu6-f-hws4y-,MD�u%V"K5sTʺ D[A$ynltA@@qj'MUՙV̞? ތ[B1Ldϯ҈?Y Aã.jKaZC|ȿW]u sd MKu(z>Kwfg#pQ㘣<)C|r 0KA0> :{v4kjnlSZn,SQVX>Scs,x,zELa/Mcxg\wu&`_˸*{Qw#{NJn\Xm ա:ᧁ3Ҷm;ƗbkOyX|IHz~h8$8TZ 7SpcJ� *glq)p d>txm' .&20ͅD#T0P ODN sf/5do�ɷ15pvfXCv> ڦP# c';@URms;ebdيWv ͛6Q޵:d:R3悴<:90$]낅v-^}jڞH=SV`L%_) =W4cYq<w=iy*tOSMZr<:)ݐƤ5�ڼ; oC]q EmS)mq4ikrpU)'hVo?}[2~vvZ|cL]ig8&a9Kw\6t!ĒU%;eW p�D6F@g+fxuRTۯmV6~YHbAo'6##*fM08ĐXAClB$0T' rJ?sdX68|ej(_EZu%IW#<0HN6z1gHEevs_MYY:v/c]y-O[P wF4Ӧq*sNWWq0-3MUT~RfK fVK{mz>IYDن˻:{0 ݧ{OF0sbZ>HCn 1n6Ow]-'7[t!.f|A:߰D$ڴh),�[G 3(I%k-ka,FCu'7?ꀶm'IHl+<&g 7uTQ0NeIЃPIX5x_5-aUC, dM-/˧KNOdR'!7ؗdFXmP%s/:yJuu2 F?КMŷKѬ^( K'e˪Daao՚̗v2XYʱ?p=mH0 zh [nj'7ۛtDRxvI7~x?X7w^?({x;>|ۯEdm+<;w%FB7c5,~8[7n׷ޔ\GoR9a.]D9 >3 #+-2,A=4_{_?%.ǵmLXkti5̀Wq7U y Q �k4tN@Cq(LK{CTZ6 ƢPžQ)b\6hF("?;:寧gfSFtՓy婞KSv+R 5ZI:o'?I.;UYe|gO(W|l hE`h ΑA+(PETwXr> >p5ʵ-}8N 4=NæVL|(g>uޚ xv%ȲO2Q)MG@܎Ɋ5h?<R6t0|xQBYy&[?lpܔzah"7 `[?-+cx$0ֱYE!``.=i>!4qE.1$VYRx hWdm#a`}mdapy*}j~-|w6^k$Fԇ/V#:ZW,rfb25&S%Z0Q8y?J-:[E􈛝񯊕9mP !%I3-ӅDMq|cu?&X)ejҊ)ҵ/euVjw&wEi(Z9Y,(2Ҳ&i'Gݔ'V`mfޡ!+ur0lQdGC-ojx-#Ѽ?BG<7Í&w\=DODt|$LYl}HmT9P#� :S}wÏi+!y뼤w! l[ #v흜K Qkneÿ~ޯEqu}ƂȬ򩆈+ϰs̷َRn,0PLOށu;EޡP]N e'(L;k-,Hks+˟�� �IDATu*ۨF?:j/g2 $C"6Bu(U*)JV[qR}5q)idh٢LR+W5Y&%T! 8W)R3?mI'p^T/2!PY4.>[@n| >l8~7<\~q C=P@Y�gG7ۘ$ 6B.CS9WUp!3{0Y~țHy3&nĪ!L!Wyߐゖ~1.9Qi>16lCGnm)A-ס% >FMq U3#l*(g左k$BˆwͮYrYq))]t-niV2UklɫPRiyU}p`MQdKC2,~)"*m'3Z앴b%%,$™{fb*n~ZN;׶Lp3蝦zi-ȧ>uvZ|aLǛ*g=6BU Gm|9;Pٿ0Ve; 7Iva-0Wj4r#׹CD�ɡfFLiv$;S rgɳ"TڵUmoٞ1%a8I�@>墻Fh 5[i}hHSYS:1׎4ZgKWjaфw V^# *`3°8`HTٯblԸkү[+.1Kg }ޕ^y(u8ٕ^GW~οhNa+E hd.xO;=pTլ;1WgCgƺif L69W/z8jʛZ7tW;߬WlJ+f٭u~tzXrCKCzR9/.#?'"] E zN q8msj"=ia.^5Fp - ꃊ*ڣ@@| ?dfmrBcp3DCzk`]{{s<0Ț(N6=|PE8}wns*c*/Q~>6S)5T9CQkpꍩMlC �tDV(/'F~ոw_=: [ٟVE:s[W`/ Z//4߽UΗ{\ir~>9iX/kkm;˙:j4MzROu~DWoiy7r:Y\bKA 5+ Z{ҁj|9?]ʆȒ'#1wB7vp֩F~)XA(<?sרfd%,i4V wsOpY{h#lAc2BF/9yNE\1sAE|wLNUiX'kȯS=ڽ;:{ȕ ]hPRloR pUyqӪO}u */qzzTeìV=i73ʘ᪲LׇVƸiUZUYUǍ)Pۜj_׻⫫; l]С׻;y߾6o D^h?݉~gخM{}\8fh'5,mT.XꉑOYҊǵw)iB]Ϯ\O6=Qեlȋa 5zr03`AwFۀ|CJaf�wnv�ϗ|.rc}~GPO9gS#MPrQGNz;8F#u#TfO"K#NUi᜙6M8G1Twzg2UftjމPZ M2Uv4@ѭN+[Z:3kvo̹B#,h^2iN۵bn g:nF5,کL3>V6m<}B4Zum}C U.f7Ӱ wQMDnH}uF F;_̒O+.ؔĞ~vG7;R΢-23kSŅG*El8 Kba-ZLÉҹi,+yfL~cP p)Nh5띹?_L6Y6Kauk{C|WUުa_ᖡY6?Z^i8BEwAm8l]58bEX]uYط!&. T_`0Һ; SZ&kjpLL:㡣5m}KjawruJMLf ?WWb'׊f:Lqfڕ3gGtFW1!lkt^KKi?r ,=_)c S{qp�_S0I\Ro u'6NL$\9ʴSN Ik`XG$TJF03_/.H:gmƜg6Y_4+eiZ f"}*ExZ{=?Pi E5ЩTfo-}>jgGLܘL~:drQ >g\=A1G#%4>X85k4t)G @{-s*ݢ3گJmnX#}3M&3I'CCcUfùv }byss}\wMџwU 1uPeATzusGR$a3Ր>=]HSCѱ˵f mx9bEn| r޵wa.QW|=goyy3mkiD*bK/ |F JhZFXtqtEF\<G-w> OB:^mdtU9;!;=gpʍo8:e_Щ3hm 3 l_Z~&`›w:g}I]ì3N08nńY؏^!-P]:LTCuv7pmd*v(Mv;ZI Če- (Je&[NOJ$c ?ԡUE%pZڢpkхz(J#{pZ ^7".QZ\""޳'} ̫m* K�*|XhutD,v,&mC�n18:BbT LA90Kr4ju+ F(_8Nt꾌94}Gx&sb.w[LkĽ1ٸ¡?Q~n)j)Kdڵ \w_Zf#QQޙ_DN;a$p`wv/V &p;a)e$)ԡM9_Lcc];ORN~u#uFቸ;ct#CnJC_J]쟜 }G|;EAr`x47 b5jZ˜ [/W؃R/.U>@%/2(ǼjHpwUs 4&!uڵ[ "ܪ y0wCnk,;Um(3xڷk[P[UfŢuCih6m 3A pkڕ~ߌ-+aT*Q͕j==Š'}Ct_V7m" ۗ:e3J[U3-=胛!0+e6T}^Z_H&Nv4")3(1J>8.YTEʦ m_[U9Q0-Ϙ STqmso:6Fk~j&㾡Ve{#V9uN;@`<)UO.P*{q<Mq�{~h^|F!TS_vtkΠ"Gy!oR~ 5ʋ0j K m]%A nԘ3ng5&gLHІ"&҂}vr//Ӗ 誵1q5~}87~1dsOARfmc{PYfuJ[/][?�^yb;gc[0𧾚DOE ,ndv߿nز_۸s=];<LCI+-T4:5W+ɆaJPUe MgxRtׁXFX>5T=#Lשn9 m`,jz9g7sfV@KaD*z7 ~> 'weC?`EGO8DMpK==uvl,IasZÕt/̱0By/Q)1HsX'=x[8iGn_sJ+`LfX}<c1^b Vp福R}]òvWߤQcW8>O0T͠D9b:^&@UH8UWiz%u~*{C5F;ƀz&`pIeNU&i !eTG@yXN5880Psyx_nN q {?Rq<^ɊLui0^h w>wi&c8ToN0e}@KvC㎚"rj zެ/<+Fk8�Ž!0& @D=:h~"$X!pu}Pa@#ҽyjY99 ' $0bo=.񰥇Wu �Dje}xmfL/wBteKVDͱD$X^]]꒭נ*W7::3\ 4a]ϖJտ*XbD{=괟�E>Sn<` DZ;{HbxzS _L & wkGc(KVv|[*Lk"g5Y=Y,PGKʐz=8J+E p j cѼ /\j,^-הpyߨ2Ox2&~Z /e^lqݠʉ㥊J!;5+v|*!J!{XmJ╤ע lZY5 GrU>MBg:zZ5F=QYT`T_z|$F}UR0ި`_0yAw=%z5U1k0܌R@˗Զ35֞&{,U8e2܂_Ϛ/ 4NI fP2' [ο-Sz(ZԭI y|?a&8s"[hUd 7i.+"zl WP=�b&3;1ފϷz[)ǨuĻr"jeT>7y)+PŰ"1(ŭvʱgQ{Dy!oD"v2EurFfqǜ1 g^:tgpnV EG:n / x~g)a u`[Au©WҋU)> |WOk E&IZ:[\QK)e&=v?R AT&˘tZzz=Hbu7Z #~u0˕F]w!c~pAЎqZdW r>tD'(F:]`3NW3b|-^^Kr%aV2<ᗼUet#XZQ'+Zf&r'"md 1vEEԬ̂wvZsvp o#?"֍c؄k"�rT{ l P2 ywM v=]6(k6"%( 9Hmkϳ{3ix<N; 03vn$+U-Bc]ͽp?6W[t^BK߀z3(yFRNc y&kE+<]@$i=|gfoNd-OXh뼪rŷR[\S7MfŊcq+ho_ANGD7{9= +E/;3yqSCv\DBo}4Ԑ~_4# ZP -Vd2C-Pr@ .}*Rph5Z6s|7jrr$)I."hgf=o1+\mW\f\%O UWuVƌ~F>Σ"l')Aj1RE G+ٲ&�Z9Jxn22U2ow~:ZEHLh5MEf@ol�~@ kMO;eȘ 1:ď];+= K-i/lG$*~В({[8Sj_paqc#iqsՁz ҇O :\x<l Ds%)ݰ-Q.*Ql38g<X| H]$ߜe'7?M &6fX)6'Iţ  j^eWO�.#. If&eyڱ׃%v@o4Gafa.砪R+h bceM,C/g d5Věa7~\j z#el. FŰ-H9ca+Nt՗aȊ0Vd)#wR>B5OSY,_)ڂ5֠1d]]`%Q6^Y)6Q2M3Gd-%NVξ9O,-#Ū:V#6Ga2pJEx &~3~L<h*Ig'A2,7Qޏ j.ؼd=i%ՓЃ^hvbWK"nLMA|a%WF\MΘD\}8|՜jjS 8%D_?qCֹ36j(ZŽ5A\3fn25kVdujVWs곩H : ;ܠhVt*\\)bX-x=$^[lJd$pu[T*"z;Œ2*n N֕zAgP,!Rf*վݶ<hNn>0 )<�<O(}Dq>ddVG^tGmJZMvhzHWe8$_$Mz 4R $#tfUKK)eC1\S=P.;flk?A5k‚%(eGU^/Y̵wk 3MD~p [o}E_ Χ]-eC#nyszse݊.'"%jo1Qf=~gT㮏lfƙWx҈)m Q^4XVE&kHP}JVxP.3wOֹ|/NR_ T$s ee 9]voN m["P7vD� '寡�`.ܹ]Ռh?J>@<'1Mի۔c JlإQ$68K-eعf>ٰL7\ egpŬn>k'pQi|Z->Oa_kvl'3b&� {s]i|g�� IDAT)fɲ,tuU|/bnG?(~,,O~\OT6j3lbcKWM$]cWIRvōS딣uPPTR)Q]?Z: l#B.SJWI[Xj)=L2ZPpS;C ZԼZ& eSW$�lE?z@{"/Iِ&<"%Ԉ/{Y_oQBLSJn ,XjBwf1kw/>^+nIIbuD-Rϻ L*>1`$U pxfYoUTdVx8'7۳;?ߑ{<f6R1ֽwy2SFz`ޗ2蒩P),RzMy}ih=.smD}x/m|649`UWu7r"Ͳ,R6N+߶hl\[)?-+~01v8D<rbew ^>XHs3jpkt<lPۊ8ayX`dr:28-$96Y{s-beu)`ش~ɰgZƮV~@rEf=O+ �TD/&cƙ+Hٰhr]Ҕ8'_2#\!Eb@2w&+ԢkʔTb/@v=!n?Tʒl\ 51<M%H;+ 򂷟<`v$ ]j$;/[e5vL9Ed &J#L}+u[;fAׁ ,ŒeMe u[DFAn0,/"+meA"P*jvOe0O'8?Ę4ڏE>d!v*uUg'}eEjg6{>P۴bЂ_q^MBlL;wΤٜT6Zf,_*.SR|Ds@'[>,ڎaƸJIKUfi <T7dZ*\Vu#-b:`d ),~TQ@&vl]F,b;AKQbosv[]t!܅Vl1Sj)R3>0-؟eݨ[$bz#Ǐrwyʷ1~ggK- RM_?KSn⽴)ġ{6\?aŇ2N}e64- HC攧k$ԘOE|)ɞ`!Yh&\&n޼Ң*gE?!6oVYe}%w}Z;}/, $K{+uU;Zv;F[RsG`Wua+3bC]<hr7yo$cWȆP l+JEd/%[[2w=ƌ>&mk3c)mۥwe7l-.Vљ#*tM>bo<2ޒSNt٠?߸O.>[NoC1Ef#n vT/\N5s',+Fg&e@|j?`Y9-t>빊2,}D+P)SgEW?f8com8*ؾZd}~݋դT?)a'd9'G(J#Ҷ[ZS% >P='!!!!AړABBBBB 7=]:lWS~~2ҧ$!!!!)$$$$$lABBBBB M(Oy/?# SABBBBB )$$$$$l-k V)?TX !!!!!}JR6HHHHHH !!!!!e F| 9$Ǒ@Bc(rk?}~Q$$$$$lhx" R6HHHHHH !!!!!e e&@Bc(dC3$ԽZ/C?$enjO<z5gyރV-rħ(m]v/oIABP7j ֜H| MS,F IV ABBBB" y !qye %n㋟$$>->('a}մ{q  e R6HHHHHH !!!!)qJnO9) ~lABBBBS> ^˹p8!!!!!_ /U?����IENDB`�������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/ds9.png���������������������������������������������������������������������000644 �000765 �000000 �00000460322 11332353405 016573� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����P���dC ���bKGD������ pHYs�� �� ����tIMEza�� �IDATxy|}/z f�.(ڴt,GJ:qbg8ˍ*7bo&4}aZKӲk);J9Nmv75R,;LlZE H�Nf�p'A9sΙ߾膇@ a, w6@ O?ӽ{?񹃴A&lد>~Sol$2IB 8,}8˿a=x.xꤑ1N%i_C=T(h+6>O>/1P$  tJ_luG60i件Ö7'2OJ c D"vkkkW\cLyKRO|`0<31Fu~&[oO- :@*u|' A^lllۊuܹn _F۱X,DڹrƘXs?\&FƘJ.ʴsy[&psVѤ#olRds+D ?=sw GW]uW^yE{GyxӹZ疺` zVWmɓ/WW{v^׿ߞ XWҹ>{;^:OncloyO<l6~@Px>ꍹc `:+K}I7_{qrr@; 鱁hfM؉u6^cGn髑T<u|brk-1BcQ~b5zM~82ξDI?|Ue@=L ;<tvZ/^?z_ * zZ^oƗ_~\Ç1'<L&knnް;�U9PI\<Ҍ|>6aj1o:aVvن&\ ; h.7$X\1v4bs16Lw>wyݶCϾ̵ѷ[B1^kgˇfӏJ w}gO1f D|x…^N}ٻ1k ̴JNOO&iͻwZudd^$\[n՞XSSs뭷j!cZR;w_<fOd.犇Qޔrm~Cz]dWL.ib2f]av3?No*H$,2c7`{Wm}MKvf?c=GѤگ~ng_|y,oC?{_v;/z}x>_`go۱ng?z(clݽe{\h2|;qcϾq^U+ o^;ɡѨj ?{Eue;[d:XbWk5.^Wqu;}e 1c`}s׾666{窫w$~_6s_e^JzX,vw˲|ܹ_|P(Hd6s\(JRVvD,IR2x'> ŲqLI?Y7/~ԹLIz*X6YP($R[3R֧LF6I_[wSo F#c:h:?ct|:Yqf5:d, 6Wg˶䥱(ci7k'{`hj6{#|=7lJǘNl?C?x۶K~Ov&mQL>o@019q;cX8e顖;of+ã'nWWlE1{fD M;xx!7Ncn[p͵1ckmr*c:r2S`6/BP(|ÇعseӧOg, v}֭MMM. 8no߾3R믿^f+vsc;A(hҗN\kmJh @~z<_`i[d2I9]92B[p;cl$:KIPoULgz k=ݢ0Rt*h Djs5sTYSS u'~F~܋/}{>|ν[k~[6^G_~ѿRnf/wѤجC1PH?lm|uۛ|Mom_;f9kozkV$T<HtϝH'gow1Y3ifwqK Uc^{}G h۳g|ccD`&tnz팱|>t6YSSScccT*b=|#ooVt:OOq7 +|.0y\v|\SeIl&<b:5ܥ_!_[-W'&󞦫c'zO_ޛ]7|?JclZ:^o00e2bS|.4ó9-0|klwfcL3Gw57|j)&ΪcCƘΰi$;[&1vU}?uԯUy`q-Q׻W] k>pclt|?Duohd׽룓S|> !TӸANr٬(|~4qtt^rV+Rt:`Sc<7R%ɡ!N�;Ri:푭]]]"WG?nYSSSdd=1Ƣg.?.[, orS!ww۬ްs c÷mpբƅL&k_Eo{嵳CWm.32&I/~{onb:C8clK]IQN'&`h;r<:f `dM&RMN$똾|L6y3_>{] >q`_ys${jf1}1{ 1][@ TK/?;1::L& /p5\wusl6ONN^}݅J[ᑑ|>ر;'lT* dz٬$I6>YCsy7߼2[NJL yoC-R%؛< Y6IdٛH:4-zc3|F~:߆^vKnjo=;:c؏rf ^]S .\a\$n-Ilp*x0e^޳cqv$}?5  ÉdzKK|S~vdj~s-c,6˶ѩD2k}V|7nzLI.]c\ohhWiӦ9o۽^D0m,͎e;vLMMhw;wt\ … mV %7%mVS?77<;c5!94ZuSM[c>{FBpqUg2gڱʷV6I>O*w\{/dk ]7\c3ʹ~F}'~tlsHȎzuu'9j*Qd1L<ݟuvW^_ܔclǡ?w6|LL% \<wN2+$G'-wS{<uE1MM+4\\jV"ѩ>G#R%f#Sa-˿/}Kvko}K$^裏U닢gIRo>zǏ~PWWǵgMMM:u*J-r4u8sʘoԑ<uaAz?nk #綹Wf7wu]C'orɳcAkU/\&ͦ `0\VٙԴo) hS_EګO ͼ/̤V0MM֪MϾ{kz_1ƪdl&O^~Tm_DԴ^osHۇ/}x6lpuq21IMyhǥHKu(95fdu.5Tmz{,z*|\fbT{t2^ Fbu]5'x"~3g1wkppp``@|>Os=sJ}}-[.]444<99900J.^h4vJA[,!Ib1Kk”O~(oz7Kp??-13S%m]RtC5;*\OYfzYSguL %hR<z`4J$+1l &XATRR=t�I1dƘޤu:=5 pl1$o3W̘N؝-LPUFĘnߩc7uqxkO'5Jt:QdtL3t+0Yd N/ \`c&UE7.O`&ý9 F "LFhaMh /ov|39tnrpW_馛ʌ|}=sL'bX0ߵkWmmD<bԨN -֭[%Iʲ;&|'f^mRO~R\-)iJg';bz=2=~=Je23Si~si,lj$+j/פXLJqf ?;uQ2\8nF2=;OF:^)(H␕&MEZ֢ _{|>*"Iҧ>>ojj^۲eKѪ@j"Ν;dJ&.kǎF5 `l:ȇ2 v}HEeO}Ss<kU}Y]Ĕl0161z(7m`&b #{M^{5~WP*x7(]!?YT'Vڎ"zU͊ա7#zQ1*!&@(Sw]c555gϞk~oQSSWrFc;v'Q@{ojZjZc[K \ ӹjuniɉǾ_4btt6d}_*i_BQڇ~-oP31@ ]]]1AġCJDq@ @ b @ @ b @ @ b @XF/r~bb?@{-3 pi_(>f5,k2u.M ư /\Ywa>=r&&&vEJ څWάVeJ+)/z%dk=cU.%,[F#)%&/RfŊWW}^[/j[P̺-%^[VS5'}h_ǥEcLDz.mDљ_b+q]wc҃yM{饚"EZ(e>,kWW~1d Kuw%dWb6^, +Mi)T=am^R+ny沘޸&eZ^1WkӫS<'>VWzWkzg* 7V(VJ٭GO){z+)/Vf@/2bJoj6v1BVۺHChYEWR1Jq9֬%K�8Ur]RD5պ5+]ŠV@{s.:TW1^I_!WeT+XUk^>T{%Y+3ଳZ ][+eW~< y`Vf-`�yyup#ŖVX`Z$VRD *߅V @ ֧S>φPdJ"7Hc 1@ c 1@ c 1@ c BŁ,8tmi [tuu&c  dJ"pڄ O@ f1@ c 1@ ,#cXpwH͘+F'&&@ bbbBEO*^HհoJJ TZi7Z>Zؘ@XF0![F/BJ1̃@ K%/poٔ@ +)ǀH0�Lh_ cabk)ɊM[}2J@X]ղo="/[pٿY4RB1TQK}JDc"PekYֲ@PԪSR21 a_>>/QTsX+6BeՒjŌj[@ *+w٢ra eWlRuUI*PkX^DY6g= ڸչSy.`%A=  yFjv.1I@ 1@ 1a!P;:DB 1]]]#@@ ~+LI!68&cNse.FWrr51՝!Ui.Lx*!ešCvK kUt:+UCXpU@ c 1@ c yt_mU|=Ǚ&Y^;C[ӵ9hqyNxkZ5*oC3kb泊 _DX'UY%}OurOoAlWJQeS Rآ{'.QF5VJqY<M/څ+GJVXڛݺR\䵴:kGe۲LO6onBBEU\} 6#v[#V}K./J"(:Vyq:Ӟˣ2mY'vfsX\A 1֞Ha2Ѭg hmvk[j .W YuP^-z~ɟ%K;Z%t1o2Ej>Η9lޚRL2sСY~4ݘ6ܫ˟X1SZ K+V--[Ӯ{\9pXSؘE.0lz-Z=d#R-`\^]}/ Tz"_ݢY'uKsc + ESLGeŦ4ieK>ݟȕ62W)IE#i:l Pfؗi&arLoOE/{+6\ɉ-}Y*ʤ)mphT@ ,o_c  28p`ud1cX�UW%1@ FS gbba4V~Jΰ2+T=ژ ekDsLl_C=GGG}Y" N'ּ{lh x$pKG GX<*auʷr@(C<w ]G%́Rɔw! S@ 1@~ �� �IDAT 1<t:7rgkVJƫzUD<O_b/ݑ{0Z -WQp5ma�f}/M=qm-dGY;T]%FF~R?}==Jg .ZnkC5ī>.4kEޕ=Z Ywd91̋.Hg@-ްX b:ͪ:=Gԃ>kg<^} i<_ȎEFȪHxs_`)pY6,c~ kB$ 1-P96Ed?gZb}YZ\n{}b *+O{%TJ#KB W2 ,J VD:thVF7fZ>k+hl R3/,^7 s1G<z;2%$  tG*/Z]y&0oa}%>2sg�L;_.N.%ЫE2;dQ^i ,7ld֊h^7wiu(?[*d!YQ,d9\ +9_�o\QT@ BC@ V7q %@ Q;T]@ PELI[|`%\GZH$cF 6-ܥa9BBVݣH ,18C +CWW@ c~aMࠨ$@ c 1@ c yСC_T+@ , k{C~U!UgO=Cb ai ^+cW?j%>->Δ$S@X k+γ<Wo6%b aոД-i3p kѯP7c K˘Zv$Y+pް1+c NVXɈFU^7/1QJ9X<oذ\@XJ_KUtK +0c G)e\E7<yS qb P7TWA@ V7êOfջc V!,B@gaCm #c kI?1 A;::JqNT9ڂK*"Ӣye 8cVC@X!0%*ٿԅmmm %1 Tr|sJK N?k/ހn7!�WJZR*9D"^A=ck=#<BA KRyт_JG\)x$|X,611qGy@X8{K/O}Gyǽ}gGcӓ￟^{AkxQdf.nkM7!^h^R٠J >C|~ttgg`}#HMMMO<y@I*A e ZSLQiTUi10ϢɈ/M_p:@ ѡ ;>kaGȥd|c( D^e'<ʨ|Dx &16.�rD@d_vttpVvD".2}_$z X"k{{v|8*-!3a=SYf)i{{w$H<x)JU?+ve Y-Qmmm:glR1kh/bWW UnǩEb J 3ˌ10v@Op.h8x%ׁTz6nU;τ�T:\^O]]] ĪH!N#HWWW"EQ<Ʃv$V5H Y8A@ Q.G Dm~uT_t.Ǿ!S\C@H)ǹ%b e0%b1+ ht"!>v|>$N N˩j$UcV1i.xW']ܵE>tuuq&_ZYi}#,-@ �Q}\EZnw"^o:{QSQEQTy.C'j9o|}}}n;Ja N#Z`PLQ(nsA/VvTzɚCKZKa&(e% mZaVD"͡P(J`0vq 9l@vݍ#AW�ϷgϞÇAߏЀttt(".Z\N}ΜϢ&!ՎTLNDO&ax@Q)U[6D[o{{j_F">xnl`RAdAST8D"1HIs19NRtwwG"S Zn aƘ6 D"h ~�W`ވVA \�۱@~YK6ȔDXh1#pJ 2VP1DQB#h+Yź@cjU/m!3><889Rx<(d;a v"TMAm'BjG7\a(S*f2 ՘ܘ5wdqۈxp[[L~.w8)EQ%Ib9h4 k׮}9rd21dY?֞>}ZQ@ L&cc X Y#mYl *߿?(X#,J-;)!1iEp̀ IʠKDB 9!|0?pB!Pd2 SEt:m٪CP,稫rTٳ\.�~ B!0j)bᰢ(T>A;I$Y.r q:::~oo/4�DvwwR),kECCCD,IXD2k%!\u8+j%i葏aYR%=R2*3)+[9O%tw?V _r҂0֦&ׇsh:dy<ݞJ2lN$pn' nw.f6 Υ^/efe2V(!Kh<GÇ+tuuq=)|>ߏH\0nN[c=%Kt1K{ͭsˬTb1)A۾YŜgAvN$~N~PF,K>X,"^/hz$x<^1f2",6]z5 &p(R[[fFc<e9 "U ovCPOO(P("o 8%c^X\` a)p9vYVN݁N.clbbbbbK @PR"q LM%}@UjTb}ww72F"v$> DPQ&8!xAjss3ʲH$2,Xp8NX,z'OX,666vҥI033L&h.NRJ|` ! *JnIRB4Rn z~xxIQ+U( 6<y2J}qw Ÿصk B;<4ksC)eb_c T_`rt9v(%-9 =RUdA'+@ UB9ÑMRt@z<Y3cv뭫ǥEaO= ØO*5 \.(`Nsjj &pRx<x"H&Zx]HE\_===,;w. !zc`Z͈NvHdooDQeb_c T'I^-ZV+֎ @UDKnUa ,T(yXY.,CH$fz4fj\.EQ鴢(.\gSN1f3coppt¬p6{FpXD"166t:!C3f$1xCCC,aTj" / v.WhmmSlpp*tnR= DUnΧ ZN@$B0R1er*|8buRf(w@@Ubl)qU3 ,`&Dv0L$6 d6 X,f4 hJ$ht``�ϟͧtj׻}t:L&!x<~t:z{{f=s9PSFɓ'eYv:(RWBKQ1Ǝ? Nܒ㑹.\YH$yE 1%w:zQ-PikMxª|mR9*q^ bÇ{zz`'AVkk+>444'_^C1 VDz{{'8}431;44}vƘ,HNFSSSj:FL4͒$y<'Oa0ƚG<<@6mjjjiiƑTW|p!/2F*UJq ng,DsppfAE 'F`|ve"g uFcX54|/QZjTQR.;~8jqO&&$!i C<8_tbJ`h�B? FeYp;bD"F$INg9NFۗd90G,eaHx\$BvI H<N#Fni-br!VxaUQyw`vc!*g̃놾s>S{*Z(XneM B6S(ʳ)1b~cDQ i \ BHb!"wzd60 gih4:zlps b8w8}}}{fl~cǎA{@D"̓0UAP$𭦦رcll,N#u i\rBϗ)]bB;|p%~~*z|/˃l q-+=̪C:xlR^ %V՞!c Dċܼ.w%9Hȑ#6mϞ=p6nzPC$0!IR__v;v8|0Z n``�^fpl6,3jTWWŐ4L1>IvϞ= È 8~[@&0mq՚N4<^7 9|>o6롅\̕�~rwph *jdJ"Nsˋ1+VZY )ʄ7h, 3u0hT"0( 6t 5<]]]8}aj4ߏRgK4H$P4d*rSSue2@!s0~ǃH$Em߾vgYt:g6;::o3EǛ ,0_:v:6Me$aHZP(b  '(u*Q¢㗙*2U IJ\ /q5<bD}b|`Z&H|>$.X6f===)lxd! ʈlSSS`/ |>/,41h|𶞞$%L&䇇cVupp<5~N Tr7PÁ-$ "BL&fzfow^QK wɓ~c!Hs:DƮl2A @%Gl~)C|)O2D5_*yMapsO V9)>:<{1\E q\Pv@ �8n < tzxxx``l6>(QqZZZфt(=8qكbޒN!aBx< KDPS <hF'0T*ffP($˲,˧NIRcccSSSȼknn ~׮]x'H9n  b߿޽hfI@$1@Q>1X򲹪6pGͩųA10M+(&sxXnjj"@CT*rZ 0d^b tA(d3(^2h jELaB(sbwmkkA�BP8D& ךNv?y<vpt:y<sD"qH$rx<fN'ɓ'x!9ך%h1WƶR1jqyJ</-JiO +kW�P6CVRy ,/fcyz( VlD^`4 ! |@vA𷥥7 'බ6 "m38XY9V;tR)6úY +Dvb1<fm9C<kooG$):`d2pxx<^/R;00t:޽{[ZZz{{EŅ[ϒd<TzH(122v;D†c ڊoszdRѺ]/AdEE9j2(}1yxUOii427" iDÅq===�P)GGGG]] Ñ}}}<".NHRrX'*]}9 nU儞(ݷo_wwwSS5'Ll6:@9@cחdѨjl-lhQZXmxpkZRԶmۈ,OCĮ95cĞ3J5P^.Ϭb<G49#EM 0.U^ -1ՀF˲ \ÃsŰzvtt:  fFC!)r{V'*.+jŸ-K.C H,ʭmD!JF855PZ1oa O(J6E$#иsΝs8$ .<@Գ#u0ڬUHKYxNj*$VyR\A[TzyxDŮ8Hs<28Bt<L[p3Ѯ]`QY#rnM)"lSD"qLUyR61~9x7|՘$uuuB!lF^( �={ōr l6[]] ͠ッpzapd?�SW%qx<J*⠞PVӧO# ˲J0BA֊, 0֞%HlqU!s?Tg$\z6LlT \rIPohzXssqȪcD3f\MMMX 9Z{u'! {xM4_8r![dZ[[{zz уdB!Xx81 Q@ xr ]]7766"v;NdSZHvBbf•'YxHc(J;_r<V&|-A)ٕe9J? �� �IDATU!LbY:N(󷳳Wdˮ{.M%DmB!>@ �yoo/؊ A860<ͫ@#uϞ=A;}aJS :o!P].k-dxx%'.AG.O2a``� Ds;|,C ш =55500$i޽(=[(OXy�hQ_;&Ij߷ocwppѨ_n7-z{{Ef/FKXQ0NQsuFF-%質5~8ebnɷrb;C[ GbkiD" z[;߀#Leg 9p{yP -tX#S̐-vH*wr'< ]Q~4pSÇAQL&&B8?3ז"bvӛ1�`CYTV#nD"x X,E~%ܛ bY6)C93BZug֨YAIdN\P9y50q � <Vab$�4 =o4ƕ$(XO[NX=<SSSDpw$[V+0I"  D dY޻womm-A)( -x|UUHlFh4zF# .IT[[xf|>$Iuxm(нJJ<آv8ey0{y V81@>%1,m6+2<*ꯚj=L,7b<UieD0 ԍ[~X:|RX!a|EE%�ȷ!.'" F=#,B1`",%L&aztzzz6wEQ<OUU, C0CeفGlV`0  jkk(Nm6[&ψFB6mˢ,63=<R 7aKLT k*aY} ƕ̅藉 /Sk<CKK.$ ,噊+p/8QcBWd^TUmBd REOPĝ�$j\4UQnD$"Q6nxxvm4<àS\B# E"ӧO#4Nolȿb!n񷵵?ȈhDtcl6BP(<<< ov}}dB3gb7ЄEO79936!(N`Ľ띘X,d2LfłuuuH}S혐)=( j<Ь{ s޳g ‰0�899D@IcX-xaaQFzJ.ӊVZ_*AAg(f!4b~U*i]mr� oO`ASWWwI^$ )Bd>gbCcpv2 N<ӂ7HL7r9rDR)PUU511ګrXzEQPIT5xB*Bf�J\TUUMNN'a2GFFjkkO>z$fff0=5qw뭮Fio J_pW]]]2oG^544 aZcD%7jjjbҘ:ǃ'1!Ps8hiQV-{>vZ_4LEx+%1twwsf 2Rl6AE@G"'`hkkCp*,!<x"3'}vD f8�L6vnfԤeh4fӭ<\ຊ"Hmmm2$)H ;gp xϞ= %ƭm y]]]' Zm`z$3<b̑2H}QVך祻Y@\^f¥iį:KűJmZCCٳgA;::^/ԼEܡl l_IhMo3$9C9^czÂFѱ�eJn7\.6k' EQ ڵ ^qГv 2 byΉẺ:cmSSScccNUUU}}}R0x<><<,vö}4`c<KvHQo=N#7 r0;c(J=U{6.F%eFyՎ#RAR*FQE^<?A`HIRLwܷo(VC&HjEeK,K*3 T@M'|!46 >[sα1tjmm=rHmm̌^brK<d2q1 \ј&Zu`FUUUO`{"Huu`d2$rM6^266V]]=55o% 8eYy q]Nܔϊ}\�?}" !RZJSy%.?sp..p+zġEI_ |Ҳ^̧|=% 8sv9D9�=U]yx W,@UbXTdg߿3�KQ)ٌPnAJ{ZdVk65͹\h4rd2%Ƙ,ːQm Bk`6xUU/KNyL&d>QE$D:6cccFnz+H$iٌUS.W+===p1W.sO)8NXDWїԻ:?H cJ^\r-PTXQj<K,jlEEsImcP_}3rՇ}fmWf+X:~.eT#¸#_lMÄ/ = :85+ �/-滩bs-ي~AASZvzAykhh`ZZZ2DNi)=Od+qg `p`7{zzp üR8ft:r(;v0 pLMM!ctJɤlbW˃�~jpx<n0Ѐ3NK499؈.X,fFGGf$IFtJFQ|>u̙H$bX`C. it,cHÆApȲp8 {$sA_]vx? J{{{̃,xy ve ym /_[m@mmAEx�/&ϮLBF?ʫhh5Wq:wy%X"EIX^Tl9v/]~؀KEgh}2 T]ڢE}ߢmx2h4YUӂ@c^Hbƻai\/&=tww:ǏGNOOMx<]vPK./ «n=/�9GATt�ŵcl*/:644].bq:dr||\כX,:}}}N'`˲ SheY3ƢѨl(&ijj S6m~\.^rl6f  czz:a-t:CAh2dYF# V#,w9(bٹo>kL|3IU톏B:.Z\KXWKU$RhO!& d&nE{dϢBX YMѤ2l4^elL3f%ݻw8qB;'=LoQ<ѣ|48E/QZ1%IŇw޽{nTg>gյp@[['NUb=zvĉ]]]ϟ?qѣG|ݻwu]ÝG뮻>}+_?я~bg2r2[p]w~wuѣGod2iX,$rB!QSSsܹ[Z,4::Ο?o0b֭[cd?7>ϣNџw}Oػwo&vݘ6Lw(|+GЇ>B@0athqsUW!W_޴ixuuuUU[ou5ל9sGh4f$[,D"FkjjbXMMM.3 BAONNB`Z^o2>vXccnWb d_ I@m6`�8�6X,i<==FG6E+S(t:t:. :ŋv| \(0暚hKgΜob>cbI${ߋ^sd2ܺL&ySZM&S,?666w/ˍ7=zttt#J2w -~ݻF#'u]w(KecY8qY"m,Or11sB|q*ӖxW$''bcot>/_uoER>g>mC*iUF-F <{ 't3Y +Zyi /4?\gycQ<F *bF QR,ZH3͛GFF },r>w\1I~mL>#UUU333:qpQi0` e `gffl6[<G \T�TUUXBPZL)f<r9C P@X,r]]±~?rix6>OFQOṅb �6@fAo*C^Yel" EClwkWsIE|sweel c52-ڥT/cq*x.w]yQL52F0a&#T$C, F}} NkG8ʐ҃j ʕeÇ|>d2 t4dZ[[QO.,O1#[lJ3c u< ՌnE1(XK(Vd2y!ƺ\.`Z- | ǭVk8$ 뉉 D �fnڴirr@ $izt:\Șs8v=Nr\.Eev{"HRo6v&v7 ÌVWWgX"gM|PpYR={!$immmX@ihhe1Nrcp쀪/@BUeoUt(D)z53 tIe}!9_ }M(SIX=-n.v!-ex ppŢLx=L/XD廞ͫAyd.QTsʊ񐆢ϖJ*u2A>�!Q@\b1C0F܎< NbcnM.AA^^:. :L" zjHE](cڰ\.PD"l~kkk(@GwHCCC(ȃ&Ny$6KNd2 8lUUE@07B>BT!(Yo>{,>|e, MLrqppرc<h9cBbဦx@n"Q>C^2Vqz-[ʊ0h9N~C$L]ʯ`bAiUJ|(nS%kUҢ|[hRCX�@ B񪨼pP)xIT6q*:sPYd,eGA|CܳQY!@:P[$2o<x>p;~x 26GOJy:88fzgfff\.񩩩D"Ncr1n*Y,7&''x6G Խ8uꔢ(2LIey�'v+!h4F1T*^/ ~sIL9e_4x<(* #Ul _vD"صk,oKT> χ]ˎ8 xy£cDYlSTоbXTy1; k|[_ֆ\r?ʬl4V9)JQ[Y&2UŢUv*o RzgGԙઠQuA1QVUvZ[[xcؑ#G^/xP;"zXy*0*�V p t@kk+rĞ h R)Á*VKQt:m6Y¤jNz=d陙n7LDqJ8�^t .AB�qt" <RN& _(A"I`0 |^嚚n2tUUU2t""\wuӘ6 MMM� ;DGUUSO=TJzvE厎%$C<X Fh,cT^[ | RaT}sV^SEIf45={m">ôyEL"QUT|?1-KĶugD(Q%1yƨ0 p-`A'<BEgaxbѲi,@1tS:c%MI("EJ_x9$%z(6uxxxq]}]߾ #8]+dYhc`V說9ZU wv^D `ur5 A]NQG67798@\a?$Ɔ$6$jNH$QNG/Of$�1=T*ٹ\.0%>ozzwމ0h"#tNցNz!$j =88800�oDA"E/2<<|yyIt:P2~D:N Bg�V$ϟ?Z dn)^\\j [V*c!Mkd2BtJBZ__g,q~~mH,F,˗JX:䎕Yw뾵$Woc)&#|;KVÅ _fѽWq^<39A*A}[0 $YΧ5Т+aN9 dg@L Rt3,lR"Hg&&,;Rת1p72y?dˢ@'ӂOA5]߿_b? JzH$`e&&j!ZGVzS9<<]oZxYd @J_Bmp\nhh1;X,NNN8[ڎp8ƍ_?ONN f9NMM1�ǤMfCnr^B6??%E4NM4aVfе鵞Yk5,!0UXs� v-o7^m~|(ŊZ]CPI*Kb*+f7+=^g;m*\sIy[_쥩3|H<+a# 3UGtzOd:mt2ނ @P;\/#I<{*JJl7o<;;s@:Dp=ڈ 'tժEO`[%l*X&/�� �IDATp8|zzQbpNd^5888<<\*}L'Z-fyqq100�e>s(Xc$Fq$ˑF8ƫʉNoG[QaA򱒖+e4ΩR3.uJn}-ߡRM_ >UiW'N ;׉L=8Xp.,ҀC%)HejVm%?jyy<z&b#v,-rY7[Ӭ ę^IK t(1 5f900j<˗/CnGFF.//i NOO=lpلnۗV amPZ`ք{2܆t: zX$j5xcSr㧧<凇iYz  =山1R _S$"CGhi/pH4W!Nm6۷oΉ8u]ְ-X1Y8I יi2Xw5VpZ-ꣳ ._=`N;ͅk$}@Hḻ], ̋Z mr6N;Hq$5>z: ( <Db}}Xǁ~ŕJWY>.lkzM6Uü`~~b�gKzpp@"oiypp@/Pcg&JB):].W2i2PT�F/..MhZȇ4Z-3l6&|a 򆇇*UTjʥfyyyvi,0` v &'')xkZD"w}~~z9md1-f`<9+~ B6]]]|D{ oooC;ݾ}x][m궴dQ=XBTmr6 #& m3Kd>r]'Kr,#>ە&4/rҿ s zJO$SJe#-GP/ؙ9E&ԣ"ZDL0Y=.#%蕖!$[<>ovv6χB/^X3<Q% ?|G5 "/x M2u%/#F-8& !I],GպJ&!E{xX(�qlJ].U(p8 ؂륂g�\.Ç-###PN FC.ëRJ)A߸qunyiΟP(Ď@ @B] x<XEQx<EƉ& /r42V"FO>' P(W駟O<|d2zt: - 2=R$D5-MB՚5cT5&#*O3'Zڵ_[iy&u}}Y땂z0gw6ga^)ejYӘן:-=`>VNC4BRpS^9+ 1U  Ϟ=KxS4,62lLÇ*<)8+~=oXYYAJp|wo}}^Ӕm!:&p(uV"'8^ϷGD&''\X|vv622OVC (]VBЍ7)8TE Dbpp0M#;'թ%y6%vLjMaoF/..Uz''~:~w;$v]Tb=;11MGO<A &03JwmmnݥdB\${g1\]]SMEw4u1#�w\5F,%h qXs:)k약wqNP_37 \>%v\YZ`k 3Tނ5n׷jV9O7ufad&F6Fv"K[b8ˤF\VӼ EfqsYEɈ|WU7:�@q)q_( KKK,.n6ϟ?G¨vvvl#P2y[ϒpzs$sкhdfn)PnH*cccSSS@F@OdJ2�pqt:p)V7vIaxx3b'h5ݜ {J�Fr B!}oddp80=::B jdL 6-{Jj%ibp#eፚqf2jjm>)|Df4_fޮj$ d9NrYDW !tB PsO Wʨv{JuKԋ6;;h)X^QZ7DL]sM9Sq!Y^CgGEȋLFQ-j]{tbxxܼytrr %%qZle6bΊ_Nl3JӢnL0<<4 }Vqnq݌/gD"V QBjwϮMMjl*Al" V  "qHKz_1zV&Q/..B.bϋ1jP(DF# 6zS"'©U1(,]^y*dUKvhl%\+ַOcqMjca&rl4A:砹]7q.988 5]=94t-n &6_ )}nnnmm"^ )iyJZmmmmbb"3UkB0rLlvggh$~F)%kMڐM/fsmmmaaQ5 sfS)�sssZH[[[,DfĈDqL&% %n7xh1=j  P`&ڪbx|zzz䄊ihK.* `w:R >i ipppdd$Jq}d~zzI\>==!0 }ѳgϦă󋋋677#"ed@Rϩ:B,4+ 4e/a"+8d/^(IxASX^0 WYW'e50lߑNIF|`a#grbaZʷLHN�<qomm/i`޴if>Q4 -XZZ`~%P(ܼyӧCh�5SƼ&@Z6G( duKd=˰KKK(‰Dblllaanu�%x\.W(<>%B?;6ж QDw:LخE<???==CI�(aI*zH7^jDPo㰅zd@�C$%y<rLҺ[l4!dB T]?l%3sC2f � !uȓZEXAh>2GRf V~+OHgMevjsDӂlDoL]k1p/.W%E\sR>'q 3d6~Bl2E|J'AO,}O@ᴷ4bDo$*Q!WD73JGڳ`ns^b|CP766lmm94eyN-i2vvJvzwDÚ0VyNbX,dkd2RLD;;;7 pŨ>)JTمBWT=0Zh-dY4M.F fgC^'?a= N�Vm+@n P!1aIЌ4 FFFD?[ܹ**'O0a�CjANB T*Ez@Ϧ'W:R,9&y\4KgR$a?hqN9KKXor^�K^?>'8+kr²R}M=F}/}*Z15]KUgȈR6aGϣ”9}$(شm6/X༲B7qHE^ggg4:6EJ%MMMA (<ɦJ BIoH+q}䶤胥6R7oXa5X<eyM6ESV@nCxj+}*q�n!�'+`u%9s"{ONNjZZ8==o*JZ��"4#6f5m^$@;0090TAE# qdш|"юȝ|wGGGl MR8lM~_CP8  &Ѻ' {PdhI9]' F~NT39ii;{=YKK_uB-Us%Π]G#�TCiet@af d@҃V'1LA^CMb+ O/dT iMN!%@flll0 䘧OMU+- ȏT*t( HWGGGgggyi/ lk\.CLdB`>dZD">vR}gRgPb7 D@ PTv�/% įp dl||ϗ>00ŷMRd)9,݌a= CytȀQF:'ƛONNdnٓ$v*b3[\\[ےl" =wRW'O`5_SPX^^-虛DŽgc`Y KyWrZN1h2"by`匿N3KY鮠[zZt4QQ,>|!=u] zk{y3kIZRHF6-L%L˰1}cqCnJ666(}O<15ݾ}ɓ'g} *rݼysggG%!ئaj-os飼w+ "Mr)xGQMj\.GVlNOOIm6P#Px6OOO$?e"͒8,exs|(2e/ 7aiDh;.//a&x&F B@L t-$!RR hZlf{8>>%c(4lndtth{{V`4;i![?]?ώy ITyW"@_ͱvYOHwzY򼕑ig {qf>&FN^J~VfΦS畒‚)w"YiI͈& 0k޴4!- 3-s=ˈ#rxGTzbUB6:nhdA~P`*aR)s Ϟ=ÁN+,w3V Ç?~ '\u%r~j$Js&gggp Hrt:�&KPP ܉�Ȣuh38O X`ed:A nd8Ί(0}0GT688셅tvaI~@ 3I,@` y.+QɗU|;|Sc{__jMYwiK,7$ѐilʵk]vYd_1sHm]bx⚍uf:?9db%1QdsYk(7XM:˿H,y/#5b$IǃtE�IgI[M"^zZ@GZG G/n Sta%e??E888H$f31 3yf<%)..$b MH#^ț&J<X:ZH$B/B`zn�(LkZH0)·FA+˰)4|.%k=ϋ"|W^;H$"&mgg7YD"95Dl95kT gI;31-Z ];uUt1yC3خMs:u2 VK͉0"U[@>899 DZQe'LFj\rk^tS @U[4tN9e/AFz#eԃqUp*4Д<3!M?mnn...⾙H$hv[A' F"\.ǵHTVô)j!f703K.jUU |>S92@ (ώvH$ФyttOVjA0|. /úרW[PNh4aG#R(t:BfQY=WVV?~r7r~h5:αZygElNAL$V2) ^+]3^?:鮩C[*dܐ\a55愷̒zM^nWrR~8 >x`ffMX/^+WgS&̍cxLk3 덥(+uH( 4g\(dkkk ȥ̔Y#=/<|9L2v|љL?F94Md'YN=zD t:YV0???11177f[ԭ[xR%022ҍ7e) v{dd' "dut:|>O@2$csp0L&LHZ--:ƛkK*~GҐWV: C󎍍q.>r>/'h4(GOdC]l<x^qB/l>Ki\B011<K"|oj5fr٬}[[[FJp3՛jud#E�3\Hm&hմ״b"%1Cs&N{NHTuDmEE"kvj]Wz} Su2TV]wvdv3U˗e H8quuU&_QJ:@Cuu\6MT]Ĭ\\\D!S jv:tH,d A!8]r!BAV?M2e/t�)HPLfnnYNt(hHlBprVMLLywwwdJ<~ $"*bA&Xa]h4WU*Ig=ZDN/ !$/|0r ̇I #ZywdXkl`/�Ɯ "b TR1BPݓM^\\ij؄>x4 =yѣGLÝ\2B,mrfML5͍ Mv&GL3f` h r/t/!PtibvoM1|64&Ml\S#|I`hM&)3֒@X@ZVgrfggLMMxbvv62C$vC{'N#в 1BZ_JU2GLnN/YԣGZAD|;PeaJfX/Ck5:::<<vә�!Ƹn| R%IXfʄ3d@Ndm oZ,oA@wT՘D"#WTk;8U1CV R" 7HfQwz�� �IDATȠ+R$ Ww0By<|>ɔjH0xf4elʴ� JZhm9:\Ie[u okw-;w%EܻZf)|5`. Q\zڄM2.oBڌo)i劻S׽b)\o ,]"2%@zU4jMllfaGI`RfJ{m61`7YQI;??сk cXXl6J%�[dH`X,xPp0/],``5Z0zF:dDBb\.WU%$&1kb�%+-)P(trrC{ `7[1jP =*V522ݑR09 \c$Nklw;Y%ex)Ln"Ca>*7 #=wn`|AOnt >Mk Vҽw͵8kxψAk,Utgzؙy";ku渣0^I%k6�ATw*EzHon_i̷^/s@+5  j`-߀ d؟J�)VVV^/]W>;2Գ l6XXXW_b> 8YS+ ycth\^gώ�뀤ǚFeM) 'K ODyvv]DrgggL0VVqNE 3- +۰VX  %(8;AR@Ӭ\b{ttTV+ ݆i4xmde &?AFAncA|47$gzVFGFF6IQ\.۷DVQAb��KA BP'?O777GŠ@Pbs2+V88vs r!'4+{2qk] r;cE*G4OQP0+.9\0}dC=x4P6V Pd,IpL%䭬Pg8bؘMs<!M]|cɤEbD<Pm%P3o�S/\ H*@$}] UߟdZR.ƜLlΞѠ }>8Q&5{GcYNJ̲a\hQ0pvO&Hd-o 5wT*( F28-K 4ꞽ |. j>)W�E!t, 1t@2D;;;t >fsssV y}@8D @9cد~+n]S9*҉bK# g〛 ̩`t볧ӄL:15]Klerpguלed2"]ӕsߜo 7vf+Vf25_ (---a ; t-hee$~AT,oa d&JN�333 ܼT /..\oV֧)ןt:c X`$"=Jṯݍw4 lmm|>ΙD JΝ;F۷ojgϞ^,FI###PcVA )bKoNOOW a +R%8m  BuT4+4Dcs<MӐ 1Vtlcs"唷v3ĄVT*밝^J%. cPr p px||\{ӹq$d8l7o$rIh 69Jmmm'?fQ%X" -L榹WА!J$`)k04=,*ӣ8>sZUݫdeMkcU erzXǜ<GuP]?w�F2@WdR液5gUZ}-(}Dgggq*UQBB-ʃ$Q\]GGG>}WT 9d ̅+NufT|d,\.XZ-pT*%9O<!paT*ST^d2HRLMod$d 1ھ099jKu|dP(@<Õgz(HdyMA$*f Z<?>>V I2A.cw[XĕDEz+`o(ihpi%–J%xr+ C)=qdz5L~Bҁy\hIvޑ`,H###:===bzΝ;Ɉȵڤ鳳ܺZ If\nD2+td` ?Y%6ќC'pdnSت(]>Βj,z-Я\�ՂZƒ]7BºwmZ:g=ȇBږzmqqq}}]766x S j`Met�zS,4eY\S(>}ʎe,@-J.rL2(֛ȁ@ie|f&D|aKCj5�_h�4):::ĉpߤ4bCpڲ }xxxjj j<͒90?"]bT* bC abqCDD B佼,X"ˆaippgjfz�-2>Λ?Qr|> )ץR\.e/@p&z<\.KXIQ ]fEJpYP/b.w gE5S8D"199ɥfdDpMccc'iqL<}.gll;D %f$5Jk-0HzUAP)ͩd}:[`u3}M饈Pҕ3 kNUgПQ_5YP(7yH4N8>ÅǏ8Y?/--'�dQ X?�S>HheH|9g~EtB2nFSGZך_YXX�z1'r=~8ϧR)f;< j}VWWC"i?fGGG$!3>>NkEey(f m2+kf NJvEa&z$<00[3 BAm\' R)<'hS4EuqqP@u6gm0%sz1`ett#]FNI 0DELdB_~%ߗRW2N1׾*?X"]矺V&Xd`3vէZmG$gl5NZc>zH2ZflJ]Hz˟{c@$ TO2򴌀>bMUn@mcc ))a BrX㺌-:5kKy;`HԥOhhhٳg)J:MTVE"� }Q~wwq*$,CBBAfo߾̀%?Ra�-� )eY&u);.Bb7Pn#r\vx<CZ—h4z|| mN0001v{ȍdxvww'''3GvjJQ^B5IZl67n"0svrI*!*)FTp:99xE4Ex' [XXdEV]#w"6gnւhlY>W]?XQW*+-Vcu2n&z}3 G2?^BGP7QӚ(SqjlZrBc&4٩sbό �€1`=>O|^huYitٓ f\ |䪄K3Q>LbFlbbJd2 {'''v.dZ wVCYz#<"8E8-HBA�0?99BqvppޝN \.0 2Ѐ4kvv߂�}"(gY`rfu�"x<D`!UsH�_}.9O.J\B;H[VXcՒ+qH&3<H&?׵D[$q갮AFjr< ~8gj<K}]Y:w5vugV-ˉWn:9a"^J$kAn+E7=WVV<x@(D$ P k@́;m`)IopB0;;KV0'<բ.,,�U)@+7o Ϟ=jkhHNS8ZJ?R1Hk|xGO&$NléL`RˍFIFsGGGPGzgt񀮐$0t8!쪤 R\.� FS;::bp dy@|\.sVNZx<8""kuLV�``z/$T?;$f~P/|YX$Q|$$>_1 eюS a}{tt]-Ɖ/H Q/64u]g4l.*t54RRw++8QzSwu[ye%YmY"39k{5%54AG[=9#m-iX\\$a3hZ|2'¹YePêR}'f|wsDk,< qpJ�@\.LzhX IJ`@0('h6766L& p݌ #P :k4m(|~ddVd[~Y .G|F|FP@>ր Tvs3|>H'3 DGZ:99I迸 x&t @ �QbF_6\4V9y7`:d^B%Anǻ \egYh}"—}>];W?'Hrzuu߮I$VgKk91'TkC#gy`0 z~~> r"e �ҁ!FOlnn�3'N ? HK$tM&>%�  GGG,X[ZZV*@0 ș>}D.Go{{A'D:C b 0wvvkBgTB. @ǀb'DQh4*˗/p88e*10J|ts+LS3L [=!z3-7p'=0QVk6w)u,o qyyY(`7@*<ߦLj}W, xE*,x|>T6=::Z\\PMe&ۛN={ƈ,4X @{PrsKH4?X�"9f~4sک_^strY[{)BMοەL]%cvW; .0 a 8 u~ w~Ff' rs~gccI$R(HQ< U*>q˱Xlvv6MNNFQ`|=Igaa!JL&d&> ց7͆B!2 vP@z9l{^L.ޣsN<#=%'`pp"FAœ\.wxx˗/ $3XږX_mDvD ^DR`M&�¹2�ÌH$299I8r㜡+&''! CCC[ ?xFǦ"r744cdƼ]ovML�" v;99yB l6oݺE!x X4S$hFgbbBR fBk5'.D ZR}%# ٔQ9A:>uXvtUs(n},5l}}>%rbQX?,$0ԐR5L&bAy7L 9NMLL,,, (G0񨃃Ig$h4 vgissjap|#333?ܹߨ3}>_&a ݋�d4 xhhޛ"^G"v<GI BH$߼yS4C# (J\QM8h@w+ Ì]\\CFD|{8`yvv666&j`a M^c&v5B>' T4ؗ"{m;${HYrCCC\nllb1EϨ* BƛH.(+\VKwąd2 lSí "j8fyŦߥSd >Vq6'ca:XDG]̲2~-Udɉ8SX.W]ZgI_\.o^/G/ⷿm/Vw޽{]^wcj5j^(޽h4tO?;wh4я~fWWW{{q#wvv`M333T~)EQ fB"r,ѭT*Tꫯx<PԘNX,iV_anp @STњB᳿STclyxd΃f˅BE+t80EX^^~F3<<<99Iiwy "A=mR0bX\p~VϠ`'|+Y9� (a(a&%ڑh4o> /s\7>r>gSA\&bI,q]^^29 3$'׻I044TV ,Vk߭z_*FFFn7;&mSv|GGGH0Pm*+X^^sN:1Y S>oo|>{t"@x s2aDJM񪰦_|,A?s"畟9K3ɿ*F?u:~'|b;"*lyLϿZ-Urb`nG~L"g޳@5i:\2b8go#b'mE.zGLUq$Rヤ D kw!bL!<x�R&YZZR=;;K!/ʈ455Ni ^*0a$5Z@H$L20%,v@Zw}7JMMMaI�ujj* MOOfgg|,Z2<22ǩqIjP J%l qhm9F"rDEӉD"''',DlCCC^g=!K xq)aejH- O+r&Id97DBXGI$*_œ Aa1b>&lwvvF#K3K,~$T'J?WUVkS[<BIat23 ��gg`X 0$<]?dݖ u#YsiLYO|<ͦb+}3}.9xZºv_:_|ůk^1ql$???+ ᕕ>hgggee? 뎏?,..F"i~!Q =9*�� �IDAT}|&S@Vgj!f7(['Lb N'D" bG8D"@CԪ| P(}>@T/"ZFP(^icZQR H} 'OL{:H'k'o)C1;#@鄰b|||ppplled{:L8+ϘC*̇NC_^^"ق`9stl6;11p qy)\CCC}te3z>* @ @gjvvv<x_޽{ݣQE_]]�'Py߿ϣ kāw 8`Xp!EqlJ@DLČ&wo88<ZWE)JA-:s._eˆ2,Hs9+MQ2�(e1N9& 5=33#$~`Ob ZM?Q]`�D>ͲنJ (/hL4]o֤`9>>[eE�'&&!ٔ{% (Pr9v�$ɑ q|Sqzz?|>]QjXL&~?Xz<d2 t鐢TMF,!a2MMxfdd$N|> LNN*qr1;(%z^aDi6ҌU* PAVS"m�I8K'1>::''|PqR)VzP{si嘤I#`3(nZX[[3ljyS@L^[x3p9GNVP+mv�]awU^9�ѓ|cd9Z+:X9#Zp*BS NۨD~E`0|T 1,fgg!&&& *'2ED֟~D`MК_:>==]l26ˊ".oXG}`` z>g2s8VTR#4qdu%ԅ}5LJ7nܘ'UPoAp�/H]3bmp7Ea3Ŷ>/gBvq€?88`H'(rr9uNh{ttD3e:B2N1*38[y8g�>Q\MYDf!.™R@gա@[\ GH%u#χB!֘y=S+y"P܋Yj nO9k{ YvL]1"WfDr]Lz=aZPkb&3vBv^͘ne8\bMΕ]0Dn, LqxL'w>>!uk�XRl6kcUn 1N>Y]]&/,,h2#<Ka)bTp8ѕc A%2SxWiTL&U0E{F58�TC8f3'R?DrftU^$7bI;!eL/)~5�Ë(|Avww*uH OtƯ�Ѷb |(,XfL&i8m HPIQR@5@ԋg #/l6jڭ[yuBYD?(#g|7b(z:O)ČFhu(̴\uNYwZs~gwuYBŴRc ߝc.̈́,Ր {)I޽{wffF �8;S D  2B�?C<zBᗿ%b/d_{I 8ee߿>{"߿./ ӗccc?wvv i}~'_|~Fo(f>gQY":t\VE Y<HDфFf`j�bR-V5LNNFPEPi\&fhh vcu<a#.]TX Cm&(\C탃tWͻný@G棾Aƶ5b~Iz3hv1+0&0 ?t@$!ΟLk%raRĎ#p~blܱX\Q,͡FjVVV/݊b !cjC' !l6˃g@d@dh0M<$"+ kqsprf8J(f*/`2&qpASk97vY蝾N8K6}<uP:<Asss^p_`XRTlJ}>4�ܤ8zy`GLFl0iL 2@,BCOD444�3-a|D9&~BUiF(DJR,󧧧Je{{˗GGG$擑NMM2' D,Q_^^:(r|||KD 3ėR0Xt3I{{{$bH݌M\�aGreA&<X`zBA2PV4''sR&5(Pl6[NOOWv1MB_ i(I`gd2IOX,fgK_]8J$Ms3^J/KL2y8i$KKKjFlۿά6W횑*SUًed5:] ЧTfծ]-:-,2GML?b٩2`"lr L&|WVV8tgeX3i4({ppp C`AY&f WCa866W_}dMTb'''$B64 WlÔ 7JZQ�ĐɵZ'%T;==Fxmhl�j# ###R`ժv7HwgJNԶ~?JA&R)V�fTV@d d"NMMCXZ6 n*ujjIMOO *JN7(zCZR 欜6אJ=qg2ǏCeq;C "e+zbe&嵵5h92P]/ĵ } I?ˢ{/b{2&wk;;+*نѣV.I}dKtSkŒ ,L"(4/U^u&NIn/A%GGGv{}}. K=I333Z ,m5)CکTlbZggg(0͛75* ֯QU7&BGGG.x_;$ڟDS:6P,{x& !/..q=CX,J/^T*ϟ?' m~X,xbww7eDJO'}9lP r%M۶Wz<j\<aJNE #&r06A9 'N|%0tz5H`̅,}hv$bo%+JD:00XCf ?A/*[E0nr\?jX,WJAϤ2|M4l1sYs( 5<b*usmI&;1ji,=qzl(u%-XEYdcXt}A0ѵK2ϭA1NZ CMM*fuDDK&luud2L&౮nM08 JPܔ/�D---!nFry{{NSr"@Bҿkm�9$_Mp9+0f`>�UdN>H(VO> (Y<yH\֭[7Fk1% 8tjY.."bNk<!ĆB!RTp?e%` qedނ#H 9ޗIhhRe&:9&ȍ�pooRbH]`CNT\7h7].䤆lPf)n:&''7$Kכe@=̊}>2n,||YæN]+?-|%TXҪ-5eSayf~~ݩ5ýȉDue ԕTߡh>NU-pY⦅kNg]Heb\l¡a +*)&&&�%If'iV{y[o-@e,ϑ> G)�" `5J (%T*UHf腰--v<?<<|q8::b)4ŵb{<ZjlEAAQ(/..$�)L2޴|>"sY.{w=99EÃ*\403z} |#H Y*ׁ+,իW75>@(8|C,Fce9\d2 /1aJ*ВBS7([0 $3ܮIR�h@"l�Wܦg,[>NzvYȹs͎&g'd~!hAI7ڵSrkv1-sM{ɹ2l4SL"4enbDP(2/Nyv͠?U(~22,$S= Ze'>)fg82DvD"Ԑ~"%6LB@0Dq?W:E4X&\\\PdF|IEIȣzȱuN]V ׁ�Gggg ^55w:h4zxxL* K^ OoƓ O=p'K@ntgCCȚ^\˙IV$f8�*} \.$ pWw?jXU0BShdvMB& =RV%΃_NZ#aLlk餖b!(\-F<#E=u]sA7H'&kYYy%uz+O�}f[bXZ(s \妳k8rb|"`&ݻ?OMU+g%ٝ;wpr333 :P(?e?9߽{???L&wޝfۈƍ<cH+ʭ[S__czNovhh FEwΝd2_ߺukss?l&D"[[[h4L6VJZʡ+J P~g ^P DpR"%FzO>,I@szzvgY-%U.Xؒk80?s=b1#Xtj^ONNj&"/#].w _~^:s?�aN/gY D>==7/HNT9;σ0='s~%eCK^Gà vf"@Öx;8 ?$;n, ݡ‘p}� , )RЯ`gxzz 믿@O@ArmmMN366KL\{a_|eOR<A]*)�5LU凡fRK)cu/r3֩u%\ Z9>˦9΄կ8G b2� & P9f<0 1LFl](>} ,UbUk i(:88;;;c+C4$&}<d;`MJf Ve2NXD|㇇lb WF|>4J]hW`Aj1Z(p%C.1Fײ?E0B _~ZA"z9==�0:D9k4Ěd8q0X#`j:l,�W p???O7n`kHnb[*ٝ?h+Y񬅾b[n|>r4 Xف-sC2Q0%*PqrC�j6jE&a1zaSN~k9E:mbNqذ,¸r,<皭Md98QRԏ.bEsK� e'^+ P2X\?...fY8CF� ZP>??ƞ Zyh$SSS&J"I :hg@1VKD"C2T@,!, j&ׯ_3_MXմ,̷1%`\JB>::zX dss//Ex2>˝3'mp _/MLL�p4pP/^ܼyX + ~KST@jQ@ Lףu``rR8Fzxx0$%<ߴ1AZ 5:hptidj>E*Ւ;{eSC GX__Gʰ_Nz'GP&JX>k}<,(7ɳ/gmSsN7peԹZ6 x>?}>|?%+8'N3DC ~?7Sbo3RTLcA-駟pss3jZ 5H4(.Ç*: 1h{{9vj5`8\\\$ 0j#PpRH"l (M�b/|ttίm>CCCO>W388 hG� {= <X 9֖녷"B(FGGoݺ"h4^xAVޮo߆x<XL[ۘRDGK:j| -<ܺuP<ŋc$TCNOOYьc]\><<K&"(~ TS( ߛPbcB&@�/\'hy 1۷o#H]\\4 JI_^^%1wmmmkk m:vܒ"U]urt(2sKi]8%Vxr5*XfMc #S,eU]O0g]#o~ 75n|ZLLLܸq#4 EDXcH-5y(1(˧Yq|,WWWswww1խ-,_nd2oEWY(믿&x[BҚ�I2iVT81x1)dxx1JP46p8 [ 677D"L&CMJ4??ϕ'ʋ23c !CA0fgff2 lM g!('x(yQ!xv&!^! IZ$X,2͈lq =*Uh m;ʇU{9??{$}'=%閝9ș`ƍ3%VasFDѣG 6βAK/^E}9ѣ˝ˊZlՃ}<<Do-M[LB5&ˊT>EdNn3} XX07iX@WwfwܻwO>H?EEwޥLSnZUk`RzrMOOv;L2nris||G% \?D`T*t;yGb\0}sN,yɵ�� �IDATn~&&$2  8 _&D !i^ϳ Aɀx<:�###�xzcnNhFanܸAryy!?yB^Bމְd2tq<En"^ejB@\c Zx|$nܸ3#'h[bl%2BȐ# KQ9DncDJR v%B7nܐ6f,Vid9|(P(/^\oL�#x2hj'ŕe }>24Z*#9� q8b###..Ad >==#&R஦)=zAۍU.pm1Zbp0e gW<L79Z7NYsKu;2'm]V{Z[zL2݄HeNHU3w7ݷig?Buiqq.x||Q#J$: II k8� @bO6򤝝Fd2ǵىF|__mmmy<~.Ç烨GO>Y[[?޽{xn@`K#BL2m-ǑH! Vv0zXi_zC.5ﲽM"Psqa^4D/_H$R.x BE`[tvvի1R8;h2S# )7D^7>>NDG1Flۓ+NOO3\O B?3$I38c8"ݣ#@Rںmo&b`"Ҵl\ ̓JRVc;hXmoVc0`l 68LˆNe&(I&2D4!Fr+.q]nb.ݛ:JVfF˔%l}s s1J9>>>|ߟC.,psٵXp֖c/ \.b1_5DN2(8 fbzo޼_ H?Nsrr}嗬5Z5]_:ihEueOsn _+A=u,䴄NwUx_]PLY;NMMAGA|K.rii paI*G{);@F1p�Ug J$K^U5Vwwg}m8U xѵA|fZcc!&o.c2)5$\.4PnJayyKss2$,M&ԸB@0*e�� *LGV,WVV8&PI+J4P.]$si.)lT 0J&1(|L6V,BL&Yϐ VUv%D/BLXJ.O6^`d٥`0CcNjt_DSF|g,'{*(0!goa$9 ه7 )}1Q`ƓN�;_}0,  L&Dhq|,OAq;OS]GX>s ҨdQwRgpq/^?T$ wJ"4ŋ?B!|W<*^vb4wcyeeeccC%bD"AaN juzzRΒ ˃-'3>E<GϊByaaAVp8̭l2fffgG CEJ(:0Jo~0 P(0=r###|Z622WiG48{Aumxxb088770d@HP(lll " L\@ #joo>"Ҏ777a P(αDy<FHӰl}}}|^܊@E(>rp\;�C[sss1.nDIr-<Pr?*mi{zz@=*-x#@R~h~?1#(|O>REVjY`O% EͥAF*bij5%NO['ҘOԕIޔT74үg|:t xu?؄ ŁF~1UR9 \wȤn7,!IBEAD@K )QY3Tc� nnn߻woaa!0;f>A-zeO/Wl XMMM f39B 1A#>::D"HU˗ fNs3Z烃X '͉D)a`kh Jj{X,&ㄱx@u3jX .,K#~ .ef xHNxXzҧRX,9pB*'\4`0 `ISFnU<`PPcs"$;:1 r6N_aXC7::JCkOaab^"* V\s zr] Ԣ?ɇ^MCWշzp?ź }yܪkN'*"lSkbF^踽P(0ۄVv^"R1& жM&\=<$E*k!EF4>vc_ԨeTIaHayy9 *x^qDop8<y"玎h=]S&[R)"éj:Nǃ,Lp9 XV(�=L*6+Pe?./<555!Gr#P[mweY�$a% Ӊ �!fz�bpjmma@wޡ"_rg�B sO͕GAu&)J d0(1s#\[[+ 쏹U8%]|pl.PJ)*Q!n;33# @(B W~D\fp*0}@$(Sy jMFu$A6Y#9_?T5]$`1U}VZc*b Bccc@ᴱP)9X!xFHeS7jjp 0C <r8n!4Ѡ wuuvBR6JB*(�H)l*m pZuR1nRq@|N7 *՚N49�:/q`҉ Ѷ6y<s!@ czңf#3mbMz<Q ~ D_ӃtN00ky܁`0u'Zl;v.FFz^L1Cqpp0<<lxnn�j*2|Ğ^6Ǫ8 UhEhC5X 3 .i R$=n}>#RwM\W"w姎AR97\1W5uT";z('M34+DZz<<BFQ0<`@Z5G6N'eIb;Y枈>OFp^\\䕝n; 3:f2E3ؓaW7 cWW[Br!xbw?"8NYg+L&{{{)"4wb}_}ShD́~޿ۿ%X,|$fv5-*aNI \ 2HuU@2$Y[T*M`aN_K$t&>)HLkoo|2B /r0)@[11O [ :0;|> ~ -މF&I? 3؋Hnx[bP3B<{ 0 efffttTs-t\PM&@ChSQT 5T`]gׯ7P_7F-ueqc[G "x I *QU�SЭ,<-I.e Yx:;;y&FD޹s?=/~۷oj``( $p|[I v8sHFFF<y z3 |mvFxdd]XNsl7f1<v?^@;rr]Tn$4|2 \J&.]{mnnڲZD577c z^000蕥HqY]r ''zd2a"t:vׯD߻wST*jb`XRPBc|2P[,X ~``]~߳bT5=2d|гWnoo3@)[O{{{h+ljۆ,!HXPPCE[ܼ�GXa͑伲�M+ǤE`v-Ipv"NH2FޅUwww"`777p8L9�f_p fffn߾ͤmtgg'BĹ% jzy}>@t^XXb%S]eK,M c6u0WR@ȠQ.@\jg,UI9*Ҩ+Wj|�gff~t:^IvC?!`apgϞ'^<WXI|Zg,3D#,3Xf@k d̨%v~~^\ESqժ_]]etgI$8% "qlYhi< 0{`U C=3f 0U!U'Q|8"~3ौr!FBժɷ7g/F0;9:VUD,!յ X$q\,|d2gbCCC?Xu*/i8)tzV../gH$0,0Y!h\yC6 ^15#16^gSDVv�ƂAl8JM&Av`Xlzz׿xXP@|wlTV䉳D2H>ƲAc-H[<M-_w"Yw^W`/63.uE\[&z[\|{77.W=4ߺl� ܜdͲl\֋&{G~=5އPY9M#J]9cF"G<<mll&5WZ &!@ M%NV2 RiiiI ؐ a`er) Btadxf]ty�L:8{Yp677�}@4SX__D"!a��Y4̨fsoo/*n09mðWBHqsRIUФ3OtttdV?Y@e=`5A-ʯP(i(YJ*V p~yŢh|J̣HUWVVX>Q'Sa,h=Ho{HI! _&q@?D.gV*TFլ_z5M3QГUI ww,w*pxTI388H�=TP  XZt2`73!DqߏQ2Fx4F1+E,`BvY)@g{cNWWW'%fRݸd"ͱ0O~21Pl8>>d2㚛cӀTPHJ%rnmmU*bHg?ج& ;+W9nnW*jCCC>VG qiD-%OT*bj됌9U6Fì}}}J <*by"ҰZ&!1BqzzJNNNrH6OVK./2us1s쏎NMM+ݣ=IY'Sv)yTrc]կ)5HePDP/Z/+h/r}{l(!›rh4 yPu:}j�&UWn>sҞ[]SY̲dFїL:j`Hw#]3uJ%3@`))]]]aD+q`8@Id2^S@sUbʕ+Drͮs&H#q1~?P( h~*oP%n\Y'AbZ777QCG&vi!oĕLz"@K&\r n#18 >h|8aͷ#!J ŚaZ! s2FFFN'Y _@`Smq98aJ,lYNOOHK% MC~7H ZSgγ˳4.2. ް,OMҔ8Mj=;mCqX:oRiT7(<RT+Ռً ^AN@ t<3j 䧟~(>~֭[1U#޾}l6G" Ux<Y,O>֭[GGGx= W*k׮Y,όg[nI>ɵk0SB+899944DpTbώ%yH^`H$gu-cX^|wvvFB@#bYH x�B`ۗhr/_DjDbZ<vCxP& (`I0K�+ooo糐,nJ%ٰzaFw ՕJ jn1dnnnNRu;;;ĢD"! `,*f1n,ZHؚ.hSx#%@9%#WD6RxPj523:<<W8bs@7Ñq: |UH|4Á.�Vz a"ȼڵk2 T*TV-R HnH8/W>IMLʦ %炪4wBF&zʙ{K],8t!qUΒCb9gIinnY'-�Gz;woݺ555u>hrr2�BF#TZ<W^ᇺ111b Ֆ�"ѣG{{{" %%9)bc�Jx^!N v}{{(jf3BJӭ555y<ZZZzzz:񨃇a"8r\f4`>g>o}!J\;wѤIZpxddDhM#v;c>>0=Սj*!Y296rn!j$#eR=c} CD@5d$cNErwaEnjj{{{Z 7JJQ'IJ 0Ŗ9ǃ.TuooL5NOOwwwIrYɞe#m>󕛄 LqFXz*m6*w܉FW,ܹc7±@6RTsh*esCS!8&֢^AoUHM;?na_TݳO*h>nKLInrMLM\/ވ{ŌaJFp\Rjl/_bGm//9G˓f$LI�� �IDAT,K.c$ *ɓwnnn澾O>dbb"Ja1::w!zvv>"B=EovZ)J[[[1v:Lbƙi4_~:4I0"y<xj5F/_$;�%n3D5]rKK C$ ߼yt:vT*eZ+ &*l D9mG]Viqzmh_~zY$ '-<C {h|"8 p* Yp D.(ՍUX@244nxkk`:d dہ,· 9�J,;?֭[L8&:8ׯ_XmiiAT wݞJ,˓'O_t:_zQ~ڵD"A_T?~LNR�=B GHRd'{ #JU;UL"߸RD0[u& A?�f\AK&''$,=qy9ϟYME5>>~gϞ !y2Up�msχ"LVIyمq .,cm(C2f`@A&je�K+)ta`L}df)\OpJGFبtP0~V@Յ5@i2DB ѓנL ?Nv*ݞNc{Z(0E%'KhrL1X”c>Qi:nhǘt3^__nŒ3zc+ شz{zzJ&S 2pؠjFz*U?KyE`Rg~MMR/65L7}"<߈tq4Bgk4BL8Cso TL51u`8.܃,466CVH&u8Y2ʆC{ŶDj l}>ÇRܽ{w~~Jp) u4],!zh4ʪ Nm&%f``(t:NɣZI)D,S|>@Ld-!G0 q.) zuvvʪ�ՊI)0X p8D>+CKv6rD^|"yrSL/z{{oKKKMMM;;;?RkۏoTy2?;rLP\s0%N{^Tr\`)|@7^&󎀙LD(X>cn^\\w<Y\ČeYb~zYjoo省FY2bhTLraA[[[Ha0xXA-'źU $XS='u{Y&X璉_@jͭ):vלTQ}ֲU_ YL 3͈CIFPdsvl'OY!zcK.HjW^%x0t8ym ,s[(_^^?<<7얖D"}͛t+|Tjggr5<! =)5VvZƦ'1~ '�~e0_ A_ʨW*MMMPҥK??Ê?EsyyYN<_rh~_xA ~:~X$3C\nz y $1&ښjjd2EtZ__gd0X|{{{:+gVA.www>(P>jXgh|)S6|TI.,rpcl%9u333?OndD"NSp3}`G)ܸ`544Jf3FtN!`1[S999 ˗1!x&=x~l6 *BlYXXؐRW*X`}o(}#k2`"/u'ނdB,e$z@<:]h~E=|όA}ib>Ur62rQ7Lvꗡa1i085^tbb?)$_ J]z֩cff!bGFFdfm=B`.C&T3!M%tjii ܯ0\~9*{{{0 pGhhf]]]r8Sh�pW(េs"pO;;;}>1TNu櫅Bi>| E>|''X(?~͛/_Dd62ES}I" Ï=:;;+JAkVD7|ÊE ͔(Jqce<Keێ#f3D3 B Ln"a7"t:ɇ-.e5CϘ=0`DzMeG*.i9we&p%Q#T*ߘ`͒C!ٌj gJ5X%c Pn7(3ּl68^2NNNH|OLLdYǰ r:|ɍ7"|###hM[[,םˤAZ J%k,+S?W'5T% i < 8m0U/Q*RӰUZߩbN'-aц*A,,h$Wpfe[Րx^J,QqCDtۊt[[ E(ˀV48>'I>E Ab[�Am&(6s_agff `1 >W#h4xYv8|Gj�"EHi1P(dX jůkKK zqQiȗXR(1ä=W^O,Jf8f`tqpg| :9ۍ,ζYwوڱZb1D ! 0 ETvf^fAp wX!ᙊ-&HVD%)SRJhx<n2T@[=!<y}yjyyj=ORwFdtuNL #dfY~.M*HET$J@ڪ_�"4J*)VJ7N'!@D0FX<Ś?l'l6899oR}/IcKKK>hy&I@ 3fsOO嚚u{p\۷P[[x.)X4wZR]#l6h0Boxhjhh.qÇv,r-:>D|rFv?s(4T PL�l6ј{{{###PH1#|8@NL0G '\�+Nxh =f%ch4ė-LPmbrztܐXBi:dggg+O b?Dx\6P)@D"a0zzzL&P\tmt<@+[X,i2"ae�a ˾ :l.#ݻw_MLL 裏/QqF6}'|k8ȶ/fffF4Jɓ'–ܹs1))Deʣl/(hL1zL=^:rdۤӳ, uW6#T|LBL U\\Y' 05Rnhf BLd6Tzh7oޤadRT6}>T ;#l@صC '&&?~<<< !q|կnܸ{\F ΄jvrykk sSIa4XNJW(sZNtRpq}6ݥRX,2ݵZ+++}}}_2Ƨ}@i:::j0'̎hŋ"Ss8o "N>|}{'R dOD0mmm h Aʔod'''�PU4kd4(8C�UU w8faTBdl.444zkHN' r'ڊnJI̔Q$?a?#b\F4ltܸ&l饘ORÁ5!v{?iggSod\TIdQ& Qթ98Ȫ�պdJ{)9Xj(BnB'z{"~xyLQ:/V&tF ThdO>%nSNggg$BîQ=~db^/H`) IJvx~~M6L&CaX,Zmll ?%)p8}faM5S5 /` pR566^r\.J%�8Sk6R#fSPSئ b qyhpvH D[�g�wW_}6r||6bqq1 \.'~-P˨2M.$L&S0 s?0FGavρa"immqy&|\t67MTf c@�Zd!wCC $`(өjJ\v,>>4n+|ס ?`2Dnӹ=[\t ˙EF IB1p7 cP1[M5RcUƂIkT֍"V|(T%]c1 z( �|T%SbV!o_*fMh^ɵV}T{[ EU8+ 2{GaAVp8LeK%0]]]B f o2R'7& R@^AډDbxx W_}U*p7CN(*lG0jUZZF&LʇjmmkhDC744P *!-3"=2�"k/D"(p~||<OMMEbo+D8L·/<"RH$Õ(48|Ϡ �MMM2 &CbKzttDp" |rwwUT'a`wSBLtXV)I@d݄b1.&BqI"F&2y&A :N4wlHpbFh0Cdb X\@™]$5 5TTBv$Wm9*bP34un$CCWU R>Vrc/U^?E6,B =jTwZYET|AS}H 9dx<&&&3 DuUG! xХggg_`kkX,s#Gx<Lׁ].Ԕ?ڵkH{b@!*@$-\.vaBj@'b{5 �[aIP+Wа* Ǘ*(h8 ۷A Rޞy</^wvv_p f|ch6}}}|A6ر|^vZçr7o\.3gZp 9mطgooy,_%KÂ`0@H===]__j*B `$\.DeӌljD"$keAåA|,!Q4,jrJ%`d2#,l!D10)=faqq*KtZЗ%F#I2Q$;R/&.XF,q@*$\y "T AwSEҪn,7$3Z^BXjV978U #:0˻VUd(PN =$.>X,L.<?Ξ= EvL,Wrv\.ҥ^b1i <YZ,VP(gf"HϟCnD"H qfgg%p(_\.|&x<9p8,Zϟ3na%Ix&!Hp*бrh{N---L[60V1AafQw3+ 'pP5ݎd2e2ۍ$nUY0Idv544?E<@1C#c#{ nx<t3rfc猠Ճjpp?d2P(aE7}rr){DУӓQ<қ?Ve9jHz!-P4I@*-x9AuNo]8J҇_/( QUR' z=,9bꗪOe9h4:??OrZRɭ_V5,!333h(5vKo[8m@ �1PΓvv_je=8Gt:]i5!ʌa#%3Ub[0&χ3wvvV*( ז�\N|ԹL&yzb1;55>==M^% TE6x<>55-ߑar>"_AWWWkkWŢr88JBK@UD %K(d׃ v\D�)Ě77)'''n(b"uʕ@ 4A@$:yM,` O\2 p Bք(H$0Y=*z>_Y\f}||dWC}Q_%q,(Xo TO΃<w@:rBEn<g%멺Zpi[UW:#xf[3hH`5<q5n}#(<A$<UhKuUJRRD^Ⱦ =tOJqh<| OG}t=b13 'bӃe 2:t�˗/4z:L)@Z5?? CGG|>/Bk><oIp>99"Y`ɃMD3?яfD,nr5 700�pH�Vf7~_`/aZ=z#=}駁@v>HRNOO?k׮'93ŮQX0joo/h<tʘ&1VGXhf===p7ٸtxiii~*DgPG{zz.688s]NM54$ |88 !@N9==u,Qx֍bzʕL&/V ppp+N Յ1 tzmmRrϲW,h �PX,&?CCCl1! c[T:;;iwHV 'OlӧҪ7x&SN[S0U}̌b ?J9Փ?Ҝ+g>99u}(>*XB{\GUEBՠy;F:$tO\vt:?[78iY!f5ˇаLLL<z`S_ RbIccc˗1eB}/J?e[ZZ?yAhdl@R@}a䈼^Y2bQ:~w~p8�Z9载x<' v0YΒcrrٹlxf|!80�vL&_| 4 _D/*0܆ T*577snGGG(TV/h_Fp@�Pe㐎׋Ekk+um,J �� �IDAT HZΨx׆c0gl20hf),"%7B{6V<dS-jccw:s>F@r9DSYȍFc0/ѣ,xe!͛7aFGG_JZӧ_d8!*6Tv{bϬZIQgj;:f1)A%rdMm;Uuu_WU:p8,RT)D˪q¬z=oIF0EzLPNoeeeE8Ci(:%<{zz)v3$)aϾ0hDwrgHGĢ :<== P\l14|\1e#N 1+|(ǃ6" EA  `H&𰵢,B"RlooC@@&EbWĤO$Xztb^],Ѹt:XOV5uث>MĻ1am+Qy�| T8\7pm588/`%�sp&X|_&  ‚[ZZRI꒿V:_7 3%1pzOSj]S}yudݡſ533DPUME4B=֦Y6TIl)|xd(qT =F8qKKK@@|P-13C+5\UyQΘd[[{`j#_+ftm.fx$pA Orv%vJrEr TQZ,n۱|@|[(�&(yhA aB4]XX 2f199ɒG# ~? y�Q/ly,3.;Cx$N577oooMăT3,H$O]..؟iv?D"H0r2 K؀r{;/_,U({gUte]Ɔ Unozlc:&NT1&k@"X__fD;J[+ X\H)9jBW[Hn>ʹk4Xl"'[j[u[w:  aV=\r3rAmlJ$I&F^exx\./,,PpxA"6Gc||G-ʕ+ *4Sn85vl6mХ;?(--@-e Mcc#B[J4}$.JaXiJ" g?wl@&mmmQNɘ֕yb"hB~ˆa25rsp8vvvpu8{\.tNsee)yP.kN>?99Y__d2q>RRDc1$300T**g3 `S”):=ͳg, J@.eζuKԄ/VZ^0,d'Iчr`4;;A5&d}/yR+YfDশ]jm*4 jֆ8Qo:|VcԥF4IayVc઺\^'r[ZQ}ܹ7*"u^CSTnܸqb877ʟ5YҍRXy�)O>(J_$3Gݽ{lj1d+\-acgT.n7% L_rJO)a&3�-fYb a񣩦tt:}xxT*@__Ȼ~KKAd}gB$>® Jaƈ78 |rSS& \9z hY) SeF`.----P=X!`DZZZ8)R9I:;;;o'XVB, aŠEZF |L1MR%|݀ggg:BqrrBF7,(L;==a>lhh0 -X�6 AB a4wwwn:뭷p:;;VF%x lN!%ENZg|EsNXeU d2dk[/<fuzjP)?Cor z_ b$Ȃ,=K P/_?fggW `_N'aw6cgdtwwg2y}.P(ӂ1Q2\la||~2f@vg۫j>KH$PecmXĺ2#D$jH$hN&뷿-|?Xqoj2o_h4{SP/93L ;=`zv`Ltvdo0>///t:cdj™q\08m03Lccc`\.WTbzT@ CI~l+ SPf3{2 S \5*6(aӋ"/&n�@pݡP�x"=|_asV1GgKMRwx<H=ɖH@iD,4VU`8Mi?*>!Go(^*p7leXwUݦy@(!* /%[?1Xd.hg"hp=B6w|CI  j|g|('F$$}&Qk@`zzzll bnnneeelllttI'rxrjZ4Ec(@9өMknn0mc>aq^<KK&iaa8F>*zyYZf2(�rcX)Ԃw! )op^`ٳgSSS@|Df:V{E"B|_Lr 84L&$* Ͷi1&僐**&NpԅVȾXxPTNXFtZJ@PW*Rh6dxl6$;t4juuub 8l5J$ KLJg˂2NollCA1k]YYŊrmll~_yħ'Q-]5CA0Ɛ"C1HDQԝIzM{-:[ԉݷ^ILz}* +{N8ϩI3 4aYY׾ PfS2U^N{>דуDSSp@qSY`򴶶 ot~iH_̢j6 y8"DžJ |Jf}}<-U# X`\VedlQgUʣI, 3pLve):"L@ Sw.}?E^&݌Cm q�5ԭ=@Q4x<%ZoRhv{>D@둊RCք` &Il8 s[ 9Ir@=L˸Cm*m\rv>_02iLhY:>>V9Hz|B<S58=\ϳnH*N|׋yDZg9+UuyS꿾Q~~fэ8֩i!yI_!xfܭPHӎFٹ˅`; I'zdfe)jT*LIT'h4Q`@>خ]j5IPaKY K;aX1K ;99!;?|u||\" >|(~LEC.f2L!566ƒ9::t_IizzUe;2a.)ةBXcx_ܲ*p|Sm6ߋ Bt"{dmmme' Aooo"X<9 Sswkk \$=#ɦ]%af*花�Ѓ51~ i2Dit:e<w y)p(]jsJ�yZuĝSl"B@$0K3T׍Uc5L_5lwo׎iҞ/HD+%/˪fԑɅ)]GEC&?GMޔ)6[=4ܸqЧ_zԞ8ST666|Fnn^1v#8DDЁ+�}+̌-zI6SndS_.ѾH s'''j5B]Iiss ~VsssnݪT*ښ@K7vCGGG$g@/O<z,..¢Lgg']Dy;;;d| www\rzz� >ŋp]0@$f<Πjl5d:ᰲDZ]*,ׄRNOO_xt:Pxmlliƿv=!7]d(�~||-8.//_t6 �3R مD A;&;�_իW@ Nׯ3W'A^8ar�1`KRNDŽŕ-K<>#$7\.GQRy . %D"ڵk�ƃ…N H2~~嗪l~~ǪkMƣizP^7`"54} 'c@eT|[QizOu )o9h0y~)tR⅓jX, ݽ8| K9pC.$_X,Py˲O(YP?)J?` ea�X,DXɤl6gpqhtttٳgaT3 JP`#5??OgϞ>}:55E*=dȀ =#~S^innN|3 {8_˕dPeRʸ"TKӴ \`ollb1:\SDkDHe`3Zq<snP(\kkk(|2� =(׀~>GQ. ;99q:dvnoo DVWWmEX|r###4ܓUÇҦXx<UJd<dq. c%.OT$ p)G@lcɧeRFGQ3VE*^ ``U2L&(<\.52#r`5iT:ϳ> Ria,v<ƀ|ߠ爼ᰠӴH6o>C& C' zɤf) )-QÑHテM ")tVR&.//@\ �aH&2E[~ K0qhzzVq)Qxn7q ()01#=;*Ќ 08岷rŘs{<d2)2@V*}:M56*%mԼhwww*xF-CS6ZbApwRIKKKHp`ׁ[^^&祲G"xdNOO39᠓6Y 42f\l6 {X!u͍fc'O2r}ffF&cC]iF*eHcz\CzEo*q]\_j껟]<>:<VFxuΓfhUźg%(h8reTyU- $dsss~nxX(uqj5oFX��b8")www0H"DZn3"{z!')v*sQJ0-IGfGGGyF?ɔX)fNOO3ex<SSS BpCF3ru6m@jjY<hۉ[-Ǔ֘1rH<y4pzxbMM6Q O'v*콸s~(OMMOEPMFrI=.2(9gh|aߏ+Ou F Ah\ 4ʫW툴X#8r[V.#DևB8<<<dL&66\g ;G%>(MghʱƐUiuk7W _(G3xPRn:Đj^+~H NOLkC<9,8UK,;y �-fbt&ԱX쭷ޒ$wb;Tf}}}@I&<TJ|>O;88�-N羳  i+mfD:wvvh̳3S*79AK/_ʦa}}sM!.vcA^,_|F@TzF#<a$}}}uV*J$P:::<`'On߾$ 9^“Ν;㌚Ng2 zX $L! % "\UoX,lM̽dj)c5ׯ'IZNn'?|Ldžg#J9-RvE=8J2cZ.]T*`B |lWNr *odVzP./]400e$8#&lkk[\\2m CT*EUTBك>rx\޹speFU;NpyӧO-xkRX'''Xybr<}ڵk7kD\O-ETи'jL\?bw1KC$=+D]+*UHBr2!JxS yz71Ґu6ʧñ!'On�PҲ'CȀ}:8ļRԄ dooƫWN~oo/v7!YHB otb16:.֩QRN̲vy@=G1oEK-P[.ᄏƋiEb'~>yҍrhߤR)" T"lA8D"Bl�pC[O񰃼]X"_ZZeL_dbZ"0K"UUаY]]x<#rKb-)!>OӘǠ=|$,̾ijѱX,薝N2P(q@q r�Y݃"S!|>E,h6J?U}yB7a7De%B]RbsaǪ#U(*D:T,wj]<L~m!T'ҥK---LH>8�GJ.dš|�FCCCOOm;nK^@M6Xn|c:^/J zooJUd2d/O1.fscZ!bB@a"[ s4_ oU4]Uf> x 6P;4GGGE25-JT <^FdbvH%pPP%-d,c|~Yhr|޽x<v=QvR_r'G3X�� �IDATQDXq d444lkkǐH$@F?=㣣}TZ9X,\z? .--QVSoYã#H&bY]]- ^3;?IV j5,,,p�VCL'rݻ.&jR ez,`(5fZHa+t]AI ¬gIU@I̿!#pгc+$3WyIvrpYoܸA J(ɉ8<^5ov'0h"FqS5hNASF$Eayg2v"1r9*cj b>)f0󠫲։#1nj T9\.rLk``>T*!N9*JL'I߿q^b/4|I6s|GL)XGl??Caqb-`hfKRȶ|4<Έ|8]#5X\.Ǧt> &''$bmN1nooRf, ۋԬD"Y*V#;J]tpssOj.ixvvv}]ō reEXC_;�ނ)ݓ'OnݺEkvv;88xvWQEQGI)qׯ_W_ !6߰hnE9AښQ}*^NFO]5K 4&uug|.\s`T7tAQzdb*Q3hJ#$ L)LРeZa MP2h@NOOIc0$3.$6Rt/{/Hu:$vU6/#$J2O6q| ^,fvf@2R3|d "J --\ΏY]] 3$gN3HpYz-5@ @3L&BGw1kUQ q\.֥%R@1\NG�3m;cGACCC_ f*>ۑHDf|L+Vk(Rw0"!D2t\#fC388[%!W/a-DY vb1@Fܢ t}\I5ACWTTh"q1tȹne#45L56|uh=T&Hދ_},(wb2Z.,,0Xx<u:ssxCJn;�֬x<p&4>dž"*ugg_4[ ĪޞJ.&H9�%IG3|>O*1vVFL,;ސG;;; E˂`<zPTN",/(}'r,Xӧ C z86"񁞙]3PI&B6 \ndd%ssxV8sӂD7� #[rV ŗ Z%$!O0bu\MTVwx<ccc[|Yq566f2+W455 y^~,q0EHa()tԁ@�f 0P׳�%9D2\"\f3' Ҳ (,jnH\^FOMMhA�hN"?刁ZU6^{t_bWqG BI*\ɝɎF5}UIeK_ONNb3jv $歭-Փܑn;؟E!Mԭ@�.t' 5ٙ< $!@,q 08 ÐB@,ake4mv3mmmf3nKKK&kH3mG@(^R)t:&;wt:b I jkk[[[c8>>w^ss@CC^/F?ӟ$k~||l0SwmEI#Q) #pΒ�-mt.R[vŠyQ@ ]N7ECeK na#GEE|&EIxC) Cy|�r5i,i@cfA`TVF k()L٠Xz2dhx^ge2JiZ <c)lhhC}}}. 9+Dygn:::Ǐ{{{Q<YV$Y@71`v6ٳglkN===�N'+n'.?)ޘ#l6"޽{;߻wQET*yBL f2d%(P(5 RKKKb-,SuV :b~^S?JWz UB3Z[eܞ%C@XCm[w!tzzYǟg?<'''΍Fjb\ L' kn*As5b^tvv "+%l54c܀ ޅ| t\Њ@Te>?FQA â-3) @�Fj A<-JB .ĝo3YrӧO_\rH$x坝D"155?_~N< BB Gϣ#t<ӟ֭[xj+ #x06U,>وܖL&F`q2�X,FdQP`]7bi43332. .pVi~;\.sQF?Lڿ2nr8^w{{'Gz6k F``Յ(FWW9;;7 ^ ۔V`jIЦ~(4{7ܹ.$Md2>7/%s)266F B:V`Q,qJ\WM?$|@ Po^zy+XڇYL@'z&j2~饗666%]'<dcnFa1̮lB=>~wwf!fXP!!m٨^AX1 M˪ q| A&oX2r0ժsA$eO LVl@bzâAGG0L)zۀMae{`;"" |~FrxߕC15Yq$<Ю J+LNMM!& 91O:̌Sh�DMy ϩ)`ivQ:r:Ϟ=H*S5.$h4$5-7~+¡@fmmmqXdJ&&&8l*W VooG}$GZ@r۪(DW*/ uW/V qz-JזV5P-qHyB5`г%^*"VMD5E>{¹|>???L&=zTķx8^z}dH5TXTl_}�bVt5b],H<=Y=9l �Af1H/J[[[-0HCŷ0f-.1/z#]ȃ قbMl6C)+ɕJ /[PDv" ш^OOP\.Gc700~H$d+G�-X,\l/XF"#?uӂ톱dfޡD"\.* iMYs {ofFp>y$ BY Z-$`p, QfJ_fuzz ]'''A#=v9"$Gp Qz>333??# $;|y$V<$M2:UjBcJoնSm )֎sl/QpUu7)Q M#WI*yqœۋ2䉼͛7~P(DHwqo-780'4GONN>}p03n4@T'܁w舁!MѺ8<<Ĩ8 pzE c+܀c}(YPGL&c3"l )`0$I@ p8vvv K ppb``�3F4[?|(r�{zz'''_{5o�eYoeƗ%l*: ρHd.E WΈajc<T*ÙLP(LLL �渳F ^z{{:N&kU> n2Q#3sfV&&&+r6k25JV> r<w: oXc`B45O 郙V`ItcoojB055r8b_ʮM8z"W.].'sqF9r,CTK?c^JbPoQyM.V5sx56WBzfUʩjX&'h.`IMJNl5SyiZ-'& -< F p5D!X>z_~!gL�N"&8@`d/W0]6L4Xi"6~`R>#Jד?>>@9=j} Y4jsb'&&fgg~S؈E)Gՙ S;b9}A^R%!j݆aE'2/+`ԕxS"@)V499) #R,?�Pr9&,8qn[%0S =B;ˁ Nk4%Ҹ/;55E_B3А. <FnT,NgWW_l8†"0:qp|�^cAiFE?}�[o.i/[+++ &5`x<^~?*aMUCRqjh:mk1"lkx|?5%IlxѯvWE2^@2ò�dxW沐3� uDLMC]Vho@AF!!]zRdEd#$#o|d&|> pfu:11AN& *^?DX0"`v<@XTu+`"GXhP2i& DÇHhIs6p*  6K* �OOOwvvXc YX,ry]4ksD&""sK$X Z-Sj|.<B$ �J !9p,hX�7jV6KǴ˱k4슑7-,W°qZ-Bf`3 (HDH0H(֮YBHR fy_]E>^ΎA2M z@!kt zy0 !Ud[͊BsU1"Cj9!Jc&' oooCd O\e^iWWlg^y30QK5>U Py?eA!Loa|/8^;_;::FGGLJ@OOƆd"+ˌf tqq?___8M ɩ4[! I`z9EwnX_5QWV�XVw7LrBM&?rŸ\"1(m1$wpp099IgNle߿xt"axb3o1l&R QO% Wp5 Ģ%6?|>Fx}L9az'&&ɤzXLv;hm&D,;<<DMC!Cb#~ߖ""תEưA^X/6%m#K4;ٶYFlR9ҼOh&wrԡ@lAf1 B^G?heI?W\fZC.@u<9i^{'n4ȈO>"!5 Py,*Sl6y` ѽ`滻 C\?1+r0I;:444<< ])0e)ܴ;;;yJ„ݻ?ELEӉBC8~YPhqg6㔽3gNOOGGGYZ|6e1LQP[L&spp_" 7Dto6`oD-e W\1L2fA:߂::fw$@ �5c@wE/VP8"pifXa!Lckm#F{W, sMDL&SJX?ČRo,..R]L^v,$( @_5MryիW6ڴlI=L Q݃, FHWѮKKKW^jn_}ޒAgݖAy|qnR,d-8QҀ^^6r5www9'H۷I9�P^ iҡ#H��#QgIǏF#N4qtzbbQ.cwa�WL,B F3D>E 3 n>884To,)>0L hfЋ@[Bh=O__ӧOb,s4WXdKva__/Ð`0JpLo L}:;; $m[Y8avccgo Rf|Z:?Te$x-`0G"!{J%:::FFF82pV! t0E(�im2Y<q?y+V%O0P�*䀨z:N2T$1G.BjW=y.^'Bo`# ԷnpgOe&*I|fٲ>!uk Ju~ 2 iii ~y7npM `i#v{?d}t\Y$Va0Z~ñ799k-[oؤ?<< \V  H t$TgH/0R綤<bMaE`]ש|f*'y01!4j*B@annn2aV=z<ln7 7�jvwwÙ!pL ɛ 9eN?Ttb2v V5 㽽=pXphNgPe4^?;;Kc!PQ [z,V+66Or9J~P(PFR_h2.08[[[SSS0.]OgggiI6UpgggRݝaaƂi+>69r-dC?Ͻ N K^x2/Gl]:&Vq(`Ʃ�2_ej,U[[5j}znt�� �IDATn~eg}iwm=bl>Ws?=|8[IԒ9P7�UQ5 o۷bhq$P6R<}[l64MQz8/nll�X,`+aF0$B-^ ݣD"BPb3�E1:_lDa2W dh ,H.P瞣4!< o3!Tq;oV,ã+Dh(y/v x$C$>&INOO7͹9={&;j5.X[[޶X, 47FX 3'"A@emm-LR$I4ž755{1Dt6 hzjEAavvp%*z $@b5lJB*kX{B̔F0#}Çi/d$l>88P5G ͦ7h6Һ NehY̢Y-,VTV9Qc(j\2/s9;Aԩh $ʡ&U\} C\YAY^^-" jN{zz(|dB E0(PN}AG2 eɉYf6EM p2Qnj4YT(E* +/xԀLF6d#bZF4BZx<Lu8={cnqqiS;"hLoo  l0bP( ]k(R1ѶVQ2gee*8X`PR)3X.�erI8‚CilXf: 1:$C2s8xAÀ+HoRdtv;$*LS0 V^gg'@#(h%ՆOP2 4 d j reA@ Q0?!)\*ԋr.(5S6<qaa\{LH쩸y~/i̬42zͻXJhm*IBnZbx}ST u/Z?/ jIrU{a(bP%޾} .5IQ7>!n;JV�CCC;Fd"l^\,Qvq1Kam2|> !tRr{zz<P<0& i1\Ԥ!QJVRςf:>Zqϳ;S(�)#X-^Zm~~p*bpr|+}v'hB挣088V2nll Q.-#еGjEgKA2jf]*Ќm+DC}%x (�"vtrr211J MdnF߉t6r5HV+˱aZT*~ALxY3,eN  nrR^Gy3W|$w.7;6P T2cm"3 D0Dꬉ_է펡-.$i ؙʦ^]?P,?>C]X#);9:S!OG�Q>(^rͭJS\ZZ`H2sY188C2T�}rfټuVP`?<<Lv].WRAݚfX,vuuIO lÎ6NÁ 43fc;;;@FDž>oQ-\hXLyNBw Z, y@o@RDљ>֭[HRonnnJNT&!h;r<66! oMܼuEАjZO<A| o usssW^eN0JVcq~MIHﳑF?7,[VCx[[[dq\`9A###l0 0MC+uz' @\."`SD7\T_x G\CGM^ǰX,v0b*J.unZ@IJz W� .kxx1`~zhklO~r-lӘs0}Fo8C0|nJR`4`$5HdU I k*H5aIjw y^"9Oh}[٤[ -XE@jGҺ 'лmhJr0Pٜ9X[.\9>W^s8,fs` ᙊ PvL68u(p �&Fct9<�r||.RϠSB@CtU!koooppNB+yU,]6R)�!x|~~J QN&yf5A&0T{FL*F[o"hP6eVJ%"Ç/`0(E.%Xd2$7'`$__.//TӪsssr~>~`0ld4z#  TmdeGd.#5~(LNN" fj �@2>©ss1D5ye�<+V'msX, qb>cyUH tUqA J `> y _c8od.EY,UnQU47_q%jl$4 ^�c揼Pjn޼ݽ4==Yg}t /@*&D" Mr�9 +lZozPb֌�`766N'J !Pgc{`0)A0>>./`0Ejr ]#FN?__ D"K/ Xcr{,..^~]N#=$*;՚L&A.)@Jh>d2pf1fMN240zOjd2NrǟN?w]{vבRth5ji/hf wwwGGGSd2qU* A? E}r(#\3b F[ S0===T$slhyYEwAe&*[[[��Q ج \P"ԕ+WI-F9 GA"^DN,cun=HOXX 둜__v<^skf\z_,>{g>hĔ(B 8yr* SfIFNSNbp $zR7 txxX(E2 Uh�t3h4"p||̈HC8�LBF$bJ�lW8 wvvnmm)_E"WkIlP\<;F !L+GuGA`I$CAzkuu'ʶ q8"JXTf Ad>kww7wܜ(8s<&K`F) h[=5dQ$&?3jZb)sBf/huHcO@#hi �\@h|`ٜH$ b}O"".vry!A\pn׽Hv_,My G&zJL_}n{S5C$l:T#KqtmBbXGG;wr@ scDnG^hQ#g !Tv)?J>(r"*mɄWȀҬR<{ 1@B:`rrxxH�“D"|> d2{߇ƈoaa;c xKRn"]6VA[]]f|`,#T@4AHRB!ֿ۠ v8hH$& jG^ !Q@͢BԷh m%vzZH$L0l\aJQbȞθl K; �mOOO:΄E�"·GM j7ʮUCq p@m^#ȶTkbG@V;EFqWѫg˯׎{dkהZ@B. [$u#"R8 <#Z"aAsJQ7g  >9h㞞ȉhLG2 T逨Bdz ? Dp8L" xʫ= ᅅ{ѣGx<*.^6OP( gW^yX,JfbO&6M$$=( oll {ߢpGGe2FtPA3sNEd<{"BeIn�m%E0CtoddƂ PPR=eqѰl؂Ұ(y xpYY�he{P|ǏA T tj ׏Zj;{DmCR34"K_ur4^8NUO>^Ժmףy.OM[Z5_^/0'.8" 4z >jqS'X<x�P [JT 6X,PS#>!BI@e�ᦀX ,aRFP^P!`!l8\нAth0`_P i`9Af3PZ\\xnnnaaᗿdx<.E2$+0Dz X:Q#T l!!cj \ ,$!H"T){ёxoxf3B4N&�De6LnllN2�L"F{x||F7\.S׋ EGGGc�tttp:'0SyPR`ӄ:LWc^fA|-lVk__IJE` j ?z6љ,I^J_M[3.{%!sUiCUܓdFb\mV%`6ȄGh弦]R_AΟ joϢQ&Q/,'&&=�z.So*+8"H#-;Z1HZu\6w7>#=>쀣,$#Y1:::x<BoF#$0:;0",MD#A~pRv!xMgii1l,Ge$#$ f`N126|b҇7|}DJ?~ mx׬0�21g�f`oobbɤlY q,T Dj8|5 dMr9Ȁ y ZɓbXxj 7RZ d!+\?H[jX\.ݞJXIPՠ+ u^Wv}yyYt< 9 ʊȠ2TU"M!消J K8&/SPPIz$%ɪ]UUT_5ꃪ<ा@I*IU+w47nܸv<j5`z%`L&Yp˿˵kXx^T% CZlDy(փ Vph4@OLBFr�,E.4x' YNp6L6L(�MQ*%O`$Qo';QH\.n/xYo^~oX,l2怇Q# Ĉ`0899]&#{`xҜ Ӕ@ @H9Y,wy֭[xw,sd8l6!M=6:tOrttp8Z>^?FU(|>(kXÒr\.yfT*Llu:7nx7,.<Êeooohht:@J)D Q??�#2, libyvvl $SXKY:/Bmr??|ׯ_?>>~._|ڵ`0xujP"&(WCP%tʕEċji*= L&IM|&""FwA'!u4/ٚM$=Mo46*T Uyp{pf"9$I=[by{i> )}"q0BS{kלN'HsUJfAP1x<)QfR T*d怦oH"|vwwl6۔D.Zm, [hRA؀8¸<H A{>99!_Gcvv)Sۿ2jL=`F~mmkOTbiY*~_As\dkCNkt?W\A  –DlH[dj׿~Pd8\ Aj&-t2RXlll@&C�x(5~RPi7,�H"@ʛ)3dNOO B*B 8I!s!d`X`pi`ɉD{zzZrC-c1 L$׮]{7:7og?#"q޽+OJccc7n܈F@Je�5I>)vf+eBZ#}y=JE݋}4@.4r8Z9mI H#:tbΤpnǭLfynnD4D o}[-D =*/zJyKQ$C }Rv-0FU bO+ GWWWP NGOO ٳg2adLҙ,sm:w GceK$y*B,et:=??N/E'`lM@h v-,,5lnk6z0+y:/BBaΎoA‚S\|BF(rX �;=\ D35,iJv___"~A6 ۽v3v"p9@M|`Ю6o||y` \b c  0L7oX@h WyDݶ"@B̶LϤݑ{f[WA\s55z^knkFIdlʩϒ$KAWmGMjV_^^2WVVd]I1czXNy&. 4x (ljdpV&3p�KJYЖ(OA4�zU3)g\�DTzAdbFQ)(wl;{{{bHl6 BբX,FcV`_bQXtL~hGpE2xd2 6vOOFmP(#�5::Z. ?viFEq믿8wGGG|]&,Db͛7OOOK�w L] z 䮮qX'uwwW*6FppG}3}{Z +GWհK YT@9]Ha0:P +F)V|;w{qolxe!U#5o9?? \}>C⒪/O?`D/`ЭWn=? QDl(i,_Mm:O<Ɋ9^[S7$38A.[4V_Sp ???o,#ל�� �IDATFh4|Vx\4sI&D"Lȝ bD"qzzJc q Yn39Ptt yĶ(vv@2 bHXZ[ m�sdƜbrRaj({{{;6͡Pl6y9X9Ig2jЯ(kZ<>h4D=M2o21gGH�D(kąB5=d))|~cc9ﵽ+KuI*2pxhh*|2zdnGD/=׍FǏKR(r\d a\tҞr f3Ͳha[�3cE%m 0~r6h7QuF<F-raaKrG4m;w^/݃Ub0NXU R4zޘFaHuڹ�)X\+sV{.}_"AY]MS,Vepk׮hxeee);+T1>LpxjR݀Bxg[ $Ғ|TdK^6enBh(q tĔ2-<kn?Z#aRVAeC�6= ibŁvk(f'O0?Rlwvvv@4Δ T*B ng;ۿ믿rgDFaɓx7ml~?<*FB*p䤼V50@3R$⃌Խ^/y9r J(.3a_>3[,Ng__Ύf1 P:(@; WAqaKD٫Vzfa .o$'Y\/Ϟ=Oh&''"F[nq\^}U.+W gsUkXRf21ԔAJrk[^mC !&Ui**O5i|uTj ̶liS(͖ɽз&te!0V5vľ w B`paa-}) fl|H$  |- zբdFFN(``42Hb l#Ѩ؎rh0RI M Q@@ΓK,A&k122~{A*ċwp `x=z733lNT à�"1ol60襥%`=*J`aB@9ѝ%֤ͷD!VԶx<W_a̔Yl (0Fdh4Zf J6779A!ef_. իrptuuq D"f\()q9 (2fA8f0 `0l6Ah`p<"@i.s}}-&XlЃaJ2㹱AΉ �BŊԊ 51 Ug$jx86BаD(!T,-MWX:w;ќQ?///e5Cv|ܹG#c˻ q“<i[*I: wcN �h~�!TN"_|=@481/BajYVJ!T(X@0!G +т9d˼tH7CTLhA`aJQ "pL gv]D<j�s1gd`1('ZQf;\r)vL 'Oqrrdn޼t:~?U-'1NWWW4E<LvvvRz3-===xD"}Egx<ΖNU2`d2R>KJ0{Ϟ=c=>>ND߿O + 1 ZgR%�|.—^{�톝$b@3 ra_!連,f6hip ߛyhwwM!�|W2P!zqJb SbӧjW@""'FŚ1>[X _`�,NMpDqA@45XE?QunZx # DD 15RբQ̽{jjq:o|?0 (Ȑ`n&Kt\.X ^x͚1QӼ7.1:>V] !~ ;LƑ>'ƔD0$R"X̡3AT1o 0lװP%8 Pffff3;n3y_|h"0d^|~p ~y5.YWBB:[> {TG*pU Jz^o8~)D")% u= `cc&?X^ Rr8R0a%2 3}>?\.9>erqN;gB?ɘΏ,dT ıS8)IPb677%@1TЄ ,"T/FAeMU(DZbP[%yzCvи%L}:} ӈXo9O\(o+,,,pW3Ԃ!,`|=L]|>Q1ERa0bbSs~@_B[TJAAA:A$o4th%C$HJ,q&Xm bXD& a:nW*T9A`hCqle8(Q63qz,3*'m2>͋Hx666}2@D((MmH&23\\ݥ @hLLL�"a_ԟհჯCܗSgP< H}s: ,E [d(#8dPUH,}K�8* Yba/|(bj$%Hf5 bUC?Ũj<D] I)pWmA>z Dy༁~~>]=`I;.ּ[}#nH`K#&ߎ,=UqRMN'0%hs3Ϟ=Y%f0Hl D2ˁ8D0P(_bmȝL9&w!$@0aoDgPVQ!jaZ!!f4J,;V+ a4O1Ka'2c+*GN\ �?33sΝ`0HjBTN<rIX0~*Xw1#1??/b,R4бٯ(RTRݥu!n`0|z?[__pYฐ`Mgþ=N3 y1Db\IvTAfV 4 nd#dWkfXsO>lF"G#"8CEɤ>1(@zJ H詆 10*<P/ _ap1H/YbdI8ǡnTڷMW"y AIQ<`b)ʚazzZW?*pf|'''(@ zj@ G@^ l6 S& [F()^v&K pG dPf #%1[C 6h8YZbѡ>~-> @i26 Tr===t`fskkh4rl6[Pm_LOOǏ/_j�R&YCPXV+sFQTFݻ\Z~ݻ+++40wޏ~#TU<N|f|>x׬+JTB`p8{{{ocuāfOOOST cX(5bX,)IQO_)0FA{�jA%pj:D dƍ FVukkKW"888`ap5v?[@կ~% ~!88}---ЃX-mր4flp5NY`>C#(ݠne_Gms@U?RfЯW}RWUUUJC3Ƴ[[hTܹÍKt&ɮ.:У#r90;lU@&E- (Nj/?I;^̅a)3Gv8ql6471~g 5t+l``Z 7O2feٸEZ6$/> ## t8) DlB^CP F{„r``DtZP(P?|01eK(q%nx`lWVVdx ܹS. N~oA.ѹ9ڋZƴ]dXP 9*z\J iFժTx gjZьbҥKXt  b(NQm q ࣑'_M$^mJؠWԢ(U/e [5fu֯w 8(_^ n9O댒._uf3DN&"+&-j>@g\#zu8zL"*,bx|(2LЀFr `1űyK1e(ɊlP qttT?O?hdgyL&Ýv ghMЪi:P^gWȘOœZVT"MKE, "ĮAFjp8 ̥1\Q<V (iooo'0L\-fY| Y<!3ةfQԱFGG@$|r!'Ta!(En Mdko6կH-q<y>Y!hIh\~N.9zҥKz`E iptL&n7�j+dYzbȅ*p2Ap1y mˬmdb cf9ApPgĴzҚ�& i8k_/x̟Ǡ{U- yw{95G[m&iB> `<HS-v;3 aPkuA'(\.rYh8l$Ebz:f6 jpB} I+ST1`N>kw cC8a$#f1ax@LH0rxx C$CF m><u:H h42"[r|/o VWޔa,d} <~|ggH^M&!χaREz8fj> l p'>VFC*{<|&&&ӴMvRX&~b 1LzJX�X y<"HSp b6$wY__8Š)t:} ֈQwfGbCX8<<@dB&p5�\k"eAA}ҏ[W1:<E|YBğT=B!>mEdi/B^*W %-7n`o^bx Β AV<C vj}& )0F%< |@2G¿R\e!0D'L$sHK#ʅB;= 3b1,^@R\.є۬%ና*,(:==]XXO~(W1 >88~w% a<rHB ٓL搲a.dPS 88c&{LI~򓟼v8W ]Y[[[K sk`O`�KBQ,v:lz/SSDycڞfV+\K Z�iZX,J�>G룮/Jww˽@ Yݺu+ ^rvB!&x<o|2)@y|0==-K/: "ꬉl".1 ;X%'X^( 3Ō_ қe)]/tA @4z4TУ0w oY& c#@,!-j5=@0 J�dYAoT@$"acjL[厎}d|Sࠈj->Wc# ."7 E' H(ir```S,&MBu^~e6(@ʁIsϡEVcpz- ;!L'&&bt>DN(NS~4aC^a&NL&)Jh>o߾NjT2C] Qzh _cZE2δ0q`G6ӛν= I\ 8+(Aq: rRH6xP2d^YY1Ll+M�200pjƒac%&Rc*5=oJ8ӯ -x4|U<Mί4>jKnF< 6Aѿf-YJ*NdW Z9/..r$�ͫ-p sQD6�iBaHPfTkGV'XІ4W17**QY+M4Ơu0 Ä%N+,UUPڍNH`,)ML&U%nX˳empp0 vVncR3 ΖȃN711ArF"#,nmJh4&nGR\NxS 2$HP>ڋPpA4"n ^]]u8M!'|>!X,Fʐl.JyѐPE|rL^*0g)@ 86j vq4ch.&i v1fl6eI)Dp8. $2H$rxx(ƙ,Y%4Խ.~ FPy ZUgAz7O&%hW F~ _h[kx$tor/JʶYMs˪ j#)~,/,DEfjjIg*ؗyB28GF6 % -L`B` 1!ZC`UBy2b=44f)qم`{"�FbʋD `Kɀ<Ps0fˁegK5Ibf'OLiN1R�!YJ9;l6KOƂ K @<k#yss;TsP ZRO kt;'h(6X0HhK pjd&{:hp٠4K.uwwAbZ!?J% NOOiG�uD⋔T^# .x<>33ázآ ̄.78*$3𥺶hb0j4/ 4~ zPU"uk>1Ծ/I]UէV[ E"̧TԚhB H$BdI8rlx%i `uXDSA\PŜby (FIlć q:h!"ht4P4gQr3L4X,&$5VHTU4~3zx@Zgh@|BKRfEUꓓN ,�� �IDATQ aZf1'2\ZZW677lNUE&n3^F#p> C(bjp=)p,//LD"d2<D"ž<yMdϗL&昈`3'Lv,OF�f1,Vv-Tiz(5$h;RIzH$B||dR P&eX~i22}K Mӗ%s9ĜVR?ST%vЪ1A}J|Sy?*I3/uaj5C9gSSRP%~!NPq|59Ip�lZ UL 2n6d P Ƨ 5nd~ik{{{|ZѸgA%7L=>>&�}:/ڙĕ{j̇%8== Xz@ @r9ÁhrPE;ݸN�+Lr9܈Ȭ08x<^,0bll@olli^狚x 耼2>>o}Um0ˑBo#C#i\^/G?bI$2P钓N$`pfffrrMF|a7 qAJ]x-9Mh+ x<C<$:( d 8yJ!(sq;0\ltPv x<5&uB Jh‚ s' OQ ~sXU5fQT;7hz: {͗Yu1ysS2ܮ1iI ) S &X۷ݰ"r2ܧ i:KHB ".#W+M,Ct:]T:Hl6{xxh٠z2:99ASKԼCCCn#9\Č-ChZm6M5R,$l>xwlicX4}饗X{RQbQb8+cU$`Gp8Y@aP+uM0\FK2wss!·v8^wdd I.H4R^`0MnsB/][[ڂQ9Ʉ قeڟL2 21䈡dG"d&& &j nZL R~U%n"784 Q'R}]'+C  USCeP) #UQzRĠ˶B+uD@T<h`Em{KQ!z?-$C\URec(zWWW楥r<33t:@8<y JpdP.(�(, c2B$"Cޑڜ�Ud$R&8H(L H csQ>[:;;Iwvv"@9*6ߗp̐!鹹r,�OXGmjj::9]әJF01Nlv >˩T [$A!jjMMM% ! ncuWfrB XDH$SSS1�pi򆇇a=NG5 r?9% ҩ<XlxI&#Jޚ΀txxNڈ#\.onn\?33Ôfii0 7 Ynd$ͨv2jRkBYTFApVb j%aEتCT{IzЪ&%Dv~ڙ,9d ق xK H{{{cXXzDMTj4L~ 0gw `@#nw|n<&@),Π w!CDV'&C%H.6δH>W:88D"~)0*u?*LJI^2àEBzF-JJ%Ft l6~xxt:/]Dׅ+0k^@]t `D^c!AU$w3rH$L>#.BiH6^zI$)i7y"5bǧ#z_tf_ L\|<@X>Or4]Kрo2s6Er(W1;;+�T{/J/'.&0ѡDFgjsL bPL5B80J34[ШkF4o%񌍍y^ҰFX Z\033300�ƍ�[QGZG2M*2�ҁ! hUP <z ₐ(Qʃk}vP`χص?<A9 ѫB BA\غ^t R<Ądaa#^s='ҭP L+닇DVD"zq=zIbQ0l60N&,333,.sozY ]TH$J�,gE+Fo4` EN\Pc a;@f0]&G_DbeeM$ǃkB>}|2dp-,2!?wdE"fd# E.Gx\HPgU Cq{[ԓPEpm#|%M7%X]\U5ŻFSQЋ;&{KR*;Y#nɤbdGZh4qjCx" Mp||L300YXs&suvv`P T*Q ϙzM4Ƥ [̋iD1EQe09: RKWW <!t>h4LLLO/,,P* j(D0Zr Y/N�D<xQA,#QR)GQ6_moo#ybZ*BFF,?(R3�r9p8Lxb2jL>R /@)F,c2: acw G7>$DPR7$'ha x\.hFSIpqBI`XIWhf+"0&뛛\j'"O-҅Ҥa rR乪[�^Ը0I<GT <I}u1#}0o!T2:W_F%672#]VmGLG_\m*Cfס Qj(R郜BfEI @N2�##LAO>ӹ&�pш)AD;Y}=,!AA<G2[59ahPNfzxxH$N&tfI9z฼LEw:9V4:hRO?4Ɉ9�p,*2`i@*ͦRh4zAޠW*S >�qR"B!!ݗ_~Y.Z &Zr9UY؅2-A(uL>~xss3Brt\Nsdd=YW@Fl V I)jt5hD 6GT*ݾ}pF G�=CED0e FH6b}ĩsW=@s!?nmѥz{[ qYDU7 }E}!:zsI8H3FzTUI}q(KGG:K0 4EXii>xvm?%QEO")RDZMZj eugm{]bЅtY/r7`�ŊTE"))>I_sHZk"P(<<~>溜FBȱ[[[vtb6ņvح0ؘd{OV(u!6 ՊPv zLg ; T2= IfMНtuu~@a,N &hdC$ǬdNidd�I�dg62 fsommhܜ,5QK݄S,c>_%.rpfOCZHdzzj9 �2*<x0:: Lro.^8;;p8}]6x+U*۝fip�}ER`4LMMuuu%IVK$'Ond\4&>l;< vtIre|;>o{{ȭlb1_*5)lWy&k.\裏)/_'%&ibD /Ԁ4=I~>: 5FcNSZVi~J#deǔ+u3T5N(AUǮ`ǑIr2;y|.aG%m`*6@LWKz< d>EJ͒h@6qz#73*e/zx2�e"chph&`1D&q08<oll\.8�kkk'ODL?!]t`̬W2`Z 買E|@|k9 `jE)͸SZf}}}(B!ш .'W*{f&DH dn[V?NLL$ *.� uC1�Y0SdYh0 Γ� cUPl-x{{{h$9k'Koŋ$S%d۟<y >|Ȥʊ(喤AL4reE| ԛ]3Ƴf .AruDŽ4fnʩ1Tf:VտmtP9ćag./ր;w劋Is3>'L)l d !^MCtTyldD h38 $4!Bagg`03O6<{ yO>,/y'6{Ijĉ۠ӆ 9tI`?z|>#h\4K-f}!ƚͪEOO y>g|OZk?/kҳgϸ$ĊEr1kZԋ/ <)"BLih%Z.M$,~Ք8C%Y1T$@Rx<d2x"zL*3+SF (!,--ݹsƍsQ0J $eQUkҘHCW%Mu=P|R}w햮? y+);=~?ڣ2 Re/W. +KGØkOv2/(t8zPYKĥ fgg=}Vl[d2966+|&…BADɒeB؇c?Tw^Nܐ!ѲEj}(rCCC feP(X,FOк% 2bME+ ^:mll+pʮ>y$ϲţ/iK0L&F@HD ;wx ! Hׂ`^!ҳZ,SN  ˒ruYVBԠt:=::* QnB!䁣bpE(+ST皁M<AVM u޹rrSeh4A˨1^%X|:TJ[9. <Ơ޴^Y9_P3Qer~#uD5HAiKЂeȯ/_L eNO` hYl6_|n|oHd݁uprr.ϩhx@:|7ԡ6Vla@c:v8m*w#R"f 3703qГ<Xdy�2Wpz ( YҨTؑq͆(z\~bI( Ũդ x^Nqa᧫ =  Ę„ d5'L \c=66600駟|x�ڂx@R@ 礫pʕr@/x'&,C0#)^`1gDUpoo8HA`  } Jr/C-q, d>ԑEe{{ի^ܹscccp>zN}uuqmf#p[S().\2gƫ2I<Y^WEY AL!Ν;$WP`)|gAMeQ^M\h~yّ$F7cB!!ܾ}BFL$Ř){[vHUE8<<LDFt%~ c�(D&Rf;QPd2Pv)JcP(]yUe2dO`7M>,itt3n:b%EXZE2BQ)pAtDNp�0S-χ= \.t XlHTSU\4Ab^Uo4h'U'8i-BkP(`G?00�@ʍ *Dy'j%qgY�zΕ?::> pr( ̔k4݀vSǹR)&gAPJUEAVCHƶYE:_Y*P?])~vz{sEZMIdUhg:^<ԖT UX)Bz}|4-˛hgpb&+_d~@vO ( aRj6i#VWW9,l5�7 Y>PD(T  D{?pf{t'^hL&osZ}S,D`B"3'݁L- O$/J9>O,??(5֑ H/[]lı \$YPeJ āoTryr@0_kɆbU8SSS)7$ kkkX4"H0:upK&' cU�%f+-. ٰ .O CCLpVWs"`t>47w~3~_ %> 1-V*_SX惃i,"^F,4I;?_NU&)kU:rk[_fK5衤WR Uz=J}\RGLPTտ5ʹ~B*}mJt|_|u.]뛜$Q= <'fټzj$A!l6/fS|u^ЄPfcw Nd@zN!Rp`BϮ}6n@/ԀEӑbP69$j)RPAu+iH@LJ @bkZj&(ۍj;44J80*lW"Dnc -u{{֧P(Ͽ.?99O>̈́0s(2;Np4hpi)P94+f$DaN=:\.%\yFV% NHmZa>EgEt:\~=z�=… /fggS~}-A)/!5a$2Vk_|2AsajrpVU*L~4C'E*_2KWߪf=3W9)i�� �IDATA 5X@r:`h5 9r^J^6?x 0<3$ѣG \rj_e&ˬ8!9ܟ+ &Ĩx ^?'z`@fkXklooC D;n\-C"P ԚUl6?Ei066J�b~!#lQ *iZ7VVW V;t(NNN&IN2Hfː!:<p&0nj?w\8Ct.ˉf3ͩT5 80fS|XLQ8 CG/l6Tvkb>AY(V�x:PV뭷�غ> .Jr+Wqټb�ʈ&ɾP: }Ȫ|M:x 4TRI}k $8.9hJ!I꒚)(}TK,]2T?U>e84$Ze[}P#4Gho&4 r (%>yݻw!W6D]__?::侾>eni�===6 w(40+qrX4cN f'_1u@i{*L&sXnַvh(fR nwuuՅ M G+W^ZY\.ښC HecB!0(g%C"bMYaCO`XZZb'2�`�ĉ)S4=<37V\`B>W#KϟgyT*DsExkƀ ԇL&A`w[bLl\L&(©PoC`!P! ";PK " !1ܖTp%a]\NF?T)(#z"T72a; =X= EӪ7HM׼Pd")i=UhC_u( O@cglvZe+*A:ttCp8pJG3`Fl6<ҕ.Ȱ9E4;w<5丄L&@F:+Eɓ'�f0DEeNJegg'xϙL,XՂ b!)˅Bn͆ #�UK ;$Ls j fEʊDh-B :6rHCc)B j΃kxddI!duL[ PȥC\Op |&Lud-JE{,9ypXgJ9=e:[;޺H@= jW TE-WQ4b KGH"SWUɅBKݎE;5Gㅉ(4JDonnۉD̙3nCnZ'hA1vW "# z~: 7NId C/^`?ӹ衻;H@2.vS`vf 3A{rHQ8NGa|j5cF$kAD"e H+&DRY6�XE Bb|-K#D"Db,լs\nuu~#'A] l>qC<,. vBۓl QUqnnnyy{AQٙSwr0VRv]ŸסkO-+:8\HjuMʡ*[rؿiKU, Ų�jHhKVZS$ 4@P$8bܻw~$aB4e%[iAGA3YC jvaHp.1 f�̋"u7ԞJ,t" )b7RwJh("lttP(@7;;;;;;+Aϔd!R)ҍl6xM=۽QT:gr|9,Yr J^3_TM=X.,,BUy&J-E<JYfWF1T[?==el*Z]]bdccٳgRiff\8^v766j5oaU!&txphShv=0D@7&0ihrٮveA4ooہ@@A"!#d4.LorڒTYY!巤+MU_'+Io$J4R;O(q�2NAUDg�lG|(tҥ`0ܼy`0z<Y^B<Ξ=KX l/n߼ysvv… @8o%: ׅh PB1ae2&&&]QQq!p80=K&1ܦ"BpAAraX0R|E㌄moo/"臇/2y3g\y>l"$bPߑkzČZ Q%T*!BRRSzoo7O"=P(?tdScLHc%pp i0U<kŶX,x՛fش,@l 5͒j6с1HcW.S�ع4:�4vJRtV! ^GX Q$Q @o{llLɬjZ~'9A't ֭[7ot=DjhrZaҢRCVH*HJ 9Z4t#S?V|S:ψ4+43&M㒤>vF̢rh6KDfZ....//m4.kuuUBF۷oe 9<`r's_f F,H璖mÇS`"'?]>9BN<1"ͧ"ár8XLgC-6XA`ӎ�`�)W*Q,6 4e񳛘I\F ;khR83TJBN:5<<Lɓa˓ ###### 7z\.#DFϞ=wvrrU\v qlIm� 4-`0ָFGG&" s!Σh4\N n|pph$Ją l޿ (J-K"lcnj~*nXX,b ؊E1J%R|>311aIlLk777YHT 5zHѓls@ uлݵKG0n #8Aj[y烶1^I=:;i v3vl.7$SﲝZ�'Y&j*)e0 21%P ,{7n!(xE̒ kLP=0ao$w0({sa0D"$A>F Cv@N*Bꠊa4^O744b2;S)}jdrccvƕ0== 0�.47zn$֧@s̠ ~#xbT�;1\�333\Rze644 $AJX#| ;EŴJL&#$ =,LQ2# _2Mq-ezq$*~ԮVJXքBe7aX5 llM,<An߾jᒌYeQM}e LG)=ll}>_<gI n:2bGTK .Z@0U(X > V^Wfb]_^xb(Š[VBH$Īɓb󍌌 Lɓqv;lW׋7vL{{{> \.>2B%f3Fdp !k)Ыsss|;j'U0vJ� v�DȌ޽gǓhpprqL ,ouI`C 8fi߻woee^f/tww=Bf'(4h|V ]v\.{{{vvB_X6VWW ʈ g KD<Ε5B@\V%Gj P4Vrk~ex.(M3cPD%Ң_3iWhڔϚlYaU"MTŁLD(kgtOB{d$x}x<N]rE?P(t-xf|2=T-4FQ$-L-CP2zj,G _I1nH\h(mك@"lLQ$9002Be /%6IH:AuA0j%S^>/$ EDKtzllʕ+זFoX@E\ygE]rA RĘd2e2Tl4LIy3::oN裏>gϞf??iWW0CV qk[Tyfc2w/ e2===|~8}ӧOj2DFcldjv?~ uz,l4oK3o=s*c:J=ClvYĨH$p8n hCggg)/_FE866=99{XL"l-êŤ=I@ <i^W#�R_-2RTx@-@XV&萨|֛vBbqΗ<_`дʹPկ~CD1ƍCȟgJ]u.\ ^`0!HC,c?== bg?Fx1&f788Hg,t3R&S6LKO@W!F@TC1m R@ Dm2`TEs&{Ͽ~㑔/^lll`ʹV*v& b```cc] -UTY-X1Ujr9|>oZ<x@Ib_T~t:t:r`GF8LO:1]XXxwǏ9,KlT*FXSlbÃՕNIS�.Fmz2Pr"�ES8B| `*`G"hUyX }}}<8}4֍l:8zaaҥK܈Wggg }~+д"ՅtUCj M:jU2amjYӗ85 1kPeW㧥D;޾Z|#WX5aMǤvF*R| AՒlNxg}3S0 chej:UY]]`"0LcJ87ff3pf9kooP(䠃 /I>; .0; LT̨̗V>c$G?,)&p:';MT(g_,Dh7joVd2PJessuP(~ =A.D"N8lۈ~A/F#2f89<|H$R.] 2s>TV#$D L(RP۬28A$HG.c!ېð �ɘ !\P(s8@bk׮!@l6@'&&$:$ y-a�sHOE2JrMy")G:qKk~%pwgabSlG \-R55A`9R+5Aaܪɢ4ˬU*A}A9\^Ab\ fīP666r\*b4od2 RrC|>Oj|lҩ㳕fS\Ne٠c`H"a+wOd_,E. L(47 %ə}h*@XapV1!l& %,臨bCCCX=qIZRrNpZ BfonnSH磿MR>,,7x<N_]]e1P^D"hDQHAF� &G.p-.~xx_;^l<šL_*Z�Hr8$9`&%6? #snnNU՘Oh{Uf` Fz~} rbpK]BK|\:[^\Bd}֗cMn7<Hszy{aQB]e$0 "q n߾ "asL{{{ :<X"J%dX;cvi60p=YWAwxxT*~XUӻ]aW^3 Oqy '&&V+vW5`o�lgϞؠ<њI8?P BX7LZ|Μ9\,F#<zn, ;SԽl)"3f4g'|ܗZ>N�":1sjbg-kkkFWy Y B�oood2B.nTwσ/,Tvdbsǩ@.'eZlla=i H1FKP;@X_5hyK};k;PiI C;nZ;ęjEʩ8*AY5W#דDy\ViWl喖Pv[ֹHr3Hz3,bOƄm-~eef a/// # %A `bM16TI^0URqfi`~?Y?D7$aP!* ˗e6Ӳ� aGJ?}`><<d~;< vV@n4^vn2AI_ l ܽ^x\^f.CaLCXjD3MOO5ۛ26q\Pq!?ب"k4QnLfmm*yTţЅemF!mfI0%INټvja;L&�=‘T*F188KjJ (k$9~cAU27gXSG@Mk$-ꌠgtvl)x z)5"Z/h^XV}5ເz(F>GCAuu&:6ƂT\Pk`wt׻KKKW\`2fql&Iߏ �p0꫉ V~@%�dF=i*0L JdORQMb6$+[8[N?/m6- 7D&L z^fPlá@bM upp>;60@Y�g2B*uə�2 Sf?׵5w޹uֹs<ŋIx<rDXLX … ӧkZ p:u:D֭[oy(H&2j% `ݽOh0tqR|>}f44w5qp gq:uKt ,w , 3w˗�� �IDAT!l=gggvD^ (Z.>M:@-I:0k4%Sޛ"(w||vMlcѩ࢝UJm8{@wK0DV   c(PF6>7 t& -D2i2p? ϝl6CW:ZBCyhooZ:7w,9@~&vuumoo-ׯtv/L8qb{{T*�𾿿OD___$!xF(8pOcdwnx<Ό1PDP`{~xxF. T5`xFd>I _.[4Dv2BQ/-l6V ~y8ϑP<`*րIT4"7 2%$N4˓wlEk&WhTXT3|ut!Z5&z9`9qomg_ʈ&ploPajlN?V<<}}Xs˩ardU}6hJ"(˄͹\. D44SNǧ2VyCrsDfygϞr{rOR[. jT"% h*%󇛜}9n ԰[g@ 2%/~ t.kllɓ'wvvсiS\Pd% BFhOOOTr%wvvy0!\%+ -#[d2˄^j e3~h?\daX_'X3s *|Yur f2&Dӕ`0Șڵk ة4Idh\O<1 Q@Ad<yB3:::JpgL&Cc̈́6sYZ^^$_\\䶢aRΎT;}S4V\A,YfVBt rEE: -ؕ<_S5>zcxIjKb~JclvzrL�JdWC敜wtŒ#{=�I1X[[xXtaˌ27DTԲN CJ(y'`}LŢҡ3aR* "Yxww!dsf&(�l^ T*3slPXchh:>Yr1Rk4;;;2u(RW>`JBh e<yp@X,>{t:N|`ʆa)|C}&A}S77724')PgD'_-// c>plllv$-..b*\؊DZ`G[@088H3W YH~?,2[48"9<<3Jaɍ\*jyxEѹ9QAilk@o߾-4pTĂu]BZ2:8O4)v[O}g{qKCf4jvs2VxnKȕ|lgXQ8+ (L؇\. #q !mpi<|&`�gr( CPI]f \2r\TxNԀL\|X,2le`aaCT*joqs:n{llr'Nx<20ym6lcE\MMg(G,PRT^gy,|pܟ.qK$X,N#gDKV3@7~||\<]m\�`{kC7~P:e.DхQH0]|A+VZN!SPxb+l|>h(˭ Vz766hFUU'wY\\q7|CD{r$ٍB =XN4Bo _iVwkU[x jy|뵁gXhF$]bkxvN~xiI(eQJAE /h>zZjll )P!t@D?qTv 8&K[lCe9d- xAKfϞ=cI`h46PSX.eӐ04s0 ,U‚ceE4b.!Bq{2js\1ba6=Rpfi&``d@yπ7X_dfLv`bHΘK$?Ym6۹sN> /|23ׯn˗/M{Ga _Tp tݾi6/] ,nZy@j"NQsG@:ѣ@ BEW׹6`uwwǏG"(W__죛7ot:Ǔi�Wc&HC..F Rjh5@ R4o V[^˫J[70tR4q`r]&3Oos2%U%LPjH8N7QU`눏ݻw)|d2X/c422B&b`)l Y% al6^/SuvdAC1I}!*'Sa! <�[Jha$M@===ĮS'z=yb1L�L&Z!rU*v .gԼl'pJ]>?}4{`+M$nN\ \nttT*R)I+ ÀsF#VwzUrŹ6�;Aqwvv*re"14>_eyy2V+s3/,U'q*l|jGWaabf FNޖ8jLq:Ǚf3!r>Y�6dMEx/@F.W*L�"qbQvw+9c%R)Lnd2��bSκh0GCV{-v( d,N KlK>ґm>uqofC&HV W!t[ +�E*d1 a2KlN'%0 5*9ŒaZ__tP(߆?555444::xsAk4a333p~Th H.86Hf%Px3׮]h\{h޸f(adrrybb,R>OҤYh�NMMlSN9AbN:S ^x4VPjBt:x }gl@nfbj@ d&ɭ'bKyQgS8Z-2QͨGk~V߀f }Ӄ*ah$rա1rhf% VO풍@KF@+J 1(%M\.Du`W>{F|PbEY!8C&AZ ?NcPJ#%ˑ %_f#�9 ڭ ݌A-E"gXт�-e׬`ʁ_kT0#?a"D�/N8qXTBD3Vy_O< uFL6 >xIx`ߒ-Ȭ}c`0 I\E>=ҡJ8k׮}gFo6sz .ԅ> xnnΝ;\6x<.GȦ䭖J%T*/X,n0߿Oo[m�NS]g*Ϭ *!Ue[ FۘC�Ntp:].t;q;={!M:=54Z6Σ:2,GP!%6T|!:ըl_f� P0 Q_~ŋ'''qi4gϞ- |r3zтU*s!5ZHɓl26{{{a`E @/o|,bvА٬f.b�.8(RА(4lWi\pZ__[~>x]p&A ./pvNoϜ9#\x<L~l6zЍttW,clrT! cDwwC]d/#^Zf 1#Jt:=<< kx>&)!8' ÇgϞuxʕR@ErfɊp:v6wWxѥKƸ+歭-I^499K�.3I@nŶl[[[P'?I ; Q?ONn47o޼z*al! ҬU|֭k6 9fzBܶ )(wʦ^L3fVo``NU ؖP|")Sld7#S9TK<D"[!ѻ뻧4ATJ|sl+l%u�a vt1!COߏO|X8d20r Hi=NA"J$T ~PHӰ Yof3"K]RakO%eŢ'eDUX|0Bxpy&Ӥ\.L&{zzvww?�ۄDӓJkD"e jkGvww΢Z�hl8N @/v fv|(ݎ7&T�PEIۃғfS- lH$B1/L6*377kdZ rPE_\]dC,ipjoo/8`ѠSw\ӓE$'J8f2kWbGGGXhN>l6VVV<nHr:bJ!R$#O>dccV^5@UZ:̱ hʹnKӶCvQ?EcQGIl|4'K:`A--v~<H5= Nqb�,E_,X%MOO_~ݻ3{.ՊWh&q8~> !r9w2x$榯]<@bLwK"1& 0$ݥ.ZYMP@RG3P�ZN\ pBvs &Oh6 B,ulc< N<4Tm,+z*"߿?55tH_^LS0rE1uR8nhf>6/!I 圈gTͣ'g-ㄌT3>%3nlolR)Ξv4SL{N#ˠUCyPDMڍ_YZNդ |:c:4׉1m+|+Mgqѿ5B;# ͘RMg{d�;5Va@%sdTyYE )qFQGiEț)0$ǃ؊b!MVk~yRN q,eXs@HI8?K)Q]MjD�Ob[QX1 / !ÿb@$/,ofVo&QEPЈe U I7 /(=.K!<yi=z!8q9JSY8 j,3g8b%㳐ȥ.YoXE/jjܧmzZh6zQk`lWZ̷osK6?p*-1yjR~ߚW Uۑ�1F= ]vmyyw6Ha\#.eOOMMݸq>^ {N8lN//ЂGĂU1=h p4So/>a"XeOCfFNRgϪR̯g;@A8{/?Yc+.g #t Cb["Uue933'�"̻S^H^[[@͠]7٬,3TbFr8sj.?d�/y ]*;^LSrEq7 '.%O17J)*3U%@odng߶r#)$ZwĽD}!}G* .VTLC$!Ew@BXiyݩ8 1CtH\QܼyS5&\\\_~"NΞ={;> Dp3=z΋6C!nݺuMvh !:yagD0>>N=C(~!P:u R@J7fJ-zȨP1%h&@TWuVkkkȁ�'x-Da+URبb;I DCh688H$D [ӧfo \iP0fT裏}]ЈZV0 bLZ>}z fp> &>ݝ绻\G!QX^ǡh4B|>OQ?qh K/J`H{7o[uz_p@P${v|K.tr ø,--!Lcҥ˗/v&O+V؉&#2vQ.rV۷obPsN&NqQPU@9zdO^.b2PXtz.?}S0#=Խry}, ׯ|>6H 5KzeDamg2P뙙Y՗l67nX]]%pCl8@olL0nxxXTĢDe4e6*;d#kؠXpH8U.N7 �gшm*ZYYaypp�O̲D~rWWWYxx|sss~~^ec8 7 ̟93La^"@]K > l unqqYS(b{@ XNS?�ztҀVձ1QS#h4rOMMbD")e=d<h4x" e)Q@m9R+UZ \Sm4R�PVydʓ)2h: pmRZ;УNgQU۟1á5C Oj "<C�.O1GV%WX, 5ZH$r]"yG̈�.]P.}߅Twyy9|>L@5gWgC)6Dk5 \J64rhnoo/ЎAZ̝85\A$mwwPQ22Ȇ> ,//A#\,xJ$wЌVMOObm#9,B|ΉLk]902ʒjz]ޏcQe@Wc<(BL%c\NR=L^{{{~?QhTTd<geddĉXݎf[FYV>|g0OFĉĎbH +{F@!m$uǹ@T"z+vuO-ʸ8rTQ%(6:Q3$]վ|յAhցGgYZV24՟NW&WtkDqj$uAc˖d=ݻG[E aש:~fnB3G_6u*H;)e42.v�� �IDAT qł-3Do2 4M>H LZwt:&:fT aZŵQH]B |p*va{\ǩ&Dɓ'^lmm1fU_]]e]3WpD6v\wY^^FKx'c!pܔOm4j.$G`t:Ϝ9CZ^vBچPTb <*Ey R)> (vee&NDJL�z(CeRO)\\\2-9d G\sTxI9zpgmϺ 5.^-nȣRU?iu>N]RqsAA ֐*Liܠ4bG42E/Pk2-D�P82\"mCwmzh4bHOı/d̆>988lhh(y\yz!Ts龾>@v,lZ07 ͸RA1aOܐv٦4FQ,=>lb�-^.bMI22ΑS l&D Xl6 zONNL&s0LӁ@G?ч~XbX2` ](1ZE… gww]"oQ,ht:H?~d2sڻd2;<<z90VZ]]]FUnmmxH1k!A# q(JVq-zl6(ЅY8i‘Nly=vFQ �< AW`)[f~~^sJTUҥKFCJ)J -}mj7L X<RJ rLM=T>[U)p;Na-5 pBm L5F*(k+"GEr|uF΂j=L<eF`*gxQxD ^({{{8P2cbj2" $HfSRvh2Įj$!'?Eif\vAAcLY4"c6Lq;%zzz`!7ģ |ׯ o-v4峠Fl۽^/AZq^dgg"mo"`H2Evh4 E"͑GMν{\.[oŸt8/\[M?Dbbb&}@_ 7ٳgL\kZ&p`oRŕ9==Zzee^,<w2N,N,LNp=<\Lw-H�~ / W_ØZ%1)^F2p"MTtQ-!ؖWl^( 1hGAIȑ&va֬Wz7IVˀ/ά(̚zsTPQujj}$+0Q*qhe,gFFF(C2rvl6 l6wEA! Qdy'vttTT8vT*B@ z1gN[&w<^s"WqP.xp3c')&Y>rX30LppX^hsssuuuuu5\v{ ߿xɷs+666lL@kPUeƒ�K ,L873g@R* l5s><<PѣG,,juuu`tt4/,,c 4hЃ2e�rN:Rg_w'rgTyU-3MW e{ ;;F}s?ʹ>A?I!]U},sˠfPRRMW}'Q~/ڒ} %pqf E]宀c38:0%=x<p@%o�8<PQf~GfTTAPsT͒bOs8zVOOrX׉‹9\ʼnqF7`@�Ȓ)?Юt8 ƊŢ<(p bIM%z&n߸qΝ;4:g,z>ߏ)B"ѢhPd ral6beWTl6J7d2IALa\VYϟ,痿܆rhnaQ'w{+az/!+鋀F ;wHTv($Ho_u*c#RwL Ʉ8J[کBb0-m`SNڧ�^An {bA[WtT:`zNލV3*C!3cML&1se/tX)LarCOǣ"#e# Cq',}p>8ؾXs67t`6^#p)ssse:{777E= FW]9Wt:uY`�լAZ={lXhg}xxu\M9uo;44S.cUI)W"s`ζTѦ3O<A[:qQoq)V b'~Eݻ[tP7??nU>.shJo/B_jKe4ЊF.[_,5izԗO ,ZՏ%Ÿ` >M~k0PȓUጠ֭[@ـi7o^Y{V#8llR)uqO>%~ <kz͛LZ[z_~%Am/vvvLr:v@c'0",-<~8\.yVlN4H`C((61\fDxX,CCC($FFF._ MwWWJ=B'#5'?MvPbz֭K.g/^dw (]]]�Bػnoowuu@3A p8FGGю`7U/٬|B�]l>Q^PwzDx2<::r|hDI1K~Q*5L&->L\Q},:y&BnONNr{<rT$/^yA MCйs>S^ʝ299)uZrJr;4$矫Xs\.sUci> AT۷Qs-5Kc%uzQJ90G[TC*԰hv*;X$uBf/W*Z孪Y/(mUԐ!I?nZYYaS)b5f2ׯ[,eiw###H4Ɲm�9ܢZtpuRP23Jnxɀ}ox0)d}=c+3>L%&.ٳR-?D"<!0"D0 jhYbvQrwܙ`rhRhF#oTXbqPooϡBV׳, Q*"fqH3g qHKd\j5vq~-σT#33334Tlwlp>677y f ѓ.ǧP'kR& g;<jyyYny*Zԃ+fzeXKyݟ|n!uP.gu(IbԴ#Qh5pi�WOBQh 4Y^^FcC]g SasaYiɬbqmpfCZx4 X ްHnTY,wvvPx<Bh |2,bƹT*d2I XOOOWWNTT*Lrp d2@H$4׿uZex' L&CE�'MXI,|.|AfAOMM1bL.a 8la5�0w`Z(&$ZJ3v<t{^hxOA':1N#U*jSj~_ONN6riT2\od>e*<3"v0T\.ϻn8b>W\NE&d,J(IPX zVr;k^52u`3Rz^R2KijgnyxA=fMj:rQ?OP !T%0iyy9KRЅ kV[0@HJ<R"}zj>G_ }ewa2}fbt \Oنw8vdc??g�x!Fk Z^g泵 ===h�*vȐCUƗ!bϜ9C(M *E^xtuucøZ699I0lF, `0܍ݾ}Vnюybj6$H ~0y;#*q8;E12bBHh9'HHnݟjE do&wwwC%G_WW??"MHq:P>%W׹ 2 otrΝo)LWlqR.yɠXM22By�C9ƢMRk5u|]�!7FǠ)\-dq,x+J?I0' ?rW9Q^ ΐ�z>=BpZ/2LvRi!, Xl C@+>@4] C#n$liseIm6$ёIFr qҼsqK5ͅB5=rۍxXL s5 ʊ*" I[�W5l rP^WI a!bL34::J(#ɓBxٳ+'ꀨ tz91`B1bt:wwwcv" AM ҄q 7^�868?\.IFe;&ſ=nhcCavNyeia3 HJ>NrA;VҟKǠ 'jJ =Ci$-'z{)(0,E`T 4L;C*AJ 1y ŴDybĬM|N$ćY&?#"Be&w_3|'7M!Œd#YT> eMWNrRL3 fψd6';esσ[È|MJ#ƨ9Z~v\p8R$_Al;r8|ozb8::rYr8D0Id•'+h*n3ۅui˶-NN;RU\   }Q4πf?C_"s1.u'fF 4@3.(T[UJEĊDǖl)wyGҵօsg}V?~Rٜ*?ȆW<wa8Q5fԵp'O�Eѩ)^%VVGXڥs}e@cƢtnꘒ=E&yn*s9 TiHup}%}{h#tR{%ywa* į" I05553377==-#rҸkۘ3@ =m1΍7KV6].\(�B\S}}}OOO/.."ϟabRz ~&}Tp|ї_~:3gފzJ48-0 2/^Z<^o^=PP >~ 2(4&Z z}rrxOOOc 5LDg4 O|}8rE_v ![FRE 6ϟ?Յ ;2z1ķuIdEXիWE uű~J!BF)_ 3j )GADsVVV�I7XƤ ],u観6=F ^/p1_HzΑ@T8BQu:DcnN(npV1ՈWJ -!䮠 #?\DS2LNs|')K.k777GFF<xBoDxA9m�XgǏWWW~mO>M͇bb ѰW5??clJEL,@` z+Y2b^;kB-D:::ܹ�qm|Y hţ=<<|ڵyIj4 Ν;~:+  ,8  NْP:~w"NYMRA28*\MDٖ)&@JΝ. 5Bsgk溒"_4p(�}$xK9^D9@g^fϟ"Ε _ܿ*[$ L2 Vq ?!NHXzk@'C:l?l�:H'_j>}7>lbb(F[qomm~_54A,П~)f7"=yW }i٧Gl˂uww,(+:;;/\088cC@ X+ttt,--@ܴꌎ"iC nU!vwwq!8Y`o̙3'Ol6H,@߿[V .Dh\xq~~ Hwo:AY,{]I+?55511B 7�cCdxz"�*{%֟%QU}ÇՁyId'mVg(>jn"S"I^3Yhbq )U@ ̠dȐ]/2'Kg$4! Ǒ[6�-ZO@Ķ6x P&Ƴ X`] %oH$ĩ{.W�/_{ਿ3)O9V* �uvD"% .ji"A8)HPP!WA>4SlG㗨 FRQǍhZoB~�Z-='3g|wG)! 'bX$ B^{g Xv"z #oC.Ab1$4ڃʹJ$Ih3q|nsOq Rɧg-a.9q yd$#ށ%2|zH!̑n%'Gº}}}z۝;w߻w^nT3Tq)zIT(*7ͮӧOoݻgϞ5l(??F__BWWA /DĔl4/^DZ0ZGwkA5'{j@Cfffz %2Lrr'OHJǏoJT.`N &60յ`pn+++]]]9_xjJLX;{<{ F)I*i<3(A쏟 5*a۸eON66S)T©)R a[p <zRM9SMX|fd�� �IDATr=@c"ׇ+BOs9BY5* 9VD {D[Rvߋy]XG`@21 !`�h$iÌA"K.#5 NEn (HDl�$a- dAb#hMʹ\5i#oQ2Mȃ$`GG ׄ�e7"={^NÇ[[[?F^Gjx BU.\�A\Fh G4H*<D%y{HO%-ssnOV ( 6#?l+M.\T͞ij"`Nf_PJe%PvJ�g( p|L1/n0 Aث$UZg�t K|t$|[ NE)!SP3ՆgGc~ccݻ|`]ٹ>88800pM |wagg :0[Vj5x[ՠ[v%|ͻw5RI;CAҥK{{{7⃄VDww;wR߼ys||8g�lg "pR<S-&D֠�$d`�It<xsgB!X,hxYctB)LR[ 7{<iԯYZZDcOMM!c%#,X4==#P8u_ @FesnoqN&ۊ`J+ͷ:Sg ևr̡1!c_;ݠ0 `iyp_9|/25i*Qj("͐Q?7 B~\FNfxtd!)zzz wmIԠݻ4;or{(V@]FHG03Y]]=w|zڍ7@,?##P`m ÷H汱1~_c" z}vvV0,mooH:!|/TTY0t>~9"Ñ0h6+++| @Sp8 2 0':TrUs.Ų'5sH2::9Pc@J(Blw n,a(l" Ifm =+7uVeK*xUE6TW*3I9BhuxezJA$:oOC!TGA\hwU)"Z,xŋI 1lBM~t“*$�G�'Cz͛7`x;pN4 ~kuu4ϟ?�… ݃Bww7 =flZ&/^KsF&! dH(Fcyyy{{'fzjgϞ8q_ҥKkkkp{?^5 h!�/]Tp@<Qz KO< 4666 dY) ڌT( @Ѡ3d@"#4T@/T<(7I(JD`ޡtj̎e(a*vl'CVT{D<W+#= _MR"v 4\ဉsN$�ɞ'#qlEĪj8P699)gnabȂ~"8ZpEqVvu sQB׷ Ehlmm TQZɓ'|V2 !t:11A5Lp�Nj0 +W>tE⩺QTAN;,&vgg_xۻI;H>K h twwE$Q %@߿duuruN2ƀu Z#y )qOٸb3 kY֎!D<|z!yKy;sN0>[{ff2C,r9bpoؔ>K%ndxFVmثl;T} <_3tQrDϦs} V>jl|˓͏)$wpXI|=t1=VHŋ?ό1o7|x7\[[O /7 dϞ=ŋοۿ?ׯo&xqe/ӧ?O\b'\|A[V~˗GGGwwwݻo>zxʳgϢ'N<{7ojFFFzzz>} vV77<륥%1ӿyq2 lÐ 0+@ՅmGG˗/wuumoo~W -'_!1C{˗5388YltJ ۋѹGѩS@3t`P:sLGGǗ_~ r'O<x�ڧOu8=?O~?O!P9k<? vW�}ᅬGbjj###ׯ_$BV?h}]wEᑘ3gKoC8[> |5?/V<4ʎ)` #S&f?W:͠M9R&DCi9aqgZ¥ݻ9 l<N̩L&9d;92fccMfC044ӰZi G ayyڵk AŞ28aIҒl *?h"70/1gHP˺v"QwEᅬb a ~"$1,FViuuҥK &6`2ӧT[o566N21N;;;0CCC0jh- ,]p?яTttt 8@yfG`Oϟ?ǏaCww7^x_7o~C4W̾"Kb4˂ ʈ/{-xYgCF1^ېM{/]bUJF|3[@T *ޗ8rMe mb'tpg/Wp}Վ@PJI>#Dy6~Μ[{&Fjz8XS(`U|r՛7orGY'ED7@s)�:ĺPG?71pFr퐎wbh} ?^C MfX^VLww78AW\B(toȝ@Woo/@8v\__51쁐;y$CPr1 ۯ V.]TΝ;˗(4*([YV']v �gYPZDRO&e@%՞Vn0}ideDБ7Ƒdr+z jDY۶Kq"oS)?cAZ8^8<t!FǮЩn| ѨJy DKx�UՅj,^I\a` npp-Gn�$+Ѻ؍-KcQcwysΡ+�ۇ2=B栉oFʼn$P62mP]]]###ojZGG&677_{wP/D̾˿@ #fgΜB jss 3#jnCCC ; ) )X=;;T ln1:ނ')xډU ٛ$$MWGIuفl@7P0} #ǴթYK�.~p鈚 |SSRD%!ȥz8MCr${N^VJdr`aHzΠh(&'3ay;w$T+,JdD4"rĤV}gUD Q0 Eɉ #[ȷ1׮][ZZB']MtWWW~& jV wyu6i51xe枞+?{oFGG2Vuԩoɓ'_<B/_<22%jSlmm x\~x+'+p\o|*d�$28BWEpgݺuիlbK(TH<)hIU̮ї ơ<算2v_X9&Bj;*2*'{``+)0uR�CF[*cαmۉHX=Y vB'i~@Cj6ʈmxVVP% ޔ' m "zR0!R$MoVh1 1 VVVI g�zƘgϢIfٳN hb|` |/!d]]])C#|q;'&Ppc; \\1)DUYm" AF+]]]Fsb\GҽH95fAx+~bpjo,5?#+!7k>{m!u4\'YnP''+(3M`;~B-[0Iă0iR1K}7ǹCϜ, / RiNzLNN1ICp )hݻ{C!r�Q@1 U2Bu ᆱjг'O<}sy éBHy;w~^( A]+M;(c7n7ݻwHl9wtB6O $~ljVrzNݷ@SH vD/FO=./m"vVOdSls~AЯ*dH:Noqd٬j؁l|˦,^z=B K:VSi0A F]K)A6&90ݰQ63jF RWW0AC{{{Nc;;;}3?mO<Y[[wooѣG_I2B0r 0:-Pj4裠[�lf<W3b᧤\d9uHa/..nI=aIuYyBȸ%4*zNթ{~$&ͅ술Mb#PdHmy@,kTyv[ȯ+yiI]8 JrvU?94в%KNWUZQ0)ҟ)*.` a48 /277f;34 %7 Ē$J1H9Vi9(D-"֣pYvp\PB2+@`yzFsss}}}(l1gϞxj4^{ x֭-Xv"|W|7P<w҂u4]{ʝDd(NyX]]3àl9kn,rbyc3HK yG-YH<6{U燇N8h.fS46X#9*o6zGmO -L>_;Si-̠&ώVVHumXMLaIWMQBN7 sN"-E-S `PHLZoy9l+r#eȆ}9dTB (q|SK@,Ί6BVchjzz.ʞ 5�r VWW'&&j_|c(ǧO;uɓ'wvvA1'|sԩ>|W_}544_YF}ݻwb eggV~hhDDXa ECUt8E:h BMFKCCC/_fz8 0{9m@�TKt@|%e$ qYvw6MU: T;|#*r‰ft1DƩs]Cq sdF҄9/Ts}i tJI-#h&(KB|`݀IkEN8 b.s)zTrdA4ꄍIB`4x l:AD1`dW9=+x $ܹSn%7779k믟?v{{% x0J@~it lll\z<7x 3㎃ז ˄WDh4F߻wZ5 ɣ511-M3%%v}CwlՃ\$A$N"UXrameX}%PU:gcqdESc!Cca;ynBg%)}=[~;R&~@Su#z|RԸbuIּFqʕEvMgc߂3*E%] F1kƧ"ǃ}&IJ.+QrWMaa*XA H"HӀVz1x)PBJ@19msh*l(Pcf9;+LNNBiyy3~)0\?2^k׮5M Uň_wvv'uAx+ &o@o@ mP'/QxUkg݃|1)QՍUXA918uOIE:0:i]'`ZONJ6zU;"1r۠76zAV;#5sPIV@]>eRFQBUCIT)1<mjK 5'$ЈgN{("" yPX;f(XUE�+`dSalvvvBӧ(O.)lnĻ&W(<rٟ-S3.Q)sPH^ pf9<<|aaO?ecZO1ϟ/~", VT346)O❜�!Q{Y-/âvB=ɲ@9>ieWxTco6TtAg |UD< O\-+99B,8GIϥw(yX!Frj_pՅB/cv'A&"BzXCg<^ %G ޘ�));;;ccck >%@:s-pe_6~&&&@x՞npQk»jL$@rBMrb}$o%27oJjPBF"YWATQ&&&0|ݩ)( jy$dļPgUL6BQ@G0^URũژIMx6btDB>TSuG1$HnX;rfĩ;)Wb0q!ٳ54'g%O8{!rhRGSbH yd`Z8a5`իR/^&@֭[+++t~QP0�؜ZA㰡ɺp ,1Jd0?pb,Jd'H8Ss5D^q9̀PS2  A>#X$jr74l+F4q_P۵\ ¢8os  /AaZd{KW*99*Pg)I(H9}fFlLF|7Ȏ_ېA>|_z+Z /6HjS PoAހ,pLyc.J,iq'݉*"ImoL,Ta-T>gO{wu)�� �IDAT]9҈0cieq7P\9CZnՍyaM>r~KT[V}WVXt6CR}o[=y슰s(baf+ d5d= L,]/$Ƙ_TQ$@ 68qhCl!H)n"<I  E!]Q $[7+n<h(xk{Ua>1gV4a 9 q5e(fƵy=_wޞr d�ؾTc&�_>-@,ң&Y?ǕYwv>fH=+jH`R*/PVm"iDeK0Ά5zfŋg<:G}{gp C@LaPX H52IB q9yr|}W!ngȍU©J4V1@z$nxj!�}Ah\Q;LDIh"DFGAm>Ȟ`퓴}[Nm0KMQ^Kc6H0,Ll[;d-%U:vu<vӧR+ODc bF%[^JvqZgد΢Ìw'I,I,!;yBx|E4pXzk6| 'Q”@AqEh-A C$N5`f#PE C^}ߝxUqjjL-Ν#_7%nH["xQt(T_XvᮯOK8l+m\ gJav\WLS�sυw@v>sIfsSnu9,D.lHH<J$ 2ط5$iAeINNKD+Tm0Ė-:$\%k!E9&ƹئs+cccRA_&rbbbzzhtww߼yj Fb:l.\7AL-!#<Ҽ,I?|dVRT l?[/2< WdD&$"FjfgIN_]2uR+_>Sj*eŐ�N2u;xt6&N@$Pk *WsW6GGZF+ǫ ٝ5E$6OdCO/ZYְs(+ڨ2C`f&԰ %�Bjnnڵkq%3DIY ^ypubiK< K8D^Ymž΍DrJek9@t个QayD[u&Pjnn=gF l Yr:0 i^f!Pe+@ٓq {XO ^UЌsP2#J@9,c:S"K:s| 3(sڵ$ܯΓ SSS333oȺ1]wwG-F/ T6y 6UMdϕxԌ 8f j?3hpXyٲ#6Om�^|!jNhVq/%U ƥJ3.Dd (L~b+H3 *}׭-dP$GvږmnTVѫf#_-9{gJ:scUZIshw RK8o鐣p dwVC:[3/+D6Kb6Q9;ZɦFvBݽ{J㴘vg.$ڂ{޽{͢Е7IUVR/9T<e@mZ V!T5iy)z< ,8ԥ#LǂѵJN86U@ ' +Z"t$ϝ7%-6NR43 4PI%T@C�+Ȑ&Jjh@828[42~;[ ն67`DمB6U/aZ0ɨHhEdh?%%/FZ K�u0ɇW6Y$i`U.)9J)F䌛BfHnC gh4P ؗd0m u$ 9:rrBVb#heWZNn9Ȟ"QƤLʊgG^0ZfFjRGp4Xm_ߗ=t;0mz~4UhzRٳv&[rg�-p"-DB쀝Oe|3BVll6i{NMMAnB^d43F_!$CKP@d˚LĂ_/`i [n'KS"� ^PZ2PIʅ) F\w*60H쓪P+i7lXLʯ AqxK__\( 0bU" <)wQ6 F 6^Ə51R L _.pt3KD]S+YN@i:1őV{I+ ,( 18->0 D4 T3K d�0s}}} Pd} xS,mYoccv"jIQV߿O`Y`O&Rז(|/3M>(qPI-+POgRs髨m8,냊y]NxX^?cpSr,`S6Pb2q{!ą9n+Wы)'ߢudu8|_9|cg *̌ÓC1(H9!h6H40Pȶ54$$ E%Q6utyaJ;h?䍏޽{+++]*`Y2&l}6>J5`Oƭȹ rJj85ɀS &dׯ_/I@nݺUPa͙ںlςmwpgs?<'/^� 둴!v|/IA[#DX-Tz1aechޒ<|-!l:݌=[6/WIaK~9 l[Yj1҇988[IHgH[yz!jp`AjbK&|Δ|+> ruwwsNbbbU#U "rs>L69VO9MWĂy�* %sT%?cS9f{�:ҨBQ}m;N\Rd_]b8 .'(3`E"t_BU%`I:1u:%&ש줶!X p8 BuN[t2Z/>C_XVRj8W( E Ncp`w䕵}Pu&?9-?BK:#z<˺j`A}|Ve[�`I\ L oi6"xީCS(,h]LIH4Fa+Fq4d'Y{dьǤBq' XZZ]YUO1ݻKKK"Rmg>'�(ÔÕ+W&A:+p#pQGBu61QM٨�dŒﲼǍ ðN*o a?NFRgJB>9) 9oSX;_|$a&($HF0!'Tߔt0OcD$it{hOĜ0h޾tƆdOR6OR5MHi;$:luE*I %G;iM36rŖs)}QJ*,&_hUᙻ`W53>U,x䤝9cdZBLEJI$-1`�,&5ACӞ&Ǫ%Ծz΋lO]Se~_ʨِY?5a.yR1ߎ)Tx@^'- 0]Ve~M@ Լzt�TUc҇U0T :OhV 2Ǚ N`UclZ]z_O̓<+u}^L"?&7Ð`sX"=Lo2*jK8H@u)-ۙdq �T%Cs P1e{bR]AE%v\«X^|yXG:DdU2|QӕR0nt_v>y%K!Ojˊ(#}'gG!cIU9J@`.&+ `X�OTaѽqɡHiŝ`\פm%#zJ52ANC2"9}&RBE佐vH"*{h_3P;$ B da+'l1]TI~"\\ge)\M2Xښ#)=:^ʨ0N@ b;Tg)F!OwE1ŐӳuTKriA_B18` x/)^M($F"p&L'D J$6x0([( fLmUG a\/+ٍk\$5FJ*JO�8j9KKK8>S�qVG/^h)g+O6NFH0'i g4ta&l@*&|jk?]^sK=�+j[Y|8ub\] /`+Ry4֩<lkNRC1%%fȥlKȨnRuz;::iD=U Mī೧n8<jsӪ3uGX9{Z>!<ǐ@]Z+ s%%K$@IyLy n 6L}`5 8/&K\li~ 5[9KhYAb>eSPF{© D{F300�:ijY3)F&RJVU δS'�7F0I1spR2z"3b0 fn޼IU#8n9چkE#nT+ )>"W}{9HAp-YrJ4rskDO}\r`-SprP@FEvc,ΏfaLƭj-C዆ S(es?/U^N6q&|C`)Գ|U(X S4=555??oM$_c9s*V^P_MI;???==i癙|ziS^577:LSI0ye ]Ubz#x3[�}M.xڒN&ŅV(6*?~8Ywgܠ% |N۶d%Ebs'}R&U%R[$1 Ji"YSL~;w(f!!g0|;qdٴFz Y%™PQ푡1?\vmuu\YY0 a8 nO#3eDY&lS^RMc^\Nf9;;ˤ9F.y>0[<`lH4{n ;qSV T*)Tq?13 Wimas2[ qJ/Y U 0*rj;[ U�YnX!toEH JAs�Մt\StI^]]%Ls \^g^Ck1wiggFy,LNNRh{{{wwl1RߠWfe(~50*KsGS%!x%FKZ4 P+)PUZ,yL'�BQ|6ߔ kxR!#qX.d]%�1.%#J;6/)VNgU'71Ǩ}/r!=O=ӑ{$%1eȸ'NNN*FR*3 `*eoeT*0e@ \i10==[yBW�l"FHIѝ؀2wItՠPk8Q,/*{DruʀH|鸺1Cgv#'L:_39i „|O5\~Mu3dHj'F"Q =jxN(̫<yel]~cI~oR{2jO,2/0+mEC*εb 'U%tOŇ1tQA1ʈ>gg\ϟ?Svi x0ב֐z7x1z'll9QHqюك;@-rV!TE$_b/ʔ{̦ZA|Dp;;l+)w,w;?Y(Ͼ^kLs.IYd:=Q amnY}Q<;;{ƍY6$*~Js\n:{'?iuƿ.dBxhq,. {C|fAP?,; hR<g @W�!K*-VplTH2.qMICQ6<Bky |> PKeϓd"0|� q'xŀ wB؎Mgu2S?i 9<iU(j\3K,| CH %?e|KOIn"v~TتRIid<Yٛ(,U))S+p b0O>y-Mf]ߧLEt !4jݹEꁍvv ZFò+"*rᲨ߫șI88&7?b Gj{#1;>8Qぽ7K(݌1Ab^Ŕ˶Cc<NWXIzI[K2|W?^esp>Ygc"yY!qhbvUƑ3)f =*8!|at.t{7gTbOuKc;f%P5Ш D�W:8K1f4(h?Sl0EJ* C|MJU)NS8sqJʷ 4ΆӻCŒ.vQNtYٰF)ߣ�m#mKLdG b1% U4W<lTL(>օ(>I|IWPJJ7/ggJu31э*Gh;vV X"/S UȖX8_G֬Tvv:gJXQ '\_p&I<+zXp/XXX_@*`_6֩J[6ߡ T~DZCP >|Rb2E9whx,-En ^Z4Y$Q e*ˁVJTo@૥ oP&.I`8�Qo XRQvpWJ ~I᣽KDzЯsBD>%Z75?CIӍ9UoW�G_XUd,lk"avaD>]@Ckȵ/f=tdaaPW}Ug#,Lx#]2>韘==y Iak#/q:a+ "|j+>\Ir%|rK1R!OX>qߗ2;sRL="7=gH"5j`PAP(Gsu5ة(+ ��IDAT9k<:9(&_{igN 9]hĬ%з*@UE |>λcϟ?l694ΉZ6<<{?яZƆ1fccwa[uj&, h(KSoSbrn\]&?. hT:Hev܋?N302'511 >K �j*~Za,J|hpE;eQLU 3u6`wa_>`O f۷o޾}{3]}?9$ `w8RW]4_4p OFև#XS]d)-p} +,yF@^b.oچn ص2geCLCU fo�TƆqe{X0\9LG$'n߾}裏繬wѝpvl8#�vdnv:mė}&HmBnvy(p nsuR ْN #k,s!yo'˥ƖRivJ%̀ R&+U懆&''qq9Y2rr*ڕRׄJJopJ#kQYvMphhҥKϞ=+?oY1ѣGcccϟ?G u]]]Ƙ]\Zp.#˔ܴ{{~x6ٝǁD]o 7ib7sʺ)S y\&HJi$=z%~0\nEXre/)0+r|>کln7+W&$[Sdq){7>>N?乹9hƙ}Rx@ eXȖ:===44t޽~�qcc5kȢz֭'Oc㮮݁.pj~pg暬Zɴ*ʹl]Z3~|MG;V6oS|ߨ Pb{}*PR_!˗4 5�0RBA96N}_?F1ʾst{"<[JQQω䘛=$ sj}G}t텅ԗ>9T8@Ra4Z)!m綉oTI0^$K#l(*RJ.]0ET h/-~9n|% #p�5!ٵ]an<e*^]U B;Uʘ8,CCC(AxԷ@oN8X^^_\\\ZZ|ɓ'=zvΝZ144ٹA}='\M|e%Εz&m4+ڵge~,/ЉJ*<,pS>φub\t4Xx!,u6}@'?Jg-'|D\BS24%c|e-|1V: yD'ѷM-\I$g$ q͵9W"){I8sv.VHe np^:$18;p\c7cUA6Bx {|N1(U9Ywe.|"p|(^IK@5�<Sq! ΄p[ybBDQ{ttT.lmmL>9 /$ !C!7 :ÑpXDBUDnuTktSbu\A> ^B+ᶨ#03Tt&P=!(wLARN뿦Bqq!؇ yh'kHmseMK:k) l$oAQ!ٟ3aiO#FTT.Dž G"7_ij_:λ3dŴ3b๯ǐ$mZħl?0ޱ#n5hkNI agNԐ4Aqj=#S];&3af5K A7}l,s)oi7;hXU&q DCzoh6f_P_j9qjm pټ$gAgəvp&ϩL_dwh(O_|Q'2/7cMP2T(+>kSāZɤ4@EYPȦl(|Jq7[le<',Ǟi*ԻR4#d&ntP-ecZxKoVlrļM>GU2$wJf/fHuZ#'bFUNׁܫ{ >\8~#-f;pS_g-{0ҊE- rnre䵬@Ǎǝä?a[K56b\$⌿2q (1))[QOaH%K %}^X jg4IN+R61fk9S$_Xl-Gq;+wJ(HO+313 |WS_$rW1ZO$ݐ:I\@TY-('Ss/><Y}“/>'*UsiMPc'&_)q+KPG>1TDL{*Q/C7 ˁ%ΰ0e>m#fOW{3vJ>_&n~>2\Uº|YV#[1e[aob'kp6T^Y))oukK)$**UU)'^ ZE*^h, 1IkH_< 3lG ZXGϑZ.g M^LΚNS&R:=^CR90z*yk*H +kJ?IIurf]No|F> wI׮<AR3i%Klr g B:ac"%*)/,hʂKro<FU6Ԁ 'i W/%R;@xǠ_9H"f '<OpD|(b*->+6.؆I/ޘ: NU#sEe9M ^c(N([%Nikb_ubT|e#8]ExXaT&+ |~KHc'F&BχT U,�1YTzشC<NjWq8 Gbj.[")~꣢3S*;rr"aԖ/:vb|xИo.L,0`"x jeA(5oì1NT^4)SZG*Qqc(7RHX} hR1u4vHQ�j CnqWIsfx9Qp:\ZYՌ.;BignMQ-{w"S;nK :Uӟ`U ?2%JR@ Dy%ņ* E&j~ӧ) _ -fĴLΩ]:+Ձbo-ћcNіrd795K s+6LLZߕD]/LrTbT*0g9ocXC])(cU BUg#WR#vN {ÇۚcJNKm6 N)Hu,'K~ cc38rr<uMA{PEֵ2 U=1F'?uX /KtP褖 tK w ᆰ}Wvϓ$ZI/ J)ȥZ$TZr&si97T/^aj;W �&bt7h[%_"Hr½]Si'i=-7!>NTOWC\!"F HhV]f T)U 3`WmK!~ؤ#bbp5I1_*Oxu"D  "IgR[n/ |?W1 ѥ0ߎc/Fa#L[x,ZE1YTUri<rS4JVDv ¿RL["=bRA A|y[x*J-Iavxϑ2&J+n,"9hIa-& [:*qqPn:>:C`H1&IQN0f]>ŒU* W-|SI<I221(~*a|WLs1j* +a`],GBPP()W*M**fҾդ4`z�Zl{=-[]7lD~EąD` Θ""pڑR1Ã}UmL_=Rڤ-Kw\T#&(SK-tbSLݵrfte)H[ℝQf:˓Z7S-񣳁L(KP\a4BF0Ffi">+62uH)vx~J̘Ztj# >v߹bS +c`vS0z2QUyZbFaߌK 7Iud%.VR|[EҤ#m?aZ"I #g@i"7!@vMļ :"w/H[z*^±ή\]Ҹ\ucjׯ+4ضIG(g В> W lo'e[ )=El*7�"W@ 9"`7Q r pWk[;ϧD]"i.7. ~L>z4f _ZaudJQ27(~Y< "rbySȎ`4KeMW;1)[q}WowYW&M4?T[񝃯CGqq  ૺ;U wcl1b[XߥUEZb (˓H5"I1~R dR%=#Z0Kcb'}3Ny1u ~0$:IؕC\m%6@iݑ �ڬSs9k$WL]ѢUAӦZH 2ŖNMM1v`rJ^/(TTa?a^.&(gd2Ryb_i,4nS|&!;!{yv|4Y,ʿsExS4hCoL&N3&a _SZ2`aQ hȦCPv. TKDjRو㋊Ԋ1erW9C`b%Hx<kvۄx ˘lPcx佐!-bJ40nóZO<R;)rs:Io'~GnF)zUJUI޶T T)P . <LҞȕVHZK%pH8YaHKUTC1Vzc5JA,͛G8Ds$C1%0Mi+UNeWl$JiF%Q/ ˉx'ŋ~tbap%“#K_`*ik!p9+jK{ 2t�<4=mHh㭯&]qx$6(r WP.8 ԼJ$CcZK嘌L>k{U0S"}L|-0 ݋*]A瓕NⓈ1动-*GP)ӌ],m#.t|c^҂f7<?ۖ1m$<~uZBzHBYo)JWƠ]X C62+QD 7I&sS_Ce1v=:$J5Z�I-HNPG 8 ㉇je>/VLzSEfLZ\|]Ʒ jx M0'FG!5+/00}/Z:;= TB@8&Ln⤊CaZ|zTOFa]|>LÛ|vFcPŇax|JwaSPh\B*oOA*['IJTT,>*M5:ʂJcJW3g )Ѻ1?),*!MiSG^R"+a.Ã&3VUHP"؏]]->.^cJ<Ī㣓ɒRcҪhKT MhIafD$2DH<Ĕ> =/eWǿax^ 9!!UbD>(Yn&\iչSbʵujg.RQf`/w qe.44ԧI;_./42^vb}epSa%᥏%v}?T2~CDL?3EI뿗{~oCT:21ZyD?劄m-Q~bP=3I,#*#pHm S<)PDH0C;2bM׬`blK0ڗ{$hrf-m)ט ؼeKb0+N 2b >GЯ?l=P(gFp#: \"osHH=ķ"-W4\WQE5NH w Ϡ3p<ҩK`61}ܩ!]LTEaƯ^9Rnjg(p[P9 +9; +ƔXS#ҍ72fE)¿2WDD* GR.nHIybnD9rJȡoU׏Kio Y"y఑2^D5R1傑 C*D>7P)%i"DnkQ^qx y(qgK(U2GQXnv�Bw#[b{3͘Y{KJ듮tJ}ʼn Rh~&}bAqɅ=*k|XQl]xI{ycB<;cq8 \dg +^&b%P|iyԡr|ݵk]&wN˯i=y]cׯ+/k+~udyW^yɕC^yW^1W^y_?'NW$m|?3?`~RR^yW^C^yW^1W^yC^yW^1W^yUfQI/Oߟago˜1W^yKIyW^yeǐW^yWv yW^yeǐW^yWv yW^yrU3^5?3+c++;+c++;+c+ʫW?إW^y^eyW^ ĉGl9RR^yW^1W^yi}->Hv yW^yeǐW^yWv yW^yeǐW^yWv yW^yU^W^yE'N߷dO8?(ώ!ʫ vͻ)  ߧ;<L.%W^yOST9B+?Pώ!+! "?+ʎ!ʫutv yW^yXǐW^y^|i7o<;Bv yW^s/R?=jRR^yW^1W^yC^yW^1W^yC^yW^A%>iW^ygcP+:cx/D^yW^X'ݿ*W^yO6o����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/filtered.png����������������������������������������������������������������000644 �000765 �000000 �00000647431 11332353405 017702� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��O���y���bKGD������ pHYs�� �� ����tIME RJ�� �IDATx{yWc `P�nR$1|�,Q)M#N{1e'ڛMzlJ7~%woʏ8MѶcxGFKI$EAR@n�60xq4jq~_"{EHHHHH\x_�0  {g{?':rD$$$$$ިR}s gHHHHHH !!!8}ĹZaetklo8n!xuOcs͛/^[#_zfV.dr)HHHHxsoG^ Ghހm7߻0'>:>e{ fGjoa{CKHHH\ռoGn Z=p̖ u{-C=)6F2[7nKABBBG____s_�loHx5gݶMk?{>ϟ~kF~u!ׁ/#+O 7)5x-A` {~SsgMw8}1|Ùe;vig{sf@g_?z⿖>7.ST۲7dvnOr>7_^\ӿ06:Gwj@3'杷6k;#^5./.ʛ}PHHH\IMԶM>oyȋ zC`L9s�._>572:2c#߯ߵw__eO?mc:>wc7qugO^0!;G�ح?^�gvS]G{lԆ[z9,QvoL>l'߳}oq[IBb ]vЉ]w峿>,~{]@?u7؏T9\j Ύdڰeʶ_Ož2\F^;00 ;nkotz<Iݵq/�P}w}{tgM]|'�<w{CMW'ާnV~_|ynzM#/^:|_o; _m+oο}gf�m?xϭg;xv|}wݰi$}܅7d3; CڰqߜٵF-}ع̗6hh&gs_#%$02UsgΜ؟I?vs /gOzl海Fc@@g| _whc7]=xKſm۶q˶Co=~r-{o ~|ϫo~̹C6m7~_B_6k~冻nY|> ߛQmP;eym7'::o䜘OЯ]{>l~k ]ʛ<5edݷT;1{n�Mڡa&MkW6I !qe |>Nw4; /3'./;mn/\Z~w.�8zǬ=w_Nοݗ?r'G4p|̹ۮOOvnQe7uh|Oۗ>kwc7_|mf˯~qM>{7ھ w߲qð=woȻw_ut#GІkw}{3}e.50nN0윜䝷Sixpko;q/<sgϜOU~X}5?7�w!=|lb%IHH*sH!S}}g_ɗ~_LcF \< GΜ?ܹs8oݴt;~÷ߜ];ԇOІ7~_Coݷ{_=}lO7IptKX p΅�~ڑ \L 8l@/]?lS�G_֝٣FG�\ݎ/^m9+5y<TJu3wzw~n~;1>_횑]f9sr˗/ψHH\Qzr >ۿPߍbӇy;y _I3_M]Ν\'_zS_6*codoy<~|p]7F[ߛ^ti`xX K)Oxwpo|؉jgo~2J86k6N/F_87@ͣ_<q/��lۺe`pjDžz]}w_ƫы/U6 ?^D_HHH\E6TM)m 6g?_lJ/^ zm#vէ>NO-ȱ: w_>xҽO9q_k?(s{?ޣ: zpUuCi/6AK. ={S)ߙ-lۺ~W^ĭ7y~ڱ{y{lTcwO|׎b}?zvܵh?oqG˯9p;�{~8yL{n(|nHu$$$z74Ƨ(7D<W?W?q!g|G4tlQ/Z;v?s"nᮄ:_ihfA?~ůG�_o{\ػ;?qO÷^y#yS7}Onظypx}?:~ؽ_cSO~w܅  OL{o֋?Syw^|ӵ+  :{g'~{}wfœϦ}$=t_6w(_W?#R}Ҧ$!q163 Wo  y?CA|_^,7ȱ}%>]{~"˗/y[2.]:5??sJQ_˗/\psS6nٸu`hueivQ~ɣo;o>e_8wnCFǔѭCC|Җm6;_s�c2ȡ^pnFk7^͟ݺ̥/IGFj'u77/o;ns/=k2C'9[;}a˗ӛ]M¦$ Vl鹋/ Gμ-x=ڥ /_NG6j7o/^?ПVl?844A& +n!E\>˛kVYȋYsǎ7XNvvzbm ՠk_޶tӧT}vj8�Z*5eu/_C___ңT??008<804<JGh๑ѾT?%4t0ۯJoKoʨش c@_zdZA2:08C^5wrgןR];bR}}}}X/q[];4q/Z\\tb Ƕ]J yڬ|Rxd W<O^gCϾ5m:sf.g`pieEŅ Οp&&cdS4ݺ#tep8e.C鑡̱cۯo~bZ~CG6iyӞ໯mٳ?+{tMng_*?0q<%?mj �%*UiSjf)klM2{⪝cՙ˗.R [oHoܒ� p~ٷO;x饗7l<Yg+kuUwͩO7lLdԐD^zٰqxj ٷ+6mٰi\F6l\_F73*!!!qubdtIo�=ё:<iU#<@'O$!!!qG ]z$oABBBBB $$$$$$oABBBBB 5@E^[L bKiF6,cזE\w D.5P:mϲo }zJ09K+7nZ-_|=366677 z14wwZMZȂޜ -Yqҽ?JoMK`zCWsj"nyŽjg4VZrOewe6'nr [ՆԊn/;;VzݬD:cq- ߫]^;@;Jb!@4^mWbI$N[K D#nMVatğU&Jt,M8Ίl).KSWDʪVhUDnU;E֥O m rUH[ uwWajxk:Ixˡf[Pk=]驿JyC{kq+ljzM@ ]ĥY)/ҭS {iq$6Wsk!P9WnjTưrhv67752Lo ! OǹWı][ZVS::\dVm^:sm|UWy'NF^ۍÕog_cczѲT*oϟ:2:vKȜkN[z k*t=b@ 7HHHHHH !!!!!y 7HHHHHH !!!!!y 7HHHHHH !!!!!y 7HHHHHH !!!!!y Wo躞_wW3B40$. LuЏܜ,%!!!j&_5$B_#D# 6t%WJђvQ;v966$~kiz=;%$$$`ƐLCyeeM^2f&ǽ!W5e^YБE7|_J$Hs=VƂҙM)4섔6sD<W5 4%RcH&bz'Nh&Ҧ$!!!#) tюN~Izx@$+k7Y5%ov! ~[r ޤ2 7HHHHHH !!!!!y 7HHHHH6"7<r\$$$$P#<"EBBBB$$$$$)}"!!!qa˖-cAܱ:M9yj~G>.ڳ-5zpzpzvB3D>z=kzGݲe񞚣\<{Ќ`|V H !!!!!y KDuB֪`V1k[92:Z]eʮE~q|Ya㖐\AB.Boֱ8u!U,}#ݐpql[t7~4x={%&yڹo5kKaY/,KqY-Њ0a=G^G"=3~#l)|[Jj>CF>0"#`&F2vgɑoKkG7Ѱ܊m}j ˸ړpfOnlvW;_YPW_R ձY#[h6W_Wmel;[8mdeMR>=B{7=]ʬwݒ^޵BG[-Ggf)^ =Kz|Ǯxrj{6ř>#yXoIpz3eW r;+-rwy풑j]/`BV\\:c֤u1˻VⅫ{AAogS-_i]ХVbe\",݉|j TJta5ᘇKe՚~3l[u{dk+Kْ]&;ʩKߍ\+рvzB[*/Pt׶vfVUm|U6Ȝø$ABBS۫r$$$z=HIABBBBB V)r5k{=k,F߳sԃ Sg_ccݵDToXMQyldt՗6% 0K?y�K m;6a9_/ c}o/>oz m;f-[^zliS 7HHHHHH !!!!D|J]$ ep f_vS11TZܑ̯UJku1bT+3Mf=0#])gdufw6o/Z]zY+TJf.V[jFdCCjYCx w:<G#}Fz?ewԪe|Ozzp] ߜfnlF\bͿ;]IKLj;Y"z#tFzr<]S ^gqܖn.[=aWx5h gMkUŽY.;r/Ȳ,/z1N; a)__B` kIG:r<$pfqx2cX匬;xs]/ KWWAvGok w͈#OBGFyG^fd)s֍R%"|͋qIhIrn둎,Gӑ0ZGzk<nHe 7HHHHHH !!!!!yr#:Ni)ϗ^-~wّu/+\swϾNkˉ^.t.!!!!rR?#/=3N C7<#rP$$$$Jl ԧHHHḢ?8% A;ևBABBBb}.$$$$ֆl#77HHHH8SABBBb=|E$$$$j'v$$$$6VF-o7HHH\U~=tuh7&_ y(6 W0eO3'z;L UB$gHm��f$r$mh';X$$$z4Rm\E1m#·uHE~EѥMIBBb}!�}cX+!Evit]q")mJKWHF~ ˥mᡯQz%o~]_nvjᕼABBb=:T'@l=81MTx;L.Fk>!yD<0Ec Fv7;03/]akN;m=|{ $$$:!B!1zd _s'R'ڹ+pl +4V hYdtft$'Y9FKah.v*0CW(�fE4a ҍg#Χq`{ǿ?#!q\OhU ŐfIpst�� �IDATY{j2V h98VS̀&5+ PO}}y7HH\ A{&fގC[? @#$042F#8FcK@|pкuwhk[SL8-'yĺޥ,Oڡeztc+ 43le\OW]Qn>dSҠ2kiin9̈UXӕn겴)IH 6w&]4cQZ k%hʥ>5! :wk 8 xKfEΈ~)-3foc ;&yڡIap֊Z1Լ{5ʮhm]Z�Iz<sX]K4B 6RGif픙c4+H !,EͶJ.w-̰Ǔ#X2 )bZz3b!m h Fpu%oXVeF m;v` WGN-,jN~9k[i0RХ*,ٳe@D4- M7iӮkڂx܍Ɗ]pD NցTЫZHm=n];ZmoAB"Lv8iDŽ%d ks8]kc Zk9|JN+ke@2ޅ| %oE$f�vc;0 QT&FTGpH@Y#Ƣu/tDŽf3�+)jLYMщq$$$ʍY\737[t{h-Hh~hk2~4VgBl_b ,γ;g$hibL+iI%C $\iB-#ɖe3!<Z�ߪh!MI0h hϢXT,C[ 3C�dԳĭ),1 W6M=΢3u8Z- XP\o.hRLPGdYjXD+VXF6;a4NI415sFtjCb Xr!Ŭ/ưaRo@%GFj'*p`�a>y-66=]ǃ x34 Z7zHr"jO d8G0EÂs7iI(RTxXu#;~`][xXnquxJ @]"dIo <--1�E@pFEʙQOZCX<BL¢(iO0gԍ.0ٲ<<ܴeXBěO`Eɍivm 9blI0+Ik\WRoXGz@td3~ hgGg6 , 0Խ瀙`eWp8]%²/iFDGjfhyEyXwBJ|kՎՈ&2͛ t?6]s S&yza )k6luR@?h4>аqpɱ;"| Is ("ʅ[3 3=o ]{[E>m#d,/ZƢ2),ڨ-3eIv|-IxmGDM; f\f?DE r-hO2ڳ'n]X$yĪ"'oJa )TH4>*sX( L3wdoy(,X2OpXEnQ׎r"gԵk`V5dGrӬvL: MC_!"#ח !o[(}ĖN$VQWLD5 euK=ot?\F o)h`4y:',%QE.$Diak21M|E~,ʙ�eQ<J Ve5\n_,Q#8kTayيT77u%eb1G{bh9YQډLm&KيbډV(I #l.^ؖ"ڜnFy4a 'NV)rЀnL1 JNs?0Zbf*)M19�f*rfYwE03/ǢxZxʔ?g[G+Fx݅Phb-{T`ڬL`SgijR¥W�aֹP"Â[- -DfM'ǡnOzˮDW�)*� S[hp25X~[J<%` "f@"P t  '�fQ5a;X(¡>d%v"@WxeJZp) \jPXd�`T gWy8�T0p%K#? &*Y2e&ӒF9@4j3ʙÀ"Se, zuO:sQnAP݀ɱ?4b$;=\IUVks#vaKN#YRhLkxU9)SmKسF'{_ W-X,!K#E<lj P}@l&M4\?k 6k0tpݰT(rFK+r[OTT.rh\,YũE,¢|,YisʦP\erak.XWP.z.LRe2KĂɠ\X&V>ږo3VZy`AR٭mi05 ݥ]bbh'Tڔ$ōVyܰ,i$)APSv#O#4Xs#A:n|Q63%`Q)`bڄ)Fe=LܢʥOZlSOtfɲxٜ'9˚*?^\S(%ypS?�ar7j*S �- XQt]ƴYektaX0w,j {(7{"VB>u|4GHWG[h=tq1Zڔ$<uhtAp#MHVxua 1\SsbA>FK�"�2 XA8&jÀfVZ %5pDl UJn%+D5;3*Vr@eJm8D&vV݀'5XT(`yEQh� t� vmAȡB/}[uT"O?pA(`pHRdmؾ_GVVzxk"<x>j0 it<u:m<޸>}ҘIĵQXq,-1÷5|F/ ެ'vYq/1Zp 8U={;uf~-'>OIҹn<F(93td ="`$ '=%TY͢<8 uJ`48"-~wf f(j$�VL jvzg9) Bw>Mj/9Q+P Pf`!  3 5Ufg /8Dqܦ.ؚ UUȎc T]ȫ #klNkuu0n؇� `Fa&PH>0kbjxR$@13{`@ mJb;dD ,rg*^#ih1Ngp{G&~Y긵ŏ汑ѱGW_zF =w"c(HdS4wW% @`F -d[P N1MF$&3&4pP VKVw8:*P5dFG-fgӯj;jw+P;Her$x}8 (Ur!]z~eoq] EbiTT Y䔂pL ` f܄)GI(8Ls6$B tg,sn#VN$_{-@W"4 zk� Pӛ,$, ¬n@F"H DHe"&&t'V{Cz'Zx@r2kiIЃ],(S~ A>F OЍ(<8CN`^e .gF 0[XBudi8 L ]^tn8PUR18Lbfl9'C @UrV7}3ەCHfR B;m+C( biD(QU, .B(MyPVAFe.� kPyPOPn96JPV  LmHPa#�V к139Gpa)G�3ȃqd hOOyh}ASH%*E!!.u#|T ԃT寤ayG9TBج:jF&G i]mn.e5 u!Z8[Rc"+)8To!A�8+s%1 ([5%H ?C )07F+2Kx `f ELL>-&,S)q%FaY\fNY&iM^6q($>jђ8 r+MpS W qd)g0e\̙YBd[&gƊ =Sq\2T,g,"Q0Zb(@D+x7_QE4[)*+JRRe$FxX\=2e{ǛmY B;>J:,ElE06lbRF3^`0 C)a ! , 8\aשƌ'<MQh0z`rV Y4%3Y$l K(T"ZvrnVNj%Y�2ܪ[ŸIól-Wq ibIЬ zla'R6QS@uFQɄ2x٩Y(>Q#?9 pCH?*\Z¸%΀Ր-`qŀ3a3!V#k�m2Xv5,P׈^g d}=%߰} [v"Ze'K �< x^X ΪjM¢=;3Je!U,< (k �&5G"Y�*AA�R׀$fxN\ր}dgf EDU% V؍߆V#d'sgJ7(.3wryEjV� �Tqڌ p栒􀣩P#Pg 67r@ˉpU]:*P�q" j6Xh[i'Chy?ے+ʹE>c.W7zG\Bc-:m4d.9Op4[YڔVR %6NsDf4#Π1mSCS[z;ӫ@*l"3IY~E?kXE^6Keq8U.d~:L0\te\.1qτj2-Y& 7YXa2yș%Jr4 ²rYVD\?y r^ zr@-O|`\tPO-D g4\$=A}Z8e/xbc!+KCD`ՁU\Vcˁ:gB-iHʧRoVK2'p\7FtMz>D3 ܁�lWOFRw6`ȚP("kV5`pf�,$6`l6ZG0s9KIRA�[%'c2�"t;<)T& ՠMڶi" OP0Z&*`Jɮ�89kyXT;< �EԐ -5V+AE@"Ig(*Dkm ƌ)lL@S !j3UѴ6 |߱L5= >r npV<)�f@3B$xa-k Iw&�#3@T\o'eXj!0<<hkO4  r՛̃{a$thiv7=H%5w+�1h �dR70Kb'! rB` P641V!�mR#If Yu5ʙ @CPzC&<�[3`@32-l@ Yy A&LTp�P3ShBSa/6^7�|�*ѫ AGMa,ɵ AgU(Q:`Of �x\-SxVJ�4�<4+|Мs@j � 8Z� 6q:<:󞻐yR𬺟Q-A R20F 췋%q[ Pqٔ&)4 "Q�ܡG}:uֿp*Rz.1nv=~Gie~t.pȐX ifMFkRYF}^7%<X-btĊQ\7%qwko8r1r޷rřÙAs΂p;beH*+P0�uuozz:E rP)*�sO%@ށ*i*gbϫDq())g 6n�E>a�ԈhPSI󦨂q�ϪP(4S%�;UhE  %Y ȉ$v YvPQùj@ͩU8BA Sj�ԩ"ݜK- qÄꔬ=,rJZ,LJ` 4d#2۔4lMW|ӿGAs=U8_U .EB": F _D؍Q2X`[tVh:mז#)KޡYL!6c4#ԖAqobXr@&QAy= r~RCNj 7v" 6w3At�\7,(@'<Ly:@*4�* [,x� ZCS(ibLh^@pmO:(ȡJFewkTf�=IQCUJ3(̘ȻS931Q@@ l &&ɾ Tf)U9&@ĸ*dO?gg~1bxLv#oF(5s6G<Y<wdG(`N > k79hKjkGU|-k"C6.CQDV2&aNƃmC- !@HhZo4ZUúZ<l2:^XBZ@&|Jȗ6/5\"e5|I-_a8"lp]l @?gk*NeI(uXʫCȃAjW`aŸQ-F.R%mW YaܤoU�a*4 &Jlk(9TSTȋL%JZ5GbtZqiNEIb\<WZi�o֨+ &g*Ak*"pMWmVPi.eaW%9(Oh3y1#'{qP*SL? +$$:H9094D[of7%G4޸a҉ "ۧmβfvja$ Bɰ!iЪ4P4-)mSy?Ӏ^BZ?uuaU,L贤_D/@7P3^\hП[El < �i�J*%50�H֍tM6r:x9L*�MB+pO`F�� �IDAT ,"F69˓6bdcW]#&()ќe [a�FF)kp * iJ�*@EqyD!䘙U>.')W5{֞~ psP6HցFI^eݰƋ60`ܱC^lM٪c?1(,D,WЅ^nKp/tCjKj$f}E\GX% | f�!`M=^O\qCV =gNN(Q%zb1z#۬7Dz9{+x !t7u<Bׂi(4)͹dߙ"E$krh& h @Zք^tc0hxqTII�bL@"��˄`ƀ"� @[|fgLz6<JJF&ɫ%F#]</ܶ@DwH} ;}Z+sÜ7\C)*f[|jb|(MA550rgQ'`*wǽzp,͓q|`PAnd=?0e)i**&j0PQTLS>]Ԟ)`FjͮBv s �#=,4%nJ2)EX$O]?r k\i>k\4[E󍤐57{D9(lM6.k1[=HGa7Ab*ˆ3:0RN6w{ ll=ٓmx;Ep84B�"SFF}!7_nTNiM :m"7T^0_(,F񔉧WĦ[JˢN`Kw0I&nc[CT.bȟ39{OY(w|aAnN ܐYz�E**�uk$KYzS X3`&i �6_Qq@=m`y% Qs+rցRTn5@Hk}M6ViPכSc]Qv":6Kа30<^QtJtڮ*\'HsƩ`4,}s\=w<%jhQ&-XP\  ^1,fn,Lbb"ZgQ2ap42P;ďa oth&tJt&gDG(�<_@ S5AK$&/n2[ :8p`j 4}@ \3`Ѐ},qyC%3z*�*Db<D3TܫR$v|Q@bEL8qN=`<L݁%*CQŸC*C*mKػ( T+UL(&0.AC\y9`Nr�V `wFoOP/^oxIa#<kr @6\h;t,L4֑mDJ^ V 旓-{$.Ss˫4)mso<r L V B:npf1,Ի2mP/uu#q+Y͊ށ[ sk;{wZfdM0",Tk*n^:<Q\S.pnAa0A\ƫ*ϲLphJhL^W"*F"^g&g(Y) n:iretPX9EoMe2p00MMu20qML(S^vu{OM6 Rs#Y&@)PnQXgmm}z(*ݬZWbd֔%aEEuU?2};YSaшlzq"u{YzBo<]Kp^o٩`It9B= 8FXhJzIZ?Z>047Dt#r�x2LU€sghT}epBLfQT,"fIdyd MMx'�qsN(Y"NiIk:HuxM*ςU 4Y+E�ZY] |f75^q DSy%Vȍ DsP{M7*FA[LВ A9L0%q�`Qr%j 8,#7Š�mʙ82juJt?)D(Hb'J0k;KeW-O)i4OXȳJLmxY@dӎ<zc٨8Cr}sݞCģ zwuiQ\)7Cږ!(&M /QiAKM&k5 )ZSz (Ӧf"Ll"#E)*q f3mp͂m,qA1Zb&* y \4.U>#9I,`\[9$рQ)l)X6%&t: <@LnS^Vr m7Z)_OUB@uPkwTR1T(`;m(*oN̨ VIq>Ԓ@jdzki[Y6T|}(N&G͜ B+ªV**@nMPX 6ԜN9&–ay`Զ�d`9J1kh(*M*,_}@4V?Dr^B/?1ㅴN0 &ݡE2aDo/EFzʛH~$D&7oH ڨ-ҦZQN/MwI[XN?DRhd4P [PzX vPVOTwӓ4_ѫP_hr16"n^#yq$tJn6�[Q3O 5 P% ("9Dcw*^�)Y Z�$ d �W DؒR�ٹ+7,ϫ`$ݨm"`yՍ;`7Pe < fa{w M VUTj( �U9|dJ�5p(@eqB *@ف%tDpi j (Ϻ0 &KYY% YSLpIy ]`* pJbX;Wk#䀵]G.pF+z$|H)2itMN96hZPߘaQHx=9Sd6:E$ሠF_kXvR!V%wp ! {Ѩ:h0eZwen&" Z4A`{5NDx:D5ꚪB Bz04PVQp ;"4tQgp@ T_$B �jpVK Mt@ ʱh&�)ꉾ)`T*b!Q< _f%>~[y@w8 Q !T&s!C' 3&򅡜<PӔ3$}c *y;_6Jд=Pi(5*lu> XQ ؆ �j"%)dD8Q%k|1Wh.pkPQla؍ J�y{F4MIQ$]2,#UZq'bfP@a` @5op]utvX$"Zi;Y(TK)*`CꞎC!+k>_A߂ep}]"'AL-ƣ?# '!P:pcnQ FVs':TgILbQڌŘ6B0/Lž=rmc=φ u1s'}ͧgR}<`b_,g86c^(r;54[{/)}rJFS#-d%MD>O-MU8b ZJ_$~KAA'. *B~ #IVB0ʋ '�w5=FX^&by2bM H�XL*q *~UC҇xzmb]Gzb!̀?9_s; q~n'/�ڟ@z9d_#5B6,ނ>v8Gg=%(eMOa{1, 0A (slI�8*~q?M!w41T@,x聴Ïj@(�[q  C-0V6s!'6E$z2_.ǐ Ŝps'ʈZ乳N{䂎PJۡhB&#vA'|Gp,5@pgƻ3~Xw!L;4$t6V2ȍ.`v'ګ8#Qf\ n3熊 �*1 TI H\8q)vP{f)'Ì^~~xxȃʡDMmH^\jBI[CxK2(CfA)^�w,'AYs K]ڽ PXVX'U7I(M|]dg=�0?R/ Yrg!I]K3�DT')%&Y92#]x�Žev PVUv8 .R8m:Dc ޕ [< AiJ[ ^bwTV!c b3:)\-ě N!;gVDHGʾvdEoQȠ,M8qa/}IS/'Z'4zG(j,<3b? !yyL#zfTT뼩y ק BC~7ؠcrpBy)w&-U|7W@) 3ZqNAi6P(8)/3ɸ}- E!ď PFn~r!HJx* 1a`׬َfD؇KcMAdZ6- C.yYJjk ΛH'&TR`'xz,Q?[]no2jD* \/~Xv nɵDlQ _%K2fu`wկ:=rR2%nO2Xz)H"v�W퀻n Cx`o3?:n3êMB�`&DZ- i!5HT hAh+૳sף/j1Qc*ï >[4 8$Y qb[pW0w!ŝԦ|z&Νs o\{(zD ɐLj߈q|-wdL6G'BD/8lT/y8I+AHرB<"`E Z]k,Key'Ki�ւIO@%ZHK!|oBp%3Ԛ}<&7pK9;'ϡ NL_)TߓqhN)^@|AfɎ~K=& @f/9v@vHg@s%9=NJP)9'1R'4e`7UXVXxv@1 }}OL-'p ;GH;.GZ^9܏cMTpt|_Cd0{ߔC{ Q!Q zO> fy2%>5LWȩ]PnXD{)Y6οADAd+sxO^Wn ||`T022]?!�bo^#(pXR: |[dSQQ IP"VuLPD.a~B-�G@}ǂ}d;{ {-H% [`�@<PqO20;[%8z_8_�--tG [ _ֺ$O$ >XR|6Tԡ@z)m`b -DL �6gtv!Pu~笣^XR ?R je�Ur-�9M=Uw>CJͷ5ڔfIl ZMC8&=rG#?5~`TE �2pP\E=<ޓЎjqj!u]Rǹv8fM1aTf]OmO`<1j9Sl3/Ū܍Qd>0G SἲJ 'S\Zw2UŻ()}Ȟe ZCL}'fX,h+^ԉ9"ĪdbQ̤9%-O`09CH_ PK;8x%<;<Ќu2�u\�Ggb&e[7L n .9!8<"(PdA0}4PozZxx(`agdM'ZZ䏟,rUÞ>'yȴ} 1&P^fʌ[ 21ޭ8_CD^ű&{oy/1| k]CZOҧ)PV,3 /K:?iVGԉ>0wcF%ug=Q1b z�(Wbpߒ'w"]Nqv%/#K@ge/+,&h?[75@-J"ojBAʝiPY$p懎;e,҆ʟ2MU61NEPPx(]k ứ;S,{[ޝwXqֳeVzvFLЉ5e/\`i`P>ޕ# 5i9\4}Qp2OI`ވ&f#_vV8ZY N,F< v$@ڔAp?p̯mwF4dM๤.z5yM* �~S=]�Tp^%2d.A)Ҁ'5PYTl(+ЄCD@(9ҵ+%xcyx Ք9?z꠽1dʼnNMԆ򰅯ΒsK+C d]doB8X Sclպ�6j 'o`P`HB�/S>t?X?K3F/5g-<k BPT2ml%4)2TphA;<Hgb C a~ݎAjRvI./! 2ϓBPL&0'Pj3Lފ �6~^f|(0YQ"vwTL b7yW\ Sϒw,{|d Fpz%K^rZ/b_ 8Ka0vtUh^8+9 1+)NГa+jv/>sm3�R|ά>Ϝp3qk"E;"sc~Hy s{}H@2`h$.sq/$f=CcfbV�%R H`cb@tO3(Ą 6e( 89V$P7 t׎_ Ts?Ns  M �N)HcFrT[%'a>$8K_*e{ʚ |`H)kI I hMe8RBUE6L@⤓v ByOk;ަ$O$vߑМfP`Lp k<Y�xOT�� �IDATB@ v%S8t#H�'>6AQz;KLbqגE>{ w4"uLf/o%DjkSl4D/buQb`˧^qXgA#Sx?<L96Zq�p'Ij#~j. s 00ste:]uJm24UO}-2]St4n5co 2~~Cr&8�b\|n #Ʀ J}G{ޕ�'J=œ>>k@0�oΓ䫮S=*VR**CqySE92`U ]X]h=Nӎ[5�~|d.3} l\[ҸF άQk TXR(dǃy~ʓ,Ri)\%GK"JDA7Yq n 8D0XxRyDI? `)M|dC,4goz|(@rNN#:ẃ1ԆTZi�sMcl-,qږ@֮;={x'e<Gf ;M:vV4? ͏Tsdej(&PQxND'r9a}!37h&r()(|ʂTA$h(TFOMjC?妑GYQLJdߑF/ iF pa�Y |2#V*\ &y1sUWpU c&H �dt{)c"~B9!�E P٥ SeW"@U6ċ*M|ԓU7ZcpԋMn4Dfhl8}T;V&5dd_ ~JNm:;tj['Ln1XMIͪ-ݟ /*?| rɚr<&:�>ch89/6%Dw# dɐ҇ /q O$UHzɄLV jُx! JE'qGzL%g愔Wġ1-)'<bb{l&νL]. ]{rOb \N%7!y4Qw6,ΣM=qV&{H?7tмI?uZ?L=~\{tqgW2 %;ܕevWY3f�: >?6�X\/: @郇?( b#i`tg嵁J&`/@"`1B&9>FWZ48 ,I@ Es l jxÕ$)T04A.iЧrG;X^?lTe SZ}5Y}W5uR6r!SK/:l6 Vpx|n�Քo`�VoNԛ*d~uhЇ {m9 -ހDBTBZ{h7R)v Is 27;bb/} pKXh 2� KL~c+PT`, M(6,g/qC�Ÿ-/¸PfΥ̎2lW@]=d{q' ݄G< Ot$.;dЂz:CRyDw|ds SܵI\ot;":ιR6ad E:H\"7$( BX;~+<3ʧ1r8ڥE~r+)8t6 =nqȼG -p枬�S `Iʕ+) Ʉ8o+'E%kX+ZU_}]\KZ]_O5C}~)tw-{@iA<no : [GTdEB'iLumz~]!].k%z7m8ϖ9 [; K�"ӄ� /:`>q�8s 6;O ))g-w H�;{Rz${1x(FycmqA2ݓ%E!c?+0()I! sVLTX8,�8xN؝0fw|<;ވ89\# <%q?w0æI%vA`w ,^ؔdxDk1I+{Ѵ͎7GN~f(6va a2,&.͟7鏚�6+$98cmPTiRr~!x[(?Mz@TA* C�aF@bYJBxn/8x T%{T*$g>դHj_<<^~=nK_5n ״y!7G2u-ѫTq&]G`=zM ̞x<ЩFmXVx댡qvXh-[jFqF U[QFt} ҙLK࠷'5I2<{j} Mx9h%--D6Den_Z 3 k{;܍6^}( _s\pm%T'KHdӂ1M~Ka=iu�XefmKK-f I\ן`M<qٝ)/EM4#uE(Y励@2BK`$J8sέwhfG>^z/5CM+^x-Sʂ]) Ip̜o*3u"&52b6 jg&i U7* #iSP8Qn4na0ȀX(W$!8Qq {'�mR DH;<>4NY戊` ؆}H_HDq=�)͠3)ѻ4@1:}.2̴KS0`gl>|PM/Kh o߭ʇ9Ū|cի_ چm?@/U&XͰknHz-<$%9M{+AթTJytA!5}}C78tCrG @v3~B$٥B0SrIWh6Aᵃ.#MX@eDwuA)As*y<JewG@ e%4pA X�HVj{ЛĐ?ɸruB"k.3i1boi1I"0 PXNM(q?WX݉R!ffζ+ Nł3�( ]f ??:OS]@V薾g>.i76YƩ)5ͼ g!?UP̓nP46TK(cJ_.�\ȍR,rGI6ix<02¡7>'nC0 wb@scl*waJд4<v- B-ID{Rpx\cO8t|!3 7$mWh6GVR보Npٗ--V3r^Ve7;ڸu6ѷg׼~Z]xI^nȇ]ˊԯ?7G} n@Uz+L_nf5αb=4lZ9yCᇨjXa칅_-4$i7?[bSJuXUvR S_2sMA= 'mS =X;߃ۂ +OP숳@Gqul?@ H^r7�ZfcC3UVBEy[es0Yfܤ/²1QY0>x&e:B$ˡ)ԄZ2N=<#%Ai+/ըfy+u4 >sfR6tO8hX0:JÙ4e#3MrQwGW0LC R/lb1i 0$ 7vI >Ϙ<EȔr%nM �x !apT]NG3e2|t6Nc@Q:GH4?<$Z3hH:$j7$3\rqlWioeoШdYy :epvCո?ז%,goNߒڃE焝4RYu7t7~tzkN~~O{G6*~u(Xo^ҋCƗNN"ՙ썓;rd ,мFPŁyfUHsԲd߼R� [J�OM=q8Z~c;>1y~ -ʵI c-()HlZFu ʡCn $ww)z 1crY|gNz˔<;iL 옡#cp|_CBw㈀:eY̆c3-4JF=?X3b1ngBSG1ztw>$i rH\\0c/|*I B`p?wpR_Da;{ѫ!) @Čk*0IaЁ,-dd @|E2rG|!gT 7Ϳ3 }5MQ(źNH3kÕ:\_u~+ qʾz}{PCǴF VW^5[yU^ۍ.,ޠVuoXWȞ[x=C<~߭VoNuFZd\6o{k/Բ^ j/+Z{j=%'Քh 3zZ -yX.?Zo'ֆJ,<D[7f7JwϏbyv RpY�_ AJETklxp r1'ƩSe(%- h^jVwv`h &!0Ɣד^;#-޾!1)xyWý{vJ|ot9is&; ܻ.ѽdl\fRWi!X;I3!ChWѲg�pis ;1- 00&$<� "�&IN,2ރ 82},֎ݷoD`1@e'C Fe@Hg?�)4<t�p>99%ÏF�4gQ'a8;$2 `O*B s.=X� 3YSYc窵UǯȰTztW͚,MmSՒv=ӕkGin]mM0XU�Yїj#}|9G|/^ʫURYۓS k+Y~Z/zxujEm5] mY a I+~O^d^mA/6f9MӟٟjRV+Y-5XPB nnrZ_ .fb(x/`7 [ٞjnX|d=2D.+;6K;UEy>E M$07Ivc{cl_͟JC8FOrNޏ }PȱDBSj0S37e/GH4PARr 37Gd$7wE;XcgV^QOsLev"v�pND9W)߫88:MBɎVhq|x�d |H2 h]bp+ LNe(aX�bjC �Z ^NH5z;r�p 2zqY�t#dMXz^֭솱StRSQCj4`Yugbm>\oOPӣ>@>->Xx vWnnС_,egTZԺ~E-ݭn~1][Fo zsatozu]aek^y}Hi~d-aGQZU:5V&i짏QYVåo,uAρj5E*5=jA>M_/kTjfbqѭt� `|i0 (�{*Gƕ؅WҔ0lߗ[~^ Le5@LGD"oF_�>ߧW!1ZM Di>p39y+{6Ҵ}'OS}x=g0A")#w=H?uOd4gQ/>r*2leYΐřG܉1$Wsg�c>Bp;v{DyN I`{Z9*w.{إj1AX�c.^~'Wt+@#|HA|p|]IxҌ&v !?@F9$:y "r]୆"y[YuN3nڪFJ*Rg1:vXv.텛:<KAL/\6'Yū2J1KЂv%{\9ilЄ}qCS?Mӕhjv5ޠW(\wɥk޷u:l]T*>�[6i}dv ޢ|!қ:AV+h`i߭.ަxZ?NVl2s_L6 oOn�c6v=:hqXՍ0(v:mF ܷ&1֒A`@wYH1R_0aL> Tsm"w{wrBHQ َskc)P־pf#zn,)h?xXF-UN?eY>|uw:Hbۮ:LK'ʻ>N$Kb= gytatb2ѻ~dҬ ,ȓFWPԒy[v[�`!0KW / e4 5CXi/ A9 A.3Ki 8&xN�H!_V$<#¾^"P!Y097NPx,8JZAc Eme )۾/AտV_WʫqvfXg@=kt9J"<zd'v9\dp+ZgRU*Pඕ-Yo.E[dՃJkIgU=!t�.:Ik^V:烌Y8j-;޲zѰ/?ՏkM,e+ h2yJ-UmTFE+:VKU?}N=xpr{|pɭ8 =B$3xpۓ '}p?. (l�68<건r@Q(d=5`;ʽ&ؒMvcHyw ek '@;%['hc9_sOn0a0A} 4NKK05zV~!8'fwY�� �IDATS49!lQa ruBL=<W8M%P�St٤1RB|-QH\)!+ss wˋ;|r?ɉ1X GYrN�P$j%&,~ukmExh݃o`s/B 9!J@g\Q%rlRq*'wdxpT2@uNpDw<!p"Yƿ?K2XY}X]JupB&Ok2Tg�n\SaõGvm|>Ȯ+G ZuH~Z hܢێэZֺK\d=릕-z`}PKKt *ֳ*%>[n>hYh\QGB',T{7CTMVG> XxԠxZmú"*ljcS%-ֽ'Vhȭp<B0ꐖOƛx!L T,|g�poxb|Vͬ�[2Jyygl+]W La0\f Q,c)'% A0cO4@};Qf?sT}11]]p l=;7)" ybFF?o44l'fE 'r1}j# #&sdeXG? 6fܬkc!\}XH7oPĆwʊmH�E 2 j޶!PfdZHA=~czf� dw"IxY]p/0Tdb{ˑpߓn -C(K`h SI>m>gxKj NIzz]9[> 7HΪ*(YfJsc?3Ï�Ïz֟m?P.`p]Xu+j妮NoPU돗(n5>cd)[e~j =kZk[+݇UZ,JUkz|lX9nˊ:h]QX W^{X~0<5[*XŇk͟nj5RM";N?Ԣ5�.X .D#0> oM @R'jS GlȐ ^`E#M s8l̅)d;T,/ zO!C|v/1σgd 69/;5\x3ubCCφLcȩ:W6WO"eMNK!`d]=L# _H_IER%7@(d7W1�Z`0̲`0ZABH# )8;+g?ٺg\VS+t&h%l%vn{i84\ (!Ǘ9\�g^�S$+R ipucaca @@Hsk2 f$]h(<4E3#8m"oA2+4J{n=mqhTgOUtVo6I}PV P+V )ֲ2Y^/YKW px,-Y^:.f,d ݳ,bW;ְ4 nYeHr54Jmxzuӫ|eu-BV=BoT.zy0k>,j㻅׷t}޺_.9fuui\dUjuW1PXFVW5ʿm~j_CΩۡC"vv ;\ B5B*Y丞3'>F2II�zƚ a(D ⠏lp7vi9a3un~K_SL<rnrc <ϫƷg+m8ř7hh&&,Ks@M@Ip\ߜrkL1+8*(o1khLO:�I,bܙ$4\Df!:oZ#,ˌTͼ~鷸l%zUQcPApt&(&/Ri^$?Jr�Sd^F*7opvS{<<6qπ&8_1J!`\O _<.BA x8 {H3 Վp�7:ɛ?sɃz{nmڒ=ǏY+OU'jFC{6n_4>`kk˃ק,,KIݮ7P[痃Ezee'_Zҏn5åZT :oA[ZԐߒF*OV[u ->Xjר.qlڅ6;Cb/ܪճ첺28^Ճڂ<_zǍ"]7//zknI oƠ$MЕ/πdo9hhb)>ñcjNw&Ў[=;4V͐-rzt=Z(yV.ܴYQ􋬗}`и mk9!zܕY.YŹgruN%,9Dc]6S6_}rT w>_TPLkJ/(CL.&?@reCX=qj$pة �J[P\x; EV=@ &) t@@7CXk^T00CA ~#] Xt k�qg؜8(X]R/j&WD{.[@K1|HWNm4D/vH <rH �DI#EO(É0pz`YuYY#rtJ.Ni:lX^f}[izozzWgWnR+w05T﷍+M|L"EI>'YGzn` 4`l.Vn(=` 8, � 47l'M'=Ė%cYd^TQ~If?]RLJQ|>c`<hM6Q,q~~L2Y\>?((J 6 4Nؓ39uWdvRgec!`ʴS=&(Tӓ0?\EYMX2 kiti%==('FoY>Nao>2ǵ~Z'|;ž`$L 8cڠAT2%%ϛ*=@]G`4j6}M!�fGlۗLav:er�|. fr;D |k<B�âsGѻ9p8w,�yWޗx`,E?@n߹]dew ){7Cזbp{8EA 8 #7ԲB\F63A*xQH*tKwO0�Gy xbs1Ho�4;r R3> -ƾ}}n$�hmE䁵) m(.=Haj=aNf4dYcNmqfҥoʬRoΦ~a,OHgp%8p6Ѐ PF8/q $Gp5{_~\ٔ^CyLWtZ ^Z1QVs5}{ %U-|*V/H�dǕѳIқG5`|Gb2ՇYVlMF/,1LI}<5]3q7 wAT;_?0gB\ǬDfȼ1ܯlYYe9Y҈3]VL21sjrK$T] ^=J}o\4y1t9 8TH 0d@! [a TG1.O=K'8 MhN W6|PWV{p_5l_*o/ddwY'=6@m6߽;�r^;cD|ݺ֣? %wFaTY!m UxB y:<nn™+\|{_7/RT/_3T#zEBut/u@y*/)ȃ[>8s 7NK9(Rn.s[㝪 6Z|SێpF f^f'`p! dnN ͔`63R'm1N`oi)l6]P4#{ڰ<\F?݃w v#ڜ�p�E&zRYi EƷ(k[ g[Gch)c]$=mڴNt$4gvk|OUl2&b _2gHN'd|nY`+ 8:S#2EL a:FnYYV%j�񌙣(qr6*\#oŵ0,V,wbT96PS]>/at=ϐ@bGg{/JK+ ֧O Zg Wje$ܜBkfZ,M 4` l4'1.BP x Pna)h#j `1f8B͖iWV(Grg1d^�|On4^F{q)]zwV#7+/[}o[˥0m2ލݪ' [m;7sݡ h[#/Rip.5Y}&W$W_=}ո@p]y7PfXm.l dF'ݶP-'n8'b 2O>{r3'Yh40fpCb3N>A ơ+Srցݞ7!A,I@6w:NQ�[飊\JVP}pBmÅձv9dk8xF҃QTj@Q((?)a?,*hM]*n a|䠗1]ۢ78r5Z|2+Fq iJx1Cwi<Ѕ#Zb*˕^8-t h<R櫜L&Lkџƥba~VK.Y7/^(k15x,uJܷqΛ<=G-Vظ4z\RljqU~Dޡ9B :5*�CLG}L"s3,Kf>)cP:0�ƈ'SkȸHNF~ #<T ت88t&\2hZ2:5uog-ny@D Fye<AvlһqC*ͯ|qyDqgFݥIqleY;ftMz#-sx.UNY~.wYlQF�Shҹ{[Ҝޮhx4D^hoP .v|l�̌!/D @"Mڱ v(c�`MEC@CByc̽"gWd{Ag$<.J(nN�$=-Qx^1=A5l  T!6sХ+Oӂ*; ± z^jp hhtPܰ1+Z)5%%#J^?KJa0˝)HRYUqnFDžӄAL{LDzfXNڜQ5 Hbֿx^14iYi~Ύ1 *3zN|iv+$l_}z1%g/Ֆ7UN=g%'jyI.a@/_oqe0,Or9\\)MxXaXIޘ~pjfV9-"fȨԍRO%5Rx3O^>|\@816mnCϟh$5VsX+"%#YK=:��08w �Hŗcpn=)! }r˄*^z sb`6_Zjހ2eA’Pw%?7uwsTQ>jXMOA ;r(L){\qHK|9AP6�a}qNEX"%/9@鄏m_64�:GR6'-@mjyb_DDR!)8R�xഥ즇{\q2cc@qPtD؁hz.kRX(vZ- <=IrBjkBh�G. T8tӞش>.2Z[;, �+{Y#c!qx(xKGb$kѺ,6]&c/Gz,|f0E]21."o{V4SRɬdG@}R)t4M6SsIjRX鰖;>ZK ̄s7M[y?9jXeڨ~i+V-U@X<t>[_#oӭx%pd*a:!( tڅ&ߟts9&1zvDr^)3OcD`$((瑌EmPU[X]yZ*yb+-a[jyA9Ck<_B7`'AiXz08.bV'"zf9DqAK!p۶Pm0ў͔P l^wܫ"[}A {%oN[o~-4,!lÝ4[!2kAj nx78׷#K_,`$wW\o*ܟoKA{t-o6x8d~ 's{/;h7͚=GQ eL\h��RN6`ɠɆ'} TX:xbޕ478(w }�Bz 1T|pDžO0[pw Yg-| v\ бC7:m삹8̎m$/l{{Ч)9 QlPw\`7-  kAn�4zBF -46jAOiC*M*+i*XǛgq*jz� 89ob5#2Hn}ZVX*j=cg㓏f(,ZVx5ƄV/ ;k<MrQ`Mx/ !`Bū*.iyPA^uVY}em}Ur?T{w/0ytK˧i2jDQQXWt5W@!y[Lx\s+9{3Xnk'%l Ciմs3CәAKXֵF2Q19k#Tv&LVhy_asd) ;@EpmV֐ǚF(x :p(|EAr|5wB,2]B\\i\'n3r$;f2jҺ߹ƽ"\7[8nwl7qܦn.]ԡǛI ܻwbxwhܯD1n vvd|W)�<Hp`Cg�� �IDATSh!�SDz· P;컈t"OE +ŝVF ) d$,4G3Slz7)z CK+p1O hBVjRsW #*�[HeN J.t=xӖA+vdmP;"Mho΀Gbq=)LB] (~lMž~wp\:PE>E%@TB!c"+WI1?Vp\kh8W_ok<9m?,bd@e K0%:I+1Y:ce]Ys3-u+^oa{ˋ$9B%߸ rŵяחc$Q1 9EK e_+vs_ U2*j zCA ӋqmU&)t #zx:E9z##$@?]~H/"�%jRR,b[OV[`qbi03Se3p-lx;�U)iVC-wwO۠yvB/]T8mLvNHE?Wn[i^Hvߴ{y\wf-&F\gYn*.#%X V;w{q߻&[? ?S %!#}؆hm/ (]քAHMF<@}h;~ xqֆ粡-BGEcrW29BkR�*G[dJO%~.6@ Xt{gR NJvY  恺 p쫬bnl#k�Jql`QI`̵ A4&') E ;p\ vlb{ !\plӕ<sj@}%$nvsfѧݒd'$N?ky/,ҘU~J% %9bOel JfI%VmU =S:RFY[AG(R8+㇢1 hߧzB+-'ecTD9'}OFoߟwjBjj\"-a6WJQ8oԐWin4.M\6}{<=/q?ucsތ >62sg0y4@dtTBVjyYAqUzdp6� ~~,ك_u )A4\�rj MLHJ=H t3KmCٵ=\ M:q!M4AsK7X$oWrA.}E!B;"bAA[=}됅2qE'gޡZ)[B q2/!?W�y]yەrRDgλDZ  <#S#|h xvY 3 >&B 'cRpn 6x8wl'!�=4 st; xjJFza'mxM%l݌{ E`@WT @@Gb`:c;.,זmR8lCE x}϶ ,荐lT!� W| A3Dg'sI8CHWm>?6%$>t�Č3I1Egzts`urہbEqɼ=VqT< va3f89^)BcT $, zA8ea%Rp5oY97T_^o_OKnHtx#]P]cFFm 0)28ULcsloצiO ol؜ҘOvK#9-X_ɨϑįG٠iո,]P̳*:طSn}} -J58>3O0l–.w<],qC"u% AE0Ajr{`!k1ʽָ8�õP{UuƽDZ;.F5\:?w6֤K̈́#?0i^9XZ:AvN%.+B4.u:͖H;mΥ-ҫJ!˖.+GF)?)6dk@n�w/,aט7 *P!kR?/<S0%6� <𲈺&`+&pe�%,.|W4[`\NTrp~P@X& i6Q FZP 43JЄ](K _Ԛ\U; 3L 2B zUcH, n{ D"ՉpW';e'̎_4X,OSDhT&WAVۃxl<`\=8W+r~]_앤YDFU~/yRq>>:<֪uvTߣL.3ű14҂{Jo^?w>qaua0f:rZKR}-Ef9mG~2dz|rscTJ+J /�,?com?8d"j S"idގV#mFEŰ7wap:6�v[:{pL1CA�E3y3:DY� Ҽ9 u?+]5Y7X΢S"at6w7\ݲnyOC($ &w l9*wwaJ{?+5M'.=35c@eyٙ7˸7yPP𒙀y۞U.!tΨJZ6!sJfA MpԖN mo`mz<h@:Zwy]3E m)Fpv7)w\nq)4@i T,ze(>tD^a$hd@$sp9DaK.FLO� څƎ>�*\.= rM>Ux,W K47RLEZ<;9V@-2?f%E<ri(Զ~8>y6O9' LW xU#Ɩ0爭хF.{BS ~IVF_9#eS_`:r4W4܃6ZM\U|Ud;gAe3O֌#_g2Y c]./rpyLa4޼j0DB*;'7̠|<Xt޻o&oLcz,nMH$xoau6VBK;ɧ( Dkh١(ш(Cm?RAvR6j9>66-t4*]&2ID47,TEPz-sՙw rɲuYٝۻ*G"}+�O\ܻo#0wlQm;v)u5\ۼ_y f|% )XCXҟ/ɒdfp.K6\{. Z`@�. "I!V ͥM6U@ x3年|?Li]�T<6S`�;�-0MWP  =e7rTF3M`4,dzo Tlw0r.�|F9�+/f[4)p:mnm/I/ F CMɆ� \^0u>!\o`.N4 yD\Q0FDMJhl O%VXaLl7*�ʀ^e2pkd=\KhfXł\2h)ؽ\J2$O dE*O &k0KQkb21syn裲Tȕz嚑/4]*dul JFp<dFy~O{!6 jI 'r(t'$uͪq"+E'_3a/M`xh^MWU+% ct /yP.7%Y/B%/Xl竛r (;GqOC8(H VX'ټ7 ];j <bԌJ(( S݀9@^\$Q͝YWiV${GrCC(0slQ\_4+ ",p ,17ہO”_TdzfMVs-VsZ{i-1&4 k!Qۙc5~njě@y~^smVg^m8\�.| J뻂n4G؃__PδHR #)#@yZd,@ ;^8s9]iJ }}{@B6s xQCH]0$3H4C^t{<0} C{`dG0@�G Ub?א57UVGRA ) �m!>5g$jӳdbDKKjR?>SwLϭW8ȏX?LXa.NjҨPd$LD k".!Qe5Ga(@a`u\J)BOJlE _w<{g=TpޙuxBZLx(+# /d2FrtBt&˹.W׍oxV5MySSiE> d,M@7zP",e<8TC|d�EOyo_+筇RiIqdt)z˿t ?FZP6iM ]4e+a§JOI@HOfr2Y,Rί167GUpKU3qwD2'DTwTGkcW�v~^!xGevhO:!bwtsMV"UytX璆~Q"ϷMϾS@}o �\F7f&\|!�6›7s=.X#QN;c-I!%Jh @[N+lzQ(]ӗ!heE <%MH4# vӅ.z@sW8�sn'wҗTsڪ-ІE[yִk.tNhz"3 P2 Q\)M 4%)gNLvBhK�&{KoXs\Y^$sJ%๾=L{ƒ~jAeg{V+o=ʗ>ѓ/Y4xӕ>ʋRQיD%LeTx`PG :Y!G|*m g4.ecjLU5;35}]1U/],}yqf?M^ҸKzQqp9}J&?_ꏺ)bm\;9/1^֋WsLǯ(Q |S,ވ5^ԌɷZ<l@2KQ^LWm52մ3Z0?쵄q'c6\f^~aEe BS.:)7~ciP 析J%|O=>M P"/P} גAܔ-wU՟_uWX]ŵO%ѻ]ZRᾏz4 ,c82iwTW8!8wك\_~啱wR8l*d4S !SB@M�:,lzDtnߞғh8,h) =dG&xi{<h }e5^p"pl&Ì$ 'pg-RO'icG�0؅J7'%$9@o›{H 7+D�`Ph 4 S�GJr(T0CzR ]z|0]:/XBcldE19ttP,35Z&zB" ߱R'dGRski (ű*K3Ac/ jֽj20|\C>ZVja6NjrN.YU�g Ii<}�)L5ѩR_nk"b4wrTVNu1v8/IiNn]@YOo`BI EdOsUBD/7tl!k?Щ"3igKwR$AҀQ8jjfa�9 oh<A*.E^݄` `p5]488pҢ.jb%]9F\q]k:yk˼j^Oм܂|Sq=aaDUWYw \x8 WE}ӝ~GNWҵ/r/W~;!LX=4l(즗/o`5ӁO@:l�@f B42hΘv�?�Ђ};>*ۡ x!sWiZ~KKYK4= HAn`G߁H -d lcO .Bx~[D`m$.PH+Uz�س?9jN pDZ/ۢbeL#G(?`8Qx wvD,!' е5h%a ? L jz=JUx*cP8ŏGDHrVyH5DZ]8;X_|$#%&cP(7EyRM�a: $ WѦYV<iqJTwr~Zbϰ~2.P#.L- 1{niȭ_mR|E 1FqX}jO3&DWIl=|SEW5T(|Q&p_׌0:sb"VzRo~@b2+ dE3n>~/Dǎ7M7P@A#I<�4$Xl@s> M5y;HNno=w/ }Σ8>Wݛo*#v޵z0zɔ;DX4W kyb#`st$vv4V]NpZ:iPo4EN4!)(MUkfȜ pQ.t;y k�*CN/9e.fG-@ }-,5m mRJDI �1жءxs/#trb�\4[¡"`�k ֶN _&~}-^%}:4EpYV"9Fh 0oqɶyN<|lou4#{ك,TR@IIW$>J c6Txyt({_ ҟn.O_�Ǖ2-V^Ea\JhlM_l sR{VI~45?]Z�f5cttd :>};>V%9x2s/I$)JɰP++XgYqrX>Wi\JNB�� �IDAT1"cks!ǫX'f#4/PE溹|r(MI/^:DRd 5J,(XaElr9t%H?be@3JSr>`U�x2舸i`6> 7%:xgo#hsˆp@Ξ} .;٦ai^霙]S>gKӝݴw܎ʶF5(zK,ٳwH7nG:?|0x7ĠAC¿nY[B˫cN>`y\@+DEs f&}p< Xr;ףW\rR|9| MJ:@e'A ;bRp\=k' $Mx$k!(eoL'OmZc&;u]LMpvh5I7 -, ;3 چ{pH%8iaG-7k߳(�b~ ~hHօjce2\2JϢ!QTXV=xiZo2<�.6鋋tf0q2=,~T=<+|Zn'ˆg׈FO9ß̳I4~O0ty|^{k.>I%f~VibF  d VӚ"oWFǣ~:g-I$7qB┌Lq?_7T%үW(N!Nڹ2}պ%2*>.@LciBu(5"j $uB)P�a4\Ι+C#.<JU?B 합z[CjC1%]m P�"i94sU@OL9C-!p4G}{1Nq߿uI7Zpzk]qKndJE ]$72|krh]#MkR?Q$;0):?=ޙ_橶}`gv;܅j@w 4Z҇fAKu Zky6bQ0�m6ڀz*hK e42v*pwpi6T:mē  tLNmdD@9=bkz+D%R;_R\asWc+06*K'X,dGl<&!kzX(褄=+P}~ЌqړӪX:hƋcƱMqO ( +{~t �ĚKӑ/%muE* ynwq;V(!*ŋrLsmN^EQ87? "؟`8F(5*(;|hCc#~Ht$3TrDIbҩ6;[{0t@m7[]H`nfQ0ט㞁j.IVɔTdI&)A}WW@2I7}0 >91IZS;}2IG taDw_FB)�$Ɔ#VkI,t搏 <HZQQRE}c x,%85 }}2Wm#nȤHBCyz:_XJLC{FN- p]Bm4r+"*,suk nhA7<C;h!]u1Qw{WK{Dz\x <y љJ7=^v/r7z]e+t~xuTb^ Z*)U7G P/4JyA~qCB6Tχo\UTQmBfW>Kgk2;xAjA4줹-*аJԅK⟟ujk�5a^M/g ֞U͌f%_�k^ H5`R-,hcW62t 止$߈* X$aJ�EE Yk�[fA y[m�T 7^^`(kl3BdLU0.`̞g0TQ(x(@+~x"㑂B 3$^d#&˙N)@r ^L=mF>Kad.T2- 5 å)!zQQOn&6> VƉaH<FK8HOУv!H-^QX*1taG%[F@Q8 T.f݁Ȧ$FFq< t;(<q4C)LC-o;Lo6!ď,6ӂ4I+}d֟YĈꆱXj.8i)3OJ×?@ia O9>Pm0B?+fYų]vEapNvVTѼYu�w*3Y#�W=18nm>s~+׺;7-gV=W ÙqK]\Zw K\7c_ yYosεj󇮄*7?rohiޜ62g|{Jӻ`.:ƹܭ~[9״U.e5EUq4<8vprKܫ^=noa3>6S:تc0[rfVhm@mp 5@*<<I PQµ6*Ziq/P{ˏWF1]2 }AilþlJu�i r 9d7gY# - T [T0F4K"Χ$ٟKj A䠳t3Q10U&GʔF*h%jzrxNRDHkN$*G zO#ː}Fv~en䔰!Rzݝq465E<I|^(x%y4> t ]1#B7 ݥ�CG#~w10ta f{WN7F$h| SGÜ6[0q^ނ$%IPccO,:Q~e+lkaT6Mi>!ɢe:4v2~f7O~/c$[7f {Wi6鏿{8EH"9裢 2cfAOGC.3Ɇ$7"DeCK hU*1C!m `6A4ۂ+Yֶx@P$":oZʀUn:rN9Lp=X\R"NF nϗڥA֮[+]6<R#a^K#-,~x78x 8o]A^<`^]"�gg fcF� Vތ9Ejy E h фmfUUmm^Q@&[WsUL)\pgT�5>KC@qh8S ]UYb4;%U}z L2GZslB|єhK- ʺxBf,7bP~ ªqPl[DrrOqBG!ȯr :9ܸg<N>JO7Kf<VH[;<�>yEy~Ԗ_O"&V@%ݐaITa$*cIU_OGQTb9F4IOH>kLT")ϲdsl8NwڊGI!_ BYc;9f%BRSlb{C'yRŷ;,Y$,OWX;4$9jd6FLdL.=�i0*o8*98zNFW tɪǝ:x1#n0('1NX.1 iߌzB9t@?K=1=>HdwǙXO:3$ 1?Ip6IX>}i)_*y6}GR}nS\6`ˠb>5>#RPl3@s0DZǜȵ~o|5q9q8ak}ڍjqm{=C~,in߻w[5YC<fvE}qƻ6Ɯ^wkfzQj97\aswUvnhQ 8;HЬF 6PS-6prS(sco %xD6:KC9RbnS@ NȞe/G $ӯQJՇ!,8B&=߹=3%&CNp^T�)gM%l|^1W aˣu<ZwȜ$:9>3T'4JWke3tJ 94<O,53Y Up<>biنUG&1#m=Ƒ\hԲ N*Sd&D�80G0@;qJeH8KK{4yd;Ūʷ;Q;9 :JdЋd\-YGt-$**~A-CgQJ|RNd{8SS; eC૖ai_86{&3QElOWv! E1xndX޲^*b" AJeT#|x1 M&7 ѷ:9&i;P„#Wԧ;ks52HP-:x&u U6^¥PV n Ca4 leoX�RQ4VuQNP V8×A= ]+s`H#EReŭdMڏ1ޞO0[{;:PqsRnٸR!.15T߽~%T΃,qkYpkp.7)OqHgN7f I &k�w5w@Qg(YjCn%ǝ_מ�W|K}QRΡPѤ{ k` ,oPXuJo3X;5\!;9M5[MPQBDEW>~$3IkYF5tQMAi04}1J�&>kRZ-~F!Mrtn4 ,,05np?% |wZѡD4\wh16X45|[amZ੯/lXƽITw0ڿgH$[`V$$co'!'N gt\ODkK=~@5M`gF[`Xs$�-y�`E3 ,Dcdb*Ro &'$ؿV)9EpēwI'L1s]@o鐎cj o805>!#\̰D9?>0DUU###dzpciJNUbf*?#^^x9iÌ-2kTl/ڀ_}(O9 M4I)XLEG�E~,�* (ns]E9Z|3pIP3Aj רAU|+1Ph^ŵfɥ.RGT*G+sG1/3ίuEO׭}h{]̪Wj{SG<'/:<=Õ9;RujHu~_xʽ9 9el߄pKНx8pPv| PI)Ps<Ex3v*MT txH�, Dp% }| P4<e? 8 K㔇1PY_xSA,IS<̖&ʳ *>Ge^GX[/F˛G[Y{Ê2F<NW*]Hld\ήB=-hg dWYN2crH( O9bge@T2lZ+_o!qB| #6�8~Jd h).$8}zrǃ' oT[#4!1Be ,L!&9>\5Ȏ$ yu7&9iYx@Fz 5]" m>;ݩ#bCO^NS,@V@AQwmX<nbS/K4oAu<Ή_,JK$!kB2hL:J9M(+} eV24Jw2kw`3C_g&t5raݖ^3DH'@jB}m%"{ vJZP)yT31br,ѽQ7 !hYAE.P) LiQL͸ܗmKr|s9yQ~ ~頺p51V`.an{aj}a+r?b\xg 4M<_5h˺r Uڕ8FHW 笆W/Ԝ5&fym2eɫ3@3(܅b9gID3vEE+ @g50˽(�Hulo֤l˪`\n[<[@a5u #mR{A__I1i/q'Gv$Rza(9dp,x3L-90quiFDXN.;*\ $24"wēQփL*mӓԻ03 l!胁bdVC7Sѩ=,'%"4"s _Q^:(!Aa(meh| O_QZ3PYe8˜>5?=m; ?X)q8>94:8!@$7v'c|bGHrlX9f2oIkZ/_hTJӘ `n1{ z!MacE D{YA㓻?vvo r\,$3ᑉ Yh\ma`C3D~dVO_TR^Ǫ;jh*Oc2.G.mNb\HwcsbpܙhLo9 ˠ<ihMIq/s �$5 TlîaOh1LhC>SWҝM&r8[v䪷F\ݟjl+_Gfc'&_j?MT`tS"v#:] {Uج)aΟo]H9Χ}:??gJ8<wk-qPrVK{ xUޤ`پo{JB�ձ%B �%XhõEvaC/ "+y2MЧl/jɰX^J#Cct2l`ӄL|Bڇ<RsCvgšv-#d+&RL:c-w-IjYކdHa `eQuk.dҺ0aZJyup&iGl%w-/3B m~ $- +'2EF8s�n^q0*&8� f F~qxBF}(Iz~˪IY�o`I`PB~H[?|9N?RӰ0ʥitA0`EK�UG C3e54'ҤԉUL&bW.b8]A a@;qt߆Z+{` 9>eH3%'2!7?%J鮅iRL9�� �IDATi`lR]29Noz)5;٤zO|ٴ:;@> t POA}4Z< um.z* ,SQY6[u4yh0Tѳ� s^](qԅ[۸Z,Aw~ Qn#hսQǠͯlH3.`o>n�WT_o\0q!{Jc5Uڕݭnr;wyBdՒLt10wҼם&@ hBTb @{m0Vjlssf f. �T03p ty(A�O 6ФysRn gF쨀W7+~k[fQwT(p݃6|D`2IZǠؾ8vrkBq8/{X;IY7F44̕ Pj$^~GBx:oik8Bwc?6'Kqư0i8$̼.[HC׬Gٛt(8|KwNG $ "DQcsu2o,v3pbnD'ᇽVwrkO ;s4 9%Q?Ёց@*I=8&t)4 4#m-!uい-Xrvah ֜3EvD*YLy #4|bd܏5H &2uR|R>AO#$ymG3 eNj>܅=XqZө?̘AGd dYrѴTvJORX~9L}hu8|Ā<t0 'd2; y_ˠr_ .+DDcF6A .&&Z,6RA7gux^ p!H]zafU|ԋPSt&3�.`ekj"1߸)u'8֮*9oܛ9{kj~zu|^s>..aܿņwۏB=̄5~u-,֣YvNԙɫŎgȹ;gIP{ܚ!4ɽ@0{V/Lp3C FD`?<O=OjbA,h I#NFLrc)8$PT196UtN[򘱘O0ůTؙLqJs\!,2yK5)ҧHH:-`D&y($q01i*4O#nۮ:z$d2ֻH%iLm;#^x;9/d;H7źv B z 6kfr2^GЋ04O[!#c,=3`b:C7�%F$9` JRVsݽWJߏ/g8>(ԐeI/ 0{/Zf[Nޛ{ӨwTFoTT3p;F\Na=)zr#㗊HeIWYRX'f<~ϵ66s1x4- ~md}BZxk4;PQBNDǣh |mID1,Px�'*zeS-_`CsjKcg3._! `& AE` mfBn?b!U.`@ ݆CKleor G~e. ^cnm/cMjL[*?~x3td_εki`:3zYW{Dܭ:?~m~quޔQկԚWŵnơlIܚ�]I@pf?<yWwتc�ul\C*Pxu^`=pWj`ۼ 4,sq:@ 6y �6@c\z\J>�eO m;MhçHB,@wAn(Da?8os:k 06Х z%f #)_No&Vfy:50Npr&{G'`cy< >Jb0pF h_+,ߋ<N;gNwʅϊ9 fx2U`9?Yy ?ؠRL=2($ggǟ޵4 @u{GdwW5% S3X;!B%LӍ37W8O|&8ƹ;aԃQZNG0um tr=9�/toғpTFW�T8E;J#w;ADRhX \G;+S --eh=Wȭℯ|�(|g¾IB?&X^zIBuCYD߫`Y^L6IK=ٴ(r)35aaQJTCj`Up)d AC9؃W=tP?CVTf*�,wU+ ˘[%\YFgmUy$ΗrMf+ Vxn٬Kĕ$5/.WoW/e.׌*n|ޢ BDŔQq[{ɽ6]]:n2+j7u~p`}<*$Y4Φ 0Y*'�V׸@nh4@!$lЍggAH=z~QpkܭY?"�`5QSjh3ԗ@ՄWh �G]<@}IyԷ;$66MG*P8r�9$bNıDZF}aY[( P FyG#fX5ewX^,Hfk Q|Fpq01e6|o;?taGRމpi@5N~o,<0=$?B2qb'en~7ߏv$ Z< 6wʃV*ˎA:_hy,ǝ/{=P!5D ڠ} W|rU$/EqA|c@wKb)v(Ξyov hze [?]%`u'\^ s'ы;ڝqz_+jc`9E mi0'r?bz(;g?ƯQdlNq *QmFCJÁ_!r(/m4P<| ٫E큶l,S&CmSIʎC]A6,u*AzUt*0�p)G -~?F<m &j¥8@kp4fvg.q4ǥj0'f\l=f xr}iMD3eeynaf`֓׻ﱳ_ە'ѧ)n+G힑kv͋IJ 9 VEkй x DV8ٍXMj"6L= l6�<e˷Y`px)!ۀq=n h~堊6�A*5xYձ![(m2l֭N(laSpkl ~Bz&{n) &Hefƚ'y1J&Gp oG<J$FdMuox $%L4=;X�'?+vo0z\ؙ+o;@:|e :1îy=*DL?P>`tbLgK}H(:~ ǝIDF/7Ȣ'�PT@phPKD1N(&Tf(=,rgN`�EjBdtSIZHZ"]qw't9*"Yާc2ɵԷ:ɍb0eēHbM=1` 'YjgvL"rT#hc2-iy|Z -?Yl)* (B a[X[;T%o.T~WK`%[ D+(Y]5J?Gr(f>= ?krł@x (T465ܯ5vIv k7Mp(|HlOٮU1I`Bg�0˃~qyyp3G/x܆_z޼>9< {lY\5L\efYmn)8«1»կW Eywki$>Gþr2G PxK_eY=Sy0u{(Aw4dU/%$n�=UBk6P}!)Xh X9T m| { ('[Ŵ* D1W`;jI(х(փ8`6= FM BbS>Y˓WS2I°[Hq?8S{TIud.u{H'S7a'Vps+ޱN?"bɕ2 l@[l88,ԷFĎE6!A4:tb{ෑUhĢ|OMg F+"b*z#(‚9?2rLLKf'69dbDH錑L ( i2huC^,qاHeh+ExȒd-P d%Mhr*跢Uz70\OQ@5He1`HK[:V8 _׈l_R6Lhc\< Sxo2̷f7TՂst9P,|?%8J@lH @`sdu[* \Yb<`&ճ=S: /P$jyvkk5+_jsƚv > rn{7?@ۻb8<?71C\_n׮9/ֆWm}˘+O9ۺl e_w{׆=g>nM}͹s;; X}9-?<y�[@\ʛ xn [uބ x  hhxuќ}TWcrv\/Ը 4*$sVvj"lQ. s<g#+Hڠ&ޗg6&F@B_HaOJzA"r O!%ޛֻAa~t܇e'@`з;cv;~m_މ oDv`DBK  N/Q�h|6j ~ SAwJoOJ'=HL13Q dxڊ?`cL+VqҲTJҔ}^`�g;%`Z"S*#~^ao7}w8ޘ0A+&e+G%J&ꥻ?ǻpldGduJ !q:.溝"R>lq^\3:f I?7"0e5mg֟,"Ѳ~:%1 HnD) 55;$B/˽_}>QgE`lJSOhfqm݂Vk{|BvP>#КY B }çP�xSY7�^M4g�rkp*t#8!TgҘ7`WL˵sU{^5W{+ ޼1`>߼-ލe[閮;PqQy/3>_oּZ^ !3pB�6K@q½3QpO VUrY[8­^ʇ*T U9k�D u\*ܝy9LVqK wݺ3ۉ:Է�@R M ®bk @uY)$a|}(ɊYXf9|5 b3aַ$zr>-RG;j5`fsаHh>"bS UyK/|$G;E}ԕtedpjQ^W.ߎ%t(qv[U4&W% ׶ S% )> GO Z I@#`+:ÞӪBqE7\a@;9PuHZXI,Q6{|-?SqP k2VvNPG$h5pe ~(>[^."4;Gˋ$ۨL~,SpJSǭ7 %OƸL'7؇Rdjс"7֧(I:T =XF}j-<lR){b2.b*'N?v1VyKI e|pR̙dž  � ܦ)?R? ̦{<XTrnYI- <A^Sf >ڬ=ś67qo(YDSDGg视Aޛiq}۝$.Jw=UbTz V]?? ofsgqOmx% 6o[GhV9>+u4/"Gp).�ű}# 4q SܭCORߍ`t|p:G+Ml!(yJEpgl8D�U$ǽxV=d�X "gO t7Un GߡnM|AL9}n N,<NKk ? Vj,?c`3rJS}TO:9 "Vhפ?'l"e$q4d\n) #,RD0#NЧfy!&{Z֡@kp8`BR@ h;_m([b1njc?}QHgvNX gxzvs<%ΙIjK(Xໄ D@ mʿ/׈J|r\^?yo﻽8)$5ս)k#btD&2u{R /!RR[!'?!uNhbZ 6W.ClIN25̕0>mG{ C+DIǯLsd((bwoZ:(w(En o1)`jQf9䇢:zDW Fd K#Gv Yj�-`? b2EHǥ풳1T8j6p^|&I:-s@]xUuj kr΂$x|T^rQ M0W:+η{߃#% ?^XэXSExJWDyLefJ_="y%%A_f+Ejԙ;a^Uoٙ%R%sNlamwgěY www6E4P�_o 7q%, 4k̵<ɒvn1ViIT")Ͼ$KܝRH>y YQ]jVy%S`1I -C=BR! 42jPI D$~Jm@v$2ˠ#'׈V&STT TրqM֙*:2H3ZtM2Gmq,ݨЙaPLk)Rׅ)Qح Ȼu1Z:5M{1aq6ѼX,.cw:{phP a {*«[wԷGO\S3<(Lm\ sD�F 3AS=ʗ> EEPFH|ø p[Gh_Y[D9&`ynx*`фx.&"8_]R3O{Tғu+�� �IDATҥ!Ş=:3zzZMw* Yl?)X*~=|qovU'ֱa}lFbnKEn| @߳](�`Jh> \>A\?;[.SkY4:8xϺwoAymnUfB 8>zrIXzvK}ɴ\qr@ѳ bI+Ӗ"q.<`&;ϛFaʙϝD5ѱblch(Vq :;3F)7//f-$\E7\-VhiOs<'iN.e~c 7߇s%}2 |G.wY\8]1`m_xUK/b ϥE4M3! In▉'I ,BddU^B[ǮuCHQU'U&3(an|#6&i*� u\pel~~T!m`& xoK/ϗ!|8gO~yr OlpU'|{ݍg);fg6)::#P!%.8g2܋vѝĮc%5`;;feIgDCwI$qۈ5-* 2]<uO"ȲF(ҝFTHQ}X `ieEkQeF|$A�*αR^R5RwZC Ҭ<QV5+ƭs7ԠsR7\N==<?0ʍs~oȶx_<ѽ>|0ݠաCM߶bFsd<.%Q .GI)#yLlۻ!fW LiݜT@^! Kx]H+ 7 Tvm>۲8p0f~b:.usj\> 0̕eeXG6= M8޶6u\'i8iX;r77H$:!JOCx[ܚ@ZLmm7 waETr[f EȮq{_H\~'ܗ8cIk^sX/.+rCR 7WgWkat4 tDIp<c[I&D<aNHS >h;ڕ4̉נG2 i[iF�JտzZթ TÖm ajK"Г4iUvӴ:vxbL\NIS'MRkg30hPOCmZ=+iv\|ݾYY^ca^VVK_WnOC<#{2gK>r Ńhllq/#`17U"P� 7Ci^xCEXGb5XհjzgYgO*vCkc3@xRΙ[3js楰vM]Q24G+-[C)8\A,MJ$#'ݓ3�l/rX+3r,£;,]o83ՙݒ\e#gK}|;3, 󥏖GaO4D@Hvme:x E}7_z\umv,eʏ"Wr燌oN5'׫3 9bycwog;r dpgg9 7pt _oLI8\8,s?  5Xu }kmUW>UqOդ $iiis7 mI'-V&}C4IPcZNf[kj}ek\4Vj^_I0p_eԾ 5)z~yitxk|{ݣȿV"IWi?"y`8"uq OͯoC%9+=ԍ%44uIzT:1;-dCxmUl=J*$[5Litڭe< cƢ&N["2uԶai' kKvF9&DAzn)Z @@؟-lī~zV<*E73,Lsk:,܂!h[7O3uq횚E͑z8uF.Z+|TbPeQҢ^Qv1@ Wf<g,$-5ˀ⯢Re-J,J+LLI?}׎FlW1SR"B`ibu+%U)i 45 @ >MYPTZI#ScQwEhdp5p�b? $x3gʒ˓ WsMn_1s:|cECMwC"F9RKh@-g|縍l.+ Òf03*3v#_g~ڗKs7/l8',(˜v4⷇GrxQξ|Gǯ9ɹ@(x[esTR0+Ul#8ZF&-iwӬEB'#ALza&T~ $ؤeZ$̜uBZ{ t֓s|\h'ѿ 3þӼ&Eڻ]|}.{0VA/O$I lgָZݵ/RgѼJwq,/<qiȈ/JoG܃vOJ@fKړE�34#z%64'+QVAnXc}bw2 O_NV4YXo@kR0HԚt !}46L,M+ ֝I4$nJ6kƶY%5(g>^P;Zu?-GGZ~r3Hwfg,MX##2y52g~+8ۗf}a2b:FUeKB0 u+WaE 8TY?0zI qS Uy_zvgy3C0. C 4.*x$ bg�|8MEY+JGڦ\Z~eҖ@RO"Jy]v ˹$?ۯ#q^n@Д,o+=>=qx{7Wx'E$(P {jA /W(]5hsA Johk8ܭE<߱KIe ߺѿy"O\ 7GCf,A9;uMbC e?5;u5{oǥ9k1˯Q͋g&MNwXAфK,3,Fʥ5:u ڠA-7̩Jĉ2aDj&cA\kN֓mڹlqVvҫNo{睋ⷬoآrZ#{\ts߹8?fwE%5_bwR]au ۩iK X (G-WH;^8jAxKp&kFIjDBniSQ$'Y4䰪4mkUh&TQ7vMUCSS;079eiΟ%SJU(fBT*c`׈:;di Lף<7Ӓq1dJ:ޚ?_H|f(vveo# 9Z+{9N?ui-hoш\^>Ez:8uKFn`6$/|{ (,$8$S1k+Q9ԜY�qҔ* <o0ב,ΐk{v&yv`K%9Pd?2 Jx*ezkrIre:8^͇{מ )ct5bXbߧLڗf^Wigh@8XBUso׿0=rf�hW'o0 eŠΩEb5׻deC_l);K;{7pzIwR ~:sICi6+u{7_ ?GyaqRe'gn9Jg?`U;jʫo*`+^d=$gC .+>\T]Tu5~2"[BkxFm?M[MՋQǭsӝFA\ĤAi7zD梅ͷ�d_Y 52IK‘3o׽΅;#vN6tnQ+궴TU: V35gp-HVuLv FNK5TORU3,vmH-mF5t2j(!G`lK=jMm%qӬa |*M$ɯb1f"W=Ix5rD^̒Ql}ZE8]5 vӊƿեe'dcKtN=!{,D]1<J S#AJ"URȑv> 觽ha1䎰n {ߕaDU#$$WtR괭y8-*aUTHmNC~}O VQř^mi5⛚R5VR& 9G7/, ?R}~VQ5t&"n;f7깨)~add<7=ʒRe(DaACKuRF%~8WN<xzzK|>%gSuX4!&ocQI#Ȑ1Kr k<i8TKKΏ", Sun,?;(MT>n2EYNU(CL_S~^OϤ ;4*1dprg%'EzV3w%j)L؜P? GmB6u</C[G29L#gษchV14nAO}^pk-l A-қ Sd3j^oR)o$ x~Ӌt7w㿀;xQ1H-nZWf$o`Vk3k o*64s Jd,xS$+jD+~科A5P2BBW[)gi{u>=@ '`u]յ!k³0nb?z*o˔VjQ iZ6\;u|B.+q~<j; ]]n]<:7ӟ/sḺUHSM?΢_I(PlOQ9>4cO> $Yo6䊗fL} 72.8OIEA4!`p:y婮?EhzH>{tIV*FL:QxiDW"i tzQ3`u9̣, ?T=mU RWӁb$7z#{4RO ZVE҃0eNg-Bi]#G*\՛M]=ͽ< T9 GC[QHW؁KK08H˃eƛ33a;YwK>QHJ2DnTudU%m?fܔUQfeZYdBA`{kE~8*G#޴?vӹ/f?.Ĵtns>2 |PW`<gzaj=a4{7O zq3dhLM b 񕴆>?k[$n8&$l6O6i@׈2zA|yg ˊڙ{%Ui9ۦﱟPWқW:n^m}޼8=|+la9 NϳV\I]+*:9&(pdmmFtzWg ujnb1 mOkĞvJOu\j-1+uԚ:Y4E\ʒZI H08hW 'o6GR܍f1OZnh C4%1y[ta>Vsܿ%[ Ì= p:bFT@6̭uG<a*mo/?S}]LآTgTRޒp/Jރ~ԚWt4/FGpQwÕTy.(-sN }br3Y tO|F,Ҿ*a0Tb\z}؈ ŨSM9v[lYʠ,7^@]}U<rnK{CY39k<.Ł{EŴ.!*j^H?*a?cUuw;f3S_+|{p\>[Xmyff_׺2ܘݞ6Χz/#JLߎkGpp8bzg ^**V3mp E]bbt[-^^v13;7_B0iԚXU o lŻ!4-ߛfa?%$[ۻBwBjgdry`iMQXO׉LOR'`'ChLbjPz%HLt78ms4{ԮA˨;OtZ:1w8lj=#i|9Ŷf&A{pdB%-j-^Aڍ9TR+ ZTX %,`uhoW7u0 ?E4Ҿۘyfa0^츒Zȅq+sD+}*Hm}RPy0obFbN: 3 xhզe=h\!_~ ]U DS3KDwҏ7Dy.zC-<+쬈4i>$HG:_ޝ*a>y!9LjY}O;ѫZxL9mRߣZ.#1s bR`鋈E;M58oG;%v-΃; ޜznOW U!|([7I.*LOaw3Or$QB =bҨLaTjUA#wڻ]7G6&_ӿ=5x3?n1-қ|y8p|<;Cq|xr8;-`fgzW σW}J+LFMʺ#nvzII*Ċ6f=P&؆^洿n ) cpҶJTjm\VF:ސn;WP}+n8Z9 ޾usw _g&T0%ytko5t4lddRPBSF5S+4-ƙίΣ6z(c]DjZQAFx5'ӱ4J6 5R=,=#eŎNX jfW25gNORD}#xҬSžUXwYZaߊޱN)w@0Đ :o8 ;w6 ~鼻Ittqt\nU  -QWB;iz-6D8F~w#+GXe:a}9Reӯr'>O3%,>*Ul͡4Y#J`]@ �/fO{GҺ_lQMa5�kz=Tݬqb.a2FCgX~.yFsZL u6w RHv 92b}rO% 즥}pzg9}LZ,٥SKf̃,p?"GaW,ȹ?) ܃E[]S|˗5c+�� �IDAT?S~ʒ:4][(,C[-!7Fb.w 0/M3^+\/˛iBoUu(>Փ\0^ߞ;v'S_ ~7~e+U{)W48mנg|5R6b+*:nh;k 2Fuit}i!na+L4ļk+WgZUo]UVüm={kw*\13(\ø(v{~.fY+~}C. h30I'Hc]4 ԵFJg0DԵ:V04=B )~Gd1 2ڦ-QSkD~ySmbYlr3Rzc͏V33:mhƢ :뚆j_XVv>rj]Sk8(sZ-?t64 Ue>H0君c`)O-?8g;/|~ͷ'cF[zwp;7~epDE^jMfDMs1b0N=$p*5mU"u톎[3Xg61V rMkZ 4i]W v7 o{$W.O^z>== Ar^B1q^ DGmԜ _?wPgg&  nYnl(�Dð؄Xwlz.sؽуl1y'2꓿K?rgSuNXGܰ:/d<u?xNGy1^?syGNwvo, 1k3ቷG0#|p0SwT=7p`c37=<TT)[/ӑ (=Ɗa"C4˨ J3 Y_Mi>93 > Q,O!D$n21NАBDE_NE÷ 2}}a..'.=?o.ȶ.V;D}3;w!HwZ7I[H8o@+ PtN., ܧAܺޤ}:{#44yQ­7a]T_vӕnT톹7+u `bbTHi*U8пh0ɢ42@744Y<dL/Úܤv$Z#IMM F cKkCD~-52-Kl ՌS][6ॕ҆nͨ'e1C>q\4í!i " uu=G0;tL5~JSσ^Uh SZy2BBAۥJZb$JAURz^$;U}I M %s<{ӒoWU'C=2PmG Bՙ=lC0hȣanJԭJgE*_1fU,Ύ…lqCJ2zՁÝ�jpCsgd C)vZP-P݋F=;ٳ~NvOvw|&( G aexܵ㾚'9{;aot@0~L;.n>t!ޙhь=?SǃUm,ݸA+9mfWCMȉlI(H7`MVTdyz0Ly޴$#q i$iFЧgIy*:bza=AO@bsv^gSFSS_QOy;<b_eVm}Ņv|+o7k.}ZKz\@i1ysܸ჋Y#9gLѓi JՁE"՜{iBtF@Z lI \vO+f߰e&tHcԎ Y#^MY 4i ;}N5Q cĹNGʥe,u Ro~EޠuHb:j-˿ȧ|$LueP<0^Ӈc_ 0ˎ4--{z |O*e\WG?80{]nIRzFA {K-eG#:zY5Y%fT# Wt'.Ԋ=Te| 7(U.T?5(}Ag=l_#MMn:=qc sJJ"R;&*,^f{%^ON`TuGP7cqTEEa~:Շ:<+kBgj,z{eCAtnMgIS+R[nܜ?C;qc>s{a_ <8v[`.r^2~^\Adg-Xfk}<^h3'l"Pz <?&*|E!y,dMm1bPym5g,vئϷY<[&NVxZRҘj̙A]vDz ~E5b7sͷvFۤNJ>!m ȅ&\5d}Z}lBS|dkҞoܙ{s#^\~MvFT҃I=QR u=[g5wzV%M&F'u81hNbىr[8NҐR4+A1- za)YrF(7/#{c`xr!J(0RG2@pQ.Pzj 蕀m|^F!1=LΡDy` 3[7YTm dVrzh</ΠeJR:4ZˬJ3aAaİ$èkFkEJd<YWX[B48tnD)ђ}ف=@Sѵ,,|P-g#pI3XnSۏ5?(V;d0T!#\|UFSAnsV,ѱZ2ʟ* _'6y #5_ї[fÎ>+i?g:#XaE-]?\x!x\<;d/?9*9חE9)sr;UvQgß}C\.~c*v!C!?.8rH3taG.+wnwE[U&[Ա+LlW"R]BZ]קbnRd5W&ndnҖ\SOôB\J()NyK;g)ᝅx`1[ti:W^<V 2>wDZ業�(LڝȾvG8jzWn'cy+Un`Cd0IF2#74lLr I$EcY H�q{)}DiiN9b"<2'UnbӸI۠hhQ{Q2:qS+cuC`Y7/oPB0juJ&<Z[KP"ZT,ڨ`SFTX.\WEGNʅp>`8 a~=ǦYw n3"p,:+l! f7L9+y"Ug�37˦C1 ؖYwm&Uj 3yل")M]E0E%Q_f=px\|%K#@~aC{3x's֍(LjX8yX~VM[1a%)94U+NݥG윔px/ 6˭,>YJj30PUJ2;HYQ1SpɰMco\wsg)~trxf^JNuxJ7Aoy<F}VRGx 7aߤng{O.F_|:ǓAT0"3K3BKčp[%icz&9A=NjfSQ-j &NRCOʅ)p;Otg-|.pklts}'}lNZ$7ͷY]KUn~ k/KBW2.HK7ݛ*;ͳġIfSjryw8ek&i |Me2LQi3];M~GwuFԞ6ťLu$iNu:MvOdĒ]< nfP7ΤnKmIrgӛ0{Tҕ]2~ʭMJBdž9dq`塖wC:|E~tɤJB+{+e}]Aow; =�ݷF_A$XyᴭkTW3Bb]6r8J4yTOmGT5M҄؆8);#UUi^2v`[iơiz=~&^DQ )-v`^5K% 39lAz�-ʩP0vف=9s!J_jojK(Ր~8~EON22S"~?by»'uuT{<25q31":{rfbH_S.|?y] +Koz2PqMYzHHTϱ$&J5mPp 䦀�bgglsI ZL 4v_|U3H6H'­$Ӓ:RY03L}V Iߞ< ]f P6)j)p;<V}#$R|^iF"Zl/c\ߦ 6qmFMϱuܤٟ"7E 8o`\LپOC(n8=,kyFet|7 ~,8f ynO>j NGpo(NoJ{ c|_wBPHG]ˋ�:Rd{#H/ )ztUm7Ͷ`q! Rx/sP,]E1B#K<J,;y,[Zaؤy3p04\Ylj 64 c 8ohVmH@@hжӢxjϯegn59wC@pғ@"p]"I:ޕԒ0wq8+0WZL@ک404*/do݌٦NH-g  Cl-[=|Ob ; w5f>Oشݮ.k=G41\ntʪ:t:X'V7Uf!o@ ]^fnY+vt~z,~<4!928N rw݊T D > twlj?vv洞rWp<k̂)_p?0JEVUN mߛjvser"fh)NV=7dD3m(f}VSWyų)ⱣZЙ8%IfuVR}/#{~ҽcNSW4F,RTtّjx8'WMGKVr[KM߹C!O߃:PqHRC/?=Ц8R>FE͏ ǒO$2cw~ۜ}5y͑5�,0 f-Ќ@e 5RE ZڅZ"T3)!,-r^+GTBm* P8+UdL5Be{ӫ p9]4V*sWO&bv_5)sUkQr㡈>C"~0EqZcmSw}rdF  }M08- Wnt_ڌD58:ֱ5dch_Sr͕`mip\QFuN5)}i)oiOm,4�+X[¼ 7<>jl%s Q*Tm`߯ gN":0}z7,sWRf7&wnB\?T3ml7`cW,  ![W8˝xxzQ tnIJfO7y+:xÂ_Ix.o5ӜKS1ugfK[jBݗܑ)Xs#tiv<vzڅ; T20PlTֻ4h7HTPYg@N㹝JP0}(+ rFѐ$+)B,ܷ7d$H<Na=p~A?e {w!&l>lTv{8 yz}De=XǤfQg~¼R)apz`R'!xq?NzKC EY6 kýJҁBW35Agc3{`JkZ0(%ֺtOiN_�5"@F1>bkCQZ+Y;5(&hscpF^A,Ӗ>teSD9G3kͧ}H-}lE-^XPgu?(-oZ%+9'xI Ufg`#FuԴLXERR(ȋ#5!jXH:aaCдȷ\ڙ.0}QR朦2>P]D>#zMo5Pk}fB*?6f υky_[!uGZkS i懛1 lQ*Հ0;Σ2pb! 8^^u̩nb\\b>y\_> xq˗o%}"D<B1dtBQ6~Nj73z+a<~~o4r * W*w_lR TEN_wտ"FOxX_ G'ym:RP.|ldG9}_I,a#r6%0V|`%&ߧվ#>F*>.Dm㜨~@1T+K=ȏOrzKg%maȢ,jN>~BO N=Swu{n\mԷBncUcL &D%ڑ.S6u3$#҉)ЩpePJY^;, bGFi !3ip>M]gwX:Rҁ$�9tWzfꧪn3zB9eϵof Df$:SFWT.PI_%0D` 5;UFidجT8vGD9lIB ]hH⵫+b?{҂s-y. Luެ}q~M<wk/~~yv<1g<JOVs^\ .VՋ&bYى(8UCdGJ?X_М7gi{ʎ{S'mJ5^X~9>˻:Suie0vSL$14HMbz󱒻C;IPB q݌Ya6u$eՀhH0PinG2v%yI_۹3}nVNr$%ՈLo Ii,B�� �IDATh#H`^(8o~I G Iu8bJ?Pdž{{xԏ)(atY޹YЏ:u[&R~(f_!=2J: (4Аlb`iG-oU?&4m==MQ]'Tt%Ļ,0z:R`P Sȑf! V¸hp&@hN+ 2! uy$L4'͕W[xAΊ.^gJ^,!~ʌUY_P@@ -ƶUt8q[zf{F% ڤ"b Uwaz8-rcKMFITP(g#+$lc^]Զ0~ƺJwP_J-{76J%5ȧJJ9DϭX6QGwJ^ݽ\_̔h~a]<6O]R]ΕxDrf5 VX*+i8McW㟜 AOcq}VՋOϨ3(xv >2U1[3aժVEUKĕ;NT,~Vq}뙦!̚N^4]<!AΨMMUnGR#/9sԍ;\@+q˵Ǎ[|j0FS׉ҐfϦl//DB[l!-{4V7 TI?xüD '9KԱ:rxuCߊ){J1[(h "ę3GؙLףx?҄qMIý%9`fJƙQ3{ϣr]l[Qviz|ԪKo Dr-{LQ8Wԕ8dfȵMtgtIujB-CR[g&Fy32PZg쀇ëR3gCh}o GGs٨+ O]cu5Ub^2K;zY/v2F闺+lUu D6!=;vt[#L�gȠ^Vq$5JQN}F=W2%62v;LGe(lt%H[8tvurEySO}E=˰}3-t2rJ=i/ Tj77O?ǯq/IyEr~<HpD/?ƊYnk|}ܜXzs֞=՜=ՙ=^~z,̟.YDOGoiz~|Ԋz !Q2,tt0 Swc]ydzN<˹q.#-^DmyIe3jSLAH#5oW߿ʕvz i^-wנ#mC A"ԣDKxnM0>7}A'3(- ceدok\q?:f#u93jw؇.s2h78*3Bwq=Zqdfч}/fvߞ}SNNGԫ `8LGK;f[%b S�@I̤#-VcGG b"(EGrz)B[`TQc3ln6 #YLɽiI5j gWIW#Eu%HR8#:-S|4pvfv-J2<E:"9µGS/L=7#"P %?3|�9x]6GjV4gJ' *7lK& ~I%9ٖͤXGBC8ҡ&[:[BؤwxTk1m ; kN؊g~̍Of&tTRXy~ntWu3,R~[{v4n >usw<6bz;Zt_= _[o9\b޹ξ_ V/}ӯ[jMWy-(;ZqySKUuk|W~ӏ_INEݫ<3}uSԺQ[$"ԣ)6wQ%mQNLB.K*LG3oNo| GQ~񋿜e.#i<osŇ3SY IHi&A_gqƆl,j&I4e筜b?@@/*RoYjIyM:= g{漛W_+dCQ-hocVǝE ʮ =o%Æz8( 3ew'7 8n}Tjh-0!t_F7zG91yuO"d<b#46 fIX1\3-Jc$Pxghp v^2r;3#$wH<tj-SvhCt10 E[ZPBFC"PL+i ,T$ԄVjnL+9mMVx{ԶOE7մ0sS ƞ:~4DG]# ~mPk|LUG--3^3Xt$\pRLF+T:"i,9B"2=* w +JNj"Uðt=_2z18k ݜ -7_Ϫ(<R>D`E]vZij9uY Y0%41ʵf!ܧXbPv9O7O/gOn\dkGZOz>,^o^ /] *w'?k+.1*|WwEFGl"R�"n$n&n#w1>+k;F^9n{*`e+X/*^uØOw"G#hGAPuGv|uz ɛ *D짶teCTӚc@}jt $/M!]dLK>2ҼLrʃT N'C4 )d x8젧MV}+zӣz!s|aO]q<'9TlGF',:?Jqaq='~/R#c�K HFIYT8:alxH&)s۞�jڋXڪ=ЏZ;nL}!b:dV KAbq[tGd(7,30܃^By (tGF:rB.ᴬy)r]^y<Zt.~yns/5O -5ki_pb^4KR5ޞh!!Ԧ/H,DxI2WHXJ3:q$4>qQC2RFA菌kwXqOZj.`~/cml{K124si.ɟEWϕlqe_?OS31dY(Ϩ5"7Y鷄D|%ܼ]ׂx]L2iF)}]|gk^z*Bs\{]Ŭ}ҥW/kdzz׈JxHJ9N"'jqW*6PQch?5לgD?+ZGThU#J CA%1RKaM8Sc\E՟<y>}ʋ멌业}p ΘXz<oeF{V�++5ΨJ…x9^oZTtPnqIi2Ko%+M:P夙){d@EQ'bPV[RN!,Ƿg鷠q|Ge|�:tm?ᙑ'o91%9(`:2w6`/X<;,=S$\ކRZƐ!# B3L2ldIM:j`&hLwxznT#a׼QĢl6:PaH I $M41>rZNZcѣ-jC{l7;jN#=9SIܻloWY,ѡb"LivϩjuSW;Zb j܌ ,WqR}O/%0ءr  2̆ (&\|f DM&B44 a [-45T-PCrVJMS=T^Ν2{@S5{+}|Z\)7GbZdz9)/OHzVLf2޺TM0zwq3.[(o fr{pZO<'gY/ו3?Q߉ l`vٵ|샀AC yeWv:*tZmLg ,ՂGf) ,jl]\|*+IVr [A̔Ju>xS/gmTu|9WUs)95=w:8fmUv Q=fbp$ΎrF`%ifFe9M -e${08SoCq1U/}$+8Kլ86O6`Z -͇KTʼnF1A戔 @*r|t:03Ɏ cM'ԷD;lQ St1r�^o_mL2SBjjERH:0jةjFvl%yCۄMpfcH*(fi%P =nR$=�=A9 bډ&|L딪ZzRkѽyٌ*U#{cGo+KFo8p5[= :]I䗒-DC((e[P"s]HZaXf-pB!jQHwFnAN@{lic,0PY%X 3r:\]'9yfs.^f~G[θokrsoqQb1D;Ts'MhhcAO_qw3}: e|]{ mݣW.Ʈ|ݦ0+JdܘJF(9ێ b_^mB}Jy4c8Aۤ -!xlz|sn?wϧ+_Ls~5~lW/^M7g7W/';CIȭ1B~bdϧRdŖL4h+ G b`\'y\ Kj[L.zO[H=cͽRqOes飱9E)=83ctB'ÛY>)-ޏ4<r$c'3ׇG?,;<%8ƄfŤyD3E&AۤЇ[˯TN")~8#p[DL rD!ٞ hWl吱QkH23RWX:nfaBn2EVlk|Di}@HSMX A$iC5LuD'/,JVG'v6jON53U?hʷ>0o@f"NCZecPnR!5sBPU`J OXk;ғ+ Bd- ̍F#Š [wHia)[n׌rD5cHґLW^[x.bx|7!W"{Ru*;{t#>hسUө -7.3kbuz_ě rq~zUkyЈZV)jKϝUM<t]b`MYdVܕ-ڋ٬ ڻMu#372ڂ0\#M24=$\kAϟo=䗝k]^y1O݋߈+CIⵯlE.P7xbuvp۲\1gH#HrC Li[}UJe{ŀ#G-\X\CCCٗ#۪ꋏya~E{N5;w 59 uRK { [`sF ^ ֋$.rvd|5 2n t2`hQ-l䐡x(1EfcoI)dcH!u ȞM"˥dJ60c+bh;`2NE߫w2mGIV;m WOw㗯iN]eA+f+&xfӛ<_ܚ>!]4񛆑y)Є"'e}DJlN%f6jhI$T6ci+5a`F9J ج2c7-)@Qi323̸Nu.Z݃۔X<έg=3Yǂܲ|ӡ.=]q=찳6okb9u횿)?W'ѭ՚kڀN#`)ntc]cL`+)m7̵3'g~W[Q o&,Vi* VI6Hj:h.o9b 0lxHc6ƻkAqyEQ{q%5a<(-l߇V%ĵd?` /.᧧Z/wYzعW.7Ӡj6ʙu0T;Y:4tdldR,d]7ː]܁9@';j [ah^9MuDn5e'8I/9}O>det9S2')>8@VH[Y忕J80~I~{|)H/aUL){jlKk%f$ (cݲhj_C-z6&*Ir5YBߘhZBc)TѠd@n9v/y;}ʦS8mH hNہ@Zw"v\($Y%f,uѽet4Լ# +n>xgR{xc1mTӢD^~JBonfM�;eq9SaFq&I)8`*̒C ]S8rNrmaD/5kwt:VcҬbڊȋ"[Oj<bK'#M#Ձ4s{OZ}Rjd.(\fXS.SL7 dLuXy曈)5ʵkUî3qepul<lj=ǢG/_8?}+ R6@rv_^QWC miƒ:ߋ @L?tC3i~YЫ�nҍ9-eSG jP#.tŏܓS7 O;"L޸qQկf & BbƵf bYW 62&=5 u$U1ҩ6cR Fel04U(-et/3=.-#siy^-NPJN~B?@J+IhD  wE �0sɶ8kJֱ}׻eo-G{YÒ䭴}y 6ARdΐS uT!""`lĞˬe$#D^ŴዉV¸:zdHW.n c/R"*iUD vr[jbڳ;8¯Mb&.H;EG(DJ⟶mgpN7;@ 8feY `rm3sXŌ 2aIT�� �IDATvnzi2}hN2X~ydJ#>2S3#iZ=wY2rwZma7M2s;а70XiTh$>Pbi4>-S ; -Ag׹=X+4\.UƻVksmQ->J>yGF FD > ւZ<ZHmgԠZ?A޻Rm]aƂVK?{6zGq|ݑfqUaC#ؖ؞N&&XZȳ!SXS7Tm<A$fMiEa:u;io׽[ߍ̶[3@8"!|:kIAy<hI9z_^\lNdy:A L TZĦ9߮_RFPx0A3ȏR5xNInG Zg8{K<N*ju^1h:=:_1搏yX)x#?0/| {%܋EU-:\ 1⃒@AVC`!3Lk15ā#f,7%?UOaAK B:F!6]ab`pQh;}I㍠WAG@G{өf;~ArP3 w֯ZV-[yCc!jx̤xtz.g=^ \];SjZ!~V{=r!m:EG.,/Q9cL506$ 1l7|rC4z4Xf1-.5$#sFyFoc#Ӊubw$r&QlbjdF9] cqbX%κnK&Q"󦒦sWa0w}Z!X?ܵ?gbܜZH6teo;Qtad]@]jqᕽa"o>$x}tiE <~~5/?<yx.1?Oy}^WʲD7K݆3j-I%8;D0o,W[Hɬ�UU.b=E,UM aȆ(7=3mvljg}Z+Z\(E)@M;'yPNJGoJ n=8EDR(Ɩ3".$Ҳw@*)2sPT~1!c4x+ao$@u@L}@8{O;ك-Oȷ/w H'pnm /TeN3Pr&I}`?xy#dۤ4CXMA[9Fdo2GO:{u qXiEfuuIŦ!;J=\%55Z@mⷌܒzDɄD#fJ{ #:%v]<ݯ˦gS k-vU$%Ɨ`D-gZħV._|\n+]B,/d.=3h0 kmtmjSRL-i7)"$q1jTNiKUmLI{ITn*8o3 ?Av4 # iitߛ[R  ;als?ܜO]'dbt:.1V!XqY|r΃UCӚw+;<+>o+"zUu'O{"gwO]}ЫKENߜ f{ߋYl<l9[3ۮwRtj_jg)aIMA@\A778yP7 bbzmv]EImsl潐w8p*3Rz<_"i[c,h[}%oDmnClfV?r߶"MJ􁉝jlG  R#cKb8{ Wz%[{'ou-)'bq4Rn[W)ait]H sw*:TB[}o`S+ ;~I$%9iw,Sh]q~8w4|o{gSng~zkL[{_\pv->81N="9D(|ᰣ_h@IƧܬe>gRLzB7;|EѬWFbK!Ԃ#1inJjL n5 U8āM`lZ�]8V Ãx(ܓ:pp;<жo>a⺚ndm.31Htoϒ|*x/qguzB[ՔVw=9,g96'YE^oV^={;zkJvAm3ݮ.ÁPdX^^A{clM);&IkoCJF2dH4gp̨sl9$0]Q: ơ93pFISoz,ZDet/|Nj~$[Q mWI=]ǃt;t1]MX/9 z|-Rt^?č[7Yku=ۋöbS?./9 CxbzCZ{A%qba!vGEj>@XTu7FlԑӔ1aKash$z 8`yoQ=p}jԈ=a\գQm[F[i M3$c\hJtARJS &)voܔjeѺ~wKMUB{Nˉxd>&秢x;Sڧf`0kN=rW}⤁Q@ř'p!(OJO [CeSֵ;猓}eQ%wO(&Q2-2h=F#aBQVPDNG$#* Ij8Yۛ4psiF-yۧ2;qꌿґ軛I3H<hroHjªbD '=̷KS[F d0uza^|PpY+]hnݙoHEA5sv"t&h/#16`f>Bu?_(ӵVzgThd1 sPGۨS%{Ў)r*qcXEL'JfE[kf`o ŔcS:Tu¡~{R6=j憤o_?Z<o<)gBqc0pMKv( #ÁqnR4)yf^p^n ry.B`?SG<.nFf8-~?wyíOlw\]y)/ͨ>t<_/φV$nO})fW/HGU٬Rl+!c8*V\i+MnSH9/{fѷل55j@c6F 5p 4 T iZWއ:Yر8dXZ"[˘wYC;u,?^TRq,v#S6rg[ˎ}3;ʙEڷԨ$B'.揫gLOwQF dJYenʏwQӚ'`A (;inV/(^;k2^f,[#R{[5E|Oj+)`*L4mn{!SI9hw멃 8n%IV4{q.E%zgSqa_S;Fr"޺o5_ԴVל~o%&#p;Y<PQI2p{ۧvfP^k\\)f㓔Isc-c$R$7EvzLRkm1"i襈: kk{0yLS-qi;~%Dןv/޹S\} ߵAZ0H .<4IJݒfYXnZn_n l\unnkbJv󳫱{nPٓūK-O0qBe'E0X_Sm!@J{7Ԍ(~+ϸ!e{kk1o31Xe@Z? 0nLX*B 53{b0lAdgYBƥpUgۋ'>r:8 5I^ f�XVѵ6p%;ʕER*,^Չ*|jՑdC:^STLjuj ]N]WTJOeS38gADžT_wv3-ޠO-ӊwcl$=C1ߛbɻsrn( #"NU;LqC~ ^}3{1p,G&706:H֍|zMٰkQ(aLsUa1{d*r(ɪy܈ֺDNK9AC:—Q#HzYDբD9qaй8ݼ0i;�QwSm6TAڴPޜQ8?|{zF,s~z/zmh.j -[n;$FA\\ SPfMΠ!pCQuo德!I Td3|hv!'#S^S2fWGi@Z˜k# XtCc3;|> k=p,*lE{;ۖ臗q^Ē/Np`o8٥O1V])QP,c?3= nծi/q8px'(݂;s 8 Z.<ϠqW/7oHLZz2ӇL Z=u=q/ ]jbLʵ a8lO=l3H(�5l̓&[8Zcfn_=5^mF U Ɔ$B ^f9Ӑo>($@椛V+09}өLK1>Rz O\X- 'W׼!' BQzm=e qԐ3pEv#e8maEOM(~[ H�'8B9w EϴaW HGCJFr*9ޑ/_]t2foStV2]Ia~%(!4z&Hrqe^IQqv}͆ԸhϷ?W>wQp{ /7uъ1^''|ӆA{K7_{<A>_n0 8Wzf_RXGHmf^C;NT$? ngCq�8WiN"doPK*Ѥo0%fjvAO([E:8r: Hf[<{:HlٓW|}w tEc|B)6I:1ݞ"L[B}sb^m Xϩ›iM0ֲ/5 Z3~ P-vdh ޛΈrg3K7/.@6r!\Nj}o~Z 6A`mZ%6m? ~-?z!fof6 *�Ȋ1Ψ񴠶R!镻hS N =g-}x+\nD+tA2Q>WV*TzaNL%=bdt쒮G)pTis.^bi:><}"p^'ͭոoG>Yh|uR[B|6]>TWOJ1~Jgf;NLNRnp3 ))KeYt<RYk#b='r|:(Pju⯣{ Ь'd|0u`v@Ů.�I`SfDI[!qtw2VVrTvrcݲ37 +k{xm+kƤ3/$`K/{AlN;=:jY.8o݃N|?</oD;f*3:fmbM^76ZrL4F$9ЏR=aFڡD+9jL1V.fHjzQ⽌]gC5UXEЮ24hmQz 2&HF%)!*)!ImF\ˆK7!TwV18ޗ>d*A=x qĔʋtS<DILE-cMXǢ) 1rGO|K_UV@ 9ߦczdh\r@-)6qp3zoD8+De[wڦ~ y>kbfz]Ih#0" U^}n|VoʹW|{eD䨩҄4#uZ46u*Mw]ʑQOn9[C$jE58ф_ˉة]\ԛ$ a[kx BJ.n5+44HCc@ W1C0_ |)VKH5>>jD9ثB?~9Bd:54'1No=܍g&&<X\Còq"x_n#ѼLWWGy!dȧh$<O2.Cd:iE|]G$#h2.%H&G5&Rb=!1sO?'uNu 桶@@`@ӰKMN1<ćf"}uϘp^1+ׁk~GH51|{i ͥ,GOyvmW[[ԋszGG嫶C-}=|y~|׉%#R4 7 dvR".z6ƶ&ݬY $a JN:FQdp̌fX]$9iH1beU)g$94U*.G"̩02ȸ[Z58W{[$yd)/K_t$ n=:>[l(DyU38ެ@1ʳGz:3P'Ǝm*Wƕ/"0 0?Q0oKj|W/oW:bS=+u<}?w~ox2R}=~>7VNYDKy!{K5^z+r 555)v3ܜBEf\G+GHXVJ] :p2Tϟ,$6ݟ0dn5%&82[c7'-"iBXm!ϣB./tڅ@H:&qǧ gae\=[^pe)X{#䧼(N?oqR7$I?Sf&Y[Y _C{X?BpzOqҐc3>֡292c QΐUIGzoL=B+K%*]CY\f랄O^.c7 e# RXLwIBQjfNB榻uG/l˥i[-)?k[wLxGy'wt7leͯot/LgԕS~_ ApKG)q]q݀483Ό2dOҕ 4H36v#Ye%Z;531jJfa $ᴠx3ŤwUbM6Rj;BUNGuJG\g(%h9$xsoLx٠-_Z|-joHgL!rxbJ"<XT>b7il"|dds<C`^*fL2Ņ0[;jk%g,DRK@!4GuQo.'l�� �IDAT3_t[,ɗ/{^w  }H{1 ʶ^b;m(1v!ikObdRtcmC-dŦ+EnU87\L4jvW\^%vnA x"H# W~q|*Y*+~yC38Dٜ:9qu62V!`\ٻuCcQOsֱc0~HR>yz]г[Y; v!9"IT3[f'{QH;~r>:N7ҕ}dNАMyM)r.Z8P} cca!7C(2 #C8n{1pݠ 7>|>lfqH%$ҙYhv@^HJ}ooy^ g~~6PfS хs9"v)#.^,U\+ӷ%_-}o WJ0놎ٿDZͨRj!R]AZb�cip+w۶>FI3\ࢌrmر,߾4cmGZ3w@ ̐mIP%v3&G*: ",DՂޅȝ ltii @[`E"0�v[vŌu]J[c6z]IW]uKb30醨r3-8bE 'A,M4J#25�Lӫ % ^8CW_OLؽ:9ͅ=7'sbgM\SCUJCԁV*4Qcc02mon@"j:Cc,/:x¸Dg{!mX)TjEŦ G]Z\at! S:SNjHI)קlu2Sd#f h;흨'i<y*/߳KO�FYz=`Q|&5QMW<3H}Au{hKNQyrAj4ZJ8 nBS$Ln*iǤCae\GeJJIjjeu@"ۘpWw5nnԀr9&qK^u畽aj `8ƇN<0W n\oD+:Tw_Zѝw'kM=W翾8o?!«TvRo/kI~% F.Qu4cI=cr)$c䊥jƦ5Kg]J({9ŮVCîNX+)rÎNr ..wI!AΤc!s;Ѯk3S=tpU"ccBjo#!*+M4/]oY=)z`k꩸SBEt뵚!e8ʆ6�$3Q?P cV+(Bl[o3dOz#4Mٯ\P.u1Q2Ķhbg2u>5{L;LJBKɬ>E>-Oy.{ŷc?گT(Xq" IrX%JAcI )rmVti"LQbdA!l1#KcEcKYBQ!Am\q;N#  %"gc]dq".IIwpITAL3^_rܩOT!}밂gV{z3Rޑ[&'W@€hx/!=K>W Ӽ?_vJ|$jxh }BLYV΂'jKȤYJV?iL'VGk03K5̌AfizP:ʀ!YEmlמ׏&/:wxe_~.qwNvoRoIܓ:&9.}t񦨷g4ٲx;N'fÛyLzNbwyCt02eWn</vI~ReR@ #7iIR^# ӑIhgIư �dz4]w#tBdLVo*dAcS#trRmf{$D<u`صlVV4_<<w{+\D7fJ!kv3 +n!h )$ 06&*f�;v.)ڎr樃IzP%3pAChP~Dz9uGGNLNU0~&L*SE|lDKݱWZΦ,QR]{ORf%OTQ^ IH wUXIa׉@CDPMq{2&55O<),a@K-GT%u07A`?p}BϤK;.DPI%j$b6![Bl63'GB@[kL1&y/`qJYg.űg4;==zckcm;$ 3$/尾irZ w+>X>'a4woK;vzŕac֓Q9\[`,5)ڌڎsa2"ck"̗Y^rj|y{}_?\UU-;y}7a*{%U$:Qysz=0RM6s>UEd/+բ=B]W?.lqrގ($ChteډY0/AI]#GV61wR!P(rT ؍)QH'{+aʨsc<NGڢ&Ʊ*t=Bf8&驣$bEܯǞ py/lesgʬl駢,!Kz҄fǴ2]ƣjA5BRN\%m+9N~oL(T\5w[I)Hh))f]ȸ@IW1gTv>I1iz$Tih1 CSSL#ْ@ 6x|}c:%4= 4S%.Y\N.NeL4JhS!xm͈ #X%EM3p?[w 3Swc0@'.uN$'$]v6=뵗&Ͷd̗Y3Z\loNU z6:.X# wB'11Q3Od SV'*I|[,+yg-j ^gw?O vTSΈ6\&'Md,vU9^+n!CzD#QN"9{h F -ԉsa<3%=Ox%- {~x{gy?v7FH|y mbQ!]2;5yCЩķOW)v+YlGa+b?+o׏ǯ7z <zA)dl(JՌ4$0_zNxh&m(2I]uR~ofb]q+LB\@k&j _Y89|]56i4jdҕQ䕒1+ήޟe0I٬w/<ޜo,?ïS̫DsɥW UPhGշ! 6;3fz`SɁ;mKpܗh/<lWQ /+܈U>K 0WzĭK0U;O\U81#6q;&A5oӵD`FmOH*f4֓94INv5bۧT*7 Y]}*lŧUԪْ>h؃O@{5zo]hh]`n#c^j!r#lUrXR rq|BJ>dGr[,ynII#wRct3Jqrg~k#чȯ\Kby43h0+=z 1*Ǣ#L-$rG#W3v]̽FߕhGw= io@ Pˆ+5->n6QыEن1}Լ˕}l(7eM+]op\݋]]Z<E$֏h$taa|孊 >1[ GRWww?_v3m[˅.\Q=|˫ĂZG5%0cG11(mbS혇 I1#tj9d9<JFǤ &2Uܣ): `P}5#=jҌb\Q,rCX酭ps?ݲwDMH?6]?[΢Sbvkzapy U&Cg ")f{h1l*%o+Kcx ucZ4c3DTbXIpZ޿G낞^;Zj52Kvq+8+ >~ q*.6n2|{d~*@)!SI-ʵ)9T74(NtgZ~ljhH>g^?f,#/[8m b]`p:ݜp]J4tS'fpS/.WS'>Fd`Xe ]vՀ1;QtCqnL㤞 H1)o%HӏCsӴwk_zҟu0ÁܑHz]qu'_+$GД 'IGvń63Q?m_+)vp!8d1{#=Mqfnr+Djխ+.|teC-^X>4EYo]TRM/6b13US{x~M+/{O+T  wbe/Yֿжܿn.1[jqݨN#KSz5viĒS%40JnKajY+ؔ`% |]z} Q3 {ɚf+Ƈ8M $O26`ST"$efH#ts#^#$=HEA3uy=}Oh?[2ru6Jޙ Hw Ϩ4ۦÊAP?^?HJSwo?Ζ2&^ko\sj4d:oS $hDh2|{wPH<.3̙z,DGc�ἭєZ=TJZim>NJ%)@VJPR*;5g%JvmڽؓyEVIx0*aW'3~ۨ@v'b,cªDv1R֫Q:^ר ?Q(Ozw 1 Jb<^H sCݝf-^c"W\5͏)lN~"kG' {Bř >@`p")Pe<%>{g~gVNnNw&=bf'S }'=D8N23=itQ첅^:WBbuc\o9|IۭW;ڪyn^{bj>z]v?wA.E\^ܲ>Cm^1JB-Kt&MR?Sw;ߊ'WA.lTmݲNNFUJ~2/U} '/۷.ho<U>Q.L\md=uDRu#o^P�EdUM*5 hB+tĉmXf=H3Sd&unRxڱbhƐِdݑc&FIw0`!Hf-crذT02 m f<myܙ.~>๋61Of}JRB™~� {wP..N!W+FN Y eŦz(RMMBH.2UȌ.خexxߔ+F5^n5WmSkH"*KT _6WaG.Cuk<5iUmR oU2DAeæ 6)vnVزotF&󪘣 KU6J85dDTm^[6gA#;qj #JTcLr\Wc0k}FSP$tleylw莳>4NX7Xpֳ8"2>Y`}֘q�{IABo {Gi?{MUڂHG'N2PcR/kqNy)ziBf1f6jƷ<1lVe3˰pXBp={yIWhO߶/~u'.8Ær`s̈́19VO` 嵒P_/ܟwT",h^Բz'ywnԳ"Y.ׯM%+?i�n{˛.-ؘhqS\~.8\o[V_oI+K ;f9m!ϜpNy>=(n̯D~$V $P7] vViPU5i횈D94)-OwO� Tf߈x=}oݷDZu<^v>QR`mgbg2m]vhӎWliG΢R4ũD=uH:`;s8ԠFG!I;9@ɚ$R쏋}وRka4ߓ}ϫuq(`])%ų}iѰc|QNB4/JۖZ8@;B`ala*)ħ6w0alSBTkUٔ ,JYF wl x<N[Z0u 64M|^8ˀ4ɑFtw$6`SȆķ.4t u^UzGӺ>XVgwlݱxӱmZbÃA5ٺUJ%]mC6넒ZM\F0G.8HrV*NOS]LY2Mv)& M`}6x0LН]-=;]7ڡ:N4u};{8k5lttγ' +6$"ީuen2Rod7jkP{;Ĥl*_Wdc n ~R5FΗ^Z!iK"!�߯xo.R1b_0"bxQ\Z-YFycQ.N$ \՗Լ\ʟTJ^A`o\`n$2Qbn:?^PWJ oOMm\]xrmo g~R`w˭_‰>cF?<<\ϟVDp"׆ߛ ΍ XRAB"d܄V6#9.J;li;mSTtz+4i/b|0Ȉ6Zb8SS)ZD+t x�k0,Nl RCI/a\?0J/<[wѠ2QO"EZ`CoQ:S~ht )[<)^?bَUU_mڊ ./%azN3Obږvm'Ut좺gX7lvh=MUkJ!Do&h`yg r;1#d MT9tݦQC: ҡ.X ȋz\% &8[%0lTD 3�� �IDAT $z7k$Qh<\�Fʷ4:-zD=ۊ 3uȆ0Q blxK񪕤=nN3.jwMdnK]bu]c1Yp~KLz߆]v4CWhOϐτu[ݷ9}﩮gYGf?.4} aCpY왱s&Q| ݍ&CϿYٞ]\SV^BG(;' uva5OHwꙛ0/uU#C ugBK[Ipk(7/ z.\,O< ˕t7P]`TcT2)O1?"e e?F=aO nU'Aef`/[ 8)|/ sUup}=�¶Y@=T &C46 +}1ihj{L+4uځ bO1toԡ:,1] Z) n&Q,& o^968^_K2e#g=*Zu.w)xD%Q_#恣ODŭ-I� R[ 5䱳 ̆: nQ( {8tۑ6B) tg'Ig|^7F^x\hHq'~ bP?5~r 9)_&YsՀ+ ķ1׼ov,zF:cIR іg7kaQnX -|ߨaQ'Bã:/M)/b/ A|*9#k*۱vXY3ިhZ Tt8:؝lTxjHtإ͢f 9'%]&, i soٹWYt^݇"޹ZrNy u9 l=<MϬ.Y<|j~η~&r9Nz8DWFILNtD%:e>b>/)!0#Ivo8~ꉛ?tG'UυXNܳWJPm|QR] /k|0?wu>)!ppժ?57#s:vPSyƸҙq52oDE:J\/C^Z݋|pp Jh7#*}U@LM)7 Riĝ3I ܔhj{MSNف=m;m@c %)S^tJ;[\ .:!@M[13qZI?.b7dX*E%IDdGN[-F9C*},ºiHugEX С0ٴcXJZ 4;oofڣwoin6 rz\AԒ!rpQfˍp/.} 'YYlewvlEr2\n0:QSkrɄIi `�CZ~aT︱@%OjV<d}~in@B\ !V+r.�E#�:F x0tbZsuԗc{wYc8UmY3=O 9u\HsD+ݷ;߃,:;;H?ǯEowgE`oJ?$}<v`[3bξ3nN xb.3Huɶc H;V/bhKOpò\"T&y9e9yy||8wK.Tᅿ?/\9o]{wbS [Db(myJx"9C(j/\6_-pykX)|߻U KV'}ݹgG@]=�.] U ڡNG︭U veδLxYK4xRw[q@' CB(͚ө$C%Xv5c腸"nh27p|e<]^M(Dq{UsKS9Q1#k]]C%9\mPn&tz lJ]LO%Q \3Pn@rE ;-d&ejVEuLT[ҋ%HͫI8 s[<8dwdJ8Cj!P~ߋ6Ƀ*QbDZ215ҡVrV !P[k_/F88Ƣ]Pz*^ZCqC16%DxmhH^my=m_bZU6+7@4"SX$te]=u>ɔ2 ~?݀u vPFędi95<b{1VA{8 ֧YB39Kk[䵭y%9lQݷ!N`8T|:^dՠ֠h58ZeS5&kn t2kǁaV`=z`/frL2EgW\(ƿ-s|rj¸Qҫ_+o!`;|k"[sD©O&<&%?ӣcxXʃOy\jT׏w4A1˹_t8ݫ>ܫ{_ 5vPFѦV^+tqȣ+(qwWC3*pF9A!LK:LbWǘ⦦Φ)@vgě Ȭ;L4C')Ŏ96MPIȔZi)uQW qy_V~jOnɠ"UKvUa{}P5o ܖ%vƐ<ljI!sIq Ep$kiwwXrn:xW.}^ Ӫ�UZԆh">;%_'csykaMu]!Š3]Y Ū,SS_L> dbxuUfBx~16 ۲0ҪhF.f:U6A4NE9'姆"xp(| jw-W6- 0 p,R9`I[ <yѪA 7tCMySaWӃ~mj{@>3M8HwNJ@mCיgKǂ!1{[m״m;XG->v3Y;)k@z=a9M`۳<1MxժG#Ik `S MW՛.'Gc%f>H<Q4bzRwbq c;6N^Nj\x\rz調'}5rZ`xMyԟ 弼A4~.Bqp) stzw[)/XJ='<~^l]ԪE6n? zê_7D�]-e?p!1kf3*[TET4LCG ʑ&vNW QøY"QiRXOpzd ؆f�]CG3HN6BJe;"v\lBMҲb 2q'ܥ;%X+_Ѫ近^=@ Eyz6E;QDRKoEUHbC[j69%u� Iĺ"nXgcIdؾDu;&mh 7D_t}WWqaaa`7}Nouv}C0wJ=9@u Sh``z_޻ ݵ+327z9 5--? PPhw>v8dQ2<! U&w_d OY9n۷tt#dUkl>p-!Hg;Fn'YmwG{`Үzlox 3u#>i^{K9*OFmhM?}&NƞoQrvnȟUmF8'Se}ׯ voHOɛk;]]?ÌRbu9_ HuLj$rCVGNVtE9'gKQv lm] wI$a$eCI_~C KLíom9n FѯArQLܼ?8;IB .5˹/wb~d$J8W.wK"1$5Oqr5aeѐhtYˀ R5Yn0P/4 ±8aCQ9W\IlS41Ϛƣdu(Pwul ڥN:DAvh[RtZh{6l,\d%K5R(IVJ6 RJSm!۵q/+,2~` .zg=[UM.ԅgRA%<%raʖcxV2 Ra:vm2 u *2(fm"k߲ �3C./q`ĺNYO&MIHӖб-CQ.:�m}]aהMRY0s[`zT m/nxq{[y/@xlf]رM+C_]vq៕(f(_D-LJMK"EK+#Is\7g '!贫$n6ĉa@숝A&#O{!β7Di̮>ٙp:zﱠ@;ݷoUs_M8g_?(^Jߒ ݁[}sÙu޺r]xCOOg8z6Ý.dchAAkݸ)@-uߌo}t@H<lqJ^(znw?V^V/WW؏vXTI#KDy<O O7@6 h;}@J Lj3ڼwUw_jF�J!w7#rdݺB4vԶ8e^]]$9 ~m*t$v[(XkQC4Tmxc7iYBz&u R+grPk.JAЪQJ"Ju *V<U~]ٷ;pfgcs =Om;�tL?Ӵ^V8zcӯ:&/Bu4ъۑK,U�kѪjWrӳ/f| XsقJ=uh+={ȳ(dMъ37<i$am16 U#Di'oe}7}T7Ūy,@˼]!]gt{yP W˕Q)@o8.+7{,e(Ok8&.; h^I+ޭҿ\U\dY;zb\YN2BMӪC{ðgx I q'z=<ϲΔss!9#f|k1x+ oI%SJϻSO4J{]H:(i鷖ݓ9k2 ӯS^a;Й,98W]6o xx$Rm ߳@[~t(b02?X6DGӉ'o_ h-l;.ȃѫ}~ p8Y0۫%ՒJ!+AeZNẩ5iKDŽ0j�?1GJy- %W٧t$犯Rj޺ne]I$pԅluȑn;lKKgcZ%]cG-<Nu]$S[WGʱ)iW0ib&%7NokBGmMGd:]j%iK뫀迮^unFH,ó/}y,qIDmO"W1|Z_˯BBBh֎p])#}]-:,s& kdA^Q'&552ҚeX95Qa:J %mMF׋B,ȹئM>cb Rzj[@ZF8 +ZE/$ n.<R%ӵ..[Y|,ۂvX[e^TOk:-lCg7> heϊ[[vpwΞTJMwֺ*[q5=,IJ @:(p| I1n'-}#yǰu&bttY!5 5^wbuOqٲ@LMC{yyv'gh>~yL4bQv H/rO h14NAzM8b`wK! M.-+ڟ?z5TU^]X~q::vcAt(XGӜ�WFA-ghYjbkv(?OZ09<0/>0+0FڕyCI1J5 w}䢼\utR_+>W?Z$~ӽHlT?bT5T U1L8ghxSi7bB| D1t4ݼݍL+Jh7IwMN&z͙G]yLs#,J !UHʝ}|D:1y&mp=%1TZnLJ­ @u5=0Ԉ+VVL$m7ZVjDMEs&Ѱe'HR5zH 쀸aM#Dy˭,]\1oBd1#u6$[Z܎Y*c+Ə'+矵*WLH8NF3?oJvdxjsxxT/+</~Fbu2xaR18 / '/kg(Jˀ65XKֈ`JꖑZFnv}ace֢م&j;6<vQ&6{0&F˞m3L`&1SPn!Rg<8߬Szoi@y+"y4P>Sv|`ߝ5~"?mx}(μ4!L`BLU%0 +Tc楮 te`%({uf~E 0r+QU2&{{ߎF-~K{%~' B 碚7/lUha2R#\0Q^gݑ<SeT>eE2ju /v WWIŕwC9.Oj>?O\0WJNPTi?e4*ћJج0fR(6LNlTԣp9ՆiM7wv%E[.13=%%c1ժ)/1)Cncށo?{w˾6XU:F5l=rf[n)Zj:J55y<HdAВ0os㓲l%1#!kp:ތ뉻[:iGOu{_B l,:0ܳN+YİIa/ bHَQ Ub߹*.54.ɰ*raˍO8^Q2/ժ?[1y6.mx\eKP[ɥF$EͦBHxB|m/ 7a>EUr ,; f|�� �IDAT,:vy۴azM:R(Mg*!KXL9 qb,͜S& =lb.%db>gwgotʛwRs8/M>GO)yτ9}k.ʵ2:;stK*>3XVSzy;٧9<+=45I]2O] e,oD7!uYh'e]ih" 4v�TBo4 vp=r4TN˗ʥQϹ hMfp#oqP1 `!}O0FnC Y 4*M-D>E΋-7|%F|OFmp7-e}h.k=:Ha}a!mx'dr+39B+A PKuX 2I04i")vkT7=tk ~5EtV5Evx{Ļ aFQ󬡿 VAa FMUqݵLÑ>ДVQQ>f'jWͯAFcm< N^[g+$WBg BrS@aM#~o _?5td<V8mLYUf.7#iK~n圲,:Uxʳˁ8,x_ŧFeɋ}?Z(_qmrₓ󗮎 7lEW`;|Fϫ'"\?c﫬"Wk0ȇ(=LEeI*َ0!;6�mM#NTNy3;4Itꇘ.J)&NHCbϴ,GiU7388L[޺] _Szw}!)4ȷ qS9Z=÷z}^fu-oyFH;= ^;*1LIEW Wߕ0 p /Rی][44[M&uqv:j=Q<BDlgpte|gz߈htr107$R jP7FJeutx.Sů>sTէb` yQ! $mqA>qjݜ2A</F͓O\>_$O 32kt %©W9A4` =MU&`a|o1!u؝[;FIؠh0vht:0oGYB;mL0iGC,txqOeznSuzz<j:c(]p u`N+Fv9묕dӜ6Z1}S,2bP 0pfm@,%jw ] tn:`7�ACsG=?<.ℼQ|ysragv`]QH(5RgK~rB2qwqtV@|1_kn~}p7sT{2_}&v߽OGn/bbQ}ܞTe!]xNH-ԭPG%rSloV2tŲp΀R1 lNv_&&bw0HwLiU}Sӌtܩ%iP'ћɦW8ÌF;3EZƧ;] \:ospEˬxoNSkYb6 Nzlb@B;ڞ9hPD|{: YN@'h\ It *kkM+;.GŰ o@Wͻ9]:j|i ei@W^T-aޚ`u) JR*&=t+ϫzm\T~.Ug{ԐcK?OBG/ƒ)\q+65t66*JBSZ׿SǍYkYOEG$[jPw5(#<`:u9381फ़%i-f41&M.iS)'Z]+fmXmySWxIMc[aY5x2+ebo)>õ)I 64e +C%ζP%]*ÖA&<5.N]Ht1"_@Ny8`,|)sWm!)J3Z'ýu//VF}|>E:@5-#\z&TJԯ./^ҳVA)<? l.g?s !?x\`w9pZkxZmV ǁXpaC]أaD<�eZċmk_oՖ7eѼn5JLE9 kN>_Y/:cs|:>3iΕY[v[; O[O际wՆvb`hw2G3-N% Ϝv]d6_H :ݥEa5 AFS${̤"xa&,Dso.I*ыVE񛟲8g,ajEv V攀!/ Ю4C$>o#(v e"^ɏo/paՀ/?hUؗjۗs] L池+QRAk֖}*J=zrJ0BVEW3'F%&+YļvEd.<['`=k]Z]ɺ$sze$o=S섡47oWKi ʢAi8PnIWj+&L!]hK,Q2bk(/FaSRᝑ5݅U&XLڌR4Pxk_OCIYPઓүj)pu 9;Xr67\W/߿q:c?Х4l+eʵ&{Ij .ov*G٨czFQyn0Wb!F9Z+qKŗjKe0imղV]ß1<44DqﴞJpgiBL^ II7laH SPhc &Хw&-oy>;=Ҥ"o'ޓSYE=XMzzwDy&ԇ7nesOe,jfl?\;EhuHfJrq:]/mJ>"wG 6@ce0 5@GWl ~ZVq<e>|X8V]hd(_e%_Př_AͬPvTpVsz;Ъ^EQ_"_+|m/pqbKRn 'Ǖ;۬sό5 ;5V k(@y=YOǃa6i%kX.ޒA RV]novié=u1VZ@IbD۝pv >";5Y].\j_3OS-4}C/w(vÌ_ަ,$R!M:△Z]Fjih, �Z3 A�a�]"D%j!OtND뜴DH!Rr΂-Bwo0(Fy߄t{k1oĮ~ڦۤ!63ͭY+2v$Q<\[i,^uJZn냎wPiЈ<M<V FvE?U3+SjiuOВGuؕ_^ ^7藓ŶpVmQSRSf#xԟ V[b=!2A0̏?; aw땃ѬX.[a2;+S®Ѥ EO>O ~CJ "}9`]$ɫg^NE-*evz5yU:6?ÖVm6vv$M3-o3>oCM<^4ϊ=H5mMТJ@U #}U~WI]rO ?dz(о}7H)<^ts']<6B}Xs>WӝS!Pa"P-Q:nj!udh[Ķt$-l5,RH%d�Q|1Xxs뱟, vR umtM0*z]Gr~uŸ^%ܷBU 'SnZ)!?GͧU~2rDJ~hsy2N0e3S\&:oDY9ʦ~ORjrTa&35e, PlFNӦ*!rCj!t숻u mX^q&iuܮǭ3,$'qxg&vDz mX׮cABˮj4jtۊdSeݗ wrE<Fl*N!y]x:nrrX҂t#ȐFG|U&I:$CBK7:Ԭrm;&$ɜ^g%taeXN=!bߜtT`sʿk-AY*+o|Q(J̏~Y@y"6e*z}BkWY}rUr> rzXʫP n4堿-~b(=>kWPɤG\uzGj'ؚx~_>RK$FhqiSgBtI.qN{6mT:3SHܛ:mqqpyX\˽ U wDɅ3Sx|UIv=B?knhSE<7{D2ַko$/%7/wwmMҾԨ#iw׶2<,ifu'U J= Vay,`GސS (g+ ;-kOii+^VpQ{/ŷGt0}I+^ܡz1I v3y˾'xM(" V2dDrwQ)?Z M`yQtשb(;y/r4' z]w>4FVl0Q\a @kNrT[uNltubkDB ;U  kivvItAX\ T^B'4۲J ZîoSn_,5\hl`[i b0U[e!!6$7@4Bh 9)6CI6]3i4Ossv(f+`˥.ԫ6Q Ҡ b"d=]pGK *ThSYc]pzw)Y%`s8+jAl#)([ <Ҏ) #{Ǽdxq"ˉQigo4Fcoe6|k>.#O]4Ws6* W>RW"1{wDͺNKթB 0bTMX<4h@1mGlIҢ}R}s$s6-iKioJeC<6ᒧOGƼy\\FP< Bc>�u1´kQŷ<7%m 5ڗa_;i[Ug3tѪۦԃ+i"[wk3;uաlR̶c@ꡒz~W2n`ᗮr4Simqv<]{')1>.~tGJLRyU/O :!RFF)}af^x St4(HUK 93s'$gL_pfusBLcOgRuVhŠ<?ȯ?.s̈́$^U$LJzOBғPiYb%16n؁4Аo,:ii7`WNuIr\ǿ0]A*)Z'nknXAQF04^:sJ@N>]GP kaw(8i\C8`uGXMMS/)8C'-p̿ (dxbgáڛQ#)iwt"qف<TkBI> 찿A2RtD@~tr4R}ܬ/V=,4`zWs^z-_!6T*/0\|PGYk"`q,Kp's'sϒEwl^L%FJoUpQE(존v$oՊ,qsQq3ťtLҹ`sUDjR==$3k ~ .Vp$Ͻzq _@a޳t5|#]8>' Llm{lx2Ngo?^1n윕5Ƴg6MԢDvUm8dM:&y!YSoӑû�Ka`ftZ1bA1qP*Ä8|őC ]8d-ܦCY\GcԞG%텎H?VG~HXd EE©v8+Ňro㛕Kks?v.b܁ +jTYXҐ: AcgT+tD!-�厉ۚĭ ㎉a3N{W m5�Y4*4|iՓP%N;vrm UpzEVZR[##+ivTc&sQ- qF:l-@*j!U gVurXA @Tۄ%m8! iYtъK-ȲF8q(3:؍$ r:eo_1qT]RD" ؁ed5(5ZfD^#WSCT5"^ w+ Q ?fY6 &P`FQp^hV\_'ݠކ J=,ɕ&TYd{?*bȪOlGV)2*= K<cv=XNoΥ�InkLO/۵9<eƣy0Bq569@ *qqߺZE/WQ7{z{du~۾J6}sY<Ů}~^UɷGZjL)MK.Ap=}-Xm d-hc?7UI_D"V^H^۪QOa uNa_|ɰ*~(=rj'/J|=oݱrHfzrZLojт9DWpͩݯ0ۢu-j\E3l GJ4V^1rZ3ݪNL_ܑ|^27=Un᳗GsTbd-&yf!I]- P~5!<7X7k:*6#x8nȎظ{AhrV u6ܬB1fso%G.x6m8dp%l4ص7FCxDu[,}Ηؖ ;JI+HUyN 4; AZQU/¦ϱD Ě:𑎿L7lS+> rk!S/(2Ձ-{=*Nn2j3>[)Y1E #tgQJ?A ̖j&JʡsVb pΝ T/:ZC5Oˍřgg%uC*�� �IDATTy^lQSU?r{,Nԗ>6QgЍL7ԍ0n\I=@4.]hkT\xi{ۿ V;}d߳J.^3Z\DIs;gt/4PXXI5hH-mH{H@NV &q6<տ1B7l[C`|0úń¶=yQI[Wv!J?83`jI #zbsfbt#u:W1O^rq{6* _P2⚫yʃ`6C}I)y(a1s|`Yg$ɾ|~zMΑhxܳ/\=~kkb-wH+#0!ơ]%>F7nlիhiribB[$ӕ]Y5VL՘ bjyV! u6tT6K#ʉ@Cc.\]uI±9)L@AלX@.CHHn4DLH"#=9fEk[VTʰ.>wl^u͈Niuh6 R=j]Z8\ehQoF@<ܱ8VPx2oj(הpƊcw})b;e9Ï!GM~I#% D}ϨϾew&b=nL3AmKY=VeA?'~WH%l E%:%3Ӌ\qk8DͺFu;zԶ<U&iiho2<s,ӓqmXB;s2zs~LZM@#u~u;|jMhT;m^ i�D3'8W]׍ӷoϕW~o hGJpW>Oh!6v4 WMQkʢq:vMl'$2DR![UO=a rEyI7ӛQi6wG궚*O锸y}ByR̜/3lSb.?/_ݫq0\:ʼnl0 ×<  S?LoUEk'ԁ8FYmGVJWC,cz#B%2d?]NV`]$;Dk2dM)$kĤ&c]XI:t֑`X,Q7@I=2P^= 6q*7vaQ3W$6WQCІPf J{Hh>¡PUha{abKې V2\Ga6ƏT,t" DjK&wKȡimA WqF(Hɨ)}`+D#ș7_b^9-epEy*n_|Ԇy0JZ"ONyIЯ|w~;bDev Dž8xԹ}Ţq^ӑ~eTRV BOi9QrufkmNDmcGoOC™Xی;#;mXQxG|5/2_tm8TI]ۿ\=nK%lqΈܷ,.Z?KoWfP#qz;�.m|-gY=D49proZ$mkN$Q, �Bv9@M}Էw̢ꗐESSp, f."3lzOI{ýRE|w$J+ltx 7g\]S Ӣ`uWgZ9(KWҕ~Y|~:_Ruehj^C}\ hWZPܱ3UN˨ݴЙg><G`hشնzKtjJĈdD.zR gK`bRUèuM`czHH>[az u""Q.NE\~g4 V=ko4F'Aڕj'ԙ^u: ۩P5܌oI:X7$:R!Y(L-d^-Ui GtTU%Geׅ ;eΰ'l_󠨬d}Kl1#WɪO*%8]bפZ,exlWuJ G ( 9܍yUՓ*b;ܐ ~wsqL9Xf Ͼ hGӡ8jn2w}y"NgɏkS<Scu`GUIlLq2Ï83IvBt$ΚcjNR:$huw쟖߾5^M8L PL28@ԜO6)[&+ksUV>ˢ?zA;pHi]]C]Z%/%zo|Ծ?hF~ '\xx66TIcwwt,te'(6{Mpf8\!h)~@m3 !*6"|ѻi^d}/�)^řLsdra.Ӊׯl1'lLfV`&|P[xmf0W?xERbBTQYx?Vd bm;i_#*lpLdp\ԎN!7TyICm[9$'^SPӴ+_QNmq`;*IEt#1*YWet6 tu!`;%fϳF'Ox?4^8TnmdG?qD5%DcS96luIQNш:Ā C_X٢~ԊUz34;;$!In+g7+H} nXg I^o@i džJLȂt?Bξ\_`(h(of|.fɲvG,72YU/tɑ|zi&ʯWS?Ƀ=mϖwٍPAA`{:*$|pRfFݢJW``'ݽzޫّ]p"n묢فIR"ng6 wHI"u:Uwmp]{7KX]{OZ&~q~qe~;27IgͻWau8a4RC]}vA*b/+4qVKcWrQoBp*&cp:qjbUE.v]iU*np3DУYr] ܬL |P<*=קD*{ ٛ#Ω!/>g۳b?7n~V6Wh2-O'X9ЗFpGщ,?G k?g.?\d4ɁPG]^/ԎeZ#[Xw_ W`X,  Ǝ]mAXgn1;kYgI7Z$NPog7udzs<MP#D .-7ufIX}|] DЫPYJj:["fiH5TjPf]5ޗ6i-Umpme͆Tj$-`D+]E+O$kxzț 4F։ Gp$SK&iEY먅DMXWnF=�d4w}/T_a GZZ؋J}`@ז͆էygDnE'ύx>9=-Y=Ǹ/{5{ FGr8%rut`^|0QvSrzW>t^M3;\˽ujRpsBnmiAJhGN&@;tMM∝Mt q10~yLdSNhH_&C6ޔ[֥}u)~t_z{vۗ;BogF!<[ P]Zww{UUIb"~QA=[BoYۂ֦j`&HƖm-ju9UfUm)wCfa}lKm镕EGOa+Ln2ԡ f?8[~s]9<T_<~Aulg`#?w<PJTafT:2CSՙG?ȇDlG)JًZj+DZLı(SNޛM=MfSׄ+}%KN Yqf0 p"A,4,JU\u5@UBٵ4VPPUƱ6IvQGԕ4]Lt )c]ijH+*L\܀{ жIֳE?:LY¯Q3{M1 R|P찺CD=vxG;|#fmک^A]fY~ nH,L|4_P-Peϸ7d-ʺ]D_dTN"R>_XTKx.ei~WdtqY U <o:U ʑm ;(v"ĢTȻPm3#n)gmw{wbp'&χ2~Q ^hL{^6*v_ܟt |ƥFZNqW$iiㄏ?k 45yAttchB5k gӷ )o{`Zҙw' A ㊊Ѿ/x(_9_foz;I1-.=(WtEReny3ot׵]oc4MT mA86HcMiAE]\]V)xr*O 7RNi?dsvvP0嗳Ĕ,O1=G_ф JctoG3S ނ]{?9}?!s|guzn$$3{1u{!L+ٝVGY0 #:%H\ TVڔ"�J/ym, W>~buuuT}c$t}X$Emhnfv=ꮁ2HT[c(lVirh{.KJͪ5Umɾ_ q%O5!4Yu6ruH<SOZzgPGXPWMl Ь:ntCZPkXOwMYW!%ѶGzB'إvۛՆb3!DU+Kf.`9HQgR7ZrST|z~tgӍ%5//@%Q*E ?7/eؿ<ۨlBNIX9~c>\CZlM[,C./L./r SrpdwwWJHHG~rcީOc!u7zIiI6AM1PO:.4:_kFt cֶa͜Zgg-8["]M{]17'KRbWUwft} 6sk}$%M KJяo[6Vac%sMd=Y3@mƜFD-z.eSٖE+ؐtwtPmcTV;*!BTg5>ݖZ8},cJW#=ʼn:4^??L_x pX $#1N^ |Nה+ åtB)Jbj:^Hw9tK-ab(Ned; ;l~X1p~p/-wDPXD<Idx= Y5`VwjU ܌&q8 ԋK :4rӓH^[vWbZ[itRvԲdxB/u&n*;+Kt; &#UXYdQY?'<9s篶 P] n[Ʃ~Ӈ&(<Q8&阮Ա#ۤ$j"ڛnđ4jMźA`u? TVIgYhMS[V,nSh%Li~Q%}7 ZzN+ǒH ̻_'S4EIwkbR,T7e*ug8Q=ۮڏBg;0_Dǎ3FaqRđ؛288YLC}j. Yw7 r_=x&?_'y(t≿0g/N1#@d;4rZcS34Hq>mh=Y/Ew.W{ qvMbwW|"% ˢKEr4y ߻nj]5�yWܸ^w Kxպkq{-q$o ;gq[Vo 1g(fpϯ -l+&yn]6IH7d EU54lTJ.Շ9/mVrm`Up ͶCT5gFO㩞)I=4Ls}ES_G3 L{hq٫<,ڴ(&\xYYr!c!'FI T!p/RAVw|GeҚj Yy{Hw0  ԶU?nIc R[R%P ݚΪPTtu8 h<edtaɎ Zf VDXYk“jȽr+R'BD͌32$&)l}ҾdnK'4,Pz"=i*6I[ٷ0k3`Dզڲ~=*>ҾBuNZѵ~Tk I Qۥʏto='U[ R9ҏi&N:sQD;qgTg_g 1Ir0Lz_<g}_EXⅴB /WC RQ21{WYQ,m#J'8x_ruہYO!'FB~\mR1p'U/>Fя8=ߢR@E4 Y;+Cc_kꤕ'6uH3S!<kgVo-gp, |\obr $Wo*1gv2}Y#|n_cr(t{n_mIݕY"8~]LMn+-TV7'3B{~Krh*9Wk M$@geqKؖ!GvD4M 84B? WLR֗IqPYBH}D:?={'>.&_3[3Giu7Wt`e2~ޡyyeZ ;)&j~⳯{"NQ8Wg*^6Гh#{*GQՓt *Sa LWFYq,qNxtmNȖۧv7w.)WEY䁮2^q/H h.^�&Z7FP-ނ,2%*)bgJ~l~d= a[vuy'9r.&rq<+"|NbN[ۮ4)ܙ?ɔÕ%|;A7ƨF )̙gm:jBOLhv1J֝bj8W/W`5�� �IDATqt#R$&5Bt_^4[B{dݰ=Y*,/Cף6w]sFOtQI~%hOP#ˮK"v s#j}j४N-wK8woN.{L8T,EV-[ ^,h䅝J6qvx<YixԪp$X@26q{NRy zó1$] !b;!湤`\asc MX['@ W˻KvKoޯ*k}?sͻ&P,ʛxaoޗwrÅV8x\l[ehqk;#FM,1=kB˜]ֻh񡑒w7̟|1&nb" R!ʛ LB]7g~?Qt`n7+P*mN<(귳{ׁLhTiuFN쪪_{bxl)Qi^)&E:BM bJ۾ 8)Di_{T-K#|4C\^(,"s>A͐xBWӒ\3nWs3^ [Z9]�ئ~I- 7*]yѤ QLnRYi'$aFIAN0 Z9K!c@'\f_ψ_٨F}?#|A,A>3Bwn 6uTEaRJjBfQy4 #vSa;'9Vh[.B@SGal ™ jf69)fO6pF(i)#p& w"`'{e]Jwg|=CI2R Jw~1ei5n</"" P<|r2Û8=؞)(i{F^"TI-iVZxN{gFg.@|k7W=h/�s!FA r׳eRnR{(i˻9ILIIotidP]6ъB2؝y1VC| vYK]!PN=PJt6E)-^w.܋SgbW&m`S(&:G~i^E\<&<7ܳ$o_J߅=V׿o< ?[�ۜ .W4pοŵ?fB$.LpSزqyPp rQ`qD y%?Y㧐̮RvGIX]:2 -z9_>;E!ș9s@R`z0s(1t2~ʐ@49-G8JQV';O>9["0#?E~S]xLѵҪe%G=?iQ.yBm\&y r؞ѣVx0K�F.8UR}UƯ u"Q%4!@:1F5D*<=7v~HY[0 }Uc趖 KL 5 M)*pA5�*/\DH=gD@)T%n*ßh *-Ⱥ\B!S NK0@o"ROyЬ69\:.⣅[ %�Dh [�0wsx=} T�ye (Dw4@뙛VmkrTSz,a@c;T(7*He(O!UPo>xS(с$s%eZj{K٠=ʹ80y%?ǣ{$)eӤcƴ' A#uhƒ7Tk@ih6HT@ Z�B.~I<&Δ@n\  6jP \yͪuUdsP{C o 1%~{p H:|i;mqWPnmOq}}KSkK@|4>_ _D+kbkv&Y68 hҴ<BqE:Vꂘ$\F~Vg}-"&^i€7㣗3`r|Mr#]X9_L<yJy &z &JdlVXQ7މ.Nz)ϩ,d3](Պ [3G(ݵb4z*[죓sD/qToRvͳ!T t5EiF~:_}O^B^ZU UeT:@\J+.[ h YԤ2x)@~<ueU7@*ڹ*`[: JS�t.f(glb.,G@s`j۠PM{AA ŪP%0�b Bk[Ug^r<R@#Oe[ozh]1lA Să#ŤBO!"rҮ#y횩`�сbݒکX ac qpP( E5H>S|4t_y_Д(@,"EVk#ʩ&CE[#"nJQ>Q-TFf `ϤK #ő/N=6NF%؀d!7ۢශ`  liAKhS)�!B�ĥwA\ .<PS嶸k si2;ģA$sQ{{ [ka_4ou&}-[;堮A񎮈_1d:T>etc<U*5UbrVĆ>Z_u+ޓ+۠)6l]Eg_jG^[pcY[8}PHp<8=Uc-�-q>33?AgS@G)ȢJc[|�μ7_qB:S,+@VCR:#r>\HO 3:YKFPgLJ ]R*(| z v S (URpmo h_+TٱH.��bHK!�AcPOFMbͣ ] Y(D]m j 3H8ݎr*kXR#Gl8\PS}d} Bj D~--~66$?սl…@-c4SN۽p:H�t ?#<=H":�BkTX56A�`陆O+`קQxRd@s _l)i.SpWJ?Y;spmjF+x40H#%2?L&T i2B,ϓr|\"9y4V Rs"#66ւXN�-ȶJC9.dh̔΅̽̓+;TM\tp"]M+{xſkC[2ݡu߽*qxЪh_nG{j뷤L"Q}z.غMc: n؍ː)%oy q{Uȍ-N?+(Eb岛@ٿp!W#J% iYj<%'ޱ Yȯ1H5y,pLmWiLbH}&t ;[҇@En }sFDzophX3g#L~c>Xprm/+KL\T>#ԐT n|wqwǕS#b2͗m.gXFhe[I'EBvEF:kHHO {.ADlQ uI[#�6)"*E-\�7X2E`A؆jh6nr7�@h�A6L%(<`oFۈ_J2a1`6:] >Ӊ]JNQuALP؆+ hN[h!-~ ua2;\@r[oqgMK (q_@TP<#Tõ6wJW(uܺ#ZQ@Lx<"[!5\S:Hƪ0A l[! jVB#IrџՀ..{t5XǤT؞՚rkfj/&z}^OmJJ/W$gPwz4 B+5Pʂ&b:db��5M~RR\W45h^kG8}^60: T{ͭym\O^j NZ<[w];~^{~KCtYo^An>5;[8캪W\`]uӵi^BF3I/)We{j?e{mB3@o`U0u^l/A{Đk|1OMLb8Z?װwBU�>t4'3h˕cF,Y$&�>ItK5p&]擣dEܬ ?XCs'YLP 5SJ2΁IIY͜]' d85 #Z|'9]N03(~d2njIZt]mi5TIH 'P�Ufix@Ewk mjjG O\&UDFF?He;B\:!j6!D:&aS.$?8pl=IPT/j-2uYh +%tap ۜ)6EJ"h ٭7x 8\ǂ5EPIuI&Ф^XJ%ċ*5l@H%mshDQM6 @.79xcMϥ266�ͣ3\;L* HIBa٩=5�1v-G'tv&$g -�N$z4&G3`O =_q[J!EHJk8U=e_(`A`)|!2lzhM1M49(iF>8Sa%#[Wc "rR] {9ږ=G6:4}\'HgZWXfWg֟%i|HZLoS+GhMՓ3�_[bZ܃e:l"?1nvYF2O+"Kc28u (ϳyEp|w"Q(OcUr8^O>)s�FQ\iA~F0۪$-|hr O&v"aLi1 o.&k(.8ی<X sX=(F0JhU$97�˜)\GV7!*1bFiyUZ1p4x�p�gܿĂSxL6J0 ) B<%: �UG ->v\*zC4 s�+tBFxvŀ5bOt%d-)X}@6ep86~p['b} %ļs 껫)IrXxbE�ӾcD`AG2w: RYZ6n@ 10>Қ_z;x$ =UQҏ\:°\;wjZj:7az z#{Mޓ2CIXgѣz}J|).ƞ9>^|@g4]Ωկ-8id2-c .<4\G6/nho~*`P2h@�m_}JhR |y/wZ h=},#֟@wC> y0 lvҙ|Ѻ|_n\KyvM-0L3LGBWѷg:o^ 8yf"1!1o=+O5hxU E:,>XSsճՅB8s2=*FDAYLE–e [Sb WuYWlv\g*L)IJ\֣Qy;dg#glRI30fٜ.ϠTx=36Ūۦ=CS~bd%Cx9 l�GgF, ٍw(jj /^ @AYSt/A678b)Pa+v׶i $r5�xX߄Pd> 5f3p{a9Gpg+|qǴVɀZU[-PxkMo` 5�gHNY0V6G/?Gv@E-mMEm?#�, sӠ4:ёJ{<WP�iJ`ԈRDgi_cpz[:kү@:.ETt81O# !E4N0X!+H( E[jT0}zЯQ*h1e _pn�&=r_YL:$y%AY#,cl�mmCb4+r}:XK1u'.BCt,Hpq 44\ϙAtvǻ n ܬ 7իƝ? ?M3:7o z༵T?@pw ttMI f1@"_LOpSMiKrCD`f�@(n)͔Ԅ{\piNY9țaDJr21`sDܣj#zR Mل<]Sqt1~RdSwpQoef<-,%y{5b|6q&oGlhϳM{4ΨbwtŒ<V!0yrpvn.3;:,e :S|9%&tR`yU\($tة@&ؠ`.cAS؎̟ASHp&1יr4YlrIi 8I @@$q4{UڪǴ |4dG|%ڮ X6(\YPLx&FWbhy^c]fPq2w@Rŀn > D HGH%Si[|{G.RmWD 4y "P:r5$k)aq1WIGvіI!2+nƢ˧naRpM( QVXjrg~n&F 2u?&*YfgxF__) JuckXLYx6X& &OɰqvX-lC]KvTav PQ<h L! C TNHA@hzC"zOt�Pԧvӈ!X h^ u޺v$PzWɯ[늣н~~>Hïi;dӽ}exܲ2)]oK 7wTjxe ~7Xo�-7]P$"~ ]o޼rzqioMZX]:SȢdX$w8(IjGoASZKghUb1 VDNBo< dT$Е(C ߐi״k/Ȇv[+oF?!Cՙ FkVD (�� �IDATA%$iRC:EK3H -0˶&#V|MFYT=?0/"1N@fx,hسZ@SRPӰ#(O@,n*4Rid+|ѐJ:.ym -HX -0殒�@XhAou#F._=,Y `)V� ͮ qDt;_Gtcd. !C(^HG@- 0(|SQ c 2*Y/:5෰т QmC}� 3B8q=1D2*$nI\Y‡bK2QF4Uh9t""FbI5Y8+0ҿFK]Am ԃP<tރC>ڢ. 8YF2/S<ڳrŬGs&)ܣ<vJݥutUEaqOݗDsP>W] :BֆOY�ZB`wgkD >jA8ō!@� hmhťuۘvм:<nh{BpD7Ժif,'3mejMp']2y3QYM㾃zδsG㗷*qqT -<jdfO~c@u)@7Vex .S!ݓ GA#bUŧZQ+$]FOhdQ.e7L�<^#EMB(EyNMR{}jv,0i;Bip#w4cޑTg#L2k-dDJ2ӧZ8PT&i<;ĈN %s<ſ[ϸU:Dlrh'd*G9<O4geKKd"xHqwZH{ۊ[rR;na:u%S/Ki*讥# :5VMi`,X?uU ~o ><(lB+ۼGYQyQSm F–r 7˸zI*DF5ͦ'X.Q1 "D$8i^?F;-YU ( *A=i@u7NzH/2뫏RIT2o NQEQ?f 92[;uJ1s zl=륁FalEƥM6?oOd<H �2sIW?QwmguՇ:6ha p� _݅�Ku�o4k lEJD.ʧ'Tuv@f͸90o5י.q+ nt\Q~fEğ'df::ítu߷W e2Z»q]+$i|]mL7SKt.\W >Dи�5U:m׭K@# @l Y>'.PP^E_UMu<:pd)}`+ 9+lx+7;," #؞WL@A~QO9' @̠8J "sxщ5sѶ9:4KBmu4 9K0Q'{O3Cё29˩>N&j$=@*,pRȩBI>HHyg} 2$OR*b;ԩaUO] %] Z`)Fc#Mա -euR#jп4(wBm;貊B !hC| 54ksBPLs||:S"�kC <ZB�#- z-i!ҧh mnS 2T>Plߓ:xFt�u_EuN@rwt_dU냧p8W�+&^c!"hϠgIFlfţLg}bA̅勵;0hᓬD9RNI>ꓟ0HQk,EdV(^z^"|�lIs!c M jmD m`OQH[BV5ąJ~5:-mL}h�s-n:wb`<ҝʛo~sw뤷z;,޼eq7:$ɊMFiߍ;2:7km1v\7@p5jx N9?V\7ú)z5:ꋗGmR-"pA!*z -0P"C5i fޘd U};|V�;FGZkE#T#1xV8a7Ơ8s#+M'ІO4F~ԃ'f!#gг('/X^Qʥzi 3=p`㥗e_2̢SH TOtI?'/ڔiAn:9qr�K-@gqiPJvtpw 8d lq@G% U6`kli+a`Z4 âdG]JNST_ϼ9:}L*Z@B 3u\kx!>8<m!$`D سX|j':_B]8 0Mjp[&$5<�Ǜ詰n�ՆfCl % j"d*ҁ! q-l68꺳//sMfLhl}"#`va&,,0t5q [7#rEp<q+,Xz&~ҥE� ~=m5;aq$ '\fHjS)@6:m(S UB�t!жiTھ�.2C)@Nrj5ez^ g{dK ;7wt7W7﬜kn~@2;˻7_k;Jz_;B0Wv풗?{l Ύj "5B 6EZxT\6y4��ٱsDk-$ٯ˿GT7 1tSYؖeS9I mb{R[c K Ož"*KULRV^8i,XX^PR0R~.bӓrc,tu>ɰ�,;iZu;$jQ=1ؤHNIn&X*Mey*Z,82UdHJV ECԡ)M!; L1DSoQkJ xu % <4ED#[@8Zc@)`O(Fj:&JBO>IWx8=r@ Z@�}ᡍ@(v�VD�DSlFEjTU>ҟca2X䀽ډ*k3g'"x` N(RG։TN@~T[OݞJCIQ9,k- xNyRt@v$OL 4rW_zPn{}WV9<М}Sԍ^0B|3()<bc:A85*+ȩ�'Z/נs6,MuYY ;*%Z{y E(lHH 2| (щ/dp ( p8h2�P|z- h 4xEla>k/}۟\ |77kk2.Iѿ7.Sk`Fp~!/)[]ok|i^;zĚ [6ܘ-[ڀVPt6-5OY_?Mba"*r]صAʕmyl^O+QKX/׷d -Y,x_ò܌"K칣`U!faXؤ(['\d ?N f έJS5UV)syw)j"m9<s f5ONv=42<&lz4aXds FSFH(K0"_ )Xmа<]kn݀N ) N8TxQ7k,9yR+/g#c`LRQ4(hC3g~TUBDF>suRXk"U^oMP(O�U(t%pՅ'Ĵgl:s8$SpB$JEiW`1gMX h@:UIaJ@(# ސW{6 6ߪQNVRt`ѭS! YmX!jt n0B4|KJ^aF1C`Ʈע⾡"\hhX8Br# @y{ޜ-YOf, e`/"rcH%C"yЇO."@imc^q7@,: --(`毦[--|u^*yr<W;`\Ÿ`_&;ln$n<ntܼ۟-u\Wfx,AݪTn\ƻ^hokѵx[' [כtDԂhv!2r(O |*(6}9B7/6" X79�d2>C_# i fJ#SI2A>[+<&Yr+,#/Č:GCo8`?(ddRLZFN r0!ɭ켨F!dd.8YOBV.Sd١ʡ$FeH6 އ =‹�RAT8؅#:¥xsWEhFPi ZSüv$ i!J,; L+B#li,tOB b}d,-�="xؕmxAÁ+#jЊǩ kb/p_as=xk^�:dJy.-?ϴw[<@  k^ sHơF8iHUXa'F&:%̴Bٺ @N噋W4ə502Pie=Wȕ'k j6OaE?eؽS.|{8kM~Tײs3{p0)[ke&ǕBϠXj2/僳tEtf6y@01 i +NP } hMtnAvT7HQWvD P^o]A!غ=&ѵƮOR]o�~MsnYp7ڜ kp�>E 6?t}ߗi {EH.+[2Y_5﷼攙*@ 1G6j*xVE T9BU-ϡPu[ǏA,Ab,JBvF͵x^ophQ/kg1Tޒ .HGLE33MF$d ?Z(R˘$Fnekhi 3Vz1d>"Y`BJ/0<9oA|<>J؟}k??)WoQBҚsZlWcGyW0F$$ڇnŜ(s@E  .ZB)" :΀fGM_Ft=pI@Y] <5櫳,ԹoՈ!@,ARX�ė3BXS#n 0ء( 1HЙ$?&`w"=p �`Jv6 5n�:U~y]sga8*K1؄@` -oMGe]M+ceX= c5y kgdUA,$"[]L͓Z=MEb' 4srF޳CEbp<0NTv2df %R$񓤘~pnKoGys7&yf!sҹqA[Ha guEMozuM P?oH ~Ғ![v9m5Y}&MO49?bM+0 z] boq^ "kf!kz=ҭʚ.2]m $}ɖΪ='a?$O)3@_M[<@Lt3y< bZb͚Y+yn\ \P3H؆Fqp^ɁJMD_㆞MŸuI17gFNKxW|uƼwkؑ?^?7\[̯x/I#e_oNg`gb"#R|lrpOZ be2b|LHA/>Ưl#;і=&6}.4j>ъ3MXZFغ~{ZQ80O 5uOF~N%zVh rExDGzs HR\Z:gQ26!B HtDߥRyY8L$/px0QDX>N* kc3a@ ] Ϡ),\ˆ=4u ( UFa =u 1y2>8EX[<*?هœN-{QB}!?=Qg`-yĤ;�1//!qm~HwA0O @ XKJ�Y)gp[ R;M6d*(4gS h%БO0 :!D,"6f="j-iDhNkp<PՐm|/@4mQ�0IB:z]#S= K"onDg`(h@ 1%#U<cXh҃CL=f0oj87<1ƹ47:r@Z[HM570QWp- m-Ydi9wxg4[޴1 MLMrSb]]�Z6L|N\7.w:}\gzrק*׋KRj.0h-抙lzbSR7,?3/n~i>K/Vi yyd/&_Jb{4gtWBD@|�"eUp6=oB - >J*$DU ;mTJa<K&B!9KpmE$8YW|;K-"gp+:όBNo.>16~z (:OIiVŅ<=/]N@zz?ީ}i� ^#Èx|˷yޑC!ľ-Sh` GчU%4 L̬i�@Ku�ZKwitƟ\زI`?3*�!4 3kEnK/lPzw SpOg!"(W{?z^{Dw40qLkhMVB҄ t2&w=.;6j!B׉(#)M=ц�: �8ྤ]R{<̰v6;rK%JZ=+r`hPCs9|y;Rvj?v JF�9?/^9 ;zs�k +96w=?bdd,AVOǃ 2GH(QtD0YbMႵ<~O|᪉ Ӫie]s2t!h@ZS#w9.Gd�� �IDATwy&9T^*�oW\@5.w<E_9pc3O0z^X\+n fN*^^س]GEo&JP[*ž?)"7J ذ]<A0òVj@=F%m[Mn{̨{H,D PĦ]dA_UQBy? Yq."r`eI|`XgKnbu\H^rpܯ|?Or ɠ@Hq_!ݓ]x&{ ze._+;�<|/TݥCc LiGW L*$TT XU{!@ x�VQ TjiW( }ARʿ2��vw1||``? e0` w^Ghs0Q0AX+(L2xWءpв uv<)Bp>4NG`|lD;u^KH/PāǠTDB6=^:w)ܦ|TaRdH"!"Y!{^>itRXV_R ~1,`]VBR{GIC;NBU9d=?<(2t`?h펍xdwΓN|7 ˸Y~ܕ@Ɇu7z"0itJ=_!8K`͊<Aj^}5y<>}S?ƛ8Ե~o]jT*)ݯ_Lk~|գ?|wwC 7gx\_dKnsf=u_Yby-/i .Xu[@Nv%6E<ԧn 'n >9Z \z=UmĎ%%($BVut-H%'G~OlK!#y!G7IK pŹn? >:ΑkJd4F_o}>|Ώdw<@\GℜtuHӴ+E*;266Cy#u#K`^ޤ\-cK')lD1D0/Zb!VᅭuVI@&ih<P{6u= XﮟjC9-H9J.2m*A�<xXQEJ+_v䖄F(@-$g/'�-ɉ:&(}*{[\'5w+l!-D M" qA2PMuq6FQ' c8IEun06Qo r\*0"P!(J !dv0<u�'"{XpBЋ.^df"Dn>c( ]C9YE?+C9.l$_@KiZ�4M!).-Cceqc;Vs$_ WQܯx uZkՅܶݸ6A{<Mi5Ac[@ˠ`hLx㠀>K|y1v.B) #͕:WAx7^8z? }U/OFMFȿQ]X\K[ImTqEvaV<Ho\M">ZYsoeGpTX5`O_mۚ<52AԳ&ھ- nZf Dć :qgư߱` (B0o;ji|xPT1琜­i<?:Wsc_tux4޲Vɝ̝;)knzX`ERo&UE#S}Lx!^a_ E愯U;%K9ԲOna@VM�ɇ⑁ǭJHsQ*D9P.J4,,s`�@�Z=nQ֢T 0MUDmn @e�D=6)2PX*\pi@)hJNRnMBT,T,A*-Y3R!;\YXh_y"nI*HSԿbH6@L/7(q2eESI p@| VmmL\%ETeJm(Qu;<tr?Lq0sQ$=rrcc&^짪+ ]Q PWV lՂmbm4膻-v38T�m₂c`x-o{:7zNwf3`吙XgV]< 3v16;3f@)ܐ;]EF[MJ}z 7~Auh]`V8f Յ<xQohLv6QnC>"L(V~t[Y^® l0}k"� vO|яvJ%-/ )w!4e8�(~za}etVmWd :W j:+BG %f.y8Gs橉Qrk0>O`pq:Mp;Z;iIi璬hܕ99Rn0V´8"sb�>(U+m`iK?w ji3PI*6}<" v 9q럒e F(RGsEw?ږ�In,@M<<$_ǬiN[nC LftPltm@Va˫*K3T7B �-DVP{QK9z :QL TH4"Vpt< ZdJI1@J흴kSE`;u8 5w5e$˃ŜH6tT C3T.-Th9iCG:%/(2zHK \ ԘcVZ,6)nߎGЃW#HЅ6UDwL"ۆM O8K9  u?d>E'83=8̶iX?k>l͘B "0PFe ,s\ܝc7Ų w ~op~d>_hm~kUrޏ3/D f˸ l�v^X?Y?{ו?%$up=l QIDuJ 'v"�Xx[: 6Z(&ڃ W� �!"eCӑ Xr89Hk %ƳrPLf?,$t<o1^2^ ^NWs BJ,h<ܢ/&I[JqdrR&J;V �`މ0W!>G<Mxۢ {d[_J,}^ J#H{DeN+Lxq Sh]-@,Ѥ <ȸV2a5|b�X2!gq`&^R%|K9:ձU_dRqT 0/, LH4@n �Z pDˋĞzk) V(Y"DM )pмl"\YH*`VȀr('B 1- VT9jU~ARU.<잠 ,<e!xZF _kJ%ҫllC3gX<J.UP*+.6} Y" @f�E�x>w=>2�\OƮnsN�ͩϤ79f22Oe)4۽QQzKZB(o]7ޞ-[q�Fxo/V84ϧ֏8&%uS|Rt# QSbbXb1}7&&:D��i2|X֔UC`xrTb1P-@G"P}/Dzj {&MU$ P㓶~aͺ;8=QJ|!W?;PHndisG赙{nnF.Yι]c)W?ۍ^�0E'z%6:wQM4?/J(]n…E/^1zr r�\/V0%lf 5]@ 㒰z#lmk`D�]#=Rc:H[gASf;MLe.)e$q`>17J"Mm0)KzFb0C&h')\ %snxSoQ. *P �hR0[ä⑁Y*8ć Jl,H W9P@BF(kܡ]:GJ`jِ=<v`Fl.A/pУ%5"!7ȧt2z#WF<ZFg R�&Y>= �;Tut>;} 8V-ē<%dO.n ӲLqYl[S!SY <yz?žζIN~?çb^5'V pcoဃpʓ@н*#9*v񷂷<Go[oX*E7 jhr`Mm.f7+d!ra-Xp=0@4Ka2PQ -iPDBSB#F�bnv)Y%%;T)BP /`�8q;V>`Y�F'<61D'ONO?}t|G s__ܹ2tPf|<­x`dRg/r:u{:g V)0tpVc.84 )K~ MCpn,OX٬cQ>n>Z ßHkDgԨmR=ԠlhR& 6) [d}"L,ciyx/*(qPګ*%D5PoQL|� D9QIP6 @D7e0$1JٖdX0n�m^P �;߮h/Ķ!J%k` l£ 4B%,&w<Q Ia5èB*Dr>E[bv lI}gU7PS!o�򫤟٠BXid`+Q6YgM ϩ5hBW ÓIQu`ѫܪ _MbhVi.KG�, 5^8+TxP<xY D�Ys�`KLLgpbz<X fB^A&p5l Jyp+&iK7/W7:F"~H])uJ?U\UW ap8l#&Z)�7_Wߕ&"HM&lф "\nM¬b 4l+ǦX#8тH/mP@&4ǝ]j 4JVXiXRT2HYp+wFl'w/ -,o{kOg=vC!5eTF:?P"ňHHN*)J撀0 PS*H|BcMx zT,MQ؇Kb삗Dzʰd$># UyēNUt:h-0~׍4O-IϪ6~/&T!F@s�kxgy܅ء J &}bWV^Q@<=.ο�oM tuT$w�v6�3zȟcZ! }dU0 M|I4hp`=.MMsCaR$JnR|G6\=Bb#Amiڽ"siI .uT*,D~zE}|$YЕɂ0Ue>'!@BDrU}@@ v@;Eb40^~~$G˘7?;؝iGCZjEJ"""E% 5ўNB<`[ۼuj4M{/' ܉O3_O2c+kak qtBc¤7ҿGZ{<+Իn;ڿv~-;'].]MUT7grv`" 6�JΌ�g/.P8%h5 ]s߃xN5y lp(nBB8)S6Jj}L {8kb>cv(JY*ByzaDFGFN.AoLs{Dc_ `oN Hd?%'yuxqA+}YJv L}ke�#Ok;$ >v 4F#~'H㶓 NZ/ )- I*$ȽG&lB-D$-%h"Z .5O *hՀ2I8UoV`R1] �kNV&5KG/KVt jJ[ RN uK=(#]w%>`@|. U293Tg⑆I!)G9``ɪ$cAEj娟:Z-ƽ@�GV<ۇܥNA {'rҧ`/峱(`z*BbH HRmۛ" 'dABrj9nħi>$bxj e=LV؊{5(x�|c-_�ml Kw|ϔ"D2^zZ/tSPo\ݹE5w=(g.R!Bhϲ['71Uq&&П~3ߌ_ܧ>k*Yq{)@7q0w* pfMU+32ʁ%5T&~Ś' -<>oA*l֑HPeqjDήR57'<H,A>xRX}*3B�eK 9I?xfNshiI2\YG(,/%`FKgsFwC Ԩ?]7`ӿ-c1r`+EЄ|Y|0,}LZg<{gwΰ]ZrL߯պ=IY5rS4mC=*yBXq1TDq/B v ;MQWA3"oz}F1 m $ypm|hiY`–ڥeA$#cAQjMڐ@08Y+A'yƿm2Ϻ xQAU ;C(Zm2 *FQg!@!i8,Y@Kُ*ԕ{`Q"HbHzK" Rsc(jcN.>R2'�jAnW}McTU*(S~_1 bC L&66kSb!F`mȿWѓWz$ՁN^x*+L l u wwzk5͏ Аoy�ɡ܇Ke�DN0lyhĪc+/�/P qI:NW"nZfS+&~;xpA}qE^,'oR!^_]Ĕ~ V:z+ܟ|,&w',4#`ѻww+Q2_]W|"h7C�3>HbQOxX!C�m('T+QtBaPC-P@DA߃ݎKŚ"9gw�� �IDAT V#?0^wkaJi?y<>_\?9%тn ivxE D> RDFjhQ/qs~d�sNaH0X {aiY<?CT㨝tZEm/]ϐ_yJ{C]&%6dO;kAJ?H4ez/yQ5)5;ɻĔq'v@ BQnͭ7-ivoq�T(B2X[(УWLY^@ó)� #a�Jˁ 7}LDHhgB�Thp[Ѧ`�UhS!XQ`YȨBA Xi[6jD{^-7EbfjD3`q Mǔ2Umj"4$y5!RI NMSs Ĥۦ8\:,W_#R@Cw!&X /]5k DT󹤙ԶQڬJl(1څZsՔͶJ%_cwFBOG`e){ l\4/T'W) Dq ƹ\hs.7qtt?R1k kҟtmL.|?5�}Wn/[ES@�V;Ȏٶux}r6q PDsANl<�ĈLm@�Z 4q |O{%"sfP2}�' DpvY\k#Vvs\޹E߼m-sPKqXHƹ^/ӹycpx/NH_L&k#j% 4Zma?1j~QkK ] ְ?QK QT%| p{0R*0#'UݓP)섛Ґ 4 ";DX/#*SR"�gtx,}u8Mh[PK,f ڈ�aJy{όAqnJ8b z3|LsD\`�T{/k57)� m)mU<nCDMTP*!M?QJtCP%Ai&5Z(ІC!ŞUUnhk3+C=jwKUD$%`^jWh`>`? Boh>i Utc]`OXoWOzvYZQLJ,怨{"0\Ƞ/>,b(hI%U@JL։'_-?h ?5r roC 7m:M=ן{oqWiN$F7TO-\sK^d7eJOةGPڛ�v-?ˆǙ#<':B�Az&!EjU c"<8[<sab 5ɩNzxi۸B(z44L("H1gޚ.~0>;_NPG<wa!]KNj'i_͓P�4m`Zsuec$UNm԰ˋOӓw?PS|15ȓ\8/L8‹ gW޷ߒx܅iuTѐZ" (C+JEuڦ nJRB0K<*uRЙPBaU0"P1'Rk4Ht�BFs?]-Q٘snNzpsPkBR$Z(D`r!>lw U )�TCi!h+QL"k .&48oæ !]Tf |,dáJ"ޭsjR];Q�#L`&sѦCDZG"vZHH("܏yE)[^$Rt%gO^DZ 1CaOOa*fmO1 oi:"m`�L偩ד|4gvfb\tB,& ŌtMdu͛5<SF1LÕ ^33 0~$OEpמv}3Klq{Ĕ%J6 Щ5{hhL]&3V=m/\\y|֬j|Qm lg5m�>': @<� 1RaIqqN:QF O4@Y75P> ] mװ$ʠ|}i/ӹ²,iBñ)x|4쟍aurxoKECi<\N@|,?%AzHhRGA3f,#<r,ɹr)Vp.çnc~x C_bk;؆ƧDG}J` ;\uRZѹs/aqd9e�Ԅ.]aR)ӂJtZ\>MqNߏYot8Ր <6ɮ%,Yp9$M<=dgRc* %,^B,)[ Qo!k6!5 oD; - e:ES<",o<A=02:)M(hr;a(4TN<O/ WSr7B!TBY 6<ҥ6YEHTOl N*٥OАde>*$NNS{mpMXp^KY3Mq\� >#, suu_; jŕkr[-3;ǵ|>qI]7?_}3P^Ə9ٸ\gu/!|KTT>8c)…-_HȨ1Y'ZJ-*@s` Q3PC>&h䲅!dB |DAC-J[ M8M }"X4{3Ay!:Ɛ:$o W?5ǯH_-䎒z'9BϾ[駅|R2t1H2%4sb(1hI5,wZaF�!0.CD94dvb}]KP- %3^mHD`0! JavmS'ji A!l.(ѰAe^X& hhRnw!m%EP eI&Ǔ?_aƐ-H~~,ϓw{xBG_M=Z fB6y��6xOmA<ႳO8QJ9Zs�斈,=Ti yDK$mR jǴ b&_N\'AMpJ]GU#r4q(F/.uXۉc{ žb]kk.ai"֯~2U2h?t^NS26Ё Zj@j�|W }up(̅@CL.c@ye[iiEB4TWiL9=3k'ƌ۳Ml58dM3E{Dgվau# ~sqs]phR $bތ%¿0#ngqx"OnKmFMJ AB ! UHWhSmD$k?n t8m (=�(@_cw'ִ<DWcNb!uF)|xPڃ~R<x7h4GNf8Ұi|4S$USItR*c{lD?g{E [Qaa(V _ �K邏)9%T9Q֞SwO 0�@^6 Iĭ.HnEF43ORn-u-R 2y/HY93dLR7}*[Uu^*lE!?^%i}- L4=6i`D!6+ zqD  xF0HOm$&O@O灖]?~,?.h MKYiN{nVwc - [TƾBc㺀fDg!a &(=`;(4=!v2p[G@#[ }>S ~)`p ARTiS5 qp,/ݬ G12֎mEC*`>?=i E9h \R~yT9=T `)聣XM@#�\%BpJYA ̘` *c€h(~EX2hb <6i=7bp:D!t !E>9Uѐ.]J?,ף< oe 0nbsݦ:$}9 ʾ9^U=Yp񘟐 î؃[<>! D#P (J1q]X�/P;!`;4 -!?0xIn%"t2m,<|kt.g[ӟ by=yCnUwpvrKϧa:eR c܁qc䂩!Y[/[˿ŬZ<ӥ?,QsHVxNvK_R:_}ȧ,6h)M܌wSېuT? VXk=eѹaYc9^;XD(X,~?m- 9c8|4<m6˟G XC0 Cbe ?Ωz{y9εhVq�ptq]BC^Ǿ7٠xH0)6Ga@Q~-"�8p)@ ؠTM�"0PMiCVڹ#WR;&(tA5m>caj7QgX3Qϵ))�U]gFuP\2O0</[? 0m40>U\m|@JJ8Uu;P`P|`dH$278^x@j 'ɠ]E=3)Y&)?i IƇi4 YZ nC\B?;dqյ2{mhAK d}z{1L7P&C<{%Mj#3Dg_MB|0Ҳ!9pviHo�Uyp"TP E&(CϹPZ_V=|A5E`Ip#AhB MԨhs:\Hrb-_*ҰL%gg?-soB{5(5tqvEaff?wK/ OiSb�}5hjeJݷ>Ce!-9`擥\g}36r̘ѫ(͡6\8$Eo<>uWi BJ q~͒?ǃW|hn~9e( 8wzC`N]apgǝg+ԟkG)4ְU,~yVÏ@;(uup{b+1P tF̴*EJ"Gp&aB2C4mX;5�r Q+n`FHKր:1{ocs+8JzKPQ�2E 0pzG< Y&4b k!�hqER$6_  7@V> _ 2TΓ DJwIiйhKNf<h!!l6HF>HR&"3q wDڃľGx.yGꪃ�P*Ln \}IpS<f9m%nu/LD$&︫c|6iصOiBbǙ#@} ZFLV^gZ5S8(w>�6|j dz,J>6q?a>m{ZqPa?ށ 4� ZnSSP"#0!O�c+Re< (-) W\Gό@Qa Pdק3tf_()o]nW\Pus&}E{Ù|xwfͫ%KK(6o$9OzPϪM:,y- ҳE_jc?LiNXyJ|�: ,*#;"}j?yGHR<˗z~`-b'dioxRh8{ !ij^[-䆧Q-BV ˸=i{_M+v `K�pȭuGXG#r^ F+�Ӏx[8K9pE<0mcP\',̓ͣ_ %j3O0,'V/a|cHm=K--bsǤ-چ|am`/J]l gxT#;^JX,Ɛ~6vi<0O<^w7Q4|mpk :�8&g8a@*0 dtZ^"AQy�͡QBڨmэ@RS: jD<ws$O*qu>MDok%ȝ1\q)^h8SO¢O{fx׹IW<@&H.8&&]]C-rK6]f?98EyFx /"o40x"S߸:0(GA;QWa"#{P tMT�JB*a O A ڌ)A@Bd+RSo^ӅC-ᨗq0۪ Bn[PiK_\/\E5Hs~y*]/R)Ruqt^G޿R:J^ڶf1;|t+wzPPƱ>FJDVe7x-1p�lCl)7eQ$E&QHՎX#]lI9d'naIXA8a''tr V揓3|[}ҁVJLEwU@ЏuRqJPqۄT #Bjk�]8?l#=4!p!B xC"+pBB0#f8Pmu.rp �KۄtbJ?xĜ=;<&j#~ [!\ \o&mtTZfECͮ#E_(2KOJ< 86JpI"w USH_^)$`ՄTzvTsE6y �G!Fmg>@y_c3wp=z#}S''xdؙܘ5 O}gIό v'ܓMߜx%R67> {lN4J'e:{Bc0N>B�Q6�AM0?;D&HJqAʞ'SRx_a5MpP`ˇ԰ޚ=| p`ukh|F.I9g|\ct袜^]'ճ4rh?Kjz:6(" b-yj.E_crI4n|{X +~J <B�RJכʑ&c4$!AA؆C%\~ n|P�H8Z1J&{M7y|'/?퇅R^Vy?@Y�� �IDATo ^SzYo~t{ܾDvOmmb~s` IT 8D[_vhݺp| @z3~dJgKГBz|mQ0_�p<TmVhv`NlG)W%<rW=@jp@^3#~<dȡﴫx�L}%""HY@ C"75Go/8(A4f;h~9.s)k:`x!/[ p^ .,d3= Չ}g~|,U+ˠ:%q.{:j P`@GlQլ>wڰh~ޯC6BP�?w_?B5 n=5{S@{Ag#u;ci?L6U >v`HFZZ0M̿TXafUPRҺ)Oa*8Axd{O�z*ul{ }TՎ^ RBԴqo^ϡtҜFN E(p{n/V_S\EWggO1w\\貜[9 >z,jj`pZh􍻔^0Et+t|1'VoWl3<H5=mmw sXEe&%Y'�<*`OD %:p;P5��!S!n&z;/pc eǧnaQsj@ypAsj.,6O}}e8ٽbk8{(qs+W? Xa�<LRhQ 5 Ofkh o5!Cq-O3n]`؁K p"N lW56`W#­i3P aE8[�C&S$ʓ\n�RVim2 ms[SF -r`r �{ ʂ&w셔U\{Y",SHWt�5 KjOrEɱ-h# 7Kwϊ7GW9~krn2ho/nUE.|\ 䪐 kNB?;Z[Pnr)�j#協n8vCX|.=;PiJ0#q8>@q@At�(K#K!_>+XuCc P(Ś%Q` %txAϟm|ј_!s2?WqY{bx~4\ I^O;1lEcr=lA@!u‚L ujQ]h:kšڹ%̭_v X?i:TϷ0VJg=�zBOH=LylT$B`F1j| jH@Xlri|NlK(U-+}բGJz ;PC{ wLM>uOrݕeFYYVBK9 tIX &.PзCBuz cDTC^y5:0`K!�}@EA5lWI:w�bKIw a&LТYd}~C4{E@&6= 6 V: ,$%+bє KN{ۉ*KHS�>4l( pg; fl:P `Lx`T@ .>w"8|0olM Da xvf^ژI˼]tMZ]m;88פЙ߄Nw A7# ǏzxۏFd ׭WbjƇ(#ȇN<.Gt9Y1= f݄g }!^@BX`9ޅ0�9~]G)ŜF 57}lBAK@Srh J0!6S뤏y\1PY ݓjw9ϻw̶;;.+]Rͼ9+Etf: ctS̕Scm=(\ ͵U*\-^;`,T4^rLz|J/'/hY0ԛbF:!M,[m4*)֘5!hv*8Ytp@ZKR?m'40o$&֨e]~hLGN*w :/ỦCP րd*Wi3,&tvSLP!Z~/"cl�6w P.S@ V�̇CEHpKU:r=]#vHP`2E/š T8[@X (0I#�Km@C85z*+[ CAQ86�Qžbi:9) 4,gi Jy{}-v?o?>"V`�Ij*|&4,ÄCOgy$*/3θ {M0JG-(zQۤMa?I!^\Tz# M%OF�7N5; rSwez}3hȗ>HcMՆ.™Xp!&A;x[τY؜#p�E @3QZ%&�`uJį9R~ )6_%mr'$+DsM(AQ J щ ,g+CYη9t?3r6lVz2OW(�m G,zwia0�n}/~r2<+ K2/Q8j (^]`@ ]:'=hmbVΘJAB ^%h.3B0}\i?lRPG`(yT)n4 n5R!tmOjQ$}#'Q#P|  +o8bI۪qBŧƜ6D^!ޯ}I L⭝jTMzQH#Ԅ܎d"#j,XV/w=#ӅPcj&|z 5!}85*.u6bx\q4Ǟ. AUU*Vdb;뀉nԀm5Ѹv4�شu ̔8#>1e% A^2aPK34*x:S8'f!:A"&\':46b@EHvU@yPVKpR6XaQ�QGhbPh>^] S:X:Xb1)~Bg0s#khueM޴˹}n9$&W9wZw${I3˒]δI79D5z^`!\͕_RG#r :ufN BzpTz\ؒ.zJTkX@ILD7�E 1 űJ�b.[&`MQ!HKyhmyEޟ([m&glM_hͷ'.60C)wFK-\FfU~.mھ=S-J,M`{KRi i.avҤ}&sz-lOixrL՜Vyn1GidI.ۿ`|c\ݥO J@ |4 EP^鞣Rz FIrW=z_7ZimKJ"Vz,sGtX}oHWuϱy& D$O%p w}f[K�$Ė#Ge\@*Ɵ|Y{!4BhC&T8J8ԊDED1Q@^PK\D,D-7cSZS&U'iP\kQlkڎu5ֱ9o2{x<%OӏH+ƒ c x&R #03Oup=kg�쑮 =Ģ{=752G}* 9#w^\u7t=V6`y~~ <q7($ɗt MBo6yaqC+qqFgL"w莖u`8IT{ȃ:\6v)HpMwQWTC(h&@2x��"=)�q^ݾ'  Co Fhf7Ϟ_SBzH#EۜQ5d78O \Q]iaP}[ `﷊3ݵW$s 4E1oF!ֱ֩65ExYĈWUw4q]iV>Ȩ]]eſ}_No[:U?&}udDPi `Av+0 S"atV 0eX xV|H$2dNm� fiu~rN[Bjl4Xb!8U`[ [oByc:w"E��W#R.D�{CEEG'!#@1TK H_&D=If7^AQ� e V-́GgTf[ Iޅ(BjP!)PSb� {Rmޅ(@"J#AJ Ǡ4K]E@ἰ%E�;4s$<5.3`[ޕ/ m}DF 2f_ c4x+&!lF[qy=Iw+'|z/$)47ic6|Dofky7u<xg ~ Q7м&sF]'.ĤgV�/û2,Pٸ*.qxpkc$3Յ*i vSA^DI=  Pnq Ap`MKY>)۷(0Ҽ: д 6RC"n?=R_N Vygq1ov\ٟE:<m `KMZ6F)|ufr9-Wv\Wj8n78:`%W_ypa*)-W0}sQj ӢvILX~?T6gX5K=P x6O U IPXۇ@dWmJHZ(s w<f C<]-Ò; D<L+VQ[lf�jI5\e[�v x6|5ueV%(qxPOc yfBbQ@ b ׈_�>U8"\@P.w89}[.1,�9pk+mz4zD$v&2K}[,u,^R`BH!b8шOh"%!Bp�ҋF5O[-2ػ"g, ˱�&\+nÇ[FgƤ)jrfҎ;t`{3a:->UxMU-v';uo�fr6|H}>* Dv%?28Yĝ ]ȾOs+>i0>eL:pycSQPYvCX=TEHzIi_|(1}�*B857 ݶK͖'Qu(0@:+ۑAB`18ȓ>0*?oDWJk)VW/zC@9&yj }oJo Vef%š.$g}[(mbGZ#~Qyrc̯oy;{OZgvwRd,f8TbG|y<O~6;o?)\HT]迕WJ?R`/nK )$kVYJ Ң6 *Ƴ׍ؗR6gQ(X҃\QVWĮlnýRiWM8채P>l:�(!&}V] ҄~.pg,3gn (N l qY .ǟπ OEuĞmKQ0GjF,i $d!T@]SvvS; 6ȗ`Q&\j6(� F̰e'ml(/ {Ta."xH WACBXC $[PM*R~akƚ#굇,[.+22k̴nvO &E4Os'π{ĤsIѵN9>8zpa;7 ?;= U>:\<A4nʅMdqi*%ez0ɥ<=E\7Z}J="� D�EZԇcFz[2{8}Cxb%jI[h;La)!wx}h ,7NA]ؖ5{GrF6^6,|=4DIzYlߡGU*'q{Vh):};k8v5*wſi2niR"K\ƊOqmwVWzQRlw<Po{v(22WfF?7w =m5?@wJˋвl0(~bvXiKw 49QfaP)Pz}SЌRM (zkw k#NKgjq;X+ Pv>HX9/Tx�Z�J})iTXݼ�2NFh#@n X5RpQU@$-ب!ڦdA@Y; 5`@Ʊ]P(' f!$�qeϪ!&I'1ش.hWUSxG0 ܃Fw'L_mڮ$ipwdBg^N֐En]5|R�pܰva,qpv�Ū@;T1Jo�W+q5sǂ``'=.J2f <?l ~Ô3Apc?SEw' ~q=> \;i*w$?6 FְHR!G'z%B0Ohpp&Rׇ(<q\iBQ! 4jRS*`) msPS̔^G `0A:5lueSY!+`m&M{ؽP,`m![;/g|r-VX%/Y~0SsBq8CNid ws7]p"{rbћ#ת0i>ogW4 |QϨ9۸6'=TrU|{.7TޯP!ɕfd.wq%A bX~P܎-( Sʼn_kF@9I Igks�ۂT!E0 V:ѧH8&0`lj%TPP_*b5rCuD" `SgC*<a R5G . ċ/yf!#v[Ϧ^plQ;0A|T�*}Tmi%㯤Ex�l!B{sk&$ZUa:`$dx(! Ѓ`;n }v"Z٤dVB}R0�ArP.� wW8m}i<3c g)�Q�)^"!IƕN\wQj4qQS 84zlO)d$Sʿ鯤ox<+”Rku^ #8yV>i~Q<鋜8_ePG@#`" E h(LA43+J%] z 쉰!`*i�� �IDATtk6H†Gl W]Dɸ7 ڔob_- B^/Ny|.D=!Bu6-Ei[rT10,"QXhH:Ņ= rq*!~ou=P/X-J}&tߢs1 {=5-||ughi~6\XkjƅtcAcΜ;wb~_&&Ԃ'�*QL5y쵌ZgPۺg#V{h$[))65 .Abs}Z((_Zjnj H`&dpy^d=<G |cmި ԘcC# ` BXUkpP @0'Wb9aR pYCfXɫJ<@D I47`BTbז Y曭CC%$ |(;P)�` h9R@1'TLdz4߁�̃sP5LZ;,uHQK;!"gu#Bf~5->L%_OSڏi-8{"~ ?u1󢯎kq鐅+2v~}K2'KGxXTЏ^Q;`'>4�&8!vR>W!8U<PFfK2 /bHx`Ysh0AuNKj2XIRQ/9Gpӈt�Wn۴uAhֆ9ˌ2]l#7,aad8J{ a)ԉ?3r8lG}'I*ϱB_;`%Z=tXa%$2ϡswliBʤ6$[3;9&'?V9!GH۳jpVEtڗ[XHfxML"nh?{4ޞ{̌ כ %)1p" <h| T~ /~0w _z"6T>/S6pT3 p�YXM}dfeZV)`�F ~ Tbs=8v P-;E<g/(PM`xP!;V )8(/dQjB$vW:5` JHO 0(yDo 5GY$2:dD26P{}H=YPꀇ@@ǘ"GTK Xu#*r=ދ'ؓĝnoz]u}QsMmn"!p1 Qdm7?O`55ubCGڝxkcԄSD1 8N<&qjox6hz ᡒ@J`ePX@H= PJq.Ӏ lx(Td 4aW(7<@j5@k{kJOCT|N 4f+kW_Ym gp,[Yqyn4fCTldwRڼ}V'^2:E|YY-{3q1GK}Ji:.߻]ȧn*-z1,Dfq@lbqǕgy~Z"S!])%սmn{D͊hسt /G^d "q_@�~IX@1fPӍ]JuoIJJLR5$?${{j`)23q9{lho{phdcJX"n/n}ef J ybGv] VޗO#ku3)kާSo/ٚ8"I4ޏD-8*JB$}h?f:jI*wWf3LlECdToH'ZE1cQgg83)efaۋ\j$HׇnS8 I;N~;XS.8xhZJYQИ40uWdɪ mnԄNnk҈u3:ܸpP=kqI] 3Q,2miN]d0*[O*)z:6ZHkT)v:UBEf tԝc"Aa;d?*;I~vBgsқ2:Sϛg??g>4sU:GSHe;BÚ_;c~`N3%1ս8, ɰL}`l^l 6m3X;OXebyf}h$:A22go@ .yc5xNϜVo5bNO2SHH5 RhmP'5'X W[gU/7vjY[םƣx6 ^O/s䭇<o:Ѭjb%gV|欹#Ǘ^<v.JoHA7V< B#kL_9'[Blh}n^}%dk)qewy/f]ϸmxeS8׷ע)R]m3z狴$1P}\ƊFe<Y>6ӉģV܍?r[V:kbƒ0"0LיNJѶo*dUB=m]HvjƇnݖz3{;DoHĨl:aU}* A"LEvvPcOccE ԎQJ.w@'@&r+܊ g"&F|@ (DiG?om :I6uݪ< vz$ha4W逄'bsȠr KOi:=-1)vo >ki}a ؋0``Nge$I呀,?F'kF-ep ZFCۦ3{R8ʹ5(G494gDIΐiQ 5݇Lm:;t`#A!ɸ*bwd]\]LjN[!f<UXw>4\$^~˄be\/ӕ/d31#qǽiۍx}yAhڽGwU+?fyVW-+­W^];|r4~27<?տg3Z:\5>IH?Zk \?T;εzjp-;uxf"K2g&]g?FMWkͤ5o] x6cZ:3HF=5=E>Nv~]4 7l#6qGΔw}HVʤhjt}+:JuB@T[Ή7\ Ul%!guzN^c#J}NJvE!c݄:IU5B ё蛍9jؽ};!g|WG4X`*T2L5jeG#_n+ICyw7NqZA]0.y9K; 8v,Sq_:h;3cSB?1ߠOG$OzA2VsބE0{.G3upJ^4G2-q#eq^LB;Iŵ;@1=^I$7|smwAS`GըCrpI5!{F,.mu.nSq^XW8ʸ`'4f ~vFdW]o\^gW+ޙ zcaÕQJ:OVp6EtλMγn ouW ÃKW]ϻok1BkmmRTă_j3ݚ}G<NNp[x195iA:f|Γs} ^fL-ʰ*c'G~�b+t)U1vQp7 X}�ʉ{Y}D_HY`ITuQ+R\[Fjv ȉ p=ZHSlHx(!U\ۈjxwkTtan ~hJ,}QڙԙӅ`*UFdX;[at&ܒ?6jvŧ Gڇ^JEn{Ǖ퓀@PgE[ erJ !-NdǦ8$=-B!Km1^}pRqlƙ%$ s.K]% anXQxEf\/: _o: .˒eR뱩j )rThڞ(tڭ$N[D!Q}ĀʑdL&fK^v ^ D ]of{T.äa-~q]upc֭WL77-\\zNp?ŋUǕkե5o=y˼=y}'=Yp[*_|>yɓpWL_xxygcMFn] fb*ia@*_wc;1D:rtaԻwy:doqk~JGH3xG.xީݗɰo6ɀa_rCt,g+a{Ǵa܉6: MٍYMB9"azc]FIWB6e 9ROF4SiBY aAXgpK&aCGvդIPdM}>9Bm"ܛپv ^o;eJaA[* ՚\lF۷Ջl~ 2h0#AxnJpcqe;/tITTҬceBfg$x+T0e~$6P:Ă3;}\O?cS'3)_FpS(.,SK=|{ 5re҅iGgt9 (=Z%IR'֋pq(UENIH2$>"ɏ0)I!uc#7VrFDa}U "ڑl.:0`7xOÌƈV9Ef#&jXcˡ˿5\}ʁݒoO/m]U?<w޿pR۟ ?r|֫^|!O3[Jo/_ZҕVv@7{8[䫪FúS;JZ8c8*7^0:y`5ᯢ'K ̓w3_zo(gerFcmmNI.s]f>#qbwt(>cS5:`ǐ#֫r[3*UbTu+fN16ʆ*c v[@:}$a@5G4޼BYS]=dJ},մo3q bN}ډ4%btLDHW5Lɩ[j݌'c8q8L"�.O鲽$iq:bvG7j@v'nE_Qͱx0ٲN+�h#l-Nt)D/2Π Kn4Ź4_t_(<v$4:'iR//gwt+'].oP_,+\#Smt:mv9uZvyᔤnk~UIt/mb]fZWڌݥ"7改dγ`7 3nt䪤dCRfz#=I$%S;4kIϺs`X%x,p9_nZs!sɘW=:z .q2P/S\`*^&ꪸ6۫o4+ߏW^<߰8?zADʮ^(mJ:Àr@VOTCmao(̉8xWݪ\g!8rq^1vV}]dFdXbN%äN}0iFc3& ZA݀TiwPb1Q`}NǢίp:Bx#�C2BO+!JVlw !| fgsܮFW?(?n=07 >X^LKx;q-uqSC016 x[G}|6k9ƈ}OcOL_cO!B3 i.1"PK`\I czVGB» 8pLzŬzi1dħ|K.܃'Οe^۾`?Qm�y)@e̜-JyzxKkXICa-H :tq"#,h!w| /a)1- H&i %,02$>կnw� `D7rKM Mj9c"c=ɕo'ѭo0b?AtJw0ZmWV*KpC^n^i/we|Z]9^?^jo{!;.W/=sׯlhoNnyȇ( ڻDk.|7]*HeLX㰁IV-sW~1#̽n~B֩ԾUtb2Q8ɩv ׅ3ÖM:P LzKarr�}k.rj |8@(` TNdl*:dI:(LwݤT[6=CH.Y1{ܴI6'5z!\M-1Muos{sgU۝/V_H׃oQwe4'wMJAo&_;W[A OQ[ "vXwl DZrώ<!iCrfH }5\ DɝX-V9 O[Gbc+c\xBA?E)C&'H}!s1@K1o$?o*^W?^ЮsZ`Prћ -S9Ìy!AXd,K8p6{ahg0mmrms3ͽ2RM }3ȑpS! QWD G խ-8'}\Qq޺yxWs8߼o=bEz:.G/kFݟ[/Kw+o^]{2?{6ơrO.]ؙ|z{r3^t0n/Oȭ̟wMGW) Mr\'QuSSw$K79Rt!I$#SfŚsú^6eبP|.e[ŎQcmOκvjvT9 abDTHMb_%!2zBc=H&5q-H)g{~j}wSM.]֬E~fѺ*:vc5nM5-[:[8{z;gR%Xb]zSSlr-P<&`3GsF]:q'nw϶Xbca t*)@ av$m">Dt"5<N[cHcBt,)3?q] "~t__ E/KϩKZ}I~H/ϱ8<}[{KˌH:8%B-Y/}>Po8@=vh0OrLd$PgX ctk&IF2qmiv�� �IDATa6`jdf怲28jIc>:A oCA;J[%W7gొ[ʿՉzqkEYy;n#ߘ͘^~j<;tϿ}c&O?'ӎI]kvL)ƾGy5 6'vuyrȑDyG6u$&wԶ1[XYE6"m}j"Gy-2j5ź"W8N Q^u]guH!4cf ]'+ضr/F3a`s&kJ*ѽ}W7)~o\`KŦ0/p`n>?lvg߼t#^Z p'(PcmH2c#5`lJSiźMslQ63tG6";X9J̆lahmn\"3dh#"_ D8-5<E woz/1X%S"C!y牽Rv/HD5#?pJG*1Y:n>R-,krV# YsBr Y̴m;Ȳ|NӖInZRqG>kڤ>b@WmtCVObc_loE몤}$NÐ`ln޾?~cACsj:]3/Vre^.[k~)/fժ]ٹ}|ֹq`Օ[Vk~}:uq_sĞW4nЈ]﶐ȯ[c(̔;| ()R*q2~]8D4(%њx*(]c=ӭjf&E9HT&I6FĶmu8k*-VVȘĐ]1Z+!ۦ,#b)LjuF~n*T gvW4ٕ0xԫo\ېWF\ɋ75˟}'?V|/ǁ3#ȢfMRCw:/̈ JRGPN^ gPjƺ #?q#`pP8R 5:q`^dmR^rAӹ[MX ,e?~蠲a/AsC,%:N_ws #x݄>+/f li!_Zf8kMe.+ {,JN璧~ P$)B’4Dm49jGSxfol  i|Vh2-9C ~WՓy%X׍9z@Vc\og\f%O/s{5n`Ƹ6p +te<gr4~\x28 =1n!ntdP&TKs֤Nd|nԩB)`q*is+2Q"io~)PT6-rMPM$)M14$`0N5|l$NY hZ6DܦzD Lqr:XpUu[/X'h7"J# `Lu>we+g9\p"eo?hz޸u=o V]0vlߚ7jT]wWA=~=tob}S`_~K :4Pm�k&hLo;Z4&wD}>:s_@IS#JRS#/c 祼czy)\n9ZQv|v4ğMF&s/^xCυO'_ˤgo9ׅYQy!;?2;PW͵婪sISR$g889W1h!8y 1H"69i:43ܴm4r<�d}-v, >Ǐu  (.C IZfP]r+ 73f. xm]Lu`9L?1wzg^M>b>仇py|iJ<;{}n>q~k,=zfRJ7 u7Va;PWuR1}Ag+Q49[{]$R[b[ߏ$>ԅ7V sF  TD;Ȫ4ݢmfJb Nwڵ֟єYUlrkg@f"q.0.۵FI*k+ٗ?q Z첆 .@iee[O#xuСR{S4wc_|?SfKWjw]HI  q*QNj@R2m!b[7t u( q+N-w h&\ [c۴ݥ6Ϲ V�S+Nu{YrGkDTKGqNZ1Z|f,%ˍbɧr/>7?bJ/^H_77'D~1}V~>)),h穤h1^M*TV-ZT gO<� ȫ(*-8!$~7穬F.VGtd$P.b5 -NnC–pzidbƟ*&vNؐC徎;rOq0~yo.~vp'O]YAt|4.Juد&b=aʮbUՑzVxz ijq\bqՓ@#HJgp`۬@ b=a7#"7=T�\Pc$*'(nۈӾT~ځobJ.߯,.sk3؁1*T"47\RĆ ۦt]*ڇ.9ѻuF5~wWA>5v9׎okx;OGLA5"ހQXBjJq,dm-:\ט43 =}6t|$u?3}#OOyD,b?9uhb/ 1 uO ֋=yyزjfpo{÷{y~¡i!2;js!EE3jQHw<E8?)r5 Ƣ.-,A'J4h4K[ZGb 1̓ 2)2lF).9$d"D(#!dWƻ}85ѶxiSR󰎜o|g:POXހ*q"%\V'n{˂l6[9ŋufL̓UquFIy *DkWϩ]y6+VnԏwG34(16)Rcʆ6^Z_ #6immnL)IizR2Nr)(Ǩ Ʊul\T@BDH efrM$= L٧JUAcSpZtX)`(}#wUBֽIg|M*;k9bFD^ hCa_?ǣߙ V6.Vc%,xxy[f 9cV@l[ ;,ivtNR$|QY`FN`/nL}h$9DJӾ>k7!�N/W _f )/3mGF)r9Z4&mY2s}a^\8F7�Ji~v-y/  y$npO##m=C/enKK1]e5]{}@j1\# weDUK3N>ե re6}0Ɣ~kX=ؓ& -d{f]4I{ ]nwbv"_:˸wNw>^͞7X|9 pySxeO;Vmt15ʩz�fZ$uYo@R;=oJmE+ L$I I[K+WvFn{$KL }]"p@'#V-Ut11Enf،Dj&ɨs&#*tǨҊrBJ3SDd!Zsp(?mN<cAkUpVA'?8~yb'[4n[|ȡw?`T戩QPGơаmZ<G“B*%ؾNfPl50죜f|~EO+J),;!`T3v43(Sx\m8}Yf{dLh#J/76?Μr8XbeiNK2Թ?O%'(L6=rLp Ԃ8 ˞";O#TSpPKSۙdf▧" l18٦^EvmRy}z!eF/Rńa@ۦ$(2I2JJ31ɚzhuF ұs4;N[7cafRۡ+b%kKŚ9Wfz Џ&[tW`%X>wnY}kw ژJgc/ [烉ʹ{ڧMW.Htl6Th03u7wr2 PVN'דjN8^u^"7bIs4if,h<)3]l4:U *]20̩PQ"ԥ0>rG=GRE;jif zuY9 B*q l"LxoWc�Y.3Gt;A<yۯsb* ޶}ԧQ�|HH(FCH \qNȤSCi٘ɷ;UK%F)i\@'[&E+wbcE*L(gI32qyc%'*_G.''>ιvH [ؘ]%{l@Pv^;e?YڂnǸ?gagv#-ӝJyJ4m<lG^> h4)+bOmz;clKu(1jCxp" h 8G"/CFª7%Zf1i.5H/|}wWb\[VMd^n^r/;K4QGwl.ϢTNDc冚7r7sEU=}K69cm_Y6Cx:z^ ~=w}+i> tk䉤t*_DIS@ˇƢU L pNlN2W6[УJb^944X)i#X {QU]zD_ cJߋsNC}}VݿV8˻Wo0Sڜ摧sf+BJEchƋ6%m(u o_z.@ `J4>юf5IsJt| t_(C8P >cT]Ϻb`Ry8 Ev԰d +? úS�^ N9j4oXyg7|jT-.S@s=Be-ĉǩJsdﵸGƂ Es4{K d 4)|m\_QJ}`&x TScz$-h$C<!3aUh:&zno6ǯ0vG<yea7:ڿ~5(!dEcǪo\g%+$Nvjaݴ$ɴ&xn`t /|1f᧺ Y}x?*#ikrI$*4b1f#P9�ܗ좷d:kU* "pZat[Io]u H`jFϣGICFc]!Z"Ś֢;|IK*EP=;ܸvSl~+<|3{KMހ5G-`mlav2 {޾h@*nt!GI"4R'hM[Ǵ럶G?^ΜЭTmNcMr@(b86'~-і'^eS/ oÝ<qO7Gۏ'9k?2;bPpHZzn <ϏD%-ryiy4[/Lu֋H$I'uB *E~KpXN3�OL*'(~l!Bys�*QQ`xRFiTI~0wLo@}sa~)X<y@m"F Lt(Ұ_qqFO r993 َ3>a8 uobD."W; 372s_j;~`W8¤Yl듆 q/lArΔ)=xȒN1Vba_ӱ{ДֽN< JG2U)DF}F0z_uP^SV<n_..7uTnxW6)Ck`lx Ia61NGXVRm@i m%x i%v"3\^;u3}rПtu MOj^>Z=sz̀NӋ ^*'ɒI31gp'˅54!{OIĎ._L>OJn nz)4:#uѵޱg-ː3,4ڭNּ̔Gm$lsdO[#=ťOA;9V2^(Mֶ`4IlPSS>-bȸ2Ci6yhX3±V9CHS:(ڝNعuX8}ĂFc> 5[nnV�- b]L{Ҍ  +ubIvf .UDzIʹ)yoZ5C(.  xI0E/|p0ۦm,.)pHATw("z wJޣ5)MVdgDj4{={?<"2$q=8|C%w{zEAhKXa։A/  8$pbNpD, �^pd +@^pdA d 6 76kg>E&WX1Q%hΈ]qtߔOp\Ӥ<Տϛ~ܽ<{9~:ԴX]_(' *o <c&`7hE�`hj\gT|چ؋5xG�l=+Cp 2W)f�IcA]j: ݰj[S9x4 [}czc�*7ÄC3N̬ͷt-&;yVŗpŰ2|z y#)!*p W [읫ð'ŽY'p@3N dQ4.r 'AUkGێXg<'̛BZTk"/@LU$׎"@5Мjuzad-d#p" 8n@u�� �IDATOoye�_�IsL<._a~ �|.o^5�aqE#viAZh�ܭs&؅KXAh,K*1Pze9oSgv}-sǜ8K#\ dM1QՀcw%2&Ըx.P_tQ\d(E�"+Qb W)7"[8 j {"<xvtZ8GCX[sg7_=j™~q+p$o͓$m6_@}5Yϐr cn\gOekn`n*2Ъs`P)]p+|y 9@ \dFr Gَ(Z) |w@i~pUG;O(5*~–4Kg6I9p6aӁQ})\C 춬0&}:K<LK"j-6&_6WI55VPs^`Kɂkϋ"d쓃b 1qH/oy{g,pd!h| kl!"YۯL5kH=aYr s`QC*c`@g@B-oISXʳ-uz:C}D,s)8^p-[TUrX08�9V?LI].X n}` �~aZxhsLIuNz, 4bU*9yX�ڜK<FZNe'xRu I<<;]բA:Gc$K=b\'<2>qd7s3$imY=O\|m{ǟ^O � ]1p&J܀p"+:f(u%5YjRň3j=jO� \tj혛Ft% UƇ!66ہ?d)!S!P+6+ijwmgzZ#hɈb6y렅V;?.xQ"o%hԵL,^vaoh&kVBpY4AC3N;I�+̩kr:}F�W>6LTb&yQpeL ML8gȀg@F\ YtPx#SWpK!sdndCn)5:"(<)oPm[ˎ 8;յԢn5R"+)h1ua=0 p nJmg5V98$K Z5rT1Hp(pE xjSI0Ϲ.< ( CIlԄZpPָy"Mr%Pc51`]cmLy 9PWeRO�H놻|qso7__7M7O#w1cм?)/"+0g{WX�Ϯftɡb Jk1XPr@$Avy^`nS* ?}-\Sam!A[n 4@C 3 d3mډGnrj܈3}^Qq{nDl[S[DPc0$ m](arop9@vnR-ɞ3"PՂ?SINnnMzJ6O'QF!rP 4F& nW]izdyG .�v<B@T~sGrk 8@AIW k98mR J !N  �V,j d �?K C kRB:8Iw 8~Fzz]=-V5�\�dDcRt>Kpv�Y ]�I|STX]c3w <Xso��DXjb=^X)p&p ,e0/*?.@2! r@xcG˲%Xr�8PkG�sj/H'{ BBbkqט@M3_ֿzmA &0+4Q OޅQ3<k +\K�5 L^ `�t!jPv[! z<xF `gaaJ]ѹ4i,!9ʢw͋ˆԮ(IO1&vaH~8>b+}@>*8H5^~ٹAOOyl8F^T!ם/1BuXg؇ٙp?em~ sJ!)fa #c(J` (>.5ZZ�/ZHeSWPJ4V P>X8"ARSh�xT`hq]k!]y e=* s Yx@ uԴE:Y1>o_ %Zc~zu.!p5pVjOga*qY!Pó,o(uckBU-$G3!V3ָ-<8Iaڭ 3ST1TWg �LHe Z o}i`.cho 8,X촹ώHn4£ *@6nP]X\~ñ_8j {| ,qJ`(8Ng?o |Jz7~Oq膮X4^=w'i .)|X }j܏CϐՄ..9w@.5Y�?VLģn*h1]nj%�Z+3)6(}b5)wi\L(e1o3)].Woi MZ횝>Wa3!lKncxA}&x:&(|BbPYg!1>%H` btV`.nB[H8�=H%Z$ᝳJd f"(ǭI/2%U9P4FPeA`^qغ^KJ@ &� SUw�k8#^,>wd.ȃW]~9e~ѪrFX77QʵWKZ+ "OKΜ >אpB7�R(b]ZŌl3k% f˙3&! r "ź֏¤d ^_2BTK3D!_sg p@s ^cno3qH\Q-.$ͩDj,GA@s 2)V>^ý?nLq7`@v".VgYk4XGJ\ᇀ+ ,j�ЅN]", uJȖ*^TZ3rpv@v2=kh{^!2 3PL|lzQB60@4rQ6?lԈd^hhU0 umU>2wX R*DL5- --l8&f{ȇ):[b#uYm?ʶQhpYJҳYA: Q,BI"TmB1�lN(+ ,(,S~Gw38OpW`-7,j3ko?8۵;ec E䉀Ef rna&2kVA.I^!A&"�4"SQ5Ҥ$?^T. -NPܠk0#IPB_kַ}ޏkN`I/s86~&XFmgKH ~| ӥ@/fB3 ce}[57q5;g[GbwDq߽~?ź<*'kWmep9BUxږ�%ک4B*d ^?b"9%OjEVE,"] 대W)@(b(x> e=уyn1M5mC41lh/NbP:*PWxk,aؒ6*s|b5FS0əOq{؁E6i)7ʑZ<R`蚡\�FɌډM dl!jB׊d>HIW\!k  kF8`dB:GEhOR@2h >{o5䕰A+a3qʀH2jʟ I>N'[.f X<-92Zh@7Nòj<)ɂnY!O:Cȁ4iLF?(KŒgW^y {F<f"KD�8H Su&k?tB'sP{?9׿ j48n)u0iVi| Of p[郣9"�_v hQ yy^ǸxuX^g$\B6D%8I(S\Km:<'e^6ʄT)3Њئ{PqԊP)ǢΕf 9+ld>^o`#@~9X=^#XQ,|p68@}9 |Y~JROm&Cjى% #N=I+!-VA;*!W"<0`r1_b`e,nn8xK>k$'HpzHo+2=ݚ۴Y(c"lU[>'IdU|&d Vy)߯ x\~#\ 4ëzF8Bv:`ùʞyU].Zs5)6B%u} w&f+BD4plJGA5ckR%g joϛ+<뷒ٽUw7ez8Oy6+^E $ G[<<?Ǐmw\ 4KJv`$Oի'5kr35wxݖs;wK!dN:LhS/Jh_`%*�Z=6VvWh7}z% <4,ɳ!ye0+U oQQ[3MGtffovl׼XȽSڧ)DĂ-ޖӊnɑMS*?M41D˸6>;kݾmǤK �\"!g\τV?� RQH JuV2s@aQYO"[gRǑ$<$ P ٬D!d#Rcb#14ӿ:Ip?,yAUȀ1ܩsVH FY Fp(QK!p< R\( ~ݦ҄xԳDA쪮]}ϞUӓ"3$?-;7&wn}.˱/S\>{=�1!1ُwG\#}D+o1|J4pi0I0V7L\c|f]oW?s'X.<KJy1}`31L`2T9dCC|0/5tUnx2Y@6F v d^my{\6.U>Ԫ~ufdne᪱6Mib0_Qpxvz'p,l<!ӟY [gwcWwvd!sKn × k-EVgxgӴVSy䞲cZ 8:5Tx. He%]Yv_,%R0B-*`ň"+JznY!ՠyn\ 0h%k(R Xgxl̏/h<Z t=qUrCdt-$JT3Ⱥ]G`;zg[IV5xzwq׎^sk؛ޜ%o'͏[w}~}$~~?)R?gfyinj$!4:!q'e\f~o A+pXĦaI%�JaM\~p~ӏ˴߁H0 ePNe~H !]_;�=0.MĿ DmVw wp<\p7<՞-LkĶQOQBy2|jqp|;~,@x]`僰�=$ J?u}#mz_h7�JvB3":c?{j:B'`py;   iZ-~~Jg竳O[{@#BdKh�G9J֢*Wi#y& I]3=77q-~ 8Pd�1h+~ s;}~ـ~#9Q6 KVhp=~gO^ Տ˿{_xc-g` XSއO5!n D2Sb9\%WHuhۂ6w +ph4㭓YLJZ?mϽN k Pȝ,P8xnA{'rI�ƤTq!="D;bourK(_@OQ,$r dm̶,hJ% #|È[#qhzC`@֡< tݖ9:.%ȣAdR1Ɇ!B3By2nY -!* P.+|?63@{M(؂xܶ)S9Π-iy4X%W�ق;kmˊR#1k H+E(PV9МG ~{no@ͨ^]ٟr;G/ܫ= '3<ٽnWgǷX;r-3{1nKN XgpٻOLd 1Skּ&0Zd,+Z̄^XI_td-^6 C tX%ުy]P"0�> E Ʈ:FZ*ZmT4ZF6cӋSaa8 .x:.�$kB [HymZ2~4AEگ BF j"dr!!I Πsy2~>[,hڃX%aN e~+i8@fLx" Tw6T243 ʔc @* )5WfsYWgb.-s}AgR PЊ3 M* i%_%2\B7+pH ɰx>;gw-؛P^sg'kp/׾>o>=&Kno%I]k)7]?\%~w~fk�{]wV5Ǐ^p!wQ_J{%8ϐ�F` 8r5+bg]4 JYgL !T z m VF<M2X?, FV 6Ԓ$yE?i Y(?ԋ Նkiw []l ft1l_1MҺ#"m-hO;&@3gl(vd#?cH$@ ֋:MGwX_C|#)GvExJ5@Z! z nc! щ=-eA:8*!CVu[? P;qjj@+#\hoj$[))9)I*c�,fi}mBu w+<��kd*Ҋ,= !? jgX̿oٳoxG+�� �IDAT<{#q-g7?YM~^'nn^A[ɏoׯ@rݬX]3?o+ X YDׄ5MͱN3 +-NNa�bg媀+h<^2zk^gu{A2K(\! GҚAh$�y;9`4/+.aj0y +GA/ڇBVT˺_AT}z$jڵ9^,Ku_ZpEcOĶ?67snn%N0ˢE^{j4wn\E4WL PO$")e$i�"՜'s WI3/W7( ok4j?*$m{ifЭpGwjd @dO^vB6 xZ�?`$Aܜ){*ҊM4 \ HEY2!:;AVeLy�Cݺo}ϒD{~y~򛿼^ut47@}u_^hv7/o7/7?c͑;U⹨4u: \N@P*qGP �=,\<Գ24,52 @wz|jBMLKY{sV<*0oT.!]*7V"9YD<VCz1Hjg ^=z :.a~D`j@d+azp)$1sFs'$A&H }a]m1^ZW%9X�INJ{A t;k@06TEh ΃ɥ e4AU< rT9[z7\ ĸ+ !\\}? Oo-!UdɻH@gaW(}FQ:׬]UCT|�f~S]$>Rc#aВ[ "]ka! �๫/ pTZԷg=_jMW?o$mj<[OonWwgXK_//]gM 7ݮYzQ-2Y4j.�*+RX^p Do:m֠y;V0m"] >KTg XH/uw5AB"h 2&»SfB=5 6Ae}L2[]L<Yb솠(KxyGsU%1cج'z;77�0\CT+ t8'_f+qQ"G9c#Ml#F%uwՄI/"ydS hb d%Jt0 ϑIJdp64a'ey Ie6 <j\Bx[V>T$ X� kqx, %<[ YRf !c(J]@/ Hu�бt5\Lѩ* +V3@G}1 $kR1螫Ao}ϴWrMQC43j~y?]}u^s?hIk~@52\J h8~~KW'7aH$U pYQNNjȖ\8CVD.` k $JC E@Mj3rʗoQF*$Rl|,Bpo잟=k |Fvv PRN.\o'! }AlW&`g-p >),텬=<u9`"z E&H.GB|Oa,HY+QiL3ΧKj*5w2  A@ug iZ;x*OV)k e+g+S<۹ $aV D7˚otQv;R;\,c޾[nd"� JhȵI"(Hkd P޺e"*vu4Lq̼sxĜ!Rx^Ĕv/(qj�f?ESQCُ p  yy|'?u\XT>-B*CMsdA xHTAzIdk .x@ HH@BBiHggЄkݴ�zׅ[% XokQA܃�8* gB¨+D�L^)O#)yDǐxKTO 1Ze, PjH1]vdPV٢*f pӟ?|%f%rKDbS*~ УIygR/ReeJ3Ҧ{NcsV`ATw�h{ColE#WJv󼵯RV4r! S^dȷ5*%|�K` K!R+hm2t˜PbIV(V�,R A!?Ui0�+kH( vj1:FVuy TYX&Ҩ$]O�*SZ|e01 n5 PG/F&fw-j<DGp2Ny̯Dҩ~;tx4}oQ2Tw<Se1z#o|ͮc[1V=&h� ѺAb|,[;wbG^̹y4uط3f 0q_֚i / d˪P)҆} Pd= )aJmJkH+ҦPmN. :i=PX JXiSڌ B3M@]?׮}γjPoP8UdmH>ccTR+P*U?p Zg,TŸ PXRN~…QR;{w']O ʛ&0 ăD0$|Uܠ^W;"ߚc"郯͎ zKb{jWrfg0'tu'eM ekh&)RrXVmgzԆME^nB^to)('ll]V=YEdX V6K\]% ] YE>BUk[ .%d9̸*Pqt_dv԰ w{ҿZ9#,Q*'*Qt!fhdpx_14jEDyNw [E76moz{=zHQՖXWvN'wvGGywHizG'<4Y؉ڄ<[v|Om Ep un\jftJ#J  !JSZ5;X8"(=,: R;UXmJkH/oMQBF#Kar*p<%]CrxM-mϙj- @M1tJT̲y׊,( ~)v00>R>ǐ61C3gPMGҢXz ƻȿUw|7vY}X'TC~ӪqMOgF ~5n"rŒP"&.o7VqQN;jRb6@FUPhbL@GcljTw㲯C5ݝ>;Pe$AՆӾX6-��(G`HCUꛡFH}eݽZ/>ˆHЦ˯4(5&1Q _nz, Q+ rPX $E7zT7FN$\/i՗ھa%엃 &ˉmgzj+!GWiBػU:*4&p'Za#ļQ J˝*>6awGW:GWZ)|"U&`8ږz^ @P!E_H@4_t} )۬@SU E0n#H4h�q>X_]AR);rP+ќ ֝FHvVETT ۞Qݣ7Aܞ� ]]`ԡb{ucJ;'Z:]h{s}`+1M,ldGm2&qUnDkq"2٪15gC\6y{'6i)Jm, 4`.Ee=Ų uHHRuWc; Pt S ,beٔ <v3t]ұᒒ%i5ۘrNѤ}i҆p՘$H6.bP;Ȯm\JEWŷhB]Wmu!"ߪ/["e1o;1>2xKm/8ȚD zȂ8˨jkj>B�uT(Uvv+hgc:L]9%VD:U`XRl} #0+A#T31 AV9h[XRU=CZ.ʎSW$YB> ̷be=RaI}_ , >܁ɷ*jvUHHRvf7BV[y}`Aqq@$UYɑhW2׀~UBTj7Y$o1wѐHhQ_`'oKsiE0 A9ݲ $1Hh r -}[}2~q_hmL}{-,uEpq? ;t!|۶LkJmO1:Ke}EbD!k5&[ZR}Zn ?`Q H3 KZՖ 1}syvG^. yQ{=W36bknTZ?p^&xO1uAJIhsQD5ڜk㕔)NJ#!/bAփО\FvvAN+eҝ>?-hLW,rH+\z,Pjԕ2FSXŔiI㡧^]ԅfG+UmQmu<4RQ}OB NkHDDy G-5jExvb@oz@ `IUݾHw86DPܰ;V>?_m==`j3JaU4h}RK"g|tZ@JVQ**6{e2'm$-| iSНOuY)_3D?׆osu9 f;-@S9[a:B36 nX""{kww"n*-{=kdwwGb*N頽4^*(Aw�0hWݮ&x*yN ު?\ߠAӱx"'jOtT).tP#F&&<}L)a l?2V4vBG>ij2#c\i -ﺌ$p<BB�wqt�[#{jxZ͠ĮtԐ��)MЧ>-ƨbVFMޣAwzb=γa^Dm8j� @FL:GFj"ȕma^>TžshbNmS%&U +d)^r=9 .naߎt߃8}[TL.5 *#ahZUoOXۂA U!7#S\wvO4퐆1MVHv5S530h_[8LRd}T J$_TWC&sm`HvyWlz.�]ށq0ޓ]j5r�e1F}6Bcu(c?WJ)C `vAVly}p]5dzʹTcڜYfd(RHq? iZLr϶Lm}az!dQԹ]?晣@E}khUhCyG`hC%6eݶ95}\4_B)h'udA)J{76ʴKm)Qg52g Ĩ<#;e a76XmpXË0w[V۟S5vvS=]wALw90v3Hz^4_.zKvj減OjMέ軞q Ri/LlЇSP4sYCP@?304e^(!ŲIǢFld#Ëe�vh;OYjMFk;;vUE0ln!{|Fݴy+vC=tUV{|x2mu?LGS�FP #lJoe'ЊlTjlԡ,o/GXJ9M8Sjn312] x j0ѯ"Cg9V[Ґ+Aw1Nj[`~Q'VAi#cvhlsk"{zkFd9g�UТc0dXoRGpJ\w׈~(1Ԉ;6˶̊)P5Fv̴x3M Dhf&Pî4'Uv EMNl1|z92~f$ig2T(`(.dwA;<{Ǻ{<f=pdãpa;rl#Ϊ 1UM 0veͯ0DǮ =V ŨQ7}]N0!t2!f>CPjHUi|G.\k[dh0hq m/<5mk�aom*zCE9@ H\ZƼw1H[Ճx6EQf#rupMX-G+FGGSݵQめ n-.gNmB}֓晡ޱFE",sͣve?dn/M631Rl [}-¶XoYwHYOh@;{FLZGNq}:R�81Q  fzab [+bߎ^tVﴎEѹW]_07ĩ]Ghƀ`mTDDmpa scGhl&n ҝ 6Q/IP}A3 ]^U{E#|,c%ҳ 솚w:PVEe7[} hǝ9דo8ߨ< V;c/y0,{ۆ;ڨ3PjzƻT[Sv_LIXŮ"[wc˘T™͊hy'hmu}D(~D) të٥n$ͣFSĖJ=eAFyÊ'`Y[wUyw<ڲ`DJemc}I.yt0w1Ҏ:m<~%4N*._sv?<"W7CmkA@@K]ޱ\ՉCLoB=\ͨ>BiԹF K'Pt9t[ȷQ~F{3AC& 6V|j3$@"vE3mIMM=eb* a]O,uZp�ڔ6xzZrڋh\z B,H'PCph^Mi&w ƞ^0^eBChqDVWgqa7#IjgTNc"iﺸ6A�-Q8yLu!VMOFDQ7lhsb m,X{>ީۄ%8mz.EdUF#]:h+&)^f1REՉk&�� �IDATDv`"?tȒd3-icW߯V/áF _y;^g_ejߩP/t~ m\lVU[*2 ׂ*yp9͈r߀YabCKyjv S*4ϥ0җ@3tEEGf074KɁ^u6  in~Q:M`h`ԖwBw;կ"$Nצ^~u5۫8UiLLTv#Kzm~Iegcc@GCm u>6Ǟ!aRGJawEDȄвf`=Ƒu. rj3<Mqj=UƇ,̔6Mi nrϚcVT7Zl Aؑ "^^[8jj%S{W /a_뫭_sk^D}]E݀ԨfaDWnz<;�mvO ͆ű0 6:G -Xfڪc¦7 L^vݘQ ?><�Yja4=C,IˢibSs7#vc  R6vsdm:n!m ĶJQ\qgt2Y%Ô_SA y:`\Y-CC/+65$Шz T*P5M- O 1;<ڴw)#GQۍUL#IBH,dm#oQ}mGۇ>v X(DU6ש^:>J #S%mӭ!i7l >jm5bo7\;/Wu{�G-3uqgᛵ23X # 1{L#q^d_1PT"|5͸EP h&E=H/ϵw6a2'қ`ç[zp2Trp Liy2ޛƬ%j =Yu`@cX*m< 7t830KMͺȇ:Et/,7Nę=|zRuޖs6L R-ɕbPm /`&BgGґ%ܦ!缅{RU俤Ù_x#r4�v� 3Kt3b~GŎ]̠B=tjAoa0e4kM2yv`6h7VNR NmߧTB1!�׋T/" rnmer' Ɖk{Y{Rv{%5)lxuy<vNcxܣ4oٛa=0;ع~4OvV} :}~OgTb x'oW-Q`%ۯȪ^#n8`H"r:LlʣUf9wVdO8} + zR-;T=ϻ(LI݇&Q͡=~eY"$vaʧՖ)$u`ηgݙnV4oud[j5ƈ�..H9@|Cl[)m8%FtQKc1/1+Տs"ֽ}jkUC# F,m,и8As L쒳~޾y%r0SkwߘwɚVNXV�EDn@o:?޾9G艴FnǗB"x^~e2E՚Yk&+tb݉w}3coeS~J$G. K|ĺDKM`vFuQf[ trn.UFw)_x:^^@LTr-")v.xɮ_ήBz!j eu evPYĢf[pO~pA >]nY7qṣvح01%d riWZL)�7(4}PuK aPc<ud YvDP]nCЛ,` l,jkVG@=BXL#.OyCZN\Bؕ�L<K&@!0]8Fz`\O.@ o\7J˺x#p?-u] ]EzU{;G6}1ya*q6 G+y ea`V7sU$Pfߨe@jQJX T> +.`�dƧ],c}z| 1lj( @�Q9ȥC<oٛٮ3@┖VΩ$ !d|oӽ"{ytwp@\%=?59'd9,8*QfC|=ۿ$\}0L E9ue&+D?6d^͔ͪB Px*,;~S~P#rĜ=$fp -( حiĐc0?)W=0x L9q.,ˠ!xsum8q�}GpK4ƤQCĻ#CRU1EYҶ4Pv󎲠 9Q4i,)$J \+<T4T+-}"7k񃊷h]^0Du;5)rXGA8�\Q'U3z̞r!㶯3 r^IVU.2A{ep\yC�p$.v$7hl0ĮPG[jٵMB*?;R.:d,ւ?N¿۠VLj*UP闹Pf\ K'TR*cg. qΟΝ'-/BU$ t.]8 rj`P,z\Ø�B!FQ43,එ핷!ƴɠB, J{e_;|ﲝG?U]aPviz":knxF5F߇u4fN<8[_s } :$AU_ �C+WpZZzeO%c,ϟqb ήsjs=.2cdRV4,bϷ]'k,xyuKDq�;G+wm ^ ݲ,`uIkxw7\y4J:rVz~:I}MN�%786V0C"lJ᮫EjJ]CB?P媒-g .FeF柃u[xܣn 6 < }؋oH81D1<q[�ݶ'=Ner! ՂM 6g*5L!vЌUdX!t)uG!zuLhh8#32,h9:GJj%aNc8H+)KQ=4$Lv̸BQS_./ rk^nҜ(b>nuܺU3na0V~kt[ɬVЍq2ST;K,뚙Лeʡ6֗߯Us28F%+#DldK=7!rAzrXĩ'ChJ_b ?՞|;gHZtWwW$LPaC"m?fpױ<$GUWe <Ѵ ?x8:iMh/p1!Ӎ гX:91R\.`.tRhc1q-7%oͪaw](xF&Ҕ4Hk|yQOd*%+͵ZTUcAj@[4Г&k!X:t?j>}]m-V9]K@�[~uFJGw ݝ}p{Õ ~߶}v$KS"TY*ΥVNdd THsoS>:|VTJ)tS傽"g/C7jE*3A2&Z8ء b.?寝M;_nK.mNti霜Io$qk&?:#;& !=ݿ?ޟ :ww�wH8|rKX:wYݽ&hE5f0*!*џz)k En*2UK,xFl):sf(vp T!w$4)D- \| x3 /#ȏ3 ;׍i#9ד#lr]nѽeCX&w/-C �wOWugsBp cig<gR JZHu5!e C7DN}>ER9cEœ8͟ Y:? ҉Ao׈& {Iz:2SoB]5Da}I@4\X~ˬ1Pގ/p<i҅S_0ۗ`k>3GMzWp>#8W d[n @qyuKTz-1GN__ |Esgz s6,n,MTP3-]J�:,)R0뒋%|?IEg1?{rWlZSTK[)%ASL ^+;<>,l}JY|#$>XbQA!y+7r;T8ʠGP�5}> ~ٿ l+8Xr \qv8D'T̓g`8EV 4||bf]SD8(8g`p�S|~qt";ump?ď7?~t?60-p_ SoPlej9bs 29fRTyw>Öz[mn<;8]�&NHsfl8RO(A ]2�-,kZ񼳥霏=_ap"bN>6*wز^tRPIdOSB4g$Kexp�pfxx+{*rQopco),1u~ɋ Tv ,;!X)[%~Q>fatu{S;+u7aQ oT;^ebr qgLr[w{Q|; _ykn,K{L8%l 4 L ֓#Y_(ݻҁ䃸1G\A.?k^yR}'(|`gɥxywL5p0oy*^huZDaYՓonrp/�ѿT!b)D5V=95@ij[W%d(4k Q)ǩ\ 4~Bu"E0:5wϬ5l:nlo㉐/bHi1}_LqCv*ݎd]=ITLR/]z+8`2μEgZvȎ|:fՅHf!Sv^D(nt7RIFQ5q7?CAZ7cC;P\*VQz,OUHQ{ OYsox*afol2'<}N!Pts>]N'dz¹�"K.,_[\'qi,8`bXdqvߨBЬBؑ1d LH4S gHy<Q\{(1I,޺,G%e `HD\K[˵<J`]xEf4s:i;'?Xo H"E+>f'u 4P4u#G"!5q Tq@~'12qlc#V,f.館ҞYazp::e ߞ/ye >!ǝmd_=dsT %zAߔUTOgyWh> 6waL_(T_OI=twksc]lFX,*d܅>?Ǧ'sʔ%Qnt�W^:Ph"|c<J0_cSZFji|<~55+ $l%FN=$ug),6%ӄ^Sؔ5z߆An\N՘OJA<<'O8.Y芃KAT?hutU>ZDz),eCT,%hHWQ?[ygUX̖b ! 8C\ �7[%Ekȃ"PjGdVv!`vanb>XE#iqsx&Yo|tZ*!BүTzqE{AF AУx%) )\smw. iCE>/5 ZqLH\JEؑ.jo nÔ&&F,QN&hd%F5V!edu90 obHrƺk (n?NJ"_J~s9AV8.Ej-�8t;pMLMK+u uw|؀a�p@'lrGcws*P+[o~rNF2JJJx{$ $:ZB I 5s[T/YE]B$6%y.HL[(VW�%h\bfVGrJ3|N9XqGF,kMʇx=6UX~R>ԬT{_N>ۋ_j֗w eU-3+R@'Ber[&a΂L�\fpp8z϶%:koA} 'ڭ\Lݘ9qG /%4(:t uH0 ߓD'ȵ TpB4ѾJ-Tv?C3^b&d)膦9CuaKyKc^)*%Pr%&?)NE~jީO|T?v0>Z ]lNvivLˆWkc`ҝI·Ì3fd?2Գ J[_TKHcϟŶv0ӗ 聑aİeP#Ol#[5 J$m{TuL 79s$ڌF@ ]ì$cWN 2Q%[G8*%q@ej|# aFȣ"4H8$ (,VV) |WMQvQb/`qhD5$q,@;Q$ӷ|z6HUd]|؀e1 +ML� c$Tvk^zC@Piʃy� s6A$7Qԑuء޹/<\(b䰚ft6w bSmonΩ�%&eGAhz"M*Kx2 'dyN~ , ZhK|=%=#/P?;Ҵo36jYgNgTuje" 9.Ӈ,RZY-keQfVdeމd hekt@ɨ&)NZuLņS-*IBHp\4%Is(*"4l>.W*Z(A^bκj@剈jXua?[ݠ�!GQE,9SB?cYNV9fFyN"U1}HJn 4;'˽)�� nIDAT˱T}{{ͷS;b|Dbw4c#%[N-\}S duU8Q/YOʔe]\)[H́<TCӑ P^0=Dts{95#Sp5uø׺$|OhQLIpNOP'n*ѓI' 292DSbK" %Ul:,/;vڴ.>mܑ~؀oWj OB w^_g':VF�L@M0WT"*+{ NTpFWEN{!Wߤ?wH\q[u[>1g0f~-唊ۘ|ؿcKdJU0%ݠر**^Koi:^!@:LSk, \0ڶ_+QDAŌTJS JDπ%/( 2UsFURd֮Rb߽#~)a Tе^+)×:}S fߐT !(nitTxRricPӢe0\N�D_ |98L*p6yU8|س*Ɨ+u"`LR]Evx¶N|@mu_SSwDI"3T>ޠ`piUiyDZXL$T~b~6 OP *KIdC1xؠ*[Q2 :V=izj/ЬEI%ɷ4`^4k:(׿ e몐p$uF&SԠr+i[o!G=>KDc"1͹Bґb*Φtr}g<%o.tY l&˔N|FD 5 L †0D=@y=o4k^ UlE4x Me+a#wB:ė#t@ns6#>Dv9P~<'T/huuZ-Rض'bVϾܴ ?ZI߰tYS*|p8tO!k[cMTYa]հܫٵnqN8ϊ)=(#{BY=x.S%u* r4jnQr+g.AHӅӔ~�缆>Vlh>E)NSTSgؑ T ='/w]k~J :e*(n"JHt]~SId|1UMmC;ˈ@:VÞl,IL 7ZDeYν.:%>>FДn(Wɺ I8 }xfaQ6nQA9+R8Kt]Č2fHM:{?u,OZ@g|ykK#P.jU|T"B4ʝ!M7Y'vT#}vB䕦8"lN[^S4kv QR-xsu2T]Qj  >eb%I}E|PAOrNO'KSGw`wsl~ޱ$<IH|r5.Va+stwnoK4LL O¦kiB4c%wK_݀z'.8 +V~)_qs={$ă((& LLxpYEpJ=A6 u+34+PG5n`=o-GIH%rFQ,)<)ibmڜ`ZUl8}| Bz vb_caY6PkmmU0Jjfb0מ|Ao$@H2ۡ 5>b9zת\vYv6 =6+B~IlF'opE်_-F\iǧKu8%!.$Cl|Vu<ӵp<$(Do'2 ܽ9]ڀ6ӽ2PHNJ;,lFré_d~v$kJ\)Ã@}R-et9a}0"ǘ+E�%z1Jj79ўXkw6i~t q]Lc{}SW#*=,'VTF0\ϢaH30% ڑdrjFaol @$a#-"K"V*صg!};_063nH乺id_ᨣ_N:2߻.]> ? l䨷LU'O;Ϳa:|lѶ]OVdQbѕGh*}z% D"q|fefr'X;pB#Y,`z(1g;4qU (-qb)R4gnSfUdz ,Fд:=5#}n8sBX#0/muA{tId'.Byѣh߮LuÌVߑl25칛lcSmj>]wY<8qTAj!v oi*0wz7BxT�eKk77gzs|Fa|Mb C. #3*2砐vypyf\_~+03333W?/~߱affff33333 fffff-|b7{Zl~aJfffff `fffffb3333Q+)~~~~?_n033333Lb33333 fffff֊=j?m fffff)Yl03333`fffffb٣ú74=2333^_-}˗7S>Q&dfffff̬joLD_ob33333 ffffff-033-e6xTRUѕV^o컎 u9>0%33^__?4C;h ffffVĉxPlbeG333O$Bk ffff߲EM°d,vo6p~C/~-6Y0xmKv`fffffb33333 fffffS ˿bfff~Ll{~{affffٗ??affff?_?ay+����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/grid.png��������������������������������������������������������������������000644 �000765 �000000 �00000020243 11332353406 017014� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������+���bKGD������ pHYs�� �� ����tIME!{�� �IDATxyսom3=32 " \#$1YN'19f3,&1=N}QA,>1h0*A#"DtF`fXfgg4u^ֽ{[߭8!+n!��7voDa*vmw"��q޺xvW0,�'ڿME��:B@124 fӣ$,@P &B9s2=p{;!hhi!#|q_MNtFѣdSO[G_!,8:5[oo7Z(AZ(J(d5-N5 l~~KPU#'b='u3K��hZJ[Z!k7a̞5?:Yle�@/JFv;"CKBwV479f'Сsols�⑑ ђx^xxLݚ!#]:'/RbSzlˑ_N7mmr %\D>w^ y!~9%vܘ8\mh~]ϙHCsۻ|iF ,:mnDc]vk¹ |':#!ة#?q`<Y[WΟ55NqX!ᮾͯ_‚v|/~trݙ1>m#Q]N9ZY{60T[¡3Pe yͷ~/}Te5^w1)_^oM86nrlU٘S~ GSϚ}WK JFH,?WzBl./O)84ry3:*h4v؉$głOY(n˃O}XKw!:ra`ZZF&,4fΞEBK፟xgO+;ڄ~%?'GF8<KB]B8c~vawǖ8dfph3Yi  Nr[lpp|ρg^}wl"LqXMr_O8n;vzo;uZ_u7nryۛ{>O:mvP=;ش߻ۏB>}y-P^{/6x]5Ylt,n1޸rv?2}´}?{op3hX43r./IЖOZ䴙nq}F]:(Bik٣f o/t^?[]7EuƜ9;Ar燾yl|v[ۜiu3?쿖m^d6s/}66QW\x~`(߇|"U!Sx8krYSQwGw]CXciQ*Ǐ q&{mc$f4ոB{ njLbjMn/Pܱ3'^[px%i!cY(N4e͇. Bwwnf00o^PjNǃ #^<Pgwہ떒8EuUw;6_ym7pESc>?![_;V_7شx?4"\xƖfWMSuh'g4㔠-:8p<2q|D]BkΙ-l#OFxkؘ:x]VCsGG# ~/j9r]9kE +gy~č+9fnʡcv.:G($f'S¹5v:|.ެE+$p9*CKB#Έa áP}#I;mć>˲EgыZ&7xa_ 3LͲ_gVdj<rXx_2X$2=򎇟Oj2lLh$fŦm=Fl+kVm[vP͵jGVd⅍5ON㽁~+Wjv.*o~*彎< Eӂ ΨrZ%f\pszɵWF[ ˾r56owɾGZsCd}\xAgfhP_o8uay>WIBKNMh*5,ޣ/!rb?ұs,N[j|x`p?h#f1Zi? ynP[?1ʰKb9CFަ3Wnr)wduj !ptiF_':iY˙ytc[^+׹f-fDpNdq&S@ahz/I"8$j(O`KkJCDp꨷EЖ8OHӦ.87G>~QU0'V_,:A(BnryS·:ᬉ>Y8=B8 edOA}`y#!$_ܱoqNj% -U \ ?ܕI_,1_ucWS4BG#/Z͜16sxqhƹҾ~yr?t;w|l{2yb`pxb6k6 (]H$Df 0!b4pna jZb<k01W.DxO'zoeZ !q|B|bYnx<JFc_!=Lc>LYL6χ#S/Sj !|FBp&cGFEQ}#(fYϤ)uWȷNPe\Uyhfv(Y2'QedOA o:mv˔qõ+XO<sܾ ZIAvuHDĖ|J:t {ڪ>GJ xw^g4~ƺ�Eѓk]Gz|<u ϚB9ѵб -nJjk?7rٿ[:{?X\TJ>qo5kak˹$02AY~Ʌ4k;X9Pf*id6=OwII1іh; T˵KN un魧qB(fX8 *#(I8o8`"x&<z^34:xh G|'<Msb ұ #kߵuRsJl IK>J~1{dZ5e:/u%=LbVo96^{E [g4y#Xg[_us?}kL[<o楋fmcL4gƗ]:])BQMn[=ufs׳u;[WYdgۑYu+^3{k]<;K5V[6^{{?k/i^|7jE'zlP4*O͟XNc#ϟ~+HK,kR~R@O gJNP v)7^!$ &zijJ{ 7<W̟a#ءc'Ӗp$@vNgXܥ+Ӿ~qfأ=}/# PWK 6465yddѮHњuhxb8 '|4FhVg1ߩD1Xw c0Mw|孷WMbY44A  !vgUw;8n3EQ]R5h vF$n4$1ӌf`H-@hl84Ţ4E1h۫jMG|bX`nn0YDm![}E3lꉺF&jRh>Oǃ˵NP坏|b砿&л4c2zc}':b0QpFh6QpӭsfgwUuZ(! b7o}p|ԴH&!du훘#i"sFjҸ)IqEhWUݘyfΛ8(j9%ery &3E4B`L(u újM!3<YXf]P>c1guR CQt",I_8!Y*,.FhO,V *vgɚpW1 g4'6 K3 (L=LWME3g8E1Y?b Z jza2C"@W] h`uJS muTeQvO]ڝzj͸YUrg8JXUjL/v pVORTht;kνyrFٖqh3QFTfi}'&PB&O-�ejo?ښqd(-�!1 E@͙8V %ȅ2�*F,6Ŧd=a?�yd 7w;�߷1exV �ׯ-S 0�@lذA�@@��2���� ��!����@�� 'Lpݒ~+?o?KPx򌩧Υ +UV)_Ր[緍yލ&FڋcPBV\OR°pn;U*y5XB\țQnVw (h$wȱ2 oL["pMWP-@hUGbԩtQ_9dC0)w')W`qcKn"pA[_ףN cCB>Kqi F4|%8PhzT^ڱs%s ׋p7.T" \EjkĤZ{ѱԋ{T1?\Մ*}Z!# ]CL}Ԓ|vWuʺ Լ('k3,gI(WſE@A,u^Ԉ=u*=w'3-%Y3fa+.o_gDũq1MQɅ.^}7\+*⿣�H%B잀ptt߅(i[�2,caaf l�#����B��2���� ��!��=!Y��ЫG~z�c!�!\v-�8.6ʆ���� d���!�)\.TX<P1[F([!#xwT�>$��B�� -ds%@QH<Vs W<*CB<1 � 26ּ;$j$IYچ%uZlTՇMWq_k\n9KA%2.$*q�D\Y\r*Qz �P\ <�@w~ �(3K<V4\S�hWvmA YRSmd�ڔ0|V҆J(Ah)8ܿb-�(xT/׾3O-(Oּi, 2dڵf~4�G%T�IxdX6�xdK� ��̎!Hy A%P1`: �|H92�� �� TE ]`a �rYQ1nL[�dQ q>-)n?2�*%@nԨR(G*.RRP_LPfCK bI؛`:�e9! wVڸ7O1�@;>WYeQR/ Ydr%R(In4�Ȣ�(6Ȣ�7Ȣ��Jj2A%��<2m%G��J f@E< 0\BFE T�>$��B��eZ=� R6*FEI}�$ȢȢ�(9Ȣ^ӮȢM%�ztZ=T �-e9!+P%�:E �Q Yd=Sx,J[gQ6GdQ�dQ�dQ��xdK5P ��6�#����@���B�\x�{!C[�N r�1G�=2�� �� d���!�@���B��2���*.(HRoL\ꫤ�U`)2)YYY>΁V< yL,l/Dbf>α d2h yd/)Â<T}KAz0Ztf̨S_-#ٮ,U9z!IZ)}, i#IEʆJBtJ$*^eg׭1HZ5DZ~�{db-r;(l/(4v"x6Jd "*$(@C,L[^N3Fyyw5R8B BH%<*zSeJWΎ1 iY,HePgrWY/_"*7<8!dy:rsdSwNfhܧ۠;zmQaGfꠌNQ$w΢D0 UN˦SXCduꛯaB`.Zb�ƛ0E$8=]we?PRd�E/@o���@��2���@0˥Ӛt3_^wu^n:@yGE;#�@��BBK<3/��b&�@Ȋ8x\�*̑ ֟+��.d��2��t,d�,n5�@B&kU�4Z H_�BK��� d��+,X �xd�L`{���<RS~Y U"E y`Y%R~Y (W0G��@ x2]�P[d&?(i~ �jTE#\r$�oj/7X@nԨR(^)IVȔ4`f�3kiCKZ bLe�uR$luӎ-L4[9Ǹ@��rTlZNKZ*G�ȣ%~'C&2GrSM,y$TsXLS(A�"n#<2�@ac2{ B@e3ie|� <R~Aa}+X\Ah)M̉Fa2J:}��<2,JIJY")Y/̑� d��PiDd/c[IjX�@#�@CcjL.�(dQ],JHYb�dqݩ6dQJ#7yɢ >J-CKdQh(6L0A]ȢTT6/YE,J��ǞȢ�( Y��2YE } ZdQBxdYЧ���@���B��N4�@B$�#+d` �L\.mL92�� d���!�)o-uGdO/=@w#�M~ *ghjGxd�2B��� �� d�JGgkgliG~LmWYd_<~?6AG#Kz(ȗw,>FE 9I&hGPpM%]u0/y됻H{zJ߂BkB˒e@w%׃n^K 0wOL+,dh"bZJ^NvWO{k-uY̑{E)BG(_n_Pވв.V g隌lk#ʠG*'Jp�('*Q0@ٹǐ0��� �� d��&**/.@#erj :Yfkעz �� d���!�@��@'].�ЫY=r}a�8Yq���$IDAT��3��*_r-0�@޺ပD����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/index.html������������������������������������������������������������������000644 �000765 �000000 �00000032323 11555611701 017362� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Create a True Color Image in an RGB frame - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Create a True Color Image in an RGB frame</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> Most astronomical images map color to intensity level, e.g. lighter tones may correspond to a brighter intensity level in a greyscale image. An alternative way of presenting data is via an image that correllates color and energy. </p> <p> ds9 has the capability to create an RGB image and interactively adjust many of its parameters to achieve optimal display results. </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li> <strong><a href="index.html#frame">Creating an RGB Frame</a></strong><ol type="A"> <li><a href="index.html#frame.cmdline">From the command line</a></li> <li><a href="index.html#frame.gui">From the ds9 GUI</a></li> </ol> </li> <li><strong><a href="index.html#energy">Apply Energy Filters</a></strong></li> <li><strong><a href="index.html#smooth">Smoothing the Data (optional)</a></strong></li> <li><strong><a href="index.html#scale">Adjusting the Scale Parameters</a></strong></li> <li><strong><a href="index.html#coordgrid">Adding a Coordinate Grid</a></strong></li> <li><strong><a href="index.html#output">Saving the Output</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#rgb">Figure 1: RGB window</a></li> <li><a href="#lock">Figure 2: Lock menu in the RGB window</a></li> <li><a href="#ds9">Figure 3: RGB frame with three files loaded</a></li> <li><a href="#efilt">Figure 4: Energy-filtered RGB data</a></li> <li><a href="#smooth">Figure 5: Data smoothed with a Gaussian of radius three</a></li> <li><a href="#scale">Figure 6: The adjusted pixel distribution for scaling</a></li> <li><a href="#grid">Figure 7: Coordinate Grid parameters dialog box</a></li> <li><a href="#color">Figure 8: Final three-color image with coordinate grid overlaid</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="frame">Creating an RGB Frame</a></h2> <p> To use the three-color capabilities of ds9, the data must be loaded into a special RGB frame. This frame will contain all three files, stacked together in separate layers. </p> <p> This thread uses Chandra data from an observation of Cas A (ObsID 198); the level=2 event file is named "casa.fits". The same file is loaded into each layer of the RGB frame; different energy filters will be applied to the layers in a later step. </p> <p> There are two options for creating the RGB frame: </p> <div class="subsectionlist"> <div class="subsection"> <h3><a name="frame.cmdline">A. From the command line</a></h3> <p> The command-line syntax can be used to create the RGB frame and load the three files into the red, green, and blue layers: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 -rgb -red casa.fits \ -green casa.fits \ -blue casa.fits &amp; </pre></div> <p> ds9 will open with the three files in one frame. The <a href="#rgb">RGB window (Figure 1)</a> should open as well. If it doesn't, open it from the "Frame → RGB..." menu. </p> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="frame.gui">B. From the ds9 GUI</a></h3> <p> To load the files from the ds9 GUI: </p> <ol type="1"> <li> <p> Launch ds9 </p> </li> <li> <p> Choose "New Frame RGB" from the "Frame" menu. </p> <p> When the new frame is created, the <a href="#rgb">RGB window (Figure 1)</a> should open as well. If it doesn't, open it from the "Frame → RGB..." menu. </p> </li> <li> <p> Make sure the "Red" band is selected in the "Current" column of the RGB window, then choose "File → Open..." in the main ds9 window and select the red file. </p> </li> <li> <p> Change the current band to "Green" in the RGB window and open the green file. </p> </li> <li> <p> Change the current band to "Blue" in the RGB window and open the blue file. </p> </li> </ol> </div> </div> <div class="figure"> <div class="caption"><h3><a name="rgb">Figure 1: RGB window</a></h3></div> <div><img alt="[The RGB window indicates that all three layers are visible and Blue is selected as the current one.]" src="rgb.png"></div> </div> <p> Each frame of the RGB image may have different binning, scaling, smoothing, and colorbars applied to it. You can "lock" the frames together, so that the setting is applied to all three frames at once. This is done with the <a href="#lock">Lock menu in the RGB window (Figure 2)</a>; all four options are checked in this thread. </p> <div class="figure"> <div class="caption"><h3><a name="lock">Figure 2: Lock menu in the RGB window</a></h3></div> <div><img alt="[The lock menu is expanded and all four options are checked.]" src="lock.png"></div> </div> <p> Use the binning and zoom options in ds9 to adjust the image so that the full region of interest is visible. <a href="#ds9">Figure 3</a> uses binning=2 and zoom=1. The "Scale" is set to "log: minmax" </p> <div class="figure"> <div class="caption"><h3><a name="ds9">Figure 3: RGB frame with three files loaded</a></h3></div> <div><img alt="[The data is loaded into one ds9 frame; the RGB window indicates the current layer is Blue.]" src="ds9.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="energy">Apply Energy Filters</a></h2> <p> The following energy bands are used for the RGB layers: </p> <ul> <li>red (soft band): 200-1500 eV</li> <li>green (medium band): 1500-2500 eV</li> <li>blue (hard band): 2500-8000 eV</li> </ul> <p> The values are just guidelines and may need to be adjusted for your analysis. </p> <p> To filter the data, first select the Red frame from the RGB window. Open the <tt>Bin → Binning Parameters</tt> dialog box and type "<tt>energy=200:1500</tt>" in the Bin Filter field. Choose "Apply" and the ds9 display will be updated to reflect the energy filter. </p> <p> Without closing the Binning Parameters box, select the Green frame. Type "<tt>energy=1500:2500</tt>" in the Bin Filter field and choose "Apply" again. Repeat these two steps for the Blue layer, using the filter "<tt>energy=2500:8000</tt>". </p> <p> The colors in the image, as seen in <a href="#efilt">Figure 4</a>, are correlated to the energy of the data. </p> <div class="figure"> <div class="caption"><h3><a name="efilt">Figure 4: Energy-filtered RGB data</a></h3></div> <div><img alt="[Each layer of data has a different energy filtered applied, correlating color and energy in the image.]" src="filtered.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="smooth">Smoothing the Data (optional)</a></h2> <p> Smoothing can help bring out finer features in the data by removing statistical noise. It is an optional step; experiment with smoothing to see if it improves the appearance of your data. </p> <p> The smoothing capability in ds9 lets you interactively smooth the data. Note that for quantitative data analysis, smoothing should be done with the appropriate data analysis software; ds9 does a nice job for publication purposes. </p> <p> Choose "Smooth" from the "Analysis" menu and the ds9 display is updated with the results of smoothing. The "Smooth" option can be toggled on and off during your ds9 session. </p> <p> Open the "Smoothing Parameters..." dialog box from the same menu to adjust the function and kernel radius of the smoothing. This data were smoothed with a Gaussian function with radius of two. The results are shown in <a href="#smooth">Figure 5</a>. </p> <div class="figure"> <div class="caption"><h3><a name="smooth">Figure 5: Data smoothed with a Gaussian of radius three</a></h3></div> <div><img alt="[The smoothed data are displayed in ds9.]" src="smooth.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="scale">Adjusting the Scale Parameters</a></h2> <p> This data is being displayed with a "log: minmax" scale. That means that ds9 stretches the scale to encompass the range of pixel values in the file. Adjusting the minimum and maximum scale values sets a threshold for the background data and brings out features. </p> <p> To change the minimum and maximum values, open the "Scale → Scale Parameters" dialog box. The pixel distribution shown is for the band selected as "Current" in the RGB window; when the a different band is selected, the histogram of pixel values is updated to match. </p> <p> To adjust the values, use the cursor to grab the red (minimum) or green (maximum) vertical lines on the plot and drag them to the desired location. You can type a value in to the "Low" or "High" field and hit "Apply" to set the limits. </p> <p> A basic guideline for setting the low value is to minimize the contribution of the background. That is, adjust the minimum of each band until the background of the image is flat (i.e. solid black). For the maximum value, bringing it in to the last data point in the pixel distribution is usually sufficient. </p> <p> For ObsID 198 with the smoothing applied, the following limits were chosen (listed as "low:high" pairs): </p> <ul> <li>Red - 0.4 : 20</li> <li>Green - 0.3 : 35</li> <li>Blue - 0.1 : 10</li> </ul> <p> <a href="#scale">Figure 6</a> shows the image with the new pixel value limits set. </p> <div class="figure"> <div class="caption"><h3><a name="scale">Figure 6: The adjusted pixel distribution for scaling</a></h3></div> <div><img alt="[The background of the image is almost completely flat (black) after changing the scaling values.]" src="scale.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="coordgrid">Adding a Coordinate Grid</a></h2> <p> To add a coordinate grid to the image, choose the "Coordinate Grid" option from the "Analysis" menu. Then choose "Coordinate Grid Parameters" from the same menu to open <a href="#grid">the preferences dialog (Figure 7)</a>. </p> <div class="figure"> <div class="caption"><h3><a name="grid">Figure 7: Coordinate Grid parameters dialog box</a></h3></div> <div><img alt="[The parameter box contains fields to set the plot title and axis labels and to change the axis spacing and numbering.]" src="grid.png"></div> </div> <p> From the preferences box, you can change the color, font, line style (solid or dash), and line thickness for all elements of the grid. The font style, size, and color can be edited, and you can add titles. It is also possible to turn off the display of individual items via the "View" menu. </p> <p> In <a href="#color">Figure 8</a>, we have turned off the grid lines and border. The axes have been changed to "Exterior Axes" (from the "Type" menu). </p> <div class="figure"> <div class="caption"><h3><a name="color">Figure 8: Final three-color image with coordinate grid overlaid</a></h3></div> <div><img alt="[The three-color image is displayed in ds9.]" src="color.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="output">Saving the Output</a></h2> <p> Once you are happy with your true color image, there are a number of output options in ds9. </p> <ul> <li> <p> <strong>Image formats:</strong> from the "File → Save Image As..." menu, you can choose JPG, PNG, or TIFF file formats. </p> </li> <li> <p> <strong>Postscript:</strong> to create a postscript file, go to "File → Print..." and select "Print To: File". </p> </li> </ul> <p> Currently it is not possible to save the state of the ds9 imager, meaning that you cannot save the composite RGB frame and reopen later for further analysis. </p> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">04 Jun 2009</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/lock.png��������������������������������������������������������������������000644 �000765 �000000 �00000010277 11332353406 017025� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������a e���bKGD������ pHYs�� �� ����tIME"��LIDATx]yp:-JH0p IqH  琶6 %MgN:d&)?Z3IPtH;tBsr `|I>$[9^ڕvW7C^V}{#I�Sa5^ a#3-V YAHLstqux 3Q"щq,�B2Fa2t{|iA-b xD'"H]mԊB6C -, Ƨ3sϾic=/ҟH|  eQ.H 8ia̢%ss]NQ&\ k-0 1ۂd%®c̫>އIlO`Ge8|.Ok CY>=$ZhA*-8\<Μ~ߦDpڲOU^UE3<ei! isZpޑN=h9^虪-3=#Ͼ!Fa΋2( uaGQP*5r2O|{@łU8ns�lGJ$}޽'S+u>!40>G.  [ۻp2RQ่I-l;P}D<?]YȤb.[ql@$w\v)oBή3K*Jݵ BXͬ`s=o9m=}1ŖSۗ- aBp_˿ooKN5nANir}Ι H4I<֏UVIjkܼ_hZѐoR|b[-V;%T2M,-]Dg_^i;Asbo@b(G[L"Zxp+B FY{"[*2"QV%I2)_du8jj,f3BԹhtʀ؁FsMf"L #wy/ウ4">" IR"ˍx^�a8o |ү o?[p~oQ FzO'ċJH,F(60:080CRXhŒEx"«oz(qM:/ i^J_9y^^O+ryK&|͊Q"i<fzl=SL1 F;D晋VX:26X&iy7wpdb65\y/;#%~ŚHavt\BMGgqOW?՚9QUQ# M&L#B Lyj"omJÝU\b+*K٬e~S/V[=O{͂U8 nz坱x-koRPL%Q L*EUz.BVOW}w%x"|GҜxwW& m1~y++#b!I|E ?}ry?eG,/Ϫ,{{\L$S3}S*c/~t뫯B?u.%1͡<+$[[|CUDx[8o_~ Kg-m+s\h[L&=##'d߱ta5vfގ6omU̩Rd`�bڶ I28ю_}jw$bӶ#nP-[ EELgdPir,l2u9FGGɳg"6'!p'`"<~~𫳈D._bicT"0d6[0 LfkcI-%¼oqGC8.ʵU66pc|>lkڝc &&&h<lS/|3Od)M}ORV!-""'Ifp !!f͎aU}1vyOD;lg[EBV"nOQ(YN_duwErPUiSQ -Ⱥ p'jV<~KG1aZ�Z [3ݿR+<ZhAUN�Bp.a \RBM 6m PزeDۂP(d""A>onnY&j0Ð]FĪ�h�Z���hЇr/A7VR*t;ừVWgHOXz7]w>-2 PqR~_QTp>#HrN`07),v `+ Y_Ĝtԣ)8u-䚠2NtzBf){y^=R$-&-KȲ7 UvKe|d1Üp^+c8늼ӅY֩P!TMg'3f�@Z���h�Z�4xE~ZF7MMMMMMFxfoPJzLN��h�Z���L#\.2 `$I6^{ GF!z"^+_1ºEtZl ���'"j((NWEr.*d!Ii#!<H m�U}݂m|6ꂾ'�Dd:|(]s~FZ,&19h%-(f04W2c897a'(LYZPmD$Q&v͘nVrrwR">+UuTV.:EQfPJeZ̀횡D@-tcXdp% i�DvE|eTP= -x -بͭTe\� O�i$Vi$i1KP2t#b ҄oHk EQS@IM%"u!:'�jЂqV*t䈼_/3d_>c+ 1_>BvFss->ė4Ӓ2Ղa݂M ڡEccKU1ڢEю 3=EQy Q'Z2#FAw0<^t@CJ 'B78> 3*4r̀x !hr_!W_�~_�J�-�@ ����-�@ @lHoω@oNiH2*p_,@DE+U-oI!!D# (ԭ |MFqnfE'.Kpf`8Ʉ ]Rd`6W9 NN>6H::cHUvYTY0p: E]>]ˌQB7)<GFSVpԚ$fc(aJHF;j i7u8+AhDAgFss3_ئ,"0dUa 95lm{9K/3:�h�Z���h�Z��&sB|ـB<#A"D8xh!c<r"=ͨY]1F+wvgf E JA'BqB@$H 45NY1^"&{]Χӂ*䢓 3* kNkcy"Z;θjvw ErW9a3_o BRc33,$"U{ׂ9_΋+f Y^2Kʛ]Z`MH <Bf@l~y!F]f(gp) fd hQ�xiH &l�҂idpA۴_>�P"��hȇ K~�3jƃ/ZU3&*�09@ �oODU -Gx:A,, ��h�Z��D#zP:BYNPZXj;8DE28c@Xi�-a'1 xS=ϘI-gB/P"0O k{'�Z���h�Z�A�H҂ Ȱ�҂ $i�Z���&'dL=BbRn +"� $-/tBw�HD5^ }a45Z��t&.����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/rgb.png���������������������������������������������������������������������000644 �000765 �000000 �00000007374 11332353406 016653� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������q���bKGD������ pHYs�� �� ����tIME).��IDATxkpϮv%Y"!1#@bBI&SB2-%chIC ӡhx6&tB;e:@)IKa8Nb'-[dsAFҞ胴{w{wܳ˲�hZ@)F��*6`(GVxoqժ;okr4wx;ᛜQTF}Fo,5YSC~$o-x �4ZjYN~ v}A 1~Bu\$Bq||wScS |Lj|8vODIQ6won[R޹wlXϔŬy/э8j~ $ R>@5%; |qHoi5t WWc1|rG]5eR:v˛cG+J<5ZxEimAɸelu{uzI4|ý�{=]rPbO䷟i5<s"?bV0R\ϏyY[Z@8<u \Wj*TI9b2# 9?=tjc,Rzٕ�c?=rq/nttgP(CO4d+'g_s;V+J]>C* IVM.J]��`w]UYVU>U-gF�^`0sv31Yi,[0k`OњHo쇺zlf .?4<9A}ccQ?A_Cv�:E_XVGɊd��w uFMW0nnR5M0q֡1Z%IR}! h"Oj~ )5r@?{y 1jxﻞp3�ĀV|a|z͠VT7ݬZkhl) �z|V̥:�G]*JņYa6HSNKk~s6}W$˲iI k\G^x_4 |˲�@IQ>v}fmVRbK@ zw?8ʔ2/\̶f,9{ϯ!ȩYaYa|;X J & �k!{tj\#xtn|Ub8ݽ!vJeK]';?O{4ZteR/NN*hu0L|7p�&=n$#|qp~fGNTm@JEZ>!C'(q p0QuJZSB۪CK'Nh4Mޯi^)wm~y螫ׯq_u?Z;k^|r�`Ak0l3q�:f\R䍱*u{$B].PCt"{Ȓ'!>$O5CFkUda4@4˲jJiMɰ-~rӲOoS/;UW<ݧ/CJ˴Tl1[Zj�x٠ 6-.ytH/ ^ڇ${Stgr ֹ];ZքB!uާJoG޵{zhX}uÞn~+6͙Sm ١'_nHϲ_Gձ,~Ӷ#\:54_0k<{V=?Zް<:ښZY ؚysn7{wLgDm> �|o� Knl}sIO8PQZ306 ſ;T* B+kOn|j0g9sY-׮xۏMNN~w"&[IR9 f+uz�<rDϲ,A�`$)Z%"Z| QQj8_#&`YbAIؼZ9 fʫ]rj*xѳDhr!z(])u!قǏ+eC >iJFL`)+R�Π Aȸ;/g�^cu:ŭuGі-[9NlS[[[{ #{G!{G!{Gd G/#bķrd%jf9fmӢ{g7= )Ro;G'~2dpaK's_iģ?dy:*M*:>^\(*}L-&p \fs!o}.re=tueoCf]C!~*WD6$esڙe%. b[�d_x] 8G!{G!{G!{G ^'a1tQJa[[[QU ì۴z(dQQQQUx28_Pܩ"Lϗ{v �@|0 L\X z8>,y80Eb|lB?B)l, wrdv1]ujl$L~>pL>,>cNN!%GR3#7ʋKI 0FRY<2CJ &7{G(dB(dB(dB(dB(dB(d/_1 0٧  a|r3 t:_򨄉Ͳ'wE@RW;Zs,^c7D^)OZ& af1>-#_ܸh۽Ly-!Wө|Ǣq&֦Ԓٺ[ޝ8~0{F W zFgoj 9_&z|kkk^-;3\dB(dB(dB(dB(dB#L& W:xϧ_!:{~=?_$=&v0?gE/=A}scz"j\ ayOٚs<0h=?0>_d6֏P|;QRrC 1>_A|W2{||QQQQQȾ֦(2?_VEAa<W;?/يi|oe.+箿 #x%'4Bㅼ??Y#ΗgF|f/_Ng˜썪^b>[}ܜy O_!#.3_Cܭp8].~<89<e "{G!{G!{G!{T+ގSK+-[QZA0̺M۱G!{dB(e;H)6-� .) fXQQx}_Xyk_% @�&@'ﵫ\Br ɾi>_I Qcd{9MR>,V#nBM& }f|!;)E?qr= ٣= ٣WtW)qrBtpQQXl)h>n.TIg4Ƿ{(^l `YvJS{;l1����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/scale.png�������������������������������������������������������������������000644 �000765 �000000 �00000751212 11332353406 017165� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��N���]{���bKGD������ pHYs�� �� ����tIMEt<�� �IDATxy\}}}7  @IZ-iʣHG%vq'D93ỏJĖ%Yc)R)"H$U~hz.{w{߻\$�y`0۞g>I�b0ba0 #3${?T10 ׮Zl\&```0OZ;Ⱥel@}‹_;RTk$;}WD{Qz+0 l񛵳w=#_|hlw�kZ8AӟX]cO{Lk^1~#3 mmٳgwٳgϿlwmV8S?}^י;/ˑ~_z9265R+0 q;1sml]}g #Ͻso֞^} Żcŏ=rz &  t4ohQ8~\]y>%+3vA�wd]~臶-T>z1I*uR횳/~?6�oͯT6|dVR^S/% �ާ^�S+Jd{MdC;u' h'?zOAt[׋}^ |R㪭YZf<ϽxueG9^ضyb-dR}[b^$� .,ū }rg]n1- fn M~\W|Ycoyx, `Za$.wyoGW^g)Dyw|%<ϕ.>ƂՎ=BTcۢRz!c4˄EItlj#(x}'6{̑|ŧܔ?�|/H7<pG'~>gVEM?<|[Q_y|gr)/ co;ytdFVo\pjzgBxZ}w>٧�e=]3(zm?r̻ߐO=c㦦~p};u\[X??Fꁳ 'Rȁ-3,=.!>ӻ[&a;ALfeGO;~~8>=HU@!oӟyu $Qx1�x>sHnM $ɟWLH^YtV*='>ŭo=wwߣ5+S}}' ߻Z3Wy~\Ϟ}Ge~ U~fGЬVV'~,ki_R~;_>G7VeoUWffmpɩxO}+&fyOȥx~x<:싺aց~WOq]={o|twN~B()Aޟ'{O?r/�,O]X?]R5^ևg15Ӧfx^$& HYԷf;Hq"/?{-¬} g^o+CW?͏D1t'Zw6;Q#=qtl^ւ`**ƿ$?uG'Y�奊}w_y鉏+ډȁ'1Q5<xnOq^m\??|&[6yAZXcq(WT;-|dJ>{jN|io8o<" ϾrR(2ux^qSP7(Bҙū&�^StK�$I+O<#*o<BNWD�s +䱥ꍠP6)~mD>]5+? L e|njf<~}w͜sr>E'?65YX.oz\VO8F"wD[ozCB={=oa]M'xnTyD�*"5U%Q8wsfs]o2t^~]:񷽮u)y4$;o_eޓS9 ]Vn(e%0$Yɓ$~ӽroM׿!9+W�L' 5޸Xԣ0HD�Ḿx#/T>?ם7. WW qg0(w)JmSL۳<1(~[AL)oT5EwŽ5Y&$5.~SO$oiz[$ N�$9}Tx>ԙ#G&xӃ'gO>coyRd1 _K榎ws|ۊ&3*dED"o{#<V\Zozl_ϸ!:>s~K?ԗKH|bL'~rw7?wb=oKsG�F^僕tU|WsS]$1aӚ죽?槺0ٍ|[_/|{ن.sɛdzZ߭=zS6I$v廩 |Ikzr\&RRO?%ʽ�>w֧<ؿ_w?|oڵks~C'M u~_~/櫪dm߽tyW"K�\O91=^׾؛G|?sꭊbכ/]kq%RK\_~G}C/^w.3+u;)xʷ12v3GuU)U>Q4KU^9Sb0n!0?g[}v0r_wvϷ# ;~p^;T{>u3K8{3QUk U]S8\ $NxAP-IYzzʙٱs۬,]q74~~Djet++ʕ(]2s^~@蝺{aNJVntRV֬lvb: ,4+Ӭ$OrcsZ9 ɧ?e'ETf=8Ae%RuSjJ WܺhyNcHՅ(I k"r6(DAf H*M -CuuM(}soxǚ8R*?nbٍ_7tZ/Ӛ\-6| N9VΜ<^דW/5rx^L8qКϋ,O (ɒ� Q4 Q4K%_8 D+E8+*ժEj(H �0%L珀CK+%J~9<4{m䱉4(i�BpՄ %HV78!]8B4C$$1P%�D52#</rDI$$HV"!"a܆Ι=o| Ou]O L?,Jtz̭y^z(C n9xIV҅E#["3vdč-ROH#F&5y\>k'Y7I9DH7$+)Y�nJg0gLiI9gƔ,oF\zYQ(VvLUHl` 9n/F(a=q0{#t;/ZIEOZQQ g .ipK?SlۿvˣiL`0i4C֌.785(`ܞhVf�85�`ܞ|ࣟ0,`0 <QT '``0`0 f l`0m`0  ``02Lm~}ik^o؞^2 j{ҫx];ۡˡT;-ЇubvdGot /AV'>f2m-pש(Rz"]9M?ra[S^k]E6,˃S뭕mϱz4]E7޶D=s/EwЛl@-\mypеOy~ڎX;>wXWizRܚ@lqG>aӬKNp/+^M�kӫWԦGGn;JQ Gp S:|8umH(R�]c5T]}�斏'+Gd~3kR?j5樂MmfzEfo Z{yFrLuYqM X'!ߌl^Mr_ܪaغ2ͺx9, <BGZ޿p6t갚`|U8v*>FC,sפ$~ݸph1 Ïеy7ۊֹoUYx pY``~Л`y`0`060 `0`0 f l`0m`0 `0`0 f l`0m`0  ``060 `BaAv| ЁUP&Rvض͎b0cgnn$l8xt(wv$qׯ q;۪]d2{4[uzjwi2 -lͼ~CgbI}˔ զJ q˻kvk)]M_ kAYL61}|`0n7Ѯ6'``W]#d?<*Ŕ cjJ>%qJ'2x q؀U Wo b`0ab0D<ļU`0Ա; ``060 `0`0 f l`0.7<L. <L( l3 DgL  `n|=mC뎃)JR9F$뛢<[єFT#ךύF?T9G2z7t| �on GS):NoHiD5y9 h/l+`0l`0m`0  #;>g۶hύ| 9CL7$?u ;&]7KݞjZQ>-0VC8$U`Nu[ L&]h*ފ]SۚoQa)>J{z/{W$홶_{?kzsym\wez쎄?J؎mоO ^k.{6RF!l/RhOkOCotwo7] ҃:$X 5HH,cЛfebo߇%<;k| ^DqE�;z`bAv(-:F끵޳bIjy Q;,Occ4Sw]QG[J~df荻 #8ڶiGD7 }ތ0i1>^4mzUy0Bo7.խ^(ͲhXu02hRBGQp%?af݋P5vڶ!Rϸ#A =GfٶX/F&zw!.C{䲗!)4w|v( 5'iOvwG/(vW<ȂXL|X]Fhf%a`07Gpq0`0FކL cPD`0`0S:|Q;~?4H\ߟG#%.Grթ#uN:`0l~B2+sŔ щx̕J }4у)UVi ];\|ɍ`DFM}$3Eer`mzT{i7`1%``0`0 f qajʭԲC<Fik:&~ 6.]~k}5nQ4٥mj?oh[a [IsrkŶf!wXrؿLﴨp Rvu3Zoiv44܎.SrڐݶhXkCk:CLl z~7JrEݶ7NT+;`F|\v:.r(UU=s`.po?x!Rq@ pt(azt&쥨}^3Ki!N6 19,VK8CU|У#ѯi:򫾽>tdm+챙}ԛ={v]a6 #2XH�=Rh?6ǵ\>WiH=t9@vS[` (v&mp;zq_lCWϨN:>9]ߝ/g.4NmhQ2%}{Q]W_wZȣ; fѸ_ȡqRC%^~ðb2^/ W|k^ѰqXrbגxJ:=F<]{Q)#S & f4n`a¸o~?Jar`B`0`060 6{L'ܣ,LMoޤ~}}-W`Di`|Yx 1tچ'x `0nK=mÇ?a&H>%`tl`0m`0[l`܎ o}͝Q 5]Ao>260 M0`0ؕY60P"=Gf C}]*l=uW퀅m`0eBc`4&Q c]Q ctf6^4%}6ɐՆl8X:{\nw_E 4ߟ?"i02g5өgENaɐ^1`0>%?no=+_E:UZ} % 49 -3rV61-jmW9 m`0nAg{{3V{ ld-!Cܤ;蜀c9%"nY YUU8EeI;90МcdA9 )\0%biƜms2{ ܫ'61sn׃{1c& ^KSU Pa6Ģ HM`u/⋈Ҿб=@ޚ6 pu'wu`͵S{aNUloz%[gC,AC(*u; ŸC@9.Bۯ}hjvax"60NIhHn HR�hi0w P%۔s@ l/.(pq6(lѕf}ԾeӸDm~Jp[UO2p<`_@6GI\A_l(ݑXA_2hT4*vy>60U"01̶gϴ4p8 d`�� �IDAT"0Ӻu �N8$@(P2Lŝʲ*T&UȔIt"`'NGwSGC>郫cnסlK=g଄Әdl;p4#%[]|u3B2b bՀ"px(@9@詌Ȁ Tm^[X3BaΉ*ݴDwW D_^3MCj,4۩J$+IjP"CtgdL[0n z|2� $B6/@"\Cm ,D DŽ?X!jUY*�Zs&@h=$@ PҭnzX(5;$o/ܖ!:-UHH6@íe9%'u$V� 7?z~֢ Э?U][ q ` 蝯5Ŕmb䒡uvƵ}; [ F4e ynLS:f .!ih@U[zB <L88j&�Rc `Z<�9t B6FH}Z\3Gں:nu C R<D&QH=1Yq-:.T�M` Oo pCa+[v.[w5(sg7}=dhaҖ&mkM?p) Pm-1BcNCB:&0ϧLʓI[E&U/�W$uU󊆨]#Xmf 5J3LUwIdjQž0_]BD<p@*`$EqimsM"VL# (@1�v<%PĭH �e" p(:mJeCKZFO#)ܭ{E PL0W֕Sr3 (f~ÖWspO|D߳^+60Fi+t.NXg�9`Ȭ4!kz&9` X~ʞ:ZP̼f"ݗ%B˵kjʄ:',I&#A R@4c6 EqdNv5 B�@ yjx) b'2Y#x}_ D<Uj5s}r$hkh NN7q~6 hy!D5[$@R-9-7#k QuAgRn{4f|�CLu@�饎ƥBKMρAtKt#8$6!?"KCel#B)_r <`Q?Ʌ9ꗰI)�P" 76 $<$Y5Qǎ *{ 9 a\qE*,[)k\EҢM‚YK S'*P8d3H{ELtʓ 4^79 Pr*뗕|NofJeD?y%�L`c(�πx�T@ q�0h"#uy,$Wq6&]PD9N�p7^KT},t /Ï5m�^/&�vxjT �@ncg偝JPSb92`CQ 11C ؇da8X}u`=&ܒ& )փPu2I 3q5"ʞ@4 ь ʫY>ț6QI#.ܝe.9rUXx"O8zR%w8ǹp)ne1{q iJ'3bV9Ηd1U6ų**�!8\X�m`Ѐei fak$hDjqhbvL)#,H:hkJSi-*Ph' FZWsF=A}z}]TbY Ë#-M2 �.j r0y;f+ &SNBDDNet)01YGfpy"IɄ,rޅ +lH(KiN3b1+:.|p\̚gL..6=hr !U i9Ѩe9iiZQL# !7!$3 (EJlS]x5\Lb2:u7/ �x@Ɓ:`�Ei;nPtV�0Pf!�:Pޢ"$6ڛHH* .l�f�TW[Jr�=. +lV2 �"DO}jAWW%egYBu YP�^B2�94_QUg{50IJWi]\ɠ&+jfh&r!Qoid6%[362yÒI#} y3'5Hp0 pu$R&/KXӊoŴV R|q.F(.Pp–QNe%" B᯽b{!cI<W[*=b<E"(cSK)[qvj*:Uxۍo�Pح [mo(7_ﲟY3z.$}w_¡!@6009LҴpl}5-e ,B5BTðJ #O^+M,IziQYo,W㘊^$j?* amjuܮrŮsB*@TWbpEӁFt^ V*0R͘ʤU1N$bT\T2'6�&IbPiAJcZ/íVKHZ1^EU@@hR_IP^KcHA*="4`$6<u:KCȟr6&qb*X{l AҠn+[C-WL-uZuPG1@]4l:.XMK/l@ЪB&} �QRkʨ:\kk@1>bNCX0LQpg̛i!i) D*\ t5PY�TiY%0/X ٮ'FXb?bi4)lP5BZ!ef22QIvqJgyI8ZSˇa%'UR%s&"UTVMpXPB\<pCu4rS:-!R&<Sqpdh>~kV1NhĮS=FרQ8[nvL˦83*NQp�P`r aiaD̅ �z w&Uu(8"�UdS}plwciGN 2 '6<+%"f@ǁp2*dlt]]FF)| Ѐ, `PbLI)C5UOf>&^[1iThn~bcAť#Rd=5u>L;IJI@u 7@[>ϙpzS-N2*<EEN"Kr%< h9θ,UWDgE .,L#9^\s%1:$>j=|tόrDє7ƢF5⸡\tH)KLT˕ 5↕5Q/ 8pb/2傦TZmU($ 9E=X ׂX@fRwDiڵr&?oK!4@94~CXW9'*X[dq {zmj;|OUژ7#18dW3�_rҶ_q@ 0 TyU|ym?�z RH!@m,� pr�یIdʜO( *j,𱚣IZܑ7j8VNeU3F(*sa'jVljCQQQ* #^GcA88>C ެ芟.Vu!rEgx33-݌u5D5GK΍0 ™RM; 3gz6b7E%JfA G}bu8z*d]}SBްVyb%ٖf*w<jHEKPj3: x+l~QKWlu _�hh pA uI@�V"&k`wچQ`o|edgu~@-ᆵ]mFw Cg4QRHˈ+mцLpЄfjpeN�] p/,hԱ>J,nshR]\# $X@,X)nJSO0fD &f(IFVVM=ҼfV9]eTD yUAZi+DV(-kpՀ*GA⊙.BWR R@6·h̯ Dܐ$'GJӬ7`S,e=BMD͔"U~MlM:1l3*ʹS>TK ''fcE^_뵅xJB6UUiyECRwj+jUGGXsȉ0|B&|*Ӌ"%oYvj kOm9"&@6vH>"`w^0{0v>�2mM _RrkǯaNK'#{6(!� Jg�5ҐX%IJg ēioU̸!P? u` T&$O4KĨPUCd gPc"3/!˅誢K&#/E]"q+<_ W'Ŝ)f>_H@YNfCUS |9 raX#Ϗc'7%#*7t4\ͪ$Vm!irfy}Z>VsȋCH 25Et+gk5ѽ DqJ&aE<7yIOG"[K 1!8HBXŢº<6N�SěVY p/\"`ɏC`OoG'7Lжew8 6sَOP;Plu d{H![[6|Q<H$:[j$2 \n=SCʔyٛN9T  2qBg_ߣuS'Șq皁)*|7O  ^ ^==_A%a%~Lb.PCDN4E4bWe]1G#/Fu1~$W0QU*žmǓAH))H>8EuLiTME kMqjb_PZA9Jm6.W%ӿZX4bjzE1LGDU fUS%h=NfqꁼhN˴0u("E _s՟}@n\;Cq2Uᔖنќat1o2vQ�Q|S8bB"^?"5˰<MWCkj&%Mׯx0&"v)0it6hpkp%�8kXœJsyQU9a@Xɼȍ Q@i\(6܆TD!8P˲fi6ȱj" x4q,ߕZ%(iG$sѫ"\ADPNwoٕmu?[+0NI[H5W($GZHA>/Fuѕ/ȆjZWoViCcnZhCg *hBLɊPJHU-LDcJ56@֑\sB}7 3@Q_sA.i;\02dzuKs!Fo;n.p>lèAgwnÝ5zu>Pn>m#D  wM秫xD9jp|sqc1/$CN'y~9!(`ieǿh"G�b4JꎺhBM<U SY*_TMCM5%?bP,J!h\~P$%պ[+ .!xbxADp<4*e}dPF[dSLSH.u][ 2O1E$s@pj#W|\"9HE%o\!4Tc2׬sY|fļy�u M`5^\^$./(/$Dkc/stF@`Z͆Ӳe*@@ a}#"4B�M p�"B0!KڵI!bֻ(lp "ܵD r*::捧<WI S&|Y9w0Ȋtut7zg4l::fv). f$ 42h*/ ) x2iHe4 9Et=x8khpqf9u94]k'Aiwq]᨞R\^}-I#vL3#= ܲ(]XC~Y05\eΧn F0eʩ^/͆1PD7obh1IyA$Q,eIpU/-1EҮ/CN\Dj֪y/׹KWSDJl<e.lj0T OT|$U,1A)MC J4ZV*/h )S̨FDӺ΃�2%x.CYn镫ּZjY⃺B! BGHs@T8\wNq谲uJX @m�odރkF඾VVځO@ , RRv(/dCtr[.+=C @eAb,ҖHFEs_ǜ`u;!L)2 ( h\0'z1'#jxi'ʼV-h"Es5@DeY4sS DBގSWؓ9ݫi$ȜD5 "bԔ:.8ߐj (br=$y P#psr,Jr.9bJυe. 1JD5l2 ^] x%rTe EOP05cAT"Ԍ#"D"q|J1U=dj= k2C,e0KYH>OB{ GaSLPjVNJwI&K)[ɮ\ ׁ%/#rj5 \ n4ʆ P sNa=xmq!XH9qZV�dvqn ˛JHgxJfMt0T}erQ_iVetӌkH`; C-/!"0) ؃C[qր8O<^AUU5G9E@OK,U(5"Xk*8cGRE(+rG24ytf8=O)Iʩ0$)d6k_=XM8Rm˨"c3C/lNcQiV9GՐS(<VC8GSoHx>RMԣ{5+3jT"h* jh5jVdLdZܥ(qQA>ɍڢ녚K,U}Cw%jFt])qLH⽳/yGN}1+vU *bYu%<C%C0rjM8׳^uAe'cgSF9\o**_ RcVE`8 gPF �׍LOdϕnꮳ78YNvv1laڿl{ qf{'UNC8!֝ AQT9CiPTD&Ay ӁzTȓM*cH7"?2U&},J ^.�� �IDAT~2EU65|P \6oZ{1)HDP)q䫗cޕZ0u]_7m6T.{R22QL%&Ҝ\ ᫲Ur jK1G`5DT}]Pgdn=�LP=X E+PHa"YQ܆(=4"IjnT YQLqB"!iSi ;̉#]zΧ4)Zhqby&W#T!TG&UlkAمZ--Zi|ֹ2e<h=rd#(D`(!C!%+J1qnH@F߶v+耺?Famg�Pi 1As���gu]>m/p*l~KYykgQ>Y12L6"! DKN|(EEU\q\wTӸ_3'D_R9Q%=l#|7" ]\[(-ÅGKR-ʄ"ѕrm5,ys|W쩱inII UQ(E<'#IHID%PI BCI5rbDX >,W+J| &f%*B;56}͗ 46S*iVh9`*B}W\i rrH^mHZe{>!H|KbH!1yK5PUY;9>o~Ԍ/h59g]Xs2e)%FNFt.M3r rUN[z5~s[Vde,™(p=sX霣dxZȣYFRS2N'h8k[@BP*~�EhspzG-"P͟c �0(s:ߴ*SzROAmBPt Х[ <,lպw 2U}'l$+PḦ́\ C Q +|(@pp޴I;o=\+@ @AQ34f>h0 e3&tuuuV[!32F?eFz<|{Ͻ45c4'uxD*3NᛵNyYtQn:GB W&zN)R^4@f1 R'}> (h."ψU*YR=IƬo4#ǡpNZp;t*m]GNDWXLxmtֵ?lʯ \Ҍ;)C֐1D_Din"E4c?V _StꤠJY&,V4_|1~4}h0 h !|L4Վ=pT;Uh;=8\XI|va9iNݚ/nd.Lq=̠n{ tF0(4 B( pgĂ">L߀P0ٻNF3%  FNp}FTak&GVxmG>4Jm>`Gp׆sk\\ݔ|< 8@\j*-fGOY5<25kYߎWt&"u=fnm䇙:v02~G3ꒃF':hQ (zI~0~ty<K%x"fbX#,(dTr+ZM\voDvbhrl[&Gj3Kic]f4]w4!3iw�^KfK8YL,9Ol>y#Ɗ؎8a' 4chڅEMG /D(ޠJ+nls"I|B%9iOb|^)U%G`:UW<4p0xᅜZ � |a�Q7m3MQ#@6H黅7@$gn)p^ >P�P=8F)7S@˾wd ԯ}s�4B #1Cj(F5>s`(c@h2�D | t A`GH_/J"$ `" Mm\ԃ92}hǸRJZl[`Eī?%|JryϣH,0r5eM'(4-(ߣVzи1̹1kXE!u 6ovh˫yKVdY~CГT1/EG44j4N $elmtcˊgۨ$|<SF9T~ 3yNjź0e{0ݽ"P}ź).)Mskf\YOci'>S1ZSf1،Y=k[36\yr1⪁8 G?N0y�~ �뒆NpcP y:À� "5<Dqmq{.� v$v]Tw3o.2N鏶n_o#DRUCr-8a϶y<Bfq5bp$.]"0Ó.%4lˆەϙ õ$a7Fh33o#z6fl>3ch}ZQlJ/Dq_>EG.){,]tzˈf[q(ã3s&2QtdBgk~i6#jh|F{XX-4w|aE, eH}N0hU7_jR,/bEH2*G.HJ:h,cm9n¥x uG4`.}H,;eu6LKMeu(V$ؾE!kuԌh018b-dT Tpj_')DJӓݪGLz<4J_kkH4#V3x~N|8RWׯ]PQ\!֯ ,_}V/G|@*,^~LJ.ߵa~*2;>m�LЕJoztqSIk(} XœVnP f*΃^l%52HRsލҗ_k~ MhFT/a\+lԓg$OWؐqogA'!nʼudEƮ6Kh_^P~s/uOqGjy>|3Son "|HK?~L]fQu<&ȨH_d7+AҺ H dG?K%z<'Z,WȪW>Y(F5h{K=B!ZO~pm%,Ԟ&Ly؅Bcb=3I4,g.w }xE2凫m[H>:0S'r4S>$}o<FmE4]I揹PM0I1 !j.=t3y%ۇv 8��GI#0zHI g7X_owz1| V۠q_W?چ3.�n7%__gy/ tr ?tՀJ|X#J,105~T;B^N_( c 5:1cޡh7iy=،H႙B/ K6/Vfr/prؗ !fJ3b2|DB_Ns&~^JaӫiR wc%O&l~9 Rq>gl ^ɷK�߲Mߟ'@0B?eAHXzOc7cNg"V魱> 9ܶ':?k= yu1ᜯȗoJw;injp̵Z 3">Ddv GpZ79u5D<Si<t}k;Cֶ)i|b(Ќxac+S; �!Fr:+yݪ=;F 5H W0ܟJx0↻N?|sqcξ'd ='].qḽgӛQw Yڽ;~s⏶73 14;- o]9O]gO$~$<No7Ԭ(42�>l@n?\s\`3#0;ʉc >œL'm]-:l4bITIdԹgu)CNϭ3ap[Ta+E* #JgkIj;>D,"ɢ(r6KycYXd1EPfW3Ak{Rh9V,ĚǃG{9mEm`BI>þi4+v%"h*a}6]~%7u,iYb58?Z z8,'>,Rd'uh$Pli^7}f22`sU]h?$ۏY'q$Z.6x 9+<K))\i}?7oz'�%�4jwP%[J#)`_&4SfwKE>M2&%?چ_xWpOJ~q`' wM�Ӡ_�r0RX7` X30+1+[Q7db&Z <hYT`(sؑLQ}G,+in< }j~|v0b<ԑ7gp_:)k+,Ea)FM f)E QY6֑vz5Yх7,gZ18=u8QH�20"VEB%61c8k?:ms1E&:l]4-0dOŢ1Q̎v誜:SQGRYI X7*V9+ȘFIrh.喠˝hAzd/L.Vc i3rՠJp6Ѷ[_*M'.hE'Ħd3+NƾF 㴯]"yJf: 5*TUǞ)�V۞@_S 6β´Ƒ11s ~]`O+ݥ{Ϛ0@؆7CoJ[Å3G; 'Me~VxoW[ w={íH%y㥹^aWr{Ǧt�i7CQe}<IS^.]Vtd ѣNw5SX|Uͤosoa<MQS DHI{.ԳAinNXYlݶ9|f,WB疸x~@dj,'.AJI.z/NOzÚp„9S4t[} bc$slHYG2!Q}k>ⳏ'T_gfUr<$OÞz_6z&ppvT!Eʅ>'y+R`xT"uc|NYI&`TMop/Kƣ4Z{)* ~N#2!LżtjHðK>O"7y{V="rD%S{uH G| URGcJEDD_BWYbUN�?{mj#c _ -G,$p!S 0ʻ+oKtO9B&&3~.m,G$! `l޷hOwCkzr ?'su V1G}eI ۝J3${D]rsQCHuE,Yc %c,)z_J+cY]6̗}[M`IlE6 _O?==L蓾?]F~&rCӶ ش%QYɎxg%m\8$ <LH|j/;,>4[ofZ+Q'<)M9H -i/̒',WUHR'dCF=6 $|%IpBX)jt/uLkD3vd'mtfMRc7G6ɲyYsbC꒫J?,UZ,m&]At'KI`9[nӡkK; ikȒi<>]ǻjD"Pm7fkKH l{SLt lpu b[$ɧ讇w0^6W]&l*f=<vH֖wގ.כǀ+=TV7┳f*-�{{ú#|D2LfXh +Z亵q Ihʳ +X:) q\1gYs%*<Z@7_L'N6O<em MũxɡX0ѷ&a3aZ*Rs$Bai=f[L _! ͆)#&+ I ,b agI"\IbP҉}b\DlVrT4ͷB#'ex"P3Z죥#w2% Qid7bUq�>?4)+b:lb7ziGCij 3Y2szǶXnӄFl't -;j$";{MDx$_fjF ^D87[h3G LQ)@nٞ0Wxfe�0_FK �F$'#ӡ6BK7{>(z$] i9蟕mh|G Dd> Qny .0[a1=& ln{Aazj#OZ9Jx9tZD:9DRi5RQA-(ޮ|3lظZ6)+Of&>{dSD>;p]ҟ\6tI.LԗEB3b*Ϫ]߯uխ`lw))Sû+u%7a;6o 2ؗ$v] ;y&i^ ۥT$iG.t:v4o>=(?t|4w)ϼ2!I<6% :,0bε!d Y|-κ'"؄FQJ*qmgg??qT#_<>\,˹4`}c:l?4rqW< (ɄM? ,lĒfe?(Ҙ4ͬScݧ~xַrݫcKݪRnP͟o Ey&U mT D}\J^d�]8W{?y,p9MUc׭ʊ+iԙ^=n = I E߿(G~ P u?5�PV-Յj"\7gN-0T'LsߍxpB8 PT !{-Î Zezdl:-ehtʳzx9[M}}w'|wig[Wr7"_ХēC_4Vx&I%Xqt6u tYk/'ƦOe834rUrZ5:hcbvg~\3aR22(w1FFIb,]`Бom^NY  7Ҕfb̖/\6}ɢh^z/w5GO'.)˜1[”IB^z�� �IDATb�)H3N9 ;ܥӂƔ*Xt4WS4}NґVi>d7 3| }+g<b31 Yv]HNAa|>LXpesdY̓x/Ə{޷T`}\|by4'YMMvGfs?&IOmgӘv}qq?[7 pW 1 A5˪ 99p9Tb~{<l-R(Ov<}Hf?w!G+o}AN@=<84k` wV+ˍi�`B͆40Xb.z ?A4B~cIImgO#]-đLNQZLc8QQ�:e~Srd,$G^O!h7<r;_7q;[mVA4'Xӟg|;2kI](C}X}8d'o ƪS$./8x>gA |Ma:G{$`tg!-yN#* 0z/g$P$"h ]ׯ0>m.Ҷ4;�G=o9OFGrLK TX8#LŃ4 R-|S!4&,<R @@$ !yギa?%"0eV(??S'}[dTkR y ?qm7}¶q'hAWqVJ,)of2_*Y?IB-ì`ɧ}61)boX(=p �&;! OzjMYOG_)41.W{ xenW^.$7Y7ėQǀ~W.]�嫊Hx|ޞ^K¼o///S0~NVopY{Xѫp)W^tX�ub5Pãqy:|ΞЏM! f֎6v<;O'1d4^rțjvDO4A8eV,O%t>DG59NS N?ۃyE+H׶<UXbvLdk6vl>~4/BHb>'Q"8Y `,M<7(UY'wgk}t\q]uCoɟ5efO%3&4 mm+tU!h Rp!T688:n͈<A*&5COHe}eO2yl״oϳݙ(EEtO8U߹Hzl]%ٍIhܭ[ɬ(Z-hX#8"_duI{|$b'Vazqk25Qm'9@*m0H} e𫷻 n"vkxO 7DR8iOdTߜYf"67P0$p/}&?4~#x|{"r&7ȁ-ɷ+|JNN3 @ojz99ƺDaqq$Fϯws ow@$Γ/ QFɊZuc$ -¬$lGarC"}b2%gzVʞ<,ݫd Bߛ <&S:wZJ2Ҋ/>axb䉉Ei[֋LFSaG, PHl7%{r @rtLH p`TMU&/M]}D=' l~?,%+V(D6`Wq)0aUEVց bLۘ0E*B0"(S-OwHZJTZ{hykeIQ?oBH8cp$ɜ '4 k[qtn#s5"қ3Eӎ(RD"c蟇zhJ  46xzNVL77"W|H ̀~=$2`eߣoqO/+h$[=njc: H{׶j|en1׈2=`"pMi!HowaQ;"w=|�xG&ԕtm=�_`  hQ&-0Ǩ5"F}}{лLCG)hߙ>Qr*CrNm:;D2<VVa}$[#=-~]ˊNШ$yͨd`^JgXRTL0lx&IzJb(T9Sռ^mDN 4y>OeI#(;/wMZ:j™ܨU yȈ"x0K3&abl<QDfFяeLLF(.^N1f4ZR>ͭe& ]H <DpZLgc,aŵU<.dDr@d $#rn$dYAm Fj)\6IcMb:tm!9J;5mz,7Q,ߡ3JMnY"2KiU�$8Mq8yRj4v2Of.mn_߄6 $)/!4.~/;԰n�I^ߕ~}&&eP .tAhĸ& C_RpэAL ֧� yc�z 1o޹ķh?Or"x1apf*m (W_4-Vbs毝/HLFoJ!EbZ.l(nk*nŧHD?G_G4}L&l/qQy:M$-q3{qQ^[d8g`i֊q JAPֵrѐmVY5EӋZ϶6QǥЗ9q: ?NLC).le20i͠~TnHnk^.jPv6fd 5 K@8exJqL$D8EJ)v\]_T9L PIȐy NuBpU2*z@^OBP%ގڢ"3^iS)n�cG(q#b2mFhG.#p>`heNDQ\L͆FK]o۶mL.({7&1s6"C4Ȁ(ܜ/9tf$; Q`J07oH4$67a%0\:(bD=*A#$;${Uj[ھ~V(גgo|+ oN}�ʇ[ݷi|tB۟=z^0Nc] 85|oocb"2[vv]y9 @[ 9r$3]D)0X0?g[u VzB"t<>^|-((ZpٵQw;*6oDZ U,Zvbb`E3Ea!@0)-Byҿd yAS^M&dIO,J]HSeeP,aQZLs')K%,ymLczVYOXL 5$&;pё8JNFpx?I4ִRR5-\>#Q�Qd(*9{ĺ̎Q2R"LC^J^�$x 4CGf"JF)AlReyf$|k)TU^4J4cz2.j6.!stYQ.K$ff6r 5%f֙0dWl>"d^j}nM'4/=fXvAf2'guv`w8 >&׸Nc@E=N_>SRsϿ̠aq0jPբG@jm߀&qN_5nmU%~W#!kIwe,x`; rO;4z6St'k$#0(;z6, YGDňtS .D@ىx*\RNZ%U>Tra}8񟞸l(U7迍L$d]s^y %x,a(h%zI$q{xIGq䯣Q=,fRJp9-Y4|,!ow $9um4ᶚg4EibGBX˂1QJ{5 ,%RZ-Ֆ0-bMO(7-3Gr<v]C{FDrg,=1muƙQ%"o.xX `HhiD4c+g{[ԩA[]TɒU} `-LS G¨D| uHlZ͙c;I 3c>càgQ%ֈ'yn(uIVw䩥Oײْ(jǽT_7ƴ]KvIZC߆XB$-Bc7@@n#yy/j02klr|S#wת }#?Pa>oeM8pS:w} Ƚ-Q}/?9Eb##ۯhݷ)o{Y=PN4H{d4 Ѐb3T%a7Sn/0=d E)*`,0 (OGu| OO6>KK_3lY5YWu$n,2+yr398HO+o]itP̃LC~q|5ιT+9q4g"84ݥA;V}>?eEҠw4,]ubӑ$Rtd?@=\sabf-9k7 Ir$c4fT &"NBt?r\ӏ4 Ӭ$(0W*Hn]7Ĵ>#l-@il<#*E=s6?&}G8^qxZhjZ #W#˷A*Ocb"ȠܙO3V1J ⁱ!BdL 28DDQhIw<Ck6-2":7:SYE7Sv(<i&3¿5nǙYc@&c/0)J,oZe܎u!-oރ J޼'Ƿ{wi.Li<֯/0 ulJC3F ][ CM}d#~'k>ԄzMo䑆x+$z"KYGXIh[�D>$5t|DǺzV:z¢ )6CXM&~ƒ%DP=UXlJBVt[si#savWn*Xg=(0`>|4y;,�*uaOۏdκn쥪G#:<ؓqڌW5&f!(r,I/l9+X뾾0N4JGDRo! b lLQp3& Ε[tx:Cr-(}u11a,In)Oȷ1ԙJYcc*  SJ # q e` L KRNY$e̵FuOvcB$)Rnf5aBܽI$י-v|}rPM62QB2덴oJ=geF 5�U9BV�8YKJ pH?߽w)a7{vy1;V[e#~բ$&S)hFqN{ v7ACȋ[!4=AӪG<.o݄Wcy<̰ѐ)ca/']F  V݃=h=Pٱ 7y:՗o`([ WcG<x潇)08͏ I7MpZ=qn%!J$&�18 Z@E?<gry*G9`WΑ}=J1lxҥxmܛ^"LN"T93c|¦m=uxP~}? =^*Zt#0b_a 3s+5}+A+AamFh5o ]>jr&$xM8I>׻ץ6_ N.g.NƱ9AEU1MuN22Q!*$tG* MD^/3:fi>]&LY'Ḁ = %jt#Dy ȒxE}"/yRԁt>Fk=ikⰓLK \Q6m"1:zӄPXK˨ 3+VcKIGlG˄EDb OnZ{7`(CH\^PH.)X7LCBj!jLL)a!cدub L\f|>ten!JFL#%DT$kkZ^r;<nENZd(PDQfbKUOb߽~hkK4dYdtckCv .P#P|֏u过{�nY?�_w8b&k8>Mahln$!=\^Äi.Ytu|ޮ@P3,D%mc#w( 0@C H<*s} P@_cm^,zt64Eu߭}5T! �*L+|h:Utd_3KצkV]W<eUVY8 ܝ&f.!_OZփ W}ֱ4"I")#;Q>U/Ӝ#]ǯ^ȋ+!S}0! \zgl=/h_s?[l 9fw]HI}:sM4xF 38,a, bh7FI$c\K+%I.tNm ií'T.%HmoFQHJF) ,DOjN:B0OEA #ȴ4`*L`tMKL8 ,U6Tp2`gtdp֧#)FTܩԇv)7m&ŁͺbGwB)Qڙ!|Kw#H#R$Ɵn'@f)9mÆ=,3Xr|J/tusq8G-*uinR(,8W|Gp@ ́kt#O#P|_zOр~o `�"8 ykq[R V$)07`e b }wϟ= z#O~lN =NEMq:�4@)*&�1@% &*逃ەbE:a|Ӎ#&[tw$˴3k&8 82k"Fihkw;> PMXI'[d<ٌ7q#-uP*9\~GOO'&aJO&9kikOiߖ 6{<fAmSZOKt[T2LXl8{%ٍ=QEjrd,eH \" ~PH1qHJ ^x.Ͳ61TV7ɦ u> DϗKXkV!i$1 ,$a sI񈁤D*%q: 2#Җ0dj�� �IDAT![R,-P^F"jt6vf7H Glz$FV)qy5-rQdʍ y_f0 dwIx,ħX1vl˲$JQˢ͢M #̙1jS�S  kEL~/ftq }:ܾ3PDy#`^㩹PL[ B?o<ߋL/w/̀ m}v7d7c0/,!ofMN`o`@ �RSR &@b^~u_3LWB!cf#WWU<֠q@ߔ84b;Q2`~?MZHy+1"K4ږ !7 {ޙΏYkIʈ6L�@r�ۋE{Ll[N0|BXfAaq}h|N~˓Ii7QX}+Ur/԰{WSVp<2y hH ȭ I6xN=AڍA@2rP!x-1 NWъѤ\d;BAl}G:#hHp$6`VШS/40e,BjLdf66U9Nh cK1R%tBacѥV:-˞PuBgK[3$nhX JUrp(Cun*"S21Ґ$S]L)3ft5oئ2<ւ_wнR Z@@B 'rvQ4cq77TBy Ĉ7U�mL{?~Q_{|`2+ NnNgOǀ�ށlrޮ.ÿK?<~>jIT|wC|?1+ 8=_ab^AмvOf?R;"a3;& bS#,ը7YiP,lX^Bg iCøhs378 Nbj?#IّL5$OJ>Z)Li5]AF/64,U` WjDȸpcW`w )tI"M6F_٨ y1b6 #̲ƏBѴyi4DESo r[R3.7Ɯ&;hcpy1(gcbz m׆F=#g|"!s 2& G#9lD8̈́HH{j aQTOB9(yLc1[e:\N,֮ ۖAlt6 H,]Iu*KT~G~S<7&%kʭ١5GrDi_=$hč(/~!ۦ2&*&S mЃFLٸ@YiLbSea0CaoPB]Z]4AE!D0>V<�6#HƥK$!�(#*a@0\LᆷLZKI̠VoTH%l}P~#.Qj<u( Zo!x,z#mSߴ (%!3�7Nb(V)}5'Bqq*'b>G|| bfj5?C!18(L|nC $@x2CG*ca2QNy#4t2M 66KeO.z#%l dxf kGH^S֎ȨYgW1A6jPɵޛ.^FJmSm|Hq+X-.[}ϭÓn] nN\.#?5daVWt|kzX飕)@b:1 (*N,^ŹhG<eJG H:5%$1 랊f3 &[N Qz dFƎz8Fd%e2ik[)?1]M;&K筣lb`aJLb"NxF㇜jh$ɧ};+5l+8\m<o$&sߍn {87E\.+^A_;^~U}969|wp;EmeDfv5]b ~ zo)5Ң`+wxKނD~Dg"܍xe 3܆48�u^ۺy?MjG% T{?#Nbk>T(8<Z1`O$�IsBCwG�!#`8G2cKU33nҪab]9^~2 SO4\.0Y|ޫ,'Nvr8{uӤ_=&ST/rMlow;Sn>?hK |k).%غwTw[em#Mͯn,?iL01Ty2}ݜYGt$؂o/dӓ]OAO[I?Dt*Ji~0Ygcdjk*"q N&6RIdICB<v-t36R&Z3XF} a`s@#AEOb@F8U2M%D''UxH 1DfVL dtcuHJ"`d Iה m0N$2iB4d?2dILP/wIBDʬՆ ɫrq"E==hfw=BӸnrwWɔf8ь׬4Й?N)ldmO1|Qģbܽ�L]"q1�>Ki_cXlX� P5:0&s-ݾ=_5Ơ1aTЭH;-w?-HA1`13+Gtg$lXF 1ϊɣ&sv*V o_ p<7w7*zF>)�qi]"(,'b"IHrؽݬnoдX 8"0V *'*pL!5i0ssm8s7@ˣްErHM*%/$dMyDC.U<b*w>3%6?GYWm;eGחu_HaOB$f6;COy9]6[yaGNx9i{c@yU㑳ӃRl)*LK pPLCi$0坠%BR!¡J)73 @]41\@lDf]v5i޸ܨ6*B�ڎtKhH% �chTV*G%sO]mNX ;,T h\kTbhH'*㚉q1xPy˝`�;d9HYj*O0]pZ}܆]oIM ] =DċQ}+ 5xT`N0(L1gj>? ņp=hG6�5>+lnݛ܌3y3-JF6;fA  C/F+7Oco = ` l;`"KX0?)EAG#b`7l~SFDO,<%/o.>>, 瘯ݭl _YȺK1r*)SHs?a؀0+q5l-NX}V"|oe{2^Se  \a-IuV<\Ky-.0&J"(,Wn[U֛e8zWxN2N 7mI' l2,:'KlȓO_GRfrb^\U6joƋhoa=n~\gX,_N?p24Ϛp5T$d,zRr.uhcɰg1cH`Lb\)Sl͉QdI.(t&-9ildTW@m$"*NspcCqcR޳sSIk c&JD$3 bJ)- pȄMbZ6}_֌Rˤ8^5՘ ! N`+tizh&]\Ih|#o.+\6&T4M3=2*umg (.9*ƪ^Zƽz;?aИZ']osD!Wͪn h)=Qv[@pz@@N.ͭЙ!~ґS`d'|^A/m4;=wG*dJ~@⾰ݟ)M\5> ? )D~"N[2M ˙IO[K8`|hOvoR�N?E; Rn*� v[QT/! 0oQg MX5[.ZUlvD>f@ n0gToAę6c,_L kG<r3fB.;DEߑD +j`quY^f,&'Z ,L(/ËOם18$R:Z6Ls_t:%pOx1RvWoUC#X,fFH)4Ee" JeՠA9q[A!aqޏ F9.B&<'SEZx@)3LhB 7 pGhӔ g^{ʣVsi28KhK&\P0"\F'gLӔ1`1:z孤\ $q(C^Ar8 xRt!uӅYv;r11l3~ha$G1M̤b2Zlz u=E~ˎgivʒXf;B3f<l)}?k&N.$Lw({{rjls?<x>뎺- 9 16_9 ΁;8-nVۈt }3 0.p+;iM70߷~6dh ;Ə? kzjK4aGg4}[ MjmO6o]$PA D}? d.g ^B<gHR ^AW_O q;dBe珠V.M ٧x49|n^kC:uj#_`CSR Z҄3.ePSDD3o|njq%';,_\=(-IGn ^S#K93l_tN(:cn6U+"ii;3Wy%M|GR:FӉ�~`IuTi%bc<. A\:P2M`HpB֬P0 X ms s"(S2툌bF1D l,%R*15腢Fzb%:DD" T$)<!0)(a , ~.HdLtHR)X"(qQ=6rQhyBDƭ8XIZփH l=KIH!ؔK)fF&#booR %bgz/VYfˁ='P8q*ћ^ȋŋ7:v>rӍg`dW~rt?g{U[C6k25Ր"&l_Nbq܁$-b0 yppPCn>эF#R�Vob&r=ޗ팷Z`R.݃� k@_frP#;<t?cc_${{?  . iS!md!6ÁB~4`�Ȁ0pȦl<B)Ơ( ?'Ջm|x!<^E@&Pxzf2w+.Wϻ~}=cqO3!>:Eqhßwm"YU$R5^]FbGU͚)?Wɹ4AM=Z_{{{\_cahY򱱶hF e|!~-Ҙ<"aF q}ԙIRT!'ij#]4}A9]0_Ґ #k[tSeL܁-K҄EZXr ɹ氞șgR16 RG%b�gљȽ> Ra"8{@i`^(8!4exSt^P=Q!ZqXG0B$%Di`y ha,<,hsyZ|]KK .*TiHFޓmm&fcy4Tx)vܣXb&'8JY 6el:ƅr;j|p'Ǽ?)ۖ�Yv67PϱHBL_ q]cB, ,ʚ -}vlή5*Bbս3ҷ\.{X& 2"4S@�gBf׀a0"A@fo1',6q|.Z6�ـ3t�񩘮(SrLYW2{ְjpruJS?=9*;L?\uS3.p U@@:tk>YqQsrHĬӞ::U~>-'k]~\ŭguׄHomWxٱn )3b(Cҫk6j2⬯w<BUnߴ\Rԅ^PN-i/b*0'VЅ#,֋D$c|FU5OP ^R"6VftGOʋĖvvNƘFi3!PUh:I'` ڠ81Z || ƋI$iAŠ<aZ<|HdRʌgE)!FISĀHGL N#D ay˭'1B3bGiaI bJ%"m$mE0qp]as^>"Ȥh.tzdxk,!2ulRf] .e4W׶}FRӐFib4]n*U" @Ȑ,k:L-56lƠ{G>Bf0rS߬l0S>`fFw~ mz4zS:|N?P}v(Lٌc6PFvUlIHzRDB76YY`Lu>8#pfABcad$"gٷgn[حaA^piiSȀpgU[C._Q,U.~AFk[56Ðks6$yVqG/+V ò@U).)'8 iMO<g<=t86>a 2s5?ꖟ·NӔLzVԹzK3/>earrF!Mh`#19d ô1Bȕ6IvbV[f/}(F֦yIe:5fE>3%}N6~dti%Idzٔ$@$Z8k3Չ<* v ,' <v煳cMBQ"oLR DO,1.�� �IDATq.D)3FF8|NI 2i"FC$} 9ITz<#%xI)"8)8ec:u#;^}ͼ鄥z^#2<Y4`ާ\cы6 9;)·@j-64cjbD2pVZe^LH ` ͩk@6ze7Xb`uHV#7P@A%kۡ�Us)7oC v)ocSiww<~ P{^{U?6IP;\ymon:nqJr>ړqWSNg~` >>$-gr j Sp xz6=ib5W+SF`VZr<'xu HEZ �8^nDպp žΪmT~cf:~qno^M>~x.myF$5+gҗ>c.|zr*ύka.|{}oGkT&!Gqye}~#.Ԑedd0XYNkbjr^Bݪa?k)o${h>4!3[}$h11;x]~L"&ͶjInzeadqK|I"'ZNw<VbF"49^hFwD\2XGS6(I2͠ (E#:uY5'EӜH8vto- S)4 I#41ZϹ%9X;DgCB&) ,BHIr(k412"D@C8Be$b9'R𔪊a@m �բWT%D0Xe9!(uo!1lSn9!bٸ4DfNƌ.EV 6Ω`mwtme;H3a_$<IBUHX-Y))fBmlζzwb0(J@o�89Nncy �s ŋ)_>6apzq ЛmG1P]B>dy;YnoV7R`xh}Gm`C{p�doAx)G{+Գoh&y*  @�!|昂0I@%NA˭\`l閪6�@H1=Vf o_,oHS]18-bf[Dv L5~ 9']=+ǽ,0?#G(LAowV:ĩ܇*ɤd0ggȷٳ<%~=TF\OR$FKf鮵l&Iܘ W=L4];NNY߶_4q*pH/E\o&i?$'jS& T.$ɂTkX;9 eR@$U+HΧfMЈaT!R"h"bw7j[ &( A<1EE=aDc ! $XhnAFDLڮ7Ԍ3u>AI88"#<(DYP&"SQcF #a]A9LP`�L1)q`Oh'Yid0&#j]c$=թZYd q= a)ɢD'VxܛymF ]7%чmZK.qp\jם:>\v]⢙fP`?`QG50� #ͦ (}!ӡzͰ 1޼ iwٟ]Gڈf~qS%ݞX~$N-톷O_Y)g~|2-5з߿vkv:|J �-(ژakU" z s `��Rrmėsz|Z%7NHgs }OPhR |lsn55M4sS~;N܏q}=/Od UJ)tr=1#%2QU/37ʮ֙N#d(*Y]BC?'?5ڀ vWI5H,Ȍt}"3$EJREE=֪ltya[ "`ۙZɼKtLGlمg"4mdDŃ++I{4<'iJD~xS{j|T<o>hTNvEbkw_|L񸝪%[ 7SkW-Xh{̼.H0fDs:WKN^)h !'9T۪E0.(8mlH 22&ƆFʐM,!X!ejot0|a@1HYymVF(SvȑD"LK6Gn'7i.2ɉdQ4I*&UV!), $cNDN 1ȉy9s&J 1) e^Y@}L^q+il> !&'RZ1s!(c}&јrD3ѝ dᗶ?3Vug+5W~$oj}f9"�7'{<8 ;0s5Rc{n�>Ľ_>w^-<0룷qyO u@߀N  Ȧ9v߶Ϫ ҬNH 'JGZ#AIIGʤWuċFa3 Q3(cy7r%Ӈ~E8{[({|l~Xd6>7K*"^T|ᭂl%Ai%]mGQ/CߘҼ)u.v50LBV/IB(幈?B�MFmp]g6Ƶ/ D"hIkU up wП< ?ݮ6~G]=bOQ4Zjhlœ_sR|b6ɨe. 4R`L҂ 9~4|,q˖BH^jtR$)M9B"j#\Q]U0Pܓʒ5+A2zL<DY&]I=eBFI`(CeN)^Ҩ 퉹Tsa< 2lsО4uAF$BLs%Qr1!e`9d2܈%kʅM ap{YK(R#sGU̬F }܏oF>3ĂF';VjT*ۻC`р/b*b\Ta6aiٰ>d]X,'٩$"]yd 169,c^=/w/Ϸ�b{~/B]Abu<:ϡfixo^ť#9دk^ӻ6ܣNJu}= ~x4~ߍy8h'GW[7H0 ReFF )Vrg,tџ4piJ)o?ޠRLUvܴC]kB=Gm*DZ{zs[VU5_eXzBl&7!�t/|)BJ-VF}Vm]A2nNn)z >))K\cZ%5UK++^tS^Y'w41|Dz3]*m"FoxCeApbQ(.O3t V<M֡݋TJVm)þvrVޖe]IGݸ9wkJ-}Z-ֈҢCME]Aοe t@Y%D)gBEŪuqij:22x7bu.iXj ^,3Z%%t R2AW1LLLO`ǔx&,l*xÂrJGCĤ89uɢIpEG晘%"YO$YT\VL2XRa(HR( b!!Zb MycI6 %\L.f+O3ec`͙Y.$76 5pϋf%Yl⨙.Xٌa<LDT2樖\5M6:lfD:M|-_Âh{m(_ƳP$|5k%F͏:u(ة.M\.[Gp>́[{|<e�GZ}£Kyw/@ @ghNBq#9yxcJHƟUv1HX GG8ja<F`Jmm`(2WKWu5|pZ|/\Md9QG%]l_RopNخȑ/iz |^VXyB޴=AXͽN}$UF*ϒzOLbo7j'` m ,Z/O0A)'g*|.E]N%7jҦew,IaY? jd3I6 cv(as|jM6;y/5 Âɵ0 qcŵ+�q5¼Y)DYȮ&ʢТɬo+T=hVOOy\#$뒷ija\$cU5l*JQVLw s!&i*&,9zm}'슔EdN%Y's"jNDqϙ q IPp1@:Œ*&M"EI3.8csÙA4�(S\RFy2Ky]<Ma$D@bNIikef= N6T,TIF<4R:h*_W Wn4i4v$$U1~»9^?UxTy`Md؅8ڰնhmy (Hē�~`-qy \A^Ը.z}.}q0Nh -}?K8+hq<u:d;TW;u_b^g֯77};%WꝇߘW5{ iķ?E7 㫰,Q^yǀc:>w0KgQq-V[?*t<ܜ<VV}$ʣRՓ3g <(w5|y6$}r'ӏdt}b}4FArlͰD} UlN7IVk:CSW_<+吩(3†"cvo4&h?阎BiMcpe LՒi;γW[z.ݒUgWRԋR>7~BcUhl֢k-#7kKE^OS1`NZY!Mו)EBv!aI4Wal&۠ X9ޑ(Y]oPRfKQR GK.ViXRf1 !k-%xtYΜTLzS@-d00sJ , F>LG2Y 2Q PbଏrA1[ x \92ZA_ݡ䩩jfEBq"db hΕڐD))sJw/b!9$ss3I,""ˌ8|1^"ވ9zvaOe҈DQV+zs4g BwU5P*hKl_SbZ/cuC8cC{y&pGUX\ZfGs՝Ζg@glguhy6o9< zr^Ng|4C|*b'_2tp9-(^5ѷo~}o~o7S;Z^h=~z?ksƿ/Bus _tFT ڥ A|t`F_i/?g6},˒bKkV8:y9_:^WR-p4B%)/ARR5ե63,c"⤪m/9P+ fնY=nMTBl}_z,j%V{si6^tŞwqHw9Pn͵+ ==XW;:SfK7p留c<^+3u8AV?5G" xœ9>qK\:n6`DuD,U_~ƲN3?jrUFTGy6AY+*2Lgcb,� %\2e4�㐓q9M1扤φۜ= +g>n^c6֫dSS9$?ŃyF궭u ^2fU\wREң8ȴ[ RJ%b@N"sFQF\ Pp !2T#b&뢍**i$XHELɅWLb\dMslvs3LqT,r`"BqLC'UE^0ȧ}bS4zd ˌsn%E/'qܥbZxh~w7i@=ElT<+?-$P1 n5t܍cwz|WM!7yDp 4 *$` Tw F7;}7o{>m?3I6#-1v,=ӌabNh&nRo0#kӸy !z,XjdL qUY#+>zû7a9!zT¹ɲel=OD}嬚xrbBN 'K>f1$ϛ$ 5!~rׯ.n4ղ;)VZ3v=m eQOWN_nl.>pĉsʮh^| k?i[>W/H??lĶP[.s8'uX#;n[}v5sz+w0\ %5B8- U%ӀL 9$|#ˮ2h^Y E.hdb{)g`)r%#y0bH NJO ȪHnjyHY(!Y"*T}Aa{Ear` R)c$gD]DP֯,iD0z7h\Üd)9#1 C0dp3 Y Q 2{ǔd]%*q%b"4I?Jpڇ;4cDBEm&cܒd.3bc#̝}a_R!g)I&4RDl7z)bcRc`2(vhkV᪊% #F.XyM*=چ[ z E|ߥSlA_7>,wSsvo[yw2~{h?�[oϟp r&ћ_x|<[{a6Mõ~b $_ l� 断\|SO[^d<U#}, WtJ11�aB| Ri?i3)Mi桔Yڵn"%=ۛ@\V{]Ⰳ<PIHI;Pq|YWF!ץ$,7$V)H%;xh&X{W뱸}tֹXf705ב}'5),WB<ߨX=1#ׅ c#}?rOdRV"\v�*'ϝbTRIfXҊ47d[ Ki}NLcZH"znBuƗ|6 p^L42g>{cEv%'#VԍsHBT�� �IDAT)Z[8qnT2<Q#dNǔM+$M o 5yrBp3YJj 8AH]Q$} :܂b�c<Qe2k;d5B:LAFȌ4SA2<&={ŕ)0`,E>m4Tj$ xp)AءJu4ݠ_x I#bLl~NiIl>noo׊VGW?EܾAm77yumnF|3j_ (oD|| D{ }#z@ww4>}m!|雎A/oZd<s$cAy'@UKK'=*`Qs =w{|9Uh"_^s?#ۤV[)f W|.]dt ;Tih_\2;f">d 9?r |<:*K6):ڝwrEM". MsVc7jn>t߀ kj"qՅtg\Dj2Bmh3:U:u]z;{෬9%bNZ͓MsOwEBu}Q[Aj]/f V!mPF?,.3-We(cPC<ҡiJɒ2 Ooô[gjydlhM궨j]r/g)\:ddjJ(9v<Lβ,sw<e*ɼ`J$>쥖57)<d3Ww ]/Bgn4E*מ!T(F^] !jј:<2DLF I\Hp9 0&)đ$rx29H0KT 2� XsMe 2yiWݑHQETMJV܄~f6́ԔR8ەtͥvj,,URrHX{_L=_i^7V~UU< 4wY/U7V^-*vvq֯#; HN9_{l+{8إ�@|ߓ񭌵[A/~tXux+`9q}oY~D5g~>0戦�=$P|g8pG.E^K8#l탻6l7~hoT R{5_ALQ?LK 3cs Yf|q|.Ҵ| G{}_;Mv`yslJlQ8&Gr7ջ><܄A pO9xq]yrZNng$2nC|.Xn! =̔"6 ~zh'˼XMWhypaJRԏE\KsaM*{565g#0R1CuD0m]YYdsdgFU(h15#}=;~Z,ĚB+i ZP Ȝn RHPI>2PBPTȑn%Q'2EͩA9Ɛ}JޘF7X @prÕjyl Ҋ 2rqƜ7 :Qf/T<0O!]m1$(RZr*=K9 $H ,RtW,p Ye+$'b"@%D.f2:(pPJf}538p5aa5y*:T=|NƃǨ>}w9\7izUraaM;fsS^'w~_G 7WԮJmV7[<L?$`dT3҅}# W0:V[˚{#l&ϟ7Iל_6?!In}u|)*`oBq$}ǞM/oY]Gsd%zX/>#p% NĻ!g/;/>pJt%ظ"Zp}޿ËZ3ҵ .g$ 7f{ |y _~q@߬oB :8x8lMWܭYV&<njp֏,L%׫$?Y[QlP@:R)% 0Zc XC+w-ASt$XSc^2ֺ))RyS.HHylcbua͇%/>h U]FE*#11"0.EKBYnX^DPL8R,Fc2 U(sQ,T({Y]тHY9fRT\r&L‰ȘfJ8W\8RWMϞ1]@pL1BKpM,<͊sV+㒓�sR) $ ʚFO.B^,hVEє>b3LT?S`!\: B Xga|!laJe#Q!RŃDWh+R}ᆱb. Qr-nP�CFx EplqPa5;ë?&x�,K`e菰Z{vA�-p#!�~);>(O6Xo@M_g]G?6WKH ݷNQwtkiK ШP]]UZzȡ]�b~q׵/Mjy_//r+ߏX2xhi=)(ڡ ,Rg �w]n4^()v4`Ӣi?aLފ8(j5< *Tb<h_)E [!N}`K _QѫUxbRRzQ8W< b}D_z5lVSQb2]O޴}:Am>=mK5)vV+M&T&y-?צ[a \p@.鎯_0]d_�o,KH0΃̘щJH)9 :- MEtNF{&cbUH,q%Ȇj"k#>Ӝ'1>Rjqm\iW39Kp)08dJ%g9Rp Tf� .ZULEH<B 3Cȉ"s]$`<"Q I$<Rd,9/]PeR'cL-UƐsnl)z!Q!2 begr)yiڲLnOʹoϽqzYMBUL.bXFnY>lUw!xm#RXj.q9n;=Q} _s+nUU `roUH@j{[9 w?xC~v۝+R׽ ^K ��./^k-^^<?- `'ֆh[nо2<ۻ gË|+^4O?7Z?kZv$֟o^wz+EPSdBȇ#.8ӋU/:Ni=>uwq#wv-:OȃI_4ETSLlzVA*?۰k%ZyDpE?vMYSMox~? kXq`ϳ~/62q~TM{<C<E&%%s2r\U(5 RCCfF6?{Wl_W8C8hrHNC^q%r+Be?5Vu,Zq+R_mLA]L)B7/[UL0H)3A´9˙0lnޅHpwa] "3$%&*h0RIXJ<BsHt7)*ʓC"�a$GƤDfQlyHP4JHW6'cȳ0IlI."2SdEy.J}J}L+%(gqc \)BE9lS63o0[&(UHMbU)0ufm5Ңe=خXRG>iJ|S)Vaekp_,Ty`Q\\J}</PPkUg"4SO?/?_5+`|e (#`Qְ%NN#Gg.5;0 3+<�;S·,]I@v۾oޟp2пbBx¨z*O+ R|?4W${YBsèR' oi[*CQ;^|X%ŅZ/ZobYMS hzk Z],gJ{5&wf앝m̻# CFV]_psO#VE'a،E۟O/骏 S&l/S,e>..!fWS>۲89_v%UDES%Tޅ?H.*W xĉg^sFןkZmXs^v7}ʼn)+ ej*wBO %ʚxǍ槎hbE>Z~dR!G7kUFdqt'ygnuA!i\ !T <$H*YpO)'EYdUJRv4YX$0Kv$EIL$ŸTd�d E)O.iڥOBՆ+lɓ:D>޸}3<:DQUM1!D9v]GOӐ])Q'w2(*SbeT)�Fh)9qZ˺E<G?.eN'1/RHJHb+rɩ\xkU'|?deq^<lnl\1/)J;.bѣJC]Tkl8�=vH?| /y2 }oxI&gDzZ32w >}>?@cI?_6q-ُ>HKf�נj,F)u^#M_ٚfÏSq1OR]'~J(KÛR:wcb<5s~ͧjL#{Nsé0ZxP&Ki.,Cqy`6-l]Sbwbf[\AxWlhY><Έ?LPg"Wj44粱Й~vg3Pbq$'' A\υCS@9.T?|_ JwI>!nF>K}i"6v5sc]cUS]l曆YX`{/kuҵeҲ} mǣ8-ŷB?r<Գ. I=\5*S�fJ^hd{ےy;;+ڋTU<qIHϚC2@B"|BZrx-dx,I'ĂXbI$6l P 'IJA!)D;=쬼ѢtG>lDX.|?Qe8fT N9IA*8B{/Kps' bTB! ȱ1 i 9\.&HFʉ8|U]:H7[9H,ҧ2J%5#]Q"k'{Rlί9M.U5|QQƯ>(h 7ۛ5˙]Wb3SNCEZl%;Bp?-u[E@fܛ×tf?D&̋Y{ˎJf4C*t//Ďk2yBp[w=0|�;/ {k~7@#h[gyv {V&[ӛꌇ6=7L> }?NMo[V9лÓŃO7hSO<M iywˎAcSRbUl]e8WGc#0e(Y'7_6jz6q'·03xhvXM{>Q)X8˨ճu5^}vla80<ūJݱM-reUڪ" cu 8usZژNկri*4&&ObO0IQ.Ɩc*)_ƝD \'joP;bfS8 mTS,q/q3n=7zۀxURƨR(KQ Ek+<1Eh"iC"dAY)k4FD͹բdp\֖"RHu6E2mҖhU)ɐ(1̱xhht%eAS!sf$/erN٧Y+# n\F3?y`E I" tD ~~5gK"q]Fk5Ž9*Asn bdaW:^ZK6dי"-/bwB1VrULIc0rJtKr+_̍eO ~9(9\Sd{ě!)onҍ0|恴y%KY6~Y0Nט;s<z,6=gDK_kH T�80|O3lЏ{xQ{�Z~Y7?fSpP`޹K#e3{c7`خZ7jxرX -rle+]Xgta;TDzpgr]A\}{*svd:PdVK)^B9JZ E]ZJ,wETHJ@co;ڽ>d6rieʧԒ1qvws[Xqu=&#nѯOf~⇢9UiNĢrD,[nlu~;F%%hn*kfࡵC&MB;<3xd^Hsa䲦~qg]VviDZRB 3O] PQ2*$+3iHƢ�1.1$dԌ C-fQ\K!K\yJ!8Gڬev b +I JRf0!`&Id)1,,|)re5CM!,AcI>ZaV<C%;k&xTb$HDҡRje BL)9IpntDxRKއnT!n>WYzmq<2Lia _ J+vI.!x?JA;x& v{ v7e k{ 31d wӲoASq:'Q{ρ]Bߧ_/GAu}8x8T~9_C,0ߖϼ ft?~ibYN;_,_*% e{.Bmi̹Y;>7PV$?Fsvzw0/PAi+i}IOU/JK׫iU߫<+;=6fuAD; 攏Mٔdד v+ޭN56m~`V1juAQTؑ˒(gnT4r}P߇_EǰoWRc:沫1+w\fӝ+I)vrլ.FV&*,H*�� �IDATRb|7/]Js.<(6)1D<̓&G?vXQ&ɗDq.b񎗔X<eJ&cj8YOicsJI %c)!,y<13֊Ϧd3uu..fHؔOsJ;ga4G9UFn#7vUh*Țg&9KJF"8\Ay&Qʁх8!B%r�I8()E/ 'V12ӋqX+%.PktA\@H hʔcNb-$J)Ms.3s<˲(1;_]kPe[M"4|i,glI];͸g}1Rj,b5noh w1z`� wS5p=&w_S1܃ޮ|lܮ^CNEazx{Cн$T{L(x9T<ģC',ǧ ֥7nlemڿ[Ijlr{YS j==3T]B{_2OMbaHZ|;M)dX3'#1}lpS̝+-$/YUm" DydVtV.nuW߭m[?gCRR(Vvaefai[h7iMH e4V.?TKU\JY%uPZIa+bQj>OH4sSӖ?I? m"Tyَg,ĒK%DĬ"tH4rMrzk3[&Ng#R|XS]S Ѕƺ dȼnY6ddS]JC9DF·r]B^r*Bl"!˱k9V9 sF,IK\b̲[tdwu^C p$Y%b 9 \k?Ƽ)%ƜcκΓ\dƓO,d&n-8uq}f9,kObjr(NN- (9\(v4+a$YseӲ JɊ 2Ň<s1iW0U!/aW_\3pVp}4irXLL~6 W'{t!w]d[,OO6yԟ#=y={*([dߨ=PX?|=~-fuV~]9-*^nFǡ6R7yS;n Do r kÇJ׊÷ AP4CÃ?,8Y .UjG_qsΎ}Ω1̈N3N5an^W]|#k՗+fI~ȱ5xќʬO_}|9YYuR!]͸;I% ]2P4&˛Ll>O5OIݚV&$/PYsJr3͇t> UH"Vie眈IY')oĚ;&/gPcLbsB%VwW6[%fh4l`*E'מ?pbIv[ [oxN%B>D$X<(LS<DeZ)d[KVNI($0V*@K^/pܐ g$3E+JfF%ŕ/s))5#Eyu"h %ObnL*V"&&k٬d:bԙ K%q_-!U|Qe-YR4pqM)E!IJڍsDrG'JP6Tɥ!Ea6<3L +Vg=Jrm&HJA md'ɧ) }8{%)'-|S( ?S؟d<3jcjv'.hoM~u8a1Y ~_&La!GE-35[ ͇ݙ WVbnD?UUpK! &zvYws]!=F \wO=@[xXqvٷW<G}OaBML3ngʷ;mS@/&}2ܝaz=->`nKekj^ñ/EjMhrq, &^y-9.[$<}(\6m9zʚ_VpHKỏw|eݺA|7"J'۰ԗHkvYmp./;t]5„DMe~S^ g+KgQ%[/vuY3a9,iOSNΧ53B-uXe.~zqU_6!Rwi嶮; i/q(UYO>>3W΅$Oҳlɢ̔*%%,6-|IFIET񖸮"IB(S )g*F9 \l7\L=eBiI+L>2x9Y2+K餼zWt3k^9-qJBII A %q\rr Tq .G%hJm/5\DqG|pR 2g:bF\a^29Bk;6FT+)j# gLF͖pcXrr5EJR$ߨzىj!HS?4سήAܹO.Ef>3xtWY}NSYcL>گ;|Q/M1S 5 �Uc _Uڵy:�B~ RCs/_$q\;=0\4H1ulxˏ!{qϢScP{/kJzaAM* g4W)[52N}NH8Kd/Syۋ;k>u!@ {KO>UEKh/%1!wCb//>AwQbc~ˋqޜ=`v6ʯcro.;sq K/ا u:61T;2Rݹx yZ!KY 8g_RH`!0ŴY׵(%$v6ܫ oZ]dxyHMLwQZGj #juJK ]NBplvsߞ'V+˺JgKNWWjэ&Ct`8%dPĬ`뼪D U^Űl"e1A"sT"n#kSI\ǰ $GTȅsj+J53!JOĜJD%ϥ$SY%TuZ.\8J296:$"p$23?(9 ϱ)яrdNiVX[BXČcG?z #Be~)'bNKT0,Xpe 1WB &I;_$q#eOb",S9b'[5GM+KioVt썽s7.Ely.ו_/HVgL·ٺ(| nssw yѝ`iX\W- nbVKz|$6`ǯE{ H;8B3w0>n >>GCA=YR36cjc80G"[ǔq&@�->E 8Jq�B8;{ӗoExd*!gAQp!?-*c>r/ oļ2 `7.  ..$(u/QT޲:mٰ}YjS,Θ#S6{Miӌfe,ipbwH(I!nHaڊŋtF$ߵ&^!}۶˺T;lܨUFջ$Ra1"궮WlR3-~OH<EM-Tn,7aϾM/b"M1UQmjQCBJFBk])FMvb%ZJƕ! 9b)NTBLKR- K60b>>Ce la1$}7|9M Vx9.)20ALlJw1Mw(IDBip?;? TwmSe%%S#,D: J2AaJGIdL;V%9>..KZsȺ0A^1Wr>|IJvFtser2kZٗTpEYʱ]87ww<!-cY0~8T<ՅX?+lj{f@sMzqW!kSK9 cJLo;ԭѻD<>;:C̏Ly vwIA;P~o=(]S27.NObqu HGVA{{TVAjݛt&?^诞PSC_A H(t tn| x&lvyӃ}.~tJ;_}!8oa>WA~͋% YFOsUˊɨF`E4y_/ _Y j:icb+{C*Sw<�5 !Ub*]?N׳GԂd1UEn 9[.e2EG̞MպR!}vW7L4tT*OAk}a֫jeۆTФ:UU\tH! 7H#7`|H/`@ۭUҌ*ŧ8�6TlKD,lY_I[SZCl_|F[E"T\/Q1 iѢRc*0Li> C恅"s$BKMZ E/E.\)d2֑ⅾ8 4,:8-Y2i<aq`NZ#D tf=ˡLqsc΢>"= Cͥp!E&RP!~faݶyp$`ŽRɤi\Z+P)s3A(CL\03͹"[EJ9K^)-dTf Q~&җc۰[jba<7PR :0y׍Ɩ"ȩ=I�x] |Ȭ)J<o.@|uZ!<F0 `i%0/ x֢+cHoa}1 a{-_RkB�X!3I�cl0?n^HD?=|k+?<jh~w5&`.xǧOa{ ?1V8܅l^Uz5g`ZbxrssƘ0_mӥՅ(ŐK<,wh}*1fXWFV8Oj/y[{,咜czvu+֞P1Y됰�p$qT(E좮#KK<LtR RB̗$S˂V̥gì7k[zbun"T"MUѱfExZ!*X�.-+(U[W4{7خf&SI'QR9LKtŧ`itZnKRU ꦏ/{Fk9يJpNJ &IEͲ^A0 ih%th)yƃs5 M3<)\ZL$3J V´: Bf=-eS!U<]*ZԦMm$mx!DJ\F<F*bl׆W)BTfeH)RM\HQT)c,"X!Ҹ V2<( U\pF<(U M|JhNA8{L!1ʥblBhDkGݩL֙<Oj6 q','.}ŇK徚L&@Ήz7uӫ9q/ʯiɗ|VB\jg̨ BZM`ުS�<6p: 7ȱmϨZtԀ{CozUw]i�[B��(?<XH['^Q[2þh ?H ?HO ߖÇG=]a=f \0]o�Vtlo<ok0Z0[ǘ00qN/{^sެq̳k~Cͦc'WoC{.:ƪZeWNj5=5`4G&lR[\c֧ZE^XsZ*Qs9X8%F+EEF䦝gؽ;UR8eeRȊJJ.\Ჱ]:) AJ 2g4W\7 ݃'/z4]ny 㤒v 3Ϣ87sYRlB9Zk m8od,{Y0irIsLB+HQ$aZxt{E4.vz]V2^)hUǡtEZX) 3yN(jU"38mǨgD$`&"h- E,sIe!9C(j@$%\2(P&"!D,(ʗUJy7\JX!J%X)r6<e$ !Qt3gEX5Ech&UG?L3:s2G+?tҩ]>kse#O/{uTj~`Ņzn^@OaOXz:ϩp!67(�zljO%TG(`uzIn:Ί\?r?H<?b{e~vᣯ! /?3z kMcߟs Ӧ}96| ̟ဌ7«c6CduKK'K]+i݋pGm˔C^Tc~"3\d"ڋn+z ^ݝ?)Hd=bS!TJWό %6>mD %Zԝ]N0*ߌYN0Ocy2I]d]iiba!gfd.pPVuR d[x&8 fYwl%[K&�+ATa)Ŭ l@7(U,oE-K(1(+c'UD<e+m*bKKtHt(m2 ô)Fx,)3eP(6Ry  trqy1PUe{I^w]~ ĵWf,Y%N+OyiDZc{r))(.5"<q0$υBcc8\B.i3O�K @ L y9S L$'͞ cmAIU*OKp.\ ל!C MAPE)HyY(ZIMJ<ӊ&gϧ~J*/r'!]f^? 7) B髫ZW_7؞пz^e)SewNVy0fe-άּeow>']N<}o!w^|G.ǤkmH-U?hnm7>]8N V8S]{2~@ ^*\w4>5 x{Y=,1\i?e"5݅o6Jݰ{ƌBk,<TmZ  2$JQ_Z nPgٓ/LYT$~'rƻdKtp9@Eh.|DKم:&침R. hʊŅS6&bٻR)NdukTMђ, )J"8[Y2*GY*^lV0A~@ B⦘oP@݊URB>1mA)xgI-dRP@δ'DJEe%2@[[F# 9%LL0Cm-MF6js@2:p$J%DvIb甚ƅO0ONy8,8)a.*BwX?�� �IDATFeȫ, ^P$e$%B<i.aI39U}h̬,BىUHsٗ@2C(e%9.0 'WxgĢrV0<^<?{cY\m=oID!W>S>z6L=yRBwPb:tlׁ>>}F\;/ZXF Z)0GU|LOz�H!?<౹1W?wc￧!i@|#Hͻ=ncfџ~z j5m~v/Y% t Z'_O?}-.1Gqݑw^lu[X^/wtO@:({*m2~+Y3|SGz<~'&[:tqXAkU+>t_z?#&WepX*kQ`r^j1%Ɉb YbC!_Ġ|V1dc"6;oXhKPjSPlH(YQ 1͈G.LſI|fbN3HB(hCfr.˄2\4Of_iEÌ% z {Fvs W:fO҉l7Wۤ$ەS .O,_4Lcq~$!eYۛKr^9EI]Q0/3?P5Y7 mWPA18PwEfL0i B1/%H*!&qHz)?O|MndZs4+HVg0&JdI2=b& Hse%ry"]iǼsFR$Ē \ qsD}QڮJR1azN%}}u)GKW&2E&wO$ ?p_+탣2R Mck!M7&ϛ}'VX;I>z8}Z -{|^Q@zc{|XcZx>X>gv.0* U>B㷻N�Gթgmz]֣@3Z݉ph<ED`7NĩQz|˜_ C`͕WE\z =#^qג_O_֏ an>.jrW՚:yE>wնqS/f6k۳N|/ğY v"ҥVR&~R $Ef N|CB b"12(ie; T"yf! ,%&aXHLaN'*7|R|,@R $c^j "!p0Li99N7]U S\^[X#jNDRճ Cfn8 erS81)AǛyϾYBwS$,lqR%)ISH}g b,%3OV<1sb8?r^\V/٧DK{<54"QˤeNa.jEI3y%48%%EcV4ABhՙF #BγGw#y lm4תQ\D19%IYi9(FdT Τ?oo#ّ #:Yͣ)iGFv/ vZi%[dbU;4P&wz>%"E<H(tz&K_ yPNjU:\l=VlB ЉWL<.Lzt nÁϊ[og߶w~ 鳯mkby� <3�[�:#@@e1#x�A<E#�@OC9toxގl< a?0: -4{tV1WʚF nt �@`��+_��i5T�1V=돯~l:{SsnR NmXQvq�kPSݾZZ |Uj>!ÿ0苵^q.iV#WyV0ճhs Lt *YD * |KW.dY؋(a�@i1#f#VII\4vgDD.Jd" *E=eEզJЮ { •f]>i/+LBl5<n^]_;,cc#Ք8LsҀm$2hLW0rK0! 1qO,seNS'Smj!R(g\zAYR4 YO]Kh"YKE4tB  WPF3!NeT /r8.bWWR]ߜYsvPJYg=Y}f8XSPU\C85J,Jd ͬ -nv2oVP[FR2iSuEO'GsР)`!Ҁ rxhnRs{0wVmt:?)# wge7]n7/Ngw�<4pTzuuN ='Jz)- @>S{3jGo@_Wũ!|[fpZAl0�C߼�@׎@\L!6ϑo}7?5'̈?D{g "A) {�=<wC{/TWְL�?cz9=opT GHA ^ݔP BO:"{fވZF~BD'8C._ۻ1~|t7}>nt^lr4i"\%5eXmw<mSlVx` A(gGBIc U*in/Zf,`!|SΒ"0Rb YHA%ք*e:OvH՚%p.Bq<Q!I}Bo_}~Yҋxl+&|w yu.CqaN2\j"v<!N3#m;<<?:qί#[+6<遀->._7CQP!fG%mM_)xfn;U2E 4ZYQNVFTMMa%cp�NpJyf n.]'E1P  : )gMȍ\kc&#Ϡ(3섶V (()JiUyUCquj/h Ŕ \) *]ɔ: DlN)JNےnT1Dq/1'z&z&]R{ePq!k/YUj^Wk W۲}kKӤ�(Kx=f �/f�lȰ*wD]u<Eh��&}>4S+اw4_^;aXos|mShW͌ !--|e,{ kX�YTvWpȆO^G([XC-=Ra ^WXYmϣ?D�O_\ >6p Bh^:u0YtMK\8_=rM=q'%xMMӐ1"Hx@0{^Qۡsϧc>f8pUݴjUgY3cGK[! Tʩ\`3k, aکUP Z VFDʱ@-W9fGN.%V*H>qJ}1K״&a�v^v^? $2fuY4_-]}^[IU'HAz5r);QȂ�#.�i]qlZ""S.t.NIM_Bjync8}N3XW8\*sc&k l XmZҕUJrU\)$u $Q AH񢈹mjϔ09GUFُn-RFSHaM̽'!EriYE@HY %I`#pǃ_]akX0UPd"j )BT" lNCX׺oZۓ!8Iq1<Zs1&w3d _5r LOLgJۮWK3mm}TW]/b>ṇ*<5pzzb<G� 4J^h8W!f�o;u� ;xfl?7 F5~mW|�]kL8R=~`?Sھ; �7 C �wDUr#o$ ܏�[C| O~ z�O }}f_&�pJcЗkkg'T?ѤnŋSs�x\}4NxS0 �ud?K8I ԫM, q:ݞis\6y-g{ĦNõmpvu(c^ˍU`AMje=[]SV]کfcEu"2\(diKPF P.dAjYJEP EFG6'=T\8fՓq AY.*IU,y9rݕp1e'K~ɥU"b�bD9(,K8'F [QkxQTJ\Eaw%C[ =Qյ(T f bH$Uk*rrKAKR)+pqI(T8r$`1ےZ%JWU(%&it:Rb6lbZrڸjڏn.u4C'Y!Ԩ%*𚢨= EP#f]9Dx]\Fi"1/ea0C P@`[,`2]wQe~S<*N&]fbH=qԊb C*6L;(i 4lGbn.jZFa9n_g?cL !_)פΞW  `00gW�H[g�N_ �pp �>:=е0˅o?}QJϙ }wG,C�i}u`p{r+h; AL= **`>cx4C6/4V^Jgl-<:E1VQ^<{AS?�/?RwC4#e;dщa|8 ;vټNZBnnt p׍p~Y%tC'KB>O]Y)~n[Q clCCfKߌRmʮ!e�;h*mI c'©42B -(l$ҥJd" rh)b չp'YȐ9`V˱p3;$�6͙0S%ŌQL[W[?Ae )+ị[V5 j6;J$_"\Q$_3,AAlnl6,;Q#]rBӈg:M)Lb(P/k0YϴsF.%&baQ'U)3\bH31I*Vg9cSB4ąaO pv<E@T"pa9BtDxLؒ"y xB:W i,#"VA(Ρ\jVE&,EjK% J AHQT%  -4�-D*wҢY-'qW 1]#+mVj0ȏ/AJ 1-4!A$|1_Nǘ�B?XQ}wx}|:TXNGK�P[+;��`:0oSc<Eyo77C ?h0少?-ۋ@y �/O {3GkLV&6{kEM <^jgl@}Ejm RcnZQ4ws|OP {c_D8nꄽm >5=zvnfa~AS֜*N&M{CJZ nv0DhF>L-O Vh18UĹG鲿zoԼ+iޣV8$yTG +aUQ[XU*4ڐ^ m.9IJkQ[rPJN4NF%9RlJ1@+!*؇\LrkZkP:*ɆSL"NuE>C0Q8=v-@t]<ORls&IZ"&{7eΩ<}oTc6ؕ8ݖY4_`3WkڪșشWe] Ap02Hd?"LtSQ-y#L*.WS-kWZM^U)0dY"MjMs*y&Ƨej1YT^WBʏP@bR1UvV6`*y&(9}(T% %5%P2U8ciJĞXxF'iRVZѢɅV'O{bWGۤpW"R6]sxtGv vqMV>yв?Cx,lFMn/N�$ysPvIy6\_+.MZWa (`O- 5s{C�KW+_~|6[nu3�<ĮYKzh& -4Rty)zR-#lAs|Sa]ƿȇ\_.^MyPCqfl95r\BJEN9f~%԰xFV]ԫՄք@'9jŝ7r^]̐@ZNJ7NëO+ 6-i iGۮY͌!В `dQĒbU\rE %jiUSMW$S,J ;<y  9K)]6hnJ2yFu=iŬ9 4(a 1r7-<,}9%-ː.lMSE$98K)oWZ/D+jyOΝQκ "M+2J[^>P(dPqj봟}z$ISd ,s _[0XfS;[˒ݽr#%% 4&E4 n RO�YR|]ib] _r:,YFkhMF,R Iyftg�1K\˾IД}AR#jHBN 3T؄\�OL SXӼ?qܟ|aDžN!,ݸ8qNiL!ͧG%a���9idCV?ARd!7\}A{r"_U)`^xM1Fg~ ;l,wǞ~]gx_S`wK }33Cz5rZU,[a/-maYj|zQtM^ہ)<2AgڇNZ۴/F hy?=y/!1͓Ϳ<RY {!^$[/4u59WOC!1Fk!Njky?P>jGWF'8HA0j0_ -<k3@٠_o(KKIF(%< BrLuv^w[k& `a*J9OKw"^ Ws':BwoeBI\\h1.*W$7ۓ>Y@vHNbrbYQ( jT�� �IDATX9ٕq<9\U[OgzNB.hU*-$}PaGvcVAA3#P5̟$RK:YLwEfqn7Rd 4⋏Xx^jtgKqr rM`ɜkcӕhM"H#wpXs \$8$ L1/*Sk4!=kpB:9{ʵIiA*!ɶc#B!!8mI8rwUei AuFI┃1ڼނegfzp `\<wv;?tϤ)հ>OcZ!{xdMzX|fB.٬nݳ`/"HAk�{'( �K_~M~')*ܠ¶B8=D_ms %_lY3c6t팽Xɧ ׉+ ix Ѩvth'Ǐ< $?i1b8Z!ejsnomX|.\ST!2v/ex=x1oc%Dr6ƛ͗Gxϧ:c/qemJ+?\U/Ow쭼/zY2ڸac/�*3AӵJVMNȞgR1L ՠ.j \*n . !ꘉeb>̊OYc:87r\;U7v^Ƕ>_n>?F|@e V7sIui`udѶ= V{)& `b)HA0cs ڃjYTϾ@p:5{ J_nm=?ؾU/㚤+v%bce$%#Q2cZnY7KrRͬF]Y$DػN'.RA^ PS=$XQ T�4.T ePTVYQFDFf[d\N@MMA%eCJYP7АҤ$JE ȶ !m!{))jdݦC'P75f_7#V/l8n"TŞųg-<�cKs5} !]h 0QƓO�Cb[(Nu /U>b;͐w_qG&cV�7sB_sԾ}Lj8}nv �ب#i}5aARlۙGT]!~}r՛XR D$ qt͟_?Ht�a=ՇsO[@ ÚZQ.*,[ۡUubN"nvI+v{n:݋:fFZrVKPe߿̽(Wړue yκ =[�n*AUfD|Ay,KBZ>lvojiTMVB+4P ƨ9UDžJEYd,D5t:z"SK Eb6Vc\2u,'sñvepqx%|#wҍQ)mWEdOp*P^YY;\"ptl1 QH~Bxȁ)N~/g<p6k^S_)j<T4f~$ηRQh%:&rS!%j :}VTR$oJ�-W* ~-) KJ-Fn:>iQ1WŇdN+ QXY'B0)QQecquƳU) -bJ@P`ښ$TN�nךLʍ`KJ:?)"st~W6X9<;mDܠ?W~>™,LAP1z'ϸ<AoكR!kxI 0Pz#FhmYh޸&м7 -P�=V$s3ƻ"S9Mh�u)n i #+_=xr�xCLR3%p6?Aq,T hTWq,G@LJes)s"7Pm/ g=ԢK9k(~m众gzT�*0W28w&'}c˹N.4]g*5^ ut?�h9bXmЌ&3U(Yq1d-G^y]yUխrMIbJsPΑjeIuEZX^7r-JSy.$ 2VY,ʥj?q7'C, @Ꞻ{C[ZU(/']_s(_0XҘK' {$( c]|Tk \󫤚eWӦ<Q֬ CWKёqF ٦|u!+\JMEW @)/<s84ɡY"N2u7vh3]_j3MEB K4PH`rS > 9s#IS'%'Yj@c1M3$WEtXsL&E&`D J iX@*eqdQz]zKH,b>� ABAR1<dE͖Vn=ns{LT*JUr6wP%2Jf;7v+a<nO[1_3�;o:ɭ>{>([Bnw@0�MI£g`&ֱKd m-UwYЛ hG�V[;ł~Sq[i3>|At O! {gsg g=5zm<=?Fa]FѲ IVMK Ћ6ƪ]RcR\V,y쵨=<Y@=$3}Z>d ^nOBk:9z:/GZg\n_džo;kYШ̂eо -Xz!\%D.DR& @$UȺr͹˸5h16)w䳔P/)/OaGӊd-XVcyI4/nKj` .Dfn"/SEjTnrh4@9N:%u%j .yRF5# nʰXz/0/sϢ٬y5YQ�6LXi9Fmj{֬W+-5Wt qvCO%ޮQeIfQT(\`Z!JJ2Ԍu)\UmkӪUYM(q.̣'X*1޴xRH>-*nN]'/Z>�̉kv#eQC9BWGUUJL(TUF+u+eNHfVG#BF+"1!e(Y!L. 2VX4a]8NPSڬ w:PwɛG]Td@�z ]^wvM4{W&}Ńq4P_ \ 5ۯ9h'xbW?49&�QA�G4[?_[[~}? 7|`�'}=phX~Xva[IGӫ7,oa~D}Ԯ3}>D\wV&o<?wJF ]R|;XƆtBn%cȇ=`W w듀uW^n#HPxne a^2"]gf *>?RL斤k6NuCcYBCqqYt^k5WWnQ X\�KE\a*&]be ]Bh�!z$ kt)/$vE`!նLv/#kE^4UӐ-OhR<Pìȏ.λ,[S* ]u|&^)[lEߴ4tQZCwuiUS#1d$'taKI6%1,Ӓ?B1,vBq'S/$~W~ijiGy4Cl0TArSB rF~HmP@*tׄX�gEP^cOށhYՙ^+۴FĜqTa*Ys&4ʴkRLM0ҢZ\J Ĥ(Ҧ Ɍ"X2AD D1v JTh[2%Sa^6!5"L[M(YΦ+1X SCZeHk�hw>X~�)g^J !}ko!)ҙMzL=dKGk˷7PtQ?; [-nz{$D  0o_-Vب͈gCG8Ljg~wᶅ6 ltmϹKuED Jy^]SC9ʟs6^ck?['1~r/ <rښ3 ]cZ~oL֯m'ļ>]<=Ÿٍ́/O{O.A( P[]20 'j)"(ٕ|eAעƲ|_ytJDe"\kr(fq$9U.pNifՃ%Du3sB)%%"-4R¢JKJهf# dYNOyم=3'h{8QWnTFF Yj (A0AaC ӳ,*"5aIK|5\k\I4L %p:jY?:]58d+LAH#�DctN2D7l/8YRH{z&ȳpQ58l6� b+eR(9BI�eR\Z6bEnu#QaW"M mAk)F\w�޶U_KMܪ9ڏIWKE׃oGkPps˿/_m/QC.x|2!<qG1|cb� lUM~9`b~7ԟ.Q~Zk*W #~i`#{jӏH)ӯS&F(/y^#y%0(^pvO]^Pѯ.-,8hJ$ȋa5Sr9pHW9n˅v%[N 2ϝ `{i{ͮJly7EDRIRuC[0`C-rQTYd023xsd&YdI/n{?`^{-JÎ"nѽPCתpɍOBCCYЅNM-gTkT0`vjews5]q~JUiˢX�(<N̏(J$/p^_,JqeJRJ\T.Mʋ(=M%TC$TUS.tD$f8 F#adk/߮X r}2ep{`#W-i%-҂o� י(!r %_颁UERilREģ\C7Wsٜ,&?>5dlVD [bˢiJ^`<3;Li/I!H q:-czH&nutkNUsSćPvӴZ$X }.BW@$Pl3%yL4 jULoa*x xy1R2 Hqv"9&B Z R|U0)H+(F 2G?*<L ׀q&{*cD" yQM&3` {F?S& Fv NxLp0P$cH|lh`8' sCy*8]7'-{qzrˍ́{x>F�թ {0>-̟�֛O=�=O;(/~h;)NMT bߕ'݂멾a|}֟<,׆?j67͇xb߼$f-p @�OE=^t&l8m揆zКkzb t*jlH^?-HE! ="1)Z=T~vU68p.<p9O,fy6|)+ɻT>.e˶\1[5?u2ZOIJ[Àd JF0&]TsCLN O�H%\,Eao}~= Z-+9>u,X� \p� +K Goo0CbKyu4HT&{,$& F;݊ BТ?XF2Say9sIlx !zfT[⺥M}л2f硸'w;D&lYG!7(BE5\L1s-g хлc*휽%T,$O PyޠT ǩ$p8ABa<+FU2sK6z̔DӄPPV@ƗZ>T-_E1~a]tː \ S։Ҧ)�s )2A(ac#H fa.a_Qd2> Js&(9H}�)D DiО1k;+ceMT 7;oK` A0OxA?p ~F!#�\qG>�>%>{,go;5( -c%xWh}&Syv}7)�a8wF5?i)};y)Hߟ?%[8~s C7wpMf~eAطQxi{7oʸ!XN/_H5Rcڧ=h͔ GM=^NxLs9{'>xNRa5 dA4ar3FhֵBx~[/~֧rACn|+ dͩiJv*N�gզ%i#.*IxU6Z$90,Ѣr徖@:%|E1ޕ Υ@ʅCA]AP<' ~Ji8( fP#;7>6CzL2c0Lʍu$:g8+ (áKwo 趃- CLDټ8 =BBjN<tK”>q^m.pQi%E<䈝p6Ȥy򁔥D<G'x vZs Å�cH7{"|)‰E&;@/g=ؔ #:f@b>;A#jpjST%N遙]ZLh vjyUN2Vq+X"  Xq̤ĂOu(L-u%h.Ga3ZHLe(b1 #CƗIh ʼn5L&}厊+p 󢘯Q @Q0_( nFX:WiP �iQ�Wg 3/|Η<ˀ/ d&_P74@ 9kH7[[R=Q�Ё-� q ?-v"нNuTW9M{tF-l K_|'�_Ҁ�=B<r}}vC}y<ӗj N*`؋ӎmy &Ϗ@,5[8StC[6U%:Cb;,(~f}JH)̟\.ؿ*|ӹ(/Wdžp&m/hEJa4f6ah\5V(7ˆ0Ơ(45�� �IDATC2Ub9A6Jh4̖)y hmJrGﺒD]6 3zF1gSȐu(gh# 9)#S-J-Z ʾBS>;}W5I(hqP|h2ٗszL.fQEiǰry)U]zb3UXJpi݀R薨Z|:|yz2yy,bK-s +?D)ڕ6 `%Q#𑧈wH 8`B&Y9-pB)hͫ`48GpvSL [ ĒBY6!Zha= s8O�cNKJI&ޔ)g &Ks.$d(a…؀c %YI8LE!FϜlY pFF $9-$B0ɝʃMƪgWYs_qkfG3\ ESrq%xDOi>ʬk\͟U |z _�L*j5G(s+eIw�"pkn�ރ{Ig$k&Xp K%R[$�$p@o9_3HHM~s< �{п{*~V^-M n5<a̤Q3 s L8`G��2? "x$!N ψob/Ӌ.E/bGL4yR 짚`hՒ DN]ТB-dxP8΋^5ވ7C~k@~4Qi WsVdmjFm}F U=zBIcu!r sSdJ�hDAZHڢ Yj1r[P2'%׀ dSY&GahTT 8y cŃN?/R"t$0OMkX< eI-R}~qvQTB`yCEHtHq'|~'#UzØ.#ITj/cՐ _pߦ>ʂر>%Ps?{I%h(buѥ#D"à0R� &vBQKP-!j)š8d/ny'GKөTMT),@{f19 xo gşIڂZqKBD"MJ8, ϡlD#@dQ, ')L(`RJtX3�.#I[gl7S.񚃮Ą�aXɧ`/NiBzzeHA~ <>ҟ񎝾5w x G <Khhn��,QY H'N {U�ȵ-8jx�D8Gn  e=~\|.{6OkVRx.�5?dw` w=�p nβ/}۬_CAI�HB)BeyuLfU:HU"U4 a}w ~%&MgߐiYA<T; 4pV lWMQT2!O}eAVco&dRO>(Hŭ LE:$"v|ɋ5g1*E:eSU)uJN:1D1B !QJD (d-[SȀ9K'bG6 B]UJ9'jb )޳sF*}G >>xۖ4Z�czz$2rIgU0# '7;S=;HՁ鯣�_iAbZJ$EռjtVRP5J<ێa@%t,]닝"'oU֗<:0fElM(*1 $J9e9֢IxLB@Yy튋D8{!N!,3Cι0@V$TYPQ f)7ёh ֦9T \!5St{e7;AljOɾsMhhD , '&3K8KBrjJdp<ߠB^; (饘KA)(�U) f't$lmYg>L3Jx3Wm%%A|05O1HbsQk9F,8<Dމ'Al߸ m?pܘ}uȣ841\@@u.7k4I^7`A*O!\t?/v펁3p_q&ptle\wӟ:5a@�v�_,k�>CL{8o#޲_,`x;;CD;N`̈́)D;UPLH*&V7P'RA/- UK8F o�|F*8t 9W%UrBڛ`S]Ĉ+ x$LqdP0  ϑrTSҠ%fkV'A=A%(7U % 6D9Y `\t Gg f }ᬐ`]*yc<g?1,~6b<1)WRɭ>x8SBFuT.ޙlJ83&48N`ī<k3!l8}C1w^lA)~b U{:+ąP(2k~LR[~ymn2fm]b284OI+ &'Emʄz\_0uiNP0IH�}z!2g뵨rRatIb.>#A%p AFRƅe��.ْLof;^Cy(V~|I%0CgUIfL9P(# &J Xy],vRzGCgL34Em %94aaȑXPoɍ1~uدD\UҬ0/Bi^<ݵ"cֹiD=vZ[;\'O&ڕL�eq+t=ʃ[ ˆA8n]K6@*0{�r,�,�|]� |R+3s73|o[] k?q�B:; [ှ _/[{T{ `_Iȯ醎Lr��~\%xk"&f6Hos)2 Tz7ľ9's+)uq6wϡnD:CG{~TI.& qua$U10Y )x_Q\< Y'}1ٌϚ5B@GGTL.=Be>㲛$&SewtH�P0Xf/Spa94Lcf&8 :ˊ&KfH9{WH('JD&z>P>Ov i-Ǹ+K65 ]S^xs�|qw w6@PbqtvɘRJ!rJ;@ݧi* +=7";ڪuC 'CZ+nRyh[VL%RSR17YgFvn1ofB;&bVXblI6!3lԂ0oIO@\.p/[  1\!vu[HU4jjZqBP1x 6%4YlsџPc0),njs([99#'6)e #iB: i(~#KXKkf])5fQurqۘKFM0?f.,&D\յ$ݎUjؕb=v,Wa{Ǿ<,<@�6`89D7>pgӇn|^Ƀy95�=m}%Y1 UO׏}l}' ߿߰k~ L�ؿ;W?(x k  ӏL�o.8|o ,�!R�b'lT'g>r~)4i<\ۧIit1kwH;a%5Z/13#?OoQ]okӝ;n4#|à T]w4$Ȕl`2 .t4 }B=mTY J@d),S. mij ÄؓKf&{"6_aAzq w?Ɂ3p\VSa2y)�MC ZH!Sfnf; lX[SmbW@'#'yRY*:Rck]Xϳ pS7R!nD1%$b ՘勐# 1u.) *&18.c*- d@+F&wN@')Ip"5pK!"iH&;1E8[sEq 3bWTA(hW1"3T)M[6 fb ;(.qܿ(.dVNu@/#*"⅑T,# *M.V|&e/<"V3]A1j3W l[2qIIQ1CAܸ_|>yz"\×e1 Uwt\؋~}%lynb3fShv�oh^W�o?5a6}oiG�o~=*85@"^c]]88={}zKc�F% ^$˓5hH۽?1 n(QO1 H.V;&v8?PywQ.$jiXzY-B2 !!LK]?m}4F?ܞ�93w4nEi)w՜sa[\wsp cv'[{- 8`<c8 UO:Y($DCxIU"fÿ=H9ca[%$Bce~K =z_aW4>^*2 U4?ih/!r^`QU ;Ӫr;.jP<1QDrDU([TaH>nytr€VY)\EҲhlx 3)7c0˱;<m++>ٽ1B3c8`IXGenj0$c~D9Lws!-Jy$siQLE!a*Nʝϫ *)aD4|sgOi2+@ 9I"<<Mt+5 rW> UEg8h#%(r 2 %rJ^cL._jd` #s(L:ECWnV[h$~y?2ɄdP^,ھ̰�W06xТH=ϣL5j�zmw1c| {�2̆:�#ywq9@0V4$�N?ѩ@Mؠ)l 1xK_J}T5Tʣ�PW1�4.4 |' 0=5簳. _F$VXo1~BcțCNz < RL2>tD/>H颥t^c.Q7H޷!0Mup< :o~}״UC, jšlYܧL)&6iE)v@ N@WdQT.xwUI}jɎw?YE )0X!+( nFKrW(YR+1Tb>9h=gNGY^T\LM*TՓ飊mW|!tՂMu f0 LtHqA/$Sߺ!ge^7F%\|rK!KXr0=]#YGKbĖX9cX tJ6e2bKgArd5xY?fզI 9 yI G( ĵGY J+KR$L)cZV] W<X0))"79pIw7L'b"0#YU\jUqzd )41c.) tDR) NIVᅷv lJaok<mGlyWMRK6QKss;?Qݗ ۖ*@a& ?8x^/R:aB`ׯ`�0z�@^8,%/ p^{w <hC?(}k\( [� O3N�,]+i _8ONL�v|x5 xfZװB'ۨPp-~ 0v3z HGyLb]EUh.H7pp\a r9d" qo?R I|ڟϤ0FV؊D0=cG8d2T`CIƲ.4`A=9ƥAy[)HqQ_H�˺Tr'՜ S"ʉ֒()B(yC8f3`]|-0旂[Yx3oC &ω.,E6;ByCV k&c)Ad9UrfWgDg#倌<\z&LhIVo �<cdG(]>Dd\G\*NQyq3=èѸ*(3i]�0?h(D!DԦ荟Xsn44em+1fb#PHpҥ^)-p]qg BHdID<xQ! c00U#|1:ٙ> _m죟=+൓mS3 N�DZ]8Q7֜Lœi~40]r#[R b_& A+QW6[aFҘQCl'uhRPű!h>8r�̗P! �` 8��{84\ ^{۾'JXX@Noa@D_{Gޙ\Çy97C� ޏw3�_,�3ۏ}VQ "T�z<2uGN>\ z[W-yZW]rгD  KxmZW37C:@MUB'7^,);7zX|A) )A9w.vk|8 Ec20 ca%]<~c7Lf_ :5`!W;*:T"*SH [}t/e)X@:J<&*8 H6@8wTcµqE-Xz'BHApS$~BI''2٬/qќY>%(^#㲸g rl㜣 YK,Hs.Yh$mux dp![P8$Yr_9 B\T!%Rf|PM廅&JeN R3g2(%\" ˙&ر+-|BRP5ϺeHǬ0"A(_S8;B;8i{8!8o >b4SO~hDJ+)lP0(d\XKXjS nPQr!ADx/<&e[ܞe[|5!MKVQ޵NB Z;^'k'dƹ~1Wv|IӘ2I򲞬գnn(7|G;h�� �IDAT03��I@'�l�_뿆l0\z9Q֗RE7ʃ�[ycpg&@oX/N?m7 :e+@e7(w~eJ ih\,X2~-m`<J}ϸl2)&[XմMi (zN=f<�ezU>|)ߓGn[\NXK9pFpC0,R3\Ļ> -�wp\p& { %7(4Ț GK6C"1[[ߘ* -3,2sa3WY}e} LhC|oyUպœ4ȅDʪ8dڸPD<6X8tD#T7r~MZZV ֓bWxP +HZ  #d9+Ena"RD̓hV3*D)) x#^KhOs6 .#HKR�9�%ŏ9T-npu7 �Ѽ ?4{RFT eG]a&Úhr&zᅜ3 )b %d2/)`{.kezHYpz!̈́:MX$D˒bj+/ݣq;ozrpI2;LOt^MsIdY߭uc/7k٩Do5kz�4G`?|ՌH_`BpU]nUW듯WM @B�Fxuz�7PAV0`�0�z[nDX6$ o~ oc',-=}P׭W�=a�NaN[˧% 9 /\I.TW<hM5Eʪ(fJUpx:D02Z`,�$Q RӬ ud]bPQ.ny }}&# ] \ P8͙;ƿFxس4DjxuFD ? 5&${1eUЌ $BFa?/U't9iPg8vuTɌJx,:{{*\nPH0&S)L2gڏfn2fx{I4Kboe2.5f @0Fhz_JwWIf2EVHnrYy:2ȧ8 l|]ě otq`yvBPݱK8к#$]+ޖ y>t%wHS6.HXG""*rfPUH#d!`M1V\gS@ aP8Rb,4%W<%/ihI2/'[ I7Gg9GB-FTi9 C.IAT $S Ǿ?= ,30InjݢCiW]薢TbqLn)8#twDg, AP\μM[)__ cz<w턴bB D_j)rk.9R^jsUHd".xY 5 V$m Hqwhx:_O`tOgK(^l O`nH:Y@ 2[>P[ +�@�|~kH)h ѹ�O_M�\/1 $uxoHx\C;�ymaE_Ć~C7~/kw'�0oUA�k 6/ףO"y=|6ˬr>Z O<Uasxn'l[ԃO? O4R(uS@2")L8ť֟famewL"0 OUZ֢vX?s \Ow\}\HĜ �r jϗNy)J #%-)B-:uPﹷ6h]PL[·gBq-T*zJf^sSǓ džc.z>|NiӺ* |{?3@Β +(]$ۣuae * u$z* XTaᦾp:J$ڈg)fC̙7J�UdTI}2. 'Eؑ@%B>A 5K{8E vHbg68-SUZ`XH+2yfHRFc!\ii>'W#)1 E2Fn'FIqE#&a$vd$љHrLs P"[F֓%\IDuF )rǜA9ʘM,i.OWQ6M9% GOyͽx(PuE*ag-Xܬ T,�?DoC]9o<<ʳ' v�O.a {=�eL�t :!os f wońzx_}CUՁFU��<Nޢo) {'</g�('@uldPN%\j:z M؉GĖF4ɂ_RXiD< 0H+ \} �|fpj0BWg^"]>@Jequ'!2+U_Fp M%ᨘMPT,ӺȦ'(ypܧJ`,`cHw#&5tőK! krvd, +"gyQq.t,SfW#sɒTdN\G݈N~= /:W>[aJ8i}RH"gg_ϊiϱx&IVh2^\xl{x EVl0?]4d3-!-"V\nu[WR2&Lך8k be%E$ (/],XV$(e Dv4,enV*)ZaAL5)Q5-ZzˉtHq#Y vhp#<Z4EdCvأZڦyu=Y<Qk6|.nppj&PJ%U/6xٟVX e-vnH\m41@' Ղb?WYK,T4q$=k6# ]=ⷻ IФ1 '/g 0 ɦy&NXp�u9-t 0 X0 x5[@46ɿ]Z>G\շC o\�W:'Jg@ e(?dF^ՒN@C�UO3(T�@疯QS ;]QoItWCt?lwfoRg6Hn"S6(T RYHD5(\x.Ssl5NFp hYl@!ƿ2 ;~Rruc1;\#nJL]x8gx�28#J qZ-ɥL>G+I(^JA0<F.F�Ain[QE2# ݹ뱂>A 0q<\?Ę18(x̿PZ<*F1lJk) b`XѮ)VΫVf>Wr !;LFlN (g+NȉV8"fɼT6?`(<k"e'ұ%Ѻ2<xjWJI%J(Kw6TgH 9յuF@sK]ydS'[/1sEMCɘ1NfC,b0L v;/:I] f~S ,*ɸ: % "njLH67+\\Gg 2&"G]ܣAD,ζ%o2PHΘgu pn}b^%%aΦ˜媒5-ЋѐL`քp 9Fck-5yBr$5΂;MD^#oO L^N'TKq_ kV0X`!$p�(X4z1Ip q3?{/[GKCZ7<&J?2>ug񆝞;n X,_=�Ng sr�vi>.?+..:L+}iv7KbitUV),'bnTnAdf3'D22;/Em>/P{b^`,$i"+/[8i@_7ץc6 2Ob+I.s&m,,x$]BC ل�"F/ 3%Tpae35^S ZWTdu㼌9QXbݧ5(tƧ-ËbQID>Pd]] ?=f"P46raĄZU%|bg%7'¦p�(HFA1/4!@).R" +\UtL[e$n<IVhGaB(SUE+k%It0zv2J|4!DR2H 8,̉ؐ4/ޥM)s4U۴lv4<G:`|-@!.wwNܔ9#~q(@쩟ɞe#n1V "I ŕeֈ%iيŚ%2Q/r8 <.4+87ݤe9&Lr@A^TSb4U$GNLՅDm_d8t ktzh@nk!7@<w28$feM7_t y%O�apϓ9<la~](Kel"NЍoωf0υ96Z*ߊj`�~}܀wKw͌߸f߁;O}#F,F�QF��$R�>k <8~rygxG~vhƿd v9J5؛ ,CZ<w7-:.kbTWUL.amU&ue_UCo\3^htdt9_T=-dֱHi}Y<T eN CD0'%q}L”fNiD�JI)~#K*ILSأ|# /Zqy׋ZՂ $ H$PqJN5\ADh iP"zZ/1x!AC- vI@ 18CJ˚)e:eVԺ[Va<Hi6iZaY/" n=c96!HG4?!Ex Xp7Kq6vld#&&&ZDv4LњStu3\RQ*\£3_)IV_(hB/\0=q!1%%c쥠\#J(TwRPN|`5*a2ssfuf[ĩL+9n馈jF Ir=HvN+1=1 ?5g #]Xl!e{&Yh1G"le:zqLLK y* 9so"i?>FT`{MvPڝn!@Y9#oy6?o#r'п8I 2Ǒou'&S~Io �0&xW}6L^w[vTU5*~gأg'?.hr)_bFDx5b-GZ-H6v]K?_)N̵ISFg3b">ӭtoGZ"Dg_R9Tb(D(@90L$gn&1s% Iɗ,FSeR0wǻ顳uKyMS# >uk=&{vSVS ȻAzT`ki꠲cpNP@fJe0jUʘhS쐘 f.So !WY/C:Ě~ )_PvRsJ` 5!Za54㽙,TVð7 )ᥤ\ypyT/fMM׈TrR4 D3ʌZdD݌IX<0!68fhasC{(2ib$I)Z-uKR 3IY}@f<tP "S9reHR6%"4A+Nlm=,OCH!KɑEط봢LYAx-3@i6K8tS?&]KPA$MJBIDBwflm8cRb 3Zj"_>L؃Cue{ urK50EH�<:7o܃36w} hXu"p{7J>'پ~�^~}[=ŢѭڧS'zzx3z+0h ְ%h 9�0ǁFC̈́Gx.=֚T&d0\}Xpt_V1QGˇ1tOՇjoԼlurȅ_BeUCYj7wt I NKY(Hde2!Qlr>e(.Xb3ٺK" لU_yUx.P̴[cm2بߦ)jG<ĺ<>}6r9?/\|5S N I-?_IQ g#uI`oW<oQQG<K<ψs[Cu̒6S6*k+,Ug"xlDAD?@%3uNb4،撝pOEL,blBJ DS)&D)rB@ .Q_U`-<3D\Hf ˹ W47 X0I)rlNQK%lJsلq),"FͦRb Cv T0h9lSྱ/qLnMOxTvD'p\Rg@}/VT*A$aVNQ e.{"Ay@<`(S'7K٨84 `r:PJH?ΧG |>yP7=䗄yd~Jz^1FX]H]e ^@rU|~ ү_IUָۼ<sDPݼQý}~[àW=8}Fxǯ{KO{L�/o C_E~Zj0{0 0ER-[WG/àKD( .v/YY ܪoPn'NR@+~)Bg8?_ds^z8Rzꂜ : HIl_)X BZ5v(v@˙BICkƬ6"/) 2/T @37n+ǬVg&4,e7Iڃҙg{)j\>|vZN.aDG6„ٿ<@8ؐGTdwGE`ׄ~Mtp|f~v K;H& _lt3"ӱ8`JඍO�� �IDAT8 9Ѯ( >/k[%"bD&R!}MU9]a-=+8/NYpa2$jxP( G| p)1Jg9L2 \)$%6dRhWVU)hGXYaϥ%13Ȁ^H bf{|{Q2inl*̰%c&TJ@sH�I̼d`؉I%ZvI",f%&zDޮ.Z3 ;AMBiwwb뚞M@B5,WX1pR5H9C ֟>Fxg-C=<CoN{Z&\;p��ހ6հLۗ^m~33�-I>p^X^ODE� p=7'*ߡ*ʎG=ꕦ^}vk÷}X Iv70x  0�3\{)\|)9|3Pyx sNT?Q =O}t+NBPqd3cY54r|BrJGGVckshZ|Ql1: yz4dCwvyN.iz9N"dWf_v2UaXdæP)EICW4% = ւrxF$KPfhh<]|UQax(0𩌨$ ly/f7%HE8'Ս~~ݐ?M"F$Jd7`$ÓtTH[+u9޺q O>&k'~h3I7K0*c_ L p&00duu %k;M6!0ӱ!WA++c*<WEiHw$bd]Kq4KTqTH)C&H ZVpKqHuU N,[n By҇UW*FؔxMLrw8Vy9b b&JiҲp(6hȻh-CI6>{{wT-RqBQfN#"G!XX x9!\1Z4"%TJ�]TG.tWj]VWkVŅ4gUcd)q:;b3u_疇-1&J7 ^…ÚQ9UeFZcO+|_3Ho~1DU/^“*`S] xobp���ys@\�8'//�{�wjZ۴`�N^ܘW~i7-џ !@{rI`xYu8|5/]4\` p o�dՉ0ah?z' !u=ԩI,:ћ?Q Α̟7_aΆn#U(% r BS:cP*-iZ 螅;DK -@51TNƒ ύ"}©c WHi!"8�yOj=j,21�@ܧ었n*KgN_T uɛC9ږ*Դb̰j9 'Q! g:uDBdגv}{8K'V?>aҥ 2$<}RM3F/ [6S5XV9|]K& >?a#AÙdl+Bt,:H +]kQ; L C�UK"8b\2;q`jZ0b 1׎ ,M 3^뤛ЊT*V A:b٨ ia9\TTJrᢎ%d¬Q/f3aʊ$PK%4Sը̟p#Xyrt*RMQ S."%W͇NOSÎ'>CZ d~–d5)�b\[.1Ji\WU)+p4t*jXYOY8/"zaCI˿JPo>*( #h /uHCEnx0fP ?$T%~k1� ߩ?]wA3k_s0@ 0voRo[|ooa/&8 g'� �g+UȞrAhЉ8쬦Oi`</3pq@J-^ݏx脿VMOvgYFbH vb|V4�':SB}^ae#[rrB՜E K6CZ\f ZF D@.a牫Jgq+i)֋Xqx8R{2d4a`R8f2B.)g$`mq{'*'Ds`^ũy"Yr[cY@<ly,ԣ1/ig{ A|H <<|2Zqa]se dɯ'EggtTh7g$$N(0>oK;w.*Ćĉk#5>،ί\kJs?`NҶcq2T(¡Xn] X"C(/{6uUZe>%T%$,gKiSъo~/$,QH"Q ia`\J`I^֠Hq=bPJ/z͏q30TE񁁭4(; j@,]těX GA4+% _fkMd03>%}lxpHɇ#ϸ}XOcS c!kJdEH D3cj/7XC* D<dN>0[YAOvլ.XUggIl̯!ɦniRu $_#�} ë%0<�K�_MLU;ׅ#@zY]PC܀חXN^3{V|WH?\3#^/?m$3_;>M*� 0]_4=t�=yG"`>Gw/HnyrTJ=w0 ~,<rаv/D8|L~M.5|Ai+ 6"%˾\aŁA;i ±=˫gS S@*ʑ,%Y$RtD_J\#. Fч@P(NJb{_1=xdEuXK<ΞJ]m5R2TA&]mKSu46yca;rre~Lo!|/}|dggvy<ѱND-ؖLK\NE<iӯȦmVWqʒ^4~ BC;CҗDSptў Tӕ jBZ$11q@ԜUU"jm&-JUqS\*JWر{PvecDY.^PbM 4ܥm hw]).VT|?]I),QȁGbSg.-'HВ+wID#5']J"9[xxB0ITH)VXdUPsY9MYюMt)`omyqB-RBX/s_%E*.[[=r~rPyB)bU¼$:এ"=~RڦH7aN\]yAsDX a)%7Qn`t9�g?~12lнq{{Y� �Zi{g/\~s��gpܔhV?hs �5ygx{kһ?!6QH}pѿf�~6w^c� v0߁`?8�>A?<d ?Ǖ5XM!ǯ ޗ)?Z�@ܟnޑfШHn}KN3Вxsf솳T<HnYB<`1Ev&B1mƒS9COuL3ԐEi@L!0 ͉G(("%�UVlRq "21d sX@,3'hu Re, !5hTяڮ�Zh(]Hlf"\ 陿\y86Ϟ/0^eAU\-(kMڜd@Dqnѭa׽f!%= L-> DvQ50\`QJ(Z&$!Xf')U4Qôm4٥٪n؀kLΤc04J\4Jq"(i=g3^pDq ,are݋`G#|&0}BJ2ǘY1AD\N^b@ QJkւa9)Z_KXyK4"+r6D uhJ(Q Ś@FSF>ӜCa`V)l,k-Ǧă51 D%OCM V0#1)G~J53V˳@$LdW <2+#KppFDʲ aJ{#3 9 9uhn B� %`5�Z|3P LV0_!mڨ3�Ӝo옿,%뎇�/o'Nf5l~*z]ɠx ߖſ[ P{0v@�Ɨ4'-}S0~YGDcUo2WOkԈ*ejM?N.pt4,߰(sa^uc\}NDiX“aȞtM*y &Ŕ+G[I)pGd(.hQ+ZQ+Kչ$a<0sn9LhI` 1Bc!�=H@fhAxυn8X`ҏ! Of8ء̥q'|kog][*@]UK7{F~!i+nbhRg*a¥\~J+}ffږ5WmCMTe?7NYRdf <�T\(z|ow\TB`')Q%f9:̰VTI) L<%#les =-V(f‚  9(TlNt yva)LX/mo$un=} CHɔvտoFK),�̓g$I|<To!0XH1xp ~.u;:xzf8!b+=\DFȾcr!&͊%8gt-L=d;%e9Q,3|TZ&8#~Y"X <7UMBԊ{tey`bW⶟leWM"<u$E(JGRy-"}+r>KziY ]jCP˂d1*2)ޔF>:)2.Ηg {Ox  F4 [%/Wb!7m#�RbP~xf=п/pU }lGOwSw'I#pP_r7F? Ï3~x+ ?uIH~D罻Z~�G� |a5ufc 1pukђy<ydQ~]5lzrt}op9K˔73L"8D,?IBrjb�iُONRӑ8ӱ!tL!q43ϺS KLM&sIdhP&\7 Ϗ?@#E -F1BeNX\8i,ˡ͔Q*(8|ׯoEەGCtg3Ƕvd{,~By9CXNؔm5j~|p9/r=ݏEd]b?=,['D17{wcX9k91uyXCN9Au\".Lq(XȆdR/55: I|!D~NE_NO6Ekc1|w+B A<ek&בSGJ_XvHN9&15KsqhrqʤTA8  8'"YQ䒠12Gw]ԩ͉Y #4!f Q g$\TpRȃcEWpP1LGn J#M'$rICί#Q[S!uf&Z̎FJʅ bn Dzikxɔ܇@Y}=/j0*H5R̬IiUH<րs\y^:ޔz>¦$a;lXR\H0�x: $=v=$ n$_ 3]7#xpp pYޞ!~NɇC~+cxЧy2}2j3u)OIė#-P~$L$7?w%͛U Kn#.k=ܨV6y1d gnN{|Tu/4Ln"W.� a|pЕH["N5*mBCjf.)YXF!qn2@-!9u_9SFfFE&MR*D.ts,FkQ0&N.f#epRq9ʑ9KpEJ |i-H"G1t#>+%b=i>~kfH�Ix:f2ebM}_t|tUe4.Fsֳ.ph埞*ݽ+v ϒVL(~5AEIں Ylk@s'lT+RqNy$i!dt`H/)r1-j.,gz$W,rXD0 2drۨFPMe>lXC^dj8HvZ?0Q3?u5]Wݩc6yFZ[IQEr:ah8ӂ S&"TMEgiTeoCJi,xn}9\$6C$c~ĔM!~14%?ؑPy2& V,=5zT #E*w0 JKf2 geq/.:"sj45kg1/ yhTuJ[Ƨ;ҙJm~v 9 jje@Ïj=p- ;0 k_|<Õ~2L~#G}P vz'~ߔ_r[7m.831#3~Z>0X7J=V|9||# CZ 7 W5-t-->KtFKR|VΖfn~ʘmE^X-nfu%ylrOetA,J'bQ+b9c|x^]ct#I8X!kC+ 6T[=If,ӐL`fE@LȒ(H5bID22`n5)RxgiwX(ɱ:\}u5 -k gЄg8EqTݷOt#z#_L=\MZx6U~78O {yyDlK*S)[_Q@x[E8nN?!Qªzsl1#uZ͛ m`Id(ڣ v*Z~ZRLL!{V<m 0N:DVOj0R0 )14'!"YRh:0;ДU$i֥NLzY(8itianm7s] >偈4y2CL9P/aUhF8L3^| ɺ0dS~J *vOVR4?>Ytqp9 %iwB3@åHgr:'(IבTn 3s' +M%謚u]?^( μX%ͥ&0o:o<R!0<�� �IDATש*E֞d†-ALl>W,J`F=؀;@G% _$-f\MD{ J o2 ~_G~587Se<'?;jԻn'y=kx X-9aKv趗w/4CZ{na ]UeگOS-9fkYHDK-Z/5+vQ6,X)bfvnv!2i*n*#֫5/lR<R"xZf,xȒz^v,UG!PgE'pH)hV̂H$X ~δc1lz])f6"YV5j21NP_ Q,kY2) O3;J7sb98q||lcrfwYSVK\Qc!LrW&y&Mi俙7*n~/#=5+ғ^QCesE1S32JZDt1$]EkY4/48&V{*4.e-Ьf:̋?vaeҖJЋi:WIHeђPWұL5q]dY G :hI!$l,,uvc.S1|8c#qad*H@R4R$h+:>ϓ{URS�Js!4-t>6n[1l}ZWI4D,"QPKcw!xA&!jg^B*3M<S!Jj_aB-4!*&ZݯzF#~ xScA@"~9,w;Id H%FOó'fV/.|ޟ8 1_bf?ĜK7?ĺ+DYyx7z|?$烋K)pյzg]C_ Ȑ-S-jJi\=s;8?\t1\ȖC@dp1y<=yVs5ۅk1-FE vh)~\_-†TR|b2I(e {%.|wYiބ,M|ЩKSѮZӨ>)xVjƲ I,goXME:%"1qVG`.qEi$,71EĄҮهad*Es7a^tk>JbCQդ݀KÈ&G;Tqs_0ힱ]UREZ7[2wױC*/Is]wqڴ*hoW *MCAn'&Ac}&6SsС6u 7SK2s.YmJ9eU2!a4s]ȘKe&bKX0liLLn6sgIGdgdf$^O'/dx dpkyˇBL㴏<2~ uRy"Sլ<e*CB\ޓ#4/ab)FYb/R4MGyRL̋H6^ź"HX%*OΦ]ƐX7ubs~Js`IœepK$Y-fWE'JJ!I:K@Ls|FPe"J0$k3I3/6qZV (FxS<PxY"俒e\AY;9nًWy߿Sb^N2<(AOD�$ GOCo'Tet ¿A2*gץ\{>n]scq �hW@,b_Î?cT^+�Ϣť"o7fI؅ȯRQ9喙yC+b`)۱?h#[d}ɇǢE?7Y'b`҆W?Z?^6+f:c TM"± *A}_`ӵ~|W7͢x[c@`C%�uP )R$T@RUYU39b8D(XNE*nd mo8v•kҚy^x?Ϛ,t;U;Flޒ[͕M!K1Ľv#J /E~b5Uf%iL`J³NVI"bJSi5FKUOW\ML dGuaF~Щ1,>SKA nX6&jf&kh₴�:haBԑn*nǫe^8{{{s0Gٙu*4kԂFծBK܏):fPnQnmS)kn%rIo90)"YYʼwn惟VMJXS_St/U_u-KOx2Sa%UkW1MYTaȑSM, Z佛ȩg3a-`1y:ij:CU>HC!m_Ҩ? _` cj.Ʃ" íBIpQMll]'d=%#^ɑi4[xX=<pX\i!c�`$Pau( Ip@ 9[/ğco-MGxHb&(kyV1~bMя ۥY %o>|=ҿ{vUZ+`>ͿEjUWpeŪApu5/K9UHTN8;J(f+\v:VT#H]&0GJEZlTyX 7D ب> ֬%# H!* O.7$yubwRPRHQR&bC6T ,s2"2zŧX~z2R*MF4 Bp6M$3W4AiO6&bLd q57\2Ӂ*:NJT; LXn62ҷUz:^'飛=jB 4&V<%1ɪO^QUzC.VuzI&%@iDsMN̑kN L*̉;pfC ;X%!FX^X&aJ"Cc2XFgAK.E&GbT8S<Q!*ԇz*b)!RO&xqYCc;*V^lBȇrԺ)FKS=MSHTRø‘;'y.Bp&@T1$3s7eb%Kh̐sn⛛ 2b9И몈Zv-i,uxĂb&u56$RGgN!k4xR;>7(X-z\| +GZ+rC7{+d y-0\YsIB!: ` fهe��=?O<M�+5@z)>b!J�/É oxUo&`Mo(>Fd Z'Ȕga\moˇ94!&FWX]N{bꊕn* !{E*EMO9E-ᕙUX'Mͫ0 LeRRȣ(ᜱW*,:מ* mԁ`_f]*HLt${/#8$K}%pYbY`J̃{#f.25%L ٸb̩~ # {i%3"肇K+)UE^hFnj\RԓT/살+A!kHU+cd14ll^E|*:CN۹'e tLrcnUE~$RdH|[RI9S+Qv۵]]FW!N(;Z=,ܰڝx5(H%)/M%N){HVŠ )hmD4C]jY?!$f9= 3z]7$_n["ؓ$tcn9s bM,y c/i&\R4gW/WepLhL,ysKt<1Һɤ<7Iarϛ;PD>5u-sNly+ixϱ&8-QBKnrhuGx;~f&[*b2m98I:45##Z rt~lYI5]TmݓJϸJuVW9KoVK\{ٮRl03@=o0ؿ?Am[gh�)`9W~f�^�"{0~+q%?6\�;n'̔<oY^=:Lyln z N|K HWZ /$W-r5U+nUW)D�Ry='jóɬLnҞPrXMvBDZw~s7/;) a5y`q Ji,RLTs>$I%!Ip( `( F[;}1ǒ9YUQ@%ϦU<DJ#D]Ő #T!ڸgƻ6<IX5BՒ||)S|G);eb&:GtjPv1e1z1ݑ ՄS VbI 1Bo,aGM`S6oENpmĆ6 Go]}QR Q!e~ Ҝ^m7g]M/(" cN&ƭ=qU3wVT0yqϑK/GH䘧J򘐘<q4_E (%c͒>+$.,^1ӗ4[wE;)<sfqO\=i '%pݭda_~ɜ`#GUr.qsTDN̚dWXT6i+I}ʧ9S8_<CՊ,gXmkz:ة^Iᕴe)$hNYzs:uRB!3o |7ߞTU[ dbn4HHGZkztnc~}}BriKekvǏ/K 1-6~1'&"bEw}2N?�zcw@οYOu) t�O(75Ɵ+~}Ǐ;\kߘo'/"7V%67ȐO'o3~f4 c\hqx b]ۉ'S1>y_4 OIrf$c[~ub;AףZ݄6qvF!CecDCvD1('. mtQ<ߊ\T2Q-P"=QZLeܕm|ε)qHܧ.a+D<G DcR><Ls5FC/~x5'! v|OS'JEg,DqKrm*F- pTnpU_DH6xnoBYZU.+jJY` {zBKoYgZf\*ѐU+aV߇M HVg\EoX ^ʴ6T%O !S4)%;$,RiN. Rq2[<HLZ|yI12m-K`fZCK&J#F'D BuؘسDή>ʼnEe(2@hIe$ezx}]($BI+/ q.x86ʧ4Z3)sv&TP轧8׬DHqևz^ƥtb)l&nDuNQ\R"c!ec醦J㉔;%fή$3|!rwQz(-˿3BuB5$ $XT=q]'m^[EN6;Bn _]ݧ??W% QG%53RLHXfN";o~on,@CGS\G?%ZCk[/쏒hY_� RjsG�p#+P2~IPjua(QF\Q,kqhtlNlÎ`Xēzz[5N'J]U*m=N3.)IE4׼ fJBX́Y~Hl,& ̢25Qw9 O; ؾuƣ1ȿOMp.93rje̥It/iP6M JL[9|YȇDi8H[/^M+Bx(ĺQ߆^ؚ: זp\[?r?cgLK=ܩTs|l QR Ff:}7lv݇ţJE%~tRnaΒ73SHRRgy{]Ěh(TJPK0.#]2B1) X樫8$R(_d0΍sBcI2ؔCaǗɹ"H}WF.]x}rr,%)ع!"v2yUz=ԅQx%|EMS.e/tGDHGd1<CZٰ$+j()4"{FŔ*2-v)GlGY7wQ75*ZrLdCFDM3؃2"z>s$8]񵗓.6, * )ȔfGsᣫsy1:G3Aԥr||3|8-bխtq{vƧ bXJ)|=t*)1M"ґ DȚϲ<p@~Avz#x|""?o+S{�pxg?[zZ^&8Dz2/%ث߶YnAqz/.6T2M!gDdCCYŶ/H>d20ђdo"cR,s|-bIՉ̜3J+0D%ֺ:%jQ@͍ӆM +ncmPnA\W0 qR Kr>af=RJ?M=%BJOn;9 %Q5zxhn_~9DYS&6җ5E(y&djtvg{^Lw!/%D3R6s)'BA qk7ʻr1yHј;CEu;wQ~ JGi0s 5˴n�i,ylD 'Rpϧ -5lPkE,R,Pـi>1qJ9`}}.g1?+/Y_<N*]ˇY*˴0nggK{VJR&\mU,B99\y|=ԃF.ߦje.w_eDi)ѩS(P#v4U1~ؘ|vwwܮT)'KE(kC-|$qn|+y3 i "r#7hcמ->GBgJgϯO=a}RvǙˇ<aW8]"=�/p5R=+ +@l-oW yi>|A /a^XG78#}mQڏk++@Br\_@U8C�j#L=*d6jLt&GB [?xxyvY\ )ڣ>y*+{l*QaoHbL&IRj2URH *,esEUJBT4ZUJ†Ci9&P5y H,E2! !$bX!) UoxRJ#*p% {Ҟ9�� �IDATCByG!)%+]1DII%\TReMl#5H~5Nj*!({ W[u&գʅ"TGվ<ߩȯuЇ"*BmCmP9ч-xu{p.YEtlrXߤg!f8\pT'.%ԮkSRNMÍ LPYaFHB4%6{4˚Fzʡoq_W1*Lab.|q)L !$FK>¼8zp+ņůf)Ʊ?=ZlfƮ>cZtk;;L)M^vU<>HLt*fy!=YS]976'|LYU`~'ed-Y5x< S:l^Þ?2wedf@'my7YǤÄ<v89x4<muEp"ZHFY 9CQ5S{"G*~>c|>X곙Tl%{>0= 8>V_b"A]5#87mp{~xzX{+I0/2=C!~:WhlVv}�FHw!j<wڠz Zسw]ېm7؜RzO?_8]}^sW_=>5NcV+SMɣtys%#*{K}+LFQFj)thcp1Z('BUVk. !w2Kobd R1US)49C+BJҒUkQWֲQwE7劐AgTH޺20@b1ЄG.2$.lBpQH;{zQj*W!)s6So9E=]( VzCOnz٣Ykr^SyJ/"p0hB]GY{5uibO>Sڈnt[�`ΆbV;ӽ6dDqS L﹫Ήc.'}S¡yϫ%ܬ*1RoKGjx~/g Y̖[ވwF&~IK R #Ee#gV D LLXH>j79z3dwt¿kSSj;fSVU<<1Q~"i4mJJap`,ߺj,QSU2sݰv1msΦauϡ;qgɁoIJSM3~ІAIe !h':*yO2H7'ͬD1ViHUYM$z`<=nR=)@1!C|=hڝ|:#-)& MDiqbMPc-󹐽DPgjyXŏc̠L7o?֑+̂BNR9L:aK&ڌ<HW?iMQrNJvQ_%ՆE)'{A3 lP ;NVHtɱhoFE{6�Nxv=1z 1>b{:P"/Sd9J�\3p൏x߂fΞ8.ab1TFm__0xjo*=Ha[,VI]ZtHwZ:|:3(cbWw;>U[ei<BN$ eb+6Be 5i%n8I NA%uE99"dsDxb*{_%Rpy>RF1̄HH|(@?pA9M8eQq R5RVRD;&k-׆:&>灋C9מ`ʪDFhcשyh5IޖxؾGTh۽IŊߔAb'uKcl(MZߋ>-!85c=ꤝ/ SuеEnPUpr)&2RQh5\dύ[:&.{irDl%\oeKNu5 ?$Kbd/V 4FNE2i̊w(H9Pf6*CG*BOv- %geUlgwf B Y󄮎> l< j!?{V-FT]_<>Hq/.e8ӫ,}fL<WS܄nP!^*i^/rcTKZiZMMSם^OxWJdILP0L>yٲ-#شx ^%Y9}'LX著)DVBc >P'ǐ;Rt9r 4R/e 1ryqRnVq_Ӯ-Îܪg''o>{Hu3zttG]`YHc7C0x%wGzޒ}#a~IBiMϿ򘾙 ࣇR/&?Odˍ[\5\ꤼYrx˳@dx11\ xMڠ?^. ]v(u?rNk)5ѫs!LÚq뚈Je y2r"9*}e*)Sy#iT!Zx4tM%5r%ƑxBF QZ4FT)dH,2T\Ta'"4L买!Qok:hxM) NXB$|˲ϩ1Miȋ'JR~}jUQ8YRmDK_=#w|C,mʋHDzc)?6jBT4պhuǒLRS}QKF;]Lm w4=)9isD.*%_A==E/ÿ́H@ڻpfE B-T;Mlzn Ţ6k*!8CgzG74qaz"V;+^h%\SR^J CT9,=<&T3!t#r,Wc'ܺc0ŲjzUWi^Ղ)խ^v)Jw 2R)Y4Kĉ̋&Z?Yp<2%TBuYtquu5}@lKB'^\u/Q| E)H؎FFd"f===H)RZeJTwJPnOGgCQHEܫy u\ bCNt=@i씇;|a2Ph;n PV#b-wZ@ jaWۋb:?#fK` $} 06-U\}�{'50Y~_b7ȏzHk=…hwﻲ G]k $~ ofmK�vl>W͗~Ï^?~(׋^.L5f9Nx.׶fabu ӭsrh-sɥ8S$؁u2 !"rmkЊJ"D$q*cS$f$b+24Rf,Q4D ~N$Gx ev=DXR TdB+\"_TMTՉH (Q0/chHf 3bC4$-IV(jQ 66;vj)! :]9t]]iƄM>õoQ)E>3NJ#9} : 4[*e .nҭi L^1WF,}i} NᦸvGU`s Dv7)o3pkY~[Nvedd!i41OP<ѽ@uK<-NTu7@vӢͧU$qUʹM//[EPLNOQ}#NJFǸvb)FhJ6D8PU$LH#Vw$XX")f#Gk.WJqb J {E/٪T˺ЅK,PDD2jb 2*9Id':Xz:usEly"!8WSġ$Bh],0e:2O~neR>Ofq1Uxa҉V^xW%i<zE}=WP#sps$5 5y}Gvn(NN Zmֈ:}[-\2<?8�w_Z?S7dž$&u�&KLM<p t-0Qߝ}x_�ϑ $NfV|{]-/-RNsya(JML ҃S;p\ܦ1d6hKNMM +,DVh+t59F 'WB$`T)FL/K9FB Q„$ LR<K$ i?z 5Ʌbp�] s)x:"" Ier&GG sѰតĮtP=С"{Q ]ߦip nDSڮ*9Q7*9CG(> >O]&IUPq <=QNo/†,BMyailx}έe|4Κd,e_!D[rR2U5b^R&FV뉇k.%SC<UKd<U?piq澹lՔψ0eA>|PtIbI[AF':AWh[ϓh8R-;>VK7l"Vm֎/v&w ZbKa@M>9iχ(II!C̘^Ja1;R&dE̪tV .Z-N!4LYDZ ZIuG!|@) ?-L D,,QD^li85yMYvec wytE3g7m>/ff?9?ߞ}qu<N{WJLA! f^euߘMZ_Hf^>Hߠƒ nJ>|2_}KڥR+ۢ܀ Hܿ>�#xJ] w=n2M߶~C<\ Cl�ջo?dh0(@ЧNF8pޠ' {zlXݿTCՏؒ RojJ(jh(qe)VS|ϳ NJ2 ') JpJSxJ22C8ו4S,R!P$!-9)䈂 ٛ\<c>%LSbAf$L oh +9MsHu<āB@aQ8!Ayqg U7eRɬoORwdt/bAQ^Լ\vK 9N$)t$aeQGҼ`0�$ ʬ*oPTގ.,_iy^x)eZ-YФꤵfFg̕HdŴ,i5gt|~[Ls{o?ФqJM yO7*%|E%ews>z- N;#ˢN\%Mg0JΪYPפ;aAe.sq,CC_AOa̧2])"%:1.7 4D3tU}-"gΛv>yXǗ!BiiWs#PIh$uKe%W)t߇BDʖf~8Ǿ<>MQJ.ǃKG^T/يZg|=v>]:y,,7vJw-⫙D#߸`a7կ3^ G+j G�Y6?~o ǀO>Fe{€/S�HoA['iJ.K*CLu5m컲>X}:\Aw#E|h=�: >dGl�'GS{̼z ^S?lJ>A>%@pD%בy*̀4WbT sT%%LT)Q 4JJE,scp�)Q3<3yE`}I)K3%b=)0x< 98RIM9mFrXQfh8QE2hYiUeGԙ$)ΒT\xxsyŅUzim5k&>y9!5)4[,"LGn?s܎1vtqdIA-V#Ζ}2GUW>pDr&-MEpՐ/"z) GCιbԉ/4=S wǼ|aFIwc?eZrAhqY=y<C.FPbŁЧl٩G6qEXY'A-*�>&2Rl&Cƭ6F7nԌ]~'d06 [qc҈a<c4rcbv7w.+ɒ.O,'i!5Tj"X .9PJ WKV ʺ@r.1%rۚ4c oS 4$džYZTWIE|m)1GhK5WiKE(q9ds(B^9)<xoAnq' o\C�?sGyeq²AWBg9;a@K $>4z�OdY&� p8MyO}Hq{y!qTC`G@["xw_*Qs0Bk/-dG~f$}ؔpu ݯs:9W^R 45q@l>P(1N0NjJ@}'d0A⌘Y񥨜x.dXJY])"TnC=d)mH""u/$੍ٯiVͲԇrO=Pmu mTfnTgðM71@ǵtVNq@VcR$D(5͉+LӪ(8KK&Wsu7׭5v='ZF{US_2 q 8V,MEF{R~ιOzMa>06lN:!WIcPh59!/Xgz)NqBc\.@8OړFE(tSMB+\՜r9(NB+ŖVp.,&yh#R84ꌜA}~V%Vi6"U(VY6W f˾\<OG!|W% U q"/{d-+A L.E۲Ĉ穬YAPUf+}PEe)z18<�HoْK-9\ryBk%. ȪUhb3"P|ɓBAę#i%ق_KAmC=ݹ>כYKDAXM0*~[dP<3MwEݽ= ÷2!u]].>@}C<hњ2\.{`/QWc }wp\Ga(XA>Ó/5CX/UQGowz\hzjATzʙ. g*VCǗVi1tWgƸY*/9mMHD$ZAer!x`i9B恅l})'>bʣ'?3G_q�M H Ss6c"':.x]Yf>jI)q>Z+ұU.21A)R3tݩĉnAa:u[;RB*A,`[ҟ/RȮ$[M\BL?nXBu2NjE6 !b;*ny<=;Wd#gC$!:?0_ɲ j􅒢@71T澜ER8S&lH0^Lg;)fCّ,Lֹ6^LR(.wIQ4beVr^xK&QU�� �IDAT MUKgK g(B6D#G*p:Γ_l3>Wk&.JpV,DZr-}Oe)+ˮJASr$qrLպrBMŷWEi},iNO]QΌEQXT*/D:zEvN&#D(|i颍%n %ъ:1vxE6Hceܒtgv:cdwAF]~uX&ߔ|)wĨ@z=iv,6bBǏ1|i|r7]#<Ăx koj{WN�쀄  jG6]�,8wdn~Tq5094T@lH?pI?p 4owaߝPO0^ح+!g-|�G?u9Ez�|Nr{?!=yysyPaZ#,S\XudJI\1.\Y[$e%B)b02|5w8eK)[3id4Q=)3sf99DS0t@}Yvq@5XN#ejFCE$')\LUfRXB1ihaenYgl&79NҸp811S}x:߶2qNߓ|㽯o7N,۟;B%8L :m+.q9qt5c3^r24,bfwzW?5)˲2/*#8oBrR˜t\T/uPWzX!kXm+OS]!~vIHv.~ӵ7L$FC^rnuKYKo_-W LH3? 쎇σ䀺?/jF*%Q.b8ݫ87kn8eٳ8$[ ?Oi3W<]/$П-OVfo)dI \e/Wt].jݦCOTt5 #34h= cCTyfBb^dfJ'V55mFVW`S!1G*^we]"{Z?u*֨=37M|V -|2ﰡ/V{N9V;`35v<$~U-vZz_'WaImtUO?ze8=?}X(1k#<cw$ڇc GK K$յ6>f, tk,n<i}!g{b+Hcd9IiRX<?SD C>l4&\ƊegݒWF.,TPQXDIfrn謏/q̹0Y,qJ ̦\%ߺvt Jr:ߔb]y#'Ɖ 4(B>1M69 -Ūew90^,?uz?TD Y̥G:}z2MjjXSsYBE`=&/kWIE/ez6H:J7CH_ww3F:\K/R'?aX:E#)2D>qIz1lStS)DH2RfJfL63UTj׈Fe;HB/tu4e _B?3T+Z֧Vg^W  ȗ{flVG`ͭ™�]>?=.gZYL+r0DQѣoHU<GJGF"2:Hǡtѥ-1|]B]Bŏ/ IǞGI.:!i6Z|iE.I=[B@c6QNIuy]Хi ֑A/%H{NcKVfThCUcI"LLBe_[g tS}Ҥ-{x<NOAƴk0e^̏e_?r* C{h){:;d |" #<D^kyk(  <&;_1 }`?}_k[lG{vV>wN$އ1kIX%Ab $߁j�_{@ 4XڪzF{RX]ktlowv^G-fԄ!OC}y46W/7rSw IjB Ufۊ 偞"ʬr%<H,Lbƥc%N/E,,v49 Bgn9j|J 4^O4H=%wsʴo FJHUL^:8RVz,R@aMKY'R"h3(n\)e.kRA6YSwVٲc__ÿ�r4>W/\ 冒uqƟ +ϼo⚛2&B;JVsgl!B灬r.ڣ=)W]Ú3Xo~"pËE?(ʒsGܻ, _R-*lOPbk>NtzT ZHORV_*)L檙a9v|Ny\.]%񕍻r4fehX?R; r]=,*/0XMlA0/G\3+ɢY|]WZIhKw܌bK}KiI2Z|D F�G9ua>nF0Y4\2Aq9#帾rQuud ╚fF2L0[~̅"3uU=&M\ A쏑[ 9׳H%x^K;H.@^ŎQ\+xF =-'X?:`wxq?*I}DsVhF(p׸[䘾JN0g'<\ 3:|aόX.X}= ) R(dO20ݴu C�[H6pPI"C޷hnȒ|Mki> ּYvW*g"S` 3 NYʅs)l,e~3>͇ /U;AWij&h $e1+V,k1."c(YPSJ&B¹׌!c&H02:' (&}*i,yM%( ޺ˌzF)#Nc )C"QwL(gΆ[1u1QD*([Sm7t/ȋyS9-ܻJ{L_!Z韚p_?VF͠6٥޺%<ri<ޏN.L8n& 6{i#z2WJ ]4fshe"OW>% ml(S _H8Vx&QSI2=$sbmn"EX# S5Z@Pm;_ՖEOE2hǴ_t "5{6&BbTRC 3٣U}QId+ڪ5$~ 9}h1-YiZ!Q#Maʖ. P�GKiqoS1EL %DHz /ئv[y*>T\W"0.KZsrjۇ('(#-c,2|FnC+]!ǽ_o*b@5m;R˂4OjB�?  ^)/4-(Al4poS0;J#1ul-Ixn^$n~؀:>@]Qo }1~Xӷ4|?Dl ;#a80{�}`?-uo.<|]<կ}yU0ӶiE"ґŁU™FVP;MoH+y\.˲fKuEѩ=\$QbΧrvNGS } S& aSĊH#"%1bOɁ{%! w4J/d( $yU8 oIꑖ@@2CwǮpZ+'dD岍.dE)D虦)Η} !" Q˜%]4OYγTh2ņF!mߞIY-WYQ]2V\ yԒƐW[SkwF8rG 3f|λ)m}_='EtD|GxaKC~t" Ex^y3l(u(5ԉ]^IaDaOii(\PRh9/_1SbfӍN>xvSѼteva9Lr|$#i3}VK[vr􉾹|A A,PZ]bjWdA6EZ-I R;I9=lxV賓e:=͒"B!6n{wzޓxA*}ALqrUuν&)liTjYe<Nۜ. 9%JUޭTntYY!)Cr!gCXi,s?zOŭ;\itliGaF<C=3*X@!Rf&ȿ3`H_"%/# O:h]=?``@񡼽W!dP@~�k#OX~[黗Dl~o߃nsBJf=*@s{Gi:?2UuRVqs+wo,_)\Н9<ܛ-[\astP &k6ښ"?+%MoDQjt& x=żYUY# x8{k+brG5EOnMKjau<vНΜ=G #}g4?{zrcacq!J,簢4&SS�f&+KT ձ#`{ ,_l7pU`5 A"& UTV$sEKܠR(9 V213U+uP[u\]n}L|>-Z8r^㛳tij݅ފtD"WA~&s#WMhvf:fe?3F ˍ'$CkXw[n|-KSٯQ\Ήԙ ΤjIbz}cDڷaڕEUScw)Byq]MýmMlHn垬|)ΓQL#9 UƤD=Ka6 8?>ڠJ(y+6fkdw~&L&.u*njH1dD|n$[7}׬_o;x r_npݜ&6H'ӯkڏkŭm;mÜbm)),0sS s<q K%\tRnMuØiDu2)Nծ]-LF]c&!-4)twjsD}h?jsƪCMg ҍ</ �6c5gۥ9=#ʵ?C8Y"͊{͞{[#E*u| fNm�Tz}? v/`J̾{8ETd`$ �}coWxY= Y+SxOAD)gW/k`WGq~7f %{F|RE}k^Չwe"RYږȟn֊FI)C-H笘PRaU˺R^B$tD]NIRy| ~[$*l,\E~d&12&& :\ⅹHpCPSX8yh<E2r"I8Uz.UAj3[6T!i0S=rjX)TO'rխxR4v b B~пs]=YdIlM6CX/{y:;dݣ>CJK<wɳմ;m>C& s]v=g6t37"(e;"),l'JMb>Ď Yq(m9C>_.k*U?VQ I"âjTt4u <V3zW7̞YuUJN`&AM9pX&}<).n3_qVz٪5OŬ+Ҭ(dInɊ>OeAqqjV+eIT=TXuֺvո*`&h-E2u{LBVʘ S~)06<t&r\;$Is8ayq{aYBO0-Z&u12Ws{K2瓋{;1[q:Vn~ W~?Z_0? _Rp_I"}([>?:շoj޾YJ\C�k3 0ı==|(45̆-Lqyg=nN]3#*gv^mnM5ȲxQ*UknǵT/J`q5dj $OA;*UasR�/.uvxҮv]fMjywk%I{drfiD,ψkAFGͅZ/ZTG1Fv"t鹤OFtD?]3רy/O%Yo: >BOİ_v^uK9ԳI\M+B1J5]_۰rͅPv+W}ݲ][b XQ{|j?VyӬٖt*5|Xa?!ŘcċKM<KɲOU?[~+Ä_*續WYNi3e0 K],1-YJ^~מƠvFXhdSgJjÄq9-|Nk6gzձ oƪĶmKMbB=D2^|:i=bG5TIC>0JޗڰFwZ8SDNk%gY %u v_!#k!TzSQyZX|G򁅑 PԲ^TS TgMGZ*էrz9geS]P#?"g1|z8ؾ?|g"&@?S%Hϰ<˃—V/Ɩ~@pZhpzKHm(_ o;0p oW[ �G<o5k #h #�vq "#nofyҿhLZ:x']e.g_=˶er۱*?N%x(l {q.l@ iYPEEU+fS҆2feFC\h]2O-b) ˼WT ).ZfCMu}} ^ i Ҟ e8DɫDjf7'ncZQVjߧ[ehYY.קeAVV*IwJU_ow/FUӮjySc."b<OxfDZF<v'?F{6ɕ#ҝݫZ6}qu \xA?Dߛnwf] Hs>Ǻ/>ݩRS^2Φ$,GYg3 <<ڶ9JcVWw7ڜւ AО6zUIQڐ/S,ڥfhB3>hU+35OWxj*&JE&F("K%e4sHV˭q8+!7%=*\SWn0ghdVL!\$5i՝UWNp#Gfe:iiOMI4l5x*k(-":"T+,☑+Mq %%FJJ6 \Qh@%�� �IDAT3H!O>0a|8=!�ygQD;aɼ{0'B'1ǡ܈/<9}GV.Zaz3Jh߬6Aۺ?W~o!~[ ޞn8 � Sy BoEC/mD z!kӖ&2 f^+[ w_yі҇F =U$c8S=cU*M)(ROB'Z3ޙ*hq9fjw&c8͔eεVUd#,IbWFȴya1Zƀ.MQ Sjer14&T)mD5!XsEVJ ɚGXRV*j=gc!=>FNXne,fQ-M8KB7٧'wQg*a]=yUgz_nC_/7/V-Ztofh.OΪWe2-B?j9[~݈DR͒1p;ηNŅXKcLsØrmǽ['x6KRTܳS̑fmC }mV=maqjˍJK%fӺΐwRe>yFą#i\d2*31BrK5- VM-3?R'W:03YWV7l⩖bȆٶZv5:FĹLQMIId3s=TdHiz+|ˣw}$ɴYL eMa2@.c}NٲL`(өcuN\g bd۞>W3zx̘,�}qϖDi0F ~#x7@v97w@L]FhwK*߄oO+<g& #rKq[Ybfo{VIƳFş!LW8LjB^K7,;O*uVTOzmlL⌮n)Y( #%NG>ݥﻬa qk:jsBs%Yi˙9FsSXb)XP\hdWӵ3oe{x*q*i^B:+] K3^gANJeXvZ*$)tIV|Ղ@IUhρؔD4֬۾f7a/k.06{q W\?7# M݉1f}Dex$QYqQ`E-ȑR-qSHɷxvHWq,EܪdܱfФejzS`)C45>D;xo~V_By)57R=uvS[ΐn[Vٟ/>KL]~&Mcٴ\Ec=դE}VWblJK˸¨jymPZRKiJxWE9m['ZT|!dȂ@4ArT1. ҪMNR5L{^YGFi^l`A,~JycĪ<VyU 7,qz4D=7J s` <G&FMgW:f >V*/" b½XufZ#0Fe}16OªmF:7W|'?Mz"x>\ү̿N`6] pm9][WVޕ}e.̻v#S@ 6hs?\ @(_?R\EV~']aPc@\}X__ )P<DK0קxש2\96)*QcLI^J~@S8zX KD2f-M<v5S`sͅSWqQ\(-(d]PPt ZޭU/,Cz|{Kgi3U5ioh0<INȺdSzIJUR`2չ0lǥTqyN<12=Js.<C뚃_-i: M-`Q*"cTi.7cw\P,97Vbs77,ԉGu)[~={\rg)ƜCu76b;RvuڱN\iˎcG;y_Xбyyl~o?4S|=(gy M=yK:J'E)5O#1'E'Uג'7z1-d7}}bQNwjˆLڠIu-ƮlEl[40lIeb]fgVH &n72uY. 29wVgE)jQkr[)t<S]Q  D 983BJ.U>LdM$kaB(Gf,;1|x-+VλVsXjTTC&W1IoIW&$L[ziK Q{OՄk�AF+0v<T8}4}[4{=6K"> kL;H x0KāÑ"e_|4DB4kmWz館7o:O<B}9;@ԈB@6g>W(F^l\M$6Zn=T1WǨB~ȱ̵Q<}NyjMyY]fLΎKq"d'bYuZ7+;7e^b3;65Re.<J/f< \ !ېۃ Z0,N(v)-܎\4uMRxj5UdPFHIR|E9"Xlf 񱺩YN#ܓf\lSj?/>?TKigx>v^g*z`#s21H7qtK"'dI#͍o^P^Aoriڗ(;ɷb IK.0n?wŬwM w/ڻSdgY[VXQ.k-gUK-sCbm4ka=!:ʦN$H塤!*eYNrVcޜmSeLzeiȬv^N[NiK6)XSri{ABK&*zFN0e,81g1;[ +s-Jx6eDf iθPMm.+-d"YĔYR.[:r K$f*g-VF{&>?7Y"3G0R*_^In~rjQ&in�uwIo+"6}ϡ4ht*Goq[:߄(`xf'\ <FEQL[ odAb큑R⫯/xﯹn|0/Er_=EB�:"(xq / ʺR'u#웘3,M<m^O/m6ݤ $<^dg%oDQƐUKh1fś^(݉ `y "$!<|UJ#ę &)r0Dž,DNqK9BVdMzMW4$ QrZsy>A>fx*"]McJ6m\ȗ^IQ+9<4עUъvI}qUjgu͡Se`31Bgg07L4<Nwmg{GgM:nZ0#0O1Lqaxz\;^{_K)AIZ뻵aGm?H% 5<q !\F5iV+YsO.<H>MZm.s84Ŏ[=[|g>.3 MeF<0v'"2n#icZJ؇"^䍝 &9gl,KP.#&&)e*5:I !Hb*2d8g`xrqײ'BjE58 T_+Q Ig0EjUԪS! Mũ2NLQGdHQ':T\lF+9LZ(" //: P"hW(`w@B"nG= -3 N!npPxvi[v$5bN m;Q</q\| .Ib+lqOUi_?^~1tz1}K= 2^#ͻ6:"J`p #j�8Kj1JjZؤokb,}<"yfBL_9BXAys-d-k:k׍k׊Y!ж7z]@THy00.=FN%K)"k>WxAűmD|&,عưl"(V2HD5/SRX5TBcGEGP9@ֵV= \* )y4G6K K(8SS9ծ[tlnm>^kwyfW7l5eԈ fe3`R~ӏ3~ݭY$ ޾Η6A/MwUC ]C+f58ė$KR\l(]v71#3d.Oҥ6v.q3_S%Q5$w~Mo"2b`"֫m:y]zw`C89$Qx^<.Y"193iE[wlH<%\U8KU3%QGg#I'Y6DY'6ϴbȹȜJ"p]j!XإL:3S(T|Pd\ B&/SI XԺЭBu[, rōb bF6[csV޾C8~~Ȼ;:V+p4˵ma . `+{4ubbV}:<.u!k /9{MƤ雠FX֘p?6`axHe bJނ/f`�:{"W&<_/XX v{j{+)dKЏFlpI'tq89J$#wXu*kqX-ViV0ˬ6R3V WQER\x_* OA]j%YCjq;Ej:][#0845ڪ*ͅUrM%R`qOPJ6T`̷ArϣbL䗪|HؖjeŔv37id PV3'b0";vi\aKn[1Euwf5nr?\_gK- 3z܏VZ3:ug?{_MyOp˜PeLWoh1'oi8v|G5lV`͡%.()=p{G.v%œ}kPV)qV qXf F!Z){)3I Euʪ'X!tXexTLJ*EJqY#')s$N:kJDXImU}VtN)\X\RBCvUd dXa(^9Ȓ0bJT.XX<!S-PUۻfLYMqe/:M9([{,kSg!z}<]c^Ѿ$_ l3W%b苈qƣ~,p%z @kHoo\{xxDOSts{j.όo/K{74r}W'& 0o^[πo7š*T0~aSNbwK0um[ީi"t:{ A+f{E^c&'#KI<̺h횱FF@å͐IԈ %P0<IńsB5a iQtRBtUẺTr *"6E+% )!FEZXQzThI-0Y sX3v t0MAޟ˵7L4HJz,6LYgq(,C5\%t*s-eG`Mtıf,)h3ץ*n&gj8 2W}w3(?WQ8뭅P4RB6ųTJ))෍=Qk521(?t;4T7-˺%Fs=fX0.y؋Yy|XN,K"6~5/|-Iy=Y]Zkc&rWG,W2~scաQfnMG~ejmUٮBjSSA@f( H:R\W3+kb~49pҊ;J%yfO)g t"ot*J,LUsEJFJr"+Rq)Ӊ-C^c a fs\%;&뱫)>ɝD*/"-+AS  A&w|Tߜ>M`\t?M%x:upv'z{v>(3 0!V6h vDs۷1~wܳBdo{[o滈%oPrl\8Αcw=f#>MP{ӜM?i^hqA5Ieu#1[J@!b؝J4LJ!HY%Y]QscYԢr,ҖԂzFWJVZT90* ~%k9os5</TN SΥkWu,BT,cR)Q$n&N &VbYSt/]ʼnڐJb %sd9җG! e![BKjm$nCVG&y^\+Q+X;EIWų aml)/ӳEvsu!"6woս׍/6֒`RUfn F+J sn'Znނ ܀˓SԩPI}8K^p)/TΕnh;X+,ʌ {9/۝;$. fG QBTC'<z Zh"̉CiӋҪjS>*a-JLY䘖J+6GRQK0,KB&4%}LLJmѣ"9ᮎH)]7iYXp -[DC5sWyD#�=<ͶٳQ&cb>7@~Na&߾i�E_G M7`SH-$z`P^u ?@xV/�z;:C&@lyaugDėogo%8n~_ p5=QϮ}?w<0|rwz`WBmK{yRf_(甔J5-Bzu*xTJk`*ڎ!D[#4P, (jT!kaBJ+uډ8jbZD`P|^F2slK9:F5D "71'Ygݝ ѳ"5SY"[9UֵhZ7PkՖ 7&D(D ӵ#}XOIϳiBiKbJpBv!Pgnphì6I繖S`=ߜ[~ҫ د%fS\~t~Yy*Q>;_{gͅÙ:+xsIZ:E#Pao='QĆ,JmX&jG_W9Ƥmb(N=ӡzÂ&U'yg4`{N-b'>r֭GSj�� �IDAT)RtSP"Fsdk-7gXάf[nJTKqD 8{E5PN)P(Q$d-DYQ2"Z*!d0ʞjEV$"6ْSF)$ jRZ1r'UaV)@=)0+!ۄEl\D&\VW^t6@@b8%7&_zE|A\jސokRp`AQoMDrf5~|t|;HW;w͂CEǏ=O1&ti6/U=)Wt耧0OWKȧ4IsYbk2kl٬)\tMKZ3bY>]S@Gܛ5Yv$aK-BiY8MIz׃( {F7.g=\B'ύi_^i('!2\jj*UaDL[L4Xc@ 3`МKZQ2XET($HVF%zf> sF@27R ^) 6y,CkPZ&Ęd iiC೉9ԪQ)ۣ2 k5mhVJKEؐ[Kl$W2.h) ZlpyjT✻zmZ٪RY4j쥓ʖ>r1mފ8nkV oopf&^^څRDDMz2}9y- l0#tܴwq7*k:{} s[r\SiCǖ~ZJüw]M#<~ċ1vvk+wI>a4}/Xt'>0_Q.3(lVfŸI"ȾVjp<H[ōJ\bM'skSz5Ȫ<ˊ ܫ A(ZQAU)&4p@êFtut+.$DK!xUE̊*Yk,eJV rUP<2Z86Bex7;'6Tl/Ϳi~_b ͓m#6z. !EX|>J @m%nHw&G`{ -% ˇC!:i7- [7} .?EXPg d�@5@ �#aC5\|B9{P;x{x힎]<\~0еr^\Ot]6Hju~엝&K/dZs\ISPfb uXPr_ a.j- @I+pd� dr1HlX $0sVRT -JM*- "NaG`g2 .TYȀDW5IeIhEep%t(T)sVluSɣnRUD(mP+jodjٮiXGv5?.c+ ySFB7r7!OvQV.ĩFn@?֘O14%oONAj9]#2|:PP-ۛE>X67z#�dqz0 "I`UYA:q*/F/”ate <5]w>sѭ]Nh>uY0ն7 C`VUYTV y#I渮P,_i6\Aw$(4l\.j2%t"fSa(-9 S綨M6yyu.']ڶIBXCdSs OBx;n%-ŵdS!:&b]ʓVP1$tvys:ƌξ2zQ^ z3'OuB|q*ܴZ( _lns|7@8x't��ԺP4�tPfaߌ[Mߦ=@#bC -�׸x- _^�8gnb�x Uc `� }uwJV TLs?P9Peruyoֻ(f?@{!XDKd[=z̰?mVۿШv_\8/DGjQ?^Pil?X5PVYj#4)QX%’XrBWL1>6IsL1d dQ7eU}<K̐[ne*_Ae9E"T"2r]2`Xo I$e I+rK JY7զbպLEhd[*]*l,f|FRk2Ѱ~p4K=;WLFyfs ISh6RlIJQ.2nJ"WĂu&e߆V6%*p blV*&Z`]mzPԔCEMa,J²U6;1 6,aAU"/ C[0rv.cWkӱ%C^V- dr5d؉؉mξD*rӜ4.٦.5 -u-2kRE )kBGi-δ`QQ(Y$(bJ +�ݗvuӚ&+!aj˂ B42!@Ăh1Q@x[)q&n-|h}IݴrǻӱIIu;"=?YH=oV)R`n776%j@7pv�7َz߻Pa�oOe�},j>B?r~Jc:?|Ek:|J�w}B#-C{۝86l!%r5Ko%<^ PK$x'[TvnjUCng!^5z53UWWMe]~t@/TG1ghJkET#I)$ %Q44,6yJ yX d.SXK �)R4eR`6 �!j_U UI$!bAEJtYd6XTV6UP)^F/*TL!aԕ)>>6!iA5Ef*:<xXn|JZD,Hj6(J Y<xem 0T27ѻVW1M1Ԧ\(Wu3^w2 "T* Rb@~x= O6cwW`Nz^Y{ʥSOAuӳKʩ;RnFoݫ5.+auAbWvXۚK^J1-G7rS( L4شJ* s(v G3K3}ۮE:ϐT BTU/+}gS,r >D-BՕDTJ�K-Sp.Nl RTEyP 3&BWXcsA(K&WY7'L2(Hhjţ(Wd8>txϹںև ZdO"kпދ)?u&:OMgf3CIJ흪 #�D!{i`�QQo]Sw5}̏ ~@ f _U�~ � OvEgU6kP%l>,X'WG.3N?ct}QcysKiZV<6GjUnΰmգzg>$B_TPTKJTnd3I*BA UJUP9|^ETZYcH!s$)*C +ʥ� _D, .(T1�fMfg>-Wl \\*nmĺ M5 ,Rfb2FnI&I* cȔn5+�Aj=":⋓%ejTϣ(JN=~p{Ǖz-sR *!=crh wᘏ&W$'2k/^<"v48֢m.W$^~܂ (].:j]mي)Y-Ј}0K/b&Qx)(?JUn!> *E9(7Y]Ɖ4we ;.J_ԍi iINr2[ޕ-ו-%zvc)ȍĦX3T* V*2R*4{K!lmEd!O0 Db!|K`QD se$ֱ̢:X9o_r{Ð0|Y6t$»{/ pjyX  j/9)7��Ag��A.<?lC}U"]?߽W|%$hO wc{ ~�>wה?#6| >v_u ` �B+@_ձGAO.[ f�g__�UU�<j$SW"9}7{6=<Hk,)\Rokd7{(5@Rne`YZRǽI ݘh%+Ģf!CgYE ^UX3hR2+,E9E؜PP^4Tuą`+p+ee%E6=�5q8 RZ.ʍTK sЂTli S0b]tA4jX:sXB1%ι7Ò$kɥI̪0:tauӝoL+b➒sh@c+˨%{V;Sč`B{s>蠨FRe~%UQֹ^ʮ^A)_.p(KWEJuC<@ڥx61Fw!B K]CP'FTSԐʍ妙EZMuj;e;KKM~s$&84v..O[ 5s5aƦvj,+bPbTEj r*R'916ڢ1BR ؁U T.I,T�R!6BK)l+.U<9)x_b nE`#o;⦝n? pg, =q+)R~YG17s§}z{f['Jxppr'f9qŷUJ `n,~̅_'N|<OHl?!~d-?o.~O!,t| p8ꝫ8`g 2`4B�ۯW f@1#<#R:>'O\K-EwCۊT|?LI T2R]rHRE2N)*ݛmib>3Zsυ$Ȅl<(rTeJ_K$WmȦ.��i5H ,KԌ\NFWtQ$25wY "YT-*l(!@ I,AG$P@FLyd/Dr(Pn D$/Se,R".@]VC62"wVGE=,dhA++5v_HU$lŝraOVv{,,3ZMoHj֩9']?/Ԅ=EdU3m' ? ~9+ͽR k l2*ndTW؛fOQá6TP&�M3UD .k0_h"ʱ%&*9AtjKN.+nTD6F}Yq k@Uȡz*:-eOR!3b XJ ]P B*:!۷eB>Gr7I}]Q9{]#e}>y9G|7aԩ�X5?w! tK[{<G<�C4X^,мzi*Gg? k'SP(4?')Y3?"ԅ5z^&D5w 諞wk@xb|oYվm MOR `TO>{~7B ]Yc7(lYRJuK�rĥ6lNRg@E+%.USFsN)gWc (눝Ɇ+Ȩ@V["Y9drĪ:Rw*Jւψ# LMd^keNcu2LS d6 2K6Xz1ƿK^SBA`P1[6+!3XB]Nyb)t:+|F %QOtȪ1-I+o1㟧q#Vع3S9t6.2(=;{_nzm׫t%*M"` u0]^q Wz1V6Ztܗysh윜գ^tܯe+k<MjeƍHSdU3ίYmp;?_MbRV3h]||I7c9 +Rd$M2B5"8CTSL:U)6^ kZX?th(PX6xڢԱ0TDufe"Rq1ӹ&w?ߥD?;Q2v}(�4iiBa/7Kg 㪅M'E�Y oAߞA에u� IJ{&*l xKBx hj䚿<� 0�*Sע?of?֢{ۏ%A#oN6XkqX1/Z `F�P p2yz;!\Auzp_<'X~w_biR0dB9<4FٶgKU"̲m#6&X؝;-(^Q.BP[b>ӵ| ko $ %R@kZZ eN-ukcQRS͈BG)8V zJ(+\EiV,N"fh"BjEA "J+\NI%9Sd{T|\dT`e( :w?w}u(g*ۑyX2c ꆚKEF%@/@JR -}_E{g)n~j}Mm[i*\|quvR5: Zu0flimi0ʼnnosI"VB]F{Q=KlCT[njm\tmݘںAe)F)nMJhe-1swOL"$aSL'5EOh ++˓|Xm2lWmċjh|TM kRBR@�ERӴV:V$ $B$W۾BFK d ҈x\!פ$l{4Z0,b&X(V5c�Wjai9.N2!;5@<^U 8kv=hv=)nZ`u:w0XP 3@|{!6w> Nԛ2~,?V~WL?ahxZ`N@0;?Ǐ,cfYoAF@l%<I0, Jg1h_<\MuAu.)JA'% H䥆+튴ђ3'&y[% v[Id|\) DLY Rb_p6"dE![ .$ 40I�� �IDATL $Xp&QTBL F9"ZP$ HM\YVcHFն\dӒS`NZ {%L 83%7 MKAh{8<\ꁕuCUKAOI/>h~"RɑٔtNX <rHXA6LZpT@H…C/W˵`u'nBJp<Wi n>Q1,ME&(Q,kښ Bo9fM"xt^_ohdGA]4\lE]+U]f82M/NxN9UeJE!v\᭹t|VdXa7Fvr]}J%D+T%}Sַ2@tu PJIrTPЮAIRs45Aae{ܴ9tN:XlP TPe,hAtZ-5.%MS1d_&'~M= ۄ"ݯ`8S5c ?o_9㛋?ޫz=M2w@konד[7Jiu8q'3G0Y4ps ^ի.Z>>7۷�jۙA �^ ܏:bwcwc NwYqp[/)IJ73�!~{Y஍٨YWp]>+arÓ7~%#T?݃'Z^C\r`.x }xe;s (8+BVVGC9'ET2J3T � Qsjv RZCL SZ:y̔ɪX.("BJiB!52%IBw Ku,mpP,bM-*HBg ؚjZB%t�(PRPs6KZT"{@ Z F�AEL{{(ѿ,9| dM�$wvh~Cߦ[+J1^βxdj'R݃}rb`1,yicUQ~7wxxFo!.Y"xL]hJv̓j0вYT<&QJr*Ƥ=bCt\X3&A̺Iez EZ+6!5q#ƈueF(D.޹O {oXHe\hescREP}\ޖ:XuשjQrur5.vXI C9J"\%WUC2W.nftIف&Ѽ2mo7P֮uݩ녟u`d~l*fͪ9nQC6tL]^\!/pXٶ͹ �7v }_OW/ /Dhb>'?{C}csLS&0|wwv�л!@u (|uO{wwnJ< \na@Ovw&v[L'cjV ǘNy^�`6lHV& zEk0rLHh$Qx)S VT5:bL9JQZO\Q0a-\7D� RR�$ #bABra!@X=bEfEH�f�A !hT*@ jH\p.TCr)sStu:,O:]+e/WZ6VPYI\ޮ6jT9#mck; ]+iZX,IvSXaZ*d<ʻ~ u(-]z,\C//sШ!ˁ].[Ten/sǛwM89Y"ܖၶ-4<Zk_(9 󱷺ౌ7h^^t|֙!?ƸL,YՃN!h5lW` C՜L0  '6IPL x!5 R 1�\XQn(r^ uhFޖDM�9r<_겴}.2|)D|D6AgZZҬNj,Ջ;߽=Yݷ++<ҲR˭y+P-A; Y:XE(pr_X� pW`;x։S Kⷀ<5;e8AH| @�6`}z~h{r9@ ?6*?OG-*pz/81nxqݼ0׬ ]A^RضUcT_a'� #܀S}+ɹz]ZibO1͂8{TǬ;t+]@UE4!Ȕ4Ej, Y J .5u’HpɅt ˥J]>[PDKdvRؚR\S$PvDT PKN$Bf%V k)%$Bfs.ҲT5 ʪVB HSJj+hT'Ĝ1O΋FO2ج!)bS&W-L:;IBɑLPC`ҫrTzqeZ3S2"lQKVHN)Wdlߴv5+m*Xw_ΝEZ@fDr6:'3c<6.*˜;!Ͼ 5Ij!Ϝor ۍ]kZ9] {8xmZw">ZYv=Z#ʻ $RȦ5m.3S, tJ4(4Rg[ne uIJeԤ RT(JIP92J @ܛhDffёVjKKQCӦTEVYL!e a˽2>9\c'ħҼޫvaOkK9:�8<P/.:p Y/:']�&l_}oy %'(� 7�;}�xp0,ߟq ۇ?@Qq<?#0߀h}e hGFwh%#�z7ާ ZL&  �0x_l^%e~Y.:?�P߿wr&!#e (RQ2(.j]LCL, s1.琗;0pK 81BVŜEHlVi}$s8dΈ]U-7im I#@`"u�)1U2` k-"C%2TY$/xT4$@VG(U Dq\o}fȪJ)rRku2ijd"5~Ͼ3!sRDj'dUOy؋kk84kpLw\kLCMAJYV$o>-1zEA[u5/s9i|qfY<>07PWi8G㡝IjdEp3d* n.lcDcV(YvmrNp]x}v>֠LI\Oxu%e%"EbXFۦ>QuZR+iK9fႪsK^:{yU]cCw0vœ54j bFDkF Kʮ05 i|YʄTBMsJb8sd2zk}qVGdŲRuJBx8pwLXx 0mCtw3pn2b1|ܯpW >{g,Bd�_$m ~UYz�?5-5b+ On~u|W9Iu1cNk/AsXp'�4�~ #�5 p>B:-<n;>hϤer+`n9(w ԽYdIvnw%\*jc)j$}^? P"dͪꮨ̌ͷ~!2+k#&0%~́sηٻI05P°Em4F֔lȕO!Qq 7uuȫŦ"GSpDpFB}6K2d%efB@b(CA{yY"K<9.2Z3HM)gV`9 *LsS /2JH͓/1I6(VK|99Za/N^e<-A)!,۶c!)bK$de^9csOV\%qi3T캫7M 4JPh%B[^]~}t>uyIs)a89{s?^0kꓢO{D2/Mk<dx"156E,]5oJss19)UVm):hrډ.-^dh"DT]GUN ̗,`hx5226أa}ZvjYx,pW((Iw~1z1\I`b1!*?۳/Ә5*[,FeS"vPXWaF2HsdIͩ0/Έ!VH&FɓQfx0sDKc Ş_dԫIțuI?x*Uأl[>lkEp'Kbݖ9`80#kC>~Q KxnX`<Fh #0k`P ±V2k9 XwT^!ʛ[`|[ ޹h xƣ-n pz` ]pׇ*@~d̝ aF� _b|.7cJ<GUA.G5ALumCGX:4e1:s7S儳|)$ 9"9w2ړȵ"I"2`d/$Մ*YIi( . dY3"3&LvBm,5 FS:UZT)\`ZA2ULp SɩLs~bGtE zgp$ynD$:^է@S yO1+e,jI8%r:bW@)3Yydr_gt}$#=w֍VZ%M T`!i&lC=Ü$uڮrČ1HI6,+o _I R,:o/jqf( iv ya,e)f#G6%+sz1$.xU E1{ [t+PdI.b.g%� s|ʘB>W"VE} :bYRҲu tY!:baxͪ΄rp%[5 2AYHr$ET\*MRP%% I)Qtr +(ΔO2<=6|9EA*12۲#aS5MVy !A=X̰ Op>Ǽ"DD=NAnҠ(2K LT@WX>b3i?MX([�pAs!k[%}wY o~<z ojB?ozSC.o `�5W(Po'Q/BgBf> _�\,[˪G�骗]Cǥ; $V%Y.Ass¦H2Y )Bt~e مYTrĠBY*.*菨z"$3rID)PR /$uJbEe^2(07;Q{V$d1ڰzb,,4Ҡ E )p3(p>I4/Dl82M h[i +<X[>R:&ՅP͟tщ5r?z7^%k6sd EY&j۲ Ӓۘg}nUrcn])͔GvHmp(S!xZtgw|ow8·99j&E\:$c  :{;K)TUJB ϣNJwI]yHel[ CLZ ڂ{+u~J* {9=YKSJ8#WEb BU&;uXmIWdҬ`KXUJ*J YF%q8X (V.`Lec4"Hipˇe0"=ZQČ(Ws 7Kk/S(FmkO`G?b~5+L\|P#g!_aFq~� /ƴΈ k@wlQMxˤ?m>?$\�p?qoxj@ #[M÷4z7vDotTPo:xN7.B~붫MSeO@7gڢ+|EJo[k51Eb+9a"F9On؎Ss. _%D9"xYF!'x_|ߛjZEٜ(pi2+"y/ HFlk0Vu<<EԮd&-d#[R() y&5(nb]χpo—:+%be0Qqt"3<nNѸ鼮 yLR&Vn/粻?Swa(1wЧx+>Z1 +7ogiߟx͟ Uڜ*3魸Q5/:ǕO?wySH9=[r\?ϟ?y*yZVx㎧<7ezok'vp8w3v2{QV/=ul+�׼Gw|z3[RH)E`)Sj<IZnjڛ k mȅX1 G:ɜP2G䔫Vv2%BJ*UC3"D㽅\U@i4ȂR02cMQY\ Y 0O>dUA͹P"(D݉{\x)2Yp;Y;g)eg(=:ZyvN~|wW`,0� ր*7A=h�\|}./)#f8~kq9r1T|mtG i6Go[{a h @�N5t6 ș=ZopL53GVHY'4Fi !y1H\sݧ:>rl~!幱"I/ݍUA(r#0]}ڕ]ruQD1)pTb>I} C5r <IQ *URF5-O8*4DZHS x^(ʈOe S eҚxF8[ycEe gJsHa% qb͙& azVj,MLa-<?0jvq-dƇv%)r)Rn})-"E-[5mUi^jZlg<Yb$6\5IC9L~fMw]j}"={ms.ngW:wO6/޷8'<Y2 r4l-*tv?|lMg$E i�.ym8M&)/ۻ~[umN6'Jb԰3r,6x-WTHȥ7Tmxi#s`bu]UYì&9Q]ͫn$$/2�bElub#șSBtDXPؐ ;J:\Z-9)($RR.,Tls%}'߱A][F)z\ugY$jxA˃gQ- 70'Z1pN*7{SLo#@Z=?�� �IDATkP$f8`xGM3A ]vՏ»F@"5 TӏPήk3w on(4&oɻ7Ky3V]?V^GhJ,�nq�ě?E6@ o � ]Q;\<Ab˔UWMunmM0|$6tFI1gr 2 +s5INP,XD񔧌Ae8_vgq˚VJ>Ca9e)M1^C(ΘLr%'h(.L,E:g ygKL%`\a!p9) 4q)|&EBҜZ׉˘aeIߖ32j7rOŤMhݸK1O͸r \3a\5y/Xi)j 3[x"I)U 0E~ɷ#sA UŅd6ySS~fR_|wk' T)e1qHvF?m5b8>ƛa#y;Qyie˾igſcf(Qs'ڧ$VQiKxl&Hyl+* `uEWlU+T)* 1UΛr,RcTU[YoQj$g37B.QĎ!K]p.ڟ LNSC`$EkL%;gcIJBRMK*DAeH553́15ÜĤ9ݍѰ97W%\.sk`(E_ƄyAS])c_} \lu)*>�0gb(/7a_}(.vЄPfTߍF߉$`,&PxS2)Ԡ©=ooLP _/ފ�}#0EHodKo1mtцoS%fPŒkc`ou=gl)%9ᛀa_v+j[a0u 6d`x 0w�Q6"av/ӏ M/«],aZNAղIA˲ÄNԑX!&ފuWժWbębBeVܒ3J9.RP竍�X  F$\LLFƙ\ e4D$R)̳Jԓ !Sv?RqjéC`bʥFj=8UQBVGFj:ue>s3cn.vJ̫q٘/"yo.3.g(IJ ^m,Xa1" ì$Ay.Z24݅Y<%Ik"mՊ?a˨3J b&:LEF$Yy|Xw7W!Ӵ{1b˶^4 ~=cGY}.}.W|E5-X ]Q,*+lc<iQtcߕmVPt!gߞfOeUX5RP*$P$ kRT铰6*)eCdHEpf)<n!Y~V1&V,ƄYsbL8U2O:Zϥ D!/M>5iX[c(A/{Uө1Ka5vX=Nh%dQOR:OqN@ oJ=ƙ@yӋQ#jt~ iN{Գz20}kXOﯺ;hH,?Po& �ܾ;Wz +hP4r?7wuT-(0q dࡂ�O׈!:#aQW w:=u;krP mJ!)cNaqRUmIIІ<*jGSI_2Z든'*k6wKFEKږ.+fb�w09"S\SfbV7R8q,"RJ Hgm +HD2 @sf"( ֋T3ATu.!+BdLe%YkB%eQjvrUW^;\ݹ<͔G1%M!:~\uˁd!) ~;܎S;fwCD!Nu)3Ze՟wsy|ե[N]r'X/ai0>#O~ ,iB.pwKm!S#!%X d7߁N3v,ND{IwuJ(*eŘ8PYpRv:uӱΆOd˗CȢ "=5gDrIV)VJDJSr `V)Q֩> EY ,;fD !PII Լ�e.x-"Y9rB1Ey8K.,DOlN~3r_0WoX?_vvNm5UGQ<O! B~{Z�M;kq:o.\_NM/?' ߜb�c_OӣM7f;,psvzU݁;Bf-@?toz6/{ڂ M?Ȭ6`̯mᵎ<M P _N!:lү&BӘ<{q?O͢ލ"ũCvГ>7ib*jIU-_׶_|jHOWʄʛ7@NrauY d)FT}ݮdӓ+)h)yK`zVRp(KT:P,B9xE.$T pKb7 &c#ES1(&m}4, ;΍]L 7>:|‹o /R|U,YIr1sP%qcD.!#2tÙqh`,$~y{<sf]z?n:hM7j,5 %gc촐!F_,$l繟dY̆KG:o 餫VrŽѭ\Kl.ޛ^TM۱JU*)KJvјR(6Zྺ 9ĚI#6Z(4a+*,/bfRZQ<c<Ϟ;cV9'{R*7Lk25 Q3!*@P)s<3nyX~rwa>ȗcU= r2-E~, Ij|p.V(=7(r3<c7a}^s/ִ()vQ`]hҫBRpcݘ�(AWB _7o[ a%KO.[~EVwDG?L)|0rp%ş�[@_�_F>so|AO濺.5H�Ʒ=#mNPDF3ϰ2W+s&duV.m)U,P܋: T:#λ":wq/ ~QW9i6k{Y*nXK49,Cczk [72z,$UETbRM)⬨ UuֶF QP�3@NQ d.Hg*Θ%93%gr(C~dMQ$\`}ey QaJiGyrv4όf5P,:yQP(mOT?'Yy8MpN2 ‰\Ibi61=<sQKnïdzs;5d:θv<1Gg4iBI3+x_x7ާ8!l*Mf?|[q"gɼ)] v{_e]Kݳl6Pb33C9Ѫgq$u6y*^{$/~DgK\f&aqU9gֺ7adtebYwv,e#'ml'&EJגѐ\,MLf+e9s " d^2@Zu1 U<s),g5/ x7ݧAE)݆W"*WZmxH,]T;:yL0ht #|> kjp /{4G`/"ZQ4X;8L,Qmp`o 3 a@'wu)0vmr }$:a|L}ǴbG_d3U9QG =vozCf4Ng@8\\wnP7G-=~,vW 8`3m6Ceu{VVHWl?R\֙:a} 9_<LM^V, 9p^[hv4=]j.|E2+D-x1z$%N ϥ0TXuoLt%% "1RT,H)g$b)(QX@`sQd%ْKXpr_w7K$ s)G+2 (te8Kxا́n 2W ݙj}&6*@őyc8(jaUUNFݐBguNNyI>eOWT>X}=37'?dU bxlvwqLe5u굱Iȩ26æ< ?6hMBqoڬ8]ʉq=AMz~vkWKm>a젒)* Ző @tsT q-]ݷ7!g!]vs4pem*ISD e?t Zjt IBQȠ^O1G<1iꆫO<&2C:C9N2;D)ܙK.WvG!š/鶑+ tf)!KZWP~)@4X@Dq6>O|$ f`xBC{x-z=)!a%]݌_9.[jlj_na"z|N� ` h,R>{;Sڽ6)`3�#}|�\މBYwx x39ܖ.uLݍz zN6v3Z.S͟AyFo0c?�Nɓ˳:}\& si-)~+Ń/ /x=?kخX#!WtHACRIezfLU%Z*$xK`L &++9%L8㩀 9(ǔsa fCwyXߓS!jC;P[3_MfaIֹvR۳fܨٚW\}\KyxN8ZOvjF7cbdmk-Es8ډX>+J=g̩4-_?[y KJ:zt4M>9fU9m"t-)<>pPVOJh9liT5BkhSxcUYKM|<0yMK),.ܛt3~z9ڸ;cϙqoݗ|aŁXmf.,y+ƊcZZdI$gHT eK(!.Xt{g` [ %وJQ**YU% Q$X>9i2h/8/cDvjO+cmrn_VoUye7>6$ V7Rr+L5<nk& 3M<k "5p:< s[7*\7_=Vǟ|=ok nz䌟"X aV;X@@p@)9P xxR;Pp 4_�V;(O5̟U7/Ύt.>UQaVJ1SǓt֨_`KLaNqOT<+%ErVMz.r漞a]yUJ\?6jۄR}9C2 lʒዙIidR`9<d ğri - "&D5/EBA(Ad2"!$sˁ|6 ӼKw?J2a`uET3Y~؈}hܘ͙VMg)oENK nC)Y:addkNL*bUct[k^ؒ,E8+R{GU4VVUVBdLl`]"=BRBgoT·KQH"i7, dɠ9 ioϭ1^awHZ2bBʆro~na~ͳD2nyMuq+"=}izޱʆK=;Wa& U)hZ5/"h.*E煹n^VrPg,z\yHsFR1 a ͝,C~ae·ii:stG*7'Z( 0ϥw%>:#}Ӹ͵ݐܟkUoL?w2d5j'EN`䀕':.Bxf^#uux[@5!@]'}Waq1[6@KGM~; ퟷ7@q$y. z%?§@@0&oq]7xd' *zB߰m3&͂)"x�:ݞqOBqPΗqN 9 yS`[3#v桸=XeJfvŚySib~fS[>KRo2W9/OF?kͺTMTlPF@ ژ5"1j<jQL<D4T4[6&@ B&V(#P8#%c9ŸT`!t 2٣R:ewN·%\2`Cg\* BM-9s<MfeGeZ4Z<e|1&7`ǒR@x\ !ΤXiٓW[l{E͢Wb˱c;D\d弭e)1XB볤: ˆRiSKr%iEJ$ q{Ф]".a?gnBv_xHtu҂ ×<s{;6g #[1)#IZfU/<5}Ru!:{.~Ց٘H}+B—4"do*vI0a8L,HaL˜p]ʊ3=& G8 H] k6V[$O6p9#VeaBBn(cHCvϜ#YX7 lR x/Jp0K|cvCvgç`vufm}.7~;7_hj;Nby7D5p@C:"hGhm�]�LN:Az7x�xDRET~?7Q?1?MŮ 5/0^-s'mϣ@�!<û#m ^l,Ԅv|j\[ݡ;nX_{iV1/˲lgJ"gE.[˗g^sodq] cy[fe�)RjI3jK[__<_dcӦQT)@Ȫ-z}>TP� $bk&>e^{ ?ls=n6ۆUQnQQPպ]svLnGWJFQ0s qPYeƒTYS٨dgJKpr")7إ/KRهh1D1*BfSY+^-CgY| ZtbyBsmNrJn _jiUiHReN,#K*͞|՝{W*?6+LiZ%MŰI0d|V) ?{ 7yZ'[:`U$mj:!CL�� �IDATՙFiX4c+,}0zV~/;Z4VxNT̓a]-XtJܨ\Ϻ]r7^6V[[$O /2;}f'V|c-,̆_d|Xч:TfR麟i. ~6Bjm-R*ي!)r_ܦn)ɚJQ1r<1bZp3Z K<91 eN "#>-΅ާeZtR=q}bY+"Qqnt^r8p=Μ]^(X͇0sv~dq!�跐�ˠ hLWK-`:Ay=|}jr߆Poś&ߞ?:5xxލ~&�B2@P[z~uN#D߷ַ}ަv$}5m;\`ꚼw@@εмûoZPºW/myuڍl/RWQgi ~cwe׃y\o~tqRiݓ[?))'Fۊו1 nDr|B*Ts0ܱfyTĔEu*фaD$h)}$VYזg`4|bQ@'_2c,*ERa"()`@qGwd*J<KJI!J.mSѪM)>L[Ǚf]1rDof)]=*%KnN2.ʜtŦTYUk2ٟB+6!*U%45s(%{U+*.P<O4᝚pTYuSFǘuAcC]R1ynyKÚMggf?&Q$H6J?8M,o*u[u:<_ m0=+4uHWY\90l|xa3κHc�8[rlhpJSe7VzL>ĔoY;iĔHG&!9}\*$/_&&x5c@ZX1vÅL *)TY&! dGc?CY; v+mNri#*9ts6iNGYNa`Mm3OB�a[ZNU?NNBQTe6%}%J}_~p0fނNzj7r Sxig^\}5`JG&�w˼js$ gW7[wm*?LWg:Ux3Wxlp+<7"ߢ>V;){ WWq0]Ճs5 Q/3Ɔlb{)ijhZ.JxAs[k_Rx)9ruFr)'HiȴP=Lfp)D1$) K++ APN|@D+cDL)Ğf"8ʂ(le(ҹktӪIY@R(R&ix? wNRxrZm#S j2RPMFfki9Mf-¥OԴCg$l\O{]ٍO].w>>؇̃s(R N$ڕ6֞kT QRa>v/nώ h-Cc 1L!+]ZXX˒"V\bt}Xe׉Ϗǫo3QAC_ȉH.2tbmHRy+p" KF1ǫ{^-],،!4X15l)xH&nuM#)=SFt)ƚJRR'VUɒqig7 vή/^M^htOq ug|җ VR\.Ղɣ33Wxɻ?!z^/pB:f%$$wx 7@GDzRK/5ʡx 9}/G 0!NOE ( Ͼ#{[Gw|3dB"݄Kw؝o·eǪ^}|78 4n9]Hޒ; nfi <]:>zś ;)7Bs1ZdX׵Nj :eĂCdK1p\̌d"|V+HkD+[Pjv%V$9$-X…(!/:4ycr23VUW^L) Ins xp7?Egѝ3-W)Ѣ(T<%GXr+Cɮ4ں*Ovn(,Rƀ"<ݒX<&Xi׍e*8&r2LUbM3mljmuh "PhƪiIl3w=IBUu ؞'B1ֵ@4*nPWp0IV=f>ί /*7;.hTW.W5@m "Wʒ <~{^VZiuBfbT9S1A$e"L#JFeFKY:t,e<Dȳ20rNN$’;C ԁӔY\Bqj*Om)ݫ)5?O,"x_nvN<bW#14[=�.{OqGz F `1\~S�h0 \kXo?Gm @}GMX6^}s=`W _o {*M|Oʗd[x=5n?\'G&8x?ܝM(|\?G~t1U<݃3$VT"U1s+dǹ⋅.M|X<-joI+K(%l\q!5h8I RhIEKLjE3 DZ‘gsy>ϕVYƨ&J+Y Kܦ\tM$J/ъ ) pݶڕU,8,[U �'s:-<NtUVI]Hs 9~i'4URp&V`jDhX5=[f Ě3jZs1̓Xx5j_P1ivV)d,iC^6֪٩i2f6 U'OO, *vMy|7r-0=3ģ`R>:#I7a\ZGwQ+j+9je)ޜS9[eꙋ Ĵ`'Xe.JT"SX|*.K-S !3Jt痳\ɩ0?ytS$ zҘu#jE $QBv -PqbB K P}y4\) FW|WA#T8rzrj @?Y@uB/AAcP#|@S[@\!?dՀ}g4ُj~{ѭh+:7{oI95C`ww�0MMӪ\!LkjG@ngTsYXCZ4sn^5d=xkm*|٩QS/hQ>Oz} [&Juu!I~WߢmV?qLՉ)*Q/`+3dXytQ0vtu[ CF'Yr&✔R�F%dYD"O)'p,P922Pqve, kcFY&<+D6̮@rViRJIBpmTQ骵VgyA<?_dDK'5Must~J|ܟDjUUyY,ul jx�)Ѥz5Tֲ2-Qy")V 2Klբ >*'V&a8[u4``b͑}u}Uҗ^+ 7t"LWnOz oFlMFбydٺ<gj>q +Gse}^mf|M%'x<6K)32ɓًjbݜ3O /7JFiCLiGWxHYƊP!!xM20>Pvs}R<xe P[xr;Vٚxخv\];7xr¬ݣlp}|sJ.JPx-ȗ95o1* sխ`^c �Up�N]8�M 07)4o?@ <Rm=ct߸,>qi=g@HЄpzSo\+|BzGv=:\1H4ڏ+\WЄFYSj}M;2y> }BLJ70ͽGkGW9|"m6 _pJaq˅:}: &UޜS]Tm$ 8AZ(`0.Qf%DG0"RnOT NSfaCOօVqYP5ĻH >CYj |Ֆ!% ><*E|w~5}O/ǡ\tzrC6-偔F g|`<` J4T,^(e̖9vYS<YŬ29XJS$ I%ꕱOɉ@ҧ2<&Iifq|9) vzOn*S]2UۋՃgT M-vEi>TV4ss򛞝m2\"S)8cwѫ-*[Jh6P.VJRZr9VU1g>LqcDMnMY]3DSPK( CnTl`Kb,sbIrƒ1ScTiZT|bFHzDj>U"{7|~SwJrinQaX nBZj=x ǰR0Z2|eQՌ]>(AEϱ !}Sw0ٿ 8�1GoJ?bNߣDCOx8F}4K]]17.= _ok}E>UW-B]FםNݰ0s)Tͧs86�O{oʖexfk"`L3Yk_ -"L\ #)2/O^%B_.'nw2"}΍]lB@xT :Bkb\p΄F r�2bB'bs*ydZ|΋jI""H%qJ-3ҙedNJD#- Z(1̹Tmqx'}$Ě -ExpG,,@12ɪ"MLR)|7AOPF4p,rt쬒[keesJ֖δmR$x8jt􇻻ߍ$˶.%*7ci))u欦qdCK\Ug럑?[(7�F5 mqS(3lKmEJ7.-:F>_*U3 >C{;G+.[jxB EZ5Kgْ_C(k-9,">bf{_Q,Z[K +]rL(mq Tbԉ ǩIE֗Z>9sx~^DL|//\N]>U=h_nr0~މiGʹ-S꺊k<쎛,O^.%[PEpañ:TĤ@ lV M!H4}?x�?coWYB=w%;Ooךu{ -G;v@ 3@ذ>>|^@:%6<UF_Y\c󋕸i;ss/5Vu kzC=jS*x6增n'/Tg>/<W1+Щ=Əc;B9gŝ}qR-";J41rg!R2@8@(J(3J%RdI+S#S<UͷH&s(#ACcJI gIUW<)ȼSJ^a@\C2F)UmH'\4tj ;\]pl禳QܐJze!$8R%)ݜr#`E[骱#Qt'njmJniuŗ0w9-^>希."ZzJa y0/^ekWG+RF.C:%璋4:uGQg}T*Q*)hϺcn+kYVX\Zf^XY]#3[gk1%s/(B bᔄhW*4%?i*ZJ4;٘ 6Uu)I)HQ)\-I$FEM>PhXBI|w+lXnGR%-~d!=H-uڻ@M}w"-S'q)/oQAtpz1C�5VkANr@ ӐO˯N P5r[-Mj{C|T#1 aK P(7|? `kf[e 34!iy'Zic_O ]|* @KS܌N:x\qǹJ>Lº|9R�UZlV5 Kgg錙]sfO-+a|X Vs6M͹!=>?hI ς7JbOgDVP_%u2g+gXP4ft)m9 8caN VdaPTD$Q˚f< J(/ *&ݬe(o\ifg-rŕrJg'S k&#W.b刲dր)*qE[ǂcZ|hI[׏z,؄";{(4-yeգHLzmмZ/ɜŦ&miU6i[uj+Ҭ,3{5`1M_W׿ze*} w`+7;j;EWL4+l^ܠJj=OπKG|E&"_YbQW䴄i"m=P-6pCByEiLѫr F9i4PrtF1?.;$H}jI2MRV|6QB1 pO|01R&TT#%SI{ECѭ#2iդG s[Bí l"/D;=`"۟T*Vgh*w OzMQ2p5C]_g-h08�'!nD hPpZ[o|ӾLWFU[4oX&ޡԷ~1P 4-» 7ħ?>isÏՊn;For UF _䍖_AxD+@ Kۅ+S{ πK`7@e/V..T%^"VŒdΔj'#}+y茨]\& ^aǾ6S$˜UM\cnUv&ieS;ï<ٸ<:7+ msÔݦBIŜc,JɂRR`Y&�$eY$Xf+NsjUL&]&RƓT*d-]|bр h\b` ɩlՉvɹOf~YEjQwWf;RbJMW6V�z$K]5ZL!RBˤ\:�� �IDAT�Fb+<Mk:E'DRλoݽA.0Vٲլ"Bjk!V<3cb<w._,VeKb>[Ֆy-ua_||R۸1xA .WFV&222zHC /OAwdne9h/-6kYL"pJ2KEA{ n].I9yRBEܧ0D(jEl"*d$E R7 ׼@gm8.EJ\00TygXiSma:ؐdX^lQݸmK՘F|w&px{ P׍I[j1�chѱ }1E~ _k~; _lp׈ya#L)a.ZOޗޟI-P!{y$' ~;魯^<~ob_7lN8d �X?<U7(-4hsg`-Z0btiIR䕻}Oz̫HZWsKC2/wm0"8MfS+_-m*%rծ^ۙh[m+]dKҐ$,2䜏,`1&J%V[W 6gEB}E6ܰF%D"rōn:[7JUNsYh E)&/|&c P әY"(#}%~[6 lK#,.-U*Gƅ}Z[: TjJ Vx\@\kU VSڕxLNPxp7bcѹ~ҍK725/_3p6 d%PB<ꔻt*MRY LY oo#d-q9e|(}bIIZ=llQzF)=S֗֔zysKɋ{du u`jy]'D܅g3ܫQloxS/&ܙE* c "f" F!yOq9f K%:$b,ΡhbI纥it, gIG•L7ysO^ʐOb $[_!5݋uP t8N<-Ϯ+~2< o 1-^khΎm+ߣ|؅^oy W14]xxտ)CYubz;4x|wkxK 4N7t&^O/,@u\�;͸J ^.\ȯGWo g58_*<l'gk\1]_tn_*pۮS6$Jh-fZJl0<f_jo7FVbEǵڔ=Jq ĂL0!a):y&eD8 �WBJĐ!\D&Dhi1jeA(F݀W )8 * "y !z-)C;eRBT$Qy.o`\snĠDr\RqK*C0FW$|}yu!0#H,X)zSY M;%i&PUTDf<rɸ*n2$";ҟ_%N5{ Ija5t.[䱚�Acי?U ?OXt<WJ_ftl|$Ϟtm,yG# Mp}tK喟ҙ)%Zyb#~˜f^ώR䡴=$;_Nxa%9SZzZThb KSJa`^mrlx{š{J_zC/etQXwqhD09u7×~h" w~gi0zt?WƌPnk|zNA~8t!8iƆ�S-п?p6[=s#o{D2~@ַ\_knQ7= ? !7Ư�+9*Fx:zpf[^Q3wk`ڋ0G,^9͆N�C@h/ -}y њ8Kieg ,,BܹjO B RΫMN-66B ts1mcFӘiTcъNE54+ZR"DdHZ)BR<qI h$ !�3yZ2\qNdVB2W3 f+dbAcv`a/$|ٗ!XC]'׏Q{Ȗ)$-:eTB,/SQ%ӔJeT[kj(bA&*eQ<Dk&]2|b^Z1n2eIFM5&ο|HZI˥+/^7YUDg6b:v85=fJ?T[&gĈW?+6,G�ׇ!B7Vi%WBYU1.mZKn>d *l/p ~'ڢ CjJMʼn0 RWr!\\LOF0'g<"^<QtD;k̛Ic�mcυM:^)KWǀld.~\5g |G~wH94`j8WW�cusiȱ0 z4Lף;.} xrWc^xyдH-AUJO7$wo|g;GT?wޤ]D]ER%ϖ; a.6ݢ K'<jQbav~l+$ kIߊc2(tmӝg&_ j` D{þ !7q<&f$DGEIJFU$5 .7R44zE8yR)RJPɔu`%e0V(%D(1J,ZdZeUT\FBH¤RNJJY ɇYјl]LVN%N{,xirEi}qPrJ5^ֻ^%W %k!6 .Uų\&sEH/\EWM3cDþVj0Z͖__'duzCs(QsZcW!\"@qZXŨ ?Pr _ޤY;>!7f @)v -~262cDHL5|CLwٵx2;aq=>wsD.o;.&ƵUh:JE %N +Zx18[8u>p(+&'~=PDܑYx_K3ϚNO7f$^zY IW5>l!/13r S)-+E K!n,w|M2I%}VnWZ?gG#Kn/c6qד0D-R'@a}O_09 Wsh54 0H<3)K/!^:;%Fu3Mviy3WoC?lvx{c۽~tU=RKIaz`>Ü`!{p@�Xch7r )Ug�jlA='nVn\_2ieɟ/Ty!~t+ƟS{"͹J *(u,ĝ͚ =~b UU/{M^Ⱥ=7q%b* 0PRCDu&b!1-aZN(!drr1B#xQQb&BJ bi\V)5dr@dY i.B%<y!f]OA0jX$gr\ȇfI,mLw0U.eҁ 5;ѥ:+vAiTIsS{`3ւ).lc�7b1^;w&D۪9fZiU׉ YDKǠT|rl?E<W|ҭ!lođL/0p>儿„13)arve_Q g'"TJdei?ϙXKYQm ʖ9OsT^$jJLBM,I2ڢ >A#X9D ~\އ9sy>NGN;Egب}/D{֡?يyƓ >gY`Wz_1S z|�whZ0 x$-8Nb8&H{.5(3j??<ҾC} _z{y/Ô<E>h곆LCz,ۻ\ w�{{T:�kA'fsŦHiYzb FYEMya\jlźҭgg tQiB 8uAX9UI|&'g- 1WVy{^PF߰pl:qTY(l  ETT5DBR!sH$LX�9 auQ:j(Yg!T&HH% e`٫�);P#919s%d;QCRUKsdŰnRjSDV'<}DRՕ%maVL5 íӺ4!|p$3 m>Fgac5暷1 v1jXVֽK+[T+N.djQREֲC||p^.TفSv>ՋiSQgwCSm6Ѫ45`Q5)nTU}U>- чe`"}/\Ht*Aэ7W}㦿ܳy9mj3+;B& $ܐC}xFBJ!gKYltBLfYl)Yn5=K2s ;KX%˾EYmfi!k{fD{48D] NY߉/ =p'Xi<)bKlCwK'C~_bx:3H7K {E=b^"{l~ku} E?ຼ8࿁YnA7�+`͖E  tͽ0tg+S+DerKd%&ꩉӚz)NtwW '"qճ2#DS!QuwDLb) ˦&m eO@p>):*3BL#I1`% B S1I�9`PK4B"TLiRFd`@#%pBPRq$.Br$R&9#KJ$ٱbV$scN<R2ѫ8J]DQbr%B\jb,B̸Q̡Z\A]yFK*I$=hj)s< N:HcRd1Et<9!.ꆑ]SXLCBrSF,gПk5d22?$,eEn})}aU?e89OeV]ؔS3N}T:}~6-٨U40؈t`knr#(pfQnc'5B;]]_ꄞ$!r3-.s$+*@KU],Yf}Ы u0>:Q28ǒUR#]NkL|v=0UdfrgoG!GZZbخFqUjaiumMe(v%μ̦A\nݏ+@4xD\@ g BYFρ'+`y@ dQw$WfLG1hOxp| (`tBQ@t?)K ?iD;ޕN~ 1<p~I,Mn&t PW3s GCR1kԘJຂ�^k7u_;>Ɉaz#⃠lAXMeU>יs7Ma r +@Ղq8`b2"%|q*ךXEy%'KJTC]yBB&USH63Mmb!F=2fn )\+^+QKB(a̰$sT( )F33%dE]83I:G:)Pc%$5(aT *'>3OI4k1+o@)@IIũ 3K1#<g\U'ad-")L1O۱^*s8#b=$nLndCvzX6=8}GNG RGaۅjEQ|rKOPmXJiZ`C̓.mJ/߉a;9, VrL_M{ [HmZg0F.?1~sFvKOd<=y]Z=_&K69Kib:dGN|˲٥9zұs{$%T*%H=6")6$B(QE.%&.JsJECjeVU#{5,ڝ݇ۧߔC= (rU`O,];< @`K'6wK% UßaD]޾CSKw"O~8MɉLXi`!\y;FsxF|ZƇhz;-!~FNq o1tB -~pq~ hNVnO̽GH=y^ 9.ҧoBJZaeY%}b|YqLYb%K$N"fUqK&rPBJJS%48?fpbEUj(UT &!]f"敖BМcɅ{U $gOSOL] Єԅ(`"<MA$k  dD]aJDt6e&ddRJZ*4F6.(d6ʯ***XMZi Cf*P؉12mB%M(t?ΡSzN0f°DyF%V Wl)T`i?Zj*i09k2V\NDXPGFΠ׹F'AVgxzV񬾎y4#!y7*d.]vG~c6Sl^ks@˱ɘ-/we) /觛:v5]~kσස7xf׫MH Tf.nx6L5<PB@'P~H;ڹ18= &DEP(R::Z'45el DLj:&|]0:_!Qt/oE_UT3iZˁfgE_ټ6 < {}$%#V#T/6-҄(� ~|lfC PwGT&.h5/_(o+ۆψ)R@�=\}w-3w}r+@q(߬S\2éƦ;A-xFeW&t;^WR?G4 p;{.xUZ:2iN'r "I+ѥsv!~IJo걦\Afm2J,g-#gi+VC=r$BT5[hf%H4P8#27PGԌ D0FX$2<xׁUr,i !41缤O+u$Y"+Џ{ɁI�� �IDAT9vtT}Z%O;)4R5DYp8BypsB8*0AH)LR͑( KT@i ="'QFC?Eݱ ZFOӢO˿KM]u}¤>aU0U! .j-eOM~'oo"[:l2U\S#_8ֻ!/f9PI>`w]gfǗ"[ !'|%uqUDJ|'/q\sD0&i=S>$k2:IA"`2R!冺%b4:B:~'g)zr~9!?d*1i_W6.E"/c0Qu;L/߿p- ÈI/zt= p1_ӄ$S2'~8#c@B=&`3_[�;ߺ"_pv;Ie.jw= kG5p4N(3GXoR03aBTj*4gXydKF0j{Ta gu7.ՂW,f6|iLl㞍]MI'?"D쌨7jmGkfzyV5a^9)L8ΡɽEly?3+ABNa㘝H*{Sqs<SYr229r)I:2 $DM28aqjI,馮1붽"2CHIwѽڏ}S[2BP11)9-LqTRj%/ɧ)JNڙj9b> ̵ruC%œ<Db,ntqHpuu|X i'S-_u\zrcbȜb:ễGܩs2嚜E8Fn"f4˫B#{K5$]+R*^EC^Iq+?`YFSRsYE5Տ %* gDWcR4KEں8b֥UjK"G=ί|WC$c U.Za­mY 5Nхᖄp^2}>�3v@k &XbK_HKհ$>aH%`$p5>Ʈ_F :{ [пW=r|<~MHð`Ek^߅/$LF̟{�swAZA`]Lq?y:̫ ,DoY9`׎b'ֱ]�g/P=-ae@+/L5ΙQs8*'4c=&ؕ,,xL*I9(=%e>o]vP t[Uβ=R& fMs\(T(')n&$:{~I) ٥й4iv≐#IJ0+<++<)Y;SSc68qF 8AP Ɏ+ 94r+9•4SZ`#  s{V~.N� h |9mGN,mKFB2H%8"Rb?HX\\e&iLsIȌup&YjV% yg|?rr  L1NZR^C .4jikSo^6I! .%__9=ZJ'LWM垧-|ёJ+"g~ҽ>])~)s̵oݮ <bZn2\xeqյ=_s>]+o&!m`*Q1u̎a v)vA`ݭ1'4,沠4pzށC>Eh=bj^? Q[׻mX 1Pt- 6�Fd LB"ćɞB%�cFQ]V!]']C5 @�5q|8 ~g^\7sCzsBіҿ_bc>͌ޚ/H`6ijY&YoOC~xL8H㗈�fFN:Nd̙ _~R|u!Թyk<WYR#q@ze<eBQϓr7hBCv4K4sܹe<SrǙ RS0?==c򹋞VJ|E|byBBfɈ*W JEKF>ycCK#On<TJT%3&<)"!ZvF.i-?k7;8 L31LƼZ<9=}F]ǒ SB3Sژ˜L)S\$c@YhZN}bdL-¹mS9&;]0?LսzIi0'zEԪxC\Hz5*Lf+wMs҆tFVm}^ˏYsn~4i׿ܢ\5[6 b@X['$K{KʘkIǀO0v$bB/ DN,B1NSɀXːrZ&ENVH7rc뙐 , .!Wۺqh>mx2O+i52g 8G 吞.Nqud\ h4hH=8>I5KqX00aU!(^3#8:GP^a w{3x4+koֽ-8G}r{n?| eߩھ}_LDx=kFVWav|(qec YgÓ)Tub4'7U,r#]!)ݖT hEen/m>KgȋhI10#+GztB˒+" atm#Yd"sc\w G AJHLʔRJ]E$(͙Vj(w&s̔COvTERJc̥TNUm@F9uUiǩDWQRRR==1D#|W\_\"l݇bЕm:ex׹YNͪ=*]\bsaS8cVb ExR}ɮ4H"EU$pŶYKoM u_}qز\dd'=y*ZqowOqNZ6xff|B*<K+Լ308ҫ׵!?CJ|~Ք4'\hJ/]cXTrl Fb$oKbrl=e."D)qehzy5!Z1kWaٻgљ(nS)*)=ӫ{Dh%S:gz= ZZ�;C^tX5a>A%~0L�l�8;i-x 7jѻCQ_a !~ ,Zy�q_*s߅,8T~b㳇k�A>N=9Q{` kC*@C=K;} ]/u9Vmx0}f]ޯϼuX3HhR̓faاtK!|BTSrjy-oc<Mѐeamg騈Y+ ¶xӊR <FpVq?"Wtb,X+%ZL8")x�u$F6F5yN+c�`Be*FJNq,$$ R|XL0@;SmJ\bŜ#-fb)8o*oP$oe{sLvW!VP rd;sVֲ:>6nڄ$}wQtha dRӄ2au%8}a|U! 8D|�5 mۘ$ 'ծ:e^>,"sQ4L7y2 ewLԬJ9Au%8 I 34 >B̹^q?Oi:Ex DQ7A Dh5u߳Gg[T|:'Rf)(T&XfbM!BmGu)De7ofqc,_-�ͪTA*w1pǾW m@YI(u@O ^cɿ'{7B{g>)ӈ@ɵ{B@|� 7=pcQu=fa.%߭n:~ _?6^CwSof`^|Ͼ ģF{xT8BK 2" =pM?'gu#˃ycX ˏssuJ ކ\]A0 @$ 64JB$HmLӺ+i]LfΖe2uy^SaI{ Xi"& P=ibΎmK^YV"ZXC+ rJOAq2V,M'S9ZLvsH-)]q;g4=QQVL6к*&>;a?u<DI)'0(t sr'6uq&d*V||ζB4jtKH;iF hYH RJȢ<ag,GNZ'6.##- RZjlf%Kg |"Ss7aG173Psf^^Mo.ԋ- >ͦjF*imsnQOW^oW{f >4OWY|Gv}Y&EJ.)Jjh* ՟򅦜tv&`V\9SI=rE## QTLTڲ/^0<VIFk2E2=C݅ \|(inSڟo3W/-[ [_C=s;cjvGЃ<W]p`.qtE-B8C"$g|7Y>ԇ E@#_Q8�ٿ暇[nx֘ʄoHD'Vv@ `[ۚ$~5tx @=-]Ï(/Q0pTmv_eA~s Prk̹݊.SЇ3vOc~3/O-%/d9i"AFܯIH.CJM%ɢ ;fVǒi!54Me0GvTJV槊֔1D4Y�"J!8R,IZ$QkIG) ~e˕\UV?0=O>L'dY3LvjI.^(ɩ;>T9RlXAh^r63OKVCCr8zWN(4:(J,%ԌDEk%s/O"Β)'>a1\ }UTTi">'4ys ˛K<U_s]$^n>/O2K6Hɴ@5p>2֤n\Ss9%2[ʲ"説3"{D4Owur\XO2d%u%'[rd7SOCb;㓡nd~{6䜣eZ⛶(e* I<-Ů-Z,lUT >}{W{(O7|UkĹ'P tvww%Z*}W!s姰Eɝ\ˎldj~gL.HMX®qܢZ<c~8^p xP5� �/ {Kyg |SVNg5^| o 3yR@zwxskx@rG%mcF ߃x�"A|O[!Q䶥 }sW X/ZĿC:i~]u{uGJv$ s;?lWAO@%JNc.LLٍ洒RCzʖf7VF_;27Œ.RkӬuٲFhXe֌(0NIƈ*351BLr>c"K (JʺPs7')dUU 8;;?쉿rR4o4"% nG#bS)YVyT-SK ;}g*(jPuu6u"B B( ,&f3=)X%D 03E*D曊+jN;aPVkvIYZL ۜhvi[t!)Ua+[Rn9xJ G)?5ꥑ}iJ'qzjnF=3U$IJ}$.14O4cq<؋ЦcB^"h0m3$>eC:r9QX7~"N~>6Kr"ꓨMŜE @xOJRD,wyw>/81ESo[љ;|p1V{).STKCg;`+Yۺ5%G)&'EIB�v A^�D\x:2sM9ǫwF~Z@ل.2CUa;`/koENzw_j Y%p<-u%ǁ'DHOA{[z}azd)_x;|%cYw#~I6{,YY<.>W#>(V|r,!=#nج2̩tp.2 MWmf ` 5u\;%\ZZ6jc PJ)Ӵ*qZqIBi$Ę#(rD bmxKV0cYe'qv-OޗB\B{[?fɭVVIqu& E:2~t!:VqGΆe8j^4/z?<WF y1ff\FuĦe]z4zD^Ϩ<gnBH̽Y\Wz-ϔc`٭d޶e#O򵺯$9@5f<Ӟ E�$f<ڙoXZe?עJͩ_`Q? ]JY,M-XS BRGrچrUw,1NLTtqɄh(h!pcgOӚt#yּYb!#& 0z;*,gy(-94y2M- WUQEAQQI vQMZTJk=,Gmf**aG[*E&Kdh( <-kLlk%2zE8B :4I:Y6hw;;h6H]] 8XF�{)XK8nQ;,[z!~(_~>5ʥNlxDB_=?r?m7yR{!-El w-Kya|nS;l�[-?Wq;:ט"I([YNi/D)&;#@rYIdpJ:]^"R.D[xZΐ,bm[K@#L|Fͧ*|\5W;E|C D(%i[֠uJfFj*f})fQLBEcK-bQBg A֕%$`;DfXH@PD U %>'dN$TI5#Jd̮d`oʁMFM ϳdmΆjY8H-rtSQ&fc,aa I)m�� �IDATDTYH1&%1Uz FSCߧQ9 ۱ZhYh"JsvJF%IU_t<څ*({t0a~8.iI\w&4v< {'E )45R(!۸Ѯ\qkQi`5Ur,3;NhP6j:N\e{mC'|P8+폖!-/v-󩐟b^:Sdg!X![avٛL2z|j~L}1&Gz׷:l^ ˏ/J<, }0k Ѵa/7 `@\c=%=OL8PB%!PL?ŗ _~ .vS..tO8?zX`�V x~�WJTpa=[Y?'oi 28-ܭTV(DkjLcMwe3=g |#QQpsÏܶ%ӱX ? !Em_wCa^gT!}9֟f"&"JKJusx-erh9"&*"0P0BW$">YE$ctAy)J \ !4*H*a@)%7\nIs"S_\X#ȸ, _zQk_&"?&q :01-30!T!M i*Ƥ 1TqJgw-]muj \]b'1O۾vݼ m6 Д # /Rzps:"phU},z݈蒚KX*YTHD|Ά}Nߜ'8>9b1kRE-,JT ͏Jq|+=;͂ED(DxFOdE!ǦíCNhseYЏ&&cd]4vјdߎf7Ձl1>$|ʼnRjA {Ծ6bUV\!~1_q&Cu%wx#WHct3҅^B�He'_)) `Va?kt]K?!R}?:G`ÇW@Awꭚ.k9M μ9.0m7E dczn,pqOOa&zQ~T-8pmnoO|'Lž9y+᫠�_41U*Ov`T(_B]V'i̭ZJ~pHȡ B$b>Tw.#rNDPE $ Ӯ#T`97@sJf¢)GBiH$.TQ\Tu!!<.߲j>m~&yI0Xiɇ"$у¾N*I˒!DQbDFBK/,tQ¦8&A쐆ۏ8qȮн4#>C`ң_,p2nD'<fn#rUW<㽑t>6h9ͳF~T3 BUiBڋ}ƴ.h."t*_ hKs_敭u PHiɖ$ J9ædeZL& c e}KVŏ5i4uqWՉ E؝;=ٚ,S!1^(ULF)f?vsF~98ͯm N^Gu}+L3A*9*)Fތ�W~)vI{ӄ5J<J@;d~ɡ!_r-ؼb 65wlN9r y L>PF}n?=bzJI?砐v:?= t;7#?yQ 81lNmI)ApNZq2gx>1� 8*,ߝL"lu=9Qs-Fm!ߵzLtmU~XlNi -U%ibNO"aQ储KV%͇'$K}#Jmfx"x'\&UzÒ2L#%l$EbiY!POJyODI$L]nhwNY $*ˑFl満*W,ج LK1�v4 9dn̮Mjtp1-; = 8:2"`SXCr}cfTC a0F[jE)1"\h΅&mѫ@gfӚ]6`qNM4ueu9(!}9#xEMӂ4ř$ d.Y5us UEQz=Ԋ= $Lqr Vd\CF:꾗%%' DtU#٬eWJ )џsVͪ6 $\,LTadN8u{ﺼCtfT&ǽ)xVDO$C]U"")^mIġw[V0uď\{d?-C 4gzEv:G z2Lv_ vZu ;4 Gs{-* {w읪kyxrj;9n�`V37}3:hcVo> [7n ar>�C3+T@Xߡ߯(J\Ep,3kl�nNe^~ٸՊL\R>Wm`<Whm٣ !40UdU4JIZ$}%y-ROtX3f>tqm!-7BR8fn++ld.vw?lJBď; LFq2HGS4~#ޤnӍ;Xʂ> ÕV$ Θ)c2C&."xp@m5 anrOU8CMܦĢYӓ2hM>L'[fKVÖ9R- ;;uIĂup@'mC&spUOkW`krԳAql3ywrrՔ)e1U'VD2iK%%;eI?Ȝ5=u[j̩pZޭwRXL1Cb%%e48r %ϓ5ԲR˵^G {YKM΍uhͣ92Z)\jcAoNxKL22?i1Kx:ƛq> qK{ߴLr0qi4n7b:�he)yHR߄{co$1�)fz93Q$t%%chLAf¬XE{9w: S|I w/~腼ŀK*cg^Kl  ?ق{ %p# p;8|\A$69vl^vх aB<?J\QImmvw/_o}' |cX,T:{/:$G<iR4"EYJU5sq%ɼEw,eTO,QhIyΛ&팪RΡ]T4|)Q<ph2U4Esn8ĒDN 2N$PnyĊ9raZL%y*yv="w;'U8AUkOݽ!k'mP~lo"f1gqn/^M1UQ\ܕ2c?;[;P+L]926k8$a4uYmMwNQC:>c#nB<�R;^CM]懒b3-k6Cc'γJk]5lhȔIy2qQ9IA,ȫMW6̗XFu 2 )kI󪨚B6AZrΏx.02H0LI=i´J>9RKv w�{RP*aAӻU&hw,~7EЂ>3B(r,R~ux(!WbϏ#|d{n44@ ԟv1X\׿M%g((D'!h]4bq4hwq?at"yj7]7|Z�ڽU$<|7l~{z CM_㛻={˗Eg%sQL}|6Al6膊x"Y͌Vfv #akWG,嶜uQ}^r )ubRe ތMyypq.<- yjjSG#rHzQZ;{sBYQ$ُ^l<g$5bJxIJJ&3`*$%IdruUU:A1=$R4PEx2YÔsk@#L"S#W6 Y `O0QLi>˜TQ7frg[ *b9+XlabQ͏ .BzbeͲR:lGG+/(٠ w.\2jt֋E%Em՟ƢEKRԶ2$^v{$)gR"r}&/gEQwYEJLDg yGNדx7uR M"ocQ2atD)Jc9lEb'aur*S*kdoIT8&$]Dj&(휾>pՅ'zyOaxWk} 1sqa^z>1}2õFVڥ0(ֹ/!^ prC?#Zy 7, C;"Ύc6].c:P!9<p,Ô ,:$z[r/h̀ -Au%OGHϱ/ #}Q% |W%ç[;f-,  h@|6{xsm<~4_}0v5n:,K%;܅z8jq*UaرB^(EȀ)_P (mx-'<=UR27QvZP՗RvNLX߬8{-%/x KmЋX{.aC6|#:Lh} N6D<cNJRE*.JIPAԠ$e;-HS 7 I QZ"3z(%'1 bf LhL%ri:͘]-sUJuӊydǪsD14 bYUf,D*?|ۦ1 gw [B4OlMXȉ Y^f?mdAk{p *lWxY)=Yy~dMh_qvt%>:x2Rtz=23q^ Y퓓S1sš"&yTU7"'`dS`Њ0ix48X7u!&g&#8u*ig\!n3<?kX !(ߦEG40Ģ.d}{%A0z/uP2 +`ֱ5CYpa+/(g Cʙ>Ɩ́t}<{Ïo`M�_ 5o6o5I@ S*qhtR1ưa:ĜM_"4,3It~<ccӒ$K WN%N~qv k*Lڞ_!̀*yK%h>)Vͤ].gi^JZt-!~| 7|@ )%Jvd#+08d.&j91Ŏw&#}!۵<9/Ο4h&pr5±OnD̅un(M` y4!I{,̈́YJsܣ%PRi.i$yBbK16[:f !63ED:mDtY&,;~~G+i:rb<l>1I~k?]ǟ7<7ÄU9A޳41?dd0^66^mO ESy2I<َό).`͋?|OEIw/ W.ٮFQV=Q6?׻5=xFO⌃Mҽ7갭ɑbAYbbM.VeP99 RL(Uq%!wcwϻX0#d$nV_Ղ)dׇ) S,,6s Ò%IQ6c]gt<`drν[>~cyNr/a8I'%cGGwW[ aC5<0N�#s4E�~QUA-y3xܖ ѳXg[ /qNt30<�@=.IaG6_sI؄FmYӉ?rs !a9qv-6eܗ˴w`XGGp9@"{lPҼދPg΁9q@TqKNG93e#mS̭$QeҚaÂU] Ԅh Jb6&jE?嗢u͟R2uuc]H8SW&=툼qi!hRDd)GwL2pFd4)});q1MxS%O~1y[bߐnwSk9=%0�Ąy/aS2-"&#}e)|)EE⃋0|"d&TQf朿)o>L]F3KipQߤYN6?mg5Xl ~xg1 ,}ڠd(Ka_Tl>U\9γ =4H`d 'MnR\eIr¸ R%L{~?jtq<'GH@%09߶n?np<jMJ^g+k_[u48RNW&E浒qˋ8[W2Iˎɒʂ>~4a0S8rȀY?cw ',:̎W0`5nK`^b>MHy\B ټj`zCMҙ⠀a �`(AH?@sq)dndžA=3`@7?~:GEG{x3q~yP{{iaO0w h,Dr0A'eB H O< D+@¯p,m/wp^vUu0p^bK,"O4zg}dYc}^?ϼt@R4|%-\p{=d81@Ęرi/dZXS^$C8D?`败.Y3=]&)R5 ̉<dHͨ@KRFSro]܂& kb9D&3@'dL'Cy*>FXk*X'T9Hg=EؕLsU$jS̼Pc:R%;k;hȚSἎ\YYԈq>'7n>{G(>/ QRMG”C~PCվ =,ZҋjPV9R7DRCEʸVq b'ȋ$=K;n!Ri8ՑL,H<tFđ[ Rs &1!SUoaOl/iF{{/+^|~ir3z�� �IDAT{)]Mo W>aJ6.ՒϷq%tТ|u-(S77_ߦ}ٕaƮ@PZՎ~_TܯGw'B. )wy j'nt:{7)~&Mt#kHCCC a#  ﹍�0v\{As`BIg8^8>(@?~-:C;8{x;©77l- BjS~ ̼f=C/Nݍ9ܨA1{f'zA 6d_,r8;rh/ ,SکiغGV^n4bfi/].md*J]~G,@2@lef|Sq+'1bt j(y,'sΈ$ӝqco32s"FLKfJ^FFD=4*6;,.qtȹGَkLcuٝTJWDΟ*4.dKy$'SOSm̫vtor5?Z عqzXf¼jIvjoeN\,YA]qZI6s+H؞q(Hwߍ^KbIJJ8VHB%m"}2+|VVVk` v;I\ fvo,ܙ&&m}fqn릒 G3v<:d!])ƩG{I#]fWp߉cK3a\L؍Gccׄ8fєS@%P ]<J`7k ݇辿i !=LK~0A]c `'?P_uv7MP`';?Gw˻OF).ȹ,нs}R|{珷~z(;{a , U=wϪGvEK잍qrbE+J1*vX?9Js Nrb e_MUB,}r'g+jRe)|C0LSrS}Љ<,E=aL'n<5 ')B(c&^$} f8xDԍ&w")Rip"iZ11Z&^֒jJ#IpɒD`HI&ELet%cQ_瓨a6nאTJ&CϜQԞYA,Y gVHy-B6lT9~<oeP,.?zjE<*_=dj)g27ElJ)i[߷[g1nc唞 ~64:I8G SG!BJ2dH$Nfj_e1lwSCiMTk U1vZ"+t\$CU],1ʑŽ=917ŋcU}IC:OyTmo_ ׈fاCiڻU><LH랴őȫ[oM_ၰ.2RP(�ߧߛn6~]0+eo-:C񍿂�wo2@^'.0QEƏL( =sP7n.nRp#tp8\D7@!_[>uy#PoL hqwl̲Q�ӺP?vrwIm~x2x2,#yL!>'ge|({0q?u5QLQwk'ƆN 7-}YvOd(9!,;jbP:F&3t xx^Q6<DH6օ~GC.;-%VJ2zHbE:VGW!)c&%`pfԇnH3 gYA%[OٽPK+g74Â1M݆dP]Y/0LM?wJ`(Àph2˷&W{I<yq*4_CQ -׳fUje' Pw#v͋BRHnnYUq(b^ig8IYY<YٻKXrB$:l;' ^SzƣqAܝ }wK>nNm8~X "@W]˿ϖ|~herd:Cmjw|zfnVa\79fΖt 'ƋdAֽ\ζBae8EjŌŜ7OxgoCēwƖ8'_/xҎxP}{` olޘ}Ƴ~lP#p7\aM1ωJϸWpX>fGm?(!Wp% gQ, .8.}e D_"Āٱ7ۇ 8rl*ir gev;9 nWC5_J'G.y<U5P"Oc!a,y>e}ӠC*BNWn(,79<ic0P~^y ^d&=QN σ'Qg\S(%,f;,sou Ɏ~f8sT 4SQ}2,bKڳɳ} 1hU(֘S9P6\ WE|gRlQ71 'q͐ՙlYԹOz2Eܰ#l _u~jє΍hr_Yq˃u 3ڤvO n#4h$ s&#?^x Ry!0 (rqi i]KVxcѫ0x%3cò&t#}NCN6!r&m}zh.J5;O9ё(aRv'Yŝ}B7]{/iڗCZaWvwӺ/HД3MDI0Gyw䶜aa-6;<Hɯ|; PX5g qڡ<Ntmڈ=#pm À= ko#uXygjP'Y1|+<ޛ>p(G~j+PCwՇ,C}rҰ[\י%RYW@HGjtxb&a;a7'=ݒz$I u̓yHAJ#&d>ַ>v!4ֈF}^?".l5~Ìc.zwNr2(/Ve%HɋĮ財Sf`uf4 y|N2J3/>liHFt En)+ޔR} lHΒrc:OY{K';=e.a0зyK]+fA̻r 1UZ%Qً+"R¤ kGQ.4 /r@!FUW`TQJAĔ ҕcK[6(78Y7㦯7 /,*ġ$e2kh5~6c|~ƾP349Ej,95d^ cO6@Ld >-$ 1k)&*QeQbA1[ڊLd2bj#3Ӥ=wc!ijw}f62o͋ɵ-TN=<Jќ/lLF/N%]G九"=q϶`V<UfϺp_;zs!+B9@3_GPGk͟GQ́2\=ޮ| @x0h�͕lý\`q~z(H+0fj}0֨ׯ|3>oZwm7#9m}+,^ ɍ?Uin oϩ^ɣgHO-�~rw;l=_C:2ߙd f}x-8[09i=) DNtp91BvOr$OfJNm;qSDhw9“T)%JOBZۡlGqUos}i[^l擳mvꈨ@.Q P%|bCl.z~a]ăŕH t;an#G�YQFDTbAqJBTHvC&[Z>jmB;1Cg8UNEA-/ܓjBm&wR̦iLSTF&,M"ih#jQ $B~2al`㵚e`L+>qkni^ dOC;󳃢ڔuinj8D,F2eqܓp2rk]I"1𘪀 4Lx;SR"K^0hFy2e$6Zښ�L䦛´l_)p>g8>i"SWO=\RĒxŭ{He֗׃\"7bdJ]zvn:EEU}o~mwUؿan2?kq\À7H,FW� x6hO7 )o#`q;d}6"A y'<@o#,o⫳u s^ck7=oiވo)i|kßj"~=y/3JՋ9[‡?#x?L`@qO` TI{9lG A86abin`KsZ"XzIqG zsl3tT3*bïnL+9XBd` r360He"L'R^h ޿͗ktAm~/GDDXƞv"/%w c{ua^dzNlK‡TdN68ߺk7\1U Q/Smo#x4NԈSoznڟh1e KxfdHewy<QtL~C{;籘]MG3}%d""1^(t eE=̅ny6SOټZzgüԳ; jNa?caWQJIieׅ:؛l5{XN ]>zU \|* "@NA:PkZCLG$ru!6{w*.Yuy@N/%N?wT dmawv4)6OdT-˂0y[/FzR DNθ4^Xea$;r[]Q F{ 7#81v|9 P`ぺZHךw�;&|j0`7#`k{vpĔ�>80ո3Ps{rT9?֟Sz==S~g{F#û@NJ9t2 R,"69 GWs&n!l$ ZGGs45f_ZOތHJΒW5S?jnܗdG٣̬` [WH(&l!ilv~YqOau"vnYerk|XJ/UJ8]LvcRh#6k:Md4#U%TԷ`%DX 6𠣰tެ+,űZ wΔRĦ_ 6mi1Oc -iLUbBeVhnA1_ugc,_/3sGRtɂ|qCх5c, "Odž:7ɿFlAg+-vizju&WH&ۉ@CH :nf YnIY!TRjzG q,#~pupr^_yQ!;s:Wo+r\ETa5j [y_sOX?fk$tA &G%CFrB\r~Sk+,IMŒWmoၖrHRh2 `n[ /+M4[pu2wp| CPuJ^A @|፼wqp#޷7vg7 [iE{(o? WK0)p\�L>~3G+^g*W#Ai1 @84$oNXE<sSg-]’"V?/8t`V[lF]KZofglAW\ix8*`EswVCEw!GmguMbꎶJOKEt>1Ԭx,ŊDf\z.=X~6`'3 wag`T §UԤ9rIa[%`cאy~t&>sz>d#lZFr!粥tl|u8ocK8> :Hy܏u"s+ťz1Y$d149MR YB=;ъ-/剜*DuzZ)O+᜘7'? O"T,zy'AAQKgR!3bDq0 ;sjxdODc#22NW@iFB=abu) K2{v"ub=@tb uD2Qz5̿LpJà4Nv[^BFi+'kh&hfq7&$}*t: =.wFI,[ +%/57*7[͛-R)0ۥ 7X3 6,_`›:ƩμPߋU36Y|7j8`*nt_skv<o\7h ,�8V6oU/^ 6�C1-f>_Zg drLcK`ڻ$M1s4z-I}yÐE7+ -&|CI$gގ,}4_&Pnc@6^&a?Ɍ"0:lx\h6?30gxJ ^ͺiw~nj#τ>i\3{MQ)'|;X_~djZ8b/™nyz8!wdc 2.ٖ<d3IINTn4tËdZ.WiJ$uyؕKl)dҍNBw!!P&klsR<[S,A7x4d2Cyzx`_/4SbY)YUd5i9�}p5UO ]!s!iJq& c0r*r *r^PRZXYePz豙ڹ/'OJ_dͭJIb@uau/vAk4/ܟrmg_\EYq\/? qGVgŰУZ !YΎ(&ؚdMaﳠ#; #s``YW{sh%P<XcyQX|0CMP0M ,#` X>|]A|1q<y9b@6as'Yɏ߬hۣo,s׎!X"+>\f3H\VKuzs9bѠ*@ԳV sv8_ǗNJetK׷;H=U</e ϫ'zxm$:5 [bi G�� �IDAT3/h~Mo%,SUhЏ<y|G362*=gѕ<FlFl(R+Lg>BHNK4-bCq[}9F\-DPgJ%{SO{0g2,iN 3,ixN-%㔐\df|T& |$#M+S/tg>Q,e+FZ"42 O gCN [4ҠLV)b s/+R<M4ĐK@>IwysSdJK8煐 igSv&K?K 8lyЁlASn|2t >7OWT7Y΅d0$`($ +kM(qֳAhyτON"uT7ni0-Ex| ϣ< J=N|u03g\2>钧[>juL*βB<Eۼvͳ%j!/)@I(%Qf  :f�1h)C+U]C(5G\0�m�3�[O  stYo77w?Y ,g?co*b7wa0H" <{ 2!ߚuW[�Ȱր`$LEZp{j S0ʫyTKs7M<V O /3 h]yBEE!ԦEUI:$]:o );a =<h.{nEYLLi쯤`X$-$Hug]N?jgT IdO3"Z*n4&Ur;F~f<O5"p"+Me9jSo;%]JjMU*)fSvbγjj<L'LNDMf|_ӑ(+RRΝ]-U>'# L v˾ɯL^H%;>l/m{Gnb!Dy#qY$5DNA5 =JF ._L/#F[$nC1dzeLGɘRa]@BYt8ɱ4 EBgİ"CL|ٍu7*tI:"b>]@.׮p)Šq0C~v|Lǰjk6Q<ghr{Ac)c" DHP/N]zx.{1rp)�ы7^".߾wƦGZ"1DүWuѭfz[̈́A4D6 z 7|U ~y�M];=o. 8 a:Fv<bIa*=̫BDAfCʕ~'İq$s֧gPwcQ3GOғg~wgp<KKT dM) VT!؁l&gO{|nY.3pnwkSRyL#j-{cr_$ӇE>.du#> C v�&lOe 1y$Q [c׻P[a7if Cwfr QDkjIEowKn΋dr FDV'*+;Ľʷˬ&LyL)̴cܺP']n2.rW_A*Y *%QI fujiI(X^Pd#iȱ,M:$Q.TL [&K ;1}L ,` ާT|$IXA &T:f,*lbvaw֙[YĠn7Iz$; H~M4 6%A1d?}vTE<L^ޕ9}v%/W OQ>:_."Ɲ(eU+P:wYsvO?`?X3mi o0uߍMߔK1z2K`�п Fw?g-uZ Nou27  ~y??% ^`0Ѐ12�suN|t0(yť~0):AQn 2'10Ow=þ]9$3!l-mG ͠LOiŽ]ǽ[_ْl!6%'$+˗n;vm�4 C(n+WIE}L)*C.R.}@Od 0J:CqslY0v&Wȸ͎z=Ƶ{xder;L=T !^NI}\r٥".ɚhLQ,1hA=QjJV~X5tgɇUBaY}6ieCcnY#M1Q#apu0@Y^#Lpi %'R/Hdo(Փ4Tq2&) <+j}<&lsr G".C>LOdf[n>96,k0pLIɖb3S&m4n+CziGR%0xcc͔[̀5D\,q#An9B.nr?Qey" FB%_`4d0`ݷws0/^˘�ڼ ;~C҅{%YN~'B;?,'S2p Ḇ/(v�|!`@ �ڽ[yͪ5�|Sc|g+!7~i'+ C6IYgVtei<rg I2>Jóhx S&: $pw|?D)>GnM/\HK):#g6y&E0U#9.5?}UhQY; ѤUmt] {(Zϊ6?:PQt|.ؒLUjfΨ1Ŕ坛lgRڶ{k&hN0Д0;VcKeZl'I6ٍv&no,b*}G2RDfo{Y ,zeYJĜ1tOg;&Ʋ;S 0jΖQ#dDjɼUaA,κNw!`q/!nR+]\扤 :�add-L'qjL*MrDJ;- ik.>( dRJV6eF=ݾZc}c7SXOȽ(z gB6tcIB\v cv_9! >GV'lo.W L|]ߏtwL߮r1˥sBf 0xTbA\<i>)I<br,bpMA\ 27GAX.΀Tc|}I"֯�-޿{GO矘<簎滛+'0"sd(={swn{:`yּ_GJ=X,=7>WMef,M.ӣJ`"Ϋ'L'O &{S (,2V_ʛK<3u~C?ٓ\[ԥ`Î]m| xrܐ^/T�m@<xblBY1F 8nΞ T@r|6b}Mv㓉F)'m2^s"xjnIMA(vDUU1nlIF':ϑk2,&9ODL7&y6ˌəFBd0 [%TW9)R1|)+%YYH$x #DbX &RX8/8 2UfgDiECD)H}WT6Q%CuX.5 .c/<i6ގar{y>u/Vtbէjy;uI5b/ OBB澲T.kضEy"ʌ#BDYK\^"FIVǐ_(=jsX<W4U-.C8v#T tf"ij졒vwA\ ߽2qgo%A 9> wxx�ob`p|9Rcc,s:w@t= `^яZoCu[&F'ߚG�A̽ٯ�NJ_"h`J�5wX'Ό.DoAo2#|=G<B)|P,K{:%mQ/eDP, T.C3 4o U`}p7]pcNNZCat}"MIJ,as1kGL~㦋yH?l9ݥtGJ=cNw )KyQPYD=a%N:̓}Cɋ8qw҄oK٬$w IZrǩMҸRnl-5b$gVɎB2bėCȃ-҄|b@Z1f8ee3Q11 $G|*�*Ko1hu^% 9UR2OXpczG.4[G 3: hCպp $##CmӮ05bV7 4wOnE^'L{ʰp&5̳ ?aL\寛 >mht~Uv-3_[FFW٤DoAfY::3<'uNzL8gZ^bS:Ign%}"[w5N]at;9E ^y]4A^c?&u.#Ź}Jp^?K8]j]ﶕԼa0<~d�@ [( pC) n4Pa <0 X{,!g dE%zz }2BZX":nbc;*#Iha 3dtK/IC]DweuoJR6Rf''E!�[}ͭ5%ZTŸw_LMrkO 9[y 2iA!q1f90킌H3NyZtsmߨ-˜':LxȸJY@$M:ynz(;n~fs?#rq-cIҏǂX=</i7b$26rvƌ(:lNgc57l@=Z'(s"e318͢#e.eY.q1s9/DJL9^xxfN~gM(" H(1"fӌw`^EGH؍*I86GTڨͣ4up9ڦ9XLJ}lJfՙM1P9h(k,#` X RC`VE9.xbW<[XmJ{Ť/#n:8|R.XLk19^<`lj&alH/Ȗ:I,eL7x�np FFw2S??w-ګ^$*a4={>{d?j XnCn\`uw3~[N @�PvD|)7Y#zZyy 6WnkI% ^~.(9Yu4xqrt0lY?!73چ0�c$h2ZgR'M:/;`]ISs4ImpSGeg]_ + ,SLwۗ&\WH^Fn7Z KTQ)) a<ik"3=M|{JzvJ:ސC󴣲5cۃ1m-6N@PDrH8(),W{ݒN`&H"CNH"<CI&g4XU(N,DFGnJh)sqՌ2`Ѹ>`&v'傊-֊02vDl4|xgeTc[ 맩ď Nqy_BVy^0֧Tp$v";<Ϧq!Lق,)]2WJ`EșI-rJʼ:x3-7~AZ'+k[@܂C`-4@�wt&|-SaH{N]?bßFE7ke ^>XÛo7&x{x%rnpg0!O] f/# (kvnEEsm!v֍~tQϚɭ]muʺF|zGZf1.P$)O_q24'SPơY3p�v]YFӬ+M]ìVg(2) C\'3 &:n;\%:jc~V<$#%<"GB!&y10 ֓U'SrBS8 5r'e;"߃$i}.%sMeT/İ\$6~eȤl`&n:t~5zj<K Z,dT!9RzY_FR8# TB #Ryz2ǑIE+t~o<1m]T(DRUFQ"#;1׽bqcwRdlơep&6M^Gߝ~VE2J.9}ң{r7"Ks.0,>)bY6wSy/-C8:UŠĎ$x!SeRuXy3 / - RǔYNkаצ_0P_ 5h_qJSadyj PhhƓg@<o26�?]+M,!c@T~ 8|:Ϥ,Hc3MI^W&tw{[`4L1Uk>_<ֵbJ~6Z苓=L2 ethnZxC6YM"%f5 nhpT੓QaziGux\7,pfOnou/ C1;. F g4C\d>R#h,tMƲ\˅n_Fr;ZN/Ml0o׬-f]RF56r&jKgn̓jݦFv:]^ -&HGҬA.Grثc,!rXViQz^Brҥׂhy`R8CHQPD!LOZw´FePrP# /C :>^徿4zŌ%3(g'ΖΊ{1˓Q*\,/`D',N$ڢwQe= [b.KV2w iqbj!;G fۤ!X ̞hq æw~Wq%-~o!o;c~G$WвԽG%=Ȍ̬4=}h6՚鰕LJ2vfWc;Kِ$b!UyFdUE(d70X"#~Y*If,QI\*`�> fK4y;F3@{?i?eMy ]}e% _mUSwf;B(@@N?8xPc٣fi l{RU ڞ|8qr�� �IDATr쪩UsuGSl7XKQ{pL_<,NO;(u'RvllN@u|Ecb+.K=Marv PiOpmC[rFEb[[fZ?R{Y&h xV/�(:./R4V&361ʸ .>�MKb0` ZA8Z]zyj';¤]c&NODOR[wjEcUWS7TMeCê~gj^Ƥ\W#\}_JNb6ZVrϥ F`$uva3rt9&/τr,Rbܧ!?>/1]{v0d?GϮй7N29O9XDGLJW@hZMrWKNC0,+u% !�!2�5dKq]ۃ#h|#jTvߍ(oG30/*՛4kmzh׈ZmAm{?Wbx_%Byz o mo v/y?l z,�E 1SQ2]}h8<b4H.q,w߆|_6ƈ#/"]=ѠbmU] �\nlLԓ#ztyAt, Q}qN% 6Mwggr O�DtziJ_r(YXBZ5tA#ۦR%Wo.i\ìq[ 6=VC\%aCjK[Ti/W$vH|:a<;H �i2g-ltGN.V1hxMPCmgX0Ps̢J*J[%഑m#skK8.lդH^'x5<]#]<yo.tzXSWzwtU2gnI% 1#̺51oD\ S}kCŤFrU!-J y5mD{wࣸ~'=H<5qZ8=6:jɆ5ψ걫GXxOL^#߈̜@ �H-d~t5>(췁U( y ~EJϛO;,:7FPH#V~۱�{jKՍ~4)eY?7}nÎt@ju0|Ĉw,Bpn,M *1q^ >Icĕ 4<^6z cWŦ68k8y`5lF(Z#aP v"_ϥ`p�K *}ByZ#ξ:m%&AzL& L^^Fa7>\﷗(d{ֺG.\9:5Bq۫bn33'_N&`WA^OܐrW~7@1;#όqMP3Cx.ukMO eC5aZICjB$Z24֨ t43E>eT.ZZ&\աW ZxV8>)e(b; {+BI̷Ӿa]1̎t81SylR1) FIq R韷 Nx oee+8IK]UwI7rU'APdt|�345bHbHOe׏*<nRCN5p{4[t8h/gRV^[PnFIi)A0~p{ujKW$FcCn~˜/6GWJU�Mݍ[HtiK6 /7 Ƈ.Q3NGUX#Hr bU 3xVI`O܊̿" !$#p N@�_T㹨h#P\Q3~n/T^ J@-F8E;KQ%U SPcnjE4XFKT1\Re;b:=>즱/^|w@q‡{17hxiu�n7մbjnSeD;옻Q}y%"B8A [8fSjz 80Uy_6%]a1gJ$]g2=H'WY= xkP^pumEʯqHa)ޑ2"ߥ=!G!xcf_r!rkI(h.d8PqeΨg{8>h,Gd?x2ol@)cuESKR2\.wV/Ő"ĕfJ^ͤ;Gz/c40 qA}.XkӜ%v�Gw;Vg5t7&ݍ6oXl@_zzLm -}yuOlv/Oe�: oܕҾ#aŀ[y%LPoY.Aw1CKg'ƿZ8'}Kbx ; [veB6چ}avh�"6J5.Ȁ>thGJb1"EߊolVc4{^g r NwIDt# kL( 9+[!MC݌2UvTCEu6nUߏыIɐ"gr4[nbLԜ`MgQ?e[S p^UK]%|"Zgm7/ k$)*-U)%Ͷ՝"mm+[4m&y!=Wm= ӧN$_E'm:YN&U7{kA}C;߆ 2-HYEM}zWVƟz1u]A5x&J7>Y(!z3{RRPd@j[0{D _J_< <A5:QFoޭ[eJ'lyd3` ו# 7vwZ6|oN4x| ժ;]LQ9yy(.&7ޛ;gȟ `;?k>E̴IvYYڊМIx@/Uq_KC'Ev " {Wjv!!YTU`7-v/L*Qe'6 p%\S-6.t8l̇J5 Hru]@G>?+su+GVv!`ћ<SL{@ 4Wf[Cꚓ7y &sܙ>!xq `KJt5 + 8fR)cѕʊ}̘ԕ[wGDWxYU#UBsyq?huI)5 k15Rik֢ЂyUy5>צaE&:l-:6a/I}tf&꙾K>k7=Zi +R} O -zw+Hzܟ]ŖGbCImMq“CXMzn}=ТX_/^nrN lޏ1aʼ?O{x'+meTw`M-;# .C;7;e͵ݢ�<MG?(CSvxF|Oqu��V↓%}=G`xvK07/ﺶ@,e'(̊ oO׵F;Kh84 !ls^KW"Cu+ ΗʋyS#S,(q<Jb"0.X)N9)_F�,g0^"D2i)*-�?E!ns=-A)U.@z-i\I9W=˨r#n]x4pF' lGj iݷ|xcG"24ێ~/zGlFL7وw4JEAy. c۲1n*?'Y Rc+Z#g/We*~]f3Њ wNK[:i)97edQyʂ1Yxе,E_8ƫl3Tq YoLKt(w9Bg3jW#0BZ/ڿ G(N'>$}Á?lxk$ʍ='" :3rf;p]E\ (PA)6vz'>-`BX$ӽ`Kj`g ``A;K=8eW7 �3Ƿ;{opTwEz[˷R}p۞% Uo]SZq(ëWy Ghm¦`JoD}jR C^";Ր+ �Aҗk6Pʁ[k%q|6,EP  805 ;VVG}(I4@ 0`+ &1{x^j"p) B؏=+Gj}g(OTS#6 UyUܢyAlj^!lp;M씂(ۜU6Wn < ڙ@V:MiUv.1^Gu<08[-i[%VBp,q\ -bzE*B\tbrPsnkզPǕ~p*r~DL>mHb}yEi 4EƞZVPĶd}͜vlw[z=@ R]߁_uy*)d ZX{9Vk (M `o~aCїׁrȀ0Y|!{?6s [ z+�)cUbWBƄ͏9ױ 4o zQ3AW n/S\ᦇoKSc�2�LMnex쁬_#8B;҇QvO@>~hvz$$uyϬ )ZbtX.qҠGK B.CuD([k=@`p|I WRAI� B @"ٳ7i7 Tb(SxSRBQnjً <w_ըsKD;W ACW#)&hysyC^5 OHM9E]!Tmrك#)RgNqtE~ .@$ ܠ-yNłIk@IoGnA{" iRb&8fdIel~Ɍ[7[ r HD=h٬95B i?%W=O2U%\h `<�~T}ҟ/˟�أWpx3VRg:W?lA7?d}##$:sV=rWs4H6Rtڅԅ4vWIB 7v7aA�i[̫ZLںÞ{W-+@|j_RSxu_7}p-O6S="d;[5�suz ^巹B+f5@k۵!ӌ:}|~,ot4 h )OQ ?C0{Դd+X !C6pt-]1G*fr#λTֵckwݏ{`2ϗ;/.ôJ4N =s ^:k <8D9t_С #_>`Pvr5: 4Hj} luvM\-EV>$ô injk)T>c,xv+R _*PZN{~K[_1KxUùJe-F?d a*Zu6C!^|*F|ջv�+^o|lF]-R'ݣ-ܞ2z]3SNR\N= G%Mʚ‘P-FD&fȉ1_w kyZuj=OkGx !iܭ=y^%tW$%U =ۧ ́eIWճf;'wcwL^Co]h6ml� bN@X{Luަwv[Ox)~ �}m>v7pdp*pmBe%#GXh8IZ$=�h10)LwHi-|;J�U`Dl=]zϻn�ĕ i`U ,0hE^:L֡q"' ''f~ܓ)0:NsD,SҥDtkSwē mlt'r#nv郥}֙OUDqnrZ~�Ʀlh2z#^7d 4UnZ9/T y,K|ZZ.ꖦ0 iٱt:/hz:Pu{Qti5 p5 poQC5W{]AJ+"W0q< H%e'l �7h4bTYNv@K#n/$4Ȫ(3Qr_A|&jV;d7fŮآq_Oz{�˗lGd(HAIApv=os1~|?MkS~O ?Ov�=Rp;W]"!Jxs[.�fh 4 &@6@a 1,>iOؓf^C][�ک:帕NAs6## Ƭo ˆq䁃9g(7E8/܋z'@!C`6�wPޛ]h79-e Orh;5kXDZD -\.sCX:;YtaŮa`Ą|zy #ǝlN/Gqكlay-Nzډtl4f?S^;_\6t&gC7'Vw֑Z^u nU_DUT wQwYj8hlh%3n3p-؝rV:so"c@9 @N?pSow[K/79L쩟Faf&ÁzXz�AJ+G_\^ǃχCS ZWt/r\n)qkw6J,@ADBLO�VB`N45Jnv! ?�H]UcJac;WRB#.ׁ|%bi{g$,E$.EqX';n,hB<WmkugFN [S `1Ǟ#-p ߥ?=%.5C`4ժ@�= }qڒy ;MA>tAhy<'?/] k'_}%XAN&4h2j0Naja"_b@peƭ7\E/)q3:U/Ƈ_ĽWCM iP*rwsh-uKZ.'nulYPI3Nehm& �� �IDAT"g?߻z[/#@e5 s\L|WEJ$zxbll@ (٬Q pBn,97sla58)o#PvJ0:ޠ Y~FK_C;8n�;ka<tA3vrxCU$y%>YȪ'n+mɬ}g@6[ p MθE-n? UҷF84Q,1jC v}bj箿32.hn;!JSS�?zJ0J@l9V9wF WPibT~(M<tb !?h0?[5O8$ V.6L CML^ Q x2#!8꯿c=#@ E ^JE)ua$GƚnydD5e{%X 6L)l &S^fY`G yP~݌&5ϫdpr*(c-QtEa2Ϻcptn=cu\E[!%EKlAG z0l)UF$>x9ػcr";vGyh:i<,r &s]_=b. ˑ1ʱ"H4 ԚxO"^f#\g| TОʶE$R )?*Fğd9TJU|T\1N$Y|4>q Gb Vبװw6ɛD >a.ndۊ}#/� _J@aGQ= ɿ<nx?,�b}ػOBHw?|t-Xan$7�0)jPcC* jcϱPlΤыHr@B|ItBlb' rRJ7�{Z{&$3]'ɾ)P*E8u :Ӧa @Ƭdf@ǫRxEl ¿4@�0U t4NgңO?rⳓ5wxHu;vy99v$ M֣:v}x OXΉ)/ځ;M(H42)ÕSeW|wqXoԅF]LO  R7H&Օ 9 suR1 7B_>V#E9W=jlにJWM?ig)@桗B\B8ӽ7M&$͓ҍLʹ,O~L Jmk$ziˮ(WI`#ۆ~ބrYLb߃VÀPkV6H1Ch-z@h-{[ݿ/odīb⏴,7ĀMlA (s\8u귢[dһ}@}M߽4na�&CDaj侉[OC?3ɺi!NMva3 M b5FkҀP6HS*)mg. \`y Ŧ2:Fhn+/vVb(=kv-2IZb *@q6 Q8Jþ[aC*-(5dB!1܏Dql|ω_9}{q<#!rIgÆ{.C ܄jHQ,%[]jØtQ98:V_|JoĮ Q>HC@?o؃Ƚf0=.o\^ՎCn[ RCCiGKBo^ɗp>/Cu-^II*tI5ñ$fFr(>69ęrCߟCbr0]ܦÙ8gSbaUPQE>IUiZ�Divu_6C�ȫ^zsL@? ^owp OWcπNQw0~BĵU=-6`.w7PgDJldz-@Op]#mwN7D0ӋÿQƋMpQzCǒipo732\^85Zk\ z^tjդ Oah$4eBBȾ7 ikΰ8A~e|%58 ; kY4{: }m_K!TTreMC8:UQAЏƝ@\\:۳t$t\ȼjj|4NžF"JyO#ooȯ8r)u%5?PjEbBwlF91b~(uVjiG ROnPJJӾUBP#"]kI>%|p&MPM\CFE8;I>Ȉ_\sw;}x+�8H/qFfmZHE2o kA@rsl~=MjP!%1z3GC {gԈVxcP bxs'w%ovJJq| =8P[C6Pѥ7leu^,@ghKe&Xݧ"}tU$bS<py&MwpNSzB<9cM g;F1z(_q~覊cEճ nۘߖvI pP/0 POÜլ:m (b1Tf@ ĴFHQ_cpJ}OGzPx<jr�B@Δ>h/5yB]j#fMFLd#|?5 +8;Lv~k|aG/S![-T#|UMOi$H9v_/ҶQ@j1XRU+Hn 9 B`F6P�0c<j[>K-Ӏf6<x7Nf + ydw^'hs%i1+iC]&#nK@"6?ƓZ介rq: A@&Kq)Ѕjq7!T [z*i#wb0\2P#v7{yo9ǠߟaO ?Izk>uon魃 ^3Gu$l7qŷ|ċ dm+WAlؑS=TxY\ ➏Aeh:3AV6D7Κ=D4ӓ'Ї6rJ&0# :d责~]&>y8[F1hdigvBk4%}C[9#:$?<9b}s0gFuyQ_ue (uݴUV:6 w�-j�'̆YM垎h"  ) Zr9PDg3W@{nbݍb1i\ TOr0ΣbON7�N$N~<xz'!\,7:47}QDZ8] 'DͺE<,6`sdL3~?hK`1f?N6oP5a& %ב/1n d<mܭd BHy=p#&]-pl@ pw }`:٫|a5|s熟Wvҏ%%w8|/4v\͸gp!O.-j+`c/:q ' KK"*pqJ{ NӈQwgãnkVչ\ri N:'u'EB>Ǣa{(vs@ x:6yAk)tDq\*jR%?&?uḕA`堬*侀@<&%9 ȲpMnqb<&>k׍~aҤ\W/VlJJGU1uu xY`AZdRi{ =ȼR1Ġ" qTZ[z>/cW!0Ź $D#!C5HHN=s0V#c: .}W#{i]2RI1 lOů=חv VJ\׃JDE=5G(;RQ/2 77B!{,F iA׬5(ՃhT;-D@H@ \"xy\pU&ҵ�N 1D@w3%gsJ5�$@' 3Q7i8+S-+F{8|ƒl!= kY=0ߣM (d! !ۥvnUAH/^p=FW{6,󓯛O$�߂dJ[n{'vc懍݈}cy#cz{{=h7% $||�$"%J%f23/ns1j S95ެօߊ8Z섖փ^I|ΜK!H]IŕBѕu 23ӝDI&ymv2DO+'+elZ_ MPΤ uQ|I1"HTla(# fa$CP#k(8 e7Zewʮ(pf,4ȟYv(W҆q)iMi^Lk/X6?nO }juW0C?*<*TyV{C)R6 X}4ŨL%&OifXo|/Vh(jB*8蛁ַNqbA{Mkt.1,LHd3%blvf 仨vi봷4Wd%7>_ 6h^max;,F|"GܡU5q^`]'X҆u:{g~nIY[Źbe;@Ԃ\nO_1�CʄZ HUkz#'FvmPC֡y LrZۉט]UT)iǓR]zWy[:!Vj~QhpiPlv{|bC z}%6Lu3}j%Q\ea|_vE+VVԎŅDbϐ(&I7 ]Fm5)</@o3IciXNf bg4Vw ,PK/cx9Vc+aO{Z@htUܐP %?Xz{vX4zMeK:ͬ ɸeՌY$Kv5l{B<XT ݗ &6)zjgg^КjUDU1.fe[3jYH!e8i/kiܜƪEUh Tn.c-4] hw0wvTAgF%y.4^'6upP&WJMm֪wP;WKX'=?gnS~:pCm`}uѹZeڐmr /^:um0cdEؾyC)ua<yD[rPJVeQ\S={ Uu^hU٫Z_8HB +|*j?ݜU.U1wZqX"o:oI{ _фʢij5utxN@**Eٟ^bIU*\Jr߈Ba[K%ީTd"nRgQ)ݡo`^%e}LvP %[>Vqd}Q�tUQ,PW\N\۪[Ev#[ ŞAQUtk:GE, /Ve,$MAR-5Q#QMbcx-}3VGmY5+Yո=]/z3͂:H-] RS=?Z:F42 2˜n%j|QR>.<8:C=[K=iꗫnZ3ߢ Nv= ;Ț4%1=Nl~+|B>[)Gx~Ϛ̀bJmA\5f%L>WU0Ni(i:9FHt{`R5,o_iXZ,V|[+ZJ-4:TpډT?ݦ)8b^^HgD)LE wU !(n[F.!B|YW·Q^dGP[gg%NX:%;R?PS39k/MW蘘N4Y;ĝt)}R4q捺:)4cíPu4/K_mwcvFb9[>E; / aVōf+W;nlLeG9]f:GJ~P̝]g;nbQDF1&4t!)K ݼt {Wj)cMr(O5xp s٘Y~߯UTq[ϭvB!4WQTj'I$~i;ӝޡxfV=%Zj)48+3JOF&rr`pKBքG4+kI9yE#z5:}]B}jEwϴc|u95 {?^?y0Hf<>{wdXYr7Y4~,5|Seۦڮ%-%=[ʄBqN  ձ 9dOx`DVOͺh& kv°?yu(ZVlu\taMk/?Q+i"hOs6*E_x 1krbL[o02xTڟ)Yq.4ms1g)ix-]vk~ܱ洌ZIM2Nqz(U8!hQϏRmױ6vfҀ0*E3+Xf1xW9~cۦ2KU-$4Ql"%/@"{xQm#֨^-+5SdFK4QwjQ[RջNX;+/KS}TRN*j\rz+-Yuy�yjN0 /IzVv"t5Lũ2%<yhmQP7&jA'_׸.;Da!(.޷ ]8Yk[76hrk}|5iGfVJׁp3)=O6|xo[z?,)T!Eq K7y9C:Ix) 5.[usak]O a9tA$7P Pʲ-m Cf'״R+f<DEG9իbHTBQ=Β/f4a^ s)꧝pmV*}+#YN?<NX9mE2]I+,gSQrJP[7(5ZF޳ _-Y2˚A#1{'?r9grٿ}uO|oTx'12#Orb>4rS0R*wi)@9t_uZM$^TƱ0VS;Uys8A{&CaH~kԴ,FL8,}ꠓf/)nۧlbOm+?ncE|;w^誗~7^h!NŹl#pH<a<9hTN9im<]dYx  _.|u"3VZI>ݜSVb`�� �IDAT#jr[La\SWP[aϬm`y\oDߌ:p5vphfͩ|o_+)]T6_Xѷ?H?dz;_s!47*K JB"a 9 z} kOQ*!(ME<Yek0m˖T#F^|0{4VLK}M{,@Za3Q4whg:."'Y1+-h-=u9L1R:L._$7ADdԒjb%mDDc*o8[%Ih)JRxQڤ"TEeѺhy8&p}fq?<l}5aT ; %Ϣ_Q^WV٥/ez&U+05,ܩ0 &@umXZ.e٩/gbUxdEa%%hq̻vַljrBHϟ7cxi*JTgJ>JKiNdX3WHM|b}%}2x_"Trή�Y`MZƅaG0voޕ]X!%=GLvCi[]J-y#7? >!-\;Vb|.kOlzC!m*|Z<:zO~5u%(y̔];N7/2hebm&ϖ^ Zx;eo* K Nii ޖn;EW)45"א,vZq+EQ�CA€l3W#t:N$\JG>9].ͨ#tuo˺]+/.oNX &^/A]WfMQgrYTa2W׺+f1 8٭T59J}/4 [`gJUCՌMTլj"lNDPgd"eĖ/{i.*(!<_QZh3_^ EE"Rq`u;V*%VTnVi?`-2%ԠK PijP#.7Y<z"b@_SbszW|÷dAw'O6|TAb?MC!WMjS;zT5XDt#`B6Sc,윝$�5 d@&̩)"M3?›R0!Ң=B[Q(^riŠvz7e[b5a7ހ!% 1#rtF (| a?T3r+E0+eŲnSD rQ{c#bTVY$0X5UXvCC9J~X˚z? !2V_q? [X2,G䶛J ]Zuhn*T �j#s®*(3CA8Ln3rh*FdRkK̬QR cWe6(JK 9/9 Spё6|yE-\U)N* h*s^_lA[DF]7˦)ӈm` Ǧo> gbaW]!Gz馃t~S1&SDSX5k`9!I0A@D2%$gpBC>Sc/ g x4xP;Ex$yb\ZosKЇ >4 q%BY yb Ѓ(͝B G` >4CXm]'CmqfldPmM!L't 4'F(jH0|i .9Z=C/UmV"4T/T¾V8 _3QLwH@ص>B+O*b$9KPrj}N*嫹bTLEO7#8%%ܝEމ։l)3E֡LԢDީeh-syk-uT[-] dYB᪟=ӻ}Y+ &͹[58?_Ǫ:X?񣕟E ze/=jaζi[}}H]h3HC*ȐQ ornLҾ6M!.4Dk+҃-!8ǔ ir{o rT#ecdR*WtJؚ8 CJեhFq tد_SgH6Cvd ฃrRB8f)Е@M-b};$.Y>e? #} jH)Z5v)d:;d@+PK<!ӰQGy=-փa=ZaU.[{ӫ| Cz.(Xb/d&jth2W^RPrQ:nN`E`r MQΓE3xJ%Dj$N'Dy*@YֆᙋH"6#e|xK6G#9A!0UZYsV> bImX,uk_a-''f>Y%d9S ᫺dvފ><GptAUSg=$ k%+0iRvmbs'˱V|q2&~]JյHpZ"mV#\䲮_9g=/KIZ~WOXy5e9.ևQkp[79vEOqY"_O<mRb#k4I>^ZL/ըZ<ӄZJan!}I5U1='+ÎBvh5mpUts[{1г?J߬/,Hp7 tUsh3@Pr\ll .a4LJKdxŸ@` j" |zz|w_dS-Q@ETu;V)EYȆ8_ @Hpt;a"(PD&DQH7)1kJ/( 8o@ǫTRɵqg !]wSnٖrg%Έc2W wnwC"%tNtN͇)4`CEru;u=x$qo~bgFnQ<JCaq!G5SiiKYVEګi 6JaTgf7jP;(2P5 {:_٬[*Jű l@LbQ"nb)̙= ՅgJ5F={_xa<"ڣe{~jl>k"RFTz1SK6QZ+kl-AwstBGhZ7ick5)кS\l$Esg϶ߕڄU QH({5e_V %*J4$ tĘTZS9I% ~AKhab$c4:"+ë}Pn[%Ev?kW ݤx!n?'C޽%ޯJv_a7EӛKEJd3F,p1%BnQ.y3B812ZB)E0kH]'K\(oNƊf{|.QR)-//mތ(eCtWtڐrD!K²5G1 ``,XAkitij)ޢ*Jyߑf]8gma{~YE]HRIjȼq}nc$WceWEaV=㣡XU~YH:=y]4,*0,Dgt>%@Eo ,P2|I IM`At)=.=Tc\)H" TfI0a咽!vҿL;NvSLR,lnct6GXc[ S^Pn fW/ŷ*Aw_[%v/aޫ?r\onξ!Xk}oe_0 ftخЩc4.6;6  eHc!URvV^NsI}֣,fd/c ]I++%Kў EC=jQX봳 !D�[3^9^0hmH 'iK=5^^׃$KØZjw"sU]ǟZzʳh՜QhzPE/p߶*״ImFnMv5gy=rCU2ċ tK#y8Jxb\ׅRn\DE|Iy]hNQ>Kr=?5—$ i3l'B32v�Vf:TT/J&wKVWnO*DszfXItzz[V'/8I!QU_CH"gPvp&'l4.R=c”yI]áz1QH Kt9uTʲfֺigWIxU엤/,u~c̈́T..\V:& AnB'du)[)Ŵ|bM!ȰZ-0Pqi&!gU;5oV,,YCwzרN){(=)b*r*aj8eB}Rd9 #%Xvj;Ý0VJ/VY֔a^q%/sv茓}_9 i1 8%@AT:fY|V̕5} ,O f7WBz,_hf&Ez|X, EA Wv4()9@?r`)~9?3kY慜P5PeWQc|Z1Q\}rz%w}wzS4_C?d{m'{ws+{1JL[^}3@@!ekɨz6*5%FDZvJ!rkjIØ֖К6iϊju7<b̳ʲ1 \}5֩031JzH)$`#ge]R?[<_ 8ٔ謞q\(i,)Ԯ^.X*99΋ 㛙LgiV߳qI2$%%j#4ZZemv&Ҭx9Q2PV$3k`^͏s-<LiU@ҩe Y0J9 1UC244]8ˣR3mQ53^hKVf7?%gL C{ŎRRnKJ-C4DAA`NvLŀxg]j|[QC:j *zS÷+?^->=cO >Lm-W= Reʏa4m{6&&fA獽U6LBW,uv'eotpI[ okM$'J] S";\&}hU+xF,�fA',~"N%"Í?]b欞_mͺ>=z'al-GByc@_SMAO7B줡)ps[%:~E:̿W$Ť/RBcBY bّz4yX]/8Z c2=5u[vhi+ڈRNM+H,!`mՃ"Y*rQobU+Ls}i6xs,ٞ}Kx' npu-<nK#[}j:}PS_(jO6(սb"PGsp59KpIZU 7u6; fmٌ(|.*{p)8s\6-Va2ŀ7dZ$4 y{Hml�WIl&Ąbk>Pʑx{µX<FnG0WֲzFE ՉAbViV@jq,s%.ejLz'Eգ j|u߄g2g+ҳ Jvk>()j-'F^Ҵ~6R*Qצq{<Yfjj@屮N2{.\dO]wnq?􅣈Ԍ"ۑLPy9' xD\kRu>rLo^ at@O]Y~;pbQi)SolklȽr[Vɬsc'¦)ܐ_q!r3!xKD7W4xfH(դhrnÀh �kHيKYY3;|gu)lc Xw:u<JH}Ma<G@LvKs�Tj:ThLDbwxB͠u=m)N_K<ϐ>$P_^ D"z^i4VQe Pb 2f#مj&IFa\jکj[IP*4CnRVAAt1 !?(az+Gx;bКzvAʂF.VL/h"2C{6gga&84o|]b2tkjÐ:yK(>رSnwFg3}r?oV&`Aئ}/>5}]W{-\=N;*aǛ8iX{�ق!3@+)w09x~[@ yH>"yJ0׭rXeo,p4;NaTdu[(331$M,zvh)C(S$aHvK8ꄮ9.J.\Vr' Hi.4XEVR:ŌNI/I2~ʾ'\FպqhYV8@(jJ됼DwvpkJCԭ'"鶔$\ѮE.V醆}8SqZ.՝GⒽ %]e \StWȻtfhbY%dW>yTзU靵o^vZ[d::vo(!GsYH^0ɡa,%oHwgM:mI|1X3 ?AJm RVuw%hBeB)28gm'{3W7ƅ\y%(7ڼ3'bYh=G&rx}ߤUWsҭ\HZ'Hvl䕄t@YO^PC2/4eC@бɟ$Q1P `z'?(uMCe)1Mq;QVcr4hdYa"~-s__qV8ӱ'(2f 6Z}෴{t8}xS^us>=ꉶ=@2/ʜ 1A e0&Pݾ m<!j75x>z_H~ꏡvn`/˿wSZDzVO`Jp^q껸oX4 P0N+5ω+n_9k8[~�mkf<uQQKk@zInUm$ !$ $MUVܞ?P ^[AqYo67^\7Xo_@<=TGct(| -D!9$99lGMR:]>Q]9\8ajqJY8ԟ.C!͸)ӋTyi'jG}PKMx{YqOz�� �IDAT^&z<7YòuT"rA,J2aUƙdgoL~cS;/M;k-W|Οoos5C v>&жm;bOxmGP[ntRu`Ę"Laa~37k �2+ؗAJY@I�-BzC$ *,R!=\F ,P&6b- 7k O;ao J}ĝ@zۑ.3y,֫8DVd58(|Լi=Kk/,h?c.:C`lѬGKzj'ߜ~'2P˗ʃRe-Ve&jO"ȤYi)vT+jRM?J.`GiJ/5\R߳ rm-w0'( Emq'QS4 iU2-ӟ%_| W|u[ΏzWF4lLiZorjoW�'DЦ,g݁Fs\.D udddڤeQpQPҮ8zNbx|͊?[j# Nl"@JU5mKx`w$ĄX`,K:T(AgȆJcIz-P>Pʬ,ZJx`~nzqdH DmvS@tmUE: c]Y#wF ]pLU z;=ni^& ,VRi/)˺W/Y1$zq9۱mynMm7_}~ ͧvĽvŶ?jؽcO2R%@d[C >ܔOffm}+->Ö+X~oXAUp OIcmmja^+yU@ !uFkqQ+ 6i3 {F Y/D,YQG_f'Iȶb+2&{6i8 ja0J2k jI+&5+ʐ�sMF.<euK#IB/lRlRH-2'}!(`l.%1Wt<EX_%%V?ڮ؎hV,d.;eǪEiQW7/le`mǂd"`h0j-Y,P+.lM[N,?8^K7ʤx?'H?^}[Dx#+YBSs ̕t6uw=�@15,X׺nmjk90)dpcDdî@`I\'~oɯ|@<!)oLX+U5i=́1orn$h yJQ �4lN@\p'Tvs-\?>U;PÏho JDVVjբ!w|=ήm]i'ӝ׏yJU\_W}wZ $~t/[ڕYŪW*<pjk̇V &ٹ*9듰b/-oO#yOreIN~KvGа3 lA|\IލE<︉Je0!&&+֤gDG97z·Wʻ-+N̆WMywF&2xl^N2c( . &肽!m" Ij FcUUL֡X@8`&h%k71y1[V+Ug,J]%A"79w\zh~43n$&nJ]{:ݞI.y\Y,}.�sLǞ{,,I c {|x_~r[}د0߷kN5wGV!+Le!}VrfYSs~oww~y5,x~?gWC>(Zn6}FR.~<r7tq`[esdJJ޾/LsLw]}"3 O>t0yGҲgwT\Q&^vRԊG_#~m{CF>} hA0hO,*qLigDAO 7>[ Z`-8h38�[8T䔈gWa,i#9l l&9Jo0ͬɅ<h~0;^~kZٿ 3ڸav-Ĵgw{;9^C-/)A\p1;/}3VgO-\7JTh8n|Џn=gBCۇmt1 -~K@>%[{i*T3n%/wX;:drkWöcjN֦Ev(z\-o*"#޹zP"ݾ my];DZ#y6N#T2^G:s'$3h(C|lP6JRE O�o77ߏ^L~eW%-tUn mh㬌@hjas-<&d1[|,ʐW?._mcEjłnȭ@x20m}9|\p`/~.UPҿu/53Ewo|yl!:=vgexyCxk,2VQ@/ 2Eɯz;SvʁkK9'ogK{LoJdn5^.UKFAds@{PkvLQ;7yN/?ȾΨCr1h>HWN|5b6'qӦ`hqb|0+L]y+qAlC9!c1h&ຌܭu3Zr*bGpp"%7 "M|g1.34Kq"wVSz6V~l@PP9cpǎq=)Z~f6pT800�+ ~8t.˯kO|p#UV!>RLӯ杊|2}h>ʚx y;[oݻۼ|&y9zL\}F~he.996tz_bxڕt+S/F/~l<N\ү>PƊiHrCf-4orE"Iuk-D 5mZ60_y94m}?35{E-1!K홀 4㐡cё&[3#^Wb=woKc@8>5&|7h%"4u@AGly?.";FowF . \%~A m(7.d5�nu̮gq&ZoߜhU-_ygzz/弧U :Xzhf:x)޼?_;}A0<lx/Թ2lУͻߕ<i~}uodRXuW4-ߗ&ס+|rbw'IlkB TgcӉ=)CvkE?٭k ް%ɘ {qթ*�כ)AJMe~ ]!NXf,)L jO׸^ JH!ɷhn 'hd, c|Z=r.ٗ=^0FBd:ֵkq&& W׷\7vp5yֳ^={R6*3-׀b7GÚ)V_#Qrl'_p#͕¾=%+*]pdy|A;fQ snޝϙZ1h˃-Qz5+�Du S"wN~~k{;9*͙#p؂$^D/or]ZcՃЁo0AzlfLư43r>~\@8|= 15x5pp^y 0^hh@-NnO'U.3uNNaKG2& nt{ Bk▾5 pDS7,>Ɛ9л4w3U +r#u]c˾ԊP甼NY^;Ds6N5d.,zw"wг\!N M_hhCG}Wz>SΊΕ+L!}zX|ȯJ|W\g9w|Н&1lnvGHn¶`b/9Jv JHv˜%M&3b~n)ѾKؤvqK2F<src69Xχcƥlwf&1rp#ÉĵO^0Fqٙd&Dp?B nj EpNK?B9 (\R[ z|96 6|aújpdTgw>,ؾX> #RbNV׎1@v=}[cx{M5nrqu] 2dqk\gt9p,ٱ4ѽLXv?01!b,t=,M[znsg^Ir4ޙx~ ΂<M< 5|HlRSi(88q2"hw$5j|F$OHv.FRcj R?igq&C8n ﹝HB; o5v/<ׄe�B6K}-R`67f kK^Qu~N?н˭a>ۺ,ꂚ$=6gHxK1->5 :s GL恁u7"!Ro2>IJݶADFakנc�n7 Ct28kؼϘ 1 lmtU2Ӓ^ݵf"=e>,̬pvAG7`3w#R Bttx!@E?)ސkGE[ID GYN՛]b[y1&/,}y展'`{+ :Eg>BPҁG:9#;c'8 9(z#c [[`zNɭ 9jr[))H.c6 sfkxcnmM ]EϧgyM%<_3qrt]lu8;xe06:G}/˳O-P 4|tH*NnmP&}axF3$ bLBY?}Ӧ(krPB|q+GO_lѸs]DĞXJCE4vHZK<TF[$rTfrێ-q.-p5`h bܕJRr(Ypǭo5q4Ӏ~fcі8m~W.96?^=X19tƆoCkD'Xܷ%-8k$xVY{p8~vrnʄlb1m=Ay>JN9[X$y}1pp%;{@?RUwzy(Qkpdxޓt?c@@]GW"#9!J96mq"{\?ߤbPmqg`Eg*c.u ~6d/}o8MEў,r2K)&T0&e ݚ- Ӳ-#ru\OV{gjĄd0T,S {?&C҆\+@14m!e!pjwPADȠ+y0 Bnu.7yM9v�v#(2 \>Iw (Q $9 ^2ϴw E4w$Y[ȅG`[ o`gVӪMdw<e_ c.o<ڔ2Wk ЀBLYZ fgug~M*E^372Ӝ *NkS8Ա bYYp mIEIFG_q!9L+7Nӕ((hVZ9.\g8]ƝwjdLyQ=[tp356dxg@wŸGGktf,OXL(&@`u"'U7Ty{3݆֪%mGw&[{ bOIUF$ʙ ֤:K['M/-."Z_܊3`%"�ؘnPP$&҅SON M_z U00<5f blhr$Z:@f.ͪII$g/Ђwp2?snV38SC5!zۘ^-kʰ$ EސͮN4M\K_I#s  p3S5&+Ƀ1cx!ddG2-*v}k:-:܂=CŜ{,SϚq.=u-0F5#=V KU[eG>qEyK>dq0l:1w^sF̧NVK g3-0DSZ/'Q)o\@"3P 2܊_ J)C~p 7xZ|6 T( ˅^@@^gȨ#p6kӻF!sޝ?d^uAIEZLT�5gKv X2-rK]CEZ[N"7АhZ)^BK%)nC7ސֶޚԡJäQ:#50O0pCp?v9jٝA!ADi[dkq1nF0#iޡ֡!9e* 5h)+Pߣ="gRR 'YA?Pz&hAOBf̴@}&\ 2\HnIH=E\o"Eԝ]bBi&cvmlJrg?C`w0z� _?=*گ5㥙qFXPF!%6;R8`:;vU)Y!+eR s 6 fW)MEedQI~!:!i`!@kb_Y,Dk,8IѼ@.gщi A͆?z iEf|K W|FxڶLZ<YiN ϡ˱{=^yjE]iΡ&ȌZQ܁XnZC{L nJ]Ei{k 8^J/( 1 TJ[-nT]oAg*"ݖ zj}Xr5}qۿ:x'o|:HZu>W^QhEx"V~3 =`#VӑMPNC`-`c0f ,?4ŦZu* |<`QѪv젢TiΗҶ3>uK쯶X h2A&1c/WMKz&,zv9G1' cy5F;LQu]8M6nx Ya =?7KO d:7alIF$ntuG�y M#|>6錛MFXX[F޻Qo"/r��IDAT'&7RϏÒx,\AX^9BrG\/n.GbNH=_iU+ iO61 l¥2ᖽq >Fo W'=drpH(g ~w{Fv&އSF|Ā5a+чU]_K/4Q,(<wW+?ݝw++*"(;!c [㔿S{6%(fcM'Cufa^,eyŽ^ s~A`%tP1""w-|¦` t`hz";YEM΢u& ^ĦqQмG[vc)X\PMO-6lnƉI;tfB,r '1ڲku0=%L:lV9/.(5:w+/&Χ +<K9OM# ăϹ'F+G$7 ÜykM/Hrמ6q! Q85 Ec [,a4`E켉yȅ0\G^}om%!%4X=6ƐR_|`Ɗ7=gb@e3S2R)ouVIrԭ7/d2knBBq6zTaYIn@:#^RϯGzLBb!ˊ]<QhK&x:7E6op?p fā#WmZL>ٹGQ5۵C~S&zwc)"ܗOW%8.u49"W1-kHƱ֒X[Kos4mմi 1?-5g|̆iʼ! {-*:$& 5(&xymiN6,\OS J:RLsj-uԙtDb 7ƶ xT|?,LFzgj>roHB[FO9/SL7=,StWz$_& 7X3|>ZJR۾Bs]^IYZTèŹ*CvRF0Y`UśmGKygؔDdhr XC9-bTFb+/AZlam18H|oEVXlNV5oZD oƛleyĊgY{EoH7q`6j{|cH,*;I%|lKk1mC}!,ܜX%K.m/u}AF33iBM0R6=("9 #"H3p-n0##t0UKy'nN*#"ɭh x݁6fL&Wwr]IPZ z@ [ }M)qĞ#em-(%b's\l-%#Er[hc,Ve$}ŭM7r#"t>W},8uT56bJ]eSM6ޏ6\Kr:u/yv%Cn.p3 Twn-A:a%)Mglh)p�BG.N*WJ)>᧳Iᆟo89Ěy&b['6khouMQN=u<1,v/يϚoڝP];-ƌ klq{)siak* \WOê%<eʶ,bAZM`2DIT5QN8EɲP/)6+6&ݶ|VJ])i>0UxX???-YrpSl<I7Eȇ@ DÚ1ʥۜF9qZ@? US|ʴ9­?H']Pȓ6oc,OOdH;jG>l7[V+ʢ'0El�qԵ&"q\�_^F~<2=[|Et~f]܏*Dg v\1QQqM>l'Љ"_aMpۊ܇U/W$kY͌,T .*/< g@ tNOE-#ľ;/�Ws6~b/v\cCe{Fe$@FfifF .}iZJi@y6yĭ6S|D$ 3xu-!I,D]j,*u'w׬xgc̯#mLs#fC9Ml2N8MnO-K<u4ڔOxVeN\Mp%"k#۴nW1@ 88Nw_Hqf泡 ΢g].n\N^<]*b_<4-Ϭ=^yS k begj‡9y;Rw6 _/Fh=l(ijPӈ@o>oOMBLq!XF<?ސHLxLkKZܗglmAI]EFSّwMp炡fÅjיDz-&�7eS7n3z5g>lJɫ7UsW=ۗvx-Ҋ)z-52cXB[ڀXid!r{f1K^չa/5 g9BJ,If'b"{UݽøO7<"̪r} 1wCP#InޞDޏ]tmxûHy jpmL[{>dC>#sRޅچkfLk.lUvD +|xͣu3 CU(XyOY?7N݌6V~r+%c͝Wßp@SC-svx؛ R_ TGfF3Uq-ϷV3 kS A^+赘KU/O ;n_xtÇ d<H݈5sl|-Kc~S!OvQg~Z$ۜ"r7hdLe& Z g>×i1|?vU`wpTuPy@*P&uyE}y 9J3b)PbQeUބDyanynnbnvTA m)2:偎-涽y\^*+`f?l6Uz%`7's%(o4]ƙ64(6fNt(Cb{ۘb}PV f&25z+:)-¾hc ;5r+ksi&8]t(8Emvk r7iO<ܷ'?I2bۛjM}X /OJ^ޮ҆ ]V7켈ڙ{q,ðO1޺];@K=rAAS) ʆ7.ߊ6>AlyC:k' 9$wF"FMM�ZJhaMo(YSD=#XraԱX}7MIAAAAAbߠigsTCQ@TS}lJ kx 7((((((ޠ-"|m\S}OiJoPPPPPP6%oPPPPPPAAAAAA"2UO> bUz))(((((ޠx 7(((((1&_͑37b 4MSGIDeSRPPPPPAA Dfccz 7((((((ޠx iCWSBӴ}J!y s0Z_.<HO<zu.̓ V-Usd<aK,7((< YU U oPPxRs"rV-=MIAAAi$1 2!PVm3-DE(' /MN77<N7((</:&ayմmxQU x 7((((((ޠ-qJj675) j#7,AAAAA ׭wj.hD(((((?r����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/smooth.png������������������������������������������������������������������000644 �000765 �000000 �00001160052 11332353406 017404� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��O���y���bKGD������ pHYs�� �� ����tIME�2J�� �IDATxypdy|/Wh*6Il TjAd[([VKha{v,w;14vX^[n DIH,> (�us(h4_t0/̗_~_I�< O}{xш`0x'ԇxgF =vш`0z`0 |m^D<Ids+v w;˿=9r"˅a9]<rf^J}3A ?nuswl>SS㦮TڵmB,t_{[bYG>өЊA}} >"`0\Ӷ5w\T;)K_kqO>gyn>(7췣j39 a !XΧ]6Hܙ'xT_Nu#l<r=o~g헌6 k6-Ѳ ݔУtߝq)e>O.8~7^PCzӫn92lkv/̵G ٥vG^s瑃EKʗ}|Jo+ ~ÏwQo@�ٗro+o'SϾWTa0&vi矽e7I{raw=G\@7fR\6uҺ`MJKgj/.2wRNڳQ,-K^gϝ8\xU'۝Gʡ}>2sve8H YfR/#iO_$|W#`G`Lc;\L\߬}ū/w[~?~a|)lg]?|,gUe.(\Tto!m f*mx7>7cgw(9oէ?W{n/z՝ܓDMj7O~ų?7}~?8^wuCٔ?/n92so~u|Ź?wO<*d߰_w?'xvjvEo~gb>O>) ^8={G=W/[*4? b`bJkDž~Ϛi=y)i/"#5PL@nXnJ#BW?ݓ8s/܂eY m=p?_?p}/ۮ?$_~LɗRك]7ēWo}N{o辅V;էD! ǟ<]}m7{-c}ϙ|{͹=pl=<\H=g~?K燻ѹ=Giy;u n>ȱxßx<r^1rs~?gˇ1M7_ق7-kޱi7# ð<Ë[^Nܪ D2ZkmA_~[xl?NCWZNzvn:o}nݏ}l:]/ m)k9X"7W_ƷO|Ͽ{@2O=L&O~}ӡ"ww[s4on&z+j/?̑㦻|vFj1vK99ggRg}'G)`~©˳}Kv˗n9rN< --$[D-Bvܖ_?Ï?}y׮QaN>֧oh@|vgΖLe?8s7Gw/}mJHynWG| N=aIiYQȦ|3"?bn`'L>WP*@)-[[<9KI%Ү NFXŃ׿8*R __`~ 腀rrߡN[9yթ{ w8UwK3zS#R 'O=vٹ$c˼#b0\U~v7۲кiYk߰Q"{73}q''ݸʶ>5~q_?d̩o9 <W>W~N=V5ґ7:/ |eZc6"qzJ H9쯓'I_^<Uj_yRQo,�"K̵/{/Q$I,-kvR1o+G ;Gƿg/ow+o=/M[>LJ; |g6`bJrzSZ+'/y %Gr/"AsKq)'Jk_pZ8^uzkWN& o~xGzmV}7ӿO=wï} [O;tڡy!g{BFQ~rQo<sb)s~r|덅#_م@Gß]xe Kv_? 瞣wt-t~||(ԓ n =/?}~Q؄߰Fڥr{_O7g(]`Vg[xӭlJ3w(}9Ϻ|q{ʻo+>|ͯY<⩏{r<[k~ߜ\x~tQ@n:r+O}3_cDq tԏz]<3ogjUO]nGxh쾧?o<{o8;ߖ7THz_OOL]ܳg?OxҲ) WqIBOwT~p:monA]2 R~? k" ߫Z^6ybН?$v$3tz j& 0&q"-3ŒV';tn_8Ի~nξ@8mnBb(~8C}WuGwPy`߁/L7ꩁb( Ξ|ﴤR$77b{zpm7O?/C[Svs>8,v!/Ŕz'ߞ qSBNkWbwΜ|. $Tf`v/(lM糅v<4 W 3/qyG>[w i~旽K9U;w Sϟ>Ή!5eť;[m78??|tv~ǡ@arl Ғm+G9.vSVԀRZ hZrCezBH@öeo`+# nzVO=r} kJʕk gKu*c[JH$I6 -[JE_xVֹ}8,0 W۰r&~ױ7l&՚۞vŗvΜx5V|Sg[3Ou: 烖o}Ie׶+Q/Z_c{/}.8En9g+<I0:̽7jvgOfv9X>(BX7n9]OUkn0͘jrҮS5ۈN<ӜPJi;@qH9K�`0i+;29TڥoΞ|\LZ^wMmVe^FJk`0luO?'2^+v~lf!qRv Zs3E $5PX7@kn{ю`0\}\2&n0 }kQ`0\;<c+1~`00`0 6 `0`0 c `l`0m0 ƾBagffzٶCV"})bN\mڥʲxlW\+Xy1|GLEoc(bqcM}^b_a畲.<Wη) 333+S`VW|HuE>wg:pASYگ尔vdvy0zuewiTN.Xhr7 omoM*g޲^P*wuo޼rQz֓d}睗8f굱6<)M VxQޙb]bcY^664kz7=Bv֛׫ܖ͚z==mubЗhvxcA+||v8zMolæ]7T-} z檏nO6UK77m5Mچ]8_z٫ivm<ne3<5<KIoF޼j+"{|Ms˧KiK,YW;==7,m/,-G_Vm$Y!Օj֬ŽjUo m2p7X9k>WALj_o?ϟj,m}3 AbjpvO33 Õff`l`\SA"Q```0`0 c `l`0m0  `0`0 c `l`0m0  `0`0 6 `0`0 c pن-緵@p-b xHܖSnM.7333(`1x']ˍ̊_\o`0\.-\-/E[(KҬ/z`0\ņa!q|y MN{'j~6`0\.–Gk. B5Rִ7`0b sy"(SZ\0 ls5 kf,mix 4}ن<C) ĭS Yƙl>O`vl&|s%M:A aq%m  ľe`0 s5 `0`0 c `l`0m0  `ix3z1 7G5J1 ca0 y)]2J1 k|>}p]Έ2;;풢<WV^Ymݫ7mڅm ;ϻJ FO~<cK>K\Y {|>T]F b,a `0 `0 c `l`0.m 333Wjϥr pY.i~ޗf̝{w&6;k1y`#atkoX ܅^ť⚹.w$v 8(e[}a}=ͯBhժ[OK,kqWX\{Q7Ӈ/؅.5?õдf)XoX}bXKIp[h[j5/7k kjrdm^6LW(\yo{l 7?K3t]fJUյ:�jgbA3B ۊ'vu{kK/zLV[6ꍧ,WdлlvsM/շ,nV\8uAڦ[ vw{Wl]26܋U`Җb ,zmɮE׫ʛ Yi=\ӭ rVDjn&m,pznp7P/I3fRT'/E/k涼.ؐR5IyrTa'aʎy16nm| ama%{)RI{ Ҭ旗]Z]r^&mlz9ہq˭ɶ;)؎I̷ӷ# eI̙ao ; a7" Q`pETg`0`0 vLiq w<WVym](ϻJ].qCo;Fkn|}n0 }L N׎x S2 Jrggg/1p9\:AS"?ҋ~伀mXwc-.6vpLEm>_nV^{Q%LL`0 `0 c `l`0.qZqSe;sc⊫wy]6ȥi{{B{B[y=q٭fUd 4-3-{ݬϽՁO{�\Փ- byW|^QĎ{*tEz69w>J2r-wׇ- YmlKͮ|==DvaEhZ9>E-f-z.hP'xx镰kV{oyİ7&^7]Aw.vőwClK+7 ;#UЁ6\{kCLE֓b]RK{k*d޹VRm%a5-LU&6\{|yE>[zbkҋ 1W19>K-gU`6:6zl 2_zoTRj{*r9;V]([S٧d0 c `l`0m0  `nާt)7_m绩e_+nLz[O5Zs3s`0\Y;@t`0 G5J1 k⺶=yQ`0lL]BP� > +sPMgb>~A]e?Nຶ`0 0 yp`pI`|�|af&F P!"ђ P웊1{X "C PZYy0u]~t^~T|KCbp@9R- h>ꛥpPPWcr9~,1(q2" 4�<~jc ͗pИO'WGMPLj,1IHs槸</I =09P8% f7*p57Uqtإ8&S�_ W#CrE4@1U j=FPMpG"f5d lF kpU댹˽&!xU<s2 PAM5h`+t# L PWmpkX<iluqf' 3cf\P™0ŲZ.3`0콹qB sytN \5럂6G4\ʍq)R͇8ڢ4a<W4ҡf$rt�}C<,چXNњV$eYyߓ|zA2Vz5 !0`0v=X+_f۷ e�8 쾃hA@k#A>Z rL=@C�0lyn`LWTi74S)x`HL.$Lx92TT8PBE0ߥ">T[`XLLabJa/Ă!lw8Ǩs ʽg2bƂ, j8~=7A$tYNP{es�� �IDATEդC: ?sQ8m3ǃ ]FŞd*V^@hNQa| &@~Sok(C۱G݌5`0\Q_ai7(q`>N4{/yu 6<<(A2M`E zC� B21Ջ588MUmhz&ZREpj1'~:,,&Cb$!L5&<pRřDNG(@a9r 1 2o+<a}-_tQS. T w`Ip W ~&YhAi:_gdzXӐZ[BB>Iha7~I !tAerB5"e?V>DUF8K^9 & SQ,+@!"y"F:CEQ$~tԨ :fL-|X+ ȡ4~i|M 6V>+Ο@CLF/Xbl l_tYuJpV-td")Ԉ!252p]@\SsV:$idPVc/1sGk#O"$TuyCO5`ܡ5{6U%:ܢ{V2`0l�#ej+7[*0NAl# ɘ5\7(+3zܩ~ $aalý5d2` tT1(A!y~^sR<pD=0 9B en:4>h&h*Fu '`W$)pzbD 5|1 m0 ^ M^\h4T!6 Pʽp &1,U2& vo]#ˡ }y_m:\tnF#3JVōy%FLM+3Y;af0GgH8 9Cv;}^'[ud# .aU+BTeN-�RDN/Ɲ\i<>İ�$ߝh86a`E(*(K/31 S` ^ihkti%4~`3H[/4^ 0_s$1m h2#r4aVzThA1BLm1,rVӖLRAVe:s@ B8`8Q*UhT1[4!l<5wY"8"f)盄p� 6Z(cWBa'z"&C*!A>o5tEPc (gXrS%5*t ;nq5.9EvzqTnIfx6 +� 1p dlt8q כ#*(0-SAB.+<G{ ĆBkX!t-''IҩJ0>WՄk/*2"@N s'PLc"%ivM XJ[ IA Ǘ)0wBuq 5|(j)}+!QtHE%X5bXbe1'L3}{,Q}|zXΧ}? b%pf"d<Eʨ$;À0c k!X͹󎈨0]]rȑOSH9[#ej@5#ohm%ʧOWuH 92L!ce^a#qD]$Mz| 5TH@)=,z~q2,+e'I,|EbĎ(-Ν}oma)qDHʈSXʂR$Z lTTU?ЅM70<1Ee͗ebXl}q=Fm! VMe&j0wԦGHr,-'�:DL.u7 WC�eWNl>)0bMy r+h�UÁlo_0~DڒDH*M8͠|C6Nn,"ts)2.NL:]J-@JGLUXQF( eEdz-OZMSAWG6mZ,@]1b2B*B'd2t4e꺵t `3I.Ρ%چno �sQ[o'8d *>/)^ LPpaj(PϹt#K$ňM^S `6@ a AZ-bK谒Ӝ\߉4`؍N&:/�2h%iN]v_ѵE((=UGibF@%h7 2,a&GX JDhO<28 [X &sy*(�%QAebEF $Q ٨ Ոq] v.PL@4J"BDd nYdB.,Ugx] %݈3S`t$ ÂVju@EKitRĒ鐉> UdHǧ Ӭ@b27 ~R ~l5nΐ.Lk%BpCD�5MHqHT;k8h1h ѝs;tvDz.׽DuOU2`]N@zj�QɆ[0L(!(`o-aecW[VD3iװa_7Ue.[=ĺi,?-M'S1 8 PPdPNj,"UXg/&SӰ[F9)-M<C8L=b Ү5V 7D] 2(6b50c6IX*cISGb($nqh$HZ aVR%_]x0@6hC^r\U.<WE:8C]j\9>{#iA)Wk<86ȃvyK v)MszY Ðlu02TT D^2"zA4QZm:ƝxDʩavUaC(]x1n0 ?:FLj%Po/K1*f\P<ֈz6PpH -}$L+Wd*$& :JdW=ҏlb ,$- $_&"7(j1mA#&2 D#7bp !UN[$L\el*^Zv$ٲJƝR=N.H@I\ 2v 42Z%zJZ%_󉿎.#jearq@J[:較[P l Îl8:Ũrc3R>TV k|M.kJӋ[Ё4HCJxuE "IBL<<_`IHd=ԙ8 c/&HD]H|lPmr-ڧHItQ$Җw@]mx><�a ! Z>Jb1mwLtԸ+2~tU"B/*)i `ʜ.X IA  OQ/P[ql- }ZXUk 9@'d4*-Rb<dn\U((d)>=ف FQH$jea1Q+eKDat4Cd_ OCSq }mRUu) ۻ$+0STf* S=16 =ԘU+  G,C -@9S $X2BrWz{F{/Cj6XhWmM#bD꿍hamp!J~tpA [d?G4 AN#s*+R**߯D* dH"gptD# ` CZNÞ,t �߯!Qz[OAǢZQty\OɑdP ݭdBq{*IBD@ 235zGePm"$!<:yV9c[O4c.a(_*FT\h62$(Hh84RN!mA2J8  3CE/֪;`0_,Cf; i$ \Z?8YS"j I@R[ys Y<)sdٻQ&EW`AqYsjţ(qL9n(G`1(c4E=8b`x$.bH%ALbXR)T6_a{zgAi2mjrYQ֛W4եD I jѤӴY*bM" SE=NL‡it%UWTP&tm9./%qv`y6",D\rULR!\f86>\sDh[Jt*:hM?E:GDc�C?,kb)|EMM# 8-#`5 qF2J: XdmuWFb 7"r+MK\; *HSN(w=R2P鰢*mZDiI:Fx=ThGhCդ2Bu̬͜({x͋-2xLў�X"c 1xDaH � x99*R*ʆ} )k r j>"<YN-rQ'YCJ8T3-ߘ DeT :Jb&#,"*%"a\SPLq\GOC6A-5h0']eE:]ԎʩX1l/Xb00$H8TE%HGKbQ '(ME/;S<DD ׫Q ZUQIOWD*A^Z讏PF(tE�+Md&$pq%nyAȪ$$DB|sRKd%T;Ӷ%C{ b,'*TmGaW2VRU Bt)q'[*薫SŽIM"퀋9}s ø9P4Lǁ`0 <w~2Rt`سr Ue". }UtN@ZR5_@@Ԙł2buD%nb-G#/[Gғ%Da"x9 G"-@Y)R%E,F-t`KFA:w$ Hp/~#"l=CV`mM^Х :v%NhDvdLԝ/"5G/T2BQWnUF,PGj\8PEOA|jh| ,V H3E,+IR42~.Ť5' LTU۶P0\xaU&4CJ7f/ sH *HWthEe$D[cnR$Q$0,6{`K% bm! ŽA%\\P` B gyc �1H CmQi(S>lUCKI%mQ2qNh[Q5Tc#ߏaٗ@4Vt^L v/AsVr\V8Je)sJ(J',밅gv%gaD F&YNY* #rN[C"B{ X5 UOX*Lg[l 5E :=\]j!aDV;$i�)ǜp EHb)&aW퓄$A՚C_?h}/g!*WzwqsPj &tBB1n5Ă8 @bBѪiJ~3Ȇ4|dm'{ILFQ=k0Le4j0PMI2JAW(A H¢_'J696JW.@Fqr,n ` '3=8 dX eƇ9uޑ6ѵޱS1(Mt Ọj ]_EWtvʷl[Ll^\MISG$YmYzځJt  7jf`0ʪ)EZ+lةU h2'T;2a9ɚ@rs]:i|L)DD:(-[YJdyVW|,)!e)մ"!}ELAa2 G!̐8- 1>!];ѶbXְcDnu�iЄh| )F-^"i!#='UK#}" (כ Pnq= "&+VrxRI~.H+g YaI\"Qѩi (Z~tl ~B 5TҨ"Z}Q +)U hEr1롰dgB`뺕E'VșzAfi,j2G%zU+VW%gthK+ff^)AUE4IحHCaF1g"_]2\0`kprO@X;}]} ϔuP!ǝ(+"I=RU(m &8.A#Qe!W( m2\ WxqXIߍá(ӭ 8(SbrmBŏocb<dɲuMUMkK mb",YE1H:ڊ$RBl F o ;^BKbDHdM O"c˷tHhf9d^mgB5 QrtOEցm_3ia'D1iX(*U݊.Uqg@v%�i%|)ڰPuj³i TXIuSvG* ܃Swk.~Dp]Qo\cC/Ӂf$@x)l5 *!DMrmt4PAՊŤk~ԆfQPބ$V S̘ROz}]m O ̪c'{O+:=Þ_wFѩylK;?fvι{DdW_Tu3$<S$B݈"6*̟6+mbhl g6 NFR^gFwYDҫni6#F=ҳC\k̾v|ur0wt|u멟_N|XEsOK_jj}z/ ,i/.bDMR}kr=6gE>Ymbm3db^%Þwӎzw~D38?,%eGe+%%Y>vVIxĦ{ֶujf9QbV%ɋ埽B9xOmopDkbb<'iDQO%5cA94SߌlPwSZNF)M?}8y8Q?%ő]>Z^\$fLOfyO|1yo ōnKXC(I(vzBWSaPhsui><)Oxw9 !O¸@WHYs;fT2Nf3=,] ]bhH5w_f$KPw3ŗ; rnfYEĄ7J?xw:]K=5R.Ss�)f+Grw7 ZCyyyrE~>7Vh$#=J*9zbbAgR:8Txw:-E#v1&+|d$-&"3?4V[ە|RJ7OnWe/ٔ&lCqcӭۉt<} B�� �IDAT(QHgƤ㤝R{XW)zM>X<xE#%TH)yBzldUb\gk}Y/KUJn@9aTX1% 8YQNDi]U>~Iʱ9ūaZBEMRQ.fwinmL-k΋=_{:tVvuT v mm@a[KmQtg.j[uߩ z'7'ls%*Ҧ69;aYS͝MmۇodoxÊcah?L#{;NoÒ ^q\.7|c˫. ?<ebώ'srҴRz ڍ-M>i\ nSqeh>4&EJdH'Y?q")ʞ{5=U0Cr8y.ϋ-,AcͼV_'km9U0' %P֞M^IٚtBhk.ZLզm3]@Hn{CmCBlydpZ4fFޠ 1XhJkI9wWGApYZS t5b@Uve4n>?ɪ>IDڊY\huhh'~ֆbru*ktf4{,}CjJB/;CRw;A!_5b tŢg_p=cmH 3hLZLq<7ځAew393U 23чIXkrܶVC%ʖK9NR:*E;)Λoy/ho_.7|eSBsx/n2g %_zoJ/|I:[=LiRrيiߊֹy9=j C/>̖tJeBt Ju{X&INCݒӕΤl=Q?H!|z4Ҍp$Ef%1.bzȗ>enNW4tr_,Mtyo0=GHvTic?[M x.ZGFM#l2\B L~# ze'-r%Yl1wJuڈmM)OI#y؄erJ8K:t!aktWlm7}Ջ燅zrC0^k9n⨐ .g91a{y$4~lݮ~}%<}t41IϨP/^Qr^\.NvpʻhAZ;-0aWLO*%?̳h-cj1sW(\_ju9ezvZ=%?YGIy|2سT,O7;\mNiK.bUM5{4DO-cGaHN&"UH!V]kC[&+$icdO$N%&QZ.=Ik&Kʇ9hIH)ɳ,nI ujM^j>IEbN939R5Rjh<4c>\gctJX8ռs^rFYÜm" ̮xkV u03@?E|m1ǚt vrC>o|9 :i" 16|3Vj%vHHVaI9$CW*k=/͟? OY `&u$50x78K|.xucYNŋɃ.CC, +BN"ڟ%T0]i u#e&N WӒuʬy0Pe`ȼ`K50C?o*?X?CWe) KjQ?79{pѓ8,N5Cez 1q<>տji\2-S(fYrPBrDTDA̐54n.IsvMawJMN-ߧ3e2+d$Mdēxdn_ZcU. %>L[J)X[-Kx.M ;dMmOLJkѵL-#OYpN:!tמw3c=6};;<8_pY@Xm%3D^5I=187n2<;:Z?N 5!U,@Rɻ݂j@eF]v&5wZz @ wrf⅘G!M/Y0YsMbNXи{CA2݉=mO }IGrT,u_561,dE9Bgܔ><dwāKÓx 7j01%g7xG6zM@ j;oڎ7 ;7wŕmc?O^~Yny,O>!Y:-|zv̖ j V?;H'wOH$$d/a<ae Q4l Mbj"XD;-EfXbLC[UK | қǙI,W6.&wan.?6QDeKL*C=cq$$M$[5 ƸNI8n|2Zs;\aRC?tiq"y)W?Gϝ"X6D!֏-nxHČgmg<C?ad6\)fbFY\g7=m6}ݠ#y[*mn�dh$CG0ʱn=_tNm+Ka 8[ \7Ζ `np]6f^r_# ]a+ZodHq;MU ah1v>~3Z#mk>[ k ѡLwya~H -6]k*-#_qn1{z ټN]g(ou~;axo��#֫!ŏU)E$udw}$I 0".{9Xv uRNL IV-s4 p7K"x9KJf)%ӔCMdz&z'QmaLYPWeɞZdӮZOT3R4Ҝ5w~$Qif!<j_Teݓe?us QF $EXi+KR^ ޖ;eDP;$om"y"-^jW mLb&ǝYNΝֈёQ)Nn)er];s}Wh0ǞInDI #j,h{ڎhj̚+5w=Db}[U|)nW7<y ) @CwrHz7]P3#P}ïC;lYfUY|47VyKy˰ᇟӁ+AnpL112߰>-o.`.7|7 uǭ)dN/xz3^]e;@{Rɋy5}s矠0\Pu񙤨hŒKv$2e$SUD2$)9J5ќ.-uZ f ,t<y2j)7N%@5447Z0%]Y,%5ust4qPU 7Gǫ[J")R04ջҴeɺ҆&Z]Dl'PԱ3nrg0"-G B>xVilk$4.Y?;u2~wA~;ǧ[w&a<ncؽ뜿:g%:0W]p99]fHL=0Uۍ_lihE XЙxBdFXj[G]\̩63rCK= ܈֨}oؑI﩯Օ97`L[ :#kXRYD/N[89:2q-Jkҗ,og7 os#5T78ɰ{6ݾh̨p@|*xQkV/)Fd"7 }J1~X  ( ?dWy1Ñ_ӷ<3^7y^|s0iW,_^˪X&eRn~-,x dKR:=HތA4g9tWS*.C,4S FMcJR]T#zsWԻ,t,wK.T$bLXғAOeΣ 4.z4ǛKmMͽZMK9G0d&"O, i2&ݩմ=uL/ݞXy6)ҧ:Rt"F۔VJSIh<u)wOP.rگ"%ԬdVV%CG¾`3 y'H Jl[qFz[ԱZ(;nQ,m<mmLYbXn_)xx>k]R.35m<NL,=xAG PHHXHW׾ʭ\6U~x7kv$GKaGG�k8uϕ$386VpF@{x_,dg.7Ŀq뽀_o͍x뉗OC)on6 4^IEO\)|PԖ!mNqb;ZO5.U1>dJUy|{/9u=K's"I,- -.Dt.IE+,%M"T ]\&.bF6OF5UQE$ljAh!ڢ$$K!j65$JYcwm, -P=zAe-I|Y"jЛl\ !e>>wӦ.hh>HZJ4Mh̻F<4]U_ټ߮-?Ӝ<߻H$b8iv^rPPjAGroѴ`NBxFe~0ur-ݐϰF Nr~_ɓqB1;ڕ|MtxDGVb}|oRC˺t_RӾf?"ʯ,z[]_={Mx9N +Gk랋- } _o9^[m73gOٽ}|!pygCg(x9w8@kqTy ᜞8inu">.?a<#?`X.r傳*ZxX 'ͫ\=Wr9rPB=^-wϖ?\铜坶]kwK:rB;JMw& 61%OzHǯX!K7zK`CX7ղn1 $t)9Cփ.4edjVD B"ɒd\LD3qV${xiQ꽴9E dX*h$QJݼY7kJ.⚢L8RI ݱޅiQKIf'(LYs]4EU"SOYlHiHh)ݓmMymOx,ζ<ЪRt蚱nĞw%9Q@RŠ>ÑD+߯YdY],{\W/ɴa]O^F t?g 2p`;<XAQq/8\eDRm䚻n4mC%| \IȺv_<~f!6±SV6}M9_5M{sIPTqAG"&A 0N+_23ne:XB > =}\o/mv'\ LGLoY)C㇙ 5ru>_0$G&"O`Jk󧧧v<M MW=~/&)%IϚO#nUb'q?Q/Ub<Rg]ZHKn3504<i4$$Iguar&ilhE* A .Y$I faDP%ifiK-FZDgՏuKj()Rɋ8-+Gh==%2=BPQeXuV.MTю.*(MFI=kM53bZelr&ihZwcܷ6iXKvgDb: Ђ)-18DePzrNEXɽh/n>oOzKJzI22=[N6V)mA//.x[|y5}؆ 2-y#y<|5U8*̹2߳:fv #9)вu.0BlԃlL/x2r{v-FP7l}t# @s(hMBxcpO8#$5%z?A^ ?{Eߖ =sXpwdor 5eōk|#O?b2\I#=ᕃQVrJgbS686=O7rbS9)*Q(Xm2Kimu"TzփŽ#ğQxTo| :1(ťOԐCkTZЌ:JJ2>20k"D BD5戹{�Ʉ#!-p"x 3<G&dtr` A ]UjJ$ |p-Ԇ$Cb:ݺhsjSДR G[J՘MksV-d nFV"y-A:5}x_~kWQ7OTMVZ9KpؖGVn<o9p!=v6]s9_82QSowInavAfr]ᄃ'BJ/VOe?G֗HF6WoםXFw+L'ۘ/gݛS?o$NgHXߪ^H[y4t'M3v5A˭׽y)VN”xxqԯ_.9^VvU }:C;Q8i9 ӆe="s=e`hP9~7oO[2!Er(?glۧl<PSə}%,~~hlNhXڊ^΃1iֹr[i9-ȥ }SuX*c9gCY4JF#%AdkӰ%RvwZXT0I*=)\DD-4X"͉FUHWzQU{ ".RBrFwE\!B"da434 FIzh!]Z(sYCM-qqi+mNݭE7w1L4'5wh]&<!`"vy ~ ۬|p5m-GdOfRm<ϗ>\}p6ƭ_?l$yגdquַ;|'DYY\ĝxVej`*bƓ)r<]ɰlo%g_+d>Jn1%wF-صrf׾ 'ta~`nmOJ ,~E|q*_HL3'_e8K#ubM/=5PhP\g sRЂ.K/Cx?Akraxb|} >\o7%cW5+Ɋ�� �IDATW÷Ok^<㈭F ƫ3֕|sĜ/oz=~ȫ~?dys} v;ˡ)KY<_ƴNL҈ -^#4>N&.[%ڡñ|t:M9 *گ4IdEchԏ`20ALsHq1Q11$KD=Hz,"4u]51t3G$HMPI35 g\"pZ.t%$FIZ ]=]fowqX:f*)iIGg{]qf~hrbz3=rFKP8szYXkV[k[Yz Y9~-~w)cϲiy|HBytr~.px޽C#\U]0R'\~͏ՓϹzOxD_JfX[Zk/>q|91VUtv<q.-y'ꮡloE8(w) (g0 ߯*ԋz{pFˆn7 nYzkkex̍FQRc6e>}<Qpp{uJm%*cnpcx%Ӻy%v]UsϋzIv=8D/^|XFoi%=^=- ot 8q-4đu)�,37WM>RNlN<}GtQr×0<*0>T:dmL'Lٲ&Dg; 5ߵ.nE8JH`G橍W]cXHJٲYV4H^%xQce2YNrEXSi[]<Ի.DT 0vIwF&o]GHr.ID5E@h{8t).]$nUP$L4B5iawhEUR#kkM8h iYHɂlf<5'`/nfb)D!t> 5Zzpq6k饄gg+ɶ*!BH}I09٤qfK;Yu]Xp^VSȑaFZ`3{ >gj(~>>׋~Dɘ6^ŵD6tSZft`fwcDK9 {mGT�2RB3>OގLՂw6}ڽ ώye"7rmDٓoK(i;Yjj7-z-Yug]Hߓں5z_a7pͿ?+@{ NY ;B"?.Ƞ/'@~F> ӷloxl$ A.r\(r 䁖St39`~yi}$,w/zx4{9.msO|X5Zlwc?Ot7{o"i913̪)&i$R@"^ Q zFh5KK-RQhЦ 9 4Ak̲{9ZxTVMw64R 94<J7DC``9圖N&/*e)XEV5RiRF[ (B!đub'&SБ&BUڃ Qp<!i2uB0!bIC$x1wENcIP Ulm uDBf.Z탕ήs8ckӬ""xhqPidՄjyy"郱$M.v>t>U[s)fjҖ:BQ<K^>VA4אEy|}0}F.\Y uM,?ɇ1N֙yޗ|QVdt;<9u-Vn}7˞r{o90&ʚ)Ɉ# o36x[e#,uU(D]7--֐VT:siuW tJNs4X+:v=Lf}M<qװuΔFаݖ%hw;1im}XQ ?;>x) ]\\Pv+pKй?70~}>k{^f9zWdy9{7>zѽf)ǘ}Q! +ul=~]GxO0As,Q1"Z-u:TCF_Fmv1)5˼%G2R֕lp"I#$2viLnzZwrdųvqk7F5]SP%B4D#]=|@5|B#hއ$1L b1K{UO32"&I&3E5O`aD{džGX$&5M1B+CS5,}}nݎdkPW9JUD~\t2~e?z$?ُ̇3AV}[M)S^LDM*Y45m ZO?TvG(2_N_R%7*kAq %R1AU|XvIv9I4K%I来Aeԯ0v#'<{U aH N(2 [z# xcbGg۴c/\pM:m٫^?.k_4/6gIJp|ko++j~6ҥF=-oP_A9X6lo3Fan; v;ǁߦ|_Ҟr8s4-]>t6( ثEGɴK>Ww=H뿯~a[X%ӝkJu~m^Ӫh̩Ҕ:1_2()rDĴeyO<{CZAɨ1ǂ&յiIZ\X(X$cw;LIK bRjj6k*a&6rru N(D>F:tdwY"a֔R܊DM莵p k8>| .!#0Q0CTTE1 QU#bDMH, kf&4KR1?O݁/CWjB#,F q s"iͺgQ-eM}YzYi"qOnz~MI%ƺ^jQ"ʪvuڰtȩ WqR:=Hu?a$e-8|2qlPn]}>->G)Ng"kM<4 FO_Ӄcٛ*f# eC4ܘIҜ7:D{گ!A\p{QxVyz>mVY\Я?H�|2oNNDFN_p{Pv7tP|m _kJ%/2'v7 tii@|3; 6ly 09g)^ow|\[~AyJ?1^^6a9wfW%(y+?x+Zn^`y|O*.V[>\Яx+X?P߃^Ð:p"LJ(}7"?mb "Y剓9 -xbǰI3UāʜK^Ed!iD0Mj2rctUqTtD񩈭lR!%D 1#d P"E{&5\đhfB#D@㑍GDjc}Dn:HVDB$4h8;ı&!C#ܽ(CP$e\$)8O|V1$Cc!;}tdZD̑μ/}209,RbW3RZӃqUۖ ?aSګV%Y*:e)ҥU4Z|cwa}@~E|zE"~:*M}uevJk{H$y^Mj۷O΢h}{K| A6! NLnըa%N5tE_'sos<CuZr)?-)((4vy\J﹵ݿ9`{soOZۥ~?lz]߃Sښꑇ W3wNARuky>P2/kVl>WvSk/ 3gޝ{⻥?ǁ7cw8�xl_|r�?#/L!vt-f@c?*/\7~勚=|*ɋ?}pǘu'pnw٧?M:ϋ{gwi+n2EH}_y{Gu6YfIÆ+萑~_d.(äbɺ 4%JSې"Yny䓉JtL܇7\#W!5� etD,ޥGAX8Õ]꠫Ȣ ɊFH"pJZH)TU[tq-Ubw5TT%%+gyJ(ql7-T п_ؔd5[mj)r4z 5q⧒#o{.-jOՆ"RGM+g|*(>h5'b؇f/ƧWs-${y8Jm;ݶRjph|ٖg!ZDžɝ /UC%- 1,5~J6Z ״334!?<f/vYFM  {5$8w.mu -T`Y%/hor㰅0C< LS!;`T`@Lkf=BwS؞QQU|$  N>|NAThz8IyF=xsy6/n}6rָP/P9sTխ:+f^T(ӥs\u{I2VժmKʣ_.~Wo,ܦϊ=:vIW㓟G?ke+#^Mi"gi~HD` ]BQHf+fnIGHI)E2 zCԽJG.anydCp,0GTӠ61Ĥ^BmH|*"1owcgl$eDPL=b1 'b2UԐK9Q *ěV*A8!'CM:ݻ]CdtY,: |Dh."xO-4[)JFFDZ>Rm4b8acZT觏 pў{=9c:i6{H [ۚwGqO< ?>#|'LN{ݐ|MޮrʒC6:[^_Ջ^<ି"B;gWf5\fG֖Bst+lB &~TX%60wj}A,ɋa e&‘݊嫋]Oؕ~s^ovsHpg@{SuA]桑n� V7D4�x[e>^_w23tAɔ|?*~g0}{ʇ ëG=WO_8)繜>eճ YܖC7II25mwu\#iύ+ilnŅ'oV'(2D%Fy"M[;mS'>ٶlI$*MӪMɧt^2)VK&*i D:EP nT*skI)HEkQn8 tABI(Gg z "a3&CdGS!U @Áуbx|-gd!`%S 'Zp CFֈI 7I7"2qJ~5)N S} w;lOȈ׊hDU=t81*m,]<<r%dF &yMʂ]wu+#eH#0To~tMtڰG_zHs=yB:!>(mIv9R[osd;^/ 1rIgn:F,p힩~[gcjR1aNMƆH/vhӖ{kѸwVd )?$MЎ˲υwOX8Kc/hv|zżˁgyy?HY bߡ_!_|quZ%]x_3{dr]tA=@`\o~g!x?6g</0+) |Hp +xΰ3ߠo5_|WSe7LT*q Szi߹NolT=vkħlCI/UZ"Jc5k-r5ӔmUIlZY M#>M@3?`R5bED$w{!cbf&91# QsU|4!(fhDsf-HΏ/!s,\"hk؄vt}^i"F+DWh}ăM"xKѢ{8<ܼ-]XN"\<%d>DKJԍ@"MjGlCzaba#2Q#܄Kz]7PK5cx0բP7D"4cSc4uK ɒ\WZěPiihho:+c|ez10hCdiA]l{tI2VFQ؇]ff-&UP E!9/)bj.ron9zƜI ".+;| W+{G7�Sq$!T!xj[bf;FWPOׯb3?d^ɧWyٞ~q #J==9҉Q|p^վy]~}e@\>\| n|uoƀIwx/ |/yw+&a :ryc9t /<=Þ;{cqP2%Q}/_#}ɽam O5:^ } gPo'aFY!F/D {WZdu{>tZWx)PʛQ.Dh6& aHl>-+K$qANGVf6w(ђ.߮FO#7F$Q"H#<h,,}qF hV%Yd(\4CyܫKH5 H AH܉ wh!1\ =I#{^BO:edB0Heheub̢]$Z I:zD⤤9jHP<Eƒ:zzP3BIM{uWO00\S(АFh$Y8+#WٽE_E;Ŧه,i9jY߷veͯnZ~iW,\bhNl/TZ*hs cVگ'^!}4N@:>ҥL5YGE*v$`8~k\AbaZ+fu#<A&"qgvv.ժWeR,h/5zz6” 8rYu]'?==8HVD3TX:=5st7vٮ^/Q�4 ed KM0^8׎/>O|Gw5L |yxz9^xPRn ; z]Xi2iɧ# ֯%~u(o `B)h~ܗs۹�� �IDAToh~\'%O]/ ++tGa<ф[/Ho_"Ϯ4(^>Y*}~87YBp?IdwCՆI0jrM~z^<ڔ&arUFci-cRTH_ **}0$!AG4|4dZDH"KˡJVSPu^P̝[$CsPR-2r E]ƈ]i"} F-m6,tJfL7 #1L- hHC!A TpzEYCWZZ"Iu}с>Q&b$`AtEe;CC$I>K)!$q҆!$ lHrb}>$Fx9TrjBh{Q{)d}/ohn>/xC씤 "wz6C8_#c ͸ơƿDAvr;)[HdcDF h lYg|!W)U(rR!. c@X(ٰ@x#+itU{ȥ-6쁑ޭyfy9u~{l(m4 |/TmMz&ێKx-l &| /H+lEptW}E'J+9梭ٷkjFyKDej<aA8}pјul?R t gzNfw.ܽ$,'*Ħ&__;Wcw{9q2KMCJ{I>$GLCΧf=ؚX<h"ƲdDë"J 55!wє#aIJGMG2"P 5T' ;x3F-(J0"rwzLýBE@#0YV;=ɒ8f}j=p4OshHjDTE<xZD6D1a&9IJI%"ԤwC8(FNMU\٠УG1F,#i^dBLQ3s,*}#\=\ 0 n"8ѣ1PGUdds2]$/q0dRfJ1ch#zri.2KyHnL܉W!t ,]1<#M^<0y./?u rJ9_ 3"POBM{NqG3}<yw!__3=KԹkM>e"Vv>j.!I3V?;2?Tjj( `GS*m񙙜y#`9q KdA3$N2 OHng{}%:w6 oT}1/~D|)}qe3Awta 8C}la@rjv4a鎜u."%clorϸ ޥσ,d7>AnW2oO"Aj)D5J!! ymm%WSYl3o'o9[r٦i\IsGD耱jDG5GD:=/XSyTȤҍƝbT ⒊) JjY )DQIkC'"FJ(=4g^S,F˦*A=71-ҰP)'ޥjD. sL\]K!!x"MJ䒤(a#D& IHᏛeD>}qPZ-0 ҝ*ݴt:"&4 C"#!=b8ͣ{AUԐG\67qH 9$Ocl͢-j<JSRdE^YR-F�vڷ}\vlɥj eD%5l_a <#^)]v?4JE1߳Ψ B錠 K̅#u y2arTrn87xs<rv[B|ڡj/9}NdՆL'BA1TS"?>#giS|ڎj c8mlAIf<wovlc]}7.x8tCQ1:)ʠ=<nX cg25~cd<Oi wN^KX\.~wzR>\[m_WMipC/{]䖌d21QpȌy;<`"):JXкc2/Vug"f,>Z[*Q-7ȷ)*¤9,lS<>deIgSZgcRϪ:pb-"c飅 Vl'm"وf1p8I҆Ul#u.0t6C@9B׈jhBaJPE*#eJ%$ :,$eO)ĺp$oHUF[d73>=v/"FPePQ䑛ޛQ%,E!]=Ru.`:Fz΢9B~=Z#((ׅNTzj=$eEĒl$&jlj>a֨Öc ,p`)2Fߎ1/HJ&LZ T<*6\v\O}5ba7v&J¶G^sW݊}QXRݒF̣4: 7"3 iM<(֑Yˮ+wv?Զ7鬦Ik׶:;r1u/kN2_Ii,BG&%3R5Ɯ{y*Y>}Yn,B)3)ɉՇMK._\_eoOf9M9t hG)! '3s7KpƫA~<70g 8G;S ] h=G Ö-6YR[V;O򤼀䙝}4ПI*G+6?q9axoE)i yf=-hαٗ 61. tP5 I{]XUіyR{ٶQsxӐ=t:**cSb9]s/1zH*DqZ ߪ&,Br rHXZQa͊HDJL\;=:pk#je$EjNi$e!Rԑajo[+&Nc SU2.DB>bh,Òi*))=aH6UFtGw?,""!A=21=т Ib!C}  ϣ%ktgU!QT&S+QUZFeDȣ̎bK[ JSPnOzgg{DcTB 3ݺL.td&_6N}>Ym~$ˮkUU- ° ă~a$#>AD@j{BJ"̌眽QH}Q4ȻoM^>@}*EşO<Ƨ=@kx .?i o$~ jQ鍁p h{<0)  .iR0ƭ #{šh/9:yh?U5* ~t8bՂuMu?\38.Zz1a}HC �}x}l??i? Po�~1~*3JE=5;[X}~f![+?]%#_a<|^bڣ`e0t! KA&D/LG{^=otIF>_:|? cݭSYmqO172M%U+(DMԀ#^Z/B^:.EVK"?@^&DhSs6Qx$CjA66BGJ#Ta4)ND!zh. (02E3}*P-gBbhD.$Q<m!%3D'-"b0#ȑHR& \#(0'IaqN@5eany兔p?-yE>JK IaYDhdHL%@$sZ@'PPC")BdDqEJ<ň?,⪠$rHͳ)m@IofLUib0T,BFL (,9! 6kNRNM_Ƽ|-}ROn,OĖH-)Mm) O3gd"mB\CFWmkPTftcͷ+;UF,} Hٷfr-j|E߶V^ZV iDSH`U(7e.w4ph\0@X\ s{˶<+90o7:_h}?a~f{OOQ+ YQ �x{٦�^_쮾_�_wmכJ;t @+X~M9y}GA mE"/5bjF-?n7ooqfriB /Ǖk<($obCxeUnrw~+ <;+VOQ󧨏{T"ʃO<sa/,ykj鏛UU*j�0)@2ۅ[טe8Q k AvS h:R`Ǻ2!Z2m@Jq�;KZ8/ۂ1)Q^HW SbbTWhBbG+xS``U9<G2#tQkPH*S *LwW]eYiIJHv0PB>P.*R:U$MP2$drI:^%f |g@LtU a(4P,HRSirDD=LM05U Dz<H,h|]:㒨V <GA9TDvjdq^)x@|щR`{%!֠3DƠ×@BEYthŚ_]M870*M ]8&zmRi2mL@ 1:rxpEl5xW </}�6jLo0@ @`$۶]:%�+uޕǽ-('伍\}[Aсխ~|o:fCV׿ zF@y:NxjލO~`KG_ 8 e�}uSM/P?3Bt􏭢Zj[×I/;ޞO KۻZN00]ayt#Q x ``[e$}$.'x_dHWxVǝ <-x(ck jG Vy_V8P'@߱31?J % r/1o]__Wy<ӪXw%FYD<tnxB� tKӊ%0s6>jWpwn0奎1ĚI3o*v-{WhU!6V :8&өTm鿅hEm58qOFеjbMe1-ӥB'$4 ~_k1Ľ e1NSe ?05jj:MEM@!i%`sg<L<Ai2MbNN (O t$UAԉӹw-U$РR$0 :4_<燂UXii]dC= fgCId0N`1 tg$B. @c [?"Q(U2S)SQ|RlӇ5?ILx TL#ZxU3,jaORWvLin$X.lHM{d <6i+-KY݀ G"N L((9XdHXƄ]XWi}֝rJ֞7|~{_p\ R_mȷz)YL(]nd}]ȾwtCρW?V\9> =&B_?>6U욇IqhwPϿC; A9yYgE⢠^YRkϊ顼۽ cZpQP>vo_b̨i0 +7uu;|@ie_�<W9B)KTxi!=i}M)H�AC]/jꓬ._pT$"*qKC�A 2ꢮhYXB9 L ]M6AQ&Pa~+r٥B7bxUP(̭s0MQ8ӢV"d~ CVa%`H ́`0"@ S}kBĈC`4PTM/kEq"Q5ip13YRb$3#{Ƞ9KWIB5:%iuH(SE U�$a�5ġ$pM@T9 MRHI zc@$dPI,#FmT# y:!&0#ׂj,PMpXFȞ'R)'PqdFTN-&QH6dۢHG 23lgH#\lL7"q 2j3uӢJ2;z{|v!9ƟN`>MY T]bXTE屙!Cn>2w} j L(HB]EvuE -V9u؄M|zA� X*[65l?ul{ރ{y@3/1w̎;F 8V±޶ v#s?:S>4/hA`^`|_w�x݁/#`�:^A7ܰ5&诱y~/QB(Pwzn;^7qq޶cC#JŲL(犣7ݡ]wWk>c)x@1c(Sp^BZImWw l7K dy _:43N3P~OYd$uoRFIkɕ.:o4?7VY X!->yo?7s٬0Qҵ,0&jhUT)Di9i�8hQ2%LaUZ-ZqL\dLӲHbN:!3 su-A҃#!bnʁB!5zfcc 3IR#5AA"Nh$yaOVls?D�@ dQxn.q:#?5.&2ZFHfqL)YqO*ՠ$N&HLQQMKjpz @SQ[R[_q_gX@ Ad"1 3B6,A$r\JDު+r#?pk\MhQm);Pn-lnJQc3TUw0-n/e{%((7*U]7eo k<i4cNCcOɨ!*xAW XLD]rQz*:vZCq|'<)"0 #f 1C+fk+</'L' IՆ_SH/ 嫿s\kZ0v~-oɻx?~k ,}v1@:vasfbp7.�� �IDAT 6}L]vtCǛ~8Â}yxx}~HT<װ{ l@ֈg.3ƍKNy[bV y-/~"uߏfB!2v-2;,WQ*+̋t=M<<=ГĴ&0Ѿ\IEh(*E񅔧b:-$^0 \Z H%مg'Σ`hq!rB�C s 4E'K-R 0!aR<JBR$51^D>=y.DU2If+J@Hn-GchBH$%Balu B(μ?0 G7g32" Rd&%tTE "ggn(G Gp rJi7f{ё U[dD�E)`R"#Y%hChDh(HCEL796?CH6C& %zA?h{G4fE�LY3x69PzC-Tanmb_ndڦVY5P<4 })7CZ*.W6<d٤Nu MC[~\u<A;l 4_G^(d!'8X'fԶd#"xDmWX'fݛ' q vrEO ~>ʎǙh 58໱G< :K6XMCA3]3l>]oqWnkf@+,k|qO |%~0mx܍P9Ppx!ncEP-B1F|eQPU9훆>?]a" 3 /`_bH0e/QF{> .N|uZ6q Ia OEm !D;ҷ>NcHq=mnq ]E)6* vʓr.剮6"82(ZS B 9\z2rqtAfZZhy5(P,ȑ%z2K]X1VHTք@遠R΀g!3mV-B#pL(J-`\CMzϑ6qӘQP(a@P %S(J-4MMj@sAD R$H d-*fѡI -aIiqO`z28Cr!1tq!! G�#DSg BR@P  dc@It{)_fϾi/ R66%ƍv1pҍ΄]R-rҪVK3-FKX6Wrbg , Hc|h0ٶ'eʇ-_2JZ Jq_u?V o/&_:u׎OUK,gSY�-yp@*l$CZz�>7Wm8fށnۘ jEd䫹l}),Oa�s_`z~6=*:P Ko?+^ዊ@ۆuV{{}OW_=`s5?ė+`Ə&yfP+3A:N՛ZrS2 yx(aP :p?x\ϟcģ,8c q x[a wUio'_-ʥȼ\5wj?<!7D6ߡ릇5H\Isp2=V0& isN@7ˡոZV?ބ*J"!N1RTR'H<`N6/AxZ HZ%AS $"Z5i) ATd(D$�]�PɡUZU5P(θTjD" *X"0 wC<*"lG tu"*�<�0AT P&"8Ldǒ�%$4pmPeɶ8"P1I,J0nX�[b ;BUHI9s]:9 s =9 T$ sGve%E4R~pӬ`6ۅom9W>pcKYMux+bu!)1 4 9J~m@*P7-m"پu:-HG>|DՖ+8,*,'d$Am]bc챹a&̒ROa #t>E 85~;L dŐxĪ|Y,*nEn PoSEiϰU°>4bi[xhqr�@ ΐX*?1C{B~�ۻ"ma'LWx .][ P Ѵ 8P@\{/$ xD~;TXQ/k;b~*=0@PG{b�BS' SE0k$.`.^ۆWտ?۴W}"je؍;vov٬gCDFd˂]˶T"]gMzdID ^8∶tjrox2yթu)M+*( O$U4@$9',S[ccr2=/+ NgrCx  i*} 0G8 HG EPsQ% RMeK&)@R@s-�<GI`yY<T1,()s3D2 UH9h a,yƾT)gT&L$"F33KK?WP .I5AW1zfg|11%S']"]FTa0bHf!9C`#TCB))#3b )AOIpQ<Qt7n ( F_}yT0]?]LīRf3ʠf\ 2k/y6QKo\?3MYc*8Z?d)}x|Ht'\oC6CV oNވQ%n= Yv6Y Ky >c`|D8/l OO;"RW(9v3"crp"ݪkD0ic+yu8$ b+;>+2�<SH c oYW/QޮnJ־`Ա`*c^+9bi7x@܁׈;e`�:GݮbQnCվ ?A@so# 0xv|u/K+L)ĸ)>Wp%PET6+,tğrseVmO ߾R:6jMg|4PC=:<"NR$ hG d*k"lU{YVTʪky^|GWSf\6S(ڦ2V b H/ B+rx>GSh;y<nbP$I>x02 ؀9RlI#]"4J*H 2DP"D)-HBDHJy,D&B#Ab]r$Ԁ5@2E"5AR(IP(r>DEDS5TByv7%�2=ٙ &"# "%`̠I|1t$ Hv EX=% (H gv9=<>F`4 +92?`F@4EFcvt{<|�刱"V"e1H]V80W[#;{lVE֑92Csr.bpn=eZF|)g%{2Oûө B $3 ==o:x;e@6q7yu.QX`  =DK;{;^ۍPjħ&%\KmjR+Ú*�N@){ W'm\+z`tD?k_ WP 1}{7FI%5;~ РO' %qj�C�+` n4uGLoP7 ?;`.Ȏ;UǖLq3]Vwޯ! ^`5P >te ЊRa}<U[ցCsBj0R ['U:Vc7C9aKcz-\WtD{I>U,YN@PdȨx6?wQIip9uuS뺮6V̾G$(CE{(ra3ue יIz\!Cxa06aɔ`(! (֔ �3 `JJ$$*L I"t•GHl%ٺ %7@_A"EI3>  K2D&JHw#3 g+R4d0✰QM*)TNq("!) Hj`dH6"0磁@�)L VY>Cz𹼫XUjB-'d+mW>"aNQ3D݆«1zA|e}_ԛԦł=t4 ^w?sè<} yuRXNd3<~Jw}G{8~9U}Q)ԋqg +$PODŽ'իK _.2w)m:Y]ëQ6ޟN0+Б qc \r_7~@v+~whëkhY5?V99/��o\NCU<m#vl_^/6xYЉS^_~y~�$Ѐ\3hm5b (]Z_4}TDAp9]Mp?P 9� Bp[QʪY81 8k=xҞ/}|h&{rWjzXŪ@|h"cUri2$bH[S ͍MtV4yݘeUdMEDP^''bOVfQCQ78HO>" )==#G`ZhPMt+iz&vNs}Q"K`fO-@ H'!%1A ֥ b,%SP 1ADԠB!B+fVLHQ$=1{TALw97 R*lH5-2%=! :JR<,j/ 0rΌd�*#92BxVjM|5eh@xt.YLRDD"RLFA)R f7<S` Q1( J2",tUh*Ih4=f˒"2/(tHf(2ey%͒3版s73[]55İIQ c $G:uhj0@&q!$h-nKpg~d眈V#7Dq, |znt 3R%FGo{./??jE!CƒEhfg˞ɞMDc?feYp0㳹}i~3}s<t Dޖq ͏ikqٿ�pX4ekR`.@o0 F|M2/_!G5 jJB8< :AO.whq7.lN޶:ob 0 wy5-6 `opҌo�^j'l{Tvȷ`�giE�~Zv(A/T|mWC�l>Al -rA�xɰ!P.*DyQŽP^ nh'sGwpAۣ˱_ߊK[o5?n۹S@tDC>!p*$BNUM=?>ɿqS>6}acOQ0FS KR+^ᶴsyTPCr reWFu#R}`i]<)-/PqIso ʄ14M& Q^35RygZ7^ U0-g IAKXjZ¢B щPZU10*Eh&hk"F"M(T!`taբ聞Rt3j>3$?DbЮV!h0M*!" t™.?H"dz'pGP{" B(Ibd]K0QP$EjHtfK2:xz`T a"> dTd&<ώ_/(m*>BYI9ήgYNyT@@*-yRCrZ$6`qFC.8F rN| >b&s37L~ײmujIWZ-~1ߣ 5~r@ʌxAy*q%P~ 2a)ef %u3uk#$o�7C ;GZ0+1G&6-O_^OA B8?w-&y ǘal.O?sTBYu|W-!p\o>9}i7_Q??L [!Bb 83~ܑ7a[`ˣcyƌF> Xpn^�s@6~N{Y)S/i* 'oecF/(nL5h/`PWtE0]H ]>:R1U+fhM)"#h%`qazofV\9Vn'XS@h;m)"!1 Okڄu\a4"kbXKU)RjY Z`% Pt3-3AO.#HA7i$ LIi4H*Rδ3n@# DXdR E Q@Hψ*R @MMEH&UHձMciFvARփCN+ZLb|CE@JH;3�ǀx"ʌ ז%a*�R<%=5\]$W(e݊+JCe\԰$z2UN-RTCAL_YٍeS~O8#`kA[wy*`= m=(=e_4l =W©D6s,KT ؅'(mie{86YvQ7Q5aE!v+/}; }i~~]RKt55ZG~llȥ/)ݎ;5`R#`cG[+� .T4N r{f ̠׸ '<(Wx0Z] O>O?yݰT<`~ zA3,wOw\A0 V[<}? +/P 3aOp[+ t -ˋgb'7^71Ky_nC,fl&LKxfӨXK48_%^0 G͏c}_꟨o;qc:-5r8"o+/*˛}%4's_b[x.�dڧ 94IBVS@4 7K2{Z g- x#z)e٘V@ M2TfZPzAJ212<�[F3}`6J!S$ A&],EFI% LJ%EDt83@2B" *" f`djXJ!D HT(Քd)Z,E"btb�ϤE<VC!q0EId�!D$|s!&ay$m!�� �IDATH! \<-9HR t0TR'@"FzAhQ4DSF2%BR9=:zgo9'Ma3*1BxyKme i,5 )܉PQXjg!/@xn&Ff#޷㶟O 1)<g!XFԼ7 %~[ixmUNn,Q]YsVne&"W&K;[l۫m X1`)\ҭNѯ#O �*6 x &`F%u;S|_u C|÷ ^Le@ˁ\W95[<߬kk @�\N٪jwn|ܕvvۧqZ`Xꞗ}?D{ޏMR ]MhԏQш $qρF뾱<Iv'Y96?@'G H{� `\}=\~ZYl`+8k xCB;DV媠pH ?Ā ltֳ>Nj=K#WV٦LX$<]$9FY+1AMNX^< /ֵ te؊h! q.zّiZ!b#92veFd#+W%NZ%v@J*+QT )NMSU1[Ḇ Eq92#==2Eh 0,LPNkaM RVj '$� "d=>(H$ҵ+;'!La$[Ub:)FۘD"GeXjd"C<K�)EԴRB[MR)"!H E-E3;w#K,֋5]bZSv%YӑVԱVϰ|ce/e/Sh7"olk^vMweLY6NH9OVXZ@)jCfϬ)7m]Yv.dYIː>[;'v}?#$|@[Upg_xsy~Vz[ tP=ڪ}1$! 8ak@Mc�zu8dvgO#~w˂}G`3�x l-Q+�\&�7Vo^'T\f)┮$7r|R4*Wٍ◱Og ̆ H] .1qǕCh(=WO>}-2!D ||qoz:0ט\J>m{ix-[:R@kx e+VEJI)lCCD4w|,㗕1PҠ%'[pZlt*LAzxgOb*\Ld-� dHFIG^q'RK[z$%BFfWE[2DTAf/pFqNJQ4d8=4A/ n<h!HG$WAj&jjbʬDc5iQP| HBEʄu+dD`ɚ!�1�d( *T|^ sQ ]#`¡D$ɬDJ&aif*D$ TDL 0+y-Jd1V5RE0VtJiURRBdD{(ƅ "f, ćf( 0%_d$9߳*jy9 wXVP8.y{ʫs^#A,H\PBtd9B'7t%qN&&j<EJCZ~CUHØCB9tMd}ڕaGOb�RJ fs?Wu#,u�$1z=Qs&|:N |<l978g|)/jDo[ON&ww`€91  p0p|?a/ט t�kK`§3.8aͱ}GZCt(RglM"xG qӌr}l7-d/̋2ejzgWM#x#q"6u !HyP?.Uog2ܸޟo zR/ҎsA~V-F;K?XJ5>X,۠z-K,Wv?oTEU,"[-Cf=<U`#=8ʫϡ9%UP${kg<k)"g%c!0YBvQo2 "03{JDB$ ")&Q]c�.O5)"jMԪ ! @BMa()�F*ELD Պ `P 2RbAc[ZZ(-f뭻A@#UT+ӰQ) fT'#*&!P DC)n31kZ@Vqcmdnuˈ)%3j1 EI1A�%@O#B@E\qEe!&-T)ut(7wT!p(`qH/m,/(R^HeNbdh_gt(b\nu)t[Tg hhܡy\".:Fx%Q`4yS, S!=#Gk+!0pX;ȵu^P ,!qߧjQY Tr;w'D&^T_|hO5�SU|VQG/ ͧ %>Wx^([[+@ n !o_�߇2n9Z;7wc�ē+D0ʧ27Eߔr9f=\oӥ*sM?݀$2'K(}x*&bMv7!o8 K0 W?nk%o\xYi\B26xpঌ=|I s'ؒmhZDD֮w1#X5 0LB6b4ig]U~R\idEF"2Ov%)yv v.21p"(c #dl exYdG txFZ�tf� ˙b1RRT$2n=(ղRuJ5*YfIL_{k<s$=v ҉$ 뻁 *L] 4x'WBIA Jb"~!\UNd\= YR W ]ݳCBͨBNVs%Cj\oz Z>X!Cf Z+ C}4Rr~LHf�N]ts֊8Wh2Q|Xkst>ƭ"#0{pE%TAc۟m| ($&mWOZ'kf2E g9tE׬'`/cQW>¾ax^_¾! mI‹Ccu@ Pw ُvUN(o](o'8R +ʳƟ?-SjC d}TnzH` {} \CbwxO\>O <~Rnnt|K|~oLYlOwc\U r6ߎ:[O4z@OmKf`7P:?S?,S˩_Ƹ܄N3(<!Xt__,Ͽ�\1i*1/Xtro_~I{-1vp삊}&8_ '%@Z_j6P־(,!צQ^&4rxZЩKL*@ !2TN](Fn9e 2Dm'RG19߂\*')UP툈dQD6Êl(WDOFA4%@! ZAɪ0IJLC1lq%a 0Z$%ebD|o$ d$0+�$I[FQLA&e VhQ&1"L+�A DLBIXc=$�IR %Uá"C-)d (0J)Eʫˠ"UCHYR XƐK1dg$GdOkGϐbN/B�H+ S=1kQã΢xA}9lFqOýAA4(d\!H";Ix~5VU+ #gBݧL=xv6<K--jG~| v/Wm}u<V[.ˑ. Dq@XX~on"J M]0==_ge\6赜;}w;z{`ҥ4/9K(5O@F~~|1hEJ5>}vó Vw}eK췏b2 ^|6c~\r/QP){x9'wZA;8z?~7 a(gǧ~~n<HӬX$zޣ/P1/~<jZ|7/"0!R+5o=up쭌^}z~K})1#kE@),BirÚQ1?{/ϼWoUo0#=m#-fZd!)@szD@Zw+mdݤ uNs07rJ@ .ёm֙Mx|м7|9Q kiR k0挘 L-5Ja"XU1:3V�4*EQ /L^!|F)RUUQ Ť-$]ƒĚр" NJLzR P" HE22�AFR$e=++AдⲦݭ&E5cʀFœN/#2  @$5յHQJ53*SKme)� o [!Ӆȑ= ѝ"HA2s`p}"LcT,6Uy:ۄeP{zWُ1r!;Δ x~UKӒ{%Cz-b;B(%J 46 -[XOI3X%e'ѳ_/Fqs_*i 4<&<6ˋv9eNu1ҽ޳.5KC1y �q}g3o/<1B%[7J[3A1gġ][@7YhO?~@l`q ?K Z.^= D>T$yԿ ᧣Z`I9 YO((g짬?v%ؼ@tx;Agh3;,N0<OsGtQ\c;/K\RtS/!1 `.mw�OB Ąʐ!Jy9VM<هH*"TbR̯lRpmk3hϚO!O`l I# Z\f\TnnXD%Ab˓{;ǒ+Ӓ&ZuU0LbLHD怈5KQ3"5\JqlU,sbZg&>uuH�S |f!fjH-lIQ b V5Vr]F�#֐ z WH@I*3k7)L%$+ C!"CcC%D~ {u}̑ 5ȴϰ Fza S)a&VE5PB$AEw xZZ"emehR P M|H,!pSڐ,t TX7ԩ.??DgH>: }o,[ݲ> z8>/=I)tn>l_<`[QjxS 8uH AO9-.Gno\=In_`w}96Ƿ %.�߾ȟg&1RHB\r=GnMFDZ:#p0uR+Aōw#1]0p5KE͢v˛VrR(u{ w1Ì췘fAln;|~ӀcN0G Xn7>p l:%iH|c xǻ7.2SmZfPgS*5b#/~nx8-MA5- DrĂe'W/D X%d-Kᤓ-{}SƲ4KCz&1mQ%b16.2unD!SQ&[oZjY 4k5c2&2KXp2#`r,Z1<e$" EY�U(HHd"zB wS<5<=PVjfU3-&QT `EEHf"DR( L! FB $ҡAYN@!LJddJP b)UEHwV#Vi\]֙G~R:6F823V[TUEMDb«Y|0IkOiAfŃ'2 `Qؘ%s{ Z\3eì2@!4B֔% uRdʱ:FiND_4"iWߗZz3ۛ|ڏQb<K+AW/Ǹkׄƨ1&TN`74+ϋf i?7Z@7E*w , `ǶnN. v|#:<3˩VD<;Ggu|[:#>pNj )g wI[/�3oz3_=i #˗QNMp*c얓iO=a`7gQp iAiiH@7q B W 6@[yR6̤JK&Ul*n _"^x{rQZt\3ӑo?p`&C�Î^eRj/2&wsf/2? 57܇1n\C4cGAI&#z\L;F]9v,C&S7&K(4czI7S*I TLJݺFJIJ)ʢZ (Nf}BCkE#\e-C7-R(R VT~G@!EaBWP"AɤQiSR&EEDVB$m~$ˎs="#YU$"YM�7� Z$�Gi#hKkCjQ Nŏw^3ީr{9w AA�؋+1�$xbHAFf&�PuPT?�H1(Ig9|:j'@PqU;H"a] ?o2("u=�IUQSJ]~2 1P� -친*K@(8"ӃIy ^\@ iAsmf7:27YnY&`brd_vU<U[?ܬYbVs5Stאt"ي%Bl)3h &OV^ z{8.~YE } \kXԆ6+]]p>�o!dړʼnGs9!e}+Ŀz٧AsEO�� �IDAT L*><a/n{;\gSV̋nvs83 ^{,`}7LӷGhx[X}o׉H�?Bu8^br?0+7�83 4(F |I&F+5+3p,ĶyM5FIQqþ] gi\së.EnŽ~A `&mZbn+L%Q4:,EΝd_g_N"niSRS,+DC&D$,3p׿&?gumӚJNK5+Si*1 ?d;&gv^KO6%TcI0E6LH+Ds 19 tf0qs" vV""A0 0ʴP9332%ጮu%;9 W0)R2"ThK!4T\C8+R(Q 8UC-"d2^\>P1(f#3(X�ġc.v^m+],ePI;AW]H(B6ItA_KFz[33eº:C% ]ohh{6]zBFR SOyJ8ZE~ Y� y&qZ2;p1s&dim/twil8^`5&~?`/EKloy<zc^V;8PAbc`R L]#ǓQ(ʄ ⦿6C20ċGf +|\-jj3_|V踱?韯3Nuv91AI4ηY+mXטOৈ/R3HaWޕ6:UNϥ4B\d-]"h]qdil]&:ZmrZsږҬT:PX2awݟ\?nnQ] 8SQfV5y9DfQe[!O S t/ͥ2o'1 V$4PZg]eAM=gIhdbjUO[Bp 127ČH8!S; t)J s2tAS,wij%Eb(",kIbLEtHx1&i1%&쟄170e]W"%#?$  !U&"j*�Of*j"\f@em%1. >VCj@C$/-%[o i8 kH uJj0%B �)"E;S7X Tك!K:@}kXzYڬIr57hq=Ciw[nStAS#!O`�%{ +jY>Z6OS4>Yj^ )(Ұ`V۩-޹LWWCCrmv:?N8:at 0c4k*vm:ngvd~͌Mګ}z I%@7 ,/}|[X@nM:8?wRq/k=\ cB Ĝщ%QG>AD&)nt32z?B3CE4jO Z=dKŴN|noGޤvj%-v%oSW?klUviSɨq_hBDHj*3'nY)ʦh8)ո"=\%Z3iyRn $D&Z?`~,vfª`*Ќ=/{8IMܫKLe/ᚩc"%:; fk6HyXDw _ l 2HKS"u?:AL5i0A U*T d)"�L$©fH*H2UUKQLȥoG-Gư :SBP¤a¢bF$ҁ\v\W^j"pCOjbb #l`GhTVCn9>qPF_tj*m=5.8BIM%y!X)>FJ$]T!nY3ӖPY7T+p1uл;U2O1-%Te-Iifjt$fCTaCPΎ.}:9ƮqbS^}w.".D:&D`y(yWUb~J?y7=pVG_ CqU܁]nnj߰^viOW ڀ㞛}T,t8pZ 8�n]?Ry_n<LTZn*FObSao /3E[( +Q-V>vprYJKH}[5*9J@Aɕk${WmdR4|jtDYܮ׀CԂEkb[efX"&!̾6Miz,zWyZ}1.Uf1*.NgڻudԺWX쑽Te~oRw5ȱ@>J-J_]:s2*`vSM6$Ԩaa\z#0DPR$Z"E$+!{Gb%*]fc >kИdQ-F1jTwQ(aP�’,PUL.sfDdD$H i}ܭ1nX%i#OԄhB"#3\nL$G0}*I1H?H2HFR(cFHffDvtGٺyĸć.&``tk"ӄuf*GdЈzDXUꤤ5ErMR=\0邺K[]nX:^ `J3+#ۺ7zʬ E+Հ@]1o|^ E ѻ tvX?h|>1sY*Z}*=tg}zf@qlOÂ. lP|O\;ѲݣQEqRi=qkZ)bsYZO[_�7:Af�X:;Nǂ|_۷n ty$El);c)`@ n @k88lL[9�g,T AJin=k['NY t'Ki6wJKO$l9Csr-v{,]&`m,TpF8 N+ٗl'nR0D9)vkᢛNuL6 $֞kF+Ig;˭M gszqDS׌8O=% ]NZDVʄ&G !O"u #UHOsSNڦ41*Ԭ+r!WȹY4'+11'DUK'ɬ�gOA0C$b#BIDa Ň)J1Q. k_:6FޑpOxf|d*A^:W](I  #5:Xm v3DdvPhc'7 !C`ǰ#<r)&d#l̀JWfGe #l!Q)) %lS32GlDJ h+'!7?ܝd=Mք]QOxU? 9od&k,в+˽"8C(ۃW^?xJߧ~ǧMlcoqz,ӿ; zy__5\L](7bP>LzKx>t�^oV$u@C]smm'-WEUm*'_gB<p|~\Tֵzr �0_oӗx^^M~[O`zX�o`azjmldgkl1t@^ny%O:?~ͽt)Ve-Sj5h[vW}hIJ X;d]fJttcTJVbܸb$%  r<Ԣ[ݤU>X?D[ |f-iIJF ,<xHOhSTxOlXRաZ0/-IQya1V�xd87i)* !@$,ehjvdS1-d/=JG;[tfvJA'3sNU SbXjUdk�1KN , sh1SU'9D"dJE IPՠ` AJHޣGGA2$crl!z2 T"y0 Ղ*)}">ր.[$3IC. <{R@I`#QDr-xU�;dU 刎HtT K&Y5CJ*C%T&<P0}N,g6�/(U, �9;!M%xB;B o97!rnͰY R\3e'õoNVޖݛMt;ϧ|Nj j9HMF_&?ЀqCw_/GnPA+4a/b&/T21i)aY4np&})/>@>oa{O׋>?af$~+ V�a}=NiZOi-tj|ӟ 'h=u[=*N pz ]V^^1ڸ`!B=,U*Rm۶J,i.sMP2[IittF#I\^+.B^p5? A")C_Zo2p;VZQA7&R 5EO5riI}k-4>lMrRDEy͞##3C S RWB b%&rȎi! ή~tn:`if< &͔A8 O PFXdjF-3-h"$lE%dpPP5.D HI1rjGP$P1Pc7wHJ(16Hr58bGgD%ƖIdKf`i<)9cUӽED �tƉ@^ESCjWч.Q'>pfݥcLͮ*!=%s Xf/2e}64Jk;ʖvc/yq%)ܹ z|P=H3<L0(w heA^OK]Ozl~mׇxuUy HK,ǵjYK.OQKFVX+`LKGHh-vI+[_G\7`i,C۲  6:KE _.x�З vcmmoӯ[١Q3rQW@oßul7Ȋsb}?q{Ȧʺެ STWUɓg?i'&-kŽuCCID.b#y$ z 0rS&ZT`bQ2]ƚԖqL,3+􄂦ԭhhwd Xahn3YJE򤱈S=1Sxݓ=ӣg'zcv ,gMBH,MbH 0KP <#SUcuNtvI,P9}CQͰlaBi4dk-ER!5NQ!&A|1 HFdhF2Z$Аg`UHm#ʛ)>ZK#C`1%3FpxMA4fiffHv 'ixCfHq ,Ɍ!X+h"L %\} 0a=Ȑ@q)=#/4qWq1D]Ȯ4S3I8 jXR ,SE:ͥ.]Gh&Ύ9HgK#^[!13D:Bt@>0#W5iw-3wD_3P  0fQ<}R>eҔ΢;j \7{^6prα:k5 I޽E) -qgO*�/mνDz|6co[?ë쟿?Ą04dz36= +0%(ǻ~/,尶;:13E97OQ;Snʾn_Ǘ8|�tE>N8wMUZ+^&"&|0}h}w]r lo$lzHk곺R(nS4'"\M@T&B`8,]ŪG4q#eZc#14Y4mA.gwZh~Z<M6 6O/$D&02 볬AM#ReV$ AAdIR9�9 Ix17+F M̞#ZF? 12Pu:hI`(,#B "U{"J@ĨPa$BSY &fK qMV"UP- R%Q6 dG'i^6Kd@"ǰ%.oF9A0"B01?j H0.~#RMI(!AC0B1 Lc}B0'}2/';dCx'0@(NMP Ih s$&,H` m`;F`Bh hvj)Cky<=X{ZYnGwʰ\0&by."�].{Q䄨pE܁리R`,VJ3Y73_-;ז([}]o!۳VrK[ Zz^1g$om؁UP ;ޮWE7yn{q`N玶`=qϧ{o~ڽ5P7(?bxr eY}>ŧX7wi/6}3#~Z|= L<mo0/cW5o #7�h+XaWyl[<~>v,h>B y<8iAԩV2(2˼`eib8f%KaQRY" ,aPli[YQz=cRL(�JMjE8]Y׋+Ħ˜&lRN!TOsZaJوEihsĔPf!acC3{1_-PLIX*@D0)RèPxaB7#NӮl`kus EN-h Rr P@$X)Z\kQ(�Ha%}l)yFhI(@La&UÐ:|C110GϘ <ґ17$%.> uѺF(TDAF Ec|`\^@Df'qɅ!iph'1 D^DU̓2nL"4`)I-bw2C]@IELL-NLZ3!,-(C+LD*ٮ(/�� �IDATϑߍxhܼϝkHa8V)U1Y;bex[QAGdv=H_f}ږY8⫞[LL25e]S:k^C5_7l&(N(>^;aGxRa&h 9Խî?A+mXÕ10X#/g %.<:nRZg~*|<LDSЇum̌E @A�Qч?%41xl+@ίqswg*%T| ;ֆ? [lت'OMy,M*Zj\QVp )b.x/4ȮkD5SK3S1J@ZXk,1G"PRʨPYK SQXu,,]v΍HVbx0)F"S� cwb]o s8EY'+چ()$!hh GA+D0-U@'Z%AM( !ҧKHu2߁pp{&b}<lP*3ղ@`IRB!b)xG\4VBGvAHx@j+P�5[xAGy<KX4!-Փ@@ C&UBaxt%̴BUB$"[6aW.h'x>.ƊJQEb' R IeW!U! g GѸl}X2#!D.YlV5wxt Q Gd6l  J\pLn '}]<鹅(I$m-u􉩲&CW$^M3>>Buӑg%*m$]-R%V9~&,nKRkn2sՇ -e+P ^rmNX>g\ݚö'a2íl^֌ ^ָ}jQ#ȧGiʵ<W<dCdTtSnmޗ[!npz>GLby}z�K:c釿3ZS%^~v�臯_nX|-_}_Ngq{Kİ;r z A5USM(b&"2ZRid":E`[d)Zêi;t(TU24eՒjHP CW�#"-4H#{nTFuC*&B1@hg. [3JtE4IA|`zٵ&+@f( FgN. 4fSPhIbAhFAM0d$ IKR;Z%:)ĸcf7D'c8  3�HJJ\$.Jzw 'hɁ_+$zfكȴBINqS;5h�PS bn!X3G蓎a2H2h|D_0鑠%9 d.yaҙ@S(2"JT. #ũDcvɸTYO`HmZCI=Wf=3zF&[�+١TiYJjz%PD:[ZsMwx%ɖYF6AST^>:ӿ*[agh YQgSW!؞,kk%q5a"?@cϙ;wMW(r[69?"O䛭,W|傂A^@  ?'wf׿} ű}�8 I %%@)^32NWoOV,Xx-k$ccX+3[ �nE�8a9 Ϯb-VͳS4|}Lz/;7<7"LfQU%*e F# f@4Ơn/\c ^EB3tQmb{Yg)dHs>k/=V ʣ?2 YC%P7,Si9F4,N)pCOIUa )[OaU0fReP*NT"dz 4 @%F/ T G!{'Cc r71SHb)jIaT܈%dG'}!uቖWY-^勜Α Wc#Rꀻ˘bsFؐrfs3\.S d0g0E3s::JyuΠfBLKLLpϱL2GW@<ˮ2�` R&bˉIҜ%Yz'�>?HRb  &8#غ4l*Ι A'uBW4S4 3djR4I!ϛ0_� +Bch ό['!g[Ԑ Rxi*Ű[b=i?v>VroVM€iiX�@G�Uqv}iaX/EެZM7��A:7["/x:K{膱(�[cU :�+飭wjK jm@?p�<O'lݖ}rrA%- /ߢvxDɿZ(g# t50*~Sė#>Ƨϰ|oG{㊯x/y_qO6x<qg-p/72poߏvxp?>d[F^JBamhZ0we8{()bd<!E°a%*u�Ԛe=Մ$ݜ c0RhQ�NX[ _G XI4ԅi3=usRβ/YCIR h. JсLe lcٓKBf39 *= WfDMൠkfeq8Iz|1m�rlI0.@JbW3F&I Adp7iQDL~dآ蛔D9̊IKe 2JHA@<0 `Bg r`6: ɒL$1nwc=%[-NrAT`u]ZSKfuRI WMᄈP04<H JDf` dfn/u^S3&tK/rwwKfT ̑#0h̭X 8 m�۰$uS K@GwY ]ۏb˳ffBF~_cJ`^^e;F 9~! FU�;+D&C} ȺAӱ{a-ܵmoԸBPq_[u}F~_@Wy95_տэ_ |_|oX& 5 a9`yAh  |qwvٟ+aSo+b7C>zmWZk\8hiXI4# Lu7C}4">61DoM$W#deh@Pb- E:+农PhT驌b/R%Y"Sbd1Uq K(PGt{ZQ{s()ej)m=+hr 3`JDI` @e޲W4�kn"cOH1`)jQ!S@ ${ʃ2F#Vl̽e t#Ɯ+)Db*&sYd2d48VJ�! br֣DәEf{cS($$"0zR9l:iŭ3@&&jp~`S!ѨGn="=͓ӌ703<'MW*ۚ9B,gHz WUEyb1Z0,4W @nCb'́D^ i(.lbP^SͽtA=sjb~n{+i~"?h{۸^er@R|샧: ;!ToǸ/(v*=8-~gs$e;}=Xoq}A 3  C]Cc)$ 7%@z"(*Rz9 J~ ?UgYۿEͶK"xmtoXX~O 3,7x١S|B͂JT<<b[IlY=v�^<|(؅aJAԀw:ګucAvٺ?bF2?ˮżl% m=Y8SdC*TK`K+2Kn Sq>f-#F$o=ܪ_(@ Ӄ9G L]UVA#N󭕝nv\RŬNpBe ȑ3Uk6:A`wЍ‘a=-(qANpX$sS+5_D2 Z 6$e�b̢4pEU(gSTŋjV} 0eY$LTBOi %E1{1 R[~!T8!\gDHnpN}r6f"Pgfuh1")X aQ6L>:^Y˶W5LK^ u6Q <Syg^ bAAE BWFhXt0HJUXrn+T5i? =p÷/{,vVX!2b�=JW|$<&0 Ɗ2{0Gr{= W}pU> ;n;؆r@˃.~K zXw}<}>&/9w[�7;bP TT7c~cwN]G;^GA6=,ޜn,._96<|k:64>ky͌÷w7O'ikJ<|-nl<_SZKpv (Hh >l<`wD[ҟ옆_o{+>G= = }f 鈀vV1o8E} s} ZhncY.ccEd_58g}^ ꖴ.2Ex7Ӱ|<0;h5y^Q=i{g6 XL 4sH yeLu5B q�<UFq0ކ5L\ײfF`K~qso2?Y FԞV tAUP&[^13Fiw]HX 8hL%n"Z8@fլ�bPZ?< HSfJK!llۨ LY.P9-1`y$5]/پ@ nRG(E)⤥W)n#Y)VK-̉H&[)%=T*cW4!zT0BRL +E,f5}#9)#(f C!r-*A9 F23q#n/Ht̬uD6byec"F8Q/h|>+Ȓ7%Jzk(c5]> ҞḟI#e5]'{݇[5^oܷ){ԟH |~0];!<|0?P mvKzu VX\Q>;ó}RKpl6>ö~xHG/`u}1{Mn&Z  Dz9PV ? O=q.؀!>[mmXkt.0OO?ݛ{˨j-[˱#Tc}rGkG +i8 qgT-[j+KUۚ]q! .%]7ī9YjHp?Ѳn=x&VrA-FqY ZA10-JE9.a(۫ lʃ{f5D(2iD߸ukgzIk̿!̔~h5t0sҕCf. )[1Rf^4<YLo_T\(s.#݋_WwdՉLЀVrP dʆOL !9a7gF 7 Ji!dbq3 v!_LҮiO�f(g®%#gfNW9B9bM$KrHI! AO_b*+JLH!5zf ;YJD,`Z)]΁.IXE5RG3fLy1#a5|yV$:WRlHngٝN `\tg_G7 @ߟrdk+y_/;P~]6n�HCOmQxn"nC=ooP|=Un[^=f]?7ڿ}`G~u8s!lu3طChזmגK6f{ZZpޕ^3>v>'|bP!ް1| l\ .߁ہ6>|{oqopJi7R~bn-}}6vCUatp@,e:>VPIc[ L֨%HO~ާdh]aypk'F0"c F8 ǂq9kXq&`XV,-+Lego<6m<!, TUZʩs,.V`4qP"*u;' -6 7+4HgjsR +Yt4A3s δ;:' t$T]YC$rFW|O?n^,0K uP *Jf@6c�e9Mќ M*\i3k5)r 2wU8'48͔.咙 el W" (XPL<ME9܉<sw-j!1kPJ9SӼs]+##"sX&%9|r5da "Mg5%!><{. AWYdR}B2'?2G RqWj\cp ]<TV\(>q~z[y+PemV TAnq.Qퟲ<ă~W!vݗ{ݐ cఢ�vE5@A{;?n7'`CA0}؀Zwm~ ,O7dּ@iLh,zR08'D/X|hL|÷||xPq Q;xT- C<WG[G?ı|7p `Q\j=v}}f? ?K% �gҊ wS΂]}0@8gI.Y/luT%E~mnK|Uh2202)eז9,ia.ҷܶ+7Y8Qʺ=YY ֥֡$aL,]éf6&9AEh*)U"3a*ʍ\T&0ϵi,}?%\tYY8GHws`YZJ҈yB4S#s -cT^f=j':4R̠\?@$sgb�4H6rHPO<%e쑑ttf&221}~;PUddn90I2)sjE�� �IDATF3G:}F439B=Uht, hYLܨ$4dcs1BraR8=>VEPLTvW}'E\G?iȊ.am+ϝ@ : б@o|FèG(wR{-/[|(f:n{�k0D"Fwݎڞ|Xw/G�T˲+\/#[66/Oa}c6~dDzK<}uU%7{ԦͶ۱R0z#Б vG ; C nۯ>>u+mm ~Ϸ[?aU|5 ~_"OW![[Q- [zWɰ =Z4 O()y@e9+owHR;L mok !Q5<EKZ$-k0Eth,.ra�O+j沙RȬ`ҋ Z/hvl±J5 hʁy℆Q驴IYX ŭ`$5g> 0/X3CZzUugsa$<5 #颥T]},e@i86VD)(d.TLE Y `i~>$@ɄL˗Ԙhn&rT̴2Sfp 0n`b=3B!LD܉Ke|d,^B;BBW'i&H,_Dr 0(Ft9b&#qV@U* :%?>~(Qz0WHO""%c]3@<-U5ʫlSk|<=_?a;PUw=m> k#>1k8FXp/-C[[dך=?;E opaaVDI01&7�C/a�(ڹg⑯D VapeG}J_3u[~Ԏφg`(~8 a?jC8yA8jEo';zdq~�[ؽ)O}Z n�"o{<J]�!wm? Uhh_߼ult P8ažͺȰȝܚz0}l]۸n\Є]m1cu9dq1͹lP /拷Jk2@큽EVk[hy Ş(AG:lI@f!O;px)K7HuK ˪y^xC+Vg{6E @ݍa LgeiA$d$bBF-虑40L6Y,oSo60"x&I>qX'Y]/5oS<rV�4MC"R44MAe2b~r$fa8ʍ` T1F|҇hwȩ69*KH'fu)u -#9Ls'='HAƠe DzyH T*#QS0@nbQ&2CDW2z&*7ޤ>sfҿG?C_`>ֶ^ox9!\ C~AnE�Zu'O>[r=1 (,:a9l;)n-K8É>r;|V6 OO/c.|7 Iձ.X *հ 7b[[G^ oHlZvy;рmt7nJOxG֎wZP_1J{ӑ@B} c@{ ԇFs?t7m9l}Aw|H/=\P&gx@9eOzO{ۖ/[X-T2,t�L`af:T<V16HaJ"bv3ڐ'wJAMZ PP,B3tte!%-N:sa(w`AdVڼ-^KY v[Ov%wa|)՗R K&G=CԎ@a!$|"x #X!+s4 c�a4Ue!Ap%"E*mzV-nKu3DK X-' YvTtM ӈa&!2dJRzu1Myc;tZqefI`6I)0{zB+"\Z$)9+̙~mLȌk!2't{r¯ mR+5J\`#ʂCfs;TJsUHg%AY܊{1sړJ y2!@!6d1 9P$<=&jYQF8ͶNJ(a6[m锉հ8A^So|5 $yQhu:ͽ>}Iܶoo/ﲜ!CnL ;s~j'~cl<~xx K�XΨ] pyMn'8]iSy�"{$V#?  9l}mk[~oω]E~_� _p @np;@8pno>vxx ωu_8ցa'+ ~RQ߅qSd]kOLDѿnyu_hBK̊Ha7 ޜ Đ%namºt2j;sanlghf`n{P@~yj0Xf423*62`|m3ti[Gf% Ei�EpahCfHϕ! KLM6`~|�VkmWJ-b2 dU6HVg)##G/,fNK�)13ȩve o&m^RWFkN*rޙ1^w.yך9^jFc FdTr\W>$%~An3-&CIY5eKQ 7gLepEܾ yB^+rm0rDqd Qԝ(eVO4 =h>.Bg�NŽ5UaWp밪H|K>}~+ ެ ~Kr.ճw`>hiެe!FoP[yG?$/h66 .*Sx6N6rL!AؠGC1qRą �7^!Є'^)[8=/J9C ߟGv?A/lo:�<zynh]0t/~ C LH5 Z[pڀRs_jnkmwxgv(gi6i_8 p#m_9a̸ }*S:̷ʏRݘXݑH+ s)QA3K+m3:9ʚYEھdp%ӔpdQtO;Y  &/Q1@c٣j]RK1(J-3ҕ@8P5`g5abȶ:Y܊PKZ�"ᨤsWURZ[V+V3kH&ڸ})+4q'H_DQ&Ze%h,i. 7>OJNo2k1}D�uh@0IBd8<9B\[klwr]LS f&-f(6k(@ Ҕc_ e1`)dĚA ]pTLX@CWp+ȼ*W+UJ!$0ܦ9vffb%靍G9 30 )aU E2bD.1'{1>Pŭ|C>…pSE{V&.[?t?D<bqtC~g;뱜n[c}8<-/Rx$GmJ̟eT=5t/Y� uQ $6ò�� lv/S6Tt)c wX ~M_>Ym[oXv(a#i9/"2:ə&H zXJAK/Yº .1(Gd3]?23"{yeܨu](jTUdw{>@?w-lGΆӷ/ ipz]O?/__'xT:yz'-{p,w x?ln7os/rvk_ץ^ Y4^Yq~ҬރC>5F|ޱ hf0Vaƌd W4N.3pάi^ݨCoD WRZd ƂU3B% `&cgI,ōuk\/Kj^$ >rF2 uFFc)==e*J1SVh"-Lڸ}S,mSfe)uiui^ÇFxއ6B9|cD a#-Sd 7<2�4`uss7,:hͦH`LC]yBvpʤxyJ3s˄,ere00` >9G[0}'-S~-SZfĵ0+F8cC3jY_26 Z̪]+%Y!͛%lpT̕�ъR ěQsN?Tg "I9(qEVyY͒Oo6MmV miXG[ A8.o%ߏ?x _>:pFykxAޝF\yA+{_]D:H�hXԑ a;49 ^*N7p!,@B+0`N< X߭1q:?plFģf;~_.X>QXWWgeApY~{䊛oo[xAۃő 3jv8w j0x#nǟ聱 Xkh+ ygGݑn 12_-GL`9\MKUO  -*FY%hk󭪺252C6SPM&uDPUu0td3h.3yRjm][Ws 4w!=! sCwV ԫR2Qj:w1΂L +݋/uY֖,^7^7j0I~R6rK@h*6!e"ScD-CtY l*0 94)fŬNʜPB#h6|s3C1$F"aOU33Bi!$,glZ8[מAF !@,D"$$1S1ȠR'ëMUS Dm*뷕]h5GANV纈n& iDB6`(Тxcz0`SВ!C�]rC3ud ^V,f`@4j#W3_~:xasZK-VW]z./ٌ۞+n"s? k*f]~}qqѮ)lჯ}7#u @ 0(v+�NFb({Wo{Бpx~ w+Ӂ?Y�iMh8[I`:Wɡ[ǃuE?ƫE^}7X~v`-rrhkwU[p%nwhvoT@E|Uu6Lz9>竣 'vt\rTn ǠVH}W[25ZeөY{lKV U31V3DVRgߊ&ؚ68ќ-451N8:45O\|2D-rNA%dc|DWV PF"*@R !!3%d,%|d1#Jq &``VuQ2_7[Rk]jm-^k/y=rfZYqރIK2ee.LÏ%fgdXzy0lR=0ff"Uc'C1}eȌCSU'hLp/Ú BħtbƓR PdyeZUR$v`pUj&"qCM!5Ι k`K"@Z݊d s p lcHEt1l̆QfBl-¤#l0˿i<m Z,vSSWSq/Z.ݺ--av`v`_ 5#.|S׎7  @domS27DOs<]q$V%N6l+cV>{uA\Oa;`Ux'D|�.>w @yƶ� D?>R;'r=wy^W{X#ܾV;vU/6PPX_?p0B6`ޠQ+/o}yt,7;x/u@`V^ͦ!K\ Y .aS9v=EzX6^L>dDQh$&̕Mzl (3-M.$jMK!V ct<a2�7c%<}b1l՞ybUM׋A ƨa3si(fjM),ŭW/ծ?I(FDD�ټb^|2L dl1)ST7HRxYqVfa( q>E.s621ͳg(fF'hPN%TȈAs}-90A+Dɲ X'z2 ebm΢>ADe XV|͖ߴ@#%sp*@<)bVჳ~}f@in4ɯY_$9d)9p,C1D*%(:))ϭb%zKlxcy8b],v_O+v<KS:$d]+9Vv`8 jxE|X:< َ7G6D-/Hrs>"^ -UE%v D vd n^`GUԂ\o}kz\>|3�1k+mmN<'=/5|xݏ3YYtft@~ T5$ YQPGw |=v:>}E!_g>ݺs~cC#ƾ\,,Z`9/3٥4h/cŴ(sOxXx(6XU$ 9GKukvv?RULuꪕ594P512i&/ " tBAiMB84@M\_*F y1A%1- ;V2fB%"5X!Y-Z%&Yi|>Zm^̼Xt1ѻZ:1󣒃 W`6Ҕ@ݸtY JlH?L8"Ü\mrȕ6W`:uFa4H"-/~}rMSʯ )D0>CLY~HQp\41nz�� �IDATi>Üv!!z)A ʸZ1 {H`^035QI\fCB{TQ/rd09w! efGtE /sC'PfݬԖ[߼ Q-Ln.rx^rn7eEnֵw9-uU^|dլ=dZ =}Dx= rnHq|ywǸv/ b(d`|ܢ? a1x8Om u]G<}_KEiJ͟핻8NX_ax&(0 �)U/ ×?u<`<ߞ}�Kw&'+o?;? 93n>CyB-;|#ҽ yA(q#/ֺ[_w}:JVȣ�WlԆ?{-W,ƈޛ6k#WжwKjIPqJ|\<{ܪXjngrTd5yΦ*4P#cĂˋaLPa,"5p�Fg:k1)  k8Hf"]*afT*iIj&GZK)ռJKu@+FBZ'*zJ[eJ3{F|$*r.9e-ibdIU\,yS'.'<]ƚL122dNεJ M9OI25NcuWPJ:fm{Đ4I+a&˜\N%o41sOY%S>N3&Yּ^3B0S )M ڜͣCޠ,jp%E<]40(I-ł0)fP D cuՌJDaPPr²2 8!ruq&֞7/寶ܗ.X:瀼}˲<ܕ5^wy?Ǯk؞e}%K8 O(rO|3G>?H 1joւfDZ`x(1iف?.g wDU8c[sE{o_u*dx >k~ 叝 _|l ^Ёx ~3Ÿ Wqp8o8-,[ x90ƸH,qt#*ںb hʺ5Uιzg@ȿؖ74D-^z\F۞m,hG$"Gp/n53K k#pfq4}[sj͂6_$ =b!gk @Y!"$\ @*s SahB]Lk6R@V+N(eMl^33H !4YP`NPJTf@fիfx)VSFs*àPuUU+ZwY>g$T", <a'; Fۚ{;9FuD%i|{̑aHR RJ^j4Uk1A|H\#hfDQ�ܼC.@zWn4^ju&^pڤ]_  3JF 2+ ?aڙL.!k!a^(:AO>MZl'+PvbeІL&y}'M@ e^.hbݴf% fq%ŁB1کp`]<QfI{_?Wk+Q~e=omz\xtxs><"F Z ;j3>B�?m�#VꩴŪ`q:7 RPmE kA0b]būv 0\훭wu]};ÇR|riokVMŊ;�mlVDU?ķ7՗-4b-x<;-P0H,<G[hRpf[uyXzVs>wK& !0,˰=ĝ}�s.=tT` Yw(R|&Vmn'k>MY̛QK!"=Ǵje|Q-T$\mfY<#S+_b+uByV6q=򖔘́�a^UZk'iiSc5co~0' r.a77UCdFI3c$xW_ckYEj/,R{-sfLh6W$k7( J0i_??qy2#>bL #gGLb̳!2b9YJ 4h,uSw^.8NשG<S6Ϻ}橀 )1fLb}Pë́ϋKLWڸѦ;@s0'0a)KrJm9W YPSI8+6  yWc 5Pn2c)"g]Q)%5D�R !34w2"K0 kj(ͺgk_<Um`Ku/Œ__WC[d˺ǭ/KJ[+ zW,K hx9@y<78m7ZflPp W|�8}`]qE٢n/O3&8Ne{Kk^Wo7?wX;V=[7_Ś7qbb| X7OD%-bͺcԵ><q{k lfiul>q< ZyK)f_96&,uLD"Ƿ:UVQEe׌U#gyD_�zxE}diX2A5L9j4Rz1 eX$bU#`4aE21M~'4gX%'O�@KZF/Y&2N)A\s Y`5[uA"glwMBRQfsbq ?9V,KM;S"Ld(=l5H1mfsɤ Iq͚WFS܅ +YP金&woqXLj#33{�NMӄL 3bdR +2y+^k,vR Msd^wL)@VH̪jpW戈4L338hiD.ǐP Y)erw"jH2P dL"ByTg0OsRK nJ!5(MєO At( d%1V n J_1JR bKy9O;Ȏ887MYGFR`пnV*Wl uo=?G- \ :1qH1O+`p� KkhJu V_!Kn[oWƿ:<,Nv|a^cg[Cz{8Go/: |& 0a(Q39l [ec_Gc[=<aWn6uT<>'XϿu2hSz715MfWoF*`V�dRnؘ/b rb̳eD@j«ՠD\]H3n.Z%^(KK ugBilk&q9@1$/r(STГL TK*2b )Nεe `$8~!02#ֈ1bD>FDQ]>%U ^7xyZBfFFѕ=PP*ёs NE@g$ȼc,FTq4tMI˞"m]ʫQaqH]=AD$촟3dtǶfe"EgP>10FfGf{)$Ja\7 kgJisi[ex3c}/`^p3˰ v+Y4TFf`4 I8g#5e$n93I::=XIqF.!jdv7zuza'HovGCYؾWto 5 }][\־ :f ^fZ9pRPθ;ӧ}<ͣm�0z(8B=A$x{]<r},7(+v@[KwͩS.i[n:mRtw~9C2�`x7ĥ#_ [ 3O/mFۨ\ã? W%lmvڷv .Vj�o!+vV/`umWdƲdYh%yY{GA0q(m<d-|)uQݿuez|Wʦb$ %EY)V,FZ2LYB^Y')k֋OރIX3؜ WAHYh)ycrB&mD3t}#'U38dC6%3Q#GׂeX$|^e>p\JҙUz!ha,~"r#k=%cE +F>>e.Ms Wd̝L<J$VLͪKіM<B"S1ehB&g#"F LU4:8NR7B,J|򚊳G91'ř\0K7͊_�Q0|J Mk-EK{fEdg: fhD 5D[Bk,/^%92GcMvIcP-gj–/FAyg=e]�l8}nod{^mwX >>z=�l*~ZF6/oo^ߴz%A:�[�_=&o֧Pc{~V.bsFom#aЇG+#۟llvWZѫ+CďfXw~nˆڊ-Wy8w ?'\޿9å?׷5ywEoLXjeZ[{lXZDR~oZZG.lk}i. Kqpo}|%MS^;y1u+jh8ə$Y a}!Y7e (-4T `DҊ/jVYf%sR.#&LdνݬS@LШyOQ*q[>w&coæ*)>./{e0 ZICs?=0u+kbPA0HY,d[>D Eƚc1cs:!.j,fʾS(CeCK"FmSk0IS9 K)Ffƈ޳Te1 j2imJ~j&q#NPY3#".1FVЯd \Yy: f @% iNZHK67̮r>Pq_O'6 iTKa~Q-i1Vm +$}]5=Q 8\.n^n`q[hX{PCoğ=ПDZpkXZukjٲod}_~%ܿJm.x^0H`v P?CDŸI"ף/ >><\ZM3 ş>luv^h|_ ;^}vW1*FToQ8<PoL<W.}re@>6o_ v&t;<9@̮y} TqBaȎmWz[b'*ɭYdj󗸅UJ(Y~.~y'C&]/w_*a5R=C|MBCeBJ!h`5Ǥj-J7V$rБeIfJh##OT# ŲڬJT΂]2].z˨Yluk 3n;=kSio?Ҡĵ050kv"=bOYK_ϣ˙aIe==.O/r,Í0$X>o+d58hN$Lq]cg5c#zDJ=rd }`�P6s M+x̠q2HcfrĀDL4tr 1ݮcdt2 t’ z6 'S$+M|.),+r[Fd0U ŇW" VPРYUfciC`-.be8B=LygW<尐 ##S5*RsrM%ɚS7k elpqq*\%Ϳ[1x̩= �l*2*"2rn<>39tإKdUjS~V ~_oF #[ <|Zc^CͣW -A@[DE44#seY3{fJc%wB9О[np3φQpnh� \Qc^֥giٰ>qwesqv3'a"+ny|hoP9G4xl[a!0@iHBK"pvmΊVcXiҗ pB!w6P \D ֡&2]MFW- Fls0F\IX"f-D,7*%fgJ`P72-+! 6u͹'%Ι4sD}'3pf(3CXc7b$chD &2P\3z~xQOf:%FtG4VXw ȫ`3R2=v䚙cDg$,?ަ7$;^3{ݝdD&+3(zF*�-X Bg^H! ̪3SU`t7{QM 6`I{_zg<�LB!f raVJE\ |57kN"u+~-3'SUf k_ mP?-E#A]b ̜@^ I5"E_Ъt"ƍT5_"L2Ň!lr-TܭJfL-{ Y} =j^'Ԉ!i@0c봳6de.`ݶ䍲~G?vSTO;7co4@;(qKco;KVJ70x*?۝m8欗z|#qcקQ!hO'Y-x5͏k%5'_dH]|?ߵ]=HtYnͰRM]P,]{⩼>ԅ@E懬Zy e^?uoޞlXz|~Yi( })pkO[< LP?[cQ-QG qf<eLyCrOXawHV jOo-mfL7Yfv6˶a2K*Yji(_9Q\ղ&U+KJp` !s%`+HCitV +فLS �'bHBi).$׺r^׏5"2 ,4)L$2eW2Tfr<B9y5182CڲRC6Q ƲIŊ`n1W74#FCe"f ܌0R0H.պ`u<J[-ɟ ,b,>mLHx! Qr锸Of\kF(>'$-Z5u;tt!Wc/C9se"=#-S>ײ%�� �IDATcQy"l)B\Ix7B iH!"O+C3,dBŕ "T i(f"nXhD9םUPWk][%^_Jad'؝~BjX`/OہxB"Gc}9M=t rn7#?'T Z2ǿ !?/`ߨgsG紐@' sSOcݽ}j L<Ox!_5؄\^ӓ? /7lDKh5~wF=^찫<`on%sS1e<?Yqk `<] 1N'r< R+ކC,rH{0M,-e7nNXjs_T1Qly9vζzLgQ%cLaLY[C!2>ȬH5md+Sr6U!%ft2ub`B("Fg!wQ6*yTSSnFxL$ЙA*aQޚ(`]mǺX351ɔ1sZ133<:̰֞ܩ%i0z.K7&-Va0�{29/Lyq 3tQDj&8]L䢥uEsVXz#s(euqʜ&L7Z+/ &;Hz`JZIh[čZ>D,Yv--,z\íCM ]Uװ(\Y+g ʵ05& 6Iehptj/Uq4 ICdRY2{BM,2g&7IZy-z+bTMƨypF>;k[YUU4ǖnQJHy޲Rɞ[ֱ�~texZRӼ{Ovm޿ h!*@p`G8p.EeZ;C=8OO/pNNvcoUǷr2G1 /ipysυ*{d/8oN9 `xQ_7'59L7PmPwܪm}#cy5\+pUg[ޏ8yttTΦ ƥ/*¦qL܇(lR׉*vj)pE)F ~)TDs6VX2HRmX 5\jĺDҊ%PPsC4X]K)Je,V|N * +xnPoC9BsI4*+ʺIZwZ<Rv'4GsLHFVLI'}YpA&r~�i#+6ZŵV XD�lk}<'&42Uu-2bd"KIs`d (P:\vK ]:XeJ=$bed@.,j-'!br0WE3,rCPu:҂p]Je8/!Q\N s @*RX&<YV^ ׇ Kxţx2W/CsOtԘ)hBd*W’Vh]i9( egL$]PQ V5*I}/tsԞvMz;NN|#J[o=m}y9^x/h퀟bb\>Z͸ya/]|?Q*}xoY/c܍->ێ߂ oqGS)qT:v %pS lZQv@b&w}=wa*gGoL/=w +7[S@ϧ;.Vq=tq+d?[Kc#nެ?r2pFm5a^m#_>KKXѬ)PTDe4)SZ3TMQ6'7% *H&+W#A`';am..Λ�52 0)aS"aor/ FJIDn.˼ ] [l-fVdW'e^0XeVGc1f1ZuO-ؚyDr˅HG P9b&UݪY5pYKWXRʄ1̦EvEhR9ƘE"r̟KPDN,Դ(΄a!a]<PCڄ윊e٫3#F 2vN F}v,M R^33!Oq קMb->|Tq@jdBn/͍o}-N^X&mnd1^2Å9SScepN|$Jեj9B'?ʾ^7{rTB4CTuMEA]|X$ Ơ$ZQ.]muq*8|ĎpҾA4T؆ttY aeJEş=GOvO_0pss =pAO0~Y͞3GO&>|w:ikS}*m0`�=t<`8p/Ǟ 7#rD9Dҡcx+{kSlϧpVsS~S"j7^DҟeٞT;xuqR<d^2Q_q_͊{eV ]Ufg'A] Qe Zdr35%J H�dAf!"V'̘eFLvN*b6E\%ͤɈQ4K' n6¶ym듘PH�Cr!rX! T* -%Zz Wr^JŜT9W&I(dsp"FE^!e̷k`&ZazX9i s dWlO$X2$22W3X\őL8#LSfE4+XP ZZ3%1 ӝIs@ ̮>3\Y5I_](Bk34V?kChV (*M<*NX+˔S%RáuXpƫ;ݸj\Uf涞3ĈgԌ4(uC�ᄀ iƠSB1E[؍lZqô3oj\ቴ]bE٧B0?Y1;#[C8.> ^7 O?pޫۿwoxm(<YNSpoOi}`ޓ#+6O|?#`k #Ps[{~Z~xh_g9 �=__5 v4rd= -xV! ^lۏ+jrBB8Ly(|unz4 j;䯰DG g`ĭxS4:NLO4v:Y ]ip ?4QIr yAf;,jWg5G9YfJ6%Q� 1`.=�+m%, ,3 8XoBť\[ fdHt_NqDGNf(;X̀4b,T592y]]+Ah#B9uB5ْ1'#K.}חvA6ZvȁHiDB$` Hp]fjXjGA9$-iJ�a,̈Œ`!ZY)ݚ�"P ٢`&c9#-fQJZ+־jW P2b9ʹfB mފ9  chŋ`yU$]џ?aA ~^lNedj[j$ּ@ULȒ-(D3d.^HiiȪanu FY$L樢In2L+ᨚf7+2s̚a3FQԡ3ǥ[?Cdz~o;Vr}qa'+8fzۑy*Vn ƙ֟ ʄ [)v7'&l YN0�1;(_+d~ C=~_(feyp== (@-1 |$:{vќPv(#P!G/3Jv=+x9`�V` >t@9v�X=AGM89¸ lcَf_fo*T13Ϻ}teEv`1;L3ÀBrOUU^]R \y{+/)Mp8ӘLXƵ44a7)NLn2s8DO)ʂ˵6b),ltMI@b8t-*X"r3h &�l_z?nW-H<Ce_p5bPZ1$ՙ9C4!rF̙s-+'4S %#WӮ{浺%ҖXٱ7vU@f1{ u5fVF kv&%ʔ>#%S%嵘WXYq402S3c`)JF"dT#H~Fu-؆<!9 d4^#B D]t \k|mmiZ+,YO_Km)/qݺ횏PT.s PگU91A5f,PGE}{xY5.>Lrjv?6ZѬI?xꉬ0 [&zuUkvGo0ȟP~^yD\|>A <]6DT`M_D<c[~ *=}<7>Ww7D犛;xNH!q9*03G7SzM|Rn?OnWmB38Nݱ:>ᎺNomɱ g\ ·=Hڴ@?w$# sh>Ul͊t&9 i@ކtf q1?#V S Om�׷Ԫ_$g0YSE9̹iX",0�U.*iRr#b"/mPr _֢Vq aʵn\x⚸ T& 3449K649ӕ&ppZ-8 S%P$("\sC45#]3wJtլV/h,z6DDPdVh;nȘ1zԼ-kbs0rARjtPlq#"W2X6.URp1bbDE\Dµ BT63r,!OLPkC!b$*$ZƼZV(X)sS+(- ڽJkBTJΆIQdAsVDltUczȦA2Т9KL&j-q؇&1#cyߞC$6m^zګV(|83h€:?LcTOGCznz]9ox{ޢcsSR; iĚ$1_iG~BBpvx?� c٢cድW~<vz`ʵCWwÅ3~Oaw&=' }'u7T)ttbz,PaKO_|; ~0ϭj{0<ݔ9vghw pDh/32sG{ O>1<Rׅ] (N-%BHN!M9X.�匑!(BCqe -1VV4n4V<)XIBfI9LX 4ЄVJTAV3 #RBJWr"�-HŜ ,#,Lr !0dC6*+b3 {Ҭ]n.C,(ݒbI*+}W P굔J.% n/VJS!_{XԌDиvFu Rד݋J5:JPd״ My.T7BEq+HR9ei,/zyz縘:񓠰uayR"d+rF 3ն6?4IÔ, Ֆ++Ɛ9I(_Ne`0K3T䥸mKlضiW xoiJU-7Ix^C CЀl`ڥu;켫_.|\8ԧ]mБk3x�=xoOqx)zTqz(x?鸁ocOj#f?oљC_>bs@Ul|&@;/a?/8aWigC1C.h/_$r r?nU^ J Ο9H\3XmnJGɣsA_vcm7vV|Ssv#"m1,n֨BieE[A =sN7vY/K\C0̕a5]׮7ឥ~=HRLBJ*MP ȑcUt T LUhfTVl*}lG(LejRɥPdy "i3%Y-qM A'l\ "2c6Sx%F6"jnկ:1Y#gk2!„ ZUL&#9AM8V`b$A%uC x(PPs8|TeH1BCsVb39dNi*II2N/\V)0ݼB(5ZѺIl. b)4o'8A8W9jE" '3S 4c#Y-o25i-ˋk>r>ʓ}i3df"ff࿇>+.֬{ѿ6o*8H=cͿ}WI+' TCbED?㼇W4>y`a֟i]?~fV *td64{*fel O/{ �7Bѽec �|Up?q|#TwݽG뵇02a/r/[er`xz vzV6Q+㾝�[Ŏw;|/|o7/޾dӾı1Ge> |wz?FjWQWsaqzEx8h-/(%jjdQi,S`q[oR4*3k 4K5ER?ebu%9s# `K\0M0XFG6TV30#5�k j T€\RbfP^,C(N%|$SWeP"C=pIdEpzub| xrƘTs9 7xucZY�"2^-|bD8&1ќZ+V뒂qa*R4I&eч9)eWAM:Tϕa35/˵yec"lr 1gfZeA ]ԥ_F\y^f ,[ ~$hzSLqiI[d.)$%M0ap�`,beq?`q55pLTε LlZb #KJE9 ˎt*Si7RR5Gܾ[v^S[Rɓ-]9!2rl-1>ߡHF' l Df[ by0$ 8VDm'b뼡ou]m �� �IDATx~ nط>xAOhGMPG;cGwp 43pa>y} wĿ b;çYiGqw|'瓵 .ǞVP?8Οz%\@F0uj?GB{Fx#or|ƯڜAx;O#k?iVbST5kt9zȬ k@*=%LVzMuK%]$0s N%SƧ|[w `-ř%*-+?@l)SsϜ‹q!%nc�pps+\QײQL!JT�66MiZy.@Fb08%0K Ԝk;-͌1,giK\a\bt]-b@d$l( Y+KHt3haJk"rzB9s@Sd굲U\|pq) 3g( 929PaE Nbt3VQ ӱ{RE؀14"2Rs`T 0LƜd,{uw3GL3V�>--%oacɕK[kfٰK[r\ m+eq| 1G*HA`Ɵ ME8 FX6a-!(zyiDcDqD҆ef_kKP3 ;K9W" c9OVoѽ] ;VrCN_{a_dCNjNotç.~3S@&KpC):'az-yFǯ s|'Odt0?-n¶%ACO_0|]P\>"() Ǐ<VN Yߡ [`(늬E/p|_?/=ʡocS=& `z{C2=Maygu]mG:]w]-}5GxrOu<fAd�^ƬAٶ-?Edӛy@j* ͬйД GXc73Cr0L92 >96 SD&(�PDPw&`2LXt",ύE\qD2edTu"HL(WܬL Kɼs~W[rƔ.,fUiEHZQ.4rH(#戙 0ն d`d0g Q@iY+v4RH\( :I3s UDБYt*a dD8YlmcLl-4lӧ7)_;h]d)X1@8qUW)"X%cB..ɴ6v}F|J j]e0UdXg8ED~IҒXB4Du3s21o KA~Ygwl(6by췯떳b{/O^^pEnwOHdWzkf#"?$QA"@@ Ah%*,p#_rZ Z[!#Ћ̀H:23"3ha^*J *22{>n<(o[\�ނ:0Ƨ/z~|ܵwExabAG ǡp||Yph<;# c᳂m>9.gp [^c/lvHC<hTN$Zbxd-^M%NE؈ |<=p{kv/'6`G4~K9mW88c˅";`Ҍ{jw"<m(f'c{m1Eg+;7۶̵BTrN9+Vr!6Ceֲ'f7`HVEʑpۤeTqx,y[%3Sn&2s8$%QQ&Z�+GD.L&pZb$:1Q:s`b,҂1뭡2fa. Y@P멡rnFԼ op{r+%brM]bc-4ͫ+27Y蹥.Rh =r"$`2,1%U4&M(4sjblZ;2-FI NUC cD1iN>%ntR܊4I$ 01#29-9#bˢ@!0ͧ`$qB@R1MrˑE)eBvLuPf2y: mQ 7epډ`񉘊 R sy foK[RD>֫lMڧTe㕍и0~fff#ء-y"pTK:rryp]~S/ǁx>�VޛW|x.OSHP8xǟ}>?ƁxЩT�zW0.j8ǛfD1˩Ծ!_?^P^aD!zۣnN|8bg4 7:vӮ+Ejxy74S׷"}ؒc8i>UX}³l܍ׂPUMG)znض�\7ZYb)C;٤8 YJ# 4[(n!Ff$SVnF̒}ȎܬFFЛ(/@o*h2f$ρ!*YB( ]9' ¦0FYlĒ4 sQB1r*ܢ`dSxf"3dk^'A5*YRRfDfn瀥,h%qMNre@n12I(%PtfyVZ&xnk3Ǽ1+;36EA4+NL$dRa`Q2V*f*SV;hʈYF23,4TE ,2y!ۆ6 ؐkJ R#"d50an`ǂlzG"3P6n&  H$̠$*8q^MdSS.6ـQʐ.aتS</Ѳ1_RwԭKx_{|h\,{4FbHWI<569beU>(wٛٻ LB8`B/wQo X>_c}/yGŐ>'>ϛݞsρWyV};! :.+;oqv@"0 /ΆmKoY<~vyjɨ[r[z㉆4B]\'`͑ ;Ku˸e8r`&tCߣ}bq7,:́5])Zڬlyv,KGcmƭ cKQ 4&>Cꩨ`Ϧlmf׏Y%ӓ}$}K eaIefn]Q  HJ޳&*^sE V#,hsS<oH| A~Ԥrc*0 )3%ۄd=ay}D'M,NLP_a)V ϭ�l(Fva )DWqIi2TeTr 6ч3tfBC1dRJ)KZ*luѓ9JJ4wHyޥMb5i%43L~ (VZ1 XLws*T2VVXͦwivʌE90&0epM*Xi)@ ("j ##)c2#GQ�=6CґTA` ĔU"|ITǴY5cѥb$a(,=_U aS#h-~SBC<dvG=}}Cſßfc~ȻYiJ. nLXR-%Hwmuka//@Ā<Qx2ro1Y79voB=[FmK[Cly<zcԊ4tǫ.ſ|x}@5| tuٷg{@:. �'Άs wx^ݟ_a�KWl-r|H<"a+:wZQ=' T0�ývK*e=ַ]i=1sVW؋%Oݾ}Ʒpf671H,?0kwoD|qQ[j9Tb?�yZE Pr0D(99\hI/.96%Xnv[1Z5bQb G尦"+ӍtZu1U]JQ &s:g}.}"[`ي+9}2 )F("\1\k- yqSH6ˈ1WxzU:a֎"Pf Ocm�Ӳ6y-}z8ff^ ]̻nuofW]EvLi9 "5{na. sjڪp&es&09*QB15 58FI]d$СP٤ez 3;k1zׂB(5PBV\$̂Jti>^V&AZ]* ЍK14vna3ku+" j!FCsTyS{svKc-n薝ѭl(lA`m8b8{Ͻ=|iNQ2_|=,[vpg/ŊJμezݡfhD3tCa#>XsoG}b'|&c v9 oj{e}_ NUså�@YAo~l G_o.NjCݣ�k]']COv�V,<Fʭtګ֕S 9YDq+Z|q5?kcH{*b?J쏞}iƚQ7<X�vx>$[:yg0-=ʽ (~g/ӰV' Lk0v&S :멌-1Xt)[r gU3)!Y&LaNiblLTf^b`i sC )U 0f&ֈ a$:\=u9Tt�bfp3MyP_ LeNӋƖF"4""Õ &-E[J1?agR0Fƈ#cD I,vzTa= ,.3'ӑkL9g4RK)楔X*a|ܙ(Z6STJ*GFL󞔚+8#eJ**49(hz΀3Hƌ1Q+ᜪ(0u9|z-e-/pdHd&4[s{XIbc 5ȄU8T!-hfWΩB謶2HUt˴ bBW\>7,-oHY[|yº7<c@^?U|#q׷ϩǺ{P>1jEf+ֽ͞Sk,>>-=x: a,x:}ȷ+noX?e]G@o#v 6pDuC)XmBo ~Hf">cNT!*^I:oQ-XO3^ ~RA|y9(ɓO@'l XEތmUJ]~<, clxvrs65n(X}y/:e`8`8ևE*ŐzLZ]'b!iwc)dٙ4&PB ^e`(3,ȮmhldӔ40O2muAmurvZ|bs$Hg "?!$rdDC EDh΋h^H )h F3fs]DbDpkmܜ=eˬ9WZ@q KC6Het!b.\WtkJZI7kHL&B"C eLS[)bNT&5 n])жa$5##6b$,JG9X 6*;WCX2qxGP9"c~B̑906Htq[(f@f2@C2mڡ1 89k*  wv+n0XLLNgR0Wbdn"qEIg*U`Pׁn^8QB08y&\b^rFh|Wܿ6a.V~?W{a |?ݕYKY߰l=tҎgh]F 1=ۗjqO eo a'Xe8_ͷP Pxǣްt@xqNOT~�=&Yܷ×efWm[bg~{|o@%|ƳcOɷ:OC87ql <W(vsVkYh \݆RC?qRy{qS.[&pݶ^;e3@RcdI Rd04Y!!t]fiQxMyfLdލ[hxRR`0=>E:(48ԧR1똋VP�ѯW@X1!1"iDUj‘>;d>lU|tCJΨ_=Af"Rtu R*i3[,D"sFjoLR8_z!R[ :Iw쪺UbS. UI&*5Fd29Oު@'ΜfɢC149çH%̉@nEV yLD6WYkr\(ҪT2AYȄgRiU q5 D>1 Do`ѕad52H(+ƣh4#6x4Wb"Al9YncKO,풥(n^̲5_8ry&Z?Z>Ȏm{mx=X1+,oU[PGE80^b6bο5-o�G ryc}o9*|3N_x@Wt, >& ۝^OFlŶ8^`_/{,[�=^p}{y}mX{-<V^_c{GbjaV{} 00 EGԗ/?仯5G>jhcO�{9ʧ};EG?~ٽ{˲aC)(DG0m#;}ѿ^1ZuѦH(HuwtddfDbKFq,f:" B58 ec8}Z4w*VZH#袼U2`k'J ԰p h5'+Z2P�k ಒÜ15/I$dM=[^XsLWub A2O*p#eF%g9:. ueH4_ rDbb{#X4b՘p´nX6 C"N Fp>O!C�H-YlxS2%=.[FTؤuC0%:p*#p2̗y2 kl`�SW͇W`>R Eƶyuuu-9?IsɑeLi5(8kắ@d ,aR6:s0H!"1ƈ69 4SQUG5a] АrfB4byk&wșw5^O#yy_x6.ޡRm,' �bHQ`�� �IDATeآagl;\^{8�Xx9ߠm{ro][w\Aa+`y{6SmowBC_B< $}B^|l=Lx&zA.}ɜ?b~ |W ~[訥@op(c2_�#}\GH0�Gom{ }C%)._> ~)M{y[Wwkn=+#g(Hv̗~x 3yT9sD/}-/S[i1,ϑ/HD^ȥ֐drD02D%b, nbM,%C$u06'ydJ OX iȐx!)*}ҡ)5ɔ%P~֍%B)m0:y-M+:K&ΊbQr$"]݊!*MO` *Q2Mz0eʑ2DRYܦŏNHKgSF  H CZNP-]3�Y̴eΜX'Mi̡j̩D/n(cdY"RsteaUc) 83ٺ0HpM4a>QYs99Hy\c=1F#& ŀIY � 8�A1ŲS y9`ƒYJbQRlsV -*C-59"0$GaМNBZY6/ QЯ_*d@ܻ/a_Zbmc v'/�- 2KliJG;+kfo;=^q_jlQyf-Ნ;{s9^gC)t8v 4e#V_#9vSg#`߼R񳆝0o1=!\<_fۢÞzuϯ7  qxX'k !/^_jۭp ?;-X|8cx?'~ /~%]v#V4a?wi#ǁyG0:/8Ǔ[$ -4fi-~.4r.IJP)ݣY7\-aC2cIz1z^*f\ &\u[d%{RUp} %$]b0asĨ:mi>]9*3顒(h.Y)�f+X@Aܯ&y5%DKp�= ̼Jъ0 #n.QDad2Y$07%I ,O ,RI$W"eIr։g+[{b&#sf+#<#Lt91UǤ,L$B TB[]fW4r68Ink@12-KlTLl1hX>s^Eh@c7+]&x 6*&o6߫J�kBOQa &DeTMUȡA`belXK^b* <|_Ft~raCpܜi~A:ۂ(cĉJG4`_cVh:q^>άܠ F_mt\6T2ԼPoXqֱ^~}:?O)jgh<8M1ʻ߀�)�qg�|ݟGߡSn[ű>@SU1ȂcC{^N G,3}^,aBm9vV[E[şXM,+bC= /XtX7knEƨ7cۻ{Ơ;Q,s!^DO+.J1w!GHZ(L!h bb<NZ}S0FWH* ]a�Il0LFا}2KI⑼2Ф̌(c:dJ=_aEl30Ā V]Hz: XAuQ?dL9Ӟ@!5Hdl_1p)8Tg+&1M�QE7:hCHEȜKtdJ(>E&4flb41@K7Tq¥+|(MɁӬU`FŒp9vĻJWC]R "s4b#sDRm&s 39rd1,rƀ!dnN0Ǻ*[g9zDZEKB2 Cg(¼葳D"KnE n%ӽS ΕEscķS2|YGjzR;b$c~,Ȇ `S"lE[Mşڶ»I;~+O{~Y+]:^l(ǒg0}|GaOq{ նd ݏ(&cyxgyOzd u >wh{$ ~lî;D?>7 /O7 JC7Vl> :}{Z -o;q8,Xh7P=v^KZ1D[N;0K_v>X'ĩT+`#oOauKo]i-}ts?b P 4)nI JA[ahDՓF#dP>a(]1 ^4ib*1$ *gEt}Vd`[(R 1wWzg?H<ӌhv ާ'mg=Tv<Lrt4$,\/ʕeT咱ilPlvPØ;+@[()t&#H Kau/iwDeeY1Y:bbRsZ#R0@ c kap5Z-I &u!I`N( J:tp'݈HiYm;|Bd^|)i -Cc(&Di4Raf.kF` uH-'fJBHIXYPKhTv :Af$!1FWB32-i3@%YQY~½8$c v'}څԢVpӢ, nXz/vgݐ!sR<Q8_Wh6v"cK~/׬g+x(v"(q%~5X:rwտB-*g/~l",xtWO_ۏ bg^/;xG<5J~"1S(bhm+c۟[G|02 0yE SpP;DE>,7fy?<^i/^ŗ-Uw,Z >!ʻ{Y{|M7ū^ Idf21QnB$|N <a[/ yD0S GBtUa1| 2.L0 *gA6#9 18e@i6hͭT#fjsseF`2sI fmm^' [I1ĄŦ *&mnRI"R,HpXUTí;Ҍe ](9U(*= +Ԉ̔YX雥HǬMOPM ~0U0S,8^W'8KBF؜a$ó4'1>qxupdϔFF>44MEJQ:.UE"{ɲJ3#Gd(!H^4c f%Vv D/z wpMq]͎̈p-gٳU "2> f ``yF5oMuNcfXXHصr5Fn[\LXa5JLĘSw&ʦjUQy0}<ݛJFfq^'6+p?[q A�vP tF:[{Nѡ&?[*ҧK]m1>jCy<'Tsm_Wqgt4OO z9Nywwn22Nj~g4>\±܍kB}UͫcFr D ߝk @GCzmjWOcƺ~2�[ +d;g:5ܽ7,ǡD~wϻns c?` |L@D#ʎrza;G"B<'^m=v0 ,m2Y3jZ i^\JE_Â2-\lJ&[�sB0j'󚇢%CL+ jMfh!%|`RyC=QNOXbw. kY3ݬSƜ<eM{Y9Eu'Xz)4A I]l5<ی&Fր)ZnЪҋIB+Ey36pgSp֋ 2 I-"VF5F[0fՅyӅ9.t%l28N-ϲ/,Q[WٲqBqMꖉ!eed;PҊ%4Scd^YkrsO\K#t]"%c#9oڬ"*Y<e&Ha-"Tj*ѭEHiՔ5 zhLL Q5g"C 0)֢V[Z  ޯbrdVKUFpذskS7m͕�@3`6,Ƥ އPuR< g4 4jax{zdilϿ4 }0x9痧-[ۙ-ffH_u{3l4|ٿ=/l=3a]& '"ͯ}?.1^m??}ΓϵGn P? $ Q[`>ۣ9{S?S;k:66[c\idFlaC]fߙ3)bO*M;l E&*yET352�eIWyZV!AwYiATDJ>ѣk.+Ĝ}ҁ EaO=zD|maEkc f*" $X{+H5`%i8h.%a[HXQEgPIʊL,h[/Қ8O\55%ar[ޜ"aֈI'v0LZ7*/[SEA4FH$RkB!̭1E &X lp0RYFC꿍ARBB܋|Kԍ]Ȝ#瀻%I+\*!\hV%%L(Sۆe䵴IoN*ޔJI,9b7M uxLv-sR)g!(SAROZ]uf!lV47s,MQ@XʍB(XC %%1~:-VS͵}mbYl'UCfņP +A?f,m"" 6a:�ykcҾU^%xP-㇗X� |h5N~={aƻ8?ߚN̻9>8f!o>u pr ?WxpSl0lx;;6/92q?8rw)\H"3�yn׎j=y x ttD8iMr?}^屬Õ|o{y{<bpҷ7(0{5 hgӕhLZ)9v-GÓҬ2% Zm֭ &z.܇] @, eH0OճJi=s]F˅G)hwNC2$ʌNsRHM"V7rO, ,lG29bUUuBE0(lKe]7 b8d]W/gP!K uW-2dJXLly7ݍkfo<̡5'&CQEɡ%LS^ Ͱp띢*$q6iR{ P*e!+؉rʽTkzLj3ZUM nNB%l�Exs9K##VsV"K"F4Myk$kV"h0y/Ffh˖Σ0fjg*I dk|mWu_% F4CZMt¢5a fj!+;!unPik!ŷvA{t-f ܄fF\*.H5CأvWaNc=Nlׁ 4 [sOWm?*p /ڸ{ N^@X:>^?lG='l8#~+/×4K/WN?n&ڶd:ĶW7|x.z~5v~L;jmnׁ!&B8lPmG 6 X(cq6a ޏcZa%FH-o69JzPڍmlF g-4ye&ı =­aJL%_o֭Dr%TYnSlmܻՄ$j ʭjdD9 ƒ/L1 3L < AfiW%.F%-[i5Zehʚ!09#q!{e#w*J({"\zN^2v@_�etU.fźmB.,PMdr$m) 7Htѯ`iRYYˆPK Z#]TA sd]j}LMsV8y{k$] fx+%P,;6dm9'QJG:WB[p "TE HQSm6[YtnNR@+B o]> a}6kݱ*0,CzKmV (3B?xMӨfYӲ7vI<O|]hU.œk<4?I8m87  40$GC73])|09lQLl7&0<N~cuT"_Nzjn|;v&h4|[pX? f2dߡmi~c]Zf>sv}?Ň?  ֞ _ 4bGemCǽ G=m{ﶦGwu �tu@ޥCcL\{~vhUOme(xif|\7^Do+,a#q^7ܷl;yf Be}1*ҨCЭmV%+Pݝ/O0`FCphJYu}!ae]-9iw7t9˝;^(b/dh�n(n(mF ô)ҴK�Է[ƴY9j\^&kpWQrZK(-gI660%[C(NDX Chr7A#ldmj7Z<�5֯҄V&Yd^11ۜ9BhJ]UR6XB :K܄`K-%us2 W@@h9[%P m9Qp9MySLZjmPR)QZ;'$h(bXpE!r"󏯢AeEU"c )b� (rr k> f@' Kl%ښ1ZsSLLC -@Yqۘ7RW1 ; H1ZOchV$j-:K :˜/6<~pTOx69f'ܖ2)^·?\76P/j|ݏEq�� �IDAT{v:=< םgqӱU7w5}}8�`a3BGx+l_ÿu8`Sk Ѻѣ'Ẉ^=56Tr q)Ʒo75{UG,L-!x!x0m6_Zg{d!?hvN?]:|f~v (X!$ ~a! ע `6+Sbj"Zhd$b2v�+7 hH*#vBu<њ5zO393rcm08L:Ėq5Pd((ק!hR|rdf9 ?+sZW]GZ ylҲJd97 'Wۂ!`6XRê) B@Y[,H&l4^lՉF�̂ ̄0Rܡګbuf dKܵpPjɵYsn n%g%dk_̼d?HIɹ>I%`�f�9 2Ĭ阎\k [(7FA&4Aͺfe[❧0,)46̂t}-&T4MHUeqҜfLlCF!{i!sY:ҽFkf5lW8nb~@BW$O3(e~/3,[ʶK쉘*;boZUݳ5E vDcGh~Ӿ<nz%3a^dKpudd]<>:o�T;~|/p+o=εLj5=d|~mܡb ^,.=IH`q~vx<�c3)Uwzv /lLpM:?_Mk- ?Zk[=d=6bE]/?:fO,fWٌiX`7`gahPר oKY9P((;cPKtclZifլ FNk}>GR[MJ4rmLtQi5!A<]&+T8W ґ*nO<j,#'rܮt̋@K'1/St[âPƬ5QnGK49XiE:`7tS խLo"]P,Y;reU2$|8@R9\I\KUjW\%f!pCՍMnE.F!fQ2)T-]*s0yK~cBds1Qp.04&TBUmW !T!`LTmMbMM٬7E9w$%4NIWB&Q3k\u8$v&ElkV6LvI!(MhtnYj3\ kwFKwGck ~ζcC+=rnu[|j2tC͖K'/(|+Ñ_?3KQ t<&|WzeWI>8=󇎯-?P~"ڬoW=w/k<m~φπ#qЀ=:WB!`N+/#> &IO^_ݶm;Mb8._?~s<|w?^ZQ@AwhB#$ekبǞ|3SZ3 ﺆ*\F*к5@+ �% ?Ҭ7&J21J ͊d77tʱ � Tf`,1-:.f#bY$E;@B^0EU aBHw VUZ ZRvºOM5rUϛodei'FK[h^cyMjk#BےOLI2–{(Z\  BtXH.I^Lke-i22+e)I^Zd؁&P jQ A,d(Z@$&T덂 ڈn2KX&*oRSx1X52wo[IJ1ba$Dz -R@!k^W5*G#"1](VT65+kRK*R#C%TYeUu.X�TsjU⒪c4Ӳ)FɅiA8 OFy9Aa׭y OhȂi6za6h;UY:M^vn:`n#W ĆP5ip¶ z+3x`&|<%'}YS;8G>=_~p}xV5Q _h'>w͑hѿ_<wwh9@xasLL`װ=Q﹃> }ahRQN~Ӊo7kPl$:q>νA¸!p U+qfm\zPm. ,^>ے-XU';cz<aZt)v+ D3j P v@Qm>SK1Aw9w:\yfipُ,HU hD̬ɬ`IaAo+g�eH& $'LFr%iqj):P:k9NMm̚*ffp�Ӭܸ\+SJ9~` 4l&¦�Jrн`f+P7+#q5 }+R+7y /Ciҧތ+Plͭl;ȀܖbYT.g.GV%:2 �'j6BafNy˫ʀނ-ؐʅTdEw.4VV'kۆ,U\ssQYtc`*SC?=IosI@J]HY7,MYV12#KrnA%DոԜ5`X]Y `TwKGZI@ j;*1S륭iw۫xS�N9sIhl6oMW.vZWu3>2mfx)ߓs ݣk@) mw\_oGn4?^N՛s'Ѵ.jm{ 5;\ʉ6x߅4=x S^; /^؜frJ �3W6`k7po70 GOx7Oߜmn@gڹ@B8|]h‘5# KԕY90pDhvU~n$F=Z{|vMl7B{*, 僪*ެʢà2״9c2(q&#ۢoЅB)jdT!m bAUu+%,!sWeY1Wx%Lf"-R4FRZ])l5TRΩ:vɉ oRw4R( YxN4h2.)*JTSL#jTHxaEĚ"jbi\Yݗhya̰ZH*W*j"L@I3\֮ICٌ'Q.g 98ht V * l4EbRTUª2ʒ͛\j$TʅFU4ɂ^IsJd@2$ v-@Ls*FT/W)!rҬJ)ŔigI4*1I ;xņuO;tբLN<�<ḱCVȅWmA[%mwcTsE^d~6|=T<z>l2r>xG p cGb gV[p;ӧ5ZD$l!8]yLl^87#)}�WpsX!? |�_ձNB&OW_4pF wc~{6 Ց:=:,\A9gC؍GNs]~)ֈS{bC; JLxXݤ\zrz䘞+ZE\`ԳM25XoRҬ73*afZhe�ih&.$ ܔbn<gTl^R)*V*3Ǭq͹QFk c`zW�[7?JY?*^0Ը tbtX;LM(β91&j"\'\"D3CM[QIB&9݌Ƥ�En2J!mXQ܂tC>bUUymL snnfn(k2aUn 3oU U^ eEtVHBQ20!fNfi1 uII@* l\V 39k0A7Gxo2ƜUͺY͹Km0Cz=yBEmG]=?QWB3_*?vƽ ^9 |v=>|s"^g+8vl}lc_Z?x<d:D =6?M=<?5a/B0`q{0T<{tzBUφ;K/pLlviW<7=~5goviw1>æqߏq9:؁mu`@H jå0t qxlB֣^!;GtmeSZFxeԝBe^gzY2aX3@r&wLR FdYT>cb5|Hҭ$ȚɩflEV"WV*ar-Ml ʖEJhj4#̍M30WhÔux܇f[~HD.CxN|Nݥ'h{kFbbfi+YiVVcm0-_`,XېsΈ5tʌ0+ܚj%$/1 NC *wXR"&25c2+À!4Ps)Qk-29 f(NVm'tS& :(+Ti5I&̂(UTa1f$f,*p&ldhf+:PX%S 4lAfmu"m4tdJV\hN4 '!6søm[WC0!m3O3K}o:_ ׋vڡjMo<Kϝ/C c&Cut+E~ 9}i\I?8]ĵ C%,y*`]>;~^q>jk2ǵ~W840ulv<}70Jvh_kn7*y||_$8]T2`Ϙ+(;Xj{?pz|nomnOVn l~9%n,v5o/}VsE`�w!tV=Vi5ͰB!P dm%TU!3|"|\.6^UEATHjl܋P ,Μ9mUYL)N-Í,-l~$҈)l.:;%2͒JK%YBLR5X{l-z dJ{a}v;pAfYVլĜ,7C&j`&NeFwcHC*m4$E%\uXs;J1YUNc*̹,`ͬ aEnVX XmDUլJ PӬĪ"L,a�d%U yy-<)L?ebYeg>g?#,+"Ȩ*uU!DB jf4N#zE#zh֣ACh 4p 'A EP2{Wsu*e{sk}_lܧ<S-H A$ e]녁bf8@NE@eaRjY _OL-TGJw`. r ZBsXXs T́=Qs2F)dZrET=OK=�+ߡy@v*:<ag6}ju.vb^:W›}q/Gƛ9.Vnodg~yDxә؄Mhǻ�[k/~+vb8 " k1E^,1øw{H-O?z6<mmZQxA{D+wuyhG6p؄j<;_ۇw=hܾc}^=Vc6aw=vlo&m1F #ijZ>໣E M7wk5M=6~biuD\Ӓ:1xte&BY6sO, s7M !EHW&+j)̂MndtYsc"A`4 v^I�]De^YEY Tӗ fi^+4ɀ�:uʹw셀yJoU!%1Ta^*L,Cp,0Md1,d(A!Kn g̱sA-XRL(ҵ4PrPɫ+!win,rP0r`-g<@)I+BU3S2%REj/T,rikSsŤ('e&CYLsdJDG]F WX$Y4.+JHڪꯆ*Fb,4VʣPƮ*#eR`vp1\ZNi$M+,`|/rEXu^^)Hor DNK d[el|;D̊fo ک=fѾAus mv >O$/xk7!ۭOg16 wx5ߠf~l~ }`+ZO&0_kмG;vp_v{ϧ;$p=Noxd@? Qe@qm~yOu]o:rwa?|a~ׇՀũGܢD0;=͢〰#*?=2swnH?SAc㱷Mn+-kba,+/˪!ő$Q(!pmhhUM57/0Ijҝ洵.:6h4~H +DeY" )%k1i6LZ}6np"KVn076=3ÕӷV؃Q+/ĉ9Y4YYҮni|7ʑ,؅^ Lw [k3" EKtUY&/ʅrL:IK)FikXWQ8Xe~eb 0ص5w]}x3k&jW 'q5dsVM*`_ܫ` M`$t 6LʴIK-`TU3\@!cYbySU_#X mmNҊ(FiLi*4^ TmAU,5 ÈEܫ�,sR49?,"f戉ր*h.hLhN*48&Umwb,jzQOfmcl}zU<vF|pS78?nXO[dm'~~½j|[V6_桶{؇.8B(Gq{pp 2PҞ0|i?b� !l;GՉ@Ѓ_5.= cOooxz�:};>>jk~w$q|i{xi`;iڥ^'(C~+�� �IDATY/ln}E#~ݏW1xj'tћ1R(cnr.`v@lr:/-wϱϣv˶uY 6Xyfr̲a#=|~TYVfŀjjVfFY ?h]d9ץJϠU ͓L fpek�4Jp&BNYԚ_0 1%8+h%`))(jѪo'["2H}\_p[1 02UeHtVJθ,LT1 U>eF9,':0@k̪2`nބX5XL,*I/PJjJ S0@jD-F(�>�CRXi,Z;XEmvnHL@23gjIh$`,e9G^c!H@\BgLf-JC dUXYC`Y2 m�S!&L;2z {"v&K3Yk͖t-iߺ ^RHn®!2+ _7r퍇,]ݪ7.͞PlcDfG!WܭS $`: `v$0ێWS0" 9N]ǟ;[6^qWOv;ۧu@ټ?m`ϧ7Qtsd7perʁ5wA}xɞQ\ =Xñ/m^?56cg'j@TTs-^C?j<2QBۿa=Q ͒&{і RCtpx@*Hatwh67;Etzcin9G־&?& V%̚Y8; ak]`Z+K0,ZCڣʔZDˁF9sVFA$[D_h|RT^hYL ,^.N+F5 TT�8^LnSr Wa* m+n/f@3lV(W2X^af} EQAlfARX-e$ՠٵH6&WQ!T4ȀRZg &B$B`LThnE̒0Y G)œ5FYUӿ]AY蜹X;+@@U>9G%lH 9-3vh ,Pi^f , 0nmHpEkM%r}"4d�MIV3z`J%R]<ڗ�GMX#J}yhثCmD/{ {x2�5(<qg%'w=N'B?b\2Qv^�|` p? oC=/O_7_~q?2Jx N{|'1ڱ'RwCDnG$?Yaˣvw8x#,+/_<݉vk.HXvTa0[}eZcU<na7sN>`Cܳ}h96 $7bZ\M`..)ɒPlV @ ޼ŭ!yhDYYu]BeR$,g( Yh@i&u՚O9AqU�E+XZgS&e||:0ɻ?gr nJghQj3d$w-Eۜ EIьPn.k,MHqd1X`2Л`z5U2_<4S f!?o lL=0ղ($9[ [5pGre` 饕!b~YTIP"aS-w-m&>GXt@$ljV{Naj%qL'Dqx \>2h.YT1ЈRĝNguʽRK5Hҹ+x,%RH`:rIC࿝ȯo\eRۨu9[v q2 /m Pxy2?ϘOv3hG{8u%Hb$qC/Ώ-^jyfD;G|Z:A�GdXh �$xt;Y=Wk|Q/d@ͩnǀ.bs͏Do͹/p!۬|p<7`vD;&c=@vK/9e}]V-gs%[yf#Z<fu,D7ɵY.SU8 V.:fú H )|z~ڊZ&KgL 3Ћg`f5nu/2Jf)g!Y faiRCuUeʪA`$_ 38X썁 \vaQd\V:J4֍$J/$oK[,N]vtloK,3*d{U$XUْ!ݼî滺H2 {HQFšb4WX$LXq;4� W[-alNkf&sjW.)H_ M{ *Le D%3*67o-ZY6 h0`(,Ҝ>Brm8 1.^H4089Mt1~ez낭%^ 6WiI3jv S@Mf!wLrq*gz/4*S^ˏ(q 06 )Ii^~~:̗O<l#[_Z\Dow]_ĉ/8uHp@gM?ڽq^`^%` 63B'\cqOG߹f|}[ ja8[Ǘe<l/kb"W@1VNñaN7zsnDww__N�{+[bT5?lvkG#cR[<谆M(ӭ´gueshQ\>>fľ_q(L!uv/\O7ub774XXvVpgg;8vh1ƶm\P,J+ s9L'gP]ZYVb522'ȼzK`s3^=X;M)O4P` #êFbEhh�ӂMve4D [ӬJ4iN OR Qɐ5q+`4yDZz٤#f,k1oU֧mjU@v `%M�hx׍P"TUdR&DLdԘ){%KȒnfEA(EMi{*3�0$0]cc]kt)1ch_(ְ2%jWgLqʗN)ƒr)GµIRHSZ\G 9W!h g2|1fD0[n'KRw啵 ]Oڷfc`?gPo8oG5RC{۰Dl}}ՆN<q+͡81obI_`fh {O=o݌b'}30?`Ҟ~_k]�`bfG$` A<E8Z{? ?`pҷz4o0V,rJw9C<a�n޵ǩeW轵vzMر&F{y(I͎qo۴WyOqj[ 1zy8ڱYGz& nTn7W4o)̲ Ҵ\ 3bm2`s7汵f]!IBb̒TsݬafDJQê4B̢фͪ4ZUeZ7MHۢTZh\62l1 +5rCy-Z5 ԏVՊby3:_E`4`KX]Ym\V<7[Z4%\F+Jm*_Z Ei5:/^\NQ˥N`9ݜKKkZ NH˶դ,l(iiL!I i6]^؋VZkΪsϕREBWe*`urDTep* 6]X*ҢMTX9׈ke,Qz^jΑ̪!}Ce*o06*sѦY -Ҹ_5րCGimo8|O}{~BC6޷i/A�6б'Epk8 =5^s_= bK?| 'XUm|8_":[?Ou~>7?-qgP–[h ~|uo P}Ld{ܵ-n>fV}u:'󱝧o[_ʋ|a�g#WmJ?jKv{Y>{l"5[??#Z|j;%EB)%΢7"ެ{Э#ÁY\#FvYYa3f ^/_D,bgXΤO:a/KĶz-+^zֺ@"#\7٪09 ,-i¶eL1ESE͘I{ѳBBс(�B4y�(UB>+rIHwޘ} l VŲa \+YigYNZreVF4�D ȬRi] AfͷCz="QB!s`4$LЄl,aS0H9uoE!3fA^ïQYa#l>X˄h.fp+clV$L3 (!V$FbJ1d>ʩ !C2WWEyev܂pVobIK^r#@fifT�80$jVά,iOb&e!̍ᦊd4Z5ڪ4H/D ?ZXwFǴgaNt1 S?w4lcb7,n?T>K?Έa<۹ 1D xt\ ~:]Onͩ# /y6xA?=5<4lǝp)+>wGp av L|@G6\7L=32!鋗7~7íҠ40\[=&j)<M?^fqm#P'p[i[/8/㛘e~4x\s1#n(y [ﱴ�["I3Oyx0?Ț�qJH vJLJ2+ոVa58iSd$YfB.šb.1Z?LfbC JR93S eF[K0Tf i)&#օ RbU4�Z<b'/b@(`Z]XN4Q-[V93+kfzGkrK$PD5f2NbrlpX*(E,�)ڜ]8f%I(/ACmS̝h4JHb/)33 @ /r)2k7U2S}AkE< P֜J.MN (4V\˨I8R35zӁuu%1M^27w 5c\f -ְ*:ՐcThǸo?1[6WcN9M;jwva921XoXq/xi3©׾=79-zm?|:~vGi^ 1aQ?~-K'nY{!pwcφ�݃{|-[`CsTfP ToO-ĥ>ù?q)/ӯ_𿷧;C;Gu~2' xwU70m?CB'Wx9dy"^;Eo=n.,<ܬ•&*Zjh"6!\1Sh} 4_t3:bW&(f)kV Ր\z,dtМ^EX#ucNo34$-&3PkޤH VuF-Zz0n)VJ\'w`l\3 �`L-ɆԲ2a +M.tջ%쵹vO6' -aB;%-UegDYsk=L͡q>D07ok $E_GJ2-$Uqe%5:R>$PݿJ\3̚N(eKU&g(@DӒ%Uu8s9˧i}$wPuּAJfYf U!Wh![Uz"TiϨ#(3pE*mu;-/4M7,mXaU5NhB�ƺFt:£<4viI3^f40//@F`R/QpaLEo?  t\r^~S <Nw}_~ceƽˡoOq [p7SOo?+m xwP^S-7V+l?jg|;Ά_rJ__''4qt<S<s w'o'NG<a~7ןi-eк?z8׎XwpNؾ3_^^`vw|2Mn'9av!n h\2 GAq9]5UJ r&17mѮ~UX'eL[ LZ]4MI`$5i- U9E+ U4 IJBPe^fʘ@MVƌ^iCf 0Fu%)2e(X_&SI�pfG>ߛJdHLJr 7*ˆBN6DɽVo *AU̫%0WJg2`IM;iLZ/2%`0 H_GhURO]ҒL*Qј*&Ix̀H#t:[72xTSni c*۝R(@WQ xr;21O 4WŰZjSM]JL j$ĪѕYI$0e`^138e<1F"-bliE<Fhlea;%ig Slҋn=р?1?/k[S5ꥎx(xnѭa-n-o]Rx~Wmk;FcԾPx)[ p}>J4:#wߝ~xﰎ=?|cc?\og.]ŗ?a8>5$хD=|Ļ/_C>]msCtx:_n1yviք:Ṁ9w|j=c1W'| vx~OcV}M9�;n۩/pW"z+5u|=ss-z;J̬1z4h3p#5oz,MaT3$6녇!ˌ-hTfeQSӛ{hYn\LSUW2 kO] i)N Y0:^<',K#e؏d(aܡ<Y Ȍu0�� �IDAT*ATaLpY@.<{zo8h kG,Õ"[�/]^P RUlN(J"XU5f4J܌i9K.[ eNy߀%`3P kf WTP)Msκ~\r<AO"[!1/},ˮ,"WY!fOϰ ,Y4-kŒ ʓh@!zDUVf{q^ QDV%2{k}hfN&SEn4',xA P**hiphU=T A-B5%P1u][,r/VqcWfJ/ &%\@xB2H~Æpm$ ;I'QdLfG?ʲrXvp0`*-%>yb#9G3|W7U3Ǽxbp:h`-^I1voܼSot~PͺSb_7DŠN>򣧍Zz8_m �~S5а}Gǩa6GMH|PŸ9|6wˇ ?f ?~3nt61tOhM~8MTr�uM~~Vx:!<hq6N_hrnfn/ڶyYȘ'2/Z+gwڂdSfr=H%VkƢEK"͛۵x{90ÀgN74ٌfd=4V -*H;2*ϩ}XO,@ krapʸte8.=5w41+-�1ZC`p"NR]F(w4*mlst ѽ7@`; j X ɮ *eTE]crNl4 +IЊd)Oz^WRBUb:Rr,kmX8IN㚩� -^īNz=gBV&LLŚμHմW8\$]p-(:}RU s";Y$c5ɄL!YMIN]!^K2ƒVtT%h Y 070cW�6 i%7e1N‹f?5[Zq. Nmc4a-sS;sp 2𷁟O[>0n'W� ngx<2S揑H~ x _&`Ѐo /zA;m�Љݱ綏aG‹ _ێ% 'ݸ8*vmܭjff[GvU೼7ֿn#ζ9ne1oZhBz;v8 YfqF,$$@r(%Vԇ ``ҲȄEYDaak$ȴ>Q$UWnWZJa=juAbDҖXW*\ $<Zf’5F4IUfEUؾXM<gBeFbx^e=ij{YLy4ɮް a2Q@Yer& .ڢ` L_yN(=zQ<C5|ar.:i@  QDA5cBU Ӕ 2#CuP#%7ה.-9̪EƺTyon0l83l2c`/,fIJ5-3rje r5XEF3 QT 3:mQLkdzn+xY:*Ix-3rfGf6BtZCZŁG"ox'_75lbLXu؃pxA\:n ǁ^g vXG L3\"/37؀5Ęoooxzpl. _xL{1сv<\ׇχ:(S{7>{:&숿C | 84pttG= ~>=<=MC/tx'l?hQ<7/9mQq$[&kT~:vc골۶۸m=ϏMVC7vj9e]߄Pfu.%.d*B(4UOG`pK`Z)3Vb-J;͜kC:p/@\ ,TwY]G’Ң@Ek]U+8Wf:+W&QNFւj0wGh̜^.K Ί1pKCy9*Kq8T6*!zm_4Hڔ6�XVa"LqȺRk>h*K6;e \%NX8Òl;*V&$&&˥,/ u"+7r 00{/9Tx"O=܃pmvm`Tڇ?_,JBͷfA,])039.~(E{.\p0{(D+7Xn!@U*U6%Q hS*+$PaMU&zb2iKaUٜɸܦ3m( {M`.LlC}O< zl ^ݜ+akmbM>m<|y0ꡍw~. 5>݇h~SsoyDޔ?t77q�!̏h;.7__?/3 ]_91u)D W[tsp> cF;~󮬩S<߼?>7зGOt[ae˻֎9y8#lGLR)DS}G <hsl9?FKeWxj$>x/EU 9˒Q5e1TR*G~˜vE% R ]w,E[Q&[᥋s,HL\q4^G™Z)J^-^3Bb&1MQ^JHjĴ)RRE(A[%$w7Ojmbhó. x87eR~_OsN,N ń& vl+լ xcE ak:)J0˜ҞJ)Ky^it,43VUZ e  rMPe+[JZSUD X X&/ϜpU]֌ -hp%Zvyom*ł㲪ǒfmEXl{99f4dw3,Sj#̛"kĸ]$p.$8SH*) aMUD2+wB k)C*ɢJ\N% ('!䘆{z);鰗GouiB%/4soZ_|G@ }v7Cby <2[r<3 zwyg5?7]0!4a8矡@8!OpUu}){ �pjx�t?8<a{Ft/^1 O?v7;ـov`� U3*Glky8M+ëœ&yAz˞֛$EDO>ߍ~gDD>ioFE=K<OfV~0Rs͍Q wŽ7NX lȢl Zka7`D㺷[WǹFLjQ9U�eX8I$l=f�P.Z?�ť0#Rt ũ#kuzPEf^'(k4rU2MnfY48Ye 0]AP\!k͹HUF&gj,(J{X_cQ@um IUpBo zjW\,]R)jX,:, nE J$$eVk7%.wF#LSs}'X,! ɮO-'a0Pn^R+ulҕ9p[(B,otD0VOThhQd sqHts�R:>aߵ.�@DR|aŃ+D[9Y\ h2('�hUlC,\WvܾH{ݜw@s^_>dzLap T m_Zxq�n?ԑ?MooÛ/~'放^�oW( x} p {ly߾lutlo o;zpC| oޢ}$�n9Bats5#>vf5& o}vg o#_>)�&f1Mlc9k@R3)2ɉyrX MopwEC)^DŊ-UX8\+WjLZoJHtLZ._ܖE\EʁZuBYȥyVL cjQ2N6 Wi*\Xz49}F0QK͋B @=ΙIu_XYyW3U?#)ו2 Rpت(^�,l\ʀq,GJ6m[frLi "=X u\LjHgUjq8&*`*˚Is>#Լgl5 GXgP˜5v(tXUUL K*Ǻ.g@".W.d̃t-魪qaE^"Uؚefb8&N*fJ3Q`0ZOYJ.?@8Z+~!CrIЧ ޙ5a, (-)ziHf^yj3jږx=d@ڕ]8ĵMjAfn<n6nZãaz7v팿~sx� w b~i.q_smg΃=#|OJ?ŗ-|Sg (Ԅvo{,vi|%lj$~VE]]D3p <�;Կ;s^msg{H* 'w7}@0hbkKك_HW4_?/Su+;EcN̚ltJe%֜)\)/c@B.*̃!3U + l슄^4.MU}^.vw8G@;*e\gFhJp &\(=_ZdT kZOD9lciri*2,ܗGl tA Ť y"`W y}5%pLOoҊ*ۢ_G+*[MwP"-\; K6Y8Y¨iHHYsͰdFN`#8e.KB\9PU=,nNɲ,E8҉F20)R�UY9jzE'U+99ts΁%'5" ,rbW9 P^+\^Y_;3 ք+3l e 3sU\V*0BFUf&`4N Qr_BLU"(\5\Uf*vz`\Y_||5`U{uym3-La<*O/tzWQխSeOE"c19>w6j~OG-|<>fm<˺4qw=.>x<_ly>~εwÏ;+O7 >f.༫FW74{1r> 0oOe8];_:xG<؀->nXu%nCMV(}kj[|zӧ<]l~[o{z =MT%j~ywx>Ӯlo<|[&"b/ٴr#JPR>.fkN݌Aѐ|mўc[VJo-+ WJ믺cu}!ff9U8]'˲x5(CRj22T.]N wz\�n(-P"-4g}: M)LR5} IxG#Ƿ%%*߉oe%^F^^4譛*2WJF-Q(ܼ3LJ{T,�blF,Xr8*EIjq Chna^OAWR5-*w ,pReD۩9sΚ)dVMͷ|@I© ɜh@�AҸm 36Xrw3KV3A f՝(adAHkaaNa9'4YleWU,=F'a7͢,QIHJ 8lf4<Ÿ`?1¡>sÎ)xȼt<>q|9Fc6~K|yT[y}za{K1r6>><hC{8:~ 5wvl}~śf8ܠm8vƻSϹk(MwoAޟaN_qt׷[m 0Skvv\_׌c"^08|wDN`q?k/_ gʎyٙlg`p T<^y[q>'N`>-D\! 2Lܒ9Ȣ]hukl 4,"U0̾+X  zk= W;PBf%s`JcbriʄX}C*A"ea݃adf>"=Q^ ?oNyXi2Qn03ZgȚ#D*jYg5fإCb3�YSӶ^aŽVXB4Kd)QK;SUD0, מ˄n=h-|DujJK4& }>S^iGjh&TU5g̛\ufՠIr4aQ5/ʙ5i2k9px)@8 ᦕ+7J/~99&ӜK'`%oWmqMy|KtEI3>aƽ(Ybt)C'^3@3߫>ql}>kJ2u CMOp_vUޱŸ"q6;}o<Vu6x 3}q%ڑND }ߣ_W L3q'8 {?e3t9@8ffp/90{Mv᜿x {ul}GÍ'{h87o|8g]8Ys|(߿y:\`qzK:w=f~9ָ›p�;R;Sd;6TJ9t04'ghl I X+7'PV]#Iw1M䦖*2#:@ :+)kw"ʑcڬZ9js"gVQMUSsy&Rrͭ5we漸Ƽ$QnyM׾[".U2f=ViˢUL}cΎi{tW qP9KńKJEHU9�[~jq̺PҜdpЉf4fl2)_UɽT<Z%H+p k�� �IDATJ@JW;iNwdrM\rBAdԨ93m̰uĒNS§kOhs9z` ?š,`߁d-<ZrrE"`; 7+[@!Pt-IMhN>*Zͷ|VSɒݡPZ]]f D3"UC/琏@8~wszJ\J=fƿ#z~QrYw;e~679tkf8#o Y震 ؜?p2W`Acѐv}mC:~,2 O;�p'~ݭ,y?=->)xoxwp0=Nͩl<ͯP?K/6w<.ocbT<ïn}\ yxa_pv7# D;; vJrG6/Z<.ajm̹CϨrYG?Xr7_4յ%h>J:#l҄lAuborK]">-ff &\ڵ@ZJK5mNLђX`QvJPZ %T@rl=%5F307__ PYeڵDyUi"FRy63Q1*ibsQUAKKQDZZY*D2HZ~a=AMlQ5GIri+c0`2C*Iwf$\�)!jXM,[2+(*rU "9Լ䀝KKAZ9ȅc<7_Q`Uu9ABfM,}z3SUJ,[oӴeXI67c#38tCV9fq+Ɯf`u_u+# 2TιGYj&|(q.e"~EJuDqNCܣrfXl<vUz2^seKŋF YkpN|bUqf5)~íٻsydzRO?cC@ {zx ΐ C?~ p̰M G#چ; oF?b?'G<vOq?q淏? G7owꇉx.hv3~M8~c3}{NnIo[<ܾ}/B'ᴿp{<?,|{cocͨ],i#`(uo:<@y}<w+º#&mOQjݮ4*$�YܕU 7W\{g˜㼰Mk#̃ѪNYlX7?N+Wmל*-dXATa62V[P.@�d0,WlJe[4AM%D3!FKԥl'Ea+TU351]ebT+'k&rQ*/z.*9 sv%ɒkRkN2%PpŔ FCep#@ Ad`RΒeLe9+E/u)]]רX[Ŭ@GsDV.u*kThhvf&.�_#g`%s[ ݈*HrBZ9NN [*:oP͜J('#c)Lh=Z*YeS6d4*,WbC!P{r2K&4UlVt}in VPi3Nr4+&Lgbw}7rKKkb=VKj)l>pqӿ1˙i\/7 G'RI1!Q2wڽ +Mwtj$}. B,_�D7-.�Ux=N�|[ W7՞A>yI;E e{ۗj#c`;]n>='L> |6k_?v!&n^~|S÷g$߼9`XlW[tD8n^e8<X9A!=ي.qnz:Py7F8x8YT$ eMdK97 l9Y9dVIO½Go} 7"W߮Xb ծ*e#�c!H9]24M�Ew[&cw9 Q&7cs.wL(4'Kq@TVFs&E)](qqyF%"U EGu r2ɹp)|,Fzz;hgNi=%AGJ5j*iUtg%xi^P:sO4Z݌fB0KnFwK6aŌZ& )UJm|*ż1IYiVUIMPK:g`GXIctkbP!F=]jyՂ*TUFj<<͍%%*K݃qaff+ʧuօg EYB&a,p>?%ɕ9f~ߋ_&k(cfZ@ jmĭYNBh%Z"&UYnv3[5Z ̌}YL-_ZfP+DUb9'BFptYmms-7mB1ӡ K?DVlIceU59uPN=96>~q6vublv~(^;}}?ay{y쏨0h�0{a6$`Dv�a;v2Ͽū8 sĩM=|{3 {/oHγ_mf-<Dh^aSg<xGw*w<vw0" P{@CUYB`^զnWfTi,h: fI`slː0" Z $J&X) E;]跐θXM@|%!$җzhl 9 {-vk\7vR1HI)_u1q%2rUxhtqEMͳM#"X-xr'M:k\POGSr43tIsC*]$%rbSjzUO@t\Br9G]�+tY5_XP*p_ʤB@6wVȌJ4٢4R)R[,`39Gl]+QSS3URqy02Ӡ^fw3gԫuj^\9($saq-J娱}ЛY[6J)E5` )['1,ȭ9,8YiUUsTYțE_=V$a4zFBVB XIhS9O8e]h"-*d-g4X-J4'|-зh}7;gs΁g@#Ca'nw~Z lm|;=ͅM{c^ O/xCn(ax ́"_ 掏xw 0DZO:17wwW/ozoGSWw#׉H`~=.h>`Dw} mmy?bƿjP>C֠ן~O{i|ssqi5t 0mPV VC6g38d تje&cj嗗I% gը< (YU9B*|"C6w-Ԫ>` Vj`jKA@K]&H(NupuYsEq]ǰ^ q&4  k*(X3<E5#%ƹIAn΢.94eFd J637 K%i֡i2+"SZ>̭r36k]̪N̛VTF4\$hWb״J֜s @R[\= 7N͑9MqGQ46\�U `Ck:b5"Py` *t@2Caf{l[ Ծe #)tuȩ)J$ŚUN̗4:J B 5pT$? |F̌pMg #ᏹZ1, Cڝd7+d6+*`u z3>nX 8i&8|*j@ c6:,ǁquUu'^o?m.#ΗKEijT[.3-'[KL :fs{}K `8Οр|b?ߟSpGsO/i?F{>W4kx8xڰ =;N@ޟ',3gഷyZ]x1[~qe:f[XA;,Vo m/ŗMR|1gRF80]ryn(Ĭii&5<RS(T&7mFXDUQ6 *s7B2QBWX.AZ}d.az h^R\pޓXd[%W% KR)ZtW\#TJa"%$}-4 P.(wAe06 8(Aq@* 8B]J WwN9.E ݎn9 !8S9%2*}Q(j`BrzB,v9|)3n$ȞYRsy^GΉ)L B !Dق 9a4зֶe-?)aE/rXjla6-"09f^}sP9sQ^0fC ^tYQ,|QRUʼn1@k_ -El]Z>fâ:e�N)[BզTgf|y*z&SsPf<`}8~<oHܲgk&U+>suU#/>9?t \l̉l+UO7?~,p1Ua;iw>w�;p^lk_" <?�^h'=%Ѐ>^ݡ5=$`dF솛ۃi߿m% (T6pa;0v:|?|7ϝa c30 M՝Fˎc(҅4=y7Y y Iֆ <:\X+R")KY!'2^ݶfFgAt-s;dE,Œ $d²X, 9T%O(b+ĵ5aDjhP, +$ZY3z L1ǘҌj?C**/*3JjVb}YkͿrA4i1JQs'g֚GY\eEZhVT+I_ KԘ[9' Ƌg3e57ۜt7P^5X9STUӪDcʀ4yֶւ Sg(RP)S%@f0E"`y;1V[rf0272욬GKHF_@a^n8]rY-^4%X֞,U@ 'l Pʖ} " ^ /O^|z܌UmZ)Vgl/.m3OvT.0ݔFɗ<!J'3y{l7Vﷆ`w`:6[S~V_57Y C^ 񟞽+';1 ~y}_}{{wE=7@6 Oy7|Ky|787h�xq�Tp>![G"(Tao:~bG3O1;2|돸c}bqHm]?>na&΋&۽{> %281B&34bdvySnS.88لMToX<rԠ%PcY!,�*֓ds#lVPrM_3hzeXWܾ,˔X�X3)$Vyt{ƚ% J@Q9̜.&̂on9[pFܫj DV;mUK\a6*b jR;2!6,(jQؾh}jt] %YilZ6S,IUr9Ȃ ҙY$psT&JƓ9B?.Ek)xŕ'ԘS3Di#Q%vh(dU*!Kc"q[745Fq�cy+Ug]v]sQEi5QJܝ4Z`k-�/45JҬ\|U_4IUZ8[Cc]Պ5Xh B%CDf皥9mX%zr`C<[K"l{syO6.}%'_;xmmo/N/_\c!{Ef=.8Ψs{? [gVn9a?y{q|ю*޾{zhp \ ;p5c73kŷxm �v`Ax`qІH@{� N|pt~A<>]|3Gԇ}QNi 耋=Ѯ vYrX==o7ymlTTIy-v7S0CD\F4rJ*s Q48K&0`"+i6`"]wV1wT,(oAy#!6AM'e fVfFN�$b= Y"U^jDk ,hFVڙ,fb2!`B!P6kHEbj*Km4m]sE*JR,` XVXU+i %shʉ&5VYQJ K!Ep̆Y:xK&DΨ4ZjO@͕  .9L9@P c--&`UU,ԂDfQ C#4C a Ϭ@eX0 8JmXj,v le[n _R5iVU[gwZ4[ХpzD!Fk'vCRYly9!hM3"JaD|5ԏn{ =]z9F.|߃[ /^d)>a6dIsG�~[V>v?߳_Ato[Hv0>dX6koۉ??&?^ahvA=cp 5"^þ :8�~@ /_b [Dh:~<}FÉ~/|>?֏Kq L:�c fŨ׬!vQ\"ZEg]cS_}Q,UL;ِ ̙p`_Hhb%,$:Twk` 7%r״ (A-ǎ `-RPBhKcXq' y /0eyQ2ZdUlE\,Ѽhy'B)I1H;g~0c*/!<%]G-)MJ/u!1ՕN +Wz9v x^bHH*S:dGc :Re5K<j\4w\hCRau�k ( M3Y\¤oޖOYUsL00W\J4!-l"}2e}PRs䄮cX}L!XՕiP0j6VoU.�-7 xUI@ Q+7vU�3ULfS0&>++_R|Mi�� �IDAT5g)-^IG�{fI8yּJ31;lmfC0oPځ̋}>m6|\[ax~gOi7_UN?oOȶG!Ӄ}nɧ=l{9\N4ao>7cw/`Dơ#3-= O|ƛ/ׅ 0># lv #5 av ѱq 6кSo9n؀Ou�SGG˿̓%[4}*Ĝ{>L;_۽Y3+fIrv0:aR4Ur67(.i:Zt7#> F8r!D# 9%U SEÕ嶜eFb`vxU^b:ڢ2/fK,`$J&j'rR<1)w4Q_*"[q҂gx65U5Q�z6byhrgkpJU:ԥyS[Kl&$TƋVdmÌV\nUIKD9j:HĂo\4UPq.̋%aZht\nN1;7"J5}Ԝ8&M~}Ƭ5 $Dbju`ࢵ8D77ӛU %?{K`/ʼnLJP:MF-Lu X+Ժꚭ.ine`NNJ Ty&(1)9op^$ե80ר5{lњr.~:p~vx/49z3H>}Kۅ񀉧{Cn'km`8rb�ET]jC m>aΦ)ƧO/>/>a {%rCwL"gOsJ?6W[\> xɯ_t| .оG/q(bE`�a𻺹{ڭL86o`5pҳyq4| q�`9Dx!&T'yz~Bl@O<?QL(W,t$ay[l͌*eqnq w6 JR+JišMpW&k4٢-0 fI$VJ# \r0TUS*B`++0\RՇ;a5p*hKxgA@1!LSM(ף>V o4.QCt`>X,oMLf-):׊"0"˛WCJsC1 35km*MD"TK,fYފУh\ŵJrcPati2k 0 CȄbAZ{c&B*&rH+<یMI/AʵiWhVbʊK>1NtX"4sq{ee8i4k3!3b{D+8y0,Y4zɫ09@oym4{Q|^sP)K_Rn-oi7 䱬ظuJ,ß<=bsGny4}%zsoo|:|Cd_=ߕo �zggn9MP?qxXo۷]v~f h@~Do w[~/%j'ho~x|X&Byf0G[v?U~C 8~y;7Gdgķ|?^Vlz|?ؿG7!nz3=b]یf|iƶC{zKc̲)9af +d ,p›|M փ0c3fnTR%56 2(],m=%Ŝ0-{M$'Y*a23X:MN: r1 ZF$AokdM,*"ZnFC!d KUHi TDC6-'P<e)UÛGT_1>S9&L;j))\IK'>EX6xz{muaR:Bo`]h*K^ۃfpG(&4w(`Փ֭88;avi"/c^gt+G2Nіū棪4d!iX]F+r X~^HihL&BFVy/*P ߭0 +!5 geJdͭAnr*L%cyA#-%1G,󘎥,t1)u|{U/5Y`mU!OjV;\'awMi5nMB;ݦU|S lЄLwfqa_��#?yÃz!;lI3 Fx]g;_] �Îqpw;8M?ہ qo w|nxxgdxwxwx(3G8oapnWSqS0}�53x(B1~ ۷z˛ÐgiGN5g矡MqM!Zclj<CUʜIffтFB$+Z57AtEGݢ[4wkJ쵄OYɋʢSo2% f` f96W&4Yi0ºPYvˆ̛5l*NF򂙛V4(2[1`.ac $+Z7/{;H.>3yÚyXu82k{vk?AX}24w8me$Lޥ8Ll,0]f.Q`ٛ7v~cL51/^d&b s_yr`?~ *,"GEa5a$Wl E2%ɠ¾ j (A AEa hB";\?5ZXHb„PUULjhsw¦,A(ێ=-'ĝP Syu: Qgҝ龡c7fOȇQǎKyO7Qߴq.y9g{߉F?z{xߍs_7k|O~hM?{@N;40Ϗx?SCmC�hv||mF 6w8{ǚ`=3{�П`)n= k&v~b�5 w׽O?_h0{}| _W[#¬U"TMJ2jfBhEZSSh9ym9ap65n nfXy \ q@kMm@ ɪʑk!Řu,+4Yn4-׵,K(PJTeRMkjLVEv=]U5D8BhCע*PiVIrZ@KYux|%|?~HiF-f2dj5M喔]Vh#i6- avdT9a'3}Weq v{XqC̑s sJIUTɥB%t�I`X\(1Vh0Ȍt|LB"$peMXd#$@pTUDyuJZUt&kmL UX,YPOms3X:Y٫ۮsk&Ȫr.$+NF<.<?ۿ;qi}Kx(ذY=_o+ZTAwϏ?_B0a7GznR;>[l7{d- g=?eX~ /a߾Mww{D'|^[ ﭵyݞZ}?_gPO_@=yqh77zLzlj{8~yg=>`8| u0 &Qw;o66>fޏ-~kۆ[}kAoxk{8v/M{sR*h\kBUUbgޖ1$]qyft D[;?˺,|)7f|SeU*Uc0+9ֽ@FDHR%9BI .E?([wG9li%\!lM׿JPiP =fT 0 YsQni`6UioZbcE42ThW#H(eEв)Vmm]`B8^)Dh<5K*fZP{^FV[5vѣof46 IG�륖l`'*u]@ft*Vb*,}Pb:Yeb2FLpH i΂`rn ei_`ƪ/ -A22>BΚ!|SWHM1DXNp}bW Hq,"ێl@s Kb+Y\] ~DLLSؚt NjfsϑKqJMրf~;Fqx'^i9x/7؄~_bva2T=;+\׏}.m<<`lwb] g#~7_46~-~v܎PǶ7.�?CoA}z~7Wwp3ʂ�=u�H]=n,ɮι̞GDeetU7]P4j@-p @?= .g |G,#3"ٽG ,.$FզPʨJg={|8bT&a^m?#cfBT]/V;HvI$(~oqk3wA9{ǭJHqŖB­XqXLr"k?V3Ю餫 :K�13#r)I/4e֍n 1`%<I+:o�r: LkK~bSAR'>#4#/ P\) dEI 2i+.\(%f4:>~{<|EDT ALq̃͋QEP#sFv0˜fZ,&TF̥!z R@kծ1Z+PO&Gb,HU ~Z.Jk")bD1pPdR^r_kIV5]HnD̄QOHCn?PNa$"]+ s,A9|-רJ45p]A4A"V"32M1ҴG2&pDj|mbb2 "om92=GfV \P2w]s쩑>z>n (7!mHdpiW<[T4mDs///v{ 뇗/8֧Cix|{ p?O|'P?#g Vk4o[14MBz<?N^ L!9hwW#d4@ =0Xd8:ʬCyo qs=q Z+v3Հ|TnauVO|`nAqw7oy8E�BH]Vx}+^MpYsVznLZ“p'r8eF\.V%&9S354]qN[OT7wpMcL0 ,\wOȼ5<qQIu-U+ "u6µpENT&/vB E2IɂH@sђQUE- 4s$!fHe~%s>RENrDȋII[~jm^ّ*d[1+&(̴r'FJBTƌ>H y&(Z8ƚe)tLʴ⽈TP*ÑP.93F/f,d v-d9v"öq떳 oJ#`H,$jgrL)P,.S!,Z/ҤAQZTSP)ϙ!4Zq#=׋HuS §TwGdtbZrܲڴ;2vQv qL d fAhL|Q^rvnzAh9كsŃs9s_+F?o|,3aZ~9_DZQ7 A,35We p00x jD į/7 }8aZ:w?V!` A�yG;< O ;6-W ,0 rCnK-   ;|<k>\,=:A w'D!Z7E_lkUÃY*B|܃ψK4r(wv{[^C7HHt4ܙ9/r|u@:sƯ#P]&hu D0Uf6"+X[5}1܍nhi#JH4-"3e*G)fNr>$R�1@ъy1o2U1 tNwXhIsNw(<E%D@k_k aE1Sf3F8cNLY)P3BJ1YKَ#A [қ;ӃLy@I)'crBc1GVsy@̄r* /*!H.rJ^TE5żFrK` h)5G00NuEuY^3.b.P֥,K!IZA9 FU6b׶C�[E CAŊR{3s=vDa/uN(lJ^9a�w ܤJ1J!iRS{/o]a+n:let},7:B}|<FO&7u[7}0]{[E īB+Pgأ5%0`/Xɣ?`ԧx2^ӽ% �<(q q_X{{{oώqQޗ@ 21@D�u #6?#=s>^q rJ e>9{}DPtKvd2ExZ?]mmq+ "]_ASjlkrF΂A4t݊ )=;m3] Y̙sK�)]!HM_FD2s& #/%㺎XEk-^WֈŲЊkC [Z_Ӥ\`e@6�0$1L Hd0KOmKH,kŜT3@Ki4Crz53؄|)X@cZ&( dl  qD,ӆ!Hnk)Keyydn7Yjpt}_J3@qZ\,>̔"gvUVS3GĈ>"颫QU5](n(tJB Mĸg^Pju Lݚ{!ʚUd31FrT+a m=ifH13f^<‹,ZB(øs)(#3V0ԙqƔ&p֎�2u $|(6% 2,~$R9sG\' WPsIDɽH5jֈu@hYgRS'Jpeц| pG�'d̚n&.eLc>ox}S}^B௧wo2Z9tv'aBXv{=lt|9 w8yۙo)}�:,[#!q�� �IDAT{8zGuce6gZ}=>`ǽgw#:P 7%QOFf5Qa#s+ dpy$;XJVj0"W?m[9k!m  `SlU>S}wnp#jU-Vl̰ɦ\ s-4Zs=HLEb "T2,&_kymNt53 sj4Xb*J9$֬e֗ 2B \n&ڐHH%3f\MB4']uRlrnSi@ ody$;СlB W7[h5&7RPhp4,WRBvAg`r[skG*42ffD~ٙ,fC"V/EĘ^xu` m6_K"G.Eb_؂xP ֢Xv4Y\"*'2f�sd xrJhJ[5$NJ9ffWB죌 hιuk ꪖ\FC)  }?ete%aPJE-vnK>'J2OI L.5]nM4p8p:HΈ7~<! ' L-$^!\={࡚0Ռ^|�{v ?\`8h/)K_k!⻂oOqCnq>Os q+(<n%P?~?7⦢ ft&rnjwˇz<}d{>i"[ 0#c4o#Rg{oxЬyiv8aTCeOܺ꜅S%i͈7uc-(.VYzq7Vb11c\ 3\\u,)֗z&h9dpZڒ= Zѝn0w԰ׄpp&XC &F8l{ �2M0´*L V^d4_ EJ!\MЉ⬥l^6X:s"&&+rDHpuMCXקQaӨYI3w`Q|b%P:tU YIgϭaU V>@*aoTk'Rb0$8gV\N:;Um5[ZKé5DDZUI3_6[l B^s,(Wj/,0_1w7/(k%P,joh[CW*, % Ќ/5{߳`<Yd Τ-g&"Awbax]O\˯'nj ;}=q?kjف/ Q%oN((&X{yԃٹ<ϵ>]j6zV"A~jO"J>;;%pk>4 /7>юOY>Az>pS./2 U]ƻϥ(GԄ P0_}wTp{Rgdqr.|hXc4+?<ch7*@:#n^jwEj%AfG{�#u=ˬ9h9 qp sDmVc>B#0&BӰ.MK.ݗ!W|H^J�,PbFt5~R9!0{ J&rOk ,Sb.k}b^*[ Mbi5ZWtQ\kEO7;ɘ_ KBd.AX"�( ~]G"$ž@lnي=i(n�nt}e x �T-ࠧR!!IY\VB d䀺) RE> yu%C%ttmIs̊of[y#F&CZ !L!3,@VK5 0dUͬV\d0pmtLObՓM0+ (MWcBZ~i_޸k.Sixܟgϗ18D(JoY4[ p͠'DңUŭUz^ ks+m~:ȷ[9毻}7: )=Y:7{vcЭ0i}ǥcInQ*ci[ J?=Yc~c o ˣo�8~"KvKKNmzS`_ GE Q'||4Ov�u0yӢUHM(rcT#Sjpwo 7YJ.`qFZ}8ȉ8WN-vUl,K\PfT%e60Vˡ֭\~FK&cY_ JBҺ>钐WLZB$Ibb,io Az6s@zm>W fɉs}I/ 3wHETQkf\WX_`\p)T͖(mA 5J Q�X L#d&t KŒ\Wv`kuhnne>65V7QKL2 K9K ^fHn㔙 H6 W·\)5DenՋӑi qD^{+,%RRA.,R$CqAlDy z5XȴL^EȜpˀڐ_eKך5\F1_/4_s.A4OqZH2䠦L#j-Dq8.9!/ ~_RQk?l@Z1/y*qo0{l/8 %Yr</b=YQP 8&X{Oׁr(M`+_C~U`�<=&Z g_z/#uocsǷ1z ]pC _p`6D3Ĝ@ 8iomm^t.zeOͽ{k-ʷUa wD"|,GSq^fٻSx4i05R`Zv(m[j97g͒"[܉j╋jVfTf&0O7K(i\\Ph덜B@ދKEW5C˕\L^yoI|* (Xzb_q&8Qf 'fe LRVQV)ciU LR0�s|-yz Y0 +֕tQB\�$=f3i-% 8&ʎIOX ^MFB[D}Xʿȥ֮fTHl%at JRcj\..C1>%JkhtcUS9WQE@RU4X7]?Kkj[@،Mnfނeqv ̮sР1Lp(R EĈsΘx!;q籺IuI`f# +ŪҙĴU]9O"/MԟV?լEuh Ym۞/AO^09oNyGs-_z|Hx 솷cb|p m{8X*fpciqDG{A�f<C_oE!p;}u3nzyl)a=gȉڟxS.' ;(mwL@<4봓 >?XS6 �3 (ctv㼷K6PlB[5\x="ƚ\zrhakJW"õOID2�)xaf1lemX,E[ip![w[U�@iJ*$\s0<\@zd i\o5c0 5hȡd7t ÑSH\ "3%yM+�ęTCE\Zt"k8n9!RD;עRnS"a R(h�c HM%#rEueD4*V+u) ܖz^7ax<1㢌s+ʈfd`(UHbU*bzT)󚊦I5">t$D a, 4Sp^?de![˵E|_ZK豏sιkm \f|THjkDݭv HMRl=bX ͎rbvh~YE^Wb]=1&Z`/'ola/=vd\][NqC^γu I<|>ۗ n`<+ ;l8ԁtcj`?lxXk}x[[y(,otߕ4V;Ѳ_o#J}GAP& X N</yu|eݐ-XŀȷO( | =?r<lo™AeƭfA]M08]VMjv:wNg =Mh2׮o|e&ьӊW mYR,i*d`*H^ z\Q&> v!"su&D]ᛟ oW>$iiiMXRȡH*s(v(0XiPd+<W6 rPFndQI2|9s"xͶRj˻lK6Wp�MdYvpm@dхP!O , ̗l@iVV&9 L+BGBO,$R=)f"fn1Q@RkcnnVa5&D.BWL`g,D1\Ja)p2]hH&j fᔙ^HrY61g>sD,]kCBU[ʏ4�C Uf9L�F|Ɩc-i2nࣕ%8tP3$(]xy~kx*D0_EzKE6d |5MK`'no7yDF&ec>y .i 8$NV QnPl/ gx:et} >|^o.<7-^DchcmۭehmC֌ǢUp>$">՛>/B*0=1x-Vt~䥳`6 qxr]t5d1Nq4Dl7߅Jr{%>>;omϩXP9p%S3B+)εB�`LHt@MU1қ qE0L,e&M$N8R;Үu5".Ku $ ͋L3'rp0` q<WUu$u=(w`Zn�CfS'`L�%Yaҕ`&ܙ^ Ô f28UYH5qo*[RQkmJi 4 QWʀoBD5Z34ˬYV½W׬ ZuU_n7u{cfZdn )"#<B ^ }Hv9JS-]?jnՖ=$UR&FH\|S)wܮM’\>@ꚡTG}1f=NC",\!2bf䌙=3U[i5GE qJofJp&=-gF>SQ8g#. 3VL sFgKK4;f?^[<:<PlϣRd_�s`NvS#bOjƀ !FŸ8`PC<w(orb)=xu/6v=ܗڷRYOW)˖ о>_G~㎖ֿ/;śn/RY} p/l5G264x)aV"J'4Zl}Vq gl2Q}}mS1_`1wMM<9ʤyMRjL?ikuzHehq/OksMe�[y+2 ]eW `M.!eIp=DV@EȘOYҬkun!%E:4Xe:'2Wr aP+5+:h +Ru}!M= "DfXiZrᙃi%tw&#spRKY6:EfikwM ׆B^1Qx@;WjӤr-:ǰ�SVQ u_hin^P]VާFK0PZ2bլHYY‰br뚽(u�92v`D:#UP̙Wʺ:c6S'i&Hu@7n((\/qa&fPR f]13r99fRP\Z :03bfDly`LS$5u kaĦ FL"3FȽXϬbJ ]~/FD|tՐ, Rg/0oZV�}?-aORl(SEyfHC&8M]{:/'!g/sо; {E>z"'حx6OdY$8ߜ;?wٯ뛟ω/'ىM=&j 4@>E˰x0ć_8ѲW@<tQy'%xWy+~yQM?*:]" 2aQ|?WÛO&Z[cJ֪E9r+E4f"4`h"skPchrb"B3#Z{$h8]wX<U͂\%tH,wt@BKlʞu&7\EK,l(nMX&.sԐ2"I/ip+ Y ; ,ɌE\4mU#QY묍^̜@5E(}~JbYPk)J4ZPmQff{NZܽeHcZGV:fQ<י1A5[8ȒY(&7Xa,\"IIh.�XYD.ga&&JC H֧juEb tY^+vmjfƈ9HOY4KI h&+1/%#4Ӂ"<&dSu(TYf(Md SQ9kP{]=<xxx!3>L?f`s5XQΡ_痿pXǖ@p}=Z۲Cz=ě』0?7 }=Dz,[9Y]UMEpFm40 r b,y 9 #w(�DgdteEfw{/eSeFf$2^sk}~/ _�© +Grx?o$<m|3cOw/7ݹ÷vt?2mM!2J3-6wD_;qxvbb.X}2{l69[LO {ȗG;um̃P-0a筶ۣCJTEj)(AD_7CXY5#EAs05YJ) j]'DTM\댕AX{Yp9UK^\wlB$Ǣe%~uZ ㊽.Y;R!T>LW*DQ%EIj�� �IDAT_:,͔ aJBH^e\~M%ȥ4\ q2byj.3'+Ί4a!U|lRr\EWA\k`H݆qffB&GedEUJ1[ķtD2]Hr%Ga+cՕ nbD FKrԤz&$zQp^4LiN1`UJ'RM.f&zmCFm\L] ňJac!0IRQp1UY%fq "QZuʊd*Y90)&*! yHj620 JTF%jE 9 "TMq,!K٬u9ʎLеJqY?~cc?O@4j0l߄ǸofCAx<jqxo&n =Οĩw>A[mk_8/:w[zj2 ?(~@Nqyز|]æ!ރkO|OpϛD=0tx%x|,bj j;{ mm<&ZAukGvu'Vo~jM/ѭ4+e!|O$[Gl۠hPl P6֖^jl>`%XFS.\/NS(-*J)J\Y(ʲXJg^)Jq\)\˦Ÿy-"TᔫG?dMδh+eJϨ@fVd0LZtUXɚPC*A9HlaU%TP�Zûoե\ݱRQbcT QSR`FN͂" W]1�sGK֋l U`(u$"a3hbE1SAT;SG>]b2&0,D rE]I%A*Dlw\ٲ@ʧ|sr5RU/\YYTT %$5a uG$j/xIS)V̪nK)M+ME\#mf~/QkY!}o?_?>ξ=QoRoq9}a;~v|:e@ݷ[CMC g޿zc;`k8axm@=ӜϹ7OW}#N_ݝq_<FNֳ? s\h ћ9A% 6̀^%"q3@@~;/G tB^=^5Be\:}z})z𼀅,.́ܰ#u}�=EgV)bbSPXiWk_AV+QXѡDF[.;J$ERVdU(A0U9~W\vgŒs=ey[, eUV NtM2&Jd&XTU2J *xQIB,Xr ӮQ\E:<SjS7Tj.҉9sGeU9ÄҡT CRJDrIB,AQu)Pjf F ݥ9`-Y5$:\a %4);tBTSqry9֑PkF\ˍ׭"Q!2ICQ'T\]\fW�JV,)7�׎9D0jSS5z !LY%Q9sIᩔ0C (TVSnJ&[#$+XA]LTS04GÇ.e͆!1xL?oW17Ϯ;AxZY[;!s xɏ=H^|2 }.Wpe%>Pb3Jߡ)B }%LyCZ޶9.{;?䔾 3w~ß/з zlvWxl5x"oV>?^-JlԝmĔRckCKOV8C/(7}kء`7" t(gO6u{8,J9 5ȗ>Mo.r8j2(`DW'lCv%f&X,IU3R9ՂDi@"?NkKf!AaBdѪBQ]+) �sX_LaA9ڡV BJAdUH~LBD)BJd+]ip$υ]T%a, dA^G&ޯH)43T2ĥ-S)ģ(cEK0$ˬj VJK�्Z(M)%v2aVj.kw} lQTLn)BIZePT%&Pd"!( I$Kj신j%A) wXI]OO7U\M]ejQMTB\MH"l9?s$#kLBW:JeHիeٓւO&F[4/d$DR2ˡ1YcV'ShNhjTAqS0AʣTcvzO LB0ea℆oNpe녆Ün]/?G<' ցB7]φ=1 :CO/__s kKa{hh_b+pΧѱZ?'55 =7["Dv=>[W@9LoP@Qа pDԃ͇}y=-ڸr+NN<{vO9oNdz%K˞{joAh IS$JUȘ%iSR2#W5"_2ϙUT!S bX Ԓ+&"bhRkee,br|*?5^I-ZX5aIad!cY5f׻B EloӰY"I͊eZՎ$Gr$'Q"JTͲJ3UlSDI5Bٚ ؊2+CPc)U%3keHN)(ɄCJ5XIVj(@uoa Q#*[7,^FQ+twQ HɅEjz *ߚ"(;.4e:5aӆP XMjV)*V}TQUł@UeK.j***JX x*Dԕ!dEjE&2rH+Db_uX"p0#>=`.o8L<[B9 r:bg<~S7ZU]C $'O4?1҇ԇg|Qr)MTcx'}DAĴCD.1hCw r<z7Xq4x ��?/^s<8B 17yg^Ϯu'M7Wz5:!&YýP߫~='0W+!#pp<κ7BWX=`({m杘y<02C}*_0 uoph>;ݺ �I]1T"fLu5QUUSVBD푗9JT- BȌHj#@YB,5 .&b$JHRQzu;}M^)O]H=[Vr-J@ *"M} sLnŁTfOfQdg5lCTW1+ QPpYTXh۽AjfieBUed@rV+("bceb-^AIАrRIswۛ㶹*2s\13eZpY+UC0S-X/X;-Rk,KK<K/QU.LBp%$(f$MDhf�TL^i3h .򳖜LDJ9@mQ>-k~ڱb` q'sm{&d ASwWl#%UZ&KkiZc֐Q !ヸJl!*') wBӈe/xhoO;''BՁ 4sɨпG~sD?R^< <�O@A]P{z@# _|Fi<xeojkl 7bO4'{Z#uO{tq^WJ';O; �Zp1<ڭS% 8Ț6NLp�c=Z?=Uo! ϖ|>v!ZykÍ76)C@I F`]C*n4Eb.Y&HUiR3\d8DE\nD.5n> ,S*QŽRx@%X&T%'ri ~kK90uV}Ct9p6,bTI!H`s3U$9RP E�4TĪO}DQanaԢEPSwqC76KjDDj L7#}KjPVl)RwmlMѠ\&I 0R`xssssm23WN$S4$L Ŋd /C\D,9Eb)S**)Jm"ҀTH52+\-Z.ȒJ#WRs[(WD-RP SM5բ;\ +J]rS]^u_Y[`9*#r$G!s9amm+Y2\R 8 Uᕪ\ZlǗy9hqz t ww?.?ݦLS kKG }xoS/]{ii68/o p�;Ȏ8# `S Bw I6=#>~+�w`Å8'Jp'rcxڞ7%O67 ^?w#~إWI̝mY'ܝpE9HBWЁ ) T :Ih'K_Lfu|P>wCnk|lmvkږi}MP`%l tЃ)D]9%D(f&Q{VIR4!#WLj*\Q$kr lhTeDHi۽I% )= t/ 2,5:*V K")u�֔b¶* ȵv5$PNJ1m&"E\Лm}U &zӭ9(QUV)Mo.&A%hMOqhEڲ.Ψu&jv8áuPAUM!v 4+t* amL`u$%DHX^w6O)u*uQU_p‰MJ^[ilKhRWTT͚,ńj%BQU2.@.xB `.X7W/V#W#UUefTchʡX֞P-, *## B x]y@*.֦j~|U/V?l}u @cO~ B_J_ʝ<c)~^>;jT<]C>7`?O;2m!ԛKogď'D<rdq6Afd ǩ;$l @}�>C:x?=Ooov t|`@Q [~м9YeUG4lc@Љ:gqv�Cq8zϑ 77yOb UVݡ7ȀJS#m7),U5 SQ(Ci$@=^ut$1ȄHQ2VeTIZrIe렑2ڵ, صop}\`MEk|B/C 2B: O�5TiA,a&L rE B*IMiۨF]ǟ E^wSU)h&w2{dnV SPwum[pP-KERڭɩ7͛BAT0#1ǜ#!W*:mw%@Qq-T)j%V8{NA%׮fREL JPIz_G -Qu,xĜfP0`8�2+ EI.>r5rka%ֽSE\ET_6k"egIOT9 (z][ �֬b40*+_{CfM6] &"?xxngWD4 \e~->>a{WC{yIrx KUx-?{W's!-_I/5|&ܞpt w/or>o "`|O?^M6TGsI(w6,a+=;x.]ވ_KY~w#Nic}q3s(O #w4{D(O|}0P1?Nksx#;Dtp@=(V֫z=ObBK*wi:mjQUU-iffl2ȫHVCJ8tHHf"j4PY9U\ApJW"#A�I`C�hMEUE5�ZEH,*u@BK:GYWϢ" Bd!KkXRqT)/E&0PYK#%hCtJ%K]´lP ڄPD be\1#.UL@@u {3n MH)PȄZ{ʌ9s}\1t4 a2cb(aV[xud+n*]hdHPB�c3lT(yJZwfH9WA m;( L]IYIP r6Kr�bUWU^>aJ%M3$Ƙy>"RJHc)e23{~V4&LO2VcgPEQT^ue(|`˔"U<K2 ɇW(JW2zΉ<uo~ 'J3|3MϪJVp(["K< 5Shc(Sv{ySDP~[ `�x � 0?M_v;o?//z&nBǃ}V|i4|(G?៝bZ9?k+._S]�ۓn+X|85Gؑ@EQś**`j"!eUT]s޲Цv?:AoVeUQ9Sr4R)wZY(d12f(e.yKN�TP7s5}ֻQWm台&Ҧb&׻Obzخ X´h]ܫ|Z%HQX NTm*!R!r`[Dq5N,To aT$B&r5 c̚>9+-j7mc5 g@t@+VPM`-U9eG1D8GkHX Ѥ]֗6!]p.0Ea YF~R@M`UIWv$!5kf6d Uy~+PdjۑQ$$JB껱];+?z\6P\XTQ2;ŪP`DMfRu#y>GMW6#e~T(?(Y]]"@G�� �IDATCGgCb6M%i�(r%f[>j(M[㙎˱_<-@Or,5_z=qt~LX\q.wи}臛 9g~<:0M^`�~ 췸Sc:ӷ~oZh"φv&�sr~gA֌|<€qXA&d\OUc}v+ G4\=�76ry]\`xێ\:k wQ$L|.*1 #BGָYQB*'Ƚ1 ZUiQB{aE#b R#X墾XVZ&Fm\Ysz3kIXy]EUTT*f_-3YfO�,!W*22 Zdz�LMt.rN RT[YM:"IF4H; dAK$I_<X\(8 drDʹe+*eY5CF~mCU^ )w5M3k0!ӢȈ9Nc,bT2PII:E*A.d xP7JM0 &H%X*dBϸ ÎL Zf3#ũ4)E@GEE5q@ %ӵMژVW YA" cĘs̬ȈHaƌYbKB1aR`RSYb̺ ~1S)j�?4XԚNbYľ\kB8%լ@oenMEnǿ;]O3 _do|o`~>۝zn]󴽇>7C^-_q^!eKnXG,;}6| 6 ؞'~ _5q=3࿟eY?}o/{xAn<ܽTN=thǶ z뼽]1(_?"O}[=\PwCɃU?JdguS87H܉`: i0aV)pnPAqeB,Ok0)͐lfwO4$4h]ITKK}R,ֺUB(7>1W` AkAUo9W'JP "GLdDV` -]BAJL՞Mz8U) ء,bhȰRb՛("Mj-"u@^ ԴY>WʠdMլ]Z`_Kc%j\=*J*&4ğ(C̘5,s'LU?@`+dMd$ ;% -@%^li]Қ! xH�br,Y- 0$"dc@PVd=7hm.p%@QY1b99Q{֢lhI8cLb/RPL.1�en-D (\`͇Axǹ RUTg孔 9f_7=.IXυKmU Wak㼍>z%_x5}˻?;;*xE=ᛇ ~m`|vٺ~62[Z@@|O׭.?'!gcCnR x|80 7ـo$)w g/s/Q#�π7ÿ{pӆ'yA�cSt�Gf_:h@}Yd[ a-$0ڬǗ:u�l�ygt>c=]U->@S!@ņ"2�C#&sKPiQ-LsUly\T*l1W;@+T{3V%KPtoY$mo Y $Lԥ"FiD~;aku׌gB`]DTAt[caJe^52Ѧ+E`Z]iq+kEʹ H)IVRJ*MV6J-фR+,b()5EkкTi(F@=Vs`&}m`Tj d:YQIЇ^ CLDVI )Ip7lB[P2R%()e4b + VΊVy,xTz.EuUM /pUI꺞fICDjkx-ΩS6ڮ=֕nsZG>x)P«'8YQsV8Bv*ll&*Òq,UNubJX@Mus>n%y)I -A$p =3 Ds2٣n  k įU NF'dYY'"^yw#1_ʼF<cP.Ð7.{%f+{(/k{LhGcMn=;Gu,0쁌,lǹXj\9Jn y࿄  6=JofE=p:D]F/x^k`pTw`6O@Mc2}\Կ4Tw^7-ϙ(1rΆăzfQ^d VŸL8& P:0'G`9TgE2fp`m[K>xhܙ!L׎?s7,Om$Bɉ +>b֞(G+'h ٕ@GnJk&1TVj-K13w/XC@[ßEGAr$fILd Cʛqmq�Һˊ\CBZj|#dǘ.\ǔ1(@XmWٍZlJ;w6d4 4H+@pC tZl͝(. ӣ4 W !H3+GܯIQ[BȢ,RIYJ4d9)3")``d5M[]ȔL!4I|zj,H9ysY^M2*-r&Y-<;3(VVKkл}d \@X:֧|e"rXD1RrV̬|b@\M9PLeIqhdLj9b}h^bgvd`&g9 >c/bt72|m Hz&lf %PXЄ8}ޟOxd]oFe-fcv+bD25?3Fz8$6`|w`gxц^p ?,g魗wf?/绯ar@żOgv~?v/@�?lx x (X> _ڣ}Dmhlxg<)_1qW>8Cm/屍vyWu-?i_`�! s<z b0pl[>菇ܱD. kv8荥AbVgkS#i1+93Wjш+)wdl̆,J4.vMyauRݫ{jH#A%M6u-WZnK[H)-i ըQB5GZC)9Y@f6XN�N:f(VکVk1&"z$UK1X=$ GO 38P fp'd,+~;"F 5L@ru d&sЬ5E{X@,pfZ.̸";mJF(AݐiLL.3l5&dB:h1!f/$Dbfwg)Q7%\R.Mc%t.j-yB*tnT"jG*YR.=K.8b[S}>G̑9F=*u\uD74jw,tdbIO%FhZ^KHڀ1K oq, 3xP&<QN#+.ͳNNGy= ;{a>F g{ m:Xz;ߎ/߲w L|dKqb{٩0wP(7>x%0P #3`@m8M�>`~?{4\#|߿޼`~bݳ}<<mc돟%. Y><ۗ4|~ׇ=_�q2+ { s\{~|hyΗChɆ8|=UԟO0ejƞO*w%X^Dٍ*&ذdk D Ҝ!jVQ TeClf樫2d7Ebr5L$)OYR9,n0�Wɺ](!_K6I 㡘R2Fu5r_Z zͼLZpYptCnLfhۡZǨ3bJi1WQL~CD.[Y)s1=2ʍ,V1kT6yI<Ajyndeff̡2\svN2BJt LMY"{.YPJUfZsb05ZFWAKr(kIF/S#n vccyK<"\5r>UHB>?` ep &C&,#fƌ>~&sΞ(LEo]*b[DݼH�b" qldfL*li*}MqRjݽ#pĥ]�qZp .^Fdҷt-+z][iw{>lu{_ <a|5KsTC$Ѿ$Çy=61N@hA@�Ta?o?9?9Z))]s~zW� v@,1~Ywc~<}O?^y* +0b8:&q׀?~Ѧ9t7bwuwhvp$!Ήac\/ʟy-t>ei}Apz6LNV�4Af 76,UH if2E,*F@]{a 7_ҁ*RМ}% 9 xOC#)oki)׸S񽘊1bbDP iQURS N+F/)@4ײCiXL42BoBCa46BJ̠Mڳ,HDɌ16ś{:D( (&ZXN@1ƈ9`qn>ۖ15s XQcq %ܲx `(=ևS,/ Q:V 4"͖ԐTitPcNp )j'?) \ɫ'?N{sZ>%"A#njuPb9c%0?MzhIYaD]s\sskVaN  W\}EʺAT8yR]Dp̼qxAl@{zD_ߢ.lXއ/"=2Ož_肈Yܼٞ�9�wqqkႅ ~T V`Vp}0t`�U{Km9R'BO�%&\/b|?q f&`3}19 SPbb7V϶KSqy|{oJ@axTlxT=4V{>gv'pv@qep@~fPHfxpL?Z-,_ItpVK6Ua2L1!#c/ֿ:bՇHY,V8kXb> 30L%Y5YW.f%H[|Nhfn_F7V[YK,o~e0LŌ9M1V#@>!9"W|A0'"&s |k遪9MʀSW23sb!A!inpR0Ô&/뗥x3 fR 5*^}4~di^2�yfq\]rF6x<O/К`4 "9gJyG0LHS%G0p|}즷]*/nX1s,'#>9G:> Kuqs&bFGLSdl>M@hi,K#nK lUD>Psz%a=+H0'pR1̾Z�CC _ /ٱ߶v?x7ήmZ3? YF s 53eV+O<o'Ox ?aV>7#ZΑxomq$pE3Q3O/oUۿݺמ0/�D~ ~�.wl8~|hӯcFʋsoag8vB33rEF ]m<٬GjA#ޏ/ ;~Oϩ}!n7(XTxEt&.WBܛ2m3gV^VV00f\+I 1 78PxJ.ؤŧD?ƅI0gmgH5x۶> S}, 9-9.ӤrHҋۢ_,*jkωE J9R0e. V]/h@H tgVJ:ufe4rK~NڴUk֬xPbpN/+[RT2fbsڼOŶš"8Vb"d; JMm3%=v3gb Cio;2�FStCeVLJx8쁘QKƌin&.D$JBwHeMt3]ঈΌ9د#>JZ\«r1cnBdUsĸKQFjdTHиG-Dr#SfϞҮޏ 6{h6=Tm|cG \�}NcM!]Tfס ݋=q6gka7v슏9x~µ�gwۥ,ĺ)q&h e>p64\:U'OPہCZ>~ܑO�P_߶=XM_l8~nfgcsq8F=ǂ}~ HF809j6P1w f]�Qv^k1{_Ǘ*s<̿8ƷtnpG=φWCkQ(6厝Se9Xe+8 WBlsoNwBҘfv#*`I+dHi9'i& 04,D`HkvO7H+*bEogm�qrFNqrMjVN:"nŸ\4*\fU%rFLYh*&2p( AA4IA+}MbX(DBUʫJ( J%0\ܡJUguŷVkbbh4f>ePbQ`c=UnUBKBaVmd^Rppi& a Sڛ,eifPiiZ]&s"8fh&bFA�-wEޥB!T2X0)ҭD̘}f9"̵�RNOs;`re*Oe8bK˃†<Yؒ_bEɣu�2Сy))Gt-Wl9& {D/@b'8j5y9qp͘C16.xgáZEGcs%{C7p]G6ءned{#h?t6�� �IDATQfXwH4 Ypm(@{ |~}+Eo;N VO^=:b`g\ p!h 9*aM}d EVz@~oΚj<";.R~n [i2-7S q,atjb #oETO&sc6؁lv^.BB`=R,2]%L&X*+ jWǪA`(4̌ LL1e`kȌF/fN#UDHH PHi $h\8C*&bܾsRp[zlge1м%X&Id+fj�ˆVRM㻕ZjC5]1X#"X:! Z.u@% *= ;.Hi2S/T"P=fOfrH HG\M!h(LyMc?0G yE`@%o6x.TI ZҹsfLDcڄ Y>~Ι5<#<BȐBkd05 [؊47qZRAS7cV*{<3vU+Zx>v7++H1,Y}~Nzo�cq;'Н|7_<M9^ه3=tDZ>p'ÈCjÑ3ӿ_o*j4Twc|>?u�׉pwukGo^||<O3x;6mw|c� <tx;}N3%%6bKʚX|yͷH(?WXЦylQR\vcxYȻAobY6rV>;iT>!^Z4'̚cs[UJq1BR*9#FδY%i,Ru8P+fWʲnel) ?w;n4IvP}DDƌ\lr r+LF  e&Kܰ) .X#$f2{{LeC&!iD% �f `h%̖UWfIs[mV#J>'3{Ƥbl!L"r*#SSsƞ�Au͏A#.C92r!<eTX23[ 4ARW/2pMfP #TU`7XJ%JS(C�%\Rb\Xu61#&Ht ZCǜ9N:}C:՘}L̙mFiFQhU87$Vӳ*a3,9T4U_׿%Vf͆9&t9o>l_c^q|{J̮-/Y9\&* Npx1GWHmXw%xj .vyx^l95cqu>~}6� s(M<7C{Gb|#`_"+^J;0tk [Zvx/U_xu@|?z,?;mj~6~1[<lebZgB̧wdˣ]^qghYfnv(D # v Ӽ@&VKCMHȧaAW"wf^#25fjB&'A:`0TD>fQC52O+d WU(s^D$=Ik>@.xv&#rf m71RCeDMˌ[ZA.0He(~#{KKFf4`,Fni()u1>I�SZ$YBfpN/xJzA)VkiȌ"c;̑NP r,Ia"lrFK1Lɕ1;4Ui[PS\ETD`+RIXF/7a"33P.,BAĔI<%&H2n:ՖRSsH%^4oZfN,:R=4le�##,yLr;rph Q|ʙ@7A@#Telc|=t|ĨH>v!b<G&.q,;YׯG껫̑.r ?#?7[C z+w|ހlߎx3ܿvćzA^;%j 5 Ϫ`? ?ԃLeS˽}(u|w(_KFcL<]ʥѡ%l8*߿8}h-7?FX&ӥl>ڑRN2˼o<)5]Ko 1⹏@ʣrԙu!H͌ʝ|76E4+鞚lkhu`A!JUYM+੟`EpY]CZ91"M3աह9hnRm7[a1nݬm"aKz#9C4 ~tٍM/՜WJL%Iqs.e9 ,!J u19 1DNBƣ Yݭ^OVXy[MEFsC]f(-}hd93,.y[~(f]R{Ȟc5rbtȪ(3HYL3!I)R܌eIF[^ D%3,'%E ` j i[[�VIԊB"KʐڋL =IO"_E2+]1L_ bVՎdS(].zL*iSLLMbqm9noPI̲Gax*fnQ8Ys)nk7Ï_ 1?ih>XOwz4ʮV`CqB'~ܽ帇Qm/C9[߶zVxNJNG$`W쨗gǂM/9n=~ wyc4;Qqz70/߼/=t7u] an(Czɶy {4Z5y(:F)ar+1zg^t>gPuUYa#X"(.jڎ-4~PvtGmތ5i"N`\ LPv1c9g!J<XVd.ʅߖF:gy`|n-X2V0 Fb$eTXvb4_:.,f&ֶ[>?)dH#T)])WeC:b)"#b >@&T&ANL)ӒYurdYp}}>??S߿!md('$>9=WVE@&' \8'iSBFYYY97ye-y7`ʢ`1ӁR\pЌʊT%N$\ٞFZ#I[)K$cҔb:\dHId#$#'"0Z ,(VRVw=LVaʬMjHWK͕ŽX pB*m*wsf0H3Jr2~" ⛉߶?پ,V^?u10۶k˩m{Vtq1~CGזO=;p;[g6v* !xa8 >3#ixzGn_l 7H<$jAl&Go;?o xǯ_W8'lG=|Pp /3 n1c40 >H$gE?F44~s{jŏ͜LX68`.!)uD2I@<͒s.i=Ks-/P hHWzEڌU㵸%ЉDHb"f}! +\sFkU)Ky_ ʺ6Zn7@0Җ Nr AX@sm)n7娭_,6>=/nvn E+3TW.{q`,,�Qt_J?"LIVWn!BZ_R Yn)ͭZ{秏>|ؿT*"Q>tҜ sUPN 9JR#c ,)Ka2&Qt[%ܗ[{e&w;x }"53, [tk-kHi7A ;.u Q+ٚT35#9Zc2EY={dIg>}NR%a%LS)h^\ל^J^ ͩ=t>7C1w~N!G?Ứ==^:{8DxvwcCe4@<KC/{k{mEW*^hQХJywK⿱m<`C?t C~?7oPa9 �E8WE{_>ߌ^_m@w{;aF!,Ǭً!Ȣ:gyNǴAdy9Z8*@݁A<ϟ<tcowj95;žfݼwKmcWTsRa18iV[¹PEĸݸ9SQvmڦEI2MhDDK>gٕZ{s"#Ueԕ 41nE -##4и  ]`)˒J/3{{ypnrIf9g>J#kRDZE<1U%Qm!qX_=g?"$q�02n_0&s%[4BWٴR Nt-]KJUYS]3g3i`B5+<B[fV3)*% K9!iZE0d(p+ZT."D,^\?~t%Q 9,%L<-F2Ԇa=ԝ6GVq078Ȝ̲Kc)FSءA,a:aIadzt |Lb*ʧ n43 24RK u\XFA̐B2 !dL)'),epJM S cZ8Rs#Pd6B#KXZ(S\*YcȽ=컡tռzz4B!?;c7XGރ?!#yw]:>1n>7__읳zVN`ω}~\~|j0Cis >N`$I0?T|_ i&𣁷 /1@q:>vr_gy׉_s{OvoQkڇV~$P6Qi4$Vk>8N*QDk]>^/-4vh`w'Ŀ6m.{.85CmWy~}T}SkàY^8G8\,Bn� O1E55pa{McEFiM�tb\y3sUU<!)sT Fa)]5皇yN#aB7m$V�\ -㦭ggӴ5L�P@,)L) "xc뫄'8�ܝeU/ゖ,>:2 WY2-#PP eGC P @3"bey F-e.t"e3].:+i $DjʀdR̜Mg\:C25vnp .*�E"#{F\31@Q H  7nQiI.!)23s3M^ HRB̒Q9)fNX =@Vg +]iG*YXJ\T) fQCѰ [�sƮ{ZqҺ՝O (Z rSZc5nmT|(ݺAV4`v1E3 C-x஼ e{p;Gbx ~2kQnѿ]Qc~gG_ z6#+o��G�xմVYF}WdSB}1fxt/8 5lQ@9 "JnM^GKVv1j+Ux0a?rV*,'ǿ f [LțQfVZAa9/ϡbx|e3- mVgYN)mp̀Τ6E1 WBƒ $$9mQ?$uAc_+%7[5o`@W#q1,<HPPZ%p Gjڭ::pjxrg.8p9뼺BpYJֺ_=XRFwX"\ph-L+VH)bИ41S{}̉15^ۜi4T7Dl+%=g>A 3I@abC." )ɬ+,f(Ӌщ`f4]�sČ^ /c 9seL c%m!ŲPtʈ f sZjK_4vA#a#hf99.?eB5cdXȐvaF4Q%j xe2*0�`\|9>J?K:KBvv|=wWmO/167 u?@区{5_75y?9ڈnO(&7Ԁ_[|}˂?h'ڄ� P�G|7s⒧L[ߴhfkSuwױaákpU\|?Gw+l\"zS^onς^Aly#teN78 TЁq/߼p[eoyh|Ã'>X|I;g1yxVJyPjƒ"cb[%tMWfb|5DL1 QP)X1d@tM5ɽ,=AfKQnp1]Y%JJ4-&SbZxG5뚘„#!i8Rɘja&dJO0i,kTVL!V*t+dfts3(Vp^h ʘs虈9!*M3#Dta<aWSSߦ9 kdzf*{b;3XSSj6hI55)>bD*QSW.0ωBsH]6F4/NOaaW1%upr y띁kcDze\["U)sΜ#lOY D7}/o6}}Cuqϡ1 6j1/8?idm")X rlR ר:{lLĜŢYW: 2 D%^/zy17r|)̀Sc>^8χdC:4J9|=Z}Շ3/ѿƍ0n@FE'x㔉ockOMhCp --?|vdy~Xuſ=PO@v1ҁ{݁rKG$2'ƿWָ4-vV}ƨ^Jct {:�a4O86lOX<_z=M�؊ !t&|ݔ śj;5{G4DW+gH̉ TB% N/^5j(�iVaDZ�� �IDATSA%v2+YN99SJv[i&)n5,i4ceaCAK+vHb.ĊD1\e*W΂7(Lf*r OřndbZ:\ ) Z^쎖&([ Ed;:�EaX3Df4ehLMČd^rm)`+fM'bBF5ҒnlYZĜg3�S m墭 hj !lmFIA_uD.3fd1Lnp1WsY]WSbJc'0#tbd'gb$&F+bV+ӊO։f)Ǫ9 HsoXF }dPr9Ƌ_:Ђ8˩�gdy7,SGj'bVJJw8v�ncc!^ok-h^q?-p@$&joޞ=YofFq~W9{c0w?l/h0qy oxt9Ox_=]n^;3vzUM;x8PPx@Ɔq‰{`uhR|t<Z(!+]/gpqrruo%ڄhay;`)~,HED0t |0tw[1QȺ$:5l(S ;$_̺y1+e.^9$75\ ")39g"zlMQ`rL,uhaף ZV"Lf%:V�O#WD*b1ʌKfHϺ1`b"s9AKs3{j5HKŖ8XZԇ{0iHIu4 ÅW<Nj>D<_&bi>; 40da#ĴR`D Xh \kSCا�ܴ`崜+Qr2p 6`r̥닕Wv]*IN en30"G2rA^{&x*1g&/r_ -8}_j QDY=5,LwլaC:6� `izy:4 {r7Wȉ<bk7>{qo]2{q!/1(Px+0!8,e?G \~ 0wlwY{E7(ψ ->|E CΔ4ؾu}8~s:˰O?Mx,/|O*w0jX"WOa?RхK<v)_f)r(lZΟmq֜8Z=1PpnP?E9JLs/gL9 3l֪Wa3"^<:YW27#anN;uk?Z\1dNV͊f^ ؉N0vZ|΄ b~S_DBסHYYMfiq4w-aIe% 0+ɲҲLK.L[ekaqVbe*`J,y<- QrQ% h"O'SfK,BS0\ۘ%ſkitMK8LV�V[RiEYCF655ɘd9{g\)^<A9Za=ldHԉK5DVC`L!S\tYP LaBt@lX[(a.kY  Hh"9 YLKٚk(#bZeDLrԦHb.8dK-ɷ e${f! E^S]=|m/.um-qy!8` B|`ԜTÃ/~{8;\@^6q8̓0ؾ1ߌm��OvgKՈ~>6k·)_-~8~*>u F6Bɬ+/q1пE }h? v7Vή'WDKT懂G(#:aJ}eͷ}1'[OZL܎5.j4³%<^ {~ ygi9'd| řa@T"fF +Iy$^frҎ`Jֵs[&@&wkD&4+�m "zGѓ׫k`W`(_1k}2޴@N WdĒ,f*�FFY@"Xu5 LmX vu20өJ [ 4413LsH89*< kNf R.::@f%h鮔!+He!ɰ2D�2 mEYH)LmLLd9JE9k#e1onGeGmN2}#L1 F dAT3nTv)2")Ip$9W4iBS˜l%sy̴ zEd3-k*{5zȜOINmsx6KΨmM1K?{WhJK0׭t~+:xpex=op@~uKùWxT =8&XYW2ĚķdZy:UNCfy#j9w`v_2b�6Oe{Jost;gwퟭ}#>=c=h?Tpn" B'GϞ_M|5'7XD1 '\y^_5Bq o0h>4u̘k^O8ѢU ;3 " |Y+6 b~/O,[G+t OJ`l{h MDY SNS.Qf̥W5.ARW ' XiGZKTp30YȤ_ Xe~\kl do³TR >'{`\p7/|m[_)Hr}pWGDZFe$mI&vք@fJ۲2!*YfjAK<%\1Az*eN_Ҷ"JTHH.;4ĄYZl!Mc!* ϴR7EPfG/|1{2=/R Éx6UVװ@&0J&J.# !颫 ,A�A3Ww q}IMbΉ"d0n -ᐙ">e(C_i L#n 3>eN2|C/ A[t(썈 Y}fuk6{fҏGU*T1f}y;n_qI緃7 'Vw5Ǧ?9?1ww.сp=D9 O=W`қWOKX__%{>=zb~;ᾣMxc3?_-Oc}h_*R>ҪqL<Ft·cxۄ@{=N0w O@F%d|DtjzDycڴLӎ´}4sƹ+l5sxz?TF3iQ12B݌UĘ#+RfGTAvۨY<DBRCZW`JWcъɔ ͨHD$ق�D9lWCJvRzsamPLXPw=(6 D"2Ug7B~N1)A+f|MWu\se@k jBu hift'@K ̜ 0%<fRq 95 !IhZە4.#;QK�9QbÊ胾C#%Yfp;8ͭZr5;s+o4Onss-e@fP"IN NT&ęEӤG!3\ G*df&3Z MYXD&\AfIrvtɹ)4L E '?‘[| at;XW!cG۬Sz02sڹ(o_7<n C~h7S= %Q-! l?>^ 37g5ۇK<�WB"q[|kT <qm|ׯ1Sácvxw8''O8ť?ٰJ  oa<zr.Oxpt Б:>CGx[ʉy9 f0ʇX&&0x;x n~N+-,^m׏^N~N1qA-pOn K&7,hg]Q\(8h5hB0`*L2V7͍+u KEr|i!3ĕiF-Rb.C[eYzF䈌A`VH ԀեUggK�k- Ѯ=3YDӋWHnMnM/}Α4[v)4LDͥBA%Xr)Z„sT"AD i+H_JӅp,ubA$Hd 0w f L|2+]M&-ҙPl3o5+errZ#)5FV)Co,YĮ,Om L 9Saa`&V▩YRȈo:&,)ƮjEs$3^!SQr.ZwQ-|9l^2N*Emd#.i8 )v Lpve-Av(rJגKWtyy}'�|_p|mN ^c ;HG[; vˉ=F_<~I<akh͡<>tOX˗EMoj>cPwtw-#ߣTƇxO#a~B9ha@P~ ~}:Uت7Kůx*n­&q,%zV�fjǘ/�bhnGX:?@O7#ԫ*fޠQ,'%bC5/4߮m 8K/, '&dݲ찫EJ p 5,074w8f6+-`03)nk. qβw@s!sL94!p]M zٵK fkk:2Ö́`Z^N:ݬxi+\ =#zRy#y@TH Heg 2Ẇ@<)B`&} }iulV*@3sΜ3g^IKxadiWoJ p(R�,īL_Ar(eVYF.1Ԍ5@Ț tT IRrc&QpҏtZ#8"34ʯx%4 DԘ46Sn$Ld!)E*c~+$ #,4 R$J[�ƕ #Gؼ[Ck7M@ ؊f#ӧ*E,XPsozsa"$_Őnï7~v| 6mayC/ZR৊ۼsC!}}r X;>^p9Wf;~b^oNs$w~ٛJF!| v  w-%Pyځ8Ӈx={4 n8LX7!d;cw m6wPg$`,E{xO|'m0}бT֨#tDl‰0?>}疘11GuʔKE bV-֨24bxAZY%ōk �+ �#8\J֕ӐTIrM)3inU ^3sN!"8Cg`sҥ\4nK5KʸfW[z2`)҈M4knK=W.k=Q˰iKh6d}PL/tN]^$e~]\E\f`3ܗ,fDf̩0HN Eŭ9E$9KΚ , gA2v4Ro:++CdՒT^ ,C,%OtyqX 0MDNh)a.CD̅M8�1rdn1}KӴ)Hjie3k$#ccbyR(:ȇ[57ks:0꠲Cޚ.F+ |<(&֬cbt$W["-A]Towz.|}8XG'ʄ]g;x� Qb|Vuv֌Gi*`FwGu GL$,RwH<󲻾ggps1Wk~=޵wGL? cl {oP*X` �7@D#V:j@Bq@%YPJjS(xA+XF;Cc(?yv! "xU+Tr1!v {etg^RF~Y̟R7krTOW:7g"iS[s1ӝ2/y1F{"MT2JeTP#TY0iZ!Iƨ�yc33 0Ƙcj rHC,a+e.M9an$ ?SkHU+ [nA`ܽRR7zŕVy؊oV걶9gsgKr[{ZkNiWiVN�fNVj2P S̘]c`f*$L/N JAs935Q2#)M$e>3J/ ^ d7ȭn^B?IfhbDJ4X@]TJ1" U^IJ"&h%+i@t-*}nddvi(?L 7J# tKrx0Meђk0#Y RD1&9b\8xԮw< J)!nUUs2J]:]uBC)g>x_ZѶ@%\v76_ަG\k}Ix|)Jv }(Fڂ!$lQ#y@ D!fp@UT^99g ?@8H0Df$={<D0mAIK<GQ+a՗z4w[^?I\'vX&Fقvc)m\ndx;\?7( e{h _c |ţC>SzK�10:P^ݾ1iu۽b}@A$ N7ۗҞٛI\tDD{OG܌Rœ6%]+OʱzV HyOUuC$OA.|dǣo\lwHW J!B,T`u,$̔8+{O&)d>|tLIdF3D4rxx3-$l<=N") r<|&^BQ1(j4! 2s̟̃<ԁ LLfNU||̃͘Ψ5XEe+3- 8NlED"JV*4zY Bȹp}c@FxfCBdcVJ1ѹPBO3pG�Q!3kHh,u-ϼ�� �IDAT!lk#R!1bj5d%̒ћԉ`(<B1;&'S$L(y`Lj\$eFnEh9L"@O(.t,5a#GHt+$Z&J-!}X�u1Υf)Ag{B^ KB2"LOê~Nv򚼒RCjsEג8ե`t*�P%=YkVտSQc0Yx~Xp7mlK6 \$.;�8r>n Xʪ-QB֣OwVfßov_kQ'? pA(. t@4a 8` .|{gbˇz 6˫ ox;}|{TJɅ%c  j7X G~?G穕t6_wB)B[""R3Xo[Il,XS] q͸ؙ2dgG,v \56�:>FDUS(v d@I9 7} φ g14Ol]:)cBR p5%@Yy=1!<O�sn1IfP :Ǣ94~NJ%>bDL?F p*<r)p>SBI$.UU#32ETe4IdϨ6؇(H1&lHU*s"CH):r5E�%1Qb%83{z=3*Pu#)m 3>_yT2IIlI`BdH s`'|PQMft g'RP3kz%,ey>5a)- q F15�4.!s`摻\҅2DDʀLeV Y aٺGgQbY%m5 )Ȳ7&7oq7;)*Uu;Z@;!qN~6U@@MpÕ@}ع I_SY$xv6XcQ<(]Q70W3}P`/ ~tuRP[ǎ5xpX w%qspk`'k O_CB :lUme`Ɋ6ԟ@x?Yبen@F%Eԏ <ۀ(kDHNLC�nAh=髟7F<vJYӊ:X%:a69W IC ]FDŽ1"xX&6RXjeIdV@AεHL )aUygf(LiZ&nNC$s>FpdՌȱf jjHJD "B,U\9Q|J5B1.T0MPo-3]"HJTTEHBg5cvHK%F"J�'JO$-p'+`r 2Eh$E 1o)JAn(X @lPag0x̘f)T1!zJgjb(]RMp3"BԔiC}V#!I 2Rzr .RTAx';e bXC;&/2fI}}(>nO[S5! +CFGnC@ Cc#bA٤e~M|l8#x?}f[ K (P̮yk ׋~q#~TO߇fQ/ BE[]2t;�p1�(_)}��,%`@>�?7~DÂ)wvU: W&7E6@?w `<}U /-I.EOu|86BKdER:diށ#@]`vӑm{DD6XdǺ#3fْWٺv6v[ kENj!AۤaDtBX3:M5<#G'Jhf#& >ź]T4$ < fOp}KC7B@R ؕjBJ$E(3KBF1fsBBILhbINȞ$ 0 )C1A-齹w5"l2ZA֕uUٙ 5qM�":/H:&21)S1 WP.I g03s{@kDT5$4DĢśEt! qO fvDt R}֩ T| @3!q�PUfYPLL-P :]HIȉs}4 yPR,YJ, `LT XN&X<.euqUu!37mք')9mMn=wNHrPT:f{q(иc{f7騿 RLa*.at)TE.D'0;~JP|{ŗG\o iX'ǚ(j$p/>lXֻqxY~|g؟_zYN׌Omk7;_g;Xx�g,z[FoUXNz걌]w ƞ )=]n@Fl,E-Mv(rUn2/%v}U k㭮<EUS%J( ƋV{͖*JGQmeQ4y8jACR\51 \!1/(L+ { REDI!އ7AO6&Q U!%!I r|F)9 Obۊ#'"ǙLx�rDL1%#GYoOs {5 q.G!_ XA 1Qs]=F~~Շ@=h`JRԄE&293�^,EDP ʔg ?ݓHNL3 q'#f:Ͻ RVfU hPӕ&CER̡C D&9@PrFL%K@":I&4йqH"QUh""�NKƀhtOPfm8{JK~33!܈lD*|La@"4QUiiFl"^#Gλ Q*PNlfl" tvx1s鬡FR2?~�DbE8~z, Aۼ٠ u_",@g뽋X.h7'?x|^ 򃯍ؕ¨6(}�sL퇀<VTnWxOߡܠ|4|0SK;Үk<wMf=~|b\ 312 o�_M^/k6Érwr=NJiرdè n5nlWpQpGoX%z@{ ]Oaj7#nSYz۴'o4߹ml (;4O۟-.}i1K.pp{h(nBk/}kїe~FHR>R{a)[l-d <3�t6"#Q7b"ӑ4fW5"ܽGw0Y+8H8#L@(jjJӳRETq}*8ဇO>)|N@ t@3t(A%KIۤՔ""3qvg1?PhQ4aQA \$ IE`p^[$2#=#=ݑ"*8<129]N#"#}nl4 #1imC7AJ [̗\gcpzţ3"BΊC H�!L.29Ʃp:YsRH4 *VDɖi! dI J%dVIj+SSf `'<҉=^$�|LE`@> rxXBFbG*ŇPxug6/ZG H;<r<J<|UM`2 O{JH7yFtԽU6'}{+tB_YeYn/͢M�ۗ@ ;ֆ�,�Xd ϾD t@_7/Ϟb-Ѿ\qf;7w)C)S |(s|yG͛K)ZT8Z:qtݕr ~o[^Wvr{eێhlUt~Ȉ0Kpd^ 8ڡ&Zk?(vc 'QSn/˯-,CߑG[np&+!=zf-VbL]jXj("d EQ2U`AI3g7#=Gcذ4#uE UJMG;#KN7=F1( IJJ):[b%*m)NU M @ R>fKJ`E =/4a( v10Zhd S/<ME Ch@feΐ$p?Q Ǥ==A|9 1ޛu5=G+ !. "rV:r߫qDf9!it @tf}S&SFʥEj<X'L9Uu%.J2R,J$BX> <pmDḦ́"&4V0HVz)6<KcG1d*YfD&ray|$" 1,%P(FSuS :NY11|7qW[LRƃ<EgTTa8T= +n~w@ `rv8 !PNkq(.�SZ ':x�[�[Ib pm/mvB/,;táx,8m0  %^vĒmAͳղч}Agw(\ժP//qpbm=t)~yWfcfG^~AX}|_IS!{/1,|*)IR"$|-|~rAAr?UU Fɍ\FKEG x`(2C"5̊`3t0  Z$Tp1bM=%SA!"I H)*S 1<հb)z1ag4FYJLv9t^jRf*笤*ҖT匦|ʧ{z> : #f1A\OYB387DF ` 'K6ѢN}@֩$qd@2(&"HCZ GyT҇&>bNg3Rj`xmkhI)%g^,I�V")*bJPB&BA�1L$Ȝn,)$W!zwko92F#cM5ͩD{fO|'~eD1V<2Qe46O]P5Di~iP3*3|Ի~G0^Q <Дl֌6k+k]9nE0_^g/m:Z^CRnx(<~vQZbZjcI銏kb`Utâ$ /[ x <|=�(q:t>[K{D`�6/ _ qa{÷g۳mAx |v}{x;)+W l-K�;GNr7긳_\&)f{?V ;ޠRm&qpG p)y,f˵ŒVă{.u|DQ,.]/'m)c ;*f6{pK"ݼKc8ejQdGlv`3[[U꒥R"t#5$"=9:y~!**q&p5)&bo3#9GD#<"LggyK1LCT,=̾UGwoWU!BTE"$$c{35]"pM)vZ#IH͹ip%<3G~qhK,FZṣD4fDNt!J̩"t'*gER Ƣj52Ш0$$=GHf( 1x Yhr(S!"X5³}-HQ"La> !�=yS݅ENPR2U0g*zdtNǵ}e̕Uᾞ[:dB2U%@-M9--R6J?(VO8:4jpl?v[]X+eD E]N[�o6"dXp/qG<ίѮ ՗Wu) W oWwn w MU(PH'ގ`s0|oȎx/}b8z8#S|  oxٰ�llT}zG@g˛^!Oo븪@VݢRTꓚ't? v_FY/ 6H :hq �7ħBC뒸(7'AWG~*vRnAIoz7hQ"Pm+\"lYQ4kB%|ܙndl<#מזk$=LHXFRY a%уIJe1ND0 ac>\\J*pɩ ZDʘ SDOVDM!#AG#<1SA3" Ub"ߏ۴P%G{2 )O"*$#"G $s.!)v͂P1OOxA֌D8ܧyq~dw}ȰE�(;0H $e 乩<&TNO0rR8C`N!�U<9ĦLlQURUT#AU5sLt*cD"FApAZp$)$R=eDFkNҽF6KYǙ \gtʁt_zYƂ[l:\>LU4`ѫ@kKDDH&'t-uDK)ܞCru\iYBA/ݦ^U_-)c'^|=-m?,ی e u<k۔7/}O@7Tb l ~(/xD*b Fnu`ůOwX??ŧ/� {_zG)[yA1y9)۷9xw෉Rɛ ?$*x:({Dz?,m ᯚ#zaz[}|M` ubP#q hBl7qV4vJԓǀ7\ˣWٍuJ 3V p ,@AhDч7?և}t=0JnHCXd^ MaE*(bu9Gf܁ ipUi2DK4u>J'1>ٛ>FNLN(E⑘$AtJ�3#gLhl=:zap윸2a=!%BĠ#C8f([Ni9'Wxٽ)c @8..1A0C#)(DOD,>UdĠ:\젒$YaIE!)#( Ӥb R%gWQ(*hYh"c&ʈ9eD9B&! >W"A�}[�p9<1LCc̾FG_)I q�� �IDATmPDO >ZfŔ !682N ǬFQqQt!$w(_.wQѶDƵK͖,P@z5Nߵ;}v[nխd:ZNO?ޞ~GZ7\T`7ӟr-vrT|jg/a+#cM~e00;'ޠ�|c%/(g_o}{`_4�(=o5ngr٤@SoQǰǻMțx=kR6n27{0@Rkf O$q(ֆP%P}c{<E$l|P2?\YpI'ړq4b^YU[xZC?Xq*AcT e! 4ONZ&5e0L<TȄ#D KD|$ !iN6J35dCfJG!AD(D$`&Gz[~tf[V1!)ggx& DDzZڊјt V8 ;~tbI}HG+22MQW]*kbbC"31(I`% ;W&K`:&Պ,cIՅ!&9C: DBl!Rb S""#*@EnA](:X$C9}|Edb69RdNUUtfuДpH}s)3220Pc)ӑ3Nč5$gNKb^=<G--PAJѥOCA,6ΞN9RLBj&%O˸6b=(8d݊=m݌ M9u`:jvNj0Y\hUܳrhs;m~ze<}R%>Hc=vO_m q~˧P~R(kO4鵜>ߗ& b_5\rۿ:x5lXO@|S;l*ax ^> �Px;A5:['A .Kh]=}[GϚҊ'm(b` \*TpY_U啌?Xo y]jrK;xH i(bGl Sha4dzi"?ˊm"zѴ0ԚQ #Ѳs2Vz?\4HH$qv%]`J� L:5Gz4S,|V-:s$A39Y"眬<1b sj5S+) 0ygEzG-`LBGTZ63&L&6H^Jᣅ$�ͽʨR *�)ce8B!6ƒDw VXAlSYj)e.a)dv)N93q:Yg\Eb@ fad�AIN85[tbT"R!:Hw?P"!L`DDGL35Wgx{8{[K 7Ќ,WX:5ndP> !hֳ7kX%ɥjw \cucXwnPlbb>p:$P$qfzTZCn9Z=%K ce?&$hYss "UN&d[ɗr _nGm>�o#W(t~?h{ˎ$|dWSӃP( fЈmcDm(m"a bzdD-<XHZ 2@\nvwj7X?U#/e,8m<OrqEwngGTUp.Ye/芛,6?aM0pxtg~Ŀx+0q@/^C?t$1e8]<p7S1DQ;.lTLз m/j3ȂqwΣ&6�6Њ0@@VDy߭GTu+Ť XEFjdV^RJrdt ua`L\pï{ͭ^o{/{((re*sR:�\.fd"bNjLJBmR)sLenF )*H[ZUAґ 1q6 BNY!Fcsy@4I2 <S"AuqX?Cm>gI0U2fqԐTQKLx2W"["@VjA*1.yBQSk*3#՝9[{RULJ`M0tXESLM :K2S,jF FVm+�IJat)ZMdg6j9̴)MK>YUdVARE�d2#s v�db"TTtAy]{k 0Դd4Á1gL3j^sҥ^j)Pf%u>EjŊMPxظ1yNӅ1Fm !g|)2J&F.b킺6k7C0tUk˨c?G5!ljuA9]쮵.+@�n?]c]o?yMVa_k}EMq}BS[|#/ _qkj/n/ ~³W W�πG`q4�u I,p}}S[{#CE*K&+XU;⎵7FUvyZm^vpb$D�,(;;Iuƨ %,ɓL~FWi)e(E2Rk^!-bkgU)`h.KQɐU@U5<HMTYʹZBUQL̚TNLDNX9d <ETE1#2d:}q ]$9qA`@́4P!V M[4g),H"4FB& !s AuAqTe`B P=t@[nTd!.�3ʎDT ^l3JizLUJժVE5Фl2VkjjJ*Ys-NZ䜥dGǸztHF =$锠Z¦-/2B`RE@HCgP(,rЇ!e.H_"+GڋKd\$ᵍ knkyl2Ӯ;Jĸ,kX56,P.B]ٔ#Թh+(DqwqZQympx Ў5sje#r>r[=-Wvį!Ѐ^1񡗯^>r #/>lֆ?|l8k;xG3`W;ZG_3ϛ lN7" q-ChS}î`۰F4~qH�,rLqA@,ݥjzj[zi$@)st3 pxA3&xvYn]Pn]1+?"凨$HиM7 Yl1]`5/|w Ua NNɍېUP:i{x$ K ׾hS@ $ Q QHR3"b dygg0mʩϙkVR2c0#`ӵ1XWgDHE)1P|^~`.S)E$YŤPHa*+@ &4)*411a(CjlPLɔ4J!sD״EVRX@q2UuBȰiQ,+* խ4Gj"*yU S5L�f%@}VPȄ9tŦl61{W\}~dfgvќTDZ<ɔ\.e K&,J(P[#@=KacI ,ض Z4a棱G&AЅk1|WR6#Ŵfb^ <֦ [Pدr^xue<"ý!�,c ǺƱ\P<u]PwͲʶ@on,_Pˇ8z?}& ;K�^ح?ݽuO;�  _n Y+`ܑ5_XhH368  0y?[ $SX}n*<5csA-\[0Ի|<BQ%Pt" :P;8 .hVzWG)u/H+`Ϊ< T)}\Gn7*uVaԦ"tKȀ+ؙkjCFa 1Yl{}|fPk -7[Pg3 a{4A?`ɐ4{#+F6LD2#S$d%�ɜOmdd"rPQIlHz{zAK"#x;i20 Qar@ (�39#?)=4 R| Z5DdЃ#f*`d)EX)Id8T*($ Jz$WjYi <&y5C3TUzA{SΫCr0ɑpb@;̠PT f(Eg!&̤ x׸\#"\b%L ҞTж%c۵PeIXio:/#1L#hiU{C,ԝHL�fnTDf\H_Tb-0B^tZȵÒ$ (' (SI8)'Q" oM!s)x;d{MRc@8O zvs<f TG1` #6xlա߶/'jtCRJk[RSy<�:ұ[*Q?Ww̓W�ێ*(W ^ >/!{k:ƻ �֯* aWnv̼GO)# 쌼"n9ˀ.-)E1e6+!]l+%]H=ct z`WGt&8^r S[1.8}<_> t0]?KTmZ5oZQ<5 bM<ReHE�QYfJ%(Z-ƜK R9ND�]tB+!  32## `x4K 6UTg`xRbLxrx⩑ z$e$9§̰qA*Z#JzJ0DX(VɚfN(TܞTHT.:n*TPȌ%W""`B3c(QJ視eD>eLF@(bLHA2 *dg+05UrUum($Pt6LmF9 IDWW$mH$!yNvg`df<\EhR9^!hq6kGO;;C.+Q /kpQ9m'$Dk5(O9U97Ҽl`ؘW;Jp@ֻkГq7RH|ڱqɐhsc_+t/ϰ7=mi(f C�CЉ%\O9k]BH{b}z@@`Ç/~_#6x]v# 7+_='l^y Bہ 7~ZWvWGx8?V޾<ɯ߶.Um{+im'S+a(: # >Hy1%@w\a/ X&  V  TiqO!`[yhu+0|ՖuP`0v0!ː2T]:lRʈLEP1Ғ y hhXqľFV%,TG)'SrZ}92ӥx˚i)RTT'd=L+)YzL%B&@3ې)hR `8Hdzh0L賔NT֙f*| P6kJpq„$ I.mZڬ^c.ʼnHNr-0HDrJĪ:4Ӫ(6Μ`a&s*B@ $2XWkd"I]"%0#9Y%:]`tz$KRFjJ&WT"SWtWmtү+<}-7ŢgH&MU1t" a3ajUKo2ڦtE5™OzDMdG蛒KXF^첔C7KBw=DKO`5BtU3}3yi'RF_N ƿꛊ2qIHv�pA(ԟEYLo;܉_~؛n8q__n; _]mQ8.[ nt||;T{ӗxOx6|/||c�5pq7.G!DzӻZ7coXevE(~\fo`+xURMMГvaXf9Z Oo ^QWItEߠ1q7Flx5^k8y=vY;Y. �]wvᨌ'@ 3ԸX ǐsշ/EBSeEx-*AYQJVKJKP(4 C暺d"C<+I^TFt�F"yq @"E9]2eI:ȄB Y<y;~ ф%A>0=T6 #ud`hF`q>KP�5=<|V� lGBܘ)G<xKtuG&iip'4IbX%R�6�Ic;P #dn%)58TTj+4~Nt`@* 8 rUkѹ&<"= bB4.pTc)VBʼnɀOͤ9#:adM_ĸ7R"@d"XMDvY4PMt+c($otMxkнpZr%ityXk(`\?�#([;˃~_ڪoJ:<^UW'5@Qd}^5bq޵rT;qC8cyXp `�q$E з4o (r�v,!y@C( Y1E?C1_9 φ?o|˛Wɛ]x)׷zn"vK>w/ƛF(v$�J?GdG;?Z=YS0Ld`#CKu 0:nN z 'owܔu-7.v7(7T4!-|J;h]љ]d-& I_blM]Aм*jZ)`Ŋ0&C&S8I PsN-P"ta)"${+ "RB&"S#%[ D%QC>[9<8m{0ɀ(TS0'G )Μ,S5 2"HiNSU(ja%:i$MRȑc/jHF(#1DT#-i2AYQ3p)$Ub0&T?F:K*_Uh3T̤Ub?6 3!J`γ))L0'U!p^SzGX+ԍj!"db"lD3R\93:)!Kj,DL2-L2ҫ P_Z5iYXE=p=c톦,Rt>^J+D'w&QFא^y$?�� �IDATaſ#+AM֋^7{K2&3C{uRn!wcM4"o%q^>$P>e@Xv}[ɑw}=c `y~;= upne66ky4+S50S| { ]` _㛻Xڮ0?Vzx{F|?n>}߼47_lWc{{-<W౿NQ 7CU}jzVq<FG ֎1n5h`Z5Ѐū b$F~uF5eW|Ri=J]g?x'O); ;'뢵\m[]FۿMCHds_W_uL@26RAi"Y!*.2$ JFR]kHzPtL\jRCbV*KP<+2a菸xj1#D"1wCbH:@y.B(MHAs*&�Ѥb'/2RlN!IM!" q,�U@4f\5EJ*Q2G&gFűiJUE̠EDkN)Cy!̺QA#UA UL l B\$rFД"RXg (Tլ�d"B�$-)2"C5-1|yHZ(tii #e"uŜWP.(Qˣy&)T{kFDXu.=`yyHRc/&{~0c3D@C^Ob!#)1lr ~#s-UxAϗNua^>HL$Qϸ>ץCaTp8rORO!Cgs b|FVldmۂ*0ۊ �%xg+$جǂq`xG�K|݋rۼv˻WTh;w/3;mXڶ,7/j\C_G Q^Ǜ+A�Ae]ޕȇ,!H<lλJ%ًMUQ6�XM`Q,CoаE&b])80u[2oSuuTZ$k=o˂3kk]kP:2S+2 %*Vb@GQ4SBQr(~0ҶHF.BN _�)#泓`2)ʼ?ؼ6"LMGfMbI.2 iE*"D$sc W;ΖΞ3A! RY cH&9L%4a#s"KYƀ%LEKL"q!i`ȬQJEgAQ)Pgf.J B`V Vb&T(l*2g@? .V 5j**b:UƤ2$fJLXٍ+cxW&iVҞMsy_Jg $I;Iх{#r M}d(@WJFчק)iCKW}0p}񛰨DeuUlf\pUrj[@_ E*@9讂lgoek5n.rư{\-O_y~r-nwOW@A-c\o_8cr{ɽe mVɎPokUz_Wr NZ+cOmE[a<kgC6 |08)zp�φ_Lz xU7+?u/~_T}ݫvH-RAlٳnw. fh7H`hwz9Ƌ;XiYZ__%BsE(-AAiGbv Ħ%K~my6* U@)LVĦSO*2>bH؁ (H4EU4d| rkGkخj)ATE%R~m/S_6LxDsxbVL3 *!bM2"T"E .  UGZEX!H<uzᠩJл{zh)C#d8( 1"2b8}0:1LQ Mj[fijoNF)h\Zr&$)$(ʒA.+uhTͪQڦNBI3UhH,fU؀W ZejH:!iZvD`esS4v-5Kc87 dx0I,SLQLl)n'U'bdLH#2E3p0*<3=0~U^TjM*Jgf%c=8B&p<iT.4aDeETe헧5:KJE%!n c[,b*){ERHX#4<W˸t>HmMeU ҹܤl;,<Xĵ{s+r|y_›;u`OUޠ8jAmq]yB+G�XƶePHqJYc@;>vyu (G\OoJ N+3[7@�[x=@-rҫ?'V?zR{|6'a\O_C?;^@a[p+rjn3Ly !wG_SGm7XmSRo} 4 M~hrl&@ nPy[+(c{sVQCkw"oG{eiQcݘ-=LH-BufYZ!w>OH9!;](ag%L%nFaF1&0 JDWUft$.YLT2BcM@ztj`& VrV6fȆ9UHII sĔ)%LI O$6B,4@B-ZMJ &21STI#D3a`!X$Uȳ"As KENQ6EV"Zlr'V )sh4q}jȜMME%ge"$"2$*6LdKAw zI IG03#$9DEբKA w 'C9:dȃѸ)m`#W,pP9i)H^_5K�wO6c,(]5(nkAՄTN֟NW\Viݢ/냯O:O7m*R@h8Iۀ8仇W/ۓ-M,pCH�ߢ.P`% 6;ώ?_QcFbT+ߴ< (Oxyzz= ~+ld/Ǽ _/#G9h_A<[G<�O OlρWlGzR+^^Է>klrqOa:N{W_s+ |&a/~oeM/q_h2.M ՗زoAO~ z zoxc3;R KE 8Px*05~3C'[l K g@Y&_DJn h*4ѹ*%CwY"%C5v"VزjẊDmp%z|0сd"s5$\0WS!R3BM◾*"EQ$5ޘ |H܆ "玙p>C DXѢ$B'sJc(I(Ͳ(SD ' J$d,K{o?2+Q$۵(V 2 o y7jK HjdVwUE&dĽ^\vax悫�I0|X/_:Vnb&W48J`0z;B X3Q!T$b &wGH"ds_O B@/&JeWw @i—L\{ nL`DaN\b6r,Da9$n5AAS( Afappn#?Kdi:U&Sw~Q*wFo:'F|5o#y%sS!Lǃ U @3`J 6/K.[<ͳҎ{Cw6o|oݳ#�tb*<-(Fx� ˱5|'}NrHb;| ܟmw~7v܋D-(#|@ 3}{[.*3.?a _?`~VP = x|أ_vm]b+OynXpحͻw,-&w5pCw8ˈς@T<bwu}_*T*^YarX ) \S0IKԼ t*vs"/ޤH<&� ,3ZG $pGO{7?F. 2N)X:62 Y>@>MGOfSV+)RC@lN zRKhk[xR m+ݠ`J�! 'ڂDb :6$d(#2L%b*2&sJ.Bīe"k_-�Y:<DE&dr2uT:$Yf*}ͦeH̶"[.n⓱NB)Aڊdk8׬hI(ZxSuL3# *IPf�Y(x=>auE2uQ% HA2"S"X\N=$SprS4ORDVYsĄ8KJD,c5BIHnh^ŪVLk{[ r{'og: / IG(?ٳCȏYBk9SDq@Zr=OxV% xK5g[_c0E5+>>RڗuVQfl 0N:zGU*l@'L戟\?ҟ,ebIϧ L`<@=HGL)P)NT7g匲`_ݟ0yk+TN� ;Wop/}{jt;`*9@K��| =c-W\ֺ7LЦECa߽UK}ś+EQLI]i%]Wi&w P")zԻ/ +lFQ�;^]*fg7JTLG 7eBPf(krT^R{3=y&@'8!zzdx"a`KlTDS$`"'9{` \~8jenЗqNags6Q�$ADDHH"VRVs (b-eFEzb-HSINtfQ!& qS$(Y0(#3@~5�LFfH .&JHd bELg:6+5bΫ4i`t\$"3=]@k> *@ɔ`\QxX՜E(:pQ* XI9SbL vH"gN xFxn։VYsUpS5<Kr)Q9bv R1L-)8DTkRU." siiG{hSdNh'-%Xsdb#Ad'Zip $լ5qvg OYN?nw >6:n{sSc|3W^?>bSbT` zGW͢ݸrTbF7{ʃ8(pLB {!#9p\z eB>oP_cxRw?:}hh7oSN@`y^P:*%GѼ 8][[؄ƽ:vvx%oNVKCzT@l+MT7jTnceQϹ]8"':vI,ʀxD޶-Pd%`eFtd{ctQzb^s, i8}=CKG53h "ã7 2kQHݢHy눒/_"pvsC,)&L_%#&qF? =~yTD Y$ΗowyyEڐ`ktj38 PjXd#* A!%=x"၌|ښp_H ^bl)muZzUU3 +1D2́jB]"n-,U@ 0,[ch}UƫR"nމAʤkvؒ�( ]!�d3#<[ހtWȐD" H]$!qsXB!`sl4XTW‘lI$B#9YdIS Q@ԣ$T%ޛԟe˩͙IZ2=.P\8m,s.:trCk6=$a| p?W8qVu;8E\?=-ZggX _wڊ.m9z;Mh A}AFAww0#:WsmoGSiߡ P4W"H1XzuL ^uׇBR'o@( J8)N0 oʾhZ_}A0{| kp>qxghtQ H,@I`VD0Db`xӰFP1!beCusw\vxR5h5p_~~Y̘N /C{-{cF}zFT3k}ʼv9xŻ!R8B)lT WIpޣ%D׬Y84l ekgμD6 15(#J NAυE0i ydADNXf@9kug`h.%=DE8CٙD DxYVFGZ$քh;YCOBgRKOxR6 N$\ B&V(e6fduD j  `" %%[b >'GRMSx0S\%xl2HL$$I�G°FiN�CFQ$RWK}dYgI6S}3 0W)&Cs#ZȌBFݗf 'B&Ka7 <%x%}8!<2 ^ɹ@(|éB3 բ+{䣰xd #9fW6!p)9JurZFRNM"c jy|JˑmOv 2Qy󧳾NdV~CN]HRDU.>Ը2ږqk~ ' 0#T�oz NirrgƉگ6.? o#\`^pfDE/8N3Z"|{,ov{6Dkm}U _._rbl-c6 116˄J{N3-}Tq 4@6+:=<{LKBRM˾ge -}@;dvGŝ0훔O~�>Ҷ۳<QeF9ِD8l>%2PQ&$!3zB,9rUSU$Ywb&;%YZpo;G̙L 7sFpe z )eUy<TX,(z`*N<88- p@LBvבrb5m",u7fJ0s#zd 0LH'X< Ȟ/nr$ 3_|@IȔp4* Dr85" f-DZfa9 Eu&h6D$"DʔBA"t !b�tEF"9IKk�� �IDATrdY 7)Ĝ8EHEH$,,sst$h2;Qn=i0k �EG'GZ8{p 0KFIx)ҫYߣ[FD idϜ.$.)t9"#ŇdCt2 #8,H9L;Ŏx8n62n=r`)p~'y򂁎b 윫)WҮ?NtdR Ri88`8oQ��R:i8y~_. !5|nBLİdħ (r,7ˀ8O= aGBz=`rq{?X/av;o/ŦD eG}F!O947mjf3g}/ ӯ. =j?fyYC4Ԏs1.;]-7!]Gǚ;ujG);H;̢JJsF<ȉA25ER2{ R*B 'P&3ԏ^Q7 '*d<T2WFPgtOM$ rݳdXb!YGz#rEJ)fʒ@K,-Eגs& I!!A(a1Vje7I&MKA$r`#�@HQ "ZX,bdwDRYAEiG]zaaIlk: h:'(`]82(DΔ@3y55GsGPB"<0Q fއpE ="d^ӧl"p3)D 8QKrϙFJdJO "3[ `fIk!1^yJ4Mp(eOD&).DR$22%"T]g#D _2؇y;VS`Ơq=T c3;?D oڊW{ϨxܱI@WsmsCp_|qknqؚۤl 8jBP 9B@|hp,Y{lg Nx�~  R�KC ޕ~_؋{/Q #˫|Ád׶mEwZ\m~:Ƨ9)em^•d<Gw y3_ f_>U>A " H.>}r_Nz9f��7X(wwA!!(Heg'NrJxLKX݉Ŧd ,Ԗ# s;FԈX\z*/Y;,rbΰ?)u"*ʛ!nBAw繧YGnںՙ$pB"2hƥ FX"bvZ!gSVHYhc"(" IH %):Q I(=-#[G�0Ą 0"Y Zu3,L2)U5Д4Ie0ZTDv ĸH!tH9%p+)* nOt4 Ԥr)t8Ԡ G=|1k-5;YZfM&&~r?-=F#!n张eJ F )jW2I젨@%Sv�GoPeV&bh1OF +?B$ M&&$#)О< q++P$:gIW{*=9 bOGk{q؀3XnI:6]z ߵ࿼\Lp[cWU55Ba �1e }T(Cq |lOp?xh� � >>oA �ưqW!{݀_:?�;,� z{1ٿEvI; o!7~o~@AqO#{\r>#x;NaXFX1O盍_Z||1V #|?qsP@kȴTL/爋\4 ?J8+[X�A׌RPsQQE`QB䮭"uu_�О2'@.L+&g#Hg3q9Hy)E΂dD#, ZEie2(K'b@=9"- &Mq4pR2)(:8`9L͒�JDUDDg8a+'z+@fJ11akA`IB ))ԩ"7$.K %#^(=ȘE* b9Ze]t�r$NĒJFф=җggK}<w ,ohy~��)!LJL@sP'ikTNBZpA) Melrg&ךtIAlș(s~bcW)?c"k/Dxa$.sbTes56oUi3BPFÐpoqL�g,cwcyjD8:[W9$A}6/\=dٻڮMoϖgV/Ub_!'Xx^ Hc\_8:g�DYePE1rshB_8>^=kL!.i8#A{=6X WP&"yj@سDV7@_OV֟x D"c9̆| El@# >^ ׁ됺Ts|k 7E#l. ۟Xg WXՈ+:ʿ�Q'ۤ1P#?U'df/LQ$RYfHܛCD+IzΞ$^̜) g;S`6Hxl9I+f.5B h^TEx+jII4z%N)cj&s7骦Yh{w^,I"FHI"�iUؓ}eyf$Wf=8Ck&8(@p@ZzbJx(jV5aKzVpҁ�Z"Eug)IuBBL:!LS:< •@dv!5@;uڜ={8G{6ܘA癑,gj,&׌䅌3? 0dHSbHX]L%:C8+,Ήy2wsD791B$D X4{GA�;_,z-<7T46j6gUy>O 772dA<?ޑd` ` PΨq,p_oCG?aD.w᫉5΃~KtL� H`7;+p+*& h d>bz  nn*܏ݍcb�_).+@ 7+Kg^4 π{Tn(Y3ޜx;i©:;ىz S`+K1wiP_ڻW|(}}~:ݝBΈ?Fn@%("{{UP񨗀n.G=:rAo(Le-@#!B(ĦxR)L UF؃N 6hPykɽ_hezFX2̲T/<"<#!(MgBl( C!J@.XWt$"A Bq~ /Y(S}}.$Sq՝ !RDHR8"0P,IERUHJ.=�S(()R9,Pb`BP)TDk+ 9$TR)DM#2")IHY@$"&d: eJQQJ\FU}3=<23zyF$QoZ#!eX<?{DPaH:U &he:uysVX43dBAB *%"PS*@�8gB4\9oL=:G8Ylť0fa,}C d~8#a)N ,r Tl á3$D B|p޽y}Bv]tH +4w*57B2T-T 2&ڇSз  {((P ,c°ŎmwC',_×3~ ܁{h/Zxs/xz|w28�A_{uw( ^!yp\"�.�Q\ Dc\L8? vO?[(/#|<'Y+ m�r~q^˸?08dyǺC--6ӻb PaGKD :PqjB hzl*r`&`!dg!Wn];mE@ XB Z,oJQҳ'mߒ|vM HIDE HeDhK)&,HE""a!>#h8sԗhM 4MwƂtL�SdHL"@T&g0:€H6A899dHh'Lr#@&;x !DLRTNiT"\HZH Xc%ӪPC3iFS"%:%RRHXI{x`HPf$� 5#ėިCFٍB hbx`K*\t") #4 6GtGʪ0P!bDoT/7@Ig̢&VRzY9,)QvK ɔ!_%៏o9Z�<[<~B;`G1=aTA1HBgOr]̰b�Q@� rԧ\7ez,xpqB! 84Ҏ0D\k7 m9wt v$~` O>쭔Wy |mQqsgbW cpeP_ߡ0}G3���|#{>� \~r{ 8/>T؂Q&TE�0gqz@`Z!wq/rȂ yStF>}x}MN`;w͖!F6Ih@,}m}L$Rx$vlޅc�GZ F�&" uJh[ dR'NI SIFE?r<'c5�;5S %(~=,!CcHB,JO!1sҺ< ̧$Cqc+wSĜ GZ,Oj`@&ى=2-sFfߓ_ �QXB a qee[ff$)H2ᩔA+)�%;Dg&q8G@ P pٺ{AąA�`iFyYOk1<XQȷlfPfڢ$Q@j^?M$Yv{="#+Ŋ Es^A#-4 jAQMDEnD(v9Unv³XD9<DqH %w_DY ZitU2JbQғ1_ *3@&އ|t Ǥ'{a8"q6aobQ[ieD";YIFjQG*|(P%}GW]qU8`bE 'pB�g! cc Cm r!#k%wT1 �?.Ij=9jG^zlanW|qMw݌i~GЗxlA wS_ޢ3_jP|N~xh* m}t/0h^VcÌ݌a[mG\ R^|lþxKX@#"~ng}%*OTnV O:ў/p! =/U ]W"}G%&| I:SbG:@fTT!k D氢Ogl&E$30OlF)sC9Jd(RRjP d]8Gr fmJc(W*F=v١Yr,A ֈC)5冼wx@ vKp$-قн !;Xn? =ӼnyJ~H9:u5ک@:eL Cv X'Jp8Y%|H"{+Yq0 ~0KtWJPYTJ�(y.{gݿIgZD0`Y z; �;z\-")26&L%2XJ=chfԴ?InkYftS%ˈ*X\kd"2${u҆_3@, 8:d<wZ>*կCۤB/*F7ědX.'ӿaMJ i|Pf@ бU`qۼh<G)�cG1}< 򴝿<E*w|Uni_d64VW*U!v{?Mrc-l#Ƀz$(_`(p~%<kv,*6\bwi *Hvv=lK-?FuT0s=;ρOkWsF5`[P*npWؾkE%koK 4-� +3 \.j_?ߏp 䌳͓p3:v)&`j}0_|s%nyo i5%# B{@@� eaI,1V[ԎM)Fp(LY5H �`GH@V&P"Gq,JŗhR$U8'!db0RI8Ƃ2AٌC yxn% >&9GdCh\Bx㊠iy^uJ| F47DEƑ\vҙH &'к3: Q4(l1*h(C22#RRtnqIDfsIi~Vp28dkPOXYϾud u"?e@;"-S B KL�!͓έ" 5�iL L9Z1 5(,ZY`@l#$gZP: 89sE8 -1fԄ'%68xDdpQp)~2�?rAeM}b}ckHA%8LBbiA٪(aL-+ ;?N=A;\xݸ>Og cz.�7VxK7;!~0|m?zMi _a I>b0:f ;~>ncUg4~ZPZ@k;<{=VW&3%wk6?WgLtfX `:� eE"1&hx(@.q}x{-p�;d`6j�vx(^D)^eNxTۭݡ\cUd�@ /vjQaaw+As|JvA �ZPr@a^9jL*:<9;GK';\@"a)/v^vgy7ϖ'�� �IDATF/quqdk!�X!sdD"d(GXw33\d<N ҃c`C3"GIAl'>/8-PG{R{gHzEhr !$4(!h@dDӉޝjNU@+euf@\9ΞG Pp 2J,XԓY HI$>tϜ &'B Ƌ2%|ah]], Adz֚w 9OD$!<WD!$E;qhBNp%"ds4>p7\=<F\ )*$J 4JXH<7-`c:߉R5rRd2fkosQF  |0حl#DIP򒧄xt ye$zbm̏ĝQ @ ' {1qROݓO51sDaMWo=^-6t85 ZKъЮtAJ}}7�ѭᑾ\M/kc`szpCt;~(٦aWdڏ΁;~ |TP;`|e=Wح?R/z�_kqs@f+b6|8nԒwe=O+=@OjG6#ÿuvg%GTcAu2=ʭ;3$;DHnIo=K˵\Ҥ;ϧ"&@pDXʷ 7AoCPhl #N۶Nˋ;(3r:B)2(H= "t苷'7( ",i]<;(iKՙ(DLY@" 0H ȲIF<NHu۞XRj#:�7"),ԉ\8)-aΠ Q_)4gXPT.DcpR$(%t6!ddfFAr#g 8#QHOF,¨2Xr9{.Gs -fk 7l' ̳9Y\{!Gq!0p I Fd, DDgj$D l9 j^ee%3+jBVCbi9" Kr\ 4 d?(el6}{.JTpS'z0/q C]}7/xowE5e0eG:%FY`^~vc0OqoWBptj G O �.#B~K>Zi@g<Q;`X#iWf=RyUo_O |Y49uS~}_WM^x@'tmW=Wlr} `ͧߵ[`\ G X#p1TM7 Tۦb/o|uвFm eCi9[@ua;^ouS˺iE`j3}YG^0FxJ X]nP<`H{fxEc} &K�jsY-Vׁ%[x_~~]T .D|"<0!"Ӏ`k>}Yq~}rm;Yh{)� |D#@S<G̺1N^h=JA5m3E؉iA笖bceO2]3!F501ī-D^:ņjjŃB- $$xP >S�d  8 ) O (O?8M(XK~:zZg&TK5R$Qff:葳g$"$);;y'3!I SHe ND$?Q BK "ѼKW"S55$ !=q` +"(B1fʌEq.k?'d]:B+3zVh*FJJEH,Fc<,r*+=[/x xox8=[}L*5n)G:6R1Vͫ8va �̆g\a0DXY?ʤ}?7cdzI~n:l[~{u�B+XfakP-eFzt <G| 0`�qweUƇmw Or ׆ODW C1WQ~p,}?ztn Ȇ?먁4 q., /?EU./xQ<Vu9inοi_EP5EEIwppAxt'PԆzLȩT'�K$#W!_Q}]]9}΍1>08 ւۮ[5Ly,P*nojkc 6d}놛O۾PWn$ܚHQ%{rj0+%,<\c~9wr�5M2RT |}Q"^U<Y`rb9'Qm tBq%+8Z{SV ` #`ŸCLBR$;"H!\H"P?w "b Km*?ϐ ifT3Is>e,\|hDęבͼ 4(I& ё A$$j WxS )L<dPK\RR! Aj�\<dS"TV*RdviHd,9SM) "H:zg6*iYm-=V̇=|G`0+*AcG6ᄘq0W;B0_E<]�9nɂ#(0;we_nY٭ˤ@f%2=*>^ o|=4fm+ڟMXH&P6bgN3];4�ƏW7j>_׫#VxYs 8Q � t +<�xwwN ݾVx_<0ذXWH[�O8aG:`x\B&ѝR۟ק?~,޽b5'ZnpF1\(J FByİhcߚ,M(8A ~nӆnO+j[6+;I_mvbtǽ3w,\QoQn56cВ=ՂC߿7W1E'  cg]i:% $[h'SP^U}BVҕBe=YS8B/W1n r+, `^D#ZxH.!9f Cꞃb6f*٢= |�I&#N :\zD <"g" NI!AN16t0rw"p+ n2{eL4Eqr�gvdD AfE&<(TN#@F �! %LHnHXrvN ZLT8#hq'Ar#q!H� Rͳ@8V=)ƣg .g!(r8{X YbM%I |pIWufL`avjҋ9S00ztNU[~?=OK9{+,WstI#Po( 7A W@I Bo+NKxm{ib9ߏ0m a RDRkƆ\5Ӑriӧۡ^$Vs ޣlFR.VpAcNa�>#b[ڽu~vB|X]wuZE ޭ0+Ԃ`@_65\1pq xcx ˯u6 _A׶* X@{,_b:C4k# F7#[K;6ӻ-/u=U_o+AqΚϰ1y ;*Wy3nʸk '^0vAA@)pk4 9'K RïB�ӎ䄒eF_h1ŧFQ̗@ɺ!Iq0'$2tWX:5f J.K%ϙ&0O$h,7\�J=r< t#~2a~!4]*~K@„*/lܡK-QP%ظL`%9f9tiagh)I!Z fh®L FΚ Ýg C8e"<.a9g7A<p#7$Rn 8H dZؖLInUR]2(tO" @KFtSt.N BE%Aق;[•fۜ kr2:Rss+s<u328 qeeQ.F¡ NG,6܏FKd!mlANob$[j'D}xMlYoE<G} p,xY~_dd@d+TI# 8>m"v؇llĭ֗¨vl[{*Я?KC?A^Pj㺽i 1|Z$n` F W'\@|n\C'+~7|?%P@t7+k8M[~ d X*j*ZI PcΆ EyW >$S}oN(k"F,e\ꋽ\kE|d1C̀ÇW~_׏ZD0L ]6qr.&5p ;Tc'41ላ;NӨ(keT%dx$ }(={}ij)W+e]3R~}"l}[n,N\1jY$y𘩫v"8=3$iMFUɥRz0EIXC�Wk�5A/@`ρ)oאmɕQA@6D=t1g]flB>j E4\<jXXEޝ{&U[*GcUԳ hRDԸHDҝ̳%K(e-:/IdvlnOAHN"9#)p-m1AfrFǙJWK"Igi8gt$Q$[[P0 IC/ԓh,nyo #afF"G )gy0},ABr w)%ND@*3<pZt*iD0vފ5"F6g1^v2ʨ*Mv:ϗr utl#FbgTvmm5[빲bZz=qjuas:Aw۵Xn/ZǾ ;rȤ,Ǘ3~Y�{[gs,  ~ Vl  $ Mf|F �_A_�ũ?k}#Bu# w 8} ^a`, ( xxX'~pFhEV\41U Wq �/ kj}xxڡL <gl cɧS\{;t EUݐW�l`+"m(i Dk4dF贬n,1 MjjAVS2ysXoO\~+v%Fh[n8.@ iX;/]MV{㧈EV�Ӓ&�!(7NZ,T[-Mʢy9diV™f1_^9?KAfw'F|OgZǵ9$ca[< Z^W=B)pV=bcʥq,p!'-\Lٱ8W4!|*SPH2I9.Q`8SS2AHONL0$5g$tP #$K�ҝɘ:wO=8Fd ZTQ:`AJS�I7PsF`9PwLmv㔴qI(S:$̲I[X8slV#cH P, )+U@rd-z4x3o-Strt3V 0,i={e Ӏ,/ |<<])J3lkM-XCS47<yf/~7[K݌xRxv Ce#'^~y.~w)U ӌwWg?>mF)[->WW VA#a0?-wX]AD*#;Y7bǠWHG-P%.ĊwkœcHt8~c^#^Y&؇V&/ (Uvx1A"HÐ(e\ `0lK lx� (xݧw+qj:~lu`Ϗ<\auvhPplt~͗(ٶi[ks |kW`: L GV&qBcR?iǺ|R -}[ia66sԈb`NkK=,t ݈5!(霍-G+':6-ѶPej=Q`0KX%dDIq[Y <ggUd:Uފ[8 9ifTvEg"Kj N7!1H*T^@xSդ90#:`!I[[pcOC4!Qv"O@sϚԳ98s/A$AəԻI6!tp'- 22jgE- sFg'Xtfh C=6Ԧ!Ord =܇a.2$(v1@J ȵRcal~N͔duoDŽQ*c"|#fK8娊^@GGCZZn VWQ.2y�08x7yp/dsc?XoZ0Torsj|0r;NEhdZF?=L/ q~NP)3Ud|@ڳ9N5jX.i  7x�+Zz\۝_N ,qա')/ 08Ah\~ @;>k"'<d>{6 O7X5 LP<xްywC)4j1^a ˀEQ;`o( ? OKxj鈕6u/ ˿A�`݌X"+p&锄"g@dd,(o^@"?ͅ4WE4e*^ *YK=E'Ɩ%+sRUx,dU0gC+mx1bpJT%&yֱeF^JgPsYaK9ls2OP#r8ϕN(EABA#^gJ'!f8tǚE P(2]8HHܓ2$ФtUf6!Mf8y{ɲ<1sν="#ӫ- f 蝃H�# 3ZhӖ Nk0ȝjQDV=32>0ETc~A/^; 8 Ð S1jjbI%K.GW*] $eTD$K`FUS"a(CkEF,&l4duA<Ģ)P>dx;Fr]%(]=Z r7S QMxp:jđa&EIm�� �IDATe+:[Ja]K ҪE W)'-o+!c^2Oak+iN2.#}/~L6e$e'dmXi"Cvd%OL1)*i9bFxHoN"?w<E|d"a\m[Дc!+* j(wW7{|8Ogm>|y[sPQO:=SmnKn۲*+ᑿ<cOD/Acg+|d߯_Pىdz$<3 76#'Hx:_&;͍Zrp1 \OJNwx;~xE(ɟk.a qo wrԻԅq͍{uinm: TH¶tdT!rP;'o}"1R55N?v?uX m)7ӱ7wҧk#q^?Xr[l>gO99_B t^U;F!R)B՜"Ҙ~UU#1 A/e#o#/i$hX2ijEM\= :z}ߝiH,!2zHHͻHuڢe$Xݻjt!CFG(LLE)a>¢kt1$5!2b<: NC]$"eDV%ÇJ-*cbf.!.=xC]Ż\R0BϢTMR],)E'UFRסZuG$f"UUJf3չh"Xv&CVmˆUI|54 u֞ȳI>ڜG}1O%gLB2UE O�!:K Cp=058' HTzJ-R9)Qx<bl[+_Gɭ*aJV2^8 mOht^m'%ZbC/.McsFzQa<%2!OB~_%Z{yÿ�לk+gmp׼{2w7=Tޙ:gOj[^(O3ވ{*G߼9L@Waݒv$9VneC%_[>m)9 {[qOX >eWϻ,f8C=C\2!Ȥ^:@'3ِԨkcs:,?PE?~ގ__9It,k"LE/W_6׏%듉N$,"fmF^6\O"14Zsl<ZIUFW!6ƌDNiNXi1m0SFsmL.>h}Χ}WgbK*`t=gEHoѫ>>:#Sw u5uH:ebW D\{<NM55ViLH(IyA)A*CFfN w=x{?I?jFn2\DD+ΈHK*IU(R'jyDtnqyTGb!=$)b+sDN~4﫴cM/}4G5e2C͂"#  tqOPM::w_<vHd|փج#Ot+֋wMwsyhOb%m($xkIgxVJ*8ƠjǦ6r(w[.! f+Rf(x[ HJB^8d8?qVONpA읃@/tuX5ݣ+q ޱ%O+_A0gH<t hH#?1cԆȬo#;!Ckx_\nGz^Ůxٶ3R X Yg{-W Srt?"? E6~hNk\/ݑʞ)ӮMY@+,Nؼ6+Թh<7G+~<ML8Be~Eؔʿ1b_Sӕk Uk Ɨvly]s[&U  ܈ џ';^ ר]< o 1hKa(Y1xn6B(3HdE&DJQѵ3_HibXV1G|dQuIM)>EҚYv%%ICEګV=K%%A0m/Ѥ )EHdA9R%$`P{F.҇kĒDR׮Cz䴆VIkA7wMde$$3TuE[& <t5PӛkֻI3KK"O͇:.k_<Pe\iY0Auհy:\bƵ }B'9OlJetO%9y襫 '|@zHix0FCxDBÇ x[ȀSUj&%o[ a$vsY|؞ߓ~\#g51![BpiϻΎVS]n}_x&oS {&T(9Q:Ҷ}Hv-A|2Lo3<13Cq% ^6{CANR)I/qPGWG uWHLό<sӎǧՁ7tU{OnL>5(W莲!L؉߾}y_}0o 0+?Bm}sk�^aCAK=#ou\U+5}[s97Yta! 6zo_ 5b"BpA^79?0nbxŐĻQoNí4~HYNvqvr#\ i %,-a{}#u,ߵ!w,la8o!K_5ɧI_ERSIl`$SM)KcUE'onQ=o-emIijKj{TO/UtH<e/9&M:Pt6, QԤF` זBݜPs\$>".q~ ? 1GqDl" _ēa/~{ꈤ^'hk&b$4v/t@σO#<< *Ԥn1PS99Æ*61we4\KBbJW+F$ ݺZ!E]U4K+MuYݺtRHj%KS%]ʟl-D8XE" thO ĬE&VjCu_VeT(i.޻4R!CFazy{lm˩1vKc :sPЀQʌ~Ѹk_oǔBBu/~ȉ2&ҙw9_-ۂ%Dx7W|Oܬ#r[[(gcWjN7~[Q8 m gR':ï5PO?)JvS*aRn.Q8Dm|E5idR5rtŻ7M7SW mwA1 ia?RP6( 'Z, =&O-۲YЗe?p7WȩFjM]~F_|hwft<OƠ=SQ+r2s):J4}_مv 6+l;i^ܪ;~b>La:"F ^Hڝ}]w1 sZa+5 vo^!sDK'IXF}$X>)1륑RFRbij!jI^O 5&-c0![i[Ne%F!U~."fE_ƺ.YKg BƆ zkK҄5GojL{6aC {wB:ƧO9j!1OJNjzVĸ=)xc]Mg{H!1(B̚Eӂv\&VLGX$֑9GjMr<iCT8#MCa-ZԤ=E9UUDU3h9ҢiҦfLj_X &RAI :fA[;tٽy>;2,g7=!s~4Fŧ4,I r,E4D2N6㔥/6a+Wįyg<v+49qvVqT/%^JP=8L?"4!J?p1XҟOI7O;c,qV<yiVЅ<=1%b?-{ƅ_ҾfyM-6ض}\j1/<-|z9y? _W?Ӌ=| {K\Y7NOTX3cuwVh,%Zڑ)c4k;ؽ&fnoS牿-|}TṁƏ›r,_,kjÎCZ~yx'&_hq_. JL G~LT/h&܈:9557<<G8:@ُNA־O|&6@e0Ee=###^CN`tڔ Wܸ\-tfPJLUVKOI<!4 6EI=Cs5,Mn)5]{'I$de1$YKXC.R]1y$DnN=),[Xe#&&&]DŽo^;ʠ;2J2< YIG YinN{58&9]W/,*O]I *^-G'ų{ΑZxhō Ť: *䜉.ӇZ;Zބ] ) ?:!mF}u`}zmbAyT!5:լiYf%')rdV~#1Mڜ9dH5)G~6psY6H]I@U5i~*Vg>C6itG_v!=&펫Rdxu'o-gA+d45p*gI3ɇt }(`4ʖ@MXf""3[v$H汴j?oz5l@.P}'y&4܎-? _;MUREtK}) }@+GO (r{),mtXtW?蟝?~/~͗9kËj4k}K%\t'w-qvß%.vbbv2`N/afzhbwZ!JEZffGᦶjH^/9lI^!1 S@vb+o @~W*,y֔Я—Y.>Ex0l1ٺMO1#,]rb#4T$dgTҺGT0U\0!ϲUVқ@PLzوleTj:'ML15&EG(ч47i6WgĜU_l z .MP*,r,6A kbjmdizh*=ą$Rv-Z g֐sg=NJ5 +ԑLe63xcDm6sID=0i[ xk1/*i'Wy Ψy2Xr)j<gBR2/˫iNU84q=?yr/Jo<2Ce6CI-{gjW'Yd[Jwo}cuD LgjxJ`d{ʓR%A4_6Ӄ%V!s=m:L2n372/ea_頃srPb_1Ç’iN(ㄫ'c_JNòZ|u\^̈́28;˦Zk XP>.y>]m/|3F}˴cwnps%;w<_s||`MHvߋ 3:xgי{7)!|N {K+Ȍ�\6dX!|ՎYY OIwb c+ƃܡ`7-ҡeЃ\SCzi}>Brb:z!$;}:ύƫvt9滟N|\35D/Kw[o110t)9C9?}Ǎ8K%R.>lbhf1M!"Ie 2$FW`R0\SU" ԡjIqA&%)$Cӌd%Fz5ܕPЈLgɫKs�!0WmM^E$S)gc˂Ht>C]xÑKp fd !-h՟'u*x =$;1ĻrT=3)$0)xp}l.CV1Z?co~V&f]ChS3,|/__l/ʔDt4zS?{_z<3{̘,=T1(1fihfm?kΒ?H NDc0Sxn<UX'?Sc6]_ 'xP.nWK]ZѣSw3r_mbN)R)Ky(=B*寱{N;;&qp Xheƒez;mæ.`q#KUԵߵN )Z/ֳ=کi*5J6^w;y.uӬsH{>0#)znwK@Ow,׼ OH @'dAOL;5ֆpaPx??Q _;lOZBWzm`j.ǫG{krY_u&ʺM,`СgJTMéTl@)iP*vINjDa36&x`m/7P?6EصeۻNNoydO {\sEFasZrMg͗kq#lVRև\r!f&fϒEp)X!]i-B<h!c HrM~ZuKyT3k^Nl+sr U͒I5^5ź*޺3t\爬!VŻ]J}X+^Ud.OQtDTo0`B(*/MC_<Z !† uyIRbn&}<w=Y̑ac<NaJ6MND#t-JcL^p** و _4S2$ޞd.bIJr,KI)ڥhcLms:,y5GOb &*Aª*f4]{G,KZtK]eFz}'mNGg/4notK v;+M/4ީ`]+~][ޒoDrdqUܫۈ򚹓a;I1y*X+E\F^O~gm{vmú㽷G??LIy|~Â\9|?OL ;_/JYtӚOt;]2ƾjy8nəo8}; ߱ >tM) lKиRֻ HiLTHwt^ BdС&^2 Q*{6w/]gO#~̛ו-~,h…~"(ZXf挌Øh ~Amؙ̫ <:ryb;&FAaGڕT,:nv%S~cW8E�� �IDAT13Ԩ7dHκ4&(o_5`zzw9w:79ڪsuTѓ_U?*;ROrK*7*Si2i2S}a#&ބ! #1ca"M"Cm;CΝ$S ܽf`**ZBb"ރaC}\O8i)r`՚SV}kGTV/6\|P.Dv[3 A}as-<IBKE]eQUNuFca&iV.Z\exaB%:FT M/Ha!Fk{<[heΡ̷S)cģ/MܑGLrb&&(/hv6:d%[-!⮈H/b&Ke}*dC2}i1ť͞LޚF{Fbͻ&^On7ʥnk3</W?^HLQƅ I-)͋Q6GίE{/ڋ%R3=, p5o@a盦kys<=י;ڹ3s`:27R;lMYjN-fM7.w/ֺuJtPyU [ o+h39|\3x&/:8[~Pzz6[ B55w t5 떗J:%i/} w_gvϗC_ _ʛҘg҄\Y$4a b\t.?}`0l9"s <>3Rh;ߖV4}SіҲ8q6S|㍜@hUnhZE:J{,mṿJ,,ԡu]{Zr礯 f_O5�yH$e7iD$޽{\8^]Rx1z1r9' eG~F71Cg훑6.| Psߍqd|k\U QJO4R_?G H[u ՛0d2D!1r+.>l6tR!Y,Hr5E+- {:+JZ>Xd<1:nMˤJERv6zu]ϵHdJDJ/MAhEREc`_EMє|q *rc.Umh4DTeԩ{taW+\|Vvb+9t#zzۄa�N̴ qH?o_E~E݊">CY3?FS'҄!MDՑml?4 Cr|\8.jx۷| y:A^/? tw O}ŕ@a4$grvcf7uϩVr?fx>ub-O>gwǗ_k|/7JZWKW̝w서ns{ qr_?< ģP| 6-<~]'~,+yl͏d;FWEw5$EP2p{a@Dx# Ox� D�^E%i&t7*+3"}?"eY֌m"< R,ӷ/\֕#cU.elG:XNI99nx,Ä:E#J$a&lؚ*c< ;'E4e9ܱJ^ctj6K\,[źKڼw;}m9}?>O!1ϛPj_=փ,5!KTh(*,'u%E7ъR MLL57ǃ55RKqTQh7kKhMi6b ^ct^\UAl0K{hْ&&e10 渴@pmn9cGj:fӝރ?hss:7,M% )duyՇRje!҃vՎU=h",Rj邚{] wh6"aP?[Qi6j~Zd4,Vtg"s*XmH 126⡉zNgQ\MDP i*Zi^0qUULH}4iem$вӓɼtETWb`p<K<"No9%̶KP@(moZ!u,}-RX2Pr\srwX> 111vz+%] pp갫rsjD+u<QD^zr3m>&P)oc:~Dvt3"aVr̔o_m=9YwsX_re}O%)rGhl2@ʓZӯyKxlxr>=}k9wB~闄D8c Wm{EɃ1s$e$w_?|O #FB'V8A Nk#Ÿ/ѐlo#+f7pI;cU}Zt)x oFd[EҫrY?!;fƶeWaӇi+A ^66i2t!wcT 5_کMv2 ITkP )PE[;I]@,XؑMZ զAVɮ\Ԃ҃?w&ޞJ("eʌ0gԫi)jHABYi-i֤K=6ChRIT%iҪ%=]w@&w7%ڣЉiooq!0.Us>xHG)-U sGz]*Sj,Jp+9DnꢆI%5$X7 U ю.-,[4TKv+l(7I00&mH̫vL֠9قwź*mѦAKE2Q1H%{>wES?+Tċ%XG`ZS-"uEequ뮦KւU[~LKn_pW &!'G$iSLqs$7n{>^mv AAB+~<5,_>6e[_kՕ*2С.$6N+jT2iʜ%/"oj^k\p6l?b;KVHSpȈL Ba 崧⯐yW~';`pH%y"_>Ӈ>qH.er$'ϓ\nY㼻 7'?[˧;^g^/؊<}(]"/WeVJ<Y1<Sʒ츇"%Nk4f‰ 1eţrPNo`rdapQHP-Y7thׄla9lBxK\hidN4Vg$R6Yd5f]hi=~Qúx,f'a}3}>'Ih_boW%dUxLro}Oz^wnNTEqkһf*Tݛ")11hݬQ&ޅڭ(ݡwf.jMm#%4t_5\?6_9#$IV魷]'LDHUj k ji4{,u"ҽhGAli8/Emhr<޵AP<J<uy݊{wQ.KCjj-L5枳bgYI"*4FܻC%?IݳI02=5WrtE:H >*&aP'΢H#4I[Y:>)(ռZ V[qQc,J {lk*T6޴9Ā9?ݴGϜ|T.H{;~El o7+.6?sX,yRR*;Uܨ{v-p,S!ndwʔy{E%w*'ؾH;v|>;Z6-46~eΎ{!3\9vϡH_Rs8opGӏp;ЍrTvL0JnxJ7xpsi?lx2N8{2k Kx?-\P?\}XM8 LJX/[~qB4gz ֗;{_y2mDҲſNv٭`Uxpz3N]r 1CO\on=?A'Z퉋L.)R=6K{7KnNZSZq^,U hXkS*PB'Ɂk.K;{ZCܑ"A_ MTgc,Nk9"T\,+51*ObhZy1hNMIi+}Q]ZX3 ҝMK`=c=Y k-li=uq3V엋CcTs;1ߛB^_>Y.EH Z7J VMݺ%Y ;V6{bwO.34Ⓠ!.\EngDh [ޜSXb075ׅpO=b4Y*O,0Ų1zHݠ/)=zS^ F"^ 2!*A{xnQZݭ9&!xm8N-$RÅHrU8,.֖^x,<ȼSǮg;RCj9p4=@^-]HK9�5o=bg /9m>&ܛ*oA}Avd:[OIV] ҏdU<=h5cQ#Є('/=8*c]XQv&?2s5R^WcL`o8A<VZSN~:*#Sy�`_2<#GT(ϐG9'@9~IYqB*pDghr]zmjzo)9z@EK{~x +Bi$em7X˴N݅V_p=j;GGV &pVi#XHٮ7ҁTfj;25G<qZx q]z?kn[U/;3_5~\XO0=<]O._ƋiȺ3Pl<=e}\Sj(szw }3o+4=@C_%LR<K=&BGSYo!DK+6V/4j*w[:hRЬЪ!lq .!u3]Ǿ4x4mqǠ=Q[Z$jCjMPQCK)?r9KzM!-'լ\SKi@m I7\+'EjHVB7 i�-z(LjS iX*`EcWDf%Mx݂Q1(RO6#]x !!8Ѐ 43䱇41\5jÛ5kns#K箃o%"ԠV;;19Cr?]Wڰ7mk}WEnB/QRv2J(ؚ~ݬSzR⫪R^m˗]88_&xc>=/dk[* J@O5Tuˎ-gU!^X_4{!&X{a㒫G֕gyt)睼O'29`28Ey0=|y}?_y5߿ [c[wώtFOv7<iJOKxUdi gDt9l29}0՗òsBec0_gƎ5M&6DNL2}a`Iqo mj([o;{N-wW+^F㓜JSH/ۍSꥷ[i 33(x$/p+!,|?/=6v%8%kD!7Ͻ)f.IҺ1N[w5zE&Hm=GS'# Go<k.XCBcG7^"T}+9٠"Qd-Y=H ZEIhT)-ӥɰhTfȤ.Øu >0wpxiUmluaEeQTzE95{JwuO$'k]:,#D*j1된j"�kk ]+A5ջEr )`$؊HoMr$4Y.QKDT{/-XnU~26vbz&lVt[H̃$y<gUz=MgJ(a.#BXDjQ񇴜}~müׄZ >LPцf>a?J*Rw/v'NpVD,MخwٹXswtȕ\¦yzc}t5]tu4 ū7 &XcxwM<8(aA%iDd'*%s<Gڶ_w;~ LHMWw MtX ~x}GOS/wstwuEӏ^)`{ϓ*2drf a$FZ:#W'jێ#970q|Z +u'lW;qAua|igt;ڊ䌑M#~r۾^𔧼#ͷ*;Pm6uPHm=zϟ~Bq*Wi+1 ghBJ?,$%Na٫B:"=,5^:k{ )Ճw,ς]d2=+VX$R|Y-O٢>ZmK+Vs=PNV)N)c9Hz&ݛ2Hz_SGY:zGkM([r/T<hTj!MaqrRNBIT^0E\%ښn5u;wuJi1Tr[o|[īƎO+5/UAR$tٚ`Yw)> b>T}WeAN%xn.9J#[SѣX@9s5o[ZegjXAk`fI>vĤw]k Zk uI guUD@ڢ-u5<eI^ w~'(_\Vf,?" +Qy<@ڷwX<e;S![mZ횣7<)%qU>vvM?l)si{ ԙ3<BA{N_l71o"eJ9]2OUf>']k]9,‘z$~mH b$dR|m34ٿ5lyLLCc1wsq�tI>OZ%ۃ_x3^}+.+xJ)H /]6qch;r.}ʮCV7 ~HNTezfM'w-80^/ հ;bFz/~/H![Y:iGg^vϐXWҀ`UBr}_Re%5 {1l J} zqu=e Kv,l>'+ފ5̅@Q[3y:x9؀OgR!u&ȱǏR||&cE6 'pНDG&Td1Z+MRUEUJL[+�+;}3ֲQ},Mdkj[-s\#¹˖�� �IDAT_y}i]̻Y[(Y=Pz\ @Hu0\ƹj -ݖâAb*}q/G oç58(̼^z'zQof s42g[SH"XSiŤ_w]>RGbIhۺzc8/<x•),#$5BdœjUFG ]DRntimj]ob;Yl)ILGSĤ\~ 3xM~<q=A| `ٝC jNL%F+Sy}dMϱK$qoy|ș ļmmWLz7`lj-/;"߻jfؠRYWO$+szs5uZlo5P ߕp�wd NtR6ӸTځԁAvcc)%I8s ;8zErF5.dHg0Thq g#QPt!,H9l ;Sq]𶀳Dbە~%\_vĈ>2r 0aOxN,Nh珐~diAް<mkN$3*5vC de_TFprj4cM4VZ{OJᙆܬRR~ʐOAc]NW7[fޚF-jY.X{fͬ !ipMa#k/!&գѫ%IXƐ84-v6c4=FW<X6 QQɘu(+~%dEY_Y-֢.]{S'!gىޥ ѣ".^nKF :jT^|ѓkJ.Zctf$~'oژf{0Skuz,ΈQ>J뚨s{/X}ЛUJ U~cΩH|%Y*⪶W5j[UY:+%G%#ʙCKYR@ϵkFȚj6i˭<}bE4,qE? פX 69c3\˔fҗ", aޛ+=-K3RdhG߮"^¦sWSwDyGK.tkSj\;^~v._RU[k;[ai.C w\˧@/8<giwgˤ0]7p| "x 6Wɞ'UEJx۟X ITNNvn}I hc#NDđ9ӛOos<gim`sX5h `]BB*A8<yvl|OLKAuf}Cއ~w}W'.} U^ddԓVZtؒM {OV./H@:r:mR~[+*K<Ee} K_"6/^7݄1X}罷Qr5ǀr/bbz󐤊w덙jqId!W {1`!v$X'<A$x2(KQU3PdAѻuO+у6Ļ9]dH.Brֻ GӘ}=$sIkx%F񦾸O1$!"x7KghknxjԖCj"Bc cPufږ<0hr8B w$SNK-] "Q%D9;zr oMVr"ކSl.Z< } U{]ťDva(1J{ <t^mhchsKM<$;o~`, ȑGaݩ;߭@$G;UFn l hƄTft~#ѧ6JJ>5v6yd\]5/>o֝\=u= 6~Vg%QɵM<ODbmPoqS=qK=f5Mo;㷺;7۲tQ^P/k9n_W6| Sr -?-n: ڞڮ +| Wכeɥ<g )|v{ҊimhX.u.ۗi}3XDvzyWsN\ŪKBTzT R'dwh_CL*5-. =`!BaՑOo~is0kᦥ0J" DkWd` iwor+"H-NeǛ~0ȩox}}c!\J*,K <1kӠX%z >VzS{8~/e\K%L+m:QLc;ΤAqO=< H ԂʹPfiDQ73ؠi&1 Τ俳Q]̳h{O tS̋Wn=֪D`5 ԟ-[A<!BrO-qڻ.i7oűDbEb/(%jEy0K]ˠM~U.)mԏej\̪,tF̱KϴH]}b鼵Xka5ī!n|b{%c*)Vl R27>4 =h*|twD;͖C_%L#)3_7x56mj1rvVvPvo0`#>L9l߃1 o;Aɹ,uHXC)H%W\s%od<KTz.ƾ:OVys'+_+VO7?+:ܥ:Is.V+miVr U#(#,BHdy-/ Ni,E8g0�Ky[D圗�UvanA_}y|<kg~Li,"Cg)p/O{2/u% �uwx]rNeaHXzljEL;ʶv 3TYH5}k ÇdxNǔ5ΏH_ۓ#ysS3;L[*-qed|@C DT)kmog< zjhgTo~0>&O)υ%ֱ:v&yK[9N%6m.W耦?S~YnFҴ"'ڥgb[)&着қuoy7+!k1I.h' 9L!eix~ryc<)PyI8Y<4tRB7SjQbKr&ޅM4h@4lsDCl =}p+哰j^+A;S10$554drLQ%ikn}YZiD"d9Ƹݛ, B8LlӃYY(N& jdf+Oc Ia (!%o&)C{8͆_LH;k@]Oeц.gsrU!XbY?hMÒxwz50tmfJi7øo20w؀ @/?MLN�qqO q3'i,~</^37*UH`> t/@E|+}nbBFql!Fhʪ3#"hvV9gWo@=`=DH2j\]W-RKw!.bӕ㇐/ݖ3�<| drDZgL"4k(c;oΡl.q=|:t/{v1}z ^\>,>s1Ix_WWwODi 0~ȐxG iw5cp=1 hxl<齝8F#%ֲ>>-wƝHkiq`C,F" Hd>Oo#zWj:$c:6T.u_FdZ R(>Uܼa vT #8%dQ- g)arnWefZvNJuL8,ڹ>i,k2ԾSrM:Ku4Vuǖrz9xժ�^MT ՜JysRkՖkU RUB-@7]']U>ɩuV s;82e4ZH(ܔ,x'svLDUIIr{o,*4(5Ks**YT8Lhphf!pS>;'YQ^~\6G?|ORCsm8Se3eum|'▎^E5V Ovy"!KUqօ(SQ*emuoP/\ -yj'q)˙ԵE,<ű-S;8Ӵp1j7_u=&(w %l42mF`.qyG˜Ćoi[K3n#+ps͗s"Ne5\]HyƧږL6|0g&7-紋%Y,N4Q?D LCb_ ?a3g]yC {} 1[wvӽ ^_ϽTB ysm:9L㶧<{ G/\z1�qvjJG2gvC׵LeKL-Rmy>+5׎`XOO}Jq ])W=KkW:{1L"≅V<W e|z %'+׸+>97~KOgG1\jg\ŮNgSpat)ɞRJputr, -v /*-^KNUR:SKWgTBP׵jSzi=$13q&gdrf,y4je%C2-X8RlYO4VmAtGXέӓjuW)?T9QS%ģ,"J b.8ZU x#֊f6<:V];%[֚PmP9s\# b\2eRjk9LکC4EH853kڪi:q^j3#6P-:IQueݦNvɩSrH\]>ڜʧ6)/\$,foƇpC$n-e)}Ympܵt'_2Hح>Ao5" ::]c Tt4G]b+7E=RwQg]iWNqzwU‚le2%39>qs\|98X\hW/W;6IYj;>]9^ރo 2϶tp *Sȸ?ޖpIu8E <aÖ5l,oOhLU@Y`M' 1�M&F(H)$Wmۮn¿}zӦm8n{GQǎ[k_•'m{_r263t2+A3fmISHw{Vg^x/W68rN^! N) lB 0}Nx4\Ɓga擊؎9$_.wDCj~J+}ov1.J=;9X\~<zb>bsL(5|ک!5XɍxssTmSGZn$y9z'M*h8YVyl5JIk*Cv.%Oe4n5-2YͳO˩U{R,|Ύ֎jn)"'KS,P۾bI(QB͝NXèd^;s~KlfٹiQ=hS; Y6Y!Xң߶ 6m'=ՈnZ9nY`mtyYJuJU5WԣQD *V_PVg9"]p;mYr1B4/n/o6ZHu}< 'zߜz KvR~A4ҹUhOxŅ\E~-^jNY<nt\:!kR|Kב:qÐ؁D9T7m7i[]c9g<w8H|Q{X=- kZh׳ M]l9_Gб` &Wx5!{݌uEO~HK B/ ch+~�6H}xa;r񰾂K6VvIwg�1`/:Z&r/t'bmkP' ]+m,ؿ~M"ŘE~HR#Z6:Gvrqu_3{8x]/ͦc [kxq;sbC7M uos-lx>ʰ&quMl'4݄6:';k\ :!{++(#φtfGKTUj^r1ri xWVtzxzՓ, *&Z0*I.˪Jsf)*BSIy"\o^Njj56K,̦b\IH?AfOOKR Tz"`VZ<f yׅ"C!W7Κ GJ'K9sd{.BkŬR;kߖhЬa߬Dpms:vCXkEN%L"jּzMy&\h1X\\\T.t8Sb1LĹtڊ&QX�frޔZ:UEZG?jo%VZh=lu?tǼ<.JsZWk nO)46yfIB\Ev=wvKy𘃞|3BA2]a~Ki vf7lVJß({`oQ" 5s^- RQaKwM_c"P;#_і<8RB^7^2IYb_x.I/MwZy]d3s& }BŌ kЙX Ĥqqe(Cۧ7׻Wp 9,觸<#|A&?m'B-C]t,+֘ gBo:>c_ߣ;}B8MMnt ڗz+"-m{cjB%0>݂^|c^ip+^'C o|jSqd*tu3 )>7ڎZwՐoɉ\%YJWwOYԤGik 9Fwֲ3f67P׋4oBQe^Z-B5Q]쳲 VCհi_F49S]*EJr&A#~Q( NΝv44%f)E*};'s+ڬXO390!y$ieJe҄{Tห4Y(>,,fq-DSgI ҴXkW8cT4t6_ԫ&uGߩY3EjFMXR]ԄRomW$a~UZ>4y9շ-uwY\aoA�� �IDATay";؜hsC%]4ǁ{Q>i.՜ѱhu%Iwۦp[z ThGX&ɐ'bglj;NzۖʯPFifPmA#Ts�yn/qDXx~*5@Pn@=>o-H[n[Tỏvmi_wȼWo;~G8pw?~qб|Afa\zxy=Nf;֑8G@ _b̛%/*nN6քYinQoHkAV qt{_o?~j=N?sCoy 2* s+S*$Ig1 '}H$7C89; r=GU" z;u{ fMXbgGtEFh]b]ǘ=gJn}.՝S)1vm/+5MNn/wD ~N7Q# U6yd8hJ;/6Zy!\eH8BN*'wt^Z3Z('+B[޴HL$/h.fZBre0'|Z׎:IFZLbD-GU#*8I_[Dvюa.;O\HBwr2*:dBŸ+g4O!YnhΕEsT8+ `m]ӟ2胆ǝ.΋9LO" ,-p.tzYsM32TS/Nosm$5JEJhҞ|&2V#LiaWJHXj҅u4LEJԋe&RgA UnB[C J$2 x$$wsL*Iw0oAp3/ۼsݽkRÀ:La }MV0вm3('Оv1C] *1Cm4T; =9x`𛯹ζ,-50C+h&FK$ ל=XtG?bFSScvs;<S89exv.y(|w16o/lfLK揃Պ`[Kkw -e})%xq<3LQrG~5a}Ԏr> 6_MD=F]Hs9׼k*CK1yfyl'uSfw]L”4inj).+*i^?IFu̓6z*t ku9SClg_Hcub->MU0o4D1Ǹ<h\j>Q#걆d;ZשH2Y,Ns ѝ}jiZ di\}/NcD\gE͞IR+=YV/v*՟NJKZLN5(J˵FE??soIkgG&wP/E K.tc^2ޤUפz .=`fuP洊U̡֮&KQ_/gb9mf*ŖM+)Oǖkqg&ּx'3%D '*Nom+h֢}n,.FpM[]oܷ@X2/Wm)1\y\S$!({wJe뿙znaNvV ˑE i+<m:casg-kqn.!Tw$8g*,HG,pêQ.MO˯w^m|: +3_p ooiXcx�!o螨 \ 069gQe:rE8ab?0@wAF`^SW^fcyEysk>j$k|N<!| #ܽ'iE\ -g^ly\+N_]mr7-3Gt+^̱Vd6 1E(Yn[OcⳎIޮ8MӉo]g]ӎ]o{MWuWێ?\\}--w+L2GP[Obushak..-USoY%kb'@Xl"Ƌb"<J=;"SwΝpA?=eѼnvy]8l/s d3>q tF=C;o|ڲՓvulko5h{";gN^\5??Chsž.ZmMPgp4ꔙHb֦2Ij~¯jOO]KF#Z4^_tt{=جڻìJV:ѻ\7_UYPKKbvrZBsJؚHm)h5{3t*Pߛʢ)"յԅ>jQbsmJfi}Ey{B;!"MP)jYp\r-ŨVM5YOCq'ˍYC23#9UB*PE P+s :o~⃻.g;4{ם] Cˇ\3?rmĉ &#я@ʴӃ4\2fT89b@Sa Gx]:wO31ݤqAh2MfT<-!U &%Y3?OIK*LD gg+%GU" i#Ry <?yn]<S Ѓ/Hoؽ__[_"v\A?x>p9@|Il$~sZ^F'n)HtB4!S&dÿfrP}N$quLB#4Hl[-ܱ낒ߗݛ[eLK_'PC}nI69s|3|0iQ%RlL^3`(՗&gG5:KوO(""?^Κ_/ۙOхRm/GOە0'PQtpa>W/Y\SF(O)=o*烜<j][`!lV)a!'/\оܕGUCn]PQR8%TW>JoӴ<]{:Ŗ[ 'Buh۰ZÓx/B˾A}4I] %zUNlIr^i(VT9R /^q28P[JenOUA[,N%CN}YN[tc.D QIijs^-x]mjIV֪IOf);DXwvyhyʵMvt/m#0Q 5IT@ln58GGv5yG1.iKx+~]}HNKa^PMI[\-#>zxCrS <+KrϬ|I uxK|Oɒiس' p=At$W,f~<B| x?>k;O/qF)e| `敏H"&Bk[pDžGQm3HoiIxnu it; QPO!8 kp]"u@/60LXf5qJfbgF]I=)ϭ Ԡr,+|vw^Wii<n^ZOC<"M3R,F2pg®14.Ca eC]zwaW:wRV8}LV/bBĞdZڹsճJ8=jXmJ5'S,~Og)%գvzZjmi]yFa\;0wiрw}s{;^E}͹uJH׃3"R=f)\p<i&8Ŗ""ofw.Ɩ!kU;bԪ>/h䁣Oͽõ ė ֥vNEHAh9M>U9UɠHFhٴDOG J[pfњkkU 笠!J+bg|K7e''s*!Sr\;_|?N㒪%%,4vw߉₈ڬXkVK-VU3&4sȔf8*2JUB^$oYSLD9; _aB~фM"x :c:fݘC]"Ԁv|IKx~~}GIbF+ ӖfC3uͬM*r*pqxsʇk͒xS)w+{}I'O^p+�b7@ qƛ Gn_/xZ=am>L{WyY#7 j -'P0O[W\=7B =t"yţ# '!_ q)a-_9|>[.XMvmd} ~qWݎ|2'xWb>1m1 >vK% aq+I.d8ny}e<RHqpw9XY[|{g)]dѝRJz΁_]B3er-s9;vBnǿ rqgw=M}:h/pg>,R]J9H뵛I3狼.lj_q }lO.IiCYyzG?|@=Ҡ]VbR6v=>!Y Ϧ[e[??}.CG#ĉxrO$.H`ەI8aoC~LO:ZX va9ZVxl99onNR[r \/b3L-H.$iX-9M45OITW!E{kTBf$ZRլQEZ/V\x}kr D<.xh 3KYZ.�NCp!ΉgXO55g sLzZi5VU<Ś051U&O֞EMNUk/k]_iwRvݣ, s4S~. hiϖM&hۯ17-& %ƓGJм1A;&]o[9-W״r[kJ߉튻?:ڂYYU]%ٽy".| -yN'Lڢ7Zk#F{Y°7ϑrqt=2uֲXw_:v1s ZO0a'-WWTx"2g)`\f^~<pU fჀ`%^6k[.3_|CcG%'-s?ҝmE ŴLk$i>ZuбY1s*._!B>잔շĴso5gAqh`0kgk{L퉋_Y>ݿ�M-`](|v|!ݩW'Rɒ(ss3Cl6*:g_ ny[ry5IXMeD@UUaB}E-61yڽb؝iݤ87zipHZ!StSq)w-;n6;K_f]ה ,#vm/BܬW?Ь..y)Q(E$ksU? njӡ%}[(Xn#B𢓫f#f*ge/7)μ$/YQGD}BRBmV6[0 jWRɥf*VEQ/^M5kFRN*GEڀXjZ=bbBC9 -5SCӢ֤dQF\kPMⲆO2CvA}JBsEOsOѯjhMO?GD1Z.SN7qzy~9'"u&IHf6.B32o3 i0g1p!Ep]RH8缿YU .kB::>e>p}?HJ?'d@gR0B}=gumD"a=_ҲoVR &m޺f 'GGפ-&o+o!ކzm"T%=xgQo)gٓ=nJWLlH)>2'x q ܾk&OQ wO\D`_>bgyb6k9T/BvL_ʦһJW)ӷ{uM>oqLNL *Wub-%F7zb{b7^';Zy4MJ>!RM>֠b9;Ϣ-n&6L|c'og]|,58ģ(NJ%Z5NƖ.{o_o]>v~uWu"S"Fx-75S닿m<Eb oѼ}TqO)TBK8γ?T1i_Q#C6@jgJUѳ'F b47i\j1DxEvL]5ue/6V br ϲ8g\qG(ӮXyE<g FȂR^Ij'Ͻsm 6N lX$9a8<*ҡA[h69jZbJ11 LcMV[r3UeR:U UIM vԀ벀pJ6[SZTɦfʤq{dj)KN|^ui#J='k,#9dT1 "`w%4JP]kLp3Wa~^ LP"c�v÷|g9ӂ_<a6Es=Uŗ nc&w9> | '^6U&VG$fZ&̘[eizE/9_+@|2W,[ K>:÷kD%֤`/MU0e8R3^KFK Z?mF mqWaKOgTO+~|l|[h8Fi)J &PO\3K']a-\K?? T!2 ]DX[x3|qv~WokuCDz3lvZ0W8K,BAg&6`Ik-s%<GGʆHr??+W,J<7 e4r^;A(JES>\gS3W9ra7/l`cmɢZ3NVuǀ/XotWWon77ƃ#Y"}k`ӒhF<_< +'⪑dhQXgj+-hJF煅V'[AKծ8yWN5f>vM6&K2njokb] >pXټ4_-ཱུ9P9M5ULe_`:&P 9q+X4:Ny|2(cL&GNE5.Vь*F^j1X9x.Nz|2I٦ )΢-cW&*b1#fE[_bZ$duZElFh%<?y@4YO x(;YJuvILfgRfʸB7/ݏmg3af ɡgCu#羖 63o\5fbpW0MHޝ4xrO\yOǻߥ<9'Lr5+8!@#gG=KZ ':Jk?-X:�� �IDATCpY=6 >z>_| Q`1fOW4,3.{'OI= 8(Мƫ$ҩߴ?ݣ0yH\vY҆xaw󒄫Ǐ;tмYtgRcfL [ﱗyF!^WGAn`:` <8ďǫ_e*_@2"M+h,0'p?2"(7C"3 GZ1B^R[GHhwqTqc0h7Vta2Rm탻D.fD7~عse?L>|;nDoR">nc?[ gwƬ&BtQ8J ~g2>{C8. cEmW^umkb҄6i bcJ2YŅ4 )fˑ+ץqrCl4-ɈǔV5JՂLOM'TQ̯VK]ZK15XUmAՊVZE)hrNSzziF ـj[+['ىC0UuSu"5$$M0H*1ZmAmZglx錸*V)Ik42$T_:q<Nwq;7)Yx:3<,N7UHӦbcw.yM䈛`m\אN<SeNhEf!p}4Qs| ÇyK|/z {Z{BGߒ$v~_θp>Ď~$M> |?S4WG{ϣݒxsL@B37Ĵڬ|pԀx􉴆-z"xo?ܲZv Oex 'oY`3i #x̙&󗂵'rM>4 5 ៖axypd<G'lxAz[Ϲ^g\ߔϿ<Cәw헻OBn'wL?ܗw=]׻W@l3y 3ޤN܀²2yԻ~/i8TQ\L:_?6גކ*MqL>﫿6ZE%؝STNGO<r;ibqg6msc` Z";9?ڛ* m:9{0>$Ƌ;oiIIX`5NkѬrQ\\%:!dPR 7E,u^MŌ1I [&D,aZ`mGRŒr5ic-d,خ6x3ѹLbXr:F4싚X1ClnRL: 2mĘ*bJ5PT(F0Xh;cR)R.g AdL}qֶ8mQ h22rVaT5U\RRRSyH:>ͯ|l"sG&#|f1|2a'xܜ㏽˹9.}Bݔˈ.),Xa__담 S?k̖z{"lcW.lK5qf?sUC7_+ut.aԵi^a_Yw=,b] �YWY}u^+&yp5Ŭ1ﱗxO+[ed3a wөnˌ%Ddphrcy,7\8f~sD>~ W/j,ퟸ6{|~7-7=q,o~v 1lO"2Lw,_!+S槞\M\l)nItW)08-<Eb�+7\vpsZ79Oh /g:Y3XWYLZH). bKc68qWZx;.¦6XV֏XkG'VLFZXp;k!˴h|ېG;EzHTo+bzꡮ2U-GgLdT/oA$z6TooP.SYh NZuFKNj 8ӟˇ3Ź5E,+qj=u&R-Zf7PλƷ3fbbafre,.*MjRєSdD'C*j8̓A.d/Ѥb,tkJ5 iJ E;3*P*ɤ\EkM><F8<tS{fƲcշѮ41d 72LI+#4ׄZ/ lJ<?c->0Ι0uˍWNyn V7Y]=sk5[šP W=g{q3}YnD3[~м*G6oy{9D8{1՚ Rt0l^iR�YelY- 5Fg b%(4k~7lP7]O%q{zA`% ǗoN%^'-i^p㋜%N?6%/Nl5eLO{` 4b dnNk4i=ut;Bx^|$_rD ~ҶԆ%0?%|?O v3ʏFǿW�eKxӟn2qI9 fز:HhrnB 5ݶ5Л#Næ^ 5b_*лuhI06sc#:|Gx39^ǻʪ%@Ki-ULgјSn2݀)d2ʪ[WfaZ^rnd:+STP5-]~2dRsP1ZtbSRI+"TSK[3UMfѣvEfe$K1aT n7!ͤZL3gRJ(jq?F\pXSЃDj8Ϥ61ͬe5jXQ'FFl6FbjU#YeJ1U)sP:9(9'2MCs>-M1ƔDF~8LJDmХMgeņ\Xx.P|&XZG#neuUtoHc֡&ԔXיn <hՑ/fpf>t.ՙn龎n!vBhGF6E87+X"w7eK Gg/"mo}P1%.yB+<`^ÒܒpQ1[<\:]ƅ']j=卙=O{p\!sgAo^VWy1J:~/ up/K@' %GO=O >W[ߔ+r{[%.fE21s+OM=< -7o=_뷘,1S}*+G m&tQF7ZP\K79Y|07veH �?_w (?L޷ZN}ǝ#XLٌk )4{6f715-}0y3u7UwJ9& 6Ec�Q3\XO"XLh,ojlCR&8tMԻ,워}UYW]C Lk{䃋Bנ)eIIZVQŸ'sf3,z,Fg)JVux5,J)Dm/w*sF 4x%bf\GEU]ndmK heRj̴ hlBtVȄSj5*QT,Lj(4jluJ-h4Q#*R rhS8=sGㆮ[V Z4*Q픞n`Ǯ�@~xFcs uP_iL{'F1s`ǝd1,Mؙ}Xm\b/]xU[ 5;g·Ui}*7'pPYlQlτ.fn#84Bf^E>L, @,@NZ_]q!xqf 3bKq$8fV 2.!g'rzfxib'kK>z~#!̙f'.SG^; LC}}OT" w5aْrIuO AKf* ^ (^7|\֭Ϋ!4|;GX\(<}u;E؝"z[?m`U1kX),vU\8!Y QKUMЎb,hyIۆ%Wzr)L9ZșbKPk_1$+7% pE�{䕺NNjH7Zf#v �8&(#4 -C`.=\tМrR},_rOJUjGC深6 vL l'u`] ؐ%=t\{.T= ꘳4UVl2[%gtz%oY4 ƨZSSy4kVJUc&KR7ygԻ)WXS]&::ڒ+b)G&O2IS'*ZRVAPSNF,PG#I3"G+I4dɞ]ERmɔUSje-UڬH\<k6v+" ŚPm|BT%WIʘgCZ_3f z͸*W/2F9*ʉa@<ӤCIM'jhKMemŋOZvNVvLUv67+E0M^Se z0k0^y++1Afo-qgLdӾϷיD}eg 6nΎ*5ӂa<Úv{se�^x iIi)C" O/4zI]@wZC/¤ӆՂ4`G5o0>CQ@ݚm 0.zE#ް_Rk!Oz'І OWz65l;NU3D[7 K@87\4t0)kO`WŌM[n#+X,1B=PmoYEmeIGebb  9h“=OWKf6)@0g^f ` ZJ4YHx\(@wn.肞5gmuSK/>fU7vg4zqO3qXVG(w9q8z.ٽ[{>_sv7`SȍŷP)C7sn>N:wX~P2Mg mL)̶bU$9-V9Z/YhS򥸹EP*dіGBVY%h"22Xc15Mֶ)V#I+h$PR2:q>ǣwu-:hH9LVSdِmuYk'EE+VUhQmX#E (2ZFUM,z2%O.VIu#&U(\dzXWT44%=G/ pJMZY-p'^L⨖4"T-ƂU}Q'ɟ<q~O`㇮v`B:icXxu%RNo WƩO!\;6˾3cdwbZ*K}f#mB\?*׻k73qp4ඔ+湻DG{ӂ#ڰxjF4kvc}G6P!h !!7(Rt ΟE?}K!0XlsB<-KQ3q+g0 36%@zh2wt5\4+>8A'o<-{{1 ,#5SeKOW ns&%̗ V1jkiFW#x|E iG$k&:R~nGh)|GIEMt}B__Nht%2N83ΛoJLGajVUV*Jl*" UA!F! <{wo~_ɛև&Eq80.XK__j%5j! Tp4Y*אyݻ_l˅b2!j\jgL3Cm̫⬱S16Lo?/(J)ZJaZgɄ5;i1uW*1N<kټ u^8S[T5bԄ {oQ[SJCN>罪Hm}:n^%r<gRQjQi/%H4u.5XglEAM1gYU"{?fJJŏf|:oCL$G#wa)mTk%3H;X2H)q,ăX_%?Kjv1BHSP5,vNH4\"TCL*2:}8o<~D!14 }]pPv`_P3 RI;Ms)\cA=i[OQ ǎD]�oZD0p Hna!X37 E\'5œ,02tbz*`+ LwW^%|3)&Jw;,[ Ȼ\%{v{ŜprOp+K|.1A+9u"'UDW8?SxJo}4K~zJd@2]ynml Gɽ3vc2GGʁaw[oj̄C-iaxİ>Xt7&͑*R0 3t3}>G>sÑ4a5\s}<m찼_NԮp^u0**{)gsy+\9,kņdɥR&b`)C/u^+g $sl0l5a<|Hwi gWA.x&HDToM_{Q@%U c$Ӯ:J7G5wt.,K^VN~(!G/Sڜe]*s gU,8_MSRi<<jnT]頇loރ72揦\_IRyf1ֈumM1δFd(4zצRGOۦ]gm$8aLe he0U穥dڬ&5~ncr59&{4iWI~mH+}Q`Z֜A1`$6gWpiȿi'ٹr115ۍˏ\,bl픸:s1XEGԔ?wj_BS1+E`J՚,s3r&C H־[2.v\8ěɱ[&c6Z{uB%{Gv>&\ݘRq0De[Z #˞q ax0<i.EbW8Gv`.:bwruy\;eC, G\8CLB]3m? Go] �k.tgii ఁRɆYȇW%zZ9| ^mx4شYSKw=`k,v`сP w<}U;|:1K%ؓnkܿ+rTä}U26#xIhN`h~ΰ)o|@sP~sGN}rb"c&jIW9]Ba "m YroK_r;b3pib/$"%�� �IDATA ;&7'dH oғQu2&0`+QyHˍM6} TBޯğ&:żXzͤ#eظ?,i4xn;V_V~K~LTj5LZʤƅ&q`O;*b7ՃM0AST89*Ue:Rm򟪿++gپ.kk�#eX)* Bۧ<fkj<4}D撄f:#ը0?p.%d!ղT7ҟ7 nhK\l7cen1H ^wx#\k<gW~K�h%bɦ/ژbahxf[kҖ&M͉ͩH`񲯎2BЇL@_+{o~7G򻅿LSX= 4S6<bϑ_" E(^p2\2a Vs\G{訞W4r?a@}6 ` R*gjeBml7SsqH-*WhϯğonwUB7=@&F{dcʦմxp 0[<W.૗#^I4^\mZޓ!(Da`lLKf`n>ZӸh1IIX4۝5媷RJёRLy뺯_0n'>#^Ҭl)P?lp^AIxyFxDlCa%�j.A䳈$gAr D$n 99tCy6]Av!XJ47&ZaOM9V<2|>Vr"c M%Cyf?ѝ=46Z#*C-jJw֧p,4Z .椯KWg Bc!7AXJ.uڑk&ee ƌUZvloSn?>V~!ΫDsK1*A>$h*w10 +!?ˊx& VR̳9eJoRF6 rI(샔(SEr$+"! ŜEpb}-J"ےgegTgb icP EҧQ~FN_:@zLncSM1<XD6dƭlIod=95X9rۦm'6 >!BntNj,k(owӳ;k*'  Q= HK;4*cg܉Z^6Jb%)1D )6hsT`~$59 LMD qJvIi9%CH;BE3{[viÛ91>~™d tNTyQ |f(4B"4&̈́j㸵ib?ͺ+RvZՂX57J\hc?DY(Hƾl\!BNK p ,MҺwsEs׵=l^7z+a65knaιru2P%Tm2iC<^/ktKAO5hz[hz'b^~Mjnf4zGRHE% 49)Mk5ήq,xh-? -= -+a\9"p~L=ծҘ +.+lK{8~gܝYƲtaκfnu'vO==[2Klws)R:#FCr"AJL oJYGX1yhZ vR\<lꢲBE{K팎&=IB /*E {4lU$lUR,*.J:?ߓ,qR4…mH9̘=DFSJ>u`6;QERDgģޯʢ?ؘ$h.TTAѺ,;!CVj7XZJ8sKLġoFʈQHDɬ|8>x[ <"E-0 DԺ,nvʌ d@c܌s08[v%`zgy fI wD\ 9 1>OcK_#&8|2BN(4’%i[ E*zV Kv7;%,O㠂!zF6pl7ͦ)ۣ[zO1_ KR!Jg)aOKS`x8xR}~YvZk=X\ȖMb%w륩6FQN0YMN_2,;Ck2p%0VnV g3? x05<.yaɟz?xP0\~Ag`G/0sƞaCF̱S ɧb!3uS(~ɧ= kq\T@ncduEw_ӗ*lт\t IPF%?sJ3YM[@yZ [nna")uu LVp|h9!$NU:)~m{n#lI-M\|nę7.4Syo~yሇF,l*L"I;&-Y NPuꐾ3eDQiP#ƞ3k"UH)9#1Zbь&q.6~݂E{MdCRFC1Q*P1ʜ}jӆ\TNӐ}?s>EeD'~HU{zv)++ 鳞-I=YrCC#JX@V&fT30Pyl#'-R⪯J̒o}{q^3^ao(2S6T 'v|?__{7q{`1(D[]τ)Jeq$1&4-[Ţ$Q-Q&&C'LRT IdqvaJLaWj,BW=qۗU,k=-mi2 x۰aidZmY}I53|FLh3l!=&zq[vdR#?"V B#Ƨl8 /Kg"SX�,J0Q(wg9CTP3vtlnnFFU JK_#avּ7Xs#/9vKuBb8nfx:$bCqWsOyo~-G;(*( k/!VzK=j a/3ۀ{/\qW{w;5´DpHp5{{mݩLc=QkFN#*-#j+XnU=Ȥp2T,ꌨ_k>Qԟ;@R-&$ 1 9!tםSDx( +O†7wp٦iuqEF/s[f*0՗k$n-6#{R ?DUJhT Y*WF Y(9< ce@=<bt0 #tkv=V$ so<haeR2WPggDCH rήGe?f0!z儕VZLT,RV1/!s2Qe=H} =eE)F=L WaEڊoX -P$Ƌy =eDJ9N31ќGȾ`5SA'ZA5InFoߏMizx,Vo: @y.Wyag# Stcci4ѣ?+ 靔eIeɴHNsIQy9qm|@g7·hO $t/_OP.14Kؙ0zSCV,$8ꛉ+6+6 VfM6=0=r DB.{Ž| !$jLv~EB28(#K0Ȍ (I2)]`m)&+0Nى뫢=܏||`+,l¦hn7QBt(j, ws>(_֡%i`7Ƈ* 8 34w;c+jLKuⴠPK7�m '81`1{EHL}}h~m y;G8`CYll4Ӫ)e+%)zƊ^0ReZmeͦ.V0 }28 B6 179 U T0nhrbH138 bP)6SDe]FcAݛz,mܴ/: F/HeK†e�iQR3i &8hu*+ј$<U12(yrmz\A)kK[*!ۙ芄S&`IlNo_=7_bV7VB7јFF_(1krLEJE26H9"k.̨@yKN<?$/8doRLȅ ?h1b{QBY3FU&v"fRE:="F<T6<AT7bZ aWO .ĬS-r"61/]tq>̚_6hi>([Jt2F aH<|;fK/Kw"=U_ح 7$A[)8={g(d3Kx;~ki_Mɓ( c>v)MMTS$K p,�bx6<<bV6LtCeAps u;Nnp4:R͸�gP.6/[UG@0HrTQM2{#g. 3A=/۶y_C.KϿxλ+ ;5\(uXh4|V6Sb~[[a`̝m$TK,tθsضzLKaYaib}B$@m�CRJj}2-$ba<'X^u#3I[ OiO!_"wNVoWW3,OUk-*"|@: C*Ǽ{ԾQ9XrCƫܝ7*>Sgkq|kg.+qm=q�K))�K2}m|:G|s[na=w͖r,^Q* q:Gm[dLEm|bbA)B'*`IWEr#Ѯ3S̓z֪+5X"u2|.C#Ȅ/rG)w-Tm?5ե4Չ*GZ;Y37~e&xGR8+cKϿ'T:SPiUfَj^MVJUЂd){ueQTDN܆j5Qd+rD=qLYQHҐUѻ$tQӿUe#UggUSx( *%鯍4֏WFS$'ʯwR!R)Aނ9)j1J.k'X?, a4BTE˴ب]/UR֙ I_IYzl^X4%TK҆z+E+m{}:%]@s\0\ =LnsbHT)"_6E{VSÖ J-a{2o Iۧ]g޷"c7WX7KX xY/(.xo~#{Q ƀn8aX|]B {ȉXA5 F{ʣkr]^ϐ^C_rzM0%Cny<gSI&@T-xL3 �+z4qߟح 4$L.\ J#%kv=Fsq=wHgN [Í${ܶB,N1uYnT`L# SY[eqNJn4611e.3 FmlZZuߛywɬϕn޴WS6!#&vH8#p3z _,־g`V粻q] y*}Jp"x(HW7{LFg)Q!bM?H<DߊF0cf*$jZWVNR&A:-f&!M!F/vT$Q0"~'RpژNB'0@:ōg{+9uV&ېu_hό}k̘j1 Ygʌ#I/1' I5cu IϏvN&FTrysK~bM!k+hku9<CT]S+[QlQWH%BcrSր1!$:Z J<Ev.Ij,'ߛXSi5۽|m QA9]Js2?ݛD-1\!.qKa{aBHvD Nj,ܥomz=�}k++6ف=oꌉŞ3�B {-W9ַ~eW&jyt"T> дw/7i@G=w8oG)Lu3X~ɛ5Z7? awxkY<5<&nϹ~^&xWݾxzD3?.#xKǛ1~`4'J<Gpr Zpk:o/#wyѴXѠ4r ~ Cwy~#ҁѾ6P՞$@~峩Cd.=-( vRn\>_- Re&޽5n(jf3Vz>=1GSO&%oG{%?c~buD]cWK℡fkbQʧ2$|1:}FpUvEkS#ttN`+Sh ]':r̭UN,|=) =R'Ў@U;pH!r/SVT]KHYJO%JfR|)ӬDQ].|j r~i$T2&Vl{ %j?e(\Mz[ͭ?-$'7JdbQ5=Qҕcc;@&9@Ц! etsn,y o�@`o~} dΒr.ONm)qԓP'x lSD,> s#-2OA`4Ob.7~~VSuT,dIKgG9%+ɚalMgsDADذ1D[ xsLa ¶o+J;ޒ6%4B6eo�S't>dw,_PsnخN6;vĜz.´ƿ̅Y6n~`gZc:!-t4wkgL`:_-yyqzp pK|6x\-xA13 T%=@/3nriLk}`,p/:5VEm0n⼳amJ0L�d=}ݼ3Ӹc:Ҧ۱."!/=%HV.Q4vx6< {Rr9|AͽrŢì_t;{K|3JmT%/K|5�� �IDAT%=96L}ݨɏtg)esMv*Q)}]>S}SzңPBjSC Gڱ&=Zk~ <Z/+,.mE?LHBDJT5KUuG".>m(ӒdtH5z#*l122cF*�knc?@30sȱǢ|t4Awh{}-1gUVNêlVb ?D\p hOݟwch~ۙ m7Vʒ0 MSgG}Kߌvܣ^pT%yh4IX٫і=q#,jbVٸ vW04ݶ5O[]Px4af{#Tx’9|AnP `nsy <HA &'$hIIb1lEե}P_4 A ng /(5A 5ۯ _X2۠n3GZq/>4븽#Ut D:ַq; qfFkA\ě_2fo};d@z ObG ((F2 w8ƁGǝSKX Æ6$x8VaGϸμĐ_(̶/Ɂf8<N EsZӒYO!GЄ GC0~&e6q _M190dˑՂu{\88O!B\:gȴ6%%W|AJM:lk0'Kߛd99J.ͽ w w%7-:jvY:w>&*ǖBJ[찑J|\@Y3w/z.%nl'h1#C:_5WE{gx'i~#/cy5;H"`e+ &ږeu=^w]!VDC~<-\F?}o(\T̅K%J[/c&?/̊D cW7NRYi@"ODE4wrW}=wN,h ݺ^grh}}'y,5n-mɻu19;rw}L.Ep{ж_:lkm(4DDvІ~;h_8/vpa BgJљ1\[S,n7_~=e-rcwe#m+C~ό1{\${O .q %ST$I;dyɰhdKgrص[$KN _ki&nqY/?{s܈}`cKƐ`klҒt_WYZ9.@鵤)2h{ؾi>U`/?œ!JMwL.4 U,B yzaaݠo3 N~p;4LՀ{0TKvc?ioא Cwi=?ww8–4ULG4<Xl&;۰$IˈPՓ3L=➂y)5ޒޘf$PS@c5R{fX8²6%SiӒ:3) ƌi26a ڼƴ%SMHj_ڨԌ7b4B/-GMP2H m@L0R;HU2}WA[*)7$y3P։U{Wd#İHfvZΰ6}ی{8 ȸt¬6Փ*e)7>AiB177ztfVש)I[x$+9.|eѤ?*8볋?Lک 鄊F𕜴'v \"ڶƣ;& X[&>sk;+g& ɄBZD];nEU3[C]g~%)&aR"1z. m=[71qqabcx<)A,b|k%qx#JRO#+S|]uf9嚦Noj#T.M+qBРyifHa`;=Dpe�-\eNFzP 1'۽@F >[&/x /ǵl48G2ae.WA39Glbn쯡i(Jiv߽V~wAY Bư&W̤+G }h?+ o %~/|T,$F~ǯ5>K<.ro[aKrj+햗 ^^I/Œqsݝb!8(x E@1ÒDeh 0Y;Un X\s>k`B{ҷ zH΅g0 rtyiC8Ҥ@ 5DWkMqޚ-oq:ɳI,)ہv׃4b(-Ts6 *07J H&'q$%54AwI=?ۯ_֞%5M 'u=294ա, Js>N=7}m67 n;JL7j3aIrTI+FR%9# 0B7µ #9%N 6{]HJ̟ux^R;wTuD"IRG='ݞ*3@IQ!$"*'bl$O¬;PKG-GQ?eFy@™o+5V) O(bbM%Ep &jלּLmY+$ڡHIqK"k;ݣ0]bUu`sx*Z 隓gIòɀѪM m6 aA3DvH  ;gFxt{e73VĊWBp.Iáeq v߾ٴ9" U ŽО-_!?$0IۛL eF|ȄG h&P;CugjI" lzi?M[/?}u} #h;Ws>"c͙&!sSkT{3g)e'~ \R,Kp{ +9l~ `l{@33"֣PUfHLt}tJeo-'ITmBòhknaIj9(C&$ftMPFש2E.50?I叄2٪ #j7v dAV=A-*Y Omׯô)Ōxȝn{x~IXmn#gCkZwxK!Mۧ-[ҖAЈo z|m[D[&:i5YPZF HOƒ^i~3"2dJ*WS=1!pa ai5Bzf0alA QHbW�?D:ե{d~zRaoG.oy{yc>1JAF%Ш)--dasj %Ҡ|s_v1gZƧm[1.2e!1lT4R TtٌV5Tjo {bB!;E{9Xr0_gjnB2Ȝ*[+ئEW{;Pluj] g1*-Q"Ɓja" NO̘wn 0|{Ζ)i% =lw{g9Tb(^;C$` _nhy̬ZUwWu6rѺKf� Ehb /4{Z%^5'ۆgKѵ#(-Ce;Rg šD)=tNƫ _ "? dfQsonYԬKnqjH|E'o6wn,33M(4\?)X)ifcƞuKI2[@ӈi;9zurǎm 0gڞw;ǵЙS!{̀2$IV nB%P!jUiomu(,,;~%~)T7I">h `vG0 HOs$ZH;"(u-SN4@:`.)չLJ&=Ȣorl.*m>##2.x! I.5gJ>}:q+X @ۀaQܜ p yml '= pSI|>[9Y#T7$KiUe6Z(ӥ8B$lЕ /D]KZfgL9R>T;K2mzo~Ofky-jҎ.&;C$oH¤;$9mȵFtӆ$n1]Ba>TvL# ʙ!9O}¿$HxYMF+H)Y0]#FAAIu1ϼvb?'OI%J_zp2n/};VD7>I ~͂5#~*$Rg{O /^N\rsO8`4e@ 7) '0b1b-g7GNd܈݆zMW5, s.gjV?DzuKP`�g`x@l_a4& 9wDUnA-ح~5cV"ҏZzy޾.a~3o_[CCh5PCicki=n ( wή9IF}|q%p\[ (>O|[~Vl81Rҽ]s�&`!p [Xv1/)?Uj*P_[�d!*#2$Cb=LYGT{fn7PHE^k bąIǷAש7/at7LWahc ST޶P$ >ŋmYSIV`+A`ȪQQKU ,.W !rGBEPP:8&:!ie's{_ >>-So  7_90ŒP ])),s"KgTډhDs)A?4;4m,HǕhMέ+?A 39,tfeH(qҺ .Fi/yߦZPcmʺ/NL;YWonH-[[R:Ev1eDFۉ~l!R;mUָ}g+%|)'I s2-c(ƍ8[Qۿ|eɻF~a8:Q&SS= \L6W SM ^}@6m,p%'ߑ5AJ o RRpv6#Ҹ&s/NrRZ2q gKI1FU̵Ny,N'A>^XT {Ćja+̔h` <#0eƍ@/6U=IOacNoks@'mfUU^p1duSjpp&3/\u'{=>po8TXQsߢpsd=B৸<g3|R0)oq̳b+`c=lgٞadF==S#Rh %O42)B2XdsQ&nNIMaNE.[/R;:#e+`_t}h5jO/G(bIJGhzWkv;HT&F+ϫ`fU[3*?AA1%}bYJ/wp59) 7H :;kd!~N_[PnE#}byS4ˉ袝XQkrcdU&j3rk{[la 6ZXܘu;,gX֨@|l3`5\5c;1l^R#V\0Dcr@id2B=չ@ƈv�3</欢k}>7q$C9t֎j2RBYAB9֗ļxas)e%$_ KJ/e.RpyZ|R3 GBI#Z@S&Nrk-aB8BLCSÀz^B!'sv^y-aJi0:<O dlfSz(m#LZ LG|Iփz8){HpQh̸'niVPW(rJ i@g]wN`?hkJ<8سhYKS0g<0AI\Un2uh !mڜ6%^k}4o-ObxҠ)0j͟þ=;N̠v=."vh5 6$T`w|Nq]jڛ6aSC8> OX3+yjǷ_WZwf. l ZxaZ J75`1gs7^qS~2FHAL:P? 4_=PhA=#x v)\@27:Q%Vȉ `ƚU7 , ~ œf URidDA@XX ]%9)02dP=yJ=loв O}?!g4UIܣĄpdkCO%OUj/gE+#1rjk;ߖw+'hps|$’q3E ɁZ.oPX_v q?L1JmnΈ9%/5rڣeBOL2P])] >u<)vL,КcWaJ$[Tוּɉ=k+{ LZ]*k{C١K@_` hEC3(#"jDns%fҘ.Uo u7f t=c,"Ec~0LSgO1n6%a)Ɏ7Ό]bXy/Q>r/F>zsW� š<`xߙCUlA,8[^@; )D] qO>gw/wt)\'tȚX7lvE5;b kN`Q촡l#7TW00\Ϲ 75,”1Ti)8u?CoA?y <jp@w\ pwfϹ1Jr&,pgnꯜ᰼{꺆9r EO^Np zGt�S[Y0[3]> u邋"fK_�qSְ PZ\_D6UnITG)z [ɀ M\.'�'}Mᆭ&af*ο·2 OH21,br.I`4 F8LxĚiիgL,zQ@U99-Ǩ1-O| MέI\GҀwҼ{d)=8VvQS+.YznЫlK#`r+gDIN)4ncX:{I230%򵉚2Ѽ&v`J8{vĎ0&-6:&@8PFju#>-~,KxwrTa #9Uޓ}|+vc| ;dAΧ:b=<{cKREX[W֪K3ˈ)X*:X3׵~|�� �IDAT&Q`DTZYz>O>Uj$xgۺ[m!v3l o"y3A7w tS s Ɂ%s|.n}:Naxatx6y7(vE Os WYYLh/1�ڶp=1gnܴ81!Q-ȥ^/k6?]0hrڏQXzG ?1Ͷ}Y_if?PԲx]%t^rys~vA-wg,NãS1B2 ݷ>!Y#椀C4[Ss;]Z)*"zmv43Z]1kY\+ؠ.jDe*mHeȝj>GAqk_lZ>}N|Z98/oy͞QĎվeL`}@[O]@vJ}{+~6ۖcdA^0<2:av@pox0 -Ԝ!b h /#~g4^:jfKi$WBWċ-CMaYIn"۳ò+Je\<PniW;Tޔݳ pE:L9*v*3Tr59V NeBDLh,NNKQfdZ ^,3M]Ѓhnu_0 Ru ̋(D@[Sﯺ.V5_-%9ݸw.Ċ{]l(Dae~x%wI7xޣ#;||mrhLnH B Pk_&::`sBwr'o WQj陼ڸzoz=mC<kV-x}h>& srrwグ3+|$aÆ;1%_ 52G#Gj�}J0z57s> mz}l;chnSvG(VE:٢ޒ4d {kW5 o4ONjF`@0sxeI/C_<4i?_ߥ_O%M |}bnj¹jJJXLρ@|AIoy/]d P٤ZFeLaL6Xt.{z>-UP)N]x?jGMY!Xb5 +# k JIoFGa@܆! a}3~2NGs=2w/܌ a>(0785ޣGQLJ9G;o[%5P:L4H !#5[>T A xa}o/. >KPq%53 .3C2к)ugŰN~[帊4]hwr1| 81^Y'|MFf.⭡.IyR7ؕc)cI|ۦP8Wh "QGe 8IxuV4SkUx+즏~R5_W7%7EJ i^,~X?�|=&hB F ZH;H{x\7~x�7 uRG➜xM wcM]!'/Kp}lBa%DLZ4!xg¾+Sktn̢ME0QXm\q^kDӦr@.)o1ӂo%~73h9̺nzhzc`>&M?iC8L( ݁-\%q83A.Ǽ�pI5 k};o&2{nLrݓot}l3BNSu48O`k4Ú4gu297L莸:'>_AݔE{kN6?[oWwi ?E$nEO9Ry3Ġ<iZ Ms[v>rץ/tkRRKa.yܚ | _�\tA&ق5„&b"6 $1<]V E]1!A>n354G< M?ZJJG9?OL>ܪFP.J-ж),do-Q8^qOJN.fA^0)lcp8ۇ{^efrH}#jw0&<.j-_*VQ:oKm7F,Rw7NlcXkMow|йh Y%uWmo`vK.&3ecY3;mYdWYoK*S]bv+9Q2@캸!Ug!f)1"tIıWIL3!$L2#QZA=?M'oLח֌YJųUFa�dFER$@(~ iWOC @6BVFitޚW4KIXIE+&c3L hϰ ]ts ?i. i|e[4·Y;QʙO "mKyS}>OE o\٤D8#7|[YvT8TDWLڣmW'J'  yŨo8Ç"A9t@xXw0W/)c'qXO`(L& Ŧ_JW ;LM8<k4Tj̞?VњQy {Ԏ_I . Ow *Hϧ}{z;^-ohycc邉9- 5:\x3m>uqјhac-0jM s҆:' kP髡>g9FݑDEe:!ɘϝqZm RQx0ne7b2\FgbwnFe4< !Rg9@h~GWk߿ (O3~Ͱ{0B dAzt7L\``x:g':}Yg }~H�]Tkz"Ge}:Bdd<b?aW1x.a d+5U`[l� /U9�}#0Z)mHmkF$6"eoqt\١(Bnmnx"vPIWbZڨ2]t:zڠ!4y^RۊG {$l^B=%`x*2c#yoDž-4ܣLNT/^teYnqiGqU\ذvq`0f;9ZrV/j6jjgW̹FVngxsC)n3|0[ѩ#4ЕW(<^#9WmNWG}r�td?JDݷSl@f4o̡E zKVQ  {+nA?P`Gڜ4(2\D<#4mFlߍl!yg_RidG'ռ- 5_h]/.|D<p AY37]m!6c&$<A<5o,g{QezHi&k&s̞Ƞ=-j=)xR *>!9t-lxO]~gfե)F˙3_.tc~R\ȎVVbC߆"WR`=ESV*BBD3ONj\LقHTׂ:晩hdH-M'!7WQ Sň<P-R7 ^b ɰJGx4XQ0u2{S9cw-97YOI棞q~GErxS5"Q4l{DfM7rK#^1kjPTvoqIbqX S=8*#5BFaI ?F.lZ\ԹrGEGbrʅKyX[)AZfi7FaLt^mƜP(nk:#$Ko~b]T.Ȅoq]A+36QE:wbJ*pG%}0i)^51HfjUYq0؈ͫ-蚠?X2{X]ԍy!X{jKHMLmҦ=#0dɳe(?.kzp[,8[QVkFPpkI,~*epRp&)1 9Kl{>ޟΐiXS@\0(Aޢzw<^kΐ5gkon+v.vΰմ!N [U_]zϗ7gܴ6Sqof| ]c&9vDGzҵ^sd`LG= <z8l1>xF#wEs}ޝN.{_ aaVP,1n%`#S-(46cǨhsʼnG싢Ղ(Þsߌi=h PhzĀ{;QT.;}ka-n4j_t00Yp9[_ D5ߜ=�`4EItǒQp_ppR;3`v[RQ0 7vzLPрF#xL"an+pk7? .{k="Nf}&v Es.Gb `!=| I2g)r؈/g9].⷇CgҦL k?}oO.ǗM+ sqw}0 FCDTRKOfPYʄݭ,t�Y[7"ѸLskGj=lO[Sx?zD!{F v6P?<7ӯG=b}taC;/k֝|!,u2r_@n,Rqqn0eAPDׄ�IA>py ָ+Ԕ Hc7@w|卓7W&~b tEi:h4o)tSx|G\|Uٟ>�:(^WXpiId<)u֧v5Se͚AjHzk J5tz|} #}+)~.;}353c (S2+/N@n wǓ$Hv~BqQbrK ʌ_sKdH<^ L#ˏTMyg㷄Q{LQTQHLJ =_pA;.Țx0N_/|04w/MQ鶨Kzx?HG0b*p]5E!I4c o7Rlz GL4-4հ< _&TjRܪ!xOeai%Bf ]`Pd8X6ItI,Pa 壐=Ÿ_MH%!FZsnj/R7hUK]ƑI*r.p}nH՛ՙAr=r_=DŽDG7\П\gfe@Cj3Whؽɔ (w/q}Sv@Nj k4ڎ.l:ڔry~ (\ěkcȯ! W-†LL4bcٰs5-悬 #qQ*acpS#t|{A ge`ؘ؊)~=R2F`V.(&ѤeQo3D,Q- |xR9")=Bpoq0y8x/Tns?vT{HBRDn~qs[\LrXn ;8j*=cխ%yP6<=j2|U 'F 5h1a,![]Sqz_& ` _&!o Y}N(i28/K —0"JRt@7t$ ĥ%NHҀ@%xJKuhe�a8x7? 9/A%fCł ]>|L>#~ͰsF (b G?�n_3}`$@cV}07,g+0P t@ƬߜZ㤏B!N%V#umˈQ}藏UNJEJ+'p}!lЇ/EpMҾX /،ٍ-"znO8OY߇ /tg*< $x7gsY_QGykb]$YI{G4MﱟN2.ژQO# HE[ wtl4ˠAV=ݾU9737ӁdVhk c A'ye|`0pM: RNwFmAf>k"PvU9O6eP xG_雝SYOXzlp lxC73]ƨ';|I;: ECχ)ӫRcduf]5E`oBF[φY5iUѐڣu ٔ KQ �Y3%%Y, t/]>Egg^b YĔA>2 HC@7<UC Ef;wL?�-k~ʍbCjc*|80 QC M˿gc`yѧҺE\(pk!' u(0&y͇)% Mpq6, z[U=xf5+^* L\29V[?9]9e=ķk9=?Y,Oe1[GfhOH<ERg =)J1H d�yK9~.O@)Hð -~-k;O0$&/k.#rs4CI #f7esa3ճu3Ycߑ'"RhdWuL͟vL؆lSt)'#$#ӥ印{Wjlmj5u>4*+ĔaĐCFδ* DZLȁ�FrȨx6jkP0HߣnH3a.[~C�H _&CJTEZпw呚\~m’T/b|a]9{vno؏Y7>g_*F'qBB &wS$ƚ_kь#2x_ b皹č#{xbr=r\C#%$wKvzD QEd͘RBy+:U}!’16 f͒S੼]4j%ʰ`\>UeJsK YŦq(a(lFHׄ)ʐf5qEW& xBNa #sSŅ+n~0f՛i'/M � yIxH[A eHZ.f)ndm+ciV\lr>⒩FGܖ(6d0h(Hʑ n.0mf=wgB5{%j.H9B#;6rIS!d9Ғ qb,3\@qȌ> }ÔKlq2``Б p-ϰkFS0&c<b$ FTCǧc.S9na T|X! niqE<#&{{n?z.֧ʚCtdo٬;IazkVqEV+n &ŽLs)46#hI0"x"AZ,#Mq%Kyao'uf5w#7�� �IDAT1㳻IV*il{y)XLdJ(?VcmS?ݧ3>ϑ% lAr0͡AT3` ZfP !QX;%1*̥:FqP~κ_?S9&0*vv'R_CIͯ{qv*QmoO;1jw~7 p%I|"޹#HvQ$$ň$ >[t'5 dU۶ WS4 gL@Fuܘ~mwXW!SS\B FT6V�ap8=uW8xӞ=l`Y F%|#rb~x֚&ٚ�QIhW/5p=CpSG(mkM:`WM7=|_m?qC(22Пkn`%n/=Oϓ C),zg`<b}$fm4 Ǟ[iI?l"Dd Ôp 6G س. \IZg&>)g pQ{"kO1~1%܌~L$hnOț3TmwSk閧ONX�+!ixc۰xOȯ26cSRnFn|,O/qL^1=uʺ2`58&Nt5<oId62m0dxq[%R2vdFļ<3zB,TiGD3Hby)-!#*]qvznX#22Bar{Q=4R|6uKK}. D3))mcc!'cxsCuFft\ͳnY1o1ܒi Yʷ%fڑSjAN>0< )fŖrkRSu5)Ù`HVR}d='{ Wv(kdxs]-n#gúnE7awVniF3C =x!4{ڃ9|ٕ#Fb~<|$>47glG1rINO+,&wM {\_r1B^`'+!3 QcW*Bn֐9׊10=hRXNcpjP-[qFPwt>'ȺeW$zcAF+R{bK4-ٌQ2LlV -#µ<_|v؛壿Yw QE 3 <;$Crp|>rayr`EOy8 Ú!&goh3\� |1c&/ ̀I$lD=`βq>�s, 7szX5n*;tXaDl2n�"&,#yT\gH`[_n0'_vmޯc ַeQ>ԶT +f> $WKv'Ԕoxj).##X>  mŅn48KR6& qF'c46WL^EiIfe̙wt6d1!b-<YX 6H-5識pnDlٽ㹜8MxX|0eyMYn[iMJsdq]y~S僱һF"PYz#硙]y}7eƥ}Zq9OJ)5Ø!CI܂# 0DL¬)V![?i)/ˬf"<χY�yB @B4QWyku׃{&zw ^C~tL?_wÔdXLܰWsnFdCAvEa? d-Uw f{+pMPiGDtK!a[qx_ .yRۣZΧIo@Koa0 fO5wȕgƴks×!B9ͽa2vbnvHO#fy:Rk^8-h3[\3Ar#`;'ipu(I3$B kA{i4C " }^[ShO\[W䧄)a},\0{ ȗq�^Fí"zO\7l,hOQS{sطPa{K9z""219d`п$jvvq;D+YhÄ`%}[|s FkA`E9~o֝uaQ J í'ͅњ?:5,|Q5lN@n}xt9VfN MvBu2^'F'W 5L!Yu<~0 S  fH7q2H;=ok`bb6OB2R6!Kka gW6͛wwߵP׭t "ewA]dq.s^O'(ĹC~wR3Qi7ED!kư@Eh/}Vj|0ob0}f4abHn%ި֛WŠ,`upl{8!I0O>Dty J#ё<PKehˣ~`nXQ; taV aۣҬ ?@AKHwFb!-Ҋ�PvS׃eal{܇|Zl%BczxLM18xxq $9�О]Z Xx82E 3!0҈HaO\YJKG?|ݘX+LDj5?NKd,~:ZnOpV> ]qSa!84l=5)h񸏿84l\=EI,G(ӴC:!636 % y("ƳA^3M_}n4cl~f_guV:k0FlLg*ZcEYq2˯:uY[g4 uKrf +€V^ BwIe>FcH!5?ӌ2X3|=j F_`B>|0]8<Pݔ4NLŽ#?ln,+vԒ3ԅ$#۟q^KMmyGYClOt%})8?o{Z,ݸG(bgYB$@ynM[X*PJVhIM"K~[a2k:joˡ$R`c[ǾL3$;KޏNfk`o)AVMvNmNɗ_9m:15~np L93aMZh\3创rbĢfkpH' a$pAsC=527)@ P [<<\c+$d_A'떙r<1iih )q]KrTaboQ |z_X83ކ3kl3sS$b!N]\L~х9뀭-ex>24!aLX@nPQ#ЌrF}`O e‚W~q}0{�%h^B?L}>@BZ$Pѵ_PFL8]A)1pO:S*'jC`7ccC į2dbLc#6[s9*J)쐜:ݨdb?9.vQ=pxd`)5zu ]3)SC'>3ED<#|͖nbKz2[ގ_~sGVVK$C<!j_8J h1 ޓ`,y*CYkuW+&׏|znK93{A7"̍bbH!`@B` ٖZk\)|Ί.yi~gX{x#{0}lfۚgs W51/<A"9 Cr\uz)c_{bGJ|g?�Kn0<Z!_rTBS7 /lcM:5 _tIf9FFSFX|̶ܶ2ZՄ°|97ib�##qx<Gh%B:I0x] c9Z)q&w٭N Ӂ1;݂A%�sP~@ Q!ړ 5v6"GK"5CBƋw93yL38݀]p|9ֿrrr-y8gbQaOO;�Y'֫QFX8SʼÎ[ 1i4~Mڐy]C W7QS֒Ki#amKA74ʖr\CӸ9/ ъ,=Wk ݑ6mĎ3a#>Jy[Of6ƈM]ȉAV8E]btIQ袦?cKU[Xql{ I)eҥ Vz+Cv:=s9(+AV.^]sA rmlaVQ%<rYX.֌hzVO;j(4IcQ*amn0$߹/M>,˾c/'5(S-3;X&xߘq4w A1NXļIgOeCX0pykvxeuW>fa k0`S&r?bGfm-uI641]&BN'uA)az%h$rF~mC_Z1iz,$q KUI�$W vL] 1 bw0ҘٽXw=s +F]Tn(m 1ES?VnO: k~\ }=2"#W@6 qat_"uBG i4 Zvލ3;Cb;NGca}60k_>¼u&dd8r(k0k$s&/a 0--f?ƽѯ]\n,%,\'Zu0& A4,g\Qu6bdϰ9Rnk< Msb4Kcם·7<( C )CE3DT@'Ě'u*rg4z}/q0x^<j7'Ċhz83*ڝAB0qͤ,F�W_&s2THЦ0I4-dF:&3ETW$GmAg@bB34EیcvS4EYȚ#޷D؝@Wl[zKC/ sۇdGCaU46P _KSb:*" knV,7=Ţ̧4Q'/Ʈ:Gkʂx}lO[Əx}D/#w)Y%Jv+L5N] saH %yx`fauXE-.Tdx^5R#5xv=]F$%H{D=7*gHJ)'M`Ѳ)șEl;7%# 5B0 9<JnL {c'- f9ٔ  UYُҩ#:dӝdcM:6.޿u<9=FuMY>4a-+"5=dc)h@~uG>׆^0D0w>s YscX;X́lՌ@T?Ηy3ړF;"Bx8E*lK9ciܡX| ñfid0O]:'&MP?CQ<`;g b2O )%W &WL~LgAzˑ!4CWީWeK+Hs܁WkK8=E\RjSo ՑO 2 =2K0\u̾BDq 5BKwyu1q1~, |Ed3l@Bl=%B&5qtܙMߐ?2Zz'Ntx%jCc*0 i>ځ x}[1+¥'3Lj-~q ^0H׼~A̘ :0qw'^ ?nBh` ; w}}h+0q]b vxO9^|2+&C*H+ ??|tq|?`|O6^Ys6$d$I"A>%1M>UFqxlxln;y$-++{\?6aJs7 Y^Vs) ɣքk/ JCLz^'`t?\V|%1芴+;6UFyndUiǤlNkmM@fDP ~G;p\X u#bB@N}{zNʰ #2px]s,͉ou:g5̈́#fO�ܬ}Fgb-ʀf>U!ϑu|xybq(F{b�3˖4z ,>]'|&# H`W82럯6,YRGk,qDdw\ c1c$~v5~<HsӀ1if:2ZKxS` {nOvmj_TyM[ib 1083}S9\Ʌ0rZ&�~`0=SqE}f 'vs-#F.R1q]W8hr-r-)4foB5FTĿb?%Mo'BQ0zW/y((p>bM&3r, YWԸHUAt J6nFoK(*,Tm† p~b;{~n C+-t$Eqoq1;% 3*s<Pr l82PZEND|v jGQ [gY$dkak5bրƍ=٧%s"v,#]Ղ&T`Z+ 9!YzJ‘֨/NX0N( y{3 _#Y!&ZFE~6lۖP: z28Ɲ>lP͝Fr-uAu "pyIq#Qcٟ͡bW&0 <xFƣв8؎UӃЖ tDy E0>9eIMŨj+%Wx0,4Kl oQg@:hh{ofQ %Lڣ#nۏ7>gdt/ ;0do$F1c=kbc-xovY^P*lM.N;f>氿BEnrˆgR^tl1pajoӃ=" { oY<%6F{{EWsI=Zv,z5VN)Jqcg5^��IDAT_aj hɬQ xW$C5iMtDC1d,V4\Շ@yhJ^+ eA90$wŠZf8ͳ杝W14: hۡ)PxF#6>}+KgWcbɤB*L J#�|}2ӝ.@+`Ze@Y^I csL6=5?jޡ h0@FGr_#vS+pYj~GN f= S̎a e s< ~$5 9c$+&rnk *Xs !b bw*3e #lT}0yH]wӰ|e;otTuM07.[3ho}֜g3<,uvl?M5bUMk.dg(Dr⸣YD9~#<99\PazZ̚Ŀ{Mb9 N) nFf"^/I\tȲޞ52ˈeo ē"#zSe= xb)4;bؒod!aLj#ae/+Q }voc2|~R߭,CGgXs ɗD?09G8If dO|1%p`GHc,y!J0wf\>I5ʭ)E6aNaˀu&|4)_Z3P?NO'xblItqG@rK#mR A;Q5@o箠Yf\I1B`˾'{DS#)0"v1M@i2 <R?ˉ#.A #ޡEκhѽIe67Ɍ0DaԤ#8̂,awp]/m+L<~,DCqE$$J⟑H)vg fǶǃ̴nKrhx邫kpӸpLWx0qs9JsHwz4jl`+C 1'HGxg\$6=#װ"Y4, B)B@ ak (ަ''N??1my�7S%9ӬK= ݲ:^eWЄrnVo0I'Av {sĪ3W8H<Kn,K]18ʏe nJaH3q Sa?CߣoY%Ӕ/4 ƒR r>: q}Ū޴g ;`=8̮4ppǁ3ngḇXe}e=w9m<fvYBA1\QF{;uhM5_ U(NLngAר.FfG%n%;ȥO US%ׂsߡ4 cveQiRf6Z'3(Zݣ&5Yk\| 3T>fcPacAq"A a@$xgCEJ#"323U-W& uXK_tؿe=,u 3G.lC@זTQ?եVK_Lۇơ#LnϞ7jgCF`ĨUk&IX .GF~8^ 3Gl@DDT CY[GbDͨ�S*tDX]iCLݨ.7]JSx짾&dHI{ZxA$̱Nz>ck 4]cYGCV"$WHh?CuQ-=oK벩K2.ԫ#b]CVl=Xv]!Y\˳#1|̢!g#{̒?8}6&7)0㾋Ѷ!w!HM?[f ' rD;舑ˆ@2�ѢIMNΈ'WMWb>Vu1Sj8p4iB5j@9179;l0d *\ETBRFB$ˑ $p`SlxM=%twr2T =]XwUxcPN5XU}#MjѴ-ڂ%:-yg\^r{#ưzWS<OطC81^/J 3� &w2h z$}em39Ē"^X0QBiDu\9ЭƞbU83qe8+Qdo ȖV_NZ.9h#395(> fE~wq9^gƺ([=dhxj<t;(Z\uCdqK^ox|EcFh |V8V1F)q6)mJ|=>Yk1V\>v|df\fV]=73ebEh7?!38A$4E Ȼ(0"h1,(3Fh5o*'t& Nf6ȭGDI&VTA$[]<v/<!-Fͅjj7 7EA#X_0Lɶb_ؽ91ЅM~+W" ѰUmxjM0ot X]rHj&L j$(֒]&cy֕jV#*1Sf,=-;˜9aNBR4I gcpu &SyF`WoG �5FR7l0Fc{ߟv9zh} lo !.y1RH(J>ឬza=kBuռU !@X ~ ~Lxr' "X(7xΡwd/(4)4~v<jțdHq `q+Ppձ Htnqh 4c*/=X( 0'#Brlnf ;+#J So Ĉ$t2)u\m!Pc91o5}6 JY3N ۏ%rEdܐ-.`]qR-BCʶo*H)W#nq- r s^~אZxJAGd u"K<}(G~!4o-~:Yix)6?&v,7T !Wca?AŠCȮaAF Ā @V20X5aZִVy?fYx1 3Τ3Du11:T'<zd?]sr >aKђ~׸)j۟K/Q9Sl~YK8-iO QB<G%Fx ?DAO<\2Z^DĴK2Ȭ6B#`8t3˻')pxktə:fk=.E(hK4dS܎YAJPbp%/a\1l,oQYt]pxF lq>s#ЀrV0<VLkV{l`a"0@)T$xO,-fmX~c 2a謗yXv=x O۝bs">_ ^.q"#.'3Y#EP@ЇwJ.st .xap1?T{2zcQP vi/iKQw9%?yZԎANu:{JGݑ=Zk3dNP(Cɦ`EݖCPn^RVi/ ݙ$]1sh ʶ ?)ǹǷlYXs?m'SQ fzN~`b1+lI)xɎ갛ڽJ]glE%9\aoL<:"Oh J_x ' i3lSHG H=?&S[/֡KD 3QF.ɋ^]4ozFGaٵf!Zݳ dŵdc Tz)\M]@s9d7ͨ[ n�`�n%pBzK3TX^7WN% 7B QivuJvtٕM6~׎@ٙ$`)J >CV(tH H֑۫ȳ˛/ 1#&#gƪ ʛ:צZM7C&+7d~&+MW�vfuſ4)]؟XM1j@f&b\mtRwBPh''UT Z8s#ijB31ۘ5q I"#kH{T=]ңpSPz]lG#[VXG8[<6\hzh*3lJ,%wZ.<{ uɵ>wCyO%Ru_[`%Nwnh>N'Wb4xJPx+|sc`IsL#$Uұ{B]UJIT16=EEha?VY=(2Kk_] 5z+َgogf*Ce3rK(Cu5㍶յՋy%/)�ZK~cQU,gxy Pa,M ՌaG!ox䎣Q=,CF>5˒7gWm9ɤ._FZ,Xamϝ('f`vD0==83MpR,Z7 K㰊/Y芲yQN?5lȤb�[Gz)ȸ8NqI sap#KgOސd#�0cldτ *ʌpvx P/HP 2$g1mC !` bvq, 3'Iq<D`џ!+x:i)5(%r0pzhgbLj)GPSKGv3Cԅe͜aH\:2z1ybY؂nm1fipvYr1ft?؁7(_k)%'5λ_&\"8a9nD?\EþQְ3s,”'Qr"~ٮBҍv,u_}BůCd ٯܜeF5 L]es8^0q?Rs" b0a8\u'/1^;wmEvz)g!"Vs̺ LHv+@#5`h%atZu,bu8Z2rɢf "6KA1E{agx<MC>cJP.ɠДgImv#y\�VDG~idž)'BOLy\JN|=+\}Uq-FĂ`&pd5/4n6<kn*]a9ѥ)ʣ[2`AD8 @c# !4LZ z'+S٬f 7#BN0Z<8ͦB7p~vl՜) 2@fpWOa?okȬjS 9:iDhޖܝ'];\.9كɑδEsfP&"]1̢G3E3%`fE0l?_7k#'m*fΨ%:¸vJ\-gWgږ6ӏRx(+D$ŞbŢ"*V{Ї#Ͱ _.~fMV j=Zr*sڪ5?D 5WXS%#̔ JEѯ|dja~pj;f "N"OwmZp!w%)ry#f{x`VxE jr.<?j)}G`7ZO 4qhP'`5SL;|tw�8&j”�~bdlmVngBپJ7'!ͮV/%BG> ]w3OK~5ٟrf#Eq )rOgoV,eĜ␫=~Af'Q0c'3]w+\a.UԮP }͙ôȀDMd+5,+i\1~bАC[-g-N,GB VϷ%E*gO%jR3vdLgZJ#2#3@{7cU&J2? XuA8O&@+t78jda8XnrP۰8G-'@>,aT=dt#mSrň<�\Nʺbj1dsWNZ*` [lˣŭdϫ�\,90ƅ4e.ׅ"PXĦiۈJ ] >g!z\I46ZhNiֻ [ 8ix5;/C7:v,VW\ Vq-O~V;Ke[Y PA_09JfB ܔ-M5g 8UXS mWCڊ̉,l}jQR-)bA00ﯥ1bnfghL?Qp,#at o˾t*) 1 PvSoHU;#=ȥ?A ˯ 1F$Io7$I$ņ$I$ņ$I!DR$Im[Dkk~k)$I|$I$I$I$I?oSkOtMt}iݐ$IR$IbC$IbC$IbC$IbC$Ig"tMtMokkZ7$I$)$Iؐ$Iؐ$Iؐ$Iؐ$Ik5}ASLQ$ɷ@]! $I~/B=ORN)I$I!IIoB I$I I$I I$I I$I I$ɟJ_A$J,qw^k? I$@y}N}|O9$Ig9GHZ7$IIF[ ϟbC$0M\xϟrJI$ )6$I~ᅴϟbC$Iei!Ic,o/bC$y{x?ERN)I$I!I$I!I$I!I$I!I$sNip|/%I[hp|K"I$"I$GH$I: ͘n?����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/rgb/thread.xml������������������������������������������������������������������000644 �000765 �000000 �00000026455 11213747166 017375� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="us-ascii" ?> <!DOCTYPE thread> <thread> <info> <version>June 2009</version> <title> <long>Create a True Color Image in an RGB frame</long> </title> <history> <entry day="4" month="June" year="9" who="liz"> Original version <!--// built from CIAO true_color_ds9 thread //--> </entry> </history> </info> <text> <overview> <synopsis> <p> Most astronomical images map color to intensity level, e.g. lighter tones may correspond to a brighter intensity level in a greyscale image. An alternative way of presenting data is via an image that correllates color and energy. </p> <p> ds9 has the capability to create an RGB image and interactively adjust many of its parameters to achieve optimal display results. </p> </synopsis> </overview> <sectionlist> <section id="frame"> <title>Creating an RGB Frame</title> <p> To use the three-color capabilities of ds9, the data must be loaded into a special RGB frame. This frame will contain all three files, stacked together in separate layers. </p> <p> This thread uses Chandra data from an observation of Cas A (ObsID 198); the level=2 event file is named "casa.fits". The same file is loaded into each layer of the RGB frame; different energy filters will be applied to the layers in a later step. </p> <p> There are two options for creating the RGB frame: </p> <subsectionlist type="A"> <subsection id="frame.cmdline"> <title>From the command line</title> <p> The command-line syntax can be used to create the RGB frame and load the three files into the red, green, and blue layers: </p> <screen> unix% ds9 -rgb -red casa.fits \ -green casa.fits \ -blue casa.fits &amp; </screen> <p> ds9 will open with the three files in one frame. The <figlink id="rgb">RGB window</figlink> should open as well. If it doesn't, open it from the "Frame &#8594; RGB..." menu. </p> </subsection> <subsection id="frame.gui"> <title>From the ds9 GUI</title> <p> To load the files from the ds9 GUI: </p> <list type="1"> <li> <p> Launch ds9 </p> </li> <li> <p> Choose "New Frame RGB" from the "Frame" menu. </p> <p> When the new frame is created, the <figlink id="rgb">RGB window</figlink> should open as well. If it doesn't, open it from the "Frame &#8594; RGB..." menu. </p> </li> <li> <p> Make sure the "Red" band is selected in the "Current" column of the RGB window, then choose "File &#8594; Open..." in the main ds9 window and select the red file. </p> </li> <li> <p> Change the current band to "Green" in the RGB window and open the green file. </p> </li> <li> <p> Change the current band to "Blue" in the RGB window and open the blue file. </p> </li> </list> </subsection> </subsectionlist> <figure id="rgb"> <title>RGB window</title> <description>The RGB window indicates that all three layers are visible and Blue is selected as the current one.</description> <bitmap format="png">rgb.png</bitmap> </figure> <p> Each frame of the RGB image may have different binning, scaling, smoothing, and colorbars applied to it. You can "lock" the frames together, so that the setting is applied to all three frames at once. This is done with the <figlink id="lock">Lock menu in the RGB window</figlink>; all four options are checked in this thread. </p> <figure id="lock"> <title>Lock menu in the RGB window</title> <description>The lock menu is expanded and all four options are checked.</description> <bitmap format="png">lock.png</bitmap> </figure> <p> Use the binning and zoom options in ds9 to adjust the image so that the full region of interest is visible. <figlink id="ds9"/> uses binning=2 and zoom=1. The "Scale" is set to "log: minmax" </p> <figure id="ds9"> <title>RGB frame with three files loaded</title> <description>The data is loaded into one ds9 frame; the RGB window indicates the current layer is Blue.</description> <bitmap format="png">ds9.png</bitmap> </figure> </section> <section id="energy"> <title>Apply Energy Filters</title> <p> The following energy bands are used for the RGB layers: </p> <list> <li>red (soft band): 200-1500 eV</li> <li>green (medium band): 1500-2500 eV</li> <li>blue (hard band): 2500-8000 eV</li> </list> <p> The values are just guidelines and may need to be adjusted for your analysis. </p> <p> To filter the data, first select the Red frame from the RGB window. Open the <tt>Bin &#8594; Binning Parameters</tt> dialog box and type "<tt>energy=200:1500</tt>" in the Bin Filter field. Choose "Apply" and the ds9 display will be updated to reflect the energy filter. </p> <p> Without closing the Binning Parameters box, select the Green frame. Type "<tt>energy=1500:2500</tt>" in the Bin Filter field and choose "Apply" again. Repeat these two steps for the Blue layer, using the filter "<tt>energy=2500:8000</tt>". </p> <p> The colors in the image, as seen in <figlink id="efilt"/>, are correlated to the energy of the data. </p> <figure id="efilt"> <title>Energy-filtered RGB data</title> <description>Each layer of data has a different energy filtered applied, correlating color and energy in the image.</description> <bitmap format="png">filtered.png</bitmap> </figure> </section> <section id="smooth"> <title>Smoothing the Data (optional)</title> <p> Smoothing can help bring out finer features in the data by removing statistical noise. It is an optional step; experiment with smoothing to see if it improves the appearance of your data. </p> <p> The smoothing capability in ds9 lets you interactively smooth the data. Note that for quantitative data analysis, smoothing should be done with the appropriate data analysis software; ds9 does a nice job for publication purposes. </p> <p> Choose "Smooth" from the "Analysis" menu and the ds9 display is updated with the results of smoothing. The "Smooth" option can be toggled on and off during your ds9 session. </p> <p> Open the "Smoothing Parameters..." dialog box from the same menu to adjust the function and kernel radius of the smoothing. This data were smoothed with a Gaussian function with radius of two. The results are shown in <figlink id="smooth"/>. </p> <figure id="smooth"> <title>Data smoothed with a Gaussian of radius three</title> <description>The smoothed data are displayed in ds9.</description> <bitmap format="png">smooth.png</bitmap> </figure> </section> <section id="scale"> <title>Adjusting the Scale Parameters</title> <p> This data is being displayed with a "log: minmax" scale. That means that ds9 stretches the scale to encompass the range of pixel values in the file. Adjusting the minimum and maximum scale values sets a threshold for the background data and brings out features. </p> <p> To change the minimum and maximum values, open the "Scale &#8594; Scale Parameters" dialog box. The pixel distribution shown is for the band selected as "Current" in the RGB window; when the a different band is selected, the histogram of pixel values is updated to match. </p> <p> To adjust the values, use the cursor to grab the red (minimum) or green (maximum) vertical lines on the plot and drag them to the desired location. You can type a value in to the "Low" or "High" field and hit "Apply" to set the limits. </p> <p> A basic guideline for setting the low value is to minimize the contribution of the background. That is, adjust the minimum of each band until the background of the image is flat (i.e. solid black). For the maximum value, bringing it in to the last data point in the pixel distribution is usually sufficient. </p> <p> For ObsID 198 with the smoothing applied, the following limits were chosen (listed as "low:high" pairs): </p> <list> <li>Red - 0.4 : 20</li> <li>Green - 0.3 : 35</li> <li>Blue - 0.1 : 10</li> </list> <p> <figlink id="scale"/> shows the image with the new pixel value limits set. </p> <figure id="scale"> <title>The adjusted pixel distribution for scaling</title> <description>The background of the image is almost completely flat (black) after changing the scaling values.</description> <bitmap format="png">scale.png</bitmap> </figure> </section> <section id="coordgrid"> <title>Adding a Coordinate Grid</title> <p> To add a coordinate grid to the image, choose the "Coordinate Grid" option from the "Analysis" menu. Then choose "Coordinate Grid Parameters" from the same menu to open <figlink id="grid">the preferences dialog</figlink>. </p> <figure id="grid"> <title>Coordinate Grid parameters dialog box</title> <description>The parameter box contains fields to set the plot title and axis labels and to change the axis spacing and numbering.</description> <bitmap format="png">grid.png</bitmap> </figure> <p> From the preferences box, you can change the color, font, line style (solid or dash), and line thickness for all elements of the grid. The font style, size, and color can be edited, and you can add titles. It is also possible to turn off the display of individual items via the "View" menu. </p> <p> In <figlink id="color"/>, we have turned off the grid lines and border. The axes have been changed to "Exterior Axes" (from the "Type" menu). </p> <figure id="color"> <title>Final three-color image with coordinate grid overlaid</title> <description>The three-color image is displayed in ds9.</description> <bitmap format="png">color.png</bitmap> </figure> </section> <section id="output"> <title>Saving the Output</title> <p> Once you are happy with your true color image, there are a number of output options in ds9. </p> <list> <li> <p> <strong>Image formats:</strong> from the "File &#8594; Save Image As..." menu, you can choose JPG, PNG, or TIFF file formats. </p> </li> <li> <p> <strong>Postscript:</strong> to create a postscript file, go to "File &#8594; Print..." and select "Print To: File". </p> </li> </list> <p> Currently it is not possible to save the state of the ds9 imager, meaning that you cannot save the composite RGB frame and reopen later for further analysis. </p> </section> </sectionlist> </text> </thread> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/button.png������������������������������������������������������������������000644 �000765 �000000 �00000003065 11332353405 017416� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��j���6���c"���bKGD������ pHYs�� �� ����tIMEs��IDATxё0Dm C C;{* H=⽟ޢ53B���}��T���7.���> ��D#Ƅ*]0PzLח$"0y Ƅ*ukL$!<y �� '���'���'�� ]/<?xD`R5]bluKl: :خAQKj�rOFy>k kj uFETmmLM%M^OkQd+NTKQҘ~2SP[K|7p > t,==Ϧ鹼9�p)oLsW; tCsz.MJŏN+S} wx1"e@P ;~Iv%U8|`tK`q'|eiSq߯Lh1gIQfDZS R֝T%+"ʽ+ K3o֯PIevۇfaycɮhlŜ6 < <BidiڼuG[tS^m<[& FmXv-|ӥ!K|krA);cRe3\.`\ã =ζFk\m< 3At<ZB6c4l]kZ*o-R''iy33m̓ADUw ]zJJݣ�ca�90�3('���'��màIJ a UoIaB0ζ;��@���t&v!n)|_ aR Xt1qeg)z{@ Xl��$ �� �� �� y+G{<ol#ڟ|w(6]' O_~!>Ќ է+SkfW"KE6*YVXs`|٣ A찖r>{xw{U%UqE1FY6O?(xrRy-jzL_ )lrƜQ =g:˜ӕqGԖH`pu\R[@<)<w6+@֞*-d)4�]wǁ.ļ4fZ9aO2 x&G&Ṻk|RT-oA)dν57;ʽOl*ܜqʦzv׍tğz$vrteҙ8.ԿPmv\iOxSp-í&&Ľg6��ی%s��۳�C��`��(6oo&acH"ޕj Vs,;4���0�� ~��@�GRuj����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/color.png�������������������������������������������������������������������000644 �000765 �000000 �00000000663 11332353405 017222� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��g���.���)���bKGD������ pHYs�� �� ����tIME "��@IDATxێ@@A>h p13@ÆuYm#D"3;��j��PI|"ӿ]&^<'>@)�������T�T�T�T�T�T�PM�PM�PM�PM�PM���(2*�E>ɖ;,=wZ�p �{s � � � � �gq� Pu\4U|=zc!e~gh*&p̬5jjpM@2�xSDUy2$g K �[6�&�&��5͇C'=����IENDB`�����������������������������������������������������������������������������saods9/ds9/doc/user/gui/components.png��������������������������������������������������������������000644 �000765 �000000 �00000634021 11332353405 020272� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��4�����7���bKGD������ pHYs�� �� ����tIME5/ �� �IDATxw\GgqQ vLkX^[Xc7jh0 kL4(6lB*  Dd8v<< 4ٴ%_GGq _iw'05%A»gj/G`偐N8 INl2HA8Xjs,l?p$ :uCa5|.�PgdqE2L Sj,y o8$i14,p9엋1 (t/(N _�l1ӤPO,]OhqWP.2 #20000F r9}$XPNY9Nkb[b huJ~M 'AD:TTmenv2 I+i"['zD7Vw\%A ŵ $ 96KE$XEzM t/2Ďo.|&VxJ'r p?5ORf\QE5 ߉&k �a++$IԄjjB[gQ ݺf5 E|; tKLFuVjvab�:G\K:w+Ug0t h7^&+2˕ �U 8/ _L,tu^J1,K1g;�>orla> 7D:4= k>AзgVC9A_��>~y*~Pπ`_?&)~ՎPD~Nq(t+'Pi1-RK6ORpHYJ F̄`l6uP8KIVHeBXo@1|HcBjUye"!ow +EUfFf"�� C&0[h2 ��sX8�&¢3-Efa iX,Lo$ ,qERg0PY,#,E� HB88, C�f =\sF)Wܸz<s^I-| olBZ(B^8ب[ f=b5!Nq/o[&/Z-|JBbo ΖHD:B<!y\֓#EPO%D|΃]=c ��dyRrW5h\mEUj?gF੤v۷[B\|�$;{,2,=l9>.-O\yVףbӉ*m;T NgN|,Zq^y [gR. rL&`s쪛E/O]v{9 j$| sf=7b^)p(+`t'!K;{VU<pTYƕE M '��W$c۸*c!\8tA/,qwY<⪆beVAyFL"(#w찾2 k\m8,AZVku s(ύ_%0=Og䮐 ~Iӭc'_Rs Gʚ:N#ue]ڇ<H~VҿWAtZ^a`'yOnTpF\Vxg�wSʕ1z og'^JVZSYVhKX,n΃"{y8h+52z4kNܬPE� ;4Ԗ~ӷPz^pgP7'Y{GYiJ.8M(5ũI[oV[0.Ǹ,TO, Hv Zwۈx+"\qN C\-fK^QYznIIU}{/(�, @POa,,$10;KZvק~\\$LƂZE,h"b>[!lZKeR@>I^o@To 8lBRPV ��6A9ufa5ط=�DXjUZav$RRUKHfA{P?.5M��ɀ(84200 NX69'4B_6GXf|V^$�U*5F͛MHZ͋օ#3ahn(W+-Si'b h!1 &X k'pSb C\8(eu*anJ="slE<6h"%,(X$ j8|!�@J|:;fiuzr I"(I02hB.MfZSA �bՒɄ@/ׁa]H<Ȫ<s#E²^.-P30000&~UZ=״_yxwT(=XPNeAB텻zM3Z]sݓ<P+^uZ}E6J*⏋RRY[:Iv]JpitzT,lg^AzAXgIo.5s h$I ("(�b!Q .oIA,T ë4`vzyV=1� P_VW\ަNkp IC5¦g·ïNF7 6RvNR>*Jey43�o.jw:CMmqI~JG{'o$MjN\N,wX'weM7-"_;; CVuk3kRl1[hLHHP]wi�B(,8{Zgh2]'Ʋ;?Jmh pwuX,ϊ]UX6er#e5@e:#GG!9UеAo0=(pq sTU8 -$i4I&RҨ5q60ASRJݿG'�`toba\6+#փT;*>8V(kW\Q G9'7G7z8وX{u,6Ow 6( W F#j~ea("o,4sd΂F"�jaQU%5W։=_l2vR kU"WМgYi1 ިlM{gJYcB9\1Ϣo(,.;984�h2uh"_PYQUSJ&ps TʢbY᤭-6r[jRtj`g'oVmډ,^VOx+*k= ?&>ʓʝ8%l4LFN8r"�� XiPic8*e ;8`֤SӘ$v ;Q]m2JG<1W fs& 9FNRAAz2I6^YZlס+%,wl4��+:vcqz yl{{籄OW7�<?;+-;ťS+2O_Acj;\>ucs i{3h$,к,�4,:$�EqFcRi&c8lqi 5-&AqQe5:=ʑ:^R%2.[kG숱9*Bי!W-f/I9v^]]+pht{20L��jDp#a4�a,o#jL(@D(i$"e=a2X E9#qQũәuZqaȳ9[TUe{X̸;xa8UN˱[,ڕNwT ɠ·jvoɨ/c6F,HCTdclɊX,Tn}]"wXԿ<z�߯U,Mocs~OFM$$I>;tbZo`(<M۾&"d7fH�,$I)`�bA0AQX^b7Մ9 l]ژ ��[)QHSF 8+wa9f,n p6GӠ5b襁-sqI9O(BPLUc52ť<AQF-UZV[oW a9ͣbs syBF[ߠna\Hֵ0X - 籬4'��L^\ҟ8pZ $b8JDʅnc````K*R5!v}:1SRRKNiNb4MۻHt"Hi)| d````(7nTVj�mZ8Y,J8!/"O"`@ `0�0QTJyͅF\An�,KI=HɼmA~9v })^8�LF 0‰Oeajb````x#6Yzu�ԩѣGǏߣG?Ruѯ̙3߱cG>}lKΝ|r>*>H(Y_r޾};=ykרVX?wРAC ٷo_JJƍ%ISNIIٷoA(_ѣXߕ+W:::$kN<9iҤ?^:t?W cwؑO۽{ &0… >WFRSS<x޽iii6m"Ir͚53f��|wIII6Ө9}Gm}ŊQ?b>R߿j*P+W={6�رc7nXdI<z͛75蘘Ь?qqqYYY1ϱVVV·#�G9uTk3:|ӧ<<<bbbpqqq׶'N9sYҥK]vB1ƍ7{ J%,ãGMhZ7###...//#--muuu111g.//^qqqΟ?7xvmٲkaaÆY\\�իWt:Vz*6oϞ=;''g=N>Y/]oW^XgΜIHHhy.]{ 8j@ݸ8Riުns^mN}ܹƍ;F>uԈYf4ϱɘ1c�?ƍ'ORJKK?֪/%%%χ_Ç׬YqFXTT#G��,X #""6n�ꫯ"""?~܆gڵ+|@Be˖k׮͝;f=eع|_~%X^^޿K¤ A0& //ѣ7nTT}>}zRRRDDāZ/_\QQqɪ*l͜:uСC[nVu('Ok׎jNo6LT1~gҤIʼy{[ʹI&9::n۶-::zϞ=a6mje͛�;wHII;vСC\ZZ-0Ç0Ν8uԪU"""*++7o_�Ξ=KUWFF� 22rڴia?f͚ &̙3'::ܹs ,hhhx葋 |rΝ;F'%%<y߇@DD,Y�;a/\@Ņmfڵ͛7GDD<{`0Pw�8}ƍJ^n}W+\߾}n۶~}ԨQovvvvDD_Yn$J"f̘?ܸqh4FEEaֆWBJ($''_paĈbyyyJJZޱcGbbX,_`�(ʪ*WWk׮TH//K.)))&`0$YRRaufAz}JJJvv6jSNj?P(իԩSׯ_z'N3&,,yyy#GdX۷߾}~:`Ȱ;wIQ>{ >oJJJFFbyw׬Y飄&zC>|w~~~ǏOHHXj@ pB6vM68qb{qƣG{=6*nppΝ;WXq-[|7Ap8P77СC+V Op۷kkk a/Ld?ӽ{a؎;Z5 qrr�k䤤3glM"++oߞ5kͮIII>|Fi8͵7ł 6lؿ\\\Ν;v8|e˖͚5kĉ?p^ol6_~}… ̙3t۷o[,1c|<oܸq-,L~6lؠhHB~gϞ'OVVV:;;'�gϞK={vÆ GiӦeeeΛ7/000%%e֬YwqFϞ=/\ow/f̘qah4yxxb^zq .Z ^zY, .?~<oԩ'QDRRR8o<%##|ɒ%͛?>m8-S/azNn�˗TSSCdN5kL aRUY B7b>Ou0Gh6j`8s挧gǎ(vڳgϾ}zՆg<yrPPPXX%-ZT*RSSM&Ap6HbfggbrL&3 ZVa4IlR~)հ׭[7k֬ѣGƊD"FZ֭[w}>}(Z]]㸝 l3Th4,ð;;;Tj0jurgX'N,**9sy<==333I/Y`ᱱ)))\.6`8/ H[mA\z>i QѣG7nժUUfcXjjjFJ[lii J%lvmmbb=fDm۶Qp$Iv8q;vlqqܹs-Z陚5 {O xuuKzzaͨT*J?sss;{r=zɓ>>>l6`0L0ӦM?^8qbTTTjjL2ݼyм.9 hԪ�r̙3+֜^Zj04y>`X!!!mڍ > wܹ?99xҥCݻw/ 33s𫶱y#�Ç/Z�7i$(q[󟸸8B6\?C-XU=fUUUYYYcAV?}~ѢEFqo4L5";;{RLάY0 qwwK%..ťmq>|XRR2f̘RxqB0((>(G.;99򐐐 E>Yh233͛g4w9rȬ,)((hhhX`�׷Z=rȺu<<<JJJ , vIII#Fرȑ#%rΝwycǎFڴiE",,L@ 6]8Ǐ «W7jN<A>󣢢N:yyy𛉌<rHrr!C233aÆGw֭ bwݱcG2 4h̙;Ɓ�� �IDAT[n裏ܹCw�<{,===((hٲe555M6ð־tPأG i?*ݷn:rHٹsg׮] ***^wa m۶ÇڵO.޽=SRR*++/_T*:u%Kܽ{ҥKq<uV@@��޽{qF` ,x뭷7r.ر5k}�vrE6}Сٳg8qSN<8gΜǏwz:o˗߿啒B7olmlӀd2YBBݻ.\H/YyYsC%''[7nJOKKkU.Е|If5jԨu}[H;w0qĞ={Wۯ_?G?~|Ĉ%%%ׯ_A +WN>=11 t:X7oҥ _~uwwχ8p`رJ266T9|]TT+O~;|> J/\0twD,Jvڵdɒֶ4'';w+W.^8>>~Ȑ!%66~ڵ+~罼^={tsscccg̘q=ggǏ>}5,, z>\ ޭ7nqƧ~;mڴ[n򨨨L~mkضF$ 6 X6uyZ wwF f~3fܺucǎ:t n]reƌoСCǎ;`0n߾}<]F/]rE;bJFo' t' )(@i+��{>ㅇ;;;ϸ$ɘI&|9~~~C a8ϙ3G*{zzzxxI>}L&GGǖ&,, jPԩSDDDddhtӦM 0W^(:88)VP+,,L,SCXX4d2J D؄999aֹs޽{( c 0 Ntuʕ<0MX۶'Oի:tݻ7 BQTPp^;;;BAM|rXr|ʔ)=znfqvvݻA[eJ]t l2XSNڵkhhX,nhhf2  o!2|Ƿd XooE=EQZ}aÆ(ٻwC"B:tuimA[[۰:99T*Nׯ_ ;tfggϙ3~QQQ𾾾/8Æ Hk<z-0 ѣUVt=z,_\"zX Kގo޽dSxxx޽Q ׯ_ N޽ZҥKxx8:::j$ǎ &II$'EQ???r[&L۷C!pá7lE c4u!wޜc8:ن<5ɠ*V4:qz&-^LB\Z-fgϞ 6lĉgϞMMMm*׿7> ZHx _|Lϫ{l_^(~lb =\p[oƟT?[[e˖Qk<==_&^kn׮]ՐVq M2‰៎X5w^mvzY$8m)iN F#h+Y$) ,T Pf⊁ONj5 eeDݾ2y2xN( H�, rm C[Phi ^8cZN[&={vm^R T\\rr^ka`````xh4:88 6?6}嗼 5N��ǙmKZh4LL=0`| K&4'V㒒`󱵵}<10i0©ӳm20RQQP(aF81^O0 2YDjpF8100 ^!'O1k7sy‰$yY__|ݻ1 ۸q#S-ӧ;wnK.}�ŋ<x�?w\`=ڰaL&�ddd|WT%K/Xl6�z ϭ߷oǏ�"O>�$%%Ǐ3&<<�fټe˖={fΜ 7o4Zݛ�H$7oՒp˗֮Y^>]r… =<<f?�[o߽{7߼[~(&Ncz:k֬Yx… �Nrʂ >\QQ()Snذ^ڵɓO<?�֮] ~Udddte_~%z˜:y}XVkN񞞞۶m_H$'NqN-nĈ۷onbbʕ+#"" 矟<y266lӦM$I:;;ǧTVV~P8ǿ;Ǐ�dٳgO|ÇlقFO/^=qDg'''?ڵɓ' 1c|`kk;{쯿z޼y|Ͷm._o߾͛7cV[[g-[s„ A4jΝ;3gT(&MOΟ?j*կ_?*dVV XlXu֜p2dɓ'>cWWW؆ 㽽)tQL6`aÆM2^ AKR$-ZC(㣢Zmii rqqYvRSSn݊ HϞ=cccoݺxW+��oO$?yU\a%%%JO.{aa!yxx̜9Nû8::Z  &Iڀbq8F)fNbF(۵kG 0‹nnn>>>wii)T\=VaR BHL&8;r8 l6 InWՔ2[,X�zl6S!Z-AG_U*Uzbm~Pwoܸb >ѣ?PDGG7p@8_v+WO?]v„ ^^^1>[<;wnIIF6lXNNN۷o^^^MMMzz1c|||V^M sss/^<dȐ-[PE-X�ƛ7o͝6mZϞ==<<x<dwU̪*_JѣI&ٳ/^lhhy&߿?A%%%yyy&M  zDˆ#ӧO2eٲeIIIgΜd3f1bD"�Kn<<<={2*q<ܹsj}jjի7mڴw޸8ܹsb=zPooٳoP~9rT�.55={o�@EINNj}l6<''gҤIz ?##0 xu@Q!b04^+ ؁=Q�^ʹuIP>y<^A*=z%X,dA\|^ @nn.Ci0)z R)PqRTbE,K$J3!Ibuuu0$IRl6SPR lDJ2z yp"I JKKҨ<y2a„ 6Xb̘1ϟGIAݻw/))il6 {~]v 6lزe***6m_v-888&&ɓ .\l{ݤeggGuUVWWGFF/rРAp:mڴ1c,^;99.Ϝ9C~'NI B5jTZZǛl-ݻwwqq9uTBBªU|~IIIzz:l**==W^gϾwޱcǾ DbccCׯ_tQFk`۶mG2dѣ.] X8G:thȑ#~&GAƌD"qrru$ bH8T�t-::z˖-/WW3g<}{ bPJ񜝝srrZ {d^ vNNN&RMIgfffsQo߾ aj1`0Ry988@�ӔJ]t8QY,J ETAʜPRRwQjlZ6++X5550)hÇO3Jv`.KNar8SeFQڒNjc&JJRQ)===88�@?uJV6<|IIN3 ? Hlmm 11Nzԩ$gggJң_L@@�E}Ǐxb׮]SRR?rHjzĈiiiQ)BPXUUEeͨQ^jVPt:z}BBB>}`4p!Cl߾~p,lpΝjժFcjx<+bD"㶶6mdGZkF ?ҭPΞ= 9sj<8K$^ߤ &44TP :t׮]I HOOoWTT@kNɁͣ% ǽsrr^�LjR2O25/}+ILMX,4 @ճd@*DFb�awTO%IzTHKru(MP]l6YO :@3�`^ ީ)))i�裏>E1bO;vlm:.--ݝɓ1Ls%"11. _~e+**(#+ٳg>lpr% ӧ?^^^… ׿5L-dǏO-[pԩH`N;M81'''??:[t  <8??Ν/.ӧOU*U.].^8zgzxxlذoiVXù k=n܁aX,C`Ph47??_PX @Ҕp֜ www)= *N0E{r-ŅgÆ 㢢W>3e .]tukgs|j䒖fE<8cƌ星=~xĉ޽{+;wu˗{)-ɓ'9|||.]TPPҡC�={~_Q .L0!$$dݺu뉉jzС/ή,99�0vX$w5vr㛛AٴiӶm"##sj'5ǒ%KnݺU\\駟> oƵMvAAAzѱa{J` `049qrbQLT*xcX2p/7'V% B^)HOWyA&�fSCtҷSc*Ymkk -PcGzNG=\.V0ZF١(J53BiETi_pؿcd2Ypp0}vᄏk׮k'Ot~HKK[~ frssׯ_?h .KYĤ8p@T:;;:Ggee߿?---** j?z~0LΝZe2;COgݺuǎ#v0`\.?~}ߟaÆ#F~9%ƍOJJ*((زe c_vԩSpZUUE?""gժUYYY ;6))å< K$a�3fիW9uVgJfԨQtsʠAn߾biذa~-֭\k&쪫mll":YᤈhD555t-%%%dJqBDds 777jA4EQ׎NS0*?h4b``/]YY eCuuh=(P}VL$Q^$i tK'ҠfУ^IDDDNݻT*ٳg~tb4 |@)--H$bW^pt2n8j C>}.\\.0`3շo_h&EQTP999uM$T*5bk:ݛDhqww3g899@7$f0 svv }4ѣG~BBB{;w[DDIz^,;vNNN>$l|}!`0M2{V>}D"ќ9scFxb8Hnooxhhh=P wwwq6BPA|gWXxIIШ(Y,LRU {2͍*LΝy< Pݻ7T"DT*j`Gߙ3g222fΜ '0푛h#==>`sfnAV a0VCCFJ:LT|y 8Gh/EDDPKKK9~85F6D"Tj-X&źByy9̔ E qfKXh4P`𢧧uˤ ˋPP*Jcz ˃rðܒA__U2hduc`tex)o׮3tݻ 9s֭[ߐ"M6ɓmn4/\0nܸF*LJNS T*\ZNvDѴCXCؼ+L&SK&w4bFiD 6lУGj*ѣC;v,]&nk[ZFǩXZڍghhyQ+iN4'Rb͉ZpݜD龔GTp)͉sj>tԩSU*;p/lMCmalg/bh#<h#rر7Ν޽;/ou֟Waa!zzz5qƍ&o5)BD"+jd2L-((nJqttTj sqq)..Nүѳj% z`2S5&J(tf�YcD"8555 3/377"MR,uR2PwppQ5%QxTmL&Z(lfp8EdچwÛC``͛7'&gРAp+�5---m[$I 7rqvvVT"VUUYOgqPzE#"�쥫^+(R=;r[V5sbTRܠB4Jkk2j$S/nB Ka!J(J}Q aiqgիm]iw)+)IԀ4;xSs" L~Z 7T*azZE&!//~�� �IDATUk cNNs:$''ۣ(BM7 F8Nפ7k3(h4R]-á&Klhlr9K'x<B͵-Z_~i2wtt{͛*QwD$^ONNJl6I+bFM^?]xPp8*;pU�{vɣvX,Ԁbu> b}.:]bF]~(J䳴d6#E [[[jZGk֤‘YnnٗFfqlmb4hX_DEEE5:|>z۷o ; * 5g. Ù<y2@&R/f3uڙAjePB=t9DݥlÂA -]~L&Z(F8JpdZ{ּB_3 ][ t:[NN10g҆pJBx< Ú5!!!wiQSB}ph{X,Ϙ'a I\МOT:88P^8AhvرcҪ^w;݂/żAwhrƆr{\6͡"B׮qYYrWGGGIT,PH=z4e\aUZNԎYEQPK EjMIThhh]9G/*(({H�&LЫW/�+P+VM611ѣP֭M:InݺQ_�ڵkZ~ x"< "oߞh+ 6lذ6cƌ˗/?)//߲eKϞ='N�?~i&Ǘ/_ޡC ۷o/((صko�\]]/_~֭qQׯ\200p֬Y�[n-_յy+l3[n>e„ =d2se>P]$#LF:::Z,_L&cXֹREܹsN\ICq5 f�$ wNu+0:ٳgT˒唜hrveetuuRt pW#1A_@_D9PrQ{FR/$IT){NUMMӳGi2,YpN<yizȐ#GZYYY /މ9G #G9rK 6rHoo[RG^z߾}~-<8�P(`E'$$#FRŋ .!!Ν;0ׯ'$$PV\v^ .$$$X7[~W}ׯݻlْ@:.!!}w^BBBMM I'Nw,!fY0xڵk QQQ ܠ pSZ2KS.9R j[9$��F/^�;[6~ 7zq"jȼY$cvWW%K�ӧO1bҥKO:?~0;Sd�%K`xĉ?�yfOOOjE` G�d_^^NOLNN>tH$cǎ0l{.ʺ}4 Ν;wŋGFFHRR'|;˗7y觟~{;vBa65ǭ[t|cǎ)��ے\.oTKaaa;uܹ_~& 3K>ci^on NH$HfR3[ f@?VT;qUh$\Aҧstt4 !n$(60-`ۥKMaa!lvV? \nYY<gϞj͛/^\h-**;}WPPرc:4k֬u-Xo ͐ J57oރRivvI:DF)-wl_+^:k,xW͡Vɹ벲2Jw4/ ۷|}}GΘ1GlPp(Ji"thf;lnt|>Ņ:ӳLr8]]F#T!I��{��h&yёO$ɬ,kw$x֘.~l6<# 6ݩ#-(R)u}yYsj(aggGX">~AIaIIM; Aj'˩RQ;ӏ t dXT'#(H<==2ͅD"o~L;_<'ɓΝ3 n蟣VM&D"Љ^(Q (++3f̚5k nzh6馏˗|||Rԟ~IPddd9r=?~۶mp|?IIɵkצM{kΜ9oyׯߎ;xbs1Ő$Qx P(JTCDzޢ$`xIpppQQuuup:�G�H�iLG.j4H87onn5IsC?2E_Krg D%J~*nb 6JmODRy5JN/fƌSRܽ{j̘1J$ɚg}aM5QQp_ԮVJe^35ͥKfiefv-ЛKfjn |3?|Ǚayq||�%]\\\SS.xWZ(W /ѯTVVzm;;jԨSN555YoNpiDҿ>h޼y/ر#ZO?O 4~/ImdCBBp=.CSSc; v\B|}}/]D!ZBRb$L&w 3r9`ƎwA< Wh\7aC^r yyyׯ_ٳ'_~qρ***Μ96SNuo,QbŊ1clܸh4;vlPۻw{]Vk׮+̳\.իWIIInnlLJJ 7n:>zNܹJ:vXLL :pSTP\UUuE@/f6lX׮]9裏^xK=o[n5kwyxxt:9>'RTT4RYY�9D]\BYVv%0c^^^^BXL2_A.EhY\ByofNѺs88X7EIRѰRqdpшT*Nm2^v 0+A3a0!߫dIӡvƉb}f͚={I:d֬Y%FСCMMM;v/JIIٴiӆ Ϟ=dɒ~;vl׮]~~~K.]`ARRRNv?_r%,,am;2337l�'L0sLR&<wqƽzܹsZ~=^^^-&Ob.]j6Y,x pK/0`yd2?}0͖rQ'''*AW_A1kXXkˍ�Zf Wcc#2 m�s ~Ek{Ӏ0�|}}Qi"** sT@"8Nv{BRj^�sHrB@&.TjgZ-oRk׮xكD:1?ԄڵF%6O(_nঌF#,ӂX 9!Z#III`id4iۀ|RLg Fl6B7aL@!+NEuI./_|֭Z611qȐ!ф^{f5j۶mF4h,ZF uY\.H׿[SL!$&&.YO<DKiiipp2dhya|}}Qn'---&&+--.r=\l7xÎa* !2dZ%IZZHG'''û8eʔJǰICNIIʲB?(111** VXH)-- `n qq8:: D"r+ɄL@@@ssX,k LL$Q.bNS 86<X,Lm6m p/?}vN bَJӧO>T*'#{-ւ:P' vh׮~ sK,F,w3qDqqqqqqmy1`tӯZ}1Nn8jZvpR#7c+݂%0֧ai$kBȘ1N(aB''tQÍqj mv_nƟzYEI$\nL֧OVu{ 4LdrK9jҤ+J)1:1N"N/Ҋۅ[R…ʙGFF UUU"")}}}i}[4e=<<P?777l6EA%hwD77Nyzzgł\oP(ܹ3.k0@ذjDS#Fs^ߪnqP[[봵600P@f"MYYY"HRAn qXhZ:a:Rj;w\]]Q.]HZ&P[w4<Ҹ ٌÀ�< ݙG81,Z8t:8/T1#H8a&PzN x<T{Qp.;I\ f =B삍z=ޗS"0i\ DZa[ ׍VQTmD !0X6l릚aXal6[p+u4MX,+q8VY&llFM;˟{Ü<0-lzkƎ!+W>h{:ݒ7 . wbZDBƎ%N9::CR|>lHrhµQYYIaӐS՚f@`d2J[_!{$=[o (D Rt5=G�}QqY,D"q#TuP(I|@.H^�P(đPHnx8�K;(v\wy p.hAP4F� x<"]g2܍p…\kxIW@,n…qLV__V ѱc>|]v@MmW|ҥ�B! RIPx7ŋD-ַ*{KBX<rHi4,[Grnի05b>V6�Wx Y-1]5R;f; ㇴb0{$0 Z--TWWC h"XʹD6Nw^z=J ԨT*If7RL'J۟;wX 777mvvO^G"+hBKv#] y?':6C*G95FiB wXC?>n8;�x<8D"LHj===kjj\L&744صj4/JZcc~##x***rNF6l6[Kk#s4r. JmpÍ?H) A.C!izPY A|uć,$'dvB0Jqhؖ3Pb;a`XBV�@n+\ϧl6J,c ދi-LDD4&(F#1�p8k `,b{GZx̐z\.j&+ le}Î;}gyDrݸ(++5_zxcy{q^e2omm"%%%H ]f^h46MR=zuL_v s1V^^cc;wENH<!ۛ+*JࣃDUTN ꓑ,NX,4NhZBjxhbaH$a4ԏ|Vt:&iM[;>466b\,pQ}d2LJ]<l4C o̥A-R WFF-wm6GO`۶m4jz۶mUUUǏ?~<0<<<|||Zc40ѦjB,h4:,0L:N755eff&Px饗:v(J X,Fil09 m٬'!_RefBAi@PP-3ۏr/Ӟ={jjj^xBw}_,X 11qɉ3gNbbbCCCUUUbb !6lH.ݸ%˔ڳgϵk0`g ZQ;AL&ZM[ͦhd2ZB, @.[YY:VPP�,@˗V\Sw.?/2P50\Ng]]-UqizQQQkkkΝ{СGd\m%%%/_X,_[oxǏ9GHKmAeeedf'OvumTh4׸q[T#TVVҝ7}9r!ߟN_Zfjla11~9~%;؈]WmDw:iCC1<9rIoy fD"B z `,.00* wxyyQP?h~~~4z!!!vcXjk׮jj[f"L&̋b/Zbj aLz</|t-Œ "hoS*_2L1jF0 Zn*J%v|s5jɸ"ZnڵK ' !+Fȑ# u<N@8,XBa޽ϟ?mq.Jq@ܢj!MZ؋H9S樊Dnb6M7b6ÒcŕN(D vFͣ_�L }1?\ }.[M25b<jiӦ=yyyFz!jl޼yԩ "!!=S~O7p28P)|Zxx8+++JJJ2 P@{`*[$G(˗/Ϝt)EJ1T*. t___9;!Baaao6!$--իyyyysvZJJO?RmGSSߺfF&q]$J}}}!e0<<<\l6[d2^:~9SzbQ(ǎy8//!dԨ8]bIRaBBB]dۨi".R)͑ihhHlsJDDG:>-66`y)0xxe(J5pUoZq/P཰l$G~)<VE' ) �›†xxb ⭷8pFM1b+P8vؼ<kǯ0 "ѳ�� �IDAT?F㏻g;P(?~ >ӧO-S='D[Xj- /x<.E"dJMMM*b i׮H$ʂSuuX,6CCht v6F,AX,p8ۦۛi X [\NfZ^ `隻&z ?lp8hd2 lFYi[VL&8á mxѯuRo:i0prQ[]] 6f+n9'H/^vkm 7 ୷Bmɓ'x@lٲ۷Btҭ[N:˗k.22w w_z%(t!-[_^z 0̍<OP]�ŠŲ#\ZZf cݨQΜ9"K*D"PNXǎ>W޽}>Ç33o:Ū!7RG$dN2"na=B߬Y-)))p;]cw BfkK QUU J؟[T*bVe JBdJJJf#44jj4P[k_Sr2 bYjE*[,exhh(o`0\<%ajkkݍqr 7X,[-U׮]s\DSSSKuAAAa߾}O> N> ^bill }s3_W2jL&TF#WBaN.Y,Vdd$###%|bT*a,Q6tQ.萩d�ݿV9s d E.]v0xXc>@ zx 1\D#999U !CP(tt 3<<ˋq'7p@nK~].%r9L555f9::z߾}1118d2566VTTtfrHv ᕕ HR GkIg5bbb\бlTP VrK�R)f\s޳t6 [IUU4VS1LXg%  W h! IR)]6Nwfk)uƃ; \P('Ԓl6wСz3l6a&ڵkf[,VBHaajh@-R.]\p0&Suu8\ݍ qM 0nO}xb\Gb8>%7:CBs, oð])..$..:u{۷onn0aҥKu떝& t֭ۥKZ*@$NkiؗJ -jAz;vZVcR)FbةR.]F.u{pz_8QiTm.\|spJ//ݻ;N!!!)+Wꨐ6 nm¹fFTx :u!DPxfa-[Š BhŅ+c6RF f:1e\"]Laj5jڊbԙmHI Ff,H`�0u4}m0F >':<K ?* 4;jͤGt]; ou}_豏.<mnbJ ۷8j tl߱X,v zfA@Vz*l6D{JuĩMPcuSN?S@@@AAV+iA&h4h -yzza?f%_(ڵV*>3&رc&Lh`P`8dB%ܒBtܙ6Ni ,S}Xhc%ICCD67 <<̙3TUia!P(4SvhWֶґBC, .B!v6Nna-[TUUXe˖ ;7 dZA]rL|#b2^)RcPZZjWZZ*z#""HV{xx]~]RRVJ0OOOٌ.⺶.GJK pQe{<BY1.\NIfiң2Le3 Zsa,á`cppR+ ¼@L%'6m4zKjjjfffVVʕ+ryQQъ+7a„_aJsZТ[oB<|Bv kr˗/8`޼y)߿{SBG̝;9r#SԥK֮]KpBXM>}޽O<<<}{v޽hѢ؀�x.Ο?a<s̘<c O :-Zdo LQQQs̱;h9sf_{5زqFB5k ::z֬Ydɒ{!e6aրc;d© B.Ь6 PXZZa0#"" (ԤjKKK|aKu侾r�x]Y,S\ru8>.-�;C(r >&~UP1iz/C4Xl6tӖP tE3d a( AQ&FxUUU{t;ӎ;ڵkj*oDDG}tt /x<s=s̎;V^aժUk׮]b\.Vŋ/_cǎ_O>vĩSN4i˖-;v?JAfBxG}SJJJqq5k>FjI볲BBB8_}նmۊ@ÿkhѢ>hժUO=]?xnn>eʔ?_}||v|rx#55yٲe{Yp@ 7n矫 Bh4}Ǐӗ_~rW_}566g1͟| ݻ7(jڔ].\?o{{T[[Q}}czM[MZ%0gW'@ �'N:uϯ.vgTJ$qq1 bfl6[=|Dȫ}JK9W->hnn>r9XzL&ׯF:rH@y 6ٳ>0ajO~yHiӦzjȐ!}ZݳgOR.\O>d3f@r‰'1bv dBɓ׮]9sȑ#/_N/BCC?+V?Y~=~u/>>>%%ER+V8y$0򪫫 tĉ{{{pZݷo~m߾~j?|``CBBp3Ξ={5kֈ␐/_8qb틊juNNx[n]vܹszjuuu|||>}l6'B:vvZLү_m۶t:zuyK .:I -DEE=rOTXXx3QV/Zt)6LG;v~ɓ'+**RiHH!9v~q*--P(իWYY]SHlQ͖f" VAb ޸q#z;Z1NV_%S"ϰnll4˖-[rl~LԬY222;i$Vv6+7mڴm6?DEELZ/////Yf8p&33S?~<99l6=...Lottcz*aJp8h~{hFEm:s5. k{{nժUqqqcǎKKK 0O?rb.::j~w˖-[hј1c ңGZ#r/**2v/**zg|>ڷoS QPP|I= ___쥿 F"nUDW^p8Vl,(%%dl01/ #" f& \ZR/FG^vh4[,=bVVqqO\BDsιsl#kDLFX29sӘi&DI<FB͗XBB$$!jBzn]t)((p]wfi+a=PI8K 0Dd?؈3LPBW B4D"h47o& .o'E(EJ}DA{!@ Ŝ8qDIBO>>: ̰z)m56һwoBȴi^z%L&0N͛7o|վ}ݻ_t2N:n'Nׯٳg)ƍm#FHHH�N`׮]ïϟ?iҤ$$$G)((ݻF3fLZZhNo߾Ç׮q.\ɹ ZV$yyy9sfҤIw~J\K9pesyyy͜9sΝܳgϫ:k,<s̵k׺w>gΜ79=ᄏwO>AAA#G9\.رc?/+++wٷo{vaaa0=R9lذS-$,,, `۶m[+'㏹V۵PwB "1I-^has\br`d6k r9bxV ]2]2^؈46]!BEv %$%WUѢ;tCaFx.r8vaǨ a ۄ!q\O>㓁CQSǎ1Q8tĉǎy:EGG)m\ BCCqҪx񢏏Odddu-[+/?!ŋ1ȄT_~q3g\aպgϞYfM>KKΝ;m4U)//w$ 86o۶n[_Žuu];"D"Q}}FXNzdoY|<=$Rppuѣʞ={?~<:,f]zbjhhNbw] YFBgBAқ2#L#)ϒdQQQop;؇bڵڴi.\ꫯFa^pqFsС޽{?~:?#*ΝȠ:_>b"سgZ=t;}#Ocҥ߿_~tO>m_3224 / bddd\t)##u*XbFFV;|ӌtn# )gijjM$)$%?&O?M\wqqqAAAMMMhhhccL& {ff&:R0%:t0v- fO iBiI!NLH<!') KH!7zmm7�� g�8�8XAiZ^_]]yE|? �&0� \  �-{D7�fY ׊P(֮]ϟ?@H|UAǬY|ɉ'ܶߐ!CN:uVXP(Fվ}^zA}eeĉ9NQQs=O?|A\\\\\\SSӳ>T*{챼gee : ^|vxDjj}֯_Y~$,Yܹs˖-+// iͿ#G0}O1rwy`0|ǴI+PTCZ~}~~c=P(}ٯj\\\||<!;z(D***dРAK.-**h4sΏ?xϞ=III!޽;++b=ӄ'OKK.m׮݊+V^apx1@oĉEn\.W(y! �MXjb̙JB*y</l&)>>qWu })**jhhP*N-b}[loDgϞ5LUm:Z[B&қBH2! Z !86Җf;R]] ON1 CE"LS:l9oXNhʾFa l;:K.Q6'1 4 Va/E&9&&*++!hω3`&ev"Hԯ_?z{xr[nV599O>Oзo_:X@ 66VRٳgouNQ^^!˝Z8???bF9yd0L||9sb1R*III ثW_]&=#Eh׮/ "(99\ndddbb"t%''_jj*d #<ҳgOX~=z@KX,~'ƌ;vݻ*l~zǎFqذat TѪD7!3>>?:t0}$hX8q"d>߭[޽{x\FDD : r'G|/СCbb\.gX_~K_ t޽W^0T8-0W^Kt[>穧ȉġChV+p%eeQnXL&`hj`hll4<lX,ɂCCCJess3d*sV3樮nQG"}'b!!&ɩTÇἙO?aVbKƸ\SXי*s¶h%<!|6PsW8-HNxPdd<AW-�i== 1vj28ղ+fA]S!Q`-�f47Zř3gBBBZG7>s?^R<E0ak׮žbX*|-y=rTOAWm R 5550BDŪuԀN[hhIBOPKp\.=.]YW^x;w;vlZZζN='@zN*ksjWHH_]]N='eݏe9<yndKSnnݺ?|ss3?pSWM 936tCa8/NON4c燩j#c={sTT(Q!\ٛpG:jҖ) @VBbAT*=<<0~q/1G(vӡÑ؉O!M)V-H$# ٹV#<W(ãccXB“x<gtTb4`>﨔 7bTWWVi5AM\RcB BHII j,˭rA,U**:qܹ3;w\OAh=Zp#]D?s|‘9*PNCB]`l0hIxG#9d29iB [6 E6N.!Ol8vXi =\k�D(kgQ` DR]zTׯɓ'rrvH$:t -ջ'mn:!W½bN؁-\.8Gr^v U--\ - cYK|E3�� �IDATkDn(|V۪֗Vf[m<HvIw:orz.촥>4;;cȀNC �Vw�a ]XntH>>>bonIG!RtTpP(t-S㣕HG( a#cqdG'Ht:5+怀 /A\h7.] Җ,<\.r�N)aU4‘Z,a243pG"yɄWH?|ʕLܵkW0BEsr%trZt9`ԺAϞ=JyѣC0LeeePPPKΓD"3N  άWۋ,KqqL&r<Z&y{{k4:L__ߪ*X,p8Fsι(FrNgXl7"bo\.+mnn%\c�m@J =+a"jHTVV{Z zyBY/ϗx{BDrC H$n6Nn}EG&Z*B,0cK%;\�)!kXPN|̹:&3t}٠P D"A~°{{D!0t^XoC0Ne9F|||Q`X, č\G. [nZ_``ӧtfQg{Gȷsx *6mtɷz+ >1C A --MVӺwN/zꩁ\rD>䓪*Ԛ0aBa}|6m䄦MoO>}}YBȧ~ g\{+V=%KTTT[^ܹs6lx' Fy>cDŋCǕ+WVZ5x;}g)SzAyWa!�^R$ى( ժv+dmg t:+,[ yFTjN|>ƄaQ?N0R#3'4" ZP1-(Rl6;AQc)9aH$o碍>:R?�6? >#e擾'h3(oAwΝ;ϟ?b̙z;w^?i N>s6]ܹ3}# .̚5kΝW\Yr'|2x?ӻ'4iҕ+WRRR|믿@iӦקh4W^y%??^RRR/_e˖׿ )))_}ٳ Ʃ~ΝtɁvu/u3fܹ377wգGϿ[)))G~^ @yyK/TYYb2^}K.M6KIIܹʕ+7m_\ w5}?%fxeB!-t/)o#hF;d4[iiSfD"Q^!zzW8wVXe2Yrrrrrrhhh~~>Uڳg{sϞ=0~Ĉ~ў7�ŋ-[FSN8Rqgtuɒ%[nݺu+%%%]?ѵk>#%455%$$$&&jڬ,AX,^n͛ .痜oxׯ_rk׮dxe:uzw[ 5kVAAxeee˖-KMMEޣ]tٺuE===Ϟ=p{iӦ9=^pႏOrrr```nnZ>s "k׮]zK.6^Ȇ qi2\t54jDYVFzTvonn6PCO! BX?;[ q}y kjj@r333sĉcƌIOO}@,)))ǏOOO7RSSAjWmC,O:a/\aCanhZ-\SS τoߞa-[^zٲe_|:RX[j#@T*J{e2L&[jƍ+=<<n5'BvZs^^^ֆ4Ϗͥl6i |ʹ#|թS'\9ESSdT':s766$Z]~ c}4r=@^.%QAzz01 R^^ZYWss3:HJ1a\7 l0hjj@/^e)ӯT*Q5%;rssv޽~z=zL&g}v֬Ys=rСC@MR<x>={ :t耡^Nrڵk\Ҿ}'Nر|x<ɓnjԴzꘘ. dɒ۷GuGڷo߾p L659ՃÇ]vÆ /_>v옣ʕ+zFFF#Ν{^z=裷:֭'X)L&i7�pUp*333cbbU~~~+9Vu4?d2?%m1.dp[8Notx"\LnH`1G^�ʡ5`"֩ɓݪ~ƎRXZhΝ[f͞={wqFױ'O&&&Θ1_ow9~xbbܹs322zرcgϞ} -,,t$󃃃O8SvkJ^cP;vZx,Xp _~F.**1cؙȢKRt>1bرAP@"vaaNJ4R%l={47a 55̙3I9"""==}iiiNΝ;wݻwϞ=&M-ϭXbذa+W*;A6nHJ'O:'ІaP ~8Ю~` pC3g S2qqqZCzuKV< BӕeO>YR{z{$J%0%HFBv 2Y9%x3 ״L|BȍÃBjjj0Tj4r[8%h C� vuw>6͑ayA _[jBfB h] V6 Ӎt((}||`#~ knf!?z(RkoqԨQqqq-u}&MڴiӺuz}RRҩS~^^ކ OE۹s9sqB۷={vĉr<==믿 JrԨQ}AaÆ>}>ؿII X><""b޼y:=Xnnu벳Ϯ]vݺu111 Z~ڵkשSD"ݽ8X<##ƍs0khh/d2YRRRii hƛoY^^9z肂u]paȐ!'N\zu zm<f]v,ZTu⦦/ڹ%qq{BBo9!qq\U!y=2GP8Z hM&V,9͍Iϯ Fp8 E]m-WwRH'b1AF Y&G# -}NA- R`Ohh@s?hpSqhz FbN`gĈpt}ytt4vb ggu:tߛ߶}JR՚۟x۷?;cfя?J?>ǣ3fѣU*՛o ^111>v!d̘1-aaa]̙3]O|||zzz^t B2ec=&ɠɎ^3*wٳg0#G9rdppyb10F!˽v0o)SRcРAڵgԩSzzzbb"W^5]\\;/0 3ygy&tNpƌZ{ҥ:ta_{5Xl6CBB,Y 6}aM:ޑ\HYY5_P|B@TPQfȭCY!!킂O�pȍ#eR(e#s\ooJqI ((ӍF2(n޼yŊ;vUmMpJw A2/--5 JsRd r.Ksr8ǃbH$bVmWxxxEE`QQQJgOqqq׮]7٩O>*,@SE/ʩDU b,lU 甗&fcl={Nx@uh9@a?A w˖-˗/:u*:RnÉpQR=y! v`ɬVkK}h u4BF6*h^sE�.=-\.ŐVzj6`0m@!xD`f3>:D{9;bbf9ZGi, zD˴Ӿ`#�l,// ;вX.ɰS J% wϕpޣG@$r 7'y\7i PBB™3g 2 riC1kjjck.Zl%!&ҥK.*lZ-2eJrwM_cc9ޗ^vǽh#47 3B;FPOEV+ދ^;⠯nc%!hF.Z*~(zyy~n%?Àjl6ۭvbc\.W(4'NXZFˑ Q^^۹\.waO|.mq ?Xp&t:]UeRݻm'G%%\rtEGG_|dlj;00YVB@rAAA NX8pCn⨨Z A߮dYN} "xE/;Pn9x?!Dt1B!~h :,Nez`_9<Z`qp+ẕpxyyuqbH$N wT:n;۷!!!&UxȖt@@ɢʎ7((ōt̊1LN-&;X"EDǎ%0Е#r8GǚbaH$ &566bz.] D;͸vB,`֫Wbx!fL=(gԃa,%܇[֖p\nNN>[j5D-Gddd]]RIRV<%`P(J8( 6M3t'"J S[  Y,!D.Yր?E qxpO8V½pKwhd2VXQ|~{XfX,6!zj5{z?>((w<ŅB!]۝ӽkkk_rBU@xʵqB%˗/|Bq)RrfXOp=<z"nnX,;ڞk݅b"!j-1߄B(,h4FTjڶV8~LBXJǧ-\5w ,+ � [eRm :cXl^ϾǏo2[!Z=~X Y+tl6dX08FsX,:'%%1L4Bf!nPsb^HrhX`VŚHd٦No<TV2d,ZHV=oW^CΟ??22'='Owlnn3g|9r$:._24-"ݻw0w߽uBaa?qDؒ^QQ駟޻~|>ڵv_k[neOF333VSdBQ8w޹'<BJɺ "K0Z͞ v C0^m~&J>STTTQQQS`*VTo\.i%]{'&\׮ HWL&z8l6 ?XVb)33l`ZtѩqBwP&;/m0 R;5Nhh mf٩$<!PUNKq|Pfh˛۷o.~Wo9|öo.\[;K0UUU|fKMMMMM2eʾ}RSScccWXW_N0̙3iii[l٧~ }ŋ:oz{{fff>M}}7|C<xiΝ;={|Muuѣ'֭݋AIII_SSSCCC/^jժk4hܸq7n|7=`\r=<zD"!𯺺jnX!<P83ƌh\8UUU p6k4Z̖;38:t`'+HhސwZWxqiSn6ح8v؊+6lؐ7|\g 7�ҥK +W\~}BB(:̟?DuJ[l!{]parr28^zuƌ>+@OK.9s$%%VUU-6O>-Hڷo_RRRQQܜгgOV JڵKJJdtOGNV\k׮/2ŝ{طo߾yŋ?IIIȱ{Сs 0�۽{O>dСv|ODIIIeeeeee#[geeUWWFDD$%%yxx={ ,(χxjT.XB6ۯC ( B\.lX8cpfk|`0t%<<^:vH!-YVm|b!pz~]z(uZ9i>`ܹ?ɓ믿L)S <wMKK?1|]8qbذaIII>>>iiiF 6,33իϟ7nχpG`de~˪":r-6֖lڕD.DSZ ,\$zccc`2jjj\_۷dZjѣ>c4A" `^_UUjl=%j&飏>OzST*0,.V+**ORf{q8-TUBH͞26@!ꙅPLKmioĜlt8$$ V+Ndr]lՋV2;[yN45fsr8oZDaАcFfa ju Ά')Uxbyy9!!;{յRQQ{h,MQh&ƈb FcGPA{Y`|8︻T)kϏ?i{Ν{=Dy/^ �<}1p<11Eѵk׾ or82,!$jHJJ |L&GEEMMMsoc\DZ|9q4;P(P(HVz$iJҧ"O΋P(&LhhhozJD̘1J5BFQQQ^^^FF`S8\�� �IDAT)S͛4l0q?c׮]TݿMVV͛7ydEEE/^Ȱ߿BpBrrW_}E<&\8p޽_5*ULVT*0La'~+ )}AL Q'޼]C"N~~> T<8tjh~>Wǁa܊ dJSSq`Myv@| ;3v'ڵP@| p} Ji%ޭ ADL7sjeee6lHJJ277oyR>#�{T8#P��0&5J={6BRSѯB BܿH$`r7m۶%&&{}�`ɀ=* :~'}8N"bԩYYY_={KJJB!.6XTTe˖m۶ݹs6ϟdg�E$P*GXJ Kys@0Z C8dP(nnn8ID7�Tajlllh4ZAAF$!$2v.(2Ez:?/ͭF(<rkow͞={РA\"A:L>{lMMםrs ƦM66��K=y2MKS_ف?ܹs[m6bĈ;v(8bV5--_~Whw}3fࢂᆦ^矫W޷oջwo"RSS�ϟ0aBbb" }aaa#њ0DSӉ&865ō1$ 1L`0\nUUU["5rǏT*Jm�ϯP�Shhhh 0L177A;;; 񪪪޲$o.J.7"cJi@:[{ o�; f.X?_5zJŷMLLJ<3;!G'1}^~]$|2eJzzSp[ݻ6lh _}|09Ol8ӧHA);;*®O?=~U8֥_~"hϞ=}Yff޽{={6rH ٳgw{ݻ?�?s̳gΝ{̙{&''ۗ`$%%:tj3O>yD"3gN+rJUUUMMܹsgggZrժU�Ρ!8ùs;v ~Ge<oB000011ðYfc|"RAjH\]-x"E t=.6�K,8A Z�/_ S}N7y[@ LK)xoQĪ{=|H <=KmlZx@[#D{7IL;$Jӌ@Hd%&h4*'''kkkXTJR%zn#z3p@�YnLLÀbcc!%KlllH$Rlll||L&UK.666mWW|baѷ-.m!m111D۹bŊNLto|\.777=}4aG]jTθ3 6l`kka 8p@ 111p0mܹzh Z �/_`Ѱ0333^v-CL2ӓ�0ٳgÐ? 111f�޹sðϚ59r.Q(==LTJ1՟.!Lg+�zkkkA4H`u ~ rߏܦ^n>_]emm]1iX, ʲzظwoi3tqBdҥp;v,~p{555wHH۷ϟaCbYYX Z^jj>bmm?_pW^��DGGkϺ</]lp-\P#pvO8Qcw>Z֞,32 b0 `�:P(UT\kl" b5˥P(A4 8 t钃C^^EdH$4D[3x1?? Q333//˗/wJkk=P޾faX,-[?իW˗/&Qnq3Fmiܻ0 B\[().BRiOzzSnT*ÚjJ �R*=gTW/\?W# N RLfii؈/X,GGG~eTUUiիWeeT*B%]m.|ƛA Ե?I -"0YBA诗y4 -F WgDVr|?|@\=d2H$(FI]bI[ݕxC+**: 5>>8 !ev'6sL|X pދ ||�K iiolb^`kI&f8bkj KRaffJDf0'"ե\ `/I===<x�{3gδDTզ+//naaJD9kֶӜq".u <ѱĄ[DzN8uJ(9 |V aFl#&L0 Hrr;x�)T*555).WN5 m*z<177ں;{npuB;�@&KUһ"\"硨8F�߰DQ_~p,ߖ1�d2---sss--- >!NW(y gNj5r ff dR455N(655u碔A;L@Ti8WaR ;#XN( �0B1L Dbeenh˗666 73}#nM,Cvh4Nh0'7L$RholJҤR��M6�LF�&CE&79du &p?AL%R(؊H$m51-p\4B.>F"i@ <S`!!ݹ攖;ݯ;011". Yi aXEQh��0c`2o++ںngV,x().)��L7coz;yٞǍ&Ns5q#+JY_E" <FÝոK/WJpK\p8JOOW>٤*:tP'/8Zv9k Z~Brs svV7ӠkPvW^:7HNd2E_(J � %թT. Cvv\.؋kddTSSRPrb^ DlEE"˥R555]<I`I>3S#ݻ@.<:(9] nY 711Q.�L&sܚ{2}'Hɲ*1X,SSSh0ptn 41?!`0x'^#ӨT*#u /6O#XZ>ETg0/^ `jZbC"?8)ȳgȯII@ԡXP(͢@ XB:Il/ T**P8`XaD_VVֲƦUTTi�$v J*--ŵ!,--+**,--qx j?T +aj:N27M#nq2$Zs!C�JR7GZ* &gWDKMgh4I9-- & ��:hMMM859,*?l%%\rssn:tPcCy�$=a!!"c]nF;2eJXXػҿ|`Æ ڇ/^ Z```TT�ᅦ&l6'&&:tf(mOSS[-ZoxSiܹnC:�KXss2(@ �6mûpI&xZ3wAF΃`jjZ]]D *3vBOW>%I$(b߹sJekk[\\܁%.([^]]mccJ$<%(/3HA#U6HDE|N 1B)'*$ OH"9WAw+ܾy&wն=07- xa$ �׺d2ٳgitIou,Jrĉ"ٳg&&&IDG␼<Oud$6`�`p0ao߾}vw8}gwuuu6NϿz#GRRRmF"b7|zjWWשS*ʹs~'5k͛ͺkraشi=zt5E,ɓ>>>ze~۷XW(?2m۶422RR9/:t ֬Y3s'N̜9SPl޼?i4.Eee2W P&shSEBd2PcXLv=�̛3'd2ա hpm7ċQ]]ݱ`>3sJxzeee= @@e3gVUU=~i||<܆JJ?o"H]vXBg<Aw@^QGGcGeR(@y9hj b>GFF[4>t^#^PP�|~-~hvᣏ>ڵkWsYIII$)((ݽիW/_ RT)))uuu999666AAA&&&W!??ѣGk׮}@ >m棏># x{{ȷ|ʾ}!]__߿\*//!((>~X.'''x {{V'%oJЀpU"eSiq8iZFٓl��<ɶju8!Y 4~m *uiP'n\iii ;sTj(J%U r?*ZYYŋ!CH$E'MsEqBϟL4 AׯZjҤI׮]PT?%K Ʋe٢˫WkjZ=s&;^\FEQ=k6|8PǍ7ܹ~8zh``{ppΝ;̙3{u-[lܸqo~̙3_~?/~iN 6&2윓_63z+WرK.]teݻwqb -[|˗Ϟ={}3?c2O>4>GȅB�JܼQF�dQ`AFF%%:GB��.]YYKoٹ5֯X FU*UpppZZ2\<y ?BfKН`ddT*[%H?M*#HCa\_hlH$oҪY 9tyػw)x#TcJqJ5_~d2 %Zh,^^^'D"ѣGN???S8L&}x= B@&qΒmZ^rrrZM h8eff2�k7nHҢF|% .2Lfd2$uojjP(eeeuuu q+' UU0dsr:ًj+PR,,�"H{`�芑JN%M_J*Tl6NCj m:jċ/JKKLNe2Jݺu˗/PcccYYL&mˡT*322T*ͦhMMWVzCL/6Hd"W$KX,?xЂuD7o$wuuMOO]lxDQ\\LP޽arT*Jrx ! �hoy�\PS��tz`ST OcҾxHw5$g| NJ(4մoK Sc:;%OhԧOk׮N'�#GLLLd2m޼ͭI1� ((H£9yC6 IL$5!Q(Zyx`FF�B60Cmx\.wwwٹ]_ ݩ{J.h^} k &pfaaа=<v%\(JR:q䭎|~CCFxuui{m[cD"Qڂr3CC Rx3;z͡zʕF:z͛wі3gݻ׷oV.+C/]'XR Z{͘=p.^`ymڴCosŊuuugΜ/|I '%% ޝ={ʕ+p߅9d-,B&DRVV27oΆG  h/(JqA;0iL&=wڌ>Dbx1kspʋͰىT*mhhVYDQҐJ-%% q@&FFFD%L&w`~U&m+m͞:ujZZZ\\}9sL k޼yKOOƍ{HJ RSرRe\\]]]={VgϞmeeɓ' i8vO?tݻwŽx- @*^vɓ<R3f̰ MJJ{ԩSz0x( GGǐ>|'<<Hߝ x"��=z`7>ݻGr<oҤI...AAAD[5k֬;wݹs'((]tzc�|>8xJ& F0`�GSt.w5oDD" U:jx7c)b ˅E\hCTLHFFFxn'49Qijjz-&q nwj8Y� &BXh. n�Æ 8p`zz+|`(w�4i_|=""B;666R'_c0++@Gaaa>>>p_K.�M6aj P> W_3njV\bT*˸q D437n7o|.艝9s)Sk!::%ᶕ 0-&&͛C}ɫWPE9sDDDtCJs CQTxxxz{{r3g΄5ϟ?sLsQ�@pp{.7W92l5 BZhՎqN//-[l8t&* @Z R\ A#i4ݽ{#=zdkkkmm/y)S:w &3fڴi/_nc&Vrrŋ3fИ<y222R'1ŧ&'N<wd}CCJ0&QmAÄwݫd@7|ڵKOOHhf@s dֆS!C Ճ]vP5t'LLL>s�Pz333+q3*Ct%܎徍߬ۉ`0N@t2;vRXoW07` h0U:}1T0m`"-:_WWG$g4� 0nCiinT* 0� 0'gN&&&멸^Xhsa&Hd~z8R)˩TjEbȑ%IMMòRT\xpr TL�� �IDAT}�Գן 2%*Gq}? ((ڃ7Ry@EyKNǍ7I$DGQQQQ^^F&݃k׮ 4ǛS%DDK( Eױ.u L&C=��BJCFݙL&L= H=`fgNXU<[g l^6ojjU&i`rvz8`}cc#.#α#$֓D"F` � 0�CG1 }6T*-++A�@VVVyy'O(_eeeFFc»/_u 9zHOOඈ"߿(㜝| Г[nq8ooo=t^zZ�0//O>|>>|V{xFDDyԸ8]Ə_XXxĉӧO�Ǐԩ)Ϗ9vCrr%K#G蹠\dd$ q޽#Gc۶mǏГ?eed=W9Ҳп Ǐw^˧͛7/22gNǎ(ʰa|}}ϝ;G$T{ʺ|rff&�D"EGG�rrr.\`0JJJ.\��sNXXk'… 999gxGquu533~ 666'N|ݻwGr!Lp„b=ɓ ?MMMO???T/]޽{NNNPpя=`2χ�L>;eeeX[[{xxS(#G{zzt޹s'99/LKJJ~wgĈPCeȑfffϟ?/..P(+�;((k/^��h4yyextʔ)RtpFs" ͶgB5ׯ툈>'Ν;7p@ٳg7o6lXvvvAAy~gxoN 𐥥e~<<<�p9sLuuuVV̙3MLL:&bfϞuҥ oodōGgOR+UVVdE_zFrrrǎӧ˽ѣFВ4d\QXr0 k9133ŋ(9~ٲezDϞ=:x`\\\pppffcu**jO8Q%-_xqݺu\.t˖-jzJ|E>}:s[n 2Դbl777hq,[l### gΜ Âׯ_p7ݻeׯ ݻwTTԕ+WVXxb@+FP-j0]~h 0a~'T@ عsD"Z|9Lf2gΜ>#1114]իWNNNGMKK2dH9"H$ՋBjR8؈aXAAl3NOt+WjP6rEss~.]u떯Cm6hР͛'Nr e2ᤥ8qֶ%$H-ܹs֭ƛ6m"H|>͚5...ǏɠAbcc׀O:uJ(&%%eee}۶m;z'OP7,H$oN>~zKKK##̮],,,׬YSXX<x>|^zA@r9 T*?\fM^^ɓ'O>]]]}С~1))髯qƎ;***>#3͛7X,XbŊ&yaÆWWW')Jj[0aBFFƂ _'B??O?Ë/s9;w\p{/7''ΎFZЍq-DrFWWիW'%%;wݻ<zJ5jTdddjj*J|{*D")++sqq-)QȤㇷۭ7uT&b&O}СCl6;:::<<<--ǝka';vh2|K.yzz3FXZZ1�  ;$/ W`hBBB}}… #""^>|~!',:00pʔ)[6F'Ofሦ~'|f͚hu!(//vww?Abq||Wnܸmoo߶ *Caaaiii,�T"|7"(!!9::ʕ+EEEǎS&Lxbr劯ott4 Ν>|ӧO>}ڹ%LLL̜:uj\\;lN;w3f J :thrr21sСC&&&Ǐ;=͛SL޳g[ m&??͛𐝝]||<̳(--=x`[ŵkצNzDGG&''_v0""B{vբ D?6mo驐|Mii;=?cvv-[9v옍Mttƍ͛gll O>dÆ ]4mrrrp8>{l޽aq 17nLƱUUUG ڵky<^cc#QDo߾F; ~~~|>ҥKR˃ {.'W(:99۷Hі[tss�ݻ>o*w^d0>w!&9x3gt]$&&رcz(p±c~gv7nG7k.}A~~ѣa .^ ]\\~|㏗-[>rSxxx.Eݾ}<|jĈDv �E"Ѵi &ME8pˣGg`oo{ͩUٳnwO_)%B)..aaaaaa9Rg8-Ӂo߾~5؉/>|m۶Yj'N {ԩS,Y}ZhhZ>qٳgׯ_q $[).L��ggg|fjjJ֬YN޾}�#%%D"tO[MvOPO< :t:B1c̟?D"1 \yf|B2?~ĤR(jjjZ__?x;w�6n8v &o2dHppݻ5bTr|>0e7Lf0L&[nȑ]1'.++2eX,RjiӦ}ݻ\$(b H$d&EE"QSSlNlbggu*ZWW߈L&D EEEd2.Mh4T/eq8x֭[Æ 9(&8ydb J%3Z8 p8wJNN =q,|ccAt>Wcc#0HߺuΝ;W^-...))9} V*"h׮]NNNϟ5kV^ٳg Nѥ@Qdh4>ߏ1"++xɓ'w!˙L vdl6[(rPH=z8|p�@ttŋ;^>sTa8t�_]fҥK.\xy* Cƌk׮]vmذsc!nܸ1zhebb" 9N||ɓ}ܸq۶mΎfX,[[[;;.E;;;Rtǎ;v8{WX! !EU-[/�zNNN{ްaüyVZlٲXP# p8B'FFF[nݺu+Nyٳg-Z?xPg…_~w}' L&ÕNX·Q׉իW744|p 8aÆWŽÇ>|ѣm7HP?~<bXO?t̙nrʕ+�0֑f\ەݰaݻuV\zU g B|AѣGAAA*`w�P(K.={,\[ڊ+ <yիx#ty[`A\@ `2fffNNNp8۷oO>ӦMx?3}]vuz}d277'OXxhʔ)'O<v옗WkcáEu4yVC Qx%h0A0{{'NL6L&hXoo# ř3g&MDRSɓ&MP( {HFaaaQQQ@@�T(L%'ͩ-%R\ ^zj\7r!bV0mLJL&[XX 8&t"򪪪L\..kРAfej 55uРAg~UuuuJJʨQ.>9w?IT[0gN:Y`lzj,, 1 `ݻuŋXCDВ[iꂵ5 � x0w\EssskkkWZb C ̖/_޿.7Nm3>L( <T`;N'7tqzɠ@[ ss]2n`&'---77��0,@edL.M!Ğ bO^^^JJ^*<@dB]RRRIIIw4t[xǾ (wL]]ݥyRz>Pʍϟ( ڒqdvvv($ L.%%Rd2:^PlI+JhzX6 P(hPBې?v*ǛS%p8YB~daaaffa��."H<jɄ=@)d ,AR�FVVO<Gj|BTgwܝ$ȥhc"u[ϊ%%BI#ҳ f{[?>77SjjjVV4̚Q�HxVZZxP(X $R `2 Оp8 dLEY$fHb1dr=R�FE!I555OȨe|y{ IT*xW(p B" *\Sz 8h8�xfd{FFÇ!iiHF fa1sq<^đìiH'^=3{ԩqƑH$X_ׯ ðͧ0>} �Jrw.]4`�cccZݳm-!H._ Y d2T*}'}#G2w_|YSS up[1NS*Az:#$9Z!x;{;V=n69`Y 0 � ##R)<JaHEJd;6� 0eH$ E`C`<q@77lP4`;l8ַճgdfcE0BR^<z^455EEEA)ʕ+5Z>SEvZTT۷eEGGC^DFff>mQQQm=rɓӧOw?#**ٳg7^^^SMo̦MdX;ltl9��`C#UUv(SpF ޓ'OzHyyy z"""RSS-[ ȢEϟ_TTe?~EڨpM6wѢEw}eee  �4!!ѣGV̭[$@p pEח1+K^S[VVr'Nx{{>}zҥ0ڵkN6m/^~zgϞ>vXO 33{ƍĝaaaP� LeOMMߔd7O>Y~}CCCNN?OOO�\*`ٹs~X]]}ooo\sdKT\\\VV& i4Ǐ{x{{gdd��***駟 3f̀{fϞ �߿?�`ٲev݀"ɓ'=χ{[ ܱc'OƎ6� �`֭JevvW_}�زewZZ�7""5A &`c ^-/0LR:t eɒ%0n̘1K.-///// ]III˖-{%K=ݻNNN\w:;;}3fL7j111se0pԩS�",,ŋu])))>|xhhl8qbYX_[ԩSuuurppbDѣG޳gl3+--e3fX|9ٷo߽{={VSS3q5kF{\\ܶmۜ ~^pk׮j<u\.󋊊:p@FFƮ]k,T*:}Ç7mdbbrȑׯgdd־{ gӦM~ɓ2d&???,,` Ү60nܸyذaT*믿Gׯ_RTZ]] :WSC@џwssw0+VM0AV`&GaÆ;v<y222233|}}"""󛚚rydwAP Ed?JT*okkaL&둯kӦMd2X X___P(z琔r9sddd;vΜ9ݼ8r>}nݺ:6}v9YXXS7nl޼YOJK.}I$|0.??ZT*}]vʟH$pCRnOd( 7N.cFi4,!,9B(xŝ;wfpBD*:tĉ%@x$!`z(@Brd?!!!Vݽ{7 quu�X[[fffjw5sq'''[0@CBBB:] ]R<q=== [=&L?255uܹ"no+ wT d2$%ъA*+fJJ ޹oԩS3f̀+F2eʞ={RRRvѹՕx_=nܸ5j,w.]77Θ1Ò)Bcc˽Jʈʕ+Ǐ?|ȑ#SRRڥpvvNHHعs3bcc_|/+D\x%ǏǴhuebFFFӧOONNŐ4gNHQx=CˑǏ1_0 !ۨQSs7'Gh቉G133o׭[O/\#:<<F{{{Çm${,455]z5%%%$$=`ѣG}?s � ??߾}L&sƌ=uqӧ?{lW^oH̜<yr7h4ٳܹ{nL֯_sH`sJNN<x{6nX\\`gg7b//sν|R$}=~ݻw'z?Wv�� �IDAT%%UWW?>%%eL&3""ɓ'׮] pww?}ywris^vmolltss4iRjj}bQlll|||.^XZZZSS`}0NHMMMNNn͸GFF.]444/6lXmmm:!犚dŒIMMMZܼR  H&C$j; A_t/!!!�޽{BQF͝;^蘜7j(|)͚Fd2hby<B!cƌ�ߟ<⌌ WWW2LPE" ĉ3gN߾};P bh׵FFF3f̨>}L%KJJJBCC0vA,;::Bvh4@>p{=???F&]\\͛1+kmm`0:VQ!!!AAAxXx1Y=mB(;20x`7lذ}ٳ˖-CQtܹM8qرvvv(䠠˗wZT|ՕD"!ҮBYYYX,__ <Nd[[Yfxxx|@,,,BBBYYYΰkW(Khooeaaa?~IlllB!\ \|9B177 dLmmD"P(*]Mf[h3 033<xP({_dI~~~mJ:;;{uC]"(dÑ գ[1 &) T+OMEEa..@"AN P(��eJoT׆ F 4(==m Oƍw5t +/zF1%~rǁt‰_qBWZGG!C:uˏ؄wdCįL&F%8Ň94j &L@>aУG2 w`yy@�WBPLTv/_~)س'77ѣm)͙3g֯_?}t``o<'.4I<x>x�rsAq1H$`j0٪^s ի-:xg|}S6wFFF)))s`f��t:ppTS�srQ?�x4kׯr83*P7ԃd fP5.z_W*=R�ð#('ĿWZي6-JߕG]Rb1,}Ѭqp8\.ruB JJJzA jkk>|#�ߥRiO@fff |ROB` aMMM=[Qf:bVXX䰳lEv8Vm2{w[L klK` f֫} 0� ~1Aqw^od/^��8J9;;Ò . �h!L$jgƦTn?TX,.++뺒#beeU\\ ! ėE&|v|gER[׷hYPUUU'ft MLLR@ rUUUulmmoIEEsrr7Dq*++uV-..�Zf0eeeِVܴ T*uGh.`&r1 /**ӧOMM IlT)uVVV555-/RTUT*;055ոL&x<\N/_<Eњv~ueeB022ڍN;99ij\d2q B6N\.IRQT@j7jff񊊊\ncccpX,BpyX,RMMMmwXYYh4E!AuuujjκϘ766Qt=3`iiYWW,D={`0"""ZXG<Wd0VVVNDP]rBabb;ccc( P(|19BİJ 4a:-jBGPxzzr\KKKA {{m:JR qyKˤT*N"`%!R puu555_1d ^Vb1S:::B%BL?!\.WT666"#xjOP(*h ((/*ګWjwRWW]2 2X,9-(ZUUevvvMMMJH$R)trttԶ[(|X]]]VV�|_p̹~X�hMLLvHl3:m'EQggg8`255eXN:|>``{T*1>1H_JޫW/.AC*O{ڪ .1 k. A>}՝_d2CPzU*LMMQMMM}DkB=*xMl &#Av�.㯘k׭X,nhhݻ77ix6oJ_!U/^pppi,KgVaJR#Zb!P(3Pg7*.+ŅFmDR^^.}\UUՋ/t2՗E&{H{^YY\ee9ljjXn�aD".v?-,,௰4p^Fk5SVz nյkZfKMc--GkmsIO566d2 +76`KcL6 n+":Ҫt'8%o~2Q/lmF BA,--G$7$H'"(Q F * .ADG0ş:X$4޽{ØlÛ;L&QSٙdjT#!gggh `P(ӓ(QP(E!/X B2(,Uo *6ݢ`<o9l{;\[vO-C[ZuE~mA2LzͶ$]QOo/;KYիW`#,Xp[#V8T{Zk )5vrr"vv:\pЪX |=4?ѭW d2Yvv6DADbY[[kϙsrrVā3^666=~UYYDjnjbiiR*Č* ?'$ K#Ι0d±<ax9 Fjj*��mffB !-l}Wb877?ŋj*,,, l5T':H$Nqb;Mystt*2lmmZ(:99b6ݯ_?SSSkkkD=VȎJuwwǿ6q74 9EEEp<d2- 񴥲1 D^Xw@# Gu O>oSɩt`#F{cDTaoXB~p7s͉fP˛N622r `0Zqכ)-J555'0AÝ"!<ڻ7%2#-rߗʭ{Ә@s�E�ɢe� e hs .tW2rHoX2*u4UdDܸs=|绩OVՑ(p8\%b;r96T*eXdYzP(8N\0eY:ujr\Nry}}bd2$`[Tf٬n[pZ@vk,˂ fUU{YAV :IC2fFɄhtqqQjnw6INf?#dQM$rҶNs\R'IZF.6 O|~Q}>|>gtD 6.KݎT]l6rjZVϏ^(fVEQTAҌ-K&i٧K:K-{M2/bcNV!Smk$MSuzgX$Ib-Lkg%IbI "(bSͻzXf!RXH$\.m6t:gjn)x<NKh4H#+a>A֤'\b>;.R&1& bl\.CR4L|4)gZ~/R(0$ &)x<p]]Δ&fa%BSlUSMIR,?{LޥـJ(Ac-}!I Uj t:e>}qA1!iFfj\j%(\b-f}+l6epu qdr}}vG #}3ű;NөVJ{$ɝ-],~QlTVp1rg&P-;;;_׿sR|>͆$1IX,TnjU(AY0tݒ$ϟNsz~'ݎ{P^^N &DQdyܻݮ0 Z٬cݹ솁glLm6`P.Yٰn?~xc& }-0QƹL߸AzlH5<&b:6<ZXNiY8E40pxF2ܜTRb7u6M v X,c :1єq#v骮"YI"xT{^/ >& D/..2ΑV/|>Ob~ -KuRס=o$ߊi`p� :5,݀~.ɲZw : IZ&fϞ=Z_!C tuu&h5D`mdq#J}B:"ϠX̻adY~FӉW*U94tz:j\=j!]$eb\Alݯ~n WFa|()!lF?fFNHN3I:KH<rVu~~3+\oQ 7#AF aZrr{{{ۃ H8~g={klrw(Gi3P|>o(U^Vp8l ]__W*VFN&./۱nB^Vs.s:|^H$B+ mK Z)-,27}x<f;vӦ4o 6Di_bFLuuդZtZ.D#FT kH(:Z7Jfjn=+2iZR(8 h0>!"LB^%D"n;Lmn F+gf jV+aw \jPA 4hn],GM&`0Jb ?ObX|%B/,MHQϋŢjjf,˻jv'?A͈O`P(`TB`>0*KҚd_ |h4vT/v"89|*&f2$_f39E1NsǶZ|~p)QJ8M*dvFػbX.�8s⤳RJ` Ɉ`sMuGn<oۓej!;n\�a2L;iP&Yժ[yoNE6h4ɲ\.f1HL& n/ƍn�U7hZ,MV�r)AnDMTml6 \.,f;dT*@ �(n>jR)[ ;;;4 ҚĆgvvvf8F{W"(vlVO?Z~Y0Z~-\m t: GGGryZnGQn7YP xz΂ݠs$JXkH Ah^o,c7Z0od<wQdZnˮb0a*`}r MȪ]N� Lv}}}! *t:-r_WU&$ducqá c<n_bYRVp{~-ߒNX.4_.+ K|eWA%QY7pe*JsoPX.AX6Eڽ jxhiSX|9u޽~u.ڊb�3Ht:EQ-6,w]Mlxx<&w(rZ)ݡp`0jfժb) 8NS Ro|PdݰZ,Va<z=z#¢$0{a5jj$IGGGш+jj% <t8=A,'S> 3w%Nm!}\{pBrTOc)"ul.FTh4rXˍN0׹d2r9 M1dPK7ڢ8cb7 7 @*qR5L&#B6_  f?ϯٜHeY6L!py$^ofLgdJ%._s:/G̀"}%YVn{L&Y\ڰ߲! 6/ӹX,DQ\.pr쩲ëՊ`k;*DE0<@  ݻG**J{{{ht8>Q5( n+BTCp5$v /3Gjr,;;;/_+.i: Qg$!3HBãz6*qZq$9<<Bl!D˲+HX,-?9mEF6CT`v?\Be>{^UTnBH6ٌ" d<CT<Ͻ{!v5n<LB{BY,V-UBYϭNXqy<:Bf�Id8X,3:^7Lv%:7R&}I/PhfVxK7zgd6_ aZ)}#0͌U`9iKCɽN)[^R) `'�Gkm+XkrH:2ԙ^7#}c7N+ G iٷZ-r.//+j}g3Bld(YvV֒?{l>?yַupp >*^*<ARɌನ$U*.lZ}>HoԺfw$NS5tKV`uj)y}`O{jdEܔ+di@p[;@1$:YWr)|RVe0('O[N^Ǟ}||nx, B:}f/ekV%7LK~0d>[NeiZ}2 [,&/3mtv@gDaspX+HRi.K W\nfs4UP^;' ".壐__FRNSR/ ÍFgSLx< 2 ~< kA i+dIf<O8cr_Mͱ bc\3ꇾۇ}~vv7ͱXh4 N)RNWӉoX\.ilP(9F�� �IDAT@x�+<9Ajub_yW iJ&a`T(cvZ&zE!?YuXP( P[$IZ7ʶNM,K2%d4x^L6+ <9Yo&sifUa6Ljٌ䫲X_?|^ ȜvAiaFQx~۔Vm°hNV5ɌF#2A$�$I|87G}z?ǏQDZu9 F܉"Hr\U@J H;;;S Lv`H,p�;b耯X,VsǛfE@)95l6[.%IŰzf=aw !i$oZ:A7ݮm6G 8&6MUq;ƑJ Uɞm@ǃ Px'URb7YH?ϐF1\f( DxkY5~W?fl 2LqPjlIo�O7,++;~qH,>2›�.h4[o{ݿz#uyD'&u:~$|ϱݮI{h.Y9$rMsextco:{OB pp^jUTTaf 9>= p8l2#ط+6NwwwKx<n6Th{bjx~4t: „u.j5"4\ x<@D#/Z$>8d$R} TBG,ԙ[>c&?B</72ddzٿp2jb0Lwvv0˯Lr\cLoVYK$kEҖaM$JAY�d2TP(b1Y>|>G7LT%Rb`x<^V* v)c9^wgg?^;GGG(4A&ӫt/<= vMY w 80'cKE�!t$ Q|~rrZoB4\X`IC5 %O#0{j KB0UeF<0ͳ :: "tx<Nd2U2{q~+CY`jTWw\F;v8hU︺y:-Nke?hh nZɕJ<rB!TJL&PA<zHUji'n=>gWF/fn2].b1\,�7'9[3{Un_+ "k74*i.Y7s%V,<5H"ϷU3z[[[@�TVŋ @@!Et) q7*9M&T8vZ$AHp8D"yuuuyyYK$ (^.X,k<2f(h6ͦ2R5{ltQ3 ޅ?sτj(Mp7v>lD/bt:mvwwژIez̬f@ OBG{mԪn< Z}VBRAtߜ_pr^mN?Nhřp\Txn:,Eݭ�ԒT*㍄% Z[% iGS$7M(ZK 3U0T*llT*T�X;`J`ԸB( JXnRv{{$(!F]$m9 PŇH|>򗿌@ `iwj! 4 nW$`W2ވ\.OfG6  󍠬JqR�Wkmp%HXW,K&x>~ RT,Cpu�kMZ+ZQ4wY o �Tk]J5v]en3 R ots%ny9d:0`|`B x"rbUCt:-"GMLTJ Vh|�TEQȨ$ID2!%շ`D*?|WWW5ȹ7}Tɽ{b+j@HLg2>nONN@)\f<6 iodYD"=bQ<6]}l6QG<޽{z>a}G_Mj,d:<<lZ`0 + EkdQ_!X*z�[o(d8z-LHٿMbUj#uSjk_WzxxH$~E߿z�D")*bơf08e�FmZo*H+DHVV~TPpSSC mN('gQͣZPo{E%v9hܷ3;nL]YW+EQ% 6CKjx<6)�F~B{Zѣl~:ӌک O>$P(s&Nb~jZvnKR?3?:rp2TRJR^w}.Q?!v; P$6nejw!/kZ9Nh4h6$:[C0^md} fإʆ窿w8fW׋FU$%0n Ō p ;(81\N$} vQ}E.pƒ$)HD|>jZl6n>@OeYDk\6mrȷT,1Ykk$;NF"~~I-HY?Nxp6ShD~Q~}k+rRP("˱ \&IڬVT^]]}>FxǓDqy2\\\|fl6oa6~%Js9==oX:c9<<|YZf~ӧO?E}姟~:?CVFLx<;;;8Kɓ'؏J'eR)ԉE1ぉD]x<~Kl BeӧH$1KVî|[L~qf@vŇB!In�p W:fd4AGyݦr',VYDd2h4yZя~D[ϔ$)L/EgfL[۞<y푱XL�_x8WJ+ɩ˕`$^tyOAen fsb>|4z>/VN ePh<;H$T(}ڦZ�k])q.As߅LQn\BT*dL&NG"S,r  ٹhHOh4zEQlO<)WWW x|8XMp 0POW*KR* ^pB"LNSjB(~@.SLK'p:?YIn[+=8 .ٻ bYG.'OSpnF#c+L&~߿L&6Er`W„ lB!<LbٙbᐶZ vphV _rt:c@2IZ|qOt[VzU 7]?KH-HiЌnooGҖ NdK6@#/.. 2F`]:<fPdO c:k,;;;pш8V\eT. wyy)rZE u4nT(&1B{L ?hZ*LZ! ;`:qb! .QQn7ݹ1YA2h$_ƎlN<Wyfy^հzm9 #k=vv D2>|p?CBitzqqH$dY搶H;RztNf_U/dGmTV]3]{Z£쇓 ;qSy[%Aʀ{8NV#9YUbģb9_S; t:vwd]yGi6 %Tgd5Uz ٙ,Nz J9dYUJ%L^\\^xY =:.)VLp8X+e3;(zMt`;WH[A 7A:1t b %#$1Fd2\5i#l^n*ӹe2pp|G//n7JnH&I&U/1KJOը3o[�½]d"3qRsB8˥w[_j/fjկcclZ?*wKPvFQ8s*oXM7h@+Rٽl Ng5t:Œöӟ?F#̖kbVڲZ]Z$Avz)<xAYe歭-$c$d8p쒚C)XEa{{;Ӌ:Н4PٌAEnshv]&Ǻ $8VSrwxHйqU@A/IkSz'PJ$&tlCv`Ljl)PYz~Svsv::1 gTS<4}J0$D( !;2) Zk {}B'.W+nLux<:`ZV>5aK$Z^_OjP(d2.K(Pck6?Ϊ.H$zq($X,۩qbcdܪCP l6FfKӪHx<w|Rd6///}>ߗBtj`DuNL&EQT@7&3*M=UqbIZ*llzإH2lW&RVtep8Bs״d*(JS*֣ufT!\!I]б^](--I㖛H$٩dWqZf_}sbA6Osf8HLRYߩ(/OM>7 }vyyZ`0\.whd[BiZN qVv:�TgY&|{{{nY,.rup nhz~~Ӎbq~~wv=E|;HMh6[,:#Cl6V뷿|t\ulwvf<(_2v9V(|`0H٭vռ2n;a+C߿2ѸLhsWWWܠ!MRtV򗿬'OrJgkRŅS< ^A0rjj#9NN( V>얮aJnYZkyX,?Jhnnh-$I6bI't a'w\0qA]} Gvppnm6"JvZB?iPIT*<pԲ[U9CH f0BT/ Pʎ)Gu6 Ճ[b$T CD!fY*�G%AP.HL]`_&JU5n*ک0X,"Ȳ .T bh_ptt.~ @(EY0ജo=$<<<xK<w\D1rNQ$?N>b=;hljX*MMG4SpX$UKU-K(7} mb{Uk ߲p48Vīo<<<T[r}pp��bFnR(ULXzT*uӉBF\joox%=.dg*gcZ}<0-?rW΁6L;VY[ Sj(r&l۳,Y%NeJNh:ܙDQ2:FpH$""gJ? VR,m_җ>sl6Dҷz+ϿxPS"s֤ .'f0{rOܶZ ge:kbx<^,m61eYf%^=>n8.\.N'҆A4`P,YU0ze8oh4R2.F~\,?~||<f$ EpJֈM`0H5;8wb i7p�b#G"H:KNьhC;![TtsDB k~rS/S(7˖47cdX,~v dr btJ.h>_Uv_jO$I TVk@�$n;,pX`dYfv\ޞ$4);kN4áқ4ʹ'!+Q'VsxWVd2 bѤ 6p~V#h֐ fy.AP!%Q].f| 4O?ɓ'fjR)R'l/Op8lC. s",7m42^d2$IӺݮ(\u`0ȕ5i(jh*k�7h#02EUFVQRFNH$r}24mX7jBvCqw`(@;ڵzhL:=W6Ĺ!]7'*D,Οfۅ+e6ug].l2|ʃn|sRN LRII4~VTSP_M6'6*%o64� C˥]%΋>Ez&6KH 'B-ੵĦ J,(zӘP6~o @d:??fJw~wA٩Os8([n\$jZ$ 1'>9(J(2'שD"h4HˇbbO<LAɮG,jc)O{$>%9ͪLZt'W|fqj=ٳg-`iR?wJ(kX!U?4kIF ~z=7=v_;MQl,)xft|:WFWb }qxi4�75 nC f > �F}x9TB!ˉ3.fۧ)>Z߸өFJ"u Œ!X^=lRZ@V yDAK\ Os?H$|&+݆V ;(;_פ�n^%&aI-:].6i͆# V0Y|> 39J鋘YBI___O0 tm\j�ah*u) �<J"Ƚ{:N`ņAU$+cK2Djec5)ުLRzҧc{vn4e]_,h?w:׃AS*I+@<lYǓdvvvqF= "\@ZG|nD`hiS{'Ax^.dYj>\۪Vrt2:S�� �IDATHyɪ$ӬkTno0 Dw\XKZWfӧP^~9ھLQM􀔺nRC3 ദ&3V-cqZes;rR സ8jBN>7bpna0nY̬jS:dZ;S*@}6PUL:R9#\>ZՊdqbuW/l(F# NY0bG?zjkU./PYy#EJ&a�yb!-\.T` `sd2t+ Pzɹxprŷ"CF٫R!ЂmuXx<w#Hkg lj5lTnjLz.5b?zbpRP .NE(zqq Mr~ <?h6\yuTCdYByub>=|ry^6FQ*d2'''ŒNul|pˆ92F Qnl'q\RT888Hf('%X3s,F|l6?z[xc{h!J  juSA$6`e, 9}AȲ|^1 ϕ>Nek0R^ Rn�*;ݞJn=ص>߿͑jY ʠUJ>OEP@y4abԹbF̴2&(J0+8>x:OLwb,;T| f-eera3bo@WY&6QM&:N ZlKZ>4}؇A@9Zz=8nZSn #2(3&M̉ B'IX$R`<'jlniۃL-z(ʧ#>Hh4v9Fܤ ˑ#xot%mH W?Lkߥ,jϾo};ѱ幠+]J؝ jUF>0iJ#7E1*]1$A"X@* Ǯ%̬�mg\,(VdL]u jHŽ=̔f{آh4 2A'݃ͦ>=r_җWz: BJ׊Rd$,dkmb@6piL%ɕ$+n{@ [o7@gZ7] it 7~W~O???߾7N29Ld2 )7>d�U9>x)6? LۜΎA!0 lblp&Dh5AOSUZX,RjUu^!jsWT4UVz[G]V_E\bvO)gEi+hw}ַ~wQ<W}d%2g+8r ʛ Sé MUfhAh!=S(ءxol$ 7^<WEY<*7n=&# asP0t:M.   +F\dqwynOt:Db+HmkkK~aQ~F61$e2bTJ,81!T/r+JZdr0nRfP ,ԦvWf�0@�X-Ύ +d!Q �#BL&!l2QT\tFpƂ ekQO;YY`%I"עjWWWEԺڬ{$N6pudkU Ri6eI Wq_C#H&eb\t;DZB V2Gb55 X^Oǃ26갛b@gz�*8t>P$"=u]�霢·w}T* WWWt:=mL îSh,.<%g\Vu: I4ApB9t{>Cx<>y"KPHYGj]6FYt:, "4ŀooonh$ P(\^^~ooG"r4%_'Ij jb!ĒԙbP .lgBQW#ǼvXTM]$I$ *)W4tn2u\O b�Y|8IX,`j5=vBlw`nЏ6E׺ȍCÖTVB9X&\.C)wT*j6WQ pu(~X,fN'9u=C/Gz k_4(X�¥00,<<tl6C*www'rx<J6I~h4T*$Q'`0fCD~\tVŃ�ip:fy.ȳ-K.K$bpeR6LjEU$JL_,z<'UT*Dtܤ7R&&]+;. II$a^/t%H)N7,'HfelAĀc6j$ƛkz�;i!c551ĵZZvHep|bxpp ɉ+$9ԚP^"#q2msj۱e2s{Z)%F\ήж4KEo a9q 8VS:WZ-cm(& nCQc"I'rA}i,55?~x4WVΪj 8994N_l?\ˤZZn }B�~2b<[* xn0ܒ'͆c7ϲyVNlN&TiQϕDH$t8[2n]72#dYj!$jy/lNph306F#d" c+8%66CɲV]R4VdYfT G7,o6�g vp'3$,0-bFYc8>p<d2 rz{y (n+ CoᾗP٩gP(p86qqaX d D"1n11W Qp8>O<h4l,T Wx\"p8g}fdW-q-J|W"@斅YeI%K|m1LO6ĩ^B!t9 1=a!2nFL݅Rg7Įz` l\YMwײ%-3hI#7"sަ)ȚA"SqA09ɀڤAê]6ُPLT*v}% v{<j(@k1@(x<h2?u6'|pp@QR~ґ{]UU.PdV NR6͔RIG6h7ɒ$5pPQVKL&k`U@YF}Z̐|fgϞaL8\^2eYvdDP�zJ~C%F*q*trjq7ƖÁğÄ|^(H˃ȍp+@G"jP"e*]Ln|ٳg a+"Tx`j :x:{& qĝo�[F!wt:5!%< hGV"Hӣ˗Z6h5_,zH ƨχh$>z>&+SuBlvvvjZXNXr4DpY?t# 5PjZVFVl"u2|%1Ⴥ{-US\.[_^RZ-G6tpYO&\.vuקX+bqp}~rV< mE1`xj=y]zI|Ms 8Q tV4OXc秧NS(Di,^YL& =:p8ݎ=`COKvw&TJ$R^o0d Am6 sYn76x],GKo&вnBGۖJ\.N,AbS(~ ˕9T*Z}b0hq cPU3^ft]oFRN~?L%gwzQZeV iDtf2x<^Q*c| d*9{8RnNXcQ\A)@  Xшp"DiNOO.u#GݢT't:j:H5B#BѠf8c\,!l v F(hȣ-YoaKe ]__˲|pph4t èQ>#޽{9]T~:CL&Zuχ}ZE8UjZvQ?cY'IG{6Q 3@jtYd0d$ײYethZs AڮT*=~ BR vi{ tK&AF;n\vx*&(IH8gZY$OfhpRA+[. q]3`S54Q\밊N~()%k]pv·frWt2frmd*hnN?&!;(6 뽲YPxdrJ, },@KD .]ױJvvvNNNȂw`9l^R m8`i%c+{&q̛Z80;H~ P`0Nć~CAXTl,|2u P>y򄻄bWb TxpgYGnjU5@[C`0@Flj(mQi-b Z9Xjw^ٴZ`x}qEp>GIH,=1ػr]BfDQT[(OH$ՊZ'wnk47ۦJ jrUgitʟmmm IkY3Ty-Kч"`xqҒ oQUPՓ>[ua74KζZNs>\y4Eoo=~*5Z(Ʉa�OOO?裭-dQ 0FQT6U8BIr[T\B^r#~ŗi*Ruloo#pbDB>|@ggRp@s{ mTU ⟪Ժ$jfc#N@iHJ`zo}[[oC\ۂH) 4]Dbp^ɓ;ߘnw4p-|Z}^7g2 %$lNkYX,ʀ\^L=HrV |,ʢ(gϞ={ѣGEX$1x<N3 SF"q@He pɓ'i ZY�nbtF") `7H�ػU}knԔ~_x*afR!sUX6sq3u�tSヒ ө2,'pNFDvƜrXr|b15A7y$w\.>6h�MY% F" h4Aedլ FAd|\9x (Sofs6Evl Cu d\WdZy^T. ϟBl*UIؔ=b(s6> " 2GL Qd2ҩ2*v6T:L~PrڜCK5h*{H9:{:MvMZs0͂nXXb/"b.Vt:kq֑H һET.i5F#xQjc 6nv(X.HrV#Jy%Kױ9|> ͽ!Adow:wS%:x)p&h*efm#1.K Ap>fj*}PU:7/KDH.YduqqA_tV w ;wD�$u/?Ĥl6cmD"O$F.zs(EX.JݿCn|8N[-M&VSskm Nay?tT]j~_?lbQ=8F'V8sFZh4ҷoSt|>3ͪ*wAБĕfZݠnنө #aekGGq8YC'p>_)3\9NU YWfSDbK*jȄ??P΃kN=f%X?q `UIױVUrX28ԹZ{<].zf3VG=BG>בt͛[( f?s??t/YRSu|T*EG Q9u+&tvFilk,g&',]\t墸鰯[d2I`?'~sQFS\]Z{Zav @7Fp:p8JM& C�D"qtttttD|>#;C2D"׺4L֦BdGnւ~]D^-VEXVrպT؝]O?R4V*J ؄ .CCx<hҒd\.׍T*3r8TV8jfYhs$lmmelf<xQ4]1B]hzEl6I3 KlXv{2lookFĵboXB!Z7m;;;ՐM_tbN7m[,t~y7 \#@7PΨpxTk l n t}5+a-ʕVkgg'!^INS ><DA^mK@j!cj5_{c*6n~6=d2/_ETJt:mX(>ET\UvToT޼勖%f]CV! P\QHq{x<~uuF1PMS]G6d"t?p4b]+^1UURYrkknccE}IflZ 8q׭Z(iIBu/{{{ZUQ{SRf$yB )O3n#"IT`0xqqa٥ [V|�籜(wEZquoo~~߯jn7͎ce&I=!u 5F 64Qt:ReA/B 7`]V(QK,P.+JPQ^;~#ROҪS !@q*Yq(s�`evg" f2CbZϻ.HeCѨӉp dA$IO if�B!.^`nÕXoUM/�� �IDAT;*RiT.:e~ZBKqycqZۙ\.WXXXܠs9 ( `/7'iin4PP Jl9%ImjRT0Rsת`0 8%^t: Ep=戮-HTӧOA /A#~?`ʹ^qڲ#͖J7bN%%\.J0,)PFrs9PYzfuUVݾ !>p0DEѵ&�@(t�:@HB-%(H$d2 Dw0(c&볇 e! (<D"?AORU,Mn$3eiLAy^QLVUB 7HnDq6mkk <>Ș"v u0wXMMPxњH$^ݙfs*J@YlQm6b~ n9r*dܙ@  O;IRE'kVk?Xt 4;#ة)_V FөV}8ǐr 2M+dF=ft:JX%yS,]Vbv;`e *{ommz=Es@Pʲ,IBD%٪A貢p8, 7@qӡW ommr9h4$8`D|>4nGӪ;(gv^A/sŨ/t$=a}tXf# s[#L7|34w21=&\j/^Q}uۭ ʛبU!rJ3fK2 = jTQPq\C!H}˿ˏ>~CY4 rH,`S2w5 !E &qݬv;V!i�9q'''~X}'&.,9K<K|CXK$AH2Lj*pX&F!f;%fQclpk<|V}''''W ^Zn~?;MU],ؠvV�5.zR@l6ӯLf=yD_菼*յrxUA~1-I%sr]:Ahb,&Ng93XgwZ(o5n]qu]i�86VF>iS+qV+߳w]k"*/ݾْ྅^D \כJRj**U ` W{dDrJ%T|70=\._ k|>s�ZBo|Ht:ʃ d}6f}g?b}<\.Y,p=9 \D@ jiZ-;�}A1!IǼ3R�)7KV֬QusEÁ|8^__'JuޥCA'fpsvltAB U.kS(<y<x<p8�@Iӹ\pI{v{eR(  DQď9O  l% �ו8kU[fR Sߴ`t4a\`_ff $ povzz/..$zH$�i1R*AcX!*=qW%8DQ<<<|2%LBkR)Nk`kK,w:/^,GFqnggg:%l&i:rUUNF^A PP"kJ4z04R~bM#{*{�l}U>ڋl6U>At:Dz+6at:MA,H$X,hрD"fT*AP~7B1!U Sri`p1eYa�C"; mwP$Vx<O¬GET*5r!Fl. ,rKXĻ(g \2#d8F>2 #X,vzz\^I> &Jv;ʘb@vH؏'O|+h4KHPkSd2Lpj"BZ1R(Rk!^b_[D6-N7ͻaIZ>z(HD}#M15 WlN$Ȫ3h*9?t&Ѽ^/J`sƤ*oA4[YN_g+&R`3H$Ng N'NB|>Ƿl.CP{h4X,Gi2vۯÓ*:>% }.vV-VɄN 呮N%ZxMi0J ^[(wD{#.<>*'lD8v8l }ydrvB!|p'?)@z. rYH#N06.+@ AZVVk6vB|" Q"hۀINA;&<Hdj6"7er:/T→l_*t*?Y@�Ufww_up:ihI( 6'#s\BB *QxZ X,7fAY$A0Ṿo&XP�ꄺ\/^cAJ1v]Qdž -JJtH$X6^jL#Xҽ{~.3 v%�GBivwwY`JWkH9X+|>HryTȽ{~gK%؜U'$ItDRX,6^xQס0`0s%ɵ&!h4@Y|. 3f F#mHV]Ԭ(7/TעU?fB!7GGGZv TmheiM1ݠqzUYpH\dϾo};mN ueA8<<D|EՇF77oo{'I 2 ԧ_2b>'E+XrD{fUzW1|7o/|q8V/ZW^̽ɒ\u<󔙑3"YA&dmmV @NȌH4 @U ddƘ1sn;{2Ŗ/h,D ׯ{9ܰCXdgqiZ€(`0'ϟ?ǀsH$PG^죎9NnRh4!.II[ُ8YF/.Rʣd֒t:IEG)ϣfCGB!7 ΄h4 Ko-Y<07�88H"FN|J(ZV͆$DhvrX,vX,^6y󆞜L&5{S>apM<6tzd2ZNXM,em>xr? rcպX, PqvJv;8bC[yHkl8}E x"(B!{j½3 KSE^޶Vk2.wvvP8@cd`ù\hDOe6"Z-X,lo h;;;fҺ, fH"w@�a HU>abjS.R**nKި$ZB2'nEEp#wmzb8et6g33A|;J@IYUX^>hJ9}pf@KYh4z{{+rV87|suuj+tPi?䕄arlc>d'''Z5|v+wh4 o& +!4('@YB"�qCt ��%w^*F~[V%yS aMrJ"EeEcH$FpGn7 clVk$!`NsXX,4Z =.+N}سbI$O|Lo�Y�T[tNp8 4wU{J Ai+ڌ\.ki}r>ëh<!CecM`XKPqu+Qu:bHJRl6o@FqpZW߾}pJڍ>|z~vv|۷o_\./K`1u^ֽ%^jj5+ ج#nFbH޲v߿^G]Y,  n///iI0`3@MBV% ٌ*_2&t:bJ%M;c` *7�:Nӑ۷d2A1X`hDf5 z\?~R!t6Rggglsv"[A7:ȒX,MV`=Fz? >VP6d(v%3p\tPVț]/lL$qâG(]MN+< Q_z,])&T? )(|-BZR A=LRNRx<ɄPm F̎+B7�#9s.fXT oŞt#M&kXb0L`mxT* Mz Gvz1)4z~8!^m5ttGjjn%D^rV J-ZS>l>E dxX<n;l4M�T-qZ@Z4fHTiW3VU". e/d1gG 3 {& x}NÆ>CB˗6n$x_A[$rd9vWp]Vj5F#$ TSi$}9+&r7:F3,\bg&nm Pp$xzWh$&B!s" @r)xj ԕR`0p4i6f=cSQO`AJ1u"ȧ¢t \#;. dIj/^|W~;qj Aڻ~HaPԪ<3"Rٔܜs\:M/9KkȶH~0 6tKS˗YT4 V49D"!g供dHuL&YYe0,fVu{{kZHL&A*]4 d;;;EI6)(3 >Fr:qxY|rc̨rvnD"w|&p}aVIOVd2鐶AA l`~tj8ommJb@ F(nTj6~>N \Lf/hDG$J6W*4W٬ I ꏜ3|ĉor:|hɨ19t=PEc3Ni nA2FFfT|ٕ:$uӮ|>.K%E Mr{5OdDL T<%R: y@ne??뒕`W|GhZ*x<^{kb!;\J:u:)'] MƗvhM[&I\lvh4*rl~kk d"7طpMgC>tFRT*w d29??w8nsyeAl]B${{{di8#-|5L&sW <\.fwpX*X?gBmwKdm)f pONf9 ΢sʨ1fZ\Ne|>IL،WCXt%\Pߒ܄Q38N ^MCߐ*jz( :fFc{{͋Z=0Lʱ \J*(�nk�KfM(�a $)FHjr4L={&>d2zJ<{ab;7 Odp;tuqJJX,j5ñz) /mDT+]VF#L&JADp⽽T*KZw@v# 'w"VڌF(4܆`lSpDFaZiZꫯfQ6MpPHԧ3WrIn!rwQ6E8"ܸq;'צif6x~bJ}d 8-EDbK~KeY9J\Fٟ? f$@RCك!{ߗ#O⋿j&i4�laj_xd2O<l6NJX*hAѣgϞ=~X#qXKn倢 h>b-QsOmL%a?x$7Ak! @ ]P=}ӧ()g~꿒dN'gXɓ'.t]]rh4F ?-ps۲٬®Մ-%;ϟ#Qkq|wwN43$�đ #_/˿/~M(MaD"j9A Z$9>>CŭTӡX f+߯@ƏW�~.JKl01#+Gb֖d1-S`0Pb8Ns�fo2/#vww8='s ej�j9QCħjXvfA N 5рU+XWk6r ʕy &u'U'w $.f zS˅\.uh j>*w|fAԅ�x xMK ѝNn9nәL&6u: @j\.6v;? sss>넵N%t)(xG"(tO0P"l a2`nbw\k-mBb1Ppf#!v$(*X+AC~m\O1LS8fYm6 vz= ԕlpshw+P\+ npZ} MR6$+z=C%j A髫֮jK8>jń*1@<VkZ:g@�tfP( ~ݻw//v>*J޽m~+>j0 n9 &vr\8E|Sj`՚Ucb6 "v;^^OeNݻwn5'Nc68РkGrqlD\&�OH^4 (]TA.b! oG9f&yoCoZvP'+*-,p8Tt\r 碬طF9.шdRժ~DHV8n00A:rWpE*h4j6X,4|'�iՂ�+"L&zΞ !EA8fs,ÿ0ThffIp!HDN @D}#e"C[#=qss#w|#u: G<qќf,+5|;Fc^OA6f K:u\ Rhq[g-' fr2)[Z8EgZ& \C986�� �IDATͪ*9G'5L^f>'-�eb*_7}͉S6lдe+I-PY,`0>&ʤjv3ُ&IXD$ 3€ʷd22j4O/�zȩrXp�)*Cv\bBIR5Z,j%777Q,�Ͱ0Vkq6@f2L"I4`f}H$P$iinr3\tw⁚k38DEi>֌U*'@ȡ\b0A97>+@rb خ跀[ :kG~kcb777C9 �ɥ'T 5P3I<COXjGjQ f^+'Z]TP(zT:H6 FH (j}`.@ 7ϘkP#>Id0[ZvggGKFhL&v6l6QށkC%bkk^OAb:L}Z׳ux.Tw:JbMzK 肼 kDRTRf7776XX d@AB!"_.8UOa=BSpw9DN,K:!֑"!;NSQ4ϽIL%(<m DMǨ?*]%z$r=t:6{Y.Ih9n;"Wɣ +w~S!jmdzIk>ɂ){i9Dqfwݸb19t8deCg |ᾥ(0@tB5Pll`>#=NpL&~pLCwLc=�{/;eZvww!hqp{dX8@�F"~,5 y dr4A' ~B!|P( iF^hZzô[a1- BAuww\;L&fYR�=iZJީdL%UOfg=а%�\}gP3aEcOI8b'9.r9P_IHM_%%3,pTHvwwYxB%4·oQ�͸N�DH+jt:+p�CQtnmrld߅U} \ VFoa}wb=yq=L?X>L-IñV+Ly=}t_6 Ӊ$M>v[[[\e{F |ztttzz: zl6$Osqy#!kZ9-C*D"_|j=;;cokk lE.\Vs<U,oooC [<8ę.;*#" E;88(,~f\)i!8-2bz` P﹭H<ɅCSZv麇YۍFB;h4/n;+\Aό1|z(+VUz(!4Yx655m\CG̊2rNOJ PwݮT*.+袡fZsܷ]ի7U6v#* ^O$t:N{<vჸi\,*ue2pj{<`0Qcݕ<9RzӧHjZ,p/^ ={uQ8Z-|>? ~ÿӫF9<<$ χL�鳠H$H�zqd2 Z p"{>[r\vŋ&B{~~Y_⥚j$;@ZMàppnF#Z-_آ�8x<[jBuZ\.'r|5C~TMc "pw<`=9 rT!ystgr‹!HTqKᶠp#nchłp Tj!Wb(YUSڟ8=4jTz0Cm|NȲ,fV+*Gb xnءr`͊bbf<wP(d2JRRagm4 10<f3Dv{ZVełkFJn@V%aDt:%P0N^dFWWW �N[eOSP [" fv'ZhD.xf={Lӗ/_^^^j#C&tJ"8åXqHhL&ׯ_#~RIne2'.š�\r>{ PZ,t-$P xrvA#TmPa6*%@ŇrVe}pNnd20+=ȋ5P('''vbl6+IK9&L&$d޿/ `=sg OЫe˂T)C@ ,9). ƉĒ*L(:===99j5vt-պ\.^OOO l~bc\At:- QF#H*Vۥه$W5M\ R~z0\__~"6ͰP(H$p4 E&a+`ﱡC9,T P(Jvww`=vS.p*aL&n�#Y f4Q:z ˗/g|^/sl=yh(k FBl62 -LLJl8[ 2Ǿh^xqzzZ/..XsBSucdO(vpx5Z vjYhT`0(|>'J,bX7U@59SnmF%VI-Ky<m\*>P6sI\.bnCӉ+AB;d6 |k6y^|E�!8RAl6ڐ t:qfҟ@ |mo5n܊;p4,v[rOrt*Y>g4鄨#*dgُ`Q~uV+v zS�,M1\.M&}:c@B(pBA�Ӈɥb? gϞ%Ǐ{^W7oTU :N$~xp ZeV+\.QxIK#`<@VFϪq < CtA=0zHތ]}Y2t\NC1a38:c4jv1k>bVSp8 jZ!'J[[VUoNJ;^\N$bq\B$?KB"hAVT 7\" L[+&$ I($|"P8F'5KYN_0يh4 z"$yRQ@zFPe2\^^҉GfJ 0F 0v}0rZ-c5j,5EfnfR q` ۆ^VpIX bN`B2 ^P( 7Z@}P(b ֣tfEZ- Jwz.Yd`L&Tu*<.[JWqW �x<HNXè- n/.gTjeƕb%q,J`@Y@ugXDtX/X 岜M\^ݻwk_vGQ4fѷ�].kqsHrFnPTM5 |K%QF rkkS]§\Et:F QD~C ÖO#`c٬jE{>j5kXPt8sBht[(1&8&Z-#ċ>[<pŎ8 "/^8;;L&: 0& PZ$gzX® V UP>zV�FelI �dT))No%�|7oxli0a& oW)nj]bSGOa˵_\ 5d2 NS,x*h \lײLe!B*?"nN(twJjP"4!Bzו#Nd2[[[{{{ಧ* a�3 :`hBՐ~.F AF˵l6-v2x<Nt@=ҷ4)%4+`7]N"Y+8Pjo޼) L#0|>|FөVggg&F �F:kbpUƝP(Z L&'dQ /'])Q]g;Y~h4ĆV 63k;9aeq9Q`>\V4>jv{kkk{{+JTI֛L&h{{{8 X`h4..."%8nmXfgglV51* I>p]#T**|`Fł2 I NV>믿f q\nooDn]2SE;&.EЗHJƒH(10u_fؘQ@ 1Fh|'+${Fzw2l6 0,z\�+}2 vf}%}L9ʋ@w\m]̪l(јfL=gD#9`2ּ^ QROsqm3= �\>>>zJ_n4VJ~ss]o 4*98CeK*L4Ln.h"Qn,{F*U8؈`Sņtx'c$Bnه}^zZ%{E8 ltYAIi1S>= (v|>O;5ql2 AĄs·!i^,5n:Bj^ӹD@ N%v?œ*0kNJ.XY t D"x()1(`a9pTrz.ѧirCyt9 vݯ:.kkkK<_;`K?Bތ!u02mggGT<|ϟ?⮝|O<J-%)VɍFl1clO>/~ӟFQNߜH.)*O^OO<Y+5?>t:I.]CfY,q8O<A7 xXs'Ke>ș^#:lO>yѣG>?'O?NIj⮏ Kgm`}}R^OIb8fsNK&"߹NKӢ~WެA|>5PT*x`39_RVlp)yC- G&VhS ჆AM*۽H$"r=l~{C)շ[6m4l3p0jrx@z&~ WUX Hd@"qvvf///D٤|>r/#[$ 6#|6\.W*.ދ2P<x� {PNFd-)t\go~F#0(`'[Vp8pSD"ȱe(7X,pmZIVr `FX,<yv)Zf2ӍdXzd2҅x)KC}7{_ջ\.^/֪vD!p8֙XjDG+L,,Њ3n7R0`sTr%k\YJ.N1&8 FQS5IB MV&3Bʼnn@MYsuuŢ\.z5d2I4$ZvX%x 7+Á*Ff# Fh4HMT� , @JrµXt`w`0h01#�жj=uX,F¾\z (CEӡuX ɐ(dOXR8x<FIaAK 9f6x dXoZ<�=h}NJ`Mz=`tA"5:y-�]`�mfs(QAQhNLũQW (VANĸ$9f n$\yYĺ;5ٳǏCHޓjM %m4L\Q Wl6: u\ :S/oP}>KI)8 rN|h4p8zt3h4O8şTr]Hpr nqbM&8Y�q\Zt:,]G#k6& (PWt5& |ptB_dǷQApv\\!l!wOC t6?Z,t\Ɗّ``Z?c.riX6GpE"s^.!rm6E8v}8PbjS&8'}j4N&ǁUYX4Ji8.+#%&)926CXu B.lvtt?`'zAztc��V>ኒV Gev#+dވM7Dp8l0JVKQ˵rI|p#ؠ37?IZ}[,Je2K{vuuʼni&s`Uv:e?A2OrխhjJh\@^xL&r9 *`ef[9ryy9-`@QєJ%Vk\np'utw#%t`zH\di\l D ;;x|K3K`C_2,F#�[krh EH 5m*Wް"uvٽ{XG@ hA!e;d\.?|RvP',MEz f*x'(SJDS$GZU`;b1q_R&F,ar 7d;YlXD"r̚59#S)2.�rTh�4ǃTMEok| Xt8XL9@*\<vd8\\\`R˥XVT Uj,pzOÆX,VEawx<~U!,YClaLI,įt&`k2 f2\.W3b1L|^ӵZN_$Z$mX,S</M&ʫt:].,#Lkv)!-08K+s8Nj^^^rZ|>r\3@bCdQ>JXEhVz`0-jt8NuMb͍X,wG4 \<G$a=:ɩY6 lZanؙ n9L;ߑO&䔸x |ߧ/*Df ly1R8H(@L9.֡6H`!턋jzRfA[(be`*. d}>Oyb1Z.4, 6xS4t: %\.L,l0ijGr&y1LJ&`ʨnX,h4V@c P9 A,nfZQ^5FzFH| 0$p2(l۶�� �IDATWQAx<F , B LwUl2 R 9 `91xW*{(]&TGW 5 qN ;#P=^H$:k*aRnw>O&X Ibx{{:OI^*#D]LNMNtBeeA\*P()a�\.% bf`)ՋҀt:9oGl6[4GDP:XC}A4 P^^^4rZL&cggWҧe_.Lmoo�`l&I&6}>_K&/r"s p(zLf6!2 ح`p1N'a[Z 3Y&r  e?%cڤ|�Qi+KF" zw]tZdG g qgl�Z옋y]t:d2j>ڜdDpq\J&j`0*Tl)7+vr2VN.^ 0nxDPrq"x<nZ{ uփȘ֊USj6 b<|xZr}-ĢhXܱj}=P4lp8?~X,x<Ol3 _}d;P%9t Jr (7@@ҥD"|e۷ۘD\c|>d2z~8P(t:Bs`8&.L \9lcj;51S*A&$0-(QI>΄r~9~B~xx(n$@!{$>WY[qGnNVk{{[:t$WiQV[kNjr8"DX> .Bl`jxQRHE2b/r}xxxƒ@B@Jr#tшb0 `)p rW^aBe&5(2 bq8Y݆Ka82>|35HW! p8vww?~|ppt:~TBBw#'r>s\.b0 12@L&P(Ht"~_~Çm6[|BGGG&6M iAd2jC%A:2fv%"ysNz]gY|t2 }N&0..PF,&v8uIk~&jj6Vegqj-Jggg_)$o&gsr N' PPIXt6lCd21 GL.B"i<)kHJPra=S j|hr&Aer0Vk3 ̊&mXp,J[j^o٬Vk"@1~ ~jIpD�۽>nkHt, D&NCZ7 Rd2 nt<bx<( l|7@)J�x‡2gmZx/ ۪2>" `s&I�"RQ<z f.CΏ$ۖdEz0q,phX Y[ = A>nlwޜp@Wh4bq*ѸX, PPvY f@f4r=Qljmmm+INK=+lh4jVU%:WF"Tlj~0ݠ˄da΀4 Bv;Lf .H٬d{v>-YHnck xX,n;Ncvb J*J ,ԉDb:B$PQVPjvd2i6GQRA 0iqN:FIaVFZR@ϴZMjzp8<NS-(}beL9*(PީAG#bY,C!evi�H֙C MTqAQZ I[jfiٮ|랛35c@ tZ"@FӃbPB * 8D8hTs{^9MBss~~~WJ$,PwѮ X,ÂT@4^�_%^Nr eqzb�@px `h4x<0`ǞL-h4:;;Cƛ7o* w#ࢠ/+�/ @kە+kN"0:T*M&ZF  06mggB x0ͱXP(*-S� /\.WX|"PnR+T!6 (}xd2Ll-,=6nN{-& 0؍IX*"bq#x>ӿÜ84@rT@ ڬaس80s;qXIƺ~egR(X ?u:<L [k)%LʆY> 8(Jp  SD"jC۱ٙac]T톥Gít32Y{ dBm>H#!GgR<vҥ(h HS|k&BdbБ,j=/~.?bB ⻺я~T.'h4"[X$@tYPvpٌ^JR:I#1mbl6`~8FqPspwVWWWoكZ2|%SF[bT+1Yr^&ISIbJ9.#HRErͩ'o"r$Rs& )̟(prA:Z!8L*=Q4k5.wKC=<>(|n# ӌ[VqWgA;Il]ʲ)d1zOq4; <A)8eRࢨƵ&HV N- dpwDRG^"`02 P VX,Gf@v )Jz~>_^^<bz3."LZ D"q}}jsV>V%@N8þ{t&XVHhZDM> iKvPKZyPFv|<C pX,"@J$z]D4EUeSI`vqI;5Gjh"'j9I7?.2\# b,  $ TB8.z^Q,WI`Z6h2T*š"B(\iEa\OҎp+|# j db-K8xSaYz<F\.'yIT@~FsT(8ϗH$"h^d2y%BHPHa䄁=r\Z $(w:Xt: (Ȓj5M(#mu4Ʌr\ld2(F:Q u*r\5q!di`@.JEgϞ=zZ N0 B>'PV*IuP �\.P ŗFqPQX[[[H %oN~fmKRHf@LZ.h=ԣksN:6h4nq~T?ΎheO`8nlА<&"<ܸ)?qf3)G,BxrO56:B4ɨm.nNxÈSNP>!:vp8<~rY|>f#녇z (cgNT\naKbi4HK�Z* M...l6[<l\M͠ rooV#$x"D߿Qf+K$]jBm:lnnnnnnpBss|zbt:Gz=xǏ)ĄC@<U]ONz\.Մ0J`Ph4FQၫݻwEbH$r||f%V OBP 6h6sA<LV֝Bs:ou]BHU^NnN_ZjQ*7v{<G'Njs*`Heג(M* o⨪<ڠt=88t0~p:::Tx9Nr26-N)S1)"=<uݐ9F9>>oX eٌM&b~ӧO)HHaTlAVU"@ :g2DPu:9jpMWWWjnfA ܉@C,ZVQZ>~;kTBu;[8e + yHTQ 2+q߯jx"ar}}X,V+X0懇(1kZP…N.6pbdl+4[FR@Zx8&I"hR~ٳ|>H$,&fjPk -P}*/^w [p8ّe9 &-q.5jJ ^j6u:­W+·(IMyaDDrVb&l/) ~&.Tx<T*4wBiBthk"r@(AL 0LAPe ľہ~w�l6@c 8t>fb_VDP&YP,NHjR~뱘Ia NgoobT*APf +Y;$*x =p?lf'B'gY:nkkkooo{{;.K'O M]VF血 :8p�ĮV 0d3 jutt $J[/N6prɆyKzϞ=;:: Bvߔttnoou: K@7]>|>ȭj>"m#6G`w3!3q[ rrEIkM&:n9H;=zp8.!uXL )A F@jg>;Ӗt:#WGzE 7rUKR,GQX0"G uL&xy8BAGB(ZVV `ʁbx7bCQ8Р=P͛7rA'\.7v V@~52ս^*G4$t�^f{NµtP(g9>777div= [3ƒC/˗dif9 E};NRucKK@M "TD@Rŋ`0ŮFdx^ZYjnpdXRT= lJ2-t^+j47֨T߈=�Z-ErGfdB kNr ,$f8oG/b whj]A&X9};N`7uZV1VST DB~xc7V qKN\'Z+ =?4=P!E}-NpYZ9AM %tnpx:b1@;) 3tȜ7߿GM h]p8|mRi6Vht`�s<zjjZG6x<ܓ0\.JaKfW.n Bvfdډ J'''JF1fh4f3 r'ZHIF~4D^/r`|y;D^|}Rt:'ݻNz<Bģ@ AъvB٣'I0 mIlFޠNvaEtիWr,>�n~?q.IvbAI?Sdf4 PȌt0K "J%_FU*]N9H윤XM$qvyy]q =eSF]@BOXI6gDh(5z\I!k 8ɉ"fRS]{bSxw|1hN~믿F+�}H ׯ_rp8<;;-6`cv:#"xyՊ#>dэ5L@zL1+kdczj"*A_޽{w{{p ':bM&ȥR jggg,mٌXB,3@ <v l3m߂坌 ET/X>r"X`u:}}^"i\kai2 Gđ0f-ԥ8:X$rbutr;0ظh4YCxT>RN$z RQ9)\.K tEB-}Z}dA dܫ> H/n!,G`F4d\.W&tV r\j|>L帑H^da' ] [2Z8;-Q�{B|V+RVU,?h4x<~`0@wjSx4 o,AD.AE�o^կ~%C*L81Y#Rz^DQ\4@\. =s}} eKJ߰B!9n/0˛ť5.)6]_SrTk-TEbB^"dZYY)^/Yu# I nܠ[#418BLa#_,^mL&m~A*>}D}2O[rwx.DoDIz8.G)9ojdd/..zT 2NS j1 sS\,iV+CHįYr0v({(LmJ%6_TaƷPIb1v)Eک|XR~V W^xF"H$nnwP899,xh4&&<5aX-iB4vNj4Wb!y Cs\E?C9BE.%G"2vx< f_hCCoID.oJbeThLRLRgUi (~YwgfQnw8rQ0h> `KQʡRvdE#(t7'P10%GQz)!Z-͚a-L9Ny9R ЬhxZjZ-҄;;;(QC)( ?=Wt:]׍Fc<`f"jI<l'l=PU#.%!x"-.s0xԉ`;2NE>$@�$mCHS @e Ee-A־ӻuQ;QG%̢Q iDڹ-~·fg&bmaye۪BU_uܙ)fX�4R(@zŕfqʓ놜Vѩ~Ap8Nc0EVC p'$t M7kJB PCG` Ej4s$]n'VzhfB`O^t{f3L"Op~~OrHܲ{q}jE|O#|n@ZT* *U*4eM-V%fs"j ?ٙLl`�� �IDAT&:՞bNDJ;""$ HZ,v!4 JwD \c3n4J;|KPZ!wLعEy ]-$ڌ45jZqb* Aˀ= @AUr^o0b?OfsPPޞxAYѝ: -z=ݎLBa\j5Z^߿+`0 rkX l;(U*AyJz=[7G+ De|k2pjwvvNOO1`|zÇR {{{>T*-˝<)jz@ƘcR�ai+Pt:~QUQT‚#9^)Ooz=mA6xt�x!{\P4%y"bP0 | MJQ2m&mrn~wkdn7C$zmHJR6 <ظ7'bfA>`fFD1@�7\^f777!f@CڮV+QPr-ٙfĎo C*H$H2y||Js"S"yO_g# vmz=9ܤ[l2z%5u:"aX<::B݊X,k.&5"}g^"/PDB PAI"d4. bv݁X\F ΒH$le2r8a=>l7曛V5.hD"0Nu4]ʠJB+(wH6CH[d 8cg SeyRN[TmZ VTr9Mk9uF~bJ.-UFJ<k!{{{ظ 7OۙP\Mf(Nt4΄L>Nj�TEE]4hbqX@ �Jt4:ˋNa͍bJĭQ)6Si0dgzf3S8'6M"h&(Wg4nG"bqvv9vӉT�S~Ӂ`# wѸy1jHX =z|&HSmr&.404 pckF'@ ;Gld0Q5n5 `QpF#\}hZ-bggg�`k4v]spcl6˒`#Z�q0 Nqt&djz!Ji40 pp8`sk2\M% ,0,5tI�H-clNkqs'Y: z4 yVLp-M%L(UT_MF#:+lZNKwmq(fHfqҥؙ�4M0 1~q||\�A  H ~h4zh]3B_OR| Yv<%yhP\S@t:A=,wj $+8!7z<nvGdbF +x<N~b4j@`�8Lv:Ǔ(''NIN}Rq Ce!v P#`HD?qv]"/ٽGZxԸxD[<I8Ny9.Ovs7BFm6[ӑ{~_Tb?6 'AG‰íxuV:<ǣ\z4l۹1GozF=ozK0zl ه5{<|!l6 xún4~ ÑH$qvvv En`xQUt:{=pht2�rF!39sda�;S<wݠ*T�~ LB\.;j|jeXD!sj*D"ABs.+JvdB@ y@ Gh®})'g3rn�rIqφ[:AQLb~!r.ώ &}ϲ 7[@R@6aAǙi Nm8rSf693LuT͠,nNaz�\pDUK{Ɂ͋br'p@lx<bNoBKp{{Lr,Er5ᴚⷠJ~pI|>T*P}Cd,0hx<fY ptp8ϧi7/..P MD"Q.///(BBVlb@iXh J.[;t8s  bk/&0 !;x{{{yy ( l]dSP(XT*EWP(t2n :+X D2~wBa{Q MN󇊑߈:`ݻw~׿5z ?r[A\uq`�ȭqʆ!XriIKG!|φ#9KOt�H@ưI7T=9LeT**g@zK'LJۡfIQzkû& aIybA<<멩 bo#.kiþh(zj=OP(BQ^wuufX@ʰM6M~ggb ef*xpq:v(]oj>⢲.Bb\.^Qd2>P5)炓7|CsiB\Mt!:u5r\._` BAUzD]b־.49u8!Qy,K&^Ԏsn�)a*")dZfHNr+7Nĝ{߻>P.p84LE/dF23#K�%|QGѽ"YjS #Q5!".D!'& j t:2;gIΈB~ 4%^je85^l6^/j FCxtp^>99A (�v^2r:jf\.zG|>ht\T Kzgg 8wRTT@*tál}H${{{vlt>|PדsDج)UIzTF:FzP n6jVuggG#͉iQ@ĐC$ QvH,Q ksNHDAE6/Dxkk)/soZ)m"#2#UC<*jd<, {I ʀ퉁*/2fH$EH?߅Q> pݬZ^Z=;;0H...j5".^@S+<ClvvvR<Lk8TڨahR5{} u+_0{˜V3nX,祠q='9zV �y"pŬV+Zy.իW (Su?\gZ\r~, äP!t:[[[jp~R0|I:Z}yoa*l^,cX2 7,nФRG Ce�L'cUKFx8A@$ b0'7ﳄ Wȁ $"N;=XU>ae=JJxvv/'O[__.T*mU[6~�Kט ޷֛ % z*k?U= 2JRB!)44+RdBJ&\j*G5Iz%\ Q=0N$e^5mmMԬÁ6 >DW\MWz¡dcάV*`89I/I^\\YD^zE~/~l"quu�tG׭Vj{ns�]Rfv2LR\NN!b}IZۅ####^\^^]N;傢 Hn817p"hf A\U򴵵5VM%*DDq{\T L`UUVQ3nwyyykk/ȝD7`|ojC_Kի', UCb>0;"mILd W7'_}XWAD"Bz^\N̓o &G[c0U@@_ eBQP?ⱕJÇJr|||o [ݮ)Z!wkk+ޖL&Y6fuuNL& ʻwwӳ~*v)%?V*^&Ϲ o߲33;; UBɓ_׷333jBB|>;-ӷoߢ2N/9JgN'(۹93)glnWB!t7dPggϮ5O51A\ 1c:I\[[wRZAhT*p8Օ, 6VVV޿KrټU zЌS[Vmƣ\կoc[I/)AM>&ȿNKuB𔈖j(w v+w{U*&=ң.ī^=%`f,\�ZՏ�0>,CC777h2IvM5$A~z4#Fb:pe5h4 WU/^,DP�`fgg!ci]Z:pd$4$ˡPo_~R 8M`pdPOo0Tݝ:??GQE=R:j4Oi;33fLꚞ^]]=>>ի*n[,F-**S=V-6> KL0ϝD�pZr;g:FH/ktp'\H#0KC *;X,\T*W3<lIV=V^[BN"ȼqXZHJp8D9)HH-ڷK&�_yVHW䆾^QU0FmP(twwvL&_ lA^oTۣb (rl B(bD"nq<H@ �(U)l4x3Q&X2"Нp"�xrrR(`ZmZHRKdED2 T*R)t";.afKWUUq&L*(E`j[`I>:|>vY#Kqjg]&eǝW9T[1  ql%<tBw_: eJŔ Ժz2VU]0@׈qȮf#E{DbGhT]䁓\LFx'' O t:&dst1gP] bϟ#W177G*&â>@Ƀ=<<L&P?^2X T*Hd2x<SCպ /o4nQ>"zv>jfff|>-LT*9! ̤¦`5N7)0VKgggv+9$h*gw:Lh4z{{K ^á՘$0Y:zx|4Ai CU_bD"ǣk.HL@07 U0"@lj55YiҰ^'pq&Wh N=Wc�0p0,ph,"Є-:.6LlF�UU-jq * ;U(I~dHkwwmIHc-L888Ѐp O1Q4 `Y/BjF'˜O/..�IP(́=;;CIH')hPY TـV^vcNNN`˃[Zӌ`:::o޼Acv CRL~"Cc9FP/..opA%X^X,eXVRLA@�ImyfVf IT!q;cXL 1T{tǥ9f|I1yЙ}u0~%\nUaD"Axل?s,KNw@) TE*xLz@7l8@=İtn'ȫ ڨUCPkU 2>⼥axDNίl"YRƽ@H}X,ϻn:`0x ۷Hb1D^*("#E"مrJ�-F]-..:3QOTpѡP(@2l6m6.Y:ك:nT;JE"1 zhAq|/L ǘq\HDcŌ)<::'P#f1X,]NlB.LёHJG65ḽPܒTtBM^"\k'WVH[RZ Bq[6?kdRA>P&eP"n C'P4}VPGoR4tQXTFOcdwT`<g$ &"\;ZXX L& 1jϙVh4M$laaT!HBRR õZ]b\`D@юF#855j%rTK q!/= >5DG~677NakD)ztZ$O$@3qADs^?Ni4 IZ=4RBzOj2 E\vCba)mU/ G[ f6]OՉ1n-TM9i"`kUo%3Uk>69hA~?;;l6aܮ) O<|Fݝ*f]r~ U $fE5Q ggg%\Q?|4<˗/)1gE&x<X,VV Z----h4b܅/Ź$w]KJ҇nooꌨ=+"6H Th4ZYY! Sz-H?|dffiZPbj|tH ?OJvQT*EgԠ.sFVʓ&3Ye?eFY'ӱHT4 kϣ-}YR[H-21 ܥ%.ф#h[H 92^?[z^ q:<ˬ@ �b;DrQ xٶ &ܜ]Td$cGt6UIxsT-.CvF:dT*ʹo^^^v:�nk^#K.pIӥ^E@D ̴Vɉ,r{vv .jEtzyy&Rp8??vwwq T�� �IDATD&faanj5=\Bjg?ɹ37|}>_ <nqqQ X@i _h4@rK/GlFFEyr6]F5iii3<3Y,Q|>t:5;XVk$TcQ�8 SSSVޤ$DϞ=sOU"/34qo_?>2={Z>x>9n1@ˤ_y'oJ_P\.KV-rԟ?ϟ?w(J&08o1D"ůڤ.ϟ?/ \_}Ջ/PH"ӣq>}vT|erӴ\b|&/ ſr_kaK nbbX,><ZVrT6\[[z+++T6r9)_}UX䷨OY]]eB!2ntydВ MoVO ,Ϲ4scjj`pyyއ8MRH$&Phvvݟko2/bg iQPE}_Woq\" ޭXHA{�9Bw !GU1Н1D^DT4p P Ff{8߯P9nD,n2_g`oqHR d2э. \ӹC =5srrr~~2R$r�OXXX b8Jf 2?E'2yrr4-s`m눩/--T( lZ].p vvv"v׻H$BP<lJִݳ364 innB|>YƋX`x;㮹9S$ަiؾ*6 qTl*ƭL&>@�j1A*jjj`T#?9φrURIeWHvg_>==7ji]2hkyyyE崉.]UpZMmij.CҒ[`Pxܰ!@g]4ݞd*!FS?XC*fnaaAݾ855555J7o޼yҜ>;?~LR #3mggZ Mr쀘ᏬIu,#A"eB:}aaazzVP(N@I:VVV__׾&lX٬f.uF=npv8v)p+ݤ>|�&YhZ>rG2_J߽= ϚAzjj0lü2G@TxX_КЌs P[(%bxH_PypsBQØq#* t:5mMxP|4d@ _$Fc~;NOO%J/Q[[[[[[lu"G֖t:ϧ鋋maFrjRQ}wwG巚&yjDQsJVT3gZ .L '{2$,^"y^a|',..D"NZ 0ge�zn7NkBH1=8Mr9Nvr 2ZV*J8 ij߱B 3 {ΚT*]WWWjU Yf9W1E=Lb ԟ7|KٜX[[[,P$>jgLc7'*'[vGGYÏA8j5 ɸXs"ovνY>utt$oZVwvvd~u}\.rd vTƸ___WXxcpfZ`m %N<BCνsN_\\~t:rD;<<...>~h4NOOAݽ[h0_B$rQY(r4-P=S( <nw>B2v&{N%2OP(x^ 'uJG"JX:mterf %{I5pZĈbұࣉh4ynl7n PoFAFÄ!MQ&A4Bso@^NG`Ԁ>z@7oN: i1ED3dr ϼ".(>A[ϋh~j)ϥG|hzz v{{ 2'<q:Z @lذUQg:սn8 ՐǜJ|>_(4]fc d*2lRZ-ٝY(r\ũD"\t%yrrRV!j U,\333~bфQ!lfs]Atݏ?nnnJq /4D333c^z,VLi0X\.W*幹9BQ]X,1 d7_`hH$TF=B6MS= hXQ*...(B7w/P81B3LoN)HEQ$OLY5DȽ^ZTB4dPC`5A'ɨ~ vHu///K ."_ZZZXXzn$I&=TE#a~uuUTNOOI.rwwK,GPgI67d2i|>HȒHQtHd[mQ?| vkF>}`0zbL&t82 n|b@SBZ =8T>L5aUZ 3=R*Ў7kL&/F&p{{ .!G! [Z6a4\. Υ7`gL4kDZX4=*WH0<{[jF_3X@ڪ@e~~'s}}Yzy>G `{bTB�7*֪?~ K fƫ)s@~ɉ4" ]nRP l0|*aoX,}R˟'3@GYj}i$bcٛ9d fȎ;???55tw0`09H$ =:: 0TӧϞ=zO*f O<AT* OӜf`5 |0m6&@:ϟommNzr̖1\ (3 0k>㠪,|�oooB潖KR0lZo޼Merm dLĺi6x3z0j=5" ܤz 3&o"E$l4¼LI\@RXVs@̡#NϞ=|A>Wsw}bFA?q4 l6FV9??^zw 666d Jeqqqvv6L...ш�@5Mj x= 6X,677,|u-Iٗ/_d2nǏ0s:Vzii鷿o~Ab9尵p/Lrl6Kc`\f]UTc.c"(fϟ?c\U*ͯyK7̐\/wdZ ì OS h{{|)9Ik2~r%ׄgeeER/*Gz{Q L* % : o~DԞWwbtUc& V6̣Jիr|{{kZOOOݩ'e~ȷKQ ],WWW!dSz]M45wz. @�LkV MRb1! _}ME(ˆyeeh$ .0F< p\W7˓4GcΨ�Y*,Z\t:I"a@0 x~h8Κ&=FurrzFg#h,? `IZ C#8B'lG[^^x<r!vwwͦḼjz^"t:N]Zd2 bqqp9 |^9Bǃz�K9"h\.98>>i`،U΂- h#$ R\ïC!,Ztzn{ffvrfIOoLΨI:-dodNOOn7$߿FyAuYM,Bt:͊@R(- ,?[__jfKX[[$#8I$9 ae_pxee%uSSSNx [,sPrԸKIµOH*r! |>QZ3|B[gL(¯ !j `D*zyy933;/ͦD"1== }[.! Gl'@+&ǽZ*Cv{{bl6Z$#xאK?~xpp�))@ �Pl}}jNx<DnWN'ciK0ޢv777ܭ X㣥%agϞqzf岐.F"t:}yy p[ug'D?ANV fL$ Fm6 N)zҸV/84 3$'Xp~ORrrD-1.=j̠^;vCQ,帹 B߿`_5Dtzz(K@yp^+Kқ7o&=0W'+J 0,Wf24µB%NYX,p8X6O,aYィ�+*HR$q1yT$݈~ Fnlmmv17.t">{ww.$e;d2I28p8SL9r.&2jw^wjjejJ=D0h<Oj60}6Ls8@9It|= ^]]{ :X$!X?AqW@j|ݙ0v{{k3q8 lBqmmө>C;3q:ҘqlzDdtv^"9.& G,tvv&/FM@Xd'I {ccVQǣhڌq.z5p GsI~0dP%R[V'gz*=χa=ڃ~VM"LjN{]$hx<Cb_ 9mllPxا!JV~[ׇ4Cߍ 6'<* ״xq vnKNszz%W[˗/~ooZ-qss8*�4 k! i:d&F`uQ}|>cI}Ɔ!*'om691AN<dZV,3_2? 󅹝1t;ﬠh4z/^Ǡ KӲUK-|>wµjWGqFյW;�Ç}&``nG3 `ٔZCy`$Q g^gggzEU2Ԋ Ip~c4ԃ^`h4Zq]<Qj'')^P W;n@ 0ea x{{U@|I"yuz3gӧU3^. ɹD"!MGGG\?88 CpN3J]\\T?לI{vtpZn ֒hZ{-21wCʆj_|vGonnnJMI8mUU`d/Y>ma,I O NN=W04!ac7'͡Nk9NX񌣶z޽F3mxE,c0@Р6aF &ֳ3óK?JzRZ>4exNCXP(DN,!@ N yW *!�z42<[I$,F#_78'jF'Jq$JRT SRh4*JH 3QLOf\h4"< j11A 0E$/Dkq :s/[oy)3}&r҃T>Li1999%Z.<ZȃK? W:�v%qd'_+@6YZfՍS(ZUhMFl6K�z;S.A gjYMXSk|?ֽ暯TQG/i*1ԿbKcDmU.ThR P] z_s@˧HAG( hc04 x{{KKLlxh.G"P(D7߸\j̔'OB1(չo$Mrww7;;t:#�F]YG>zxݻwT͛7lv}{{l6 YR!Yr Iz%(хpX,,35bHT*!5+�9xKlFVC[�- ̀TAkO4XuT t6H{(%4 b$yku:d &2M38 p~.@*(BV fV.x*jRG6/ L𚞞Mp( �88rƏ]0e!Ucy,..d2wyhmE!#q:J$?j$L\Wm[jrч5D"v%'NP(Tn2}>M,kZ?bUA+2g9έ-ڟJT k6n7HR)XiMO>=>>(mnnv]»CP@yPft|>q^\\|ųgςlʊ<^  T.l[dQ"-\8sQx<>77G:"w/ (JQc: 8� ݸf?)67V0D"EFf/zp[; 2l] َ7'5E~-jP̕`j~5uY|&4t</@tiduܠhy}}"] @KpgkweendN&#4_LG}dT`CQ jwQP猔2jV\. wwwBU\8lI>R)JW_}%TFvT*Y7wp 8|,//~@DoX z~ssٳr򣚀"CV^4 h# %I�� �IDATN&* %R_]Tnoo766666YthjZKt:VR>==TK0QqdVah W8/S])Tx3 %N*mSuzL&ɉcn1Ԙ,ݾ$iU K SSSSLD-e2+++fCj՚lsRE?DT S>]]]UËĎFqvkVWWsÁt:b/j=߿Օz\"H1N*,ɺaX Gw aLXL4^sss*SiZ"Y[[S#4p8K-psB)Y8F)v8rgrqVP+;vWf1(Ke=xCvdt8|V(�`rD"ku[49W^R pH`Z_|yqqDDz&4H(\]]lF  D@_4y+(3ꫯ`شZ`Booo///>:::>>)Pup,,,p`x~^Թ霛;88zIP^R%fy 8Lnj]H, h4J= YդN1q/";-&2=6֤|Q`Rh4ZyHRǪ mIv^]]BP(D5=xvvgffĉ@7]j2AZR$QD}=gff  A^2voCN+ $ 0ƒ~첚w &7p8Ţ_@ 033^lSB΢4!fOe9f innniiiuuc? f4*ÔE 88qNjPX Ytjޞ|%i*ZjٙfC׷x<Jmll,//&VUכfxٔ!R=¡@ H `0FnX,~BGT�LBF?L3zM(Gp8t8V0LQ=BMcb.@}5Bw #j<s&)!q lGx_u 4ayX KiO9#�Hrm-Ql]-TM)J afA\U7AJq&=R>8K]_6|\!pXc3iZ4hߙBЋ/ (iKvBs,p8&<YsW* L3͒ ї|!/S %vAiV v;N*~(m$I 7V+$.U`_]]=<< f,#M R(B3VaDgh{$=31{No%fYVL'v׌p8d{x~_$6nF"4<nrF"?.<>bb C$;֖-Vi0aKPd<7afLR`0w?}^'^O!W'''&x^4 C@t⡏ThhAwvI(^6Mʎ[m^Fyi RdB�qP7Tae} @8ld.U,KMz 8͛7DYk&'T*@<$ZrŝxO۰z= cX2Fh[нnA6B%6�7Ԕnoo@ׯ9C[2!)FU}jWWnAgl6ͽ^�*!2N9 21s`''24pes '<NC�Im!KC=7Z{UM|>`B.hj1[jFJ'w*k44iHv~~~||l>^z\Pjlr\3I<T7jiNB_UUK&9aM# G\Pr�; +cFpW͛7js( @ YH, OT6ommځn2<B|>fR,'~Dg>Gn nիWz`D"zxpp@%ZR 0#{yyX,W&@BAF4mgff6y<jbՈS)ZR)5PzEpdh>q@(d$b۷oln(6n]!RᴚRE ujk͑.3םg9ǑWK4#LB#_~?J O?N~i'&t4\ I(T4�/5Tbh? ժASE^|F fՑdQly p?7˩1͒$tY!jCR[Մ@ D� 1(r{zzozj+++JسZND"_J%Tquuussspp@8TƋwiZ`0@<h#HoTnAi7Ƈ"% ^__omm]__T96c6enIL`0d2\N/Ҁ}11l /Jע~!zrx;`0@ u}UbW.A! exv'SS 2 6nT,ONNԣ![¸5{{\`` ՛?tW W]?<55E-r`-8kX_kZPHRN'R)A٧D"fɆD>YNID"8#fY]! GGG}ac[䶰?Xjگ@= nG^r''' B JPT݊`08߽{jnnn t̙]0ͪ3DU<R4[uBɧd2(#ST*EB0 "2NFUU/&8cM̓.Q[K%+|7bQ_]]d TDj`J[ bnnN1N*qC2 xh| a>;W(U?>'D P(9Zlyuv"IEzr4ޫOjCjz=bOOO&FiAz= a%�>ʈGQ4�51H>{ jO(:BpnnX(X__o"Nc;77W*@@ "Rݻwwww\j,H$ҋ hKbYMn'pF* LMM!#R8G1K2g|N�Ĭ`!b2+\;Pj>yҸkB[f!3KR42νV71& 32LR9ygXdYl4|�z~H, : AFÒ-ihL`K~j9yzE4 ?S=$1лV%cd6D t2CALGɓCޞ TPVE:K[@/AQ]:::bi! rM=?RvSiJh4}a^_T*BL& @ s�[[[RT^:igjT*qNapYP(iRup8 hzf.i,f im/�Pf8~6EvK5&gjE[ug js2uYbg]K3orsm]lv~~$[gnN͝/o}Ws| _~*�T*Sݵp}%Ѥɟ@h\r|zzJ^6jI#`UP>Dƽ@ \1z<S}۷l2X\\ĨYJRWO- O>GLMMIR$87op8^\\lb](<Vuggg4!%5;;kZn7qd}2L2moaaa~~FnV ф5JNÇ\noooqqq}}}zzDAgx<h)%D:~\zEr-`SUh ?|>IxAښG|lF"l6TYֹwbt:c!>|PbCȴ߿ d %lhLЭٙS{a7 }q#0$-d(^KT*!҅0Ɔ!e]OX!d|s X{qyi& phDE/[<:Nf -J�_3d26$ǏUmbUiT"~v 3PV!fuM<U¡"EJz[XXt:HVbj/..hsiբ + D #w~~:899T*dSGIXVٷ8MBd2ĩT_9;;KmKLuRP@i1~ХA#eoaQ`ib�/>l?*#M|RT* f5t:}>8%b4@p9kbcۜ&AhgKKKVkfffaao wGEYg qi=#(W՚ 4!,h8y+y<5@<2@ �5WcJcyyR8N OZpʑt4^Csyjj79)؇@v4-.ݻwD-�A�R 7.tj5q~~fx<PbP(WVѕ޶l*l9@ S"d2op8̸\W^ecݾa Y^&.~ە@ � S  mϠ `WP8==5357T*~i&l#\mO8PaIq|>/FbIo";`0j ߂OwwwN µGh&IN\K&6ٳg].)5D ɪhIU ti40q` {CL B:,3;`|dgj&WN3 1D"l�|PtooO[{$nb1*`Vm4(Od`= H�<5 jv)E36 T]\\\.2Cąr\4D"V"�uqq }6- !#;.b1H|>o4%ICt�눵n ~\X&o~o޼t:@5 BDӶZb�T3fB.µ@`5yjgm1Fv)hoakwwWXC�h5;;;,H$2a.u&Xೳ _ESJ&Kӂ64\fHqMތjRL&nw&!vzǝ='`0Aǚ7lzytm&$`*7<`88<<Dy&\@|IZ]\Zv fxpܼ~\.Ž="{I5%<~UK4ɩxjy* e7q8p@h$d2)ZJFRrlTH$B|g|xww7s@"RG]zDP(,,,~h4j>+v?J}1HPl6KD@fM.@Ԭ5CѨFá~ϼ 1 Hxz -%LQߏ׸LwM3ls\.v]&}~ {?C=p{$ZC,[T*>hloo#6 ,j(Ԁp ½evذ|ΰU=P)QZLr`YXUEER ke"y˟I) [ƫ^'\tu"�(tBAl~]ە9}zzJ|zww% 8w!\k!V(KU.Qx<NsssT|CX,t:H$h:f |U{`gT*nt:-01 /#*BĎebXtl9A(;I~IV~%po+JQR?eg5x_L|UL(3MycH[iG<(Ud=̯p!�Y>{< J'>|`u6p0UKbѧm?샪9 O`P>'US^~SSSBQ"8u'#x  `jQx ԰l\.Y0H/�Up Df(l�m6vN4@J |jNd.//4a:g{{{h\. ?DvdrvvQѸB or)zΔ K:RK ZD U#wK៪.//){R  ;֔VdMkj~HAL0,P9#A4T6yllNԔzI$}0}sA&=į4u\KKKzE*cX}w}7ĻFܩ<??W'(a8uopW۽yΤoF.D"J:LV.\obgggbj)HfeáIk(R9`0VPWϬ*:ЧHRz׏(](pr6+;;;Dɓ'lVbvԅr9aA5[n )@b<y-ENrcchy^F8NF~^H$J<y"G(CRlFH11 4FIZ25kuyy \\\綷>군�jB9333rXd ?.Aɉz"-+++I٪YSiZ~ -ԍON_֟`Sor'n~ޞn5L4>y0ZܜV 5?4u<W[~!N/,,f['VOsukD4bLܫ㨘Tꪆm9W"Y7߲:nD .-!Iବ)<qmm 9W #rx^>TV]α>kkkpV'977GU�fCi" d<^˂IW}||ACٳt:}qq1ܤta j^Uͽ͇BILV5  V3:( x^n5%zzzzE| < eS5P .!F�� �IDATL<dr1زY'd}By')&2.BbYnw~~^_A+Z<SLIT Z͠:zj"m 54 /'-%>~z#븝)PiyyyBqi6<DIKvfTT N* *̭.//;/^@ {4F];;;KFD[]]|B㫽CIATh4a6n޾}Kۨi6@P= ~͛7bPpWH)ɅjiiH#)Yv&HZn7ѭj*<2ENf1j ].eFn.P7@ƨX,~WWW n{ee߄> ylN~>~FgggC#uDq"(mmmo-MПj=99t:DNw޿0( K/KN~ ^ӧ~ggg.2%脫+lj*rD! ^jO ~~@O9J6+fk2@QS5GH$l6�8=_}^1?(a490y)!"x3iԓ",hA8SNPyh 1S=Җ LL\.zSGժ{̖ nn@6M y!O OjxNx<\hkfߒ`0jD"jTM^Dey&~6ʰ|S�@5mݺ/^$In+prv!Vm*4=8[m7M6ҜPrx<<$|)x##awzzZ(666(z볳@81n/..za`gr:n^¨<xv~=^__x||,2a<^lf]r9X_ARt]v;s kkBEM绺'5q0.-M\vݤ3;N:߿N%DPnI.8܏NGl3䇁p5 &8#e1c1RPMӟCkPCRdMQ_byy9櫱qDjЄ 9K.V -m AՃX^W> 4S`0(wa(TAf$Gs8VGB4o h$C<55,T[!t}}=77}>֖i6 qzz&- noo_]]CjQh4gffΠ z[V$i6ϟ?,R`0Hґ" -e�_>>O04R) O)<8$ԔS-4dYVFP~2gAN'Z'CK6c!=+<nz= 8*zD+!}~o"㏾ VLG,Iݿ92#IH]#0 aϤp9HUUΔL&[$*ҁ]A$ǤoՏLHe(scJ]^^z<y)Ի񸆳H$ z)1~?33HhUY y<ٛ$x<Ndzzn_\\@t:"Q(NgՊF\͛7~lO&VL&CpB,p8{fggWWW![t]#D#Lr$hVaZZ-p,nc(8??l86Yd2I�s8̨=Lbhҥ&!jVYjg@L<mhhR6-[LfOoNqE$PF τ壀Ӛcp8vttdv 8?"�jݺxpp>#|D3053lZo޼fzq3j�"yJ׻www||̦QrDj8KLMMuFmϷ\aBCL6%@F8&z].YN'Pb3ǃ gggd"Rh4J%xVp8\׏)`BTfR?4q[ msI5'~s BivLu*Mlt6l—¡zZ!4V`Fju~Iӫ3ZK|cGuPÝIpv?|6h'TT.777/_\__q`.ECH-ְ wk}D fSS}.3[ԋŢЀk!�J3dR8K@g lzBޕJ! dx`MUd2_r\.f %3ڑm8T鵵5Dm6/e lZ}$6/_jbVk׋D"_Mu~~^@#J^^ORrpbTDqAXl۝Nyә{v AzRKf(G}i/iY J6O qW(T*X - wUI4m 4~n١bdSȿ5uCM*`j1A\P{6BÜ*HFUDI/O0ɖP&UM}3|>tW-}CAs5p[5^y:GhUW /CdpcWslliͬ\.g2Ɯhh"> ]jhbZVߟrtt$2/~ fُ?(Ԅ8nᰤbr j0Q;d2Nhs4lf0mnn.σg0+! j߿]K 'd|$4әJNOOz#n2ut|>Lt/B0Jq0L,[VWLxH$v'Aj@,Al:߻L42\RFWnBP(8QuA΀7l<\Vgjy5t:́f, ފNƽ)M^f$]x< 1qMZtW5B}kN/<_ &I/w[ 5f>dx5^ꫯr:FU~Oݼ:Uáщ)ݮP4J(͓TM21Ѩ( Ƅkfzze~3m{ "{zQhX_64(F3$a  ]<Q'd& gw/)@1?E%I`eL&~]|8B@v{ӱX,= B&Hnoo^oXvh4T*@oo^xzcjD" eٶp8T*~lU xd>tx}шkOnw{{p`{vvn@ _x=LV+uH$h4ӧO-˧O:9C+b9:/'xXDEL4Pw X\E Z-EӸ\X,kM`c' Ɓ}Hs-0_D�^|+Ā o rpp8 :0{N P{?Ɔ>jޫ9$0-H`4rfffrBfہFL~Azf''ZښxM^?Yd}h4jZIto~V%Om+TI QP&NJ_xNb�G' '+ OZ;(POdVhbػwdqzzzqqaٞ={Ũ<lXbl6n/_xfnnn^F͛7\OHӈc B_&xO jD"~hf-oJe:nnnZ,|gnܤa27oQd2n\.h4 A;P5S Vk0NXxqן\EB EO2E\jF*�`90їJ%Ee̙b*۸`3^>5aOd2w9o=  vxP,hjZߥHtT�XM&@!q`+ON@ 1 _Bcx|>A8󥛛;;;@6\ &?2Ac0ք7cHy Q @ÔQWr`�H:ʹEH)E6叉y0x^/῾www18g`{;;;jx<JAFGf ã#8$9y;ͧ#4~xNNr΍FVuuu//XCV=}ݻw8Nu#6773 މ 윟SHIӘ|/^�O )GoTbb(znP(d2p]4tK.μp[AT$|eV0A\.-RS<4:t={AQ(ń'smpqjޠW! t�ԛjN:Ƶ:Λf@ϗU[rZXbSf`NSqfY*]"y@ mP\? *LPWv,[ZZ҄ \ß�hp-"dFZmÑҔ\|E!+ϋFZN"QIfmHBNȸfc#ǝ1VJg�i\>>>%H0xНJN舣lrVEg q`cاOp5l2t vCWd2@K8NKw:\ `@ p||̉n\~ .tZZjδz^(0BTLbPm'Sv#Z ձbY"Ф(6~6JDQ߻[V?AQFE ݾ r+,rɛR5'p84&?>:bM0+tk]2uk0տ~˽MټR0m4[o$.F7NONNfYƋju*^^^*t&۳l.K} Z*lhˣAJa&qoD;\ZZz2 VdZ^^BޒE"dp8t'''!ѩs\d@Ch4Qx<VR-<Y*Eu z^fVz9??- P^j56Siwy�:hZFN- 9/_9As !?/.*<䇥3@tsFXtv"+HGqClAjZLh@֜F ͝f`blQE\ӏwv  -lnAGLC;ݽ{gihA⠪}|xwy?_P$_Km˵xNIP:1s*lٔf`ݳ []x˟.b/ KWP(BW* )DEa7/\.O^ ]B@ज़{{{(#P*"*J"n,}{{+@DQR.ߏ VnZV ]duu#(|>*N;0<C`0\.#"Pϯ_wޝZ-1gH4!m<J16tt:勾 ]&)r =|c^ԡU~h``8NֈT2VkVAݼ{/H~u4^!Nw5URF5'<[ŧ-Ht4ɕ<CIEIR,3FƬȋK}+KS~n8OhCM?j&=~(2MϟI-.U^JL&j0FigggHjB!4.׆!Dc8L&u,eyyl6f6奥=fpj,CqDFOOO9t=fBT*>lJs [x$SMMX%#Ԍut^ҿ4*٪̄%kZFU`Zh4:4hTT*lV9((suu%V|`ڊFdH]Ke:ROt�pe+R?ތd�y!v)5xjCW1m43~7B%@ywo^o06(Nĝl6x2&2*>~p2kRMP(xjHb$A.bk=&ˑp1 Bzn@@ 8- ( ۷o9@HS L&f#'''~l6=ݢnn*OgggA e*bP(jVf+SDC`^T m_+ q)Gc 5Ts ]E&|dl60:n<RH3ƧyTiB6MM~Axߞ}5ԣ?%ΰg-N�VRo_]]j+pHf k<exbth$(c_^^T*4a :g`^)d<'''nTwA)fn7h.0q!z7"8J+yPSC{ʀ�cN8iŲO.e0h)&p8,P)K=4lfkjErҚ$q|!Dp@ ҂ j\Ɛ"|-HOAX&ab,ޢyBXаP(DFdE"Wڱ((:UWOzޯ�(^t:e<"Qzq#& [03�[򔂰c???GR̈́|<y$O#zsxl;QEhX"HK!u{{ ہi-x:5[ _K f^/Jkkk+++[[[i\}e4Vu0zlFQ ?\.E슑݄xXn}0|U<G`Hŗ/_xKV[[[k67M^O�,S3v`FhlTUjĿJUp8 Տ=??w:@�lENo7%jUA ^WWWB!~\Akt@ R< /俢C-gд}5L,MљwjdJaxfK_ w2xvR|˼I=jZ?p,//.Jᐸ T<ŅhBJ<+VF2VDܥRI8 7||?#D(D/\xZb( �ooo<0*^__ f\~l(6ct~~rGsq�� �IDATo駟PxQy1<YMo x�ӚfAd�Y__'<99v~t~ 'Fv1  b_5ΟjUp8 nRt~~ПY˩6рZH[=T_ v|FCe_QsAPJRwsd; ^^|JUS) Bhi83j~l^[[W1;Ƃ{,7>{~vE 2/r+-Uł}}}]{2ɔ:L6|>zxhvȽ),/ !\vȖ= лBfX*cokZAX|HhU:o<uo+666p'.Q˳gNOOxh07 ,^D뭮~ܢV5ϟ?uzo޼A@ �tI~ȇ @C(˅7RJ xM>x<cD)'>Ne%d|- jZV,1dȩ){F#Ed`4I45ۂhB!En^JvƐ*B@=g٬b4C@0dh4_BKO4 766.//e4f'O\.WRt^nuuyOWkcv:MӛX r.ˋ025Rҧ='\#V(.. I0U_]](K&  �'\,nwV;;;Wb1_qoM]b`QLn&Y}h]]{#ϟCrKN;=dZZmuuR:99v1F"*۷#0PX`XVt= d hX?{8.zuu"tp VWWgZшԀݮ\ђJ>}b uc$v.(fn___d2 LY>(RRl 9mȜ;/%dAjjX>+6fzOȎ`+:gϺn.CrtJؠnnn|`hEF<^B bD1&6poBL)f0Lu\&Η<` qf1ie%%z Vo*\ KVv}yygAg*ZM7d,uO"亁_2n;Riz3L@ Pq(@(///;o؎f0T*8Tg4٧NNNF#K i4hS�)EPF,u|v?H6Dx� 0dhx~<R~X,2TR~U|X,LID";̹.DFA"SFQ)$W&e&8rVwN?GFQv%VobQ =į&μKlfi6 2hZ%[F A7 ;$YF:dr:BkanUۂ{"*)Y̊3XS_@`kd8+.흛x0 ЇJW0kR}ޠy.P]?s}D@\P?\ժ;c?Bj$Q^H֊mBFXPh vWg=V5"[(luV, 2U|5*jg@ 0[˂+<<<݅U?}H$z"$t:JyunpB{tt]z^ɓd2|Pv̱Xv##ڐX YmX,TH~q6j"[@ʇ�I___GQ'G:X,Ƣ@x[Ƚ=JhD։yq )h4 <et#Fb1{< yC:ԇ<'2z?b*&bfEWbϚn4lxLLZR .ջT iZ7Xu5yzzH$2NCyeۙ>O ^__“yָjU<~ ^*)Mh -WP &jP8H3| %!L0hRj M(zry6B!|кvNg<38gQ۷lho4?~W>�> ⁊YA;Ӝ"s8x\NYs3Y…-drI/߻g z3ju<C6P8Waǜg&P|`RAc-ΠC`b,5)~t.j�JH Q}Z$j.� *6bIkVYLPPB bҋSKD<ct!p:P/*J PZd<5Rb<t*@BwM_%6+b: j "Ap1ЧO�#d 8==-K(`~G}O`2CZZZz`62hB1dVP@7=hh4 H<tCFdfL&Aq}}P<4 ?`0jj"J_YEi- mA>W_B.a8VXv]dr]qɡ~yy)vX,nчt:M|` WzϋG,zrf#sup+"eyRuWy8 E{ ԝeĥ;[, SpDaXP1Dӳ,j-f)ޥJ(l|yu!XC}Z-Ԛ3P尗RQXYY!R5\FAK7Ɉ:s@`ccCXV<ղ\HV"v fhm6G'\Ð* #vF`�N`C8fTBh Bkgoov1T p/ P;Xp>'MF#.(m/ MX Ci<ۍSm.\n*}LQl r/@Nq.i$ q|rX YaَRLBDoO>HyIK qS*Bx<?ctfs8'觶~XK :o׼ Eg^E=[_'U?;5oXBz:$\JB¶ZQuncq> \d.*X] M{MڡpXܪ19)ܜ'%^\.LdzSܞ0QrRKZmllLӕv-)lys'"q"lI@O?cT7R)LB!`*hiiT*.--9  O 777@bwn2h'0cuK1bs'v1d2>~PQ\vP7 T*p ~)R)P!`uK$CMawuu WQvn6h)^,bT ="{o ù\n2ZUsyyŲ٬Kc9`BS1jx<B+ɓ'6, GGG^Os-h,;`+H?ZW.f3b;/̸-|@g'\tZ<( 2fN+K.--e٭dxx oא@vnw{{&a~̣A<d3ɈH8zij>p8lZ\@^čt*ձ"eF+iJӳU aQ\]RԎq4h4<ȮX,BPL&Ddr`R)xF^N)p8tJ~9: FcWnnnhln6G*r #& VׯfGp8øY`0Hr\BFc FBPIX=Q- +kZ*ügjVWW<;cM$�1DK'IZ�z"@ _ՉHKKK}nG<T2|O)N\.N߾}[*d);{"1] WjIW䬈Ko `Mտ??؞dh+N8ġQxsa . QQǴU߆>֥X,)'^6UTҸPѼC1"=Uwonn$@NKKKwm"dlE9,&GO>H[Vf oEqO&c> :R^??xd2]^^"Ӏ=CO ^ޢ+Ȝ`u:-0h4v:x\(Hl6=zt~~KC4LZ-͛l6St]dƇΐ0!~].u:FQ۷@LB/ }պKhr}}H$(ūS\6]]]aPrNNNJP(3ypt& Z$RǏ\GѲt: 84B uг!Lôl=ULBB9?ag/,2Wۍ8<DܰAOh?~?~h6[K|>B`ɫ;[$ag~~8*Ҩ?˜"BZJSD S2 /�b M\Q0m Tpfh4noo}ũVJ.-ã 4ES]j췫> EXR l2GţqPոrS80 (W ά"7eܕ,@d6])\M(o4PLa9v]X,x+Ǔd޼yD!2{/j޾}{}} i<O$R-GVZf|U``dp>>>b>=={{{eHhGu<6 ;`G$mu%%l6Fp4&HRl6v;b2Bn] #v Q'Pp$DuW6aqii !Zrptt$Z2A<Z npXVjm60̰eh  Wѹ@`U**" ^~;R NhT`$**J{0a`M-qdF"l6Csá4ޭX^j?̚J_jA8o8NVkfEr7(f�X(8fDcs tXb@^ņDži5SdEvfsRϯ3Ld=1,hƕsЬC(SXZ` 4L?N8pprص+ʓ'OnwZv^<L�"l+UP>Ǐ-. vP,Ŵ`@"~~~^V3Ibv}RR\9n: >O(AX<D[^.//0?nET+dٚ"W:$\x恪*ft6kd[]\\xz0MD")e4~Z=88pz\.NJP?N�l6LXD¹'I2TCtEr);SVbg[p4tJ</J[j H:\rW1kzCȨ6(#8ͦ( T9HHfu/d%9D^bAzl0 ͦ|w%>:88`?t:{{{FFonn\A&49s*!Z TrWU*rEd2ih4J|&i�o߾}`0@c :p8jfo:Z`߭V+|- @GF=<<@4̅\__o60`Rf;;;dd2XcFE"+#xc. O_6M"p8 ̡"+69By} }b8;){(J !B>ꠚ˱L&S*fa"8??Ǭ˗/<{l$ jb�=;n'򸸸 ۭV+/=xCX,Hf�1t*9l֬KLZ,Py/=$ׄ" ;pE1(hbde|O\7PDW</2BvD"WW딪v$AT~Hwa.M,x})h4BruX |~{{ҫ+r%:L 4Q""1mB˕L&bL&@0WBdB 4\9^/-1 ;Jl6 hnKҏ+2'''@R l6KqPFc8(w:T`/!KΑNIq 5/xي !_᫚&h^PZlXcze4 bNNN`a~: PV~'RԊFs2-(JwQ h4b1HWV exLYɠ|>/|-/ͻ2l;1Vw5; H\]]ᛠ~RZY`YNA8iӧO B2 `9ΐ9BB0m(4̣~/Hh4`w]0E@3[fD5T*MóGGG1/>-b5 ?Z-@ )t:7VՎfcPN` Lbp %DR&j*"sׯZy$qCe{^&! =zDH>};^IO nS_:�bk:kkjHzx K׾PEdvuBgyI2f#8WCa(͝KR1*9ni^?h"ȋX,|>zzJH$ 0xPS|tE&tIP! uP֡a2jZ;\EŻ&dN-sR^'-HΤs3HpJ$1LHswt:L�Υi2.H +^WF t}N)͆Cp8T*tqQ%tȰZAZ$s@3iDp8| 61N)V*ABT&Y0,`0TތFWB\e>@:ݧN,F�I(sSNǏǏb,ץRJ_]]saʈb}h4QlEQ挼�ٕirj5( Wx<MXmA8D4TN΀fT\3wnAj[gNv8~ZJSF>d@]:XyAA)м677~6,H$,K*(`pcccss S.f,EdCQEs<%Kr|ssspp0Lp}ityy1>  QuxЉDb<7 uR8` u!傋@q`<, ,QcR}8�gӉfɤP(JZF- j59>|v2jxܤd"AM[,_z޿ ~6mmmBl6KR*Ϛ~~&iۢnK�� �IDAT1BW>wuuζ(s-zR|ѣG"p8X52q[s[|"b~IlJJ5(!U,vwߵZ- 0F#`kk+Jj&I>?88",b[&g i,] 8޽{wssS,pXa;+KU*ҡ+ v, ,NW$PŷRiccޞp¾&Zlv284WplH2?wmm8k}}]^x Y&׫W3鋂cZo߾=88o-f]bbccjj52DQ\FǏI>+ R)~;'O*ﮮnyI w[ׯ_J%zS /˅BH$ύFcuupHjX:ΫW Kk~t"1(N1)BR~ W*p8fpii 'y ] 4MA^NKxeFټt^|Tl kOTt:![[[?v:"{(.Zsi/#[LRiJҧO`|O&ـTv;晥R u!LRKbC=ZqVBq2)vރ^v|0_q<~'3\O>Vqν "QǏń Y,llly8%Zd2jZB3LTrj=hpuuu4Rs9666?MNP<>27/3ONNZX?ɰ4+d@1t(岸T*[sj=>>j777VuuuD"ѣh~H$`,,pXԾkGGGWWWH]]]mmmmnnc3P(.h|XvSd29<<D"?HSV^6X,*~xLX,Ҋ�Hۃ@nYb6z$[\q&IIxn6OɤpPU'X.tz''r`ujֈb'd~NL&ٌ,LHʆVݲxy; }yF8>9` ny`ny}q>�٬S(|>Ž# 0ޢI%⧮/% .HET.=p<bS8D:ULPܡ4AA$d2^\ya˻�x ~h{{v JT `0èTbkl cmZV4D$7(6 a%`ii) q>H2m.//4%BLᆌo$* y<MCիWJ%z=Ӊ.PɔN|>j࿡.M߿ORlcssv/xb1tF�q`$ /D$@#:JLչW|Xt8 4L FM#7}pjjna-vjSlw,6Z,ΚtZͧ_QlU F80ŵGp55VwtRל:0hiO GJB#lnnPysswM&rZVGP=;G6c0Kz<-xswNH$l6uڦgK' vv]?ird2 "Ux< y"ʷ@=dĈF~kkp8p8>|7}DS*<T� 3bRd۟?vx<nZl"{t:n r#~ϟ`љL&D F(J3LӧO{^'օ_qH']ZJ2ddW8(*t9NXj澎AgHduu@d>#)KLݕi.@P W)n: X^ŋ|t~?oDТsLa='eݐҿ5,>/\ZZZ]]Ţ(" d*) c:EA?Ѵ($/}omuu5HLӽ-˔wD%h&a9?Y| v 8^@#|7ǏM&,f9X,PNCĹX,p8 $ d'gjRq8 W~ RzN'x6Np8 u4Ɂ,6YʏzB0x<ϓ'O^x'I"$x<Fb\!Ax(! ǏOOORn6P($ *ofqAEm! tӹlٳgd3\-L&1v;6t:E!] ߖg Xb?g hs|etGyXqǯVEbp8&3nOsT/R׫pOչs>^k//V|տnoo*ш.cޣ;Bp@);,K:N|>Ɉ;9>>*+.T*b(b./l1,W*H+YE !_I2+nR#\.R󱤤w<>>V\TS#fKӊO-J"]@Z)rGyJ)Cs'4:'q69zv=H  gU^1G=g*]TU^T*� Ű2BFAch C.`~Ñ$Pfh4 X db1z_6,fqr XgSڡwc`0坝ɔfPląȵ\LK| &Ѩ?4B⇋O;;;#GR(VЂ \<쒵hYyV;&Z )%ֆh` I4E Dh4E%@lcXJ$:;Q.BTN{@(G[fj k'fL(+M)~yy 9pIXuVdB*'vd&@`ThqSu RLl.nh {yy7  `rH9t:^H+AhT*h Vx<j跺\3f%쌲0H1#Ljʯ>::X,Xa�)L&'&Nw#wF6z23@%֔ruwiij%E?|& V5dT*Î2|Q@aw*S JZPH .u%׮)_+Y2 ~kG À(dR-'_2udY�B8??`0VWW;]XpeUդ=i*v#ֱvAiM3AO-=B10_]]e$ 47@QB9d2B@@HH'''6X,Bdd:^]]f>o:"A85g6l.Iq3p9v,hh4NNN^~MUs:e4Oiƒ rP)6M<2ѣG$gHgM)jIP1c9ST0|-g6l6k4i`#l7^h4"G? D_t j74c,^NKb'$j!MEp򻮯n7i1md>rgX/Eq'XpjAtu\Hᅪ3d}2g8%ࡕHY]]%ï{ "DƄfjLS224CĤCQeRDͲ}/o"%a' FN {^ylDfa]\\b3lѫjfֶ~^lzND pxuuu8B^cL{. R5l1zu+ԕ5jBP\&'⼴Zht6vM4Eyiil B{{{֡ J&xV1fymmfD霞Clvvr`hm1.//6HQ9c6}/u5~KMqd2)\r &4/q[f`HZá}7_5 V.t83MNTք jjZ"Z͓i^!Uf լ3%9S3 cWX|///9hkTlj'\AU_J&tPʶeX>}v>OD)Fo8&IrYAtq2ܼ$\%#$e9f6ӫyTզ=677QfzT* h2BFN`_ XEzЧOz^$HRX:"BxN27t:znw8 ~AH񜝝}8,///G"Jrxxťn{{{77798WWW=-5#tijc]SG".e L|Jqԡ-C~kkV zk^;bz&AX}).,lP3Rl yuB²TLW1u9v'Ͷ/6IM3no:޿O˪ w8ՔΧ~5j*}j 2UX|%.2'LV=;;F %g7o>zh<a֒H$p.W 歭-p8>�r+[ѫ`ժ777Qjb$/..@^K3Edgg7oT*;an* X,#ۦin1Du gq<;;fo޼AWR� p8ɼz b,RǏ/rbuulgg`0/_z ^ɗh1,0[(PYrln`鐖-my.(Jjf$=' Mbrၙ&Q4H2.ڊ޽&s9?c\<!5?D}Z=o!ΓI6"!<*nC\eZ͋#MJXaՀKɴt:~zB AUbNSԼv;M+f!֥?-Rk6xsSz:;;S Vb r~~.b|�FCz\UHքE,xv(zɤ^38?O #l`<9BD̛z<tj6$p8ѣj/..2P+�PFje!)2N۷oyF\.g2o6=zct777tC#�Ո.k0m,V;q2]]]3DdhyyRijce+3ө Ag)1Ak^R?(Jλ! d8mApEQc $ Y;osX,o፝7OɬH5\䳠&ܫa4iY\I#> 0l`ooOv}vl   777|.EN@j; XZQ薉(p`Ȥ8zm6:FD)y3yl>)> JʝR.Q!Ff0`)4r{3yypxww H ĦIL "OH$rxx?2$!膳3`D^3ndkrC|ttD x~~D6,)elm#|ߟJ~߰�X$@A'܆/ݾ.y)$y`)_~EDjyRtSac/&@n|ry0QȰ 5NFi;d.Ѽj-bC<~3WL0\K4Cs鴧&9*ٙ xl6)%͗V`}zʱ<N0|8 f3~%GOR>\9zh!X:шd2YZZ>r D?o6ˋf/GrZF[d(`NjŢhp8Dmboo%/QQt:h4ΩjtjZ$d2wcTR(\bTh6p8@B i:YR"0-Qpcڂx<xy(Mӿ)K&#LZych}Z.nZ?/9N5dS37sWXhT `, 4x<SQ}&)õZB}ϣH� kǤ&AA*#>GO4D Pl&ZEZBx~?b!mb->//r90xrIffQ\ZZBB M6ś<>5|Ǐ4_u6`x�dl6GLwrkZ?~ETBAU.8J�JqhY(ã(<Nb[.𖊭3M&NKw%ۆ�EKf»@TM2a" u' /x8 ۛ_j¤Dp&u TְnmSyMBxR,~גSh4dMryOWǯ8Hl6+R|>1yG I(uЂŌ 'Dp+ ʫK~2V ?fK4lTe0UV|W6Ȅ 9_Qy2-J!_NRr� 0 PNOOQO$.pv{2yqqAIc:ܹr%9::NF(ﯬ`iv߯Vj3L&/я2L;;;fE`#v4+++k9F+ӝ'<9 `0xLn ǧh yJ^70Vv J_lsFj}9Axނ4K,; 鄫5fwI勇 ďB?s,vjvń'2~>EAc_ip)9R ʼb/?p1cmxִ,ZY NR\.dPV4-8fY,8@ۄDR}ۅ�CEQ$1`0�=N$*TޙpfTi=::PP vλynjU51:~lDx<T*`[3@X,HfۑHw"ŋoC^Vu hT 4[t\,Hd61m,x§lo�� �IDATL[fo*v-^2_j uB-WaLu y B6mZb.qzP{2jZ\|>/'U2V5L i0ӚjDw9S `b~mԥi&J"O>t:Xe!Iɤcx~LpiKR#oe@�rqj?(|i0|ZMDAtjpf2HI> ? F'�L4tmm 9?bx1<WWWbqㄋh,EJH{ M T0$CEE,w|X^^Vb(] Ryn) m $L6NyBǏw(}& VáFtB` 5QT zsd\\\<yDAi+&7OO^~mmM}>IXs:bCI22 ى⽡PH&-h$%˸-ro>Ɉ}X,z< ͘dB58hcr/,�Z-b Ev>w8Iubn?RIк=t|yyG,ѰVlّHd}}}:`2N8"wZ niP(>XO< )tl7ydT``(.//_|z܄BVz7H$ yrFv3a@/^L&zz}gg "7lȹpn^`&x T?)Ą64KGbx*s/eyZ"֥(u['wrr"pX"`Ƌ>OM5hP]Es\.SnyG?˂ (-U4A UPK0,JTuY �\8ǘNgjvvvSЄiOS'TܹsyVwjf2nG+߾|~~cU|f#jfX,>y$Nttt$CcWVVww¯L&].{ 9S758TaNNN?~X�go[<\.W>Vb,// $'''Pͦx|u2T*l6JT*zR4  6łX8ZV6FQcFY޿_Tnnn>9#[~bqRשTH-dܽ SIJ{W*?EZvvv&h \8YDe?-@ P6zuD4hA�ׯ_3x2׎].W.Sl O<aFp7-&ZCRKzPǙ,//0t;E.$IpD*ce-XbvdRal6C!W@}9ÁNwQs2pYբTlj`_ R}!/qlpv]܌zW'ht:{ 55nL9Ft:=<<92D'bKl`2@ZjQӡl{qq?ndVWWVIfd2rJ2bJL&SVҲ;"FQXB!zDRdXvvv(f*Sl6&־<g[ۍ:�wGM(+QٜfA? n7B8*꼬~&_܆u_C_pcR<yf9U*dZqn1.K#e2H a �O1 ?U/n컪z(G, Mvw(X5}JiPٙn_^^^ZZd<:%8+jPbqssp8, ӣ8xb.+Ӯ`uuFIv1bx%<gttˆb> dggjSt:d2A!47[ d;N,[ 12O.1|]Lx<bR`{=j6bZp8$sE cx0̃F"q~~LbAp4|>5 Q>5E=giNf\.TʵL015cSz l8TR^k:cXѠLժNh4&I1}N؂@oQ7v^@�oYVbyf?~狋 vvƃB=W0o!/{Ӊ< .^rY2XLwit5XjRSЄ6~JBumLS_x#7DKt99ʼn)(GNb[999АXZZ:Rl=Pkmv|^0r�v[Vxbn7x` _FU <A!0N%bWWWpU̙p8̸+"Vjn^j/_*^6U"|d27aGD8X3<~VU ^/@1F,�)0X6hӃ~:҃HOۀF8Y)Lc&ׂ3pX}`0DK{T:kG2S7(K{d2U*p8̾ٳh�^so#ИgC^'*Zr؍W)/x<J{Ƣέ5;xIDPN:֯T=av/$q@�6qOS[^ʥH3ߠrSѪExU;l8<اn5y?3L)^y GvÒ],]Ih&I.2t:T~xy pF mւdVi'?"JhDjKX=yu A F,V]=#zPt"ќZMLiH$xζ?bB5[mP v-yN94 4?.02< V>dsC3MOX,.P=,R\>FeDXh+8MrVVVZ�w^fY U!\n{eeE-0a32 ժ&^C@lNzFǯRGՔ%ի |sdBT*O?BF*("SĢBCK]3 Dfjh?wxIocI&J^^,$(Qʌ!322 UEzQ@Vݱz]?4@j跨m5PUYr 8LŇ0x9g{xkرs| h436H[Kᰧl$I[8jUZ )4p(V|**I% Eq#Z*n uss ˵N:Itez=zL"MgI0Z]]u̒uD(XMfbE*.K7n�D!B쇈h4rbU*׋"O<yi&Y[[E vn0�b#p2f3S׈T(Lu`bg2H$T*5�h4b D*:;;CJd3QMՊdzNO9o $鉳qkHQ7]__VϞ=1 +T B|>cQu5fs2xxx@0v@ @;Xdp\Hb"#777>򒈗绽8:Yvnf)J]\\3j*KA}k21,<†7k�38=  m_.pkiZHLN(n2 Hl6v{T�~EjH à!<Jӄ\< &._vmH#oXq`V+QsRqkA)Sn謚]X]\czTyE^c*D<{ @zٳgX{H0z<)On7!ӧO777#;߯멙`WBEl63 \f&KAD$IRZ__\.{~~'R 7P!pg777ԪFqcc俠C l<`($,HшO�WFׯ_4_`d}]zԇ( }nGYO>q0DP|O2KveԙhhP<f +GpP($ &4̵jEF;P-l3;PI|kO CK  388q YVPb�_/D�|X40Sch5:{\.O~zZ5!ŋk^oX,|-#Ł$ QmFz~{C6-a(4,sO꽽=E.~.13LCJ\15PQ^f!4K RARjdQ_\\e0FpUA E1\p^']z(Pz�,yį�Gy&!' ځaET% #7!dAFHI%8kB% Kb6~c{V+XM{ (Y3'TG}ww7 Yăp8ɤCƳg P(M2M|>a2D^�8yජZ[%0D`τvvv/p8DV5+.;Jb0RQTհ1#i0haIpK I.68C;joE,gc5RIg2&xooE W*Iٟ?Fp8Vm7 WMf~.t ^z#IdHC#٩Tǣe|�!NQd29::B2 nnnKnwss&WWWZ<[,,L&ä`"B_|> &_T,ΚA#X \h NCДDtYO#2͂ bA >[tR$IDq�WgɄVr|ssc6kāggg^(}ΐF6i`6z_b O¾1[lπr||,>P ZgN dѣGɓommpI�YQ(�tSL+ *ѣh4G@ r9lTŒݝBSq0GׂE 7E<7~xx:F#M-n'FǠab B}hmm Ŋ<O8Fmbv-hٽ^/z2y)p)NH}$IҾØ7 XfXVVV߭Vk:::B$Y{jth<GQdB%K�'a+vk~ABf)@vkC: h" r 4ZlSL&s{{ hD"H ^/L @ �dž`kX,`zvvI#sqss#IR2PUՓ߁9 >z~rrj]Ҫd4sO?eR9"Z<<xYwvv鳀9UX:.@Tb& H <jܙ~|Ac|R| luj-ʠAyT" lN.Bf,vgY�RN<3"�T �j |^/)^oڠs C4tARHAPNְ#8Pr4 mA/` "*A5`"W҇"p;6 $n0i^/�*j`$I8pCedLӧOKR2dJ>D"ȅ@+ƽ@I!n2aێbP```X�A7am6f#灳&rcct^4D V+bhT*|>G,fٌZ H[z*Qc,1dYb|`0@E eӉD`x]]]!?v)x:^zOmMx(5[s[C&*<Oqr|zzJ^o~C -,Iմ˲[<C bSz}StD!FՊX Ut*HCLgQO>?>�I$ssh4"$o(̣݃DV9+”ἝޙHM"~...xɄ*~vvV,Qĵ4^___Gm &\.C#VӖ8z'ZdžbHTv;xЁ@‘;ώ'O<yl6?~8Nq$\wAbx///$eXpdr8t5 y1<2/(7\>^!1ij~ժD"TJt:a J%EdY>j\<gPYhAd 9H+3gv3?sԫ@ЧYLK$!㙈IB4QiۍF#yhW,BYhT/$!dFP~ҋQoll~Au0 Htqi /q!HL7 dpH�@?d$ݣ@+豥`Et2r9r!U |,rH$BR !].b!|>2j@H$|xx899q\H#JRH7 ]Hx<-^|0$ËJr6p*."Por[y%9�b}٧G`2OU) $ j1Ǹ\ňSP�.//E1%1:qKA|^ed~g>W)^P(n-yTn@�lH�I@4"Uq=ҠePիWפ 4`1.kww% P=RЁ/gzaC@!2p~$cfЎcmn4؜JH5>&ZV0:d+jiQ4yԻ3LT ӹ?0LFQ`ޓ$h@[ph6cQOmν^9:}IJm9}?\^^ rX7)/.R"@K�.hl 1vf-3JmsIEXL96'hR< 8%R5k0= 8!j#ւO-8.&\zRQo7 Ka {eee0ND@e7kQv1HCO$Z$V Z0f3j!*0P[[[hB  >Ghӊ�|yF�yc,B a %2pGM&I!̳Phmm- } dL\s͑ 5N �!$xpX Q`sR-7G B)C3Li&ɺ# Y$s0g=3tY RL^pz|`ި{=S UC IjS)�� �IDATK8$t\@k'r%ภ,/dy\fv. | E0plC6NPh;c*]= ~ @'y2H$j,�C/+*&1`Z 3l,;N`N 0#�@ CP( ۨD4H$oll Fm0l>$(20 )DS4뻀f/{V}2_LMu\4,›ڜP7y=BxBĜa nV+Oe;hJI2 jE%T+6m5pM? Jp믿&?F/VG}tttnKlZ@J"GIJ^PѰv[h./q%XD';")q'ģ&8"z>f9 @>|;dx0: iK6Nt]Bj%xx<'IdBbJ-}HQ{h-H)LEpb$$uOj폎)fiK.AʯV\$۞Xid-s$/N[VČ} Y$;#(]&H2oNrw/hl6ßEV# ֫W~t:}>2m຺"``( l6z>vQ&%s^ڂzӧO 7"`0Q Jn=bs :LSdMcj4CpiDS{ ggg|>xY.}})bHO/⸢Fj†%I((IBp8f3ڹ-_=78 Z:l6ooo{O>dE ^y<2k a=F@bpO&^Ew$WKקFoo9i4^3F OgEʳ/̊=t:zYn8v !^j~bLj8"3 (.B*J24 𥶷 #{<χ:``iPD�ԟ47\T�EQٮzyc]DBP4`Z)H|>p{* he\ lZ,T@bZ OvHPMuNrǍ 7VGEPӂ#M̠R(ݴ"E4;ɨHt!eX,$!<&ߙi⢈hͩ>zgjH)a[9p<SkC C7p\J5IwgJqhN#x v) .v\n@(V1+~bQ,s&bn;ɼx믿][)8͟q[2 Q?e0SsXq4% n|@ BFpA\*hy'r!\ؙv^G;i4W[H/0ϑgtl|D<.1LN {VvCft=F�`f2SV@=P)Xs_X,jkC\kڲN@g =Gf.ަ!"6ѣGV n96'TiRsyy)IΣGyIt�*p  X,3Kb@ˆBt:h"HRDq@\EZEr^wqqD�VZcj1zRkj1 %料x|zzZ(ر[WU19�J%ݾј~1$C,<2wF= t%fڴp  :zT-Gez/...B\꼎"#- b [H\eeӂVhjg_ZϷ X,F"d2so'LC%SqMҐb]_@MT3tdڠ1`C`3Rxu/~ %:cGx3 ?>aen؇?YVVVxJp8 < 4RT2t8wwwggg~Ύ@k /f(m-b̪y﬿vl/xn&PstI휉~-Rv#iތF;t^O=_YYhW:Bmn.iz� ֒fµZ3@1J szBeA� :9҈F*B1PDoSP(<)Ym2HYZٍc$;_}E"8 tV%?~) q+~6J%a+&A{N5@jͦ~uՒelnll bv~뽽\.Gmy;oll|o6vkZ@%2YVHcmAXҹG_ڢwh5 ^x WWWv;8hCFOR^f4*^Z |EKt x<X uhVVVZ,pK$&M$WWW9bX,t:͸0|~~H$Ow~ƌN#3*LZWaF=!wssswwW^-먝JX,F>J "Fx<·@�)ڢ鶷-K&yѓ'OKzzHc 1=W=PީY4 $8?wk~ccĈ`)6ł\pn ;DJL , <:0f\:9"=2 TJ5A3TI-v<j^B0B Ks rnQ2VW<]]ⴸ(pxZ-Agzc{ DPX"j@쌖XNn2w.#n uIJR("VuqrFuqwaM:W $I=J$=ʂ1)KICސN ;x=ChW% f&*BdNX D &EH+c3+=:C-\DI)"WX~?g߷ZF//$(Vrup#]UBA$bF ;n4 %jH-G8r{;}T)n3UI dh4:==u:LM<>L׷K~;&nCo'o* +N3*.=<<|'vxuuh4nll\]]A,7ǵ vz^5 x<HkDB"_VVS\)Ʉ&285s BB<loo#!H$22-VB#DrF橬Ll6ahj777I�D韝a$"S<H9dIyƆ^I&!Ed2 ӧOblCO >YtLm3/JӑHҗ"p8666p< b~v]rpq3$/p岚sʲ? szzJlZ/_�\D]"Q}8wd>O1F@ٌD"0F["X9BF(Ȣ>Ȭ3ZhLpI+zNo/g?YrzYłd2)ڏoF:-ukk pZ{C/M˚`0TÏ>o//gz akd2 ---3Ęz @7 f_<MM4{qPJ-d2e2Ed2h Cpj8J?}~cT DAh\N (ʒ$~d29==U4_`RcBxzz={i>}hZlj( JfCҚGNL@"'ț۰gm. 5vƼ,e=€pD?,}s|A[jO.ͣ6gBX,'Mk\ r:�~˗~ŋlVИxQcqjZ<BE"AB\6'�*5Yqj 2јNՒ@ *DvFsfɲ,"p #AMb@}5I ߙ^BP;>>~g}F".>!O`|>E& $rM!і#tk/Ox^D"'1he_2.D0F` }PӪi0soAt:[׋ a4?nFԙ6 S- &HAVH 3UsspxuuŜn!4MFm LY28čZ|.A*2%„ƸɕJeV6r?h4Օ՞za6לN笱/2ӍC/ :n 'pnӖv@%h5ʌ ʂ{f0?Tem}!<5P]B(Id#Ro!A-CMfvbAJ,jo@Hk5mNH8Yi>jFl6˜ \#GnX,"@o bit: M*iL.F sq F# C&+`09dE{HA}S\itMK4`?%DF !"aZG(Թ$IH$meeTڈ8C|FQ`ҊdukY0AѬV B|lIM$,YHT</^Gej5U>{զuZ 0Gι3S0VmHj$V4L{H-ſ Bx_V"FUf֙d:G~K u^xKVTxpSqulp/SLM&lp-DZVԬrۘ8HRz.xT$kVQ<Z`h|TѨ!Kn˥4 ¯V*FLD�-ŁC%ҐbX*h<L4>˥FG-_̯+RV-�"&�//}&L*I=C0G5Jk,hX<y»;Q |<ΙLF-Pf4zڋ fV8BBzognRȈSр!p8,{g64� NǍ(klGGGTǍ =>ɓ'|p;4tp8V;ZjNs}-J=yD(r=b؃|qn Dޞ0f tkoP9p(f90lv?Wg??~1Ռզi+b gh,#)LNFAR*mU$4 Ϟ=S ;HDS* `qclxC7$Iz/G?ɼEqZW??yـk?x8(^v뇇}f�%I~XV_xAHoEk@?<<2C{hzjaY ;µ=H$wя$ŋ K2 E"Y,vB@x꿨-5P<L\.!d2zj]]]F#h4Ftªf \ټB}O&xo<7L777t)IPݵd2yqq1L:sN $2X`0WGu8m4V* o!]|h}}\�fdkK1Aj %HN7D"_A3@|X^e9HNkT"X,Jd2:::DZJ ].W5LEh$2p8DReh0bM&EnG/=@793p֌_l6["(Jfd2`0X**BS ˸d2aRزn\./ؙvvvFQ0 ؟]"3;;; <8%X*u:IL?y26^ɤR(.r7|NK$V(,([h}׃`MX,gggvl|gχ#1@񧠰[{yy %%Iž WQRHcLq8.E}h6̮˙ Ɋ|HUվZIL ֌F#:|Xۿdr>/LZ֝�H@MxrrVDO c31OfsފmR%]~o[yf `R~53z>w6> mrZ\.W.X,jw2sttl\Nm- G@CKY3$Y+*qma=pԧ@ZT$IZ#1jXK>3_,Hަ7hk1RNSS)$ �*ծ"MLwUU#Vub:L.#c* ,\.p8ő!dFÀrjm4777(>v_|fNg\v@ ^[ƥFm*&dWVV~ӟ@` l?eYCp7{ww+6\.>P\@}j|ZV ހ<F :Ժw\/Qp[gz=zdŅ܊E`I1; P%5"%m \^^ 3f^𮊟cVSRp8Cɻ?nbPEMN]nK tPv^x<t:}xxxoZ?h4Nw:_;N,D^^^�FEfAf3o1#xwwGvP(T*-M@gkT\*6 d)&ƹ3IT[VޚL?b@át:n7-Zj/AŁjPH+qL:zpqPVz;ߨ&X VY<)h P qqj(OFvnޞ|g$I{{{ k7778֪VvtZf9ki{~+TAmZָ,1",@{ Zөv-- 6 ā" Cߗ$h᰸l;&\uݕ*˄A2]Sce@&dLt:'B8I^x#hu Ut:l6`я~p8l0?nXtpVU*h4ZT~ CҹmRr&9* d2SYhiHD]kGBvſDfiDư;j-/ɀ@ _zPEӓ`0(r;Pb(hFM ZJ;ԲKҪ*X{&i}}}*y�iK&^ 5"3~jmAꩅH{c&t`3~I+*@eWaL&8>Y]]fP|~\.#S0/_<;;Ǵ`Hu΋ROz}a0t�5IZV[.xJčh4h, o {Vח nw(T*_R,�� �IDAT~l<i,Z u!6O^mdr6"8.dTkTJ-Io)_joۊ'=\NvwwdcZ&Y6 g2�t|&;3;px Z>RG6 �>/y{{{X_O &8kZ677`Dt:dy@#Ѩb"]jޛ[�"bP߳koZ&KKkZF1 LL.!_H0cn7g vpp,qHpR2XJl6R): 3Q9p$f 11niF7aer%Ib왦X}'Jiwv]G^S/Qw׿lxF=j=' f63)I2L^|'|f766Rښdr\N/_ٙ^ <yvIG $Ip8L[BTBF>vcdZA=#6,kEP@e2$J[.>CUDuʊd2Aj[2d4</XV CPhsMD"Aos{.'n_Jh&꾍n l6*mh4xNUŰ Vf8jE<ŨI.fs*jid2vwwvX_6LN8!gl6ji<n2t: ÛrvR9<<4pn_]]}8k):~ jyO0 nTg@WSۨl6AD H[eY O }Yomf4IKF13n`0`B,oԊOz7J$vz^^(NmN E "k x2\z~=zrpzB͝ӖfEhtzIe0h7fF#6Mo4n)P(hɒv f}, gG@@K.l68T+E8Z3;;;tIcpZ�H럝ZWWWnW$-_}UZ}ut:ׯ6K`,˲lZm$I'Z*ܞں.(9vs 8M@A;_kov;9D o,Q_1rkZ(l65[RX,$N'koϟ?W'"nlrƍF#�ިg:F(BxwIs[WnD b&belX n~zm!H}r{wwwG.;_T*|>uu4#Hl6 sDjxc=x<D<Vu4MEcݑPbh1S'JMݜnѲ6 FZ[XBjjlP_DfN'O5}к9i d5ٍFbF :m?E\g)`PT )#m&EjwN}3lOOOxL/Hiu~<lL&2\{vv62y@%A2H$GN'ϋ1&).T"STjx<F6 EAj*@ >_SY3B8+Jm1fӊٹPAz^ riIS&˲tk(pEGQϝ4+,?T+4Bx ;]GBrgz`ZeJ-n"nH"~,PF#ܕ1:`%eY!rhm {Z%kr^7`0F݁I$\EBwnchֽ_"P(,Iq ؓ!SjhQ!ٿvF-m&l61ٜ#@ @X{#m2,^^ښ#n R� Z[x>-l' ppʈC V.El,$vfs\P Jv i+++[[[pL&tݫ+Qv4!f4mllױlpNd{`Ug7Tb1|k]5C=U`Ŋ[ueebhZ-W|>g^OPZUHWs[PѨᅤlQm~Ͷ8*1 ŎZbuZ:gZW䣼^|xx`͉EVkkk \0JF1LzEQL-j<zmm1I,h~?4?kkkH"Os8n;cax< d2X,LfiDY*㫝NM0Y{Vր̬affjhm^K_ ΙԮjQ^$V3v6Sn z.� .]VxaBFmv4N...fҪ+++bǞ/ӎ@FRI}gg?kݭNK{,j"qNh;`04ct:F4?~N:Z }=nM̿0U0s4OmH^ւ]]] NF yJeY9-3?)Fg*H(SgY樔='˰v}}L#/b`%_eQ=#偊PVZ?djyJl6} |R,�B0U F_duu&ũh"J#y&ըj>Ah, A,z Tm6|yPScӧOQZl6yoZ B(/i~�=�I!2;;;4P}[Z3v}mmM<;fj=88D|2h?~iZ?g/b9Fc;q\Pme 82fS B$ 4 n<oFZhT,GA:@0h-Id:v\Iz楔5c&!r3> �0L{ >e_5~cA竫_}^7LV `t1z~!ٳg_~_~y{{ l$|%TJ +z|Pdu:`mХ5Yt]Pw:gϞ BES<+Ă+=E!<(YGX|jBb] Zb0L$Pj@M7 , RfM HdR\~Fg=oo^̄AhX]<i4j2v}uue2sTTXv'51_YY3<H$ !V}乽Nx$z@_T,ک7`5BN{xxPJb,1{M,>OX,ĵt@Wzp8<>>^M[&r` 4׻Jq^lf cdYFmUqnk\Fs&*f 8S\{Yxv/1DE.1"L&|:991 HzFD$}C10`P5 C-;h𐤃b?vK_)$A\}Ym6Zd2L*P cE%Pjlٖth4F ץ|X`];3DxYx<nN'x!e)}Ѷ:f$& í Nۈ'r0 }$I$r9YaRt:] P4yZh4V{sn;S%Jύ_ӖZVVM&V E�LH:LnnnPǁ hfl#oMU nN,e[X,HP㱲,ө&) >̈́Wc5 " 1Řn}N5V[J%t<� :JVKmww/!Ȍn^r&+<x<4�i߂C(F#PemmmwwfUUJ>!F#k`0B!~!$4Zb,OBd2*D%rr z0pEv*pyy E@)&*a4r777www. )|~T* "JP(U*DrDE"Bdt{vص_aL{mV5cP#U Y_mZfJThf_91U MՔi�*p"75p8|xxH&D<ߟ|jR\֒c۵TD"ʪA{v1ӂ-j`Ī#)' ><<yF�VE!b—`a7M=%wtCl!A~uuuqqqttDU\۝NQY(-(C| ph}DmZM9bťX]\`a,41:[cPD?=r�9SlA�FnI@ɪ677v&4!B,JSt45ԆKC|'ۧ 5NJ1'3$wVq} Nx<>d6}OD+!9Ţ#cv; ZNS,ciG`ȥvMjGW:::"<4-N8'E!$9_V"-L&\.ZFГD;pbgko陙܌ۥR`0R`4Z#M&қIaX$jL*2`! +z@> @~O^GaXnllZ@. 0S]tV5ŵ䓼5 XZWaв�)\ڊĥV_B ;=)%e2Z#Tf2/_ h4bFXq0}>_:F8L`q_aeel6ϊ!Fk & -Zk8ʊi(Q mq~)e0_%H/;5_bz&3S!ڜ:_4. !i8Щ&!GT|>Oh4B'[`� Â׵mYkd29>>zD(B#f4d)[]]%6jU2(Hª" na'~&ȟ nyכ9#$Ixp8dK{{{./>=yu ȫ&Q ŅY9=e„K%fـUY'$|ߧV ^+x =E$0O)fGBPwZ (}q*�gC_IOOg?ey0t:̴=n"$p&5cAt:<4BPKtOfWssC PKS`cx<GNWhAG}GfY[^n`,rT4h4H$f*_Z~~ c>o*=K/; h6m׹\.`?__ ʷ띚nSaNaf֒H@;�`xp{- XJy m$&Gl. ޘ@2cˣzNMwzz: fdTFFQK7AT jZ6 $A=#t-2@rB>,I�%,G ӉRIk__jIfٓC0fϟF>HŢݽկ~5rFuuuH hVM4*BfTnј -yZ>_X|^/dK#O!PmTM8ȁG1v�h4*nK c1 \: hZv(J-3Fq?JM]S%MG: 2\D"!p.[Vkbr "pc0Azsd�}S޽^ OR| F:M/ҝٓ}>4nNL۵$ ̩NS(9ϫժ6PV^_^^l6T?:;;u]ERAYǷIL J4x <n UXhF\TzGj"n(8H~ {vv&>F]ZݽˌniuKlx<xXN:$x HH[^2WJ}<n0L` &&loؓ;x{{ >w)n777e1SD q!uIY~4"DW-`q)4Xh\z͹9!miHS_5Y;6|cN@BHYFQVxȨ3'6#YVu&f߿>ef8b.2ゖ^Mb/x5(xЦbvl.zblXV4�PK)2 r Ѿly,HtJɼ(Jh$e)~Vl0IZ4ɬ!N:*"v`0@ gطĄ_bԮ�Z_Q}E訅|G*GQkDn/vC+˲i^_[[采5I`*>^iFh[p^ `jnmm #3gZ2XTq81f ֒4F#TZz<j}˕H$4rbs0J0kA^:ؿRMͩܛ Ou46 `QmޡF;.XAƤԲLڜV a8h4%1Oc2Ws=Lf�BZB8Hy<.vSsh~`�ֲ~`&I&j#%@=}DgИDFܧ\L&΄z*\.CF~#eekuuuLgT ;z:${@ r DhA St:5rt-�p[!K$I"hu:r H6@ (.DTpjlvssPףVcJ6'IB/}<ch[3 #U21Vw{|"|ĢdKbhCǝ�R)Q!I 7LbB.A*%2P`9zhXommX*0"@LFt=bd%_KĚA- `j3[[[0Ku͆3,I޴Df jM&SRge:t}}]cx<.Jj(]Q&hL&#`Ų9z4ο$A2t:X %|Z`zWWWJ˗@Ժ\.I"dh4z=Ӊ.57%I s􈿟+b0D"0CI 4֠WhL&C^r9r Nӹ2S (z -&_&DžBq2mZE*.@'I 80 ~�� �IDAT!flD.ʙKH}(b{E1zgU\.!Fܱh4Z(XD=w9:HKt" ̠᷼qz=gtu$@ncFt̞"fҷe� NRpqQcVWWannnNuhQx5^eT]F?~[ňi!x6h4*b}$!iL C0b )ZB!(.ylll%W>g4a-Y6qNrST*e6-^| ;ߐ3ZDŽDl6/\ lB~[^'Nn?;;Xz~)8º`-}> 3ZâN;;;<Җ 44I1?S5pjgpev[bVdmtF> HQ<󣉕a/4ʌjjn0Bh9s2LiE$8c'tt^ŗh$� FQP`0ICk_#[#~ 1NN''̤$Ł>EAuZіnt:<Y$oNgoKH"vjvŎd2Y .tZbu1\ 3ѠDG$Aڢ04 jpdr8RIpj8ja~Hٌݷ!@dT~4 %?Jd�g50uR@']|>6 1 ZUFLIMom6l2 +L@ � |QP0+++3j["Kқl tbr߿"(h4:gj54hM4^L?詅tlVsssg Y~xob˨ŸuL8#'k4 +5Lé G.`-qW>;;i0h4=h^GTm41caӗH:,iE`0 >T�`қL&ͦE2us", =ǥp8LZT*F#:x[{fC z~-a%.\z@{HP4A6&Ef!u�,fH.E0SNn3 \5 |~_P3Am'FJU˗՞F_ ԓ@@/H6%$tG0#]cԀ `:I'38 fX,6LةZj5:XeE=k>ɬV| %qC\"8iKIɄX6H~}}(#d]__ûb1lz=bѕJ,ĉӾk1bT*!B^b)bX 3Lnh `0 ig*|b8ݷfιZn3zTMEV*mz@ zj�\t4YB ãGy]٬q4b-X(Eӭm|ǡJ1MdœEQL?bu0U>HcaHHo�$g$^qhF#?u]{r\I$HӲl<Ȉr`07px4a•e]:6D"1Ќ|SHi2ihtIڵ d=(fA 2ӐpVp8xQimm ŬU-f,>B!8G70̓@cz%uN3dMed2i6rl6[^2N`* X,Oõs851z<noo+ܜZedb\Ѩ';Ͷ"2 ny<+ BɡPh8 ( .˲vs4 -3{~<q A@,Es[[0 $&'Ovvv0<!rS}Y * RzNcXVWWEEN}z] 8&U<d2a" $oڵ]|BVd C2VkivMd = zDKR<Ч]N)h]ɔL&1gySFfl6ߣ ^FzBNlnllD"aeYnۍF>EQ^UGNyo<jj%L\Y=D 8Pv^G,DEkkkd'!)&k@=Ec2DҤ:p8L|߿xu7䊼iO<%HSӁ@tP:zB(a 2#LΎ95A8b.TQT*Yr7넴śZH}I$I]⹘p:+++u7 jU*].O~zzFk[fA˅t:1 3HL�n6aWtFTR-}8j5IF�j<pj*zlBVPbzyy cNDL(D &If,`@XhDjCE2 R:,ˏ? jN`L&nq||QFx.0q߀p-<l"GǍFwSCV~+/I_]ד$oG8Ge}1Z?#PfHb&d2|A24LR/vppl6:9֢r�3 F1N Z\O@F;NG)ިԌfj2 T*e2CO $Iv&%,צViţ2(#8k%!f* ,]pHUBX,FY^,D"E>ߙu:]$aXό;]RT *u8wIL&twZD8777Ր�{{{q'nFQb)z?aT Bhtcc^˲<nmmupC~`TԞ_WT.OCX,lAN fZ5AX/!)z4 į8lb1 {.%Idlb B'Mkkkص5ڥV<@ *M+~ 5V/Jd nvuDZBc@NpiwwW]3QB"-nz$2oZqX<<<dzo+Z �XK^鋓n\Faɲ<)J#/R>쫯rŴjl&iVmH/{HRLw=~?!tN;j1̜0 GO>?@ cAIBw{|| 0\$ze1"blll>W0> vvL&tDNOOsuup89`駩T˗r(}aRp: $Sh4C22zE1űXL;!n1-JR<Z1N3ϬV KgVet:Ɔ%IR78^P$9.edjAڪ7iM` (F.}eb$K+A}=<J"R5 @|@C 4 [݀?5F1 5�p˪̪-==}3i2ٳ="8Q={f׮]v=W^6 !N.<) NXKRjury4 ?bbD_ ĵZ{Zt&zݾv0<ᐘ-L"&VRBa#F@%!8<<t:^" +*tf: g=B F頦CR9??ZpA3nzO> K=xZ~駟I!h^wzzJxSR ɴvT﨟⃃ w61& p[i$ndS\\A3k/ArBRd?)9^RdR2p£@ l65 BRuK)VUnW8r̜T1ٌ3  PD{^VPh�G_ҁ! J dr Ϸnoo}>_X˿x<3q8EtVRO?} >ṯX`0b4f9H eڏ OtpvB*].0 3?k;2r8!HNz5*p8||| [ qmqDZYOFm¨H%"XV pM?p@T\j[WlH4^i? A;GUwJ³F#2I{>>erP_!up u)�ʄ0`tD0uH[Fg(jCGM.ym٤+WMSNKGF%gGtϝN4(=A94S%];ΰZ|.Y /_J%yXЧt.Wn#Ac֧ݭR"31]5 MLCU R+W$'B[ߧ0y%#n[)R |M!8NX"u^j8`4jC8 @24 z A%Zq HJ;GV+>ZYR3U&� IR.�"0LZFQ7LYkEt8+~e*<fCN8[NT =Q x<Xi{{{KIQ]E _N9oJ:; T<֒Bu}*w6cäQ� t1[O,*A .WfEk/h$x&Qk5GsҀZjQ�؅~cȻr\=3!t*|/* cxtbO~r=z',E/Dro0\]]C22K:gXRĚ9iZSt:eL JLhxh#. *;ӈ6662}Q9r^#gf2 ?UU]8//4+uVlJql2[UZZHzj9,r)/JVlv:8#L& yݦ+o f C^rK;dB0b.//777iRw8"ERd"z^pp8GjdooO_=zp8l^Cb(?6ZYáڑ!AպDvNhWR™l6Q|H3MS怳z<ԡtuuF?7o(Ѭ'JUJ>MfӊnzR5_%VIZep84X>Z=Rw RO /M6:Rd)|B} ] Fq~tnllz=@ =qX,(!<lX�,1oJ>. G-o jjS BǙUbQRL&ǭZ(\rrr=zFս+Òt#jDb h1|@FTic: ٛd1~_ijfQ3n`*zN!� ܛ!W0d2(%UAI6R2ϙLe8Tο,Zd2 j`)J3Uf;N&lfN_rK*4k<Q/44L&)L&5^X,FL0il6c&'v[{gϔmRAQB Jzcmm Qz!peUJ 4?fyuu(-xՕTd2`R@axŏ*rPP( X8%w`0Д304I.Cng(Оdnnn$t:=;;j_f V8$!e4L&̅O?Tu % f%y%3Q2-1o NNNښ*p0!{^f3oLL&SXVlv"<S`bHw$b`/:9F lk覇B!1S Qb+8 ~+U8ŘF \|>qTErW,o¿Z|pǃکBGd2k*f5JJ@Kt\.c~l6O&dѠbMeh4ZTEKU1DSgm Ƶ &u²h4-Ʉv,d~!ƪwP'tVEsl&B 9}hJ /^0BcVkۥ%Z$zz:82F+!;Z-4 w$Є~sjuKHr#옩YBHRvᇉDb1Tb0J_-BR$uSxSF%=jUbrVzPH%aW^5b舞ׅBaVMzig<z%Zr0L~ %E@�У*m6F5k1a O $5,*$'pd';.1sR"R( *·h�rbqo vtD:jIbUyS%AM#�E;inx<6 >W# 7,` T  u\PQƒtl1fF](JKQmϺK_t8sZ"dB%ŠcvaK JC&N%y\ugKus(@}Lӹ˪)[b%b#ۀZk3*Ø;I{ %.TULGgz,>Ch&\GRHC%©^DQh߿-%`,ye)I\.͚tFHW̝}tp? GkLo!t3'%^$}v 5h]NN6߾7L߿[$GPd\h[(!mD F<% `J-!%?态|J% ˏ?P #4KߕqfΪ7i%7:46tMUaJl6ɖ5rgK%!pn;EWWW'!-ohwsmm- ʡ4~c0T jϰ;ӪOH]�n /!6E@ `0f)beNH"jD":D]nf�hv3l6 tdhRz6s+}G oј宮~_57d fj M":n0ս ollЙWjpRIx9TѴjJnw&_G'H)94򲁍FX,*r*R-_*1EZmd]~X{<P JZ/\GnיN"JtML& 4뼀Dx bp0_H S黴m�� �IDATKsגjJn�cf3{8`4B 7!**DWVVd3 Q Q&fe2-N/$V 3oDCIsjaթe oҽ$O&9~>gFBx\o$P:*]U(%d2GEZz+++r駵Xd=SPW`jQX x<Nӹ\d\.%:}%ssW@ DGjz(l㜀2{-!]X^-t/_bT<x ( gt:4|G Z5z(@@dzX,Aq^O 3MBz`0Sb4{eKӯ~ f3ɋp8zIÖj`yLtbvޞԎhi_h "wƩSep' 1lh< KM"Ʌ*2H#?x@I1h]>Yt;;;FqEPrNOO?N&yt,%sHC&G7J0 8,N3H`0X8ߣ*V c>PVEh4LJrmnnz&bn٘bLn"Pje2r  - hnW'�pvX^?2Ynݮ* :QݕΡB N`0KGIE02$x`F#,` 'wY иAR37 rK#FAJH:�*)O;X3駖O6&3}J4|...O?dAjaZ6Ox HovR @*N%;hcM984hRa&"(kkk䥭V|GR2d:\2|"gnW*?K!Lq:yLB�˫W!BUR Na Ij5B_0_ oU=˓� Ph `s'64*ze6777)LUq5?qDM&|B|9'kIp8xL!P!OŢ!*;%IL<łJ咀ݮ:&!QFY0Se|mmMc|2 R Z}?TY#~}}MPK9C3l6'ru3t{S^1w ~S"IW0II1v;Ġ_U|>_*NSZ:?VȄ%b +G(nQ@�|"J8kz05ի]p(iڝyp8' ~^1f:#}G2vPYQ${%4n2;qF1x^8 pszfY#C `\& ߿<WCg6  B~kFEfy>QSU3h4HPVDhA\ ̈n~'y<%T(Ht  \C$S*O`eZ0n_AH${:r:\Nˠg-kF)jr%l~>ejʘH |q}j0h^LX1=nԸ;bHѨtީq/�DפF�2 l {"~߱2q<t I4U0j4gggv;ɀˇKRKŶ^jҋ@%tb08?F9\#z"ԫh6w:*&l<'ggg19IV N7S:CHTg <Ll6f|$i lJiĸYFYhZrkaLh$zh4H^hP`Z}!cz}}|9aus2;!}m�5)`8 C:F<7 шF_.@G'z=p}Bx(j5/ha`-iLP4209DҔK0$ QN=ԁz= wJ9u<fi8i8.ڏ]"Hݻ?R(gX,+++|:eUYxK\n6fh o:fk)GSnߓ 7b2щHI,K$&Drǽ^{c"wn$J𹴝aȸPnⴹy'/&t8 pE1&ԫ훛|ǏM&ST.IP9Z&9"6DByTЎFB!oy B<14 F/6]Ä25VE"c|^Xi]B]%Vn2&۷o`0HR]NpCFЯ Cd Q~)9p|C5FgG.d:|>zkNonn2ؐ$}^T0aXԸKjv(iz ΋drįoH o@&L� P)H0D 4ޏ̑>*P'!M%@*Aϔ[[[8Qm`0�d2q:ѨlZӧO<CחJjL'O�8@x<\C,-tZBt}nh4@j49CҔg 9SCLy&Q�n"{{{NGA<> ŒgB!aDztz2"e<w:P(t:#"`CLeIJ0HW(lv8pW!r( &B͑\2`@bRD"dDF0W*K*!w]j4u̽{^*eD!o]__׾L& <mll H]vwwƧdבkHV~kkk^P(@ 7,j2(@b;8Ug.k< '.߭� `0mll`*dZ,|3»uYDa4`H;N6e΄& `Ujd"Uvc9yuics\>{RA]+Gz}T1,y8HWIX#5x|{{0d]׃M0 V vjU}t{@총NGI9 C-bhv4v} 螤߅ERY֛nKG%F1ĉDnc-Wcq0hTl!@^.N@L{\.70d҇|fiX~\ˑv;L]m& Qd2}c:~+_=/NO߁:oXi^KpeӔ2_?` Xx*v= ^?DrN:D8RVIs8JB & ^֚ͦD;St7NQL`dӒM;upX*&@DQE2ZŲ 7했 �'ybv0˛Q*4"o!l}2 -L&LUjΝDG;gR9d2b1h뽼ꖏmmmm%eS=B~^i6WNJwJӴ\.AE$X,<::Rݡ+zz}(O?.Jggg$X< @0*a@lpX5L$8ü^/o l$3[ ,  >w4g0theel6a%s3Lߙ&  _W6۞N gN|vH(g",tZqZ`0L&FL&!ZE#p^ :ݡe ]c3Og0)ysN5 A*d[V7or9-JkvG�^l6?~|hp|~~}WR-L+t:ST#[n7l t\vh^]ɿ6 ՊHohDMbCT2u(b-bȈP(lF\5Xi+Դ~O_-5LJE1`<gWwkw*)d IHN zH'ƿ~u09m<ZY9mXuf_ ?4B$dsQB }!t;iV !s*d2NpgKfmp\b^w]I<(ZFcʩhԎ Lz.샟 lIhCX?7LN~b! Xޘr�-$Fj%bw n~j%XK s3l6I3c#%Fȏp8LF#%rA$ 3*炋ztDEbOOO#@QJߢ]E8MKf�m 6+$YMl6[ݞc+Bz,ŀRGI_}>* lChx<F H$ӲsJ0fBįj-¦E<hX(L9H[=@Fps_a' + ҾhD8DCL ]8F׾I,w@Zht\OҖH~602#DB#%T:N+T %o6<I.vX"Ƃ0BZ-r| {24 2H2D<kpi;&?ڡg΄Q!p;,"hN>ggg? S׃U: " u)33G?O` C6-ZQ{X^skbXx<n  P(Du"Zw-r9[JG'G"`S Wk4W| r^f�*ͦjT)(0;$hdiR-;"Exoy.qNwBn{dH=3#o}P5Z:DZ&Hi8??/~:X3,NvHdF%kfHNJ.F#t)]u_hf2ɐшߢiL v̆o40ïRM%G_i vJHa6|̛HOJ)$Z 1:Fq[ׅ#%$�*%̏bd gJ<Lvvv$eɟJc0v#Yi'zdAT*=2^JL&Ṭb!\NKxt d"u &Hݭj/^@?}@=i ;0]q~gZgePZF x;,,[U+n;hQ&IydssSY,Y#8x^>`:$ι)puxuB i^h4zP9Œ5p\sH&@~ o_U}_wץʭ  BB^)(CG ұ4`ND"%"d%H*C=1x)sK< gh4>|'}vϝCJ>ff(c L?_%/Ic r>|Hvoړvp jmq63<3w> +?gÑ _`1k<EEE%~%f3}dXSdd J(&@^)T*% x1 F=r\kkk^Ρ)YVUvL [Ht:bb Mn6bhT*<y?d6sx<N,wĝޞvX̄oZ v ܆b(mV+.ьb1 7j^x???#0Ua>UXB ɉ$Ǵ"-b0]dh4uFx Cr6 >t/upJIo|aH&�G&@KrK#ef=mZY4 F^]]a~Z-)x9r"?I9e}p8d '''n7`#أnZX6{2'1<P_۷Ht:/^|3YZ6Җŋɐs.Pi$rY)CjD#DLkZp9s!2 ⳪q/@nhcJtFh?m6%"SlG t*IYP( E-+ u&up`נ/1q[�9`@sPZg¥!u)~TƜ">qJ`jX2?V+b@Fc^g$0 Þ*ye+*MF#mTF~Wi2u!l틱%Lpƹ9"xd78aL: tW\Q8k($fislbҵW^cBt\�VUŔ &hb-C莰X,L"Tɂ0nX,%�c1I~JL&szzh4Z(7zT⻼^/<`OziP( F`ߵ{^7`QԮ3:F҆Ol̪y\&)9J~" 6/{# G  x2P^v8?d�[Xhx>:)%10Uy`F(1L b+eZV $:PqKK Iғ %pa"54j}("4Kt:[(%%  AŶ xޕ«fRY tʔDh'PJKǧ)AQT*tj<ֿX>k*8-yfjq&6pd,e H�ӭNx\5gXHtf*F.jF~`!$Tt:ւ`X24XLHF5[U|pSYq)*$ Z2;*xe&1 z#PȐU/pdz02 dûJXM!+++vR�9 M b<BB\ZYY~uu4bHӣ,;gSN'jh4uF#cZD47ap(s A?`Qrt KZ�Q'Q %2Z%DUzX,ˡPHRQ6&jT* vhVwo|_<x J q%glISU@^P8 C&I Cz [GO&%B"[]] ZL}W lg766Ҳl$AllȁߵAGrzc:3K^Ar9ҞL&^gt3t: 3i!܅hp8�=?L^aXO5Fqss#%h4lz~fs{9wH&m:N3QBP^reee`0uQN04%Dmo[N댒mPʿ? (!gNsccr�� �IDAT Sy% U+$lwss))m!7660<coٺ-?y 0Kqf\]A!aEfףɖ'cRt:r�0NF("N+ fN{ssä_\\`3on&h`ѽ:8᜵12,1Ux 6jatja~_(KFyNRj&1 [[[O_6MzLcJS0d0# WVV4*|B+3:e\nԯV#]TrDg4S�9UZ㕐 1d4wU:0f<Jyލ &by{{jRJM<xQ"l0puJrd.]4+_ jQ`H0&?ۀ G"Ǐگ ɤj?0O?ɴ=S>xLUd_" D@gB!-Tl6+ pjQ@@# >c'HpIֿzӟH:VJԙ0"fOV^%-HcyoaN i  d28pԍD+! T*N֓'Og1l6X>%&Z}VWWᛐ5d2i>؊\�m:='z,*+h3^(4#}3~ѨRh4z\jhu~B]K]LCOr$紶q`L&Uoљ1@DɤxQGNuy}bTJ``&& ԋ=a3ÇO-x^BĬ 8bH(nh.;7|z ;::>h!nk >˗p?>Tt:NߏBJ<LJN&hh0zJO- p\is Y Oss}}MmLTWbwV;NO/NJt Fx&\Rќd�u:"9Bd$ l#TGff`Iٌ�8%BB?ypZR�r~~bbz1L& akxbn>{1=sUO o.N:>>VtA:xZE@.1PgE) ?<yCC <>h 9nW*-n(r>@Aq]*Ng84jF5/^@,Pyqq!9&999FdnЄ:e3g;99QED֠dXy̬Vpdrzz* ~<-o޼!#�f8|j(cVҙtt:]guU*Vx =hz^ۤ39>/ ʼnnw)J#"T]((-:eʼn`a6`(eҹz> 1B@vYIaTHne,Y0lۑH|>u}}=LPP$ VfI_YX,$ ` #ǦX,z=ԨX**i?u݋XRDEGl.HNLL ]r(b"Hz6X\i2{GLUbtӳvM$1DWU>=鐥.X9H(9sHlbf ^ONT`bOSjhnϤ҈+i-˞b+3D k4@&fb'K:d"$(k8x@swdI4<9L"txT<r�St:jr4arݠCM~yyf %d2vgY%dL.8 u 2B(H2݌h4Ѿ@1P xN|.s\Nzp>a8V*@P٤H cX,JQJ,xFx<rF``=?k|g! Uiyc1.] 3-bȪ#\V ATJRA<Wonn JH[F#~bzbfAv,a=<<D́Z>D ZiK4f(_TVa,GjL&lZNht b�@k$])wPn wnF4 p8ddZq~-xqDKNɓ'Ԁ/!M8 8v@&K :{<+Y+i 3$:pIK⮈tZ,é]<D0I ˰|B`,3U�ﶼbZ! {C2}з cPHx<`Px!gRZ%9%zuuR�ɜ g0NW*i@6:u:˵]հJ$H.+HVR.~^_[[zdөl؃vggp8†ԖVk\f .~ǣH^ha.>x90ZLv2fF;ңV6E hl6]ETBMWsޝk|ODŨj`AVR-J?U<3ky8@CYyh46 ڦX~"H۹V `0-�0/"WNwn \RhKjuh˫Vx.t:h_6 .L&@Ԟ &-|`0JƣG"BѨ{|>\.'t:7aZq F~p2r9W dlN1F^3Azh21f_:{{{ڃN(WTw9T*%,p8=a\|pXMQn\][[t:t:h4^'i~S$y>p<_ MPcwxpHeʶbZ({NWWW:F_>FC1-@a<3*(:ћEB| E}h4>U_h_4(BD]&Q/yӌXgh~2Ib-~ww͛7d2NZ-đ3j0?~ .R_F:tZC6]\\J%q2Z-bQa㼺5n G%|_\__@Npl^(H} l6c+Iuxx8!wmnn+l6{d2ѷ2d&OD"oNN'Q�iSRq0@-Nrz#j #Q/WeUOL8O80Nȏt:MR>|HJj Z7#B63W4;վhѸCWuޘuelZ]!d2.|tU ˕?KN?ffݎn+++WWW;^[[`j1X,V1x!VZ-:fEp8nh4tr&I,[]]M$יL&` @rx~zqqa2A(fZ {dzvl6$'`0*=5}2Xp8>}Bh4zx</޵Σo2r^d2>y3~l6nXt#q Aj5dx2\' p8Lp?}\TrfKRff l6kL/rݨ?Lj*qDx<r.//5 .N.pTwJ^N {^¦S\H7&\CueB)A$Ef֓.8y _[.'xl6\xx)d>S32Vv4,f8/q^;^CF z#@Egggv}<#3 :x<D;x<.+lllJ á%cl4ae">>h6~;>>X,^w:>x ˅`0pEdܐOW -%Bxooo 5^n7SǨnzEf9olllooW*B卂N хL&*jnaHS-K.;v񥗗bp= lL&_A0\_____Gxh4bUW_$˘ KP:=]__zB#96Ci-I"rZb:Xh$l¯!% Jr+^/CB9L2~?.r \ɧp03h!p\_Wdrtt4{|nzbD"te{x:H&^kbVWW>nu� \L'@o<.cl+|$1L<x^,CjqͳӺ9(YJpְ_֘L+^w\JR=p4f2넝8V4[Uct:O~gϞz=F3ZsegZ-˵N6&– x<τ.aB0P ˯ yyV}ITM&b1a}{{+4!/邉$YBd�c/..T+PyD1¯,. ,gvv\P( "H2LR+++f8NښdB}$%vyF2G"l6^oۭT*Vbb1l=,KH ab;BzyW[rafqzh FV}aXp^1ZB鬟p8$ ע-jl +'qvjrբ҉s4S @&/U@{VP0xd~si -NBK:0.-F \/7?ʱKuZ 0' fZ@n[,ϗL&8v~l6q"UV`X( `^rhD* ZSfL*CWjПiH$fyثFF? 4 3a#hd>>Af-Cy ՉTNSCp7 ʉ魘0rm|g޾}cb1  \lrM շb幭10B*pMqQ<>,3d2 �FcT"L&Hӽ÷"O{D"a6-ӧOwvv vVh ˒`v=jC |F 'ɋD"3\]#۷oρidr\J: PIOiZ!&.DmD2DxaZȯx -T FgVWWih$Q a4y <+"9h\^^^GsQr9 TZxub�H %&ΚNlpD^d>&0W.$TQ3qA=(%d2{5MhUaBD>GfڲX,B4FH$W8NfQFp LjAM cr9$U# ``J FR{h�6PI}0 $!�aq`-phJy<p:˗r') (.Z/3I"d2FCjR)>ޕH$өF;ȷZgiFoiXF I_A&=-ƾ` <tӇ4N4I. RѪ|'_x<JS/˝ ; WMx MH)gj8K!V t jUk^f!ٷX,t`-=((V` .jo\&I1 z$\ 777WWW777nDBeBUd{% u5󟃼d8l"�…FapNf-v$F?(2Jfdj,a6=PS@&jD"qyy)b\4rR6Dg677IY9zyUt:^_m]@zi*ĕpr\Bڱ 5J ,.MK,[__'UKWWWIe)t-M(؂J ?L&z] RB8j@ @C߭3ѕJ#%;O&~qfܔ^uR1c෿mT3O<d2ʹ<Sԛ7o$?_GW8XׯB|>rrM&Gѓ'OFp8ZHCz( ϟ?t:&)Ͽ}㭯{ϟZ0y3LX,vvvBBu:WG;͘u(}e {\~Z�1|>|>$, c0r8ϟ)Y_aXx<'''LGv~J2%bh <} }NLU D"@w1NzDJHR^ё\ہ#fJSG}?vz?AiF׾\.c_>lnnNib3%@ FN@W2ğx<NHaNǏnׯa1jh4lhǏ?|Ull6'P(? =z]Z:v8[ Oo޼I&ɓ'zL&Ϟ=s:$!G b)IKcr j1,g Dgt:L=hbi'?Vw{G с�x -  y!iKS3E^\\0ynȦC?~"c䴌Vt#2Řum/Bn,;w9Λ ՙLf(T#X,>{ vGRN+3Zv}}rVVVj8kLjg)P.1̍8'N$G1JJ%vO&z&  8 s\rAzn4BDoNPV.иVhdbZa"{ZxF6h[^d"1`�7sC??q*h'?/Gz�*s) OtjT}QV-f@LŒ#0�Ŵ"oٌFcªL&~7oxTo6-JdWF dt:2= ^z^ͶHL5I|`f]h$1 >�5A>& H\IVWW?3 Jw oOo4P'өˇKP<$9?o|&R&qJċ $χX?dK#Qf<ͦ绹A1Q`0T*8y{{H$AP@Jp8<::B`u*v *f|~~NOW?P.{3kq!a=r#J2eF]<LWUŰX,v ;880<DVe.7 WAdǡP(ϧRv]V+t/vzX1c��rIDAT'OxOxl0di 0w|Ƀ~?xɒOq鞔 J㈕@uOtR@�b||^w}}MJeٳ3V<ݾ3H)F}W~[ n` \.hSFL=b-%t8BUڙJ%t}}o0d2J ݎ9*5cٌxk^?88vo߾&N)6 gX憉<c'aلxdKp>7%P~$H8V!bX`A}^Uß;r Y(Fc٬Db{{;M&l \8TY7<ﯖoUg ^ ^ yMT*/X%ՊѤf=LGDlzJCs|>�2̡+?姻r;}8!M؊J1p U(z-�nWדsܳX, ^d>ϟ#S(@A u@$IUcP-I3C%Y<ASi!U]%Bu3ǵZ3H @#Cb!OȊE[[rFizt]@̔s %Ah2n"x3kV+plw.dRW9LM'8ky,]Hz d"Y8n o#hҔv}}=Ả;�`#  :G)tKP"�p8$0n@i8mGIR�KN~`�t#``0vkh> F ՠ(bdT*X* W(y1ê1^77\ =%IS8NDs2Ч;P(L:r *VkP9ʕp{a2l6prOyHiPNg0i׫j?O#)y':^A�cZ*LOV"\R0d��sDҷZ&,LN}a0M"U `X__]#MgN6.5ptčœяcW6- ~\V آ^c |L&h4B6+ t˗/Qm]ͦd(u]4,uR s.\•ZL&D:mPN^gYՊx^d2L%_o޼T*dSu{{ ! Gq`%`0(?Q`0hXN,b;/25f"3>fAʽuy3|dt:kZҲKB~Tv{DϧZDԿ\DAbH>Tuft.pHf #a5N䟩ăTJA#Y@Zr0<xY19wvv`4nPD"H0$`PieY R,a!mP˗Ri4w(cAKlg+t?~LjbVzoݐ"RDs~ (;颍 U)L'x( b&UVE%R`6zI0_[[k4$H u2Jc%oS(UD8w^r"fN-h-iEU{vyfIz=)t !G_Jkn@N0M&Sӡuqsswě޻>ǧX!2 } <FNp/#eYrP @(ښ`)ARa8|'OX,Rtzz1{<==Fp(|>3 pvKH $aDC�g_Iudp>xǼE$G?*hp+ wFGw}VZwr -`J)C d" |l4F\nGF A3_~c3`*§aB<LEW]ZS)qCCzI26+<2w&|K9zt(!݁3ogfjΎ%yB^nT# `~nΎҺEHkkk^V,@彊[YYYYY!IUf$Ff0&L&3_-LD}N{%PUQ{�rT:vtpÇsqD"GdZ__>n )-} t: 47uFuf 壏>}O;T,''''''nWh^|Ozb" ՊJw cqzrioA>- z W~- ׯ_' ĝ2L_YY!կM(Kc4,vT.=El&s`Nb]`phN0+|Fk*W9d"j5:#eeEn2 Ljx/^!0T*h@K 3v<[Y9^.MKr=::B[b9u^ӜN'u&o 0}D7o& Oz߇7vQЬ\. q/~[޾\.a,] Fl6zxQP888@qp8>7In$JZ@ ƛL98o^Roκ_u d2/k8[ k\UU%lrtt$A*"�&B!~ G PXE¡a#P($%˥e$SU>={W ˅ ߕ:lH$" Qj5B7fѷkΉ'p*fiʷS�o2,_(cFt|ܕ6&lYmGGGGGG/_d2ޕJGT)<;;ƣ#4~VD*X"mm6ۃ*v{Q GDr:}?b}(]&T !Vuӟp!IbZskxf [,K~ ifY)7ARIKQי 2};G5H0tC<|I&z%dL$Jcǀ פRf1( N^/C(?rJD"Zټk ~hTeFF^2\__F<ddh,bTK�V#)+JXL#}>tLP M�MC=(jŸ+!V6`FgN{2z<UrgO{I@Sokzv}w["F}*z%HMIt 85G׸rݳnqPʖnvcսq׽jdZ3%DAü@56-Z='MCv pw^A.!Vu:/{l6{\SXooꖲ,e)KyrWɝ]R,&sv,e)KYP\6-;yF8yї~3F4WiΑ_!{I ]~K_⯛i3]5>b2O_A[|={3s zZ9-e)KYRt\,e)i)KYRⴔ,e)KY.NKYR,*J_Z x,@I>n,;u)KYRrO^gGb:ew.e)KYRBdaoR^?> ,e)K`j~hwx<,e)KYhqj_ ^u�t^kKdLgw+e]R,eib9jGnOpcet ?;˘R,^=jY]ylnN&{{8/,e)KY.N/l`n~mR,dNYMd4nKIK,e)K8t?~-,e)KY8Y6:Vk[Rܩh*�1Np\F$= Q?@+: l]wԻ֒;bA%2.!~sFuJ?yz>9PHqqJTW)zN,MK]Lʳ/'?q՗Fc{{{ ÿ_ o}Kٜd$ۿ'OvҏO!w|-ۿG$o?ӻ\O~7,|&43l"&"X U{1Ъk!0xCţ J"x"zDDP#jm\ZIM_èuDM";%oey23oNNNwm0VVVn<!r)JV{dk)***((iiig-coޅ}[߮{U`e~&%E_�Q544d m[SRiUJ%JR7_GQVVvͦ#6M #{/��܋7&nq}sp_ɀe ��"$ⴴ_Zn#w��tϟO3 r��Ҁ܊Lr2r�p/NT* Dtttt:(111!!pAH$ˣ;?laggbL&[\.!rDΊrr8ONi��.Vkyy6rq"ڬVktr__V=kX,UUUi4FDvvuu<N[ pq-vI$!�pGg%ft:l6NOOfJGWWJd6뻻HrG`2qDB! �dRbYU��w4<<\XXx`322FFa !6;[9I$IJLRu�� sssD7s& e#'/tpH$O8�X\\E6nYH,b1�ikk`0,KSSfq�{UQQV---" 4Cq�-\~eLF^]]MDyyy### x~~>++ Qooossskk+-,,QIIjϿ˜��"! e/uvBcLEn&~ŕ�@]8_>?Wh��<8(N����p!1,{,�a͓'$"a?<~ ��ǰ, @ ��@}' g^O_��߻M/垐q,~����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/frame.png�������������������������������������������������������������������000644 �000765 �000000 �00000143051 11332353405 017175� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��s����� ���bKGD������ pHYs�� �� ����tIME)p�� �IDATxw}&Z}N`2A`0"Š8)"MCO)Ak}k<b ޷2%ʲ!mI(kG4$�� 2awVW}N_|'p˯�����/~ h;ߋ���$_}|+cF���� ^|ݏ> =y3����f���#3v ,\f=5{޺o? 9s]V].l{?ӫyn��� 9fO=v+?#tuY[^z=?p;;::vL|vס}C˘#OϞX{Ńd���Y++}}y+fV/J=LJ.OÛ/[̗~oCzW-ĭ����8yZ(dY}_zՇzx%^px`ڷ:\bwոn|͗|l���2kÊr8VKXz'Çw5}~k !Gh|V] XdKW-lv9+zw>>^򱍿d}3^߼v9:O!ߦw g*@<Byp9}VXt/#OtB;^z%Cg=Ňyi?~��TZ U9#Nsld7Ff-vvYBܡg_xlW5:bGΛ /3gZ%\zpW=pk'gd՝x{8xءCš�>!e~־]_=rˆz;Ʈ.yٗ;::n'O_}E_?m^˟sU�Prb?~`5o=#λǎ=wXf t4_~4]o,]v7t-NƦ^=}رE6݄7_} !g_s׽.^ٿ]?!}fW_{k^s_x߉vWBn߾g^۷q`߃>?;ss>!?K_ԙ^_xŽ3KW-7.S/>zׯCABȲwr,lv<C/a8zoqPp>\?}}ͪ} ߳KW\z]xD|+Yk.y_w;?~_Y}9/[9{L%=ԏs/��Ң?!?j9l9VƬa,=w6Nk8o*=>{鞮[O9Ͼ3AՄjC˗ _rWN^}_fO|bϾs]u?߲^{w|O<W_C ;0se^{M?30po_g>r WBzu՗9wݿyˢo~w3g^[t?ij'麶SUMW<Ҿ|}\qɱ{fB-<o%+/\G<XazPFh/Zщ?~Ы\̋/Z?x` !ٳ/}}.uWx%{Oӯů�jֆQˮ{*ݠ|2w]O[5#7B^h?|cϫ]3r^_O?~|-]7\=هBNΞ:v|v fGg̱,%}'Owey+|~?=k_6#._Շv=\u/~ࡻͮk8׬9o@/kAsϹʋZ5SW_z^߂37~ttvdo򋂯;; !G{qWfߝ=qT'w|D d傞ӳpJ_wÚxL{ kvt -{߻F¡ǖ|O?;;׿f_;�RQk4<<!>VZ]~}߽#B(8Y<uӧ,:~ԩYr#p:S{_>q`?~-+/ rfׂ7]u!!?xkt|re??91K[u4B96w,Lv4䜓g|BȓϾ`ЙF'!yjDG_|ݵ#Է;<iB^سxYʡ9w`/!?n\dX"0.%<^h,^y_;OvǞ ֮-}'tW]lxo7_vnn`xٓOв{|kt4:::\_i`_Kk -k4k.>{Η;eu^b5~��J\gFYt{n ?/?|J4O9xd6/'?/7YB7wz͎rౣzKxs_//=rMv͹?{Stu6oot7^sBٳg9{1]so~ͅ7^sK{|:vĽwhxwQBȹ+vjŒOBvʟÍf=sMBc' !K 5;=X{kr{uWn䜉>'_9s]w턐<I%LXpz׾]ӧ^|?~iBȚ_yKwWs_㗿}K=ݝ׬9k/so<{fg'~��Y 5XZ,:-Z f=EfxcOxkn\{v͍'vwwWgg]t_v:Wn<v/}ryK!?~|?w'NV.?wŒW뷾~/r_9Ko}]P5(?KDɳgvuvV4ȱK u !?~V.ŷG^ꓟg_!~Gy؉sW,y߯)k _{wǟ~S睳r_0s_oAv^F>>Ϳ篼ny~?ۚ3oo}cG{f+oY{ъ◾ݣOt-XrB|�� 'fx}oR(qLf70௾ls ^ N|-Yصwљ_U Owvvs?Z:=<z9YչWZ7BBW?~>Hx՚ݴuW_~{O= c7]w//|kA`g"7{|O7|Õ [?>9{rbԶOM.^uy-=;7G9y̟FGҷ<r]?S^@G3gozͣ=ohk/ 8sD#oÕ=]G74?.;oA#}BO@gFG} w:}COO?fW#W7;CSN#S:zz.9^gW[��Z53>׮|hhM鉔dže>^<ЏwYssg^xV={Ӈ]W>{3X?ԿhiWg+O<7xeBfOyyx/#Wg>=;Z007c͝Zrs !K_70?>szvhyWc,Zb3yFG?伋/^ Ϝ8|̙߻ ?wOX‰cGN<>77lv .Yoa` &=ϝ8r̙=<~48S'_ӧF`ʮ^5{v7pxiGgWWOgΜ>=7ǿ5b3#쒾���^}+#e`Wd;}ϷXHp7ۃ{_hgeԑ{=+n"::斮=~jK.<rꖧkh4CΛ;:G}3FlvvwvB{^Bށfl5$z: !Yy yCF1fGAYhłfg7!^O¡%7ϯzG{/Y.8zWfg/!\znׂCG^y>;6v7;:Fgt4; !] h4w4;]]ϙ; jv-PRuw3gΜhvz͡$p utvA�Pfʪv^HΏe63ED8{V]xd^}ɓO:rx]& ż;h9ghϮ.:OK-;7hE;vpqݡE?oW ^~Oݿ9sFfg%~ !OT/^H$x��JJ6,eEܻ{ᙹgF{e z(��9N<~!0ƣ>7c-<۶{5f 6Yh�� N}qCGu,LǂC n��( wXჸ����`ށaNr?n����?$W&���@"l߾133i����3[Y���%�����f����0+����Y������������������h0<<,~ૃ%4>un}p8c;wd_>|Nc0LLgtj7m=dNxn3w5X3BxqS4+u;g2Ν;wܹ~zWx*Otxx d2D]J29҇7sfZͪJ= ~5h!<Vi5?Xvs&ԬR#v\:jT϶kf֧LKR_LGpt먐b:)0ZoToM*:'{Yڿ4f+I@'4;d@8Og\H4h:[B=93{dOCCv>գIrHꩰߚ wdd./4Z8yǤRJ>?a3~+T̪ך;XWI J:sϬ:'sE{_{5Yq^uJD;ES nh#Kgh1o7  ʨB?¾ahU]Ċ-kTo)AN!YBX xp~P%uFOUSzhJ^)^ӻ4U&6ɵ|YSe>Փ,397hw)ݚ<8aАOra'L2:kP!dv]Vt@}Yؔoctlz3'P={yz ;]:~|7!dff/��8Q x[B~0w`x v?�c �(��zBML��9+9B���KY���� ����`V����������f����0+����Tx Q�����41)����YA����5xÆ ����л?xX����X_0 �`bff��`V<�^�v:+����@�$zWŀY<|F'pc7*\xEb/uĹYWU(u k >jM c,+_Q1p !8qɷ=mv{x>g. 3HoG>Xo;o:WИa(r+5SsG6o4E3j/D (B3e� W-6GcF7J!}9h!mi(v՟"fB>:L41hϠX`fjsdaoO3nY 'C! f,3{RBȾs8�-hddȌaǐ#M2~;O￙ew/ehg^] =VUa fWA͎o. �  oj ^:SQkӤ# :!!sE'Zeډ1zMiPt�MŚe{\ah> 4elņCfTbgj|96U�`XO25MABDn2+lioۼ,1Za Ʉ?f5zRCH`zj,u ��¡XOo{"˨ yxsfVPk H :YiO$Qݲp7�� _:Vޙ6Έ-w\;"aЊ+4M1=Z6o*`)I /n@||47*v%v)Yq�@yom Oot}9j%dvAq?FXIz{ 3j~�ygB��TO4D[,.\7rrT5FUJ}v4Ơr�P Hemf؎62Hϑ"vEme#l=*mJȗ*3,�ˊb�*@&P~ne\TF dcDĐ؄;%XDcdfMJ�@BǛ>:Q0V*akyU'B BFzo%)��LhB`ЩHt #>EƭGle(}.0kPC�CX{(# ʖ<cwNT%!$-Wa1&}C.`VV�BX{(jtSwt)76Oy(^P2쯰 Q %OuyYl�^XF*q%Yyr Zkcm?&"_+m7(ѩeN;!O1?FQ7���QnS 7 HtJ4>I?1TF[edaܢ7 ���0f\>/ Ĺ魝pL@ݬWqZvY R!},џk�JI~Fo)rD.N Se%4Dk1 e\ 9Օy^ �PWR )c#l8蟴1L%H`gQ_v &*wRfe2X!R; ^wËRO9([bz'نEK0I ,ZvD{KM9tV 0![w4I9u���ru It)BJ$˨<)ELh7V/|ο�� �IDATfú )}"3:+�6&b7DL5""7X: rzV2%cS-ұo0~ZҐXgKlqقYIo&wihB1I^d\Sgփ|oX<eku)bk&i#& ;C[WݱQ1$%Y×C95V ]��xy4eAƬKp Ioe W4LKkiVuEІo珒5n*OR\VQ�*8ͺt gDT*exӲ"Z%٧v�ݼrO5́4U)�pȺYEYYyMG%ty5;N/v@vC��A6>ȟUWoch'/N—01vbݤSdV��r[ vpD"LAWma7 81뵲JWJiJHLcY&#�RWejNjj3t%*FW56)p% fqL��e Lmw0Zu|Jk2R5Jm9!`Y-t~XUYSG@da&г,RP~(z[~Oفf9ߚۗk5]l߾ 0 �݀Mblj>6ݬCZe6HҖx`V"bff�dKD#XmMDG�ײ츙o0?0#ay%1V9vQ x�T0Vac pm4A2Q<ؙչ?e �z0Z,3J;,oe Xl&_lݨ:ű:oG?U$�:~F`ܐPѫlcmf;yvx0vLwZiݬ V&njSHX;̴>v#WAqJD-ER>"Aja牨,=^}@օVQ�"T%*#WQQ$X -M~lJ|DX󽁏QodVE a >Z���NTEJ"_mg Pd<aX|q)i雄Z_S'Ҭ2 �B '{J%:^@%+} K.,vdV��=PVYSĻlu$3\]`��򤊺*V'd90pNFNYt ӸI`iiVӮ؅�] iŇilšR>J  &#qj$EҼ,hJ2y �!3x "<JGxH;*,,MoSܹƤ CNZmY8ZfUȵAIC*3fܥ|v{2.=3 YYJQ;a0?B"x,KmHS,Oe}jV"2F]|{䊙ju7Ge\- -6A ;r`AuX'E> rҫ|F"��>Qcp5`-ӜDQEX%;1 F"}1�:B(jBI-I—HV@y(_H:,��P:Z=I/ ʗarWOJ,dP3:C>k$�@1qYI驿v%k<j>E F#$" ϔ:N^r`ԁ�;(/ۃ>SI'O{! ?D=fWSpʺQ;D>۷cذa @ilb+鋅4 Ig]ЭM7IX?0= 'fffppS'Gk MPe 5.!brPĘD73T@p ~,$̒+|2];8%.^ NYJfh%B_|�QdҸVjnu;H:{Ov;~Մ�UaCgqM,NxNuu+pe=vaUsLZOfӜazbҬnPq)ӣrOMe}iT )<Ɉm a=H v%sДx�c$1m*{[N5ym%&ec{ͪH<+|"KY!b'\*/n|-^ƴsE'_x'}Ұ>[g%uP#| \!hϳ0!Չّ^>ŕpzT5<y^PWqiGw익DXThӤaPV 4l^D]`)E+'+i.쩨X74>_P.~<cAu 4,wiMJV 38<2OLYI5BG8wC*Ȳn +3:F_ucn[)r#[a/IX)?~co꣘lyQnhYM5ĘlY[2fd?ͤEbrӪBFf9bJȡ5<F; Y4і38ˬhjo%yfɷGoGs'NR϶{hbd(⛉a&Y_/ I8~nMyNVkR?#QgڋJQ{Kf)WG'E6H:i:DvɣqZ%a\�tlo*5ʘhЃ%\!pMS(JVMB Vk<̘uVS)f$-^< ~XN+JٮÑȜ) kk%%ёWnGٝWH d,',L(׎MYE]u[fX8*Ĥ7 RムD|BvuA՝#63Y2FSQ�iٞ(R|o}ɊE63:dve4rI,ym.E:t<8TJ O3qMh|HS' ��P>@'f2aJ#f &~IOwAhB էcl?[G3O[8[$a<c`V��@R|;pEQ!NFٙ,+0YDhn[ �@O�xN"3bqZY F"a/U콁c|| VW%X5X+}Doρ0͖/iP<g|4.PE,&o.ѹBO()q<Xĵۢ%c6l؀ T %Ti՚v90kdtm{c(~{>ƲT!f**fffpp*J5֔`LL,݈΄XYla5\_HJ|"XЙhUJdFKS��T i`:Nk"&OfQJR佐t8]F~���,j>Tav@ꔔCV6"ЩJ$ɳZP|OSFUlODoR)hz㗶#ډ2ep#RwOX]YxrꤤFM{}XpUnWJ(KE\rN>b|KԘi^xk4?JdYd; (**m *&gO(^[ dN^AJfζ~D=Ԇϰbrsq[|,͌+{L}Rlrk3U^uO5յ ag~#@H2M_rLL$1!eelw5 V!G*濒dSwv"1V@y~e62N4qeY^')AP7tXpvf>v`p$Dj]ՓZiy=* k¼!+fFL |"j51CeK"_hSƩ G) 4Y'*^Np<[B'ˣD [c!ԖEw*楁7Qw{`WS_@忥72;"Ҹ@@Yh;TfР!W+T!Y|q`bjۇO͗ۜ(,PoAHx|:nLTgL>U@@1~!kR+O RcTf{X*R Р&hiw'u`د���CvUqmE` 60I^A7+L䤆cfEH;��@q ճf{Y$ p,3 OiToǽo0h��Pj-jcv)V) YSG+[n+f˨Ϛ:1 @�PFԃ3!NQj7%tq"3�fM%- �%sll*Y\&z;y̚oߎIP`Æ @@C8ƎeRX&LtSSMf333@@sVKOjr0~$W'r1x6a5\_ Ҷ 'ClPB ܝ���UbYM"TNFjXU*;��jHB ;s dy̪tI So F9`d' ,%$/$,yfT+evN`VT teZ4fsË́©X+X ـf-9#eԵdUZR4ncgȝӓB)RmH(3&+V aKNɇ)Ԫ,~msVz(afZpn.'dV8E4]̶vbYahkf,U2WFmt6R8)RRDZgpu~"u[+ r|ꗭuxvg_T,2f} d,OSbĄg$ͤMI75[aTv s!u^) E@TFV_"F>SZ 8 felPJ 0V@AT93}4>3ג`FTQxx3\5q 1Д fYA! w1adV~1joy*q�UHo0릚>£Ì`.V}KSNj1aS%REvjpxru˩BxY9#Ҝԭh��n[35F)&_ȲPҜU"<��=tD7WF44'3#f%%��rH[-~E7\^Qol7a~&*vVQ5ucp�2Llݲ~U}VK{:K`ԁѸ@� Lu*{;'h4fɢAqm�Fb6l؀ 8'*kZr! kEȦǨsƣ/:-Y\ \ KU}^L)vE@lgYȍPz[Z^{NDvS8pi ̊gS>/4 d}f#GZ6Ě���*g64XXewzY���uT-ߝAVlODsBa*3[LB5X40N~^a6RG# D?l'EJT^=ձH'\-pZ\)R�! s((0"LNop7@J ҢZaϵT!riz0?f 3u޵L)3BAƝŗzL[Nb�Ґ}nLSjAXK.$d?!][VW9jvO=*gj �hd<|?%\6*|jYewdDm�"*ޞl;�uG^wƆFbiZs4bf*phڍSYg>άjDNn `�`$UǢ&WB"ll҄`,C[LDfL`-I{ɉF%� &)ry�uePn*YV K! g^ZPlY& ȗkS9ƞ XvҚq%Nәq0p!It̞<A,<Qzgw$dfK1^NLE_6,!+tX0Cg !Uo?!oco Ádc6,ԯ4ꍚd^DQ"3.;(+d#W�D- PW�U&WL��`k!@��YZ.��`V  �@ ����f¤����3fݾ};&���� Hʬ6l����>J c\K h.l*"?IBtr]}0FSs1>>ByocmO,vprJ �����������������P$n "+B^]-rme۹s'!dZҤ|Q8Jobu-@ iP ˤ*hӾ9{ňװB:= iOvMIDog>g:5nT\hՏDF״ ?| = ?(n ^uMW$ǯ~5<aNos o_g|3%kJӭЬ pΝ4}p&!ܢFSˏHoڽl~}|!W$ƒ)G^Zd_B-F4Ѵ<@m~{tbڍlѣIrYǾÎ5fP(#s~ϥ)[CS įO֪ƓYOJ-T`j!:wnӰ*3YCj\ey{άUe7 T]^|iv,pPEP:9odp2S; ^8vIW0_0h~wBq~g-Z\>C LWpc^2g}tf)T:R)ͩꍹ܍9N]C(Ha)-aUWDvC��6m� ��P8hyP)���(shV��������@Q!L):VCCC=bR D]:~C6l؀ ����0z~®ݏ>k0����DSȽiifflI:Yۑ񣌆rf.Ŕ0pn;YaPx {-jraXH`����p 0+����Y���� ����u@}[$fjPЕ)+PEYa&7p5K.*p-*I~EF?cbŞſeyZT8"5eNϿ;U(1I~#IJ#q)8LVxվE.G]gMp8EWea)}o>/f(0+y5K:aոYLNއ~Wm+΂B=AO@20eg0Ϻf$ƫi!}܇*Wfj`+@ $WJ>00{yQafpOJS ήY^,2AaFjPwvZHq5 WM;Li'gb`;)ܘDw" 3K}٬jf6CZ+` ֚ITYouUOj鍷8~y5an,w90t���KY���� ����`V�����o�� �IDAT����`oxzLNCCCuJq-0Z 2 ),o;Cv ����FJw`x v?PB ����Rˬ۷oǤ����!IuƍVm48L?{WIHmI?n6< mwOCFV3zjã^YGiMi2ߟdy={aYԗYS w֓Si7 OJnAmӤ=f7% /Q0,Jʌ6{e)k�,D=..DMBv &BMVYh$UJ* 4Ԥ [C͸A*T\cXKB+l9ȵ7F-*Ye 7@yZKҦ>A8Z1NedpG2h 3^~˜0w ZG͚}40á:/pڎE]|[kvd&E;b-4Ll!ZF& :d7m Lb֚YS wyWV !4+dJ~?DS{VHk&!pjvjU(n hE#QɄKj'͸P-| mn#$`֢qPϛ +P:ضx17CߧJ݄Yׄ78̼\O1-|bM Ttk[G3&O;&<;^̘egg4՘J7myl~]唧)~OɇwJVDJ&&fN5ۉ/0WV57i'#[¨؇ɻSȚ_Af-Y5]P"o%! W .ZL�hj_ w'ZIoo1X됐nD *sMR'B'd� j}콕WY՞Eew7ێdhntWT[qº *z91z@e"<Ot[V^VY]r(aH)IMTBYN>ӽQ*N #*:\B>Dc0@T7<~'rY"m#wCqFH)ɃodvPKBzfܑ#l '2+U7^tMIӄ͋Ԁ>'YYF|v$ $Gch$,yE2 =~uT t[qa& B`0MkFm55f@>wI\0TFZC2J7TUg8T%\miR#OHhXvNB!C]kEaPE eb6XU Babx'j_ ;6,뭩NsgŢocrJϬ+<絖WLj7x#Z7U:AҖaEQ 3J W@,k4V.Ex?YfJlvQͦng},YkLj72/C&kAFV4!5N] [dZS3-RP'2"7yR'wzJ 2+"OkiMfFЊ:l-;rWwP[>΂GIed*S†PТK{"s<Ьi 2E8#'ѣB3߈X@0KN)#c dz:J̭<:3ԕЬlOԝ79MPOJҼe -UNJI+>믆qHJa&P<rȗqK!TEl_S noSMdi3"8{ccR>c"b\aXCqhڸ]B6Z^�`Dd훺 bi ܗeM0.Bfãq/3λ jY 87#3 ;2$r3z"}+%s7~w~mq}#Cmom3e\J5!mB&m ﲫ8ph2>RuC$ŷ fKsL\G{wm|G YS,Bj kԒOrAX!.a —*pF֋m1|cN``o]K2zzY:oRv Q2F/:@$&ɯDDe[W6N$pW7x lf\l/ OqҦ6fP-=_.ԣ==Qfd2[nXM"qV\&v$R#Y t0AX4)㽳Sl6+l4< D:$"EuVDwo[cq�-@hD6V*7B<o6 ćYdT{6�[%u1WE;m?^"vqXז ȸ {x2 1 Y0yԮ\ڊS߲NFr6MSomSi("2qKTӎ(v閑_;p EΔZσ)mKڞJVHΦvћV᭑S~5%Zs9yN?i)05Wҩ:5l'@ u&؁K$yi-P&@Yʘe FH#OX$Ʀݥȟ3`ǣLYZk5>(K(K$[Vx+ؓ)-{#3D Ѩ 5kW$YAvˆa߀nV6lMДm3i)":3aOYa|,hWj#IA{itmYYT/uX\;K*Zy2a .LsA c"*`mڮLV:kn̚w o1|%#GeK<*b2no]q];mT Gۦ}**Pj곃TG B`lJ#k6Ut>X B Əi}yHZw:3(ON¦v՝Fx2Xzq8~_<@sK{(:kbw5=)Q^Kʲ2%"YƤY6%fRIRhoy)C6 vC6K]dBNmEgD=B _ȈMs%&Y%M` x-,O{nujwerϤxP&T%s5OM{d'!5j.뭛[4v]^( tyUo Y] Vc%41*uvYoTIB~1Nm:bJ$dgk 6*cH OD>l2bXX[F$ pcfI9RЧG|I+A'Rm2v*7 s?%PWi%N!QOp4L%,,=dM\>m$2׊ o"<KH;qDX伅UMXcN(Mrq=d-MUT:Hk*(Ujm~~tLRb&░Ѳ? /G>` Ոg-\oxJ|&[@=RO=<Q|8Z8*^ԅY%1r":GHD(ǂ-5o['ue_ӄ!{Mu"_tV̭[%L̽D#RxgKa)~I]i!6 a*O,˚b(GY{Mw O6ck n3ɵK_LFvUZ.kP*fZ22:6\Κ5 M]J2iV5 8Q#M9!iB3Elm/ @x#05@qklWYZ4(;C�Ⱥ$K<%N1յv Y w C JNC]qY vb_|5Ѱ4Jfa:d)#4[LYN ':XJ$c݉="a5hI{d\F25k|eD򪎝 Y2A]#H$!}jlbTRʖeHu:H#!|(-l0u0S,NAÅVN-6/0 jfb'Y(~~-:kq#֭щCF6%XHִWIF<JTE6]dxM(߰&ݧݷ.Sƛ- cev:kTuN1N&Rִf;KS#Js7"fJ˟]`% ͣ{W'Y51wUZ*dP`lMkAtK^.ӡKQ4cZ<e+OSZY#I nT6e8FTL`Vv0)"vֲRuSMagMi9̮n뼿%L$#ss 9͸k֩4](n8繂jǜzhKESaJ^Z A'Z[oS{/*VKS8F6cP‘L$uvꆀ,5eT qD>#,%gAEͻ Dٳە}ꆰ֩"[ٍ7m+JBiVӜQcބbL3;Lӿ_.Nu+#k$qk I Q[?뫿d7[JHGz8RH%͖Й"4+~@nY>a%?(o]U,pttQ ;zeFG(A26P1M+'buh!O JQӁȐ/ӝE(vW/CgdA|mx!t4 Ah-i$5eʵihOc^P]W!i_ '2alr%aq SlZZ@RLx ʘR!.2 J}EoovgG竌s<{<r9펰t$Wh,#@حst]SZl,xR+G3&]oHs+_q.7k>#$BgO`v̹ldV_vOJR߿I~]=O:F?LD}Fm j;kIr6 K>c4+O\ wJ+]N5kJ!Tlañ8B\6D&1<,t>sDiė߇Jp6O jJ)JH~Im5b֤L4iD{wFZlxul-OPQ7c=aܚJGi<cW@XMW֟JkXa~r&Z' z}g{oXҵE{ IO[G1W , :x,10Jz³<BZG*r&y-'ڕ5)v,UHI֧$00!?-$ixR֡P%HVZձH4H$L~]M%'q`ٲRG$pUh%^ QJgƩiEX8|̝ඌovٙPv@]xKE[o͢Z)D„vYzgM0 <NyZQ:;juA_M'\bdVs(Soo1Ze>Bym=2ލtϋW Sѡ@ϻД,5m1pgM5.qC42ZEϛ(IES)k]srE,SԧiodICz33XɄmoQ*Wv5ΣT[㣀vdzvxGjj{09Lh5ݑqA85Iz$m>p;R`g%+~!1 ^{"/:kf6h VB">GmrU%ld/lb"`kfMd B 8̤y,7ꎵ& cKYy0OS,1~Uy]h+eԉɚLD QR2N'#`>L6peCEpw M-Vko$d'z!y{PvЮKr/h)ҫyCi#YbpB2]y2nSHW5Y<7KQ+cfvXQS(UI4>GIĿwKYcenLBbZ:J;dK$VV !=?֋X}#jì9w0(zU4и:q?<|c[gZ8B{UޝljYƊ%fq!i͂x{r,˪݌RQA\y6inrkQЧqV<MMUb@;KexN6a3νSƞ{ŃUh*9~T9x FZ $ czC=jg#!W۹5 d̵B:=o:U{ HccЂw[VvmP7lS:^>v5*xkz;vNNۃ)l:;1iPsn3є ;9V?s Q;"1  –(/%(x_?R;I)Y6uaqVej%c7,ɕ2谌Mګ] =c-7)cHv3bֶZc0.L ÔEg\egba|Ϛ]d8*Tfu)T;V-+$6RHO*Hjm>a7BJ i2ԬL57!%0tfI&˱٬Ǽ(0k lMzH+5Z&.\F%L.;{Q;:DQ>]!suĮZ) >Mr.|N76 HmT" dzZ"͡[N))JTMJcˠ W(iZ *lH~, t5aq"1([`^U)oF_KeDRHʘKW1<l#e'IVUìEgV5/4/ir&M*L:a<so.fPj8߬*l롶G'#*Y p͜T x%":b">U wuLLRvHܚ(N1hm) ֤+zgϬɟ I#UÓʬꪓr$0ƚ5|~<al7ܫOatZ ͚fƵZi N YUT\kp,)Zr+"ʂċT}Rެfxl<i2+1_ XۊӐցY 6[5OFݸ7a|Bvgt3%ܹ@4 f3╫lk65U|(]͒Ys`Qwa1\2Bt-<I 8^K˝ .vJ)wQĭWXksi-sUF˨YC;eL儒efdLť`VaL}QؘW/'IS`GZ\Fm(;,E#nK26f58KeBW0EȲb"HW~ %#+:KcKȴ̕7AɿwhR!&ؘ#5KJFW&4tlk@)WY{dOOt"EI~[>bO0"CM@y2˯I�ylQw&Ѭϴ+%L.+3.Bv)4}nN[FC39? ԕ++QaJw%l޺ȁFlW]pƴ0�=UD*~~Eih`ʕG4~5yR2[±]Ra7RܵumlZڑZa6 7" Ca|ru1:)PR~rZ34d#-xmVk/UY"D+S ω63[�� �IDAT25ʺhG rg¬vRgɋZYgtd(jC [TTih 5go]K ƱH͞Pe4*J,fbfh8ܮDn5JA{ ᛊ0phŵ!g* Bh: 1ag}zM@<>Gg -U85-WIye,z I/y@!I:fR7[!|jbRz?E))sJ@Agc!5=&Y$&R5^\4NFՇ8$'fju_cV' [N�*SFX놘,: ~U;9?п1QERM;C̩ld N/\KLrHqy%7"#LB觌3tjܲ̚IʆrfZ%z3Iܓ=;.ͼd"z0ɢbҠ&<o'bM.lWq+\l(՗޲V; Gjvpwڎ$ƻͲ^wm І\[ rwG5&|,ت(:ȈU&]E*K#kƚUgG]bݕMS۹9f-58bdz..SO* &(UfT8may(_.;9YIn>Ub3kAj%`!*\Uqvĩ[}__:6J2F|+Z Yjr肔c̀2҆4L`6\]rɌR%<EXQeh̪T2lNZV7fu"UNK&*uN{)�_!n* 2?uKTC \+I*f-Gv RBHcXpս A8,TLg+4":! _+H)brTIsk$"e"a| IQ'i2ʑٍ?ɛYu(Ϸ !9,d&~fM[el͠q 7[VN(Lf%wլթ|n\Iy*fî)qrg@&MihϏRZC] Kn쉄$10r$|,`/uՇw %,(Az#N\e+ P2feZY gJӑ-1ºR|d$Ѻ^5Ĕ}S`UFQE  +!Sz44aL3B(l&Ugò AՖ2y{)y됞FWeF]NKfyV3UV" (di5fz3%кhS mS+v ̼L=V )ŎaZF5"E3MSQhZbuPs7Z fk$8>(bӄLPK+!cB4KԨGx W%R"Ԃ jڢŰ̪c$d s5K]�V(0D6bD~CM:#lsC.t90k)XY^U”9ШZ*([CCS8qccc\Xg-*v!3>MȦS[dXrc~uHFJ:ڲ6yBEjɘ5KN~=*3D6lD y ].ut:MWFΎtPY5„3zdj#)qU5;\/ Sa. BpCȨF;&NA\aN-&TC<pB"8DXg@Z *6]y%W bY&4j}Ɉ ZЫ( \RPjՂ\QV;V[5ft,2U _eR# s;/P% >VPnUkYsأ+tT]5,3z 3$KKUls0kHGYi uS`m/a Z\5EZѤcTː:;à$jU˛WY]MB+,JT>Ug,zs@U)٨4 k]"3Vj6 3+/+K~~ B+(5xFh3PAC f2EI.V:W)fMjbS;L)lYb\r'yX+Yl:)Y]:Y#[La}Rx!^(ξf)UԲ<ǨCE&2C1g:R5[?C0V S;V5^I\iYEDkLu~Y YC:Vwhδ҅Z-0$6f7a^aNlNǵNB6yZ|M&<_kJ`֪ܔ c5H$?"j\tkuBrѾ MG<; f-= Ak)T K2H_F%[=KDG*T0w^0Nk*G1Xp8:ZߏaXbyZYu [fk[k.b=0jålccTFXg`>wDʚBv0MNuv xR2IRȬvP'Y1 \ ME\: SkKB jkY'Q?blE0kuh&i?ivMbbGZ;\ueM?A!CZk*`M)vzTk�Dj=5N:%jZ:&=1A2 BhVNdhMA5eVSrsl# zr"4iʔ Bq^luW} f\*WܴA+P%ƭ7_*8TY< fHRr XQռ^8$%oH^ YXbpjkmz X0 kUӁh/"zHf/C0MJr&=@O]tfpe: hV��������������g`Yai9E] ԃ{ Hf͟$:9<٠YmҔV l�� EUXv&6FtOj7{ȟgsϤ? ¯d)cP`0k='*;HJ�o-B̈́opSo39�hdhRGwA)2P"/Dcq RhOn CH!`U%Np5+PX0kQHWz:pM~yҒ?Pʕ&c!ef\Ou4gHך0kVA0守r!ceH7.C*7)2T2fA`LnnʮY20 DZniƍm}:0h'9 L*aԬ<ȄX6a*+tjudtMл`Z$y̌w yxevpV_eqe'X/u1Av ZSfUzUd9О Ak=k[Dh?Q6GX+܍U׊Ѫ,Pƅ6 rȬ j gVSeҔM<BVEmv2�y 58xJ$"JQo2vKHuB02VY4*&ji dVJOa0OxFYkDPOzTaOV8hϖ-ןb](U*̹ Yhu 6TgQ#|niX-%5ex3c<m\\ !^[eC(5f*4*27kA2(#T̥妵Tmy^̪נkʂt VKĝ:B v!nwʠ'B VR>PCjR+؎"=-͜B_)bS:rKYfKl;\+~2GH!=N^edŠ+m-*)`SM,!)`'`er3$N٢ (2DġqJkfۄ%AŖbi$2ThVjADuibEltZVR>7_O}C&} 0zI&|L%ٞ:^Wpe*fMBWjo$V\}Ku}ȵ`³CƤgClDo|yur*w0:g-s\Te9vĜ -VWLC3cmcw| vYx'.sV[:ͳ TL:6WF`>ㄝ2}ޙ$m<!gMeGc4v-*gzE%,jW ~_mfuUm_g"6. M ͲD`KH{ܦLۄJ<ǻM)p."UN6m#;f-�1m\ M1UwF?SӼ hIԽ%FG[1:<gP5bW1T<z2a9ebXjQ~B^#BF]5J0nMAR ]]Mؚtq9Kr'kռ(S\ȂY MtsvTlq_boK22[^tK<mTaSU>MS356_,g)OZ7պM)ZPIƀ5 22S:zkH G6>é8[n]_~e "X͸I)YsL;oPIk�Y1# yS=0e4I`K]6\בDI}|kv<j`"|rVy"O&-0jS9% 'ZGU yZ[TFG+#=DX5ײ2ˌO'"ׄٝpDWWBmk=mB72I[,g"P--bs'KtT  w`Agc0kw BYϊ%dTL8hpV6MPvݟV7.3;ˎRAyNB.p}$ȿ?J)qMI%Ⴎ`iUoRr6nYO}i(ʟ"!crobI*dP3IIȆ s;ÑT'2U'.w#L+؍+Nanىiu@qBۈzNJ,ӨF6CZjV87%ɀ(EPlJ66soB*jd(q<܂{(6*rk ՠӑ\ bT`L윰B1*/Bg,aT[&ڪ~~fK*^_Un>t+yT=+,˂\@a mj 3iS=$M4><tMɱfMe2Vz®F2T[\o;}۶m+T#\[S $W*}w/ u"\jAHvkieO;?p޻6n; Yn+SIW[қNL\"'W V&JSGT`ޖH,tĪ  x93[&0>Z3ep,Ad$*]r",S(_%!9Pv#6/1PtfuK:esxM`ڴAt.42i#ꗇ%ub7V;YOKO;NҴY Lz ]p/eʤh:)[ZgDE1 \B[ӊ:#BT"3/#'_fYI,iUi(mZ8`ִm۰&Sg)IuɌ}cɔxQ]ZMzZ0DW[M" ՉkYvu9 X,L(aisNWFee�lJy( Bz4v0լj/-V}JPic"Ɣؘ$jc:oHUV7̚`͗@ %ZT7BN t5դ U"\Mř"8?aY$fu_ ĤxNRӬbSM.Co1i;Rk[ƌ$_ȜH&:ikdx0eSV˷ uj1TWJ$SE5Z!QSBus"ʲD;&Y 'EA;LF)}ϢMI$Hc[:dȁY6SJ[kCq Ť2k^YMsZ7P%is09!`EZF%< Pea5BWX3/"pdu;(E0.WXjO]t"@>Ehk-z#H4ŝԠȝڗX3MqIdni2r?'\݄fmK|Y\a~U3`vV K^oK]SN^kY^T'2TdRacJD2Cx]Wu䉟4q^tjG*Td(LPjV  5U'Q{fM)iZ Եk*gKģϵ6HTP;nJ%G4%6 )QT)f.yc-:E[ɪŨis0uh#\.LH;'MJ1�58y}7t [w^@X@[:mU&~e](1�0b,뤓 kFSfmcE$s"'Tg$@JW"2an~1.4H/kt%) jQ9<Af lτ3ą N5[kTdO}Wa>k.r i@eˮ'UG(ui)SܞѺD]3TY+ncUʑEdl̪͆E2r1k1L Ǩs+,골b ?%I#-XFxz (*X9Ɛ+X9c-`!B,^3v X SבQMє@.-ș14Fe줌qĉߡ)޻73ϻ}8d"M=gp�^F !dUby˟J=rW %xT6UmYg|dޥJ΋jI". Cq t4k05Zm2G|)S#*sX߃)}abwcc;쬔wɢ\*frR7[=Ӵ'I.7&zwY:YA0iQ\Podm-]glO%;ЬQR)GiΦ (͊o YkͳVK^QSʸ$)Xq_aHkl?.$e͘vOCғN]2uDEDm>ȿ B'87$|>В?kZ?/ ^Q;\ji$@措|-h`>pdOSG{墳=8D0#-u XzMTdZ5>ZQO*ě]-}ࠥҶQ36I֠H&Í&,qkwlEw/lB5Ee %;]} f/Ss^w l -EG5e䏫퟼po2y4ALoJuͣ4rz֌UiIaRBNtɾQSmfdY\lSt.L7,5Z>f%WȔ"D u@jYV'Lf7Sd-I(/Gc#E 3ޞ0-W^Ěo}y"ۥ4Ⱥ[;CyLsoemJy-ie=ktmT+9K3G y$k>vVdq=A/#pӬ J'?^֒j-)a eHFޮɒn8)D2$\LJIyR<|x-SDfom͒NG<JQMٺfeZ q'S2^u|U.F֪Mux{/\sR ;t2ڎ_|l"X \F=Z .2nxkeGWk\KAO s�� �IDAT.rۯ92E2^i7gI"\]ҬD;WQU2Ɇi3,UaG4P?MV  Nqcpkq_I 9=*X;lMtUyK|4_ -xfmt䑵RJfIWBR?Bf~\ J_WtZ UwXiIKZKc3_/ \¦eb {uTiiyMq-Y\BI'qe0[?p6+zFYI<e@z._swb*"8\'\Q* \נ1Z,Guݙ9rRG=7+VU%@ +-5ɧ gQ*\g[ZDP}U0mܮ?0#sJ9OnhV~f|ATd�sR 1ӱ[m-J#H=ՕV9̨ORBfw?Zk2Ce2TSPGiz&kwWANQ21m<m9 \ qwIC#2Y7}jtAoIh>^+ YћP>t AZOLN;vy-Nd{ ~gjo2^tw)Rf]X;մnURˑ(;߸ΐiԞX]Ѣ!Y~6)r[R*us+k?V$+UB,zIƧPsSH+_[W[|)V}ŠiZ]0 Lda[rd(A#Zdђ2YsfTb)kR i;6>Fͭ<Ytf'ߚfeDa;I//}/N:y멐"mcVT*Iל~/Eĥ fP[q5!j,=f7Ld@ iuYd-O*_@_"y]^?ϦMҬQ)r̴dmD_%T%:g"2m,YQh.V2 E ao\EQ ,3sLun+qlEfmU7 ֶ.UY6A<tZy%`J62# [\T!Y[ Kw'I{̧-,W<:YYUH59ZB(ʧNTҬKx[hl27MVoF.J-IjL~e5Q UT+3[eוVV!iM`FksudjQDkJ-)?1_4?<V4sؗ*6N^.Bz-7턣&2-`odT(P5̎$B|-?nk8E<Xl}wUX*cؽ(`߀{bn?/S_Q FM F}3uz{bX }MG6ʗ w%p̍+-U1,[4VӬwˍ@K/^6ԻmZF)jbD>@Ge eK"2jHZta 4Z` HŋW4[?O4mZuC"; r"5ӷ:YKͼl &e8FƸ]SITL]|*}JL>V[#k_|#B-ܫg pl!U7 ߄`}uέMQiU6W giEkT<arثdjΟMƥ߇1SSr'\W':9~ݜ"5֔!ClR{6n9M>GzA=S}UYte.::X×{x@[pWRzך.Uզ~]QՐJd;ӸV(&Aӫq[G$ɂ_v[g -)b5PFZP7.N;*`ٖ^&̗Ր~e9,wAM% nP3U:%I.ZyMl#lԄnVi0g [dM~Uv`JV\kb [ˎӄ!zlvlvi,&;g%H_U5rb̳R/w BZEڲ1 8ֲ#goVޯu5P4d/}<c$ g_ЫNgv"&dNUȶe-h|_>1Vݬ|տ(e^L#_If*N$mOd_f]1{&ʒ%Br6kL]䐜-]fefE6y\r%u>hȄ Q]knk;~nڭ�8or;,J5ϸi^WWtO3o].SLegS$s{%|!%|L能YK uڣ’ SAѵ߷,sWʣ&k##Y։2Ra<g7\rPp؁ $$Wa RPº"cS_-O`n`-i\A5+Țf,˂ynd*[~[HWUr ;J; |9a@&P !źO$/g:(x;/B81VΤ~ǔus&wrZİm}'#M̞6儋rm),bR;˜9);w %Kqﵮч3->hC7 &uTFsrw>Wf39ݽ?R2:-<J٬`1@(N͔/bo{s{nV.|i}Dsde*n|}=&\REXKi1HS10s.j2<Ή_b9. 5Iki1nZѶEVI!ipj}Mw]b˟*}ω3 6 E,n�RL]ЗD$;ԧW d'O4aU!>nZѶEVI-+OđUw! 󡔯r/CMvD_,Ww�տbiD-$Ź'p?T{ or8|POi u?*|xc&_Me'~+BSM/_FkI&qvɕzNlfkI2JJ̟z M}ϽrHfCmS)piN A69w9hYߊRɘ"I?PIfOqY R&0 6; Z`ѠY24PrL[k =sq*:iSr[+lYƭ) 'F|FUyJ $пR]zHcupjsf77^<y\]~ZF>)I!J@`Ax7갘Q,qzu<}2Ik}+Y=HNUy뀲MfHߗlfM�9 7a nEkVpabdfUfp:Wi98uj]!Lt- @4YB D/0Zjf9;КIh2Շ3)b%7;im:ԧ5;k’l+람DvgYl$#_E?'wfy‰aD*Z'$k>u_W"grةZkVҲ&ΘLНgYsВA!H;LuU2bZ. *̓@"b'<}A׳fp']AW3u`{.> @%>*o40*-e˻[`ӳiVfy934A am4 NA\*l*B<Jez{|4Jٜ B6.舵($嶬qژOippfXks;〬%eYɘ{˔.Yx%q?F&a%7?7)!>_ռD P^7Oiq|3[62;MCWo|5\^$U%}%vQΥQy O7DYk>Et ~bNV_fxWd I4Q76WѤ/[V$2iΛ*<+SJ%Pp G[cUz p̼JDĹDfi!|cxE%;'7x% V e1WK6x۬e58w%4y2r p]KPv�FeW#Z*vfdxѲ5.ȺZDJ: Dj럱)ΛtfEҶdPĤH9OEB# 7Ӑ5Ӱ|&ePAFy4[!9^Ų+EIj(bǘ᧏dFThwY_e3`+3]u76ҐL>rgNmOU]A=j &[+K &W^oI:k.ȩ]"tPgf3/(=zpzDwC ܤ1367.Q+y[Ě�Bi5.k(.q&"yp7XlrGja}̈":Q�|M#n_XaH$�"ee&[_Jz%DFUψHKAZl˚`T~ jG݋"mse .FHM__ܯ oiӈi W鍃XWj)S50G<8G.BSEznb58ر`+RKw*'u4/DAgO$0"k^D4or6}ih!6j)XcBߜ=�@VB(44w/ j"U'uςU|P?7ˍSXQpipb{VA`E Z9"~{Ϲ_+0>l>l=C@"" Q0y֮pSVݛv3?=>l.NR{1?lЬBXE$pT;DVX#o(XedhۀH$24CcB"pT kE1ꓡi.ť ED5F^dm؁r\GQ3Y|!C2ʋN!wgD%%.ZQ "(L"'!Gdz C8[l/t%^-"JOfwGf(cSW.排_n"=*YOst nslv5+b!p R0Ӓ]cC \n('v V&4=`-<#C Mu?B_nM#BMi\NSz4'Ik.1!F6(*%(ˡ,Q|5U6J.[|JǴ$u%')wrB Q+VMNFNWz�[ _[Wڿnx;_@fQHOJa?` xӫJ$A{8ͷ@M ߾T׬? MWFD̠=35(E M2Sʱ pPY$ $O ʿU.mc) )YKH4|B[D˼ n# }Ú ط Y S{SK[F�4 *cL8`fd,g[*jCζ9[zwh{t 5YlMoZ 0&\RPꄋ`>k'&@DI)T~H/o "B>YF CXRBnWv/Twe &M5 IVJ=f @:/__Mخ~ԩů_!h]dp>sY:J}\4Ǘ/~Ջk݉au+̡a%ԑŲ %l)IØϊexݯD4Ow.QzQQ UywKnRPCGhP\% -ۂZYLf|רD#=JV<%;̒b%4%lƾ3 mG{Hfx/D>Yѝ>utTdS E!竛 vWcni[ }w6YyU)]V# f| }ݕA`oW9j$Y5SY@LݐxU L~B1#p2+z :7ZD3ȺQ! c +xw A\ԫYXL#=NNr2вX\hDrW+v}X4SEvY xV<r(z5~g6�i ӈJ*T|/㳟�<#}w1-YoXCo[Қ;(ir\eZ毐m ىP-Iu{Q`Mi8efȺVRq}j՝gͼ+Sk 6ᄅnR>owu`E}5M27lR灡d]Bn icj̋U׺mA#1a HIuoӛFI^wд_ͭ5MM|D+{3茛vY F>"90i^ƿ]{Zi k*ѻI'%}tw$}߂ aWFQB<v`OVZU<hѻ7kErYKTQ6PNVBZk&KFP N>?mN },ъHasdTTTD|4=|w8PpJmuK !du#ї_TT,w%Wdkah0,l,�f5I/;.QF]#r^w{rf{!mnu2 h=2H[� 'Ĥ >Wˇr-~tTxW.7`!;&uAUԖCo%k2J(a[$i}#efaFׂ( jXt(u<XZ<W>o9ɴApNV3 Yfœ+kTٰd-v3 aZ"!o ͞i(wRWI r|D"{n?\#knJ-? 4ݞl,a'oM/]iWI0֒Dle <�r1A:WeZ?\7 nt4r )P$wT0yP} ](F'?{^EI PV堸hV*|oK,m?xQ3EȺG;#q$9ԚQMX&AheCapklcA= * JU>q)aM/bp"FԄnpdM@В7<`XsXBF61s@K\C( -DjAK.1&tJ/ &`sꟃw>o.g#5wYpood)|pH@=*C5'2t Z-ZSV-k_L>|6mz,'EwLS4#aXHN=Lml֪ZP+v臓̞jJf5. 5f*ҾXX> kILfv)#goA*9)"\DΚ xi IP&1;--9ƍ�/ElUkҘgIkثfg46b"kUBs%Kkrŷ>{GĨ2"&e(BXPUq%&ZS*Yk/g!Y{,uY Œx[MS@KT@.Ss kp-鉈W"=]oBjl`Τji%az*/o~_s}lJ-R�� �IDAT{#G:"gKFie^7(X[aH37#*~@> 2$_˿7?4k�J{|rg N0xk!~<"M(guNqʬ\'JXu0vN+^ׄZ'ݞٗu8yWnSb|%< 6{.>|T \X妚E-#a0:CsQŐ;eC - W_ꞣܸw;ڕsKkV;Z3i]5% CrX es]a"PI@F5pB_>kdXPsI/_N\dݹvE$V[7.<q~ӵ|>H\<㽍1V }B_,,7, ꕔAYWܽ_'ًid̋4q 4.t]UTԣeKrrJ F=Z#[lv!Y<k p4YWM4Li69}k2?|*F [J'J䐫h . ʹ dE뻮i4[$- +2\Vl3pEQ |:ZjIIMe}bx:Qڽw2ij4Ujb H8Ŗ7j1*x/OH?W}kBsJchV>C)mzP`V( nGNzvzԣ'{z™,ת :Ө*,ɚQ!&Cuzڗw/|DggnBܮAp*?lf6xWilDYIY:`*Wֺjsvd.y1m]MeW%jV+>,ׂM> $-}EPg"e`?_r[:?|3Rk:ܽ.<z89h5۬7nWELqDVJўB-ȎZl0oW5ŏ4,1Ak$eJ՗[&0gny4Jo]NYgD"͛O%, <8*Q;PP9.~6ZT&+A9[W*7$61|>Y"uiְ0L>jwtn;՟TS ׳ -ɟܸ${\+:EO&O`Y=n 75tSq79;U?i &K:+>MޱRԭnUvRJT/Q)ԏ9 76j7S{ it71'gVMv|x*5rHvj2(XI fG}[Z7} SSV7Ӗ5-}mjV3ǫz}}Tϕz>2LV0TکUNתgW{g:VWF2'JDr>.瓖7֤,[f^XiһZΪ2`FW=p袤;{QWD=]UGb֕=N.d}71ս s(w}٠Eeg/;[X-XfQw7͂])[̔ Cj7g#y5/nU`wJ}ԗ?RJ)uYfSJ󔿝؍z͔R_ONpҼ %] ֬]~pơ*;d|cK|u3uԫD) 4`۰2CqC<7uc4 Nwᇮ8?ԦQxeV":6ʓ5ћe<T^Bn.Q'#R?^~~9n0EbNmYL?HT85ni y`ߌ{P߯>Fn`vj,2/oT V ]1xs>~6~n JR~${ͺo?*ϯA{6 nʴA3Zۮ'ƾ]*{}%KuV),MӮ?3Tqvyv/q5g;/Vy2y,ߥ- ά] qe*Nu_\=;ƪ`1>f0Q_,9ޟfQJKNsxZə09 [UB-q]u%o#/ߖbV#Lv͓R/KiC?jl$nuQ3I ȿB{ hN%dISGh9aߚ|̲Z%<w?$G4vd1MsFVNLZU7uqRZӻngk_{WjƓK _n6lK7UMEX^}`O)4i x4`ѪH?RcMg%%vg{=7|O+m67]kJ%6n.5uscҼL hx{52lss n"8Vq1s,Zv}0<XQg- ]B1we76͉vQK˹9lPmgA.n3Bf[#(esr9dΤT. 7'aulm9$N>fsM5[>՞A3͞|/KI\_z:E"_h|w̒ȹX҅*XT/e�3 =r 6WZx0"16=<a˰DZ= rN7IÕv?3ͨs(<_6h Hb3Mᅉ%O+-UZRLeq#sBf*B 'W0-\ywtڟ  uU;9{}·gӅK If=U=$/&" Z4aI y*L4^J`۴WKaɯ-LIM/{D]d i>X/K}n\ηet y&k4]eZ_ 4TopwKѬg]yutУ*am ?l%[-K%l7s}5f5Yٚv =#՚F'*{ ٙwK%2 yUyejyֲ-e-צ1}Q|͔/ϲS&FUf]iRv1*֭%vThs Yzk[*[$U8] JhYukSH뵫y)j*;$qU`=o>[0sʌ. u*uVIu7Ŧ| Mm^j+c*[LWj-+%<IY\]y&%6_pUŚW/ >+"&4V!3rL*2aM3BztMe4@W͚o&j&cIi.i9e'n*?ÚuIZDF̿P}.~6ZnOk iPAWbG><dK޲lz7\&]·վ|qڔF>rlɕl3J|\,̗%J{Bر.s]qLىjv~pV.Xe'__^%@lrTr-Lmy$y.zڽe*ךgZҗF]҇Dk_Gۏ'u?'T伩d}jp˜{ߔ{zK:i~1R1ɾ{dnGӢVsvS8NjpQos0!T}Y3LI*ѫ8v"Y>aw-k{4ʍFpaə!:U$l4+?yYVWY5ߢx{uz_ܺge�.Ykȝ2ײ廷Uw3v<[cn4 g|uSŚM eNRfco_ +.|ziOn]AH)߉"8HDܗo&܇ak_"Eޞ}[ZO, BGc/ iKiMS[UEb4&ަ_zR_Cb5'ȡ,b_[(fƥ)EIUy@(_mV[&AX?^kܒc$n׳q$i,;;&̈́ytա?^j7<mp|(ɅߨOM__ `$N�J1vU+=cD4d[?\L-ett_go"P6qtyNKkNScx^x;IXӕ^uӳR//mA\| J;Z03i׾'3TiΘrnY+rP+{ƮD:Y ~edRgݎDO,M.JsЩW|ɔes[M$SY#Tcށ>ϦG4˦ܧ U0<Jˎ\K:+U}HVۚ~v9(捑5 <__@{RgL<Ȱmفxd6ron>6MGTLY3EULeVU91>y^0EyhH.f_MөvԑVИ4^6Ν@e'ݫMBPzK?9 (J(%W{ yeYuJ–QUAZYGk\&|3 iǒ$|#uzvPc<S}8qMȉ)蹱c%ݯD< M0_ v&BIVeϯh~~"4B"8R kWz8~ =/<zڌ4L4IJNL;Uz{_oWeudW`Z!'.VMXOES-[sQERJ%.6l~;+gAZ:{~K(G\Pt rP)Q2;Ӭ&V,| ε'0L AN)&3q"v{w3!ɟv*('}(L!RX}W>g(#ZFc%0Đ9גd VEKAw/3�&!3^k|CX:}1>s~gc-7PPS0rX%K8$ȾfQU[`*\Qznl ^jnxG5P+IFS0,$Nױ`9lݪu9)"qdkx[�ܲxGR ٚF7S̭{hD]csC0*e.cV:_:+\O?Oo}eO3üpVҜUw dPzё9*4ST1+jh E!t.^KxۿٛY;85'%bBQK1XysmhRW'-^-f"4Zp ~O;`b:I;ye6Ve:_g[O+ vrBUw3w߆\hkBG^>ZGrׂF:vS3yR";yOOVS#"<-4Q!V}"sL I˴!>xo ӢlDធ+5v5Gxwc;xω^]\/?X]\kk.)CdŦݓt$"-,Yqxl]Voz1Ϛk EΘ/jk7%mOޒI![_&,t{<w5/S q1-|nj#WUⷪ˦}{6 k#ﯧo{I=P+5*4 ʗ>7K \!&C-q?%BD26G 8-HoYҽ[eJvٟh`3zCQRҳ QNq; 24.Y2[E^?lWii3> Ry9ֆ|7F($gɢwI(U ~eX1͔-G]+ ^Qbɵ&Q3{/*NfI6p8ϰ ju^s_8Vݔ()PNJS;9w0, fo3D||ժkM,NƮqťIQƊ1B]1oKKd [/¥_uō@죆܉ QjTTQůudr猪ܯ(e1g"Q =gS%b{6`y3NKܼV&AyXʒi&x: 2, vqE}uyϔ<V`*.ہDEuW kKL%'e':{3οN9YT(猭3~~N}bѲ]%˗_hyl]]Jg%#?mdKE8WIvNUS>2..>8ٍ(-[}Z1H "'/w9527+mV ì{TkIG8Ru7glyխNN5GN8Xmz9<XS}(۷2h\ *)K.<\`nGTVf6!;mR>’=\AZJVT?hVLjIipS9@ζ<S V\-MI:/?LV\2KZ0&O'MUN PpК`Ԃ6XB5:rCoF4 hīAΧ7_cZfrRhֽbrwud}.I)xv=& >;`9HHM Hܮ塐|r8縴Eqp'> FK_\YRJ}ymDLoNzյ(2RW"ciNc$>ܚqXE3) ݨ&Fo4^ ?D M (nST-2Z$kq*4Vs& ):9Bze$pk8M}El:<3l|23"6sfp_Gđ$* 5'8Dif糭 &}-Z%JfY*A_tFlw6ȚjӥgO W=9Az­9:6UN|  @^ Gb[iedypPm2bZ\*_~{[ kI&>lݭR/ asa58YIW3fRӮL]1c"HNˀU7ךvwX#שAF89\[ ktgĺ̤XMDet(lъXX_Q[m+ $,B[s8^ {;+j,%όOS2z}rkU+cq&Qki\%v+Jce0X " R{[tE{$3nl:o̿О@%Y>LB~+ WLA:I?@ ^%Q:vU휑rJ75yfR݌Mׄ") /1}%q0?JԦ;^%QȪW~2*e+i%VԱO|V7ڠMv`rxZ&È3U$ƅdG9h}=sjuϴW[Bc \ݐGiļ~Bmg #Md8"ՊOvyUt~JtSwOr &8[ KUH0f\[2ጟ)Jڋ5wcY Cn 1zfDFG2��nIDAT>$1ѷ\QH$Aiwƭ fupk__,}m0 o$8N?}}f2}eGeĞYYr*0jt-}q˃r&YՠNu;ornĈ=7qת?Ocި]h?mU+b(%_͞6^ʋ]|XBcAJf=GAbLhU$/ LlbaVQV䣾{vOju@NFMm$߂u_guFB_R<M7DWYeukd!v kj]nlYGҒQKt2-MbJyQkwr wTtՏUÛ, ]:�جWBcT$ H_Ē.og0ju HD'<t'b#(|%vJ S/YP=l)e{"ȺE\웙 Qwr.孀GLb|5됣8Zͧ2d 3 u)R! PRu=|.v8 iz&@MÇ;q$ף Vʿ})zW3JИ^a;lGQn~ېq?E=>c 9d{4+@  +@  +@ @ @  ]un @ ?l))@y?Au,C.[[ "vza;d +@  +@  +@  +@ @ @ @ Ȋ@ Ȋ@ Ȋ@ Ȋ@ dE dE dE """�Y(x^n>[)z^ǍӟbsdF Du];_O&y%D6@ "Ķ\cI0jGAV@ Y�Y�Y@@ "9U] ?,\L7dYE2h s29"@ fE ޔtA<v@hV@�.' +@ ՅdE J "D @ œ\k=>tɐ Y+FɐJD6@ """"6OS'@ OZo H׬ƽ@ "?ٿW@Mp����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/index.html������������������������������������������������������������������000644 �000765 �000000 �00000027236 11555611701 017403� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Introduction to the ds9 Interface - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Introduction to the ds9 Interface</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> This thread provides an overview of the key components of the ds9 graphical user interface (GUI). </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li> <strong><a href="index.html#gui">The ds9 Interface</a></strong><ol type="1"> <li><a href="index.html#gui.menu">Menu bar</a></li> <li><a href="index.html#gui.info">Information panel</a></li> <li><a href="index.html#gui.pan">Panner</a></li> <li><a href="index.html#gui.mag">Magnifier</a></li> <li><a href="index.html#gui.buttons">Buttons</a></li> <li><a href="index.html#gui.frame">Display frame</a></li> <li><a href="index.html#gui.color">Colorbar</a></li> </ol> </li> <li><strong><a href="index.html#preferences">Setting and Saving View Preferences</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#components">Figure 1: The ds9 GUI</a></li> <li><a href="#vertical">Figure 2: The ds9 GUI, vertical layout</a></li> <li><a href="#menu">Figure 3: Menu bar</a></li> <li><a href="#menutear">Figure 4: Tearing off a Menu</a></li> <li><a href="#info">Figure 5: Information panel</a></li> <li><a href="#panner">Figure 6: Panner</a></li> <li><a href="#mag">Figure 7: Magnifier</a></li> <li><a href="#button">Figure 8: Buttons</a></li> <li><a href="#frame">Figure 9: Tiled frame display</a></li> <li><a href="#color">Figure 10: Colorbar</a></li> <li><a href="#prefs">Figure 11: Preferences dialog box</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="gui">The ds9 Interface</a></h2> <p> This thread uses Chandra data from an observation of the Trapezium Cluster (ObsID 1522). The default ds9 GUI is shown in <a href="#components">Figure 1</a>. The main components are numbered: </p> <ol type="1"> <li>Menu bar</li> <li>Information panel</li> <li>Panner</li> <li>Magnifier</li> <li>Buttons</li> <li>Display frame</li> <li>Colorbar</li> </ol> <div class="figure"> <div class="caption"><h3><a name="components">Figure 1: The ds9 GUI</a></h3></div> <div><img alt="[The default ds9 display includes the information panel, panner, magnifier, and colorbar.]" src="components.png"></div> </div> <p> The default setup is a "horizontal layout", with the information panel, panner, magnifier, and buttons displayed horizontally across the window. This may be changed to "vertical layout" in the View menu (<a href="#vertical">Figure 2</a>). </p> <div class="figure"> <div class="caption"><h3><a name="vertical">Figure 2: The ds9 GUI, vertical layout</a></h3></div> <div><img alt="[In the vertical layout, the information panel, panner, magnifier, and buttons are displayed vertically at the left of the data frame.]" src="vertical.png"></div> </div> <p> Note that the colorbar remained horizontal at the bottom of the display frame. This may be changed with the "vertical colorbar" option in the "View" menu. </p> <div class="subsectionlist"> <div class="subsection"> <h3><a name="gui.menu">1. Menu bar</a></h3> <p> The menu bar provides access to all of ds9's capabilities. For a complete description of each menu, refer to the <a href="../../ref/gui.html">Menu bar section of the Reference Manual</a>. </p> <div class="figure"> <div class="caption"><h3><a name="menu">Figure 3: Menu bar</a></h3></div> <div><img alt="[The menu bar of the ds9 GUI.]" src="menu.png"></div> </div> <p> All ds9 menus can be "torn off" to be a separate window from the main GUI. To tear off a menu, select the dashed line, which is the first item of each menu (shown in <a href="#menutear">Figure 4</a>). The menu will become its own window. </p> <div class="figure"> <div class="caption"><h3><a name="menutear">Figure 4: Tearing off a Menu</a></h3></div> <div><img alt='[The dashed line at the top of the "View" menu is highlighted.]' src="menutear.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.info">2. Information panel</a></h3> <p> The information panel displays information about the data file and the values at the cursor position. In <a href="#info">Figure 5</a>, the object name has been loaded from the header of the data file. The image value and position (in WCS, physical, and image coordinates) are updated in real time as the cursor is moved. </p> <p> The fields of the information panel can be customized from the "View" menu. Any of the default entries can be removed, and additional fields can be added (e.g. detector coordinates, min/max data values). </p> <div class="figure"> <div class="caption"><h3><a name="info">Figure 5: Information panel</a></h3></div> <div><img alt="[The information panel of the ds9 GUI.]" src="info.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.pan">3. Panner</a></h3> <p> The panner allows the user to view areas of the frame which are outside of the current field of view. Although the display frame is filled by the data, the panner indicates that more of the image is available. Clicking and dragging the viewing bounding box in the panner - shown in blue in <a href="#panner">Figure 6</a> - will display a different portion of the image. </p> <p> The panner also contains axes to indicate the directions of North and East and the directions of the physical (x,y) data axes. </p> <div class="figure"> <div class="caption"><h3><a name="panner">Figure 6: Panner</a></h3></div> <div><img alt="[The panner of the ds9 GUI.]" src="panner.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.mag">4. Magnifier</a></h3> <p> The magnifier displays a magnified view of the current cursor location. The magnifier cursor - the small square in the center of <a href="#mag">Figure 7</a> - outlines the size and orientation of one pixel, taking into account the current frame zoom and orientation. </p> <div class="figure"> <div class="caption"><h3><a name="mag">Figure 7: Magnifier</a></h3></div> <div><img alt="[The magnifier of the ds9 GUI.]" src="mag.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.buttons">5. Buttons</a></h3> <p> The button bar duplicates many of the options available from the menu bar. The buttons provide quick access to change the most frequently-used ds9 actions (e.g. changing the scale and color bar, blinking and tiling frames). </p> <p> When a category is chosen from the top row, the options within that category are displayed in the bottom row of buttons. In <a href="#button">Figure 8</a>, the color category is chosen and the bottom row shows the ten most-used colormap options (additional colormaps are available from the "Color" menu). </p> <div class="figure"> <div class="caption"><h3><a name="button">Figure 8: Buttons</a></h3></div> <div><img alt="[The buttons of the ds9 GUI.]" src="button.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.frame">6. Display frame</a></h3> <p> The display frame is the area of ds9 where the FITS image is shown. In <a href="#components">Figure 1</a>, a single frame is shown. </p> <p> Multiple frames can be opened in ds9 at the same time. In <a href="#frame">Figure 9</a>, nine frames have been opened and set to "tile" display from the "frame" button. The current frame is indicated by a blue outline around it (second row, center frame). How the frames are tiled is set in the "Frame → Frame Parameters → Tile" menu; the default is to tile the frames in a grid. </p> <div class="figure"> <div class="caption"><h3><a name="frame">Figure 9: Tiled frame display</a></h3></div> <div><img alt="[Nine frames in the ds9 GUI.]" src="frame.png"></div> </div> <p> If the display is set back to "single", then the current frame fills the display area. The other frames can be accessed via the "previous" and "next" options in the buttons bar (or from the "Frame" menu). </p> <p> The "blink" option may also be used with multiple frames. When blink is turned on, ds9 cycles through all the available frames. The blink interval is set in the "Frame → Frame Parameters → Blink Interval" menu. </p> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="gui.color">7. Colorbar</a></h3> <p> The colorbar displays the colormap, bias, and contrast settings. The colormap correlates the colors used in the image with the pixel values in the data. </p> <p> To change the colormap, use the "Color" menu or button. The contrast and bias can be adjusted by right-clicking and dragging on the ds9 display. The "Color → Colormap Parameters" dialog box can also be used to change contrast and bias. </p> <div class="figure"> <div class="caption"><h3><a name="color">Figure 10: Colorbar</a></h3></div> <div><img alt="[The colorbar of the ds9 GUI.]" src="color.png"></div> </div> </div> </div> <hr> </div> <div class="section"> <h2><a name="preferences">Setting and Saving View Preferences</a></h2> <p> All of the view options described in this thread can be set and saved as a preference. Open the "Preferences" dialog box from the "Edit" menu and select the "View" tab, shown in <a href="#prefs">Figure 11</a>. </p> <div class="figure"> <div class="caption"><h3><a name="prefs">Figure 11: Preferences dialog box</a></h3></div> <div><img alt="[The view tab is selected in the preferences dialog.]" src="prefs.png"></div> </div> <p> The "Default" menus are used to set the defaults of the "View" menu and buttons. For instance, uncheck the "Panner" item under "Menu" and the panner won't be displayed when ds9 is launched. (Note that some options require ds9 to be restarted before they take effect.) </p> <p> After setting the desired preferences, select "Save". User preferences are stored in <tt>.ds9.prf</tt>. At startup, ds9 looks for the preferences file in the following directory order: <tt>./</tt>, <tt>$HOME</tt>, <tt>/usr/local/lib</tt>, <tt>/opt/local/lib</tt>. </p> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">06 Jul 2009</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/info.png��������������������������������������������������������������������000644 �000765 �000000 �00000006137 11332353405 017041� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��^������P7ц���bKGD������ pHYs�� �� ����tIME_ۯ�� IDATxە:E^NNJ0zB^J὿P%J_�oB��!BА?ؚ_~! ]7A}/=�{ռn\� � (ϧ ȝ_e;^+ s7m۠Y~EFY^"~_r%5p!~>J{[[}#{DW4w(j}eQMޫ'@{iHFSpX9E^Wb"LBemYصq˞`-kMy9iwb:7>zOVԞcPM*{rY)دľ-ߤbE~kX;LȬWE]`@vqdsVus!28c_ FS/&oEhWuxGscouƱSNö_nӔAV(FZ7sSYeGq[qCOww94KHaWYyeܽ}lNkB4n.t8ulxz݀e;oil7]|`H!)�\� � kT_>ͳm&B=2`rW`a}JqҠI܈xZM.**ir#JLCʕ2t?z?�R1>4^zLtlWJS4THG56W!"2 7e%|R-[l0Eq  3)ˊ trG {J+ "-ˀ(ٺ!vpkJjaDcig Ե4=ɅyՖ4q %I};Wʎbx c/|@i 6uA  tk_59H^sȠ,QB5ږ/$nXh��6(.�i�!i��i�!unA 4P2 e; 2&i8g=HO5����i'ؑ.yFZ )z}r){KՅJ9)F#5G,!7aJ 7.s;+IxcD>jY|T> iFsFc7jiW׻0�a?~ܴ\W pF2 `)%&(K<Sq~R\}աDs.eԗ\xEav*RketeT`Q: @T;5�i`%DGHzCU=Ң`4/͍%� �P6ro$.xN!sA}G qUCACpN@Gtt;_G�@4x}C wHЫjP9s NM@Y;k|Aء4X*U}V-\)\7>Vt0j�����ڃ a CzCR4P2 e; 2&i8:ސ$Ȓ vWw.`ҕ"7cbbpc_wşcX7L}gY)eO< ".>"YÚ6K}Sa/6LY2bek_GMsMqlcms+[K)M0,#>tx@Qc4>̑Ǖ- 0uz`p|e@[VGa<+IFcX Ůq* ^+?_)r*V>p>X#;2a|wBP8נ6mC];M W} P;o{w\Y=XYw䬼1i}zhwݐn1 0ɡJưl-]'z׻tM"056< Ȫ/k%Ph4އ5+Y)ˊXZY);�A��i�+!4�>B$�[h$xC z K[%ސ%+� 4�@29OY|F 9%AW5` 4\@\zQz.FيeO% =Rs ИGkpYΣ +YQ5xE~wq +Ѕ9U%G&fY�֪O=$䊋…6|rbcch\�崴xeҫ]k;����i�85+!4�>B$�; ސ$i(xC ֿlI7F � � lasփnR| cY , eO�j JxC6|6;%ˬ"APtGF*zSo‡Ddg=v0+$H<9}X4 Iqҕlieo^aWgq&Z2ӟ=֏H,)nstavg%hG~dU]Sn+Ѕ\sRb,R^ہ.,5K&h\|e{)ރ!le*۾D{Ę!: z4 S8+= /1nWrzxCۡed 7dnXsOˆs1?mTs/9z˷b5PнG40p$s ��&"AH#D�oH K葆7. Bl˖TxCn �@�i��7j{x3z65},.7m֙Tew!OhSDzgwT:YV> ]C-0Hn-lrk]T7%ZvO?(h><zP v*1πm]J9IP2 ] l\q^P2|"xNM'5mcCtYR58NtXWax؛Y<-87dcSaf۔ؗ=,+¦ۂ/\-q( �iYCٰ:�Ұ%X "A7$�0 �b"h����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/mag.png���������������������������������������������������������������������000644 �000765 �000000 �00000005066 11332353405 016652� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������������bKGD������ pHYs�� �� ����tIME� �� IDATx흹nM{Y/F`H@2#8"!e^ !!1G##� $a_lKܮcHt܄V:VU{]f''XEMIeV˟$˲Zl6:Nǎ }zz:پh>11lS]JB^5^yԩ=zz^ӧO޽;˲g϶Ve.URߧV"AЇCzj=Ǭԋv7o$u?~xMSR.i6eKQ/,۳OOѦM\]d;vݻ>?5q<۶mK_| [ΫeT.ιWE58p`QNvVzKɽ??{'c%/^$޽{^%.:\tWB=E<lOۂM!'w by+J \OI$G M%r}Z*ߓ'ONwhp<ohǐ)߿O>{J \OI$+qڨgΜ }ٲe?|0t VXCg/b:9c߾}oٲ%W^-?}ѽ{&̫eTK(EN ?-_<'ٳ'$m)r }Jمdz׬Y7LON"p9'y,JqIxe_|婩ߎÇdʻޟ}s8BI_K}+#J \OID1QL=:?Lb786ǷoߒXOӧOo߾j*q9m\.?ͫe.QE*zC$'W\_`elv`lOպ3&ҫe񔔞K&&&T7yEU|[(bC_vm(b|~h1O[cNr=W$٫eT.QvZՊ3vλ}w^:߿z 6^Ւ|1iӐ $߫}T.W)P!*]& CߵkW茫iW#'9uU㢞+C~U>@J \OI鹤h'z$R܏9}V###tE->A//"ǩN1/K+0LSRz.;TgYbo߾ }֭΃vyXOߒ 7? wZE*URF9}ϟK!es}򥟒n[<vᰖׯ_V~-ƍCg\¸He/_UN8=#amh\S2oXlLܹso-KK*8%NGNNΔ!N:k]C,8|>sqv*(;w>vQү+W2X<%Kޛf p3Ow OI쇜Gϊ'p*߄:9\ūe񔔛KVX0iCl޼9te$=9:{=Eg{CNb{>♏ 1fI|WίUbxJ%sCu 1\;~-:Ezw"W]i(m& Ȼ3ƙrhy,rs+Q8{ƍYȽ<kMqQlCj [1ۧύ|0SRn.v)s]|jn'g{6Q_Wh{xh ςd͛})jMԝT< M@\fLXxB($ǨcuNy\.R\8H:|7ǡ3N\&zC%?egW_~="w*qW))7S$~U_Bs, em<_;Qߢg~G^'wW))7dlyu?9c.=.2yub7yEHr B.Qu*[ȋn.]J~gSR5.aMA|>%b7s`,] q_ٮW9LbwSRn.Qq-`sv!70O �֦(9`V_O;tC[^<hmSRDՙ5K9@7LQy_;w&!r$sr5%uݔ^%.\A'o?rHrrpYq,;yE?}evZ7p¢EA6?\_bxJf(#8qn+<h7:Gޱjř+5::i8frNJ$d+K \Oɒzb깒[n%mjO!0 ˜DZr=|9gJ.^}ҕ%Jqjs^K?_xFSc����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/menu.png��������������������������������������������������������������������000644 �000765 �000000 �00000001704 11332353405 017045� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��h������iu���bKGD������ pHYs�� �� ����tIME'[��QIDATx[r0Eӌ7/ށG$$眯NDpAq���@ ���,kw���`��p��P8��(���N��� '���P8��(���Xnc]mh6+kⵂ7?W.bFګ >y9L:VcMiiämapn$l u/[5&FY=y_q]ml NIvq?VM7E' 6g2 oL/>wrsyDf__ MR:A/g>YmX W/m28ll᭞*Jz'Q4U)mm3/ќzo6IK_xzM㗬Fa\H1ۤt)!\QE1d\kٻ$xX5e)4~@r[nT|oc'u!&z{67wzLFJGZBo.m-$bN7;©y/68+NU^ɣ)y";~+~=12V۰B7(;Bacq&\=xXh=&FO=kWwɏ2(VB/)xZͻAө+յ)WrBԪOؖXďu=56-z".~OSJ&UEŤ@e)U7A]C3fO0,.Ԃr mNX'n4MJceb~)4q}��W _$ MLK� :~!w�FdX\��0q��P8��(���N��� '���P8�� 88�����IENDB`������������������������������������������������������������saods9/ds9/doc/user/gui/menutear.png����������������������������������������������������������������000644 �000765 �000000 �00000567126 11332353405 017740� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��4�����aG���bKGD������ pHYs�� �� ����tIME9<�� �IDATxw@GgWr"(b]cAc/1F}F )KѨILQ,#H@cl33<m۶#-=d!ZXXxPPM&7ùtRmmk@@�ϯJrJP( $"??q?77'Or8yP7~~~ _�啖D=ztPX[ScX݃+**eJAAA ]]]���Ν;WSSM.p<??)$8&?/>,,`�˗2ե ??? Lf``JUTx=|}̬̚Gǐʊ EAX,�lFC�f{)ɴZmk&0Nb|}}x<�:%%EQFg�;ee.݂++* Ba|B())x|^HH+ ӓݻXz ,R17j(zxvD�db8 !!"ƍyyy"(((˫RRiZA#"F+WZ[[!t ܂A$��ˑ˻l^Zd<@܌㘷ASa8//h4;::ݼyR&q< 48{bBW z{{3 �N;~8bd�  9{,a~~~<ڵkBյ2''qylvJJ~~U$H.yyyA|gggHD5 3PCڶmUJn˼# A-N;nޓ`81,M*Qhhhhh.}q3utм`٨@�BYlյ\29 &�YfLdRGȩV4 �TÌ=uNP!@M<h5%\qLی-,{#ihhhe7l&"854yB : qPY_ Ȩ,\J�n`AX EU=(zJK+(˺>asMz-H3<M6qtp G* njU!(f8HɅ8AQ (A Hֱw�� G��-qcn@?O)FU aM@yf@8߅˷HCCCC `0Vֳ#mli�0; A.Ҫ"dvF�p8* %J{"7:u>'Ԫ��B[[GJZV @���NV$ u!+<yvFYJ:2hS_, a `\0 =@g" dF\�*|^V--6p%D #tзV;2uFS ? _c Vu¡f,Ⱦ& `1\W AN=|.K7]+(?߬y9Kּ6ӗA`.^ՄM(u2Ȩna )jwju$hhhA0N'`reEmfD� 2#��Ujۏ�c𞁞N86X usm#i&[T�f\s߁CP˘5MYx& g"Clv0x$#@L=!>Ew< tH& f24f/6u| @JÐcJh�$B ÐUZJcp@,&3 bHRQp\AZY5[s/a3Nb C|.!�B= 0Qo2#zCrsFG~9F<ihh e [Aܺ]nٱMFל=p.l t]|\_2��Xxb{N0-5(L[dwd |@oO13lBNȎ];=%DeU an"w%}pdpZnwUQFD�W 9ڭJ Fێd0UpR~MsP&S 2Pӗny9#w86`nW55Ս*T*�<6k gNRnĎg0ӳ#tqwsJt S5P5'21iףrY0|gyW/je/TўGu2Ru)*zA30LN*c#̀sNV=-&-@ A";i5 IUY2024ϻY]Zxc3b{:9M(7G7k]amm %2Y۬qwx9 *m�3WgqV=7K*((}~an A;G1#U^eB#IN3ƾ4yU]#[A$B tT*�@&TO\`D7756bMi"ihhh60 ֜ȩ&&e%4+ϼMS]F&0cB^N�E'M;]5٤nr0 pjҫI+i{#Yj"5T$x8*U;uuJCd|PdbJDL0YHhs3oUR$x ,l�ݬz:bp\vu&8%v<N;��@b!G*`4 �Ia3oO,!' kZDn~JAQRiK%Q&f�Xp�( ͓N�J_tצG4\my|of{�P3&fo/Eܿޒ=vlMBc'vu55-8+\g�4osC p-wss�86nh0lўSЊMjg@IY5`pRaqp̢5v"R\U403_ a A,6ߎr$@�a :iYjb&,6A��P&@պ#<H&.S/)Z�cMfKEM 7}� Y=<]ILU˦SNw1P$f@˩E*3Y.x] Fsf4j0=B9vKW EW[(z04_MR7;0PL~nR. or,�@R$SW\%7YתwuHr n(* wWh�`BbsTݮsuv"=֫[ZTZ?wDžSF|w�PӤkR9;#ڪӉ<C 0lE}`v}ݝ iԤ1`�9LŒAOgV,vq^ξYRQ˱w$ACCT5't6P^{~w'̰kj39'朦 wW,H$u t<8׳Z Pa(xМAL 2F2¤faeSA C7/GkS?&I:44z<)A7يzK>x.+:ĭg7OVo8C.`eqڙ�+ Ux8KkX0�]ș:,|@nҊ>EVo<jzcmf~FE|F j͜:$l>u- -JJ:;Gy ސ(իG@w߂YΧ]@lF:? ICCC +lOȎ׎_[CY!8# Xr#(%L6:sWws@K&mhڒW#. "*γs r_^veՖ5Y/!MeL(sY!"@JC-.e 2WF3c X(RWa`d0�Ҍ/:٠``/0\0U)yZZe^"Ќ(wtcd4 (`hTJ@$skZt&&y᳕-&Pd*M:٨0`,6R FʂcL&b6Yp Y Ucl10#0Fnf�dz0X? ɠsPGǻPLֵ?ێz_~(+*kP&Ke98Y V ajuU5uʰp%1y@ٗ #;i@*o65~ FSSmo\A\fI,U͸;Q& b-~,NVb2ؼe%�<= RAL@l{F` ,fEd8�f +uL62&+uCQm'u0b�^CP$@0# 2|G`1{ ->Rūul!L_ ߓ(s �8 .AȊ(/aA@02 3`!W<3L% 39?d4cQkZD2Yp䢌{2',:ق;8>Ds0~59.Q[lP dsoku7MFт\=o(eF<PS +y;�,6uWeREmL_&6zUFfvs67$e\!`d.}m}Jng번 &G444ϞpB,nc%h2È-Hr0@0b0 p7,0c0PfI H,@y~rVVL L6Ƿc0Eyqa0XzĖ8 MM͜laMͭl� N 7ٝ2Um`opwK<!twA2 hZ 9! Zc~B�b�X\h; <!ZA3t.�iI}gŲ�??kinW 0)s[p˹0 =z.e"(zwΩFfq p ͓R])~,�� DCCCCQ(Z;]W.Xt*pӆZ&ihhh:GYYYZZF prssID/@m)$a>|x'(1 z/�_'v3gj Fihhhh1Dihhhh=͉M44444ϜDK'gM8@44444(ڕ=bccm.X8%%eǎ4O믩$&&R?lذaΝտۍ7V^=a„Eu.׮][nݴi^{5k��裏8qŋǏRRn}رcUUUo#/_w.o޹s'M8}t󘘘7x34ԩS~0 7n/^l ??wߝ8q… c_~?v2{wsȑǻXqΜ9QQQqqq?ׯ_߳gӧs8ݻw/۷owwwnk8o:u|~go߾رcyn^HQWW7w�?<))|L6)7o|…~QSR߼y3==… :(O>n0~&NlyyyzzR5��ZޣG.ETGE+IVV^?<mFFÇɟ)g W1c�`ر#F8s7|cXD}ٵk׎5 Wpڴiiii�oذb',cᵵ'O?֯_bΝk@RGDD<WTTo۶EEEkO j ɔ.⵶�^Jϟwf͚/^_NJJ5jӎ;��_~… ZbŁFȑ#Ϝ9ӥN:s#Fxh4S)oݺw£l흛o>TUU\.mT*㩩qqqfϞ=xٳg�~]vu ںumaرcWZe26n+݋kjj\\\͛G\\\�}y 2L}˅ z!}||on6G]TT$f͚{n\啘aXss3W~daP-///))޸q_#GL4UTv鲮ޞׯ3o޼ErZmX-===pѣǵkrG}G>VMT!\]]a6 :W^ QQQl6W>>>r#77b5L[lއ7ov Æ Ͽv횷ܹs Ld|}}j5X/\<VO>`͚5...W^jkXf~KU633|wwe˖m۶ѣ˖-jׯ_m۶ &N2EuǁvUBիWg͚5qĸ8oo+Wx<R`0D"L&srr2L]b+++겲2FsYO?t͚58߼yݝ|.[lFWzŅ4'...jϏ|/^l0nRSK.cgZ/|}} p9???ԣ[ncߒ>}*555111 ۿ?% ޽{�s!%G?aXѐh$bzɴ-[) __>} TWWgXz=㥥:̘F`CCl&L��˗O<YP,Ydڵϟ7 NS(Ǐ3gBӧX,V(_~Ν;G(O}}=Y8d>?$&"%%eٯe˖CڵKP C/[СC'MT^^^WWtRB~ "(((**XGÆ 3f˗/^rk׮�}+AQ]ѣG7nܸfB!ˣIK�fIK5/߿cBaؠA7n<|={ V6l8cǎyzz>*SYYI~M ̙3d k  0a7|1 3Lz^<G b~'F^7ϯ^dǎSuuuR/^dBQdr8.{ҥVr8y䜜ȮϟgXndk׮wԨQ5jBXfƍ=JNgg溺:Hfl0N:o߾~" ��8u?ysZ&; jڧOLP(6mܹzdPTTaÆm۶u)G('|h+o�� �IDATnzNKIIQ(\GRd۶mLvee2_)Z(h��v:t-[D{:zw* {=��5~FRZZɫ 7n<rk$&&S---m͛zn4'MԷo 6<>}zTTرc8�ryIIIJJ ie(%%zxxxǏ;ٳ'111--qΝ'N��ܾ};%%:СC/_N%<Ǐw-!55kX/wwwOOOx+~wygҥ]oVV͍-Z4nܸ�hrr˗SRRÇGDDEDD;vӧOyy]vr�۷jĉ[nݽ{wPPЋ$ȚZwzAm(S)˦{ّRYJu�o9s(;?ѲC ={vff&ojjJLLN833w]uwwk֬�lڴh4~wv4hP煍NѤ)?~qرc|>ذaO:}Z:u;~'NիmO>400t!;;[ф0+2qGL�u֍1w=|sð &$" PTT5}֘X,vtt2dȦM֭[_ 2_~7 s/Uᇭ[6F8�|СC!ѣ'�T4,X0q>}l޼J}vFhѢ'O?޽ #g�ŋT(((L<22,!!?O@@# mDNNΕ+Wtŋ],((XdI>}NϜ93!!a~999Xڵkױ|!!! sWg>+W?U}wyi!>>~ٲeջ":tգGN4)!!߿uN0hР={l?W_}FO?>#$$$ >< nݺp?]//7x#55EфM6�\\\ƌ �8rW_}V,YBZM cSN]xqɒ% 6m*++KHHIaغu뼽Njsaʕ,l޽It'MA :�vڻwW_}5qĴ4kGGDŽ˗Pj1ISSӑ#Gt5.66>[fMQQAÇ9r`}뭷N<yɶqf͚ۿ+]K{3|PH###~QBq%K��\]]N:{#G]vuuu+W|/_~ȑ5kֈD}㏕7x\\ܚ5kJKKG3I@B!�@"eiժUӧOpš5krrr,YxW\I/Rݳ _1cƜ<y|ȑ/""bԨQǎ+))9v옍]gx7X,V\\ܭ[wyi }]*1c۷?~BuuuN2e \f TFbXV_4nܸwswwO>uօ<yr,k{%czz̙3 ׮]{5k <*̙3Wkp\\\YY`=zoFJKK C^FbKXrvb،!`LII<xp'U^H1FkZE j4回0zhRNTUUeee+ʡCX,j _WLeee999ƍrEҗ4ܸqCՎ3�P]]٭[7???1L.AT򼼼D"x''>}iFINA^r%((( Fjk9sLMM̙3d*9y$˥uHhJJ � d2QƏښս{ׯKy{{v+++mTcj4.[PP)Ν;GD>4ݺuSTEQ_)Cbɓ'y<K/TQQ}ŖquUq)+M&C �CׯkZrUTTDч~yL��Aƌt%__k׮M`0Fؘ_�|DA$ 04//L3x`@Ο?zʕwuumll| CRR%|||.]4vXVޥu5ݾ};??|VP{%_$҇|�ٳ) uuuF0|R=zС 6RjmM>qGWW< i!'_!Cp8'Oi79++jСǏOOO'=Q^ҥKz2&/* *hh5L&رcCBB˄R8M2nٹs5):<xzzRGV8+8vn>- ?8qjʕ+I5'OXjO�tkqg_ A}%͌��AG3[~~> 64x��ʀ膦ሆnǥ?DA>ƌF NI OEB,BBfyAE&]-�5!v$_I`ċqi~1K/AVм on/pm͜ E`XfKnh46LtĞ=t3м<g:dr\Ba?JN6s&J45ap7Vŭ^II˗ SN匌&aUU.�$''kLѣ #uA\x TP_Wy,44/ mBַ?%Y7n$ ڪDC*x<G?皴|2B [�LFehh^d))==C=qwȕql|/@ybddd\zt�q�� Y =d}�wn_J˔Cpqxl6_~]"::>45a7L6n" 6K7N/0:z;yg˗/755u�z^'nnn&͋ ŀ9@T/T�0LG ' S&((\hl MQTT鷂N7n*//7ЛhNNN6b$iii?jڷ$<<zz0 "f3Lj<�;h4feeY֭0�[nY'ӧudҚgW ZlHRQ{ǵDUUUeee4dij4�pox/!// ͋-t:݋]CTj`lkcپ]?c2.k#*b1 ä=Ab&dkBQgggaC|LuWfY,A" vCQB)T*q܂AGGG |>*�pssf]m"A0,HD\.צ菓_-JupƍoA{3g2?|k(bNw~d2 B,֮FQ*$ }Riq&b<1 CQ&u,KX;Frwkel>ATpal6p &b0bʔ)#�mٲz?<11qǎ>s޾}[&Ž[֧~%KD_~<7<xp۶m7oRΚ5kѢEqqqtrr*..?1cves7?yA$kZhѬYއ#n/@rss_}ո8+ <~fqݕT At%|h~ &"0eʔ I!QYYimr0VTTTTTt9s[( DBo u:]AAASSSff&=�sss CnnnXXҥK$J~~>i>e2bcc;xg.\pٲero�>4qĉéSw  d%%%t<vV\8Bj|w>|�0cƌk׮}jDBMF$??dڔcǎ(��ATJk`R? co;;;A0d2ۻ2 Vi_sMT__ON]?ٳgǎ'Oիא!CgZ[[i p[n]`Afffrr20<dɒ[nٳb?00_~qƶmRSSGesͺ:y$88cmJ)\]]ɿϞ=;|Cu\St{~}W_}ճgOtA8u&׷n �XfM lV}6+Y[[L?Ǝo,_<!!@'ԛ �ؼyD"<x0e֭ hR7nԩE"믿zjV{COq #Fl޼ d2;f^YbTWW;::Z{</455544tF8Ϋ:jԨ?ȑ#?S#[l6mΝ;322fΜٷo_8۽W||CC|)K. 0`ժU|g+Vͥ( Ne̙'OoAl6y$773i֭eƍ(>}zرrF,o}$Sx ر4/_^zmWXҏ C&''ٳ'99911qƍt<1f̘y#F0̍7fee5667]IL9d2H4mڴW^BzJ9bĈÙ3gN©G_:? cNGuV^/Ɏ9iӦr�I D)?~R`d � 22oill߿?AAAAdb///AAAG>"?9AogȈ Vz��^^^G&��7oVO 6PA&O<xq #ݝzҞ D5dgg7d#}! ŋ{;e!Ywg0��8�$Rý{Tbw7MnChh(7ϷһwoOҘT*hޞ�#GZybՔ "� F2٬Vk`X0 c2L& O4Y APdǂlql'T8JPwg2`@4|s=7+WdX(;@0cƌ'Џ<t7zӧOw={p8]cUUU겻͛ d=bEKN}} &LV7}qiش~rzS|qg"8kbՊ{III 3f޽{[[[78WUUq\6MRBH$jll$[awwwPWWgggZd,߿={$Iss3e)2dܹsKkػwgRx(jFHD�q*Rz}}}=Y $''9s&!77ڵkQQQJX{5O~,O4T*ucxyy544tlڻw/0LEb2Tvp̙r[ZCCtv͡y8mtIȂ o5Vk|E=!Lॺ?8##!// ѣǀ;2YFF{ァjj͛7.]`~A ('N6i޽qqq3f SLYfMQQH$>}t' bb:TPP0/]�PPPO?}羾eee7^~eFSRR6yUVّڵk㏧]aa᳹byhL) 6mXlv$JS*,,ɉ4i'\YYك|P O2Bq2(j;D4Ϩ-LQY[[{‚ ę��~I C=diiiA͕RZZB<qľ}o֬Y5kŋ'LUQQ�8rFoT*UHHȎ;.\p~j;wXbС򋿿޽/_~qw߅Yf믝irrg||H$rqqYz|_YYyF3rȊkN6{܋`ҥK/_|ɽ{>ŭWe2TWWKN>;;;Fc#x< Ô_XX0W:888Xjk'c=H:S[Mv,|>Ν;pz{+`0ZmPPН_gV5� 2 {@P>t7nԬ~)..nڴi6>Q3fذa.?~}FFFFFNQc,X Ɏ?N6ӧ׭[7lذ={}WQ}ƚa;Plmm90m+|||juCCP(dXԚ;wNL&31)޺x<ORYl& 0 Fd]ё '_1 aJqnAd;طyoٲeӃ7d믽OhpB\\\HHH```&}Gƍޢ_~;rHYYٲe˘ɝpi ^:-;iX ځ �ЮC9^(KP:BQAilJe#:yPIr>B_ፋ ):?!V\y9j\tiݺuѣtgϖϞ=4Q9""��ZǮ}UUU۶mk{|͚5GG}@/7o|NHHT@2ɩZir zWWWhd2=ZquD"Ų8wiWˤyZzZ,V 3Pú=�6IiSNݶm[LL̝;wvjz֭111w7oހ_n֭YYYO5jT|||LL_|ܼjժF1޽{XXزe^}ƍdls8~w}W.رC+F{=yM0`|߿N"bJe6ÛIjZ[[Nkk$U f639<x/ ޿weeIa*ɓ:yw}… O&$bQgP٠p=%vGjk׮]d 1##绸S/T>hʕ^^^5G"oNN#222b1�O?d cQQQvvvd sEj:Ȱ>"ƍ` '蘐�rYR�� �IDAT1bY DFF^pdJҗ_~,^ppÇ CgB<#BggGhnnDVX{:t]z6 <D"áiw|i2ܹ g֊ 'Ǐ?;,_|…4hЕ+Wf[BBBfd"&$$=2aMZrȡ,d2ߺuKV?xj>/v�t3999999QꗥR\4 ]L&#چpvvq\*uE �APS;ڑgfs||>o<jɺ mǶ֧C<HF].i:4RyxxP9"##kkk}mom$ A6.NNN*�gϞg%J FMMoMMN m? ra //&k)hʰ38] χY/++kܹ3g|wBC\]] H&!!!$$G4L  CYYAzhѢ/?�L4I0\癞e<xĉ;wG?u/68-V^^ʕ+,m%WWWI:t:멚,fx "RRRBM UpZE+**l3 䴉 Ͷ^p��O& SNs5.;{k׮ܹdɒ_~933sƌk׮?~<ܻw/vڵ/�ԩSOIbTh֬Y#G|NDNik"͍{(:�jӝmDsQٵH";I7@ 񱳳~gJd^玿7p ŵ=UVVvᢢ"'N۝KM* *F㵱 vJֹd2YCCCۑbWZ[[moeggs QѼSK>!3O|ebX$⥥(^3F0 =FZ2}ƌ/_NMM�޽ �{P=z_o߾6IEEE֭;zya߾}6^4m0ǸW,w> j(""=HC vd!!! ,شiӊ+|MH$qƙ3g-ZD9w9;;Z*==}}<oa+V!uz{!!!'pttl;%LĆbVVtrvf=dzo߾S_n:+lVSм<|uݺu+ѣpvv>yT* ҥKUdԨQ&(GGG:**jϞ=_~v#<Jե>J 2D"ZXXpm6I}N[,�uuGZ>/ iދ)@5:؇(tHʛv1yޣ w8.6.7n vrr.++\|W~~8N?><<!Il[]t:n99DkMMMC3 A{zК ѨT*&Jry�^T*q'BTv~j.F!ϭX,Jyj3 ?rLӄ;PEEEի{ljZ[z>)) 0�X mm)bZfl6m([Os ?_[ *++�@^^M]uM6۷oԨQ�Zj'܎bŊddd92""oL&Nxz޽;))oGtSKF뛕Em%ݨC-vOQ!ݞk4 `o'Q�T 0 �୿A_qq1h;`I/H$b2dLؚ l`B4/pz.HJJbXbX@l#/_,[zp8/^ nnnWJ;_zkmEE۷\GQD??;)555QHhhX,NKKao߾�⠠ ''W]=*++KJJr+WL&SDDDNNYgQxFQm7 dQQ#HW޽EKSSݺu+..V*Raq\ш� @%7Btuucl fs"˥KXǮ%_//"JihR^^d2CCCCBB***233=CBBӦM|r||CCCϟ1gΜ 6w-55u .0a!CvFN:5jԨ &DGG7ׯ/)) LJJZlwQwvg{v%ACEB[ EEHQ@^DH{q[@I`>f̜;wݻw=`5kִlrܹ7oKK,IMMe0�={vv ,HJJ2 |IVV֚5k;~ 444\~�tpԣG'b<TTT'r+ 1e^|'ǃ ƍq+//g2Z677[X@��0 'a:;Rfz__ߚG#pr9}R�qzj^~D"um6O{G^zҥǏN ,^-//OOO7o<q|pTTT@իWϘ1c۶mׯ饗z=F{wGhѢ;vL4iܹv~޽{GFF[nmnn޽LC,/^Æ 4hP tu:ݥKZM8~yMt:DqARӟViK@:hϼR(%�C8h4cG&=== KRP(\.fl6{sOOO^O̰ƩcARY,VRRhFh4"`0nJJ ֊?؈O= �p0w֬Ym۶bŊ;w[L0СC.]¢iii7nܷo֭[lO|ޱO!l6GoJJ$}MMS|QTTd4<<<x<j90fL&c ] Jc }& Ӕ'>a:%$$L&F;T fvu LOOr,+%%ٳО%%%xX.ej#Zv2lٲe7nheeeiiiL&355�d-[222v1dȐmog`mMjWUoCCfo! iK?,ˀ`( ߿G3#Cp?!?fYӅ444H$\ B8NsI /V+J+h429${gΜ'EDD;ƍ;wt3z6m¥K>\V^^^cǎlׯ_ ;v, СCo޼٥KW-e˖9oڵ kfHyijjrSxh4BcFRrJ2Jp|,HİmR _T7It\n4kkkiiiqtu:v؏)J) y ݻ7n|02�X,D܃ Zjէ~矿;/¸q֭[92--m˖-_~uɓ']VLdSgdd|'ǎӧĉ[ZZ$ɡC޽[*'999!!aӦM3gΜ9sʕ+ 5QٳgFF-KBBq3@̙=Μ9 [mz뭧rX?Ol6\L L&1 3!!!UUUxcUMfussk֫���&^}IlVV7448U*szUVVZ,L$wW T*jh�EfA<== Fa2Xj@G) CRTfse Νvd칃(Dd:>@wYVE* j*L*5`�smfpZx�� 2k, ZV z*<rx �[~(btΝK&GaӦMhnn6L&LАaEN:uȑKX-[<̺c]h3>޽ J{^έV+Lo Cyy9˅I-))*,,d2CLLL.L@.u_}j7 Hdd{%H$ٝB wu̘1={v]]݆ R);N>-J8СfSTҷl:(�,*>*jWNPZlL R*`k>J(�49T*foxxH$oHX& z-rʲeƏ߳gϢ"L"rrrΞ=k4e2rRݽ{wG:XZǸm ,v)^t a{Ab1Fojj2<nEREH"V0b'Cp+kZ2�jkk[&992c t}ԨQ;v DoƄ :< h4>_VuΝIOOYxٳtZ:~q/_yGCP(\0b$21Ɵ<ooT'�|t_^��r��x,|xj��v Q4zl#0l6rUPZ?+6D X.Ku5hZГB*SKi#3gμtRzzQ۷[m柞dljo"..;VJNNO:zje̛7udGٳ37��f�`XtYo0�p~u:0q"| ;<=)(А � �`չ�ѯOYXnsр@)i2H$>EQw d2ڮs@RۢNԌv SQQqر^xo߾>Lx8ydf�<OO\(C򺺺 d2l6[$2HDRGE� 950�d¯Gh4ͶNј�W_uuu`0c*ABa}}hۀA'00m4TiӦ>,!!s:)eeeP c"2}'JCQ ŮX,vqn4-^!8*mXrrr<x��dj> F �6RӃqu%&_;巺?Ǽ+V>}zss/S  ;m۶իWO4 3o.lӧmfϞ=xZvʔ)XVF%(Je`T׵�466bJzQyKa+H�jRiL&Sr8W ]NXAG1NWGEE/%0ck[nUT # _~M3 :۶mST4 �  "\`0~G|9ٹsgǏYV;̮X,hrj7Ru,UUUI$V #r<+"�Z�N!L^[[k4LO.2P D'3N,˱<өzrJӉN΋@ i9Bԏ<%%%//H.r4[TjLL\./-,,,P(&asz>**A$u-//ϱ1MMML&S"`^T*el)/^�E�l񹹹mx, k]oS[v!$3©S4  QMh4feea jχ?77xcȑ(r1e2zs~:~RwS�W^{----Pl6Cnu*bbb©zN%.gs" v woUU>7H.]�p8t: q\8K{c~Ç&6E ' Ɗ]�`[n9J."q-"\Du�ШTo=sYE@ \>:uIiYR\恂O~f-�@*VVV�j 7ol6:p0)zh`5!KPjZ1� /fI$`2�x<S"s r qgƩRZ %h0LG� F<'>/۞dbP(fJbסah4,jtBѨT\.A6DBǍkhT�wnNv[bXʀTZ'ז ;<"SK.PEU>IQuSC H%4|qD"ꮎ{AHbt:s�0 >O"|>d2رV3|Cd2d"[:6fs \.(`i';�@oh2t!N2 |o )(* kkk\.�F)JŇ`n^A544X֒Nb2�^tNaX& KflаIxfٕGA<<Y xf*dcX,/++;???NÆMMM6 k0zF1]t!FfK5kJh4^^^0 Wi<! FPPhhhP*HR*?j5w uuN$I*PG1N''AʭS/1z=f6kkk)SPTx%___oooe6BA`bLPU"0qCc4KJJzNe6񶰩i8'66֍ ^}Y1N\1jjj-Z-={vxxdɒpi ;! .]`pa 8Sbtt4~F$y{{cݻWUUA9h`߿_WWTWWW^^T^0=)ɓ/|}bh4WMMMssjK3 I&ݿ? UmyylvsdܯZuuu l6[͟UJNVۍpc7 O{["dlzO^^d2[˳zի&Lor,˅3O}kL&Ba);$fIV[iА+aX`lF W\ȑ#ΝWZu޽̙3.]G �8sLtt_|QZZ:nܸI&M:uȑI' 8@LA&뺺:Rp؈L&C‡찰02l2`Ml///STT=z@MG&00:}M6_~Yf%( �� �IDATǏ;f>|ɓ+V N:AD"X,EEE5ŒH$Z6??6怹b첲2oooA<<8ОUWWX,iPXύ&^pp0~\.rV7I(5n'�9rHs΃۷/;;_1χ-Bc0`�Lr Bq>`(JGpL&CQb΄& J?�vZNljat&?�qugΜgdd|"hƍ{Y`A{(J.zjS!;;MRSA0 T6\.b[kTQlhhdreeeyy9d2L&v&]Y,X\__ x544qt$I]]jAg2N/۫vG͘1>?3>tғ'O:uq:td޼y`~jIR W_]|yN߰aCuu@ xAܹsȑFڽ{wNNNFFl>(%%?71Ghhh_*,��jkkfn<dȐ/b{q\Ԗ6}xG,X,:Ex<^HHHdddNNnݪjb4MVFf\(W=!p/Wndİѣ�W^Ps޽uuuǏqFjjC.]7޳gOuuΝ;.,_}ԩ/_իSjRG%_~aWғ|Ν; 2|'~Շ{.�_LIIi5a)|P(+W^|<|01\z,[PHRՊbh4sL`s� $$755͘JތZ  jސ΃ŹN\466FOOOdXֶL&;@kMC{Nmh{<ܹsp`00}~byzzN8Q, G!<N؈ʨv"UgNcƌ!əKIIYdɆ vޭVlrҥ_nvÇO6M&߿6<yf믡Cj0z�mv oV^^tR�]vӧOTqΝ;k֬K^vƍ޽{3 -ݿuuuo) <|O?[;c`TllB' >-˵k1%*___XFET`p֬Y4*22?rWSSh" +j|>XRLE7/  xLIaaacc5k|ŋE]vŋJNNݻ;6o<wܯjfddZo<yr߾}\RYY9zhE>M6 6_~III׮]KOO׿5iҤ#F|7yyyfW^~~~O>rȪULÇW_ 4B|駮PL&/_\ן9sF $$$̘1#999//oҥ[nzj^_>xo2mN"{Ů( ŢRL&`7c0B"<xPPP`Z>}*[naM&@YYaA"X,LnhhPծ}J9}CXVBrS*"ĉl6F<WgZJ%Jt:]VcИLk.^sQ<L&Z=o޼^z\.sӃ浴P(>bj`.\ }0*++۷u֒,Ph, TZr+BP|B5FQRVj,Qj"BΝC�qQ(??Pwp6K.bteh( R)6ś*Lzxx[Vc)e2Y �p9077VZkww!gs"h/L&omuUVxfh YYY؟%%%s5Py��={xYk37UAhhg9T`o>z=oWR Y,KݿݻZb91N/E[|| ��( _.��<ܭ&qz<xp̘1qqqvzew7nwޭ[l٣GǏt2h4AJ$D"&FN[V͆ H.Et: -UTǃ5k:|Q9oLF q>>>MMM,~ xdLߑ�>3#�D`�q�ܴm2�[�{P( Dg cǖ޽;;;{РA6t-&&ܹscƌ9tccceٰݻw_~GgΜi<ꫯ|In߾}ygӄ ޽{_UՆvn6LDDDiT*L&cƩBOO{yzz66*z�'mQqAP>>�ӳ&1�PֽZ? Z,.H2@Ϟ/:T7NvXΟ��h�>�?| 8Q&8.'!$`dorrr``D"Yd | DDDTӧӇ`0oF 0`!!! .$�YWzzzTTԀlN;x{{ s 4(66cƍ{tqqqZbbԩS{bTjzz Y|9Prd RUU�̄h/"�`Μ9#F/u:]RRҠA͛WWWL&Snnnn݈[U\)J$LM&)Jl"*#_x�v%�� ]�c>0 B"sE `0(O HDFLL&pT*mhh`X)�`�� 3p/۰J�� Sc}mQ8lX.]d$l8oŋXV7�[9s&:<<<<<0(] 0`�N ⰷ *gpĉXnɓ;Ώd2uܦZݽ{k׮֟z\m@`4P�0Bj̀M��yt:`a8<88X&X,(|�vva0°<u@ l`p8?LW�^K��px�^zd2[AAADߟd&4hHQdYZmaYY]8-*Ex`2'�`~Z VYWR7n&TcNXqq^OHHhjj2͡J[FT*M&rb2 ^j÷M5��� �tubFCD\8(r:c)<hlii�I1wl6CAldXP o&2d/xʕvݼQ A>���Yvc^?RXRX:((h�M6A<..��Ųk׮.]l.]DFFFFF:uʍ*?D=lM,UT?UTFЯe0ݻwg~u]I$L&H:. {vʖeeenr 3EBH$BFr<Q(0`0( 8rQ**JٳgӦM֭+((2dPPPP0a„9sܼy8O7Zy��.*JZ֬,<Vbb"V<.Hw.|>,�T,r̕ig"vxC(l��T*bFBE]h4}IHHZj… g̘�سg�@vMPᄒzp8ĉ& x*t Fr%/L��PSS%8<b'{T>t:;+hW/H"<<<$ס$s\ܼlR]] !ΝCd޽Nwa2 ywW\)Ihy>(J$2햣('Gެ*SxxxJ+d2Y$)|h�ݾ}ȑ#؟֭w rD"?ټy\.;w|P.G}}jNwڨJ:sGnfqdr.]Z4~.nV8NssҊ#tɝq2eʵkh4ҥwyz~ڵڵ|W_]v}o߿f|>3BIl ER��y $YuuuƉS@qob#=:nܸ7x#%%y�W_}ׯ߰a>;voݻwzj/_v:bkSX36z88CFcMMMqqq/_x C&rhtzss]jLqTRj5+Ə JA^D|><HX> DጓKdٲeVu۷oݼy3ݵk׊+�eee+V8sNeeeڴ1c`ر ۺu+qt|rohh0 Vj4 RQQ,r%~~~EII lخS]\__%z=NVya5X��RIdCtDZ3NuOu:6( W^ ��(ˉ"CuC9.rz\r/OIIA䣏>"NG}ͯ=jNlLݲr|UV@_\\ �illljL&L}Ç- 4UUU#X[3N, k#Ju|?&T*UQ%Ymq2E'J Cee={Riddd``[ ѣO>-Jmf2&MkSRRt:h\z5,Uhhh(,,[p-[{B$g`XN%i4ׅ/uDc �@vb)6-<___vll`(-C.Ν;NB!%<<fjR)>5CT�H$RLL qtd"N۷o͚5Cmiih4o߾~e֯_I^hfϞo-ڳgΝ;7mTPP   |ȑ;wi}h4 Gq<YL]TZbhm<!H1j[WWU\<x`4 -WRR9(j]A" P&8O>ߴi>裚/E6lgwy\x@DW%`0< x @%Ե!fj딠jYh4nq(bDŽ?sr6tf :t %nlݺ57P~ʕ , 8LN{n$ ̠RG'xUUU: :`1e6?dl6RfZgiAIvZD"|Se4]'^OXo9Ķ}իW/]tm>wܗ_~Dcj+**Z x˓JL\nPP/Zm.]tz~~>l5h4:thmmVe2--- P(6N,;=0*FGKZ>aaBŕzA1Nm#::zرΝkjjݻw^^^fff[v۷o>}=zͣGZ8Ժ&C[L86%&&eQw3,WcS(lL&˛B^/\ ~P(ta/13b7lj!'n^6 JOO2zڵB4h:T,'$$͞=`Doذf Gj G6Ν;ݻwouI9HD"nܸ(O?V?s.*ooor5=_׷>&�111MMM|>b%)EQ.J&SӵkWG`N7�lEN111U|wG洱ݳÇ\֭۝;wK`$bP\_d2ԳfN-jՎp*ZPP`6 6k(ɜ6L^ƣ gee%cաz{{L&lRbp;s9%''h4 GΎcr^7͕n f�VVVxx;L{xxx]eMMvokg9]8jp4fXT/K\H8nݺ%aٳg\z mǏ9R,c1beu qAt^dh'q@= �`0h�\.[x0 [>66b0]fk& Jmmt:v XHFd;mBhK>Q)'wm6`<yrAAkOh4 +**jNI2 �D, v^T(6@ST0H7;y#88رFI-8Ғ%t:Z,<("CBB`u'''ےB`$t^h4ctmDcǠR0'h4H 1F{Nx֬Y8m4BqQF]v֬YL&۷oT>޾}{KK֭[Nvڔg>|ڵs]zuuu#G|͛U*ծ]&Nv &ڵKR%''Kݻ-[_ ŏ<gנ}%f{Aiڶ+ic x ?YpaTTԉ'RSS<xҥK$&'l߾}ܸq'NHJJZzu}}yO8e*ZRR|�޽{KKK7l0t'N 2$33jv566nٲeԩx1YÃJ�H$]RLs5X,�xyyUF�X,8fVLty:-[\~7oܲe%)))))ϪU`)GۻnVEQilV73ZTy& ,# CP DxO (6GܓBrÆ 6lXn7h\.wΜ9��!,A[H$ ũD .k6X1)!555l6Sx<ߵk!6bh4nbiYV&HO;Ul㦻wݸq# Fs^pWWSSa�@\\ܹsu:݅ 7ŋg̘/`K ڵkqP 򚚚&P^A�� �IDAThXXD"xX^+18fX-kQ^L&S{Y,L>tH$2f/L=Mnuӧo߾]^^;̘1F<xp…C 饗`Ft>ܹs|riipiӦ 2@A;v3fΜ9W^ݾ}{NNNEEEFFzn9N߾}k/AmjjjoCBB`'@lRT(kVX,555fb}d2UVV:Edh|L]!6XE<Tf2Qщ78 pV^y. JܸqL&DHLrˋJ͛p�DFF^tfI$蔔@ .\ =QFW c̘1{رc|MTT\믿.Z7|SSSo߾}-:~ya>ɟ<J?;vW>|ʗժVy<j8ju*dP( >|"1bbbl6bq_$HF#  kC'To�P(Nc5L&.AbNm H: +Fؼ\.@l6djB6 P[Oөj^o2ASS CTX,&m6HR^<z۷l6NkE=<<T*^x0;y&xL\M9"---C[!!!J dz, 666''qȢ"d2Ar7verZ;!>FEtKlh)))`ܻwo?b&N/۷DPlܸ_~~WRRR9ҿL\>cƌȦŋ[֋/~Wߏ?~_uLvԩ_|O>JƤX0 'p՞tWp �PPP@RaKh???%P(={Ėx{{ø#EEEuoܗptω… cƌgw{"h…}]ʾ J`kv.dLJJ>||r|ĉ.\8wĉp⫯ڿ̿$1. ``M郾U)** 3Z֒fFaXR,WVVoSW[h:Ne\$999--O>[n8p� oƹs.^Zhю;=t]ߝQF}D Y{\T*bɍ@%A#qL8yrҥKoݺs΀_8k֬߿Z555˗/ݻS��K,!,V[\\ spO޽NznBBBJJJ&fG; IYX,dv  Fmm-鍓+Vཟgϖ:t(44>o|aG̶d2WXQPPgCQ r\[WWyMPkjjǏ/p`6M&]SPtuS኉'gϞKϟ|r.}u]z555ȑ#bL2eʔr9;BӣNnJLLl̓J0Bd|ZǧL&c*J.�R)NrQ}<rtPP( .k}Z-ɌsY~Lv\NB`߸2---555,, Acǎ�syD">sR HDDDll'Ū 駟04q>}ũjtyXhѢ)SX~Q?--m̙aaaej کZ{J%t͇]QQaWeZ( [VLЀyfLBYf;w:"""'u +))iWN*:Jb>v�8%%%{/q .yw}r F8m Xu?&q\,_C޵kן~iiiiD"!m a�:Ūpk*$B\Rr\,/Y,wqX =*�@KK vk(++se  fTN)))bfs͛|>?:::::Z"\t)(((!!>0::2zᱱON8`0]Ъ+jժm۶EGGݺuUߊ�0 w܁6GV+J|SmmeBQE&�SաZZhT)..Zn\似<yyyqqqǏ[h"RzoiӦmڴ �2f蒫BH[^^Mz}~~> nݺ0ɭ˽5@ UIΕ6c L�kfd2EQ^-NRB@ <$l"(H$8CL F%00 `ouqGބttr#j?~A> 33n݂O4wYzL&H$ϟ<mڴŋ\E$_|Ebb;+<yoA<mG*^z}|>>(FbCwVdR(|U(((MYG 孧yMM/LRu:Fy7gB Ǐk'N̙3?cll֭[.\cox_~>|믿~JܼvÇ8?$(f7u/Qʒx}VQ(v9u0 e'qh^ojjjjj?~͛ @ Xp!ӥRƍJ͛CBBNjժ7o_D";}u֥͟?0333;;a y|>À<؟bHH$WWW%P<P[:Mo%?Pf7޽eo[oYF$�={^xKKKryjjKvFqs??dt:7 jNaSx<byLa6Ds'FCp8'NrC �>}z„ (޽ĉNw?y󚛛ϟ?:} sDJ%*ł`}1/<,"$$PT)��HA ѣˢO><^{rӧU)))V۷ɓ'6m7222))iΜ9Ddv>ˀX,2^L`uu5 nB#L&300VtÇYZD"EDDWQnݺ`ܨQ(J$��Bm۰A@ X,4fƯ�̚5W^S7tcܔaÆaw>_X ;8mC@w&-&&޽{m?mUM<,,",,,''x © sa!/,t l6s\TYYiۃD{0N Q{��h4q~ذavӕ, I&w[�RZ;sVuR+`uK.=pH$R:uJ(:xƍ#F̟?Æ �W^yŋD.?OBBµknajZsrrTT*Z1aޤՔBgRt:sYЪa�; It-؂CzFSWPP@\?8?o_U|Oژ[K~_DGG/^x֭B077WkV,;;_~* $JR>=+ Rqq1 `R(GM# L��oooKdrHP(\߳lV۪rFDxdt:P(2ܮxUS[ag8='̙3K.ݱcǴiϟ_TT =ݻUUUo'$$ڵСC yyyÇOKK5kL&۴iӑ#Gd͛fsZZN.\8x`=:.p3'&2, 1QT(rJc( 5�A;VOOOR{ RFBKvlii1xHPtS{hrՋ HCC?5N$'O~B6lck͚5#F6lبQ��ŋ?䓺 6?~޽k֬OfwIII9vFuւ V\y8dzneT x<^SSD>xn.`0h4cC  \.B`SղlJf]'Gm0mxS`0bqQ(gb0,w& Sk4NG&i4i`0~7#bn0bŋFs9QQQj"H&4"mO,b0t:_~t:~pZ%'@jL&*jy<^6.r!#zƩ3m48m۶3g 83|Fc0V^My7d,%^oX2>VTT`ݰ`A3(c7T* A >c 1yV&ˍ l~z{СCX`;?ٳg7nx0Naaa,XٹqƋ/j}t 5 KbMlۅbillt<H=3鉢(0Nf͢f9**jӦM,+777##c222>7xcܸq;v3f+gϞ;wX")) =z?i$p ⴷ ?߽w߷o;GP n3IPH$RcjqJf=r78YVQ Ni:&Ju6kX V aTK#++R(X־aÆt6=|p(`0͛:u*[p8/^Z\.7$$dȑX,.\{ӧN/=!:Įkb`NFC_|(,6 Xc=.ծmyz8G%N߁^+Æ p8XyMʟ ZV&}g{1GÇ)))cǎݶm~P(4i>*`0*tAs�w@Q_zP(v NW1LG#J1L'NXlWSSڵkg̘YNgm߾d={1cƌQT&LXrF;v^l<رcOPt:L@ X%"s%N81Nm N<v�dgg_~=>>Ν;fc ݺuCQ4'''886{ RT0�/H$\Ubgsss}]|#xfȑOJ_<y]/_lٲDׯ_l٪UN:}􂂂Çw_ݿZZZdd3g t:]\\ܲe<FkobСzi>e߾}_/--}V\ٳgOhBCC/^6yS׮]+,,?Ν; }'O&$$dggKiii<sϞ=7brrܹsΝh4nܸq=z _j`7~G&&&۷O(UUUm۶O>8p;ڥ5B@@@@xN Al1b%ׯ9s&�wUsκunܸA}Ɖ︸gE a$VT@p HVjZkkZZ\QZYGqn"AV�I}{OBm>%ϼϽsϹgH޽{K. <x0&BP(DEʎYFAAAffyclvb1;|sEEţGu떔b]IIIbxbe|UUUG}dWx;v}c/]sz~o۶_]bEEE 1˗gffצBnݺ؎K,M@aÆ˗رĉ555rcǎJѣǎoFPhw+է/ӷgQ&0.1*((JCo4a@V i4 6$4 RD"0 h4FH`P(t:YT8JQ�j$$$PJ?~|VOh fɵtHF6L&`X ̋lRFFȑ#x@R]zxiq&`TҘ@ pQ4Zs)"9t萅:ϟ?܇Jzyyan14ͺby] Wfh vJ%_* <z > >+77wԩ4{cc}зh^z;wK۷_}ӜvaGiȐ!*E Ir |.Ei_|{nx+WP(,poV>|~2N8q?33࿅3224͘1c)++w8>h sQ% oܸa'PP(o)"/^<鳕999W\a~7 111'O|ŋ|L&>qǏϟ?k,__ߞ={=z\v16{n\zꊊ}fddܽ{wŊsp8oց.\hNAw͞ "((JvF '{X3g,[l;v쀱_gϞ]r~aΜ9@7b֭ȸqHwڵ}?W^eee{"ݻ֭ٳ($RXXF7iIu; ';@iӦ={VUUݸqc@Cӳ[n?O?t}x֭[[S+׹Î@8Q(txm�mm'***99gvd Ɛva ۷o?xԀv˗N4 2dBx̘1… T*-..~wz ke\rM{?aǛF<0 =zpYvKxajrCرc `4qZիNNNL&sȑ)))7nܵkVy&i3fpqqz*Hܵk<i&L6x`{%\mo2Υ%ۧB4H$<o˽gڙ6Z$?2|⼚:qV3Dу@ t^x<JNy; ywZk:[�1|�RTá  Npl66=rѨj:dk݈plt---x<FH$[gñX,[@Et:d0{iKKKk^>|9KaLpa̖. lJ]놬,& l�]~= F\;wO>t:u�� �IDATDtFt6{hTUUP$j]+>>`0BVVVAvx]0p@\nva6|^;ö̠cva"z뭎YPP0E}ǯf͚x⼼;w؎-)S\rFڳbŊS~O2~ѣGL-hѢN|/c~ӦMsww_l8׿<{,[|!CeǿOqڵǯ&y\]]$ӧO8wЭҜ\]8Jի06 v.`pdɒ%B KKKɓ' N,//pYAFΚ5 \~zxN+((3g+WBnY8}4|;H~/H~\6qDpd„ '$%%S'O~-ܽ{7lH$B$??9r'OS'N@ދ _~e'6ƍBpk֬ % |P(,((2dHIIIrr Ȳe111<x@(nܸqBx?x`A._, w P(J+++aݻ;#3fxs }ؒLxB͛7n( _$ť *z)A _J$J1O>Ç4iݻw; PRRk׮_~eVJKKWAjZho͛_Jdoo;wL4`05۷n:tѣGΝm۶M6Y&;;Aszkܸq .qiӦ :֭[~UUUxx8ǃΝ;Ν;ŋBhҤI/_p™3gΞ=;mڴmC,Y2wl@ =iҤٳgEjMMM||P(?~̙3Ҩ(JչJrŊ{ꬬ{6l7mڴx'Oh4JDvڝ;w~jr۶mC-jJ"777777WWWT=zxxxdggϟ?;}رco޼yǏ_~s kh|Gk׮H$wޝ4ió3bĈ"ʭ[r8!C<{©@"_+h2,//Qwz^7 yyyF`0 H 222`RS4555TjԨ(AZQ0p8H<{/y#F�% `D"h4py rt:=<<̙36m5kVVV%Ǐ/((8q?xƢ"0)h4/!D"ѣyyyA׃xp?`N.ZTT啕a?tvv|*`d!M6mƌx<e07n$%%#K,q_faN>=??wSTϟOIIyIspݡ@566d2~HNN>}:,2/Krrr֬Y ;:>_ X~9sLkE BCCaּ^zX,Z}5WWݻ[~>Xyׂ�FsU.izV&effzzzAC*h4~bt:L7MMM?~Mak׮<yrŊk֬1ky̙3|~kٲe L<xpdJ@">>uѣGÿu6`۶m=p]vuYwž{5ivw^~~~eÇ՝?>44 'OZ6 dL&_~0X:--m߾}W\޽{CCGq˭ξw^n:6T2l6;KKJJƏe񖖖m۶;v,..A7o6l…<OryIIɿG2d+VD/Xb͚5_Q۷onܸɓ!$$ʗN?~ٳb߶A?|pCCCFFFpp˗UR[p{~N+))y뭷0K߿~;wɓ'SSSl}ׯyfii)hӧO>}js‰L0!777%%ҥK|>?!!s_zꔔ{Y&..ҥK񇇇eE`<"8::Z^~g}h~'@ ӓH$n۶ nǟ>}://A*:o޼?wZ|便Ν:t `La'NXfͻヒ ӧ<yjSSSi4ڰacbbp8Ԯϟ/~p.{ѣG p~޽BpذaopOMM /,,LII5jĉ>}uVD3|p.u|L7һ\@&Of̙>f̘;w2)Sܺu |>|}v^1DDDD 0ŋQƎ;uԛ7oܼy ?0333%%Æ RRRD"׬Yӿ;ven.\8|ݻwz=yVwof͚Ǐx<N7k֬gϦܻwOEEEׯ\{ȑ]HѣG?x %%ÇG_|'vrFXhW<r(yh6;..חdFFF 8wL&`dkI+JHO$4GGGS(7nܸAh)S&$$t;((HP(J*j4aN?|777ر#88mD"188xǎѓ'O~affCnܸqƍɓ'755QTHe+Wxzz~:`̝;ӧ,̙3wMHH(..G78;;mܸQ& _522"Ən:pD  0NO0ڵk{}?CSSSCCCN#v֭'66СCMMMje޽0E=@mmmMM#ˍjQSSCP8BH$z{{GEE1 I&]\\}Ç{yy :`0gϞM"|}}⼽LfϞ=cbbt[bb"sggg&IP,s8::v`DGGGO>l6`O4)***,,ۛBpӧX!CwӘ1cLW\\E" M-h۷'|b Fhh)S ЫW/x*,,lԩѣ6@]fQ(x<A"##=<<d{o믿Hy0AAA4` <xƌ$) `l6;66gϞ rk%7DBoYஞ~~~=z􈍍eXx<w`܃&Oѭ[7///2rǎ;bk:חL&66=>}ddd̙3]]])w}wȐ!^^^3gδƿ\&IR'fEZWe>+JzU_T`įB[14͟?߾}}e*1bDBB‚ ~ɓ'޽{?t)Sرƍ"hڴiaؾ}_շo_>~cǎ5j+V8uTNNF f⢢hWWW 1iZWWט .?_SRR/JCBB{|>gϞ/^իW7mڴo߾]v;wn֬YMMMjzܸq ,ql +yBBYclk_L'~eX2uJ̙3cǎį/{G9qĢE@ ӹ_i4Nį͛#G;wnt:NpO>eqqq7n6l<\?onVQh jhhQQQ .gϞm=<<?lذaÆ De>D߿}8n̙ h ݻw5-^<==G ŰaÂ}}};;wnڴiƍ m~B&]n߾}k׮]rȑ#d\;@رCT>yu]8Ϙ JE"vehhӞ={D"`2T*Q$p8.k.<rj/puu3?H܁N08R(%2Q,#r)>h.;xSf;jY慓D"�ؖNe2b�{"##_)D8qR<pѣG ƅ J%8񉌌RBPPL4 A/^XрSN=x 22lFFFdggs}G m֭{ٳgϟnݺHS?`>ԩs-YD"QnݺӦMST5kH4jԨ+W۷/222<<\P b`l@Z R Hp[ծO2F2] o4m@577BI9Pl{q 7nt \.{d2ӧ/@ooCZ鿪L{aaa^&Lk.[n'pr @ 4… LP222lCP߿?h [kp" 燆R(욚[hpjW^.lLJ&00FE9ҧO֔B@([B 0?MVt^z|6Fc㽇배0B�olN%%%\]]=<<H$`j;rp8*<<h-LR/^jMIjz=BT*k3ք`ZvǶ-={r_F�J"0ѻIi@ e, ]l MMM e?d2Qe #H$;|777APl Qv1Q7"_FBD$iZLjڛVF uuu _)t%9X˿©�Ć8={2SmnhhrTUUNv;]8avasaGېH$rՕL&O 長M&d2cR\.z}MM FVvAP466lf0 T*W:FkP[[j͞kNvasߓsrrbbb}9sTUU9s&99o---?SbbbrrrBB¾}5V(~7##C(߿5ZٳgZ֮]lh„ 6R4[n544 <ŋ\.+;;;"":11}ݽ{Ǐ 0QV_p-66~-l>dɉ`7n�)l:NjsppxŋǏ/ .]ō|2H *P0LׯK$0l!8nȑyyyV9sƍ?ӯ*..rEǏ$=9<pRdgg%H$6!++ AOVWW[>+b0�CT+..eyC{V۷+W)P;~&FHѣGݺuф*ŋ111<z#F466޼y/"" (6pkC^paϞ=KKKW\9pI&͞={ԨQeee999K,&MTYY)׭[wСQQQdʔ)C})^ښG&H)++C 2--->>>mrJQQQRRطodzɓ'f̘aJִ,?~|ΝAҥK#-[E�[ZZڅ &Nsݻw W?unj#J<yro[lZn@Bі.]흞qW^ JGfddX"33s~mmmYYن W_}|7oܳgςAJKKX8ݻw͚5&L())tk֬ŀhgnٲ%88xʕMMMNJNN>}Rw'*jه6lÇ=<<UVݿ?//oʔ)!!!޹s|}}AyѸw޻w}w eҥ\.3==}ӦM~~~SL={?#33cʔ);s <XZZh"LSN׻vP()))3f̸w &~gP'M0 FEC~ xE`aTh"k ZhQ]] Lo߾h"S,YpҥKusڵEYiA߿˖-[bEuu/ZHUP(~iJJ >�}yyyǎxݻwi4_||r["##9RPPuVZ2gΜSN#F[.%%ǧO8A#Gviڵ'%%eݺuqqqZ2իWեeeeedd5*%%wÆ 68iΝ'O/ ʕ+SRR>yv}ǎLH$~g'N8{f̘BP֯_5nܸ[n|SN9Y[7))i޿kmm9s`^Ľ{/[,--M(ZY2Gi1bč7vl2?ڵk,[m޼y {A$33AիWo߾A.]:~8kժU...555[wovڴi9Fkllrqq9sLFFƧ~zɚUV-_2z!C_ ?> nz>{P(_|ŋ<x֭ֆ%?3D|1d;v̟?߷ LLLsZ\͙3&!0`@ii Y@`Mc[_|1|k^|4 Lp}G`G9mڴ{iii...III;գ`v24o޼Ǐŋ>#6i&ԈW655?^p!KJJONNJ>D`2d;xK_W_Q(GM2qڴiO>MJJ"-BOQ4ݻWUU5d<qĘΙ3gΝ|lK.r?sʹ[nrW\6m?1?<~+ t={3P(8q g͚e߅㓒>ǏO>~۰a@ HJJ"Hryrrr^^^RRRDDkNNFjDf˖-t9L&֭[d2~~~ 6LTz֭o9�� �IDAT2ի̅U[[[\\e߿?!!߿-qFp$''gǎ7oܼyCJKKE"b{H$Ȅ }]:V_#۷{˖-{:YYY**>>T[{۷\.?v옓-;OHHr˖-믿JJJD"QdddBB5XÇ.]۷ozzB0ZݻNNNXs`=zkر#66֭[_}^?:ckkk~^z!B T*ׯw-44Tӽ~!8`oBѨjww?ڵkrFDGG߿ߚT`0 4D"Yzѣ{ b&;|pPZZH&DPPPcc#F7[s4+WvqD"Jpׯ_ 'O_tqK9н{ϝ;STںu#)SH$F`0.\xBql?R@322z#RSS3c "xҥS޽7oX sNttthhVMJJzF  drEEEJJʶmrAocqttp»:uӧ?QT[Lh7n9r#V^᪫gϞM$zaX2bS(P(RSS=<<uxܸqƍX2r`z:1rHF ͛`ZR gDS4D*ѱ'Nغuի[ká555ݺusrr2 jcbb.\xbxAEE뒽M0Ͽ L> L&o;@(,,SSSUIJJčŋC5駟oO_t�AwwwLLB9u 2zի!cp111͛M_~ho9s̙3ovE/wԩ{h4+ 36l۶-44WQQqΝɓ'O:T dُ=Zp!8r}||ܹ |cR;wz{aaY7e˖͚5k֬YΝsγgLwbx|TT\.sJ(.."/^bl{;찣5'믿INNF;Y 7oՄgӦMHKK^zرcu,X`4Ϟ=/B oذiiiAAA6lp8˗/OKK>|/_b7pcǎ!k׮&9vXE >p´ĕ+Wfdd%޾}/^',Ycǎю~ua%}||^Qv؁2QQQ] :hЉd2NGi?x`LLLkoLc^r _k2 FYYY]]]ll)t1<xd2rX2رccƌ>e/_޽;eX>+//ݻ+'.@eeeyyybbbe`DEE6a/nva#0/h4օalNN C3** }@ x]vL45u3Oq/ 0)Tףu&kJ~455ݾ}h3Ůh^~碥5'/ iyYJ.-dj5C0xZC\\E|>şAx� +w=x`pMPP jh3$W777.‰JxNa*:7vH |]x]R8Ɨ+.]7X+u/r/!F͡aÆ9�p8gJi֐mRW(]ʧLձN.+c-!F'wWwbm}?< : ÇcRnfвa yt: oo簾& >u *M<. ۷/'' bdOQQK"y>P( V5d2YӑHDo<>39Ձ).n%Jm9-,, צZHHHQQQ1O ˳պk4L.*`&8x<nA2 ݺuSՠGxt~J|2:~:�lkZ-% o@k|סo>f/rppx B~bP(tގI&<Vi?L$ ]g'eD"a `7BPTJ&A\]]V4H$x<JPr9Lqff } ֦fNPv"72]]]-WU7Uxc7L,ёFC#??ߚhӧOd"H, "D$z CAAfx<?p8xYNNN{%P_***07q8U0Y,S"%I& Mx<uqqi7{L&J`&l6@@N70FRw$h8 =OJJJ^e; oPTA&YP_R)D"`)ʢ"XR&1" >t2Je @ARdP�#6'ZH$ѾMMMbdvJ9TLRL&z�刳3LBh W<L  D""ԵZÇAg44<`#M%1L6]jXI*Ȕ&D"D~Qs^R)m$ mjj2[rH$Z&G6 ?Xә.]\\x<x\.GoL&Pc͡d2UUUiZ777Fөd7u "J%H$L&C�Z-&oPXi677[EgE $]0ˊ |/B坲?QWWýC&D*&@@vœ^G644h4B ;B@n^JҧO]D&!x H /Jrx<ޔTZsDhD&4[Nt:כB.C\0L3hlQRp8q`xh AAA}`̑&(Z#rѨjX Z l`02𰠵xzz^+�>hbOx|JGł)L?d2_VWUUxWW7jp}V,;99v'P4PT>,K+ ww6%7@u ӔTB"X_ZKlZaWX,W(mkSUb'KJJJJJ@gxg DWQQHE׃52f-00744p8K 0񚚚[S Ƴg,|^ = rP(4Y"d �m:MIkfAnj5F<\RRY mnnn3z}CCɤP(FhFD"Q*pAVwJh'HT*Ch<J *B3t5ZaNf4Y)b f5d^^^fweDDRXXJcX^C*dFFF:99) <6{zz666bSA,F*ꊑ mNTNgh닊gaMMMf}+**!d:88kpppxh@O%S^Z;nZ5};Z\tBpEӁm3" � H;xJRYذ �@ 8F7.\ TVj~]hk.88XPVCRS�Z[д tN^oOo}}}KK }Z;Bi~HJ8)R(J4oH$|>󝜜t@ P(="K�Obɓe6򋖖9BѮzTKꊹ|>_Ri`š\>@iѣLMT|>@ @�OYf_e0ijjjڲUM"t^]:[```]]`P(V @Hd=Qzzz* 8777m  ! lP(>>>NPPiVǂMT*Jx<a): 1_[[pZBP*j!""�! �! ͆³g\el6T&d2\nNN7]w̘f }J2 @|Z-H ӎ,Zj[L`,,d^^^PP* <l2H_i@r:Ң U^^lq6L&-j68FQV[t&K[ 3...A Fuuu&J0nݺЦ\VcsQQL8MG;^_H$|> pt:~Muuu?~ɝ;wЎIEEE r0F"88怷WXX2RJ&E& EEE߿}}NP2W YH$ˎEyyy# >>> 8 mPE} i~ГM^�[ Gx2L&E"0"sM\ʷp8X6a0 6T*k}}}VV%j3RssY̹ @@EhքUa\1|m֌(a4-zi4N'HH d2d|>@ z_ $'͙'NDt:2Z bEU*X,ĉ;fLfYY6^FSQQ:88:;; A|.&:STDpڌ4ּ* ̓X,-] 9:aϟ?P(NCp|}}]]]Ask/,xL):V ӃJ^k WLdNkcaai4a...D"0BDJr$%E]i4l&�N LF^PTgox;l,H[ȗ!;&5NsӈBV S]]BUU`ِb\D2͹X,؎fpch42 � $NR(`6 ---$^N&?M[LX8N''' Z:p ZZZe2B`0^^^l6 0LPe&r*境p1Lϴ1v{%Vf.n{\.:άN[0DUWWzI$Ŵ4@f4FH$ wzhv"WWz{7 d2 '*ͺAX�!#D.FCR`[$I"L&<_D"!bB"ze.+Ht:FN8.@AHfJP(8ʚMNNNvk2krlGZd2~~~ ךݻwU*U~~>H T*$�TD"!H'h4ٳl2=+2%#f$pk\-Zk3� Rih H$`vp^9 d!Ɏh'y1}HbȦ Q*`WW<_:R]}}}PP(ff y<*MnnnMMMx"�(-M̦Lwr 0u[0;^pkkk1ͲK.+˭!a20 `L1@5,엂q**//5///էd:Sj[:u |5𨩩i-31b1_ZYت*>` HM`Ib00^vP7զ7`yEP\.`* .1R5v\\\r9@R4::`�:,L3 --- o\.0zo666.e2YNl9;NSS\oihhx5;$˨D@x___8LH$D"e\.d`2fu@�GPV*R*f/nnnZV*ô0H6kp S&*wkct\.o/mhh٪p2]ݴ h�./P(D"Q&0h4 |KKV  )#AAA@qwwd}􅅅b8) FNNNNδZ-477[Z^p\.o/TT赠p]kZ[CE.r�4 Xwww6-t @>'O�qR6e̶J*VUU IRTڮ5 bu:]g7%XZTD"QRtp-z:1 ޢli;vd2o߾<C4EPPzǏ0qtt|뭷b6ARl0b1z)Fۄ 2VT#xyy^ؚp_ގ1a O<<>`kSb=CQMMM|MFTFNb1ꘘTUU^vݝBݿ?$$ ~"( ѤIAA3D?ϯΔzyy"fD"@q<S,X] ~K @X6_+ill45p `0tVRd2 JZLJ$Lz6la]G igh|ĉ$i֭4h]`t/]Vz=H{x<'yb2L H"""?~ h RNN@�0 "1++dc"""rss"C$) ??j0 B!h m-@y<ܗ&0rX_JzyyYȬЃ w@t'4R!܀ʠƖ\R jךG 94$$JfggEZ6<<H$>z}AYYYWeeekߏ@A7-:Åa1M02=kCA⯩Tա H$p8tAvKOOO`0``HAQQ,U{4# G€K$V{ݻ#sAqvv޻w/̫Hf{yyUWWkڰ0`y???QPP�<5 `* NB>q2עT.ރ[T*UVCz [???R ɉb={J [PP:!T2hd2X5cD"u=hVχ#] .2H& 5'HnjBhZ@@ h9XB4>YuYбyyy4 ~5t L$x<(P(@Fgt Aii)@K;2\^^n\;8lXZ2[[p+z;e >$} Oh4&^7705h4ZF1�� �IDATSpR)S333J$A A ûBwNĂᰗ7`-[#w:tUϟܹsiii)))C uVSS֭[?UV7_~Q(#G<uԪUfϞW_ZjȑGU3f̪UMaÆM#//Ob%H`6$[2Bx<:rkjjۼT*@STGR͌f7wwwLR)20u/9ZYD"|x brttd�lqֶ[&V=Lf �wb1|WWWt/t(Xx{{{{{?|yzz{ s۴ǔA1fq wuu M *lwP@]hjh�֩߾}_$uV} #FH$Ϟ={)6$Ic:88HI8pMO-X@T9rdڵo޷o8~֭ky544444\ȑ#[bEmmmKK˖-[92w'Nx#Gϙ3i…QQQG0aݻ߿oIm2 OM4'<{pTC]]]~~>tLѝt:mJ`89z:с of0!EPюF^Zmj]qvv?SD  CW dRfNަ T%vvv6U41g6(wk|WWW;99YSl=65i) BT@-5&֬pj  NŰHkƃbZ]QQ=͙3[lM.;߽{Ν;@p37,`0,*Y,?^߸qczz:g}KΙ3hƍc kƍ7nܰ +HV馤jX,w'Lb4A6U-4 Dp8Hgg!]&ːM.ŀxe , .1 E}}=BOzdkvV ݗpvge ~\ | &ؚx %}F6^1_"=JKKCpP D"> sZk{J�P(@UmhhhWJ{Dܱcu vB]‰@ X0U1Lq̀qd�A'NSVVp8gaaaΝ\PRRtRAy뉀D"q8ѣG=:<<.~Z^;#9F2ZM$=== @ `卍IrHu:eG{zzj�nRf-՘E[;�FQ׃zy2zry\.2iVps`bJ� >_WW fo4{ܔa�Je2`kpT*PDw٠ h0ࣣM?W*ZϪ-RFLYKK 13ixeD"ѕ+W"""On}Pӝ._J}6>/0 +Z * h5AB� Ν; +0"N"Y Ֆ#H!!!ZL&EVj=NNN]\\n  @@DށT*U @`SYH)֮V^ R$u[_PatB3!tfz}/u4`__PNTj- la2`dLT ߂R܊z< mXZP㕎ի:___Fy@hIVRNqyjcv/bt:=11?lii1Y޽{e˖>|811_~ݺu-@lvZZZfffbbe˂o60㎮)HBBB)77u몪Gݿ?33b:ܦ3 $nW-"p=F)9x Tq7 @ժZZZt:]pp c.򪪪$hѮVl6ZhڕEͲF8AرSpRfgt:kNhF|>нc%kjjl�_0YhNkSprX.SLCPcR0!eč>[+q4\;VK4XAŔk6a".+fLy֮]faہ9~h3MW'h#SHPCx\.{l0L&kiiD"Ɓ掎,D 8 Xf;œFNNNVV޽{M} ,Pp )wwwP+bBԹfsbu֭@ JH$NA?SË+aL;w Uρz=A*nnnϞ=Ş[ ؁4 "X,VY,BQT2prAF&HԂ]X; ndC?<8</Vn3v016 `� Er pp@X;N?8@ Tx !E0h#ifK}|{onid-ksyyz;sk8ɥvfWVRghPE孥`p||4fl6Z9\uZnq\X#AQ`~xZol4|3VrÇ[\SN!V bS`YONdjBZ�O(T0fىFgϞ&].DTT*8`-9Ba~[V*r\,jzz5*d|ink4fY0NlYrͤ3׀JjX@ dozd2@�G@a&&&`/|,Pm.J%d#'Ƚs:bAND\h4|BFM&ӫ^.za@%pyzdd< vww Ĭ͏.Rrla`jj}W_}=xXrr?K\mבJT 7 dpgV+j5^D255MN+{ 7:˞zKw"t(FIobmyx<Sj4Jv{8NR###O^\\t:rP\gsmm Y~\T*v:$"q b8mnnC à+ۘǢ7{駣(zh9L ht\D2??{WzHX+++P\j`('`0z�V=/"dkW(XUVT*<8U*#gne:S^=aZt m7r.‚qm<EÞ~[>O(2sGE7xZ-/3<sX7LaD缝JØ6-6Dz=RCC⩣$ y^]ߟfI6ѵX,]4H;;;x2t\6d2!jjT P,;8"9.%R r9\FCOR<TJ> jC)sntaO�l6[Va.^(Ht:]X\]]]^^>\._[[kNP($Iɮ%pLufFxSH$"oaҼE}TUK2N@kKmIl6+|juWt48nrG�v$\.OM&l^[[c $ U*qhj;\C#1I\.hk\N,#?4ښT*Ņ%l6 P"W2ᬂXff |.-Bk0z0$D'_ a!)%bOǮǽv̙3O7Ajmll`Ct:-| A'zq?hVU: ,"yaGwD/akww]bM)p`8Gy khP4!x/]=( HR�tZl6jo@'&ޅ^ e0Phl6 .HdE-:YݮT*G8T*lj|S,0kD1&J"n'L=hZ X&:FP8F# !  Hn\6Yg"ЋbE$<"(, |Ԟ8/0Npm,SjZ WC9&x~bJMBn=baZ=@ %npY3bH$r K^0 :v1 qסljlf@|0iU%ۋ JeܯD<,D"pyUGk/[;c4- T(Bi�"oݎb Daׄ{!r\GTլH$ 2 ZjEx  &&s>&Z5Ё=|6$n-K'rH$XkZv``@Tr9ݎ; R@�333NS:@퓓Ǐ}+_9;;k0x|L&j3�zF|񮡡N}n\߈$Q"o-J,xwttt@~,K˜qV N$y6jrh`bzPrŤ%"+vPvT*x@ s<mz0H`f]y<JB[&LPRf3IF^jX`0!B!WT###W^y%n4L&& "SȀ^�AWcaNﵿ9cSPǵZq2>vPrjJC>4= \yN266pXdˮӔL&5(JE�WG255%[,p"T�-n&T0?h4nIG2*Xd2MX,T*٠X L&I. qFf֢h&T*(U** X,ٳgE`08<<V0YjZ.\n;Hyuh4Z*T*U"\{W\qō7hX�N'^@{f3 A[l6KO&bǏ?.vkkk-(xbDrرclْhXl%>%OLb"Rb1m 0Fgb;WWWj< '*XK</cXD8Tt M,6RK0ѭ%K_:%Op|ײ2j\(xiZVBtv4S=r2??/Ɇ@腽D}~ۈ{.v8 "^… $@7r2T3Xh H6iǬ" > 2<<0\RH$?00d^''|{<PztW'$0"{ߏXn6#FAY Q5$|CN 򞟟i @瞣M`̈trkN4Ñ#G2wLe2Ai֖f۲{H$+^"T*Ѡ-dHq+ uHJX[_Dv(n'}+l_zU^妛n~ _z'VVVn喯g0nCr;VȄ)w%c)Z) G|>iBN 2N Fwp8!+t:.+pdcǎ]~'OfwH$zϝ;p T VT*Ÿ<{jRdKS!OC $Wwk?pvwwaWWWn3gt!I X\\, ܁PjEZpt:uX1Z/= FvNJ4n\. X~D&KU׹,dy{Pa}~~=yWjnwN^c ׾}}}}{qHΞ= J*կ"\/yKf~3$6Ϟ={ȑC?Q( .¤BrH. LVԁ�($Kwoee&J lffMzd.زX値d2R 5�he˳Z0 JRNf6muumVs<0�l6kB#?Je*]'={!V(.^N0>L<P( Y\\D~+h"@FN @Dhj.\NH$r#ev2ܒdR5uO?߆Gž2L,yƩjAłM=}3g~_|][? Ń>||ͷv|#Ng?җW\裏:u0ŋSB  djjX4I.)rl6h: T M$S YI$_a*+ FaSo2 g{{jiR ݣM],wwwM&4 riY :f3R2X%Uҕĺd2F&WUJY>[Zm,@faOYd2)Uhvww"GR hqbhZʘL|>O \.kJ"Jj5k7N^  z=u*I2f9&TR}B'>A877wH$׿o\}w}>1jN(=U!{5JѣGm6[4Uռ& NMMѩ*Jt:R)z766jO" 1 CV% Fc<&%|ΐ�kcc#͢sbh4Á_ͽ<F9a'BJDKRzL&.h}"M%Ĭ*pt6,<-*|D`"w^a, Bאj"cZK@Fc4<B^Ȝd2r/K}&#ꋩ+7vjg?wE^yNuޱAÑZqloo>qdNS&|>"C-96M At^,dggZh�jfepydN9NGjtX':a> RB@ǟ։SWXGaV+xC$yE8F8 jDbӾHW׹@^M^pMK_]vzn阛s^P/#\.mz5/d Fccc`{{;fLzXh)ͮJ%-H ]^\CPv&"jN_R)xga$IT*ND,Bj �WZt:-y:_ȊX'b �� �IDATmc,o|`4ejuNN.]/T*?c'7jU\vr^E �hduXHsM8/!:oj<Xmo{[2};q|x}{_'�ģGԧ>EwOD몫+?яu `lv"AVdrrĉW^yLJd22i4r駟=??Dn tPd2Y:&(} ^wR`Р06::j0p֥Rlll晙ZM rb6h! $t:kQ炉>@6 #ñr4P:aD"i2׫j~**eYY,CQfubżq#4>>NL)7~8}<U?:٧^�X.U]0Y900@wBJE°.H"qcr=C᪫zK_jX;N˿{Fc|Czӛ}|||uu_W\_<OO}}}zGygӟr-VGAnͱ1\| 8>>>11D?1ǎcVusaPֵZM*Ri4 oHj%&NuaajXJ$fq*Ji֩VD*t:;::JsL&LG;;;5Ubzjߕf.փ[[[P2$_J lNuy㬄d<G (up:VU['N T~H,mll$I^j5oxe InvZB|D"ꚑ~k[D"JebbbqqQ8ưk|>_</F;cًÏ: %d>… 'Nf w}SK>裬|?,nFEOփ7|7z{ ;ofN&2'sB p�V*vFP(}.U*H߱ FGG1! ~Xaf&OСI.�~aaZ`&aP-CsH$tϟ?fY zrMNN6'|r|||aaDo@f7vnG A2h4̩IxN w`` HPTz<qׁD]$2###x\Fc'I~$z,%+J'+ʱg,pj' v-llll'JHkZ8 :t:^+(n 7 (Uϛf.衼\*nSO|qq̙3~u_]ɛE"ݎ\hj2A$ zI4 z^u|RNT*>lFAViBӱN4 ˙'NW*h'wm0P(H$o___禕| }:%TVWWxlj mnnnJRDhX,rzv<nJiT*bD=+.;XsXFH{]PhffP(`k9X.|>c}MDL&I8UV[*.^ JTH ܂`;PAC�X&jX fU*UT"hVZTB#dB <:L&jtLZVL1,F1ͅBA"\??Sի y"jAHkb'XRTTabf1 Z-26Lo4“9īZp~c "=NP ٮFQ,w4Rl6wbd2f G‰j}wߕD"rn1F<0p,!{^?*= B*bGVJ*`00 x|>*,4 vE!z VXz^*b9.]#E:ۅ D"l!.677r,h4iDRL&T*; Z%%z#nmmpl{jZ8P{<daS^r9k`FO/HĒN#L0\.ib}0FhZٜJH(vxRAS^dx`06'&Lbz_,\ʤZZib }}};;;ҒfIgN. z  ;?FbUl%XTrV+Y^ 6oe ^OtZa\.>D^?Xz$au;(hܶخ~#XRqݔn7\'\&G#&-.zVT*%bXǯVR<Pki4R ;_*;$ KTٳ PƧ d'.=J4p�MT*i#^!rjb@ OJ####cZA#QvEB0Fd2]a\(5TmzO|4Db *~'g!Rwؤ.hXuZ@Xj4iAY^nioLh SY*p;҉uV 5YB'C >`T"T":h4*dw\1LrL6Z@FEznm0DS#h!߅Ml6aiVMF Oe^sߟdL&x<;;;`^"eC_R9>>m8qB jP=F�rk8j5MjJa#L\{n/UTh l6{&9LNNNLL~^`NjڧL4wZ!1(ndR)c(cccOA \`" E:Qչ\.n䴹')kor ܀\.\.zԩf }N 3PphrFJB&m6^IXJ588j@ĻX^^VTB! 8RJrvvd2i0(v, ύD{ޭB ^#TT: r/͖^ gL&htssS8D$K'J[73.ìh(H:y:22"#dX|\?/\.&�KaENNNvX<?DY[[#ud@vwA2 D�Ȫ1^UbL!\1ېJ666/򙙙WCCC�`uccEiQçh4Z:'RlmmR)hRaWUX"e~qFv;m斖s=ŹWV/\5F=___'Q#Wt<Oǃ^|DBߦN lK$IA c ?)|i G*mVr^eii ]B+݅6'Zu٤O�8 C $I42 tE EkьrP^\\W ʁ Vc+RNJŅt|<z󽲲fWVV}v-Hry" ;mzCPP0 8r6|>4D"t�Wf鲁BGAPU"H<^,SIKP4MTjZϝ;N777iF3==MR&^'F#REHY]PP(|(f1yׁ<ΩjUf�+ E c]>HfSRƮnՒd[) R)rȝ ԭ{jj)p)i,R="B>ÝD"+fggIĚJ.\z}ᰴ\.YQӧC٫4 ziRZ�E"^x # *TΕJFX,]?5yccchhP(,..J,L&L&@fq 2RpA$j-�ZoyyYVz'YT* BjL&xhKP("HTΣ ӧOw:,rT*#Xո9$ƫp.EʺM.A:x<MZ}Y,dzF%4^l6;Rԣv\|TI#y)"mVkPah4FQVM&S&ibm6[\|chr r V{W/~/IŞ|ɷGVO<q]w H$׽//^୷ޚJއһIUTi!\iV N?FíNCfFfe1T*XL44aJcc±nG"N]aXh5Rkkkd*JD*x8bZ777:mv{\FEkXl0J (Hf󞴿X,6Ҽbb1z'Jbd6h'ny-4k@J*0Gt:xjٟlmm ' VX,VUJ%S766d2R8v:AɓT}[V;;;?>;;RK.w3;;7O\uU".?0׼wx߾ijEA| (_ÑNY+LZց�V>T*L6Z]VVB �R `0TU}X,ζZH$ 2LVET(�7k[,x<n;uj:O^XX >YP@ƒ/AgIV*m6&pyVWʽaVi ecL]\vd nAڻqc1v%gp>65<H!ҳZJeVk4({O .X4lH$"l9z> s% d_a 7;3}򓟼;;WΝ;5w~W,?;?|S=;"ZH˝ ;::}H$"%e2@#Jɖ㍼\R-,,gY0-d7NommaҶWF�ͦP()L?YNp$/|(}zR=kN}YD#K;x)KPY5׵jO�ekM�>F:;-F* r^F xw:=2I>4ɓ'_W;wZ$'?yG/R_]z̏X,OT*{^?4HtJW*V.T*R)N TpQl6[*r9lI|EY ?nll BQH|\vnTDQT*bUR\W5aR%hh)n> {uԄi`1xNIϋ:a[BlA /^s1F p fߖq9#vrKpzRWZvfYD"DSW{|r_rOO<3|^~}|Z~}OD72 T*Y,aȲD"ؠluF.jՊLr^̛rXZZ"f`0z(ACVARh492::A`r 9zyt ͖`T^ͽ xZ2L;w7;.OKR/E&^|>)WS)(^!ipx\�P(ЫDz ns5# ;K1OR) qHP#+R5yVߴf|y䑩)LtMf _]�;7CkԻBf)pz!u~~N#fd󁲁u:+ JV+R bGR) j%�* 6ԩSۘbzh4ZX,VVz>* ¦Ʃf٩'v:"STҵJJR P@m0xAѰx'D 0J6bR=v]ȁ`ye-lfW; 8afK$vYA"EkhRe|||eeh`b0 tp]~?]۶9rW/5) b2d2YP8~x& ÿ/ZT~R'/Gys#f3333!!s.\n?\K*(AxBOqJA⎘M2l&X,nllw1 A%L611^�}W {aD"AF[nZ+$ӵ&ѓHnw 2Q.u86 ـ#Nhj;CTb)///!a.\@D`0HxHOOOϓ Kko*RZ~A[jGFF:)N:yeew`N&SF_ޞfvLZpT*G�Mv H/^#=İ޼NwkBPT@t`T*x*�/�OrJ}}}VU" Y,~~O:_$}#ah6~0ݟj5ЙdQUNK'N@nmmT*B099)sX,šS FJ2N:>/ ͙LA˥wvvzdr9ᓯh4z9ùx1K=z^F!iO4%IV>/B0dF&E"zP(,0Q{Et(S\aL&ցD"j%3bȕsa; =Np9dR. q(@_< ess}b/M矮n"J>O=X,œ~:c F{ܸyi6,-a_|k_+^wu!< :MxsuR 9{ Ůn $�FFFr\<';h4d2tzUy_ZbX,F!V.h47I$\.EZ]V{Ot:FrBaDfpd2=^hN#Ծoh4tC�li^JC̓O>IHyu ߦ?~jm6$U׻JN@Ρ}|$ٚKk\LfŬ�gG;jZaevxM'd_<yAAhlllra0zݩ꾾d2)J4M&)T@UjaFZ@l6^L&3g~Bǃ;zh__Rدy6NjZAd:M|>l6%"gd�d2Q=_D6u:k(RI歬2upݗ]vPk΂$Hcyk'q$ g[{o?BEM \�� �IDAT{ܲ,Z-n|6lųB5Q'N8C}NG JT\.vWt: M,LF<jܩT*\f3 γd2}}}dl+SVCx@ ^TJ2{:^Bj].W*7y"z\..%<z=.S8%lYvsJwAg6Aw^o%-v=HH$FVd.[[[X;({@z6?MX:x�qr2`f3UZETFH$-=b^0 c0XidJ5 vPJzz#_8fC}Vmvc2pqA |>E:NL/L&S2-o1L@dl7+Z)z@߂'XzNTI&!l+++vRD"NpV tZ,R)^xxZnooctjYd2anD$ӺnG3^(s}O uA#?Sկбzlh4(6zN b!1\'uE`zڗCHl@nii6\#hoF`0#Fڹc\. qۿ}K7!/V]J :  V%ɜ$inIR@pP`v;NҘJ:www0 5-2-D/n? /l60r1/188/%7ATմZ`@ϺP~W&#aZJ%N'p\IZ'}R,FX)Nf|fT,cX,T*zզ" Sbܷnf:EpJ^NJR5tN Jm`ƥW^ CP(n:QdGygg@Pjtv;*2JaW"z)4m`X'$ ]sZ=B%d0> $mVpl4CNy9b|>O$5+r|||墮?8ё4Rl6͉D]56XJ ^,~v&D`tMvZk/v}[a %'^W&8�.###C7 zlWtR|rݨ$Ssh4z/zCHh?wj2@& /܄I0@*0,f9`zzzZxV P#tPJ\.:t`%[%JaT*kn7EB!1zὣ#iLݫ=ѻT*JТb sv*&`x zWjƼ1-D$·&+++b^gdd$j^uUnhZ7hj5N7440L4UTo~GFF0![, 'ȰkiŨjh0L:F^ r 9䍢!+Ϝ9=MZV"]|cHP(lmmE_3DX.?F"\bV֡e_UNcfhÅ֒䚁 LW\)ǛdcMMM (zQ6"ܵv}ddixxɞEi d2bG$ށHJc/ t: B!nCN*XV5E3"k/ v(nql0lFV (t:6͉ pSChy@ P(x<a2q1׋RHFJD<nD xz(2 =~}>ڑhG,fI9MNsqq… h6LVukkknnN?mٌŒB"rm8ngϞ1 Z%ڊKI4 ~L"{:)Jbsss]߆e2tn41Q2~Yv=GkJ%m~X{ ĵdrA)J$R)7zq nn0GBu( c{9h]֥-J9}Oplהw/1TyC®_$LC3,n4 Vj< zs8xaJEJ&bloorP(dd2 F.˛F`0lll�BPp8lټ^`|�,^[[J|N+ .h~.EZU*JvGb0 Rrzx z^ѨVQV&{>Ad6U*ϬT* ;v, ocOn$jx.]9zxVn'Jjo-i;EMrz8&~<w__~ZN\.t\.gE~R>Y R4]-]8=6a4̈́G1 J F&:ԍ].W^GZю^'H?;-T*=z(1NO?k^NSo{ӧO_x|nj?t:|/z^[[{ꩧN8!ֹjbzаk lAg2RBd "HJ% ceH$#l6N'8FD:&ےdp vhAfI|* � BQ.iRT\yR!+h4677a$T*U.hFv�X1 ; vL {rGD)h4T*!²|60`!}(O&ڜH:qOX&i}}{²"ZRl_J fscU]!^_%_C`i@t\.H$)XcĞ@? P>y? w |Sip *zoͿ~ProX(677y_׷~;p(V]Oww0T*M&0E�jn67xc @ P(T@-I.^ՆH$T*J%+ Q$@AD2by$- p<>Gd,V;888>>nX% .,..gRpvQt \q:$Ӆ X^.r\6N{Xj{kk BÆ/0])}DַGϬ 䨳 xyV`0m|6`.�Si0]^~-P8߷z]wݥP(ܹs_Wk_?q\3Vi_cٝ<??d_"M&FsXB@8[wS%%RC, g-NC1 F05cөVw8.^`x<^Y'l6 !x|7 #c2ƨVvprn'dBn[m`gg`0�-dp(`)RG6V8xE*MzDuZ-|bzrf8ZV,q={{g kt:ah@*vr%VXbD\>}7EҶ'H`�p&`rJ6 ZVx{<}[nmm]s5~}[B2z}?{>7==}뭷w}<^pG}mo{ۡMv#&~�MSKP(t,"*7Vt:؉s\.:Zmr*Wv;X #R.l6NNN Hl6N ^׃`*ll>RZh à\PjP(oL@ddҼM3m4Oӝ)VАSD!], qj2D�p tfSc,K\"1E.tyQ=Y,xN98O: mpM&7+XՒdTnȑ#V/>Bk6=}_xy\.o;=!/ԧ>u̙￟u]+^n~{l4M%G&h%o686Pdt[NԔB eL&ÛB.HG?ٳgDtg%vL&S>o6.T x6,�FF8ɑT*@4lvggP(;vljjv3 ZzRBҒNt m6恸>}vB OI 'h4 Zòk6)[,ѨjIO ΝxPXرcخ,Ռ{166T?rX;$,`JH$;TV2P|R)zaI/8]wOk4L&{KgfͦJ"-Pe3o[6eaNOOZ-Bqe%/i4.\,FZ|>�] !tH$$|G?ѯ|+_җ> ]6:iRM&"EFAf9F7m6؇v=ooo+b800�I 4fpzhd)#f;a#Rr@`dd/5\suס0s7xĄrdZezzn/H0CphJ3n !h" r9ViۥRJujjjssf]yǏ7L@nn{],~+[\\X`0x.jC*,K q/:pYGDTTV1Jc4,O|bqssS"1CfgYiMҮ5-'O4CٴX,X̙3*%M t=JN1 !n� '+lv;LL�f f.--a;5J1 333siP\N&gq ?  ^"pf7669<<J\.|dI%,|O&KKK`Hm?MLL{mLp1Lˋ«ݩKt:~#ZH׶=teTYoAzݞ]噼@&L&ӱcʁx~gl@o\pDTb5illS$Ng(W"㛛<avQR}gq:F &Nb*ct.>[[[!D"ΝD"(CCC="=s=}>_2|}ѹGKKKl~:;=00V/\wUQc@ �<oLV>\+ MfsuuB3L333d% V^x1F"]m ]xqtt0VVVZ "D%za4 8 7M�% 0,vJURRx"Q:vU*t ð dH#_tJΞF  p80[anl6a[\.Ί}>O?MS.OvJe/w0d&… $o,n7/]rJG %X b(ɔJeWAaadStZ.r+C#`N(5Y,‰SN};!{{O~"vTTN:rH$9u\S^/JO:5==w)77v9uRW^yh0�H*ұʊ'hA@!o%8t:R  'dd[,0&Џs$z$ǸAX,P("PeZj ^ܲZ|z<nᰓP{$NWN'\FTe9̖&^H$_)b`l6�#) jʝ%-[z}>_[[jiCN.qlXvA@a qbJ*333 <hcju^gЩTjggghn/\j=Z1՚H$ DɔNzpʞ<oW?o[oC=n馛notEj4'OD_@CYkk? D"Awzh,--i4 5M肱'xI|_XSh[[[ XXN\hULVtL,C_ \.rdV[[[^z4ld8M B.y@id666p6x ׀|*֢j{QMzP($ �7V ǽj*VA7bxshchw) , E|*rj-(^6],t#Xnѣ ?эM#'9r]{ii IozӛWv;Wv\)zǍ DT 4p?0w8QNI@d2fX,@^k�3:.$ E& $8NN3ąG3j ^k4t:-pXt}1˙ p `ršt8ZVT@P&KM%@JΎ餱-{y߂$+9(�"a˱l^/\3VNKoPt]&˾E [7( ho<4E.-�j~,mL&]ѰX,box<HH,KZ%E{fr8vDVzQ3:@VLfZcdxo6 CVj5DSll6u2$n7"9g-ڊ5GĻ{V+i]gm$@6oT:}2uߡbp&n -Qרqd2dB}k NckI)T`{IJpA?v+ N׊[nC$_6Ms6*w|>ڣx6-J(jѣGY^gY�VcblWRi۹<2l``ZBXlWZ sP�_\E2L$ :�mƇu/  JdOQ5X[wwws\:Fՙh/zдZm'{Zv ۘjF YTV+}yr-Jl&;N^kqǨmb-oc^p^nttnRd2L&!],;͎0PV/1e4JeW;8u1 RC=`|>:u-坝xh4ޙG$TB!F#<ryii. +I{o6ە5#pIG@FR4 p8́} �@ZǨP(^HHd2X,L&,djMU**b)J8!\.켼ZF~o B�h�//xZ $U'4n$,@`kkkj{ h&ϡ>&rѣGj^'#}{ LA6Nͮ\Xp &�� �IDAT_P)CC%*333f\MZ2 {))닐9d4yIOV֖Ww& bIBA6-Jr1TŸ>:�J"jzܹg}8|زxD^{ѣG T+,odd0tl6trtZ-m> ô~mٷcW@l6Z- cl}DFC@MVY[u 9^ӱJfJoVZ,kZI)k;'HJG&a5tt^hN&F~``�9Z./HY>)G6|(r1L611XqMCb@RVcXMtˍFcLx׉'b3g� ԊL&[ZZR*ٳH� !鮺*1L|8G"h||aeӉM0 p�;77GF :^Et:Q@]*^q7pѣGcOsss`eV%:fttRh�'4ʊD" hCL&ꪫJXSs HA#V$E8C R:.�y `{ ÐB&6끌o4YeDx5 wT*1,,, QBIڷ)ȱ-bqvկ~u~~!& ČT"> #G{И�VW"v~_e,nGC&n;A&|> )jρ1`@}b< Nl6[,Zdfii)J VnT*uű75I{qVkZ5hT*w^&75r99BZFW\qS.S*cccۗ]v5Po[ZZ:}(A^%Hlj}}}{GIZUos讪3=aAX\ `EY ,, q ===RWp&wᏡ+}}>|"F\Z mEA}QRK PhA0$\.G6, cVu}}\.CD]Skj5z`0dYzF. NA||o9e+ Nzxr;b{=_qdRVJsvߏ>e*%'|+_h;\9t:"$ b14T*7ŀlk)ju8DNd(r<77G^́H& bhZ.KACknnd2>@_l6[рe2RD|$ajZeh4w^Zr {L42ZbVk"@s$dk}rL ,P6=|0,;v0Lڮ$ jz@ H&Zb,,,D|>/Jl6)Dj z ' & :btnEhƀjT*0Sr03:m. w>f{DŽBL&c\y<^?{&ԿN1-D"9|0UH$T{^^f(AƨT*twNJ{VGG`LV]!T&[ nd2evF=.7XYYl|A Ήx&T&\FH$"Hڃ!@`UD.v^G"^T*, |>t&R$ 11](Z-G`%#AV!p pN+|>\.`0rZ@ X[[3Ǐ\.7ɄB!(\.m6_0/FTލH$"I㶅/vя Ǧ8'rJW"9RՙLx$ɠQSd2&OJXXf;NKorqZ蓚@"_vHv675598}5M>}F |>G ~E Y,Fsر?x{M@\,l6P(t]wuWbn_~<̵^zZ~Sz%ɴP.�C�lC0p(R*!>k x<lZnFH$42o!LB6)ndnPZz}}}xx6kZDG\.G"jŢX,D5<<s XWZVtT8g xh4V"Wa[їJaϗt7+1cVE l &K:fb``}FFΐd0苖8T@%I� XfE@Gr\.[n'z=3?uvێel6T C%>i>IHňD"B�-ִ/{o#z{w vU<_??nC=488^%>?{jd]j LI#Tlvccj8CWUz/(/Azwرk׮aHFH0eYHhZP(a7 htāez56[XlaaСC@ g///~Wj@ fVTV5KR@@ HۀXbR)ϒM8nc218 o[3ʦ?D8p_Bx8iZ:w@ `86| =R?Ɛd5c2d2YGOXLT7;EL&[n)S"_9 cuiΧF|>sϹ\@ Ѝ6dKVް.~UWMNNtq+R*>~ 9<<|׿uZ][[{Y,obݻncX&H~nsu-l۶mn淾wy'ĉO>}{lx{,[o}O8![obmoY,--?eXwȓO>Y*8p/;c׮]rKg>sw\qduDA  ljaCCCKKKj|u<pfɫ01H>RZ-TGЩa;rYI'vDBW55r}sf20 Yfr) 1efVU&p8̰ݩTp4uމ[X]]%bA<npʁ|9bD@6tlG&q\D Sl6Fc$g4aQ} ]ne m7 ա!Ai* +b800NĭZ-/p }H[jZv/r^A`}}}}}ol6O;v񥥥h4o(|;{^{<?BW:99ַ}{\B)駟>tP6u8v[ng?ź[^|nk馛n7y<_ӧO}]wW_|_O?/}?R@Eq=\qKKK_f{饗�ؽ馛࣏>/+׾$t2 bx|ppkZ8fVUV/,,t\N(XH4E$y$ԕŢP(ؘˠR׻q1~&j2\.J%l^<) W*e]GFFfggSTPOT*rFFF@K](J&& U/Gp fsffF;6Cz*A @`ZKݾC/ PgI@rEfsPؠKj;|>hpI<p^rZbUT<̈́P,V{kjR{<J@:Ml {y}uy^Bdngy۷o 'B4H$\ZZv4ذZnlݾ}?y^DrDtr9d2i(JCVc~llj\o?re]OϧT*l6XV.~RSՁ@�^R}{߳ltu18؎;`ۅBʊP(h^Q*jz}}}nnnR*,Z<CVf|>ɓBW_M333/3<K/=SKӤ-O رcǎfybbB*z^c u:26H-V*pRpI8}l6F177D&''z}^7 duuudd"YfWWW;F>7L!f>l(6N[4oݺX,V*6M$V2\) ]4QTt4SV;bv63tTU̕# <y$9e2KKK333n fSv`ivq$،δ@.hn:),s;FtV'nzl.'}|~Vrxf6-7e~)2˘ GZ!?Ϡ 񶷽l9nf@�޳q;vO~¢Iuۙ{)Q'x6-8^#GEQ"v=ɘf(*JRb )( iuu~ZR6@ `ZK_~ehZMK.Db1H(c٥R GD+}-VD"SZ M|>f),=zTр6.h4Rjp8 7T*C-Ng$],ܹsaa* n;C.C@$z ɫB]_b,,,tc'_RB!~CehOQfH6E*# -$wFz:}NN_;8M{G vHӹXñ(FdETbifxr>gG?ڳgϫW_}Wu:ZԩS_ׁ2]r\"y<^8Z"hppp~~U}Z *F ^k.ɌFZaX,ZL&ZB\~WV'H,�E)׌xY,cJR] w�V=ᘟrjU$x<nZS4|I8{`2ءC%4lOBś jJIuF2F"tehUzzvxp83%çzp(0{)*I 74Lx)" h{]':ݞ*B`ctKH 9I$;qP(E"ZBnj 8Z-ZI_|7E]zppvccc套^n~ ۇh<}O<F7UGO5_~ѡ!y{r/^[[{'VWWwڥT*ixx|*.kbbfr9V Ah#p88BzRPq2ngJ"`pHbhj4bx}}9|ǎZ/) s`0R)T %غ|>_T",w>v (cd2pt8@.#XDrymm-ڵkmm -|>_VBBr9NZH$ :5:XV{9O1H$ȐJ`IR Nsee7<<<33rzM09b) z-кS*\N|~z7r[c yF2^YT@ @Wh JzVpXJʦh*I׷J*ˌduAVy<^TjxVe˖k^Y;qℐ/WM/haT2o~QլfsϞ=HUٳfT;# -߾}�hRbK.kE( ^tE_җלn_^*v޽m۶rRۇٞKM&][[ 6K_Fظ袋v܉jozӛЪ955u%TU@w뮻&,Js=plzD"߾s`0 5͝wx-[.2$`Nzh4D?C^fl6l6>v DjVhZ2 JH ۬X,FQNGQi6|>?N xG! z tilN) K`Bi4znﰛ(d2N9H$Havu`jYV$T*U(G-Fcٶo߾k.0zK[dÙ gz T?-jXyo|Tdj\2L LIq0~T KHdٳPMAlß khhwE l:fvi2l7h{ۧ\T؈K+_.zi +?~W45Rzv]sqjX,{ޟIG.n^ 2N8qwl`0 922'N^H$ zsL&CԦhBa4j@Ղ26ܹS(BfMTnll`cJ% R P֠dJ w4mZvccC$σo0Yj 0RV7zR^%•b4uY,_~'i ?b13='2> vWX'c`(r|۶m|>? B!fNpvMIJ L&Cy;Za<H~y H>w¯[xDRtG]Wt*ME'+ow;2&~hqa"D?1ƞ={G7_pe2$BJz&bgY@Z=I�f[__y2oIbR @X^^ln\$5fe*|>/٬B�,Rd#ۣn +++NDpLF.\.+T*MRhz,[__gl%b0ESa8"�zW.rр2UR 8q. @ ~|e#,VRԁm~dCd43 ɍFD"t(|GQBO 5:NpcX*_%Ekw|l$ք83AU,%Zn1a<׀E<|%P<xP$ŠVa7D!h²b`0J%�ЍP(R)zAU^Tl d22L"hF>O$ǎ#;sccu6EGGR2M<: Z0vKKKwlllh@ j�w rYT.//uT*Xh4[MdR\5�� �IDAT=CyF&U*{6GL`Gf:`ĕJgbp,x<ڏDFq,`̢rRqpz1WvYI""Mtv5F?< Eǃ kˉ %Š\.',$ёr8و zta ԜXX,fXlii ͤPH$ h4BZZu:F1LC\*bH>JmCWPn/<\#lX\.z(ժ=~C==+<mLr( ^4 'V+r* fu:ZFnddd||h&U"d2 !\.G7*>E 7R, 3ryK<8D Oj L&>vwkC Nj y: ]CgƘpYUUl}%w<ox O/".whh 3>}bkD"} e.[l*ˑ'9*uԓt$@l6R덍G?~<NcylZ�4@r|pplv8`y<P( lucFTGv;VVVX,P"I3:(ahR@h|>"$OQlFt||zh4K/622vu:]^fy23x<D"Ç^X zu&C9aV^j0BxGҺ5vn8&&&\@yjQ I$MYy۱w^nwN%DdP(1KZg~@NN=x9`Ɉۨ== j;6XգzNZ BuLϙ"AzѯKTaׅ'NH$[ӧOca$ ZMQBfSբb;vlll^;L&Cꔤ r衡@ @X,jl6�a=2}C6MlقaHҡhfK^0.5 z9 L&822r)4R8:: MH$R($RmT*LrBr0jDN/J؆ޑp:j!700)<a13 ?2^o{H{7;Kq :F`6LO$:@ pItڝu{eoucܙ13 ?_TD"F Zw-<rNr;:LȆJB\ۤR)"xyZ"M %6_Lr쑑p8,C^߲e zeZ(VC$"UK@x?~4<d%�`/:d L,KxY\V% &87ǃ!vԩS@"1Djp8\,fƔJe26H$iD tEl64%ǣ( *@}3;qLΌ;~')v1^Y*X]|ȜA sNێc%,d2Dm;'�pC+_{CFӃ]tN/rF/T*h`VNc y<_P*ZT*j5JL&SH$FҒ@ zTj|| D"A-BgYHbЗ+6b*+\. dr\諭T*p8ez\.d2HPO\a TvyE 'T766ŢhDiZF0 D6:ݔ)"1!įdIR&9RJBOD܉Fs8!Ls\RDPVC@'*J7n 9ΖnʳGgkLK+w}|pt1:=yd2IH%9E1@ 8}R8^YY BbQ+ p8 Y5 Hx4L&#bсY[jFr0ruUӱx@'KD^d,W?@Hb,DWZ-ͦi\n2:N" jZդRi"pt0JBG<%{)<Q tE'L&CgGo6T*gJ�\.Mqh4H$T*@U*F2 $!@jDK1λZ&ObɳBg{|ra H~Onw,KdBv]qȑS,wϽ0#/L&JGuhjfY,R$JIg0x<fIG j,=b\ CVTa`4c(ZAݲlƧT*~RpJ>O,7`0bZ3SGT "WqZ_znz4�U*0%EtMyT݄-wrSAث\hT8;6TR­VkB;Wo& tӹPU*Ut3PT*np rhP`|IsS[|W^~뭷NNN~ӟ([ֱcǾkX,wߍrb=oɷ=<tK(LbډRZH7J%I^h#`sQT2 7<1\�;SX.JV +p:o@Yl* zeObUU% oZzv c kZ(Y]]eHү\3݊J%PT*;,+bmk` {`Vߣ4R*4o;f%|>_ձeӱ饞eFGg`"9rm7eEbQT>_%櫺:y\2ȩS{뮻nrrWַ{k _ÇzT*}dXw}_嗳X=zW�+YZF BZR`�n Dpdd2LǏ7 jX,>}4aL&)ZL:&I}VUY,h*HEP#~/EQ%- jncqmm>cW<iDp |>) > 6C=bfF</l6rjcb ԦFݮ[d2\.G?8=b!ݾVp2#րa*9<<gAe៥allԩSЙT)\P6M2?яj&''RAs%F |ѹB�^Vh4kkkhܑJ;w�DP?B=<6`R}nݚ�%X,:nqq!>BAW,c�dx$jZ_v{: !�= ⧧[ñ@gl6AcCl%L l6Hzjudd8qB"t:$md>Jҡ!/1GDQ0f^/Nf MzUd3̢ 2crCxyf|):3d:o{l6CbX7DVQGv5?uN,BfMmXtU#=_~eVw* ;O}S` "$,J7x'>O~`ArX|XswO8/% t.//>}]r%p8x<ߟJv(΁ R<yL&3LVq4Tj&&&Q2LFcvv^ONN:ujjj pA&cr94gbbbzzzvv\AXݺuk8yZ }p8'0Z < rbhr@Bp"/(bpd) `P$fot?ŒhX=gP=\_@^Hl{%&fZ-[0nfXjј2̹RNc@Q T@'f[Vo&賚H$l68*{躢l9c4[(嵻+9Q&lv4Q"x<.DizzCZx+ܶm!A3+gYL&fw^>d/l6m6>>>66m۶*Jr֭[f3zn =zlu͆zB#X,oG:tɓ R*.6}ǿH$IJ[kGGGy<\,T|^Tѣt>|8JU(@l6N'~j G}BP8(ǃ/_1h 1fA1=\)v0Z9.a~`hK=l6o߾]رauP&#rGsP#76q즎>00@/Ir\76O7JR#:MV|>\N�YC h  ID tH$B{ynFsѩm۶;vL u{(z<pZv N| ^^B{"Lr\9q\vMQ'''lق<hgff h:I3$քBV !^k2% !r`؃* ȳbLLL|)b$D"ٱc霚 jZ!ǃ}V *lbJR,mj8Z677pZBzm~ *HRVU(*MC~UP{N<,j5 Ž;⊫@^Xx=IR0@a7Ad\! T۷=sg5zLN#H('=K, 7, $lojdHzp8B\.Z8~;wԧ>o߾{,k׮]Fw]R) _/x;b=o8ARju\tj!A FrO4EuϧjǞ={/J%EQ(V1L4F',͆x"E@ tx NshhnGQ" \1 D nbpEFRDrXTA#70:@?Vkr8t:c/bñi<O[C,wk"4?!VuϞ=[n0 fyhhZ; EgSS~y89)Ŵ}\vblω :.L8j5,'H 7@Q=܃裏}[nݾ}O> XGټ/85é>NS(pXV 2 H}W(bXR)Pu+fh`uD&L Bclu0J@PEI VWWN'(lIy1ox8X,ktw\. l_ā7#GWTࢺ=V6m6 �d Ix</0obpg2>?22bRH,b!Hx<4t2,GڽVAgc@ (HQ#0X<O&ՂoBF2eBЏ}T;ٱ )H$BULu(6b8}Ak_(1 @$կdX_ Ew|S9_#H` Au+$ ~J{n2PHzQzS2` B`;Ůn6+++&) Bl\.G"`>}(x<Z| by. QpiZG" IGH$I7^H&h+q-~IL&-STˎ{ ה<I$qzd2b1z e6m6N2{FMTSͦd(jΝxRҿX駟ZP(|>_(, ;<֕r=;UЋur\&r$>s^5TTA{{{.w`xj`` ꪫȿУw]޽x�xB" IӱXlϞ=XfH-,B;N>BJ" zDh4NCG [Ţn_^^:n```ccClx<N?Iv�#+V f8o:FS0?:D mccC0" az0 G7U�tPf0/7a(D"ڣis.(.k6ֈHz)HJB#A�Oi ϱlZsoJfm6 �dbM&S&B$6Z-N#L7 axalxjU iRRۣhOeHz:{X w5|߿_t۱d$f aHYVJ`p8rP((JL෠<ٱCd2qLL&^/>Ap8* Jb"tJA٧hJ\.ACCC*N ryllLBN:8NǪ2̊L&Cl63(@ O&(8Zbe\-sŒ-YVI 7Lݝhth!H$o@Weon0BM65 QSu"J l}tۙLvK<MY@Ab}}gN[AY ٣X>&Qɤg1Pqȫws7hF.oll<x𩧞:qG*,qeHbfBCznǭVk6Q:`d 奥%rX` T,sDžzoZܶmT޽{jEP,S!h1Qi04Vl6i6pzFdvq_&M _ LP\)!ID+`mg K0]F)׍(TDOYv դȁX?Lv9?L. f\ٴGN=|^ 766;Vz4֙ F//mjjjJQЇB/E]cǎR)C;vlbbR<sG-V .t6777;;LV,--N^x!xSNd2F!�Z%,yE7X,F+++ 9vX** PTNT*0|d=e2lF3~kiiidd$X,600H$2\{0S1Sdl{˼"kbd0:fjjjjjQ ,333)`$0ff3qy<&'Xiۧ:-L!$U&Cprc9 x|ӃԜCɂ! *ݕ /v?q9/ŬA"�� �IDATx0Db ɄxDz(r1|ӴerAL-[ G?F# j$ABF.-[p8B,n*<xt-Wh/uΥR Y>onvR�ex<N](A>hhx<5 =622Bs\TfYP P*NS&Ǝ|aT*QT*\ѭ$="bL&ݻl6tAL *$aRvWQW!5R)�EG0E>qp8ToZ(l6f[XXMZ! V+Imuc1%` aؘzdp=n\B̘jehe1`dsP.#rBx|>},@<W)6b!n0yPyT*![H$JRio:QwJܝN%JU.ϔXsORTT 'U'NP* B*6 >憇 B8DRn\CT sT* ޽{kÉD"p{zH$(HVWWr9HFG8�Z2;; `B.k4GO. XB<|>/ <X7>>^(B!ח*T*]\\ (æH$RF5M&;CW,cHKg}?'N rgW;Z6LFhiX*VښL&z}y(g'+b1xGuTg_"INf;'rP(|>*qޛ5GMu@Hno NB=Ȁ.qLG{n,<^C L9˖ '\b1Oj^V["%eR6==}ȑj yu|' LP(d29Hd4ʸZJbu}}]$H$P(J\FE�ݦ9RI i:@ )Nbq{;- |"wGHL&Crfj>JNoV9'}xWSDoEG\.F AVT*Ʉc\.PvK!rj 1!Ok | I!7d O'H$4 CrvPK6-(JR>w <Fc<*–[YY hTծ|^J%Xhl6c8 !Xgcc5@ZE@MOOCtIfV [CQg!_f5L`W�`x,rvJL$n XZX,#i@ VSd&`&c7!AG~Q B!(R)ɔL&錨pb GJeR9pl0H ?bAO\.夀_'D@�-tFʝd:�n &i>pGpz=pi[>BH@_'~EbeYrLJ:cJ&zhY,j=G^ ;@Mm0`^ Xc�'INV. xrn:N$H)J9a \.yC4NѨT*6Sd``MD3L^ɤhP@rdZq Gד=IRT)@Q(29SLP5D6J*ϳ^Lx)B$7H$.zޞ}D"xpt\vR榷镓hi0 spEt\C?-vv79+ M ^\ݑl6IR. rX^(.46P(t8 @p8l6NJU*ZF3l"d2t‘U1]\AKQT*U.kZ\VTBϤ*dDbyyn7MA"6Cr D".Ry|>?88HCU/..:N|DbX6\b(�N nXjE |bcg%FPQTL Gp:=r&w.D",b=k!ㇸ\.hgg;d26#yV9)nZCBA=ݞOv}8l:k|;seK7?GY,??߿W o~󛽯߿?P$>b~_߿7 s߿{_omAi9ɤngPGx<~QnZaaɡGP3rXZP(d2pClR?:MXZ <I8䡠l6D"q NijVl r8r ML622R.766`pf�1DՀfT 9H5b>DD^RI(02W*<i/RDh &y2b=xj^#pts>åR`{|CNV�7LwN�Ѥnm&l6QZ:iHjmFczee "cubX<�AI\.Hz`0139rH2̑#Gtȑ#o{X,‘#Gw Jґ#Ga5 2=rxȑ#X7]w݋/x~|>_$_\.w}7>oXrQ#FLCX!)54Ԯ] A sHĉpiӿvuuudd/qFe @S�&X&ݯT� ǏEX b4$�{Lfjj &P(ξo|NST6@ 088 N$σ3T&+ ȞfAo,7jzуLuj1(jdd㎞8y$ hGDP82?J/ U0CvuBGj o}CXv/,,SNAuZ㐰 c$ȮQ-%6`__!jN'BQW6rfbE{8/JT,/c?z 7܀??V=uTZjW_}5yw+X}ɻj?n@-vzQDMU9wg=ybꪫwމ P&IRrdP% Je7`b˅pn7k2kkk'NCZE݀iffߟd (G/!a].9+Ǿ}&&&FFF k.ټw^BAmp"j:LF"^xX,3 0[YY)ǎjZdAz>Η`p8RfD"z("BR"HRE ܹSպ\ӑev̌B{:q&.2FFFAh7ZVh+)p(q@ BzzW&drD~J&ݬ`"j<#S144$gXryZ=uT 0I_iry>�l&vN$߼@)>y=>rX^Ֆ"DQ.`|�s=G^bݻ|ᇿ K/s_JrB'w1xE}ӟ?o{˖-Ǐ/~1F"),x^rdp02htnnӇd2zJ$!_(lv*rBSqiXWRtddD.{<t: 8Zx^z%KFP۷F@k׮tr9^aPeZ-ɄB^@cd2Du:]8r C"oSեR)J ¹9Wa;HMPD:1E]r7jBԩSduKlVueeh`@aBJm6Cw̝p q7kqB"08/;D"˵ .--FBp3x@VK,ӯA(⡣qy"G՜z}o<A? ݻw=wq֭[嫾/Ѓq~'ofR{饗?|w|;>Ɵj 0B&I$�aAk4x<. C7V+b DB$ՖNNb1劌((/1+A`!HրfpjZ91/29ׇlvXf(@>px<zV*^z)ڤSTRWnȤR)Ab(JX g'N y"';Z x^ͦP(".JK%!``ޝt7P_y啓'OR)4e3`<OTv4͌9V+`)�XTf3+e2T =Y:-=D>z(2Zb=l6y<^1Λ8X,fT|נAuY6wNp' AiF䴄X\nU+6_]T>c.o~ѣկ믿қfF7pݻ}Ydze˖_H馛n֟|ox≎= |>=-dP(  l[RZ5f3�tkh@-1Q�شÌؐhP%H(bW^yE { hf3wwرsNӉgIT (J`]&ޑl8'NH$`0h2o);AY{i ;ZwH/:t+|zC$ p8j5xH43Zfpp$umm B r9xbݬ근-_|-[1PXcԇR)ݔq8DP +v'bU*{aC*K[cpϦLrdL&=O; goH_b~#{I>xnj=/?ϻ|^/#bXЇv?]zC=t%\y,z. 7'> L?Ŏ?~!^u֝;wv|rȪk4X *Պ1L.,,X,.s3 8:ͶX,X:|>,51jhhh$qJBfZB@D"Ph4JR*`lJ$555{nkQҀںX,;w-tͦFp8&I @:ORI$jj2B0-f{j5Q*0CCC֥R b"2V\N|5L&°hzft^lajia:8((x<NGFt J3kkk^wjjc%iͻ)K(`EIj4l6;55%N>M?RE ;I B = HE! r{[o_/y{9o}/nG?{P(|D"Ag?쳏=׿/ t<ozӛ_|{O<[o9y<m۶ulǏuh]l6pB!$~lv"Er9x 2.cUUW@,\.bRI/ILT*U!-�Cz؂fs  ]z> Jul6^<\@^lPP[L&{�`mFJW64gݾ O:;æ{W"OF^BW[r^V|>B" 9rFˊbk*@rwr8;v( /--ql`0뎥8_@u::㾠 ?b,--MNN*JZMh'KZWWW N4L&J,H$Z- jz{�+fW^p8( iΝ<v\H$7 ;#+~P*311a2^xo>պw+T*=#ecM3`վ-^bcC!@91P IIL*p�8홱gz{M﻾OɽZKԺ:=<#<rwމ5>+_}=0 ̢b9rG>B-{p8\,ov gٞyHv"MQ*Bnia=Y,l6 X"Z- ,$ b-<-BB�V [B=C$z\f:V2DtV BVu( i+J&X<)|P݆J$z]$tR$J =0jvx}|X%+z=uQ onn|pd N$ L8n{iiT*],!fOD}e2z}(X,H$Hd2ZFÊqcdqJA ~M;;;v}C( ]4899 \4a &|z& htKŜ lz+-9;v 'ҏx<މ'H8-j$>h4\mzejj<ϯhZR43rl.R”#|!I.f633s0J@mnnСCiUU`4h"JeK~r(b H�ς5:NNP)z],' .`ee@x<D`4ŎKR^"x^ADw~L&[[[|[[[*d2K,#!d$YVC':Jr~~] Aurrv8̬\.f1ٶs5 y$hAPJ:ΉI8aiQRF2̓@e(J;<Kpc?яt+++gJg7J$}@Ι- pĊgsZ^YfW^mbbܠ,ɠBT29]^^F$B.rAxxX { E,ǃ̅ :4;;)߯ GoɀҮRjD"l6 4 Y~ss?s 0fyssZP(TZ"Zm4U+ íVkjj Jw:z(JЖU(` jh+d&) Rx<>55AKKK�˅WB$zyyp7Exn6GGG@JI$،H ©nWU`ʃ dYD0x/vgq&i5= :1<<H$H(Fwb&uS3XYY) k*1{LkEBXQ0Kz###\T5I29ZFf[* vz�� �IDATAD$Awnn ^>kn&nlN^3t%T*E�]Cv A96 _L}XLR]7k_'N}>dM�iKzd2 Ł@,ZH@DG�8\.?DZQ!trrSbltF`+f@ dRZF -H VUјJP6(O>(2BrYѠnk u:j!;;;J%b�8U.!HJShd`0t::,k7=F`R)֖`[__'K{+v 7Z92 !K`}j 'vL2>t:BaD[)u~dD.rtoxlrl>$]` x?uއF'!$'s x~ihM|P(2cmh*4@ jryZ4fbhhHR5MDP(m\0DT*yR CoEhfg<Gg0tݑH… Nx<j4:N4uϟ$RI%HJJ 5htssbbwsd2<:9ыߕdt:1]ic>F4 @^"jZ zh`0H?PDϵmX9D1Nû?jbʕ+]yx%d9Y >6]'$n熹h+k_<3tkcccJ.+_KjiiٳsssϟGS,CYVw:d]AvzAl (]Bib1*J+++@zV25\T#0h4rׄ BBB@wO^Gdrjj* ,-D\P6bl6jju4d2(ֶ`0ȪѮFST;dt3ŢP(3 e5Gx6i'hG מ W?BBL&�%\0 mIO0 J%4⳾fb59HSPlmmLQjuUTYeeOy7Rbi>/>_պ&`v{> ~zFQ4I{Q.60* 8]B"(YUU4@i}'vƯ[[[Ͽ0]\.'jR:<SXd> ox&^?JT* ](XDh4 T*K, ###`0XVAWV6؀/LbXәLx<(0 4j |>j^ :j{{~*Ki JS(hAM*B֞4EY2%jȨL&DtY^Vw}qcq8BM =,[APT*VWkhHa J'V+t^M`{J%Q F&c_NK+DmJإ& y\@wȭ4A!qvCEZ>+tVƯhZD oP.2S4 tv;ehno6h+4Ñf?ON'BC`XV+|H(O fn;ϗJTnWVV%jZf, z@0L\+jhy�t:TnZDaL&x/b"Bګ CXa)JMc HhdJ8bMɑ.tMH$)b^a<1yNg{{{bb-V2a]J<phbHy EML1ot\�~+t4NNN0 `b1ȪOuP/s 1HXC&z.^rV&r&e:J\g)H EynCHFbZ& .]dd3XRPuLeYٌhl6\.m}> FbhB!JU*^L&AiT*X,D"JY>:taaЍD$ l4HcXj�BGk=ItM}x\qoF@m`#"O8(pk$,J-ZVc}>{W 1@[΂kcΉȟD"5>>xl6X,f[,YTCfD*\.8==|7aqʐ lPu#?i@Lop8�nQ 68ALNhs\'Or;lP1CP2H$ DR)Nbᘞ>vX @k1IJt",Br:Ѵ^X\^^F0 !싣+p-O�\.VzaC"ɐ-:&lv@R~gg'ϣېey|>]=Zf.|>6_/$/yt"%Ly<je:>vzW{oRVzR.8=hF 2Lpbx}}[JP>ܤsq. hJL[XXRb1>?22 fd|||ii 4iV Yr5@ -r -4"tOj4SNx_L&|tH$A b gΜ!ΉlCـ{S(^ʕ+/’.\ 'NХ% \.TIFJRv}ɳ]wlkkkffX,b;%Znw\&Ě')@NNz=L&;T*T*XqZ" b'V/F�\M&I_pOu,U=poDN0JoUf9==M48jP($av2ܷhh}nw*/+ tzQ<NCKhXV$^D?lJ 8'B(xNnq;* D#ɡM?H24˩l=Q]Ӓr; W|;'`Zn*#Nezz}lJZHØv:H$aN311\:&''^/ύFrs7WmۨUMٌh\.# /q*G ~aqcc'H[oV1`KRBܹsV ҋ'Nta|f�< ]JA@>m`*X,dkI?Gnz?[ĉ9r.- FbܜN'=V;??Oi!o~{{%9'DN~re$. q*+rnCTNNNjONȊt:ݽ}4i!cXPdF bZbq$FL,Cr,c [8 zkkkeh fqXssss WrdzaXwqAy#dVBx<XFV2ˍFcrr2 "9B!X2:{Vk:yٳg;N:F-`0D"܆T*t:;;;/D(t:(Cy `sT*z!&hmSK,ognnUwjp8Jgmz@>,+s0ūW"~ESƮ&z{Qvʕ+8਄ʊm <vQ &K*r`ဎvy vO" |.oOu@5'tbAߏD"A5\&]. bp rl6L4mo'|^׿]'?|ַn?bu]G~wzz//{8~8tƞWZV ?$ jJ2 X,crP($Jh\ؠMH$j0W^\.x+rrb‚hLJ?9@l6.^BŒN'FNCc{{ΕJٳ'N+W\fM%?333˗.]ZYYY__X,J|xxxddduuTtRfccCPY\\$T'P(|>@#WWW*Wܹs-HHw˾"lh%zȑhqqٳtDN^s s{|>D9gh47\V퍍bmjzm ݧE.a<πfa@ |IKz4l`Wd2|uA&E$Uok5{]z'~~'8vL&o|mo{O<w㳟`K_c=+|7'{l:FPBex<Jj5 vM&lIպ\.511aZ@<Zb@`}}]ӵZ5dJeـ8fYR966KY,tF(F(zټ[;DZZ-@ x<^j p!?=/}*H3 0Rҡwcii YJTY$2 DH$jaVX rFr-qSCkpP"<BH$]C͏n󋋋}TA|-pswf ^,T>I\OGl8eL]* =W⬔p*bk77lJ&]�ZL!@"f>?ӯ'?yG'v0hEѼl&(LqnmmA�=f$OTD"- 6b`xX%CB xl6 :yTL&3FqxxD2LR*hu:-)* \L&?шh a@ 0ƹs4&pvfPDP@r`0d2DFUQT2L`{eJv]PUOnv-y "ܟ5"O[[[V.J+z8>۟!JV"?5lXDžB X`p8hLv{,$' =dj{V}G?[]{:ǽxFѵ} MHW'''�tMRryll kX J%x 8 ڀZt:Ri"jR ]HB0VTz]RT*khlZZ6˭UUdP@7 jnC$\hZzd2b1/?s΅L&;VVVp$W(P }I]Y%;.$NbUFƄz U^o,}p86Z}\3%?E A>!ȲV6d& P%T*!S !%)FEI}}ߌD9}svӬzӯկ>}t6Ӱt04 @pCE:|`0HV2Qҡ*J<`X,hT*N(R{bw:'O|k^Wo<y̌D"Cc/@kkkfS*2 /t:ajZ-D'$ky\# d2l] 8hˑ:]& \.-a@W;bd^ZM؀Kxt@ ZPVNJ' ]/Ec{##D"%%&'ׇ~jM," X O*BjjY`(dBH$/Hw}~կƟ{sG>ӟ4y`o+B#EˬN'NL&f4e2tDj8**СNVVKPPCvVB�S�"}dzzd2E"dT*v@s%F?E>o6@Ø"Lv{!P, <3�Dy<F cT>ZzHY«gR)Hzot:4t˸x<ߋrUE+ziNUb>Rp2*Fc*:NVV*k'F>*iH$^4!* }{6}:ug1>ozz}nnB3>rxz}zNRNsll8/(oxt A@z"#f#(xwbg{{ŋ]wѣGST,CF4=zhӹ|r �Z!Ϣri4D" Nno٬F!_^x!FiCol6.,jS#ED-7s)~2T(HӴ(rL9(u:�/4ZBja}t98 /R*̉W@Ej+1A&\׻\H$2HV +!r)z`�N$wRy^ǀښfrH|JT#Nqy}R|5SZ!l" ��}[SO={vgg#8b?*htrr�H)B%)7FKwӁvH$t0 `h6bP(pm6$RP)lm;#ˡjb(9JBa0d2>OP@ bkkkhhH"@A$\9rD(;v `&4CTȜc+Ka||Ç;f24�Vi'VvD顡!:&^D��fIyrR)J\.'f <ц@մk61ara`{x<}$p8fFzl6;M:Fn^*\s P#]SCR42gE"Q٬Vwuhx<dZ*n`y Xb :z%{/b|_w_\QZXX( H$SSSj^@^FDǽ^H$ZfYӅBHONN&bŋjE!摑\xŭÇKjzҥFO|1^wueWըu:d2dh s'J~#G\pavvB*R)TJNWmZx< G0|sp<]*"gg Д<GPd_z% !h׎$ث@`ZR{ #a^AXh*j>@8O*v }8'b\B;p1$O^/B,>|xvv�vN VRxt cǎ|>S �� �IDATiXZ-('Nĥ5m7yKD"N4t:+ | #BpggGP:RPh4 pud^Et:Z skkkvb-H"ǻCd^__xÇÇut&`kA&"כ:~нt: (KeZ /@Rz_m{{[VE aJ%H(Ξ=KSu&mm<BW\<&4_ۅ!HVbQFX,ҝ! %IR1 Z nӞBЫ܀|đ/Wu2lRdfWU,nH y.f~k:刁P&�\`ARkBTnmmIRBApA numWp5r:T*a}}ի,Nwvv1bkڃ**H:Lpo/}p 3 F :Jz|fN�ve2Bh4 FF>@.--uDkgrp'B �W45fy'y..#H[ntPUPO *ZmW$3̀}bD"ѧ)  |$I@�V,k\gW]`eB0^$c?-qu;wqN4C=#`comllG"P(tҥsg?L,ts<=O*byWRz0~h=oj5M JQA4^!+lT*ᱪժnGkcd*H$ Wh4jh�#㙜N&. ٿ|>lۇt:P&AJ=zTTL e&yr T!t:ZɉYSd6ԔNtZV"p'_}:ƪF *{c/[y"[V^O@ryeekЇϔ@h2 SCyWf^ǠS6mH$bD"7:ԍ z):C1N[Vհko@k zb:b}H 43ј,Yv]рeZ|3$FGG r%͂&HtzGRoP(DMHŋW^ \ E緶k*X,M"!8eX8\.g0`ـ � xbrwx}+ //gB,�fX}F*@I4e<Ǣɪ8L&bwdV A|_IJd:O,0,9>}AnH$O;w. -H�L>}_Vx#TjY*D<@ d{bX*utj%nH$ьPT, AnlU"/ruZ=??xh}}VibH$677p$Y[[ -T*|^"(Jf0=*|>WmZt:^0ХgL$r4#WH$:D}tVn[mwZ$bFzzU8m0j ߠ3kpp GAF{V*J PWWGVўAzЀs䄜8,k@5P&Thz ^fRڑ�`"f\VfX,ȰZ-:1`4qMߏ6Z]$]zV g=dOh4fTkBddR*8< W(ZR| Dh XLVCZJ$d2iZu:]6%`#}ZCed2)is>G3mբ'�)`1v]"Bh9),Ma4Hg+v <x@ZrL[|rNb�> |>OVrAO=E ^b6ɐ2Q/%A7HHZe]Rx<|>T*4 h.8366hTRz0tT2de\[T*?q )WFFFb1l6^ZJx&4 vZ"'Lz<rبHǏ{<T*e2ZX>_]]FBlBȑ#BnkZ@jJ%kZZGӁ \G\dz]Pm/dԗRhN'j4+z<___GfV% шd_˝M�i^__/JONx!:r\i0wGCf0ZG*u)}U5a5*3L\oBh�=*,9FVjRu ηZ*!� 2 n76[#�xD":rn{je׿կl; ot]f�{A}o@Q瓥myvM/64"[[[j̮T*Vt hCŋH`rzT9"HjڥK, 8/_D"gXj@ X\\ .'x<]wefУ@$cFT*;w8\.28 Z˃') &8`lbVR3%D[biZx7p3<CT(^_\\o# y<G_e rVE>tu]RX,keeB ( <a�W.{qbb'Ҋb"6h4677Y3vlryxW/WAvݞgQu`0NK$5xݐל7fK׽u/z!~N;/O|O}S~˗'|v?O"0zNV?VQ0bEd;_Qj%pBP|i4͆Hpfԍd2׍F3Ϭ!loo?\.K$[op8|!p믿^lnnlǏT;0ɾoFM^nR(]w݉'fff@%Hbؙ3gD"JA2L  wVF.n̏띚Jsssd2) ' ,x< m"�nzZMVWWF IҌ|E tR �h?j>y&-NXb4+"]D###{=ꔡ###AZ]"' A T*W.ptUmACmW5B%<m{!~K_FNbD"qu3gΨꙙԔV}gpX0LcccsѣGQr;s l)D,s4| [ߏ6744GJ%(JHRǫ*خN3ah2TFA&)NlH$VVVnDbddD&)j  x@nnF`@$t@t{9\sssNSVollF3:: iB5xwl6[<ZNj5�1Ϯts] t-IʺR*'a4d2{22l`T*o�dTeaäA/@ &k4}.>ӏI STB{$i677-\Thxz,,,BӹWAi}} ^IIhR):+$B^o4XHmW_|??{<_?|;r뮻??fAX]yfG 㹃] j5zpKasssnnSDY|>nffٳdL&mnn|>ЂA?pff& ?.B@ è8’hl6Çk4v]0V5J|>gmm \6\dT*uNJrAS"~p8Ο?R%JajZ]&lF,$ȄT*PfY K" acX ZMӀ~ObXT*aT*UR7<<+V`&V2$ZmP-u �wc%,XBzz}Xj_p=]<sI�G9'*~pB-O!Huj&+C+5WO|,w񶷷މ~J-oyK,?;; /t:?pV馛>e/__DG}#D,馛GT*{ T(fP( HDX,Djn}gr,b1FQrD3cǎy^";Z $HjZBj=BĩSv{ @*x+*،l]XX50 xmr+ ˅&~PJ˅<DPyzTdrL0rߔJd;+OR! TR%Aux`d\1ļ ouzJyzX# q=VU$' b0Jh5,2#h"'PT�v="x*:X]},+5潆̒}}H&}{߻ێ9B=}}k/{˞~>}t"7333wys֕}>ߐST`pF{bb!ș MLLx-„fXz%p8Zx L&٬^d(x<bs)'N@ ;Z ZPL&Qn?X,V*H$[V!P(Ď(Jr^WU>v"9tFcP0LV*FH Z<n4T Gf =|D"fPba$3�ҝatt�5a}lR?rm(W.Hd4 '\x5A g_/gI e208:/>ςV ._j}Y@`ZK=9A:4>}Vaf5 P =~`2L&vd'xFō7 7p{ӛӇzhWx[V裏]ϨIRJХM% *T{STjR�# DB"LMM!@@vaan+ Ht!PUL&#cdF*0@n'Ia"J 6'JU*|K`/_&Jrggh4L&Px%ۭVU*,rB#Cbcaa`<9SD"f;/O8~zdΩ//BHR|-'.J$A0(A^?@ šVa?yegQY�Az0B[iOZ}p*Y~$A ׏C%=\áP(nH$r剉 _|7 oy[yp8bǸx^/_FNV J\^G&i4h4R&&&j=~4J E^_[[2mBQT&&& a6RՍFc||9l6art: jla  \.nT* Lٳ\a\.B�S0DcNCT:.9swb_b|l6yHtwLNNrk̈ɉSk(j022&\/}IHRÂN{ v4*;. mwTbJ%"d2d2\X,#+,뮣\.^Aݷ?Hޞh7J'v{ LC6b!(=>}/y>yɓ'!ju~x뿮#GT*Ǐt:kkk J|ʉ)N(UЮBO]pazzVa45Sv|(nzr9JP`w@ep0<smݦP(PϟKիW"aXWVV=  ZZm4F' A$ܕ+W�x"ԑC^]]ˤaPH$:ɆMtgmۡ "񀕣Whz=h-a2VWWqz+3g{$Gt:B~/b ?FjZF>ҽ?˕�V;tЕ+W =L kqPY6j򸠢s w7{;/|a@u%^oY>TI,$BͰ{{=x3Lu]y  � u4(/^{'d�jw82q{J˗/_p!&%eכagI^xt˗/#n}>_, W\Ck6xr9NZ-p7fD"QP@ILkj*Hda(BH^euU.cmh0�ef|| t+++x XZZX,v}mm \PLLLH$|tQq ؑL&=p8 pz;Rf33 R%w(Tq2&ֶfG)J8v-":8kmpͣku5|@ aMuzNH 1t @.K X(M2#^a144!}> \֓˿>s5O'ξ$t`@YaR5R N|)PShStw} S՚Bw^Fo:}4KX3phw C66P844I@ �zBer8h6Ǐ/JHs]rE$zhҥK_\.F�JX ɦ!k`oղZ ANp*v{qqq{{{bb[oUPxl6p8�rD 9O 1Ej:a@%bUp*. "R䴄H$GB!ߏ~E񀫛N[@h4\dX!@!(JպE=-K6- p,,JާarmooCrxJX^I.# 4mz4r!]g^;,//w p%^YQVM  fVBe2YW~ Kw8{흿;dd2~|;wx_ڐ**ɀ6/t,.NAW.ɓ'fE BfBV [0:8˓niRn3N`Abrr\JU(ju"XXX@[rh VEyn�� �IDAT5D"!PxK$p h`0"bpJR*VK$(˃ I Ba %r;"=L 2k`CJ"Y3!ٕb\.'& Bt8 Jvi VVAI= 7~GXmZmmm $y`. #4`H႓a-P(pStxvNX:$ejϭlַu-~B<ӏ{u:mHάnF# \.!�jBpر˗/r@ -m6weAIHu:Xyr,@�,#hȡUX(�:'F J%FaA?!TJB!t܉sRX4HlFQ.lszK( rH$R]}b9'^cmBF23W2Rd{bQ.777)  FJE὚ȚD@כ[}bab\]]0@lj:KhMGI>vB\v777aO�9^cϗH$q΁nfb ã:bqrDVٰZPx\.a Çn0L&t4M f* M`L ŶuIF#/+ZZ3H#S@CG6VGԅ:T.]#X,0NJ$l6o8>+IzrvX,n&h4hMX,p3T JAhVMmRh~, [V777q?tI!>B766 Zf}7$)$f"8L&YP*| $s" فCƞԍUt Sӡ^G?>7Atԃk~0~5ѮOsݿ2zV+% @cۯ:F yUMpuN}H$zNr8M3 J$QcoccC*NNN@.,. šaP0LٴZ`Q""�K? ^×$ Vrk!v7 @ �o\ PVEuեc)6ˈ|T\.(rKf ťGKkT*D࿮7}j=&d\XKC[&:g###-6T*$r0"A[>/hFjȼdpRPR"zhk"G 0 jl0^/^W*�6!jv]өjhJjAD~ wx|kkVR)ȡ!> d2i00HѳP~o6kkk3K J&h4ŖQBj6eA8`/?k4!XRC)@=T^+^npF<,#X&iY$FFF~A* U-Nvl[wCi=trZBrF_ʹ +8tqttiH4@ T**"2,LZ'|3LRàfzIT/"Jv-|J4TՊŢT*E.ZT* ܋/V*oH WWWKp&!tJ})@j4X28I${1µDMrJ^Av`Vayi /V{Eonn }&y�P^#FH$W^:&!>�rZM׋D"r}>?11hR󽜮})6ht8Z2NO,W:a 9<Z,WJBTT:<<<.]1YF> y<{~^l68~}8yd+ölǫV<l6TJȈ۝N'd2z(dgϞX,vjY,5˅BK\őHtox<`Ȏ X�£V-ZֹsvtNaNYVv7x#!f3{ƙq׫T*CH$0vTZ f逨U vݘSucI\.Vbhh^T5d8ã@ 2M�{*7jV1 JoG",H $`d&U*EQb@k1EB^k4_J g d}O:uJv J)a 7}-zȅP(O* V@ $O~?:Uk=A<1i}}\._r\ǎ;~@ 馩)@6tF Veٞ{9SO=sT>D"H5 "4 J�]Oj~xaT*lZfw:AZ-΢R\pA*:tP(A6<<T*oYvvvn7?ԩSrlr9N^4={&ɓviGFFX]$ab>Q F2W$Z%Vf׸<;;`|nwLWZ߸K1}]'O욌*@c]tGV~~~g?Y"lwqxcV+B JQVVf3xcjۃA~cbxlllg }@i=h Y/tH*ҧ>팽1s6y�,Ǯ_{WWW*{=;,//kZn7 ߘL&zrɌ@/a”tR4fS?A@]PL&?zr 7܀G[�TAI1]ЋVV\.C6h@ tbT�FJVXlss6իccckW^!^b,..e!ut:zI$=ٳgI(bb;wj\xVǰt.{7%!\.7ޥV8"qPʅ_>,򙙙t:Fu:](?IXVTMRF Ns`0t:JZѢP(n 7rGNbJ\I:E0=>i圸zT*qP.=#'oD"HY >)Wt<r^!r-=/~ 7p̙y9{k_7 &i:9fsXD-`0,,,d2NW(X(Tw *l6P56ҥKj {p0f\.[Vl6[\m.QR1H (n#"5z^*t2h!`Ggf6}j HL&H$BgX.]t� fk6rZ:bO(eH]&J- hX<bT*a<::zEVNar8p8`jQEJ́Z>VD" njt(IWhT*ܭFi4\]Sv@a*�1E`/, :QϗfP(tݐD&틋"]}UG Q"QDƮw΍@0E:'l|Z�oUHckZ8'`_"m+WT80x+XGw\r% EQTwG?j&鮻Z\\<7޸7|׼5v?ɟ?~qSOnRH$ӟtjj W9$Bx/(NJp8HqB `˼^e8*Ov[.kZl?4D�[TE H|UP@W.0 o)CAXvj5әf!h4ZmZw� FpcF1BD\. x< ٳgy<7x/v |G4nR)8 ˅&cXg:1_rf!L NS*,١E xTq yI7w!1  ==s/tL0VRH&"hggl6u2lV(L&b aezh_IӃTA9/DPT,8hrXdZ(JBRuX,x'VWW?LMMy</zwt9=>Cyk:|&>nҟ韞>}:N_}ggyzK#i4;Sv8@B8$1O p!0>pL' ` em/kfF6*㊟^;94ҫWs뾮?n6J%}+,J333SNtQ$H`0FSB�֖n|B0NKRJ?J`�/�Ȩ<HeYt:\Tb>hD"!8:7ry2D@1@ 6D @JbT*{k{:8ԓK P 2 � Rtxkoz7ZnTo񆆆677-"X,zh4Fn41`0lv(ˆ6rt:]2&Ӈ Kv;2) k67@�Zk!1r9Uפ5O. @xL}o^E&zD|?p8wyCУ>J[nEV˿K{}Cv}WVVn;SZ~/c^:oPU*PHDCCCR FM( 0ބjJIk( ]yb<\.PmD"x*Z__'d`0Hp8 @(B[JRdZ}�{ݎD"dnlT*HŨ&�s]o5`bf7N?ӎE!{ѠT*[6FL j,KVSwQzJrhh4c&jpld|>fl6^edd@$6pLNN*f{u1F}0Tk AnTJ~AHcdj;ryqUϱbI$]ŀ$hOw c"].zZrz^u]wt]To믿{:GŢllHA n'ҷ&GAvaFt:- <JL2lmm YRV1r00XcRH<>AbBAr \.Z@t:Q0Pxh4Z-^p677n7 OrB CCBn6777xFnCfڡRǪniU L r 5"rVH,C|V Bo OV!DɁm4:ddPaL&s\ccc LFב{^ݾh=';Ne2>H荒`aR ܜR~Nm Lw\.D%�D`؞ܩoz/~/~[o߿ԧ>% nEDuN_Z^^& c3q2 Z-T*j|>K@hux>?;;k4Y,ba[[[´) 8Zl5͢p|>X y0>>h&&&bS bV,\@ vZٳg E0e?aw)zpqj-bZ d>4H3  .�hDL&uʰsFYQ]~ZP1ZinvS=v˵90hD4-2 gΜDHnФx<G%<sWWW&\ȴl!ѐ% hWû pdz`0<}*{-g;kRT+++uϱ1@QOiyɧ~0 j`{yÇҵ꿢(h1ICv]j.3==}7y]QQsd2d\.Xi4y )h5`0&&&LV n8ffRf)ʹ9`2�::D}rY2L|^ckfbb`OX<z($<^x`0Xՠ%fffl6[$x<3Xym`h4BdhC5 ? H$\. H^M<)ı�tGx*8C  >w%]BilXu?H4<<L&ӧOcHAlv c79*Jccc|>h:c~ǵii#qG-͜F[Tt:M }d�ctqVf2^�k gH$@ l6L#^+J�` Ͱ~wsr2S`rûiZX4>o0$g?Jr7#}G_xh^tHdlQ+S3{XS \%Ωg ֡h쥥%8gZf3~ .\~ΝT*6ǎC0�U*Pdbq>3:ZYYQT>k:G)c.t{<HaUDv GJPH͹\ӧIELfzz*"D("X<811%"^>hD":iv^( 6EH$LT*2DkBj4 b3U1,i4<zbFOLL,//#ַX,zh~@=#H8ʊYXXjT1Ơ+.FFF666FFFhСC{4.tb]˴C %ZŖLAi1LPd2o/Tz;+u۳<pw>7sїL3<siQmO";v0 [^^nxH:T@.ꫯ\.333s!_jb@H3p8\-K,k$ID&jx}N'?ye]gNNB(5;<>44p*Tt$aP"s:&jwWձByGGG(8W2&ZTa=Y;ځN3 @,[,^҂9l6|>% Ʃjx%Juᥥ%Nwa R)`R3gv!BU̴A O # ڥ{w_2z>@Zv[Д}FBx뷿H]@@RMMMyU.pl p'٢L(l|>P2L^*.JBȐx<zE|x<6??/4fF#(- R+ٳg^X,J(!z޶Z$d2K$&9[IҀUD4 k7/lVV>;-rSH�M} l3`0tL _ɩ�� �IDATh47e^ "&R$Illl^zA l(@+rT@@%9dX(t<z I'oϞSר9#g.�0 \.]9^()W\qEU|v_t$J$>O$-͒k1C0`jZŅdGA3=JR8NL σ GD"lll`V ={K.aX@/͢#h4jH$FT >gDDQ1Ba<GSjr(Xї(qqq:`pqqqaa;O�Nb�t(ϧdǎ{^XtbH$<|-:p]H$yChOI$Rg0ZX')Bꫯ B4B!|\.biQFC )ry*w9% t(J_]2'-N\ u EFjfGiiOJ{@IKΐ;xyUWx.\j:JΊDL&c2PS*j) 2`AN2QHɠĔkLӅBAv@4q(Ǐ:tg$XC �LhsssXLV7͡v85L&H$x<lp4mllmg02 ^z JUD", (/ <x"z˅1iZ{9G;#L)QAU4ٮ1F r9 MctTȎ*|` ftE*1HLce J5dHz)x^IrNd;~aAD߾`ߺVvtBOvuq~zP?f$#͵ZÙL3bL&y2  \<o4ekk 0!̔Jx\նmg2Za PXY,H$ZZZr\D aAm q�|H$CCC4չ\.*  PJ$wuuY#bG0#`.5?~4wDddZVBAjEUZz=D"fKRv\Vo& d+jnRD鵳XngZ\RT@^zRFD6M" jx`^O:b16vM0lzLh T]IqoV>/(ZСCИ2ij?KRuV[כm5}d3(%UUaRѨVbXG䷭V+u2lbbB$Oh4& d2t:D"8C3D"++b80硤t:j[$x<LFQlayy!lN#aiM.;5"Nߏ T$ӔfaD"2<ZrAz BD"p8HP(H1 phⰃ,6ݫ,b,pkkSED!&S)˩jaL:fb"XT*t!dYZ.Vnu>^.-KJAb+EK:8SW*m`La\@D7x<Dbtt`:'n6T:ULB 09{p83 s@&) ` x<VU ,,,m0ŦrJxz]RtyZh4666P[]]h4<h4;wjd2v;M HEp:p Λ&tY4Y۝H$B!n6Qr9p` bA܁�f2<wK/rPR!>SOA8k0߫V H =y#@-o}0H^Z�U< /CmjuURT2X,"Dwddj I1::JEL&P^ iBrvCN'8=J#x<mr>�-+"6ZbyzP(&F3`ԩShZM @Z\.OLL ?2z'''JJVP(&jyyyqqdFCIQ|WOw&xs:=бe2Ut:x X*z=Ν;5Dp2]a`0r<55u `h48qBT\.!766lNCWxرw|>ddd8MP&~iiissON/bM&^lC:i;fN'A'drhǘtxk=2 H4dV |4Z~Nׁj*jummmOKKKOQ#8H_`0FFF|>_vZ(&uJSaXdVv;\.~;Dly<^V{饗.V$g,kll(aXǏzlvfO> W^ymt(QTxvK.a0jX, R+8`0h6I<66& /peD"9u"ѣ3`0jh�pj�F@><oϗJJ`0.UUjL=;fpT*A;p8Hv֠4ON.z0f+DlllLDEzH伓-FBȑ#t#"O<YiۑWBavvVVlݞNW%0 j<h-&qosss\.lT+&Po`l rsb0d%]e¬ '>-6 ezj+ $& V.uW AkV cN^HeZ;!z^0ɡXrb6 >`#\.r]zٳn5j: ]( / b.s8(@6H$bXfykkhu:an\ad2<=R֖F r zB!gh-DbX.첱1 Ng$ ̖Jehh\�X,DRV`IWVV;/LX, !QKwteXU\Y,@AX,W@l,UUN0mAuv]$ rvL1QJF ltb'ԙ2LRp C:W*6 S~D"%x<^Wzfhf2 .k ] RK/4444{>V#G.zAD"Y\\DrU*dtzJ:~xR9{l4LrPI F9s Á4{zNt:H$ K29tS|P(<w�"bHkJ0FZXX+++(AE X,ԋ8Iu68J%%IPh4: C,<e* }5 @ k`^o4$DP(qU*Dcu:/J)i4TA0ؙCn+ B[hBm57^###pP(T,qyH@WRTD^JD1:[;V)t^Cוf٧Jf^K2 -; @jBf4�<]8`4@ą ԗohM+4$w}R_WJ.… 7phkcc]zWZ}׻u_�Dd2_ՠ )˭VjT*Ů<XrVժRld$GsBRX,XA͇qv 00{pT*x2 \.JROf4Zm.+ˑH r{Z챱1tU1Jfff N5ͩe`]AW%\.wfYTb1Zy:g�oZVL&CSKMtNƨT*#a|,cap?=6MVe@��-Hj?DuZF! kp+mmgY,J%u zoO”p<9[rI<u!Qq b "2,1d:rs4 kډ]ٗ^;?>99)HZg}'?ZӧO˗_~~#̥T|# ԩSO?4#H$z~C=^HO~UW]U*Ξ=~ǶkdtQTBvj5擒d2 T)Sd@j{{t�Hʷ^y@cd2^/`ow^dZH$$I*n&gdj4 ɐw:lE9ɌF# Бj6H�{L,K$X,d4 >NV~! mdwdzgɔH$z=`=u "PwdP h9pBQ NLcukEC#QxB ҇]6̈́h|<> s2SXDEE%I{@όlf?Zև9L&CP4}_x{7~;Ec~>EDbZկ~_?sw ɸDĕKRZ _r{~iZ-P`h$.6ѣW^yje2hZh_4ErL&S qz].hD!_xSNr8-Zy$@l6-I.p_ {I]AwD^k4TUD%n!C. "n\d0P0 ;lnn/,,@zb1X݃`rPł&0焛Sd2p; j5Z ?7;}Gω E"Q'!nϔq GF;dg*`-z=Vzyɩkю^ &sH>fz.қnIP<cbmo{JcccNbq7~Cyᦛn|BCCCSSSgϞ oozN0fo}[y䑋CjfN. "ͪT*oh(C] :ׁP(dR 81 D �#b3glooD"Q٣$Bvd2u:]PdtZ$wN:@fb1|Ȉt y0\.744TTtT(:AV~!$IRIoM3aw0}agبlF0#hXγ1G:~V:p88F4{>ޮ96ƳT M,˅+yRb%o$jKYFWf F(" &}br9ZJp Yb_ⷿ>:7tSW |ӟ4h/(ڱ쉉jp&Y[[jl6;Nl6 ."ĉDDH#r`08<<|…!D"hq---j9r7͑H$ B6`6GovdB.EkZx<>x hXVӶZ-(z r3<<<??t:=5]WǏ&T #<'y=a(\.*ףS;/jf2γNwFlzQtz_bkqfpX,AL%bEVβa/"]P~|>+uNEN$n7Hn. "{-|;2V<﷿-5BO !H$rٱL&RR)HA:sssV ~dfhIxZn !|h_ch4^~<L^xxn'+B.HBJX,hݞ8T*h4Zj:;; @D:Ut:3f)JR霝D"0x`< Aej rϟCl6ɨ" &d"R86TW& 2#Rf&[Իv h-}:FBql6FY^^.sssw؝+RT^um2&x&%,Ot:#ȀĂZvY88u###Ya<Bĉ|;g?B@}o:s@ � K_[wy{T*DN?W_}㡍o~gD[[[~b]>9|` R$`0ṹ9TTR*L&hVTRVe|>x׾v}cc#SwQZ]ZZr|̭ D�*[aVk.;}48zh& Nf=,K* 8FN祗^h4Ν;d2GFFL&|>_,s8I|SSSΝch}9r`z5Bkv{~~~||:/ QVT*vA,E{ݦF l6yR݂zWw'#xzaT;.dԓoGxW A*X >mu&ms/mu#%Ɏ$nW$:H^UJIJm3<Ȩg+۔ӧO?SSS?я ÇU*c=OD_P[~L&?'N|{s?O<fz!RT*_Ǐ*#<O:t?i:zW^yE(y>b"p`n3;; 5XL]RlFy[[[$Z(vi4\..H$h"wQTz@ 1 ubl6h6Q2j "eٌT Aq`Z<!!Ffskk |L&snp�L .rP`eX4ĔH".'N)ϟ'ǰX,mFM5b@`0hΉjR Lu %a =.@/ c=yJ\Y�NzG5rr |tZL&S,ȴπ{ %�?M:4:@( +�l6{#W~^-nn|7|7+ _2nn??O?~<uq=R DR^"x|ٳg͖L&Y,RDgXgD"n}>_m6eUeYTL&S>�js8S,WWW  �# P B�k>s~#J4u::" .d2Ac SGryJr1\./d2.JH.j #Rt*QM TgO5DV*tzssS&x<NuErF*\.lR@t ܡPd�� �IDATŌ ZP$Tm)|>hv ='v}j1u:'PPN=*f+2. %\ҫ}QMuDOt: BNB�'NT*AEEC)b1L&v+ʵ^k2`�5hrt:D`0l6bbf% yp�E"х đ#Gl6IZ6LfY@�|>V loo~dD"e]P(*ˍD"X mL(|%Ht70¾fsܩS4 &~Lf"JPzz!'m`! BәL&z=դU`z n --ڃfz=90F.<jɴ�,Ί%~\(6FoN-ĸT*@ (:9Mpqo-f7fJRr 677E"RB xjuuudddbbt2 E h0|hbZ[[#ӝA",//Z$LGp8ЭRy.K&]]]x<hJqHdjj'K&-dpd2d2x<\)x\*nooZD"At�uCs*JH4>>nZ[c=耠ι]4xQO  E>L&SPNzAZ-N?rNT@bh4R)Z+2LU.?lbxq|f!/CCCbXRij'{ !yrzzjDΤn-b"fڻ|`0އt: hbz6FSV]~o6AL&1vFf* p DB&˳`*P4}ffR+&\.cz9bV #p7pͨ[JZ[[[ D z.ZA@CxA+Y,Zh^y^MEJI7 b8&c>?I(^W<O fP%Ϊc<5}z5uqhr LFL\.󧧧ϟ?o6~?CRn͕eL\N\nB"ZzAT*%\.X�C 'L npНH$pfؕemJR8:nkk U.vʊp8�ƛ`0Bf!p@q/1kL&s8}WTxZ H$*JB#mJ(v]Q@gAouuutt#_dp`�v.v9p86 p%o܋"V+ |P0jA`^9'.xv2Bn7'm3ZÇ_`+a Fc0zg)HJťÇlwR4y %ZDxb&pWVVM&�ƃJ?DQHTU('r1>U|R-Vl6uYVA`:??}9BߕN L&x<WDSSSfC�g4zK�x )P(9sfvv̙3gϞFM]T1R\$L}v&rU[D"B fF*b^0l6L&d Bobzct~bXU,ӤZvat0dVf2ppq~-"(`h=7_1^j|>ph,..Rw&TK=770֩T xkv %j躵U*Fx<X,xzٳ0& L&)H499gffv{8T*~_ HX,ƒ+ddO> YHo q�5ѣG777qkBڄKwD^$s׎ ^Kp I2;~?aZ]]+,&Z pݸ ˜ɼk4J"7n["P4'OW(r+`I6TAyIhR׋j,KX3@ 8t79ophQ OQ'gǀ6aTŽ<ktt<ZVbrQl z sՂ5FH-4 jP1 pMLLRIC�`0.}wF C0[l6wX,/rZB,/J%ztzccСCL&l`"lZ.\X\\^,ZQh4Ff{ޙ^o*j4TT I}x?j^W7::Y@p8>'*@DnjVZHdff#*z<pC H9qd2MLLb/ T1 Iץ*ぎdV2p6IfP"f8Oz9 0R]jn$,BD_\oaP(\YYlx㴤@2 0LNσBuZdP,^^^6- Vl6 l{%oU0t:u:z"�74PB)ʕ" ~ D:x`+ i`" 6m6!Au (` D"AqM8ѝϟ|qy}X% T*D"|>`qq`;4KUxԭ+AuN,711FַE.cXڋeIB~ BFCЕo B X]]5FٙSP`r9mlZRhBUbdL&cOyq1^Dh4ߏN�anx<F PB_(Be+ ˑ K nTl{*hp�k�l6Q0٨"hj5d2e2Gp FDX,N$oNv2h4kkk!4EAsn'HJ%ݻX,&J̵Z-jYP"H9f uT}D'&&, \ne8n[CCT*aRtbbСCPQ*B0bq8!)NBzTT!b^72dZvh4[5W:nzz ؔw;dx<0@2iB05_L{0 X,^7l*g2lL%I1rD`0@pK(ċf lz8QH< px^0 LuZp8v;rwp8jnGub0gVdAi"(QZj1$}~@ �^'}v\b86Vd2}>֖P(İ?;6>>X,nL/j5Zp J=XT}~PA;i/:)1/,sB}^CR*v/"ΚP(D|X, @PjdKz> Q }w^'hcJ*{TPYL^4AY(N{F"jy8wT*FqkkK* x4dRR| D䃠!N8(h!b1 YjL"$UbF$9u8"�?~^ͅ^/gtB~2 BT)\n<+ l�5^Mew ~M8J1irKBapXw:d2eYb+\.Cf><Ǥ}h4QQT{vBQ Ѹj٘L:l6fgH$N 1X! r9 \4u@LLl(9 b�C$' V8'20ں!?=44 .2Á)D@g8bJ,j>G^iUA犳d0_nD"#yT*!;d2ׄq:a^_ZZ,7ZRA~W97NӞe`d29sMLL6DI]Rj$iZz}R z>H$Q,&d>!כvQڄW]`>r677c'8DQݾ  @YU)T*Qp\KKKCCC^bh4 zrl6(m*(ɠ/$|3x'NjfY.9sTrpd<*(  ;'6}J7X(vLV !,î~z0t5L dx|}}Ø$(e$h6] ^{{9rgJ&+pwNB?$ k􊘤RiWP(IR DiZ}Q5hAqPήq~r վ^Fv||P &*tv4`ptttii ^tVmmmT*hvXdXh2~ӉY(cubqPXZZ&rru5f^uU+++5DZR'Na_XXv=ϟ9sfG`0\rə3g - Uω@p hUI&-C "x666j5KHJ27Jݨleee?3K{={ 3L; ?:ϫRu2-$g cRX,jꐽ='DX$\L&nZǎ ʻXL.3Lu.̯C3]\0kccH(L&jVM <J`0 1HuP(kkkPQQ&0Tf1ral6Ng,#L&33L͖fF#pL&b8T*f3a{9@Ou:](JjÕJsJ%BL&_bd2B055sFx q|T*]\\|饗\.IdLrp g>.K`\.1699 ="χ{Yr\2l4qGA hp:95\y;~v5Nl'mUlzZb:s<AgCvyL&# [V$կ~xQ:8 n=ZԬ<Sl[<<H(8$@p1χ=1gS*R),KP Qr9 AJNP(la$aœ P8zh2:$ !µ8*4&hA D"64jv;0cH$@Dl@�E XUoW LS"2ZDyo,`ezfL&rZt,�% BTf9NWRd2>LA}n,5]!{\.]QMl} XN띝% BO>ɓ'pD"T:l6c< f0:IRXj-fSP("YɑHI"Jr4x^l6X. AZ̙3:_t`P*r8.kf+@NE A|بd2ADsI ^SqVl6(D@+++\sVu݀, w-PGJR& d]0J (߳}K4KP}^ j|cO,oR3|>O<"�&}$_P" q{**L.FcN+x s Zft\.I:�@L&&iM0lV.csb?Bf @ 6VV#׀|msd.#R,|jfxr'''=p8jh4:NOdEfsmm2L郬FguT*jv BVab([$q8p9dx`>3YjCrJ<j�jJH*dݮR}Vt/\.Ȥ]]s:`?U'P(T*\9.r2,LVs0.H:GI0􇴢(΀VŎ%@mNIx<``Ĥd2U@ߝdcP�\}SjfOt:p& w>::*H`pQr-PHL&N4P`vϓIO%ogNS U�O*!s}8 / ֖nn@ @QF#ܕ,8#GjTL%Y,|g(B<r->9C+;2$DA k}} v<hZ~zq~-D/߃#΂;ub4H"t!^C)fI5|>h4y2l6๰X, OsR" s6(׀ r^`(J}T\4A3 :N{mњ%}n sbf ͿRPիizJ%rL =3;tKKpJyU^hdI"x<NN{I~OZ=jl6 _BXT677b1Orِ! 1 xMSWV*d2j5jRvi޽Zg^�DןL&v{Jۊe#rVG].WW$:/  iè?iZ IDD"2'褲޴GѪmh0^8Aw,tkl#t2D"9|0pv{*ڔͅP("ɌF#mΟ?m�Ku\C猤VA ӗ i>EL0͵ :a^U Ű]Rd_9Sxx<ͳ:tO ;⮮8 }ԉ*dz7mO%XK&4ԍW4NN3$g[??99)X,699O|b 뮻&''wU]]XX?t>5;;;z;_prr';*h1f,#`_ґd2]'-0D�IJHT*|>�Iv"ZV\Z6>>Q!/ص5X#SThz^;LfKRvV#e&9>>.NVp84mll|©nSoJ$Z >v_uU;=` RM#<)=  N;-ڛ4B8S;tdš c쮺;^19 CRA:C`K$*jJ9<uD.{ڍ&֬7Z/"N'"NA|迡 AFR b>1FJ b8ϓLzr9Pn+\.p8` VkZ0Bٟ_o|?OiQL1`0cN";�� �IDATq�B8эF# BrygYT(JX,B^+^X\=OZ~k47-˵Z *ФĦB`0L&S <Oe¨ -l01LC9r`0H$chꩩ).;,\Q%:]jۋ@aNܜ륍2HNnrgr].W44V:r8x\ H NѣG_~`QB bUTBpW=4 Ff;ph%l>ӎ /KHbٶCV`0R1;ꦣ®~?m۸!]ݻgٟzSKi~nj'O基~O?R|?bk'''oeO>hccG>~b8<3PާP(~~k_[o`|߾[㎙L ?5&O8|`qwqkBa ?я766/R*uL>/|g?"G}u]~P(-Og}o;N<yԩgU(\.+p ӡP"8q+$L&2އfCén#n' zzfsssBDl6{rrW&)4VJz|F:.J]QYW?T3l6GKeiVx+�0`7 ߝA ("!6 "CORhV\]]}iE-KTbdEاg2r{b)Hp/HWj731 78e'Oޞ>}駟c0>>xw<yr]xg}G:RFկ~_`ַ3|[:yd^{_˯F>(K?O?Bɓ'5__ eovSO'?>Gۂo~gϞ%E{w_wu,+y;|G򓟘'x[YYg>?׾V.7^O;vJA(J;8OQpR)jq:X,Jmll`Fd2p8NRT|^,_p 6j4U*6wvB!i5 x&i+cJܫW.Z#lL&*t!dr⺟{c>P~~ۻs߂53L$%#\. B}<j̞)ȁ8D, e0JN̗g3T\ lT2?7MwC=tW|3{_]z{OO?6~=Zw}7y;[zꩇ~'^z鷾zh7cZb  XKb4Q"sBOlllr߯Nl4htii)OLLj3LPHưbr\V(ԃ]AIM  8:b$M BdWB^~AݚP2RDTr5 0xpmm(oQAH>l 8xJ@ gR?퐟8qb-.eV![U]㎩H$##Gp =}-V:u{pq뭷¶>cw}n馛>; տԿ2db3LHS;P33iVB14 P[\\ I+zVtj['cI SZ(w]eiG:.Ljs6T9bNd0bA{ 1nםܹm0u ^ytW}LSKutl6[٤ZfG6*rn_|k`+s? w:}=333s7u]469{677|AO~m3r#H$rm}3$4{vջidXt啕`<NY;IG AG;zg*,mEp:tЀG|vH7r βJ"BÝ.C@6Zq ;d2ƽ_;HsГ*J$3B*($,e/FZa  a@BYc@Zv6Nf:~n] gvQSN{|IgzR-qVۮ1a^*T*T*yA BFQ\Ncj>tӳ~snNC5uok|_kkk7^??W_} 7LOO8pb0 /w{ =s}?ԧ>}_c=vwzeʏ~ {>;g>Rvm?}X,r-=^s5ow=;;{m/}KPi �oyyl6j|~+3q*BqT*D =%`z|�8Qc lx� _0554M^/ \xvM9rP#@C[n�7pMo{F4i^z%)~(Bm2|>_8nMQJ:@(^)hVPn Z0:+V7vaĕ5kkkXlddDTǏLP(F0zee%H!u:^wyy΃al6�5Ү]X-Nl� ʚv;8ϣ^ł�t:P$ ~l6<yvO*k0+ȑ#0SӰ<L677^vwwo'Nǎ1q L(CNRC#0VАH9R8<<Lփ1[T:#Np87=zC`|xx8EeriY;wU*Z1feYb-o1 @`~~jD###-+A9�^)J;ߟ e@]te*蘿rjN(rˆ[iv K^^^^[p3WNH?!S\.{5r?ް[OOO2jsMZn^\\A.wwwL&8 ~WEꝸ><< ~?WKײPϫ̠zVJa4M*Z D@[Bz4EQ/ORl۾%ڙHjaB9ͼػw/D7`2`4 4t: )oJ@gG3�&L7WOtzddL@رc 7!f37m𹹹\.Gh&LZ[S鍍 L�7ʊ''ZmgRrbblEQHDD===h$̭"a;00�Ӈ<Oh&^VAhܘWI, X,d]]ݼ@>l*f'OzB-fFrXd=(R1s^))sH1 wURK#xL&QP8VqrO?#NUsbI}~_.l6%d2($ 3J�(l6^p.//CN QjӼZ<xpiiIzmF%!*mm2haP�]Cc0 EejjJ(a0P3/İ!zY6ҳF jaZ%˪j,k6*'zd[PAC,C5Bk� (/*?;EЩ(&�V>6ͶlZj n74_KyW b:tIb0~l+t:]0X,j5,Kg(2CPkDzlلhL0:FD"D^W 8hH$"TpRd2^(�_~etnZ*' C8澧eAU=a �CrBDŽS"R"l f[ 6) !ve9, ҁAK(ܥoKΈ, $+E!nQ/fd20fuڮiŒ _]-(twK{'^T*Yģ[jZVocQ(˲ "zxhv�xF;N܈ k!-B_unHKf[ƦXvhK!:FFCeZ+dA)bl6 b?ƥM� _j*1/A _&$ ROV[,q;oIym (ۮ/l4l6;^qC ymj6"JR+!˝N'o=} t\OlVD�]ؠzlC? D.@ZP~btww_c.trH}}}ԃ-n4G w*j#VįLNNBdI(E%l& i.NZ-NL▹\l6oC8PY[DF˶]>WQNLPNh<b(jhА=h.ޝj78ƫK.V)x\. |ccWU8i:H1A eOy*WjVadÂSx |>/bV!d2!pWWd �emHoeX@rL&STxmgOOoE :bɴ\NGܺ'&&hb&\rd2InT �\.Ta!"h:bݯe XD"!ST pݐUT/%x'E&@M%Un06%okkm.JupSgo\(+J�߸GQt/NQ� 9j5�ñ@"( jZR$ 5z5|>V2P(1If\pճfK�A)\.#�YzQ$1#$OLLh4x+jLzGʠ\.o'΂ɂPЈ5�>*;J7WՄ&J*={, j<6.7y/B/BRb1ᅅصRuf(zgѣGyl63<.fA@я~fũ}C+�l:xK.ٵk׮].n"Zl+O?f{^:^d``= F\z^200@mnn h;ݞ={^/�aٳKI899 q{6@K;~e7L&"bՔxt":@e`5h4/do pl6χK8 I_s\˔%YĞO=UP`cBXb:ugiia z.͆\SNL ҇~_Z] sZ"&RA޼Bߕ+ L rTNKsovvvddd}}M$>Z"766}YeFcP8|0MӼ֊n?}tPh4ǎjh󌍍Ti|'~?`xk.RY,aOr-{{vmh xH$ABgllLT>|𖗗uV{aN7==R|>F"jS*D@tҒ0H+ 4 J0HT*AOT÷@yѣG1r|mm `N>{zzlZv M~;IQO?b>vMH $JhWFТz޴Xnq,@0Lwww4t-``[in"w0 Mj9áj>pvZi=F3<<L&nK/u8x<0> /T*-//T*i*ퟹ㿞~7+4s)|>&7)qzf,꒘d2P V~kP(_aK.DӁhV(6 A]r8=s> ZݳgoX,v뭷<x0 e2t:}嗟wyNK8Cw}FqllGۿ@ c---޽ B~;.뮟?4͍7866//ƽ^{;׿uV;<<wwvCu]{t_Wo~w |#O84GmUZm0xkz}J-zV*8hT(pL&㛛r\ՖJ%כL&J c)BiZz^nVTq@/D" rc(%Ӡ%eJ?AQhl4 "E(=d2)fr%e].1 )ޖ7NǕl,:\.GԌp%^F#agr9qAv FGG''''&&X%l6kʨj\>Nh4\zfz4[.ӑ -Q,˲Rl8tZ %d� o a{nLs9C̴ԩz衇G}trr`~|_җ'ɾ//O\>( V*ӧO~>{GyF^{>?yt<#=yGw~.O?}7Cȑ#wuWѸ;RTV뮻}?sY__'ns90Y, Q|>WQT:niiht F(F"@inW\q_,Yp@JNf;s}>^W(D _çN*J " |>Z^JAO&ex"(^4qu:lOeV_.777x\I6&�%skMшdOt:]i{*ժoST<faVÃRZ-PoF$['P= %;s* g[OW]u@7t瞃ny!ɞ|Irk)g>}/ꫯ޿oT:00p7'?>uH` �Аf47@erE"fu\`Y6JYVpPյw^@ l6ry__\.333رcǏ29e +'{94 Ɠ U{h4$Fcrx -[,J-슴O<b) ҡ)^WdժRx`" #EQx�� �IDAT,}'2h4N hZ-_h4FGGi. T*gx/fYp ?ρQnv ߖO~򓋋vYjޗ>jkcWfⲢ^J$FQj 7Wa ;Z=22n $, iaRY(PL6R.�M4M8;zȶp-rv׵UJ5Mc_h4R%MyMbW Bmwpxcc#Nwww[PýPJ%JF^.#?<JV%RI4$*J<:@3qx|qrr_ZZ/Ç?afٟ.믟Y__wywqG"H$^{޻ŭ777_xᅱ믿^UNEi4"PT\T2^lH>3LZMP%JRVu:]"8}C�f QO^\\D"Z pksDd2Y[KYxGj+-tJ%^/qXk HGRA9j5 JΈ+;[U&9 4ojh4ke23]!ò,'eE4sC&K.?|g߾}<?An~{_} y`z۷{G><xp߾}|? ׂtwf+2 }[ߺa /?r]v'?o;x?[HzM7}ci??9/| =ؾ}MLL\{~8Zj:>}t:Djc+^c7Hulkh4ZV*;xȑ#GzLLLLNNB`H$2 %Q4_P�ۙL�s]fn.ZAb8dmmv`-(>EZvf\4ށCm90;0::w &!x<"R/Q+k'!$\5\J޷NOxӶK4 ]!̈́E^7 {`0d20 k44T*4 T*�A?]k x_i:J r fZ\.o*QEJ9,FDZr ˍx\fHR 4MȠ d2P(jnx`U^o4cǎs#:KT9%f3$ު*hDB3BO$vuɎM[NcccEBH"Cszh4Fށl^ZÛ:]`@mr8E hFr˘d2\$\f˄ƎqͤP(jx N)&c끂Wqtdn!@6lk&D(:K*8@v鶬A|y~,$"ekƼ0PoxPn U|2L'N(J"ymm GFF TDht@�MTI;55P( -jD] }8F Y^__"i4V!q:& ,Zf(z*_Hv3-Dj�tg]Zmv} / cWoCCm ", e^ߢf!łD?EQomF> JL=j9DdM"ƁFA-ǎi2,*?`0 A6M)9[`z{{{`MȔAƍZ Vx\BT*ql6|9ET*C BKͤT*t�,47avvrȲq:j=]V ;F AfbFzi|Dkp8 o~gkhH)'$ ZbA"JV5ͅ0=ӎfzSp qa2 Jjx*5LH\* ]P(bWR:iJeZT*"@L&Wp0 sĉB롘occMQQN`0 %n7B%p@<eKBY#" @ !+>mY!4oJtPR 2* oX5gMP%($B wڡ3M'N <P($n05M^ѯj)Vp0Q\.^ i>8..(B"dY& �Ieޗr l6C;L&L6d2Ieٖç#9LŶ`0tpWIg%1R ɖT!Kx(j[r_H+rVVV:(9{ʩh[^@d0-"#w24;d>aG CH[ /n xiuuuee`0(JVl6^`qBUP?4 �xM&S ZX)lXL&hnG!K{yKP٩ 1 !nik+pJC?l6R P*9"KJe�HLڡ"xa'#ReF#a![dZc>FjH$Ւe%=\ l P( PݼkT*HJ%JPh__p\G4k ohO'l6Nj"wG(twz79v4cvSB4AP4gN_]5;D"h4ښ)L&ŰZNRAW]},X\\"ZfYz h4V'Jb\[i]]]0zh1 DZF|>#9H$uzkHRH1`HP vpyu ˲%Zfw(2eE\d�0aBH g!=zn}F344$\KL& \@ّ;$B ԗ6`8tkr*!t:' uhtiii r I=55555Q5(Aiۣ(!r4 <* ,ne)"n 0^!fWFr^/j*VWWŏ)ꍦ鑑CߢJR[r4"9Ntl6+╖J?Tq.|vI$K` Bl6C0^388^*JeOOH7FK{>22L& F$MznQ�[; LZb\& -NR-yws4/~C}E ݻwk4imX.a9xQefZwe6M�# z۽x*J< C\S|\.;h<ɚ3bYKm4P 1 388( ۺG"H + ð "Bo$6ؽP("ĭ瓭d2Dz�3 A+ E`ʎivv)b FGG8l@ccc )[dYnQO<!d@e]N&|J�aK*.kMojײC\d4Z-2UVb˲Zh !EY3===x t:)$j- 㹮b . J5bȲT ![@ �ܯ"DjPIJP( sV\ ^-!t: N4Ѫ7Br�}-VU.' 4XlE/4M=@'سFBI& ΃ RϩPmÇ?�j=O/?OޡVEéT 4iK.l T jR49vBvFR9rɓ'gffj"t:?/2h&ߓ"h&2V7骫jVUV]tPn/S(-{qN'G$lĆqRDNR'\ښdoYZZ*\Ԉ o eY5\d2T QEuPH|_IMZVER4-$+r3<qKא&\q?>|r_~` 矿Dk ?>~elzJ޽-EQ἟~iq\]tL&;|0 a]wu;F"`6-VT*`F�Y,ZmV2 z^HZwwV0ܨP(X,`0 ,el6ZBlƫ rxxxpppmm^b1@ALRjf%I^:\.=zVT*f3BZr3Hvnh4fY>A1,L WTJr `@b!􄠻(ϣb%k0\.^Ek pI 9ޛfZS$T*rbUy{=soy '>t^xg+C=8p{g^zW]uC=_⋷~_H$^plvTg#)+ M/˼sezβl?ITZl6U*URh4Ld2APlƆbI$Rpa+B(`pCdx:f3۹*\.' h_-JU+J0C6@2RNdv;`r9q$˕Je6vx7QVx0!Q# nuh4JQZ-EL| !6\:8F0r"TP{Gč]h4&<-[eR)R Z{`\.NC8dz,.r˿ۿgmmmff_|~K/4M__YY}8p`bb.s$y/LR_8p7Rs<xl~#\@E.W]o1JcD>w:Eᠷ  o@ }y9k0$)D.kmmmqqqqq7x|uuuuuF&ItA-//P.~͝N^- ßX.ĉ;^� xƆ%](h)7˵ԠpL҈L&zsҝhv12:Ff%YƌW3<qDv.T*>,fXP.?q;ZAHf9L"5fbԩSRK0,eRh4G$1}}}�ZT%zЗt:ZM"c\"XqT(@d2pl6\."CDs qGcyh4Jh~ܖ/R̻E\5 �-mkʫ9dkxrQP7Z+|>fqP-#GTiGC RgR~h4vJh4zFy+|߿o馛n&Lf`x㍿+#<b<⭠2 7˲geeE!<&(Hy+C׺ 0 N"\WW:[www$g, d2ɤPy}ooo("jtAȫMXZZb i\)~XVee$.][BGhl,Pu% <m5rSRi9\\bo{駟~㭷*x%sg?Zs΁s9?vwL&tvj7+*HJRT8Akww7R�!vs ÛO:+ .--t޽oH{j) 677a#PX(Vt:ɞM5#pb}}hcB2Nm+nsQ@`fq[r^ aDqOP-k6[G"$j*}^q, ?_k4g'$MѴB7<zPFQ|Fwy緾e(ԁ"KJ>v\~sя~TT|>*!#P(o}d8N>X.W՝rsE|U*$xR@7( !O EBDarYhT<@bBy6 PTl�4/$rp5D� )fS)$9Afdd$CEx kfYrK/-2vgȊ;ERKL>Nr6;^JKՑX۾ôonnnllm`TZo^m…iǺw Y+Z780rU*".ђr9Mju:ZbcccЯZ 0-!E( 7X,=zT-kK40JЁY[[kA300 pg5ħ>h4�%P!u[ ;.A׋4L&v}y^WEQ&uuu]uU5 �+j)( ԂxG&ŅJE 3 F@* pN X(RgZ5DP8tLdYJQ!MRz!U*7DRhk@ z}aa+x<NsIBQ04LEo4$+ݾiԕJ8ٜzb\e\w*J[v饗C*Nؙ5z{{-KZ][[C\dX$p2 .f3HEpZk,e2d'BJb0t\Gr{r^$@(2Ldm`Z\R#jcZEB Ǝ$$P{^x^hbq}4lNR`y@;}๞?ΰt5˲c:Vu;#Z].yKl,fK/433KqsFBEDtJ<%|d�Z&T$ CPJn~?oJhss:"WmX`֎\.69/7n(,w@%W,#tU�JrX�rSğ_ZmCrt+%8]]]"!z%T Ӎf3rE"nH "]]]BGQh6ѭHLa(lY -5lHv"Xכ& VhjZљQz%M-4L|>/Ӥv;Ae:&5j** :8xRo>>JWg δe$ ܽ^C6Er/Pi4Dw]\Ft\NL&nX,!<'.3Ζri;PQJ||~ccT* ehi@ ~HVD"! jH1d2P(dѨPA2FbXP(-K' dP"ݎ2axD9~�� �IDAT;똀Pp$j16͐%u08:&!(iPt.xi|Y\.g4k"_E6v5MH"`r١` YdfPooRDT: Y5 nN,N ü/P(Ѕh Vb'D,R($rju``,J4 FxЛ�\.'D"t:[q>D"C#I1٬bd2R=n)ۢT*ŵ<�Xd [f)沽eW(%Z~Lf3K TTxZ׀ݡ72y4 -mx<% V*5]p8p(tTS�B"]J7wV:g2n�  nb \jFD )LGT*6h4 ~ l6k.!?rcct_"#;F#P,aI|"rLVsh[PuFNr[.J%`ub!|@E\CQSNIԿwww,ˊOb ;'L(4pc ÇA0 tT=x[4J@\."/hpaX?2L&݇j8aW*{zz |U\Jv;o�9a):qDP8x ҠP|111?шt @&JyC 7 ޴PPh)1p$Ab mDڵkEQb8kZ8\^1!Z^^Qatp\ϣj^trB F~Xʢw(x"ȃqt0n!_.wmݡW3*٪*Vv8(, P)l6QδDvW.{<a8<'/* $rPX\\dRxڵk^b�z=\U8p=͑HUjݽ{b5 YqLvqT ZVg>}Z H-3Gk+333qqq1B(j�䭭?b<;wr7ŋ ^0 ݖzm666x#�u,%"RW#]HQTT*dI)4;;Im7==gbzP%MJs!<h0R:iZɤVѝ7 R]..\t:s}a*)}N r.Z:&*xo|9A2,E͆n4˲* "DEz82%8\bE`Z&=k)H)jhjd< nC2jМR׿V~ 1L+++YnFphD)ZI)-?sIwyumKhb3>@zTp?t=%,/|:FZ}/E=T*MajJg�qLʩT*mnnt:V l6C0z3 nBR`0@r9�Zl66M VQ(@}5R(-q:PlV(srKϕ'pXVoV=tJd2;KYcKMXt[β,2hWR&aL@8a\XHwq ><S뮻&˲W]uO<w޷/ o3̎EVUU\09֙`b[0 P`<\fgW ^U*'NP(}k!)CB(NQ^�:`f(B+Th2^o:h<Z"~?ϣyG{zzںDX,@<"N3l6iY,[." �KF,ZEfS ,w  U֦JujZhJb`0cQ̼} _q:t,rJR[U\VUfHEZ__>W(w?w}0&<SEiZg5M+$T�:h4ZHT:tJ #Jd!Dli6 <V.eS`A"҇ l6g2jl6ABUhD"k4P(ڻT*"bjPՅ zzzrf(- Tt:E�JLSC a9v~+$4%7UԍF/A<<5 M"(J9L& :PFż4N˷uwwK wFկFGG? =31*+|[zĉcǎ]zP oGHj R C5V`DCa(t`炅ǹvCj~~^T 1X&FΥR ~T jxR0!mJR]2N|>_,s\&Az=* "4hǯkvW*n9xTV&~>|�z0dFJ zdMpNS$9 F`#(u6Ew |WZ-L?E)dR*- ufzAhĵ[S\VfҢѨH?EQCCCzV+EQg"Yz 7@CPߜZ (-Z{饗Mӗ_~2\hl6DEP#$$q\bqss3 "Vp': ˍ'OAN3LUԩT Gz=Y,a DX$QVk8|02~(B;Y(@vuu.ǭVk*srz DV-Gb(kKyk�;z`052|q9|>d݋9f3Q;C'OlK~`0_":?nWDDv/ǗG.n#s9D!?;;qp_fY?Jv!;;W<Ez5 Q'L%W~8k4HG""@dJÇ{9B ${+S˲^׉(b@ MJ"]tE0M.k߾}^z޽{}>_, H$rh S-:c~7 Q$ܸn YZ%u!(]g!ʖ=|KCEqzDׁFpeN8:`2N)e6HdDCin\4ido]<C%Xb"܊ADfa+rGH~xyy+>[S;77WTfggGGGiV*r< ) lFJl6QHhT䶓 kh6DᲠ\.АRj^pw\Vg@Z-h\ Ñ#G=z...*T_xJu嗏-oj2zd2l~ЂpLssswBnWj7r !h4"ArhIHa@4Mx-ѩ#"!}P.D Z w(!211!$ Kc\7#I`0(\m~e ܪP(' e[?NQP(MMMUMNN>c'Nx{s'|rxxx|||tt,婩)~C]y啟ԧ~#`bvb�wslllhhH!x@(ڸC캸]/Q( vC_xbX,XP( J*˲v=J!߱T*:ueY4iaa5 w:.'N>}zuu>H^ZMQTRq\p,bxIDD eaA4pm!&YVTA.Q rHĹhY&Գ[PUJղAhK/GXlY$0LOOf.ST`Erwjc0;j#\bZF]NNNv483xZ@~_[[jH@;RdVVVIwN3Ӥ\Et(B:skj I$*eYV[,T*xQd2A(LH 0<Bj*ˡ; }yoo/x<p)G5R*v]%^:) ʐY$HҒr\f3kWWVJNHvyEND"R7 ʍj5 @ݑ3fYH3 9O|>.,,<y2LB:ivZ&D" `{zzxC+hZX,]jpz=Xr e>mm&C2 >fY�B06 rV[^^.Jh4H@ɓ'=vСRT*WWW!/ˉ&Mԧܙ24a+Lbj,] MZVf2DJg@#L&T*-[hXh y5Jtzo~Чޒe(2d}d6lį@t {}RRYZZ pӪժBjPE M_l6Ba5x+j2@O&ax8<Fb;쿥%|2,N,--̜8qbssNPTljj~J0V~+ o}Cv@-Jn|x ;yrIgzy�ey { Ѹ\.1pK(鞩V* g )fd.tRf3e")? g0! ^7`)<r"@4 (PJRbt: z+y<?mRliXF7|r*J:`MEѳ?w%BNOzK޽{K2 o$J|>ax#*T*dhT,(ڳgPlZ7Hzü>`r;E E t~?$\x Y5rtI2,DіbTE a-\.L!^٬5\]]-tuƍF-jewXzG<'j r dRܞ:9~Cm 4{eCnvG^p@EWW޽{`EMLLx2lϞ=4MM[DG('^sXSUVz*H]~[-r4%Iޘ'PH94;;0lsݵZM՞>}zmmMh48jt^ Aii G:A7 p;a^/.Ĥ`?If42S0dn򍍍u:�j(.ITċ>|z5Wӧ /jBCCC\'NY`e9>ˮvK *5[m&BNtP`Y |p`A2]YY]v,P~"B<GP &bp�[ SZ aF8 `xoBZXD$7r9ؖ@,r9 p8J&&& _/r'04F�W%~Zh|$B;qoB! AjTJ$l0jt?Ǎ@kSڊ^LqàK-ќ(q�Dp/D;Vd?P ]šAe .fF\qa=ڮP(ŗܳ0ͨ�opppmmM<�:܂/#֠S+?!400 a ^+ `}uh}G{3|o~sˎ*4,B>qU!B�(JB^.K)h4z~ddzE!,^#qyK=KB?R0 D}Q˞ 4VLmpddDվP(*bEݻW,xH.(ޜ.Anj]O\.f'H'Khy0 wۇpVn[bK@l˧e DXj,`Nk.nJMr#t:! )Ja7sǿW_}5wG0aTPleO,aCd2xTfSNT*B8}T*Ų 'Cy�"sssBT*f6J]a"Qnl>_ZZ %Mf9==Ͳ0-[KI|E,j�j4$k Ǝ6\z=\v\F14?? ޕ؉{qxb[tH؎׀ Är333\GT*"l)\ �cr94esgK$ш 41YqGrBшym2 -ڭHȆB!j,E "[j8rlX]z饨 ,B +^A"YZZ(JDrh9nFjJ;+V 9QX} 5rVJEbeE�J=p.R(w0Z[[C|>/!\d&bE`h4 CM\s2D!e۹kpu&lvRT�_jpqė@/@NPhf`r[y++ẺLI[ĸvYD'/�lZ l6+$kbg..2Zz]Ho`lX,F�t;� p<ltBl *S|Hwa*'y'Á<˃>J;}۪Ioqht+HRlW~q[H]^VC67G\+9 :NJCӖKx�R@2$4m\.tz>UV!).5"I+퓛8K&VF#///B&BO-d? DRVYD?7m '[fsXhiZB\j5Y8j5| 12C 0^X,rZfEt\JԄ+N0 w(",B'RY9;7=x ?)vI׋ޮZH r�*/q$xm6Dېi.[e(1qBO8Fe,\ Wv3 oR)3}J$[Dpj[l)a[s.㶗SYu\h+'~?T*500 QT*u:\.GBtoo8БOp bZrwb1* ! ߐF!6"/q#0JR\|R*2 q#*/RK ]Mܿs1 RT6McڒŅ%v=bh4ϥRT*Spoqgk '0{ ]aQQ6=L&2<hr�*T*z c zNn[RVNXxCCC[H$RV5e_Td2l6&da9{ &y*|>eZ"[ˆBVa..l6DM IdA=\h4D<3ߏ{|LtBLF/;ڈ"ї#Z>\zI*ڜj [y<B;/J%199P<�� �IDATz9lV蹒ɤj?|n `;0ѧI^bLfY ZMxWtW\.6665V( 6Xj IDR찫-MuD"rG:H.tpX3 [422)G_:f/VVV(޽{ݐH$I^z^TpVi6Ht~ނ..k\q:K`5`&''S^YYZ})~yMUt_vuiNyYJxKw0TB"Bo@˭8'KaCa@XL'OkUZ+Wq%l&?{ 3 FWi({%)JtDsA !Dl6EBqqfn˲e|bzzzv {^<Y#f9;;;44P( ˲x098kzz~!%?G'-oEQ!vn///oA|p}}=JĪHR"On<yRܚÇKǏp ) qfiX<\Ce?0O ϋG@p.ZMjA^MV*'@u~.1!aB|Hr-GC1 t!8x|vv_6v(ߩYITr HpaHB!a4M^j"AeFٽ dh|>.z&V*XYY9|0ר "&-cT*N%73ZZZU*K䛻y 4t* F@r*[\qh: ,LӉ$f\$"52rOn M px%8'o{!#tLwPJzOOPWoXp8FB =!DhSg^2l1{vqji/ %vz #kkkcI2 [c0n7aVj&�.:$`0 "bYeheoKc$^-^ֵuwUC Mٖ! 'm@$h;^�;!H~#!Gؤ�)(Vhhv(H-.3,==SU]]U]^/?>}KYdcS=s=9*+ Nd\#vH}j*Dȸ5 ؓl6+AFCax<BA%Ν;[t @3AE.5`P z!cHD (j9N+Ǭ`0x^xˡGE%Id@O`0Ђ) `4nyY,۷oc0DS^r h4w8)>>H9DE}\H%`GGG/'KeBA%M#~Ft:Ps0NEf3F\,GczC@  Bw0{#eܹ<1A{^'ݮ XNPVGS!7ͥrFnj BP(0Nje\P($V>'yԕuݻwM&}=||>E6UkH5v]ֿqݥR1P <AC" �ddZILA:pI[lqshXz3$wCo !G)!*ZnKQg <{xx Wmel<pԡajTes'iz jl6ѽZI,�8rDd nKM&TrvPB<htxxƌM; ~/3 Q&kDl% x-7 (!W&MI:*~=(_<LS4EO~xppʘ(`ϤJ;}Y!v T*MQ\Ei0LRDb<c٬tٔ<hULSтBX2E6M{DrjyƆLk> HxpTٹ}ۚf^?==|DX,ҨZt: "H,,,�q=ơs^2q2sԢ&}NP:NR@` 2 goVVeg�rt tɴt:U17MiV:}!a~Sit:(QA͛7wvvtR))g>j)JvF:==UBkiZVlNb;g- NY"Ï&A8N%wJihQP(J&0NXqbhXM^A#n3h#Bv9a(IHn5JX2% &n58K'u=ˑHdee婧Z__'.8*e0qRii p8J{qP($},,,(yLP(D7Tv�%jZDe+j`@Dr~V~i~O`0r*>2iVWW-Q&H*IW\FrG'q?d4銆$ӫTѕ+wy.A'X,�"ҥćx<$w׫eE+M4V6<czIn3.r<R騧HI:A\c0?H/7Z;޻u`ii 0fǔ 0??/(Pt:~ NNNT�zWWWQh4{|H?99aj n;33c4(h4dZV$ S*I-8䏹4 tZxo0t:a5?pCvBP,#ۻpt:3 tGGGRS",p877DW&/׷lh^co‚D"_%隟T*ѬP|>첾<"4W+(D3N'K,W*qVQX,6 jt(`ȓ$�(ҐaBͦlœ)If,,,<3X t:q]\\K<Mުi//vz|']'5( … \Zz`0Hvb~1 ` V+~__C`- TæJ]cj"(q=dId*L Dw0e<n#ۢ2|h4􃔴h|2Bգ'KKKFs*{T.q7tȝ1ݞJPn/,,DfY,6=^R C"Ā&-:‰ ='WVVTpp8.^(-HUw)a8驒Q*o C%QQY24y�h ^R)@evM松 `@3xP(d,fٔ~M蔙Vɧyu˭T*4Bsssp߱0PO<k4GTHd/jexvuz=NÕסHfYuV`SRX,AЭRd0,teX f;;;n'+h*x xEQOM&Sە4ǀhvժ0�Vb(bqnnh,3tWF^lE#V|\.K:.vM׃Q eFzh4V7 O?4'WF(Jy>NetRrs GK]E҂D\.Ih4q\4 Hr\ n}=|ƲX, Re2CafVJ1f4ʀi=0mQA<&vYf9�{zONNͦtk'de"LOBRG>ŞD"aZ'?I+Bڙұh"+[Ӛ8%|"Mar8w+Wt]nPR)ƱbJ� u8R_ inl_zddȐ"�hT<ru=2'|PIl6+Gԓ<i̬#R0j0Z )p:~{{[D"tZQbtB@:F)IWY'RXqRazNׄu8S% _iLT*Ϙa4y]#!~^GL�M[[[SgTm@{h<z!MҥK O?˗P+՛쩸K\.& F00Z:D_3z=�TUA;tdu4>==%Y4E2ݻȞdG~<χB!Ӊp߯Ծ\.,Ll6$"NC>WҳW8׮]ޞFAPי&RXܸqvXmߣ#l(iq<3ߡ%V:=!Zܪ2E6J >SrȦΒPC(u?yr2<z/R"X=|>`05WJ<c Jx޽=tv)ekTٓlUv.^Za쳤Ѩ2bA2jU[֭[%xP(D*+ Zc*{i,~DP@4b~3$$MJBYEPX$M ܻwa,4d 8 ,c6qpzaK;VzԘ1}T\.0.Z<y$I z fuQq8) ;<)"vhWS`h@;S, ,cݐk\2oFl6{֭wy?A>g2&ހb1Pe'"af4т'E g[V\zޮОEP @l6 afI ,HHvKLd2IANJGGG3334F]h_)xtlq\.Gd[ft]xg土\.=G 0Z0㏊bX.SZMg|OR_ѵZ l6 βQH<wʮ ܺukww֭[>[LlpK=K&*XQ*Tr-;<H"ܜ}(~IinuG6�2jnDGeł~~Q꧓ G<Kbi&3NNNFnFqaaEQSatu( ;͎X[c=FrKkd J#Q-ˤᏎ>h9<$ЂsjGyXMZV4É9BFYB{C饓+WZn+Ol&*rYE �Qu:Kv ِ ٧R)yt:v; 5b>bh[ш+JI5O"c3AzŜ,Y02yPPPz=cc)}10IRvqhBT0*,bT c'vѦ\.g2<ښJtXմ'&mZzj~eP^|`0ϪnXˊBXQ2]LFuq|||u>1AJLVuvv3,T*5??GٴZhU5qStz@Z̚tH ,]Z/_VQ�T*57y^ AtJS雗FE{v{ee,\\;Ǧ;d?J�}4hHh4R? * &1x͖L&'BVʮF!k N#-//#!20avv{C S .XWD0-(@ ljiR=~C{*t8}gWU=EQ$/zaK}`PV}>X~ƅ .1zvaўV󴼼\׏&AL}2h]M&Fhu܇DPF}iwq R3n8XcF0C q `LD$})Gi(,հU�OK(ܠ1 XD,'*s }'d+gҝGn Q8ͦʦKӮ*ÌEy1^%YFV6 iC 2�qZchŋq2h\ٝҦhx3%tDh4uLl8٬E.oʬ[VٮVU<']pplllDу>KKK8I\3BvtP$!Q 'FQn >K9IW5$�Ee~?Pd2x3y󦊇|Bj!Ϸq텅 "At*UNHGӉʹu@ll1K{y"uݸqCEF#9 B-l�Ne!ۈ'2K㌿>j 3Խ3)a?kX"HT`tJ(x<J0[KN*NL&(1h4^1͛cqǝNg֛fQ#;==r dYnnxݞhٻ\~?W F k'/U** <WLIhN\._z_0kۭ[\έhiRbp8):<O%Y^ځhvl6/,,L%{$zWI7ri偱;E4 dt)JPs&*@ ۷~ӡ1R}r ;ǀ"J%;ܾ}nK;w\..AՁ3R9zFq8;ju8Zf,1q@5r 0"b(2pooO#𛣒P5C<lhF# x  uѹW`tPǦE>krb޷4nYnnZXAL1(6`^W}bH�h4n޼)gJO@fYu#;$v'KΌCsTe1l]&h,2my'+4ZvcD"ȀFXfd4z `4gffkڤ(3B:׿`ofaY{v20j0s awwf]\~ :ѻVޞJ86Jʼny3Mkriup'M+1J;X,pX˙N0L$X U<sAo.tٱ~(]oQ/Y&{01[WR8*]m6?cV|S:(Hh"X:BTBRxpZkG.|rrrD\.H$ۉ]#Ƭ6D MN)nM 8M׮]#|~_zrfbQђ>pJTVG THyLDxA*?W*IiI@|GfF;R`0Иz&a&DD"h4@mz<TIf Ó%cZRqjVJ:nkId|G1 ]͖^b4^+Q,]6C6S�Hߤ@ΜG$aZx~?S,.=pzzt CјL&nس|>ϘvH$*# J.U d'h 0I:akkCLr6˒zXgo;5`'aT*e6'ҳBT 2iڵ? \@UN)A\&-I{Ȓ,fgg5.7L �� �IDATfŢV_%ܫT*ǥR)yf~?a~~r=s=.ڕ^ODH>v$b~ o̅b!'RL=pkv("M%_^^ݦlnnt:-1|\.!°>AbD#, le&)ɠ 9y`"ţʝ<U Ǚyni`&"j$B 4}YꀶLN'304rX,G{'~n5H~eC[B>?<9zJg߇VJɉM5 BDIZ8=В.#wcW4*3?TJ-ښ, Xre_$*xV2 )k~p0` `9x #"EzoooY}ORY__uh)W#ݟ'O>ȴ^k)Z1tYtBsssK7UH١7 ܹt32}ܜ\[[p�Ie &,0<MZP(ejNz @k OOC$z=$wvvTt:766ξWWWˇ%&-ىI4�TY:RMO^/ĕƵ5_uHt@)tZ-u@w޽X,F"N-0L4dKS.//`&a Bs" sHYY%]M'''=cz'__}Yy [pxl!9;^7JHR8R:\.:?<S.]^571Lo0B\2D:ښb>D^`0,//k9F# b|>]DYI 'xsss.g1 Esss] VWWU}^ "5V6L,W#B~B+=Awײ@---чށ@@)c%@{t0SIu+ahjhK&ieeΧHVT4_И/$ &vId2 G3Tʂ&|cccss|/}?|p߫)Vt-,,I$RqM1p:*Q b6vLRdR6F\Fs/HVu,F1(!dY\ 힣FR*¢ǍjJPzvvh^Պp8,=kS_hIb~_y%L&UMtz@`$GQ-Rp&tj\hvvvssS{)tr(Tʝb>%cLj䚮NI&s^oVzvF lVs:R$FH)hrpL&wvvF0qdoҥKfڵkpFP_6B!l6gffZ wǃd"B`ݛj 8].,gRz$+%E~nLQyzcav;2Yd2n6cxƪŜ8Ή6S,ͤD"H$RVrjJ~2 HlTgffag$ ڤ&ʼvLai4gIY#" 76H$+UZfi20 2MviϑjPny T*5tj* {I]3|+7S9A"@T= `Q)'(޹sbL&J8L&- )fB0I�'`0|$ $]> z@ @2p8aNb�k4^)9q&p#߽{Wt,onZս',sn6d@ӭ4h O?l6^nB tMlYJѾڹiQ. إgX6d.U:a WmSHիWgff͉vU&3X׵k0;N-{P%0H?WV&tn+&g6':<ZfA2;KD҂Bx#A2vp9z=x@V�@(nZ-t f4n)JF#<QqEՊOZV*[Tt_KgJBoZI@ 8>>A1 G*7Q4Y1:Vy�r9JeU3?9K<J;)}OʅWv06j\p%/&B>9I�Ex<*Sp޽{(Jڀ]]hWn^owwW, phF' kZ<TZTJbt"RZMD\b:JEQ$;zVO�ozc}HqiZ9:Z-D-v*ehd2d2IZ[,R:6󭭭pd21ũh^ Yd6R|>4y|<<nDzyJ Dgdfz("]:Τ:bk&O'GGG0Zdtrx ة5GQZ%[7"ElZj!N|;c/sUVUe:4 =K{VzZ&"}jǕ j] FuϝNt:̈P,s7!ojbإn{}}a hE! FQټ.,% fٚͦb,KTшJ:pk#{4P|ta0XbI|VRpq VX �0gR11Sy>N_xQ QX׵1<L0l 8JvJנLB&{8EEQဴ=P*νX,axڡv{05=R"z 8kW2݅Aә4|dZ.1Tؠ]v4SA F"e.D#.Oek`86ꭩaFG>.pL&X^ �ES�e]__~zP\@ xA`RY*Fv3LG% `Qy<tvGz-..2=Z{g^IRuhX?dwvvZMJt:8r/[,T*5u M๬'JUw"I`k Zt: ^G _{Đt$c*"BpbVddTtSlH۩}Zl6xUOܜRQ ++{>`xg@VԫbyyV=!JRc;z tU?ZYY9>>v\L%Qv{iiyd2`pv4[]]]]]E^b;U(q@B6 h¼i4Ztncm]Ƽl}.s4YtjIсn uưk v|4U�Z\\gǭ+54#K|L8Αx|Z5LGGGФo=V=XRJ~np#H0m3�?x yމ҆dyyKL~ʋP-x_ZZծLn2|8 k ZDT5fJ إKƉE6UJC*] ^Q[>69 hq9,1RĴ'___G#㜩^O<#nRX,t:N(&)~6-Ͽ{H|"?W\CH$Ϸmٌw`ZX`0#-Au#f`ZU|4aш>`6e BnheiB0Hϝa$J6nRQ_^VI,AT@2bcK9+4yG:8.h((%A\i]6|"U.ӟKfY3t: ` e70 $am7'x46G&FjF^  *Nl4k1 9 N^'m5J#dIR,f0~~~EQQ*ݻGnw8zGGGra=xl6BdT YTFp=5`0t:B[,RD4Tt u||t~?p_?<*ZV\(WZ`ff`0ȪW%e7"{;&pX*&ªtR\Cd^L!`Y^sffqUKuql6 xhii\.[VzlJN2ėM&M!Fc02J5ͳ�~HRNS{s$­DllyBpvvV)&Kͭ=Y^^&HXM4zȩo󖆑&DgggɁ,Ic$8Ls:gd0pRHr PZR$ jKR‘6 ; :6@* pؘpD\.v"T*@�Qfffl6[:F>LlFʊAg3l4[V*"||RLy% z1r=~lj5vEQ@ B}v@E9%LDf;%Ak$€RH$ĥKL&ճ6ݻw5d ?ARZ%FY ;'Q.$ͣM&#~_j ]Nsyy9N&Nwz:6Ӥ$ER ]eS/v+ *-A/ 'W2Nc^&C399.K6 0�_4YSA @2D>@"Iټy&wvvn7*8Zjd2PۗhZp\DtٌpN'At݃zxG \xzg677*z3cF{|7x = |HᅬRIh,1È$i2-$Y (bL4yۧ %l6tPwvvG<dK2<oaCQ?Cّ+2BOOOKuW30ɦ3=F#z)lEFmTFɃd $@/tvH�NjZ(Z__x<7= $T*Jt``>zь|-GollE"L&0m4B! b9 6 H <|4^b(ACT.66pvRIEڵkHrU .pJl)]feUN&ue,|>+l0ݔVRT�N'dY4is$?^= RȪaR讔ᰴ.=xdárgg~t8* W�=t]~G(e HjZ-%3&P( å%P #Qp @ n{||f1r Hk׫\uN Vp8cF;D"*"'8 }$+z*xf_e w@ʆz̄~#zGɋ"uл4> vcs IEq{{wߕvЮdl68qFA|>z'l&0p8LknKtma Fիׯ_GiݩĢ)r΅T-|h4Zw>*+҉)}ivND~ ^Rp�:i0GНcE0dLd2-//j͑H`0\~iq.\TxJC 1nB;z3L@bɤEnsuzz KKKsssd G"p8\l6w:>>Z[[+ː*R6}@"N3H$ԛ`,¬4Tz!^K�=pTV@#WMi_pA5I,0#d2(@%=PE+Q.r;(1-`X,HJrp<2x<<(ar1棣z.{bJXYUh4"_fxl`t5d-b 38S.!evv=zyH!yYOvr @u(O?fQ$V@ PTpvM&[jۢ(,6=H/AaP hNz CZy v4t:%3sssX)ٝA}Vfwww}>_XD´`>~ԩr\fZeS=r:3AkԃJ0x#, Gn46 F#L3 c� (Bi vƐ򷬸}TM&")r<X'0*$R"mTzT<^#;g.`8dذ>=DT~2qh(Z ;H)3d{Z0A^bj |8a8F;0g6$SEQE:!%A033#*y>JEds!Gn0@ ,S>΀rh4 xYffΆ\.OzXr`v P($BP)C]pVmnn @/PY,hx"Z'+c^zNʚ9q74av4$YAłLQ}nLdCEr OvUbw T B1l~"]GvO&+ rNfp,\-vF ^F(<VѾqV8tm%fJiK`dswW>_.Sb%_䐭t:}eP.z-_+&صFXPH s9cT*UV*p*pvxx|rY,^z].@r1bxTރAϋ񍍍Zv`�7vv=#GK㹹9QB1Anuz Od2GGGL|24؟C\/K/\@j, *HyjNzc8[]]ۛ~O={ァ4Wf3]"4C&6gj4(7JgJpND7< @)E8yʍ7>}߽ {QJӨSOb1ߏ-z.]tU#:0eRb.$2?4(L ,kT(`3 ,lN$prrVt_h4^o$ygоG~G\.n_XX0o~;Nij$éT*ܹs'߸qckk+JMr,%I&'MӚ�3'fa�c%k:&rL[&˄iR:!c`vl6dNOO'-~*-HH$ȕ\ZZB ޼yy;d1!X\ӓd2A@W'2LUf &Ûb |WAYCb4I# hJ<d4{29NYi{7˵1 ñIf~/Ұ=R8yyJ\b20HIr\yfob2bPv HCR?B'''N@.Ţ ~R@ ћ�� IDAT T,F7o:Noݺ533 (pv/IӁ& 8D h\&o_v' =U:; .=M�J0lZp0ѓ}ŕ a9k6["#h')7jlh>BM(kb6 BׯF4L8OV d50dɡ$mq@{FXӎS!f]᭒ *(2dIYIcբXc_A/JF#2�B*0 ?.Aᬋ N4P(ܾ}h7 p%^h4"|e8Mp84]HBRIzn6qsMnP( ,h4* XX蜋e\F&9CMLv-fooH ڑ*=N[9vM]n?.T:68NDF cT@K2MZ /KTczy5gs\ڕԹGfԛM+vP(FWVVj~w!]LE}nݺ:0aˑ9i)35�"a8Zې;Մ"}VkףѢXcM%(`wDo]FG tz{{[6M2Ng<z2K9I}׮]#51bhT#zv$(3Ji,yPJnggi#ȞE-JV 6 I& G",<@"Z ^.ZwEC\F6y&A)�Jב먢PBHt:I(; ^R-oZviJw4'r1 ~4R4%c.E C&8qҚi<Ca{b|>X, "D$I# nُ$Rﴄ}t}{i@s=f*"fIC rjggeE}nywfwܡqv ֘AIWUV@ J(C!+d"nK~cThw5djZ&|pu`owvv1t]��Y- 6 �-"H`8==Ő煈]\- F4#9iU*Ϝ+3M x^r|zڍ4"瘖z'zjVFț'b],TƉ^$Z]cLƿQBy3YÞo\(e۫*0zRާjiS<enQ,=]1pxRrzʿ72wGyh';Y,^`0AB:;$fҘE($RQNAPCVMbҢN\.hcK1Au\ѹϠ:fcP&W^œ?izp,ɱXpDf,`ⷯ* 餓N:C%8y!:餓N:=VdfJIyI'tI'BLO6~"R?أo/<<wy >>>k!*?t HtfW_}OOv OTxwP}o:cϋ Ŋۃw\V}E/+WOWd|gN:餓N/\I't2N~ON:餓NqWtI'/㤳@'tI'8餓N:餓ntI'tҍN:餓N:I'tI'8餓N:餓ntI'tҍN:餓N:=j+\I't2N?G :餓N:=^sA'tI85M :餓N:=Vd%QU>m)D?EΝ-+_2'Ť<͋< 5qq|r&эN:itה\7h4 _'>~jz뭟RzoO|d2I/}[ԧ>e4cOOsB\8/Ɔ.:餓Ng>?ox_|k_D:88g?|F;'bۥկ<O>y/&Lf~nGFcRpXJtI'ݾxy-d0|>ŋ'h c7*Vuaa! |v?d{\zꩧXߕbnV `{_TX p|y}礓N:çʅ^N:cGqI't3NW\ѹN:cEfAt.褓N:=ZۋD"Vvf9D"$`kkk08gIhr<DQ~:q'LFa4I>8n~~pLitI'tztƍW_}|No|_:q///b}{_v"=jD>ÿq.//_v,<|OO㸗^z饗^#KN:ӣ+W|k_roX?7|7t:o&q˿k替 /|!T*}_~@/c`/◿e~^z7W_8oo2կ~ntI'~[PMt_W>PҍN:#~Y'tIǂy7xggun0'D褓N:=[oq+<t㤓N:(8xW~=t㤓N:(fR)FdJ&_җ8qۿ/swʕgya%}6+_ qϽv͛ǽKJ_71u&Ý~I'tђ^U'tIǚt㤓N:gI'tI8}K_ҹN:cE/g߾q_}XN:CJh2q_8ƑyPjUN:餓N Fsuۥ=5:餓N:=Z?!]\1~����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/panner.png������������������������������������������������������������������000644 �000765 �000000 �00000005006 11332353405 017363� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���}������b"���bKGD������ pHYs�� �� ����tIME&G?�� IDATx]?o;w#PҙnХ WDEBPR!Q$HP!$"(/#\�|+qf3 ]x<??;=Za{1ӆ |$,o5z.yEW"%�'Zf=C#>;3}www*NBA zd+|hҴgxdwwaQ L6Z(K~MwaW4Ѵj`||2/ML2K'`22ahz,Vs(Ȭ =agR#$>ٳy=ُcr!*<3 U O.<a;"-|u}r|a ibPNz&(An"a5Hf?Uѱ1ln2Z,=*G[GGGs#l;yI*z%6=A8a=,\g>u;6ɫ(O{u`Udj}\{T7(%5βJI(օ|oE!)}j{CpOv^~ o-n'yӏ12#֛vva߫L## K$H'O2\aNOOgǏ3$JE3.F mrA &>⋋ :YT~,q`l9N`n4!EVޛղg�9}\7i3=&Ђ'kj/gR;׬uZcFR>JyM |~7eMSϰ'#WRϟ?I! Y5[u2sooD[ծWJK85rDPgB<Q-=88QI@7HDAs]Az|| Q,8_&s_$|XTE8ڀI=(Y[jo߾wqC`̑0du &p>|%#~~f1M z[y$O5tPΎj z?0:認akr'Ed_,#'!jɸg_nUsQ1,XVk?}4ƫ)%�؂.$iaN3B1$-u  <(5%|N prrV#؄w~=8B bS)L .XzD3#0]Gl&}h_5āiѥL5iׯxU)ݻwGC\uO ,^o%s˼ܻwϟ?<sRτ6ֶN_:7 \/_&l]r_ŋr >y-icbe7j:::B|nxcM,qd:ٿSw~-Į3 oGbs)_zx Ȼ!)mGb&lh#,^5~\cwl>E{X0g]M,31Nt9B࢜t0~3-g/\G5'1Us* [`!ÞQ[wx^ۨ+\lpq`8L^߿'~,|MTII=!1*YLɉcZRml7&F7Ĕjoeu== MRw x1L(:cZvPI4)f.eQPoiG)RKh=уN\cl ω,=kHEΘG>㸷7ݶ &hX\^^k0S#sχN^:ل7ۀM,rm2ATMD g}o3&w\y5PV쳨JYꝫR~T0uY=î 6^oڶs<pQ24TIN[i]啻9v\LAPPKCӄS̖h*ˍ<Ԝ=pL]sYf o?Cvte-OSJ߿[NR{Ns[gƫ%ߥZ �u@Ņl4ƲNP0TL-2l/|ppCm==%R\Vi`Ut-1~=C{򹰊/_f9wn ({ad~j.=!ڶ*{+k) z)s inaV&ԋ /ZO.?s& x}/я2.s?cQsPyUxVon4&h$QrZj@ d_0Y8m>G\ZVJwީ򺼼TJ4`J׷����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/prefs.png�������������������������������������������������������������������000644 �000765 �000000 �00000027537 11332353405 017234� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��)�����#;���bKGD������ pHYs�� �� ����tIME7G S�� �IDATx{as<J=AH6oA lG<]-S%ȺH[v ^c{].c<]6)bG"{m  kzLkFh4s VӧߏˌsOn !�@v<| n�$ooMij�W=k{S� d�c'ܯ]9=?gthett̙3/M.ptS_?pP�tΟ|ڽ[?ռӱ {M[jw0V9\?uW q�H0{fg6oh͛7ڽo`Vʳrvx|{}/{TlqC �JR ~_I^:~1XϏl߾cll?=~U7?~_.]3c\*z'?3VVms>�]=PP}̫t }ju6x3b5c?ݷ_-WțwN/}<c~ӯ {a۟yŲ?�]>՚kv@~[&|Gg޳&~x=Y{_~1/XZ:>502X=:p.Rin3/ظYg[Ufk !z>\h߲>!*Bz@'/ >~˟?ky=V_~Sj辧cO wM!mwZ=?C'+۪_mn{n|ƫ/ٸ^{ow֯]a>q|ʃ-ddBݷ,К]-xjY\B4~6mM_/rdUcؽJ__4<j~Oqb�H8{o>ig_[byNX?[ t=10|p5/kӇkYA{sw\yvvnT^w哻_;ujK_OZ>2蓻r{?u?ؽ[>s_yɯ~w:&_h.Кݗ{;w{oqCG5y1qX}3^΅}佗=:8wť<Z6\pn�HS 5WE:|W\/BG]cKm1}Pooob|y{^|yڍ_}{ۏ,W,'ˆ6_{_aMccG;ٱ]|t=َS h}kO_7]s4yj=x׊As ?xt9ZU1s+o{ݜO6V{+t j%\JU>ҬϽm' ? Y4{33^\Xjw#_=r̜?{==}:zfk Y/xo}֌kV3O{;\68~ZXTBg,Bt™s.T+ť5c+=_K6^vF!ǦmN M�y~?H^~GL{|v?5}OPBsϣ}[5ouT=JwxpR}3O/,===3!׷3gOL}}ڛnM !6_=44RV{kS5-ohV~tj.Z^֪�xϭ*浴oz<GD_G pmʺ+nX^ޞz]78"ڢRk}3/z V畣'#pß?ȉn_ӓN`g?:{zρ#S3+ ]7OsR_^95wǧOLObJ~笆)?=ot4=yvn}|ro^WHV|3+{rd'Ͻ ===vώnz~}ju-_XRxEW_~/O͜|~{؋75J8wzKпK]/3u̗Z7c9kX<;3;УO~?j,-z9=�$>7w=k?d.W<W Z>?o]/_c{^:=f]AKKgn ǧ\QwXZZ4 X[?{BعJ^28xRV\lpw?5rʵZk?@G^}e5O>8wbzaR^1V30Ԙ>{9J KKjo`hd޾e@R9yY_cksݛ9ѕkךLag^So=(;=sWDRV[lyfff/x!CQM_VTݙi^?0bxR[߻x"ZRivSFUj&*RL)F}RTu RSLQ/[_+jVS{n�8{z >CߖG왝puϽ<际nZ宿{)G֙L)FQkY9`�{nl^9sW5|i*D8� E?sR۵aRf5V�[pvz^eCW=-$�)~5ggvz= �HHbvz곷\K��o�M-۶m^��q!D٤��199{n�C$X%T*SSSQ6Ue1 4lKnQ6FZ p-;Fafn4Q6 eɎvϽkF(e+kʪUlM{<LhK+]Wk-)XO EU=͂yM<bU\.ʞp WbGOE5@:WB)WHUbEqaē*RFaOuc2Ň)B&TzSTfM&TKBz3Û^eNYw hݳ{)ܨ_@\(g8So{bXi긕ڕwQBҚRM}Klz83#a-^YJ?;ՙHwYo!{M{u2B ?s:G{ߣVLP\NZ&ωnHB7#Rֶ>"~O>z)³(I]x"ߒp/{nB|ᅳO5㇬?( \~3{o=DKAs8| ͷBj)ߓ݉PZsFq*Z<A kM�^!t@��@��r㺴ld^*;;}J([Ƶ+q{/e ]69)gfR6ʖò?'Wc+U*lv;#>l-e%~V3e w9x{ug:] [?moy>+a9^tE{q|"p|ʡ@#uyly2,^ٓgQ}Kbg<E;ȰrvL2m]кO}VQ.Jgi:hT{tt 듋.>!dz(LD ʫSTc: zPQu^ u; 3b=cZg/i^xuSG{}Zҿ384¬n%eryu/܃)16k*|UWc eSוW.^:uXJu?#�rXgijl:!+$7KjVTSK%q#/ VFz|:cT().+Tq?y~.[6ŝ�NC5ރ&H/UrU<וQ{IaO7v尴Q={H.\0#sl= I}pP{911a&݅qSP0ߊʪu*[ #L mI=*Z igwt>I:ԣihr $?cLJ3mOɪR8Qi Wtú��T~zd�t>c���(7|[oSZ!Ķmۚͦ}\0=Bx஻bgf?>08|p߁]y17Q0?U�?Ь<�{Q��F���@^m۶Qk��dG럢_)�J ċisK uwf{j� ��� {�� {��d��Aktj 1xg#۱XPQpے�@Ԕ=tZ78լ[�~l4FV:>ƫ^Bľ v8 Ut: 5:%P=t�i{|7uc i^њ{dAP=;=[ 9: y+Ñ.p|^/=�?m~33&x�&{_ʰaթw�QR{;wgr< EgE7^k{#`�#{[}g>4I9֢k{�"{nC?yWW &NŪ%,[���=�����@��zmpբ�@'=�4fI c�H5{/�O<{Pyirsq #|rr2,c]`t@S`Ul!��� {�� {��d��A[BLMMuIžIW`gvAו].}d~ڋY ^�{wSoQ9JuMv\9.ܟ0T? aLAz$}|٫�Yn4Y@~=P9#m)=`u|?̪QJw&2><g _I~Ogs <|$+SoaO|+?\kHwwW1�d"^rMj.VMs~igף4FDg+R+y*$ t;P {Mה3<[E%wA$ vŔ"dtφ쑴S9{;on2Bg?MQ|RB%J.oԕ5t|tE!:);c?z_:{M~zIƈ5hU, 7,pm=}.v3 w�Ȟo i=;�](GFlh���=��DQ 4Z-*B�LLLP ;y Md7qq~ @<E8����� {�� {��{nүO{ZEYU`K*-X Q-^.*!b>B_Eb?$2dOr媙7:UgX-A3ζzddv\h/׹/-?DӦs:E91֡ufxkE^NT@:mܧIn'+r:E9}v @HzK}Q�֯V'-{[[' ubuⵥ*l?B7Qmw_*.uZ@7b]G/1�-nϙtntKӎeS=u}qA{A7\ٕ{#Ai|\ }u7bT53JpиD_4X}&})Uu4wK`~! tiO{ߋ;k@Cw :ep!;&i e ?iEG$}7ȡz'g^}KѬ,?Ssիv/kc,pн_[|'A= t۸j��@������� {��NhjZT8�=陘!Iifz�eA�R����,aLNNw ��i#{��d���[[7q# " ;;�E{Ӛ[ WҞɬpϨGqwU:@� u#iʹzvG/QS<~OR]vY t?ë<tw� qܪ 48tw��Zvͱxb8xz:b_'�'*Yϕ[nMl@i}zՊz�yU?Xqb^tnk�=��=�RS��=��=���@��@��ȞhZVdea\�9fS[ŀibjmY!DKԅT4o_fiBl�={\jέy}g͢<O e<B4�=/Y_mm,?Z:bBo;iď|i7 =4/' zmrO@�${6Ͻ }<qŏx !Ãns.~"n#� { nma'ܙ* pj|滋Y�=`斝[Ө_[X!7Rf7WZoR�@ٲGg4kEO"I"x'yb{zk(=S gm譹W}y2v!7siw-hYcO}CIV[Э6@.lno\ ! ~Oq+g{c � {��d�� ��ig�'=|'�bdYx�H� {��d��d�b>7c!)Y=c\_G9@^'F6뎨�P챾Zww;uH:PX}ut�vg{ >b[N�{BN[] F@~GzGou5B� 7f �pyXep}y5:t��)eWfM~NاW]X{n�pnu>3>4 S/&^���@��2V �{��d��d���=��ZVU2 0 v.{|fbh4j6%ZB*V/|3 4M!6 �=BN .eVE h3f N'E!i�˞pܗCrn()+&J({�{C$H3)z"~"?q `CM< b3dO9 Gsdd (q�#mpco P?$TiІV{W4)4ܪFrDdu ѿj6j|�ʖ=:^+zIOE?{�cŏ^G1xŏ~x=Ro8{n&GoͽG?x.6{� Nc=~smAG{heCOdn?�r=f uLo|_X !�{_��IDAT_9+m k��� {��W=H�H;{&&&8�e||<;��0&''�@��� {�� {��9Kѿ91�8Ƅ ޸a�HkK{ƞ @֚=Dɽ@wa$@=I;<1�P~Wg(bG*PG!^$�@'·]^o<�,e?@'E\9C �(aXOSc5=1{h٭}ca\yWng|3ChG0�{E�Ȟp �ʧ"7�@���@��@�����@jZנaap$jmY!DKͦ,ҿR8) ciQ8WͺX#t߳~30^=oLӌ|t �(j؃'D{�A_V-\#XJawG'z1oh(C'ޏt.x}\hOv4am;G F�ʓ=^4~}Q?sJsP ZdY�dOY<V9_jS`f_x�(peV4[vny,ϝf+>H LRB �,{|G?x#^KUǏ:xbc<$�Eoc*}z,m$<- 7#V[ډ\y[>yhxǞ4UN W-i�{?{<ep �OY?�d=O{p@ �� {��d�� 󼇡��ig�'=�199h��F�������(8=_�H3`�=:!{&9r~?;�{=gg�y7ŋ:1x�At �=؈1�eRi4<�G҉t� XxM�@���@��@���@թ MaP 2MJ�陘�\}#=VJ� {�� {��d��d�b{fHQЙ=];<StT~k(՛vY5؊°)dM=-;*^*uPH?Es/> Q?pToەN-G=y9߬3GcфYIGN5ȷb-[uIk_cKի4?eWviCw߳#&KץyVۿȳ<qsjq:d^ZxS~.N(38[-HY7zns/w:gPe:dOLmb Jʱ:VHMyW mH(b1nt?Js.Ոs ЇkqA ŦׇV I[k2_f3LG"Kh6kd7'SGū:N9N�&ƋXE\fɥ1rX?eط+DtGjLhE!$8 D5Ҽn8J^{nUի]:k:;Z:Wo=qXjfz-[4y}KYtv~6^ "t֬<uٳeV*dاs4M*)%[sT/R{�d�� ^<2;6@@&&&4cdaT� �n||<�bdYx��6�@�����@9ñT|7;�ti$ʞ.@�d;1Ԕd֊ؗ/]� [=Z{*ŝa^׼nbx�(sŞnWQk�){nNCBC R�J=^`&c@%rϭ�b 4j4<E uRC\˧�y=7{s/}w(ɿ��(XGc�@e�ЅN���@��������� {��+iZ ͦ^ą#KD|5�=lY_mٹ4Mͨhnc�J=qQ!$l9FdFѬ �Bեp۫Jֆt+U�+1Nw~؇cP T*p@Gհ \IVÝ[/0=�dO*m1l;ߨ;Y`@~k D[ܡ*\ г[z<w .=@0vl5́^ޭ{'bm+�@_^8ZI{K5;~ 2l[*- �9{U�dOT~u@fLpC � �=�����@��@��4{ 0 kkj|Gtԓ;:ki4Bb355htoV 4oB{6ב]~֙s rO5 !Ħ IhsrXqEEQ/tNB<Ӳ(TͷOq|w\}[;= w:�)e}Bq{<6?wzNn.?,G};IXhoc3^?!oTzʶH2(! H>Y5M3蕲b\%7 C<Vx5^cE٨f IȞt�˞f{vZ!ߏqd|4}%ڲsu\[Óިf Ч^[SWǏ:xlOoT9"t�Is7au䳞{dϣ=1}S%s!p?咫wO}BfXE7rI%=o=~2伞Փ> +[m=wd={N|1��=��+�vLLLPq��xk<��afy� mgN?dWvɮ,.߃HxǮ=\AVcfsL+ٕEe{��d���=��Q{155gۗo% =drJm?R{g`pD\h-cE܏J=K?!th-GZ=b;?jin]:P:`ҝuO5i{+ EnHMF=лIjݹ=^SJ*I/m"!ʦQ_)Ǐ~ Gqd7վ%LJ: $&rW!=q:hknwdgPWYk18rD<k5ų+nw~ub+~!뻮QLi}H'd݊"YjWUqֺ3WGV\hnCyLu|G6@;]?}҄Pg2ԟ:nq!v+4軿Sw�d���=��=�|+;֭V]I+gbbI+4f$ؕ{��Hc�H/{'''8�@hs�=�nΞ/| T� ;x�<pw+%y;׾F=�Gvw0;�@HX�>s�M ��f\��H��{F_qj�${�� ~ �@:*vo"��XrR����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/thread.xml������������������������������������������������������������������000644 �000765 �000000 �00000023030 11224464026 017362� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="us-ascii" ?> <!DOCTYPE thread> <thread> <info> <name>gui</name> <version>June 2009</version> <title> <long>Introduction to the ds9 Interface</long> </title> <history> <entry day="6" month="July" year="9" who="liz"> Original version </entry> </history> </info> <text> <overview> <synopsis> <p> This thread provides an overview of the key components of the ds9 graphical user interface (GUI). </p> </synopsis> </overview> <sectionlist> <section id="gui"> <title>The ds9 Interface</title> <p> This thread uses Chandra data from an observation of the Trapezium Cluster (ObsID 1522). The default ds9 GUI is shown in <figlink id="components"/>. The main components are numbered: </p> <list type="1"> <li>Menu bar</li> <li>Information panel</li> <li>Panner</li> <li>Magnifier</li> <li>Buttons</li> <li>Display frame</li> <li>Colorbar</li> </list> <figure id="components"> <title>The ds9 GUI</title> <description>The default ds9 display includes the information panel, panner, magnifier, and colorbar.</description> <bitmap format="png">components.png</bitmap> </figure> <p> The default setup is a "horizontal layout", with the information panel, panner, magnifier, and buttons displayed horizontally across the window. This may be changed to "vertical layout" in the View menu (<figlink id="vertical"/>). </p> <figure id="vertical"> <title>The ds9 GUI, vertical layout</title> <description>In the vertical layout, the information panel, panner, magnifier, and buttons are displayed vertically at the left of the data frame.</description> <bitmap format="png">vertical.png</bitmap> </figure> <p> Note that the colorbar remained horizontal at the bottom of the display frame. This may be changed with the "vertical colorbar" option in the "View" menu. </p> <subsectionlist type="1"> <subsection id="gui.menu"> <title>Menu bar</title> <p> The menu bar provides access to all of ds9's capabilities. For a complete description of each menu, refer to the <a href="../../ref/gui.html">Menu bar section of the Reference Manual</a>. </p> <figure id="menu"> <title>Menu bar</title> <description>The menu bar of the ds9 GUI.</description> <bitmap format="png">menu.png</bitmap> </figure> <p> All ds9 menus can be "torn off" to be a separate window from the main GUI. To tear off a menu, select the dashed line, which is the first item of each menu (shown in <figlink id="menutear"/>). The menu will become its own window. </p> <figure id="menutear"> <title>Tearing off a Menu</title> <description>The dashed line at the top of the "View" menu is highlighted.</description> <bitmap format="png">menutear.png</bitmap> </figure> </subsection> <subsection id="gui.info"> <title>Information panel</title> <p> The information panel displays information about the data file and the values at the cursor position. In <figlink id="info"/>, the object name has been loaded from the header of the data file. The image value and position (in WCS, physical, and image coordinates) are updated in real time as the cursor is moved. </p> <p> The fields of the information panel can be customized from the "View" menu. Any of the default entries can be removed, and additional fields can be added (e.g. detector coordinates, min/max data values). </p> <figure id="info"> <title>Information panel</title> <description>The information panel of the ds9 GUI.</description> <bitmap format="png">info.png</bitmap> </figure> </subsection> <subsection id="gui.pan"> <title>Panner</title> <p> The panner allows the user to view areas of the frame which are outside of the current field of view. Although the display frame is filled by the data, the panner indicates that more of the image is available. Clicking and dragging the viewing bounding box in the panner - shown in blue in <figlink id="panner"/> - will display a different portion of the image. </p> <p> The panner also contains axes to indicate the directions of North and East and the directions of the physical (x,y) data axes. </p> <figure id="panner"> <title>Panner</title> <description>The panner of the ds9 GUI.</description> <bitmap format="png">panner.png</bitmap> </figure> </subsection> <subsection id="gui.mag"> <title>Magnifier</title> <p> The magnifier displays a magnified view of the current cursor location. The magnifier cursor - the small square in the center of <figlink id="mag"/> - outlines the size and orientation of one pixel, taking into account the current frame zoom and orientation. </p> <figure id="mag"> <title>Magnifier</title> <description>The magnifier of the ds9 GUI.</description> <bitmap format="png">mag.png</bitmap> </figure> </subsection> <subsection id="gui.buttons"> <title>Buttons</title> <p> The button bar duplicates many of the options available from the menu bar. The buttons provide quick access to change the most frequently-used ds9 actions (e.g. changing the scale and color bar, blinking and tiling frames). </p> <p> When a category is chosen from the top row, the options within that category are displayed in the bottom row of buttons. In <figlink id="button"/>, the color category is chosen and the bottom row shows the ten most-used colormap options (additional colormaps are available from the "Color" menu). </p> <figure id="button"> <title>Buttons</title> <description>The buttons of the ds9 GUI.</description> <bitmap format="png">button.png</bitmap> </figure> </subsection> <subsection id="gui.frame"> <title>Display frame</title> <p> The display frame is the area of ds9 where the FITS image is shown. In <figlink id="components"/>, a single frame is shown. </p> <p> Multiple frames can be opened in ds9 at the same time. In <figlink id="frame"/>, nine frames have been opened and set to "tile" display from the "frame" button. The current frame is indicated by a blue outline around it (second row, center frame). How the frames are tiled is set in the "Frame &#8594; Frame Parameters &#8594; Tile" menu; the default is to tile the frames in a grid. </p> <figure id="frame"> <title>Tiled frame display</title> <description>Nine frames in the ds9 GUI.</description> <bitmap format="png">frame.png</bitmap> </figure> <p> If the display is set back to "single", then the current frame fills the display area. The other frames can be accessed via the "previous" and "next" options in the buttons bar (or from the "Frame" menu). </p> <p> The "blink" option may also be used with multiple frames. When blink is turned on, ds9 cycles through all the available frames. The blink interval is set in the "Frame &#8594; Frame Parameters &#8594; Blink Interval" menu. </p> </subsection> <subsection id="gui.color"> <title>Colorbar</title> <p> The colorbar displays the colormap, bias, and contrast settings. The colormap correlates the colors used in the image with the pixel values in the data. </p> <p> To change the colormap, use the "Color" menu or button. The contrast and bias can be adjusted by right-clicking and dragging on the ds9 display. The "Color &#8594; Colormap Parameters" dialog box can also be used to change contrast and bias. </p> <figure id="color"> <title>Colorbar</title> <description>The colorbar of the ds9 GUI.</description> <bitmap format="png">color.png</bitmap> </figure> </subsection> </subsectionlist> </section> <section id="preferences"> <title>Setting and Saving View Preferences</title> <p> All of the view options described in this thread can be set and saved as a preference. Open the "Preferences" dialog box from the "Edit" menu and select the "View" tab, shown in <figlink id="prefs"/>. </p> <figure id="prefs"> <title>Preferences dialog box</title> <description>The view tab is selected in the preferences dialog.</description> <bitmap format="png">prefs.png</bitmap> </figure> <p> The "Default" menus are used to set the defaults of the "View" menu and buttons. For instance, uncheck the "Panner" item under "Menu" and the panner won't be displayed when ds9 is launched. (Note that some options require ds9 to be restarted before they take effect.) </p> <p> After setting the desired preferences, select "Save". User preferences are stored in <tt>.ds9.prf</tt>. At startup, ds9 looks for the preferences file in the following directory order: <tt>./</tt>, <tt>$HOME</tt>, <tt>/usr/local/lib</tt>, <tt>/opt/local/lib</tt>. </p> </section> </sectionlist> </text> </thread> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/gui/vertical.png����������������������������������������������������������������000644 �000765 �000000 �00000624276 11332353405 017731� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��4�����7���bKGD������ pHYs�� �� ����tIME1΅f�� �IDATx}w3u{߽ݫ{wM(!&(J~bĜ-EA(pz{xq["1~z733̧=1 ͡5 @w%#Oϊ @�9~ÿW_ou #"@�sX;��e~0"=DAN{%aE5V4MnE4AR˲���lG'1JD ˹H]L,S) @ ,}1uڋ# 8%2%#"hŸ.L1VNK"S8p2'1,-weذx a;8Aߐ48(  @p/ ^Ou,V߃ㄘ&S:*VfyH+D~9sTԅpO@Ia~Yuzd.1) DZ\$%s1I s&H$[QJ&s{H��0 ѥӪԆL.ӐO iHHDɷ~A&e=vx 1 K^0 q >!,� HJn.hhA:İ,Ǹ"Tp k@W0I/UUC̠͹C݃�sL7^9S*?QU]s(�qQeNeN%CGZzdwH_j?~oZ{GyqܠVx{ERy"R`FZ!vlq&(@�9/'ս7^Jc9/k7p 䵺K [v-Hy_}AӢyK<')u޴/�fY&, Z9Zҍ[D-],f 4cNR1]l1UEHfg؝=ZY%9f-R.<9J #88EidrES$aDž#L fY11M$aYhP0"Dp`aS4KDIp��˲KQa@0\~UU;(/5sa_$pa0|#S5'vQW*Cڌ“<a6X^F-WU>ԔW)R��ԴeCbNU mtG. C gE4ZLT1\*_jE�B�-׉HZ!+1[G0'C#;`utj3ϽPSWɸjeKr Cr2hꖊtfw}ǰݽ`zI-xNyyYBI>Q9`6믪)5:l }Q&VuIf1Ex;;qMAVyfgXDa$9,210voF 2>>\>TŰÇaU 0Ԇ):ǿ'DS\[8aӃmNz_UkWzʂa/b5Ȅ׬{ V)?ḄaRRq4ށn_cJiNqCNT,Uh1u[۲Su$I>$6o0VNl* M:ֻ)E9);A'}pd58b39Ēs fr,srayS9ѻh.gF6(Inj`(�*?F^F9j;�%!4 ֵJ  М�a8I緢E+E)��8"o~G +-�?վo3'kN*uxYs:p\`Ki&0&e>Z, řbfq8m_ MSP(358:kgZiuqǰ,HJ$p�$BA?8u?u diwo0dbZdP{!bR+Sr׷ts2X�RQzLMNbiI�)ZV%u GOL��Ȩ˛W:FB 8u՜| c��sSMgq�{H 5-h:PE;Y;LOQ�#e'#0g;N9E|nwo#᪌X%%3i<K3<Тs]1$uuZy@q^VzI*5I'9YS)d驣!L!u $zS7��.$,F�X.J"00cJ峊tG!K1 DZ,)Uh';$z;{ѠKH #Nd:;z k)E gű_V,q f,l & C 6)M(X8`zQF{w3cZgdo o9bߚ0 sbX1&VdV*S2# Oa~Lv̤W^9:"NKЪn/ՠMD8�.*ǗG5[RoX2siЪ#Zou0  OgNej&|K ]Yk B٩'7?,6<֞a$Mz]~_eV�t˄�2ȠU}!Ý0"\Nc* nJ..;k#(‡!@ڬw} Mm1F){HJ&盻D)WirM$Il~4`l8E*s %IWZH@l=RCXa8ĦeJ%b�f�~QI{'Ҝnd>4<^QUm0Ls{ׇ_q iTHe~?lj,X4oF ]#FbfEaWHH~V*qPxOC&e[2CuIqp?X<FШ($��dzSu&"`c۾M*<l(H6\o I�9s)H"izwǒT'o[IĢoT7ѫd'X){N߶3 _zQ);_Teݬ4@RV}/?t"#>u48 �{kAD+0ĥ@VcHD4]%$DFV) {Gzy\DpyC-ST`g32" 599o`XMM<-Ru5t|n_4` L ؀vUŹ/Ѿ~Hca<P8?,פ2 '��(=D؝Tm0A H&ŬKB^{$�CbI$yJN$uuLQɴZJx N0 s=V '*VA; gR"1�@XΘ�vm w7 xcT$EoYHV["3?;Urc<է+1�ИX&$-C�N) $%D ׇ)S29DpFB SX.-&E~*?|~Bn ix9:'E6w0i%0�Hp9aR!SSyii#6Z^Qdnl#(CH0q4 Nn1F(_�qE\%d:L( #D@"@?�H0L*)&ER3  �~J҈/2^o t30f+>Vʌ"BO�SBm = @\opRi,T  p$,"@"9'Jo:eD`FJcII?RE[ђoy\?%Tɴk!RNR&R"J${<A  BM}K1r\ 'ܧqqm'׊o[q,NsRX@eNj�H�ofmp'ERLbF� DbӃL*=šphh&*0 uzp&*4V#vT' �{o}(4$-�`8IRH  Id kub 2%,()F^[r$2%qбo5'a2L{;3ħhz @X\$o+Z8/8MIsS @� } ͉c  @\œ`$I�7ڵnR91  1 p8�_"jgakiZ[�h  @sD ۱{-FJ�7$I0\.a @œy7dog~a @9AܲeH  @ 9�hZ)p@Nٯ~+Z&}駷zkqqt=o2H=~С7.YdppoYvN뮻rrr < _�DO=9?D~y,ˢ?/_^UUOwww?sg{?7Znݺ_{g|ǓD �;cҤIgލ/rC=d0DB_r~XןGoK]z?ivx[o\?gϞSO>sO?tuu~#�+_3;wnVP ì^b^:VwT*}ᇓ^hnn~'H߄|̙]w�_?rc=Dw֭[Vϙ'QVVvھ3|瑑ڑtsꪭ=zɓ/^,OH$jΝSN+n߾vƌgΜݮ;v5k߿Μ9/>ìYYYyزe Iٳ{e~$8pvpp̻sðŋ߿g?Y00nM6m޼}M?pߋH$ZxE]t'�G�l6[mm={ gzKKK^{mڵ{B|;vtMx|gomӦM_?k֬ŋ$ ݵk󫯾|W9dN\rIzz?c񫮺؝333/9 \ jjjŖ-[֯_oZ�y/~Ç?c�^z?nOB$m�!:x`MMK/�xjjjz{{'9yW?=ztwu�7|z!xf?8Ճ>,YdbT*agrss;622aÆgw}~aMM͖-[ut4;>f^_k֬?<?a644t|o g}/^h<裏F+<_bʔ)=%\oઆx{<tO�GKnv(%%%�n >bʕ~PSScǎ[ov_w�K###v{ݺukMM|p ƍ|5k'?>쳕+W;v,77B'p]vm߾wÇ�jMM;}n馅 "R^T y៫Wx<}}}z8\ׯԻݰaԼynݻwlܸܚXӧOt޽7pMb1 QUU暛o驯Ziiiaa!rc/((z+t8sҥ>?~7hmm`Yϛ7㸮P(4c0xuajuEg}gկ~u_~׿vqD"N<tɒ%e!8q Z[[p}}}ss3˲ͻ;rVںuW_}VgϞ=uԗ^zmo>3Qk uֽs̙3-[{}gk֬2]~=_~yÆ ~!q===K,5ks=OZo[__мM+[r%M}x<===rrr��$I~'[ly% _D͛}QD )ᘘ eYX;x>sX\]]}-\qk׮kkk7o짦|֬Ysu]{fڹs'Z_|/K\`$;|68㯓 <c/nΆcRVV�xǞy_W^ym782駟_˗;?ϟ3Ϭ\rɒ%<=ܳlٲ?6| gφ=oooohhz555孷ުryGGG}};wnNNΛo׿{IT+'hj>GԪolldYvԊ+Ρs, "H0߮8Fcg)R*zI|˾FD3v8-Xu\px޽,Mp>M>CHkƋEUTT,]'xjBaX$ B. R7Hd0AVx`.D[Bhjj/>͋y|ILv'W^?/**bYvtti�o 1 -J a`0(J?^,~tuu]s5^{m~~fS '5k֭[t=nj j$i0 fJ%I}}},QQQQPP_rշr \Hp׫P(^}S?~x`0$is>SXD&^ .izm$H_k+V8yZyܰaE]anlhhXf J4zEmذ9~_l߾}׮]*J"tuuy+VhhhXx1M;;;W^}u544|8�`͐n|q2[j8. 1 �? F:˚_|q2<L:533swxs:oO?]WW744O̘1#j\.?O �p-\�Ǐ_}&)vO"{1\^QQ11NYTT$O>u k[ּ$}΅=--wkw{eccW\W h='' j\PGݿ-288822H4u.&I׷eee$Y__/Jsss׶6ټnݺH$e޼yVu\]~cNN0_Gjk?)##3FbX,=zo,--~"t#GtMV{Z9-]^��p DՅ3w9˻v8o۶pڵ+++,RI^jc…EEEv/_?vXGG$F ,طo_kkEhnll<K׿CgϞd~Fww>k}'}ؾ}M7#yO>;(NSSS{{3V\m۶{EEG,o۶nٳb(2C�� �IDAT:neϞ=v=r0mڴ{o<y22Qm۶ fxpx|rV[YY~z�I2227sLBT*yׯ]v͚5v8'w}mmmݲeKݻu֭Zۢ6Ν_u7oޜ0̧~h^z饻W_:u*_j/]w+L:u=`4//o۶mp祤t:1mƍ]]]|?\RR2ޛ466KXw}뭷=u%A˖-ۿロ3.TXXxw|+VRhѢ7nٲðN /dffnڴi˖-?aÆd@?hll|7"_t&*r<k֬?|֭?ի̙3އl68={ݸM-[v(X%K=tPuuuFFdee͞={t',̙3_pXBP\y7nܺu+˲?7zދ/ xkjkkOy䑢P\\3>ܹs_|)SG?O7nXWWWVVVRR+V|G7nܿyyyII޽{2[`޽{Ssw}SNݵkWooteSLYV?q&5\òY5L>5k,X0{ylXL�Fqf%%%GA͛7~2 a lڴBH~?bŊ/rƍ{mnno~GIRN"p dp8X)U��*://bTWW/ZH,\.$0 SYYYXhQ86?OSRR E+,,R(s BW]ux0X]]uӧϟ?ƌ`gffvm00̙SZZxFFFuuVNj` aZj3f̐dNSRr-`055uΜ9: 3f̘10NW]]}eL&ϟ_z܊3IVTT6?pH$s)**q<;;:yeq٬l4}wMKK[jUIIɬY J1siӦ8n0eU3pWVV]VT^tEv\NEn!ddd_hIn[,/[v{+W?OΝxQQQUU_Oi4'555Qkf\@k.6T]]}kZ0̢EV\6i$Ϸlٲ;w {p/x"zR8UUU5^+&MdA̙31.;#%%-ɓ']qCYYe8)))s̙3gNUUZ+m)K,)))qݳf͚3gTFҥKa+H~JJʕ+MFDyyyMMͼyN}?aBNxIIIUUե^ VOZUUE<?!//G㚅l6[OO3LpiubW<Ggx狻ITW!"uu@� ٳ^lٜ9s.\XWWgZ(�᫯z_._\qKKK�477ڵ's:}~) � sOFFFkk/0,Qؽ{}7mڴa4$@:fc= )_{S믿QZ`N�))))))8$JAƋ wpA`N ࿔9fn+ 2#>\�"C};v0^}<b*ndqEEX)@�)sjkk$��# ֆ�lG`=pMv sjjjoPb @2eZZZ @�Dsjim '\RW�8)L,ZJlhh1p&d6m0XV †kfϞ r>/VH$}}}�ʦ@ �~ZZHFFuV[ z^qrssN+JBՊsvNW\~CwNBT Ѩ9d�@ff録av]wULy89�HŁ@כ$A jH$3@( 0כ ++n2XqQ T��zZ455ݱcM B={DiiiaYϮ F#˲4ʹcEQ%--4x<�� P]xjhhfM.}Ӣf FK8IKKQpa ǏWPQ :;;ξC)Hf32)D"T*JqIq4';w2C\zρ@`\oDNRJz}BPTgH1 H$>$I fgg744@$g z/�J[,ǏC:a|)x$sED"EQ~Op7#8N'b`` qJED2=zqѣ%%%>M4M,Do' ȟdg^vGU)))'~~?_Cr["r%KWz'IRT^}{F|ڂ_,b{.+E0Ud2Wj}V$A\.i:@l4hrA�X,J&Mbh4 {{,N'r<J:NR4@z uvvJRHzfZt:]oooMJh=@ K!W*'VB@Z"(ʑb\.gYv2jZRuww)Fi:(4V^/_q�.O;2, p&˙*P(rZZZju԰jEQ0L.ǥg<��0XT*^k,4"|C ^|/1գ+WFimPC*ae]vww# \*¥CCXz0+0a* ɿǎ+**$ �v-ڀgKtӧO!m̵kz<B[z͆ ȁ"H0tAC 8 bppPPHR3AL&C Z!|`0@rjj9X_"144WHT(~?V'BRI$hD"QLJR `r8D²,d ׊$iiikdo41E;J@  ):::<j?=jc7e>D;)aXFFrɏbq,2ٌ⢡P]ߏR zzz` %QoO>{BZ >D"fAqX0<XM&0 k9R 'ACw nH$=qOIiZRAmc ne2Vu8PCrX\ 񔔔$Teju8Ȉw8 SQ2 ^j;a2 >B ˲Pez=aB~Ad~HE|!Q:�חqy[2LH4Vĸ@΀\ Fzv hM`}>wEdN9!Sid -lBH#G oh4]tQ8*-Po>Ŝr9RV+bNV~ z C딸\.&uz )eeeΊ+B,TX=.`n$}9͕dyyy|{*@Ft y}$j㐕ippPTN>P(844d6/åAȁz{{cAiUT$E lD0 c&,QPTHMb I;_^냻h)uA [MƗf@lD"Q(gS|PzzznC^ 8O< /0wܥK.]t֬YoV[u$ib8NljZ6JRJe2dpO4''ҳ�Tqy ˲I~rssV+**t:]KKKKK4B煨nl6eDaYU Jj�P^^D;H$r:H)'z \Sv=1AgopadA|]Nci'r%<|bW5bZH+~#w!7LKۼL9~_|v?3[ngϞ]RR.[taa믿~3fUJ%$ ƲĢرcLvt:=t:Aҥ`0L�b P-tHI}_Dĺဴ^$uvv䴷|%v4Fvñb $pキ"L&D�ox]z=ag%T(NzС.F򺺺00|~$iXkۓ*ɜ˿K[M:>vXeee͛["RձP?!"*`ݢ$ p# vzr9 8,!u{޼y IxpҤIYYYQ z&EU @WX8H�J`2w뭷ٳ/ذa0 9Z>ؾ};� W^y必 v!I=mdqq1MӇB5Hu?~5++d2A)8nHs&O~oDbZAF.KRYZZqRh4]]]ԱAd^^ޱc0 (((kV B ,¯T"yⷃZv c7�݉R8\j-JSSSLToL/cɅǏ90LbHTjq OA  631D"|?$4dN$Iq- #ʎ7eQ+k"U s)0eܭ n,4 ,x W ~pQ\M 8h>rpHC`q|hh(,>33uƬB!^EQQQcc#AF2⎎aP AI<!WG CGG,)){BGۍFGxUw �t1RVCP~~~VVMGaYV$$922bZPƢ0L'MӣT*Q $ɡC_ t*{iȑ#qmJH'̿79Z3aOyyyݱ;7###خG<4MZ%OFG$O-9]5ItooiӦ! EAp$ޜJR�0R\.(*==$I(HS0 dl|FŒE$X,eeeгFRX͠!mYLKKiz,& b}mу\.M)kbYfY@^/D$I655577$R222RRRMyv`333[Ǻq ק#3EƟ(T*rLra$N7i@ȧ.&d 3EQH*ᢃ l6-;^T*7J\¡p tH 7Y. Z9CAQz/"D<O8>�R@?Nz0Ojz۶mh@.@B!!pR\.YI>NCP⑑^>u(JPD{CP( #rd>ξ8k4 _JXYX&@VUTj醆B(~WWD"innguuueeeM6\.Ɇj54ܽz{%g'@*48QЂoA @Dq=xjZ ̰32̩Xf GXZFyNDaioJP(t8ZFP`%8t>R,..F Ir…H`Auɱg? SUwҿKo�^~k_ 6=^'rs$"55UT" E8R7bp8LdEEX,6 6- m۶m,ހa Lro9 cF7xfffaalK_XVZfzx,-y}HLDTjkk3)))CCCΌ;:.*jk B0]ET?NJX,bcfE"L"Ά LŜ+ ۭT*~8PB<Oя~4uTBa؃>N2(H;yn?d/Mӑ$l;JKKi&>+$I EFD*Mf3#W*|9abLL :)-- ðp8 39Yojj*ftt&ȱFK$Xeh%B׻\SB1H$R(b6hFUtNx<N8rORJL7Wۄp. -Ʊ<5ta0hK<i< (//?.dķ!-:w a|7cǎDr~lPVVVoo/܀a$)++h4f9##%gff´[<s#m 3AG(~^,ˆB!d2 #Є0j$}I'H r*Lxj0Xz"HbPNxXcSn f3A&A02?Fh!q\J<Yc2<ttwrq:_ F{xPɄ6a<p=uTx[i@a0R qT*eeeO`J {* m<ِ`NՔ.DI^NNNWWX1͆xԜV 77$Ѵt nJOOO$illj%0//U&)ʳ-zad"[!M144t:0J�p8B|P&E~FFH H `_8*�bNq|M~;6pi U^kzNϜK%@BO|¯ہ8E݊/MdggMuqG+@P<@ȎW]Ѡ2 #"?o:_F�г>@\KK^/W_aMM`t40e@~HPȈYb*Yq)L&Ktƌ|M8Va BXrӸ))),&;[t> 4#>bFSRᴴ!ϲlt.0|Vg8z*&MjkkcF&dX0LBVK$rl|#&`WZo6^/d'Ʉ`'3LI0]x}9q#_%�ho۱v۬�}à�B;&+�<%-$$Q|5%�� �IDAT]v$ Nn9vd��шJ0ncm%с[0Nb ˕!:Gl'522RPPfۓIJAkbbffX'jZ&566fdd0 *6uL|9bQDq}΀S=pooo\S1A n E*LT2u ;bEA}BP@/Z$ZbdC`*h|e9Zȷ18 l4YEW }K8øsWjic~gc)HB$�`G<\*teLz:rQ۷ӛ7c, �XxyDž- Դє�L+b+}:̳@$aĺ ØǏSV+P nwoooEEE(L|c� c%9Dq^_^q3Aɨ F&MjooD"be[ZZl$ 5LE<Lc-''?F x$ c!b)eR"??+ͣ .FJC ]\VVvU*UjjH$ehhhc8€r9 H$'2 %6`rpjE~-$A\f @3?}tT?Fv X0"]._ZAzaۇ(r Ael3FK_90PC]sM?ɓ5oӟvŁSG3l S3-lQ($Vh(s\lIVبT*M&ѣGE"X,. fh&JDI,\g o271L6{CDyE&##CT6778K$IzzzGG"0# I^>~6)Z$ N< &ϙ.drퟶÉKD"ш4Ǐx޾AH}&1A׌`ֻ�s.ps炡hxl_syDz܊&c6Ik9Nju_>r)))6D"R {Ȣj5a v�%WՎD"m0, sqToh`U$ATzv~;Z6iZ!ԤRi6ɢJBZj=]}U}'drJ%~\H[$ Ry).--m޼y AXL*RLpdP,vkf|p72f-YdN��bۅ1羴ik&?>FGP j0a9��FT*D2r90(X=֤T*gNs:}}}Fy%qsRBf&֝J"*J1 KOOGI3|0v'|j \ $IXޗ0cC/4U$1=S(tJR*aDM$q2lb)D&+T0t;~j:;;}d2*�$\X6N|3+姐KPB U…t$ǡЏ1_@( $Sko�MLNtAJ~0L2%%F+D.ܬɑNFioo/,')))(]TW.ð f,pxx{0 Pt8^W$9CV;h!I+ v\%2H&lqDb *xSpIMM@0�EQf8q1V QFfD"|vj#+EQv%alihdNd9}BQۧq�!'af#2yH˲o#SRD߇XscB' P$9BHv;ɬH$YB3g9Ul6Įp8]ї Hq=d9nҢV.ξFA /++t:aq@ pxU9@r% A $2 0 ,j%ɤRXOgVqD+w0(*%%e\iD FunW=qq[sujJ$Jcǎ@ hbJj{X%d%Ν[oUe6PQIq<779A4rl6x*L*'v{ZZ?r:69Yܑ>::ʧ:NѸn*[R$PDyyy%ֵī*U*d- 7i:EQH�~'}8eMRJ261t@l =81cZ7--a|Ng6MVZiHJFܑ.8΄?m�{mffE33HӪH&Blc+᩸Z� yT*rl+Y'uAF#zLX G_T*U\96_- Ä4pxxxQ,`LNT,8qzX}P8CǥRw& .TFc4f3TnL&kiiA<X Ë鎋1Ν;g̘P HTaQ].<y2\j4M#ч2b dD"A$LS%ϵ^ IAT===2lXKV`$LAp8' Q1==]$^޽ɺp g7g)WpEEaArp ZL&~|FMV?�455]9$蜜G7nve1 E&M…OollE2$IC0;*3hPe^8OחB\DF (x?@�3ijjB=mO3<++ r@p@c +-++;z(򻺺ZZZZmeeeNNI@  L&a"4z=Mh)[/u%SLᓈ*I( O "8Y2/t�'w`z/;@?:~I<^$O~mS駟6}OSvaxw_I&T*䐂vd}!qy  crłB)!BH N4M[VhB݀zJAA`aD*pQ\%~hqwR0:.j3swC)V% BVP<e1 +..N1hJJJggBY1s8w---@�"�ZNKK3L(39n3B_;iQ\ؤ0pPa!!Bj=#JJJiZTB2(ETz.ٳ9;}58v #*�ಳb1~$lN<iPBe6{xx/LPzֳ$n0z{{'}|<X,^7dee8zٳ!sfzz:CCE"ZX?{$Uݷo眧tOYEBb`YYP0e٘2LQ._ـM(p \.  D Jvr4s>:;+=yGlt:*%HrM& Ô~uM766^ @othTЪ@E\xP _Y؊ Vysm^±B;'Q+A,K^:[i;P,vfxܜ륷oXjZ?wٳ:]+<Q>"WxHwPViH\@gh6s`J?v:.jZEԠcR aOd& *X,,/M;6y Է_dcUk1,h4 3fs讌y~ŋD>7{z[]:u`{"/(ZfiB^3aJ7 }rnbbn@ VX,bR\{rTx{(I>m?s6ҔNDVEl6#09ZJ":^__rulZ. BcFGGfB'u-^\\kW9pe7.h4~^pd2r>o{{}EgENd5rSm~Hro~ѣTK#<(D*JX{ \rxJf 4AD^(A *t5lJR*d+w]]/FX_ޱcB.'\ڛzÝ|DÄ#.S~}_뮻W~o喿[n~x+^ "A`8X,ǎݽx"v~Dj 8Aa9 ȑ#6MeYY-*JZކjYԤ fYͤq,drrR 5h@!߿_/d2Y,rv˕dZYƵ3Lb݋;tX&r\ Di גe%t6o֢(^zR R*t6 pl{?A? ]~ 'fgG/5z}/MO^ofP>�o{ccCp ~eA/ Bzm&? B4M{{{ۊWl6B<Mo\.zBd2Zn~r+5dѠt: u.FP&*X,f2^8 o׆5+=peag�$B6٭%hccCy^jWdHt:d&&&); BEi t@fPd8T*@J&aۇy"Fc555r+!zl[<0N'ס,}"G2-bXMJbٱr+OL<jXmWL<0KD2x<pɤfbJe_%ܰn'ׇC8\]v}ò4H#szwkk \Xh4Sw{/rej`(+!ru5Dz>;;zMI9eᠬ8z=h6|D"SSS܇ED(]A{d 6Ȋ:_m % &deףd od?u0lmə3gDhlmmv\TXTW%_[뿾x+.Z|w:'x^W_I9  ͺlV*JB`tt㚛Z[[Sb?N;@ �fY(Μ9f777/^j/G.Fz\.OOOc=&UN LW|k{'vCP2,JJɊe'3{*JpPX,V*e[Ze Y hȷL&`/Zd0U D"|Zl-D,8ڔ^`_ [ՊWy&|ssSӡ(4qc5 Vp9ބs:K@(H Nj�fi&C 5CYҩngd8K(%G<dHMV% mv̙O|gWWW~w}_E"x+_}?~`[nENOOjގbn{aalNNNRur>g[0ЦCmtt4bgjץTCPVя#Z:>}zjjV x<>55z766ǩP -vkرcZ>6 8? JV  p8tL&Fsé)쏏9~Er$`9\ԒMNNȽ\.vFk].bVŋ zŽ4ϥ`qjj M =R)vU*6|.z/`ecaC}}{kX馛 V}oN< d2L&jnbd{{;L]Ao@@)q- zpmm Oi%lqyarr}BP>?0Y6JnKqk4 1>>~U*.\0==MPpnڑ PIhSmR&vכ*=5lL *Bj^<¨3AP(JNgqq_~Q)#sbBAVl6Mr9Yul69jtNSRdjjjeeI{lA B\DMarM-&ϩߠ/)-d=':^ƤL&Z] P=!k(/^G˄KNW~2͜a;P{u> !1n^GG6Q(EZr}}`0iɺU l6+)O>loo4L^ώ;!\KӍ؏ۛ}X <(*#H٤0PiǑ#G(|M6={6H,//F[AݶVٜaճg n/d߱F_QфvL?$Q%tM7R*4p:dNp8(oxXz&-rL&Q4 Z�Ft...R+;LNRby(φ WH$@gV7RB%Ź|>#nV�ARԩSU@h94~\.+$ojIYwQN)@~RkiiK \դ2jcccjjrmmme2vrȑG|>_Th;@ɲ \x<_+%htkkjY,6h6)iҫt:`Of�^eaWCya^&P7M((yϢ(i%5Bz=~[Vɤbz 'r\@�x.>P B2b6D`N]FyeT7(X,v]ZZZޞvwwY e)}pБ*ÇVK7lnn&Ioo&Y `vHSjz\36%je]Y] F;V˽,˵GNӹ\.s#Ţfkaӡ0UC'6tM&TVB>:Wonw2Nh6u:]"v8 [�L&o=( ٪Eynwݖ1a s_9�e(*~`\ܹsO=T 8vX8;*�(\nӫ`L&1(RT?и *Պ (D̮Z`A\:fV .x&yfb{AQ)9`@QQ]%]*MX,Z 4KV+P`6ZϝNz’UVY"�xBrhRףvWWWq @qEYT*26 t ]XXg~nll(�eR)-*l6I9Z-niOGɢ,QVNNcW)zE6x<b-(]t{<gZ^�� �IDATZ6](PvpX]ˑ$񌏏lV>F^Ps\z'թl%Jd5v+fٓI$".@y5̼h~t:vBS%崳#l>@l;e8MM~ la]Tud:/t:KB!~駉 SI`ٴDѠsb6)'tT*Rjt:no=} Nh4D3{+}�ZV<d>fF�2::>w`@O!]D& yvWrKR?tl6R)XZ FC^dqVl^passSh4J٬BL)ؐ:9|fثU~Ztsq.ij4 J9s&h50np(*r`jdRt0Fݾ;@(%/--)rtDriT`%###UZF(. vq'J?#` bWFlAg}ty C0 J,)2&?˺EbinBpP9]uºr`]r0rYW .;e -r%X#P(>su:ԼaKpL&Is233377'[x2t)1jdxFT"&\~yQh\qڢ9DI/q/K"sUű1edm2$ jR!d2)0/sL&s'{!tKSt:V^ZGQ^}B!TUܓ`$$V+wb{L౻.]DltR뮻j>77tz+^ZZnUnĉ… jePX~i~5 �1e.vYh4ZVs?R'ϳD3SSS &X,V.97v-~̙zn6ŋ D  W#^^^栐3" Z__g܁ͻ\.A[)wrŠjnjeknD6ؼGW,+^7 aKR)v}RG!Pћ{˄&g~gy|^QNݝYzYő3}(.GxrNN7Y -FA`uJ.Frl2LcbfbZ-,PHbrnk!'f$&''?vפt9Y ) Gn7\#4/555̭V_'NHṩrIƁUx~ l6OMM!>p~3v?~}jW<11=l?dY]Q2x<6P6q\lnnfYŋ'pttjj Ó xqJER(bb&W!Ro`ľN2??H$PUnI-+A Q[,d2IʉDKocccc`2 Ds�TQ@$H w1G8ڦhrSO=ZSr~Ef)xNSA84p"@y2:#{ Ny(pJ%iQ4:d>t]zOGѵ*aѭV+To(Xrsp]=u5Uvzf5 N>ODKȒş(V$l6UU<rUx Znj@ P,>碡 v].㙟'Z%GTpar}>Xq[].Ϝ9jTV]\.Ha2L TJZhZ- [ :@wѠl~0`nzҌFg?6RPN"j`hA`_2COf HwF&s\NY9uHN?H 6Ei\`G6H,4\/�yzjZYnKo3pY[P�w,,,|>55bZ$�pCZJEM!*|h2#R\kz!!]TEՂQT+QE%5>n7x>^(Z,nl|>/]>/y^YT*J%y&ʆt:Ωh԰6+7I1"O!-n[ZDc"ЩS!11T*ðޡxbQnMBAL&.ln]v鄡P^vOh* xܱ(p:VRPZvqqQ 2, ^G[!CFG-7٠ oƪNKY3 F8TnB33@ĉD;1S*_k)wywߍ;\[[[ZZB̙3w^d/說ok4{;5x<A,cIR&P炴m�< PkܵزUN%i6/ 0N\.70I2\Z-h4JɌz˴ZL&T*Ŷ>`ld) FlyT*^.X蠟 x4;^!`J(Qդ7_u5�wHӉ3H.--~zD"2rV*" h4E 1i:hj5PHWH?S1ntۍ BuXZZ,4R&\Q'''8d^ۿwS<;xx; ww}<F>u'׾?|;crpwVWWіŵ( n6v$HM*^k`[|\|#7 \,ĉRUy6Vjm4\ Y4 q)BYfY9|>ߙF~~0T*$b6L&AX,L&v=iZ$sIڗ!qЇ:ʯiG"u\:{ `!KRVk%'섣JqV7FɍFh}UC%a|s __y䑏~{׾eKҙ3g7Ϝ9S*of2;N}g??yuρ;nEA5Ѷ([L&3[Lά2cccZ^Cz-ŗn3J$my?˱J�%cg-k=p+/{co)bF=3npUqfMTj4 t, SSSdˊl9 3gnttlnmmRJ2<<h4_gffկL&V;>>nY;(JeT^%FX#"tFPlT*ŦH$K<n0Bauuܹs0}ᛝe#MK&qL&Ҹ[n%TN`P6>X-N[j;!L+++NW^ds[ɤt .<;;KQ/V:ZYUJ&Q8VVc8::jZA2333ㅅZfX<܁:1X`:I "}�ȝ=` NJ@`^PĘ,!s.mc|Vѣ_7k4b$ozӛ>O}*5RPrT '~UryV;== kΈG`[rz C/X,f)?"HN'&&XhX8y/^&܏_S) N9G9}4{l_%nDt:؝R4  BF2ld%ܺR(ǎ+JR̀L>n|2<<LGO<b1V Kr \%D١CLz\=#ϱeWVz=m vf4~LqgHeStH36z"D"xV/~PK.Wa==::h4Z :55裏?zSO=}_߿ Ϫl~ Yx|qq\.~/N |=pF0PVNwhXP3*wp8jپphxAVF^rndd_чfiPtjb9N3q-\56fj&JX`+NE0a b. E^a=0.CׯT7_7뮿{k_On?m4?O wxfzzoeWUb[Y,όX,BXOB*KiٰcJO<Q. ۚLx<.5ݨeTNVpB?' 't0 AFp{:NYz^+ǵȃx<XE2p.b|``CpğaQC fyzα^aɒ{NW|[??i9@P4M7O~?~~rooE)TQ@h46~΄V ^ Q`|>멝9m|`v@A`z\ ^'E:{B@�p ZnWU~i?\LR,[tm=VE(eX,ZMBT A}a- R`_1' qBkKSNd QM.vٌ"% 1H$Rl"$$KhJQ )ͣ?<&HǘtfTJL`֩e2 _*5Ab`.�9eX´ Lh#]jjpHϱol6e3:Kbw:d2E`mddDƞJbDQjx|ss-q\VK6RM>Z#Pa�ݮF Bz^vRe225Z,aOizŲ_~[RRNZT�:%/!G-ϑ#Gdڝ,}h2HR}UK G(' (&(fnɼzPNl>^O x{{[jY,BF+٭^{-$f�Nff l'CyE 1:O&tQP/--Y$ݕ-0SJv*MlF �%@"\.j٢VCCCz^6. +p n $'(fʺ#WA'p(g3 jd@4?t+ˈ+iv.J!͍,Vv(/Ti4Wh4KL�:{.p_ժВv-# do^M; eh4sss@I,GQdXBrlwwnZ}%ٯp@UaibjZE +h�9:44$lOUV 3mR.lP(4*<7~Y7|ߍp;>_�$N[l~_N )iJsun8XJMEDFѣgϞCDtsC@6t:˲5UZ%3::1R~pу>'RtʸFa6[V0D/˺^ML~tg~EOk"ݥjf)뫜~Go{{%wLRMozLUPDXR(A  EbZ/}i L&=cTN"H-//#x=-hۉ`wuue?QTjww7I@^'yH 7?�/Fc"P4Yz_^799h4pN`0hZI6'JFQY2Yom(> m}-5<<,yb%}Ew]b2::.--qF6ebT~Tbkkk(YII'_p,k1oDb>Ϸ-)T 4Dפ0 ,y&{\$쫜 phV6_ǁgw-2(WWWdv_҇TxLE-N%q4CsE*;ƾ4aZd�%8Q]XX�krO`Pl6vFN:lHӍNGf)\#(N766Fcѵ^{̙ jNjeYgnooH>Jr_fs B: lxx8IPÁ/ VEG#$h4Jw[<KhJrnL&c΁2FBwEd(Z(e򔵢@VY3) KKKʚIfs"d248 6;;OCv) tV~@`ccc`x\ޗvT^^^FBN={o\YYoY@AտLOO?S4=hb`L&m+=zFʒ+~Ajd2p82L$i6Wp\l,ޜ&+VK_L 5Piۥ R] 0J X5ELHBXRl : v a (7 U @dL9~;  =T0|>v)M }>'\V~~ +\.WP:cyyY]nV롃|RZ;;;x4+SXE^Wmv/"`ssVGTr8+++ jͥ ȕjlZZaj:`mIR O Y(N>dBr(*'t?lhZ-�ܛlJ:>l{iddT=oDfI |#uB",ǒģ99DsZET*I  Zr,kP硨3g8NLӌh$d,lW HWx?@% &?fSM&i~?(<ہLDQzUvm6k4o` y ^R)zcY5lx_ag8 meeE9V'1[ I' +;| M&[{M:S%{z\vA8֖||^aoA L0\@pn,.<~?ܡlf} VXn\NRd&I O HUg)TT"u: W(RzIR41mq4C@beIyE@qEه:TNk'f̴ffOjJ_frmQ!8DI긊^F"*\H&Ae1끉H"-ut:/N;[q"(Ф_y<Ոf+^qcǎmoo-ƒR #$%\W|95l00s$V%cTHdzzL$xf#50Mآ52�� �IDATɄ%Vl6$ A `0%KzzSVni=)ccc*KerP_BQ&V;::&lfG\N" B!J+1@333QXDwn4׹-ݗQl0bX&LU.FP8zh% &F(jZ.b333\s. da0z=84A.RKXgh<q~΀/$HL_(- jNXD@' ի U}(Xxh)' CnVj;G̤Vvvqc=\T{AN<vO<y]w`ȑ#?~!Pϳ.WWW.p8\VK3W\v& :ouuI(D\` B^VWW`cc MQT%Y+NgGQ]Wjf9N)z="H)J@Z,L&UbNZGaDǦ~`6z5266ICfpgO:bfffnnNAfo\H<,%5FqM7eٟgfVPh躍)`hZPL&vFNO1As/Hl640e5 NG &R(@UUzԩST*łAvlj\. ^QcǎGjt4!ݩF0vG(c t`L`0ooosNJ6[:._ՀucmYzNeΝk4,yT*ˑH^{FAPO:f~5U3cXoVQq‚Gh4p[ŬV+9,C ܚgȲA.Qbk öXT{~o lti,UE3k3R@s@/y߾/;xw#}+_U{>9Qzo{Z}^vST~ d?{¶]r,ALOOXTPui�NxENѣG[օ \.ZAsn'&&zӧO^Muj_`gHT* 맧֜N')0nT*:nccwQ**DQ(J9oǶB\"W|F1Jς9s]n7{faZqWccc[[[ a:\y!zx6}6ZBw:L..@=hf{< Deh_t7oK6B5#atdjAQ8h^#% I&7h!)_r2dJƎ,u['bNC B^{->uT% )5~vU0;;n/=C3K_һ{llӧoB/}3y[z…|-oyD2O~رcmo{ -HIc'&׽f[�8S0QEQ{'d׹j=s ,|><'6433si^ URqMA Y.TPN7f2ΝҴlzRp\ht}}�xхǓ_ >==]*`*j=Vfq]\XX@j@4 L&v6N6m6\jbEE% h4lV%$h4^s5dr`Q߳'}0iM%UBzW?я|׿5Pv1jzH;\bhd1EYTf4bFqeehonn|>i6)Fr{T*E;)>t:֏7z&Ie4 8/`(DhKEvVښhİtx<222 t jl6CyKHlknEi ;C3LrktZҳve5bEʦU2\)-;aժnošr:n ??xΝ;{wE)#Ͳj!5})'t:VNMMy<@ `يbTZ �LůaqXQ-fSZXe( '+vݢ(&I٤lb*"]dh4=zh4={vee%\.P/--agoZ(,4E3KCx^s0ڄN~e{X-Xt:`|j=ϾBڲFErŔST" 4HlFhPka}S܏A Mq-:- :au:j:NBJ/k T:Hj`B|T�[+Ot)071<<`½G>ӧO+_QyԻcǎ}P`3 H & 2Rfkk vĂP9[,np8LJ�.EQ߆Vh4p{r<vѨj"f`N \L&vGGGvf3R)JYVl8|~ooozzUnu\.B8-7J@^C|>2;@wK gaJ%ⴽ"A6jv7MQ׋�_Ю4v1l W,WTBbQ y&̈�ۑ/"@UNNG6줇zKAעVI^O63Oj5~?abQE69\ }{ߟٟn׻|҄򶷽'?vz~W J%.LPZ&i6 ঔJ|>/B>/JDس9ƽz><< ~ʒ-j DM&P(W찁&}ѣ(DvT<tjp1, p83L66<rW;UPfs&Hp$jDQ*{SW"l^]]uݵZ (N^auðޡh4ͽދe|u=eUҗl6m6["x_Aq}믿x{pwx㍿a||-W+?/ ~l) `^t {<$?,z njҒ4 EDM,ȑ#;;;N0u:,/fv<K;P(`0yp8677AYlNSeҶRNiNuT?,KՒ9#<66 CoR'{{{F+0iד B% *C9; F`}z+⥼J M(tj`sJNNNNnnnz޵zF8쥹CA�~9;;緷L&ܑPv˵D岂k\.HQ& .(Qk+_ɓΝ١W׿~1p*sObh4zi84pЫĉOƻp\(%9/I20@j0g].~F-,, zՊF |>)v_I)eq8,YQNcccvEh j t:NzdmllP/X,F>Z eԥ_)j^k.z6-|K'NaPR$N{ы^tcaۏv_XN[̴EdMk)355^B腪C#l8rMrZjhcZn7vI@YQ0 lk ٳgQ+DN:677#}p.p(#1V#G,ˏc%>/@R[npH&0t: TZfvm۱X',& 0w9!Njnw<HBs�(fbRjhU)'yfB?H03WDخt])2PY=%8>j'g.C+~MDNOO#q{f4 `n|>$ԧ;$vBc<y|^tLG5 Vl66v.(QdLOO_p-PʍbaIAx<]V;t[[[lBd|>ӧ{h4j !q-*9&~/qyyyll M*%?>7kxxxkk:`@P%U}%[ENa<Ǐ/Ngkk)TwR8lKKKl|- Fݿq5=Rv%?t]h4uNX,xLfDjh?ShAvCP\V[i@N^(B١�ҍW|>YnMMѸh4:N҅B!Q#<B1=v5M0Dqmp QNd26(Nk}}T*͙f{{{\<ȑ#2Y*._J4dr8~cnNvrd2ɍRVjM$v0Lhh4;whb�|ω{H>&' :p@*$ˈ QZegeL7@igUtaKnepnpgY5<O B?N݊/.d"dg0NR~BpiX駟d˕;QaÁrnX,zfi4K,dns^3ۭjϟznni|P2zOBBrGq]=:AXO딛1L p8P t:nX]]]]__/D(�;KsfzχgAS+ ehD&NC d2QB@mb2i <pO:6QIQb@*fei144b4X`K0d]h5*1HRmn ¡rlRL&r7z� dbtRDY!p8ZVVLF!l6fNf<(f5񼂆P bl*}ҶT*BU\[,mRФ\́Ȏ1`.rK8kNjS%mјGl>sL2D'Ih(vT?L&A݆l4 *sC9 j\ǯH$P+PhD"\.+j 8.Ҵ eccCab3 ,PeӪ(M | = NgӁ{/T7kXЍB!^5ib~M"}Dz|\^^fm'l6kXa)zo1zEPt:L&s,ͦ:rz77+!l#C)}Ra Lt[oK태ΞV;ݥ8"7s0#Uz8Ė)eX,&z=Ynk8f@!M4`0+Vzr\UnvI=?dn74%`_ R$y`)H⸕Hes_ԯىJZ[H|rql+jxfTMuZ<wl D6Z΋Hd2lsd@2́eqqd2 ^zdϱrV h6>PF h4Iij :(pTq### IF\MCjjevb(R^o6z}$TF5 Nx�8-0^6�BRHIrfFI$2R0Sݕy,nJoCg?+ʩE1hnG%N�I(?B闔q*i7Zl?yZ;ZC~6 :IQZnccu`>*r9 7Eqbb>,G v=33qrT*{"Aw2+8 haaVVih&@S],//KW !.mvP(h4Gv:=\f裏$Ɂ{'@�`dؓe_`|RWl²Wܜ+E0R^ll{o\=CDMDyDI$9qҒ_糳) 6l/^8P39'NPRJYMQNۓ'Obf˲Y2 *m<xh4NNN,Vuttjai ;Jv4 xpggg%\pAm-cJk %D&eixHNY?Fs"l~ftt+4.4g+kC9Klv\./ ̂%5��튗.ÈkkZV$r.d2L&H?�.D J,`Y|I "N%@^ ].rj4g®)3rm[,2 O>I@\h<X,?-;iy9x\˅ZR"sEQYYv 7_+md'&&0hJE6f0ߵb811!"ժ#977&  ͉秦T ^4m!qS24L(O 5zD`;h4{ !D!Fn"Rףk QN.8%\4+`~BmkkkTmCau:N2ʆh٣\.wu466Fī\PWS(rd2R<zz_pM "wvvX  vbZzjNFQ5 LE|}S\.WѩHVVIwFf3Jy^@@2Nr8!=2h+F6fsL- p*1eXsv?JqaN8 )s]IWa0P}赯}-sRW %[Zbe8z.Q#ŋAz9}_P(IF/}"$t6,JtVWWrv�q>~B9rT5lnF \].Kt:Y5l0D"(ˉ πLNSnBJ9h&N}[%B酶*/_(s_&!n =KZUF_r=|_ƌ|_s=J:%=gs\-,Oa( zIR)Ju^k$lqvvvll 7bщD" b1Tl6�DCg6 ', (4pN@T,..nnn"T !c7A .�� �IDATGB w[[[F'&& X,A[[[+;UB?sL~kauum^o0⢚JRz%vhƆV9ou 00$n(P(`v;MzjE^SQ8C>R}hSdHg[6.B<DvÞk˳$'~>)>'?}\ZZzl6ַ^bAX/qZs΅\.gZ5r8OB!VFnn~Rjaqbz65^?66fGGG- h~;FAxniN?I`p\A@<E|>P+͑K␶t~ahhhmme?EHy(W1�jvEt:,L˧ߟrvTRJE|% Wz oTaniQ0]EGV tj?;g٪n922Bs]D4EQw2V*;RNdvmǿozW{>O|[ߺ:#yҍ f<PV3 6 -ѳn147;~x"jΝkZ(HxP(lH5 �@y{ZrRh4xN' @ \Y- ]Q6<Hm@ Ja吶aG)iRl'm eeeŋnH$N+쁗E2h@WO<H0d]h|=ې +'V Λ5N粺^Ň׽u FsNp>GcuuuyyV kZ+++Fbb P(N. bWyWl$7'LT*[lnh־l69R( u.� ~m*z^$f|>/ 5M=)D ip8 .˽=yx8`iW@D UʨĨeYGFة;99z2՛V|=Cj~颧#9?jZ$zl'O^s5fa_ r\.m4k4x<.`:lRJ!`7bh9L&y_*<ommIb{^o0[VVntE 8;;*!6~Y7nXjz\B/94zJ^r0 wHɈ~ITR&)":JAsSW}aU7 x{Wmnj4'ތm)PV,De3ioU1v\@PWϟ?Os8rheOY<NmٳAF2U\6H"tM7=:E {JZm:~?ڣ!N2j1Lx<>??fu,[\\ #Df'^2<uK^JR,Ϝ9sK ǏA鱱T*UTdJRE:7 JvQQ+>533j�>ٳBAD"Zݗ9~^qOp P{,ennϭrcJ'$ޣ O)7*&8dUʉ(oki4D9 tek_V%.{N�8 ,.;qǏ.G@~)\U`pllk^[o׾1ÁDccc/'VvVt:]8&cMMMϋFFF\. DZ6O~]΢PM`ZoRr*NэRJ7{eooE/zԏt;n6\Fi0;*pmLnonnzD"L&pG}駩GoN:KC z�JApe422E۱(ZVŲ,%uV"yP<4z^6Fl(ۣIh0Ξ=qS%Ɗ$y@iRy%o~Zǟn}xhڊ/wu oxF7~?meHl6'}iiYT<0/\`X�|H$z^]]MpjR)PN;wNba#L7 _vp8m):rxxrvlN%ZmuuuddEC744DQ:j�f\b8l6QŢ RP0F~r={z(rQ`4MIuARP$41Zm,Z s7(gžܯ nsQp[,zA֮xz]8T,GIZ-rԖ< lad71A 2nKk.QjLd_9``5҇rYeJ[ PzmpT*0߰Q,9Djj4u7mۣѨj(\ܬF`0zjúA9mn*^o&i۠`0dj:??p8arUڧytwf2PDP@ +* 80 ^Aqr2\($d !=w<U<x/ٞSU]l<:uN>kzߗsd="-CWaK @FQ`6LH$�oh 03)JsMiddC8zC[Ph$G(ĭqZ.8O9zX,VQфB!nP(bI) јQ22Xi<%m6\.'�c|>(|9tiyv}MtJB@ d2B6H$Zz5F cu$^]r@pH$B/P,a5A>x<FV%5,XD(@&% kXP(+HMEQNl6G`+@�whmZVs<,zf7B^@ȝ2�%IxMǣZgTէrhj#)ϗH$JuwX B2JG H!Cje2|6V /"($jffp8\ݖ.b8tPCnŒHBsssQd4? i4�C\.h! rR7PQZd4} ’[׮e}-t`f+u8E58ƦB^@�gWX,Ev{>'g#HRHKmɲ,BjzMV} |>?ܪ`P+Vظq,+MX,P$fhr*:26PyE>i^(}uH$Sܐb`z&<~*b+O744 "kK^lۿjK&R(:ˠP(�&%pt^x<^SSS&\14&&&xꩧV^ U򙙙iEAnekr\0d2qnll$V5 &IQ,FQp5&iAi <h|>_B2JUb3eji0 !C�~tI5VO|''bFC+Oqe2r`'50%جYWߵx<D8'Z䊮p#,PW^a(@\[[Xg'IҌTYBcofhmmExHg&#FV---W$HWU*Ukk+8( o$J1\&V*jh$^^3f-"ڵkf|>mtx|>?Hl޼Y.Avggg- ŁQ]-UXdP! dLpgeYYF,?J%9+obh jZV$WWWKYCXN{{{j5Y`ŵX,drMNNFlkl6Ч߇*j ǽ^L&s\Zvllhr6xby`21 iE.K~kt EဵSSSe�L-fzB Ll6[I漤si3 #l>$ 7@hCDB-9%Iz2nBBP)FQx`// $P(HtBb]DKRo.i\vNYͦ ҥdueہ][bE,Q]L+ `7V===x--- GߋVmiiNe^dl1g#5A@׳j G2LR*w D"L cǎ"?yꩧ�6 J\nXɾ5k X>55|1FS]]m0'*WR(E)nvvD7HD"󛚚bVه̔9566vzj_aB,zx|0>gMN&_`x�UQ/\Ƣ)V (jkkY*DV5ɔ(aX+ 822299 Xh{{{___&IRphF؄B|>???O̠^XDnuuu$jZLLL�ߕd`]B_$X EJ<Ƥ(NB�̢"kVȈ|>oX47`b):p8 ;mmmlnn0VUUjW<_h-5`l"NN=Kdek:1 Vk.\- x =rt* LC)J:44T-cɼߛ]X!..$B\DtX<F4C>dv4[oT&Հ r9Mԙ e`J&E v'DטeYI>FS % Äj4x<.|8'd60I]]].!iF&4a+V� ]DcɋBaCCh)'"Z"Y4 E鷣 T*Q/BG__^7ͰPjرcȒLD"I) tرCI$iHqCyo``rA("گeY y{"J'ѳ2,{˓-؜N'th6v(06ϯ]vrrr͚5t͹\l6ݭR4 S^/v$dYt:M?DžZ&)0﷔ʷ8}Z1:Lù)Av DzO�b&ˑ@t*7 ۇW^ TEtezzz||ꢶuu"PMVsQN* y@T W꣣k۱ P( PP(T*U,ommx<цvЦjʚ2Iy$d2nl "?<OReY\.NL&n sAD"1;;k4i;HN~?I7>>.l6�cCܵFqnnR)z[Hw)sZ8,NOLL P( N4=V0 GXY&i:+$!G}b`ZT*GcY v}rr2͖P(d4j+LT%J9aiO^X,Jh<Fc< )OR v?P5%8GÞJ ic{$XfR)Zǹl6@ jYΉh4T AVX`4TTX,bf n\ oF R)2w \R,YkhhR9I@ " h.dHH$++VH$MMM�q.D"Jd�o�M \r\6Xml+bR5H^W H766 PXjb٫h% H f Pp8@)@w1X<444==MWƓ||< =l)-F%-5 ʉD"� "H8P(l,bŴ.@ (*cH]r|5PY H$.N'+4, 2 $&I(3rPǃU ,ܱĢhcƸUȉH3&JqȀ^*NcJmB^YىWB,b6P;33K5k`t<)& Rvk#hꑢJdDS B>r[: q#ǫz=D"i4.σ 3M LLL@=9*.Wj>e(x<aؕVUUMLLd2\% pxrr< }݈Hn(®>>tĩ3 h4JT:dB.H~%jemLNNrN<h>l6[?Cb2L@�ϰx@ Vuddȑ#|U% RO&t%_/霠WF!N2ˑW=%JRGB;'Sj0o�{ Ytox%0?XC1#(phhٛpSTyi44h+URT*DzQ"QSS."^PKQNEd()Uǁe{$[n7a!H|kenJxr\*?:)Jx#"HP;f$Z1nvǓd]]؂bS~r霚~Fᏹ7999I+јJH8 g4N:ńwr\RmmmǎX,R<e~cyi+7OE\USUT! 8qԹH$Bq;9-(PIcc톽KxKe2\j=:E%a:D"A :Q4faI- E"VWWwL&7%l|>_>GN6[&kF{(7Mq%&[l+ nqY\"GP/ƯBT*!\aH[z,^snzC=0̵^{3<CyۋOy;_CKAuV^'XQw }{JGGl&5^J*644DQ +L&377WTu> `ZX,[8zsss,%2#Cf>[,o6Ej]CNTY~xvj4P,dJjwHfm(d` aYD$tTh4Jbb#Ƿ:nBPJ3-h4餿OniAD" ǚFBrX{"@5ue2Y{{;nϱY\TSSCrx$ m"BN.k$TDŽ Ç&Degƍx<IFd2p饗;{!Z |EyjffSPEv`PɤfRhj>饗G~{UVԜwy]wUW]k׮kK_G?#Gַ^={xwy믿~ /�� �IDATYԶi4UUUq&VaH{,dOOr.H2E�6DR5k92p\.gZ1= t1h4n{{cQẶld ubqkkk4EnڵJ2;v,LՅAc~```xx\'\+RX/Hjjj"Umxx C ED}]===t4Vd&C VWWqW.>WՐ}a]s ۥxgCܙ`8PPXLOO744ͱ2w&ɮ.hg2R#%mg?ٓpo.(kƵ^{5dYLT*fX,j\" f7t+J>>ZZZ0t!Yh{SSP(jar8SZxu\.WOOO&lX ˯L&L&gff<O,s`䱸sinn-wM 4f�K,+ƾN;m֭隝}ohhp4fkd2 oQ(:m6miiCILEHdE*C*jkk'&&@1/ B ;&� 3KZCCz~=ROVaOOhHM"GmAT*ŖT*}C"2T1#Y@"};#VTkX-tNG] tz>L2-=zt֭v?^y<!f2>JU E"ǪF­T*577j V*===7-T"WZ: BP$!)<22 .Nfb\.Ӄ ĪU4M fwZ,[[,leY3CV8mxPa|l6;==-L&*3)!!hd4ÁmHZ]lM&[m|>_,AP AL&YIP@X|DLPc%Qr|7U9YV>g/;+,n<v۷'jDi,DDrjjZF@Vs $f#9pJL&1 2!^CPu:]QϤ b5p} ZgE,;D!$PDACC E$q݈ /^~}PxCrɄ<@�Fi՚N/A+%;NV W&=qht:r0WTCa-j.lDžBXhH$gat:T*D"qF'@s('93A-vuAg?ن 87x㩧zr^Z[[{g8pg?%\RJ<⟨A6Nxh47+%JEteM&\N&NX (‘ l¯ s"Z2zHP(8hƄјd`k$ (<ioox<�vzz: MMMxbxABUdR@qC WrJ1(J|kD"Q1d2(H.2 \jP(Ts\<RuHwEA$&z}>/[o*wBo_"0w~?%TݻwaÆݻwk׮G9t;k vVB{Ejv;K 4B8Z>jh4Bg2hA]& B|jJ$RDjSSS�3BJB4b6;;сdM䮹'TŢbdI2ḼP(x<k4JwxzɄm$Xg6*`H>) C�L]rPU"T*evg}JJfѾ᏶63 s%,D^[pszCo'juuu.Hpì9{ȵ΃СTOJ-'&H2.˫~?2`B0ˑ"rT!D) <Ecn.n|>:b�pkt)n'I7ϓn y@Ad ) ~(UUUI yD,3<OVC+V+)x>񩾨FeJH̄"=@e2;l$DOs+J/N=T.r;(Zr1ht9&p8搅KM\M[ M(gEo(}Yb EQ"&|> snk t:a\&q\p-7G0{Ft:=uT*RDC&''S =@JbD#1V:x<DTLz\.r'\ivƚ'+.(ZK hAHrtOU-9vUr@dx$ {K(g(k"9 466B f1BE>11(\'́V�jhh ^UUU6riddR sssI{$;::9DCn~ ʠ#tggg,۰aÁ8knnkZF377SɒɤNuRdRN3`=Occ%sksY333BƊ+kZZ.gRT:!h Ӊ{$|Uv!b1_>|.5U<4?̐Rlhh \.l6ʕ+q?1 vE:: $.Zl,_80 c0v;>dF XET Zoٲ# >@*H<=2= +D*v^.G@2 zRWWWriR[.n; $ةe~I$fX]]MQfȌx2! eM{{;&*Js033=2H^}-]C KvEN[%Bg绻^ /5! D�zg0b¢EE#27Eh=B$TuX05EPWW7;;VQ+<ÇmF~P(ޡvxZۍo8ttt@Jѐ-+;Dh4a ȴyll`0hځ(q!XƔR)qшbQ\;0E=͂ԇxĴN 4}O)Epq' b`xZP([׭[EОL&<h2ZZZ~a~~fcIx) ### i^aZZZL&ӡCwkZn7IlٲE .P(ud2I-Jnw`mE) MnbN˲&Zh4 iHdP |s3B*!H l.EkRGlQ'wdy_ZvȸBAm4|>.U-JEz4Cx�&rܩFf3rPzGb>bEƜ D}։os+odK'&<苊(Ι9 .@e&.2\jH[~}Qz_}͚5O>dMM\.z衆_ϟ~ LOO_pNSOe+_ʱcǮ-[${WtMH^{.;vs9~w;7ymظuVn?ظ`NJx:&3KKr[C5d$駟.FGG;::ZjD`0H{& \uwprdh~trjdd+A l6 Vrغu+n<Ѹ�<AF.m6 xĆB|Z\(%@͞dR(6 *$x8GLci p`VT"x}f 8>RD& B#*lp{lZ߯jOO]3<<? رʼnK'xof?07\qbxʕX2%;GݼyW^Cu8UUUw}wE3c=VUUu7^|W%\r7mܸGr\r_=m6ƍr˶m~{キTByy#YׇB!@>h�Ⱦh6$P($VZrʪ*b>lIl6 *566Fk]V&JbUSbGL$T*D `0THDY? (YΉ$XJi"h4t:doY,9gC`$`>$RD"Z@h06 D쥖khhX,. u طoߪU&&&hd0b ӘnP�x 9r@@fK>p3ٳ#;11q7O|O?.=׿ݻT*f2ڛn~ڵ{W՛oZphffndϕ+W\o&2t{G=zywi}K_¬OZ__oݺ/Kw 7k~GĽDIP(M遚5,JE_i\.Wmmmuu5v{"%pZ| )6Lp6UbTFF+gDƢÇR*#D"1L@ Ġhp8 %Vv@mzjLFpC$`f^ f4ޖSSS"Hs VeőtKC#ϟtP*B8BP^8nz^R̤izrI| idd_20^x!޽{wܹk׮cǎ=w:'uwo߾}ff{y{oΝgBgg#G5\rF yիW]nK$G}@n۷Faz{vIvH$rG2h-Rm||\9YY }iz}8v8<FFZT�J555EaG,L^o @pK.4h pYr�f2VD_Hr9!Z�[�:d9ĊX@ @pˆD":njjzrr2 o <,,c VxH2#xl6NLV[[;::p8`sssssT*=p@yOcV&.San6SԡCN9nKtR8F?d2N޽{_x;VވvivzGZ}ctcǎUV?޹sFyꩧ' /"=33SOMNNzW\qK/'_{}嗳2r;w|+_XnP& 7W666J-h%X,T*A r\:s&� 0LSSP%I$'H$PJP<::jjj*dJZ.%JՃ =JH$b2�#EP(įdr o`tµ(kǥi:V[(^|Eg6E"�Sd ) ]]] r!jq_"*6'[h\T*e4EBZ*2MVGQPaH$✔J-[|O'0_r׾~z޽h .(6f566~}wYl駟~za0W\Ͼ۽{ 7psuuu>oArpr555daRRi޽{Bb1d2(V�bIH/`kjj|>_9Xw&@ #r3VX,"pRjJR $gm|m)Ml6Wc~~fz 0Na z׉F N-k4`f#HKKFd2###555R :.H;v *@)mkks.J FD"(?ƣimm냣*TI+á hUU1?+A2x^A@&d2__sNQO٬`^+HXH$mV^M/?�3jRT(b1Q. gbb"'IDMOOg2d~p"PHV@d nB+e`,o;C׼!_W '@ |, BzdA'>11Q/g566mjj* 4~39rJZYn�`lV ՁS<@[( B>0޶6UWW-0AT z@>|CooouNχ]FRyȑGNOO8pv <x2~z?'EqfOooo"C'''1g(?88 :^(:8evX ;2522HQ(6778EѠx-Uy#&�j655ↆTnݺ={|;9묳?^|v^ڹsun_/y뭷pSSf d&0̽ޛfJa8 3AB߾ѷ;vػwoSSӎ;s9pk&˛F#>`3h4}}3֑3+V{O>^SSS$G1f{殍@ @+Vfb k n 0% lJEX^ yacccerP(8p�4:(WP'I!YDpCCCpH$CuwwsĤq:N7ox<0l6#/D"=I�5,p EEu�,L"J|^:N$Y=5^CP(  )A8jh4RO˳bYEO( +Y�pil)<;g۱/[v|#ܴ'.Zf?ֲ ¶8P[[k e 8묳Jq|3' k9pPRamll`6m9}>|XѬY'+!GA ƮY6Q&(~`ƍT!lTxנË-v\j/Fc.dσ!aVTWWs+*j֭ 'wwwE"[lo \ƺ:o0@s. 1!R%-rw(vJFz<J:ť}h.X*$/'S=n_p-Vc#t蛂[nfƺ/k:묑z뭷:::x~뭷NOO׿+w?Ot2}�� �IDAT}-ս+,t/cuT*Ke0|Q D-T͡맢$qT<oQ`FࢪCJ%Ci܎ ECu,CjsssDZ5HR@ϧVY Er92H UH$#VT$$h/) ʬN!e2X,(z,jDZVB;kkkѨR B,Zm%NK'O9@DҘRwp8d%ߺ]eUUU=FGG?Tkll %W_})rg^9/O/| gq_DS&)ꙬVH$鼠+J9'\~0\0/vOmBӶRj~R&J%If6^6mB0̱cni kgg,l"P(z#7-]`0PpO$FnuݞNivZeB4OB!H$J|>i'S"d2dXY RU$I.sr݋hEm7|?3<Đvm; =3<LQγ>;00Oh.KC@50 7([ ~ϵZO'4 ,N(1ϦCE2MMM(잙QT`cc#tjb0P(֥Z6͖[640fhhytj<贡|B~#C}nɒs,UDfu%µ.:yƧ(MuNF{ZRDUW] keQ_z7nذa۶mӟӨfׯ"jEȪM$Y,ߨ([6& &_x^vllcY_H$@kis+W@ @PA|>MV0+<ē^E5po3x<`^bL)@Ebm yA1 0&P޲ZFhÙDFyD")*J"TfuS& ƩYR$/Zuu ~_蜺GcÆ `Y muuuv[Pq 6lPWW{W\tE?"k׮袋jY:att惆abN/% +Bje<[n`0 |cX"jpsss@v#HӂVf~~xh0??p DrAGl6VrQޢ0P(\�Ԝ?ʒv !R4ͨ tL&Xd&$9& Clh4 =IXTϗsr\ /n֏Ν;?Occc{.0r+T(wqh׮]sN袋z{{w}}MMMR+Vb8c=4B_zY)tPXth|S>ӕiI-*HlbA5Vx86 kjjH`DsFrb;B6STy\g:l O$<i St <Bږ3deY  i[oVmmm4ħ"W=mw6 [@VUV!+ԝQN3XRСC555*]"]Z~=D"H$Rկ*of<۽{-BRT*Ä]�իA,, A} 2F8K$Vt)#, r �Sy i+d>U(@NNN100 0Pܭonݺ^әf4nʕ+PEkBz\lnomm&)6lxa⪪*m&Yn}hqJX,V__FGGhmm-YK \8 S$ Yd5BbR&exxoY$z,+~xućx<�Ȭ>p*,:NxF@ :сZ@ 0== v"kX,z.!AIj2lQ1|H$j555nD3`d2r +|D"fd�Q J* 6v�M+BD{kdѣN 6MT.7`R"|^PT*yrkI3B!0vwtt(oBފ{d̬VkCCr`0DI>44Y<~Q 466rGt&Xu4䶔D2CJ8o GZ9oZ{{^/ #Mn߿y Mʕ+u:]/tuuquuuxV4p3 nٲh~~Z޲eK&9x UYqt}}}4x<6loV]j0SSSWh4oT*%ҺX\oذaGMP%BH$<T*uYgi`0x<$h:::z= ESSSgg'mXq,|. tXRbnj}pa4 CdpEX,٬n7LdG$U*nާTɺP({ʳ&"HPR).$:.J_ (J3*r9rMh!@oaZSSSe0͖NGGG2bddtq211Ay<^UUbL\nAcK[0I/Yvt Xs?O?_СC^VwرnݺW_}|_^vmO~O'V{zzzGш]x=s=Sۼy307;.c歷җzfap9ܴi~b $=>>ݻw9r駟>tlޱc駟3 _|lr饗:w}~g{=H/TWĖF1kP`j#[@ @3Nù^GF 8EJJ` @- v"xL&®* d/k`fdWWT*bX*rN D*X,՚JfffC|* t~ !`2fx!N)'PnW6X�L&L~{{dOOkiah4"4pgȜAO_|eyy9F+?or-l>v_xM6mܸP(׿5yf@gx $V%\ .g}v`o|x?644<Cc[niii]v? _zŊg}M7焆Z2aN=믿~߾} Ür) ?SSSzu֮]Ktt?7|>|ѣK /bB ! - =ztffC , J1NMMDwXVc̥HE#Ru ҝpghh.#G"bV+7; |.7B[EW4J!9~D&A _,inn333<~rd ?:$ "Ay.t՜l|vr(fy~~5t:]Q*w|>˅i3W0HL<1]3"+嶢~ .\樜sD"?y睷}va.={ۘܳg/xw</^zwW]u_|]]]w+37ߜdV^ fܓ(Ow#Gu]۶m۳gϏkvzGGGnٲWUgsڻwoQz㓟d)r+<]# Vk} G3X X~0UhJIܞĽX@`X2\L6V3KkX,j\'Dt*dRфBd2955UF&]jٚD"dCCCP,֩)+UPZVR#QNg.fkH$$DW(ŊBq{V+04vێ7(:k%Px֯_UW뮻^|_e2YKKnooo_no}aӂoDZr]uU ߿%={sG2 3338p� \---dr׮]?͕PI}G/{ӗ5D`>'hVr/JuܜFa5cH$ȚҥJɤ2-n*}4ĕPuuuBTL%or_3TH  H[O𹳳2 %"(HL&M;%&y"r,zEg#h [lAg8.OЊ:g{zzX#l6GFF $*M&`<l6 Iʗ %îVU*]ACj]RE%t:ݦMn5\.?Y ͋/j~DR|}Ob1 mܸӟ40;wܸq#BCCQX/֭[뙪wuСD"|n曕ZA 4PO9I8D"y'599b# NG^c@)@h4Iχ21F"$pѯw!P&)ͪT*ֽt:a Yv;N-% >x(�v8PgH$J&CCC106 8.@4 N El>M6YV粨q XOrėNb�QWC/C IƖ0HRI e/H)ymm<@<I 8<\r 7ܰz7~?q)m/ ɚlJ`0><kjjyvF&qu]W~ E3mQSNikk#pvQKK`2CTjjjl%Mjr@Xbzz: 撥4Z䈎e.ƊJnD>N׭[b@ P(PJl �뽣AJk֬ tt266F#Oggg 6<< FA^Ώ)H$"c)LF庠k9U4&dddL 3 0_jU4%~555:hLLzX/L"twг<U|Skn喛nwyW?Wj*`fY* '|{@9=g}w}8+m߾?LYd"1Pd2@.Hd2ęL<uBqg>|pJo߾m۶]q+Vxb?aN;ݹs'Nk_Z)t:҂zv|"$u#RxYr-5,T E.D7ۊ XZ闒k)�, - z٢ʕ+WvwwXiHt: <66+H$;ˎ[f=zuV~(Ja4XD uYj:L x;jժcǎ/<MLL @*xS.54[PUURt:e0$ommG7r0KT?BEV'?:\777t:i{<ΉmذaϞ=X~ݺu|s_w\zO?4;vo馋.袋.>2 s9@@v*;S3xfZZf577Dfݮ際KR9k``@([aj܌xJr:;;;;;  X,|>h4l6PHE/`TXǣ z>SFjJ<@hyFr"X#\<AX.ІҜ=ЫT*>nݺp8L荙2R�'HR4ʼ/wK 2mQ[WWzIF,WUU[V*t TH$dM<~NWSST*!hf�s+qH'\..  {<RH[tU�nONN:NRYUHL,;Fy䡥4p)8-2U5311Q[[b}tbxvvskG2Bhε'M K.yNpcP W +V,|^,?W]uD"Q0"J03 @K"`6~%USB}v@ _~J6U OOOs39<OP`͒eUVk,ch2�J*d -sr~PB!I{B97cKRł59P(D21-TlYsbp,sruJMMb\+F`ߠ*wjw;%\Igff9.r[n~? I455afbhkج+ltmz7P.Cizz[v2=TrƊtCn٢NLL[h4pX曵_E? lllf|VZEVF�d2q8h4b4"шqD:28SF^_9TO.:P?\Fޠ}`0ڭ?9izzORퟺ{*V7H$*C(ՈDE%Ze2*y@E#m?sWxi`ӡ-K_<Nc]( Tj41;;[pWŠ70\ZFC~pTWWc Bj BQ(B!�r B\0 ~zlltj4:ݎrgd29N$QrL$$ ơ.Mf3\"MT?699Y7H" ˬ9#J;'gcǎn͉e%%x;SI(F@ @"ex<n'_BH$8uh<5 }}}'y:WƂf2zd2Abvvr uBOl6<GS"lh(E/*nE!WWD~ue^vXl4[ZZ\.W(zג$*58Xp"aiSJ`s|>OZJ$q!MbNW $κ '^)%UѼ<LaիWߤo} k֬7>s7y 95>V__CF uR5MӴ]6܁^=+z1nn;b4x4LB0a{#bFzA$BUK79q3>Zx<vNf6V8IC#J4H!xãVR tblܸtz<gX 5wzLe:E'V5 qaQ) T`rč�� �IDAT^m)n9;X",ZTZw*dێ=qƥ %mO\{>O>gDW_?[|~,{g\ ,Ĭ[,T*  d<dRRHAƕ.+[Cۦx<{) 4KBluqpl6KBr' G&LR4]prJHT]]TN7;; d UV~[fYR @[)bDcSS(e@Nh4 2S5MOO|>o4ĉrZL'tv}fffAKЂ\.(SK%Sd:;;>M6A}/NoڴI.C|]]]8lۍM'xb"X,V(Qiii)U͂apkJ ;x%T*UMM$k.eY9noo_Y*KVj$vnoo)_gH$xQQ?ANb#RY>�aξ>N' I׻yfPojZBAgƈH.A`jlXbhhg FMMM$FL&'W>U.Q,ʃa MOK|K%_w"KϤjkkk+\ѳ~s9g)M6ZSRV–~kk+ǫB.+W,eJ%Q) /gYhuԼ9Sʯ'2=E"9f浼%tED.ӿX(D"QCC;11Q*I [ZZ@Nwcގ!R(Յ+[/*ӿ}zI:I'Cp@$ϣ8 "Da�QVA|A\FP@Ą%!k]]U]/t @?xBߪ{O{η,_f޽q8%˻z{{e2Ym-nP(jt:M pkXdZFFF@qg2OS2,SXaNlp!$?lǏ$HtCv)~l)##ehZݻwC?pݺudv{nnA"xŪB6;].Rfno-|$.ȥ'&&|+mc4mڤR).nר>j2˖-+JӨ -,,07b "h߾}R. @ x<* V*2Nqm|lxx8 vŭVL&#ɱt:=55Gݽ{n۶ J�J>55L&w=>>X,?NJT*4Mclr(N?0Y,_a.K(6gYB 5 P%XWa WUH^_ ې`1oAٿ-[cB[lĖ-[}/\.oٲd\-[lٲe۶mḠBի-[n.lppp4Moٲe׮]ZlB*P" - | lm\b !IiiZ׋Da$BQ(ou F#ع{>_c؊+pX'AQT2 䄩Tj``�T�V*  ]]]E֔i//[#2J B(-3lR'wN8FӉD"LbǠhx7ۗdgc$JRbRF&i||RyTd2 D}d21g(ӻTdMu`9ԛHrvv1n"h$r;>uw$9ڵ&8;+_ ͛?j4}c̏{J>; \`89S^x۷_~壣_(ڻw_{h$}͹9J%˱6q\./"O�ڷu֝}١PhΝsss\p5\g/~1ܹs~~~Æ _bP(<3.|l<{bHӴFYXXH$r$iV*#)J$Dd j=r\RBC`e5[T*d. 8d2ũT >R 4|X,Z,D0 WT@Nbґ*T.CIRr|^RVB W,^o$![u,P L3,{j5)� :xatpiOD"4dV d2y>x<hY! P\:EQh_y7:`i h4lV$rGs0uϸ\RrRsΡP2Mǃë\p{/~iӦ@ ?gڵ_ p9 {7~ 68Ο|>+{zϖIVI6 z꩗_~r8r˹ vxw2{OӠ~?,ˍHR̊}.k)tcb)UPe9Z-4Cq4M3,GBj_f]XdhT ÐX IҡJ27T33Qe*D"F/++ 9'rܼ ̑ aZ @`qqliG"+‚hizz,࿗H$L& M$2oyL׻zy.6%ϨQp!4O$HD>Ҵ%\b6>O=Ԛ5k7<==M\^{~h>xn饗^iM7ݴtɣkfӦM̿}w].}WVz} tHr8W.Y{XFIr�2]XXf" pqhttE"ݻwo߾}xx|]333*IXz :f {^` ;:tƣVVjukkkGGGkk+'qv{hXh!Īd2a}4/ffffff>lMD"Ŭ,.~ZT*6!L9$IG0N'&F:fE6!cPĶl7p 7pUWD7M>^~e˖]uU^?^cbwu<p?,RAHF{C8,HVJ vR,&[رD*$tCtH$bb4KR(4n4tvd2�ߺ;Jr9BdjrAFFL19Cma F dLQVmkkH$N6B&q8 RNVP(x<šN3bQ,QV> U.$3Wm_fC.b: !R \.͐'1>zd>d2 8a LщwOJlO=ԯn^zGOaqCյ?Og/~Xh*H qLuHl6ji駟U*MushXfs:jP∹BK㙝(Hd2tp |>jq>1|>???CPd2�(8p�Bn Nz!p8bnX 1�`YCjmm$]r\. p{B!͂<j].R"!3mha%;;; AG:ZzTO$OL bKق[D IN,D(l6[)uy<ުU.RZv~K/~DO|?^~={my . } +G|J1K5k֬_fT2ĒvR)@Z [cHZtB ¿}>Y%#G X V )&T*Je4h.XlYR<z-g2֯_jS烞l4rTRD"ccc~T*Jl-X,fffU Z#("8' ²e{R d]fR^eYLkkk+JuOt:!/d!-˵Bjr <\.Gxul"'kXVZcQYRJRT\bP(LR>|>T*զM^~^x}HFH_sCrKsx?8swܗq R+BJ `jhd:_ 1[vC.3'|;ȵ0q #')e˖߿_P( \v={ jffiL)r'YQ 4utt`zxdI&%<LLz{{wU(x ىs h;;;E"ў={*JPR{Xx<={ȇIoTkkx\cGA1BfX,x<V ni :-3'vZ.;33G366L kV7Fd(bcqLhz2QX,hJGTjZk##qN4Mwttntlܸ1u]wuK/tx&[V.;__{"hժUon('x= -n:~=^X/{WcNb]M[DL-FѫUSݝJX9ZIj* 4[PhddD&M|~~~lliWU ^VRDD"H$V+RE"d hԚT*N,2- i@]:p�zJY%`0۫RTPXbo-Hr9xemPe"χfLNv{{{4sG0B$~Von@;L]$󝝝\.wvv3D"Dgp8N CsoǚNvL7w`�8pׇ\98@ �1s$u{R?^kJE"@ l6hڢӨsW$rVa JJuV[Vbq4xL=N3S].Y_dLt:\.WOOZѪBcUeFK6-1aIļ^뭻Zz(H$SOA|9k �/OB?bjjJRsZn#8(BRU(j2 iz2lll,C`0UeNBn:&&&})i RԨfa4�Te1soVO%\Ex wt1D kWU�;e&y<\.o b1 T*- u)PR)ĭZHR@r\ Ng*b AQg H333:.NB!!RX|B"P(Y2|Z>fWtl_PU(RMӓ`wE`>'L jh2'Q(-x|J%2{ fffડd29>>aÆx<>00;/RH$*jzlljJ: dڵ01m%PH*2szZV"96ty2ȖNPdY\z�Nu&$oAFZ- ؾ ;憮mppPTv#$B d $/j}e>ַ-/�ji e2Y P\,Jett,( );T*lH$D&hZ<OժT*&VӖ_r,"\G0Ÿ tJRߏ|Mo/jmmdhT9N955E8 &)H(FL! QH$,R;IL&C[4;C91H$p8KGQ77i>;3 `>J\#PDL&,٫2vD]=/K jIH"N'֢tddlF?5: A}>vKˇ x<RHL6Xb Y|>_Oc6ch U*E1\._de jCmixxx~~%\zjݎ6^h9qAlde%ShYVԧ\djJL&M=M̉fskk+UΉ ?L �s[`:X=h(r\,R&TV0JnR"&W~nt:,|DbrrR(f-E !E.LB?{L_[æBx9p8OX4x%Ry"T 1DBRObtvZ`zXV}>nP(Jbd6zffp:H}r|[ƣ$qY|"F5)N-uv35 L "a6ѯ�θI.5h4z=>zǵsBl*y&My^h0AmR ͺZjppPR1ѱX]b8np\Feɲp$ &F#P(jmmV###8 |@ X:!@_`j4gff* kQFYRiAed_ifFH\`04ŘBsj*`CoooJE$ g4'''~?j\~B,LvT* _Djkkg9t:H0cmׅӲ j޲r<cNX,zĵ%Z*i\|sN5W>a}h|j)B1z} tN89*]]]@0{<It[Vfi[x^V z`q2Ą@ `.\effI<LOOcv\=&8qB:H,$8.JHl6F344411|^Y }Z,\.{n@L&L+ɴZ-ČљyifZ[LcE�NOO/g+Lɑ SN{`TX,*x<F^'iѾCb򗿌ymPGWP$TmcW enHre2)^(!MMM.ncpYCCCs̴0R!zx<UU o<pRTTyo+3$S-ptty /_^*pUwqea>J.K�1 \.W,C]uJ)}%I8H͆e4pK}}}{V,|.ƀ`X0gXt[6%3ntҳx4&\.7/U*\.LxX|+x<[nmmm=묳;oՏ=X.zW^y~+z뭝w?k& mڴ?I'Ս3CFUO &.%KGw ȉ<@ p:>x&tB%(TնX,/r9.lUh 4J lN&Zv{] ٌi-x<Hgvv,[:)<::ZLj^cccF@,l6dYYǺn\B`xD'TwQZ%r{O�� �IDATxl6ui9َN(jmm@i4ôi*JD u?ΜNSH4X#xӯlE.K$2{*~$"qK"x={vRݻ7_>o߾Ky5U۰a'>T*u7~;YfFsw|K_b}3N{7^|ŋ/衇~閖+^;~,`2L!(!iuQj eIt:FˬV$& P5X,l6*>033Z'hhuBsss6.%KIlrtJ%@wL"444SSSljb1*e2 0RT"GQ_1hCW(H$LMMiKB0 〘L&#DxO,C OP$L&3== `ffs8&q ?0޽{NLLfFI_" I$RvBS("I4Je^wzz:ˡfŲ,CTjZ2�n@p]_U^loUh4- IRY!^9b͛9CCT @RPH՞ʧ?M^}?>xgӠW /׾vw7N=ԅ /t}W|\???>>>OvdziӦ%ʈ{efcx@#d}jR̥i@JXyֵ MbQR+pX(ݮP(HP63A1(t:04[1{:.7/CDJK0ĺjL&f E~)JhIPLX,V%(J%t`jJCɼjD׵7Zɇ J̌bI$r<LN(L&Z|2,HRH$r'vHaru:ǛW( H; ✀"Me@Th3h1tGґF!lAl6[D\~ͮvN͛9VQ5]]>gj?U8rmTǾo_$EQ[n馛zzzNcl[n /?HXGGG׬Yf͚?ffHnfs"Ꟶb%j+ q& f;}sDh4׽Rh`0X 53ekP&A G2Bx<Y BVV$=H$KAHV`ີ+21|> V$1es�M---UD"+W* ^}A,S(DX,H0`FdLJX`F#3N#O\.lIZ!2}[3U?3.Ճkkqozm۶oj Or}na֭*Too-ܲ|r( <?BY7|k8f1f20|>_E0 'ٷo -S=82BE)d.F5iYrliZT*1OŠfL&$/>rwtt*  XVdXꮪLFy" 31L@ 5:^h4:558t~Zj$|>d>G>ojj ,߶l2p8j r#0pZ?)ϓ9�*&6̒\.WTKvN}}6+7Ha[Wgٺs/wue]կ~wgG~;cX"z[r:7nܲee]vm*{DZX.{N? 6o)]zV,koAb=r6* ݪjmn̦nnXR, VyJ<< 0p[p!dooo_reOObDU) h4z.J pPSSS~ڀx=<\Y#R4bDhFQO +~&!|+ 'B|L&;Sj5'@ުhXM&S.v! A0H Ra4Jй\.Vk^YJ ]vvruL&9Sωf2pkS ֆ'#fmeʕg|rܻ}Ŋ|>3 >S> %wo|US*^{9眃Cmmm*~g% ]w_ֶrg}!n%\p^z=]D܈)yIVa52 GNk �3B%1VTL&ra0FGGI!ԮPZ 0Cnp8sssR 8a`0cATTx<2LVC_0P0Vk<',"v.c0Huf2b>דּ*r9j4jM$cccSSSwiU7<NW,'&&@A@cRbq[p݈Pi6xDn܊& v0<QuU<zdrffտ9q;gLp[GGt&׿}_4 z5k~_~%Jbݙ:R9nۍ>b.ͣ"荎l6RI@9]]] %&l6o%twwgѷV:599211% aFCQTwwRbe fˉlFdc{{;z"jiV*+V0|~ffPQ냙'$7`0nfqaY;s_.Zd<N&˖-t|a4m__Q*:P(NJ%VU p\X ΩP(Q13'a\&> I&s{ppg#bb,Hvrr_G9'sǿvELL{ljWSO=ux|nn;{=]]]J+|sϺyýFxy fIvB!ÁFr<77 m.}_q"wx`Z.}"Zb$J<KȪfٹ9FnZ=33cд](cRjǴ~Drvwwp"[(0Y,NW*\.NIKTM󃃃>500+.Ήt: aHBx7zzz|>Xq}pڰY1SVUVٳ.FJ͇;lD"蘘@ JR($lliiYXXd2D?S+_dg׾>"?f0:;;&Dى4>O^|\s֭[?ϝwyE{G9 ZŖ!¨K/�`1X@?@WEE&)Ri4Q5e64].G6]XX@={0NֹT*l)Ez J[B=f|||---h4z<P8<<WXs~;%"WP588HE4r`G-JjN}kk+Ht g}vHeYP8== Q Hi޵k4 \.zLF l۶-ˉblhr5rAfڻ'QV\x<mPFĥHL*M[y꥗/~ҏ5r)]s5\s /+W$'|`}8L*D"qo5|QTJװZf0h <00\iTE">O[lT~p`0`5Dl+ D\.k�!P(r$RjHTTiz|||jj*d۷{^D.3Ag&7 m6N[XX'-%'ORdIU(bxqq[PH$1t1~T*ϯ_~ff擟$|믿^,^<2�i l6&yaabR7'I$BP*X}4RV[MRb!9C,�SN9-..n36yL2<\.'S mkIy<T>a%$FB^{[4rN;L&P(<r\^D d"Rur:htvvp�#7d& h4 ExD 5fz .A"J%,ˇ jXL ;a mq BRB=Lt:p8Lr<ϫT*4A7hZN VܬA )5*TN:餞R9??]. b(K9Ld2WsE*ˉ0&!f)yG0!w˚lNXS� sZX?=WY RNG jlb}>\+(8tH*=O" k=Qb-+ÚXTpMT*lV՚r4MGx<I8B+lt yto#k255u%I>/j!Hʢ:- 97F"033c2;PH�]X\|XZR"@4 U$QTtb,yXL@<; v x<MӠ&ºl4P(;́^8|[[D"d\.F" ۇBY*5`0H4"4_|R_u!=a5 AesVwa8׿N:aGf ck7RXVF388x40̬=cTJR(a2 uv=ɠ AvP( .T'(l6/..ZY[l6[ ꏽ9!YBbIRk嶶6ttww0�h!EtRzD- l0/DмfGFF2@nnLR<),..VU^d|>aV"H`&jƅp8t|>’T R*�QT"�Pw;wD/$ T*m`j$B^P04;XrMNȒc> x#qNGnA|+/~jx&>mИ>loNh|4oKSTB^HPrl!:מ+*q\R".JLKqOJQ=ND"Q(BT)l5 fbX9ؘVdBZ:Brry4X,3r\.I'Lϥ(bE4�OرT*eR !j:;;VA0(I" ]R9;;fs.mCtNNNd2D6+R\.SlQ{ BGY|+L|>8rrw988s~BL&3!q(\D"0lTG fNd`. Y,H$R!ԓ y?\^~p:VU G,u(H$J}?<!-Q n� &ׂPsZ|.S醱MXK掕a͚5Ht:T*hbfzn�.A b||@rL&wJ�~ ! :t:].b6 fȭz~@Ol6�"hh-7LNNFiG!iK9εZ-!گ^&l6K$ lΦR1<t: \x(v'˗/1�&ҖKpX 3gJ6aw211rjucXwww>f7F!j4$I0|ypN*痿g9q#X,:BGcLT &x.188X(27yX٩JA[xl6zOݎYTD"&c`Jedd+5j*jaapH$FhВH$v؁awx,op`0}AeX* Y].grJRPΊb\>88hV݋HiZTJYLNNBe`us\kk\.@ 6鮮D"ꫯ`0𱹹9̮.Hp8:;;ɶpYsRn5j* r#TKK uPbPT0SAG[<>S7HV* MK*?<Sf+g{&Qَ;@]Zv̧Pm?C4pV=hڞ1D"! _�U*z8Bq8f8{O>{^. ىxX,v8jXSN9<Z?Ot:bRpD"7x�WU2q+&''].qgX`(joo%koo/VC F|KRZ B4 J^ry<^{{X,Fbvtt| vrGFFZZZ D"YbT*|J%^Pd2B 鐽{߿?=44444RzL&+J%=TJ�䉏`~2H6 �6 zB0N4x3|rHիW[V|:kzNooEU_+6QMfOXn֟H$N;$} *ټzf2LWUah �෶bad4M3_֑V+ɡUV \.;NBD\.w.+qІ|5kl޼xA41p߄JC:ئF]"Xb(ɐWfs</ׂG h4*Hݻ.˃ I"Q}a�թ!THRNC }'됑D76XZZZPؼysX=b,~?c¢u:]V]C�Ry,bl'F:::V+dw4.9J7SUʵ׾d[nc0 ˖-(jppb񩧞={CLY@ 8SNvM"h4gVI :H޽_*]8,NfXIoD"9bU70+ Eg AXY�Rt/,{A1˝j s88~ .BQTd2V]XXh4yxxX&AZLtLԔL&rKR|>? MNNB!t:,q!htDSfPR~,J~?yH%\A& 8-uIVtx<r4bbAE J}fCCC�HqFy<VObyppwݕJEVAf4tNr\;00�$}T>V@bzF$>圪Uty<+_N;Rꫯ>C=ܳz'O=yFEszov(d�� �IDAT7?U&k?'?{nӦM֭s\p'9 ޽{w؁4E]ۋl>qN_}zzz׮][n[>OOMMI$o= ۶m{衇8.}1Xp2 M Bj團DP(j KUSyR0̡, { QfPnjI�UC˵RAPSJɤJ333Z6#%H�Rxxd$E ^ 19 hfmJbٱcPaGDo(BU;�hhGa( H$zEn| V={v'N: {|kΝb*#x<D* D"WՓN:) \.H$"x<^X,h{re2Y0_B|O1pN?3EUu 74L*8vQW]:/SuW>#f/^O; C=}O}S2E]Hx8p;ywWKRno޼yI5=^WՎz~vttvmguk<=EQ[lٷog?YJi&C+8 |_:u\P?W?񏧜rʺu}~Gx<6lx7|M|+J@'_:#KFj0$} B�T, Y>MӵJԄoTȁE\Xڣ,L2m}RO,~HP(T,|i4=88&@@_A+ˡ؝L&T(3JR-*&P(� AGfoff7 (mrrR.\.<՛dfgg{{{, hAfeˀD"CCC(vPV9NTg:qibFa2j4t:+ qv-Od2�M[T^$<JH$|>Sw||[npǽn3j)][VN:zg륗^[_^K~ӟG_{>v=;a 6{Zꫯ|׮]_믿`0D"o //y)ZH$㏷+%\jZ;00pw׭~_tE]t]wݵ`0ǧ~w֭[O/⋹\~9or]~p7\~导͛ZYΣuk\<gcFB" 44x_bꐽ:%2~A&cj`f6opl ZP?tRT*zfgg!B!\N4r }}}C?P(rt5ByAJh+'Y}4V!WTHlN&�i飧Y0+J\^XXT*RAj mOZba@maa!L(Daw.h4d3�fB N9??%E*4 tfL,r9U*"fbnԝWJZR&Ol2;wFQu~a4O9}/wNjC fovi?[o?'~6|>|ɏ?8YW^v}K_z;sll'0?8ZjO>䷾z^x_׾FX)I'?sgr+gaǮ:˵qơ]v]z饗_~LGo4jQ;MTl\.'jHhZxRT Y nM !.e *g2x<\.{A$& {gYCA|tEBu- \jBF7vffdHKbTZ@ "d(D"^???p8ZALT*A 7j5 4 >DJ%(A>rPDr[.KFA�G~?Tt:~,+܁z@ سgO.fuIuzu'!܏xb"‰ 6>#O.ޣs 89z+W pUW=#G>wvv'tu׽EY,9ӳ엿_n"~_o+ T*%o0>>>11zjW738#_uU$!vܚ`Xbţ>Lm+==='|2So5oCo~N׼^/ohu rF9)">Iu%hx<AO3lv)M0Dǡ&8ܘ�|\.B!Db r^bop9;(EPf�dI$t@�bh4333P WNRXYJB@ ƀ @VjxTfMLLm{h"BgZj5@'HS|d"@'V7Lj#TDX!!@t6BÅuc!kbH210ñXS6qVvfs/<?y뭷^z[秧{zzn56@pI'}_~k+'%4VvEsss@` g#`~jD".֢\.L&� 4Mmpd@ JY(rLL&Zq- 7` P( ;w, ڎ;PtTJRl!\.&''A$r+V@P(\z5~(XJ mD'&&2$CψlƞC(j^ 6_^(4 . }}} S@ 8;vB&DH:(4\,!ڋBT X,d2 B8 NCk.U.s6& ?R1{W\)B01ڵkI SI|z\ L&52iKL6NVTƾ<_ו+WxNJpp"�PVӟ O~njر#T*E"vp8+ (d2nu(}n۰a$_+JgƍVMo.n`0x9Hsb4~^7 ]~^z)GænXsxpBx֓ f"_rHFkv7y$A#�ajj�X+dF2B0;;;66=n۶-Fdfff\.TeO;N: Txj3 )K$^,JJūĮ]J;B6 QEYCJn)\ \WLUU@[\^ԖBaKKK(zF#ȶmv,ΉvA�ů[\\D L<L'&/f߾}id"sɃ&Z|R ך۹sg8nDV\.lj!Q$[IwٲeMRD}qIiu%blƍ|{ynjFL&{'{= .~7|365w}7o{{Fksƍ):3z)~==EQ7oxtPjvwwcvyk}GQimmEsB耐3s9}K_ Z>O"lquttk5X>ϥG}zN{?(zO?JG4 Ùď%x FHV9?YYXMf܄64--3DI5~JUiv\d@Pz<rmŊ'd+Vh4o߾5k֤icf޽p~,@ �.V(` ryhhL'ىb8GO>IrY"LtP(GCjE(�8|GFFnw<l~݆ZF<11f1X,A2)aSK:rfgg[ZZ&&&VkBsr5Va21 D2Hݿ\gl|0*/?ns{iCCC|>رr'3Ygn>]ʕ+|ɫn׸\.OXXkUYIv+j O#iefi~~xPiJ&x&@l#qkk8F@.YvvC;Y4ݻwe'D J, ȽV"Ɍ2mmm|:R-8jI&DX/D"a4Āp8~ٲeHK¥&y^DHYOb$;x˖-c/,,D"򰰓^!Jmd2Us@zd2Dx<<49!H}>߭\7'ֵ1$|>* &&&G}]H$D"!&n^7ϳh78B@7#Qp8~. @<66DH$@`dd$\*zJLC=CtB3NMnĆDccc<O&1k %rB qR E$z^^ Jo4 A[|> Ljgnn.L ra:_4 E&3Fղx93C%H 91XTh ҨAN(5, xĵNrwsNftDKv"eD n+ YDXҥ&LdmT@J"R�ft:41P(h4jЛjGGGǎ;4˓ɤh4r%(?k"ho8Dӣ($"^p8zaaw^V,MӱX 4"ڳX,B\.*N3HԺd: B&MMjuffi V<̂`;,I|- uYHypNAP(q)rH[5�Ra$B9 zG !H83K>Фa0x>x& &sv۷b ,+Hgtʕ l65\.|d2=tcBD"xLj\@A4??�Yw~~!=,Uj1==+ *Nd��%|>_T"4\v-zc?rT*%hYgaaH$Av64m2Si4gy5sE"&1R@H NRx\u;'ш2wv'}7NW(XpVQs#\.XaXzj Xf Q>h4j5ɰEDHՐpb~`KI˥R)1ևQR*r|qqQPhZ`o CWWjdp$< WуjGFFH tA(SQ\m\.!$"B`)oq)!vz2H$aϞ=bLtAnx~ƍh4 ED1gb1=& ڤdh;RuP`bN9sL2u,:j.NzXu)(cۏGwxO>6;00D4ib RA!ݭuNH1%-*J1cjkkǫ .dq!H[bR # '$r@=,c /`۷MޑHX. C>Rfi4H4;;$VhćdMӧr!dTzt:}BJ%2Z[[$ Kd2qD!V$I1002Lhx -gde\T9vuu3=3 YWSPUЅ \ D\EPuU\aw1,(0HrqTuMπ0`??S y }Fa%J"17V�itBVѣ"r3\ 8j'gzJݠo+{2:[~PVUrli'l`(cz{{�;0bќsNs\^,ѫMu^aᮆgff \΁ VF$=M'g:trB�nx<84GdJcj`JJjiu:"cp9xRt8Hf霟t\.3>(nP(J5NCuhl6v]"jKQr1";X,2΍0Bfà#&p@[6A",Z&\T*+ iօ s"|?YsWe2Z#nIn:cAsaafxR,k[6dh ߿V=:X,VǏ9BaF@gP4HvQJ!uL2$\:$˻Je h4h<J-,,Pe69Wm6 ;fs޽jj5d:N&Zx<L&C}ZH<xYh4 o\>? Ńz|>ѣ$ob@9xN?-[y:U0&I...O' dZãW8dooLo S.l^∻Nk7qurorJ&/E6:::99󻺺" Rfiuu{x</aٳHL#lp5\B 8V4XXX qC\x P:聎bap* Pfz>22vVD5B!YwakZbAVummriDfTT*DCl6sIjeen{<D~"pD㙚!rݸ\.M(zʥBE86 mV D?Ŝ;o><jT~oP(D"Ӈ"y5}@Ubd0h6 �^jFBd2iK' B!I >u[s}饗wyW]uGywk.>Jtp8LЉ P Ajbv -L<x_(K6aa4n7]@"ܹs#3&n :Yx-CZ^1Ec:$^PN5AДl>ˠClF"ε XE1atOfq@*B)9&,GZ|~<xdR:Q`.b@ w=ཆ.rPSh4{< %Kv;ԞBPV /x\4W{QNglvRA ܹj H.3zr(Aޡ$#!rz~mm!Hىo!}Tq#'�� �IDATc`@΃$-;/6\p1h уY^%NO65??w�OyW]uܧ>0NHG"~{ݶm޽{/袛nwm+o~󛄱V= >_X{.tM�p0Nw_t:|ٳ[_lv[[Ocbj43dfGZT2Z@j2`yh44MRA[x�LNN B˅n~\2oLV. &nBf1bL&#$x�J"l6vnp8|>j~L$D>[$L&ɤ^Po>w8ccc|WF#éj3s 'C)H@[/D\^YY<d2d20¸u D" jLF?1m8Ǩa-bXnCjhG?8+SdWv/>s<_~o|\rɯ~0?,.JMk?W\ o뮻>졡'|2\s5>Z ˹}~饗.7w}%\b}_6'4_XOw4:s DRNKRbVZAi4|h/AKjuooo8.Gt:jZrt:@ BRphn\d2)Ri\Et: *xz?xВ Ir8xSr!5 g(RiE"w]XD" d&!p2d(jiiI׿ePA!X! up=f)2:tsAcfIX V hhDND7Yt: ; Oy{) 7'ɟgNµ_~9x@V_}շ~;zg<x5o9|͋v:Y,/~_~nW_}' ?qWXk{z7x7MLL\xdC.{mn 5@;N_JFvf! cGt'f<bRTFGG=rNr!pTd2nLyLdz=Z0MOOct:r2^imRYՊŢX,&_t8Ъ@dt+4XJR, usVz"EJ�dzlHT,_}Ut:YobHNMV!EF(* 4Y,@  h}FL/鯗5܇no1Z AC#hVToέK/|K_L?=sYgB}k('?7}ٻ .׾H$:묳<b?'�ݷo>묳n݊"|~F"z}1S>|+_wW/iR)D )B(7aAi OO�!CCCGǑjr{eh@] bXPhZ`Zr盛CG&ju~~>C/`u<|bsP*|s9SJT:n`V�EQ=H1<7\VSR"h˖-b`0`5ҔD")x_xP(RJe__\.sy^j7 RD`=?b:3K,ƕ[Xt˅B!JT4 mڭ tf[K=Ӊ صk#޽{7~7~i<|#$x-?M7D%ݻ+Cv:lfw-˿oB޽{Ԥ,<ӭj1 ۿ>{`⧶ Ά>ֹ]jd|__zDD1)3Fj4333,%:K0jQCCCDR Jh4:" AھYo~\.@\D kZߏbVpR(W*˅v>$<;?h4VZQ*"WT}}}z}mmM6 4 *P(Z$ zqz]h"*5 璁{m;7p$&tz}DlVՋv}~~4WM';+?c=c]w]֕ѯ}km=p�Jwq!Vo~sttg,}~ѿ6::ze⋣oom:VeDNRt||||||Pc'ݺu+:ZNZ- omER&.d2 b2Lj:$p|>_<?t2uP06axbpg -|ǵZ-YXXXZZ(sbqvv-bTh@g+H~ 95͌\" v\[[D~nn.NܹX,B\. Jߏf09EyEJEQT8-^sN3nwuuAa%,䥥j.3 !> 3HCCd``{<7@[ەI&}s{WGFF ;jZ5H$DlIv0eٵX, <枞SO=d$\.\. ^o߾}Y,'> -7xVwyN{pX,N*b/}_?я\.Yg jCn;.gϞ'x_㏟lBQT?IDY:t:MrÇ>|a} iGm{q\Ft:nP(lE8T*Mn"G/b">x={: P$ zs8Ncll`0hZԖ|>_Rٶm!(q@>^/|FfddGQLp |~޽z bq<!]lNTl\^ZZB%  \.D1 d2VEQ-N&+++j%+h4l6ϗd|mFFFF#")z|jj XAr8e70޾%c|>YlAu+<,J ULli|7pNj[o5ͤ|P^&?O�?U(bxdd7V_W^ m/}blh /9zH$zѮ[nuxx&i]wg?٧~VJ9n2nÏ<n: (֙jO2KZr( <l6xy:UT|>۶mۡCP)}J]* L&o>ңe6Sj% y,3p g $!pBaP\]]-�X% y-:p+`0,---GGrqV$,ջ]]] bQP}T*) :;; {\.W0t\`ZpN XDJ%\}bn:== FR)Lȕ. pZxme#cG+z~p=}#+ϙ@wZm^\Ž gјfz=c5x:Ե^۲e/Ѻ?_ӟD 7p 7{�d .ϧO~k mY45n'aFcaaA*jTv0X, IKR1Vܬvrf;&>loo/jootooo2$ɢX^^N@@Ph4Jqx\&A\^׭V+]h(^xryZ% pBr8;;r =9Nܜٹsg^WɩbvzQs$SCCC J+++6-NL\.wlW(z>ͱX}Ab@JJRR)cnR0RV)Jof3EQBAT"Ed�'�9f@zEaX,Po۠tLqdgE*Ktiuww}w3!8 ǵKkUmES*2ie-ZMRj]/3)Jt)arH$~qqm]VpmEH񹹹9PD`0ύADbFr`Zjuk^&!0x=== bzZr*F4m[GHӈD"c2 tݞN޷Z"¾RITZ@`h4l6RLh4 ][[JRi4@@ÁpXcj"h+ȣm=\XLJm6X.~a[׿~:Jy^{mjj 'ՙL <`00[Ypd~n21tgT �C?A(ue2L^Lv%�pa"( H@ >9CZSL("Ș@ @RH$IFQPHVWVVZF1 D"(⹳졡۷ EAP(Rν~/--b1(H$RםNjJ?<P�-Qo@0H$[6b$rxJ2ZNkz  mKi,N"!<Rd`BH$j{D"}>JpT|Pxy);rXs= lW]u矏d2]q=v<yVjp(h̽lgX;<ǃ+I3Y/%FXl6M$mq-+++Euuu]Y/ҪD߫ժVb #rC@%!# \˸(Ӊpfr9(Kh4�Nӄ>,p-XVi}tt~4+ 8SO=/H$Iә�\.cЗ#tc>T*3LWWڑz �R:u>uX;וdFjd2^CN1оw& DdwN}PpLf\@>'nbXv�L$hf̀q`kxdJd88,b8,x h%P4ʘ{~:c/z8%Jq*J< #JuujhR8zn0DX-uiPh0RlDrY$I$t:f@4dH)8 ѨT* Y�QTjznn_.cDTV٬\.gbp8Rtuux<e:,"0*c|uPHc4 l6CHO_(ޗ5A ]]]9Q2/^I@s�0@'sb٤f'ٴ2+zX*Hn4M` !6Kb1[P4MTJ6#9J(J$I(lx"G(Z,4 t:=<<fHR.0ArӐ¹ǚESEj$Ϸt$ÁD\6h4b_&Kaa6%0RxN*D"T^T@t#b1Z2D"bEiڥGop<7͙L 333l:rj&IpS'd2\r+oԝ_ZZ"s:XM&SPXoY@{cUT.ODtn۸ Kl6 l6 \\.gI}`9%/QbMЀj~p݃Dٳ*x+:T} Bh4NMM=rs.ڹVX,B[x$'ۉ7JP(yrM"HP$ t<<DT  !|AѨT*Bх9T h4aJ%r]R3ϴX, \ ’`u:gP"j37*O}}}P7b0l1VUdڲeK glviis8P(d2R!Eoxi ^Bhp8FQ׫Tj :"\>77O &1XV7pQaC?T*wh!O?"Dzb ltCdwCW&!GVV;/v{kV?'T*XarD"144D_sl620FGG&@T+ ̻vR{lOGVN:c_$O* N-� X!@ncVs/<~/iԥI*d2I$V =(&#z~ꩧ~郃r<(z} ӎ2`偁VVM&h4Ez^.C2ZBr9NhvhHP@r<w8n.m`` ˍy<X,~=M&9z(c֭}}}4Lbp$'&&tww7@5d2a@9˕J~§cr"Ta<h 0u+PȒ%bÁQ 6ygMwNz'0|�lt3֡Y)OFT*xjS nB6TשSO=U,[,Œf@ p�CZbx<J?Iv}aa磢?Zb/*!`Җ *4+ c^zfwuuy<T*0P{VWW8o 8`FI$$9 \:rh4yFV!8==- (aC f(x<_ŢAY,V__ebquuǣ+wGehjxbO7!: vL>nݷP(d @L9W^yɶm{G/Jھ}Fo$s=uLv6;h9ާ�Xz1Džl= >k (�*JR-//W(4M(\\.,Z*J|JB q/J`Pח}t:lrFZM`X,V*&(\n<G*0١Q>* õ59vp:͍bjjjyyYTT@fAeHVmDЛpzz琁V8%*JPK HB)JP3~P@=y<6|NH(B"h.o|%bǍFEwmd,u};p8|饗:]vXW_}c v3ӳAt]wݻwuumNj(,llZnKBWݸA D"` bѨO `:EmC0k.$>h`vvV s!dlBD"A;&JLF<T ZJ\F >,D%TՖ$H$j.T\ГtEEaH=G�� �IDAT=i4 QK$DrhT"eۭP(Ţ6HY1 HjZTrn_[[jݐ'FP(TեR `ǃk,w[z" hf3�z!wk6C@ @CqوsxRp8n7!isP*\cv~@l||C^{?L*O~200pE/y/2^V_f]~oꫥRf0}ӗ%(.?s٠۴1*P(=_a&J &w֛XKd3ZƳyHl6Xo2 oNG#i+ SW(XHcY:ZF1OA q\.EQ�0to*CFR0jZ|d2IV�|>("J*!-yѢhqj(АT*Vbs8G0p8^WJR6Ng4& НKQ2"qVIRH&T(dpm|dQanI}R�A[OJR1$1KbIu*VNɌTV뷿 /p}aWV÷~Fy'ol6{}8t7 lz'nL&s-<frro?|89n3ݠlmkFbx֭88#MQ.[1F (^8Bmh`B\TqP%`0HgHd2@�>d2F>@+x<.bhxVVD"p&l6\.W*D'ij烯\.+JĂXluuNNNiB H<'NR3 7.rӉGSk10ZIC3m))!E4]^^z) -"nI`u ĮӾ}+W^׿(G> /۷3gq}p F;zx<='?Iս^믿cǎ'>AQ'?ɇz誫:S۷Y":i4C>9fR[2y'fX&rQ须g0|v6A ]z}+U]$0)�D_GR"Qcy<cx T 7x<߿b6blb~~XÁ.DupnLFѿcj50 PX ~(WV<KxtZ" `n(8NtmF(GA VlFIuъFfcS,<CzUsq܍oєbA= %ZSܝk^__ߍ7H~ꩧgkÁOr^ܹ3LnAV?cmCΝ;w/~񋬷lIhQ@~Z}> mqwҥ'Ё yVt:N2뷧_rK\.B<mr(냌 / zJ˅]"( Βg Mh6wr^Td2YZd jnVNfZt|>fgYT$oQ*rѦo+ 7F"s�•H$jEÞZ^y?PH FW@|FAbc1yO'w[(llrpHx%ɋI6uK?JG{;v袋�#{CCC8;,r]~hKKK艪)cJOTU֍A M'E!Ql6qΌF#V <2btGR.k|Z&Ba24 bqdd~+)Ŝ>u\.#ve2م^zO.;\><<|#z[{zzD"ͮjfe^P($_2#qCV Q Dv9>>N@8!8]] e&&&P+@�?t:! 8ڻ韬y<ԓ622B'$r/BRD"dFe\dcH�`fG;vSP+@oG?Ѿ>0+Jb1AGnf뱤WUt)æ02HR6Mbn"i\Pnd 42sJ|>VͫDQT + ij#UCzb@! @@ oZ\\4ͻvD.Kd;<0S(kkkl=D^VMLLr)+<xs(I$GAy.H$۶mz:n||<J۷P(OMMl6V B�zn~ȴdrʇ>O?:ōȑ#8YSVd2}C6y^>'HmZidu380_j5zfH$ cz9 'v*7? I 7,4H$Xg.><̧?Bg\>::rv<3\rI>z={ %\oRittm l;nnPn4333;333xs\j�(+++$Q jZÌ EQ6 2zd~~\.[  d sh tl6{zzHP,w^(B(r$bD"a/q8@d28p#ZAQ.Dod6zD./<ak4ta۶m[lZ{gqgر# e.+ Pd2˅xz\ݍFpFJJ l6T%l$vD"A|>SPj160@ H$[lU#0󓓓 6a0.:>1: wl6K4}<]K/K_ve]v#!K?_G"H+v 6^W.5mlOkvar<YP 95,8B|npDÇ`,KVjh4J@F"X<44sr\R Lf4r\+R `0R t֪ժv8dR,gYǃ;f!%|~*p8dT*=DF0T( BX dPIRX P\.E tT*AP(400xj ᴔJTPj8& QܟnAZ. m3*jc=�,)Fc]v|>_D<rp7T }+rM7m߾m\6}jU*ַc.];k@-}9;۷o|n[*D9|>h8',f;\>DHAZ5'N̪* 5XDt:`*a>%WP(SnCT*ET*EQ0�hEul6A.xR@JEQԔhh4j5 *JZ}aFzTZ|D4P$ zMN(&H _~e�A\6ȊŢL&#AD!Br ^^p8tm@R`|>_Uu:=<jX_/@H$mynWM/)H\|\s1Œ7m0dk V|8X+r[,KTR ҖtK<l|>sL& cmgOŒ: lo (("r\[[C0VI V@I\F5EPj5VNY,,x<dqXh4xRbP(MC\>~ Jp;4M"N b!΂b Q5;;ٿT*uww;D(1[`R(y$/K'(3G?^"9cr#ɬp|KK>vmiLxi]cn)]Y^'+ftH] rޓ!!"`.0=h4bxmm 5p(p8v377gc�"b7 tE Ar Zl67MVVAt�r\]P1z)@ w 'J(9 a(eRYZZ* `p:T p9ttB@lBg"J۪U<&t4rHtU !^?fM ^-iMTn Sqz!oH kR@۷�fVbвp�]M% IB4U#t\܀onnN&IÁ -7RiF!z &DT*DJL&# -Y2D 1aZ/.bbz.JH$83 j|zl6$ T*ɐlB՞pr9rz=LS,QB=\;UF|G&rV+F$1Ā%JHd%AzV[XT2Z =B^@g~ےliZ:HgWzҥ:~�`56om7ܶL@yt9Nf(|>lnھ` ';dQP}P(2V@e^b3| ZXYYůPeZ&9 jHi BJ)6 b4Á/^G\LHՕd�eDVYVUlc\\.w~~tyR*J`d@"H�ixt`N*JH m$Y[[[^^D"px f+td!0݈EZ\.tBWC _  ; VW@god2pgΩX,:έ[~Pgm۱D".zNQ�q5%&GbVVVca0Yt"K1<<L B |>f_ۖ Q$ܓ2 ~׮]/2s\l6NGGG]^^v&�pzWl6b)>?::JPlH"q4�ZT9W$D"|>rr,=p�7|P h>z)R(6 J:t(b`Z}>b1 pE�6;33p82p7 u1ć1344477cl=\&!2<wuu+h4BV >~#I!B  N] r4 fXom ê.W ŲZ6�o"Y0.l[ D"133.H$2FGG'''ɐ]ke-]]]`>Y (.599bck6=tMzɃ"}t:^/tX,"y  BqgB ffffffviX2n/[lWR @ l6~Gg2Ā,Z3=:33,kV[^^M/ +ݯl)q{7>F񺻻0Yoak[\/l6mVu:~#$pJmL''z7@�6N:f^G)xx^ CMNNҵPv{:^ZZbVWW;)8A|gppts\N t4uV"E6tH...kW\.W(z<^(NbLpn7n J  蘀xL&+ zNH,B!Yd2 R466&ǍF(8!@@QTX ܲe -Z1cdYLD"L ?i79`Ak;6Bf hk%0JjJQTZMUT*^z%^O89 ;‚۾}Z~،F#VX$~giʖI>!X_}U*W^`R՛ OSk AڇTx<*JT*mPEp#FFdZZZ:\.n&,]  fY g WAdf{,€M+++6 V|ѣ. 94anE(e[(*J].{ j> <DBv\# r<uZ ,B$ EQrA赫V'JyށD"!f^/:[P�j�}/RH$R4ϣMÉѫ %ih6D�! 9 Q:eD"TKRH$WWW;7 )^ve]t!q^xŷ#0;;{w<oRWO|`ws)<O>_ 3`ߗ_~[s=+++CCC/_wu<ȣ>xzzny_W.|>?33}C\0FZOբ5@"h :ld2x<~b:,` .VP(R@6 C=Rt8'Fz%h2i4gqiJX,6Jt:5B!HlR,r9'VVVJ%z֍Fcwww @^,f62LPP*hsR4k4|>^h4^ x<0&JRrL7xą܇X,F6ZN/{<>OR1H;#G'07H: EQ</JRJpbsR(?/~-Fl~~wkڃ>k}c秧/o}[X_|_~9;<x7ͽ{޽{+oy>C=tw޽GFʎ;MtIh`:Cx<Ls; (D[2ϳJ_l[9D mXnyS(+b>'KQ\8N ØgJ%h{UJr|yy247AFq$ql|>xrPT*y=t7M܍P(d0N#]X X,Պzn0кFZ݀_WPh0 D|^r`IX,v]ծb1B>8xQ4wТ9tT*UR7Dژat-akkkFdA=f#yn\.;O;;o뮻?;m:T*EZmϞ=t[֭J /LOO~ RF4(�/mZjHd2 6fy@�=7Pj̶El6g$G"rz=dal\.';oE^tEarxfVkI38 "fIQVHJ}}}�{Wрl ӠуxZJ� jS�d*d2 :("Bt:tbq`@ y#x<P w:dtdEz-�� �IDATK3_{nzzCZQZVF]*( !0 cp\b)Jl}A:[oݱcc=v|mf6۷||3/ ./I ?_}M{FFRf@Mғmemr@V.,u/*@K)>ӃP3 BBL&@%M,D&MPKO@^g|ePXZZ]p8r4 dzX,hT D"iD"Ő# fh4 jp84KXp8NhTtwwbx<=77R8΁$<T*E2gf(&d2CT=~h3BN>M �C;AJGnf+ 11]HnANh:.>At?,gKe`Vh�81s/KKK>o֭ahEW [244T&''{PZ(b'0Q#al"g8??r1=A|ۦz4;}KRr$DlX.ST@ hD"ċt,0ĥ͈2333V;" d2 b ,xb^R<uE$CTb1PH8( p8}}}/P<@&i #hZW,!w6Z6B_jpϝӻ99rw533311q3:[O?} =,ꫯnE>CCCiYWY3,c~姝vZool&#Ct1;X 0LV0PXl"ų!d SDK$h h4rzU$8'jiEP\.t%@rb1L.k׮]2@z%voo/<駟z]rSSS<AP.ǛDHtBan_� # Coon/ Xl6MJl6-˳>v-K6"|Jn䭉Db``� ~d.j [9d=u`Btf%p8\~__#XZ9uV>1k+xMq=fCvw9s9gq?l2}ѱ;wnPPպBUW]b?SOeȨBd( bXO=~=|ӟ&Z袋fpZEBT*p8d2EQ*F"`陊M;KR|>FT*ա#1fff&mxPn| x<F D?si;%z{{Z KO. y=<Z&:t7t0g21٩)�X\\, 8brڹs'D HOOj%l壣bn|uhi"ڳ>!VݱcL&DR)JXСCGDP@#f~,2lhhhll(T*Z-4HB%(U pbq^?|0 :鏸\.///##V@ȉ!6bXXtpW6Pq8܊ ֻ[l“@m wy?f[dgyfݐ k#Eͳ>bJ-[2g˖-ݻw<g(^y8<p^xW\q~t'Ae'^yh4v YXhOd]wt:t>ILHl0FZz^3`2U*@@߁z"4 EQf*5`�b24I$z֭[|<EQJEH$P$w `pp}BA$ݻP(6y�ђQ3H$!і]*t.CömR8_^^rdrnnOB~ld2 ۷G@ R|zz8`2rÇ&lDm/aلbx8(.(?a^y&:L 3F"xT)̹C_}sZ$)?~z/ǾW6;;񆇇?E]]]f&#Gy晛.1T__^{-cMqŢRMo@J%m6[kfյH$|LR,\n~LBf] "\.;= J]M7hY*Y DcD.krr2˙L&$$GH$, 0&Iф@ fBR,z<V6 F.K/t/--쑑X < !ՖjGvښjEdqӗdf9" DrI*ƭa:C"2fqr9 %ͦsI&TsOLLPq]X]]0 );u]mwv-/Ouh>[謮]@ �Djw劰QBW^T*t1D"#1FA�!2N�8�"nHRhrJtH$T*4 .J sH$X29v;d2 n{۶mXleebVrZ&H~F* _]]M$[nrL\w\R Hb<P\. [HJX$D"|r JJ&Pb|>(9G9N.�ezil6u:LFTR5"|nsbB,d80 ,hLK$zDs˚Ӧmڻi"HT9Tl6�:ش^3 p^`0hl6ǣcvME!_T*P? ]Rhd9GC͉fsllrر (pJ= .<&P(Dd2d2\.j -1 lrz{{,:~X,M.)T*DPdpx;@HQ0RBZs:�%7h4�e7 #W$q\>:fb|xi @CxDĂq - 7`jMR K >7%Ikg +yqx<OM_,tuumwM �Tl[4+Y7GzQM$x[Ø5~P(r#pL#0ҬVXb6!nۡ4/C_2E`eeX:+"}>_ec$9t=3=ӓvfgW$ P.,@UBrQ.\(,!lƲpa2F +jgÄ={:眾?靕X9lv}=>!Q*j`H$  A%d3 iɕp8,f+8pbq٬RC8;M v@ f)mJf/eG `0X.Jh4uEѾQ9!8Z-2�źJxfuK48 o166ʽz.T*',p>^}Xrh^B3F]_QVKpSTbj jǩ_dłk4F6%F30e2['jj2p#ONN℀? 9NV_vRG+lmml6٬(Hhu]dfhe<UݾsahO@moot2G ICۓ.sC`kZ4=qASA}@ޅy�r],KK18={%{+ubr?j$uQng.681`P@ �sX#:Yh:N:,aS" #9$`  tlV(vB+b߾}xVVW*RHVuuu5܈biZD"HFc1 Dbtt4 Bu GA,I&v}cc#\Q6NJeRNjX,\FPjlf) +J<=p@V*3 ,3JRVէT*s\Pt:sssi5\sR3lpi;pz=x-y001(kKKK1}NlS&\.wJb/vp2zl։( aKlQccc+++Np\@�>3PmqK(t: Z3d24==t!7BKFRx<NUer\[,%׋d2y<|>?77H$Ddq ݮju2 GVsssZW\qE(>a0JSSSNd2i4FB�n^aZ\\Dx�쉉 'r^׭V+ǃL&F3 *G~\uDA^OOOSQ4m6M󟥎B@#h8};N@ �ݏH$BH]АXؾiN{N{M+++Głeٳggff<@IcC F60<%t\.,]OǏV~H>Rcؘw\4f, Q<( M&So` xjff&h4M6P"czN:Nr89NX]={W^t: 'IR r?v%�BBh6Zp0gb0/�rD" ^. C8n69vp;w(j@W^xyP -\ꫯJRB@\^R,Znoon BPF6T*LjtS=RV ޲W#t8\f̞Fcg0l~L\wc5c LDV[kD"B{+`VT]:5KKKO=�7U8,G 7:: (ZCCC`jd2IM2U@C llGFFжSPNiOA LRASfT*`Fyy=8j* @> b$RbTYE"FrbJKp*8#d٭I FGG+J:V(MNNB=bG[(f2x Bl6l6p ns v@WVUhC }d2ԩSb1gh4 *|Ph4lmgTL&z \'&&Vz{W6>/D"a###j�W9 ,@{1va -bh3LP u]0RzOTV_xRDԩS6@T_spZ__WJ%B{L&C`0?|$lXرcyWO_|`9rduuޢ rb)DQEu:],nO fBz<tBQb1#y * VtFvwZ�) ōFSp kZ Zt!AJa6"b BCBCjX|>j,4[U*ptP2F@ j4j4htmm j\.T*!H)pZbq6DPoiFrEșV* s&r6F9J|;ATD@�*j\.t:dbJ%20m6\m"`'2;z bNU.ls:"EpF#7J/턛f{W򗿤ŝwi4O:uO~g0sssDpkk_r$|gn;#<r 7,//f8~=t >2 {dy]c0&%d$w#!AVCGl Oju&EpH8 j5XDKpxH$ԠdIF$? N8~qX\\hmmM,bߏzAf2�_rHgϞEinz;;;P'HR)L&rɑdHGJصf2U]2 FdժH$Z\\t\#Zm\>{Rk60o!@P*e;kxT*h\]]EBS`\yLf>t:й˙EDEY[[H$<W1ʴ%Ӊl"JBa6m6]2`YTȑD LD>*CLx丝Ng'ЛW^yں_* 7J=eB'xxe^'x<p5|߄M7'ܯ}kp}Gӥ0(F/[ *q!VVu)ϡ�!gd;7Qq$ HD=rЀb5DO~?FzAEtr\*.--tp8 +tFmL&cY& �U&O|$ ƿjV'\.GNL&T*N[M&YY,V"X,"h{{vBUd2vjY,H$R|>D"YBg"�'IT_i4bHEApD"\&7C d/ADݍNspr`cci Dft#?{`<[[['_p:qz_c} Jc'8VNM]Q l6Nu*8 KXV+TX,X8:bL."x<aȏEzP(d2NC27g/j\*"ORߟ0D *JFQ8lv'f)H4M6߇`�V> iZZ|>2LPp\DpR)i q\a^z: �P(z J% 6 LhZpT0ж9P(</ C&�tڱ7 QdȜ0r|k^\ܣ0Zv{Z}o6Zott~ </}C?c__rr;8n3- 46^PFu +FFF*JP\]!0LxY"X.n;P#!H $\\E' Ng2#^.  P(Z4 vz<~tSp�Rr-%pC `A A>)H: x###X, @uccT*2]�� �IDATF.9d2i4q*b@h!'xwT *JSZ [ njRډg= 6_z4L]Z8sB &�v6l6aJ1Bg?no};khۿ@ ?sURT{?[w @ Ndr4 MLR|8[crvI*X' �h Mv8>jDB]PPY4ZXrɂHPVK F#˧^/ yX, q(VU0445V *ZRL�tΠcXTk h E4Z 7ټ\.5*lソ jBp"e|>?\kĀKD"zWxxO&;zQ/j]꽐Lpb6͝W\ jȄO?v? ou7F_W<vb pn[It�!TŐF7#pPbD irƹnͨ_=Ze`+ t:blRv^OR*l* Z-ivQ~:N\}R:鶷*jyydp8D"\.oZ=R:1"H* \.wb+d2h4,N W]uļ+J4|_g0W\qѣG#<=CBT(|>>Mt:o0ߏ -BE]bZYYq8@A&Ф}SSL5KƸv]k2xwJڪv={<sw0GyV/eRfWVޮV*eRgg- AX.~`!G{R|>llFIɮ鬬p8l6M& q5 ˅qqs\Ro۠4XdHޤMsF%vd1B롒N bU "Akuuчbo߾!ݎj5Qv\fQnG'N\.Ld677O:v,d2F^ÔvhhH3R SvVP(r9[�5@U(x^aRཌྷ Сl6J8:W^& ?.C[h4z^M~X_D`"a{ASgb2?B!J499YՐab-rhЛk}#EZd3G]F3;;:a4ggge#r_iBqWr-0ZΎ|׿~gew}>OoƏ}c[-تh.pf.(O-D"ݮRAbRfs E*jM/LQ"\uU /2b\M1(,BjpuaM*v`' `2:jb�fn7 �7:tdG`rvBP(KBb*R2L,_~(Сh4 vNF`b$ ^/!F#ԒD".1XRdQ,OAw6�8. z2Q Ā98U 9}Nt^wbHM%T~ԧ>O/eO=x׻wV!G>|~棏>ܿu|>h"hw.rVI.[|Qn 肍 x<F!W@3 ^m=lqTV D&<E]R<9bq"X]]fgΜ!rɤy;ށ`( Jz\s\T5�j@I$n5 $0e��@ Yզj 7ܐd:].WRB@A. 5kZghUlv (Q/xd@4d BLZ Wb1x<ih;`1xS8oKW0zݓq{w~B& %7ƛ6.x[KH sD:ݓKX,NR "sd2J%J P4:(]@`jBk'Ht:4x^4B ;e��"sBa"^^dBc{{j"+;d;%|8Z!"Y$f|VmɄ"<™L2N:.JI$ X"(ft@S*_ q3g΄B!}TU>?==].D.+ј.[V@�GAPH< n#rc2**Nx<RIe"8awɠza׻9yrjp}z37ƠSa:j:FDXw  D,;N4.tw &*Q.xOixPqȲl`j_ՠldJ&hYydFGGE""X,l6!H{a RZER0ұ�W*Hz<&cTBe2P\:{iLj4jDn7jz*P(`EnZ\'<d2 Al6 &$!u_Sqy<^h`F(ZwP@!$\򮾐t\gwiYZ4{6b@ xmً<5:@zO4\H}% 8O%%K*PXf!ȍPIjʈ6L$9 "gМ^s]PFH$VD"rE"(7 0y!#!S AB? L�FI&?HXY,640n7B,dbwoZ~-8W`L&T*U>ǩh6H$I4r###hYU* `0٬'E]2_�" SS�c7[ X U*V5 D"ho$tp_'n[9icM(JFc2܉TM/WTBzǀ8^.2hG,KT4|kk ;QXrse*O:Nӽ ( lR*ЀZX,FQ 333pcBI,d2&:EVX�(CHn6rd)X *J?A$h4d!0PXTqf,bT*<d24xX+ ^N%IHQPODAH$"dlȋCNۉf@?f@9]_Ғ]<y_2%b0ԃ@[~ NuZu�ڃbL̾1Dehxۥ텭Vk:D [}ɘD�,64kz{Wf3s,kҦfB5o!r'd2ۇ>Љ' fvޝNgmmmtt$D87PCC|Bdnmm `0x<D"Am0!Vq8d2yux@әH$W=\xݒbJ 9hDYT677U*RjT6vJdBFSZBR{X beZT* ! CMR߁zN61M& WV{,.3sԠvwaDR)&jêM�&>%Vk[/0;Qae?D,Rinn^aJE6Aj�zrjtc7JeV5<<Š! Ţj5 bp\Hw@Rf2lXr0p>jlbu0A&moo?T* cϞ={UW]verܹsnbx4ł<i \p8lZKɌFNgkk >pߑZ699I%<ҠzWp8dTJrizKpSSS4;u'[Ù) zp$Sj \.NszITj4'Jrhh{74Y,z!pL&uH$d%UF,wq8i!s!lXv'M C$#"7z86ŬVNKvh`bz8W*U,'&&L&i% $RLNNe8@'shh�eP8t:rrRZ?5B�9W40*tp(ed$4l' dۗ^z R4 mll\}/F$~]q^\\Dh4eV �:�Awd2cD&wI7c�1N&SSS4ETn<t:(G#UL$R(LV{NNN[F=}s? NofpjX=F#MvO!) `X4 JR4``+ LZM$�#a1\.g4] ͆叺�lBQ&zDz. #B!JXh+!/j!^].h>/JF:ZQN\.ԆЋ& `&L w8|^,kZRjcx<H$jZ$x[)X"=BFKT*�A^@.-//OMMJ%BV5lTf[^^X,b4V,JWWWCkG$t:4FGGa V"wp/? 2E(zϒjyq&t:3 PRp8м SNN}'!4HOQ#G?tQZP(m/T*|PóN4N|7%pwn4Q.QBٝ(fs%@‡|لQ*wp0*pGGբ-;bQP$y4BPVUr=r$AFYr<55f@iZ\.jBzdd"kk6rX.cXvت7d2d22/ lvii)d4g\. CCC0Pk$dbd2>6xā(J\.W"f:.ϓSDZdt2hiZ0"N 06b_E0onn%T'S~KBś&S4`WGqpߜq=A7ԆL&էVz+"J%5HbbDVP[:NRq8gϞCCC(Leh4 imZ#J|>O#SOj�%}b[.2'%GxC@%j[T S'O* *VuvvW4L|fPx>?#P ru||oVR)t3g/X,2RVaߎEG1 \**z*JXd4q@�`H$hLR}qՈN)ZTjkk t{{VN�?CTv*uW.Sɶ4VT*NK;Bۖf~`tMΝ \.V+++O<^|-lFo|wO<w.я~D`Dio\ʣj\+OD#)tuEqB Nw'F%@'ͪhrX$yDoŦh`0%Ri{{\.s8 jpNNx<^d2 eńI+fbDXG܂VF`vϗH$Lx<ʊP(D/ɠ2 J_Vc(r9Hաх@HY W,A<U*H$!ٰq\/4eCCCFZ5М j:HP``;mooƐ!X,uqګ*.}�oɾ Ch6.7xnAEB2_F=3o?oOX;^|g}d2xRL{7<xűcǮ/?G? r{=zZY7M^o6U8@@M;\.0N&<]~)bτYVRYVzbd3LF ^ *zCs aF! (*(y N޾P(l4ztj4(6MF"QX 9WHy�tj$RU*lFpJ.bq<G:p�d2$ pe[t:80RQ*333|`0qT*&o�fl"HTE6>>.|>χ֑H$2 Z-H@`:=:EqʆX^V_;N/қ&&FRi4FYyKS`a  ERj"L(JoFLzRm655uȑnbJg>կ~ns:<L>O*nY|~}CrKPH޸G2D3)RJP8{z@fاC߂Sل}<x:tjLl6 ç\.Gm]LZlt1Lex3|>bJD:0H(qJo>S ;X  0djQAS^# .{a# b1qH&p9$hS1#5CW^bDnaN777$Qb_[[[؝�q�-" &cӀ%J$VkX hu]xnT*H9CةX ROx!4::~lS*F zm5`|z7CL Nԥ=v9h4hj?͠h433C}c؀|yof0TFnFA-o6y<Vfdd2x[,Tov#jd2t:Iv=Z)& &HnllH$///֏u 3X,X` ~bjWp8\*nJrxp|||}}4r dZ,dhq8H\X,`Wvb8Nl6🶶Vkl6onn&hEry^gffO>ЍHCz=ػ+TNg$cj FZxa*ԭ@vM-+fDOt=y} _=Oov-o(xԬ" ѶF!t\G///mlF1* I$`M&v]|Dnf�hut:+l<h4Ξ=e@jhAncǎn(2Ԁ \*DZvLǦiZ .C]U(.AHTnnn6 x<V,ѣ?lBvX,?y$`r(J͉s! �ȑ#@... qGQ&vA¥M'xi4 bE]a~%HD"@B~cIcg~)�8|H_(֟R 0ɤFiۿ`x<T�rR�� �IDATU-:666jaSh`VjDN&wc}};b"R+رcl=Hd!v~2zd2n]T1 ,p'O<{,z3~)q"Yp2"`hfa}WWWW),q!k4r|ABq 78p�P1ꩧ^|fY,y<^8,Rx<hh'~7T*Չ'666N<y v̙Ǐ#ۈD"h<xP 2^x?�n<}4ܓ. 8D"!e:ޛ(t:VVoyjv[VV{7B:? tq}0Har.XC&n8r#towVS08}9 877>33311'szoxgJ3<C_O7xobB!X8 C˵X,GӁH4u@(X,7!A8I C騃fvA}~ϷZ8Ef fi|@�H$ L&Z<ottt~~<ouuO+Nr tp ^rZ,NFϝ;wd2)xJb<YZ/ik6|3g߿  X,rH:XFcmm n"i[__X, CP5Bp\Mt &L2mǣjn̙3g~W*JLǫT$3wР}~X,p8hTޝ5QnSo>xk4 '8{9>?;}Ϟ={5Ō7dH${P)aVr!(^Ur:@*q8Rd0fs0L&(i/~4> jJZ|>nyj?cnn̙3K&PAeXh4M MүR,+0ɵl8dfz�&bd2!9rݩD"]VtP l@ u:-"L1D"NbkkkttkT*`x<ۍQGPDѰPHRsxL HJdZMbSH � wXX1["JDfZSà vj6N/җd1O_ޓ/}H$Ǐt:GK{P7|�JO 9IcZEX)|>F {|Zt"@ "5b6JZ `ߟ mEr"w~\FeaN@0:A6d2G([UVR)DAM ÖJ%QV8n�`FMNN½6b'pq`naJp^}`0l6a>6MnH A $$Tr9�\H`8<<rvn/r9˙L&˶Z-f2@l6;NV[."O d1Tz^VQ "CiǻzfقJ bb9Ghh4db|[tBT_ck;H!(ca!�)J(!R� \ s%UѺTWS^9j{#њd2Z=44$J׈f9O bl6՛BŨ ~9N\hVk.K&0@F;44258zs< nx<]vZkT:-+:PI94tjj4Z\T4M. ״\.=P(ku:]6Eq5LoK. dhVX4C80 D3Ӊώ<7H"H %9l@jh2{;og@�3X<m|>OLr C:E:F# ~0<a͹\.pXq'i2hHbEP~S*qfb1JN4Rzrhx<�,N3fYwu|t:]$v8 uTZVť%6aJ Ej x<\.v ͈n &,%/1|>_PD]u" ^qyJWZ `g!s\bxvD"ZœF(Hd98*|,|>uN6$Xԋi7�_S*@CA*fL&STGE2w^0m[r@T @ b{&c&AX,<7&n` (M=(ju F@::bt:qPr/zZfID:ӪT*GFF +3dzO;rdDqvLm^X,�0L0zW  V׵ZRDgddfG"L&+A.S.fa"P~X,8MO>zU*^.<)J}PLd2ФDX,FN3L2 28QX0/'9( $ B!ɠa6>>ћ hкz�g^bX,f`RVϜ9sĉJ5>>ދPm6[o �,)H422Ȝ>ꫯޥx QxZʔڅZ. F}(}IԕH$P kRm6 rJ%ƈLFFԷeܩj""@SR95559T*=!Hfy^aw ~~(BNz .`C}>VPXH$l6!M[VQC haaA&9P.(rW _n7dɇMRX<~84 </ h4P'ST1bw`δ1;]1y~e2RF?ár8ñ&&!]OŢdԃSVy[ɤ܍xC>m@fi+5.P(dX449Y;oTViq$X)bxzW8q%|>OZMw^'5x<@NBr0<n7(AxC\.JuԩZm"4vu:ĩ}||<aLr}YZ|>_>tL& %׋R-ЉbduuUPLMMwqqH%�rٷoNJqCq{{k;cǎe�"8;`ggg3T*E\ Er8iA|A{ y~"&|OTD&''o.ޢĉ/v7^P(T HlBXid&rAXodb0<y*Jp\KQ-ID\PaCd2v{,.X-(Ff|><rM&&ipxkkbN ؘ^do<9m6[ZT*k؀ZD"(B^j<?zW_}ىL&Np Nj,+ :Ё% ^ / Rtq\Օb:11q)L&vр:ܶN< U۵@;v lf H|#啕G2Λ0΋3@ `~?Oh!d'ݯ9ChsRnw[O"2HR7}?m7޶#:#Nr�g)<t:%01@Fs jH6`z?HVD"{c{3:6HB&$H,ٷohZ- Jl6_s5jD-,, CS9[]]][[H$^X,pj5*l6ѣ�aFl<L"^E'&&ZdJRtZ /<q�5x<Ac9�Cl6iX|`0�5%bp"F% `$G>&|;mФE"{{} t_ wft: fڀ[lSZ}zɓ'{7Vn?3*f>}ԡCo[s:z/ggg~gF#JgΜU 9t^$xK yPj8<O/Xn �YArk֖( 48UT*j4tS8鈐R@dXSJ@@,--aE>�I v FѨjZ[[@*R%Dr�|$In& z>2؁~?Il`5Aq̙3HY{^=s >gllرcυ3VH&333bQ׃[dRiVfЍr@ĉ╕8bLnk2 @ P(N+2Tkl6djxTUج0a#`T�P(DUۣ)\.WV{ aJ]LzL*XtsѦf N758R[onGկ Ƽ_+xWb^~p7.--t/}Kd'>_;q7|$~n _`?Oo}[/h|>Q7jU&Eq4Y]GQ-n r.܉zW(Ž88@@<HD ~_./,,Z-K`&rl6[,b1xl6)L&@ <(AE}, AjrNv\D"vfqohe[8Dl`^Z-D!0+~&RL&sddԩSp7DB*Bނ4|'I\nЧx<p{J%A%LTyh4}ˁ0`ۡwy^8@^7'o5#=S[[[wqEɔ]p|';Ç>||'<2x<ɼ>|7?Jn*w377<^韘LÇ΅'|?}]wuNofiStG�mLwH !r8B E VmVاS7jPߓd`0> B� D� :6LfTJVCh4BP]0|PhccW_e00h۸X& 4qx<Á0pZm"@V*bZTd2Z'IxD!Kc28h;MNNY֩)R^;T./ad©믿p�HI}WO&�I  VWNK||>fN2_>x}=Sǎ{w=G/~CQ|駃.H~o>pު'2z]lFxĺC^H5 >[** F4nٌRuB WV @%(P#Ri"j@ t:A$JVummRloo|X" vD֨zb1hBԈle2JS[8Oƻ N'̉DX,BY 6~_d22 i@hLNNzB  5_$ET8N6UTr|xx'N>}4زv!$HE# *-hΏn!:&ŲvJeMsN je2=<0Lx꾑Fi4{キ>#g4Ë_Wnw裏9r#PzZ}M71̗_~ν7RH$f@v8qBP`>鰁r4nY!m^ǍGTAЎ~ZrPEވK>lht0  Pv$XqjUpjv:%yl=~u:pW_}\>|6CBVcH$f9LB> 9V=fx"]:h4N'*YV@H$B!%O riۣh<T*PH& ngYZ-Hhd>j!JJRȃGFFpe2Jd]J Z�2俹\\y7~$łtӑ4#g);KkOiF,'AKT[__=oQV,Uo +I`0Pe=^,z=XyV+|$ B)^@Z/yt:]ƨ%B@jA^\ )QQD" �Cd"vSk@D7ij44ƆT*uݗ]vÁC է1 R ǡX,. B(GQ!FGGKrPזH$@@t<ˡG"g.[[[C !8}S_F= 1Rh4tZh4O,--jQNgR B%/OOO#]1/f" 0^PzGX<1!രO|~W\я~t'0"?ٹ9qԩ5*T!H8@hZQ@o߾)͜666Μ9CD"A@Fp8LD]2cB{vMƛL&Hz1?іj}S"x<m$ZTVz)I6pDT�fqbԆ v;+t:*JrIXi@Mӡ %|T*`pcX"J#Z-HdpoX4 ʭ[[[Hx<rMRhPR^\FEW.;99fq򵴴tĉcccm�d stfΝ\.ÐZ닋R[...6`0j$ 6L.K 8yH<g<hnnn^T*PswLvW~H$3iE,ؘf};;ojp B~owc7%݌|;^�>>??o|{??߅mRZ"H>J+V+Lq'tnD4HRH$d2 bo\8={]zqm h󐕃i24{$o@$xjrK7߿?NSUNQ6lJ&LppV+JLz~nnN.رcǏ_XX@d2<l1DZ+ l6`@s8?X__T*Ǐ믟h4Nܹsz&.H$^zN"ӧ /�_(yb577VϞ=z~r:2l|>vm6mXT*9uT۝V#y<7pxnn^AR$.$NN3333fcِEP|[\1�� �IDAT[[###O>dр0q훘`faL<`ZhbH$j0c(%zrܝcqqP(,,, 翩='7??Oݸ\`XHZ< n C=|�Xg?|~n#ww(f0'b9\^/zfc2۽[3͐qPCZ/<F |>? 1/WLϗdFH?2 L&3 bK[*`M{\.dj4V0&}2j|>iii||NNNBBpm6v/R(ӧOC 8\^^YZZ|G $I@Y,ӧCf)0G 3BpyyvVgΜq\VZburVeNC "t8HGTB6<<< ҦT*e6GGG_~e6dRtfv oD йۯd2O+�XcccT(@ �d2B!Thp8o{='7| ;aA'5bxss vI484QX,FOduQ$rO, 9&XPZR#U*Uӡ~>dU{ff #^͋Zhrrd2U3.N+J.kyy錎uml6[$! zju||< /,,H$)EZb,K&>u\zh=h4y<^**vqRTׇ?<:Nu־WjR$l"ŝDD ʴpqAGᠢDpXH',JRJԾxsoM%д+[w{~<2V峳*h4 "d6R)PM" "'TN!C\>7fx:p O ЁSZTj۶mݷrԾ(vh (ͮJ*Jb1R0H#'C&,HELxG0 `xy hh$Lr8';$"y0,<+qN9Zl6seeE"B,e2YGGhLH*\>m{$NHDTajp׆z:3IS2Zitp,NCUr;::ZV<D"HB<{X,Ur*f0(y<o %qT*t: `d®Qʲ,:SȇN@�&A>VFY__W(&i4 =0Ng6 7ԶD eU(`~CP>A?HEAdYW�%yi=NtH.M+ % E>P&!W>D2 nw\.4y7rIRFb>gYN˃Kh4@ uuuT*ՅA%IsNy@@xb@͠ „N%hT*L&cAJL&ùaX V<tv"HRuaaY'R4B*?E\F*eD6}̆Dzi[oÑ+ʆt?afjΉ'pÜJ>-nim'(q<a�  XC  z -U³(e@$Ά A J:yۣ<.`dGj j5x`)hp%*jmm z\^o۶maaA."@6 hTm@p-@s#/Z ԰Fff~B]OI "` "fgg;::>#53t̃i}}܆CR)4)  <z A`h،C qEж뇇bL2jQG0џnh"6Sy<z{{9 ο%-4Sɇ`釩v8#J% ɍ�c >^ tD:d/r6&1ݐB9H)h4:@v;0F05&h }VZ9TwqvO8h vZ~Ng4L"tLN:PH$�jZh',\Ш"̿𑡩r<͌n!n2o;vϷlT*JHŗKy2,J23\8ӡC.3.¶)3xJh05 D"T*9 2ep8Jȑ#dj-V1dT joo/*0. ⑘YC/truvv H$B*{!sx+BX_rzo.n@ xPqZDbpppvvxOxz}X4 $U,C<jX, Cpd� Ix<>55Jappk``@׿KKK^| jXl׮]HB絵5Rk8z2�>,dj5)y;N`UrCmjj t!Vl6{Ei4q,Ok422r*"-NI$:D ۷;v_tŐUV*]t_^S^0۷OOO#H$&fYVP`Kt@ +++ xIs4a?T 9 dmP(@!b 8 Ù7aرc;ߏ%<A*<{TZ {<L^B vGF0$mhrwp,zx<K$t3̅^8<<}vϣ CRV` z$&&IV tY2@Lv=W,CQԺo %].W(J1 iJm;fąB”χɢ\.8pxQH$! 롻p(W_}P===BY&L) H$xwLJe||<N',ɿffX!Fqbby޵d2q< 2z_|ű1Z v""3 ;H:OZH$cccKKK(@QR8p�: mۦP(F/۷Qd}C^'+ orΝ;>\(Dd2L&o&t:B[a!_[^^^^^&[P>-ˑz�5q333rvo;ۻm,-(j.pX,)۟ζb4u:F˲$�moMLLEwCCt" g[ \r\GG�tرc4>8A +[__R)k&gn7HMDt.!h B9k6:;;IW^w пX[[#mr>R�)---!k8縷r2p. qV /.B�z\J%q(nlx T j(JGGGLRQT8pattt7y~~`$WAM <.k||r:&Ind R3F�aL&C3qJRjQ`\y<ͲlHą^|Vxj�l QTur,SgSV}g9Ch4ze(%ܗ_~f /\XX w J$ӟ^ۅ4Q=묳-rD /o; YFr8cЩZӁZVJ%74mvb^W(4N&(j]]]jRTVg2iw`0, norp`Y�[K 6H$tRFЍF(\l6 O877鎒IdOOOCprl6Kr\Vx<~a͆d#CB7#GT*L&x\N׬W8,Jяa3hip8$~|t g02f3H\zP*:NefggQOz׻͉VWW/d2| _!;wF\,-OrBsy~}+_Q*~yCa~_̜uYO>>9F?׿p [cط-HM#$rz2qS&+|FjTVe2J$h4شcǎN?66L RpRR@jV( *d2AWfm6q* d2By2?K 4EuvvB۷GvR?- �$rvpHJH[vgx\ѐrϠA~ ѻZ[lt B.\DT*Bm۶qB.JEG oeL&cXR)J8FRX`07ǎi-k'ALd R)PVf:F.۷nϷeT.qf9C^bh6q+͝$r:J'|Ia~||3'Jlp޽~k}=\wu޻w{n ivžܹ{Kz!wwK${k=pc=wC]wusOV۳gO1nFxZ FZj$^/M[ |.^\\DT*5̾袋z{{ fXdYtmD"Ap@ � @ PAy EH^5)-K �hZ.73Pcʦq@=00PՐh4&bT**烢hD81@< DS"ADn bff�fT*²l2&YYYzj Z�$2/n`"XXXN$UoDlwCҖ�7e`]"' y=j[rM///s 7UO_~~'?~-..ojvmֿ7|K/g3ZH `0H$z8nJP(8 p"*1??x1ъP2t%K<vuu$) twwb/w�Qդ*ry,+D_5kјGV&)H@Α|TT2&0LZ$<{+ t: a~?c ^4DdYrZZU"<IR x=Jx6 6(-˼D3cJp絰4 D=Y%Ovf2o l|Ec<bz07|?Rb_W^3LZE}J |%bm;\.+J.8@DPlLjH6L&>44 P(N%I<QEX,Ե5^ V|n7 \.^@w2`7X>rpDA1h5@~DND<pK&d+ q^h4"mH13A& pl6ۋѣG/uwwC4)i(Cs@lȆ}Z<记a Vl~~h4Z,W_}5JkBtv"�F<v __V|+_kxxldddddq^}U8=o>U#+X,T,pVy A6 ҕcǎn}0V5KKK^!==|>P(g(4L:J}}} B P?l۶j!XXX ߏ(G:(\#x<Z82�C4)?K$B�ډ>†-ΕJ$rpuV;22rȑU>բ^h4S�j;;0b[fE1 cz`6j?!J?!dYl'0Êid2ɣ`W^ngg L r-eرcY1 yc%B�0 dfsRY\\q^vK$J277&&&�{941o@|,3H@T ?YK$RDю;z3:t 'n[R=s"b#&tAHd3,JbZp0 tA!G_qmlllǎd.FjZ`uvv6vwuul=E>/`8]B8h~"rLDg}65 DPn9њva'@xA|b x BREuE%T*"({}utt@ np bPjj:N9mqW*FVE-M+Gett_|| |F2P"�8�x \bK6x& :^DT9 r>{V(`bC4(q]@2o`cQ*xįr_f__/؅E2L$p󋋋>/ �zvB <D?6 yv GДJIұ2UV#gHZ,H3),ނ-{/UDQ⪱9f{-8o~Ry ޽'? 0{az W՞{]]]tJp򗿼?O1o(>c?/}K|9s}Ѷ?8} +ŵ5Dh7D&kŢ_IJ,"H, J~<@bC$ }ХV<*P"01 àu>&$&tW(DnC]( %= @a]*�fpCRW Y0p)g:-Fh4rcZQqB>Aim":\\,1P#>k+:k+l^:ӂt:9眅jZjx% y^pJe:׈P$w F�YdK xE2V5eDe|e2Vjwii !tMF#lltP.cYnG"4yT*5::D+?C_<2TJDV\\hN3JEhJaZ"Cq+;V(/✤Rju\tnRiOOO** X^msGpbm;\.J)'*ˍF#>|3x,3 F`0tQjJVVVVWWJ)bs9ghhhZdJXz`0(  J_\yTfHL"Wq]]Jx0@JRЍd2!d}}LH!;Dz j]ZZr\R,//RzX�� �IDATZv`0l6шVh =dH*"PHPJE8JRz4dCНH$͒5K`ӦPCmVA@2Z�"Vh,"ŲȊb~T*�9CV]]]DW:HrS8MhƓJ%:k [hWWhfy*�ڼhF#}RB,ޥP"Ld2jS(>Z+#о צJBAφ 5#孍_(JP?H~GGGC x`&31f|<0㡶JJn=Qt$RD,ˈ Il~׻.۝BPT*T]%sP@b8xRJV $~fR$f`R~ =`5͡PX,,E ,Na / VunnNxArl6I?! } q8Vyb` 0 |*JӕJR477ve4LȖ#[9pvFOPjm f~_XZjk<^7 l6sEj7͠)j'@U1 dPRjVU 8:Tj{Nzl6[.Ȁ+j7ς ?3e65z ǎٶmѣG+igqJ%r(\T*bYq:~`#mxz}E,ry'VbwJ(ZOg焴B#m{Slee㸁xкɲlWW׾}x ig' f<|CCCBD /1x1 J$[L^/L׹1ZE A;\$+ H<b~\.+ YN&4 Xx[4Ec »fNhSO:<ɤT*%I6ݲ6tsNIgS\f*r'Tק酅,D 霛C;C8|ZfYѣTNZrh&Dp"JdYS RI<IJX,Mj܊jR, ~&= O%32WTp8(p8NGDž(-$Iea҃μ?==lJ/lVTBh4ແh,}x*JR)|8447SNS"a8KKK"EXDP0t~ 43/P%zCK&t�qL]3fC7zWWW7fkmmr믓 3(_b1q*0L&upZҌH5# v;::Zm8JӥR):::p/X$p VAVBlxxX. ahCd2D^xpK 9 >ȲZ M&J߳b#L&#m,A&J ٰ@ rz <І7 *ylڬqǣ!miiLRT6L+ʮ.lR*CCC>h4jۯ;\t:H:_P�TxI$OBZ}z2R833󖈍ZX,9M#Cz&mo{I=>[('3PcFXLѠȑ#_iHq0tD"zy\v!zJXC Sz$;wfffv!^ctdNVk(jz:YC�a4[te4#G–#`D"F xwC0=\!) K^5CT*5Krd2z8 cAJgC_l&i~g?G? 9yg߳gO.;F7@�ER911qQ^dZD Q0�>|蹌T*\p;R$GKĊ" �hVąl)V(`^mDn `gE8OV-N oV&i~tV7dhh W;f4{bpN/}Kx9]v^zꫯ~'|'>JF|2 }|# <xre,|(IL5:ECM&#la @R t:WWWNO@ruRf |t\!O(KF#8XEԬVk82 ;Dt:BPSсG2D| pZhġ�YM [G-Μȉg`{dG_j.7_^]wqP߹;z뭅Bݽ{ݻ~1-a5յjJe<VPfj'+'M~`fggFWVV0_99&OZyxaְ':::H; \qX.v;{{{ q@Caj5Z20|8mG4m Ɉ2EӺ!_W^yucǎuY<u]S?h4/2 sAyW {^}՗]vx wꫯfYv޽ fWfBzt2ztK___3Z p6qff&G˙Leٵh4*r.(Vc p0m}}̶}SR58=L&CIСJH^c)6`ڽzf5v6 M'ucX65vڙ9}s8o63mݶ)nf m;3L<=RV AUkfxNPtvvN png"Ptp2&IP4 }/ onhDb˓*UTva=D~ˀpҌ Hmvر+H399煚 p9 Q7fa0* •i(K!f;&Omj>S?jN�fO|O<;vw^xryk жUn&IIHb$pZa2-L6|W r$5Q*Zj^m+++z]|XR{NlNR]9><@㙟JwhB0^6SPd2yїQT=dž0fľALp@L'clȻ|)H n[> ˲Z8hTHkwy lodR8|+֜Ng3?v:idfY;:aebYv``FM 4"7u 4 ΡDӖt\\`0 ;^ُz׳w5ZUt:ID"Ų[?}}};w*f4m aq=zt�iMyd2Ν;EUJݵki]vuwwz_կ~uM7=쳻vpΎ;u:kK}w}ܹaittOn[$ ݚKY ol6[2?;dfgg iD:!4WH񑙂eٓG#G"b񩧞X,2!9/Spr \VUOtZJjb4*!C3jjR�o jlVpRNqg d|q1 nÜNg4-%{q:yN<xp/馄cm%nPg?kِ,P&)f6df]7b/>W$= Jq.˓Z]]%^2HlVz}OO;b?!\!T*'<FBXBt\.c/\%͆K0=^׻DTlSJ[ث' x<l $ o|o\.W2,QzCX,j\Uw۶3:)Q�Pҥ:'^\N�T*^t:h 僌o+ftN7噚6jSSS Ĉ*P=HRpn7q#r nېJTd2ISZvpp΀`m iýd2(f2fgg>,KR4 4hZINڀ;!`<a9Lt:�d" 7inO$D3i,Kjsq("sk>qv4 B`0XTmyX]r%\sH+ X7pǑ5y !!fe2õ}٣j<?/py.ptt/'�_1b$J{ALFno"h=p|.//.qbV̈́Ωmmcb؆` K5jRX,,KJJGpX,T*ePWhv=Ɉ7ylm&w+әT*5L<Φ $A\jC*o߱cG4Rj\P(H$w۷oNRPS䝨RO6VNHZ,q]-xQ.銗nWTݭ4t0W*qߚJ%%Z-Ѷǥ ֥'za lj4`f0@#rVj`0ÁܜsJ} GFQ&$yAƶcǎ.jD"M&8#L&S8H$ H$"J!JBjxO$Tjbbhy'ޫvV YVt+i],yD*ffeSأɉ [|9'GiHy Z6T<-..nxv WhFGGNF zsvg2YG"=,6;҈̲jp`0!ٽ{}:D /_pd2RiGGJRC,;888==fBFhKzrV[\\|Z5vΩX, uYgޤIMBx<"*nNuJ$dKv)^^o6!IQhH -Yu:gtAR UxNr9Ww"9T oDJrii+ r9P(4n_ZZ‡_AnpuueeiUJ :,Ebpho% ofc$.6lNLLA{8',dx<.NgF!brcLjz wlh-vր.�|3Ϥjuô^7M( |>O+ÖePNpf8)N�`lT*~F-jrСC\X,TP(4<<H$FFFpC@:( <48cq^7MEE ۶m0ѡxqJSSS۶mR"zk&nhۙi<W20 f7L %wzYQS]__ześ]6@ P(Hqn[$׬ !ܤ^/PfFmcl67M">O   \(2_]]=pۿ<hG|Vfs(,ojI+iK<Ӗe|}>_8Fw; mSSSxH$L8nkWآFB2YC$Rlη_%=i87e٧~vs9 7>aydNVE]0ѣGٽ{qFxG8%g\.X,Jjf|h"jKiZ l2֐* æ"4ve}>_TRT2kv/.S…h(t0| .KVv\^TX"nj۶m?9NPT*@ea;RD*rpvz\.r3Xl9S4>L՚f!h:s$%H$裏~ӟ{O'?I0ܳgχ?G¿ۿ=9bXOOOtM{+oj~k_d?p(k3[D6tNǩjlL Yx<,LAg҂z> �~.95]2�*/xNd2�i[."oxe P`0 l6jQRռk91fXhV$B&s BMKhn" ej:[vs=K_FYYYO>ܹ?|aaO0 sW#p9aSY*sE|_?F;#{?O:G?Oh;t:D{%h|КaM Vm)Vۢ7Bckw`S>eB0??/$z^Պv MD/W'Mk + \.D$WRYT*EKKK\Z6 Ĺ:p8plT*LV2t+mXH$rdqZ,k6D!M3L&\p7pK/g\}- 򗿼M73 LMMz뭓>E`#'|r``-r2gOmJE<%0̆):]r̓mٝ#X,jm峡%_}nn] q& q &yc셇R\TbZM& RL&CzRI&b1LR ŞjJ'Q!,H0\LL&vKMwkTzZ Z e6N&,2q84?`'9? /p_r%ssswUW]e2~rz󪫮y{UW]vetz> ,l[ۚ%^1ੈJRj'kPi0x< Rt 3dJhiѢ(wr dR82Z 7\c:j&QTjpX[[jRTծ~^/ t:nwbb1Dc"H$NjbVuaa^rBDvll,HJ0d2铟 $Z83,L$>v`rYo9۷OP{mgй8ZsrN̡L紾Λ jZ\T*jq'!HVBI=HbCX,","DxRxaaHZb^*;Jj5 8o� ˲4NPjIBJ%qWVV4 F2bcfBR:T;v8I/nؓ)l6s.6W\o߾T.&nPL -oJNd *z."b�NP& ~\^^󣣣= =H&c\^Ul<AֶON& rАPxmVMNNb1Dpr\.+ x<`gGG+++lvddåR /LS�� �IDATtvvo7 q^ȞID"Om*缺 {‹9ww{ǀXZZ*J!HNTp8N-'îJݾrR24Ld@  Jjtz>---U*IF$Jٶm&''91�.cffFGV*2{m߾]d^00.mЌ V&1- /ۆ`wa6iUrae e5Tj4yoD"aB19ߌFgt:~?MhHa 7o X^^s\' x|㲃9N$ ,!t:zb-M}{pppmm[o%\q~Owho~s 7|3a"0jwjw MPwy�)P(h?ԧpy{ٽ{ݻoկ~_n?Inh݂8zjzmz"$I'ⷠk>@=CWW?\N !QBXZZBʈx{)J4LLLzt:l${aaGUpSA;JV srDT&Ʌ:Q=h˲fYT U8yB7EQTRIckX9BhAD"Y,;ݔpE9,J'ܠ{ғZVbHbO?W*^z볳մx=Ri^IiN灐t$DE>B\T#%d2o29‹l6qczz3L&S*jӳţ1L}}}"ɛ2l6?,X$7͖Dm%ܶejERbqqV ;VN$qrYo*GMm4ͦz9㕠�vwc?#tp8Z,Vd@aXj5(#~h4z^R \KFFNdZeY3Z\\T*gt\ph3L|~ΝǙJH$J0-QaP(D[$ i瓛k[ND|yyYjl6k ʫ"&BЌVex6[ެ$릎|bh63 FZE_JRPp,t$.�yh6#hD `P"#oA&Xh_U.aC6L;vؾ}V \VJ%P #E oyPoYVyev{(h4r!8v!CrBoStwN333-o!b0m;V,z+H$rRFo.m6pKKKߚmV'lP$GٙNhTJB29( Ghju3F> mr9ݎj(#~Bҏ: ˲tk8.~JX,4xj7sJE,,,j5ST\.W,CUlFC"P,<݁@�?O!YqK( @DD Q)9uuuibjelA:JD"VՆsw^_]]=!2̹~bZ$x{/T*26–bñm۶D"!>V+X-^4Bat6*J~?w|t]V7<l :+++nX,r5|>/WVV BXLRA\.0H#bOO_Tບ[Hl_jQ/9<xpo!{vF.ax`0HO4µyކ 7lJS"9h4ȳ8@ ͼ8b s(~>rL@T*!A}}}ȦhVss85Cв;v| HZ-*=SSSlJ+ ͡-9)Hl6q#m__Dçܐ5D/OG4::zF*{8p@|NKJWi/ŀLMMa+6sl6+ r$a +X}WU*JRrP^󍎎R( ؤRFFF !H$< @^<bp( ,[ק(Y=rH<VxLD?2x&CarX,fZz øl6KbB \oM'3 /}(Jv7G7pSCx0z::'np۶5;rHTt �}RdcY`V' z(m|>Q(z]Tvvv2/eYTpY݌:/QPlE) ?o>11d8$^"L& `ځx&&&xZw t:L&$7Jb4֍xAѨVIlllt#G9r 4a J8 or2+mN)6LJ2 "Ё-@Z mg=3O=K/æ4'U*HĴ@v"yDV_\P(j5iZlpr.yCLV$IR^Jx ?jإr8V|><xvr_TF"NG.]dRh<xPiGpdYH 0 ==0-H h^XX[T*Z7$POœV"zw^t%O<!JM~iBy>ȖtvvB?^E&}c&k_lX4L:tСCZvCјNyiqq- %pĆP_Lf6SB@FE3Ų#0Z-nvMJj/!b0;z.;vUy+wbJE*:&;!0Z6 e B`4{{{3b멝5mEԓkdpkͶbښN٥nd Z~[n4xkݷo_oo/$n}{}~_bPڀ{ _BhV~ _dڿ#<244/Ro}[nl6u]ok׮!+++b@-cԶ7&&&qјD0"d#h8J2Y3NJ%IGG,&P({jN7 -N7<:AVV+4MZmvyH MT*, A# l6Ȓ\*fvBrV%Lb(>9{!wG?,N''r͆܎0N|P(9RCA&߂|&I$f b1q_zFWr,SgSVzַn/`g;ߙ_xᅽ{~toXIF_o喅g{キ^}\s͡CСC\sw]\rw=>>~}(TӶSlA3aTA I OKm 3]-2ʜl B<b222}  p.mCCCvYVraҒ $ {qfOv;ktK"qzG(K$OOOR(e$fv{T*^oC*a x^GY&�놭@ p8mutZf&8?<x+??r-RGy]y}aa__d2>n zr95"pEaL&S.7DUU%jQ6dX[[\uF Dv\]]r^+�:+Q1j{i4W4V5 JRT* n#(H"ӗ! rh\d:$v{:&Zr9a^TӽaN7u(fOO3K.>P(_|}c<X,/ `s=wZavlr4E.b#�CKKK-1E|700 fsnu>HmxD\U,<x( 546=φ1h4ʾ}fffhZ"xҺJRx 8D"# eKb1vr9v@"Y^Z,յFkrP(b}4F%Fo4pmCVF]D5Zv訰%6y^xxh6LoID�T;VqX+#KJ סfI?fj l6sa!]pj[L+!ZaۅA^HD"qLÙ]$|>*ԭ6,u H{dVT\H[^^. Rt~~|>}8>>o+Vyn[xV1]D"�Oѣ rzq5/oVͲƧ�ެhNo te!x<x<ތ6}1"VPh4"fD+TtvvfanP뛜t8jƗ6M%Ɇbt>h4NLLj@ Ha/>0P#;00NdT*Ěuxxxnn̶Czjz]ODnl>d2]]]˸xWNNeRpNGspz>88833FvaY?`0Ď͖5e|>pݐJ, CC_E<Gv^ZNsi=zh45MXl؈b2̞={FE6X,|͗^z)rn򥥥Rwt:r$_]]h4fl6k4Uߏ'&f6u82YdZ e~3IRTRx,IxbʊL&1=J9ra "UJI?L*=!j5"xT*e2wpf%D3'-Ji{^/SO(l !" #kְӝV4x^9O~jh@`ii:`0Hތh ׵O{с x4EzOON^H$8H$R^2ZVhf&"D<Bl+N#H5\߃PC|Hori[4;L .D Ü}Ǎwy饗~|衇9s ؏~ ==x~an ã>|WutMH]~_3 s}ٳ_/~@iibP…tL&SFQ"FS9j5x?k .k_. jJe3RBAoj"JTjۋ:t^ZO]jx |? [5NbJa.hj]OVXT g4k&A䷶Ffn;NI\3ɀC8ET.#IpLjys ,iKZHJr&6,/Dh4*X;;;L%d2?衇^|eJm۲5T%6>>~Qő͌5T'N'x|9uoo/ T*/V{zz܀^LˀJ^YKP(X @Ri6yΕ-^ަH$omfqU*`ୁXzhTr\,!\z,..کj^JhSµ'N[o??;{6wN)JZt rB*C^ZHK,_fgff*$@Aq�1ˢjjhD7+ :[(SɟIZŨj1{ak>|>T*En,h׊+|>jN.,Nfdp~Cq\.bSמp;)%o|=XX+>*]mmuuU\mMR4a[zns\SPt:X,l6+xO-p8fYrJaxRԂF1dfB!a~&HXV1bV ETapAxvtt4W1HReU*J^/$}؊-Ԣ",˺nEb` 7ǭY,B۱h0٬wE"$Pvvv(iI}}}}7pÖwiQ{-d͔ph.k_h[+&:Ѵm=kRN#ʿ o:i}'Ff2d2,Vd2f V*\.mrh4JE9K&t^/hR!#H �ႍ[xx~,J. FgHn$1dN lJRJPB\.TUOivT*ϊ"Q=o8c(%\1Ǔo, v(JKKKyLkkkz^R 21<EdR1$\.GڭHz/Ќ~NH̼ZWIgeev"GMj&);l6˻!`R r̻rP0fFf¬qzC=qmmommvaJ%0<< Snk~#;X }g,UwUuuuq73� ,0k/Y# 2 mY!@qeHxYY^KĞ9=4֭[~L&(155v}>M|Rnш&^xPD?l6']84;; )$HDK(z\VSԣ>^|`0h4ܹ3T7Q$p&B{lC K7^+ at:ׁv](KZ̼ U?WN ;Dwa.!&@ nKR*(jyyykkKt6[~a?q\ 7oޜuܜNƍ^/A a0zcaaz=fl6;ӳ>XxUZx\8ysoI>׏<5rU5???55uڵ}{ĺjZľ^!wn@;�UYr N#�4vj8%j. g…bp8\V~?],_hxn[ӥ鵵5IclZH Cj-(;nyy`}}had2pvMQC=}Lp7HjD'bX0|Ƿn޼ ~ q_fz(߿f �upzz'ɅMB>G@~QϕWkOC:sbTjF"q[__BENxFDr#l6[([&o? p8 Wd㭚(2 crVc= AVVVvvv~REL$!�� �IDAT(:999::w1@{ bg6`Br-<lmmA60 Sse!} .6fk6PBl`0֦h8n~?J5-xb 哓 ] Ol&Dҕx'l"紽0L.+\.B_ө ŭIl!T3 HT@;==cp4ŷEx!G%l6OOOà>Dn7^܌ܣP($喓JBX&VK<o7nhDr@ Wn8&(HY4M z{{{I됩 Ï?x8~衇%+WG~[rnVO v;:E,*[zKL<rxNd2^xaqqo/›{.rBO<Fyg~?qF<q M6 vR- nWM,<(OyH$i|^FF T/zIRK@kG%<tN<HTUՙ3; }a!6C+ +iry,t:*`1vNGavMJLEQ/,jq{{{~j4m4rMev{,yfRFQ+8ۍߩd|>x8\! mVkT6dՊ#N]?k׮=y?쳿;SWoo{1vWVVʯʯگ=`/?=1Nv߼yAnfdbq:jw]^~_ 7Kfd2-mRzq&X@d0T.^Ft:z߇\^? 8yl6t2 lv7zJ"6Wc 4pZ6 hk(`6h4N~3 -L&}577WV wrr^VqoX"P %ID'qv~K*z}џɟѵZk_ڟ|y{ \-ˇ>w~|^~| gh4KXN@2ஆT,h$T6Rr`Zv0lllZ-*[]~Eӽ^ |+1!$~q?-7&\2x<DAVT*B!70L h6^OD>2sdğ~6c2yž~&y&˲>d2 x<~֭;w ~Q*9|}=Ǩi\n47amm W|mo{F߀ dz'}_|Ν;y{^C^(Fа ԥ @755' B0Y)R k.&fC3<s>AbYV%X, ~wvv|z)r,v .bԃCa9Nz=Pk4P(D'].7s$=}bC�+ ͆8 }raB<`�=\\l6 Z-]#1DFPS&2pwG'|;77_Y?#\̻ V!<Wiѝ[�*`TXjC Gp$0NOO�P*Dp8KT]#K0 KeffD2Rwxx(ggr9\ Pl6 $~v\.NPox!IDK0Yes5'ə`^?qdm96FIz<{4/_][/}K`N}Q9zzG 0G&J* v0,yqJ0D~$fů xNѬt]`d ]- @~!*#r:X %9=DF Lvf2(ڞvN}fS( |---; $Ѕ8cYvnn�k4VriHVmFNhVbb^rҥ~_zTzߍ^TO'>ooԧ>."@*=ī VSͫxzVz~>eww@*8=D  >QBAҾB;b(W�fT(J.--]z�j҃eAe ? E&$ \X,A3{ WZU[OxbW^x<iIGGGA2JE"ǃ$#[[[|X,Ύש\vv~`0X[[~(|uh4e`kkCvFя~~.MIPA)_myy"H6^5@eD~HY~_W$7EQCSSS"歭-Io, C=$9t+Wo[CHϹ9ӹ:N'h1H22>éTP(jex<NIJx% '''b'z h4 6 /<߸q[S$Cw4ONN丠 4qoo LfiiI͞h??y1-ͅp8<t[IÍ C+J)( l6J{sr"Ԥ`H\(PcE" f3b^/HpX4 @"hPPYH? )`dcc(A�Tz pt`P/4| |ooB󪽽z^(n7z�$A*u:4AWynB@wU8ennh>F nݺSO]@IN \,+wTMӒ<42TW[VLQ|Ij�`q%ASQж6 z߽{ ЗK\;pEӴTb4qGP\N"Q@Xqv⦴{{{iBrr7JehD"1a ȡmwi'zѬ_h4:)neVZ`0T*PvȽ7I=+<=TF$Tr Xb@}4 Hd*p|.LN ׮]:EӕeQ" j;' 4UN"=-8e2!ZvlR$o ߚv0(x!EX:lqVhiTºa9+l6 0jjctj.sȃ/nի~ҥK^EH[Fszz*WW }q;hVU$|T*AXOv]BqOr$=bo!mZ rW^3P#O<JԯҳqݥFt! rȨBӴ8b6Zz?f͛!r.=uv[2n$w$IV֡Y]yF!B1'Ń�dfy<ԂzqbP=j\艈r 8@!?},YiQ\3KKKwEn '#6Mq233&2�J;~vjSRD[,υd2)`%3 3R&apPp:`i!Qs f)r9duA�!AmHgж~*"T^0g+ćq $ϫD@?`p8r\"v횜yc{8 6'U޾(|Īpq߇*:SN fSpHi^t@F5vɔfMQ =8]d\NA3iqrASs!-//oooK!NӅh|.׳$ }1NE:*VYZZ]vrrAmCrxx DrZVӹ\.vuuuccCyiuq=OOOŻ~ @C^G8{wԩ#懠IOqFV{%eJ?bkaa)fCsrej\ZMw4TNOOUFn7<zb^{jv[t"/l+W?z@f6Z-Kt03`lxF|^@ݰZ^қfp+Z'ж\`,m6pSB;:G9FJաKge2`A2M-\^^xyh$IBPTưа) $}G},Pit:ODxO]N~T J:Cj�xr8 Z&L#$ qnjY,vǣӕ- wf>k3Y]]ς z)0U(z(R lC{K#L#DWx:K4,%DyMł,1ёb(q�?d4 7774L b C9 F~-DRS[h7�d x||<j5J6b>T*5F"(h`0*PHۡzhNS Rד$Z*~^?KsBFʉqEPQ$z=`r9I%n2:ʝq&^f0(qɳ fYF^p-Jh4+M`0 f`0HNd4QV聋ǀt 1쉗~㑴@D~L"v@J;pb& $T*!CM9SmZ(ZB1X5Iu@LRr0dĿ̨+ 2%Y+Dw+y5" ì<Cx^e 3ehQ\P1 U~ 8-?>iY L&ř0 ncJ+^X 81Ny�jq'e .TN$PmnW`0t: L^nKn`n(qbRAah4*y#gAsngsVu_X,E�QbnJh4^vn7v<qnW} x~ZC;Co:v*y!&5?<"UVbr` =L&$/ҟٟG$GwDRDh4' J^+Z 0ҕbkT 4MG"I\p oKR!8Lx<^\.zW^yn[Vp.qOljj4^'^3pAxcדnCun+zyt'> >(M< ~N].?A)raeuuuyyY v*EAG0TT^CQ)]_y#mZ c&IO<cY,!K~F4dJޫj2jP($4 .@<}98+vwc8nnn|dq?7tzzj+NDde~~__LOOL&dPOI]<A|x4F߁e\�+;p&Ã8naa g[V1[C`z-r%[@w mݯ^5M$Ҁ�Kڍ'I^l6J%9`T"1??/W!BQԥKКq88,'xLEy^ |ZXX �0u]eZlG1'+:hjP;wvft:" {n8?P`h<88PND}7^?7a_~9 W ƒZ:[XX-jH5U"|d2MOO #@@4v;N a\RV J$oAzDGE*vq#i$h~~^a tfPO|ttTTӖCJ�ģhv)0~wwWn7633w(JxMAM&S4-P*Dt:e3\L& 䄇x*Y< Fү èǴ/0N%*%apx<NyLDFo{ޗ_~1 ?md%B.KPDW�vZχ4b ^#=؃JT*r^nܸNqnTo@y@AvL7MAš 1ݻwjM&GN!idHsW"@?DhKcv|jDxyy<CX=ߕHP6W4qno><<7?EdWVvC<Fdr8ܸq9&d2% 3 E 'XNTb(|NNN T�rpZ/XMPN(r(:˲.K9-9tJd2p%|0?zEޤ^W^E8.E&i"Djuu_~׻SO 3"~0 hL&3%.aS*%v:8 -Nl64w,`P_Fc4t:n^/rת*a$QBAW?'vl6` g0lVZ?^J2@sveYn!!zy!tG,~䖽Zgg[rVsRJ>%Y\\'? u988p\Ly*IzぬM crt>Vcr1O=OZUl~?EQt:ǓNԔ\y)2$.V\l>-�ӟ[t<ψVEvKaI>tN_>P(}8TVփjVQi4]jΊ=& +v[ wk6K"TBڄR@ה%Bm.tAx<DQ1)|Ě "es c;`N/v݀d^XՒ Z-*P7] /%kna pHaW1ݱX Y?zB1D <hR,:N.0h\.V"W!`٠P0B˅+T C,Zm<r<77'Nxjzei| $J,pX.;bZR n6Ȁ=G(CgYV\/O6=Ff`/+ X5pZtCC& jŤ"b01Ny0x5 0b\>͠$j(jiiIy]崶0LUx �� �IDATVh|P<F zm1M,,,\|bܒʹ|^*,4a5^'$\7Xifh�R.]~ZbvZX B'q}s2 &4gqVt&A˒ NvxxH|BxWRE"X,l ȗ_~P(�(@4qw܁�#GvYo dXvm'²,ޗD!LcKbmm ߞ'9>ȯt:cff&L1m^܁effFtPY 0@Ev-cb.b}a"*uPEB!T`E ~as–pffFSp~t:z}:ù\Rh<cAR+luu:>UC vϱc Ą[BTc.,,m/‚aYy؅zؚx=ܬtkt0Vsb^{vbDENgTj& j%!^<m�5|)h�h6UcY7\eVk,kGYY(H({,3iZƟ8eO.Ivz]Fj2 2DQl#XxaHNP/GA9d"A#Ӂ.#30 Mu%rqQrmՊ^ (S.Wj5͐FY0?q6z(L`_> z<1LHbۡ9pv;XjNNNQތBE|z>q2r !Xr߹L;J6^ OaH4*/QڋNc梭K bS*jCFZv(tHJ-<srr4P=*r֕#pt fT*llɺ�3/c_pbQeoBtH .v\Je2qeYHp)^u b'^!fZMpat!]Evwwm6jZ1J^F$LT A"P%t1kQի{`0~󼲮L1ҭDߨ{!CqF;==oX(DG" ɺ.X,M&2 @R2?N`0Cg9_8Mq`pttnGmh0l6Q.5 x2 JAoP(Hbq~r?xfElPKޑ܋=T! U#̋ >{^OM=Pi6�EGmZ-_igCq( ^w||lZu:F`lEnºUNpNycjl6@~r9MR٥&nӧNgoo/Ϗב Nl6C8zl6$ӏdZYY<zj+zʻDJ"bh_QIn$."^�Tx0z l! XKySx o|!.Ҟ<H$,|^G1sq  =,*&i"P5??NvPV#^l6 9(J`r0ՙXF"D+k^/vRYz=˲{{{f뒺*+++'MWUNw]%=G#G�()�rܖ3<pWnWM-xPoN'HZrGGG (>Y_|LwJPr{챷 8MDVܹ >_j@]Tt"\z7B^yx'(gퟧz(={1BNәLfzzzssF�JWWWT՗^zI*0...*@2ϥ|T;AQh}cjWWWc`O{"P (Z__<thʳW^ 1̈2R(h͠I#r N6E@C8X,bloo!()zt޹w˿G/'}f`Isaa:%D" @AiMYJCfg=\@4%y`½{rPGAVJV#C 2555\.-˲=UAs5^O;6p_:33qlpP(@h4MU-)L  ˲yZ-%W;z>99ۻ}6EQr|4!rzz}gg?k͹q-F`]WlrhqۃꃝvqHnsPkBFڡP(4OҊE$De~y~e&\VzC`80Z<OQ"7h9#.^GGG |0Ĵ#g(�4`m81 x%/pH@g~:qrPqY^^~'>OHB8.W؇jZh4;YXu8j7@\ 7Mq0 pfb+/*w|<ݡ; qt :=/HSYĵ%$Ln7~<fp]t:Z-MӒiQhh* Q) V,p@Ibx 2ZNGnc?AɄϼbb&2D򖷼=﹏\Nz=R h QiZi9v%P EQUqrգ#@zq8PqULjvq?r0dzAubZI֑)r<_3^j*CM Cf`t#FVPL(zUY"^ݪ֚<h \f lAPhZr(W]^&Q<�z)gw]`0ڨj5hc(Vr `0H3v{$y, Ԯ )f|^L& jUގH? 8Md|;7q ggWjjZWl6 2b.7\L*Gw^pVSDxo=X_M}J4^\|Mb@d2yZ?1tݱ{h^N&.]ns:gk[te:f$,¦_N eYqP'4ie@\A噁-l4G*W('i"#3<\B\E(@MAPuYHr^ 8r(hAͩߐ {e~6%W8Sl6RNG\"1Flv q\&lB~nni5 ( tr\JlJ×SF@Zt$itZ.רRHFaL;4i_4YYZZz饗 /=#l-԰o(8lv\~Pǵt\\.]�&0Է3JevDC&|]r&a@ gd. &f`�A�?`!BWT1nTdvHsjC;N d2zۋM<؉btb2ێuh CnիW}>pWVVht:F#Hx<+WX,W8NYXX@xq Ⳁ/鷚&r  @~p8x~a|;vVI$z<680vl �yeewv_lci"JA ҭjb;TMD41Lh䷑pg~~hfy֭B� MX,>J?;;;ġr]!^Nbaa3rb r@ `6ggg%+0|N6a$z= (˸^(@w%"HUNiڡ VڨYP۷o+PH:!1Kne& o(Y]]Cy^O.0 MA7T*nZm(*5PTbj5Ţ`f(LӴnzr:m X#0>f%Q�Y"r=J)!lp%rȟ%QP֭[Z6u\a-s$q\h6մ[\\L$.K|Rܸq](Mh�ƛH$rzz}::X\^*yJ;d{Q jF²,'y湿88MA8VJA8<<=,`RyopF� rRz= o2q·_`D<QYvpN)s;{@2VI|n3 #&sL520EC˲:n\vy:Zf6ݮ`k*r8Jf4 V:H$}2sss.kyy_Ty0HIiՂn{91NB鴚D$ϣ^ݤ jP ˲9<<dJ0 T\.ٜJ._ MfsP`l6'h4 ƩV<Ho 9{QH{~$^hg0X%8|YX,KKKml VJvh4.d2UU8e2GQ`0zl%Hu:^o0z $e5f*;L&FT 2XF^ok:^{"<dzz;0�W.Afgg{@;ލx<,\X t:zD"bW,)BU \-qn$ R`0WnQAipڵkuqv~_$.s&z5h?fm"*efff{{LЕGza0ܺu iB&dY uEלxtm~\oD=uJ_pffF!PJ{!<o/d |^"qv]U|$rr1B|F5]DjuX3js{ɉhĝV<MSSSbD&B(ϫoY. VR8N$(BR*�Mfa~_*Ap84M$ID[q'e@ 9_$>Q0u" $!JO]$Sփlz^RK?5!X,^vM2Y.#r뉓N+~L>OL7^~R*Fp7d8咻Z6 47FhwwZE4WkZ䏞)xb.PX666~rDLommC|q5Td2ﯮnnn##RXW^W5[5{mɨg333JcC)Rd:nff!hCX~~WpT*ɡA&px$K^w:C Qt#mnꞱ r5T*x@+�}>`0zΐ(Ɖ^h&24M}n,I`0QH;w�_z]~=FV l;}pp vD�Gy@hdK5BI'–T*d^�ӂ|;- љiyy� .//3 #�#CrWC>Q_JYy#.%D<O4bn)E}ba*vi8`j4J* wAVÜc/‰qDV37n@�"5-z^X ~@;;;/B^n~:nuu�Ts-#щJ v�X } 0 -9%l}*rN'˲[[[Z-bk+ha@!d2Aû}2i,P|ػBԺrb٠1o k#=v$MӸт[!C3|g_cV~RD4X,^/yDGeAoook4eSTӁ. 87r\P*tWєJ%<$& qcg?ID{S�nIYjZ`H B\geYVJpX,4M.$xp \]ݭڊc Μf8/X3Hh0NM#f2cHh/x7R'5&Bʷ~Wz2jvx<n0ZnvىU<UI&,ݽ{rԥPæQ䮕_/y<̈́E8oͲ$+:eBz]=2r}"trrBXe7!RIt�n3h.¨IM&r2 eYVG5!EQ�_z, 0:gt(ۍ�NJ� vP};0ÛO~CЇ>t֭bxh4vC0NGAVj�4/T<_.d2%r@\ {s|/8 R^r$BwCQ * JSy<j0J)_Pף(q p^j5=a # NoZV~`0hZ+DQ& nѾ,fEIIXo"R>,--/2'?ɋ?~@`yu EQ!2."T?vM&S2C=OZ%f<?4555J:ַm<j>C:V1r<C/(Yhc|4MBd !D%^Sёjz óZ#oE,$U'Dn>|+ G?z@@V*<-naO:1cVmnW IEh4 N*.B<l0#8Xm6@ ^`Փ>�q-ds|>?P CEvs0BH$l6dF4"a (EzzfQMD$OO^~>y; E9&F#rh4`L&A>c. 'œa\z>=bVl6o .VnzLt)JZ�ıZ%R)vƃd݋D"CUrJZNʉf#/`l`{Į 1`R~V01NG}dyyY.s~dmm na+ il4d2LiBz^OJ* 6uz`3 (, *h^ZZj6Dieeeuuu0 dm{ҥK_0cj�^a`0)evH$s\.v fS;XׇѨd BcpP(#tjW~&9ȾX}ѠvssBa6ݸqnG઱@[h^/Mlkh_ \.INC4CɨAp\%C`0'"ȰU!HQ$%C 7�� �IDAT)pR 9 М{mmZ{%!LGӥX,H$`X+$W <ϟp7M_56~f cA޽Ӌ/{>JxN}& >r'Zd2Boll@|(пyfZvuu\p#yT$Pt8+++$Gd$B;,R:h�7ˉI1]iFFA0(Vq88Œ%@N<*YdE8b~~^ @Ua l5l#xkb&BC=__?SO=D|_~gVVV?"yZ>ofna NNJRw<e쀣],o߾-*Ozbd[%q*/'n7қ!1=0 FQ[iZ9,@*Nrl6|>/I 7xCL&ZNgmooD^/2C"lvh,]Ηc5 M˿?kQ\n8>::R(78jV6P6q\jE[Ɖ[7Efs&!cn ŵjU!F#816X,B aш?ͫ,iNSөiHk4 5 z<j>;8I>/aM<<²,�QsjjJ&Q%-d8U<[)|8`ʓ)ñ<77'xa{F�4&<Rycݣ t@z* *R gJJ"wezhchDX&i"J%t@(.Gyá|wT:ǒ'FTP(9܍>bQ5`0ํӳ!4%% 5՝NGݒ= $iY¥{GLmܒ5C&VFxCR)Qi\CovTL@87ZnoomKͨ"YQi_K/LQ E4Mq.Zm$WνBV#FXiq==*kۣyD;(UHȬ^&D`z.@Y6N)h4,5RX60##HՊD"Phaaj/4V.Pcu|`0D"A`YP`pT8x"TzXjU5ޚѼZ%Hl$U6F~+++4 jZ6jVi}$sr*&=ӹd2)i|jۡE"eEL2uxPPD"a �<V͗?C$˩l6rzzJ24^j4M6θIX[[v=L&#f`" ZvhHqJANNNz^ B<ϟo 3R-t!Ld<AɆh4 /-^vxxJ3NMMZ- @ %\Y\tikk UUq@%󧧧@ tw+Wloo{x<ٳ$ JT&Mx`&uhZ8Z-X#jX,RA4;wA iP(2K;LOO7Mbj6Qr{ /,�ؾB!1j+P(Tν8߂NdlAZ54}5(Pe#b( nW<? p="t �n,BC?vp?0Sɟp`�I”t:hx(It]=88x'^o6M$ Y \)ljZр0 W^y."^b4Nb+d2@l0'H Ĵx8ƒ BfT {2ye4MSj?1N/HYz0O"kN-/d2<p8ɤlZ�*"!8n0D"h:4FXZa Fgp5UŜS.gqLlEBtx> t <4MCZ^W`04ǍFd2И{qCA V%, KJ%"jA@.nL'I̲SXfY$%8n6 xX,lAVu\Ջ7n^gfsގD"bqԴ nPnF'%VeY۝%T1 /^72qh4dZ-2LTux,vmXMp|<jr-DfsR! 5)0jSp*lIz8eY8m('D6w2֛ȃ&7n26 xA1Xp@pccAunb ePh  PĦT*, rqHV9j*N )3ʇ%z,2xZVFl +bʵ;::Bɰ0' L#V%.Hsq\nҼ^TLD&r>nFiv'Clj~n dT:I�Uw4TgA:$hzzzTp+Zϲ\ԡ\*LӴfsΝ;w*;H$BZNMMbX(Vk8D">\.G b+[qd;V@ q\$0Hd{ \X&``0((jz` NH5A9H wP(Dzx(�!Tg!.kh4F -Wd6*qN#+q\.^oXPߣ`Pšr˕|>_+>t xvvv*SXpHL&MZ,^r >r<==d`r >\.t:eN;T,K$ѳ7xNQ+GwyݻBU1Lh mIOz=q:GӳXvаi65g *Z!?cqoөT*[~pBu8.]R9<#Xu:]D K;;;l6OOOC (l6x0V' -`wGdhZSSSB"Q\( m;+Fӂ99Z+hfffE8M۷o fn+@7 hcv'`WPmdj׋N۩)hp9N< R/+++T$WR4ёNUVtHYNg`;Y< An;{o}Mkkk_AFqq(9AdǸt]s[Ypv/ vCKB�aL&XknZŴ䲛5k)<#_(>o}Kj-"px<np7 p/ v�V�6`2r\o|i@ccxkkkw9vgV*Kbz^G0 bd2I2GPHVWWu:+rݵ5ІXlqqjw:M(LcG nyz <vD 8|DŽz PշJZ&v%s=m?&&ɻ >ÿ[կ~ꩧO?//O<c=-)_|SbޞNkHDZ,+Q/࿈B;;;DtĒ(q׍FcR+X&1s]0[AK�R\�. nXIQv d綷9+Jwbښb|N$ɄaK/A-8 @8kPBp'DYtߘ D8S<بIn9yݳóVujzgYV{_b4]-Gso}[n?s`v#0f߽{fy<|v+'0 ˲2  ͛ćHbd2fnv#j"0BG*JLXySXHY|>_.SٍFdd2<FC߄rH$hT* h4f B8>>>&4@V*x<>FW{=;xPrV/"ɾbB+WHvS,cYP(wp8S~}K_z׻ǵ|gooxGbZ@`wwwnn@1zL}5 AY,6Pta@ \z5HQFTs8u˅ 0tݓeD R VDySUZ& >'E,L<j5Ngٺ!*jwvvnܸj<"{!y c[0{.:J]Gmϧoʔ=2 e6X^�]g/$DΨl6p>?ﻑ �LlB� Y)Fc%zޠe @l-$8"G%/ᯌ` 4Mm>i vZ(G=q)עPr0 NY5Ͱ`Y8SlZ333t:Hl6h0̭[0Ёju:Ir*ܮ- x֣rn|stf3RNahd+ve$$z=5QYˍvOrה|yUI +o{{챯|+O=ԟɟwa=Ijx =fy||,MU7[,#ك`=vN'dEdR988GgNTSàZ- X,kB8A]=4bk׮%VU.%g}( EMl~t\![ߏӎ>1Z!{='I$cŷHl8áHl(v4+w|KE"t C pTv}8Q\.K_R4rg>(azs?s&{p�vF7!H$R(Fu[DC_so!|5 0 TmFݴ11 *hjj =O#\H$H�na2뺾n2t:F\(*+9xX<7MBqiDiyGOp \1[LwkZYEj3"жa+@AtR8I&<FVD"qxx A/aX)ZJٔ{Fă| |v{fggx^;7??nzVq#;tʕ+WܧQ<Ei, ET|KA?:Hj@ᷣl6%WbəB.NiR,*Țf0D7"9( k'mA* br*4\Fm{0^t:U<w]$`eas6aɃBL xB^<B&<؎k0ƖA$eՒZ=WU5uéǢ7[ ujKSgg5[ZM%JPL&Ӄ !9HuuJQL&u#ͧWl!Eܗ­jIb *!i(GLMM-..tM쁸e `)eCxlŵܓf^A P'R)JI&IAk`-˲r "pX}?JْN0usk۷O;;;qfOR1!u(>;(p!Q`tB1??/>+7n7ⵏ{\.9r$rr}eXttn45͑H)M z%I&^< "~$]. Ue(<`wYP 5uarѺryqqqttt``Bb а!UZ%':<ۡr<77~`*6'{6cǤ\. $[NMMEIVX`bjgϞER)vIT^t:IK"mCRIղ,f EnJJSuCAw��MZ(^ F eIX,* :$rkb4q}llٳZVx<C:tjjz^TfffD"^*٬2#䋋9355/FBE2ZN�D"ATky9@nPh ̞ W\!�<*Fs7448�rTJ" JMHy*hqq,Dp*yP(b811H$IK.Bhpp꟞ZehjT2Ep|>/^ �πJd Z@^IUT p @áP(@eYm60}U[yމF) !xab�u@Vn4v^L`-M&x 퍍 I T">JȲi4zMtO s`2|1LA>PT'7%Y5@Rr;ێ}:19)²T_AwAehZH  T[Хr\\9r?lt*~mkk Ð;pAP. A$%M^@[\T`ll6+nDD;|bFϷ\TVl뛟y5P͏Wb<XVcdjabTU7`VjTVʃawRDvAvlllsypTl Qե:%ɐ 3pjXP jW(HdٜN'I3$�頝Rǟ0[ &lVy�Xrv&q^_(* 'On68+# QKqFc BWWV <F)pL[[[".>rطؒ`00 ϕ nt:Fa"<ßɃS FT*T`�@J/p&nVK}l6X,6[4WP|>xCwv!E@ NիW rymm =q!JnZ3znp82 F&<mq*J8{6 8XL7JzN V:5$YhnIH~I ��fgc yt...goc0snXFv3*qn?H Ec ONBP峳^WkwtݩTtu:]*$L' mPDMpT[֍56Z` U�0`paakJtnyx<.-M, ^ԳS('S̄'Pr?U0N7 eiRIӑF|2ڏ[[4*m6hz Ðc[. Wpd&KŢh$Ad|wI"c<wJպn*C(ēU4=C<ZzH7j8Bt:Dž\kj)�� �IDAT^+RZ H~fbHCRdifO(8k5i׏ OῑH$JڕH$ WVV$qT#n7Si윝U) lll\xQr5+w@ @U!^bJEfH}�׾ؤaH$RQESZq(ӭ^K6{ |֦Sr&:y(jD"JFRTj�Fݽńa~{T6D."ΝSj5r:r1 +5H6*J?lL%v;Ъh4*M™P(DR*dvVOLL� .N2T$VdG*}�&�5T 2 �[<�$/!ʢ'cA:X b*2<<\,%;6a3ddSO (wqlj'RT@=yjl6sOO(%i'%u7 u7hkkk.]\___^^V(m\YYtA( Ny5A @  �DTByk{ii K~Gkx}B%ǖz��ܮV[8//y7-V{G@PL&^H@"x{Ug7tnM\ǃjd[{rE9lPٲ@ԒsI-\VpC.`h40s&''.W{{{&  ,--8qٳj$4 r2$#EgyPCL&˲1aZn)/�*6x(BzⳠ=+4H?88Hb$dƦahN%z|2<!wK qu:*q0�&Ss{5Fг.RIi |bÌx<r.Ԑ:^<F\a: ^h*ڐZT5۾*@DRVjHD}% ޺FNnbabҍ~ςz!'THkacccq )hv1tf`0BP|~jj ʷ8j-buuU-͔$懫PoL]_VNFMg& 1^zMMBԥh#/IjUкhFF^mFڈ[>= 띺4-zu7p$B u CO5C )R}`|gHkv^>uvv~s{ӟF"~{^?>11V+0xtB_걱 rie fr7Ll�?`>`h6M-ub(1vf R"*ϋnЅc!H<KNmEH2E<D0UjIvL*.1İ pq�aǶ_.#Wvt{ͨǐ`o($k|Zkh4.m^5DmfbBD,BYL}B 4:SA^8v!D:|_@ l <CGGGat:^/fyp8^zg>_{6_� 'ɒN�  W\T*eX*a@%'JrHj2ժn/ vSFXNDq܆6|>XzeYR*KZUגC�$RROVzP0r}8 EO(y/1fFy&rj^ R#@xzJ;jnVVxp=I~ww7lRL!Ə!}ݎGo7_JѸ\.qu^W#1I333rV8˲r¡,8oo|/}zz_&9\.hZsssྸ\|> 0lj0{ , 30A, ؆T OQjF^�& @nO&xsT*+`J%M¶S,pH h(r$ d21 @^ǣipP&vmm vkX%j{-ϴzq܁- 6k:WhAzzz�zu:B_@ z\Ս BMHrA4 -\.KbNEph 4 W(Xna>zl&uHJ(cj% |A(D($$j¥. a.SI#V [-9HC$+O Q6^ZNR?^vzfW3(HR:;;<^8🛛 Ac=_mJ{1Bz:!ᏄB!ꏑHa?A I,P 1{E܉'>߮27Vno% .^O5yۺXj |%Gԗ _\B%E*A2\M`XbX,j%{wɭ\.UbrTbw'L b%ىC"RԬ~ ZM2V*k+>VX B[6'r>9NhPh'[_=B(2cVC%@#fV[__]:qH@% B8(t\.+2N>ꁭF:::9)P(d2 ,F877lnS!P듄mbJ7~kd5,vb4PR0X,230Lj4ʴP Xti�z՚f)OB 4Åo-)Lx'k$}UT( FINP(Dȝm#.NsV54<LS)� SN}nn>BȾj7Ӹ9�i4ҝvX!rhppp||LޕtvttR)*'#0iHa^|o5W^dz*xMXDsHہZej j*d2|^\ :+ UGvA j///U,jpfb'(eBi#JqpT"7$[iP^6r:p)7e١!м ð, [dpu#>T_z%F, �&ğa9zqʠt: TΦ8 ӡC�ى˶3$?)VmʟeYP>J&ϟ_^^~՝;7??9s旿eS"TY+ƻ\裏.-----AYՎW` `c�5c`&ybCٷo]VHfAl^u) |>90Ϭ`x< Oi�~ۍr|xF&BZVU GsUjyVEz{{՗)(i[ Rǐ{oQ^Cvt: ë ux:x`0A 'A,Orн^WJ.[333*Lr{}H$[nmo{'|RѼ}|Cx7VZk611Q(T^(J捤pq*8466ְdjX�!tE|A\2:==&µB5'- 2dngmmM\I%kkkPHu:P Ð CCC90Ḽ>Dk^gYVe.rla@===TbSpG MeUiSTpԒJq|>V nWq {<KKK`0l6[8C<.X,'O21|@⚩TZ?@1%CAZvG}t/ն"Y`:F .44uҔ.ln#NS\o2{rr\.S`0\mm,J" Ě}vvJqzf²,A.,,\pΒT6P[!ש0 ~BBڥK }s!8:طSWFc{{{GGV(lx& 2UFQ}qL'( 6cccKn4˲8ϲlXkTL&c0t:vn7WWWW{�me  VX.2*VbDžabNx*d2AfsCJA R% 5n.BaTk, qz}rrdRౕO(9$5j*/(V\%]zwXZZZ__,Kӗ/_N${TyoH$$?cD?&qtS}^it:fmZ @o?/#+q JbӮP'[bdWmr@vWfRIW R;z<2?@H=X75?N}qAzc ???/Wx-eRl6ېp=3qb#1 wlljPz$;.@xYlS2\qKʬn<RF# ȍ1㳠V<=r\*`ZR)\bF$$ӽ^/t__GO>kVIf3}>szB 1rcc& ! RGyl}z`0(I$e ԧ!k|:8c\bP.`^$g2rk}}]^T>OR@$=I]jkkK82~[u e=z>::+J-n(/JTFSNCGGG;::8e؈jit$?C ^,ÑDk 000А)QiXY;11o' d7E)E@p'rZ R!ϗd٬:t:YJr�\]]]Tbq1u)(8t:A M𛠞��G".Z%L$fY@BR9II ⛚l*iPŇ?rx T *eR+Cݐnq䇔0!><:: ŁNj^t ?o|ҟ3.oI|d2) lqL(S䵔4dsOZ Yɕ[)ͅIr&Ay ń 7 d!fYsrrd2L&`•^/c%ɆӘ| q}6 5=)x* ,9b l4uD2n'ށədTbei+"|qqrL&CXi8FG:bT43381277K.c?>45 [2Bj8pZf#G<ZP$+@#pb=d @wrrRh4PCIű&AJ6p>7X,X|Xԍl6K)w`•srV5R400pqcJ$ zN_X,]^^&wq� ^8CL^ "1 8t_&L;m<aΙL&;==JX\\,]D1A�Qr@L;x'1{oWB!&>B7|© VF#s+Xx{R[L0b jpp! 8,bb_M @ё<>9Z&o>iZaLܹСZ\.;55!Qj(*a[,@кlrrRSCQ.W6Y' 0[it:qr��$h4zZiW CP( `)%XVɄj'x5yR |s- KM 9IsN  &S6'|e9D>2L 5Dbqrb9{f?&I' ؘBjZ=ܜd& h4eAV$ ) { jlVr exo<a^ORvo}+W@% NwuuΪ1Xτa̟R.}>___Xz666$[.FL|>O. oK4C^f&N>V=zm, &0n<+Enە> r]]]<o6Ly=zOMѐ7*DE!E,bzMLy">P4rOT~Gƹ\t//\R۷o߾}:::`v,$gfT3M*Fl&P2LZDf4 @FJV '&&Tl&@3332akdFFF n2ٵUPC|4݊e9�jVGN?aZ,9]( 퉉 FCMrj:cǎR)T.[V37aV*U'fOMM7p80k` HR!5ܴ=;BvNvzC)SSS`pg1g8y�Ew8�f+ jM&Aoql�] Hu#͎iZ1J'hR԰;"EM\ZF=v5ka{rl{:av N¹8Rla C)n?6ZdO?R1c}}o2@Hum0ͤg�e TGh4*4&IJT]v{B= k9??3+ԉ| O*V[TmцuĂ Z-&FPJ4WC#ҧdM#L|>OFqq{  n'R@j)OBYL&e4Nڗ3͞B"f3v]}�kU)[V$6 L&CFx Qb M7tB %˲^7Lvu}{.]?e_˿=I([y&a\, ΕJ=VUh^c[[EX,K^tm6!R~<ma21L<rC?$WYN]s~~^妅njೋAeL6pH#Y,F TƂ[-4hV^CjBm.WMthvvv o�6b&JHq@RTUٜ"]__/-.cYz<L&Cp8w:C߮ί~ǏW*o駟?'p\o0 sX BP}bc&Od=l60ϑH?P흝=|`www(rݤ D"ORVN 66Q;PP<eCgP|>-/9T*E�0Ta\?__r9`2rX-v.y> ♦8y1Vo=0TE+VU8�C%Bhrr=qFf=Zgu#8zN[Pyo$ɻ7>B'???r{Sz~O|~O|!4777>>~M7f{wm~_=r: BL&޶|M?qO>Q�� �IDATBWM _ B,3,H&2Z$9|0PuPjСC;2rxxX?Ovww\LJSTo-HkVX%~*Kggg}©d2ٔ' qr:5NUUɺe\,GFF|8NRLfzz&933(ݾT*g}H0\P~?٪~t>jB_ *0LIԤ`Jz5|.;M&ӿ?_ ӧӧϝ;W*Ǐ 'NG?zꩧBoy[4M u:߹X66 |0)Ʋp<p;9773l6n$˲fj2+++ooojmmmBa~~rY<Vr)/U94lV\X_ctVJ{p:ޮ┭:m622! ?&nVcY,oÁa qJ*EN�m0h�;d`TR\7 'u^ þ}u!wO9NZMG"tIժFa5N<f*^ɝIܐbdBn3g<@@D |[߂&rlX,{7}k_{EXC< "8fY'*娨[ M15j_~8&`:)TW*r|Raڄ ;V`jʼYrFhƲ,0B lU1 S 2_MPTVC KR {ܐ W THj mX,H3 >ƆrQb9sDUHJbbx<r@ 4 M-þW><S -,,|zp8jWWpdd׾֑g]:rYr RX{N\"#,,,tuuQ~KżK}%L﷿mGyd[&VN'^/"'\*RիWK JOP `#A ox̙3|Xlz~yyc{nA666䨵J=?Ū-Nr9N'^P@T>\)[-KZT*XV $^,R9 Ph�'l0(A\xQ׷ #}>_.ly9֡OQ8Me- |*U>g?(Fj.'~g d2 Ѩ/h˄emm-G #H/\`20zSSSRInHI]o{__o~|3\pgyGn+W|ӟ)bExK-r _ʕ+bZ^/IɈP(Pz3<Ea!@QVbkkkn[4ynnj*?noHca6%I} z6H LfqqquuUh}}T:)x 0 t-H(Ԛ2e Ō,--5/8;}}\sd;C,'hL$KKK vmx ೙f(V=f0Q(,ZVFjrM1u.wd?N>M+RGO޿OOɓ'?~߽{NwӳӧO?L$|;w R.D2D^}z++O|bvKc.%gtyrK Y,gfffh0z=|  ~Bf3 @AMDx:v8P5xId#$+2(!#Ujt.ijW/hۡM:u;Ǡ&0g<<kmmM=ض=rsss@l( M$вĉ\gczD(SrsHPjSF9R9VoZwMMM<xK_s=7.BG>vرcǴZ-g~З'NLMMw}'wqZsZ>y�rh4PH"4Zx ɅAmmm �߅SGay}mm rJ#Dz*:YM X, @'fڂ֚i8[8A[JKɿ*LvG"<O`,18T*v9N @;mNZJR,<xܹ 1<<<߿lloChI[[[6t@d'i>ok=v%ԟ E tq;Aoo/0HywyM ][R!{A#T(tSq^oX׫"uH,LPsBV WU}z^<i8s8Vu`Z֠2pee^/Dcz+vRRn7j8yZ`kYR>9Z$9\R*>H)xr7^xȦ�@`v^/N2 ѱNM|>厎5 ڍg2IϗL&{zzȦ|^nwN LybMۓK0"-2^^obaBZf:̾W8. I5"y%IJXTDjGBe9) dHeHrTp8LEl.sgTIy TZĴ7P(6%61�"iʊJt:Z%vVF \$M$$/5N8L&ܗ۟ `xP(@Uk2j @\533vcB~w R:::Y dJ}ffFNMM[yˁcvg?J]"kA_wdG^.LV. h9E2aOnw^/v=N&rkPlp!''pcoo\  ok<88844466622200�wA6u8JUbTCR]W>Ԑ'Vq8 !/w=[5nFM~U(AطoVxar|%g !4׾TCƞPWTnwWWk^A՚L&UԮ 9SK\ Ô )W�b+Nn5@].;ۗ}33x}lorQgvexxidL09bٖZW(”ϓjNLDdZ#k^;vGQ˅�A텅 xEjp8nI]A@))D<x4$3lʢT6/ nojƊuH.]YV===/0 0� ϟ7!`5 ǎd2~Vy^\Xžg0, r*~2˲cccĄ z> I6P45Bxc=\,f2[X8S*ngD I&ۂX,ۍ^r+}i0}pG8D.]vuu, \FznKv5y ,|tm{e<8:: P$Vs熆^NNNzr<55}Ξ= (EE)g< S.Ix<TrY.ͪ7}}}hX,ct:YUëiǖJzV kO$¶7m{ �fvXx�k)\.dvhG-eb''/^\]]mkkaYviiaѾ>qiVqu1m@3j ;=<<|…bI}%9=Q)8'YzH/%b19>6كOMo4HMxl!}Af0Ν;&H_*jq|P(PPӠ4wvvVQެ<yRrKEB!`j...Y*a^r-F? Rٳ.F#n.w_(%Ñp8,DW\ͤBBJՌQTRN$ jL.\-f"sqcx< -'9){G"!O_\R1^lhԩS <Sǎ .\XXXN$W\9vw'H6Y"\'ݎ:|> tzY!2RZn"s&2Z4ɶȺ l$g<iͥ>J1P y4 [,h4 uG(. OrEd0�M쉰 ܹs\l6wtt@!�qǥR)H&h,J,! 0rZSs^\.[,تQLZVKM#[n@jBezdlpHRHd2qՔoqb@ *BZ[ŢҒ]9v_rooԩ+WVAp8<CrYQ}>B+J|>&_|O%4Pi<BP:П.o@RV\%2S3 bQN.$nT(4%5bIӒo釥%9 rog G++wn]JR,cY^ri )JCF#t;z^tB ( ?6 qZ<rM tX3rIP{RMMz]"'fFϧ!W|fOK?p׻20>!n;[_w?D9---A)yTx,4rj5NaF#CNjd^#~PBTz_U*bj¾eeeUc2լѤD6#s_MfDDBA#F#0+.CN2H@%,q!dq9‡Gr,J~!b1lyZ.A'.^|aoc~~@5nxeefd eNgm&e9>D¢ߋ;j`sȪZ0˲?ߥROt͠ȃ/ߏʀ=v<|G<*X,gGe76PZGh6G|�o\YܮOЭ!tr ߁P BB/!8BG\i@[㗬T*2ynp p$BA+զDZ՜NgÌ?i 3Z-$UWiB:@LCEa�!JeYV[&&&R"z F# Z-tT*>o~~#moZZZp+ ˚ VaZ p1cGl6t:qk{"'R4E<jXLiPXL&bQӣ[/>j5 ^P8B(Gsa"t:s@ P,TT;~<?ҹ,[%e,iщ:!ђ B5I�#t� 70N׵Ԟr#|^6ga'vy@Q�(bհOxk4p8�S�@80ZO3LJpZr0Lvtt` כf!u_\nqqk^hggg}V6.U~?S}>_&iHQˍZ&(|}<?ac\*3J Loo/0 R $J*n[\Ѧ8T7''(n4B:]j!}8~wϗ+J8V###(Jl$ɓ'WVF<TܢcffwH[>nOOOW}Ij7!}o}rD"˵H ,?~$}&*m&ӿn(Fz]ۻ_D"_\|,Y dj EJᵵ5JϒKU)$Vx<[Gd29slvժN|&iuuP A bZM&RQA{{;`$SpC Nv=k j9XIt:2q$n&"B; Y 4?FFFr\\N&R"d2 :Dαp&nGzQ2!~zgqE>EXc_I&ě <(DZ\\y=QX8hm^줐x\Z^^wjΘ!` ۛV4WVVр,nHfY*l6A2fbqP"Ӥ+++[)V*ռWR.U]fXk-r0SR;L⩅CowP"yCz׮1Jw3gN'`)HV {t0N:E~b%8f\CLתI*"BH'S%/_ [{찌z<O}S-<C8AlВ |dmM>s jU06Y;~I$XSв,;44$y׋ dYXժBBTZpH!`!g%�擧>}իtzaa!Ao.6^xqff&&΅ȫOQC Mz-,h'ɱVKJvڛn醐�yn8'"T#B=Bv~˲ k0{Z uR?<,^8K.H,[X=rɓ'"\HQS{]FzLM<xST;+ $dbX8֐x8(4F"ZcccaazAmll\Wڱh4B([Y6Vj_ϖJzf, w66>^m 4. NU Pz1??KFT-f$dUTJAc,d7V*hA8lnJjZ(�,L䞰{bb 37d}vTlq }eeE!zy[ARAp8L&qr%IX& d2MLLQ2rx>j5 ./E.9 Mx5%>C}{?]p]zױcھկ??h4eddh4O>$B'뮻>GX?O#tX,o1q< Bؘfgg)/JuؒG$r@Q$a!'mmm:d2)pP;::j6d0h4<GQ ,˥KX%@ �)ICC L�r 14P8kD}6NP p8˲*YJztllB̥e: _%a0<rt^?wuWջCnG=yG"H?p8p8>W?O~:�� �IDATnL9I&&c q@60 @+,kX{4NBZ딛aؚ(X,jU8j5(dMR j50nVG4&''Zfk8-peqROJs3v]Ӊ1 ػPZdj$~یd2Y00 #&Sx|[j.tC ӉB0jQ E~V*g' "G{_N߃>{=yG?+u$CTKn#x|r:9\.Gƃ{ QK2k(1ɔ[]]UR% TհyVXTUl6jkkk@ -|#vvGdii䴵X,& Cz%k>aZu9snٮvbr666ZHlnGkgfdj*ϬjqOm|V3\[g,ŋkujл0f;ru]=ō r7+/,,@^z=ISId;D� |&w,NU*x<n6DMr-;Gyw)^憳icJ333L^QHpjHdhhW TۨȷfCbM\TD¦\?,0[c[5NbnKҥfɊ[25$oVO" 1bwU w-+&Iyxu_ȑ#=h4wCԎzw"0pXafJBn:;;hXlkkS3�*pri5"qj|,k;۫r0I@c$W_XT郃_xfsîhVaS}|>zNmpAkK&�,ș7*tC)V@Ų3+Qm6I#~KI.b(y,JU!] &ŪT*W\I$.yjF#W>noe(5Moo/ WVVv%{N&ozӛ> p뭷>z>7M?իW?~};y7SkrHANs߾}@K.jHf,o> N|E[nP"ʄLQ 0===Tau}™3gX,&N MR례WNϸn@ZflK"Pi}}}}"PݣJ{NgI?ɡ�lÇj{zzFGG3(t B___ښ^XXP#Ha(}q8FQ}$loor8:РswRԧ�ޏ?=4D?�':u`0\/˙L08֕5,](‚Fieپq} 4kTEM [ӳ-DbhJ062PݽLJ(K# +++d8],_9GF A_J#gm{.8<<LWb·C۝~IN/J|>lv3gU M5TM.]0~3*^j<G"(?<ZgcY}<ǫŋpn28+=<<r{jj ($ͻP:g@)x2GVUĬRcJzxө)ݵZmrrRHi+fQ㠌mJv4PZC^F$T*TxkvC4<<L#Q#c.x@-yd\Ė % SSSZMhl i/J,JC kzN?11Q(~_ }*Jxu7EF㸎0ֳ乘RcdhǀOuMړbp:roN&q\8VW*gX0�K@r:</~ 5<5*w2u<LWF_;p8(2n,vmFLB0 ^^W,+/~)8K"Vo#Yk<quC^|[ RW¹s$w- |`ǃkux 6٬}; a{rAl&!ln~T*5>^j dVƌ{NTH Ķηd�K&#dX,eիW[h4؟&gVDR۷fY0 bpii j5>sbU gy^9_fQ8et:xV(Ė _nh4&`&''Ym$8rFrj.<f[ZZ©j B ؂R=d{EcM733RoZ1DT.0&)<o0VWW2+I2HT:9sb\EN4xK~gXYY&9TajaFiA+~3~hTc;Ub=rj@ګRvƋemmMekm8bJ%*l*}CG}Jk$% ܅%@)g4-..rWPNPe6Q_O&F1J'X-//FVd9Ţx(Ф fK1!VҶفQ=#vE !& ”&rYy.{Amb5r�PN%p0;n;ˉk.GR`R|>0ʉQgݰͳr*Ue2ě"{R[N& h $CGv`s~4#T5{p7tLPߺ`0L&@*o(^ tn!3cyy)ZZt)&-d[nC86rn^ى6669׽_2F1L-C-$A٬Y3y<Inia(Z]] h&VZ;VB<hL&zixrl6cm^/Ub: BaRW( ʱƙv8)ee1bQxa"՜qZ]]�nsGy 2띝Zf>Lŋ#G@055%Y*Hژ^ NMmA_r|>/M˵ړ'nړ=ċ'juww/--ۿ[]]:5BeY*,SS&CuG`fggry9n-8^J.me)IRv p1  ŞɫCd0G�7'Lcp8B\.\_dJZ}z.733CDnd2>}ZB?\˫`&''#*10~~{(nVKEi^eY܏VA+T*<=i-lg<ߋDdO^qByjԥ1,˲,+v_0euvvT7/t:Y\jQ$e<*20ŃaottTpgq'P"Z o6MwkO PѳxO埩?WwU/nU3|#776N6M\tz}Ngh-/eOoX^r:6[/‹`0(Iq{965Nx*^G88+oll 0 CQM80Ҙ3L: !/u٣!/[R~fR^-h /%>?^21qk4ƉB{ooBaEڈ.b񽫫>P2n;N+SKZ&h?C9Zl6`ٚUgYDGEDfӶRdbb_[%ɞɞ,"NB]Z`[ҁh++7_o`eIȏmc EX,ՓE6%8a833 _Tv�K7ٟ͟ӿ{'{'[UzhksoZz~,FwqZRutb0tIR@5F)1F ]ttt mi{ԩSB/~F}_# x'{'78NgS|%FN^R \bD"QV%kv^z*"~*%SwG?C}CW3?~\ӝ;w >j57V]KWηۓ=ylm``�QC@T9?ˑ!ҵP_qq6xRLʉfS巡qJ&d_2,TNfboy[o_l/i;(}$$CJD+ P�@4|.*\ )@$<B 1PXOBЄŁB&dcvz2Gjt3'=5k֘1c_r^?mڴiӦ .D)p� [9*$WV(�tďfeD0 �  l <H$p8ܻ 6*DGF?t$Ill0jrJ$.edd<d�"cUfqIi!c2XrA��z qp@|O4`/AѣGFtdmm\jT*IFy(wttKl~*DP2.RaB .W E 81BVuN`K{-��?|J@r@io@ X-A~Nv 'pddd\~cKW%"",D"IJJlhhx뭷:;;GiXe2Yjj@ [̉�XlڌBa2�Z]� ӄ@q"D/A|D�� Z`0DEE eXf܄۷o.�@(x<nEJ111ˆ@ £\.jT&! H>wgm߾](:tH.WUU-Yd�۷$駟�ϟ:ujƌT0Daqx bb1�$@D$%_v+I Wdxkr8y6 8S0#5j&::ڷqxL�7or${{{ccce2ed2`ʢtBfh[BtH9K�2ӧO>=+źt~1 �b"o"⌓XH}iOw7cgXtw5I<G\#IR"".K$ݣ?psPD<n:Tp@��C{ny$�&5a�sq|Vy:1|BkiJH AW@jlNw7Z~Du&r8Or�-&6!aC�8zkƝ;ёvVۏ&ݺ>�� ^%&>K qݻ+g(qdiiiiaIJ2;;͍V0��6[5ʧ@Dq�\~XYY$a`WIlP(TT7mt:w:;;sj-R5ن\ \˵&YG 4]oʨdbtt:MKKFեj1 ɹ|2�@P`̫r?jU4773ȻȻs^__؈nǠq8O=T@U8M"�dr0ۄ@Dqp8\BB1u>8t`IX,*|uHH{l_v* вQ]&''tCsrrjI:KfF?P-5ի!*AX֜#G1.�8^pT"q"a`�\믿06dRrJ%fxLwa?g?X $I6衾MMM\.}z#$6==ƍfj|v{TTûYPaAB8!^X$z�5-iJUE@_ۋ@?G#] !\T{Æ 8$ -SB�t@Ѯߣ 85ʺ IR!zzz0 Laiii]]]k&$$m�Z8-4JTjcyssszz:h4'O4TN0"Qq8H  A"�:|w�I16aB>z2$I@xbjjL& ;w;֟O>IԩS|FCCBбj'|饗4ch$(K.|=:z@FU.+[eI ð薖۷oSfyHDτGvnJ&) )e| .]{\q� 4W_CD"s]bŔ)SBiɓ_~?'~/Ǐw/ONN>vݤ-[l̙EEE}w;�د&)))E$3h06v`O_!Iʀn2l6۰aÄB!\kp1 KHHf)::ZȪ64 Axgu_7㏣AD(9E{$##^իW"Xv5k0g͚5 �P*suuD42Op5bX,4I 1rb*JE"ZdY Ѕ$Ib(XI=z>u"B={vddd%gݺu>ׯ_(yoJeII{E3'Jt{__#m ow\oX<W"]<HeE<͌V(E[VcPq*uOģ8u_wK"8Co\h?&\IN>II Xw|BS؄)11Q"��:::rf3󘐐=8S(zMFQĉpٗAUUU~~9x@ p .(O\95C(-n?_i6<|1ݔ3fZNIIh7$}d2JtRRRBPՁ&̍Dx ===:�8{vqJ@D ð1cKn:4--'\͛cZ[_/etXbA7v;KyHjcXQb8---jGjj*a/^ 2btQ&-Yd֭2"///+++;;{ҤI:o5jÇKJJd2YCCÈ#&OL, ŋ].ӧJȑ#U*ݻm6ԩSazL׬Y[ ~p E IrVh4te٬h4 t’!t:Z(U>62 'Fj *JVv؅=f�$M Fו6lH$JOOd2{T*l<χwT* AFTVV:tۿ?�ܹsgΜrkFK.|ҥKa /ə2eJWWWqqq^^իW/_e˖LÜa#fMMM>O@K; "؇gn޼bŊbjv*,,,,,l6A555lP͞=~6YRRRXXh"Nĉև~H՚7o^aa᫯ 4Mii)<Ϝpb8X_v'eơ@~6F{@f/��IDATEhmm5LjzH[AN�pl?m۶֖]x}s~id_|*/ʆS oMee;SWWWUUU\\ �8qD___]]]]]ݞ={ڌF `ITT=6ԴgJ `0۰H$:t�W^ٿ]]{キrJFlkxJ� >󺺺[Z �pLx… /v; O܉:fbz >X,qbp'\M|>fU~~9s��?5kƏ&JKm[\ݼ}07ߤT㕕JrҤI4NZ^^gQ999ڽ'R.G/PJ%s00L$C BTvuuzZV90 'X,H$b飭x<Hji0QǓu;P8pfbHMMɓ}|;v<yrƍ�gEq`ѐ,vm4mt ;>sL(߄b@i: Y 0M@< KtԄ4os#J* kq\~9e 2ͽ1oc,<Q*A#IAz끨IxbJUZZcǎ_reH%H֭[Ju]|yݺu555śPV25556m?w̙38!G}r6lt W^=|pAAAie1G------p8p~Ϝzzz222nݺ׾V+5iL,`0=zLJX(3LA@SZPyaXFBCr 9d$I Zg]wl6LII۷Oxq�VX1jԨcǾ111UTT( BQQQ1z议 &xիW3f=z4lV6xڴi㯈@D";vJ%%%wۿáN9rěD^s tttPKzT& wB!u@(fdd aYYYt!ۡOzzzV!bȽ"4iT*9s&dĉk!ZUm=}TTAFJSWWlٲWƏOM6m4o޼!w8aN9[__Z,bg$Ioo)Z*L&:b. �_�OIIq̟?T*�lg޽… W^ � :::233=.ڵ Zhт ��ǎ+((h4YYYG�7o?~<8+Ʃi{ N>:@`ƍЋ4iA �q|ʔ)ZrF< V\\܅ $'|sN`j-^_ B` uwl@pY+h88sϡXtx݃h43$ ڊ"h\"qb#azÇGBGrDCfpeŅw u}d2tE}~׸ ]ȣY[|{ur]DԭB@D"8΢��ajC@ �?oZn]VE "8ڵFo0%=����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/a2142.reg���������������������������������������������������������������000644 �000765 �000000 �00000221100 11220740726 017524� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Region file format: DS9 version 4.1 # Filename: acisf05005N002_evt2.fits[EVENTS] global color=green dashlist=8 3 width=1 font="helvetica 10 normal" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1 physical polygon(3535.2112,4184.5,3540.5,4179.1154,3548.5,4176.8219,3555.9012,4184.5,3548.5,4191.9558,3540.5,4190.3926) polygon(3545.7583,4176.5,3548.5,4174.0347,3551.0962,4176.5,3556.3318,4184.5,3548.5,4192.3896,3540.5,4192.2562,3533.5386,4184.5,3540.5,4177.4125) polygon(3541.8511,4176.5,3548.5,4170.5214,3554.796,4176.5,3556.5,4184.1775,3556.7483,4184.5,3556.5,4184.7649,3551.6193,4192.5,3548.5,4195.5255,3540.5,4196.6771,3536.2539,4192.5,3532.8727,4184.5,3540.5,4176.7345) polygon(3952.2509,4072.5,3956.5,4068.3292,3960.6285,4072.5,3956.5,4076.6793) polygon(3784.3016,3768.5,3788.5,3764.6165,3792.2888,3768.5,3789.9877,3776.5,3788.5,3776.9498,3787.4255,3776.5) polygon(3771.6665,3752.5,3772.5,3750.0922,3778.6915,3752.5,3772.5,3754.2336) polygon(3538.3898,4176.5,3540.5,4174.7377,3548.5,4169.1227,3556.2689,4176.5,3556.5,4177.5414,3561.8572,4184.5,3556.5,4190.2159,3555.0588,4192.5,3548.5,4198.8617,3540.5,4199.1539,3533.7363,4192.5,3532.6076,4184.5) polygon(3949.7017,4072.5,3956.5,4065.8271,3963.1052,4072.5,3956.5,4079.1866) polygon(3875.6625,3904.5,3876.5,3904.2537,3876.835,3904.5,3876.5,3905.2614) polygon(3868.1012,3896.5,3868.5,3895.7386,3868.7463,3896.5,3868.5,3897.3375) polygon(3819.1354,3888.5,3820.5,3883.0416,3828.5,3886.0489,3830.444,3888.5,3828.5,3891.632,3823.0234,3896.5,3820.5,3897.8024,3818.7446,3896.5) polygon(3897.7083,3880.5,3900.5,3879.5695,3902.5938,3880.5,3900.5,3880.9927) polygon(3769.1562,3880.5,3772.5,3875.0284,3778.8355,3880.5,3772.5,3887.5809) polygon(3890.1607,3872.5,3892.5,3871.2404,3894.1375,3872.5,3892.5,3876.5938) polygon(3907.5625,3848.5,3908.5,3847.1458,3909.8542,3848.5,3911.5156,3856.5,3911.725,3864.5,3914.2277,3872.5,3908.5,3879.4728,3902.7723,3872.5,3906.3967,3864.5,3903.675,3856.5) polygon(3780.9485,3848.5,3780.5,3848.2176,3779.9917,3848.5,3780.5,3850.4062) polygon(3725.1932,3848.5,3732.5,3844.6726,3735.9946,3848.5,3735.8646,3856.5,3732.5,3859.0234,3731.1077,3856.5) polygon(3921.5568,3840.5,3924.5,3839.3009,3925.5444,3840.5,3924.5,3841.375) polygon(3876.9766,3840.5,3876.5,3840.1369,3876.2458,3840.5,3876.5,3841.1354) polygon(3723.5367,3840.5,3724.5,3839.5367,3725.7596,3840.5,3724.5,3845.9584) polygon(3914.0096,3832.5,3916.5,3831.205,3917.6991,3832.5,3916.5,3835.4432) polygon(3904.3125,3824.5,3908.5,3822.4062,3908.8807,3824.5,3908.5,3825.3375) polygon(3706.4813,3808.5,3708.5,3805.8083,3712.5375,3808.5,3708.5,3812.9861) polygon(3908.4837,3792.5,3908.5,3792.4062,3908.525,3792.5,3908.5,3792.5156) polygon(3882.2841,3744.5,3884.5,3743.6875,3885.0945,3744.5,3884.5,3746.375) polygon(3700.483,3736.5,3700.5,3736.4766,3700.5187,3736.5,3700.5,3736.5536) polygon(3713.0054,3720.5,3716.5,3718.2673,3719.9946,3720.5,3716.5,3723.5914) polygon(3785.564,3696.5,3788.5,3693.564,3795.5809,3696.5,3796.5,3700.4062,3798.8393,3704.5,3804.5,3705.5161,3812.5,3709.9766,3815.6058,3712.5,3820.5,3715.1511,3827.2566,3720.5,3828.5,3721.0027,3830.4688,3720.5,3836.5,3719.0229,3843.7375,3720.5,3844.5,3720.7933,3850.7617,3728.5,3852.5,3731.772,3860.5,3731.9005,3868.5,3734.3797,3870.9429,3736.5,3871.1979,3744.5,3876.5,3751.5695,3877.2614,3752.5,3876.5,3753.1979,3872.6902,3760.5,3876.5,3766.7589,3878.125,3768.5,3884.5,3773.8125,3886.6989,3776.5,3892.0987,3784.5,3892.5,3788.3125,3892.8489,3792.5,3900.5,3799.845,3901.1298,3800.5,3900.5,3801.9886,3898.7946,3808.5,3900.5,3814.0096,3905.125,3816.5,3900.5,3822.975,3899.8068,3824.5,3900.5,3824.9236,3905.7452,3832.5,3900.525,3840.5,3900.5,3840.5163,3893.4375,3848.5,3894.5469,3856.5,3892.5,3857.7596,3888.8489,3864.5,3884.5,3870.2986,3882.2986,3872.5,3880.9861,3880.5,3876.5,3882.875,3874.7446,3880.5,3868.5,3876.8173,3860.5,3877.0982,3857.4345,3872.5,3860.5,3867.1354,3861.5541,3864.5,3860.5,3863.1823,3858.3917,3864.5,3852.5,3868.1823,3847.7898,3872.5,3844.5,3876.1188,3841.7164,3872.5,3841.7083,3864.5,3836.5,3863.7188,3835.0795,3864.5,3829.7188,3872.5,3828.5,3873.7829,3825.0178,3872.5,3823.3303,3864.5,3820.5,3862.5187,3817.1979,3864.5,3818.743,3872.5,3819.9554,3880.5,3812.5,3885.038,3808.3092,3888.5,3804.5,3893.0234,3801.3533,3888.5,3797.4531,3880.5,3796.5,3877.9584,3788.8751,3880.5,3788.5,3880.5268,3788.4062,3880.5,3780.5,3878.743,3775.1488,3872.5,3772.5,3865.5469,3767.4432,3872.5,3764.5,3873.795,3763.0924,3872.5,3756.5,3865.9076,3751.875,3864.5,3748.5,3863.0234,3743.2812,3856.5,3748.5,3851.0066,3752.1635,3848.5,3748.5,3846.4293,3740.5,3843.0461,3737.6544,3840.5,3732.5,3833.7596,3731.5367,3832.5,3732.5,3827.0416,3732.7824,3824.5,3740.5,3817.058,3741.4191,3816.5,3740.5,3815.875,3738.5469,3816.5,3732.5,3823.4107,3728.6875,3824.5,3724.5,3825.0234,3716.5,3828.517,3711.3015,3824.5,3716.5,3821.101,3721.101,3816.5,3718.2228,3808.5,3716.9595,3800.5,3716.5,3799.5234,3708.5,3796.0764,3704.9236,3792.5,3701.8021,3784.5,3707.8558,3776.5,3701.5417,3768.5,3700.9485,3760.5,3700.5,3757.9584,3699.7202,3752.5,3700.5,3750.6805,3702.2944,3744.5,3708.5,3740.1279,3716.195,3744.5,3716.5,3744.8631,3716.8812,3744.5,3717.946,3736.5,3720.7542,3728.5,3724.5,3724.338,3730.257,3720.5,3732.5,3718.125,3737.5329,3712.5,3740.5,3707.375,3748.4062,3704.5,3748.5,3704.4625,3756.5,3700.4732,3764.5,3703.7202,3772.5,3701.975,3780.5,3700.6525) polygon(4026.365,4536.5,4028.5,4534.4086,4030.4707,4536.5,4028.5,4538.5914) polygon(3527.5103,4392.5,3532.5,4388.3955,3536.415,4392.5,3532.5,4396.2423) polygon(4328.1093,4280.5,4332.5,4276.2719,4337.3236,4280.5,4332.5,4284.7281) polygon(3531.0749,4176.5,3532.5,4174.4749,3540.5,4169.3959,3548.5,4168.5659,3556.5,4172.0382,3561.1012,4176.5,3563.8911,4184.5,3556.5,4192.3861,3556.4281,4192.5,3548.5,4200.1898,3540.5,4200.1399,3532.7341,4192.5,3532.5021,4184.5,3532.5,4182.913) polygon(4410.0983,4144.5,4412.5,4139.4783,4414.9017,4144.5,4412.5,4146.8016) polygon(3948.6869,4072.5,3956.5,4064.8309,3964.0912,4072.5,3956.5,4080.1848) polygon(3843.8419,4048.5,3844.5,4047.0522,3845.5342,4048.5,3844.5,4049.5342) polygon(3874.8068,4040.5,3876.5,4039.0487,3878.677,4040.5,3876.5,4042.2928) polygon(3819.0015,4040.5,3820.5,4039.3761,3821.5217,4040.5,3820.5,4041.6831) polygon(3891.6902,4032.5,3892.5,4026.022,3893.1478,4032.5,3892.5,4033.0398) polygon(3945.2935,4024.5,3948.5,4022.4749,3951.998,4024.5,3948.5,4027.4598) polygon(3919.8522,4024.5,3924.5,4017.8602,3929.1478,4024.5,3924.5,4026.8239) polygon(3883.7802,4024.5,3884.5,4022.8805,3890.9781,4024.5,3884.5,4025.3098) polygon(3905.9601,4016.5,3908.5,4008.8805,3916.5,4013.7292,3922.5956,4016.5,3916.5,4020.3098,3909.7956,4024.5,3908.5,4025.4254,3906.3406,4024.5) polygon(3870.0219,4016.5,3876.5,4013.261,3878.1195,4016.5,3876.5,4017.2197) polygon(3819.5951,4016.5,3820.5,4011.674,3822.913,4016.5,3820.5,4018.3098) polygon(4058.8944,4008.5,4060.5,4006.8944,4061.8223,4008.5,4060.5,4009.7488) polygon(3962.323,4008.5,3964.5,4005.7292,3966.1932,4008.5,3964.5,4012.3098) polygon(3920.9247,4008.5,3924.5,4004.2747,3927.4049,4008.5,3924.5,4015.1398) polygon(3829.261,4008.5,3836.5,4007.2935,3841.326,4008.5,3841.3043,4016.5,3836.5,4020.618,3830.7348,4016.5) polygon(3802.1761,4008.5,3804.5,4004.2747,3807.4049,4008.5,3804.5,4012.7253) polygon(3779.0015,4008.5,3780.5,4004.0044,3781.683,4008.5,3780.5,4010.3732) polygon(4043.3864,4000.5,4044.5,3999.1838,4046.3098,4000.5,4044.5,4001.4049) polygon(4027.5746,4000.5,4028.5,3999.2043,4029.0398,4000.5,4028.9319,4008.5,4028.5,4008.9628,4027.4203,4008.5) polygon(3877.8433,4000.5,3884.5,3994.751,3891.9399,4000.5,3891.4693,4008.5,3884.5,4015.0822,3877.0951,4008.5) polygon(3810.4317,4000.5,3812.5,3999.0522,3814.913,4000.5,3812.5,4001.7065) polygon(4031.8522,3992.5,4036.5,3986.6902,4039.5985,3992.5,4036.5,3995.234) polygon(4018.4681,3992.5,4020.5,3990.4681,4024.3098,3992.5,4020.5,3995.5479) polygon(3863.9601,3992.5,3860.5,3986.5684,3857.5342,3992.5,3860.5,3994.2301) polygon(3765.261,3984.5,3772.5,3982.087,3780.5,3982.087,3783.3956,3984.5,3780.5,3986.3098,3772.5,3986.3098) polygon(4057.9602,3976.5,4060.5,3974.9761,4062.4049,3976.5,4060.5,3978.8445) polygon(3916.6268,3976.5,3916.5,3976.1195,3908.5,3973.3645,3901.0889,3976.5,3908.5,3980.382,3916.5,3977.0073) polygon(3830.4469,3976.5,3828.5,3975.9159,3827.1522,3976.5,3828.5,3977.4734) polygon(4018.3406,3968.5,4012.5,3967.3319,4009.5797,3968.5,4012.5,3972.0044) polygon(3978.8805,3960.5,3972.5,3958.3732,3971.0821,3960.5,3972.5,3962.0951) polygon(4015.6902,3936.5,4012.5,3934.677,4009.3098,3936.5,4012.5,3938.323) polygon(4015.3761,3920.5,4012.5,3917.1163,4009.6239,3920.5,4012.5,3923.6957) polygon(3732.5895,3920.5,3732.5,3920.4338,3732.3309,3920.5,3732.5,3920.8805) polygon(3659.3863,3912.5,3660.5,3905.261,3661.4652,3912.5,3660.5,3914.913) polygon(4020.0373,3896.5,4020.5,3894.3406,4026.978,3896.5,4020.5,3896.9319) polygon(3653.8603,3896.5,3660.5,3893.1801,3668.5,3889.3656,3675.0399,3896.5,3670.1056,3904.5,3668.5,3905.9049,3661.0073,3904.5,3660.5,3904.2463) polygon(4023.0032,3888.5,4028.5,3884.6522,4036.1956,3888.5,4028.5,3896.1956) polygon(3982.2643,3888.5,3980.5,3887.4186,3978.7357,3888.5,3980.5,3894.087) polygon(3650.1555,3888.5,3652.5,3880.8805,3655.0399,3888.5,3652.5,3894.5956) polygon(4005.6902,3880.5,4004.5,3879.7065,4003.8199,3880.5,4004.5,3882.8805) polygon(4050.8944,3872.5,4052.5,3870.4565,4054.1056,3872.5,4052.5,3874.3732) polygon(3625.766,3848.5,3628.5,3842.6902,3635.1397,3848.5,3636.5,3853.261,3642.9781,3856.5,3636.5,3859.739,3628.5,3857.2198,3627.9601,3856.5) polygon(4019.7802,3840.5,4020.5,3838.8805,4021.4254,3840.5,4020.5,3840.9983) polygon(3652.7174,3824.5,3652.5,3824.2463,3652.4105,3824.5,3652.5,3824.6902) polygon(3611.8522,3824.5,3612.5,3822.3406,3613.2198,3824.5,3613.5342,3832.5,3612.5,3833.5342,3611.6484,3832.5) polygon(4026.4565,3808.5,4028.5,3807.0015,4034.1195,3808.5,4028.5,3810.2291) polygon(3956.6522,3792.5,3964.5,3787.2681,3972.3478,3792.5,3964.5,3798.1056) polygon(3584.7537,3792.5,3588.5,3790.4565,3592.9956,3792.5,3588.5,3794.5435) polygon(3978.7709,3784.5,3980.5,3780.7537,3981.9049,3784.5,3980.5,3786.5435) polygon(3538.0538,3784.5,3540.5,3782.5634,3544.7253,3784.5,3540.5,3787.234) polygon(4003.6484,3776.5,4004.5,3775.0522,4005.4049,3776.5,4007.5643,3784.5,4004.5,3787.5643,3996.5,3786.5319,3994.7072,3784.5,3996.5,3782.8959) polygon(3986.4317,3768.5,3988.5,3767.7761,3989.4652,3768.5,3988.5,3769.2239) polygon(3969.2888,3760.5,3972.5,3754.8805,3974.1056,3760.5,3972.5,3762.5435) polygon(3952.6902,3760.5,3956.5,3758.8959,3960.3098,3760.5,3956.5,3762.677) polygon(3596.0373,3760.5,3596.5,3759.2044,3597.2198,3760.5,3596.5,3761.7956) polygon(3600.6902,3752.5,3604.5,3749.7292,3609.5797,3752.5,3604.5,3755.0399) polygon(3985.6902,3744.5,3988.5,3743.2512,3990.3732,3744.5,3988.5,3746.1056) polygon(3968.8681,3744.5,3972.5,3737.6902,3977.0399,3744.5,3972.5,3751.3098) polygon(3580.0681,3744.5,3580.5,3741.261,3581.3098,3744.5,3580.5,3745.4254) polygon(3936.8805,3736.5,3940.5,3732.8805,3942.1087,3736.5,3940.5,3739.3956) polygon(3598.1761,3736.5,3604.5,3729.8433,3609.999,3736.5,3604.5,3741.999) polygon(3938.3406,3720.5,3940.5,3719.8522,3941.3098,3720.5,3940.5,3722.6594) polygon(3899.3863,3712.5,3892.5,3708.7699,3889.6122,3712.5,3892.5,3716.0809) polygon(3874.8805,3712.5,3868.5,3710.3732,3866.5368,3712.5,3868.5,3713.7761,3876.4105,3720.5,3876.5,3720.5585,3876.6171,3720.5,3876.5,3718.9781) polygon(3576.7537,3712.5,3580.5,3709.6902,3584.2463,3712.5,3580.5,3713.9049) polygon(3930.8913,3704.5,3932.5,3703.2935,3936.1195,3704.5,3935.9049,3712.5,3932.5,3718.5531,3924.5,3718.1195,3916.5,3719.3098,3908.7174,3712.5,3916.5,3708.6087,3924.5,3710.2522) polygon(3836.6268,3704.5,3836.5,3704.4338,3836.4565,3704.5,3836.5,3704.5724) polygon(3585.6902,3704.5,3588.5,3698.8805,3594.1195,3704.5,3588.5,3708.2463) polygon(3946.8913,3696.5,3948.5,3695.3863,3949.7065,3696.5,3948.5,3700.1195) polygon(3617.1135,3696.5,3620.5,3694.5951,3628.1195,3696.5,3620.5,3699.8865) polygon(3590.8805,3696.5,3596.5,3695.0015,3598.5435,3696.5,3596.5,3702.1195) polygon(3921.1135,3688.5,3924.5,3687.0486,3926.0239,3688.5,3927.971,3696.5,3924.5,3700.6652,3921.3761,3696.5) polygon(3585.2888,3680.5,3588.5,3677.6902,3596.5,3679.8522,3598.1195,3680.5,3596.5,3680.9983,3588.5,3683.3098) polygon(3923.1146,3672.5,3924.5,3670.4681,3925.8251,3672.5,3924.5,3673.9514) polygon(3710.2975,3672.5,3708.5,3669.8854,3705.6239,3672.5,3708.5,3674.5544) polygon(3603.8522,3672.5,3604.5,3671.7802,3610.9781,3672.5,3604.5,3674.1195) polygon(3819.0522,3664.5,3812.5,3659.0399,3808.8599,3664.5,3812.5,3669.9601) polygon(3575.8837,3664.5,3580.5,3658.4632,3587.6344,3664.5,3580.5,3668.2371) polygon(3839.0522,3656.5,3844.5,3653.4734,3852.5,3652.5951,3856.9627,3656.5,3852.5,3662.1798,3848.2463,3664.5,3844.5,3666.7478,3840.0044,3664.5) polygon(3685.3344,3656.5,3684.5,3653.5797,3683.1522,3656.5,3682.9781,3664.5,3684.5,3664.6384,3692.3616,3672.5,3691.4049,3680.5,3692.5,3681.5951,3698.6377,3688.5,3692.5,3694.3146,3687.3098,3696.5,3692.5,3697.884,3694.1609,3696.5,3700.5,3689.8967,3706.087,3688.5,3700.5,3687.2107,3693.2301,3680.5,3692.6171,3672.5,3692.5,3672.2826,3684.7174,3664.5) polygon(3553.6601,3656.5,3556.5,3654.097,3558.9991,3656.5,3556.5,3659.3399) polygon(3875.9601,3648.5,3876.5,3645.261,3877.2198,3648.5,3877.1581,3656.5,3876.5,3658.913,3869.261,3656.5) polygon(3729.6902,3648.5,3724.5,3642.5683,3717.5797,3648.5,3724.5,3650.2301) polygon(3571.4658,3648.5,3572.5,3646.8913,3573.4652,3648.5,3572.5,3650.913) polygon(3816.2747,3640.5,3820.5,3637.766,3828.5,3640.0017,3829.2198,3640.5,3828.5,3646.9781,3820.5,3646.3098) polygon(3654.2643,3640.5,3660.5,3636.1119,3666.1418,3640.5,3664.7699,3648.5,3665.326,3656.5,3660.5,3660.1195,3656.9956,3664.5,3652.5,3666.2291,3649.8702,3672.5,3644.5,3680.4276,3636.5,3674.1195,3630.1195,3680.5,3636.5,3681.8433,3641.999,3688.5,3636.5,3692.4525,3628.5,3696.2826,3625.6328,3688.5,3620.5,3682.4049,3613.9985,3688.5,3612.5,3691.3098,3604.5,3689.2198,3604.0017,3688.5,3604.5,3686.8805,3607.0522,3680.5,3612.5,3672.7174,3612.8805,3672.5,3620.5,3666.4044,3628.5,3669.6044,3632.146,3664.5,3628.5,3662.3732,3623.8015,3656.5,3627.7761,3648.5,3628.5,3647.0522,3630.3098,3648.5,3636.5,3654.0024,3640.2463,3656.5,3644.5,3659.0522,3648.146,3656.5,3652.5,3650.4044,3653.1801,3648.5) polygon(3611.4203,3640.5,3612.5,3639.9111,3620.5,3636.382,3625.0515,3640.5,3620.5,3643.482,3613.8854,3648.5,3615.5478,3656.5,3619.9049,3664.5,3612.5,3672.3986,3607.3488,3664.5,3609.4522,3656.5,3608.6902,3648.5) polygon(3833.9179,3632.5,3836.5,3629.766,3840.0753,3632.5,3836.5,3635.8199) polygon(3595.3863,3632.5,3596.5,3631.4658,3603.739,3632.5,3599.3098,3640.5,3596.5,3643.3098,3594.8944,3640.5) polygon(3810.087,3624.5,3812.5,3623.2935,3813.9478,3624.5,3812.5,3631.739) polygon(3787.5746,3624.5,3788.5,3624.0373,3789.2198,3624.5,3789.2198,3632.5,3788.5,3633.0399,3788.0017,3632.5) polygon(3686.087,3624.5,3692.5,3620.6522,3697.9969,3624.5,3692.5,3627.4598) polygon(3655.0786,3624.5,3660.5,3619.4658,3664.2094,3624.5,3660.5,3627.8561) polygon(3761.9601,3616.5,3764.5,3613.7292,3768.3098,3616.5,3764.5,3618.8445) polygon(3682.3406,3616.5,3684.5,3614.8805,3685.5797,3616.5,3684.5,3619.739) polygon(3594.0951,3616.5,3596.5,3610.087,3599.2484,3616.5,3596.5,3618.7634) polygon(3795.2512,3608.5,3796.5,3605.6902,3798.1056,3608.5,3796.5,3611.3098) polygon(3699.2044,3608.5,3700.5,3605.261,3702.1195,3608.5,3708.5,3610.8202,3716.5,3611.3358,3724.5,3608.6902,3725.0073,3608.5,3732.5,3605.2888,3734.7478,3608.5,3740.5,3612.0951,3748.5,3616.0373,3749.2198,3616.5,3751.5985,3624.5,3756.5,3628.001,3764.5,3628.5845,3769.9214,3632.5,3772.5,3636.6902,3777.5797,3640.5,3778.677,3648.5,3780.5,3650.6268,3783.3358,3648.5,3788.5,3645.766,3794.4681,3640.5,3796.5,3637.9601,3799.0399,3640.5,3804.5,3646.4565,3808.9956,3648.5,3812.5,3651.4203,3820.5,3652.8805,3822.913,3656.5,3824.1195,3664.5,3828.5,3668.8805,3835.739,3672.5,3836.5,3672.6087,3840.0638,3680.5,3844.5,3687.3761,3849.5934,3680.5,3849.2935,3672.5,3852.5,3667.6902,3857.6044,3664.5,3860.5,3662.6902,3861.9478,3664.5,3868.5,3671.0522,3875.739,3672.5,3868.5,3676.1195,3862.6594,3680.5,3860.5,3681.4254,3855.5478,3688.5,3860.5,3693.002,3866.0024,3688.5,3868.5,3684.0044,3872.8805,3680.5,3876.5,3673.261,3876.8805,3672.5,3884.5,3669.4522,3886.2928,3672.5,3892.5,3679.5348,3893.7065,3680.5,3893.1478,3688.5,3892.5,3689.7956,3887.7112,3696.5,3892.5,3698.4719,3900.5,3701.1801,3902.9462,3704.5,3907.739,3712.5,3906.8239,3720.5,3900.5,3727.9399,3899.7675,3728.5,3900.5,3729.8603,3901.6902,3728.5,3908.5,3723.5474,3911.7046,3728.5,3916.5,3735.2935,3923.2935,3728.5,3924.5,3723.674,3925.8162,3728.5,3930.3098,3736.5,3932.5,3739.0031,3937.3098,3744.5,3932.5,3747.998,3924.5,3751.1397,3923.6344,3752.5,3924.5,3753.1801,3932.5,3755.5951,3937.4522,3752.5,3940.5,3748.146,3948.5,3750.0024,3949.7488,3752.5,3948.5,3755.7112,3943.7112,3760.5,3948.5,3766.087,3949.7065,3768.5,3948.5,3773.326,3948.1033,3776.5,3948.5,3777.0601,3951.674,3776.5,3956.5,3775.2935,3964.5,3773.2888,3972.5,3771.9485,3978.677,3776.5,3972.5,3780.618,3964.5,3779.3098,3961.0399,3784.5,3956.5,3792.2826,3956.4308,3792.5,3956.5,3792.5761,3963.1033,3800.5,3964.1956,3808.5,3964.5,3808.5895,3972.4105,3816.5,3972.5,3816.5662,3974.0219,3816.5,3972.5,3816.1195,3964.8805,3808.5,3971.2044,3800.5,3972.5,3794.0219,3980.5,3799.0522,3981.9478,3800.5,3987.2484,3808.5,3983.739,3816.5,3982.1195,3824.5,3988.5,3826.0951,3990.8202,3824.5,3996.5,3821.3761,4004.3098,3824.5,3998.8445,3832.5,4001.9478,3840.5,3998.5683,3848.5,3996.5,3853.326,3989.261,3848.5,3988.5,3848.2463,3988.2826,3848.5,3988.5,3848.8805,3994.5956,3856.5,3996.5,3857.8603,3998.4044,3856.5,4004.5,3853.1135,4012.5,3856.0017,4020.5,3855.4658,4021.9478,3856.5,4025.306,3864.5,4020.5,3869.7065,4016.0373,3864.5,4012.5,3857.4254,4007.998,3864.5,4012.5,3869.002,4016.7753,3872.5,4020.5,3879.2044,4021.5797,3880.5,4020.5,3882.6594,4017.5797,3888.5,4012.5,3890.2928,4004.5,3895.9927,4003.9927,3896.5,3996.5,3902.1195,3996.1338,3904.5,3996.5,3906.4044,3996.914,3904.5,4004.5,3896.5692,4011.7699,3904.5,4012.5,3905.9601,4020.5,3909.9058,4024.1318,3912.5,4024.9556,3920.5,4028.5,3927.2935,4029.9478,3928.5,4028.5,3935.739,4028.1956,3936.5,4028.5,3937.261,4030.5684,3944.5,4028.5,3951.739,4020.5,3947.3098,4012.5,3948.8239,4004.5,3951.1397,4001.326,3952.5,4004.5,3953.3656,4012.5,3955.8419,4020.5,3959.4203,4028.5,3952.7537,4031.234,3960.5,4028.5,3964.3732,4021.4254,3968.5,4027.1521,3976.5,4020.5,3980.4308,4012.5,3978.7478,4004.5,3980.0239,4000.7906,3976.5,3996.5,3972.2094,3990.0929,3968.5,3988.5,3966.9071,3987.5266,3968.5,3988.5,3970.0929,3992.2094,3976.5,3996.5,3982.323,3998.5319,3984.5,3999.2239,3992.5,4004.5,4000.0372,4004.881,4000.5,4004.5,4006.978,3996.5,4006.1195,3995.8199,4008.5,3988.5,4012.2955,3980.5,4011.0822,3978.1761,4008.5,3980.5,4002.6902,3984.0044,4000.5,3980.5,3996.9956,3977.6902,3992.5,3972.5,3989.306,3964.5,3989.7065,3957.558,3984.5,3956.5,3983.1398,3948.5,3984.3098,3947.739,3984.5,3940.5,3986.1086,3936.3913,3992.5,3940.5,3996.0951,3944.9049,4000.5,3940.5,4004.2094,3932.5,4003.0652,3928.6522,4000.5,3927.9601,3992.5,3924.5,3990.424,3919.3098,3992.5,3918.5683,4000.5,3916.5,4002.1086,3908.5,4008.3617,3908.3098,4008.5,3900.5,4012.4049,3894.2522,4008.5,3895.674,4000.5,3900.5,3996.8805,3902.2522,3992.5,3900.5,3991.7035,3898.9071,3992.5,3892.5,3999.5479,3887.8015,3992.5,3884.5,3989.4049,3882.249,3992.5,3876.5,3999.1567,3871.3956,4000.5,3868.5,4001.5342,3862.7634,4008.5,3860.5,4016.1956,3860.3098,4016.5,3852.5,4023.442,3848.3348,4016.5,3845.558,4008.5,3844.5,4007.1398,3841.5951,4000.5,3844.5,3995.3358,3846.6268,3992.5,3848.6522,3984.5,3844.5,3982.903,3842.3146,3984.5,3836.5,3990.6377,3832.3098,3992.5,3828.5,3995.5479,3820.5,3998.1056,3816.1401,3992.5,3812.5,3989.6512,3805.2198,3992.5,3804.5,3993.5797,3803.4203,3992.5,3796.5,3989.5342,3790.6268,3984.5,3788.5,3982.9049,3782.4719,3976.5,3783.1208,3968.5,3780.5,3962.5435,3774.8805,3960.5,3772.5,3959.8199,3771.8199,3960.5,3772.5,3961.6902,3776.1319,3968.5,3772.5,3973.4525,3764.5,3975.2239,3756.5,3969.7065,3748.5,3969.4049,3747.2935,3968.5,3748.5,3966.087,3753.2888,3960.5,3751.413,3952.5,3755.4203,3944.5,3748.6087,3936.5,3748.5,3936.2463,3748.4105,3936.5,3743.3098,3944.5,3743.998,3952.5,3740.5,3956.3478,3732.8044,3952.5,3732.5,3950.9781,3724.5,3948.0239,3720.3542,3944.5,3716.5,3940.8599,3709.9478,3944.5,3712.7753,3952.5,3708.5,3954.9049,3706.4749,3952.5,3706.8913,3944.5,3700.5,3938.1087,3698.4317,3936.5,3700.5,3929.261,3701.0073,3928.5,3700.6171,3920.5,3708.5,3913.1801,3709.0601,3912.5,3708.5,3911.442,3700.5,3909.7488,3696.7209,3904.5,3700.5,3899.7761,3703.1208,3896.5,3700.5,3892.4049,3695.8199,3896.5,3692.5,3898.9462,3687.2239,3904.5,3690.1195,3912.5,3684.5,3919.9927,3683.0015,3912.5,3681.4734,3904.5,3677.7516,3896.5,3677.1801,3888.5,3677.5307,3880.5,3679.3683,3872.5,3676.5,3867.6239,3669.5342,3872.5,3672.1195,3880.5,3668.5,3885.326,3661.261,3880.5,3660.5,3880.3829,3652.5,3879.9927,3644.5,3876.1195,3643.4658,3872.5,3644.5,3868.8805,3652.5,3869.2888,3658.087,3864.5,3660.5,3860.8805,3663.0031,3856.5,3660.5,3855.1522,3654.6594,3856.5,3652.5,3857.7956,3646.0219,3856.5,3644.5,3856.2463,3637.8603,3848.5,3640.0373,3840.5,3636.5,3835.5478,3628.8805,3832.5,3632.6268,3824.5,3636.5,3819.8522,3638.5951,3816.5,3636.5,3814.9037,3632.3098,3816.5,3628.5,3819.5478,3620.5,3820.1319,3614.4469,3816.5,3620.5,3812.6087,3626.2522,3808.5,3620.5,3805.1163,3612.5,3804.3478,3610.0951,3800.5,3612.5,3797.002,3619.5746,3792.5,3620.5,3786.0219,3620.6014,3784.5,3620.5,3784.2826,3612.5,3780.3732,3604.5,3778.3098,3603.6484,3776.5,3604.5,3771.674,3612.5,3772.9247,3617.2935,3768.5,3615.8015,3760.5,3614.6902,3752.5,3614.4047,3744.5,3617.7292,3736.5,3620.5,3732.6902,3628.5,3728.7174,3628.6522,3728.5,3628.5,3728.3829,3620.5,3726.9037,3616.7753,3728.5,3612.5,3731.7065,3607.6902,3728.5,3608.0044,3720.5,3604.5,3718.3098,3602.9071,3720.5,3596.5,3726.9071,3593.1439,3720.5,3590.8202,3712.5,3596.5,3705.558,3604.5,3705.8603,3609.261,3704.5,3612.5,3703.4203,3613.5797,3704.5,3620.5,3707.9601,3625.6902,3704.5,3628.5,3697.0073,3636.5,3701.1258,3640.6781,3696.5,3644.5,3691.1146,3648.9247,3688.5,3644.6902,3680.5,3652.5,3677.029,3658.7709,3672.5,3660.5,3668.0044,3664.9956,3672.5,3668.5,3676.0044,3675.9927,3680.5,3676.5,3682.0219,3676.6087,3680.5,3676.5,3680.3478,3669.9601,3672.5,3668.5,3669.9969,3663.0031,3664.5,3668.5,3658.087,3669.2935,3656.5,3675.9601,3648.5,3672.6268,3640.5,3671.413,3632.5,3676.5,3626.7348,3679.826,3632.5,3684.5,3635.538,3692.5,3635.7761,3697.1801,3632.5,3700.5,3626.6902,3708.5,3626.2522,3716.5,3627.3761,3722.9049,3632.5,3724.5,3637.6044,3732.5,3634.4632,3740.5,3638.4565,3745.9601,3632.5,3744.2747,3624.5,3740.5,3621.5342,3732.5,3618.5683,3724.5,3621.7065,3716.5,3620.0753,3708.5,3622.7478,3700.5,3622.7478,3695.694,3616.5) polygon(3611.0951,3608.5,3612.5,3607.0951,3614.9976,3608.5,3615.3098,3616.5,3612.5,3618.2291,3610.6268,3616.5) polygon(3736.2247,3600.5,3740.5,3599.0201,3744.7753,3600.5,3740.5,3603.7065) polygon(3702.8805,3600.5,3708.5,3598.2522,3714.1195,3600.5,3708.5,3604.2463) polygon(3666.4317,3600.5,3668.5,3598.8913,3676.5,3598.323,3684.1195,3600.5,3676.5,3602.677,3672.2094,3608.5,3668.5,3612.4155,3660.5,3611.3098,3658.2522,3608.5,3660.5,3605.6902) polygon(3683.2935,3592.5,3684.5,3588.8805,3692.5,3590.8913,3694.3098,3592.5,3692.5,3595.3956,3684.5,3599.739) polygon(3689.6808,3568.5,3692.5,3565.7893,3695.2107,3568.5,3692.5,3572.0239) polygon(3640.6522,3568.5,3644.5,3566.4749,3646.249,3568.5,3644.5,3571.2484) polygon(3666.6902,3560.5,3668.5,3558.087,3669.6137,3560.5,3668.5,3562.1087) polygon(3816.9362,3536.5,3820.5,3533.8696,3828.5,3533.6672,3831.7493,3536.5,3828.5,3540.0638,3820.5,3540.1826) polygon(3635.317,3536.5,3636.5,3534.4565,3638.9976,3536.5,3636.5,3539.7112) polygon(4139.0883,4648.5,4140.5,4647.0883,4141.9117,4648.5,4140.5,4654.5) polygon(4007.9783,4608.5,4012.5,4603.9783,4016.5,4608.5,4012.5,4612.66) polygon(4176.5,4552.5,4180.5,4548.6482,4184.3518,4552.5,4184.5,4560.5,4180.5,4564.674,4175.7,4560.5) polygon(3511.6111,4544.5,3516.5,4540.3096,3520.5,4544.5,3516.5,4548.5) polygon(4022.3334,4536.5,4028.5,4530.4592,4034.1923,4536.5,4028.5,4542.5408) polygon(3522.2778,4392.5,3524.5,4390.1471,3532.5,4385.2742,3539.3923,4392.5,3532.5,4399.0883,3524.5,4395.1666) polygon(3171.3571,4392.5,3172.5,4391.3572,3173.9545,4392.5,3172.5,4394.5) polygon(3706.9,4376.5,3708.5,4375.4333,3709.5,4376.5,3708.5,4378.1) polygon(4325.6282,4280.5,4332.5,4273.8827,4340.0493,4280.5,4332.5,4287.1173) polygon(3569.8333,4200.5,3572.5,4199.8334,3573.3,4200.5,3572.5,4201.6428) polygon(3684.5,4184.5,3684.5,4184.5,3684.5,4184.5,3684.5,4184.5) polygon(3527.7941,4168.5,3532.5,4163.5,3540.5,4163.6305,3548.5,4162.3182,3554.6818,4168.5,3556.5,4169.1061,3564.125,4176.5,3564.5,4179.1666,3567.3235,4184.5,3565.7308,4192.5,3564.5,4196.5,3563.0455,4200.5,3556.5,4206.5,3548.5,4206.2142,3540.5,4202.5,3537.3,4200.5,3532.5,4198.6538,3524.5,4193.3,3523.1667,4192.5,3524.5,4190.9,3525.6852,4184.5,3524.5,4179.1666,3521.3,4176.5,3524.5,4174.7222) polygon(3778.7222,4152.5,3780.5,4150.2142,3781.9545,4152.5,3780.5,4154.1) polygon(3937.8333,4144.5,3940.5,4143,3942.5,4144.5,3940.5,4147.5) polygon(3657.8333,4144.5,3660.5,4143.3572,3668.5,4144.5,3668.5,4144.5,3668.5,4144.5,3660.5,4146.5) polygon(4408.0862,4136.5,4412.5,4131.38,4417.62,4136.5,4419.1086,4144.5,4412.5,4150.8334,4405.8914,4144.5) polygon(3996.5,4128.5,3996.5,4128.5,3996.5,4128.5,3996.5,4128.5) polygon(3972.5,4128.5,3972.5,4128.5,3972.5,4128.5,3972.5,4128.5) polygon(3931.7,4128.5,3932.5,4126.9,3933.5,4128.5,3932.5,4129.8334) polygon(3963.3571,4120.5,3964.5,4119.6111,3966.5,4120.5,3964.5,4121.5) polygon(3923.7727,4120.5,3924.5,4119.7727,3926.1,4120.5,3924.5,4121.3) polygon(3883.0455,4120.5,3884.5,4118.9,3887.1667,4120.5,3892.5,4128.5,3892.5,4128.5,3892.5,4128.5,3884.5,4128.5,3884.5,4128.5) polygon(4068.5,4112.5,4068.5,4112.5,4068.5,4112.5,4068.5,4112.5) polygon(4051.5,4104.5,4052.5,4102.9,4054.1,4104.5,4052.5,4105.5) polygon(3914.5,4104.5,3916.5,4103.6111,3919.1667,4104.5,3916.5,4105.5) polygon(4100.5,4096.5,4100.5,4096.5,4100.5,4096.5,4100.5,4096.5) polygon(4026.6538,4096.5,4028.5,4093.5,4030.6818,4096.5,4028.5,4099.1666) polygon(3884.5,4096.5,3884.5,4096.5,3884.5,4096.5,3884.5,4096.5) polygon(3850.9,4096.5,3852.5,4094.9,3853.5,4096.5,3852.5,4097.1666) polygon(3787.7,4096.5,3788.5,4095.7,3789.3889,4096.5,3788.5,4097.1666) polygon(3772.5,4096.5,3772.5,4096.5,3772.5,4096.5,3772.5,4096.5) polygon(4058.9,4088.5,4060.5,4085.3,4063.1666,4088.5,4060.5,4091.1666) polygon(3820.5,4088.5,3820.5,4088.5,3820.5,4088.5,3820.5,4088.5) polygon(3747.9286,4088.5,3748.5,4084.5,3749.3889,4088.5,3748.5,4090.1) polygon(3795.5,4080.5,3796.5,4079.3572,3799.1667,4080.5,3796.5,4081.8334) polygon(3778.7857,4080.5,3780.5,4077.0714,3782.9,4080.5,3780.5,4083.9286) polygon(3737.8333,4080.5,3740.5,4079.3572,3744.5,4080.5,3740.5,4081.0714) polygon(4099.3572,4072.5,4100.5,4071.3572,4101.6428,4072.5,4100.5,4074.1) polygon(3886.5,4072.5,3884.5,4069.8334,3881.5,4072.5,3884.5,4075.9286) polygon(4071.4091,4064.5,4076.5,4060.1923,4080.8077,4064.5,4080.5,4072.5,4076.5,4073.2273,4075.5,4072.5) polygon(3901.9545,4064.5,3900.5,4063.2693,3898.5,4064.5,3900.5,4065.4412) polygon(3847.4091,4064.5,3844.5,4062.5,3839.1667,4064.5,3844.5,4072.5) polygon(3796.5,4064.5,3796.5,4064.5,3796.5,4064.5,3796.5,4064.5) polygon(3698.2143,4056.5,3700.5,4054.7222,3702.2778,4056.5,3700.5,4058.2778) polygon(3602.1,4056.5,3604.5,4054.6538,3607.5,4056.5,3604.5,4058.5) polygon(4087.5,4048.5,4092.5,4042.7858,4096.9445,4048.5,4096.5,4056.5,4092.5,4058.5,4091.7727,4056.5) polygon(3998.7857,4048.5,3996.5,4046.5,3995.3571,4048.5,3996.5,4052.5) polygon(3667.7,4048.5,3668.5,4047.1666,3669.5,4048.5,3668.5,4050.1) polygon(3644.5,4048.5,3644.5,4048.5,3652.5,4048.5,3652.5,4048.5,3652.5,4048.5,3644.5,4048.5) polygon(3733.6429,4040.5,3740.5,4035.1666,3745.8333,4040.5,3740.5,4047.3572) polygon(3724.5,4040.5,3724.5,4040.5,3724.5,4040.5,3724.5,4040.5) polygon(3612.5,4040.5,3612.5,4040.5,3612.5,4040.5,3612.5,4040.5) polygon(3580.5,4040.5,3580.5,4040.5,3580.5,4040.5,3580.5,4040.5) polygon(3679.1667,4032.5,3684.5,4030.2142,3686.5,4032.5,3684.5,4035.7) polygon(3596.5,4032.5,3596.5,4032.5,3596.5,4032.5,3596.5,4032.5) polygon(3707.3571,4024.5,3708.5,4020.5,3710.1,4024.5,3708.5,4025.3889) polygon(4103.4091,4016.5,4108.5,4009.5,4114.7222,4016.5,4108.5,4020) polygon(4084.5,4016.5,4076.5,4015.8846,4075.7727,4016.5,4076.5,4017.1666) polygon(3668.5,4016.5,3668.5,4016.5,3668.5,4016.5,3674.2143,4024.5,3668.5,4028.1364,3665.1667,4024.5) polygon(3646.5,4016.5,3652.5,4014.7858,3657.3,4016.5,3652.5,4018.3462) polygon(3672.5,4008.5,3676.5,4004.5,3682.9,4008.5,3676.5,4011.1666) polygon(3642.1,4008.5,3644.5,4004.5,3646.2143,4008.5,3644.5,4014.5) polygon(3515.6111,4008.5,3516.5,4007.3572,3517.2273,4008.5,3516.5,4010.1) polygon(4098.5,4000.5,4092.5,3997.0714,4088.5,4000.5,4092.5,4002.9) polygon(3660.5,4000.5,3660.5,4000.5,3660.5,4000.5,3660.5,4000.5) polygon(3596.5,4000.5,3596.5,4000.5,3596.5,4000.5,3596.5,4000.5) polygon(3588.5,3992.5,3588.5,3992.5,3588.5,3992.5,3588.5,3992.5) polygon(3387.0454,3992.5,3388.5,3991.2693,3389.5,3992.5,3388.5,3994.5) polygon(4228.5,3984.5,4228.5,3984.5,4228.5,3984.5,4228.5,3984.5) polygon(4156.5,3984.5,4156.5,3984.5,4156.5,3984.5,4156.5,3984.5) polygon(3537.8333,3984.5,3540.5,3982.2142,3541.7308,3984.5,3540.5,3988.5) polygon(4172.5,3976.5,4172.5,3976.5,4172.5,3976.5,4172.5,3976.5) polygon(4135.5,3976.5,4140.5,3970.7858,4143.1666,3976.5,4140.5,3979.3572) polygon(3616.8077,3976.5,3620.5,3970.5,3625.3,3976.5,3620.5,3982.5) polygon(3595.6111,3976.5,3596.5,3975.5,3604.5,3975.1666,3605.5,3976.5,3604.5,3977.5,3596.5,3979.1666) polygon(4093.6428,3968.5,4092.5,3965.8334,4091.8846,3968.5,4092.5,3976.5) polygon(3624.5,3968.5,3628.5,3966.5,3633.8333,3968.5,3628.5,3971.1666) polygon(3570.9,3968.5,3572.5,3967.3572,3573.1667,3968.5,3572.5,3969.6428) polygon(3535.1667,3968.5,3540.5,3966.7222,3542.2778,3968.5,3540.5,3970.7858) polygon(3524.5,3968.5,3524.5,3968.5,3524.5,3968.5,3524.5,3968.5) polygon(4118.5,3960.5,4124.5,3955.7,4129.3,3960.5,4124.5,3964.5) polygon(3631.1667,3960.5,3636.5,3954.1,3643.8846,3960.5,3636.5,3967.8846) polygon(3615.8333,3960.5,3620.5,3953.5,3624.8077,3960.5,3620.5,3966.7222) polygon(3588.5,3960.5,3588.5,3960.5,3596.5,3955.7,3599.5,3960.5,3596.5,3962.9,3588.5,3968.5,3588.5,3968.5,3588.5,3968.5) polygon(3546.1,3960.5,3548.5,3957.8333,3550.5,3960.5,3548.5,3962.9) polygon(3508.5,3960.5,3508.5,3960.5,3508.5,3960.5,3508.5,3960.5) polygon(3572.5,3952.5,3572.5,3952.5,3580.5,3952.5,3580.5,3952.5,3580.5,3952.5,3572.5,3952.5) polygon(3353.8333,3952.5,3356.5,3950.5,3358.2778,3952.5,3356.5,3954.2778) polygon(4156.5,3936.5,4156.5,3936.5,4156.5,3936.5,4156.5,3936.5) polygon(3570.7222,3936.5,3572.5,3934.2143,3575.7,3936.5,3572.5,3941.8333) polygon(3547.8333,3936.5,3548.5,3933.8333,3556.5,3934.9,3558.2778,3936.5,3556.5,3939.1667,3548.5,3937.6429) polygon(3523.7727,3928.5,3524.5,3924.5,3525.3,3928.5,3524.5,3930.1) polygon(3631.4091,3920.5,3628.5,3915.1667,3624.9445,3920.5,3623.9286,3928.5,3620.5,3931.5,3612.5,3932.5,3604.5,3928.5,3596.5,3936.5,3604.5,3937.8333,3612.5,3938.5,3620.5,3939.8333,3624.5,3936.5,3628.5,3932.0555,3631.4091,3928.5) polygon(4154.2142,3912.5,4156.5,3909.3,4157.9546,3912.5,4156.5,3913.8333) polygon(3554.2143,3912.5,3556.5,3910.5,3559.7,3912.5,3556.5,3915.7) polygon(3536.5,3912.5,3540.5,3908.5,3542.7857,3912.5,3540.5,3913.9545) polygon(3476.5,3912.5,3476.5,3912.5,3476.5,3912.5,3476.5,3912.5) polygon(3598.7857,3904.5,3596.5,3903.0455,3592.5,3904.5,3596.5,3906.7857) polygon(3562.5,3904.5,3564.5,3900.5,3569.8333,3904.5,3564.5,3907.7) polygon(3468.5,3904.5,3468.5,3904.5,3468.5,3904.5,3468.5,3904.5) polygon(3566.7857,3896.5,3572.5,3890.7857,3579.1667,3896.5,3572.5,3903.1667) polygon(3525.8333,3896.5,3532.5,3889.8333,3540.5,3896.5,3540.5,3896.5,3540.5,3896.5,3539.1667,3904.5,3532.5,3911.1667,3526.7857,3904.5) polygon(3500.5,3896.5,3500.5,3896.5,3500.5,3896.5,3500.5,3896.5) polygon(3452.5,3896.5,3452.5,3896.5,3452.5,3896.5,3452.5,3896.5) polygon(4212.5,3880.5,4212.5,3880.5,4212.5,3880.5,4212.5,3880.5) polygon(3508.5,3880.5,3508.5,3880.5,3516.5,3880.5,3516.5,3880.5,3516.5,3880.5,3508.5,3880.5) polygon(4125.5,3872.5,4124.5,3871.7727,4123.7727,3872.5,4124.5,3874.1) polygon(3492.5,3872.5,3492.5,3872.5,3492.5,3872.5,3492.5,3872.5) polygon(3457.1667,3872.5,3460.5,3869.4231,3464.1364,3872.5,3460.5,3876.9445) polygon(4117.8334,3856.5,4116.5,3854.5,4114.5,3856.5,4116.5,3858.7857) polygon(3428.5,3856.5,3428.5,3856.5,3428.5,3856.5,3428.5,3856.5) polygon(3489.3,3848.5,3492.5,3843.9286,3497.0714,3848.5,3492.5,3852.5) polygon(3474.3667,3848.5,3476.5,3843.9286,3479.7,3848.5,3476.5,3850.9615) polygon(4162.5,3840.5,4164.5,3838.5,4167.1666,3840.5,4164.5,3842.5) polygon(4116.5,3840.5,4108.5,3839.0455,4107.5,3840.5,4108.5,3842.2778) polygon(3457.8333,3840.5,3460.5,3838.7222,3461.8333,3840.5,3460.5,3848.5,3460.5,3848.5,3460.5,3848.5) polygon(4093.5,3832.5,4092.5,3830.5,4092.1,3832.5,4092.5,3833.2273) polygon(3500.5,3832.5,3500.5,3832.5,3500.5,3832.5,3500.5,3832.5) polygon(3451.6111,3832.5,3452.5,3829.8333,3453.5,3832.5,3452.5,3834.1) polygon(3404.5,3832.5,3404.5,3832.5,3404.5,3832.5,3404.5,3832.5) polygon(4160.5,3824.5,4164.5,3823.5,4166.1,3824.5,4164.5,3825.6429) polygon(3483.5,3824.5,3484.5,3820.5,3485.5,3824.5,3484.5,3827.1667) polygon(3252.5,3824.5,3252.5,3824.5,3252.5,3824.5,3252.5,3824.5) polygon(3387.0454,3816.5,3388.5,3814.7222,3390.5,3816.5,3388.5,3820.5) polygon(4163.3572,3808.5,4164.5,3807.7,4165.5,3808.5,4164.5,3809.5) polygon(3457.8333,3808.5,3460.5,3806.9,3468.5,3805.0714,3471.5,3808.5,3476.5,3815.1667,3480.5,3816.5,3476.5,3817.5,3472.5,3824.5,3468.5,3828,3460.5,3826.9,3455.7,3824.5,3460.5,3816.5) polygon(3440.5,3808.5,3444.5,3805.3,3448.5,3808.5,3444.5,3810.5) polygon(3380.5,3808.5,3380.5,3808.5,3380.5,3808.5,3380.5,3808.5) polygon(3526.1,3800.5,3524.5,3798.2143,3522.2143,3800.5,3524.5,3802.5,3531.3571,3808.5,3532.5,3809.6429,3533.1667,3808.5,3532.5,3807.6111) polygon(3488.0555,3800.5,3492.5,3796.5,3499.1667,3800.5,3500.5,3808.5,3500.5,3808.5,3508.5,3816.5,3508.5,3816.5,3508.5,3816.5,3500.5,3821.8333,3494.1,3816.5,3492.5,3815.8333,3487,3808.5) polygon(3393.0714,3800.5,3396.5,3797.8333,3399.9286,3800.5,3396.5,3805.3) polygon(4140.5,3792.5,4140.5,3792.5,4140.5,3792.5,4140.5,3800.5,4140.5,3800.5,4136.5,3808.5,4132.5,3812.5,4129.3,3808.5,4126.2778,3800.5,4132.5,3795.8333) polygon(4124.5,3792.5,4124.5,3792.5,4124.5,3792.5,4124.5,3792.5) polygon(4086.1,3792.5,4084.5,3788.5,4082.5,3792.5,4076.5,3798.5,4074.7222,3800.5,4076.5,3801.7308,4077.4412,3800.5,4084.5,3793.4412,4092,3800.5,4092.5,3802.5,4093.6428,3800.5,4092.5,3799.6111) polygon(3466.7222,3792.5,3468.5,3789.3,3471.7,3792.5,3468.5,3795.1667) polygon(3442.0385,3792.5,3444.5,3789.5909,3448.5,3792.5,3444.5,3797.0714) polygon(3422.5,3792.5,3428.5,3789.8333,3430.5,3792.5,3428.5,3800.5,3428.5,3800.5,3428.5,3800.5) polygon(3510.1,3784.5,3508.5,3783.7,3507.5,3784.5,3508.5,3788.5) polygon(3304.0555,3784.5,3308.5,3781.8333,3311.1667,3784.5,3308.5,3787.8333) polygon(4124.5,3776.5,4124.5,3776.5,4132.5,3775.1667,4140.5,3776.5,4140.5,3776.5,4140.5,3776.5,4132.5,3779.1667,4124.5,3776.5) polygon(3443.1667,3776.5,3444.5,3775.5,3445.5,3776.5,3444.5,3777.5) polygon(3404.5,3776.5,3404.5,3776.5,3404.5,3776.5,3404.5,3776.5) polygon(3436.5,3768.5,3436.5,3768.5,3436.5,3768.5,3436.5,3768.5) polygon(3409.3,3768.5,3412.5,3766.7222,3415.7,3768.5,3412.5,3772.5) polygon(4108.5,3760.5,4108.5,3760.5,4116.5,3756.1923,4122.1,3760.5,4116.5,3766.1,4108.5,3760.5) polygon(4064.5,3760.5,4060.5,3758.5,4059.7,3760.5,4060.5,3761.6429) polygon(3556.8636,3760.5,3556.5,3760.0294,3555.8846,3760.5,3556.5,3761.5) polygon(3428.5,3760.5,3428.5,3760.5,3428.5,3760.5,3428.5,3760.5) polygon(3511.5,3752.5,3508.5,3749.5,3506.7857,3752.5,3508.5,3755.1667,3513.8333,3760.5,3516.5,3763.9286,3519.5,3760.5,3516.5,3757.5) polygon(3459.3571,3752.5,3460.5,3750.9,3468.5,3747.9286,3472.0555,3752.5,3476.5,3756.5,3481.5,3760.5,3476.5,3767.1667,3472.5,3768.5,3468.5,3776.5,3468.5,3776.5,3466.1,3784.5,3460.5,3788.5,3452.5,3788.9445,3449.1667,3784.5,3452.5,3781.1667,3457.5909,3776.5,3460.5,3770.1,3464.5,3768.5,3463.7,3760.5,3460.5,3754.1) polygon(4132.5,3744.5,4132.5,3744.5,4132.5,3744.5,4132.5,3752.5,4132.5,3752.5,4132.5,3752.5) polygon(4140.5,3736.5,4140.5,3736.5,4140.5,3736.5,4140.5,3736.5) polygon(4047.9286,3736.5,4044.5,3734.1,4043,3736.5,4044.5,3738.1) polygon(3372.5,3736.5,3372.5,3736.5,3380.5,3736.5,3380.5,3736.5,3380.5,3736.5,3372.5,3736.5) polygon(4093.3889,3728.5,4100.5,3724.5,4108.5,3728.5,4108.5,3728.5,4116.5,3736.5,4116.5,3736.5,4116.5,3736.5,4108.5,3740.5,4100.5,3738.5,4096.5,3736.5) polygon(3423.7,3728.5,3428.5,3721.6429,3434.5,3728.5,3428.5,3735.3571) polygon(3412.5,3728.5,3412.5,3728.5,3412.5,3728.5,3412.5,3728.5) polygon(4073.3,3720.5,4068.5,3715.7,4066.7858,3720.5,4060.5,3727.8333,4058.9,3728.5,4060.5,3730.1,4068.5,3735.1667,4071.1666,3728.5) polygon(3486.5,3720.5,3484.5,3719.3571,3476.5,3720.5,3481.3,3728.5,3484.5,3730.2778,3490.1,3736.5,3492.5,3739.9286,3500.5,3738.1,3502.1,3736.5,3500.5,3732.5,3496.5,3728.5,3492.5,3727.3571) polygon(3476.5,3720.5,3468.5,3716.5,3460.5,3716.5,3452.5,3719.1667,3449.8333,3720.5,3449.3,3728.5,3452.5,3730.5,3455.1667,3728.5,3460.5,3724.5,3468.5,3726.5) polygon(3415.5,3720.5,3420.5,3716.8636,3427.1667,3720.5,3420.5,3724.9445) polygon(3396.5,3720.5,3396.5,3720.5,3404.5,3720.5,3404.5,3720.5,3404.5,3720.5,3396.5,3720.5) polygon(4132.5,3704.5,4132.5,3704.5,4132.5,3704.5,4132.5,3704.5) polygon(4100.5,3704.5,4100.5,3704.5,4100.5,3704.5,4102.7858,3712.5,4100.5,3714.1,4097.8334,3712.5) polygon(4046.5,3704.5,4044.5,3702.9,4041.8334,3704.5,4036.5,3707.7,4034.5,3712.5,4036.5,3713.9117,4043.0883,3720.5,4044.5,3722.9,4046.3462,3720.5,4044.5,3717.0714,4039.9286,3712.5,4044.5,3706.1) polygon(3501.8333,3704.5,3500.5,3699.1667,3498.9,3704.5,3500.5,3706.5) polygon(3478.5,3704.5,3476.5,3703.4333,3468.5,3704.5,3476.5,3707.1667) polygon(3403.3571,3704.5,3404.5,3703.7,3412.5,3701.8333,3417.3,3704.5,3412.5,3712.5,3412.5,3712.5,3412.5,3712.5,3404.5,3708.5) polygon(3480.1364,3688.5,3476.5,3681.8333,3472.8636,3688.5,3476.5,3690.7222) polygon(3364.5,3688.5,3364.5,3688.5,3364.5,3688.5,3364.5,3688.5) polygon(4076.5,3680.5,4076.5,3680.5,4084.5,3679.3571,4086.1,3680.5,4088.5,3688.5,4084.5,3690.3461,4081.5,3688.5,4076.5,3680.5) polygon(3997.6429,3680.5,3996.5,3672.5,3995.3571,3680.5,3996.5,3681.3) polygon(3354.9,3680.5,3356.5,3678.9,3360.5,3680.5,3356.5,3682.7857) polygon(3308.5,3680.5,3308.5,3680.5,3308.5,3680.5,3308.5,3680.5) polygon(3415.5,3672.5,3420.5,3669.1667,3428.5,3671.5,3429.5,3672.5,3433.3,3680.5,3429.6429,3688.5,3428.5,3692.5,3420.5,3693.5909,3415.8333,3688.5,3412.5,3685.6429,3406.9615,3680.5,3412.5,3674.5) polygon(3404.5,3672.5,3404.5,3672.5,3404.5,3672.5,3404.5,3672.5) polygon(3347.6111,3672.5,3348.5,3671.6111,3349.3889,3672.5,3348.5,3673.3889) polygon(4077.5,3664.5,4084.5,3661.2059,4087.6111,3664.5,4084.5,3668.8077) polygon(4068.5,3664.5,4068.5,3664.5,4068.5,3664.5,4068.5,3664.5) polygon(3409.5,3656.5,3412.5,3653.0714,3415.1667,3656.5,3414.2778,3664.5,3412.5,3667.7,3409.8333,3664.5) polygon(3370.6538,3656.5,3372.5,3650.5,3380.5,3655.1667,3382.5,3656.5,3382.1,3664.5,3383.7,3672.5,3380.5,3676.5,3379.0454,3672.5,3379.3571,3664.5,3372.5,3659.1667) polygon(3331.5,3656.5,3332.5,3655.8846,3334.5,3656.5,3332.5,3657.3) polygon(4056.5,3648.5,4060.5,3647.5,4064.5,3648.5,4060.5,3649.8333) polygon(3989.0333,3648.5,3988.5,3640.5,3986.9,3648.5,3981.8333,3656.5,3988.5,3660.9445,3991.5769,3656.5) polygon(3977.3,3648.5,3972.5,3643.7,3966.5,3648.5,3964.5,3652.5,3962.2143,3656.5,3964.5,3658.2778,3965.6429,3656.5,3972.5,3651.1667) polygon(3949.2273,3648.5,3948.5,3647.8333,3947.3571,3648.5,3948.5,3649.0333) polygon(3511.4091,3648.5,3508.5,3646.3666,3504.9445,3648.5,3500.5,3653.5,3492.5,3654.6177,3489.3,3656.5,3492.5,3661.8333,3496.5,3664.5,3500.5,3672.5,3508.5,3667.7,3509.7308,3664.5,3508.5,3662.5,3503.1667,3656.5,3508.5,3651.7) polygon(3442.7222,3648.5,3444.5,3643.1667,3446.5,3648.5,3444.5,3651.1667) polygon(3340.5,3648.5,3340.5,3648.5,3348.5,3646.2143,3350.2778,3648.5,3348.5,3650.5,3340.5,3648.5) polygon(3324.5,3648.5,3324.5,3648.5,3324.5,3648.5,3324.5,3648.5) polygon(3267.2692,3648.5,3268.5,3646.9,3269.9546,3648.5,3268.5,3650.5) polygon(4092.5,3640.5,4092.5,3640.5,4092.5,3640.5,4092.5,3640.5) polygon(4067.5,3640.5,4068.5,3636.5,4069.6428,3640.5,4068.5,3644.5) polygon(4047.7,3640.5,4052.5,3637.8333,4054.9,3640.5,4052.5,3646.5) polygon(3933.3,3640.5,3932.5,3638.9,3931.7727,3640.5,3932.5,3641.3) polygon(3426.5,3640.5,3428.5,3636.5,3436.5,3637.8333,3440.5,3640.5,3436.5,3641.5,3428.5,3641.3889) polygon(3409.3,3640.5,3412.5,3635.1667,3415.7,3640.5,3412.5,3643.1667) polygon(3331.5,3640.5,3332.5,3638.5,3334.1,3640.5,3332.5,3641.1154) polygon(4032.5,3632.5,4036.5,3628.9445,4039.7,3632.5,4036.5,3635.7) polygon(3502.6818,3632.5,3500.5,3630.1,3499.0882,3632.5,3500.5,3635.1667) polygon(3452.5,3632.5,3452.5,3632.5,3452.5,3632.5,3460.5,3636.7667,3466.7222,3640.5,3460.5,3646.1,3452.5,3640.5,3452.5,3640.5) polygon(3420.5,3632.5,3420.5,3632.5,3420.5,3632.5,3420.5,3632.5) polygon(3391.7,3632.5,3396.5,3628.1364,3401.3,3632.5,3396.5,3637.8333) polygon(3362.3182,3632.5,3364.5,3627.7,3369.3,3632.5,3364.5,3634.6818) polygon(4013.5,3624.5,4020.5,3617.5,4028.5,3620.5,4032.5,3624.5,4028.5,3628.9445,4020.5,3631.5) polygon(3438.9,3624.5,3444.5,3618.9,3451.5,3624.5,3444.5,3629.5909) polygon(3386.9,3624.5,3388.5,3623.3571,3389.8333,3624.5,3388.5,3626.1) polygon(3372.5,3624.5,3372.5,3624.5,3372.5,3624.5,3372.5,3624.5) polygon(3348.5,3624.5,3348.5,3624.5,3356.5,3623.8333,3359.1667,3624.5,3356.5,3625.3889,3348.5,3624.5) polygon(3324.5,3624.5,3324.5,3624.5,3324.5,3624.5,3324.5,3624.5) polygon(4050.1471,3616.5,4052.5,3610.7857,4055.3572,3616.5,4052.5,3620.1364) polygon(4032.5,3616.5,4036.5,3610.7857,4038.8529,3616.5,4036.5,3620.5) polygon(3422.9,3616.5,3428.5,3610.2778,3436.5,3611.1667,3439.7,3616.5,3436.5,3619.7,3428.5,3621.5909) polygon(4019.6111,3608.5,4020.5,3605.8333,4021.6428,3608.5,4020.5,3612.5) polygon(3396.5,3608.5,3396.5,3608.5,3404.5,3603.1667,3412.5,3603.7,3416.5,3608.5,3412.5,3616.5,3412.5,3616.5,3412.5,3616.5,3404.5,3612.5,3400.5,3616.5,3396.5,3618.7857,3394.5,3616.5) polygon(3363.1667,3608.5,3364.5,3607.6111,3372.5,3605.5,3375.5,3608.5,3372.5,3612.5,3364.5,3609.6429) polygon(3950.1,3600.5,3956.5,3595.9286,3961.8333,3600.5,3956.5,3606.9) polygon(3511.1667,3600.5,3508.5,3595.1667,3502.1,3600.5,3508.5,3603.1667) polygon(3498.5,3600.5,3492.5,3595.7,3490.3182,3600.5,3484.5,3605.0714,3480.5,3608.5,3476.5,3612.8636,3470.7857,3616.5,3476.5,3621.5,3479.8333,3616.5,3484.5,3612.1923,3492.5,3611.4091,3494.9615,3608.5) polygon(3999.9286,3592.5,4004.5,3588.5,4009.8333,3592.5,4006.1,3600.5,4006.1,3608.5,4007.7,3616.5,4004.5,3619.7,4001.8333,3616.5,3996.5,3608.5,3996.5,3608.5,3996.5,3608.5,4001.8333,3600.5) polygon(3909.3889,3592.5,3908.5,3584.5,3907.1667,3592.5,3908.5,3593.6429) polygon(3415.1667,3592.5,3420.5,3586.1,3426.3182,3592.5,3425.8333,3600.5,3420.5,3603.7,3416.5,3600.5) polygon(3372.5,3592.5,3372.5,3592.5,3380.5,3592.5,3380.5,3592.5,3380.5,3600.5,3380.5,3600.5,3380.5,3600.5,3372.5,3592.5) polygon(3944.5,3584.5,3940.5,3582.1,3937.0714,3584.5,3932.5,3589.0714,3929.5,3592.5,3932.5,3597.3,3940.5,3596.5,3946.9,3600.5,3948.5,3601.2273,3955.7727,3608.5,3956.5,3610.5,3958.6818,3616.5,3956.5,3621.3,3948.5,3618.5,3947.2368,3624.5,3948.5,3627.5,3956.5,3625.8333,3958.5,3624.5,3964.5,3621.0714,3967.5476,3616.5,3965.1667,3608.5,3969.8333,3600.5,3964.5,3592.5,3964.5,3592.5,3956.5,3589.5,3953.5,3592.5,3948.5,3599.1667,3944.0555,3592.5) polygon(3500.5,3584.5,3492.5,3582.9,3491.3571,3584.5,3492.5,3587.1667) polygon(3398.1,3584.5,3404.5,3581.5909,3409.0714,3584.5,3404.5,3587.7) polygon(4004.5,3576.5,4004.5,3576.5,4004.5,3576.5,4004.5,3576.5) polygon(3660.9445,3576.5,3660.5,3575.9667,3660.1,3576.5,3660.5,3576.881) polygon(3364.5,3576.5,3364.5,3576.5,3364.5,3576.5,3364.5,3576.5) polygon(3472.5,3568.5,3468.5,3565.8333,3465.5,3568.5,3468.5,3576.5) polygon(3380.5,3568.5,3380.5,3568.5,3380.5,3568.5,3380.5,3568.5) polygon(3315.3571,3568.5,3316.5,3567.7727,3319.1667,3568.5,3316.5,3570.5) polygon(4027.5,3560.5,4028.5,3559.3571,4036.5,3558.5,4038.1,3560.5,4036.5,3564.5,4028.5,3561.5) polygon(3556.9211,3560.5,3556.5,3559.8846,3555.1667,3560.5,3556.5,3561.3889) polygon(3495.7,3560.5,3492.5,3555.1667,3490.7222,3560.5,3484.5,3565.1667,3479.5,3568.5,3484.5,3574.2143,3487.8333,3568.5,3492.5,3562.2778) polygon(3425.5,3560.5,3428.5,3557.5,3431.5,3560.5,3436.5,3563.8333,3442.1,3568.5,3436.5,3575.5,3434.9,3576.5,3433.8333,3584.5,3428.5,3589.8333,3422.5,3584.5,3420.5,3581.3,3417.8333,3576.5,3418.9,3568.5,3420.5,3567.1667) polygon(3388.5,3560.5,3388.5,3560.5,3388.5,3560.5,3388.5,3560.5) polygon(3306.9,3560.5,3308.5,3558.9,3309.2273,3560.5,3308.5,3561.6429) polygon(4007.7,3552.5,4012.5,3550.1,4018.5,3552.5,4012.5,3555.9286) polygon(3989.8333,3552.5,3996.5,3546.7857,4002.2143,3552.5,3996.5,3555.8333) polygon(3970.5,3552.5,3972.5,3548.5,3976.5,3552.5,3972.5,3554.5) polygon(3869.3,3552.5,3868.5,3550.9,3860.5,3544.5,3857.0714,3552.5,3860.5,3556.5,3868.5,3560.5) polygon(3814.6334,3552.5,3812.5,3550.6177,3809.3,3552.5,3812.5,3555.7) polygon(3473.0714,3552.5,3468.5,3550.2143,3460.5,3552.5,3468.5,3555.7) polygon(3401.3,3552.5,3404.5,3549.3,3407.7,3552.5,3412.5,3558.5,3413.8333,3560.5,3412.5,3562.1,3408.5,3568.5,3404.5,3571.4091,3401.3,3568.5,3400.8636,3560.5) polygon(3345.8333,3552.5,3348.5,3549.0714,3351.5,3552.5,3348.5,3554.6818) polygon(3959.1667,3544.5,3964.5,3542.7222,3969.8333,3544.5,3964.5,3547.7) polygon(3944.5,3544.5,3948.5,3542.9,3952.5,3544.5,3948.5,3547.1667) polygon(3574.853,3544.5,3572.5,3541.1667,3564.5,3544.5,3572.5,3547) polygon(3431.1667,3544.5,3436.5,3542.5,3441.8333,3544.5,3436.5,3546.7857) polygon(3413.6429,3544.5,3420.5,3540.1364,3427.3571,3544.5,3424.0555,3552.5,3420.5,3556.0555,3415.9286,3552.5) polygon(3252.5,3544.5,3252.5,3544.5,3252.5,3544.5,3252.5,3544.5) polygon(3921.5,3536.5,3916.5,3529.8333,3908.5,3536.5,3908.5,3536.5,3903.1667,3544.5,3903.7,3552.5,3908.5,3554.6818,3911.5,3552.5,3916.5,3546.7857,3919.8333,3552.5,3921.5,3560.5,3916.5,3564.9445,3914.0385,3568.5,3916.5,3574.9,3920.0555,3568.5,3924.5,3563.5,3930.5,3560.5,3930.1,3552.5,3924.5,3545.5,3921.8333,3544.5) polygon(3854.5,3536.5,3852.5,3533.3,3851.0455,3536.5,3844.5,3543.7,3843.6111,3544.5,3844.5,3545.6429,3845.3889,3544.5,3852.5,3538.1) polygon(3799.9286,3536.5,3796.5,3533.5,3794.1,3536.5,3796.5,3544.5) polygon(3548.5,3536.5,3540.5,3531.9286,3537.5909,3536.5,3540.5,3538.6334) polygon(3400.5,3536.5,3404.5,3535.3571,3405.8333,3536.5,3404.5,3538.5) polygon(3761.8333,3528.5,3756.5,3526.3666,3754.3666,3528.5,3756.5,3532.0555) polygon(3566.6818,3528.5,3564.5,3527,3562.5,3528.5,3564.5,3532.5) polygon(3396.5,3528.5,3396.5,3528.5,3396.5,3528.5,3396.5,3528.5) polygon(3356.5,3528.5,3356.5,3528.5,3364.5,3522.6818,3368.7667,3528.5,3364.5,3532.2647,3356.5,3528.5) polygon(3328.5,3528.5,3332.5,3526.1,3340.5,3525.8333,3343.5,3528.5,3340.5,3536.5,3340.5,3536.5,3332.5,3536.5,3332.5,3536.5) polygon(4036.5,3520.5,4036.5,3520.5,4036.5,3520.5,4036.5,3520.5) polygon(3972.5,3520.5,3972.5,3520.5,3972.5,3520.5,3972.5,3520.5) polygon(3837.6429,3520.5,3836.5,3516.5,3834.9,3520.5,3828.5,3526.9,3820.5,3524.9445,3817.5909,3528.5,3820.5,3529.2619,3828.5,3528.7051,3830.1,3528.5,3836.5,3522.1) polygon(3710.1,3520.5,3708.5,3518.9,3707.5,3520.5,3708.5,3521.6429) polygon(3514.5,3520.5,3508.5,3517.5,3504.5,3520.5,3508.5,3522.3461,3515.7727,3528.5,3516.5,3529.8333,3517.8333,3528.5,3516.5,3524.5) polygon(3823.4091,3512.5,3820.5,3507.1667,3817.5909,3512.5,3820.5,3516.0555) polygon(3807.4091,3512.5,3804.5,3509.8333,3801.3,3512.5,3804.5,3514.1842) polygon(3788.5,3512.5,3780.5,3504.5,3776.5,3512.5,3780.5,3514.1) polygon(3727.4091,3512.5,3724.5,3510.8158,3721.8333,3512.5,3724.5,3517.8333) polygon(3686.1,3512.5,3684.5,3504.5,3682.9,3512.5,3684.5,3515.1667) polygon(3645.9545,3512.5,3644.5,3511.0455,3640.5,3512.5,3644.5,3515.1667) polygon(3529.8333,3512.5,3524.5,3510.7222,3519.1667,3512.5,3524.5,3513.9545) polygon(3463.1667,3512.5,3468.5,3507.1667,3473.8333,3512.5,3468.5,3517.8333) polygon(3422.1,3512.5,3428.5,3507.1667,3433.0714,3512.5,3428.5,3515.1667) polygon(3372.5,3512.5,3372.5,3512.5,3372.5,3512.5,3372.5,3512.5) polygon(3339.1667,3512.5,3340.5,3511.3571,3348.5,3512.5,3356.5,3512.5,3356.5,3512.5,3356.5,3512.5,3348.5,3512.5,3340.5,3513.6429) polygon(3297.1667,3512.5,3300.5,3508.8636,3303.5769,3512.5,3300.5,3515.5769) polygon(3932.5,3504.5,3932.5,3504.5,3940.5,3502.7222,3942.7857,3504.5,3940.5,3506.7857,3932.5,3512.5,3932.5,3512.5,3932.5,3512.5) polygon(3565.8333,3504.5,3564.5,3502.9,3563.8846,3504.5,3564.5,3504.9211,3572.0789,3512.5,3572.5,3513.3,3573.3,3512.5,3572.5,3511.1667) polygon(3510.5,3504.5,3508.5,3501.8333,3506.5,3504.5,3508.5,3505.8333) polygon(3453.3889,3504.5,3460.5,3499.5769,3466.9,3504.5,3460.5,3510.9) polygon(3433.8333,3504.5,3436.5,3503.3571,3437.8333,3504.5,3436.5,3506.5) polygon(3409.3,3504.5,3412.5,3499.9286,3420.5,3504.5,3420.5,3504.5,3420.5,3504.5,3412.5,3507.7) polygon(3329.8333,3504.5,3332.5,3502.1,3335.1667,3504.5,3332.5,3507.5) polygon(4016.0555,3496.5,4020.5,3494,4024.9445,3496.5,4020.5,3503.1667) polygon(3968.0555,3496.5,3972.5,3492.5,3976.1364,3496.5,3972.5,3500.9445) polygon(3789.6429,3496.5,3788.5,3491.1667,3786.7222,3496.5,3788.5,3498.1) polygon(3494.7857,3496.5,3492.5,3493.3,3489.8333,3496.5,3485.5,3504.5,3492.5,3508.8077,3498.1,3504.5) polygon(3379.5,3496.5,3380.5,3495.6111,3384.5,3496.5,3380.5,3498.5) polygon(4002.3182,3488.5,4004.5,3485.8333,4007.5,3488.5,4004.5,3490.1) polygon(3733.6429,3488.5,3732.5,3484.5,3731.7,3488.5,3732.5,3489.3) polygon(3662.9,3488.5,3660.5,3486.7857,3657.8333,3488.5,3660.5,3491.9286) polygon(3530.2143,3488.5,3524.5,3482.7857,3520.8636,3488.5,3524.5,3493.5,3528.5,3496.5,3532.5,3499.1667,3540.5,3499.1667,3545.8333,3504.5,3540.5,3512.5,3548.5,3516.9445,3551,3512.5,3549.1154,3504.5,3548.5,3503.9667,3541.0333,3496.5,3548.5,3489.5,3551.1667,3488.5,3548.5,3480.5,3546.2143,3488.5,3540.5,3495.1667,3532.5,3491.7) polygon(3355.3571,3488.5,3356.5,3487.7727,3360.5,3488.5,3356.5,3489.8333) polygon(3921.3,3480.5,3924.5,3478.7222,3927.7,3480.5,3924.5,3482.5) polygon(3905.8333,3480.5,3908.5,3479.1667,3910.5,3480.5,3908.5,3482.5) polygon(3714.9,3480.5,3708.5,3474.1,3700.5,3472.5,3695.7,3480.5,3700.5,3485.8333,3705.3,3488.5,3700.5,3493.3,3692.5,3494.9,3690.5,3496.5,3692.5,3504.5,3700.5,3498.7857,3703.7,3496.5,3708.5,3491.7,3712.5,3496.5,3716.5,3499.1667,3720.5,3496.5,3716.5,3491.7,3712.5,3488.5) polygon(3408.5,3480.5,3412.5,3476.5,3415.1667,3480.5,3412.5,3484.5) polygon(3389.6429,3480.5,3396.5,3477.0714,3403.3571,3480.5,3396.5,3485.8333) polygon(3332.5,3480.5,3332.5,3480.5,3332.5,3480.5,3332.5,3488.5,3332.5,3488.5,3332.5,3488.5) polygon(3976.5,3472.5,3980.5,3470.1,3983.9286,3472.5,3980.5,3478.5) polygon(3932.5,3472.5,3932.5,3472.5,3932.5,3472.5,3932.5,3472.5) polygon(3916.5,3472.5,3916.5,3472.5,3916.5,3472.5,3916.5,3472.5) polygon(3900.5,3472.5,3900.5,3472.5,3900.5,3472.5,3900.5,3472.5) polygon(3873.8333,3472.5,3876.5,3470.9,3877.8333,3472.5,3884.5,3478.2143,3892.5,3475.1667,3898.5,3480.5,3892.5,3488.5,3892.5,3488.5,3886.5,3496.5,3892.5,3501.3,3895.1667,3496.5,3900.5,3491.7,3908.5,3492.5,3916.5,3495.3571,3917.6429,3496.5,3916.5,3498.1,3911.9286,3504.5,3908.5,3510.5,3900.5,3504.5,3894.7857,3512.5,3898.5,3520.5,3892.5,3523.7,3886.9615,3528.5,3884.5,3532.5,3879.9286,3528.5,3881.8333,3520.5,3884.5,3517.3,3889.3,3512.5,3884.5,3504.5,3884.5,3504.5,3876.5,3501.3,3873.5,3496.5,3876.5,3491.7,3884.5,3488.5,3876.5,3485.3,3873.5,3480.5) polygon(3598.1,3472.5,3596.5,3464.5,3592.5,3472.5,3596.5,3475.9286) polygon(3559.1667,3472.5,3556.5,3471.7727,3554.9,3472.5,3556.5,3480.5,3556.5,3480.5,3564.5,3483.1667,3565.2273,3480.5,3572.5,3473.2273,3572.8636,3472.5,3572.5,3471.9286,3569.8333,3472.5,3564.5,3477.8333) polygon(3425.8333,3472.5,3428.5,3470.2143,3436.5,3468.9445,3440.5,3472.5,3436.5,3477.0714,3431.7,3480.5,3436.5,3483.5,3441.5,3488.5,3436.5,3492.1364,3428.5,3496.5,3428.5,3496.5,3428.5,3496.5,3426.5,3488.5,3424.5,3480.5) polygon(3355.3571,3472.5,3356.5,3471.6111,3357.6429,3472.5,3356.5,3473.2273) polygon(3836.5,3464.5,3836.5,3464.5,3844.5,3464.5,3844.5,3464.5,3850.5,3472.5,3844.5,3477.3,3841.0714,3472.5,3836.5,3464.5) polygon(3500.5,3464.5,3500.5,3464.5,3500.5,3464.5,3500.5,3464.5) polygon(3388.5,3464.5,3388.5,3464.5,3388.5,3464.5,3388.5,3464.5) polygon(3932.5,3456.5,3932.5,3456.5,3932.5,3456.5,3932.5,3456.5) polygon(3722.9,3456.5,3724.5,3455.6111,3727.1667,3456.5,3724.5,3460.5) polygon(3372.5,3456.5,3372.5,3456.5,3380.5,3454.7222,3381.7308,3456.5,3380.5,3458.1,3372.5,3456.5) polygon(4019.7,3448.5,4020.5,3447.1667,4022.5,3448.5,4020.5,3449.5) polygon(3899.7,3448.5,3900.5,3446.9,3908.5,3448.5,3908.5,3448.5,3908.5,3448.5,3900.5,3449.6429) polygon(3867.3571,3448.5,3868.5,3445.8333,3870.1,3448.5,3868.5,3456.5,3868.5,3456.5,3868.5,3456.5) polygon(3416.5,3448.5,3420.5,3445.8333,3423.7,3448.5,3420.5,3453.8333) polygon(3398.6818,3448.5,3404.5,3443.1667,3410.9,3448.5,3404.5,3453.0714) polygon(3956.5,3440.5,3956.5,3440.5,3956.5,3440.5,3956.5,3440.5) polygon(3883.7,3440.5,3884.5,3436.5,3885.0714,3440.5,3884.5,3444.5) polygon(3839.7,3440.5,3844.5,3438.1,3848.5,3440.5,3844.5,3444.5) polygon(3711.7,3440.5,3716.5,3437.0714,3722.5,3440.5,3720.2333,3448.5,3716.5,3453.5909,3711.8333,3448.5) polygon(3664.5,3440.5,3668.5,3438.5,3671.1667,3440.5,3669.6429,3448.5,3668.5,3451.1667,3664.5,3448.5) polygon(3639.8333,3440.5,3644.5,3434.9,3651.5,3440.5,3644.5,3446.7222) polygon(3426.9,3440.5,3428.5,3439.1667,3430.1,3440.5,3428.5,3442.5) polygon(3384.5,3440.5,3388.5,3436.5,3392.5,3440.5,3388.5,3442.9615) polygon(3897.8333,3432.5,3900.5,3431.5,3901.5,3432.5,3900.5,3434.1) polygon(3803.5,3432.5,3804.5,3431.3571,3812.5,3428.0555,3820.5,3428.8636,3824.9445,3432.5,3820.5,3436.1364,3812.5,3438.2143,3804.5,3435.1667) polygon(3708.5,3432.5,3708.5,3432.5,3708.5,3432.5,3708.5,3432.5) polygon(3409.8333,3432.5,3412.5,3429.3,3414.1,3432.5,3412.5,3434.7857) polygon(3842.9,3424.5,3844.5,3422.9,3846.1,3424.5,3844.5,3425.5) polygon(3756.5,3424.5,3756.5,3424.5,3764.5,3420.5,3771.1667,3424.5,3764.5,3430.2143,3756.5,3424.5) polygon(3734.1,3424.5,3740.5,3418.1,3745.8333,3424.5,3740.5,3428.0555) polygon(3696.5,3424.5,3700.5,3421.8333,3705.8333,3424.5,3700.5,3426.7857) polygon(3849.0714,3416.5,3852.5,3413.8333,3857.3,3416.5,3852.5,3419.9286) polygon(3817.3,3416.5,3820.5,3414.2143,3821.9545,3416.5,3820.5,3418.5) polygon(3803.6111,3416.5,3804.5,3414.9,3806.5,3416.5,3804.5,3417.6429) polygon(3729.6429,3416.5,3732.5,3410.7857,3739.1667,3416.5,3732.5,3423.1667) polygon(3684.5,3416.5,3684.5,3416.5,3684.5,3416.5,3689.8333,3424.5,3690.9,3432.5,3684.5,3436.0555,3682.2143,3432.5,3676.5,3425.2273,3675.5,3424.5,3676.5,3420.5) polygon(3436.5,3416.5,3436.5,3416.5,3436.5,3416.5,3442.5,3424.5,3436.5,3426.5,3428.5,3426.7857,3425.3,3424.5,3428.5,3419.1667) polygon(3380.5,3416.5,3380.5,3416.5,3380.5,3416.5,3380.5,3416.5) polygon(3866.6539,3408.5,3868.5,3405.8333,3872.5,3408.5,3873.8333,3416.5,3868.5,3421.8333,3864.5,3416.5) polygon(3671.1667,3408.5,3676.5,3403.1667,3679.7,3408.5,3676.5,3413.8333) polygon(3650.5,3408.5,3652.5,3407.6111,3660.5,3406.7222,3665.8333,3408.5,3660.5,3412.5,3652.5,3416.5,3652.5,3416.5,3652.5,3416.5) polygon(3441.8333,3408.5,3444.5,3404.5,3449.8333,3408.5,3444.5,3412.5) polygon(3874.5,3400.5,3876.5,3399.0454,3878.7857,3400.5,3876.5,3403.7) polygon(3860.5,3400.5,3860.5,3400.5,3860.5,3400.5,3860.5,3400.5) polygon(3802.9,3400.5,3804.5,3396.5,3812.5,3398.9,3815.1667,3400.5,3813.8333,3408.5,3812.5,3410.5,3810.9,3408.5,3804.5,3402.1) polygon(3737.8333,3400.5,3740.5,3398.7222,3743.7,3400.5,3740.5,3404.5) polygon(3634.5,3400.5,3636.5,3399.8333,3638.1,3400.5,3636.5,3401.8333) polygon(3460.5,3400.5,3460.5,3400.5,3460.5,3400.5,3468.5,3403.7,3473.3,3408.5,3468.5,3416.5,3471.1667,3424.5,3476.5,3426.5,3484.5,3432.5,3484.5,3432.5,3488.5,3440.5,3491.7,3448.5,3490.5,3456.5,3486.5,3464.5,3484.5,3472.5,3492.5,3477.8333,3500.5,3473.8333,3507.1667,3480.5,3506.5,3488.5,3508.5,3491.1667,3509.6429,3488.5,3511.1667,3480.5,3508.5,3478.5,3502.5,3472.5,3508.5,3467.7,3512.5,3464.5,3508.5,3463.1667,3501.8333,3456.5,3500.5,3451.1667,3496.5,3448.5,3496.5,3440.5,3500.5,3432.5,3500.5,3432.5,3500.5,3432.5,3508.5,3436.1364,3512.9445,3432.5,3511.1667,3424.5,3516.5,3418.1,3519.1667,3416.5,3524.5,3413.8333,3532.5,3408.5,3532.5,3408.5,3540.5,3408.5,3540.5,3408.5,3547.0455,3416.5,3540.5,3421.6429,3538,3424.5,3532.5,3430.7857,3527.7,3432.5,3532.5,3435.9286,3537.8333,3440.5,3536.5,3448.5,3538.5,3456.5,3532.5,3459.1667,3524.5,3463.9667,3521.8333,3464.5,3522.5,3472.5,3524.5,3476.5,3532.5,3473.3889,3540.5,3480.5,3543.1667,3472.5,3540.5,3467.1667,3539.3571,3464.5,3540.5,3460.5,3543.1667,3456.5,3548.5,3451.1667,3553.8333,3456.5,3556.5,3457.2273,3558.1,3456.5,3564.5,3451.9286,3569.0714,3456.5,3572.5,3458,3580.5,3456.5,3572.5,3454.5,3566.5,3448.5,3564.5,3445.0714,3562.1,3448.5,3556.5,3455.5,3549.5,3448.5,3548.5,3447.7727,3541.8333,3440.5,3540.5,3438.2143,3535.5,3432.5,3540.5,3428.5,3548.5,3426.5,3552.5,3424.5,3556.5,3419.1667,3558.1,3416.5,3564.5,3411.9286,3568.5,3416.5,3572.5,3419.7,3579.3571,3424.5,3572.5,3431.3571,3570.9,3432.5,3572.5,3433.3,3577,3440.5,3580.5,3445.5909,3587.5,3440.5,3580.5,3432.5,3580.5,3432.5,3580.5,3432.5,3582.5,3424.5,3580.5,3422.9,3576.5,3416.5,3580.5,3410.1,3588.5,3414.2143,3593.5,3408.5,3596.5,3406.5,3604.5,3406.9,3609.8333,3400.5,3612.5,3398.7222,3614.2778,3400.5,3616.1364,3408.5,3612.5,3414.2143,3604.5,3411.1667,3599.1667,3416.5,3596.5,3417.6429,3591.1667,3424.5,3596.5,3430.5,3604.5,3426.1,3612.5,3424.5,3612.5,3424.5,3614.7857,3416.5,3620.5,3412.8636,3628.5,3411.7,3636.5,3413.5,3638.6818,3416.5,3636.5,3418.5,3628.5,3424.5,3632.5,3432.5,3629.8333,3440.5,3628.5,3441.6429,3626.5,3440.5,3620.5,3432.5,3615.7,3440.5,3620.5,3444.5,3623.1667,3448.5,3620.5,3451.1667,3613.6429,3456.5,3620.5,3460.8636,3623.8333,3464.5,3628.5,3470.1,3634.5,3472.5,3628.5,3475.9286,3622.1,3480.5,3628.5,3482.7857,3631.7,3480.5,3636.5,3473.6429,3642.5,3480.5,3644.5,3483.1667,3645.9545,3480.5,3645.1667,3472.5,3644.5,3471.7,3636.5,3469.8333,3634.7222,3464.5,3631.1667,3456.5,3636.5,3452.5,3644.5,3456.5,3652.5,3448.5,3652.5,3448.5,3652.5,3448.5,3660.5,3449.5,3666.7222,3456.5,3662.5,3464.5,3668.5,3467.9286,3672.0555,3472.5,3676.5,3480.5,3679.3571,3472.5,3676.5,3469.6429,3670.5,3464.5,3670.7857,3456.5,3676.5,3452.8636,3683.1667,3456.5,3684.5,3457.3,3688.5,3456.5,3692.5,3454.9,3700.5,3453.8333,3708.5,3455.1667,3710.1,3456.5,3712.5,3464.5,3716.5,3467.1667,3724.5,3468.5,3726.5,3464.5,3732.5,3459.7,3740.5,3458.7857,3743.5769,3464.5,3748.5,3469.8333,3754.9,3464.5,3748.5,3459.1667,3743.1667,3456.5,3748.5,3450.1,3756.5,3448.5,3748.5,3447.1667,3745.8333,3448.5,3740.5,3452.5,3732.5,3448.5,3732.5,3448.5,3726.5,3440.5,3729.8333,3432.5,3732.5,3427.1667,3734.7857,3432.5,3740.5,3440.5,3745.5,3432.5,3748.5,3427.7,3750.9,3432.5,3756.5,3438.1,3764.5,3437.8333,3772.5,3433.8333,3775.1667,3432.5,3780.5,3430.2143,3788.5,3424.5,3788.5,3424.5,3788.5,3424.5,3792.5,3432.5,3788.5,3436.5,3782.2778,3440.5,3788.5,3448.5,3788.5,3448.5,3790.9,3456.5,3788.5,3461.3,3780.5,3463.7727,3774.3461,3456.5,3772.5,3452.5,3768.5,3456.5,3772.5,3464.5,3772.5,3464.5,3772.5,3472.5,3772.5,3472.5,3769.3,3480.5,3764.5,3483.5,3757.8333,3488.5,3756.5,3491.1667,3753.8333,3488.5,3748.5,3483.1667,3746.5,3488.5,3748.5,3493.8333,3751.1667,3496.5,3755.1667,3504.5,3756.5,3507.1667,3764.5,3506.5,3765.5,3504.5,3767.1667,3496.5,3766.853,3488.5,3772.5,3481.6429,3775.1667,3480.5,3780.5,3474.1,3788.5,3472.5,3788.5,3472.5,3788.5,3472.5,3796.5,3480.5,3804.5,3472.5,3796.5,3468.5,3792.5,3464.5,3796.5,3462.7222,3804.5,3458.7857,3812.5,3458.1,3814.1,3456.5,3820.5,3453.5909,3825.5909,3448.5,3828.5,3445.5909,3833.0714,3448.5,3828.5,3456.5,3828.5,3456.5,3824.5,3464.5,3820.5,3470.9,3812.5,3468.0555,3804.5,3472.5,3810.5,3480.5,3812.5,3481.9545,3819.7,3488.5,3820.5,3496.5,3828.5,3491.9286,3831.7,3496.5,3836.5,3502.5,3841.8333,3504.5,3844.5,3512.5,3846.5,3504.5,3844.5,3502.5,3841.8333,3496.5,3844.5,3493.8333,3852.5,3489.3889,3853.6429,3488.5,3856.5,3480.5,3860.5,3476.5,3861.8333,3480.5,3868.5,3488.5,3868.5,3488.5,3868.5,3488.5,3863.5,3496.5,3868.5,3500.1364,3874.5,3504.5,3876.5,3507.1667,3881.0714,3512.5,3876.5,3516.5,3871.1667,3520.5,3868.5,3522.7857,3864.5,3520.5,3864.1364,3512.5,3860.5,3504.5,3856.0555,3512.5,3855.1667,3520.5,3860.5,3522.5,3864.8636,3528.5,3867.3571,3536.5,3868.5,3538.1,3876.5,3540.1364,3884.5,3541.8333,3888.5,3536.5,3892.5,3534.0385,3897.6429,3528.5,3900.5,3522.7857,3908.5,3520.5,3908.5,3520.5,3908.5,3520.5,3916.5,3524.5,3924.5,3525.8333,3932.5,3522.1,3940.5,3527.5,3948.5,3525.1667,3951.8333,3528.5,3948.5,3532.9445,3940.5,3530.1,3936.5,3536.5,3932.5,3544.5,3940.5,3546.1,3945.8333,3552.5,3940.5,3557.8333,3935.1667,3560.5,3940.5,3562.2778,3948.5,3566.9,3956.5,3565.5,3959.9286,3568.5,3964.5,3573.0714,3970.9,3568.5,3972.5,3566.5,3975.9286,3560.5,3980.5,3554.1,3983.7,3560.5,3986.2143,3568.5,3980.5,3572.9445,3975.1667,3576.5,3972.5,3579.7,3967.7,3584.5,3972.5,3589.3,3977.3,3584.5,3980.5,3581.8333,3982.7857,3584.5,3988.5,3587.3571,3994.5,3592.5,3992.5,3600.5,3988.5,3603.7,3986.9,3600.5,3980.5,3595.9286,3973.3889,3600.5,3980.5,3605.8333,3985.0714,3608.5,3984.5,3616.5,3988.5,3620.1364,3996.5,3618.9615,4002.5,3624.5,4002.1,3632.5,4004.5,3636.5,4007.9286,3640.5,4012.5,3644.0555,4020.5,3645.8333,4028.5,3640.5,4028.5,3640.5,4028.5,3640.5,4036.5,3645.3,4038.9615,3648.5,4042.2142,3656.5,4036.5,3662.2143,4028.5,3664.5,4036.5,3669.8333,4038.1,3664.5,4044.5,3658.1,4048.2646,3664.5,4048.5,3672.5,4044.5,3675.5,4038.7858,3680.5,4044.5,3686.2143,4051.1666,3680.5,4052.5,3678.5,4056.5,3680.5,4055.7,3688.5,4055.4091,3696.5,4058.5,3704.5,4060.5,3705.6429,4068.5,3708.5,4071.1666,3704.5,4068.5,3696.5,4068.5,3696.5,4065.3,3688.5,4068.5,3686.9,4070.7858,3688.5,4076.5,3695.1667,4077.2273,3696.5,4079.4091,3704.5,4078.9,3712.5,4078.7858,3720.5,4081.2059,3728.5,4084.5,3733.5909,4090.9,3736.5,4084.5,3741.0714,4078.5,3744.5,4084.5,3746.6818,4092.5,3752.5,4092.5,3752.5,4098.9,3760.5,4095.1666,3768.5,4100.5,3773.0714,4106.5,3776.5,4108.5,3779.1667,4116.5,3777.3,4123.7,3784.5,4116.5,3791.0455,4108.5,3788.0555,4103.5,3792.5,4108.5,3796.9445,4113.0714,3800.5,4113.0714,3808.5,4116.5,3813.3,4118.2778,3816.5,4120.5,3824.5,4124.5,3828.8077,4130.5,3832.5,4132.5,3840.5,4136.5,3832.5,4139.3572,3824.5,4140.5,3816.5,4140.5,3816.5,4140.5,3816.5,4148.5,3821.5,4154.5,3824.5,4148.5,3829.3,4144.5,3832.5,4148.5,3837.8333,4149.6428,3840.5,4156.5,3848.5,4156.5,3848.5,4156.5,3848.5,4148.5,3851.1667,4146.5,3848.5,4140.5,3844.5,4132.5,3848.5,4132.5,3848.5,4130.2142,3856.5,4132.5,3861.8333,4136.5,3856.5,4140.5,3851.9286,4145.8334,3856.5,4143.1666,3864.5,4148.5,3870.2143,4152.5,3872.5,4148.5,3876.0555,4140.5,3876.9445,4136.5,3880.5,4134.7858,3888.5,4132.5,3891.1667,4124.5,3888.5,4122.5,3896.5,4124.5,3898.1,4132.5,3902.9,4140.5,3902.9,4144.5,3896.5,4148.5,3888.5,4148.5,3888.5,4148.5,3888.5,4153.0714,3896.5,4153.5,3904.5,4148.5,3908.5,4140.5,3912.5,4144.5,3920.5,4140.5,3925.3,4134.5,3920.5,4132.5,3919.8333,4131.1666,3920.5,4132.5,3921.3,4139.0454,3928.5,4132.5,3935.7,4131.7,3936.5,4132.5,3938.5,4140.5,3940.5,4142.5,3944.5,4141.6428,3952.5,4140.5,3953.2273,4132.5,3957.8333,4127.1666,3952.5,4124.5,3951.3571,4121.8334,3952.5,4116.5,3958.9,4112.5,3960.5,4116.5,3961.8334,4121.5,3968.5,4117.8334,3976.5,4124.5,3984.5,4124.5,3984.5,4127.7,3992.5,4124.5,3995.1666,4122.2142,3992.5,4116.5,3988.0555,4109.8334,3992.5,4114.2142,4000.5,4108.5,4007.1666,4107.1666,4008.5,4100.5,4012.9445,4097.8334,4016.5,4100.5,4022.9,4101.3,4024.5,4108.5,4031.0454,4116.5,4028.5,4122.9,4032.5,4116.5,4037.0714,4108.5,4034.2778,4100.5,4034.1,4092.5,4038.7222,4089.3,4040.5,4084.5,4044.5,4080.5,4040.5,4076.5,4036.5,4074.5,4040.5,4076.5,4042.9,4082.1,4048.5,4076.5,4052.8077,4068.5,4051.1666,4063.9286,4056.5,4060.5,4060.5,4052.5,4064.5,4060.5,4066.9,4064.5,4072.5,4060.5,4078.1,4052.5,4074.9,4044.5,4075.5,4039.7,4072.5,4036.5,4068.5,4028.5,4070.9,4020.5,4064.5,4012.5,4072.5,4012.5,4080.5,4012.5,4080.5,4012.5,4080.5,4004.5,4077.0714,3996.5,4078.1,3988.5,4077.6765,3984.1364,4080.5,3988.5,4088.5,3988.5,4088.5,3988.5,4088.5,3984.5,4096.5,3980.5,4097.2273,3976.5,4096.5,3972.5,4095.7727,3965.2273,4088.5,3972.5,4083.5,3976.8636,4080.5,3972.5,4077.0714,3965.3889,4072.5,3972.5,4066.1,3974.1,4064.5,3972.5,4063.6578,3971.8333,4064.5,3964.5,4072.1522,3964.4838,4072.5,3964.5,4074.1,3967.7,4080.5,3964.5,4086.9,3963.7727,4088.5,3964.5,4096.5,3964.5,4096.5,3964.5,4096.5,3959.9286,4104.5,3956.5,4106.9,3952.5,4104.5,3951.7,4096.5,3952.2895,4088.5,3948.5,4083.3572,3940.5,4087.1666,3936.5,4088.5,3940.5,4093.3,3943.1667,4096.5,3940.5,4098.7858,3932.5,4100.5,3926.7857,4096.5,3926.5,4088.5,3924.5,4080.5,3924.5,4080.5,3916.5,4078.5,3913.0714,4080.5,3916.5,4085.3,3921.8333,4088.5,3916.5,4090.1,3909.3889,4096.5,3908.5,4098.5,3900.5,4096.5,3900.5,4096.5,3900.5,4096.5,3902.1,4088.5,3900.5,4086.5,3896.5,4088.5,3892.5,4089.3,3891.5,4088.5,3884.5,4083.4091,3876.5,4084.1364,3868.5,4083.1666,3865.5,4080.5,3860.5,4076.0555,3852.5,4077.8334,3849.5,4080.5,3844.5,4083.8334,3840.5,4080.5,3836.5,4075.5,3828.5,4075.9286,3825.8333,4072.5,3822.2143,4064.5,3820.5,4061.0714,3816.5,4064.5,3814.5,4072.5,3812.5,4074.1,3811.1667,4072.5,3808.5,4064.5,3804.5,4061.8334,3798.5,4056.5,3796.5,4053.3,3788.5,4053.6765,3780.5,4053.8334,3772.5,4052.5,3767.1667,4048.5,3764.5,4047.5,3756.5,4046.5,3751.1667,4040.5,3748.5,4034.5,3746.5,4032.5,3740.5,4029.8334,3732.5,4026.7858,3724.5,4031.3572,3719.7,4024.5,3716.5,4019.1666,3711.1667,4016.5,3708.5,4015.3572,3701.6429,4008.5,3700.5,4007.5,3692.5,4000.5,3684.5,4005.8334,3681.8333,4000.5,3676.5,3992.5,3676.5,3992.5,3670.5,3984.5,3676.5,3978.5,3680.5,3984.5,3684.5,3992.5,3692.5,3985.5667,3700.5,3987.5,3703.5,3984.5,3700.5,3982.6538,3692.5,3983.1666,3684.5,3981.5,3677.8333,3976.5,3676.5,3974.9,3668.5,3975.5,3666.9,3976.5,3666.9,3984.5,3660.5,3988.5,3658.2143,3992.5,3652.5,3998.6538,3645.8333,3992.5,3644.5,3988.5,3642.7222,3984.5,3639.7,3976.5,3640.5,3968.5,3644.5,3964.5,3646.1,3960.5,3644.5,3952.5,3644.5,3952.5,3636.5,3948.5,3632.5,3952.5,3628.5,3955.1667,3622.5,3952.5,3620.5,3951.5,3612.5,3952.5,3612.5,3952.5,3604.5,3954.7857,3600.5,3952.5,3596.5,3949.8333,3593.5909,3944.5,3588.5,3938.2778,3585.3,3936.5,3588.5,3934.7222,3593.1667,3928.5,3596.5,3920.5,3588.5,3917.5,3587,3920.5,3582.2778,3928.5,3580.5,3931.7,3578.2143,3928.5,3572.5,3922.7857,3565.8333,3928.5,3564.5,3929.5,3563.6111,3928.5,3560.5,3920.5,3564.5,3916.5,3572.5,3912.5,3572.5,3912.5,3574.1,3904.5,3580.5,3898.1,3581.3889,3896.5,3580.5,3895.3571,3574.5,3888.5,3572.5,3887.1667,3567.1667,3888.5,3564.5,3891.1667,3560.5,3888.5,3556.5,3887.9286,3550.3823,3880.5,3549.8333,3872.5,3556.5,3865.2273,3564.119,3872.5,3564.5,3876.5,3565.3,3872.5,3564.5,3868.5,3561.8333,3864.5,3556.5,3859.1667,3551.1667,3864.5,3548.5,3866.1,3544.5,3872.5,3542.1,3880.5,3540.5,3883.1667,3532.5,3887.3571,3525.6429,3880.5,3524.5,3872.5,3524.5,3872.5,3524.5,3864.5,3524.5,3864.5,3532.5,3859.9286,3540.5,3856.5,3532.5,3852.5,3524.5,3848.5,3524.5,3848.5,3516.5,3845.8333,3508.5,3840.5,3508.5,3840.5,3508.5,3840.5,3511.7,3832.5,3516.5,3827.7,3521.8333,3832.5,3524.5,3835.9286,3529.0714,3840.5,3532.5,3844.5,3540.5,3848.5,3540.5,3848.5,3548.5,3849.8333,3549.2273,3848.5,3548.5,3846.5,3545.0714,3840.5,3540.5,3835.9286,3532.5,3836.5,3528.5,3832.5,3524.5,3829.5,3520.0555,3824.5,3524.5,3816.5,3516.5,3810.5,3514.5,3808.5,3508.5,3803.7,3503.1667,3800.5,3500.5,3797.8333,3498.2143,3792.5,3496.7667,3784.5,3492.5,3777.3889,3484.5,3780.5,3480.5,3776.5,3478.5,3768.5,3484.5,3764.5,3487.5,3760.5,3489.3,3752.5,3484.5,3745.6429,3481.8333,3744.5,3476.5,3742.5,3473.0714,3736.5,3468.5,3730.1,3460.5,3736.5,3460.5,3736.5,3454.1,3744.5,3452.5,3745.6429,3444.5,3744.5,3436.5,3750.9,3430.6818,3744.5,3436.5,3738.6818,3444.5,3736.5,3439.7,3728.5,3442.9,3720.5,3440.8636,3712.5,3436.5,3704.5,3428.5,3707.5,3423.7,3704.5,3428.5,3698.5,3436.5,3704.5,3439.4091,3696.5,3444.5,3689.5,3448.5,3696.5,3446.5,3704.5,3452.5,3707.5,3460.5,3707.1667,3468.5,3704.5,3460.5,3702.9,3456.2333,3696.5,3460.5,3690.1,3462.5,3688.5,3460.5,3685.3,3456.5,3680.5,3452.5,3675.7,3449.3,3672.5,3446.5,3664.5,3449.8333,3656.5,3452.5,3654.5,3460.5,3653.3,3463.5,3648.5,3468.5,3642.7857,3475.1667,3648.5,3476.5,3652.5,3477.6429,3648.5,3478.7857,3640.5,3476.5,3637.8333,3468.5,3637.8333,3465.8333,3632.5,3460.5,3626.6818,3454.5,3624.5,3460.5,3620.5,3465.3,3616.5,3460.5,3610.5,3457.8333,3608.5,3455.1667,3600.5,3460.5,3596.5,3464.5,3600.5,3468.5,3605.8333,3473.8333,3600.5,3473.3,3592.5,3470.3462,3584.5,3468.5,3576.5,3462.5,3584.5,3460.5,3586.1,3452.5,3584.5,3447.8333,3592.5,3449.8333,3600.5,3449.3,3608.5,3444.5,3612.5,3438.5,3608.5,3439.9286,3600.5,3438.7857,3592.5,3440.5,3584.5,3444.5,3579.7,3452.5,3584.5,3457.0714,3576.5,3452.5,3572.9445,3447.5,3568.5,3444.5,3563.7,3442.2143,3560.5,3443.1667,3552.5,3444.5,3548.5,3446.1,3544.5,3444.5,3540.5,3443.3571,3536.5,3444.5,3533.8333,3452.5,3530.7857,3456.5,3528.5,3452.5,3526.5,3444.5,3524.5,3436.5,3520.5,3436.5,3520.5,3436.5,3520.5,3444.5,3518.5,3449.8333,3512.5,3452.5,3506.5,3457.3,3512.5,3460.5,3515.1667,3465.8333,3520.5,3468.5,3528.5,3468.5,3528.5,3473.3,3536.5,3476.5,3539.7,3484.5,3541.8333,3491.6111,3536.5,3484.5,3532.7353,3479.3571,3528.5,3476.5,3522.7857,3472.5,3520.5,3476.5,3516.5,3479.7,3512.5,3476.5,3509.8333,3471.1667,3504.5,3469.2273,3496.5,3468.5,3492.5,3460.5,3488.5,3460.5,3488.5,3459.6111,3480.5,3460.5,3477.8333,3468.5,3479.5,3472.5,3480.5,3476.5,3483.1667,3477.3,3480.5,3476.5,3478.5,3474.1,3472.5,3468.5,3465.5,3460.5,3469.8333,3457.8333,3472.5,3452.5,3475.1667,3448.5,3472.5,3452.5,3464.5,3447.1667,3456.5,3444.5,3455.3571,3439.1667,3448.5,3444.5,3444.1364,3448.5,3440.5,3452.5,3432.5,3445.8333,3424.5,3446.7857,3416.5,3452.5,3409.8333,3459.1667,3416.5,3456.9445,3424.5,3452.5,3432.5,3460.5,3437.3,3462.2778,3440.5,3464.5,3448.5,3460.5,3453.8333,3457.8333,3456.5,3460.5,3458.1,3468.5,3456.5,3468.5,3456.5,3476.5,3450.5,3477.3,3448.5,3476.5,3444.5,3475.5,3440.5,3468.5,3432.5,3468.5,3432.5,3466.9,3424.5,3468.5,3416.5,3460.5,3412.5,3456.5,3408.5) polygon(3828.5,3392.5,3828.5,3392.5,3828.5,3392.5,3832.1364,3400.5,3828.5,3404.5,3822.7857,3400.5) polygon(3583.1667,3392.5,3588.5,3388.2333,3593.8333,3392.5,3588.5,3399.6111) polygon(3556.5,3392.5,3556.5,3392.5,3556.5,3392.5,3564.5,3395.7,3572.5,3395.1667,3576.5,3400.5,3572.5,3406.5,3564.5,3404.5,3560.5,3408.5,3556.5,3414.5,3553.0714,3408.5,3556.5,3400.5) polygon(3812.5,3384.5,3812.5,3384.5,3812.5,3384.5,3812.5,3384.5) polygon(3732.5,3384.5,3732.5,3384.5,3732.5,3384.5,3732.5,3384.5) polygon(3643.6111,3384.5,3644.5,3381.8333,3646.1,3384.5,3644.5,3392.5,3644.5,3392.5,3644.5,3392.5) polygon(3779.3571,3376.5,3780.5,3373.8333,3784.5,3376.5,3780.5,3377.2273) polygon(3745.8333,3376.5,3748.5,3373.3,3750.7857,3376.5,3748.5,3378.5) polygon(3668.5,3376.5,3668.5,3376.5,3668.5,3376.5,3668.5,3376.5) polygon(3521.8333,3376.5,3524.5,3374.5,3529.8333,3376.5,3524.5,3380.5) polygon(3474.7222,3376.5,3476.5,3374.2143,3481.8333,3376.5,3478.5,3384.5,3484.5,3389.3,3486.7857,3392.5,3492.5,3397.5,3496.5,3400.5,3500.5,3406.5,3506.5,3400.5,3508.5,3399.7727,3516.5,3397.8333,3524.5,3395.1667,3529.8333,3400.5,3524.5,3404.5,3520.5,3408.5,3516.5,3414.9,3514.9,3416.5,3508.5,3421.8333,3500.5,3420.2333,3495.1667,3424.5,3492.5,3430.9,3489.3,3424.5,3485.9546,3416.5,3489.8333,3408.5,3484.5,3406.7222,3478.2778,3400.5,3476.5,3398.5,3472.1364,3392.5,3468.5,3384.5,3468.5,3384.5,3468.5,3384.5) polygon(3419.7727,3376.5,3420.5,3374.5,3421.3889,3376.5,3420.5,3380.5) polygon(3836.5,3368.5,3836.5,3368.5,3836.5,3368.5,3836.5,3368.5) polygon(3732.5,3368.5,3732.5,3368.5,3740.5,3366.7222,3743.7,3368.5,3740.5,3371.1667,3732.5,3368.5) polygon(3698.2143,3368.5,3700.5,3365.3,3702.1,3368.5,3708.5,3374.9,3710.5,3376.5,3708.5,3379.1667,3702.1,3384.5,3708.5,3389.8333,3710.2778,3392.5,3716.5,3397.5909,3722.9,3400.5,3716.5,3406.9,3708.5,3408.5,3708.5,3408.5,3700.5,3411.1667,3697.3,3408.5,3694.5,3400.5,3700.5,3392.5,3698.9,3384.5,3692.5,3379.1667,3690.2143,3376.5,3692.5,3374.2143) polygon(3683.8846,3368.5,3684.5,3367.3571,3685.8333,3368.5,3684.5,3369.8333) polygon(3612.5,3368.5,3612.5,3368.5,3612.5,3368.5,3612.5,3368.5) polygon(3576.9445,3368.5,3580.5,3365.8333,3582.6334,3368.5,3580.5,3376.5,3580.5,3376.5,3572.5,3378.6818,3569.0714,3376.5,3572.5,3373.5) polygon(3642.5,3360.5,3644.5,3358.5,3646.1,3360.5,3644.5,3364.5) polygon(3596.5,3360.5,3596.5,3360.5,3596.5,3360.5,3596.5,3360.5) polygon(3536.0555,3360.5,3540.5,3355.5,3548.5,3358.5,3549.3889,3360.5,3549.3,3368.5,3548.5,3370.1,3546.9762,3376.5,3540.5,3381.3571,3532.9445,3376.5,3535.5,3368.5) polygon(3467.3571,3360.5,3468.5,3356.5,3476.5,3357.8333,3479.7,3360.5,3476.5,3362.7857,3469.8333,3368.5,3468.5,3369.5,3467.3571,3368.5) polygon(3443.9286,3360.5,3444.5,3359.9286,3446.1,3360.5,3444.5,3368.5,3444.5,3368.5,3444.5,3368.5) polygon(3705.3,3352.5,3708.5,3349.3,3711.7,3352.5,3708.5,3356.5) polygon(3579.5,3352.5,3580.5,3351.5,3581.8333,3352.5,3580.5,3353.3889) polygon(3516.5,3352.5,3516.5,3352.5,3524.5,3350.7222,3527.1667,3352.5,3524.5,3355.7,3516.5,3352.5) polygon(3498.9,3352.5,3500.5,3351.5,3501.6429,3352.5,3502.2778,3360.5,3508.5,3367.5,3509.5,3368.5,3508.5,3369.5,3500.5,3371.1667,3499.1667,3368.5,3498.9,3360.5) polygon(3751.7,3344.5,3756.5,3340.1364,3760.1923,3344.5,3756.5,3349.8333) polygon(3481.4231,3344.5,3484.5,3341.4231,3488.5,3344.5,3484.5,3348.1364) polygon(3732.5,3336.5,3732.5,3336.5,3732.5,3336.5,3732.5,3336.5) polygon(3664.5,3336.5,3668.5,3334.6538,3672.5,3336.5,3668.5,3338.5) polygon(3820.5,3328.5,3820.5,3328.5,3820.5,3328.5,3820.5,3328.5) polygon(3524.5,3328.5,3524.5,3328.5,3524.5,3328.5,3524.5,3328.5) polygon(3554.7222,3320.5,3556.5,3318.5,3558.5,3320.5,3556.5,3322.2778) polygon(3948.5,3312.5,3948.5,3312.5,3948.5,3312.5,3948.5,3312.5) polygon(3684.5,3312.5,3684.5,3312.5,3684.5,3312.5,3684.5,3312.5) polygon(3587.8846,3312.5,3588.5,3311.8333,3589.3889,3312.5,3588.5,3314.5) polygon(3884.5,3304.5,3884.5,3304.5,3884.5,3304.5,3884.5,3304.5) polygon(3663.1667,3296.5,3668.5,3294.7222,3669.8333,3296.5,3668.5,3298.2778) polygon(3528.5,3296.5,3532.5,3295.1667,3533.1154,3296.5,3532.5,3297.1667) polygon(3700.5,3288.5,3700.5,3288.5,3700.5,3288.5,3700.5,3288.5) polygon(3609.4231,3280.5,3612.5,3277.1667,3615.5769,3280.5,3612.5,3283.3571) polygon(3577.8333,3280.5,3580.5,3278.1,3583.9286,3280.5,3580.5,3283.9286) polygon(3982.1,3128.5,3988.5,3126.2143,3992.0555,3128.5,3988.5,3132.0556) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/dialog.png��������������������������������������������������������������000644 �000765 �000000 �00000021126 11332353405 020245� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����0���8B���bKGD������ pHYs�� �� ����tIME�� �IDATx{}[3=3=A $FAc0A(؉a7mg <vw쮓l>=kO6qlcppĬ^`A1FyFM^S]]]U֭[UխR.Bl1�}B(~w"�v~l7~w9?N�@`<6t^%4-�C�ScSEtrDM-՝ Ψ}s+慅7#-6I>_}�Lfvj+rppPUk^/$Inf{ۭPzH,ѡs~vzuldJtۦ�3===Espp0ZPyCtqG2p?k6_OZlhV"uiSU- �G$URf!^|А<u޽._|kvnQ;+ �eGVWymeyl<ǏȲ9be#/M=/Y՝sVvGãcS}٬dY_zL|#[Y3sC'F~{ӣ^*�QS肦tZ3WV?ؙ 4e՚uo~CSCͳÃ.t$f,\n3;23~Niy B?}|63dv_H .bة/ٸvsGH:/?G_*_pkqF8ҳvʟZxpϫ 5y!%ڹ馑_? YyAn_o\dV k$Izo? d9]5vl[,3ћnXN|ŗN !YMﺢ)«'3 ٯmmq!ėB3ZyX]Gw}ٹ?m;߽g<B=z$_loWwcSR7])[X<2<wlڰh8)x߽~S]$Ʃе <* !:MܺaMgX >1M*}o}qISnzvHxjlr, XGg?|Eݏb8_~/ !'*.88- krcx+ѹΩlÚX]D>5u<ٹ܌o_S>ۻs+=/]鏽EkLފ;^dffY$3/IO !~o߾l\BC/\.djd|ttG_zeWBoL^Mיt- ~f lKL)n<vlC}ph6εW%!-W>?۳~u_NNʦ-]WŹ7s %̛?oޮGv?Ron4۹Y|^63͉\H$^${Sz!\z|c:IVYP5WM6ΜKoDwmܾi}_?ޗKm7]+ =/Jy_=!+o5,G?^b>MB|?p}_\\P‘zc~{'_?}:Zy]/sz㯙M}﫟YS}>>+;8z-3} R߸jyV5?4ɔR*m#:yvL:sc{f3Ɏx0Me!K$x^ W.[7XVZ}}#Ίs7\rM3Bh$7!EQ"- Bgڽ،-<>֮l("(l&ˆBoPߔ7v29vQYV}qHSkw}S"Jic΍gf=gÑXCcٲꣅ"!ivnZS>nٔGjnY !oJ,a!D8N'B5+: w%&^Ҭ~W{ٔ*vf76oXq!~өiu�N^&]f:[L]wǷ3\qL-3#fK??Oe(HthzU_;12=3W_G>'^/eMwˉ3bygJMq.5]9!$DrH)"e%I֍e )|Y!V/XёP!ϛpI /+aI#MW_ޫמ:;o?q,˒$eoz /2jMrjfG'2Bݽ?.i4=0$NR(|ퟟ;=[zuEC{^C21`e'sk"ͺ§v|寿[\o{$-p4n-~_Fp8<y?3xߣrö֝IeO}_v25>??;5'޵qM6{ I{Ǧfxo95́2,d>+Όw0 _!i$!l[ qRHVBp8Αp}; reI^rJ!ɪ{{\7^{d2u''֬ٔ*\w3s+;c3]k$,0 f)?/vYg>|S;5  ~)r6~u;Nu#UMp8˝8R%Cݸee7i:{ܽ_߻~;_Qco~_=tD54H={3Qwť+ׯ]''3f|g?m[7?x߻J5Br=]s_43;_ n*S 𥘝[.o]]jb#'p=1MԌ,E&23=&ҘfP#06{2>dϻ߯+yٷ,-R>?'v/WSp~7j>ȜZ]7eoP/,. ݲ~c kW~nfj2}nfjbBz1mh;t&=?Ɋ6%ۣ MhñW"׾r]C<qDKH>52<1zfq~A\۲K[FN2zDfBAi63ѐhMv GoxPwlp_6h_ڭ*f2<:7P,Jm+6[ Sh9^!D~^ZMtv?h,ҵJ Gg&g2l6Rh]s۲?wpcdܛGr٬,x۲H^s@ع== x`foWۺ1oa27>M~{xcnkG;|/R(mߘK쒉_6&,)RF!IpDCѩP(!\CJsy],Xc.W")٩(P89IkP$B oI|ٲcE^dͧuDr!|}]C\ G,XQ֔˕PX M-] !Ir}y~,' Y IP(,BFo<JdrYVl)a%Wv2e7-o^fRu*ᨾܺsfff&3uM[օuF v- cB5Y8 vj7,$D ._/ٱܬm )[>jnL GB7RS%%ijQ?3Tm^Q޶vuQesb,DT�AkJ X;xXSBjk+�_?x76ּ!�A5Fc4όآ�kxR OA�ם[|�_"NL�;w �@��x��!�@�&(ΐL& ORR)/KSxaER ͊r}} ׿n nb,."D5YrAת%ۥd2Lz퀩J}4-C!lLǒEVX)\,HFs|Me4Pΰqm1w[&h^[3.M 4@f̒΢9oA,}M{ [fe kduͬ 㗃*wjubn5"iͰ p֭]ڢxMBTCDٜR[Õ-9VWF])'{vnjp.ް%w�o%Oc0_ѭTs^VUW`l) !6OcD9FPIrBY{3]O7|jU•w\j.Ip&\!KݤpbAuVU*Xjj2z95|{HXiaksY� iͷv'Ύ~_}�?tK,>r^0�"�!�@��x��!�@�B<�� &_�-Q� !�AQ�J$5yϽY<� H�@��x�@y)EMbuR&�x=/ľϽ|�,^^”Y %IB3a!k dv]RU �)/*ׄr͹ W El=1W-�j:[p=-ZǕb5�|DE--q‰�>%{ u.(t=_5u7bՉ'P+Y:~ 6fF{Z +HY?@xabEa?i曮� �JV2A�,M O ,@;~ tpTs<1~K,=:@9v;  vDv|~}(7~⫾S�\|#/&Ob@0C<��Oa[�p[ �1Prx ޷k.!@3!,d H$4!uֹ(H8A!�"5ʷy'!2{R)&kW.=�~c6R8;_QS{ }}}6d�K' `�V|组>Mex;K �A"O�yB<�&/6'oRbyB<�)/*g7vBL_#oi~k �3V9ۿap1�zwԔo_%�p9eXj #MڿR3ffYT75fQOZq';0{ g�6?Rat{B<"f $R;jU,k5/ow/oW,.rMz  ǒ~OjkX6_ d*VR)7g^x GY>(xv{gXGO";!>P|1 ϱ%Ɏk [E\{K5Q?mJ`w_$XeDQ''[|d}KFB<KD.^mxa/t }e%!&'Pa+uϝk\`% MJ%QYTm\z>_Z'j�,@P8�(щwP!("4m+N_%KDG @|_㎕uY  jt�:̥<i(!@Scg?gs.u猾 `He]A_<�"~L /91ʄv͞ l[A$K1 :j�� ��v+Ps̾UdTҬg1mH~,SVtC(t�o49 V]90gk^�u(9͹H+5 gMH�6%gs.!Q sɯz[ZhXHQIY8Jl%^>ӠD%">jkB`1cQkK u &,˰ojf'*͛Qlk�>)^﨩yzt$uVaS@%ñW!V:_Fk` *g)l7q?6 Ax;i7̘;= -9ٰ3 u 8:yZJ^ԌϞT9 {6#Ob;Էt_]0qPAG 2)F}k7X]ymR԰AXP,�,߹(5v.k\B<�'Q|6{Bz.;%&:jiwWN'x�>8~5@Y~ ; ץKB�^߉t�_g/6w"wdQB<R#.eb[|ϕ#�3�i�,/� �U�bAn'[->Vx�G|554 A4J ^ؓDJNlxQ"`EQjֳx ٜM,�@? ؿx�>x_ºOQ�x��!79x��!�@��.s`p�So0"k___[�\񽽽 K �~V� ���(ʏ"˷:ʗc\Ld];CW,p rTEuuɤ@חXYձ( TթAxJ&_m0+lZ,ݝCB|墰: Wާ�Լb^P+Njon泶dX4c|/ΠYP{!=Yp9BU{  toR\ W?ߝ]> U?YQ)c[/M}ܫcQ ãY|wG_?r)L[3݀KVg@+nt��!�@��x��!�@�B<�� ���B<��x��!�@��x��!���B<��>E"Q� !F*(W}J$di~N] �:OX!�ۙ,ߙg=O�/y;9x�Y"o~,5=#m6G%woo,!5~a.?ڼFU?H%!MA}2mLobE�?]uZO&d;ڟY*Z˭.Mnm&}! |~"``2ŧR)קKc׬&6ld2YXnᛀyu/R.JAyR@&e*`pF7[ݼ6G-$&+vR)uexLmM,p�.Gpv7K(&w _nu#{lE:*ɖ7,M %sKug7L>+ >Sᢞc3|Q'c[л!^}Kְ'Mw0g l_ۮ]vE;%Uww`"kǭ>j)VK,oʜ5`78{]-S*'?2|lzjeV˭ClSZ[-o.Q PQ| #i>OI`¨N@=O5<zLdol�Y<�� ��Ps[y ;b~5b❍:�5ܝ[x�,B<��x�GTh=Oj99?QD ۈE0Z#M"5 efmd�Xx� ���B<�<ۭdRJ*6c7TA%[ml3R) B_hzMA6fbѶ5^3f"E~Im,Δf䬶��IDAT_.6fҷa|mm닽Wfk ߄멍("QueK(pm}*>jzÓٙ3uz4w6K!Qf.+'ɬۇ]Ĭ%n)|{]V|[ȳ ڟR[~"T{\^ˮJnذspg[A4LCml=dmçA,pɫN}>bΔiw\ݚ\lȆ58m[7)_. ΚӬy?/[fr|,Q#|��,!k�5;D" ��x�T/?}0ܴ0Lm�t:Ksl&6m,�@��x�MۭDFX<?-^�+Og��G�0R.۶c4�̾����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/ds9.con�����������������������������������������������������������������000644 �000765 �000000 �00000231352 11220740726 017506� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 2.39617839e+02 2.71644106e+01 2.39617474e+02 2.71647525e+01 2.39616775e+02 2.71644112e+01 2.39617473e+02 2.71637275e+01 2.39617839e+02 2.71644106e+01 2.39625462e+02 2.71657727e+01 2.39625155e+02 2.71659682e+01 2.39624814e+02 2.71657731e+01 2.39625155e+02 2.71656428e+01 2.39625462e+02 2.71657727e+01 2.39589828e+02 2.71726237e+01 2.39589828e+02 2.71726237e+01 2.39589828e+02 2.71726237e+01 2.39589828e+02 2.71726237e+01 2.39589828e+02 2.71726237e+01 2.39634708e+02 2.71739667e+01 2.39634380e+02 2.71747869e+01 2.39633960e+02 2.71739672e+01 2.39634379e+02 2.71737391e+01 2.39634708e+02 2.71739667e+01 2.39626954e+02 2.71739718e+01 2.39626698e+02 2.71742453e+01 2.39626506e+02 2.71739721e+01 2.39626697e+02 2.71732886e+01 2.39626954e+02 2.71739718e+01 2.39597628e+02 2.71739873e+01 2.39597510e+02 2.71742151e+01 2.39597339e+02 2.71739874e+01 2.39597509e+02 2.71738631e+01 2.39597628e+02 2.71739873e+01 2.39637672e+02 2.71753312e+01 2.39637453e+02 2.71755799e+01 2.39637111e+02 2.71753316e+01 2.39637452e+02 2.71751706e+01 2.39637672e+02 2.71753312e+01 2.39629771e+02 2.71753366e+01 2.39629771e+02 2.71753366e+01 2.39629771e+02 2.71753366e+01 2.39629771e+02 2.71753366e+01 2.39629771e+02 2.71753366e+01 2.39624522e+02 2.71753399e+01 2.39624588e+02 2.71767066e+01 2.39623628e+02 2.71778460e+01 2.39622603e+02 2.71767078e+01 2.39622091e+02 2.71760869e+01 2.39621605e+02 2.71753417e+01 2.39622090e+02 2.71746581e+01 2.39623626e+02 2.71745433e+01 2.39624522e+02 2.71753399e+01 2.39628543e+02 2.71767041e+01 2.39628236e+02 2.71769145e+01 2.39628000e+02 2.71767044e+01 2.39628236e+02 2.71763138e+01 2.39628543e+02 2.71767041e+01 2.39599326e+02 2.71767199e+01 2.39599048e+02 2.71780866e+01 2.39599048e+02 2.71780866e+01 2.39599048e+02 2.71780866e+01 2.39597511e+02 2.71767206e+01 2.39597511e+02 2.71767206e+01 2.39597511e+02 2.71767206e+01 2.39599047e+02 2.71764163e+01 2.39599326e+02 2.71767199e+01 2.39592075e+02 2.71767228e+01 2.39591366e+02 2.71772356e+01 2.39590927e+02 2.71767233e+01 2.39591366e+02 2.71762408e+01 2.39592075e+02 2.71767228e+01 2.39633358e+02 2.71780676e+01 2.39633506e+02 2.71794341e+01 2.39632848e+02 2.71804596e+01 2.39632678e+02 2.71808013e+01 2.39631655e+02 2.71821687e+01 2.39631622e+02 2.71835354e+01 2.39632851e+02 2.71843155e+01 2.39634169e+02 2.71849003e+01 2.39633237e+02 2.71862676e+01 2.39632854e+02 2.71872929e+01 2.39632662e+02 2.71876347e+01 2.39631319e+02 2.71886985e+01 2.39629783e+02 2.71890032e+01 2.39629783e+02 2.71890032e+01 2.39629783e+02 2.71890032e+01 2.39628246e+02 2.71886626e+01 2.39626710e+02 2.71890052e+01 2.39628247e+02 2.71896876e+01 2.39629169e+02 2.71903703e+01 2.39628248e+02 2.71909566e+01 2.39627634e+02 2.71917379e+01 2.39628079e+02 2.71931043e+01 2.39628250e+02 2.71934459e+01 2.39628763e+02 2.71944705e+01 2.39629788e+02 2.71949824e+01 2.39630940e+02 2.71944691e+01 2.39629787e+02 2.71941545e+01 2.39628323e+02 2.71931042e+01 2.39628863e+02 2.71917372e+01 2.39629784e+02 2.71907116e+01 2.39631320e+02 2.71905967e+01 2.39631935e+02 2.71903685e+01 2.39631758e+02 2.71890019e+01 2.39632854e+02 2.71878623e+01 2.39634391e+02 2.71876335e+01 2.39634391e+02 2.71876335e+01 2.39635772e+02 2.71862659e+01 2.39635926e+02 2.71858102e+01 2.39637461e+02 2.71853536e+01 2.39638077e+02 2.71862642e+01 2.39637944e+02 2.71876310e+01 2.39637464e+02 2.71883147e+01 2.39635928e+02 2.71885435e+01 2.39635416e+02 2.71889994e+01 2.39634392e+02 2.71894825e+01 2.39633186e+02 2.71903676e+01 2.39634394e+02 2.71914406e+01 2.39634813e+02 2.71917332e+01 2.39635010e+02 2.71930997e+01 2.39634396e+02 2.71937835e+01 2.39633958e+02 2.71944671e+01 2.39634397e+02 2.71949224e+01 2.39634704e+02 2.71944666e+01 2.39635932e+02 2.71934718e+01 2.39636879e+02 2.71944651e+01 2.39636593e+02 2.71958319e+01 2.39637472e+02 2.71966123e+01 2.39638131e+02 2.71971975e+01 2.39637473e+02 2.71985646e+01 2.39637473e+02 2.71985646e+01 2.39637014e+02 2.71999316e+01 2.39637475e+02 2.72004438e+01 2.39638174e+02 2.72012975e+01 2.39637784e+02 2.72026644e+01 2.39639014e+02 2.72032102e+01 2.39639892e+02 2.72026629e+01 2.39640549e+02 2.72012958e+01 2.39640549e+02 2.72012958e+01 2.39640549e+02 2.72012958e+01 2.39642086e+02 2.72017502e+01 2.39642598e+02 2.72012942e+01 2.39642084e+02 2.71999280e+01 2.39642084e+02 2.71999280e+01 2.39642084e+02 2.71999280e+01 2.39643621e+02 2.71996990e+01 2.39644005e+02 2.71999265e+01 2.39644006e+02 2.72012932e+01 2.39643931e+02 2.72026599e+01 2.39643624e+02 2.72028554e+01 2.39642088e+02 2.72040280e+01 2.39642088e+02 2.72040280e+01 2.39641513e+02 2.72053950e+01 2.39640554e+02 2.72065346e+01 2.39639371e+02 2.72053966e+01 2.39639016e+02 2.72049413e+01 2.39638358e+02 2.72053973e+01 2.39639017e+02 2.72067635e+01 2.39639017e+02 2.72067635e+01 2.39639787e+02 2.72081296e+01 2.39640555e+02 2.72082809e+01 2.39642093e+02 2.72090390e+01 2.39643629e+02 2.72085824e+01 2.39645166e+02 2.72089798e+01 2.39645743e+02 2.72094919e+01 2.39645167e+02 2.72101756e+01 2.39643630e+02 2.72096373e+01 2.39642180e+02 2.72108612e+01 2.39642315e+02 2.72122278e+01 2.39642096e+02 2.72123798e+01 2.39641788e+02 2.72122282e+01 2.39641955e+02 2.72108614e+01 2.39640557e+02 2.72101031e+01 2.39639021e+02 2.72104079e+01 2.39637995e+02 2.72094976e+01 2.39638711e+02 2.72081304e+01 2.39637481e+02 2.72072202e+01 2.39637097e+02 2.72067649e+01 2.39635943e+02 2.72057407e+01 2.39635431e+02 2.72053994e+01 2.39635942e+02 2.72050574e+01 2.39636966e+02 2.72040317e+01 2.39635941e+02 2.72035500e+01 2.39634405e+02 2.72040334e+01 2.39634405e+02 2.72040334e+01 2.39634022e+02 2.72054004e+01 2.39634407e+02 2.72067668e+01 2.39634407e+02 2.72067668e+01 2.39634407e+02 2.72067668e+01 2.39633091e+02 2.72081343e+01 2.39632872e+02 2.72088178e+01 2.39632745e+02 2.72095012e+01 2.39632874e+02 2.72101845e+01 2.39633385e+02 2.72095008e+01 2.39634409e+02 2.72091584e+01 2.39635946e+02 2.72094990e+01 2.39635946e+02 2.72094990e+01 2.39635946e+02 2.72094990e+01 2.39635676e+02 2.72108659e+01 2.39634412e+02 2.72122334e+01 2.39635950e+02 2.72133712e+01 2.39636206e+02 2.72135988e+01 2.39637334e+02 2.72149647e+01 2.39636875e+02 2.72163317e+01 2.39636914e+02 2.72176983e+01 2.39635954e+02 2.72183823e+01 2.39635315e+02 2.72190661e+01 2.39635601e+02 2.72204326e+01 2.39634420e+02 2.72214096e+01 2.39633908e+02 2.72218004e+01 2.39634421e+02 2.72224075e+01 2.39635650e+02 2.72217992e+01 2.39635957e+02 2.72214573e+01 2.39637109e+02 2.72204315e+01 2.39637493e+02 2.72200896e+01 2.39639030e+02 2.72204301e+01 2.39639030e+02 2.72204301e+01 2.39639030e+02 2.72204301e+01 2.39638006e+02 2.72217975e+01 2.39638520e+02 2.72231638e+01 2.39638137e+02 2.72245308e+01 2.39637497e+02 2.72251007e+01 2.39636728e+02 2.72245318e+01 2.39635959e+02 2.72235561e+01 2.39634422e+02 2.72236223e+01 2.39633142e+02 2.72245343e+01 2.39634253e+02 2.72259002e+01 2.39632888e+02 2.72268122e+01 2.39632010e+02 2.72272683e+01 2.39631523e+02 2.72286353e+01 2.39631353e+02 2.72290910e+01 2.39630914e+02 2.72300024e+01 2.39631354e+02 2.72302506e+01 2.39631968e+02 2.72300017e+01 2.39632890e+02 2.72296284e+01 2.39633835e+02 2.72286338e+01 2.39634426e+02 2.72282063e+01 2.39635524e+02 2.72286326e+01 2.39635068e+02 2.72299996e+01 2.39635965e+02 2.72308687e+01 2.39636478e+02 2.72313653e+01 2.39637504e+02 2.72327312e+01 2.39637504e+02 2.72327312e+01 2.39637645e+02 2.72340978e+01 2.39637505e+02 2.72342687e+01 2.39637365e+02 2.72340980e+01 2.39635967e+02 2.72327323e+01 2.39634430e+02 2.72327334e+01 2.39634430e+02 2.72327334e+01 2.39632892e+02 2.72315196e+01 2.39631355e+02 2.72322473e+01 2.39629819e+02 2.72327365e+01 2.39629819e+02 2.72327365e+01 2.39629478e+02 2.72341033e+01 2.39628284e+02 2.72350608e+01 2.39627823e+02 2.72354711e+01 2.39626747e+02 2.72360697e+01 2.39625979e+02 2.72368389e+01 2.39626493e+02 2.72382052e+01 2.39625213e+02 2.72391822e+01 2.39624598e+02 2.72395731e+01 2.39623676e+02 2.72400862e+01 2.39622140e+02 2.72408046e+01 2.39622037e+02 2.72409413e+01 2.39622140e+02 2.72413968e+01 2.39622909e+02 2.72423075e+01 2.39623678e+02 2.72425172e+01 2.39625216e+02 2.72433994e+01 2.39625370e+02 2.72436726e+01 2.39625901e+02 2.72450389e+01 2.39625603e+02 2.72464058e+01 2.39625219e+02 2.72469527e+01 2.39624561e+02 2.72477731e+01 2.39625220e+02 2.72482852e+01 2.39625701e+02 2.72491391e+01 2.39625221e+02 2.72496275e+01 2.39623684e+02 2.72501165e+01 2.39622829e+02 2.72491408e+01 2.39623272e+02 2.72477739e+01 2.39623066e+02 2.72464074e+01 2.39622143e+02 2.72450412e+01 2.39621683e+02 2.72464082e+01 2.39620607e+02 2.72472061e+01 2.39619070e+02 2.72474835e+01 2.39617918e+02 2.72477770e+01 2.39619071e+02 2.72488014e+01 2.39619264e+02 2.72491429e+01 2.39619072e+02 2.72495986e+01 2.39618836e+02 2.72505099e+01 2.39619073e+02 2.72510564e+01 2.39619535e+02 2.72518761e+01 2.39619074e+02 2.72529014e+01 2.39617537e+02 2.72527884e+01 2.39616511e+02 2.72518778e+01 2.39615999e+02 2.72516048e+01 2.39615719e+02 2.72518783e+01 2.39615341e+02 2.72532452e+01 2.39614976e+02 2.72546120e+01 2.39614464e+02 2.72559790e+01 2.39614464e+02 2.72559790e+01 2.39614464e+02 2.72559790e+01 2.39612927e+02 2.72554673e+01 2.39611390e+02 2.72558098e+01 2.39611082e+02 2.72559808e+01 2.39611390e+02 2.72566639e+01 2.39612928e+02 2.72573465e+01 2.39612928e+02 2.72573465e+01 2.39612928e+02 2.72573465e+01 2.39611391e+02 2.72575425e+01 2.39609853e+02 2.72573481e+01 2.39608317e+02 2.72583511e+01 2.39607087e+02 2.72587161e+01 2.39607219e+02 2.72600827e+01 2.39607165e+02 2.72614494e+01 2.39606781e+02 2.72619963e+01 2.39605244e+02 2.72619629e+01 2.39604405e+02 2.72614508e+01 2.39604218e+02 2.72600842e+01 2.39603705e+02 2.72597690e+01 2.39602552e+02 2.72600850e+01 2.39602425e+02 2.72614517e+01 2.39602169e+02 2.72616037e+01 2.39601145e+02 2.72628189e+01 2.39600632e+02 2.72633658e+01 2.39599607e+02 2.72628196e+01 2.39599095e+02 2.72626832e+01 2.39598875e+02 2.72628199e+01 2.39597942e+02 2.72641870e+01 2.39597649e+02 2.72655538e+01 2.39597559e+02 2.72656514e+01 2.39596790e+02 2.72655542e+01 2.39596021e+02 2.72652811e+01 2.39595509e+02 2.72655547e+01 2.39594484e+02 2.72662384e+01 2.39592946e+02 2.72661536e+01 2.39591409e+02 2.72669230e+01 2.39592947e+02 2.72680406e+01 2.39593387e+02 2.72682889e+01 2.39592948e+02 2.72684993e+01 2.39591410e+02 2.72684849e+01 2.39589873e+02 2.72693836e+01 2.39588335e+02 2.72688033e+01 2.39586798e+02 2.72694168e+01 2.39585260e+02 2.72694877e+01 2.39584821e+02 2.72696587e+01 2.39583723e+02 2.72705132e+01 2.39582186e+02 2.72703429e+01 2.39581609e+02 2.72710264e+01 2.39580649e+02 2.72715961e+01 2.39579111e+02 2.72722571e+01 2.39578958e+02 2.72723938e+01 2.39577574e+02 2.72730092e+01 2.39576036e+02 2.72727591e+01 2.39574499e+02 2.72727856e+01 2.39572961e+02 2.72733894e+01 2.39571424e+02 2.72733898e+01 2.39570057e+02 2.72723962e+01 2.39569886e+02 2.72723158e+01 2.39569827e+02 2.72723962e+01 2.39569886e+02 2.72726695e+01 2.39570765e+02 2.72737627e+01 2.39569887e+02 2.72751295e+01 2.39569887e+02 2.72751295e+01 2.39569887e+02 2.72751295e+01 2.39568349e+02 2.72737632e+01 2.39566811e+02 2.72746747e+01 2.39566372e+02 2.72737636e+01 2.39565273e+02 2.72733842e+01 2.39564312e+02 2.72737640e+01 2.39564078e+02 2.72751307e+01 2.39564351e+02 2.72764974e+01 2.39563736e+02 2.72767253e+01 2.39563224e+02 2.72764976e+01 2.39563121e+02 2.72751309e+01 2.39562198e+02 2.72748157e+01 2.39560661e+02 2.72746758e+01 2.39560543e+02 2.72751314e+01 2.39559833e+02 2.72764981e+01 2.39559124e+02 2.72770449e+01 2.39558285e+02 2.72764984e+01 2.39557805e+02 2.72751318e+01 2.39557586e+02 2.72747901e+01 2.39556560e+02 2.72737653e+01 2.39556048e+02 2.72733926e+01 2.39554510e+02 2.72735244e+01 2.39552973e+02 2.72737657e+01 2.39552973e+02 2.72737657e+01 2.39552973e+02 2.72737657e+01 2.39551435e+02 2.72730825e+01 2.39550512e+02 2.72723993e+01 2.39549897e+02 2.72716184e+01 2.39548359e+02 2.72714233e+01 2.39546822e+02 2.72721263e+01 2.39545284e+02 2.72721719e+01 2.39545114e+02 2.72723997e+01 2.39543747e+02 2.72733937e+01 2.39542868e+02 2.72723998e+01 2.39543593e+02 2.72710331e+01 2.39542722e+02 2.72696665e+01 2.39542209e+02 2.72692109e+01 2.39540672e+02 2.72689832e+01 2.39539441e+02 2.72682999e+01 2.39539134e+02 2.72681480e+01 2.39537596e+02 2.72678443e+01 2.39536059e+02 2.72672065e+01 2.39534521e+02 2.72669332e+01 2.39534521e+02 2.72669332e+01 2.39534521e+02 2.72669332e+01 2.39536059e+02 2.72666178e+01 2.39536963e+02 2.72655665e+01 2.39536059e+02 2.72645903e+01 2.39534522e+02 2.72641998e+01 2.39534522e+02 2.72641998e+01 2.39534522e+02 2.72641998e+01 2.39535290e+02 2.72628332e+01 2.39536059e+02 2.72618870e+01 2.39536618e+02 2.72614665e+01 2.39536059e+02 2.72609696e+01 2.39534522e+02 2.72605554e+01 2.39532984e+02 2.72614665e+01 2.39532984e+02 2.72614665e+01 2.39532984e+02 2.72614665e+01 2.39532765e+02 2.72600998e+01 2.39532984e+02 2.72599631e+01 2.39534137e+02 2.72587332e+01 2.39534522e+02 2.72580498e+01 2.39534983e+02 2.72573665e+01 2.39534522e+02 2.72568540e+01 2.39533561e+02 2.72559998e+01 2.39532984e+02 2.72557435e+01 2.39532472e+02 2.72559998e+01 2.39531447e+02 2.72565855e+01 2.39530737e+02 2.72559997e+01 2.39531191e+02 2.72546331e+01 2.39530974e+02 2.72532664e+01 2.39530525e+02 2.72518997e+01 2.39531447e+02 2.72505331e+01 2.39530218e+02 2.72491663e+01 2.39529910e+02 2.72488247e+01 2.39529526e+02 2.72477996e+01 2.39529910e+02 2.72474269e+01 2.39531447e+02 2.72477997e+01 2.39532985e+02 2.72464331e+01 2.39531448e+02 2.72460060e+01 2.39529910e+02 2.72452182e+01 2.39529718e+02 2.72450663e+01 2.39529910e+02 2.72446108e+01 2.39530935e+02 2.72436997e+01 2.39531448e+02 2.72430164e+01 2.39531667e+02 2.72423331e+01 2.39531789e+02 2.72409664e+01 2.39531448e+02 2.72402831e+01 2.39529911e+02 2.72402830e+01 2.39529398e+02 2.72395996e+01 2.39529399e+02 2.72382330e+01 2.39529911e+02 2.72380052e+01 2.39530526e+02 2.72382330e+01 2.39531448e+02 2.72390531e+01 2.39532985e+02 2.72392782e+01 2.39533818e+02 2.72382332e+01 2.39534522e+02 2.72374419e+01 2.39535823e+02 2.72382332e+01 2.39536059e+02 2.72385065e+01 2.39536401e+02 2.72382332e+01 2.39536059e+02 2.72379847e+01 2.39535246e+02 2.72368665e+01 2.39534932e+02 2.72354999e+01 2.39536059e+02 2.72345603e+01 2.39536700e+02 2.72341332e+01 2.39536059e+02 2.72332790e+01 2.39534522e+02 2.72337232e+01 2.39533544e+02 2.72327665e+01 2.39534522e+02 2.72321287e+01 2.39536059e+02 2.72320832e+01 2.39536521e+02 2.72313999e+01 2.39537596e+02 2.72302041e+01 2.39537750e+02 2.72300332e+01 2.39537904e+02 2.72286666e+01 2.39539133e+02 2.72272999e+01 2.39539133e+02 2.72272999e+01 2.39539646e+02 2.72259332e+01 2.39540158e+02 2.72245665e+01 2.39540670e+02 2.72235415e+01 2.39541988e+02 2.72245665e+01 2.39542207e+02 2.72259332e+01 2.39542976e+02 2.72245665e+01 2.39542207e+02 2.72243712e+01 2.39541055e+02 2.72231999e+01 2.39542207e+02 2.72224544e+01 2.39542756e+02 2.72218331e+01 2.39543744e+02 2.72211498e+01 2.39545002e+02 2.72218330e+01 2.39545281e+02 2.72221064e+01 2.39545665e+02 2.72218330e+01 2.39545281e+02 2.72214914e+01 2.39544666e+02 2.72204664e+01 2.39545281e+02 2.72194414e+01 2.39546818e+02 2.72195552e+01 2.39546946e+02 2.72190996e+01 2.39546818e+02 2.72187959e+01 2.39545622e+02 2.72177330e+01 2.39546510e+02 2.72163663e+01 2.39546220e+02 2.72149996e+01 2.39546817e+02 2.72136329e+01 2.39546817e+02 2.72122663e+01 2.39546817e+02 2.72122663e+01 2.39546817e+02 2.72122663e+01 2.39548354e+02 2.72133595e+01 2.39548661e+02 2.72136328e+01 2.39549891e+02 2.72139972e+01 2.39551120e+02 2.72136326e+01 2.39551427e+02 2.72133592e+01 2.39551940e+02 2.72122659e+01 2.39551427e+02 2.72108992e+01 2.39549890e+02 2.72114688e+01 2.39548354e+02 2.72117195e+01 2.39547695e+02 2.72108996e+01 2.39548354e+02 2.72101540e+01 2.39549890e+02 2.72099232e+01 2.39551427e+02 2.72108992e+01 2.39552964e+02 2.72101019e+01 2.39554500e+02 2.72095322e+01 2.39554500e+02 2.72095322e+01 2.39556037e+02 2.72086027e+01 2.39557574e+02 2.72083170e+01 2.39559110e+02 2.72083927e+01 2.39559494e+02 2.72081649e+01 2.39559669e+02 2.72067982e+01 2.39559110e+02 2.72063013e+01 2.39557881e+02 2.72067985e+01 2.39557574e+02 2.72074818e+01 2.39556037e+02 2.72072543e+01 2.39554500e+02 2.72080517e+01 2.39552963e+02 2.72077102e+01 2.39551427e+02 2.72081659e+01 2.39551427e+02 2.72081659e+01 2.39551427e+02 2.72081659e+01 2.39551287e+02 2.72067993e+01 2.39551427e+02 2.72065715e+01 2.39552963e+02 2.72058880e+01 2.39554500e+02 2.72057251e+01 2.39556036e+02 2.72054321e+01 2.39556036e+02 2.72040654e+01 2.39554499e+02 2.72026989e+01 2.39554499e+02 2.72026989e+01 2.39554499e+02 2.72026989e+01 2.39556036e+02 2.72026987e+01 2.39556036e+02 2.72026987e+01 2.39557573e+02 2.72040652e+01 2.39559109e+02 2.72026983e+01 2.39559109e+02 2.72026983e+01 2.39559109e+02 2.72026983e+01 2.39560646e+02 2.72031081e+01 2.39562183e+02 2.72026978e+01 2.39561118e+02 2.72013313e+01 2.39561414e+02 2.71999646e+01 2.39562182e+02 2.71997692e+01 2.39562840e+02 2.71985977e+01 2.39562181e+02 2.71972311e+01 2.39562181e+02 2.71972311e+01 2.39562181e+02 2.71972311e+01 2.39563266e+02 2.71958643e+01 2.39563717e+02 2.71952430e+01 2.39564678e+02 2.71958640e+01 2.39564486e+02 2.71972307e+01 2.39565084e+02 2.71985973e+01 2.39563719e+02 2.71999642e+01 2.39563719e+02 2.71999642e+01 2.39563104e+02 2.72013310e+01 2.39563719e+02 2.72020763e+01 2.39564817e+02 2.72026973e+01 2.39565256e+02 2.72033806e+01 2.39565695e+02 2.72026971e+01 2.39565256e+02 2.72023556e+01 2.39564487e+02 2.72013307e+01 2.39565255e+02 2.72001591e+01 2.39566792e+02 2.72008422e+01 2.39567560e+02 2.71999634e+01 2.39566791e+02 2.71991436e+01 2.39565474e+02 2.71985972e+01 2.39566791e+02 2.71977769e+01 2.39567350e+02 2.71972301e+01 2.39567943e+02 2.71958634e+01 2.39567098e+02 2.71944969e+01 2.39566790e+02 2.71931303e+01 2.39566790e+02 2.71931303e+01 2.39566448e+02 2.71917637e+01 2.39566789e+02 2.71913731e+01 2.39568326e+02 2.71913428e+01 2.39569862e+02 2.71908933e+01 2.39571207e+02 2.71917626e+01 2.39571399e+02 2.71931292e+01 2.39572936e+02 2.71931289e+01 2.39574472e+02 2.71930042e+01 2.39575496e+02 2.71917615e+01 2.39576008e+02 2.71907852e+01 2.39576599e+02 2.71917612e+01 2.39576667e+02 2.71931279e+01 2.39577546e+02 2.71944943e+01 2.39578911e+02 2.71931273e+01 2.39579082e+02 2.71929905e+01 2.39580618e+02 2.71923068e+01 2.39581130e+02 2.71917599e+01 2.39582154e+02 2.71903929e+01 2.39580617e+02 2.71898468e+01 2.39579849e+02 2.71890270e+01 2.39579080e+02 2.71882818e+01 2.39577982e+02 2.71876609e+01 2.39579080e+02 2.71871349e+01 2.39580616e+02 2.71872045e+01 2.39581128e+02 2.71876599e+01 2.39582153e+02 2.71890263e+01 2.39583689e+02 2.71885475e+01 2.39584640e+02 2.71876588e+01 2.39585225e+02 2.71868176e+01 2.39586761e+02 2.71865192e+01 2.39587041e+02 2.71862913e+01 2.39588297e+02 2.71851727e+01 2.39589834e+02 2.71859487e+01 2.39590858e+02 2.71849233e+01 2.39591369e+02 2.71835564e+01 2.39591369e+02 2.71835564e+01 2.39592905e+02 2.71830302e+01 2.39593674e+02 2.71835555e+01 2.39592906e+02 2.71844100e+01 2.39592138e+02 2.71849228e+01 2.39592907e+02 2.71857425e+01 2.39594443e+02 2.71862885e+01 2.39595979e+02 2.71856046e+01 2.39596620e+02 2.71862877e+01 2.39595980e+02 2.71869713e+01 2.39594443e+02 2.71862885e+01 2.39592907e+02 2.71867447e+01 2.39591371e+02 2.71876564e+01 2.39591371e+02 2.71876564e+01 2.39589835e+02 2.71890237e+01 2.39591372e+02 2.71896443e+01 2.39592225e+02 2.71890227e+01 2.39592908e+02 2.71883392e+01 2.39594444e+02 2.71883911e+01 2.39595981e+02 2.71890212e+01 2.39597517e+02 2.71878817e+01 2.39598798e+02 2.71890201e+01 2.39597518e+02 2.71898748e+01 2.39596750e+02 2.71903876e+01 2.39596665e+02 2.71917543e+01 2.39595983e+02 2.71922515e+01 2.39595445e+02 2.71931215e+01 2.39595984e+02 2.71936527e+01 2.39597328e+02 2.71931207e+01 2.39597520e+02 2.71928928e+01 2.39598032e+02 2.71931204e+01 2.39599057e+02 2.71940310e+01 2.39599671e+02 2.71931197e+01 2.39599056e+02 2.71925733e+01 2.39598479e+02 2.71917535e+01 2.39598286e+02 2.71903869e+01 2.39599054e+02 2.71893616e+01 2.39599182e+02 2.71890199e+01 2.39600590e+02 2.71880797e+01 2.39602126e+02 2.71879252e+01 2.39603279e+02 2.71890180e+01 2.39603664e+02 2.71895645e+01 2.39604222e+02 2.71890176e+01 2.39603663e+02 2.71884105e+01 2.39602702e+02 2.71876516e+01 2.39603662e+02 2.71866750e+01 2.39605198e+02 2.71869671e+01 2.39605813e+02 2.71876502e+01 2.39606736e+02 2.71883331e+01 2.39607394e+02 2.71876494e+01 2.39608271e+02 2.71871023e+01 2.39608830e+02 2.71876487e+01 2.39609297e+02 2.71890151e+01 2.39608273e+02 2.71897966e+01 2.39607659e+02 2.71903826e+01 2.39608274e+02 2.71908139e+01 2.39609426e+02 2.71903817e+01 2.39609810e+02 2.71899260e+01 2.39611345e+02 2.71890141e+01 2.39611345e+02 2.71890141e+01 2.39611612e+02 2.71876473e+01 2.39611344e+02 2.71865541e+01 2.39609807e+02 2.71862815e+01 2.39609807e+02 2.71862815e+01 2.39609166e+02 2.71849152e+01 2.39609806e+02 2.71837760e+01 2.39611342e+02 2.71841331e+01 2.39612110e+02 2.71835470e+01 2.39612878e+02 2.71828633e+01 2.39613646e+02 2.71835462e+01 2.39614415e+02 2.71843658e+01 2.39614769e+02 2.71835456e+01 2.39615182e+02 2.71821787e+01 2.39615950e+02 2.71820264e+01 2.39616257e+02 2.71821781e+01 2.39617231e+02 2.71835442e+01 2.39617487e+02 2.71838857e+01 2.39617668e+02 2.71835440e+01 2.39619023e+02 2.71822620e+01 2.39620236e+02 2.71835425e+01 2.39620561e+02 2.71844534e+01 2.39622097e+02 2.71839730e+01 2.39622755e+02 2.71835410e+01 2.39622095e+02 2.71821747e+01 2.39620559e+02 2.71829349e+01 2.39619279e+02 2.71821764e+01 2.39619022e+02 2.71819488e+01 2.39618473e+02 2.71808102e+01 2.39618252e+02 2.71794437e+01 2.39619020e+02 2.71789877e+01 2.39619789e+02 2.71794428e+01 2.39620558e+02 2.71803534e+01 2.39621172e+02 2.71808086e+01 2.39622095e+02 2.71821747e+01 2.39623631e+02 2.71809780e+01 2.39625167e+02 2.71808062e+01 2.39625167e+02 2.71808062e+01 2.39626703e+02 2.71799852e+01 2.39628239e+02 2.71808043e+01 2.39628239e+02 2.71808043e+01 2.39629776e+02 2.71814245e+01 2.39630367e+02 2.71808029e+01 2.39630543e+02 2.71794361e+01 2.39631311e+02 2.71792404e+01 2.39632462e+02 2.71780682e+01 2.39632846e+02 2.71776124e+01 2.39633358e+02 2.71780676e+01 2.39629993e+02 2.71780698e+01 2.39629774e+02 2.71787533e+01 2.39629646e+02 2.71780700e+01 2.39629773e+02 2.71779181e+01 2.39629993e+02 2.71780698e+01 2.39617902e+02 2.71780772e+01 2.39617484e+02 2.71786631e+01 2.39617064e+02 2.71780777e+01 2.39617483e+02 2.71775649e+01 2.39617902e+02 2.71780772e+01 2.39592903e+02 2.71780892e+01 2.39592903e+02 2.71780892e+01 2.39592903e+02 2.71780892e+01 2.39592903e+02 2.71780892e+01 2.39592903e+02 2.71780892e+01 2.39616926e+02 2.71794444e+01 2.39615948e+02 2.71800827e+01 2.39615315e+02 2.71794453e+01 2.39615948e+02 2.71788072e+01 2.39616926e+02 2.71794444e+01 2.39598281e+02 2.71794536e+01 2.39599049e+02 2.71805922e+01 2.39599562e+02 2.71808197e+01 2.39599562e+02 2.71821864e+01 2.39600587e+02 2.71835526e+01 2.39602123e+02 2.71830964e+01 2.39602252e+02 2.71835519e+01 2.39602124e+02 2.71836495e+01 2.39600876e+02 2.71849192e+01 2.39600588e+02 2.71854318e+01 2.39600012e+02 2.71849195e+01 2.39599051e+02 2.71842366e+01 2.39597954e+02 2.71835538e+01 2.39598932e+02 2.71821867e+01 2.39597513e+02 2.71812226e+01 2.39596233e+02 2.71808212e+01 2.39596814e+02 2.71794543e+01 2.39597512e+02 2.71788845e+01 2.39598281e+02 2.71794536e+01 2.39579635e+02 2.71794604e+01 2.39579077e+02 2.71800680e+01 2.39578638e+02 2.71794607e+01 2.39579077e+02 2.71791569e+01 2.39579635e+02 2.71794604e+01 2.39611647e+02 2.71808139e+01 2.39612109e+02 2.71821803e+01 2.39611341e+02 2.71828641e+01 2.39609805e+02 2.71830927e+01 2.39608268e+02 2.71823066e+01 2.39608098e+02 2.71821824e+01 2.39608267e+02 2.71808157e+01 2.39608267e+02 2.71808157e+01 2.39608267e+02 2.71808157e+01 2.39609804e+02 2.71817911e+01 2.39611084e+02 2.71808142e+01 2.39611340e+02 2.71806433e+01 2.39611647e+02 2.71808139e+01 2.39593377e+02 2.71808223e+01 2.39592904e+02 2.71812781e+01 2.39591675e+02 2.71808230e+01 2.39592904e+02 2.71804020e+01 2.39593377e+02 2.71808223e+01 2.39582699e+02 2.71808261e+01 2.39582150e+02 2.71816805e+01 2.39581296e+02 2.71808266e+01 2.39582150e+02 2.71799721e+01 2.39582699e+02 2.71808261e+01 2.39639434e+02 2.71821633e+01 2.39640532e+02 2.71833014e+01 2.39640686e+02 2.71835290e+01 2.39640533e+02 2.71837569e+01 2.39638997e+02 2.71840428e+01 2.39637844e+02 2.71835311e+01 2.39637459e+02 2.71826203e+01 2.39636947e+02 2.71821651e+01 2.39637458e+02 2.71818914e+01 2.39638995e+02 2.71818903e+01 2.39639434e+02 2.71821633e+01 2.39625680e+02 2.71821725e+01 2.39626705e+02 2.71827186e+01 2.39628022e+02 2.71835377e+01 2.39628051e+02 2.71849044e+01 2.39628243e+02 2.71851776e+01 2.39629779e+02 2.71852069e+01 2.39630394e+02 2.71849028e+01 2.39630700e+02 2.71835360e+01 2.39629778e+02 2.71830810e+01 2.39628241e+02 2.71832642e+01 2.39627472e+02 2.71821714e+01 2.39626704e+02 2.71813909e+01 2.39625680e+02 2.71821725e+01 2.39605786e+02 2.71821835e+01 2.39605196e+02 2.71830380e+01 2.39603659e+02 2.71823948e+01 2.39602891e+02 2.71821849e+01 2.39603659e+02 2.71817941e+01 2.39605195e+02 2.71817283e+01 2.39605786e+02 2.71821835e+01 2.39580614e+02 2.71821934e+01 2.39580614e+02 2.71821934e+01 2.39580614e+02 2.71821934e+01 2.39580614e+02 2.71821934e+01 2.39580614e+02 2.71821934e+01 2.39573701e+02 2.71821954e+01 2.39572933e+02 2.71829548e+01 2.39572079e+02 2.71821958e+01 2.39572932e+02 2.71814363e+01 2.39573701e+02 2.71821954e+01 2.39636436e+02 2.71835321e+01 2.39635924e+02 2.71839880e+01 2.39634388e+02 2.71844446e+01 2.39634080e+02 2.71835337e+01 2.39634387e+02 2.71829868e+01 2.39635923e+02 2.71830769e+01 2.39636436e+02 2.71835321e+01 2.39589449e+02 2.71835571e+01 2.39588297e+02 2.71843776e+01 2.39587877e+02 2.71835577e+01 2.39588296e+02 2.71832647e+01 2.39589449e+02 2.71835571e+01 2.39607598e+02 2.71849160e+01 2.39606734e+02 2.71859414e+01 2.39606105e+02 2.71849167e+01 2.39606733e+02 2.71842331e+01 2.39607598e+02 2.71849160e+01 2.39587273e+02 2.71849246e+01 2.39586761e+02 2.71853803e+01 2.39585225e+02 2.71856086e+01 2.39584526e+02 2.71849255e+01 2.39585224e+02 2.71837864e+01 2.39586761e+02 2.71847729e+01 2.39587273e+02 2.71849246e+01 2.39582664e+02 2.71849261e+01 2.39582152e+02 2.71853363e+01 2.39580615e+02 2.71856627e+01 2.39579983e+02 2.71849270e+01 2.39580615e+02 2.71842890e+01 2.39582151e+02 2.71844138e+01 2.39582664e+02 2.71849261e+01 2.39643992e+02 2.71862599e+01 2.39643608e+02 2.71868069e+01 2.39642840e+02 2.71862608e+01 2.39643608e+02 2.71859185e+01 2.39643992e+02 2.71862599e+01 2.39623464e+02 2.71862739e+01 2.39622099e+02 2.71871858e+01 2.39620870e+02 2.71876421e+01 2.39622100e+02 2.71879291e+01 2.39623102e+02 2.71890074e+01 2.39623126e+02 2.71903741e+01 2.39623638e+02 2.71910571e+01 2.39625175e+02 2.71908698e+01 2.39625789e+02 2.71903724e+01 2.39625174e+02 2.71892795e+01 2.39625003e+02 2.71890063e+01 2.39623636e+02 2.71880960e+01 2.39622868e+02 2.71876409e+01 2.39623635e+02 2.71865471e+01 2.39624147e+02 2.71862735e+01 2.39623634e+02 2.71855905e+01 2.39623464e+02 2.71862739e+01 2.39576775e+02 2.71862945e+01 2.39576007e+02 2.71872709e+01 2.39575308e+02 2.71862949e+01 2.39576006e+02 2.71856735e+01 2.39576775e+02 2.71862945e+01 2.39573446e+02 2.71862954e+01 2.39572934e+02 2.71867056e+01 2.39572579e+02 2.71862956e+01 2.39572934e+02 2.71857831e+01 2.39573446e+02 2.71862954e+01 2.39648603e+02 2.71876230e+01 2.39648219e+02 2.71884043e+01 2.39647877e+02 2.71876236e+01 2.39648218e+02 2.71873196e+01 2.39648603e+02 2.71876230e+01 2.39642073e+02 2.71876280e+01 2.39642073e+02 2.71876280e+01 2.39642073e+02 2.71876280e+01 2.39642073e+02 2.71876280e+01 2.39642073e+02 2.71876280e+01 2.39599821e+02 2.71876529e+01 2.39599054e+02 2.71887922e+01 2.39597773e+02 2.71876538e+01 2.39599053e+02 2.71870838e+01 2.39599821e+02 2.71876529e+01 2.39652947e+02 2.71889862e+01 2.39652829e+02 2.71890839e+01 2.39652727e+02 2.71889864e+01 2.39652829e+02 2.71889009e+01 2.39652947e+02 2.71889862e+01 2.39614248e+02 2.71890125e+01 2.39614419e+02 2.71903791e+01 2.39614572e+02 2.71890123e+01 2.39614418e+02 2.71886708e+01 2.39614248e+02 2.71890125e+01 2.39585885e+02 2.71890251e+01 2.39586763e+02 2.71903914e+01 2.39587377e+02 2.71890245e+01 2.39586762e+02 2.71886343e+01 2.39585885e+02 2.71890251e+01 2.39577544e+02 2.71890277e+01 2.39577544e+02 2.71890277e+01 2.39577544e+02 2.71890277e+01 2.39577544e+02 2.71890277e+01 2.39577544e+02 2.71890277e+01 2.39641307e+02 2.71903619e+01 2.39640540e+02 2.71913875e+01 2.39639004e+02 2.71917302e+01 2.39639004e+02 2.71917302e+01 2.39639004e+02 2.71917302e+01 2.39638234e+02 2.71903641e+01 2.39639002e+02 2.71896802e+01 2.39640538e+02 2.71899525e+01 2.39641307e+02 2.71903619e+01 2.39620181e+02 2.71903758e+01 2.39620566e+02 2.71910589e+01 2.39621077e+02 2.71903753e+01 2.39620565e+02 2.71902902e+01 2.39620181e+02 2.71903758e+01 2.39582154e+02 2.71903929e+01 2.39583691e+02 2.71913036e+01 2.39584458e+02 2.71903922e+01 2.39583690e+02 2.71900888e+01 2.39582154e+02 2.71903929e+01 2.39574471e+02 2.71903952e+01 2.39574471e+02 2.71903952e+01 2.39572935e+02 2.71903955e+01 2.39571399e+02 2.71913070e+01 2.39570886e+02 2.71903960e+01 2.39571398e+02 2.71898493e+01 2.39572935e+02 2.71903955e+01 2.39574471e+02 2.71903952e+01 2.39574471e+02 2.71903952e+01 2.39556034e+02 2.71903988e+01 2.39556034e+02 2.71903988e+01 2.39556034e+02 2.71903988e+01 2.39556034e+02 2.71903988e+01 2.39556034e+02 2.71903988e+01 2.39645867e+02 2.71917251e+01 2.39645150e+02 2.71924090e+01 2.39644253e+02 2.71917264e+01 2.39645149e+02 2.71911629e+01 2.39645867e+02 2.71917251e+01 2.39589222e+02 2.71917572e+01 2.39589398e+02 2.71931238e+01 2.39588814e+02 2.71944907e+01 2.39589838e+02 2.71948320e+01 2.39590145e+02 2.71944902e+01 2.39590221e+02 2.71931235e+01 2.39591373e+02 2.71923776e+01 2.39592910e+02 2.71917558e+01 2.39591373e+02 2.71911352e+01 2.39589836e+02 2.71914153e+01 2.39589222e+02 2.71917572e+01 2.39564058e+02 2.71917641e+01 2.39563717e+02 2.71919464e+01 2.39563278e+02 2.71917643e+01 2.39563717e+02 2.71914909e+01 2.39564058e+02 2.71917641e+01 2.39651856e+02 2.71930871e+01 2.39651297e+02 2.71935431e+01 2.39650272e+02 2.71930884e+01 2.39651296e+02 2.71927838e+01 2.39651856e+02 2.71930871e+01 2.39624562e+02 2.71931065e+01 2.39625177e+02 2.71934966e+01 2.39625484e+02 2.71931060e+01 2.39625176e+02 2.71928025e+01 2.39624562e+02 2.71931065e+01 2.39570785e+02 2.71944961e+01 2.39569863e+02 2.71951270e+01 2.39568519e+02 2.71958632e+01 2.39569305e+02 2.71972297e+01 2.39569864e+02 2.71985963e+01 2.39569864e+02 2.71985963e+01 2.39571401e+02 2.71991653e+01 2.39572499e+02 2.71985956e+01 2.39572937e+02 2.71980489e+01 2.39573859e+02 2.71972286e+01 2.39572937e+02 2.71967164e+01 2.39571401e+02 2.71968876e+01 2.39570691e+02 2.71958627e+01 2.39571400e+02 2.71950426e+01 2.39572083e+02 2.71944957e+01 2.39571399e+02 2.71931292e+01 2.39570785e+02 2.71944961e+01 2.39562693e+02 2.71944977e+01 2.39562181e+02 2.71947711e+01 2.39561412e+02 2.71944979e+01 2.39562181e+02 2.71942566e+01 2.39562693e+02 2.71944977e+01 2.39640763e+02 2.71958289e+01 2.39640544e+02 2.71961708e+01 2.39639776e+02 2.71958297e+01 2.39640544e+02 2.71955558e+01 2.39640763e+02 2.71958289e+01 2.39625947e+02 2.71958390e+01 2.39626715e+02 2.71960338e+01 2.39627099e+02 2.71958383e+01 2.39626715e+02 2.71955652e+01 2.39625947e+02 2.71958390e+01 2.39621751e+02 2.71958416e+01 2.39622106e+02 2.71966613e+01 2.39623028e+02 2.71958408e+01 2.39622105e+02 2.71953289e+01 2.39621751e+02 2.71958416e+01 2.39584888e+02 2.71958587e+01 2.39585229e+02 2.71965419e+01 2.39585844e+02 2.71958584e+01 2.39585229e+02 2.71954681e+01 2.39584888e+02 2.71958587e+01 2.39575498e+02 2.71972282e+01 2.39576010e+02 2.71973523e+01 2.39576779e+02 2.71972279e+01 2.39576010e+02 2.71970003e+01 2.39575498e+02 2.71972282e+01 2.39659190e+02 2.71985476e+01 2.39658985e+02 2.71987186e+01 2.39658601e+02 2.71985481e+01 2.39658985e+02 2.71983656e+01 2.39659190e+02 2.71985476e+01 2.39655912e+02 2.71985504e+01 2.39655912e+02 2.71985504e+01 2.39654376e+02 2.71990072e+01 2.39653863e+02 2.71985521e+01 2.39654375e+02 2.71977317e+01 2.39655912e+02 2.71985504e+01 2.39655912e+02 2.71985504e+01 2.39631903e+02 2.71985685e+01 2.39632864e+02 2.71994220e+01 2.39634400e+02 2.71986387e+01 2.39634912e+02 2.71985664e+01 2.39634400e+02 2.71982251e+01 2.39632863e+02 2.71974289e+01 2.39631903e+02 2.71985685e+01 2.39626599e+02 2.71985719e+01 2.39626717e+02 2.71986961e+01 2.39626808e+02 2.71985718e+01 2.39626717e+02 2.71983766e+01 2.39626599e+02 2.71985719e+01 2.39560865e+02 2.71985980e+01 2.39560645e+02 2.71992814e+01 2.39560474e+02 2.71985981e+01 2.39560645e+02 2.71983247e+01 2.39560865e+02 2.71985980e+01 2.39639011e+02 2.71999302e+01 2.39639011e+02 2.71999302e+01 2.39639011e+02 2.71999302e+01 2.39639011e+02 2.71999302e+01 2.39639011e+02 2.71999302e+01 2.39589750e+02 2.71999570e+01 2.39589840e+02 2.72000329e+01 2.39589943e+02 2.71999569e+01 2.39589840e+02 2.71995014e+01 2.39589750e+02 2.71999570e+01 2.39557914e+02 2.71999651e+01 2.39557572e+02 2.72002385e+01 2.39557188e+02 2.71999652e+01 2.39557572e+02 2.71996919e+01 2.39557914e+02 2.71999651e+01 2.39652842e+02 2.72012863e+01 2.39652842e+02 2.72012863e+01 2.39652842e+02 2.72012863e+01 2.39652842e+02 2.72012863e+01 2.39652842e+02 2.72012863e+01 2.39633964e+02 2.72013004e+01 2.39632867e+02 2.72022773e+01 2.39632252e+02 2.72026682e+01 2.39631331e+02 2.72034888e+01 2.39630819e+02 2.72040358e+01 2.39631332e+02 2.72044911e+01 2.39631890e+02 2.72040351e+01 2.39632868e+02 2.72031648e+01 2.39633635e+02 2.72026673e+01 2.39634403e+02 2.72019834e+01 2.39635171e+02 2.72012996e+01 2.39634402e+02 2.72010516e+01 2.39633964e+02 2.72013004e+01 2.39629665e+02 2.72013033e+01 2.39629793e+02 2.72014740e+01 2.39630177e+02 2.72013029e+01 2.39629793e+02 2.72011513e+01 2.39629665e+02 2.72013033e+01 2.39572554e+02 2.72013290e+01 2.39572939e+02 2.72017389e+01 2.39574091e+02 2.72013286e+01 2.39572938e+02 2.72007431e+01 2.39572554e+02 2.72013290e+01 2.39569646e+02 2.72013296e+01 2.39569865e+02 2.72020129e+01 2.39570145e+02 2.72013295e+01 2.39569865e+02 2.72004185e+01 2.39569646e+02 2.72013296e+01 2.39554115e+02 2.72013323e+01 2.39552963e+02 2.72017424e+01 2.39552578e+02 2.72013325e+01 2.39552962e+02 2.72005124e+01 2.39554115e+02 2.72013323e+01 2.39646697e+02 2.72026578e+01 2.39646697e+02 2.72026578e+01 2.39646697e+02 2.72026578e+01 2.39646697e+02 2.72026578e+01 2.39646697e+02 2.72026578e+01 2.39620501e+02 2.72026756e+01 2.39620574e+02 2.72027377e+01 2.39620766e+02 2.72026755e+01 2.39620574e+02 2.72026162e+01 2.39620501e+02 2.72026756e+01 2.39662406e+02 2.72040114e+01 2.39662065e+02 2.72043154e+01 2.39661625e+02 2.72040121e+01 2.39662064e+02 2.72035562e+01 2.39662406e+02 2.72040114e+01 2.39656175e+02 2.72053835e+01 2.39655920e+02 2.72064087e+01 2.39655631e+02 2.72053839e+01 2.39655919e+02 2.72051679e+01 2.39656175e+02 2.72053835e+01 2.39647469e+02 2.72067572e+01 2.39646701e+02 2.72068629e+01 2.39646530e+02 2.72067579e+01 2.39646701e+02 2.72066335e+01 2.39647469e+02 2.72067572e+01 2.39642571e+02 2.72067609e+01 2.39642092e+02 2.72077375e+01 2.39640993e+02 2.72067621e+01 2.39642090e+02 2.72061401e+01 2.39642571e+02 2.72067609e+01 2.39628920e+02 2.72081371e+01 2.39629799e+02 2.72086335e+01 2.39630237e+02 2.72081362e+01 2.39629798e+02 2.72073556e+01 2.39628920e+02 2.72081371e+01 2.39665298e+02 2.72094755e+01 2.39665144e+02 2.72095999e+01 2.39665004e+02 2.72094758e+01 2.39665144e+02 2.72093390e+01 2.39665298e+02 2.72094755e+01 2.39648411e+02 2.72094898e+01 2.39648240e+02 2.72096418e+01 2.39647984e+02 2.72094901e+01 2.39648240e+02 2.72091483e+01 2.39648411e+02 2.72094898e+01 2.39547256e+02 2.72095329e+01 2.39546817e+02 2.72098063e+01 2.39546510e+02 2.72095330e+01 2.39546817e+02 2.72089863e+01 2.39547256e+02 2.72095329e+01 2.39650461e+02 2.72108548e+01 2.39649780e+02 2.72122220e+01 2.39649780e+02 2.72122220e+01 2.39649780e+02 2.72122220e+01 2.39649266e+02 2.72108558e+01 2.39649778e+02 2.72103998e+01 2.39650461e+02 2.72108548e+01 2.39638509e+02 2.72108639e+01 2.39637656e+02 2.72122311e+01 2.39637486e+02 2.72124590e+01 2.39637229e+02 2.72122314e+01 2.39636870e+02 2.72108650e+01 2.39637484e+02 2.72099535e+01 2.39638509e+02 2.72108639e+01 2.39563625e+02 2.72108975e+01 2.39563721e+02 2.72110683e+01 2.39563839e+02 2.72108975e+01 2.39563721e+02 2.72105558e+01 2.39563625e+02 2.72108975e+01 2.39558855e+02 2.72108983e+01 2.39559111e+02 2.72112020e+01 2.39560648e+02 2.72108980e+01 2.39559111e+02 2.72105078e+01 2.39558855e+02 2.72108983e+01 2.39645938e+02 2.72122250e+01 2.39645390e+02 2.72135921e+01 2.39645171e+02 2.72137289e+01 2.39643634e+02 2.72136846e+01 2.39643463e+02 2.72135936e+01 2.39643634e+02 2.72133982e+01 2.39644401e+02 2.72122262e+01 2.39645168e+02 2.72113145e+01 2.39645938e+02 2.72122250e+01 2.39640048e+02 2.72135961e+01 2.39639024e+02 2.72138702e+01 2.39638585e+02 2.72135971e+01 2.39639023e+02 2.72133235e+01 2.39640048e+02 2.72135961e+01 2.39554117e+02 2.72136323e+01 2.39553989e+02 2.72149990e+01 2.39552965e+02 2.72161380e+01 2.39552728e+02 2.72163658e+01 2.39552965e+02 2.72169124e+01 2.39554117e+02 2.72177323e+01 2.39554502e+02 2.72178042e+01 2.39554611e+02 2.72177322e+01 2.39554502e+02 2.72174589e+01 2.39553477e+02 2.72163657e+01 2.39554501e+02 2.72157582e+01 2.39555599e+02 2.72149988e+01 2.39554843e+02 2.72136322e+01 2.39554501e+02 2.72133589e+01 2.39554117e+02 2.72136323e+01 2.39542890e+02 2.72136331e+01 2.39542207e+02 2.72149998e+01 2.39542207e+02 2.72149998e+01 2.39542207e+02 2.72149998e+01 2.39541695e+02 2.72136332e+01 2.39542207e+02 2.72129498e+01 2.39542890e+02 2.72136331e+01 2.39633390e+02 2.72149674e+01 2.39634415e+02 2.72154637e+01 2.39634887e+02 2.72149664e+01 2.39634414e+02 2.72144201e+01 2.39633390e+02 2.72149674e+01 2.39627691e+02 2.72149712e+01 2.39628268e+02 2.72154264e+01 2.39629190e+02 2.72163369e+01 2.39629636e+02 2.72177033e+01 2.39629806e+02 2.72178274e+01 2.39629897e+02 2.72177031e+01 2.39630364e+02 2.72163361e+01 2.39629804e+02 2.72152432e+01 2.39629420e+02 2.72149701e+01 2.39628267e+02 2.72145153e+01 2.39627691e+02 2.72149712e+01 2.39648247e+02 2.72163232e+01 2.39648247e+02 2.72163232e+01 2.39648247e+02 2.72163232e+01 2.39648247e+02 2.72163232e+01 2.39648247e+02 2.72163232e+01 2.39547202e+02 2.72163662e+01 2.39548354e+02 2.72169519e+01 2.39548662e+02 2.72163661e+01 2.39548354e+02 2.72160245e+01 2.39547202e+02 2.72163662e+01 2.39539646e+02 2.72163666e+01 2.39539133e+02 2.72165488e+01 2.39538941e+02 2.72163666e+01 2.39539133e+02 2.72161388e+01 2.39539646e+02 2.72163666e+01 2.39643638e+02 2.72176934e+01 2.39643639e+02 2.72190601e+01 2.39643639e+02 2.72190601e+01 2.39642103e+02 2.72198300e+01 2.39640567e+02 2.72202924e+01 2.39639643e+02 2.72190630e+01 2.39640125e+02 2.72176960e+01 2.39640564e+02 2.72173741e+01 2.39642100e+02 2.72165557e+01 2.39643638e+02 2.72176934e+01 2.39643638e+02 2.72176934e+01 2.39650006e+02 2.72190552e+01 2.39649787e+02 2.72192262e+01 2.39649647e+02 2.72190555e+01 2.39649786e+02 2.72189414e+01 2.39650006e+02 2.72190552e+01 2.39551300e+02 2.72190992e+01 2.39551209e+02 2.72204659e+01 2.39551428e+02 2.72206367e+01 2.39551514e+02 2.72204659e+01 2.39551582e+02 2.72190992e+01 2.39551428e+02 2.72190138e+01 2.39551300e+02 2.72190992e+01 2.39540670e+02 2.72190999e+01 2.39540670e+02 2.72190999e+01 2.39539133e+02 2.72195099e+01 2.39538749e+02 2.72190999e+01 2.39539133e+02 2.72188436e+01 2.39540670e+02 2.72190999e+01 2.39540670e+02 2.72190999e+01 2.39641336e+02 2.72217951e+01 2.39640569e+02 2.72231624e+01 2.39642107e+02 2.72236168e+01 2.39642415e+02 2.72245277e+01 2.39642109e+02 2.72258946e+01 2.39642109e+02 2.72258946e+01 2.39642109e+02 2.72258946e+01 2.39640570e+02 2.72245290e+01 2.39640570e+02 2.72245290e+01 2.39640569e+02 2.72231624e+01 2.39639953e+02 2.72217961e+01 2.39640567e+02 2.72207024e+01 2.39641336e+02 2.72217951e+01 2.39626618e+02 2.72218052e+01 2.39626736e+02 2.72218810e+01 2.39626890e+02 2.72218050e+01 2.39626736e+02 2.72217140e+01 2.39626618e+02 2.72218052e+01 2.39540926e+02 2.72218332e+01 2.39540670e+02 2.72222888e+01 2.39540552e+02 2.72218332e+01 2.39540670e+02 2.72216054e+01 2.39540926e+02 2.72218332e+01 2.39536060e+02 2.72231999e+01 2.39536060e+02 2.72231999e+01 2.39536060e+02 2.72231999e+01 2.39536060e+02 2.72231999e+01 2.39536060e+02 2.72231999e+01 2.39537715e+02 2.72245666e+01 2.39537597e+02 2.72252499e+01 2.39537212e+02 2.72245666e+01 2.39537597e+02 2.72244147e+01 2.39537715e+02 2.72245666e+01 2.39639035e+02 2.72258968e+01 2.39640294e+02 2.72272626e+01 2.39639037e+02 2.72282096e+01 2.39637500e+02 2.72279479e+01 2.39635963e+02 2.72282906e+01 2.39635420e+02 2.72272660e+01 2.39634616e+02 2.72258999e+01 2.39635960e+02 2.72251018e+01 2.39636729e+02 2.72258984e+01 2.39637499e+02 2.72270937e+01 2.39639035e+02 2.72258968e+01 2.39639035e+02 2.72258968e+01 2.39639035e+02 2.72258968e+01 2.39628158e+02 2.72259042e+01 2.39628276e+02 2.72260017e+01 2.39629814e+02 2.72266841e+01 2.39630428e+02 2.72259027e+01 2.39629813e+02 2.72254826e+01 2.39628276e+02 2.72258237e+01 2.39628158e+02 2.72259042e+01 2.39540670e+02 2.72272999e+01 2.39542207e+02 2.72274241e+01 2.39542347e+02 2.72272998e+01 2.39542207e+02 2.72259332e+01 2.39540670e+02 2.72272999e+01 2.39535291e+02 2.72300332e+01 2.39534522e+02 2.72306189e+01 2.39533600e+02 2.72300332e+01 2.39534523e+02 2.72294475e+01 2.39535291e+02 2.72300332e+01 2.39533644e+02 2.72313998e+01 2.39532985e+02 2.72322198e+01 2.39532063e+02 2.72313998e+01 2.39532985e+02 2.72305798e+01 2.39533644e+02 2.72313998e+01 2.39530219e+02 2.72313997e+01 2.39529911e+02 2.72316274e+01 2.39529692e+02 2.72313997e+01 2.39529911e+02 2.72312945e+01 2.39530219e+02 2.72313997e+01 2.39659119e+02 2.72327142e+01 2.39659023e+02 2.72328054e+01 2.39658937e+02 2.72327144e+01 2.39659022e+02 2.72326232e+01 2.39659119e+02 2.72327142e+01 2.39641092e+02 2.72340953e+01 2.39640579e+02 2.72342665e+01 2.39640440e+02 2.72340958e+01 2.39640579e+02 2.72339714e+01 2.39641092e+02 2.72340953e+01 2.39532985e+02 2.72341331e+01 2.39532985e+02 2.72341331e+01 2.39532985e+02 2.72341331e+01 2.39532985e+02 2.72341331e+01 2.39532985e+02 2.72341331e+01 2.39646399e+02 2.72354580e+01 2.39645192e+02 2.72361422e+01 2.39644387e+02 2.72354595e+01 2.39645191e+02 2.72346677e+01 2.39646399e+02 2.72354580e+01 2.39639602e+02 2.72354630e+01 2.39639044e+02 2.72360101e+01 2.39638485e+02 2.72354638e+01 2.39639043e+02 2.72350730e+01 2.39639602e+02 2.72354630e+01 2.39630799e+02 2.72354691e+01 2.39629822e+02 2.72365327e+01 2.39628745e+02 2.72354705e+01 2.39629820e+02 2.72344068e+01 2.39630799e+02 2.72354691e+01 2.39532217e+02 2.72354998e+01 2.39532302e+02 2.72368664e+01 2.39531448e+02 2.72377206e+01 2.39530936e+02 2.72368664e+01 2.39531256e+02 2.72354997e+01 2.39531448e+02 2.72353045e+01 2.39532217e+02 2.72354998e+01 2.39637508e+02 2.72368312e+01 2.39637508e+02 2.72368312e+01 2.39637508e+02 2.72368312e+01 2.39637508e+02 2.72368312e+01 2.39637508e+02 2.72368312e+01 2.39635202e+02 2.72368328e+01 2.39635971e+02 2.72374631e+01 2.39636740e+02 2.72381984e+01 2.39635972e+02 2.72389962e+01 2.39634435e+02 2.72387125e+01 2.39633666e+02 2.72382005e+01 2.39632897e+02 2.72370829e+01 2.39631360e+02 2.72382021e+01 2.39631362e+02 2.72395688e+01 2.39631362e+02 2.72395688e+01 2.39631362e+02 2.72395688e+01 2.39631360e+02 2.72382021e+01 2.39630437e+02 2.72368360e+01 2.39631359e+02 2.72362497e+01 2.39632896e+02 2.72365859e+01 2.39634433e+02 2.72358084e+01 2.39635202e+02 2.72368328e+01 2.39628285e+02 2.72368374e+01 2.39628285e+02 2.72368374e+01 2.39628285e+02 2.72368374e+01 2.39628285e+02 2.72368374e+01 2.39628285e+02 2.72368374e+01 2.39627460e+02 2.72395713e+01 2.39627674e+02 2.72409378e+01 2.39626752e+02 2.72413484e+01 2.39625215e+02 2.72418855e+01 2.39624226e+02 2.72409400e+01 2.39625213e+02 2.72398212e+01 2.39625597e+02 2.72395725e+01 2.39626749e+02 2.72384003e+01 2.39627460e+02 2.72395713e+01 2.39643660e+02 2.72409267e+01 2.39643660e+02 2.72409267e+01 2.39643660e+02 2.72409267e+01 2.39643660e+02 2.72409267e+01 2.39643660e+02 2.72409267e+01 2.39636358e+02 2.72409320e+01 2.39635975e+02 2.72415180e+01 2.39635619e+02 2.72409325e+01 2.39635974e+02 2.72404198e+01 2.39636358e+02 2.72409320e+01 2.39632900e+02 2.72409344e+01 2.39632900e+02 2.72409344e+01 2.39632900e+02 2.72409344e+01 2.39632900e+02 2.72409344e+01 2.39632900e+02 2.72409344e+01 2.39618628e+02 2.72436766e+01 2.39619068e+02 2.72443597e+01 2.39619836e+02 2.72436759e+01 2.39619067e+02 2.72433347e+01 2.39618628e+02 2.72436766e+01 2.39636096e+02 2.72450322e+01 2.39635978e+02 2.72451689e+01 2.39635807e+02 2.72450324e+01 2.39635978e+02 2.72449080e+01 2.39636096e+02 2.72450322e+01 2.39630025e+02 2.72491363e+01 2.39629832e+02 2.72492731e+01 2.39629525e+02 2.72491366e+01 2.39629832e+02 2.72489412e+01 2.39630025e+02 2.72491363e+01 2.39614350e+02 2.72491457e+01 2.39614460e+02 2.72494190e+01 2.39614716e+02 2.72491455e+01 2.39614460e+02 2.72490405e+01 2.39614350e+02 2.72491457e+01 2.39532677e+02 2.72491665e+01 2.39532985e+02 2.72492641e+01 2.39533087e+02 2.72491665e+01 2.39532985e+02 2.72487109e+01 2.39532677e+02 2.72491665e+01 2.39620610e+02 2.72505088e+01 2.39620610e+02 2.72505088e+01 2.39620610e+02 2.72505088e+01 2.39620610e+02 2.72505088e+01 2.39620610e+02 2.72505088e+01 2.39528373e+02 2.72505329e+01 2.39528373e+02 2.72505329e+01 2.39528373e+02 2.72505329e+01 2.39528373e+02 2.72505329e+01 2.39528373e+02 2.72505329e+01 2.39609465e+02 2.72518816e+01 2.39609543e+02 2.72532482e+01 2.39609851e+02 2.72534189e+01 2.39611388e+02 2.72540160e+01 2.39612926e+02 2.72539298e+01 2.39613517e+02 2.72532462e+01 2.39612925e+02 2.72526770e+01 2.39611388e+02 2.72526882e+01 2.39610335e+02 2.72518812e+01 2.39609849e+02 2.72512957e+01 2.39609465e+02 2.72518816e+01 2.39538804e+02 2.72518999e+01 2.39539134e+02 2.72520951e+01 2.39539326e+02 2.72518999e+01 2.39539134e+02 2.72516070e+01 2.39538804e+02 2.72518999e+01 2.39619076e+02 2.72546097e+01 2.39619076e+02 2.72546097e+01 2.39619076e+02 2.72546097e+01 2.39619076e+02 2.72546097e+01 2.39619076e+02 2.72546097e+01 2.39616222e+02 2.72573447e+01 2.39616003e+02 2.72576865e+01 2.39615490e+02 2.72573451e+01 2.39616003e+02 2.72571929e+01 2.39616222e+02 2.72573447e+01 2.39533599e+02 2.72573665e+01 2.39532984e+02 2.72576149e+01 2.39532677e+02 2.72573665e+01 2.39532984e+02 2.72568198e+01 2.39533599e+02 2.72573665e+01 2.39623998e+02 2.72587068e+01 2.39623691e+02 2.72593903e+01 2.39623435e+02 2.72587071e+01 2.39623691e+02 2.72584792e+01 2.39623998e+02 2.72587068e+01 2.39614586e+02 2.72600789e+01 2.39614467e+02 2.72602156e+01 2.39614357e+02 2.72600790e+01 2.39614467e+02 2.72598056e+01 2.39614586e+02 2.72600789e+01 2.39611878e+02 2.72600804e+01 2.39611393e+02 2.72605931e+01 2.39610973e+02 2.72600808e+01 2.39611392e+02 2.72593973e+01 2.39611878e+02 2.72600804e+01 2.39600118e+02 2.72600861e+01 2.39600631e+02 2.72602811e+01 2.39601399e+02 2.72600855e+01 2.39600630e+02 2.72598906e+01 2.39600118e+02 2.72600861e+01 2.39604093e+02 2.72655509e+01 2.39603709e+02 2.72657613e+01 2.39603367e+02 2.72655512e+01 2.39603708e+02 2.72652094e+01 2.39604093e+02 2.72655509e+01 2.39538942e+02 2.72655665e+01 2.39539134e+02 2.72657184e+01 2.39539219e+02 2.72655665e+01 2.39539134e+02 2.72653388e+01 2.39538942e+02 2.72655665e+01 2.39602300e+02 2.72669184e+01 2.39602172e+02 2.72670551e+01 2.39601659e+02 2.72669187e+01 2.39602172e+02 2.72667476e+01 2.39602300e+02 2.72669184e+01 2.39606786e+02 2.72696496e+01 2.39606786e+02 2.72696496e+01 2.39606786e+02 2.72696496e+01 2.39606786e+02 2.72696496e+01 2.39606786e+02 2.72696496e+01 2.39599406e+02 2.72696530e+01 2.39599099e+02 2.72698809e+01 2.39598757e+02 2.72696533e+01 2.39599098e+02 2.72693798e+01 2.39599406e+02 2.72696530e+01 2.39575337e+02 2.72710282e+01 2.39576036e+02 2.72717873e+01 2.39576676e+02 2.72710278e+01 2.39576036e+02 2.72707924e+01 2.39575337e+02 2.72710282e+01 2.39540951e+02 2.72710332e+01 2.39540672e+02 2.72717165e+01 2.39540287e+02 2.72710332e+01 2.39540672e+02 2.72705776e+01 2.39540951e+02 2.72710332e+01 2.39557201e+02 2.72751319e+01 2.39556048e+02 2.72755225e+01 2.39554510e+02 2.72755422e+01 2.39553588e+02 2.72751323e+01 2.39554510e+02 2.72744489e+01 2.39556048e+02 2.72742209e+01 2.39557201e+02 2.72751319e+01 2.39566922e+02 2.72764969e+01 2.39566812e+02 2.72767702e+01 2.39566427e+02 2.72764970e+01 2.39566812e+02 2.72758135e+01 2.39566922e+02 2.72764969e+01 2.39556048e+02 2.72778654e+01 2.39556048e+02 2.72778654e+01 2.39556048e+02 2.72778654e+01 2.39556048e+02 2.72778654e+01 2.39556048e+02 2.72778654e+01 2.39569888e+02 2.72792295e+01 2.39569888e+02 2.72792295e+01 2.39569888e+02 2.72792295e+01 2.39569888e+02 2.72792295e+01 2.39569888e+02 2.72792295e+01 2.39560662e+02 2.72792313e+01 2.39560662e+02 2.72792313e+01 2.39560662e+02 2.72792313e+01 2.39560662e+02 2.72792313e+01 2.39560662e+02 2.72792313e+01 2.39489611e+02 2.72819583e+01 2.39488389e+02 2.72830148e+01 2.39487260e+02 2.72819575e+01 2.39488390e+02 2.72808570e+01 2.39489611e+02 2.72819583e+01 2.39626785e+02 2.72833050e+01 2.39626785e+02 2.72833050e+01 2.39626785e+02 2.72833050e+01 2.39626785e+02 2.72833050e+01 2.39626785e+02 2.72833050e+01 2.39625922e+02 2.72860389e+01 2.39625724e+02 2.72874057e+01 2.39625951e+02 2.72887722e+01 2.39625252e+02 2.72893939e+01 2.39623715e+02 2.72901243e+01 2.39623386e+02 2.72901405e+01 2.39622178e+02 2.72908571e+01 2.39620640e+02 2.72904350e+01 2.39619486e+02 2.72901428e+01 2.39619452e+02 2.72887761e+01 2.39619110e+02 2.72874097e+01 2.39619958e+02 2.72860425e+01 2.39620636e+02 2.72853352e+01 2.39622173e+02 2.72846823e+01 2.39623711e+02 2.72847712e+01 2.39625249e+02 2.72854016e+01 2.39625922e+02 2.72860389e+01 2.39534521e+02 2.72860665e+01 2.39534521e+02 2.72860665e+01 2.39534521e+02 2.72860665e+01 2.39534521e+02 2.72860665e+01 2.39534521e+02 2.72860665e+01 2.39501864e+02 2.73010953e+01 2.39500684e+02 2.73020982e+01 2.39499519e+02 2.73010947e+01 2.39500685e+02 2.73000111e+01 2.39501864e+02 2.73010953e+01 2.39626355e+02 2.73161053e+01 2.39625274e+02 2.73170521e+01 2.39623735e+02 2.73165274e+01 2.39623262e+02 2.73161072e+01 2.39623735e+02 2.73156315e+01 2.39625273e+02 2.73150978e+01 2.39626355e+02 2.73161053e+01 2.39750705e+02 2.73187052e+01 2.39749873e+02 2.73195525e+01 2.39748335e+02 2.73194680e+01 2.39747537e+02 2.73187099e+01 2.39748331e+02 2.73175699e+01 2.39749870e+02 2.73180231e+01 2.39750705e+02 2.73187052e+01 2.39586900e+02 2.73338913e+01 2.39586826e+02 2.73339632e+01 2.39586756e+02 2.73338913e+01 2.39586826e+02 2.73338366e+01 2.39586900e+02 2.73338913e+01 2.39549220e+02 2.73352661e+01 2.39548366e+02 2.73362152e+01 2.39547581e+02 2.73352662e+01 2.39548365e+02 2.73344716e+01 2.39549220e+02 2.73352661e+01 2.39627405e+02 2.73366046e+01 2.39626828e+02 2.73370291e+01 2.39626395e+02 2.73366052e+01 2.39626828e+02 2.73361808e+01 2.39627405e+02 2.73366046e+01 2.39526093e+02 2.73379994e+01 2.39525288e+02 2.73390832e+01 2.39524465e+02 2.73379992e+01 2.39525288e+02 2.73373008e+01 2.39526093e+02 2.73379994e+01 2.39710932e+02 2.73488264e+01 2.39711135e+02 2.73501928e+01 2.39709928e+02 2.73509459e+01 2.39709121e+02 2.73501953e+01 2.39708532e+02 2.73488293e+01 2.39709923e+02 2.73479900e+01 2.39710932e+02 2.73488264e+01 2.39531515e+02 2.73516664e+01 2.39531442e+02 2.73517423e+01 2.39531368e+02 2.73516664e+01 2.39531442e+02 2.73515809e+01 2.39531515e+02 2.73516664e+01 2.39606797e+02 2.72040497e+01 2.39606745e+02 2.72040623e+01 2.39606736e+02 2.72040497e+01 2.39606745e+02 2.72040324e+01 2.39606797e+02 2.72040497e+01 2.39603697e+02 2.72054178e+01 2.39603673e+02 2.72054409e+01 2.39603647e+02 2.72054178e+01 2.39603673e+02 2.72053993e+01 2.39603697e+02 2.72054178e+01 2.39600768e+02 2.72067858e+01 2.39601024e+02 2.72081524e+01 2.39600925e+02 2.72095191e+01 2.39601306e+02 2.72108856e+01 2.39600603e+02 2.72111985e+01 2.39600056e+02 2.72108861e+01 2.39599066e+02 2.72100943e+01 2.39598076e+02 2.72108870e+01 2.39599067e+02 2.72122070e+01 2.39599095e+02 2.72122532e+01 2.39600604e+02 2.72127991e+01 2.39601477e+02 2.72122522e+01 2.39602140e+02 2.72113177e+01 2.39602771e+02 2.72122516e+01 2.39603678e+02 2.72134914e+01 2.39605214e+02 2.72133160e+01 2.39605384e+02 2.72136170e+01 2.39606752e+02 2.72145518e+01 2.39607803e+02 2.72149825e+01 2.39608290e+02 2.72158472e+01 2.39608773e+02 2.72163487e+01 2.39609827e+02 2.72172847e+01 2.39610394e+02 2.72163478e+01 2.39611363e+02 2.72154850e+01 2.39612764e+02 2.72163466e+01 2.39612900e+02 2.72164827e+01 2.39613455e+02 2.72177129e+01 2.39612902e+02 2.72189437e+01 2.39612657e+02 2.72190800e+01 2.39612320e+02 2.72204468e+01 2.39611367e+02 2.72210994e+01 2.39610307e+02 2.72204479e+01 2.39609829e+02 2.72196835e+01 2.39608292e+02 2.72200666e+01 2.39607285e+02 2.72190827e+01 2.39606754e+02 2.72177856e+01 2.39606598e+02 2.72177164e+01 2.39605217e+02 2.72173077e+01 2.39603680e+02 2.72171037e+01 2.39603468e+02 2.72177179e+01 2.39603680e+02 2.72180248e+01 2.39605217e+02 2.72178239e+01 2.39606521e+02 2.72190831e+01 2.39606755e+02 2.72192906e+01 2.39608113e+02 2.72204490e+01 2.39608293e+02 2.72207038e+01 2.39609830e+02 2.72209942e+01 2.39610417e+02 2.72218145e+01 2.39611368e+02 2.72227429e+01 2.39612904e+02 2.72220381e+01 2.39614441e+02 2.72224316e+01 2.39615588e+02 2.72231784e+01 2.39615032e+02 2.72245454e+01 2.39614443e+02 2.72255131e+01 2.39613698e+02 2.72245461e+01 2.39612905e+02 2.72239886e+01 2.39612113e+02 2.72245469e+01 2.39612906e+02 2.72251044e+01 2.39614119e+02 2.72259125e+01 2.39612907e+02 2.72269348e+01 2.39612416e+02 2.72272801e+01 2.39612371e+02 2.72286468e+01 2.39611806e+02 2.72300137e+01 2.39612520e+02 2.72313800e+01 2.39611374e+02 2.72321280e+01 2.39611067e+02 2.72327475e+01 2.39611375e+02 2.72335214e+01 2.39611723e+02 2.72341138e+01 2.39611930e+02 2.72354803e+01 2.39611377e+02 2.72363009e+01 2.39610324e+02 2.72368478e+01 2.39609840e+02 2.72373498e+01 2.39609417e+02 2.72368483e+01 2.39608303e+02 2.72366457e+01 2.39607996e+02 2.72368490e+01 2.39608303e+02 2.72373441e+01 2.39609424e+02 2.72382150e+01 2.39608775e+02 2.72395820e+01 2.39608675e+02 2.72409487e+01 2.39609690e+02 2.72423148e+01 2.39608307e+02 2.72432104e+01 2.39607140e+02 2.72436828e+01 2.39606802e+02 2.72450496e+01 2.39606771e+02 2.72451050e+01 2.39605234e+02 2.72462281e+01 2.39603697e+02 2.72458716e+01 2.39602404e+02 2.72450517e+01 2.39602159e+02 2.72449740e+01 2.39602112e+02 2.72450518e+01 2.39601170e+02 2.72464189e+01 2.39602161e+02 2.72475503e+01 2.39603697e+02 2.72467118e+01 2.39605235e+02 2.72476451e+01 2.39606773e+02 2.72477275e+01 2.39606790e+02 2.72477829e+01 2.39606773e+02 2.72477961e+01 2.39605235e+02 2.72478391e+01 2.39604669e+02 2.72491506e+01 2.39603699e+02 2.72497116e+01 2.39602298e+02 2.72491517e+01 2.39602161e+02 2.72486070e+01 2.39600624e+02 2.72489538e+01 2.39599087e+02 2.72484118e+01 2.39598809e+02 2.72491533e+01 2.39597954e+02 2.72505203e+01 2.39598781e+02 2.72518866e+01 2.39597860e+02 2.72532537e+01 2.39598050e+02 2.72546203e+01 2.39597674e+02 2.72559871e+01 2.39597554e+02 2.72561642e+01 2.39596989e+02 2.72559874e+01 2.39596261e+02 2.72546210e+01 2.39596015e+02 2.72545531e+01 2.39595840e+02 2.72546212e+01 2.39594478e+02 2.72550071e+01 2.39593130e+02 2.72559890e+01 2.39592942e+02 2.72562901e+01 2.39592634e+02 2.72559892e+01 2.39592289e+02 2.72546226e+01 2.39591403e+02 2.72532840e+01 2.39590749e+02 2.72546232e+01 2.39590789e+02 2.72559899e+01 2.39591152e+02 2.72573564e+01 2.39589868e+02 2.72583785e+01 2.39588330e+02 2.72584619e+01 2.39587295e+02 2.72573578e+01 2.39586792e+02 2.72568001e+01 2.39585907e+02 2.72573583e+01 2.39586407e+02 2.72587248e+01 2.39585256e+02 2.72598577e+01 2.39584921e+02 2.72600920e+01 2.39584291e+02 2.72614588e+01 2.39583720e+02 2.72618333e+01 2.39583104e+02 2.72614592e+01 2.39582182e+02 2.72608675e+01 2.39581326e+02 2.72614598e+01 2.39580645e+02 2.72626710e+01 2.39579108e+02 2.72623359e+01 2.39578492e+02 2.72614606e+01 2.39577570e+02 2.72610753e+01 2.39576319e+02 2.72600946e+01 2.39576032e+02 2.72599714e+01 2.39575745e+02 2.72600947e+01 2.39576032e+02 2.72604422e+01 2.39577002e+02 2.72614611e+01 2.39576302e+02 2.72628279e+01 2.39576033e+02 2.72637853e+01 2.39575757e+02 2.72641947e+01 2.39574496e+02 2.72652142e+01 2.39573795e+02 2.72641953e+01 2.39572958e+02 2.72629782e+01 2.39571421e+02 2.72640968e+01 2.39569883e+02 2.72640517e+01 2.39568346e+02 2.72630354e+01 2.39566808e+02 2.72641242e+01 2.39565443e+02 2.72628305e+01 2.39565424e+02 2.72614638e+01 2.39565270e+02 2.72612459e+01 2.39564964e+02 2.72614639e+01 2.39563733e+02 2.72620113e+01 2.39562748e+02 2.72614643e+01 2.39562195e+02 2.72611574e+01 2.39561003e+02 2.72600980e+01 2.39560658e+02 2.72598747e+01 2.39560312e+02 2.72600981e+01 2.39559120e+02 2.72608689e+01 2.39557583e+02 2.72606590e+01 2.39556629e+02 2.72614653e+01 2.39556046e+02 2.72621685e+01 2.39555039e+02 2.72614655e+01 2.39554508e+02 2.72611196e+01 2.39553183e+02 2.72600990e+01 2.39553065e+02 2.72587324e+01 2.39552970e+02 2.72586805e+01 2.39552889e+02 2.72587324e+01 2.39551433e+02 2.72593796e+01 2.39549896e+02 2.72591306e+01 2.39548358e+02 2.72587724e+01 2.39546821e+02 2.72588973e+01 2.39546705e+02 2.72587329e+01 2.39546821e+02 2.72586233e+01 2.39547785e+02 2.72573662e+01 2.39548341e+02 2.72559995e+01 2.39547811e+02 2.72546329e+01 2.39548050e+02 2.72532662e+01 2.39548358e+02 2.72530346e+01 2.39548911e+02 2.72518994e+01 2.39549484e+02 2.72505327e+01 2.39549895e+02 2.72502591e+01 2.39550623e+02 2.72491660e+01 2.39551432e+02 2.72480875e+01 2.39551797e+02 2.72477992e+01 2.39551432e+02 2.72474000e+01 2.39549894e+02 2.72465712e+01 2.39549583e+02 2.72464327e+01 2.39549221e+02 2.72450661e+01 2.39549849e+02 2.72436994e+01 2.39549894e+02 2.72436439e+01 2.39551431e+02 2.72436684e+01 2.39552558e+02 2.72423324e+01 2.39552864e+02 2.72409657e+01 2.39552463e+02 2.72395991e+01 2.39552101e+02 2.72382325e+01 2.39552968e+02 2.72378287e+01 2.39553497e+02 2.72382323e+01 2.39554505e+02 2.72388523e+01 2.39555152e+02 2.72382321e+01 2.39556042e+02 2.72370018e+01 2.39556226e+02 2.72368653e+01 2.39557579e+02 2.72356622e+01 2.39557751e+02 2.72354985e+01 2.39557753e+02 2.72341318e+01 2.39558500e+02 2.72327650e+01 2.39557578e+02 2.72320367e+01 2.39556991e+02 2.72313986e+01 2.39557578e+02 2.72310962e+01 2.39559115e+02 2.72309873e+01 2.39559731e+02 2.72313982e+01 2.39560652e+02 2.72315097e+01 2.39560726e+02 2.72313980e+01 2.39561266e+02 2.72300313e+01 2.39560651e+02 2.72288963e+01 2.39560409e+02 2.72286647e+01 2.39560651e+02 2.72284138e+01 2.39562157e+02 2.72272978e+01 2.39562188e+02 2.72272285e+01 2.39563725e+02 2.72265449e+01 2.39564031e+02 2.72259308e+01 2.39565261e+02 2.72253153e+01 2.39566798e+02 2.72246317e+01 2.39566851e+02 2.72245635e+01 2.39568335e+02 2.72234394e+01 2.39568655e+02 2.72231965e+01 2.39568334e+02 2.72218853e+01 2.39568316e+02 2.72218299e+01 2.39568334e+02 2.72218047e+01 2.39569207e+02 2.72204630e+01 2.39568763e+02 2.72190965e+01 2.39569870e+02 2.72186275e+01 2.39570792e+02 2.72177294e+01 2.39571406e+02 2.72166811e+01 2.39572944e+02 2.72173186e+01 2.39574480e+02 2.72164707e+01 2.39575364e+02 2.72177282e+01 2.39574669e+02 2.72190951e+01 2.39576018e+02 2.72196944e+01 2.39576753e+02 2.72190945e+01 2.39577323e+02 2.72177277e+01 2.39577554e+02 2.72174928e+01 2.39579090e+02 2.72164383e+01 2.39580627e+02 2.72167471e+01 2.39581373e+02 2.72163598e+01 2.39580627e+02 2.72150330e+01 2.39579090e+02 2.72162048e+01 2.39578031e+02 2.72149941e+01 2.39579090e+02 2.72142232e+01 2.39580627e+02 2.72149010e+01 2.39582163e+02 2.72138386e+01 2.39583393e+02 2.72149925e+01 2.39583700e+02 2.72153631e+01 2.39584089e+02 2.72149923e+01 2.39585237e+02 2.72143540e+01 2.39586773e+02 2.72138001e+01 2.39586857e+02 2.72136247e+01 2.39588310e+02 2.72124396e+01 2.39588593e+02 2.72122574e+01 2.39589846e+02 2.72115502e+01 2.39591016e+02 2.72108898e+01 2.39591382e+02 2.72105044e+01 2.39592116e+02 2.72108894e+01 2.39591883e+02 2.72122562e+01 2.39592920e+02 2.72130756e+01 2.39594302e+02 2.72122552e+01 2.39594456e+02 2.72114333e+01 2.39595993e+02 2.72113512e+01 2.39597082e+02 2.72108874e+01 2.39595992e+02 2.72101775e+01 2.39594456e+02 2.72107795e+01 2.39592919e+02 2.72104668e+01 2.39592165e+02 2.72095227e+01 2.39592918e+02 2.72083003e+01 2.39594455e+02 2.72088930e+01 2.39595992e+02 2.72089743e+01 2.39597499e+02 2.72081539e+01 2.39597528e+02 2.72081193e+01 2.39597632e+02 2.72081538e+01 2.39599065e+02 2.72086994e+01 2.39599924e+02 2.72081529e+01 2.39600138e+02 2.72067861e+01 2.39600600e+02 2.72065511e+01 2.39600768e+02 2.72067858e+01 2.39594877e+02 2.72067883e+01 2.39594454e+02 2.72070201e+01 2.39594337e+02 2.72067885e+01 2.39594454e+02 2.72067000e+01 2.39594877e+02 2.72067883e+01 2.39584118e+02 2.72067923e+01 2.39583697e+02 2.72071016e+01 2.39583316e+02 2.72067925e+01 2.39583697e+02 2.72065554e+01 2.39584118e+02 2.72067923e+01 2.39604221e+02 2.72081509e+01 2.39603983e+02 2.72095177e+01 2.39603676e+02 2.72097753e+01 2.39603416e+02 2.72095179e+01 2.39603128e+02 2.72081514e+01 2.39603674e+02 2.72078593e+01 2.39604221e+02 2.72081509e+01 2.39611974e+02 2.72095137e+01 2.39611359e+02 2.72100611e+01 2.39611069e+02 2.72095142e+01 2.39611359e+02 2.72091773e+01 2.39611974e+02 2.72095137e+01 2.39605787e+02 2.72108835e+01 2.39605213e+02 2.72116896e+01 2.39604524e+02 2.72108841e+01 2.39605213e+02 2.72102458e+01 2.39605787e+02 2.72108835e+01 2.39582800e+02 2.72108927e+01 2.39582162e+02 2.72116220e+01 2.39581445e+02 2.72108931e+01 2.39582162e+02 2.72103259e+01 2.39582800e+02 2.72108927e+01 2.39614937e+02 2.72122454e+01 2.39614435e+02 2.72132301e+01 2.39613783e+02 2.72122461e+01 2.39614434e+02 2.72114254e+01 2.39614937e+02 2.72122454e+01 2.39613002e+02 2.72136131e+01 2.39612898e+02 2.72136363e+01 2.39611362e+02 2.72145436e+01 2.39610578e+02 2.72136144e+01 2.39611361e+02 2.72130976e+01 2.39612898e+02 2.72135855e+01 2.39613002e+02 2.72136131e+01 2.39571645e+02 2.72136292e+01 2.39571406e+02 2.72141079e+01 2.39570818e+02 2.72136294e+01 2.39571406e+02 2.72133899e+01 2.39571645e+02 2.72136292e+01 2.39610692e+02 2.72149810e+01 2.39609826e+02 2.72157521e+01 2.39608873e+02 2.72149819e+01 2.39609825e+02 2.72144516e+01 2.39610692e+02 2.72149810e+01 2.39603504e+02 2.72149846e+01 2.39603679e+02 2.72153477e+01 2.39603924e+02 2.72149844e+01 2.39603678e+02 2.72144397e+01 2.39603504e+02 2.72149846e+01 2.39576693e+02 2.72149945e+01 2.39576744e+02 2.72163612e+01 2.39576017e+02 2.72169539e+01 2.39574684e+02 2.72163617e+01 2.39575533e+02 2.72149948e+01 2.39576016e+02 2.72148442e+01 2.39576693e+02 2.72149945e+01 2.39617388e+02 2.72163441e+01 2.39615975e+02 2.72171833e+01 2.39615090e+02 2.72163453e+01 2.39615974e+02 2.72158611e+01 2.39617388e+02 2.72163441e+01 2.39614748e+02 2.72204455e+01 2.39614440e+02 2.72206512e+01 2.39614070e+02 2.72204459e+01 2.39614440e+02 2.72203283e+01 2.39614748e+02 2.72204455e+01 2.39564205e+02 2.72204641e+01 2.39563723e+02 2.72211673e+01 2.39563354e+02 2.72204642e+01 2.39563723e+02 2.72200540e+01 2.39564205e+02 2.72204641e+01 2.39616705e+02 2.72218111e+01 2.39615978e+02 2.72227003e+01 2.39615311e+02 2.72218119e+01 2.39615977e+02 2.72211005e+01 2.39616705e+02 2.72218111e+01 2.39562774e+02 2.72218310e+01 2.39562187e+02 2.72229799e+01 2.39561110e+02 2.72218313e+01 2.39562187e+02 2.72216184e+01 2.39562774e+02 2.72218310e+01 2.39617776e+02 2.72231772e+01 2.39617516e+02 2.72233278e+01 2.39616839e+02 2.72231777e+01 2.39617515e+02 2.72228010e+01 2.39617776e+02 2.72231772e+01 2.39566703e+02 2.72231969e+01 2.39565261e+02 2.72239914e+01 2.39563724e+02 2.72238228e+01 2.39562493e+02 2.72231977e+01 2.39563724e+02 2.72227598e+01 2.39565261e+02 2.72224392e+01 2.39566703e+02 2.72231969e+01 2.39560729e+02 2.72259313e+01 2.39560651e+02 2.72259591e+01 2.39560622e+02 2.72259314e+01 2.39560651e+02 2.72259168e+01 2.39560729e+02 2.72259313e+01 2.39556611e+02 2.72272986e+01 2.39556040e+02 2.72278912e+01 2.39554503e+02 2.72275116e+01 2.39554099e+02 2.72272989e+01 2.39554503e+02 2.72270780e+01 2.39556040e+02 2.72269245e+01 2.39556611e+02 2.72272986e+01 2.39614815e+02 2.72286455e+01 2.39614446e+02 2.72289744e+01 2.39613983e+02 2.72286459e+01 2.39614446e+02 2.72285674e+01 2.39614815e+02 2.72286455e+01 2.39563145e+02 2.72286643e+01 2.39563725e+02 2.72290357e+01 2.39564062e+02 2.72286641e+01 2.39563725e+02 2.72276320e+01 2.39563145e+02 2.72286643e+01 2.39558290e+02 2.72286651e+01 2.39557577e+02 2.72292229e+01 2.39556655e+02 2.72286653e+01 2.39557577e+02 2.72279313e+01 2.39558290e+02 2.72286651e+01 2.39554735e+02 2.72341322e+01 2.39554504e+02 2.72342817e+01 2.39554407e+02 2.72341322e+01 2.39554504e+02 2.72340226e+01 2.39554735e+02 2.72341322e+01 2.39557327e+02 2.72354985e+01 2.39556042e+02 2.72366421e+01 2.39555297e+02 2.72354988e+01 2.39556041e+02 2.72347126e+01 2.39557327e+02 2.72354985e+01 2.39555765e+02 2.72368654e+01 2.39554505e+02 2.72374261e+01 2.39553956e+02 2.72368656e+01 2.39554504e+02 2.72362427e+01 2.39555765e+02 2.72368654e+01 2.39605048e+02 2.72423171e+01 2.39604542e+02 2.72436840e+01 2.39605233e+02 2.72438726e+01 2.39606154e+02 2.72436833e+01 2.39605785e+02 2.72423168e+01 2.39605232e+02 2.72422054e+01 2.39605048e+02 2.72423171e+01 2.39545590e+02 2.72450663e+01 2.39545283e+02 2.72453399e+01 2.39544975e+02 2.72450664e+01 2.39545283e+02 2.72448166e+01 2.39545590e+02 2.72450663e+01 2.39600793e+02 2.72505191e+01 2.39600625e+02 2.72506219e+01 2.39600483e+02 2.72505192e+01 2.39600625e+02 2.72502452e+01 2.39600793e+02 2.72505191e+01 2.39551537e+02 2.72559992e+01 2.39552970e+02 2.72561653e+01 2.39553113e+02 2.72559990e+01 2.39552970e+02 2.72557260e+01 2.39551537e+02 2.72559992e+01 2.39548410e+02 2.72559995e+01 2.39549199e+02 2.72573661e+01 2.39549896e+02 2.72582950e+01 2.39550699e+02 2.72573659e+01 2.39551381e+02 2.72559992e+01 2.39549895e+02 2.72555333e+01 2.39548410e+02 2.72559995e+01 2.39565188e+02 2.72587305e+01 2.39565270e+02 2.72589484e+01 2.39566807e+02 2.72589192e+01 2.39567268e+02 2.72587301e+01 2.39566807e+02 2.72586132e+01 2.39565270e+02 2.72586624e+01 2.39565188e+02 2.72587305e+01 2.39544146e+02 2.72587331e+01 2.39543746e+02 2.72592071e+01 2.39543450e+02 2.72587331e+01 2.39543746e+02 2.72584487e+01 2.39544146e+02 2.72587331e+01 2.39588566e+02 2.72600907e+01 2.39588331e+02 2.72604275e+01 2.39586794e+02 2.72603411e+01 2.39586076e+02 2.72600916e+01 2.39586794e+02 2.72596127e+01 2.39588331e+02 2.72595436e+01 2.39588566e+02 2.72600907e+01 2.39554119e+02 2.72614656e+01 2.39552971e+02 2.72625593e+01 2.39552433e+02 2.72614658e+01 2.39552971e+02 2.72602880e+01 2.39554119e+02 2.72614656e+01 2.39546883e+02 2.72614662e+01 2.39546821e+02 2.72614876e+01 2.39546799e+02 2.72614663e+01 2.39546821e+02 2.72614355e+01 2.39546883e+02 2.72614662e+01 2.39586864e+02 2.72628246e+01 2.39586795e+02 2.72629511e+01 2.39586679e+02 2.72628247e+01 2.39586795e+02 2.72627425e+01 2.39586864e+02 2.72628246e+01 2.39562811e+02 2.72628310e+01 2.39562196e+02 2.72629932e+01 2.39560965e+02 2.72628313e+01 2.39562196e+02 2.72619557e+01 2.39562811e+02 2.72628310e+01 2.39555496e+02 2.72628321e+01 2.39554509e+02 2.72640234e+01 2.39553258e+02 2.72628324e+01 2.39554508e+02 2.72617899e+01 2.39555496e+02 2.72628321e+01 2.39548623e+02 2.72628328e+01 2.39548359e+02 2.72629424e+01 2.39548227e+02 2.72628328e+01 2.39548359e+02 2.72625589e+01 2.39548623e+02 2.72628328e+01 2.39578946e+02 2.72641938e+01 2.39577571e+02 2.72650976e+01 2.39576196e+02 2.72641946e+01 2.39577571e+02 2.72636006e+01 2.39578946e+02 2.72641938e+01 2.39566697e+02 2.72641969e+01 2.39565271e+02 2.72651268e+01 2.39564781e+02 2.72641973e+01 2.39565271e+02 2.72630352e+01 2.39566697e+02 2.72641969e+01 2.39557772e+02 2.72641985e+01 2.39557584e+02 2.72643992e+01 2.39557436e+02 2.72641985e+01 2.39557584e+02 2.72640400e+01 2.39557772e+02 2.72641985e+01 2.39570346e+02 2.72655628e+01 2.39569884e+02 2.72656596e+01 2.39569781e+02 2.72655629e+01 2.39569884e+02 2.72650150e+01 2.39570346e+02 2.72655628e+01 2.39567390e+02 2.72655634e+01 2.39566809e+02 2.72662275e+01 2.39565763e+02 2.72655638e+01 2.39566808e+02 2.72642959e+01 2.39567390e+02 2.72655634e+01 2.39564534e+02 2.72655640e+01 2.39563734e+02 2.72659027e+01 2.39563263e+02 2.72655642e+01 2.39563734e+02 2.72653008e+01 2.39564534e+02 2.72655640e+01 2.39561189e+02 2.72655646e+01 2.39560659e+02 2.72659885e+01 2.39560098e+02 2.72655648e+01 2.39560659e+02 2.72652724e+01 2.39561189e+02 2.72655646e+01 2.39560593e+02 2.72723980e+01 2.39559123e+02 2.72736705e+01 2.39557680e+02 2.72723985e+01 2.39559122e+02 2.72710885e+01 2.39560593e+02 2.72723980e+01 2.39488815e+02 2.72819580e+01 2.39488389e+02 2.72823260e+01 2.39487996e+02 2.72819577e+01 2.39488390e+02 2.72815744e+01 2.39488815e+02 2.72819580e+01 2.39624197e+02 2.72860400e+01 2.39625213e+02 2.72874060e+01 2.39625049e+02 2.72887728e+01 2.39623715e+02 2.72899233e+01 2.39622177e+02 2.72900810e+01 2.39620666e+02 2.72887754e+01 2.39620638e+02 2.72887196e+01 2.39619308e+02 2.72874096e+01 2.39620636e+02 2.72861550e+01 2.39620857e+02 2.72860420e+01 2.39622173e+02 2.72849775e+01 2.39623712e+02 2.72856937e+01 2.39624197e+02 2.72860400e+01 2.39501218e+02 2.73010951e+01 2.39500685e+02 2.73015486e+01 2.39500157e+02 2.73010948e+01 2.39500685e+02 2.73006048e+01 2.39501218e+02 2.73010951e+01 2.39625446e+02 2.73161058e+01 2.39625273e+02 2.73162574e+01 2.39624974e+02 2.73161061e+01 2.39625273e+02 2.73159446e+01 2.39625446e+02 2.73161058e+01 2.39591468e+02 2.72218230e+01 2.39592925e+02 2.72230655e+01 2.39593049e+02 2.72231890e+01 2.39592925e+02 2.72234268e+01 2.39592703e+02 2.72245558e+01 2.39592926e+02 2.72247464e+01 2.39593515e+02 2.72245555e+01 2.39594462e+02 2.72240065e+01 2.39596000e+02 2.72243954e+01 2.39596156e+02 2.72245544e+01 2.39596000e+02 2.72247891e+01 2.39595645e+02 2.72259213e+01 2.39596001e+02 2.72272656e+01 2.39597538e+02 2.72265209e+01 2.39598179e+02 2.72272869e+01 2.39598934e+02 2.72286533e+01 2.39598126e+02 2.72300203e+01 2.39599077e+02 2.72307712e+01 2.39599535e+02 2.72313863e+01 2.39599078e+02 2.72320305e+01 2.39598019e+02 2.72327537e+01 2.39598006e+02 2.72341203e+01 2.39597542e+02 2.72346599e+01 2.39596443e+02 2.72354876e+01 2.39596006e+02 2.72360583e+01 2.39595653e+02 2.72368546e+01 2.39596007e+02 2.72377732e+01 2.39597098e+02 2.72382207e+01 2.39596007e+02 2.72384985e+01 2.39594470e+02 2.72384298e+01 2.39592933e+02 2.72388865e+01 2.39592396e+02 2.72395893e+01 2.39592537e+02 2.72409559e+01 2.39592103e+02 2.72423227e+01 2.39591398e+02 2.72429871e+01 2.39589861e+02 2.72433765e+01 2.39589576e+02 2.72436903e+01 2.39588324e+02 2.72448416e+01 2.39587839e+02 2.72450576e+01 2.39586788e+02 2.72458371e+01 2.39585250e+02 2.72458202e+01 2.39583800e+02 2.72450590e+01 2.39583713e+02 2.72449996e+01 2.39583656e+02 2.72450591e+01 2.39583491e+02 2.72464258e+01 2.39582176e+02 2.72470105e+01 2.39580639e+02 2.72467238e+01 2.39580281e+02 2.72464268e+01 2.39579676e+02 2.72450603e+01 2.39579101e+02 2.72446674e+01 2.39577564e+02 2.72441795e+01 2.39576836e+02 2.72436945e+01 2.39576026e+02 2.72433708e+01 2.39575116e+02 2.72436949e+01 2.39574489e+02 2.72445864e+01 2.39574368e+02 2.72450618e+01 2.39572953e+02 2.72457061e+01 2.39571704e+02 2.72464291e+01 2.39571416e+02 2.72466089e+01 2.39570260e+02 2.72464295e+01 2.39569878e+02 2.72456372e+01 2.39569729e+02 2.72450629e+01 2.39569407e+02 2.72436963e+01 2.39569236e+02 2.72423297e+01 2.39568723e+02 2.72409631e+01 2.39568339e+02 2.72404100e+01 2.39567641e+02 2.72395967e+01 2.39566802e+02 2.72383085e+01 2.39566717e+02 2.72382302e+01 2.39566802e+02 2.72377995e+01 2.39567854e+02 2.72368633e+01 2.39568127e+02 2.72354966e+01 2.39568338e+02 2.72352434e+01 2.39568795e+02 2.72341298e+01 2.39568432e+02 2.72327632e+01 2.39569874e+02 2.72316636e+01 2.39570057e+02 2.72313962e+01 2.39571411e+02 2.72303309e+01 2.39571568e+02 2.72300292e+01 2.39571491e+02 2.72286625e+01 2.39572897e+02 2.72272955e+01 2.39572947e+02 2.72272064e+01 2.39573167e+02 2.72259288e+01 2.39574483e+02 2.72254875e+01 2.39576020e+02 2.72247396e+01 2.39576174e+02 2.72245613e+01 2.39577556e+02 2.72238937e+01 2.39579093e+02 2.72240711e+01 2.39580417e+02 2.72231934e+01 2.39580630e+02 2.72229879e+01 2.39582166e+02 2.72223868e+01 2.39583404e+02 2.72218258e+01 2.39583703e+02 2.72216079e+01 2.39585240e+02 2.72206487e+01 2.39586777e+02 2.72216662e+01 2.39588314e+02 2.72213926e+01 2.39589566e+02 2.72218237e+01 2.39589851e+02 2.72219012e+01 2.39591111e+02 2.72218231e+01 2.39591388e+02 2.72217674e+01 2.39591468e+02 2.72218230e+01 2.39597559e+02 2.72368538e+01 2.39597543e+02 2.72370320e+01 2.39597499e+02 2.72368539e+01 2.39597543e+02 2.72368316e+01 2.39597559e+02 2.72368538e+01 2.39595183e+02 2.72409548e+01 2.39594472e+02 2.72419990e+01 2.39593264e+02 2.72409556e+01 2.39594471e+02 2.72402124e+01 2.39595183e+02 2.72409548e+01 2.39567188e+02 2.72423301e+01 2.39567411e+02 2.72436968e+01 2.39567825e+02 2.72450633e+01 2.39566804e+02 2.72459985e+01 2.39565910e+02 2.72450637e+01 2.39566294e+02 2.72436970e+01 2.39566435e+02 2.72423303e+01 2.39566803e+02 2.72416766e+01 2.39567188e+02 2.72423301e+01 2.39579780e+02 2.72477936e+01 2.39579102e+02 2.72481183e+01 2.39578611e+02 2.72477939e+01 2.39579102e+02 2.72471610e+01 2.39579780e+02 2.72477936e+01 2.39560286e+02 2.72723981e+01 2.39559123e+02 2.72734051e+01 2.39557981e+02 2.72723984e+01 2.39559122e+02 2.72713617e+01 2.39560286e+02 2.72723981e+01 2.39622694e+02 2.72860409e+01 2.39623712e+02 2.72861240e+01 2.39625106e+02 2.72874061e+01 2.39624463e+02 2.72887731e+01 2.39623714e+02 2.72894184e+01 2.39622177e+02 2.72898676e+01 2.39620913e+02 2.72887753e+01 2.39620638e+02 2.72882281e+01 2.39619807e+02 2.72874093e+01 2.39620637e+02 2.72866251e+01 2.39621775e+02 2.72860414e+01 2.39622174e+02 2.72857190e+01 2.39622694e+02 2.72860409e+01 2.39559516e+02 2.72723982e+01 2.39559123e+02 2.72727386e+01 2.39558737e+02 2.72723983e+01 2.39559123e+02 2.72720479e+01 2.39559516e+02 2.72723982e+01 2.39624837e+02 2.72874062e+01 2.39623714e+02 2.72886300e+01 2.39623220e+02 2.72887739e+01 2.39622177e+02 2.72893315e+01 2.39621533e+02 2.72887749e+01 2.39620643e+02 2.72874088e+01 2.39622174e+02 2.72860534e+01 2.39623712e+02 2.72863713e+01 2.39624837e+02 2.72874062e+01 2.39624163e+02 2.72874067e+01 2.39623713e+02 2.72878965e+01 2.39622176e+02 2.72887523e+01 2.39620685e+02 2.72874088e+01 2.39622174e+02 2.72860905e+01 2.39623713e+02 2.72869924e+01 2.39624163e+02 2.72874067e+01 2.39623631e+02 2.72874070e+01 2.39622176e+02 2.72886572e+01 2.39620790e+02 2.72874087e+01 2.39622174e+02 2.72861838e+01 2.39623631e+02 2.72874070e+01 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/dsscontour.png����������������������������������������������������������000644 �000765 �000000 �00000716364 11332353405 021230� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��h�� ���8R]U���bKGD������ pHYs�� �� ����tIMEP3�� �IDATxye6^]Kg $$$dSAwfqAG] n80"EªEa>DpX'B䬽WwUWUqpN>KIN羼B- Ð"cƒ5?+PPPPPPjY|cW  "-зg-Ǯ8)(((()cN!)q=>6!NױG: &Hxӽ˚* *ƛ{Jo{7(PPPPPLǶX~Id֭IV׶͉0W^샗rSl8W"KVڜ9qZ˗Oi˗oٺUkɼI9eK|5}M0޴ ɀafZCxɎߝmm{a۳+E}ŞN/޳͆~jPPPPCE=ð'жpś0v,܎F"xuGOxG{v~a8. '!?W6<miYەXv`7~0$oT\'yy4bE0v5}ςG.>c 7oFKAAAAq0'CE~՗[l5}/Iٵ}B&!$*%%:{s'a tӖsTB;eqOX/q!`MB) {xA&>və{sҢޏm#[; ͞E4E哗1O=ϐV'/ B8U8fxs!S2p/?mgM7 wxێ8?K'YG,S<ʂbL3 -9nk9dX^d!SB[tܼ >٠gv:!1^:u٭gxws?jB?;Y?ʮ2 uÖAB>/߮+;~}eBYm)FUK~?|t!=Uˎx}QxO}l򏛏TuW.4rwKz;Ԙo 8uZ]EAAqL[?[ƾ?^nu/G;x9e(zjgs㇜n̥,v(㍟zs7v*r8BV/_@Yㇿz':E2CpNQ0_?ڴd۶@Ֆ<_m1e>;O[#9f9 ع_[! MiOn|%W,mӖ/YP<wi17vF'BJ (WܴP,]gg nOǎI.5&m޶6kzu_rI{sIUv"8t$ !ݑ^UBȢwoUN cFqڊik[oW25GpjA#X $N(ߦ(O}W<qJB*T>?y0NQel^~m yKSrȄqMh;eyNʦFqնc/Yә6G\wwk};6kO't]8ZLʗ*7~}/ʚٷ-IǕ>S1:} '&6n/GIq? 7|eO B5o8T~?8uewpqon|mLE4>IG seðͷooo{ϼ-&mJ-1^qg#-u!n͟ž}ӕ/#s>/>y!!/leXm}8};8徇B,c880)]%Tf$}{. !oӓ+Bw:3x!5&E<!d@0\kPOtB!ؙMVv"BȾa²֩ʎouڲV,92\4___'u*٧/?eA@BRPP+s&smDumv%ѿo|_5=8sƶg-? FoXBo<)JR[q| /g^rioe,G3.9 _US{}WDЅ}Į\ݙ !^y㚔K}AKaryo;u?6_eYa!d^g(˄a{;KF;?Yb\F,B & 1z 2ԝM{y8?8iӛCޖ="^B^زŒ{ ((((:Vmooo 6>}Q5|{qفaaGMW$ v<+|asidqOk;_}|c?7c^g9[۟^re3|.B{jk;f6O2<#$} W7VM-O=laG o+Vj{Y}Z*"wyנYwuft꒞h't_zvnOW!bԌ?}r2ΪejLzj㫯؛^NDAAAq[t7coݪy/$gm"B<W=x/euq8~j@WbzU aoˉX [u{:$Q(?!3g\Hygɯx3NY_v}-8vo~*%)F+a'V/?s}Ol; Y!uǽ>k7K{>tN^Y.Uv۾};#9^rߟd{=}ˎ}ϼy-:ː ߾\ŪeM?{iQK K1P'~Яe%.H186s.[6<)Tn 8Zn&W?ua1q?<ry0ϝaQQZ\yC{ s d9.%t(C{pmKMdt{n18$Z%FqBxEQl~[t{yBH%j<^I3QTtg5 ]bYNr! l L{]uyo}S.\?̫^^fa[ApKr"Suj !aԫ%kH0mpDϵrųݢp8դjQbDAAq,\-C6yYGZ"9Fok"Zyxح(涽Ŏ'[T*qA -/]Z4+.,'{c0 /H(dz],˱ ɄQRXePV/8JaXc!EQDhða=U$p!DOw)^adEOfd5 "!G/YŐw\լBmX%dp Ä$?E�d<QxN`X6 C8^ 1-6eysb">؉ HY5g_8^lm?{߰Jr*^WV f۶ ڰdO(zsZ;F"Hr;OQV1\T?5&2z4q&Z*;v?y]o;̓wU3Ű,0/hl["HrBIst7 c93Pkpvk(7qxQ|eY^$K3 ׶ʨiklZLKr^) SXLgd5<JXcW [n7i lu zdLOO3!NEڶ qBqZFQ QP1(֏աÈ;i&֮];?(t((((((!ׯ US�%N J8)((((((qRPPPPPP⤠IAAAAAAAb ৺A*jzTŸJ3{Q;8scy3xi<ȨWG߳saFTgƿ&ҡgC;g8-~7Amx~%GݦYPd5s>msS#<#)l4׾TjpyD�fqz쭏>̇fy(I ta{mhG^$ag^#|}Կ̸P&Z܋Qi,؏_YO,1ȟW>PZ:u27;7icRƥMA陀-F27 %B^u^kz)Lгh8M fZ2y뫛އ0~ k}ieGr%656n3#My<!ærF"s-73?TT3Mg|'"ɣ[Ind6Svom,]4};9Nr N Lsyn=5f~X~t[?se.\x̵P*Ma93hZ0~Jæ)A >!'{W}䥍ʢrwkV֜={16;oӛHY֋<^(nMWlz7OXRhiTdG9{i3u&ꐝ9xBjz 쾌]'97UqiE>_|YMk>v[;,q՛:0~}(֏B2#gާni%߱wsrlō�(%(qRPPT PPPFkx-U8)((((((qRPPPPPP⤠IAAAAAA'ФB+εkEqR֤hѡ.. Ed2[\qRPPPPPPLMqR hńq>Jo_O2]J[AAA11֯_OD'UG0G4=1qRJ% hc7ykpGı/6}[wNil>̚xSA\d'8\ۚST ^i%M>Z8)he((f W^y$I r9Q !<χa(iJ%QFVKRa</IX4 t]_r~T*~h4A$Ia/J-2 նe~ƾB5w1 bɄ:Qq')tE)#}v,m`Yq(y^EQt]We00t8]r65M^FimoڴI4qxEyeh</BZ]fMAxq\DžaX8SŲhCY%I*J,V* `6˲E uIOl۾{;239/4bM?wθ)f~l}izNj`SPL -LJF!yAH0L,3 ꫯm}d!RP9cYʒyu%Ij48Wy~ӦMMA8"˲|u x'xei73 n,<o,aXA0 CInF0z.r(DQWRuJ0Le)" T*X,&Ix BH,}ߝu✑)*dlt'ɚcGuBn!6>f;l?�Mx_bš8HHT(Zh(²,q<σllE{y4Maʟ'A(G0 q `F:vGӴzy7o<ϲD"<OӴ|>zѨV ÈqبX,2 9  jd2IaYVeFI l۶$I$ L&8eY۶jeYAdYƁu]/ ,꺞L&oJ$bZ$e~!^>q II$o; 2F*I.uk!G͚SPL,iZGGzҰV,KdC-˂AX,yYu]ײ,VEQ:hH&`j z4 D;0 mÐy˲X8t,@Z溮m۶m[h4bXV+'pеk&q,8Azgv,s4\.gY À}7 4 h뺮R z qN\4~RR?g[=lzDF>JR<dY- "8,/=AB,nB�EhY!0G<*!u](R4M0J뺊9ξ>q~P lq\&!NAbl6An޼H$i,2 SՐXeY虀8EQE4q>9RA8RT%L&-[X1NP( H$8,^CB4M$'՝SjlqL3eiqJGٍw_g46ŴQ.0D(a꺮*0dYj H&|+_Ae(F PE%I˲$IB"жmO8s=RXu: C(3MP+Bgg'!{vDz,Fq\\. !(&e}u% ."r9u+ ۡ. =sV% <=0 5a6!kFdpAQլ(o}lZdjtw&ob ?03tSk->⨄i` 򆇇!)˺1Lmۨ*mۄ]vAjr)y~֭6lfȤV*! D" ɲlZ m-iy¿ 0 !+ ˲(u0LWW"ֶmicEIAw8%0˲gppeL&c4x��?ɟ׺Gb'\Vrm;Ќ8˙N~-NEv )y绺9V/;"쉾L4eB1 {nBbhkRE6gFaYVLX,[(Ο?޽ t\,QYkm{p!˲vyAZAΛ7P(Hk:t$˲BX,VUUuGu۶s QYKj8۽{wgg'.gŃǹk}={74{HC =EDJ%IVm>eA9<a7@~*"▆aG%eR)a@]\E]EٶmI }[bEOO,mmm';wTU5HbPaQ=-8JZe*B(ZlFN]Yu]WEEQp9t0 <E ˲͢9x@'š(lŌ]aܹ4M4G~}E- SU�yWVM\.#A (AT|3hza,cY5?C/rҗH$ mA�KTUT��� �IDAT}UUl'"<*"rlqbQjHXA'4z*BSuTؚ okks]7x"a P⤠8DI)fTUddPh q, PXuQyljPa>tw|>x<O +˚,47\TDQD0h|okku ~pyiHvwwuVB@#&F2T*E81, q84VGj50>[NGuAF: ! +D#ђbTaL0Ex(&*1 # q=(Ii.[lÆ (qqyR"C"Xb͐j(MRZZq0 !WzW*5A\.dRF?+"f2 O *J|ڰaC>5 CpN96"*k r U9`Ph;!\0P5G㠚f:rDt+B|>rBaUUK,~<0Fr6X,n۶Ͳ,< &]gT .:@1:,? 0)Bd",P,V�[VݱcG.JF- uJk׮@AAM'>7> ^9H62jJ;)9 `JB▆a躎}<8,[.ym;͢@\�Nw VQB}a,˖e%IF^8ȲTRtW~߅aolYg!c\b _k6 t| 'OM 9#]HgFS,J0E&Jl:jAu wCZbCP/Bb( !Ɋ#L%Ce,Z9R.$e˲l. ͫT*baP,Ph<^2<44N>1 X}"zF!+q-Gd՘8aVPPPh11|29FNhJ12 AKq`M2 ç~3U`&K~Qm Z<U<,9Ha +E rR- (ҁVU8"V%VY,"YEQ\׭PxV@q&AS&)˖e p?0TKj)(((. y#g&Ii-r\T*'j�@rBгW ( 3YhVRZPܠ[YB_`hpD"2 x/J f3l\lY^G=-,)JBh}8wq8)(((T R*IJ~0c-O+WD{x<aY$)| P �, hSaJ-9t3?6 JGhǐmۗ_~9< @-(q;A+@a41/mݺnDBSdl}Gnaf'x0arƠgpt 8ZT*UסyE0("u 0ےnK䡬'XP)L"]E_Y]w1 !ٺu04M3jNꂼÁ9LpJp,D6ai\ xx x@gd2ዴ|ZjV7&sS(((PVŒD"DMA qq!1k't&a (K B%hu<ϣ,vŊru݅ Bݵ.e;::0,m͚5Z  <*xz޽;BP'5+WbN4@CR3D2T*EgЄ:M8GY5+&ԩ6AB%-QRMV((V|/R>7 CEE1 ~{:`(BD Q[Vwܹo>X$ Z@MSlVe޼y+ғ(ݴiy]쓗w}i %;s?qZ:dk"%WR)tTUk MDCwqMkXE# H7l6 <m6l�%qi8hdR8sBfMRB=<h RPP�X2~gňQREDǽjk!DӴR$boo/(@hkkBhR,aׇsC[omooGH\D[X $ {B,ExuI󼾾>lڴ LB�DJmCP(H[{W,}GT|։slw {䚌 '7)RP݀PG9hQEqDnn!{14['(T*ٳa QH$˲<L,Cmۆa@M& eM 7~{ppy5WBDhHELLlooO$x2nFٰ뺵Z[nAw |vS#)M, ܂5Afx 4B@1Bmmm~E<|vs2TA?xqCUL.2Q Ǣh t0Ӷ\.<b2|*b&S?>F,_0 "h4}/F$:x*J__z< ylsE!뺮#ٹg4SΟ??jLRl0zGR"4jXF0h(===PϠdUU|Ap'1#e)((nbd2M #(UP(x=2}oO<Om۶%I-aڇ[oZG Im`q۶߀I F!Z Fqzbq>oY !* !,Zd}u]74hd2(`D ݪ"Iؘ!ykxv2?o\0BAqК>hRiԳee1 ah8MBygY֗%&I(_�&]lF-mr9͛7Gfxvk_¹%K@)" ,LtQ+UPLA B`ljDzb=*zπl=wdgń[c>S)Grd@3V$-˪VBT{gcR0wyh8 T&ƕWUU:# H2CJRӴlNS4qIRҖa �y߳gm7 t@G$ Co޼矏*Jla4-S(Ag88?NjĶj&Gw8Mi})(z 2Z rʲBx=-,˾˄.1D Ƴ-"8qt*bad2"TA#2zWQM\sQ16@hEebѶr|yAʲZ`4q^mEEQ>b+Jd: #1SOEٶ8eYи.6 P3CL<y9[X,48]_$I=cJ=vthY1 "I{oTi;"oA(i۶|ZE ]bp{;֪ �do 5wڕH$^|E׶D"yt]gne٧zVAS:sYg!DR mۈ6www˲:Lq'�TNaM>tIÆ3M *BѼh40qD/*n6yZ(~F D$\Ey-2AN΅|$J7㝘RV"P4ZY0ts޼y߿>@REQxOӊD=3(%X<$A[a>IÆ3(*b6˖-Cf8(F슢<AHX7!TjVT=cf<G?(T,rpCL:f˗/-_WV,p}JD [V*{# $ű<;#˲m}}}8m8 q2uYU4X`/,!= F7 ނz9rr~z&W#h4^y" Fqa%X ]S/Z%"GӶmL o-h͗8 -܂'x,0|a6VPqaep"4Z.dMvy)<(/:; !bR]8e˖A S8JݍבM)qNL8b<8S0 <TϢdM,A <Q)TQR D4ј &Cj-%rE<!$H\}Uw}CƶCJ\-o*u%K \.P08[FE'|P!J:44~[[[.)q6].B \vet((Z�t:YE/&qa`A �, Ae,|x2G"'2v ddx< C$DljX ID4{u3 #hf,cϞ= cf A ~힚W R4Hh#8gQcXRI8%N*7.2] @D( .aP(BRy^Z_c0`h~g<T*@/&b:CP= ! >CH8eoe2?᷀8, YB0u]G2EaϘ-Lӌ!k, qh(qRnsX~=}l*ҖWUL =]]]`J�\p~3HD"0ٶm˳,;44nF-ju]U*"yǣ7 E 2C.Xg~A@ "B !ذ\.㹡X,3:J1|;E/ |[qRPPP]Xڈn}Գ ͋e/cL,˂ ;F"+Ji,zah^$1,ٶ w:hJԻVHb, }:BBB"G\djMD!+!-Z B%  6pC=8!]B!t",b2$hJT'2QtEQ %N #hz$3H$0c =h̐eDD2"W{�k !$AAe J%.z[kK<dR hY]$kZoĐk VaZ jq4b ÷AdUPމfR86D.k7ևŘ0:Ap!5wƀ'܁,h#j2`5CKaF )Fp# :p@XT�eY(9*!H逸nTs7|!wAŒrѢEt: qVYkc Q-F#1FG)Dw=?FOTqI9jhwR[ 0*~s*b|" uP@X.L�}ZqEQ BњH$hִtiO?d2Y*AF0?s9{:)!dx m{ꩧvtt`478FZu>!.?^ owws=NLL-f(cdЂFMi͎.b `H*B$I,C/  I0c$ |>_Y'2CR&- wvvB6s9X,FNp8IoW2`H||=�#S@:$w^ڶ^z r6>|EBƔjAџP`Q,޽C$lWUdp s=8[ڄbz7eIAAq^r9P `/_|r,y! fDN4MX,$)Ͽ8i�G Nt}TUutDVNB ҥK !h$�G4(N �'nڴUh±,," 7]0+Ānȓwʕ8gO<ăUP9s5nڔ5)RPM E! :UAe8 [s躎'"qk';#-H$`G�f0H>z=QCQUuϞ=0f3!yhDkBP( 4nMӐ@b}Ur(J=sCAp_ݺu gdDuTk5֤@vX+ Aѕ硱 @cLj(AIQoo/Z$+J&A) VKeY 0jEQPLۣ|h\n<$-[ O ʨAֲ,TG\~E.0D"aL& yj# 8K& Ѝ:3sፊNUR:&7]y #`;TQ#"Z ֬D"EH&T3e7oތ8;pmEJOOLq A@zYX.0 (uFBBP*A 0Y!0 n.PbQ:JT*j,x\bȲl\>F2$BEFudg8کƕÅ(, j&It%?Oϲ,T!X/EP$>RV0LT^QY/N5aPċFgO} `h0 |^D0b,LFîDUy{C^G/t*q@c>ya '?rPudi9ΈD*餺gVu$紶MPV(I&U> mAЋ CS$۶22iV*`&DxQOP8)gb1*V2V( # n*r�nqb^)D3Jj/ EhE7r'6%C\`tq͛'B?yG,q 4M?'(fV\6]ۦ͢S>H)&=8$Jo `@\pqEu ^xa>FBX4 8pAwww2v$Ys#!!q\OOO&HZ`b(Wc#KW_}&ݨ¤k?Ȁj<E.fs9X/}Kx|޽8)((((fyAve,q4F$ S# :i˗/7MgE›RFqFOEhMr 劲/4L!W\Y0 ?_wu]4h¨w^˲0L$p#Zٻw/^ǶQWhdRH$zzz=FeP,K ;%N (<$uvvvvv,[*J±=yL&ѿav&yWa�۶De&r:ƌhV!7QNj: B&HB0A#23J%ht:y[!tI%v}nD,cJ('xu]'2h :z0[)qRPPP@%*zBZ ă*a h?�� �IDATH=@e3¯'Y™*HA;VU4DB"yn%\yՕ`3<3͢gppm-(Au]7 (HG˞穪v[Λ7N0|7N\1&`cp~�GF"l[u_.4&4Ec3LȲ۾};HbsBPq:::l^d1uݳ>{ƍ|㸭['L&Em۩T꥗^jooT*O'!h~$-XJ"sh3륗^ӟKb XBPq\P@Tzz``�7Ɵ* :(Fbl% :bzZ QLa$DJ JZAr�V;e#9wEEDHyP(0LP8n;DQlm?[ܹX,Q80{A"$,0BG?dX6oތ>`GuQp+IRR 1-Jh�50PC!^8'֮]K.2 7b<u$#E1Mr-*jfXh:yUPf/m5McY`rޞ%IrFq=Dݯ"ؕa0҃LDsEr]]]_;(P',2\}Qa6(iJ2P(`eA)qR9wQ. 7b<.Ā&ZSMӐwlaNYr п6BJ>3$IZ ,{Bݽn$vkS"GK9S_| .]c T1M ̛7駟 l\i8B!HmA;m\.+-!`(*!.GISJgbs 7XMu == MOQ$I㰗8Ͷ6";g sZ7`5J!7YB ]0qC"Ou˲Ц8ƍ200BG"0ݻx@&Swuu _8.DhɁcQ D} !D8n޼y/~&UG 4 ^l l6kYҢL&i@{JS(P5CrPu|U}CK 'Cш?8_U RTT"!(iعi_Ao_|1󃃃0䋼|pF#]L$͢Zq4JJ Au7yIq&Jq?"'< ^F,qibd4:;h^B"ۑ;}߾}{GG(x0H߿иP6m! %&VKjp! !"7327tF~jJp`tHgL. i�Rx='0< /h|gg'86}'4R4ovz?r  z a]p㘦s:an<4JN^OMt+<"r&% a#QnhsD$T`^ap&_:޴i((T*U,a<B(}#6rhttt ?G jZExBfd~4 vE$dɒm۶!+dL&xwgnڴ)rD2 EhAN ;NcL7$i.ÃH" fM+rc[[wyxu%kNu%[8ջ6'Vb"yglQ%c4LєFD5y׾v7kV*<W_'l6;88dJD}_f|Bb$Des\kʋz{{7o̲l6L欳zǠ&ImmmmD1Q:<< GmԳ> o4B`&LAD`00 4 3c9I<Z'DzcˣQ?-kN&99u}|CCJZIcZߵ)]gRTX,'J.DkR}o+ц$8m۾QJ ԧ>|>WURP(.O~O~JY'"z4EAi:eY닢༭[g,3BȾ}\ם7oޯkɲj^BHOOO\( K PЫ#+>=߽oS oEQxVQ&AavOQ]X&<֨7&sGv3&|{:;)G R)4QynBtM{5MSUFߏ\RiZBlZJTEnqMt2Vl4n\.qBFhr8MX,_eoo]w݅8۶mZN5MCu]s5eR;w(EҗN-h0\2k&D aFĂL3>jA#P kT:LLrJrsߩCz'Y޵I~˚~g)kYqAT\? a\z?0( E5jkHyUWFS- !HywǞ̭~VUI9C!m2Bȝ>wl,˪VѰnA7wo�X,^s57_ Yiamŀ3e#.eY�q6E*~,LbϋYܡON ly8:Rc<QAEd"8P*bVl6k&yq%暫w}Ot2kx7y>weY+R,g޴gϿvۍkj5JUUxRjo6Ƞ^w-yQaawwW^alDQgP:m!6IR(B0P jr'f-25V1?p$?/Ey-RzjG~h0 Ѷ( /FBRUը6A/"߯jWN(( Cւ]׽[á!&N>8 LA Fm?pW_^^^V$s=pukuA`eYz}pp0l6gla/q#3 GÇK]=SO<Wof>@FٸzZYԥRJ*ԹB 8P\Q0"t۶rC^qg !n"$Y !x\.,YT-Zߏm݆z`\,ˆaFuwwr97˨ DQVvh  cAsK:)FLJhD۫\NEXb1XSJ^:ڑ9#Kvz2U֜p a+vɷWnz}Bъh><]b1h/uttݻeً.藿eXD;#kTUE=<4!jA!(a㎃,0فTM$뺾h"<ٺu+JbEJAm00R)Їeّ{X{P ]PL4Jrۿvur_ʵ]YF]ׅc>q+Vx熇u]j|Rˆf,q8r]p'yS&s_w)áG@Yk&Pm<}?ٳgς sX(߿c,_!H$\NU՛oZM e,_}շ~;4\ɲ'?ɟ犢8o>mew+㸎];QZ˲0"P( dٶ YMqa:g8KAU?pC([$AC(֠{s$ٶ: xb?>l5M�oV_D&*Q%IBAP4EH[Po +a^X,&I<�?˲p0O˂`S�+7}c`M01iEQЋh4A+a^bg@T i-5<KR .}еZVqJG$@Z`1 )Ӿ/_|۶mK.3-]<(3d@m F>z!" zzz`~KfbJ6awF*$D}|'*{Əc<T*ar6#G1 F o ћx2'- \.,TZ?Hp8%N #Tu]@i#1VA3H'Iu7o|gd4S<F'3΀DƗer`(2 ٳ' C SBh}e,Y~(MȲ, D0ɩT* x$>!0WU|ɠ=`$/244~gg'!zכN !wu85<Y"DA1 3#Eq Z5@ #p288Od2˲ ( mppp޽(ټy3XBsڵ絵EDb6u]w߾}" #vYHX 2CjuVt 0hI4Qj^d2R *ꫯ":+I#7ֆZk.B7 yADA1=Aa[PE4YQ 1:G<epC XYbb7M3HahѢ-[<lٲ^x,z$u]߿_uJ%Dh4MVKJۺu(ȉB;5]p$J^MĮ07GD*Gaq0HE qDJ bS<Xv-] 7b<||衇P�GKLDK/}衇LL(?{`Ǯ\p4H:C{mc"E%p}@JUBBsM0x`݉m!vع\78 E l'N5giёttN\.kmg=~A{QV}>_T'P�=,wٶ6699 x%+x O|{jX EZL&$ڕ `ܼ,)v6t6C=k677w'N n'Rd{Kv^Y4lf+3d&Șl7||B1dnXwW >O#<񫯾GEps\t:/} FF5y?'0\.//?ⲙuV}ݨDa%:<䓀t:� %4HnWfF[F%dJX6=Ν;755J 2y6]`0RWfE;z舀 -k@ ,BzO<8@(SF}ѩ)P'W <833S.ڱ\hƉ_VH$Yǒv}Сg6M׼5o=<�9Z!&T#]wB8?rt8@�e]V8�mB< F"T*y®bj3fltjao dzjsssé~@l}K^|#" +훟_[[Rb1χ.f~|HyP₃fT[14}!HdƂ R7f#h4j'H́+g2. 0d(f6i̘1cҐeN?R #D{n +j-,,�ƈhee @2 5 @|shh\fٹT lٳ=p% k6 c\՜Pf'lyyT*1!T x<c42LzP/L'? ҔO;66U%1VU+f {0:ֺC6aRx5vݑLr.< +}v4x2__ɚ&JD<+  F"dJ%;h.0>5>> "ӟx~&WWW D4!}�+(D" pxyy;@_h"h12~l6[֗>�K Y{®#\P7AUmS6<J2==];mۙL)f R>gϞe2CL~-DibGxhY.0zԩO~^w$#h@!/N9s9HϰOD=WWWgff@fqqu!0cISG9ndߏ"d W($y� .haaa݈R'7Fg'_uob)-S=<�7[F Nr\ u.ds1dAG@(xH�d2999 }>Z\d"hll �`xdpY82 YhMOO<T =pî-oE�W ~} DxMoo@�wf'HE! DnE0`8 ()Tރ "JINu߼`_?2RKV-®z?t~ ;j E#z,6V&''f&]_@`̩Sr QDLYR2ַnTZSD&Ak"B#<a}C= z e 4I�hG@&dr� "b W0߫_j~'z)O=oGS:K]}<vƢ<j; f7GIc7K&(7,pxf2YW z>;;ܘ@mkeu,j5yyFDh4�Ѐe�S8!Q266/|7h DgmP6@�HqBh&5,˗]vD]2`¶VoǷ/,,�G$ʽ(c}ꩧ\?SXa{Vm'=K ahP_s$R7A1փAWozz\pqq1 j4O,e! :qD$={ F<)^E@xJ~h^/..hA�.$ʂʯ vJSz,7H}:(rW SO=u5@avv* 3.//߿x<Rh4drg$iDDNu擾z:"2u~C;" m]8g&˚AKјD>MB=g+4 W*T~N8E~R u~+_L&F%BՂ\-2~iVO AH6# K0DD9 Ï>(p>7MJTzff[W\ < R)Pj"Plp^\RbtYo=Șˎ7c`naee%HLOOC9>w>u_8Moz=s>Ю;55�{^h4'ѠU~Fl6hw"u`0˿˨b ȑ DDD<ix\7^^^D2 ^M$pZJ6 H}S"BJ0!q L)UV B@tpPop*G.Uoz#ǩ3A} �� �IDATr!ڝajN>f ^333X MvG 1tWWW&NBе^JF(0 CQjԍi NRV//ѰK"L"~ND>KKKT $cX`0׽kkkKKKpJd29>>d@QP+_!D Q->O2@jy/S �%{3_+cQe-[ux ;VWW'&&* ?چZ5 8!_hR)GcccClqOU?OڛD l۳HkD ڍz!}{fptbbRd28"ŦϜ93663d2\Rl6u&I$2\XX@''NBȑ#p/Q*5gܘƌ3flViX[*�FFlT*R)AtLRh b@ #emm-HHxAAX"ٳz Ts"*DEb4MA_GD{=uB�rl#6xBj `|~]р )bU�{>jȘ1cb_~9z*�R$D"Ǒ: t;AQ8z]*%@;2$FWWW1ҵhj58N*BbفR_FcxЩ;~xRrU{�~| R�*س盛Cc2!=BN#Yb̘1c}@ p1Bz&)JPfZ )?.H"yY�ݻ:X[`f,//XWa_~9SڶDJzBz˓7pcat#~V %4LU$ӂC\.C]жEu^\\&�r tm{ӏsvQ3fۨΦR)t:V$LLUT(B6-oy1Z(V*{a$EAz FoVt Ǐ*T�@ Лzuuܹsz n<�)AԖ 2ujL`zzznnyI@jx'>ܹs�?YƜz`WX,t8ړz3݀3"pHB!@\HYXX@_I(~&j zNlĉ(@h@ 4k,TgϞyԠjrRLNNV*H n^bj [#h7Jj<xp~~IL@駟F] N&gϞ6J܋VWls{1b^{ 3AƔ^' !VC0N$shQ=$d{)O$HAYBPE2^g$9s T뀝|_3C &&&Ν;GDn_XXeduF>}=lL@Ҁ +1iD �xB Psss p6 2&0:vAT*zr,DEЮT*EQ$@q߈ZH$0< / ro@ڍ۷瞃nB@ -Dbff"Hl4+++;s ڶR@H߈,dXj0o\!#JBO 껐\`{ HS{0Z4KψѣGG]Vf G")b1L.--Agjjjvv)�xp8~! l. oyj:>><HZXXbe#܂ /,, (+[YYYZZʞ={Aj̰%T�Pq^߿ii) <y*L"vT & pwzy:3fl-Cg||%DQbJRTЄ  \HRB}N@Ţ(}*믉 :NT&!}  EVpRA2 HDn\XXN[iphDQ8* D"]w1R)xg/�t: `B�1cƌmWbZ n@ $k#ST>L&`$Raᭅ�"z:򨀬P΃ѕ)�O^߷o| +R^'&&pkN b0@>(AD>`:Zm߾}Ԃ.s@+Uk4 ɐGI(E#_Sma&H9P6avrJC8p`vv:w"XXT@@rXl4t|Xp`2GDP}K^O#P  ^�%X IL333rUFf^ᇨ'/A},JD.J h%k^^.d.\tIcH?яR>{,:ɠ)- &ֵ9K멌{ݵӸ @ mGCx Wv̙3G"�@3E0 ^s5@_P4VP(ґ�~P~3AjJ\jEm ?s$4 S'''fgg )xQr333@MԤdj\+edHqAu2l19ȿo wPw9r!If|]#uj\:$ as>^Y Vƹhe YP (@!q]+$V*|FXMozoee)<P(tw"opv= 5ԶV}+ FQHm,htnn I˲P;&L f}2.bD*zZ>N@" hǿ%z7(-$l;4xm^dj&hgJ0ОmZW^y% ?>PLW !4㧧tXdȐ �HD{IE'[n%pmFLݞC-" F"[8T~$񎏏m@>v�Pnj7ob㸯z @H$r-t:H@+vvu<Oܚsٵ(z(FlxCtƩc /H@X,F",//_#]vm"~j5J1QYPl6'''O8C) ăjZTD-B!7b,'#`7/++L(n[TA!`*YBU�FG.@ NJ3h( 87pÈlF9i74A&ƹj]veP�5 o�;GxH//BId<ym)"=)BS"lU#0 L:ǨK/..( b  B蘍~?L"[, (A :cm7-�Nl9mSh:ǭЎvC03AB'|Bpp8I4GiSNHAgԱH$׽HmM(>1D411j |+++HOyHdϞ=KKKpBobb" C`\_±1ZA- + E{Ӏ K%"FȜ@ p]waGS"lG)\noy#2Q0 1KK„Dܹs~~~`Z9bBg޽5wdƝw Z*_*�Zd%6$j5hKFQ.SrnEi"@/*N r} <}t4>т Lr-* gΜ bZVʉ,ЋqPð DKjO;)7J`Bb7A} oj'p&U\MMM`0t:Pe3^|EAHUsssRX,6M|* )L&|&r-pl"6 ,9S(Nh :(Q F"\"F�-dR)1g@&"H/VL& ~ӟFn0'P(I$L&"|ң rA[Z* 7Z?lmeV]pϼߔy X0JXDhYFT&''k__ol:֕@e8] |An G9IV f9>>>??-=7\LaDdq+D~ST6 ^x<E08nXEWqh U^T$H'Pcƌ�hu/..)GN<Gt ];񎉉 =1E<|.%t: xV ;�$={O }>_&aڜ YQ<_YYHzyyZ"' S{fo,KcT)[A:D+++)}$u$x3fC@ @g~g@|>_VCΎVP6� %-+Vh hA8ժE'((HR.--!DV<FnbKA'NZVgN L@ h&HEoj$%!�y^FLAROrqwx9m=k̘1c[bf3Pw bΞ=KDx@EPTD,#"lbYNW\q�\0,955Up` l۫^*hMLL }1033m@)D"> *#Ű =҈ K<)$TpNPZ-GqH 0Oѣf3Q;r-BD *]v:u nd29;;$ d"([4NR$r G%b'x|aar9C*(JbȌE !agii =h:Zx@ꫯ*UQam{\PB@.=d(>99kn0AʴŠ9 jst6dXvw &&&:??مh4 "RoX*"NI$AQU%Pۻw/ڏ iZ&\'\$®@&\ hIDpoG>h4fgg@Z޿ړO>IDHsEI2�M<t*tKR سgӧ1p#w2`s3 ms{1b^{ 3AƔv986 sĉI& h5!2S8|΃S"t�"\t"h4nvPC=e6Mԕ"8??:K8r@D@q"j4fɒfffjkHq[ݞKӸ5͌--- 2dLi[ B OBiK/ >jZЭT`:Bl\ 7_Eٜ:⦬9GPKصk.8Cx)q@P(vڵ5dF O͢'nrP"|!+r</.3  D pgtѣ#ZfF|.XTUȵCi|}<y%D$D@ː[W'{D˭`0LP(b333_D(B%() ^%'ʾGp%�HZ|b=? 2@RA&*2O�jW|GQx?Z]]=p<n]GGiY3f(AyΝVdٳp+%⇚]R]]ZZfH#BI%ܭF�lZP>A|�;3 pfdLZ6Zs"αT*kT*@bYRL s$ wq$*deGU1fiNG0i̘1cۘq(u(�B,Mfff@1`08==}I"B@Š% @ ԧ.2v|@|]\\%rA<11P++rBF�^B~v\.={]r=) bx^c0D`(/UTsun tw;y`p7zSܠP+`p"tmm $ȳGD$㌍e||n[ s砺]Ы;Do/8EѮM"7_WQ>p8+Rd g 2L]ZG?Bl@F88%726sBZm||uRRC^E ѷkiwUPy^Z^TƮ϶�oh4�TPUDJ&YZZQ~@l_r9KBpxJ%d֠A w.ߛ_*Rapmh8Q z|Ϟ=�T&<ne~~ yFX !ދ.@FY|0"1Vgr{ZE�kĖ\r/$MՆX]/M ӼЦS#d9736DEdHXB E hEFJDUj5&AK8N&Z /ԅlCqJݻwtMHIRC ~.H Do p"7 <x 8;R _JFmvv*r\QR;d H$gbSPFvwD|?.u+P1cPn_" N,_=E0?1c~PAjZJpB1HpJNys?99җtbb"LR)24ͥvKKK_|1uJmo{K^F.kkkַB Ry, j"Hn7ַ5ᮑ�Vw4b$BE) =G-f"Y77<21vZ<�JH$T[%C|naaI.FJPL#CN&`lPeͮ!,AӀ*J"@~Y4ZYYY9uNu̙o|6TP@n,C޽{) ݻ)ȼM=hd~a1^]]ݻwsp̋/nаXto IK.C�kmo��Qרk*:{,P6 \ ę3gLRz}ffm8̐@Llbb"#xS*RBI�g.J4pU*.~]-`x911qi[R �/_י=u"x|jjpnyq!cƅ<m2Bi6[v}C==G%^'I.x H$bggg'&&7??Ő= _1>ݻу<)5ټLG ţF饥%u؇H7 ꪫz)@54<FKȺjT M{ַ͋#w6hJ Gu�� �IDATx|~~DZ,P|ǎd2]{8a35PH+~/ܷ lӻcsq _lf6otnxkǢύKvFo|IR=O_m&vxof:Ŏwcۛ40S͈4fx)HkMƌ ; 3f�N30d̘16`&Pa&Ș1c8y20d̘g1cƌ3 Ɖ~ƌ3f̘1Oy=A1f̘1cƜ6k 1cƌ3,NhF[QUmK]W`pMAF[qôG2;:IyUR/~ LpMAvd3f̘1c0ƌ3f̘Ncƌ3f�1cƌ3Y= NO4bm+%׶U9]$i~ַv}؅vnjZw7 jGRZ33il;̝8Ad2:с>//I�E.l'(R.zC}e!<.9_͆r~ޯMKorXa\/Ps15V}cu.Q EG z|zJM׉_?{y_5f<jO7zmC(+5l8t;?9hQ9nc5[`4͝Js<r#Ͼ[% ᾼ|FasU}8R {/)8_Жmg#{JyLvܨ8z&zhs6Dm4c֑\qF6v\[7*t {y�LV-xv Uc_-6e :\m|FFB쎶kzy<8! GSEw}2=ʯF; !o/Vhr'?�#3W~v Ԉ/#l{>Ux|sK|IՐ  ݿR@7j�{f m0"=cƌmj83flض]"5Ɣ4C`̘1c[ƶPi̘1cƌ4f̘1ccjWѣGGFJFʖN 6z\v^kyĹbµ^kvƌ3fm_gfO/׿W1cƌ3 *uߴDv +uĈx`.I7bnG]TI;z(sC^i6#;;べ@b'݈|w̌֘1cƌۀ4f̘1c p3f̘1c83f̘- WmeߛZ|]?BnMb@33b~;7_/87<Uv}FP_[o혹N;Fvu2N6p.M]g"gh̸ݢT .Kѯ{;`:4z[T! _8ʄP VOE8}ӆv[ .wf.<p:MM;8@ g0:w1] u1uyw? |oM7M^. /#p!<Ac#ʠQXm h|AˑOpFکw~s阼4OAB_/U۷ ~{=Soa]сs\٪t>F85وa6\yq~_V-C gf..UӱcS팇NGȺ<z&xq] 'f8s1;]ېomMީq3f̘1c83f̘1ƌ3f̘Ncƌ3f�1cƌ3CMU{}@O>ؼ�m6wanܝ>׼{\VZ|uzk5 cƌ3f9+Aƌ3f؀L{ 1cƌ3洉杷?Ͽٿ=/v |\>]Q=;)h.(87rWWAs0SFv?ؽ>mf_]mΈ?n˿ٿ}?kXr`9ҿ X.TלY9s8juw=fo, [9 /Ҍ^V}s#QpEw;% Kb;t+Tua>e;~6b K43fl\5Z^E SI8rj֬ȹ&E5>R-tWѰu:FWƐrw 8 `PTNs :Y򆉽Տjy9/l^ERs)00M7!|3dX h4JD333?8 DTTp*bKɟ!H,//HRDtUWhnn?1<yR>O\HP(zkfV /|>Wz`ccc+^ ""DsQPH<g*pyXT:4v` شÂkfvi"jv1g7 1 W_}5ۙ"zO8ySKkkkc cφ|<HDK.\!ഝK_%Ylyi%'KAz$�ߞMsMꠦr NFhI'Op->Y_- `cď ٜqʪ{2;݌{gNbRk9T\,*/xwb5Y2dV(.""K'NصkWPP_Xhj;v]ٳgٛ>Ӄ̷�m}(Krǭy"zgVcnn^ckG =v>K�NB穳9W4DK܋ɫ?rVfUp0x*qVmE$@YUTs0}d,w9eS܅L K wڮO®i7sf5ui]v횜J&d2D"oyL&X,ȾZVv, nX"myZi@7V fP(}RVd@b gD�~ rX*t~Y= kݽ?YQY윤IQ'c'y^KuarQ� ӸaԤ8"he%~V59?oNG9ٮh/s| d''iKro !\X@8$aMgnCf1xqdj3`XXX졝0lΜ9"7]`|I*^x>ABިۻ%I�h]Tt_t]Gt M) 8hA7r䐓Wٮ'/ђiH <Y$ҍ{![<9@ijkqKz$ ;7!yjd{;F.鉝X_pyؚ\Yg{qq9Z^^cN,AA<v$VKr󋝋糿{n333pb1rG o9$̑2aY ܩ'\~\+a3֤+rHΩxvm=jҽl:P2;sVvM{p`2GW뮪k#YU2d+Yekg۔s-)HY>ÖޖȕZ=7얈??@p]رcDtiĜ*3td6ï;Bʐb'r ,F@maE t|43PA܎m*J{pe<H "Ymd,H3>_S$X[߷Ugj_ٕY7;- XIԔYC}/Z$,r݅^KuUIx]2kͦK$2ܡlՅYJKxN"Ұݻ.cܹsDO(`!S&{+@uWT%V`*#Oy2O7F7L<xb5!zGzr΅X? Qd!sYXvZzT.]+aѣls\VyJhxW'k'SJwԊQ| !gu<%X4oi1+! bܷ2V�VUY$o^E;qıcǎ;Fh4dmL9g7Ɛ4t̙3gΜ;wܹszi5 "fl_C0Ksm6aBt3 `(%9kvLr9+mihT8y<* b\NHӬ+uwot%+[UF\ VU(+W jxyQ9;G7$Ul.6[ݸwQjeW%l-R[z̲'Ypo6(2AbT``lY_YYܳ<0(+`BQ]9F򪬆tqlnXզDTzqgD.CRnL7h4wC]$\;2HTy|%qjGoyH(H%y?VUJDВlxxVCz`"b[GL9}/]%e5[Pztmc#)۹uNթM^v?GR:p%I=y/<g]g>s=sPQAqV/({g3v~x`p) j9pCs_LʓMlp6Ԁ81~XoOEo,<؍D1uUbJ'#+)r;ͲE$':XN5A-? uq2"3zrҖb=*s [qz)QH^Rwm2%T:y9MDk GAl0Fzl%@fܔV)J+(U=\ 0{ԯP%46Y*礈0QE肼,w&jeqKURk.Xvv)QIrfw'':׫ԃ$-3v>.B(y?H1+e9R:bTDά<Hg;;; k@A@&sQP*3PVƸ5M$Ɉ'Xg@H\.-OD"U +H]`\^ l)#¤p\,Գ;KC2;r6'w.w'!T ! y_ jRYȢZCM–׃ W?e5T&1/OɩH4c7oV-/9HWZ_:V>OX+  ߌ@+AQ! HGX[a/yK]g둖6$-aZhIB*TU9,r@QI^MaxNh9J/ Iɖ @L䞕ws:N[ֱSSp>ƺ2KCxpw(+_D:{XG`*c?jm5ocÂ+RA7+pxKf}x?]^6a)V27&ِC>Y&r>ZSFpY'$2"nJB\syq 09XKR7Wu/1_GQqy,Vɥ\'P 4ZjA-C~PqZ{P~PxHJ輔'ekVb2oFr\6w>$CC;jF]f4FL+NlI+C\A~F�---}p@ Bڂ/}a< F/lU8*t9uVFZLH9igw,htb-oMwcKF>j5ȚgtHS# -M)i:u^,FTR-N($.OVتv:DDuҍ4' o "VN~ibgh λϏ1Bw~&7'T_Yw4[yyC+7hwv`ܕJf٥BV$y<V"DJ%@E"T`կT87є1螄{f+d)l<7Q1Yp>\T(R�_x9QW]oA9j*5Lh%.@^u=0X% m.yəL&$Շ\<9W/4)Ykz.T=#_Ln^DoozMee}\.T^]ah߂VlN~eW i9,h=Lv}?QߤYajXPūj8. ӯY IK_6/!𹂞3)痤Tן\뼠JsNd5ZQ#S$ٕg=xeӌm-;-queK.};?vǎsc~jɨV(E#>0U^y缏KԀHϜ9C\'S,e=WH{cMT)e6;JozAz;@M\w@O=êfNfJiOsՃ-wk勱]BBeGRMJN3坺ĵ~9",Ά:< `Ωu_P$ hk]? yEwETa9OCKG+\>G~#Dtۧn;yq$H{7h|c.InSSjy?qJR4 IʙQ`AYMTw׼{\VZ|uz`},^gnmuŸ:bW]aioæڶ44Ee5Mf ?9#. ڈvfz~ fq/Rq+d (NΧr uwS'R}Bg2 u]}>yuGnX, wpe#J,^"ɖR-g,Hy;JSY V9Vv)9LNN7Y]v�"ĝ /(d"xW.ٰ{t(@GwDT: gmz{gmzm_gfO/׿wiE[Ca:ww]Suc) ¡ÔȔWczH$OG"Qe 4Y<I9 9pӶ>dnҬTלTǸK v6%09ukJ VI_Qu3ndNsǀ7t#V#2_C]cn I1+@ W*)s,jU{N,nyuuvoGFܓts D;K>:DO=َ"xDt;@NP;I ًʨaTU.TTsM.WICy_CoO#'@RN[/}'!7#wS^Y,!e־~ dk5[ ;mZ'ŤV,yJ IcDԤf*ju]wM7$|;nWf ]ʛG IKI$[f[G)#{qJ-)eқɚv8$\YfNCJ,Q#+–<ƕ�� �IDATS;NDlG""p=ln֞+(O,)Ӓ8o^ ZDDȼŐ#EZY`չåsZZ K3Sv֒dq&Eipb ^QeEPx 19ʪ~ͷF|<j~~+_&"G82ۣCUȘBNHza9IK&<+@b1Oن$̹Vsin<k|?c:jrgi:I˺F'I˥yHtu%.}7}U.V!UyU`k*)4 ,}M[Q8FW9'S*Z1\KN]]./f5 miv*&n>_J o#wح;rǑ AwuwBY^^,q2R$lYU /yUb�~4U3mvw^&qgZ[+}_ND5-"&7RGDkpvQdb{h2][H͂0)v xɹt:EŨ,W^.GL *$U*@T$˫|iƍ][w>I - &wy vuښ}Tco~᏿@Os6ѱ%s|1ϕ)c*SuFc'4Zg|otVejà_*4}J7?$]Bt98Mka߯5i6쫟/{H ҕښ0ˑ0/UFrz?lcY-p95l*yyyۤ8<϶We9,μ0QVi ZKyk.kg0`A�T,n2EXe{?K_AdрR0ȼwnjQK-50dQ@�1@{&ng&d4 Ort1BFw7uwCuS:eef$jǾJ87^K䣫'>AD溺 ]FTISbhZRra\<HW'[Oy a3Lx0P9Iq7']0L6Uv~42frFʽAwCfssCx<,@KtIrSj5Bf{4޿S^6ʵ1?eJu$vNGu5} ɏ�v^z3<=j"礘/Lu""4|DNtGGx==gOGZrhw'+q_sRr-8FG^cVTo4˴{ojrVe2*Lu kȷb;$=HnIԍ2ǬjplgTOYi$e󞣍ƛndMMNMMN=3<̇Q6 Jd2Lf޽{Mtϵ"7?o68X,yFbCrX=T;3L~SWꫯ߿/ zvծלѺ<qyaBxkDK>NDԾ|3<X-SDE8ԝx費r*8SJYmϿ̡W0]ITi }7nCr볤 AN?ש/1(>!\.֓ 7V:-:yy'A;OkN_ԤPKRf?7y<r"�do sСCǎ9-)kzل'+MAajj:NxsCz�Qzpp ?JLx3s 8iՒ36/FM:/r%|ڎ~;W(gt1?5}>SF8I'[I;ݼiѣNblne%g|T$)Bg4 krFGv(?\lkmuV5Wq=WP0y8qR62׵59oߥ^ȫ=9lw>sGokƶy̠uecW_(' )teklHt9b/b8r Ns_$> z}vmD9&O|NݶGngwhiW>0Չ Rqc;֔d*�&'PDW'䝉92$3} ۅd5eZA<%PZ&M0g%mAj.*`AR.lc&h7CDǠ}6᳷|O "?þ/I@h4*AQjmk.ȫn#r?=lA/m\\p>`pj_bX|%n2"`9=Hbstx]ߠ_}躰K :)|wT-( YG~szz„aKQRr0 YΣhk,˝?ZcF,떰+4"lM7Rͅ|B&mV[6wזԏ&&o/,UA9ku]%pxU;}]wu' |-/AA4H*?6iay;'.5#"wΆ ?cn͔-䣂= ܊#TAt~>Q(Lf;G:׹:dvS !zeLE@lI $v%{-IZ('`3#p"ÙR `NylH滋͔y֤2–@JC>ƛnOcZu]cC!"!8)>(^'O*r&O>pIӒ{ u= ȗ5e <v#KtY=!UBtD䢔<]BuPLt:o!?\4u>]B}ܳN1t8V5Us6rA#NTx \Yhjb:Q 9Isk>DOs< ҽٖlVvJVI^T.˱[sPsD`v;- b:<~n8nWu6\x6:ή'8xL&D;wVcvaxN,S5fDd?O&h&bYە&H7 ._$yA<Lc먦ķU.NK'"„yڒ$B&N IW} !)%4eE&ORaI^8="9Hu΂ʙDr1a9O%ߍonFH9‚dϨ94e}6rq\gAX>b0 %_Di]kc X5?h<q̎PT^߄c "D .Ν; r I5 dh=4פ(YɦM59~͒SݰRf5iѽE^V7Ϋhr !˹smM3u8EJMW9QVŪ-KSWkt^usfU U'gmP9$c<-ko.(L>|ּf 7yXyݟØA09,߼)Ha{W4Z0P2^<TL&CDLd&v⅙iZ*/`wWWW$gG"rwA\}$BB|/,Ήht4N3[D2=ܬL;ADTL) ˺2w*@V?D:aup<?楁c 0'7KrPEW~nm>R1oRMoqgag %6@o4rDMA0Rz=4вš \@NsGp(T*P- EpaUFOI�KݛKGgj+}ar'[JR`qZ֦Q^ 4{L-pIY <Wrijz&G9gI]HT32ze5{PڒݫOz_9{%~=GnZ&z/H!wï7QZX5Ǐ7 h_׾j%0LMMٳ5X\;wuGpD@e{A/Mȕ)T yRN&MӖ\|I+,9۶xYTA>͇$6]bK#j܏vB5RCe̒|Yɋwf!].sp˟_I򮽽B,7]G)KHkXvjgk~JhUѽ4r1 胵#.~Ke61Eؙ 梇!Bcii}jW/RLB@DboJ͡PȣDMuun97IGD^-\)A<0^T5s}izFf5̸ ;!fHmR8r.I'J; xJR5@ gjm:adGmêFV?嬼!p~Vy#|DlƔjeaUF.|--Nl D8ΌtDCƇ?s |#qzCP1AT J@+;Ssa* vC.,`| 9YI*JI< zHk>dG Or+ݡ[mkIՖ8:`f5NK$R>uYHHab'uIHJC o,ߖyR5HJwEzi<Xzr}P( Qvބ@%aL�cVTFpLh&ENc~ <!8cIqx<~E]tE_-]<ЗPUB$Y(8yR.{V|+x8C%T叺둵x Cr8) r4Du@j--]?iL%=5KY+s}{uzS{V |3OC'9+pL)Rx袋@qp8??O&szwn(X.UR4e![ҎX4e,֑)j1c!)6??L׸j+!zTMfD2e p(H&/t%xDv w6,Rk9 d CY@BZ;=朷l rAlMgT{aÑƪ NWJ~#y8V|~gNIxX>_WUW^y={ك{hRIFoֹp>9A%7]vڅ\/x6De8v ?"JR~jQ68-[K:˵ٖKTT /lL曎nY:P\G䏯at:`I#,[(%Z4fC]!/yŅЙD͒ٹ9jgg;LJ${@*ՓMKS#df5ϭc'H�v) +++_/Û|CN7%gcoAo~C8tػ6Oh_/te6A:Z闹 K'. #w:Bii<w뗬^B hGi!9ȵYc{\j֝r<)hy(sU;Tu뒙$#+)lNzcOn=5mUŰ}x K vi.ud]wH1dK:t؀Ehb HCr,a z^_׹SAfCY,[#1@TmB_;aߌ߾g}IJR_~WIk%kA%3q,qzX|[*;* \g-歍Pͤ9AO@ *8Sт$Td0sLj, *6#N|Xsڭ!8ÊyN!ܹrvjI#ҷ"pSzG#ID__<T @޿X3މrjMECgH$D2T߳/=l]l—l߱uRWCףrF٥IgV "Z֗~ =QFUvՐDj ՏZti;`KXZ#~Shkʍ%^V^k9tk L"U5 *-8[uZ*R.*iI?e `3X߁,,bZƹڄaZO]LC`O4/nj!Qxɰ\�u7Ȭ߶z%e+t:=74fW, U>zI=$+TdB2[Q/ؤ1>oxYv_M?S^-%TUޒ&79$ruY \KʽBYj^E^󜾁U'7 4Y\=+F3RُO:U م.k.V,g i>,9g(Sѭ;� 9FFqdAAa~IO$0\T" *.=*QeP-lz~ n۩b_KCjmg:Ke܂4r%FWbi!+*LI2$y}Q:۹ckUP|Nͺr* Q#.˪:̐FH @͓j.3g^:{*-$dV*ZneeXg<(+ǔAH(&f+W\q߿@;NI]i _gݾH K#\.c٬5+#b8DO9S k*%6NlȵPT:CV nTk.Iy2fUìCˏ{wfTvDaxTzsӯ.%8l9t9`Yn8=$MVN>BA'CAz,坛b_d*|o,Y<+2 q2rkkkkkkssssss333<xj!�l^DгAL\1flvbbcю -`|X?h4L _bX|KCl#%""._.Ogr1+rJ 9%(e%Xj(-y8z+D}"sv.Xyn+hH˺""4*w][kFvM:ϰqv*fUW8ws*W9|ΫzM>`yd {2N^T+e &Fcccc dz ccc w}rF1IY^3 ޗDt%сL11Zb _y�ﮏ;|Xj!gpYK |yDcd&!sDA889qerIbԹ:ǵARZ\-G9ץM)HJ%IT"֓Qi"v$]Iy/s!o5cK~A}P gly!nmF<E;mcT؊_ٙ}GɎm-\ǽL@w9;d2{ݻEd nU~yu+Ӕ\Mv\Z\,U~V"OQI`t{*dGIxrh3<^!=JF�K9�� �IDAT %3 ͇qckd< 8Rc6GhbN-H%'Kat~HP9X=φ{,H ]v.qiJpH zMX,&(H}bb ~{npXbǰ7 PpB_6޽1Nx:;;y]0;w_>y{@;WwEauA�g㗕%U[45-}pNؒV=nsNo*5^$$wcTFf7-H2cku&( HPEJRyVFmO؎ V Ϗfb0I�$AQLMH>`gC8QaE1ql *)IHBޓ>2 B3s议ʼ}{T ƾ 7`٧�,  ;O"whLH'%2 D((UKt1*P+5 fh;/C8-t*tv6N:b ?#Hv~!;Zͻ O2srn1ƕ׏T2.\๒V"%{UfP\ln5|`aEMM1 &Wr<Q4on'NV/XYnh-II2 S52:fMﴨbW>tD;ݤ+aHҸ$C)=,q ^mۄ9t10;*Ʒ[ogu4'Cg0Dkrڢ%)T1A]͚ݡ7?p:uj)Q)յz_g^mߘ"JN;}A<O[}>իWKgVtSnv;:P߿;Kz̞lҢMat ݍ\sH\aɵZe#_\^cm$<b .InY eۗ<N|2huq=][ T:Y%( []3r9I2\E>? 1g x[ķewZ8W'Zm HT7|7\ٳg~~KeYƍXukĐD*\Ϟ={sќ[o\/};;k-NFM #7YIG )l^bVҍR^p)EjRG"T\ݏ##- GTd8?v(>R߮|dF0[Xyle:;W7nz[_'fAZC#+Ft&N'p6ٿ^>lԓv<C9e GXn}y7\2ĝwMw9B&B#|soܒҀ4ϖ<IoTӯ-W˯(=7pc>sy}I�[n_.)k oA>|{Q./2Й}Ri0U&Nd"#)Ϗƾ(6v%uS�jelsOZܩIZHEH۞kZZNJ:hB}SaSv35x=/ѻ&tRˬ-m)Y ]q79AZ`ϛ-FO^33 + t#P ?9̵^{Y>� le �E7=π5Cp0Xf]SFZb.p09Lo1ҒQYY Ew'ɸ:nn*vdkS$E9IJPlW2pjhc5r!{tVa;8iZU}NֲJFi\35M)l<nnbNf&bY_ L F.]"PY)tq%Ae^R'+ u2d,6`зG\Nc/@AI Z|ʋ(F*IRyvQ/B :)ifOHeTwY.ڦN*ۈp4 f8MS}4](`愹Cr"4$1GapS#!z-o쵘(^nb+ X8DrkTd~I{)*YqJ \awo(5kB7 #`&*zKXYoz XL2]QEeu0JjhI_Q+[upELKyY@n*k$8f]G\n<+Q%E!NF'`NknM729M?K",'j>;%:mreBL5>X jtL d^/R^{̥m%w$t@E"l>v*d\ϊLxTtYGWqxI?p/z}NfʸuM6Z+)d[o^<S3v.y6{ε0ֵy9uX(Qxq#w.3iY&)FNL F(9IyX-) ~>GI"YƦ%tbYIHgay=xV^UZ]?u0PƋb<`=$C,i?Oxk�7kWܐxJe|dr-IÒ2Q:PZ6|| clCfECTԕy0u*a_%ah.l?up"u 2sk$z(+(= }9b5KY[D$#Y=dQhz8cg%&դsl~132ߐpb s`f^4իWSj*砒_#+0dh;o=սo\ _]\]9+Y؉xʂDkł6s;ng ,4%bZWYd8[A_Lc;E"5r2*Fm! î$t1"(Fcp,Cgcd{-䶂W[cqJ-hՐ"{L{cy^裏ԬC5X(Yt!tN>}�9<tۭ}/*z;ӵTk^M?*kWP.#`Z }ni.ej YL%nDdJϥdVuq:FֆçZLܡkV$] dgꄭ~H̞{iȐpJ-~E" 5b"owP<7Nٕ-aLYŌz8 ^]r%%;dN:Ϲ ڥve2<sw0p7CΝ;GgBSM [:xh;G^8)N'xl/x|Pj17K7.9rRb0HU.|\JZCTǹU׳'f{XCMm >@y.-1RlCDfMjk8_4 [%[uI n<"n^B��." 9pURbŃA*_v m+F})=+F'^| 7p 74Fvڵk2 B sA+TѲ[fs%bb~i&T {FFF{D~KEε-1o, MK ZzĢp3*9"n6-"ʨu[0@T8ĕ+B_|j.`ݍK\^&du- jHte)G !h#ROz UF-`Ƭps76=\1vGiınMΝI˖-s%]eEq {|’oDx#o<WXAH=;OQY(=0Ϸ!gr }e~h*.zœ2gWd6LN zCq!6Sbs5A gaOE,\%!il ̊CrNpNJƺy($Ma(k9z+`OBh<0AjjX쮕%̦zV/�;O\kl3dPj0*{kt4!"m5${^XqʕL/CŞea{ ϟ}x͗=~t9+,&>| �*q87Lw?4qӒ^Bzm.ǎ<Fj-qhyd۾=_ tCEqb+e9N:>{"i�ԂAM+9mћ 3?rSG;ů }bmٖ'r]%JQ-nx^R~YYɸzyח^| Mݱsxg|' PIy+o/^x;SOsko�_f?q࡯u�ݷ} 9K.I+ǼKp]w< 9\$)#!֍bG_\4\ i_WܬR$BKʉ˝~فNLvqWoZś?حajn LG{z[p+~mL!MeH{mhd's,>TƹF 0+tHTTL"$>0 0^AD i*;+ҋ/mu+FJPS" p>OY$d0zgSO>U>#}$˲8 Νwj=+W<z(w9A qոrPhQWBkyɊo*`Nk`eżTXhIZ*n\⁃0[^x aa*<4|S=$i {SX..PF'$`BArP+JE%N`m&cmed@${vCZl;Rʋ̜1q:g6:f.wH*nZK:"g޺ɮ`tb>onc턲z[~�?k#qoFGәTp< s]BMVR"G5i{ʨHe.C]] z`'\F,f$.S M\U`;<v(|�;uYKt[j3a[@eB4SpE%&YWϗj, kDZ^ r8gT{6S8ZC$rcya({))x+(U$".Lē&󯱏p /}�[(朤&k]Y1;cox߰Z_ ̗a>-c[nD ^믿/| _bJeLz?G�޵>}� 5$o]Ԥ1<d"yM`YڕFjz]Y^ͪqZŖ)5tq[8z-`ed u&>K =ҶXK|M[0(@-ms&LmtKyqSgv_J|V6*&9W�$V i'Dǩ11H5fa؎l*`He<BI4BAyl>l+Ql]2kKz{UgY娶ٿo\7J^᤬5зx2:xCn馛n[l0Ћ߸Uz�CtQJu/,ٹA9f.fTXV#c3Ďǥ|QijB(hdv:^3V7q|k$na+(h]z8Bww0m ~f[ќk.SL~ש7�HDT2fz]3><֠;\ȹ<-PZR1XAd'm^xU|\sd;?wTK7ioX\u{{@Sf@yW+j^'ooxw'|{%qǎ;ƿʱWn|{G_zm-M�?8wuN9;R}.r{Yz~Q>e;EoP2+u,pL͆V,uDEY@#5c ٴ Nrcn5]󬂐^IMS$[VfğzXD%L :/#D*=EX$Ys>"oDZ׫*RS]>=IDiD{&>4NG{t[T3fؤm?]U5!ĻBL10b8yX<IAʓYjtI\lg?YhO>o wlN즛ne-[*HիW?}!�O=޻>S}ﻟ9[/[KӜ2'j)+"ۢĤ1W;k8>vK(+X&"rru҈5s5=AI+f4HqYQb(A"2IEd0q(2(UͶOSARÉ=}oy˨jGYcu!re6* �ql$rdAJ%έ1* 1!L&+Q4a&`YQ^`9L5�+laU>txKם G\',qG'y睿[wLK(WO7>x}k `VUV=w9�v{WUPGL yŦQs[ӛd(JX0)lWSlBND9Ss%0/y|Oսu Q:QNlv1"U*2+5 <hKQp05齞c}'ߨFhYZhs%g+!ިdN#$Da~a՟AfSLNMI6un$*^APv s-!A[TSi\XQS/: b>tx. xe Fr=:q_"|3oae>{(;r�ᇿe˼Z 7W^-Yb~de&YHg*Ij2!Qh S:gBk| MruD|)& P3i$uaq` 5äHDwd焎&5"$-5D頮.y0hEBQQ ]{":pS0 U 8Dntq⭺Ղlj_GOeUxC@+6oSN\R+{زuu/�A՜˲` ʤ KE*܋/>퇱UV+g-|Si+_g[͈^VjGy[1:?WfĒ 3Wb=u34 ͪ k8Ku iP.:f "L }$50d-dy]Pp#MJlrm`i!A'Sh#" HRF ?wj3Í"o�ft)gėaJe<9O:T;PJV5\#xyV&^8"&֒lr^`Xi{v߷^olB-9MyԩSNIPЅON jZ1VY,ꟽo= ?'xzZ*Xۻնr"25.Gđb[ro8)1bյ]�9C_X ɴMyΩɱzNhO'g/5sr 9d}!y$]*A pJ__H[>jU9IPC^WyN锎arMi7�� �IDATךn0=uHqR@$qW533H2cS>@oMgϣ.)Usts E!sOE[l$v˄s~[C]KJs-E7p W{Ͻ<Ï< }ٕgkEȸKwMp?my}5(i1NM,CݽmIJ8*S+fE#yoJ=S8}7y' "WWd1zaD/*(zf'aGZTW2xt1"H> Z]�GT`G@Φ102Z($N8A"]�1o$96ozk֬&c[s2')'SFiasQeJ'-[R�&LWηCy s2ꍿ>POͿ ?G˨ylb]ȼ5u%oc^*iy%%ZӭjϽMѱ*gB*,CA>{PtRqpSE32Ltʴ$^'U=r}BzQ:!9 åm ʤy C&*CQ#Z6u0F,MgI$[%Um o@+aA�RbzDZ&Șj0wvNtj#2pk'K Մs*bܸرgcQt wOMǮjZYsNC!Ǖia&ٷ˷nʱW|ϝ;7s>׆I:Q .jw}w{aHٲg|o/77}/xSߢ巷ƷVnr S8rj'wW(dH˧fV:9T @hka2XjU#=)a][қYmb PKW֖(vj`ΑŷSդ Ð&fκ*gsuM :C�i@C n]PF;{  "~A(BvSz kXPc ܰ<3C5=o^0L}Z^qވ=[X{+6(x0۵*+|\ H?ҥYQǂ~_pU8WG{{5WO;o8jqO._8՜'>_Kq{�>mq?޺UY盨IVmQ2YIDeHS֛e @ؗ4 Ez"BC/Bx ecZ6YX^#v % ];TSН9b3B&HTFb<`#5,!G=d$8 5L ,ia NrsiNRɢ|ƀY "m׍"G*KͽB!0D{/-جZAb(0I]GjB/ǃO]y]f@sw^/RHm^{-n_W81j>m̙3;w z[g~FZrM㣏>裏#Xzݻ^zsz{v{jݶ}}ʎ;vT;MpDe1.!\x +()|eAF3nTZn,,7Ri{'bXj|u*0Ec[w|z0?%1tOYEN#S{r2Js cZ{%7C8֋(CjwjCHZ)mjuqKY2L`0W`.-AbG]lpwzՂ7M wFb_0jdnmJeG ʲeˈ[.%%C2;G~EkfI|Qvqgٳgw%A,y51.lY;1 T{^я~4ş<(ҽ;>pλS=v�pK۶o^9*e<szQ>[t^TmRqDnsJرq9MDU (e+A:'l:ݦ.Voe̞Vj[ag,͊ͥj<. 9p_3f;h'x@M$߂IU 3=41\r45E)ɧ[L7Eih84!V5 �IS�YJA$¨6U)"Ǧ?mk%M޽P-#cTuZ*GZW\5ce8 MܺL>=z͌=sNEcez#mOɉk"y1yO{?=_Z s޳OgN%y'+]g?տԞ={L܎.u\cyRR}]l\#L,rJL98˚Y}v͔ i 3]31x\tM3wX4c=tҖ{f䆆҇uӰ WT•Qy(7Goעj =4M# E4]QS )֦bץ&cl>n6lyJyDN_I]xnA�y&Gr >{8+0rk3tz2 eddgݺuu fd:3('g2(|jZ 4eyG,IFA g?YŬz94+V d<uinH{+OУ6&DҥKD/z'S@/Gl5z#AfV38KK2aAiEׄ%LD#|N.RT,L}'&*ꇏ%N+v]źAV|M؏B84=6*߄Oa$ BddwKEeKd"SΌܺ[jp S�-v"sj܌uSE)]Iyw2�ȈJH[_J 2uk}?f;fT +T\~ޘF9- ]lJEկ{(/�/Nh*=4x%pM{ݳG^8SOS{,8* ޞ'ôڐ"W㟚oⲬw>JiSX$lOkkc\&FYJ0f~Z4߆ЇhSsL%_9~ӄohL>ڈ+g-12%Бqƺ8Ѫ:!o Ə@w1Sؠm{?Y>0 F<H߂D7GqW;C _?@_9J7RMWr?p?JDS[[І/fffqYlUPӫV *Eu5M'GtCz~J_xqCsVXAsjժY2yA #-cc_XU ɋՁ$UX"&gŐ-60#I)-DB#|1aBX[bS%Ӝn%GQ�KIk G-H8A%ͺiILݥ؜gկaPD  -Ʊ>C f垅膁t:hi uzgZu*\(*uXr*]�naVfNZ49>YM "Uן=iT˔ą+^C.'"cW*jw NHN3gvuvJ/s>}m[aA27M =mW*fWHe7uF׽`2qPR&e͞!n+G/- KN$ws1`E*=Kf4K@$U?|"_3K.&N/>\€Wg Hiq0M4nsi nՅS%J[8W4iKqM$%ImnvpDh }7ӰN [bz]cj{0CP02D+bQdCS fna-L^ԧ>EIJR?meXqaծݻܮݻ-t!FX9òk-QWj1׭[:ӥ]p᭷l+�},5K!\h@`RVMڜ֮]ka3/<3R/p!E2$ܧ+}nDmn5[<]>N"hO 1k RWz@ag[pdr`ڀyXp)ӆӬ]E 3~'Ʊ~(ǀ�ШA}F)q_6(M [,E;+˄-Jv M;"rq@=cTN"[䈫3/uRB\Z3|DFb/7sn/^g>@BӧIUb NKI?ijFM.]ȏ~#"i~mZ1fsG\1<%iI5k0|r2VYμûɸ hV\f<~f3V2, 3/?fvķŲ0!dq!c[Uj$2̨H!~T(,O<(dL)Di+ke>l˰s(ꒃ!KXJ8L%4+ZN}Q)rs dvcLi $9Eatu= n񰥺Gzs,HzJs `mjh"u'BmAH 1bHh|$T[O~oZ:pB7VfP?bvJ^1 H{�OX`k]y7i/~dw_ꘪ:oM⦮[9'f\RƩ3X5$:n" ]^Z7ݨvu{ľZыY(}]梬N(qkhSW })T22{b,W4O/oP 'U)|6ucRT7RB&z] ChLbV)bj 3SԌ0bg`+cᴓ$q1I 5g5j&s˵2MPjץkXe{hXZfzhgB/:6bl]4?ZĔM1:48ʅUJ �Ec+)3%|7�?\ixmZj [NkxV^- ih?{,Eu?/ >hl*CJO>9g[oI/Ν3VVܦ{u[؂[%޳Jjy98y.qIl {OzJg+`VnU,LȈV3 ka 04l ,):P ~ڠ r\'H0}܄@qTBRI�i MK͂nmt)n.D c_^ÄΛ*tiaRL&:$ER\à+|rp9>c]L& ~+Zg8兔jX4ѣ+L_Dl*u]HKQ*d?%tBsugÇXbW #XydA9=ܞ Epwd[us6/ZYMA<}ѡZ5+k6[E>0'gtnyIY|Z&8նA&CߡV%vU0l1]@b$%&0~v+>ZS84EhͶ5=3bdXMaZ;$s;zht1Ի&_-RZ Zj?MV$Vi nSIKD-�B4&|y6Ʊ~ t].Bj기k#=mm..=6Xɐ 6d=-.rV"Ǩ4bժUX]oO~7xcժUt,qb=wa�&E /^HFe Y@|柰|ʕߑt^а%%QMʝFFF"2"?;3O?g<>G(C22DP $W\ղ)0Ы-jT3K܊Ec®s`xghQ>+5BZ_y\ qY:)E=B8f_z?Kh_8k Ť&z$qdư/<Կ)<aR, )l[N@/*"wK^fIS3sӎ?J|㶨 U(8l#zHD%b郼{GZu)һ~t(ۯ{qQơd@+Μ9)=<O<9sXlڵk׮]KFKN1uoXªEYVn}=?+W8!9!x\}`iԫ$5X�jĂVg.xEgbazaym =Gb&9)*6`F# C[#Gi(}(3{(lGM>gfW`7ZB9:܄\ iL)-PC?N:8I/0Gͼ)3#l[cD>Ґw1 [F5 ZeТ QMKD3,mAv)MIBl֪n,] 4j~`�e᦬vൌ[FHc+ ooiJ]t _ܘ̙3#޺u[sn8%sSNwĐSͨY=}'!{mR/BB3g Nn]!5 *PsN!^("(<B*Zvbn}|!yHyEb&Q<,#*2Z #IP+Y+5P6DFEJqj4S6$-m0  X?m?fTSvMMF*!i LwV'TRCfMIp'poнTgV<Q +# j%-ҏv7aݔ޸*o;[+'HYsf:1gsY22Z񡬼SoKVHzN۳g~}w.ޢ| c둢LoE)&/^tQӭ :<]e { |C9cVNe)%]? K }/b3^/^>G 0 Bldp(0jaP )^taQpVH[TsZIPMX7Ğ%=vBv@ ǀ+CP8@A|p@O'(~:遮*Ud\EmiZjs]+<ug0| 4I 4!AMDF $m2y@!ABtQJܑ_7 #MӫjPǕ4M%fV4Szƫur1D:xHO<yϽU.8"QWXA$`vv֪?YbyivM9j+ YLDj'4őT."0mRWwh $jx=8:3PL, 02vow`(8Ff�ɂg`VAV޼(81)sЬI%"E#f{h*/U zgtw"G?54b3i@bbSR'ng�:plbO_7H:EЩ{m45n@ Ѳ1ˤ0`baCpKhuweY`кLgVVE͝<tkl;.;wtIRj�� �IDATC+:.CI|WXDuYHndd2g'JWemμ,LHuJWFm" #3ܴ3\HN"k":^*(3B);q2 YMYQ)T2@1T\AlǘTv&qg 'GoZM)̎f'2c%,ӥvP5I45Cr.:yE/{54 ]lJ4J*&zZ.LxR)-B{(Ilt of© hr\G."rɠ;h68u[+׺lNT-K<bNFDB;CByw-3=ʱͷl..s-Hj+nAw9ceΛ筺9N/ZfW,#C;ͨmſI8ςȉ)-Iʕ,^5 2$T헷a'ѭ#i@=]0K†\*XױSesں5DI[,E@@_G hz[Qa "-+zNpv�ݢ5&ݸ]}iy6%kƂ6Ī_֩Ek&>6+y*AWU'h^# 4(8`?XZ-ɝjv 7˗/'Ԥ6]Tر58T"ˑ]Bڲ8ܹs iZأgXe\sX:U0m26),c2FN=NP'WCBTP/񵵒Nҁ=69J A- ӎVn tpjqF@CsgM ci B9 Un?t"&dﮣ 6#̠*.ڄuD#|oRZա[ߔz}RCiX׵`N .Nlt hɏS߰1SV@w1kwpRAa:)khkѧtqBYx]8 PsjRH] w!#B)¤&R72^2dx�|'"\ Tk?ƩCm'4ȄއxŋTrGX+F:`urT'u&A!!343E**:bM%>-|f]%p*),`?6Y).2g9 fUkO]f &ƺ8!.A[\qC8e'v&8CD6 RKyBeq_$d;8]%�qlU`ތקpz|#7'nJ';�П)5aSLXh pFˎfUshwK2)#`yAvq\P 'ި"+\B,~_gE:Km#GAnJdIRT%AplJtvqsBY3ݐ1j<gnN*8j|#$KoyFZV-m" Iٺt׃0h$/mǨϪ*tee/l\i"2V}b�ɶ]DC/>QGr3Lvufk2DboJǒz%>]$&M|VY TҧLPM c*G@7`)>MI. fAҾn1PSZ cS8AL%}r.rh2ճ=fg8Q({h;nBIc6nG[`zrjd _a[nde>sbвPYBƲ{0Ȅ58_rS;w\(;-V&w5QC`!1SyӧIY"3O= mehaS$낸]ڕok D+3+ugЌ,9:I"$Yɷ5)8P6D iyz_)|B簱n:sj6?r7R͸%M6֡v" [+7a1 AlaFMG`@,kO]ric^)k av;V0:?sZ0u*2r]e6Mz3%N])S=4k@} A3Ѳ{4O0A"up]P(I>vFc=w%.s"#x?n;,Y=r~ YsЧP Η^|QWv,=;|gɝ;廊eSO?=uejΕ}-.Ofy%N =.Ffdi*6/r�gqIy— <O7zZ)T$<]@>Zq%bQIDUKYL8)zDŽh)/&NB\NXax&=+< v3'n^GvqLSfHh%^)&'jTe!AV0;fF1=/_R,Pe0MnNAd㓪<FtEPYn#D:Žc}xu̗&6FiNj`uu Ԅ}w.@ӟB-/USq;{?gZzm+S+] ql&O{ZlRZH୷Xvp aI];i_bwXK]v# ]F1EɟUa9Oq䶹8Ԣ*H\;&|bU.N ^.QA* W1F=7X"<+0TzZfGD ;"̖=ʯG z@fJ.n^<a`Q:lºvSؠmnqnm-M5H;/Rvu^ҹużu1YCꛭM f'/:On[ND.@.!,W7;f&S8Sj3Z/Ghfβss/ܔ$Z2Dlݖ%G?%H&+v_)sמ}nnҸ5 ;xY5aE\uѕ~tCLqep4δD\c9%MĬfu*6ŀ4""X78ĹGXƪEjEo^0䈊ШQOLLA]۳%9aZUDU}(<QN)ffbiP&Uة-bGU%Ldyf#Sy`<8Gc #0:@Wg�l6}` juqm2yB.EaȌ&kTn(X {TXْZ�'(]"HtwzRG ~ n=AEV4F/rҋ l߱CM�^h2eBuSRǝnvqtFӾXMq-Ȥ9tAV V|bk.oeuuV¨6.pdaD!7)||D`j Mz?.tpΐJc8%aHFgi}&5I0lޭiehS'-> -@_kp $"IsOmJ[tLVsbK,9Tb_khPW0`AjEy NhoƲc<A ;-RQv5LЈD Yk:`Ve?8K}q*7dT/JHUk_M� dm`ϯDVIk ^>�VUp^tyL}/lqÚ4(y^VE{sE i5%v9|p|/UֻK5bP]Ӝg[kyd%ZۗylBeA$e9ޥLD^t" 덅qh]N`¾ %m T"¾^4&zFG81-gPiREMiA U7S90 @W%#@X]b FuDkV Tsz8�863kfYWҸ8wЯk@f#^�Fwi!.5;Scʬ2bt:MHtZLr"*"x#ό'ī|e;wnʕK*PpʕVIoxZxP98z-[nz,]0rJF/)<&7vRT]o=Wڢ݆KZe Dd*qk<ߘZy�޳R/9xZ˺e91 ]3%[Y 0 [;Z:@zܭ AH<w!G+ASNo#m݀6eOɲG7j~U6vt1eMvEWey TeBSz`Nfd _ .Fzh~a=r7Ogf:}³V܂8lvd#Kʦ5 h~8Z{~$ HZK<h q'0j <5pJcHN4CHd[O09,i dqU{"3gOed?? _FܶدgԼ^yW^~e@vqGc NA%72WH,j%@e'n^Fo +W$ x0\sa[? {޽% 2Oːf)/_tfBܗx1ҕmIJ ^un}c´#N"S ̨lXQf_*n> V'̈35ߘZԨ[w(Z*u+u`vl׵=%<$)eFکHUʫ0pS:ʤ|<8> tcׄ7)PQ17Lc Rڂt1Q%bWUItI@xzNRV{r\`Ѕ fE6.I` �q`D?{8p],naQP=2 zDzR]RƋ.89I+meM<z[^%Zao$.ϐ+e2o%@G+uA'n_WU�'2:&*)׭Z*t{qG(nݯ@'8R0ܶ}V/)~yIY|ٌbЈj9'L[v8a|.YJZ)VoYizs'>1mT:AbƂ&ʛ&Uud'pL!: hI'3㬭vup[-8ESр : 1 Xa1Hqhl ?~ QHwI)%laRӒx'ߘna*&DZåX$Le&ndh�Yi A3]Vyx0` fL~þ.F? HIy$jt/z_7Ocx)Pt E D7L�4fq7Uȅ+hCZbb1=[EkUC/ҢlQ|,k"RBuu-i/>22z,;wt+a,(ƭ/&/K\"Xm۾m۾PR�h9sZm᧘e8jJ2SC'&LL0+eB/)a%mW7 <2? E DǬѡ3b@]ύaRtruduraBtH  !œTXiEO,8Ic 3 p [tF&zBc?(=yL^=4&lkx _P'l? ;154Th-Pm ߣ n><Dj¼Ũ8 [hi wAG/zzfjDO)4NO'o!|d!67"Iw,B! .UF fYX~@bRnQ董ҹ2]</_~;y'1 L v `$i#@|8=`'Vm1^I[-ti̒^|iDjK*H~X9NyGÃbYIyz35<6Zх٬6*TZ9Qisho"gıhгȘ.7BsJU5LytqL}ua[>2"'#q'&hq2ia $ %&# $x1<&lӺD&Ʊ3n!t0y\l0%�m0QԨ&eRҎX̌i f^:G6IzkboDλMK(X$<hFI4 ?}Hq c:kpюD4DPb3[k0h}.2gԼ4*O"E`\#{ C^^Yb7)x߳Μ9s ˟]wqǎ#/WܵR?kr$& QN>̳bEyw#)ukѧJjyD_L'7ɒKȚH4}QbAKH0q]7 Pm'PkM ǺHʼndVҘP?äp˃Oi(DbҰ`.!H2J/n6`z#] `7 -؄馈P3 ($iT@ _3it6`S} PF[a mu0~o:h7Pzdhn�-3@m<8+v**z)|~ːOH 3jc= .}*1R#1ᙔx%xݲu0oo Y\Q|gwYQvޕfeYjժUV]tzN1GEja|'bIxꌲt aj"IS' 0iZlPbg(d%6!{u`kJŲ(AV5\o뀉bQ'vqΊA;52Lv�$B5wqjhL֕0Ad5\U%3]n}t 3`@. +~ c?F#t y 8:<Ҡ D*PAo"]B"a4"w)mA:H[hbz]vs �YEz]hܡj>ph}͸q }Zh J:?H-uv Z娉^7�[.gd?$5Lt.K\(tc,[kh qNpCJ/s̫iO<IE)||/,bIE5 GV^MN>gJ钯ϕ6}M%nٺ^&`'}[=^D>}_VKa{HWũ.k]9 ˤy.bN61s2s=𬾉+S8 P•X[-KfT>V2X%̂4:gD&<ŦD]2ѝ{GԄRp}G=Ԙj\$g(AGRNQ|DYFQhdv:M=5V|Lٌ$m(H^tжdyU1LѮj{B3nIQe8.NLaCMj(ZŅ+7`ok dc$a!Q;1%'+IrM朿d%3X?i&BY $vmښ[R[ona %cʎ↋/I(+O.]5ʐr#P>txۿMdY 3Hu)PN"r1E#Zt3~.5+&H'{ 1G(̅qD0 3P ˑ51eDLm,HT0o-#lQshweZ@AmrSD�� �IDAT]vH*,QS3='"Z 5H-M ' k}RicPi,+Yc 0&lMX6A7*8#%Ҷ2UEf `UsMAňng=BJͨX ?ėjЧOcN%δ\Y:ҲU޷;8KJJi.c} c rOM=l46a-^q3 z54_Zw-*7g6B%~<"ƕcQx"IQy`0s/wywq^'|caM0ܠfYSN;_E mi߽߸'d>ؑIYK~"`>Ћ~/~{_'ԤY54GK#>&R\"H3+#4MXJnsv ŋr Tht:܌9s fD0TjQ bxSFLP!A)0aR�:=&b*k윇<kB'C�#P0BU/܌܄ }ҩ)oZ uTň($_k?KNR8\#jh%"F.fzBfZ@_c:pEo/3M'6n>7  @f#X;8U˜Isܺu֭[Gn ]k4^z񥭷nn[]6(S$NL rP!):z( 0nE<~o@b8ZPΒb0BJp{/}qcM 7sNc뮻?뮳Z+$~]_MCJ<eof/fRiLP"HL~BK l\\J ly<8)uIHkCUHlty{/~qP=Ř<l'=b[ChL8< 5k`m ͘*N~cefDǰfr-�0F)R8z Uƹ}Mjgz0A ?DZPt+q,lw9u4CN�'w0 ӯޜ݌קNC5|egp@%ˍ.ڴ1"n'�p7"4LmGl׈u/d0Aʚ>hQTn^a�p=6eKh:+޳'Ì2O :L]vZϜ9mתn?¡w�`.\xRe^fG+d>Eu/^_]b5pZEX>iIjxjNJ\o Tv` BRvNVj b&@4T(\~)lRPTPA+D@-@sMدVj}eކu|lºRH}|"V_=G60fzhކ uLЧb[Mʿ`B2Gjo%LbI{:8Y+UNlQ؉<d͔ILw�uЬ)o؈|{hրrMZ+c"m0ņZp S8*lb`>y&1w'g!nO!jQvܕhgwwUxaf_e"VJQ H 7E7I׺yR6\qy7 %E%Ef*5k/$:d<;w޹z{C|H~ He9']nJ0//._ {@N &%n SHDvZz5Vƍ~AœX n;A«2)u27t9(kѨ]Ztv3,W WD"7I$W/*)@K)yM$mK!!bӝ"id͎n n>*쓔74TD7o ?S}4T*|}OYZ%dENt;{SMz`JGShk�5 R֨f,;zNKf0Q^WEO%U p_E/, Ec d3u_ q ?wyX'fdˑt%ٍ�[A�`(;t8nmΟfq&NL<Db iB7#Pa;p=Cmҕ:M[cYǏ,I9@)r-ri=<uls LGN!˼%٘mSXOisfK0/Q~L&K\blS}|Z>շTNw}pH%}2=G^gq;~|Fv�}k@k]C/l߾}?N }_p)eOr\U׸+ݥW nu?P!]M"6.l8AN2I;Zn,v+ռ\$n8g˂IĶtXxrhЙpC:3/J$g#4XoF,N׳젦J:DHaALjg9Hkkf&dFs*#PӴE0Öy@+Ndcv'yP ՙ2R 1uYT%2w@:>A(]i1$NvNAi fŊq&0,0K\ROHQ86b|v6<xLs<a}ON2VA-LJ!Ί6&?P~kw~{WxO~Q-}4/k<u\G[k_ moh_y <53}oޢG_=wj6lb{O~ICRVV:bzWg,ĕ$:Ӑn q+RS/v8GhNv�ڽ3ts]X. *aձ/vZp&k@( k|NgⵜP@=t4 B.hjbkϴsD&g8p6t&,3Yp:Ř®SjBT#nV!gR/╇iN|q)M'gĀ L`)lmAxlp:NR.U2q2rZ2:,&%+qV JA hij2^P[Lq@66JRaNjY Z8kTTo>y6^KECvm,vk_+>Xzׯ:,E+#Dw17Gq6mxbd~bgH�G}ﻎN(j3l{�qñd2y96r֭zIߞƍUtՠ53{[aQZr_|bUH6yk�gjvs _6%M{3׏Z(c!1͠}^X֭#<[DnXgATEGSwFTl;sR!tCq7Lɤ7! M24ti!<s0y&uz^!OZdhC$2NMa]P*V81*g킥X0{!�WZ%# hv2G9wꢍ8^M:+B:N898}.EsiRf%i?&1TRN^VJLaӟX)e.G*런H-3ЧsX[(Qҹ6Dxz? U&�,,q){r}׹G^?b蟗w}WMoWʼne�psm˖-nBR}3;~BJ>s"ҳד6W+ '"gyq*s(\TqӧϚsxd3KgDHmqs9N}Uq Psڊt2CeC.NVMdlb3>iO*W1BN;ls4g m ucm¯Nb5Bru5Ұb$i(AL1R%YgI=ݡ6F*q́G ի,{2Tk &2zcrIUI|Z$#{vD�HEe̛Z%LiHs\eiv ae3~>dcmcE~I>ఢEyTc]wIm-ӧOGBطv[cÆ 74.jQg~{Oib[uuwu{wS:Oϵho/#F8~/}t?jWuTx_mN:͘7o{e_x H4/a-xoMg•NBYt܆1An @gq[t 6NC+[m!,~uhe,2sI @wJ'eS9IgbۜHWϒ.oQ�5gv>v<7A(b 'WW %S^S$ J%g[ /CY <x'}&0g˦]ZHQKSc\T Z|| +oq<Bz< >P!jJM`c>3l>Yaм 'b&{̕SDNcKdXQg52ZjdcC!e!7`9c8hSk:4~|&˺ K{pNelٲ%b4vwoSN;з_iaoRS_3 8^)\(Z-UUF_$i?붡_5{vHC9njQ$mrml^?P ՚ʫ PպE'JoqՕ , @`AVU-?dt~b9#ITb x{44bd\-+T b:*Nysq'";aIO=q<R`N w_dTM I2,[s㥙3RPJ3"M4%x)*I1&`RSfZ)}~mD)ql5<OpqV5%r\�ijs)>  dd#:3*cr)PfCM=6HXa[62,8*7X gil+y2ΏF[Ӏϝ;wfLM׃[DmeeƧ'?O~C~8ce車/7n=ΛRI=nƍodN*yʕ8FPslvHC/|ޡk֘bw:tDs[)Zb0.wS-v[:kbr_A')z@9He=*C:n^pƢA%u9<ӘA;1$; p3a建K"Y{vz-LHS+u΂ UhĨ5̕ '5͕)ٕ<α xR䜇/Y,̔eIqs:؊i[@gEs,ST+1NsNz cBڕ*3bF]\$T UiQt^:JѬCBZ 2 K0b(hä�\.�.Oڴi]wi;{=V0Y7ZkYܫmٲŕ5EW楽\]˪ulϟY-O}M^y͛])z]8"vY/⠍V%+|[nG8# ڀr6UDZ(:ZP$7O/!v\t?WOT WVMƊuEc]!0EHB2>a*&vSfP0b)6, Q6%`qՓyr^VRx eq+qQ'Qe$NS\+'cs$ZHxiju9ȡ_%~T$U2X3Ut%]gA$e-g'ܝ<~Cyj%S|J&1fPĜk Y/^pfԴ:L$fh'}vw_=sڛ?zJ ^˯'\z%)jyU_OòMgo}ŭͮ?-0Vƴ e% cBM=m-N!]gtZ[Fktfq4=n|m[l8wcd/*bLLhIQ3يP6@(' ZV!*;iEng:c ᥏*N 3T+4BCQGrm}PJf9}-]0-Gg�@(Cem)FYT-wǏS -06fA 7 Y ΪhBN:q8!aR2Smf"gxJ&H LmpǫC _J,~}$mï2i-=ERodz gnbgËj,ήPAejj\ڲe[] +Wkoo=g{؛bzniߦ.8o Au^]/Yeπ[]ۦr͛{޲e.YPtQٺM:p;"ҍ^/w/z6wdf<GS^[t-:莠D\�s>>41+ccel\pK֚7y)0lHmCCn:w9`ڊjqY&' Լ4Y�Ϟ䥕%WF;3¤V6ǸmiuEF=a4�j9y|9hm]SLLòV4GJE~QmZ'i{E؜Ø럧Na̧6cwS1Qvg[D^9+@s#kjj1"Z?,9s&e$oN798c_{Lee=ǾS%}7ۥ^"ZDܸqȾo ;ͦ68qsKzsw/pLF_ͦi6ӷPWb'aVpZns8oܸG?zhtg3O﫟YY5Tk8c\`E:Ф-.iO $t[Z<\e1ªɁ2JCw9,6LN'Ü <69s->1Xg!Ey0Bʜ閅ӟ)ĨwhJ3Ld`')ǎ*'9I{Ib:dv#Խ[wv@'R&YW%3fԳ/\RI0U#C>}Zo{#2`ExQj5bLoi6,P)lK1&x2p<Q״IԫTɘ >gusVa'MώNxSt=&:|gg}bvA(VjQF {%D"J///ᄏ?jnLʥKn֣?=ȁG"a^BJG$#`mܸVg}hVzk)۽~ɮh׺z3qa=[tZ8q`L6s= aى'PEbn.fQrDsY11&0NWE�� �IDAT8.D8kBϙT*k(b,ۥpb5n2u[ ęTNYNh!MM易.CUqf C&ְ)"fp4dakwij:`hjd-fv2 J1V%6\f<5ͩ ,#3> 6o!z&K{ fw-fAM0*Q5΂NSYEFKd&hHi :bJSǙ38Bq`TTa4Pau\7 șeTfn]!mc5փ7^{P7  s꾿ZZZz} A͵u(Xw}7}mvmYwqwܡV8k~bV$,r$,n˿oʤjS]O,"oF,> |%g¬n ݆ݏi[I`?[WBWv5fı7S4?;WEg &v=[4%뺟2Q ےfˌ2ly%tcpЙr)3_:nXd~NaTlIVDq˒*8q G ,IQܨ3Ak(Zb)=NJDU[>@;X =GTUP<&%m=%Κڰ.Nks]S֭Mkܧjdq1D /\yfu ҏ^i_jйG~ҥh ehneZZM$;rt;u_-] GA.&V,YX"շ+荔17oެWqO|:a_I&}N"=qg mܸC/ZȌ؈ʞx_'^*=WTf Nb׌Snm9[Jtk\M5V0;Т]Qb,a_tӔd)Bmع &;3MqJ{鸩)Τɑmg>$[ t| ͹R!/FX0ۑ8^?grE͊Lqh8Ѩnq< fPQTn|iP`Vқ,S<-4P@&N<ʢl'ͼ  )QpJ68x Zf3]3yñ0I ֨3XgP pZ-ۢt6Y4n|uJ=q&-T5J-耴ɥhx`1S)qm7):Cw/\ 8~_?_?_YYYYYp췆|.pK"kb )FzS{h4~=wܹsVVV\ -M ȁG"9_׷njcJA7ng?{~y;b>hiGβj~oƯ.rN5P-h)]BAsV w"Z:k2 Q^鸸 uFBq n9C( [Ɏ{@T E9Ί T \f)PLSo{N]&in>IpUE+:ivMAHh CU^``9vwsB v<y]b8C5kbf7'y}XN9ES"u1]~o.U+$S4 >IUՔMQ3|ZUYu8{9J]p䲌n1jT;+흀)q&9 *8YYzϭn]+9݊KzL3Ί[ }poI`b?߲5]0bNjOiӦM6ywy___嗾/~_?[q{ȝ=e; mq.\XHI_ԓz:P9 ٟdy;הjR 2ķU~qFUUk?qC|R^*}]5~?ZBU왪,wpsuJ.\ZS SJW?тA f l1'bN6\pbFS4.ޙPylJBcДP4ǺC+eu0zIS،U4yK@͚ڲSTxyGgـ1]|@[a6j,)2Q#<o8eZg)h�Ҭ|u)v.u'8Uծ`9j\ fPKa]5ԇr\cSlXY fAjV?޾ v8fiNxՖ+SvLu뜥Dӕvݍk1dKwkB՗Y޸q T9 }_{՗|7}ppp$1mw]Sapp7Ν;gRnZx{tnṯb ۈ[Ưao$*YUg,,a'OεZg_<}z NdсƄ[y-3`c. )%^Gad[̅"1s})W B_mgгHhP-PJ3vT3|pV];E0;6D,Q-t,\xV*)fPID>?xGme;bf;7x9EF1M9,ýW*I^H՛ gN?%F8wJFtY`F;R+=L^&̎(ݬ-JjyQP_4 s ATvQ4=8qf1׽NbYq9 Ϛ3PNS5c_eUXec67+C؉ot۴i|qo  {:~y/?pcgCvb͏=XIy#Y7,3r,B|b`ܛY g$rJ7.qe~7s5j ZޖgW *`=.n6DDǐ b$_L<C_OBo)M˶T:#�I1ՖiKQAV(Os@%fۅñFK.SQG,OF{86MNLk =F*`[a0)|eY+R3,L ̐*S,-2*p2WRLvΜa8saHnƼE/�|=IJ}|}^V @O=-φ2uŶfP4턭2W[(QEMN3̀d@/:\W!qJAB/eVeW]rFEMknL/_=`a[]L\ 'А8%|D~w°~K,�b/ t}Y_`T.rSs6mzglv<Ż[׆DB[ZEK1Vw2{2yfu,[*6~_ f&ZЄrV&Lk`v\qrnPK׍ _CRZAk<k*hﴐVN #a K8h&4MV BrlK5ыY&ZS,-`6PgD×~13)vsr/SgԒ?A[?a'X)NJ䝕 n'y8{JSfW(Wqxy ̃ȨfIz(U)ef1y@.DŽ@+4#H*az1j!92q0�yjgbpʫ>2zlwW^~E:<kߏ,j~[߼&9"uc!'D#^}ui{ .Hª=z辐ոF>є_&dZcG% rm}^DZ7߆̭8{7o#a15ѯCH7kokj-KRage UVs Na7(mSJ5? lwg2I7*]ap=@,4!#/j@W -h3i&Q5G5CsLlLS;ɄOX1ݜ8AMRS/2 fSF:θQt*٦Cc <R4su.͜[ܮf~=9Vd V,yFR$ԇ EӆwbbLfS\bJ|#V &2): ~؛$nJ"uUnf]ST B'ag39'"*~/_ 4K!Ft_t]uyyY#p{IAιYs,uo- [_5\c$i=\7u[H_3Ph6:<a[".?E_~[{7z3NYɂ%vB#RŘE8kd,# sNW|H^4N#6EYS-ua΂#Phb4\H[4fqѫ3(ce.fT̫h 4j ;< iM .I;x<b&`D$g5SO[c(R*afDa''(q6oZt5Ґ[ -A`fomUU(3\9n?j<S4TFij"y)06;"|13v!dݩ!-Em%yj[̅-?F%Š}GdZ桿2;=_Ng+}끑'7S~s{[y}wo~O`av})ŧCj^j;n7nnN-qu?ёIMWj&>44w.Q{Z>!OWp#'C1v砎?.Ϭlt'nu:sݪI _,tb mf^m˛EZW&t 8lE=ֺvKQdAMqV:4 gBU\DLTiv΍3yTHlBܑvn8f+5Y#]!UӳT=4$){Lggii;nM4xLLvΈ3'%2LSkğ`')o<T[̈5~.9Ŏ$=wgMx4Ŭ38Dh[ƕ΍%)[ nWoh,F;]q</YLh\<z*GFW ]_ʕ+[nݺukz;;!X-"y[?XuR6;KC/^>/~_zWj1о~r'V/)މΞ={پ fbYvX}us f?g%.\5ѻ~YnRf 8؍9:?/vDmNwIT^Tp9?qVc1af殗3B&RI3޴0E(L eHJYSl/*ygEtp\2@)B`*Ifu ({+$)&4WW5˄)l"sW΂=dr4θN:gw #I' L {I?ZU!{ &0n;)c!̐BS dZSE!9̣)jolH L83WY,W!=ΤG5 m*"6̖5s* JY1mAcd$5/e}g[Vې Z?-0 6NH}dJFskO؍V ֫3{ͽ %پA7 ǦMT#U}ͳsM?o}x2 Y8 ibE+*]rֶi/tf.*VDcvu eg2 p:F4Ж #wh:Lz 0b;g̶e7gLvBMMَ$Pd+uILSScE.E3\)m%+ƨf >ϑ_EFŢ8"}0c qpEMF) TLvp*`8#p:Nfm%Ngha{d ?6;8a܃uc7/=L^�yg|u#@K #uS,k12c>q+$5c@  ՀZ@P"bA8e1"S€ĭXqčkcGP!3g;S ; -_[j?eS0}ї5sW _yW ]' <ܳ+Xjjz?~Ǯ;:+U-܊ۏ>HF7|y> }d5ڭS2U#\tq^tI m#0Nm}URC}zz3]�u7/mAgΒrr;:RjXiUlmfqfL1^[mֈ$!JHiu\=tZg0A>Nns ;cE3u|9A9_%P0ͮݜ8'"@kaXP=A ^iPMXw>W58/\ N`684Ԟ8Qfe\uEL nRq#1(ug%e65C)^ilȂ%C,jGgpNKS`5PbKuBQۡN0KV W[ 6GboK Wn\w+ݰ}՘J5e#w[gy6+}J'Wξ^eP:nY~ѯK_}Wo;[MD}hְ ۷[~|E0Ly7 m\65 ]}Q3b+>mkZϧULWb׿ƌllWF}^j@1[I.tGdL #0{; jX݂M>QLhPy&DCTa5-ҕ Q#=+6s/d f%DX#Ř/aDIrK/1<F?AeQpX'nNgN^lIxG"͉yvjCZwpJ_ٖgK3!s�EtODFJnd>ΊG01)N*$k/r]1>:@{u]g,+$S*&sMd]{�$T*>$I176bum џ}/vGQ|#Ax//////_pAx6j={Vٟ8Tvk^n裏VekжK_pmq|ʗ\j/^xE9;z$| nj[-%>] )vC+)�jÙn*ܤ qZ09k~}wT !!¤{U sK(f'iBR XG.7D;RNTdN=ź1c&$~%LTQ4KeOYBo!϶9ݤgذPw/ýƁtYvZƎaUU/紁:(hk~9nNb^Ȫ[@fuzKUdV]�l1G6F=N܏I Ic0cUcF>S3[|^6\EMH@Lҹc�_W<l]w%EQ|C)q6BQzG믽]Z`on>&׏<أ&qL/pF@ Y}amVݛ�� �IDAT~}}<Zb79N4ٻq#arq5J*>$e71Y轌 7ol_TkA֍PmnNB NGv_;/m]O)S+6ơYw'n,%}Q<RL5  Ǝ:)tB):mqğE TZ& $L&KFijv1Ll(#HQ͉cTHVH* %,sKUFA<ke﷓8V4[#SLD_)bfs"Pe”Cs5^KddE$ qԎBr+rQL4Dx9fY[j?ɧeebYc~cZ)v.}:$>îO<d8D /iު [1mHŌ޺Q'H#i`+~{rO,b=b<Cd}gկ~_FX= /v]c/_ {$:b/^.ק5$7q}fg/k4VwaK9HmJqЦY0 "P$ 1{{aU"8+ƉhGqwYP:0pRlRj5343MH 5TW7ѤLj1%i>+9hI2N!T67K ۺd3#+$UM4,HgȨJI*H$g'&o Sʴ@8>y: >avp�*y-2۬a #ؠ`wgB=qͣQ�-f|%2S g]6LО916%RXIeq,V,t36HBdRjq56sk^vݶtBC G{ Nqr k{bᦄ|Y3t-βw:I>>_m=̳6=XgԗqN6d?mkd8 >ZXh9 0JȐ=|vKsN#)mQ_oit?59p&U;'L˺/wSŲ6&DwP tLV2q*4;E[<yx5XgP_2,)Ni^N1:TaJOt/XgxzBT亰}-bqR4p\e^2qj"Q ث֦i>J&|)q6|q$gl 3TR 7݄i RpT&v`tFUJONGocq~~y}E\[xG/wo=-2uYj<,uά?YTЧVK/_|ei7nxP|{{la㤨^Y& Va@a NnNo - OCG[V>Ca~cuʲ><c�KQSУFTP8b~~S]N߽UV4~H ;#KLQc<q=&Ίn>Iq: ijrPSSL rHLHS# \S4π%pQwWD&}¹qsm32V"v9#dgW0OK Oqx{EEj"bv=ӚT'nC#<2m7Ӗ>$g5 `7X)q΂zYG)N6VHmҌa\R,YfL9qJ]!'Ԍ}!W\qMgZf3MQHq,Q-k_qCL>OӉvn]s~6g{W/\{y睟s '$brȂC ݂ӳv}o0}Šn�91 \)ƺ—2 (sܲ,#Y찓ivjs8brNҲ&ցՉL*KW&⦴8\)l)$yPSN UMq1d<;,=?ɼt^Y,1,!E� Uhv"=f1妸0L gu0I>,%2OC,+Dq%^UZN{[a[SYb24LPR>ɻƂ ii};b˜ YyMK۾'($,Igp.^WwlY]CXUE՚a}˲ꮈVK^3ݬ 'FcfyY[oj~ﻌYtS\voq]wu][ʎ 8{l53Y4.?C*vY�.vWzdikZ&:Xpl#yY0}:1K8+bF;R5B߲9&5 l{Q(Wy[Y֒v쌛PPgT# 3ů?&I^jĞ*͏+jtO0{_sQ a|;у [.5]QzWeSwMVɨGJʤ9@In( Jegz$�gҸ!_{ fe׏(ifNiRr]pwY#[Oq24İ *$TεY]Wvd`vQᴳ -|¹(dȐ_"7nܶm qv[eZ-軮dn?LG^ewb(VrqWâbW,%^pK-KRuvRe#TTQUE7l[v M 4jf-w{؆YF®!jb͌xV)jʆz6 uҮ^L+a3Kb ESӦ7*fIJV;Sg !gř3bw">QT%9EݬKXa@)E�ibK NXG̳;G{=40 2, /3t'eqlS#0}V8ZFKx9愆I 1k4yincȨU^w靉3S6o&>k̓zlYㅝve(~QsnfR<d' RkqZ)q0LG˯+|`3=~[o}gQymӵ>C|r Ū]Y]gڼyjqSW[}Gܚ~uV1NU^6,/FGMNOLaB.5 ǣ@܄mU`@‡ut@.[mj*4bƊfdf_6*^i(47\ӝv-aX;-YbJdde^#KiyT)i P(QRlS-O yo: ,Z7 fm"<ep;8%4 2R JbZ#=r_$P9ƭ;8:jc'[ 0K2݅r-h R&+IIS(q&dTWҺĪZW4Os%Cu#ӦDvؼnNdIK1ٮnCOx.Jf3VVV'*mbچGʀwKzW\l[>7~{ݼy5Ja_VQjIW#7 ]s0*:Op^+|چ *yO~ScG7[ܺ>g}g:F>ZK`no"؇Qnmʺr!c6|x ;HC[x[fZ`L\܌T-`)ֈZF<l 0s4M9#JZJc26UVq/.PVOUg2MMQ'9?,9q4;̦*)649(V|Ac[8JibՖ:v)hym2v=m!Q@KfSuPʘN P:)GyE;=L֮SM0l hgjQ 5BQS4ogUnag|qEp5# lnH@taacq2myEXϳM30Js)lDmODcGţE_V=hP/jBVCqWVCʜG<W?f^; jv^'3`ꎚ-u؋$CCCCCCIoknͮlݺ=*˗zʊ.8k5[VaeF/u.T\ǔ$i"&[h([p;tV̆]_MSS&2^y-86,|VW6rLBno `XN3Ziשׂ7Ō6IyG_M_X2;n ̇9̓>HF4 v+)sc>,1<Hm( GY^"<a.w``eўyo6A:�0縿Ny%xI<j0x!`DO>ʆ%<@sQgqm}KPgM :[*dڟZ1M>+PbOyxY$kɖBg Y_M3dzoҕou4kN>ABf.%D޵mWycފ<kay #~q#B<Ѓ3T+O{*BFn\x1Rd?t{ӷ8r8\xuwL^r z[k/)WVV~'oqCV%o@+pQHaʰ9^Ɯ4TX׾ҒB3d29LVJ 3ގ�&`L'Lzal焟hg1)NNBŁɀ^bSOK=[!l�lJ$U1MK]fΠH!YA?Ou9e* 'y+2l猄K x(II+Zlݏ<t nbBRf{bs8+سL==?Ξ. ,&b ۟)@Fij`Jf({IT\dTVv3<7 RɱVTX۔3Ӷ8bFQf0ca00Kl:[LkJҜGMxd/jUFO>=+jyO_{ݭr]xG^])ƍ׈2TMjuW_nq``@;;g?+>w "3B?6r7ŋ_^- nkn,I4e6a1\7Х3fjŁ5 s wh#Y§M2Va!bL1gt³X4sVN4tuo5V 5Gu)|8^X(Qsq{8pN揳E y,3h.;gTx wsJf%͖Ç BDR4Y!:!Ƈy)x* “,V%8O2k0/xg.By%2b: ;yWa]y)} =ytPwLPl7'&6Ng)7ImȪxN@Ϥjc+Fbn )sOql(�Za3g.lmf|9+z2TOs#b ?9d\=12O:X}1錬k_~尾ap0as,pڬӼSϫN^Ǻ[~7ao>C_f,… ˞ݍEդݫqX[1[n5*1X$p6]dzjtۑkN=8NVhWjI0ᢳ/KBs`VY|EihJX#?:,&H,z~u<iv)-DXY# iT ?Alm._lmr9vk>p/ USh;X8_ kibڈGYԤ"*ud<[eFYw*a fϳFDJf;g&Mud ~% V6G{'=̒zWNAn^˚zV6F>5c bEѸZzfk aڦ(b,#S=r?ÏF EVe7>_{o6.]zG/Ẽ"4nޛIJ6vf{#6vW'Y0I+/r?~Lͺga[nݺ;;{޶m۶m47m/~O�w>[flW+X[Ӫlw~L&ccvZ@FHdj0gM8j+PHQӜɜ~d'YV1@jq&e{@ HrEw=Ì@ΠMN4 TQ"rRAJdlH/ϰ} ':Ξ{ys4, k57EsMq ",9nyPPVS+S\bxa1e9T,U˶N+ x 5 I%z$?Lkaq\(LʙA f+<gخ7DN뢶z]nx +4MV r1Gq4L8t)J=ꈢ4Ugr/G3jG\fˮ\l N΂ipEsd6][B8AW^}e 7)_Zjj4 wt,X A_~ez8-EFVGE#B3J]:ntc7o,-m۶9sfg!ķxo&" :`kV+Sut;$4 SԻF63R&;$[ !Ji'p*Ɛc tJhJY eIA0XrNKC8+sVv!ѵC bcYirv"[l T*l13)i)|+ȩx80KiJ !VD&E� po +PRzOyP];8uK d>O2CyI *k5cRRlre 0:v|;gϧءf^=Ŏx|A-a ךv=Ξ,PK �Tˍ'͐ҾJdp0`D:8y:6E[EN f,B꡹Ў1LYOR;&(OV1CWlueѲ[D,dɓMMrR+u}mQ\W.]ĵ{"~yfF:qD^xybg/pF0*~뭷P-`|ڀ^um߾}Æ "J@ y]+Wy<e. #"{w5aoAN7~k)ם,H Fa /*nNB5*J3B~Lhue^ Diαm& ygɰ躒d qd#k$Q k- TH>%2sSbY.t\GVh*AL7ͮ Ux*'*ͻN{ SPv8sZ#g5W  (]aqWrT}Mv rHY&JdNZ(m7*.2jGGEQӳLy<rq90\% ;ʭ:$'hGI/j S2ZH(Zגjtk}Tf0U 34pecS%'>ƐiګmȪi?ͺa*{>ЃO~׬FV=LLB¬x]}1)گUYאύ=[p` Z)bqAg}AQ]<K)�� �IDATi&*]tii}a7~[Hܷk`?ugΝt�ũ:cc۾5ϷCK^7Lu+ALe Zhy[<�ר<U}#N$v8שq:JFJZ]FŎ{;k- h@4:aYd:u<sxDɊ#s`|}yl{_!Aνޞ/Nkd $ Rl0³H2ޜiPj7*3%eB 4Rчbj: PDХj=pi5r$[xS <:fZcAj6ɶq]_v-lc'#i">ag5s/P L+dY(9gg8ݜ*~^ìQ1#]ge$ %$ZAz::|ә$L8IH�б@^6%16}-Va_IZMNpJľ�dWVDmiJ_Q[tD2uпGkV@[}6D_#EE\=n�g^<VF r{+nгv NaY p7ٰPoڴiyb쬿[Z/,[2U*wq(sU.փK JK< #t`L0 - TBF!kCբ T<!MMfJtI b7HĹ&- X,XsߩqX%⹦=4Y!ր33.19w2"d8Dn0Cpp[ MuYB51um63QU6H$:5�bgwd| IB0{Rj,5#`,JJAN(٠k%":q7s&&obRB?)Oe#SNҶ$ԣ&""# ж-EH_+r*[ QR@|7ۅJNqnAO()OzJr0///͟ X4i5t<ԓS= YQ&gEjw}BQW^~VA;D5ݫ%'0g>>ih0"֊J꾽vӾ ;WGе,OWLI8 Ngg3X_AԨDb-J7)E[B*XS,Cdl,:#]a=(BngQlP/| #gXڠЁHX!fTN+_<CY'7cWN3ghsGrG9Af`LiFEb3=TܭO8N|{>^*3?GzlgZUQH(+[ZR#m+ṳ2f%R:$K JHaW�3y^TZ6rUqԐ%"; K,*(y#l7guCf`l~baF I71\ϙ/tU”?V~U9>lGqM@٭e&o͵w<Pcߑ9'\YDExygL֢{[u)DXʬV;o|V}{%F]חnVݙ:U$6VoMş>sΗ_ze;�VUUݖHTA͜a1T(V�C6KMF`,gެYO2Vf#ݵl̪BhS"IHRy 3HAm@>I(&ۺ @Tr\87EcTl=q: 'p'#a#$џi"L+fnNS4u0_|;/v rsj5s ށndf:FGc2x UQ:D_"TTs? 3Tu2:FGq]ǂtjWun3JJk}eJM *J(1ZE�DIō1W8Jj3i[xqc{d EAx<C4-.~`(U+nЛ-v(�{e䪫/X=?:1Š lޭS{RyMw_T[}{yT] w-ļ;V<^KZ[K+W\r@>>ڵk=NE8mƁgx}};VuXKLJF'[ߖr%Z#a*12ىfK!RFRiIwsP{i ~rؠdز"42%/O; {ik mI.NEHO椶ˀ8RO NҴsB8W̵qf^ncOS_Ӫ(8l1_V;JQHQ<*WS}5sJ ҩM]$EM 3cS7g'#FHH m] OѨԴ2,w?9AP6ylJ]jJJ^#Yl E| [\IJa/-%2k)/JY k4++m(9o;~5R;o+O{7C6lx'z'ܰa B͹9kRlo@B =IZ:lt[oie8͛c{K�ZzlrEG}$PH??|^и<+km<{şhյԪoܑ gGJ(lcJrZo<JW`Xbc/SAH}_/4IkEė˵%06 a/ ٌюE5J ` M$"l+F-1D;$l`Li(P¸N0K {doB וIs"cKmpd83M$Mlcv\_}=xŀx&&pQR\nb2jZ.RL 1vsVq8H Al7gSKb'(e@=620j!$:BO�SZ1(m *|�Aγ-ErSd[L|ْ' [E ,ؐrЎi:`:P9BاywsrhqWlGQpM9 >Ϲpu[EЛ7o7]ˑG(wGY#u444`|/;&>M>? ˑ5F#>Zku֝Z1&t>[ŝkI~dZx+?DZ@‚~_~'>裟>U`IB}h\~yE =K$9q). 5\#%-:zIFŁ2w++Ԅ&!!})fl5`% tYOZ `ޘ_v+H>ϡ=AF%b 9Zf~:Ec fLQi%Uwq >^NzoML*YLy!Z*w{' ŊVP,{ih* WQ6UQl/Ă4Vѭhzϱ]!2Fޯ1jͣ)Ri"r*IQJ(߬儊W[u3/f¶ > TjW$X(V!3E-U JX?2TWt}ZJ1h[*B=ZOPP#[=??8˫mr3v߿덥Hq1~͔-عp?fz/{ry^y+.gugb?uyF.k6lؠ+uTYY;V ~=00.MiE?_WB^j`Ch?p鬂q/ͺFcOJ;yvk$ZOV*y̠bgQja i +nbl+#cRNheB4B¢fO/ZR.QfgvpZcOJ eP7g舑R V /9f.AS-)^Td֛U P'NRf)}L1_|R_x-xwfF *z0AV.l�*^JHO L2>INQljMP5K84 GT,TpQ!J [FsJ %U66:!UtoHA16I]>z9y xFJF ZQM6o̫ KOIc�H|KD,_:'1~uS|W^-SH9h˖-@lU\YYj{sg˺_d AݸmYY'VJNAJ$}(cigEЭꔲ]1i_Xqڵт3Vg[-s{[lpFz`KZ2 %q?քqޠ nΤRmAޢ.f& Pe'jyr!6S@>NqSYM>@hz"=. 8-NKR߂!Ir ]s(xSx%\7sII`9s!$ ́NF61SqZ/5Et3lR},<;!yH{/ET$;0׳^q43q4EIEIU(=Z|aQ%8Bz;8:f2Pqw/93Z^HV*Qjh3LG׿J}:\T[ʤO FH4@W8W]h\8W X\WBY`ZX>U |RQ@$(]c/%�o8RhogΞ0ޫ 9X`s&ukuʪiZpl#_Gzѿ{xI]XXjw~h nܸ?OիW۽v[:eN\}O 1-SԪu`rT)*&>Ƿ2^o<lbAHg0wPpzz$􆝨WsSRaaDn[OL#OCbCƯ8!ҮtX3l|H\evS4&Pxh7gz(ӆU5FG)vbA)LpcLSy\wRI>$֨њ;^Fz%$¡DNC㴦FHc}{g:ct ӥ.L\SZ?i pZdz0P~I9<Z9ҭ #Z.M&&83@ )j 6$݌1&rq9d 63YYd2%Ε|3.PI;$wlrF r4G/50z}%nI#kWie6Nĝnp,'.ڊݧ?psfmw{v/SQ]؞*} Eg<seM}DҍXޙItC7N|nwGիW5IvCT$]q-,>i3ƫN2.?-6ZDVI1LҚ?;ӊ""PU{Npٚ:,& -Ȗ$3T֗C{퉯MXeEl!$],o/ъf2n+D@nl8+upS-4Bjw`q!y!Pwܷ6$)ċwR0B*f&T>,+"jt/ m{y%A:gaVBYjv22Tܭ ށH[ R1U2:\c(ϱDt/nlLcR`ךF]˕-/j*6rAw,I DI> 噗X+PW4idQoĹUnW:6YbsO&RnцK)GQsž[ HQ-&oKS,d}*U;|,Gf=oߔu`RT&|MخR^lUv-t֭[:wٯJ6#F=G/h\6ͽW\An5eJ˷pU>(sTu,mx9g5˪{Bi]!rs!ZXgĈ3r|4Pшo7͚ %QSDljx /R Ikʌ!dϋy#$?FߌA#aDHV+IfXv*SڶS->F[ⓇU)f [{= *) F}Zjh #Sc[slQ*{iC,$Yl՟aaIz#/h81vటc]9MD=E` ƙ1:Zlim);l m'#2 L17SesX*-ޢn$S;q|sM-uusV+Bqݪ?{19џ쐚4 qP3o&% x'͟iO"`aGn}=/rr}5,-'h-\! ˒Wev7N_znzyٲJ**Z Sم['y$4J3(pi:bA)I6JV>E~uS2c78\$75vXXYty^iCm!W`0; buNDJtH(԰tSCnKa'O@E)tq\N[ʙ 5OҬ-fi ;5Nt{'H[vz#W ׻8uf+V.t2*2!_ ;ţag %)?,sghӉq&CUwRĢ=uYjyA-<AeUM`Lt{~7+3Gyc D۵0D!qqZGYϴx S#e6 ?hN^$ܱ ݨ1RrdtO70͇R#&J} b--M&V]7JC!g[1r;2oɍ앴[Ft]V3+&9=j́?Э_N܊n{-> =rvYx?_+ܴCY):޼yoˈszL 0p<z[G4cnAWZim/Pa؉=/ۍOhԓ0.kh%̼9Knj0XA8#1$A=eeaEa~_B!ɨii/N{8!1!ntL,P9EcXw@:;sTW39RSh-Vfƙv �1z%t~;!/ѡnы[ lüĤU×üc2 s;A‚8WtLIuYBg7BG\ȧ՘SlP["'�AZb/"뇞liZe;ޢ~);cA/Q.2m!qOQV#5V?<)l sxƍV݊fXdkǏ=a犼⪪2v*ow6~/-ָGW=~MFTFkz5VϿ|һW< Mˎ-N.v( ƵhQlcكJܕ2.5'&k4<K �� �IDATSlTg2 ROw)v=&OkW K+*&L裸$b1@3fxrk1գA1IJ[)6HV^:(0JAE(BG Ui"ͶEt0BVH&rt#e@}J\aDiYfOyOSCݒNP [ü3Gu35^`[Pϴk'i<^T~h|c{|-+2H(xC,&&wqjwxˇ9&"4sloe&DefOSƙ*x30ۤAh#ϱ04M"&=FG "^OLo!7bhy}M)/p@>Cĸ )F$eeȄaX0Z̫I!vRDM!NI\V]ƈ*w^cɷo%zW|&Tm\vާB2~3;_׿@ `ӾS/*{8hؽmfكׯWۨ'|u(vr7[H'E({ڵk?O?إCBzR=KJ5hnX #sHb6tM8LKα'+m6FJiR#Ze, #E++N5s>SISv^;|(4Z}pGJ=itkC &BRMx=t>;4eNF%//vƼNFCsT˄5C4iϱ}Q:|K5MUS9C&Ylag+is*y_dNF[؂;3e9Gejf[0AsKg{ & )wNP^ZrzYBFik{M)`ESH}(¸,>IB,tlatRDBdpX+a)HQXcî{GZOf=%' H\Ѭf|߲兟*MIH$C~xRYxF<hǟ煅Żr �~<OÊ_kwo( `gYs </ܴieNh.}]wZ$.1vJe/t%HH#ou|U$AKcJk8*mٷEg;h4KVZ4F({¦4yzXP>YYS}Pfa*¤;[,!uʆZbM˅ ,,WLHzY-ݜUM03F9k#qfUlb}ד֘7*idBdULQm:fOҔ_S1Op+vqj/~ҳLҤ-WhTlzɣVM>{9'žZ.+%+S)kݕ$nX&thyGHf^M~b NȔ"ES}l椾 aB[8.f8UIё]':Oܓ6Ց鉪pl:<gUp]0'J=k/˕$jnܸq4զQXWx'|o_Xd%>={g>ٳ_vMuql 90@OoiS+l}O UvDzܾ+{yOwe nSna-\on 6lC-J ~L{IC(6A`%{W*m( l,[qm�] -C穜p%J*obO˫%G|?my(gҒK%O6H><n @5B^h$풻( L%#2*< z>!$?@wʑ`OoA6)C|]$K_to֫0h5j+9F ]C3P'S Mwrx$MMS˹S'.;_{g8Ld>z@KwxPV.H0O0 ,0+qa#ҙh #Wl/FIY(ebmIx1It| ߮@[+V3Bl0lhCS]e1r 3!Qҧ4Y+U{2xDz= :xYm. r}fyG5&,O!׮]SpXAL4zlذrwk5=wةH/G%+-8P}OOZ*<^vMMO}#>;NߩicقϽ8z#=P[O[ףov?SO9dIr %0_URh5gT2l_- ZMFL#JNX6ȇV9+s`\p [CQV!rzQRVo'##Tͬ !V C܌ɖ)eAPVi!nj "zCl3M,U˗l=a<ѫlDJ* :oղy.J+֑(R@}:AW4iB:vJmmf IJ6XY">o[]~o '59yEMfG۬H¿͊9WYl!Ǖ~&O3WU$&ʲfHU3- >W֭['qvre׭[6b>_vwbKZޏh'S<nڴ{Q#eU.Zٽ{eʀS}&ھβ#/6wwld<8HҎ6mڤè%YׯcyPuSѥUVVe1NYRC+HxiTyk-wu:p=_EvTƿO6>*&Q=:m-Чb%},*jnr&~m0S#] Y%w^B/p+|$|zvҀ릅-!KVѣOVVbs'#16MP}S4D$3T<7}ebdfؤG3L ᔳv* �$ QQ#&P;IxwNk7W˓4 I~]Q=4 7qEV{֚h1sد#mK#SjT6H~OGD;̄tfp^<UKؤ2AVuo"B+BRV+ђcc!btǹ72ڥJA|TÄ́˶T-]>AUoͦPO/=ԓҨ[]M{=߶_?#j+ wgJ: d t۹Rٟ~zTT#[{WYY):[i|Xnbi VWǶuZ%`$mM>Eӥn̨o{WI}hamiJRRZ.< TH)hڳ-޸8!`0C^TiTP;R4Ԩ5p'ha0l#9& R h N[%bv1o4M˂qZ[<͎ _F%u>JQ]ɂvct(ιQ� (+$-*{)xp;d9Ec5s63'nfLI[BB0I4휳<C 7ҧ+S}7Db'–Vle\bYBƉP2BZef)K@ Ff^ }"{FOe7 TEq_?[T3iB&ۑ\tM$$YGʍ7<GHE;NJ4*++]v)eeSkhï?;vLIZف.[g:ǵWV^pNJW\v`_WՇz衇_ޭ *:YQX=kI75>y]Vm3D!N'+TVVmjyhmJ;j_ -;&6{;$ZO< 'W\ bCd3~)q:}{m" |[b4L ؤV"DUKV\Tc)Ə^ho!OL[Ё ^\i7RW|;~|Q#Ɉ/s{vqJ=//YM 5~+f=sdyO y9r]y62%Q{U_FJv~^|[ _V9s;A G*ivļ%e;8-;9c꘩fn#WքM>g ɞ3[g0m "LZ%[Kꉒjfb+nH:P bޠ^z,)3򺓕-0cSn:s֫zmRLMIؖ"+ 7I{̞^9{2ާ$4{z{t`a,*6==m׮]һ[l]rvo?}q+*Yc,taop͛v_O}Jޫ˥V< (kzWUUmz5ъ;Ǘz:٭`h "id>6hIW@-,KLjY#Ʀ8YOyxOhS;aP O8 GbBawUs%n&"у,(B$!Tk7cAmJ$N'c;.Z.(~$=AG8|# RDkg m}MLҼ%61#R,/Y ޭ\h wMS4ҹWk3?&&ARs!;7U & nx3#[OQ @~ZPWnj`[bmQ*i1!x?-dS"'F'$=04= laKjZ7 %y[15`m"ra0 Hr.3Cj=- !(G4g]\+x>WN;^QӲRΞfwRQQk%GGn'~h}{՗"2-~ڇqҟ/-_}pFmm֭[ʚ醞eleqm|,;Uwr3 38Ueh߱g\|nwy,_G]{n$WR-I!߃\R0_?I,AgBٖ!D:N4@G)vTOEIu18?#?K-§jRȔqZ9;16E9a-B`ϫLm+Z \cLmsT)kǃq971)uH.FJUt;K *171 l{<ld*d9>j1:z8.12i"1//vt$O((L42q-8W>h${lORc,4yqM0h⇪"|3V qtsvȻi]24X0w|v|lĬ%1n'FDUeϛ�'I5\v]V ,d.Xqr+#'︾Xv$6\˰2oO_I!˗gggo~1VEXv횽Vr WˀXMFZ[,,,ky,j]-oz"w\HYyan`=BEw%R3+đEudޠv¤},Rbz8 RQiD Ԡ&yjaYڼChJ.(=#l#WL q4.pސPwc3J6iu2~:K}6_`y(S*LRRfwsr'#L0/>)(y[_91s_Ƌvpz'#4Uput2h::fZ[PXԿa2mї6si;皘p*5#nsToejryiU(='Vqt:q]g]+z ށ6HV)YЇq ?ja$Mqĉv2KDJjIBruVmRF b)u5Ч�rΔ@o?}W;/+ X*"}S{jPӖ9KK!H)2!Lx㷢f:w\|cSʔO}j:!ɂ\Ob_XX?1fw}WlxѵA'g%ܣ.x*KnCpg;Kk N]M+k2QQ,,yh/sQRWGHMFw?B?1S9gC,r+Ֆ'%3Yl5U clͬf.ɐZ,Kh0IB op0{.%$7@QD&́:u4M8j!i"$b^O^e^gqU=[0MègZ&&gbxV7p} v\V8Ec32⠑)43q6p/Fr[ϱ]wF5JAP+#%~EG Qc,Ε,]Sc̙$3m2LUr-Iݽf>[_[ ZG1=rMr1<vp.ۗ-gV5#β)ۖ6Vq;ܖ=VσF�Z%�WQ- *\%ܼ{^$n+V_SP�RBD7o޼vt^*km]%>yׯ_gݒz>>mPYbMc$H=3?6ݞN뱲IBpqi g+% ~"3s=$E )1l[e xysR=b� T bdBv� cafBz)e& `z5zi[`O#ojЩ)̊yC-޸L`LN>slVUi(:FH's1,54U6{`uLx% i"jHPZW@rZ"dDƉ52gd"fMoIgڼgh;o ,g>6Asc' e "+6nk0mt`ࢺ37q=x B* a Mf8L:y �rW1F\Y+qS<Ruَ[T -ϲ=ﳶ) qhGm|ܝ<k,y!}w8]T|,YPwf_׻;}OZS{[Rs5TjUyyYaa/xՕk׮�QJuQaYK`l˓n{=Eh5 AXwP]k0U<$1,٢aä3FKH; OSli%4oXaAR)C$|ްUĕ}:q8v7Hr$ivd?Ǭ희ch9y81"Jne8ssVー'OԪ WRUNFOC(rLT�◢۴q&L&NLyiջ!SnN2�l(@ӗجŁeW3[cިV* 83@oΐA##Cd6:As>1VlMyR IrH2$b%`1C^> M<_u2ZaeK  -'9K"Do7Lv#�e3awYy5#=tVStrˣOWWdnݺv ъNȫgB؏>pEP-͘L&i?# o$�� �IDAT>K`IpE`0?!<Hhf߰a1+pk~+jV\~]ᠥG 1-][6ذo-'7֭[g�3b{ %} ^ƧL؀uЩ ٖ)yZ{ <eS78҂|ŕBz%/ ْ$xT C%*&|+-dG19LlidBt+`e@r*EkrPW!H>J(VF"IU$jdyޯfAދޜK-hLm@T`@e;\8͎FT6eA=ZNF8_y᫣tZ3DVȩ�7y}qT1?IS!ƭih=?qOS#j哂F2BwKyePTMd " wH4N43'c�aj{2L5}Pa~,sQ*'qm5] C4}\wQN.[v3O V77Okҹz +**Ժ+tޛ;jAqd^|ڒ.tsX0t\_Y&Z:ky>cEA5+3.ڟw΄68 , 7-Zj"`8ڹt$=0۲tBWVyd*¤#hx TlƸgA+ vȪkJM7䓄R~&ctm" V};�aTփşyԧ$5~uM6j\RAj\qu:BnOgoTڌsE5I6H~#WV6R|hXEsT7{'o"ɋ[txSD[H+MRև29@Me7S<y3jQتQ[ؒUXH$%,]݌ qSIg}!n7Y3l}ae:,3[LmW((Y۽7�F24v.z>*n[}#>r[{Ϸ?dEmllt+Kv{rئƕ+W\ pz_a:Ƚ9棇?]ey7íUPYYR|39+5-EvE'VBg#Sti_*wRwq,RB= g%6!kc .E('`]> \8q~V Us;L'#ƉaglNT@-y0/U-Hs%|!^(9@ ITj bfnΊ')FbiXwq*CX QJ.˪Y6r441y "23ԥ0 ݼ/R- _9؞&(w)FHs4$r4T}Kk碬Xl't_)vgou(lj Ʃ ՅR 8B; BMi֫F y@+v Y {VImY{P dW4SBm>#b~}7hL9}ڞ,@rB2lҀ_I'7^c-Y& W^]ٝ=NWuTᾧieg꟟ ۻDVxl_WW#*˗/+y >kjjȂY}<gˇU_%źzfJ\tǿ/444hY399YnjiwޛܼW|]e$ ,֏A%ᅧ%> 4Dɒ=jJSi=7yD,�!>:aڔqojZY#3G,0)Yp?6B:Ε$c[R_"$f!+>I)"f^?0Y ԩ 'Xxg|!=Fk<+2Vp *ai/l5sRQ|,Ţ*Og'"d7s)2AbFHtV3p% 61e~>`3[BS3<eW|-Ƌj=ʓWq(a)1%cL*~ ORD[tL廙 ~X%y3ZM2Wԣ@E\[sO #jH h\ ezdntPc~ᥠs)=npeݰokOs=O"Dƭ.RZ qen6" 6,Ѯ[_<"xvүl,W/|O~;Mr*FʩZg?>C"Ǡ34~,_ê nfn~Y(C;ƞo680b$ fx<1=3-x`Q,p>@G?n+#�:ݬ! ~#&'( y96K=~PzdOrfx0OA;~%`Bq&f&$0K,5=GN(麃ӛSu)UQ-Kj NLU3WRp,$xzs,A6s/GI�zKAINl"+C &77r'b!nB4|gP-Q ["`` [Tevsvg iiK=baL/P0w~ƿG=F�hOw9j\Qm?GjQ,[{mp=O}ʢݏ//^Zf6WXrj<׷}_X7nӟ؋^2KUX&eC_җ]TҪ,(cwO8 ,8 gb iHRO*^FET *g'ug3NAs̃#G*I-J*hjNR]ȓ:v Ʀ<$>_mK| f!:EV#15 jawNT/U6[AMLJOw%RpW%ꪙ{ ,|_ʼn# 1z^aC<_$!4 >pN&�_Mځ/tTL0lԪ[ìxI5%hd[Q" {'-�Q6sIͦ"YRY=0ϫ ڌN*Ȧ80–$aAnKiZ֌_Ĵ~ڢfE@S0ja062~v7 @Oj[)!f#wXBe pW>5*"BOy[c2 FT a} ⒻQhaA z!NGmprɪH?8e7{'lW6acs{5Vc78Ƣ+gǝ嵖Rm%GGB蒄J lSIR8NvL-\Y\'/jY?QL`l`haDUT{@|�оi"akMzQ ё":6Ĺ2ACL#W�V.-NLiIljf'Yj?I|_h�.5H Kl9N,O[#Z.W3;@9O}(ߔA3U̟cʟ.N;3B3?+S4c챞lfB>; uxغ4:fD9Fe@#P2y0 9_k'fʙKr1blUcp}}Qh =zՊo,Ktyaa}7AL̏So)`IS6ܠ w@XQf2q2ř2Oa|Jc9v~6t(c-mذ:dIGjqPПׯwӪ2Kqrΰf)uO;>QMMMMML>?/+juD bޠ)pM>#J]L &%SƓ~rǑ j7إM[KyI(LASU 3bh/}F&ivXݟlKC-L$ zizjcl S <YWVϴ|U$T Lb8Gr!c/n:yE{8q9WnjB_v#W種rxP _~iV,nm;6ޭd4;Ld bV3WL% 6 1Su6\e辢I ~!o9e6bFٖq\hl= bʼnfv32EޯlmJK%p>@(mW(VtTz<БzOK DO bd|uvYZomvrPuuA 5nTq5VL/؊yZTl0G=r/,igd>w[qGeUYFٝ_ыc3ڍB_=w;#Nk#ŽCǏ/2sf[AշΙ[;gВ5@06;г h鼯^D;DH02HPog.HetB�4tHhY ']6C6=g쁧`jVkVԤUZ҅L5m<tLv fI2&w>$!" d~|r_~_R_Idh#&&U G+ERd\g1׳-){]gWgД=m5yYC|Wvj=5â3yx2C`Ic <nNHR}~RBm2p H� yr~UGֽb*nniw$gxb 9 xXVG2 1tџ\;HA"ٚ:Ϯմo^ِE)'Gf _J>-l' yT8"D:HM 'b/ISI<]u6ې!vD:q=c2Uo4./3饾2{ !)$2IJu) N5sLc͚j?w;y*OT7@6l~4tJ㛴lxYwy'922r;\vzѹsʟuT*ey-߻My睷Z1:U`"6D lpgz|KRMY[!ݪ'4 "fDaW mn7{g%Eh2ZIg5!b h&+hcnDㄽnbJ#fL=R˞&򪉪nJy&vfu|3f<YyB*i~b9)#FZvIz#O3J)&>* II!ߡ4bI;ĬJ 0$AXn=4^3G?#H1 8$P˓f,YQYeg\mۨ#}8$WhJ {ۨ4l4eo!3YJ RoMBeZD)!@8yvl $+,EfE?Mbsg\j"M[5NC|jNgֽ_i guIj>$jnUY׭t_wYnmW_ cǎzhh˛|8kq:h`7s9===7\}̙5>{~+՞!YVz}`pd/>v\Lg2+ũD;Mu+2'| `wҲɝ*rirtҦ w=&մK^:#ǙwFs3 پ/+Z|E=dKOn;wԷzԐ9na'xJ캋2xG{ŪZtT9WFB%7Jlu4_eb+z{$D}GWK\C)%]XOj4ݬZ 2M S뷆 D ^ƿ6&**K}Љu׸>Y3vݍ<PsI;<pkD#Ըf)-5)~ lDI\ɋaCZod#�W]MwN:N *n�>!p{Ni:YNe~ )~ݿіޛb"3pghqΜ9npQ@mЕT*!O2:~8폌H}|>}H* 8 fJ.ڢ\9c Ç|*R[~k~nS~|k͙3oGQW}]BR4=Ნ%6JkKY6`[ެ9W_trߦ@xgNPD@]@0ICQyr+] h~㥪w<"lCそ)ʔR*,8Jēdx/`[^/PD�K}%eDje,og}5Qa c1!O=* 6Y_~_E=V$â|W|>ϳr%wQ5Haz RԲ%.5Zc̕GNEˍj"qB8"zra,JZvRQ*b(qB5쒮XŗT?E8#]!<%VJo牭+{)tnï.n:ű 5PvGguJs)cOi^z)uŤs-II,hqRyCcӭ:r0Y _UMQp^xkoo;~7󖟟fk݈%p3gν}[wP:ɐoA-*25b n'_ ߵJo_30p6eDY^u}WN#1 MՈa=N=IH:ɞ>㩄d&}3yR!AӰycvUml㔻JXk1OBـ,<$_[vlL6 +EF%jQYEFGY>^MBC_NLlLZ?M4aCI RIֲs;誠J>=ly%VAw9x^!t&P@ńU '>n<Dqcʩ`-;/@r=x0&U.7@<F 1ewSmZDO]UtIj'3HrTK<.ǸzYmdCE5n`qWwg~i _"Wh#F8XGm*VR/ɴʧFъQ/~[0/`q^4I`nH33"{]nݸc͑:b &:\N[=ܦ6}{rHoiMTs=~ke]˶E7N~T[ߖn|U߼Gytج0^\s=fnꄖnY{bt^¨UsQ2MY_fϞYPvwI߷E'/;9:<a-V}QQQnnnnnDS8HVK1.ZwTLǖi}m1b)id xzՆX7$klǧa6i8>G-zNKp{FmA!3sa5,U͐# JÈuja|.yֲ[ci)Fm仍)9"y.[sG jg1t!/+)e[DϛH_zVE1I�GWME_$IU}[dݞ6o1s IpKpB"L9ذmR0NV6{teE rr7(V&3[V uU$SoBRtO^73XSMgdu12^n5z\!g^T:#Nz:j�� �IDATƝԙ?6蛄C[z눶ёq"?-auWq2#x$=#rc ) wk}u~wGuЮ5<U81ӟ3gT='Ԝ<A^?h o*H[ X]W߼oٶprp䞾"eԙtbeAb^]l8>/bq|kiD5EaT˨Q&J1+yFfdh4΋f<nY/`Pzfu ѠC ܒGV WS֘}:.c_%|o2'(Q- Cm'e2PENcYoUTSmA|/h<qq_1WT;F&_'#R:H呅 T馢墰sx5!OP D"FnݬdU`YD9Ĭݬ ft=Img}~R!R)GeM xx2ՐRi2&᥾Zl,+"ѕ ^E[p0A $W%1n2bڰ0W.rZG8.]vSY?-G|S ;~ Ӈ~j}Kx4aSO@4ZFJ˜)Ywk䲿_vg.1iz*̊c$L=eN5o^5sLΙ3笊Jc|*mtOL*զD"MȜm@: ՞NʼnA-Ō\)iLIʵMn ģWgȸIL^D,ـ3NdHI)EQGT !崛j^îz#mѭds(TU/%st5t` dm#M_וD+Pd'5�^fb^e K �bHQ'aױ7Jn!/gd;\ ]sXr)O?Ua:t*.M,tą ' g&g(`Qْ_AvVɣUtI),Ym2vajTcPL@9vCKsHqX¸B tم|I[O"2. B8Zpj)2gB#/ʝU{n/ fKD;)wu�NΏs]s5>xW rVv;di4}1NR O 0@HXPs4TqńR48x@XZpdu=&b̃ZWLZA0jn}<GunJ{m~<AӔj2dH?_8\$5M(#GVNljJ-':tZI Soޣ|rbX#h8e /rad$V;y1" &_qB㇥*3B�Wk\hd>Y},~9+y4>ǹ$},|K8RzP{!/I4]A>yսnaFKu�;h|Km. IR&I荪cW\gj !DjD6pNk"Oj¥!h$$P6 yC!!n-nCq{W^Vai<H5_MTsd= ߰a2j~ v Mdt:uͣ<:%|괇 '>np<x=?39͕kqs9N9q-[}ghBZmӷjQe¸?i*S >/},z2~72jәT&0W1s�8fIYLBԣI֘2GkΤװFS$cQA~c=[!2R!kw :Q*lCo儗zhUB~JBNtٲm"t$uY^tK8"Q4S,C(lNN:q,~WtY 1Ǚk\M)O+x).Jk_EW9q@y!/6aD}Qݳ^fq%h.?8]|vx,`5)i9"pum'.wB}Jlƙ:%/iKL@pMMX9:P2ZƧ$ʩK=>0o7YL]+aAF&wn0ÓQkKiE-'=<Qt:}gc~rAA*{= iY}is =ܿ"Vv3p^؏ls]9s9ixk=Ɣaw'4NJuZ#UvԨŽbZ1,ƥ(#&Gm3o-vō'nbf캨&¯==Jjڅd:yhm E(QCQœ* OqJT -7ԃaQyا\C+ hli)3x%,c|oj͕�}9z $sdCc,>xY h|+hy ^smԕ7L~9G'6YDI*6_cfRi",'&qB֔=lӛzqJi{PH6�d<hoQs/7K%eB[޵hα/2֎΂h)GFFNya0\sz1y<-M#7켼C'=ئRiI=}oUMaMH"hpڋV\ z'|Nwtw_e_d/S?ȘINyDRݱ{&]74Eݖ5T{ \q@ w8O Iǝ4nZS! դ"&_M{3t,ğd[#6$^&PWB$?1s66$ D\. {R~_Zxb(//Y 1ȌEHs ϼɜ$y:kMDc !*nQrw Hy{=/q!s$1r>#=,Zƾy*]~iy;2֕aRڨ!Tt?E:�pA{5=JmNʉ:b17m7"x&w[h}$m,fWnf r׋FGp؞Zl&ɚZ"S0i9Cce;)UtםwLo”A ;aTtL̐9MffYwnjg6h;w;PMs{wA_iNN8G8t%9덛ogM>˭ [٩ȥjg|^1>1iimSӪ~2\$H@dMv*)RtKwke4C`jFU^Vgr{߱7&^{icn;BG? !EB/(Jʑ(IPn*Js9ɫ۹c7Ѭ$ʹb<AB5B(&D]彤9$cP<RݻYufnl<<Uk_j" >ͥy9I`6 窫x<G^;7d [x1/^c9.Hs\\!Oj6ǿ$5)@1vQ%פe즢62c/+Ok%5ME3`O-'v W>v=Fy5H2g*n"=&Z_?6@ѺۨdwXsPR3c|T)lURyrj8ȹl#P5,c5yN/1qگm-.*%@}M  o{ҟ6Jd L)x뭷}6>>ЃCi8S Oi$6a=̩zn}5ms0xtM#;=p8W2|Rɸ y=ʰ;J}ָz~Na*;LiqۙDq/!WuFKi &p+4/b_jf=M-C9+2BV~^U<t7vpml>u9/cN*>,F]KǙ10/hJc YAK\|H+$D\ft?{KijRg8w|I)< �9ʼ W>3<FN }7.&fO*$ݬⷀ[A6?̵zjV{:IeHV]L魤؊pp#nj:ݽm#!ZjU ;ͩz/i+M3Qzbkl2c,~LޱxL)fѓk9N rwғ[7rGM!d+zvwJ۶dMU0S*brrr گ�gϖ9%yق;C6~p"N먡5=v!gϞOݏ0&s/{DГ֤d,ׄH5|9n @[L?KozH iX2%08fBCf||6LvV=K:Δ8EsA;^8B3D-V90TT6O Yږ'7Fn< %YY (43 |Ve<uD!-_#e& 2PJ|a=p!/I`)d,(&2@2@#`"zd'LjTo33@2izj9<<F֬rd[!25(gk=VLlRZlej:5fdմ"f#z,)rg4\-RoN(@Xn$"'Y%Uht<2&}k M'To-V nLۍYNję!Yf24yv),d9<<4ljx˿~CJ#j^x-Xы˿~#|_E;͝ʝã |5^{[�v2&4>, =PgRSMvNVKsW^ON( 2z7s lh~T|ԭ$4)覃-Wԑj<1`C6וބc+;bӢlvWSfȢ'lB,!^(@QM87RƱxB_aVTCLZO"O^Je=[R$QNlQ굚hb;녚z鹬Rz`'5L!S;Lx[>Ã<!nW1LGw#E 8,zM;^J/Wk{}pD,`p6ǿo5i%<+_ᳳ9:vHcbSL>̂ƆRzdN]D)(!fE\DO1z)-<FvFFa=g1Ԗ]j.e%kDd3jYDjڃ$4ܒ! 8HA#m)uU~V6bN'I׈3 FFZ[~AKN4ؤfCPwamLB[v 'ƷM _w=u7 ;oV?,Ą_,-۰Wm۽L O- yyy@21ͱ|Sԧ> &|vӜN3Qx'>SM}p?iuL]5@h!V 8FBfqfWԥĊ2V"q aglM&K6`}ap#lj-*zF۲kg5!x+wI@CU2v㳵:Ut]v&s#7FfNm>Jeds7z{2O|`%KpfiBě QAwuG- ' 3,|3{Y6epBn.~?^ίZ3|%G'43x{)  P({<,z)!+6I%.lQZ=j"9}j%Hb 4:e'2W{:7,lu~R |wۨlcjkٓ5΋^W]hu 3gڜw  b&;mpb <;|k3,O:?Ndߤ̖ѸYvs}wu=MLS~/1P<ӦvyQ|'w+Ч>)[:'?)+(((((דEg\p)ה?5sS~վ-ﺖW^93g!K&i'&yiSM.ױVSp^*ﺎIj+ H#>gf:R-Kˍv8Cn`%ѐ'Fi])̙(-}TP[.B66QR!Q6R( XCg#&=R,pkʉyQȎf6/ֱNj"E5tEDTV˱ t˖p |}s󓺊LJ5L~%9>J3Jns\$POk }Wj_ 8<@ѿÿ+(2ONFqW25.R9 l <V˞<FPB_t4eS7Utm:=,ȳ<=ԆXbj7AG*ʴ=HDlZY 'aƜ4m8pǮpL}E xś![%AnMFq^Tx$$Vy'/!pr;Kr0}sƟlpիûxO_׿W_}WS:O|6Z.>nSQsssh6ƾ?mqMK7 u;7̘1CoP7ZTٓi4w8%<O8A;lySd awQg3JQvݕL3�nLZM Viu7ޤWLO2)>JkD8$QJNjAw &ֳ} ʉҫYTi:ŋAUz77PH7Y_LCW5,AFmܥ.2xuְ.Ǹpb^^ȫϳr)ŕabl6 t\F(,d`<y08Ls\y(,+.gFF Dz\Eoc,pb4)&T Oa>j"`2Ճ  <c-;sl zdz墛;+7:A!b",k\]92\b 4"0tca.Q; -N[3}n ={3rrr *S}ɲb ,X`A,sΜ9r4={oF,bg!rrM0�jBw}W_>qℛCP-GE[gcf"4[|I~_f⌗u9v;1Mɤ-<>zo'�3N¨u&C$Cf5鷰cؤhu(gDQ{5 T 'ļj:m&yJ.:QYg{<м,8Քg&;|QlE:# &q Uѵ 5tnY@)B.Qr7bPxuNPsɗ^m4�� �IDATӞ77HA#gzXtFQjXms96B\ڨ+d` L.d^[~ŭWl.? 1B�K:u츁$M?Okg V=\͆jUK8 :HʿK ~p]­vV(_6*) }Fi*Ʀ X1١b.Zϖm0񍣚cDa ҝ#$06I$mݐaG3elۯM;~pLJߛmm0:iMY?+}Q݄J›f O8144444tOor5= |aqϸm˳'&Noz3;m@@5)ٔG3OwVd^?Ј:w+%gL:?8Uq87@hL%1Lg\/j `|ᥤ8h@~%SU [鷮1V4Bƚ0JuNFyVADspڲ'AP?UAyjrr`1Kyzˤ-OcCZƾ½b2I+C/c_>òJ"@r.$-\M4HEh aE�\ίtUG7#qB7rߛ^᧸ _Za!y]TR96xPCg?EKi3: H1/r BDkٳFT.`И!,zɬjMb tX>+AP*\@ع<I<-x^FMg׳$HA:38T e<n>*\3e@ij/b5m.Ԝ;'&7~)s2E8ч!%[&{Kkn[c>٬`OVƫB fppPԫ:~ѩ֑#GD>(3Z|I{RO &<nu;H}3{LfFT9˺lBL`Ąxӹ ȇOZ~:# \^hjY.?6 ͌ew :HԉJ@q~#R'FJH1H&Թ"N(H=Ԋݶ<3H~Rqyb%mmRZCg#M~R Vѵ51L %y ,EpXy=}#] X&sW0Ky/|&;k\ZkUt3#Ǚ=@aE _xE>ҢϳR+zbְ !=bV/q|zIM`a n^3?:x.sKc>CVNHq ՀfHscInǓIdkB/+<1 n3 (>|15]a{u\"<>Jϟ?TP:oMqP|l 9gn/U2<`.\U)=!K7InQn_nss9/}VzWި{ァ044tBOg7#D9wz)'8nܲA:n„R{mw'NL&SiO)f ;+qúȆgS8F\6ٵ=* 3[̦XlK㣍u6uD5rvIȼM4BX{1Sa"Ѡ8>(Q'4ְKLRfkz=~Rq.'r$ h;^" J/ea:2O:Y uSX/ vwe(og6aaϟ׿?of8a}v%`dH/@ Bqt<̦Rz7ѼyHp{Rz)W1(:Dq/V1K+6-cy_Bf+[AqR!O,-W6e<Ifx6OR^*3,ZN3tsCGg܌sS#Ψ"d7])Cփ N%T&0 5?RqJTvOxG~t~… lw+wl_ЭW 940g݊ۇA_l0+[MLxmYBq}ݷS &_ +^[xǙC7=NN/n%Ѷ׸iWzÎצ<LeOjg"k+rG hqGǝVd56wBlʗU+([,)PRU9V8-\(XN.:1F"l<56cK|ycY )(~,'A8LK$Ûk"_Ok~.l$N("^ #cd= cG%`May)O$1 E`]]GOQtѯPż�7Gqi|z*V~Rlr#VIT-:9bMʹB]SXM'<lO +ַ<�lG&q9>%q8̘Cpɜ| Af~85s4r,TDtԚVe m .,++kBUM BDZ1}aIAoLָ{Ͻv>J= P!PTvݣ8~:8c ʼnzrOjǍdBQ8p ?I2K]wu=4DaiOs}IS8P;W fGȵ5όF0ZL/hPc>\_LRGzrBC؇?Vgq,5\?ou9"fBNu5)]TA/FZsxf![)cT|WFhf1TՖ]VHH/Yy/E,atX3j,e?D) sjϟjU~?oGo1ror3/_l[ԓ9Z$ E*ʜa>GB^Zm]/pQZî,mP/V%#Mlg=\YO[9<;H0; G~?e)3YM4N%ٚq?/{rCo_1@O@ա2ogWk\{vp\�ӳ6%c7q8f-ɥGyۍ#S"0Lw'?I;9_>|_zU:vs ͣ<}эڋ/^y V{uBx7\6~㩈u<jōntD7HIu퍺t釹~RmDq 25 mI`Ζ0zk<?̦j"$gʤFQgr< :dEw=AWa/Tө)/QSbwjOKjikfSĤ Aq-^l5SͶE`.b UGfX?jvjEMv)4N@N#_y�K)k.LאE[{hD$Nh5@*٥?%Gz?KCƷ=,ͨ`>uR_3K8$Wb70]l dsoiKwJFA~8XMc_f6ipV:5P%!o51dq9[OۍVSՄԤud_9e6@7ڤSPS Fq 0NX~h3\:MZє}Kjv;tɮ;ϽO0նkq"p>P7A{={q7|;�}nzjME_7mŪ�P\t~18[o >EM7龖~4D95CgYwfllLe {Gݕɬ{_A漜̐Ϧ?p.l$B:;̸8WE^w \b%gf[ zb^*WF :E֌N\AH%̦ \B!5>{)AL9ݬR>h;3 B#}q4dyHyaTļN9~gd 2ˊ}9H' c?x'Qar 8w.8GzXO|�30OrE?~Ǘ='>JrK+d&} .YYAw#MCm1.m$C-޼jO!z1ľ=s/`dϤI3ArCPV!"և;/xFM Ttw3jrup6f;+K8^8VlֹPLa(G#t`4'ѶL< =bq6̧t minQm2`71cv|UV#reU3" <WqRbf*rOSVVTR 우lfJ *$ʽoV>[o5Mޜ$SiN9:1/&d[Li?>tO9O43i͘m={V5זO|d-X[4D%W6CA VU(i c&|*!UܶanYM{mX5/XJoFf{E?o玆/n*"*M>HA5mlT'uPHˊ+x38ge<?Cc/-ڐ!~-$'/մ~Ǘ,( Aą=at7i|-G` ۚhIqT&Ak=1*'}Iᯡs ep&n[SGrfoH6Ȼb֡v)6jAqc.j5@HP!2UPC,XшLb<ڔuA \M"jvذ _,,ߏj|7NgWg̝5aBl&MѼ^:ͼl6TĉvW~'5?]> {{{j~5%M~ҍno<*ȼ[ל8qmޞ,uumiv2pvN13+>i|ŦrѨ9׷u)2l=fh6 $vӁ_ȘS`7:g9*AқH+$4mfzf1G^K%Qu+KU/S_,="IeT{ ldPϳRsr]îC?%Jᗝ^QrZ(|e)/֔$27x36w!//_(`0NK׸�<<ʼy_wG[E~F,vvb櫋)37i|;XWJ:v<Uرu~R|'[S,bc\-6ýiAkIMlׇe663L&xMС9LEJ' (_\AK^*>>~56>CRo{~uҟͦ5B}cJ2!d (,,=[x뭷[J?{gSNd2)LFq#lS<Z|B}塡!w=8Ï<|)>zsrrFmT勿c2vJ>Ɇ'Sw:ZqٳU0y2G֧/;O5 pqthgoW,f�UK6bnic�ȹ3}&U.+/4JۈQ.JAD^h^L5y͔q{Ю]APJ ^h5o R#HU^h.'&ONjaBo%ǘ(f,e*%bro|?RWfJ/_w!{= P(U(X.%yɼZ/�>J Ćs[ȫGmX"n*)U\zOgޱ=fTfEUUiϐPֳ=�v&J;M'BP2) pg"?<L|5U6 /x*ä`b  j`/'[T6w\{)i\zt?!VܵWgTGhfmI3G4v=hM?ZgQ\Sv>b[NnNO6Vqzϝ >|3[x/r﫽 .\p{os}}[q\tZr(((8mpyi"e&g{Hʨ6g#!s Q(rhPKw=,z3I̐2.k!G88s_:8Δ }Ӧ8>;sFeJ;mZ߭$9n* =rKaʔH1bZH(NH RYGQQr%Oі\#=7n/WYZI8!UY{n3L~ GI!~ߌyxoH{K8PJ^s\ iaA FSPQ浳:H +T1:!fO*-n*2jGuoi:QC{~RhgI 3 tV5G"9ZS ؆AY2Dx0R4>&\A~q^w"ql1IyIt6aW$Ær2k ެOӟ`7o޼y,X`100R믿믿+k6lo̙sΝ;w"S??H.}2 :g~E7zo]>[1,#_4SuF' {T*N4 r5 qB35e:Je쨵4$'-(b@wtx&+#˨2:QUkgTo^ĢZ3nvjSPa<}?j!ůA XJʹ5@j5r Wod9 1!filE 03$ݬ-1.pQ kmfɜ?9B\M?߿+=OEm糳9>Hqfa~?apK\Z~WB^3\"m,ae~> e,駨MHi0&A){5t}(wj k3.K (c~3m08CL3Rdq4CuJ<=5&Zr2Bc<vlŞT;$Ŕd1f a  q{yyyp;<Ks՞=|c9zwQhs=׾Sfff OX|?fzu /X;o.? A}kTƄnɖ}tɟ#1clu8z#G92%l7 )Ro|;\5ޔ5 %H"ϕ߉$e`r\Wr;[�CaX!zkSz+q#J!}PVT]^k'[9aK8 ֎@:jOZCM0(:fUZD=e>؝i6Nh>G~sx8 8\a?_b<>g�3jpWYx!/]k^2(Û{ /!o7* 7| ,e0 +uD)Lٯ/|:r9*yzdsxɃS?C+@$[c.N2Ny*TSrvt{bR&lS_kl:Z#4$pP6F;�� �IDAT$Fh~ w9e:888֜pn<?(vQ6Z:d7QC9yl�(򣅔Gp `uYx'\;s6l9S*7$hAu[v$g,=a&6C{'0Ӄ0N:8'Go!aSٳjnvITc=ė 8*l+b2']㜰s[|I5kjj֎P:66m۞6666)֞i{t&r|ͮq#*P)floU< 8>.dFxk'5y.))/Aa0a(䖦o([&K $U[n~|d4 np/Ay+ )IbcLAu f^]߲Y~lv9I4$4 Ko p5?1_\Ӆ<_陜<<y#,LNPS$ fv^~U%"zse7Op>Lj/NlWE p1Vғx݌d9Μqt Rc~b9Q x*d>D>*݊7>e#=ʏyy'ɮ*XY�RǬG7aSGɛQ[:[iU XWJBTt%]-CndZX?Oϑ#G>u` ͊5-K/uzQo~#DQE2G^EV^]]=)S VGj.ZԩSW^ye͙=gxd4d{)ħ,ƒnrO]du3ڗpn[3FrZ2K&;nKkE; Ws,GH!mm|[&|ZٻUjFw l~ 1w M&FT6s'i1Ԟ K o^j[HhL FcU iv2 xHj@ 7%?!r|v{eH^V/q^;?s1D"dWkx'|a5US  XLN/-V6%Xζe~<7BeD5RhhSee?ٽNڊ4@Lf5[pZ-\ՠ]`}%RQ^z~.L(9F̍o-;RqQu:ܷnC+Rep,ʌY0+9%@>IV}2XP=+=׬Yt. =c\B%]D!'KfUs-zo٧&޾>}Z {X σ|pw6}X2( {ē5BEU 5?y/L},LҔdK<#1Vɬ)>IS)@,[7-|v}e f5)XP5GP쫐"S[af KlB,rDiZӹ-5*27ҿطeOp;5ze컒w Kƒ( 0:7}fXS\*Swv^?pyy|qs4 6ft>-d3Z U5SD3p6:k&źQ+*PHP;45V]^SJ!XUIu(gpʋ+5er1K 2A `1rqŢ˖p_O !əwlxYuJӪ3vM9N[h<Ϣvжg+NI5Hb~h.kT3EÏ<cShsZL\]IEyB ӖtGZf܎7ݿɽσ|w15Gyǝwp;$Qm5&-L/ pY%ht3iMqJjZIDZVq** l.k}4J_#'Q,UELnUE)8=Qm!ԓɐ7E.n GphQϼ=c{3Y-!JZ֪39DpPNBPetӺ]k鹚?nZ30BBC"MN2S5)ǥokps|nC(V1!{9O~j9ʂ2'?9,gj/O(Kd6QRE>g~GY�<ʷ6!jeKBAgك 5 a=;YYG}&g%@IxUoSVY+Rݱ%}Ve%Jh&3L0`ї L/H^}Ο[8iNW5E繤BM?z:)ϨB WQ=S~'=b9s%L\=_,<'6c({TԊi<k,۴fmWg|<sL=222s[-UOTzcDg^Cya no뎭9j>jjj.ltAQA&綿~QYvҰ[u?ЎDܰcO5 S{jӔ酘$9b<W;Ղ3v5[mrچ)iB-ziFE #Ue9C6lcu bͼ6ٽ[LT xa7F5DgN5XK>#Oc8qǥvY}3f,Y"ϼg`'^_w@ #pQ` a f{)c.7QB{Y1sh+ػ5TIpF5kJ*6#ˆiK$j)/Qk$+1SմWIg>S M7Bi2n+Df_i7Xunퟭvrln"n#s :L,\%[rP1r <44$C}w}ѣG짊w}I/͏~G6|F';*J\+RIK8.霎?xm>}zK.yǝw(3V*b8ҋ/MzNWW[L<|ފ7ѡx&%M7ZLB1ywdYO9qj<IgPϚ#A R{vqZoY MjT#83 l?E8:oMZ/St3:=5i&dLW2Ipt'4VA_!π8-p5?ͯͧ5T|ʵ_wml [HwyQʯ 2Z+?ˊˊY"Ǚ#k{m)dg2RzۦQ֓3�@pVW=wjSʷ7GKVadHd!7+;�_fQr&'4> FA (MүDMl~<Wݶ2>zħb%Ul<u]& '8*p si(<uƻuϗw__TqN=̙3G|W.N]©S*jK/}+X30ӻjW6>-pծtiM'͜9S%rlj}>#w<22\ݒcΜ9otګbc}Q*zz ^o֝B}I)\[Oר6j_}RZCʊ�O,"Ac 4ţ,5~n\g=ԌYͲ'J_d!^6"DX yM_Q/ŭPD:"iԎ^m/ ql ,5:K?`DUPwq-=,5=J ErHh7 Qom;' g?ʂ//?jN2s>ͯ?㷼^·m,odp902Ju??JIf+;a_q fc2EIutFzi>o ǙZ;Z}iY,U34\oZF"I^Anar-8) 5et: 1}S(}VR0f̀MTumB"ϲ'BƖB=9/4Q:7-oc)FLZxYe}W/Q!a7|ZԼP p*@s;+*OMqXaj;)*IVQ9TmM_ؗyǝw.SO 5كSz]=ĶJ954.>i(GN ʂiBII.9 ?Rsy1!(#BY/o,j#dCէn/-&8V<X>J cSejYX #RA2 &ana<luiz{eq`H{vWe !je(Jn{ GP/ta/M.U&kX_'?sO;՟ ZN2]~W~0>۟׋9T ~ WAʼnkX~XrҞV3s#d#dUX7`5?ر <[W@M5AUmX[p4ү1IOjޙeX]!U)Rd\3ؐ*75TRb)/>3Jj>q\^ RCelin˞3Sϱ"U~z::�Ζd`K;6޳q;hO}J*?-ojnjW|,Tb#X3uD<O)AScccsakSۏ}C>x饗>Ï~Qzȡ(w6'\ʧ{Z7?t|9p[On0o/.?}/C;$0pe*aJVa$ K4nyV^Yƌ3mu,Rw*Z[{HϜみh-z>^P*'Ory(@k>ViP-p Bc#]E~)jWV=kUÈ+;J෸~1|y/ßq&<3K82Q W7w/cU*Kr>\̡jFy@<7+mЏRQėԣnsǁ,30H['SP׹I@lޫ]4�7c"ƤWIp,J!Gx3X&3A.e)ZTj.,+x[i&`SjT|QL/8֟STIsZ!sql[37CȠaנI9:xxF;cbFY̙3US*>ߎ t{�Pοۿ}/;cf>yo>e'Nz=67rrݦ̜9s%sIag+u۞lcc: lXLM5dVY2B4ћICʈNzqUiiĥZ%^>Ek2�aLkYWOh 0Iޣr6jxiR|n 2ԫsa] RH+\XF?BM#X7+3BVcY9r$3/ßqb%he(O|p5A_M>frH]f12Ugy\BϏԯJQ_`ViEH{ fxB,6 3{1a l]n4bqmdTThR[B(Kȃo}WP,U;#,vtaÂi+,,a/x�FYZ*@o||kN!6$�j@Pb檓Bph8wo-t&J]Rnɓ'&k7*Vћ:91񯴎L}L"4<<\~;1{6n{~w|Ζ51c%\"攚N>-Liq=}N$ϋT:.Fs:s}7+/2<rs4Vz<e|og{6xi_tN85Ei6r"dl8>8PKFS]˜e];䩝" q٪Al=o:N¼�ccVRE #cnX&R`21B$R,Rib6J0F !/W9ɵ<O^VD ^^Ӿ"^Hv7kLXl;i{UEKs5 }/CfXaf)7|+?+xo fqBp H yY?-Wٷ{\'>Hdu,O vYo5:9Pb�W[:5/ i�e̻"HgcO4"bz2=*i䋥4 ?i.JUj)䤤J6LNKvYeaU&Q d.i۪e>1s:%KxcxyJ1s4z򩧞|jj6Ű场]fy:;Ӟ#ǂ t\}]eLHv=&FTl *8Lpa'}iRy[q^( 7]nڭ~igܟxA1Ac@(5a4(}fOmq+ȘR_T@XDxQӜ)@j~QEH,AD0Nt\LV×A+T!eEn[KZz#18;PP#QrQ/e$}9e9}ysenV}=o c u 8:ZƾoH3޿,>P3\=򲵏eXRnV_8S>?D5GYp58Zi'oln`/3kHfbkcpUe),gi3ԋbQ.nΘ *)'V2kQpXW}W,UEȄEX)KdRNK"`X5̈́߼UBؕ̀%PL ^<1SVT'?/~^U]de}D/ uwu=C7c"/ԩSCCCnU166&rЩ>ֱ hv^8fNWb[kiP"W^~;8=';(5\s5׬XbŊ .ԗEN[-*5Vc**n4!rkmrYB4kh|]Avxyh꧱4^>MR#]Z"Il .Sr (S,JHw?ar&hCq!GV{:װ+G.nX^`p|jX"3`6$hs8~IjDd&'lw=H- n*RDG.1xY\}-ʼn<M] 7K8S> `IP;/0H]mt>ǽXƾ׸9D~:d`},O4'ͲUt}b,˕I3.nhgƜS A(E8HA[)^\T,{2N?Srg>[h?3hrF<Mm2yOnJ!cHC1ȷ0x_pF"U%S=hv{۩Sno|RQ4�� �IDATiI4~4BMvxَ9 NMvLp+Wϟ<WkQTigֶUw{W4ǤnvdK;3b?9w89 |Vic oHK ~Qt,{N܀e&j(I=  j�U1f^K.+ ŋ*'Iچ ةYeh#vjCSO )yRdY-fzo5 vf7]ܰ2:J5Ǫ9 Xs8ՌJ,1XЕwrqAV|XO 9gyf^b\[mlS>%iZ,:̢Y \/ZHR}QR\<~eRMއ<!hJ&JkSUr(Ks{XbU uv fHw'JI#)xfH!QQQYy칣 .$mMGϛkYXi�/4LD3=LZݝظoAwU,_۷wl?'Z<wܹsΘ1C۸TUUU]n,՛"Slw bnMz`o;,VȓVcTS$s[rϽT2uT=kgO}ӕmLvEmXp饗-<Zj%4{lF2;$l+Y,7O1sZ>Rj%ROR^X. xch*vNaRa*iޤoq?د^nf/+Tz:j9z%5UZ ;3C %hjF;iZ#Ԅȿgȗ̜ W1 +xOnGr(/r'Wtо"iXѫ9W,8%(eGXWԓՃh`C,!-G /'R}A%he9j,}8)%]<ޘ mXf[]`09,Q5:7$-#)5#^"8fYpyW&;;j긫s]w>Y7-Ԥ 0G}3k 3gZ>hfc~NǙų"fYFNo?|gh]ZI{yL䤼0A'zt_km;ܗ-> l}f+wyeU0 \rQ4xVU`<ZpH ; (KYjVH3aڹxJ{2Z8ڿi-/GF5RWAeN%8:J.Ri3c9Zw.C* So =D;Y'3{y.@P[W;MƊdn׸9cX{y ޫaQ^V,>|E~w |un /\ȑ, ni4@Q 18_j&haQ ,cijkz"^QM(7^Ǡ镕o< e*^>@vԈ1K`\M .e&WD&e�Y[gdN6o,ʨoYeɱe,u3>c^pÄoל/0i˺;#l~W]>+'a/MΟz3GWחޯ+%\rzZEmt i&pbǵLN�M 3ga2sdN;offgv3jls#3 4a莰2gTtG~Ȃa rï xcY<3Hד(:sk2|N z^\Du db#4²hX,1Gx[λ^ SV=UIǪ>VcY`?;Y*v08z9K8W|;r9e( %_y&^{\%u5)mt&hY^ś4ҟ'oq}5Y=¾6:c2e7^VN@H!Cjv+Ԅ$UI5rYuKx2tqROR}zݔ^w)G1I<#dRN֘P!'{'0,*;qC97>H ;/9N綉_rz%eqbLI I-###oY,K/]mNnZɤV>d8>cy֝R1m*`Hzn*FaXkpP_s 5-X>97HsR?ԩSj>t>'O;ԙӛqFنRaZ%9d0&5cc9?vT�bDz[k:xw3F:܊%k.N'8Vg3llKJj i7s(-RP>1Ud] Aa$H*ֆ^t4}{,QZ;DLX0Ml=Ƽ 5fEGY%gC?g3sD}_rץݜ,`04y#,TE7rިqj k,^~ [B]~MN/^k6[75K> V"ެ}[Y%,00b ivp j?f\b+#du#< $7ڳg5Րq, n e.q='jjj-Z4gQ/aR_'Z#KҲJˑ~y{m\_[kcR-ĭ╗_^{2N;<DrV "^1Y%f9V>jaOrt:BFE,6�⌘s'Zp)ɢP*HJ%'=\M -AÒid]C(arGXYHiqL H)^`fw6DeK^>Vf,N(Z afkX_^k]%~8s??>+xr1僽%Oh ivFy<4M)L <ǽsQ ׏ɷ0'L.~Ks4dt$VBK!Jk!YtKbk>2;XY6 RH f#XV[ 44'T[X D&X5kJXb.w;WYo1m`OEOYR)14SzVz lXTv;;%}\=AP9ܽ7ޭKE]q;�6-,%]|vn|YIA Ojh <mL8iڸ&Hd 2uf!0Ŏ~ܙhVlaH5E-'0?j,$D"Ǫ fzm #,z2F` u\]P@V6f iF�#t#ҪǺJfwwg*[`2Kab;ʂ~u9ɤi1_)eU<u 5j=Hsh.\{FWfTť,ְK!$'U ҪRUu;Y7^{keh/+d*r50V11S/R蠥HAm^ Z  ;/߀i<6z*~Iwct=;P&y , <nHX )bF$wܘq.|;I/^.m=7O}IUUUQM&^wxA;I _>3VK9S59) |NujyџP9LG3~K.n۩eةA; sU̧eCD+8_bcE<=e,B&Gk = a9)bfI6B͝#d*U=ل^XA͞Ysr9evZS쇰M[8%fcd(¼9QBY3 uq:UQ[ԥixobM#3\˽:-JkS-<ǪU`Wp`/TϸNQ\/adb:h�Kg? 9ieJ )Y xcR݊rjv|FSk>r6HӈW}vFX.}?Xl)V$U�5�J lf^WyY2G8눃#wa zkW9tӤe<K7fygɸ5Vک<%b! rE;&Z ڤEÜpߦd|zߦfn+M;ܤg~fJ>koK'O^XI$gk$'͐}IӜU[w8E75cm1Son۷]vKz>8}iyUb7>&ly (Yj;ȼkUFɥʹ)Im,[U"kDKJ0+s>"_0 &SS@0jvh u#\~ܫ5.tONt!jr-H�AjopcW@Q(l;^N5<۽m[J:vgP׷!apt/+TﴙޟZ;opUyBY4簀#<H 9Mf!meܨ :v*5,K2ES "TZuН�"AhN*B&HvҠeѡȖb*CSU6o5ם$x^l~"-u!PIGXKL |Q=p;ǣ,M R߉ct2;| z)g >3.lz$#9#nɆ4Qs<y7SK61)}iLfiαsU<|>1.Je"djբEܓΟRv\vet6m^)xia$/\<!t>|xO;kd ~6,DvV 9CBM&-@NwvBV`W*B&kTzv 9e vm\`=, Z< 9ښMay(Fem K<N4cmtn!`94%uҶ) �Y]Of-=ǙQwgNIxbZ ¨5}ys8Fg _8Ňd4/},KV?q�wFofaf`C(#wtB#3 C} ^])C E׏/cgk,WրCsЫËxeɩmP2 'ؤ9iSyL8{O5򘠣<V]rXұjr @L5!7T|Wo &wn{MQNI9AZIm;9$`ۣ? ɓ';7L IJA̘1:^4u=YSMo͘1ePOz'L ==+´c8fQSsb OĆ@ᷘdbh>?Yl)ofc,Z#-J!J짨EiQj3y8 @p=oJ\%HcZr ,0JW}'sj&%ad-=-6ѿL (c0eʺ݂"% 3[d"^3c[ )3M�YQc5.q)e~,`y0w3Wu^~kֱs-=C#D)oƙ�][5GR'7ZDU$ٕzÉ a+K<k^}*T,[jɢ*~ 8sM&oU/a`v6 /1@+_|VdaNŜyaDɤcљt@;^ڱmg}j FҩS&5fu\ /tqv(UA48_FhRL^l=wlom݌:X<ǟTO\"de;)8ca^ܑ4r(yd` Ϭ6訁~<!['4c#Yb2Fcg?#)*&JŚ|`VkhiUfjϱ^sV6)gl2ys)jՉiWs'mzvvq4{tn};oqjb$,c uu RW3%H0E{\+ס /Mr}, R2zU�^/G:vXlp`ֈy5۠b)_B9ZMFL'sji0)MCWyd_&G=MX32g}Ti2I,5(KSl-5QLsx܆ϠO <Ehp:^y]5~w ɵ@\jǏO*fGJ'=Ii:TAN{vvZ+a>}{ӢUUU͘1Å=H(k=⃘Q!ćL^xR*91v/)yím2Xzm؏aR#$\i? ٌK֩CzW$seكϖ҉`ͼ-^AZg3f`<u(1JaX2P 4Ҭqo"]Ks1i= in-=B^Nq-g3,gKrafP#Ǚsd uݴ.galwFXÝej?ΜNzi(m̖ޘD)]Fg)GY@"B|-=*%zTBy _t&ŹmW4/-b}~q2Fݾp)$?d:˸6XZ'd]&^fFҢ`%13r̐dYY A\[=cHr|QXah)Uq-~$Vy, rXUuCZL'-vyu >L<~L-v:>;O=m׺za /x/e[ OY\LM|b|g8#XX˘0,0zg,{3@+Vc]eZe2M\O T`^/.Mj%}9ȍnJ"Dbhz�1Oc=ZIPeO E`1(@.n V)F4>͝k7 =@/rؤ-0`hGZՎҭjrŚ5ZQqPr΅tV{z2ˇ}#o{Ag_i:.m2VG"4hm7",!=R¼^ֱxUXFԬgFU@8_UU>(KSQ<oDi5Ix4COdi&#̙FB R|eUQE_d:Mɖ:\T.a}gM4`]BE;O?+9pov3)Xp?"O|w7EʗNF;6Lʦª}͹-vsǝwK~ZMChGpSI?t[+R;_*�6g֤o% 1i¼bMstht{áw(s.tpnMDJ@Θt oռ6䠲Jz}bؙǒ{Oz P]36Rs+jR;Nڬ@0˞!Kz}52y�� �IDAT>?v1x{Be-6sX&U{k2ԫSeHƁ`:EʤXBO/*jm�Tƚlz}jW\2-PgJ+fF[&Bht\+)`␘-pſ|@;,[ExH"\1} y] ??5ee=k/nQk]&n&xp;vQ r9)+ĞJڗ3 wig̘aueP1>pVvsFg't*tN& ~W!C{n<yMH*1]­}3u555Z1'LN7>c M~/mwx ([Uϙ[8/{̚^ J*JS}]R2.fG'`_UV_/.RaҪRW,;\ 51Sv+G4OYH)yS6z,5덈E>"(7 n<24HGZzdhߗGhGC,H^ zBDU/#ZAoնǮd];"VZΪ݅7>SPTГ` X?wC:-+u-NNl2\}qsK, N%CIax6[gC~7.W$>'vb΃)Sz3]Nʹ$\ԧ> {X![cɭN&%kD*9 r8p̙n"Fc%^OG5;NUsn[^ C/v+ u hgN\BM&ָ;IUkMƵAol4 ,,d%*#n>J.EĄͺ(Q ZiS4EK{ Nr xyj'QZ zcrr}pf�"-3BfO8J**] (dU>(And]ܠ2@Pfz37 AIT[L\bTԋBV /BB[Ar<AtyeȨv:@rYP_dE 7s BZhu|ہ0|6r9biKV  Ϛօ<4Z`9b42?LZt,Y\�l=oNP'42CJﲔʈP(sk}X I] C08zW_v/RҵYv<uۻw5;jAŭaxz)s ;^ڡڤ :7{<W:_9‘i礌xI/ 6)ިmC]Ȥ*̓u[Ԫs"N١M*xW=)q-#7)9Y{,0Z#-09XX`Uv<-UYJJHŋ*66ѡ2 DUo3 &kW vpz{GYFTyԭfw7K_qcg/ͻY-M=m Oxeb+{ۤ]2QOl+"?^!j4muG6fQc9$-?''#!B"R #D%_* d$PHieyRZg/n֛ls8oI0@SYN.I'Ě</i ߱~Wzq}9wt)6D:ꙢܧTaqg[5 T˥̖85O~I>SwcI?q]w,t}tۭ',sh|]w^r%uhU(R?}o}o/tgBN'tK:s#ę4QLC7ׄq-ے-mǖ'1GVQVR~mee~|jQd7Bxl7n$+qJ1D9+74K1ݬV5i{4M 3c< }"1Ōw~c0hة͊r4z(SMlBڰ_agW]]P?]zWpMlY/.N0o7+uO`#o)tҦ IdToazshs Ar)fKV*x^`a1neìķQYoȊ̪ L)L.$X<֨jF\&%Xٲ{YӃqŦ P,Ua/v*5_#\8kjǹmme}[�*Uu<ol9iEJpXSS3Q2|4;U䜎 wצX,?v [i!L|[FGG'h"_]]0>S-Pu_ݳZ.uWj3>*5i6YCOӚ�cYBU 7ng-8=%n',-2[t㙒0@|RLT2h$^^92k eOarkE5+5>Lo5~*B#*zl5c#inB\=yrfu( t7&pK&՝Ks-C)r4)*[ގ6ߠ(l`bzjª(}A ^ό!h >u3\s�,ɈUuqBUc)TY2Rz~F2qצ?s7LΰR&5@D۝z$\tFF=bdv歋nƬx9+iY vWԜ~'Le M P9 L#o >Ï<lSJn~kKV\'n{mAy HJ4C TO"z;4SP7csէ@yݖJOl9=9SfD!lZfy<Hj-ImBE43&M "H@ =/h<¼ĸ[Sד(-RϵhM4aEɌ:"k#d8-b`�= .8E^Xe*e)Vkr5Rh~=,RXY$bE ѣVj`p'QZSj1MC)zlSe0H)ihHȐDR//ڰ l&9ZaM)_#n' ,ehmأ,2 #ƇKj2x隔 ɼn5;ruerP[Ʀ9ڴ ,_w)>UUUW]uF71TQwN48\]wxx@hu *hm2t o/1:>Yj4m D+cw<iΛRXVG Pt ~37ga!V|]&۞9Lm=7򂉤CI-z_>XY*:"Dj#±"KOy�F2Z$Jk%fJ篛"ӊ!@*AMahWu[{})gK/-^fp'E8$)Hޗ~RO%rAjyKDF0f�IBlK\$>2$_h2I b?@ x(9ȥ ˞ƂլD(zZdW!Tw (jIa2K2[ Ra"(KSTA<[Fgǹ(cm]C|Շ2({R9 [JAWo0sLViuva<Y?X�c}i_>|>rDtUv@#?w7 a[8#.(ۿYv*0A˯Ttֺ|;^~B4nӟku.􁙸v}?$*Lt,w?ԝ%&FY!Ks`f|Gob;YXHAkCjJ1QR eD>ݭ0bFz2Ou$MtaN9D.rmM�M8XTUUђ15!y 2fM e旡H-*&tC,`Θѫ9H68I69 8OݻuibElV˰c<(5`ӈ6]SGGiO!)R%[,^$JcS=Z,`ATcTuAja=gdD]T('?}{NUW|0V.NsEy3Xb6@!1Upi\SL龊[a5mʣ 2;9A0eՋz;i8exUAS'<jóXA[3Okɍ}bׅƺr &}.%pbXS"n _)."O=SOw�l6WFJ c4yYU?O=Ï<s>ܳ] ҫ|DLm 6 =3 2KlZ>M]5Prvp2 $Ⱥ J] lO )~1FVue3\ohScg﹑NȞ2[ oІȨЭm3;�gS)H^y}Z`xTmD.qS`YJ|+!6xKDomE4ٟ[qy!d 92\w6L ` Il LСT!9M.AbA0ǕU@<\.fh,PqG>Hefs-gYy]l;ӂ#݂e^G5wUScVnK7cۇ_> wIg￟χ_>|뭷zWzz)^T2ꪾ5АYΝ;w~ͯϝ;_1+\thw /~3/|3g>&k+.F\gVor3<~m e,a7P%O2D՘yj;naE2a?�̶eYvϒYc7ecށz :t{^�!psXB+}2o =Dr:V -ZJ¢D:-L~LТQQ݋6aaw Ŵ-MG& K9|&D,U4-MjU lY߆`{6 mh^@ UP t�w#J^+ ~)D!&C #x|^NQdBɒ %JТ8Lco$MTwQ 7FQh_LZSFu^''P:t: o78%kSg3PF哃8={[O{Wuk޷>b Ͽd\�{p.^ Ҟe:#jj ïL7_|Ł.6ҡ({7J~YԼV:?j.!-fڰ\�ԩ#2H $9̪+77irvBq?^G2Z"<YrB,б|$4P"�`Ile, vE}a8bRU@vlN0N̠Yt )^U|M[ 8<N7m4poʲfz8 ?{HeyM,�bG݈bC,e,-`�ۑ!hkNuN/B̢^K]xY˻:'p n$LcCŧFnU0!`ޕ[v}$)eO6L"t$Khz/(Cɡ+'+Zľp伮TADpQ!ټ}EZoǔi;;/c>Gw֯_z>S7|7 kgjGGG}Ys];vx7XZ8,8?ClkѮ5ں75:j>#^~ޢ5ܗ# ${PUv,^5ݎeC(Z/VtAH)'߄#O[k78G{}1iGAE~}G DitVUJ: �?r(0}�9I�N&seb]*~Fga?)q|wlO98l4q&}PhI L)4jTC%)w?MR4XKB&,8R~"zKU H^bmo _ɆTy d[~ N>R @]}rjx�EiFf3�1 3nĤ@bO.t A\tC }4$OBk]!j?uhNy;0_x_(=Ч~n0�0󿗾/Ȃ <Qρ�~ߌBeu63 %<p03qhMꙧiCG,p*ǯ%v؆FC,~\%vRc[JrKj+Z̺uFnhd-`SËXTpA8>yFx3bS=.ƒV`Shn‚thQZb.k6Y3TfAla~=?s(8~�| 9t͠9a fZbcjg0#<r==q~kH;/h<WQ'}yyjC !(sPD61eH7$�(Js^38M Bʭk_/F<Z eck٣UoOkYBd]jy]|y@:άBz2 ȸБf{#!;yۭ<_իW 8(߱sՙPɑYWtRN7[jl۾M>|ŋ:|{W--O<̡�tKmC 6\N5 ())7ȦX'E+b=D֝x#bȕ h9A0 t\b7@%zuXHɵbKV_P?s5-'ޯ7P/'s\rЍ:~r3U\BA&Z [mZoDZ^BX/d@i &NIyR]B@ N615<j3_lrN+hڌT`>3hWtPs^vq-jCop(Kϰ"HO.Q '6FUk)(Z ,.aA?,=hu.1K2ޓ8n.S7֖hF2ةR~jׯ7v<3t>;con:vV_:NN:ujbNkE>ڵkIn%Ũfr�'_z'G13t뼆G\̓ 9d$Y)6u)h g|vh xJ/IXTDlp|0!ΚMD$R "h+" C&-$"As>Ea\y]8f8i%;uN) 7st;Va1n hqn^ QG/U)LНBKQ"I&,Zf%gS^ka:@9`<0E7�� �IDAT7-]V+;@ԋhkAXp_qy*h%y p"Nof+rݜ=G"#,M, L3c:4w9:TZ˩Ε;A/Ё>9Py+Ί̔;cow;Q[}=ǿ?>7S,~7_bդ^S$3WV4*dxr2P8j߬XLp mv-<;[;I0ʫaP 7c{B,(m S+?(GC'=>&+3fūE8kt\ăDZ2ޚe5u`61D)# G Z'wЙA<Hb4& 'yLhf o ln&(KbQmKi2/EZsv<(q]ƴ\:痶!7\۠BOį`BHF-EZ}_GOJ[hUN< wu"nT/օS%U2G=gXJtFI1Z1 t!3#\mxz>~_\.3O? 8f]_?ӯG`Jtzt<4f:Yq}C f.}-)^:p۶o{'Ϟ=鵎^nꇨibWVH,]w=|03瀝L֧%NE.㟈;/̛MRTғ+ ,C,?z1D&CTM`a< }E&gi؄x9|Av!xA# )a>ӯz '} Jh#obI�Pe۸ &7ЦW6`YihJȞ-%+Ny;b<NoO:?WnX]&N@@%'VƓ:ҎhATf>׈7b?C{,bzX-cZP3\<NХRSt#4߆vAQƒJFw"&^@vR1imQ6Hi 5qtL?MLLLLL|+_??myȮv]Z �W~7?oHUK؁<iqU׿: &0$Dzⴏpi.j]ؤ#8]Q{c_/iZNLcأsMfh~XF hdh<y*{ww-3izUa~y;9cnǪ96�y�^PB; W@|Lj=DCW`-@i~vcmnF 8Cg06oIKLtF1.`S*~C9LD nb#9=^\2 �S2C͘eUI݀_F/VؘhhCY<IVjԫ/L4!:]`4PfE֫*U&3TM,֮eä"v*dz=w_`Vx*<<|M͏/^ a՟F!�}Zb}O<u%,a}==89΁9m":ҁ;w\E2;vy^kmA_5}"[UWwe+NiCަb[q&JTeTl`l <-q14 "VV[-=qZ0+⢋R=Pvql؆- N6pʽM/HCj19ԄS3h#xa'h G0CIIKC,61Eu)=<?MX`KV̓&:9\졳 \4e9|MLU0FEjIWg{Q;TP&�^Ɠl rIډHZTO+N1RN>H[4,U:֊5fvb]lQirf=e E@J۪ h_Wr_O'{s붭[mِg-5>>>>>^*L7�=[&<9vE'Oo=\.󾝙d׵@{výuy;3\ cZ8J!jvo 6lذ}oq i9ri5rHʤ& o̦NRKQu(sUqJSZwd 㒐TD@CKRD7c%RFEn9 S{k\dID=]z1MO]/cIގx8z.|¡#b(TAS8nev9̡ �EJ2t.;̽8/#y*h+!xҧ0.S`^궋sR"Q:&HQ ;l96CVCA)J1BʵED7K8, iJ]Nf5ViD'Zj(1Uqqfa7[hM|ܻ^5=XqǟGW"Gyꄐ]G?кaKkd@^7;:.NJdVgf̽^-[o,wʡ,oWmw,ܱO4*ld&KBXEhRҨ+(1Fc33^2ZeK lH0,o $ՆhU4W=qMlz9Q(Ct QXTN�pdF'ha<.B<!1L̻t;Z@�3Hv#ВFa||Xq]@\|Yz\B'oj]Ԧ7mQ.IV,1LrB<YdвhLRmmT$+,8EiHn5VOt PJDIu7<E␂o=KXʴFB\5׬YCĉ/}K^>k[Npbηκ.&hÙTH=pYrp_u~/):[AM}툗{UeH>ס++s݆fso sDkw\qvUiC]حP[[I .$ Y|**=e`#\x)&QQOYfWqtP8^ڞBs VR m툊xhnǹ{R_@G.dT܏௴C>pp Hc @~ShHβrSh&ؙЙe[Ί'"Es@;@=gWaV=tnq EXKc58Mll}iVs蒵$Z,ņ3oEi#OHuRa\#uD <cw_I ˉ1�AQ3}9\?kM;[a,gA ݾ{^}mժU!V]ngRou%^Ȕ!.]xN1<nmz_o?GaԚ�mr5Ї}/r:dI{sFoZ%yrꠊ3 ӡn9zښDLP ԨfKP+ɆkUEW1Flk8v+_JSh6L,`T0шUf i0ш7 &r*))ݒ7ņ4/TA<I%ss8 DZyG(̠AnJ@;Dj y!{׃�WxxAT,K)Qk Y.D3b׵Y ͶQۣj6*=X^oH( ] $D!pd1e�(M#h,Jo ѕvP [J f{ bhPL׋rl4sPt1jgED`қE !0GRb4K'$�;1WF1mhƗg�cҗ o7ѿ7C'3IO9dKn390x@J~rsr,9P:pC^ZdR*vܳ 3+N�G<B$Khq`z gUuiqi'O5KyDy)"RUWq*Д߭RCM2@J!隨e,;)NLḨfS˨:ҐOoTx-ny; $rC֠ $T�C;Ƅ\%d5" \9|Muh=Bꔔ5P;fAKsY"'!>{6!:*Q RIe6aoHiMZ0=e,E/}Ogn7BKI`}|sMEuИf$Uxd; )0*gD(;VГ>:KI-hDp44 ?_/CMTOԴffͺv⵳UyN-M>k[>tR՟,~4lxO%UÑy-}G-Tx}V~ 8]%OFu#%lb3q[AN&ஈa)_tV(BoAQ=tf)njUY ϗ\<,v$ nkkW%; ){5QP,smiSmI+ ϻT'5ෂ"`i66a)Lоo}t hӡ{@4EVIւ r⓲fueoLeռwu'%&PAe26j"S+Lz$ '3ICOcPA"i7KX:mx YfMEjIt]Gr#j޳[m[6=?ŧϟVc||>Fvٍ5ؽgX;_>^i\ZZ>[BWġ/x2|>ćoì-zWk#΃y3ډ8P?GLe9f]qZRj9Ċg q+e}ǁ3A`%W3ʱƓs]9[FAfu nBɨՖ&4/5�M5%~͞OcV̡ \ �_CLA`5/@\N61;Z{b6{;ޒN ,N:7vyT+hwܙ`X5fW86 t (IX&i6:iC M:UQF{rP%W64CeNc&Ǟ`|>gA^7{R=u9=ډ*0[ unvr&:=T%_b1nG >AhB'Xѱь.qɩ9hLFl@X5ѕE[yXOE)vmlRd붭d^9|\vT!ڑ='kTZ"[nE ܉wnǟ|yvϞؿ=3{>Akccc9iKOes7 d^EcAi2{Uf5 &ov>uNF ?B*@tN +NHaϵ.Og6\|`UjJWШ~dIlt)`t�<2 snFbr'Q"q^ dtoIBLё' S4mє@C(NXkl⻄vhAa×wN<ϗQ7wLt$Zh ke,(6 f"tʘ^@;]&Q%!j@ЃD ԁpY:Q Œ*;6MU!sMd yuݷbqO+j"DArHJ_ݧ`iMP$摝4ۨc2ju d � #mkPWDc:o>ܳXm@y %,2`ߧo:;lWd;J74`bwY~ӎx~߆Ç_I… | & i4-*gR821dNp_kzkA8�EbE[>cj.L"1u>K I$(ۖG IV4EzgX"F+qIb b+PS経9Yn}I %k>:+ic6 O:m+hɛi >A-7y][<P/ÉN^h Qr!a>fURU!3[|:^\4Ϻ�O<Xδ;ro]*Hە@(jbp/fL͸(UsiT L]N~nwS ;YQ3 '\f7 |oQsΜ9G ΫҦ~W.ph?g>6 Yy!vuhe2!і{˸Ck8~[ /--Yuex< /‹ &Ě@=h{x^=řsJ֣0 DҘt(c:c"mpR(T%e8=` VYJP8F¦9XdmkfW̻6UoMXAXk|!Ɯ�+30*(&M Yh' "Has׭�xbSaj:VF"]=ܨaVOyQ6E=*hRM *G"*= ~%^$fGQ\lfbZ/Eє r'8*f`O>0wJՒ%NW&ضu۶8a1q9{vecJU'dK<.o?$i9rL:#V4q YH| Lic}𱱱^F9<iXpLߪ-6]<S #鶃@6YbiGU7bwYwa *̮ZPRɆhtc�t: 1V,tts)5&v jU r|z\$N#"hcV>N%ei`NU<,?V1FcZDv3 0*h_# Psԝ@I1..jZrbSqChL�ՎowxQ,#�91%0+vAP (IbOsڴk M9ȃ#Ĥ ͒moZ4UbhgnҬrm9twBi nҍ7hsĝetvWh@ڲ?أ7p?;֭9Mݿ/qDj/wX�zE_W̃+Xfh+.6hf9ߊ~v܁:D{C Lt{{ʱIDfFGAl0XS a4IyΠ9/p+7S=G8 4ɡdL"M7vvG蔽VF<In/O]h>Ds Tn1X#[U@mtA͍rMiI40؄Dؙ<艥1 T@UȓmH>< 1uYY򼛹:Ҭ-up6^r0X՘DZT( -6qT"wGU~`aB:EC^I~fp"z5$Jߺ)c{Ƒh:Φ@իu`M\{hI=c%<�� �IDAT^Lḱ[-;to2$M 3g8<xEdiOA9Q@x}!piiGC]݊h [}� 4EZzbW {э2?dϮQ?ӣvW+|wތ82o7u 2|Ab<S /LY8*<g]"Tnڶһ D6,)Ch+s2Olj(&őmNM *(hCKU-v9c '{S;y tfpc|(P༳쵨Oy&棨3-8D=toLAs-(;NYl`Fz!vMV˞ku S{5e*f,<O|n>tEMwYi{$׺dqԢo-Z[o"%(FĠ2􍩺f:ѷ@Ss>y7j jk:=\4Bl;L:]7u-]L﫿o}?2CMB3uy]ZZ,7^RTY^"Xfc \ZP(cZbhv?+mۀ3vq/7t{w{{mITE֚a <JΘK,qvel\A #rTw ʘ%Yh'ajSa$'{qI-0MnJHq24A`NbJYmO(㎖@}0$A̔f3Zܽi\ed&{ML2f:n4ZZxN0ґ<k_ƓKhCoAQ" #3az-8&tRp2ړ-kQpY(ͬ\ LBx++/HL 2eB6%5(QR^>n7|ט"hfR?Ř́L+WDV{326.w{~TDzymLm:xh9Դ\|Ȕ!-_O1|"|Zwu냸}7.\xȫ~… T3@{}om!*'jjڌsKژ4H5,9hziXO@cFE�VCEInliPI&$YQv&,_dV43Zb8e,,11jX%:9Ll9tN^Tqʙih%mh@Yҁh tk&3&8/N0fj1yB\ ꈪ�W6 $ђ\Usig1Cuͅ#uN66VpR z(*?P;pY3_ D͂t E+3}@D~hT> n}Bf)vlr 0]A? ԁ}6tk%Z}\V~x쮻ªdmoWoG>$_F#3]FZ恵]\ۿVl |#̀5kx�]|7 C ?no?Ϝ޻\vX86W٢٤ECĀ�F:Q3*\b,ꙖkV v51\u&˰ W'_{㱩0<c*1<r'?Ol2KޢqAל�J㘴YN26Χ־Ϫi'�^&v%\w%#}yU3uw F{ i 2Zp![t/#AMs "h0hNH7|Lü][952V֮]ۿ]*Kh5kȔ gΜ}GP۩ٳgT-n\+G2o~HϾ 5Y'ZNԯ;;ї~ 8i\>\g;w唣0)`p pEןPx~:6CJW;_q18Ph)x�x @Ohͷt9r{n%!h`tajnBg0>/qK`sd փ4ìT2F)L$xfU  ܥikB HduCtNWlTANtQP.2&ЙQa3]E@#H ax-cS Q=4 RWib 8_N6Q؄q2}xq|0ݖNй (姳h�PZRIKpĥSpRR_"ۗ_P RC@Jk]),bTf)E\ u)a+^jNzm[يqao}z9 uZZZ 8}״oczhzKj]a{*"\N@$<{=i{J\nM[5ݗF||=,ZB?$9J=4 ixn|roil6ByBb{ ?jXLې26S&B2bQxt"jӯ/Ohn/tz_;CaOI}9C;@ɼB伮yг6@. H" jeIn7+S'lWTy=T"P_(6q1EA ~I/:F dCP)M&MprZ n<mn:0ֶ$3 yzZjڄWܳm[=S@ݚ5k2% ./G'w ܭF ,w޷Rٽg"rU+η>̥u>֭E-#'zˮ/uykAߚW-symlQFh RII/Q%iOQvgx"L줊%d!1u>5-J}A]HzF\B1on[%QA GY81 -?C;2GQ`1ɍ4ޘC:DwjQPd|4\ڥ 9*]?dyWdmWR]ZVl6J�' g`3U2]V̑-Mry"l $VJ�IBQ`|UKI|`IAڊn|qI38G|8ԗ~z>6FۺV]jW.΄tٶ}۶,fnpF2ʢnp|1֭[oVR3< TMb;"&d iD͋y4u5>&ӹXƳ+wu'!SLuppypDga!^b:&Hlc&Xtw߂cstGKR_WM(.4.Nh7tX0@M]9v0P+tM` cm z Mш} QhGTyr_1ľXh vknƤ\_Q$f>VHzl}S;Y;RC8�'r9S˃K܍;f:ZVŔ̓1)$Ej*,pnb1_O; DfT\boS߈2^�k1ma;6.f~f8v[iծ{ڢT=tj_dysΧy:xh(. S }O2_(mX] WG[P7ĻvZzgzC7 őcG4zbqd%P_nkVhH=͐L 6fs5#Nk遮ez7 /WvPxk_ b%sېwJlCt<ȡ e_PhcV< QN/*'N+X~'C70 'vo$R SR%*F iah#!B(r^h`8f~qz*>3 X)AoI�a,UrPsto:5ʕ,mM +لUTNz: ҡ@vH%Glʹj!U(q"ԭ[[Wqw[n%i+Y3;<ӏ>([^[_z12mJX$}uIm+Yv::|=m{=5mԎZ{#"'ݮ&_88Y DuP";tW"K([ MˉI>$=8T !jDtc0+q$mNa!N~%MC𲃂ԝnkb: ˞ɧ #dRV=TM@=QCJ+F v[ 'qB/`@Ny&iUc\F A*V;Qk} g9K'V-x > ',Sԗ\ 6(M|(40X2~mSp\K.]lq=ʕVVk[t LQ>-`!zi5󾝙^2lY0Wso`?\ZOظBU?OxI:+/;V0<66f)G8s5]Z8eC kgvh)S ]1ZE^Rl[!Bn7I# (ot{:Kz& TLɊꨪS@V;Ƀ\Ba<[cs$;0tA-ޱSJOGWF|\cCuVUVW%?QZ*̣�tfkIB,DDΖ.x'b,as-gUs)@_@fU5 >̰ IF͒ZEY A+!u Mb[&4Z)P5{cˌ$5Mk^KJ2 ue.S \(XfKH?#nFTعkG�|<̳oLi&HfWF!(ڽJ<^ɋ}L3+ u~#XqRJt�#m''p=}T?~q=Vs}JȺ|#hqi]ݣ;UN̉3oے=U\[DRK1mp}\g0N? \=hq.[ƒ_Lj!af:,_z k*)U5_F|ZtEYs,k~ VbZt4ePg:Rq̨} ښ:,O-N5wiliq]z Rȳ`I O\)tDU\XLuvتH8Knс'蛑FN-wwT. n?,o?'+;|{ .e->STh98P00QUzU):g&~̸4dB׵m`gpD /#HO*3Vk֬!KyÆ z<@=ϧ~ѧ``R69+-ҵ]x&!bTJ1AyQHi 4i&yLljq(VpB4Qj\ j z6;Λ^.*昺\C|ݽxRcBxq�N%[BOXea@TdA 'f n}QHZ?w󪂴Av)emG0,2@ ,w$]úaixӆQnp7,kɮn+�@\SCs>^vz)� �/:o^UG| f`ޟ| 7S΁iNm~;W^_ᕴfk׮U'dNW… ֙;.gΜƈNrU!Sm.dR,4ܱ%{ =c5T{q Aȟ f0M@WFEx\b%X HVvO,UhktymDi�`BL5iG+ZSB^A] I(8\�H=SCDHrr-Y&sRE= Ua g4k49Bՙf6\xўΠ9;zegyI$==co3-+.B35e4pDv)FabjAώ0z>9Ӭ:' R…ucQq[ዡ͖;iMugY@ 5 ^p'~c<=XTUzu=wsTtXJz<^{9! T>'m#tMC:҃'0p`( -�L37kE!P]ۉIhB>J]V/ ;Ƴ(边MfKDXj2X2Zn�dAbCmwcI!yEmڅ)4+%" %UDMfX٫\ Վ-].I $v֨!sJ2,Cc,L"4A6Xiee {U:lXV3Ŵ5_znCGMyT;ɰ>]կ]fw9>!9W^͗Q, 6 ;\:zݗ�4\,{9L`V. ?,}[(Aά}nğשԚJv%zPZSÑkys.�0e) ƿ5^;nOUUtBWV*; 1FaQ T1Weڈa`JVA<!.ЦG`;/>L*!,@:F.ZS]͆2><j Tpn++<cA\6uqҩuTRœ_Org؎e:IhǬZyf/lۚ{=#0:|2Q`F֯aFzL7me(b^dqa)".3馛vu#{e(]ڱ4WL~z?rb?}`79/c٩׼uzo%nf�b73Ut$�g7I>K_\u޴۶o{7<gpz2ORL\E:\En :(mF 7K3S"EH?BCpB]s&$a:S)󄍩n(RSSfG -YȺjmm*4L\ebg;q㋟q,zŜmբ\9PP,n8p̄b2硢Y´+Lj8@y\4 Jp7ґB͗N?Bzb3Reuj$[6 `SeZ)ZYg. |>okܖ=S'Y밞}Y�y\.s3[rz .\x[=ē�yBS'dyȗʇaz* OSC]]Q/z՗,W|Y?1s>_~/WD\{< E�<{jo4,?s#cj�~]h"R9Rh&pꔵmv t5Jl5Bl|=Aka6t%tX0q/.R̔FZӻj5 ʄj϶ ڎHπR%I6tJ^:饍Rs(!d]!k^Ra#maBE�L&}�� �IDAT`""`E&~?/fPظ[$$ܨ^7쉽>r k~ҋSdOǙ tR3mkᄑqq`uc ~t׳x?'dqWS%焐̳dy/3O?oCy@@=+;E<pl۾MyW^m 2AҬ5}믶W,kݷ.\d_;+]6*Hf�ho]v^ O6ɬv$QC^ҵ␬6^$#v̪%@݈eLHNUy &t&brZCKW[M 8bRe"P1V4=f M{ hmЕCԫ$%Eyت%" Ǟ 0j:Le, VEcȦƸfx 'VQq7 p8B=}x0vkR/o^j`Mn쇉8c\5pD4Z.RR~|~ٳgYjc+O>O=Y(f}s>v'|'x[2:|=w5*Ux?3iRbYsOe?^Q+Gz M׭[w-r-z뭷 nIc 8IUܺm5htaڧ9"O 'O[zo(GlU16$V;(P =GL�¾p-ۜ !7aAM> E%-L/jeLO*ٓ8goDt:P /r {;4\}X`"3unட\tc�sIp9%6}I}2mn'P'_:,9op94R0i?ū 0y]7h<<zbJ=yfM~loV 8>aS2r贗+0Xnyjnz'b9Z͐u~O i}C;/~? _>~?Ɛ|[ݷE'WG!=m[j}{ğ|(-r>-4ڦ=? |Yñ|! YO7}}-Z:Uɱl!(̪h1 KZj5bBb#^" έ܅xcJS5:7zC9:X/B Caw q%8 APbg0VNz>L!-Mȱxb?3& }! ;v)lZMLFD=E)4uwN={K)Ш`_ߎ́ q^j˶Xdymj|gp"],n$٢AabIc7`4}ug | ~[p _1E3gμ|eb5=4d|[݌ϟ|sĥS=bg}_\|>co?7'/~_bfU;oڎ;,vf~rݺu֭g>'\.owv'kIv?ڡz%ڽVő{nG�_ PǪzfSHG@(1U$ySOgVQ9O({n톔;b渠ML ' Gimet:)Чt=tHZ@͊wY�sILy'gGG%z"n6>[qqE !Pܑcm >s1jHPmozm:e,Kac,tdF*RpO".Dj$4cIIz`8ŠJ\!Pdh?̓ ! 3<c{Qn'H G M}2_{|o?@N)wR>  /g_\ZlIOӾ|)G{¹\Vm1xڵDg}(p̙n:{8?x�kV/0ן<e|,a=XAϒf~댶 S9nմ-Ǽp8#L& &*sK89ljXO Kd-=t^2+,Rps($иbqN57<h^ROKrƬSp>Qb0& Vvp<ч7v+L4QB);$Osd C!veր/Eb*q[0|V1*c)Ө#AFap;Ɗŀi։cH?ݒ ҩm9SC/+^e)_P/+</?~}=cO=@7bz!�O_chE<I5be{Zd6CdÇ'BSEz.--1|@R7BZAi"D1MKrc!b_aPDSh6^L]&(bÔ }Q#݀ `P L|g%MFqq(LtJCYl MUc9D5%>0_� 7Qz49\,;Sjޤ_HuR m& Kܙ%&{]ʡ$ f~|# ؄D@Ydt!_ h}B#KVXeh~P3XEĀ1I!Xkd 6o-D\t!>f|D}4ɾ*clv/IׄXR׵??ܯpGvlz^nkkFR++y!SYws~Ak'sXz}=g?Ywŋ6UONV3JM?,՜MW2!8[ڢFNJCav-o5pJ<Z:*4xVb]E%ߒq*$lwPaf[(F;$i1h,.刅)q\C?`uQRWKJ+ TCLP\z[9uk!`<#Ì- 0ĘS>D:X%(Ot=3zkfX涑Hz<qˋ-b4 !549�^ (WEPoޅSlu2 C_RJFnwMfes9@&i)ס7~4^x7xn0k,Ϭ+ Dy|d=v/d˘5rd{sΝ;w?F<fֵke_*<a֌ϋyVs!ԊS1iE=֝v]>E=#k'u%ASrCH`HdR<ห%!  zyL)Jt/DSp(sԪ`qePA6#2Z@c$=Ԝ;}�-LrXWK0؄^ [9\dHJ$K TC#S%wq MȲK$չ M>Fۯ~!q=Cf4\EzK%GAP-iݗ>32 F20/n%r^zṟuyeAFfrFis>wH2T}?{?Pf"\W"f5YNr=*8jwvٽj*nt_׿կ~_wy²[镴'wW}—k/BB&Q{&)*~O>䧟~GAi=YWk{U7 6Z<Xi] \xHt,Ve5OKƇ})]AfB zIQ&l'PO!cH@_sZ}jً^&7jK*5i1SU&#7N1*x~oU>|vШZMXyEA8TMU@/_U.nrjV/b6+buY$ef5A=gQ^=}<TPUwVi_4 y1ASj/鏜o[{0f-^\wU'+ZZZ:twN驼6*u):hYX]Ŭ#88ԵUt�LIzqOQBםw_F+d9d 3T ˟̸cg2dU!if$Rre*=L4_t8% V&(:6a3'IUQ=ld'vహf2 [ו%B$+dQjOSw`.Xs;l�ն$2~?$aQ )"%kp4<.蟫I}Apu vcKfZj,2|(>{}Ή*(7`Ŭ|DFfuke$ p1zwkpI;f.zZd|.yQLѬKQ n6 p-5c嬺]č i2a]wIqJ `yvTӑ)ԛOUbuR^=J]Mr(K5!ev_-Cm0o5 e><j徒Ɋ[ԇuTbCoը6IMScUF)\zޝxo]ׯb]?TIԕэ4#]�^:rnW7$AM=#ٵ{H>ό.߸'2-> BCX1GX*UDZc;&2!DHp,6#`*H SN_@ATk`)'"m?uN 3C# /bi gta0%%4u2lV5#Β4Pfu#khٜo6aZlѤ*WQbc'ղa)Y{uvCcm[d8lT\.]>O<&e&+*bVYR!ꆔn#=N3Os3qșP�7x%Y&-EdZ>y< �1'r\OB t7oڼJDDw[U˪gSJv͞I.WqG&\ &w?EH<IfQ3cED /"g﻾6 iF%a߇lIj!#Z$DcVs9%}Lj LDLʕP`h,$*KUFZ9I)C-(Ґr%ˋL=CtJ45]]]LJT0&5jNl-yh%:eGci|R)SZ܍ Kuw6/(Twl".@ q*I+]Ǘ T%s˗/_|s3yҏkq>#\DPg 9yߴy�OoڼiM$O"]dnGfCҴV4 goEе'[LGbE\٘%7ai)yÐ=RfBr95jلzBi."5jX8Ph8"f$qĺ,cr+FkM7!BSB,"7j*<g#QphWjAG,RFYlJߔ~[ ;c9_܌RVq]ydaYHXIe!V) JTB{I-u&2c<~~Ѭפ-3>3M ձ`ҵ~g}US,YBy衇nm>~+bFy!Vum~;x.]t<?~z`{Լ=%صk<>m[SB/ױSN0wCNӜp<I CMn1Jt1;@).$"\B Xi`+$f!NPǖs Ƥ`9sM#ah.04fF-3j//EV cΑm!%Ɉ8:4 'zӟ J32k6޽OԨdTRhy[7FG\st3Ű GSʴL1k}A2}imɵOϞ3QZ5<;V}~?̟?mݖ$,*zz˗/'$ {4 ;/->͛7idZ{8tYOdT`>G]5=O;w,ZÄ_ dVn3!Tk2@RaPN _Flve rۮacj- T_#UMVbjGB%@%Xړ\-BMp*\!M\Q oQЖox[вMXj,-0n-!\$>LԕGUgNH90  3$F˺*.H8WT6r +2Tۑ>EL4YiF_ՐI\ f2~+ܕ vʥ\ks؁= ůԡUR ]K-4E<=|0XWs9H+EuO?翔Y?Px2,ǂZHK78Fq#8cX]6>&ja%+:-tEma 吮hȁ. &F0m鹂g&h¼PUEGS"U#j*)k@ǢKrSF>p �l/W>וXɃ`gGvӨ/C:&?. IR [ e#+@lݍ-&(:ָ)ߦpS<3<Tg-R P֕"D=۵zXckL=ӣt$y+ +kzG˗'5^"_nݢ9}(=p>!ǃt|]I}{:,5n=@OyZ^ڊpnzQ􄪤\˕aiњ6F L5#cM�eE 6S]5d&WY(Dp]$E1m:fM6Qhaɨ "z+T!J[2"&�0dX2p ㉻! y9Cv!ˁވv�05mQS2!lGd}%”ERHe(B�93εfG(s/` dn3i5;cy[yhj \w ]tOՃMܼ=QM^|Un4u1PНۧn5}HnJݪٕ*}pvOsz;"J=0AlSAOp:R HLTK UjƚsSTEHx%?\O3J L.aNb ޥNd!ptRS-czW$,ßiu01` Z:^ᣱҵL\l$?I c#ǵPQ&bDɠr `YWkc(pT֠WJ1-G(H!ERP>"_BN[v}%ӈ2OO+Sk~@P'%/厎CYxg~ݎ1o~[nϋ [O_`xrO}r8Y=6v?[ pz UYJɵ R#R`2Vg=[3FcK E | (b)ǟ'Ҷ+'+-M iͬlޢcY QA5= Dd+TAe]k96n`}!8B8b#VvEp[.2u-h쩖$S]'Mo|B56 ǘFd呸6<л�� �IDATh$(O8ss<LeT.`7ٌd oT r Q%~g&/'$۠77f{&ut{U�7޼:] Y;ydxk z.sAۃko?<@羓'_utoa`i&/PƁY%ԛN++ J*~L4T|Tˀ5SI5$iȸJ,0Ti\%jM(" |�|N&E&&g8ο'CQSh\f_}zǍxT4}ԨVfxgB Sc5StmB&Iԝ6˕.vHB*0{;(oQbޓ{KR3әysvLu=y4HQ*uo=ǟJe(|n;!+jڽk{{қYu29AMҝ[64 "c0/]֖�<WJYXxߓ{VAw89{9bڏ-*oJ,TzI+4D1fK<VE&)h5xW9 6)5XFn�cT@f=KKHFJ2̹6jfmw(dxC0 %;{څ ˈ3Ŝ}r,hu5]L&C"m% ϯ_<r3[R Uu(mR-ɢوIj\a̘Ӗ06hSUAi."asQ. eJ[YMZ*9~Uw^HLʼNQ%3?v ?CN$;ʜWZ-+|!�s񕢫6&T ƍuC�عzǎԈccGyeB: {q+\̹p|y` dǞ*4O86bdE3(8b"@<b2)&I**.>3 ~7k\@@8\8j#2$H/1Yq` C/x/WIIu.7T.cB-LqS nA-% bXFk ~[X M\"" *݆Eu5kKDi^F >鲺\Nz]=K1 *rbgVk.(Stkyؿm6A5cݻ^\uxkBh*ֵmMNC;HTΛkuɒ%pu:*}aPIrںmm[iqƦ͛=FZVm[ �2R@zό[l" /+ܿv5ks YMa]qJ55-:7p_lr^KRd#$=jȉcqV4ǥ<bm'o,g+"^[==VEAc@⦛*֌V#xS@EiDFU|11gD=S QLU otb"L<ĭ*|{xwʲ RPR՝M-dƒҿ<uDuܗ8H|?ѫwx;!Q KCi[�!RWN$~5M[vzeӧN>uzav;9;K/=S[T.㤥*5iYL(؋�Bn(ay~)Rg5ұLc f%&Ę 6m@ʾĶ a2V̤qW\`aL ) [v 'r OhU!][i U$N?.,{Lp%jwkmRMhx5ZMa�v:0/s>cf#))msp*GY Hs oM]C[爊, \_YFν}yXV~ ;x)wx^]9c΅�Rn_iS eB.tQ4o|(N%,Yck&900@*fReU+(3Έyz A-M&١ ZbE52O`b#@/kjxNdy݅H") %Q!eMW`I<d՛N:VPWS%y^u AlDȃ /CM߅.X$#aKN@>a5jT7X,,6]6"ƱY:T�ީ VŁ;Pd S 1hW�:фLaקw{2imΉ;\G3*l(MՔ*\4M1eҏ_J-ܹk'`6ڵkz�~ɒ%*+2xizzHFN[͛:& -Z/y gݣoߊ' rqc1ǡ}|aʤd4hbcBZzd `CM0!I. J8S(NJc9;̵&x˜FlLcɌa+�4m`Ñ0U~ĴX Fg{0q:(ir(dӚ)Qm΄6fx,oYW456<5W{Uq:g ViP1uAuIZYkAg;l7_ \d-tB= Ý'dkI:C]祁-T3v۫^XJQs J !T+//Qy NOOw˛A'-[6WQ3_x1P/VTT8|t6@~m=m*/93g7l088? %6ΓN',)it>;4ݿp(dMf$MNT{px d@uܢڧjd�Q$"pySuF뚶jI*\"aLNɮMvh :TahQ]IHb. 9H2,׫5l >ꦭNHY,U(ؕT)YkÑ5(8LU T) zp`4#�YG3\kAƾtc¤}R&RVWm=Pp 67X# 5Mί߭9\SEQTic{w@8st>1ϝ=G%uU{; /`sg)!,{l 7ιYyPʆݣ=F7o| �?(An{z#hX2oۄ4LTuP 3(w<Xw2i1vT c(oinLA:X01L\*&@F/y O X!& ۓx&@j|kZig.N cM #6šv`ʀRaUO&Vv8gH@7aqL̊"-w¹:RM&8N9Ύkw/¦8+Y7T6Z:~%V=X={f=g[n>fT4R/-,zźnCd) .¶x9wCϕ ]|ۥ?g;dBnYm߱[' 7 mߦC`wA5s݆5 T-Gd{?bWqU&=ă>ks%fAd x"#s5 o16_ɱ#Ez'>!cpĥ2#\N\4HX݄#3#fG. SG"P/20*c60Zt6N�50�JjXLbPEO$"3Z3wp?SgiIXD`xIɁYݚ:Q.n:z0UZϲPA0Ikaٚe.3_ w"'{5�$Ch1"!ovΫ PUzc8?)QoW߻H+,G=_ +-J'm۷8~>&f)&GoܸAmӧNΡ<۶ol(]gz|MSHzl.fcݱg@KÀQ[WJR.9M Jj$pId8 dQtJ:՗Qx.3gX+` DH&هO llj8ҡstXw�LsRW5 ] 2x{2UP @ fܻ]MOH~F7[ƪhED^= ?s2v C17: Leӆ 惚'NwYf={C쭏4l_9>?<ܹYD h a6͜C@ݱsG?oᬋ\+"=~]o۾>̨>t[ٖ<:\.3'6nxC/ >q7ݻm={h:Zzy]SM+VŬ)qǑv2~fe; ,d v ^KYfS-^jU0F9JW7mSJ-Ϊ,X*#&eP<w41OB dLpfv�q?+kXŀ==%O:9Szfʓ1z`Pfg dSOdN9d%bsR` 1i5 SzFфK-;݉f$Bo0A^̪la#S߮×z"݌}nBs}d waׯ_HxH'+D$ڲuK}.;et{_{*TU޽gm' ЄBѷ GK!yW<1GUg&C%e'(28CjL&;Ħiu@i>Z6;xt<hRT/zq,OC2G>xtf~:IǤP*һڗVr_G=(vV '�}ȕB dM wpCݜ!`bLOTTzzMwK Gqo>Hd2øM/:-ɔ*3̅+GKm/}t:ҝꇂSՔP@0+!<Ǐ1 KH+}҉t;{n-9NFrфA.XNn9QO裏/~AD>[6oz! ꐶtW|yS+CTB43)Pd4.` 0,xw("V,A,&g)g fN0m-:'{5ю%j>ɚI%c:Imu3sL)LO>}1{kIvb Zk6)Qط{) 1kEm 4Bb. bQ?59\t6txH%M QFuR6TCfw!UV ϟ(+k8~T5Sݪ:3U" "/ס d%@J*!=tu5dz? .uxbrJFOk#NJWN/y<{ҫ ucrٰq|(}Sz.u . WBu y>IRl}zj߸q>Ygw"<SKF0=vwBM�Qf2fKI�"50H Tg7Ўk` +SN2o–Q5(τg:ʡDѠ]ʎ9urH3t8Hd $=M);!uWFYpA KQVld2p33KԱcl-.,kCg1U7I Dri$QUDdעy~Z6+5*v0^t�o>|;l\XDޫ=#S9N C^]GhrJ boѧ424bsN'd=qDX,왳LzP^׾&?7] cRYbˊ70 ؠ y43Z(PuT68? SOUGz6{g˸i.N*i7q.5Ma1ea �a3wP)0)(>ƚl-W}c)1֋D;jEE~ bzJs[V"sĜ Nҍ(حrnjPD0WboJp,a$/ f|Bט qHɣBG?] z-4bt3@_z9v{``oO>!,jehu79=p߸i#YwΝ=Aٜ<qRA ng ρHl8fn^;dz.S6OyXjy:E w=W#ZUsU+Eu85ŧ xkh`Ra*)ykwQ51rg)gº,2abWjׂR۶F.0+i"Ɇ6EhbPd܌|;%b6癌ڴ961(S:&L9ni['+aID0fF;e3bPpT%"邏9h[TZ7qaKL͂Nd<$zqDʹ˞BUK:||衇z!O[c Qsrҏm۷jJw}dUX-xd3.uC͐߰PoLקn,̈́tw#!stPOӟ"|9hugGŽD '($o ^蟅\ (ׂ#kk``89WJ~ѨP~cxF0 @$,$)M8Or|W;+i0h�bZE# ~RmoXNTh/rLe,W^(c̪l፮U k2oSJNeX=a]LS:Oc CVf\RxGBǠP3ud+Ԃ~Ȥ1[n}'ѯ|NtwQۤK.'Ěv;nݺ%PM6nj-SRP$Z2_|u>4lkQ7v=svҥK.eKѣ`{c51&{t/ZmQ(jkP0)j>M Tę#ݬpӎ.kqhUt(o`X l)DD3C cH&Wݦ@:Hkhcu:h3{ vaS@/9SM R-AVC(j锶FamasPk$6jXR'E uQfZTJԢ3dEO=%UaZfJ..Auc?wWLjV5]Q Y4ΦwyPc'NwFbf_0USl۾ffa9NAժW^{ $և~:vt+v=:tKg=$\gzˡ?n-[:y^geJMo]vIrܮ\LS5 5Y/^<ͳzξi-jwKGQ0Vs >+=Bk]0nM%95 c5&�dɰgGaP jU/f"*)/�23aS֗<qHv!B*Xyˁ2`T>g!,Qf꒭i}qc �h4cܑJLX{)_=\[Qnt{R7,ORBdM+Vy8A@?9}2yQql޲^_u�SSS$.x)ԭy7L3OC QPϥ?ށ0G'D [ny^~nwVۏ>%=wtj団7.uY:!޼ܫ=ØrWĭ�� �IDATf\`\FQ6C$nW(#Ev%Gv ƕtL|;%+7(ޗU,pkp c5 E(-yW1?bV>B/Tq3e(CwmHl( r x4cNMLX15[|pf6D2^*U;ep9,MSҠv@ac nk$O_d5""L!IpI47VO= dz~TMu(XְiǦJ<lAe=O>CN+o%'zp߽CZnFe R:-Z 'y*\ܵ6@odoֻ 2}{CuG7D޳{Cjt=}\BR(B!Z8 /lҔa$%UYT&^4v>cv2|7o+u&TY.UF[ ?A;h?le@℩C<-ӂ޴C MXp4N~S'*{qa#vv *'S%b)\bV_#͏Z%*\ PԉteƩT΂NYoJCʸ)e{&>OYc3ӺE4Cpٹ!q`:󊖯~~ " "ܼyvNe2{c%GFiT6{wl?>~|Μ>DI[<OM)2o'X53Í7M3ϝn߾cNMYOB|{gLȁ[p˒v.iY&A8gPy~+*rJ\!<дF-Ne8^C2G1c~%{ʎofbã!Nm%* RVOh dڤ*d;Ȑ\vLw}7f81=DP ?VmwU, [爢L~@P[}Mg>Ei݃j/=4ll(?Bx{dx}7'\ Co W3;b``0RS~^wAatş~)sFX){'O˶w!ʞ:_z9|Ījݷ(˒K,@[*�]k7HAjJ|v$eW;$5 ciS[o6+򄫻xQvx-wTQ܊5DLAĖ-Rz4H oShÉ^-oV2jj(QØTQt)L'5@V3g*q۬G6.+;$؅@&d5uJi=|DcJ�ENq^}YVDhyI^#kF/m1`#G^v^Qew3+d-\EOĊ ko;neH�6l0i ]˯^-hB.5-fb.5h܊lK>uɵO|ο{D~qim8A6n800pqk8?�G9֍w8\l̔ݼ ]5*Ś,fٴ<m֘m_u1+XlՉn}!(zC^'0^l$hFz mGR݂nZ-5qQ\E=\iC%"J{L@uКϜL'tíYJ 23VsްL.z_E&.8;#\-0?OPCTݒ� *eLAMj�سwFM} ސ{ADxWY=u{9zg_õ/4z_KXBnƍ4b`rEMmۜ^Y婓ę逸f@=o}iWu�gl4J *:t b 5ВU/k?>j1AM ?VEl9`7/a_t{t\֤LmGZ +EㄛWbf:VխMlSwRs.�,n6J8چI=ЈFW$!ʤ?jU-GYss;oEw%l< fbUZg.y +m=#:T$b3+s770'Bbdɒp6KVMz;/;N:-C^]rH\\'6}lڼ |`,%A7n qYS]&v^{tW_nosD]DLi\Q낕<Q@NǞϪYF~ %&\J粩91FDJs @Rы/~Xj\/AdoV+u=${L(_򂫑�2)xƽ8Odˤmʮ &H4Vlk#) w"= 9݄I}Z]|%PQ#Ł&&U_ u$ �]z"3=*R 砛Gov\Al.\ްq1$@oJ'2�sͺw#58cU㕅YiL v8>3э6갰;9<ikx=nGӡ uviopp6=zrWUq'2CEKsu.jpg&<۳ec/}R꒫0T0g۹VI(51dŠ9bg+hq\wjғKd@v82S!nRTUIL:L;y"wiMQrLT5gkL |$[MR<t .�gt72M6˕ D0&DM2$'@CWo<ᯙX5eʼ) %db+DZ{A6KI3A[dGBy/[po[o>u:t넚ٿm77:79jBw{c}B!ċ61GD2.G7;왳r5<r+~M_e(U=7zYchhhhh,ʪ!5nn\0Vab%j fчQ&ʗc!y.Y4wW2K;?JLa: fp$MKq/DlX&E5ſbyo+BwhdĮ}롣'Kl> r7 M'X S Ȉ0^ӻT.ʜc`\ڢĩٚӒt37-WJ׉in'cz41`+i'm&B\b[mE NY@h&A?_~]/[+{C8{۶Ρ*xvڰ4:&ٹkիW|7xS?9ove]sK.=vm7m 7mkH7~=t) 2S/\=Y[c'D%[ۻMC2/L/Wd34&9^qOGȴ{ cf*?/Ӌ ?AvjU-b6:ʑ<&Vhě 52~meLmswg Q֪=pPTn.hq5*c/u6͘po(2J3N" oN &,׭7zipq\ OvCA7pO.DXo޲y]Լ=yLԞz~j]9V'Ν=G<CȤBB),d8vXH+O%]jMy'%̍:W?J5\%p1f_52TUƋB U[GڶK[k[X?ɠ$0Αlmg3qZP獈 ݙML:@1Ve31\LDo\ t~u] x"pȑ[B<DلU<tLtS-Zv;WU J.Ԣށ>aj; lzQWik5u5jU&b6ui(` bc8Рo_sy^jrӺtݺt݆4sF4X_9ʢEIgѢEKDZB3g~uh9vVJ^!|jmHC1mȤfs?es1=v!f:,*wqꅬ4$ʳ\hvؕsP D1O L v&}e%AH!%_RP{ mj% }vGM r([*f$"+)SNxd!133i}&Cg#C)쬡t۸mnSBR#T1ŒSUCFP 9"^rV`q.U@,UxY%i΄kaxASb]ri96Cԁ|gamv+/BIWK#p豧?-]!ڗ ȧMBzOviuvpP'xAs))2jP8' J`9+ wX`AjZgd~"aKs+50䕘6Qi\L.ka ڸ1jupyx\{ 9D|ea1ңбi8j4W9\@}d2f1*#:̧'JLܞYlȟڶj @U )1LJ@Ƭ4 {Bᦓ |W M8̆dGá%z,*85s5wڌ54@�N'EgUbjDy"[Qm^<OymDZmC֞jw''|'!h"(N~U ">+ Bpvn_I*+34I2#=Fr-x17mF: ,Xk,=5=ȗxnI6gׯ˿{蓝;j hThDYLADy\^yF'ʝ(JK 8]! -ֆeY|dFʃ޸i2W`b'!dڻaYIH<ruE1B !+Aш1B]EJv5rre m蚨]+!$cCTԴڦUOUEY~C�g^U]; *BGK >R$ M84=U靧TD0aaY^z"PN@#M%գ)}{垕N{XHxK7[~tP9&i:{nOs^B>$7G!%t``G]wy;J_@z;=|RO÷y }敯V䁰s�e>7x?@U[A^e4Y_`ǣoce&u(49ØR#MuH5CobPE1!u~UX!YØjJK=k7nkɕ*X@|I/ V7chx:5;nZ#Cg#<QWºIZ7זyHNmW,uA2wnX{2mMqʋn|Z I=!}U9U "n׻MSoTze  vbYMD x)M5m&K(O%Z8c#ܻoC:sn3t}oOۑ+d+ iHFK[ BO۷m;v5ۇ[$dgT~a<ϣ 彯۷G1eE)` Rˍe <T^5Xw' MUx\ߘɍiDWR╥hryaL5aLM&jf g*:Uऔ51a&(H0gLCX`Ž`]DǏH(yڜsR'WbsaLk FM&mvC�:RFRܵW':QM='2]=aDžg/M>ᖠuIU/6D+O8xUwIX`Bܬ<<fv;E"Yw;vd @#G!d͛ćAxQig@Axb:a8=ɜ7m&|r<pwO8;eT،EIGFcXRSb>]X O5bOi,-`\u,nY+E_ݝޓi-'HGx͍oP{9c}_ 3bu֎Ù*-&$Gfj5/40Lph#B,6|nݐ2͉*Tq$9Hө*`.B뾐i XFŇU6/1sޞ{7Є$guK9dmjt+wl{?<g!4 3dgcF6_K!-EVY?}uk;g=PS3>zr=% %/<RwLnF-"(ւ5ub%X^!;*W`| f[ENѲ�;wQ#x;8D<뷠i(Hlr] (݄f";O_fmaX ؄D^yBtsseYz=Na`BFnظQتvn۾M;UlJխ2ҫ{8'[i8+_zvj/^S%&59;QS'x%GSH(H^Z~%KvX>)V:ag7Ʃ[yDcgLO8o޼Izc:)L]۬{#I5գ=a3Νҥc%߰tJnvLtW $^t ۇ>ؤ-]G{ʔ@"ɩ$ܫ1\Ԓ%M` k5 L}_))*Ҥ,Ŋ1,]IKµ o_9Ħn 6LH皤a:9G~*R+EtyH_y=l 3U\EUl DE 6| tvem۶WB;wV(d cs?pY׏ڽkFF,g7 `ٲe8?CNS=O) *C,XW^5_Ώ!ʹ}v (-OR:>㰏XXãGJhC{EnCi8+xsΆ P 551e *Q<RMAFM1naBG*uHx , p CMG71gTUb 5QJsWb� >4XƔ*lUb'(c[ SI8A#F2Tx؋N 񢧊;0Q6%jf< >ԝ�R3yTm$z6鞚顝}EE}+G?^j۶oi#DoSH wϤDG^?ꨜQvxYy3&xwxV޻km޲GqO?iTd|{nAǎuŋ j&ظi# ZPut;͕ʍ={g X !Aaa$$f2\Fȿ+!6Ci/Q\QOkc: ,-1YmhyQzPH2I+մ˕)Obz+\걖b|eHCH%5wr9&]JFn$t7.3$91W!m?*' ~@vؙo_5xĴYEm׬�C^}At_"2RTͶGѨ)܉Dd�< ;5 Cԟ#RׂCf7{t}*<O\eB3Q1-*MLCͷ,P}�� �IDAT2FRwJ6%Gq+\(7aNdt^b; ~ 1hw�'*5 mboѥȮrRGMPSV,IU匩Q"MmC$|v$?2Uؓ%r)SLfeV}3Q8f#X43TVo:n-O?q왳6o~->$V'(R/=.s$zP˗/_||7!H0ØSwh' qk{4xw7 ɮU [ k.ļc:>O?!["}RaRg]Jx*8x5L-Tgff5EbI/Ull=G01傛JSBڈ2r*b.^dt'3҆vm^2V�9; ` QzFuF{l8 Uz Îg]:{̵sgu%90hggzlǪᝨ1z.QU=-SQ#Uz㱫Id=4HEzq OS{ۂ[vJ/Bf9:y~O[nGYB^>>ljj˗/_~?!Ѧv ;1[q3)|?~^r-4]zpz#J?{m+]h@t:-H2MO#WIL �DX.R(ޯaH6 tC+'w~`b4Q92i; SJz%8i=^ mFpNRϱ<ZF噱\9W<,S6;g-G(ue]pmfȜÀt}8IfHݹ0V XŶ+cuXR),׻\{X?Di@F_e &N[!UFJXuwF# 2빳y^qO{WafEK 6?ַ}G}7͇~Z i?;{ռvMK+W\駟~~!�J<AGyGGEH'6UıvR%HVL+os؆M1NғUeqhfė].vB4Q<. K(щZZ/HF1%j^)*Oɠ;j5,jPe F +%ߩ"T *;We�ƣ<S[gR Jm}5:V3n@hi:Tflq&^4}7:hN_Ppܬ r{*TQ.FV9?aXIKtݍF%nUb}'kDh3>ַu}n+g_0I_ zk׭]n7Ά&8~k:կp7[IOgdSߡ4O<V_y侕B$֩|s>]Rm:jtSԛ7B9X zS,-e\1L*(K)1S}VVC�`Ԁ]> 7I4QQpaZwVvjV*u%2]sb6 -IrZFںkeP#*}ۭZ2bwƽm*?/r阫D LQR'87E{Sն|d~Arl\V:df۱+ڊKR3WfnwSڱEO6<v#su;'J@)saY8lPﲞ6:S"B>(o7�qАwʌI=MPpf8~b3q^~;v]$C!Z&v~:]Hrs<u;Wַx �okFgS f.]d]̐i-jpz:e%?V־S*eugS&S&W<rP5_bκY .rԩ"qL[ |&fT6,{WL r]tD5XfAr} R\)O(3MQ-86>(S. Aբ6Hzc^ÐGtXC ٵP*tYOJI%>40ݲpVucqy]p!+|>ܳʲe˞w{ɟRS ҳl/lajr͛6m4~z|```Mǎq'oX AMoFx+U* 8@#Oٹ,՘q9N.j.^w^5tiz'Xa} &LVs} j… .>I ޲&|t>f\zf^{7K(1M6QPlbu\r1ı #dEl%5 ut6:^K 2H#זǔ#Abj+ma ¼MrVv L&"(o,\L\zJ?S%dԸ EJTU/MLTr%RZ-+%�/u 5Xq <cB={L[d8C*^pv=حAlgwꊮw7]:Zʛ]ֺp#W<{?<~чe�衦:NwnݶH+~_{]|*CB{GOh ?;+Tk|| /{}4ݵ{׍vM!}u#{IW^~E_w~_|/~~S¯kzsgyDvVM<k{:X Ĉhg7\(BM�SY52RF^ILPS$PToS]piV2XJC ۹ J0q7j@,N6qQEUڎ]T rO[j/-l/L+:3] `Ou|it"geĤ<3f=v#ByQX'vn:wvBgf#UKPUp͟.Vd.= =Cj/z`Vےi۸]I:oX\W_}ۃ֥]#硃zGψ y._`�?~TY,!cV-=s/| 3z_jݼySyG%1raW+0] mmmW4pV2Ѵ8P^mRi#َE\:6K3SϐfS>5)`3OTmZ}rP6 #¥P 58ei'+x-s uQ͖ �DK$RW =:$6ҞPa2v-[/pkWTbj[\sS8)5 qV"">pݲɺ˿~d�C�T]x?tJl{W~;wysls\ne^'tu:|{{X08A񕾀7nܘ_븾|rqcswxEO,M:^ys?|m=)Yh}otIKI*0Yc~C -]H4@ׄ]VbCX$a#X=v'j*DSsyuMYs)Ki;|ē-˂V/}^{JBR3O:M}P291y2Yj6hD`U^WFVt> VU>9 X~UagOǛHɺx|L_0~�ܰjZ5ݖ'מ9{@qƷ~W_vaҮN{׾@D߹RKUG!՘gqr>ܼV(Vuv>Ms<WqFL\"9߀T\c0AKcYPaiD:Ykf8 w޲.MpFO#U\SvBLݐ%RF~<*[Jm-vl3WM;hMRe/g`i^;9QB%PB xİ-wxUvԣs.uaO쒀9{]42}v 2BԭZK?=Λ7oO?U|~+{Ui ~4s;t|G9~J%f>G/xՃ^>9_U =rr/سwg׎Fީut:^8}׮]k-000 eސ~|TZ}ΫGsws\VȧC_!G@㤳,v3.� mȪgd$ 2Mn<DUe/`;ZC0h8!PA|7kLϧQn/q`>$# 1bjcdj2,""XN/݃:aQΤH.((+2]+o2P#J;欶ގreUԣMYZw/; bWd.…XWP0KVC7hu=*�΃mM%=/tR'o4(Sl% dKLEuZg,k>};zX=,^| q Ԕc箝ꤥ<.\Ծx`ژRUM~!^80޲u+/>7oٌΥ b <@pyB5׾FQxnNGWm`M4SwR^F�rrB=_TD3eI)VOgYJ[yѳϪB!0.Ǡ[ 3cZLȿWr\=V[KMɭu4;!؏ o1&CU3y4dI!B2FM=Y ɫDt˰[Q6U~硩nRQkLEAC[j`zu:?t21_&$ܳw-ΞhJk=![3ܺ{Lѽv7o~BxqqmoKҞ~fBf|գG RQ ^8puJ";tP?ctnN'~z_Jv;[Q!'4p¡!y帻_{eF)$٣V cyp1s5n$eLf 2O$3 Gwe>cfZT]~H5DfFe/8febd"m$v* IeoLJX\ zIm`;S]jh3gj(u'хI4:O%hq@MRUNYϙj~-|*d |/ˏ>裏>q㆞TVV wfoS9{4O~o2wсvܵG?я~ݻvxjSOԤxqk׭%p,O:=3*AFG!sRnϽA3w-(Μw+c1?:#kL#n+Ex(j&J(R 4mV/zI"]J$FZC{ I٘ԣyGJ,-=dLԳPPSph"Rhf1ILu(aY=YKt) -3M61[@T~g\^͎PU�2 Y㓪RۂjXY- w Ҟ?g9(NJ{QܳXgx|żpB"s5nڼ2O~zkD0!k<Ar[n!8*$M\`X{i XL+4w箝J董vڽK4؃;s;έ<}ҷBΐăg ܮoFjrW/&YaESu4TS !EJףݬ41tY7�!@DC71ڎGcp%\;h{R3w1sYnqR QeMyVc%#@Ay¤HM:5aq*Ӧ�yCY0!sڂ$j3WEШp˰^=u't>yx]G<,p /_G}t;vx/BgX;~zF{2SH =붭X`oF)i*+FASEΌM #*gAT#$~h}Z03geY oQ ]9z*Kl[L\e;BC~JhڧEٰ%"Y9cl>ClT(RDn,,ε#�₩309_{Q(Wa(u~@20>RC@5#ˢ̗ M/S}њu՟Ӈp0;nJvr(rpU@GhR~/ WOdug.AWևk'U1,TeGA{Ͼ. J^_k *pMӷusƗSP h8m:G;l"Nt0)M%T NݸI-ZO}{+b5jz;8q| �n6+{ A=8?_# *ˣ؆_\w}sNU,\3ڙSUtpOT̂Fa&IWFBXe3጖FE%ڱHDžwJuRUo*#qcs~*ogFo#Mzw6>4~ryi%#0TBNsL tU⍯"EPM,qU_g41Cʬ,-㤱[U6iu+OAY믽.ة)FMA++vVz |$/M�5~Dکċ\/] BMDZH: {Wh=}ΌFntVG^?@H$ s: ^:#>e!8.9�__`}yy@Yn*~z龞Ht܄x�F-IY4ҢF1"%9t۞sӎiL^*Q:\e>iU0mnJ E%J W*9TH4YUcRA] Ӌu k^bv핬)8hCZoRFẜS+e!qRWۢ_iiёV!7n> y{;,]pE:'3ml&Z@KBV(>̭u (oS l .RK~O1%J}inuKDC7`ctI;Êb֎s6J<'N߷V*Qp"zxyq`m Ok.BM.j>ԓCZ'mzcrN۽Aًǽ[=;'_^|gnۺ}?y'?srǹsS<}ffy% l qظt#Go+n" "ێ 4e w<ՆATԦ?:D&+xis[Ч\cx]Dl 'J(k6lۼ`BCEmf 6VH.i שXK RF#zـsQ-8)Wy̕Қ^1 <ɹ?<[Ƴ+u?}hR-COEGɳ\}|x Q(?*�� �IDATQ ?NLjd&;P9j"$B-L!@ *PGuAOa6k}Ͽ<XW*)Ղm613q$TQspNͦ83BeNS<MHAH )#HqtQ$W6#so7L䬧CcRAi,q@`-M8T06k4WR\ª]|6jKz1xp<a rVVS+cx/Hv܎"/}@pM\+q<}܍hgaSHk㿜Z>[R; +HΝr1Q7 :5Xj)@ų/+VkczbKTa{ I)Xz0T˒CCC.]z'~U'wڳ!ա~'LNb922D `܏*ʎ[~dS3TN?H[8ӶҸC3mMc [S숮3O 5tLaށ<h<l1Ջ $F#g{AhY5-k]J�Fd lPvuIX�b5y(ݥ<7A;6=[NjQmS%s;b'kLwZn_@aO(Y4@Zl'ϗG0-dB$+il߱}ffnˮqûEr+O|58)Hgnгy65skY8qAbi;wx/iZo6v16 #-.Qbzz{[' r2S޸z6iQ(BWX' 8�PV>Ozhg[lRj:J53;ڸiη%bgi_g $Li 7;rhj%͘L ؓI@H~{&yߓ77ڲ^(n&<RO]&4M-.Rn✱ey]@ѣ<E ʀY&*s}Vʜznx9#nxy;Ql}̴_r^~w=Sm<أ;ɗ.]z$=h< <8GH[oSqӜtV\@!K~!:0H.�fve9hEf [ը`EZ&FDEl"ɖe̻'Vccxm1hl%FCBF2W2UFU y3&cJcJ�� ~t̘*w'`BgfPu*YY5&]!o~Nq' g\߆VK�L“/RjyŢ0N=ݵj6VlCF `U7y>hȇ-##s4Sshh"UDŽ7͹&xHpႇpCN֤̙!w{e###SSS7Ls>a8y9}-M53 -Au%.jYbFywǒǙCM-<vs@Zȩֿcr7ԢuZtSH]W]|u OXHvru]HeQ^!qqVϔTtVAVue[vOh;-#h,p=a4;r~ R$2IZfffQB`l>ü{ΩGG2o!vW;5Vba%633#D͛y DQ{ŋ^;#kZ+!4}CH.9rѤAXIEw|f nqǧ 8Lڴ]zv'O*̳y(t \,lZM(XЧpn IAdM k8ܥ}Xwv�eW1Xȡ1dJbXR<emui�tp6#ZwA궄B eu)=B,-:σjbPu-471Z M:)Ys\pTCwɉ J7':mV2M8oٺc5 ƉydyMD]N԰= E 4\0o> zCw? uVD}۲y �;aoh3m2A ^5 9 [m]r%Mq1'VAQ3-ngh`z UrN3tZ72=#465v5�~l Rn :T̀2t0_op GNL9Cš;db&.zwѤ) K&QCj]:S3%j~UڬXF1xНjI;nb3{er7jųM)[|5ZFR&5ly1BcG_$߹~cgWeS'OmٺklQ�Lm6]B=6";H2KLF-NS<|GO?衿?cn{Ow^^Hgv>&Ek6lj%:Z#k֬YfW9I `c<&4 #%A%=u'Xx#:՞5|搘Ppao~uF亩@ȪdCn ΐĈ]3zq)ҕ8S7A,f[x2 lLAfcx͹7^-} ?O2o>2F!*ש)EUWH]dlZ ؙR5SGQ9毕VдYU1<<졇̉?0T 3sEM~G suQRX9ozzz͚5^򞗯 �O d�Ʊ7$jz'pq5zxxşk<8uj6?yNN 96h9i <rk=TlE$^Īaj* W+ jkV\_8[\]FsDɼFjA^j6ikvN \<2d41RYEU^4`W}*3>(LQh#4ׯg(Ap .b GΨ}esp}w:,'!3UY.6 CIlÚX Tdpp$_zI }FTHDZ!`|y3_$g;f ɻ^;zn<%/ҟٟ}?>o�5[[nV{* l8#~8x<37G"|ݡgya;~79r˝ɇ`mV+ ipmժrswRjrPA"3.x6ʶ)2YN[' L &$eUambp=8v7S+t['wVұaxbs@;6CR}wQL-Yo!\j>v2nA1תyK e9q[סɃOoaFsM[8{e;oӰp<È?c?~'9I8(ϛG< `>oddF!eoA-fff<fhNbH,mZO)?-�P?oi'zxxu4>w})9 S-{AnF7lV11N*FM<kHUs1xpFXv\P d.k{;0zW:VJj8ZW. smb[c;wssydJX{v%Xw~m38v<8-gFż)Y{0#1wm!Ly#|^5|HE+I'q,ăM7 Nošmq<xh玝[nvǎ{ᇼ 1NzpTB+ v횗8e*44 J8ytyک9e8쯚 ;z,];tIx'D8ޓ/CO?gdd{�?ƿ˿ Xx+V{ek׮�<G}�_~%re8=^#k֬q|r K%_20N㬧* 6zUTF 覝)66T:pzɧU Zk չz8t~a/*Ne-KW*13@oܚwj-L!yM-l|4S2 *m꫁vIfPnFx CTN yBnrcϾҒ7Tdo@?*:ȀGW @/B-oiH7%=q:MsGHQ+x?,BSO?r5TC[6/L48\W_{gCCC_uh}s8ͽ)| ,ohhGAlC| eV2iiDBKSJ μ5`6ӄ.|~,[p=K4N(ޱs̲ b"simTrb[ S6YUV\2|Ȥide3) +gKoLjbf0ۥ/1NHùBT$+M|ؾ'$1w3`|^:ڻ[ jXY&TbLXA za,?6 Cn2ӢT4SSƣ=I|X}~,1z 'Ry&Bz#||A@ٰaCk_xrUVW01ZCʕ+X-`^%X 1.yJ5]wv2+R%4# tېo௠rߠldk+lVXھP%|)"&'']9jO's-zGVš%L+;ߜ<˜b"_ĺ$|';ʺCA%$|?t2DUw-5X9IA5h�rVB]-*{.mQd�V1E- LzS}P2h-£ ͦG`rќ2z?4&Gc>*S0}`sCb Lu]vT,H}|fs(v:ַ�?kpyIIe?s]tI-Q'bO<A&M'%W=OC1pj?mj=�!ӟL*96NpU︂%CsrPmD""Ԥde^k n:5( pdN{7 3뫔<qCLL_WnmXG<-:<Ȅ/a{SpF v} tB3xm*-E7H\s;ΓPֳ5DL*I~|и8s㡇: ?a:OxŊ!xu SW={t:Կ-U7Z-(ڼec7opC 2}d/D5a{7ާ}!orsty5չ3gpm/UؙZ-N6>n@E/56:2kJ]XYw9J=YҔK|<h\@$(dlZp+sK:swHfdNjJdCN]Yo9ha 4?B5Nu/\j?H;⩧Ż^y,xJ7Ul\7<j⡇zwz!۪ uzzw'zsf.'?>Ӑ +T$ڹkGӡТ(D%%$jNOO#jzbWȮN� �|'|r<%O<u%2XP ȗ(;55555u >81yiSv]={+#lne럊zJ0&LV</F6́Wȴ MWQтWƘU$ݜM6-rmI!)5m۠d#Gs+8C6;t#O%RU8[ѰZ| y8q: 3sWDc<#o??*O ?e烝oz)K5;�|I~@ Grmt=vwLs)wu]wu~V[oVbH=g⚛l&Y`{P~˼ԋ5 zPP0Ƌs�?4Lyg%r+$ն`}JUCHô_6b6 i�뜢M79dhMO |<tJj 58V'f3|Xe궲!{ABDn/)T~ЗRgZfueA9sZ~.؞4s߱v({%P" lN#') Z irW O իEvZGGGd*{"7b7Ojz 9OVjG=U"RF?)u߫�3O_|9GTv;gffPFQ0<<|m۷MLŋ�}l\LNNR\T 6�] *{u󽖇[j_ MIanqtsX؂e0/煎cx `N[l,h0Vo[ p7^֔L+d._yɲ 'UE<iKH KTDoGKvV@t#aNjRrwѦZ.pY4zy� UE[)Uܹs{2OO!1~UJ#B,48G;_~i.z؉; 9$:y [Sz??rٶ}<Ѝ="堋w8ze$FVۗig}f-+\S j }s[=ߌR5%9)reZ8a@LLȚu,\4;h L:,hOajq*ɠy^I~�ɘÑ7#F'u+YJxQ2kza>9cFCR)1wr40)X qW%y-XQɭ~ )&eI<,yR.җׯ_lYŋ?䓕+WbSM4SYQm8 Հ}JOtwߛT#155EϩʻVT�L[ nEHeիWcX 'f8]3DZdzf!Y^twWVtS>R9�R: ǁMcIX,Er0Tj;dY$]9(zYԅ.6(J#$0W흨R*W* ސB; pkj%Zsk@O^saȳz"vJ4OD<>9%(d9^EX?j;==AU:^҅{׳vi& ϥ<Ỻf=٣¿BfݖMKGO8S?Sˏ "[`/1i3y +Nq*1Aѕ52;*.gY8)=k N.ПY8cjj: ֶ(3g�� �IDATlzKs+m{wi/<3E÷nL`泼¹ِ;<*DsxaЯXbŋ/SO}ۥs).wl?aЪRj#vt綧6KU\0Gl f靹zt7a'99Ts uPsIwDWRˇJR?b,ۚSrt bXUI) .vGpKiIm*g|EU _˄[);Cz]ydc)/ Uh+٫ .e?wSmi ֥:N+NڂoEr{g[wXiz`4^E9k"rʅr'~wR ;&#?(emP9'TG�^G!2}>ԓr 'WjsQ2޶}y$INk׮W!;�⊢SO?588nw^XEz62Z4s送sqOcY'v{e`5lG%~ًB & 6FH^UXmfO /�AT>,[ rJaDZ]NmvD3"JxAڕ1?SO8V�VN])jԕ N=Z3 }USD2: cI5 av)|­M1N1tnl� ;7p[^!0+'CR\5"'jb<4NQ^k#@bѝK�^ًW �~n={ o%Ϟ=)=cmG Vf@-I&&& ?o�~ Yѐ6Ɀq$N})0eL&}^sCۂWX$g^Z305KOP驠[WN5?:: <ΌUTas, ihfXʞR͝ >y_N!k._31:_vO$O�h.P};=>[+R_LI=%4QPz!P[.43Z&9{+< D8ɦM'iV 03KXv0?fݺu۶:}$I-oC+A70;vrAϠꫯPm _Ս?'oy#\mt6=-[`gaM%֞9Ix>SSSdO2By؉O@JQmk׮뮻��Z}gA˨*j:G͆|*JlV~QU$$M:us覝z\5>8UnJIN*+6P\Y#D<H[SVŸrnYchn3ScuQ� :UQcpy[F[)θ"db\)MR`ʶ,.4RW&eI-Q1@+c'կzH@`W|r;fC+"k'[r8Mv{8kwASO>*͛)u%A ᕽHƉGH6f ,NwUVb:Vjaj� :y YqkEP [EժG+/]u#=Z!Չ-gy4u<qI,�GRCuFls IYuěYaXuWr;;5ʦqjWignr % [VE[\y@ gYs@9ohI-B<0ږ7~d@MUX?Q.\tz}gw?KzG<y*7QiUSDDЏ}jZzy,^Dל_|36bn?IVd*z^zll � bc/\Nh7X!l"_<{OB];[PX7mR [$VW 媸&[Z%yuS! fFFٻ[lhh TR9dWKJ31B)u-)mt o F3@ ε*-򧕮B #^=[`Q7d,+)EDwAqF?m۷5нש ܒ1-x Z|W^-OPٺVg,f^ToۅVC}!՗&zTqvC4@P|Ȩ;wA|Fq/`8Yd0@bJ}F @`-TWHgc.[=V\f=^ۛ;w""f96Τ*ir&x`LT@$niFͪ&�xr]e.Gmkѻ8iFx w)ܕ>3Nd9(c?###{l@|RVǏJORmRkqoCST'yqMY4bBb^&~= 3rS5'n~LyIհʨD_ rg$V΀NeoRQ5dO)[[I|́6cw*QKm'x\\&@@ ʰ+WwsQ+l7.>i<k{!о 4bLiF).@}jZ !0yyؑ[6kCͣGrsVt>TlEW_}հX)r0^`i/]ty/Ϣ$RyPKڑ2r2Wo޾ BzbI I,\�eI~jiqn`ypk(GSRJS1l:C;eE-<Ú rM/ uPjA\Sw릊$avUz]Vy_! &,Ր?g3gӢ s�~Z ֬Yf<-gff$9^^)E ׭[nݺo[s=sϷ-?9~v;w =tc }f"RUo]wuNۢ|}oKNPaP9qm@k+��~V@kd"[{Cٖ'=~گ=kCjEsj!Ji�elH}�piz.n-[.tUOL1"LL{M\vH;;c6o|L4Z`u4HfggqEjeS Kaww Μ9X.8׿А7y{ 8#H"Rzr# n`2nvm;lE3 G]sT:_-jh]dтNM<7B0:Gxf�+_ěq;Q5TP\ a^==}( .g+54(FU~Lp}Q7 eqK+6U;BZ86116qedvvXdE_z$dzC@" 2,uEzsܚĻ `Ԩ]OO>"lw×pia~@Jx`G@`)Yk][2.V|Xiz[ ]`f9qܲ# %=ch>ZVt 6vVB+΂aV-F͙g$2%fXR3ׄRJg;݀/2 ս6uI=~ т{B (),*l; 6,ԛ';s[­ usUPY>^7IPp! Mm?"BPW.)t3L5xC19L? h1:::ڵks.z&xhrŋ/^x… .`k׮]6lc- zpL n(tS'/YYLUY5%@jHS瓹%�T|4qRApԸcRjEߛ%%P> 'pѩs|E(F̨Ղltܻ)(;]>-I΀CN hfACW2ni3o  4>~&7P ѡWy5q{}R;dUvܱnrYZO=ֵR‹kot؉lFtyFo6rJ$p_~%ʰxWk8@rr3 T{ԓ(,C29 ^jnpn)H?W;N.&OɇaQԪJ/Y{1KUsil4L2geRyum޽gA&XCBq^gء:6{εEP~ApJ7g!l%gDžZυ}Oa?2_Oew)h)/K7=dd$RaOA*ė< Y/7)yቨc U^1pswx(BJyBĚ#<ppb!Iv̌yit:k|&;BMO]?q*�j*toITǂfU@J^ڜ\R|ziK7Vh..d✲DIزRӨ&ϗj㼇X)#SL m4x(s(̅urVBc'A4Xf.6aP2)fƭ;u Xj[E;)nQ]/qAL8nlY(,Asʁ^:IY#y=h, .�xF$Wl)ivvA口F22~+W_|gϞ|駼 Bͅ]d++WxjjܗyH~C=HZ5,lZjz+)]$mwl޵8tu&Ϳ$+\RĴ?;Bl{alQm7"ג >WC`v+SO.RU5Edn 3/9>XM 7Y[WdZ\m!lgNyIw'YhV Ğf*v^tidd�z!v?{(zvk#vzէy{^z|W�K\d<5k;w<x c|Z4t]`]zPcheoiC+Ԥ/[n>:x'&&T#Ƚvc x.@ ellreԗ{-T�V:6 7mQ6˓TO ;oa9ʣf6Zq.䓢:VQ®* ?s+Ҝ2PͦX; ;;&<Q) vaD tJ\%Zօl\{ДwWgFDQvUg^ g!סi]m9d=c>O޻g/<9ԍxvu^c<i,u/`>Fbqh/__oSKcJqo3u[E16/?_ P;>Fk( d ҋBC9?#cA `qTu\ @e*蛓T=㵰 "3^X˅ANtq\e7.-S&Z(W*\E<#'i؋bz@$7 >EÒ$sTmpCCCO?4 Xwnab6l n8d611c ;wOcbbȒ74ūl^"Rܹsu:DJ*+[-0C L{lUSz6�$b!z/x}kϐ'UиVe~Թ<@,xEn!}G)VF̛jXRTݮ]�H;{B5ݴx0<J< ( b)wBΦ l^p\fak=Fج!.DԜu|zRsdBMBkgw}e/-D<z>YESuR c} E.\f|9ٽn۾mdd䕽%/w*K#r;&''9V/B-\Ao:uGAdT~e U*W,*: FYMr`*@Z09HZj%eU#VXb� QţV!ef6 Kp"u�lm sY &/ ] RI:˳E]eL5FfyhΤZ9h]dEWEB\.nל AW~v4? oA[53r)bN8 *\"8/~v)gϞ={>裏>O>… -I m AVQ\ +A�~ᥐjs߰a˼Jف5˩^Yyd&BaK7ьF.pN/cqpP+y-$жKrw0gM_l5 ݥXRqiJ`ǒVH;FCMD3BMèk.j\S@{9]@0RaNIOPfafBE#34M8~} x?&|2h jHԧ~b!K; @+yZ7G_ܗ0117ƬzbŊ"/2Li [,Ek$`1w9SPX-بjdβ_܆&|7J*s%V2eW2mVºՂ@[4e<Xۇ_ڔ3-Tܵ5Y.Iٗxc@,@Os9y*R60oދG*r l@hDyz뭷ފ"mF@]<K1zu;9DjiZ7doxߏв79ŋy8ĹyM%7K4sswJ%4E"S81?ڪG}P[Ө2t{8.ǪxAw_"mP@kH:cTTJ` 2Bt_nz d\s*y* XAPh3 gh Z7-゜Eɧ2 B#Fb=KNL .\�fCan#LgȾ!z6v荸*{ҭ{EljB+7[F3 ؓ@H&{|{tR.s4m3,|fqY<+WwO ջS%e Fojl:&_H~rpq0W!-<+=AKmܱUMB;_�ۃckgy'Ë21\}"Tcҫ`##Zz'<{S09~'9/<::*+ /CTC#T場LtSa¹B-R^i! ]ro w 2!1UHn^ƀ:+f:y�?J L8aQ eamrV4" 7OLaP!,,{^jCգ9@fAR, C4Co}4&` szU Pvh622]lhgs#A[y6򡥫͝|ؖGX=8Q5GGG~~g?$3,p .UOI+\FXUYaj e>.H$ *]Ԗ>;+#"F6֏Ke2jwtyO*L 1 &sa>d^h.{z 㛀O)ձ(eb<pZk4^\TSRݰaguԑ%&B={bEe,��1IDAT�Tn1DGH+ۚO�/KC 7 ]_d@䒃\sCpA|RSښ`OrNAzQI=tӭs ع|M \͵2Bhd &] tj<2wf>oH<tTXrm--MJl�<7yrVz[�ׄ Z׽Jg7|Y 3u&:nLomXrʜ:eNK?K?v?GGK_}W_}=~駟~JCCCy/'2Cf4)U>t믿F2]644$k8u!=d̓qr-˸(T&R[ .zldf !O%/PxGwܥ\["[XBo0#L⍵V.]rnj^E$DֳH68+pE0a0e;RU_5nڗ-½+z*t{�WͶSF!PmT N\Z-R+JooZe4Nul?)H/PmST [N??}vΛ>6̷B}dpd#Q,x}J p9CjdyVcu.~>DY* 7{rf̽-V@�]? ",IFnyx1Ht 7N"zr@;,k](l8yd=4r-i#zyn;mk ZQL9b{6�؉ Kk5N; .E"$sp;C>G\<BP׼Pr^ZY:[= h3mH5NCjױХBis#M*% ݨy�;s$$Kr^ �X`mf^ߩU5A0'n'뜪RxêNYu*'_W<k{ӽ Ds`?�6{R*fw<h4G;/.~u@|څz[}Z.ԟQh][H&`n):o.d�-e7{`<ܢ٬]p*-*G.:q;I<o^\a&�uiv6%nݿai5~m<'h fP>s()`oNh'7Dyʜb&pծ C7-zU ;cÆ 6lVa|x' Zq5x3=&`bAWu'8qC芸ʂt&,Z,(̷ IhȇSn^{YxX7r!wF):m\tɓg9^GYo;keiG'L5b̭Ot6$A>zPQ<)k} 3=,u[Z*ARFV7ʦh%X j ;`.oOہ4,_C@1i@�!77aDmя—_~9Q2<zUȫ&9`< C2gtdM\V^w寋 MV oW۰Q fh&f$K]2/0Z{am/Nhtɱu"dD2Jɻ o^LMƱn{>TՇ9?/&27( @` J+'J#o/AзlOK\ӥ"<LE&n�[H\FU*l}—eup"*o:'=rغm 7ZcYZJoNnHeN@ĥSR<JZ_zu``ഏNMKATZmZ,!Ol(em40L[b[aqrdqJOKĤ<c7gAuXf{nYN`8[ޜћyU?E.v/`k y!.UEuhߥ;T& ]Frlll2<(aDg~!HhR<V=Μ Dͭ۶|dոEh1V—JYϗ`9Eoϛ{E^eeDUc/6 UЩ mB,'L9{aނntn?'.Hıi%%�Y.4 rYɟSy_3v �tҨtO5A[ܽyaldiq0>jVK.\\sA2`9҅* gU^v}w}75ar3릦]anrd*jظ qU RY)ުOLywXFӡ[~4�윞1'ƙ#^ӂE&uGFB0y<.BSmipm'I M m+-h68NU]5e<DBxf{cZ8]z\JmCE !,&vAyk>sXZ'B/BΟ?MMM-zwʵk׸7==Cavv�Fx2$OjўB+~w/`a׫O_ jXy%X^7w8@5L6\jd>-tk_? /76oE:qxf,h9Z Cj:&&J^%ԗg| *_y;<GQҮL4-MzKVO[ X j{7DYvq-[nݺuvm6#,$mZtoʕȪ} _U3bgff.K=sΡќ*HZ*bd|Œ4.]meӷĵ5fV\낹 x<g3|D3, m $]OyЊ<MagE=8)5L ABj 4K="{WY敚pi9/}! x^b+>kfRpECtUIgzRX%<>.2/1 <+tn89jv;%+V1}د{xZM)I/ G1[ׂ,>X2ځCLP4LM>ZWr<"1$3EXcCY^HecS3>(*{`Bz/|>`P Rw;MC֤ O!@�jqki4`spm7'1#o_nؒٳgϞ=g}g󠆋Eq :r%+VX[X|#A]a[ZT,[)_Qg b I : HViXvf~<ϹB脞!s<!{3܋BY,mzJ^)wbl_B\sf&\ H6=VČ\mwɵ0; ,ސ8NLL$m9aZLa(N\D&&&<?>hޱ!͝'˳ør:? לYȿөToŊW^V%*Cp6ZymHF2@ޏ3'@@lS yJodt):2iNinh]1֌spj恙!V&cZ';.Yyq!e7&u,dݮHu54z+\m tIEz1552,/;>/LT,QK(iǰn:�CԔv}NGg|N?.̫=,<<<L*Ju^,?-1K˽eAtY;˙9\8S$nÅ;*WYQ4.9[٨rL[cAz!D-G)V"+)j $Sɡ2Afz/ Ǘ{lT0ε'hFhg}R-.$DÇ?s\a·[n+-C]tn mo戋)rt:3jm&*^fH)q9!y $sZ,5}ƫm g'Q gzJwbu"jVd5eYM3.T@2�̄q(׎֜DM =9">ќ#e2Bf%_kAE?900k׮U?0]o< =Tt:*qvXjϘ%‰￟'K\5==-7=ԧoʵkN߲4:Yb/δupx*9a[#R M} LތƼ(;" KVtC1'١aX+y- FK:Ȟ ƀ7>1Yu@r1Ԏ NE~o2@P�4|U^6GhIʞ7ONx.Al@iPJI/._]ח$6hh)tZx%>!ҿE8(l Nk>;ɸ|!2rÇpZrC?f[3\<ͳ$y%_l/<\$g]IF2}8c@@nmjyzgYt]\ƈ cÕT(S'Omڼi!URB+ʠbvvՔr1fK%A.]x90G⟃*5j繱fΛˆ?Lr7zf)U%0D@,@bƳ6fX#-ϙXpK8U&- F�ڸ$.7y+zy1�yck)h*@'q/iOSCbv*0G0'ӻi6a8oݶ P s )87�?f199999?udV ρ\]]+7d`ʱt: mT,s\)Ŝ/%ߣy ='Q13OڂB1+bY a^,i{H$ܝiʮ@Xy <8\8a ;n=oN]yL8z!D4ojcňD8o>DmZAS*EM#Ü@Sii^z.zpR*AիQnV�;1�9s&K.mذOTm{_PX͈o*0) ه|,4TFj5P)=R�Q4@}Zj"^‚w`}}B(r;wAk4KTA~A߹/:rR:f'۸ԜBIe<oj*�ߜ{5}RHgF̑XBr^uBtא09OJAZ+Cq}?Xr\Y^|B5+Kut�h](SUL!21[]3Ȩ,AKB,O 8M'X"OkbeC!~H*)TkvB]% K߱>}9) zr-pXruWX,/7O9K:/&]dY.3j=f=EGp'9fLNFGGG=_7C߳PJmS|~88+|d p5ИR3kXj4ǝ }%Tt+C)G5E _d]fuo4Ǻ,�un|ᗏq/o37;ܸxbK\aؗZ/?TMVQe#H-{>yMog ⢾)EBck�3kCӰ276$g/w#g W.o1bĈ#F 5|Qf ^1bĈ#F1bD#F1&v^#F1bL3\w Dy?/h7Yxs#v˖3ޘ'.7šRm1bĈ1#F1bD#F1"pƈ#F8cĈ#F1bĈ#F1bĈ#F1bĈ#g1bĈ3F1bĈ#F1bD#F1"pƈ#F1"pƈ#F8cĈ#F1bĈ#F1bĈ#g1bĈ3F1bĈ1n#F1bͿƌ$Iw5^?OwOoz)bN;J1bĈ#Ft3^?OwOoz)bN;g1bĈ3F1bĈ#F1bD#F1"pƈ#F InƈZ>rBݙKw8cܠ#~B{gjI<J1nP#~͖ ܤ!t˼F1b,Ĉ3FD1UۍW1@#~⊱XbDԌ#ͽn,3F1bܬu,;gw<)Ň` !|ahI<gtcߢoWK~P,ݙ1bĈ#g1bĈ3F1bĈ#F1bD#F1QWY~ xQbĈ#F k)"F1bĈdg>(^1bĈg$n_x!bĈ#FeD(VR����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/dssdialog.png�����������������������������������������������������������000644 �000765 �000000 �00000015456 11332353405 020770� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��������EY���bKGD������ pHYs�� �� ����tIME3ە��IDATxyt\}{fь4jKd}B1!iH jrhsڒiJIC㚄 ) /M2ز-hG?L6o7{wywy+b1!ƭ��Ȍ}O/Pz;� ٸ}O/mɛ;@��dȻǏvU#��Ya�1n|8e7*l^aSjJrjjOU BG"GG&/�C�+gikoBx}B5V!I%NrӍ.G49'GFDҍ�� URʲjժvoYPyUno$W?M+/}gJS#-w+ �-$IR$k&@ \ٽ{,Y[/֯~wrN\8� +@^[G^{f`CJxO+u !{:/^hZh4չWs|H"/~&T.ʏ{/qm^4%˧{9pɗbU]Bhؑ3cz6m6/�B'U6]GMFӿwiYt+N}'ƅjiXE]I[j{"]{•k̋Ee-X\WU!S݊'r6 !::O\ܴKwޗ5tknt +'^{ۢnKH%Gә K�(PHe9^tYҼ_G⟿1k7p~J+5v Yz;ȵuQFOYyҦWWj$+no0W5*Wyb!c.^xɗ*˼vb{=w+O]ig7>Kr͛.MW|{͙Soր*ٹp'nXޭ{ !v|c,K޻UB<}EgϷ !ni-z`ρϷ,ይI'@( ͟}J0?͇z(P7P@*`xޑh=yMv.uhd|lbq?sT3.Kɭ6jBG9P[GOͭ Ybf"\ TzMkWUVԕ Z-[gx_~͗y k/<pE/{pϟ=cJ /l3i^BxrZ$ü]ayǾsLJUU+5#cb<湠v/{2ك}z.xBt>Ihټ70ꡎj\vc*>!x}YV\nWZQ ,_}G9Wb{GϕeO5`ʲmv.aXWw/~)+oj~բ5MFyrv?]pپ勚*b~go ~+lxʢ)aA (,d)\$5+-n?_?CU7\iPoJ1V!Sޞ, zF&&&\+GO=[]/>xUC} ^SvB^ndׁ޽j]އB@Lrɲ%$)\BWkO i׺Ey6mv.*B,WOI<&4xs*B.ܼnٲO<[  2 14bfy}6u�}ܰ^D#/D _7:{'eB~[qW$V\/Fk;Y]-o."gm^bF!Ķ/v%~K|ǭ|O<!{ 7̩Bp׹ї9~S[ !zzaM hXt͢Fö_Y\Bdhdw.рs}ѩI?veb\uᵗӁ7Bu}K`$dPYi3BFy _5۾OM!0=59 B.ݵ+GqC/z\g}rxlSיXL,W#xPGl:q|%lqN͵O޶Wn y!ĞnX;ïc[j*X_Q\S M¬mSQţ$o¦w{ڥM>*:!IR$I>}nęE !~쾉h_qȩsC6K`A댇H|vٙŞEM�|{)V}fjPh+535s)UktݱXW+蠉Ǟo[<74q </X} {7m,m]-]S8/nnpΓgv?ÿ-s{f~LB4WOME#CmG=;?93kĤ١X,K'>vŲ k\Eu8zk^h;h~]QJ<)�P"j3ӫ.z=Mӊ,&T5^7=θ^Mc}Hf_ ߧ,6==յwh4?0p?[`q㇣SSrʫj=n_wቱ@euEU]|#/X) 1v|x`r|<&b) *x}Z},q{}O$f ڹwktxprldzzR,Pq!b đ^!D՜沊ŦS*`U3~2;yeמٶC5sr7qab<ohLןU:կZ3rM׮[x`η!˲7==% I\W5se%u{}B/./D?(Ins$/Ae<= !dI. a~Hu B$d%IRL\.r}[Q+? #$I\)�P1~e�*y5_q`lᑈi6P1_ FH7&'''G|͛,ƲפPmßC>G{\hVlR}zѫe@E&%� 5ni͢ E&D,W:�dEMͪܚC$Ʌkc�(Gmmg)+*T^ca%�V_^\yM=֑�H0XVz� n{gB[y;� SZ[[ Bj&��رC �eV����a�@X��a�@X�V��E[ԅaH$?dui OԨ:fhg\ibkTCSm%C"ȷ a9CԕkKy>kϤhs..ykazC"?�DX2NE'Gʨx-jA,d5j*2M4NRYjgYڬgR KXЛ6wZc m/^ͮP{ &Lfv`mJC0"CQpE}&1#߬ rw~cuJg=! ȰpNcFBokYAiѷ[zkFfe>cqQv7ϑ 6nfNk3N8cFQլM],(#? l)ـ4—wd]io8g߀o̯.ueky,,FLтf9LPy*9#D]iiԕs,L$CaB B|o]{.^Rbg 9/f7ZQ[ORfV0|xᵛl|y 3ӶFڰ7męĞW ��`/Uឮζ|�B��+�� ��+�� ��+�� ��� �_ ~*,��ȎJ��dMXQU�ZZZ�B޽4��� ��� �� ���.BB!:�bsU<|9�;XS/G�@VֵX� �eH$NLihTs�ǚPEVO4��<V[d$ pXs \ub"ES,�X*'k&U#X"��:Ÿ�( ҉/iҎOe3;,VmO0]ˬD:.�J(P>ͷE��Jc� +L�BYI�ta�(P@`�Xcs��<V����a����a�(*x+@`Mb|[J'DKkiiiJ+7*#D\U5[&A<'ؼI=5Y̎ZNA(1=;91cfT@O2nI;ae>H1슬pڨG̢?F9_ǰtKc̘Y3^sFنWq7hI~c*ᎃsM"1Ei2l]3S(?zqΞ6rLU)ygk/GYs4n8f \O'L6XZ^pPtS01nL"PL $3s$HYWsEUѤ RPU}LfCfo>GZYփA3ɒ4u"ϳ@Ua=쳑Va.[a̰ .XwK30@U/ _)몚t$}UB jŸMiO5f^p|=AX5OKbaI i4-B24D0yQ 0{jZg3z46S@Q#Jt�kIc9' #6@3T4bvEkϫZ(<IfR(i!ڿ;8Jb%5Sҫ%/i_gWmS\P��@  �N_@8<P��@a kNbk�BلH�xل|5�+�� ��� ��Fx+@jLb|ŽKkimmRx֥ck𴴴 %ak|B��a�e6ű?]}xxc',Hh [(jͬ^/NVkT>ia>bAc6{1ΏM54跴Sc7^`o"М^!;Cm M:k!  %4tE 6Xaҍ\7\'}3"L3LZWuboQ ^a}l]�Q=%c!yL+Ȅdd2ld;:m'U=!+qAbS3HΓǪ EFgRcYF}}4C`\۬{�.y�/P�0;C�y!� E ;d~#[f�x��+�� ��+�� ��@R[4�@N�H*Samii{��R" zğX� �� ��+�� ��+�� ��+�� ��� �cF"uzOĬ��E&1^C�j?aiR稽WxiIT^]��YX:v]ժ2nZKa4$ްf^�@v<V6q̺ O �$ 7,8YvvQҊ>m2Q�š-P wJ2{a��UXKuGRI9jAL5`ь%?��%WI̛a1�� ��� �� ��+�� ��+�� ��+�� ��� ��5_ Bt �@6N�H*Samii{��R" zğX� ��8!(mS} �aXz\g5> 8fpP 6R;/رcG"5.sf#<V����a�@X��a�p J16ZmWcq Ȯ]oUK܌D"%;c[iz 7UO-|U|V:N [řԟ p$>lLMCo7.0 ib8e':놩Y0!-wfvR' ̹i?iAf;WI,|&)[S=i-l )Z}r)6 2mBp?>:y '\1f{ 5L4̛%s׮]i+aL +H;eK5{@iqX?S P[45K|. O$?if%f!&R,%գI@D<V�a�@X�V����V��׭sq1k`Y px@$1[kii0šW"� �����a�(F1P(D��dGX}ֻw)��=V��c/��6n�� UEG����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/index.html��������������������������������������������������������������000644 �000765 �000000 �00000021414 11555611701 020300� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Contours - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Contours</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> Contours are curves along which the pixels have a constant value. ds9 can create and display contours as an overlay on a data image. The contours can be copied between frames in the current session or saved to file for future use with ds9. </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li><strong><a href="index.html#create">Creating Contours on a Dataset</a></strong></li> <li><strong><a href="index.html#copy">Copying the Contours to Another Frame</a></strong></li> <li><strong><a href="index.html#save">Saving the Contours</a></strong></li> <li><strong><a href="index.html#convert">Converting to Polygons and Saving</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#dialog">Figure 1: Contour Parameters dialog box</a></li> <li><a href="#xraycontour">Figure 2: X-ray data with contours</a></li> <li><a href="#dssdialog">Figure 3: SAO-DSS Server dialog box</a></li> <li><a href="#dsscontour">Figure 4: X-ray and optical data with contours</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="create">Creating Contours on a Dataset</a></h2> <p> This thread uses Chandra data from an observation of the galaxy cluster Abell 2142 (ObsID 5005). </p> <p> After loading the data into ds9 and setting the desired scale, click on the "Contours" item in the "Analysis" menu to turn on contour display. Open the "Contour Parameters" window from "Analysis → Contours Parameters". There are two sliding scales which are used to set the number and smoothness of the contours and fields for setting the range of values to use. </p> <div class="figure"> <div class="caption"><h3><a name="dialog">Figure 1: Contour Parameters dialog box</a></h3></div> <div><img alt='[The "Contour Parameters" dialog box has sliding scales to set the number and smoothness of the contours and fields for setting the range of values.]' src="dialog.png"></div> </div> <p> Typically, you will want to generate between 1 and 10 contours; larger numbers will take longer to generate and display. A smoothness level of 1 will evaluate the contour at each image pixel, while a level of 2 will evaluate the contour at every other pixel, and so on. A larger smoothing will generate contours more quickly, but less detail will be available. </p> <p> By default, the range of the data scale is filled in as the limits. Under the "Method" menu, there are two choices: </p> <ol type="1"> <li> block (the default) - blocks down the image by the smoothness factor before contours are calculated. The larger the smoothness, the faster the result. </li> <li> smooth - smooths the image before calculating contours. The larger the smoothness, the slower the result. </li> </ol> <p> In this example, the number of levels is set to 6 and the smoothing is set to 5. The contours will be generated over the limit 1 to 100. The default method (block) is used. </p> <p> After clicking the "Generate" button, the list of contours is calculated and displayed in the "Levels" portion of the window. Click "Apply" and the ds9 display is updated with the new contour levels, as shown in <a href="#xraycontour">Figure 2</a>. </p> <div class="figure"> <div class="caption"><h3><a name="xraycontour">Figure 2: X-ray data with contours</a></h3></div> <div><img alt="[Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.]" src="xraycontour.png"></div> </div> <p> The contour parameters can be adjusted until the desired result is achieved. Be sure to click "Generate" whenever an adjustment is made so that the levels are recalculated. </p> <hr> </div> <div class="section"> <h2><a name="copy">Copying the Contours to Another Frame</a></h2> <p> In this section, we take the X-ray contours just generated and display them on an optional image from the Digital Sky Survey (DSS). </p> <p> From the "Analysis → Image Servers" menu, select one of the DSS server options (e.g. "SAO-DSS"). The server dialog box allows you to retrieve an optical image of the field of your observation and load it into a new frame. The default retrieval image size and (RA,Dec) is equal to the size and center of the field currently displayed. Here the width and height have been set to 40, but the (RA,Dec) determined by ds9 are used. </p> <div class="figure"> <div class="caption"><h3><a name="dssdialog">Figure 3: SAO-DSS Server dialog box</a></h3></div> <div><img alt="[The fields for Ra, Dec, width, and height are populated with values determined from the x-ray data image.]" src="dssdialog.png"></div> </div> <p> Click on "Retrieve" and the data is loaded into a new ds9 frame. </p> <p> To copy the x-ray contours: </p> <ol type="1"> <li><p> Select the frame with the X-ray data in it. </p></li> <li><p> Use "Frame → Match Frames → WCS" to align the two images. </p></li> <li><p> To copy the contours, open the "Contour Parameters" dialog again and select "Copy Contours" from the "File" menu. Leave the window open, as it is needed in a future step. </p></li> <li><p> Select the frame with the optical data in it. </p></li> <li><p> Using the "File" menu of the "Contour Parameters" dialog, select "Paste Contours". </p></li> <li><p> Adjust the parameters (if desired) in the small dialog box that is displayed, then click "OK". </p></li> </ol> <p> The optical image now has the x-ray contours overlaid. Since the WCS is the same, correlation between x-ray and optical features may be seen. </p> <div class="figure"> <div class="caption"><h3><a name="dsscontour">Figure 4: X-ray and optical data with contours</a></h3></div> <div><img alt="[The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.]" src="dsscontour.png"></div> </div> <p> To delete contours which have been pasted into a frame, select "Clear" from the "File" menu of the "Contour Parameters" dialog. </p> <hr> </div> <div class="section"> <h2><a name="save">Saving the Contours</a></h2> <p> To save the contours to a text file, choose "Save Contours" from the "File" menu of the "Contour Parameters" dialog. The contours are saved in a text file which can be loaded back into ds9 with the "Load Contours" menu item. </p> <p> The contours generated in this thread have been saved as <a href="ds9.con">ds9.con</a>. </p> <hr> </div> <div class="section"> <h2><a name="convert">Converting to Polygons and Saving</a></h2> <p> The contours can be converted to ds9 polygon regions for use in filtering data. Converting to polygons also allows you to select and/or delete specific contours. </p> <p> <strong>Note that the contours cannot be <a href="index.html#save">saved in ds9 format</a> after converting.</strong> If you wish to save the contours, do so before continuing. </p> <p> To convert the contours, select "Convert to Polygons" from the "File" menu of the "Contour Parameters" dialog. The contours are now defined as ds9 polygons, e.g. </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> polygon(3535.2112,4184.5,3540.5,4179.1154,3548.5,4176.8219,3555.9012,4184.5,3548.5,4191.9558,3540.5,4190.3926) </pre></div> <p> The polygon-shaped contours can be saved as a ds9 region file from the "Region Save → Regions" menu. The region file for these contours has been saved as <a href="a2142.reg">a2142.reg</a>. </p> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">24 Jun 2009</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/thread.xml��������������������������������������������������������������000644 �000765 �000000 �00000016360 11220740726 020277� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="us-ascii" ?> <!DOCTYPE thread> <thread> <info> <version>June 2009</version> <title> <long>Contours</long> </title> <history> <entry day="24" month="June" year="9" who="liz"> Original version <!-- copied in part from CIAO ds9 thread //--> </entry> </history> </info> <text> <overview> <synopsis> <p> Contours are shapes which are drawn on the data at a specified pixel value. ds9 can create and display contours as an overlay on an image. </p> </synopsis> </overview> <sectionlist> <section id="create"> <title>Creating Contours on a Dataset</title> <p> This thread uses Chandra data from an observation of the galaxy cluster Abell 2142 (ObsID 5005). </p> <p> After loading the data into ds9 and setting the desired scale, click on the "Contours" item in the "Analysis" menu to turn on contour display. Open the "Contour Parameters" window from "Analysis &#8594; Contours Parameters". There are two sliding scales which are used to set the number and smoothness of the contours and fields for setting the range of values to use. </p> <figure id="dialog"> <title>Contour Parameters dialog box</title> <description>The "Contour Parameters" dialog box has sliding scales to set the number and smoothness of the contours and fields for setting the range of values.</description> <bitmap format="png">dialog.png</bitmap> </figure> <p> Typically, you will want to generate between 1 and 10 contours; larger numbers will take longer to generate and display. A smoothness level of 1 will evaluate the contour at each image pixel, while a level of 2 will evaluate the contour at every other pixel, and so on. A larger smoothing will generate contours more quickly, but less detail will be available. </p> <p> By default, the range of the data scale is filled in as the limits. Under the "Method" menu, there are two choices: </p> <list type="1"> <li> block (the default) - blocks down the image by the smoothness factor before contours are calculated. The larger the smoothness, the faster the result. </li> <li> smooth - smooths the image before calculating contours. The larger the smoothness, the slower the result. </li> </list> <p> In this example, the number of levels is set to 6 and the smoothing is set to 5. The contours will be generated over the limit 1 to 100. The default method (block) is used. </p> <p> After clicking the "Generate" button, the list of contours is calculated and displayed in the "Levels" portion of the window. Click "Apply" and the ds9 display is updated with the new contour levels, as shown in <figlink id="xraycontour"/>. </p> <figure id="xraycontour"> <title>X-ray data with contours</title> <description>Diffuse emission with contours overlaid; a point source is visible in the upper left corner of the image.</description> <bitmap format="png">xraycontour.png</bitmap> </figure> <p> The contour parameters can be adjusted until the desired result is achieved. Be sure to click "Generate" whenever an adjustment is made so that the levels are recalculated. </p> </section> <section id="copy"> <title>Copying the Contours to Another Frame</title> <p> In this section, we take the X-ray contours just generated and display them on an optional image from the Digital Sky Survey (DSS). </p> <p> From the "Analysis &#8594; Image Servers" menu, select one of the DSS server options (e.g. "SAO-DSS"). The server dialog box allows you to retrieve an optical image of the field of your observation and load it into a new frame. The default retrieval image size and (RA,Dec) is equal to the size and center of the field currently displayed. Here the width and height have been set to 40, but the (RA,Dec) determined by ds9 are used. </p> <figure id="dssdialog"> <title>SAO-DSS Server dialog box</title> <description>The fields for Ra, Dec, width, and height are populated with values determined from the x-ray data image.</description> <bitmap format="png">dssdialog.png</bitmap> </figure> <p> Click on "Retrieve" and the data is loaded into a new ds9 frame. </p> <p> To copy the x-ray contours: </p> <list type="1"> <li><p> Select the frame with the X-ray data in it. </p></li> <li><p> Use "Frame &#8594; Match Frames &#8594; WCS" to align the two images. </p></li> <li><p> To copy the contours, open the "Contour Parameters" dialog again and select "Copy Contours" from the "File" menu. Leave the window open, as it is needed in a future step. </p></li> <li><p> Select the frame with the optical data in it. </p></li> <li><p> Using the "File" menu of the "Contour Parameters" dialog, select "Paste Contours". </p></li> <li><p> Adjust the parameters (if desired) in the small dialog box that is displayed, then click "OK". </p></li> </list> <p> The optical image now has the x-ray contours overlaid. Since the WCS is the same, correlation between x-ray and optical features may be seen. </p> <figure id="dsscontour"> <title>X-ray and optical data with contours</title> <description>The x-ray data is in the left frame and the optical data is in the right frame; both have the x-ray contours displayed on the data.</description> <bitmap format="png">dsscontour.png</bitmap> </figure> <p> To delete contours which have been pasted into a frame, select "Clear" from the "File" menu of the "Contour Parameters" dialog. </p> </section> <section id="save"> <title>Saving the Contours</title> <p> To save the contours to a text file, choose "Save Contours" from the "File" menu of the "Contour Parameters" dialog. The contours are saved in a text file which can be loaded back into ds9 with the "Load Contours" menu item. </p> <p> The contours generated in this thread have been saved as <a href="ds9.con">ds9.con</a>. </p> </section> <section id="convert"> <title>Converting to Polygons and Saving</title> <p> The contours can be converted to ds9 polygon regions for use in filtering data. Converting to polygons also allows you to select and/or delete specific contours. </p> <p> <strong>Note that the contours cannot be <threadlink id="save">saved in ds9 format</threadlink> after converting.</strong> If you wish to save the contours, do so before continuing. </p> <p> To convert the contours, select "Convert to Polygons" from the "File" menu of the "Contour Parameters" dialog. The contours are now defined as ds9 polygons, e.g. </p> <screen> polygon(3535.2112,4184.5,3540.5,4179.1154,3548.5,4176.8219,3555.9012,4184.5,3548.5,4191.9558,3540.5,4190.3926) </screen> <p> The polygon-shaped contours can be saved as a ds9 region file from the "Region Save &#8594; Regions" menu. The region file for these contours has been saved as <a href="a2142.reg">a2142.reg</a>. </p> </section> </sectionlist> </text> </thread> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/contour/xraycontour.png���������������������������������������������������������000644 �000765 �000000 �00000250257 11332353405 021414� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��<�����yɲ���bKGD������ pHYs�� �� ����tIME7�� �IDATx{Wy'Otn%۲ ~4myH0%Cq3+w1py$3s͚!Mf4 b e[-K-i[oQٵ_j]::}j~�e{<�c` [l/5n厷gA xG<`gNc s i!2=~ [kVΝ=~{G߾lMc͚5.\ى^"-3c'~_8s=s׽<XUI  Wo?shao翰ܓϞ|ӋN뮻.#]w?ȊU=+'FuFFO_ɹz_k~կ_\fpxMȾNm[j NF]h0(Yi5?tx` 믾⒅ܿ7t?~/ݼ{7<׿'Kj"f 5"l'No6kWM�=|EڿmRuwm8FO?,8}/|tX? �?cSmY;l>s~��{ub؟}~f4�ԉ'<fo.߼_z՗mX Ç=x}]@ %4`(pɿ]ϟ5y63IKu)=F,�,-_[=6i٧~tni4R[;o0ËO=sxbͪ4<}Rs``�|SX�pkzvph�n%w*�3g_zն;oyU퍥>}UV Vޯߺr5߀-i RB pVN5dQ_W>'/>osճ*IKν#nwCl6onx˷XZukVnXu_{+GN<9�xW?}k^_^kU+F~'+ã~K>^u}_{t_|h�o{ CvoW[{?_?�6F]ßާ;�Woo{U?|NkG{�qu[nz~O~񁧞;57^~8+μek^veklO>kmZbC/ּ⺫m\h�Z H˦W{̩]|-s\ [vxًXK7m3i Ξ9w~tx#wOyщ.}CkO\uɺgOo oUVo3>e /Ž?wcO?7+eSg3?OC~b7c/r꺫W^ݟ^7Z1G~v}�=p%eo>𑣋k~_g/޽bdw7\1O?s7Nlcnj뭯y\96^u衳`xҭorMk%�\u٦(Ejz!}vru*??GV�-0!SGB8hêᡋ>1;ok �#w7=_{c'^/o(�9{䩳6\l ;yfXzST|Go}?oyeW֬?Z{}_uZ8sU+F_<~}lpxtʕS׽8^~ͥkW=ԳWvɖ^|ö5{]lE/KW9rΏ?yﯿ%/424�O?wcݳOk>\m'ӿ~n5c&!DFiBF)VUZ}cz{q:q G;bSΝ;{,{>Ike&~euWo_~nZw+?W+ ?j4MO7�0:2r@90�Dk%�'.^׬rB�?} !�<w`ʩky劑A�xah r{k�K7>y8t͑6oMk �<4^qWtOgS/k�玞4nۺqsG^3}k?vKKK(CҲy*Q)RE{-ES_4'6"�{#GZ \- pq z fn{=}/K�772ʱW\sɾ<w/_'#͗]u�<G$f /^:ŋC#ͮH.eW/>?Sw{f8z�dQh4m^x4�8ˣ p90�'N kFܴvGk?uy^;}+>600OƆηÏ6^=ؔU%ԃg?X5o} O>]h4 cyǾ=22<44GnxCx3zcaW_�~^68<u?c~%.ټ_;ѿw׿ًм�o=mR~h2 ~*y7y{٩9@Oٰvͮ%WnYxɣ_ضu[ꧏ0zl鯽v |gϜ<}_\c\?~N9wM�p '=uٛ^m劑o}ze3LB 0oޢ+ɧVV뷈Uŧs_uk:u~hh( '+4tU[Vo۲idxȱmt׼J�?ܿ|1.u5x卓'|mo/}kŪ5C#+@eА~k/~݋펷[?8s�>{lmy~^qqi �ΜG_]{ W"=O>裍CQw>{O_u-~x#xn67_76:LO7WU->yGѹꡑ́{2v? hⳑ|٘|}Cf{|Z?{9}?8@^e҅v'N<r|ʍWhZt'x gå90bF=ȹ3VYZ1J|c>ـƦϞ<q'V^;08<<2ď.-]߰n˓`e׬\=O~p񍗮^ӏ<qtlڵ]pȡϝ9l8yH.m<N8zo8y}n684|칧NϜZZZ]~늕H=z4]pX8sΝyϟ ́UoYqgO^\]9ޚ004<<Wp?su�}U?տ!ff?~=uz8<G\>v'nzK?uUWRJßxo98ҥ h448428<zfs90884242 �#c@8:z`pFhF�xF KGWZf%C�hݼb@ct5h@7+W 4yM ~g|Wp?|gaph hpaFB8ޓ|7\2<jp`laغxa`p�WpI9V~`phpxxͺ-KKBD9/7<%5,޹8?ȩm7 厮\БSO=Й3gΟ?GϟmM c-9^fhdt|ãcB\/?s[G˃C#&֋|ě^~ū^z>('_l6UC242fdT@�X)@ ^EYH=ġv;ǖ.^h6#+V84btx/DܙS_8ixXfxtgoz\V�m]984GWj6і@T?cGVZ=Uճҝ+Z+Z8IJୱU#c"IԉEQ@xp=|@ »>xO[xs@ {n/;݄@ 1;;}@ j$-@ i!@ $-@ @B @ b0?-.Z `(+<~#"e`i^-Tճ;~j>֗Duju Wh iz[Ӊu827wOUWD K(>0pjUyt'^ڟv>̥ 盉sJ%OJ'V?T-OjeSee}o[ svj\t"%mf5R6庁&51M.vmQup=]4-MZV>_tLڥ"ze.soװHivu&I/[ `N/ATѵjWuV~GO=Yj y䓓z ֤R]]z띟ʣ*%wJSgGCNj7GM+jyoxjW{rTggZzm-'WԫUq1>~Od?P&fILƨ_^T?x%+K-})G)EJNrEo5S32cݚՖ<4X:Xx>X=?eͺUWu젣Q7t+Sg?y4[5jUД#JPڸ]~,YZ𒧱s څf2ʩ2;P{[7r|ϓ?ub 0s1@nX3(s±c'?`'QͶ7>�%ڗQG baj@ �I @ HZ@ i!I @ $-@  ӊf Ụ{n@Ԁ3x;S {@ u&-@"N@ EB@ jY<Sx@ v'8VY"ɶ.G$!i8"%[6ҺbLY7kVRGWeHVL%-\ E?OLLKM揳pߛ Sa+r XUACdBXN%�W۠q ="@/hv;;9S#mX2GbQQ\!"~#Q]b+S@HGiҿ{!w[9ȧ㙦OToQ)oYQ'6<3:2*L})j >Nc%s+^*I 7wZ(`Yo"V/4̤/*<w-e;8hķV -[Ķ+)ǖV֒Ud/nP3L4kU#u..ڧ*eN_f-`>Pn?g}t7.:B&Nl9'~|ut.:1H)ppy"q͘wڥ&$%|YgH;$FU2oy0!Z>EW1 @ jfR2zx\5Hu$-D ΰ$ VJZw-Br@UNyyb flZGI ,bB 艤XdlB8(rB vjJ)!i!#Xy0%-i4i|AՖI]U`\M\}!V!$R:%GVLFX<߸ $gK8DtҒ&z׈r_15E蠑ZmI;-6F|&2w:YzX(_G?% ^H+^B&QiEB \"mAo4~$zb]qDيun=6@B aul{b;~* H`F >;hY喺eZ*OR}Q: 1/AjUxA=gL #$EdU=e<G E <YTa_!'em(l!%ȿaj%XOl=$�I%B/ @@=[aF4oi0V 1;;@ C%)HZ΁)ȡk*a ]+ޝh iݻ4رcvb=\[|-94>(Ǫ`k=!YUرc ->FG\ēZڽ�s'D}"#BbF@SrV I֫l$@0M xkYÜH])%MiYH4C4%JittĜ`_ͅG >Nf`NX$^JN]UHZ$xWRvQ. wfRMHY t&iIA DVA'hd)9I ULQB Jd+!ΚI1r(P7X&oF"JN # Ԡ݌G6/N)XNbVpb wVl75޵@ZSq|UP0*Ĭ9Ìե1Pg؂ oIZRvFѰ"[7{X#ZKM$�UgHڕX0=(z"! gu[&_"<l3_vhweϭEb(ΉS Wi0L=hM^&F{)9`dz:$- -P?5ld^@kowy@a{TVBd?!Ĵh2"'2 Ӱ�IhB}Li,b>-瘝N@ -l-�4L)X}wgi>;m {�� s{yLƃ7ɘE˭s`C@5#2+kƺ6XitO}p'`4<L ``zCQvHZn{n v؁B0PKEi/P?L�7s�3=R}p4LM�Bt5 {9Fh o bV8vвb}V w̽;Ss0P5 p|8z`n$4L$td*HZ+r<!  [L!rif�te);ඈu7AA y}30wL;Z3�3SxJT֊BAD�S!gj2z9r; {'Ga�D�S}mcas5cnOK -@"f<ih4ؾ�`nf� ^�O a 4mIMHV"IeiGע�� �IDATE.ј1N:f;*??jN?XW8ZiӤ&҅)cD*r!�4,L� b[kH*:<@d> u,3im ;{wg7׵ԈL3aj^'&C6UJ>G >:+&)*T2bkK?r4ֈȶk7 l4HdXHל=yju &�&aSy�@)�d�)X;LB-- $ ~)ޗXܝ{3u2=Ǹ?ԷT\&L]g>0obXĆE�S�p|Gv6nk]�9|1x�w$�L¾` s$o0 8@f=BQNlf @jr?0Eҗˑ gr2;SSЈHHbQYR,1M].x]0o#ݏu 73oo<xI)^o~L%ӗ6�4(^b !9juܢ"An^p׊S}6z4E |TnX TK&WRa>R�n�x�gc p@Njn�ކU+2iI NĚ2G=q/7@$hM?ojhcgR,5 !p9   't$Ki.oCZ="Q\esB AtA#XҚR a!r&Io@]v�_e��޻SpL=S*,J;!h^hRVv[D}**bֻ<#Y#H֧(KNF0ӊfϱ %u`4.x>Gnw{7-7?�s03s77BP;W9H`:XrenP6:שPÞ`�Y72հ1rQgUGNg]�aNj%z.o agW}|3��8L߼p͟;f`.4fl킝 y󰝱Ф�+$K@?bp>7q1)ʰ ܊O{++mJd}"n_O >m l |(<,wqO[D."F/{@ JTx5 �| :W/`&jx6׍4ۧal02{:WeR <D$- 49ʃ5#0w'a<l =03 @>.̑a!r=VH8:~\E# @ 4O �sw4Lv`Cl33y0�"q} D"M`4nOU A$B `B yw`Eb,�LMwfa*(.S ¾%I]HZ�IЂ*X$1zdw׃y ]׮H<.0 S,o:Zv[޽;A;v��-{gfq戴[I l � s{`!JYg{c/yJ('[vDq<>Q\_:Xua/*zf+<@f�gq.PT�N r'�#4(LbME9(+2bV7d Ku UҞ&Q!u dT t2;C9d@MWTK]DBB Ae�GxĚ� 0'*(\W\DƋY<9‹/Q?1Ě; \h/RJ-?@j"v`j~e#HL[ڽXoQdO0ٽ"g$A 2KZl&+B1O}PEKTgb*K}ʼ<RgTjؓ8@1h3ڹiأqi؛L(X3�~PKE"6GMHKJUɴ?iR+mw@2S*8d59_(~ <jr D]%�&md1b.:|>溂CxkbǷ ^`*$c_x-ZIkej r@dޥX=b=|H4| E0YB%-1 ((pj bD䬅l,RɗǥJ~)>\O}ח~ebz3I(�X2]x,bVX;]l[ݠxMd*< j@%*q&T i"#[TH<ƚ. ͊o"X~U9jm s rgJ<fTF!=ad ➉HBU_r T)UynQ=[ųrZ cFA'VHd@n'{QQ+4Wc9.@lN" iI-b>OkphLf,ʷ^rF_,sS�!GOO8M)2K)KH_XB@8c^$-!Ij˃P)@ nX* 4:V0�&308@8@LNId2`b^H'胎|Z1;;@E�Kx7[w;lNWLz8@-h-ԭg.;[޽;A;v��!,>I>*N*Qy{ !G} {/$-\`vv|jd TaBH5h#D=.xf$-W`_ؤO%.[f4zOWrVi)0c^ Z;lU{6ei*NUa*OR3M^BOZڈcHy'p_B2Ղu/T"fq1oL d22�Słn^O1Q%"1K*fC* S$p|@@?NXPS8ʭ*g.Ko\%¦sʒ/e/% ׽HcŒjU4VGy8|[dQUɜJ(DC @v烱!S8d.Q JC8hedQuHU^ DE0عzQ! @ Ae&AB DmHkcvv;u IuR"iݻ4رczT8@ zB8@@"I @ HW,gnuw#w)ӗ~6 㺁ޮ!HZbdVOI}RHKtU%*+U]ӁC 4Kl;.k "TeTϤQe)i"%x֋xv(2aBXnD* ~"EMO{$I+e`ɽe^p:1p!˔ {DY @#}/JKLk%Lml]:3"eHZэ{+n_IճձqwZ>(n=puY; u%-m_Mݩp RG/jKV=,k,i!�' jֱc @-I aB HZ*qV q a@ DZSQڽ{7v @ |Z%iر@ `||]GIZP0A?OMX=U+,aU-rUb1h;טj IprxEU-rUփ @ @ -qo9Y7<(s0iV_Nڍ,|x }ٙ ĄJb0--\'rvD  JN0a=;VUmiJi^Gm Rg]i,j(ϝV>Ջjj¥Sм®oX&-ڂXZ,ZFLLV7 g8Z2ULdsKV 1ʤ%ez="ڍ:Bm ȪZP<ӎ?{UZƠUR;CO˄\SǨ{>g-k=\"~Zu4&ˡ+LfK:Y^n; Vd3Lj<5|dtii5i젦JJBڍV -'HfмJpyJXaL<\ԞU7ZY݃E}~Y*VC6JI?Wk -vg2;*_=uEK%kŤbka"]HZ~jz@ [?%-@HZ TI'b|| +}}M;sOX?cdr@s}[=q~�Ճ fcǎbb5j% ԷϱlNjsRHKV tZlW,S}5`sRՃ @ @ -9`x\tg6YҢr3\LT>y}#y52AIK҃1jݖW`G|}^<usĚYs/$o>nR`s>liݚ)y۪8U:y<J&W"I˺deM=;XGsV{Pi54sMeoW@3rIUͭ7K9hǴҊjyҚ#@`I W Ew`,DM"㊰2ŇvآnPl觚{>}>хx ٲ kn9^.ɲ5+/G+y=c55sUuF̛SoUS|BZ.d+[ӛBMy빴O0>w]sGUy}y+@!M]\ջ m^ u2[Qfv{bs1@ j$-@ i!@ $-@ |zpvvk>X*kZ91G[xyN,Nݱc29@ 9I8?07m@=xڽ{7v @ |Z%iܹҚ +XU�9\URV"R.@Sg}'ŞsUVʛ~%0|*:S-@R옴(me37qZ91}t{R$RVfh^D-Hkd|TQrwV736v[s";BTȺ+^B $(68dǁ*hBjD+9jȾieIc:tp-b0T5<}-8?4E%YG禒ϼMπD$l:gJ<TfrPEJ\nTcPjc]l`fNT,h-n''-&Q,pX}l4z&H+()>Էci+ԛa"~W*sQrP-As&p9I 濰oYZˊ{w~:LI> c`iRO=UDZlgk&5mG2mă#H |qއHҘZZU+M3Q+<6&wD+sL5 rJ#\ő!э2)?Fl'*@,mJA;=griRcboDAmX ˳ƒRjqV[,/UR J\eAٕɬXq-.)}7Ht0"ȵE-ҋ(^*Aٚ9Hd9:nŮn8;}X;v-Lb.E:dUcԊ1!o厏7]k+mԷBbЉm_iWr3sV{pIMY~w~λo厦+z<5 l̐"x0| B -VoZ{76MB/)"7Ϻϐat@S`#_<ɖr<X#vGҁLy.7|][ޚZ%GQT]. (0v's+m A޲ux ܯLe"=YҾݬb~YT.&*ZbrnA#n"66"'Uń,(\>5wfzUM\\H#d/\Ag.#,g&,Oe҄#R 5깋e2\\NoՀI^ 0XAџ<HvOlLVy}L>zsx35ςvCېRfX;rmZ*tx/i 3<e[D.[9gA6,@Jcp Ɓ0Lx.(k Y֑F.Wi&+¬ 嶒Ӱ7۝F*_n(GdG("QoRi\Ǽs<|%fK/i{#K7#f^h2`.4UPMҤ4{7kd!Q> ʁ^wF0`tRV1(jf@jpGvb|K+KɷLZbAڝ_i)Ϋ:Yx^Ī\GX9|EzUѪ7h-5Ӂ4 BԲ@V|qa =eNL59<! :қ#_sd]~6zڢ/-M_ ;<\-a|%fv�vPb*MW< dUǙEʊ\$$sm4ȢH9Y iUذsUcJZz̤0x64hiOX8-\V*fmA3util HOfԬaKʌC3eaٹ:n]q'rV ܽ $`1[ݴ' UFb=1sԿErECQ+']ut{&9(-3UU21KTo9J UPgf7C+N$M+ikJE@-_ J|EϺf܆=b%]|ZA-R{RxnRUQ1wmr"dȤ(> s?@NꉗMWezqܫC}OAq:<7fvU98~^Rb|ӲzLRym*fQjtlv;AuT(V' ,I/rW]9"?vo޺.8"AU5mH|jxV%& 2CP0�u@hX{[2{2Uͽ@Cڹ$y!]seWLj7jIu8jSrPYj Ee#dJi7ԓM^ODW  3tZQ2͊w#hF h2&4MG>m RZI0m=KIZ%Olnn3$7a��辥�{vg,1 '䵒%ZE+}CY [0囷,.oiͪCz~7}@zQG7.{d%m~zrr:y6FDeItr+kfE�� �IDAT5%-8i.  QqeHUl!]ij*䪮A|( Q3 !:6]C;zo>WIHmW#%e@#Zn$\J6k$bM<=iUsD4K_Yd"ֲg`q&QmګJ+tP$Di؛Tr-1M{R`%SA{<:wZ<$-Tq9uHBIUN9,snx2aJKzz>i}e\ v- ٭,!ձko��Ӎ#%a�vDBu}H$[&ښWr G$j X\v^j5!(3SRsA4Hgf=BTCsFz7UEB58!]3i.%-CC>Ks \ 鳋X%8:OW6usHZeg+T<8tCh 0?�D<Ag־%|4»c]*M13~iwZjʘsjɫH_sۄYqYIPɡ#OiYO&37@&0#�13!"`4HV{od|/Dˬ|+&9 w E@/ 1Xaڰ+Z6~iU-Se`s.^ѨJCn#Y+u/0ZW<^} 1*ЉgM](&5z!ßZ66> 0  @:]eAކC|}T˩z4xF*-}nA9UM\z> l5ZWۖЭ?6ݮBh"L@)4Xgg,hZVQ٪!.$-[„$ퟸ QoRd{  �`c �8Ú{;0M3v!izeV@ Iy/ʂ7U wpv!A%(bbxuwZ}/?YZiS?!-7]I^ھK 7.lbA$L |¨#ê$IeƼ!sH&ZsrU  붦$w;6(ɾ8UeUOuJ+Mo#B/IC)*'-e##X$˴<G<&tU`W&RWM*kE8!݁j琭Yzڶә,?3IkyQN(ʄƠ8 a, Q-V4y:''ovP7EaGzj&˙ZDXI_. 9-�h�4(=a�ꚶQ \q2i?6F 2R3$0rV|Z)` mcGF1]0E%2%-|cnj+ 6 e/; `$(٪fοhRj8xjd|+qWDR!VY٣YTgK] A j# e g==a%m݌TYfpѼ%Su[l⎴|ΣC|-x *Py0_s*[ eh|Hjt('sߜhSM%͐QE1)C7JT?bJy%*YJ+hs^TC|^Eocc-79g08\l("e<2]+{0 R\(bKC)jBKí a}d |ȺpKQI3<JYoPi5^[;e'$HSĆ'�=RR2le1iX˻DR%dI?Ku9ȸ f%[%r1[^2/z|gnT0CҲ~z柘0ORwRUqɉfJLVB$VRvs IkyL [:7pm5=jX:cL*w|k.ɾFZNoA_PzE"M;mE8>$SO&N|&8]bǪ|ZZ,_J!\]$%jr5v-k@mfq+|&4ͬ9Imi&Fn-5fMf,8M}k!xϋevTX҆Y%=?ݝ2ffDLVPV^Oѹ X"Izfu{RQ ;IEɩZ)i!`ɤ銲,4(+29حy!7mM"Q`_}mŒzr\DZ)nuHK'ѡ<rXs8qګE"]K[U%W6p_K o&<UjǚXe# IVdxl$!P x+{C8F(K Oyjg9N uN`)[g.!ZtG-Hk,R%+Ooey(uk)Ptj #m\ۦf>9of5S{Ϥj6ők, #MX TcHc$m?Z,jVל(1=iثՑHo 39z3ߦӪ]I[gK@KiՊo*(L3iOQ5ErΧv(?ҳZdYZ PM0._U!%F,yYy| chMrhW%˱rR!Y\z, @fDeETo%:yVY:7`XwsՉAC$>s2B͵.槓j^J{FH:?paDUQ<JLi.8R@/.6Ƭ4lmx}&>jͶcNLƄD;)4]')}:B+HFUf=Ǚr(xr frVkRÐZ 5iΤFQ3`d vdcI-sw"i^G?rfG&T#p>fqf5w$|OU1pB(LØ`t2:cCE I҅)(Szqh.Co9K qri16eEfRt>Cuc*�Nijj{%F̙ON.D.|zΠtk /Vʶ,nxKhhϪ 56+U\b0,˧'$˫A rh@~a ̩z7AZԕ XH VW6’VigzLlx]"gX`%ͩ97D9j&wZ3uc9g}&2QOHw$Gr4sTҷКzب,g)\ u~I*.jٝVH)>P_Ȅ8āF+d,Hlta2d:-/-V9TrNw鱽=R-VUD+fEzRf>2Toa?#Nvwj#EG KAOB>|*z -jQlJY73rD1uCKCѴBR̤ #.ieIrz j7l}-&.Ƕe/^" PPK!/RY\̤KXLjwd< uCUf Ӓ;|$M7|QnŀA8LI4!�y$̷%E⡊#T"Uw/타RmX? Bٙd* ݉L$$ =o9*i2djjxJ2WCğV_Ahq@Ւ1s\^C&Nmj:�B: w CW%< GȊ&:c~nNZZXVYiS79UdOly9\4.!25Ff;lCS/ML^)aCvgb27.9ґEJ}W19έIH^(tP(dمIlqR[x&99Еі⤅Iʤ bCp/YwWa)lGEACT=O Ф!+OBՏ٫ dqSL5*(Ը޵ƪzbCP"#-!}N=%S4P" ( L&ETCeq!R[a'UlQIڳ@Huŧ))V/i2΍.H&kޥXU7ᛄAB}J^YchE7d8SxuOl߳eio'$˲2& M�r43,Vϝ4J %3IyI( m|TD69"יV'NȞq/ϋYu+jCs�u07(/Rrx*8*7LO(l7$STq|7IR Ͼr(kGʻDZ"iy�TR|Z&`,ʘ(1ݭVhϖA6YQT,MT#6B^k(GކSTPszU=&Y.4%嶋kZ _ÅA6VsA 8f)͍RC%e20LD3ۯ)#QؔƗ*ʄEŌLK?("=ZkƩ鍼.RMSТ73 \n3ZޒDU#cDx OB22)w7C^V$ ̧[OY|r9#L==!=ix7u#װDm׊ʉ厡؏=Z]4cSZ(bAL7&'g!Y[I*kҒn2 ;?:鐪H}(O`d7$6*& Pb�٥4b(L^(T,`u? ;!]ax5Ki'XT;c^J )Ǡ>ql>=<#bPXȭ_5wg|AFJ}#:I ڀiME:+AHTf i._PL1*T&Z v7LgdXvT+ygjRo"3Q۳Ӫ〙$[]3LPPGrŹ6j"o] "$&pT-TqO ZHdt+'#n2>L4Hd @TiO/7W_m; #"1?rRR9e\ʠy|KD*iWeX_$IKM;/cRhCi!lsŦ%LY6(i,R>Qx"heфImU0үSW$O?^횳 $j6R,Y2{۱dSlB)!(�ŝϚs-$-2Dzh9Ig>+?TFdHZ%vs4<1.D7Y9MGi@ݤ,MH*zw7Q9&IB:$Iʶ]F 4jF%\AV8U`vjpAj'_d ]ZJ'(! k+6³Jfhj*I4.ةh$&[%]w9OccB!aj" RLC̗'!E/lB;ɘ03iˁ+*>+f6H'.Fe=:I.ղrbM'xA;'Y C& kINDf Evqpc,HZazLs.̚* f$eXl;P7I5Z˭TƩ@b&=IIBjp$$R9b'{5Œ M5Ei�+]bqI`XkVqGF  H)Y|iܾ\e.Qɀ=&PAT&n|8+x;"QİW*ꏓ|mȳ$'m[ r�hWpfqtKSv9U>Ʌ8$4`ZPjA_F`i5hqf64UqHYڼP&&m1VH[I)ZK"-/IFPR]gl"+gJ|@}mcf 1U| \$7$Fƈ;`g:w ND4M'?KTF-:PCHFHJPO8%Ks1ͫj0^黭cJMEad!DM h#sۀ6hL8?hMRgWe nTNi8 QA6 GdV$T.(Y8B6c7iG6)%L"bLޥ@nVQ!:_ﳠ4Fb8aۙlU5DTEJ,M8eiڙRޢ-74)QR 9+PvH !8jr8C ,Z8&KaaSHr& /(݋̸NTv½WdkBY#.2=Lr#2i:6Ih#TLd U*I*MYP=xbX8UDAAdaH[dAHq ߭ YkJs;!9P>G,"{#e8ؖS2!Pճ2pIS&CW {Ң첂Ж%\P{vwe Y+pBQ!KVJ@MBoh- %R XۥҒm$eڒ,I8(擼libL.j#"rB]\ʫJy*N\4IZa@9A &4kR{Z $OOhI>Ta_I3W[D+:o'u-]_,N"TKP{|C-ԃ&whO[D8sEpu)S;1N}JHKSa4;0NBD"Q`[#3ͤdPĶռGRxB4fGqT-U0*[Jw<ۮtRdn[$ŰTIz"(HCÖu_ï޳tT:" T $G$Z$V#iԮBAfO FջɢBf?ؒNTE4}*$29RZ{+WݮeBebbǾvFiǦ-plGe%RU +x жqWw Kث|2-2p됬!Uf4meG"%IȠ u&-iHgQyUŽ\b:QsAnT43Hi%?i'/k!2ʼ(' b,*{@ FqlTMo_Dj"6U;EPT͆)7VK TyiϞI<O|[y|6-%+44~ZNM"o1Ғ$&)9l,C,BD' YCN r ,&)dB֠7ڽX(EUQ ^vEu]SgS94qnfE9OxSJLq"<q6$7iG_2[TFA +9C`uxYP㲓�c!7r)aj;o 'l"eOHRm(%&D(WdnHfa[&RJ4Ke&UZm(^+!QQQvX"H JB/W^tNVOX{t.hkf&#">K^^H+MH26&Qļvd~0C[0CP KZ3ZvK5d/).h}evOVi&$:$H˞=J;i[@s+Y&Kf!0l2(hYxh Bw 9 *Y*K뽻ԭeZ0ue5o*`Ehi]=LaMqcR$[7p bBa醫2(H1v>�� �IDATp;%meE=CݙuՃS@#.M!]:jU+o,E¹eSETz8reCeq}ȃ]9 "fUO[U`r^TIƁDjBU!#$YB`2E1e 7~A)%*xՁ\d te@�=ln夵2RCJ 4cM 5sK/H*hc z %6{6Kl]HBĄ^/.۲r+ZŨsP. V/*M/٭d(m XA m!q2S IeU "bu!6@):êOԉi7AggB!]| 6yH굀 ǿUUY1U]1+7aAgIKI-Q DRYbd|/KLQ>dNz32yw)zۖ?'JP%<v%%596T AQE}[j3/ v BesIb--qe8# "D)8'\$6"XiU F%8W TJ 4vƫ_i:O=}5q]$( #PuNJ";ܖh@�xv $vN^r$,0$:'䞨TÀsܬnA!TcVYJ R[MF:59Dz}/)H JM.?jv .e~v_D %j9D.Kx*)dэ` 7OL>xƤ;*-iXl&HƉVUSdY1(OQՉ,D$G.![`27&5פi,@e\dJ-iif}^NDbl*du=b3Tcl2''^!ԜLPSd'tҋ!PN{]eW;a+sV'!"!tv^Ҭ%abFQ I  >hH[N15:aT탰9+c"%qe:,sjDZd**4N=S(}Êeu¹ +3REBHB1dB$ s8*x8WDS0dpw\paY:oA9,UNv*gʉVQ^1wKLT`0}#;-o_hPUR_JJD_C\ "BD$}0 h}ڂ<WI{!-?E󇈙.aڑظO'kiI^e]\\TҤph<)xu`"b,OwIQ3Q=q770E̤Ì4B]A8]MHTp`ɠ3xH Af^TATG]ݛ'pU">ET1, 07Lb/کcȰ'!I1tXT; r eYA؜T,�ƞ|#iHɛ8CHueo$:Zl6RSATTL"KST8TR.TO Ȕ~ !tv.E#F3K􍯠6$i fw=)s $fG\!$\$ X=P1#äĻIvHl՜Oe/9QLLےWciMvsy/YXU ӉKXNz'~M&jv7V"3UH!i3q2*kze1.wIv#޾i2I 1 !)c+O[2R$ 5`u!585i/!d8" ,㤘̦ juMZUbYrXj998h\ċ0Uo.Kw<kKLbަ4.g\07sl" eb^pAĬ"k jU1I#uv1 =+G!puLO0A ˄NL]ŝb/XM/[YhF!.YAJj-&fj0 TT!>5ΉU Ȝ%m.R o$.Ϊ'WQq F I^&iIH )`һ+p4[zaHAfS`KpijmW`Y*LKŭR(UjIUe! JL3TM4@F-JsJkNQHdREI B'ʼnD34vݤv_++5dg4DEHcT]�^M|?8vXzgV| I?Dqɤϡ <fw -JZ7q0~% BЪTdC* sأ4'91::rBeJrzAQbC׺kf?|O#$r7ډJnb"^"aSVz ! K۲p,pIdfK"@U>Q ]qNZ \HrIrET]H<-C%'Q[E-1K 1hȄl 62Ӌdڜфelm"Ѫ4=Y;!nk!_,LP`Nz dj'�rPEDh^E`_K1H)V8U7ʧ}ew0.`FG¼0Ug6! @6/{_f}cX :@2FČz G$SGz=JvR U.@TM"[D8L3X>`D:K""`OICAP8qr4�<$}F36&6"e`|so& iS{R]=KÙ$fb6IZ $aD̃ޛ/PT4 Ь�֫mV|i;!a;VgScCu{,0N"x9?bi#<iB(ȅ [0=ZeB~AY-7RWE%Sm7r/âf~ʜ*Ymn4gMa83MUӤdFZ>͘rz-GM&Ӡ@BU( ҤxgXݣdY(k˄ l|¨2I}$>AQ\npwbhQI$�ǜ#d(E*�mGPP̧ԑ6Huz٤eECއ"nJ+`HaW<Md&$ze\:TDJ?$i;>�]OZ:&R/`rPϩ݈C18|U\$pB a7B2HOI8 'xQsw,+lOVB8yv!ɤ7|T!yGʼn'q�M?*;>%,'{0VNo'59S,QF' I :Ex]F2#ղ>Mjg0͆Apw6#&~h ŒɔYNNd~5ALDX[9+QkƪZVC ="_On3iHҸJ!ӄ`0Wss`7s)o,XaFN&Z>iTKa4hP"8]-_Tr?'Q-Ce,X+RvCcX&sG'i#,˰ h;UE#$jHjLFc%cI2D," ({C�0/0|HRa�ֈ,.zf9hw^X2555q`40X9PǨ ITi7!&G?$P\w .G||#m{klТ ^=莽c:MiK⹌$\jfHJҹcډ)"ZsX+-czKr*k�F8|~9byA.q]nq嬛$?uݎ.*$ J?kw f¥4/LiRGIKԱ-M])́ AƬүTycq1da斋WbIwU}ˌza4썼Y6js6>dD*\/Q~be];zB(3m'ȑ Ie hʠPb+He_6$uJ60a|ln'iҔiT~iXbQe_L qڼ61fK)7.:*&Ep"Zv2|[u;cr<gp>k�q0HXo&(jR>%/K#< C!hWVSJ 1H)RcfQJYOZe)iDL[pb.m$ͨPu`#h"nXK).ylɈo1LmAj_k1_QC0$Ċ VȆm'$0 |Ƀ1 WTGq\|"`7 UD\,4߱|tLyϴH2$=g5Wk*{MH%w|RS"DL, $NI]ɈAm>s.MQ6;Ccʔ TFv+eJc2>zET zdQkJ�Q q$Uch ^LBeSZ\ixVT38RpexIĭ/Q8ZpID=.G; X#RQ^!%y9"�x׉viG!m!^T,".YXs/&.}ҟ YTTGi<{,y0YDXRxxzwn&2w rJtԆBU9W[EϞ|~[Ff"cUl7ƉO(23BvOKΠlv{MȼHȀwܫ&ze2j=˨eM꒽bXga:l13Љc 0)cO p(}eF4`L�N:&jsι2F0s=V^ǟ#bV'҈5&EUHfƋ"K0lܯZuJ t(|8C, ww9% nuάw wD s=_5[Y :h~>L&t4#gAvJ6X1/Lm'W0iL CxĆPCA4`,Gާ f񖧝<&iUd! ѡ@ XIfv0 bդ 9[i)A8u4JsL'ӘVxsxorzb.?8<Rt|K~HVnRS^pycyڧ$w4:Vb25qϺ~-|ma[kYPPzyG)Vh&{6Bӱh)T[3$`9;s\ {~>xsx0ڧѱ�u Mb Yo-.ȩMgTUj#)~T*\3dTvh>g HgeVHCbIzGZgjіM,И:0F91Ƅ{tf\ɍZ҃?_9ۍ9;r$ЖZ/&Ij"B%a( ζ71%b+=pԮļ $P*S(~pm݊3':'' Ro^O8~Ek(!)a,Ikv[q!2 >RC)p5m>K JS]YMi"1풍[uZg[Xsz<y ӊGty;(F4s\M nMcC+26r|GqQ$Cx.~Sx+(?މk5kÑ`c{Op`}f؎ 2XE@R2Y9TV7aeW�]֪n~}Lbͯ`,ĝlFb� T 乎}.JDC=Z8SȂ9T@otN`FkH~gPiyQ7UDYFυN&Mw tOh DRXۚkZe-եi1Z6ng2ٗ6ж{*n_W`'&Op-#[Ggn=LTtF*\e ־6`Me\$ks _u]4X)ƜVg&r qZqgs0M\$yҷ+7H.(sL%;W\84kE&kp =Nd=zO561|l6yktV7R` )$ b'aQUZFnz <Cch7[F1<x9ReʐGXP�r V0aH,EIjE ASMXlR,S<|/WS 3tlvhp nL;hʼ=Tۨ{vPa|6еTu u(_IBy (,eG:l0Ni`R92M=di;  @"@Т^[ k߅/j/kq*n۹bsp~��kP9}:r 75Un*df{5y2:'N3k^npvO,MQhmݍHʫj6 N,n}m[pI#bS!ѰscYC,B^9 =ydz{kfs _ _Q,:RFd"鬭0ۚx"OYF֤P^F[ήrJˍ.Ǐq$Hm6i5"xVdGgu|Gf0ll-ؓb_ z^CW,wACnw0EN Fj=q3D 4y<0C#?h^Le>=TaƁ b1[_HQY]Wom' YQZBa[)vk`]}^˞zܧW=7 Ip_Y"'.*Ј+x?0HCݪ:\ K<z\tH 6Ow(�~)58kO-ئ{>:p9c\;AxHd6x/)\?5YaMx0gs/4Ar^w9Z7 6Z!aJPWNaF_(E C-/a +Lil$HEp((9kpcs`Xف`]9�X3*@sH>dBGa­C%,bȁ3!|9+#4%ȡؚ& œ},[Y;~^wxnՏe q˅V?gv{Ѯ%BL[3{&΅cAZK`e>Vr&1]+6Œ{Uʝ$O( xoˮKopIԥp#2Jط|L C,ǘX=w�JLX9T٪x6+HE@hYg` Foi-2!g݌5w%om5YS,\J{@尭= o #S+tkyU щ.4 :x]b700 \eP<} rx(^}#ań26Huì3GHAZg7a.}n`|\NApbiM+LF}:.OlXQ4R|'Loݴ?_qmUfR)}#�� �IDATmfYS`!GBYU]<c6d<C{4ߺYΖmef6ޭi~Dz7z[B[X+]Mn=8uYÑZϟ_Z_WKMm\gnٸ6en\ceVPd$M<j#UYFɏ2!հݞK<эHkv +( 3 E;d; Iȗ>cZEUIIb*!x7HK`v4%G HWP7=Z?,oFRy4 tK=56u7pmo7 ZϤep7&O \0txbZ#V欯Q}pr#ގw| Knvec« 1k=WiuY_GYs[R *I*(L2pZI.Nk5VZYp*+,/YSUGֵ6g)LeRpaU,@wK>}ubv}꽑oFnG ,ި"Bĉ,Q=r"r#OpiSyEϲ#͹^R4P ~SDUE,+AVNNNmzgN2#FWʝҍʉB W(>D|s*w/cU>|}+/or!gw"&8}rw,wru*'TNNTN|~)W\yr*'ʯrN>+FE>;[=;9W8ɩɵ<=۷r9ձ] NOT>wr;O՗Yي\|"cS}+DnNVd(/1ڍЫe!ހS{w(:'7dW]kI,N]-p@Wbi1osfyacV:+ie.AگI^wzpVhN�T5*\ڒc Af_T`BsMvl{ҏQp?jJ<e2?#;J@;BUǧ :mDZ؀x3lb{Qkbk,Vֶۤ̍Żev#[A\z+m 6[.68qי:]2MKX*[QG GO.~_UnI:`QF6L]yzG Sy/ru*wH$,t;+'Wr)"r1Nok#oe!JTN6"ӁDn/\[!߷r)X_Dn>}fNdU;WrN>AZ>노7rL~jX~/Pů3ydq'"r+'"Z*[~#_/S9YhLVr6ƕ<'ru ;9_g|s#ǃ\it*'rO<_Dz+Uɉ܊[99ȱ\1ki^WآF=]{" ^f2@kk +wm~CUԁG9Uuz.?cuOK|0z(Hy7uɷ=ocb~c?5_` XZAdqUZ9q+Y&F~r; BA"EqC1JeA?x{*L,g[R,ء %"'Uj@[74U|.ra{,c@}AbMpY&Q:ҸKqZ Ia׵Fj+4 p˖qY>�Կ٥P>DI4˺,"'7ĈUB/Oz|>0Zv$p�{ k#3hU _d![ŋɊ,LiIA-�bzCKH+d͖S0znk~`%1Dvy0K&+'aR5SM3gޒ9MJq/�38sDKƘ׎@Gr6TvD�0vĀP"Ssgp` L7x HtWt0 }6X: ԃ˵C#ld`;%[1ovGr]Zz;+[0w_WkewHɭ}ŖAJ1[@h) KOmog WCs{ pez?~)'rIEeQ$g ԅ}d FȩY@͏՟LDS<+ΉHK݊[/^t)W q/_J;aoENvy#wokն rݯokyz#ڑ҃.Tx-Ooq\;坶.|,r9{&ѓJr;?_ȯ\|B{*Nk,_|!?9;=r,D翋r'r>;9>䝶NSȷթ\b0=-(nYRu tDPYGҵ@S.+JEC;Xho vOkXukC7{ עsEKeh-W]Ǜ/N廕Y%H]}M_5K#˝ذSҮ5( g!P1l<Ib%C,G۱-E!;ԎE2$IBsӎ=S= BUKL-Ѝܠ/"BWD Ȯ\ǣ2MBjdzWېE1YV춹n?@Okgu^"Вf>7N(^J}6s+cL}2� њ/7L,J+\² L�CWQjXL�E 5 *Do\BZ ֏Ѿ PH.l !U V;*<,I+%ap<`XQ7ҁy[j3azFƁz6Ҋ>w>h^ tFjms|cw)~P±)TZi>Xy4Bʠw J5,R3r п8IES/ XHM=l F *:5d2<GãF "I<N{ a2X<MF*EѝzX K &i5uhTPZ16k  nۋ$AkOa߀-qk'%v_'fW]J 7Ddk(*K(LCYEXa(XD},VL{Fd\x.x0lѕpctǀ[o*e t(⑌F,)MgA-@HLMSZ�wQeeuAā[2!S2 /,hf4SnmtP:dH~h1d\ssn֫0C2l$<a6{ 'S4n0"rW{lpA# r" JE!^᭎T;>L,THxNaN�*XP&y@i`Qk,n N֧Ϋ,.Z{dA2L]KJ!̹ћtmDk4'/9<BaY-+hvmT{+ԙϏȅ" Wbғy!&F᪋, \{Ed†wQJǴ䛣4<Q<cA"âE p3DP6J)8f~G F�+\5.2#Hƒ~㪶cvs҉ !6iSOo[ [Zw<= 5>g<jja>F !vluFIJP@eʃ <Z8RTOdHQcD' cC::xSlD=ЍQ%A v<΍'&[>0,f \GnpC͜3s\¸k-.vہɊ>Ԧ42_TN~vAZ2rU$3*[l,> {q- ٟzT Z(A})< "[ 3 >yfQAGYU& R9#9ZS9/68&!Y( kcQ["e=͛mh\GخȬUjT/0e ka[Bc>z|u)0~Xg0O?ǵ8%TݮeʰO,g~iX:+"C ;7Јs$ vʌy?b&ݮp;tX1XR<>B,�*B1\P`@8VH DvbZЎf$j߉dY C2B _3}Kns+FNܖ1X!g/^ΨYt#br\OKt@F�~ۧ `kG#Pe4 #'@rS9y*7d+?ʿcp"V.a\R,Dܽ(S9E>?9~ ,DDsRRץ9'3yF>;gÖߏʧȇ7rw,w?˓D|DG'OK.kyN>U\7rz'_osy>ĬN#Qy׏ɻKz#wBܿ-fqɷɻG[|\/XDS9Q7u$soe\'_9y2{!߽6݄'7RKnĐ2X9 ? z/E۔t&s�gzbPui3.1 "G"4`1,Hmj;~3%AaӕRӯ-5^0^Z mQ'znw9k"дxg"xj@X`fV(#ӌ�bp.w(FO̓%I,2 ןCqo->})%Z1nUͨ( H^d,!@B *zKغBoRC+}UFa%&\ﶭr@^e-[.G7Rۍ֚ 6q!6ymO\3M B[**I[K0a!|W}q#^\Y_jVnnNaL<J|Lz%z]xRD+Lv1w9 qV qoSQ% l5JT|ڕ\Ut-O)O|Y}>z?~xXg\C~T'B[9N[J ?_*z'"ȭ-y~z~zʧpx "?%[#[QhK˯۟\kBqw\}q!j~%FˉD_ɷ%2Ml|?pMо:I"F zK Y>LuJ~=jLAȽ́poSG52^�>2?`5Y5W஽=|W͑ -.咖׵^q(UeL-#(.ц1|-4ZRA4υ^$,:z̅`ͻ~$lN Q{*%(To]>jSV*rVQ~' wn;[d%.x$AUnZ%Gz!G f;H6Ho^}?Ak"l\0=]`ҬKa.;ْ T{* 1eW$D4D ʃR@+Ws(*Ou/BP?tXpT ]<>7*AuG¶�{6 [:]+�} ) 0Bɖy C YDߩ¤QĄ|G+WNRﵡA0DM!= p %k' Rj<5_7=YqjUâP77p,ИaFUSnxPa�䎁Fd@>H 9P}VA&*u&# whù7n<fTiZe|LX6[^"U?4(e[V8tk竫dTY{})0}Ff.n+jGs;�u:1c>6pe/<ď.c愋^_YN[T^'&BLr .h) ٚLQĸ.@f=YO >P�&4ΆA8E!{}<N 7׷\=[QFQD=Hu o8"!%%k w zqׅ\(gv:ƙnw@ycը݇/̮ Zn>۲ޘ[܈YHf~]BC߹Yb %yv�)M< 4&+�xk\b9$Y17rt*$�@".U4Es( [ 'E)t�H`3b'p&?X81,7b[v֗"[pdήR$E*QYڰ|T8psܗxnͭYi=M^mY+}7&c`?OC*z5yNg%#RӺ@yE+D$Ǵc?vcfilBÆ:B pMJӇiу3p4 zL?8<6phfnC Wa154I:̍/,)RmBLa&x{k_$ƘU`nUߤ.oV/bLzQ#&ܑCz.2%}-bTlxr,4':7JxH $yp %  18 a6Z'.=*zJ(tKqɱkj8gBy/I iAb:d )|6f0?C+Vay\ؾ%1L3Akݻ?Ʋ;hx*fԖU̯�`"/o}룱_f8nNs?L{d:b`ԃ“Vȡ̓?á 0QeA`*A`ާ@R*ab\%pU3!Odc^AUT6q2-y6B,#b&_wBTjeXH3NP[ˮ~CN sB#[T4_)8+#p4 MД#ZJDk0??B7>F A>@w+"ł<gªX*bA>*<^,Ph4]PUd}&rG*Z}0G[THʼ]LW 'UIJIa;f:g]}2έ OӞ%0IJ6 ]9~W*.H[}2I+Zy\[aľZP6|c9tQXk3Azf,B}^me`~/v` C֑iJU^8b(cѐr1T[h3$+ÀkdlzsնDV'.ZO)6�� �IDAThFiba'4m7nJ>&}lN81@Z\X>gCr0!3;a3%[ϙ."Yv"*%~(J+,|W` 0¹cyҌ =A 6 '9ą% @#gɄ>"+DŽ9S!b{PG; l|Ջul?cw(PiR۸q9|=2'$[%)>P҃IZ[Þ$ƟuE3 x6xGq^X$iY B<Y b�fCBعeS%I2ÉEDh&!n޸~8%Q;FMG1E#RY/zWܺ;eZuf*[.}'dl񇳂X_CvV�dm~0= HH/z iDj&۞'-<cE0<I%CܮFn8٘d|zcܽZ tUU73ˏo9~&͵<Tr FDo>xw-O WCG?<z,"TIW\SY|/|q%"|z,wKD{'Ϳ.Dtw\>/OWuU|%"'rg~"zɻ?w;V~o8Y|_cy&y&T~Jj!WFȱB?t8[9,/& 3DnO FnSX|\c=<ys[͖n^Om]zrk;#WlY4npAzB7{y++4\[m7(;@Ӳ_U7=M'3[+\'nksl\`EBnJV&a3!ڤ eD8ep2PY�SɅadh &<Y#AS\Gx dzdӲOi3be#s#xJUA.M9\ޒ3pb<gvi9RYPnoQa*g[z{ȧbw-[m6cč87�;2S/aV5_\> kQ0S`(hmyQQ &0)cx'ox֑Qzp&11D¶C_ZLxY fRMB{byC-vи;fhcC"lvܺᑝfVc<DS~tX\V{rk=n~D%_Z^kטvlu\ 5 XoxQjhT a%<4 <VƁRk`;(Ќjhe L,|ދ3ڡ]}.b -Q@@o8CWlWUtP rv53NaBy _JAs9LC)`T,|ݣCkvPvU2areKƆ7`ao_(d|[?w6Aov+V5f[Ymc!UXȤNQ5Z/B .PŔl"v Kɕl!?xU({/A1ҌPa?\BpXxAaK7<}L\fbre( &-t]!=Vv-蜲Isɵfwa"`yn ʹYr;_?mr} [˻4Sǔ%Q=.(c F}9Q"2X8ŅJ֎x`䈧vy|J9b:J 7I`_)ȆR`%Iu2~/ElB+gGSE^7#~R*}; R )PGofL*k?kѻ+][>&Ya&H.+-[6l,a|`S뢾E=Wt׹RyfkscB3Ka�FV@Ba+8sOKd&P9W!5F$z($cxDiQ4Q08ߓ!O@gd GMǙؔQCA0S78cGOlaHރƮrpo-(⒥cBglq+$k&}k҃no@hNrN7wsNS a-m(�kMs+k(Ja ~Ci$ZLtT=PX(t+2s 0ާTI-S@X׀qpĀ"z`ܡ�QF sNJ9 3DZd9,Iз8[y;TsV"WþU~%-G6h6ʋ1OHqҷ^cQYZ]>1Yƙx6ǭw4-oǏҌgI3l2zхnp&S=Ew[`ɼmg^F(6 Bڝ`98� J:9rp,ؑV1 �Z~ n!Dc8Bd>v~ {*z$aOLo[uɑAP'6X؈IJPMKض,89>+h8*X~mzaܼqƶ+x‡~:S0EA!6 _ulKգSJYuLj-]bÈjOB0Ʊ#(H4-8eu&8#K;R4j-tl@SJ1 >5_QSp!-5{V" q4X8&,x, B3PG Ŧf%ؖ@Bq[l\uS47Uj)--nhܡVgb/lrBb|%Ɠ6lNHOw-O&7A/\ix ]5VJNxcK~�עlDUM[G=tsDIő P8TE@AE,x AGtze;2Y2O}x)Z&*B6o "r3w˂C3@[%$>/yr, ڛ#ձHaZ3!,dD2t{h=ɤǏ WT,B 1µmvkfV5n0 T 0` 4 _ne=Lex fZA"Z*)As� geHDÌqf(C/ j5!1Ey*Å�#q\&$VߢB-(S"jt\;MOlT}jIsF^##lxV45U Z:li+9)fԛI3nP{tK^MPy/SFS /\RIAyag%\V72E$vsBq7Kz-Yi` ' r*g`H?`%g'`Z @jrxK3A ƵHb{\$⒦,Wda'55T" r=/Uyj4ИF;m&EђoSnvJk.nWŤFOuD7خOQ#2z+E_uă>,ѬpCMP&!1l^pbqJ@J@FeŒbv) 4s>7 !RL\xrw&<~0eR*jΎZA-SJVur 0`(Xذ~(] 0+9inNj1V\*86˶tmjxK^zb07Ie\6YUU{a ZזG݀*6ֆ8CvC 9*'< 8J dYA�FX*� %?W|an't9 ǃ'duh<…3[2Д5 |dL�Q0�% Pa-+#FBW&\E\'4>鎸n]:zZ ;FDoϤ|m{bE,5Q8]j+zQL̀'I֑ J˴ Ąpw; rHYí !_xI0 o#a*9Ya0�X:VÑC Ⱥ<JVV,AHoTJL� o}! K;_\f $4F;kHEHAv=ԊԒ>P`I@郈of {o2d$swvaC;:ZifLF7}bi3ىC 3GyzUl̳/@XcOv̡/Q|)1jCHe>h_!$ET*_�ZAF| \0P*pwOc�`pl(hLV d/pnt^ [Ū *2 ímsŎp;"B74Z:zJ ckf)Ӏ@롐ܲS3_Ck?fBs{ՠǟ>iS_*h1-5Tj kB .Mg*@vyPpUj.+A{kBG.1drZ ->u|�wU^!C4qL-YJQ `猟ߧouj)wd}1ru‚O0j_eRwhE [<4S=ܼ[j87ۣ`85oj?u i|P?"=¹m["p*4?FGLMOoyѥƶFn`}lhDɐh0=9o-.9 E鸊莅{ !�'Tl@Ea_C)t &4@D=11E:n K0-�T-"KP#%<E-LgJgfE[ 9kho]o H{R*|h[]g M!o=ƭ6n'=4f})wTa$?4s2Ptk~xZdg; ^Jbkn#Q+f8wCTk oB@MُRFCA=Z6µ(hEAMv<j]0�n](|jE*WtQ*\/uE˝-;r\UƵ"2y*u7ٛ?{T.Gu]RGKP/4H`aS'nnf_aXuy 5\f؀d3yυr�E;.cpσ8(vu?PNU.YṚ:!7-淚.; H!="r )Y:̃S g1x1j m"!ys8qƹn!_{_0zo!Z.fovF]`:TVoWnk:ٌnֲH\BJ&#RJ՛5e^  ׷ޚD Yx[f$k9sD<mAZ,R  7*'X0DJ=N+_1r`1j2mF0XZ(T$2 Kd<]3YRg={a,8n5>>1~F^#$f[5{LZFTmnW˘ Z[|>֎3#[ћ'˷mދ6Xk.7  _ߤz807K9=%<1@HaҵB0\-"T <ʣ`8{VOܥ(`Ut?rvJ ~yT*A˜Nú t%Qsuɐlf!71dp<27&SdKqˆ'yHK}]h \,hл2tv ϭ&лd*U&r, ԅ;ʜJu8ƑUѴ;kR/?\(B?o; l8 Ə�12RB3a$jJcQ8CEA>i]Iz|8t Q̏x !ï4[6Qߞ٠mn ӳ"�]ef(]@_7SEJAQ 3ɡ-Amf5>Ml;|hU=H#FވF?.m)sW2)7۞6 g(ߩUf~0$ȩ% n/b(\!XUTg!ѝHw=7U[�3M T fɠ 8 8c."@Ƨa6h,#'E&bSi[s~2b/~nˎɵMP^c[U[gOmuFW&Yjߥ,pKPo'u.{|P$xp^0r5P9~A-+u4C<˜7Lj9HG 8?,�== L vGf#<c;*Eg]*zhSYѮ yu 4"*h 濘%([d(FzmZgRb5ˑ'ZίUeYUU@f#~wI1;-Z c~;#@|9äuST!X& }kE*r}(s{ X6\ةaH hІi<G0)p_J1!(GAx20'{@G1GNE)pj籖 A z`YcuT2w\D8:3ݵtS`XaIVѦPvΠd9-Ӗa;:6} =^i-kML9EHxCnb s;b]AȬȜ6\DlX29?UƬl+:"4--h0i-V2x`0&؃%xE, bB8\ފ:}3^e#X0%x̗Ya!0^do 9Jތx[̹L]d|Cc]j[孭"_Lo@(x9_暐O8X%gK4>>8)uKWwzhōN &zEPuSHL<bWy64+.I9G0# % Ff#(/JjXtO3y0=/rg *,t8-&LAy'Ԯ  ܂@E⯔³ _l@"4G.\!VZ>i(;LEZI7 rکM/.ؤea<̴ʠ7�s{�{ҽ|5Ь{F>g?k f_[ N}#pUv LLH-wd h�b]A*Pl8FtIւJ*"8MYwAC.$UX#(>^X]3F-H2PAfn)bBՃ`6 F)FW- \]iRoEҵwj*u6ڴ+3rhY&DWI@\k^Lo$.\Zb~[pͫGGk2LRLlXh.:Y ~(ʸءt:0C)� Xx�,T@R DQbk(.Z<A"EgyƶE!4uS+Q}2m=]4Dqt& Ќ=˂9pF˛N}[R.[47/C[>۫~J3yaז!祃;.pKzAAG+nH嗯G `zf||,tWy(mi,4P MJMLQB h2h9,MYu�� �IDAT3$<PG{$ksY>t$Uc o9<Y)%xKzMa"cB֋9@](Od(, D 5P*ѝsuUDLM[i']2̾]Eg& ms`I?\;0慵c[o;*_LzQ!^>7s$ Sq끷f3*d<,g5ݹ`A k4{#n.EX]fD%qD|שR~OZbg_8ڿx\)jWO~hD!J%Űn*+&rMUn0cȬ/F^c¾Gmw =ZTmdhuFOk7rjGYڍ KC*T`! gnۻڑd#S Hv\BCǞl#N`P.9)`$ v.RVS2f` X+ /%JͭWz)R>BT;y<k:8ᑡ%O@)؃Fo/R`o%̈%9S.)k#fsWB o~Ifȯ -٣[r76Y2Babkc[?vs:T)U4Q[=0zற$.CYmT+P'>fPPπ;nav_\F±d5Gsʳ_:L$Siu{`v(u^KO:LR~?"ljz@VC1~[X;{?pl#cc;ezi�U%0*xiAZS3|)bfͫpoln=hm/y{MB[fӍn=(Й4"x~[fs#Ͽ5--W57%$j 9P?qc *p5%ŶG\=6`a 9/Ht|JJa:*+2^~s WbO<Yv'%@&(9iG~aO]1"ɐ0v�hp)FĤhפs=T Q ֽ:=U[ VƂv?SYG>2*O8Ƕ7I}owbEʖuEQPcf;nNw&#2�>H~VA =>3LCL*x*-?e! `NX js /I^AC 'FjYèY{ _QK1Zr#"٤�Ήf$;RƧ.T<B>v-TfnX7#*7\IAZ Ȧyw5`olgԶFSrzFcdҟ>i]11/+6Dˬ),t@H*|^rcx.Lp!ñ*u)RGBEQx)>LשtBt;JM/"1y*"{,@lrr |땽.ׁ11:=gʣ IZtB^#yiC;ͭ"w_m`{]~sۖmi6Znvhg`9Ϗ_U C̣6>/1T^QV);-_.suEsTfSqS͢@RbйA/l68QQ M0�>pLIO^I8Ds $< +~𐊂Qy<z籞>^0UT!E׌ɀ inMhBMג Tca+ UW<ؼGݛ;$&9<=9y`5R]iYF;q߱޴yLFT/텴E0I &(/j</Y2 `{ǥ<ʗ Nϳ"g_6U6L[x#F{X $|D/S" t,/2\i+m&<`$9$EHeXBaPR xV^iMGʜ27Аyiw[."\kխV9귳 oc[[2Mcf?Pa'JCa�~lz}&שjUؚK%b2a=' 8;"PŔT`AhQCap\ Z҈E "9'1!2V6р*$2JBboGѴL Sc8=## LMv_y %KUMZh\d2R,]2lcziкnXMEdT$aC(BSI6_M}Wx/v-*qDWl\xs8@Mzt2(%>E_ #P !QP~d4xO,8\$:.ݞEvm_KAHKFkA ; sw02B *`tsr"zq J\vm8S-T0r)uڮײ"#Ԑ!TMiC5gk߮eEK&;isW7~Ԡ>ө·A:Ǐy'1bFkndFb @)ZUZ XΨ&cŹ%Q^J[vĀ=V]Kx՛!>d207rtJ-rV3(S�jj3`oxk' h=.ɰ|XI i]ϕ8BFe,h L-a|^$|1.Ko j)WW١ EָCZ\}M ,/'$iuYZ8]lW<2Nm' Ђ):<0xrNc`Wف"|/"Zu$ z%:^Ų)J_?O 82/)͋􄨽xK '^]8Ej_%m$&1DZHLPLk:'3MA*)L0af a9]Gfw5V<5F6`enh%%BfGUFsBz[vg7l:GW8.+t0DQxvY:΁ZEjTH}1oI@2 ( ,e,?lC$W*8+>c2<D !g7/t7~* !p%!3JI*f|Eaaش+-?Jj6>ˏGgck-~n* WQM;;G1ˇTu33 gC9L?b:I3;Rh:J ,OI~*-h#b'U:&;~L_FC&VGCދ4|)cvsJcXd<Ӛ!b*kW-?ʖRрMڥ7Nj,IhΤt:=~еhmiI7zeL{{꘲wχ'1Nja3XO\*L6'tCiGs@FBآ}Z!Gb-֝>bJA <Urm ?$:I- 8..`.rRA*yzcUyvy!-Ɓ\g3nmRWq!U ӪŠI*gHZx֣Ir;1hvS/ӛۚ:O߸ql}^ȏr la]Eʍѷ୫[V]gˮH</DSY3=6ıO.;<qrJħ!$`^p2$k+[/e,Q)2{q'+QD⅄m| 1^lnHa'ZݳE ͣl GkXΖۋ0҅~ՓE r;ب$§ԓc"7&ue&['֧G߫}Zs?2y~ս+�]o$u(}oZ,C9z`&ddO/#Rd؂\9AMH3D`%ZAhr^#muPߒ] W?$bLa{Hfiq},=-@f) EgAщV"f؄" "cA][_ɴ#3h*Vu>nLفgc2ܵR+k k>76U-+q.ߚ_jӚ𨋤в}*_}mkfUQ,l >70r\`@\Sm 8CoaUV3Jz*J GHSiʩĹ9xGiꂺ\GIv^E"xNօ1|u׌D#[cYbcU ]fa)p3.5�rC;Bbo;k]94Sf˲[>v?Gi˯mFVFP -h Օ/w7ubŽX)-?rcj4JW7uT aYV/vXxUӑ#βã_CĉuO3đ8 <yaYTg<Ŋ Y^$_==XIz@H#0x?JZ^"/MNJMuPF8>OӀfZ02CuXb]1"yl,UXaaPmuMw憱j$rav՘'S#ܕl>Ly*VR>xEБXEq(\E4(9HU9))~n{*Dx'{`TGʎ1<rlXx p$GVA�\dxpqSVKlk5'}- *1sf`9Ƀ&Ak_+[k8,+ ]}GaƤK q;&1ͮoQV`td!,q-UMbZE* n\ IC3L41;GLJ|,< = Nqu!:Q"7U1G(D{ѯ0 65pt qerS 0o]uLܷ.{gy#ݞI/9T+og.kl,[$Lu*mb}Li^3Z3NX%KG5оrǩښ{^%Wo3AC%G9!@#Lp)=i:X=]8ed PJREziTJx.Z%!8#_" -"#&ջ"40\M fJ*@Zڙ2Lt[;#[nyfMUR8K=q5oJ惖[UUr~ض y[1%ެh9^èr+_ndh>E:*MهF)FN qكI�bh.otTyf?dht`' ̀u!L"|8~ ?$?'z)V0WQm5 ׆@6=?WL>M.b4L)v'N;R׌rMf S E"6J63f&O"/f`< Hm8=(2=`эb˪,#E|}d\rҝ*2^*+dX!\ /9Wnҏ<ksCeܘ#A@Pd>D]Q5~{^Kx.yrH>Cu ~3r?N ZEbE\Xď,}S D"oe4 [(t"s IqchF[5+OVWZ ͽ~HiU +Ѓnh3SKW?B `dNie4NCǤUly ڝfy*|u5G0gHrB񇯲g.1M,/,jToh~\":v u֐] a i&[Ϟd7~ [+PCٯ->7&L$LyLa3]3oM-šYZ>?4,;YdF6}^l>r̚b7Ec6> ?u<ÊBSW(bU0f4P!;[4P i\T/NierlTf"7Bش/btK.};y9%CgP0ӦbZaB,:Fl{Q_QvF{|6CUǴӍF!s;2xah9:;oZ-g]N7H#}q ŏ$yJf1~|KXvЏ8f46�T<"UPl`d+E +I^ 4uJAG]C[O2%٫? eڜrc"ꜧ .~:[V$E'"!ϷAЬפ!4/ϙRz60b]`ٹI+ɻknZ&aˬ9<olN˭qq4],0gkO8t|'O  qM"&g5n9 =.3o=E&B!*`#J`eϓҫ)˦W '(o8iuv;s/bMa o`LpqUޏe'#^牽(a!O/J0!\IȊV;~#9ߛtЦ\J-AmvOkLdBí c/Y&+h_C Oɷs8$'լ#\ޣ#D<2 0QevH|tH`?'dP~ʉbtX٬8 =zX~&`݄B9Z)M֪ F:Jk糢%&쵎!ηi|ňs?ïR4t rss!R幟Z")7Cr M\ּu"a ՟׶?Z>DžTP 6aWI( Vp!q"87n`0o:P,{eNJsHc~?#9@s 8hZx-0ԿUj!!3EZ]ie(D4k{;SRaL7"CE)){KF5J{uƆ>6 ZY|J vDnd-T3/\77sh"\-hH:,*ºtұ0KZ9&E^H @!;Bd<~P[܋`U @r!*rgQ g{Hl~)C9ȍX瑥DgK*TEYXOE_TG9nx\Y,2o37'fg]47tF{UP_1Q!HTg�AYTmcFwͭL.G =0r5-!tSo|k o&24eE4k8P؍2) pJ( {$aVZ-Mcq(0uҐT7? u;~ SJ*^z)E$;whQ2" + ELLDPCy]<h"u}kn"ɼ"վmOo{jFn7 .^j{Xi͡m CJL#^=; <<C@<{`/3:=4i:Jr$Γ1T'y/ܻ9@WayHsBV:GY⮖e0<F1>G3<Lϕ:I1IeKGA�df %B,B+atM~.T.龴̺2/Y[&g=5kլ̜lwUdF KYeV5ݍ�� �IDATrہ&7UPADz< rS<FjiCo:ǁw䅚'ie/9�X`upDŽ٘l�S-tΘq XX`" |] x.HaN9K&52r%@D)ű:OEg�6v$9ު\2fn@۷9 Wzq]&c,Cw);5]+^ԚG^ g־u&o7՝FM|2MGT= 2:*:ԏyv5v蹽I#;Ko$ b/,p+aGei&:cK>x48><6rnHr/;G!,nQ0;MQYǡPz F h!dvfwYo|LjuzfSUWR(;%ˆo jJ5L\ZgzضoR%ށq b=Jɗ<f䊼{{{QƵc`+eZ2h%jGE|E6-ׂ[lM+$|q*y)!>hMuһ&]vAI�ى#>c�~{edg [ mM0KM?\(ѫk0* +Xߺ/U4;}oeRgrNC5HɏQqbEnG/us? glխcˎƅhG!8CO!63X>ZYq,b"FF)aPW9̙`f=${QS̠ .MMF2K =K?TqyC?b2KVU7WsjTZ}3LU\Tte/uu6B7[^I&~iダ{o7+sc׷+1GΑyaIϓ9&شekTi(f9pH ܒPKR{̏5 ,w ZFD*bj Iq(e(A>dli0O++t mPD!F*CTYz4�K=b:>q0Uﶼ�~,L[_wc13%l|r̞4hC$e2H-C/뙶uڍi?$[7E|g4X Dئ .@MXB0dM)0(Z�E]8PE:fN^*|!K-#X1դ3OPRT՗B؟`!dc-G{R_c ?hG_1{#2W9tn+g"E*['k otm5aV65@k.}^kq.fMtk bۼ_f<0PRZ$Xq' "aQi> VWg99gҌ$̩]IT퀨Rl‘ ph)Pqe-NМߪj l|ެʩm%++{XumDd)m(؏rhXV8)!iPvcϴe{;Sz40A"U }#\%Q݊LJZ!rP2d:\kZpFNsTQRäkCj=|}x:A2} zԭd>PH3d3Yf0a#5]lqI/ڽNK-0b9־G sg%KA׃9b<ԟT1+GX?r4 ./]5XoYegɴ0wug p^ &D�ˇ47njzƈ[n,Dh` &Q$>m=UmαP(9fƯx(=Ay vt78^y۰+Z=c4vS8Vnqˬ`;ClvcW:^f_kӀiPc V7ޑAF31ԭPEla^zA o]=*1xr˚8 F|:rXg@N1C0ref^r ^<LanPqs!UzWi*ls i*2ke؂ʟ !j-B[Zs 0#-xXks qƼm__ȭmjqs[1z(_vKSG+&u_:eoj`UFPb93J\XnU1M_B7,H@BO NJ=urMRyl;Eor~F^EANPؘ1 y&_Z$cŕV*,T(#ǶoH3sKk#:vzl[mFFn<T*dIo]">R0nZ#AsM׸flMJ@i[uT1*_& ŹC\=Wf5 CndYg DݣJdtD.W)1b^$IldMG 2vx6KJcj* ')x Q6w⦞ܠovH72W{?+?#5{m0+@r5z kTy(zI#+-v_ع%j`Xa1Ӗ',IArY4}RD}J4')"URSR<ݗAVFNw-D Qj]E ac,Zb#9K3աƑna`V{w{"p+/51T<O7iz1Rvؓk,jqL} T9sx~d.֚A@Aa&VEv (.B"ţP }1n<Tk^Je-cC f->r+-lK-jv�ّ8YYkr嚆_<kL3URn]u{9sҞԫ-KdsLW+3z(rkȱK{Vڍ'vvsOvv7 vEYJ{k!Q(ay? YGFg,='70{1ݝؠ"O9qM%UCto ŭ2J,f @V1^¹ԬDJ`]kq%']gH,dƬlam1zS9a0vȖ-q)~VwhB^{ƪ [ֽo<KᯑQ$_VC4G蘆.Tju5BŽs`NB1$&Cc`u^ag8P&@(K:@e'W8A%Ը3vs%|Q ;b6E?Ԫ+؋KNe|Y^9&¾Z &1ؘtiyTMo}8X <YY(Jq=2H)ɭbQKK% ]똼IU!$>wpT $[Xgh6$e!%B=XfAʱ1xE$&QZ>o3 H+QcqHQr5fC]$�1[+oKRyKzB%,\*Wӝd9KmS+ @tiOͫgv>n[pSzwibb{~7<pjhА,|\AV/T͍7:,IBK T;8@ChF(ud5TF!-p� r ;lyyqqqo\֚mD +e-}" d5D _\ X͵Q3{ʕ_EVub@w;MLV= jׂj>aȶ^!ì*'PN7P I� 3,)X;ts (N'qkL+qCypX[U2A8}n m?mȴPaZG}7<wTb:\iJHc*;Yy*-j嚱sXBⴭ;puxF:rh^ Δ1>hl cq "^K¦N{`cmiť<~;/UU.ةN"ɜRV}60E``s +ן�MٰN)>Ӧu~,=\TMND?aMaUOknRn(Cë \ȌjrԊ]D[E3gv钪x:<.'B뜇Hikl ڒT'>T8=qBEǦPCV [@vS_Pf\]r,�rRe!Н78$CzBki;C5(uc7֩Xܜh=zu8lͨZ* KL NLT8A%Yu):Xt8̂30yn fBPX1kCnrT'"@2q)ò'YTuKjj}G\[u^ӽ'[mK13hQrpԕƖkua7ʊcqZyiublcV` ?? #T/213.]Zšy R29=ӫ7-ըӒҼGup Un{6sNܧ/.o&m VEu<D65q�\tے<͆5^)VP-Vǫ"WS˯_Ze5 }Խ+5YգלƖO:Tm{h@%RLuӷF:Ҍ�:{F#H<͇(SMP }Q v$:y 2'Ͻ(3 A<B.6f^4 k/Ȧcqiaڻ׃A{vVC^Y|HEgÌnYkL^+6b2yiU9iid:i_s^?*߼Nby/"RδFENa:#DWe8'H#\Sxu+ҸS':+JrN;87 $bA W^<[Wd5l 0`EM-RjdjuG[o~R![cR Y4ɜF -yzקT W&Oe[笵1Pfcmb2,5-IIҲZHZ4|qFGIVr(|)$3^RHdZXwo}1VR^wXs zFW17H_<SSUµ껤"qKx7ը@TBROGRub\Qu&<\4n&HKC V5,$ H@&OR. *tCܩ8]R66Hӳ$2J2_ @mu3%gޔ#r{^P:u 9mj1S,3Z_/Tt)*׿jurF}^]ŇD;!5B%:|oIXĥ1\9lz}]6hTE"\tfu=v副?V nI^E+x~T6{Xe!T+vVw b@ʣo`]pYE^):=UI2_<Lq>}66A 1lC!PG ɫTM@u!e;(~Q6swPu@6UZM5)_wRNi MEapi6V`!ʳq*}h+o"T)4N-8>~Uykyp_D$~xFÙ|cSУO:_L0<IvpP1Kٔ(4'Rj f#5p6!ȥԹAVXFb[zxOjkQhf[@9W ˉ+iS [2 ]Zl %$zkUAkG9-/2uTջb͏c6q(e~nZ~NI#aTDŽ8q~Q:I(n>E-^n<W! JKep/XQZGڼ@?Dq);+FBii'jxY_6ۢЌ\uoݜNhMMEOmZ"M%q-쵭3T@ Z =-E$~zV*gʅ2I'E6B :-q08e yJ= r)iO uV!KSh'_QuRvKf0m.Z 5J(-I7uj<N;FLp*l^>B$(6!5sӉ$F83{|W~; .DF@p*4}sLJnT{0HnּEcEЭzZufPmؖSb{MTC6-%%KzR1 )!J.ڙGwiK^So]ן+d+]h5J*a[,hSY4\C_\M^)&t=&yv]u'#>.غR?2(1�};-[i HlM[E`+yѫѨ&1m{UB >QΠF">XgVܮnk))ad*+zܕl^ϐ R&㙤*΢z~Q˃b)0nFwp-&'P873N)e/" {ʃ|&59]QqzVw]pڋkƲ~`ʙԩAJ ml(TcFLp4wbӄdt6J+jBY%k[7Ӏ,ܴPɬ+NK;AeT/[ b+c~\9ﵘvՈ<X'2]-uC$#A9cʥ&r )z0>8\E<U*VVP`cDd4!Q,Xӽ8ZZA4קf]Zwxm?Iڡa�VSUI ֨i?\FHSuqy&5lU( kˢZGUNֳy"f- Eo�#ͩ ~55NJ: yg{)j^&k6JAyJmLɂA5 n+dFQTc/ʱ]*&Z4fnQN&m:jݢvUY$^\1Vdx 8\3h@C6]4s]OxvJ1ZMq_=ʧgiľyo;,0Bݗ,'{_X{ɑg]lƖ Dg# .>~XZbmSn8@YOgi5][qtHou(H PϷ">l%U*|i,ը?[j!!R8@!POd;4aSg๬f"W53ǝHX f葾bά2V,^Hːۈ|Y!<T%82KeKMZS^Cwd魑Zk=>M*XF[ ϻW¸{-N)($֬e;s#&lT8\SN%�??Ӻ5ūW06v8fȚdv|s/&Jn8i#jϲYh@Ռu|HDěd}Z>\j1m$582/7h۔ )HS $8uBK5m]7 GNl GJ*76VW-lb8AV'Y7%m[b�� �IDAT0\|)_%dS^b?\Zt&Ka Xu?6tn>x*փDh]ڱ_;7*%}IΩƵpGsd*1Q}+Lf2N l[FLdz#a]HyN VH9{A2 NeVzv4kns"у]#<w{gg|̙IxN{bHޗ)*ڽ( U*6roz�?BViiGCA c(AcU/U|  0Y4@j){ .* 1U4O5/퇭@؏'d8P7O¦6l!'q~u)>=0\*wٻ9 6+Bd^攞|6,ʏZTi}?N_CD4Jm!SETJ;jlSYA?Zk\*ލBMTyv N:me/ݱE֬ @giK!Q><Ϋ=%�6=wZ*wru6()j"v99㖌|�T3W8TՑWr$--+"EQծ[$ӷzW-Vh8,W3F IpIb'Rdށ֐-:͊5zԵ䐥0k2}>NnY X$_&z+acI7 WNYUZ 4O]S ǨJihBYZ:!SsE^k6VIXeV¾N Po 'Rgxi-&3'NqXSG-$G>I<}+(9\Og4v )-;-8ps.lc!huHZ"}S.-6|WO&{92 F7\<\*+~; _X;Ul8l ^ |k.v#4UA / d!0Q / tYոEjHhM5h<1W!Ag4 92xtC$$W(]$KDlI�`GIL:^Q8j>6kV|+F:$#\Hq Uc*|r0RVJES O@@dnd! {/&L)jv1 p<] Mn\i@tky1H{TF=Ƹ|"%(jzZ V}=#DY}ަ? U<-mJtg˙7ŷ zJ s-UpMX5CLH2Cʆe#LYR%4Ax`3',~N<Z/-qN/hIwꀃ)qAzX#e oaN(%3dH@Z$6nppxE/oLdǏ,a�bDeS5‰Z$z5ZJ؉GoJq/۴4CcJʭ2褆R}Ə Nb)6 R>9ʻwFpyD٥KW`($zn+`*)X/݃ЕN,Vlʌߦ,m-SMXQ:dHZj(PO- Oy=nuȚxuY~6 )%eO5:6j}~BO-zqD]˝"I Ns1C~z[Qpbi?=b[l%#B$s;ExeZm񚠐h}޵UPjDuaVW_MX%[߲H˔Eq{P-j<[E┑;\~f/!H 쾉H1cNw'DZieW `z 5npCZ3"ˆ_Kċ6?$` lJUɚ"aQiA{i,_ #\\2H'k_M؀hskh@Y;l"Kޢ"/'@l5XQ82 Tu:6P7?}KuZN;ϢAvu[zE wIA1l@{Όg4n=Mu6�X<IK |ܣ-N6'Qd^ɷaU9l*YC*׿u`[R ,*r)[JU {%O_8yqCOk/r۬Pz3^CAx(hGz=Kp�5Q489y �C{ VAA PKm!$Ewh=_YHi=Y!D '*ۯI4D6H@_3:Oqbb8|Ԩ2|DoYT@9 } >c2(}V ^c}^r^!U!'.@|(ImspI !PQN&`0Zՠ+% [] &'lhԸqhJq[ H[*K"-g; 20;T Kw:=:O<|B$oS&U(@O݄LYBu˻06pNrHk+:'tЊ{/7Z[TfR[ԄOcΌ |ilIZzYT*)Q CL{;*]0 ^}di}j`H!Ty0v wf}#Ὼ dP;7q>OrELh3HR!N3 mcIW\*R>O~:Frc[`ŸƢ*\1*Z!1٫$u|*CrҺ&%]LPF7BU;.Ś:4("'f㷺` h:$,;zZ*sdG?e(/O?ڸޚ$DI$rX}Bli1 ah5<lAr̦ Q\+ʢաlؤGTp JKtM &h6\9Z P\ckt{]^KZDyI\ۇ<q7>Օ#'mܮ[d6yB!8coo-jxehSĀj;j nU%|c5RY2=չZ9yD3 <ڋc>i1~(3>R5=|&TJgtyH橯`u$t0IeO} '+U#NjFR+'4C7DMZT.6�kQ13c+J@SԒZ_ 5Y b/Z9_AE>jhAQ0pP2Pwgub|+sNÉF@_!|Gq>- .D3bk>1q-\i!'VGl@J{/JMLR}n&p%Jseƪg^DTC\Wz)Bd}N)Uoը A<y^rf]SH:C%QSjnFRT+nέM_ཎ7o<k]JN+8 e~.kDwN#h⼄g@= 1d] 7h6JHHr1Vqj⸝Fj;XCZҷLJvug4HuerxGwqk8E$QwYrhE'޾qFb;œpnC=$׋TltS|/ҹ-XI{jäL'Ɇ5~3XE  TnpHMb[IZ5Jsaiy{7G<GV+dX3-k+cM$hF| zWU-5G/?|~I<E G&^)H#sNQ'O`u6S&P \IsVFKL R* k?�W]dܹO=\XYks+aAazs%HH90H~q$Y)T!ˎh4LW;6D<?e%C<w}I֠y8GI$"poK7UJ!eDZHx.j͍,Ɔ@ňxW*Z#K+U@5߫TBjhbU;[ &~d|0_�.['AۀHDK;Ĵb(;>b03 sdĞ87Ivk>~+IT5nl3X æU֥[q@+jXxVU Ojf&bڤe AfZ,XS fh$Mu+8Oa)>2_wBQ2GuJ; {/?!xMEW3&R,lFUFv^^A١aЉ 'b!!ɘ^(|bb4TIMx[d q(b@R| =Oji>.2A =)*H`O }6+L s#qx]Qoqk!ka#DgHs#$.9RU)jnQyQSH+ceŤN?Ú#I.-^"̠AmRfWu Jj M/Q=mSy.N| D7NRP2JtjS1s+GV n8I,ʉ5wxkm+@vfdNhBvMUgctrxӋ84YE!9YeN gI'0GVwGz|5I 'ה\>o|zYW=iݠ#ҵHǛsKs3-s( ^86^On_ݰK!a| \5FB{́o|JdV: m`>X)Cܸ#dtpF%7|n6nOg}|M8x\֑+9QG4* Zl@VM&]DB56R'Mofy逻,XQ\pK]?T>fK#P ֗Ƥ|ΠWɋO_IfX8x{B _WgZ|Ʈ)}C<Rr7,Ƈ?߂} b搀' }@<2[˗H<Ag9ܺiռA-ʍ@#<uH pqzP<0 H7v]~W^8[b͑&poO+=~LTrҋrzCdȑYK "bc]W+5 n0T_ ߢ2XS{bT+e6`#Hwm%gQĆCR.=eq)G=ʅ'2h[1Ŀ}VN+w�n<i hGG:..q<$2iԭs-Ko@- #0!&ޑ=|)lߓw]Mز*IVOJ<MuY<6LtQJojML|!W|#+Ђ 9z+Qw-Sq(b!R .fѬ-;XEIPO&e$,"WxlZn|%1;Sf`'pɼz_+siQ<?BQq^~bR f Nw8TK왋_3r&a9ib|4921\5HKROcDH#-�qqˌ!S0=zYp杗!xH&!1WĞbܓ\ϝp {)N.W΁+L#͑4["wi i;RlsI8"f3+&i3(~)#"( .(I o[5#bq0E?cfU?_rw&LGFFM{־kK˅u9rH4ǗeUo M؎)1AH=Z&XKU&'d$-JZn c/rhǫ5j<y[N r?y0Μ `ĝߖdzc1x';�?w)m; l>8^\S&lhA8U8$ r8WAcAٹ)P O[ ?V!ͮn=է�1νG=%z;Ȏ^y_ c2 Jd 8oQm0ӸVJzJz_S_-Ј,['Y%tVEBc*=TЂ;1νAGgA}(c-6n}~ԙʳ侮dgI9/k7B�.0c_NB}a2L'@dx*Z16T"8[LD] lE Ixy3 [ 5G2r݊Z0ў�:0RorΥ=%I:#<ޭ_]RC4_TF?S|J'"_ERx馴هY,ɂZհ|L {.'&8 d~b / �eg⹴ ܙ+(^͆׽*uw߯rsf%f9Te(KxJM\ilPa<ߊ~i5ؑMazB;d BI̸$!693*o E$k2qKtKFaa(D.!RIVS},!LDyΌK=GsdOyEy׹q(:=4]Uǝ~ jS^rX\7ĊR,C@u,j~Ul*J_ +__R(޲ƇdP t1/Dc維%:8tD=&O;ȸ/4ӊUt&ߺvO1>8㴎4Ny28QSh!a]�gUAΐՏ |W\m\AfBRSYa8\`-A|7 ($&߸:t0 "<@Ah- >͹Mrc:ƓeMK+'m" 540T X~+([Tl<<1ԌR \P-hc bcgݙv5x. q*:pd0<T`8!#{k1-%Hvi2-pA0|h&!Xwsuonq>[vQD96\g'c#s\&"r!ҿd{5H߮oYcX4Bm7La~&2AGž2!`8&5CZz7�K&<2e4XФݥ9uv2}U-5$$ ̽ Arѭ¯L(C(#Â0}+5Na[aE$vI|r#ՋNŸXq ʰ/:KsTUkaJ2 LӈrJ8KswlD7p~^_W|72 XlBZ,8b{Q0ΞOm*LV7.CTbM%ӛ 4ܞR+A;rYu&!<b>txt%o1Kΰ]ҟrg<{p-i+.LɎ׹�wH l 0CBH=؂Xۆ?0b<,^Lo^dqyۦAunĚ,6PdZRgI,#v'uq6 O70�� �IDAT4kw:s᳤-UǥK/y!eowk C%} d@Doʘ z"$ UOmsK^yq7? 6ۚi-z j&tQA0w,*ҹ, '8WU ɴcr{5^E9δ]V8} {]w I(q쫣 k o t #@4xL1 sgU9Yfސ:=+Ă R%zwGje߹]ܱ|tے[ḧ(W݌A�Nopr_<@cuTVt!){hh쎪g Z;H)|C Pt] GQ 5&l1m69yWl@:m3 -bJqr]tnK5s"E§^wm_61Ghމ[M(X- wb/~0Ŗvr57#%x5yxޞϋuo9A P|WP'sNs"RN+?YǏʮo퉻 /-L݌PU!&2{^ =�I@pHK.oԎI^`Qt@,Νה& 6EfL_įa1eUL$meÖ4oWV]rʹ:tQT`-D1XP$}竾V͊]Xxbc ]z02*0CтԿlА!j4ж,y'[jfMV єzD>JnVRUȉ6{`~nw {ЃohUs˴&qypC(hWW~,x+ vK*$P9WQ֙<�\Tǁ`\+|"<f ]+!+ӻˎ0cy+& <Œw}Syy[S2GPYHGu]7`bķ U\ +1JmPFcD}q*6eGng/jtWǀLAHQGԄ KV*Q Y5oVAtMr<a8#ݞSpi y 8h?G8{LF:-C3-[KJM'X0$ψ]G 1tLpG<I td2\]g$ o�^OK^9A9B|t<(y^w;9O3DAf@�*iʳ2 K�e]C,80T\^31\&j<ٶ=ޏW�YsiV?j⯀6|3V CL=c㻲pGެTJ7lqLq3C1Ҫz=|I vP$Ef$Hhi菠Jfu]쫄s{<󼯐]ƚ <z`A1GAx%[(6y#vW9xG~eՙ"@ %hDw +ROc7Dp$S]l* ?B*$Zž<th3v@ y%mP3TJ|p(!vr $nT vLU'oۗw_e%S@+]֠  ^ C#D<%A >q{ڋ ^Lz`^XJpF?1DgGUbǛEU ʆ!b͗vݖ�]syY^]S߇]d_h& CBMCc͠ZkD^%p(=K$,[&0?%Lj39N uB~ITqj䳲9ȯӒ5<E]s̏š!Nor~FtXד 0vA[19U;A*[6>OdNJYSk>ޯBt70o.ȬC^QNj8#notq_)qL"/f +?|J愈k_f'W.?@8ckcvƛãI?/zO.(YH` ?sQ=->'=$hs)jq2 zPҗ'mXn@N1` S) ΡQ֩aPL"aFThͰW0 ʮ'\zO;wkΡg@10wǠi ˎϰdNԋfM>0؋8-$ޜCuO{_"C10BI֏dC1w%E.dT3bǣ.r`nj*=ȟ'CnP|ɱP@ZGtJ#*o{:(7+mq"YTrml )yK 0e lSuJ QUԩ?-wmUQKI?uADk *y\OXĨz2 rZ]cym+| b[ey!Xs &=<5wQCs%5X sn`X}IzI=$c/d? x >5oG;MPCLS@}R!x,^|eg|cܞ־-aw7S eq`I -.לӈM3 <w+诬^{SFDMf-4jȈZ{%Docд# Jq~2'QJBPzoeZ<;]g)Mk:ST+Ơc=A<?*N} F!_F  RG2,$Ez%㲛AU�K{^TScNIPR'w)m2S\7 xV#*(.pez$H,qVyoOPQPCg^݊5 iFX%pl#@Btk�M'U ^иc]=E ,w;;Ͽ}ծgG2-v? %0C+%y*./˘n#o?IoBK܄aDh9%3"hs=[['ٚ?] t_lqZx@:uO{I x T \|찾!| qq삄K&<8 -8?PC*l-E�w(]*d7�w>ę+20b.lVy6zr.&y6(?yhܵjd̗a/fI2E :^VƟ` 3\Z(cWd04WsxӈİPj8-9koϺC1 !kZL[@8Jc& wJД+b -T `QՍ22rL& ծ=IBA.X P)xnÃߘ b ]^K`l;yG;ruLٲy#zKM@?П:|mlPFJ&a?*`raAnF!Ip_aǯ b:]r{S,DCLKAmE_iFQ_, JvU t 5kJg Y!îD !$6<1䴬..o)HKcL}a#�elƻ׶#[ߊӹ؏bk/7Xz,P 98LFsč]\dy:$ zQM jԮѕJ:@6>-qݩR?!bl z<^_wǏ,׷5V90D D3.'k ;]qp暌'&-}t{:PxC2</vA)EjPqbcA }Q!48l7k=m|52{TۣGy #oxr&v> Lcxqnɦhq#!+ -L|^/%F-%8y^YPUmĄ/~ FJ,e޻=/zN_vڶPW4(F4dAQqqDF@ ` 䁤gGfz1(J-DѱxY`:1Ǚs( l٧zJeTh*e\|>M"VunX*)( b'jVH%4g\ZUq =nu熃<HlUCvjhFG{%kPn% 2YVs#eϲi#gw]^Ɨu%@ (EoR侳H7Ҧ#wc?]cGF٨B>m`'#baA;2>җ) uj9<NLM^ubO:əiOz("DT}@DݦN&q!DENDKv 8H I3]!8EUU<WAqB̓8O FIu(ȷ)sZI?υS9o?Sy&_>s1%_|j+OT+"ٴՎ? e8ϟ;ڄD=i,zt/H$ l{75|O~VDERHP~yO͔ٽu7Rc2QGFi~<u+cedC=kPjn:zt\g?..9BgLķ}W d`Vedp&i8;S^!/h)wAa7[ \o7t.ޜٖ | \Y$c0bW#vS 5^~Y*K>aLhItkOؑ'83$? vpl_j$Q/5nCKzl=&eJ\nŎUk \GE1ǠY!h}^NEPvie(;EIKh$ mN+FHtT 2jCdvb`Xr xnπ=*bX0F76X& &_R>8=|5op1'('<7Olo?)%?DLq` o#&V�,b8>s2S?bK͉;Jp9bǎ Orնr,~uo&x{>_G kπµ1{׻ ;BK`<yop 58�jl]C$o y&vrꗔp6WW7έ5 }B/oCN浿w@%9(Iߒ+p4)O}0INBb?x9"Kա?ПQ+Mȱ]e԰v9a 8̃u!a{䛣LN }PYA솫ky:o8'W?JN=D9MV",$Ǧ zWTBnW/_/]5(tw0?3>vֵ6ngZ]nظ!~8X,ʓ`І+fJC;<1BUfp{~>uª {"ܫЪ[E-hǖ<:G*lkpģ'V n~{vG[c@h eU0KssZeB8(+Y֐pbegH6)< A/ǏMtZ]\|g㹷$1Ma~%saۜ؟o洮莦9:<֙xQq @.%B8T2{r^ &|n ()JA?VR=�<irőqRc2x̶r׳f|9\ggZh;1tÿ)oH2.—me.S엀w"~eFGP иߝ?&K#3aZ �_IjncNaG"#ȃ~:R}N~ϡ~epI"D;D27█aMQ[Wj7R1ժÆ-1*:`;N`q0mg5 A]?` l2yg}2ξof#/rqFZ#WxlhҩR\rhs '-;Qȋ(tI TYRz+p`ILކ+12/ A)'u9W~ ygӺ )݈H ij5)C)iw-JOn Iw!7OMXG;Ե!|q'2c|NO&x<UA<K&3Op3:gs=ֈ4EFDxDwyORO{]"żb`~^PqS2ddWůg 7ֻD?1/fznqٴ@L݉4�wEN(96oL[AZ =IM,2WaI&1̭�-=QHV<{,|tg5d}2O;oPMt885d) !!$$=OAN )SS$S>'^RyPN w2]}r:dx.(KW2UCoZ~!OVUr,D9x݈~Go#<BwgWq.vTzmv z,^SIOApP!E.3+A[S-,,$n&DL- dQdݷjs{lnO8iɜ8ؓ țĺS^қ;2%dHt"/چCCS(J//aW=�`=~&3N0w奃~єG{LI1fL{ (**n9 9F 4KicG2}XrWqIrմ@'ݝ-e'v氌 ECd^e9%nOJAa 1C,RLՑ5)n422b>q07Ӻ6@1Pg6e 2L ޗ n,EU<u1xI4ϋXqO";@3l(~e(~ˋif+d]C@RImGP R: Alo` Af/0,T︻H.{dI Cn&8"1L;RޅOg fMo:օ^φQ'ѡެ(krmI}Vh;GbU.=V⻄BqʨF)t3PNsXpw# :ID_u"OV;VGF8MG3%`w aFU#RMx\X Ýd̨7-.`7:tR@HFK9D;-eI/ t/?/Muz|~'gV\ J<5H:;IIPbz omf]-`Jl vɧbsuz w& G`t–c^|:|9JD6 !#i7QSKF9Y7ծd`6Y<|_b!w?d2w:5HW_IANufitoq5 =D61ɛ(Jk#;<cgyh?Zqc>!&퍱Ξ=kqCoqdn]l2{n:;3}%G, vj5@xÑ k41hֵ"]~4qzKDa>/i[G/_7\UnQ8燥ObxnElK쯼`1ms^u)(JN�w��IDATꐅ A3a -$KcD_lq$ev×y;ti\.2dsC\{N$wjqDݑ_6i519Yq J=vI4;Kh5r!zQY"L*Zq0c?즧>2!\hZ -W8L�pEg%I:6[! :fc7- mL5#Kxi"Âr&[bHȫjBdD)!YBHF$x9q+v+79鴾sgvT%p.$䟵^'P[@LA!D̑](^}]e">/c+*'7i?~/c7>o:+}<1>CH~,^֠+l*ک r=.Sޖ.GyO%pk?nOgZv^= i|�+<%36R̲Y-ReEI&xz87z)MdB#&%JE7=->@KMFG8D/ i]|;DP 60ز~0b%__yґ_AٞkVC,c湽]#'Glѹ q=4.!!,ÑNc)i'Gm qY{xm*K�A~ 0%1bdy>e<%^7JeN 2Jn u9= x\i]cI" 5Sr2H6 X|RtV|oTʸuZ)>:ɳaWd80NC4} @~[vv83K7xA꓊KL2M𞙌FZI7~wK 48O0h2DM<( @*qaGofNxfZs ?Ogw[OL4fƄO.>ugy/e$!B?+AuJ䁔GN.= 98:§z 7jRZ+T*`+0!rfٴ!pb IFWqrD>| 53vLgj'ϝ4'Yyf*{OחyX>Gn0o&]Ӿ^p p3/9qOlb39IB{PBƼq!*־zzk)~YeoM\T7KdY\j+55S0JɝR #6{T?T_�!D{Nr:\%(0P[G-ry<I2Ca9pz%hϏgd E{^Ǚuyk>~K+PlYybdXB@$T?8 +xr2T>rZIG? vU0WH|eƬ?d4F^tgZ~>\MdzU>nۏa: >F^@Ϲ#q̏cqW=3Ӻ1b?`??Kh,ߩh +;Pe'yrY4H[z7|79/fy Odi*4:UUvY,:'8D$ûyѮЫwv3o:ؼb~#d:&w OZѱ[~פ�(a\&fTQS<涔{y}xNU<*)! B!glFܫ7(]WVs5l2rpi,B |x,eBz3 <2|-:9*).ț/w%MHM;IpLq?R_Mw7˩gX;tZƎ+y^OR'e$Jޑ[R7;~ŏy8&/䌧' L$2|c]/+JAFn0\.9=ëД|:ӝ7D6iy$B6 Y|wՋq<h*D!U$4[f!uJVyp~+;ʉtZxƐa$dyF 6o[pnH~VOKζjDL(aL{'Ȉl 7O'<v8} xm+6K[΃q1zD[I{'gUp&o3yCH)SNqYjwq(-�3IV8m߮aOʽx]ift7ȇ^BhUҩ 9A pe4ٷ΍Twc]N8<U1IJ)#C//vG/y:1ò<-c-1:Eң8=>a4~W,O_Vay{mi?;gA$oE5Oy!jk,W"eHJ}`ԡ~&P.ߩx_%yK=37N[UMw�sΔ# qʈ߁`~+Dw9v7[{E gy-V5-^ebcJ 7kyC~ckP~ХHO/*y>E{ ˯qWNekJ>*id<+/i"0wCz/ 弳S葸b{47Oy冈7,yG|/iI R+|uAmyqL 0> oЌuyЖw}< 􎿥#<~ px ʧܯ>>N:d  }}x]z1l~k]rv3]W9h $,?Y?FnnǮtw*|oYGqR@Oi(dgecwŻޮcoG"WHoҟݩT8 nOt䏓3_Ϗ 2_w?o?ǘkuֿo?LkkYi5\s5\s5\sJ?5\s"9yO?y>@?9r̷;a'eIo&7<䟼 ß\s5\﹦Ӛkk:kNkkkk:kNkkkk:kNkkkk:kNkkkk:kNkkkk:kNkky! _.o|:9-kǏ_ٌvJ<,5\s6k:Wk^o;ӿp:kf5\s5\i5\s5\s5\sM5\s5\'[0\sY?~wuqّ,Pi5\6ݎHm`gypڿ~WvrkJ)C:3뛛_^\J)ϪN5\sM}.ak鱾U{13kz>a:k7X ==tZs5%]WpfOvW_j:뜄#_a{ۯ8sӚktZs5\sM5\s5\i5\s5\s5\sЃ75\s:oRkkʹs/kzF5\sO72óki����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/2masscat.png�����������������������������������������������������������000644 �000765 �000000 �00000446053 11332127303 020635� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&�����* ���bKGD������ pHYs�� �� ����tIME5z|�� �IDATxw$}'g+ڛ@IE*tґ:?$ O!1(B B! ]PtZR$@ <0~zz{請tGVvW]7&&'_vʂi�f20M�09a_/aB|ϣ*pKKKp8���$Ɂp8\׭5~K#Yg?09a+;\?!ҳgbci_WO0?omG>=L&0i6 �AjU! MMcTM�`�B�M7��#a��(Ɔa �tk8JTU7 �`4U�QO�5 ݸ %D �RrO"uPQ.#J %Q`_AV[JIS�GZL!�;޳Bm@&�lT{d=`^3|PxssscәdH2  !HmOBwgu14<=1EPo,vc3k�r|Hg\[Jq_8ٷN9J<wdba3W0<K 3|ڨaУpu BsuB=POqJ-'!bK po3q<ynprq+[0|W&ugO10d߿: !s'z,4wuPK^% ӃjcBOn%sG N-ų2ȇG/^ C3PK:) ^YuG>w ,ZS6'{㻹xN/32ȇ9~mjRk_1$>~ uJN:4 \]˷1BQZS:u=ѳ*l%%̮l@9쓧_1$^<)>r]KB_B%ӋSZ?|'.l&ltu'+1|SKjOIUE{[C|L+Cu'rix!|I 1N/lOꊺ?|'i_Ic7V:я=qꕛS<SOBC|L+C°y7a{lrc4-.'(wfK;ϯ'S" M*ux굡 ~6*<~vCy/9Pg &1F!7'MU_KP͵/'wmjR9ы'_O|weቇ_o":ÞhcAgm>C ~Xw:_^Ns<vi3%8txfXœoܚQ> !<ynuxkh!Bޱ%QGPu񾨦-p5ג[BBd2Iol��ۭ7^xz^]Ƙt=NY5A0&^١ Jx٣l<U9ѓ[bM`쩇Y6Tg\8; "/3!3% u9D �L-PB V#l<U`L&0پˣK*|Ҥf�Y>x~!xhǫgA'4{qhz`N.PBKƒn&[qZNcO2\/^R /Qᡣ]\A8[ho!4M =*UKirg[6zDv:_{Lr)2 /^Ru 9!npx ^G_,EH,Sk?h|qz'T)) < ǻfV)6R5>taMݔxÏ[cB9:o^Ĉt>|cj)!x|1N =ԛ)ӃTBYMrgzOM|LS3EȣGΟ~4u t^z8nLLzc>J؂k悅Dw2ōvέ&vscܘ\+Vx"䱣(#ЀWeAW>J0mGuE_(=5MfJ㸇uί&ec9V(cO?<YE5DGNte BGoZDy}b`1oYhh2W^i -{tZҰn5Tڽyc�NhzoޚGDumb` ߢv6Qz?ʕvrw.n&2e;;</7>p7M]<z3r^<!{c7"3p__tGύmRBMM[K�zsϒc WC!8w7Zn+H^�KKK10nHP\!%{%!(r0BPՌr]#<%0Z,a@ զ5m|<xҾPm*h쑹|tSn-!^3<1.Y5F�ɕ]#]b1;J⩒kL.2ȉS*3?!O9ɟ]auI,t9[qJHOăv˵r<kt)* БZ*]]8qcz\k-6uSpe@sg-!;4f84'6:WͥxQD_p;S-J[͙x֔xvt) },F_ZD<ROwil c 8=Nih6N0z66ԥ,܉Nbg#T&2lTmZV4S>orsAwK1;ckhs7g&!d|):)VQz7V6ЭL*_p<vk.^l]/+a3�`̟;k/gt#iC"%tWojFn,wf0U. ŋij޼ܰЇzwy�G;~xcBHm4oL[Rk4 -t bv 6-˳&@?e uFV1"a#u\$t<GG-ԫfQz'.NslE`c}Tۣ. l-l4tYr>I0 y]ܡux1at[v.{hltq'_VD=~պ=߿:k�GNvt}BwGo^Arf"ύ,PBb^U77GbmBë;D/ g4^StY: ]2ɮC.#~׵ Ig% l sn=QQ^w798<s:j>O? =b?|N?}჏XU0 Rm5L0ʷ|SQܪ7Mտ|aSh-ٳ!zdhE{7 !(3xjN?d7]I)9OD>uRZ7bZGK>ZHzS}d!p]!ו8$ݲpk!I 9kiFi_]ivyV,2d!K/$K5!GP4)OFpc@sӽG~r]˜D|)ܚOPB:CNj/*vNo2_LƝ/{bXSe=r4K�`v]'ѡ%+$dumi;sHw7_k=n.@`d1Y6e]8~gbNx"�`_ F$|6tRWW/[hPH,tyI<;]-Ʋ B[h_sib #K>tsnbrp,h7UoZoe$;[N*MY`珄/On՛S?yƲ 23i4`!J#7RT}!)fݒݾD1I<w?8ʷx =yih�#sWW!A0= Ā[1C0:x-PU7rNOT_- wǷ,&rUqg|YЕxM"C =2oB.ac y{(OGS=:ɕkɢq{|D*2L`r5++2>:)C`phU7[m?{k|#J!6$t<]8uÜ1J:<nvltj?6]m=v<f@_8~yhBtRfs#{B;<( wۻjlەأ#ipI#"-9iBY]0FꩡT,'S߳��l/M~],ޘ>��g^)��ח?tB+le|[�?Ot_0�::/Y9s/u}za- $YWxu�-_iv37p#0uL�f}wʺ] ,׵R]ey%!0L*5E�X#|'6wR`'Fsn: !+z�^C7 ΠL  n /)! c<gzS_NDBc+Swӽ( NxײŚ>ߕ݆jDva0-`̝> L# ^pk1M K7$7T}ist LʹVBCSމl:PniDv~0-`>G]|wqB=)ZLSL:xb-g{hl+"uv[nZPU{{2Lsp{}Pr]N`^lY(!=!GS3w<G#lIٰrPЩ|:v{}nfWGuzeLﵱ8аR Nah!E1$FZ#'hⶍVTEdh{=UMϝLoCn%PvhBs>p 7-/ _rtn.lyJ|EYt5K<w3tU-m̀=B.q3<B-P И{3SMϝlsCZ~ۚ<d}4ņ&1(2: ɆiNj<Gp3՝\s[Ŭn-+ )oopK:s=zW1kOG-4(&*EhMb܉.ztr[Ձ[b?#1ۓ;GxsO:Pӄ6Ze1Nm b8tR\ם";{2ԁ[b?!9#,-DPF3!A@8g庺(=u"pw[q#:ETk�\;Zr(QU6S#[o0j߱.DŽ"^9nzm' DF2u!>ϯ-}#QDq5ݛּ#vTW5c)>=|\RbL$Ε:,[VՆ=S 8駎tbSwog+]t7k&7o,�ӾH@�puksq{$r"/*  rs+SnAqܱ<Y,T5ȝr-eᑸ3=7'wuD]-T:+圅rOr"p/(f&1:7u =gJ-yk)WS ĝq5 kCN;І:Rœ* IL=isr:dRBOwޞJi:N6̦-`rgO%hnDe9jFӚ2;BFCnw{(Ozf;P֓ӣQ|CWՆݮKiU^v>7$_i'?BF NNhOP,T 6SΕUp+ -r]fҪ2;z}.tCYIDF !~0NHOP*z$X)g˪Sw8F.ץٴ^OB/ͤ1A YI$Fl4lSumFN.픳妅u-r\WfM x%v 8.MA 6ӱGHO��nxJbVmTCL,T\^e:q3B\,n,d &st ЀXm諻Uail2O:X1V,uȝr](p#6tr∇wtt%o™OIO@*Wr�G@Ľbv)V+=s�˥^o?‡^%%+O}o/l��k7{d>\!cTְ#,y yNkn:Go޸›Cw¾ٛ<~O\u#�x]o Ǟ(eQwKӋ?w`Gq{V R�yf2BDD}$ B|2OˏŌ|.9c/1aHtdL1z8੭*T\ޭ U$FzCB<UOB.kbz$z,&]/hXLz{&!:I_X+sWKڪ0J:|of#Aa'$MObj:^*Gcj�oCµF8>GJfQ4,%kG|ofl$ -t)YU4@Dű}BQՁOwHo^-Q#Nf}F!1%QhZ(WGǢҵzCzk:!8IO@j.wp+w1/g`1q'[ZhFEz,&]_,6uқ =A| 8-ب0Bb>pa&PgE_O[(,:NnV6zcZ=}s: 9poP2_@]4bVJ㈇بpt8�N Eu'BRLYs t0"Nm7|2=!9� вdB�pnVc- 𩒺o<`Dު[Gm+[3ysypECn6\$Gܜ̓2GH!gZPtI+2OBZ)mѨtkP6?,]#NnCCQ j"Gz|nZFFIT@vX"=n-зg@A Kl4o. a7l8e@O[o>si,&7ˁ~'67KΗ{S{?'nnd{g>t?{14�URMES0QB.s!t-pXy,+n@g׹G ڨAz8 !ab;uN���erVm749B0\_]NAD ܴ=@jvYNMW* %r{aq:OpCT\N5EwzioT>.QP%œ�]N+H_+@\6u`{ !8p\!+�� �IDAT#hBD3rJZREœ�]'d7WMdrF-W0!Jdx2&-T7Ү"rK }# wdIMXzaD2dCUE ;e�NQC:OpcwxiY16-t&B3Jr'd֪2 wZhj>^Qn,&�sIEC+Bi5'Ot-d*G Anf^^6ъi~R#tbZR.,04Ug{harGSemB׳JPFk $2b*&!w+K qȉ6qaFc�ZX˨2;4]Ѷmt#mt.( HCzDBBE7aqu!z&�DCPvyiF{t#wA6^/0B{ (A'Zm^Gc6 9JLE.NF}t(7^Y& 2(!Z]XfB3; ij)qGU=WtVNM5 ]H*ݬT/T,4]:ZC(И44s5B;/XM Ue?4bܻK=ރwbmc/787 E[Ɂ}?ǛSkz;6ye|p̕aQ`Jkf  BPo4J5uQMyO?U�@C7sӡ|P`2SYTC}ިiL�c�`6x#!~qӋO~w@ь�BNV(S '(F2DQ̍ʊ uxnEO :x-ekW@]>2T Gno*C2++  "nr}M#ڨ2,4B ҚDQ̵ml KjBddKih0(^>PBoM@Eb.TUP+n/nbqD%t{I1 ;!߆�,4]P=S5=]hcqnVDak-+a(hCvmT5s̡7TbӃzjz% w* JG) #؎d4٤Pv mhM5r̡gvNKRj|"RSAPB=~z}MLqN/`N-VhEP zBjnhsh& ˰K*e|k(DhC5Wm4W3EPG 5<<6tbYSA@B~zsMQ a\YQD!dhI 9lE!0.lwڎn[h,ռzZmz|z iCN2$Pfh,2NCudܸP7 ݻSw+D6Հ64؆PXi*uVġV^k×w x~i|ɟz螕zvW�r]KLo~A:n8앾?<@hԙ7:V;slk�o = E9:ʖj[3a;[=4ȵ\*6n/&3+;Wro\\^ Z-QTUZ/SF淲nm[]^0w"#W54UAs|d! `q@]#0ꄺ2@a +M7%Ɯ0]5K` nt Bi@:h|Ǩk( k& ;@ĉnnˆ \6dN٨ѪBNИntysŌQщQP@ntsKLAĉnl°8m`(J4XȘZ fkf MR(4Zdr[hI-t>BkwcN/*pÅF"pQUQD!\ 6*`5fk斅vܵe Domq' F0j`%g9annDc.r( 7қw>ۨHD FB06y#NذAtd&+Ød\$ "px pk(\ Xh 8e-MM.ڎ&Ӎnu@!tѵu@_FqB%- )u@EYS0ꄅYѵCȶ@omm(nCmhan` 3Q.vn4k6Z PX;P{t"X6 5E cNXRF{�kF:wswzYחGwz<YL#f9V83_LG=w+{)*J[¶D,Vv|ܨ' CJ/MIm0 d!r.H*|-1Up|.E6Rf~(W(r@}RBHĨzulMnB.1pʆФ΅No??W !r2c,(2#A1I# R@1"YUf 9l %.Lx="9Tj€Ed0u E-"0&iA m#͈l8аlpNۨa>P)Lyy=0W󨨴 0*ia.Fda8B<6#aE"1"YWцhܜ7 ˆc8B G.Nf6G="4i0tz30#~:B a�mhCCE$S#,FZAzDn~A8\V:MF%-҆zx8@i �pB}4"ڶdjl6x:G�a(Q| ĈȦ҆ JՐ(]hB#yz*R82#` fSGk{;"7#2XN$Л6(gsvOQYRPT Zn `(L�bQ‰]!3,|E ,0(hшF&�1YpxahF$CZhD60$`#"V HFX6 *#'gԩ> ̬g%gw`Mdto :-O=>]M䪧=rW}iXU.G*r=?>.'L� Ӿ� >|b7:@</t:}�pxb1 DȼK*}�:B� �@,|O~�v]'�x SdFD 8<6¢hHD$2qP=,NTBLx5(EEc>4јH1Հ1IpGЌ́g3ʰ5À+E*=,um!q FJ2uejH׋wAyF(+.N FF{(E}1U:bMN�QYur` P>jEBTB[%:2-(EZPpWwiaTjDc8�"Ҏ6�` mLSZjA_4<0ADV\4#0Ns`P/ӂYy5(K9b1f $3M!+.L9aQ�@+:Zђm4Ué0-$[%TlP7Fw9 ͈ F% 8mi!urZH4hϫAQ_I2݄HN4"i,>*݉hLr6RMAI#b3 69N(pFUh60-؆l4(41a �!)^IQI)LP \Kj"J+!Qc/<}!mӪ�/<=K)|gK[ w@Ne~cG;}_Y`<]wVr77YI7WY0d( `<CzXl&Z+1aQi8^af^Ԁ&k\A}2+6IW|Tk /Og@b͌є�5ɌHϐ:@kE^zHP:޲Bsݭq_h64,4<>YhZ4kC3*69C ІduQ5(:ѭ=TЖ |B>jwo�h6А,6iƹC_PVѕ"_U[lNh(&=K]RM̉dÙ!#,6 mVYA!xmB>O 3-TjpDaa M7tN'h%0\^PtfghDlтZRNsQ?S|| Q捉S98s,-!hƤ`:+  <lxB6<nWY^|^h܁5FŃ( yzXl6 dh5ѵ_ %(AQ^iCmẘ ;Ś60Ն=U n2'UB3۠3_x؏qŚ%~sO<nO?uqOi_x~>xmgo숈<^@#*E!=,44UDk!^VMp5Ky7U|LI5XFa>PTiݜZU'd@BEdi�-ybNQ!+JB]3ZYuG^] MduOuP}*M-bN1!+#B]7jYQAQTDwQϷP]ZYh$\PNT$dFуM?d,m0_sqbIj8Ʒ 0k٬ 2QGwj|Xu eFH̉A3B2"Bhtҝ=Ta6QwUM睚 tJ[(\,|*57J^*,`^PS7bY%aVsNNQ9fLRf h xb }نzcD59AiK%6a0SpPhD bQnVT]睤?&BY64W6[p&*2\hlَjt&8Iϔu mxYJ@قSTȹ�0;*tABU=2[%罒oi�!X(;9GXE3z! 5Ī5벌�W+,nq"d<TiHE rU׫rUVvmT Ɋ6fKn݄=|!0]`hvE|A=چYB{4|\#M4Ăʂ\E5@;XQG EG]6FmF'ʕe- +4uS6 /(ԣx힨ƒ g>�Wu6T"m(1,Ε(06 ee%l4}V]Y+ seՖ+N:XI"*h'_h-ߍJ-K4$ii)ɆPܪe]::DKɢ/P'HQ&V/{AT*k.FgKn+&^PtBYq; IzHۆъh٥6Z &Ke'CZ(s|OnC̩Onڌפƅ PS7�S߁.Z(k"Vwj&57Uѵ(+D_(6:]t�yj|�6 Qw|�5~J{7kZ}wCoWoۍxF �pMۊ�" iM�5@F�!�+5s�n۔� [3�Y�=|a�0PimT@Z.>!y//} FdafF��A4pA��QV*i3ЭK5.|&:ICQ/em4ݔBn�pHz�ꥵxB7J L7[jj:+k6Ju�z\\q� 4!f}Pm٨ZаѪj" rE,/fTFqiٕ0!f[++ubͪbFgP~uE(gU++: fW^Ä6Jqԁ;6JzW/lG܍s@.�� NZ�f �p`A �:Ez)�j�SE�@k:-i 5ЄP bkun"A1IkCўȩi2h߱�o<u_]]5M=qg}RJ_|EEQ��<Ç_w0y}ᇭcq7o׿N NJŢUbعsas};wl1<<.ǚ8΋/09ŋ{{{ i՚;4Fqs03###XJu^09asfپ09̿NKas09aKas0%09asXrs0%p09auB/ҟ߽ww^}կ~O?߬|+K~_wߛx7{'|ƾo;vs_կ~zO}w~w׿_k_SO=u>r x[_'?z>'|;n�RJ_z9 __|W###_җ>i]_xᅟx<[_~?>.,,o~G+ٟϵ'73<?/R2g.oW_u]$ySSS_�O>s=dFFF>^y啑|>٬R4223|k_FFF>O~�jc׹{^~o|߾{Bp5 ے?O|+�/}Keb3Mʹ>*uP"(!J!RDe ).I&!Bݒ[Q -SѾMM23?}}徻99׹s<ysfjj:JOAAAMMŋxyyT*@zpYYY�%Kϟs<?̒(%%SX%gϞžBrrr.]cEE ׹s��/^8usqq9{ȏZcΎ?((�3gp8OOϯ.õpQۛu9wl-[Çbbb^HHٳ?G/kkZٳgϟ?!~8,!(r L\|1// 6%6mTVV6޴BCClْz7n`%&&�pɄ�Gzz:�`֭Xwޱޖdba`ee%L޼y3J%{0mmm𿋈444@9n[L#ɍ)F#ɖ�*,gϞG>xL&w+(..#XZ�m۶|>|Ç844^u9ǏTUUf񅅅L&sxxp0&pNNvСC>o&᰻E - d2d\x 6na ]z.ciii��2\\\<&[А={ZZZd5kd-[`ϟc<}4lS_x� �8q˗_郃<<<0/߽{ GGXL&�=dff~EX]]]'0E|Ѕ�� �IDATd;w|}}=ztA(d2c^ڵkKU;i$D"ԔL&Ι3gppK �PVVf͚HObq)22L&GEEȑ#X>$+W$ɝyaEZZS|Cn&I@V`!�u�^joou*.##~ܾ}�l2g 9;;ڵ CBBߠXOO�p` ޴iJpByy�߿a͚5W^RJJJEEE�ɓ'*dddcbb.ZhԸ H *ZWWHRO.--�cmwvv ϗUSSR.]ⲵ�x�믿455x<W]]J# \\\+VRT*uϞ='Nؽ{7J\AAIH$REEE^^JPTT}Dvvyx�Xr%/�ɓnnnT*ubbbn݂-III{ٸl�7ok˗EDDlllT-[wa*:| GQ(�4/ɱ?}TCCñ744��a@ ]vs>X`J򪩩N;vԸ;vJΝ;WRRɓ'(NNNdcc@RBBB��NNN555T*8�ӧO<yJR(IIɧO7H]}}=LV0Tt{{{11 *j`` ))yuj˃t0yFQQQ*z}`jj uܹ�??'OI"JMHH066nii~:�@OO8>>^\\|T*S@@pAXXևT*U__Zx��YYGIJJ֪QT<?ŝYYY*z..uݿ_\\ԔJ8pСC/_>{,l1{{{\vMSSSSSҥKmii"HD"add011Q:uBBB;vz p{]ssԃH$AA� !!}lSSSD Y;8D"wލ444ĉ޹͟?0;;OBBD"qrr666b{?,((((( ӦM3ghRRH}}=H$H͘а`�Ó3$++;<<ۧ4D"H$#""B">t$$$<~xppB,YDRR9ؠGGG뱖I@@Go߾koocǎ.aaa,^xmss #=== ?#**J"xxx7660Q۷oTɝ?^ZZzppyO>=<Dh0]!!!njoo677c鎫`l//8==PVO wuww_fM{{{oo/L+V&/9sfxxʕ+ՠK.ٳvPڸI$77wss3l֪)::~p Ǐ)߈-ʪ?~ [YYYeAZZ�%))K"DEEJgg-[ ?eP===vv:QSS� H!UDkkϯ\u֌ r֢l <yS%QyatXhxyyccc`)7 Î8s:Dӯ\{ne"8f,99yԩlll��d2$$$$%%PUUu*{gϞ:'5h3t:�s�u'00F}*|Qdr{{ԩS ` �cڴipjpxyy1縯opppOOW\Yd ǿ{;;;ҬcpppEEEy!ٻwwww8Hddd̘LÍ7p8AY'';vpssÐ]vyzz~f ӵd2[l~:hg\G v9=i$藦h1Ϟ={ٱc4Ν;=<<XXBBlll222PP*FFF>}뽼|0l띯"%22{ӦMw;q֯_ɓ۷o,\+>ҥK>>>;vعstkװ˙3g1ePo`AAAVÇ*%%VRߨ7Pw۱Zfڴi<<<&&&_~]vmܸ-9dɒEEŜ)Saׯ_c<`7e~={{{9N;wܴi(t [z�HJJʆ ͛ ȑ#pZ+/^<};wXXX0͛7}az_}ҥK 3LΎFj\PPLLL :>>>2ћb*pufXXYYF5L޽{CCCؾe~ q ]VCC(|G? ,(//=̙'''�[ddd<<<D HhgǣkTvv6'.1\\\cttt(,,_��wze{</((XRR:PUU5dh4666AA544>AR'((888ocz0CY_QNNNAAA o᭫jgg�̷OVSS7h__Z֊СCpcihhzjCӻ`ן=:fv+Lwߒ.kD"shhhpp/~ b,((khh4mۦ._]]]*\CCcIII222nnnN 7rp8CSQQQVZbJJJ_#ll;t��6o|ȑSNy{{;88I8@w<xŋ3;w!!!ߺu'''s熇7nuKK%Kpd{{{]]]:߆III/srrRSS͛wСXɊА/+25k֬ZjxxÇZZZhhhPUUź\&MJKK;w׏|7) PTT)!!2| ,-XT0 :xÇtzHHȇo]rr2B!>p NX`2%%%!CCC>z( sxmbddt֭իWG rʁ.]`08 ;wtssFFFL:U]]60%3Ƥ8nׯ_߰aĚ5kucǎ;vi׮]...۶m7nܘ3gxFRR),L&2,,֭[t:N N<y-[lݺNÑ;uԄsss,]+++8g8>>>Xf N:22Q^^ O]]ӧ6Ǽ;_S{ /^|͛7agϞes``𰓓Ӗ-[t۷>kkkedd ^~_|L&_~-44Ν;#`ww7???'M‹/-Z_#oatt4 db"]ݻGѬ|||Ђ74&&&41.~ȈԱv&MS333?533c]@|{+ ?TUU;@|ׯ_ak@@ $9@ A @ A&@ ?IңpC@ גgs$99Y @ 6V)**Bz@ rSSS'M@ O?''@ p+f!I@ I@ Hr1qA[pT*2C3(((Gv@ ?r&8nڴiݻw\\\CCCHr&L&s@ YrDEE{!>@ qr222"##ᱩ?-444??jjj`05[wuuݻ+**8p��PXXe,fRRҝ;w.]jnnCRSShӧO ͛73Lx,"";a޼ybbbbmmc_|իW..._nnn===aaacN555<x}v!,_yꕗW{{9o||)..S{f螞''ϟkkkGDD?~�Keeeqqqgtt3gߟͥK455͟?�ppp <qqq޽Ѹܹ蘛KJJ~=|0..N ommuuūIL4),,,((u|LcǎijjN2DYY9660Ζ-[ srr��Ǐ <yGmm-s~~~}}}XVV�#G̛7/ B8;;&6lpvv644,**JKKcphh+�ɓ'7n��p8x۷&&&!!!00==v><4<< �?p8ҥKرӧ}*5**޽{lڴi/_|⅌̵k>UYY/##J��vvv111lll�xܹs0ڵkܹs=[[[SSӋ/l߾˗YYYw^qqɓ'ϝ;W__/a2k׮!uuuN:Ғ/## B-R 3--XAA�xb }ݸq!33Ʀshhhڵ^rpp033ٻwoyykcc؞={߼ys@ ,ZаMIILJϑkkkKJJS׮]KHHXh?9rDUUʪ1,,,..*zLL NCLĉBBBx<+99͛7---ى...%%%---k֬�c 2eJ\\{FFȈ_LLLyyybbbMM � 11J&&&n߾=22211)&&իWk׮ZjUrrݻw6o\^^@&#"">+"(d2988D">z())B9 ӦMXfӹDbZZ/)NOMM766\jUNNܹs-,,ao[[ێ1C#ϟ? RSSx" 1Xxۡ/\@Ѷonkk}U82o޼]JLL}4illvڵkGa* kkk33W^ ̙3Ktpqq\rҤIeeeG=tP|||aaqyyydddUU՘kY=y򤆆Ν;f͚5iҤ[n wtt edd~7))sڴi"""UG ے#//| �@uuGhkkoݺ dXzu{{͛7XOϙ3L@@@CCҥKppp[***X:u*�k׮>P(:rJ"iӦ')+SL¿MPttt��{y-øvub3gĎ-Z422&&&8p�,?,9ׯ_]lٳg>|a[>xְykmii~TXXXYYҥKiiirrr0<""۶m[l 9|DDDbbbõbccWX ݅ 2̤yYYYa^1ߗFee/Z Nyyx%GMM"~IxL fΜ E}8N@ 144<|p``[BCCZ[[eddttt>Aԛuuug~/_bтOLLL v܉kjjjmm�`jjjOOOyyynn.SWW'ح|x<3̛7/%%944 ]_r3gmҥ�MGGLZZ֭SSS SUU^u?#97nd2qqq]]]/vqq9|PP7nhnn~Aaaa.ggg___77k׮\@ DFF^hhhsrr_ .4iRTT vm6ww܍؇5SLN 466JII}ɭΟ?n:;;;(6=xb̙0!:.))%kjj:|lll[[۾}.]:<yАBvIgϞwȑ3gμ~k𛤖gڵ&lٲ+VpppTUU=y@ d===:-%%M6yf```֬YUG &8088ߟ`eex ??PWWWww7 qss JJJF푕mllvVPP`0޽?988�---\\\YYY666V4{BD@kk+77XooАF{� c~qqq..futdeex<<&þ옧bMw s񵷷`Vvvv�w ...qqq�@__ee �{%QQ~ NNNL19998'?njjUG #999BBB.`0|||1:~ <��l^#X/gccSIyfճf .Y1 c0Z�<i}*]VaB)77GÜh*<<<<<<c`e8cԟ%k1Ak***CCCK,A.@c ?3D g]`dd$** 6s`0( 9?lll@ ? Hr&֭!/G&@ @ A mlI�� �IDATI@ &,h@ ?%p#4$9|tmO$gbƶn::L@ ~x<.$_d ; l%q7E|iii ,rZ%>%%ettĄN'''DMb`~ ™ݳgpTٳghׯ_ ZXPPWRR4i rrr:;;a9s0 S555ɩ@k[[5kքaw=vظVhW^400qƉ'a4mmqIӧ=zt}CC?R]]}INggrVVVUUÇ�^300PQQyzeeo޼Ȉ޹s`ZZ׮] Uή}S=|֭OF%7oL<50//dII/^h4nnnrJ"800!//yfMMʹ4[CCCVV�@,dzzirO<-,, ÇDܹs<y; {Yn]@@c444ܠ`SN?yDOO;==,]db{9sqq-\F%'' fddHIIl}-0@Lɩ:}tnnEqq1 =|�DXtm<==[ZZܹaÆQ ,ذa˗/SSS�===/_ذa|PPPRR̙3+**<~ĉz559s渹嵴��;իJWWW"xݡ! 6?~<)))'''((hn466fddK.ҷojhh`s׮]1cLscǰ\x166v˗/|EHHDڰaÌ3 6l`ff}7o��JJJ ݺukӧO6MMMpႮnXXXaa!qss<p@WW?rܹs=a)''stLpÇꄅ/\`hhxׯ_;::jkk�vܩOp@pqq###Ǐonnf-޼ysgiiS***8`jj TXXa<y$:::::Fݻw]\\D :;;<Ѥg̘a�ܹsW\1k* Ȑ/^ a5޽{edd)) x^^ޕ+WJJJnǎ.ޔ{zzB?ϟ?s̈֫ʺ��ׯd#Gr>|֬Yf͒A߯dÔ)SlllXfÇDDD�?~�`۶mzzz^]z5'NϭD+~5kɓ')߮`0Ο?ɽy&888===99999ɓ3g0f\\PWW'AA={67��}}}EEŦ&4{Gr 6W3444:O@ ^Δ)SZիWO<ijjw%K>um۶:uٳ}}}OKYY̬?''MSSs֬Yd2955uxxXLLLKK+!!aԩEEEwܑƖqpp ݹs̀7o.] e… .?KKK׮] E͛7n1wϿi&QQ'''߼y�PWW_`A^^3+@ ~x<544? LYΝ� TSSsrrRVVpSLecc՝3gH={6;;;ۻw/;;;B�pssS(mmm'((oՙL&ɔZj"Lk…::: CUUPDD`jkkrqqȳg޷oh?o޼p eڴi��~~~ ),,LPp8ICAAAVVlljjjBBBM6 ~ƦNL&d˖-<<<0]99kbJHH2L===###J KLLoW$L&˗iii8088ߟ`ee}ruuF/.`0|||k@@ 4N`⧡]HHIDKH$ds@"JHr& eppp\[< .ӌ$gb8<<@ h�@ I@ Hr1qA~8pO5$97oDF@ ?ӧOWTTDHww7H$ 2 $9Ϗ@ ~899D 94}�@ 㐜{)ӧO'O*))İܰaRNNΗ߼\IIiŊ(KW8;;/Z(??? ��988mNwvvh4%KKΣG,--xyyo߾w^@,Ύ;$$$>|�z9͓0 �TWW��rrr,,,P į+9 ctt�x<NǦ+Ϛ5ǣpk##/^(++h4))іҶiӦHT�P į+9ի?ud liiR(W$maa�8@ |"( 000@z{{yyyyxx޿�ht^^^,`x111,pxx8E Dk ,8|jjۻw#""<==`>QQQ...B wϟ?OVV�ݻ"MMM��ӧOۇ2@ ~Q�-[,>>~޽��QQQN}}}iiixxܹsbbbܖ-[Ǘ˛E"-[foo�ݻwE11333331;vرc�`1_B233? TUUFY@ z/˩QRRAE W2̈'@ ?Iȑ#Ȭ14;Z@,쮠zYg# ~t:}ѢEݮ@ &8hH__2@�E@ I@ Hr1A~8D"_#_WLB o F-rrrHr(..FTUUŐ)0/_,UVVF<d"PdE$?32%VbggE@@|CBB��6mBA {-ܹs.\!..uAII Cn޼ 7_~�kee5&~BBBZZ�JWW t҂ ?|o9s[neORܹ422211�<|0##�j*mmmx6""�}v)) h`iizϟlܽ{M~zuuugϞmmm~=zcdd$1/++�hkkZ >~�h"CC1\v�uVyyySG@"?399lΜ9vttۛ{/$͛Ç䨨~zLgϞ pss0ݻw{zz޾} ,--Fc³ T*�pݻw={T\B"%P߿`0Ν;7S"""PoJJJ`EЏӓe˖;wݻz˒{ǏgeeMMM ۷ow+,,`0<==O!!!7n܀gccc�iii00##笗\z xb}}=k),, -H刈 ~ŵW^XooI&qqq{S>LJJjjjzꕝۘ6 @ 贶s΅w߼y3##cʕٜ!!7�\\\MD$aٱ&d2�ua'OI`dee@''S*))KJJ�(|}}}=<<_111 �M}}oʊD"a?L5k��K,ٿ?vnYrUV-\pڴi�#GvtH$ �`+W-C)** nxl``�_GUV_~=++kZZZ!!!eee{QPP8qDss3`0v~QQCן:u FSWWΉ,�̟?¢)77D"UTT=lْRZZ �طo߿/ WaaaX"%$$TTT?ɓҙ'Nprr*,,Yᘘ'''''p''/ecctR@)))7eee֭>sεS8p :99m߾z{Q{s/^?CVX544Cɓ'7l�'sνp႓/.9'O3`ڵ0sg͚RWWW^^^l?��A9u�'OTjjjӦMKHHprr?>YCCC@''+WbŋO޾}{R ܹxĉ xw�莎cǎ]xQMMB<xedd۶m~ASSݻ)XHHsrr)𰯯󣣣KJJ233:IP <==) 655y{{_|yԩ Ν;TrPQQq0ѣG'NPWWPQQtrr255-++sww)u떿?77wCCûwӥ'~ҥKI$ɓuCCCNNN�@XXؒ%KLMM mۆEhhh8{%K͛zٳMMMMMM+**ԕrss6Q�񑔔\b??̣gϪ]x· mhhhkk�̜9:gN8rJxvΝ{.^xɒ%��>>Yf}>!%%%SSӑΘ1ԴF�<<<<<<&ӛh4ہJJJ UTTrrrg̘aÆH9s[[[x:W\iddShIIIֆ0Ѻׯ_ ۷oL-%))imm-##fmm-""m``pܹ[[[ŀ_9c �rJ)66|Ǐ|۷o :;;ccc-[&..Rwe,,X�A__;f}}1cbKK˂KKK�Ǐf̘FZZrV ^ p`= e˖Fс( <kllܹs',wxxeݺuXE@@�?j~~~EEV>1`C6,,+,,LGG6&27nxe```JJӧO�wܡREEE0}}}߿~!!!###www8d ԔubQeeu0(LqƳgΜ9hffoadǎ0ilFr,-- BLLŋ۷XdhhhϞ=&??͛SL.OhggڴiGϟ?/))qrr;XXX|X?Y=ڵk߾}^Sagg >@ qooo߾=1n_x1|зob,_(��Ϟ=�<y\HHh޽111X'򣈊b*...%%%%%5uT&QTT4oZo~ΝO[s42SI$>JJJOqo�2OA977W__?7&¬3/_d>{,&&oݻ4`l'W^999MIǏwuue2Ν+++ ?5666<<QOO[nxWYۅ-agg7dbb͛Μ9ߵkɼ|ree嗫Nzzࠁ8I�@AAѣ&&&O,))9vwC'aaa-..իWkii}=_~xbxljjm۶{h4{{{;;W³K.L3sÆ """qqqVVVt:@ �, MMM??̤$///ccNxvٰoڴ)22ZZZb^OOO̥v99 G...;wܳg1^t f5tݻAUU5<< k$L&sxx+?W\  :u<sNXVcbb`eˠhhh{yyS7oVVV*]__®IDPÓ[ZZ988*++]Ӛ+VL2Ν;mmm===Νٸq#''gxxe||mK�|hhŋ/_.** lmm#""VZn:+V@? @ vww'$$|)"�RDDDQQNRRqoii|***sl2//<ggg++;v޽̌SW񅇇éhQUU}GY ---�(**NU(++-((PUU\3<<[<yrwww{{;p&0QPH$aaa�@EEEww7zޱo<44cggg<ʕNρRRRLMM?`HKKc!pUII v[KKKeeea_PP�@[[3LAH$jjj ֪aaaalvuKK FFFjkkyyyaʒ>W[fttoCx,&&BaXuuugg'pYYYOO�SiӦQT</##3ydDRIXp|XƦ&996XKTVV/KJJ[c2PN'??oo/"A`466vtt h4Pr?Tr-ܿ+9+9ߝs6Lr~Z.6os"0aaa L&t k?7QWW:d�� �IDATK>Ͻ Sn}w+!#|Ύ0TT 4x< "��qqqsssTHr�a p ˡ===_1T! G @ A I@ &.hWu4uu<0L4eR$9?hEdq㹹{{{) N_z}p8==_3H[[[\\ܘ%.\" A|WF DDDJ 42ſ(Reej)))yy�D"cvuu}_[[H$Rԑ3fʣ%%%Yqq1&�I~�8> )yyyC 3g΄###ة󴰰 ��f+ANNu;CCCyyy4XHH744KII}xFaΦ阅' ]]]^AMMMuuuYEEE 1˳z �V...WWWWkk 755tYYY,n7C`0,iӦիWX""";wtqq9~xtt/Duvv^hvɁ>}8s̭[)((X[[wtt455}$+ ~!$$$==8::jhh .tqq.�ZYY��lmmMMMyxx%$$D" ###^^^o޼?ث8::%&&m�666Q#777/ZHCCŋ�K޼yȩnڸqGwݻwozzg԰˖-[5O4:;; _xQ[[o߾}l{[ ;;;=<<uuua`fff@@@?�`Ϟ=/_8rHnn.FTjff70򂁕ZZZZZZ"aeddĉׯ_%P(Kh YϬ,6ȀBΝKޠ1zzzP>$**JHH�YYY;v�0o<uuuիWY[###AAAcfDGG?z�>}�%K>}sssaa!<VPPPVV&WRRР Z]sLMM�yMXSS҂5b VڿG/~nn.2dƍ)))W-!!2<<wPhll `}ŋX`xx�ׯ]` am8YYYUUڊ %%Q?7FL-""RRR`̄Bرќã)((~c}X<yrZZO߿f:lkwvv�bcc.\bbbRRRϟHp\\\EEkxkkkbb"�@FFKխhhh`ΐr\`''g\\\KK޳PII V?ބ>x@SSVII޽{N:~y󼽽֬Ysc:]vRDz.EPDET@'DM,y55bb/&bA4)tDzA:,1(6D_s9̜3gf<{,** ^Q\\|ݰ+W@wŋǠɱRoߎMdĉ?O��??$Jmnn5khbbBR=ztE,qӧO?~�33^ s7O~uSS޽{ccc`0߿lٲn bŊ;wΞ=ǣGX,VBB˗=<<#99900PSSsǎW\L N:� .>q�ٳ.]s�~-%%ŋǎѷnTUUWX!:eG9:::`gȑedddjj*�Vd hbbMA:::LMMϟ?gFe,--F*'O\dɉ'Ξ=m6###"tRRRҩSzzzE*>>ĉk׮9wÇtg�100˃z(`ggU,lnnjժgݺuЂ޼y?11ٳǎkmm�ܹ3--~TVVP(_�heee}ܹ9ֲΟ?M޿s_>===11q:<:^zҥ#GG::ePWWR=|:a?޽{6mMν{`t߉J wU<yݻWtsd֬YdIII~(?˗---kczO<RΝ;g̘qFlطnݺw/2#vqq (,,/F---pDGGpEϟ?zjR]]xZZZlgKKKrr2 yhrPRR= ޓ/_;v~KNN.//) �>@ə4iRhhӧOO<)//7|_|98͛h#bEݻ{zzޘÇ322nܸ%Hɓ?c@ b8 Guŋٝ<y2$$.]5 >O>}葊hPV``˗/]ׇ5?nbbr9�@__�f_) c1cFQQQUU� N-ZΝ;�7 d2YYYq?m4�ISSP(.ZFOO˫ܹsuuu\...iii)))ZZZ05:uCvƦ/(++ _ߘ7%!!!T*¹TUUg0440agH&L񩮮>wFsqqyt233{zzoX��@عs'rP񤥥]\\LLL\.áP(nnn>>> /rrr8w֭x< 3 /M䜜+++w 7_i4�TUUhsBc0iҤ:rJ8ꚜN~lP(𫜜nJJ FՅ4MMMCќ}DǃQ,#0'H0tFɅr8UUUWWWWUUUTT,\P]]]FF`XZZzzzdOOOA;&<x<˭B y<<V'N h4ӝ��rrr n&9i$l'@77Ď믿b=(^|>_RRpUWWLI[[[YYF[p'D7VVV677daa1k,8eWWWajj k L4$HL&Ņ9:::88Yd2 O<IKKH^EFF̙3K,Ax=kMJJ*((533[t{` pdXCQCVVN m=޽giiYQQ8aė�29p0+888 �@ $$$ޠbR?0x<ұH nnn؆GVV`2pS^yp/פt 29�7E >Bsy6L@ A @ @ /@ o@ Ŷ\.s<x38n!JyyyOO1291nx#<~QWWnLG;@N'}g`0`"E!9^ɼy!'29wARR x[#%%·F# h]@ ƒye(;/P(˗/�֬YCPXˏ?8LOOHP:::)@ `2 r gD5@b-ZtI,ұgfXG(p8>/ a~x<�@LL @3\.:sLPPLp��$T�?�<bl>O Q&58~ڱcǰ_7o|�SSSl̙3utt˅BJwwRM1^m0q8...ↆjjj.pttby pzzzzzz\ >|�ŋ=<<cbb^|+SOOOVVVNN)%0͛WPPaÆFќ�=�BCCGxzwww[[ۀS***eeex<\@ ݻw7#/S,oar͛w)ȑ##dժUD"�٘"doHnrFΫWmll\7ijjSCZZZy3 EFF˗QQQ4MBB^RRr…!66iBhii)//'LPPPPWW_Ȍ ;;;>LRh#++kiiZZZ[ZZ޽{~b2eʚ5k7nPQQ133A^51Դ)G={,�?|?L t:OJJ�#H,`"Ȝ9sfɒ%H5O8@ h{.&&--r?.O<<yt:] ߿ 81J @ ,"0X@ A|Dp8@&q\.x {J9�}BۑA qN/((G@&@ >"`0 x'GEE&G\\ }@rL@ A @ @ /ё@Bxl@ @r@ A2P(OLB&n<Ĉp8HF}}=@r@ (|�@  @ A ]]]yyy_fD4DB#4| 999,, hѢov.[իHQ;vX܋6m<�lmmxIXXXrr0썘#H# `YjcQQQHmr?~a۷�n޼pБ\Jt3b4ɌzH[DGbu{zzƇg|>Ly_MMy͜9ѣGha2"Zooo}}F[[[kk+�ĉ#>>�uVggܕ+Wz�ܹsAMF|hхD�[ZMyׯwvv... uvvnll3g΄Z CCCcxUtt4xx,199&ayO{� l6ǏfjjjmmW__l6TAAA0[ii)?�✝<xMggs]ps]x۱bpB,.bp8Xʂ VA//}8pٳg}©S>|Eݻwڵ'Oljj*--]tiWWźv;&##$%ߺ+}Xߩsϛ_]IPZZhѢ#Gl߾}ٱ999ɒSNsNiiieeٳjjjϞ=sNeOOϭ[^t),, ;vl ,عsիϞ={֭'NX[[/^?&&FSSHd2BKVgc!/++mmm)))AAA VVVpBffq8mii˗/I$RGGǁ��K,o~͛7˗/۷[x[vޝEP\]]Z[[SSS,X09RRR|͜9sTjxx+W-[nݺΞeee}}}YYV:/innmllՉD"�`ĉIQO-UD` t+8nҤI#j.[__uuu q8p8\QQQIIɢE&N_UU陘(--{Y##'N0 ee刈&O"*++y<4ވZqq[YYY}}} .p555=<<$$$sɒ%??/''׷iӦUV)++KHH755F.ߧfff 11}}}IIIxS_�HJJJJJ\R(_画t̙3A F</BkH絈;:X7p(mmm�@WW�@SSѣGkvv)zl<ؽ{7��mݺu͚5{Y~ѣGg̘ -~kkkEEԩSX\]]ݷ;?Ci@-Z&###''�?{,F*))ٳѣG��wxӦMsvv&0NwSx69qqqW?׬YKA2�H{xos6Z6 iccsUD"EEEmܸq{9s�222222T*u/^9s~cXǏ '77WBBb„ o[Fii錌 `$$$D]V1nݺ7o:usϞ=�@eddL2իWeee0M~H2q8.hcdں P 2CMf9nYmmm[yyy۶mc⊊I۷O81o<:t***.Zںy&LNOO2C~~HoVQQ3p8EEE6mmm 3%%E[[{ժUY EEpkk{t###(&ӦMϗ\.2ʙ5k֙3gV^ |ڵkl�`X??N:5gΜ7n <##ںE >6|@lۥҾ'`R&\TTdllVWWc2ՃfϞ&f̘qQ<d2lYf˖-߽{E6lذi&w…3f̛7oΜ98妧:F ...?DSSSl j8��uttԄBF||Xll̙3aI?%?ׯg2[XX;xX,֒%Kx<JݻwObb7|ccc8NMM Djllֆ7P(H$`0bbbP>,B݈onn5klFִ/? qx)V{rvyꕓ EEEx<b <<|h8$}u3[$Ţ:(�� �IDAT5({�SUU}˅k_Ay9q 7K?rw B!J555aP8L^VKvi"5@c @  b|kP(Ė 9L-MKKKtt4@&;)))o1L0Yf!9  @ 29@&@ dr1vA᎕D H#fձ:MMMqqq$dr'/^@r  ERR9C!jjjH[ARRtQLLNNϜB4Fuuu8F@&gB 8$L&z6Hto$??I^^S1F9wܱ333===\.ȑ#)jjjƱtSK,�TWWGFF�,--gΜ z1�@T/))�"LooٳgEStuu>ȟ:uN_~,TVV޾}ӧi��<.\g$hdTVVK.}wpb6mtaqqk׊fnii|hk&<,,lŢ&'--lr¤֯_�?AhhxU־ӧOY 0x�@MM͛7bEEEB/+++%%ELL ��w^ii)!!!LOOOXX+DA8~WV^=6MNmmիW+++.\ۦgϞ߿_ '%%eeeO---aaa&&&ׯ_ڵk6ҟ'ҵ=ClA0akڵKVV4maaarrrLNsssXXĉaߴ4::Z(Ξ={HAAݻwINN~w^NNbll|ҥNSS6mRRR7o�={ի5557`mm=gϞ=x')))55u̙yyyAAAW\WZ N5`y1ꊊ]�zjBB_NNݶm�`׮]� !3***r.//z*<y9sddd{zzzxx>y߿`…'N�<ymÆ c2HHH&>~x˖-7o니={v~~~II͛͛ٳ[n"3BH4|Q?zr=ztÆ !с|ٳggee=|fquu~vv󭭭_^ZZGOOMMMk֬QUU ݽ{썍eiiiRRS8pB$''ٳ"***"" �p刈vGPϟGDDddd��<yQPP��xQDDDee˗<`0(۷wo=ھ}O8PQQgϞd |{GDD@NOO(..NHHػwo[[Çwpĉp";ck׮3g455]VNN.,,N_eeeo x߾})))eee�GDD444��n޼uС#GP(3gرcr`QbbbD{˖-sss344ʊ^|U=O? kڴihjj]>>>+W}kRRRVZ5wdѸgϞL4i׮] MMMVloo99={L&QU@200022;wʕ+_*5ܵiiiwTjWWעEbԩgNHHΆ .,--|rzzzii)RQ ::Z|ʕݻwJ̵vvv .,))Xvʕ+<XTT`Wcמ<y~ƍ׮]555c888eee(((AXWW�χgΜnаs~D"Ʀ3gNfflЍ%fffVTTlڴIWWwŊ'Nؾ}?8 %%%[K?"󑐐kHSppݻ@g0۶m��WW׽{i,0Ɓ:::F~MQQQrrrppkEElNNNFFF/_nioo;w?O?|tѱnrN8!--I&ɹqơC\]]KJJh�PXXG,KZZzWt:EDD8p`ԩP www�֖-[ڎ=JPƔ<xp߾}}l+_|ɘG` �ݻ0 8rHUU젛۶m6o<T_}˗/�ϻ=ܹs�Vb0g@lvGjjjp_]]moous/^,((XfMwwp+--aAAAw%/^looONN urr�?~<44ΏǏ(|~c *7[l zmċ/b~6&%%;HHHDGG|MMM''׼PggӧO\x1&&|Ν0h۶mΝ#T*ur��'N733wL믫Ν;TWWwvvzxx߿?>>b&&&۷o?,Y ]oݺ>}Z[[qFh䜝###7nܨյ~MMͱv ;vJJJГkii /22&N>�߸q~~~&++7^vmɒ%MMMӦM%$$?dddTUU5ի7oBRGcCCCqqSԲzڴiQQQ?#B)((ؾ}�buUUU-�hkk߸qcݺuf;;;<˗/_N"x<ޥK>H$e0111B ssF&iddTSSS]]mddSZZ jiiioo:88fffO:L&c󓒒d2gffM2+77fP(s]]]eenyyyCCfZ13g@d2fhooxP0P0!%%qV og[O(aHL��---h 9E477[[[uvvN2ENNɓ't:5;;f{yy#gϞB?6+lll<aQ]�)**~ uBBXkjjzWjrݐ ]]]=)iiiXeڴiD"CgϞ)**ջEEEfff X:XÍeeet@ ߿LC69_ Lc򼢩&UZ[ ȣ_grж1RTTTd=\%_ 291Rd2LFg 3pcgniI7tvv0K ߒ.^xLM8#JJJh ##Z+٭ZTB$BNNnԩ s܏ga2Hǐ$ǃ@ HJJ"5C| 9@ A 9>:Cڀx[tn}C 3`Ǘ!]%1B022rҤI9R{ٳgPd)29DQꝉ[!Q6yg]"G4@ drL@  b2:QPP jkkUWWGW~hkhh}x$ ; իWjjj===z �Vl )))�@cc#vГ.g #?(\n]]UBBBKKKɠ()" EN%Krrr׎nyyyQuԔ�444`SՉ@ �Iz_(^( _,ĉD"�Z TUU WqD%,##>8O{{{OO_1"tRyyyxggg]bl߾=::^lvb 266յ$-- 0RSSuuuoݺ5@-[tݻw=zڵkjjjmmmAAA7nd[n-,,khhؽ{Eږ,Yp+++_VYYi`` >SLg0 lccc; yٲePmۖ+//ظsŋ.l6{ʔ)bbbDFFB]ə;w <l�yfړ'O=z~~~6m*../.^X 䊊 *RQQ1uTccc@*//]h1^p8^SSpª7ozxxD/// -a֭[;wѡhfffc9r_q͜93=====~r_ӏ;gccsdT??o߆/D"yzzΐqqe˖ wǏӷnݚtSNQC=x`׮]nnn7o]zuiiK544ϟfSSS̙iE?h+V`?ho^|cǎÇ7׮]+++C5�yy;wHJJ.\;�IUވrڵֈt'' 6\IOOWWW;w.Fqqqkii KOO?sL~~ƍ?x<^0deeFsVX!&&fcc_c`0T]􈈈# zUUU~~~YY*))BX/^X|h4. :y ^ڰaChhw}WYY }2OT&55ҥKx~� &)#;wzpN>}ΝGΘ1�w^9ACCҥKWNLL6mڴi�×_p&??_EE[=,, �~1*K//m۶aݸqʕ+fڲeKJJJBB¦M֬YsΝk׮=z<x@WWK]]СC;;x񢖖֕+W:dddѡ]]Q崶jkkq磣<B3 �oX 6ߟ{nh---iݾp:;;1 lݺuOrDi&>W_}nN8yX7n<|,X�fyӧ+**6nXXXO?9rL&Ç=)--=vXcccEEņ BBB ̅ drjj*NjY,Vbbbcc|ɮ]ϟ?^cǎ }:}tz[nǎ4iҗ/lmme2cN: UAAaڴiplᅴ8uT||ݻkjjA]]i}} vXϹs(ʷ~㓘H&.\��pvvnoo�ىڛCeffرKOboob_KKK􌌌;v>|XTK䔐��IIIILLxc-,,Tjnn-[7O#VVVܹĄ޿=o9t萣iP=$_K.]bڵkO6}7n`W_|yF]]]SLyM6sss]]Fmm얖''7ڿLdeeN:\m۶mڴiΝXO{{/Mh탮 [[[LV\\]]۳srr FrǬD( GGGGff}?ж_***^R:::vvv�PVVFRaI&&''?{ 777zxxTTT$$$Ϛ5L&￑<H$~^*ZUUuիW[N ӧ%$$ �ͦRaaa˗/矱1XYYAu*++9�ӧXgeee||/ ٳI$R@@kרT*"ɳf͒1cFqq1JVQQqss ߼y-[֭[)SVUUQT dll /2eJfffffP(|Os?tvvb=!;wl.[YYiff68rNNNp7߾>111�IJJN:uĉ؃xyy!..ǻūW|}}-,,|}}'M q^__UVq8Kt</!!Q?kkkTTTvajjfaÇfΜ\SShooСX꾾>##,x:::uuu47 beTUUkf---edd`oA|'�>B˗uuummmaX CEE6ĪU9fܹ, 400{eMMMSSӔ)SIII77ޙ3g_[[[€עH$n544|||屜&M>} lmmk.===(1"|3gHKKe˖P(63c ))f###???hmmjkkr{zz&Oomm rw-Lp8Bɓ'iii8bz{{ FLLx<`֬Y3\#(##/x_!b_뵴t@~XHJJڂ@'nMp+V@3rrr2dr>':;;:7G ށs�QQ|29㟠 $cڵH:�@  b|kFrx7V/''� xkAjj*y1rFFD "`2NNNH:p5}-'o\@&3~#2_B@ C|v�@  @ ޞ3ᤥPAa19L&Ν;HFP!L@FB (d2YRR."HCrx.@ Dx%힞 3ɁX,@ ��999bXSUU<!09B` A#BBB,..>&...-----=C&##? I#/_I~ @ qqq"(..>yd1Y39zzzⲲ2 NNNC^C.,X��`݃{{{�ÕL�� �IDAT?~ utt�0�[[[>"n inn�JWWV�<� &&L.X�x<,\FFfƌ�d�O6Mt<{=6}%HӧOjjjjii=}�occ�(--fmmm��YYYMMM0SII �ΝK$Badd{*>5##~$qm%$$<<<>|�PPP6m�5-- f8qɓ�EEE0�]__��Y(L˟?u` 4uww/..Rf͚ѣ~h𳪪ԩS熆gϞBjdd6cNZRR!K,CñX,C&444>!yyy𫹹qyy9b`` ^z5r,T.006s̹wCtt4Vs?~<a h```eeUTTdiia@ wHHH_)3:bbb \N$ޅ===��__߄` "p)))777JJJ'NDJMM*. Vgx8̬ƆNDPKR <~Nϝ;7!!I!ϟ?_4$)%%<ë訫DCCCKKϟ[YYq\hgg' jkk��^^^YYY7}[&N oalllaaQ\\,&&foo/ E--6"--m̙^+7�UTTͱ &ۏ)Mx<^4@ ;H{c7%..N&H~kǚ@ ]@ oqTTl p8�ÿp8&r|qP;99=ydpa_CRRP( Q nD"˅сP5q8VLXv(9\.{@LL㽱VaQP109a2H$x<hr>H /� --C (k},@ 䌩P`"bbb3˧ߖ0@ ^LsD 0ಀz?wuu=zh@ �Լm0afkkRvv)HĆ'OCL8m4UUX''4l&<֭[ou.[ZZjooىu<<<( � >>Ν;WRRJΛ7֭[5"##o޼I&gΜa%%%u&p0MNN611`&g@+IɩӓÞpm �L&ݾ}{ 8ilPp8ٳL=/X͛B0!!ݻ/5333p3F!С%�挎Rp8"XPP�srr@ݽL1gΜD >񢣣CBBݻ' ڊCBBӱQ ®%Kp\8hׯ_�iӦ͘1CQQkZpppdd$pVVV!!!jjjBvԩ�3f<}{ܹ=b0 ,c:a…nZd Ɍ;wntt4t7EP7yxx|QRѶdYPt^!??"g̘28.2c ltu- XvXLL 0Z}*:8NUU,))?6322B�Gx<~pSl6ի4-..^zuU--Oթ222*//Ϸyyyx<866vcۺ +^YY ?~L MR/^ %T7ni樨(III`===#i7Gt&&&&ZXXycr*++  vvvvvvX =gao��ϓΥH$zzzfddsÇp.gΜ9D"*Dχyt:ƈzD퍡!L:c*$ c6ƂRRR貳|vMMMKK L]i&HS `0_.''7cƌXy<^SSL>F<X^@Յg=~#' �~N utha\\\`<?mmmyͪ rJqH$ҐaӦMrpXaLƋ/&Mdll\RRbgg.>>>\.}iii4M \zu t.M< sb~L2? s˝?alllp 8-$㽦c]&(//oggC>9'NTPPrpzr@Wŋ_~@ ܼysXYYyFҤI]]];< u P(Mquuk3gv+|S00xppl6{#-- }03BX,8|VQJJ ~L&S(r8ua=%]uO}N(0�y%Orl6@< c23 $1qflX7:bx/111Liİp8|>1l8xe2D"}3=h>L:E_+ctD<Sŋ8҂B&LZ$f?"1H|c-^tLNNNcX[@:upK ]{03 qqqn~fva;@v`<&9\y;pDEfaaXF 6RӦM*[ d2i4Zvv6LlooaMMM8&VWW�JJJabAAAcc{XLL {W^aQ*j:??geeq+ qqq,ݻśp%d0ڮ.^+f]][ͦ0 WKӡ61z9WKK 4\.WEE+iii)\bmm t7778ٛ[u9 RyF7JA4|d�ŊڵsUUE~ⅅL˃ˏ<y *-\.WII {2(VqYrabcc`b__tvtt`w]jkGGGFF,&lVs�� Fsrr455aEpuuKIIqss{`m5\W^aZT__}56 -=$fee999M4 �I&O>]BB"&&&00:a� J ۛqyI$A{`0ݻd2KJJ;8hb}p_ |LDJJ =�gNMMSHx$8n>_:AoDSSǛ<yrOOw5bNz#--=4Ù^ˀ-:>r,XXXz w@"ɽ'O.--6@ TTT|ns!&&sbSSSS�@zz(/-x#l6㵁0v >>~,q: d&@ F|e˓g'%%5!iWWאxC3{@c p8l lr|>x11z ,k@ Z[[edd0~xIFFf|,TKKxjUUUT{6풒d |TYYY99'Oz{{#--}+++UUQ"qq<off6>JD$[ZZ^x>n @qxjdee/q{|2@ �K4lD ( +_W*++EjUUU%f0177<ش>|Fϝ;v%J}[착nhǰ;-X@�@ZZ4#weؖqyyyX-GG &d3RR/& ϣbaM0)--_ÇN*:[VH$lۨ^LREEs?` {NNN01)) +p!22rp b?)**bOW:_Orr<r]P QVVMMMp}ZPP --m``�fff***t8 �ݿ멪pI $??0� %%.}>}ytoǜ?eee}}}abkk+ vrr}+++�@vv6ESSsgptuu`*Z4NN\TXŁ̞=[RRrȺ3:PT6ۜ311�@PhPό/#k9HQi%)iCQmJi9NZrZ-"[2';!c1}Lr:_3<u}﷎rFF$p눉122BBh@2!( [b?~QVV饥|ImmV_3d2B&lll l9s߽{'((LNxxx\\ ~:&&2ܛmmmZɓ'UUUTVV>~&B"'EFF(CMM˕bccccca>jmmCAAA0lLHx5-ZTWW#PV3f Ù6mZaaaZZZtt4ި06MMM^^^<x�X=88KDEEl6(f0<<5+azzz鑑\*koo/""ݽk׮e˖ƭkkk=zToby_zǏ'&&BKOOYPM+++PlDAю?naa&۷^jnn0qժUϞ={5 TvZ2d2/7o  ˗/WVV*---vvvbbbaaa c޽-%l6Ҳ>44ߗO7n>,))/_\_WWbŊJp}YXX M>}jkk Mo"=c BMPwZbBVVE 6m29۽{49>LNNzjq \ 6={'O.))p8&L{𡭭nrbbbjkk}||ܹý{D&&-88Kl6jar:;;i4ZUU099… :u*::ZOOѣGڿ+aNNNxgrXbL޽{7Lϟ>h /_3gNh??%ׯ__~9a &dh4\h4?axva 6nܨtŽ{N>ܷsɹw_2;::Ξ= 볼<77EdxӦMkhhhCYTVVr�:>mڴ+VJNN>s 466޽ðӧOGEE酆f{nKK 8�bԩ"""p T*PXXX~edd䔔s8rHll,t*YYYijj~:8q<;;;33Ь=Cѐ}%K<yt~~}`ţrJ2LцD*++oUUUmڴIMMMYY;v™3gΙ3GLL,''zY,Vyy9ނ͛7[ZZĀǏ޽ }rΜ9;:q#G`ࠣ涴S<&F(ɓ's5:BHH>t'GGG;v BDD1|S{#??gg>TTT}ƍٳg_x1a„*~Q\\N:%莚 j]MO||*?~|UUիW_ ={`v6[[[|PƍBBB a133@ӧUUUCT3fONNPqAۑVVViiiVϟ?~w8ץ9s̙3㏡2zxx`9WWWh56nݺ/^d` A\8v41"^W-++{򥖖L^_ LBp7nŋtttf޽{ᏻwAާOGGPN N<yׯ_+U7lD<==a+x򆆆PG&,(2e eyF%^SB_<tWEEEp/}}3g 7%K,Yd׮]?lٲ:�W @ؼy3\FFfϞ= =^x񿰗!!![&C222vgٗ.]jnn&Β?Qlg0L6FDDD:::(WA@@@PP.. 13k֬,xȢ"d*J͛7׭[Ir~),,LUU+0:999@@{0_DgggMM YkjjLǏ/_>n8dXCtd 3777s8J ##ToĬ=yf-(}266-.Eaa!DKo.//?t7LmҥK$0_DDHP3z D̙)܋Ns8<aY^^ހ7 @~k\\\~9)--%''{/_޶m`v%P`LNFFFccӧauO恝;wS &yرy9;;lڴܹ͛s&`888Ο?ܼ? %$$E8Unn. x?KU޹sX[tipppCCBBBv_ꖕsxyykCY-6mӧ߼yյx &8;;7Ν;u@ aaaX`&bZ*88ɓ'MN||<%Zd W@ߔ;>憜}Ԭ999(),,7cƌYfMʕ+CCCa _[n޽7ŋw{rYY۷oQ`-,,lSL2e |ĉIIIFFF !!!hOO>O?F󋎎ƛpwKpիW\^r?)CCCu(G#%;VPP?*((;v kn޼l2NL$7u: v7oP(�vvv<f;`xx,.^dɒôui(Tr0 +// !awc^�� �IDAT믿P%Wa(Co@Ux< h333 6N<Z_ݸqʺťYXX_DwwIR!rXYY!*@AAAQQJ@ŋ zjb|||`ĉaqs iӦO655=ydkrMMMhhh C!$&&e {GA$%%۹s'^abqU oEEEZZ/2X(¬&?޽kffT"Ν7E罤C6DP(}葮.pM;w;!5EEE|W۷oR7h4ZII yرc!}DFFfr^x!''3͛K,AwF1��r?&>|g'_K֭[7innLɓ}W++7o@> כ7oΟ?_EE=00Ν;GB!???r<66vڵpŅwxܹ"""^z a09nذիWlgg'%%at'OK$d2\L&9ǏhvҤI$v1H#`ϤF 0777''ظ5+Ļͪ*!!y k׮͛Qen݊a  "wp̏= >TS?Ǐ7:ب=zyNعsfÑ#GvγgnS||˗/1 [j`Ruttn#//?B &Nbbb '** G4i`K.<x^""" CPLMMEDD^|  `z3gKָރ 9r `ܺuk׮]cǎ ](((HII΋/߿_JJjժUhvrr'àQXTT�}B(**l%iii*ARA0eeeGR/^ N"""zzzMMMT* ƪQYYJ WAAAMMZ*DiUUUWPPR𜚚D"JY ђf``@"Q<NRniiWVV}*jii YFڝ$JqeJII;I"+++T*2,))Iё@!!!55l'B)((8T*U__̓Ɵ>}R`jjjT6Rӣo3ff=S|jkkCb7J;PSxd2YOO*ELLLQQJrG%Haqqq]]]th„ 555"""T*Օ@ J~~~mmm&8YtP544P4hYR˗@4qDil'⽂0mmm*Kx>fCCCT'n#++;~xQQQeeF*j``�3xgg'J5ktE4`PIIItS>>'\p` !)))##JRLgQt1c|=y~~~=eʔrqqqiiiggg X,V}}O?$,,<nܸz* u)))))6*:m4gWKK닡 JBO?ްaUU$x҂IX[[|||L&n܀(**P(===ݻw<�kk׮Xa1ʱq}TdɒQ1$ :y䡤K<}TAG9F1Qb &g(F0p�H z@�0!!|{ #i@sp$:4*?Me~A@@4H}Pۘ6t"odF ߽{7b577H$3itvvvvvb ^z5b$0 �ҿqq,|kjjƈIPTT RTTD x$P$RSSSyyJH$666AHHF]]dwr`2rrr<쿪d<Om7glrd74k: H̔IkD"qt<2L$GL cD"ALLD"ɍ\IIoL\===Ch"Ǿ(F1Qbd D"79_NOOO?p�ffffff} ?on:K1 3g8p3BaΝC1Ç㿉t.ϟOP;K.533xlll Ҡ Juptt'7g\/րfp10 ۵kðe˖P (// 233r!bx)X Ö/_.gϸ 8r%zP} ?b?111 /^hnn#YYYGB9P'y?U)�O�I ={>eXm۠bo|o:m\l@oAW99996mMgdd\rð;w_ܹsBBBPx>>>u999)n[[۰0X!!TyyyϞ=0E^^B0 ß= ~7w˖-BaP(VZd2!aaa$ ϟl4GdϏo;v;w.ح}JJJK,9z0133KHHhmm]nrÆ n̼vC;z*^@?6lPPPPRRrqThffveٹdɒOVTT۷nTTTc___tӧЬUUU ,;w" 5k${}ć./_fQ|Dž={?6669s傪=<<F.\xGΝsN}}=޻wH$Z[[=zTKKðӧO޽[OOqƍ@ݿr'Oo6/^?~NOP^xH$E_7gΜ]vnڴ ð9sFEEںLk׮VWW;99ݾ}Bf |{֮]{ٰjnmllꊊM;:: l͚5x9999“\tonnn`ݯ\"'' ~L1577!L&mTXXxIx<y�xtLY !bǎiiieeex:777 �d$6P222 ФA&Ĉ& 괵 TΔ,OJ FG7aÓsGbeddΞ= )))xM-| @ZZ `p႒pE�o.*++q8X1f(ͅE$0\vMYY/y: ^PP0~x/� nD2QӦMƗO"MCyyy=׬Y뫠 k͛O:aaaګW>CݻwoݺQoǍX\얽7B fKr8x===266o644RZZbz%%%0 wZ[[o΃TðYfE+I$X<}YJJ \]] }׷/D/,,|!hm0N°0ׯA܀8<¯l6rǎf(P[[[[[;::t[ahZ[[ajkk*(Rtwwա845kgg`[O5`B:~իW M Dsm@XBMM᠘ ())Q(KKK'O/b"].XϞ=o9s}L&sqȳN L%ixԂ kUUU311144)aN9iǕlfhhh```eeIKK ^HQQQ!'';c <#ŪP ` 1A^^^]]+vj*x^**))k``6<JYv\Ccƌȑ#f :'`o>gϞByJJ B :o!@BQWWϧsשS>:x`vv6|jee�#fѣ3f\}g;V]]y3g`1&G*gAEEL@wyP0 {.ZlYLLH^^s}>޺u ]hQzz: Ix/J]n]7cW޽{ T0""ʕ+x_~GNnڲe 0siGDD &>e''' 衡]pzAv:+V߽{[l9t *;vD"!`H;9)) 6=qDdoo n5_W^bsss|ʦKO͝;r �7n/^|[ nET ƍ[j0!lذ!((1FԩOCuVHHȰ;;;W^ G9sA QGGo9"''7{쀀�WWWإkhh@Soo1揉k ͪzx۷o!p&Lj9{,&bɡ^8¨hll΄BD"u5dgVZ^|||/^qww-t``$%%[ytwwwwwM9]_{Mx*z pm<p8.i?}R`Ǽdee ???򆐐BB*S\\f寫kkkxꕄDd2Ӟ9~8Z矃7443˵7i$HvȀ�?? $<xPQQwEDDX,1cƄ@E0h'yAQEEE{{a666X"22I @kk+׾>(p8 XGGd"8ト$+֦_ꂬIII%FqrԝL&HfUPPXf͏u+KM0`+W qㆲ{XD6ٳ d2ݻ7tet"ӨáFFFC9 zrss ptt ߼yD__uww70 I݋CWR((D,.\`XC&ٿՆedd֯_?IIIx?x`s57lgϞEGG:P 'N8!--,4iR||* ! VvvÇQ b޵kWEEEIIIIIڵk-[Yf<BEaOGAA?իW#b|4 +W:;;}:Aooo\X&9*ƒ%K!`5`kBEEEꆅÇ]6ؓfBByy9񈊊ۋO;ٳgs,C2o�Y&&`0&徾PAAAڇmSY,lٲ፝EEE(Agz?D19?ׯ_#+++++K$AV;// WX˗C۷NNNijj*85UUUP2w\| v666̓oVWW{zzB&v5---mll?EEE%K@,88ԩSPx-XC1ck۶m3flݺ ccc!9}C'}xmm ̉n݂>}x֭[7~x0{{{C DǏFFFJJJtF7L$aKH$Ν l򫢢rKpBkkk(˃fݵkHBвqǏ :kGGG(LOOo}rjPtyhhsڵkx^&niiAӧ{xx@Idd$ٸq  m߾}W:X˖-[`ܫ&ӧOCl̙3>|Oa_ɓ'+CIiiWj? ĒׇLee%M0ɓwp"<w*h-,,:ukjj§ ;*_ĨDۏQF%ھ؍mC$h(F1Q;59(F1A#F _XC51̈́ GkhDN#mDbgKbli&-((8bjA#i(@HQkk+IC[uMDiiir-j/""bĘ"֖8L)ØCgy#i(a9&ȑhnnVg222\+ɑyk֣k?,F3sdY[[2,--G3xo`Qb( iii9)%%%De_RRuttt20 ̄ɔ)Sk=E,AKBB766 �-4//Ncf``<bn*''9YZZ _[[rssT&M{NanUKKKnn.aHsUTTdffbdD"M:J >q]afIJJ""lC5}=l ØL&2+KӁ_١ ;;[UU߬iii0}tkWWWff&8ܜ //8I1 铀�-((�j8=== ԩS!pB>555jjjbz4CCC<MFjjɓQ𧷷Z tz]] 4SUUU7aXaa46-rӧO p\tر+ *Ŭ,`cC)55^};6=M***F}}=^ �h՗X,@>}P;>0$$զLbooǀ -ZdcciiiW^c`}}}/_ܽ{7ϟ?)))mܸ 118::~޽{0̛7oʕ9997oqիW[YYf SccǏ###aqttğ�/.. 0FZZíNҥKyfʕ |9cƌټyqKKKxx8phii999TVV}ðiӦ (�HOOooowww95󻻻O>+22޽{0N0?s5+ BapppXhڵkǏJPzzzA'QJJjFFFt:=<<Ch�� �IDATb(þ ڻw.][L&/q@0-;v@cǎ͜9$a^|ҥKҮ\ -BXXx۶mȱH JJJw+V͛7z͚5BBBL& }M $%%l}Feffh4>*--ݰa" ߻w֭[N}]wwǏ?XߛZ\\ర0`0acEɹx h4[utt\h>n&'11?#x$ W\y[n|{M·ׯ#:))ŋc|5G u566_٫W2ԩS=ڵk͛7IQQO;bbb˗x)늊K.pq`={6_~ \ׯO_mmm~~~\|߿ONN߼yQ�jjjmܸqرysB\\ܭ[PH[[۾}sssɉ%%%xNCWxx8ɰR2 0[[ۚh6mZAAAuuxɞx|QQQӧCCC&//xWѣY`ԩ&M@<fkk z%88ҥKCрh\M6>,V�G#7}|YYYh~?AJ[[{;ws+̙3o͚5pZ34{nԩi&yyykkk//;v̙3'L@tp�o`ͯ_khh˜XXX4xIIIpp04?!qMMM2 ggg NBrr2FLIIWWW0YYY݃Y%"":cccccc߿Yn׮]GhC7knn?5 A^ƍ9Ӝ.& 6JHHp8uMNKKKf~&GKK+(((>>*++J4/�Q 6mڔ>n A2L;@ f0(⒝ cnݺkk\KKgϞ&C R1B 7nL4˗BBBa0aT.;o޼7oހ?Rq-hVeee966x污`ٳgϾ~:^d~AFF(oUaTvvvfddcAAA^s΀ L^t){Yf2QEc AAAaEEŇk___I&)S@dd�H3PSS JNN E"<sժUh =mĉ0Ç1 pÓA#((F8p_Ⴊ*FYSSS[[{?nhh077KxxP^eeevjjjGOOOWWV_hbbRRRKyyy ^v0l֬YUԴb /^,\?g߂ KOO;v,122RWWohh@>,`Xtixx8áP(C<,))y&|ABBBUU oH@ X,kkk~~~333bfTK(R*`…O>�WMwA򊊊Ь N]mmm$qŊ 9^p/:::??`ttt\D"-]Ƶ*hp++)S|o FXXXQQol_cƌd2aaaYYYl69pBBByypc[YYAH$X,d&Lvuu!T__˗>}| ILLd u&͛7D>uχhu <aiiɓׯ__|curJhhǏ!dv~/z BX^ ``S@zz:D<x󰵵G)PtڀӧϜ93...66ٳK'N_N͛7CCCoݺedd4o<# ʆarlق U477777?}ϻ={fff6sL.W?Ν;)))Y[[yyy*j;88\x5933er%2 ۷XóLJKK8pرcxahh5+??DD%lڴڵkİcƌQWW+Wæ^ffg.\8/B833 ,6m (bii9{WWoP[[+))yM??&͛A8r &fDcj*ټyhr\B"~t3<jjjWھ}ݻw FWWףG#-++lllfGV�.HIILaggggg[e```=i&l6޽{k׮0LBB$_O?>b(ǏAΰ*)--}捑`~qppe˸MT** {9PO?AapprT= 999Kjj' SZZ[Ĥݽ{7// "6mB7}OOOTLw}Ȍ/_Λ7o.EOOϽ{***~BBB 0ـ&g(2eP4&M% L3BBB>>> @&ԩS:::x CFEEEq 2Oky_GGwܹs(hJJY˗/ݻorPԞfCe֬YŻvtt|qݻw;N:5!!ZZZ><ðCYXXMNWWד'O_=;ͣQQQ+W<|orˡL&jjj=<|䉢b5!N>??999L&gO6-11*Z^^ގcǎn矞\&VVV SXX҂_+((&׵nUU˗_X Ϝ93?? 544`O:UNN622" ɓ󖖖(؁3g\dL!lO5kְ᎝`2228qsssbbbBB|N,]p\BBJwB}lvAA\Vcǎ0avuu6~[[[BB%dzyfpl,F===(---))177խOa? mo޼yѢEtҔP�w9 �9,PUlWW!`p}Aba[f-}*UQQ[__ SLOŋ0 YR`}}}([иpB٥=?>!sիyL YKPՆ VX1Tu ( F+pD"D:m4|^lYRRl-^Ro6lpmpkspqqqwÆ <}ZWWW>}zVVee$X}g899؁ ||||f2EEEjjj=== IfEEEQLVAAÇ cƌ#EӋ ʕ+KMMMUQQ:ujzzzcc#ؿ?$Ay PPPXn333 1 q1Baee JKK+++ @ZZAU!JKKc0&L�WRRӣG|r38q"d!3m۶qlL&dqll,۶mDSRR LJJJ$);;`̞={1 RPP ++ Y===SLAGA̙ 8_BBB?ׯ 絵cǎf>}:1ֆzM4)//`k5kV\\\[[[WW Q(###Ė-[;vljj*?~˹TP҄ Pgƌo޼iiia0?c AAA}}!##O|#fX,tFROO`_ĦN}_~lffK7d8_GGGCC8a}}}(ob1p7lhhXTT}i֭x6#&9sL)8NWW-DB'l>ӲONNn^ɜ1c!HD"1778GQedd$$$222 $gCHY,Qnnnmm-pwwCL&_g@~~~=o޼莎~pwwwJJ Zl!!!n__4螆F{{{QQTvT*'sf͊ =z{{Qttt䶶^ٕP(===ݻwIrUO`TxTt(FĨ(F1Q|' >@$.# aH04lΓS#h#4bjD zzzți۷@O79@E<bfFuKKKVVjjjd2#i(vwwɁdC lvEE7ocr7#WTT f|hl1bjD §OFPXX(""44ɡVPP4߷]Ԓ{h| #)cHQQq$eutt cm2믑49HX+//;v*(F1Qk|!|?+Y|9JϿuر?'޽{1 z*Ï艕 ,===Ğ[8Hh"t@ Qϝ;O?q�RSSXpMn߾ L ?3�999777DgI&t SVVF YYYN0lwŋ fkk;Zý{۷ለ J8:~x`5ǣevf7Z9s : "޽ %MMM  ///{{{Yn޽ {0LKK fff/,\pݺu�! |}}AnÈdϞ=:T*pƫWmp]`vssCzK'N�Q'O)\]]/_?pXQQa999ЯLLL˗/uժU@u@lڴŋ5)'~�Gh 4 >ݸqcww78 NNNĉ| Ö,Yԋ�q 籎=ܟɉ0a¾})**:|pSS~"INNދ̰˗wtt@GD"О={LLLcիBBBׯV&<u\ɓHNNœ X"hjj:w\t<:Tiii?shݹs>2eʂ Рݽ{wgg'<ɓ'an̥v-Hy{{޾} KJJ._m۶Ȍ (LKK#</IIIx5kc3LFkzyyu&%%q5)Sp9`ƍKVVƆBp8={<#ƔD'Ozo<sm,,, Q}}ѣGFuuuǎ;zuLL %%%""" |}}W^ussڽ{iӠoݺ@m`0@`f@~ҥKCpgϞD'N(** [linnp۷ot}N>M(,--x?{(LOO'7n`2PD$Rր[655ǃ;ܱcWUUyxx5kjj@rssѣGh'OްaêUH$^~?֯_fPLذa>}tyxc?>{={^~>|^zu```DDD~~>w.߿讣#iEG$77HžWz*̲͟2 ޽{ ۏ?0n @ѱi&p$%%]\\`NHHxaU\\ ސ 0xFDD�b8x={t[YYr1 khhTVVr1'!|D^}׮]733uw-[0//Ntzyy9\5>>0mmm`(IIIzի-_w=/�`dggÊɞ"ꪨF} 0mmm =:w ~,[ x`�7N<D"Aܼy3T6;;514))K,>}:Xbb'cquuu}hSSSa#-- :% ƍ%```2)))[nennnET[[<]aƌFe;ENNNL&$Ͽe0`tzYYTǰ~BMMMXO8 ܹϿL&/b޼yST77?]:<I@]]]Oӭ@2uT>>>&9uG||k@紭>::555PtyӧOWRR2`mmmjjqppprrµ ϏU39bbbgfxcaa +_X 65^ɕbedd\&$$dddTXXᡦ.iiiii騨(__ߩSxO~~~K,"믿@$& 0{1cMIMM TLWWWakk i0אd:ggg| H`޽{\\d\�ǕR |MMM-Ztj@sNX2e˖X,P(&7n(++uBV_,^L0Q|FmmmGG ݻwϷn KIyzz~ݺu<(/0m߾/EEEHΝ;7y >$'O~Q;$$ёۛTXX𷐐r8;Ř}}}Y/܎�q8+W;Ϟ=|U 0nܸqƅERRҵkxRCq_ 롰 do&&&`uCBB_STT*..�޾}KKKcc> {nذa̸ 77*suV???ݧO;vB^{ѢEh +!!U[[{< <xPQQ䄧A"<==?SNw,x�$bbb9{ɓ[l166F GeXϟ?III//j???ۑ/^{Y777<t~INN~Ch|F_lllvvΝ;Q+<<H$"l!RA�� �IDAT%K|rpp8~8qy!!+V C}}ѣG t:i>zHHH+::ÇCqDww7b`QФ`ݎ�>>S;w6nR0jN<?CŋFpΝFwjժ�^ _~466vww%&&)cWEl $5V!z=�0LIIIIIx?._ 6T`nHKK N feeqn D\X...hph4>$bddՃÇ...xFM4 kC2Axll,Y˕B#^HA&N׿@z---E>/\ '9Gvv. ~J1;;Mс9!>ˠjXH ޥKח\w(hnnvuu=}4Yx1<L\\`gvqq{%䂇e`vx%*65ӹL2zϟ֡C ~w^.\xԩav|glݺuر!ۛ;w7`0*++M0pĉ/}ѣX$"D熡PkIRn pa</i[ZZ>}[A?! 3^E˦ssb0 ۷o!uW#GΝ i1gaPp=Qnooe$T))/.wڅհ_{ll, 0"<Pб 9sf ;(((عs'Lgφ?nr)a�5|؅0\ c;;;Xkkkͣ>>>JJJ\]]wލ,))A9$NXfo0 kmm !:<DmlRRӧO{UUU7xbbb޾}w_Qz;?~;'"aoqٛׯÉo9ݡB[vuuݾ};מAqqH"aԩSg~ɓl\`@vV~嗓'OBÇa?Æ 'N [~=DDD _QWWߐ 6(7ܹsP$$$&7ܹs[[[VVVp56eoooHm8p�_loo'RAAApe55b6yC9s`p4߻wƈ322 8(d9sn ]11ޗŸ?S7m"%%J8;)K"EVplٲt8:E-ZHhmTTfq>y=zL}_uϞ<yfeef֭hu5jrƍ۷&&&Ο?deeoݺ/3f vR!..ʪ0Д433KLLTPPprrhz*Ϟ=킛(&&,L&98}4?_k.OOO(LJjkk/ZgϞ :VD;;;>rȉ'`?vX#^`B,--!ի6l8t萫+<=z(<yr۶mp C'?qqW^իWSNe0"""X[[?|PKK uɓ'{xx`dɒNH\r]~% H`Ammm믿 `455}ףg$ Fh4lЭ Bͯ V999dC$Ʉ|OO\ _ww7و�hioo5lD[OOBt:IJp8PX ?l%͆ !Cb!`C5:?^EJJ o0$i>rW/NL * @X[[[p ++rQXT Dw Cp00477CaY,Vss3!k|aFBBõ1ZZZ݇E}x$h4èVXSS,t`E@Kw^17b\mL&?vGkWWD|{͔;0 ߁m0jP7fX0TL&lqPFŏO D[kk7i)lvkk+t`K}#((HEDDY$$$rxA8܆!Cp{%v}Sސ![!!!gg| =T (((HH쵆?kSG fΫ׻S]ÄI$J_Xv6#qkT_"D";w_l5S ~~~}>5p~>圂 LJ6L7 1A ap 1A |R// yL\\| p8��`O@@` &X 7J}!ii;(22GHo3HOOH*&9&&0&o59 >G~%GFF{oXHmx�k#k�(cD 1A gP(!%%:'//DR[[ JJJzp*++1 燥dIDDD Ӯ.@/++KWKKK}`0 aT*Ź-ZZZ ANN_[WW'''"9 �EX,'@V4 "<mmm$/555 x{rC_Pج 09r$d]؞W//nj0č5pxQN: bdddc+Ld߯eeefe;IPzzz%T#F;WVV*++ڗEBTTvtt@@СCQ_=`>e魭u"i}}=DA)**SYY 1x�B"QWW'++8pl%`FXX_rcbb7b{{[&aٲe6m!ϟGܹs'L|||Y"%%ZUUfTVHHB C;v쐓knnz*R]j,jjjlmmy'?;w>LDD( ٳO&=<<*eЂWUU|rRNtmuuu Bj.\5jF{R=x j斖ӧO>|Ϟ= N_|yTTmll@WMMd&''lSD4۷A"pҥ7o&4Ν;.]*&&W+**G]ZZ~zP fdd Uϣ3(((''ɕpkn޼ٳ(lӦMZÙLfjj*R=}4Z(Ouu硆VJJ عs'RׇUfgeeY7IkGGGCCChh(JEMMM/^΂m۶_555B3g,++3gNqq1,@TA=<</"Uwn0l7nnlltww)GG%KpόIaa!슊 a0 X;;;€}v*ϝ;\wﶰvrr*..0ܹsSN2dHII=x}JJJ֮] |tzeeeVVݻw-j֮.D{kŦJ_իDBB:PRR~IJJ ---WWW,ݗ-[tvvsdddEE9s͛{9wu=zE ճ@c&&&jjjZ*#C~Yzz:nݺꐸc))) =Xr2 =HHH;wOᡪ O7l ##t;Isttp8#Fokk[n&߿{EAAAJJ 0,,䶚EGpqq)(( PzϘ1NZPPPYYy!(55uxnxzY{^FF .?uZ`Aff$Z`g:::Ξ= /͵JQQQ \p!-- T,Y`<AB۶m "<<o˘SddÇ-,,/^<bCC#G\rV1cƼ}V\\8"4҂>w>dlڴIZZb׮]v3f�m={d2ڎJY&!!(!!#""?~zHtuu ڹsgPPЬYΞ=a޽{@WWWgooOgϞA^!!!(nݺ5c ]YFNNnO>t萶6aGDD;<y"""Bǎ 9s|$tuuKKK6T9RSSO8҂1t钒T˛7o^?nnn5⸢رcYYYϟ˷%GGG'99ŋݨ c`XׇP(p999oO͕ӧO%ݪd:߿⊊yyyxr$0+h>޿m߾H߾}K]�xH:::!788F5?D(�}}j"` fURRhPx `ݺu7ns1}"--}}:ZDcgggg aH]PP�_ˣzxEZZK?aCyyy3LKK˷o߂2,\p…>>>M a c?IHHDGG3 B())ikkݾw^_ZZZddd% U JrrrVVA֩S:LAEJ$ srrL/'=nܸT�SSSSSS___~lMMM۷o 7pq'޽{^ITjaaXo/444,--Qp77,qqÇwRsUSSSHHHTTԩSׯ_3111PkEEE CKKKWWpƍ`x6SIIWcǎ}𱵵522XDLp (ȑ#GWFFFRcnn Ybޑ,??̘1xϳlggg<xp`Cװ/#8pĉp1@.7nnmmmiiDSUUohhHXոz(xFFFɦ>2ooEë`/Eѣ:::SwW^Gnaaa)S_FsŊ: |rqqΝ;.L BQ^^++}WL8ɓpBحR'Oxyy޽+i{ŗy=~*66666D">{։￁E^rڵ5kL@@�s�===Æ qJ߲eKll?^PPputJNNNJJJJJMߦF߼y+LgW^ݱcWN:Y֨͘Xo޽+%%՗#SǏccc( s|||p񦦦U#߹s}^eĈ{ݵkWGGGtttII oAҤ\I5k]fii4|ӧOC#ZS3$-Ywddd{yy<%%ݝDf/LLLg{6lXllCµgll^͛\TBB^^1b񣯯\xʕأGX111UM<}tڴiy!woll ;鼕>k`%KKK :gϞ6lX[[[|||[[[FFF'.]xŋ&m˖-`pwqqQSSkhhP(ɗ/_}67+zS__cccUTTKKKKJJ~-{.޽`�;`=cƌ^.}#@II n>˃V}… hǺl2%驩_ŷnݚ9s&Q;zzz=O`>v|Fz400px,#115{aӦM_ H2G.Ѷw>'vtt|aɟ]%$$={„ iiio߾SBTT)+$$+CA DEEI&~.ܚMMMEEE7nܘY eee;b>>*ٳMKK7Wn{{͛AV --=rH(W}}=lv�{{ RyMNNNVVikkKKK7nI$SسgO@@�wqB&IR޽;mڴ/΀�%%%Eܰaa{77 𺺼#G?~`Yn]nn^< aÆi%GEE\0 DGG O?55USSSFFװ566EﻻVyyy`` 9afYY$())X@fffgu?Ç+**ᾴhhhdggÕ#F`wYc[xYЛէ R~;s挀gxh`0,XaI &jkk'MR^^O9dBbLP755(e!!3g߶͚5KSSuEDDnڴ߽v޼y/_ꧧٳg]]]݃HiӦ룬o߾$ Q뫨L4555s͐r(hii>}:x)P񇢢)S'N)Z###}IVVV]]&Nֺ:HSWW0LOO~1dKa]]]TPPENN&O0cƌ|><y2,\ɓ'C aXxE 33G1Fhkk@% 6RAAAc`|r'N'((( FFFD֭[<�秥 6LFFĉG/իϖ-[0 B縡C5ɓl6;Ν;!;;;;뤤]jĉl6fϞmcc6hXrV^}zӦM俰xbA bOt%%%Ԅb6m4^uLMMB__M6Yŋ<qggffN4il6Ь666Y7o SX5|]vQT>>>0ZJJJ݉ѣGWVV?b=}& L&ӧ uuudDv|iii[zzzBa7oD�ϟ쥂m[>}r9r}Ν;wǎÇZXX &&g S~X F�� �IDATzMp8. �vppTTTi`Cʕ+a&((8vX/^=S{ hWn߾N \~ׯ_߶m/y* 4?Ɂ)cƌ\ݻP̍7~i?066Ɵi.]{n΃ƢϞ=?#GSST9> :0C7 گAkVtcm 0 b ~|=`BBBưIvdȐ!Dp ?`JD"zzz�s@J09|]r�l6;//o 0Q(R577 D � Ƈ�@[[[EE=xЍ%fM9`NDGp ƀx|||l6b H$4 '*;j7�Lߤ${-& %%9a„V[[;vA_y13cǏirHk--- 1ǏSRR֭[RRSSrܹ8kkk puuݽ{7D,l(@Lҵ eeeA ی3PУG0 믿[Pl߾8uuu᠜x۷1 2e 7Jdd$\Z[[h/]rJ |kaXGGH9 >233$>0Դ/ׯGhB(2ihh8AUUU˗/ baD0Y^^a޽{رc||| ! !x\~ Os `;u^02a ^ðJDj (8((*6oެ۶mCq,%aHMMmiiǍFGGCUP7h޽ zر#G?okZZZdd$zdffABaaaܺvZzǏ?tЧ.9bbb@;}tnpZf ^S0p0 ;r2d>18tPOO QYY 񡚚rVeddxzm֟W.]σpqF"b`h>Ƀ1c| ?HN9厎KxbǏʂz2H jĉ׮]C>b\t:Bʳcbb �bz=z%ǏVXo 려͎REDD{JKK U422ݻw葇ǥK%cǔu Hٿȑ#xdW@S8+WLz`=SHdXu'$$8qDDDŸDDD@^vfCAȑ#F?~q`P('O ^pð۷oCb]]]i}||=<<4...ÇW/Yϝ;8Ҕ0,33b>{,++ ~ j:޴@?,gϞuttz*U Ǜ7o]\\EEE�CJ?ҥKPǏ;::zzz[[[BCC߿?z( L äeeeKXXXee%$ʯLȔF!GG`xmQQ74,, ؃\80﫪?^]]6?TWW?~*D >BC>ysssAЬ [xEP=zTYYy񚚚NNN766^t >`Qr ?|GXTTq̙w͝;pZn]UUAEII 4lhh\P=zh[[[JJ 9`&##3o<P477ΖvQZZ<N]s]jg%T ACeaOOOt޼y Yoذ"""x{C̭111 {={HHH }?|@ oZZZÇGbhWuvvHHHc(M:xQttt޾RGGɓ'򥘘0 X,ee3gtww?z XWWWPP�;tƎ+&&F N ūⵤ:;;?۷tWWW8dgg?x�9;猌 IHHŋdѣutt o߆}F{)"ԕ544@dӦMqqqxU6L__FV莎OOO1aVPPpuuuǨ ?4iV�Umuu57>J A)L&ݻp144󗗗啑?zJWWd֬YS]]4H 2}6^jnn~ <}4((M#''g…#GNsr444{{'9r$ R̙3)))ŋU%K/KάY5f̘>Ąj*:}v!!!dw0 v`+PQQ�4۶m{իWŰ&..nmmP0aBii)PYYƟǏsw۷3 Z ֱwѣGK.]ɦ1ڵkp(W;Q & c` HNN4iɓeee...; v*& Ƈ^1~xccc[EEEĭN3gθ@�(K~gF8d~5h|GtwwرcСIԺrM]]]_!⢢KQ}}}QQ5l7nxմizX"""hiJ=X c޽,|?0T*^)֭[ 7np& $%%aWTTTtvv#D¯FÇwڅ'~kݐ!fBFK.KJJ5EDD`eeEPP|X^^^=ʂzZ0 sssG<-ZD ?~cnnwfrxbssscccSHHH]z5#}}}ss: f;9EEEsssWWWk…fffpޒ<|0T455A˃x٬YU] 'N;t-[DDDIIyRRo&7zzz`n޼ѱt/r.:rAפÇ{ÇY,rΦUUU}~7ٚ5kJKK]>O<?i?:F|||zz%uVSSyLL ]^(++v횅^Grx,9w 6O7K,$_dIcc#KKKXbԩ/_ě 6MMͿ dXta666",%%)Z(nn.hٳrrraٲe|||8BǍ/0}f;)))>>~ժUZZZh&Ls.]TJJo,Zx1+% �5 DG;wMc<M�I\XXիWAWWJMM-99ߪU͛W__/E@@@GGDze˾hk׮566.--bOOOCCCp<f&ĉ'Nꊮ`{5J|VRgϞwh+<<99yʕxQ'.[lԨQ>$H<wR.D[jjjFF[ZZ޽+**j*cIIIEP%Glذv7:׶d2ѣG::: ???3;a~ 弼&+++??^5&O'0lW\!*藛 KN_0e"AMMM aXmmmGG1 SWWw.|||S˗ґ�k׮QԪ\2** &t2peQSSkv)w-/L˗/^?E\{L7n$NK'UNN͛iFcc#VQQ~e(7L;z(rqtt\fOzt:D>X]IIIg={?aܸq_ ?%O8}I|||aaᯠ&G%%/]oy}w]]:R{URR+DGGS(5k֠7l{u55 75Tj~~w]oxYpaGGl!v}֭>>>rJ.?vvv;gAA)S�wBdd$^\\<((gֶYfdH:u*SȎ=zeܶmxSN ! 88f̝;ƍ T|iӦ]@S;w֯_W-%%u%xA  ;w/Νm@9NJIIILL<x ̤h|uV___0xbv .ѣG<w޽kB\lZ vne``dHG&})m } F{h"eԨQgΜFVʎV _.Zj׮]'{{{nW.[ ~y:th̙ԫTTT h*ر>~}bxG)S 3((HHHhŊ>>>pj*eW�ܿ rx7no޼6n8t= جYfƍ~~~hee-looq9Hx۶mp,++C%4iDB!xLQZUU~6xĈxʼ<MMMep8. <i4%$$m|KK ه  0 Ȓ yxHhJV .`k Pb[ѣGo UTT@ðwޱX,d\DDomoo B{ &H^]]o0Ά pvww8>l6fp7?PX6 Nvtt@ A,7Ǐ ݉db<F,|J*&&FO677STЈ"KYYY[[acǎKA7Eڇ HdpMM ?p0?{Yt'fmll!("WVVBLL!SDJ0^AF0۷l6ߝm999 Fqq1tȮ"=lYPah>DSOq&H)++~j)((A̘1cD۠*oAU_UA?ۍUA1A b%A bBp`=TAL3A   DRR`(IHH/@&D"O.9MMM@9`;JDӣ ɿ5L&DbPp8uw;00p 2o59(((|ޗC"W�)))KKӫ=z-''70J$,,7`>|0}s >0 IIɠ SS> **BpSw7p8x.H �e0KD2dȀi&AAA~~~>>S"!C DPBBB|||jr�oyC>{fxk6 _�[B"HnP:Jp8-=Cy9mߗrwIQ]^s.5~w JGrϢ/nA/J!Ti5G>̣eģ/}z!;BIz,D2A,^K`_ԩ7x|2BR<ybccV___<{,1CbDD~lcmddO{utt@ʤI DfgffB"H@eC#G SN)**d:nffņJfffI8X,NNN 'L&4,, Jjkk>FAAh4ѣܗ'//$츸8[͛腊xntwwSɓ'(J=ZEEEOO{ieek9s5d(,N_t)$Akh4555ȎL&6 bBBBb<@өTE4mҤIrk8χGPRT***#GN~&yYHtt:*55UYpԨQ'N=QTOOO:tp=T+VĜh4JUSSC ~fll l6)***[lsuH<<GW)T]]Yp8o",޽{ÇC^ c޽4** wɒ%ǸhcǪ?7-- >iڵЩzzz!2ÇgT*իWxNhkko߾]\\\SSSSSC"ѣ:::M`8_t͛7ᩑDV;R޽{!q4JJJ}5JZvm ê \mO<7kkk Î?<66h󃃃!�v)))555UUUhذ>׷n݂?;w.p_RJJJvļb mmmK@PSSIII�ҭ[k:@aaa𔟟DJ= 111"bŊ0 {uMMMYYRTTDmJ)lݺU[[@wˁIUÇ/_a!|._L" qMvuumڴ fΜ <D E&pihhK?Udcc{nHܱc05̙3G[[5aee?Z`ahܹð�Բ$ q͝;wPF`bb_) R^/--^r%a줧;a?=t萁< Ye˖?~׮] &̓CCC>\vvv0+FGGBS***5_ 6hkkTBf͚VSSSYYIXʴWX]꓇։'x/G*""Ϗ:% rss3Œ㧼<1ڪ͛\RR6;88ycԨQeeeyyyxt!!!!!!xyOO梅�sssOOO miibRihhSH2eʔ)S F[[ d!&&F '�X4Y@AP) DRa^f遪jAomme2O<qf˗aaaW\ ¶ m{`mooG [nw$8mj9#XYYYYYQB䱱�j<?ԛ7oX,VsssGGTy-t,֭[р耂KII5dH$ %uu,`YwwwGGsAwb20\3HKK,%%E!Ɍ_˖- +Jp8x6& BIn�� �IDATN:s?#L&lј1cʲy-ZhԨQos ccc=߈+d&&&رz;wo߾ ff119>}ٳ%%%RRR===!IdСCWXX Ll6L&Jjll?{-D5!66ֶaaa,0ٳg#+2qFccׯ_uBӻ ݻwox?(Go&dee3y b$xɨQ`Ukiiu666 D7ihh�رc .쇃hcc3^U;***## wvvzyy_zѡC^v u!&&ǏdvYPP�Λ7/\ԩSQ[[M7nܸDmjllJ%~͛7(}ْ'<wؼ%K>^ᒒ 6aWر#ɉill<tƍy k?SxӧO@ kccH̙ѣwM4f߿׃Q^^ٳrjP8¤I޽{ѣ9s֮] r0>}ZCCӧϟ?8p%//o` ᆬ,j'NX[[wwwnnnF䡽b޼y~ OIIcLd,;xIYYYXXL>~+zeE{I^^ŋчuuu-^JFFF31"//ܹs`<3Çyyy 49Z'***))U;oZ YҥK򔕕j5UWW2} u999Amf'N컑gB2 <-s k<͛ڷByyb_455BLJ,8p`ʔ)rrrT*BGGckk po} YZZVTT *Mݽq ,/!}ʕ+Wutts޽{>qܹsQѣGlEǎ?~ȑ##UVVEpA&/]4y~ĸX29F{qJJ AmWXXMrI'5ѐxtttܽ{k߾}_g~?x^^^Q|-0\<yROO0 1 KIIJź:AAAۑ#Fdeee8'Ndee]pTS *a,QQQnnn---H2t:j# p 0l_`0˹5U) ]II)44Rmll=K.)))-]E AAAHΞ=k``�S�#>>~#??ۚGoED%/[r䄅Ri4$JKKCaŵ6rS(8QQQĆX%%%!i(**B3QM1tPiiix9V#FDFFX,+:t(j;v?~?@TT⊋n&!!�ٵڻwh4{{�T*rUUU!ZԶVUUU|r8ԬDoq@1c(+,,fAnȐ!(;MMM===TMߡ{Y,V^^~ssc`WsyWÇC˖-ۻw/L|Ї}d.]@c&--=vغ:HTUU3??,h@/=z<֌5eee^Jau>|Qjhh ^ӂ N?�&L2d@z9EEE:::JJJd2ߛP1BQQQII%%% Z`jp8H/-9RRRx1E#G0˗/C 3ڵk7mF`x!HKKlʱc@}„ 'O0Ȉb---aloow&^ 2!** k`ڴi(G33۷cfnz5x?̘1eJ Yr%xT__ƍpcddZ?~lffKZHHa#G<y$ܐ8`ffoV qppr $<xpڴi۷K|.>>B^~Ԯ\Bظ|驗PwܱimmsӧGi&X*Э,a#bmm}-(֭[ *ZZZѼwqD"8zpt]Θ1ԩSy&aW^ERr`C ???hQF]~&8!!!(a[d j5kր[]<<< ȑ#<JTLL"..?̞=eaaMs!!˗رҥKÓ'O0{aF___d?|ettb[[رc6򭭭­mmm7mtttt+V$HzЬJ~+ Jh1([`PxPm [bp 1A |IE5 dȐ!N8LH$`J߶DOݗ58 8NUU@RaR ߶7\477 W__ORR{zzd2kjj"Cgg'z+ {_rt:P   r8 2N"pʁXŸKmG) ÇdA@@�"bt7h4\n,%% {_r!aRRRӧO`kk\kf(Z]]@$%%+++'O<n kl+ b caWVV}ݻ/_b6yd0ŋdff??իWC͆@QQQ$C&1 SVVFD  c``0sLHLII޹sMqtttyy9a+W#]aMMMx叏?B𦮮.7'˗/"###<k׮@}oontVNNh###1 �ᓷo&$$Μ9y ((We#,, y577$ȑ#?Wd2;*jօ Ͱ0_ELw^^^t:g1 yyիWCbyy9-hjj>ӧ)}}}D|Cskk+ĵ)**UYYك!V&=====0###}ѣb ìj"O7mQx~RIIu.»wQ0,!!L,X߇ikkk5kÆ ǶKJJ>~srraԩ5>>>??ðŋA5S$<Xaa!YN0"L-Z` )[laիWY,�7p}}=DU0??0,111''Ь?!!!sAh / O9gΜAU0l?~LP(ʋ/`><==߿߫㨨.\744�Iss͛7!�h !1%%FNJJJRR$>x0Cb`` Rၶ6wwgIP#""=>7^?~0JR˗/삧'LP(h4OOOYyy90UUUݽ{K<==Onݺ "ãBdOOOL~~~^ 233O<xpHHHQQ$޸q ðk׮555Q(vRׯ_A >޿Z�p𨨨 &399/^ǏNÇo߾۷oPUUW\ N~7O</rBBBZZyTTTQQLu^^^ǎ#HEtttJKKO> ɓ'ϟwg޼y ǏGt:a---0v` ֛(xmjj*~ 4<<scӧQ/_FPZZZ^JX\{~5&&A/!!!555+#44,Sw655]r=SA#ðfK9sLJJɓ>}`֭SØ~*<@ܩdӦMd29&&iEEEFFaG[[H<==?>k,82 s皚咃EEE>|�wO5TUUXaƱcǢ󊟟 /IKKs8#F޽J{[[ۊt {lNL"#HSNݺukKKKDDnn333@ pLMM'L�Ϣ"uu۷o<xAhabX y'..Dg666eee07@a0;C+((ݻ }5?&+V7ݻwWHwrrӋmŋ̙h=njeAAA~~>QEp8M6}aܸqv킓Ќ3,--eddzm⮮WCBBeff}Trr2<z1500঎ΔN_pNP">|PRR,66VWWwڵYf„ jjjk֬>>>[lAloNNNx77? uuu⵲S0*#11qg޼y&M0l>|^;a{aثDP4iRCCP <pƍP`Bef2'O$HwF7n@}QSS޼ytjlo6CVGvv6J҂ .\/ &D~ Ƽ+0#>|0y ;;B̚5 J`񩭭uppi_EEElre~~~l-ݻ_c q6bXF+YGGGGG jdd;v, 0]]]w܉+7Zr)))Ϟ=3gNIu5"$$Xeee#EGGO<DeԩSx_ h27I鸸8B3gI$ҎŸDGF?.�fA CD !u"gH�ƍMMM0bqz}4#@ Eة%$$2yK.q$&&uV[`sG&؉#>ɏ⫗222̐h B^^/_k.tsq_^^ſmmnn+aҶP7oߖ6O\2==yâkQ?ZXX|)F|2"EMbb"4 J"fΜiaaU>nx&''ѣG辳7(VBWAp\\\_dؿf18x ;v qc&''ZZZn޼ gΜBzt?? f m6r200Xd˗/]KNfffll1̘1cƌ;v(**g?X\\رcVɋ/FOF)nnn<T7l�<% oXMO_KΜ9s̙coo_VV$666'O"9rdԨQӌԶmChjQn78qF].H$~,**M9o<~(<0 C ,ǒӒ%K}x`8;;ܓM:u…@CCCWW3gΚ5D"A} ///0l߾} ͛7qr{yyq DVףرc%&C7oހΰ(D$ 9#"` 0!*̊Ӻb\s@wMf�F$JEAD@P $Cf#b jzu뜞5"<O]]rQNHH.Kq] ߹s͛ :Z'($fddDDDL4 �= FdHQFKJJBb555? 兆~Ν;YYYgС'O b2'0lllP `׮]/FǞl6$5|z24F$]> aի{.//?v룢 ?vkLMM Z3CkF`Z...)_"rΝ0y{{w9۷oGCCCG|oܸѝZXXXZZ7x=p9-ʣJJJd77ٳgkii ncc>٧y󦸸 0I={Ȩ;[[[{rGAΞ=+MOOB]ʕ+lVz`F RLNN0` JJJl!*oƇ u…ha؝;wv4uu_r˖-_;zB.ݻwp:v옝Łiܹsp8俩9::B")HJJB æM6{l;;;@ڵkCCC}}}1 ?p/~=\[[3fݻ׮]+!ð~Ν;I$(ht:(&O jjjR8qbpp0:_ .X狉AiժUp>}vwzzzjjUPRyyyKK y:88W Vx˖- ivZ£eΟ?`0ve0m`ll<a(TWW))^-;vKJJSQ $0l=4 �2g͚?u<뀳gw%$$=ڃZܾ}20 [fͰa6n6NNNUTywݾ}z*镕0.Ə_WWD޽ FK $!]pP\\ ѱY?,X�u#G;v =uԦM8L&W9sxT*]UWW8qСCs΅ lF*//B}}}4Gl_帹m߾D"A;޿UTTF h_燺SSS40LWWb۷/1p@! JSN!aGqqqa1 &LQQ`ߟD"w9r$B8ݏhii'㪪,K[[\F###0`�L@!C "KZ[[S(8�Abbb, t:,X,b`Ǩ_~vuulmmF{$##b WMMrAg$ɐdu̘1d29 �� �IDATƍgϞE좰gX 2uu$;|iӀe<PY,=yyyJ377'LDX,D}MMMAܜL&CXYYQ(p9'Owb>,&Mtppp?G&ɐ1vX $\7ƂnAH$Ps6Sdž.4 (SWWgX0}ՅK~K 4L&?t޽HuB rd2̙3T*ǣP(*%%-+''b`KYYX,JN|Z :Jo>0hhERI\\"t:bA! R-!R!R- Rl7 "[BrDADA|/BΝ dddzM` RRR\x/F55"H---d27h&ii7i&2ܝ#_rjjj3`�%Md22!~[�EoJ<w~C˟j]zGq9222)]ᧀN1׬rbcc+xvv6L'Ԫ y 2՛Lpp{dbbz5\Fd\P(oBO�u{SF齦$$$$%%drFkkkhF֛0A&zSƚ7i&X.G> " Z+ 811@xMcccccӧOB(  V>!ܾ}uIҥKA-x P|#DEE/| -Z 1b¿8\ͳgիPiӦ0 #}O P鋗W qx"NIDyy9|ϷaXLLLN5/\4,--2 ޽{!)# ߿/جOBCyf|̙3񅰛vU͛Q#뫪?і@ X0lP]\SW�___P!`Ϟ=P<y0dccH]hllXĒ߉W)B<ѡC/D1wׯ_ w*[߃3.'##C__<뛕 \#Ѐ mܸqYYYH,xblقtܨT*|ɓ'zj}}t (**ן2e ÇpsuuuDPl2|uŎP_7#|}}h%% nhh ڵk߿K. "�7u0BGGG$ Ǖ+WۇVPWWɓ'[߿$PUUb۶mcX=}T__QPO/_}$Oaؘ1cP\\XlÇPCCܹsPlI{E-7q*~*333ҥK½NPP֭[Zӧ޽{ TtC3Pl5J__� iӦe...pj{РAܹ^7򠰶f0{500›7ow]__???=fs666h›7onhh ۷OWWzupp@rɒ% J=dȐX 0``hNvv60  JNNB2 G'?/׏ŏdYϟ?k(*233R rі5̀)  Voܸq 'Jjkkzeeeڵիxb]vYM" Sဏqwwp8@MhhhdffرoR)Nk L$NVVTA%ɂ4P /+r\Dmm-l\H$x\. {nÆ u577STTYY,֭[ ROHH@ >,-- "33v}8{,!h1 m ĝ#)))q,--! B@‹+\.ZC6,vNt̙'OBݸ^/͖655&I F\\ UVVE�ն6|>Ԅ.>w\I<xxwPF`ɓ={ċ0vCϜ9mhh@6뺺:999ii鶶6�x.pZZZwJHHl̙ӧO HjÕY<==\.ͣGs5;­]dȢE L& 9Y477KJJ~v㵷p\.~gOLLFٳd> 5'eddSN1cT0;;$%%)5pU^^w{8(즢2#Fz;�^"..N(mjj+H$))B&~zClzz  R*!!d27eΠ 5j@nJvc~z+++!R҄&&H?~d2+V \.fڵkLG:5G Fvv6~ uttx<!^nɌ?ʊd^=T*U\\ʕ+L&+�`F믵C+*****H$"Qbƍw-< |~VV֦MA^�{* 0FNXXTĄ{|0=1ȊUVǛ7oFd2}BMM ܹsǏEuu5N8/5*++HNN,O0p8,v߿W}NEEGa 9~2dHll,7D ־uЬ6m"p%*cvҥO>:uP8lذor7o<r9sPzEE%۷!l+7n?~|EE͛7Ehhh"񂂂{l޼y̘1o~N>ɓs ˖-FCia055TWt9_)S;vLEE755uڡA/ݻuz޽#G466Up!}T>9qQq(4:KIIٽ{wcc#;^j* knnx w܇:|BL/a``�moG ^?H ԅB_޾{#сӾE8y$>VpBڑ<!***88Օ0Z8q!Uðn'jp8|NE }2*?zu]`0Ј?^|dGA*HPhmm]vܹs)**n۶رct:KLaaWa/7??CɆjjjƌCOJJ:y$!CLL OQQ ҩ0a2UUUǏL<f+ܹ:4gF߳f",&M/E}} MМ@WOGpIIIHOss3LesК}˹III*f %$$"t| v(++JJJڐaӧO;Tx傂xu11oۺpř̩S`}jڧOF,̘1ʕ+PY8 pY]]H׈IKKCa[[J)))$Q/ɬ0fJ{ֶ6ea0Y%$$^1f̘˗/kii%&& ~|e9ERuu5<@IYYtٲefY9O]]ݒ%Kmmm+-EPQQfWWWȗd-&I$/A�x6))) BK 0`? D ֫W}Mcc#<ߝ$%%A/ANNꫬ'6#9+++i4Zkk+<***±krrrP `0 ;{;|sHHHV7<ZIIBw:K 9sx<\zU0 ۵k׿ 'N9֭[oPEgȀ�EEX{6$O< ۿ?>CIIKh4<-Ą 8|Μ9@u-jժ۷:t>uuu˗//[l˖-UBB˜1cI$( )F߾}!knnzj#G q5(tvvN*:@ff|,t2mmӧO= ~4Z ;wǏ @EEE0ISSPPP׏`"so &TUUA_iǏ544<==уfrPhooV:wܹb>'Nشiӿaؕ+WΜ9p-�: //AO81i$///'''ZSQѢYVV0 tB,ƍPǿ۷ozxx@N]~^vMBBbٲe{ٿ?<ɓ!t |ðp<LNN1bDss9~aۥ1 \reXXX;v,Eb֭PѣG }sd2;M B~zzzȴ ?c$~K$~}$~ $>ۍEm" "DA~]{@;B k L&j+:8+CojoX# mOt\ިkjkl 񪫫{SZZZx<^/3\.A8VAڞs466>~񒒒zӤfzJ䆆ӧ^3looeCD"2ٳ^P(---\=kqo 0 HI&2~Y2~ k8@Ek]ucXfKLDA~̲RǕx68ۈ�B_ uuNo9qDJ|8&..>}t*++#鶢"8f``3rss1 2d)?633qt8UcJJ a&\ X&Æ  Áf 㕸OLEEDoyyy�mbbbddZ<x`x ĐWCCP+**vu۷\.3:mǏФIwQXXXGGDB---@ -++;qDSJJJʾ.>>߬peggGXlUPP 0>|PSSנ^5p@}}} Þ={7n<@KeccL֟BAAASS^�&33N>KHHĉ=ӧO'466&%%dO<0LCCiY}755UUUUD8,,ں+ڗ/_7O`ԨQx;'OFT=L&#&wx<**H_SSB***cַo_iD 4CFðpuuuNN^G~۷ܽ{rssA#===<<V^?~dX^',,r|}}&C}}}@@�hzs?(88͛7`|_zEEE<zh֭.\ill /))wr9?~ 555>gM/--bЈ޼y;wܽ{)#q89sl뵵'LPYYAYYYXX憆Bϟ9s&R:#X4ڲlp޲< ȑ#}Eѣ<L]]ݜ9sdddccc9Dp8~~~pY,))hhhyqYYى'Ο?5444&&<z[[^'eee\.MმB b߿׿xbEEjA޽{@@@R}}}߿OIISTTD.ŋ URRbgg㨨(g0!!!---6mz777_rn?}}III1"///$$R^^766~y~~Ur9͛7o*H8YXXcrRSS_-y'ON83gtPPPll,%\.; x H5 �x.x<޽ s7o|333|Xu=zTQQ\ΦM,--aD]NMMͅ RRR~ˁ Tii)?y򤢢m=տ???##{bh``@p9!!!xfϟM*++'N8s̲ׯC;{ .`vtu={.'&&ѣGr]5)) dbW^û�]]]KY|?~O˺}$hSUU29990m_v"..>|(|@G\VVF"jkkGikk[YYye;ymhhhQQQ߾} n„ G0lҥ;v�baa1a[1 .ioof;^ڸq#E蹹HxMNNA-j׮]111d2.… Ϟ=0,%%r>|VQQQ$ ֭[<y +Wh=ddd6nDvSLr>}{<ۇƎ ͕+Wjkkkjj>}z0---ǎ`0 ---nlP`oo#F@߿$<M#--Ж[hiiIJJ!< =a޼y &&_{{-[^zm?lܸ1//$.( �<xiiiRXX}aqqYPP:eZ gX0*8qϽDX޹sxxx<zׯqtSHAG3f ܹyʔ)驫Cacc#t OOϵk:;PTT ikkFٝ[:ui<MMMp>};�^t)rw> uuu3f@ ¸8]]]NMMiee BpgϞ9::FEEu㇢~nx"''g/>}׷�hIPd Ll6#$$waaaaa*^lWؿ?LQzHOO'JC711jw޽[UUn:oI\ׯ_LفPZZS~t 4]Ν;ӦMC;^^^l6z-FSRR;|SZZZRR \wghHIIIKK G>w.3477]RRr…p璒7{l55g�� �IDAT 333UWWCaZZ^сdx6G(amS6BUU5##L&= akիoBt ' cڴiЊ-??JK&Mz%=___sFFFBNNN}'OfΜ,-Z$ч`&gjjZYY?YdB#FWK(AAAA>>>K.˖- o"""ꪪ|Q^| /<77? ŋ+W/q>|e~夦~ =c o_n[xg϶ر|ڹsOի|X~S/^̛7Oy=uE)))&,EP`-<<%2^2=!!!YYY]>KIICNNڵkgϞ`7n@`*پ}5ׯ_Z[[\NlllJJʌ3˗񁵙3g2Ckۏ?.X�1wj^5!X.[ٳ0 hkk߼yS;wܹsoKKKgg3g΀E'8a_s4}nF \ܹs\.w֭EEE |>ĐΠ /^VhkkC{zz޻wOpL4 ĩݷoatݻ>뻜VkkkwwsssQAůy\Fk}}իWV^O.K5doll<sO8A"@PܸqCSSS 2_s: [n)((ܹsðWرXKK5kZ?x] eYYYIII#GIMM xW(**y󦃃7o򢢢W<(3ϊJa/'??oٮ/_,--!$! @r R^^6KMrrԩSt97ntuuYdIII۷uuu ʛ#F)PIkk+z=f7ym~~>!Y,_\0z f '~Y 2D0Yqԩб!Wٳg/_.(SWWwܹ+W7s9˖-C8?~8˿ ]y۷Qhyyy<wܹs3M!onn>}4|ӧoXE 3!3AFFF_4 C;`eeGA|}}W^w   5k\xqل#GF2&&FCCC0 h7oWvъ Ӹ.'_w=qĺu~SZ = ,t9rrrhOv9Cɝ$L6ӧPhjj U&L^reڵ$z dee7mڤlkk 4 hjj0r&NZZZ ׯ]`A=0U,!!X>Kx<3B[ RZZ pELL,-- p g싰g0a * REGPEyaaaKaC~aU4o<m𕕖vrrB]r:d:`"=æMΟ?qjkksww߶mLniiA5uttAyfZZ䰍3&&&TTTٳ |;(--}Xu9;;C7C9s昘,Zp|?TlF{.66ma5p@E222N֭[\`bb0h40<9r$>rٲeQQQX`sfwy!50v횳ԩSu}A#c->|5200?t-[~ݻ+HP(wnkkmooh4UUUCCCZYYYVVN[ZZ3t: 2 cРA++++##Ct$%% tz߾}(((())UUUt 0T*NO2@,##cbbBoHMM0`B(++3L&N6 rXԴI$RKK NYÐ!C %%% lh4ٻwtD fYYN0`�lTTTtz]]N?:yd"i"ss\EEe˖022***醆.҂сVIII:366%Ht:}…`# ;)))YYY(h4SStD!x BJ---JXFF5$$$t5kH$+,,4ht:$4즦&lKHHl:>qDد200hmmj0leeeFyذat:]YY\`jllTSf_|~|>N?>~]%++;dēL&+**/R P]]]WWd4vXΫlRԡClXP(&hHtsssЙT߾})9xbH2:thAAoqq ###FKKK˯Xb?~433+))0UTTӧOuu5N9r$LԴdrss3d9$}tSSS))) |=4x>T*UEE\�B4E7mGGX{{;OJJJHHq~TAEAD-!r9" " t>@& !{@�0))$aDi&h11^S#uT*7 6$Š!i}}J\.f/ðꔔdߺFT**st455566pZZZzqhmm0wDyyyss3= 7a~rŅ>v.,,5.GRR^MMwbbbyyy$IKKԚ^3Feeeo2RRR?~^� f_W7dho<!++K"444zSZFFRoX$ɽh4*ӧ^S#XR80 *֛2^~ԣE" "IKK!!!VVVVVVx#www(5.] a\.J r ʽco>I]_cOOš5kY} 쬬\#]8h\p۷SK≅0 4i daa!sӦMwY=<<kaa(DDgFo| Ji |E7qFB`#HV\\ e)�wwwGxC!",X�Pp E8{,!&&nٲ f+Next(Q BCC�1 ;q"mWE x %111p[U% >6ud�3f̰4ӦMH˗/|BwK8v׺u}WЬK›5k466ž?~I "##_h"qqq(tBj,]tL&0iiI&Aohh/,,ܷo͛7[nBEEE/]fʛ7oR(ɓ'/[ qnZ;̥Tɓ`yBB©SѧgΜ!+W( Rt^fMHHn۶m|>Ç+Vxyyedd_7000'' sbŊo ͍D"555l۶ i&777t}xxxjj*|z޽k׮-^ԩS4 /_LP,--7l0n80s[lqwwWSS̼v0M@Ymm|dժUPa؃Ynݚ;DfÆ pzҤI_(++۴i<ݻw6l@>&::z˖-h]~#3fؿhoڴݻwo߾kL20YuUCUWWg�Νxtooo 2nܸ-[9 vuQ--?ӧO999pf/Z[VV|˗/gff^p <k׮ѣG}K. \yE DӈJC.\T.>|XhQKK ѣGp۸O<)%%zyyQ(#G:;;O4 Ȍׯ_Y&icc"..pNlԩS>LRlll^NNNMMMjUUU4?o߾G$`ӦMϟ?/((qmmmw!%%Lh…---d]WJJJdd$*ikk}Hs/++322z.}Ԁ/77p}ee%L@auu5Grrrx9[ ***t:655j/RXz={"CII+//AppϟBiCC5kf̘:Ǐ�Wq8n߾}&ɓ' ƌ=ݻwJ 233Xj!,5A3faZp=xbii`~޼yP4611K"+ KI@0#Aݫ+8;;/_O CCCxE?|�jnnFkHGGG4]ׯ_Ґ!C...`R]\\9.\nV^^N'9foooORfC�p֬YbXar8<;-h4wϞ=@* P+Whhh�u!:BImmmz?Gp80C MUUU/// khh6KKKm۶ -ZНrrravfsrrY3--- e"O>4{ &=zWXlܸ7k###]///$]b55569sK8`jƌ?~ iju  ]!(**RVVN F322"hv78eC@iii <CCCRRRFFF�fʕ+gΜY`AJ\k Æ .$?#7o<qℽ}WbBB0vX2LP@LH8E [! 9o<m !lx(r9`O>}U'''N 㽼C&d4۷R^^?#2L*(sqqB} KP ˭555oݺVSSɓ'ΣG&^TWWH$`Ta۷o1cF\P964#322T'$$d{?~U/]qFPi:s >‚D"OPê`]tuY]�FGnkkZh֞it}PxIIIXXXXXD/Ojjp©S&''PN֯_Ow|RRR:::hy m+V[S??d*++/^nݺn�ۇ)d5kVXXB߾} YÇM]l٩SNG9"x%K:nܸqرaaa'N lNN<Գ8p@[[{=8m6ʰaF,W\p8;v 8p̙w~ B&%%%W⢯vXر qp۷#~fΜ?_GvZpppq8`ƾD҂{UU+))EP?`tall }IJJx̣՝;wS=l¯Znĉ&|R17z4C`ٍ222'ڵ )|;MN\.~7C:ɓWreeeT*uлϝ;puwwwA5t  p8hbcc#&&Ѐ߱DRWWP(܍nSUUuppy^ f}IBBB]]]RRh’ڵĄbA<Nu|g NR(Was΅S#c铬, j k&d2+#$$DOOo~]L6̙3;Jccc_$857 0 ZWWrJ7l6{ʔ):::< )Jw|||JJJM뛓s*+&6ѣGx5gUzL(D o`0\\\Ξ=plwK":tHAAaɒ%="?B ٳgNQsسg9sУϜ9^ANBsTWCPPPjjW I$̿{aقҶ:::IX~`qѢE֭99< ⢣J]fSN͕h[[VMoooQڻwgc)`YX???B8xQQqơvΝ ?HpEi_|95~W]]^묹_>jG5E L&@BСCPhkk ,ٳg=~>MLLȋ1 &x0###(<s G7n~q޽ر Q(F`ʴif͚7@wwwLݻ𩵵ť ")) ^-++kĈL&SUUjݿ HFvrrRQQ+eddTUUU&9bȗCѣG  <"...P8k,8$tA(C2LMMM8 _mx<;KxE/^0al6hjjzzzGopp0BAm$..N@+s m۶Ae'ONOO*ݻw3s玛?\\\\b "B1FFFd$$iƍSABYfM85 dBѣG3229s@.\hh޽{۰ݝkjjd2 +޽{g``d2MMMaZRR2rȮ^ܹs3̆x tlsss&^\\ !AuUo{Dm#Dm>DmDm"6DAzi`MDA L5jf@/L55gojZ#qF|3KRPzOTSSFmmm@;j-{M|~/K5jnnoRo@۹˩ M.ܛjf?~k I$l5p8mmmi(Wl/3&L&755UUUQoJJJ5[[[Q/ Qoo cp[2CwXfADAϬˍPIEEVWWG^@dhh}VFF|>h@یaXSS[njfII K__߾} h&&&R�� �IDAT?M{TRSSa a< At�k޼y?>p@`HKK*"Dhoo)))hMMMMM _ii)GsK###4-%%0*ZZZ^| :ccNSZZP5''H �$?L>|xGGt Ẻ:WTTȫ+hii=ܜxE5fœӨ!Vԗtttr^^h}0.ŋnr#VTTW>|�l/akz433n>|Ȑ!!pZSSS8N .//ӲTPP //h <]覦>WUUU Tް�>,`РA~"#55Q(N?iTVV <& Ê !!;;[GGG V=|p+\NCCCff/}}}NΏ5j;k,[[[A&T(!!0Z6nhnnzګW611߾};rx%KVnn̙ Ϳpӧ555>>>�vuuuppphh( �GGG===wۘ1cRPPرcGMM `v55'NĶmFsy Ô֭[NxyyLiiiAAA@@Hsx^f 0!Babb"(vHHHl޼¢%**ի`z/SSS­>~x1&c7pC̜9NAAիWΝ3|)SHHH̝; SSᶍd2Çuuu@|п˗w'@]SScwwwd={vIwٲe ʃf}˗aV_%'';;;!dccr7o>}0++9s樨yҥK͛gccNjjyRSS$$$YT*uBlccb.\� ӦM|Y[[ۼy `68sL4swwՂ Tf7n,++sXZZΟ?_CC#??m]yyy0p8FÔ(ի#""0 :tŋ:aQQQHy+''ܹs'O޲eKSSz×/_VRRJNN??K}mri4?'nllξ>f jkkĠ ޾}{Q[[۟l^zUWW?\xqP࠯FjQQQiii^ZJ|GSVVQ]]f "=zӦM^^^FFF訦FPMNNlllD%0婬8qWqqq2~x^… Ai۷ׯ_C-YX4?+aP__AiW^x"˺|rUUU > Cʕ+222|>_UUa0Yv-Mܽ{7""y˗/"S!uֻwjkkgYY0I9͛7ǎ={)JJJ<y_x>.]fmm~zYXX 8æ0Pwԩp/_XL&?}8x SRRvO=z4%U۾};a[n%K?>k,L.^'1 uׯ_9sx`nn0+WV!׏3<Kjjj 1h BFFFVVV• rvv~i\|Bܼh"555 'Oó""".gՠfǎ#L/\(/1wܼ<h333sTVVzxx;yNNLߺukǎK.]t)4k#((իW0nɰ d\\\`\Q@@G<==Qfaa!ů�B=I&MZZZ@2GSSرcy=ϖ•ڄŋ~Lf@@@VVKdKKK\t ðh3ydH- æM6m477NbF'O"HmmmǏN@J_[[ 80 Cr׉Fhiii4eB'>s ^K|ӧO7.11f]IP^^uԄ(8wIKKC`DH +466vDqƍ兗h[x1*)) MB ###cii` FLbŊ+VsQ,STUr@@@zz yIIIVVN<igg }6fLk>} 6 ߬EEE999d?wܘ1cm?t<|aZ{9gff禱qw,r\\9An"!!WUU<\ihhb >2M OëbfjjZ^^45jԋ/ �UUUeggbzmmm-&&6vX.wW=N3gΝ;w|XwJ>|`٦!CUXXX 댩SBd2A)55U _0s̀�[$ڤrYy<ZkРA1tPG*=覔!333((F h4a0\.?PPPӃB 7d/_BDi4gJJJ X,~m"%KKϟ6eMM]2n߾mddA|O>$acʔ)0$~Ӡ=!C@p9.'.. v\=^]!&&&""b+WkԀK,͛_AQKqqRSSSW^q>p-h0n5jȑ#Ƹ' #GŐnP]]ܼa ɉXoL;*q㆑L.]i=زe\c\.WSS3g|pff&ji&|`m֬Y#%%ݻwٳ3 m zMԬ[{_W4#M%*A2סC#cLQC2OPfDAAa7]_}vm!}}iZuؑ~3g@퉉?(>Ļw<x0}o ɡ|qڵ)))FFF(166gϞMJJjnn'O߼|%8>}zZv]]]6mI4%%W;w.**WӦMCK53ښZ7cccQv\bnnNp&8qpwiiiر6X/~nt``VRRRdddWWݻw{r۷oG;/^xׯ!˖-p… /+))w366WPRYYYZZzEuurkNC<Hddw>|PPPgi&#39w555QEMM x(((ׯ 1 8pQ>zhԩz/=�agP{/|R-Ѻֆƿm۶b󭰷i/t\WWwu9y ,,,|$<ˋp$/ C߿N6%h;VTTd~ |Fuu5Ūu)a_aΝvvvjRϞ=p QD QQQhd2 a&))) :88Xj& m'111ڄO%:;;}||%%%aaahҧϑ)8v옿/ ޼yTUU} SvYE&> >31 -ʉ'~  ѣGcǎŻ sʕp=^l\Ԅ<hР3g2D[[;::P>|PKK ?=>}zAAIO87zBWWwȐ!F K\.knnN"a3\WW6W̙ 'lmm!ZzŊQQQpaժUXw!䤫{1x>|t>UVA5Á>%%%[[[F햲/_ڢǻ`Ph'pð%K(**DFFBf/ٳ9466șe˖ݽ{¥ @`ܺuŅd466BNU=x`j=ztVV$*++>Gmm۷oa7n̘1^\\\@@@_SOKKCs ;;!C̚5۷F2eJORRRχ/^QFa##F H(&&֛` ))_"[) La0aޜé3gnnnW\fXutt<~x^o``PZZjy cbbisW֭[J޽|r []]]㾂/~IOO`466fʢJJJfggS(KKKR555EիWFU`j6aSN>5C*ioo222FTTTȠP(ȏ`05ӧOeee eڵYYY#G]N~/--B9?0ӧO4MOOаB̟?& eӦMk5iҤf G1$%%ǍS "//i&gX,EEEڂdʪ08vuu7m޻wBX,)511yBQWWwwweEEᥚ e懪BFFf---+K4_0 55BkkkЩۍѣG=kk뤤&(^MHH9rdBBB߿5kZOVhyyy e̙0FR(",/&Ns\.NCLs]b\U ða +**(>jJN4 F 'OP(999X|B :J11 2i$|(N722ODRO<YTT�VXCCCYY[l6LCtСCycƌ˫P([lR?#[kdd4mڴGh4 |r<liiitnP`*!IIɒ/]]] +ahIIIrrr#FHLLP(0Wr dMޔ-ɔd0\.7===55U cP?*WPT!B$&G!B_DEEsg;0 ?ȈTlHHHL+1L I`dT tчb~p8 0-??x3#2,H]`h4tzVVO:C?*ۊLDDg[UDkk ͠lvGGHDDD^^^ȑ)))IIɾv})KKKAJJJ/_444A RZgg4<XAZ^^ C*6c*B!I|e-ٳ-[k׮a6o<D+rPٸqcOZ~7o>p�HbpUII aVZZ|ׯ_3f ({Zj0{8p$ӕ@^ <uaSN%v0mذ��pãCDD7n܈.C޽{0`ҥ_޶m˕`VSS;l0<"?f0Z^ ]ƍC۷oʕ^~}gg˗!ޱ�&Mf/^￁x |/axiӦ)Cll{0 svv0̙3x;???$պm6???o?r,$&&666 &_3 ֭[@@@�u*Jݰa J(GFFb6|8aإKDbÆ Ǐð/_ܼy_ӧO_|9d;t:^D@~ݙL4^ MЌGÔhh&�z<xtx<H8r0 SPP8y$�LMMoLϟ܌?k6yyyݛ7oիW) $޽{WTTW3::}Bzڰj///2}?}\XXxͥKFGGWUUAbbb5Z╡{BCCg{{;R0,'''66^\\tM477ï״I&!Zx X~̙3\KDDHMM=}4ZC8؈o h`u^wKjjQҥKA/$xxɁRDDD[[+&&秧[nْXCd;ޖ??�Y5ܒ r_Çsss߼yڴiԩSUzu|۷^[__O"6oތh ݻ'עSNGر*%%9ڊ˗/Ϝ9SYY.q@=FR7AAA hiiILL<~8& a>)==f`Ϟ=̄\˗/wvvB"27nlnn~92۶m"۷d< `FFǏEEEh~533ۿLR\\\2_c2WCCC㫫;e˖ϟCb~~;w,X0zhDrԩn{3p@RݻOq)EEEԄ ~RH&hQ@`PUUERaҝyEEEFFFx-^`OO)S<z<{ PQQqww3R*0lȐ!˖-eee`?�{1T*m۶S-+**nܸI$R}}=</&aǏ۷o#u Q-,,$$$\.a&--MXhiiggg_4x`̴[̛7B 3@BBիWA�ؔTj^^`l UkTTdvǏ'X˗O0A\\fȀ)`&د_?xZZZ`ƌh3#$''>a%[߼yd 555 ?zQFPRR1233#\9|"\ ݑ!j3RRR0,;;@ҥKt:ANJJ***SYY999XPPxu#`ҥ4-55X,T^RRoHMMM؊ dĉ+-TЬYߊ+\]]ILL<s e1 #?~LBB8!$?~q&###>}zΜ9~U7۷2 P999?>}<�(̘1L& 8qD:VOHOOߺu+9999ě Xknoxsrr͛@FF6??or,,,jkk!G+�� �IDATWS'O 1ϟ?477Ó 3***L&`�eee=] xwޅŊ4Pj:_8 z*dlQ%Hͽ &ʣG/] #۷{ׯ_CϜ9\tI[[ nLfVVVDDW(ٗ/__:f>ЖTmmm;466644DmQQQp_><</TVV{]zrBL2^tiC0@HkT*6EEE2\VVƻ{9655699K, :i9J\\\zz;3- 77 SQQd0+++!!k֬t|yII y!?oPP͛7oΝWRRB:l$ ܉|֭[\.-auq_•k֬Wŋ!??ܽ{W t_zTaaaܿ?^OSSs޽h ǏGη3g ?dxx8BYlLnɓ'===ƮUVNĉ@ M-566WD&&&"iNNLp¸8mmm097o411i:~ر?wkצMU'N?~:HWB>|ݻ fll}B}cǎ~xAO.]v7MNCCFa%99;88L:?~|PP kX={aÆ~qܹ=QفYYYW [ZZ û֬YQ&slقNΝ;w׮]hW@\\ DžH'@7n8րRRR<<<!YP 888fjiiimmq)ݻw0c-??@***Gzʕggg4:t(Z8pO^ll߄'O/\[6mǏ2؈@"t:\eeefffֶ}v}܎f#tGQRRrrrB -ZͦN/X`˖-&LOgxqffu;eeeаaöom=:0dJVVVfy_oEqqqVV455'&&ɉ@G[~K@hh(@ikkЌ͖-[\]] йs޽{̘1dWW;"_ ^& ;88ݻ?x(lOHKKCBꇯ^G@DDDZj~h2e/~>u]twnoo_|yoܸ>}G/\' @~~!`̘1#>>7qqq^=2= - ~ɹr N̙ qKKިAS(^ڛ͛7?xqmmmKyy9voqqҍb}/qFgg'>a(իHѣɞKKK{q```OhjjxAmm͛ c4@� dTBEL&s߽]__}<"l6F^۷o|{n󃨫355oo0 { 0Z[[mmm]]]ѣ~~ 6nܸjժV%%%G&gT*%K;v>|w 3իW{xx > L׮]TTT>}獏=BYrlj' qӦM p cr<شgΜ [/^p8k֬quu ]۷ٳ[niXX=+ $%%333UTTnܸOr[433ܜ*(()A:tnll ]III (]]]gwss;|08w_/ 2+--zUxvR gO>]xqkk+a uuuOOOxáL<ZFמ={ ?00喕(;uA/44'K4hЭ[ _-r \|r8{?ڵb(b[L>B@̙3~fmm a `>Ϝ9<\.WDD'W\NJJ uݿ۷o3"&&0lڵ0Glhh022"+ۺukAA~hUTTDÑRBBBzDNR>ˣ0LH$ [YTT`-_ ú@ ''IPZZZ亍#d2d2~K`,89UVVF歹|8jjjgH$AτQf#Q\\lFuuu'T*#H544"WDDIX,DJJJB n8&>f9a|$ںmNR([.�m TBBlގo$ЖZ[[aC_~7 H$>n(DJeh$Bm8ЖJVEs8[j9a[K1K m}uXUہ %*tզ&ؾF}߆ /F5l6�0atB!BmMhy%ھʑ" rrr ~L] M )@!@FFU"$ہJh#|>7,@LL\0bH\\^BEuF>ͩj ޜTF"2ޜr j6nx_qa_;M_zٖ:DT(&&*]RR+8%[}!ǚB!B#B!/B511jy8  @s&iiiˑ 娣CTTTr$///H"@U5<ill""", lvLL B8@ZZ e d2jp255&GUU"|" D �GAX&G Fk}ҌmB!B' i:с�K+lkkC=D444`7A,&ɄRRR(PSC%BUTT  zlmmůZZZ`HʛS^:^P[[Vl68Q"FxB7B +6DׯX0>$T\.Я_?nllHBNa Ȧ" (a>F%%%|Ձ#@oał3+(hjB⣥\N̗D"X,p2w|Loy;::l6>P0j椮?ChK(ͨ-tT@KRgG9)>"0 2ۖT*;ݾ f466*++RO%:�?!DpihaXUU  F?�(AahRѐxׯ_GN0dxH$7$&''#r->`XeeeIIIxΘxΡCC͇_ܹիM> 8+++ƌ؛w5֭@ў>} +<x555eee3f[?aɒ%4d2E[l%L& N`7o@yfHIOOUVV.^a޼yF$cH<p� _E}}}YYْ%K@UUU˗/G{X,VFF ŋ蓠T ~~~pٳg`^j$s'//醙eee'OSѴ?T__uVH|5daa@N͛.qqqp޽{-=y v,<<KǏhj9R-b2eee xC4D>}W9((^z}xi]]ݦM 133SEE % l _իT1J)//BC]|y֭!!!FFFTTTf͚E U\J[SSsHLNN ̄222 ̙3'N߰aːH#G|۶m fggכ.Wvrrrbb"1<<<$$y=:duժU***@GvE뛛cD[[3Xŋ;wÈrw~f׷i?~|]]0IO0Ǐ>>>𢴴u """nݺ0 ۵k_ w6QQQ999l6[GGVUU`0RRR%333** ң_pᴴ4Dٳ?+' Ԭf֭7oެ]/@޽{gϞmlljsرcwyi ˓r>|荢˗/ֆgqȑ#<i͚5JJJsݸq#h a``H0 ,+33s˖-h[ԃbccΞ=pBPhnn>w4˗/O4 ߊ+TUUMFM6H$K;::JKKAÍP(QQQ.]B!889;;N>njzj LkBxe >m zqfddx/4>|{x۷otW=YZZÇ 8ǫ'(***))uuuQ}z1r!<)JEEE{{;>22 6�>P^߹sD"mذ/VSS<h AaXIIIWW,++;p�A�|VI0lذϟ?OL&C^TUU$r:::mmmp@į` S&iooG] ٳg_pH P ݞh!APeڵ-adM˗%%%AF (檪TTT޿>EEEQ[Յ ( Ž~Ν �BoLxӧO/((�=\h4ԑ܏~^&L(//߲e Ly3ËB}}}4j(xъb˖-Cݾ};VUUȠM&}}F @|+LLL> 6~k֦h$444z*8gnjkkm苜֭[ɚZPP7z7od0[ $$f0揦&_&''c|rGGG?vXqqm/_qJQQQMM J{ٳgl$%%-hSVVnoo·Xn]Oą...Pk׮ŏ'H{}ݏ&VVV>}zYS `مu-qԨQȤO7nHLLtqqDFFUCPzQ?ٳgA4#?߿71124!}}۷#<~ ȉ:wJÇG !,{CC-Z6 ><11199y׮]yN>m``VN۳g(?VWWw{KFF!!!3]ZZ˗/!N;֯_is7qD##nodrmذŋȐ'&&޹s'$$dϞ=QQQ Vuf"8\xmQQ?~{xxm+Wjhh̞=GkkkۇlʕPzǏ罥IdҖ-[֓cMKK+$$]@%օj%"Ν `ooVZAAA``ÇoEyyŋmmmmmm{yŋ###'~޿-flllpp0:bzb --b=ztT*uXEKKKlllkkWg\LMMA:YKKkGݺu+_'޾}tn\uttP7IMM鍮59 OOOWWR6k,qqTpX#tvv!�䈃*%%%7$ptqA[[[UU~իWTTTHHHTWWI|}OxyrrGJJJYYN4hPII,aj#'O0 Q8ޏA{ɫO6͛7L"Ovv1~ ?SRR ƛ7oM/_"""{* >\\\_RWWGRsrr|YAAOy-^^^)))>}Ko<3HB|7\]]pɱ] :::.]dkk+..`< [nE_32228//oC~Odddr޽^^^ߧ رwKˈRQQܟjr` o,++p8ك x񢑑!|ǧ &'#VZGArss  o9]z;cfkk %`0TjDDķpmm3f|LjM0 |J&_y={ uӵ,|Pܧ}dgg| Fo5,={orjjj<==n1hРrBð#FBy#FtΘ1S#GBb}}=x36l<0GOJJRPP)w ihhhjj) lMp\̦&CCCrjaa'733Iw@RR~AbCCȑ#*-88XRR;h fΜ:N999333"&O?~ @[ZZMMMُ?7?ڴKJJp8(900XWW u|ϾS²Fmlgg~uFȩV>V̬444+kklu<y8RkiiD߄Bԕ̴ƍWRR{TG-III!/_/_a`C A=3=~c &&&jkkB\\'acǎE_^\\ &ӧObbbmmmҁK a8vXc9 g*�TlmmF uD"ƍ/uuuDuʔ)LΝ;w\ \\\^zm <<<1 KIIQUUK̜9C8Rhh(B//{`a9>}%Kvcccɖ-[;&/;Á2e3aEEE`rVXqux˺u.z{{, �ppp@t !!!5 ;Çwss;r] U=aڴiʕ+hk.___ ÌaR_v#M 6<z׮]<x3gxxxtvv]|n!;aĉW^M3|,{hh͛avLvڅais8( i#Fࣧ<<<N:`8KJJ2frȐ!iii.߿՜3g^ '' j*}7nܺuм_rexx8zӦM-/%P�]]]ASXXnnnW\nܸ,o@@�ljwr L<[m$Tt:Ƕ عs={`AËc�� �IDAT} k?k?k $Rr !B 49B!B"e&HPRRR` v&G "&&&09)+('!!'9#CТ Y{{{YY $L& RW CQ\\˵E[[[eeeGGG_M0{fid�Q(AZq\* [cf!E`V9,d LDDDDDD8 hooW>ixierdee!Y0[333AX744F5%0] "JKKipPTT,**9r E UAB!_9iXRR?:lSNE߿aҥKMLL}ԡC6n'}}}GHII a=}}}mCxMSS0'&&"BL .\ʮ^ ׯ_{^WWw=,M~~͛71 7nuÇSxb8?W ۺu+Q�|aFPTCCϟ?˨Q-Z^z)aӧOͩcǎRJ#222p0t tuu{:K=z~ZbP?H7oLPسgPttt'?}vG^… 3gS F4h-**ˀ &ϓ0 spp@,>#cǎݻsfá98Z---_‹-B1/]d6m+޿]G_7JKK():7k8Ongg7eH˗YV8pۻM'O q�ּdܹchhK<b o>!..o>8{ao ׃!CdߢUNEEמ={' ϟ?~9؛ϟ?CbLLL[AAAaaaܹsz(_HӧOC {333k v3^r RΝ;Ҝ{n<[jAAALL <Ϡ7{1 {E 0*)bbbPZZz H1"55΅zyyw|||v555MMMaaaHΟ?߭ Bf stH9~8>xa׮]gΜ"##ѽKJJPbUU:x.]:z(/00PEE_---Ǐ )z } mϟ?Άϟ7H$$^r#G q YYY{Bvvׁ`ռx"Jē'Opx@@שS,m׮] 'H| HQĔA۷% :y$z)FCSCC/^诤$##2AhH?>LPq0㡡H0{޽ZZZB&!ϟB%+W4554 'OT*(^U Ǐd2fЇ˳MOOGnnny4QQQa|iYYYqn<x!\fgghѢIJJ@f(xUaIgooOLOOWQQrZZZAAA4HSNN Vwyŋ :;;-СCUTT@!<</^g2C^ZZGHMM}~ZaSOOoѰdaazj *#ԑ5_|ٛ~]aح[xgϞUB^^,e0 ۱cǏ-,,^x1w\ް<x JII]z`}}3b[!5tP \fMYYȑ#𪠮Æ $ t}}*/Y-006669r$X " 6J ƍ7`#%%ejjZYYI :thO 0552',eddB׮]ნN700BOOOZZ) 8;;wK#%%z0 F%L Aʪ $%Խ{n߾ Z�6 QTTBYY޾***H˗/@Έꈍ5ogggȑ#/cMAA%??IDwmGva~~~=:yy;w“`nÇӧOp.ErE'N‚D/EwT9^422իWÎ1P:t|ڵ͛;wDBttt`ꜜB*D? :8}zٲe=]_=}VX6*__f;?,tq?GDDِjBꊋ>ZL>>IMM ðI&;Dz}w J{ddd?...o߾E䐀wM2w,,,,,,ZӧOCBB""" C۶m!))))--} ^PSS 9sYYW7nH D:T(ӦMkjjzɓ rssѽH0!!ADD?NNNޣD"A+**cŋݻ˯LGGG?p`van5tLfff&<͛7 ӦM-((peqqqEE$?M&""`0^|+DR]x1ll�.]dcbbDEE9q RRRlra_QQYA TPssscccΝK&zjbtRS7nu~G+++o޼|---: ɨZYYuvv>{l…/^�@ի$vZkk7IPTk///fmi4 ߖP߹x"Nwrr"'‡]mر.߾}Ç/^$B8= a.n:P^^~̙svrEYYY{{*wޡC:99h؝[[[':99~:''޽{NNN #UUUި899h ŋښx20rH'''GGGGGGBߓ+: lر]KKISSvtKKKi4\bhD"ϟ?wrr"l5 嫦=6e'' *iiiwHII{ˋrttܸq͕nS[[[x>aMNNѤI% PRRu:::peaa!^s̙NNN lԩqqqgoZZZI>}4p@ؓKgg'$r8{CaQ2L}- YNNICAGZ_9s@9::aUUUǎsttImُ=Yի_.++ *�+O<Ā?dٲeQQQ222ns7`xwh400ɩ޻w6/@uuuLL la\2p@�-ZdddRb\\\"""d]*2׮][|9?ىæ 0y%(G|n@/q |'~!JtRggguu5g .]9 r١Jn7z*#͛, XvѣGb=x𠫫ko4S"]]]a y-,,1..|%%%xw\]]Qe>} $.NҷV6"lll'066NòǏ#tDsod0v͕UA GAI$R@@�asHKK#H8CYJJ lחf7Mt}"]__Օ hYTTtҾ=.DHNNf2=9l?|S73gdBZYY5k! î]VXǕ;wrrr 5h OOOH߿?ʿ|ڂٳgk!ð'NFwǏ@p.]jccsϝ;N< a;w|ڵիWCP8;OVSSMoSSSGGGH1b͛1 sppu$؀ [ ҰyKLNKK{Վ;PZ^^^WW,/֮]{eTO< ޽[SSg)** kee吐WCCgggC"aӦMCJoڴJB[0 b"##a;ޢ baaQ[[-ZtuH>}:رܹs2|rE;ya|<wMݾ}Gt߄7 |||,--)ٶm[Q0bbb~!''dIÇ߶mxQP[4iډ E19Hø[XYY544ƌGnܸ!%%խQKYXX@\͛7WXd2ĐҨ}vwwh"""111̕jnn DB!H&x3`�\^^؈/f&qO[򌍍pl $$$Цtgg'STTĻn4 N2$`%^RRڊ766s$WГD[gggyy9~f<uuu|alIEE #'ǏA<[0wa&##„d2xd}}=Qikkw!H}|qqqꂃD 0!q8Tfn^c[`BVV) ~OMM o|QGG xLƌ#""f߿h0ݖGV8/ڣ<x0Bmiذah=@ix$t:Z֠6 wp ۷oGMh%%%-VUUEJ"*++1 8p  {r^JhRxrss3ЀZSS#**pYY;??С9}f? /VTT4x`|[" M,`ԨQaа%ڄIUAUA~ UAB!OBhrB!E>|@LL =!�<SjIKK X$$$+ yy>T!lTH_I39MMMxbM�ł8F{Q  ȿ5޷f RWr]]]68tvv޸qC$i4ZMMM_Ω߹o093f PTTt钃*99'O 9))wމqqT\\L|OOEEEݻ'HE 7nܘ1c&%% 4ƽC{ږT�?!j)))19ҢSM⢢# IIIAD �9ԇD B!Ep\1 p8ϟfm۶Ablll&d1?� ͅI%sMHܽ{7z?$FDDX,֒%K 133 "mSxcLL <gF6cΝ;'$~^d2444455cð*lp>{ ׮] f'OģG` رc CSSSCCÇ? rwݿTM\b!e@CCcY.[^^M:C^X,1k,8wrmbb$TkQQ4gԐbcc!q۶m!CQmA˗/Q'L�H!RLMM{bA cl6yyy cРAH崸Ѩsܤ$2j f===!Ç=uX@ل<É͛7ï<@5k$ihh蠾 `0ttt444r322;-[իW!q߾}ׯ߽{-U544$ Mϟ?Ǐ}V__T7]VRRB"H$޽߿<}xtvvN4 ܀oBn}|| eӦMh7o@0 VUUĬ,;Ynڵk!q׮]p̞?*++ ..ÇcccDسg!TU.\ 7o.//04##D"13fegΜׯ_={g͚ܗ.]Bd2oΛ7O__/aؠAH$RFF)a_|A*d2Ϟ=K A_|0+Vػw/\رcsrrH$RUUojjBCCa`JKKM4eʔ^lZJ__i͓QH+U+g >$Yhh$�3кuϟ;gccs5H6mCJbb""wG Ԗfɒ%[nDK8q>!j喔L:sz͕+WBJUUՖ-[@`bǎcǎ(%J__/5KPEðR}}}@xׯᱺcooosss R5wC˫1 322χJ_COP|={;@0&&�*++/^Lpvv' ZXXdeeHZ^#F.(𐔔Teee nD㏪*D"#۷o0!@]nhhb( Fبedd8...<H3]VV73}IJJJJJY,%?( JHHW+++d}UdO6 /lC:;;===2�TTTBի>>>Y-JrV&,>BfEDD^* VVVVVV0d2rva) k#1GGGx4ɄL&켼<#r[[[xXp… /\_J]nsKRSS?4d`744TJJ )X,RRR/t�xF"ԖZUU[ DTt:Jeٽ;Q,X�h4%Xo߾Ɔ0Ÿy&?6Z[ Qhд`"ߓc2d^m{9s4h%uuu-Я_?xٳ PPP`iiy%vuu]rB5kd2njjkmm]jU@@wX[[O2^RRB+((XzeʕYYY~E9/**  ƣG,--wI&0t)KKSN ^h"䃮.Eha 111.0wwwKKˠ @8D:u*䩪;w pN}>111...|$]LLLYYvCѢ---x\.2h PWRRhp;4w\KKϟ?Cg硥= (Y2p8jjjQFX&?|�WΙ3C^^^�smm-U*ABgg 8pjH$BBikkvZ<k%a_V3f薻LNtttYYYQQQQQ~Ss~ .�� �IDAT!;FUTTT7@k***p{nn.R=== RcUCO"T=<>>>lذ@seӧOCضm޽{n 5kkkxNaa!0檨x&/^ ;wHHHuvv~qQFA Uj Jk׮!>>?GGGmڴ UWWۣNssҥKރ.^!xTMMޙ5um}dSd(2P+(*VjuzZz[V[|^۪X;܊ t-ZY:$,BH p{\DJ!{8keʤIrrrEHKKClcvZiiiYYYPP*ִ4 nRWW6-޳gO~~>xÇ%%%^{ѣ} Tcǎ &<V_ ˗FC)##%gʔ)A322z=`m۶tǯ^*lm^J.7oeeevxQ(}FAvlݺ522rغ777Ϙ142ח|z뭥K(h ]oВ\S㫯ƚPWW@Rkkktmmm‡(#GBy [lyw!&-y<^nnhƍHPcDVVVo:g3j߿O_x4kJJJʕ+:u?ؼysMMMGGFA#nXd2-`niixl}-~zRj3gn޼i:FVV[;wf'>>>(oܸAvLBzF jT N<m۞0gcRR˗kjjt:]SSD޼y}>rHJ(\.r95x+W<lm\Hz8>iҤ,ރ+9>>>dDf666cǎ%=h~[\/޸q理ޘ4O?府6&ɃnFZ0{{_F1$$$%%eݣFB3$oֆ q2eJAA#Bn޼w5k<Nz9<qhX>s'DRGK577oٲo|Db0YAB|~s=a19seJa]{ԩ7n돼VP( ׯk4>fOrY,vwwwW E⚚WWWSo+@pYdP=z4:_.l':(1T*5}kWW:hccC @]]yf@@RZFsHc4AT0O(KQ+˭ @>c Ga#е2 /Z[[A* PR(JZp) Qi:矫j4E7rHXMK{4HT*ut:ӚIddx'UVV"E///Hp\XxٹdX(lff79:dO D9d' ooo.ֆzyyl6;//-X�鍭3 .?d5k֘J%:;qQTcG\VE, Q9rJ"D瓙リSHHHii)q 4tVjkkŤWD"!KcwQF}SRRB8^YY)X,JQ[[[Q.{r^pHJ1O>`0]ð .\ð+W۷ܲe 2߿70P… spp@^ 0,""FxRðy-YGFF:fd{GE}7Z[[vǍG&pȺu%Ѹp˗W׍7"ٽ{{gb@Vǎ={\.P((궽}ff櫯. _t)ĉ|7ш.^^}Ƙ6O/^:u*Avvv(🇇Ν;Q4ѣGٳռ+WHn_|͛Q^oA3Y!ݎQ})tLp8d0 6mi;7ϟ7SFٺu#Gvލ̞{EJ>^B> .˗6b˖-}ѡCPɢ xb{QCΝC~t<Gw҇ͪ+`<===Jlg] "eevK6M6ʡ˖-Cə0aK'mթ̭[0=I>ŷ%A +,[ ð\5w}w޽?,۷oժUeee!̙35 @gϾKzf<yðO?4++ݺuƢmmmd}^pEP_1d=NZLӧJ>}vTpaaa}iZ*msMNף$ h3K DBոm,h4&yyy'h��� MQ|G*7H���$x1 H$j:""͉uIo#qJNbB..4RZg4-qWi`SDNh4*ϖ=K^GA<(L* % Db,⵵jKJFq[[[-IG X,h6R!Nj*zK,omm촘uuu 8r\PXҫ8888P14I WNWZZJPkbo8󋉉ZVccc-i`0|~)L&3D"h( 6h `^QNQQ@ F.3J}x5///.zlo{6mw�sG D"KJFCŬA,1R-,E;Z�...a`ozлo9���<.d8&OI򮩬���̀,,6iJ/ӱIRV۟��< ?y6-|s9VVV:BJ� ��Fӷ0L:GG  &X.�Ν;wAr�Q b91$F F`q`0;��`m h4$a�� A fT bb0 F��  fh40ӫ8 �� N#b!X$GT\.7::I��3%< {,a0… </<<��A"ܽ{(m鬭J寿<O���!2͛(gDD@mګj9NWWׅ FiI{���$JzX)XcXnnn<ܹs���2h4:...` KrHqqqwvv OPT��� ϟ7fҤI4aPl6mkk'O`(6��� 'OT*MFRѮkcﱆ`aaaEE"0��xf̘AR9ΐ=?pqqP(L&3<<<((J,)8� % eѢE(#%9 @{HST(E`(Q* �4Ϧ~�7 t���gJz\~#���`xWzkkYfA���QդimD!���Nx<+���CH������������H�������@���� 9����H��������ÖJw!  ||||}}{Ν;R4::)Rk���Rr:;;曨( Z[[wrԩ͛7[n]uk׮]|9""iߕ+W-[%M���,Gr>'/K,XjvTTTTVVաOXaիWn߾P(^|E6}Yg̘a4Ϝ9<yrrʔ)w>swܹ~z>_TTT__Nquu񅅅2l666;wERӧOR��Kh͛7kZ^_UULgi4 Hdoor5رcFѣGڨTjHHZ޶mە+W:$JAnnիWJ%F8qҥK<.11^vO?b r޽QF8v)--=}tdd/ J8fnzuHwuuoذ?)((سgmpp|M+++?쳀@(x��!bt: ]֫߮]:qŋ'N;w.a3fHNNquuݶm[zzzll WZ5j( 6m Ê+tzRRW_}xJO?￧GGG...F?YmӦMRST_uZZ^_r%T��-[,_<::z֭/9frww/++STo}ݏ>h*Ik׮}X~��0L%ĉ}ч~xnn߾Juuu_rݫVTի < t:7dP��� ׭[aXHHk9;Yf}=:OR}>xV0h4~WsΔG;wܸq#66 o'xzzh���Qܹs  D ƌaXLLRtT*?qDPPܹskjj>r-Zth42H$JOOd\.妤/ SSSJMU*U~~~nnH$9sO.[>/t'|vZ(u��^=8NXXh4 qΜ9`0L0a#Gq`0� &8dɒd6keeǣ)S,[`x |;zQ-[dvvvEFF%$$tǍF @r���nk&hT*ٳg̙y��� GP_���0D���� 9����H�������� 9����Hd������������H�����������_ T*ÁL���fXC*9 テ<���$2IԩS!���h4<ʡP(֐G���@I����0D���� 9���eA+l60<q\T1wf2Z'FZ~gaccc,W'^T*ζt:݌AZV )YF 0l_CM:uڸa`0QԐA}o+[z?4x56OZmzz믿h4ԔN8 p-VHFj0krrrd2٠>BR P௥ݻQQQe<;&˟wu[7( 0AKKKnn`7\OCII۷Xo0��� ����$�������'`(KKK)Rc2Gh4666w1?aX}xutt;;;{zzvA,xgv*JrF}0i5FbX'Fݻdupyu:nkkK~t*bYYY#jZvs@W(8$˻,p\3ʐϞstt|%{UU՘1cL˞fgff&&&zxx'&&FEE]xђޓiӦ XV<xয়~… ˗/7?n?<yܹs|ABB37 H3 LA, +W̛7/::Z ˖-aimm-**B+WpRaaavvviښww :uuu^^^q988ܹsG.s\'Jccc"CZ[[wޝ0}ӧO߿Ϻ ~777իnjd{K$b[@@jjj{bCC9rYTqYTKҥKoݺ%ܹNptt D577:ǛBCCCCC0 +))@FFFݺuKR;k0 q?@g "KJJp rNNN::::R(XLPx<^GGJE@;;;iL&Ej9.JΝ;mڴC/]4##U*...h܃^tӳ%00}h޽kgg / {@~~~yyytt4a"ɩtP(Z-d###ZӧOՠ%55ŋׯ_`ر*SesDD7oT`\\F3@oDLLEI)fb٥kWWÇP^^^ kmmuvvޱcoqٳgc/ܹsٲe?|'|APRSSe2٥K0 +**~X,_}UBq)tazzz@@5kpttusovuuϝ; O:[o?^R566𧦦#** :1 H$w޵hb8""ƍ %22^&3>x𠼼t: BCClvmmmss3QTvvvh3g>ta#F)//;v,қo&""B(:88ܹ޽ʕ+ƍ[v333y۷ogggO2e'Fx<F# pvvF#F#˝CCCkkk;;;J%ٟCꊊ #b֜?+W\`a-ZhA Ê}^tk.\dl6LNN>|JJĉ5MEEEVVRAe.]tٳgϚN@bm۶;wFGGgggXdW_~)..NNN~&~ekk넄dggoڴ`Ϟ=qqqo6aIII-Bɤq`Ϟ=6mX~}cccBB˗u:]nnhLJJh4/rkjjZnYiB>222&&`DDkkkddN+,,T%%%111aaaVVVfĈ111ޭMMMdz*++#""W^}[.;;{هBn þKF<Sb"##9NMMMaaJ@#Z@ss2Ltvvh], BPHԄ{޼ysÆ AAA7n[fP(3g?0k֬`0,X:;;;--M$59s ړ]֜ӃFڴiӌ3̨ #Gtgz{{ڵϞSRRǵԩSW^ߒd2D"A_wu+VL6mɒ%zoUT�T�� IDATf@ hooGFEӎ Bq';;;dNlmm0LR OI[[[NNέ[D✜d%3f ؙKlvTTJ***}6 !M}[[ T*buPR\\\""",bL<900pA$%%͘1B`srrRTr./Ϲs0 7oޘ1cЈx̙71,Bo;wHuvv ٳg֭[MMMȼK/eee8qBϙ3<SՒO1G5GD"QQQEf'ZF;rH{{fioo';::z׮]EEE74#1 H\\\F]RR^SScee%JY,*Y#ȒJRTV׷9$$YK}v 6lذ~zF_k8NVWWW7+hJ#<<<--6//ϯp찵OѨ07--ҥKĠ޽{}mժU&MpB{{;2[رa_} ^^ZZ\.?q9Xx<D"D"Vh4AAA666/^Ϯ\ZV$aaar$W_=rHvvyJʹMKKkhhvϿrJvvUnݺc46GZ-rpqqH9:;;===Й<ښN@@@TT ޽[ZZZYY%Nڼy3JXr%rlJKKSTǎC^ϊpܗ_~޽{*jʔ)o,0s̢̊ϯYfƍӧ[ZZzvҤIݻpB}}_~:yd͟?sEt:}N_bErrYdjdCRb{VK҆B! |>urrR(  bԨQfWsGV^P(:;;ۗ~ruu6mZCCCff{׮][\\IF} Hdv 0RieeY(OOOX:4Me˖۷رcڴigΜQ*Qqĉwmjj 3fptt<_-tPԔ933k޽˗/9s`yFۼyVUUUN8Φ\.&M"uuuEGG'$$(ʘ84+H7n*H$ Ś7oٳu:É+//h4`h4^HNWWט1c&MaA&&&_DH$ e̙)))%ITTɓ㑣Zvss0a !H| ѳjmPtzBBT*H$fɫW=S(Ƭ2Fc2F?[&tNlllFё@ t:upp1bA9;;;88z4fеt:`00L''GVʴZmpp0 J<y2*SJfccc_|E@"0ٳg#S-Ǐ;vlGGKTTi.,,P(0b`a2T*9]sx<*Sb%yƓrb4 bXNNNVVVΎb ''':;;\.r>>> fx<<ҥK###]]]ǏoD_cܸqA,K$_ #11%RПH$jiiquubϿvd斫;Z z:toP6wvrrr:;;Ν;/Вfӵ`0mf@&͛7o0ü:/�'dBK/p8 4:Áz1n$3UI70����H=`timtoˡP(v#<l!k���:ۍMZB`'i���`����@r����i Ä^rHrC,_̅> 8eeebf@{BsZN7lsy*ɩ}4RÐ{Yގ)H$~zg:痖ϵCNtiz= E{D{q A|>c RuBk]su"O᣽?oF`dCK@r =SY`0899K�hdXr۬qN8v(_;}��������@r����  bkk ��� ̰JYr4Z/W/0 ���xJ24c~J!(T ]h���Üjj1z`F3qOJU,��CG)9AJ;$RYU5690Doz( ���FRhy>( >| to//D(4FX+:Z4rFBI���X< BѨǽРש$Bo//:ɬ*/ }yd F#Ȁ���%@{ؠ:dR dsyA~^] ��`CؖԎJӓBPNkhh?8 0���|( /f2kêO����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/2masssort.png����������������������������������������������������������000644 �000765 �000000 �00000446746 11332127303 021066� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&�����* ���bKGD������ pHYs�� �� ����tIME*ۉ�� �IDATxw$}'g+ڛ@IE*tґ:?$ O!1(B B! ]PtZR$@ <0~zz{請tGVvW]7&&'_vʂi�f20M�09a_/aB|ϣ*pKKKp8���$Ɂp8\׭5~K#Yg?09a+;\?!ҳgbci_WO0?omG>=L&0i6 �AjU! MMcTM�`�B�M7��#a��(Ɔa �tk8JTU7 �`4U�QO�5 ݸ %D �RrO"uPQ.#J %Q`_AV[JIS�GZL!�;޳Bm@&�lT{d=`^3|PxssscәdH2  !HmOBwgu14<=1EPo,vc3k�r|Hg\[Jq_8ٷN9J<wdba3W0<K 3|ڨaУpu BsuB=POqJ-'!bK po3q<ynprq+[0|W&ugO10d߿: !s'z,4wuPK^% ӃjcBOn%sG N-ų2ȇG/^ C3PK:) ^YuG>w ,ZS6'{㻹xN/32ȇ9~mjRk_1$>~ uJN:4 \]˷1BQZS:u=ѳ*l%%̮l@9쓧_1$^<)>r]KB_B%ӋSZ?|'.l&ltu'+1|SKjOIUE{[C|L+Cu'rix!|I 1N/lOꊺ?|'i_Ic7V:я=qꕛS<SOBC|L+C°y7a{lrc4-.'(wfK;ϯ'S" M*ux굡 ~6*<~vCy/9Pg &1F!7'MU_KP͵/'wmjR9ы'_O|weቇ_o":ÞhcAgm>C ~Xw:_^Ns<vi3%8txfXœoܚQ> !<ynuxkh!Bޱ%QGPu񾨦-p5ג[BBd2Iol��ۭ7^xz^]Ƙt=NY5A0&^١ Jx٣l<U9ѓ[bM`쩇Y6Tg\8; "/3!3% u9D �L-PB V#l<U`L&0پˣK*|Ҥf�Y>x~!xhǫgA'4{qhz`N.PBKƒn&[qZNcO2\/^R /Qᡣ]\A8[ho!4M =*UKirg[6zDv:_{Lr)2 /^Ru 9!npx ^G_,EH,Sk?h|qz'T)) < ǻfV)6R5>taMݔxÏ[cB9:o^Ĉt>|cj)!x|1N =ԛ)ӃTBYMrgzOM|LS3EȣGΟ~4u t^z8nLLzc>J؂k悅Dw2ōvέ&vscܘ\+Vx"䱣(#ЀWeAW>J0mGuE_(=5MfJ㸇uί&ec9V(cO?<YE5DGNte BGoZDy}b`1oYhh2W^i -{tZҰn5Tڽyc�NhzoޚGDumb` ߢv6Qz?ʕvrw.n&2e;;</7>p7M]<z3r^<!{c7"3p__tGύmRBMM[K�zsϒc WC!8w7Zn+H^�KKK10nHP\!%{%!(r0BPՌr]#<%0Z,a@ զ5m|<xҾPm*h쑹|tSn-!^3<1.Y5F�ɕ]#]b1;J⩒kL.2ȉS*3?!O9ɟ]auI,t9[qJHOăv˵r<kt)* БZ*]]8qcz\k-6uSpe@sg-!;4f84'6:WͥxQD_p;S-J[͙x֔xvt) },F_ZD<ROwil c 8=Nih6N0z66ԥ,܉Nbg#T&2lTmZV4S>orsAwK1;ckhs7g&!d|):)VQz7V6ЭL*_p<vk.^l]/+a3�`̟;k/gt#iC"%tWojFn,wf0U. ŋij޼ܰЇzwy�G;~xcBHm4oL[Rk4 -t bv 6-˳&@?e uFV1"a#u\$t<GG-ԫfQz'.NslE`c}Tۣ. l-l4tYr>I0 y]ܡux1at[v.{hltq'_VD=~պ=߿:k�GNvt}BwGo^Arf"ύ,PBb^U77GbmBë;D/ g4^StY: ]2ɮC.#~׵ Ig% l sn=QQ^w798<s:j>O? =b?|N?}჏XU0 Rm5L0ʷ|SQܪ7Mտ|aSh-ٳ!zdhE{7 !(3xjN?d7]I)9OD>uRZ7bZGK>ZHzS}d!p]!ו8$ݲpk!I 9kiFi_]ivyV,2d!K/$K5!GP4)OFpc@sӽG~r]˜D|)ܚOPB:CNj/*vNo2_LƝ/{bXSe=r4K�`v]'ѡ%+$dumi;sHw7_k=n.@`d1Y6e]8~gbNx"�`_ F$|6tRWW/[hPH,tyI<;]-Ʋ B[h_sib #K>tsnbrp,h7UoZoe$;[N*MY`珄/On՛S?yƲ 23i4`!J#7RT}!)fݒݾD1I<w?8ʷx =yih�#sWW!A0= Ā[1C0:x-PU7rNOT_- wǷ,&rUqg|YЕxM"C =2oB.ac y{(OGS=:ɕkɢq{|D*2L`r5++2>:)C`phU7[m?{k|#J!6$t<]8uÜ1J:<nvltj?6]m=v<f@_8~yhBtRfs#{B;<( wۻjlەأ#ipI#"-9iBY]0FꩡT,'S߳��l/M~],ޘ>��g^)��ח?tB+le|[�?Ot_0�::/Y9s/u}za- $YWxu�-_iv37p#0uL�f}wʺ] ,׵R]ey%!0L*5E�X#|'6wR`'Fsn: !+z�^C7 ΠL  n /)! c<gzS_NDBc+Swӽ( NxײŚ>ߕ݆jDva0-`̝> L# ^pk1M K7$7T}ist LʹVBCSމl:PniDv~0-`>G]|wqB=)ZLSL:xb-g{hl+"uv[nZPU{{2Lsp{}Pr]N`^lY(!=!GS3w<G#lIٰrPЩ|:v{}nfWGuzeLﵱ8аR Nah!E1$FZ#'hⶍVTEdh{=UMϝLoCn%PvhBs>p 7-/ _rtn.lyJ|EYt5K<w3tU-m̀=B.q3<B-P И{3SMϝlsCZ~ۚ<d}4ņ&1(2: ɆiNj<Gp3՝\s[Ŭn-+ )oopK:s=zW1kOG-4(&*EhMb܉.ztr[Ձ[b?#1ۓ;GxsO:Pӄ6Ze1Nm b8tR\ם";{2ԁ[b?!9#,-DPF3!A@8g庺(=u"pw[q#:ETk�\;Zr(QU6S#[o0j߱.DŽ"^9nzm' DF2u!>ϯ-}#QDq5ݛּ#vTW5c)>=|\RbL$Ε:,[VՆ=S 8駎tbSwog+]t7k&7o,�ӾH@�puksq{$r"/*  rs+SnAqܱ<Y,T5ȝr-eᑸ3=7'wuD]-T:+圅rOr"p/(f&1:7u =gJ-yk)WS ĝq5 kCN;І:Rœ* IL=isr:dRBOwޞJi:N6̦-`rgO%hnDe9jFӚ2;BFCnw{(Ozf;P֓ӣQ|CWՆݮKiU^v>7$_i'?BF NNhOP,T 6SΕUp+ -r]fҪ2;z}.tCYIDF !~0NHOP*z$X)g˪Sw8F.ץٴ^OB/ͤ1A YI$Fl4lSumFN.픳妅u-r\WfM x%v 8.MA 6ӱGHO��nxJbVmTCL,T\^e:q3B\,n,d &st ЀXm諻Uail2O:X1V,uȝr](p#6tr∇wtt%o™OIO@*Wr�G@Ľbv)V+=s�˥^o?‡^%%+O}o/l��k7{d>\!cTְ#,y yNkn:Go޸›Cw¾ٛ<~O\u#�x]o Ǟ(eQwKӋ?w`Gq{V R�yf2BDD}$ B|2OˏŌ|.9c/1aHtdL1z8੭*T\ޭ U$FzCB<UOB.kbz$z,&]/hXLz{&!:I_X+sWKڪ0J:|of#Aa'$MObj:^*Gcj�oCµF8>GJfQ4,%kG|ofl$ -t)YU4@Dű}BQՁOwHo^-Q#Nf}F!1%QhZ(WGǢҵzCzk:!8IO@j.wp+w1/g`1q'[ZhFEz,&]_,6uқ =A| 8-ب0Bb>pa&PgE_O[(,:NnV6zcZ=}s: 9poP2_@]4bVJ㈇بpt8�N Eu'BRLYs t0"Nm7|2=!9� вdB�pnVc- 𩒺o<`Dު[Gm+[3ysypECn6\$Gܜ̓2GH!gZPtI+2OBZ)mѨtkP6?,]#NnCCQ j"Gz|nZFFIT@vX"=n-зg@A Kl4o. a7l8e@O[o>si,&7ˁ~'67KΗ{S{?'nnd{g>t?{14�URMES0QB.s!t-pXy,+n@g׹G ڨAz8 !ab;uN���erVm749B0\_]NAD ܴ=@jvYNMW* %r{aq:OpCT\N5EwzioT>.QP%œ�]N+H_+@\6u`{ !8p\!+�� �IDAT#hBD3rJZREœ�]'d7WMdrF-W0!Jdx2&-T7Ү"rK }# wdIMXzaD2dCUE ;e�NQC:OpcwxiY16-t&B3Jr'd֪2 wZhj>^Qn,&�sIEC+Bi5'Ot-d*G Anf^^6ъi~R#tbZR.,04Ug{harGSemB׳JPFk $2b*&!w+K qȉ6qaFc�ZX˨2;4]Ѷmt#mt.( HCzDBBE7aqu!z&�DCPvyiF{t#wA6^/0B{ (A'Zm^Gc6 9JLE.NF}t(7^Y& 2(!Z]XfB3; ij)qGU=WtVNM5 ]H*ݬT/T,4]:ZC(И44s5B;/XM Ue?4bܻK=ރwbmc/787 E[Ɂ}?ǛSkz;6ye|p̕aQ`Jkf  BPo4J5uQMyO?U�@C7sӡ|P`2SYTC}ިiL�c�`6x#!~qӋO~w@ь�BNV(S '(F2DQ̍ʊ uxnEO :x-ekW@]>2T Gno*C2++  "nr}M#ڨ2,4B ҚDQ̵ml KjBddKih0(^>PBoM@Eb.TUP+n/nbqD%t{I1 ;!߆�,4]P=S5=]hcqnVDak-+a(hCvmT5s̡7TbӃzjz% w* JG) #؎d4٤Pv mhM5r̡gvNKRj|"RSAPB=~z}MLqN/`N-VhEP zBjnhsh& ˰K*e|k(DhC5Wm4W3EPG 5<<6tbYSA@B~zsMQ a\YQD!dhI 9lE!0.lwڎn[h,ռzZmz|z iCN2$Pfh,2NCudܸP7 ݻSw+D6Հ64؆PXi*uVġV^k×w x~i|ɟz螕zvW�r]KLo~A:n8앾?<@hԙ7:V;slk�o = E9:ʖj[3a;[=4ȵ\*6n/&3+;Wro\\^ Z-QTUZ/SF淲nm[]^0w"#W54UAs|d! `q@]#0ꄺ2@a +M7%Ɯ0]5K` nt Bi@:h|Ǩk( k& ;@ĉnnˆ \6dN٨ѪBNИntysŌQщQP@ntsKLAĉnl°8m`(J4XȘZ fkf MR(4Zdr[hI-t>BkwcN/*pÅF"pQUQD!\ 6*`5fk斅vܵe Domq' F0j`%g9annDc.r( 7қw>ۨHD FB06y#NذAtd&+Ød\$ "px pk(\ Xh 8e-MM.ڎ&Ӎnu@!tѵu@_FqB%- )u@EYS0ꄅYѵCȶ@omm(nCmhan` 3Q.vn4k6Z PX;P{t"X6 5E cNXRF{�kF:wswzYחGwz<YL#f9V83_LG=w+{)*J[¶D,Vv|ܨ' CJ/MIm0 d!r.H*|-1Up|.E6Rf~(W(r@}RBHĨzulMnB.1pʆФ΅No??W !r2c,(2#A1I# R@1"YUf 9l %.Lx="9Tj€Ed0u E-"0&iA m#͈l8аlpNۨa>P)Lyy=0W󨨴 0*ia.Fda8B<6#aE"1"YWцhܜ7 ˆc8B G.Nf6G="4i0tz30#~:B a�mhCCE$S#,FZAzDn~A8\V:MF%-҆zx8@i �pB}4"ڶdjl6x:G�a(Q| ĈȦ҆ JՐ(]hB#yz*R82#` fSGk{;"7#2XN$Л6(gsvOQYRPT Zn `(L�bQ‰]!3,|E ,0(hшF&�1YpxahF$CZhD60$`#"V HFX6 *#'gԩ> ̬g%gw`Mdto :-O=>]M䪧=rW}iXU.G*r=?>.'L� Ӿ� >|b7:@</t:}�pxb1 DȼK*}�:B� �@,|O~�v]'�x SdFD 8<6¢hHD$2qP=,NTBLx5(EEc>4јH1Հ1IpGЌ́g3ʰ5À+E*=,um!q FJ2uejH׋wAyF(+.N FF{(E}1U:bMN�QYur` P>jEBTB[%:2-(EZPpWwiaTjDc8�"Ҏ6�` mLSZjA_4<0ADV\4#0Ns`P/ӂYy5(K9b1f $3M!+.L9aQ�@+:Zђm4Ué0-$[%TlP7Fw9 ͈ F% 8mi!urZH4hϫAQ_I2݄HN4"i,>*݉hLr6RMAI#b3 69N(pFUh60-؆l4(41a �!)^IQI)LP \Kj"J+!Qc/<}!mӪ�/<=K)|gK[ w@Ne~cG;}_Y`<]wVr77YI7WY0d( `<CzXl&Z+1aQi8^af^Ԁ&k\A}2+6IW|Tk /Og@b͌є�5ɌHϐ:@kE^zHP:޲Bsݭq_h64,4<>YhZ4kC3*69C ІduQ5(:ѭ=TЖ |B>jwo�h6А,6iƹC_PVѕ"_U[lNh(&=K]RM̉dÙ!#,6 mVYA!xmB>O 3-TjpDaa M7tN'h%0\^PtfghDlтZRNsQ?S|| Q捉S98s,-!hƤ`:+  <lxB6<nWY^|^h܁5FŃ( yzXl6 dh5ѵ_ %(AQ^iCmẘ ;Ś60Ն=U n2'UB3۠3_x؏qŚ%~sO<nO?uqOi_x~>xmgo숈<^@#*E!=,44UDk!^VMp5Ky7U|LI5XFa>PTiݜZU'd@BEdi�-ybNQ!+JB]3ZYuG^] MduOuP}*M-bN1!+#B]7jYQAQTDwQϷP]ZYh$\PNT$dFуM?d,m0_sqbIj8Ʒ 0k٬ 2QGwj|Xu eFH̉A3B2"Bhtҝ=Ta6QwUM睚 tJ[(\,|*57J^*,`^PS7bY%aVsNNQ9fLRf h xb }نzcD59AiK%6a0SpPhD bQnVT]睤?&BY64W6[p&*2\hlَjt&8Iϔu mxYJ@قSTȹ�0;*tABU=2[%罒oi�!X(;9GXE3z! 5Ī5벌�W+,nq"d<TiHE rU׫rUVvmT Ɋ6fKn݄=|!0]`hvE|A=چYB{4|\#M4Ăʂ\E5@;XQG EG]6FmF'ʕe- +4uS6 /(ԣx힨ƒ g>�Wu6T"m(1,Ε(06 ee%l4}V]Y+ seՖ+N:XI"*h'_h-ߍJ-K4$ii)ɆPܪe]::DKɢ/P'HQ&V/{AT*k.FgKn+&^PtBYq; IzHۆъh٥6Z &Ke'CZ(s|OnC̩Onڌפƅ PS7�S߁.Z(k"Vwj&57Uѵ(+D_(6:]t�yj|�6 Qw|�5~J{7kZ}wCoWoۍxF �pMۊ�" iM�5@F�!�+5s�n۔� [3�Y�=|a�0PimT@Z.>!y//} FdafF��A4pA��QV*i3ЭK5.|&:ICQ/em4ݔBn�pHz�ꥵxB7J L7[jj:+k6Ju�z\\q� 4!f}Pm٨ZаѪj" rE,/fTFqiٕ0!f[++ubͪbFgP~uE(gU++: fW^Ä6Jqԁ;6JzW/lG܍s@.�� NZ�f �p`A �:Ez)�j�SE�@k:-i 5ЄP bkun"A1IkCўȩi2h߱�o<u_]]5M=qg}RJ_|EEQ��<Ç_w0y}ᇭcq7o׿N NJŢUbعsas};wl1<<.ǚ8΋/09ŋ{{{ i՚;4Fqs03###XJu^09asfپ09̿NKas09aKas0%09asXrs0%p09auB/ҟ߽ww^}կ~O?߬|+K~_wߛx7{'|ƾo;vs_կ~zO}w~w׿_k_SO=u>r x[_'?z>'|;n�RJ_z9 __|W###_җ>i]_xᅟx<[_~?>.,,o~G+ٟϵ'73<?/R2g.oW_u]$ySSS_�O>s=dFFF>^y啑|>٬R4223|k_FFF>O~�jc׹{^~o|߾{Bp5 ے?O|+�/}Keb3Mʹ>*uP"(!J!RDe ).I&!Bݒ[Q -SѾMM23?}}徻99׹s<ysfjj:JOAAAMMŋxyyT*@zpYYY�%Kϟs<?̒(%%SX%gϞžBrrr.]cEE ׹s��/^8usqq9{ȏZcΎ?((�3gp8OOϯ.õpQۛu9wl-[Çbbb^HHٳ?G/kkZٳgϟ?!~8,!(r L\|1// 6%6mTVV6޴BCClْz7n`%&&�pɄ�Gzz:�`֭Xwޱޖdba`ee%L޼y3J%{0mmm𿋈444@9n[L#ɍ)F#ɖ�*,gϞG>xL&w+(..#XZ�m۶|>|Ç844^u9ǏTUUf񅅅L&sxxp0&pNNvСC>o&᰻E - d2d\x 6na ]z.ciii��2\\\<&[А={ZZZd5kd-[`ϟc<}4lS_x� �8q˗_郃<<<0/߽{ GGXL&�=dff~EX]]]'0+^�� �IDATd;w|}}=ztA(d2c^ڵkKU;i$D"ԔL&Ι3gppK �PVVf͚HObq)22L&GEEȑ#X>$+W$ɝyaEZZS|Cn&I@V`!�u�^joou*.##~ܾ}�l2g 9;;ڵ CBBߠXOO�p` ޴iJpByy�߿a͚5W^RJJJEEE�ɓ'*dddcbb.ZhԸ H *ZWWHRO.--�cmwvv ϗUSSR.]ⲵ�x�믿455x<W]]J# \\\+VRT*uϞ='Nؽ{7J\AAIH$REEE^^JPTT}Dvvyx�Xr%/�ɓnnnT*ubbbn݂-III{ٸl�7ok˗EDDlllT-[wa*:| GQ(�4/ɱ?}TCCñ744��a@ ]vs>X`J򪩩N;vԸ;vJΝ;WRRɓ'(NNNdcc@RBBB��NNN555T*8�ӧO<yJR(IIɧO7H]}}=LV0Tt{{{11 *j`` ))yuj˃t0yFQQQ*z}`jj uܹ�??'OI"JMHH066nii~:�@OO8>>^\\|T*S@@pAXXևT*U__Zx��YYGIJJ֪QT<?ŝYYY*z..uݿ_\\ԔJ8pСC/_>{,l1{{{\vMSSSSSҥKmii"HD"add011Q:uBBB;vz p{]ssԃH$AA� !!}lSSSD Y;8D"wލ444ĉ޹͟?0;;OBBD"qrr666b{?,((((( ӦM3ghRRH}}=H$H͘а`�Ó3$++;<<ۧ4D"H$#""B">t$$$<~xppB,YDRR9ؠGGG뱖I@@Go߾koocǎ.aaa,^xmss #=== ?#**J"xxx7660Q۷oTɝ?^ZZzppyO>=<Dh0]!!!njoo677c鎫`l//8==PVO wuww_fM{{{oo/L+V&/9sfxxʕ+ՠK.ٳvPڸI$77wss3l֪)::~p Ǐ)߈-ʪ?~ [YYYeAZZ�%))K"DEEJgg-[ ?eP===vv:QSS� H!UDkkϯ\u֌ r֢l <yS%QyatXhxyyccc`)7 Î8s:Dӯ\{ne"8f,99yԩlll��d2$$$$%%PUUu*{gϞ:'5h3t:�s�u'00F}*|Qdr{{ԩS ` �cڴipjpxyy1縯opppOOW\Yd ǿ{;;;ҬcpppEEEy!ٻwwww8Hddd̘LÍ7p8AY'';vpssÐ]vyzz~f ӵd2[l~:hg\G v9=i$藦h1Ϟ={ٱc4Ν;=<<XXBBlll222PP*FFF>}뽼|0l띯"%22{ӦMw;q֯_ɓ۷o,\+>ҥK>>>;vعstkװ˙3g1ePo`AAAVÇ*%%VRߨ7Pw۱Zfڴi<<<&&&_~]vmܸ-9dɒEEŜ)Saׯ_c<`7e~={{{9N;wܴi(t [z�HJJʆ ͛ ȑ#pZ+/^<};wXXX0͛7}az_}ҥK 3LΎFj\PPLLL :>>>2ћb*pufXXYYF5L޽{CCCؾe~ q ]VCC(|G? ,(//=̙'''�[ddd<<<D HhgǣkTvv6'.טyxx544 ?�^Y hhh8.TUUAc24MPPpb%((xq gvuu&!???k jhh`ۘ�770PWSPPGCCgxť�߿/##퓤Ծ 5::8t!X^.ggg}pG ݾ}Fvv.H )>ǀe_CCÁ m۶ihhWFFFWW(//ؼysRRSMTTTԪUVXtzrr׈!)�͛79rdhhԩSp�annnjj*+++9<xb8 c~~~Ν;~xHHnyܹ7FEE]rrɒ%8.99^WWNARR ii霜66y:t(66ki<44 [4 # `͚5V}𡖖0TUU.פIΝ+!!d2###?~#k ijjJHH̟?K =<<<xa:[LPd2hmm-?LlrrrII Arrr|||`Ç=`0-,,\8^ݺuk𑬬\rK.18;;öΝ;tzttQpp0k999SNUWW u 1)?7l !!f??sqq8p`hhرcǎkjjڵk˶mt7̙3޿djj 6ɴ u|<:N,'O={vxxx˖-[np$fN:5!!K Y/ࠏVY,x<S477sppSWWinn%ꫫ1+**>}:ŋ_|yͰvrppؿٳgY8<<e:~m==ZhCׯ_/_g ׯ_gcc utts~A8088`0>IG|;p<666 ssE[ `2w{h4kkknn�?Muu Fggg@ᠠ=2u!I&=} OXA _Glllxx޽{ 1$9UUn@ gׯGv @ I@ Hr$@ Hr 0v(ܐ@ oõǜ.))INNFB wUo I&! ϱi``l@ ??oo/ k@@ $9@@ @L\m?*@ ~>ĐL, O@@ 6m�29x o D!!!QQ^ bHxljj|F ߽{G#8;;3_]]]{NJ��nٲtΝKÐTGGG===,oee%ӂxL&y7oބX[[ؗ/_~ꕋG[OOOXXǘSMMM~jiim߾u/˗r^znnn)ekkkԭ޽Ǐ�Ž|5rYYY\\\aa!}̙gggczs%MMMsssssϟ;99��a8B~}<Osss\\ܻw`4...??;w|:::撒k>c[[[]]]333a&M Boz9#33C@@رcSL)))QVV>eCC�CBB&OQ[[ \pm__<=}4�ȑ#::: P(?D  X- �xɍ7��8}qHHHcc# LOO444&%% �tR(i;vxGJFFFkmm***w&<6m?˗/_x!##sڵÇGEEUVVȸh4�]LL k&''kii$��/^8wfnnv;wܻwŋ)))۷oeVVցݻW\\|s #""xxxLڵka0m]]SN@:崴hjjBТETLKK366VPP��,^XBBb߾}7n055upp̴ZvWbbb[^^(&&gϞ7o&-244llltssSRRasڒԵk444-Z$--;:GQUUuwwjll Cӭ텄>=qℐJNN~MbbbKKKvvvbbFIICKK˚5k��FB$%%kjjL122 %%S^^XSS�(((HLLlnnR۷oLLLtrr133sppxڵkVZ`mm}]gg熆͛7;88䈈br> L&H=JJJjnnP(pôi֬Ycff6}t..."KJSSSō233WZ3w\ FoXֶ#22rσ.^C`LEE֮=vh .h۷rss_z̛7k׮|G'-- vA-,,]vZcc?ѣGX ,,,իWs#9\\\+W4iRYYѣGuuu:_XXcll\^^YUU5ZVrssO<sξYfM4֭[)))CCC_MJJ6mz'''8q�P]]8[nq:::?;::V^~M---Ss)++022tk-|֭ ֫N �~ڵk뭬߿;: NĬ\H$nڴ飪uJ>5>ʔ)S/sssS(�={޾} 0.<yrݺu|||X̙3Eeee:K K}}}-[fmm}ه~g֭<85ltww[ZZ߽{C5VVVtRZZ }mۖ-[C>|p--+Vjw…L&3))i޼yqqqVVVn """uFYYŋVS^^>^QSSȱ<y..3gBQ߾}{qq15@r >~֭жV~f``@]]]EE˗X`tt@AAS7ꂂ;w}L&UVVv��===幹plL]]H$bχ{x80o޼Pnn.t*++MΜ9mKvvv_��666.333iiӧO[NMM-88NUUzoܸduuu-^AAAׯ_߸q}}}֮]rJzj##!<_-\POOodddҤIQQQ.\صkWddm2s766bL2%"";% ##(%%C>3�8u466>z~ŋ3g„td\\ܗ<]SSccc۷tR֙uɓ' NÐO?{l???>>#G9s]]]ׯ$={v׮]<0e˖Xɓ'!==L&h))oڴ͛7fG:1++OEc_hxxWLLeppPRRH$666Bolcc#x!-- �liiʲYjѨ(WWcB$%%%Z[[z{{DDDh4GNXX,sqq577#++161udee<kc]]]>�kȰ�޽{`0dEVFFFX' pqq�0/+,K�h4,KHHprrb9؟pSS 䔐@:v)/~~^3^^^[>w�`Xp($Xz9ۘJ͛7W5k֧fXwb0Y��VMS" �CTT:N?,GS($$+K,@[  XPWWUQQZd r 4&&&T`!@ |x<8?###QQQ!AP~`cc#p4iD3Xn6 @ ~&82@ �� �IDATI@ Hr1aA~8h�)!əX<x+m# EEE$9 66utd sׇvYO$9L&@`+I l@ /崶KKKkhh`UUU'O*)))&&&t:=99H$nZFFMTTKomm={K ̞=F~ZXXXWW‚EEE0ҤIXPPPԤ-&& ̙,Y @NNNMM ߗׯ_ڮY&,, s环cƵz=FzA__ߍ7N8ikkKrN>ѣMr:;;>|�xꕝӧO+++544߯/捧gFFFLLΝ;<vZ:vvv===T[nupp8}4zĿ/9TUUyfɬyyy555L&KJJx񢽽077F$$$-wss+Wāhyy͛7kjjM&�(((dee- 555M~�laa`0>|H$Ν^^OسgϺu;-_WW#:uɓ'zzz閖XGgҥL&˙k…4-99YHHа5##CJJJFF&''f۷obBHNUUӧsss-,,a`nnÇH$RFFҥKm痖r 6$''B%X` _| �y%dž LLL僂fΜYQQ!$$tAvv'N׫̙3-//�emm}رW^UVVĻw YXXlذIII999AAA ,w󠱱1##L&_t }VCCvڌ3dr\\ܘˏ;?x`ddŋ۷o_|/BBBH$҆ f̘ahhXTTa33۷y�PWWWRR$@P7} --֭[ϟ>}:|llljj݅ tuu ޏkΝ),, +M999֞ӥKd >,%%U]]]WW',,}CCׯ~Q[[�sNeee^^^߿?}  )//?~xss3k}o͛ .`?KKKO:UQQqSSS(˜ ɓ'4 ޽.'B$/\y&=cƌ 6��ΝrJ> XPT@xbhhsA+##OIP\RRRuw=vؘGwQTT444Mff93gFDD^UVV�X~=G%@<!f͚5kzܜ~mm&Lbccê7/>|XWW'""_^^�xw��۶m{ꕯի8q}n@ &"_]NvvׯYCN<IPvq/O͛7ɦ'O9s1:8i j||ٳ1�+**655555A?+W!>>\y/rLbllLJzFFF^zISSӽ{TUU,Y;l۶ԩSgϞ|ZfffEEE999mmmf"ɩbbbZZZ SN(**s玴4oXXΝ;'`TTTܼysҥU?<P( .\p!XZZvZ(7oLMMmoo߸q?k׮P>~~M6_>99͛X4� DEEg̘^ x//!8a$'&&o``d2g͚5w\(--`0L22e>///9sDٳq8޽{)�Bhkkp8AAA8xd2LԪUaZ .a0""" FVVV[[[__А F={}p8G&~捞P(ӦM�S(MMMaaa $%%'M 'ecSSS6mڴi666===}}}<pb2&&&[lɭ]KTBBBUUdW@-MMM\\\bbbz$Hf2/_LKK+++dKTT4@ ~q5vYO~~^XC ?@Cٴt:MC ? BBBHr&j_D"!; WD3P(@ &>pf$9 EEad@$@ Hr@@  >Á{ Ox'!'y&2>}"LDY'@ 4D"QPP` əp8~~~dsI$dO1ܻwO>}<yRII)&&5 rrrJJJ+V@Y@ <xyѢE�Aϟnt:F,A _Zr=z`ii˻}{bqv!!!C�=˙7o耑`&���caar@ ~]a0lll��<t:6]}֬Y?]x񢥥EDDDYYFIIIM6D"�tuu<xr@ ~][V^L&sL`KK JEـ@ $i <�p$D{��F?SEENb Nja}}}_)@ &2_X[`SSS޽{#rqqaJHHppp455{N__}}}�wijj��888$%%>}o>1J�4(((//oٲe{uvv�tKKKΝ]clll2>>4^^ެ,l2{{{]]'O��߿޽/A q嘙 ܱcǎ;��˗/?xWJajvv6{9_NuuuOO/@ ~\zdFDD<|IGAfѢg鬰}ewՃ?'//:;@ P/C-v1A[MD-$@ Hr@@  >!_(NGvrp8@@vrFFFbINNN'7oG3. Fqq12ŗ -L$`|-eU_GOOOnn22!L&m$o ;|..."/;;{oo/2�ߴi2ߓ[na?ΝpBqqq#JJJȾvM��]]]++1��VVVXK,X0&Ç~Ĩ̙3޺u+k|*z집 �Ç�UVikkó�۷KIIM@vvvKKK3 GG_=|xxf+ݻpo׫F>{lkk+ѣ### xxxYYYdd$�@[[{ժU0055�Eڵk%%%�[˳:zfffsﵣ<<<^^^$7o>|8''GEE5<<c<{,<<|``@EEEEE1tww޽X`iiill,4Z]]kMHHR�˗/޽ٳ---r/3gqܹ1E^^zSRRC~|(rX~4-[ܹs޽p_ݻw?~<++Uojjj`>޾}{̼Xaaa<p8  ///q< �HKKKOOϟ?gի]]]ŋYLaaahA/GDDDEEEPP+ zx{{N4L&߻wzaRRUSSӫWƴYAGG%;w.ܽ͛+W mܸ�RUU5m4%%%">Ύuf6@ �ÇƟ<y2L#++KFF:99UWWO:UIII]]]RR�@P$$$&1Otttfdd��lll7VVV$ d2uuu׬Y�hll\dMMMEEEp˒۷oZJLLl…ӦM�9rC"edd�� ,Xr%l:tHQQOpGDDc&&&>zZJ__YYY7o )++۳g‰'aL???...c...oo:tԩS0:tNdeeA�`MMM$PNNe˖R�}<{xy``b )!!'O̬,--=qℓSaa899999eee;99}T...KJIIA,++[n,߿S;w͘]]]i'؋ڳgϘxxbŊ6zFFFPoN<ax<;w ~qə<y͘ik׮;k,8߿Fg�8MOOϩS?�?yUSS6mZBB77Y:99\k/^xR(wΝ'NP(ÇGGG{�_EGGwtt;vŋjjj ...###ηo޶m[ttvޝNPBBBΟ?]]]MP}}}<x]RRyСN RPPNP`OSNP(wqvv#-- ӧO=:q℺mddiYYO[޽{.-- =QHvvÇ.] -L"&O<;rrr�–,Ybjjj``m6,BCCٳg,Y2o< gϞmjjjjjZQQa2�+'`={VMMŋHu>HPPfnCCC[[�`̙9sĉ+W³;wWݻwK,�͚5 )))|xvƌ%%%4 �! 0ԔD8VRRRPPemmS]]8cƌ 6߿D"͙3'((ښH$8<rJ### FKJJ644ս~~hh}߾}cj,IIIkkk4555kkknsέ_+keee�+WO۷o?~{W߾}k``l2qqo-J{.(W|``x`ffܭf5k돹P^^kf[ZZXZZ�?~0c 7ҖjUpppww7KNNvwwE�yP(-[|4Z^^ܸ88&GPYccc,Ν;g...֭+wTUUUUU+**aaa]]]aaa:::4־q˗/SRRLLL>} �sJ-**1O~;88 ![*++׭[Ed7={v̙D33~ L-&&&;vIc33ciiI bbbTTT/^_m߾'CCCCNNNNN.88x߮77o޴2ewyB;;ֆצM>,}yIIGFF*af͚t_1d׮]c2 ;;;''N8\!FFFpVXX{{{ׯ_퉹wŋÇ}TGGgXE�xY]]�ɓ'BBB{HOO:ETTPqqq)))))S2̈q}Ӻ};w<}ߚJ"?~aWRR{#7�1} ι 5f u|r׸L&ٳg111_~w544|5c;ziN">~+<w\YYtNDDDᎎzzzܺuŋ_zק.n ;;1&7o<xp̙O?]L˗+++\u xLr�� Gvpp0119}tdddIIɱcǾc: -,,-hqq^ZKKŋcSSm۶ݻwF]z]tg6lX�444`Ihjjeff&%%yyywvv³gφ~ӦM0xzzb. .M<wqqٹs={ҥK0st޽^^^p^Sdd$Hd2XrJUUUppp``ԩS-,,Y--;w²-[uECC+,, Θڼy2UIvM%%% bffQYYyڵOԬXbʔ)wikk044LMM9wƍ999,-----ׯ_m۶/_�CCC=<</^ͽ|rQQQ88deeekkOjժuqppĬX:Wapapp?!!O�]]]"""mmmuuupc}}}KK|__sTQQc^yyy9;;[YYرdfff/<<NE}*;V^^ڕVPPhiie0�@QQuBYY4nAA*l72 lo߲>ɓ;6†*$D" �***Y}-x-桡Ǐ;;;+((+Ww"<חbjj CZZ JJJZZZ*++ x<d D"QSSs``VMM c[ZZ7222MW[[ 0VX~Ⱦ*؂7_}Xc1118Ī;;;zzz-,,�L:NO6Jxɓ'H$*ߏM㻝B666655 Z~_RRַoBWN^^Ʉ?uW>{{{ F@@ICVVVHHFH͇UNo[A|_̝;@ $%%a|5Ƈ4ZpDH$~ P(d2NKHH[ӗ yF�� �IDATĿ:\Y\prp[ dvvTeuR?h8��2@�pf\/gh_N'娌!@e X8@ I@ Hr1qA~dpT~(cZG G3...:& <ۋL% N5֐ 't:ի:aG,Ɍhwp…_$oevve]42W ""V[)5G&@ Dtuu(++VWWKII744-��$I\\K]]۷D"J̘1W,//V.))Ί,555�&M�!MMMNc9s&<),,NUTT��0[rrryhBBBݨA^^^JJó4 0Fvv6N,< jjj***JHHH^^V�pqqZ[[XNb!p?`deeqppL6Wׯ_^zŊ?޹sǣ}}}I$EK8ę3gnݺ0//OAAں&_axx !!!00''QCC\p vIMMMTTTVV�JLL(<<�`kkkjjcoo/!!A$<`0߿z 7^EEQMM-11n;�yѢE/^��/]͛FNMMuƍ?#޽{ӟ={6]lYoo/ܪyYXXŋpx+W`;mݺWXX 333�{100}eGGǑ#Grssa4OR333oܸMEEE|| +###'N~.9B,]G[XX~feeAiFF܌6w_T Ӄ!QQQBBB;�ELLرcFFF�y橫m^Z 3$::ѣG�?ӗ/_�,Y? ᱂2L]MMV73g''gjj*N�̛7oǚYj?zsssM!7nLIIj ᠠ 2FcccPPPGGk۷/^õ?�X~  kʪVTT())i4fRmmm~ff&Ȉ}ǎpt LAAAHɓҮ_0}tOO5kma[�pB=_Gr***X[[[�222_nMM DCCs 899ZZZLLLuuuJJJ &44JJJ;u͛{{vݥ^D:RD bQ5k1&*&**5X)"^^?w )kw;瞙3s̪U>}͛ xcrrr~~g޽ Mn&ҒB<y$""B0 _CCɓ' ^:p��`C(BihhXp!hhhHPoݺ%Ι3gΜ9ϟ\`dd AUUsE{sթ9r$<<ȑ#4k׮-//TQQ]~-ZTPP?3::`DEEݹs0<==΀�kk dr,--o~%l4 �(---..^bEgg ��W^MNN}vee%{��=z4>>۷Νя?ׯ_/801QTTTWWMMMύ32000!!�gZ:�9YYYCCC8l"0eʔe˖ :1RHŋWpիWݫO$۷o^tV"##/\e77k׮x񢷷w 9@tuu333577_lY?3XYYA 7n?lݺUWWZGTUU]zܹs�&&&XXXO***~m?REEEٳ; XKMM~:6e'O ̹m۶w&&&7|޽۷o9sf[Ξ=+X622:uAYYcP!ЇV__qNNNNNN0ßsαnrBBB`߉Bdggƍ7z 9rXd…d߾}?Ý;wLMMWX5ssǏzBddd;w;a֭[?_TUU~?>V䘆ƌ3***:::|||DDDrrrLMMAcc#|"\Ѣׯoڴ c#񁺺:,c?}||;7`sOܹsG+..M >L:/^^`򍉉#@ ȢO]]]ŋ~>ҶxO?dmm=%!!z8?QNTTQ],}VVV/^yo۷ocs ϶ׯ<==߿Ӄ5?nhhx5�@OO#� 77dZ[[[[[«***0yܹeee��GGG8IrʧO�w}.%NOMM㾾>WWW�a]]>h1Y]\UU%5cƌxuuuP4.]~] JMMWBB7ijjjkkzBYp3f(++Ϡ7iҤ1H&Mrss+//vJ1cF^^^tSRR⺺oMMMX��@8x d٥Ppg̘ahhfeeeX,LwwU`-޳g5kh666Mt333w 7_䔕T*�S%K@c0u⪪**a8JR7l-r𫔔V||<J҂4555NRyDÁQ,-0%HgφT*UJJg޼y,KQQMAA{ٲeeee%%%+VPVVwrrh...d2ŅF9rdTx*x6]UUr8iii.O<dggS9s�222t:}ԩN111mmmT*z0P0\(64CCÖ"*bŊ)S|YH$<b>z3iyyycccH&&& .RӧOwppqSLl۶mt:Y\\FH>kkkggg:ncc3c ckkkccݘd_z4-,,ϋĕ+WV^D14k#Ξ7oњ5kBBBFa }}}qqqh<.#doo/?~8�\.ٳg%%%#F@LA a]  Arx. }Mm={ #Zm@|v$%%!A�:7EO W&UUUcHǐA�Y,HcD 29@&@ drL@ &<(b @ @UmlX<x?8n!HqqqWW291np8<~QUU:FD&mllFAA!44t课yF<r޽HG@ݻ0n@&g$PVV^t)Ap8L29f߹sGLLoA@ orD"x |>JMHH@@ 伇P8wor�͛UTT"##Xm@L~~MeRR`[[[6GUTTLMMǽpXx cʕ/^R)+p8<d2 q80?@p� $$}@ډ@ l6`\r p86�<��p8 dr\0G9JJJΝîڵӧ�u%$$0khhhjj*))|CCCN%%%MMMb"`p81{l |/bζ6[[-09,kЕP˖-�ܺu+---,,^GGή ֖BJ@ +4p8KfggGEEm߾V0'@(//�˧o|k+44411�;S;;;[ZZa((((r@[>?XzttEUUK^t ~>spnٸq#qTSSlLnn.7b|sIooo$79ç N=x¢f!q# N]]بLQQQ R"""բ+V H~И4iRvvvUU͛7epzzziiiOP(HJJc) ¦ps>?:uj7o?|PAAȨ y8FMM400000={ի�?Ν;?sCC@066p± ,�#H Fyzz"|EE?͛H&p'f|88zdڴi%JJJx<Ǐ@ Fr#�x<^SS@F dr_vHzj$CaH >�>D@|(T* x۷o#Q yA w-$b|@~h_VdrbۛDL@|Ax<Fh𠁯291nMŧ"@ @ 29@&@ ABtL&Cr@ A LFBDUTTĐ(drt$#///''İ`XHGuu5FCr@ (|�@  @ A A\\\XXxb&<<ib08???ʕ+a޻v{#0+WTSS'2`0x0x-~~~qqqX/~mm[J!Ҥ[6n(xXPP8D69/_ܾ}}��=?p8pn+--eH#NKK蘀FXXNx<G$cuҺzGcr[ojjjK.?~tt4ZX ˱]]]-++knnnnn �p�ٳ>##cÆ 0�dɒqP.ڵ+!!~>qsm>z&9r>11qǎc@x��|>͆ mfookoo_[[ ϟkkk%loo~xWpp0x x,1..&a  �:~Tiipn2eyDDDuu3e2SyyylX? �?yG]v ,ϳga+Dba)˗/GUxrf͚uر'Ny~7o̥KN>nݺ+W9rd˖-/^+,,\fMGG}Ν;'!!$`2/^`0wyݻi4ڝ;wBCCO>Տ9t 6;w۷ׁߐx*74MphuH$0=l555+W<s̾}-Z뛞'**jmm=şO.Z"--MYYիpvvvwvqqٳg۷x|OOϹs6mڴ|nڴի? pႹU> _ETHNWWw8㋊\}KKK|||ssױcǼoܸo>giiYXXX__O"`Wf}k.|Νcǎ988VzÇ₂TTTf͚jggܜ|@T'/^LP޽vڭ[wuuHJJ677bz[XX(++D�ɓ ׵::::4GGGGQQJnܸQRRRJJJZZ ())=z.99y,X[�'dryy9ͮrZZZ9998fp88.77`ʕ'O)++knnvqqz h4|@@�NWSS!H烊Ԕ T"#M,8"KJJ興욚UWW,"" �RW矯_~y999)))K;wܸqp]]ɬe?cBBBJJ D19��QQQQQ 6ɓxPN۷oϟ?Ę@BB�~Wa1ʋ@ccc-Z�Niii__{PIID" zICC��'Ԣ״)S0Lza��'۳g͛m۶={vܹ𒏏%|pejgIFY1+T)CB0zzzLP+WIHHHII�^JRU99_5::�ٳgޞ@ dddw)b2ݻwl޼y}}}}}}C"++WDGGnyÇ}||bϟ?"OiiiGGg_ iaa^^^~٠;v%''oܸ3ʧOvsskjjZnl�W\INN....//l Ñ0<P?z(Z~Kɩp]7nܘW^^tҭ[>zѣSN:4p dbbİ?&butt@C&EEE?v_`tYYفk׮ŦG-8NFF.44t mmmVVVBBF{e2}}}²HѣO<pҥK{{{NIIIYYٕ+W}Sq<ᦥl΀R%%%deeL`x ̚@!!!,KBBBVV{ }}}YYYҘ?e^O… \i&8}rlٲ{nN8p_~p8.]ZxÇݞlmmmnn"FZuuu%%%>իotٳg8~ݻw9sN_֭[]]]+�� �IDATY?ʭmXX؂ /UVV655cs0Jnn6R^^9 fff-RRRxs={,w7o޼{Ǐ>|xʕ۷o߹s'ùqܹsܖ.]xbf>h+bnY?f$L7666��՚PTUU###ϟK:{ ζmtѣG8ɓ'-[`0V^)ʑ#Gbbb; b***H$RmmS4H$haaaH(iii>=\< [[ۑ|Ȇ oyfܹx<WWW988L#HmQٿsy8<^;̠ 3"))?6A ޽{=zpDDDJءܴibbb`Smmı7��%feE F P:u8p�@kk fff EMMm̙ݱX,y֚Kg2Ldo 0rz,jժ X,:1@5@ @ r|>CW 0297HК@I29C.\@ (|�@  @ A |qu$bPHÇd~:55'B!'}a8bG8#C___FF60QRRBB@&gbcc(ޣBBRRR}DFRRr֬YhR[[ H[k6Fd2N#Q|\deeIKK#Q|-P�@ F(ӧ&&&ɧ$%%|ܙ]l6̙3)JJJƱ{{{/]}USS[z5�<00�`jj:|x555˗��A ?��奥w W^L,?~ҥm۶搐'Oc{^~:!!~vuu�bS+VD3Tjeeu---?i0;w>}ZXXx˖-ܹ#"Zdz)..[jILL<qℨG???11m۶�/;^˛7oL<�PQQ#Xnn._`Ajjj||� &&�`mmRXXzj&秨~zA9Ο?ԴiӦir*++ݻWZZb 6y<)66655~~~SLyAYY١C444 ǽ aҤw{'N:tHRRT*u۶m~~~RRRLNCCɓaߴ088/ZhHvvgݡ.>>>o߮Ο?ֶsNII~)&&k.�@QQիWݻ[QQ ˖-{Mhh[lllBBmmm333LLL޽[ZZ ڸq#$mHIIbTUU޿�p޽ {�:emm �X|#29BAAAP݃MxHggW^dggX"++w�/l߾}Wf!! Č/_޽{׮]===-*((صkҥK߼yc___dr ʔm,'eew\￞gϞݾ}pP4552?y$(((""bѢE/^?l2ss?־~z]]͛]YXX ?~7'NhhhPQQ_KJJZZZ��w fO***GPPP^^^@@@rr2�իW�耀;w<yF<yСCG۷o߅ PJJJ~׸8'Ndee@NJJ Ϗ 8rHKKˋ/>\SSs";[l]q̕+W|||l"%%q?zlcǎ%''�?PSS�xQ@@@GGǩSΜ9#!!rʕQ,jPP\XX`rڵzzz֭۸qc]]ٳg[ZZ8 %%5iΝe˖ϟmذɓ'ߏ߸q%K߼y3uCmܸQMMu>~WN?/_FWK,ٰaÿKPugbbg~' ѱrL[̜9sѢEQQQiii0qŊwIJJ*,,D 3 ޽{XZZ jŊ[lٰaCGGɓ'sss/_=ދ/VWWرCYYNrhkkjjj,X�[[۪��@VV<|<gϞ㏃ 7o433[xqJJlSLn4,1%%dΝZZZׯ7oޅ ۧ?8HQQR|!DDD,,,G-5k֠.&ooÇ@ +fMMM^^�ȑ#p<55)̈q "!!aaaPRR20;wZ[[,Y"--/8pHgώvmccsqqq2 MÇO:`oo_PP�Gs�8r`0SXXop'N9sG �{ȖgϪ*m:ycPHKK73rtt4L1cƌ3��Ϟ=a/Ǚ3ggݻk׮,RVVo�=Ò%K��7nh,_laGNNNJJJpU^^nmmuk׮On޼ysgg~V\\|޼yCszHuVkkk\\�󾾾p~L[[;22rFtzhh(~ 1ws}`[|}}1?K6{l!""< #쪫xk/_1cƭ[Š<t52LPF(�0yd33j##ߖ]v-,,ѱ?,//ooowvv8~xdd$_۷ﯿZzuccv166~1xuee; ܱc\GGF߿;AO Lֆ DKK9s��~LJ¶cSLA5y8رWsuuoEDDuѣG7mڴk. 2L5= ?~B}AAA?Jvv}'�ϟ?/+++))Yry��>ܺu… v'''8>o޼u֭[D"q8۷oǑH$M/---999Ƶt:]__\___SSekff oLII9s&L~ƒdIKII>}zGGGFF̦bbb?WUUjiia%++ JHHr t:=)) omll`V% +++a;% g S4$ �PWWJXOOb^TWWWCCbfff{{ӥ^zd2g͚E F:::޼y ذ8𳁁Iu �`ee%++;먨(GVWWfb\ՠWyy;T”DC$~捬,\ܜfddTSSS\\*{uxΞ=Í%%%{{{y<LJer ə39/mr3sgNF[erж1\$D1(Cy 291\d2LFg 3pgniU73n"ӃLoIWZ5&999p@s-@sֿ|> ა9s&F<t:29rQQQf1#@/c3 km>!PaFfWq  :uG#CBDz,E&g(4@}4p3$!p8hÛ(rzd@s9@&@  L@ F/ Nstww++++ UUUN>s8J$))Յ'///##�hnnƶQUU�b=iii}V>"x<^GGkfWUUa_EDD +YNN; p" |>_TA]hmmm ҂ꤦ&** �@� PvD"�P^^tuuUq%,!!<0OkkkWW_1,fiiixg{{ٳ:q߾}ڵkc#WYYQ驥~:v5k>|ٳWRRjiiڱcܳgONNTMMÇW\Ҳzj%,,\ZZGGR]]]WWW6nhh>}Fy&lUUUyڵPݛ!--][[{UV.L&sBBB,bB]JOO_d<l�k.ދ/={ɓ ,عsg~~>T~˫yժU<L&P(3f̜9544DDDhii|JKKߺuk`j$ZL!!,]{WTTXѣGD"q֬YT*)[Ǐ<IR18s˗X?~RRRRRO?tݛ7oseffZXX?>..ϯœ'O "H...0BXXxڵ˗III{IJJZfͥK(ʩSBCC:k׮M6޾};))IUUuٲe]]]c2 111===/IJJT+**KIڛggg>}:))ᄏ~QQҨ~HKK'%%=}TTTtŊA��GGGLF777$%%m߾=''gÆ %%%ORR%KTMJJ^ticcvRRҕ+WvpzAjj~z!!! o( FP(oZZZ߶o^]]eeeYYY}}}EEE �rsrrrrr`q޾}`0JRQ455m߾~(-->W*Rlllaa5k޾} G?oCCäI۔ݻl/_~ٳgΝ �8rҜ!PUU}ͦMbbbΝ;w �(--244P~7nXXXdee)(( }Kaa֭[��έΝP(fڻw/vÇ޽pݻwGEEܹsO>̼ٳgY,Vvvvhh֬YO:0[n߽{ԩSmmm:::'NQNsssbbbbbbeeG_~=88sرTT- o޼/͘1�ӳj*,CYYۇǏ>|ZGccc} N{{;&UYmݺ˦GD;w}7<<""… Gѣ222>|Z|9z咒;v8p@OO̙3O/^QNaasjkkKJJo]*..7C07n '((Kg0111<yիWZlxR^^޹sgoool)TTT`R3gz{=wԩS'fNSRRt۷oWWWV86?L2&ҥK(++xUUUSLq㆘rff5kv횊C&nܸ�omm �(((XYY ڛSN߿K̙bmmb_ >}ZP&촳�XXXp8&&& %##cݞNNNǎ'MVcKKK<hhhf?~ĉ^N:ekkW͛k֬\~ᥜgggj3gÇ"##ܹm6OOq#EEӧXKK+''VCC#--I___ll̙3ߕ'<<|޽;w<x xĿz رcdiii݆ KFF555ֶ!===;;{8:w֖۷/!!᯿,}5CAAaʔ)MMM %--MSSʊb�( 6uTKK˸7oEEEgg璒 d700įMPnݺiӦ[ 2A|I8|.29`2 oݺu vT"sss<�ׯc'''ȷohEH$S(A&.\(&&6w| R^^8k׮ݻwoݺ5==ŋӧO,++P(02}>&ƍT*~hoonj'B d2l6h`&:fn===BBB9sɓUPP5k°~hjj֞7oZy544L:u07oƍX,ך5kz{{xHpwwRPPؿ)SL&L9}***jkkO:KW^^ӣ?]SSJΛ774JJJbeTTTkfMMM%$$`Y|#'<|> 7 F)((`RwwwЀٸqY:;;Y,bɒ% X`A}}}EEE]]OQQQGGꪪo۶30??嚛kIi1 ~+M/HIKKc9LMMMMMayN:gΜ~7YZZbСCPbD"qݺuwrrrww'ɕk׮UPPPQQqssc2skhh_`@577={vss 6m9_67|ld2^JLLđH$MƓ_e --/ .Dw5O^߾"bJJJZ]]>h}"))?kc؁خ-'N~z$ǣh]]]^BqhKu~#Gy�� �IDATrbbb666H_-[ ! @ @ r\.7-- NXA AOOOzz:1jw@&xl"KXD ətqqq;;;$O8;D(((uK{ׁ"uD&b" 1ذH@&@  '..@ B ɡO>E2B ёL&br@ !ɢqD|eddp!H[[ۇ.iwqqQQQ br -cF �@JJ z s333oDbALϧhH> IHHKDAHxuCCC}}p o1 DaaiӦ ˚|ֶľ fnhhvww/^l|r�� WgϞ �hiiy%LԴ�D333}}}�@FFFee姈 SHCCCJJʠ�䔖 888677�fϞ--- � <˗/p>;w.�=..&�*++322ِ&}%Hsy~�caa�(,,f---�uuu0ENN�,YB$|~``'*599~$SmEDD_x�quu�477'&& 'O6m�$77&�Ҫa� && Rqqq^^a6p)??KYpattt?SHYQQq̙sMM͛7oFQTTOJJ tVV|3g RLL \ "IIIڪL~mllxMMMoB<==a,,,x␐III`|rҤI0QWW,77ԔDKKK5'2C#$$TSS#O\.D">;{윜.�y󢢢 ˟?DӧOɹũN<&jiiYZZb~/$)!!/TP6 V-x8-++ Ȩ¢&zggB |wɒ%QQQXOH˫_y<4$)>>+))988$%%ijj*++D===SSӼ<3336 |~MMceeejj*�`֬YL<Y^^I~~5///l# ۈ{��s̉TPP066'Mdmm=4x @8=>z HoJXXL&ck[[l5UgAAA&p8e. p8˅*ra"|>VZ<oggիX>a�D6 jp8!!!Pb9|l6*yo¢Hc`r%d='Hp8|_�@bb3kmmW!%x1užjLTWHH{oR]]]SSF~ڋip8\P玎~5�PQQeҤIjjjrrriiiSL!Prڴip(]]]Aۛ@ p8ǏЍFFFPOlvaau{{;mrvvVQQ�DFFb%KR(K>~6#W``Gd17,t466_, ޸8CCCXfrjjjjkk]\\\.왾M� <yd 8 ؠpEEFF{fA=_|G|~TTgφ.5322p3J!ס%�(++ ]sFFp8!HΆ鲲:::pTTT$XxqLL F mp8>>>}}}!!!|> %??ǧ.)) K1p86XzuAA͆CIKKK*�3x<^mmk~~~KKܹseeey{{Ygff#""㓖+++gΜYRR��;wׯ;;;,YMі/_ELj+V<~xt:=<<|ɒ%=�ߔ|w q5tΟ x<>77PÆ,2p <pW¼Źs ̝;]=~n/ֻ200&F' ]Gp8EEE##د8N___XXXO A>N1{z{{SԈ؇kjjwwuuׯGTUUgeeL<ic?{hѢHC |/--/_$ʎP(Vr5kR >|DEEuuuEFF݀C)FcbbA?)--bcccz[YYYYYa/+ Kc��JJJ'K*3HtqqINNy/\ŋD"T-[BogOd>j 8B"=pnc4<+&&6p.--ΎjhhTTT466b4|_f;4RRRs =x@[[{p:Kh>#>C?uTxWGgVHhƌ ҥKf`:%8$i0WWW6 `}vԩVVVf[[[̙HR]|{FAuiڴi---7o>e z)^la,,,p 8}($ [1 Lk_ɓ'l8=ٯ+ΪU<x@ <<<=zwΗFRR!44tN ac� ]I}W]]w9ϟ?U VTUUa`Lf!Fbb6l&g0 aaa"t:gX0z1K�0PaXK$KfL&@ c2h4(1q<dlX7:bt?/!!!LidX\.10L8x"""D"}3=`>L :_+a2tDܯSŋ]JOO1cFmmtd2"7IPD{nY,:S@ `B g̙3ߵ_m}W+�box&,,f͚q~/fva;@ v5yt:]L1Ʉ`h4HĸBr`K鑑T*5-- &0庺:�01;;E,$$=LSSeXv˳,--azjj*h4~`0={xb8 ]B EbVUU}l F| auttjllƕf+((`%-,,VabZZ\'{ccca`.g Q`taamll3?>N0]Zkkk19XoߚLիWpRBBB1f䰇)...**|l̎bߛ/-<<|0: \jk[[[rr2,&lVs�� F`EpppwttmHHPޕ ӢjfX1Lh&155nԩ�/_N:/22rΜ9"""aaa_Έ[Pp8T< l}dYYGCׯN*%%5 ګnB ;X,Hb}v}Lbb"&&�E%$$ʈ$%%%r87] / BNNNGGGDDL6;c0p'iǏ>rLC3cƌ~3Z"ψISSAbD" l5'AL6:1+))!pww8K7X!,, sbk)S��Fxi{a2_ svvy69ܰL@ՙe˓"3{@c-M˥hC,{vUHZUU7=f !c<W5IHHѰg,TccxjjkkGU'6e �`pXGJJŋg7&G\\ӧfffDx<h|H$666}i8HJJ޼yy?<.ii6-ZEdOIlm9l"$AHv*(QZUЮTڗiZgܯ;zu}ϟ+(( Tn`0wp.G(F1dq]]]II Vii)1?(6\Lkxx… `0"V b@!b ǩ0 i3gqB||)Shkk{5kEEED Zgϖ3k,t'$$^ðeaL6447 ztrrr҆aXQQ!jhh@J{DFF׿@YŅh( 700> 5q.�###tp!88X!VZ%4 /\8ir=&O p08xrJD̎?>>f-((�=iӦM8ð?,X�S#˗/A0RTԇ1 ?---G_.\ף 655e Pd###o}}=$7N[[ Ḣ:~.--uP P7oޠ7@EEESSs̛7((O ~1A�g9!Bsss\\aRRRh>,//FUUɓ'iӧOGBh@2YԔ?Zir KKK+.)) d2333?㤮| ٵkׯ<| Dfff@BBB 288f&9uԷo>{ z555˗/GV'66^^^19T*5$$&::`1EEEL&D$ h>`rNR;wD ,''ghhX__STTdjkkՉlnnvuuF&ѣGHeNXɓ' ^" `0@1ߟ>}ZUULׯ###Y5666>>&_ biiL988tEww&a/^~त$Hr7)N\\\`r>} UUUJJJnjllD̙3EEE>} 4ښD"wᡪP^^˱c" >}277*mmmAAA4m߾}/7o| ۆ�|_).. } TSS(..~P&ddd 9<<|͚5ᕕdee>}zΜ9_...)++Cڬ/^8wTtttBBooo3f̓'ORRRt:?~7)"މ0+// ZVVd2555Y?:uuuϟ>29D" 49׮]{699990 RRR=<<0 swwVWW TQQ0 URRb19_3>M,X`ffV[[C]f``]XXxu <==CCCNS;233DGG'''CzzzrrrZZZ999w0ݻxaئMaFDD>J&L F())̀�mmm`X+]]]ؘjvVmm+V444ܽ{PJJٳgYL>}'UUUd},Xa؆ &N(++qAXiii<x0++KPP-,,:::.\�D^^ޮ]`Z f3%ȑ#qqq%!!797oc~I09!!!?~ txNNN)))cggtR߿_TTT\r%Dڻw/8uuu-bcrsrro555m޼YAAANNڵk7Ν;@PP0??BRT" ~NRRRKK <y266VMMj`gAAAA[[>UСC`�srr@43gpUV 811QLL K.�S{8p // ~ٷo_II 77wggTUUwtt[222*++񵵵!!!2220l˖-)---))x2ݝEo\PIjjj`$T?>ta pnRTTŽwnrtt50DEEϟ?k=aD䲱իW]\\>+ wEoĮ]0 =Xnpի%K N#0a<aK.MOO@͢E ~znٱy333׮]aVn;?6m}޾}5kdee2::<-SS 3gΜ9s͛7Ȫ%&&Ɂՠ8rx$,+WZ[[CɄ n >DXbŊ+l7Z~=-!!ql[khh 5v!m۶ J ))iԩl^Hݻ@mmm``ɓ'qrrBPw8>411VwOXXL"`rssC!gϞM<}`z8EOdͽ|2.3={6{U-ܹBFFfԩpü<Xjjj@aff&Fp )) ;)((hii7ok sss#DEEkkk!`H&aҗlCUUUnn%K׎;I;<QPPڕCIIɢE>ylddoѣGVVVRRRVVVPYt[S,!!!55TCCc 6 "00phhh444-"JJJZ[[L@˜ &eܹcgg' y[nA׷7Ϟ=lkkc2gϞ;w7oT+agg,;׮]۶m5::G/+dee555=)) O<>>>?~tttDD�tǾ}!$$X355fXu Ϸd*bv/%NUPPk^a0_|||ǎ߽{haa`eeZ/]]]`rL&U~+>~PPPSMMM###kSSS9�� �IDAT'r=|`LHHXsppGYXXOHH@DK.UQQ);vd#uVTT+**Xח[r%ڲ611ՕrttH&9rӧ<322,Yv>NNݻw6UVV>yd„ f͂ PG+ 64v̙3lF^^^MNPP!>Pٹ{nII3f\R@@gΜv]ɓ']x1!!a yM CFF̈́ ֭[?ܹsGSSƍ02/^AoLaUUUu}YYف[h0Lduuun:| ]]]nO(щ(={6L뮮? EDD0W^͙3'&&&;;{ɒ%([LJYͭٳgW<͌g+2sss777XĠ4uȎ޹s 𔺺422?rsskmmmjjsƍ=zIJ!<k,0<lB%UnIvR'''0roMԩSQ^ … S\|yO]~ͭ?bcM=l]x;V\\a({~QШ(  i4'ɩHNN~c񴯃&\7..NEE>l ''gkk sqqDXұ`xÇdĉhF8<<@ OOիW'NDs hc888`JOO?p�̖f=RXX䄇O0̙3gv9h#((E�~2^nݺ&GXXN<<<D"23s̆p􌉉˗/#} Z7nlٲi@BBBNNNcǎ577Bnnnب(++B~~~9qqqP8~)S(++#Ūh 'D`ҤIp1cƀWbb"?>??LLLHHajjjjjjP^HH 8p… 9Ba̘1pgs"DjllB^^^Oyyy!_ZcǎlH `qqqmܸBjk֬:)4iҦM1 ܡCΜ9h-[:88ܹJ P^ѣG1 p¡CD"NG5ݴiѣ}}} SOO/&&Ob͚5 ` |2yvCQDDK$x)r---mmm bժUJH$T+++oii)VSLYj//۷o!DPP[xxx: a#66 ӱxmc{{P֭#&&vqԉ#GsaݹsgP5`NZUU&CH珏B%%}G<xʕ+G*==%}_D3h+((666%++d2J%ɠ,%K@r]]>@DDdɜ&d2Y\\\]]WIIL& ;v,B!ZZZpMFFNS8BBB )Offɓr899Pf0Ljmm%3f̀龭GJJJNNrd1֑0T|MM�L޼y3<HCCL&˃u7n\ss3LԄ] AAN27#UXX(!!5%+1cƇdoeeZ2F*((@֘1c8 tttH$2lii SN3UPP`9X-'')pǠjVMMZ~~~2loo`0'Oͭ5URRbqyxx؍4_ww7L^`A˒L&CnzSS///LްaMӧOòNECJ666BMyyyўUQQ!ʝd22e H$JJJ/'H"""ǎ+$$}i޼ySx(ADD=H$N:@ af͂3~~~eeebQUUL&[YYALН-QQQ5kVee8f744|2a„2411111v2 ڸq899d*--%>>>>$""boo Zu$H222pfH$2L*J"d2SSSQxфfmm=ʱbcXo X[t(Plvvv*尨rb(~FM(F1Q'a}5�a|||Cvc#iFLqrrT~Ứ:wi&Q&+ʠ'Y-Ԕ:bprrICFɡ+&&fHaV__OR!$$]ؙnnnHW3f 9**++;=o..b_ -N3888BSSHjkkٜ&IIA쿢HȤ0!HѬIBbbb#)c@ G"BCCÈdqrrAPPSRRr$e|fU(F1Qy%} p™ArJ/0Nrss'$$dŔW٣ (&.\xŋx(ٻw/ŋ 8GAAAw{] 100/ڬ,Wnڴ A._ZD9�%H ;;_/ &/6 ap|?~o%^?~r#G2h@�J�Bppk%/_Ƣ]vA!(",Yqvtt�iii;� _ 9sJ+n!-,,8@',Cm2pLMMeUP__PwOBaTTF,ڶmhN }}X@ IxyN<JhhhVV'aaaa_~D"q Gʕ+_xf Q [>}:ðǏìz +0޽{ȨbݺuH|w8gjjjVZӃIJJ '&&^x@A"S///"WVVyft"]K.mnn]Q(P(֭VWWoܸΝ;۷oRc_~t9ƍ%ĉ;\vsҥUUUNNNҥK,;vbBx"///Y]]DDb:s ,NNҲqFǏnݺwy0wݛRYY133ۿ?p>}k.xtii;<<<EDD%WCC~t=zTYYΜ9guukז#ڨg655!6("""N8ڊ?Ay�7y&H400ؽ{.U<xٳǏ_lYcccQQbޤUUU 1I ޼ym6*nnnVUUENts ã\B$bP*jaa98VVVxܶ6III<PYXX ⃣1ح;vxzzJJJ�L1544<<D122g=x𠛛ٳQ%ЫW?~?76wfffEEޫ.((!A7޿vob3qDooﴴ4 B&İ0pUTT}|ʕ+ٓoBN_xU"b#Q@@�N@ðqƱQcz{{;wvttttt}ZPSryyyG{xxt<UEE\d2 tҤI/_/#DDD`Nq㆜ܠd*Ǐa9 ^XX8i$/�:x%ĺ:ԬBbEvvvV·&bNB~~/j# wL0&Т"G}}}UUU7dyܹs\̘1lllSNq5 寿N0o<oo'O---999jRT?~; 5.],QQQNNN|wbr0(ʠ /^700@% 9h վ@{ҢVTTHHHW.]UTT~~vQQ bvwwשׁ4ÇyyyAWX߿ 9;WRR?ܻwgEEEiŊ4 (+++@4KbWWP455 ?#{a#HH-( T9a{ V%hd2Çpgyyy??? xyy^<Z[[Aͣa=ǒl9e&) �;Bgy!G >wZԈJ[^^^()) ހɩSÀ |^UVb6LmxU 𗹻;;;Wӧ+ Dӫg MG7oӁ} /!H�}EA0Xm߾On߾}r}BG\\\ [aPc^GGQ~afAF fϞ5|mmm DQQQQQс `.xhܹ@ 7mllq˘#""@=b/gaزeˮ^щnmm?~||<p>~x0e@@@II - \N:4 55˗P0OOO<{НڀΝ;(޽aÆׯ:Q(۷ÝYY�"C}C࣢`)faazCȓDGG;vs{ԢO2e`C[[;''�ggg|0`ccsu%իWz{{A\nH:<<ɓCuSN͟?C;wf/ٹxb/˄ VZE ss󠠠ADDwܹ}6"trr>}eˆٹzjFFFB={GЂ O|޽{JJJ666<NKKh^__ߌ3~qú5e ap&[?nrk˗/?|iX8d2@ 466VVV:88C٨Pl ttt ';+""" 7PA`NeqW^(>wa0 FKK ܹ=( uz nnFO[YYqsskٰa>FY>c nn>2a'N@˗/Z(** c"ӦM{aYYY8hNNN6 .R#0̦V8~嗦T66}5+DZ]vmJJ ZAd2%ؼdxxzM"S!E===72h4:~v+ު*;;AA_|)`y٩{hLMӳ!齽ׯdgggmm=DNNl}4Qd꯿ӀOz̘1 T-x4 %%e'7oܸ6۷3j"QP8qرcׯ_')Avvg|:thҤIk֬AÍ7Pj@cxitt4>p8`G544ӿg=M�P,>۷o񓰍ofrP֔)SuPoZZQ?++ 9 *Q#G˳8wuu}/ <==;;;+b}/^{xxtuu%5x󽼼@xVEEE)Ct: ~nnnW V9@gz, }݉wz=f9NT²UugQa؞={͛Yί )..E^322Pgr988]sa>}ݻwPb j777 H\p~yyyU?>| IV>>>wޅ3g _e}޿i .^6ҥKA,88̙3Px$g_ a&**m۶ BDIH$ޚIIIIHH̞=ܹl8GDDlٲ@ |xӧ߿_133366dP|eţ;ws'zzz[l/^@k''~+;//op+d�߿>:q-^xŊP;hA[CEY^2* NN#GHBɍ72 '''e7oc W╓sϞ=lLm*((Ȓ˗/\YUUYgΜ74K;>{ѣ'O@FyyĉV8�'daTWWC{{{5;j:m~[TT%!!!##6yʔ),0D4~h-1*cTDgD(F1QĨ(F1Q$ 1jfшi&L8Z_F#rrI}kD ozԐ&g [ ##1bFuwwtIC "GR( IC Γ}G'"~ƞ6[ crB{{{RR*O2~2 ox$ % :;;G9T*{΍;CLX[lh/ьb.e˖2֌G3ֆƣm(F1 ˴)2kkkԸq2PUUe{~ ٳD"N'...tڮx!wðF8&--tt***� B7/((7nѸvvv%FHdyy9|ĵaSNED@0g(n1c ȶ ő O@`qU 1pSKK Jh4j ^__gfW6//MNCe988ttt0QEE勺i^^<"33ytttX]]]@#((777éX|~ ð &�e5aZxA!A0vww>Kʈ )S `{C}/##0>>>$zè/!z &M@"==}̙CETF ##,dTY30H$L*T1C;::rss1DCCe>OM!rssQ_B0"&ၳ79YYYo߾MKK}py֬YǏ/))jŋ ð۷LJ/!!tJ;;;={x"�� �IDAT7nܦM&OSLVTTჯ/) ,XrD~~~ccӧM t�)88822fkO@322233͛7?}a1//oJJlEGG߹s0QQ-[̘1-44444[[[UU'Oׯ_wttرٳgŋͽcH"D7:s 2xVVV+WY߼ysM;lll/^+^~]]hI۲e[[[߼yQTTaҥK ZjjիWa+gz7)SmGĭj*iiwݽ{9MMM333===! ~…D"1>>ի`SmƦս>22 g�… WX} beeellǗrU0x}}}@ %""uVKaaa!!!)))N4ɓ'@%>{l 99%K/_>P$55{ڵ%%%Xgdd^ZZoðe&'..]ʕ ߿u///qqqKKK 8LNRR˗t:Dڱc^gӧ啺z||UUUիWɕ}ĄO۷o[ZZ8pMU(++6D[C dee7mڄ%~ɩjjjۏ`Jwww ܽ{۷UTTVVVE?qcfii NVCC 򪪪^ ,11ĉO<y۷oq...>;vxbϟ?5,}v///یݻwo߾'G{ a6m611qqqٷox{3g//ƍSSSd2ɔkoowrrqׯϘ1ӧO}xxx\z5"" ]]]CCCوN#o5kjkkAM[[ӧOϟ<%%)/^|Y| Y7l ##cll|у,5m4yyy[[۬,AAA:>nܸO>Q(۵kWlllMM pg"222''%y游8ǒVlOC~ȑW^+}ꕒR`` :99Ĭ_… ˖-Wqر:AA'O<yAo߾緲-ZOς"//?Mcjjnn޼YJJjٲe7̝;WSSSIIPY*{nXRnٲŋ?~_tPxɐkԩ`lll477#w 61nmmY`oo:{hV9}5ÇDuII H!D{.(DGG獡!.hZ{ذ[G{P -IIIVQVVKHH!99J;(@$$$Xp^ߎ{bY@<$$$ D] eK䶶G1h PV__Y__Fe(}XӧO988zzzhQQQVRRҨ0ٳ XT ,XK$T?(jjjrrrz-"##a200,A=====7oEf ۱cǢ@ ͈cc.4i3Z^YY `w899L_vv6Puu5"gK̦M"0' 3C WǏm�QQQY좴3g ]RRb?u/999 sn? J]bŠ{ӧO KX܍; sss!6+z *++4jHII@ǏϢ0yO>!Yͭ+V +(((!!A@@N#.88XZZL&2L..d f]|9 `޼yED DHpssË̌- %K *XMyFNNĩ9H544֮XmuDGG755~PYf2,,ӧ HD_qqqpp N r8 H쭻$"yyy1]HWOO///Z[[WX vMMMM{#'''""UTTd2E%K`asNkkkpppKKҝ˺:"?{VPhUdll<ɑ޵k0gΜ`0CLYpp0/=~M 9k؄{GsӚ5k`o YYYgϞUPPљ;wP&޽sttD&GSSwܙ>}7֭[Ϻ0̙3Ϟ=ݻܹsBݻwwuu!RtAAAWWW_` Gvv6lacYY&<x1ؙo߾=Y:uJCCdʔ)主bbb O>]hg+a}}}@{ ŋ<y666ЍAu-!!_RJܵk0c 9?ܾ}-q_C;===JJJA2/^ -L΅ !##br(ʏ9 uuu* ĸq x5(҂'fff`3v1_s"??P&糰0 b{n|&Pf^lGehaBӰc8o %d2ZrK*++RP&=$%%'OiӦmذa8_߼y3\}?`f={ɾz7EEE7K֮]vZ{&VVVVUUw?iӦȪSƹaJ-[6By1JEc4959,$]VVD§57MKKLiinrRSScr"""OΒj*|' _bff#**jʕ߷}_"++ȑ#IIIH-++c INN.++c19^gQc6(ߗ ###٘$ii &˗/&'3335539ΆoooȕULZMM Zyܹ߿‰'–chh5k"##aoii U x[}}}o߾ĤLNNT*Z5;;ދ$J.PPPPTT '++dΘ1%)))11iFF$B*/h�wʕp羾UVA8QSS Ԧ $+r ln>!ܳeeejjj)ɄY=F422Y͛`7o ݾ.v'O<^__ 6RO8YM` p֬Y`\׬Y62:uhkѢE{5m(Ν;K nͽzjxz?% êTQQY`zCCD)hnnNMM***Ô₾4&N(''ϢRt䄉" @[[ߟ/_+8dHٸq{888LOnݺߎp+++qq9s@պՕCaOOpf ɓ'ׯ܏Ȼ#Dgg瞞b^tX`8 77۷oi4ڜ9s1 SVVnmm---h+W>~x!!!--ׯ_755hC~dd$F#43f˗/i4̺u0 Φh3fXha&LhEEE4 <pEÓ9y䁫&I"Xff&FԄ7^VV+//DPJJJh49M:i4ڶme;wnbb"nD1cF\\FܶmDdeeh42LƍˣhzzzGpqqJHHL;k,DDD?^xA$%%!TWWWUU&--ͪImmm,:mڴwh45o޼.>}:TVXXx֭3 !!KNNO>qppe555:cΜ9/_lkk  HƎ O|N<U^^ݻw4mѢE^]]]YYI֯_ӱVff&{9F#"D"Jmll'NKHH~***SL)..�U===pYWWD5kVll,F5 B74i,DͥhhNEEF^vlOOϜ9s ''.@(((c0h�;VXX8++FM>b'JJJO>Fرtuu:::zzz=sss䀅Rݝ% 0qd6~xkkk äƌCѴ~EEE6Y?\\\d2KooԩSy`חd2]oprJH>1wd2SSSFUAKrU-0 n< :Qb-1jrF1Qb? 82$ øGL3<D15615�&79|6'w}~ɡR@E<b`0^z5rssjdD"֠P( e$ 69C  ;ЍC$s^19UUUcƌ10L# 09~f"wQ9ԏf~!$$42֊ndԈJ c}2޼y3&AA4EEőVYY)--= :Qb _EEEO�Ϧ9JϿsfY8q<uZuvv:99M:Baaappp~G3bvY�8~I?~x-P9޽{}v gg["b˖-T*0 kmm999777(H8}}t[}c_}999Q0L~~~=Q]] B=BBB­[W^vYp:}vt(E>x�J/ Əl}Ν0njiiptt~)§O|2MExeii)-0,00mmmK@nݻ=///8U/^d_<xuA'O&u777D1�J>>>h|ԩϣC={6G-'6m{͛7_re(r#G   c4ߵk^akkÃIJKK/M:äׯ |s öm6BGnذPa{|s279,666%%x/޽KR000@ %%%ۣ L{zzlllNdǎlJJJdd$9??ϯ ٳgEEE… X}};::::Tp߽{ou߿OPӰ0"ÇфyfSSSX[YY=|c׮]];}tAA{ڵk۶m &Z8pիWx7+++===7oqFmm+<N#Ryd3O̸LBٻw/\|СSN=x� \n8V ۶m322ѣG裆GS;NrrCP•)))K뎎{V 7oDGG~"̌lŋWVUU-X�z{{>}J fϞ}IYYYNdddnݺdȧzQgg L߿}6ܰʕ+۷oWUUEcuVttt~~><愄$AFojjjvEPյ P egϖϝ;[<|W6_|_~(&lܸÇ/›s;qDnCCCǧ ʟ={6Pg5///##t766XKX|SNɓ'E%%%߼yMfggWTT`VTT@KhZFϟ777a2Γ&MPVV& �}8YOBBB10S]]r3�asa m~򥻻;Ȁw?jmmR()zj`xxd4-//V<Hq |יL&;xԩS=GS L&(fffDRR ȟҥKuttX~RR cuuu48O<AӧOϟ<h{@˖-K.eZZX[cF F9spss,,999@qt1,>}:jPYnnnGGǦ&+ZQQ?)88HVVO<QVV\===%%%˲,˗7Lvtt,))aQۓꝨ"ƹsV^R''3g²�/Ӑp Pe9moo/..EGGˢPڄIIINGG5k@@@EΟe˖d{{{`JJJ AAA===79FFF <k֬36o nGB0̔TjYYٺuDEE]tiFhhΝ;RᗂGOOOTTorfϞ][[ >}: ޼y|r|~Շ~o M׳@e&//pSOBxqqiXx߼yjժ3b,6m0a•+W oAg---zzzb1 [f7p }}}];ߙ3g!`Fj:˗/ _OO/YTVVqahl_d3}OOOO@@;Ylf~5fffn߼ycmmҝ͉D"DQ]]:Ԭ/^>}R�@իWsrrrpp<{ _ݻw=ruurX�Sbcc_xaee+7n܀ðuց ~n!q9|yll,LvuuMNNy&߸q w$/,,,(( ={ 888xyy>|�>7l sNpAp 455W\ 7lii5U0<4yCB�իFFFȾ}A.[͍H$.YqccΝ;]]`[�� �IDAT]?}}o:q9GGGȒǏWJRa%xA hׯ_]#ܼy`OFigŋڣl<C}6Ǐ@ݧOfGCOO~Ս7>"sAu,!`XG$(R`5x}%`Y766fY|C… NNNߗ+MNSSSww7Lxe̡ tjhh]j'''ON8?)`6cƌ۷dddȵؽ{XLDL{jkkkmm deeV^ q73fXx1~ҥKcǢ爈XL6 kHd ︸:OOOamm32229uԬY>~ ^{xxb 'NeA^^%m``�<?? {^hǏ%DǏ5~Gn}ػtdW:;;5=~]]dClk.{t:}_"蝼~zEXEEDuv=o޼EgHۋ0 |2DNK  ĉ...&+`ccsI&GAA,V FKK/\ tuu555޽&͉<Y4E^^^òiE@ꩨJkkP_  QTT&߿ҽ~VRRK}1x"""QQQΝ[XXC`F">+R>k֬A39Y B:::`JP(ݲM�y|(4o޼anG e\DQu<.]zQ!~Pؽ{7oyqqq6?|V\pahhoʩs++6%K zJΝ/jr***)aF{{+<<<$%%юQvv͛7 ***8hϟ??n8X G \]]r T޽{%Mu` BaYKܹ9;;͘1U͍e1vد0Txر@jXzٳgY!Rn:444gb*++SPP}>|HPK4:::tuu]y<Uy KT9y<hF*J ʍ(ە̒DQfR!d9q>rk^k]<SL+ üPsZ~k`Y\\d2 &44ĉϪ7P!47=[L&!h֭Y9}+W ٳ k׮Ç酄ر~"""DEEqVkk+4w5 ܋/noo'^vuuD+++0tܸqɓVVV7 �kkk/_0޽xlmmMLLk1TϢKH$...X_KII=yaE qܹp�cffv}H477 >##cĉ,KLL TTTᙺի/_:;;]}-[8p@LL DEEG),,7+++Ò?!!a…<<<>|0LZZñԩS[ZZ  ]vmKK a)ѱt҄999E[[BBBuȈܞ={nݺw<x^zMpvv#ǎ;R vt4ptt_p۷o=z|ǽkϚ5 fk200W3g jkkc2#**[7,ZD" Z Bnݺ%((*_Srr1BOKK8--mڴi4MHHH䪫 &FeddH$Rww74?k͛7K,!H[[ZZ֭[PL fΜ<QCFQ(BdzH$,X$$$UDDf8/X,VSSDى ]]]p`+,,u::: .._.%%EK FI$CRTpE$Ed2bAaKߝ!Kcc#\2L80E:F3-AAA4d%XQK577KHH ,U/Ns/~~~^*JR!?+]@@PXB LJ8K>Ghjj"dSww7*tvvۛZ=ؐ0ł(aAEDBa0m5Qq*0bhKMMMhYaֆ?lz r466JKK^Ch0{o6L"z$l&4'hIX%k8h<$4'u0Ah#K콕dHKK?\]???!XHH*&&F0ⷖmpqq#({bן.0* >{Ia/777;%???{"aK'k28=~V'?`Trķ%r!4'^\\\UB؆{,iV=Vw}VΕU m⫗$ 0Bc[YCop 1̱6a c$ O901ABz9�LᢢCI egb2BBBC kupR;dTAap] qD)g(Mt:g(M9t:=,,l ==}( gL&܆ !68A^^)gĈ64�kfffCI 6cwcm64X%"xf<,6a c-ч4k$ ;$$$CgSSdee{TPP�{<.TjKK >F;577.!bF^^ Ԅ"o!** +222"9!K1zh& �~~~)B@RRR}VUU]y0X1 "bgE%lMM4{dt:OBP@ADD(jkkѣ KYaҢL (Ӫ*yyy;oüLH$:X-uuuaQFAI{kK]]]"!,,S{{;HJJ"tXʽ0=XXȑ#{@a!> 8KROHHȂ ҂_A?{+aC#((ùEr***###Al[[ k֬ٻw#_TAWZPVVpT7n23 EѾ}}]DM"*Çedd_nhhϟ?g Ν]VVVTTt5xyBCCAxW777 fQQѪ*[[[`trr9s&EEEϟ2ydO>~R(ķo"%/^� VVVx5NBRׯ_Pqq-[@ݻjjjIII :nܸ+W..."""{kjj.]ZYYIPv̻%%%vUP??? QRRRYYikkdrTTR=uTtuuugg}^bJKK =“Mtww UPGGGeeΰ0PC޽{hs̙UV>}:%%޻wOWW۷o44..ޛ`th{=.00L&a7n�KKuA[Cf/--s-..#vēGP*3g>| ׯ߽{T}} XYY\B&&&070o߾3V}B,111GAm6<ν{Qsw… ]6m4^^ޯ_�ߣG~$|Tj\\RpႂB{{'O@tŊҮO<Ak+WuUUUd2y׮]nBl%%%c#FKLLD}.~S\\| :99=x׮]҂s#FQ'Oį(ab0޽ᵪܜB ف< BBB>|X[['𰰰�+))#444@Ƈ}אkU777UUUjaa1bĈ˗:tmۦ XB,!??I6l�;wp (gΜYSSLӦM///SRR:D`onn BcǏJgggi9;;gdd{HQQQ1jԨvsss?KKKwx˗/r\rׯa)'''j%==2"""!!!66?~|1 0NNN?@5 Oc0@A׬Y&M {255=zѣGAde̙Ǐohh@tdhOFhKo߾ .ܾ};((9䤧s֭[edduN8Q__Xxׯ_a΀J8J\d >'NNN0;::فpɓCCCA*0++KDDJjjje*Ν[TTmvaaaP111666~~~QQQ999ω'z d8;;_ Î;!&&d24555~~~PģG ޔoC222;/33@<;w@jRR҇b&&&Fhllh`ٳgϞ={`*F D")++VQQ1)));;ѣ(P@ B8SRRꂫ$!%++ ~zzzh\OO/)))::/+$$i&E~ҤIąDHHH}} Ca.]Zd hg %JJJ*--DA[[[III{{{?m&lAq#+suu5~^w*++lii)$jjj"~о"//C,Ydɒ;wmqH\\\$,6:/)((8~xx=77_KrFEūeJRRǏ jV]?~հD2]]l~~~:-ƎQTT؈04UTT̛7+++TTT[#'@ ФUTT<x@& jkkh= KJJ`766O;v,dfffeۑ�AAAv'733s޽&`0a.Аlٲ{#Yܴʃ.X@PPPOO_tАO]]~+''gmmy2ӈːПp 6zhDBB7<޿rss/^8iҤ<}˗4Fm6(ѣFàɓ'ٳGEEEQQ1&&\lƍGU˖-�2hI1�,[컼xyy555eeeO:R~~stttGH$pFܔ a!@ZZD"[M:u׮]쫊_JIIvGyܹs/^hBڎ; ?>s̝;w*++=:((f׮]ϟR=~=\UU,ŋ atrrz gݑLGGGꮮ.sss000?#ϟnXKJJ?/P@___///aGUU(-,,GKKk&LPWWGƪG╹�(8aŊZ5Ƿo>Dk͚5O=Tgg8N6-::ӧ솵D,8nܸ޸m֛aŋȰv)x9sDGGϺi&T666/^رcӧ>ð˗qFP(`kLLLtCTT}!)SDGG:;;F|! YYYm``wggM8v֬Y譼޽N`3fa3yd]]QF_?1 ]]蘘{{{???ߠQ޽S'++jժ_p c7-]tttbbݠ~?uւ*b cgՅpss߿_|QRRwwwqqަʕ+$###<qwwwzz: qqqo޼ٿׯ~JRzԅ ^^^O<zR^^ޣy ۷hbeeg̘50b!@NNȑ#Vdzf:NOKK#~n> KuE B֘9Y744Guu&H$RAA;… CSqqIHJJ:uj0L2L>IēǏ/^bRRR>͆WرOZ(ݻSSS{3R 󠤤 gBoff&L9999}vڕA`qYp֭Or|BACBB f2Gz𡲲… ێ Jznn3+GHHHZFJJʋ/zs0,;;[ZZ^paۃ3gyG~aaaaUUՉ'5藘rTTT}'1`CKII7nr 0l„ p`0ǿQYYm<244,--;uuunWTT紵ubiiiU<ӧOw&0/Z, ogFOlyWW׀c/_E@!JTT�rollۚj͍B S{31AVVVUUޡX`7oS^Zx)S &()ɇfnn.$yjrƍlF---1ߋlԶ'O8uB~mIZZZCCkjjt̘1555 >bԨQt68rHȫ;<<<0PܹsgڴiӦMC?9sfNNv -Y˗ cҥ6/]4**NBIII111Fu;e|H mm*H9r-Z+h7o,\PTTT__^ǚ; , DWX[ප~ڧ9t|rZz5{v_eeexb4rQwww̙3 /TL&̙e Ê`ټy?ݻ�0kkkgggҾx"Ս7;ﰁstt?Qeee9'/^{޽{|lmma1;vXxڌ (`ܸqxp}}} `bbWXє#**_O0a۶m>SN~o5~ɓ'!.Ncbb/^,++{YpЀ===& 9s5iŊ, 4xyyA5~d'$77w5446qĘԶO<y5!8<~C`jjPEDDNG&ZZZvwmCCC111aX Aj*wC FSLaXMLL6n5~Ե{]�� �IDAT~~r ~tW\ ˗/'u֡CT*P o߶�mx2 YÇ[ĉ&9c & ތK,mƍO<ݽ{7LN-͛Ӹ&*ի *((؀?θq@UС)9~} sXXUaa c ax01a x{Am&1!!kwȔNAxxxLt`LJ] >>R"]SNWWWvvPoLfvvPRa"H_~sJߨu(u%*Jц@Qt;Z[[}7|ؼ 1o0 'Q"qBEC`bh4ڐixL&` qqqqqq L&?D ?3AZ7a$$$222㏡V]]9+!ӕch( 999CcyXt0}%w܉RRRR1 ?>" bڭ[&Tp1X<}4Нa&)) 'g > a�ccc u2ܹ3{CMMMpp0^˗/?0lԩaaaifftaw-**B7X[[\|i b{{;!//YYYو?!!t/^G]voEXXqAjouo޼h1z;v˫ ð'NҥK@ k"hmm9EEE<DNNNff&o^t)>+Wn ¤biiaXnn.R0lƌ+W4ڵk!p*ۇL?vmq Ξ=gRRRjxӦM3;=  %.--NC0fRRD&.\E=#۷s`Epႝ]ou9s�͑ƍI젿 ֭[WfA8s b'tرc+^rʬΞ=a1 KMM?~?~+oJKK!188ǣ˗/{zz.aeeeTjkko޼ T*BKJJ>~n.***;;R?|a\]] be�OReggKJJUaaap5,,˗/=aDDkjj{ayeH‹z?>..MLLLJJ;@7\~͛x_kkkT0倞)$2߾}{匌 W^^ݻw0xzz2LH~:>?zh̘1D믿 ðB++s!Ν;VVVnnn` GL z5b<==aV@eiiiIII0LFF%损_ss3$B.]BmU\$߿G0={4 ݡ.\[*^X555o޼A0$'''$$@Cb```b?/^$dJPΝ;/VVVgΜsdddz+9?͛75N< gՍ7ꂰ$!$oۧ刊mmm ˗{NKK vB;w (+++iAzL&AwmmmMNNY͛7QWW0 SVV3f >\RR2yd AAA2OVVVVVV2}}}߫XXXO8q8::?,01 ;r(tuuEFF#C^^ޓ'O{|^^=0!`„ /xb{{۷oaۑL$$$$%%፿SLUV^ (/_%##Iɖ-[@6uO|0YYYVVVVVVↆe)""B ċ\v ]舋ɉtKKQFA}UTT{ĉPccc vz-\|yCCp]xqǏaP[[h"D҆xM F{-++4iRll,^t׮]#G4iBA�!!!B!1??͛?[n7<&MD&O<mobSNfsujܸq#F`_?~\__1`hiiIHHY'N~-!!Ҕ###cffrfϞԄ&~EFFl�Kސ͟?q&^zxqf)fS̲֕?r5jAfÆ pUOO@Jo)..޼y3ۚ7o^XXܩəlx(ثG?]-55uɒ%"9 tVjhh8s挘$$$`[l`coooړ$|O+aǏUTTNmϞ=Ϟ=ʕ+a-22288V �E@@�ޠىWEW=v]QQB"X[lAx=Za�Mrhj733#aAĤ7իW+))A["ឧO:::$?7o, AAA/^P  ۷Xd{ٳg=.@BRa80LIIv?p3eTTT 6BBB'555PsNnn(\}]mm-؎ڵ0.۷qhDm[[[bbI~~~ttc"ceee]]]pgvvvIIرcQQQ+V�&XAxmuu͛Rǽ{tuu;S`D/2̽{DXXxŊIII^z5{l` [~=D&߿Ԕ(RSS 7LRRRHGǏJJJPބiii;;cǎ (ׯy5k|sjWΝn *++}||zuFTө �TLSLA �ǛI9̯<x}xj8r䈳3Ҁ�$TKL9+WDSN󍶶ʕ+# ƫWVSIVVm*))1 /67qƖ-[gABB7j(/ҭB'=p5<<8rJh N z{{oٲe8J\>\\\522Ν;`Xd;11כ6m0a9k,t8}tnnnSi7z42\2++ vG#GOj;ti\eeeSSA#.//OZZddd ÚOKK{cmmփ>|Wh`:N$--CCC{w@<n~i]]ઋ txtτzoo{>~`[Xx9 c`8|y/_aFommՏ~^| )O<-U\\/AAAr?~¦2O1Akkkxx8߼y;78 鼬d;U0R@pvy&pPpIm0^``xQKK{9رc<߂Llmҥ({8�WWWXm۶0~޼ySVVfj:yfA~;\~yReff۷6t c۶mxׯI;B}}=Ze'ZXX=z!yܸqs7%%%55u`F`*hǏ;/={̌Ж`;'&''ȑ#GXX썫+rӾ}~ȒHYYy� +́L?9͛7'M�{!ŦDyCio߾e_yyy999*SΒ%Ka/bll 's$nܸKNڱc ԩcXiiix1<DMM ³gnhhiӦ6eǎhjjc MV[[ 744&e˖{޻w_=|fcZZX_ www8~---pfcjj?6ɳg IHHu%%%[[[x w-gȠP(HX__eWWWp=wXHo 1[ׯ_!f0˟?=z4<---SriOOOP277?~<phh("&&?n֬YnnnfccӛMTTrݰa$!q޼ypuaHܼys?uEDD^s{ԩSw _J@@�`M~b{c`Kqssf[[%l}:;; >$H$RCC�'&[QQߪ1/..VPPKUfgg7V,˗/Q(|H#GDCCuu5=/Y\\,//.AB*Z-b&##/kee%3)** 󐎎$ s!!!Ekkkkk+T{ &HjhhWߟ>}0i>vuuA(42*Vaaa| cVXXMǏ|(,B ;TBaZZZ8ްpvvvww7ac`0rss TDD10PåpXIhK6 >>>BT� @PG;ƍ7jKřD"ɟ{[RPP@nSA)AL&WVVgq[eeeapyy(>`PPPBff 0 yQFQ|hhV-1 cX*hxXt0[bx01a zv �젇*ȐLiXRW"CDЕ~',,C>SNcc# 8T*5""b(EuwwsqqAH�`0C+X,ĺ;dѣ$GK*++ ''OX{r$%%QHĝ;wVZ5dZHTT6O25uhlCBBŋׯUTT ֌Y,;r~( ??rxyyg2%J%78@L�k?xG3L<!Ʉ7%!ZdP|Y,@-cv(` 7ίg{̑,P(=c%s6psse/?v cvE/_2_sCB#OD0CAz{+c:,{Nߔwp]n yT{e=L&|/'"******W^X<fmm π@Ptuu! ðv�LfFF$nڴ X ?$矐]ww=$A رCYYYLL&gddif FHH<qo�mmmjPPJ]| xdzX2HY`(}1XH<x dGoݺnnn&B@WWL622F��L3fĉz!vZDzAo׮]C4~ zjHΆR(555ׯ_EAaQzJ%˖-C,<YsrrҪUPC EB=߼ypyh={@۷oa={6$VWWCFmmmbhhȮ@X2$Π-Pnذ333!w B&Ԑ:\kkȑ#wPP*((t`hǏgϞad*B')E:h'NKᨼ+Wļ<Ԝd ( d{n߾U@@� }Yg�}g…xzbmmѣGHQd2 ?...0ܹs:::CxDZ`>ZSS'N@mۆaXDDDBB$\իWG>| gUu***׬YO|edd$z~0… ͣAmӦM666hccן>}nnn^t)$޼yiRRR!qNvHammmK@PSSJNNd2Rok;wN[[~ ,6l8s $޽ ;qwUUU%~cc)yoUhkk æL &]vgKLLLDD$hxH)..�+ի!511y!$Κ5 x !ŋGkkk4 qqqmٲرcxaP;w6kHVV$|###ٳ ХKO)O>ErxhkksBJJJٵ ֬Y"P顾Bk֬p$n߾hMO V~~~UU }KYYY=w؁FE333T^t钊 # 8Gnn.aII (-- ~zݺ뗖xxx'4{ AuxHss3ODž|{{ }DDDdС_[[$JII֎ѣKKKܷ:NpDZZZ?Nبjii777 tvvrqqqdP= d+Dzф]SSs)뭰=r|aI$bRgcl2|4.&pvqssKHH@.x^dhH+V |Vuu͛7c&..?`),,%!hp(ڵk׮]{DR?#HUTTKQxI^^^B[z;)** m ڴ 5huP1544JKK?~y Ǯ7n@RRR �WS<OMw+�dU5;Bcc#Fb?{lPPa4xg9,[ 4n݊ziiiY0** "%%A#dǏ]]]W^}I ]vϭBGqɍ7fϞݟY3f̨/_SdiiWmmmgΜF[WW׼<ooo###4NUWW# ///j$SNNn׮][h%&&vI \[D+6Lx_uu-[t/<<<S+ WH411pO<Y~}KK %%K.A.@y #o``ӲelmmTÃdzgϞ9st69oY,VAAe|| joodɒr2"ޣN4 Rfhmnn^pP"""H&[ZښТZZZΝ;իsέ\RPP)-aad(ƍ=[+)((�u:77/L:9q;((v\\\}WWW۷ˋchh 9C]]iŊ+Vȃ~2�� �IDATFvv"-{xxHII333"?\rA (sW^Wfs粳+)S{M6o؍xHJJ /_dggGEE͝;Okk >QKK ^8&&/ J?M6|n |aSNEhƌ% }&  ,GvxUUUGKǏGvrrr~~>r?ȑ#aaͲenb7J盼xijjrtt466&8k׮EQ#""8jr4 i766^ti0bԠj͢,nѢE(QFNo޼9gϞΝ;mll'ʕ+QyǛ7ogKiiin>ػ֭[O8AR tzqqTo~JZZZ?~JD* $%%9mn RRRp p ۷o`dddrrmAAACCCWWWSSK y 8fT~~~_|/_=ϟcm ?hhhpww722@ (--ElwQ4nvڢE寿BH#@":::8(~}jFhoo'P\\VUUuСr !Ġ:hhh V++'<VK<g177w100 6$%%KJJ`;d2'M}o.--9r߿uӧO9sرdX8yn`pwwWVV_DZlYAAF WիW<x/ "***55kAl,[,==]_\\2\WW憶ٔ####((܇`5jBD)))(Laa ={O"`PWWgoo'uuu$%%%..w"EEŖHD 8jԨ~58JIIsd2Ԁ TYY JJJBIǎ[]] iYYY\wܸqp[mm-hAb[[:C6n===/dTUUgVWWsdkkkKKŋFP`5j8?ԩS=xҤIYYYL&xyyPv#...++^@WW777,{#Ξ4i??:\A+""7r677ÝHg„ _~mkk0L[[eo?mnEEzfMM {["g„ p[]]N.++r+5448H3EK=[T*,G W!G---B||4 |h4Zaa2|CCJKK@"S[!..>ʟ'fgg X,;t:=77wĉ`0,==g7}O9x}e˖1Ltx+V4>x@REEo2cccO^j߇cǎŋΝ WWW&4 ӧ.] BaffvOOOz)pprrs:344^tnjI&޽I4E^^wMqO/^X 111/9ѹz*.JJJ(d7oބװ Tgg'O7XQ֯_so;557oK͛N6ٲe @T*_AAy޽0U@6mK,faspp/ Ν;jaؓ'O@j9@3&88VqfΜyʕӧOãnݺFhN"-&&v}p=z4rD:o@v۶m0=|0 MHPP(޽bΜ9(/SSSqqqׯ?|;\={,Xe_~q8y{.~i7"""LMMAݻ666Ǐ: F~zh{Dkk_A*IGGo ܰaCGGtvv:;;C\j`?0,[bXǰDoa>D01a 3a c$$=P_|||Cư2 νxxxL䒛{Ȕdau["SF X?5hjjJ L&uuu!68twwWUU %E Q@^$%xCRRph̔KR@,Kc{)L2] OwwP FYYOO RSSC Yp3@k@kٟNZ^^wc2RIHH̘1cy{cx k555Cip///722X~St48 55Gaa c`m}˗7o`fddµAhҥҚ ~d R~~~H|ðQF@rrr /''ϟ77of_ǟ.;'7olH(88lق|||Pagg'Q@-pXXaZZZ-O>%&&b6}xl=<<X, Dac Ôq999ðiӦ2cbbTUU,MPP/nݺOy>˗@YQQv�mmm~63f)޽K&1 ;t׭[b ֮]{ t޽u`0QDD¢"|򥭭m֬Y(۷@h"---H 333d͸sJ>|0D S;v,b̄rYQo\7&ooo Q GTׯ_`l2Z öo q*??m4uムi<jkk!ZUUL<b1 KHH$|O>;w.QH(CWVV3}.TWW8998͋/H$D!!!;oHvvvvvvF|I/((pqqr EgKĺ[[[]\\^g).. H߼yWŠ`.((@"0 P(^^^p[YY%TTT<y?~ MLL $~ÇJ\xH///߿,(( gddRH$f˗//]#4B޽{]\\Ο?O֫W `VRR>1D⬤boo19/v]TXXׯ_CBB5===>>_x+ϟc\>|XQQ7o WWWHL_oRSS ᠾڒ/y{{ '>}ff˗/!1..;###SRRЇ.rD,MRѧlnnAЊ`y=\ qbHs='~*<<<Z[[I$Rss3*;;;<< YQ݆ &b04 D___4J. aSSХ899%''hiicsN]]] ҍL&p5rH �&5kր7ͻw6mLٟǻoLL bccUUUa[faaQPPd2meӧO_fԍ7b;a`y=x֭[}6((ٳg/fXSLK8lt؋acMM WKK˴i8 ')))hq <y2An ðh{?ھ};؈֯_/));{yy{.cx5cɝ8q?fPEmذbiii?+м|iĉL&sڵ]|ܹs*Ç}WWW:mmmE8LXpBQݻwo^^رc= ;3gZjĈL& hvSSSadehhm!556:˗/|* PP"Յ=YXXƣG.\�t]}+WφsQQ@gg[X;BVVVuu507X `o߾py vZOX'%%axƍA3딣hccCP500!n޼ kkk9L&͛999h %##cǎ{ԸqƍG޼y,x0޽?钒*qM0 ϏW2rrr2\w0lÆ n:08qL[֛5f̘iӦ`La(111..NPPm{aC8{=a\\\߿ט={6;yΝ7k! CD OMM-!'D=#;vPH^}M6A.<<<Ѐ #33Nfz5)##za:'Nh+Wpqqe١CPEpMMMN�Meeeۘ+AAAtֈ7IDؿD'--mccî O##E>aۻСCx0źq~e>**jƌ@>|,C$((գfP(:.+++++AD ZZZ+W… H>>>YYYaaa`^! [l144\޽H~T*J6pDn߾յsNX>4551;ȷ;7h4LىʲX,dx?#Fhjjɓ'oذ~;8TPP�)))YYٶ|%;:: ={ t VikkK`|ӧOqtN:7=z xK%$$flKII{DxxxQQ) {{{IIIt.]Ʒ%SSSccc(N`` dʲCWWw۶m/_bYYYKVVΟ?ׯ>?WP,F#Xڎ5JVVVFF'^ J''??аx񢦦]- ''gii %[^zd:~;25kְKE:u  QQ꺴ׯ/MJJ‹J%'' k ky۝cuuϟa-..d/]I8xAN&L@Wfddtvv-_L �9ރ�K._<iҤ͛7mӧHr֭!???axދ/58KDDĜ9s2+悅ѣG6l@"xکS koV\PzÅ -,,寧ӧYf͞=UXwcð'O(A<xA/Q]]}_ooFGFF&m۶} ,N[n<yݻ ČO{(8gΜ9s۷XGGz;wř?Iɉt<xyQ[[[۝ZJ>}wѣGtݻ0:`xzzXM6qP҄55e{DBB RSS 鱱o>z<x�>Nn݂_h>LKK;z+W_d}w)((q'CBBP>|ںnݺ>m͹sFmnn>XŤ$ 000-- 7>'gǬY7s+Vq~ehii-#𯆳gprgϞYnrww L>K.Eeee***HQ۶m}dwuuEEEG(??bժUk֬A?vXqxaQ\_س]`" "*b"bEaIlw01,`7hlQQAE((Ҕ^\a [?<C`<239{2LcHTQQӵaþQвl=;:: ݿ{ȑ7>>޼ySPP@6KJJ#F@%w!<yP7n<߳\E@@֭[?[kcr\TN:ðyݾ} ޳f200ؽ{ɓ'0 ۷oDC%K&JJJhGٳgp`͚5aaa͟?_[[Ҳ^CGGv\"""b̙jjii VrŁ8ѣGVjjj]]ݝ;wC/a؄ BBBX8{b1NYr%ܳ_~0COKK{ʕ+ :c cccÑ#G¬֭AAAf͚-N;w.2y!!!`LLLlmm)yڵka~QRRZv-<EAAMb?n޼ySNEljj@OF]__Ǐ:ԩS nܸ@ VZ5tM6D۲e97BB1`ɓ'ߟ~%t-\ #GP?lPVVՅ<44p,X Wmll 0qM@6l؀;=y.N<vZHDR?a=rȁttt̙/l#G|=۾=ztmmm$ w}aUUe˖+**nڴ333H999l TZZal=&LP(r5Ћ0f;99 SRROƍGHNCAI{P(UUUdL555'''Pс6 D&1 2d=<<۪P(7 A, zPYY lwrr81hmg&ogΜ h4x,YYY'''�uuu$tuug͚ACCCBZ篿lߘ1cd2?~<^m… #ZF, 444 رc>i2a{h4899SPP!C_abddfffPzj8Q(p9жNNN{zJ8q">1o<%QFdHF;v,?~/vYII $K5kttI$Ps: WJ4 ]OT'''===005466xd2X бcǒd駟3͘1JD" {г(T2|p0NNNhd2f=I:u*Jś&)))X,'''=+**sC CB C C@ 0ƫ aÆc-<<|ʔ)4M *H H H^B=>0LVV ---g X gf2ܗ N�� �IDATtggƁdJ7.Ǐg  0?:jkkcbb$pCCLL KH$jhhcơ_~\x<. \D/YY/MbGgV9ұLTVVLT :$ Ad2922/YYِaÆ!j&!ħFdH9.B�cc�d$+((5bL71 &I&Lh4ϧh}F֗06M&RNn^t9 $@ Z k׮8qڵ "T7$0 {<aeNN!|@hh(<xpݻw#kך~�"##&r]ݻ$aK.?ԏ1Jw(**'Ogð/BagG <y2^ 0sڼ<(삒ϯnų/X� dkÆ 311i`g[ILL7apss#X=#?.,,KHz566C'CP /m[[tۆ>Ix%K@!aOkذa᫃QQ oΜ9�j > 2Bp�v O>0dH],,,LLLϞ=#ȿ@7i}̙3oчa y.!ɹE#}ŋmmmx:Lп;}ի٣ ۷oP(Qa񙙙 m>~8f̘-[MRRR.]z…;w<x� oܸq!dϜ9(jkk8}~< 'ٳ/)~c 2i$8yd#F |O?$'%%9snx}www//+WASΟ?133#`bb^WW7bĈիWC/-Zt­OOODg ~Jٹ-[ Fŋ $+++ MMMhIIɄ Pkk1ґacҥqqquuux1c\t ^~.-[ ^;==}׮]3f @Onjjroooӳ|p4<y"2220?|0vX{۶mkiis<x_~;w‰yQ4o޼ӧO9}>bX a`Cx[lAvܹs{E~?vZCCC[2G?.55f�n^"zzz빻ST$4cƌD4u2dHxx8lkk4h~ 4(::F5772)c5cƌ6\pppRR>>>7n\f rK7oɑ/E%$$e###B6 ֯_5z?h|zאkO!J?~M|>_(-khЦ& ٳg܂555FB  (ݠL&#E(**V'oVJ%W5V0L͏iii$tvv C aÆ?dB[ZZb1;P($HHDY9yL&A7"DRO|}}3L(lP(D-//?~HH^F}jéSAôfí);%iii)z[`6B!ZCXȓ�AAA 2x<Xa4[[[wjoo%ؖ-[H$$5yyb1L&Z t:Jl=;vpwwZV.**J$ᗭb0ɓ(?X~=sedd|~{}/x.kbbam֭['M>8wP(K<:TD][ �B!Q{hXC p8#d2 ojjp8id2!?xbIW!E2YVVtӧ}PMsssɓ YJJ C}W zD -! жjjjgĈ :-ڀPqF.̈́捉[`0dee C<--n|Vڗ/_K{!D"X`t7h4[ O=@Reee ::xÆ vvv]Kȴjca= Gl6Z·C0[u5]nÉE͋jN۵P(.8w p8ž^_YYYYYI"5mmmǏ~:WrLMM+++ccc{Hd  \^ݽC;?_pSSS9`�z=a/~禭MOOv?~eݻwCBBΝ;tŊ~[QQQYYmD˗/+a۶m W[O6Ǎrƍס@ @s1dȐX,+vp?ī$&& ={XL& +V̙3={7UQiYYA--[lll\]]?w&Ο?_^^dg͎"iu-<sLԿZZZEl2f̘7nDEE 3f<xPXXhnnp>cք0w7oTUUUVV{x/;4ijCCX,nllMR ѣ$i IpKKKgx߮---`&[__?jԨ&HpPv8�VO[n%'' %oooo$xqǷl}wommVTTDӗ׃cCCP(lnnFNt:6Z[[KKKI+ȞvZFF&[nnnّ<B tݿG[a 6A yJwMSg/c苪7nܫW-Ϟ= 188XIIi̙˖-[xq_\h++DVlN(644̝;744411Fyw(#N>쨁oPRRy�H$WvO<9uTwN<I"5?az^__ŋPKKˉ'^| f>{ussx4HIIEDD@:+V%MGDDDܻw[W^M>0G`=3dȐrGb2 h?X,ߨkjj@Jl(lllBb]vڵhnii HMMMK!T`0>mmmrYYkaܹswE;TUU4Dp8PxPd Q{2L99<H1 Hx+Cp8G+''B---|> E||| 춶6TYH@RPPhhhByyyTWWÂlT7o,_6Tt4-/:\."o UTT(<<f߻w/..t؈_NN:99�p8$iرr@ߧT y:ۤ%HZA222P"''V$CDҷ N ` ɔ%9ի`0ھ6JUUFkiiB:Lgd2i4ٳĤ[oee>@TS$q\eee _/[g"ð_Dwرw^(<r䈭-ak׮Kihh/ ]II)660oooɈ#4@1.\ Sݯ_?dO<f͚;wb;9h4|=vA_.V\}U///p8I:st:ũTB*))bw^77+W@{bXNN.>>0'N=?`p}///3?9|0tK/^ BCCA<!!aԨQ .)Bi8I�±Ollltqqy葦s)/_?F.]B"OOO xc$--)111=㧖 .]Bfȑ#'N[l shhhH[aݺvZ[ub+iMMMW, %w ,X�r _vܹ{nz1*JJJ1bDSSxСC[[[`ָbŊplҥKޤwE{p#O<3f #p֍͟??::ǎ >_}$m?$$m?$m?$mcD[ccСC{;mllHI Hm q9H |%P;[ACL_@7o~֬7>d2WRyԡC}8nQ(.N _jKV,x>S[[L�ðzїmmmK5jnnD}8ºoˇֻhiiiOc/,#K9*U$%&&IY}}}FFFѕ"uuu$L6[[[اD"ZZZqhmmMII3! RSS܌z/=+]62w� cmĉ@Z_2O?I2:ƐkKL $@ βUUUxɜ8@{pY[[#1@LL }4M,5))S¥Z8JKK8O0lȐ!P�GǏs|;0 {(/_$p, 0 �2t1l6vZZZ-//IMMMETTԨQ<?O{aJJJb<;Gq\ &NH$hnn099 &@!&lOc333|޹sf͚EX/"Zatح999 edaaIII;<-iӦA0S$1RAxti6l0,>>B&L@ h,ʢb<O߿/..K V Ҋ1 1bD'SLիW[`hhH<1b:A&d2p|5ܾ}[$Q?~0LUUC 0� =tحqqqnps\1cÃrrr޼y@ 2iiizxzz C<ydVt:x<^`` @)((qƕ�WNNX,ҙ3gGFF(uvv!""۷C.ݻwbD/"""}ISS3...22jMM+0@ puu7oބS222@PUU AEEE$Y[[憅ϟ1c:?ڵܺuÇ(3gά�-''';?>y$b2iiiw܁ʢn}!!!D" [nAeeeeE"ĉ+++û=8rș3g +ܣ  )''' mmmݪݚbEEE3g{`QUU쬤t޽h)kll7oJf].**JNNSRRB.˗޽4k,--GEFF®oMM  6gΜ[n$I&UWWdff]N^^^hh(<Xlbb;w�Iyyٳ3 555mٲ%??H޽ @޽[\\#r={w^û;w(//wrrB^7o + dP(jNbccE"Bx򚚚@PTTDG.**}6}_~-ZVV Ç+++.]Dp9V"@"KĄ]Xrɓ'h{Сȁ޺u,Yb``@Xڵ_qFXTUUM0aƌW^}SN7.555''ٳ9s&$$¢0lݺu)))ΝCvvv#F崴$&&@ ŋn»@===Yti555/_s#G?bm߾=11QAAA, h5k>x�h=\bmm{}A.իWeeeH~ TSSccc3s̪ . ӧUq[?ofVVV=55$ڴ\\\ 6m8qׯ֭[W^yuvv6A-jǎ111p.={6%%ðn$HP}}<ggg$6mҾ}._ f͒ݴiO4 S]]XTTg*));v,,7WXuĉ 6rcǎe٩�sp̙#rss_~rI&%&&{/YYY611)**4itQ{Z[[nnnvwwܜÇJ\p\ν{?~BܺukFFH~5iӦ<h377ǻ(;wnP3,ʕ+[ˁC{5|ҕ/^| }}}}!۷{`{Xd D �մ˜1c Kﯡ ` peggÌƆ!|}}333:::zzz.zV^ ª*[[*eddS__M> 555sssx\]]]r[քA?ٶP(?~O aii <(ţ)S<{,33knnn,kuuunihh 8S+ <~( ;wnpp0;B̬Ç]wŋZYYurr A[ >|~~~0>&"gŋpOZZ8bcc!ho$%%B vhwލa"܂ ߠ䔖Fχ555=zgggǎ揈OZXX@5!!!''GSSϒ xoYYYׯ_r`Xt:0gΜß?~Ŋt:]GGJd  RRRha2P(++_pܢ"Ġp@<XYYSedd2225jԨӧOׅT^^]]#@PTTD `0qL&kޞCWW5/ڢ<x0 L]_~@ hjkk |e!`0l6PZZؗڹpBf'O }D\ihh(**joj�� �IDAT#VII `- S~MM^̦}ѓ'Of̘ѭ狋<ΥKbƍڢ"6=x ))ť54d21^'..N__)((YGGۣFaM͝;wjkk?|gi\tͭSvvvJu/gϞUWWIC=z6�:^`ѢEt:}… aWN>=uԌ|X>SN:uu^|9`k׮k&Lhoю?fQZZ3LX@ 0LJFAkȑSN킖_AAaXsvv.**z a'>:`С+..*""?ޅ 3fkm~͞= )) ւYCZ#luN:!x_YXXXXXXhFzq|`mɒ%l_711qԩF Ν;WYYk.(GRׯ_ xH~٬Y %=88Eu}rKvD²ΝwO6b…橩K.";GKK)S|||bbbqttttt\reFFFO|_ .\x\YYyժU`oi/$}%-<y"᳟>eOOOOOOr-e͝9^zl&6G}YII _~A| ÆF\\\RR^C9sǏhfrI:ޡ7/^,P<SSSg̘ZZZP6ɛ7or>}:޹^z^^^>|8|]]ݏr BHV>>>Bĉ^^^B/ʎB@ۯr>ϟ5jTϳ{`X=y&`(httƍn6558q׾7|2##mw466<y <vvv(hmm?yyy!!!h :::vEhjjo'N*\p[UP KHKKK4g0~]#''޽{].`șcڱ~֭[1 ^|}Os9VVV1LH<yӧO B×.]^z7`ƺn:H?d2y̜9 i4C!ل P[[KNN\)S YO)z"La?~ Y #::$бŋĀ l۶x<3B]q]]ݑ#GB[[[@Q>;wܵk|ƠkR0(QBkʔ) Phjj ݺdɒh8p3w\]8z(222˖-CP[Qeˑ͛79s }||<<<drss3)PN<ð1c@ ggT駟ի_cx`w؁M>݃t \]]MMM.\#XqΞ=:d2�0LUṴaø\nt<!CHIIwSSӼ<PKƌ3uTd%,,,  ^t)ؾ}7 'HL:A6D"m߾/W\Y~N4xಲ2Wcooo76669sf֭d2+p/ \==j8HЈTQQaXG$ ]]]XbMIeeeڲ4b-[ >aÆX,0 L&аb 0�RNA6bY[[IRY,֤I0�TX,֜9s40 ٳg j?P(***LébXC*.KuttH$Rss3Ś2e  Z`X!C3L6 �v Y,9s0 cZZZ,kРAPUUeX,kܸqNtׯ9Ol 4>|xnn Qii)244~CCCsssUTTA;|ԨQЭW :u*MLLjjjH$rss!CJKK#X,HijjbYXXwCwv,++kff6c---KKK ZjDDŃ211)))aX ݪ jee bM0f---  j?pQ P]] UJJ 2d2Y8+((X,k` blDboҐFȄ8 Kcǎ*--Igrrr0RVVVd29++ GP8>PTTIrBnه H$+1}tBZYYHKKBJJŋFFF#FϗQPP~[[ۻwedd[h.*))׏X,&MMM`"z{t:=??_AA\8233k�+//A$XXX0 +a)X,nhhhuuummm={jkk魭b8111>>^ CB±C C@ 0J HCBr$@ $J8}L&K@�0ii$a3]CL`QԾ)|Ʉ qh>TIO]N]]]ddd_rB}f/0.'5RЗ>%@njCKKKlllg?"޿,l6= _/)).H~8d2y<zL?tz^^D#*Ǐ}S"Hd2/iiw �Ԥɞ c:'x".F7DKk/^PVVKkUUUd2 <FRL cJ%fTz_X-h*H ?*q9p!44ϑ !ΝAB!cCP'(B8ߡ$z5kK=zm'NU@l޼ fͲ+6r\RP'Pxƍ-'!N Ê@! ߸q#y@rP]] ?ßKII¿듆MiU{*2x1˗/C!mP귀%K@! ikk8-BCC sN;#`֭PHutto p@Yp!qPP\v ÿ[ɀ3gjx }8G%` AXj0lvvv@51yd;;Ύ$zã}yPPs[!֭[GGm_XXX/(_deeZ7cǎavݫW.\WJJ ϟ?OPs̝;#A^WWP\\ 7yWll066ٳڵk ~ǎ �vg(//;w.FO< ?~{I2 W 2v͛73=<<99k,Xlggd˗x ?~~-(((;; n޼مQ[|7orss`ggwQ8k֬ozxx=7oܞ֭[we Î?NO.\@PFq֭[}||wd2A4**fٲeo߾]rsRSS/^)))&=))ٸq#8q"b7$$$A'O|}}7lpC[dwݿټy%K.\19sIKKO4 0suuy.>}Z$/]DPƏuV2رcǡCgϞ]]]7B!HRBU}}=DB oȀ߸qc޼yG}vYYYUUU644EDD`VRRpf<_{MMM~0ıcǤM(_|ʦMk.)))@R<HR|iӠe˖566h ٹs'B u+LnOհyϟMoO?ZZZcxܭ[>|빜%'':Ǐ|>O޽ FFFPΙ3gݺu  %jjjj. �| L+++Y,666vII㡰'Y}~~~yyyĀ:y99BOOAMÔcdd h�MHcc͛7@r޾}3---Lsss/BM jG```VV^ }nٲEII l\II ̻A}ea) 6BaNN˗/{2@ׯ_tRMׯ Z[[KJJ)MMMVw64,^zʆ vӃfش  ^PTG�@qq#ܶ V^^^=?^�R. aaaP L:?GiC ]$_vv6a)p277uf]Od2o//吝=p@P%<W[[&7o$\?***444 (MiӦznO㋷w9L&Aw"---(PBBD^^\K.?~KF322IyM4 81#GM6/K,yU@@@pӦM344$04tPB3]T޶mÇ[ljD6wÇmdx!ݻs΅FBBѣGᵍ۱cٳ ZqǏE]F7Rx\.Q__? � ޾%p8FslHN566ݻ#|;?3""@n B?vkkk~)(rrڪ7n<v4† >FoFyyy*߿pz={544x~իWއ*hPFu@aHHH6GrrrBB jrrrbb"7nnn6l�)S'}UUU- _nć xbKOL=Shhhxxsz{TPP@ Յ&$$$''K[f L#?~loooffP_s_~n@Xs߿.-Yy{+++b1$~lӦMcǎ ?rl]~ٻU{qvvS{l6;==i&h++gϞAAyܹxhllZxҤIIIIG!`׮]7o֗g ŋ]Ǐw^^<ˉ\t6[60G+//h4yEod2̙\/_Y޲e 3w;]뇼RF 6778ɱcƍG>~UjjjAÊ7oTTTx-%%�% no߾ӂuAEy@e#""D"P(nZ2<h by={z�UhUޯ@` \.^۷aظqfi4b^n|Z{[iӦ:$}uY} ۧ6o޼O=K& KdBPFFfҥ0͙q,bqcdRcJ[l3g!궇't;w۷x<YYYh>߻{ߜ={Ȩ%J699I\ΧfΜ9o I$ۼys``,aI ,Z>[MLLu`�B?Etvrhiiz*a!`Xk׮_rѣ s,>yL&C@qgdzUEJJ} S>99Q1[/:!x<̀Ǐ=Ԯ=}=ɓ'QjOgOph(,'eBBBo=E"<٤ .;i$íƄ^* -gׯ_geeeee$$$< ~rLsxyy>}3^F Ҳ'O sQQ͛WZՅHIcc# ArF>|�; &K?~x1aBGss3L I:˗N@s8[s舾e˖u6KM_x T;trӺ #a,(9saNNN))) CP(L&%%%{[[[np #v666Pݻ?ð[VWWC!} !Ia ɓ';::}ଌݛWLB???P{왵5QSS{-DբgWXKBatt'0 [l*ʮ^'U߾}pF)d<tP`` LV\IRQt:߭$H3f@WiiiVVVGKK ())o6l�cǎ]lui˗/mmmP__B;W\K{>3guڵmmmPhhhΝ BZ`&%%ĨJ٘=L?PK͛7= %gΜ'V^^>..~|r@1޽{e .D`0xH3~l6=g&L@ FC^xW]]]ꄖ533p8@aa133ͅƦP(~5vBm„ =>7/DM&arac=[)NHH}HHu;%mH  $@ :X3jf@L35g_ꣾZ#qFѩFzg*( bqQKK ϗ35jkk >S#XjaX}}=3jjj^Q[[[zՀP(uo[G)C# >ߗ>%cơ%""d osWVV644.G^^e͜9SBCXSb而SJ2:6 $@ ~Htx߿jTVVEEE@dhhA�3CP()))((%%ܢpcWUUd JKKyssskjjS{HTTTdjjJ>~arklNNl 4QXZ[[ḯ4xJRTT$h{D"w[W^iIR ðW^UUUx9---uuuBe �LυB!D>|xgß%TVVc=Avv6"-- X_|,,V={]�� �IDAT==wa 1 2DTq?+++|B dddXZZv[J>\A-l``XaTY<[kkkNNRl,NjjjWqq1Ȩ3vTKKvKJJЪ0@MM.әsp"ɟaxH$P(폞444L<QWWG[zB YYY> %Z)##C+]N]]]zz˗/u9r .]3g3Z 8L2rHdz.\ Dr:::iuuuPPXYY-ZHOOի)))9888;; /_޹s3gϞ]|qܐN<x%KfH>G6mZffӧbvpp`2G#1jԨ6UVV^ny<^XXr,] ╕<x Ol}}Uܹ\rBBo3-[X[[777GFF^xLի 2RnnngΜQSS;vX[[gdd>}ҥK'M`09I$ȑ#<x�"***k׮<xpQQѷ:l08~cǎ֭[ǎ~_[[RWWf¸\۷,,,,Y_VVvڵObfggꪪsN6fœfݺu& lX>޹sJ۷˗/miӜ233Ϟ= K,<y2LII9rD=Z $&&VWW߿QxpP366^tQEE͛7`<qD||<c%)))|>޼yyyy AZZ|MMMyyyHϚ5 t /^I̙3gΜٯ_W^xM6]z$ooﶶ6 N8吘% i4ڶmۀl;wjW\ibbRUU�nnn:::EEEW\N:uٳȨݶmȅ͛&hVy% ôOq.ח?ȇ ؼyp.YD]] qzB pܤ$(۽{[<yK(<s F`GsuuEҩ.\ 5!%axŋ7^wdҥw}X`ܹs۶m)9rРA~~~󏬬X,VSS{}]]ݖ-[@);;{͚5>|mqq1<.00ԩSyfRRRڦׯ_/,,į0 ={vEE0Iؼ~ӧOwIH:u7W[ Â6l�kPkkk ]]݅ DVyyymm;Y3226m iUUUPPPiBCC;"&&8~p)uuu0NIIG_`߿xÇ;::"( 6=x ,7eeeE"QtttOrrrN<YVVgy>|8¬XXvڵaÆ1cƀ077744<---<w@Aٳwޭܺx .p\ uSS… !G__ߺ:B;kgϚ.**ׯ_```vv6,}vx/9sD9k… =uWOJJѹx񢆆\8 h s׵o߾=z(.ڵ 122 |!~ iii#iFaX,tkMJJ9;wܻw/! !8N```ff&9ᨪ»u}ĉ'vcZ޾VUUUWWYXXXKKK^^^V$PjYYYP8x`LLLxGʷ M[BB̾;S*((zj2ڒ[XX(##Ӆ>zy̘10C˗/OOOo/NǏ燗hChHy3** ƒl``۷o^EUee%v6)wJOʁiiirNaW^/Z �l*|RB[C>k/�⁞IOƏ#w}}YT)S& C(Fr7nPQQs SLXUA!aSr<hhhhiiߟbYHdȑ_]o`` :>vXx2‡z ---uQQ711?puuyX,=QHa0[ `nnNNN,FEEC!::F!))1c@evb ٘1cF`` L m(իѣGz 镞1x`MBx dXX؇O.ݻӦMVݻW\v($$D$nEET'77h e=[\\<k֬4D5uu~m [痔999u{7%%%AAA/_422rrrB;3&M?mڴUTTˡC"""i0 a N4fLUUՄ ` \˗=z-kkkH.//fCg V#n///^(j)%%Y xZZڳgϠ/^ ^xوm۶y{{!Lw9XcXԫ|oٲHSl2B`ߏ7%zyyoٲe {TzԨQ222'NذaCSS)A!55睙t$;ommcZ{޲˗/E"-......qqq/^jՙ3g`t\;88DEEAT  >4vwP0c_KZ]%hJSmQJ˕ %DDe>f,3f}^uF6ss<y<x˗/ |>|.((�cccb׬Y%&&[gRݣm֭BĉQ˗CBB|G500~dd$ ~-F 8{{\\\~}s9SQQ?|?~<m4B'mnnNHH af``�---aCu֯0'ج#$b"ݻ7|<([YI񾯸˗߼y3##CTT4'''}Pg&?>zhnJp%PY8VZ7?//܆<O0g1 C Ǐ7mt̙7oXOKK{̙3藻w^ll3g t.LMM=*ҟ߿oah[^^  pΝoazW_ UPar;O۷o'*OOO)***//TXP(zzzBvϟTkTTAxˌ3N6 79Æ J2\SSMׯ333 &',,lذas9ɹ}mmm>ty I\t677=eee?~$<}LNllxxxM5QGGZ\BE=gϞBrss |a)NFFF 19݄sfff3bĈ t 4SLχ!Cp} h4ҥK^|aˡ2AAA 0X@e2ˢ|:N2W\qpp~G2d񓖖ݻzzzxLiiinn.&&&rrr r|=xlaʣG1L###%B!L݁-y<&ə4ӧO&&&Ç///|>L '-Κ5 V׮]ʮ[GfQNNNNrrXbwޅY bl۷LN߸qo�---qqqu̘1PAyyy땕pF5~x-]ӧ[|9BA} /_ܿ7"!!LMM bff +d;;5"a:::ƍ/_D%H6mڧOC%d|T*T>!CA)))cƌ:ujaa!\P(Tڵk{f*\vI$#FX򭭭#lpZN<ÇPπ۷񣵽ݻ1aqssZ~~&ͮ� .+))_TTTTjJJ :u*D 6Rؖ/_g^RWW<y7o Jx߾}4s̈!JUZZzϟ?g00 8PVV611`;L&3++`,\ꨧe쀸xrrѣw9/%%~%$$0ѣG/Zðvḏٚcfee2[`QQQ NTĉ### 4UUU СC { 6JXq񟛛K`&jkk8q"J311>섘"III]]gϞ1UUUURR2j(|N2&ͺtRhqedd1۷C΁ӧOL&S?y` 1J.+%%eʔhee%:uy0fW644|E]]|^8 1OK{%%zzz:;w.,h􊋋?~`0 Ї]]]I|>ta2pN<Wf0|;6;;`888ֹ ~҂|> miiA79rEDD޽{`0O˗#F1+W 9fX`EEEd`'4M^^0Zsrr\t:VX߸?*X,TV|πXZZڰaf͚æv nmm}ɓeee_|`0 wРAo߾e0&MBvÇ cR 0^Ǝhjjiiŋp.;rhA`,""L&Ba0;r8*f|7oTAKqS-Ч nܧ ڇ>}-grЇ>=d2a ?Xi&80P(FF"""i(q8+'/^CJf=nrL&6x^saXSSSVVwGee%B^Fͽi(^69ttt$''A_uuu|>MBB{(]?r$$$H$ҷP(iCP{ ZDD2^S#$--&Q19bbbT*GM?vWYrrrqqqCMkjjj)bL&kL&"{ ++[mmVVV3nܧ ڇ>}-dVVֳgYAAA-Y1^~lB wssÓo^tIBBB⫝̸+)) QF9;;Cׯ!vΜ9($$tlmmQӧA&O---J۷oAf̙!((6oތ=?ԙǎ۷#:K ;v0l4++ R ɓ'ȻlٲPݻw$ʵk|iii a 0|p`ll,gsҥ1Pf#  6m*""�F]];fdd�9)S6nnzر+V8Zڵkr*/qssd Ì!x9 2%ϟ?a JܳgH=^p;;;!WN^^(#::vժUƍϞ=0etzzz;۲e 0Bz<ן8q+x]RRi-""D"A,.6o|ϑ|֭[H� y111v(ѣyyyYlmmzx6p8?~n<fhj088u6n?ߏ#Gؠr4pSBYY #F 9SPPpzd/^~ &==K, `0Px]2YnX^^^p*///gg7oDFFBavv[VZZVVd2yڴiN3g8::vN߾}{KK -z=O^^^`` 5{S__W#""@ ĸ<xpO>uww "ZZZo]]]=<<ҥKO>MIITDPӧO0kkUV^P#WWW=kjj;v򁁁MMM'7n}9rȑϛ7Jx<` innvvvmhh�@(• 6|zyy%%%ቇA\666x:~ax Nwwwwss{ݻw0??? ƦJFgϟR˗/o޼YGGy˽e˖K.]pkkmIqqqx2`d>|H&'M9p@:~۠Af͚tkk렠 egg.(_{gggBⶸvڳg222,lٲDj޽***:{ WaRFdB}CCCd#G455az_dFEEYnY~=P\\ /_^^~̙;w1͛7t:ѣGd2.8vXfffbb"^&ӧ ߂ǏV&hQA@> 3l0(}6A0CCC;g``p6Ju꺺:sQQ@:R؀MЭ222vvv%%%/ WUU!"}@nn&\ 3frL`fbb믿1;;G pÚ`/))BR%K6 0*** � @Ab vBB QSS#5eggfUUU۷oMLL`<xðϟ{yy*(PDX@v}}}ii)0444>>;tΜ9ƍ#̭111C؉NARRct:jV===M̙3 �Eت~zÆ ')) &ԇ>, :::vvvI&>&<<P)))HsժU&MBk5 [@SSSB<|0## :u mooǷQgg'+,,$tA}N+;;[OOyRR777XYYYj{OѾ m0977XTTy`\;qDԬ݃f`ff6i$A-SS.UAmlly�$Lƛ9s477|ʔ)]c bӦM-/_\^^S]ի<غu7,KHHdeeMΤI*++cƌ!,mmm�� �IDAT… LNNNyyy>>>(.n0M@B6mZMM땔Μ9w幻O>ð ܾ}bhh(\ +!ݻ@l,..?_ģG\~ܹ={| zUUƍ555w t9o3rXXFsuuxԩs"ӭ[^~ >JѣGW^?' HII WvQVVVVV^z{{?^b( DEEMLL lhh(//7112w56lذaB%))Z)))XQLNLL hǙ3g^||]\EOTTVЬ/^|�4"^ZTTD"EDD%%%䄄pOVWWۘׯ_4 kap߸qCRR.[͍dZYYM[[]jw~srrQQQ|aaa02w޽tR77Ǐܼy_-\$`ZSSwypfff:uj)))L&Vmkk;{, ܹsL77ntuuOHwNjkkwZ]]}:889g~ljj WZZz P0`kJJMV\&z ˗Ϟ=___vvv...7oޔ8y$=tӴp9111KK~ ݻXPt48t:;::Μ9#pbh{\ٳg;ݾ}[DDD1үSSS<|UPPbڞ7o޸q޽C^q-|E`ALs4Sv111I5gddtvv?U;wիnܸAnE,//oH PZZ W\F;wΝ;!S -|VM4);;r}!CS!<199yĉX{ ǀPull,jVsse˖ҥK݄ȑ#333v.\s ߏ? X;Q?~fGh5yf Ԭ BGw;�=zdBݻTjFFmSNTT_;;; 9{޽{yqbbMh蘚]<r7]BQQϙ,,,-[<5jo޼o:544444]٩ǀ&�>}puugork׮=|0HVQQ^8asttt:`AAAxafC\Tl9P(oDaK?$�oAD�!00墠 CGcU.\WZżnss={L8Q]ŊIwwwWWWuւRr˖-|kV/_ίKc~w<y$==J.^-  "۷رc?uF&f zԨQ= ˃0Bgg'hlly .1p/COĞ|?UUU##PWWL ={fgg'!!¥H$D\QQASS3lvyy^ɱdXĹrJKpvv={ qcƌ ݰa:iii:t H={vss3.ZΝ;[nSӧO899avoΎ1cFSS|ܹ?x 68::<y:::BݥKv'ϟEH$PPPиy&aǏӧCӪU]VVV(n۷cǎ222Ev Q ŋQQQYWX3fuvv+Wܹη.\�/^X,DjjjwkҤIP8cƌ9\bd.\˗***gΜ1B] 7l�fO' [~=̧k[EEEZxyyA !a AYccc09G"@\\KKKf׏D"}S4Xgf0M.\f___tqq{?/Wxմi /'66ð*{{#F8::ˏ?Y,Xj;w<}4ڵ  ,`2d29)) V+V\xy æNOQD[GGoY,, &VH _Dmm-h4Xe5LFSWWaJE6pJII!?�? jhh�+!hp8v$%%a2L5GFSRRB^j8:B(r vtt444feddH DNׯ~yD"!?Igg'xWmoookkvY𤋮!LSD;jjjx<z"ϧЗPM) jYf0Nkdeek뇞Ham0χX|&m, a�~@_BGfEjRSSii456#8Za~w3/F5/f`FLL ͇V섟"z:999H<Fp/rCRRRs x3.]B,l6YYY1 Y }T*JDDD+(&&&XGyG𞢢B<a{7[@ fyJketjw$B]d뒇_pefUeT*U$%%ɂ?ײ0YњˁDZև>}!>}CAs{_jo�ǥLQ=Ƚ{Y(Jo;A3IKK& $%%T359/^5_D"uvvBV M:pHЛ2TɁ6*..Q2>EEEX <bw!bw|Z!bqD[Ї>;::L&>pdB( 655A(Kr4,""A{29P`_kk+SHKKf3zȥ� 09p8F^ rGIkZWW@�&**ZUUϥ�+. (򵽽%$$P7Ȳ]RS~~ d>/J [gXQЯ_?)\3D*KPvtt@@RRrrr :;;AW}d oii `|Bd2\.>J}akWVV*++mz} }/FHr~fԗA.+mݩg�D"!=|e!gE\\͇hVB|UCmm|XQQAh�pOĈDCT˗/?y$$:::.Y^QQaoomﯧG&/^ xl6իW?zhЪbXaaa S`;v(**666?6o޼rJiiiDQYYٳ/:;;;󽼼8Gkk{@jΜ9xs[__)>ٹsԁ *ell,..sJMLLr߿FwuuuȣGbfhh榤`0?f^6mnn슋---!}5((HMM$$$�}ȑ#o|l~KKˍ7 Qٲe6mz*W\7o^UU#0oz{{>byA#Zn&9gΜ}VWWٝ8q堕h EB�Ь۶m0lNRVVNJJBʶ---W^A 777 :~!h#G̚5KLL uuudrAAШ+((\~)xviljkkCBBL&REkhh8}4رRJJ9++ ðӧOO:Brӧ4222c/^S :u/AŪU6l ''WWWw {Yp`r <(//lǫ�dS^^Ç .�{aO>ݺu+@֠ >yކUUU;w"('ZB !d<Aqq+}֭[xZH6 7ݝF1[n-[;fdd ~!`X[[_px48q"A۬-G&'??, D�@({ĉk׮ڵ f<==1 [viϞ=>>>~ک@r߽{w1:_wٶm[hh7oJJJܹs 2dnݺUVVvHOt޽qԬZC 7?y$ pih[[[ bGGG%~r!5kּ|2%%ƍPxΝC]pӧ$ =e˖-''i<yrUU0I斖=6mt=/^X,{n''' :~8zxx8;;%I`Fظqcdd4<xpeeess;033:::zĉPrΝА$$$h͛s<h4Ҭb׮]𠤤7FFFP|-qF-ˡM,X@&LbŊ�0lZZZҶp9sz;rHSSҥKQappѣ%Xx-[D۴iuttjkk; zT4ݻK.UUUA˗<xf͚Ǐ5kA[d2MMMA﫢a{7o<A g؛:OǏwׯ_s AF0 Ѧ9u|ƨ(GGǠfeeAa``;w֯_7n xx&@AA ӚTӧhC&GOO/11˗>(&& 3('CIYZZZaISS300Ǐ155555mhh<,a\UUUWW'?zhwUTT rrrP6]vC-yy켼Jœ�DC[SSC&dX E$H,;VWWC& p}u:;;AMQQ1""*[^^ $dn)Ç/ N4hlgA߾F .@1 7o޼y^@KK!Y[/edd=zR!} Vͻl]LF}ICC#11155t{OpTTTUuuu!/ǒWVVΞ=f-[lٲE?xgA)k׮ JY055^UUuD񲲲۽;wjkk tԩiӦuݻtR<O~~Puuu 'O󆠪;]K->z¿O< |Nٹs cMq@@!CVX8y$tzIII!DVVpr̙ݻw㽎бΝ; o>IHw8pH?ܘZZZF&  8֋/^j\?7nr >>>6ŋԯ͎ ;DѠ:N ={s �V9u#"""geed99aÆa3z[nݿƌ֭ 忊^ΣGʀĉ7o=.aXfeeUTTو#cbbۇիW͛7o޼u˗YoϞ=ÇЉ B3]BBB\\T… xڦM.^4x_ ömvI4CH}ٛ7o~cۛ7o:̌X_YZZZZZzyyݼysP/;iҤ#F*?z9֠dРAљ[lOaׯ]9:uc6tϩ^s5ee'OxKK X><336jp$#8444;H>ի/|?cbb ˗aaa`o`3mooֽ)q%$$L2%::#$$NF}̘1]XKcK~r+WJYYy٧O޵kO||۷o=N~YL:5::ٳp+#55ndC˻z3?]/ݻw#F@5''gܸq@}}=9r*�a0rrr&Lٛ7o&L!p8޽C%BPQQBϞUUU,X"@e٩ݩ,ϟ?GIǫ±|RR'())u'P˗W\f{ӧ@CC :;;޽ <cƌ߻wӧPdɒu ۷3227F+Baa`hrrU`BB™3gg,Ν www x&gp JX! v W^=}�v4 !qߟ/!!!8 SRRwO_o޼ Xn]vvvw=~Yff&'_yyy4~-~A"*!okkKKK2e ;wp8BS/^ܝ<UVwW_ UU9s|2;v܆EEEhsUoG_˗))):::̚5k233to0 344 xK.L?09jjjH G,NJJ:taJJ <sdddF 7:+++ `5tВ(TPP@Ǐ;88|nMh4p񃑀B>ۺ:rh4?xC&&&111bbb|>ܹQԩS`ޯ_?MMM(dӧO#>kuΝcN)))}}} Ш<xpQQ\hsձc;Irss!bܸqy555}JxSL666"%߃3gǃfΘSSSZ)UҮ\n /)%%g<P8tPN> FFF0x<F_[lt}}}ee'՘1cJvtt6mZMMMpp0pAhK]]~I&#͘QQQSSS!?PVVVRR۶BA~~֨Qઊ <ɓ'ٰ0ar=}<?=r6{쨨([϶3fɍ1^1***Pp~Fa0Q?µ~0`1ǃ)cdmmabcc@mr�� �IDAT?o>:w*DXH899Q <w<EfϞ i˖- ǭ[^ AG~5n8 clllee}09k֬q< j=.\غu+$Hׯ_zI8\UUU#F]ҀP!C޼yO0lʕ_49fOOׯ__n¹aذa '99Y__ؘyjV~'Fc`upphmmC999OOO8RSSChl׮_{ǎp�1{5550`HCGGi/^;YlÅ p޽;tqq0.X�Qhr } ÀA5..vhO bllV]]}ڴiÇĉ!ԔA~ł ` uVyJJJ`A_x<0f͂clXv[l`{ϟAz`{?6lث>ydƌ۶m? |>tI##.-Z/=#++ ,_/qXDZ['q(U>>}C}CzAm&J5m!RL^TTNADDDzM@wMo(,GP~HDDD?䴷w'7Mf---EEET*O7 6&`f&oR!(ڵr(�BL`Y,$]˅H^p8F$D"x49V׬u ]"HH7Jߟkr$%%-ׄ\jj~oX:th_/ X5C ">~؛&YYٜѣG>U>}w|!0!!OSZ3gDto߾0lժU@_pyDjay<cJKKNF?6l<4-- dL xBe˖AZ�ĺoޫ߿i&Ts'NDI<�z+V Wcm6Sl"ׯ_GraTD1͛fff_;s (HO jjj@NCCɍaXJJ j֬Y&ج~~~xݻwCѣGd22Ǐpfffnn.h^:w\<U}QBTHmmٳg1 SSSC\BNJx)SHN<ioo9\, C%>| a˗/G oݺ;v $5aǏ!WOO1 {5dț|p ?l+=wr?~T_`hhT+>x{{Y>|f\T*#g鈻5+ajpҥE \&@uu5H 2D8唔8998p�j`sMMMMM͔"(((pbHH� WAA) Mgg'̹>B~hH�/_>sL7띜\]]w>|j~ؕ+WۡxeWWWb\\\n޼~G\@$G}Zx{{;99y{{OURR^UWWwy(loo`{PU&40 SVVF?s<4MSSS]]EDD޽‡B_ӧၺٳpf4fDPNNNN*++C9uꔓӹsRʨNᓒtфɁ;?X,(Fwww FBmkk xB |bcc0)) DË0,,Kq'''0�:_&&&B㈋*ٳQ>t3UUU`jjj*++LNEEիWݻwqCѣGY<xR\r̙3IIpjB>>>,@w9zzz mnn݉'MLL޼y3lذ ðkזM˖-#zJ+N711quuUPPY>}۷o͛7n88 3gJ|rgg)T^EE^8y"ikk[\\4b/Ruqq6l:=ӫ%H$|:j(v{ɤIfΜ) 1%x_xS^BBG9r$ aРA#F�樿dԨQhrnܸ ^p1 [uu7( USSM B!=ܾ}/^iiiyl΀I޾ӧOЬhvFq\X"()) ,b<C@ aÆѣG?y jcc3`Ç/X�B`h4gGGGxx8znܸqǎ`Izʕ999L&3fx> 5k֔ 2>Q ^ii)ayMExh=a.!! ̔U >}' V]]]bb"=***((ƦbVV椤$7nA')..3B9ajBhnnyaBZǛ%%%kkk*iI8 Cfɓf6}v*J̸qJKKqO>{Cddd+?ǏA!%ҥK>|W˫hP9$$$33Y[[w9~ #NPΝNu X 䂂ƎK`zx\]]!cNkd񣥥e8yK`ٰF_ׯ=ENN�׮]344D>t111644444QO VGG~qt:uuu#m۶k;jժG'<y2�J0� ///ujjׯ[1alƍ؉<yd``oz2{9s,YW{7 'DŠÇ_,VIAAAQQ>B*C!d2y֬Y^Bs>}w۪g̙]ښxbIII^^~.ϗiiit:N8h"mmm///k׮cǎ}O znŋf"Hl6;..a(h`u`#%%Z[[H ..nڴi GGGC:~Ey⅃lիɓ'} ^Ȯ-==ڨݻwMLIIyYJKKoݺ.D7o&]]]4EDPPPcc%jlbdd̏ jffr! !ݻ:AAtvv aW0a8$0 +.. 矈 8,,L&=kŊ".._~foŋ-[v}hd33_w鉜1x 8^ij.QTTbaaaaa ~nj?<{ G ^!;;r:+))_IOOIJ baa!<bs'˧fddJ$ihho߾e2;w400X̙3` D7q,,,***Pe1 {AÇ,,,,Y?&aXIIIM377 "88HJJ"##Q"y.C\zzǏ322Ϳ Y8** ;RH-,,ͅ띤>QIIIuu'xI<8ΣGVEE")))t<3f ZZZZ]]} %%%hABjoSرcǔ)S,,,`rI855A]7yǎx PQHMM-..wnnj={ʔ)b83xEqq1A;***ߠY%߿_^^aXuuumm˗Q8M>c迟>}s,)$$$  ߌ7n-]ӦMΝ;/5ECL>SRRlk׮ihh&Y,gYYَ;@MMM-bïϟ@Tgga/++ ]HNN۷555$$$Br1 <т-_wN i4Jܽ{7`VZZjnneǝ={vϤ^|`vtQ^^#`߾}ׯ9r=9tK$''wI?|I]x1 `\i4ze;;;mmmY<//OUU; Xww/!4СC2ݧjB:ZpuժU?6?A@@@Z45***3gs6776mnذ Ak߾}k֬9r;P؝;wRRRqaXKKKaa!~)jhhHi6aGeeetˏ7ɓ  xV~:\]x1}||;a؞={ o$2 r)eee\.p=;U̠Ao>x` ^rvv3gNSSjV0u7nvjVtR믿:::H$ HOO8q"Z; V[B2,Z[[n޼IUUU]&MTYYuÆ F%$$vԩS9r۽{7J/[z5$LjDDDHKK?ӿPUUс#Fo߾ ӧO͛7즽D]bڴih?6bbbK.ݴizń ))I&Aڭ[֬YpDDDBCC{l: ]|9˥P(Cܮ\~zxymmmٝ9sf}}=}}}1 [h3zx6m8}t#Gﯬ~;|A`Ct: 4MŵbvaSff&V}}}X ( ]imm-))!,6!JFT0T*|HW ?~0lہc JJJ`G2rssA<XWWprTWWO<Jh:t(>Z!990QQQd0LFFƆ0]6kQSS#|T.K"Pelvnnn MMMS7{8?~<DrPvXnKKKXXXa h4 >ddd1E4!f6:с\YY>?p iԨQ񟞞y/p aKBBv )**uOMMMii)a***Ȭ Ϲnjz6UZZL&CxfeeikkPiNd2<%޽{DDDYF+O<kkk!\YYV;>dړ H䨫 fÇ Dp%TAKS-Ч nܧ ڇ>}-grЇ>=DDD!�^ *%%k j$..jDPzPjmm%ɽF0'HKK@_IJJf"H?JMɩM?|Q l6Dy�mri(^69&%:7`'vɑGY/�~~~ .5JJJǣFR@LLd2{�~-hMMM^^P3L~o- 3gN |⅚w [ Q#..N&)Ji&qqqQQQ2kjDPTjoDjԛ b^_@Ї>YlvTT0]rFn0޽ ݻץIp8#GDV.$\<֭[KWWWCAa`` <sʕP.Z`ZZYㅇ}\.޹s|rigذa4m( ~fddj3(ܸq#Hnp\(<}4?,͞0af8F 6 =(33h"EݩS�utt? GߙfϜ9Opttth4ڠA|>v̙<ӧPiӦ.AD333FOՅ[w|~NN\?><=F)))ݻ* W\A\v-AGp8PbL&!.@,/8r w EO777tt6JQLMM1 KHHׯ*3?? .o%<܀emmmBIJJ3%߿I'''%%%t(:;;̠$// {�l6{ 6HhPoll,^?{>|N%Oр?a옘*űlTz>/onnLNjjڵkAAA555555HUWW #""[[[OϵԄ߿x} ѣGIIIKUUUTTTd;Yv-۷?!~ZZZɓ}F0C@ %O<޼ M}}9sg0,111 � g͚~~~5aɒ%ZZZx= Ԫjjj!wӧO7n{ݻWP\t @5 pf--- ޽{WSSSVVuuu ,)>>Uؘ9jiiرc_x"@B_1_xQLL  ΙC)S GKK J={&<9ݻZZZǏ 7+Wܵk:88�]”)SQCJJJ ӧB(ܰa*@IHHh0m4---,@R?~"WatR,ԩS*Ů\JO`}˃O6LnYYY>hii520 \xU999;@A;aee%8Z1 cX^~׮]J%%% n,ڸqmbbb"""'3f /& ˇZVVX\p… ;::X,ǃ(F .**ʹeeeYYYH:>(J jJJJr\JR fff0BUcc#B(b`````pZZZ87 0'+((466?PYYVAޘ +PY$++ b'Xx3 < ȓL&KKKã[[[ $$ÇO0l֭q|ÜrDpٲe˖-z*~'v<, N}>`n h g ൷C cX�xf vYYYjj*aMd�� �IDATXaXpUZZ439rK+ꖕ.޾|Q{{;χo"7k�uuu?| DQI^"=I=jnn^r ם,^XMMmԩSN666_zyyyByEye>H)A0 M. X&Ɩ.fMFD7v`%I (M &10[$*Ez" 30<?" * <[{9srM} .DFFr\rʕ"]>nܸE76_fMcc#5::0@ Vqqq(|ܾ};22?@0p\.lׯ_G/hѢDPW(8w׮][[[#AlllLL̵k0 IMME&''cHgϞMHH@6Ig{E?}嗆>JF&HWWWÌ=oDFF>} PܰgC,o۶m̙OˋD"QTT7|٫tz]]:aѣGQ TĎ;"##_}վ3177;_ɼ{.zݻQA=GA?^Roɓ'0 koo\.OKKt(UZ[[Q1'LwϷqڄ/WEJtӧO1Ӊ d�H{{SSSE A7|b,XfF?)[*$ }||%O<<<Я999|͝;w?En){+**bbbPzd6mڴiӐVWTTdee=QTd?�pINNAM|뭷еw^xq?\(ꛩ"!SLDXeժU?2|…nuUTT444<1hqNNNEE̙3]PPڨGC? <yn'beeU_:SNEiPQQV ۷ܹs7oxjm]J"DFFV3f?P!@<ˍ7CĊ+>nj\``T*=yR'2޿ *[p}hhmm]`ANNN^njs!ԫ7lЇDA[z;G[{up[6ltuuuZںR\.ȕ ,@y666كZF'nR(Bq ՠr…?c۶muuuJR(a 챰)ĉLV;*A\o#>A}OVh4ZrϠjwvv~gOL8:[<H$h46o|a%%%ݻw}̙g3HRL֛jC1 {ч~{n0#D?H$>Fӏ?|>A{{{^}-Tߛ\*zTp2eJocwww@ XjյkbqլywҾ&Õ3f>q?tjhh4CfUB>:;;u:LzN? 5֭[7HbT*EQM mo٧۰XYY<)>3ggn2/ӻ/,,ܿs OuuuhPY^tȗ_~5o]|7Ǿ}ƍ&RzV\x5VUU /^,++c\xzz" a8/_V[ZZ D"_ѹ}Rct"֖`^lBX,49::*ҥKHތ7/Hb,,,Йj"433C+с=%!w tB/9+J+:]{%%%~$Ԕ 3FRе5 (KJJL&?D"r43 777 .D.Å>LP y3zh}qˑ[JCR===ѵ=BF ;;;}?Ofx__궶6TX ôZmeeNwwwGOikkӧssskM=zd0(P(DѲwCC }n+-HkkSrsscXcƌiooG]]]{hP(%{{{tP$!?I[[ۇ$iԨQ9;;d2tںs2X{תRrQ=z\.?TpX[[_E544 p_ZZJRU*JAVX} l6%'D;Cǫƶm$oӣܠ0<AXZZO̞=[ծ_ðKҚ5k>n߾|SRR~m>_]BÜ ܰccc{7Pwyرcue׮][nEQԎ9=pZٳ׬Y:nҥV:z(u˖-enyHϞ=;|DB"++tg&AAA+V@7ݼy3*NC/_R>QOW^>}:A;yϞ=+WD'ƍh _?y۶m3s8Cyd2 iiiK,0yG7z[ gdd,^y!|Rt'';Ht.]ߢYjZPپ}|) 8:'/_\x'T˗/#?:,pqq駟rssѿ۷o޷o\LII1ܕ7]ZXX|h yg$&&L<ovڃIII(ojnnM2333Zcbb믿aXvv6Xx|p!G}|||| #:u MBBB>PȥK^}UFd2ssWW޽{ohnnn8mooG%B)!!!11/D7nŌރAqLk׮u׮]=nν{ju>z EۈR  Eۈ�R=`t:IWWם;w ���3^.,,qD���,P BD7 o{HFa JM3! bd%B1}t:#SQB!%%%Ah/hb@DKK1ea|># @`0㵷+ c*RqڌIJҎBA *rT*UccW񷵵uuuMD"F4D*ӧ8F688<P94|ۯjD"se_8F7^P("""Iˡh}lq-C~x<m0 &hÍI)..f24d\]]Y,qA0L777}^x<c*RP1@#x(ˀ1JGˑVfz\-TFy<<P���RAФ0k3?"yTWWC���zf@6bT*UYYY?c^'ZbT*U2�8( q, e�GrLLLP֓ Jmmm%ٙL&�04x{{\� rNR}z^DaC Ç Y]�7779�( `0PtΡEz CPPjNjqj��DPx Ga"qa��`i9$dA<' AVt l��� AL&Bj!xz9A8��Z  rd2Y,VXX9���/jNNN(`6fRecc���  K[@@j9(Z655d>���{W<*R$eee=ژb���zd2۷5  f5dcccmmye777��`(qZECK=_===}||���F.8_rE))SP(kkA}SD`2L&ܜf/  ��`dA/BL&1cLFQkyy9:XTTTUU )�*�H4g2lii9dA H$N & c,�C DJHH@YמxF,cnn/J CL&C+CL&J�:0�Av���TW#HRRR���_711A䘚Λ7*���,-- 4GQT#���`@R(��!D����"�������� r����9��������D����"����@����Ö‚NNNð暚ww1cvmAAP( {?\.Lo���F:qW_}aX[[Urr m۶qM6vyRRҭ[]<wƍDWWWpn-��`<"fΝ?a?{رUUU%%% P6vtt`vM<T:m4&y%̙.^233-Nz/ڵkϞ=6m,..nllD';::޹s#::H,řaveՎL&Ϟ=Z��@P(۶mST0 S*UUU<J$X,R9qDNO?dBcǎ7nSN B}MLFPbccWXqwy">>\~ӧW^M"<x6vu_5$$dڴiB믿vvvf2IIIox~H$ۼyg}fff駟]reʕ8WWW۷��``0j [n>SNmٲvbcc.\a؜9sf͚UWWcǎرmݺkիWSԙ3g=z4>>޽{OUӧO_~}ٲeiiiaaa_~eII )??ݺuNNN[n ׿r_|h֬Y���З_|QVV}UV%%%/1<g޼yl6O%oZ>㸸7xc~w}���ioo?Y>>ڵkDΟk.2+/r:P(dڵkmmmZ-R**rJ& ��Bհܼqcǎa׿s?c޼y{9B}qJaN;z={,[O|ׂwFDD<ܮ]> }���r.\AYYÉ0lQQQdPuy__߅ },+!!_5Bѧ#xiiibbXe˖EEEsL&ۺuktt\.xUUUsuww}9rJ~'ׯV��x!fiiZV]`0vvv3fV<y%KFV}8~~~'Oqwߝ5kq>0110aBttttt49J:ujbbbohoof,Ya'F;vlbbRȢ-,,0 R8tɓ'��2ytRDrҥK ,:���KKKT<{n���  r����9���������������@@���� r����9�����"����������!dKKK���``2W#JO< u��� 3gԧccbb2}t ���`@077t=k9$���(}����"@���� r����W2LqLFĀԔNkt B i4;i4L6w677R#RJߙD"YYYAT9ɩSO>xcܰ-jܹC&Yբh3gͰJ N+++}9kC޿_RT*U*0LX<僡 X CCCGy8{D"y9ɓ'pRVݠ5;;mP`\Ciii^^3 r���!D����"��������P'=SH&<x@ǍT*|||~ O F`...~jjjpwwyyzL&ӯ7RT*&&& cԉN+,,w'OOOpz,:J577Vr9011AG J.JqG}I"tY`X#B[ZZ...J+/^SS3~xög2%%%񡡡W^5dƌZ6""}---O#++kժU+Wܻwo~˗/oذ!&&%7RXh4XLPg̘1#NqƢET*h|򦭭\qL&ZXX`Rl/: _>imm]PP HX, vvv#B84{_5%%e/A|wNNN7o]*< bAII ۻ'655yzz=zDtv%K8Ί+߿/H < ðGSԆwww>|aXiiigg'6$$r|ĉHߺu ðht٠>,@UVVfggV3S[[[A"lll:;;d2qBtJRMLLFׯ/\pƌN+V8vWPX\\vpp@zp1cƸԴtvvq YTZXX/Aʰ0 x<ޣGD"QSS'JU*bbn!!!hՕ+WٳgnzWnڴiɒ%~ٳgkjj %kGG;88{) t0**Bt:4V/"<<ܨD!c2eee_H#Uܹsǎ;~x```[[}rre˖c?ٳ'11q߿O>$,,D"<xP,`V\\|펎;w[R… ´4oouakk{}{r$.\f.\?1i$\ܜO]]]ggghh(ua& MMM)JGGGppݻwI$RHHHccX,?~<jiiQA0GYZZr hZ`<uaF̬8q"7'Nꫯ\={,--8p //קȘ:u0/8BQ*<Fh4{{{(JDbooP__%z dODF4W\9~5k,YaXBBBBB‡~xq JJJ>CFcgg~K._ˋd^~===}֬YW\YlYllR:qй\tҥK0kǎ{ XzkSd֬Y _v4&&yӦM[nO{= fΜjkkg͚7|[n޴iSsssz=1�� IDATLLkjuvvN9sR\|98|Ç7n84.keeNQ_"-$$DV)Rss@>/FCc2=UTTܹ3888##cڵ7oLII7nȘ?SaT*g͚eoo?K`0BBB,--ꊊr7x 5G^+JeWWW;::\.%z¡Cݻy挌 __-[444[.Xロ7o?j,Ybjj>r.^bsJ֖oxpر[n3gZ̙3jҥKnnn///Gs>p8OvoFΝ;bX իWϘ1wh4|\.Gsv#8GFEÉ D 1蓅2'a&[[[礽=33xwwLd3~x4)Ec2r8//_oeY,% r-!88X;F\\ϦM9s9sH$a&33S(ٛ 9x~-˗1 [hF<wܑ%o0 h'NJ^nn˗ъTWW!!!=^;޿Ç!!!!!!ȼꫯ8qf3U*)#W\\bP(=z`ǰz|jkk_\\_A\rVdøqJKK|~]]P(455e0e---be܄BP(T(^^^|>/C^]vayM6)#G0 q}qtt4*a-i߹sã3077߻w/ZN<aؘ1cRSSrrr qʔ)YYY|>ϝ; ðG) 奦J$Ϗ k@aeeebbT*UuuR533zjrT*w H$]]]#N[gΜXhL&;w Ԧ[nyzz޸q###OJJJNNFHDR!333OOO$9]\\љ666555n0 -///** ,,,,++ .Dm۶cǎY9g"/EX^{r|ԩyyy6l0ܹsӫ\nݺI&yyyEFF믭=^;eʔdee566~qqq[xqJJ… '1J]dɅ ;::RRRV^=k֬QEH"ZGzܣZfBaSST*r,N*655uvvJұcǎsa vZTux3<x~zt 2nܸwxWp*fASSa2ĤP...C3QQQ۷oߵkWrr3.^(F؂r9s^r/xT*7$˖-E"ѡCVZ5w~y BٶmJh4555J8ɦD"p8SLoDaaa1112,<<<** - [[-[@`0-Z4|Zmiiџ׫T*~~~FQ(FDH$?~)S0 #BTO6 V Hs.[ Y{<==Ahhh\\utt4rP(NNN'OF:;;͛l6zVLLBرc*2J @Tŭ]?L.fcUBtNןVVVT*UVj33c"xtLJ ZbGEVh4hu͍dZXXkTVvvvO4TTTT*???LCm*cbb֭[xDDĴi@@ϟLL4iĉ&MꧡD"ՈNdXwϱAmjجA x8t4Ύ`0 ;;;Vkaa`0ZFCK"ձX,ww d2Q>'ZvŊ!!!&M2"<<<6mj;::A``ݻi4Z||<K2,&&?3{+@훛{-NϮTt6j5JqeA)a8Zp`l@[  /h bE?̻J^0Hrz 0<'/|9(EHI^*گwj6UG`kH:U ����` B)(T7!HmP5����벶lQ3%)I���"@���� r����y466644 Âp/Jeeq1Dzg|)<i;fBT:sFZ}Νa[DNMMM^^ RÐ_Ĕݾ}[ENeeesVsrr h4t:}0vo e-00HqZ-A#Z;ù;' hee5a„ )&*f-/@hZ+++SeCٍN`0c;8>Gء@�����D����"����Y!HP)���5dr"GG1w'j���c7a25CJM ;"���ÜNFQh=i9Qtc\Rm&o��0zvW&|k*dkj&ƿ<쿧Z\7wL`k%���̜&N| Hu47nCDZ٪ Z��!H$2B<ZZ.ູRtzuei`Ę׶v{ %K'&l���x+:Ky5Ut:DA8<^g-)RCC���=s*@ay/$/ 5U.$DWjꦦf,0Z��!0L<͘_Y^J?''����IENDB`��������������������������saods9/ds9/doc/user/catalogs/2masssrc.png�����������������������������������������������������������000644 �000765 �000000 �00000611527 11332127303 020655� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME ~�� �IDATxwUO9LOwON0CaUWEtwUQLq5 zWTqEQE$ 3=s~:w<S]9:Vsj0x<=?HGoęcYdɒ嗀 `8V >8!A?EEE999h0\jU[[c=VPP�A�fk1K,Y~Hw8]K/͛7aks̑$Iۣ}' n񴷷?E"[`>y[/4}X/$R~% Db(8Z춷v��FW׷��#-mHvE`&qWl(-p b +8&YQAG C%+=!^r-,'DiӤo cHI}Ug@B-d)fQ$簶ۏol*( DiϵU" =MX]!FOpvyA R&mԓ"eU:Q \D'YOh_ FX9N򼣝}كTV#8 BYp| ",'r̂(c)20ΦξK\] Nkb jQ$8Z買yN>EQX*rBqvs?G0p3$IJ(4)^<qOf}gI?�`Y6n̿ HQABdEeY3{.X P0GS /[abҩ_N,d:И.$0D">~3,6wxHA Gf FUBljI&c[f?DK>`0Y`=~ H6=M# -uM]D|\3 3u{L餷wuD)wZR{юX,6 "v:L$CRO|}ݓLǖvc1H$Z6=\U#ѓJ&G[;Rᣝhm\32�*&j lmԄcBK[/ ٨x,@"rGw"96O"SjkbKlݑHȡ +YCT1ׄ7w$1Ś}|\YhmÄl'B#m>I 7+Mh V2{zШ+ lCѪ^6G stPo `X:=}"dS'L)5ucqZFRr3ݾm4eҩ|cU o Yoȳyf9˲?0|ȑ &im � ��a8c8fecUU 0ڷ&MzP[PPD�ƬigSXYhӒ����)ܢ!JB4-@�`$!i\QhO@.+Ni^<.$؍d(qifgE9DYh@mްìs;Z4>e}M`g(:&<;]Qh6t hbDiކMUy]7 +;)V,/tD7/tIhXdyAWGz \Yn G /8 pj *vZ4{C9&]MKǔ;8CΝEQElIξj M41[aG4LXZ r4M6t:bXc_WOSF:Ea[8AVeé"F析H:3<4N,h(UήX(ƔmvFj<oQν =:<#^MP<-$X31TCߤ#MVaX^(rL_(YkA1bg u G'Tod'1mTεv>M؞&(!0R|Y=I<h;&QYՓؙ >;MȘayu4'V:Bq7,̵8~|G5a)?~A8d .vY>ɟ'4$��Go2|fPGWy+ Ðԝk>3lF:o|uyU7VILz8]k:#f= pg _e)v!E i8 ' ˼7%WPfopx TK8@Ȼ.Ey%T�bqιE m80@L+-# ͱL)^%8EclZ TQ`G/ƉJJ1iU?HWf sM:/qz# Q&fVT|AGHwj[&Yk:Fe X$XJ: 5N.ת?"PG? rNQiTw[V#}o48ވ2y \Kj?o7tDCw$D8L-~#M9M aAJ]&o0er%IPa p͵6ÁYO9u! CK΁DhJ苰%N#!m}qUo3ч;CVUk:ejDE-s16\&QV;yvQGw&a7D CR2ӑPgIrO0U' hO4׬s ߴ:i aR2w)N.sci7;\Vݬ;ԄjV2I-sqJ]&Q:y6IO ۍtaV&棞 A.so '<sZ=T~"=vL:(t+ HH&X<Oa(׀ hKo,Y|2n/9\'jc9_BNmss( a̘1Zʏ? 1&zUݡi rzUUa^nE�HW=Un�l|޸"�IilinPg$%rBH XAO,ρKom5;KܣrgSdIN^b;4eq6ض}vrh'68 ̵Pͱ%qEf^T$. &oD4W_ߺ沋QOZ.+iO@fٗPT4 24 ;m$'ʷ(kzn${(9tǕz#|0WfzE<e1Ey6][ձ&o 'QpJ0N�p7)i{ wzl4%)2?sy x|&zO̬#FhOF"+'7%9J r @4xbu4+1pBYhS`hOi4)eѵ&D 3xBl4).2@pDOh7xb&0SM!Ź�OKcM1>*i^҅9:<qO|c dfo %(#\=#=\3e]6]ko"cO V2 ޟp[i{Fp&_B\'Ď 1nxԞ`# IlcVH'Xy|Cq~D)}aءPs(h$S&*4iU_4(�j%\V:Y|4C=9n%9wx7"Jzc/:$/08q4sr˳;eY -z3EQ)�}v� t;|تq#+j 8ThO*n5ӞV?+($�ZUhQ/SHh4>\C^zpU6%;yߗ>ݏ^`;X~ëL]<!I8^:}6L1aQhU 8JrL 0\K{AR' #㊌M幺4"DR86Z`{QS u^3JL~.H]hZyV @&0H'͋ʤRSc/ EvZV'ĘE30W8uGiAR'} #c =!:FPa.D6ZhzQR3&\1Fn "p�'qhcELNIs<C !cBVTϘUG 0@+\zoɥ^1F_D'RAOI= 0ЍJxB#0>*(2S34,dS/+`JaEerh/<C0) ĄϚt@3 wxӼL.552i^]` XC 6ipƮ KN]S|i& i`(ͳRGI~.Jn}8%G|+Ap�k#( 4֭W q1shQk5Y㓢 oؓ0 u7sk7>Mt׵SzuO&2MIf=9|j LwYu��_0ś,,nІ�d��hlɚvOr'7Du*񇓂juZ&Ѩ$JN}?e<H':_{B5*3|ŗTUdg*wBl v�QE���tZzB9*:󯻼ҭ "Rʑ^CyW 17 'aN+$r`%+,Y6q s:AU.iOpjqc垨kIn))! /}ٞhDUc9HBKn AP[@0Pۂ8 GS: F< '\B)Fz̪C8Cn@иBNFAj1N-!≈#Fp�OH8B04;aG|lZ�2bۂ#$oXG:Ҳ ʧ*rIoD|.*jGH0pt] tmK`l 1V)I^鎈~đ\GFH {�JD(%$-FsޘHV\VAGP000#:VNÝdGP2rH jwX1`F =RK~a _D`T>.ɫ%9DQiq n4ىC^qE=iIFQu0RWL44YtF Vz"M=e%3)`1enK<Zg mAT? ɲ*+ E=@T2/OO��*n˦τA� & (aL!]>OU"P=0ȺhIWg κ6���P58T Af DL řo.>% ||o>ʼnH�@BH^Z}.b-@" R@ISNEBbb6_/b6  䙐^| *H%DTAwDv`m42"OT`{rUm0+gI >: `# 8ߌ  X@ sJoB)4\=lףDŽXր)P J- "�hORۄ|#P8\`FD-p_B3j f%0#]F#8ߌ ( X`ODN'yW L0@ɡs 70r'\`C"+2fZlAT�ud68o b2+F&~Ѯpӄ X@N WM0BMɡt`"|r+(\`;BRZ68(IȌ�j N=l!zE kUObpn `J R+"*;" Do!*@ NS0M~)Gڌo3"4aҗT0AA)WtAɬO}2󔣨 i;le;4d��eCo}=8}G{yvѬ3f]| Ac\s%n" | ZЧt7l-} :mm�fSh?QsTƆV`h�Ov<�֮1hcKyz'$p_U"v.D h #gמbc}P'Ezс*pE&@F r dȗPĠb"!+ZC* &S4ڡ@ì )@I0n*6 2)6Q5-Bc7 ,Sj �n AS@PtUQ+,J&̮X8V,@P o\u! l:RQ9j 30+H P_RVh *8JwTMK *m Zd T HPhMXDdhDMAR3U]zƠb ŠLJOhPQ+ބoj* P9bgTcjJ8NXRj 0Tsh@BSvFUNF$b@Z-1YªS8T2UpYIQ JJPoB3@53 Y)RQ7~W)ap @R-4L0 vΨJШmՇ98RK@p[XA:4ɬO}`$)'�4pʉ1gP �c Aie�pĒIodCαg,'蒜Uw^ f8OVY!U杪l9ÓNpYGª?ƨ8!8T $N3 ^'(ZSb? F:͇U~6R}1IU@y*)$/$z*[Bp"@[Y 28\ �f�N&= "'6b<\l"ԗBD"jg%ŭ# 1L2c;DRMBG҈`t&J[0ׇA|s`$0"H @$b"d3G1&1Bq|I,EFb#%U;z9q"!@e&!#iIK(:c)Zj&!`oY8 **"F\6J{�c' }),…Fb%eU:F)|Qv;%$$x?QD'-hr`\%"0aa^*"\J[SU07J*0 EA|IBz\b}+,s"#mBOpQH pɡ$۪w饖~l%R"(7a^�tF=.I5) eU}EDQILF\b0e}2"v OB?zp#kp3n}fDZ�h >H'G~7?_\0sYOC>sј|qDgqݻSPl__@e/X/J[!LB U4_ǩ�Rrs2`R?ш<5Dt~HHd\8iĤ#_Py=ғRf亓$/CE.)Aˣy ]I‚yz!BQ (D)7mqZVAXGi@pO !;)7/5Fi +q q'%p$aBzQʌ\O$Hϥ$4bn'PЙ ̸X #v)I\T"`;!RS2R?Q<�%I)q \J0J†R#K9FFMv$H3&#ZAML鹘94_0$ !(e@r3/�� �IDATpm�స8Y}iA RnQFL*JR#כ&\絪w< ҄IEFH>껒 C..b!( ]:1z\g}2?Ov&p2F> /zx|(W_={6GQ2e k?Yvq 2)Q]4ۑxɣ0yE u(;017bG $h9N+�r�KD<bX1Di̸KFU\գ0pS7M$%,f"ϒj{₍"=&;)HD#b; y�GHVP1aR÷"Q]4eΣY?GM1{ӔIDnNB'5D0 (֗&"O3I c\C`-A[p!G :TvR\}DMIQ< #3E Q4_ꦹ8-p8<֓rF妸΄8rLј 71DLh&-! Kr&t\̡CaQ&̓"G1qsb�IFf\ KuM۞Σ xM1yT0hLo$M*.k*i%"G2pXmI|W4*(۪I) ͧb!v$i+!XIHd'LJѓ$w3ֆ8@@/OR~VR**$もt!`-e0:Ryd^JG<*1/s)RRFQ-eaI<>-c%TlYJG"yd�Б2X1NmI#Hvf~D"i}1aF=*jT�Ȅ%$y*STF$(&7|{ʈHy}ZJYFGcn" A#e`[F 8y)b<VX?G Iz;RԖ2Pцid%$MX\KqXiK`BT򲺔R�O%D c„Dd0zVƊ�OGDB+>' w6-e! cY D/x 8FVS*1#e!GU=uKXR½EHmKo@֔\"a̷U2:>' w 6-iUATB2ɬOL>IE4 2��pѢE��$I0^�@o("/"2� aWUpXUHVaR HTy=^�%YeF!@TR3,*˪ I*@ )B@%`S@ @J@2w0^A; d�IE2�Pɓ$z E؉%|`HA z @@%Ia8,I*UUɬOEQVr-:UUOnOf~x<n43)(8*SO=:nawyEe_%K,YN }e]Jv!IB]yʒ%K,+1//c?T8˖Q,Yd9-<xC d(K,Y<8["Ydɒ!rdɒ%K6dɒ%Klɒ%K,Y!'K,Y'={Lrg?d>uo)q>ٳg�֯_E5j()lڴK.6l�/�\qwyȑ9slUL&~n7z>77'$xrugJ_JCCG}m3 /Cmu3~�TVVΘ1oW\9|_d>^ve?zԚ5k .R;vhii?Cvu 70 oϘ1Rp��E͛7�ﷵ{o~󛲲S瞫⋇b#n%yM7Ll#~zwx⊒6|UW]UXXxr<OMMM8$I555~O>?PK${κu^|EXQQADMMrwwwMMѣG_~eMMj̈́˶mjjj2%CdYUU^#GRN\EQsEqpIx<wq뭨@Q͛7/g򭭭]p(F{پ} ˗/߲ei9ǽ{Ԙ把y=rr޲e�_uMMM(ҮFeoVTT<O<Ė-[^ZQQ?1 =˗/[lř;_\nP,-KEEorZhooimmBKMMM{{ 6G<hL0K/3<~LwWJIJ%d] 3f̠iZo͛`I?oym�|ɳ:k(7SLӟtwO4\駟VYY9z 655I4s;㢋.?~O?}my<۷?ӯ޽{zOD+�Y`>}ʕ+׮]{wLT*/ʲ}vA⋢s9_e>0lѢE,_~q|[V&IRWW MMM>o„ G)...,,<J'cٴs|K,;Nz<ϲ{饗رGiw}o[qqK/ ꮮC3/ EQC0LGG̙3NZRRsp8<}t֬Y3vuֽkA]V;V^x70tժUaz{{_wuwu ͙3<ϝ;WLs <|s.YwqС\PTTֶqFa% "ȵ^tҵk>SLxA3giӦM6r~JzAo29s(?d:3PݴiS88qbQQٽ{N?{~'ԩS?|ݾaÆ?X޽�p9<Cځoy睊ׯX{WW}ݧAضmݻyq޽{ҥ4Meј "ZH$6oޜYgM<_ߺuBl߹sɤeYۯ] v+@ pJg駟ܹsΝXK.<y2]]]�T*zEQ{(�@d Ò$qv{ VڰaÆ |?<??ѣ]]]`RԺv?#C駟]vM8K.y7nܖ-[lzwڕH$n5kּׯ_tc='RX,$I^a˲(ȲloooIII}}}"8n3f\s5555K,immݵkW_=w܆k/ߵkW__mݖH$ڗ^z{/y_|!fWUUꫯ޽{ĉW_}Wl]vxO=TGGΝ;[~cC-^w}w׿1SId"EтUV}[n]`%K2?G}snm… ^wջw>|)Ԟ={v>f̘T*uBI>쳛6mzGyq\ooo8֞9lٲhѢ￿m߾}Ĉc+Vo,8p`ܹ\rI .�ə7oŋ|+r޽C l�?ϵVG=x۶mرcm6W\gϞW_}[zu/l6˲gϞX,v(IUW]UYYoN8g՚p8nԨQ6lz糁4RWWsκL?pUUծ] o۱cGEEOOǚFGGGmmmSSޢ>{ '7֦R)mM7TQQOɓ3mgyBk֬yw6q߾}vt]4`Pbx≍7[F'hllJ"/;Ӻעh:iE{x9rOHg_\qƥKΚ5o<<?7ި\d_3Ϝ|￿jժ;vիzS:6lx7/^l۵'x"��ݾxMs9yGEԶy_t}oFIIɬYx"E۶m|<2:\p-ܲyo;%K+wygIIŋ}W^^I$/^ ѣGw}8qimmպ4ڞx≓;>LXgΜ �xgO A#G9[o5ͧtbsϩ6CaԩUUUwu0ӦM;VtذaSLǍiliwtRG6lԩS/ &R6>|e\m۶o߾Ϳ=?wܹs2 C>|k`{INN!??ĉׯ?!̄ ƍwG~:᧟~Z19r /p8>욚?`pWf{o\3A7n|Gۼo߾m۶=UUUƍaٲe(ٵkw}70. �[ٳlٲ/xڴi<mR;::͛,Cd֬Y}h9rdMM Mӧ4rf '666>t~hZ9{OxBQ`0$?COjoo0쮻tA3~r=< 7ܰnݺ .\pʔ)ښzĉKJJFR6zhI~ᎎSuy^$EOK?o޼s^xZðOR& EQٜNre0_~eccﯪ((*_h\uL0b0 q^_ZZ:lذx@8W^v?'Nܾ};@ H �h0'Ipsbۇ~Af8q_w}Ws/z=`0k?9>;2 3cƌ:ZUU�ظqcKKKMM>}=300'x^EQnlkuuuy3f̘1cFqq}/�B`j̘1խ�ƌSPPo߾⼼<Mk=.+sߝH$> 6\jffeW`Zfĉ7l / O?]n V<X̸PIIIuuhx衇n ��{96s.YDlٲ;v,^x7x(ZF֭{񡗑b9N`z! ova{1�ޫʳ:tN<yر4lĈ'ўuYjsY`ߎa믿$s9tztZ;ŋuYC̝ \z�Ǐ7h40͓(*77w ^:u� q~QFm޼yŊ ,8֬YqjGuun(DUU+/ݻ�#̚5k̙|_}Ղ^x^/nݺl23|x۷Ϛ5릛nbڔ\UU_}U�_?e˖i> /L0aF7o  .�[nԨQ#F8VpܒeٷzG3g�׿Q.x�ڵk'Mt=�0eaN6+++�ӦM hH ,(**Ҧf|�iӦ!\LTYY] ڏ<LQg͚_zխM^UYY$I^ZlҥK8umٲ:77w͚5˗/?r9sB;培%:sEoݺ5ο *aj}~4q3سg0ZL&%%_|޽{O?tΜ9ί/n޼?̺Ŀ9EEEӧO֭[eYvq]w"˒˵cǎ:]s5cƌ?Xk֬y'|ͬ?G6doDyy͛)-z^'ٳgΜ9 Yٿ) CdCN,^0uR8;k=dɒ%D6dɒ%Klɒ%K,ِ%K,Y>N@@,Ydä |rTUݶm@dɒ%C;3JNi,YdɒV 9 \uUɒ%K,',|>,Y~qL0a(kfB6|~_{s(ƛ,ِpL&UUE7|%K6PU5rEy/[2?jO}}}kkl^CNOOK/tnmڵկ.li#V^-�$I[I �0={hx㍙v}~?|eeٳi+!N>s+̚`pʕ3fhllx<e˖:tqҤI]vի�W^y3ՍC=�ظq#G��Zu,|r-d2}g|IF$� ?'Ԩq͜9_8;:̿T*Z^^-vөR8pT˒)á>Zj…w(j*A!{پ}ի:TUUխX⩧VXqw^uUgqƭ A 7��8t=ϭxVZCM<j_~ҥ+Wljj?+2~x�#lLȹݛwYgi)]v֭?pccU~rs=ׯߺu뭷otM7|w0̔)SxG}4 .Zh͚5/rOO#<|o{Y`__^^? A={߿brniӦ]~Wnڴ)LfCοݾw?$IUUEQ$ AUUQ8(0 CWZ? ð,��A4cI2m A0 k3fE HKSQm\m$IAh ,k鈢 He( ,#IҾ<y%I$ a4i;5KQ Y==bfyѢEZ�@Le A{=?7ZaE9A- :O>pXb(  ?ұ6lذiӦ�^|Ś>@?00pSFϟu{vSڵkf$I6macY6J]s5wyg}h"zwuW3<<Od<>|5/b+VobŊp8|u]wu3f 7 ATJ> 92Yf=3f��hz}і-[?OSNi[n;w. wN$ 9r䬳Κ6mAF8nKNy?|pYYٴi6o,޽{{zzƏDzzzޞma[ZZRԜ9s/A+V̝;w٢(&ٳg~7.9sڵ޻;�gĉ7nF_kok(AZ㸢(5:3Fk%I.ym,ڂnСCZ5F&;�� �IDATAQܵ=jq A-YM ZD-ANkӵW@Qt޽Z(+˲&RKap DQY0=z J٣QUupδZ$RĪ swr'|o(Bv94M$˲H{vƍ}(T* v-Z; zzz,Y2iҤ~{ܸq[nO vܹp˗744\{^x] : z%K͛_}զM8?3ԶqKY}ꩧf̘gz}ٕ+W?<.r{/" K\{]P3Q45--5H-,B." ̾8 #ʝgΜ=<9QQQR-|o%O:eoo?pUV 0… <O(&''/[ls޽{>߱cM6ٳSNmڴu޽{8`0݃8�gBܰa!dʔ)aaaӧO7oޗ_~yܹ7oߥ_$EGG_pA*geeX,YBrC-. ˆ%0Á0X!j�e2~~~J~ Bd2y</\.Wj R� S~ߟb!fz=2b)<Cp8p/`OX BLJ8&RbqCpФ6\> .4IJe222Ν6aH>ӛ7o6 fܹeee֭kѢE^^<%K|W555uuufZz5!テ}SRRvm۶/r?[}{o !G9s&8[~WPc:99ڵC֭۵kWJJJ.]?WTTѣgϞ=|QQѠAF a_EE?矯Yٳf2elݺ3 mALLL.]-[5jΜ9V,i'hx<R :2@Nlhd޽{޽{fXl6 01�� FLbV7)8r J%Zf}ajy~y7!)))ֿBܚޣqpp:u;3v#Gh4;;e˖ܹeff6 ӧOu֮]D"٫W^z-Y>ܷo_QQc\ѣ{=xΝ/޴iSll,}?s͚5ׯ_W**儐7RO>}tHBWZuСx}ԩm۶5t/-[:uS~˗/0}Ç~~~ m믿fffbj\p86 5pK5R(! |@8wt�36�zڵkP, ft]& <x�@ n B4BJlvϞ=O>-Jz}ZZYp6  O�pHVs\+<W{<)==}ƌb=ˆ۷7\.W*d2F䔟][[{MBA ڕ+W{۷o f͚߹sG(mܸiiiG&,_ '')OOς@p͛7owZZZZZZHHH-SN]2a„}7Aܿ?77͛|>yyyy21룢n޼hZjdoo:;;ۋD"T {{{9s&44t˖-w޵uuu5xxx<yVT[n 3gL&j/_D"\.߸q#pΝ;7iҤI&iڇZ]WjK� $XGRU*8}̧AJ8j>09P(OZ8� xF4@>5@yI\PZZ �$\P( 7AXC2.r9f- x"=}" ħb8ĸpLn0JNjr\]]GnM6#Gtrr9rdXXػd2 !}lZ~-[֯_?~O?~~mΝ?cǎ˗/ONNn׮aǷ~S})..֬YviӦF{A-_#Gܾ};l|7|tss9rdPP8p`ǎgiӦ;w&''Ϝ9s޼y;wTTpU ڵkʕk֬)V\9gΜdwwe˖9;;õ;w?P(9r$^AF Çk&_Bw4{֭ӦMsppӧOZZСC֮]7{l+4ƴ:ߪ00,b&S3 3[z I u{u:!DcwbzVf5jAV!`X^98F'2f !QɄ %!!D`8�$Y,PSC|Y捈Ζd0`IpႿZrr2͞6mڴiҬ5,ӧ۵kG󬪪<xVSyLv1,,^3e뙆,W`_NDŽ* D,,l0 1`0 NSB r8zp :C4ܦNc2L &SR :EGf0LNL&Sղ9WRL2#]\'yP p8�lņHN\o@G"Pj"@ khPlX }atZJd=92k,^]ٳgߟn:y28!ع5!�i7,D2Hj!HB6 Á>v]2$MN5(# .3NHfjbXJ8Xz  nf;wܹsFa.WV[xnlf_WgP0ˠ6멕J%<\"McLdNSRH,UƂ>CƤ՞Zjuy\CXkH`( $@#� d6J; @y<V Tczn 3L&04x�pCbw^ >+1M 4aJ:3Oә c>0 pG BNRxVړP(?xV0Q.\WaP}RH@5d6,* ?Pk� E:j�U,jtp1u6!Cje2 9ҥKMORjM.^خ];4]]]kjj;�-F`9+Qbh\çf P뤱΋7AlAaNDDZ PL+1R=S:�#}4x2T֡*\(aiыx}iH4oڙKXިGJuVs-t(PLC<L&H$4`@C+w^ b$ A6 5E`rps qG##4餖iԡ'YwLY�FH} E+<9;;QXj9s&,,̬T*V CCY 0LDAG1áQTVVBcP(`E۠pRH$bυk\l'''h=7t@`0s  JfMYjVk,JXAK$UTJUtS'ʱHnsSHuÂNXGRxXrꠇ5oIre2R 888H$\T*/B�GW>4 i';~#'8:fziƯ !g׮]ֳgρ*?866tn!ǎKOO_pCUUU-[([NN! <' 24kB|�'''5*<<|ܹ&m;vܸqXj/�0` W v > b:1k04EzfL ]K7o~]2C27 f;FFv Orpf+1fTi֒0s,--m…=z MLLTT[%;BZ}}}jj+W^j^^^jjjhhرcǎ{q2ЬY)Sܸqfʕ'>bĈ;whTD2vQF]|966O?ݵkZE?jݺ1VX,X) 0cnyAiocF $6p؀.U6]jedIC d3� Yd2X깻{yy HT*T -}Kmmm!Նw !pD#V{6Hl!/4hܸq 5B)//ݻk׮7Ĵm}n߾}bbb]]Bw}w/^sǎ}^P566688x M6aaaQg&`Jݫt~mm-.K1 V1<�T*d2dB Zߡ̺u,.LV6mԩrl6qss <xiժUΝ !JÀ|pRTRS(P- A 4ԨiE`:>&ͤx,3{kO9^`ʨ6))_WVV^?~jjӧm۶i4b2y0z,##c֭'N?׮]~mVWWWTTzXvv6�4hPDDĶmMոf��& 4 ]'̡A .cZRzBC `|^wWìf2* Fh4hՄ 1~~~[󺹹:u KM�*Cr28(|ِlc5lp1 i4xx|xJJ࿡< /8yI4[{hd.--H$!!!P}6MNNޱcdž vJYjUaxs̙ٳgC8HATz?!"QUEo�PKZ(ӭ6xRF*L&R9n) Kp|6m:vآEÇ;99A*%//a 4r :Ot B)ߙglˑ Z)<<|„ Ǐ駟h(Cņﯬ�0֭ꫯ9ڵ믿"ܾ}#g8� +VظqcHH7|cY%�!͸'899Br9|Cj y`C䏕y& j4z�x<hm8χ"L3u:]۶mKJJ^ZPPP(PeF !je24Q*J@# d_y9Ljթ!'22rӦM<6%%!dϞ="H(-6 {oذaW^nSTT4uUVaKkdRX|<bbb!YYY{5o޼Ǐ_|… UUUVg�@% �NTUU!o [,Y71ŰN�s!nl@C*�`Jib&YYY٩SŋCŅBC n bLV .P ߡ~1`|k}LlT\=54&ZœD9C Q*ل*&&FPL81&&w]d Ovttܾ}͛w=jԨ ­fdd@2*""e˖;v̙3u'hR3f <ޱYf'N1bDRRݻnuV{a.gZaf !|aJF 5Q(8XK;av3+G0KBNB*++bqNNX,Yii) Z/=.H�0#%!F5jW\iv@&NhMXXWր4hРAf9s&gVi>1cXyV{Qet!I W8yX18w�#$B0AFI9v ,g JWW7n d{0G ԮP` PupOL XI/r,SSS լK8f�z4C F&c[ |(fq2�fVV%&*ݼ( L}[RRW\\  xxdK,d@J{T[h1�5汛qQ�~J+!k3Rlñܠ0D Ի]bT>ZCK|XX=ȉxZ;*++n58/T@ wŤ6. 1dz�:} �0[Z<< iVs*CjjDt?=:B_=�{9Q0d2zǣGnbb \.oWoi̺ih Y$,P56Zt_#DYMZŘJ<ciVRRbMZ52'''Ph꛰|Jx%"hB% e2� �U3j5u19FJ�QDTPXB6 Bϧp xK;x͖KV{ɉ&lϟ9uevvvWij1pF�@$1:\9X Q*M`ꆮj4F!Z^߶9zuG^ρN?PJ8FpI Mf|@-Ga5>|L<ѐ8 9aMT?HSdg489cQdr>/B]S7 F6?xy_3)@ -*5�G3 sEODMh^7$.EBZlh�c,ŘeByoQFYA r\J:4j(lvYYǏ߸q#Ε Z u1իW/\P M[B''\?sj" @ P((�;��hpHcB܆P"Tլ5YjObؖl_C(`bxƍ8_]`Пhkk+ɠslt,INI N^%d !E F D>/�a@2Na]Nr7l(X)tHj=@0􎏌BL:'F3mڴظ8B۷WZ߱cGF*Ξ=o߾F]V3k[l9s !W^Æ [`BlllV^o>BHpppBBC\Ĺ5tF`(}'ƀcd2Ր6L 0$}Xz^3Xw'cTFW.CAr $P� j?JnFo(bV!gS_oe|UbKF LWb:ac5h ꘦ DS߿nСl6_~ׯN�M={xyyW B�� �IDATP�rʵkVUU͝;~ĉ :۷o>}:!!aܹaaaCx'OYYY+--]trdP$1`u3hm-,(͉!6� 0ɴdiZ160J@u8d.`4 IRb/ .n)Ha!yƆۼysZZL&6lɓ"##uj*�BH||<K^^^]tر͛7OyСׯ_wvv |>_$=zOOOxbYlӦM׿jOcv8999::,LVHO Rfq)/PcCt)�V5C&> "�[(׆ :8Ҡ�EpIx7(R)4@tEgFߘ_YcK'ܘΧy_Fyl1k/_1bǍ|2UWWgcƌ9xZ^l7vɳgϊD"m+,,믿coo痓K9t;c}nV{J 'B(cv#u&f!BpdmX/AgdDF<H=@ (P p/T4{60nNKt/YR16�N�ǂN kr|}}G G1b\_7?n3f̘8qbvvvnn.!$//~srr{cFtu999Yجֶm[²2y @8B A\RWW [Ѐlϙoz>n#3MPmÂV0Yhu5liooE =!ťcǎ}YttwhhwGwG9rdɒ%֧R$ UR6TtҚ5kbbboN1VXFFFii) 6 *1 NYT8kXA4"I7 >x#�|} ("pL&dQt[PJr,Lp\>Ȅ4, հ|#_L5> i7gN0[n{!8;;3̢"{{{77/bd2w?B\nPPD")**YmvȑN:㏗/_rss=z)S u$]v)gggoo͛7YYYPˁ1VX,V*~F)X~@#Z;Ub8aW r GJg L77ҥҀ�(d2$m;w�Z@' 3�bQ i4ZHdPiH ӌ8PղT*BP(J%>=#|P(rFQй#Did|bQ*`R5 4*|Fn0x5{V޽{l^'33k׮K.~̙3to­Y&++e˖08'33sɳg϶ V!rݻ+ʙ3g°QBHxxڵk?~%K=9sg1̛#;QLbGpuuE+r0xbXȑ^XLbC5 ]CwCE:#уs4K("2D"W u/G@ΐ!C?g̘av3ĕ=zBڴih"5zxF(:::::tǘ9j5=kٹn֣IXU-VzpZRib1!GMqۯff6E_},ˈo;x< xtSNMIIˆ zѝI l]>KYj]~`c =- #-Z(ʚ bUt4<c* &Z� ਷ccB!V3�1u!> !!!4u oϞ=CG a<vFK`X3jBB}YA#Dj:byx#-B󲒒&]0CjM@Lc4L" #rt180 @0 xR_%%L6ݼ+@bœST0�ldX׮]0PƆP@PWWnh8"þg[l'iᰦ"4hPiށY3c4ԕe@HX!iM,7y9mڴxjP}6*C3?!D.c/GGGThU2j1RT"Ep<JyX[pfrp4S&XGdI�X ѴMYk/N> o<y˹tRMMMxzz׆D#%CdZ 0aM}}=�8:: aD q0:`U8[sh1G8x IY:te@ѡ#mTIJi@<LҘE/*#!fc—Ff,L{F踊Mq~ˢAV1oM{^|òzidGL'$ O (܀- Ӣ0! e|>ή&G<D#+ |6BR (T* \.4Χc_ 7جCGW nhn2Msp3^nL1U6ܘ'&1J=3)Rڑ#G^SP؄N;~8eXnGD t ۠ Z:t(:2l Jj0|>j2۶m;~x'''N0Q(kt{,kDtAQ�j:@kbjA[[[y ;1lƼfp|� 01e&Mz}jj*FWZH$*,,Dj(ymmmז(***//8y-[`TB )rss!G`/8 6�Z zj'F-5 p{plp3(56r bzRLM?2~V۷o/^ׯ_mmK{Bڵk]q_ !C OӶqՋ3-7nB3vXBȍ7.]:}Ν;[^reoz .B WTT̚5kԨQ':uor—_~IYdɭ[!x$Ɇ zjժ[n?۲ew~ݻw7>%%ܽ{7dD͛GoOزeKl/۸q#/I@V 瑾f{`fJ@b) 9}B0((-000<<ɩ'N={l6` {?pBBC!xkxـ:pmtRLҩ0 t3zfL=;.@n) <rL%. W Ԥ/_|<={ѣGU*7l?T˗/ggg۷Yf ]f̘qܹ7oB{ݻw͛7a„k׎fsw%KҮ]v] dw>}{=eʔЯ*##ݻGdd$2wׯwԉ?f̘q 8?g2)))gΜIOO4iCCCCP=z􈊊zVdwN4Ypajj ~~D555|>_VرcժUZӦM[hQTTTLL ϟ9sfee%fggALozxx$''ϝ;7>>O2**dzyyݻI7 NuLAjz {)U*!mx۷C1,uql!:uԹsg{{f͚w*zŋ"ٳ�2 Exj<,~ad2뿭&q.싷 :_Ez�PD"HkXstt𠿻֭۵kWjjjxxxff_<-+h\.7$ %<](T >I<x0Njdnnn|>_*d[fggCh/ZҥKW^^ޕ+Wzw]]Bpwwo׮ݰa /a@888xxx?GT-Z8::o251c̜9s={|&ʚ={vjj*\RRR/^اO 6ŝ={6///66ѣ>m޼9!$&&&000"""33sW\>>>;w/lٲʕ+\.e˖ӦM>}ѣG =<<^_#@]Z[[�5(A%6.f^F nVΕcFS 4k֬cǎ"Yf% c2 #((HUVVܺuK&AH9M*-'C7Z(`hõZQ`h:+ x8rʴau }92 7#:]t_|Eb׺u@pR7^m#[tlQsСlTd2ҥKgΜEiݺ5$1׬Yӭ[WW/|ѭ[rJhhAY;rȬY/^<n8B㡫;FFFΛ7RVVxCֶ[np Yfff}}K||oy+W޸q9=LLvE__O>dذaFgeZ999|>s޼yjɓ?!:>SLqss7oރ;V^^_CxŊ"x<HTTTp˗/l-υҋ2`@V> ^OFЅ*t:ݩS BNrʨ( !um[5puxx\,sq9O[2/3/U+7 C]*Z]^ZS]5_L&S^PÐ3H2! _ӔzVoD.BMM~&̰0`J2i[Wh<ʸ'|ryPy4eSn4m2XwYJq |>,, &BB'|ӧO$%%%%%%$$ܻwĉO^dɲe˘LfLL|𬎜�xQQQQIIIΝ;'%%{§m۶h4fɱ|˗[6mС>sJ.\HJJbTF4QQQԻwCUTTxyy%%%}'1118D#??<xY߿BN:|]WtС'N˃YXXXzz:9[]]ؤ$DrAxΜ9oV\\ ΤAOntJD3XF'Ǹrbu|Ct:ݍ+WaݹcTVT ]y.lvVN ++*ǾQ (ho'Ľʵeø  Ǿf09LFwG.F1B\$Wd{B p'K.%V{Y>}lvBB?~ݻRĉ׭[yW:w`0ҟnܸ1~ٳgO4 j#յ֨rJ�///3K ӧ\.rD"iժUN#m߾<-ZYhg9]UUxgH?tr6?]Hh͛7ӧ)BH]]VA"H&О'<`Z1#Cۍ5ì<D@T,tÇz=#;og'hՊ|M\<==5?[oӦM}}}nnTQ5 74#SUUu5)^g(,<iO@ZTs4 B7!![˹aP'@=AwQ=1i1ˉ)-jkkkZ- s 7'$i.;k,&7w\SNUUU?+&&Fwv)h$Ç;Fiٲepp!Cx<^bbɓ'e2H$2m޼yѢE'O<<<t:]DDof233JJJBBB,X`4 Ʀ]v7n[hњ5krss zVQQqDB{ ulggqڵP;;8p�?z֭['NV]]]A7 9r^?v>.]gddTVVBrժUgΜy)OehPs;|8R۵S1|}nM {ժUFJp82Cb~ǓJu֕W\a2͛7-[x.]=<MA� Zs84,&[�e:NԦ 핱Z#`ܡv$ 2d}9HP(p61OCmjׅ|#\d zYЏzPo&L?#1ia8qZ}6`0u.00S<1..X" >ܨ>NgϞׯݸť;֭[- mllx &nݺ@Ӎ7JG ɩk׮TLfVbbbzUQQQ^^ޥK> 00+??fO<cǎ֭מp~{aaannn ӧO 2{o y2rpž={~駡CZ.5ݻwM6ʉFGvvvv3gk;9`ВڡC1>ԩСCdlllMMMyy ]ty'  *[n]|2hB!ZGex&dZкj<=YCӾBSfwy-ꚚǏ9r d�Aj8U+l6jf"M ߾}y۶m3@<;]{yd `c>/|>ЦȔl€H 87t`L<Y,{{{T{>|-8�|j'N tD"1v{{&=xQlJ0urnȑ#|`O[9rwߕڵUUU=x_MMM5Rr3`UWP KpLټysPhlllCCCsrrd2#%IaaaqqqMMNU7h5*`8Íu A�jA5BP�?G65j԰aڵk 1;ʴ/lߔM,D#M7(4ꢣsУyܹhRiggWWW4!ZT^qsuu}[# 3֌KX0-a h/�& kٔe6P(!pp5Ĕ@: ^T*&O3E!y( ^\' B߅L"rLrZe# .SУNBpfK&N)#AH9hr)#yrwўGu4(B#ABQ(W^5' `#@�}|>Ν;L&_AYYYqqquuuqqqmmm]]0L�A14HLb Hp)V>,CiMXa:�� �IDAT*kKN yN '!*.QE0var\(B F=H$>/6tR;;; �%%%>I}}=20P 7G Lo  .=Y!nj Wvɳ2LҡCѶm&@yskء3iUf4jc$EB S__/b1͛7/**"H(rS[[%8�$`|qf&aF#ȵB&D%�Tjl^Jxh&(IO!&L V1oyyy>|-Ɯtϒ ՟D" 7ྡ4'KC[C.�= QYL@/*`U*Uaa!wrr\Z> >rCCC�4HZ%8}R2k8!15ӃajtƏO 9frDIٴZmLLLV\\ČƛZ6lXc~f͚ȊI3]F>8P5HS&Wk@ .�bqqq1upp,KT` F9ȊCN- !51p cH!ӚX&^Zީ O81jԨs.Nׄ^m4`2XaX;ПWc^&x<P褲*7MQQFqqqqvvV*555l�Pj�*JfvџEic�7jS4yTZ(@3Α#t4ћ"U=!H9E(FIѢ# 9VZ7,rdɀt 5kS@)�.=8&=PijPWW5 ںx<Pt'p<Be�=2lS*r@I98� M}0FvFЏJ2xU7C'LENH+(=\�5E"Qǎcbb:w8a„ǥ9- xbHjbD)))i ~H/ܹs' &&&(((;;[.:uѣǰahIѣGw=22rѢE2ܹsm۶Ak׮IҤΝ;wm„ be2HvZȑ#"H魢"666&&C7nH$1=ztmm5|TJ_adddLLLvvޭT*oӵkw}G:uZbh�#�-}89wd:[%Hjjjb\.dJd Z*UkjLO�6`mRrJRCI88|pe}=ĚV+V)/'Ntss;x`6mJCڶm?.]'$$@Yvss+((8w!ήW^ B,DVDDo޼pqH<Nt-[@{{ѣG>|޽{~o㓒`ȸqFNNѣv:mڴ;v :t̘1-gOOψ:L6|x<^۶msrrJKKO8lr 6lذ!)))&&&++rܹ &o~۶mtR}}իoݺվ}{>H$gΜ/N8sLP7oLxRЅcf7o^WW'e2cCqI}4q x2iuuuvvvZDR,B;;;\r*#JJ%=-Qb�d|cR 0|"0f:+lcIfIPiW�F͹q Qoc6wg0YNjr̚BذaO?4gΜ‰'°ED2q_u׮]~aQQю;Ν[PP0qCm߾}ܹEEEs-..NLLܻwoQQQBBBZZ ~AAAfZp_|W_;D_|G}d͛7GDDlذzݙcBB¾}\R]]2dȐgݚ0a7|pCD<s-6oތxc54(]�] qvv;vl>}c_$TzDOB=-@#D5MUUdT*\.ntH$6m<xyyy`0x 9Q�>:Ϧf8g >BH_h1X#˸=YcQo|>h rLOj602ȱsիWܹS,<_hg}xM6[~mDDѣ?jXf͚]_\nBB€ O޺ukOO˗=zElll,Y2uٳ9i$''Ϛ56+VHMM矃_S_9rŋ Ν;>9ezP(To߾?sոM||<1bرcCG<W .rMMׇ r)b"|T(9X^@1R ۳XK.%z6V�0EȡakA@\C촡!%\mm[-<mڴݻwoذ(Xp8:udW^ ޲eٳgӭ[o"[n<ڵky)sFs?.))yضmZ(,,QJ&}g;wLOO}윜 ~?s d2usm UTTЊySL3gÇm4\I*\B R\t 0|(߷o_PB:}hP vT*!h JR(2ÇR _\\ i=8iUU1Te0jN F]X ch JY|Z#UaPʚ1od\PTӳ7 1ȳ|g1#3N:w\777u…;vL:5!!]r͛!!!IIIK.6mA2~+V|W2eʘ1cRRRed֪UUVĶCUWW7{իWU RvIA(lܹsC w***._IϵTT*Uc<}8Y@)t.^BƦ &6vtA 1T ALaax`+BHJJ *CCc)>jvA#[;1A;�.0%$1p>2+8$l<>0O0[`4e,Þ$ݣG S,'&&2D(8Vhܸq?uTxxxϞ=Ӌ'M\UClٲpD̟??$$$##B!gΜʚ0aB/ϟ;uT?QٳW^IIIsݷo+**z-Sرcwܙ>}zHHH7olkkݦVWW` .>{ݴiSf!ݻw^rX,ٳg۶m%ɓΝ{̟?ٳ1c~*>?rH{{~g}mݺu{zՏ#ACA{ tPQîapy4AAi4=C2*h-5zl P(f4ӰuBH[k=͛<y2!dذa:u:̟?ׯ_fjuBazzzV<==5M۶mt;wBBBB~m\ޱcFonnnp\$]\\@J2==7�h֭B000p˖-555-[zyyM2߿cǎl6{ڵńWWWaŋh[ll? 7yfxzzjJV{yylْN:99-Y֭[C`@4hzsd|7 h (;;;L l:I@m2i@p\JN_P`?&-rhД3HaE ^fU&q;tP3 pZEC]Νw Q*X"77wʕYDDF[mŒH\/~|yq6v@@QhcoooooWlcDS 7z F270N:;;۴oC/q  $ ] UH$@+(y(NT*гҢ5i= k�jڂ 2`"+ĤnlԄD<k΀LMRaotowj:}4!%p4U#BLe s#O9m۶Y`o5Y�RDn :\(z bp@8i3KT7C00_G  `Ǘ4T:Uc+R/c [[�\i ˵fY9F9L_>7y9t6BqYNVh\^K/AilC2Q3@H EpWoDZpp.WЂF jH...UUUQMH  ,�BӴ-((q[_#{Sx<ދ4Jj۠# B re� LI#xb@A׀X"" %!r&!Gw9H) z(6Ӭ6Z6ZOhET0c?zxknSLs&Qh;.)-C`:{C)&":r233_q?bhK^�֪UWv^ DŽ?% !\J8�5<3D<666%pp1p 0jr SR BR )p*Cв0GkSezY0}mVrYߣ!ᘎ6E>Ӎ-;k kArkM@UPP ^BȰaÚpB{xx=+ >Z\c hxf4~*8h4 e`ȚS 91Lj`w�!Ha1 G!`E.0i5kb,ݝ:u9)009sU):݁9%z ]sVL&UVWWW#m qCW�|:dl/Hz A$@P(@tz1PH+ miL5{$}pF͈KET,#Yc5+l^occ#AG ` f^ Cv'@p@GGGAF}?dN]. ij8&- z8ȍiEC9'|B9 Ri-p),2*j A=s挫޽{088ރEEE_sZ޽dnnH$ϟ߾}ݻ۷ *//8p`tttDDDbbb]]oĴnܹsb8!!SN]vtKRWWWl:t萫SZaa!̼ ]zX,y9C 6lXn:v8k,DØM6o aiii޽{Ѿ} H.ߋ1 BQYY)a'!4h www=C kPT*I�!(7o:~;�i4bgtB5j7t 9r8OUV E&dC7 HC07FtV{bzzz~7BH~a{Ǐ'|ʪʊutt#F�n}9sLnnnhhC<==Sw'9iҤ`3iҤGm޼Y$|w8/g֭'Ny9{6mZ.]`^ΤI-ZsNO?y9{999EEEYYY-Zxg?vz 6|GT;qĔ)S@.]DyR>#V_$&&FDD̟?|Νy9}ibBU?UMFF7 =88ƍ7o<00?St R ǧgPE1|WAA rо <k9s�!ѺfCzC#kfcϦ5y:e@ϕhh3:afPO?Eщe˖رɓQQQKrrrbbVׯߧ~Z[[흘8v؟~رc{9|sƏq;w,Y.Yd…fj׮Çq5k,_ܬ? \pa6m:3I&=zܸq0hF Oocƌ={G jm۶M>=99 V]ʝ#1OaerFO=@oȽ{nݺ%�,x h666cƌ̼>"r 0x!AcggB G`#] I i0Z[7( `62%%hPjjRi`+!6ט^NN}||><~,J5o޼dzXG^tÇqqq={}8=~xOOck<}N ĎUYG[PMTT$(A+ͫjZZ5k֨ "!CHN>9?.wO=>g\عsg9jz֬YڵkWZUJfҥSN}=sݼyMP慃O6>ԩӠAJ+d[>y$Ͷnza>yРAݻwlƆP=yhp�m)@0$5qqqF!rB$A~qqq#=N4v<$J4 Jd nX+UW{9H\du?ޭ[ Ud25j͛7KWӓt*((>c|QY|yݺussswYJ"E^^^oߦ|Avvٴi̙3'M{nA#$$Fq w pȿTE؈ "񤵘fZC &L;;;Á$J]]]b6ccc5M,�q)@14#I&Iӡ4RLgrFTą[BKp3'yĊ_%r'O<hР#Gj!ԩӑ#GM7;)wXn]tteˎ9[o\xd?ѨQݻX/*??Ϝ9sx֭[:d'6pĉ7Wbcct\![ׯ[...>{|>v� cen�. rFשSgս{we2Y (RW!fCx W*p\.m\!Qd4dP?qQzEXS!7.:0Z<9tPj8߬Y/ߛ8qbTT<^qW_}բEz16a„W^yСC%[cǎ;vd_A>Cr ?~ĉ`~Gekܸ3v5{^z5i3yʕp__=z\e˖ԘF,]ܹs~aժUvرzʕ+3z}y͛7 2e?_paȑ5k:tݻSRRT*UHH޽{SSS}Z,Pq D2�_'|1i|h$c2ӿx˅�� �IDATVA2X8ɭV+ z!F3oA BEyl_K7P`yAcYNf͎;VfM___Zٳg1ƂuVviӦiРA=*W<`�^իW3ƆJ%UZʁl۶MRUV=v) L_}С>>>&رc4-[(:ulܸ<UVZLJ$:㹺^%K^O:~I__cǎa͚5[nUTLǎ۶m|ԩ4{۷o3FE+y悂XjՈL@ PT3b0rՕfWFD&H$f߾}^_! WxI \@03 r`9壐Es^lʈ888O1ʕ+ӱ 7oqYfZիWwvvdeY>oRHb&?i*b6"YZE7P4mJ`=H*^>...6ǗjԨq XaM]Ff @+!NG%y͛ORlt!o q OO7n?)iXa)I 0وx'q2d2,x<HAfXZR|a/HumTsLuՌ+fE|yQ eX!^\ӡSQ R_T*Da96͔l2bi;ء|!##I&r „fpCo G= EBw juttJ999 %cXRRRkQAwu`|v>aUXKߠ⠶ C+:<4ScS"O:dŧPR?Nj7HA _*zV*!#udzQ /Шf )>6n4`BEFp(hm"AhٲK\SM6e6:Lf %'T 4Ā%�l _朣 #C㡯Q|uXT*7P5J 9ᑖ92| lh6-s產he&Stm27WE~6%=JMM\?tQ|0]r߈ 4t?Q<;v)%pqqi׮]|h/XV-QESt}B-H!ƀ—t3t$ao0r F08iRL&# I5DałC^P;6""%R$ƀ3bNNNCHµ@h,AC9> IK!߯hb" <?;>M=%vy[nUV}nݪ_~˩ȅKRRRjժUaXv5"7udYbL$3!º"Ƭ U@e=b3ʁ (dT*hIFD,)Jb6crDhfZq0IS&&D* jADbl Xj5UV1j1f-fT&ӛV$bgOH"15kf'vZ9/'66P^~9Νqꏝƒ"V+Yf0GG. 1Ū1F F$Ybb!VU,L$D" &"X"V d2 ƘbD&IRF#-l '+ I0L%V^N+6 VjąT"{DV`$jI92AYRzifH"WF/S,WԺ+OUG6)F7:d>NB3b{)孑K~N rlx,M:ͻD"yrɼǁM"Hi Y2bb2 f bRTKvZjIRRlMr@bpك9 UsJK+W9ڲ Ф"CdrPxVXz R)UY!B*+ dhorDy`0IDm۶={Zm2L\X2QB:h,A~bɤ` ATL&)ixɦ''Xl:^[׹(%lnC^U $ qQa)Zj:u Xvm#G>HKK{7LB۷oj"""*)1113f̨V[N:s}իם;w[lжm+Vh4+Vm6 e˖ɥkڴioP C ->ydF5kg~{\M6IIIwݻw޽t2iҤ={4k, QF'O|YY#N#R.${rr!с(_ R%#܋#?U�qD"CPaBc|eH@eO\ᣜQ:т_rPv(ڤIc~m~~-Z]~1ֲe^{_mӦ x1_V7oR~gggpjjjժUgΜi2^{۷5PdT1aÆwoСCD[hѮ];^f9xବ􌌌[nծ]RJgϞurrB`9;wLHH(S||5k֮]ۥKu[.99d2ݻwҥsڵܹsM6eʔ Ο?ߦX_|ѡCNw}g7ovtt򊉉4h/Zb>-66ٳuٳ,wq^};v~駽{999gϞ2eʴi7n<wW^y%66699<x;駟veڵ}7n 2) Ա;Ӡ'z1t'UDIM=X9-M,I\N1ͤSͨ%DHPM`B3[42� PW|| 6�Y}=OhV!*6zoa+Z @ ֞G˱'NL>O>>}zXXؤIVkzzzXXX\\ܢE=<<~ӧ{xx<yr̘1o;v3g<<<͛j*W_]pm̙kOԚ5kϟ7d'Z,;wn֬Y6mغu)SƏMD2iҤÇ{xx|gѥҥ҅ Vd8|pLLLXXG}tС/rҤI{_'O8~3gN>GǏ}H4qDv 8 XC>" <Z&pF(?z=q=U#-b^8`rp?PM$DhmXAHPPbYsDb0ZVd9-֭qqqᇠm^|955`0\vmիW?qĀ6mz'OLӧOۼ?00044Ν{O?͝;o֭[rrrJJJ^vzʕ;w<xs5j XNwy޽{"h F۷ot:^1bD͚5<waĈKLLlӦM=RSS/_l $2 HAudP __Г'_AP:B# K_םjbXRG*rW&ŸHӲ1 E=Jݰ6m42\1o߾zꥦN8hSr'N4i҄omBjrrr8OOϢoó͛76l8c X:ut:Jz<xb77:xyyBX,vttD/ *Oxi*d{ eM^BvRM(X!5T.M#7&FAlHK!Up�_!HF?0^q,WGT>Lžq8O LgJyS,/'Np &^'FW^=pذX,}ٙ3gԬY"}vb/_^jUtt4$3g2Ɗ ޺ukыիWc9w\LL ػ4CԿNՁX*r2v'_ކ' 4p΃E":="Ы!dC#ys<0PeC%QEn(ERJÆ {}!6U|n+'3ֶ|<{x uJ޽;<<; ***++;Gm۶ӧOY?)? ]voƳa67tN:m۶1cNkݺ̙3gΜ9|8lr~EGGo۶iӦ^^^޹s~1cx{{3fǎRtvӦMi_ӧ׭[or3gΜ:uϞ=KK|ر7n׮]2fWW׽{N0!333 iӦ3gΌ>|+W,Y򲲜 4JݻgHp}5jvI^OMMR 5̬UEjRIFVWV---`0x{{geeegg׮][S�L&1dff=ɉ+7nW\]]f35>quuX,nݢ_F=== ۷nݺT*~9ΝkذsIfddԬY]ӵZm:uhV1{۷oAIRv=p@T(vc*z:޽{:ٹI&SL 嗛1`yhN饂 ^?ݿ_Ւ0f2eEV*`6mOɉ( cl߾}+R/P;䔟?VQ*W7~N4qH$*@QT4......E1UVfd]nX\\СCظqcwwwoo] m͍$6d2YKh]ȱa7d)((B ;<-hbٳ ω`g{‰'W2 qO;wܹ>O`g9�EtX6]v}7v@*/}?Stw&X,sPAYH$zv*˱Ze;vC#aXkѢEy!SE[ "z̠LEjTiE>6"'''EqvvvppxB f9;;ё%//-9:: <䢓ӓ; /dffT*\Rx CAARtvvPkG-JO:Ul>vBJZhV+ b6hFBpvv'4''Օ=1/ "&/^ԩ++veX4M+WUlP':vHkIݻתU+Z-Z`ծ]UVMqppsjULib?PN 11QPԯ_FU\yQ8{lzr{*`;ءr`;eϟsqhmڵ[nccc7o~5Rٺunݺ jҤI/3grrrWެYu:]ʕ|9cg9l6o߾" sY^_.H ܼyի:uRTø-[UZΎ;Fq>|Xl2'O^tիe˖EܹS{?6lؙ3gn߾]a7zJJʙ3gxpNN=`ٓ'O ̟?M+,\zҥK۹sg``SٵkWxxxffjmܸ?ѣGSS(vڬYc2lÆ +W~GtÕ+W*Uk׮EM6dq8vXttׯȑUV-Xp"Fj߾}ppp^'M<{쯿… }O'NxݜGGǁΟ?Μ9]tH$wo 6lƌ4 ,fGԩ˗͛Sե$@%&&z{{WR%//O.ߺuÇM4ILL]6gBff1c*U,_ܵkc}cǎePńZgBqoo={Z1yR%K\p1>x`ܸqV7mڴgXǎ?<v0ƺuf,m ?o߾L1fdDDV)YƌSf lݺItƍG1v…%KL4nݺG߿{7rH &,Zŋ>}у֭+G|wsssGEףp!YF۷w`\FZN}}}Fuƍ}!BiG[{G=WJ,KϞ==<<"## aÆ  2Ϝ9#Y+^~d2%$$>}Z۷ҥKfZ~}ddd6m {YNGi4hJC֭t0aBjj}z'**?>|ٳǏO2%22RR;22e˖NHHݻwj"##BCCK\|RJϟMOOOOOOJJrww?|it(quu?~FFƥK7eʔ/\pڵ UTy333͛g0"##ׯ_gϞȻwׯ4믿 ={ߟ1)HFqe˖;v$u1~3g92"". c4###J<8q~M8qūW$cbb֮];jԨ:vXdd3IV;�ɏ?x߾}7n8sNjErƍGٳgi<y2))I۷ڵkYYYGuֲe˖-[Ο?ohc$CL0V4|#GX"'''??o߾ejXsppP*"`KKK.ˬ,2/tLVjԨlٲDC@@@PP|pҥٳgϙ3iӦRF1..Ν;b~ظqΝ;!ٳg˖-uT*ZfOBB¹s6lؠh\jMY~~Jtrr5YYY<~\-[RGz}BѣdA"xzzn޼Y$m߾]k4wwJ*zVEjNJ&d2yzzJUֽ{?aͭ[̤6mڴiS7m$BbbN$$ZmRRҕ+W%#* OOϵknݺ`0h477ʕ+LmJ5~b;={pvv?~bbD"ɉEnݺt(JΝ;3O>y!]5j\._bE~~hRJ``3gZlٲeˬ`rêU4`ˋCF@NFP(/$7jh\Fr_v/e]𐐐PzӧWR| Λ7O,_p!,,(C4r}9 ))ԩSm(=ׯ_~-ZԩS˗ܐ8~x-l5jԘ>}ӯuA͚5GYzꙟoSV^}尰>7*/ iGGɓ'{{{ƖR-ZL<9==t`0DDD{s|||ixիoذy6.+H4y͛jZofҤI ذaøqlSeg�� �IDAT6\x… Oi<yݻwJrqfdd9N:$kKزeˀ:iҤǏ6Iƍ|rll|Plḣ~ؿXѥ-SB'Ol65B^A֭[/Yd˖- -Z HHH 9p+4i j@ݺu'OlZgΜ˟Sqww^:cK&yyy9;;GGGݺujf*qC"رcĉݺuh4P(&L:ujXXJZ*/_޿k.X4f֭Æ #K+c5,,,%%[nz~իWJZ:tPVZm۶mQK\]]D"Z匱\reر>>>_~~k֬sssQ ^^^NNN[n>}ɓ'F^HR5j͚5suuUT2L$QT*UTQ$d2eff;w_~ժU[vIO.:h ???`۶mspp"qyɂM&Ӝ9s:vsΐnݺرJ*aaaSN]ʕ+WXa0j׮{Dk߾=(qرcu떗e//SΞ=[" 4裏>fs޽ IX:dȐSN=. DQCr…cU\H!*=ިQK.J'Lpƍ�8p@aÆm߾]޽4!.HJJھ}h6o|=///j2{ݛ7oRu'Ojvzwryyqtt,ǂ7ϟ7*BM7 18tPǎ$Iyqrr*_3fpر-Zh4BBᆂ7jZW7j`7gϾkZ7""7(Tp)*xSļaÆƍ驘zխ[7??Ǐh2C~~~tt7n\Arfgr`;РA˗Sܐ!C*lI =_r`;ءxW^zoҢJݻwr$|AJJJyYsss===c֭[gsss)BV(l�VtNNaX*'e2YHMM x:Zg, @aY rH;`k׮3r*UlZZmrA{xxT@Ċ.T*!e'en2 C5k* X,J+`kW3L7jԈϯ,jtWVˋۀMr?"v`;{Pb"222=ZzJK@ۡbaѱwh/VUTRKd2]{4RqK VkBBիW_,_J*9::p[T5yyyk׮CPXV(Bgee]r}""[jE"Vȍ~Knݺ+Xk�VGfPO2X,֭[SK* R*Wz@y9|M�{WP;vCY)m)`;TtcX]y}`[nݻwϾ/+Y͛iiie!ADJvvkfsћݻWC=ܽ{"4-G~i,󳜼6mDEEm߾o3اO" ӦMѣ7=zx[bM6_5>}zɒ%?~qu/'ի_[...*UJJJڰawQF?1h"r4h !!xxxL0a޽'N=ztTT>ڴiu=x7@ҥK|[neddL4矓֬Y3pf͚]ziӎ9rСԍ7{zz]v]`yW_ʕ+eS?sʾ<xpF\BF}رʕ+=ztƌ7nؼy3g̙u#FYyr<&&1ֺu뀀�|~;#'NPi}}}o޼I=(JYϿ[ӭ[.$$ &!553~{{{7kLV=zq܄c 4 o߾{qILLf,6y7n̘1CVWRE"f9;;O:?HNN֭[wUXϞ=;wɮ]>aK3I1lٲ FwFmذh4'$$ܾ}e˖l>{oFmۖ믿k׎߿ѣG>|رc^zzI&edd[nРAjZhQ@6sNtt4=bĈ[R3btss;zc>>>|?ÌM/ڵkSRRBCCkժ5gΜ͛7ϙ3gӦM!!!W^>|NZtɓ'}̙CAƍ6l؅ N:5wM6\|W_}~ՐLM6͙3'666**Jܼy3***%%%???**f駟<x0dȐ{EEE;v(,X`yyyW^ ˋ ڻwoLLLTT`vZTTTjjjHHȥK?'$%%EEE}|ӧLR~ƍO6pѕ+W4(**jȑ_}l1bիW߿/L>^zժUdm۶-t-{N0aӧOoذg}6f̘͛7S^:>>O?uqqܹܹsׯ_wP:8֭ΦY:tFfeo~VO?͚5QQQw _nݼy6lXJJժUϝ;s...~i||<-ÇiO>yn:gׯ<j9lv'O ڵZ3fkfͦO{_u˖-D6l8uT><dzy{{O4رcG>y򤿿ŋCCCܹu Nu̙2m۶;v̘1yCƍsssСCDD(_5~Umv֬Yy w5++Ν;/_X,**11}ΝÆ 0 H*Uݻ7|9QwjݺuFܹsEwwɓ'e.ZW_y{{'%%i45jo^,Sדzj{իWc&&& @z% nh4?c�|gg/bȑ;wtttrJ͚5w8W٦Mϟ!J![ݸqcڴiiii......E+ԫWjשSիo^&]tF*UJM4)4 111k֬YhQZZڃڴiqb]Jʞ={zM6ݫUlP՗/_h4IIIj/ʸe߾}CBB$Ibb"]A#G$%%/SNYBIIIi۶mÆ o߾MH*U4m4tgr_pa޽ڵ۷Zŋ۷o_nk׮Y4pBBB6mׯMooW_}6γ%KEgBBOӦMݻ7߬XCP\xK.K.?~|˖-srrj߾֭[ Ŏ;zٳ;uwŋ...۷_7oꫯٳvwwΆ+++ݻNNNnnnYYYoXA.@_9sQF|)חj獵L&Hs" ) _`0H$ЕY+ƍ+lŋᇝ:u=z4dBd͛7zjj*ѮZŅ:m޼#00ЦX,^v-c,)!&&? [`/Q3YfݩմD"h4XV썲.zbbb3uԂ7>MGLWy Ri\' 3ftڕkDҡC5k^~/:{W^MJJZfB 5kVx/'ڌ3gfddPEGؾ}{j7n\pwwpuu+C*x-566vŧOJ*Uݷo%iӦ˗ofTTTnn.]_n?ߋ-jӦMttt }'5m$3QzNN OO%KE?~&%%o}ypqq!+5k= <<\.VK9RS{qӧO=ztԩ3f`//,Z':::]z5,,Yfƍ;v,K3a///*?x?xĈŝ?yw1jԨK}ۘ1c/^ܷLYF߄ jժUV3f|~~~/>zm~7 4]vAAAnӦ͊+N:u.\ Ϙ1A ,駟F#cW\9rdBBD"y뭷c;7q:u}e^{m#F|rDDD """6n(Jaj*<<nѣ~~~~Iܾ}N:~tĉ5j󋎎<yr >m۶,^16}t˗mYf-_lY>}|quᅬ9B-}}} p¡Cr:u oE YY֭[P(H-_+,,lٲejPӽzEjժ .6l/-wrr2:C]/r_5dbŊ .u!88̙3={ NII9{l~ĉsM8^z׮]8p]YfjժUV!!!5jh׮ݠAf͚{%$$[_ֳ]vׯ_z`JVUTj2}h$h4RQ ҲAz;r>�owhD2d2Q)B2))I*֮]{ׯ_yÇ?x͛7iD 1<VYgoo*5jDj a-AfYƘlK$:lƪ=͌=XPYX 591FX,fY$EY5TqCg!,Ji&blVX 1u\ݷo߇>}-嬰fDwww7Bl@ш04^EfFJ |o ӫ؟ 488h?zlDm-m4X\Fj cCV\y#Fܿt~6_mfgqwK*v\'X@Qo\Q H@k_1Te"u=>nFFF޸q#44zY)~y_,3O)J㖬(,=n×i-vlѧܟ%"l…?V:t(% AAA%bBٳp kɈ K.ݺuV1bD١"0+/vIUvh?>vx#+~H$"l*GL+_L0|Z'Vr? eh BPg%wh|VhkRY[YbQjc&1yV /l~z*_>['�Y8_A=Usww/PP^ՔJ6qX۽{wz`;ءdO1k K`;%gg:<b?*b䯿ݻ7#^DB B9C_DbX(v҆$ WPL&BSAD"(nR R4{ZPT^=###==]]shH5EEEoeb1uE<}�(kXɨJRʫz޽$lk e8z ܤQ�V>VUTTJJA e�+BG$d2LU h_bZ)D" Qi0Ah0QU2r(hZ7-"LI-AHҷ( LN\Ni#ab8氦t�jZ,!軬05&).Z,TJ14Ki}ydOnXn&- }Z*қi9& 7b\BbѐTL&ZJB՞D"p@D"NCbb JVv3V^I$777ɔc6ay3aE`0̟YJnC tpp?~JJJ9qO944:.hPd4Qx_,BmXGyt(.@wD: t�d2T*5 NX,Y;Y--YYYr*ELQ,DnsB7XmOH$似GיU,yH3@G6.C"::-X,ı@�zAMo#E h 7K!d < !Zhb}+` R)'6gi2ăӿ8RfԙxaB3IMۘہHѨryAA)Rhi܎0(FH%1Rbc Hx<^=hVc+ LEɤT*Ҋ.60.fY"6E^"s%D"IDWjN}Ā L&,R=ul0<x@s3M5)>Wm[jV"X FFSc222Zb[żOiM&Ith؍/Eg9Hdvh$D Gv9ҤAqjUlQ$'%1NGhX%Vc G`�AL bD"fV{2]#/n8D[4XX ]An�ΠAbD& &h0!]Ђ AųN> <y7mC'AC䧧0 | [i!pv^#ФRZ}N~RT-A2aNbo@]&Ǫ$ڐذhFPmI!Vl1vgb_a$42M8ƈflܒvde Xj[aAJlch/tSbT*5V3'%7%G/AApD07ih  u:UHdGUSABAA05 A;vS8dbB ڎ$"RR @8t'6&G:)pā%2Xbd04)G(!#ѢO�B,v̡f:b!yJTZ[zD!AĂh8$n.ICEybdZz SB*)!  t&CkE8 % NJ0j~@�JDXUDAP0c0̒. ߌҊކo2T*^uDlerqDB8(CpPZ&"Y#ihI|FSGdҢHu쐾9͉ !P;a1cL&JLtPt: .Ջ & R[",-c+Y-6 pw #N[ì]vƥ3,I R쑅3Lt|)Gvfuљfd+dcRfefq,NvSn�Ai͍C xkU�L7D ZjJ`eP`"BjZEPMb^'�sE`�� �IDATbR};ErQ"grlcֱJr$b{tU7t!�؞ZG@nqG'H4atdȢ@ `0�y/81}: ؉B:B ZphB7#ދ�T*Y ]/ׂ % B�D71@ƫh<նQH{(FV4-`!a; [s!nt:r“6$+;pw pL`X@?Bֈki)U*UӦM}}}/\8jj:h&5[ðflRg4P,<Tnh[-fҍR.J#gA7]at1G׼c,rGA9^2>3^H(>lfY _+o] tӆ#AoJR {Yl6yfgfxVXQ&\:1<y_A*mB6z=Z펟a]Dנ6A %o?- k|qO⣼K�Z,F,Ӟn3 ~;1W 1 of G |d9^_+0AߢC?Y,RI?-Z6 +!(dvfF 3 ^ bx?3! yVO%L*S(]t1III4<zjrzfEW VY[ c 1!_p$�>)�]J77:u(Դ4X܍u;wg,=J;;7$D[&]$:_<ȇ6 8@ /FZV^2bUZEtT|Fh B+F;mKb@!D DwyL %y:dgiÐ8 4p!hBpA.,6m>5^%IS/Ȼ!8@lvarC_? ;DGGpGc\6.nU^YpcŋҀ{LJJ&MrizԩSw޽~V ;B[ zXؤ""MRW19<<pR?4zy(++[j{̙cǎI$`%rG=m0K~-'y1Q7JM&ȿ;؅=mEd,̟"J$_%dF7b>Xԑ_dc8< B 5C Nb oP0S<[A(nwlo $JC`qLϿy=Px #X)>Ls=Dw +i"Eg^tdmO{ļԌ x~EH2zfBi8z蠟Xh>Ƈ~ROTұ|-i"HV9F yҡVyP"W&4H ]vG Ɯ+Wlٲk׮/zm@#/Jоm X vSdtO%®lM贐)pO7 &:�,NFy~S:iT"@إῖhNh%M߅Bi9+?Lp3E~Ƀ#S TS5 pXWN@GcX^G0va˫dXc.lJ(i{yyERQ#\*iWoDi~i*JFAj.\:$aD  OcOȆ{N؍d*O!/=2r[Vc+|,,nLr]"a!PP M*z(  &]|Foyyy7LfX=;)C EȀ9upp -cnF l}6RsL`'cCf9pW";6Y(KB6+lMmr!C@E്mOzCx/?O| H`C4< |[!# HPQ0xi^“flxp9CJuśp |.A$#T+m ?=aV a@N.c}yEY"8;ꄇ([d33W6˥&IdA>E.`Kv`EdE@|nL3ɧ<+) 3 2Nxm駟.` ^ h#=+!!�w) 8'G='7݀xp)r!1�c>ьg ;!x0f`cV(� TI-7n0c$L,2tAe�TX]0Hl"yv[t(;�Ɔ7Wx Sem"a}`pUV& *4K22A |` 6&ɽ8S4bXrH$R 4>~&kG +Cwm\b*iH%KbfY1Ͱʍ`+׺Ӱb1}Źe\cDAg?lV8 |2F4'oLEO9uSTՆ )((S&o!P. pP;@1%SeɣTO^ˢHy-b5hMz_ y)H«ū8l1[dRfZJ6v_m6nmy~dZS4tc" @(ňC釱DZMX^BjKb G"ɋb[)牏[MaP &hPy?(o-u0W�ǣSgYkXutH,*tP}, kHD P7B-Vb+ 7/|Nf 5qEO !HdAY;l FRϛrrkJQc |϶kV/z-$%a�f㫃6(7gT|ZH?M/𩗼P$o2R`-1:Rn1e+?WU2&(ë|UL6ex:K“^GJ5fSxo¶0 +d̄B+ JeZZ-#* FK|^J \zl0{!|X>ܙ;x&o g,s2D,>Rau1唧Û< CI:$|=7|q02 N QupyUAtH}qE>ђw-,Re˸ꖤy<3g pY#W&p%D �Dn9Ɨ%L:»^n͎36ސd,^igbF`8zdoaz "mG~9&s[dDhA^ G>3\~Ml|63…0ħA€l]|؟�,I5 FȔ 5dRD+* ]L/2R0JelO0EkY# Yd6ޭ¢gI2%s!g$aې@ۈP\@p>!$B=.|meH ] b G '4*J16r.#A"hXJ\+h KOhBdŚOm8=&BaE}�G6!['.7,8dcjfVEe,y2GHE^p Cb$H;ԙD k|MxD>SU~99={V7ɸ>؄g?k< f1&)= $.Nj&,/._t}e3A XxqQR[1بT9.w 1ɣ[9ii  Sx CG7|\,/AIly#O Lgt@8HD%)\<بQ#OOO4 \&4!B$v_ِd �^jCzPH'TܡI#?~bXqRAB"At-u|Q"{U(V u{nJ&;JM(PcUJ 1>|&h  {d2B�LC܏J|\ p0$"><e&`~ 76`eWc#)^XSZ0^bvVZ%5L1Y3[#tDED r7VD�g b!2M s@WW!Jf4jWAygjnn.-DdS|l6)0 B=HFO|P RT6|-}w�+4VYHDU(R?1,01HN]0yVXo=F1W>|9B A{ J0$³X>B%PPXa*,4J׌�'B7tQ;"ρ%؄3Rbӥq+2o!A R`Ä*]'Q~dg9aZP '+|`@65/z14bKk"FP oڦ%B ERv7ަv2Oğ q6l�P�Г5WTD ><xFA_qawU|V?i0H"YBC!HΓW>ʃ4S> |PjlңY5"!$gYxj~ET\ `3oicB, 8)M&>/_FQP)6-EPO; VD FLZĊ'kL`hG/)$ȇ))* /쟕통@!$:IEV ȜcX,;vV rsH%M0H|Bk-'EʌO.!/e WWWc#O@R;kA2xLӡ Ay_&sYq6QΈ@nwww}X&>4Rh49D:#"H/L#ل322(JVd[IrdԂ-n<Dz pxH`4HNk |^5J~n [h30{ooiYyϴ3�U@QB V FD1NmH+ob֘o1vi8mQCvDePFA (NSgӳ3\W;烿83ֵֺ2'oBe9{V FbxB@QZD8,iE<]/řM?c'd -a@pF)(jZ\pe]v9H V}7NN@wV1,UB;? $ܪ&!*ed+A+|xnzjj%䢘[a�]9n7#`ل+ųa< vqYgMMMfǧEQy.vQ>zS;^U l(v\ OؒPjL2 2 l o:jy kBf0FEGTͰbYE�Z&Q!ɉ+6f3DEі(`P~nJHm*R Pd5r,;CF9xLy]Kӗ=pC=$Ivzt v5 uQ$ccNf61]xG*S5PRQmcqjaaT֜?3m'Z; N4K9a�{^!dYf͢|׃G˾�{li Ǐ8JF:vNZf3ؑ)O+Ǘksչ_ uƊhf%^_pM@ppZLa|)fW l]O+GU7 ݭj2YjeX3QheS4pz$ WfN@v+aMff4XldSy=&-OE7{9PzƟ__Ic'ks0U˲lX!H,ެ[j)ҥPY~Zaz^bql0:TSDu LK,�;`@Gމ )-ɝI)'{GézgfYfh581k(cBeHM ӾJ+H_G:]1r-Od)*,+_T߇]{w-jEVUͰb'1ő` ʻ0yFOX,V"Wp4 /�F)'QXu:QĀ 7&tJWetnT6UpNвCI:ʡ:ݥ''r6dE�ShEc_mAԸ^(;Ҿ=@*evN %y3�(w(ٓy Ф%97xx]1hf6n9|ZiI:^D8b@n^Y]n&Ԥv'F2cٽ:'M_VPt k/$]yjTQ5UoO+W+˲:LyW;k"Qi Hv fr>3 {23əLt:/8uvJY8Ci ȘjCoa.  dBM^|L1.QF(=|'28}`o639q(&*`y,h)`<NS̪n$~?-n47JߒKqu*Of5Npl|a3HV٫p_'[Y}լuRj:L3[ףy Cˆ4# ~vv ^A]`|xt:+++$D6JJgBjub )]UqΙM(/XpmxrۃI-Idzzzaaa4e~5LIPF"9F'*`Ģ鹽zJ&Л"YI<3nRSxrŀ|5_u lF֬qȖL6hX3/0í:Jௌ!]dzR{t> 9:~m۶թ{wЅK*~>ذ73̜VK>:xJB _=yu[a U3[?]X!M+Õ]9ynnux<@jA7_FV\mQ6'ুn=fKvU7})- G'~;y0 WrKYԋ6&i{c/2 `SjSjߞنNVb˴tݡ}5$V`AIbP]K@1jAQ[Ȩi#lI'XnkZ7IV&Izcz `R,..-zON|hdQ*f, : >8MT"ETB[uS(^4@seڿ( Uf=A=|߉hK=MT_ǣ.z=:m'p%.J#<h0Uo,2<@舚4P"Pc8ǎ۷o%:IDi }P36n'j.o!+/7`H yvpzRcGaŃ,!.]<&xhš:TaqnfffY*󷲐ṭ�X\dKex+hG9V aM`m93{zN28I'Fl_ӟ z'Uِ@H(,[�� �IDAT h4Xb<:O}09׭sɪҝ7LW+x{ vΥi Ht'w�BUKPAd\xQ$IQXR-<筱_y c|~,9^V%h 2.  "z6hee~O z:ljHTN!/xb+!Mfm۶#Gσ*Xb@=>Id{jh4p^ES/)VG$cKVg(r%;4U�e@<֭r"(`h \#grɲ,3|Dr+h,8CVi4'P>ZΖN BAP[&]5h֛[cgb HN|6yJF|Il٨U’"څf8CEt<㌍wpGV˔pu4: Fĥ8&< #0)29b%>kKNW,6AejjK]I (/тNXD77#Qʰkصkץ^ziAKkZd-6p-+9R e@hpT]{:ܢ*O@*秂A@Bm/h;#:p0qwa5un *ȞTnKZzݦjo-[+s]h(vT9f J:("P;R3 aPq4M9<7(dP_N{b T^(8%~|& /W'WIk'L!P&,S&yb ۉcIz5YϋOB @4c,SQLUUxـZb:r GHq_}LK3XCLH#~_-tN"o [ 9r?Ce{͆�hbx3m*N"rC5A`L)9Yfa:R'l$0ᬋEQX7u%ၰ,᳆qě]>q79 zgAMjms#؈^KVl\M}E1,Q-xNNy�xi_ラ#~H+X*˵Vj=r> TJgZQ3B\C_zTٓV<a/eY3R'h\u=gLALOOOMM-..8KKр*Y1&#gZ^^^^^2/BP),$cT:ŖW( nQnoff=&`49)AFf:Hk>.z4<m3H€u[<SOo躝9ܚDwGkj+qtπ5mY 0,^ M(Ul�4p(aVkJ]TϰvV tDsUVIR> yDB祭fDG3-R6=VAT/qa\T?o||7$) Y{8Od޽{koV<kS=+<N20)ҹ.U+hCͮ޻:�p¢X oF>�ޠ'|?edA+)G:B?tS:,,뵉ǻb`ǥn'=TuaXXNt׹i]hpR^ժȣ(E~XUxxLN<B!WoBW�s'@ՓZ P_A% }vyG<`-,SΈԌbʿ 5�伛|>.GaRǔP,TXc!dHW/Su]>APkՒHo#bɜAIژ'F2˲<z~#tf3nM->u*>ml#Ve(Uؤ` x( w40 -GR7qWSŽƤMHjPrjɋo%hyIg,4eTtyEvhVU\"ts>md9;8˺G"nmsXnh].?N,Y,Ϡ]6r`cړV$M=2ՠj2<V<jka{�K 9{eg@bt(8CrP(?? p_n60 ;TwzA4}߿CQ{P:~$]\oЁ u� E‰>)5ZZ:()LB,"ܾII g�K6UjfHLtuEQD7D,M 0?ZQ`A عȱP+*- .4/Ҧ7o:I}94xZe64k0!Mh]UU;r֘QbmmZ^.0qb|'J)~nybEՠ/Sbˉ>E訝!7>ڰ=233<O*]n)BHv5j?yvT(ޚ\@uI஦@xx)Og;h(x6*<1Vxѫuk/^[Q!QU'kk cME~, p'ݫn o ezՖuI ژ^UIIJxu@鈪 2'w4hJ褡oV-E(؍`.mڇRGRyZQw7+'z聖8[5DULU*�aC*;pzֱ>2e' eV5gl^xW\qݻ cIg@|CֺFa=sUTn骥yw:JI%)=$U!O!EԔ>j^TH 4WV˞j!$䠞g6 (t<ɬoSOV <('}y:TڍW4D\-t4̖>x7wb:4 CZS뫉 XavI5HP^N+/疍75…0>9."7N]tZv0цzl<6*N w"d!)C:JYhG"[6`kJ:pg,a,t(GG@n C.oV:AҢǨGʧ*/05N-%eYRQ/G9{EPuHḛe 9j9hـ PO f~JbO$!)o i:THg3l<c͋4bgAu̖pt ߛ7;jI[X^)Y(=_ܙ<gU dElϷZ-眵%mx~'i,vV"jKU^za:'�aP_IErt7KZS¤DMwM=hYRLa XMqK [\h8iDC#p˓X TUxGc+`0oVl%}K: tPz`Ĩ'ZAιԢ (:i#hgMGI'CvuSeYFO:DWEDY.'R:{4́-;uP*'ȪoDv {u*"ш 7n,:j2A&bn٭ZgϞ /7pѣG?K4~|m-[l+̌pèJiPdV׫6tݫ45V_-,>:j֫C{"GE2ij DLJY DiDe�-io^9e& n oACp8膞)PI<{f^7ʣn; 1#YD4cP%$2OFo}"ޞ%$5AYJnݺ,˅[<BQxiv1zlιڧkn:1CwEEAܹsϞ==Svω OEBEõ^~_k=s !{xmCkv_֭GN㙧Zé zYym"DpKiA!gI^Civ饗>y{Q?BC8i$ɑ#G;aNMMܹs~AV \j(uZV_tt3P\Ewv"*3 5hc p$Z #*9W\k0 n7ḬxqAb66AHh)j3& %hSULg'4+++&iǥ-ZE7]sƙhnjdgßsG\JFh4nj+|nn&JVv:Jg?|8|0dZ 7 c駟~p8L$Y ЖHAP_}aurgT 8*Iq leC}I3iWYwiu w7IQy׏,t~78qbqqOrnn-ms*˲ǏOOONczh0;v>L\;,aMIMr2@Wk ,6qs6N"rʢ6H@C6%?IJ`XmC\�se~VARԔe EYߏWc&-`LcpY�"-*ʜ恧ij0bvwydv(ȤLsAE~;ͿGp#WzkK^m>mfffvvkl("j"uRye38EXe$</\ũN *f<"l(Q2@aכ={mVet{T<ḯ6!{偊Ҥ! ϩ: e<ol18j`ymZo-`gKTuW{ jr6GAsk.[x-?~~za:r#V=vXARApxa045`z! hKfPC3hyT[^!`Xמ^p\pD2!54T~lkkDgbYaAFyR$q{gq??Y9ҽ[ZU_y.lFwJ<&jJJ5i_`g~+H  fDA.ѝWu@r3ù0$IMOMMf^iO 4M<Ǐ Uqfc.te6GιW't1WɝI|O\EMuFW}74Nnn,WuRҰ#k D&=Tf5RSijWC3z(N(훽(]ꋢp]u='~piX<^\h4ZZZr:^n'2.v;8"$hQUHǫoԮ~}h1w7S=xc"y?8@M`y<514 <r`0X^< ]^V/IgՃUX 1\ t"MYs|:NjZZ@a63===;;tqi4֭l6(9*r5(:~5x�bQ냭 vԧ>СC?W\n?<B_0,;G.w7ү×~b.%_J6m1g'1DrGչ,Jg .SBuVD{?:?a< qi|Fw7CZ2{MeкW8#ѯTcb`:R?d0~: 2gM-б[R<F 0G:ضoPjBl?^#L_+)~ Ɨe4c%j-òVvݽ[0ttwᢼL:k 5U\V30$j\ V nʽg7T7\þ#L-|˃3I: ^ںu+0)ncYPՎ]|/<kTUQ /,lY8g[ydOo$3MӋ./~wqȑpAuqJG!!fKxO A.ocχfԺSieLA<,G M-% jȎ 1;RZydE uCk4Eqsߺk{{޼r6& A҅}զjeQݲVjM}xOW]I?DS`Yr4~3C!xL_/2dVOVT@9G Ԋ8<4i5($?'K.9"w.8DQT,2zZT؊F|&74Uu'궁Am�uRD%Aa+0/L=R؄)ꢢ&HqIo\)´!Y;w6``/}jjʰZf6<v{۶mǟt|g<9? l=iܹСC*{e.Foo}nn^+waoGI͕W.bzŹE-q?U % xfO (<&zf^!չ�ukWY.V<pOe<7COG3tD+6"Ja7UUVZ#X@|mP3=d8֫xՀޣ# kA$HAN8dXsxSҵc5 'q:( 쒴Z*M'ȵ/ԲȲ7gɗ0 ]aiVHtlSy T8Ee]wElHSMʉs 0DU.5WYt-86{zXiCnonȞEO?3,]'u]';oeq A[[ZXZع0{xhlݺNCa5~}-..z=5_Uu 膪s;⦞3??Q98n?yX_gk*,t u0 }Aj]bI+D<}&UrXigQiaiQVkjjDQ WtWn `HklNOO/--ᬧrg [i?צxcX>U/ՃO{${R5IMr!p(I1:;ՕnxiET!Ul\}4?0(VEaK�U_6�h؛T>4D=ANG~ޘ*kACt(F!_7RSVkffƜ.kN<~I'γw{?`~P堆GSߟZxB׉M\iEQp3; Y/rayzYR3k18Ź&j~9B#"2)5 E ؒ:R,R^{#$yxR#"jKˉ uf"Xa06=3<9 U2yc|=KϯԳ?dUO< LТSֱzbp<<G25b$(SI6nHŸUeL 5Z$iB{ĸM?LeeJO;NU=N$k|r@u==ɍ>p@K-.2MH)yI dN^/0b0[BGtO>=qœמ f5]{ =ghoUAP@LMM ,ˊ;><ueWwιj,",X!lCo߉ YRz ,6抲*X*B b.]J8T>U}�� �IDAT]V%gAWVV6r6GMTP}aP3BEYxN|u3d*Ռ:U /֬ExyI9<s˴,g7+ޛ4$&iizl6 6Bzج()7U"E{x1`q:Q+v6UpjU+ (N.e9ߝ^=FOkwnh$ne9 T3d B z=* Jv휳 6E)vs>};n=8fO/=Fq?vԫ YIZ``$? n(ȭ`nv 9yjQ xlqjf/z>ɝ/FPyU_T0k7#h4{tr6 xFO:ov .zݰv1Q2QAǔAFSKj &($x�DXcJF/l~ªd!C8Y<W 2.C<TaKؘ$rhs.0^y ?Ƙ[ѓsGZH DqCOʼn8QE$ItzzرcH�s&af`0ิ�<==m۶s9y_ ^ч/=γ~~3o[l.=knw1ۭn4хqXX$aXŸ͋Ը  "=a6VZx7ޠf6:�̫|"XPUUUVArt(j oN]}3l$iMu <EZjt Wo)e<Ƽ-ek r@ jã @ ҹN@f94#2t$m<4pfܚ4R ZUW}\ehۋ)%] ڵqy덭% F51EEgIC+'EnzT[jc|6'JP4 eƍ~/ҩn}B0 ϋ{~_헖/ߟGGhK31Z-{2SSS6o{+k?r\砪JH(J,줛GuOI?%TNyqL (b?EyOU:rƑiu6>б`oCMі '& ]�y "& 7aޕ| QcmDDShZTm D`Y*i^Ssf<ʋQUJ?3.uJqUvaB=)G/K{ݹs_?77G⩺vmZFf<>9~ *M*o$֡KۦFsֱgtrH,R,hrl}C/mk֭vb5ve˖ݻw}_zܗMΝΧonɂgɆ٩թ+_l9l<ڷ+^{iؼa~ߠ$,<Z=mB(-({2�U2:x\ uo`8ZZXUX FP;4*+i6ιItS4`X9k\H\v,sxYR(uL9NBU꼢*o,V޺;0iF]X!˲0Gan9чsBbrΓ$ɩW~kтml;|PmX V)Fҋ1seehD#+0VeYeɉhIzԏՙ0ֲEQX3hMeemHBؙh0 P~<%wFúPfa޺uL2+Sv9;;E[|UVnOnûfw=q+++?'=jl6WddnksJcGqU@'*ۍcQأɐDžV-'OJjЙY)ZcL;S{,fEűQCa Sq,o264ިgZImC!Q j#CV giO('ga4׺S/4H &J8~6ȟ*K)UĪ6FVn?a)BR-3T+�ŵPiݪ3&0wu( wLvxfwuW <J 6V,rn =8 �m̿a˖-;v@wzGhXN39$ k>LϑviرC<3;SP'\TCCWaxwt=zqד:ݣ,:N1Uo+�S(眅cǎ�. e*D\pHzbW| CGhp`p8TE�~_[,2jaJSTX9<mGci sMh$}@PoA,rb1czzz8vݰ kʗ"O舠7cќ)Fn4ѨxIQ] ~u|:^-mi<r6O[ {" ~x,tg#yC[ :b٥:qЫթRVi^<=򜲼\^^ƖxQT0Bn@W vin߾ѣJ&R zjGG`X(VVVh1Za_mLpyyyyy?c4.9<Unn]쎢Wgn9tۡfZ\^rӖccFU7 Ax x걤کې[V lT_k==`HvehM*}0d 1LG=rz �k` zT MzUY3oi'cE蟢8:zs;55UU|C?3pz"]*GJ)zfor_"19`%9Տz*%Z26<ϊJQpOMp EYsՠ9 3oCK\dI΃^ 81m>S1}=noJgvرǎSƊkkiS+D"6+Ev׺>x~s9:t]w֗5x[o5k߭}E=}mcg_OƷY)XNu|I�BPjYUXȴ%l;33G}LfP!z8띒;`:gIf1s9乬3uYG5T_ MXmKPQ)['Xk@!Y6hq<==}Ǐ/--+{aDM'":QH ,N+z5/ACYGA4R jKttLwN?t?oK*/2{_VVk1GIthkk۹f`TH})T:C] !nYbG0\ Vܘʘ⪍j77tgU[ wwKܹpT]ݒeY`uT} gI'b* \*D ;NcA[xQ(W\,FHO*.L[ =9t͐Q3-{^8(ScRFA&C uNi>xUWb)E}Գu|ׂZPK .x3o}{Ǹd=_o^k}NLcUXnb=UdSH5jM Z@/=UVdj{d#);;*팺-˲(KITDԺf~_:y:N~JQ8w"@�0e53v:K(c6Ivp-I'N<i78k-뮻?cDz,[\\}tl�ql NA(/T֒i!'<: \'uUur_E֡ԔbhcT=r!g#Ѥ6^W_ &Ni81YᔴNZ䜋i߇]e"$&Kc]D~Q2%':oBlEG`Gey@6c?A䟫�0Kh9T2NIoS;+.)Zv`ij (LLn|$ ؊,e-H1-eq<qFIhaa_o߾`p'Eq߿Қ-hc O9;�兲ȴpcąbAUdo4l6jGr\+]qo祥ގNe>SQ5vDO=([NEH?*BN5}hߨwmFy_Y-9ywjՁ(үU)w:(=;Kߛr dXEֽ f%Mݻw0g ;w:N#gD#XmIHuHjnLJh'I&u1䰇@8pMrk+V.!oQDF8ĜAѩla8Y20|衇< DY2 ս.8uxy:8\5DG&)gXɩ/&j]Eĉ zYUg'"( ~^OEp0I"I\pܫ# &I] &Ts]Ƀ(l�lUTEeq^o*~#wzUx(,!Fp;tqTc[mWN| x $1ΰ5m3fU?*pb=BkwRh҂�1ФSonhaX<1r$#SQNd|G' (qJhgR9j̅ڰ�eYt:!gae9;;$Ғ DȾ:Mfi#(*G*E6}EKHq$*/&yFxrڲQ1u8>4̝ mnD}f+S$IT4r<WޜB3nλ uPhOӐvb6no4lm C?ND*\ĢrU򖤈 Āz1MHض(>ʔ<8�:AB H^isnxzMU^]<^9,,ʿ/RLV$FV=! lHk1ϱ oŖASC;FV{y)IO&΍2M*Pʶ0wN{){zAjn[m*֋eiѨh߳<l&Iж0<֯nc؄W٪gJe�$XNdX-' W]}TlӶHZ**z7͐?hİ +z\RapEF7EYRRUj7WA;8_U#DIifDD.4ub̓VIw]ZkZ̅F8IⴢxoQn<R'B8Ny:;es6:M=1âguVe<�-b6rQ"Wrʝx5qt"s#z0& 5@ JuhO&r(IPn${7Ae8KKv{kY^^솪*&ވ+*hWlFYjZWɧ;er+y(}[ L/y7yUqs.g5N<yn{aUP!p^0cUHHb1gSl {5aLY߼UϻL{�L^UxHDZKo<O:餽{޽;x] ~ez #eۊF֎<lVxp v.-----۴;jy]B!lU=IXC!MB:j4A:l+eڜ@z=`"CXƮNu6 '5_&c{ Z4h+- dL SS8s&Hv'\ըVrb~y_u+nV9Ҝk*; #0/Q)̓Ԁ;iێ 3 ƾBH":6)@$#x3B-xОV'WpjvK.Ko|#>`9_s00`"LM.224.ɫ{RҖ#GJ1X hQԧ",tG>eKl@8 1ͦ*C!x.q5@N@?>q Ā V5YVdbe(lkUd`'eRYh F<^%0KwVI8QG z*l*Ψk<=|5gɶd[8Yv+X+jdl ˹JS^SBJ+kY?s9 /N/..0pG*Ra`V~'nچ>UNF\4TG5,ܤ ADBLTE$YڵK_> j~~~yy'6{phkND �!TA5amΟ K#?CJڹU\UAmvV=ă"MVX Bm3l$F{o a[ ,qC'6𗶗(zTƑ1 ꀡ<mU;קg@];dcF߉.\o|;<z?nfWҩ)sO<d j9Hc 3Z>+񘵈ZPl򦔉<^ %&9YsvOfT潒#8:41۬u^'RUr 8Ć\Z RMwO `%xddͰX@%;X ԨgzXp*qch惋ιڭڧj 9?ϻs\“aboLJF34pvUMX�h'@{:ب4dNM8]hy+ֲLˎ#F ]Axg8G+-W][Ԝqyڵbamy5zhC6>[8ѩ ):Aea3Bk]1Y3i+(8CjIDE!ѣG<o?f:ݩvX9wE_C_~r}EHvG:ͣLIP]w#:@= 5Kh9:ChzFGOuFOד$ɞ\Rzf0!'s՗˾_݋ܧ\ek7,2U)if'P`y)�h`5]ۙh#8JhP}ϳ]k& 6Q]�1J <I;ĩҘNۊQw;/ʰ4/�<<Ѐh7wQWj 띐4YE8 `b>ivBj8ZSG]ۙ�<xESUK Ӎ,`0[^^6zHV͸#jt舡8dpȺT`gJJ K(_.ql3JehZyJ|^%4<BMuM귟ۮ*\$^+I~?vݸV(5~l8(wM4#&N,Pf ÓW+È)#g*NSu.L$:2Dnkx<@E< uʖ͏5?ʆ30 ӿJû*YCȤ/fݪx=qG-gxdվtĕ$@0TMЬ|L�� �IDATNT5md:Ӯe+59%E Cx傩vm +!bϥ%[:HoE'+ ]PhjCbdLGn�#zzVL/I<[`FIX(Ѷ<da1`^h 9WpWxYUU <kNVښSr'w-͡0 v"QC$ڡQeR9ۥϕe_5=)0āR+A*R1\{D*1t>!J炧JOVNѦY;\JYS+n޲z0 M6Rt+t*+|9.V -R"]9,,j)zﯬWݵY!9M^o |wFG\@4diOH_ry&:( (&E^R^J{:6AѸ oo}kaa!y_^Kǀ�)+ݕw ;AOT*:h@{U E O)7,DS;=j<ʕT,2oZY/z8C !JSYb5PDovFj=%2Py,#5æ8FkV1M~`y.y4޻[/N  ]SXWq`Sd3&f ꜳOBznSsss5@oHSV_; N&DN@3F79*pK0Y9bhme/É=Az6MU:ωcQ$"[ 2mg8ӉƆ]'tP@pv'r:bW3e*M`3ܪ!v!D<PI|Qj\'rg:Uc܃v]- kOC1Ud{k( ⷏Ro9xy&ղ,B2�up aWnEiBnjPU l2(`rz {WiUmSA3�%@hsQh[<)͒'Sl:OH8q j_:,k,* BDUZ㨎ydU2/\tn!"ӀH?'t3$~Owk+S&im,&D~ | [C8x.;\uP^18qԶ4) E'f2*Fe8m�p|-x*73wpf֓qptC/9F{@4۬*\ TJciJ?Tkmemk[bn+S%*H?ߊBFִ'{O{0r,wbJ:1 L@5-*{HDTGDjx: )\'ZHd̃R#ъJ�E h}gLOt[&?&v2EU9) 2k™NomIR{+X+LpBTu&56PHwv�ڵum*ָv�Tghl+PhX&܃i#PT ~&1$GasW@'gM*ZOqljY[]EqL* F.uНGis~K0--.!�ގRB#fA]x,Kd{2Hԏpmr#J%E!BN6iTě659Pa{\QMmf[Hw@/q\>(jTIf`<=eeovov 4cvU-ܿF}t[OSyX] 2Kof 't<Gg4h3"sv9 b#*,@m:nwFQ= Ѕe1>M4Sga#oO }o }jcL;N{?vh�F@@r84wA@kDukUQu`SN]0L z6玬ڪ�6< bsc~eiGAq[o~/2>g]rUO(X$ K!l>f>#柆~MĆģZަ}Ϩ%~e;Q0 o kU$H6fIνgg9zoaX&}  nV�'7uLQV~ib9>CqЙM%(N }Z-"pL8]CP{輁6WUUvE)mF98)=ƠpL+ !�RHTMNK^өUeVoFU &T`Ł'Dގ`|ZéPz4u < (e1k팃΢{=O-G'GFm</"8ͦJSz*Fyiʲޖo,7!1FG)PP an߾(ydPx?MQuL!5[l^5hj<76/w/w}/ «vG/S,fttMt8S=VRl0tmPkDAKҼX%�Q]"nY1[4_ W0 翚;7Z ;P+uPl O`*px9rbi?aR*'@$ o6綧}rtfvǭqjSnpmJc+^9 *muȽWll.+3OOkEjV-,';KڰU c詼m*m9ۤGJk*GLe6wak@0l$cSI,^7F)zKV1'FXx-_Za7T~8:CVf4c4SX:"F 41U7ׂK?gW!Y0OQ!yG&w)L Nlƞ,z;Mhإ9F}߷X[ʜfIEc̨d{ZY,Ԇ6<{Q`*~auKUU56DAwjRLeT/+j_uk 7ڱmC )lea鬬l)PY jƁ>Zuc^PJP[MF0JBoJ#m^&-Xd*v|$Q<nyU˵<(` Uxzb7ԉ r#dndY#E #EۂW'Zj 7ѫGd�y9+O{B5Uҝយb& p#aHUuP5t2trLTH0e֫h_?(IADy+*:5g=Y]v(C΅r<dZS@hL[-@T'  Ϳ9 ø˽w^^k߷iO" 0Rm<Ut ~gS5)7r6Ѧ"<5h+3r[XbˋŪNj-'2eUGUuic<k FX; yrf쥫F5U[HX- WUNRNLxd* > ؐz2Ҫn�;$N {@^jybd875Ak)eȺ_Z1<&ר6wBjlFǛtDi\9@]38묳gxz`6I DMQ5XEd[M_Nڨiø4I{_v ġPTHm4jZvMGT ${J@B ͐:gD~5&30Pm(x|iOG1Fާ޺Zcǎ$I89p!YRI`n &'-duJ&'m(R]vUj?t`qVROFYi&C[S]fÆSӁP_'"."=,'saG˳5\' Ή{)*ȧ塬4>%MhWPԺ FOfҠxj/VkMײYh*Mk-lg4D][[暪Zm{s/iP̥퍜G}QQa4==;tp%mNMaSӡsSFėÉi Ų6p1p>0HJR鱥iy+erS$6<EQtr==K.iA鉷kwۄܡ^FET&T�ʆsCƴL(=)TSRi15L=U/e1?OCzkܧ=޾[o=D4]Kj%:L4t0 kԲ,;Ussskʪ{¢,&.쁫", .>ZXKM?F8zF %驖Jʡ,V8v :Ps(Pj"0"#K΅jW7I?"gZ {Kz02QO vӔЭ5]Xm̲_8~8 �׺:åF#hQ_j|w0;*/( \Ϲj<bGQ^؏D=k;PDӾ=Ri@VQTMf.@n -(ɞZӍ^EwuUhuHȉJ3-@ Ǝ^c.oUUUU`; 5 ̤}U?2 cѝQl+ߪUTeO/ZE8^Wi�Q)k&uf ,&&@`Qu΃ʲ̚P@:l ?k K`p'Jċ09dV_]f'vTCMv1UEjQ17u2qIaJyTs=b ]]W;:ӰA1l8_8p7b)[oi<Wh#(U~ߴ>n9h{Te~u\s31䍘XG-m([*)<3A9HԮ!%gk4AMb}WU \Umwܩ=F#j[r:ĜIح8QNÿ;씧A4{3HeX;wWBuhHQy("&3z;Tֶ4{ּ7k=HyO}@ yg[U/W*3.|"ZHiPtE#UX%U2] ؙk 魕j:gYeD.S:\$IfTar6bB:Tp `gښig0d|`O=/UetΕ'ʢW$Nj1ᐅhrnml ʴ]Vhy^uNܑՠ4Tu-Si5TOz:~6�[e5^ҠH �9>JI|gǽPvh1AvMu5 *gS+OA'"TJq1P ŭʗh:v"-?FNQVk}<ECY6CFmݠE'sR22h( d3x:i#b-*NcCec.6ZíVCYFUz : )*'n�N= 2(g$TRvJEy ,PU�vѭ*_&OK,'d՞jA] $CԎ y*C0>djass.ߓ?goҷl5\? GQdm}*ljbUWLؙP7ץ:7qPWSPnMx:VXRuk `i5 :EgHQ6/O7zH}TBl <ٷ͐URAY}.: .~ӭ6.1k}Q1\v#MkK2zhA7<(i{ʾ~8(j_E50)}0=W-*NE60on(Syjo2_o45 Hìr 7ZI#B@s3<>+W9jjV^RO(ԄI`ͣҲG: đYk)@͡D,x\Jzs ~\P6L&-B] `RZF(X[q$U痯Jțw*D�=@_MEWP \ϛ!gcB9:3Fm$ #lO+*Ib�pىNN2A9U9YEneKN|th uqokN-=on˷H=.#hw@@QXX:d;2  v1:}I^ WR=5]Pfg<e/{Çy_$$br5tF^j=caιiWL댡=X;n Nd-y *<py`_~ߐ.%8cmhѠE ZG敞ڝQj <xLuG}Ug=�ckh M쨘9 Lik/x3l͐Q<Z=rX&bnoFF6{qB|:I,58rڧu0 (EKZ%7&,qv= k OF",Nf#,O6ޏa(*=xt6=43/*�׈CF(ʭ>(rh]t//}{o1>yCBڐcz̪�Qsq0)]nӎ$qU Y¹t-+<U05As8.u3w{_Z4xoJ=b|aI]U_N p_Sr;nU͐#yz";6 6|.VgN:~@UU v8ARNb{F�J뢝}Q2zE흈̓U)X*K[t�Cj8^6HkOgff,[^^.f^fZ3( ^U#r(AFUh:f ni;rl2q~]>*7qݭP5ScIJ,n{}۷>t:e_)*أiyD&vU&oʤyaѣP'jk.¾C@_YXNY)0U*gCd!˱*sDv,3F %fCX.,-{/\<U 4ZպnߧX)Q<137nE`P5'aEYTuK9mňFlQ2tD_aY.dΤPC_g>ȑ#g:TtRJe1(@AְR~am`{8I~gae$nj1A_1ĐME&WA_MLb\D"P�afa~o_u7O;T=}\~eanQ~A J?giBJHDFݯw뒩LE1<~عS_WUcK{ bEQ/w>qowW]u՝wv9.jU-Mt\c5=$[n~sw7iO\e,2zkuhڐ:XW6մfFmtt+a^oLmqQm}`~?g"E%�Tg9V-7 ,Xsz"GΊXo+,ۻwmg:?%{( t՞Uw>:{]l0zyNP5þžL`4 *}* LkZ't'~VW fʢ~ ! 0jomۣj'{b<p�� �IDAT*;7^8L4jg®/""mj:5N3 o/05 okւA`{yT@@a9jE?_UD#ynf`됡UMjE Qsιت8p3.XrX~:05_4V_9733c]/Xa1j(+0r)]-3655�]撮bՈjeFޮM^ÏfGAQ70f wզh4qIlg9rCʸxFĽSogA04%Ur@lht^!z^HڜLE'>fJ0N=r#7xc~| M �L,xm$dƨR4?IY.8ׅUQ/gU ?#=rג:h{U?٪f|Q~Z^ο2Ѣ d*81Zj Zamuc%#+W^}]u 0X:zhxUAiPի/R~J)Թ.TcFSOu~<AڙugޗraC،$N; 2uRtƁѓYf{A{c2 "tRJXգCWO#,m4=DM]=rVrXz(yamK-&ET\$U^J8B5f0H !%L4V(IytMԻ~{キZ{AoAho@'u"OxZ>D%Ե[eXHxjQ{AG]w;qsUkދ !*!-llӅ.Mc=@>,ue ~~? ֤-Xq]e}K|v%[dg߫U\0M?a=쌬XQn EQ`wHZC^o!RvJ4`0v}\"ΜRx"uZH-z q*VFdQSl[:: P37zX~WJ**AN, S-'D "ŪVQDd۔eqRJwqQfdK[7p.p"Po^o6n sVް 'H`qOqz?|Msk}(*Bu8rNZD61`ᶛ?Wϟֿ:~ug?{'aKz)yYO12="քBUZܴiӵ|4ӽZohp$7Z}6ok.q@ruЄJB]=i֘v:p+RsVk0>nm ؚ6)�ߨaB2 8-jS:%*oESI"\xJN Y'aghg3r:5ׁ$$N<jzp2K{@YLaģVR2 e`I^抹F c\ݘ o>6ۜ+@ _2vNS/rُϺEEM@*|vfs~vvVЖ/.z|.pG@kcz06f/dJ,Yi\DMθ^wuϦ{Ҽ⩝SOzғvvGrJeuh shh(58Gjd@' F(O׈@@^ ]=ɱa(tϣ/jAn-vԩN2ZϜlb{�e7(:KTR R+ >(ui)oWQ3=جɦ٣M2e)*x2:WўڏVc7?kHkn#YavbQ*E't ?8RkZc Sl6S4=ꨣok*qap 8xc_앙s]w]L/%_MUOwԸI{ywC/aXVc oطofX9f JZū}$`Mvy4Ǩhd}Ah_G#ZKad&Z<t_NH }W^fXtq#|![(75`#6*kyՕZhAͼA#qޝn* XKT6()AQ Z*=i {QeOzQyG �kcEO(X:,|4 s7|XQu`Jl6/x-Qbx,'٥!I9j Z$3tތ}vDQRZmڠ#sƌ/%{MQev;sn|]s)"SY\;zΨs.)iw |PDf3Ppm9{V`DEYnqS<T =b.l+4uzQ"=uQ3}{wQfUAAkPU%12k@%tDGfR*<-eqW9M|LYB*{:Ǧr2j cXTC SU9ްꑳ¤5TuE{Ӳzr|aZWU*S>4dRLr5/BTbړ/22j8V5L#/<vmQ6a9NٽOjv~q>aw ?LÂܠ(@)Tit;UUݰF+ {0FQ&̟7onFipy49y*ԨnCb6x4-'#*sҜ^qmpװPcB{ry3&Î[# r,RSa0QMV{CtXQnKzǖFWW]U=s aigI<gc/Z=rV漁iJL%{5Wu'' UE^!ؽ`MǼhFZ'"PI`dtk#l1A]$!jը^O̓mA>+~&<z *UEQ<迷]ü̢qa-�Yuk 1KEA@! 8UP&r&uyFJ-O5y+ًH4°$U& ޣ7!0�V{^n%OVCe>U6&UN_E\62<z};nbP`2BˆfKY{NAmȴ^xl9V ~-# Jv@.RJTa2z[* J%RсI仚$zI"/>`A::J 6?. ru#-kȇ؉AmOE2rQäVQ.\֕()V-H*�M8':c7V m;KTGW miy:5_44H,>R+WXñv +Vu> Jm< ysW(zi'[ƧJJbNZ˕ NlB2z 0;u�@-Vf\nrŲ,^ ۮv<>4k9755e 7#]B&SbA u* Ոo%ŋ*0oYP cjʩl^ENcߓŢ!0{W{SUPgƢ(l@e1dd-8 :zhxmHгQTQC -t0 5%CghCZEWF#|a_Ш6[ t]ύ&e4JK ^&XڡEWs͚5ZmLCVDO q?LCTJk}vrVzX8$ΖhV޳`xb:Q^K+>Φ2 UeZ+O '*2nwrbnW>h1( 6ٺyvrW(pzsi>[N:餅|<MA(d]˰ M# '1$4(+' B,j|:(M l력IQ0rj$C4Y#AklfYfEesGh-n7�T)gy_}yN.dS�uIU/hDd�6?< #GE SVw+Uy[80Q8$jȾaN&eּF!~tvz+MX`kê$ZաDR`i_1U+9d<Q7cw9z l(ܽ{7`r`c#<jd,]BzT57iDگ-_"349l ؇FDPܨ&wԃ6hXhh42X-xvA9=r 0LNxAJ˾L㙴#m-sLصىKWʙچJX*GI2D GIA/Lՠ?'jHSNso  / f_1C/B2[D~Rl jMOG>@W./.ɛ'3}aΓ®VGc,s4IOվ=WEO_�T^>Eդ4�jh")=:xz0FR5gyڜp4'Q?KTK M0ٽH GqUQh4hF]屫D{ffFfTvŴ=\uO=928ttwu.grTgA%#8CS8BDUO|P}qʉO"U-&j֭k& VPUIU6'<KRam�խғI裣Vj? XU@O v"xSZh�CUbeb5u5wQ3L՘Wz.oG5 AxM2C�j&dHzڄ[IX,d SaUTLM5+{ u2C*n^5p>a dIH _ZCt:<1=F d7^ a~Xd9fPΆ|=*Vl^>QjI+?p7+qgOi0ؐӑ9Cd: H.FOE9pzVȰ tkƒn,4iEoD)y<~o a-QQ1ף6-/L9D9re ysx5B *9N.gg- &R}:;'3c8r>>sXqQ*|(ly+^ۗ1.[@G`0 {dqٶ4:NKIE x*, >M&v$ ҎѢx( iqFԪ|YBͦ(xIl;âUL=oVFdG;Jx&d0LPGMP4*:>O4U^E1qbaBٷ˹(jb�N)jG~>\T-=N#~AmIxNIKzՃֳ@c[)Ǟ\TZR}G x\Vqzn:`GP> =i>YejauK|6ƴPyZyȶ;8XJ�]whKOy &LL-٩iMZE^քU;t]Uʟ7nCTʲt~/l{rؔ^/ɳWd' kIDOuy/q_n}i$n`A$T\-sEA{<boZyrl%V*Bݺt}#j7c_ⶾOȃ  K% "f0 zBQO\s|)Ix698ހaI E=4u؍tMWR(L$ۛ5~y_<tLف=LtI=ܔÇ{d%өE60j-*qڈ2,3ʵynCU*{L̗iP:D ebDC[*ӲkQXa*,>R:Xek`OC-S^d̵lS\1Faݢ@|J"R7!BkbC[ٶ'iN [s\PQֵaťfO+z_U*9 +گeGZ*ˏуsgX@Cꑬ0'-iL5x}/Wg�JglI'yU(,(%LxwDƣtUbWl <�@6&GNO1D t \t0&۴Ճ?QE( ,]KWGrs.YED(Qy!,\O(8#֯_G",aN=!H  W+k4NGpUJW^&)I<(IoP{o̝sCVq<,JTr`C�-zoki <UTiNgm *gYcj?7ЌQeYFraZ<j*Yc-Z۬ Т~\UnBMhզ98(EzA pp ^a\;fe˖pn '\WTd 9ݕ]ԕH??3-sׯϲ2PH0Y'uݢFH,8}5\VM|+^=rV)N(Sř[ʲLnMUtezCQE!'?.,,R7O#qv h>b4kPJkjAHR첁qzn5A|Kk `zW+닙yMAE_`ٿo[[^ˆF2�%8G1͌^qGr 4^6 nhA/zQ5,^L8/o$7qNA ZB/MaZrTLQ�t8_AVJe0\敂2nir"t]cm0ʲ,qV1j }8L>(ErIU.ԙGz:`ۜ>1ټG-Ԇ/V*Ap^XY# *JzБsLUxn;:o4:i>JOmUqFۂ]v߿ʑꤪȋt㒱|TFm [ʤ{8/)?Q@v kgpZj08}Aj Xȏϓ6MXXQ)bvZ蠉`ssPʁ _qI * cBSћG60}˲ztsDmGOEXŎʘ@r;&OEd~?GÃb|DAZyAIGT^a[=oQw^4sGɵITEp �T,zf) &U}S<7.,,6D1 %(=+@$ue20 Ok|-jggy|.vT g/Է֛jOa7r Y5z~<w| Wl+p<L1щqN@~nҔtkBw4eSnR:ۨ䍯6<vJ C8w^Ok֬i&]ev-RxDXL(7* 2%p=*e3RS�kEzwVD<W^9??"Zu453!ENiCͰ9,k=<O.yuHhEBB}Q?]'NE6rgUQA21m11 GU^58'eȉ&4 OI" S 93!FzA,(O+Y.>)F8�� �IDATTA)Ϳn"@^�**}`~v/:?~;O}g*OGO/Ogot⸢<kgx0tEu0`z:JJћ{O0t!lC4$Ř鴩*yO_a0+hgRƪ@m+ކJN}{2�Yvkv y N (<o箻{M<gRK{^*!2`eON}fUKut=) 7n)[2&/!ϰ[]3Pԁ|(]Q8`='Fj Bj _7ravL6:z=3[ - RuJS-+{2JCutKqhmkQ8/¶f$U:uud&;j7Ԣ,2ո$9ʵ%m6OI'ըWoV;O_/{i4x3?ɋ|07 # K~{*Ƀ  Cv;ٟnQ.AE׳ZAg`)")# [SxGUv,x`޽F/˲rU {ΛCZU(&nԚEM۪ZmtXtJIf*y75~tn6$S}*ԫJa6 jPSЯ|b9<m90vUJ(Y~Z DŽ)�D>6ΨdsYP[ꗡ 5oW3SE>8.:Efrah_4uTee8!+n}?v2t}W\Aq/.s:ȩ{F$}APBaQ7W4\֭[iӦo^Ηkꑡ`.>AVʽ}Zvmժ%_MV7VQ)#(xgJcQ%˶VMMMz=hFdko"ϛD??$),xQ+`` l^K#*ֳqs2u(9G?L4%use9;@s: fOi*e{(@|>ɷιYqv~!e+BETcZP9]0U㝍`>pegQ18܂ՍFC%o,Vy1shi;AB;UgWc0e3y yߺ 7/9GY'7Z6x2JD?lR?g65 w@jl7i3e6lp9ٳg~~^iJ;TO:ԭ9?ퟫoroZK_iUU7o+zqi6 I]Ca=m;r!/~ޛoY : hG 7PH]�?MWT:UKXԿMYqE*lo=?5wX5Y] ; uv vcPsA;.N?FO9;I暊jߓ ˈ�Ab8˲|CZFEae+.~Pq|. J"^FSup>nrwn0 ׅWeBR(8SQQ'MS'UKXrjeEY~~A|u|:ܢ8ji-tW@wh4x&�yF>x`QEY6D«D4 V~*<vZyL7|?cǎ~Uʠ̷.A+1s\mU)fyovmU)Yhyz]pt 4M!DzDOB�N~e?>oeL^T4CFiʽ@Ѷ[&UZʾ U5H#ܸqm۬ wιBfOG(P.K2nͯ\aJRt4x۠fUUFcƍNgff+j[<K:FE8ڹE$ t=#ӑ <2,W4nlTUev{Q8p:o{lx"dֵBlԬ Y h4*WdjZkAPXBGp `zl@/ d޹E)7T)KU0 wcoyG5j₻'M9?՟ggnz?eK3yGu;ſmi[]TxS۶mӖ<+XYc?iбtRݢ1N8uTs.z( y[ iJ�Ju!fn[Y" P-H6Yyv̘lQhNϺ9i[\{H?b(JUAO�tZ rvLMMN3D8zx!q۶mu{yq[A-eK )LH5q"Dk uֵZeUڻ~'5^kb:I 5d'fSY{O#H!o] ȧ}e�MwtjCщ40~,02 RmS׮oNFn[UY;/߮Yyu\BU-IkbzT.t>=2wYIhVpM4{ka.OݤGri[sh,2DnCBVNx1hmK˜: ":ne<qS\a}6&FH & n)r) -WX!i82ǫ6V\0$qv333+P[tH"@�SҝO�+bt>Rup<1w:{w޽:E l` ǐpVO=O?եP%ru"вUHE ^0}kZׯ7WtY4p|*Kq%T'F8'$3q1@rF-mVr)Q |jjC[E(V52dBtUUNGǁ5rj~S]'SqxJ1 |<$i V@L:i7hqMVEnNоNL mdZ8#IQ�}_! zZAfs*/K]faMh:DACEL7YmNbeZEA<ERx.᪙q-Qzbn+3p8ܱcǘ>]e~3C%jl+47 ¬*(ӹm۶v=n%"rH#4G+#jf5?G~A>uԺu:g>r˵^;??Ɨڙ55y- ~l^tTMn8J= K5;I`o><0o*wssswB{I]6I~NiC§,#s;󒭗7D_m97,N4\א P t::l[\/Iak #bдm<u6!qVYΨR(vFcR4v b:�=V 0/&9ȅ8*1S9T)"W˶g|^Hj($Wc8ZnQ)Q#d[i?|RعcȢPU rHZF^7"]oM ޽F{g۶mvdv?ڭq=˲4M=gF*ubZAa(Fj>/|iV^A2h>gOZa)Gjj^9ap7i?l[4U<�^gi0fY6lԘ46Rd{`y#g~evE-uЅadU&e)=x8{J{fف2/xǵPrٴM^ 9p!.!J 6gS6̪<ZKy"=8Zu#d{.6?zʻW"*WTͅ�.2/ꝶu!LIYhA DQy,΀!ڽ+r "I@'q".*_[;2˲: n(BM21Yr)u:giBv/7?p7.,,l޼yeYVU,QlxހZ#n8.T?Pn4\)Mz('aV۰aCכuӪȭbnъ 8e *yڣ09+BO"LV*Ni~ ,)''GׯT,i,kXqb/EҼj` 6-h]S%xlx4MFpܤ< wz cUZʝK!lycC^kJѪ0 D8zv¦w?uEuXW\&!4Gj4Z_(s+P.8Q kk.]JŴ;‹,IOzҁ>my*790>۪̓,|;ټyܜ k4)<{fx(.)=nk k~j7Ii%+sTnB~Zm F͍)I4`@!HDWDyMJ\fZ1#x> nkmXn\1CI whyA.cciz$\vl? (6aQ̆!ha"MS% f0X,MJ,#̥j>4h25ȣSqxxPQ"BQ/,¼#.A_ikrt(N⤟,$TR9o>p&j] *qMe{ 0Xھ}"j.˲ꗪ [\0˳ʩOsA`x{CYp̉YS#ں F0b;H9  6Ϯ=DEn} {lM!9+\h�FutTc:qF)q5T%֢<k/kZܘhf1R ӱVd#*9Q>j6{]aazM Pj6쮙l5K!tf]/;�4D5JkfmfӨ4 8d$oZbp9x*ߠLv%U<e@&H8UTyM θ}.~(YTQF,mhyk.[p٨z"W^*o'?ү\UWTj y^A<^Q( ꬪnA[ 23pGfm`Hah3|bvvz= Z'qx&V8uH? @mQeCUK D"jLV%5xQX(i-:SAADqQHgFs'I%cP Fpa4:u@dKP͌^pX1]N̜&7(7@i&erj)2 OkrAF]$ǯ 4;P])$EK<,WXX* Q~�Q_5IGL&өh(#8/ǃ2qW2('DўJ~V`_ϟɒq0`iU{nmgAH9X(!BYvzP⬒WX[QR[5TK-MFtL 'BCJLɸv%h 9cɵmx|Gv`b0Nax zdf8_,h̐x966TxGiDRKi5sU=.3xeSёR` 8�:ATj˪Q൯%)tIßjzNxLvL3{aUz^z}DۢB6jGԩy+^ JUsnnnNZ:*H%)+V2=,'qYS&-,K܈1"OK ~:[%Wr& E4~i5d+ otp K-wͬh٤3tCᰤ"}EF楚ͦf�;0*6%{FTj`b k=ɼI|e; LYmw73" aū:x\ 8Fm] &V)oJU(v,ӧZ~x 1{rdj6mڴo>UQNEnjIۮrι֫[L %Pi^Ί:VM590EfJsC:][QЕ?o< ܑGGޕDbG᱁PE}|mPz'�gӠ}΁: "5ª%l|6e'pΝ;U嬢ڐ8i@% @e_<+G3#,aJUj,TXKWvn y {UCKQ8y<  0R`$[6 傉K} /xz[^pmM[w *CEcaTS3qO4NPj|j]~w[pTAQH7F Ld:U W,DF4 )yz=YϜ+#1d :@0WrpW[ 8qeUyYskr֥I[Vewa㺛TO<cjz&u&Ɖl  ҊWDIQw(Hh�O 56m:餓<vp*nylc횀PIidK�^"rik߈lɸ%tzJ|qRjZxF5e:mJ;҄6?T@S*A�Rr-loB6D G c[JciCho_L ᳇9wW*=4g)<(3`]7rU^|+i}e(\N^ &'UA=ECxdZիAND 4׉ b?g |~6 ŮU~mB'MV`Sϋ<.qGuHQD5SH'Q䥵! 0`MMt_v۷oG=P/4n׬qFsڪFT]M&*UQϛgnj�9eujǚnrvN*RhTU+$WUػ�}PդfW�In;BLѷE=#p8/摺O:{4XDYU0+) g<=hIqZ)ソG/6lQĬ 1;ꨣz%< t,A2uJLe[SjM^&BfHj*?)e JRƍm $;=<g_[VIj $/ ܃*c^* ռgdߦ5R]h_l1=?~}Q3( hiqvƕSz}7՚ڲ~yT,O@itO/.ynMJ+cZ_ʉyA[iSaX4Vd�U–prnO L>y.?1~5 =Ki\ѨVk4Ά? /DY Tj|o{ҕa_|+;NW^yew_lhWmeYb+CݤI $o=]xjo*~"ɚĬt/gjUp pĆ.(+bǎ<,bݒ="T4 O$ڂ3J>\x d`XWY>:Vn+k,1D 4S-hjRjP[fEڸE2Is6¢̻NFSu,8Yo :Y9l6<�i9:Sx^+AGE=T\yt9x X_4 Avp]PX=_`Ka|<k8M(}i耤g{\�� �IDAT2AgOA"O³@0Ю(sÇ՚*#u땎Fma|R=0/-[oU* 2+diۚ7N Ӭ.uQΙ҂ǏT %= '5Nuj)ǀKcf(^"Đ)حLS{ZRvˆ'*{U vNr7Rt�4=1( 'EA1sֱRQ+MN[@OEe6r @|t:!# ЪatI7xF:EfqXzBJEM=+[xKh4*:Ef~Q^ 'sT2Xz&/P| SʤfEcV@+ kC*4N8SOݳg͛GQ#o6  {uq/k篼ʙNs7a9*]<z ϱY6䵦<;�SQ=O[W֮V9:Q;@X<c*Mk莨 *Ysh {_cRQa1-)-S+p<ݝ~0͞[cis|6jjj*IY}+C=`Aj8e#s MklxcG (,>BVJgn[ Sh;f4&R88 *]ܴ4YVzvsIa3n Cک18]d<H%yMEŦH,An*lb J'I{uSR- Z֙g|ǎ[nݷokf 6Ydv.VeY涸Asؾo߾,mWUa6v6ziDGުzӅs.h4%%C'2ܝCC]YzPeѪyJ9à]rnnn\Te,2?dPX"ԻI9BOL'63Uu;`iX]YշG/*5R *y$s%vZXuNcp5$Iz}/Sv*dv8j:NR|UtIaRٴ4r}4l7X$*}UUIU4ji3=˲뮻vUGytX<xj%~px{Ӌd$:J sD#y[8)\o%Up{m۶mݺuN8 o:I~@]aoWAdl%a.Γ7'EVDQ~ohQH�1j=L(4M @DGu)BzpJz<}2ha*<c펚7-hǿD`z,TH jZ(Z9;ʂO9-[}BAFEh2E6z�bh\miӦ8lَEQtGzw>XÃ/s�!91y``NV]u>TWg4f( )1j<R 1Y<EQEY??={,,,80Q&gcCt>JpIUgL|py8?A^[vU˜3_|wy|ۭj 7ZZ)SKcFrp4E{5Cw{QLG, WZV0JY5B)USڅ5濡, /${Eb7bҷ(ڟk[=rV$az=W(5qg$2z % WQ]q'_̤? ~{챧~ #GR=+x``W^g9,rnnn4u]p8hp@(WQMT=5)<yiǞYEUӣPsqETG}'U[mg7,8qse7 E#Wsh!O֬I;2 oC'ЮGS)PS 56Aqo^;˲ꐪA87t˧+*_0mgj.n [yvT?<q𔠼ԷiW3Kdl˧l_k&10rh4dp~x'iŻnSW:8<ޓ.%;~} e9]?[ gmyce~:ɗ(X3NK>xa (je�:2P/=k> b-U.Ϯ֎|{eST۾O_m_ˏ{q֭[PUU,G3QVfyh_VX׍�, #e3jq`#~jKVX%dpR@U(eavF*+u]%{b>RP_<A$u1{xWcI2FS蒨V`0zŃggɖDXcD<8דaޞ".zי5UY=rV5Z؍;&Yq 7 ĉ-|P<p7ݻwCrc.eοU3vcYGQtܭ]Um=˲,.kYv[HA6�'$ AyɌ@zЫL�ͫ@=ι;<x#鴿8,Dfs,>sdFtԬ\uOtK!L]2myetaTU Wu }*AfؖnxqZD*PU *tPDV[^MeYyYy;Ov%e`z:U!ܤoxp "ys6nx׶m][/ k"(Uk.KP9~YXф ˰ ɩRHj�CA}|&C0x]o;ͣ`oмY@20qȷ/ <lըEFї7:o$a;^4TT5kjD}ˌ5}f3x ,aYƩؽJ �5?@߁?Q=1UoQ](/,wQh]UUsZeYfEEQ<Ԟ=~^wjԅـ*Qh S | FZS</.|$8*"ϸOk ;ܩxsPbe6Y4:0*,uS 5]}!&v؃0Kن8M 6<CZk=3"H4kh-L[=rVAtKص1bm<(&=u�=zOsqbKyIx{_bD0�0/QE/E[QE6l8gffSeŃ+) P I':( oؽʙxW5pAdpFؽ Ɵz�L</zF >*>g-qP-h%x9',=֐`͋׌t[72y7? I[[z9!DBe(<^j2c$IM( /-/W}uE\p8WenǔũE8J"rm fhtЪ1 Q)(XaK D+W d 66U-Oz?�أN{YY,m ~eYfuGwyO{㎯}kg4;,QklRkB.W�"M mNp^ G@yûg9vpִl hvYvkY}oޤh* X�dƔkLR)eQ+ҁ!3?Xת nMˣ&^Oo'7UŴrKi y3LN#Yy]-8yY\J͑~Ur2??LMnRZXi9cW Jedo9ʜt)N;__z?~֭zkeѓW/t`O0 )xLFg-5'EMuj!UVUP o_8t%?]FΝ&βhv8Yk ?~_!P3�jp*I vţ!E@y![Wvpӌ!-`fWֵ^u;D3B�:j_yN~*uWrчj[&HKq|AAd8kUWTlL/gr)vjŒ<Qg5@~_~@bSv~)MgM\-'@0wiɐ|۷'Irw>CyЯTnׂ%J )=x/b&Emb*2mIF 롐*/{k\h~9[Vb&ʻ*F)NO^yzȸO6hB tpnnvdpy0Wmдi&syb@D֒5dJe (H$mtYzʉ= , i@?'TTBRU_Lgj5u�[M8|ہmz>==m:( oxB8"k0jm ;πSjYf-MC܅$A_;/WL¨TlK'[eD&2cȉVK$SZ٭Y}wKxGڵkyzPM='t7axd:U7zMl: :Ӏ |:nZ+{k<AM~3 tЭQ)Ȧ@/Ue6d5u쟨 NѢG>uf&o`y•t΋@ܸ8)!WP=q2@ d[+suB)lj,$1TbGEv]?᫴Fu]xSnroۦӡZћQtT bh~^~l=5E=LV{ JO `k"k _zt:::ƨ~cΝݹ0JDȅKZ18ב{fVFE 9(>ꑣfVc.1W H±Zdo�ttѺݤĤgB%'<_KKa%u`1 |!bהB̐!ݤ EԡnQȾ%MSKVzS됄9f fuu9\56:8}hPUU{xKq_VQ]4I#mp< 019iJV6wj%QƒjdzyƅLNXSwbTTQhLMȝ#'R/gFd5Z _]EZ%jHcQJӸUjI5T b٠HSzь̄Ac`IE{kAlܸNطoߎ;HKoLTS"vk꾥jlUe͐}R45F�;F9gYmyi$ɺuN>m۶ٳ`Sx6U|a5 j:2bGTzBpR)}(EF4}lrFTI҄I ԄaU.mHcJ+:@&e $y\VUIuNLUHS<(4{&= Ҩ.=|$O(8eNuh;V' aY\0O #b qXսU h 9,ݢ?g 6ciYUUÙ+N3Mвj&D2 f)ƪ׼o!qSIMqG{7oCy 1j~P,BIL{hVAJÞrjj-4dCa`m˲0c.ض6!W<R;jmZdv] })8y' S%-Ro4MSWˆQ۾K[`?5eF<R+M3 *ܚU`mEOh}qӤʄaHFLG;H-XhPhF0Χ̸Io'#cUEuFMt,{a7xZS؟{F2v-do+{txLtj_ _9 s=^ovv.o+_c�wMeqC0Mw:ў!T-J="]ݵQE c.Ыv-['GveRfqN.hUE?wд I.OA/Jij "+ԲބzR(ZxFBqRfaE5Y5nܬ:Nۥ:֦D 8QaW3ҳ).+_m{{ꑳ2?(zR+YQ�ZjPl)N)! Ұ Q-y+/) <f 8uT9*]NtNJP ҔT0{SJC\}TPC-XvJ%Χko_jtݭ[.Ao[L \;yDgVtO>gVe* _i8ZAN iZҠƕoySYz,{=).äc)=O1[ulP2:چEu$Q⍄{hpp%nWiN@Aq)%{jIApo ݅G T9Г3:4X+ �%&ڄP +϶Ke,eQn gP)MG5P|48˸4`[wj)]!{p$ `x=OE;ֻZh[ ZDЉ2ʠf{_,7Hߙe.T|X(.S0i lCoh XǤF6v6G5nU~X(Nu`};Ge4%"^cU)Wby'gyGjU~HDLdkp=Nyև3V `%mtډJe>:zIVk4EEnwoߪ1 (R*V? Wǚ:!z3n4d/ghU{i1R(3G|8ΎtDyQզ;葨:bBqlHH|,\8QoE}k`seٰTƫ@2T=VmuzzNVs슬IV$.q`enQJF$ EP=g{{{.mhFv&,ٵ[-qaGoWk_6˲S/t/E烰UvM t2D- FR ",pxY#fkhzɍMP6<sĤIDgH^lAẀ-@ �CZ|Trf9{S\qimK];I&'tm۶%Ir;99q]zT,<ԍxfqr`TKb2GQYC$:RT+6�猩=|R?`h|PQ3L+lˎd05_uLU$E%Kz^Eݵbka8lWu8jmذ<4I.+ ۍ0S:).5N+ɛG Ξp8l6d+q% }, os=~7-,,}wx 鿧LAYunIJWm+04 ,Yy9n #5]5ytg݉~%xȘ8_h4zPy!犎 "Y@=0n *,^~\sV8rʲv̯F/*Iaa> y)<<>f-Y0%`Ηz=_^?h V5J>,Csn%�� �IDATE^EQA+HI'ta}333^AqbN41tnN;Trl x_NDhwiY@UP vGSg5\ rP}7ٟfS:ß{vk_֭[6' Cԛ׵^d$['Չ-:ӱH4T~tOWʟgJ˻JDƪJ]rVZ�7Vs-}t1 8%`CQe xG߿{nݪ@ꑳ2hMcB]*t~T?J3&mf'ibu"ȢQ;\U@6E&ΉY Sd,a1Te'II" ìj:ӏ?,˪c7X\VFβ8Ε5(]CsS4p6jwq/vن)h4 nTZZs M?w:3xk_{vng~<}{ #Epte0B|̉Aw W }K:l6'tR$7laY/m@+%`ͽ qE\hp8 ـEݱ,A<5K:<=7A3:ܵ@vh;\s)pvG T9^Z*/Ղ;Tzv)j-v<x^уE%"Uc>) ˵�UU}c.;.w.pg* \ÊlYQ?333 C uBӍ/Ki3xcxu&Ø捚 ij2zX\IJ~WLarUW熺V(!!#&$%d<6Ƙgc26i N'li1A2"B :VuW/o4[skce&݉h2%-eyb:) r$Eg\וE"?mߡiY/Kn5yqĬV!J 4!r~"T*X*H&D"|}DzH5#h] #:̇ Vx7|YN`C::, 0MHYEu# 6iᡡ:A^( uV:MM˪XfWX)DWDX$ q@~��% XlX,L&dmTVUpa\$9  S]/̝f4A!4wyO{seoڞEBwK"+޴�eIDD}lr�mo۝H$Bj<+ݠ֌bD"'Iy u�>S tvt'N8mڴkvuu172_} :xm۞|ɝ;wO)3%#F,`p5glIZnܸb켘at>}+֯_]_([Z3F+$1I`!5CFď|d b$I~ш1q9$N"&iZRxC 8X-1`makK!X~厎!2ZT_%}q@BtĆisq;B-Jd<B C^<nxVq*|6Y9y s(ۉ1@D laq6bJH*bM)#joiD b_1'۶S[&I`nIX}_cjb rG*�l'kf/4_z͛7ڵkǎZź&Kw�M< |K$L\JIaŝH p% C*~MdɒګT*m߾X,*Ma l(r0!X:F@qQ8�fJaFˑT = sD&j_;B1ٓ!y׭[h nl`~qp_8(|zp`Lz^.##Mӄ,y4'F䇸�{A%u]i%yRJi*sM27F\Ku2:x:$RafV</|6&桠DK%+rg$lnnN&RIro u|,~iZ~2VJEV7oVds3`ZRV+[t?~,QVVfX;7k 4bHH.LT8K!s_{{{W^y{VI_GL *_l<g1$zD#Pj4 t@8I*EZ Pn*W%80 %>S?"x}1=hl3% Ȟt#fS`:Xt8 .Rjnzsqx9$n;#4kh"0Æ]hkAXwW- )4sD5YD"Q*䚁6fyAS3)=i6p|cNd3HM,j$d2f8lq\.dLLRyWee-5)댥Rf*V*dn#NumDdzZ>JY'Zճ;3U-09t:Eh<0dN4P(R-ϋ*WrV)_('&w}h-}N:3`(,e#"UM)ih2Z^5H$TBe GT+ CUbA7A5r�}�7'nH@ *hoM]H x�.< >[;E�g+;23l̠X0Ot?<=J]'-E$gt]O&rɓ'g9Ѫ!<d.4Uv(ڶ-uL&d2dr„ lֶI& q>kN x|,ݻع^iu1(( .,I?2żnyG'X`QgD m 5Scf~~54E I-" fXy@ QG#r#?+VB&I݅B!D2ttzƔ0}Դ"Kf"߷,K;b,b\:̭B,cK Gup`{+\-6!<|P`| I"Qq.lAɠPbɓg̘+88)u=NO:UN7xCCERoSA.nhp$xH$04.HpxKK4rƍ7~x<>qL&E x\)"3;f,||똷Gǽ4\.c=m4H)Lh Y!xJKXIMXsG?b%Bmkj|׷+UG@R{1Ū#fZ)H>A X7>,`|N_~PCy?w}Ν|RdkfN#UybG I3&01 67ĦņT}Ex$%$M%-" AƄ.B~ R]컅75r`ȡE;ø�P@s6lY >J�0[TWfb z!QDfI mIP�GnP8tZD"Əښ夬?Qy(ocޒr ]=Q''7 3W�=D0cf!j&l$# h?6P@(QyE?|$TϪXsLuUQO)]Z>Xh.9;yRȖ 8˂4-xu(_XJ o<c-& ]v/ʾVگPn+9Vf 9{,:$,e !eR@]$;c1m yZilgZ!Q6$B|<%bBF >YCr:aWADZP:&ƉdlZmݺuPbhkHKhѤIZ5D"JI@hit:ɴ:djii ":4r,˜kZZ̴$U%/|FHNHa) ]mjj7o^oo5ke!axI4Lf[rj@QAÎCrIJ)MM^#Z l4$`cN璎π4TOQ`L&X=ÖAtuuci El=EJ X(?aɞ@ĐW?t1 |g0q4+wR쁴hl2Y*2Jfx3m@ Ȕ6XFrlBݦhXU&Ř !{RН)fH�@EL&3a)0H#/N2ҹeaA np8|d#[3[zgSiOk 44+JBAR)B]:LvvvJ%4W$_| V@ Hb)>c%(BDe 5- |zqLEjwS(lTuHDYq;-"WUfĶ\rvg�l),^]dpLmUN섉4R5'_t%<dP2 HN֫"_&R΁gxșH$t]^d| Ffl/hG[xGqK?5~@#צC@sP/ 2#1R%' .Ǒ#Oʗɓ'?~„ kmmmoow]R/Z<leԤ##P+[S[>Ɖgy?ۿ?v|c3lt6w}\ rX,d٬3uU9jtS$n/E0nV۰adtKg9P볡e/(B7%xޘ6ŏxT=ȶe" >"W.fv O0+`y')+!CqKJ<bux`T%"Px\6jwLkw 2Ju^@b!mɃ`rL ~ gkPæ40 fA.]\H%!,y VF K^dt3�nP�8#&˵577kdpl*Z׾njnRMJ)? phZs-sy9nhL4[}k._q9D_R(w.b(GY6%$'uRR#my)v13Y,=0ub^TCE.KaœVPFpb隈'H6B}p0oQ$Zje+x\ʰ6KhCd2("�$8c:Xy*b+ *#F@ xx>rC[\@0E Wh9 dOhɠLucn #`ZjZiܖ &wIM6 gxhȔ>Fj*zDHsh ǧdOd2d{{ĉ%*%Wzk}Kز lnW3kkxstMo&C/qߢssmۺLCG n9Ԅ&T*To1ZX"$$ N�.X-tH#V՛e>І>,ш[D `0lhl Fwٱ,Y X##$|X_U-LNyP Xc_8м?b`v4�y3@̋b6Ոtyq;lLYt~9m1Á?}54z26< b=5o21TijB4W(p2JE3>3E;&rlZtss䤖&e4ͥɥ 0<;yj}&kgk"]׿rg޷ ϥ?aY>)$D%4"HP6V�WH"p鉆Rʱ+5Pdf:<ȅ%*5 D7hjwuQ9pQ#�5hBH RÐ rVZc||+ '֍= @z΃c8L";O^ȐaIuK &�p@d{iJb� K&8Pz%vToI#S{75$|oە+r(�m pnHR!2lNi  IXE�ُ0%t:rjD"2S_v$o}15D87{ *%GioR۶D[$KRX;tJE.Ihr2$9f>BY:J3 3O;ʓjjjn!0;>p$|40[X\>7Vj*=BIȗD o^>C�'ERحYQ 0 w؁±' R$Vӄ $ M84=(XrnbAV'ԄHWq&ՅwOL~yH"�0(C#7<TI~>釾tbbX>WJ9g9Շ6r|(K~hxD U?fdD:#$ #�4*h8" :rì3g2AŶ-M.==}7qwʙ3,y{5UvqamAa'JpDNzo؛5Xlܸqnݺ<ȰNss3['AQ-cl6Ҡḗ "04M <npI1[GI1�)nZ y!ch @}"#!zA�j٠s.6ق]{�ɐ}Jhnn>#oyʩ 꿯RJuVԄz9whhb <PY_�-F1 sH%a( P]N k*Kb9qLe䙱ʄ"y_�u#)F0,e޼yJeժUJEi ,)RCZzijw+h)؅y8CU N0$:F^A1\=ۛחU;*SA*&~=1cάښ}eoXҾdGKu]<ŷr}Z mZߝݹtROy2d>5&DHHnmm6rdNFуJ(2lhHyx|\.gD3x7 nb A [ub"m{fo4y=d<9njGVfS9<v@e66ދ_X=Y_uTGՕi./u<5o,왯?1:`r~aD88:q_""jX+D2s<VdgjӈaYcM"2jkДBd2~xOOOGGG^|Oi#W.8̨F1MU#9P.|6x/⸌bu V %u72sxů_=3_}牟UsOioXoRg~|ٍ}:aYmNZv|-^Kیm7n֔vAႦL~]]]"X20R&Fd\4 7�� �IDATcAmT*qQD̔@mEh&ӗن  E&{ZP4aiĨ:PQS죈4frYSbVķ[h2Hx|#)X 0ƿmIݔRVv,FWYyP`(EJMY"&: yhYd>ڙ1 MӦNoذᣏ> z*^ 2)3z"72>avow裏RySO!1�,vQq@QZ1y&h<'rE82_y4L9s&P>+$IFـlb/ל=GӴxwyE?+h}`A~_}aUi]ߕU5m+YQ*4ߟXվJyF2*9\$[ &]"#07cd+! 8G>O%mkҀsPv2`A- ;Z֌Pv;<l-' \Ed>԰� e?W/9 jT5uzTuX֘A|8oE.zCæ#K�CSdJƬ,P7 sg> ._RP#jd:u'Ghǫຠ>ÎdLeiq {8´Tkpg,H|:GI03iSo[Bf fnѼ30 ƍFcmжC[]U>}Ψp^ۼߪ~_R zwY+8'g[[[c6ɟtd͡>;cKǞT:%lIiD"1`7~γDM(djí6?p]aPg�Q5)R{`]F ?h 0j8A";gc)O8K@b4_#I]� 1yLFDd<_=1ZH O(˃xCnm2̢Eyꩧt]OTjުU9{ g{c S˯� gIa�`Nۡ ^Ս 6b{O:O6FxzI A8W9V7G +f{<߹Q/$t1. R9$<ίߕD^E,�4AVkI בljA>ޞH$dS?]߶߶C:Gd*Bmbw.n[o-_t5iҞ?itw|5}7݂Vblٙnu}3_,kjij *$Hk-} 9 sa4|XD 6s2)u`OxN-4l6|S$o`!s"o<�X00F�R'lFVض",.DBăw#Q4@UXq#C\M)Lk{H؃ h0*28 /fV /Ji믿;T!=kd`(;g "r3L04yxʋKܚ0T! y𔦌W31!q 6 2N>py+Jr1#܇-\lī6mZSSp-vcdcY!OߚM<;o7C︮|7K/kiR5h]-1BʥۏϭĿhx]^F.8Hgv~ TSR[u]7慝u-n .*( C6[#gTZJ1 LJv2 ʹybSH`#-D;/~e6$,?""pdPÛFxΑ'Ey^+4כ'|R)588Nst:m,�N;EQİfp5- �1Ń] b&6!**+eY?濙#WݗA6'xPsLv~^WFoiuOxˉj'|:@T(CaU�ĮIeonS{챹\n͚5ZmϤiee/qSlmٙyP%ڒ}m?yu{٭uh~Pu___n6 }FśM_;:7dnN;H&mso2_P_PJ 4.zю؎%R4$ViC#,�>+s UE^0bBA>�e.B`я v4|1 9DEbkv}x/"IL!YiFpQbfx &Œp}]vGlU[c!gr"f<Cú\u|>&09 *슆zat萃iҸ]fս٭i5a;yApHCq"0cB@SĦ3r1!I2lUJٖxKk+2oiT\/C6H8OST5QEb Bn.XlʽUIƏov.Bb/^ڙofy0ݩw7śrTxԧ CwcƃJWJP]//4Wկ:tƫJQ:c9˷-X,,ͺOxL^t]/֋M4T*577 HXZ ðP(H=@]TJwԑr 3 4 - " ;L#{�ODv"8pQ$5�X^1= ID1X#GQESE1}�I`pZ ewWn_dAxW_fNn XctxLB�n)rgj a.6 ,l[#h(m7�![a"xA'eMk=a|իN/\Z+0 E?4M ̵d88 W.e a.@sE_Bxfw!Lvz٬yLfGv$wR[[m.Ľ^EggxGwS<gm쭱GiZ-TR*ֈQcQ υayRU^q΋niR33&7O~Mv|DdǽVjs{\ě|>[V% .L&hN9XJE4։}DY (,Oɜ{,cmCςEL+b��3n] ՞|F0&!@;s Tnw#iu]y*qk"YPuյ\ԝ{y:r'Cz(y@ AQ1B91YahČOO6\*Z&@:-J&D(` y/ DUx@8aRi]o[xؒ%Kf̘_Tiw Ėg7Pۤ%/HᚮU77  GV$"b 'AY6Xjw0Hcd۶NxT,{zzF.}8\/׫ዹ/&Mfgz~p\0Mz/Ͽپ3tV2'O||O;OV=M)زRxZ,6;uGsukNf>K?Z*&>0wܬBdJX,J%pDž%-eTl os;`$[r],ğ?1 {V�gqO^V\�f <)# 6E4b!sXXgy@~lD¡]?C[{DL&T0#<e1!Τ+?2mM|AF 9)Pt\a%JS=s =*r.&5ieKCeHHQﻋ_CCu?uA+##8b-S6mۖ4aSֲT*%1'YyʗO}YJ5o2r}⬟]ezz_]zX)H7<d>vm x=nimisR$^r '/=qեR;b/l~rEӊ/ ) ý~wλu˝MwޑcJ0O?msq,mz\.a<#H!T`Ob=0B~' W(E$[L4l x7s;`K(ŀ"<)ΨaA.TqR ;G @!v.)H/б"*z!,1_$UGѱ*gjqkno*�R8S'8�x,K$dALZ@ƘG )߁$hu]/P'c�᪋n:T?l-䈏v-ο+e͘1㥗^Zre>gݽ5j\&wd>`۶mϬ5=>#1|#p@˾[()"(Jx+zʿR|零]i5-k-n7_T c^tX,/xg|fǃ?~2~~w9wl\svwGo?zL<Ӭ7w|tl{v&h'|OtɍmDѮX,|>/y@@"7?㜃pW3zih! Hf>xkx AꐭY8R? } QBB=oJ. xeOXh$~4* .+*1[qx戂L1/bKZDFev`Ԑ޳Bv4VOYyǘH�WPY^¦GDx3p0,[#_s'qA"~sϭ\S뿩+\-Ӛ={^8qĥK>裥Rn}Ԉq|qˉ&fQV'_0Hnعs_*ljnkua«zq\^ryv;[o{Z;ͷW+Ag*u)u3シri|y_kkfz7gpAӽ铚'Ǜ)-syxk< =z^*JR\쭄Npt}f&l$&FDб`'T<xs #!@P'EwpD!6V_PlMimՌ' `�4/mQqxK�un7R0+e üz3@HC} ?cTׁ =ǘx&-aY,bTZ>>bbf,O1 VTTB+#bx,|%Ht$J{AjJ)ApAB4> (#- f|=0U0 >VJC7q~f;髬U[6nINH*N}ݛQagՅ5-ט?|w_=X6}!pV8ν{/. w]kƭQm.rUZmppPt# qe G<*PdX@�*PP@&,%� գNv DO%4v*,J)TO?ǷxCg7FRg&#9 \LBΞDA5$#$$m J�Gg$a0E$Ke b4+&ZAT*@pJ)cw9~Jbk{+Unc]{m*˵krSו64ͼ)^ˍ;ṡX�tZ)U.PvVY u]j`^.>97UR^(ZM?Ƕ m w%"gjXNrSOzxE劷^HWת*?gήCC.}qѭ<uZiv}Z49"Q(:;;<B`;@]V;ڑɸA3G 䮈-d \Ͱ,{Gu G9@/P$GEWHp-x }zC4I6jhl}_$gL�\xܕ="L(*$8ޫ"Mkk<raByQ=|xQ ZGld�ccRuf&!ma!TMV\BefoG:8rY]9( B*?q6nᛡa ^VWfik۶m7p+{WJUWH 0 8^:78濚X̽-=[jyWa{aґ{Jg<F8NZMMM)]qƸt#=ݟ^j[$=wƎ3|Gvڃ:sMi 4QG59ם;QEreʅՅM}v;މ|P{o[Ds⭭~k(t/ARtuuB N^g\- &['zLh`1H0Vɢp2D^q60bFRH4k!:p LA��:'?|: a:IJemm_pSSTVV=Xk#}hSFtz %IBm$ 3LĜ@@8LӔ)鱐'5~$@p X-`].W|!^eRE}Zi߫E=>VA4隬7o||G7.k ]keb`ҍs$XZt <k큛£CM5 qk#*R5={q!Wst/r܇l;#s%xB޶|>_;}Y߲+WlG.w?BoiH(MZRդd7ew?t駻~~kd66\şr:zلeM?sWWBpS?~UUuj\/bI ˠ^BQ# NG].OD-fv@_"L :V?22U[R}mP񚡽뇄'Xc!?aM(< CwHVuvvAب6 e#` wh 0ew /հƠ2'A{Yr0zM͎%sjX"8 #`و5m4nhU[~~V=xI| /h l_ӵE nAXYZjre+>q%5#I1LF|ſ TEږm;~)2A !(r4P$ȒbQ r&G$t~]u{y|E7&6^rL9#gupއd!)˲*J>w ҩZ~{%Vv#G&k{@%Uު-Snq{};00 6ċbPU4u PS9pO$#1e ?G1y[ԿR0.f@Uvln^|LqL ~;H<M1؄YgOrə+$vx@ /pq4Z5�cF{ O?4G+]?6�2@oockkR!4�� �IDAT^8uZv lqn#31ܳ]C4CXe?Aj!`# 8C:'z3F̰,hybǪWUGGf L$8DG&3'TMT]T-‘ĖO\;Ij []is>ڡrS&Ib#4žZ6:ӗUG>ɶm۰a}jeD5ҽ.zщmn*_>x8}OVW_R(H0L6$7Ͱ %ZlJĖ^MRS/%+h ú>Yo0=<�ÀpT sWņ]Cx@. ٨Y|V=@jXM_rs )0  Y 9c!gwqp<@a\_"L6rxG6TiηOyuM[;LA{)LĪ]M=ٶ-A=0 .RG 7ì'xN%hV>'Or|`Sq#⌣ك8Q�E‚x}n$n �9@]MRr vsWb7<4!/޸O>I7&z^̙3O.R__}}ojj AZ|wEjNcNK_VoS[lٵky|^n@#/|�62D!oYdsiHJ@x9\ bЪz}44dpJV鱒_a$3Rڐ~<+Gh ^@U OF>vq"*`m2mm;*E!dRmĭ`nj|/jb;ec2 43eF B5MknnN$]]]a* 0PP'Qm? jQ)9q1"sB %#2�aÆI[nX,{58^P Ƚ2Mtx\9b$[{9�]BZI JJRĨ=z{2g?_eE_7k~t֏6i $g2fQ Lz';^YjhŬGҏĝ_QMr^}bߎΞJ"49Dr'YJdE!3$EP'x^U۶AcAjes3X,J"P0i8f߸qyB#4c-f.D8.H֤U/&V'zrt7$H DfB5 <+Ycَ pfev+k?�iS0=ρi� mRyAT<< * <5:DA?bxʀ*L^'_B)Oz1@<b6l<M "d |37ڿ֜WX~^=wb.ȃ +R.y0UlVRDz:{{O8qRuL8rym'OnkS22e ϗL.ϼk/^uun `}bNw\2~MMm[sZV(S`zW䘓c1<5|�=X'FƧ(V8:s� Pj&FC408UAV sw}[[_ \7tBMMC<ē CD!˄! %{c)Ҫa9ka6 9#z99J#W�0s潰?8mmm|J-COSɾ5000l4eōԂ;320E뺖}}&3F ZIH sy@a Sag) hĪ[ٯgεarsuY 5k fdx<S ƢAQvMٵpjr~|MiԚ5j(=q'qB̋y&Ճܢz%3ם9}w8>| :wwXȌ>\.EVTAw4( xro؀I '܇@Uh{f1ӑб"+3kpwbB7ހZ 7[v`2YZ:pb'{r3v8C?Z#2Q xވkre_‰1)T<ĝ&) 8�a[Ak,al ",Mq�s<-nYwJʃȶg]nW̎!`f難akDKCnɒZvprX|h]gE]a[|)y + cIC0-q #H`ТP}:y7[rTDlڈ1p^Hr'ILL*P"tZwZ 4;L=+ ~ʟBؘ8>o޼Wʮ*Jc!rUeYO}} `ȗr?[E0 %I::.KEN^ SLdn pդfy(477eL [°s +n.jڡN F̈!t5Xj<q@)id%3;[),s{jf8j!L$rXP^U 3lUhFc!gG4dƩУ0VgIffEVjjSvQx}Xznujϝ@@qaRERX̻jMR*vGG";`!)B+4 F(BQXy$3E`,]+#襡tM %('˲ I'%6'wEO~a|w={RyҤIRq㶄[ߙ.k?|OtBe>"@gY8?}ZR{0<B}*Y-` e14jLBP.b"fqSDu'{>1F^!~YqK#(z (o<`6@'0^p.2+<v̂FY< _ 8qF9MH_sYH^KMfa;dD,i.BΞ7ha=>8p[㍇͙#g1jdA_7l62zX7Y.H0T*jX(%{ĽQ9Hpv5;+d@m=na 86K')9ˋ%=-DG) 8س IC\nnnbI'4f̴B+NK[ᬘLTJM}=/R:XyD)m=b 6BA_>T* 6%2$lZ 3h0]*}dHLja1JM2BTVyJ); ={u?Ufgóel:R6R|n,Kԗ,Zm abJPN ܰf w187:R${@<ⳏ#Y\pǂ*TbIhzH$(mHܘ� Y~Y$bl:hHe3aԅr$ U0&0t'Ɉ+:M,8{"(Rqg/E䲥w=wk =;~cf}ʜ\rOI%)h(Y/<7y#ѓ@J"gPRP|R9E }@IX9OH6N%$ulAVD`)dnbAK}#b τ#<ʚ2pV%$RqC{t5E z pKVN x54I][$sy>߻?B1M3˹/GdDySiNxJ"LmS莰(((jg(5M9)x.sGRD"!fr BƓ.A90-x7h!SP'C"W"5UUH$9+a7!6:;.h2쬽4d(7+N]֗{v Y,&>C �v@pz2!qW̋J$Vij6M3N d L>(9XC™E2GbըBP# R$܎v&n:7IN˺\'`@aE9ye50Z@(Mc=%:x+$qPP6 t9hEֲi|&"KW%PF݆eDt:=k֬ӧ/[ D28 9H<>8Z[[{zz$OoTj,|:>J^/D�ޝ|"z 3cZc_;ݱ&ƨbΨh^w; &h叞l,Z%�FR{[nrӒ$ZpD=i!>aq\|Dw y8X>e@3 %c�ҙ2 46Y*|x\ *`O֞D3,Ճ ׵A="΁'c y!L}Xdz,/IdE0LUdi5y l0GwNMl� $Y "D&0�k _u>nٲ%E P@fd@V&sVNmhb.GMMM'g3,`* "J$M)8^h"N!)/O}yEn _0usɍn۷/؁cx{nsmxdĶVloeqDSB86 CTړ2~‹$1F*(2"|,%6<)dS3I$24sf˩*<>)krUǫBb,-QR͓<vc8gƭêjwF6\ЀEPK/@D̗cU7d~P�‚Xٓ(GY,AawyAdR5_fL,, @-8?4cb yzBWri4۶m۱c<tΌ+hf,gDLȓil6kY̝zvc;r5/J6JOy}vj@pI驣ݭu3\SήՙUSW?W.]﹨rk^ν,_}C3-ժ59E;R@8RrA kXBm9 rLFraS �wSDga ~G1)%%HZ #,@TCmR`Wd|Έ/SkdQ(N8OI*sC4~BA G$%c!gnuA$Ϻ,/=�. yȼV"{C$}г XIsv<�Ccf<HB MK�@juH?~ r"AM tAفn/Ţ\sVK&$D�+,+k}Z+kApҮ*Fe ?mjS*-V́skZ2*/== ``7٦@I&e۶%.LD&'e|yX0_al|8�PE �'/q1!+6 9"IpL"rPQeay)XKK'Ĉ#,NZ.+:3'B0!>m�yʂ,1quudRtd鱐l%8g @E819\9\EaCJ_!e)˻D 6],5TZFMͭ5^*"HnO8=%Xftg |5ވk- y ƽzeѓ8׿Zm7lO'7f6><+O<댬<SJiҟJ|~j̧L<T*`Iv/}D!0.h` ˀM/&C@|v@ >ɺ`7e#'bK^Op%ixe 'ˑaWr6!bB`d)ĬPG�PRT BΞfxItEe  K32Xć-EyAL0v �eQaoЇĖF³8YֱXԄ"rQӡ>88:dCnf}g>mjI-%oYypfPI(r$K$R};kva}a٭S;̎*=z5kWUZaBJ,eK5aO&7T*Y /azNDb%23a/g?ѧd�뙹g.9sf>萢 ;c_"iW @J y˹4gďk>Lq.ˁ\|y<#X, rDT?㕱ߊ*kExHߥ%E/0&\.Y̶jxT2>9ɓkH<`i&["Umx+";l\1?J54#cB^!C&xDžg_ץ/` F@ri`EP_{k78>cqiq.}3sg2v}c/P;a#*e0OdON~XS*!P!ې ?C>ǹE7ÄD*­sH(&Q+bJ@: RrDiN6SNظq#P#<f E-BƽI։H%{=9P+#b%=(=ν+CM[0vdVX&�Gf?4q1ʵ?e`TBpW.<Xǚ20,(2:@RtI{mHHrK(B+b'$fE*7LyTJ)UV%GFJD{2=S>>􏼬77MZ6M~?>Og~xq/_w'>_r`>f ,Jj ΍,c—SH ]Y*PKYB ,Pz@i6>8f<G"?{) _Dn�f<1Ó7xn̆To#e񠸗 a�{ '\<b #z06CB m*(䕊F"1lɡ�3[EO#F@ 0BEyppiL&t>Vk#~�(;bN'@E}Dg]Q8kLT+p6hbJo*D6|"qd۶u?)SZvcSSIs{\StZR7<k?;%r@x{/o$id٘fBNb [Ţ ,r=aiH PEhA>?%/܇�vAov^p\r|>2qFPx.DSYøN΄ Ȋq-6aH~ 3L!kd'qD4�0Bn h'%=VY1^�,(V�=)2^9QDXLD^v<8\g qYVKM=DH( yBGeЈ"G 7CrTA�rxPTf&�$=I_0y?\<c �� �IDAT殊C{S\o?vPiJbe755IU.:֡ʑk; N9݉ȐP? τ�|wᶢT/ֆcy A &"E?e]_ Xْd3"7Ȇ<:C"!u߻?BA`r!ފg`Xf1#f(K" ŲT*y^\7 mTR+, +IGQ9H$+%B„(@aJR4}~ zB � Ц>M.Rl(+RIv@T-5±z7%%OѦyM5]F;^+l}}}o07ܒ%T?=w 7a;|>/N9'ӸЧ(Ja$IA(>Q=CE )˥rs@^l M${ j2YɲF`CBx/EVr (|c^HLMDY*lcWTXUb&iPlEyr#=2�?qc!KAy<2إ :"\f9 c2KV#!h*t](�KDJ!kFwrX%N5)4XRy+crd�}m& |a#! QKq!H$ g"LGPaHX\NRrd܍x\(@,?v 'pCNzɺ_?y>~|z^3^F{TOj{8Kϲ~=VuCN !$AazE&E}eP(  p rD=G)!LI:Iw:NwuW՞3VտVݕuW޵~ֵ1V^2:`0w?VWWuٳG[<eUyQy TL*9WAI:3N/o=\VnNűIhWn rYQ[ְ.5w݄*(#;n U_gJRK̦Hr׍uMX" a?G*s<lfwp*0 ܑ a2ҍ霣dnNd_iEأ6f"jM8®N:J�xfq:I"�>^Ќ N>Y^p 9#Y]tś|W]Z^zi㭏k+Gߘ8g[i VkGO!G&Jf]7@/rώ&# 4E.3i% .%|KJd([,Y֚I=!.D6ZLpv~8)"{rlI 9<QV1$}F%ӌaC qzd=%l6CV ʝХ$|}d9;Br(Ňt^<4naqaN&[ v縸}duTDw!t*̰ #1X‚0ᄏio;zVdyryy9/<# G7j'^xAyA9KK"EH[s!:u!j/gS#4YΠja@iI47aRKs8uh8M.R[gHVí>uf#�?7�uꄗV@R+cr)=u/&YNٶB"`2 Ρjj^IĻc4d lAVK z.-D2\8U)=&Yzs4#W7(& OBMVHKlF5c_*M= W'2i`0P(^  DRF˧O>;;=]1˲ڰp6X,ғVa8Bikpd\|KUi-f58:596x}RETB8 h r t s0hz]AЩ(x K(=Q' ySCm'l}� /֤%PWp&t4У, gJ5Zr:UQ_#H"#^[ ߺi-�Wz<,UsP҇:MTӭv˸`k.zpޤDJ ע7 ^O8k*^)6 OuT9?:SwʲzC EMta>,//,'=M퐎蝥LSKE?d]:*nJv!<YO)Y4$l :+R15{*:p)'̢)TeExP'1ciodtzJ-ge=ǮAq;!g;ȄT-nJix8 uJ҂k Fj`B Itr{: 9Ǩ. @u0\:b@zY/Q*]X Y0&dxmtfj~wבSl#QF"6BGZ[35Lh rzn3ϼ7R&Zv6O +qIl8kttn5g"GDAp8l6q4Vwkj,ZWy q VA]@%s'l;źS|yop�Q|T޿ MHNg6Q"o?>1< .镇)&<i$V0Tbqq N|p 6tݗ*x0`'H*aU%] 1ܔ޼>Y9;Y>K~ǹ ;݄ܥ_b<RId8 <=1V50,wuB^ GBv%!Z(/g!GEg]B;ΈsgBaHµ]7V om saT${D6Nխ~%rv\AX50|C9wRF;N,ː%ڽ$=k4|C0 J,/`.]nOq^sg"z0ߢf'D8PN'}`0pPx wvqqQ^Myb:*g7nr[) O($1L=xuOmf{xՓny=+qQf<],�!|aaAJ<@%4*buuaM}Pp9aR OXy$}E NOptgO>% ϝI+? O'i\֣Sx2q)&yCn\d'l3}� �e'eA=穎*9o}PS@ d]-f!}]z3t(�)q �3( Xf-Af{g}3xBS8\_FS }Yg5N5C$ 2Gn•#jb*3TuU2>p84F ЭVm~۳33Uu=wYݹo!E$�D+DY IɉQ;GGs9.yoDt'^fފߎVE(c? n8;1Il ozxJ8'aǕ׉@ d!zjH Sp>.Js~ ۑ~3q8m /&"b:C;!g +0ٽ@9|#y:֬>O;>q rKoaW\}9͜/rm{ $8y aЄO>M7-dJ.5;kE5JyĉӧO۷Oip0n+F"4Ex<^\\i.:~Q9,PU2͇κLJDAؓAO x6O% @)"s6ZW: 2:nlZSaaiDކ^: J;")3,IQ b (`v!` 4c"%O>AQb8e#Awt7z'lgV &o�z=~p"7QX-gI4M/,<8 N6Лp㘁zA�dtv FBvDN㢿e(nwW 5D30b;vĉ$8\H':i/X,j ֍F_{NhhL/3^j~_Ǎ>y&ye{ qSK*ih!(PqG;UL3<,]#58nTx>Ns9 un*]_I<hBȝ^6C;!gBcȓwJpP&1dbvs6ԩЬeU{ֳ5w~Uly]ZHb~b0w&JD //98EyC<QL=-,XtbUa@Wp( nƩ򱪪oɓ;3skO5M S8ēF,ggL�KٿӧO8o[x4n&ޔ@(ZHZrySZ)pVsK,8 %{ɺՅZ[.ZNw� _KâJ" L+v{qqQ $i>"uDI xRNFwXH6ඪz|<C $8]SQ8t{" T+iHO[[eY^s5ԩS!uN1' %\s|4`&=꥓RLY0@؋<B al,77"sDj;ot9z xgqƮ]d]\aHU{UP`0 ޓNߜͳ%U!;:w];Λyz+6}awVi8Mgӧ%Cf9&,@#dnlf'bFwO9#Q$ܜ8s!s=o6<ȣ̭J.v4Wp?V} +;Aۻ%84w#Nٶa~8oH#ΛO]n7u&/_ KKKg0v=qW6|=Z\Q"|¢w_e|t 1#}Ї;鳁.m:7rJ0AO O8YEVc] T\wZ{jayyYV:eY~O>+;18>' Pi g 82\ Nhޢwsd w1㮎:֭"`Ơ>&G r 4]YY9tЩS>F:ETN]8AƑ^ǵTld'P!p3YtȻQ#s 9ь`2hFzS'h֎`wQy=4M3e6xӗF {a9{,Id07{Xķ98)|r(CGkA JT;FDAC6LzZ-E .+wH g&ʊFeY~G9DQz>g߱c:F#8EдP4])62gB}]XwqN' .wn$CW|"' ER#Jo}.G!罂.---//s'1>@gXGb̀:u{72�Ff!rGfu|l Gtm-]X{ !p*o-Ms:xBޖu~ݑنċ$>z:yOp:fA?=mFɽ-'&b<䡴qߜI{"C{Ƽ~TMD !qh+ib)0'QŇzhgxU'һ oMO4KKKY>Bb2Nӝ 9MǮPQ-T.jQNE!yr`L1={sQԢGI2,*30Nt`&*Eq=q |HiÃzbgxu޾ ͷIq2_q'%К]҆EÈ69GdXa; B:H?u\; :9M6urq ֟?+F׌zF'zAngZ42(^ &0 LFʝ>EƀDt'pLBWWWud(Lꇨ9`r~!Rw&J#I0jai_|^^E;{ vh0:|Ygugꛜ<ytf&iotԬ"@R!GYy!]$`:ugѨc+te8yuHA蚕<HggHu^⡼#�w\LU۝Z@\Yih+h0Y ÖIj7CDhD*\]vBv'�>#A.ǑBoC%{$Eq?|5!Hv~؀ +AS5vQsgT?vXڻ,Bީ=D'_~Rh|Gb] P55]$+o=*˳GX¹_9,]vIkeCBsv/gI''IU4 0>Òb.hwsrhAMf̰Y%\t ǾCpXi.~|Ne:Cbif+I+Fqh@izzAZOG서m[Ň(#;)v5*�\͡rĻ#ԑXϔ UQ{ :njP˽F�C'p<,Et#DF~Q) ÍHǏ|Ʉݵ4A ZA^~}x[F8A?A9Cnۛ93.9t7\ré[./AZ9,GJ<O2g9+(F7$F$(HY.4ۺùNY^rh1 CxU+-w0!tr82OhyGXעN*dHv{y 9\E` htz9l4Jf-yA8|mWkؾ}>M  !M.xL]5~8k?cw SX (AnrUǝK^>0馍F#s CEwA|[XGvohzN~_~]lvqae\Lc3}zs)yu YRgE.~f`t2P2"=:hz00*RtQHu)]B 7@ca ;E\Q? =SPE+"J©SNm`"T 9Xۨ!l0l1ل0r.ꁴjP0 .D\eUUe_&kemG}W|iS%5":� tC_LYDI,//6o^kDp\(|LVxx 3F5.xލJcNؠvG[.yoT\66^_9G.b^q@l&@OTGG!x"O)iPugCU،7ӌv:uluA�c�=f Tl.㺱j4p#3A, t8wp�-<�� �IDATj пinN�ҧaFŀz$YOwB!MDu _"ۣWD_Q1O(h庯o9^ǯ=O\0 dg>BʙaxuJ ?Ҹ<}hf:w4C^*p*672w}Ȉ"3@Nv@W`iu}s׮]m]xejfeeLOWՏ(Ժp8Jz@JP?Z~~L)9AO"3B@VE2Cxͮq< 4 [.uTξM bN:w%(ryyvk0=/gB!T(* ~wr\48d &{vB6*mV3$nD^a3.fV emwaMZYM?Mo&نJL\b 2]~ZYq4Pm9p䁲8_b<ڡ|`tHOU6##>B5`09.--fd -Mu%9FX9(uP~ 7\ 4?\E>#1È4E-]>|_V �0[D!GP.&dl`Ѐ4rNtrM{tS!Km:Nd矴KYA}J"p/lERI__7I?w^OuZL'aOfn4?�AХ~y9ݜ> H(e4Soxj}{LW޻O!<2[R*sAgIڵW~sӻZby\Gń׼;%S!eԈ;c\�zrvS\UK�U`0Y?^FSwI'w%(-t肱>וϋ?`XO`ub�vL=m 0s㓞Mjuӓ=*$>.$E`%¢O1:QP17Pj51Ik꾪&@B=3*VHpr^"ˍ@Pf!W`#U M1Ad Fѕ}]_KAͧQqM"7 e$I:;}Ӝq .?4]{o= oZ٘ t]F#X ,~nZqwŹ5sȖU OH�!T<,9p1f/VG[FՔ;#>,٘>(c'?~ xņeˑ0ֶa\gQ8R`*G0OX7*#D`^1:4!rڈ$#ugܝ'zMq9 gK 0#SEO iD`w[B<]$q3d~(P4"=c/<|cko}_7I6`FndļN@g⃯a^NEB;<Ornh~.)>8YPs8őv`SN $22EQ AmK4z+q0o`@|u63@#1td#(%l< 9SJTzGz,_ 8�1�/ygw <zh~r~EG"Q)֐7y@(U?>O�4pVw4X,[!fAni,Gt$]_߭gA R:J2TQ?ƕrʰ!<K%s+c 6;?쫺y_;/Kyg/``E)rU1ut%誟,xNN�2hyN0 D5 ^1�*:K\(Wcޅk|76|qR^>a]~y1(:Y K:J? (<rāOV$Zraٹ@*?é(OQ受Mh]-޽{uu5|>̿c>{; F󟞇&7uU2^niSpQcVdUƇuiFc󕛻eE ;uSK]{wl\B0ߗ@r@ CΨ:-Mwգl_%Y9{%o|{zL*Ȟ&d æiVWWWGH#ғG%QX [1ـRe.C#Y2 y 0>u4#/ Ռ[JFDZt>i+Ful%U Gq C/^Z )\Z8DwBvV9̣h'h3s,lc$1G)6@ɾIqS]>ʇ\z饷v_mO{NujIѢn4ewϷNY$`_L~ ,؈Ho԰>3m0u%aDろy[J ?OOMi^S^-,Zk敫9Iq*HfA9 %tG(B2P~isasIC<?ڳ{G{=;[ )@IZ19k%Sԭ<+|6f<P"`g94D`|J9}Nl&?)>Yt)C9Y+lQ$sx\L-�N8PYVy̻�88[T*p!DPv"yYq{(㊲c|JRy[¹7a{x??{饗9r~'?]Õׯ</^[t)iyn򍍎"' 노 .1 i´Qy ! 9X=Ct@&6Ǖ/xCaL׶y@4ކeV?l~ yOrV7yrp`{W=)'e>/O;_/n:ȻS4 HݠC&CG}1‘)8T.JɯMnڄVzG2=ۅ*Օg ԣ_Iz^{fP)z4PQFyRQwCnm4$Br'wr]訑EQ= diZ0{l̳Y*lVqΌg|Ѩ0Iڽ{C򐫮jϞ={y<||~>g5>0ֽu5Q:}ɴK=/ >N:y9>}z8:M0V`n >( 9A>y9sm6 k_]]aq7HJaH3-BK Zxя.Sa}S}{?wz3ޓ\C<1!fñLk>KuE?FDr6}4<-Ӧn&6ICz+TR`#_!Ny�BA2*/_zvW:$inizȑ`<zYsv�jDvz]|u k+a�r<@p?!x� 74g Ekzcm;n?;\$I}EϊG::ma7pxe0M3j/7x㥗^zwio>Y~bv/]~SGwc'GJ0ʌpr {VF<)K׬ 듭:]8'!<] W+@5@ލN[NsUW]~W_}0JSn#cTrMpNnj`:"\ $%~U۟əgy=zo{m󹎈Q5DSJN�}k@IpVXxB}Βl>ί'o;g )@`EsG0ojuؔ$۽_>owXF]& 5%*7b̚uh$~c^D8|0(εRԒtmz6�&9cbDp8=4=CΏ}Mxʟ=e2Rk TU6�:P.2:!oAY}Mo~e]vpN;w7g$YٳRܯJ$$kٮfBanU=ܣ>j-_z$LE�x.e^@ӟsjuC9E>xnhl2kNIm|'y:L.vD3 4͚i~+|#я~;LiUk :xh"!py٨6EMIuAߒg.hϞ=G=vXr<sʍ*|Lg&DN7>TZȝBU6Ëw5e"4~\R"C+ dXC62ǡoyy0&ħ)t$ CH ye(}$e;n>3<SXBt#|uFK|chi tޙ=yKr`eeƳg/<&{>է^{}?kfYzv"*v4bH4<ʀp9n:BAuӺ"~RxGf凓{GrTqq[nգ0&DŽuR"q2 ݢ&Q6 ֏ۦfկ~uyy[nAV ki O$56P0"�Vdus;9y?rKG--ܸ�6EY/nRsEp4U=N;O77pW_]U7\gw=0Ŏ &ى*ߴ@+4&;vwj26KO@܀ǃ"P[{-~UC?jY~<yi?1ߘ)̾יÂ'H1F y=%GvxAO{m'kOWǫ(Ov=)V<ZHkBiK?,eOBD兇: Wo?UUUW޼R[: yr608ٛWE 0QY_ncYeDz [}wM7q '{C+Ƣ6 3yMv /s]XXpb耪%SPVʼAs<p6 lii믗CQ![ yBr$(QfF\mvPHS=-jFf]{^O{-96QT5HUQ8rn?t:\s^rT7 zK\ثh޾8M$@|e%_>yہ۾o\p1'yRy2T6 1j:j҂fP_(s0m4M834ɛ<n 6M3i&g&C'yr$ Mho$Be(oh'OcǗINwdTʇLI]֔o!3"[}icJ  DfF4M*?0u웤<N傪&,G)!FS8%5oy~wo߳g׿`Pguծ5tC ӑnb!g 0Y|b}O箯66^J,S(˲zd5}|y&)[U"~N}/aP!1JIJ &X &vb2p;>ŻF3 E蝐=?b:\[e'%O,0+,hkژF+i#>l6{ԣu ?q။,o8X$W% [H4I7@".�cb>`w4SMxD!òhS{1?8)9UBk!'OooC͓٫gdz{{NqȠ5"څS$ycݵ$M9[kfaaAnS gP<0n�J lHT�{s𣃻?u&ɳ|Q6ao*H)RFi)NR2DI6wOud1g>#iҪzt~S4NpU$S܆Õsgii~g٭YLgBO77'ki&KzUUfb',-o`k-;R'݅j.WJNf<^)1Wl6AR(mN ylGQōvFAW4Ӧi9DVVk "JlBLl!Wl\gi}$+NB/Z^p:R7|;k*+t,˔k, g~,ˆɧ=h^&'dyTMsźC$ OV?ZrA8yX*mˉn IV ,sdaai'Nlqz~МZ�mi7n0N{?_*ʤ{cYK#-WHJ7b辁|=\6i~_2IyeLZJ5xg`@ܸnr0ftgkaUrGBeƹm8ߓ,B3D@_Q0]B痝_ehCs^"v4ܜһYs;T삍lN/Eϋ,jҌ0S9Л(U3|\ ~9;mHee;~/?:;EqkQ+ `.hM& suB2 F,MT?Z}.Ç7omNDuNUQx˟6yAbq[^p@0gh:v 3)�AQZr|l1 預^yZM6!Dx1g?� ƽhL&̳g};M !;$_H:�&'73F�nG?<JwU]Di|ytv3˜l5ԚwWi;É΍mJN�8G I BwUͯZ#q^FdhbW0}g'G<:< 7Ƀ'~j5 IN:M2CU~\#[Żw|eeE Y3 4Ve]wwIZMz5-ؽ0"~vM_1mI;/^n;y3oX躮wOZ/d,.vvx<&{'q0Z*,84¢;7 D _[>EGv.?ōr`300>朜 #ܕHz^!_@OL6Iշe"MӼպ7U]a!F)OxLJj~ 7ܰ|3άv#V2z%�, ':aE8ծsb4aGzyLQxxCkihLc9}\- >Q}\tc'lOߙG`Lv&|fkv:z뭑a&1d2h: !:qt;SXhid`A0jZM=ۭywLӣG&Iyh,BsUU%YMZpm_l( M&P ł{_ؕ�27 _)@`*̥;|`<)ѵTq#Fw k�_!< ׆$ڧ}Ho.9+N]uiH4]XXtzA2)bBM0[�� �IDATD?$|> 3P� $j"š24I|ЕB08/ sO�0 uZkqom%/u#F7SkN'{$⾳舰uZw؝1rD ǁ[�DDyd-\ZZ4=u.#Ng6Ejt??$ʊ>(/vXMM}3XSC~W0|ah?q;$S#S)x$ ?>3^>j5H|r+p3>Î7\YYazWbg6YlQ=jY^^>6GQc$]I,!`+d ;SwH8\mȯlHw|y+AӮK<xWf!X9LĀ9h43ıU9 {N# BoBF> H O>x: {&=rΥvӗM_|pɤ&e}G7~/.@S٧f_Xsme5wҽս'ѳWHJ{#(\yq@`R_v`|p"<tBK7 Qqrub Ywb6z-(iz{˃pF:thcY>)n*冒]~&IN%vhwP0o okS#7�DúW$Q"U>wL2ŤkYp�Q(rѝ=?j ";뱪*y+fL�D9PH8S\f<p!!uwq;=Kd|S'N:ΤL7;-/g矿Cy\NO,*>[$!)Wz֩ϷKw2d =3刡gH#Tf7Lc!J66|^ڈB='wD(׼-4.dYR 4-0(�ceݿU9B ^̚$LzfȰo &+I!tW:A~ݪ i0 W<au;s>s+de抑-F* 7s?牶nȕq`<>vB�w]H$ H07jgWE4tiPV-ڑ$4;}7ʦi؝i:]T5ϊWy:_^^VW]O5%$$5Cdy)`Zw<rGkIf1%rd yO{>,*ysg G!ZЈ!FG~uIc|be)}:VD軸$DɂYOfyHB:L4:FnFNHy|DD6EaQ Uƙ5|y.U{m8&Pw&u w\ek<ņz () 2 'lhөDa֝y$J.nD-eTܑ99KDȫBorv=-&ǾJ?q4Mr:v6!eʸ;Z߬[a#r|6ܵ8+@vr!mpQ%%c ?}(d7]CMQ){Ϗo8o GsA0{:h)"OD0\'vŀ>@cE"֥-]4bȋc̫^xx PǥKs;5'rto5/* ie֘A:<*]d)彗Q |vĭ.m;!gḐVp{W gO鉥G'@2Bn. 4nݲ&aڨ,|IE=)E@R<?j7l6,N th9ZPQ?f>ƍj8|^0z]^cj'jV�/N߿!+;V1(ұt[UÞ={YYYqoʏ V7?2kiTJZ+m|F! Lir % 3`sPejImοwdYz.ڔ>Lz9q J)67vNf[eof3:-qLaݓFE)t}ڙ漋Njw57.H DEqj0K,2xNB.QQOo?3 f?=W'ǝ*(C-Da<f�,ţY絝0 Mh:NyOF/z~iIa!x +'Kзt/z?CS#h9/<c`\<r<%+ $H͹NpоK8M0_|Q!F sjLKGLo<2t3Y[jF-"8.˽Hu`c>0R HDw xyV'ZrtpR?Аg>1<<}MLϷ+BL :a;4VyIE->3KXY)dtG @)/j;O_.L.< EY%5Vj$$yur SsM;a mWw {k!JgPR8TFW'\Zrq*Ky@ļё@.8~T4OK,l,RCgGWf$iBuR&aKw)1,+шæ$ .M]J` ڷY,JH>Δe�)"I&;i'+>W}Aw͋-6il`|J|1 K-�IF*Ϡ;89\Wzz޽8<YQ2hL,)n(vڵ^v^:p6}Ri\Ƽc->jAh?+F/"D\FA*"ɲlaas΁ֽޣ)zF%U$oϽٳvV3?gA(T4T"7oе|k_#3Np4;=cZl{y!–r<u5fy}ŊW!t a|r hba.$^jz{hP(Y"xNh$#"J%>R !,..>سgC7:&&ufb(!wu1${fx:鬸o4ա;0)"zF͞ԑp@BL  Ge/~(�XZо!0`v:%kd@ݻg1n6\;܏&65dtLT=VoaN\0Æ�Sbp)yɟN_Ť͓$ɓ''߿Z( KB9{;-M``J?(,lX"}D7\xIjS5lPxtXFmEc6Un~[nE݂igꐎ6i$:yd 2q1r{5-FODIi':͌'HRq栢Fмa䒫#4CTZLX:}&iz{ĉ 2o$I%tPr0{}#ir~:ޚf<사>Zc-LgH!ٽp/~'˜OwcȦk9R:!v>X9h@N^}dJ垅P.<8pdR'&EwC#dY"#GҊT`J~!5bB"9,ͪNCMMຜJ5W5@v<LY%_H-<9('&4Ϳg^w"Hsߜ-έPHѨ%=?(Q _= &H5lnb]z=`=t8ݻLdW+YɓNWȈX>o\u{#u+/anL^6=WVkw:7B<r\#=iFӑ`꟔서my-]5҅ŖJ&tn>0`6i4`0�pi*F|r#jx@/$qj#$Cd 4Aҳlii}ATꢖ (�.L#IO2{lYu})6H$Fxv[>suE&h&9Lz|\1_>l,ԓhG|T<uRwd�a!�\�d]2h9T0Lh5Rٰ_Ϣ-;I0,?ϘDŽd~]Зê u=yC</Se ޚ%,Eˁm!>4I. |n#l4W\Ucتok| kM_5KM@ Ɏf2"D2h+˲zZ5Q$iE]N�wEӁci$Σ[EPAP+dro}Ny^їov;m99*Zd{*+yrc\dCDv @JHpC70C7ޗ,)]t%n<,f~)zqQݵ C^ىayԡ;{_Ļ�Ν!(&IB?pQf2`B?H/US8\*"Kd˲<///'L]][9|o'l,)Zݡ8r5p A\P>kfT{H=3*!GTXG$dhq%>L5o4.5>>eYzA=g< b W49tq P˩DUE!5yn :>p7%v476OuIȋn foQrrZֺĉOnZފ32cnO,?ݮx~|SNT4ot`4Xt:\=aı_ ҂}"tmi"FU$J\פ?3&U]oF' &}0(7Zk&4!/E=ệX OB'(vBvɓr2)Ilr[ ip Y[#ObK_Z?$Ǔh|q<^M @%&+ ]swЏ<=)p}X|:s! M (Z�F9C\ف$n|cju$M4IHt`=&-ʁ r(E[ \_E :$΋�4\4PډFoa]<<F~:a1dz1u9X4ANq° A~@U=Dy3C~"ri,i6"kUVi>ݚ?q+kPTH=oy�qy}+4`ƨ:T5:^"$I`zQ+6<lrSK}T-G2 ^0~ٳ?8H�9X(A%8b6B20SGc~B7KJ$Mf$jmyb�46NNQ#ǝlX.hPyӂТ]#^m&4)[yY'Io%+c& ˖Zk$#]UXF"^{?BJ_w?72Sݼ{n)uӨqO2$ݩr Cg0(0<N.Z*]&@!D5nYZWulۯ!B7fuUf#.2x?}i8{գUU]veYvر,ϧ_sݴ 7ɢx©'t|HJ&oyV":/rIt;jT3.T4u9ι;wo1/Xk)vR`~\kZ#}qǟa(ԭ ߄[mQ9ҤN)pAb~ȝ t~W�zh*aށVp.PH3 זR;QhInldYdWWWdݏ$vB®C(&ω,q׍&IƧO+ɋ'M$uRhnG608e+ꤳV\e4D(L/eyvYg]ypeeeyy5? S 4Dr 4iYt:dL@ O.W8 \V[bf0k�o |t\G'u.!Úic-7ϩӡ>XU)gU+UZTykG2J`MT<;P(f_voWo:Vd$Ӌ}Z;бz@BO{`o6!1X4QDe235 E{"_ #"Rsi.jyUUG!ל~s|Gw#۝mϩy}REG] iE&(hm<& ^4I~T;4HVlm,w\JoYްh"CU؞=r־|뭷=5cĽ 7iԩVӰ 홻j׮]VdQvmз|6pfwvzFEy"m3,&!9I4fY8;g!irg".0zld*%PI@De/(+!=v:ŋ�8ݴ{W^y^J:{gȑT@.GyfV^!u( <H@B8@|DJ3q&o޴.r 9u\cyx:FI~# )y(>Y2i=}N 298#!KdUTQœcH;ͳ*O [Z]˅[n={~ z8f>Z;;LTY1Wh)%秡T-cX7tpyqx9!,aі՗I[_mM:IfVjC*A:c4bg\CuCXS~Cg>رcvx<|&G#@@ 6Ub<�d4xv>O.渙.sDǐ 8<S [4銆Zoi4.1!T??oV=E$rЋ{m!gY+#19s|V˔M[Ƥh{NFYݏt1MV7Wt;+az$_jp"FBqmleY'dyy̓ )7A:S0FD]fǝ hn8\Ezhh_Ѯ?̖@Tl x6N6}f7T'~g7UUU%I4w4;F© J6&�dᖰ$JQoX:ߩzqժf;sWVVB@#5eueiH8I/ Ig$!)Q',ͼ\jS[= �.xv* Ξ b$i{RP9{,|-)HHՒH>N/g8UN*(sZ\aׇ fHVcgy:M/>'NǏaҟtt02!nQ1hcv Ѝ85lO]j&="�� �IDATv[>~t$IvS𸅵L62*g@ω(L^v)e7!E8IGSxό6-D`4J &1ɎiPT2~hD i4MaY e p^_Ab\zdQmQUfb9Z<T8C@ۇ9g0<3Q즛nt!^tLԿ z=ż9?2x '~7 wn9HKv׆E)Vt Oe"W/fl[7+ΐKhr=ɩa\~Ég*lv2!`*z=lAVjhJe"QQ{ v5pҿKH0ge]b[PİOz cӶu6nRZ<Ѫxwu JXU$Y-|(Ȑ]Qv>Oբ_UR%yz着K_kߑEc+t r"dn: oUUg?7TϾ6*< 4_*ⴔh҇T~[eϓl X7<5T?]ް&eͬ/'թn6+9zF=JsfRwpBC<ՔHq{ 9!n=6K:v~h,}3Z-={6>{o~od29qDay%%F CpwcOAǠZɜa :R06K!'1@3û&$)]SVnZeIjq6TF666zCq}&wo!nB8ɯG)?[x<v.4G} }H?I�2%^2.ꝏ,C|rYBBCv0$M[|Xؐ}}[5W4uQ'_IWCAevC({6]BXw@|_c^'_u턜jwP,{`iKm5{ck7fWSUɓ'צy}Nn:^qm`'rdY3'=gw\q7la"D)q"ZN"[/Ls mrv Buԓ�뵚&9PQN$?fQJQiY{ QSp8W"JtaIW;^%a,YRf;8!!I'hNZQ Ûs:۳H~ӹ뮻$I$MhD_N"Fk71Tؽ遼( |ǹe�<g{nE^pYm K<<Ou^o!nտNGnba9ٟFQ-m y~g}@G,e'~Z`=4~}B%+&a56o^D&%#Ag81އ� NFpVy$YvOYVf@lgP3U\3FUz[,ʎK8;A]qaAWUU^&dy}g=sBϨ6U^eHJ+|b׵;M8ĵHRoE$IKqҨ<S,>[@\|1R1ۿIyif4mN\Ѯ}D":ޢ픢HB9n#.Vl.$R-^o.?r>Pry.ɩ Ų{z8OyYd-1:8MӺ{Oi松7zS B'ю\K+n™ u=R" wǬ\tIvt ͹MMdl-EW;=#PS&D"6#z%,<h6%^4Y QJKڳߚUtBhzM}V]IN:];կ[z{r F8*#Bs�e41!; #5"J1g^I;Ux<V#]g)HZͫUz(Z,4ipv}D)I;4AA2hX{$N|.]y.r;s9(u]_%tq֐3fҞzޞŐJ7# L&<?w^Y[siLW"GvI ]6ǶAϜ}p>mꪚ>nj}|4'eaFBJϞ|ܺw ձ*˲껫,wСgGn!`{*yX!DOwtt<uή˒$jq<&l_џ<`R>l$,I:;DWF`XRMClvެi&O&btΆL〛 hPg0avT6k7֬Uz(ui$@aYEK"Ja`Ƚ|كX2´]ѷc=3;!gBC95WHXedqsyngW|%b+6Q(xGgÝ�wE*YygA Rn9h6t\yPaiS8)rib'Ui<9N&?i)(/kLTFt0G p 9>?UQKk(ኄS-,W^R|i! I&׭kZ^eYTd7ʪP*!`AeUV\ ao{4Mϛ۬~^4$kDN(O$ B-naB1(i!"OE,ۄۛɫ&-BhBoɑ>+0:ƾ\'0@&xJ3D%5lQ"N/g5wJ.XB/f_K<:ޓ{^<+~`EQNB oDR՚ڮˌvʦoi} ߁#ִ\>Ǒ#|j yn! ./ Hu)7_~p_ndL{W^ro[#ݏIPsO ĵ22sC< М|ď$&IHB$iqz<˻dvD#("ŞSjm9-ZkںQAEW�@–@B'3dݞ|߹{<H3|B2>|{}˘FHR›gjxC `NEŀ^U =[YFpr}=q0Q`MM.WXhQ#Bb\^]^.fT̟f&HLejBMRӽ;Dw5M`! -B(�$dXTWLd(B&*D&ªs5$בͪ )geN6yea6Q֮gχ[\Xev@|&(l!ŋ" ~yk/y# B*Gch@c YȈ ͟aB@W7Lww؟@c]tRj|||!,?,�V 8bȯ AgEfl y|1r3kB.YN_-Zn|c];{f+62 HGGV"�jTy|P̴lɥ7re"OkH*:R5`Oqݸg rYmH@ $>QI5rɈ<5= K -k`cPچ"{�L ӗ5H9v:ChDe__Eig(,YrG:jWۺ~a ^/gHbwRHH>&eY7lc^A:f+.Aglƅ꛷X =XxؘděCW^i3K}`G*rf+ҦY18Nؼm"h=b9=; SECa!*31c }vF R2Kdal|yQsG}N8!I)s/q{,'09eC3Ў0 )�8iB,fp2mt },K 7!qhȸ`Bw˪}l�k+<L Y-t9;m4(T7RwmϭpVH_+W<z=cL3MZ}`yXfBLT$ځ“j%c1C$W Ao] (SK@+`g3T10cؤciR}/_vF>6۵k\4M|pv<ccc{>g4'!478V∏<rl]l諪YvZv}saTA1[Z/;ߙu*BPrA BZIu.kZ�$,[cݹsp`PZ5:F9!<31F1UU9+ LWă-Tl,?C*5W _FR�#DEz" )g8P>hJe7_WgUEV###~_)e259;F~8狸$afD.E +2`ᇰC @*i`!u}ax $0fᲀ}Ҋ)qt:|`h<O}zJh+AhGd' $X 'fhHMGZ4&1Wտ dϫKeP={LNN &SgOeC4DwSFkgl-k-{6Ci6$T:0!)Q?7nt:y{*qV? *|Vj)[B`f:%>fLqmjLޭ K؏ @C 5Z2EDm,?Q Ґg ¸܁}YQՇ׺zkūru]`wNLLֺXYW(:B.fZ0E .>�ӆ@^%p F Nڈ@]By wLV`hm9dUEZ1mg#iຈ�3u$`-EȐoi6#`D=Ń  I[kuCc< kۗŵ+\J~WdR�Ư0oWs SMrm~y4Muyպʲ  Nl+ѿJ'0$`I, ʥ|񶃼m!1)?, |,t2EĊ+@;XUxC`aɮ@nq!H)8p>awcccin|ѪH[][9WJKm>�NDV ig105. Wokp>q2wH8aMՉ;ߩeql,,/Ds Xۛ9 ]qex;O h[6ԟ՗+k+\z{Ek#g]QE:߱JK/Oޔ<q_-~J#YqeRMp6ĮD=vPoZ]UuZ]4%3Lܘ 8+bQ"jd51qz=;Ȫɽ P>RØ`ú(1a�M~RṈr )g??ʻzH%:jrtɍ>ž|[w-j6>a=/ar<$i50^>2±* H8?o^g4PJET ˧(,1B(1W`r;ݱ sIg&~+R:ld1Pd TƲw<.\y/[KDG>#? e5(o}]2vcڛ}-,]C6#`Uǃ?( 5u.CR*B4Zb8R7L|E>,l$@ds^�τNEs*$t8@BN5/;3]eޒaMkn<SX)(S`pUn*t5Sf%wW0MFY}MڭC%.Y좝kvXk{-,Vga}%0"rOQ_xc&' 8 }7E"YPDZ2) /2-g(nU#8qj+SuӎWjfYvY1�mdbֹx%zbLW8Jk]^]mz|Ç"&zS#2aKЁM4XA ڦn9øȪHylbc{-eUX<eY20nsԴ>VgF 5@X=`kK0C G0~ UTA-\�p̆q+} y)x', $~ ڃqC>ODOE?+KsacR3Nzuc׉2DH`hkI(' MvE}2 1tEP�%c9?.Y~C~|\jp*@ds5+`5 9 Ɑ\\I I-᣻ӝ?ϗ2J"|RM"ĉMԺ1ܬx[,0xf&3N2,`]7Ф5R̀1 UNAoV$%,ՌZ[װ8XA_1'HַC Jq@ ^3n "iݙ OrdDXsH ¤ �_mEb �$'?A[y^?V?~zW0W/ j_Kl)/4vZn!LwY YvL`bCF#zy&Y1 Y,,>Kι*!RN5 Yߒ|%ޞA(92B(<!|g`�QNB%pRз|k@/kK?7>h|ޝFSQ,_2 >8~``Cj2/77OĦ0ũLˠNs͌|0�A S  *hWL*c.) PK@C<THOzg{ɚC;<X|uC Ux iVѦ3l)#{�=4oո<GG#?Q?<?SXY|h }ׇ;~̫Jߝ[Ƿ?.�R2fݠ??ayޑ�) aElYGPa>^gRr"tξS\$˗~?={ppԧxPEOB�?$DL{/5]`v[LqyWt]QkTEQYg)U_[dVPmO9!1 *DZkUČ2[]2 lˀ-vX}H q$CS2HB;rS\g39`dH~*mM UˌIE=@@3aIxi ͉; 1@Ԏx枼ňZd@Qy1,ҳrW~ZBj,[iImS30Q<tD`AdYJW*Uի*ǿӀxR̓>&ktT̑Ȍb-}\1@DP&Tx^d [&1y$I ^dVYb" I`3P?C4k.CJ橩)^"Bf6xrZ*_>znҥgqFy'&L6mK&Dkm |e6 hNrG$F3M̓ƿ7λIۆ@tXenMxXff(Š\0@P6E1U6V@~ d3*_l=�� �IDATnbI!,BL>bu=?|M idR6fdY9K"3OdQo ){ժ* DUo&UYrpқҕ91buildUKwCQk<^T@1W`(?eE$00ZAy_oX;`I8uЛ7o޾}UU忑GF>_%<&A 0aalX{_r0(ػk9"iL_\q[nW#,'eOA X`el@$1o1ohjgi8�P&,s|yO9'j€qc#wf/{YZJiS+''a1BC"ql p (A\kD@1B']nB, 4X>Bٟv}GnܸSBsSQV@|QL1jm/vMnOpbPQ[@p|�d42 a:WO,3jOu]YĻн%_LgTb�.0H:axeVAE9yVJ!MKn; R6٦,O5Kp) G|~1\ 瓿I`R!"]\9TcIp`O#f'#;2U)>#{% ;BN TmGy̫V4A6 ^>Wɗd@ sKyQĖϠޡ(Jœ~WwlcF8 4994xlW9^sˊVzTvTgT w޺zDp:xW;#FGG׭[7q^5:~<nxj?n !qseyMRjvS (((n�}׏e Tsu]ڍ'UUkx]lE%hD#F(Z_.Og\jH /xg9m[`Sr=lٲe|||ƍe,(F7RY1mc5yobRaclyԭC*eE<ېs,MD.<i ]5-ls.q7]߱73̙tb 1W~|&čKf,s̅4 (Ŋ 6`np@z_A*3,Th -Z)e^>Z%lW(|ʅYs~T}ju$匏[k͈齧׾1eǵZ膨XcJL~ ? 7uF| U4fkmqR3dmZNC 'bƠ -".h_J+i tbx <spq _6?QKFw ^C~H,"`X{*nKS|<'%)͹2�Lr5QH%ЫFˎ 1Ty,_ [e.ps<`jFXz"'ؕZSU(}:ծyv2(322Xƚh)0JE^#<3vkJZ+]zm f``pR5WBIfřEE<jY'~ͿzEDVqCO�4nFLɓ3^^XeꝜ%HIv\tiY�֞ejGG@M~qNt;+ⵅum9ٻ3}vQD$EufƵ@)8s]䟓cKXRU՞={o]Eyvsh"u!52ˠ-$WvΟn#w s[2,a^A_<iI\}VmSkbSe~rg%xA>R<PSqk┢W2) A#T� u)ЉBt/}C:oPJc'X ,IqgBs>^ZgcRV+MS9;+@A)l6+)(j]+=T@Xb\O]Ȃz)J?_n1[Wxe$E. {�W\_%_9�~ex&rS\d1sf]帐rꈫU>> X@;Sl&3zy}.u<mլʴ}VGo;^?U%:_zo{LߪYjװ R``a:[:.8x> ,U= Ӽ?7hMⒺfQuE3-n[]˖zy�2\hMF =xh ç")J>|>J|t, b`"}< Kއe`]^76l6vxЁ~,{&&&zGEz\9,-!1B%K.ILgw}{fJ<قţK|y~=wźse~rŤ{6/f+v xޭ1 EUuC6mbqtQ~ j bZy/NlrSjv?1}s;\_ozwYJ�km^;ƃ ;4KzɁɁ]v߼y3<o˫+rns3)YAD]"/cC0E&L 50[vʕK=htɒ%/kE)֝Ƀ@ @<-lI?^LQgv,H A کP<ЄqQv-~i+#S{b_Ew_pr .Dz1fs#<" `X!f9?Yk+IyOY]U7oϲ( b_㿎bj=1푫ի*wKfl~ސEh:AE~31aՁK,`xILAi|R@؟AF"Fdj+_6Ԩ[GNR]mG#TjF*3>!C1eMI<˲ ׯ?裳,ۺuk{ ͌1w]@edX4yGPɰnhXBFFd %7lX!</[G[#3<3ܶmmݶa=G?D@@Ap⳰){&BSfVs}:*#P#9 y?JFI ()7DƘⷊY:)Fw\*gđW@ZHvÆ _}ۻw-wzYfT~`vihkzFrwrjV5/?1])#],/*L?֏ד#qd۷oޣ쏳 h̀3Cyy3TnVy*ˉr%@a%| JF;_, 9T-Mmvc'y }qF{?EVgݺueYgf1{W>`4:֨"BV$de``nšaPRm:zeKj, Tbk)87رcǾ}&''&{K]y`/8@̻<2?l~Ƈ|T<<M&n"гb@,`-SՑQȮtzίF:*R{uC{g7=qF 3>Mxp3GC}im0nsn%Lܱ'ofZu<.Ү)7&FaXAkm۶FRni[b=<?OصkK+6Ns7MOdOn-+/PmVFsKPy3$?lB'{!b.đRzVgu*8Qo9ଣi p,),=55ew3kH m W9mXp x:'du8):W+~Gmg Ml(F!W< b'<~>"IQ{s(J԰|+`1^./rB&/ Dѡ"Gcʿ(fEF'yM^%/hw}UUxo'{Ѓ c&1rv@Ø5Po1# 革u8ݸҳZ>JLlЈM퇇>q;㠘,?Mb3 ̓@#b씹jF]ܱwk6@~ o"!;( 56nS&+Zwu֑=fofUNa� j^1Lzu.ϫck{&npt8Uǖ@CH:8zPouِʯy'/VHެ"E<ڏ?;;[nxᇷlCuǺdwdfKsG JB zV%k&6 ؋^s\,Jς^Px hS7PX;hq5kMP)LCjX}n+I⿊]=G|fT<;djok e8 {cEFB3VgTRvYlc?=&6Ւ*}g*= k삾2,Mo6{lQO?4>5,@A r|dXpRp7P>r ,ܲ ?#^_owuYe6ߧ)Yga�<L.V(Renc쓙1FyNs2I‘Ş& .�̗>_Z7l-j}ccc6lX~}N!//+Hxjj+.$U=qnU?[f͚`= k9ŝn@1e>,!%ˡ,ctQP"1Ǖg -c!l 5PX'.X~9EE=MU$ uhks\jW7mMs?{GUUGWd=K!N~֞`T^ ?⣈!% v`L_άlEDq{Z5VdΝY@A: I1ÅRՂ#*A�^Yr姉=*z?ZGZuR﫝wιnKS>I b?�LI-[ SqyH1!<0 FM'[k@ahS3JPxWu]<_|ǯ^kZkq}"B0c)ٮ (\̴!RF-x!m-@EWb7$6P„Y hp&3Nd$K lj=Ӎ7jЫ,,-sXb뺮}KX]-{EfVߢ3 'V9Q`+ˬ88ɍr˲myF]כ6mRT+έhW~ԕ;u|M8r򌫁IT9 b_C̺m<O% W&8TBٟmЇfy5=]aݫ{Resg"L)8j2s%+2,9 9/~`!@`ƔL`0ؾ}+(c)]bVV.ś^ܟg檡dN+ʁЁ &X`qRMF'I"2_@1D(ʰ[+LF,RA�ìF. hv)G^-gOLGߌ!k׬T%u衇cv؁q1Ovf,n/<OOH/^_'$e�Lex*[W !Idh =4d]񝂧;[/p>t|{`nfCϦh:c;a<: o)�<rx5  μ\`I\:\を|P;v5v3F$aj)^d3E~3К0Su q Rk^\1(҉JUfz5<looo|~={vQ\V˫cE&mH*\'0qQJEwGxne\ʟͦ0v@׊&}pJ:sxrA+8'Sl1 N!LxPֺZק;;rf:|Qu]a VOIz-⣖st:7| ߺaqV96uW>7#? t �rkP."SuO�FgVNk2߿fZL]%Ir! {pnX)rc3`' dCONfSSެyuYpQ,g!<wg3l<jcߚ ,O_x1s4p4@ -MR K#:@D=E^d,6ڙ[\,+_UW˫R)KnJ̳>l֪VvU/UťŶmۺu8p+\6ҹvr{Z*0Ӂ߲vZ0)*Zf)AJ]�舚ʎpFwZY +� pC޲eYj$5AFqS}A*<׭[1�bNmZz^xAYgu}elP4fs2% ar%b6 /]p-VŇ"IlneG)(>^h{`1}<`T8gMy0`;33aUR/[U؝pY%By^[Ԗu ոF]\xŅ_^~z[eD+ĥ=06w,|:͗KJ;aok ?[TW*REQ")M:FlχY7ޏ<ǀ- xdKn uC>VC~ K @8'O`* *ƭL~1U}͂`1jdwMMMmݺu۶mVk߾}k֬ٳgϠ?Z&ܙ6]d?Ev#P ɁL FFǖ>â8C*$ܰ슌~-@m^l2qCa2̀?)e˃Yb Xqx#H}By.^=j(I뫪2dӍa I1^3~խVKtYƑ.Hₗ:@`|Q,̺jR<g#iU^Q/fՏUu^eI>h2V|bV7?ǂp*BN -R XFL�YF14\rwBXG}Le^tHeyov-p @8jZUUSz'N:iǎwC鿦ttƲLh E$8yg&tss q ^aA}'@NSS _ &޾ぅSڸ{ ۠ӊs"WFAڨxI;jy!օjU_>BXQOF_fG@yPr-ihG+0%eW]1#r)2<A LɃI #?ݫf`bB:.�ـbÆj +%:z;4M4%*G) !W[)AY*wEE|2 Db@!F0 �� �IDATNkvHWy61fN�1ZfQn~ի'҉=+}h6*?Vtˉ,% J#Wxdd#;Am*˨H_dA,C0;x!sF$B&YGuX -M9?(:V0>Ar)WjtI>hQ:Ӿyb[, �|֫o]KȜT$@p,qXJ| D6N�a(L(\FFF9昉ݻwctU+b5{5o?,. @ `w00:,\"p\ H xaQ爒N9IϢA,9,la+}D`.J_yB<ra}^^WWZiU[]eQ̀G.xGk)Zk[_ʛn-2;+S{_V'y33 klAn|ZM6biEh&3ZIk v v?t5<LGV㪅UAA+eTpSȵXۏ(v=4`֦rlBpDǹ2_&7N\Yb4WAö&PF &RSR8!jl%&)AH>f@R db ϖeHWi6 v]['n@fz|]'p-0{ef1zR7>(,ub֌s. 8uHUU%_K=yg5MS3ozE(jo8Ph4guƘ{ٳ-^ L�aBL8 btQ<66c0x7Ll1z� i7fN�XuyXd}zgg{֭[s>[ E2=A]<O3�E6hr`N<fh u9W3gf2S[/󩩩{l۶mu f̉ ,o[�@<=@uc�D~,y#P8 PEV.bGZt||Ǝ<@gM! `L&Bm*"^һT7Q}3hY<iWTfVhƺ^9; C�D;<3蟢g4Nn: {NTsfgfXXly6 p[y(8+m[ 0 c$"Osű.2lb&LBỀ'G%pА'E \=Q"N9_adӅU>YUujQw[dsb#R͈Ȳ.?Ql6Q<Ao(̼2unwSs=yEu1XFd\^}oJ,˪9]tg8i&(G8+Wh0&<LJ4A _s# :;8@ef5;w36yiVrWL ~�ad">?ucD}E[*ֺL5qj79r8wk\0[LR%vg7?7u3l6A)Հܦ8$`4-W@\g'%'7K`F& 5r 8�csǖ ƨ N0/Ȣ=4T'#/l#͇y3ufSƂ~xNH]!y*TS\4o~C|3h/σ; xFAyd <�b'l>5ff>Q)S7|�>( gY_GF7b8 xY?4 ӟ9 Qu}c h<`qm }I\�v\jiULOMʕǬw+{^{U?5VI& =PyLP_FEkP׵)ߖNakƃ &wJ<@,WZq D@<[EW%p1 i(16`�3ɸe�|8,,o6ƈze1\@-螡 eCOJ"/bT>L$}JG"lq>0>XJȄ.T^.x<^T5i2`%9[yDO PEXL;LoFcDRsU1P읩gk꠳TiƘ[ߩ1N;l+Br%ʡ�I^cw"]S#re`U<݋ݢ?_w饗XU?VXCG>ʔ9](^5J@E##~e5n]lYMY6CU+[ѾHJܸ@6ɾDx^zPd/SY{)؜ER-.$@= 4I%[N"Q8e<# Vvv@~AWEs�w"'ww`/Yy싊OF )g?RW/ӗj[{3\:,5Ts%mx#͊[zHl9֘?e#H1F2V < 2ԓ:pݲv5 : YL�Td �'`�(Zĥ$Ò.@ä>_O>nu]O~grS$_KSJuqܔ8ܘ #wR!e*=$Y~|M(/ ~^jժ'p<+RA5ƈl.^x+}[` sl&\* ۊ L~ 3AKc%CV.�1\nkR*d0` Yp z)0 !l`NljËvo ּw J#"to7RTՅ_39K�yn%PSK)%>i8ul^ȼ;((@{DA0?˼^ ?GAt"G?? 0QR3Y>q,A <ZBH{| ګ_YɆ\%H9x雯ZrՉ'(袋FFFsFtA7K?Ԏ[)TONdL<d9VWjRݻ{g0QZmVUQHT*F[[n߾Z^kި݁ }ބ-SkbPH_#)ídd\ӑ+<)l(Ga1Xe$\DŽrf?2O"\`) 51 >vS$!2,K }9X, : -%K=E~-mSJ욬`v\H9M0,3Ϋ3xKA,'Pĉ 18R$46&V#g85Wfz 3(Aŋe)P;V/Yg>(  =K̓[�y8 D�;,Vگu-Q[)U0[L4\iei \x(k`6*#~ *X)VkO?m۰N|uNo@k[x﫳+DIsK�/T{( 1d dQF 3w�hƛ1,P3E xDqUS{Ld!Zhџ!]C0濑6TnTKrPPb6ULfq1pǻH|O9X#`~=0fF2(sٛu Mޢ續#l',.%G ď ڈ_h4>%Kۀ1g uIYy,D-MLLlZip6l ]zMݴ*ZU|z8giZ)SOhVq�* &Q:Avr6==vEwYllE:�RH\\v}X]yjN AUfƔ?ޤ P3gj慞"S'5` `r , VД.fQF+ȇ| 6x\cz`2%XÍuocCw~ŇЪ:]P/�IrWaY|ZdfP}3|4" @2#~?Sd1u|p)٣LL̐w555ŰKLoL!<صfgkV{䆒2"0<4y}>$Idɒ[o]m%/'p駟y扉4MvEQ܈e+Bs.>ScAu|/%K#|89ke ctyeΫOv5MrpP$w´+J( I+F u-^ u92E HmX9Psxq#XwdOpA9 b`glfŬ "�`: Hl2Ǖs~wǸxulbxC9$M6Ig`mXG FYAVխB,&>c|yLyDB< q'/$n%i1t!RS3v =c<N~bΛC q'~ h#IYaC9|'c/{%vpϢyvu3(UV=۶mZj=6a qʦ}6} u콏TJ3 XH&y8߱J)) P|9 0Dxf( QDҍetm-a+RubZ_�I|ʉ<<X@cye*!Xh!`%H3!dMym95&Gr36O~? G Ieڒ�GC<H` Q+t %8<<a5EFp!g3$L]JYsg'.!0a2CP8Xh4AeG/G 8!Zݥ-q3=/~oO~m2+~bbbΝ:4ڰ}.d)EjL5FvVA(j-}) Pܒ(CZGG}OiuM@X Wr02ZXR^f҃E9شq~0'J=:T~)˲LS_�?f]["F<bHN9)"VF[R?,}Yy#whu�Yk�ad ct 24/.BĬ`O ;؀ps�H\ئ%pgkNW@a"97|l uMyb|/ۄ˳2ni6|y/XdɆ :NH/ ]&26nh(>`n_~3BB&0&lQ|`}@KcaR$.OXU'Ɲ:+qox-(*B)P`NޞF3 $U*/p�Oe@XNKkX)%jZrq=#k Ȃ,`:~$.kPAC:I%I_,*&0vލH#b$A'�֍Ss=uP*b @ o8"TH lZbLHa Ivgؗ怅"FYEj:O]E^&X5r6oKsPʾ} gx Qž ~{ד-YsI`,1Yˋjю $%Gܵ�*|'XTtPe 1 +rVyu&a#((#tEQH;b46W3m *D&o TiG<gn~(ϴykZx>nuS=_`@}0smmѦwmOuTC 47F*T|vQ[ۂ])k`0| M&It:VQI(c�`R.=odG+8XޑsT`ă4 >dq髧݁,^[y_| :Qea7!CakH.P/K"$G 9W�] $! 9aYW^du`w|/Lbq._)l6@qdwdb�c_deTv<2`p;pJӏ5irZGT,0wS?Rv3Z]f̚T$ɂT� $54<; 76|c@\\.9XuK.ݱc<-#qc[B[c v0%}1uΉ&ܠgO 9^:e{4k3V�-.\R Ju0:B{{FF]i]%oX]O?cI)NG^?/F&?Oh֙" PIu|H~DB@@g zaERk#Âhwao@. G2AA[ nq 8Eu 7s&fQQpNU9L=ۗg5mVZ<k+[;6ڭqe8xq!� ]&)HADi@b jT}=[6di�0 al<BDy,+xް {L W]=7sܯ|n�H�)-W2kfk#F~| 1 dpE>L6e:D[E0Ŗ "?P~2'$H6@c uğӬ# |PYbf?kE(8^*9<wdD@O `qXр&0#:~0PHj\LE)6pf TKV'-݈+/8nNSUޮu W?\Cf<c&P&wP*D! KPi`$P!d,~`0ؾ}{-"296lba,786'f 朢Cx*\,bSn}P~2Zw؍nOe{a@~(APhqQ&);+V]vݺuvMm2ڈ<q1 dq}`Eo2 ų#^m8B"hdc(m"2̴,Bne=-/V + XbҴ`ÂN ) [E']E2/AeOYoj7j>GͤH~!WXQuQP;|H"㈃˝8k;_ xš% F_ GzeH|ͣ>OLpD _1k@b$b~I_\ x۽kz_ymt#TWT;c~2 ZF3XԄA$teYv{Ŋsg6:י Y< T�f'm@$n +H*R=(J/�3HVsm܂+T<,? naS1ơn(i3)}P:ud#$k181mZ(!Pfrma+QI<MCMAV</m.msn#BouUK#1]ޫo[2.9Y,.[$/Y )w?n1`.]{4D�D3#RgT^W& f+!V8f(jDEQLOOk }kc$ H8V&qŦh8->Q#|=Q?C6m>ֹV;fLfD3 trǑ)g\f)0 d\W0L _dz6n�� �IDATcK,R2A HCx@)3=B \F/5\qo8h4yrHPpWh7g3�g(\UNƘ-rl0v{U 5<0zuMϾEE?l}Sҏu9YdFC60%c9;�ѐ 6aЖvՒMW,@Ny{g?Lcz6ӕ+WtIV_D[2BN s',BR /U+MKrwwqS*qT.K�|!!w 1,^^8pAe Zt�vTs\gIZLXgSvzB3:Fj9;)1B&qo�6 jxι6d[}f3ػwSO=%oeq# ^<z~}μ1ݙ{k[#D}U5i4zZGߌ˙g"2v1xh<xBxABSg إ.a>#a:X&'' `ĒЫ�0 vV4=O;e˖I ))#\lZ2Z˥CQHEV@9F@.i>~(<ϫi*?+$ H%O> L=;}L xnjFφ3, Q<$ gU*`qzˆEc f@`Tn"ICHq'%D7_g݀{U~JR`#X�XTTŪ4!U R3*r b:>>tDzy}Br`Kک-c[no|^mo۵kW6E[3-`^h  waf1�5AybAd!AײwqHmH�x4% WŏGutv{Jw+^֭[뺮*5PR~, ]wHvI###Aq*ߕixղjϏG[Ԕ£x':p@-{-CE2pJp#s+OfYNC4 Ʌm2Rd4M=m7BʌtJA1Ŏs �jv)m6"7Tfaċ(\9*8 �3Ц(Ҕ O>$澊`ܼWYGkm#kWo\Wr;;O<1==yYlj"-`(CPZoyx `P&L[%;iC0�}2`#x\ hZLPO4sjkdZa[.̂�/ W#d5z6eқRƘl6 w@fzC|x&q^ZjɅKK5Sqz ,�&ܧVHDOԙ\'y?R0%M'`#KB8%[NLב6H``żtUQDr| 8FI2#]O;cn�ErE? *^a B$陧k{Z$ٴidըWѷ#Ls,F c 2xҸa`;*�n%Aye! {G1apa@ ,<"Ń$;7fD"}<|j}X2Y +J`Ǜ!h�9^n1{`r E-x_!o80I w23h3ǝg'(9gpx͈eԥEֽ @\71\ 7,�=BAb(~Y"5W聲 \drXhHƐsR~=Wǃ 7O>أqzW*UŮx~- @Bz B̯p8H- ![F*G$h x0?xxeG3b �7~3!`9 y7hѢE'tR]{郦Oe>eTki ^�+ۊ xLt)CwU u7=tP"q6;"aFѮ\`[jFr Y3,=e>{F y@^Aw䡀o ->Uy5-TiXD=Plt2N a A?8`rGxXK\`BPk F@c}<~d>x!g`Mkm!q֞>Q:jYY!T� 1|P*wam $n0?TqUb>+@K~Ɓ�>#B"~g4&�T_]ܴ{+_tWر̣5lD)E.œ"eP?ǃwP�BŇ) oQ5;^ɄP7&y<i</ UP).`!p(zM&]2aHE^f*2LD ]9k -%`B[fi�,5E+LD C 5σH% OjxHa I2[�ὐ[Q(u]G_G.SmYB+x 6 &(3v7daUd%ܔ( VQ΅[HM!?,ȷ`�H9Ж-[nn+Ib�_`a;XY`WV�[#9 ^7鿵_G.%R,moD9qX:.y92P`Tij21'J3H'[)A3>�P=Hg@58wA&8 1:(W~h7]ˏ-w;& 5@`5@AL.Uac@c#9'+7ucj�sτ�fo\g0P,XcQ ;qy'wՌ/\0)dhñ>lj}޽aw-fJBXp0HmҐc"ā)J<fR9r_翑GGzk_.T_5?d/h&ff1Hر l\:#ѓŁ6&Cx!Gi{BԘPddC n"[¸iC7 (%c5c .\ (RCm7v�=pxCS<} 6g_rk9\ t7rg6Qe2!{1X<\T0hÁmmЅ�%W>fY".oQӻwHC-C^�͠ $dmʨGzS= ۦVTjw<flq= }A�QhszEB[?ZkۣgsNBx7P" 8+)1XGk e*A- ? 4 E.`+ @ggc/3;^LNNY{֜ko~3+U"436`@UVT4N%4n߿\ ZPB )܄ 1FKhFP0.Qji8DNyWbdhX2t{8*d%9~hǚijƚŔFM8~/lsk}#lj- q β=er T˕A\Du 5ëQ]A)_^xtXCR[b#ťaEyBtQ/r0'-Q:mI(7;~jD^ 'f'T{3 ka)$ ly^ NWZt`ڦ8sazy*ʛB@U@f4BF:Dž]g6!4O {l:C>۽)G«YvJ6 7sj�|SFؓ7"KDhuSAjDo<КuD }t!hP(Z>}Hn KUL-Gx,:ygeˏA fggqV/鎯8-46 @z6;Hb';r%Y/Zc:%X0u~ Z6 nW0A#}$L'Iݠ{E$]^i9$GSߺHBHX\͠2=Rɶx}HAβ^S&9<nr;#8p`nn}Ξ=+Ns| -!IO'QޡgM(%u=ou2:!jܚeg&T̗x1ދ2|8gfN3|.�sdpZ^}rM({O8! S} N_?8+'(S7|!NH`B}YX"C<L'|Xk ,�m+T�(r_kEߙ/.iLa(V@'WIQqQ h &g hE; ?$x GQ^CǩK/iYYYvve>t]{]uscoƌOЊ0?\|]�@<ϓmZ;:vX^^~E)eZL| 7(wF;?ٚG>Ui'Y)駟:SҲ ^ rehL|޿k>7Mmԅp'gnӰ931hq o_)΋1}!UL,D<>>Kv +@FĪp_+b9oWb %׾D&;J\0q.|jW&ȗ C:WwΝ+Ŧ*&MyOND1 x|Ncf]D1ȿʉhd>zې7\�C99IMӌ "x*zh5wz e3b@w78@NBt]hD"up8\]]N͠)t!C-:"Z^:N|~y3G > > :#'윂΢C=iZ^^ի#3"QӫO �)jFK9@@֬,ڂ$BB6P% U0y$g :ʙi`|/>8Щ$\"C#A60pU\j܇JJءPb_V *:\&y!X kwr$Eq$Qi|>Z<(@G۸ώT6rXhP}ra3,�Z\ޗ(Y"i~H$\2 P0 4�oH c;(=t(Tϑa�_iekӴr]MӄfvemGGWppYVo*++ -Y[a6~C7RcZ?cbp,qQhZ.Æ ׯiÇ/**:yl/+ZG0l /8d5a@?J'n)|0C΂"q[0)[=Xڣ1V%rE�  [Y>UYN=o &}>d8NƏlv^ nhyLWxڅ~r0p@]ss23 ʧ}e|nk+oĿW]GU!/s? ` E7ʶmJ#@gyI/5@_4} [磌f?c02#++oZ xG"^oMu+]ՎjZBuyȱ-aaB{ {]cgN] {h TUUٳ%%%|ɓ'8τy9WuO0ꈹG^g/>f@w]^xOJ١C;B`F|!ӥ\2 D8)xsI{o#Bs`rt?r,f`mљ/ *˅sxG))KsxQbJ<ΎbȩBS>58Iw>ȏF^"=J)۵k׻wﲲ2RQZD^!ؚ}$4TBT[D As^Jr<I%Jrwu樂ĶO5.;f̘ۯZرc@@hwGm`xRNc)k L\LMJ4J 3t5:4ጃvz$e3_^m^ؚf}Qyy8F2&=k0 o`~^ Nx<n۶tu:;ٵARg l+[=-`f΅dv5޽g@Lz9Me8m,\/FLď/zpN!?s~OnsRiJ4/«j@ "SW2DCNcb0"H$rH$xѕtOp>\8 .0~xZki$sOzok1B2sMCi/I-H:t( E"0)++uX 6JJywgZr9R7Ujc_P1|̾#,M`0صkH$rܹ: >x6gObt:OƵ֚;նiK *D挢UR7.{_wuEEE/^LR�x2J}$jkk4x rn%3/B_2L@ ?y0ĕWJ(D"A/v_?' IK=)C؃o&XT *45 =o�(<c4Š' ^'(3ԑhH&I-(GE!HVk.gC!߻苠JK#ƳA$Ѡf : LIk%J0Ώc<qET,rٶMQ;p+HMru]Su|ŰuI.nbO6�6V%q/ծ4-m&4[(N9u\CUUUD"d:ge!b-`J-COqk^8yp ;rnZt�-6�mYBc[t`< sB3eR '4LNS})qNCIX-JR6^!= %͞ECA<Y`sB) 2l^NS� `pQ[.ԆXވD\c?'zi-ftO:^0 =;?ud4 ||$'BqmE8Xk>piTpm|yّM0kflgΆǃZ-d\hBDD@ 5ɳ>!n|l$KŁt:][[[Jڱ:'.Dc )q!Ox>&?vWCE*Wh7qc8\M301&4b@ͧ(ąVxWĊM@,_Rh `03H>> _"H*-p}\\vDҔ`O|H͂o%LB#j# #Fs3On }6F 8bJC{ kc;I/C+Ouqނ<޴KIi_w^ K4$f+YA{u22>=@.4 SΨn2" i Zu,F uCCI)m?O,N'9>&w) hO-x39xf6ՠ8̀kӒ.kjܸ;2vpw8oH)3223pyK!+ІiDUWk> F +A˪i��IDATpZɁDde11I!T#(e2OpXQX<;TpHq63(p+<e`|pQt\d_G,X)qh-_KR:2x2躮`UᓟI!A/jvf;ӑkTMċCͥ^ ._7?7vcR;3Mfڦ%ׅ)cnг#>-t6 bI!3\5\!-H ڸw.{O5BD^DiQ`0v &8ZzR:!qZ!kg?M߅~�2F^ly@?x`Fq-Ѩ�a4,*6|+_W %ܻDBa$-j(vY/N !L@0N~t' '܅;֭Ҍ2 q+ "zհ: ,ugM{ y^pK텷aSQr`!B?&�(™ΕL&yЕ CrɛR*4"i'h4БqW)8QWqv3a@|ʁ9wzTO4Qh|r`2PЏ뺦i K O/QMrcĄi璸cz䁶o MNn~écd<3{KHXɊ[Яɷޚ?0(zxAOn_opj)>Oq0Źy>^\P4l# J|N6o1޷aq 'LDv{wsBu?&_99r4!A21|4w#LL4lbhȴ>?.j=T^sG}Q;Λ=Өpd3VEC<nB// s9)^/Hl \sg| DNxx VpPFu]&C^f̘!&5/iAvuwZ*Do#ܰa# Wcƌcm=ok&}9 <Dz aF*M=KLΗ~}}ëj`ojSsX eW\7erQPPPPP&GAAAAAAerQ@AAAAAerQPPPPP&GAAAAAerQPPPPP˛8:g·h%BuFf2OvQOIfg9s旘@ $voӦMhjf瞛7o^˸={<S-jIOG-挕+Wvmȑp dW&D"Q[[T~q-kɑRiaOG-={#p]Xm۶D"N4I((((((\9F_(7erQPPPPhY0o%%%#FBDu !ƌӹsg!޽{KKK۶mWX!,o߾]|yBcvAQ\\\VVK5)+Æ {5 Gi`/_馛 "8w͛Ǐoݺb۶m]v5j¶իW !Fyu5 ٰa2yCeggO0nB;v!y0ZN:D @ݿÇ[n=~xz/K&2dM7$(///**B? І jjjkYVs{:>} !vu:;VUÇG)))1Mnk9za;w<qDΝnj#p'//O1bĈ={ !>O?4^f͚d2y뭷8/'No߾VoB|'=z뮻h3_vb]tB۷?oӦ͸qٹ{UUM:?8q7M*F#G,))YnmUUUO4hмyjjj]צM泯͚5qh4iӦѣGڵ+??߶ӧO={vs΍D"htǎ pŸt:][[C6+{bŊ#GCtqٙL&nٲeԨQdĉX_~z"FeB&7|sΜ9SLW|,++KRϟ/++<xEc޽{{yܹ;l˙1cƒ%K(Ql߿zT*u̙|;?|4-..l~뭷hEEEw:>{фf͚~O~&O<rݻرcƍmWVV^p(-A={wM555lB#yԩS/^ܶm ! ɓ'kkko7x#Eѭ[<s*x#G tғ'Ob}uҥSNMt-[dɒ5k<BX,v»;??(H;vq>}̞=۶m"Fqkڶ}̙[oqguq 7Y/Wj˯_&^zŋO8kYp=be˖͝;WJy'|RJ9l0q<ݻesg-Z`)ݻy'|[n2e2s=);we B~߮\RJ?m4~&L8}ts6~L45k̜9/^RqiiC6m+̚5{ܹ )%I GJ9eʔ[b`X8 ,XhQ^ѣG _y&LΝ;ӟG0iҤ>l˖-/{mk<`ʔ)K.WhH)/]TVV?qǏc={vܸq|׿^n]>CYb ߧ9 {kkk/_>g)g}6iҤ_q63eGM^"`m4=pO:uXd*ZhСC[L>СCռЫWQFQ;4h۩S^zUVVN>}ɒ%wԨQ^9.++֭5w-5_~Ū|瞣@P;qġC:7޸27M۴vnuM֮];w4*/qF1sYf޽{Rhطoߜ9s/^kߺu뫯bΚ5kϟ^֯fժUw޽{/x?H7mD"HII͛)vgϞ'OV7k׾K-7}Ç?;vD"˗/֯g޽ѣG\mzswwQQ]]]^^NG }jXpa$B_]onS79 _$Uee?O?ZeYۥLfٖeM81JI)m۾;,z\mVv"XU\\,tW^,KRx<Nos]uwyDz˶FHR'N,jR۷KKK_z%˲}Y*zƍ=k>裏g 3̼y,7nؘ1c,z]<+ɥKZ6nܸpB>hlm,wޡ9GoRt:cY+Y=̙3<Hslƌe=4"]ի=s]wҥes=a-_>Ǚ6meYO= … 4u.\hYرciR߲?O?47oWVV\~fY /@sرcBZ\eY?0]#r9O;uz]{q VPPPP;3y!(LBB=c-s5z䨛pEpT8샢OVHAAAAT^Ԭ.GY=欯ڏNTď[Znڎ}ےY=_!VT_:?s=y3怺 Z&CM|~<썗.]:{Mm;ѯ=w6ޣ Z8N5do.o.]h8_x_?v3^EK+(((|kq*;Ǔ3׾sˢt{g I)gΜoTM;EmF3jVӵk޽{ !?Iz����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/addlabels.png����������������������������������������������������������000644 �000765 �000000 �00000132604 11332127303 021025� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&�����mM���bKGD������ pHYs�� �� ����tIME!+G{�� �IDATxy\uԾ՝tv [DqE33,^ˀ:KAQ7Đ=I'/Uյu{8UKB"+/:_UTD^*=HtYY8{}$e\It]WUa.TAEnO^{6 J͵^Nn !\tȞ;n—1ýN }~PӴ?կ~+׻uV]{?O=W_}5U,?ٳB833/Z(/O01�Yj:+"�)"ku �`8YQeE�8B�HBr�Y�Pd�̋uItc|�`h��xV4IV�vPuH0RE�p MPl��kHj��͔/��4Er,]5CBUlh!!@(a.!jb @H0li)ċa Bw@!B<ǔkK]B6DVgP$Еy.EA!/P$),᫢BSduYHED]HR $A^#CSL³BfaaZ}ɐZ]@XH¸2\ !T(Ō_A/j �jL7nAI��LF l_:q}}}G8p5\gl (2G3+|bu&UpwohTCR>#'JL\_ԟLd3a ANf>;-p􊈷RYwccZ#p0CѠKYu2\䶛|+BgUMcRa$kc{өBY9&<?DDwE p3+ N M %;1zBnɤĮ$rB0VDFNC�Nf>;%p􊰷" =l,hphЅzxl"}]L UUVO H6K͜--oB"|I-HLla 4O-GO��N>֥9$W˔6wEhbp\Y yUmAt\9A&<?D5!p3+#|Y'+mA2$Z*O+ɿr",qtBe +|\))mwExbpBQհa:y {Ux:_Z 2X.6wD9dqXxju L̕tC.6WNdM YQ#-Pa꣱٢x:Wyy)X2 $䱹 '&o!d(B(wLfiӡ%_6WiABHCG/1+ŊkC⪪7/.q["w|Z|EQik=p�}(L^¹�Ƙ7AgXJ9pIZxNM4p:N|w5=OD wZѳqcrML]VS4Ojrc8|.$sV:r"[:,Ѡ醊zNr0]g]YEFb\t٢A׾㣐 #'DZ'g<t抵X䶙AשjCxA ;u Mmf>pM'B 6X"v@&Śغ&$$)j`l*pAW"79:8PP4t;NOq p6mԀ\c&{y 8s%1*m&Dx!sqɔGd2"pجgcr(MR]EQcsrLDg g:!3lpYAB 8;1<c3WǒŎK994!Ѐt]d1oB^9X+ਈD"ﴚA9En 8( q&  =wz]֗&[}4qXsl&-5!NA;;14c3_O zb �<ۄ8cb2_9-ѠIb  :ueb6ﴚsBUZi4a){hyt]ֻ; -,Dlf $pLJfL"s`tRW^{؀P8;фې륁IE=j:289sh qلmH*_ɔ=MH\nׄ]#&oBHRWړ͢1<SHE kTQ$s}4YޠoooO\.s̪sM~s|JWiy}8Q*T%.wʭ NOJVu ͔�$`) ZcgrT"5|BP^xARt"겪j0,Htk7slYT>n~L]H<k3au6WMŠsZN5Tr <wl8LVi(SsEUxlcBU<Kg $i}tQLd~ﶞH$7ZggY>>wX6*eKuZU 9>54qlg+Tx챛|t!0[� ,>\CA+CNXP4!r103骤vAҥlr[Nѡy6&SMp,[n0<kB�L\kK|-\-HicC eJCmC|Exl^ !I L-<2ls.tvy;|c˙b=@6Xcf x\IT}6rt&߮b[�I ;6o5ɹ*B^$I -<22&DLRXv-HRHMv319׆k\-]Sɺ :&P[H)zCK!^[ byȱ6eN$ !631.겾bD&M\1W"i948 I;!vsmT9Ԃ|kg*b=\cC\"*dm3֑xXSycl9¢ߓ^wnfCxAN4j]^ׇͽ;PUUcw}dA߿=~_)O|'P1W_gKi$bݖ;bNw]ªeHRŽ;.qӍrFtc㻮Y 7R.v;,FؘJW\6m7M$˅h 䊠]x,pA%Y'i[sBMW4MK4U\a}Ns,]Vj1q*}aa%[nij5䴙Fg {|$EPTO.*ljNl*6nŸUr@Ȳ,j,YaⅪڙ%9ͱL5[nC2ނL&D2 .itX=sFz$oBT!$BR|MY͋ 1bMacijRjC2e)Zܩ܄gr<DŽlYee3& !.K"_K끅$'2XS&SM8Lr*wf?>"dWtp67 lmMmPPA;'FMwm6bSYYk"/D6玍CgV!ӹNMdYciɕK!hV!L5SBOd% -TXnC҆ـmxand@@t�Z)TZo-$ڐZ0 !15߆Mcsb r|$I7`oMHeˋs* H ^i2]Uj6,y^gf�@(h;֞|ᬪ鵆򵟝zzϹ'~s7ǧ��/ L ��Tsڋg�oGoߴ&KcO(�9ׯ3ng!�tD8c$8\Jہdo춟)-# 91LX&3"*Le]v@*<�47&@ |l rR"a*9&-[B=Gɽx.'hMfbdqt403׮f "ecc]Vn:#JL`pc@ɊgBnS(SdZV�SVEQejN l=_^3fʒ6t KL1g\37E/`!Ij`� :d)׵TnbNaȔd☑ي("6U'E{|\U͊MoZ鄔Tt N\3z"w{<C͔ Մ,݄%. !Tc9_Ufʹ|,#JXQ%HT"H+3϶!F ל-+ bҵRM] 7!Hm2sH"Jp6!LrExQVƨ@Ɋg"MH=l EbMejN3 -grC(EQg!.ZFR`iw1^*= y&6KRP8HV+umU !yz@d_RX"t@NHEIDw.!V-6Ll%$ D׆mzؖtjc ȁA}AKIԦU<DꀬI*My N � ؠKHb#<ۂXupH^(=>3g%NW �w ߸k?W5X \ǻGNo+z?2iLo?䱼|.QI��">['mޱVTesݲ3SV~u"f9o{ȉ<˃Wjm4OD+t*WbCwljB$}n7 P8~3cWD$ ��aC[:6Y-K-ۺʹTELBqX78=,J$VgAkfRM7+y ltj|,gqw-xQ^\MVnk2uKG=| gRYxz*]65AtAr}ؔ*\</J[)r,%6d1bɴ 0WSEgfz:S/׵>IHhpkԜh\3a7r9yH2HW)\0%\ᶰn ;!ȱdM:$ `1d&/J[`:!>9ZoBVax>v񉼔}:Wh̬Ǻ dsPӧ3`@rt>ц؅Ou]T%4 LgeQ FZ-<,5k.dnh"U%IrMД,5!6ӂ(!sE9]vӓznA&Dp!<CS Y9[&#.>Qe9M5!*AkBQz<=OOeꕺ:`Ru86*lnų$Kr(yIJE@BEІJjp.Pd e)!~;g@RU ; \ EdII+@bt&w@q/d굆*AkBTYM䛐\0%:O u.ぜ JSʹIguk}K_yޑ s:�'��Ltuo^XNUB;=s6](֞?{f^746<⚙ٽ/rM>վ^>S)JX*W7EL K85KCsST ��G&fRSu{;S%e'��45N sv| }J[7_^Krϋ_>2a9\zdVTKHUT)2V5I_ %UWy5U<v9(]NɬԐưx^Hr])ي0N 5+ }SuK.f\Q6TNBM Y%(uA"x^Ω0>=@!>+c\m|]}CSY.Zbfj:T%YwCz<tNy )"~;=K成hԪ@* ,VH"etY/ CtNɴ Sm$`[(,0Tﲐ�_mA-YH,P!SI-(/ɒl1 yX3 b ڀp:/;WU5hgL,9EIoC4@\т:`sM \J�I*X". air)z</CW2ee=hbHsm"i^ŷ!61sZBH</)HBM ;!B|s2$ anbY+ig-H�RQ,'i^mxvB],لMaE~Mv/ld&f*쩌nڽhf!؅wGD_c9NK gN5Iir4W͋:RS,2$ 4j$Inf:^*xn{z6tF,g� 4�u� i&S*(!]I#�HMSfɺm�rQh>-!krvLI[l͕5$. C(^30YEj/SWP͌flU31 75Q =bYN攆6LMK5]ٔRu@-XVIhVu/ G鼚,kEQTVR:?Snpg}.k##j4VzID! =nB\ !3EMUAvD 鉒B̀+A jG! WCi5_ӬFje$UFĦ}.Eݳ�BwBƲjr &]`r"-I+HϪUI_5bUV6V ZR6ǔ%4[T@4I; &d`񜚩hCP#Y\_(WFiPQcE�!P !ƗB61b-Q҈%R*- ^T \.ldg$؂.di!2Yc*f8jeyER bs 6Q39ކh ^hB&rj 祆3M4!Lbx:!"l͕4"w@l9SD1U ͔ByHI8т*/cdߜ�5~h&,#@}Zk8nWE\obŢ]ESm>r&UG96iK~y4vs[/,%֥wP~xú#Cc5;d ED�4 �@7Nٞ_-梨|!ĻU2ƛq+um7(:xy(ss| Hc �@QXl+?rM??7+n5[RsY�� AfD0.;I0e n ْ"]DBH%~ jurEU0s5Rz?H5c9]Re>Di'ZY6vi]T@./ɂ! ੤^L88*\ ͔tIPGfs3i&.A`<ׄ$ztD.sAIE"RtxU ?d'rc10]X 'zU^LR/ԑ!V-LtI0QYtE0zՀЀl؄\ ;q�|2 [&Vy^AF (UA"vFqD 2M5!WHVCu@,,=/YY" Mȶ .*- O5!ng , R&~dZ݆\F+pBȨ!! aXNoph〃-\ Ķ0<5W$1n<&x :qu 1�� �IDATLy 4O/l:$d2Qt0]\�Ib/B%HՉ뢠N+guD$ւlÓ ZCkxi01<S3Sqc2ꯟ8zݝp}'?~s߉= MӞ7o9,'\Qbwn̍;Cg~s)7HX˪rW<+!F{ޱ <st&eG@,TN}hcvQ-Jٶj=v`9uf ={S�Adq>WMsVo%cNNS 곏N\,+~17k2mk=vvt¼nE7h8G:D uoTCvS)B `5^TdI^T%(I>rrlPtޭp5wuGTU&qiǓn0V"MftP4ک ΰ:"K Ȑ`O;2GI*YA9BYnBl#0Yjzh q�YҎ') _3ruX=݂l>$U%PGnP2+H̉zhjgBn f EZ.OPюQ!h:JUN2txuH=nBsYZ 3T]Vp'SޅbWX�)5L*hBC%"\it@Τb !V !W6$\B C< 6hޣ[ i2~< "V} # [\25"Q:7tg(QV =v(BUX!ZV^ !+H0,qt@R !uH`k@;$Ƣb@Re �`:UBdip,t->񛏎}C�|^Iws:t:.OtHr' ���B�]߲mln��BBi �u�!@ȸBH>H AַtuS<w$  i�H6, !z@wKRkC$P7x@UaI4Rd��ۼ2#޸!.r*!V; c#XOU(tqpU3n))R !!"TYmC9+2pD�ׇlQ"(] :>Y!%%ZPh��ze:mUN9*hCLR?8+,D*T%9@]xMRC GqZ qȒې,[ DWYڹ<ۂ!>"XmS9ڄ(qk D튴 7u@drBA G|]&Z <F `hU,[ DWZͱRzWthc5Ny)d1Zd HqAC'6ek]RyYW:X4:i=6DC9dYBfɈdҀMZ|$!zl / jЬ dLT)@x<B bUNHΊ NN(:ZdWX<e Z}K: I"�+2A@tcwp!"� |// wD[М9p{R!tȏx:޹=�pEտ KSƩ^x'2PVG?;XBntϭڷXq͑.e~jgN#j5W8kEPHV514osJimRJ@2Iy uN1Qc !ʋs6Uz񌙄(jih46jCE_᫼A@B^KTRdhB[=(:1{pB@e(8@9kS Q _>a�xx9 (9S3Ub (HfZ*DkbRd2&d U.dI*_e_ 3-HAZil@éy%dOeM$D+lJī,M[= Cbބ\Htk5!TkBJ|EhH"kʨSY 4V)mp֦B8%dnA693K!>T8/*+ұ"�L9@]_^Ye[1B@Mk&Q%Jh Iՙt r0iB \_N=݂d*QkBg,"Ib!ƪ!.NY Q!iDMC8t rRҢ!`Օt��=r:oZb4BC) Q$n@;x7.R0;o[,_h߿=yOR_UV#"_iMtDȧ�Cf۴VD??AT*pZkMU(m?iGz8'ճEI^K-QcR !MEQL⑌B+<EUP/*4Kꛝ <7żDΊM ьfZV_J�~^">\HԦ*\VbXR*spkY!Uހ 4!e-@EIKm$,CI+t2܂lq Fϛ tżDt@:i2 &@6;K{: dzM+@d6 9SD63VЄ`@FJ|QYR,I8&DZ YoZipd@; oA|6E YcΛ**ő &J,CMGce"jku@zr 5!>^>Ԃ*LFbEa1"[L (#ݜd3s2Wg](Ɉ2jODGM*kumNVv1ҩH65R@hB3 +,Xm1*A~,kM '`T>?$jCiH+k/!-X Հ�.V:Z9%PZ[@ j1Ð&gyaP 25Ḅ$+]/֌3"iM (jfzL0fJYc)x�n&Pdf\>UpH:e.z4" q"�hja [D!/&JYc)̺ \L4v@!VUhHm|liWʇn36\2%T 6-qKGr.N' A ۂL)k-A т d.߂Ԗ- H59wt0@ DY53KjȚyHò�B'O+MS6Z*Gr. zP|9�j54 PZUi %K/ ,4w!JR;ނ6ڄϔl" !-HB�4z@A&Dn!$%2 Av<cLT%+%))ZYa* urT6 H�4ZiBfD>'s&0S4!깲&_4TH\>w*tЍW;wÉyغjhAlL.*s. .:+Y3jKPa-X_RVYJn�;dDi)׎ &jf{LɪfJY4^y \伙?f;x`V[�>H=Fz.X؂�6Sj ,p!�25 j �X璲1�S��BJ6Qw�BlYɬb�5.Y'i5�E6�@_+|I��sU?P [��?SA�d3�`7lu&�`N T��;հSÀT56߂ < C5�Wxx "dfuj!c@hz%H- �BB"��6RCb-s)\؋d&I(2g!ra�DBAmB6 )[ Ȍdp X016ۄӲb&%S��A 2#_b&X RTBO( B6Հqɺ)4ڀ7EPWs5Ad?S[YcL!̙IiYșO_1U؂ WkAFDHV9kl 3Q6 BftA- \Q囐OG'.4܂�C?PJ5\C҇oKefϜ9su5Wܸv{8VUbΥ=vf-EQ��RVAfG8{% fXt]WB1 w\.իJp8U6<<zV=r��ADQF8{Mڼy(Bd2PPUո pWÇo~ޑi8ýb!^i#pxp8p898{G];wnݹ\ZYa8{#'ڵfmڴWo߾.8{#hÆ ?Oϝ;722>!ӟ]uUxq8g~p=9r}O?}l޽?O߿/1[9>(�`۶mK>g2y䑣Gr-O=Ե^WpyDQ|$^\ý ~={,݀$ɞ;v%p8kekf޽gϞKp?V΅{ꩧwoT*Aڵ /1.yx<}!w;7VUD~Z,q8GFƍ;~�`.p8#k8#pxp8Gp89x p8Gp8[Tt:Mp8wI d2yA8d2Z:p8{G(EvmxQp8qdZf��Xzxp8$,˪=p8' ᑃp7V^%Kwi8po8cm$ AŁG{㧪*B8o}#/&!Mxpee6^xEQeG_A iӦ KR\/׎eY8<r(Y,7uYVO]rJpӭâ(>�/| �wlO\z'w_.+TQw�uk?!?:/C~?>p?|]wɲӟ?ObgyF9T*�}C>߄/�|_2_wyTZ=y|~o}[XGiwӘp__}[/_qFFFoo۷o_zl:޻wmM6�><44:^.ᎵT*uw8qg?Y(zS3<333s7{O<D=s>WU﵏~Q|~֭[n?C[n=xw===׼۾o_{9sf˖-[lO|NbŊ-znuufff֭;ޓ'O{�w3ހ#|[�\{f[r �l??֯_fJ_iy;yΪz-ٳgϞ=7|?i�#<bZo|4+W^wu_n||{zzzzzJR*J;wX,~߷VEGF�x# �iM2GL&?OwG?h裏r-(NQѣG Ej�zNnwyfرy{[,EQ\\$I;&''xG}ߎ㓓Vu=JrL[֯~4nrv_hx'K| Lnܸ+cX$W0D-�@ 3300p7u]nò/3ly_jO>M7d|\,�gy&.:pgΜg4M둑�{qv�ɓ|_mN8|gxR799ycu]?s̆ B-rx<Nt0l�;w۷$L&sỰ W\q޽{�Dtݻg?쬱EdzgϞ ?;wl. �5MFׯƱW]up*ݾ};2s=2+rrrrϞ=?o{cn^�l6۝w޹u7JoUU?a25k��OӴH$bFl �7t $I<��ظqcǎ}駟zO~O6g]غu}c�|3�sɲF?O=/"��X^m޼;4|~\~֭['wi\y$+_htf2r<;;;66k.(Eqw6O~ ^8qu�v/"oЋ  T?+I?쳵Z֟7AdYVU{kU*^xx 7p8 p7px9۵kp``��r5px伩#I<[o[oŋbs;vy#RUbTU8G}u<L&\~Wᑃh4=poDQܺukjq8<rp81 /c_1p8ᑃp898#po^yo~K ߱c^Dý6#xE}Y?MƎ9rG^s]w�DQ?t:?��83޼򩧞zxk�~C{{{?>|6Q8{y'>ɏw]s57/MOO?xD*GFFp89u]8q\.8p@Ӵݻw_}եRɓf;w|N<ywp8W7ptiE<0 |>8GkI/կ~pFrf3�epK!D"~=]"j�H$0wܹsN�-?Hf�\.W$aY/:ý9N3ɔٱ]vEp8k ,c=op8' ᑃp8<rp8#pxp8MB x`Tu]cE4^�ѨbK#&@oڎ;vܹ`0 8?n!M+P*dY*ûp8ᑃp8>sqn_re2^ƠoN: ,իg:88X׷nJCTz]]]Kuĉ<ϯ_`p?ۭ_|o衇z~Ϟ=`?w;D�� �IDAT(=?͙w}w$RO899C h4vя~Tp?筜 �~7c:433s7;г>k暱'On޼P(LOOx. �7^_ܛ8p`nn-oy z׻?{> |q;)]@PDŮ$lnh %ňĎ`bGEFhGr} 1k̖ggvv_?Paaazz:?tPCC{xxܽ{W$<|!diiJII)--O$]1xत$333ggg˗/Fv{***H$RvvBop8!UUU___==3fggg... b4$v��III)$$755כMؘFъ---Ra8ΣGTTT#""cbb;mm7oޜ?<==}ՍG/[mm파gϚu!T*U"BǏoܸRt޼y&L`0v{.@xbQQU >`ccSTT?q8A7ٳgT*֭[w޵.//߼ysaa!~ Yn3'O|<̙3 k׮URR*--=p/***BBBLCx<ސ!C.\+2lcc3d|(..nllVVVk�y E,K$Ǐwbmk֬)**ڴiӥK 6}tÙ>}Ł6n|Y]Sss)Slll"""LΝ;)Jxxի󣣣{P^x1;;{ٲe U0|۶mnnnݻwo޼y˖-555g~_렠pPLHԯ_/^ܹs'>>>--GB---#F:thLLL^^ޡCo߾}CJpΝkbbgϞ۷)ԭ�b !p(ݻMMMeZʒYf͛6mwOOA?nڴݒ%K,cmmy痢͙3ڵkϛ7ȑ#L&zxx\zՎ�@w 97nliiٿڵkI$Ҿ}?~jݺu.]_ ;^&DG;x^~yfuuSfdd��:Uvڵ8q:Hy*:{l///gΜy 2{lwwׯAWX,ԁΞ=stǎeee"N �kBNLLD" 6lؚ5kMf}}};cǎoQFݼy355u޽ϟ_}UUUĉ{Vqss[nѣ[N>|ի|}}qƎ |cƌٺuoyyŋfѢEǏ߹sv/o޼qFggϘ1c̙xϞ=[TTt!???6��ASSdlyyyOAUUU___d2uuuʸ\B/mmؽ{޽{l6@!mHhBP BԴT*aXUUU!]]].ԄWRR222bٕZZZl6' ߿R&&&MMM:::UUU,k555|>Rnݺ5o޼˗YN__F! q[; bff\^^N&kkktzii)377'"yqqqIpw��$eee@ "##oVVVhjjjjji;ֺxZ_____d=,B:N񴺺z%h8*d=!mȎikk˗Z5=WQQ-M<{" =��LVVV>+ �>x9AAAAAAџ �r����9���S0kiiu7q\8 ��r>;իׯ_CV���H*677  !?��9+d ��yEEŮv---p��rPȡRzy<^ZZi�� !bgDoii�H$HN 0 @���� ������|ξˑJxZEE_~mӔFse @ @n;��:iҤAq8]]݈0???Q[[2.//o̙4H$VVV^~'��!'99ySL9vXff-[n޼WPP8::jhhsܔ<mhhhiir{{b6ᡠssݻwK.ӻpႢܹs7{lA! JKK pB e,իW41F��BZp!H<vBʕ+aaaYYY)))g^bNO:gϞѣG;w9sѣWyfAAA^^N͵ݻw䤤ࡦ\1>}ZCCcŊ>tz@@СCǍwe''7B�/O<6m]\\SRRp8?/^puӁ:-..NNN~ݻw<<<LLL233===9f7oތ3LssI&ļxND��r>SرW#ƚ=|pgϞ=qD"O<eʔl8�P,fϞ݋[Ξ=;==޽{C A<yrǎ<Kj�r~GDeW\ӗsmҥfffaaaMMM|>ʕ?offgφعvZmm-[g�TڴiH$RpppQQQ}}P(\filllzzW6n(GMM_~ٵkW`` 8ydoʵѣG:thAAAd29-- … ?.KߗYFEE%""bÆ p� t_LKKQqN?qWPP7oOfffK,󳵵57lذh.RMOO~ڴiӧOO:L \\\|-yFiee'"��BG$=<<߿s񄒒RĦ,Zy?<c WVVbddZ��譠O&55u…Æ o!7��K9o9;;gddݱ��@H$2��|T��RN!jjj Bs��gdd@7h���!Jl6?^ ?��BN 9x ������(��z&တ�շAtBB.�!�ЛxV#>}!BNO`0,X��@ܹAX,D]meee]�RQQ1| �Z9p�dQ(QFAV� � |zD"QQQ?Xљ3gjkk׮]K  Awg),!mfgVب 򫡡AAAm�BѤR׬Y3 8Ȧ\n]]FJMMMJJJUUUB)6n8w\{{{WW+8szAfUWWoذȑ#l6O- ۵kɓ";w>|ܹW^!Njoo/ zm)扉x~yyyaa!<xFjj*1bKKKׯ_~~>BZWWTEEٳg={;mmiӦhv ---!EEE}}wޙB +** TRRr}/2n8ٟ!;x`okٳgcƌ!]vzUZZZ``e/^`0jkk ɓ֬Y`NII)((!'>>^"WUUUWWr߿];;;O<xƌW^uBHOOo̙_|ENNNlllaaaÎ; g$˄Batt]f̘A&ĉΝ{MCCB(::BN}%&&^xqƌNruu /..6mL>}իWutt<==  s6lX)ӧ[ZZv܊N:dɒV"ddd:uԩScƌ9vBիzzzN]VKsssHHiPPPfff6m߿?Bȑ#o}%''?nJ&׬YiӦ^ncĈ޽{L&… s500h7qƍwƍZH$?ek/K.tRmϟ!3f̘1C__wTjjD"qww~# ~׵kvCD믿t8�({һ <<<V^MӋ;<p\w$ss۷md$::zիWokdddII �`999R!P5jԬY,X/ꪩ]|Y$͟?ԩL&!OOϩS466jiiܜ$wލ=z41;x%K,XqD"-X`=4hйsNZUU`nc�z={,rxxxQQщ'&޵kʕ+{>kT*O 6oތI <NGEE|P_533۶m[IIunfjj:{Lssӧ?~T*UQQ}zyyF˗/ =߯_?0uT===177;w.n$#S.]:i$9 zzz>>>FFFG1cƜ?^$X<H#G144444'266駟?1b|;-YÁ/OP(l=y$NAf=ttt,;d]Q3_ HOO ��m)|t:}֭%D"7o��9}X,rBs3|#ɟo]�|*uuu0�Q(EEŰ0 �}f�! QZZ�uڡ!�W<~ ԁ�D"QQQF!@�~q��@��л@�SPPٵ`pw9�~[!|3n߾=tP8r��]ǏAȁӓDx �V:U,Dڶ*BNSWWwu�Z/!�OL";�FPh�@H$d�pE(dgg*Fi4ڀꪪѐeMMMx/-**RWWWTTCA�zz9xibH$:###55[[[̦74ggg|<xݻw'NX|o'W~{N4(bt;ߌ 9s?>**o@ϵwVzMٯ .tuu]e77** kCΗ_~I$ِw5kٽz$&Lhnn~1cbb"2l0UUU2^`RRɓ:BrĈ4M"ܾ}[UUc}uEE{B,ӧ8@7cǎqg<zH[[[obbswޤI zmș6mɓ'544nݺw^Tkеkx<|||d;={`0ݫZ233op,,,߿_Xڵkׯ ā !tΝM6^tb?7n\^^ƶmA ;vógnnn3cbb"""Ν;CNBBr~G۷oXw„ ¿!.^?o<sNC.]֭[gΜ̔?>*,,3fL}}͔)S 6__,,,444nܸѪ�x:00044i7onr͚5/^lll!zsAm۶IAAa˖-mR^^%fن?|~uuɓ''O<ydn߾}bYx˗;H ͛7m۶oرpD"o5b̙wޅ!'44e6l Gw,AdddyyET*9 NNN8ԩS 𴂂ºuH$ҝ;wⴴBCCqtu ?gϞQFa ill :5xϜ9Ԝ0aB޽{/_.Ư_~AAAɥϟy%kii'''{.###((ݻwh{L… /^_}6##1�=Nfffdd~}R 9ǏH$edܾ};00pƌ4СC֭kii]iiik:u)S~3f,Y$22q֭ޭү]iƍTjժiӦ:�@s΀9r **jm8p@CC#((( �'"hjj2L6`0?T TMMMkjj ƀNNN|>_GGGаd322$B)??_[[{!KKrÕQ^^044)((`ٶyyyRޞU>2 \.ɓ'^^^p� CшD8Nzϑ=Դ$IMMNGb=:pҥZ@$EFFn߾!!�Bg!{��{:t��9D���HSSsر]8.��@$IC�>v1B�HJJN,�@'*++uttttt �9�H w<"���r���.P�ĨT*--E�@D"(JoסH9�>v1///�!'!�fwD"S__/o@1LKDhgG `\��!ӓJr�w���ݬ*H𴦦UeeeIIn'% e󵴴,--;ߦLvwF�@W)...{}%Ieeƻw\+uѣs=Rn޽Ν[pao[nw^jj9s<==E$cggfeeΙ3gҤIgΜ믽v>"" N�DDD>dmm!'11q…}YӺ�� �IDATq||w}tҜ** kCNpp0H<<B(99رc˖-<yIrrrYYNI f͚XZZ:;;EBJJJxIII'Oڿ7orrrpJuuuDKѴ|33ɓ'>KKKʕ+Rtڴi)mmmw޽{3g<p@VVǞ={$� mܸqܸq?9͛7dsd^BBB]|yܹu6̟?Kpp!C߿uֽ{***fdd \ϝ;rCCC]\\JKK8RׯoN$dee;wnǎ-|MSSS/]--׋b//{~~~$i۶mU޽!k``g��?p3g͛WYYg^|9""ܹs>yCu>_~}EE͛/\ uΜ9v$k׮r{522ڵk̙3?`{ݻw ]v:tbܹSUUuժU וH$WWPwww@*H$cbb6og��]ŋ~<U%K!eȷ\A} %<<Ĥ7VO^v-F$$$$??_>_mll 6xɓǏ5]5o޼gvyyyaaacǎ7nK47o>={O.GdrdLMM_Cy<ÇW^M"~פ$6f+--3g2gY0YŋI$Rllltt;\]]Gqŋ BTTӧOD'5!!!gϞc@w+{һubƍW^EtnM޾}>qF�f̘yvQ_|;dȐ3fLyyyEUVUuu̙3֭[hѢ\7oDA{?+o zmȹx"~9n:oVwO>CO<fÇ^~ȬYfΜo>//@33s;waÆ m|...+W0a`SL ܹs֞ l߾��֦Mdӧ"##'M6qTT֬Y!z"&d #??C}}ߨ766x<#Kiaa! KJJt:]GGQ___EE!TTT$JB<`h~544 _[[ W^^FRztzEE566.// XqqH$wL$r'O@7�|LYYYAA_nm1LCYYFUUUihhHRGqqX,Q/] u9eee@ "##om:*~P(sʦddAb^/BTjU3113�nBGGG6C6!GN#���G'G C'��Q(---I���9N1bDoA��@$|c<�@UUUur��}Eiiirr2桫8r��P(744444�r��7䘘4-h ���B���9���Gw9#2TGΌ ��r>=@"?}tȑp�r@ h;{/r\j��_Jz+D" X�>h>����B���9��� 97nܸr f2qqq/_l7kP]]]\\\JJJʚro%$$Nrʍ7 �~+W鼼%K9sݔ^z Bpɒ%'N;Ydɒg~ܿ䤥u+V �A>ZjjǏKKKsrrϟE"룣B ƍKHHHOOh"MM͞qΝc0˗/?z7|#)%%%11q/^,))oh4=|p͛tmmm"8G=~855utt:T*oo�@9)))wNNN9rd\\KPUTTB J&$$899=z_~QUUwٔ Q(:::"RRR={4gܼ{nWWWgg[ݸq#55<}˗/.\O?]|yD]]=44lȐ!QQQ 9DbG?SCC,��mCC3fҥKMMMxԩSBVVVÇeFFFYYو#~QFɽ{ [[ۅ r8X<GSSs„ NNNW0`͛\ ֯__RRZ##;wN>Fɖy ~а_~K. bcc;xMJJ { �lȐ!FFF6mÑ#G֬YgEEޑ}SLiU077wppvsر^jeed2ϟ?۷[XX,_\__fϞ_~? F޾}(t�@ΰ\lٝ;w*++]G8""b3gTWW?vBHGG1,,ܹsG` /^gϞR___v Nt�@ 9{]lѣ7mי۳gBh۶mǏ;w۷o{M*'N~iLR_|JNN^nݬYo.cZZʕ+NJP*++qrr/>T�cnnz왏O]]^xرUVikk_~}׮]n5G:uC__ڵkYYYJC!CBCC###~嗑#GZww``0~ᇰ0QF7O"m��455L&f0Fj7@ ujI"dX,Dd2D" BD/ >"qbH$+((mnB|}||RRRrssq ̡P(Mdz9MLAA(^BH E,fAO9..NOO �,D"Qdd;.D"FP(mD*)2״RP|0ѣG}(sZ!BO2v��mԔt&hhhܻw2 ��!|~)O< ��z���!��@okU___XXػQ �@bL&ŋ%%%���!3B/쯒t��!H!+��߀��� ������|x�Ĕ>mbR�7#][@ 8z( ( 6xinnD]m.]O!x~aِ�BΧTWWw^3)�A&O8@ �hD"Q~\�:^T���fPxAKξuСC y �9֭MǻD/_N2ӵk֬ zg)'444,,lǎ'N322’ �ܹs',,_?~L"T*n;zѰ.lRΙ3g:TQQqʕϟL4>99yŊדkܹV3g] �ƍY[[jcc5jUUU 6߿זrVX!J'Nm۶UWW~k׮=s挋ҥK=z$[ٳg|||.\(!�򚛛,Y3*za<իWeeennn!zay웯t<6k,}}CX<iҤ9sZBVVpqq8qR)>�`֭~ =ӧOoLtС8x{{CPXkii>|xKKLccc==V))_|B֯_cǎRw��h"WWV3a>r&O\[[KKKo>}+۸qQod$�tcc#dH_9555bX__'niiiUpLj[J"D"F,//=D�H$TUV{!,kϟ?!GKKKWWW/,B***!:KP҆ 2uԄƍB˗/!�ǩ^Z6''''--;&&&22rݺu***$IWW?&&&1ۻ= hjj2L6`0e_P(Z[[绸xyy!\.ɓ' �p7SVVVPPp8]ۓtss`u-eee@ "##o);ٱcLj#^x[UUUn���2vԩS .<p�B믿ޱc/��rBǏ}yD$ɨ���!7SVVRVV���9T*R6 ���!S6�|.][�!�Л~\. A5!�|z!B�"d���9��� ����!D"!���FFrb14f��|<^Z;!Ν;G���Z!1Drrrj'hii9::B��hJĺ N\nss3/���L_YUTTjkkJPPP`nn޶|GE]zcccyy92���;;;*lBQQQ* ���|<*ݻ$��#)**[[[UUnrRUUG뛚"Vv-MMM^H$77:::Llhh8`_t:B,,,F9rH55 C kku;:Bx<|vߐo|>7RUUUWWGUWWs8e-z1п***LLz}_=Ūdbsss<{{2H$*..F)++B~>D"nF&;1=I}܂<s4M*޾}!niiYQQdÆ SWWl---KKK D"X, ɬB;VQQ'$$g,))|[*޿_6.;;9rX,{.BHKKؘd<ʣGw7o8$%% m[vv'Od#Bill7,CCCГ'OdNWWlviii7,899qQQQ}}=>B')) ?E*}wLfO>EII)77wbÇ[ZZTqB555/_ħD"ߞ;99H%%%ggg#FFF999f2ZZZ=x 6##cȐ!x:++8--dj``fݎF&Hv"\O |}}BϞ=7U#\.W" Dbrrǧ,hkk'&&&&&QPPɓ &sbJJJСCKJJp/d2YMMdLEEcǾ}611מH;p@ Dmmm|L&55˗^^^2vbb7999/^?~<.`ZYY111&???11ӧ8g*`Ĉq8\.9tP|wb333!;啑!NА]QQQ\\<hР)))>>>xG,,, *++SIbb"B} zEbbbjj*FÑ�年;Ă|R7vN$ǍͰa޾}fDYQJ*))+**GM& NgH$666x FFF83e#kHvH$** &%w K&q=)K9$L&###SRRA&-- ߡU(ݻ7uT*ϧP(BPY"Ï*//X,`;BG>{L"HR "zX,&rDbWUEEE| qWPPhnn3q!@S(lGpmI( *҂GR4ٳYf>~X, "(vuD"?'fggX.K&Ǎw-uwOwWRRr<=G~9#8%>vVZZZYYΫvKR2|D"@@P|>}@VSSSWWW$LLL'>#Qgggo,6áXwH$r8#G~ʊ5|WD}wO'OFɪڮH$zzzYESCu$Q= έz bX*n[^UUEPM׀X]<]QQڵkӦMcX~9rdVV~zMµd2ё`t�Aw999M6-%%`|k@ ;99GKUO d"N{P(=~ʐCRR@  ׯ_o7͘1c?bdIL " d) Dj=˗/ 'uuuWWK.iii~n9LtҠAO¦&ϟ?ǥnG/]9rH Z<_(odKK˗.㛑.++n_6cx78zzz.]BsSPPhd@*%HVun {窫+**Z}.!G(v/++cXD"@ tVQQJm%WRRU!tB_|K ?QMM Y,nniggWRR"JmbH$0xvIɆfCI&) f埃D"IQQQYYY~G^x uuueee,KYY@渶UC5oodmmmX B!Mcc㊊j͛7,K~>s6ƫ+))"싈I[[[CCܼ3 4UTTjjjpmN@ pb n#4P󵵵 [TUUG">Tp8Fr q˙⢦&J]U v tggg33'OO@B!~(hnn0`Ncc# $---b>_[Ҥ#F <y+׋@SRRTTTD"ѳg\VVV]]]YYioo6g$I/^/ 333B9991%%w0n.d==;"/ b0+�� �IDAT*ՑH${{bWVTWW!8NjjjMM N&M!?~<rȦ4|gF]]]|!'O >H3&o}zꕫkMMMjj*~ݎJZ![YYۿ}UjkkegUUUi4TZ]]-FkWÇnjoh4&!---\p8~aId2l6`dff:::VTT@kW൲Y�k�h4NNNGGPQQRUUU"Ot_t:D"ឤ###oNc�� B100bqccZX,L9NB'pz�>TWYY QJffffffL&)CNw�gXo~ŒdjUUUD"_~rA֙����?8MEEBTDFFFB}>;" {䲲2@�;}v#|ZOՄ5uuPT6- {(((455|ؑ#<vZx[H~~A!��Qܯݟ>wv^ n;̙Xcc#c\.TtqҎ?~ر%ǏoѣGO< 1h&LÔz; .۷r"//۷o/^mjɺ{=V\DrqdN2MG |W>L%l!aU.eGB+RT֫X,?/<O{!4н{p|Xɿ;" q 3.|˗/7knn3|>;E"A66<^ɟ uuu3z] >g𴽽\ϑ]\.rn߾6k֬vb;;χo ......8ӧO]\\֬Yk׮VB*ỿ˗WnW}}񪋋Lqr'OdXk׮i^z%HƎzQPPPTTTdd$ RSS&.]?>|Q$ <855%88ѣG2}fddL:566vݟ:uj֭;wy|Bݻw]\\6mf7o޶mLLLd&+(((>>~ڴigQQW3g<q0I&eee^X@_pov޽...111xPUU5tЉ'WCBBOׯ̄ ;JOO_h~_ vM\]]]\\̙E(9!D$MMM \;>f۷oÆ nnnEEEÇ/Z(33333sʔ)"b˖-3gΔ)++\r̙3?ZYYqW\j*cׯ<wDZdɎ;<==q~UxiKKˊ+~gwwwСC[nlvb<9k֬牱lx[weggoݺ˗/M2eŊk׮ ;r3::OPcc㪪*@[n=t̙3.\x< Sjj*V.333''Ν;3g?~۷ .[@rmmmgϞ\Xxqzzӧep%K?s D'XRRR~~>Bh…۶m[x1d~ xԩ3f۷oٲeTWW?|ZZСCn*%[lJNNFm3fLHHHqqqqq1rJnnC>4vii'OqmffxÇϛ7í~BUook׶Jv9#S[[wm3G oKߘ?YlVjvy'{okkkCCCCCC;xuE[dݰ9Vμ>gܸq!pߔG*ǧ@cBX,~Ç7l0v؃<x0''GYYߋy&&&-նR{͛7>vX---*::bq8Gۃ455N8QSS3;;{$7 7<S>v~Cw7[nMLL<saa!d#8<h4�|Nɹp႕հaBZz5 ^޽{gϞJ,C#AVj53666!!K8zgttttttJKK_x={vtt4Ls΅ VA,߹sΝ;,+))cr.\`&Lz.ܙqnܸѪuڶoiiqFw;lقG~~~~~w,<<&;yyyx9(UC'tŋ3wu˗>|>}:::zΝYʡP(3f8|EEEnn.z\15v؎GC͙3f;vÇ[ZZpJ^."""77݁'N8qD<m6V=q/^z !`u)\uww{FWfYYY8Y]]ݘ1cdcZZZ8NG!Xի>rss{%#Fn_K'N|˗/B2JKK<ZIII,+** sttę&:n?bffkkkfΜy5ݰ5 nJJJ0`@_ធmmmel;H O蘔OF+++|;rBH(:99ݽ{r^ڻ&q3H% AeqCVĪxXRmժzzk]Z뵵~u rk¢,j� D$dlO ds2r<kZBQUU. Fqd#RSSbqllY0 0`Z.++#bɒ%\.qF" D"x<+++ Xzunn +|||lƤId2'NNNMs&ҼByhtss Jয়~J&Y,yWE"'M$*++ Xbd2 80߿ K:888NGC "##h<tСC?{l ZgXx1js 2j(L&h>[Q'OlI$///tUp2 D߿P( 6mOSJ$k׮0[Pcǎ GpTȑ#d]hhSQQA4_ohhXrebbb `0dx㷡@Py!D.))9s&NP FRqG <==T*N(//Oծ[mDhwH$RII ACS?-&&"00ӳ͋(NgU=8B ETF6VUU~H$ FcNNNjjj %bH؄L&|7,uqرkbv񒒒-[Xtz^^^o1g0N:Fhڠ^_x@Ξ=;sNio7|:;;L:u(#6HaaJB2_&)));;{m~`ffקOvE =R*m o%چ洞T*588J9;;[*ߠX8-o#44t˖- 4`�dggsy֩'X9sSQOOO@` M&= ?8k0i$&hT*< wL0]7komۻ#K9t:�fcbb]n =Mf@DEEO iO feBѬG,)''''//Stfi2@  B)}{N;r +tÇz}An l#Vko{0"FcjPH$jhh@T* zB&wX8dKCPL&SoFQ(  B@TJ96@4].XĂ>}j.saXCCD"H$ͿW*JOl\]]yY P(O! 2->\WW'ˡ}:ѡ;[0ǵr?~<cƌׯ7#?sUz1<JJNN^dɒ%K~G4͸ĉnݚa νwӦMPT[n5ӑ#Gak{͙3LjbCyRRRI<xj߾}$Uf^^^b888NVVVz;w4447.++ M\bbb^^^z-/^vagΜn2�쯿2=ӢKq ZMrCpt:9###,, M.[__a͢U*p4Rruumn߾bQ>{ <=lGX,"ZfsssCb=dΝ;Æ h[ɓ'L&S&UUU9<x~d{q|„ /x<HJR333?Ga`I!##Cь7.''ޥR.h4D2h [h4dfG\\\v )<<D"AeGBBB̓_~06=rHh]vZ*''ȑ#_|R޽{  D"zjCCCTT 2$66߸q#99YT޽[(VUUݺuϯu۶m5K*'''Iq3ϣz~~COӍ1ɓUUUsׯJٳglls<xT*Umm͛hΞ={-wwwJdݖ-[aÆk׮k4TСCΝjժ?T*uѢE6m}8N69gΜC;v,((heΝ;r-~ɚ6]QQQRR2o<՝?7޽{[lyY/? V'O\^^fr ;wkRRR>}>�z7o/aaa"ȼav۷o3 F3iҤk׮۷ðɓ'_)))oѣ}>}Z,={;5jܹ.\HII0@+999uuuOnpwAA={Ocǎ訨Z#G`qƌ >suuuiii>w^XXX+soHҳgϖ=~d25/pBtxd2u:D"irh4bV/^<v؈#_|}v6[Nz*aѐ¯W d#GܺuK(nڴ#GDUVEDDdddTWWsiں#G;wĉMf(J7ߠs{8&AO<At…~i <yr7e:ujfff}}ɓ'[kĉ3fbcc'O,? ֮]O?UV.O:t -[6/\e[n=}G|||XOC)Jggw>|o߾RN{S{wq^yGY||�J lQnnn\||<JwK.]tʕ+111h&Z׮]s۷o7N9Rf݋7BR׮]֪\ecf͚VJ[ihCBBz++YİaÚ\;š3h4ի-c)566RC;>8z`[:~ŊhoiNQPBpq߶mhSƍ׼Ƿnj>1t]N_hљ3g(֭[[wG_dBQZ>pHWW5k֠"t:NoG|gt:Zl]v5"^gV}zҴi$ɣGP]{{{Nw^2-I?sTTuP(++;~x;^XXxy~W�46d//+W_^^^|J&3+]h4NPHH9ŋQOv~tiiT*]rʕ+&oذVZue@0s̕+W0a>|SRRmƗZYpROnOx{VNNί={&H2 gϞ74ŋV7Q\\\QQjrkd2mܸv}ʍ7.]2 pssh_~lٲV8ÇG+W|뭷͛h`vڵ'O,++[r0 xs̉0lРA1- DhÇ -[|7fͺ}6[A= `ĉӂQ={̞={ -2L΍wI*m69ԩS/RwwE~sqqYti\\{cÑqqqh/++C<f̘.reoo駟AC0 [tS͛.-[x<_>e˖"6mZ!C曭ծF eeeڵKRM>}O^^ީS^{VƂN8_~q\+<<jx_~"##Сw}펦OwukF;vL>]h,///t?_~999C5yyysUUR\Snn.*1nܸ֋fgg6|QN&|>*CFqe湀rPgg{ 2Ft,*j5*^PPcoo4YP@=~ðw8R߿o&wzBBB҄B!D-aXyy9:@0sssI$ѠjZh^^FA\]]ѵidyVE÷ a< sȝ# ϟw^sֺ:4-7ˋdee1`0}JeeX,FGr[j�z9+WJT TV-,,4r޷ohyw@jDRӧO1 <xywSYYjo@l^N%ڞ<yc˖-۸qBoyYUtTim/?k֬9{@?~ܿ6Ӓ%K===Dh{,_vs P ĝVر#..ӧ,?̞W_yyykx[G0vڗ_~9 6샾ʕ+nڼy3ÁְSN .{94dV{n/,#k֬!H:oh … vQt?C̞=o[3y'=rH$R׵xhd2~:FQYGYGUȫ0LvكQ]r<xՇ<Zd2L EEEb4zA@ f-uïdU5:>�t:>`mg@ĚX0���0��IDAT{4���H9��� ����r���@���)������R����)������r����H9���lH3IdKU\J"@P5H/ڔS___QQiMM D@m#mG0 1L#F@:r Co?^3A@ A`0=Z[ @, q;;;ww.L9PJ@6+ JY[ P@6������r���@��� ������R4���H9��� ����r���@���)�����<4Je0:0TBF ###HqSNiiZ鴲qFXU Z0ydt^@Jr]rt]9*T* X�Rt:X<FcUH$&ٵg9...՝GӵZ^h4Nj! `0jz!BR@ FQTZU P ��@)������r����H9������@j\2T*R��3%%%"%=<< ���< @ hsI���D"ZbX}}}ee=���u:d"e˔7yʁk���,F.x/R��0 d2Zh^WH9���: )N~~[o|izTVFF ###H&0 ^Oh4ZH9J|m X[ F &@0KơA_Q(ѱ)bVF#+XN@ hlENķ>T*uر|��jڜojŋdr%D!��� dooO"0 CM[ ���$RaAΝksyH9���:dd21eH9���Jr劻{{naĚ`h4Ў���F&O|LnLZVB+��hёP(MDŽ ZLTA4$)��L&;88`|F4P(JUZZ ��ᴧ,[dz>;<Ǜd��fjũ6_D"1 ڼB"Sa^1 Djdj~��@sNPPPXm&vZ+|&|i}Y,ʊh" ��SRA:. j5Ba04Mvμ)q{{{ш݌Fc��-)AzF1LVURq\TL]+��` FjLdR*]q^FʱP(  ��v1L* q;;;6aX}}e-Lxj5Fp8F.F7��GrRD{~6M&-89@ g9偁0��2Nw%??6t>aÆ t@f\.���W:::.<ABBBBBBrrrJJJOR'��444dggX~M4 q ~~Fa؝;wt:A��d2L$dWW#F^RKR2zhјM" ͆��A.r;4D"5JTWWWUUyxx@o�@/RݻW[[V\n~cF1PB3H6Xs<��)*(`PZZ* BʡR,Jrd2Q(.Kӡ�8::6:ǩTIڬ!mMS3L %Zu���G禾tqqiRPtϹ��L&7._)ɓF���,e̘1nnn-1c@��t |]RK m��" N39 ��@7��XKadUV5]WתV:ޑr(Jϟ:Jegg6'AzvJJJ8N_㸽}/Za\T*6Bӭqj`%  볲 ưa^ʰRڵkfꛓ\P(T*~+!233=== 4,XԲ{Pj=ui+33϶h?}ѣG}t:⒒OOO+Y>����R���H9�������r,ѣW^л/^alƆ """RiSSS#""~/{ULFo%5MDD{<X4wBXx1땘m6PlٲQ$ B+h36mt P-I. Š/>~X(ZE(%&&._;wlq1 BǏ_9#]m˖-ǎ[zubbnj# E"=|T*?~JBx|>oF7߽{;|||._l4O2_}l h4VWW'$$HRF,\hO}}} [Bxw޷o޽{F5k|}}|||W7L/^=qd+((0 =|& |}pN۱cGBBcbbx<^NN=res?~d2ӧa2]f^СCn#e)̙3}Ng e޼yJRPDEE]~====66V+oc̙ ,0J:N& Uo/;IJJb2l6D":wŊ| Zl۶m>p@BBBQQZv?? H<<< d7k,D?>|bb!C0 w^uuѣD"ٽ{Z^g2hcoofџ222,X0sLD^:%%%666===99ɓ' SN͝3gNTTD"YbϜ9)ԈbB&}GK,i"}H$Z`q%K,_ō�b6v4Y211100ZGzŵ/{FŕЌ=sSN}+Ww X,GEh]$I~rrrrrr0 spp(,,�*:dm\.x/11111յ2=.!!ԩS......M&KKKC[#Gtrrj^Db^z_;EM2… ,sp\H9]%33sϞ=˗/7;wU5`JKK.\8q"%%~7oze2P(l򖜜&"�y<ހPo߾=:::##CT6<mڴbD"̯L7n`6hР+WTTT0�xzz>x`رNNN7ol}ͭ9xŋ1&M:tPqq'O 􌤤 '' &W JJJ]]]/ AסRQQQyyyIII{i!!!~~~FQ.C+YRLJJ*((HIIٸqyp}Bزeȑ#Gvuu;vD"IJJJNNڽ{w~LɓhHy֭͛7U;FqϞ=&) ` /))IJJ*,,>|8ǻy׭[o\|yڴiǏJIII.\J;wE@f2ׯj B&zT*`02@SדHpByV?Ν;'?w jhhXn]``\.:Lp8|>?==wAL[W[[[ZZ޻zRL&7.%ۜZvtt0O]]÷o^QQr/^LRǍٳK:99L2"!88yE83 ❘Ƌdr^?wc6dggO޽`ѣGϘ1#44aʕaaaM0AՖ}$)...&&+))ׯ_GR)^os\СCQ 2dϞ= bԨQ{XbѯR<<<|NNNÇG/_<<<o|Eyy9sqq!h4䤦l礻kK/h4R՝xTsĈ2 qJrr%K|g-j7o,F)ʞI… k pwpp W\,))IMM  L&NWTV8t~~~vvرc{xJ/y^ې?.'؟ҭ |>7oތƉ>��tmړ1nU9b$ 0lNWj17Ƴm6Ri>0lȑ ~ى^ddܹs'O ��R 8vVٽpq|ƌM^|>~~��`&i���r���뺰& u[755GכIIIֿܸqӧֶV=5дlB4/0LW\)--!H}U*ՙ3gz,}v0ի:w_ 語3Ϋ~0,IS���=,|{Q p/��@7���R���_H$FF��`M&)r/4;h&���BUkRTXop ��U)LNK)0*îL˝:gj*��}KUbEee3O?{Τ߹Nרa.N��G4e8,LeQh UOohf@~w5 $Al��#hI;<ʬ$i%E(w56sەΏ ZVm00�� &MQT<)7LzĽ;$b q��GhǼ`7UsI_=H<zpZtJ<tAP~~ݸM��$ 'ӄ9+fS( )!����IENDB`����������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/addlabelsds9.png�������������������������������������������������������000644 �000765 �000000 �00000627115 11332127303 021453� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME"0d�� �IDATxwUO9NwON0CaUWEtwUQLq5"`wEEWEQA03L==s~:w<S]9:Vsj0z>hOOA{#.dɒ%K_*PX2D@ t:h m6 ?lw:4 ZGχ �to%K,$Y~{ӻ}p饗ϟ0P_{sJv>7|3zy"-0 -J>)/ǒfh"m1t8Z䱷t ��Fյ��FzdY)آ &b8Mnl(wb +&YQAG CŞ ]!^rs,,'Did@ǐ<gsg`Ok$)n[<Sͬ1?H,imU֣8$ c3*DztX!FxNpqyA R&mԓ"ΦU}QD'YOh_ FX=NȲܣ}ڃTV#8  0,.+ DXNt;̂(c)20ƎËݝ=A\դH%pmoPM}ñT29Bq]vs?|g0pa$%MH{/rm?NX'>3d?�`Y6n̿ HQABdEeY3{3,\"P衇0GS /[`bҩ_N-d:1Um=[bƎx,6 #:bGw/\ ڝL|k?~3 }?h7`z}lz×N%GXj;{mcG,k!`I_�)j9moJ$cKGc؈BKK/h40I>Ul6o2[l=Ɣ뛻"hQ~*r]~TF;L.6u%G;bXB9feR=$H'rQ6N* ,]=P8Fc>�$"w*"[ࠏz[mcG<]lkhDN] XiBgw9&;L)JǢRBNγioO?ia<SݱsnEc`(챒DF^Y`VQEƶp8RЅBᾁF`E6md21^ǕiEK܆~r1gzpHHKI*GU&lx/ g}2?Oz}"e,h##G&LN*���C� }CCØ1cXՎUU{(s, kN4G}>_~~~$HUɾ?NbEMK� �`p ( Ѵ�Ҋ qNdL4nqEU)>J(t8y4>b7ljrfEOipen�N4h3Rחu41p_CPH4ɕ^zlFQ}D#JrwHlʨkp][HbY3|xLDCW'_)|rEg(7<@K?/HËrzéHe0 9L<^)s}q&_QuD/IŹvNT:nf6n7oMY֋"rOCW0J;4Mw:bXs_OOSF:Iay[8AVeéBFH2¼4N(h(%΁X({lF\j<oQ%:<#><P<-;9Lz=U7DŽaS6vX (JXP kmci1P2Z/*7JRQSI*α]v>M؞n&(S!0R|i=I]\h&QQWӓؙ?;EȘam4'8Cq7,ȱ8~Ȓ<G5ak(?<~A|d .r[>ɟ'4$��Go2|fP{Wq˧Ð}k>6#Y7F$|>\}}va?؆Pm4XIIKNebz+M(յvy8ibjQ !]Vo IS䝗<*O_8VoGTUlX /ˢsXۂUc:$pmjqR1@-vdjOxlz>րċ]棾B%s %2@2nQD70yNSMߤ#rLGMT<+NaM=QEch Xd|=H`Xޟ`c([2�j{z>qL7ċ]&_DVA<e c%ӟ̳ :+0NSMH.S}WFLEcIq/*pkEs,:p5`֓.smGbc R9"lAHk_mL᎐@(+r{bźsn(\ި#v]4ohe!)qzHJ(˵y;wI?1v7,tj;B]DK=XZ0E.##-1Ug75aڂ$M1ARK=`ǸITDMoSG:v#]ců"7BPfI<לdo S$q;4qK# sLG:C]drf s 6Ʋ>ɟ's3˴}Щ8q6/XA:!4>"0nj[p*ciwQU>:?ǪWUu֡ўM_�t|9SIMa�M+ �HQa$J\榆uDRBJ! /@D!2G_zkU|Um;b"Krbi(ƶ+g �vD뼱%`7P`WdŽ@Ԏ.4-2"qi(7B '%9՗^XiWz ft[I{c1M= EKr KIc<FNR<"zo̬'F;"hSO'y\7|e)ʽaЩQs((ϵZS -2l8!*0SR)q�}q6x]WLO. ԛTxd)qLɟQvKHt4ycfi7G0:t;a\e))=tCO`h70PQQg׵Ҽ2 ad)"LIq2D7pEқe0< Ѥ8LQm?ku$^tL5$ )1txZ[dWkL/.pHmf 1TUƗ}!.G曢fs4ts̔QGyc:wt-)^ !62HX +P[cu$^ii{*&vLqsvSvI`uޘUOڌdCwðc `&_#"Coi:+FǦkO"sL0U}ˠ�'YuXqw/g|9Û|QRv;63sݔ)J]gh )N�t$v2� #]VYUkh2gSGwobeQ>YLv^A)%!(��+ }P՘}G:44D yəSދWz;Zxl1I%~|YEk^<f ͍AaŞ3;^^2Ÿ SG:W9.6,v(A`41N.5F!>rti^NIh�CbhjeD L)5V(6# wi/Z)[瘈>VVB4/*JL LGb .iYc\I\baA[`X1 sIh�cheDIXljsqF7{,]fe0;a^&#r 6ZQ.?cV<�.w|i^T'z{"B8)8uìH uPA7WLA. Vn3Hk?CB6 jVT&2)N5@Lȷ*IG Ds?p/͋S}/ިJ@wH0(;ㅍ/2vXZ,w钜]f"\+u۪fXQTbj璬TчSrϳRFw~FQ}︪o菋PExC@d}2?O2m俗bO&"0lx Ol4_L}=4}t+&`ca.p_\8m�zI-9\A2,ӣk>]sx|Yj\T@+aN v9S`5F(};I?XU}g,hחxŠ #]K~uδ3 jT"f/["v=f3U0p �� 5wswe#\{YGE8 ##s:@coN\dgHJjgX1m "w1+u0 *T�"ccIn))vYlKK 4"a:IBK APk@0Pǂp ʣu�ΧxN97"Rre#$XUq8 w5] qW 7cZ ⍈N#Fp�OH8B04;aGzش�Jd0%$G% I4ςaQOkO*4*>Ͳ"(!}!l!QCt2*5 /n5XN$y+": ByGJs^M=-*`R(qC?#|~"<{Lu2"(!{cR )YqYAÜFP2Xd8 wA!v"-]aaz'0,@4 P }\WD}Qeq n4ډC>q=iIFR0'RWL42Y uF V#ݑްWe%3)`1K,Zk mAT? ɲ*+ E=@T6/OO��snۦτA� & (aL!=3 EzEatuѾYr:DLm=B7� ��@QTTUP&#Pq)_O_ <{bE(δF~sѹ,TUR 1p�$Ď%U b�${"\*(wɉ޾]H X̦D̆B\r'g@68Ri؂*nl#}FdOp8ς�-po\j fESr0G$vѯȡC| (qNM(&A栔zO0p| 9*BODVAgDv`V o HÀ@PKaF-rqa@Ӱۈx癑=<(I^+&E&̄p ηm!@ 3@J- *C�ipwH3GDY m@B 1je#LH}hJ[izE-pwLq'WL0Bɩt`"<r'(oCRZe68(IЌ�j .=l!zE kUObpn `J +"*+"{ Do!*=19ʁr/aCКo#"4aҗT 0A-A)Gt!#,YWd)GQ+;zBGK'\W5vi2 �� >)zp>Ngͺ1:Ɩ:̇KC�Y%OHgoZ4ht[YK�̦x*qG<:T`hm9Ov�!hcyKzn$p_UBf.D5 h !wמ=)ĘCJ ȡaUR2K8t 2 d'z AMADBV TM7&hSK0YARj`Tld"Ac@!1cT;jZ8U_DYPi"�R:Hƀá=h [nM] p0Z@C5# t%7)q5Cj 30+H P_RVh *8{JWTMړT@) nN2)К*KA3UzƠb MJwhPQ˭ބgj * P)bkTbjJ8NXRj 0T4d AcPpإW;*'C#/ b,4®X8V@VΰA45L+*\hV A#BiX MƠb&!+C*y諭7" nqHF"pSPӐInUY P{0Rj(�n 9:HA²>O2$x�x㓆/w|P91 {,!=��.X<³}|z;{r2).vB=6|h 2Rep O:E2å<N XT%3IfOPZRb#t]RV]d? V*FCܜ_KxIFS-�!NVoT䭊 hW@HeP�3R�'QEwK`1.2iK!vJ"#KM\R'&xQ")Be&!#iEK0:b$u!Bx'! 4d<()PO1Wڢ!D8a=I,Fb#%Uۣyz)]q"!@&!#iEK(:b)NZj&!`oY8 **"F\6J[�c' }),Fb%eUڣF1|Qv+%$$x?QD-5kr`oi0ӰG/tF.[I5*i c%PiSX C=IBz\b~+,s"#mBwpQH pqPmջRU?EbEiح��QDvRibFqU_ai,Q!_1Wڣ "pxaY':$XsBY_n3s u-O8�m653isԇ] gM2Ixps/Sg;3ؽ{w*ʔ+k3, Ei 758(D)7qZUA qXL@t `_ wbJᰎFaf>C 3DJD '# xI#&ڰNDR#ו$y*4pI X.cL\ՋZfPHG!JmӲ \Ǣ<Gs�Sxr3a|+,_ *ܗ]`֓ qD)5r)B=�yh@AG0b^$D2$*sQph!ț"蠥(e@R8y;!� #DM9`• 3sa)%F'M\`0Sڞ ͘T`Dh=*3s5aF#I Tb<$lCKG̼V&uG�� �IDAT)F� \dINRrs2bRV¨<Et(4=UiTmK&L*4 G Uߙ$*2pq hGaЕ$։ >Y|#7^x[nC9s?j)S`N߿XsOWdpI$+H.̈́y,nU+E ހ 1\8b MsMqZfX""pC:I@Ό9(lQMqQ= DRh&),Cq0%i+.H6bcD8)#I K1 pde�u&+6b Ms-qZV\xD=+/M9ID(TqQ\}T b{D\h&)},Cr&h .8HpĠCeE <ەͥ9E*:RLX0EQ=kӒ L1aiA4*7u&\̡ÑcŽtyh!b"K3i e`%ࢃeEu0oLKh.n�t$i!q.7`RF4al[T8f ň MSaјބI0UUl?KDE<fY aa9] Ө즸o;M$4f":.ڞ`%#>YY|2)aGOQ#~GX:�?IEY]L$JhH 8 ҕ;q֔ kO V: OSHښ20ވ )#+."ei+b<:^%�q:TlM)DcLTstL$JhDԄ%JDŽ S%=.!t4S*bu3:F!-e4RF VD2VB<R:^I)ؒ4Rę.FϫH9:LH*ܙq֔Q6H#.!%t,$h⚰"JkhDʷե$x*$%t4.=C`Hm;&LhMIDvi/ge tD$<2!pGZoY ZSF"03mU8Lұ@ys eNa-e0SDXSǪ%%D ֔ThI X!^F|[(cQc<2pG`XZFXD) YTG?]!� /^( �@$ Nʈ��*BBߨJ!"+c��xQUeYdF!TQA H!WENApXUXVa!�D!;>A" a "((T8aa *($s' T=Nر0HVT$# �<IK'PX§* *(T>Y+OÒ?[a?^YIXe%ǢSU&=Xl6k{F1㸪,?䓨[axΝ^xauYdɒG]z饩Tjǎ$/t:W\-,Ydr+rss]8#Mleɒ%K;;;?䨪*Bdɒ%i쁳%%K,Y~!'K,YdCN,YdɆ,Ydɒ%rdɒ%˿/Pzzz~vΙ3gSL9묳~Zޟ2z<m7ߔeyܸq}ќ9s��ׯ G57mt6 �PSS_�/^;w<rHܹsVdg>vޮsrr~B'Ww$G1c.=d۶mv?_|~�@EE̙3Og>|xUU?/2/Ҳ=j͚5_|i);v477/XСCvygΜYQQ]8��ϟ�x[[7Mii)esϕ_tEC1~~7ĒM&S?tvvZu{_~yqq`>+,((8O9^:BO?'\]]]PP%H߽Jgݺu/h,//'CLѣ/jfBe۶mՙ!d2Ԥ^yȑ#TJ .S̹8$uxo󕗗(z]w}?z͛3,ZHExwo߾+Vlٲ崜޽{fsyyySSURRvOW9oٲeŊ�: iWwCC˲z˟|˖-sj-//ohhņ׊+/_dɒ̝/[n(se9-UWWhGVWWwuuKr4&Lp%h駟^~}ɻ+$IbY3. 3g4m7_p$ILJz7߼[�O<Ĵiӆrc8eʔ?OwuפI^>SOo=zE%I5k~?[^۟zW^ye޽z~'�`0 Ϙ1g]vn2Rԋ/(A/ >_]>�ðŋ744Ȳ|e-X�nZm6$I 466 L0ȑ#EEE'^dl6v.===K.ۧNzE<ϲ=s%رiw}o[QQK/ C3/ EQC0L{{YNZ\\sp8<c ֬Y3vuֽkA]V;V^x70dժUaz{{_{wy' UUU͝;뮻n޼ye:7o^ yn;wv9ȲcǎC ?֍72 W_ .IE.\De˖]G2eJEEG+ܹs?L>}n7NPr|AĬYEyM&gMĉ ^ݻt:ݻO>;Nzy 6|:z�>|뭷VX;_~ʕ;;;^N'¶mvO7n˖-iZU-[lt5 D"yiӦM<_ߺuBl۹sɤeYۯ] v+@ pJg駟ܹsΝX/<y2󝝝�T*DQk(�@d Ò$qv{ VڰaÆ x?<//ѣ`:S ZΝ;{{{~G}u<Sk׮'^|<?ƍ۲e˖-[|>߮] 7ܰf͚7|s˖-{G?S=d21 cYVEQY-..K$5s̫zҥ---vꪫ͛W__5\vev[5\K/{=Х^??/8*++_}ݻwO8q``߿ꪫ.rͶk׮n'loo߹sc=u>v}|%K_!f*IR86LA(jժ>`֭ .\ti裏vy뭷.Z^zÇ?ڳgΝ;ƌJN(gyfӦM<O?8 3ǖ-[/^|}l߾}ĈNs+W,//o,8p`޼y_|q .�v8_d<pWTTݻw �?&//j>#ٶmرcm6_gϞW_}[zu/l6˲gϞX,v(IҕW^YQQoN8gњp8nԨQ6l|糁4R[[sL?pee]~ o۱cGyyNOǚF{{{MMMccޢ>{ '7ԤR)mύ7X^^Oɓ3mgyBk֬yw{&q߾}vt]4555`Pb7[FohhJ"/;Ӻעh:iE{x9rOH駟_矿qe˖͞=n<<?7ިXt_O|￿jժ;vիzS:6lx7,Yb۵<��ݾdɒM>yGEжy_lu]oFqqٳ"E۶m|<s3:7߼yo袋=ܥK677+wqGqq%K[VVI$,Y ѣG{8qiiiѺ4Z[[;:LXf͚�xgN A#G9[n1ͧtbw}6Caԩwy'0ӧO?VtذaSLƍilj{l2G6lԩS/ &R6,m۶}UWWlzy͛7a|'_ ,8s&Mtr yyy'N\~qd&L0nܸS=nt0 ?Sڍ9r /t:??`pWf{o?!ڸq?<}m۶7n ˗/Eqͮ]뮛nqi�-ܲgϞ˗_tEӧO0TWWkCZ}>?N%Ng"g۷gnǍFȑ#i>Q0AL8GIӧtx ~_Eqc=v³!LzO>d[[awygfN#b̘1<?Cngy駯u-ZhѢESL9-ب'NX\\ H4GѣGKC+$(z]'ϛ7 .Ъ ~*2L(t:͔;-/~ee%EQEYVQ~ŋ?|x„ a-8aÆġzk~8qqD`0dF#a~?L #O>|<o6=ĉ򗿼455|qx\ɹuYha3gZJ�ƍ~3O>)xf]3Ϝ9s̙37x �@( cƌѮnm�0f̘}r7}^{rݙD"qYgmذgZuYXV<q 6 O׭['j==O9V*3.T\\\UUe4|nm…�{f K.>._|ǎK,?~ 7 b^^QIIɺu^~{ledX;<e0^naG}�p=hbڴi.kcǎ=Yg#F<vڴijs]pm݆a믿$UUU>rr-tZ;%KL6m|>�`ftFyE SNݿ6u�pw8Uo=jԨ͛7\r…{5k6nXUU鬪EUUU||W^|Ž{�~ٳgϚ5﫯 /k_~֭[/_Ϝy?o}ٳgxCTꫯ �,X|r'_x &̘1cԨQaѢE�u֍5jĈtj6*///S[,[o=s�׿5jԝwq�XvI.ѣG�L0)fpUUUEE�`!bmi…TO�6m4ı]UUi*** DÙg)ٳK/ɫ***4$IK˗/_lgnݺ-[TUUYfŊG9Oh3DUUUZ]g[f_~>Sſ1 Zڏ&q{aFkdijd/ػww駟Ν;w^|͛7Y7pƌ/?2غu,˗^z;N4[dYvw_bz̘1 a͚5?oȆ,Y(++ۼy6Ekט3gάY>!;"?alɒߋSF1_ zg}g,YdȆ,Ydɒ 9Ydɒ%rdɒ%KqȒ%K,Y~t:=x!B۶mȖQ,Yd9]|ywR)%K,Y0w!G+2[:Ydɒ4Đ%COO,Y~qL0a(kfB6|~_{s(ƛ,ِtL&UUE7|%K6PU5rEy/[2?jO}}}kkl^CNwwK/t[ouڵկ.li#V^7 �$I[I �`ñgmn!sݻ?gV3g7m%3f}ٙC^yx<Y4 >3glhhz˗:tqҤI^zի�W\q3Ս>�ظq#G��Zu,b -d2}g|IF$� ?'Ԩ{q͚5_8o:̿T*RVV-vөR8pT˒)á>ZjѢEww(j*A!{پ}ի:TYY ֮\'W\yw\ygq-A_�8tЂ ^-zWZN<j_~ٲe>lcc ^y�^}Շ~feB_wiӦi)]v֭=PCCêUzꩲ2s=ׯߺu-oxEEE7t0̔)SGy$ .^x͚5/rww?bŊn^pu]WVV? A={߿brnӧ_veWnڴ)LfCοݾw?$IUUEQ$ AUUQ8(0 CWZ? ð,��A4cI2m A0 k3fE HKSQm\m$IAh ,k鈢 He( ,#IҾ<y%I$ a4i;5KQ Y=s9眲bFQд('4Z!.J^EQo!r V3gV8N3CDӓR;a 'G(`aWNX6l�/buu|(F ,k=){ڵfYM60|ײ,J;>[x|v ~_]tEDx x'I?wvv>|ƌuuub+W]re8kڙ3gQ\\\VV T*|Fٳx3g�u~>h˖-MMMw}S47ϛ7Aݻw' A92mڴӧQWW7j(v$ItÇN>}Ͳ,ݻrH{>뮻9J͝;袋eY^ry̙#b"3gmݖY~ /;wnww]{;�z'NqlD _f-.C$I8kmAZ1l\$vʲ-x:ipC�� �IDATIkEQ]ۣђ0 !ZFEeYւô{GQTE-_Y,4=4qaXUU5zhA1J}!?0Azx5D 92Đ55��A e53E5=rNc,D"'wlܸ>E1Je{ vk/^; .]:iҤ~{ܸq[nOwܹhѢ+V_s5\p]Z zi:N/]4o޼YW_mڴ|gy%\²O>9s={8ׯ_3<cc<=}U2"= Hk)RjKBk_RJkEPM"VKld#$}8ywfD#G~3ϖgussaaa޽{~~~|'o%Ϝ9fii9bĈM6 >… <O(O{ԩSdd[:ݻ޽=zuơC=`0233= GBܹs'!d;wԜ5kV``%K>/]4>>>??~~mHqD'655M}}= j\6[1~fEr8 94@ g�bX3LooosssB_ g!a2<D.J,)J-bдԩ w4qooX,G( '� fp1(d˗_p g$֮]xΝ;O2"+W7s'jzŏ=JHHpvv.((ZTTz 6TWW͛7ö́ />}>}߿O?ݼy3O ]v4hN=qܹs۷oÆ P}$%%u-!!!))i{(,//䯿zܹ#G7999-[Ν;gt!D6bĈ:̙3':::66Co޽{'''ß{?~ELXLO   =x ]'` Jd2o߾}X,l6 ��'FLbF7)8rÇ/ *L,@+2n8B wذaÆ #888[cee5cƌ?&M:qZXv_ӛYfݸq#))I$8pիϞ={>|1\.w„ o&l_ZjQQQW_}uԩ-[\vMP*]&BvڥWJ)((5k֬Y Fߴiǃ''3fBصo~ƌgΜ>Ї_YsDDDDDլYҾ;oo6>rHzz:&xMuႿ?-$d�!C4pfl�0t:իWXA]1Lt:P( 54 J%fYD钓!l$!JrMӢ \\\x<MJJʜ9sbqۻ5EEE_}նm۸\D"Jj555r<߼yS(k׮֭[Ba׮]ǎKNN0a!d999HVWW |PNNNNNN rvv?Μ9uVBȔ)S|}} 2n8&w|GGǂTp`aaagW666w}H$H$GVVVpp޽{o߾mnnnoooxGuqq9}T*ٹsEIRFseoF$d]vSN:uFyu%Rt bcуJXGTJ%8}̧AJ8* ޅ09&O,~�?��i|k( &|2 .Ç;�@drRxQ5>RrMphp85<˅l@2npDl0<!mrtj4&됛T%&&FRݼyR` nnnZ5p>}̜9<##C*Zcǎm+ZZZjggrԩ숈+WK/"hРA YYYYYYNNN)/))ӧaɓ':uŋ#F3gf9Ntt_eeeuO?x/_8;;Gt{zz.$$?zWdaa`aaa#F8}tVVgBBBPPɓ' O>tÇ?>++|ǎyyy/++�VD"H$򊕕UEEEDDgaaahhh.]g)_~vٲeݺuS(}={vvv˽~Yjjj=zԫW/-节L&yfnnRdP~7 lllR!T@�<1PG3QDm;$ma aM\?�!4lD%r|>*,͛7H�]Ns/e>i͚Cl3d"5 l<⻆[ӈPS*wIKKcfffJңG>%\pSNh?hl6{̙3gLNN6MhΞ=ۥK[YYy޽Ç'%%�ZEQQ8ttsB@)XR@9Hva\jzN;,BqưPir�lƪl@& xH$@o߆ޢ;yѠ ]<Ua|>_9 Vh FaaDsjA`0 (M2˅UO#"" z8qb޼y&^߿a~炂 y9I'04W$IMM =H/2 2!jaazj5Ҕ�C6F$t4�s;L&S ( xyҸ_0s֭[nT* hZ.+ 1heeբ$=`ܢ$$UҜ4Fi,4 ٘41i0wwl|⫫M kL`r$@#� d6J;wD, w O<Z1ςa N@& ipP7d`ǏˁŰIMDkGx|ҫC,&F/9j-dфB@ 0ڍ01\Wa!PX8PDaBYl4lO$�V�u�K80w1H1ԁ˄ M ->F*3K.=Imxb.]4q]hu:NG Ѱg2h4U=t `0 #LV!k8!Z/Ҁ<o`0 C 7&`d5:{!Hp0DtpZ"]⫎VdX@ME�z Vsd n-p Ymth@;<c5Km4h&{ݰ8iiH1LȆP D2=Zl6[0Y,)4 Bl"Hjkk1),U<%LmiZE&:PR-,R)6<Uj �kp!QKW^!!!ͿX<x]ͩ|E8lr ѐ4 9^t7[[[9  _g޿/.kaaRL V% X ExBNT*a2A~`8HAVt:L&  �4p$H$bGh4::XG8o_TTZ-Cxp\ո0P" B b5N0=c29,)LOfBL5kM`Z[[. /AXNJt2 aC; j|>aҢ\.PGPx<@3m�lhf6yh\.W*"� rUmm-6*J.B^heWcNF9F/xKz $%%ZG!˗-[:7~-%%eŊM者rڵÆ Co9998k]|ݻѣG6g}F?>yLJ,^^r sׯ `+@?0v|@n:I 8�<"iz`=MznPҥKoFyːh?e<D>!ZheD _{VPo"MnQl+V/888...==]T&&&"o4iҤ$iOLL{&M4iɓ'a@vO~uě7F;vlbb[4MbbbmmIƏ娨+W&%%^"fa@ VX,X)b Ѡ i(c[iBuPi@jZ:KFHwJA4͐gV+Ja&T*%  C K---͡W !pDc#E=Ocodee~#G|wfϞ=fB.++?;wJJJv݇2$""k׮qqquuu!/xuCBBBBBVZUTTh<puNp jTTT``Y OΝ_8dmV/HܹS^^jPƴ4ffftaR^ JAD*&J8 6I1726ױ,B"^Ú36$P^^{͍ḻBHKKsH$\\ t ~9M$'</5qjiz3nv콢'mO 7_i].5q?+W~m333L,]t˗/OLL<{?~Z]RRCSMֵkחo>Dٺukrr;imL�6rqd/,.�$ ;rj5;pr�H2;fH5ZZ"@O(x0 >KW{ULF9PuMV x{{w!""PZZz,54*JFk=mSz)t|<_n Sa e`g.S?�/x< U@~eҗ{FEEu/A/oعs'vnڴiذa/` !͛.\h&{M(ʛ8р7�N@(+QB lQn| 5m2T}:C! ]p8|;;N:t_TJAAX,ZPdJxw4gMx-j#@ccHHȔ)S&Olii8Iޟ^}U� 68q" �JJJ믿!7o$șGB'|k׮m۶5k&zH3. !666:L%i{oa y& j4:l�0`ll7d*JaV/--rJaa\.@gRaZ\T*~Bh74/={޽;..l߾~$<xP$i4f coFGG{yyYYY^r/ܷogqq36mdffݬDRWW,>__{[2fgg8pɒ%'O| *++L(PQpykbw2-�NS>�P[jEOu+ajRwC(P2Nє0̊=zZ *.|>F{N@�0 H�mMJ%rr9Xd:� Б̣ Oj2LOIha<T:DtME9GV( 6DFF򘘘ȪQF^'[[[W{oǏb 簾B2*44w,ZeOOϘggg3,,LR9sB^{5ڵ;vҥK[DFF:99\^XP2�78�!Őj8XK;�f*Whg؏`@CJ999bg>DARM5zCÌ_3kǏ?7n4[111zthwt5 #G9r-ΝKwM8EF91ӅJ->2 ЂItKʱK̃L> *B3}2HGT 8C]A& 1D0 53ʲ׭[g#3Za$Ych6P1|GJc>dX,Ŷx uc2�,Po_sV'?v_mZ Q !%%%. J \N+4#i I:-H.@2"1@OV;"Q84iSHSE#Ɔްs6{lLrv>UTT<0"EL&kKB p2X. OO@ fBRx< +W8..:.WR1  C=x1 d2y<T*Gx<CcL&)ɚxhI9qjc5< PH-Cd"ƪPzK-9mJKKM]Dfcc# Z|RxXeAK}`zJ(r3Ű�ZoP Ժ'$("gq="*Q: R 5D!@!nǁCXsdzZib [vvȩ{"xJk&kR$5S$F @hf* N ?`hatc?WuWtHؘp(D"5P <IC+6-`K`X93ҧ j,ozN3n%;1<uԩm KDDH( J(d2e2ϗJIP heb9 A9$${ww]:}z&�hP}_@ t`xD@z(Aȑk'OY<ֳ@#mǞ$9XhtXR<Mc,--6}%55uuuuu7HAKP[r"À.=bX`ɻv킊za3؎Ccrʅ r6{V'KB:' r�p�!�Z0�G  )h L5dO{A2xmlaAnb]p�iwA'T*MLͶbXOsJK&Fs-L& KD :%|X,& o w� 1՛ &RL40s9x+Ph _4 j4jℱ.eTgs/)ƞљ3gFEE7rM6vH$ ,2d^Ɍ޽{!d֮̓]koozaBH``ٳ !/oٳMdϒ[,AGC>݋/,2!L& R؆D@s0Kө_S]dD G8k �� �IDATFx6ҡAlB:It C R'lLʡL* rF3~MLT@sD0fcx??\XXO?d2D"H<Bb*J"}u%''oܸ_Zx/2a„w.Z2:::;;{ҥ={2e'|_,Zѣ-6F=3�#P�?BO=2;CTAG�0Ya(CO?c2#98 ,VA^ Aaid.`Ur9q8Xk.jzK>|xϞ=R4::zڴi={7n\xxM (66?377޽{7{<f̘k׮VWW B>_XX(-,,<xz޽{WTTp\33B‹&3S666ְj mtA b0�/A o"#q�0Oh *-d!MϜ(S 0a4@tEgsW %h#Ȇx597c4r˗ǎ{رwyg=2YUUG}4qcǎTkך`O>wH$rvv;vlQQѶmn߾䤧;88xyyAr۶m۶m{y>5X@@%!D(ACۅ0bX"Ho" AކJNNNxfX̠-QDw#HsFNXP-w:z,Ď 1n0�F !ڠ' <Gԡؠ-#nO_=Qh(}7ހ;u4v˗޸q=r͛7fmΜ9Æ ͝?~ǎ !9~t)==]GIKKokdOjEEE"@'O P?cY3`> ;M$b]o`6q1鑹b6t 2 ~`.K;gE'!vvvݻw裏"""<<<�oeַoĉW6eRY[[K? bȐ!cƌqssW[[nj痙I[,55Ç(4@aPPմ'D l6ѢB4" n| F$@nKr\& f{6 tapKKK!.HPfi,V(CWzNnl5J=GSI=d)S?|[[[&Y\\liipE ۙLfRRҏ?HrƍYmf;qD=˗/988̟?Ȑ!N*//ڵk^^^~6mt[[[wԩbzd&{R  g &k AEҙFAfWfRHXUoݺh2�N8"2P ` !`ZVuƚ+%FÙ/rܰHP(r90;8x<u HpMUq U*p 4;7k` j߾=pBާO5k\vmܹ{~W`z-[222ڷosӧM`w~**77qƾ}sݺu顡sεٺuɓ'/^z &@pB+++m4SFv&)̤a G𰷷A3r0P1^XLbC5 ]CNA:x\5$@ѣ?̙ct3ĕ~B|||>Cջxz("""""~e…fg.]VUU!�RP<%\3\3LB (@# 3l(+wB5p ޳bV;֠5>+kd }�m̘1cpXB$6.3ALfݮ]VSS'hi1: F< abxդA:d1a-dw vQoÇ[FE)B#�FC$ ]p\wA!Omdxn͆)51wtDe׉J@.@ Xiii}Lֆ 8z4!�9N:*++CW o1`�`H.-elGG* 1AaN)J@@W ;dXW^0P™lb2! ϷLw>!͜dfX,nr|||Lg 8xe2raP! W zբ1 D$`z 6.,| D ,ZL9,k#G $E, 2P=1%^={f߶a;} sҥZkNZA`��aq$Ҡ 3lC(bI aD q~a t)Q> 1&L6BԂ2' 2pFWxj.q{|tCw>4=STi݇N s0:r rɂ 2=0`@.ɂnL'$׀n@ϖi2>oaaQ__av#S|>MBB�4333Lli�E;! DHi Mpiz#ݚnћ=w{I#͆ؼ<<X2 98豻5 WfkF7PHI!;q {* j'OU$Za571 s3i6A�ZdU*՘1cb%`A#PІ`nnakkjee]'OeXZpp0 K q5@D{|>p\Z�M5.+(({tCZa'& rZ5ؗC$&Mt:]bb"FW4H$***Lq|}}:wήyȹ {Q{B~Np�'xD7Kbh&:]XFh$XZ$?jJDݚF-97o\j9tКK.}嗄[^zu׮]GmBѣaӶpҥ !;OOϏ>r׮]N" <xҤI bʔ)֦M]^^ !VVV98k,OOO^w}˖-wçOzjÓ|V[[soڴƍp{ɤ$sٲe i7P({& wKJl/۵kgΜٶmۋ/2Ё>6@|y/cpNDi7 U!b c'. BBBll Q?ϝ; l6]QQJPXšPX.c!GbC!40#u PCX{"1dx7K 7{(QȩNIIY~ay`_UTرcΝ|R|rffÇ۵kgaafΜ9ϟϏ$ܾ}{ɒ%SL>|x.]lʕ+.--m|M}}kmm?T-[ 6,;;[*׳QF3fܹ >}z^^:`�6mZVVVjj͛Ga <u۶m:zhJJԩS{T*UYYY~žSN-**WVXx…o_D"QuueEEůN>`\xq…ݣ l6ֻ#Fpqq6mڨQ~W\^~ԩS_|EΝoߞrwQ>}K8j`CP4J3G Ac~W_C1xhg C 888ѣW^...ڵkH) `ccsEHT^^~ܹ�BTp@<h4 CuPB̀Kuՙ5c2sr\,^>&pL>/�Uљ1nmkkkxPMHHؿbbbHHӧ?G=|CΩSN8q휜?vu={^^^YYY+!^;v,LsppAR)AF/yAee |뭷222 O@$i4:p\-YO?5kV^^}QQKK&N8w[[[?}zyyedd͍啖/^9rȘ1c򬬬v횑ѿzӦM3|>Ņ㕗[pQLݻwmllbRtvv_Ҋ/`@  Ib͵W3l& iġ KTNȨ0@d2ڵkףGH# 0UUURt"|}}2{Xsďh㴚!E?7_ Ѩ: b?a;!(O&SӛG 3HCUT?[f?o߾_74ܿ2< 1<C;@ rkcj9Ǐw^AK*Yfܹaaa:,Ye˖駟-[ѡC`y.vĉyZw!L<&.\hggeBHϞ=,YDi^^^&''ѣGްIOO/,,|wq5k_۶m~7S*^xxsrr =<<|%Kccc+++srr~U+>}Cgkk  6+ǎ۸q@9kBz1@L p8A'`0t:2v68XjϜ<583\MD",LMv-Wr{{EWGvva͙)d|aegUףRR=tzX]U 5=J5]5jA !|O_1SAjYxpNYFQP|-ê0}%t-@KM4>F W"NFAҩ e`Y]] 'VqtSB{Νmmm1o`uaҥrLHH?[-㏫W߿޽{###zٳg�BvޭBuppX~=L {-]T.ǯ_㥧?x�O`ʕiii j)H.\pA͚5!p{RR^:55|ҥw[l?<o 3f< ! ǎ۹sݻr+M􌐛x 0 e LfA./4`@3;~dj:wfRGeݺe󭬬,,: < m0 ѕWMX#vRJ|,}JjK|o\^ՙɤ2"DG= cTjÝA!B.rСT*1Ē[Rp6&MB <xfgϞb&OJ$DʭW^ ͭ'O^`ԩS*эGv؁h42KL&H+ر-}Kv,w=zt:::Ml\VVfqԄ!C,YV wwwѣGUUK%njBC%�0CeLx!Sz(Jj bVMKctLݝlV;WWW[;J$ֶ; TT-NVeeմ3DP0Xj8LHW U VY\j1  y@4e: ( z&c555 jZ [&llc$ \pZY!и\yLq/^leeu̙J<G믿"##u:]QQX,}vnݞq0Z!}GxqqqnnnOJ"յb>}{{O>ݽ{;wjP}ݻwqFjjjAAA=lvJJʾ};Y:Juyy[h+//uVmm̎cَhaaz` ܹٳ{6W^yh{.))IMMӧ!dӦMYYY.\prrlْEf ;tDl,`đ:ܥKUwrٛ6m6RBÑJJ%[,f -x<L&+//W(:tc2|>}<ҥK 4?$h4%#֪YL6˴ZdĬ3ٶjۚ"`a q$ʜQhp Xrʕ+qO仞h{LTȞIҲ2X JRb/X...111*͛DŽ8ٳ'!x<qJJJjkk_?Vqk׮ݸή;wvvf0eeeeeefff;vd2!!!FСCaaV}wb<<<`={2Lwwȁ{oX={I 7xCє8::.]6GG>}@MdzyyUVVF7o z8?fp܍ٝ;w|||f0:uvݻsgrܸqbL$} _NFEEUWWu>�ꫯnګ:mڴΝ;;88ܽ{W(Κ5 yFϯ*d7n\|2VB!ZGe'd5jWWVE }7j? B+++vj0 2 EEEUUU'O<q͛7h�ԧ!!9el6[22TRFHR# Rr@d2;w釛7o:::~WzjCUny#- B(=nj);�P#:uTXXT*ܹ ̔JGBmOss󐐐K.}zv…N:YZZcƏ_WWt!۷ډ'FцièQd2Yk;{9r$11("Ʉ+(ܩpT3.5`,Q(j333''`kk뜜Tjmm ڢ(Aj4 {L�KpkxBP3 u\:5B㣣t邊G XhrQjО ՚pn0!B/C P bީj!!deeݿ?""BPXXX_>^S+7{{5_e$%d}> u 0|4� lʀ/fr9O?D"PGH$򲰰٤ALuH<$Lӄk8o Act2t+Z;8h0xlK\^qvFe=@F3 /OFTI"`i~|>JDeVADF9 1F24_ 6>&i _r]7Hrp8� �|>֭[xrV <z*hZ8@Đ:tO5j��P"@3L|~$4BZ�� �IDATq\7!EjT9OO7!�uzX\0_TdBze06衶bA|{Z-t_�@Rvfff@---|,M뱊q X|kanZ2�ңzLޯ9F[ '0.nQ֭2~^ڄӴ*3],Ir42��$\__/b1 v BL&ġ8555XéT*߄ iq} aRl(F}- $T0[٤ 4$_4i7͌L7A+((xK!X,fcc9Znnn+?wDMPq e @. ExVXic5VPp:Y{2X[[+ʢ">occ,Jeii|6A4s}d2&pv ʬ(~{:Grf(P0etBMk)AmX+b rFl#JJJܞ|ST|IM=z]vY1i$ 1pXbb<b�nGjkkM`L,p\+++* ;;; ;t:b�(H8=AdkܒZXXH[�=5p­kLީ ǿci6tQF36%NпC$ 8w,r�86�3=-,, : lS\\Vlmm E}}}uu5[)/ aUJM0?1HKңp&2 ybcoH#}0 " a29jܕMҪFQ+zRF&9&3ٿ԰ d0}klt-7J34 pZ577xB1Gƃq dx<2O�z$d P(d2"rPl 15!陧hAM=k!4)Y� ?HCBrTtrϿiMkom| 9-w٫W)S<)ͩ,22'n5aVD/۳gXL1D۷?CDFF(í[|}}###233/^ٯ_?Hco+xgϞ"(##~~~W^apH==zH$mݺ<qH$tˣ"##uk.BO?u922K.555ovDDDXX% }={-9sfUUUAAA@@�nkcFp#�- 89� jDgjkkbL&J >%Jry]]]eeeQQQUUUiiiUUUUUD"4(I#GAҐS� <1S(:JJLD_Z<hb'|2nܸaÆB,--Ϟ={:88;v' @P?~?%%xzmii9{l(;v B,,,(b Kd^v-??ɓfff"";;;))�oױcbcc'Lp BHrra[o[o?ɓvvv3gΜ9s1c&Nx%{[Sy𡥥ftϳѣG;usΝ;w.]gϞSL9s5kBCC{ィҥK7oqF׮]ϯZn݌3n޼ =33sʔ)Zb(|H1p 3c]]X,J: u:Qe6ȤYXXpx\nQQL&vW(  Ԅ0-( �Z aX35i4EWۆnN0a4tЋrhaFC ͹Ƃfd'+;w~-***aEsȑ 8p`Ņ111Ǐꫯ/^\\\x⒒CϞ=;99 ?ӀyXbݺu6l|g777|޻wފ+{=|> =z@)vȑ}Ydd+n߾=z;={Ç򪪪o>zݚ2eΝ;<x2f{{ƶ سgMyf@0}={,Ve7P�NV4ic_$$|бPh9!V+++!T*e2p۠󦶶ǧ޽{7o,((~QQQYYL&Hر#p(mVQey3 E4 K9A7P7P G5)ܾTzgûGx<H"h 2!gF3lp 'b3>|kۗfk{NKKjV:tЙ3g,X:a„ǏWUU-[L6 rBȑ#G\ٳbbb,--g͚qٳg0ffffWСCBBB||СC_AϞ=kcc3h ''g‹|T*]jѣo:::4?VVVqqq/ٳojժ)S_oTI&|֭;|KJJpÇ7=�999}ٿ!P(J�k׮ۗߤ6BtC%V8dz�e(\tk=AMQ/clԓџ 5uB7\Bֲiަߞ9s~sN0b9C*^r%''' c޽Ν;x`xx{ \$xW6,22SZjc~w//e˖^t Ĺ/]/@a.<<?rilmml߾}KT бc/]v,kԩgϞoi.{||-ZݻW]]/QۓdzB)žBXfͅ ]|>`2dP !� 41IT*@& E*J\.Jkjj<x H=z?KJJ Ī f4͌3(; 2a3:�~�ÄR4>5@Mc!CcBӧ-#ssssssjaaa3fXxRY[.\;pٳ ]:tΝ;K.hB O6lpЉ'#ÆoܸQXXH+?~dffBp.ѣG/;YVV+ o^ƍ{PVw1775fff|> СCW^5[qqq~~~DDFmh4b R=͂UP(awiA@Xs>@IM \.W(rjưHk|>e6?zypL>xbH�7-�-P$n#!jK30Rr\.mH|iÙn ^^Py= O |>_Jׯ_rrryy9)F- ~m333xwމ[|3gBBB?nܸS`YvmHHp"/_e3fO/_ c.\gfҥ~~~9s&~Ν?pnݚ5k!$999??ĉx\V/_s}{x7n6mŋ|͜˗;w677?ydJJJrr2>mh1ZG&sh�a0:,J\*00h`H1:h 13F-[# BT�=LM|{g^^^ʒ%KMFѣ$4u鉾`СڵSTÆ  )))NNNjzذaVVVk֬u!$((ߏ~^vsssN%BlҤI6lذ; o>h^b�>}: 6lX !'O~W[\jU1ϟo666|D0#Gѣ!dϞ=quuuwwWT)))nnn۷I@лwơClll_wZ`B*ba[IlO`X4X@p\RN_.c?&-rhDlhjph8yͪ Mvi !¥a^4XXXՋ~LB$'|qFLo2%=>Ir'йsg);I4뫗GyZ4FW?PTл!z27{&mmm [m5O@X�Jp`2NWmffV[[= JG8 A* D5촴(42HC!8PCN41X4@OEԄDk,ts2,Bp2vϸHEZR?^3%߿_^^&&؛d&g \B'BT@ . PAy[ P!uƙ�aPH( @&� /h tAJ<j %ӆ/,L{a݊Mˀ ߱cG[fggy9t~K\.?wSFqnp{-! )Hc�G6(qrj6*B�X8r fN*�"UVVbG6"#0ȧL$ 9m^^T1"'½xk7ԶA i+GIe0 r� hz10p8%cDDJ/04#6IaCsR嘩_A�b@ѧ$J5Ң�Ɔi1iz%bNaixDLTj%3AqKOOo ZkkSE駟0wwV;/Oc cŸ.Q� cQZ^yXafff%sh$aZj)FNR) c 7D/4@E)6La^6)|QpҜ-`؛^;6z6ƀbg]*,,D/`^!$:: '+t:]IIKЀ)|>_.|,z3WF3-LUǁ@io "FЈ91Lj�BPbB \D,b2Sbe mΜ9ܕL3`.ajr07E1>ecBɴWTUUUDAU*@ �xk4ad1` 98#ˑ@Lb3Si6tf4ʡ)sӡ0V:#״;!4] 1ycccW!":;,"y9t9&3ٿ~]ft:333@PUU/8( f^ J�CN`UUUc`&PՐ�F*pb`MU>ih8Uũ5Dg L1J¦K2zȁ"2?@ E/BB_cxEFz9neooС6% b{{XYYףGԨD^^^ ۷ڵk8/'44~?:v١C㼜>}ԝ|𡽽=6f?~<G+**77od__dddN޽[^^޽{yg߿cv]RRrbbb>|'ӹ@\.d u{H(9 EqHXP(F"�!([ZZ:::Bp`8F,N<SpBΓvww^],2!&c.Q@ 4�;[&{Ή5Xt_~! :4%%ҷo_'OB|>gddTVVeddDEEY[[tBرc #6xବǏ>k:T^^TS¼S⼜zݺut(ˑd+W<wKRRҲebbbƌ3uTwޖiA߾}srr322Q>}l޼yΝ~TTٳq^μy󢢢N<y%L߻w)yFXn]\\ȑ#of ?wo&JjjJ;\IMME,^~6rGGG??SNABGJ8guwpt zN? UXXH~rоa"k9sUXjPc1Hq4nvhi=FцNvtU:LYZZ#Z@h0W䀭]6**O KOO駟4СCW\YSS7iҤ~;x`ZZ'Ok׮[n^| W^bŊyu%--m۶mQQQ.\Wϟjժ ̟?_߸q/&ڵyyy ,q=`ƍԩS'L;ٳ>ГNxv8qĉ޽{ &k׮-}}}qDiӶcqU瞻KQYNLqf82 JEMIp$3WjiŹ9r8AA6=`e{g888߿U+'f՗_feX.Iw� T :Q:] 70;ɓCAbx7r,RN`0XXX@L7c?a?ƚG]J퐲cu}Tr&PF:�ǃ?"3&ҕ7!tVZ=z488{Nh4k֬ fY6!!ի999~~~ B<ܢE4C(J^-[lذMo5m4 EBŋnPLuvvh֬>;k,kk 4ds裏;vغF裏.]gϞ~Ç4gxM6%%%L=4P8�m0R�,`@^i,$ E9Q$2/A]l%B;HII<z>4 JP ;@yi Xt@1^jr/_ ?~AVgϞ0`@IIIϰZ?9eʔ{G322ͻtbcczQ1 ~Z[[wxEg͚5Z*//?p@]xyysƍ</(((==رcf:t_'PJfpȏF6ph:#PS�rt@�M@NcT*uww�V|>_,DϷ^�𞤤$\n �\ [f`1u5GjJ%mK=0eՌ j¸P(4*񏭀^<bM&͞=;,, P(۷?~68lݺ5>>~Ճ Zn]}&ܸq#;;{Сx8ڵiӦ-99ѣGq$XÇ֭C{ǎQXT]v2_~}РAǹXT5_A:qo "hV)nyaƃ ôlrÆ ׯ߹s'5A۶m1޾weX;V%JD,X75A YQϮtb9A~lUє- tD` Tg+٭>'MZ-k9Rtԩ !!!ǏOKK8cǎV&Ϟ�� �IDATu ~zHHHhhhJ;v8h BHXXO8Q sNHHȕ+W !'OzjXX޳dɒ 62a^^^:t(33~NRYYYL&OyOO%Kǿ:udG8q"!$$$رc'OqƉ'&O }"^y�K@G> ֨5iP*x\zCZ?DdDܓCc0ݻ?vx~@PB(!w=K.uNM毺'j9;v<s挳',… ?`�77sIm۶󎃃ѣU*7nH?~<T?~|*w^t5m̙3tӚZ-[9r$Ǐ&I:kc4>'O>|x闳bŊ)9yd}DDȑ# !| L֭[ !M4LgΜiڴiӦM rY˖-bq߾}Ϝ9ӲeK^=XTF� 0qeG~herѣG!4�z+ n);r`J  aMAR)!ZH{V?c"133C&f 1SN۷oڰaݻw7oAxozI 3duČ<4Ցl֬Y" Qgggggg#hB|(ʪ7 i/666-ZB/=Xtc_)J�h a)6to p GGǬ,Ա0y/y�JHUm�{ ,x<1 @ 7^P(bq+hD\&IgtT 91tಢ<gmm³thp8.''V(�#d6t:Yz5t4 LаPTTԡC`9(࣫&6#@'< BH sss>_VVVf�tĈ5ШP@Zu0 Tb SKTqKä^2Wڰb�Y$&& T .3)Qj7LCj�0 zB b3}LE^LdTcKSx90 6*Th4 3�q]v}kѣF'ZAbj3恾}  AŅC G4)G"x(7@5zs.??P0^ѽf2Bd2Z�U><O TgՓImeV{(D¤AoTSLʂ+ؼ;^WoC 4yB8yY8s+AkeeիWzСC^yť=,ZЌǀށn_Ȅ= WNxFV,x֋D3fDGGc)heb10 =:HBTb7 D@`�VA ߌIKO OpW`$I>@ɁthSc5d0&0`MV6mO\ؿV ''ť!T> , z:J5c 1�ayf!FFơCm7D/;H$5t tɐ$ZeS|#è61@aTcɃ3켪3i0._񜍓)8 HmRh"f,Ǵ/ D!Al@PYY5`p )xIyy9;vF!c5|V&>1N~J @<&@5Ǟ]WK\)Lп=!Lr+Xm+ A#,NDs/ XւeYgD@<dG�ǃ @ 3 �^= 36r[ qpك>+Uh;C�LFWBs0 =3p( B17 vބr8O0 ӳgd+t3d~pqFx?Fwwx@w?8 l!| #[l`_ ã+OaF6Cih[<_~{ܬY}nٲvAQQɓyoo>(??yߠj}`ذa͚5nl7k,33<""_~C2dȃn߾ݵkW__ߞ={]V.]gϞ]v}v]c{Ν=z 8rq<==vϟ?۱cÇc=zx[f*//?|pǎ}}}=<<Ο? `* P+ :�@'],�.]H?K�a,˦`3r;U@ʞ2N ;A+"A_Ї㜘a kf#\vo9r?ܥKwBvo/=zB|||\\\ݻwQB%]c877iӦ ,joƾ}L\ #G۶m{𡗗׉'wҥW^* e@@@IIIAAAQQQvv}rrk s?]vm[ly뭷Zju۷ok#G\r_xܹs̙Ӯ]Kn߾NwW_}ջwoRw};w477wrrJLL;v+WOXb:-)))99ҪU9sfΝgaѹ Ι3gܹ۷_x믿t?3 >z-[ 6l̙0W@cDw;`OWFgPuAeBB@ NJ<DU JةVn)FA:x*AlZe)ItMO:% TwE녿W-s-XԩS r|ʔ)? ]~}LL̠A<==\8pȑ#֭1cÐ!Cr96^ܹsΝWZo`͛7lذAӅ'%%%|ͮ].\0s7nFGG;Ϛ5+00e˖ .|^q_>ydbbݻ Ç j*L6n87s̐޽{/X`sA;4o<<<!C@u:F0# x@4D[(�dax<xUBM+�0_ G  xLU髜IؿVPz``y<=Ǒ4 S$ aqɉ<O֚P(R@9+,,| AK;jk2Z^ޫJ^ XNLLL|||Ν۶mKIII }j… k֬UwY|}Ν;wݽ{wʕϟ񉌌xQ_??_O>|2|ya׮]/޴iӀ֯_3dȐ$$$nz<qℯoZZZ˖-t0ѣ,Xp:b9"}JJȀB&MLHHqƜ9s5k{n|0///---22cܹn2e8vٳ<:H0@ T辅_u:eBTRDROzD:hUŹ«<BшD"!4Z-ܠy 뙪ƠI !iƲ,_ ШՄ| aPLS\$Wը jȄx<p һi4amܹ`X[~=!ѣ[ \ܹs:tޞIPTTT�)))'uk׮ !-[P* ޽{ lL-,"'q*;_NcD )ku:eY>/mr |>80|ppC{m@` DRU/j�z=c8Ex/XV0%2 j׳`2a㱬6 ܓOji=2ߨxmrmh( 4P} 4H|?|ܹW޽{wĈx```XXƍibyKϨc#Ǐ߿Q[nmذ!>>% h6Zc ={_~7֭[7X._{ @޽]T+rv']ƈ`.a]x+Et4&WbJ&4i2cUZ1 r(Qc>((Ȟ تUF(Mz6-&Tl4]ӈ|W#OhP;Vgi5ƂW=Oa{5鈽 >tPddo\\\IIIwN6m޽iii/^ܼy3$㏄HԫW>/:kӦ7|WZlٳg+Jooݻ/X`'NLIIiwNHHHJJ9rd||޽{_{ÇWTT\|yĉnݚ>}m>?mڴE^{B<==f͚[翌[`'NLNN%>sҥKgΜyAs>}#GŠ}}}_{ N81==^k?Ҍ //(̬~Ju2pUKKיݻ?^P<x&%**77I&++++..vqq‚JT*Hf͚jWWגR777J S\\ 4 &M<  t𷝝^Ά_]]]5ͣGE"mmmmllb1/ڵ0"ggg/((P(-[Y#ܿfffrfI8tИ1c@MH$͛7/((P*NNNyyyJҲCs NQcǎ}u qYZZZRRMޣG C666ZklŚ cǎ6%%%999=zsL,`aarё#GOW Fdǎ y#i 56Z @+�DhГ,-vvvvvv/<aj|3"}Fich4Zӗ^?.7!$%%ecƌi߾kxFSdcc{^n�C̀u .joSYYiayy13B.]֬Y#˓,YokOsνpՊЯ_~=SJ?0(&S@N>}^3: ܿW{ØN L`b9/}1Ey~Hܹ&h,aW L`p ӌ&0 j1o.]4H 9o0DgbF`qzp8Q=R#FVCӰXXX`݄KKK33Zovttfff<(Pܼg zH$rD(J$z@Z]YY)--- .Ԙݰ`ooߥKTjTqܼ"frZZZ6ZVV-럘WhjffZׯ_۷//vp5GGG'''^/NkTsՈkmGu>% /^ҥ !ͭ[nM133sm"? )F(I D6m4ґPļ:$''nݚ+7&0 L,&0 LPOy9gϞEW^Z}@iiiRRRNܹ#w~ڵǏwrrСC/Kʚ7oޱcƹd2Rtpp@Ǐc:/:˫1 RӘg_d{233+Hj0%%k׮fիI&]B??ۨ?͛իWO0rʃ|&LtFɹt.++3eS,\pٍK4̼yiB8㧰g??r<Y\\l0ڷoO?}iӠ}DD ܹs'**"mFY~}RR'|7<x0112&&fܹÙ3g.]ڦMSNmذaٲe'DFF2eW``!Cg͚eiipu]zuӦM>9gϞ aYY1c.]hѢzeYȻ8p ϟ 3l2h:mڴ}޺ukɒ%TZH"(ʴ4WW&MTTT:|.O>nҤɚ5k~ǃBf̘A R"㮮ްa!dΝu4-+Vz*!?|̙3M6I;v>|ҧOO?ܲe ! 0^oeeO?۷L'!hBv>}s۶mكIUTTTHB^bŊYfjjڴiF>|ɓbbb_N:th~~~hh(<uֺkzTYY9f̘?ϯ|ʔ)p=..$[ho߾Iy===̦LuQP6mکSbcc[j5|pRlgg1vm۶-[lܸq([={ҥK4B%%%ݻwZmjjŋJѣGo޼cܸqIIIJ'ДZݻ[ܣG<8%%N:qą gϞ3gNllD"ycccv7k,666%%%88Xέ[\R^^^PPPQQ! 222lmm\RJccc.]ZTTtͣGΙ3/$$d[l LMMmҤ{W\\dZ>|866Ç#G9Yn]llԩSG|dBHll,˲&M:yիf̘l2! 'OO?zCh4bxĉ #G /6n>|822LLLܲe˔)S]Va]gΜ?k׼IB SN=zhVV֥KΞ=[#۷o?uꔝ"L ѣw)))9}tvvիW^.]ʕ+F !u$C�"&$$| "66VN:vڲ2L6lذz5baN9hQ)))usYRRERY\\P(Je-V^H<G7o\pE^{5R&%%<~ؾ}PZ9|ݻbH$TJFD/_޶m\.OOOW(ЦL&9::J$GGG rNWRRc'{ڵ+t7'p]E6˲;wdf߾}*J.۫T*BQRRHRRZV:::Z�5koO:lΝݻw/..;vرcocҔJ%,% P(222뵮#D"GG-[ٳGVrIUDF"rҥiii,˖TTT "ԈdVP>}~ZXXWL" ׮]+4M&M.]Եk׮]-k6l`cc#juIIIEEEJJ iD۷ɓE"l/ ǼyhߧhѢAl߶l Y46o|޼yM4ifK,xW^ 瓠(55uF\_ ȸpBdd F9rȘ}Y膴www-ݻjUl�� �IDAT-Z7o޳uɓzd{Kaƍn i#j̞w]677={kRRRUҥٳ nݺWjuttt7_v.l޼m:udbfٝ:uJJJR(AAA|ͬYFm۶3gk~իW@7{fddV -**<yr˖-H~Iؽ{ѣǏ?k֬gbmfΜy֭>И?xԨQIII(DĠSB6mfϞ5HݻXbǥ7\xqѩAAAǏ_vmЂZЪUٳg k׮/]믿_P˱m޼9!I 899YZZ P(QQQ.b,ǏD۷oEDDJ$My͚5Fڲe˲eba3aBCCCsrr RMּys>߭['Nt֭DPٳFVɉaT$ !GNOO1cU[JLiѢ NNN{7o5oVHB-ZܸqcǎD 0 |>_"E(V[\\|#G6kl˖-f͚7o ?~رcaݻ =Xbf >>>Ǐj-ӧρ P^^&MFDD_~ڵjm BGnj3`ݻw;99EDD,\eٱc~'7nt> 񂃃Ǎw…' 8::b\|ѣG !OGQt7oohƌ:a„})C2@YNNNd߾}G۹sg^^4|{ `ŀ޽ ?CPPo͕+WD"iTESRRRMcCN8ѧO eEÚ1k3gtE. 7,x#JU*U*xsر{O*''' 3::{y7X:a… Pvyvx۷?S[nժL&;vXHHE L`Wd2Y||}lllڷoHrf`b9&0 ^eh۶5k Unܸq$G#M69M,&0 j֭[n4/WWB>|X#rrrʚ\^^Hٍg!BP4*Č�ƥ鲲2C7)B 7:@#77j.4@nnn={ JJJ �UR5'OAfFFh42X`P(mgggee|>Z3IQՍpE"F!hFE=<<�1L֘Y`P*a5o\*617GGG䞿E L`&xyP"֊N>]wj @ ۡV׃aܼwhQH$|ץjAnTj<qu !55533<7ߴ777mQJeTذԫWF> Hd04 q _RR0LczUo0 P(s:lL  >n߾m09{et�#^޽;82 HޠNyuC0u5 L`ԗf&0Acg9zΝ;ŏ=6Z3- }p޽zqpJii;wt:]sÇCG8˩ѣG\\ܾ}?Cm-rM0wwy;Smmk=z[\xqŊ5 y\o߾u 2dHB;322m-Z|DŽpm655م9rܹsӦMG;v쀮+W|wf͚UOo߼y1c:v옙 |ܹN:qDdddnn/[ Ǐ믇 ^YYY?</ˀ�t(7mڴ3g888>}zYYY;wD$EٳgҤI7oԩP(LLL$t믿^reҤI#F8wd5޽{ЃR,GEE7nP*[n Iͅ6<oҥ_~ʕ+;vJO6778q",7 y1BH۶m~>@ww~~b;wʚ?T*mҤ ˲p !۷~G[fffBܯ_bzO)7l0I #FtڵFzm۶i4wuĈ666:.99_zIw_z5Ӆ}2dJ-A5kVQQ֭[ǎo׃lxuҤI{f5"iccs鄄B;?y$!^o0-^-[,ZhΝ-ڱcOqqqPPPffĉJO\\ʕ+ϟ?Gh":9sfRR҄ ^z…ŋرpHHHXf_T*'NT\\cǎE%%%{d+WDEEڵƍˋ1cҥK-PuXlƍ}||***333+**9VܹtMg~qqq7|3o޼9siӦ}sΥ{%>}zcǎ<y_&M#y޼y[n֬@ ٳgl$l#G:th޼yڵϧOsN񞐐qk׮}gVVV[xȑ`88[n)--Y?~\.fo~gBk׮+W=|088g֭K,i׮]&M$Inݾŋ>v,ɓ'aO>}ٳh"w ɓ'׏󁁁JӧOرy:/޽;-- hTv"""@b�8yqpOnu֬YgΜ6m}||_,Rwҥzowϟ?SNOBʕ+3gδݻwtt4R?3$$iӦ={z>ٿܺuKI$4[[L0NV߾}iҤI^^ĉD=x𠤤{<(++~ٳgT*]]]322ryZZZ-x<t=4h2dȐ!3fHKK8f͛,3g2򫯾<yӝ<$Wَ;.]jggQʚ;wn~~UAAAJ9[*˫e˖rzyy 7ohޞwС~VPV_v-11q111?ѣkt)~mmmrrr!#//EI[n Z6,((eٴ4qqN#""E"{NNNYYYϞ=۵kw}Eboo?w\Ύ}#GՋ^wzyy5m^^^ZsNEѣM6suuܹǏg+Vܹs{^+**o֮]kgg'_[o\2$$k׮`G!XXXxyyٳG$߿_R.\o߾[>}_nee/ܹs·~lmmKKKяURRC ܆7  HLK_}եK<<<RN}nzF,yJ- CP,BrU2sz˦/d2ܷoiӦ  so7b6lr;w3lBϥyFHLL?BCC-[F~̪:FEElmm4˲rFeW?666ܾ}TxtuX{FO'S ?߿?,ݻ#F:{7oD~~~~~~QQQ^^^\jM ! ,(**Fo߾f͚o߾qi9F`kkkmm]\\w7cǎCū@R+I�Ԥ/ŋ|>? �~6lX^رcǚ5k֭[ŕ[i%%%?#ӣGmNh3Qw N GG+VE^ҷ={fdd믟| }i52͛77x_eeeddP(ꫯ =7o:uƧ>etŋO?>yu!&&=>>:effvq̙3f�I=sœ###N:iҤ'N$%%?%K?eʔ+WVӿ kkr.]h\\\\\\ϟi&oo/{0v^zGGGcڵ.\~zuQ433۴i۶mlٲ]vy{{k4y{{B'OʲA!;޲eLoܹsҤIn݊n۶mtt|>0nݺEFF[eݺuO(,,/m.D~Goٲe oѢw||ٳ۶m_ݻۻ/ ̛7l͚5c[رcdddLLL&[zСC}ݙ3gG}ƍSNAKcOO &,_|.\EGGâ:999;;GEEmݺU$ڰ2ShhիR) {ƍ111ݺu5j'L }m ]}WZn:;x`ڵW^۷Y``K\8;w[sΘ1cΞ=;bĈ#QQQݺu֭[PPВ%KLt~<z5vبÇ.٫Ww>FV|qjо^рh(hAPk_towFaF hZ(<Hfdd|77ѣG߽{:s@8qbBB½{`aI `ҳ\so^o*<<<U- l%~NG?KtueX:85ڳس <ok؁4pJJ F???0B` z^1 3SgUAg <�a>3t:P(4 5" tP:lذ‹/>xrRfD�o]fkko�H F3�Zua`;0/vZH$zv'=F 0Oڟp }Fsm66 Fk@#5"cD֯_I&=ztz6aYm|?n S5cF> XEZ�sP՗ !C4/֛N'-YuYz҆Z4ڢϸ?kwEL]AwڥP(Ə:jר`…`8/ۗ_~ F&\rϞ= bҤI Wd &C _>o3 qhڴi=oVVV0sN+))i@L0^Ұ</Ѝ7_ > 67@ h4լo,G,;::6mp!PaZBVmpL˪޽۰m\.׭S�,2USYf[[Z o _|>(k5jI3 L`.!bI1 L``iiٻw^xcƌo+`xU jH)@` |||zu֤$4+^ x\a7@Nj8x !]@ՊbVh �# Q��ja8p>q @ 2@,kaah �ῐS9l z=& , jZHx<^,+j5mm|UJu:pLp!DB|q@ 45H=!^(JҼ<J%`a, |>L@ 0\`c`BS ) m [`h),1 >mFWv_! v8o]L8&6`*J>�kZPÁ;q-�1FH<o`:r0feYV ' }p`bLD"QT*`ҦM!zLkc!`9r/<L~FWVVׯ_!!�{тW\邜,A Oi4Sk42=x]E8]-xi9 az�ly'G HGhօ 1$e8H!R2??H L) &ƋΪ`P1-d|@ Q,B%8Lp:zj5n]0Xʩ eIB!n9~0cX9. B!29\ސHd]բ(E"ϗx I3E@� @�C%3:8"j6  b<|6 C|Z h4@㖆;A]GWI D %ʴM#RxjvXYb +βpy<g*U*J(|0o~ O!t͊ P(T*x4 B'R�=M a|9uxDCV]þD(S2)fÙA <~E (!x<R ^HeY333"IgQA*MIU9Fr LF*V䑸]Kd 2fZF�OEPȊPtf`o6&FzJ* CgQRa(] w"} )dJ'lBd{(!R>HyC-0R-АFfIem0BtL0 |P$tz}1!b1,kβj= F)p"|F#f@ a�50MS.ԉ3x wD"7� 2ʪ D"k H Oԇ614@)<!D$'eY\D62&{㊊ BDdyv c 6`Ą pQ( !D`�3� Egh !N>phnd@gj51l$Xb䠨2A= RƁOE7?vpPZEDo?0|!#D==FFHHUQ RC?,?a"xѸBo BȔ5rh ZShfb9 gff{rNc0S p\7Ѡelxc?<0Qz^'  B#PV)ZA x@9&Tm Tv:˲)B:yTń ZVNA�� �IDAT%hPEm!;i5b6ԙ�U !@ Ti78hD{Bd0(C*0!A6< %("MGm$Ed@ E"kjT*eFP  KKG)J$Hh_FP`Z(<�LdWxQ訃@=VQ AQbCOP(ŷD!FŸ`ST0 lQ_! ȉA>DIPRT0h8E)0�uinFy  PP&ZrhlJ3O+`Jwn:8H** NA.i0H42owRi{70+hLMI"`" bВh@/o>l|ٳbؾHـ\V\�mmKᨀtÁTQA'~�qzPhB/:do*V9DӂEo.P4ъD>~&!DRQr77777rz,h}x&r}ں LxAqwKGsdђ P uڤ[GpxR蝀h:HaR)bFTA@ N +4s�(ESԊ\.hEj� 5x7o@|YvDbe0UGYMt:w.UfK|~7dtŀ.8 5b Cd mG4NNj__]$/!gnUBd7LFBZ zp LM[a6x߀`t!xZ1Tt5E1T#s톔5p� R<xpMyUa,h^#n0`Hi /ƃچo@8N,*q{VHC@@kt2``~t 7pAg``8-%ph]&t 02na2-!T7XN}^窘 qkJK8U"JNHdK(i%)X D4K�ʈP b.RjU?Pi)LۮI$1Dܙtl%>Nk!`cT 0C/EE<@;!|4@{RBZGhW@-�r &>tt/ B&rځ$B_XXP(b1N= (M�<C& +kˡCiMG�# h" H>7rL”5ĸ|Kц[aj>:0]Bgt9At� 9LJR(@BHǚА<l H$HN@GT"D Am@;ɰ5t8NqZB*F0M8tuju33y78QRy<0.Z#l)_ا=@ {[` 83U*+U&)õ8ӹ58z /u ^JӨ5ZS�HT(^;>̈́4:%^f"\Ap50ɴ(w|9]%(p0\W g=4SH$ҩ$DTkM[� /U(au~,>BƍbQ$k �ho|R &!s#y<B߿}D{eee8^#7~M<?!>Xc>K6Ш' &`0PDzD8.\(\eDf &! #W 渽,;JaYvTqܗ|~NWM,S@FnP`pPzBa3tH ro8R[hB6W,֬1C srTo`C9NdC=~=1~A"!Rh=[h- ptQKm[zmgRTœyc0 F1ZgC`=m,"$aJVw QhmN:&я-kӳC Z#@ևCCa% :t:* [ZZ!3 0 ot)hpEQ #h 튃/ixd^?ʦR0E"Z- KJ )e0qT/y<㉄BCdjִP(I"A⋒ RUp9*Z5&);u#[TdhMюYx 130 2Lmt7CZG+� 4 [BSyzrPDʅ)&^.x3jNK:Ā:\eВ>ZhN)\ц8B7;n?!'-r0RamWV׮~JaM3T|S`0lg":Oۧ1o;qrDF ɲe*Ǐe2H6t JPDÈ Z ?ł fB&Q(IsPQF+]�*ZE 2a\د>_*t aXNCxH3LIU<: d\R-m)3l `A_ 3Ȥ͵-�b/}1 ھXY U'GQ#�UT!XAG:2/D*. B'@l.QT(/Р300PĥH$nn-HE (c* ! >:SQ:ev twӃ!� <0 3n2 XRſsGi3`]T*u,M7۷W!]^ՖřOٓ=vLt.C!7*?\laT_} :6a0*QvX8L:݇N1J_ERpUB�C5Z{) ozt5&-ŽE% &<A3)M,!i&ⰢL2/3h3} �P^,,3ȼaJt-mf V1r˃lv0>ohtqUv BeamH0}y-\M ΁ζA/4:0t:B81e[:e PXY!Z,j5' Іrm G?2?0I0ևhaa9 vhB &), TX@;%fb" HۛM&u:㈍ *+TJElE0\Ӧ4Nm$55577ǰ큰T/gT�>h=ðX � lU$Jh$Lg<&^!=,!? ϣH$BӟQ|'" Pi( DҰ-L,ЁX䑮љtC:l)QeC:ފdƚKP}! rG:Ds9H2#h!i;tQbF0tDcѣyT*#G t@*h΢-ѦseCEH\FB =hm*@Z5C�ڮHG7LEq0  %&ej"yZ=~=V*_rc0g|?={;uR_奧ΩNtmvvvNN7b4](#AiJJ"UXX,z&2AWs sBIAXfhD C '2?P<V�24UpB֩TX-BxXUE"IDR`!&:i.G; h4LxF-~g2"Zq=%snB1"Э(i4 YAFAXx+EWbE@IV6Cmա/T}0sP5Tbt%Ko<%tbt&ōRT``fDNH7>D$(**m}Eş۷ڰ2U+>Pl8{`@&z1n ֬1  PAcXb1cejI8{!HbǽhвtxQMZ9 ~_:Ii L@`diSDqE IGy_!$N 8=)7.ES ;mT!Tq-ܩ.I[2_O4k<]X؊.LG٢:I$]E!(g7 UZ45ULwc4 XV {e`*V 0 dzDB͵B|++13c$>aii03#Uffzz-2�l<cPdZF@,kqVmTv 4H-;peBob:K~:]nq>=B8 a@ jy<L*>"D^dEERL-ݻWQM0LLSGF&�i 0pP=MHiB)h] B{ U -p.ںah bX>0F 3 6ܕ( 07Ou:TBѠ!f*2K<-iH Jh:,& |+WEM/4 PCmЀNˠm4k+U жA4C#X/Xp@n0tT "Hi^ߧxTp<('NTq7wƍҿV<>4-[VΝ.^n/)aFӴr&)lavU2gJ&=CBߗ"D@B"RDAQ"(E)қT!CDB jH2i˩OsVo'9O}kzȲ7<2F ]-R 0Sy�Yv_ly^6]7IitǶJeٟ%IaۍRI\wAQG)˪.8qڵ}Ye\/'k)q=&-}u* tpWj^>EzZqJa# o 4~#-GFឰR)I6_xJT* z]1=pRQ 3 !E=h5xfbE*,;i0b>JLPY9HS~>kmq�_tTT Cl1VVM!-v`rӧA;Yt .yd'&.d.H9sɓ(7NǁTAQr1SVVHSUqimM_;EfhO?+W[Ǟ>g_U*g~jӬYm_ֻV֬I͙S:(0qn h]x-gX90җ]&6V-dBS:pC*lL@5D0 J+l#2UYc~ |X6oD98>oFr+Ncʤ,1JtW_}({򿹹YR$\d٦&TX}_YX5$"*&Hl-V `V1`}hcˁ>€~�܈f\n. hG#2AY  `]H\�fXV;0NsTg :({)3tP5{iYۛMMּy`rgٶѱʠbrdPԉDKxly}rCHM-U `toI>z>$ISϝ9ssŶC|G.Ƅ^qA`a$-͛V*x-Fr%[o;XI1pߦԗ|^'&wz,s6�3?`,c|/'з3F ۩ 2M<㏟>}QG;k(eZ@ި ZZZri<ظv'O4d,؄BIrj_LBATh㒸$\f�! ':ʼ HH]7`qx&r1LF&Lo>cq|raX ˰|ޟ5˻.cxhG?rn,�c`r~8\!DXְ?XBC;8bث١U__?~x4z;̞ǎ}cDu[ZZ~orR2j}d2?ɈPd2X<_" 2#J'or"-4t.c1a? ʘ?3 Z|,v}'/>".1Z_|#3еcq\%:ݼ/=zʕ+;::vŵz ٬4*'4jSv;KG7鏐ؚ+Eck\Oóc2M,K呫SéNbI#&tC+P ]?abr2,5<3j(1kwK>PՖڳm[tw<v =7}晦e)*̝k7;{k z ZDsOL. 4ʘh A`j�l� ;N6<޶'GfQmN:bf CnR_dm3͝$ hg5+֎Rjɒ%Wް?</]]]K,@AZ)y'!sP;r͊zT ,IF*h$mmԆ  B6FT�NyҸW;@4:\dn^hQ{{;)9Ra)*yB<okkcyֺ@ acȥxb8 ne[h: ofE_5F1"'Nw$V ?ۻI ‰ �OC4aF)FC o̳)Zva=VchWr~ {ߋ$;Oj-7AZXv(e?ؖ"fg4rtccc}}}wwqs|ǣ† lcaai$TZJ}X<&\jՍ >x0Jh+|RAm^Y[6˂bi`'X#K!6 ۢ3{e4yV r�r|(r[HkH%ۖ&ɏ׮Edžq9,v!)g2`}ȟ@D�A[J5DYhZOE2P8$b$~l ao K(ڈĐiUVk*%vcD rњ5ҥ{UJ9}$ie.^6ٸq`W5ׄŢJԝw:ĩV['%[\h"p; +| Vj@pԄ׮>wuu]7z\id2:}}%K67_r]رckkZD&1 wi=sժUNP`7HB>\./_Bפ4bly &[ȁ@ 0Iw/95e ղa7R y0'AR0DZRj3 7Iިuy~&,(fsAe72Tm0ca޽uuu"#p Ͱ,"Xcq~ �7?bgp�� �IDAT'YؽM8+WT^alYX^w6 YvԂv+I7$A+4y?8Vmg~󛸣#E 0R'uPR0[va%grD@y^gH<H@;,jhhhjj"J˃#"Aaz.rܘ1cjP�'y޷<_b�΄P%cU0ۅ=roOVFXM2O^`Cdu ą)wTwd.翢.M@l% P0dtV4v&r1'y+F 0 E$΀3(`R8&rm&G6P1^ ؖY@`ܺc.5<ZM2]1M3}]RI֮MĐok+Ӷ.~#;ٚʙڼ٨ (2A` ;\? 5 VT*V4.5rs%GG)UI$}<L&JFf88`UtvXq\,=7nƍDZ](>vgC~Qر\8c-#qDmsr ō7.(UJI&Z/ypE˔шChW|~9v ,|~`lQ0/:DDxPQbu0_yU?O{1Vjl6'JRNm D*Ͱ ڢ(Rss�T\PYE"&Ѝy꠾#{sI5Ŀӈ"x0㮢)I+[sh-CSq  \p0Esoj mMMMReDn4iRT7n\PLf'V>짟<Uк0\dɲeЗ#}45/NfZޑia Y d%ICy 3!b?>qi`Y +̂CŞx |g FH[v5XC|~ܸq|^6u�, GNP}0ɓ%L2̥B*"6ScXCe@p@wDMיnla4$8؄+*5X^9׃22S%n7� �sq Vث 0ϯ-0 P-"Ƴ3n608ȳT*?dIVI&577$iJ1'~Rvar,ʒRڴiZ}e; 2 N�fyrSh&9[0bHV5`=8ꕬ4 'q8ۀd,=�eA644078E&ڂ4q,PkY6PR 0_vlO"HӌMưuw,1T\Xc~0n,rlmۖf{NjKBmy3:RFL71J=Q*Jg2`}hNFpT:!0C80ʣK,T 1Gh1/ݱkQ *BfX@LeHeL~t~8$�2 C+eә PjfCu:۪aq:~/}eں:Q۔tU@B㕱MVi)3JL4s+uGtoģȊ09 Ad@l ?TD(6o_*k4gQ!3:xh@B#ϰ.JqXƉƒ~~Ezᣈ<9 ᬽ �d-&q{ qQ4fƏC XP(yf:-0r]0U**ZSADJ� X^a"(x@1 z!;S7[Z 7op<1 eOI,\btj9eXұ E\ND$5HLȄth _pG/hgg3g{eqvG$ɨ_O,RiK(, ӂS<cMQ� �^ u9(۽.5O.F$ͫGEҌi9rN�zP1%\sSTT00jhj \3(RZ6*"Fݲţiׇn]P_8a$Q$irj5IG ca(V$F|uRu]3I -9qi|b)\7s\DQJ:Vb 'JY<tvr0L&%cP ssg0(+1P2lljyB.`::%b2"g1c4_?qҤ1\#8瓽2/ڵd'˦vmJS)1P]]]{{-|W }!b -p6 oO15XUsшȄ0)e56.qbr`[#g؀5d%I p[_lWWffbaV,MBz@e[WPaSV ItYX#l'bzl{~Zx^sgyJ4W.;mifsRqoEGF}tR�."#`#L>UM$`CCy]]]Rq" V˪J,r% .�ցzX pΡo/H@j5![8. b'!Cy+Qa'l6[*ϝJlCCvm7zŊ[n os?So+8&9Ʀ1<j A."Ւ>QvI-RMϟ "5wE!<qJq rtu2ؠ5y<@Vy>?X Q$G QOzQZU<1' Cޕ`b $ĒX.C#!M !A/^>cаi6eHA. jʮNdmSնQ*)L&Ieٶ=-견WM3Nv/VUN{ ê,2]M%MAB�6"l6o~3.\\0qfܸk^|zwfS_8 TMxLk1;^չxz΀\iTJ>N奏3f ;rl6ظ[oV-r /lΘ18v~ĉS֬p䑢`YVPQȖLǹ1H<�u$ ).x*kzKa*pN�F9>f<k~x2.Y2kRiG-x,^1(H" fd%I]n�0C!l|!0okoH"jD�H5F/>b߮B٨M =SL(0 :CJ66A` ,,Q@ Wsȸ~]uR쒥ɶD햖3\}ӮZ[nfJ{y3ӟ90#_L_+O DL N~'i0R8N:C~HjyBN0Fqb,VJon>{륫0!7N+JR|$J93gC"b@X~Уe,� n/լebmlJ~XxXܚ|_w~Fabx] ٌlh`$x|Bpŵf%4t! +hhGcHX6m-IfshM,`ƳJ0l;Lݓ$E'ɿgVl$"RxiR qXutA`j�%P`#+-[&66|UM)BԤ PkcVJ\[)R�p.*fL5JJ>nܸq-_Lb۶�Eɹ"KIk'7xPtU@Suݦɓ'O2e'hISS|oW^< >׿/66rjX, ۶b:. 7nNj(`95TR.0 (ay >+@R9'vVZAgO&ȗ3=F 4V!ƕQ[pY~ %\LFQK$r@�;6|VF(QODQuzl :`)M j+;048~ײ"2 + Ӽu8߲m4?6ĶAi8V\VW8I,(F!BNG 4Ʀn hCβɽO?\z_ضmg2ŋ/Nv['!՝+*CB0Eь!a;&Om@]xLn�aL',(&x___ooﶛ79sԸqя~d?|f"sMV?f8^^.CjZh<:iG`qX0eEr<EQ>߸q#3CW\Qs 2Uݰ94=dd117rBzglrf<G^&+faP.xsAz|뺻>_%dH {7!7uM ^8| Ls5�ek:O)K~`YVsahԄR8 :qٶi|$)VqlYۖUeQ%$Ex}@M5_ؙ0@A l4ũ*{o梋B,pwᅪ L%ujmmݴiS?/f<ґ c) $OLN;ΘQ[$Z6lz˽Ur>t)GCvBK QaВIrrפj|iPQC~=P88{^6!ă ٳxgެڮIX:k"7NPȑ3_X K<S <ߚu<k$e)\e˖_^V<c@jHxCB-'2G^vmww7# <c4@C<+?D3 +-RPÀ4$0ڥFV bL"a@Z>suϏ-˹pf i'>PH('<4<YjRx'zh&"4RфVA}?ͲB̲&w_y\;3/jF>XfWSV,zl#)ɏ l%eI{_OOO|(C$΃H#;\?m䪑QcV |N S$x@rSCGa\�z88.z"hi`& A?ٰaCT( ENLJ8c9*ɞ;ϛ7oѢE0ZE @?\49DР<EXlؼ�1x[i)-r�6>ސcD^Z͛Jɚ5t"_!/H#a$*l* !AM_-(wUJ ȪiyK'.7N:eʔJe޼yyWWWH̚$9ƖeJ%cM<Uᄸ珣:&ăGʭ>E" !Vx#`1M\)R*BL9U ~jZiU2d2f*hp#Gΰk>/r-5Sj"ceNKuac?1oQ$O}4ͮ.|= J4M IP/o.+w8[a`8IW$- _H<ʄ.UdH=Chr>f~mVR7 D1 m5k4fL@ODox ?pKbTfpM<I-3[bER0aB׳~*t e!tM8@n-Џ? ~!Ţ;zR r3I3aQ+<a@p[.Cʌs#G0sYE+IA/D9CB 2%AT@i`APT{_TCC½tѥIR2ކ섺Vז #h)-N^'IF:iUYAĪ6<oQX| @ yδN L,Υ N_XLj`'buqET'e360)j1H>Tq$ d2mK3I+BA^87n365B=Ql6JHȉj+ @\Qb O(kLE.+X!1ČA;a`CȤ&4r ?U/:35v5Fd. Ha'� j,H[#1Aׂ TD�״@4J` ybQ63/C!wG L0#@RЅg-]0TiHaIv5XH<xN'ٟFNR eD 6fT,vOO2GXHnB5ORj!i%\[|IǻXüd39N4.hN0 C2 "5X >0 Fe nEg,O1dBKOv󄵈i4#0$I2]Sp�nXm 602 :_̈g;j4!(ﯩnӦMB:vjJ,`Ȥ WCTN7fb�B/CrjPj V2ѣ$(7,+I>8I8NFmXQPt# +l`VA:LBQ0PX(N`^YBh|j@28Xn-3Q*J6xZr|vZG֏\Ylֶm,́9a˚<"y-FQډ 3G`|Eʂ)Tvz gf?rpKwST*J풭V܄D#Z0OQSv+C#/;{j1Dc\MA9{ġ̀tORZdjMIdr킕EJ]87rM_lY,(A݀̆C 8FWJ[ ESN4IG>zrSD,E,t:-ɍ\9*3>8{bD0(d5bX*jZJ%`P.hCvH^b9@ H}^ p͞ў{܎oj;<{̩|3*م' ?\,RGjJHRf9/fpvaEKk5-#g8 :kbBٴiRou)if3[I: QRd̋F-TjF|b.# 2)H\ uHp OI͇ UI 'ԩvN;oǹT5roC \ YNDQ~RYfͦMDž&CyD" u)FLO0X3X3 <%:�9 8ewwwCZ4M;S=UgŘϜKJ<=g?jl3w_ҧ^R#Oiy?teY[nIw{iQ-xNpdq)YP�Re ~~!}v?6ID3@$;C ~|0fʲ33�� �IDAT s#@B*VP cRsPk52qѴWDRI.s| TbYF}ӦM{ڵYj`1iӅ n,, k>5X$vI#6N.)R 1rqy_lB7R ,A%%}bT*^WZ{ɯ_U�Ka$RMK<#JKT^ut`^,ַ04׭38޴IMb|I]lY$ώrpڴXte^Izif-('D d%$ZoXZx8Z" 71q|$=5Jo)E ff �q b`v^C5`0)[I`+SQ4ҏ NYuj=yq0]z둌lu){WV&H<|x@&d mQ "IޅWtZI#? *8e@^{<zg'S%Z(J ,(+ļbgg`Յa.m(L:UʧsqRWW>唤XLNMxcT( ͛--a==ao~KƪUiY&CQPg@hqh2�Ofh"P8䈄e]^Hrp6G$RM#@y6Ay(2ڒ�Ӹ夑P嵡sgʹ98qtPd&qV+(^Q4g}w6oyuŽŜ).xԪ6[.3物L֍WdD1̧"`yA|ESP0c!lQrFoHQT*|> pTTfxȲ"&!43.#">[s禾8{fbqqtMNUw)s0 ۼuי--V".� vJnr$xn]HLf`{lEcXXl9rKBm^M}m�]VԶ|M&D{ Lt5zESE O_"yY0 ajxG8Nx;ijcI O6?,&726ۮ潕ʩ7ljIwL3 6�?aAE c@ڸ 0"NN({&oXd!6 #$LÙ:R)Q!Xc�;TÔg9yf`#ϧR%+TJ1Kp>.<,<sj3ʦiYUՔ}? $LӬ<5c 0NQr� =AJ=tNeGj!ω�%(Bݡq$9rƩ3)sb22 sKE̊fQ+MG֠/8N:`JP4AlQ,)l{Y*A찫<oa\d5nzh2(h/;j8PookL`^@y"q\][S k I7@V$@qD`er>d \snYWծB祵#6˥R)PPR)) ===BApA]87Q1e%+Vǚ:; eߏ?^)e/_nafM:*f?,cQQdJI{;2 ՂI'͹ PZFe41jj8a`W!Б#gЗT!k#ِS5!?fi/t! 乘Va1f*J>4 l,22 +2V=xZnY%1V؄<mYV[- a(u fL65GcfV 5T K LM6O8,)A]$V`?IEfXB,XǍ19!⥰ <M.[:d4{ ~ 梄-P4?/&lVD8yKp! >c^%i<,Tdrs'?ؽ7N`W' #smf~eў{&]wasQ̝k^Sa #T~ťL*a48OFdc CY�$<l k՘lb:UM: sjb1(Y S*J"E酮~p@ bּ� Ѕ�r1tڳC`CC-Ro49С yL5qI3̆DN4q8q CUQv 8ѤiA(LФ%R N}g"Leq`b-T\rQXtRJ� |^X,E p,‹*J?d\#E[nm+S7eE}}}ö0TJom-ȉUFo[Mq LP÷S,ʜVkUuuuzh6}:::RFr$vhh`g)v<C 0ed B;n;! NM0K}hߗ6/z<H0a ^ jBR} ?M2t!Kʱ?9-ˁ%�BcGtDi8kk*F dTVV{Uv oksƖzznTG͆Rj<iRJ""kH#蚠QdōBD\&FbGG61k>Be ꁳ4�%', },hzjI>=,׬^ 8rmՄ}G^v($*r,f~l6\9r1Qm;Rxz̐3];֋ՄDž/|Ï (eXM恜 cUPន,Iyi` |T92h),H28pi8PX@<RTf OR4EeDn 5 } ??s1~[eY~'dl Μ,+XԾOvE)e={Tg0ڵr֬J>ׄ uZME:~k c<G@4/TDv"׊!}Rdes ,0_ǩ eܹYH)-xL }<p-V>N\jMEYU.AdLuBGDAN =lfVkcz X6"P. #Pdu h\]C"gl `PA9$Nb߃-O2_, ava4`lh IAwJviDX:jē�Xi*7iz9~g0ºꊾM 4*fO<Q7;=qb8ujYg%I+W\.?ٝO^k/m󛅓Ey+, X V&(;=}ER%P,EQk,{e T:LǮgĕo4Ϩ8jz:Ú{Rڎυh +EڑÆ{<�kh85kgJ @GB3c*a"#Fh(E\[ds&JN5t&*-RYeڴyp�g2P ŀ)X"T*(:Y :Ajk?4pH#bdRh{m_~9aByq[a'ϛ75%QtCvfGMl 9x!Ӥ44{Hir�AiA\M,04ÄHh!L/>,e{H,WN8qu`,nQ:##Ej~ؐ2`Xc= Up%Té&>AƁ;t"N@}Ma)q|dEуnCW,~+cd٬(:*۾<mKD{<oebqzoggjB-  8  gc#(.v#G-6>%�[ӴI@'x>Na<0M˶AtEj7�}*]9ʥ&&@5AKKrU\.ǵ!  7r& JI ͰTģ`HǔƷĉ%3M" v`TBf(g^}u~@h'IQiENq ʲhYkB4^0 0:�*a/RcdG_8$JI Pv•dHMϕ$V΂ă0k[Nxg&3vI[,~855=N]*%Ir]Gǡ64pBi~錺֌7Z: fa�;99S(vaP5G  I2`FךFB}fƔ& BSiYigą%xȉRDžaYt2s>Uq\m3Ϭr'ZZ;H_� uXR.H}y#1N(j,&OqL&dxCюR1qʐ\mEvXOe/Ct 2K1 ! K@uE%iH&\__/ /hBQplrFvF3SKcGacpy 8in$w5Mf!ԋOqZ;sBB*KvN9O|_lW 4 3 g\W*aU iJY@.B!Qjmvi.U4͟hcס\@@^T,!{ /r'' ݜrJ.eރ268xTs H/6M3uՠ~T9ǹf4)ߠ�vQ14a4Ѽ)\>yJJ9[" GEةiVKKi}'0M3QZ'> -,b0N8nV`34и6Dǻ9W"/}L(|G?Iby^s? TElp,eyh]:J<  �104=H\`#]IH)4]*gxr-<3cu,̚L!JU۶m}q3/ 7I&p-j`a5lly$1kZ(vw=$yalw5V8b rYM W e@�_FJ ׊Hӥ^(tS6hƌIJ9sb̜̙߯Abϝk Jݧέ\xaydnO:i(o[ߕY 0%dHhP.m09r"PV*0L}xDwmۛ5<{vqc&sɒ'5`AsUJIR3 .m V#\) IΘtm aIp5fEX`Gyh-%`8Y9q'{2y^j"'V|` ðT*In  N;�`q.u}}^@R<P]'>Mϑ*gyc۶1qb'&iUWO?A>ڙ3g@TS[5ʌu]avXt[/fN 2�M\tL TUReChKbfL8Ә$U).4lz׶wvjA~]]E?T0lHN-_7,Kfy\Pe̗ :cj R,G8_|atv om;3׿(z]4K/UmFw{.AЈ@B} 3L>1=cFeΉ'FQ1MU.{7F' '(@aqlqJ%Jb_t(J/&Cd3Z!+Fl;ǿK9{/&irH!l~$>ҙ0}?jn.sLkƦ$Iz{{ˣ' "u5Y02 rhhvgɘ}#KD*BpR (=Z ;" &ۡؒMUT9 ֥ʕWAun3iےۚeN歷*ScT$z4/F֏i;f(f0 h; gɚ ql$.pe*qI MS딊-K=e{0|-qimx0g Bv$w,X0мmj?<c{|k;}ssC8{Oz B&w\U[(�rQ*?n}C\S>jacq&O60imE~P @ $pv;o$I p\ƣ~J0MC&˒ $I外۶WMUd�>a܌SHH0![A<,k)Ix8Ё/2$ mmvZA ?mZルN܄*>v=X08#!|>'{{{Y 0Zȋ 1}f` 4ZnFpΛo&[mevkP0w3{�OT0d-\\.r]U"YDP2('o`VT*;i8μtsn;Zkt1T*u.w](eu* +-\jYR8,YKgFeYGrs5׭K|%~pbsα7lH8W+#pvIQ;q3g~[)Lƻp},Hԯzh|_hƌ84ǎ-p5wjUH"?sPDRG?) 5pfxYCASe>=XOď'#fiMʁ#ByP(⋎A`(wSS6ժssiIlxJ8#ZU*^$�a ""g, ԂiXo ]vX &Bsd/Fa8o: [нGz-EFg/t(RߟsΝwyt멧X [@s3Yxj:˲:l۶W<wi7FQg,5MǶJ+ZTw}`/Jdr!?X_7�`DZnW_#|7w4M{*c᷾ŕ`tT&S(Md8Z908~R*!#V}=aӧGuuiEFoӟXK ŒĄ IHv#h�QI:" )$ȸql1[)EȞ~Ы؄" %Ir& %㮮.X{ *Զ Bu? :wtˬۑ?R-ԩ!M>`B@O()7%!Cz8n;1W2$_DZHfGlYEI-r@V6+Wn ;$ITqpfl<( &gct1c XR2jMSP6)ɶa֙Qdwv- R� !A_[DA</ øFʔ2@HQj[2 kXW+rVt3f\^r@q"O_8~])Q{'�� �IDAT ƎM]qZ޶=v55Jmڔ$矇YFEb46&6APSevWWSH5Ĥ6Y'>!qI8(ݪUn֘(5<%ɍu]v0؅ y􅨄- qbLDb%DqQp L}6X�VFJn(&i\Ʌah._^yep髮JHՔ~YTT]) Uj'l6#@)^v p 8eV;H e$D�iGoj^~Qn3͖{2qӥSgBg3N}0 k`x1AB&wkh;"a<gܐ*y%v51w�K%b-'QfX7mZxŘ3O83Fe:1пAe=78hܸ8TtpYQ={iSgGce.?g*J/T?o0RIb 0xҲl4Ki ֒@ЁiO"wTXLT`7c& `nJ{ǶYc+ ic4-WP&xLGIJfoI 2ս첸V3Zx1DT~\宭4fْ0E8Uyk;Ȅvlۖ!Vvx(FAGaָ֭͟Pv3wI?4^{-1IJdl%u*Z]}'I(_7|?2۰|晐(9pax9I;(jG2z ܺgj4uy8"aXL<\ʍMFdAs|t;c|衄Tx86,K'i*jTd۶0_/Njqлށrѵ&aV)^>==VH-?)  |e,<)601A,nD'IsNEO~'g5:v BÙe:&AoamM�X04'q!^8oia:"gr5%c;�Y<B~LN,.XLqv�Q 6Ewqi0!da4KC̴3 ];lq;r 'IRKI8Ngi?rj?LǪf:utXw5D7 tBjP@�&=20 hhu| p.%-jH4>! 0͞Z ; 0j #Ea5-HUJy溮Ar~30=  i9/\chhe#J) :2�kD#;?̜Y9sP\<+ә4kXZJ |r6ÇԶL&#_V#xT~g:[gN l!w .oM Ao7078нԆ x. peFSFS#g9VmRi;L<hk2<BߐAc A aitM`^7Hh@ qFV 9I&DRhl;Iqۘ1y(ZM.T5_m˖I,+_]wIDGm).X}v /(?\p ydג$I]qvmT{8<þ;`ֆaN( `6 J*rzhjj~{zz֬YS,J%V`l?#NٶRltvMĽTϙt@` 2Mᑡ?E�欃i|S:5Eځn()+aRdƓXhk"AI ˱"A3F0)/g5ذQqp5K^KBN&o9r9lw�촬HI:TfÒj ZA( ~ S__?JA00&)qAiC bvQs?yRSuV84}Vvg|1FuYҎ ðY7m�._yD>h(g"� hײ#uL>}O>g}~$#UV۶ '`cbS.Sw:Xg9"7^ooP1Z%` Z 6T(SEbo j}aSl60j`rsTr2Pѐy?`f [# cL:WC slF䙣^ļ91:r ?ds5o%x- N b`cP^ v^teP%IbVR55}͆a8.I.ɼf ̵CJnTlj nlRK\y�=yd젅u'$d2;14U;Am{ԨQn/]&s$-`Xy- Rt$1>.V-qu%A BBC)�WE"9d?L 8!mWc!Mnx%sG9o7~Lc(ӎRY9S3Z*#U5X1qp6XMɓ4v4B8YVIeags/C/V40-rr`}}'55}9~[o=nܸT҆oDplj9 d7AxE<&bv/#`ƞ_W-qljY  e$D IiuOOŋ?E^Z9C*㙨ӌ]YrPC~PRooa~yi.rrj|.!ckfhxhh'HBX/TVB}}4~A  PA 830..XP,Ǻ�87pH|Fo׾e�0H${X,buB_Y_T91ůQRslj&M^yye˘h=93@؈ "1sD:BT Tj"\N1J.'coUVs=7nqj0%FMa (OEhv*w€4ͤ>8l+t֬Y6Ӯ84Zj)I̙oJ͛7#+m3�m4]27t33g68O= <pQ54P} r$RYwO#Y ȚZy2~X:ZSO4�KST\"]SCjƮ(�{Q3eY^Y0!_*`AK.H]g=9cvH3$ Z DcE8KmW=?Q:r%mhvl7&>!#Pke J)hojjjhhZu=g�$'3@q҈R!7#+ǼU6zx /LN;-}w4�G*hSϰ/qۻaÆN7 ̲DȀ,o֠?4Tr5d2h$͖P i@#cyţG7ndh顄4s/hp۬bkOuuufDΤ"cG.Aum1S,! [^o!I-\_Y(P`Ejޔ ;N\0R9B@H̖ 'f6[[(q}WubD悝�-JB�76/'D̀lQ8J嗯WZv@E*+ ㍘Hn0NXUS_fu}5}z=-bIn#ڶ]"W7ް'u￿:c" .4\MPj$L laSun2)rBL4sG=+:OVXX>c:7HQ>&IfsbXT27Z9v3h;e#7GTY 4w"KDS`˞$8zBg1[6`XvJf3ڑ#g(@¸ qkI_rI+֖yW%KdC0bp6+<2GS% Pipx�J>dGz͇-+;Q|.,&82|NY;O;Ͷ$.Dktu+V MXv(IK%q7|.~[[[[[.]v{q?09qKNZ7Allcb0zY56\<!3bڗTt:G,DY6m#*]#.ObI:iX>�T*q1UIcVs,sʇLMd�'i8g 58cs4J8l-OY(ȑ3mco`< MW˲ֽ5Oٽ/,}#^Y�s*X(=KRbL"\-J\/ Z|ؾoܨunnVJjr.򸻠o)B-GȨQ?w\bŊޛn2o]!q4g<$I7w_7n\gggX9aBō>.}evTf4Sxee٫[@ B5l3u@-<Gsyl|>_*dK1TZr>, \j_@mU\^fPcf4V8y2I~L~9sYH<% 4T< GdPC5ɷ2r 'c 0Y޽w>_} K2z1~';[, YF$<Ç_ϒx}  ]AQd}-zr-uuucǎd7!8dHxCD~m{<$Gu}}IG竷ƌɥ:%Ϛ_xajɲ?&Ov]w͚5<胡clyE6t`mj?R +L;.Yn<`&.ɋ@Q~!O T8L$I.{Ks'5�+E/bUb&n-3AvM&:vŁ9FWN8@m[xj!'G^5.U@a [-" 7EQ6T~s�bSM`,Ír OdMNTP {qwArXEP*0I3F`%>oll,Z9yLB&@\8vh01 OVQ.xX:yN`sO'zB?^xzJxsyYʻ+|mwlאwY$IG|00{y` lGꩧx/MAx b ,Q̍=&}popx)wmfVdEaKsv<dj�J<֦/dw! {4roɘ-&߃SB6ħ_*2zܰEݬ2 @Z+OkT$QT%aQsTZ*Yg{ ;+ݝ^=(]u}IZ G;B0~Ş"23'\XP1"r*d@^&=ecU Kvtt�l(bTn4MQcc!/JBa LoUN?F6>a\[O8o)nj5<…YF }y-ӦES"'y[<}z;Jw1@x{0;*?9ΩJ*#!$(ʨ H2턭8144 h@@QP[@! 2DSMg~a]~/L*<{u{wL? 56$+*k \53PVx8Xɖ襚r E٠1 s9suZa4 WV#jLibU^7I!Y)8qww7D^onNx^h~Qvl66B-8&1E>2?̩xY=;]2;Dw;$뻯Xy[~l 88jݷq}˥s){ni6BQؚ: aG[j>Tch \>Ngm6T'J`` i/5mC `G;#&�6B0+3s,ҷuЙfON@(͛lqBl(? 'D/�̕Μ_.zklt}kIJvlYZ(dBpahQv S@7:@@pȞӂ*on%MPk"H.)M)) =y{12QpcOg �&4Yl+m3jb7W +IC@iT⣽mTEl c z @C̆ZZ yPkpz^VUvXYwVwϻwιNs:*WTǔJQ[v{kӳпJok4*0Z=s{NFGswbam'+S[=tAP;tO<Ne*lmOv,,Ro<M7guTz^hiO5\ ~+0̎;|mpVѝ3}P`z_ޔj۴Zh~n۷Gwm2 ƹ离l~{ys}{S:EC}1p8d'تCR�< g%렢Jz;#.YGwU Xoxv Y!3!BH&Ad ԉt)hahR(ͯ9ѻr +FH^H҃8sIܤI⋝s7q'&LPn*wk0պmhhsv>%ŀÜ&�TͅI|*'&QPI(% N6S(;,K(Uj̰ vʀA`ߥj쨣pv'OS'wTcXGAPXs+.[#z.,93chݺ~sN>8zs¶,Rhyox9ᒨЎppR utA/1/e1hδ*$E w_RճMӴIqz)HZ  C]\ZlZ)< *`WZct4>hl'"Q^, 쁤JaW9s8n<l\ĹŮG]엦a΅vf3h9w}~՚;GX_0*|M_j2j(8:@wTW;dn:D-oF8^`Ҧ x`s:7oN~970̲$ÏS m:B^^ω)ꐾ ?lNhι\yFw=4 >;w?s~AOO>qbO*<^N$*Ytw$k5+V8[*$4o4K;ΤPVȾZy?H<UGSNgj\ mV)!*lherlaT*3x6To* ,vlUeEJSFQ~zx0w#Q&Cf4IeU7D/@9#?GqW]L*8ҴhƾMS;$(np"D6ycT$ <޽lFs BXJE(,tg$ cQ-�� �IDATA<x&6`o=juEgع3øcTZ%+&K^w#^(=Ȭ̇ҝ;b1{p Vf38҅&>X۾=\0|'z^P*A6cF>\Syۆ;9pEAwU/kW^1taooovXeKqΜW71gN+o=*H{xa&IM#O4\ izhӠ:m(:@6C#ʸjVi:z&s`x)kT*UU=bQ۔Ƽ-5J3U=JҼyl]LGHֈeG4Sw2=j[C*K_r<㍂ivr986>4< kO/ N\h 1qAlu,uSv2`yp̺:ux|M%p'xPF t0 c[(F_#5'VxRTY%Me-</]rI_uq\xժl=҃v+W?oAVa8 ].^|qeu'DU[sμXZ˕㏏я&rox__>;6lvZzA/>뮛xiiٸKf5Fkh頏>s*~e.: yZqf)cBM"ESzݍifhQ >U*Q)qie"l>at3@0n8(?Y}fHN11PVccXٱ}}moISe,}5i>j^Vb1Mow /EywW=zh<vnڊW/EH_VK5FSȆ ?)^ޗJ%�z@mpp_H[3rbCѢ9E5(\ZbҚBО d(orygy^W)[;\L }?qT ;֬^]v $rzq8oyK _>%nA7/i,ec[nɝ /v+W*݉}.!6h(uKN!wj_AA8v(R!fO?Mk![Vk>^Ϋ8B{8+6Bp Q轩,{z7+˥Ripp-1TSwܹ<Ry9.B~[*=ys:Jh8ZG|]YW(eYI, WIYIIBa!c{(n~JQpOgܺL}v=)vW'Ohyjo "?#@.P7Fdc> 0/W4-o<[g̙W\?)zj\s|3N˰ʹg:Ȳƹf2 l=O%qDҠHN� [Zòkv_i6oU6w{fٯ(B˹TSqJj-*uoi,,2!E|dK*"|W\[ �mO8hR WԌwM Fe[iF&Nh4z9?3g׿^f Ϸ> dIVEۣhkZqgre04XVxlT*yj9a@,aշ/� #?8q"t2�?rQjճ!Lj 񁃠Vy"0>uHTыv\ @FN 1)cZ5fN<I;2 Ddc|]ʤn\,޶sY1^> Á)SFk&-fϘz$$ITJZ<V05<k �24Z(1kRZ&0}<%3U_[?차/h6/yպ:#M~zq*Mnx:~\e_.̀O$y_ټILwjփ:M!Nĕ&4Sw'OJ =֥*bTv )bcFR:BC{xD3Jb/XS]k `Bʩ*li ɗ,YmMxPJ8+0&]b ]k5`VȣMNAEOYa]a5Qʟ|J7SEZq4ɘ c:!Q4;�$Wp7L"Ґz! {E eiR5G� s#Ľ--j6_?f 8R^g$IZMR,Q-pngzkY+M)yxBUnm/ЧQΎ[vK$ߢfrBx=H+ eƳ<j]T\$Գ�9c1$/3*Tkm͸BBm,Iv 3.C*\2fjD"y,ER7bb_"vE 6-;�c9E 95ZVzvN)�V" gv8VtB,o}A̝أ?&Z ]ZsOT3Ҝ9;tA,ZTX=9[^#3E^༐Kٟ 3Q IA^CIF6KӮ<:}JoFlFʷ;\:IY4% PiBcBioˮ`Ƃ YoJcY$ Np 78Ʋp=SiωKyo"NSCq#GM ܑ{zLo(JtxÆ<7EYC:Z8Tx2Di=|1 'XrU G#JRBFCua MRX6?+}wg 6m[²e+A}wo 0_jW_prekι.\۲%RS>V̤4'bBI o,,]t ы#+ߘzl6+]3\!4=ݾ|YvI ;!`Wn_[\^N.뤳#>{j-CF^YIK -kLې2&Cty<O>ahuڍl\3MWKǽk/Uč4!}6$6)`[RihhH)L-soQbdN;upL煵0"U2Vz@0H1 "RDsYiS7R=.h4h8L';?X;/qGqWFSʉ):eDs9^{-DIk#J4 08^}ފpp-HjpV!M~uyP}q k=72#]LU]P$5U\VOQ{.\j\]]*lQf,s!)^R:uZ=cAQA%j� oʔ)F$h1B${_BP8tT$+k ۇo)6rg)W\q\aR;~k YD;I<_r<mڴkj.幊ͨ g7v5tL7XS_‰[h�`\#֫ )'60H4ijA"XKD[08PV=7%4w2Q)'>Jh3J,'}tK,˒uyэ72ۯl t;ONBoxhQeo[uX^^Gzl y ,�GJQ {6߶m Zf]tnYt9wZ6IM,+; üsa~ o4 s?ݙYfi)ռzڣEH%!cXb{MkŐE/a>2C, axV]:yrӹjvlU$< V\n:9`>Y24 =zĘ}XeA ygzѤx*ZWIZkin 72%èL8= Hh2v4}ݕtm|# 0=Cʷ:cƌ4Mc_^J=8ޘNֵTEB@i٤iGP[<gl I"i2Rb5Gje#^2Wv *iqy[Z;mt|Dђ(*F#K_iZ dY[(~S(E1ܝ$ <˶gYaŻ:;bI9댔уQ &Fiʪ!g~ y~`}n֬Rlٲg~08Ĺ|"0L,<0 H-8=)D�=,lzC[Ͻ+'f~ԉ(/N0 'MT,w؁XRw۶m&>44dbN@>!jey7Pĥ>=m@p%7F31U0vٳSOMvsguֆ ֣S4.x俴wuu$C=tɎ0@y,D~}ԋ8~Et1̺Ɖfăs,`.ɢ<.}:! y?Ǯ3$11 Z>](yeCu0 ;5 x<dmiɶB=PCGM׎cTuZ'zx&Yo(tfsRNVXsԕ+?_;sI'T0 M.E$|SUנG^){0QNd)" ,nZ4N_}BXT֊}0ߑтI lL8qڴivؑGY VV`fI֦QbjMiqC0\ GPVUht3[~+VD=>Z<#/B^GL65 c e(oF%|EZ,=+w_a]Y h)[|Q*#r©&jtƙ2\JU-nE]M.x`8_$sT0 jY@ $PaULu ˊ?Ib{Y޻:+fǕWnzI'dRJZA:sz Ҙ%k=ԑuKc8i:Le aZe˖3}9V+X65Vz-O )3ZhNdw`!)'*+f_=+v~c/~I4N<1=Ky uTy[ÔDFZ<yӟfkײl8F@Mx)Jk^HaUHxUS=1 _k8?oO)0/ILl1SV ʂq"˦Ys{Yӆ3mڴ<h,^*N%%*i*׍W9cIm۶ak֠)xr) 8c=cҤId{QЌc*8C_y;N@U?͎Z688vڵk24 .hNKh;QU`4@45ӲjPҫSnzt?zɡ+w\{ocWoUxin0�16?}+у&CtÃXi. j¤H&e�f#rQ5Ӡ=vxވ(4] ~li:cUYjVZ-tEZ UQɲ7]jIfh?{QjcAPm&I$^{u1̚5$AHM4vǫyXڲ؍_]|֭upR+M#M6-8'vSN}s=3L_6�0Hĩȕ- d:SK.k"ێ0~TbZ&f}, 4RÎs[Tؠpa7u]JbvpSι;ߙ\w]d.5bC4g:Gu5oN,/(#b](o70GjF@3:N.=v˲̜`d-<X#Bʲ쁡b <`ȹj$#FjmihNn.)0I-Ii.)(uOWWVf$B$Tg\JgzvSػ6kWCe[l?MvioG`Q.85r+axM7 _GڴZU6 @Wu˨Vhvlٲ�LԦ3e=*P׍w`R5V0rautŒFgadhXӼ/(8HO<P(uc=-Zdknl<<y VJF`{>~%:ӧ>7iǎ} 6K/\kX,%$~6z GTo‰:#-+މPeu3b߮;},w(z.I^k:DJ 8/T*3;0J4/^Tv0ze3e έNz{- sĐ0x?4%^{mÆ 겨=h*>t񹜱ٯ+IO,sǯY:X.^46U g]^Z'�M d GdZ(kݤc4\gΘDsޢqv1l<'&)<RNz;M}I8QF*KWhs|0aئ'vј<yٳ_z 6ZNV2geR(&x뉲SrJeӦM!FctKRޑwSbFJU(p-YvAqAWbnUkp8:K6fP/,|q<~sRfY@j[qaV+)K{*ŒaCPhʹ\OOАU&5 66 {hH3ʞ!ǹigoL/] BLy[dR z6$*lj;]-xׁSOxI.@*C*pI+c;ĪvuiƠF}&%(7$ рsWsn͛6mR=tI}ٷDt9osC]-N0L/o}>-[iӦ<_Z? >!\uM[ ;.x#ъ:#7}ݯ.B&˞|*{Zgn+y4\ۻה)[lSbߪU7͉Z gWKyIhnp>VEa_Tt+b;eOTyH &H2'Ge#mۦdJzY,COW׆`A Up\%HSO+QVi4y4j[UX,Cv9c? Ws|Q;>DT*aDEHGQyk֓>{V BB~%@zv֘.d\gP~U*0;@:6R ۵OF8j:,lYXq[+7l;:!:P Db~hhH/,YiӦ͛7{¹X&': xbtXբRA< ^38C}m4DS~7 `vJϲO7Jbuyn6?^~XReOq#fdYeV! Xͩя@~1 rPOX$.@9gYJl]*g,M L^M`EӉ׉5�� �IDATa.T $Ȫ1:PhMC#8@MAǾEòfIwړ/i( kS$6NRY4Ü w㥱UN4?8UVR:9-eNy2$tG%jheKt[. n_{-\T Z.88W칭\rժUD#bcQZ<M*pP~o}7Ϟ={ݺuJe``@-W#&4<jQhôPH(4Mjբhk8*IJqv( [(e-1te*<\\&Ƭ(2ŢGc͛7{ MnTCj�SHK%;9U/VrUe?ҚUGb1@;_?Ԗ6W.xaB,VTl4v cNLۇxͱ@:ɨ(9v#yf D0|zJ^޴8JR79^ ,kp`LNkM)ew$t5':iXi%e<^m5Q>P(twwjjĖ)Gɢ49,|˗ݶm{dVkc,mYNι_JgdYPTj7[hMpwnY宮 ~P*s~p=$%I5G ˾Z,15 iӆ9v2L[Nmd3WYk ^9cC!&^4Mki>NTxmQf3dj:452"?Np3|';5`<UO`k`hH}0e�ɸJPsx޽ ۽H]{j:g'UI!K8^Y[Y]ҥaX}5֢!koO^&UZM[n:蠵k׮X3om9^'H X7nosR8}pڇzz.V)uy[>]]T(,- ږo6e<^uU˲,IΞ]׃0U˖G8|>/<o\tQc sy^| @H2523iXR9WxֽyY[2(] 9y)5۲nюAZX@ЙJt(+)-C8Fc0\I9"yP3af:iCш2tv.7Ba{S3A<cSiD5 LX?d4Tۊ%BeRM9"(]ۨMi;dmWs'ȎA$%P`49l6WXa!XB)%j8D^yY朻;[*uuHwЬK]! F*BYQ駣+vyO:MӁk)|cGyRot{nӟ6n;/=ȡ .(\}OOVBjSNp [6 ǸEkZ(WNI;HUK|'}07|ѹ0/,w:NsK'K2mz)ڒxdnkam\?ѩS %"б;Nv^܇Pg<rج=:b2*kERS+�QԞE(g=%}s(ÍpYqt:1:u6eŢŗ̠cF[ 3zRm=E_VmG<ι[-j=(k !00JE.6< 7o? aXTb~!_u@VerT 9tQE73gv=X&$Gg=^ATM m:SS${z8rjŸyZ'uMu� UM-ڝ҆2hܱ0:>?gx3`af:b*vN's$*[!0^oz61 AS@j�ï :AP qHk:BɭjGMs6tk@n!(UT8dJֺaXVm+=Q®&F.(I>g֘Qa06Йx˝s3f?t\}.ՏN?fί6ۼ9?l]%/yro =á!ƍuS $Rƍjۨ目�Xxy:0$#S[yC.g7S<M.?i6㕝U,Ƿv$I>h`}+GАsRi]8.j6n^ 9QDo_T_K&<ϯ6@4eT^r#ޔG٪#w30b 6XWcegO>Z)<ՆX5d㎬Jfa m,WO};gU<ƏTrb6摾ktAP݋ZUElɓ'j>6Nn˲,N70sOqŊy,a+yo:*Z? sLcncg?0yɇL_J@wyAJQk甼gq1:dalkr.vj kÙ\㍞zƩXN6:+MRȲu6o,{si~^,ڊ|C}}EAeYn_eqy~i'ͭq|^px^R^[*jYr0WHw�G2~][Wl4>FAm"S!ӦST�[Z0!M'W SƲ9'U 2ǫ_u٫l=1>XDA]`Q Xk(Ku!cU(QѲ㸻իw>_juйBIMӟNqpA__dIډ+I;+vZw*Z4MUgBcXX\.YEEe^*X<3 L/G X:b=!11OQc[jZ#B! 3y<?"v WlGAt;[gٱkFiЦi:} &^Z4ސ2$-"�H`)�q{5qZX_D-s&U_~*32@BUOB@赈Sק%rH-;*kۃ v{N5Q_&xž&Jm?:,Wm*>jul=\… j 8?ޕeiYѹN0M gA𷿥ia6m .mqF3Ar>rӦ/eYdISsիs0^y*@겣AEaQ_;;e㿍U3n^ <-t㍸K]i~jkSǥ*uLur</97 ?$Ie{7egrtn>M[Utex &[B9Oމ!NrPZ W$ 0J8&3$ 6t:D;*N=H̅Lu }⫕D;ӌP(Ip㤳X|嶐0Y]Zdپ^ȹE X\AjYն * 'zzfr˹i<꫃ٳ+]uUل Ywk4V0{v9sv|}'غ5կs=5+)V4yhx`52<rl(Jv.{[$U7 ®q2LJALQł2SA\ KyTpf?$0 sjt�#v;2 [*hn?R,-mVj6ӧORKei :LGqEU6TL61]N'P4 FNRVQ9=+q7 {蜀 0c0mjkk9,' ZԵ-s]G@<0VF IҾϤ鷻9M6=W3 dwϹP. ڵoXx} [Z-ppN3RÆF~ڛ5:[C@ǥ s 1ٜ={v\f x W&S�궩'&9;!2ݳkz+3IG=/ WV/v!UCC?u@| ìCSg ڦMEI[1I*aR0bgmG$j0m9S щQuEO.Jhq+pSE`딨(I}:2Jb~ȭjFWhg#Ƿ xùjFIA@jBhwCI#@̘}doڍ݃;wdȂcU/{'I?6~C:<~W߹sz]BzQիPZX5IP%Au#5S~CXrs3fG>RV[D@`K'4Q è1-mdB=`(WljۮP|i5MgZS{޹ k6åaxTeaDQ8nQ 4]Eopz}Z/6J vP3c _=Ӎ |b 'J&F i0ڭތ0K?.7#l#I4rXybjFS0؋{;UAuMY٭1c̓שR-%uRrf+`j.hWWWWWue`P#kVEQ444r@+o۷oߺuk__֭[+upTfEe'ɛU R.̊Rx9c'|Vm۶M'ɩu4DaErzZ&*:oөC05I*ꜛE<t.Mӟ&' cSZfY(3[X,>n<Tz8b1r0|VZwJd^5IQ!ro}mTꚲ́SXAmP kK0ZhA+Ǜ&SP 5VS<& PK=53#•7M~%Kqs V;F]]]h=8h4 8s_ܳlٲ~j[=Q"jE b塭5҅p$H *@s#tVL'>rƸ|۶m?-D%#2ZLIIgv~hCa{Ζv=iQ<[ + Bwa&[ApcbߛAP,M?44d"]�Md΅#j`R?{JF]ֱHwEX=g` L+BڂקAYKbJV1l4|]K(-[0 +>Gc2n(jZUԼ֭n/* O1c… l٢'8; P�btߑXOIfsE.}5\>R>/ATJ7£սQߛau`N ~^9mH1ǃ,#X$΄K!P|iyRZ}b$JedA"K@V JV'BXkNj9`ӓϞwm~ {ܹ?AsJeҤI/ͫ^xTJ3f|,ԩ;owΙOɳ-6r`JVʂVǃcԩ6 0p6T\3yCۛ,خ'I)S{lRQ}!0oKe%/>#Uh{I'oJ٨DթGS7ZֶZ;w>ϟ?IF 6պ8vry~,Y~ƍk/,,&:gROޔUw \rI=Iwƕ9hfD<K: %F$c(=0^8x^fPι.\U̒oko9 5Ӥ%pQGMozꩧ-ZFZ ,*@;֭[gB ٧vX,ͫ|?cz^w}[_^^8g{Q=A%B+ :r퓖.?}rV qxM R'`UtҮJU~"iȨxiAzf6m3p)1 Ȫ9-0(^MqԐ [I5vΕJ%C^[Mihhtq“t20j^3;OuAgw۽Ȱ xK_Nvs$w.m?ha.6sw-X wj=eE4@?nǎk(4?Wx&%΅COSaZ[:h0щ'͆1ɓ'u:u y[U`MREz(:ù][ H̉{,Z ͛7I˰oxC9MK *ޛy6yzj�9Giy֩(F+Љg6UM2]Z܏1$Iӳcǎ{V w ɉwo'ox)5i *ؗЕ'r^^Gw Ct/j43dJL%]=3^$$҇#a:S^EQ+ |ki@ ' 3r#\`dG[`t]ioބ3}y䃸QCiW{@sgZ n+:Tb ^y͛7N_v1KsRi o~r5#'غuke9sj]d{}IOn9gNh;Gɶ+/v@}DCrv{xjb^QXx#vѽ9?aqL<ױ<@AD *J4!W*ٳgZ UDw'Ϳ}]<wluǷ v{F;iꜻ`ĕizZv^S(P_,I$4VFm`yJ$iPep9H`UW�WwGuV'N,C=7ߕTS>V38Ai2 Og~Փ6-8h<ec@9GE [djbS$̙믑ĩNolݯ_~۶mF�W?3fvRi X}L휛(6FяnAKŋ[-w.5\|9Y7.(zKt襗ɓ_v䫯6ovR +0hj=`m kM Ӧ +^ *^Q6D +m&V#b}FcҥcP(e+Rl~EEZwk63 _L݅w}ι-R)v' f*x Kk ÇUL;!̻ 45X`U W=5{ \TP"D K CGn'tROO{l|Z+hd*`k[[6oըÐ4J^?N$BIZꌅbM6z0vVB+RU L#T w(߹o/Y:�� �IDATvceYh5q i6#C,t}PS;wB7BTrU#v!: mn6juGw|sa:J3` ZWG XWg;zzK.)YZI 5EY&$SEQiڔ;U7`GxbPá%�RSX|47ex5*"@+Ei*i!d̰lx8}žxq#͏~4Ydɂ vܙy1# # MG2QUFְ-b8uT`aBvố %%8 Ud|J8*"IQ `V:wfÕF(,fL�*ejy "˻9 ߓMz8mڵk~Ea>_9T>$/RPh|uw׾Enǎdɒҽ]W_m{mpsCc:hr ȮJ<¡((1Z#sW*5%xd^e@ujdI|"7C>?%, 8v;k^y<EZ_-,zt</eٽ"hP)&TAJqQeh녯5'BOL-wHQ@_xۢ繛;7pV^}Ѩn7A@;=v>RRt|!ꄓc(ƣvqZm}a3rv 5b#yXAF?θ5=aw#uvO17U9<^{=C}_ںz}08pC~}X۷$\>[>H',x ߸1Mׂ⁁4MqAk\3`@ ըZ}`S2!Ծ7L2"ċR %6rX̨sP*]4M$q_0j<7]uގ EPxhί$y! 8&MOiеsSEmNm &($7KP;HIwN՞&<ghRy؛0u̪Jv؊{,V'\OO'? ĝܛ cI+juЊy&qQ�Qz֍1hD0-'δjux^/8Y ëw:u ~�~'x30\hQZ O+8ŋ-bY-^4B[b#Vx<i^4\<,($:JӋ'TnE!Vqxf$ڼ)Mi=IԋH59L 6d!DOY#zV<¶H <0rpbNRA"$ Ua5>hl_ S.KU]cs6 ; QiN!C,{<m:ZTYJ]>-Adz}zq{*Ʒ("M𩧂f38wn6 ,+T*Ba<:4{:ۧKbД-$1,tCs#(Eqɖ48IoPTIiz\ \U5BSeWl楖`uQenw oSOYz(:0Mm9/;<Uc'X:Hef*q?/ a3),{DJNt, )( km"Ӗmr6qhMȉjAC*ixB->iG<EAj=$OY<'kZ6Y%,[!iV'˞c OUiHtB+�@G- 5Wij*U#}5{h:›+<)+\QD%A(D1lsl!)QE%reLW5[6s˶8d`ώ ތ=weZP]V+iBcOS$4mVRtki]O qիWڰO 5*L<=Mۭ_#`m*ӹZ7u:M� ڪNiId7e#V2 (87r=<Y�|bm9(ڔ$&wwsq(rus™,k?A|X<lזA , y@Dib5O,xoZeu5IZ`|HV=XJ |[@(<TG,l<M>J֬J8� '6JEʀ=';r @[BoNV {Ѐ%ʼn2cGU4&IBO^O-svq>ǫ5Vu6|R V[̔;9:0XùCh'CR0mZ:ԩfǮ ?'Rz y;X ^P,1so?̲$ɪߗJ+tq['Ij8[DQh>ǃqLzgLZ*gz:=C#ShhYNl3] ,gFV)7-Ҕz;U`(W�C=9IRhBÞ(i7=2$=?N')G K8sڵD-`PlB {ɜ_\8u[|AAeܵZGB1(�&̙kFLE4̮V0f_,9-s6sSݫ�d!lٲE 2 +F @Zh;X or@xjL{1REk"d庫P(L>^`Mxa GQg & dd^OyAN<IamT> WQ'<rIVxO4]P;8 mlQ<:"}&rTrvH[(LDd�<A3fC8΄ LYc.Hl7Z}�JCJE]n+,�,e \GuژN妆kNHO>=o^|TVCNRRК1<$ne~R7/ۧU*YfmܸQoH[OCiuW1ts9*ׇ�mVG Y4'$0exm"XQ ̍H*QKz>< PbNjY�kS0AQ>84i>:#DzVʶPx�DYmANNƁ1DU9;8<N&�P "-"IA!O{ݥ3ߴO�n'>'ps* ]<V|Vy<ɻ2鼎%) B<6j)vb)Cӂܶm p@U<RWJd"=.i)8%ΰnrm5ݹsY[@"eFOg3N1y𿵎d3PaK jni H?Оц/5肇OA=>%sU`<RXB/(;cX5Siz)üiœCd=l%FJ2'9aj5d:DbOi*dba:Gn5g? O>IYZPTIu6ޔ:. 3Bkoj+Vо .yE'&4zP[X6ACП(Fa%hB>ðHNDPT\O$=/xrROUeGѨ`؀7K*:2BOF]bNgPsNLjݨ)TB }y̠J{XQFK1`H; cT*rYM>h� USi�q:')*Ua9s䣍ਣe$Wѵɳ,_y3Z貳-{ꦪrIjZ7x2AG}HS']уPs'TXݡ6=08 Q~}r?80`E,ιa. ]7;RQcfESAw`zOh� }MjAS W3['. )jF; wd!)NY1:'W?"42Jjm¸&ɏW-y2vzBPTx3ƍsOSoc%1VF^ːs<4u;{zBUI8ayJKJD:f+^CcbSs0,˓'O6Ow+_t~E\vд`) LWLf`!jE>9VL*-!jH#fz"(SY}"SYBDW\4 )>].7 i6 V=Qd/<S]S.PYfR-i3kz2УPD'0W ]YY ~5CŔE*KI`hH5%@O- ZM-<áyG .TBxR}REUR{TR(IId%FRڷԱZ j%]W']]wh4zWk֬uqlyzĞfY*r}T3Wѯ}w<Cj$'Nc=VZeʝIWᛍ>Xj%<3<<2~ծov'4t)iu?D{ h6kV: ]x}WLdzΠ!.rfG=L9dƍիٱor aڍgƲ7>5h% jFg@HPF.mEn6ۉI^\sl+Hzjq`;;) h^}Be *+*˲SN9e֬YPC(Rֱ2iBe/)eٜZ/a^_-m;Y%U X.jEYaUl|-oIt` }JBocĉrȤI}͛7o K)zs}t'Sr R=OS._<ouV]pklߵ:dҼyq[iG?jϞ=qާ6(w~KՓO~RC+JV0P;uvٳ{;N9<+ms@NfMr4eH74(XT 6;I4*PWa0B 6- 0%N5q)CTТ+mZ;3Hf,TjM;w>=ҥKJf<8M崫`'gdLє vVݜ 9ͩש@3M'C[vZcX0 ]F#7W^O<K9:Q0 7L6W^ٰa>=j賶Uv TjvZo�i&cL-;W,N<gD f/ߟvx+σ(*J@/8Gvuuq\նS^|uQ3'*0stHi$y1G8[o;ΕeǧlRhX*L)y]6#Z+ӆ~AE&4tO+O?D/9-*{/$Xj$g6lە:CS{S'EJS5E'j=Ǩ*!%X}ܹsq9cu4x@JcA*SmٮOs"/ cr2iVL ѢJϙQd7_'\qE*]xT/}4!"jz}EQ}vWGd=,On@x,*�aOUYpp:dt>AVBaX%G:ȹO?m^Zw>Ѹ^wsNX\.N JZ{U(ʛ7aX.9-{ޞfYTbZҹ4Mnݺe˖3gn۶m˖-L,Ed ތE^ J^DiZ6,S< Y*@g)ѽyzL[eȘ Urvi٤>YlpL<=yy**ZA 836Fu[;}Fm6]4f^P:QdL3Yh2ZȞ '<;P(twwWU Jƈꩥny'I,pC{q[Tƍ!͉oXQyL<8Nt{3IÉV[AIXF4%|s;<k(Zs8~aA;Ϟx{6`A^T '<AY&.]ڻfM9Q5Uy*Y3l̙g~駷nݪؠrミ}w6lXdc=vƍQڗ0f%+x:~S:#^n[^}U;xԩ'pŒ3x˗sD,oRͨ0T9d"s)|MczbVh�ZWaE?17!gdR~m۶mΝJw5 F E8386bywS�:2х͌/RrhG_W]:дQ u*ǎ{f!]#lz+Ikh[*< N5<s f{}ͭ~Yv-뀄NuU;O?4889'[6o&Mj=YK>ToۑGf\soE D 0x9%Qk7W+V߰7~ep}: $=ISqlSTgB\JvHjzV4uxO6@x֬Yvڄ ֬YfԔX1ؖgJmo: ޞVŨ8mABRfh's"O4W:7JV$6-(:!'mxp{8j{9c]=w!$0QeTE( "WQ&QD!L!B;=V\uݵX97~/6Uygkf/=C9e1!N\clXtYId`~?xTU4l0 "&O5%`\{a>1čwV\|�\OEPs `BU�A>8 xn.{AM-㙿5lk'LH555J$x<i֑G6oy&MT7? K4_^|ؿֆ 5iRJ%YinٲEI\0)qs3oumJmT*NE`<"1RAF65tg&+ P �;e޹iӦg}ֶz\. *W_2KȹH'CL]A#Ϙ`%Bȇ)T>I[R %\m@^՘_ޏ4 YUBn*"F1L̳oqB*] x³1FdT.LJEá~H$$mk:R7oK.`Q+GX 2&'p ^DP r?c- ,(z])R7Lf /4R 'hӦ7'%KnŶLn͚5}ddƍΞ=}t;uQ5]?;T8z}GEre@/O&%9zoM4t9q4MkH&�"$=L0E/IEɽDD�vcV:ϗ#nC @(;&0&'B] R:�Btsw)PlQKOVtF�q(Y\bm,͐h";#K�� �IDAT$DW3 &rB4G7񃻣 k ò]A܌.�jSs;L*r=g܀ K[nŃa22y`+"p6L/TD"~e\.jZP0pCșȳMX Fg#4-lY,д֭GIO>yт̜|/[~nB#MM4nܸ5-ngO>뉅 /sLi7fpgppbE@P="*  Tcu1ϻ=D7ƵQhbs!\!<p v(8q,d`)t6aK'"i�.#R#ѱ"5jhmmmLf֭bL]SB^r6yЦC�%ĝX<'&& Vgx$+M*N (\h#+G4", .ȵecLEe4Əֶn:x5R`2_W2b;vx#A1Xf>yx Halvжo^~z\p?Z '=umt4T*nwa|O>^Riǭtzܹg&,/\yYg tT{rT ЊjնbVD;$ʹ,An@X-OJvڀ3:\^`((Wd`E:x)£A_'2',76@Gq(PΚ5kO<D\ K9#^ ӱ~>}PoƑ]T@&\ceue�UA d'CZ!@oH FZMNg9 V꫱Xlddpei)FGΕ;vp]7J ݋=|A_u9QӖ!Uv:ʋǛc1rT~v%hٵmHz+۾Wn<%S}4я/8~2m֬f\o5k{lT*<8Qd2 0X¯x󼁁H��Tj:v]W@]_@rqR9Rb%@M^5Mr2reXɁC\沇)2G@wm@Xo{NJP_xڵkdj5pJ)hcg'?תy FP@]ÿ�'t7t"{"ڈ",,3La"F`1 v† >Dy˶ |_;}^2mAovF=gFk7r˦{mAZMRZi&vb!j|*[*""q/'tzotuue24~ ]XQܹ_zE:wxzk"KٱciyB`}e}{v[Y|ov,[f^LwɫV;wN CVL&\(ΘA�Vuuzr94K0�BhԱ*sŃ)KA�+6fo$Eܬr0ѡ&V$bV 7lN]j%8=UAS"Dmxx8CF=L+x1 j-cm{m<)& )AD' +CÔ-+lid$[Q\ù pV>u}e Zjy]zF1Je ˞7/ k6ij+4Pjǹ1T*k"M,P-ڱc8a*02WlD"nV=:"C) mmm_}uYi'.mkkS٬NOJ5vunj]'s4.z~_${NٳtZiZkI/^)u%yJ%u+J<vKN jw,`}QT6m$mh �,+W*D# C>*"猊D#H^Fz jcUt4"8X 51Rq\c2%<~qH&$0Q CUBu1>X ? dj ǙNtYUm$ !Ga!F��Fu=NaX,C4�C<ayMآiwFWA`RoXJ0\X_J}CLc05jhۆaom)j5¦\>F~述 6y0wH>ZMd2'N7n\GG1?~jZe1Nǂ`i>ƴZho.%wOi{ժzn|Ӂ[6/ZV5|>onnnkk YxGFFΞ@l!Zm64AC0'OOsC YpĖw�łD02a \|r&5kG<S#ŷ쯃(b(E1HZ 9�Gw~F",Q'4xT>iZ>I cRr;B.x.hYCPf2 XErm(ƿqVkW*J]?=ϛ|K$NsR݆qR`a/J4Mާ뚦 }'T-rg``� u&Să87O(ϨT*1 ] #ɴ?5͊C{{{,kjjJ&z4l6J,1b-k׽[~~5#~wߕeZڪUu ^uI&g֭r"*!1I|jİb־0AIy^"d\X˪Iv^QK ELQ 5.Wȋ0Abw# * cäp @d \ S+)dRDD*=]ׅ&[4r>IZ(9>[ä\zKZeQ$@1@e\ɹ`/|VR0#SqlU$  Ly?bZvuXzם]亦euzW,p20?<|_,v-0͏nZ=B)Cp<rJeU bZ$]38beBȭ;&�˲dsss*jF6m|"OBT_>矿&p•{{٬9ye֭gl3W;.`':GaY;oM:Ob,\X,�"VV%G_7T+GWaG9�Y#w2W8YU`ܶZs;TLipG}:,Kv7|< hp|.jwPfcJɅ{+9�Ҕ h�X�yXQӑBr/24Qd聛 27 # &�S E<#2ӝٍ0B~~ ç-KRj4JiJ~s<>1 UzZu|a7)A: ; h]VGn7M8߿çz{.QqC8|"ЄI@lj&H閖t:J#fW]%㶶=4sjww`YR~Ѳ>8_~/P S6bS;uzÞ/dl{F"Kfն{s9)ږBd2-V*4#B9A qÀE׀A.@Gu ?zfx%L1�e:N!�4 a2 ؕ A=} 侁:UL* 9{[S4Mj0rAkGj)<,P&H�Ã*X@~"nK|4(r ;V-�#,@L"iYO$2bi5zLV[w~L3ẺatTj%kжW$A9}]_:۵+Pꪎ@QJ2�01 J9;v&L,+NK %CEmmmx\k1|U%0u}i2y?JKݖR^WbtΦi4Q^ǕJRq o\uU,a8.y^=zpsGG.i6uT*K&8Lf@QR3sLXKKB{",' (x~U` 36St͹>tW p˵!vʓͶ=kOz"g s,Y$38xwwwRٲe 6Vf 9{$LPΧ@J&b(ٮOʉ` t��E X'"GG`h?™6Iiˊ775mxxxyR=*Mc##)0O$K㾯iiTbq^6;uJuz=a?- 絷Je`4Qv\-&`R R<t 0 U8x<JɳftyAd>vו?Lu}]A5 iƙ/K֖ +v;NNzj.Y)u$ժx{{;\$4rd2)sc7v%@3‘aCxV`nrRbItʞ@4ott|k9`eP8I1[*J`tZ %zZlt/$a,_yy7{i{ժ>q6e/npP_t=<Xq5k~_85qe(Y.:aBnš[-_9zk׮ݶmEGBDR019pH@N:<-GvB-"l>~  x G�c\'=<aܹsx㍛n{ oŦRV͚f۶ג KMaxm[ZMd2sJ)5itXF Wze@E8$aOuB‴|7+(_5 wd2Æp"1qvۭ ʥNmH$Mڶ]_axƍﴴTc>qPH}yTRJ Id}9R[ZZ%<<(ij (hYix `,2ۘH|3py;(D-xK?'"PJ9s}˙c^xa*ey~+⋃l6 #ﮟ|rpʕRڵV3f0 >\npb}F&vgP{0zz<:88k%.b3r휈4`y Nя.}dy.)9z@aLF͟n؁p% qGm￿bq {֠ƶ-F#A3էm;u]׽Zw7$yʔ__{`, Eoʔ ð[-[ 7׬I?g?vԖ-ÓEr}%1DH$Dkk+X,&^^ pm{?{]mY/?Y6N}яootvi'eX-[75z޿}ԩ'f235MLq VVcX2 cEE`\/C@G#cR߰ X4ș 1X>k, ,0ŋ6KBI9݇5aOOΝ?>nYzj擟 `A{T<c>({0; ð~Kσ*C`hrDsv$t]W�h/V9XćM"2,;b o0c[߈,3@S܌1fRr!|s>XkiQ (hn*$mX,ftzHtKL&Lu yϟ/Éz_-qx'ٶiwW*A0m;/>GF^;cO~W]sŭ],ڦ4ӟvRzarڵo}+ CӲc-~{0~<#webOB0J%I]D"Jd^)Ud5MӴex,X,vF~o}n:}Ks\OOz\`m_YU>hj: g֬đAʒQt0+W6 X@�(@***DF@j6#bj [|xJ!LXd<^l˒J)ݞ)]N?ȈK0;V׿w+,/XP>϶=_yEկZn :y#Glk$Fkd8.Y|O0*rCP�I1&빗<^гG8œŏ1R 8?(sr1>ySzo)9gNkk>)3uj>o>cz#O R'<v.̛5KK}Z Аy+m"/˛7oe344EMe% o1[-K|7p]TDBZ1J]/{?>3mmzޟ:ȺJ+GF}WJ)ꃃvww9 C~?!l@8!\/CO&0liiiiiQ^,{)J=oj"Tk],j;,9򥗾sFFɛ7?z?YK<|qĢ_ u+BdYyCC7u__u$Y[dm&#pvdzeYBɋDυ%yW70Foh�^#\"';@-nnXĉj}sV^}5<�~>8] ߒ?|q]}꫕a_n 4-E U1].\4H}cfZcv^~isύ^NNo5;$h!jv�v#sw'M QiZRyw8]~뺮5M+R*-XݓOW]}uя:_l]ur3UC0 E(lT<' "Vbh> #~Ζ[8s*kR>p̩}ĉA__?o=L0n0 w"U%HͶD"!AET*%ӠDs|ҫw+ ryhh4͓DTz}v۶Y]J~zMW^|1;cFaWx9>ۖ57l>ҖG NkAS--:j W|V+ox C{!nbJDTFM, áH+:r5 eI\h۶]ٺ5_HKDuqFuiA4glu+>D;OӴ؃,a*J.K1RiP{} OC{^VF̐D }$Cށ4Y*/~ny5ݹsŇqɒ%ryCww?t 0Gk@(ٶ[+Qֲ >h͝I@*qobCִ$(ki*K/Y|0<~p=ťa?/~Q)ku|u 44mveFO^y՘RTR%Lp&L>=ɈY&b۶VкBnN*~lL�� �IDAT]wo Xj_)~~cO=7~ r4ڙNy[ZZ[:|V{6X>exNAM>gc�+Q$npECN8=81y#ڊPikMڎDRGpc7 G*|hS+GCz=rbG5h/ 6fiº%Dw9g)z_z%KҘ^"uacX,I8p݅H{8K7qb?Q|j0__Z@apAhG5{nz{{͛9)aApa<aæe5)u(C:s62b`]DW)r{Hc3jg.$ ҥش$|2L3f8R{nsst$`OVC GPweyPQ'=VU7ꩧWk%шM/( 47jz}T"geYbq``P(AK0 ҷ&`I%p.˰gi<P `�D�Bs>RH1-5U!XPq\S|UT[BsO9EK$̿5~  R[zW^}U_.qվ+ǩH;Om.4Lbb KHX Sr#6d6F<Sd!BgL€8F Ðf؃LTMM#ChD C}zܬ4k)gO9qaA;Y>֒%{dhYX1՛k)5n 1&lݺu^o_ Ӓ0 wICZioZ_' ]7׬1 7.Դذ|іeW۶]7e_O_x1oڰ.TC &2477&[[Sz*͕VR2 %wm&?\В XN9󺕚T.N1ͩ:d) 4뺾jJu8;D2tMԴDb\, 8uݵٟNT*D"!bQrXBå7DzHP# PR)XU T7�jhw0%6b P^ ! 6D6&^BArV/. @R-Z>x܁? 1V0T/_ݩ'0-+hY$72)b* Z/, Sx``Gfx3$9 X]r ~H]4DE.0v43Vl׀/3J;ӟxP~Vz]'8 ;sO(ٴ0&p3̙-z͛r]]/+5>JAMm+q{ Z'?_tio<PJٻv9xu?ovs1چ 0A'YKvP@Lb>`nukiږ]Wrx1PdYVORqzLOs󩥒RڛoS^;pY3WKz{bdj5 +m{8}3g~1{uY&^,0<R oMDErPWqBɂ8fE%k }VBӛ0^E5#<ȦsU!&R~;HE\yؔ/B`CK̩S䬨ȿ�$歱'ҹץvw`#¨9hby@ xc!go5@*4 X2Ț#I*@C^=2X-At40yDS*䓚9c$ւ  AدVB'̑(7TREP:PQ!0X"?餓&LfQdj kIO5]O<m !68hv(WJooߞ eI?MrŋA5y0ɃLJ$Foo\.Ҳ&oӕqFOTzu{ 0ǒ7 ˪PeMlioӓ3'62ri*eq^gs/wN?ڥivu,֯__r|weY:Ne1~|\dVP5ub>0#FZ ;R e+LEd8װч 1�l*HPdqD D;ꐩJU$._C.{|i:kE@3\r_D8>%�pn+@AYi{,r6͕P,!�tE�@YH$\CvcIEYgowquw]wM2 #<cpP7 }v{D}ק4xؚ5J`p#ʲ&V�ǀ* ߗij:88[TTYfY]axMSS-4 Z(ĕ$`AR6䶒K5 �X\Ԥa_~y4N�ƯY&N,7LjwncG״\\dڀ *]OQV5 N}w_|yComm,kܸq(ƶʒ nU![2 RNOsf%n"-dNHrk}8@e/#hy!1EDkXsB%@n'-Ց Y9M: A5sx0o$ IH9f;G8GNOI8w#zuY1�`2 P>Y'ǏۯJŵ,YґTF @۱CӴ!" p}ɓQ#MP׿ƍ[p+,n$}JMMc:*,\o+}] @s<bjU@b@C!T ݈;;_f2iҭ23uʡ{S*uk°X,{b~k;k'g>~~\:n#TJt晏ϙϏ<&qį&OFF1qDㅊ .IBT*aiT*4EXZit�^gkK6X%#,SC2FGH_5$d%-LC#n{ëvWYjxwL?MSyTGQҖǻ"o-!pOxqod^8 \`EâGc!g@YNzD!xЖ<Z0~�@}V|ƻ A3=@̰qڲ"Lٷ nwR?ܺF;صk{b4x<~as9mmmr9ZU5z [`n<+L6~DNrv][a^OܸLfgWbA~); Q]۽l wrG>2N?[e:7%M?hwS4K==L|u\W tZ"9{ 0rYrX,J=a{r<w|_RϔU6B;tY)])2$ڱdip;i  @|@̀ިDkah>Ã\qS\?`ScB1H!.<7�}tx/HDꡱ<fGl p*|=9X*gOGP}ˈ"rC]"+3|=s-$ O>%qO}>;duruJ8q\`\|~"B͆3zP)9Lmc޶RH$vݥyx|kwivU*Ǯ_?04Z@2յs7ƍ{t`W.xp?{^sph+8YR|~```ܸqotQKKDHR)* GnD;D^ iVD )Lݳ#(8i# &:YRʫZ]w"%؀‚J,:C<gj͜Y=tZ6mSfl.# u:a AOAHDHل[KȓV!L>ք 8؈ݠml,`Π^FBft 3z6 ճ :̞Dz y0PV]iQ?U)Z0J)V}S뺮˖|xXWo冡4Mot۩iO|B͙>T|+hwۨ/TeyGm:rLsV>_TNW MM-87,[vܹéU<Tw,Kм-+}q<iedTN˪JAtuu!ڃ4o4M+ ===|~dde D&ÐΣ,x/ƹ])_LgX$bh!/NmJ0�-oxDdm7 j^*MJwi]ya@\|$pЙf:. A[dzWJp5Ha)1`?A )Z 0%ڑ)DSdK}6�\KyYSui5izu1'MEҍ11L˲$0FnK~iڅ;vkeY]z!v!9s7/.w^GZCݾ}R"[2DpH0R!zYq('vGGG0&ҥzkᡇzwO.}<ZI˙Bk+W>u~JrOsD~P_֦5;QMTjȐmMӳl6ގYTKRTrHXbn!Rz\@[ȓdC<a\A +H$ޒô&?& f$[ SpG !ᇭC_rI'Z};L�eYȟ.հ`2Y�/+΂:<+Gx.ci吃= &頯'�u&99]~`;,Ոy(4nZ)_4ͱ,wQjXXDj&@J~-uu}\VJ hlaجlNta o$;Ͽ{jRT X6SH]j#$Iz˕LRT(q1V MSIVZZ[gm4 !B螥i`iڼ ?';u]"IGYryddDJ0j\rbqddD E3t :vX69X "(i,}-"V2?@ :QÜOteYmmmJs}͵ /zbZ{= A` L ;!yV ?lw"Op,G נ')@6djR9&d1bD;FY t]i[nڱمְEWRN 5")g(}y.c`,7x|Rm70 mz00`z |P7 /8NM7 m!FLbwb4F :q#2888hYq B,񾾾\.ӳRqMyZ-8tt|4͠qx<g'zIʘM?-Qg. |>K)RT,eT*.x:<֠fee*.фGaD&��,S; cdH'# ^YCCZ:bNe󆩔H##g�4l"t dET'3_ 1Gc$wI*`L1ͤ#�#€t`T5 'hIBel7Ыe55վ]CiZ?/uvZ?Z�J-#Dd8 H{Y$Mu݆1U]}tһD͞;._]s}jZ.s_f^j=�Z~F]ј wt]7JɡPKA$:y/V=R޺ホa~)ݶm񮮿쳏ۋ-k5״y9bۺOr<W.y O)uulnvDSSĉmjY==M] "K>ߵk׮]z{{jZz.E�$*˳ŮP$c?eH#~D[p$+gIiN#'##<E &vZE] 2yEr$ 4R֭'Аaڄ w*PII{V<A|q^lͅ'"N wR nަ"6*4nKXQDNJh?0R0?4Bw`Bgu]Xpφ''ХUf /4~Z8ڪp_u7eˌɶa:4 #c;3N{BƓ. Cg=&ɚ9MpB"/G&LJ6 $@9`n8\[1lھT;;o3wK655=NO]>?<ܺu]<sO oo\d#/dgw}㝝90%l>)S ^4Yi￿۾ȉk]L&_P \.7<<k׮!aɳ+jy L̤ cUsϘO�g::|z D&''#C۶+ !T�}e@x1@JD�$10_~? o|#yšR.M.c=N:#>81ə8PΉn&8J9LlB䗜Vig 䨍R^AboÞ&Іaٶcy+48*a3M?3GFDz �+ As,]"ČUرCNpHj"+fe Z: ̟_Wo~ 0_Fw9 x4F27&iiʖT*r9~ k+XZr9S&M]bI[ą gtRSa+S٩Όt]wJixkU&JygܹOo\YhѴi?ު/.oQ*zzzzzzp\[$,viG25g"$Vͩj" :n  YXZs|^Ajnn>Cm۶n: ECQ rK{Wf1Of[nwR*q-,0ZVŬ5{0o&xM/iVsBHя6fDRp;̽/2% Z�f%J�bAWtP 2tva__GSONuGw;?:@B{/XK]yy CWm%/N8Xi`ͅ s]?83Cr'렵- 0R82(www' 2R.S* Wg6GsLᨣ|]eUsN[dRiiW\YL)UZwM[ӻvit[;Ntz>44e˖;wnX�� �IDATܸqڵk׮ݴiSooD>|0< 608GfL0<pam3$92,%tdy n`"زEY<�� Gc7s(a<AO7MÛx Ks |Ayj@o`I=˱w~LPb764y]Y2 p(}:######)rh=gAI۱FiWj}Lzu[ܐJ%ɼ}x#̪� ֑`ajʜhz)3ֿmx<+JɇJ8‚AwX=MMMMMMBBE^YTep4H$TJm' &{om/:�/}/Y}EVx3ԂgJoϜUWMSJ]{wf\կZ©7ޘt)>r]6lذ|zk+VزeP.V8}DDYQ2YlBP0 #bet֣đie=$asaćeh KDS>bdddҥ۷o kPq˛D<r ;Վm`DIUgr+dc|M7! H"%=Hn,"^h·c-`P<B2"TVP& ?s/a1 ,%fyfhk{ѷl1x|݀d@BG"r|�*-X ,t2e۰z<Cq;</[ŋ@R`@ ɽ<!H`KsN2+H M⍦ieeSN4OP,1㠅 ;^~G}Mfkvxޝ9s`r*vMWtKVA-</tSr5m##]ʕ+sΝ;|\RyJ92Ro(%!$|0TJ ݭ`'Ԕf2^\IB a51#=`I}$q80o7cX!|b&@b(5c"6jw$ ҠW61(y h)ROGl:c!g>(KYV=8]ĥ+\%.^i(ۊp>1yC~릛~|5b˕f=W25r,JUuAs&QBMDȵIVa^Ayr v}}}zɓ?7<<-tznRjj%/pBR9\zk™3^ԡZZߴ4ߚ:}U.j/eyb 8Y h܅&0 H&h}s}pƋ#D:8,u8^#<D)^@C/2,1a (,x ";ޭ,{1ɱV% E6# x~C>)GǀrP7Hր <~MUg,~xO#4Qvǹr(CKzh0!B.8ԴOaS{A ]$):� .c,4/@Wjx<~fIަM)?X<Xh$=Jz~o~37mݺ7l>;umF (ˮ-:MMJc^~3z? q9d5Prj6;-�7dNYP4xDDS7ڍx=-r A9:[H9rFްrx&LEE9(_|3-q9&ak9R*@sbqg4VCH�&X/?>�t5v4l@2I4FQP*Œ�h8S W9' =I41vד-'r�d攔J)L+T$\CMߊ܆TC4Juvv S�g$DPҍ PNS\=K&joذ(t*aMNlҤ-+\|}SV=]=)O^zie=98/NC׮v\)S57ה)bd2Q hƀčԎE2_A@[B?"+X$Л�/֫ %Q2 ۲a$D,0l b�(D8Ki+';3;RR�3ҥjwP"H�{@ 9: GkcڇV6T*b @r+v7@G)bc-ҙZ;jd:;/p 5�"o>nܸT*yfsD .U##bL&'+w"jPMف2qyoqb1!!,kvRҴ񳇇|ڷV=孷]/tu'=U* ̞=0{s###B+o(|ओ*ʄ].X& :uUS"ȑ1.&L4 n('Β`F'yL`Lwd}J9ζf 8֒UPyd v/ 2KB?ۯᯀD2Fx,Fz�̪Y}xfC@يA`rsxMBD<5Ǵw=/ I%pj]B�' �LH 8沎:�7@I`^FTj۶mÌtP�7 -cN]촖*"�)2<Șάbo@`AT*QbՀJeP.٬i3w챬MzX6ն___Tf'LpΎ/Lbwġx,NR(dO'dzVyvi",KјY"sq2'@䜕/qA#esOC"ܞ6̢F|5m۶ġ7 AY~1Rcn@XHS!Čc74#ҽ?*Tk{rc4n9 ALFZr.J&G^B*kS0r=q1y888j֭۶myhBF1q�qwj([磼Xw%777)`x,/FGApɪa*^hQ!"BP)ZvP__X<dʚfFWWWwww6u#:-JbajR$L&#80>G- +" ro̫Hs/lĄ=V<9OaLE^@_u�k�J^ i IVE�B]=A;G_cP20FS&7�MEJXk!; `aeK) =biW!1Fi<x8$B-`ydHtG"NSaLmqpܹH̓|("=#ZHr0=l6 xXX\yXbbEC"^ #6BarveK4mVSS6lڕH%Z5xǓǔL&aw/cn0P"Iy8w5}D1ߊ$QRG0ddlP\&{rJ/%@<AL͕.4"i]@>I�.Q0s0-;HXک:vAP # LqߏC䂑FOChN@&Y6T*H$A_>'�Ę![| Wlr%gA9@0 Ka---Mcx%ذ##>ߠ r4. <D8 ril R)+ ?=8))mXA4 H/X 'J%hQ\yZni<MY)JxP.*kqbIɂ Okit2ʠT)[8}3:IxFɮv2c<  u-u} Ըjw.`(@Ǹt 2~(!y،PF*" "+k{ll ] YgP5c5+a69pz#4а�<9JY,fD@v@!_DF:p+JKKK6x ^>3wfΓ~T0JBo4;#s-3|/ a.<9Js?ƏOEO0,}gY#rq~c@|Nܢx<. 2%b, f#ވ '?Y�8>b4 pҐ(@Rֶma(qbLxܪ*/k,Qrp K".qx#bTV2h�0 9{> D`+aW�ޣ$'F:+Z/`y]!H"ќBL8|9ŕ~W$LN>m(q o@###mmmG9dpm[qheL&#i $TleR)$!&3 KN/Iʚ֪Tv~֍;wJDimmFAx 9A+ytf^@nq-x9+8y2.XBuc <>u QNR$QNalc!+b{5ȱ8D `_ElDHHR[љ5c%.&ƀ<?Apb ȗJ%Lak,@iD,2䡒HHCF.eY"-p :chhᒘƃ[$ļ5VFNeY"ɼ�IjspID$}[$wR!F+{7`RxR1 TqJ_u݊Ŧb?.ojP8`Ns]͛vwoiZOtttu4W#] SoǨ xgba0Av; /Ƴ=eV4~x$[ t&M;wŋW^}=ތ][c43名G$`V ~z۶!2$oɜ2`ܞ,i#5Fr [BNBީr9p_>,$b"1`i4®r�xT]8jJ匆A)4,V(m"άH "B NOԗ<a o@"r~D0 <RY,8bQ*@r655k " IG覹vҤJI9eYjϤRFhۡ肟sNjfɤT*\*ps6/BW`qBsg> y<AxC=?3)FKL[˗o߾ hp4veV PEfe"D5 PCvWD,E iekEWo ;nJV�,LXD#]29< @}J<+: G � sYmsgY@Jf)�nC2ł=9c7+h`ɍe4CBy<lZ�4c, ͛>z9ϙBOCCXf*O֭D"QV�|>/GTc :#|69tU*LB6+ TBUv}1b :GЬ�ߜTP( .j n!C^k�)@$0jKpX2- W"b$&cU&1�T?U"qyqe<a>2Ez썆+cNH>BvR9WUCp<|D a�X't)<լD*3!R$ШuUJE>ZH|'fB$'3Z*'ApA,3+?4Nϲw@e2(SJ -*-*m *6uc{ٶw<C C!w~9V?rOw;P }_׵֕e`=BiF}VONNZnj4l[E a,ɅX5+ j cKh b!0/mȝ@uQ@Qpq06hf�A>f V/=T6 DU{*"F".d"ZE;z{D{[��bt$xx֜k-r'J":8rYJ]g:yFACuPC楜TɅ} ɽ5Bl+Vfs4UI}9]pTu#CُKjڱcD~2pKvkAuˉϩGsEZ.{G',UI".{ffFolsǚvnTVU Nv?vQ/6g Nt:+ˬO{9wB/oBLN333 [j.Rj)j@C՚WcB)[4 8!l4�`CCd}aZnBAo\&ƁYԢ YT-GF$(݈4C;lW,SG�"yOB߇WC0vRdEG;͑:5SrZ_,?ƂɰE؅�aXì^h Ig}5dpu\I#mv|_("A /J 7oY~X3>YQD7Q<&F lgtW$9[id' *V+pw^}AoݲeX*3{ջ fyϫ^qEwv6~{I`.: UwmZv[\RrJKltc8 \'I Lu.$x,w#=<,}QDBo&1,=Gdn.sm`sf1wMGCI6kwNuP;1 Fn +ۧaR[ }o!r "as4$CFsh'U\|Ju\W8 <lSVwCƎtk\:!'I ӝA>| am9@UYF,×hGAm%6JMi;s_w:V*BabbBqz_+JQj}q^c  Mi UFZ!\OrXm~T|e (ӆq X(G!׍j xt!~Qk5FN73�iTOہɔ)l,v]b`*QQUmY]吳5?.}HX("(k.-9i|-{['£fY6c_xa[篹&o4*T98zx ~?I},;Xr6 X j*3F8tEh2D6?u&O^s*fڂ~8k$iZ:'{:#3nttjZ-1 (-7o^lT˲v]_~y!k.?g{N_PTt9ƍ)xiG8_8) aXb~J.GQDm6 [ׯTm�5s7kp�  !pk6w"o-*ߢ<j\t9ݡÁPw[9Ko !{Lšu#\P}sA kpу.:O )]rI8,ojҫ&hh9�� �IDATI*}m]zieK7I''o{蕯. 0xJTeÆ_= 3ʛG,jؓ^!9("A)P!A<O0aM(7Օ]8�`9a3==`0@ۯxCE?[“X.nj%huҾ דzc8m&)O?WSPkpCIpve]8yLD\/j Ig1tpN͹Hy<82v9V L tgY/@ y݆auHQ Ddzr> ٵ/D0̨#  9]7x_:Ē,jRN:o~3QտB>8+oBG V,$|I[|ݪ7fq)� υiVӜzh[gI)GK& sLDpnnyݞt:e <@WOj#COnyT*m|s7>+VhZ *"XvXqɫio4ۙVlʑW=KDF[z2/b(йtF/(pl4pFFG$6 #\'85h6;�ERڝ=K8jx<{Ht-relF_SAGb\Úzm>3l=;-+8"G(%uTG?u"~;{׮M9_i:8_%E$`o)E7�G"J<P Ǯ` -GO &@"_Ld.�vSSS=^7===77'^JL3 `IŵK܇fJ)zԩF@.YW1yo?oP G{S~)G  3ѽjmObQRN\x=h]7/]%bXz3!)q\UHڇ ;Ȇ�mc꙯T|DIuSs58qi=[nƴ]e/44>P~{ <Ӽ(.'?Ywfp{* ^LΫ^0SbhQ@E=E gƂ8vuÍ`$ٸW6b:Ylt^,17E#0oVEV#rWR- S~ɓ9.UdzzZ&J?@ݠ@Yd,!ӉμwN 7(;nO`~Ь*bs4xa+L1h:U #_Dg@z=U�1'Qxcւqdd=aAScB|0r@ۿ580;%k$In]3qF_j~PUdCرm5`=a9GB5{^^ 5ҍteh({̺I%?Lׇ֕Bsjc2-a0͓BצO!r [rŊ=^5>**p|L?O8j+p=mQ[zAz2L11^NnAnӝ NNpVe4X |=/jsԋxOUp,sA|-h[/\]B`.{ehaq`qv+GFurdd?\<o~P[L<~ bqxi- ҇~{!dy*<IYo~=ϧr[DJ Hʬ' k^>z gvۭn&pf7@W?<uT*BOj!IEPǫ´†*B=+WQCBOjՙ&n+k(bFAкxTŨ=LwI QhԋnI �55 @?Jt<0>M&X 'i;k 6VէÓtW'py62'FFHsOG.%j[9K a6X( H-JD}<'wqNs+u:xTY'?9c]я4$Ik'?9O<ܢ㲋Iٸ)dޟ qKG_݇!;v�!NLE]n7K*{דۂJ48‹vm7o%ӳ,5 bEd055577'BA^G F:. <k%B۟ԲmQ̄(3~ډ3 OyYHܑ}\_ILK"I25ajETfjqH8D'Ea* J(bq0p}3Hqb{{2r,��А(5aK|] aT*?<Mӻ[J<]$I\֏֩O~J AJ?^T<7Rfl؜>.< LzND8 l!н88F ҩ-]n_~jjJoawWh?T�ѝ޶F!s6g$޸H_%<;@M HH\;7" Vk4qtdVXyKks^5,wL|pCއ1zbB}! ݤW5VAYqX <,LJq:%!-w $‰ ;Q"?PbS w9,Yqn]W[(mjyD98xŎ;o߮s D :[em TBN_A\ : }g4!G5<lxeQ;!+y*_QC#BR w_[v+~ 0:·_)AyRꠄlZ{mv؁1ի]Z1ߥvɑ>\.߉iސ.s6 Z^Ez@$bTAM~$ k )xG`~ʽp|&p.`AvժUSSSr ']^aJ P,|дi萡INUa�@ڨ 4wz˽K`gBl.{:4LV8ʕ|[j< EU &nKJK*|&`@tgWwƳxF zF�AlhPڵkCf|MA?TTTȄ [_* ve|̌ lPkʲޚ3,�}G-6 fW D5ǻ{3h.KHA8ѫ1gq‡Jx.J*v%S@{=[nED0vU�+&W[< p 3o38r.>*fC|`n sn YzӧD FxV{.[d4z֭f%V,>eya~4XBףYvBm%XјHpq )',r:SVpI,T#vFIQ} R| ͪWtbK$*+aPa7ѝNG9߰ VkbbS@ 8a=rRe�b/GKOAWz IY<kar0UT} X#?e݊M/Wd֭IܹSG 6>.P5D]-"Gow!xQ?s�' %,q4*cXAn爖>VŽޏz?|ZXXX^NP(getJgujn̲B&?m3_npWt:##4F!??;]WX(>9^M\n?'sozS"QG~;< .x՛/(Ozwڙ86o0'1(rrtYm!6 0d'd>mۺ|Aqz=Ad4}g*fgSa>\( W pd ,f,Q:a4jyk"A?hoRl\LBC& ;55u]wD=5MME0ՉJޕ�4 E C5NaAbJ!B)<k0v#\v>l0X"@# 0V;La&MϪVo+{b:ލ'Fry4 /ߨV+RPvY~b'_Jr!y7xf ,[.*Lf XhgK++[яo~s9>g>: ':Տ|d'FU*X1}ы{˶sN糧ҼC^)Z-tT]*M7yu6} n Sc+쬈p(`~~nڹsCmܸqvvv8>>͛5HIot$Z8PK-P yj P*yDdTz3*ݩ�uuAwVW"ϋ ͤr 0:7:Dn 0 ӣOKNHcD7ś9AB$ڟDq2t*3]KlԀh,{hZ|գ,\>||vizBn$ykQ(^+C '__7O0w2~_+at<fwz^Z7(?YZjtR &ttYKEq^f 7<B;+BMdl;l;4 &(}Dž'uXHf!ZXG^3Wܐ,;H==(zzb[1RZ XՌó89�,Rރ Wډxca^zqwMP) 6w{~ѬA|x̋!D3Og1!2^bv0Nv0siͤ @|h3c<.}h+X۵U,^}׻Pؙ$R4dNh4zaP_.X I.M4^uݿ˷+n}M_ |:IYhjpQßG,/qvh:=XF$I ^<qr9t*AX%58' '~3h%^dʔu2*{7 QZՠuUɉ_E J"_ʦΝ;% *kr:vE´,%W!+ vC.@Gb =?o}t8X|U݄7MARPǬ|VŸYsm�CƣrpUE[-h?ˁ WRmJrvk#9#HLPv5x9ϟ翴7ǍFBwP}&^OBFO? &Jcbqp?cG_~%/0fz �2V͉s`l=6M!Ć;bW_~kGR}t+ <[~n[o;׶#G2AW[ɞ*ʄ.oN#T:@NEԆ|wdDpjC ĔA9YF2(shT} E:sŢ fzDE?m] Փx;wT,k "|75>ꁣ߫o Z ݦ͙d!"a;}EHs]0 /%pG%H=hE.$<kYV $O J?$ &',Z}~QYgn7j6۟ԾȇnC)^=55}~CxYD�t)};%ƉR,t2nUY|ctN|ػ |VB!s1vmci><$[b67SCa\0X3ᠬJ,1`nnNBF!ܜ\S:aӊ&TT QMjf2!g)5vcE R�q3'uBԃ@=b!U?#09,6 Nd7)Z{#J ʬcy#E~*_ӠlJ\!,[o>"bj܃B TiTB#g^[D'Q(Vb\ ?-'LSb[e<c8OJ|SpgL/ǣQP(Wj<|R9p\w3^(ܱqf=㎫w^5} g8l[vfQ ?dՒ1%?- χg=+XQO//\sM?&&7ߜ n,+]{sګT*nq{TJ2MqiOf4J%Gh'''(T)ɝVQEY"&Tne$ⶒ)Sx8*?7BGiġfq]FYEdVA;/g\诰CCɥNDv$̸KgO,, cGj*i嬴O6Vr-KA88w#Qv_xZUЃI6Y n\>o8R]S*ѵx4}ZIizs)!YV(.xo+ k)_=?~cc LJ-H}FZ<t$,ҭ0ϟ#$uM ]׿6m^|ʿ}wPt$)} _V-$IR yIӴ՟P YZ"d"z1%90v: [�i*ALnV\U8u4"CaMa+E|V%,m"c r7`+~�Wr@#yZXlBE:~GUbE`:ngAx80|zǣ^\DA{c.^#Aّo_ p.%AtgTRZ?{&:.@|4 N=9˒<T* m۶ӟOW?jgv2#/NA/Tj5Fx'&&,^OC(uIb1)}gY=X^/=70 ?.IѨ^c$)Qn !v[U4fguX xo:]3=.^דm6n.uB`knn3.AP5` 7w!DA*ɏ0L|G'K~-(LN D/k:Ty꾢>#0"]~t:|r.r"mET[cvG).0P\2}`kqt6[FyE)"[m΅2[qvJ#ꥃ_J_.iz03~)\4XL-�}]xzuzwַ7ouڗ\ZU/KW\o߾k;9zֳ<ϟ駏^B/^K_:|ыgIŸ;b1/8~WD`ӈ*GZ4IեQk?�M LcH/L�� �IDATWh)%WXn٢V}~/uK7vjؘZaT:m_= 9=10C6e =-76<!cO!kl <3"w`u?z|8*(/Z~8 :` ъDP? a `aGE -;ODaAt2hy_@)hGya?(6ĉVsi2,ZY8<-w6u;i~clb8Zrp^{w׽;Yڴ)xb{l6lK<կ<VI| ,~PrJEyh9 ؖn`+YcB F'aޅ2S!F%>dRP%H7>'Nw2%8]e?<98@ $݁>Tdua40ۣ3 a3S=9;Clvv>$W�\Q<}b rYB_`FY"hLb%$2Oӷ9<bz1LׄTh=Oƍ_k.(LNv?_Zi#4BPBsϭ^~+<ʻ;AON| ]d#56R"PtputEk)x;meu&hj,BQ9FI{djefD:d=-yJ^�!l> -2$'MNO: 2UN㦟nkϮF2Ktjc Ү  (cquNd ҨB,b#ӽ>h|:3-,7 ;,{X9K@ 3Bo]ˑY;nU^ A pOsҪ4ZϭãՃhy,64m8]ku/osNSyNAz%/Bo ~P>tU\ӿu1BsssisS-z"P'K nLG";|SӅoeq@! vZ*tCZ.(<ih"Q0qY9%50'4E\J}MouG Zެsnх3IPEh*?WFo!=!.`ze޻f\Brȉ!/@g-S]z}ikybH\v~5p+z,P,E9.|(g@ ]9$36nLN9b0K!MdŊ0PN?co}+ =M7%G֮M#^}..u .h\yer]ΌjO%Bh2K/C^1L@hW );?H߇RsQTԶny>33䇡36D͌R[_KHS[tєo'2p.m G+RݑV-:#jݻ֧Ȱ߽x@3 g Fԝ�6 %:=O>ѕ֋)hY9@f. Q�(R.r#Gtz dL:bSshr*\,;j4\š5|3׭[aÆ ~=1izOnaB _\$\sv98vXƺ]{l"35e驧]^{O8֛$I?z3'XZ&W8#/6 bd=^h>iu3HVpC$#J#8ilW˜k,tӧ>ѢCE&T 9p$h4͋SwGsqpK@sOۃM fNtqzbL�qc4<QTA|'ûS\g4�l\b<!Hd@;έ |84؉~5g'CpB>`\qH:e]'iJqE吳 tGNr�D]w,|A]qϮH(Ih/k>8}٧=2;M)QP9˶j5|RH8J ;uxjIvOg;"O|bp,{oYg><ϳ׽tqC$Ɏ<Ϗdn5˲C/.pCaXO呜~/{WRھ=\uUu~G4%iUTM P'县@ȽClȆ</0VZJSJ*ZraKi3L\|"1^tSpsi?d o1ҞA7MOu6 n]@VA6yFP"xL$^1qЩ>×B$#Ɖ0 R,FX"qMgan\s ;C0�rYb`K{`gOٜB(L 8UoݥLZCybŊcWw{~Y(\VWWCXIW1RT3q}W[\ Ee=VVrv-|je;v۶eB/$y^,}-#ٺ~iR$QO%ٸvŮP!;!*˲lrrw}lٟqw: nB> `.N]);[J,-)qA:+NMMf@'aZy`FI)|{r&X4~8--f#{̌<&xl\~W£Пt 'l:'S%sTLq1JWχRޫ%:ۉ!ST!gɾy<�Ur\Xb+`Y�JH诌lSPܶ?!nݺvzh[y;՗7n5{ |H  $[i:o֭#eYuΠ hT޴]( G# kCcH}NAs_ܺ'<aӦMLkڹrvxd5)$Z%t8p,b>5I}g6mX,%A\)-:*ph`XAG6#jjZ \B0K &Qa78'C8ꨣ:~Wz`|CT Uc IUSOIw-q*fkn�_oyӞQP+4rYB`4S'@ba4~-zd~{~/| t7m:fzܺO}S~sժo}˶m+;3)y}l%]&e1<1J >Y2,<\B\.}wt~V5??yd/rKi—ڔCF)3-n46Cξu«j-ɦ;vy}ģw5, 'vY>=Е+W7oc*P!v)&>5(y8]zi3<cyKO8d}~נOZ9*AD�BdQ@l~Q(:b[Srċ�݃"c-FQ|p8l4˺%b6sޣ3Nw4}.gB! •m__潧)o?grժ<)w{59Mq cO*٩|钔Pmpts豐璵U8ir p1۱x� G< !4?oato~; d^d �%ac"Ysm=kuMOO_6lظq#QY ŬUN^xhhŮK<3׬Yꫯlc?o|X$NR*"p}hz[ouffmڴ "BnId-ҽ~4EdF�YѦv:*ěr)\AA۞`;'!g5Cq~R[F,r l+WV*m۶8'1(a@pQJIbZx`ppX a4M[y^4_B7n^==cw<at7x8\u:(]J9^a�X9hl(CQtw6[V?[_$ ,]%�sGI"c=2CڎB8tfتɲlÆ 7ogP4@ң }1\S|nIF5pqޚ.e0$Wvhd}=ciзA  4t_ 07|p<}@Pav(`pc/IԗCR~Uգ>ZC֝ꪲX__.YƗggkm׽rOo;vKElT%-h!*)Raw}C>MIIO*z ͂Yn�o�pZ~a~~~xt1[ɁT(Ruwx~:Bg^Ua,T1Om"CXU&M ԑ.k01Z_$FfeP(l޼+VׯTPOӊ7+Ørס9xwT`v3 n(cx4Ûv 6nR:(A!xPVf }&.�8a@W3@;h #NlR'Çf$Z9K5N9\R7q AOpz@`7Rg٥_pqoww߇ŧ BȎ J@.enl46*xaeY oH֬)6_Xɇw}�Hccng^`b#܈Boo40؏?'=HPF`&Pfa8 #8nG' M℘6WJ)較Wbd,XZVZ~\R{sPtV(ypr{O", isK\[ӹ^X ]n#CXHZ͸o-al{PbTW<�WB YOs C|ilٲX, 7OIRs S 't> .HgϺCwWwJa<K8=S^W)U}^Z*If_R:GsK6g즛p�o:6d kp� +3»wQdz`0Ї;Wu 5q8G`K(&ک.d*`XwQr,Kq9 O\}BeɼjՒYb(h<93D}{=8Hh&DxiNr4@FYSRsPZX^-%x*`@L-[ ,)t_$YM>؞y~@G&IBǰI@9N4dUh azի׭[l6x|p~~< Lryp{?A:?Wܾq#}0mu5Z_dztqo9vUҼVRZ ]+{S ~&6 vV:b-$yN9Q(LOƽFc== NA/3eʵ:5` /`E. 'luwu^%Rp-qX`F [V $Bs'٧p BI2.nbn(=k`Ey �%r>@ǑQKH"b7l7j*B؟b`L03F MF:VzPf:qo޼IDu^.gQ|{fsP,n{/})w~ #:c2NaTG3Q H@ Bi,w _Lvro4^,k|4!޷xNzFR c ΢VG'?[hHͦ^<X>b9N} O|3gggoFy)^'PWO ΢Z\XSEţǐu/ h|0Y6odl8SEaFΧ\M !D5n@c`.~z6liJXhTnr̍>*7Bxڵ{챇AMW5k*w,˒ ҃zkW5{ƭA"{W*pcSJ:>w?x Kl7r-H0/4IA>4-<@}&~KF-@w3,>O "X=N 6AYaUWRw;v@,B 2,vn4(N"(}註EBiV,g%7<P|28#"Y~Mr ;<=$j6Gዓ*-b9,e/c'}XD~Zފ\lG<4ox| �ZM#`B]8#_zڪu< gffܵE? 3dM7\tQ},OT_/wJz^w{]BHhz$ Kp?'7]; 1t3kvv֫@n q.x"!{nq.GZq܅Yc[t+2tͼ# DL2T0gNG<R6b=O[PP* G3BrfcN42LZ9K*B'z#,HLtiVB.!N/( Xȹ$˲;vqSSSfs{4sك;~bv܅<2 / n$WҹXw~o{!ms>K.^)וsύzZ!:g{Wa*'XT>ǜ[\-.\@b�Y*zST'xYR1J&'p7+o-£(t˖-~ # 璩̅*&N } -L}rrK D&}ʟuG2ao4~{$#xSZj 84\m8Ke@r!ΤBzh\[ǙvE/nQ lpE ^l`D"'&ܓȻ3m6Wlsѩ]a^w 01Qp8 O~spu4M cѝ"`@Nyt|eN<u\:~D >V+tQC.3>su!^Ң諢98-tV/'!�!eD;W!u.р~z,V#0 oip.gꨏލ *W0PBcpFX,4BIvh吳UD  FѨ^DENX F|}kG ^8SiI:[ޒE`^nTWqYH,˪~wRW N;o'c[Tm'l.f>u<M&&ySvyINf>/rմ]6s1&dxnޖpjOڼ�ى˾tx-0#8٢1yUw$<xM=BTјy[ | 7,dA4v0r)):d]`.T~}|#E$6tkXlGý|S rGpsG#jn=o4O{=쵯%ŰD�� �IDAT}ى'v>S˷߮X,&7\y_("IBv�lZoVZH78 eٺުu2Ɏq@[b&~H[Ag,t0,qFO9=FݵzVdaX8!K[kȇyL>ƕjV e,B?yøHd<>3CFVٜF {2aJB =P8ft[v^/ !XO E S!%::An+GƱ/"~}wT09>,J}f_,]sc>\%T&&Fh}w͸kŝ;qst䑵Ĉ˞S;Ќ! UtPnGGDgtS)#9KU"יF5zt0])z3Iu 6D`X0+7NY#f͚5~_N4?9@ y>k;].?ԗ>|.:pA2L!(.ubKd*֠]Xi$p֨8iAW#,ױ8Kj8y[,};4RƳfc X#5%"y'}BY0v,.l;wZU*CSS-;~FBO{'?a8pp\רj53q:ޅ<$vrk4j`r& uo;zAxvQ<u j>!/TotyU5;XPWX u>}-0@=Sdql湣~BE.*IDCչOh:qY`>U�zNcAG5̒[9KپO%f#$H)@Bί w'@<4ōÆAdﺆj5ƹI' /$Ktp/~1[җ&b_b8{g_N};IqyJ4o`@]`g^pӠ9RVē,c2;C$S*-(O,RH `Dǫ[9=mwJ#`CP$v )Vp;ŀs ;>D�hp$en ρtoxhdb/AV^JԞq:I -p+6R�Mo4vr%``Vq�\7h6h?W 9-WVFەզOL'>*xwB s7ޘw:{T$)qGenl^QPܹ&}kBB:,' {؇{uB 8X@嬡/(!X\;ih4粳v;D=U!'.�DB{SvD 's ~g fJpgpzE?,h1'bŰjժfsι9P(|z (m67HVl6;-ݏWnMCȐ #Ρxr h$W x>rh ϠCNe`k0Ypf|j}Fb r-ׯ88Ý+i ԍ73alI"ovm[nu kwޙUAz]I 4ZNݻh֨</)+WzaJ"z)nEnGB{v 4`#H~9C!&-'1cH;+Z`JaГ0[{.TsǑeɠ9Q/HcNp!^{^HlX]{qf.ǒw֬YD Z81|ϥۯ-;IIDg44s @H<"|G' {Ĺ@!YpryrrRC7lذm6Pc 眳=}oz Q m04]eS,V*r> a`ow{ Zw0S/QЩY>}9GD`XFM}@*I a @%!8İ"\{Æ|ÝIDeZJ,煲2EUw΂RwH8S~ 6LMMz�;٩}n? !t6?]gff|º'>f~G{L%[ngVvrY/oΓ:ÒjƝI;Ȁ[:Wu û{͒bx7­2͛+ {/ĩ ֖vzYpܴ?j8=zybf_r) nͬZGy42Ks({CN^>IK!⧡n_;g+[} xwˎ=}GDf^A^IHC}^ chkѴH\HŶڹso[K!n%Q9|FxFԈ2sU;ίI&BZ~,,K'b:䎍,[eʗu4}s""GE7f!rPFse9' .2B(9ٱd,s7 lf2:B{t-5�mT~ɝ9mՖp/ d::oZ͹_b�wr&f;R#RO�LL7P[4.cE$pv<#oĉ3+`jXaQ|,T4H PB\V7%nƾ&BAN䋺JKrr[BxAv7FB{յ吕 ~ =#yyT`-Y[=7Ą9a?!73 X~�uk}K(Bh^kcC֖`>|:j|:&Mxap~F#sl;vGĐ 9y]ɟ{J(<= (T{N`s<gEDjJO=66mmH0l7Wa8�nD5CuNE$拪U%z :[{r>1ظ<Of99r1N-PLG#NXÐYk˩E_||(;/!;zNy 5˲1Ǵ_7QFHtsss~N77 y'GQVOy[^~9M! *~AYXxEʣ]u-9pvݹ9Vt"Fmy<rĕlQ,(&1qky/]Z yN"+6%H4^9$֋h\)):SEGy>Ou'-r`#!T^ skrK4`#q,Dv>2z. oW@\)eh[,Pw Lh$reGY}^o >ӟrGs ޝ hJFw>Uur.l%(I6q>։(SFJS~ Aw: r6a}[Eb)\M"(vwq<aEWH|êGW'xl#UX!ZDȦ纲6ބe_ӈLhTRPOxeMՑz1tgzu/egmN%3T%(VG9/6fg+c?)8N`lgg1̘q!yę˦§+Ίv4wd'dU |y�dCpMpyJWcYi~a-^0dg9"Qqh-wa6pZ ^/Ngs@9K%3g 3EN6{jTj 86 1#񲌔"62P.W^@0= 5Es"J>ޗfMLhܻ5 O&wB-n@W4E-ŞZҴvޗ]v݇+Wn޼yw.YvP$ 9;A$ڣvҰ! 8O :0?ū3,(JP**o`M:('i x)dt  {Dؠ;C_ -{u+ 6v虸 0?am0֭9Xyrtu ' �Xr! Um A"g-�0nE㣣)*JFCMWp41 {K'rL|qO)$MǍiۿlq_\κ79|ի<S/t2QWq>Q ^O"-1^?t-оVq]}M~5dLAQ9GHAu*>uh~uv:ďv aWUS^ JI$P?VW֦X,- ׻PɋVEN3"FRaB^ysp= Pˀ89 ${yYzPKJt(#rar#0p0D`~81JYgfDdPܝʾ^眳u;S'?Xw ,`mN"<nJyzJFn>T2 Pv<ٹ]~e~j."Iq)׻̺^$< ÊjEẄ́tRx{#<_jffUSfEiNt3xw𞟢 ^ґ@ωroB0i4|R'}yLD]</吳�:~#22=|)x#e2K{X?E/oqc] c7)Aҝ@=HDNeywmے_*}ֳg嫮 N&@Oԅ:O,RIIө�y,sB;�_GRPYF !PeGwrs  Ap<ary %8a *Q rE3-It9HOhuQ/~瞻 c^/zZ JKQΜF$3bw#NDF_΅^ty`[rXu|x?|'8�+>$9x>377}vpXḤajq)KYG^ziZMO<n!l2.w/|(ΠܾOs]MƕY20>= [u &- UᛃN:EG|dZv> s"SUW=0%ZflVS\N1Uz&"5�͛7ܹn7DHDThT*V\z*LR[Kv7=i@ppWȁ#܂cJ8=֖ oHFQc._3wi4\S,8SO=uӦM\s͎;@c9*ど] ob }OGi4-wvH1azAp4Ɓ4D :5T D3*G#o3ի1|Ɖ6me5#q"zؔ<*b !κ_$]RN+,FJ7٦nyOqx�Q nBPM_b巑wQ0x7,seܧ|P5o0TEh$!֙ acb׈`Si 򂬥U4ϥ-Z#Pb '-Ep3?,r1m* E}/⾇GWfr ./Q_]guHpI&?gx {i{v/Xm;iO{99ci�Ao}'˾AN:a8/sNϦsE8ݻE#^Wf&=].x: %;5>trӾ}޾+7{9Krs̳/3k�Ŏ{@>|fD7lذyf=t8BpoN#8;1IwDL&8rA8hCbO: +M&D 7uݶǻǾii+,7ɕܽ1=bvvvzzZJ.䍿a ͗ 1~8$t,| c }qF^ݍMzwf"yÐ.q|ԑrZH)g‰qZ_ Վ6!7]hr/O"reVaʽv2Ȫ ~X pVΝ;و96M  YL>CL z}2.I;Gzq_ ]0ɞ:�zzr0SY"7 j>יsDg�G,8Z! OgHABsss7t:T v1l#=w:gG=>΍H\ЖKဥiϺ DaLA+6NLLJ-[8́VW*Y1=j=5h}"˷׸r :xuerY:,tH%Xv`S?sBayyp% (V]E:#u`zbcX7@uEښ=]f "T-`u:r7Id~ίQ./T8XA]]NJ  +4ޛj@- C\9}A GSs�Za>(>)0033;rļD鵠'U>l#T KN>RVSz>ma\߆pŸ Guvs^eup?8GGy 7"cZf79T"3B@ft8@~QzEj$tG_Ԝמ`2Hb'ܬ7f"8՛ΰkb` MȀ;B ;c‹nrw�69*(). ]F}'(p((o<}qA]wδ`R39=%<ţv~ߩ~ NQsn0D@7 %AEo-W*6| :adr}}%cCܾsNpZc?\7WX2?Cп<{hG?*}OL?iQtA}jU v\jPTqFkA/|ؑӇEC}}4�ۤZ̓7}&2bMT<]zMc{8 9Tfp :vSX8ѱpQ,k,A7:|&JԓwkrNtZ`e$tݻO_v8`."笪ItI``:|Sr#W/7.ss^؍h~28éY~}'2 P-I sj4敞?O% Te`!ܾswG@a}Be4J%OZOCOBUÙd0 0]R(�࿈Ktp*N6̿E~IT@簐@*`R` X,יE>Ms)!Izq>p(<SEqr0%/`�J�� �IDAT؀P�EA9#fp, V0qg [h09_fTn k=Pycf>UfSy\OJn׊(R/H-fBZD=ՙnQPd2: E_zvHujY4 "ORAX"vJ>]9˷Bʻ!|:;C84sBhz[Z~?y磓N ~vK</]sM7IRx֭xE#A Q-Kf/v&ίzt -#D۽RH�]2I8 #dRC*U ffĩާs[Nr. xƄp0VrbG<,KBGLB9?حWMlo,d.O^kU54 MK0oV[reTjUsn& �<E[1% v8">3/|& *c=S p*3>g4=bke`?!|.aھ[oyBz)Svyw^眓^tLFjdK P@|G5M A{B,o{?|ҦpGS]"n蹺$MUd2`gjq{Z Qe�CKj)F1Nr >V'&&ofo6_ !2n: QN` fL, XTVZl6_'v@K,{J[d.X.(5llյ$:n阭ODu86dvI-$GJal]F kpr>nnvu늟l/ٕʍsJ{tAV fFtL~�Ӌ,ISy:c0ngou:?{`07<;n'ss_0:nՒ|a?;r g1bœzqyͲ {5k֬XB<'VכD V<tN %As`>@֕:M$z1bM ĠNc=tkfsʕ _8 ~ZGrK|3׼C 9>Oujj@\$d*P!T wH<UykANHr\vY^?j57)X)llhas>EErZQXFup!Lp_iOKobsL~y'7xғF^8:އ?\xr~/|aV~8RTxFuBY|J~j~55tBGFξ/~^?5I)Oj.ji8,9{bf,{^>$jl^OmE:#&- jZI2>tWl; )j7sI?ɤHFѶm4)N$I&ӻ]%{xeL8v^ zDuUL RN&95l^{m{HҬr_" ]TTQ*&W(ǙbyVs9D A~yI ։^h0Qj$thw0A"p_)pկ4#[hwf9[_>Г]OXUOC2/3K.%τp~!{PW!|_,ήk4U D "x#HFoD@zD\@QD#΋ i!@ B;R:Uf푑psUS{5s1Z^iĴ\np]394o%u׮sN=&ifzGժ4/{4O;tT5ffg1i~.̘˭͜/f`м +ѽg 7xC�%n$OFPn<{:,f" Ï/VIOE1&==͘9uktgEQɺ,,'@ۡ v| Pv@G$?Vu@@})4($5 !hKQh}}f͚Uוeq+0�G[t`R pfVP ܌#ܗeN6*hAa88p„~ 5Y!UA`+׻~RKn韟"*{yɦoLOtl"erEW_=h!b}$"N'xĉY?\8Ykȟ,9&6<c86A`I8yŠk(vTH 60v2_βx|}�7vK@uAYvVqEEI2/ 1ZW-M{+8Sl.,) 79O8o<|ydRi엥h`,u7.p^lAi4pQȣA�B;gTSMxh챾IJ+UP n΁ɣB� LFm"8yg=&`HVnmnк _4"/dPp oLԌ[A~%&G.,%k{Z>=z[~pxg<nwIԼ *oꩧzyi}J*&[o-}w/,7k\xut&$I;};GKK|]x;DE-\P !|~rv%QveY{w;Lι{rJe4MmT�axYmJci7!1_t ûhL '=cߎ2f <)؊Z[ `yY[w(nhL7RXt7|1҂߳Y�D_  _Pk:/fhyʤ'~8 ~AIfkn';nR|Lֹ+c Ah;+R8b2-_cBB &<ϗ'N z+7&^:￿=UC^g"b6߼<k1#tS!qY{0~ fr)Ív͂بs7Y[28)x �fM$>apYh}G}sY~@T*A0,M_yqww,{lln<oHU"ʔ3T4`cX6WЌ#ͣ^<2.mk$oztXJ`0V績8ʝNWW{W?la]~ /^.K.vgGYկrt;0HlԦLɮ9eY]h#! .l Sm{Ta~F.4whV{GN8Iuמ{;caW^JD:՞~zώF`BUk  âZ&f ibڤ3qU/\sI:끵Oʁ#;Ç7fK_k"6b#`Hk|Tāe$98MWMgͲ)Vi6"+JRizck,IA_c P#F gmśIr@Ƹ(j,ۯ=9cޭ, )ı< tt_Z\nc6q=U|8^2c${Ȑ4MhEs9Kzaxu\.[@B>FTMV.`p9-T`/.81ɖ[=65J[,1fmZnWl4'_zϛU; Y2ҽr[n)o Y4ʋ+GaN[@w *L6A}U\c/U*kFziqDQ6ƴ:ˋ~٥K{nm NkpCu}M%GP{č@V \tyҨ@b0kOPV=� OȤN? *).ևO 9w=Tf4==ٮ֏8"Mo~[/|rcE#_= l,,JZ4]|wT*M4Mg粬a~`-wtDo:ӓ csh~8t$[8Yk4=ٜm82tGu;wjN8I㜫Y]$y/l;r~jAE9AN?bk/=9oi<xΝ1*y`uk/Bqڙ#Y+,h>X]]]q7 PuQ�cVl1u/Lh7  Xk3*3fǏ7y<ӯytB;gΚ۵ڝwNO<qy5o!,m8uj0u*8јQ+[]a]3֭2g PVE`姞J{ʹ"c*7j\ SlegrIgmi KdI+RHƸH,ꌼX8i@c](hAZa32>Ũ>F"W{lwz{o7[n)"w|OO{z[Ӎ7 ={ȑs -X KȢEmuOS\G+ ȉ4Y+E\:˲gQc9pu0 %Oʧ1sY}hLbGz|3ƭax3. o5#k=c])1큁KyƘ,{^7QF?(vt&{q|yWс ߨY}q$v5TQ*,KE<;r=].IqqlDH&KDL/Ŕ f֬_Z35\i)cǎ]rEd@-tq|h�W HBZ<(za꫹CqVZJ<ixc~WHiz_o|;kdI\2 9 ZD-ܕᦝ$mA,o%HfI.y=u77~҅z&48"~T=lR>ƌ3|Uig~>ؠ׼6؏1Olp$Ƥ^6D 0 g[łaW~!9Bi>^l8Bj歷㛥Km9k\ivnٲe+W٠uQӧ0qQ>l?,jT*…A!a #c/P Ye6˲lǧՕJT?~o<mڴ==;Kιyהι=owϋdsyз;{$)_<(z^EI/h}s*Ok51Q1D9dVmRK`Jj�l6yp+S[c.Hf;2 z$YEZ==c\ýf,Rst~zyS>fV{v0*qViJs<olo$'sGZu:..)^ 00[1y̓"v<&h^l zUA$y],lZ…s0lo3 n:45wIӤT Ko~TC,PI7@0өڜ[7lpE/-/Cq"?9;uT;DdY(BZ In#L -+ϐV!R[>Jey.Ig UViZ7ttn ÕΙvrPj]ev2pŃ{Z,{ϹpȯKk-}0F[4/K[2Ȭto>a„+WN>}ժUH YwNkĖ0eR]L̺4&@$T�O<_jK4YiC=oPPKY6ÿj?+2v:eIrKsD}q H2$IRAG0Əfɢ|GX`:фTC c^iOdm@ҳVP\fEQM5u 6d '9P'<;H 0#^_| GE> (JrͭO9Żfd`VXdLV&pkb`2#QDxdr~u8)6;BNd5,9wZJE:E-Yg}־m;v:slvY{c>b9Gb(-H) Ɗp3BE-T*x0w˗I # ,g{]phe!!/gZLaR!%y^#r[gI8eԨ9c|i:֙?q?M繼d#6Mw^nk?msnRjFЫ&4X2<錞`p%kmt_eyihd><2|nJGuvK'M2]ιh]s~a6wOmJ!wd)΂<.WM`'R X]`�r 6ح>G,�>l(["犔Dcϟ48"9w:`l\kh&#OO`&ѡEWgq\FN<A `mp YHX�ȞIrsF$-Mv5˶uJ%h1綉\MsS~F i!*CS0,DM3QQxV^zŵZ{<k \ tݙsiG yG Vc(dm J$Ww X?K^UwJ\Oi ^~9XosR)9"˲W|Gcs<O|Je[ah~(ix6*z;knl6V 2 GVN: ݶsbw]~5k$\л6ᆦ{ωxO>/Z9/_nk8^3(13ł躼YˇXUK9l�&z'xOC߈Lc="ȕ"{/"S͉1 7dcDӾto~kdIraQnViB~�Z8 #4P$h.ou:i*"=ODͲwuU܂`.l SK򬝕]i}}b̉ݞGZ yjhf1jRVf%k&MTzٔNJF{"zK MD̓ņݱ,3pfj$'O6mڪU/_OkirhW+ćdV'a~<@]u9sl20狵zZMj5(V+W Ph12xH d߷i5%:FaRibAnm$&^iyވBGBfkY8oS<$Fzժ&z4^fLTʲ,c;:2:j2ϲ71ku-]X1tЁ(Ξ=tz ,SBZ(8*3 >!vd `@Q'IWWWV`@wQ+r}]UjGD^kE9E"׈\˕c>y ZW\Q~{(�� �IDATۇ8hҤqg GdƃovxB4*hCm]-0_Nai>'d$G<zVH`P٘ HI{8`N+:9uiR$}I헏G<㡊$I&QzTA_w�f sJ&M5i :jժ>uoC@c<1f$BlSH Z8|Q@yt|.NYY3<ϓVsn,?WPљ,uy-L}k6qAeQm"m݄ ϟ d\9ב-~#d̊RRlF ,P)wք#+z0gvn tA,zy8W� [<W[P% |0\\\[K!=CD^G<M&q.>ψy?<IS;r3Ë/69dzM<f.# A//t5/cƴZWUXYVE>Жj^V dW7�,DF&ɡizo9wCmXD~Q̷v4;vhN?a3dz媕-c\˘TRk,@!(S*((`-(4waΞtkǿo6aeIah`F$L5xW^ϲlR~'.;kXrjP ]Qm馻kӦMSa7a{5ё,3pO!ىn/_Qo >Z(Hl‹@8.;NVc��}5t]i_r>"\,r_,ǹ;lM0lMTsFxuͥ3HmĠ"dS\O`vuuizi#Fvo~ns=?睳ݲ,$B -N}rsp.:$Hy-<)aH^y$98I:s?;|X�Thhv b!o șY�`E!Fc{(R*av5Fjiy+۠! :Z]z/)~*oQe$-FeYijA\O^*me8cK_cn>===?|6Kj8Y|427xgɒ%W7(@|ڪ8ˇ iBZɾii/;Rp. сLW K"$ V4vv" yMd^nݐ Lbu≥[o-}x uc11 J)o4AcI]Zpn7..}k"sj#"/yjp]Wwp(! OFH'e^QfR*5fdu;wzWת7ζQNNeBz\=OȤ5 ʑ3 N]Ծ bxR0&gfdTuhQ!fOu/a}:'-cVf[;'esnYk1h`yB&vȶ>++dg'uI0Nk XD\^pi͛*ULh\Ɛ&4<̶ۢ+S!�*z`1_AΕ =CWLL ZV9$4R6MpgW9Σ_qH۪ 9g۞4MrzȖ[+WJeuo 4VJ)q/"ZmJV͛7OLKŵBO!-^�9qM ^g4$`ݙjJl4}RY{'nxYNAYSl†� :�1((pc!lzxMmLb3(N@=$Ó _|;O `zFVГ2C0{V p{F{*\/@X<P\>ppC%1O#cyo&lۋECC#liM?*{Z(sU}8&73c*0|X!} OX9_DD'Hм1&89>Hc#K?y9/Ofs=$gsE�c2ʒtA\�&~ǯ\ySO͜9h,X`v;vYc$Od<@!D) ~#@a H"2jlbnMx~֬=,MX0+Ha\J JQm喇v.\hѢKH?*6\p�A0_!îĿaΆqVqrOFd,ta]N<QJwN<ѥ js=8j`w*|k8jfzIZU$ C3a_5tTeokɓ['Fג%Çol P1lN WHP:FTȏ`vR2XrCsVD/ '""_)TD3kƸ>Ȳ,{ulTL-_.G*^fYw~s;o^J_D!iB0-9 [,yhyKc4Elkh`s ΂N%Bv9bl;s{,b�kzlz{/_>jԨ˗\ҋö A_a{=%Iq.c'\5I!I1s.r1Q$@~Hܥ(hs)w\!x!O+k@%TAJ6,ڇ"Q}᭷6/-[͝ 2*SKC88 5l?VB+2EU r; rJa⍅!*x1X<=u2kV)iIZ?egm n)`wsQ]!A4n{yc-+vsȁX[ֱ!B(Y��W9لYO+``~ٽ'K@ /ulVo1C+% /bȋU.V #R3|͹E.Ꚑ$VƜEƘ,YOt' 6V-mvÔ &B0O&ȉQ6,z~J\Rou:Q{`O8I-;}̹7tӅ Vfի/V3 qᄅٸv,ȕ_Vz=Ͳr}d. 0n4vɲ\Es}SK:axg\&4N%yRa.�:JqWI4:(5A a .sn+IA�Pf3cH,MMyGE+$˦a.ٙE5Vل]0GJfdBz|=PXkd]Sc64KSNC~p`TY�(Pb+uww7?`6H8²Hy+_?$I\ˈ ;U>LH \fDMr޷)$T<bbIW{f}#ˌ1/z^l9m9A\�'7 #Jl{=tYfS侁GhɽAڹ̹)~J3gm*CA yccttb(Z IMZȑv'nLaÒ$k!C,+wLs18/kf1 q! LIǤS1RV/($}/wEƵE#G?aq$̲Di̭a("aE 3n]i^`1H;1ttaґ#ӵdLNv`qY3IHx а… &DNˇ+zQ1US�Inj,h0.W8ևO!,;zm\BEn_1 ~aVI5fj̍hCɰ5oH@8XLB.E7rb{V[m5cƌ%Kؾ¨C1s+D⯦i9k̷j5SȳD̲{*C* \C`|>y_M]A1*>%ߗJ ߱SjG]gϿK+$= 'D1syM7՘S2ɒ82<XJ<8a 8zpfJ_9 dJN:9xcbAEǃA4]]._9n\^ol>yM,Sf&v# [cysv 'PQܰg7j(Ų,3==''t̙oN�8&A&h6wjЬ(Voo/cq5w2YxC^q{u`$~dYט[ߺA _Z{HE`cDDNfׇO˝Pݫ^#POi@ 0*'H�sI1 y1?YA2 $ FYϲZoٳ-[֬ץik-m:sC?Z}xl ɳ{$z5!,(6"fXGD_Fo)}$7!C?ik޸z(W壏>.Z;l](gt !pɒ _h^{b㏙ā5Wz'Zj1?0zkL9p{krK܂ p ::%MK_Zh7Hf6'4y&"!YXȳ,uVP_VcaM`yE曛W^^~iY)SҼĎy:Tgr gHj-=?t+�T@UZ_k,>΁/RcY EN41idE "w͈U'5ʎkׅJ60)X+..s9 1iǩZX:/;;!C $TT`kEߊl/KooWV:&M+T e螉¼ۙ|@ "tY;/$"Ph*^ /*qo4M7FzFm C_2Gnk̄!nwb^ӻګqm<C2HW281(dݑ$~֯kFnGuevww;j9[Tzwg.=,Yn9:KG!@60g0!63:x u� @kVrOjY*<M7Ɍ…DzQZ~3bh!b ]R:t{Rh|ŽN?sS7m1ƕ3ϔZ͊4oN|Uzq2NnχׇOQ{`6'3hâjic�GbK-p > )!j La>F1 t]kMyXc/gv飞76ߍV%@mS(?q`xtGiLVkas}cD_Z:z,{˟2ߜ$M+Ç|K[p-n*}?ˁN%Y[3 `=]f-3|7dVHxܹl e"Ͷ#F(;K/T^Z µ�Atf8*Ʀ`d[q8'˲r,a.٧I^1ܬt1b=HXJ]Ƙ0 <JX}sw=~H{5:#"ψDFDyFDD9w}D?w#<s^5)=86L<,&F5Cz0U;LT)H$pa]5mؒN_ XcBh6Oz޸,6˦HKY8qZ 0VZ@!q qdV�[n^ZD," )Fizbjor%K/oEgOZknLO:k2exfomZ,}w<)hLy=gPXm-p; t]ܛ7oG}z-[l]Sr-; , y = ʍ+<s'\(*,X�9yOT- 9x*]䬸5plLo(=@Gg~41?Fd6"?ϿׇOPLn+?@C-Mu%Aq�q!d\X@HR�h eaр!^\yp@0<g`jUp Cc|\t'۪CԗTeLAyri?uh?fᛕ1f1Io=]]ryFWW+I,<{v? fY'ժi4:cpCb #Ü%ά0 Jk|myL[zESY.?~o̘1aŊ~ڔ^uH�BOyN/� 2k$ Y'C,Q �;!K.ISJ1¸B� l:|S $W6B>ǁqPieyWGv|KkLϱ4\#yl^}ufxNȹ"wg}"9Qdȑ#}}%/|f|1՝sMp2FvU;c[|8͒,+qTWaDM$1z7XsJå�` 7S?S|N(T"t1&`Q=؍ty̺|蜗d w:TqE~+Vcm 6giۿE3f`W8{e1==^TRl)QP �EBu}Lz\rڣz/1fA_3d``Zf!s~O "ǀ*'^ɚpbaì}}}<p7H$Or %MwaYpXQ(a�}NS*tA+XBWBಚZ6U־s.fp'{/`?t:yDJ"OׇOJĈl ""#F;v̙3]iWM7 ,aY0ve`9 p&0Oq &6T��p<qvhذag/^l2xȟX- / \yo j6ߏ,-! K~=|.w7˖oIM>yhʔd\?qeKYy^ʕ&i Of0ďsdFH~q}P"'&.<K;Y֎k}2d8}52-`S5Vf1`HAiCf( 8a.6ZAS`֏4RHc4点^g!I'_Avgn.{,9@+R m>8c7cFZ̊&N0n"{ȅ"wȵC'F߈\%R.\q˂ӳTtiy6> N@y&&eAG10%.s ~-�� �IDATBY?h4BZb*gQD Z&1 y: #8+(S�_l-kG+Wv=<9XkwT$9β %ӟwY%8jUMQhe_&a} B^vӠ1sPV*Y OKĆгRYqk<WCrRCp&<g_NШgpB5 %bLT-V�*AxVh/: 1 $U'y(Rt4M%i$MuY}"D#y&"+D!zn 7[oկ1G˗wL<2я v٥kE$bW0S̙0 ><%9*Gnӓ}0 !lr ,՚s@ߥ/˲.U;GhWIV<-]YkHSzmaF�XXKr|U0ᜦJCwI9ײEȯ# U6P�Wt`e3@hx$0 ǐ P�y VF{4LF4kbDHAYš&vNׄ�-DCEKxF:(3<eh><]ۮ\MR$?#F7f  +E g5 bEK7T5>"SEDnyMDDnԨ~PNok|*{E"~./uw*{yϖfpΚa8XD(ޜl> QMG�&qVA=>$ }5kޚ漅GRA+rѿ'[yC˖<s眈El$V*wVؽ 4?niE IXS C=|fn|ZEe5q1AQs kWC>y5C^L(%dmr~޸XœW!H%4YKp]VjMa�=W<g"K3^c\!J~R0sbzQa :֣rׇO }D^EÏ}yM6Wڜ0򓟤zî"t._|Xﳏ?e:2wQ9h[rNtwX%d up@[s0cLLOH!cnTeТ>q"�dqS 5/Q*!_L7lذYf7w8n92,YEgqp Op3&52nPFj6V}Q0 0 KW@Ԡc ~^ {3+nt4(c{fYAOae eO#w( ZJfK$AkthXe;d .PjpK9.^UeX~7 #>ţ+(?LȏD̻_D`'Lv+^+<K?^Y:gv o˝g?,k6q+iVnИQ/L>^*FFϷB70¤!Z`~M(ԎQ݊ͭu$Q{1}ci-ljp蹬t:}+ɥ&_wxQ5Y \zr)}f&> seǕJeرGF$NX((ҸBoh>JRi vBf1bJ݇s( HHX}eV<Z9[ XZ;�QHaDZ*ͽ(o 7]U찉�JcsVrSRy33'ׇO10 K׿"}=.Fcv;K7IG|u S=C"ZSn!_ zzקj'I9gg\E=1ylwX;c AT*%зClKj7Z/X7vTȰƺȰ0[ʃ2F<쏥C%8i0P[MiEn�TTڻVa}?񸭷ho͎=/}'Z`􈇞2yوb#ZXaX[A0tЯ|+~vSUQ[`^mGUյ#fdYjjH/`1Z-ƫ3gT @1. `cHnpOf.0_TgLjLg-_ 71 |kv֗դ#| U20QK}Gތn)MvN<1w:9zdΜH\rm/WwܣKqjl!.t˳%4.{۫{믿+_9R9ާRIM=}h5 3B8 sb 6)@7鞞ffSt->mWD#Z.T Ðr]%nJbs/O1P0RH8p12M|}lJ4olcǏw>|{UC_xaÑ#7:tʕ-nI>qbWoXςdӣ Trq<o޼gyfΜ9p#jB�*I̝;Va(? 73`/R#7M�B:L jĨ\_ 3;w8ђa$[#ً9tVcJBArDRLSb/ ڈ*Ju>ZFvc[rWG%G/~A'""2׿>4_ Nf}u">`+=#o.D==x~amz'+YSAreO |x> @Jyb{I3k8)~<f.4sf*>bĈtƣ|]428@7tH<c$fZCjVZ%"V#`̘Gt=ؐۿESO7ax 3Q G!啲,Y ٽ(92s1Y /h<b/ X?`qEΤVTC^BRITĘqWdBGGOa0'ģ`䀬Le=7z#*5K4L)5Ђ&!]udS'f3^|#g=*_"|Q"g3GeY^/u[o޺{}dI4inͪU3:VU1ZsnŇ͇17(1e2xNa!e=f6VkFۀz8x`T*mj#\DX_L<Iꩧͭ۫- 1bV{eM6m{sذիW7Zh4$Y}ɓwvmHfqa1�M9`B+<ۡX^g'Ge1sU Q,/F4b�r"R:/jь O=ϸG0k-[XOgPY*"cSNOD�.YoB0kg$==]CEQߞY9 *yD"F-rb k;vrdm9vmLl7ENf`Q"Wcϲ!9e1 Ha)&lD3z)Ǖ2Ϙ>Q3r=aĈ%O ,z. (Tl|AV*bj4MT#:LkG(r|ylnwwo I7ʲ?{ލRfb9;)f?I̛?O^z=^ꫯnumK*K9^44qxV6L>w®{KnV$`1~Fo{y c.)�@qqCAWrk\ӹϯ%[i7]WLTcDgyYIeYۘ\J'gOW9{ ৖t:y)FHɐ|[HS#F3fܹs#$>-`.cmZh!x,�l`'"R.!.d!4|68R6NbʠaC%?psfr#x4$IW S_hX01e%i:$Gf6N}Ɛ! �6٩*M:Z=βתo0: oذ:�;ڿUBQAne4x#Gnv[]roCHy~<g?;u;sŊ.CQDD:J2}`f6^%Z1 tj^d P!Na )q9%5hu8yd)| >bBB~\GFQӻ/@N�(\vs)ͯ ?Dс$tBմu4xiŇ߿lٲիW Ȏ:J/LY?=>zyl/ҕln0űsm?$I.i61OD10FZܘkkV ܓ g  +\U Rƒ]*zdB �1VOfSw"kv{v|"d0lMYvUdE84qnv,{n_ ?�_ ߢh|h0\lY^+D^̓7 'x>=xc2 "RB5 똘qJ\.kS*@ંB{d-la27l2 -pQ,k+rymY yTI<ŬK�pDlg!$1b J:4.Vm!˲. CRBS3:^l7^#OӴq)YOOᇳO U?rngnm6dRk';i+=P*헦,kfY +] tbgf:(=A>h@g`|3fNNA׀mXMc.+K�l$ZA5^xeOWn-լs8yKӯۯy*1RT뺻5hJ0I~,s.c)DW;<iy9V8f׶5c9H]y8ưR*aT?`9l@w 5"\LC⸂~8Ftk`Qfem 8]P@O!l;@[�c\.S\`hQp:hW*u` l$"ngAc8Xe. RSr5?JwyqR ezT*ECl}Ϲي dSrvv=0mQ : ˍAߋfKЁ^G0IjS~Z*> 3@J^9"[3C|n ;ƼE9c^TT\n[kwrRC۱ g{޻?Z%w9 .( ܎9F5 nq, VklG9:4@O\9ZRU;!iRBJ SXk 9Ng׵e81sA4%s\[tTGiTNa@!<!Xy*Ƅ 0d Wz.(/L8x Zc. |2)>v 9ĸ;Nۋ0&+L!ҴE: ƀpAEի�ƼfRhn;xꛍ|Hs*d vP1Io/V=j3q\ϲxq}Iβў0QPF˓s.J'#)4yb{q<�[ юyA_j� tq`5r̢ˊ IAnA层]&՛#1@&|[~P a:Z-}RR A((pN0LQ8AذN9(Y�or: $){s.!zڧ�Sy:ToD c(epL3&OՠVݨ| -VrEl!C P ̋c!O%6IӦ<Cz,3˲"+|fӉU.A߭]yjsw1O= ˚M;gq~+0,rF _@>$>C nS YĚr�O1N b"\!g #|� ZA1�N 3<\"LA@uO֯?.>Ex9Ա6d4;lWPG@J}ja&9ri]~?/"IUѹ炖Z BCѠ 3Db�+UJ0r7 ݟXɕ"emEֈ1x|e4<+ ZqG0ԓk1wIb}]ƴɌy4cʞ?6E7+잛Z (1ce A3D=0v79ghp w܅# ūOA Z+v&RPp`X.YOWP+s_ k GVzxt >Yu:-k`jK "{hB#ϼ$W#\$![Yp)lTBjr끵OQv.MR}17.+pIxc@)qO!S* ܓD=mua|_k[!Ud t:===*~A}yHN ԰ y^0`@qWY_f@~$I48^^*-W0'MU查UƼ\ !-v;�C<8!.2~W^ywaTbD> Nz Ԧ8޻ݮZ;ZkmUVkNgOZ$|sð7>#rƘ, 9!INĘvu- " &|$ pOF//:xWWr  X�V |zڈ 9Xm8HBP/J0Ӧ @Igƕ\J U A؛HJQL"M?=mI^|15k,{㏧a$LL."/x*k7t7PKSЌ{0�#K yt&j1e9fW\ 2IpJ2�'[ΰ@uPP,ir<{#@Xdx%Z-#bpLhKCT+x )K2e?Y0tƈq<ØU[gٕi^Ճx[n<7ثT*V{͘Hd{=y`߫U h W`9мD $b1quЂI4 ]8r{x n \A0��eQgq`w'>jJ`Eo0&<]ׁ#XևOMJ|5׼J͟nt:YyO"0) sqՂ2 . �H5xqXBlV3oN~&g6;r̆@{|G04c|QzooZi4|-N~c`.l6iB<ZizdXk'VoJK/V�� �IDAT+Wr7N-(Ѹ(`hMjAzhoIsv{L?"R.$1ͦ5},sD|.) @o$d,b?idx G* BBp̔ QH@fJe:1n\UA2}zQx``�{)3irǛA.Ы>/$٥W<n?XqRUg[[Ww`!E(5DI$$F$1&Q4 hp4AJԌFAT@.*[6TwuWZ=/)'H_vWw})t9;#gxDـ0;w8m(\`n ZD r4 |-}YS(3-`h]vd1)y1'3r̅*?p&TSOsj8T8&�q/s5sgD~+z>="k 9 jhJ�aؔM68p�O鰸;[ *V:,/~4ɿ) ;l2ſC]3/<y駯:U 74NêlЙΐN1QTH*+rV�gUf2 'LU $jZPClNJڜM>%6Sp8n@`K J7Qh߾AL&YFC<Nm؁0 UOțo^Ɍ8/}饗^5kMzsό!wG~0@ ݇䁔An$`܌5pxRu;*spP"˭544 2an0 dꢔcZ(8X4zf<xD ]wкW"+ԩӎ;"HRk8;]u8N4=]qHRKaؤu xuk=odu $Kfn@A ŢnΟ6Mw떸6BnV,~{?Fv[lb٬'z啞 y&o4(dNطon̘#ѨCQ"9UnEU1 (cQP:-�|G!&5IA-`B1<aaZ0kI/ER!6@B ~40`IE1fUVxVaZgi,G_X*RʕaT57C-NEf`B y\6&�A* S(CH&eu`lqj= q{'fzLquo|+:N0"ٕR#3Μ8R;i{KEX,nTlGd2S2yA.i=TʅAAM+r"8 VDz45:4w͈3J)?PYNUS(}'<]ꢾ}7o֥RdH"%Ov׬ ʐ ϳ6'R{ BYymfdA&-{@`50gc0d`sՑ,b <U/8'48b?r2&C*sY`eRQ< 8ֽܦ/Ȁz/!!哅BU̓E;GVfW^tzժULVM0 8sn2m3l,Cϐ+Y;t(e�p# fnG0_@<E;$\ 6&ad@H=@ Sh'r7euO/WG"ݥa8.ԓ6P[+yzud02fl,}?JIhz$,NO <4)F看NաCqZZZX$8^y7Z-X Qo֬C:@3f.9ҲezDqWv7~{U.R,rs5_Wh=*\wJ,~׾y{\WiuBLV F<-\,hlLL) 65Ӹo\-\3Qˌ`Y)AɁEi j7l {UF%d`'r„ć<rڦ\ϋ^lڵit.7&]D (ЃAN`U!z9@pwP 3 +phL\-@> rx½hvU18 F؃/^,=,~y=~ EO$qK%].&騣|?*qމD"˴HY%am"!pʄprKJ)͓R]4 .:{CGΝ+K/|˛ot5_8 7=gNdĵW:F0\LFvgw@gcJ@zX2 '@#:Aa32UxCI�fPd�-zܔC\*?cVǥCCKdS~'ƣ�M.5'<F{s.wݎ|gnh4R1i AbD1TdHMԆ&66:*{`G89gP\;؅FG 4pܷ`AP1ShEXXE9\wg/[lUCï G_G{A|S<u]=!ݫhq)z*^P;n< h22q=QcsbB֌;(嚑\-C�N[uu>ᄄ(<oR8]mmᢋBY~ q6).S6RZJr PAY#ehxah-Ƭ~eؒ:K,!ḡf'p=ρ7Jf6wxQE O2�XVc mUxp:<v<�p[rW={$}%Z)@4 Jב @&70XS8aÜu<*kGUɠ厌ʘ)NUJd'Va)xbQ+WWW^޶m2i8K<RTj M&֗47TU5?ir JRUdrt:]_őbͮP[˳(NF*J U[b*FAiHkW5A^#k(J^{`` ;G7lp'paa0zu;hï}M+ݾ[}<%9LkŰ I,՚RZ P sG2c 09)fBź:+7 hF ?H1o 8b5U Pk*g*mް0Y𦍗춃R$YkuG% ysɄbl,n9N3jqƦ9K7q@X{fpUkC ҆D!@w٪ʽ ',5\ 3AiӦI&566=3)?M^RӣQDqAMD^NjŢ[[uYE"H׀" 7ϔ$ 2('Мk%">gNoߡ /ֽz[D^{M+:tp]76yr+_ zpׯwgЮ[uRJU=}tסs]�"1H_2uhXą_Ao6*Ņ1i^+PeTK%|k 8F3$.* �ls|l#ep<J͐J y_njNۉX󁿑C=HG"v+;"9ݑ?焘Nu^guNA9iFr�p ܒq%6ƕ.* TT>^etj@R؍0vJG R_Nvqjt(!|^$&16vn!L9N)$40޴/QE{uq[S*LJyC�9e{CeةS#WMMPMF)wÆ؆ [ǞD: ;]^lq FM?´ʨJCql UrH'R^ec QY#@ ˕0 ,ot*ԜsśdE&wOPl88:+Y r9iDF;Diub6GŘAtNSS#oH fxL\*,P( 7JK<j8r%mg97-zc<iF>,)g𱦦b+-_F OA.$=pƠ]9Db[ Z҂і:Y*BP2lnn|2TVwڕJJ JDT]DD*'c*bA /rBe B6%2 {LK0Aw-xE@&rlxI&02')+G8nO<[q68{&];^ic4s6%(h_B4ɠh#p x;צpD&�>E90ʀ b < r8"MB 9/,'+R J*J O$_n&ab^XbBa YкT,e<=,^ ld2ɎV(zji9+8<uR~ãWJLZ3`saLpD TdG@�K 0"9cX2X&iĢ{G{ Eo IF 4AÀVCGZ}Tn 37ԧP<@]Q^ 1[Ӗ i8l8eJePGʓQq:=GL ,cНQ wǵ󪫫ѣbw{9\]<pHn󞆾 ɨA amֻmD<rRR,s9&"_.'Hpu$YbȜ<Pp8 Fgu3<j8x)  ẮS,./%sjkֹtBHoOd;4y)$sr3%, C)hb<!@؄ !w*s8 xAPKp �+3 L=Wt@(0jL O4 i, ol/-**CkVE  RY+eg!8 ^2,~( 1dcP!d!BBq$7̸{LVU,�L+:]G %"?-IK< 1ם|T;UJpoWW;{O6t,AxHrFMPJMUꪭ0`@$YjvבcyE\[x99S( o>Nsg…?ܵΣ6`Ƭ|Ƞ�@XQ8nG\!CJ&tr4�ۑ"Rj61PeyY47?X[{)Nfz,R~rf0hhTk}i4ǹ0TJ,P1&\B)0S{(3a쐌T/5Ky:wWr[IP@QƘ':O,e19A UnzcZP`<K TļL*(CϏ\gMM ͠bLVqdctܣ%#IB˒NusZ?unskĪs-wʉ<gLr9 t:/{n1|lh #u>q"=z31~Z vu8KWK/ p„ ONouu̐=e�2fUdߌGpUUUP<5A1d0"FsxP"ˆX2c<i`RJ{O ñ55*yw { +--axQ𕚚h4:drl,H,k >* #0Nx_ u<>ۄ Q Yp-}@kTP[Ӫ l!ǜ<<`l$1z. *?h�f``Q9)b!ňA`�[r!4#G1ǽ_jxJMD~FG~ue1@ 8Nxhy̯*Π^n\BNl0üB+Zkwokb?7ɤ׿b&C{j:t8۷oy_U]-LTp`0|KvdpAU̳x~@[2bIx>ùyxV 8s]wp299+AzwKUUW R=O<o?J5{>ZWb1Ԭx< *# RrQgqBܚ1PuDF ES,P ;՚VڸcsC@d#$0d``G&`T(kh1d:tMӍF>8KX�4K1!1lU ~*Y2 2lsE 7uQpJv5UU{vgƍ+°ʇR\qpTΆ,81,ǘ3nK~_ܵk=1|?۷o?f͚{bF#\5sJmi|>`&U&8spgnݴHW΍G@;.Un.|^@%bkXXRPF:J]c19 1k02Q2PՔq\GϘ.m\�l(yۈGEXWN̋p%T.g6Ċ8ґXq#ǝ:u޽{.Ä3($Гp +IGN T1>& ZEF'$6H< 'pLSSgS_]v袋z;v֪aQT4 TPTСd2ß %Y?fLDn z„7LbjCI4;zku֝NoPj}m6 HN0HL&RMMM\eRH1q8xI' ?G慱3ח�k*yUA-;]_ShysA;N7~JÉR*g/ E$` ЄD{< @.cV@N1fW:kD[6έAqd86 @,XVץV&Th#S%v޽|t:-[NB꿨6p$5�Z&W2|,cܗpP;!X^@`,m{|߿ƌ'ONӝ"ua'L .f@' yr%<(a2PRiL/ i-xIxϞ=d3n\K9%o޲Y]+jQYث0x(&LH>}>d2)-HHqѨk0a*~8B$iᘁVX9p;|3aﷴ-]$ >ڇ>:Z>a5Yj- JT_d9L醬Shj*F>j H@i6Nt"->aݰz bF5L{8<\K>IC5q.�)4P8Z(7~x τr(Γ(m14'L1#3 H<2ycZuֿgMqJ%|H== 9+?�Ńb 2D)U}_J'bvNĘ1n6[*I?D"gڥ°37\K^͛w!q7֘XS39/l*r4 F�CǞ}fzWsBd=ovPߟy,=�� �IDAT"Z7>)~nhT66_SO w8#'|<fa<sT2Y#E. P060- @bę(P"QgN_TBR}Ad<Gං]}qK3z\$6!XrTϘk qpx_ew8k#w\ :!GpPWy\ c$8i㨜5Ao*6ztߏz^[c8۸DڀrSb~A wCuH(2aܪWT+,#.,rE@*D7e(CL6B+LkX,<u0|$n=or$q*k|_ht֡y 7 MtF.κK4`* @{$E!j[c]e 8q,\a}4f4"8°ƞArIÀSC 3?F:�( R5S/X&"PDW󿑹\j}+*ub39< ^53j͏!zfv`ħ8䪛c'? ٖHqGeŀԀyZ.r聗@Usp{P3/xNZ~e5)*yI!}`l<LD pˑ y@2˭PMV齕Dx^g Тc`?J'GOêMsrx! [8FL$@c"K]r+z̄[rPoh֪gSLZ@ہA)y@e1Vrh`b  @C�`5T#v$\g|I`\LYTܷ/[nۧ.W5$͠njc,&6 eyJ’5|�>V ,r-i� RgZهlPi\x84?0yd2g27}(9 A5:j: qi5%Ƶ2*[q2>,k@8ɜ0)6+HA/3b g5¸1W٥H�bH@H6%>X Cص1Df lL~8Gl4hָ(2O (9 d(J0 "�1DlCL3ڝbyi J\܅)F*dAy 'TA^� .4TC;JS] c2 HJQc9C\ A&ᢢXhYOtːQM*Y Z.-S>'ʦq!#n#qd8K8m! @Je6@Gΰҋ i8Bŕ U<f(A gL*t|xd?!0P,xF.h1 H-\AR=7 /0v r\`Q~�,xz8pЫ^@Z)$#vG&D&G7F1m&V6T-L)B`xMKs\BޱcǓN:i޽;v5s*ɠES5!W򺁆 ZO40=0NPZҺ6!z"#İ`hGnc+XՁ'<s|H(AG>"*ңW Px#9'e}$1pW !)tT0^%0b:ap£3 z=`AH&$Xnx:FjPe]+kzKQ'B˔q v]aĠ`(<=/X<xS@<-)F:9[ND<O9Mqg8z˗,Yr9Bp8\t\H$|e09炪mt.p.�;14�{ Q<B4)ٳ8\\L<oll&?XDd2)ujPJ\~uQJ$L+xf4+^(t2x-532xA V!2!1t^z-^njjb0)# h1wdJKh @]UV.><mw'F(5Zj BX�Lx!(>A6IƭlhSRת*Nn-t7o3777 b $F*!c fȆQ`z-*�^W. p�Xm:Z?lk B<n b zƽ@h-4I#@`"bhrWh bRT�E F o`FN rKŤ:y<'`{֭ۗ޽{G.Y6 flj]$C,LGOI_Sm0j*j4c& $ِ5bN0�.\ *ys<_J*gTj^XFNjֺ͂{q Ib2m`mVG"*A1ߐ,.mpfYD ?0{c & @dcBuX\y p a# 8Bsl� t_nIQ"R"rTdԃɌ xj-ZgQ6r8Cf20INAbr%baժUXjU6B1Jvdsh1>UaP20\nbh8;N0iJ0X2rA)FRp /m]Nf]gWU5D"A|X|"[+'`489HcΞ LؔEǠMxǐs.^|>Ns`-AÏF]u{qQ+^ƴ>p(c$jl"60Ry=nuqpwˑrބ_DP4p丒uw-VRĖ >:7$ X }WUU%`q x UAyI I={+ݻ7ɰ C3Pk &{{qõDq I KnDVJ2c9v;[$cCE axfQ['bE?WWOf.Rc,fja1Db" J1]$5<pS7 `\bQhޱ8V4TT(q<MEEPd\@ MAbA>S )UsZrưC-U˨\ E5rDĘ g3?dh|�^A|*1_,_qD"aalxm2j*1[uEEOD$;@*1{Zٴ$ù�Fs@!h<ɖ�arwyV7%HY0T2 }KNk׮a+ X|Kr0$AO>AI İ{ ?ep5Kj! B~<P4. zpa HM{s1ڠFHH9?+9eD8äH4(ܳhc؜7w-kc7V e/*X c ³Ju }yUb=y8ҡ�lbXG>%l ̳4I8hPĮ!Vc5@>2ڍxA' n`E0D]YiFUJc(*o \9߷o_ccc.ßG@.)G N>Q)腘:Ɛr[,d]N/Dg:t3Rg4NVXa/ȸ-&O0+>Ӹ'!']\.:WKsnTpkcA~%a>Y%p*L;$5D3 yD?WH)M:Eg52@!Fpi jvE!&PDۛ^.i-RܧPE}8�pdE&Bv){gϟ8NKK^,Pnp.O@6U.[x1 |x>~ر ;x/c <clIOX7cn 4oYC^KGm|@Pdr"m2(Qc*d؍z ܛE_Iw-?}!dz\q&o  cs>%Z|!>Rd nDaU0'b6Dr'䘎m�FEB[‚.xXG�돌G'۵kWE8哇R0O ØAD!59y0L:]llJ# )f ׏-xAGBCE"?p;  /rh,q GU"<iYN!P-@3[�->  >A CS3I3s#,ex H[NȀFpU| $<~+H>O[ n�mv agHaȍSa$ƌnF?RVW Ưd2r9TQTZւ`ŐI5Yn|HvKcC"pm*+L),K 0<LB)[Aᆱ9RY* r8[BNHR 4By0IF7az4f<ޯPp(/AZ#Ϝ?4!=%#PcXZ}y \L2;@xiE*+SI2g�b.H҃'N &aT+v`C-V}FH^Ha q:\|ar/'~* sf0B8l~b1#lKa#��XϠ?Ԧ1 !_wYJVN`�$qǵ\Ts&rG @`8cE/h< .JyЀN01Hw0 !3.kP=䂀̽Sz+y\gsH %S~7`֚"aԁV†޾9%6G?"Y7/QL@UZXgxD�#RaŢD;֡FNmb�1p6p NR p[P@qQ謀@Ȇ1 sX 9< i&�+BɴWLЫك GR---lVax\asɠ: C0ӗ qh4ھ}{ɴ%'?gpVb%*S^ZC?r_P[h08C%pF!ZUU$c.jMp\?!Z$lL5X8(#zLr>K^̜5!UFW) rDO`Md"Duu\AĄ]ۤ4a#Q5lw^ c"V] gb4�HxU曡ƨxBd=A ӂI1L*m’"FVJuСG;wljjN]1F_̨ml ,d{pކ o2y9\ G|fp`\P>@m4 6P<9�zVe~$v|= :;^ 1%8@f.-=Y),P<�߉rHJ mDP- n݊KEpNs.iM:k( T!X JGkAa$ |àQ@E'&-h?X"x6CE1 !dR(e/%OF~[<\m7�QS\rQYQBTKR:f?XhST 1z?r4ƾ3]<70@R%#@_9Ǖy5u/$֝2;g7<ta9]>TɕOxqi Eᙈ=J.r"Ɣ;?$mdhh⼡d̺Ϻ>L1Tx`!CX 1p3φ>G1GJT!8{7 .'0RXuTd2D<oqLW-u0XvuرhQǴ?tgLL\IBáͼy's()[W.RyyFR \'pNdW 2 f�A1 x<|x8| Pb ølAN"8`h%wXfX 0bM]qk Eg{6]AeFBv$Ł5ax&H1ly91((#fu>*ɐ߭$#A�Dp(@؋( F�_eK%Ɯ0O;l `B^555F́LjQM nj ՚iբZw9lGq"�r7ܧAU n1J2<d±ϼ?\d(3]#1rA.:L�ncjJ.1X*,ԏ"~2{Z`2^ 2v�v‹JLM#02v؀2/=D1 oQ~c^U=m|pRȾ2iMz02 p(0ﹿ¾G,l"F�}@-2C$:h1qq(pNd<"-0ԍ)JJ)j;'<͓Űx ѡ$ُx&iz&+N+-ObpK|'4h[le G8ف\$$"D8a]Nָ\$PK >1q!vp-(`prqd8́ȳ\d4\ Đ"t <,,Hޠ&6Z[,`@S5SqJ �ih-&hTE]+�Y<y[ 0&3ʋ")ʧqV2+ׇ3H;� J ޑ"&,cxЉu Tk;D07C`,gY��Auuu4Y 96  3lun`48rlxÇWe͸ ato>8yn<T5ʹ%S)pd cٌrח1b; HXuu NC-%Tڨ9)tѱG؉a̫ͧy53бP�j3,,GGu,Nc` @Id6`׈g2-fOYq֘b<zL.xWH)Ǔ @/)qGIFqG[Y)59 &|-OQI4:F=Ӡ@tCׯ]we]veǺ,ǚ]ve]x1c}"ve]v}kСr 1h0c8.#y;Gp8\':> cJ?q9 h|{a?l/Lh8</a{aG)I]ve]̲...r....˱.˺.˱..r....˱.˺.˱..r.... ?nHW`KUDv28ǪcHe9|�� IDATr䇸O&~7d2_W 7~M7=#GƽXbٲe? Hz;kĉG}Aa^tEmr3l6N_g?#^jjjGaoymٲgϞ( ѤRgW^ykQve]vѭ 2Y]ve]в...r.:VK---+V8sRLfڴiJCvU);lذ}\r /NR}9Ycck ;uꤔZtM:v(5 /:3{꥔ڰa;Do^kll<餓 5kR.UJ͟?{C QJ?ydԠA=Ff̘gE^z͚5d/\(N?~)m۶`7H$Ҷcǎ?W\v.LK/JtIJ-[,ZH)uUW @hƌ }IRۑt޽{wQ)x͛7w /TJA/*:N8A)nݺ+VDѯm~/7nD"rR .ܺuk׮]*&MRJs9={TJ{VJ$N2%˝z'|rNPxt+v׿U)uWTUU)zݻwsc>uT߭[7ׯ_߮]K/o-/|{}۾3>[xaÆ)|>dfϞ=hР+VL6]vܹSNyG2ŋۮ]Ǯ5X,f27|_x}߹s޽{?vئL&`߿g) tzʕ< /nݺ5kt+JLfΜ9C ={ܹss֭[;zl6dΝJxٳߎ3f"7m4iҤ|>o߾M6qǏ߽{wss;ӣG0 Ǎ'ov…_v뮧z*vʕ'O{ٶmi6nܸ}e2Kr-:'Mf͚k&=zL2'\h_?hРc9f3g}no~dr){X(}6tazO>d8 ܹsgϞoߞN?<͙Lf޼ygqF]]ݟ|>u 0`„ ۷oonn^|ynݺt҆og}ꩧL|G)C;wOhѢl6޽{w}8sV^=uTSWWwꩧ"Rt3^[h~ROn=Y#F<Æ R)knn~gǎ^z^>3ŢnXd>.~ٲea?Z/YnkW^=o޼Çk;<}-Hرc}YHĉZӧ~|_~Ν;ضmٳO>$9eʔ#GO~k_ַvoaÆo}[՚?w=j(g}}m۴ָH98ZÇϛ7c?mogƍg0`�?_n\… +k{9sr-Zt:}ὄa8{ÇO0A#Gk}M66l88{KW6mZ۾5kL2墋."q#?ϲ'q\pA:~ƌ~?#]>gz"Xzݷoߎ;>|>?~޽;;8p]Pԭ;nȐ!R8SN9ҥqWWWww>Sӧϐ!C\MGq ҷo_]⊛nI џտ)رa8p|yhKpD{Go:栾^r{G>kȑFZd1#=*õ|1c<䓉D~/ӧO7o=sļ)S7{>/.Ydɒ%rG{tҥofSSSSSӊ+f͚%Oٳ_o]ZbԩSGqdqwyYgu7/Xэ7x1lܸնw9ܹRj[lt]v?_7nL$}:?Ԥڲe˧=�uusko7lؐJRo.Jw_*6lX>Z/|!J=AVv̤RKjwߝJBnii4iRA<өTs}paÆR)i~m 6 1"Jxrv9sfϽ\yڸR#RK/{lСT' ÿ/+l{9s?._맟~\4}?sSO?-{lҤI---ZBpWR[8ۑ5rw}W]wݕJkjjۙ<yrAL0!Jwy!z^~eX,~T?\M&㏧R /P^>S~;9tm~##f͚%_WW'{?i*.{ߗ;wѣGRr٤ofs9OJ}%Jn[oYl]veGve؅qϖI̲e]v -r...ˮ#k}Xzgs)=jC.#Yh>;~i|ˋVx}Fve]v}$EuNG58Nǘ׶ݏHfjZ6Gi]vtoXW7J)gѢ7z…7? A/g]ve?욾v Tq̇o|"ݺu׳ Ku;>پ￱~K~oK.e]vîbJuooy>t_>0ͻhTnWs>qˮص͹J9o=vcRj۶m{O g]ve?/9}6i޽kZ����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/cscsrc.png�������������������������������������������������������������000644 �000765 �000000 �00000633313 11332127303 020375� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME)ݜ�� �IDATxwUO9LOwON0CaUWEtwUQLqE (:Hfɡ{B\ՕW[gy:[uުsNׁE |8s@CCCC㗀`8V >8AA?EEE999h0\jU[[?^PP�A�cj@7^d~yWKsef0ƯٳEQT;V>Sz+x{1"-0 -~>y1?גfh"m1tGq-v[��#+|�aeIܶhIXŀ@0N+ o(-p b ;&IAG C%W9{C/Z FZO!%Jm=(l$O6`"<v@$f\QQ@ dE`hX$aށH3NjXdzP|W7 R˚HeIf8VശyN6<hg"+%y`4b2?фj! /o8 s{6#r̼ c)20Φξ퇖|^%IGx?Jh9dY)γcd:c5 0<;A՗81&;sL(IiO_AΣ'|Rɟ'}�ep8||c-<A,< ~&-˲$I[,g}v B<a?:A~ Nte!өwwD)7v'%MXlxG rH87S0=@,dS[O22h$Z4݀I<c@іNo:^hkJ$cJuMhlHfM'&p'dr;.bÊ,P(oho_DB8$vx1o{{x,6Ds`@ЦG!G!Lj7wɑֺx<>~hg,p=@(LL7@Z<pUacTX y6*+ la}͓HG:[ckw$-rp@J@zE5=dbTjSshG,+s}~ 0 DH[eRCMJ,pSg,,0wtCaL&>4*wJ<[5zԪW(6Ñ](XhNO,.3I&JuMX|LQe#&pLo�$vzt*|Xի†:{據O<> g,< G7n\:Vw*�� @ FbYV=VQ #0~;a„|zH@Pkoj V}6H: 65 �`�-z$G<J 3(!0dq#ˊMq)VDe . gم %2A 3NdIh@mްìs;Z4>e}M`g +2&3yvnl0İܽ =:4nAFVwRP^$3@a&I;`ѓ9_)|beg)3@k?NjCs{éHi0 t7- UHM` :eeX/I%y wE]Vl8o 8xwE`2͗|?^ci+`Cz4`ס.G ?:!EQ?*rZai ٍtӺ9+C¯J\UbLKJGoi;CmFQУ#Ë<E`0 |YAN<^O5tM:b1aomĊ"G EÚ<A.vj| W]pt\e^Q+K"cJ6Q}\i7lSi l°= ^-H,ŕS{ g7 t}ߤ#*Kz;{Dg 5$ݟP<LZp? Z di룪0uZMK?/JCK`2MOj>&��Mn>ޓZݻ!r7kgKryH}V}썯=4#:^q7xc&]k:Êf= pg _e)v!E i8 ' K7WWfospx TK8@Ȼ/E9%�bqyE m8(0�@N-- ͱT&RJd]E=h1PEAJ\XFP%N@ Mo6GB6#UkБx|Qm2W6H :hDrLtT7\ӑ0 .SO0gr% Pa0uZtVEO9͇:L p돲N۪ÝDŽ}IinF$Q6Ȕ͜tvAG4tGrLtT7DeSQ/w[RJ: 5yf80"3ah9HsRM}i /m&pgj sML- +ens 2I΁d]oԑa.t 4Q47xLt$ŗYҜLI?5\v7m,r:CD*#ͱaFFZ{c.nI+qzc8eJ]&A:y6IO ۍtaV&棞A.so '<s<T~"=vL:(t+ HH&X<O a(׀ hKoLI'̳K.Wr~AnX΢`yS?* jhh5jo©@FQ@cwhȂ\^Q׭[fG{6}�8ZC&M{�SA�4I:-͍ꌤLZ+C90}魭fg]לwUedIs3EYM4`_>p3Z +0-㜁B4s-Ԙbs,-m bU"b3'b& cƻoRi῾uWٕ]V@ &rt/!+pidb)qT1vۘ@*߮3Il쉣Zw FSbp8WoJRo)rqmrL@{btm)SFa6G)?”: �M޸Bh;nM <e є0O(;mD $m:=1ɣ= A@:LU)}tQzO,@Y D'Fx]џJssO(N MєaJs;-&<1=,ބ yO&E`B. C<#O̤#fɗ 8`iqt?b<cStaıOf m#0,߮H%YylʄSLIƞx2zOLG.7ʼn`d'FV2H2ޟp[i{Fp&_B\'Ď <#+=T]GX'fՓ6#00G9N7…ܰSLCH'0QfImӵX:&QhRiK據O >Ye0}}מ7DywowUc8>q4{t;%I -|3YV)�uN� x;|1+j 8Ph*n5ӞV?I(%'x�ZUhQ/UHh4>\C^vpU69=qߗ6ݏZ`;X~)L]2.I3tH9mx/b\ECɡъ+LlQc~\2Xe^SdhJ(ե9&Ѷ"Tf2,/Ubjg8ԥ(gn` 4k"XIc{Ҝ O(552iNo 8_d%xBYOXtXK?CpSwěEeb04#I̡cxH@C TC/#JVS?g!.}zB6Ii&XAfneiX!1F gLzª#Z.}7 RS}/pҨB/‡BC@OI= 0ЍJx\#!N}}Qe0ighsYȦ^V2C] 2^& 8 lv?k6( <ԭ?Ms<ˤ9id7ʇBI͉' FJtÉ\,-T8uɌpN3I`H�Ch:m0 M(55gXևSR˷R F1,C: U?q8$ V?O m俗bO6"0lO|IOm4_M~=4ud&S0\08˪�I5gyv:d XȧGc||ĕ;pFPƎ8ۭ\wl"P($q`W ]H]_ +w/yS2Qi/l,EO?gDqblS-z|ǟ6��7~Ձ y#<+*ݺ@(a@J>қPxxU'�hTM7'iFlz̬C2 q:^U.iKd"J=Q!׌8<Q8RCa[=-а<2<(s�oPe0OL�Y@0T䒞JI6ocVЗ1df�)dx T?(9D"#{"È48R  +NA ľx=[>E@#=,+\))߆ -:n@28T.FBD0E+ى$'wGSHS?GHY.q t sSJD(%D.F�sޘHJV\R@G70`(\G~uw1 uA>Hv"+a!ǀ)h?G`Hy. hleP2IN)!" N3cp N )H 4<S98 oQ |Rɟ'鲍<A,/5Dz"G=a;$HrvR-ٿ<ky&0n|Ð$)4PSA%.ߞ;=�"z&ll��l_&!X)Ӹ #{͘{&`jik\�@ ���YVPCQ�B`@a@4yPiY¡(Sb�H˪C%�$"T4PR}Q;M y&䀗'08^lp0%J\@!G ~/Opi�X޸ar '&a9:iDF7#|<;"%yPa7!`Zb^Lyc ,pk@P eJ) "�hORۄ|S8\`F-p_B 3J fE0#]F8ߌ( X`ODJp'9 L0@ѡs 70r\`C+2f䁔RlA�u$68ob2+IF&~pS  Xˀ ;/.` C; D&䠗QwĴ�mprzتC  V| *L+VDAwDr`=[ ;'@0Th}1)68-�oL77k@k¾ΈRr_R.2\=lӡ}|V據O}2#+ i;ln}i �� >)ˆ'd}څ3϶uYcc ]ڳ/I wOgր>.#]akȣnhֹmcm0񈒣@w46Էy@[ȥzް87vtЍA˷X:38!K¬B�Mv>mAL1{vK!<o{b QP'h +[do3%@Rn %"19(HJ֐CpIĔ$t(})f+HPR)0 L$h $JgTI (M( )�) p(W:ŠGfW,L+eː7AMHB6h )� LrO\IpЈ? ex/+JAf 4eF;hC%A6Rd  HiUXD%hXMXfW,L+f Ȑ7AA@@o8P TX#B %�(-d@sH8(wǔXH)&pKPɡ! 2NU24<G&Aٕ JH V:ơzYrO$2@Rn&<D`PSP6-!E|wUߛ 8$B#@9(iȤ `^*Q|V}8RJ�n +:Hi>'ȋ|j�I㍗91s {,!=m$�._2ҽ}$z3뢑9dSYꮋv vI "5HSl ghRɢ.+pHXg:x"iFkx15E)0B'%i>ܯs`ꋉl2TXZQ?O IҨGv( I ]U�! 2_ (�C)$GAc\SȈ`&�;%E Dv.`k Fٹ(r㐁4E1DI9Ds!X! 4d| ʐ/ɌQ @kt0_f"P_ "*Q|ㄍsq"Ce&>!iI(:cZl ٹK`kX8 "F\2r{�c' }),…F!#B)JJ4*wD1 V bSa#|wKpOpHɥE V:(NZlQr!5JPa,On�E d%((`k<N+*+ߟ,\hx % )q3!R = ,%F>i$oޥ[N9\{H ,DXğ]z�Ed'(&`kPޟB \` &3!q#(6GO"v OړBβ?F>;g̎c;�Pg\7m&N:n+>[?cYO>}| DguݻS`l__@ȟe/X/J[!LB 2 |]F7琼cˌᰎF!LCD@r1))g2`.J{4bb t4 ID.3f$'AELR@,GsBC֣R9s(ĶiIņLâOg�RӉ*̙( [a }iI\n;EءG2c'EfDHIh4G3Aq@/'DrD*g<ɠy Aa'ZlRT,3q: 3G4@g$2\7r†3uaɥƌ/M"\0:`nP#A1zTbT3IR"}&c `xVUR�� �IDATrih2bSK6h�@!`q-e$q[H%F1T-aTbGt($3i"-…zNz7ѨҞ MXd䏄铪+ITl,Ģy:AwK'4FOz'5|37ٍ^xnドY?jI`N߿XȲOWdpIَ$Ḧ́9,.;E ΀I1w8b Eg 7D(`C: -qr)PH4D( MI˧d.a=I[qF uTHD#b;+#y@pcĆoE $Lk8f,q7p2MS#;a T!aG4|IhKVsHpĠC%'1);I12G1Qg'*�L67BCToD'ELk8f<֓rF΄ w8rLј 71DLh&-" Kf0XiM,Cq¢:U'EE4b<.�t&iq>7`b.ETal{8f,ndȓrNIGcz&HTvQ8@fY"*y4ˊ!s +-JF%{dJDi&.,X(IJVR8=5|gɤ?zd?2n �e bQJEC<9 8/#igXjK (o2)<2cuI/A rd KI9 )m) (ߖ2$RF*6a,Qe<2 �HXF mI#vf 2*Ta ^AcŒzTP)� Kx rT#a=IQHnOM(gD2R1?GyDD@G`2zThM)DrL7st[aL ܕqŶQ 6Ld'.!t,ī⪰\"r[hDyʵեD8*ēt4.>V&R0Ʒ$"9ѳVL8:"j e|2!)pgZoY RF"0+mLѱO9gd8r{`@y3H`cUOR*q/s)RR3P5e$`)H{=mGxEɤi ciDlKcUoLh>TG?] A� .\(2�@E Nʊ�� BBߨJ!+a��9Q%I$F!AF H!테�()($A� C v}vEAAd`IQ QHF Q(,fd쇅!@ /#9E' Ž`A Ya�()XD9D#>]a0$DŽ ^F DNF~0E٪ |R3㓰 HrE(ʩM{blV#1lk,㊢HOog;w^|54444}_Jv!"B]uUZihhhh)Ƽ~HSd2Zihhhh<!GQ28#x<{`D44444~ -hhhhhhh!GCCCCt0F>>iY֯_?iҤs98p V|MIƌG͚5 �~/xĈIgӦM^z!C��_~%�+<ㅸs#Gd?Ξ=;''gd2vl?!S;[R>#u{ԨQ]tяm۶;/ؿ?�r'}rʡCVWW'/"////ѣ֬YSPPp饗BޱcGKK˼y:k׮oa~{镕�(jܹ�ߔVv=\EE%\2_Aw,ɛod2iwU޻+KJJimm3xjjjpqXSS駟kjj IW[_4A<xp)www=zT_XlH;l۶&[2AL&E9r$Jt(*{. _:<ϝwz+**P{>=j_|kkk,X h{o~e˶lrFq޽555fyܹpG*--u\glٲl2�_]SS ԫeo?O>e˖jVTT466bkٲeK.]hQNy׭[7KRQQq۹4555jhioo?ѣ555q]vej<xg֯_m*QY}. a4M|ܹsϟ/Gy7ov�SO=5eʔN4O=3adzr+Vo9r DQ1cƝwy;vŊ~پ}+^y啽{Z8�3g0<mڴ+W];4LT_$i<EEE{믿.I|a… %I+͛sZ6MŮ.盚rss|>߸q9R\\\XXxNf/^|wN<K.8e.۱cǣ>J4 ^z) ^s5]]]5j_a3fL<pxڴijYf֭{_vz /›oaXiiUnA1 ={8n3gjN̙8[fϞ^$رСC /mƍ |WǗ$ϏD"]wݒ%K֮]cM4y~N:uTo|c0zAN bƌ,?&鬳BQtӦMpxEEEg݃^:'_p'O v >cNWSS{n�[˖-{w***֯_|]]]Ny~۶mw~gƌ{%K4(ʖ-[F0E477_wu!Hl޼9ʔ)'N,,,|׷nGwyd2z%IRW®]n!֙|;wܹsg,K'Nq\WW� Jy^A{L�a2(L&@  WZaÆ 6<C555y~~ѣG`ﯫ9vܹGj̊+?s׮]ǏK9{nje˖-[x]v%ni͚5o,Y'{, dRcƲ  ,[RRR__H$Nk^{mMMŋ[[[wu5̙3뮻+vw'뮻^y/^_|qUUU꫻w?~5\y6m׮]7tO?ѱs'xb֭|g}=Ë-zw}ݿTp8l2@Q`ժU|֭[ϟx#<Gܹo_`ACC]zݻzZ5gϞ;w5*JT>M{gyf2p8>slٲe…<@mm۾}a໋/_^QQ7ߨ%I:p9s.@ ^8��˕3wE=CW^yeee޽{��kkkVc=vAϷm۶ѣGl+rϞ=s=zl_l$iϞ=XFQū7?~>6Apw݈#6lPUUk RWWsκl?pUUծ]߶cǎ }W5ڦE}'NoMRꞛo,'fۂ>׬YO<Dmmm}{=thjkkz>7n|뭷FO>8D^xwyuEt:M4:|3<gs /pƍK,9swq7xr_3<sU~krѫW~뭷NÇoذ7\hnW;ܞ|ɬ�vE~4s=EzH8nɒ%?`|=%%%3g|9H/ڶm[矟׹ o͛7o;K._xqKK+r]w,Z(LY$IrѢE`9r߯ʼn3HkkkmmڽOڙv9dxdW\1c �>{W >|vl>{Oq 'O:uIC 4iW\1fH<@v;//Op?%K?ʐ!C&O|嗏7r/((l>,m۶}lxx9s̙3a~ç^;&Lpj Ǐ_~qdƍ7f̘=;t0 XB1>| /p8>욚?`pWRg{o\3A7n|Gۼo߾m۶=CUUUcƌy~ҥ ok׮{[n9i\�pmٳgҥ\rԩS1 {y"555Pttt̝;OӃd̙}h>|xMM Mӧ5rf 766>ct~ `Z3O<qҳ!L|O?t{{;aw}wvN#bԨQ=#.g}gnu-X`&M:#ԤǏ_RR H4G#G#ttt+q((z]'sΙ3碋.R ~*2L(t:Δ;#/~UUEQEYVA~… /Bdܸqa-8!C<zk~?~qD`0dF#a~?L #O>tЃrg6n򗿼477|qx\ɹs9haӧY֪*�ƍZjjj~iށO>ʲvf ]Ϟ>}Ӌw,�P( F^.�`ԨQ+..d2SN}VXr݉Dsٰaʕ+Vkvfƿj6ǏaÆ^x>u<oZSjΎ TWWꊊ~;?>�瞳l<uŋՏK.ݱcǢEƎ{M7 fTZZnݺ_~'|Y, .t ;`�w}jh2eJQQ8qѣOkٰaÎD;eʔlSyٳgϟ?;0_WKEjut:ot:EL2 z^�0vXp8F# <irssPɓ'߿_: �qW1b͛/_>?͚57nqpTWWvOGTUU+/޽{�>̙3g̘^W_-((x^{/r֭K.Ug>7ؾ}̙3oAfNUW_�p [t/¸qM6bĈs<`�uFQ]]=lذӺh GOQZZZ]]-ɪ*-Y}뭷}ٳg�~_1d2> �`ڵ&L袋F �4i0q Օ�SfKJJaS> �شi r\.WuuuT/Gg} 3gΌ/RV'f󪬬TE$K/-]tɒ%guֺulR]]f͚e˖9rs=gnպ^[nͶ/rCCC_cfZ_{M:묳0.'I54/{]w}駳g~w~_,_|q~M6_G[n$/߱cwߍjEڱc_ŮQF,5k<o #7oެNi85f͚5cƌO_d5  /NwFGN@{τr44444 a |rEٶmVFg9N*:b444444~w!Z+ 3֓CFϧ#YCǸq Z~2f(4~qhFC 9<dRE+ _ |:r~y(_ i%Ȯwf;uy0K'׮]_/JzjEoV�(Jb�yٳG]n{?{+++g͚M] qڴi{nW^y%g< +W>}zccɚ-]СCՏ&LW^�ꪫƎn~a�ƍ9�Pee˖)s=&>O"�x:IJ}}on3fƌ/r&;5בJZ[[˵i7j/Nw9>l)ժU , FUV!eW>tPUUr͛WWW|~o\|]wuWuYvA7x#�СCx<vYj?<qDպ~%K\i޼yرc�꣏>jٲ!oܻwo^^ޔ)S׮]uGyqժU+V(//w:=SO=~[vmo7\\\|-y L4|ǂ… ׬Y/<˖-[p ӟiiiٳg-I![n:uW\}Mɤr{~$I*"((C˲ 0Aj;~60 K�@D5E1ۦ@ð?{`v`Ie4eYVUwHک I H5/$I2 </I $ۉ'<xPEQaVOMUaS 5l\ H]ۛe?+//?~Th4Ο??Ijer(,kvIMԖz09OvUoYOMTNMTa0 ggϦ0 E+V~qt 2dԩ�_|>P \qEEy]jvZ,M`YMR^{]wg-\px]v]tEկ.l"O=AǑ$ǻ:mڴzc._<__ ()))//o~CD*R>bÇtw̙=�^oG}e˖{Oɓi.(([̙ ݻG2eԩS 1bD&(i>\VV6u͛7KwޞcF"G]$nᆖT*5{kK.hhh$is̙5k Db֬YwqGv/x===vz.�?~ƍ2:::k-^[x] HQQqWJ *kڨ(%$I]v:tHmԆ>#"Q=�� �IDATGQ5n!&S8EvMMGmaQ$I j SwݻWMEQA|FPjR%ۼ(dgð(Nsȑ<d2{nE95��~٩~FBZM'SXO:ZgV*/[a0HdDAmmƍ?3ART @ k׮믿~…_g&LxnjuO?`Ν ,XlYCCu]wEڵ0L_4Mŋ͛7;M68p@ 9gn8~e,OO>}Ϟ=8?+W]i|g׾g_oI$#"/D T%( ڼՖZ*TQKZ"]HlB}4;3g7ss넇GƍtU}}]]]---_{UV >ի<O(۶m򊊊=p�{e˖u 8|0prr<|0 BOrƍ{/((Psƌ/._<wߥ7|S$EFF^zU,>}zfffdFjJ.rxC;8@0bZ-;�.L&k׮r~d}!a2<"ITU 1xj�///e-cР4<3dzsZ6iF3舀dz_ncccee%D:&J^ڎ3~iFFܹs&O |Ν[^^nݺ;S-**ZdɊ+jkkg͚zjB7|_o߾;v/V^ Ӻuw>x௿}Dp(`۷o_b@666{ѣǺuٳ~>}@<qĥK\R\\<bĈXXTVVݻ7++>[fͥK .d^{Ν;Ϝ9s:DEE'-- ܶm?septFr\ґ&�4 `FL&<Xbggp.pO��&\ \3i:jp{ >o4Fj6EwB8n8Bu>p8Æ 6l!=++iӦ꫓&M:~JOwN:՚̘1?سgH$7 4hР%K\p!??,..z ˝0ao޽{[lwvy̙5kܾ}[.+_U*B6mڤSJ˛1cƌ3 FIIIYjѣG''iӦBvҽtiڴiϟ?вe˖iee5cƌcǎ}]vmiC:u &kVp_6HUd2@pa> ;:}� V{-(`AWp3BV+ !�<c!bBl6{.\Z6-- ,8cCJ /pvvx6663gάo(44tΝ_}DR8;;绻ݽ{W&Ѡ޻w޻wO(vС$77W(:88lڴȑ#iii&L ,[0++ )Z@pݻwwZZZZZZ@@@ǎϧ]2ydooC7 *Çwyyy1޽Rlll,-->|XPP`kkkii)b1l~m۶ݿ^>|9]Pl߾=**#((>H$jƍ{DRtӦM|)SLV L֧V0O<8F9=(Ju l!�,{`M^P�|ThT*S c2 Ĵ  ȇem `7ϝ;'Jʀw�$Je203)r\LC29(A@N#\.QWT7# ΎƋ:pՄclǎrcccэv-66&666((hȑL&3%%yv٨aÆm۶mذ׽{~嗃.[,%%%88xÆ /!Cxk֬Y~}ZZ۷O طoSRRFlٲÇܹ6KHH@OX???&k~^^^[lٽ{wJJJbbyvޭP(! ,سgʕ+SRR"##׬YSe\2::W^|AJJӧ~jkk v>B066/eĈP3fLpp0Dc L&_||󍷷w~~#ݷo>}t++!C]k׮g6IkL|9' x=Ff4s0JI䘛755!HL\W6wF`2U p,Fl6[T* p B*i. j*Á`t"hXlP5'ad2BIsΐa04�Y,PR?CxUe0BCC333%Çn}B^eiiijw-%%fO>}iii… 4ϪѣGiۯ\dV’I # BZ-9W0sol a40F `0 h~J^\GAӜ"oS0 &EZT(plV #3 &SVkZ&Q]iYLX;;I>|Lص)3Đ[w$G;,c0w.Vva RtP掐܁\!ϟ?)Af2ڀ O?[@8g vd 8/2i7,D2H)J!HB6 Á>a^`l&KA׉Lh,K. R=\L&CW_}577777WR.WTJs xnlf?dРر1v45C'\JgȄz%9b-A@yM?Ȗ&{*vA֚kI`d2$@#� d{6F1V!WG@T�B3~j5^hKv zOi.r&JF#J!! .@CV=z(/viZxh�)""a eСʠh'f$mӚD rO2AN|&3ٳ6P( I|@LaeP?GH/dkd6,*t/Pk� E:j�U,j :acmB0(HS!HsZH$ҳ3ׯ?IovZppΊP0ib(ʱ4'Sxyp@ z|,uXE̛Zetp5@dk&MEzOk9t̡#V!2%`s|�QKbxdr-tMd/Ty4 [ZP:S*k-t(PLy6gggD@$0NLp3ҽaffTV<l. jH 5A@ G0v71 37O}�>]kRƍCN+hMclmm (Lf6k/^ 2 r9(')JL,~�L&cIwhphp8UUU LhZ�8X,Dl6;??^õ.Yl v lg:a09obPX>Sbd&3Y{0aЀjJ 6!f ԉ,ҀRݰ h|>"y<^QQr0q(:#P3\D"A`++lU(p_P"y.f<@Zs1QUPEٱf<?~ax)@Ξ={@EmL&裏A//\?aÆpK۷,]CyoܸCBȨQ@c/$g~~~JJCBBΝ or\Іٵkם;wpL =�栰qbH-։A])ט h9Htwhugׯ;::޿m,mD#P~}HC J:"T= '%D%`ddor5P 䴦/'5YZZ… t)BUBH@@IZ)555''奦N4iҤI'O):txܹxrʟ~ ǎVSSS&M4~7nDGG{1A=Y;w"͂U, V` ,D-/(>3Z Ɍ|L}̐0jF 'FtzNNN�b B,3 P8tPZRmNp6MtV?F}و#z뭄!TTT]v}={KJJ6mòCFFFv=))w%|7׮]{Q׮]CBBBBB/^\TTh۹k.kkk///~РA?c ѭ[SN@qځT,?x𠲲RTTTuuuƴ4fff8 S^ HoX,DlpR(r "'V\l\!9oy:\.T!ppp{\]]]]]9[޽ !rرc|pbXPdP:- aFVΒaȌ|JwAZhPVMu":~mf<Ul_߼y7433ÔQ]]>}Z&''^p;vPT%%%04eԩ۶eddl߾ٳڵk6l[SSSYY a`0�lĈ;v숏W6ɞ[\�H(!N=94,ev̶)jX,PpPa0|>kܤT1kJjѪ* xBP(vڵsΑp^c QPqH[4un' aHǁǎ$0pL#4#pxfdGs@/ˠiX#'DGG2;v~3 �/n)))vڸqc߾} !V6l�o.^8{l !ի̙c&{MLr^"̀7DP+Y(ӭ6xR:*L&<nr82.a Kp|Wnzٱc1c@*%//j98@;4r :O4x㰯xdCs0h†)$$dow}Pݍ0ۦ�0֭[b={{B`Çy6m ꫯL_5k&zH3. !666FT0м&:w՝ɟ j4Z�x<hm8χ"D35oii͛7 e2Yyy9`(!DT~6ܣD"P\hQ� i^ο9zڲeKRRǫ[~AٿH$R8Jf{zzB7=zUvv͛77o޼}viӦZ [^ +))ō~|E9}4yʕA͛7ɓ7nܸzjuu g+KFXbjSlބ inv$�� )Nu+a*RgC(P2NV0̪ŋC>AC n q~�z1ST*܎L&# �W(3V:;|W<X{o_ƠglcQΨQryff&!dŊQQQ2,...**fȑK,;wܺu}ƏpBx %l۶m׮]|7qqq;v?ÕJΜ9o_wСC\\\׮]ǎ;}c-'** MܢZ)gf% >%%԰3F&`i,ouTR .P&�. :1 ʪYYY *1H�0#_KBƏ?~xW\ipKt 2f j#FapDO777|Olĉoɞg~3]Ȃ~BI|I,�;hsZsB Z').e33!rnV+Jܹ<lj6PB5,t!PzP7e1nW\IMMMrd&3Y5D?q &�3/HiՇ rn4@܀ 4ٳcƨ3h4II#GxwW�e@� cyyy%%%) '7!A4b@GZmK-P[q_8F5AȰ#<18#rmtF =c͌Ȟ2G '44j|,2a25m1?fE�T�rD�a7xpP$ T � UPQ*<Y`__͛gg-R*a| }EDl'HQ:<Mw4|$J[ z^&xc@k x|HDlJKKM]@fcc# &ZFPx<ZbL4� Na �  �t.IsyLuBP ꂈ4i�M!:1@v8zbikخ\"r,,,^ҚZcs2�6X0Ibts @"!^ɛXA5]'liBj5! VcsMʞ*13 :pIX1Mg[�ò}%L#!#e!`@f<2Aajߤ2A>$^D'ODZ40L&ɩX*|DuLXl=.HP S/]e @�ZP}%U@ txFAz(\;z͑k0ė> K24EVcfiiپ+Ǐoll4_{4r9u.>T^PХb ~{ӦM8WF/P`qhQn޼y^| Lw<~PDD>h@&@�@� Z�� DŽ U>Dk&3ɞİ-<,=%Ik ____i&/@]`jnn.HMlq ls8DIBU*&%"`|>43O9�0 hP)AjYk"�xu { U=t?Oj0#^~:/P-V~3-}GO=n8BȽ{VZ߳gOF,Ϟ={С:]&3h۶mx"!dРAG^`BV^?B!s΅_WBB�KOaM^ M&YSS)lC"lGVUŻԒ A�+HaJۃ 78H�6~ѕthߘQĬ Dkx4,2ȧ_Y- xV?F|8,??ZO?YXXİm�� �IDAT~W^~WWסCjP63@4V\vsZZZŁ*mrr{\2D??w޽GO6m=s挭I S@ Đs\t �\ #0d2Gk4j c p(�ᐹ.aDeX.n)Ha!yƖ?֭[$ѣNݫWqEDDZ @_~kaaaJJJ>}ƍ׳gϻwrLL۷mmmkkkB!D]v=qįzƍɓ'766r\333UQQ!HLM=aacccmm 0Y�[m =N/HGl6`Z`�ؐF(2~iaK$%HQDKL|@(E�P tp A3oP�c/@Shā:zF?d$)輠?j_\ ǠݸqcرGy뭷-[V^^npO>dĉGQ*~7vܹK.D"m+**߇ bii ddd̜9s'NBǎ~=y&3c|DŽB1 7v#u&tf}$/'''d<X &3YK./aă <z�%�WynHEo @Hģ܏TthtٴxШ2t<!366^{yy;vرR4>>u-ءCuf̙3233 !yyy?q@:ѣ|'MDI՟|ITTԮ]@d&{)***//ǚР #p% @Aip& j{|vdѡ iqTu۰L=|nl% P:Hĵ|&{ʐcgg׳gO>$22=00099y߾}~98_~~Ǘ,Ybz A(\.,".\0s„ ekeee(4@aP4ЈiMOprYR itg0"0S`L dBkyxx@'A% Naii p�`(5dB|Ų MMMjXj)z\:?IL cɓ'GDD߿bkkd2---]a;ܳg !\.ϯxܸq8َ?޸qq„ ޫJH$555տ3g=zSΜ9iq^.!Dc]�hQgXƠc^TbW r GJg Lҥboo(I$3mh\@ HdPB, ZU9JUWW Mr�"l6:oq´NE}tIkZ\.!8 Cl岿ݸ =D;t:mVp`* oV85B;u̙pN:շoߥK޾};11O>k֬9}tN`pΩSN:{lo~Ji+Wׯ\.OLLawwDTz)BH|S̙l fNDB0aoo_WWnn@2nI3WhvOLbC5 ]CwC:$L+U| o gԨQ3g4J !ݺu[h<Iax<uE͙3L-88ֶo0<N 嘀"lF`CO\WT[Y,KX:h|Q񰔍m�iӦ_.΂Ew&)v3d&{uuutfiitQ.1xդY:d1a-d]pr{!((�VɄ2pBA@@@vv6M]ۿ?lvAv", CƎNNmI 1@Hssl^@Q(Y nVW.nykqh혻/aj &FO qґPEE oހlf`�`(@򪴔frrj '9\Q(0�ldXn0PP@4aqFOuƘAGԨ3;4ǁꦪ[7Fk-;KYY,S:Gk I֭SCe[lC !RCxY[[àB@/EGQ cX)c,5ظ@,am:Ù=X3hM, 8`Z�$Cm7im.n)OgcJG.Q`J!p̾mvܹ0/뵵 6  ��#�&f}haԄ-8:"'̆a% IUhlA,Ę 7j:8,:rPƔ$%e*djmTt :FM'Pa GYbz,)}ݠF|?3! }, -̼$/CXjmSLIщ{SLؾh9,//饗wI|te: $`&H@liؘ i(MMM6a?=%Ya8D(r@)\`0̤R)qk]9oYH3i tFt'#':3eDPR_"SƳgi(cz2-k~lȐFN&STojWlU,@ m}5I˰AM~mP(lORќ<yWmаh ρ t ۠DJ%J+ʘth5j0|>㹹988[ںXYYAWomcc &ʰ1A`` e  ݩ�u|$맵ڍn,Y+\DzLQɞw5777=l؉ e\[!,2T0ijSSS4VE"QQQTCyknntcqqqEEIAAm`TB͆Άvt�'xtp:8q=!F?=JN: 'jg~V-K(ydzzrA* em>^ckLIik!޽{/?_y啺ׯo޼v[nmڴСCM@5j,|ڷΟ?4h!_g'[nڴ̙3!Crڝ;w.]:cƌ޽{[,[ ^'%%^իѣG9wAɵ͛7߸q㫯?#""͏;/^>70`ժUSm۶<y!}Q~~>r~_~=|'9o>ȈΛ7$!$))SN^i&/ϟ?O/صk׳~3Ё>6@|y/cp@;N fD $X,L&c'. |||BBB<==mlQvK.fWUUq8Da'dXP"5l@6)G5:er6 BF Nކnc "Z]Ռӕn<訖H^uk$7W PԟwB'e˖ >'g>qBذaƍݫP(nܸ?v¢̙3/_|ݨ(B͛7yÇ?z;dɒ{655;iiinݺ>J$&~mժU<oÆ +VȸuVbb:ܺ'O8?ɝ;wΜ97 &9p@Jwޯf<]S*ZdO2 YpajjիWo"Ғ+]vZJV_pa- UUU Y\\ 1SRRΝ'N[o3?Y?cFщ#I0!_TΜy B coNT_p4:2;;Tʖ!,,wΖ:thN)^z%k׮DK.J$ZfFۤm4kd2nr/>&pL~_h`FH]lay̕o,|3CąSҥB-73|Q>׭[cǎԐs}eeemrΜ9sgeeoOvknݺx;SPP \\\!رcbD"qpp۷o_f }͛7w֭[qqq?e2mcc#bF ̙3rH&C+++gg禦˗/\Yp&NxekkrLOOӧOՕ䔖k׮uСCK.,899r/:uO:5k֬T+++|ݻo!<SNeee999\.SNI>Ҋ/`@  Ib5K70lVJIȢ(74H1qƗ^2L33:D"WWWaR,2GXK{IҨ尠F|B:Dd41?~tƻ3:ka"(M@,kdP O?=x`jj'&NsVkCÃ3zh4Sҿ#?&"s<a-ѣ=ԩ(K$K&&&B:w I5kDDD_?GEFFv9'''00y?~|֬Y/~뭷!o6t펽z7o<Ƭ;v;vlϞ=~W Xbذa;wНnڵk7zhD2777>UXX]\\͛T*ϝ;w^B:tuspppvv7oޣG~嗊/˗/<O$geeq8wwwx>:Xۇҋ2`@PՒc52Fs<9L##*B۬]%J6[foqvRngwV57g`^? V2 +;ưjRYTV[S 5d2ժ9*AR!|G܌/.'6uZZPSi2Pha?A֑`466GT:Md_W\`!]r~L\ULB( ڄO�#WZIS 9nnnAAA8Y(Ξ={Ϟ=C ܹ !֭;{l.Yd۶mbNJJJJHH�!lٲo HٳgρBCC[eܸqB&,[ ]nݑ#G�roX,z<cƌ'¹s322*++ϟe˖>nv޼y111aaa9W?BӦM1a„<BUPPѣ 6f555?ҥKOܞ1IN .dxfl^6'K׮<f6}T1 i$44rs-|Esfj&!ʪJsI]⚚nJJ75k4JDI-a3f T)n BQr0 [T8,Y$uZ=.pl43!Cwk6;!!bqqq֭Amz`0\]]֐;w۳gϞ2e Ո&<ݷowyoiKZ]QQaaa1k,Xcb̘1fO+eĺwOdǎ1B}KbqBBG}4`�fk׮!C6o|yȃ`ۓ|'J`4 ʘQsjHu1yAJ={vjjj}}F9v22377WܟsqqQT2Wnݚbk[[.]k>trr[[]]}-yVe, &l;Q?P }JSQT,. 5 YKs",NzʃiL!>8ΞPuuuk֬Q*?oލ~CΖ6~c>6IΚ5d7nܹVVVϟvppڵk[QQQZ<"^CCCAA`@NG񒒒\]]ϝ;'HD"ytl֭-:wۍ72224MhhgN:׵kWҀ xzz^p!###///,,̬cǎW^urr'? t;lcK[XX�"00"++kȐ!7n<|0lĉw}wȑ/=h 8'66V/$SRRQUUЪURRR.^|Ν$[VvIf<}}pK$5rkk٫V6RȫH$ ]_~@`mmRiee\.ܹsUUUNNttt:uxEEEׯ_ξr MA� jsøPiT,&aaN cf 䀄ɶU- IgחCnb ',]̌拣kl$UXׯ0UhT*ݻGn1 kk눈I^zAY[[7a̘1Gn˿h4}KKKZZ3 ;2 KKKss󊊊 33.]0̐#GvܹPѼ[P:b0666}d2ܢ TYYYQQѧO5??fO:gϞՌU%%%ܹs^/ԩSAAA!!!FȽ{ZSp2 wnݺrj:Ç]vm;9|ҺcGaaa111:O2::kb<<<^~>}<{i|R?q=e@R Bp(*L7 du쨶W%%·}7j? B+++:0 2 EEEMMM555'O<~{*++h�ԧ!W09l6QiJ#$Lʷey{{;99!޽{:tHMM/i/inzψFG@ SƇ:w_v3eʔzwwwrBcǎ1BCC333%ÇiPgϚ\~`իW,--qVȑ#ǏbZUUUVV!_~skǏI0VǏ9rc-UWW?zСC@!L&Р'qB(xR# b\\\BJ233srr ʒH$@ohh(***))h4j,p8kXkÍfL&C�P(Ǐ=ztpp0*J>|ϯ_~3ؾ Q=H߾KOӉ4hQ:  1c$ʹtR~~~dd\.hll@dd$x!*OmdmP=SVC `]JYhG|0PnM˅8F�� �IDAT2ҧ"WCLY__T.F,K٤YLuH<$L{ (GD�pM?y:49 1*zmdx"}1УGD>|:tj9;VXXtЋhOR{2ST "^6~5F24_ 6>&i-y8qop�8P>d2===y<L&%%%555%%%uuumQa'н y5{�Bф*CJq)Z:noK+Elܣ3o+AZz2 5sx^N@@t8FAE:P�,O ./yRP(^ zhhh`XbsFq �Z 4ijjB�RN)8b=` i4�[b'#Z12] 6;i6=Sѣm 6[Q@XUi-KpШ͒#a�)H(X&TZ__d2cqq1D"Phgg'J=<<p(N]]ptJ7. >^c3 0n$ P !H3 =:ac}`T$\~b^oOd(#OꦵZg^�9#sۇY%;; ՟D"??67ྡr*44s2- ^xpdBԄ}0 @.KTZZZ {\T  4 @K>\.G5Uxeܚ4BWJ!!V7yx~ @-!Z:&>: VWW'fޔJѣ[)"V-//СCEVL2B@r 2?0{e& ��c%%%\.J X,\nggaVupp@ А <l[B\\\ iqk\#Ps!ܚ|)1IٳǏ>h48j:&ڔ_ ƒ F'ߡSq;9� `�ǃTUUA)..VTvvvr-X*BצvџE�nQo8հ̤~̡QV_|a%=F?E ų_tT fQb_ؓkd&{ % L_3VC{ xz4LVOTƆsss;;:l aN݂Na &,@( G߇\\.J�HFA57R;wbRfEg~1I7Kc>1l1&W\D={ݻwRRɓTQQŋE"s+>>SL"hO nDDD>}̙Ԕ痙)J?쳰=0aB~zh"Dre__ߨ([n;""b;+//Dk׮??.t4UVVFGGGEEcӦM۷ |dzMyyy^'wշoߊ#G?,,lЂО&Jm1׌s�wV544KRD"a/D"jjjJKKkjjjjjb1PAI /\ ji)�^JrV %% Ap)v)ZߗcXS˗/7n\ff&ZZZVVV={W^G֭\.?zozz:hcii�e#G"22˄ Ad }ݻwO<iff&)\T*!C^ȑ#&L8v؃.]xxx_~͛322ܹ5a„}N>W^v튉8qE`$Khhh=O|x<oVVVYYٳg]]]Y>qƍ7Ο??**+77wΝ;v駟_޽{7744\x?6mObb fϞ1o<ww_5??ĉ%|^c tf GGzDP\b%M\hށLZccӆB8,,,R)˅X,njj YN Ԅ�-r� 06A5#l'2Fd hITIi7y:2~xw(6nw}EEEqqq0l!..СC{3gNqq]Ν[XXwѝ;wΝ;855uܹ%%%III(..NHHHKK{?/o֬Y .WXꫯ>SDGGoݺqͽ{~w=zpœw}g֭7n|饗^Dwfmm?Ԭ_~ԨQO5y䯾j…111?5m7P�,9I "WbPzpRXkGTjȪ) T 6ihh֭[aaGݻ_TTTQQ!Jt4<>J 3JѠixg }%Bt<7\YұV!؏c_-M:FJ~<Yz?_$^>};vL,^ϟ={vhh =ZSSS__f͚Sd¡C\nBBºu,--g̘rʄ'N<矟ْ%K:wnݺW^y(11_}Un.\`cc3x`'' .˗/OMMMMMݻ zxɓ'{̘1(;4x`ooX|j#By&#Qt90`޾}޾mtW8tz_0kއ4JMMM8�8ʐ~z]]$*++kjjP:x г5~o 7HH�pGLwy<}}oܸ(Xp8aaa͛YYY~~~۶mt#""=zDw֭aÆEEE+sJuȑ_>*--}ꧨ2eʕ+WN<A~!_~]"|'wNOOqC)))wN:=#ȉw^UUURRRLL sIjӏ%J:u]LCb_./]ի.|>d:(Ԅ@�`}J%Q Rd2Bd@,֖ÿ%%%փ(rI3nڴiiH0Úh JY|XV~δS#Pך̡;-J)":=Z]Q$ 6mܹs`իWkkkw5mڴӧO쒓s݀Fd}˗/ĉׯ_,'|o_Yzujj'yQ++1i>w]|pԨQ>ԩSJJ ! \O?{Ճ2iN(PAMRTP(433+//DŽ & (<M5‚xHBPF BU֯_:<}%ڰn7h`3D5U>$7$ofC4XOw hFbL&ӹVL[ 9kOKKĥ}RRҨQBoiff[IIIϟ 0`qKJJL\UK駟@9999 ##Bڵk>f̘iӦ}8&oŀ 4|s˖-|饗Mk׮3fo֭恁ܭo ,zjvv1c\]](44eѢE3g\re}}|}}N:w7x#+++99ҥKoĉj>kiiyȑO>$??С;wngO8 O5N }@``�`Hiho:�P(H$3:iYCHۛk=̓UG =zxxx$''6JJaüBazzJ6lҥKsss !/2Smڵ 7ȧ{aÆUt@m6lXHH\.OOO7 l߾](l۶ uރxÆ ٳ'^vmII !޾-c]xm޻wD"6l ~yf`mݺ1...nnnJ2==յSNwfɒ%!$&&{;wٹΑ|7&,,,$ F$NF9dЁn %hȤAu;r :}L ])gBSDlVAhBn LM!B~X,^|yvvʕ+qPz/<D}<Y\d}">^ݽ|EH[PPqd +'󝴵y;94@X�B2!,0@^YCCv@+(y(F#гҢ fc0{@0�*liԴƢ+:9+d"E5" V8pA!j<-`FXO{a~Ϡ=H7BXϯܱcj2Y`E� . PAy[p8(C:Lhp̀g`�IXu�V`%� o4T:Uc+Rt1φ=Hôs˵332~A rJ;C?kd.]2&-G^8A7н^f=P B62t@ Hn( ^ @XZpp.WB3q6XqUWWcG6"#0d(dO9f2??'yNxs"7~MCm^}A(�Vnp M/7�Ngd5p5 HsOf!/C!LB.B͝L&LJg! "�8rm i9Ǵ䏉8#`LO֙2Y+/:OgP_Lvԩ6GY[[?*?Ўy90|3`0B7([ ZDiyMh( pI8$hebP(B!0!H2(ņ?!mG D:)g0F<3/C~vZj u|jZttt.PD0/2zvj%%%mv@|L4RWW}\!Ϭ[#LUǁ@io(S�5T*|><F ctDɐ� ),&(LPp 4%e{?u%Ӗ Kr.^ؖ`n^bN |.6#9+&iooT*kjjL8+J@�>�i 21 Y CENH%agd2&`&pX<8b*-FZZڷ"yW{to'0) d}]fkZ333@PSS/8( f^  RCN06u~_dT*HsF�pa`MU1ihTũXzAMRѠQ8j#c.`dŋ8.o.../)x>}wީDQQQ?sSSSrrr7trܷ^ MJJjllߺtչs˗/'$$wܸqW=joo/tf^cQFUVV=:""gϞfjhh}aLі-[R_  <ݻw_`=dUUUR~bJ#FprrBN܉" !  {KKKGGG�N<SPq!GIA 0 0`" 4�1*6'5X&+0߯_?ww'OB|>>}:<<0݀2vX`ې!C.^xQ^}+ zj3eʔ'N466nݺU$yxx|78/ggϞy9>}z>}`^Δ)S-Z{nw[rA~O>رcǧ{~o߾W޸q~8l0//۷o8pVVݻɓ8/祗^y9~Z>}r>cww˗/㼜!C3!쪁*pQ&##}||Μ9zF+`qU@qGpC3J%1L!EDV̙8r"QCd@QP6}9?yz 1~˹, :Q�{ם;wP~GA`>z=shT/Ugd2!f!TcN�5jt1ZZ-}QZԣ>lٲCmvgΜ۷׵k׆,o.^5<<~:vΝ;K!\tEˡC+ 0`�>p^z,Y$444%%%$$cǎLsѢEnnn@^> @F;?7444==ϯYf t z瘡v3t2re0Au7ndff]C(p.euހy`,,,Ə[n!09j󼕕J4 x2DaRc&F}jǷAմ8"NaX:z5dyÓ COw`0m6!!!((W^'Nts]vmPP0G|rnnwuu rrrڷoBBK/m޼yƍuoLaÆvo͛7oݺ5VW[dI||;s{ 0~x 0z:{lyyyjjjaaa-܋=4P8�m0R�,`@^i[IH袜s@e(jKwr=@v<"3�* JMw\.`lXWO{%H(= ӧ R\\lRezQhy֭:Eaaq_ !=z̬سgAO}k׶m۶l߾}\.z윓S\\<k֬QFhx"FfpLF6phVE6"A5, .BfeeY�xkkkt D"[[[`*  $Ri �\ [f`1u5Gj5@n<aGT8 OүO5#***CCCA]* <h_ھ}#GhnÖ-[֬Yo_nٓpݐ_o޼|ڵ.l3gܺuI^=nJ)//gYҥKՉ?bS@wV/c~q!FSaJAMtc 0mڴٸq QA6&;t萘M4DwLPÂkD)d2uhSc)�� �IDAT}ݔ+\5mOTUXQ3i0 ݉w?x8V-3�ur Ň~xѢ'~wݺuGFDD!/zoBBCC_zcǎG UV yɓ_{ҥ;w^`-ZTTT4|.]LfddDDD6l2d XzK}0<}ӲefΜtҊ_{!!!s̙<yG}|SL8r<00СCyyyosqXP 5A Kwq䩺0~4&cB >TRȡ;[<<ϣ^ΉdzJHU캆JrM,Mo { ruv)wwwXEB ҺuyСëڴiӱcj4o2qD(2qD*{nlټySNUo4ǧO>'NO:7K|Ν2M6۷oy͛77Ia֯_lmmϳ1)ޯ__~B7NeyӬY3ht)ݻwզM++EBM+_YYIiѢŋ� 2?]f`$-$F.c\qhaJeBB`/NZ F�Yw@= XaGCV,~ ]kڴ)KDAݷoq7nlZ,7d'K=!�@i_$J3* P-Zy,ni >uD8cF|lll&>x`ggtMғXX,1pj549؍ Ka xS[8::޼ymGO p/913T%N=laa<[0[) TRdǕ)ۄjL.=R;?<YTJSg8h**| 8@pT_;OW7UZu7 fbi3qK.rPGs;lFNxQI?�nbdii)JKKZ-2,esss#@B56סsP)/ZkBUc,ۃ*z`tYi- ((腙Ds:Fsܹu&MBDuv4FCd2"B:KJJھ~D K0S|6C fCS&Tu{`9/ pהݻwN,~&A*a@dA3@6 ]TQz0Ѥ5x :P(d J 9Ow1BlhF-s)D!;j=Ӂ1ڌI i~@® O gX{ԩSSƦo߾ cV<F` X0B% 4W7R9F0t҈D"X 2 5Rt̙QQQX aLC΀[YYA ZM`,C@Z`6LZ?UTz!~EzuJm2!C4o޾}} /ǔ jd尃k ]U!<tU7BxB89g:@3J=zfUQb8N't #d2e z=!XDzD  u&m- z=#yF(d9N 8yB!ZB8rH߬ 5O#~6F߭� k�/vK@y\t;J%[ZJqxdAP#H8"X5B^(@T q <o8X,eYB,+H "HTZÉB z=`|Ty8g@"DX%XV0p90 b ή8ϳKo0 Tņ2tL0 퐪;BEv?njT3vS{#|u!W]bFw@㤨2QI BE>-%u#f,dGPѓA XߠjPȍnm`4glHe2 +W^ ߹p%a(bVD@VUXuyqU4Ca8T9Z-t@ЧO/>V-U"M= 6t`~DUkB^/UT&"Z2fLuJlȦHjխvF WГjg9O[jy)E ټys©S^^^^~~>ATQZher&%&&.XEWeees8pȑ#~Ν,!]nR\n]>}|||<<<ׯ^L &7 ={SN>>>ݺu;x =6lлwoww;w1bĈ ={vYYuөSZJ=ӈD .@AtBc%u]AD ;l0LJJ 6 ]nϘ U@ʞ[r Kcy 8'fhٳ}}} !_}ѣ=z߸q+/{B[ju֭B5]c8//y .ʞ={MTCm۶ݽ{رc@{ѷo_F߿ۭ[nҤŋ][}}U*55uӦM7o4h$geeC^zɒ%^dɼy̙ӱc۷nVO>$>>911q',1tEBH۶m ֐;x֬Y/޽{>clSZZhѢ9s̛7sK,y饗Oz?4h͛G5k,‹ eKRlLw>XΌ;'Ԥ}g� g>FK mR"s (e�r>,†e0U4a3[henރ=6Tp[⊆2r3 յDzF*{kL}UO9Tm O3g̟?>?~HHٳy/(( IIIYbE\\O?4|gΘ1#''g̙.\pppXtƍ/w޽xW^yW_}شiStt_~)X}aHHȥK"##wk׮9sdffߺuaٳg?~O>/.-_)CBB>cǎ%%%}g>t/p;v ygppAXXf08 #:"MRȐC`1V8hoH|jFM"j eD] c^8*qbktk q*x6Ñ>ϓ�S m0' Orj+V 2$88MII?nڵkyyyZcǎmٲ3gƎ۵kӧO={[ן?AAA׮]^ \dW_}5dȐÇ<8##Ν;Gutt;v6mڼ[cǎ86<9deejFKquu2eѣG~M2{{ꫯ]v<&~//f@6tcv�DU�B}.I`PduNt+R5yE B\/@bqφ90p`F gӘyamÆ v充mzBp̙.]`9,gggJU^^^ZZ ؗ8::Vv&oݺձc BڴiVry&Mn1:kʕvvv@f0 mEwKa"�< 40=2{M>VĂ@Tl04 NNN%%%�-i`2``LR/ 8CF9!onn5}ʓG?3g(;;ȑ#%ceO>… _sD9cRlڵk7nC c…wUbTTmݺ]v;K.%&&> d:�KI12ӣQ+X.gt[x0$#ES[Ǡj42!N%*G]cMN:4㻪VE3`263ֹ?J+_+~@^3uWWWﴷ>}ݻϟ?i&J&GJ}}מ 7ߴo/+mڴӧς jW^.\pɓ'� 5عsѣGF{];.]<ykf̘:cƌ{feeDӧ7.]v9r$}}ȑk׮ݲeK~~q=,\pܹ'Ox",Sf͚~s1cCBCC|||vp˜ɓ'gddZEe9;v|Ki-ܻw(Ҳ_~yr|u ɫTӤD5k Ȗj " *++ L&~P(Zhj]]]KJJZnh �Z,dfeebVy&}`0@[[[eo߾ ߺt;::JҜ{{{;;۷od2_ΥK:vhmm]Weee...RPPRڴiGkRDF#8p`ܸqX}&-[jgg{jkk.]̙3'((^nBQÇ[ qYRRR\\M,^+fy>>>&X}877w޺P XYY%!$$$=aJuH�t:UEEÇd2BbkkkkkB+L7NFrcooooo4q;<9rG#_`ԙ>Ɔ**٫[&L8qܸq;wwuu Bh`O `aH,7^[M u*++sPcQslzvZRyťK f0Sc̙3OR 8pZ?; f0�ѿ?`Ì<0Sc3Y3hMyZ:t \FeY\`3(/p1]3 f0 j`3 uZ=%7n"c23YČ�+BnZfKȘ@{$:_SS>ORѹ!I)w `0JJJ,,,,--IyPˡڒe@PQQ% BQQ\.H$r'PVVVd2kkkZ;HTPPpܹ4iңGBA4(((4AČ@Tt:Tjmmm '5<1eeeiz};Bʮ\2`�P!55ٙeYRi::55iӦZ2 &9sP! ܿ޽{={y=z nݺgϞXXXSTn``Y?Byj% tTھ}{!III:ujڴipvyTP3 f0C f0=/Ө711m۶5ֺo())IJJ޽e2Y^RSS 09rٹK..\(--mٲenLsUTTM1gXni \xQߔg@a֭[ 5Ô}Tٻw)SÇ5Qi0HOO={իW !k֬4iR!|ΝFCI.\c=77… OԜMlhѢpA&::,dgg_zռs!}A-7%%1GDD<߹s~oOuΝksN둑Xm6BȆ >!##I&OLL\bżySNEGGoĉ7n\l !@M0|ٳg[[[/Zh/_|rN>vRKKqEGG/^xРA @k6iҤ L.[ N>}׮][t)!DPj:==յYf>ҥKzzz֭a>f̘5kv~aOOϙ3gBbBTTB8xT*=r䈫a6nHiYj˗ !of͚_}w bǎ$>n޼ȑ#!C5 C[m駟ēbdTTJƃS͘1ťCvl$\yfaaa#I|UfϞݶmӧ3wޙ:u[hh+\B9rd~~~HHp˖-rܸqooYYٴizll,H:99ٳo�rnaa1mڴ7o&$$`O8Ӷmwyz!,;l0o۶mٲe&L@.\*..?nܸΟ?V^u֘޽{O0!333))ŋjS*'Д:^z 40lذ:66?<yE~ӧOϙ3'&&F.1"&&?--mĈ-ZIII ?sڵ&M$''WTTdff'''G[[ۘ«W&$$̙3788x7oHKKi֬ٛoYTTtRVuփܽ{w1'ׯ}˗_xۛ0̔)S?f͚3g.[ .Bȯp SFEEOȑ#u:]LLL&<yѣGFron;x`DD"yiӦGXשSbbb,XHTz n޼y…ӧO׈O80lذ+//?{lffJJHH~zqqɓ'o߾f͚5kDEEoNO!$C�"=zRT111:vĉu֕VTT5A k2L Нr<jSRRKJJ#沸̋jHRj''5k<!|||{ォW.Zh]v-RRRܹSVV& ۷۷ܹ>\.W(lD斖vҥm۶)ʌ Jm***ryqqUYY`(..~ xxx@Gz}׍0 /٣hJ}&M4J*..{  _VD"GGG^E"QS�-Z:t~haa߫W"h!cǎ;v :tǎǥjXJ@RRefffdd\GJ7o޵kVU*vvvM6YEdrypppzzz;X[[GGG3 SZZR^^^\\HzP#m۶CQH8pƌ}Çʴi$ɺu***t:]f|}}/\Q\\@TsظqRj)))اaSNJe}YO;u4|d��� �IDAT ziiiNNNb6loyfwwwȺ!--e˖o֬Y6\tP(|rHHHu<iii'N4jb@ffs"""8P0zѣGXok׮5!===88 d #q㆓| \\\NZwwwGճ"--7߄.)|׮] Oh#j̞W} wuuMJJ =z/((v\jQQQ5ޜZf^{e˖۶m޽J w=))IR~嗳g;vmf͚eԞʕ+/_xB]xxݻw333FqN:M6$kGعsرc'N8{ӧOcmf͚uڵ{И̘1III(DX:&۷7 0W^Vڹs'q)))+Vo8رc9nݺ.]m۶<ϧ/\믿LJ?coo߲eKBX,vvv{ R"##\`f޽aaaC Q*GJYYYs ͛7ڵknjye˖ڵkҤI`i%8;;چ2DL>e˖"gϞǎٳgqqJӧO"j@ P(2v،3g}_}Fqqq!999leek׮={Vo$4qrr믿ufkk+b@ `MH$H^/**tѣ[hyٳgϟ?_(L8q^^^vmaa ,1goo#Gŋ߾}C )++ۻwofBBBΝۺu 6[Nնnw <;nܸ!Cܹyܹ-bf|_e0FH   &;wqau8$/_@iڴiH!?ީSWYYY2 CCCo޼ƍ2iҤ={2@dr|Ϟ=cǎًw34pww{[ `@ЫWgϪT XZZ6bd(x#MhJJJ 15Čرcb XYY5F8uT=J% iRaBhLÇ|MBj'???ŋJrww#;`,Ըp9(xSļcǎ۟Wڵk۶mEEÇ-`3PQQg;;Ν;H,Y`:tvZH0aɖ0qfc3 5CvڵkguUWB޽ې#rss˚\VVHQ*o6.++hJeRZKJJ եeY" BXlRyyyPsyyy |*(..�TFc ݙ OkAfFۺukBNh,ӤIkkkU*IlllL(eH VkS"JBH$2֮:+++Mw 0ecccZ6ײeKBX{F70`3VXXx+W�wwwj,˂a;רrץAnT1zJҲ_, I&h4F k}5aHRu:q_\\)LUx߼J2F o߮x饗xVy͍fPiXի80 ˡޠ`yC0w5`34f3 f0e_^TTt}۷ݻg^}p֭xqpJII Cݻg!޽k M~߿_K,wޱ{/MGi-r0o޼W_}׫Zmmk޽{_?~ժU5 ~\o߾e˖6|:lv4i$33s۶m{urrz !+V�~```ҠChhCΜ93}Xoo}czkAիWo.,,={v}#O?eeemڴiܸqݺuΆmii9o޼'N;v,"""//o-[^ĉ'~ÇȨl駟BN222O:մiӓ'O.X͛$vv2eʦMw.H !zSL{wϜ9cƌqwwud_Vl�mzBatt4!_~INNvuu֭B8y򤥥ɓaÇB:t?;xp 3#y  EfM;wUZZ?mٲ%;;2lذ{r,wllQ`&B}]C:um6N흖 /므X>}nK߾}1cƜ<yÇ>|F-A={vaa-[ƏߪU+V :d;wgWW)Sڵ ׈ɓ'=JqssǏ'tϯѴz6oޜԪUŋ/^xǎEEEٓ'OVޱW>{lll_ll,֢ŋ!p֬YIII&M|s,Ycǎѣk׮/jɓwرx⤤XRy֭܊&Lw^ll̙3-PuXlٷ~]^^T^^wСXV{ؼWz{{>}>̌}ϙ3};w7o+ɓ6l?~|llԩS ooo0eʔ쀀{{{o׮]-bq>}f#ݾ}СC?~ǎ?3fdffCG~,YuCٲewII ĉJ%4lH~?T122299966ݻAAA%%%[lYtiǎ5k&{u%K 8?NMM>~8ڗ{׮]/qㆿ7SNmٳgP(f̘akkۭ[8p_~ٹsgzz:Ш;Ν;$ǏO0dv\]]gϞ}ԩӧ={ʕ+AAAw܉yZpB ~۽{޽{,Xн{!<k,;;~EEE!%?7oާO༎"""\\\|Νk׮, 7i$V?i֬ٽ{&O0'Ν;Žzԩӝ;wJKK\booސ= _|ꚙT*ӝ<==B!t=y7hvÇ9sfzz:q0W^fRO?:u0ϦNo>KKˌ ?UcǎhHEyy͛7͛occcccSPPPRNvFlӦMvvRbիNNNM4D]tij6mZbE~~z}]J/Gaoo_ZZK8wkժ`pppP(׮]S*ZQIOO+qwĉ̟yܹ...R-77O>;vɁ^$M47ovg|CK/7<==7o~OO϶m^~zݾ}[n<0rZ_?pOu޽{_~uR+W z`B<==w%Jݫh-Z4`~W\__~%%%*..{]qqq^^^hH$tFdEEELL !חe>… :uK9mݺ^{7=!bau[@.j ]eee8pe֬Y MrʊӧOGYA*>.6>><,FqF kT{Q(n޼ҐK󄐘,[UuxadddAAZM3 T*qYqo4|^v`ggxsVVVn߾I*<b,[BCCE" .h-5``0L~\\\nܸ6XM6IR_____HOO^{?6!$??…PӢE __Ν;cqqq>>>EEE|󍏏O\\)#8|0*^ �\&%%\"jҤI\\ܨQꤖŽ;֮]~_=66 oٲN-..+zסC MApnj~DDDqժUpeٯ733_N xlmmyoڴѳ*++#""$g}<=W8q_<x͛Fϟ?ɹs.Xb 778ȗҭ[Yf͜9% ` uvvgϞLrر$~Xtizz޽{MzO1cʕ+mmm6(ˉt^^^ZjժՂ ;//+W<yr Ə߷o_??(޽{[ܹsW\5ʀ}݂ :tlٲKӁOˋ1uԴ4ax BxyyiӦ++SLvZTTTo.a3""*ׯ?y򤗗Ç?S|믿^NNN6mj|iXXW\\\xxx>ݻw{yy\2| k6m[n+VXfȑ#_Yf 8G_8qZO4i'N>w>-** =$$%22r˖-Rƕ񝝝CBB֬YP(�U8~+z9f̘˗O4;++ ;CW_?<88xwu._5`� . 6, 77ŋ CAA3g.]֮]ׯ7Ȟ={300pҥӦM!ʣo߾Ǐ|w.ٷo7n<FՊD"9Dzt:Нu:-8#H~St@,z(<HfffD֭[;ƍoɓ=z-1zfa8l?bgh[㲊N:AZ@hK-!`0c pԸjO2cO>,xMa�)))}}}J,k0LukU�U7,xE"̤P(4 ČTFFD"quu5jÇϟ?[(IUO\n%#IMM7T*#:0K0Rmg;XF*>ʋaO^>.Qqh#M(61"I6lrʔ)S߿E�=EhVq&<"[T$>c �սqGat0Hky`C25?cbbn޼Ç4/6N-YuYz܆oZ4ڢO?vE]AGJ5qD+U=EZn駟V^k.J5eʔF+2)k7:I͛7v253< (<j0"4.&O t㍲24Y}VPT�=i|tjVom#ME%BHyy9i\ 7n4nۡ胮T*YQQ" hѢ!޾NBM?w)X;p1cz`3nO k5J`3kk~=b?xU(7ɟ9b6Pz_˲32 ò,C0_TY)q�\G)@HTrD1X!JmllZlYXXXPPqZ/ϑc7eB!tŐyx@ւNςҬY_~޽{A?JϹruRp U0|G</HJR)e V~0^Glb1qpW!aL�B!DvjZ؀_@?0 d@y\w 7CdK�.q�&NDa#&0k k |<ϲ,!ཤ*5&C6 ,%\dYV$p dX_<]ë7\n&, Z$a9~ .}', %  RRW0$`3<">-79BP"q"/-O@ᱚ5<xa;;;^_ZZj0\8nV[0SR Jɏ ENg +0aEJJJtttnnnwL#{a0F{�v YCVkL !$#C! 2fYÞ5^`^*�,-;pj p�bH$jL< BP(yQN ?&"p31d z� Ôgee?Nx!(=f�2F!;. !ui˲@fL $ |S U@9X&a /9(7̒8XJ@AaxudTR30f y$ 7lcVZ"TVV8S B>L 3&(ca)1 P<";&x^dҪ/n`3( k8 M Z\FtHd{Āz8F:>`j<x�sN#]Yg%4Ad˖<˱ZVT&&&iԩS*Iy<^NbH4bF[XLIxc#r`& 0(!b@ lKGv9I#)x' !DV<|tY �`dMPfF |DT*՝;whJ8i p3  YB׍Dcw 7 HD"z=H#!&?0{uѢ+ZdB(ot8L'x2K60p8((ïpѣB'! FCD 9daJ �l s@kqհ �(6t:@%\GA97 p?3q_A2i4rJ`qxt:6#'_sǶfvV\2�%_HԟҝRHk˼R>Hm9G,Dp'82%%R*޿_VyUMZ/8Lמ8NW*;\JΟ'G#[<srhLLX*#biH&af$@x* MLvu%<QiI'eSd(#тWf@#D_(""> 6[,˂K&-yn(X�Q Xhb�8J܀PاH* tp&F<k4 $4(zՅP9 ȃO '?ւao0E�� �IDATbVVvJ0@U�Q *g 1hNoŠF%^rFC눴]{s0 r"e/5&`�[X\YY Zr,P:ދsBq6цJ!7zBnN%E2 ZnrB! BPp[2z+!\ @YgBHvLV0 04!s֜X}uZtҐt"ҊDGNaVVӥt!/ҋ׉ED'6[P+)ҢJqfSi#O(@(U\{\uQ Gb+|'Pu䈀H?Zy<"j" 5 �zx�?D#հY #!kL)#|(Dq!< `eo4Cހt!�=B|@ rt@s-,,41v4 j0dK@ ϡV^"v *NR)#J!P\ :h$FL&҅¿P\ U^TPvMgȘAIU4jq=(G8a&]hEi +<E}6$MZ ;a' $' (~5*;2\޵kWww˗/j4ˑʓJ0|Vg&7z7bN7ejJbYV$өuw<k`99Ym e0KpBa'C'xu[4 ^Կo$5zyWq-CvG2}(�v�#) C 򷕌 Ѯ z(tÆO"x=yo0zAd񉅁5!TUTDm.G:0<i]QChACQȆFAv-vGϰ.J@PmBphX{]tmZh'"s(1 pњU|$ I  _E P߂_,+@S(:\ኣ (4 F*ILe#C!RU^("T*uww4hN̄F-f ˲`EvUpVZ N¡P /B)4 6ڴi#JB289> 5,ƇSYaΦ;$1JWI :thVFG(/pC옌2^ DDBP"tZ[ +N+?!ld_#<<Nt:Ese;yƙDG+ XҘNf-l: hHpiۆFK@1aP</nH:NeY `3t:/1^<Fag8>`ta{Po702<Ud! x<+Z젗PIڤ\F9wݻwoܸRτ;?2he<-G&"A�HH,eO[tR9x9Țz~…SN1 @>'YNh9E:%t!cwX ~2P] ( ӧCcM€] %BgFR 1<4 0 CQ eD/`Դq ,<mGUEK$_іn$^7Hi67A(׃(Zc AJqF{T!(�,M!_2DA3ZV`mA쁶fS3p[ CV?ك}m:" =P?3Qt|SP@umi@^%!CiҡP(hPC h Aҁ9F2tҌ <{ʉhY o̶!U},Cޅ=,vemLF( ^F72)5@?X'fF3J%m3L˨zP8`5. DSB+lx/*FC>=FHIapTC* JN8ZW F?"g`)pw 5:HD^"!]*hWoTTTldJE"ڪ<Q d#T*EOc!@#Cwu?TA:GFBz꘻A,v,׎#`8?zt: F:B!�  TP; 89Gx]s ;w Eڑvf8,vzQD!1z7aoiSn}6`2;a;&: :�xv\F? X+f rS\EߑC<F):N:HRB#|EH?: q 6HU^vnFH*Q0h*z4(ڡ]<̂ : L(ڄKFT01d| +恪mϑb OZ5U@JG^`\Zea,",sCNP"0 Ě$+%"H/УA^BG][.3/>7Ӎa&g vV<YVsrrz,K"�^17hEag%ckERF3<Ad GЦ$^F\ s(�c: +4E-ߑѢc5< 0:̐a "$a⅑UI-Z_c[8hT@.8BF.#פ@ّQ 0E4/, 'UFh}N绔F[:p│f Lt:Pxb`B&ɽHh5̲,_%g$@ B;9\;Ph`;<J"{\B RX,FF2`PZG- ̆Fc9@k]iB> sK& ~sZ&U4_A$16&EN9D&iy H^J: ^tAmCB"D"A**j,SeIbGEPZdVi0- /jEjr\ѫVq08k`ŬX&ypPqGNg4XZS=8]InMDARG]t$"!fѱ$Fy٨lAǑca G;#*%݅!牎[MaTAL"HAi5mCsxtY&1īgP ?~TQfh5L@CH@ t :[IjeXhF 6<Èf 5# %hCi4, �;؈ zD"69P_ |mE4CƏzoqԴ8@%⏄ɨ}a+x:fҌ &@V*-P׉BXMAK`(  +f+J(b6¬1DZGp\& 4I`J5fShmmO a%=h'c& (Y*rU*a#Wb8 QIW0{Hj4HK7= yt>,SbmҤPh}QprxۑmD`f9&,\~aI8$t=Zo``8GX 6`>Uh":ђv-Y`.[VG (t}Fڞ.kz <EtDq(r.EGK8!F Br((~c(›yw-fDB0LY&+B=3G:n'`oZ?,/q8ch- y8V!B#n~:73$Π AC|?1 �ʢ4]P%?Q-o?]V&a+n$ݢL^dz(HQ.C`~[%~$hj-`FۃU}R}.עePF aeLܗ@4x?3m@@dH'`~ <GW(ֈĸ祄X8Ey<c%~~<ހ?"Bmvct%厴"{Y"T^X&5Eo3r,7^d% KsZfFBeXIDBF\!NCY>put-5ͱhLgϠoPep2:-Aj$FZiW@ CI׊Up,m~FhHe2^�PB P95 B-0VasbP;IIJQ"Uw-|U: dP=hӠmr$l寕�<FnRrHRzT=^MQ/mCR"-nO%U)lBQ o<t\,-ކ(ѩF C٣i+ J%hGh4$%DzeNiXӶ;Xd R<qtg ]UmGOnL0qjזi2YDC(ܠՊT. ?{8;*k|gcHbhDVPWmlZ[QpxQ_Tp@Z&vH3$!IURuW:1RP9{^w[C)UʨgQ"-<Y ԰VE5PzSjx0äMh}NaGѬ!~K$ ac"1`z"1�jg`nؘ 6rMf@ lWqXۙ}at0XϠ-(XXz3ިeYa i-/-88[g>_�aƭ �e81QᘲE'S7|@�V%Qޙ &:>>BzؙAZ*aN`6rI;%$`lW< =הĤ"5-\[!QV(S3įOXN,߿4ܘX m2n!E:۟?`Tq43֠ipe>V'$ õ (O$CxZd4NR`VUĬnFXF;(ȌQ7BEgB$$]Eޭ,C[CR5gUάrؙ;wWz(  _8 ^ljܹ)_x [w6�ŀj%��-0aZ.$I@CJݣ%EqjY88?1f\탎>g&ϞNqׯgwhYLefYቱNDv[q#d2:c\` nc֊u|?q~ ~Y.>EJL21 1Xz1Z`. q 2< Yvu0>RZsXacX�#h#@K2Ư!` _ <XfH//nO:MSxq2MR,U$KXr]{98�[j�UUG&ˋXtK^=أ, inj}f^` (ad +3rO.CYkG 3`s2d<7In4} 3_Y#D؇ y 0Ⴠ1hc^A&r;�̟?_'ģBf8\Y_<wwN"U:߿k7䞊ǔY*&}vB*LB9Yۍ#5f9\0Ā@$$Er@Fuij\Ve-@P+~b9[V `̺{%p"Z!cIsv*b=ϋզwv>ySOFB4 -MuavI'>TCMWu's@wf1;I#MX=AHBh #S5:TFŒeqJǹ%ڠyXMslƤjAB.YLU}c<^qw9kPTGmY4 ʢc,Y{Z-9/ s+`q.O/ڥY͢tl&T\Q(Y?$}"eG4>DGkTdj X2JF&\'U8O~\YBC<ȱD)V̀9VYLQUΞFlf% 0Mw(~_oHu(*R ΎnBssq,vCrOq2)Re|ɍ7,O ܩ`tBCh`"c:fStW0;<%#ml!UUZ"ry~Aw"MjXe6i7<Z=4& >yn$I4iThZ###^Ihнz@ [Z5<ѭ4`^Hv̀ 8#MkUu~m6ܫ,Yg2_Ĉsc4έv'ZO>$oJoL]p=>N@ y\FWw@bkv)�sx 1[bbZY1yy2V�=Umʀn1 WfN(WBm,<LX<?zB0򔁨Ӡ˛PKbfwt<~󡡡ᩓ/]q<4ˆ H,֬ f!�/fjkT}IW'\zw{dU렂ŧ88i3;9MX?e7xg"t=$T"S)0@nZhs=W\$=(ae_YGx,[$Z0[qЯ{qnFc=-4?WUR:{:V> 7pZUS?1hp=b&dO,f<3MhX60̂x5L9A�̅ Q` $nL-l?1FNߩj\v0IdO+/$䫍mI9;᮲@8&�(ڗkcs.z]!Wy@*<B*ėd$r8d*cbhj"LMŻ-7VUf>3o9|p|i$73^ lLn(4>B̒EN\cǎ,&&&,?ݳs^"*N1^tuocVeU>URI eY?dti /q}6=g:�ɴF^ԅp!gXLLLt:_$(XG)˄g(,d \*& NXɊ)KL0 0>zY2$9x|W <}Bf}((fYd}OyXdYtN{Վ MQrBEf/Dz05Nph^erjLJ_4o7'mv0  &pyS3gP3CcHqa ;_+ƀm-LNNQxv:z:_� ;<2b 4AyAˠ<ϕ+^ q=5?}oۣY#ww?j�Ss$ PF#9BܔD&{-7  1�P%)hx0@5%' س0 L _}3 koCpCly�Ep+ 2pPChwYW #EGsz9\g@RZ~Э`vONNc�� �IDATN@l\6]R{8ˍyڧB_f K G#sZź㮳31]yuo)} C L QŘȘ d]!M+z,n,>pFm%ѱxe4YqТ`m��?ė<0[}p</ܢ[Q3OO<83Jj-<Lpcur/xnч{foy6.,A6� 0XehzׯVvz0ٴI�=j 6z1` 2*l'XqnWsQpD`wrv >4*rrr9>OZx8پ,3$, ujl:6 z Ay 3-{$$VE?# "~u{; |#Eᅋ9HX|_옂hy0n5isk5,m=0Xvmz׬G!{p '5 ^1V)UY)bhhh/UK 24m0Qp!/ mEDf0G0 -h!]McޚFQ S/Whɇ&`MΛ7jm޼e|2qĜu77v<#CNaD̢czJv:T묌`AjczN᪪>uaxFq#|Y dpzX$QXvl&!:F<HidVafE&3ueDm35by@& 2x%3=("Q1 D#w06~9^230$�^X}'sk3<<<22Qk߮!]@1K{2,7Kݡ)y5vfT?9۬ݮZ# mapgBlΕ((-]wD] Q lݺudd*G;`!hw)($[H"e[p^Ec/)Ѳs.?I4G=W",9q(-5c>$k<Quyh1$̓V2XCQ0!?a(>%I3lJsUiAP1Q$N`R0ՍÉ>4F [B>xLF|F ³b,(Zm<iqƦBٕq'eJ;n[X+-]h< %`Rd D0q5Œa� ˁErf% шoZPX`:MҴz ˖-;k/zJ(<Jd-?((dfR~/xfp \*B4 *AZ_`ӈ`)3ݗý$ysWU~" 8j>Dk^l K(z@|3m0)ė&<->Qmq(;sS 3E: stqF;ઢ'f$'Nj' Vn 0T_+󁨕vEo@`Ƃ ﹷfӽ߯F+cLjqn9<fh B²pŦc jRʊOY Q8L3UUSȟW2Ԛ,k~022j4Nm(Leax�a,uB9 B֏f@h ѷ^/]C9 HTE(zAS'rö1<J#z<8{Ń ZhJ.`u0JِeF ]tu˱[u;O:eYGYqěckr4h, jf댽cnzwb+W [C.}EaX¦[ Y�.P&" F,S:t~$N̳M%UYha3bNuY9E  �=Yeʕ<?:/l2}Nqk3f㢀1vjMNN8&X`yqwQV$R�46R=Llk;<׽W xGDQt;q9X~*)c5j @],+<dDrvfbr`|n롵 oYuuU~~캿<!GVT pD>iHau BPO :]Y*" A)%-|4S=yM_Af}�ly|ъ =�},Z-M~�{gb+–uEc-@,dg p,2HyN-/m6Dtqƥ�n4r[(+SG{9^_ٷ$Qb ™ A||7x=0g!fwLG a!ugH^*Ƣb2~{NcLU WՕwf3Us_A]X} ОEa%!\&5Lh8(v nX ȩM[M<{:Ηǂ [}6 % 'tq#z༆SԨS?wUPENnE <tB<*Ocq!!L^>AS�kْaRiS8 < 0'q+ Zaΰ)2ђV!̔ã`cBE{0\Zj4+pn [NC#IAP#i<5Ym|1K�{3[|dJ n2ի 29{7oU}q-EmϻgŐ!<w(҂L1\@0ľ8%(v[b.Gv슒[T+! wpՐcvɇ a5\" {F$IE-I EzhVUnwpĈ}<c ZrzB.=$2ͭ`22+*D&Y)I@$eYbsɢV`SF1h$;<!3ӃFB`c)g9Z3XlxVIe<1J )XYfq׹AyԀ ]S%T,?11 AG � dQ2+TjQtq%rz^AfD`ǏGWƾlniH9; LO ~Rq׸X*�=XYE/*˛6Vнg8=Ab9T□�sP[T&e66(/8WxA[e/ؠseMr>1ݔ=Y,UU rXf31mmZ^.JCaV#l>KtӍ4a�^1j/@3!}6#w]_FMȜ9s<۾}{%O=L@]Ov$ÅW`RPb {KIƘࢀy.@yI]i [i4T�hIgq{޼x[]y;HFJĺ՗^ YH檳kkc]á6n?DSE+r穞ہE]Y"=)/{?Ux P)<,HYb2G^\-oY.P=y[nA 7>p-T\ p1Vy~YQUg|�8>pޥǤt"x_͙wKweOhB@l8 AU wq<=Pk${4Tz-#jt˪%0`ҥg|o^?򖷬XVuoDze4n;.l6%(2qSqؽϭnjj?Nh3JRÛ,r'|;A,;V~:߿+.g*6Xf^Tkd9?7gvW9;б<lN&$`7'}v+c><YT6܍g4cXQA$Z @tSu]!^KI`Hc w}9f]=RUj1_v?E;ȡ Tfz )%1WTG.jyޛ~55n =ІWbD[Q�drQ˅,ȊF8hCBarL:Π87et-b۶mgKQͬ\ǃ;и1QSns6K^x?Z*K_mx{ŧjLxxز^Jl"]rK;v||d?&1'[VC~eHL!eYs3Ne97-xX" %T+Ι7'MNoͣ&?878j`MXKA)Z=1y].mX V L.Mq-hh[X}<EorTc$ע@dQ|h{o|R .#~h`Lǔ΁s|gU)LJxڔ{WBoq eK33c(*[L0W^_8~E/ 8˳`,XPUU-ޑ^wy]wݥ&s"_@w1zfİS4=TFi罭=w훹mzfGdٻ2:ud,Kn碎{7**z':e?c}y~1738BhdJoAhMn>YUuJ/q$@؍e7 #"I??_o4W~|…s~:d/^`A^g$8s.ZlB%-ELa^v4lL)qoqkES4q3i0bGI0y1y(`]'&$66�| wFIOMUy~~aV[o'[EqRcUZ [40ʢ e1)A� F)+c0[@ERYB̲_'KW񹱬w˲Vk .? -ZhѢyh\IhC³qn|z #=<M>c.]x"v}<wTHƛ!ExF;' ùsÚbt<?.I.ɓsU1dhX#\YY2eو35H+G]C kN8cy'nqEu^{֭[!vUj.]bŊ~i&nAK Xp!v؝8jYAd͛8a `ePld+#,3*3o6W"qz:˲vU5ZD0rȏ,}UGߔhV v.?&/7(VL87aTɾh,mv::I(0d%GFiU,ӻ ̃r+Iol^pN[jZFW0(ƘFv;JMFE0Ƥ4mN D&̙|[Bv!MS1ɻe552ƄSs 3(ȻE<ϛa|# OG a>I!cgE<.s~ϻ^ɢA8~ߠ.D2 w O&˰$رcllL/Jdv\Y7nА~8N\fѤ3##n%00k *,6;B g1nLUb*c{H5I\=^ej]o"C \3JpѻH%"%Yq^mZ%,CJ{)._{0^>8t0Zl-r1fJRBLS# izyxeCt DϢ )cܦ1,(S-B2 {ay0 &>mΜ9sQ Ν;66666ʲ,_] Yu8SY}fֈbnWx<#cLQ+~S@q_^i{eY&ܺIc-(qʸHiFy1qY^g'"~Fڐ{AFS̠1V?E,nh4&IR3]e6\1՘n]V ^"[`!grΌzWFO~]wm߾'~txIfժCCCNr ʧiSO A` I ^%3PCwxC A@qa5p=0uHT^@aPuϛ[o(dzФe(Sxo]RM^qg ]w1cB?F"62z~Lj\F5_ 38W ) E$ӂ�'^0�I}AB`8 T;ΰ9VŦvy> `�GQr۷qU*V:G(4MR$e] >+,nt:nw*wp*t/}ajEtk>CW? IqD(vL? xp7Fր 2`AU(a)R C%5lHU o}5HzWf^乎kڽw=<ӳ,{G<]7mtWLY_�YeYJ%ղ*{yY}xt۶mӷ/ƿbU0 7aaClQf:Ar�CIH{]xg X6 `e4|>fly}g]QX}xSU= ךCNN~xݺ#]T9rv;+{j@k}GlG6""0)+tqCZd# Y9W<�r-e9s̙3g޼yyOLL�]\psZn:Euc<6vXl%-S]8�<=%>9r#8jCYbsH^eGdžwTo/=/ Hg(˝-NٞDzi5A<_^kGk2a HkȽ̛֣gH"']"ɠ%,y}v:&Oޜx=Y$*~~]W飏>z5XsM[A29-IV%eYw�>R6 Suӑ!q+IL;4Lp�I5E[(xyV /q&(r'0No$#"? A(#,%b JeYCAyم)O=|`M,(O*_atB{lQ ;cԪ+ y_LߠY:l<P~fEs2Pi!�*MVA 9M{fj*by[?(^җկnݚib>z=gɞ~ޛ!/-ٹ/>_p&ߚPNA8=iz/E;ΩEqI>Y1Y & rH cw5-O<(suݛ='t/CgX(:hEvN{H0^1&y*F#,ʲ[V݊)}q:JB$]@xrZ0)JF2 ise Cʍke䉀x7yx&'0z MnB?OŽu[Pu~S�� �IDATg<|䜞lA08Qh;x�uP)m�yR%A,c^2H'2Z@w6˂H5K2^0)N\tiVX_zR6fʲk6 ,~lRJa(Y~j(.]yf}^Y4=wq}7<<\8Efr/۩|+ߖӴqiƜy~Ew</Gp;e0y~LYeNY`?ҳ^84o{ANIǹqnr0R,ŗre)Ļɋ%9<t,|yB&r?ΨHSbM]#dQXo @{u;V'3 (paП D2=D\|G( 6N4@54Ui`4ɞz"? ӓ;'(Ǐ/~seX<9sq9 ρe N\U"ibT]�aHD4<OMH/=(ͦ Ffs+W,rkYhhQH&KG>5V͟?_NNxs_qG}tll땫JyUϪlFf * Pvzy+E޿/"#^<ϝp$PQ"@:G(Ƞ( .’f Y$OLTПWJ}IL@ӗۣ*Ft:+P^x\u;4wqpv=>>g=F٭�yM* cMƀɚp_>7LƤ!1O )f!XfƬN 郞tC!q,Uؐܗz%NWa>ù1*Ǘ�ʇ�._3P roVSELH#@O#0Ak:,2F| yј3g:EMY* ߢ(R˗/}awѢn:xӑ;rSmiG:E΃N^###eY2& d nq1Ts[> Bdb* O$$< ywKV2?̜=X}ax c"Ν;wʕ6m-fsCƜZlye%Ȝ%`&ULzfBh^Y2\X0شˑ IFxN%ۘ>{vT 1oh,GYE7!D �ɬqG|q\JM3ɲ*pUfL"=7LN)Mn䢊/Ecj(*!pB}G^3{4oj55r]wOt@QyS{^8`yټi޼T1( ZVIa{ߞPDzq}Nrc!K#X XlocAn:"wq` t{`�Ů>"p18J,L!ڱ|rrr_N&BΊO epF`bE I X3 8pY{ÊyWajyQn9<71_mƊ& #q0 Bj:+ z(7Y"{#KB |G?wm4F]x1ÐUe4V4rE\_DH}dcxAVi�O !|Rޕ#$zXP4PDd5̓:T@'(cͦTO\c=췫//xl9+,|qIXyxnO5eYc8㺮LL)Ӵc`P#84aEDGn bo1ޝJC;t-c\-=|LȘL'3΍NrF]eY6<<<x__CN93Zu<_@̙~jeR|ر,#*d7 gi%j ]Rd}n`R�PғZNx�h 6?ªZA+i PPbqE gA|^jTLc)~Yvj&"ᑾ%r{|107U`'#6kfôdv/(UDW;R#gu�+L~bq�n,X> oP]^x̵y[폝{=FNYc#WgENݚfN,Ƣ')bo2� o`.'cn<5m֬CO/TUUy̔/+2׾bܲX,9;ƺ�PRh;7�}Rb+0ӎqˌ`3 !Kx@`#Hp@ @g<*VSEd8V}X99'lx˲jfsllLiPX@7-zbxx3iefE1G D xF9q.Iatz= ,dT>-Bl6ƭ?Zn?<yӣ/NgVk{q=`OlxleI6914 }2VKguoP'nZN)(e,7#HgjQ?iζ'؞/1rO}_ LTTRm}ֽd39X"泬aI�El`b;czh2_& v4�)hZ$~y4*z BŜTp#mџuK᪠t8L#>Є',z^y]PqvDQt/][oFʪzmCA Ps^T+}3f+oAoٲD mJXFyP @2 u9*x:5e˖af9o޼+VZ%㚉Yճ41[ ;w~Ƶs轇.[̛(T@~P,,L}<' hOʢElBf*Fއ.&=Vaa10z8XH2 VzJ"wai)7a{9;c.=V]9xqcB^5`'} Λ:7 NYɏL6NoȓS46nް"$qCqg#"?v0'S SnlLɩU~nc嶍z agfY8ZN=?'''ʪhD#ëJF>h$I$/jW,փ ,τar-[6Qu)linhDzЅk㘅GI]V.J,+zsi4ZmΜ9Z,]tܹg搣""u//sYewD-l,'''lٲcǎm۶,)١+jsFcc(LqLNMw.ć@<ӗ¢l .�a֒|bRrOQc |@yQqXYF;pcAE֩L<mke)7(xŮo�85 eP 92l=ZbA ͣOGwmKK&lDa"Յy_a^UUZ2NsRjc pPC@yL~)(tZ(\ yVΘ�sY O�gzJ]6" <L 6eXO?j]c@=1b8O[/3y-Yo.60А(_C,O<Lˑ 6-&(Zd ;LCsʕW?\쓧ֶd):eΡ?>|v۟=It:NZB պJD4 | RH!],x k]phÉi#;HMG̘2*+f+hX*箻ӑ׽nb`@"cyȒ8ieѐZBᾑ1&ymטn4vN7kK7*H."l4YEv\utMekjUkԞ-Nc ["@c c865XpKP3ɳˑ> mhvu8)IƮF!>fe>ep911UUn/#Y e^mE .ܶmӢ`Ƀ\ Z8Ը79,uz%o'''bjCZ4xAo-qV}ksSìXq9ݼvڱywR+o:5-F \q"bi-3 \(sϟg0{˘2lu 0V b[]A:K}Tn*t2 aXHEsF$y@7 2k?sMn襙;xQGjxKr@I=Og˲*ܯP 꿪Y 3Z#CFAԦv=�'A[><@@6S&p@g] tq�רC1_%ĔЪlpb~&c| EyhhSFskӦZ8B Y-܅o4rl޼yڵsGG>ꒃOdpM?G'=[g` d[Y###H�bC!G5*9sa. P!-800~)NSVbR`:gI]i]?_|_>zWAu}! DxU;0Ircvx�G2ZhdT~A/K,1e-5… o>>>n6a^ aDxRݢzcD�DRqE|ˬdM3-'S@4"0T.SczxBBlG4R_wQ^eU&'A3)a9>-fk }cN�E/߅GC] AҒE`<pn0hq,*:rvwuE+O/%#Eqךli8[$jX] r߂G$pz o$ t::u 5^5hkLX34 !ݿyRႁi%h2iD<ԧc%u{Es<8G|^/r?<YF  E(wnwC'ꪫBxn9rX:u&0AEv??tM_<F<C땙lj ukT gz 9o"1ReZ@/{lɨu@ޛ& I=v*/8'p eYeQ;~%pNHjW\v Y4gÂ8 1vԸ,!F)8a?@|߱cdž (ZAo_:44$XCAw24SP* %VPA 8 6w<׉:  M Y,5-j'jB,fNKziebbG#l/k$]l3UN]ѝQ3t?7QH^R8YMmvN.3C獣A6ŀ[e㎰a=qz^-ϯ 0D|2nY<Kci6OѦ13ŽwQXQi}^> `À`1!)#qy2;k𙻥_411.p<832դpa_4>>~8/^\źuq $Lk{0}ǜOrٝeΉ >V.2h6 V΄6rG,K@\U7;桵#`g?+W 'BVsamGI^"z$"-tlCs]Yyl}ֻW{W|,";'_ >GɤDFqyU N( Y"˒�sX<z]*#/QXbll-[[}~es`wp1r6ߑt0eLKp'&v1`cq,gql7[^1x x+Bd`M8嵃S;kg6E8I(|Ef9q<Ϸl٢8'Q``Eatk .86񲤻ypsiLD7ILc_nAA@ 2:$l,E և A]|zrz=7dj9]k1\X(TU{iz=Y'YJ\gG,};5k~͸zf%"5;q zL@$YpU,V }UsR*gSz i #8(wam%B噝νsUuqgv L l^}>TT%sS=ZwZՉf[P_�W3XUC`fPPUcq"hL Fy #S*-ga ZM?&UÖɸ0]`$NG0Hiۜ;wk�a$4(,"qHXH&o`%8$,_D_k`Ԍ4c /BnXtbPw"XhF ׌Jv$鲔o~S,؅,KUe:nGFF$9'.HӺMZ<k2==ז%Tc<+l0.D5 O?wwURHQIn1`Pzd C*$[>)UlݺuEqmBu(x,^KIiUhY<OJgG8e4!ٔzla3T88~i~nx}/z qpbr]ƫr߲}e6fhH6"|'%sb?IPm;ziQQt0 u* ,jiV}zжP͢�L,X lBBlK,pKHve +.F?G?TlӺRUF#Pu(Oa�=-=Oܵn1Ε0l�^>.ZY^&,8>(a*[5MZ~Jn<NxU)HL3CDWc<E�vMyn?u}c2t8R{w)$ZXUC ff) 9 z),Z#3z0{s$ٰaZ)9֔eyb.j"R{zO  b #av1IPhY. ah6(҉ZM%UBCNzz꽫tKv}k eUl.MW/<]4b˪ VYvZwe Ku yb)h.gW7tW yRYnSp+]w#A̐p V‹aFM1@ňqaG^s.uǦa%u,`cyp"W7cuݏ%} DRd'n-:WXẮuot7,,�qϙ;R(aІ#:e9z۴5s:Ms`w{_X=�� �IDAT<U c iC!2v9 T[ ú~\'"^0jXʮ: X>W*8ueqol%9ͬZǽ/:&f)S8Y&jlCpV"j KFG=@ޗ]|J4`[sOGڮҜs*d;(ū02Zp*4c.PFCXw.M<3a_A GpաDXl�+m=fCUܖH\ ,irrZs[w 'p^~O<D9R~K0@O3| K"Y24.U!3JI][nEgB p];_ea8�kYb̻z CZE٥ }8 E&FhGY?3HV�1)+^)31al�r ;v@ d0/H"-CFѶB;۪ rAY2G)Y0 $70b ZB^Qqq@VJ=�'׃ C?mD Ϩs <KlKLw{=֙y6q dҔyvFY?$)Uo?~EfЊ&NMNNNU-#v; í[d)H1w gde0Bnw S/Щ戋+VޘU59I_e{WE:,�K16Nd えJ׶$˖-㗫!Dᯑp6aUUv 8aX ~ܩo R�2:珡7HT\:>gоbv+.ˆncriC,(2cW!ggj(Qy[oѲDGX慂a,qCGl_^B2zIr `Z0dE@["r|OЄ,inl"SBe=%,)rW7^wu<m۶l,t%ѯVcxv<d rX"3xȀ�-Gk XZ!Wՠ%E^ǛrV]WDޘsEr +�%_|9JoL>AD:NFo mu'R1hrrrǎP`�尪0!jV4Dz6h^P85!#v 6 f, ԰g({X* OAs'E$';~"?|ADe<]u* ەa"e�U`#xsj-/ akiʩ$SUМ ಣ뺙ȵdnEQ883oy'm6U4\U]2V<v"w0anY5P aLp pS !':TA~ r:?Mx׺|c"wp\ )ì76c/`ZF5>NJd z ۶mlAor]?ADdccc~Y}A(Iy!fo BP @)}lށǫH/B.V`w$zX7^u }OH&o kC`vrIrmrz/Kj1?2aAkX˔P,re9]뙨#vp#^ʁ|l4=0M/y&B!2|0&5.>ZdLDw"x}P:zs -ֱNFؕh�Q脢B>dD\,gc0MO(�_-4ZUcA2y7FZ, h* =Ru, ;ԾzGqOLLzHFCp%ܪ}Q# Sl�i;8]Ⱥ0D !LLL4|aFtQ(A9FY+B?#Ub<x#7jVU{7ozX*.O cjOnZ4"`M`;abڪ0,{PX"@3]t':.L$t/0-$ٿ(4gN(RŹQtf"(X x(1[}۫\sRuK"gS`oA20Ö3xī~-Ѕ<85$0ԩ6f%a`U=yf0e;Q~h#ޑL;H| ڭM~y "Er=oUm6fS6x:)|Az$TX^\t`@.PhrC7Y^0?ztg=-ZǂY k(7*f@jE m<=oc`W 9WUoXYUINN7Ɋ[s^.4|߷kx$0DpYzXtZ:V,@=8=>M(ˋ DЭ9^āE]V,*G⸬'l&s #2+u47 MZ#s'��,n72| [o6lJ%խX_ufcfb&�G )6 ίGge hZ WX~rrR)쮍9WgP>wJG\@="k{Bҙg“PEdiE^{[י+Q7jv… oQb^xM4 ؕBgYw<'l 2@{Y Kβ9R ?Sۢf1ȃZw':TU88J1ߟ",5gK%~3UQ(0ef(:-NQz\+ CnK q]f / CB` ]cX/\1ȤekMMb%^!0 u xxxTi@oAaYa8Be$R@ Ќߚ5Gܒ1 eZ` ~/Ň# k; JP yK%O]0hض X~dmN jذ3p.Ho pv!9BC+2\gf϶)il/7倀 'oxܔ^.@rguꣃW>gh3R=s*b{s( ׏bosLr2)稖$"` i`=ruh.ŐƁSŌ`U d)`@Ӭ/Zf/56Zd'Y 0/O St@>QG2F-2cM05bg@5,H5X<p#oK9X(]gnfuU?wq'tw{L^;Ar1"RcX.,N<Y% 5 @=F ,`;uPXϟc @x_caHk4NtUEV, ˀ?o؅`(k8_ �,Z`Xk�=еc;%Vc * b.aiBO?2BM+NyK�٭RYj͸A Ls?dkm$\WL8&"Zbdz|IZrlbtc4R@uQDZ< Vb R*هkƃb==ኊ�F h~5T4ӻ?Ebd?r{_[RJpZJPL_ےXL^ Gp4p:$NVgbhxpGvuc(:>\:g80n9�'Y\!̥X4qC]#6!;r^UbIfA}pL,9<X DEk)@tj[8J#X<EiLE0--.CP�v;B6ڸ.AxXL%5 ~v-gH,SIuiAN6Qo䀅EqfEҝwj,C[sSrC߉Apz\IIv:O`I*aI0dV,4yN;Bƭ]y%tn@gHD2XPca CC3�-927t_ʪ<cJ}E/&Šy<KbR$aZ_(+�$2((#N` 3,ZFGA,hüPcsX+c6Ĵ ZcIѧBQ C^W:q9Nj Q;T<ϋ <'tW'oe";:K-.yZp<TJ�k`h@? /ִ^,,}GAu3ΐ8Pv]wSr^Qs( W!eGcnf@ g9YKI.R.cLZA`M&2 65߮m47+yuRbi.sKKĈwL;.�4*@cw3 U!H!PkVu;F,-x^X 9e\E0az3 }Bn8f >budzH)Zbi{ Ң|~D]<08C-/"H:c"Og"~{;W;<e|4)Sxg NfX:lū8 .,bdd2T`x��4EV2ter~~'o`}z֋uy墋?7Av.ipF֬5ˁ+ %Ɋ ̓5 60F&Ǿtfe.:tG6R*E[85ņ20(# ˊI~jfضLyylm waB&[?UU-)˗DPh;~:R !�6X |~ֽg6`^/B@^^a`mT̨KlE~*YEp'o͍/ uTB LeRA[fPVThEPQAQ&drlEidT@% 0$$ Uw~c߻jթ5''$U}^{f:39*-HƣfUmPczolY9<-)GT뛭!ۅ~1!tL1݂zBieO瀯`ތz%32X:P@DzL1氲LNg2<y95UXCfG6SgY?]1 8 d=#,Yw&G0>ɪ\�X,z7rCe.C *^[X Lc$y~f޺%¸S&014O2ϫ?r]HQc+D~C/ }>'G"q2u1pF=s":VawN(. 5;WAX$�y]EW!YV|Pq:N<>{\UQ0 [`Hy۫*VMab|Ȳ0qHT~8ںݮ hysbbr?2P64:dF}ir^/Ҫ#> ;Xd,v|$]("Ù8Ӫŵa[b9j>^5p@vOP}!F"#�=�*YlZ2K9 I(Mˢ耲|gҝi#_1&&@FщF ӅqǓ nse`rBTr @^ކjvu<p6}_D6l2)t&Dδ6cfΜ͞M?7OĨzZ=kMTa -(!<}QE"r7^@rdl 27!oz˿9r^*([ k0:ȳ8,1EjC<&V1Zܧ? =Y0lZ!9Ƹس)^1;6 3~oԻ3 oGH4nӜ4gZE2k?ELSxupx󉂓ƹqTKrzUD S 8k2˳ 8<c P  ٺ1FA@` fl.$%Bb&uksNʢK,˔<}#h.:iRCιe$^XNt&Ckڋn/b0b`k؍y%d{$e>(ݮl}J5ur5D~6&36!a@@عa0c'}r ;ZEQatRH!0.4$,, ]QR�[{I%"Vշ]U^~ۈcd?j}(n3PR<gdʀt JSm&`$88Rd70l95`<TY ѼdU]56oNdŊsnjOG~J�N\Ӕ;=Lbp8#R0 B6uÅԵ <6'(`+ɴ)(. ;ˆ\{|k鋧4nrj1 qE̅HXF^hK8sҐ Eg 9\nWRM@O�n�!sG �$xq1ȸ{i?/Vƿ=[(K"c.h4{ )a)xlDaA3(2|mmJZnp [Vdj~e$fb ,h\1ҳ,s @t$ݘVg{ l 2;YuŞE "ɥت(bҥO?xUU[[I>!6<R\9n@NhNƲ UUO~Yhir2)&VFȲicW&ԍZfgt Zp*1?ac*&Ru/o||""&ccrkQY-TD51 0[1HX_O3Ɖ.4MUJ�M,Kp,[lْ%Kt_x$8yGQ<% od͈1 _ukm~02~j4oop#}e"K]o=,v ÇZ/p[�:! R>v8SpBA4kBÀ<=2pKV֐EA 'K.~LB ZI~D՞U*VSEď'}wY96>3X9842zڶmlG:X՛휴 B0!ua2ϙeߠL`$� Հ+"~RUrG?*e)\#j ʬy'VüB{a ͏PK|([Cr^s<ɢ<au:F/p<qZ=n 66ɹjSlG6sEƼyt:gٷ(|=ETӱje_}+= (.DkO׵/,'ŧiI Uqrh_oz RD 4).gX #[5v-yjc I$I= p@,͘?3Z12r؈,R+iZpٙ-8VAZAoMc|�� �IDATwN.J{ F1ex LaQ<]a^cg#r\~z1܃ 2zr%|rru9r^�ZV,±-.пuaNP#Cana; '.5$sV1_=Ы)2UN|0ƄWIa=ϋ/ǼM87Iޟ <G{=k7;CnjT N''z]j  xVU9XoK9i5"Ҭh~^J)`aa<;<9xK1MTRɄerebSRqGZ#go}A8->4$P 1Iwtk&[mz6M>/r,p/jA 5M5;|¦fIbz@/<.T"UpjrCg((rm,!g M>0#xm.H6@_'g>##?rȚ#%I+Vr @3gup!Vh; ˰㨃" 1ph?#8D>ݐEc[B +2hY11MiZύQ$"WEт wQc~QE|MŀeX 4f󈮵֬kRA/qZj&}ni-$kx0 2B &8W" ED- U<BϖY \[uB `?22m,`Dȧ4_ RîtM;&Tt1RGJLN8z)DT.=۾N/cZ؉_ 56it p6jFDObA訬ZFedr^*M P) LGćG+&9@0bB\(�>sPS:|w9v,]~T^#Aӱ6uaYrOŲ؅;9E1y>4xޛf<׻ I#eU(8@-CL_͊ iӗȍG2 VKϮתemtG6d_?{]ٷ[iIQ1H*XbGmI46ڿhۖ6 ɹc``iq =V2+ZLө|q[-Mأ3 o.dP)xF֛Uv=w፠?ϳw>B.Y%O`x5@8ӔA D&cMX^o&/W^)|.w9r^#ylr$mıD#M`)nUF8f+h`O̖> Ϣ(5kQ<\Zuɪj5{:3ԙ/_~<:@h8bâ�PX$(̬i8rM##_) 0`QyKIXQ2A'X!o0s {oY?} ۝Ngw>87 q?\?JE3H'y ػ("W7gk RlL,0?Te<Ǩ(XyCJT+Th8Kp0]6z3 XY<R۲f ;3Ģw\RaAw�]G_*1ê(: LJn#v8#+kdbB;On8o^%5>`;"̬JGC1te. qd5" a\ zf͚5sL=@Jwg7:Y}5y R7(˲4lZardT`*8A6#}:.oaǨnPmaK`艎DA^i؎Ls%}_kn;.[h5&)twY0�d /dVK5yEqGitz ^:>T﫪=mB[Ʃ%~9p8Ԩ $s]O&"0R cdB ;$vχ10Zp/de,6Ȫ6:NӁ7CBÉ|㏗+eW# ջ\(Zgu-[Z EF>;h{*ډL �5~h85pUCK(D22sdtt4?niWi%q<JU?dR/oV<yiŏ͝VrN))m`&>}X'^#m�p_vs&$=O<ĢEye;UC7v¢ڣqn 3煙D-JX]^yQtxQApi a*�b7\e*4;nm,: % |ib09l|g}k&FE^/MSPXns _rj_ 5J(ʲ̶m=o7rHv]Utx@iC,pA,aNQ3,(o`0uSgVg֞{;/^{GU[jaK>$pm k(ʏM �kn x'R|HO~rVRI@Yd,ͺ9~gp䌑M;Qp[`̚8Ö>8 4q]9Y~_?~EQd_:v?IKLF#tL0폷K۠i irlKr.ϭ#Cc߿0i-K䤢(ˇrmTiN\c:^ƀj"B.<O iMDUs`DZy1 W6t,&BV@'�PzBE˚aB #1ZΛW\Ӛ/0,E^܍>º=HST}*v+}RtB+gt/`ߌY-XPc+Mu2�=lVgϞtdvYx1,0궇:V &Sx>e~T^vm56n3ڷ>k6Dg lL40_1K=>ϻ݋Lf! ȝaFzUWX<D]ia?6s‰rMM<{Γ\],7N"o(:14wǓhC/UuI3gt%tғ<ˌ^e-,$깈9]G[p.�T!˷pyZaWzmL.g)>(<ظL5JCTa 0_}GUvT Dҙ?dett͑r!&nvḷ&<b ̎àd$A- U7恃z;F,TGMZ0tQ@/{`w111pg}SZn�0km8N`Hk/Y9;)KvNdW>[y<[;qҊkp 3jG)M21TtjǪػc8  R} 7Kmjkm^'0E['gw`As#ECn ky[PʲU5w/vLQ;e >9iOjv[y-[P1KPƔ9D<-{،/4 KP 󢵆P0~/2] a1ˤ>Tb{$CO1EޏA8%h ='Eryk|Iy^S=kW_bE6?t"39w8urk 5/Bqg)|'zAwg4Ԇ{Ly<k~{T-'uhg&M "b #š ATxPh_O$dM/{}g4Mӽۜט?a4<wόD+0MHsc5b%|$ PO lC]M<^뫭-e~~6W>Y7zay޷a oad=hYEi,zEQ|(\j5CP#8Ϝ< Oqi FoA*~`.U9Ĩ)5Kx޸ׂDcǗ{'eY-�,<U($4�Ff<:d,69 …rrQptuK z9a\bMݰ,8bDᠦIfsU}N.u};46cFp(ya3Vp~pxCW؊x}9n:ȐMzJX*~3>88#|0l۲X:o ]2~58lfƛoĥ#:a>خ:0fm '&mĀ% dXgZiCLp_/.zDdy_^[yS1\JNp{_i%Q+;`|omhcQ >�d]'N?Ʈ<x8AL0qapkwM{}입zQi6)iG§/31YU嵯=SN,[S|U.:Fo3XM4Ylf{ j*@tfF Dd`^ O]͎�`179dZgb5߈.c+ Tl]| hݞ={vccc<f`@<XDVx :aO?oxYIPk8V+Epnֱώ%'킑#[lœO>e~3wRm*by< Âq.�tQEJ MQt\02vFN Ȝ@S\'̥K_~Q0!eC"}22Xuʕ@j=s�<Wg>n`t?bwlaF*-@Rqx@k#,pY%+&4 :M3zirw,Γ39/GJc$ȯjy_ۏV@VJ4+2խH=4tى 2xZe6$CjA9j}x0HSuBc,($p ,Yk P@%<@"jժ[oU{D8r>FM }^<c{Lws/^<ZшqTaz.(U2kC1mDi2@Bl*R:FDn:XT)t+:L'^$ }NÊ86K,>G,52*9I.jME 4`r&߳v-�Kao7lGKU$΂UnD!72evΫnڲ}LLGΫXc0V$D[eJQX gzuQ7p*sٶ .d`hZ!wA9}!,ei㏿�YF ׆pj SZW케G9 yՙGwɒ%貓Httسus  &wQH aG�t;2c.IjG(ꑈs*$KA le AjQƍFn<vHuM8m1GH: < GVB}[C~*^5o@OPx�>:ӸBG[6~2.X W_-&lX{Hk<t(+o|"+30L]#]#Y.a@1e7χz.N6\][00.,߉ =`B[s31qDJx4Fb6f:U� "w6S,L=m]kZ_nyx^˫ܟ{3j}Oۏ|hZ<4qOк~wU/jX)"`]s+=<mD./oEqj5yՐ$rO+g塒o>a9KFybG-S !p%C ^ rM2/Pa@ʙ)cF�ϩj A^V\*S%s@%A~p2Ii4||KerrᅲZkz9/y66(pQ83y]珎Jv!+BB`u2 ;a?  oЙR_x3ҟF1'љ0):}/K~kז}ZZQ1~8 *geAäz:Z{{U]57u먖 M@ѼRo\<i!m7"/E8Y+bYM^ӼڻZkx~:tü s9c0Z ϖ /b^5tyG)� !.t/I|` $eEyygؑDoP:,oN Ԍa%W-̮$4TǏT[,7ycɏ~$S k>4NuߠxK"l6Ъ.ӟ8va4۩HCeiZ*T-w& :é,d:̐T *]&d\s_bPYc}N <LJAe50[m/~xonk&udLPY$|,iOVI(R*N/7X~X,+i/FDNc|볎,Gj=}3^;30S1* LyC8,lU^öŖdQLamY&db kb~e+1T@L6B3ܚBk/s9y�k�b촳E0ԍ܇ X`+]Y?F^;: U.["222 �o֣ RvBE,̊"Od_ʩE�g5ۃawmy^\TȴZ- 0)' *5ʀ4~E?�a<MYB/ID7ҾiޛY}!J `c|*I(}"z9Jn@AWгaTbC .x0 "lˍI},CZ( 0}> *{Š^V5W�4y<vͺg PF9sfEK,T8DCX2i+-EH Wpjd)\x#I?Gy.ql*m2& wfd! "$Ye"vi7v;ـ󠠹�N5J(UUz=\Xrf╡  eZ9N vhgoi)'qH,LO tX aEĘsA|!M" +@Nz6U3kWE[A6 U1.Ux/ZdOt;p1 \acH薞p@/Se-nUqf1'wQsW:~묳΍7޸d̫NG]MQzcꁣO Ҥjzn~GLkv~Uj( (pH&du #œ0D5e�rF`mò (7xBrV1_ѧ!YO#/3' GG3fȣw8: ?u}`Q\=~~eWaTĘpڑ=ƣ<L�� �IDATX{pZik)YY;t<g(HbG?y;W|,/Zv8t G` � &ry<@Nдg{M! 9uPXX7'pxoy^-JeCW0On~SpļצXLE~vA{ur$Č lAP F;~J`lO@l1 .LUZHO<:H C $ gi Aqųc s-8$'xhqט+VZyItHtko穵Wr џi BZ{Dh;,G8$ }\.c0ZÀ'LsZ4(+˝)@$IuJjL #:ă2pzuK.}AO`n >& ð=z` -q<k,m@l͑ pxBF[:ʁJ,4sh�c#�2xvO\"[)-k71e� 4Yf@GGh5J@a RNP`PS/XuYP~!xC1߂HGVFt44'33y~hUUup.gLJ8Ȼ(tu8~}Q2f TQ,a aΜI+Z3_g5MsdYu}eӻ 8rXCLke]%ci �Xphr8f8e;cd2UQt`X c6k G-^P,b,F;W8H8Gd8)4i((yOnhFQZk͜9ګ^ ^U޷dN׹^v^i׶/XolRnJ qe,2 a&kqp6@dGaΑAB[gu@cCɌ;}JYipr_0Ҟ s@d֗ב"C7ƪ*SC��'6P+k9ey Yqa3Lu!Iyi32©@"jA]Zea>W'(^{WO6-n?êˀY;@@`OPa SxMڊ^:'u~qK�G{:Mo8ˆl]LgL(̜ tGXAYadR:Q>8>5L@9X|Fت|͑J:u6ēGS1+#=?$%!<c?\Qքhuh@7'U[$<ݜEQ<S>A =*#dšٷӹ8Q0Nt 5qV'vwN -Vyrg2Ѷ՘t"Rx| hb-Qy_od/BVzmXGŽg$Y/5MXސp@"7*uhbR{܇sadPu&,| lnn`o6< V@\JqF݁+�'a[zgQU|"8`V}Neu,_$eNXYnUP`n4ٻ3:Ksq4ĺXgpCDX`G$<iȒZ4Lk9N]UUU؄ɱdGiH2: a EIYJfw2ެqӂ)7 X̴f]tt,bZ46˳2#.�8|8vW_=+'#r,kp+cctY.%R"sm-? DEs ,/J4`nxl[3oA!$7`-Ng=@P΋u.i:817_.24:xgI?D785ZkW~(a@͛2ݓ =rm_+ ^Xp w5.v9qXߗ1FüEq7 BvϪԼ=l0E P'F@1p+HyQN馅o[6'ݪ=rN}1%4HEKctO#G2_iQ8NGa8yGQE14״Z #yJċfv >G.T[[nyG&uw{ ޙckSM{`c% K| F&Bu l}G[h*.Ebu�8kW#"qPA=hj%ͺ;{g}vʕrjY[x% P% vW+kZn2IgZ{r# AUJd+ڠԯD$x!]eted6tH5,SxJpF$Ii=*w\PA0>fUUEG'oJ4M~]yoZ y\6!X9hANy2lÏ L]P}NAߚh?vD~fμ20ÉB:, Bee87o^~G<5VI<#@`7ǻ'.YmfbLu "g.˲e8T;d<3T.\ @L<A$f)_|5G+vԛf[S4Mx_hXEk[oY)Ǚ'EX.zLB8 ,ed͘MY#^"3鰔8e fkfgѽF1v#kGϮ qDg(#PTYm;Ɯ0ϣ�+)nfŸ%VJr2|~OyإxFDL}{kx⬃A zp<:-N@[4 {]ZBi,~Iy7Mc&>&Y•-s |2(:(vKzh);[0 k/P05STpUB:1l%:&{ໃ%rը: ' >bɚ{^zG}:`.j~ll5A> z^ت?'W%cRW[Vfyg,YU,Htfy(*Je3A#H?"qym: ؁W5A/o 0Mhj*\MѠ`e 7si!f79So �6R$BFqH ,̣9H!]Z3)oeYirWh;:(\h!#XDs=R%tb:xPa}3%AIGh>z9p}\Vw-eا'FH X t(|?&AO`2b(|@Z3ӻyH@Eܹ~h=4J2prXpJr^#g[ZkqVq@1BJkm_|i-k�;<*~ v}1%M*~omeݺ4Z; s.ÌL5*Hq+FFFf͚pJ%sb* HpU89_u T[aX>ac( @d}+VDw}wmN9($<LEf<G0o8ꜜ`4P0N &Բύŵ^h!:#[gR(50)ų1ȃ;Ό٦i;z$؀GѷդH$zREf F cQWU+sǨQ`5xzfh XUUzO}Ţ ]ғS1 4L,^s_Oʓu~O)l{V^__(O.Lm6myuiy753(Z1w ڏ8< q-t9#F,msjY&IcE X?Ŝ} 8'ˮ ó! 'P 6ͬ[om{�~+4s  1)ƪ@mW�{aZ;G<ߊD0Ȗ$u?(21 d)d@tdiΣ>O2|vM6/Q[ 2OIytB>bxn4{{2"2[;Ź'HZknv̀'6 $`ib쑪[Q^CgץYyqYlTo/?.Lasx@R4`-+ʅ5Ht,$OCj|_кRe�NOD$Lx^sܒ?Daٳ?yb7h6CJ"[]OX{?8|hZMԏU]e }3L;=]#>R-1&0L=d1a8$dXl NtEj"sHQ\E=oC;,~mNjR#cLzƛhf…-RR4V{x~_q\+Yܡ Em!yPqK?j>sZ ^,p<LgcsiJO{DndjzV:ר5=$6a<EPr!k^{ob_l@h1XAY4~2{LmtM*kĔ+J0/OWK3[m7oo/V},kX}gy縓5=w`9dI̍dMUAf_8Xk֬7Z?qѢur?.=Y&L_Ӡs\uukhQ,q; ȂʁwC9#`鄗###~ 1gApZ[y-k*~v]ekFM8W7u~=^gY l}o[Y/g1~/4u09? 8 V1GG 7#�PBm7pi7biV5}~uF^VW"Rwg*lfUc,Sm&P kl9⠕F_.nM[b\t9mxqSMf'"l K2Rdy8/AAld}Sc׌ 8`Ö 56)h(& xs-o, sKJ\"ܹsw}wnfۛ NVS9/׍rӳ|Z;66v]wp [][k}6LOgeӀqu;Z|;x{ # 7 vK\l̑Eqo,0懡w~7c&eM|ab$iҦ.˲/F22HxmG 5j2qkw1Ya,[)שpc š ^�U<DD̄/mx]!"^xK!2_an#e@\e5z\8#;7h#fiEʩ%Q:V/Y<x{yb< Ɋ� ܚ4Z/<镳 laǖվLpc`.2μVL �:}/ךi A R$}\V �L0ڏuF>y-xG_|^|f~>k|r%kz9{E57f,/;sUklc걊mcpz쏄m\U sȓhF1"UuUg7Qy~fd:l'#"3I7Fj4fKSZee`><I+@S�u :LT@ocaxI! 03ߡ[Moz>pVvhKxJ>>jߎl1ųCc_> kʉHupWK@ywș/',?tQ%q,y!2Wa ̮Ly&&y 'O(za%0ޣNzc^NN<xKj)qaoT[2bxAaZHW *$RSϙAp|<$7Ӌsx<i]>o}?z^"n̸(7]ԓkkGn{lڥ:[7J5Ԣ.d ;4Mϟ-vvpG?SiU}1˲ 08>WD¢@8'\&%LȾ#ՎUľ/s=*uCB#y -PM>Te~7 ԘCkAX-�h*ԧ1k,l!VϹ51# J a4iv%Z6pz[2G~Nga`$IQ Q"FHMgEY:˛INK[yibQWFX0dLxW~ VWUk:{ޞ|w2B7KBӀcBYHw4l|, 1N'/~<.ܡ7[/r^=zxurN�� Ev#:J'w#lLD_`Q?]@Zu4b R݇HEySB=@is0/k$ApdY~ϘUo|aHk2LT F7{Aؚ$- #5XЎ}E`3$ͲȘ;|:inHǪ UOaN<BdɒKBXr#@�G˺a�.gCG?Cyly>yc3O<hѢӴm9qlQP9* )iqoo/˧~\3z&>\Eq/ Q#w ?HD:ٳW\Kq%�c*޼/jRsAC1"A;\ c,FFF̙tҢ(V#oKSS6uMI.Hč3nǁ9咡諀'kGo}tzdZupUab1(e͓YHJq GDj,*p|E�OiK #|? Ӌc*93q<-31|^6rJy* 9~*c.=b8#ϯGy"B! J"̲,KcPz,ӻ :z=2jL^R~W"]ۺXshI'|r%Kl__?ZثQ6VG`llll%DDpj�|:5{NU&"ՁUh֬Y{'>}gΜ9A9븏5%NbXu-OOw &4{tP OO$&"uӼC$˲ŋ/߃7V@ o{{+[ h2km PȗkM| ;ue~#"y ibpJ,<gnu/S'].$Y, ub fݑMTU8c.&ئ9#K* 0Ok4l8d0|Y1hk0f~;MOjWy^0 <bb$@H=5KPIp@((IX�� �IDAT`\ yXdZ^|{ARe`p~ .د{9o^ϭ5S7V5�Z`MT_U` rpXq^[PQv/>>.R{rN 0Ц/X8G}|>Mnx&6hn(z衇iL)%SQKqй/ ~r.G)@TA#3(ʍ9y<4W_cT,lR6;lL.[0}ճƚ#j5(:'{Ce 9GiT3~m*`bN2 } ,lYջ-]Cs' MClfF5͠Kuپ@0VBv4H#RO5(Wmj+`OD Dp>7 (X]B⤛`}IY{?ꏟy9~'I7VURf8+mBHnD.jV9i4MY޺ǚUFG!,\*&\ʱ̐LwŢz/Xu^o{qwuג%Ko')[z:ހ(wz͘1ѠGZ Wvʑ^,ʉnEsccc؃U|)ai䔆C<P9mn:aX4/P8&,]Lq~ XRXĎ0p:jG B#(x\$7h�@s0yE8BaNJ}, CI=S GaGY`)[ؐӚF4+LQt8z¦-[:>{}zk<0'4D,"5OJ&;0So\DK"I&S1Y-bO=<'3ʓCl&+-r]wXB@wk𫪪~%3fY'z=5/Pgu- v`ITa^ϻ!?1jeYB9JG.y81a^QW a*&o"t5> qLN� `X p0<CcJF.~1hS*EQō1Eѫ YtX o 2al7HacwTƠ35Gs%8Kσ / &#!\5yCf%SxxDfp хQ3)6*0P*Mxd$Y 4x@4M|r%M%w%DA!s'^Q}͏;wZM]Ft*;/['Ʉ/0�&N0) -0jX͝;wŊxm %_^ d V1L_y<Q`kFEQxJX% k0a{9穇Jeʔf:F!tH'mYu :dbzKC ;~< F貼% 0&1eu0H0Fz1Psg5n3x0wAs qjxx'AoтY*,4M4oP$<FƼ&H#JP^n7zgtakef#+ˊD2uZJq׿ÛizBj73i398UU54Y?=*Sj{_P@t#MoC "9j| x} ,?`^Պ~[ګ%8r}nsϗAX"gƊs4yrc  KrBaD:S M@21jxiJ1cPA  QYP&.ҟ(wuۃͬ@UJ8A|Y&nQ ,AH3QfAN1EFAU#/]}gv@ut33\ C_q��Gy_ɷ`Itj}ULPU3 .i>2Ʀ(%8 4GeXZ x͆>~ԏq]x(B%Yi_g%I"E!zM(>`NnByswFJpm(\^`n�QFI0Д L,Al֫73&&DY<3pl8m*aq?9yQO#6F$Քc1JQue\l:yxS,��Lr̎^(ߠ+?qc֒a CG[HCWzL3㸿i߮m⪮8={vnןW޾ PCMCeV#\7+VpCGx�$ fJyBO}7Y9GfΔvzN0taiIDRt0 �`(tRFKGWcB3м4 v"#(l:}c. ãb<Ƭ3"fHb5&Ƙv/�f0HBԋ<KaI\N%G ߚO2g8ŽơZyz O}:qp0╝8($eǀ=Ywڹ`b%,w8_"~&q| G~N/^X|*ncÉ'ĊtKkN(;khc25"' nsb? {X9rᄇ""*KzTUe61C9~vG8un'tBQ9 q h7O�acqAc  Sfm622`4Mg/g ' ?}ni߫<YEGҝ[P l8RxPyЍv| O׵O�loġ(8@p ^[�D0$[I�eDE40l}0?V28:#S-w ˤ] F59GH&(03)eeiMM#.*Sll~31V5~VBj=Vʐ(2%tXuk$a|)d¹WVƜWӯOSbfy#"'+?w/AUաUs2{3GKD-H"De8Am h(E?u:<0mV,-(@LAe'֏}<jjN�薃쬟=9/?Zd%Vg' CMbK;#S* K0XYAy\ g�4m;鬻/s:1&3ޔCS&1x�v4A‡(mBJt�T'gw\e{p`^0ջ**ǕY&}$jcMp9s:q6|w͑*a0� l�q8LB6kfiavܻ]s 3,!BKhl{Z8-_kTȞ6Ŷ3K3;<ɍ"A:S{?[2)qvQ`MؿWn^/[lƌsakRz9jLWkF[UDsK !Pi�`~Pla jzX:񪻚Y,; 2[t)WO/u8~Ut�Tn͔Qp +D?"}j_G*S?AHEU+)mdK75+AtGTm^O-X{ wi-KklX}{׻޵q<6[6B~q NI4֘Z7x/Y]&+25 F_u|2:*2OZ8@v捍ׇׄMӬ:IPUUPXn_f;gmvnDY$,?^42 ĊGկ)?cXG!ub]ha!.m .|W ~'JF׽o7&I(0򣃈 vƉ?Z<+ pMaY_KUEQȥ$,�P_FL{L.f<pK[/Gd.kkA='44 3 KO2�YmX9+O^HT[VJoW}2kZqw:(ƼxU~Nٿ̊m٪WA#Rڳ ðڸ|ot/Mn-5F6&?/K%a: 2$u6B>]Z h'1I̚/}IN8Am|>oDĎXY]wkk|jU5^=kR"T8@ N)�@&F@_(0Aƽ3Qӣf~=i4$j@3e8J JO6M@nW_Ts6E=90u2:Fp'H.gA"'cv͖-q}&h?8L?Y}:, c*"FMvzf͌gmV,E$�! S<m8Mar)цI>PCy,`|Ч@ad v  ck/=ihߦ7 bNI'Ξ+Z{~S6~89S 6o Y׵bqTzA QV*?Ȓ9g'q<58UX3F>[E.y[_I eYoj( ,9ܴ){f``&2.eWi~45Lcu=AL8R$qs:RBg:Lf2 '˼m4#NGT'H#b؅"\9IuO8 )6 f˂3 L¢(nޭ][wǟK/CH2١6LSg-H.HS'%d;0yDxh1O$H6lmwUYzMR&"M)| 8((3bBq@6!@Bb7 7ϮϹ^O3#~br9<YZ6-\0'nF9J%x[w0PöhC}8n_V_yJҜL)Ci6T2<=5jCZkJ㏰z:/GX[[<Z\uzE5gߢ4xx>qH4=Vye-R#eK(c,Z=ğ24xtjk{zٚ FlEڜ#ސI>vU(�R/l"X"rƏbNcrԂˋmp[Q24T<s$` 1:ľ5I+R(`x�Ȑ> <7.MFջN9sy+<#xIT(]  |)wbc$A|)W?tb71y[ܘh˂|>я~SO]z˷l83 Mw0TKq|r-[$ş]MXRʼ4V m_o5\BX!Afۅ!gO.7J)=Өj ʂ4I&'kM?%z5VP7 Of{3%ܘ%  @iY*G * rqN*ɠW peYjUiYkql68N^1B{ZOmSpjbƏ31Lx:k(hB"^8<DE"PO43,frYf%I;T*48z,c}(iRrH5[^DFChՠ96@ƭcБF6ںT%il67nܸbŊ˗ԩ G*WmG:IFC@]foQ@y00?zBi/GgEΥNƖe5j* epQǨ9$&PǙLFA(谎0f GD'MS6+*h>~;ik<'&aj+Nrs΋V?!kifMAh>dɒK؈#L :/۶nݪj4p KAᄏmK,ĉ}]yy[D '�]|qI :I8Nрb)˻I 8@<%Be,u8N$)Sp Qmڴ\.+,jM+&#V| TT@#g_@/꫉plʯ@"{bǡ2},E@aaO+xZ溮zK+|""7dAXŹ;?[*QJVYZu槚cG8r}O. Ϡꌗ mkE!pOHJ$9{U,}9ga ꑣÕh𰮸"/HZ]6mٳlFj9J#[ }}_Ef#$ X`$CCCAj5 NѠHgG9p#U|< CQ 8yaEG|D$Zn%&R<#aڶX-*<Bpe#M8 6i0\'!� ?8 1E^)E 4-'0ʊ֏Wŕ*a]i㌆W_i ةȗW'k*[ ÈQshaGQd{,NpڧUE؀33&M`#`"i-#]b1TE<aMO)&;sTɉFpej.Zh֭[l}?-I[ (õI-Ԥq|#UC4JiX"N.JT* /!WQCuSxòZAb.Y.O݃.;`Ed1t5}Ў>MdQH4<"V&!hoPRFn @b6Eg! Vtfo=P+,iTWr?G̫f ^�9^̳0<3LDՔIJM2G)G"(�Ihj=+H2 'n4LzoJ:Kn�]}#DhGip&ʽ=F\83 l#lϟQ@N؍cͱkh);M4QxKl X6n800l6ɉƈN0hlG]^aaYu g�8!r1z`^2YXG GЫpv`< AG)h4JFBCҤ$M+琁 ёr5-PĺJGks5 f>,A&uy"94 wemCtq+^뺫60IxzVM$*AYL'HUcsjo:@@4x>6y䧟~Rp->zd]1�jemQPӞ�p+@Qd#l/0ңCYtej C腽YY+Yt 8bҝ>WUU5M3406s7SL\EfȬyA;5ߪ>Ruůɽhl6|(^^ J'PJ^s͠ R5w}t�� �IDAT�2$dQ� m/��^zwQEId]baŻǕ*i?:$Ier9槃j<մ+6gܪ䪚GE(%3@c]ldu9'p:Ppؠ2i[qxByXlnC+ I7Zi*\hn1a+3K)l(۶3̄ $UWzf84{ f/t;Bv ${1x`GT-{"YrIrFx_Q66Ĥa�[.#5,˲&L߿iӦ$I?X?s $ ց±|t7~&XLs<^Q: E(GU4|c-AS(tKCVҥFۜ1팢rN7e`81. s7&:9s\T]p``e,3 jl/j2 cIk˜3`X᲏;0�Wl6ӵ<橕+WB%(Om˱kk% nZBF$D71rdC< -9ۓ>m pM!ީl<�FlNĻu tFLp$IW&M;whѢzh`` s{\-`ߎ'Khz{ؚ`5%�XS66  ƃ�® O=Ě Ev^d �NP gZߌ>7!_sob4* �=�7FTYcwYgßt@3?ʐ5jX7q$U<dnO̷/k%~:9ܓIh3LtW# üZcq-7E@r1戏~VR4??Mj 0sFȯr2Es=,snNХ( q)nN˗/0u>=c`x5Ng-9';OH\cFjFfM3\NXd)ϲpppgŮ 1cD8TB� ñ8&JL`w7 VAb9z{y%5h -DZV\j!sPޱ%@=RX)9xA+X̟VUr*U֏spǐ.avT4(h*6L/\3J˥vT9ۙ6:7!bZW@E:n9o<(&ĕ"'1s BNZ޹aÆ+W:x⾾(3钴VACǽtd ^\֍jhQ8mqY/NGJ(pQRiZTzlrJSajDK1ʻ,F(<EZ}f +`T87{'ݸ35 `R(1l0Ped2@B҆. SoRdKxC ixX iS}�K^JeP -}nʲxA{ianaM8|KybQ4yPy'[B/5l@v9Ԏ*g`_4 D +FTؖwF3>]- WZb7E,q{W{=3qumܸ1":gcx7cG#DNF&3;Zi �vCJTRb={L5YR-}$e5Zlb.'c8rShpNql2<™t'8 uT*paR܏6bf0 _;,OLkdz< mʍ[nJ":, uz3rA M^-`}=�ka\N0Y%0=+ ̓�[eE#]~Iǣas#ϼ?xͳkr4; .'+9i"oyjʰ:C:5 o肾om 6g Hl^f~:sC&<sPԬHu!Lb_�HP8XkJALHC~81ukA$dX,ݎZI"k_x.5R16<8i*;%z™Oq3 &yEBa+wjEZs`Gns19!˨hpfI�-ai&ȝ9!'b/g4Z!Ϭ9>0 xhި\R]o'kG9ʹo 4cnc:n_P㞧XHG4<iLh̄AcHi~5cɻ-[V^DZN cHM, jjlʲF FN}aT `RJ wZmQe2q:::f͚bŊM6dy!`6V�BjaȈ4Ԅ$c�Ny័@m},挰,JD&N`hQq#H8SWx<�ײ% %ɿ *0iζ0UAw{3e CQ;,ܥ`WYP)V4[ꊲcyl795ҧC 0mfbRGuU9L5Ԉ?πش4+PaPF%˓\5dѲj pH,amFLC>Lr'' .|w[CyҴq0}2R. i*P⌃=ePX…&#@$LZ 7sXEo&7t]Wdv 1^OXEdr ?0EDchO-d \1C+}-K ,mi)ftRiգCbeHU`mFh~~q3jlXA(b,PhƠ, )w>`FV4B9ΌS5pb!Icva80k6\<|T)볉x[ɭØZ_(Ptu9܇iMslٲz>00 <i ]B<,DŽ6ݩH{9&kɠ43$+o-/",$C\lRd֢\!;e�Sf:#@#<PQCa46)m4j )ز NE3reCx5ܸ]cmlC*N(`G>~2)Q2 {WqG>?P0ԤV4 2ãpm@泱8cNg4̂lXL '/䭴ZL&<J6k~Y[H$R˲Idrb2)~o|a}XZ`))i8?s+UekG yH\Ν<DfVtMRgVd* |M{yغj(lϬA=!Whi+G҃|KDzAf"mäc1=1[0du޷ õ ,�dF6 Õpƌ|P; aì |�1%<(>%+吏c8a~1s Յ;Bvr@OÚY�HbMְlXVOY,8F\nApm< &)[Am؉X'uUl:rn8Fp_vyܓYk`7X;U";/f"0 {H ufxHU_3Wg8C9Fb<.E &m[4I+BmXFZLپRZh~KkiK X OaMnɰȩvi XcU1Wb|'O<VK 1_d IV<q wMk>dr SD>mxZKGI8n6m6ǩ㊪x rwh@S-ecBc͆! 7|dgp{HӸclQh<\�߁-80֊L OfŮ akN,6$HÑa_{5ydgw7m6.md,,;j/ ~LbUe-Sq\pIiwG9 XXF,cP3A՜>ßl` -Qĝ 9ڠ[-qeMӌ>_2fOj?ȯ] 36YvLĄ"}n52M04% v~xU̚ @ӣnl1"bHghwI^J2l1N&b!-?$9\.k6zSKfR'*'3g\b8Ԭݮn7dnģ6#kE�Z`(jXCHÆF'ZѲ�pkΘG1_]X%-fZ\($W^QS؉%c8U-r7_h+uB` m|~„ r΍3(Xl7spjaG2ƅFz&yglr9d+×BW F7 oR4/ؽ\.o|c}]~C&|F'U mA/j4 )h#68X IDEAR\aZ[lǤѝy'jdTi!p!c,O 5l6ˁՐ"D4ir _ ) P0x$MP(tIg^`v�k!pZ3z_1�BE3\hu\y)<<3-dQt.؟C5Y=~b\ݒB-8y#"/sϞKUHx81 Ov6f_<;[DmTr|o e 8EG|#֩WkH28o]x^~Z=?JC-_<{cyyӹSb(զy2[E )ӫ"[6vjG"Q/?lX,];Ui[:0p'>jn,1� %R4Җs-}1b�%q6EK,I2<}:UOOy#h4˖-^|9!;BFs2 BGSńI)qqbU$ˈE0( J_> BB&Y֜ۆ?w'q5m͸ GDD40 ʚ={3$I6m  2[7wrFFn:)逡qsc4nlQ  E.[W"lVR(-@qj+#_j:>ٳg_T*J}�wH@gx tf`c 2Mę ;uB3瞎Țf<xϝ3|י߅AgZ,;_T%M I K<<=5Vgt9XzWu4jū9ۡ .TP尀n<+UNIjv)lɫ[Kx+r*a A.5ǖCJ΅Z�}`4M3'gZvjĴqfÝP18CƐBġJQ~ҕ=8O7?,'FAD:%yfBLF|e8HۜIL~/+e188NrVcҝ誁.PRG)r `Lu,o" @1[aY/Kn5yul4!J 4!Z~8U}*Y$*lT*kbs~8tb~quő`C ؚ!y^~_F/k l\G>yXUA7jt^UP7 HN'T$I^_Q=3Ԍvվ#8I$*bFcZ@ⶁ��% FXl'q|ٔ Qj�<ErʥAFVxZ{AKu#8*'>skyoxiL!ֻլRH7-@YQ�$i/fM!fnPk:f3L>�Z:3% JhH|3fX|͛$I揙޿G-J6lxǷnZ;f=hw̔#D³�k@j 0OlIh^ÊscYVX<Cvu^xaʕUF{;;cBxpX\3$�xah~tl#+ IFiNZfh6I؝Z4g۶,#oDGEⵝ^;@ v$�Cp]w=jK.Z,EeQ$+Ak6 Ld~/K(Dz (]+ַ L/^e"nxVF?S8~kmJiv!G9N"�aQSB5E�)"b6N"�#  JDZǀ 9�K)~a|opS_\v{キi&g7Xho7D E̿QZH؆.iTI3cƌSO=u]vV7nT*PXB?�y, %/rE3*N<x\uT5C)h9r>*`r>b`^`OIQlfj~ҡr8wŊ@i艌Z7)p"J F9 ,4m6ZM>O!fɣ9aD3l l%/nޔMzJ)e+Ͷ5d֨|NoPxD*<9̊EX<oCJ#B,/8uŢrDRTI-g1F^ڵk787԰_}~J.DYYa%C> 4bHH.L|T8K95;̸o۶__vŋ}ߏ*0)U<L&3&bIuM#Pj4: $`h`(7ɫk<x {�N5&!?g6*kF$ql|eva}V46ƄNdOB:b\ECN<sEZ\!i??MQ`rF&.39l؅ԋ7==a& fժ\3,/b r&e“<Mo<vlÉ,fBEq8\.bۻr\GGG[[mۅB4RBf.N4)l.HP[Zbl6FQx6hl~k$F|5Vuh<0dN4 \.R-ϋ*WrV);7W{?:ux@p~HX΀h MRr Me!-{Ij,k*JЕG [ �!* ߠr}�7'nH@ *hoM]H x�.< >[;E�g+;:3l̠X0O妴FQ4eʔB|@IΘd2;s{{АPUtx2l*np;WBC=ϓ:-O4viʔ)@rB}6 X,&Id5_mgl۶mMğ㮷::1(( ),C�.}�� �IDATyZpib^} (h;AE QrfJݼy9A'K5!"4I#& fXy@ QG#r#+XX,nٲ\.k\ӳCIz;j \2 c#an�xdeF?/\jp8A [j oSHE@鍊vRav %BeY;̙3lٲm6ďLpibqrn۶^PTKa1I�^pfY &\L&- &L81L< &2R }~=sӞ\׵<̡ /NjX8p0rǨ} ۶E4368:tE"~#$d8"'yREQGOXIPp?uccU?bsid/Qc @ΐڋY,VjD@=h"toJF`n~$d }h_`AZe53*ׂ<1{ I3FKdȂbbC~_C h[B4X"djL_9/eb-|(hG],ڡj $kBuT^ 믿jժ~ %Iu544A{{{RQ#Џ&el3i- *ȍ`6rbQl68ĉ{zz:::/`}}JsԩS%蘴yG<kˁ'7 3W�=hZ1C M,,Rc h 5l:HP+qT=.njMUWj@)SF>Xh.9;yRȖ 8˂4-xu(_XJ o<c-&_ +WT*k5\&Z`e!gVdL!hX*9$E iX[eF,|ykyY):jaDِE q # "g6C8l6tT#ρ"9r,}uL elXJ_̴o )__6|Z׀0r<I& i-X,r6, ADgQsRI4%tutE;ۖunٔDZd!9!]k'&z( s۶m[l,$ !fBl+͍!�$=h:fRILTJa4{մ! iIi9(ǨN璎k@`(Je0&LvHZGLaK|$I6oߏ)L W3y@0#l7`M+)c  .=IJ!~Nb.0qTm; )L@ 4b6,%3ʶJb{B\dJB5܄N6oތMѰLS'] 1B<;CS2�>Fmmm&M MS4rRy1}}[ՓWp&n}fwΧCaVfujupp\."QB @?V7޸Kݾj+2!3 dYA,g 8iAT<@^3i6T$ƚBa㠪C"Ί<ƈ1mr \ Wm �$ # ) RX7 )ڎ*gW9 iAkN ?JyȎd0A4WEL+-Ei3gq3͚))li T(9~5N}Qoȵ)P%ԋ%!t6j qXbb8A ɑ';<qI&a(gʔ)A8[d2_՝NQsk/|9Dži.,džޙsvZ<)x|չ|WR*2rqۅ&߱lʬQ+"q{)p}_jdtKg9PcPײe`Xfs 7M2OٶL$ǵzbfxn wr8W!Ĭ:\p}￑owr qm\6jD&˵ɧL:/ ̈́j i`[ ӂqqBԈ)DQI>q\'Z F@0"F* !j@:Z0944O nBpZ%,U{I c%�AY�)Svuu{ֆ;^(ӥ:UR*N⣂nȭ|BsBk+͕|o{d >~sE5ї6 6J@CVM@$BNJj</N6fY`9&\, Zu=T鲄P<e'd=Gj%&#9`h|_ߖH0dWa_mЖm2(EQ'5f?d6t uvI%@ 2oWp#7\1~Ŋ@H_ tXH-M Azx${$ 0ˡU%-Ll@u[2Ny.M?TI;::)S&O,(W-A"dV+]]<Ւ6Lo{̲}}M᫮n_S?fYvRs{4tӜirڰaÖ-[LCG n9Ԅ&T(To1ZX"$$ N�.X-tH禵|Ksf!$KTpQក Zd#l0mWާ3Ύej`!ò@r$ߟaY J__F&i#lhhpXoݽ".@ cM56/a W)K/-f85,HKhZ0 aZdEQNQp@`_k3bUiFB4W(p2JE33E;&r<ZbWW䤖&eƶޜ9M=?2Ei^SfAnK%g?45338_I"Fr[E(5 H%|zrg+D ٥c>=gG6raJ bB.Ӳ7hj(Pn�`t4!}Y)ád9LtH(FgðqnrS)0-0 8!g{2S~@ŴWh2,Nx`asdȘ, . C"CsPX0I({zKʯMq Gfb[xu 9`�61[,TjT51I1:m| BC"k))k-ݽlX,f`:E�4.t>} JJd)Q-9D}ˇc۶aÉ^yTvhD۔)SjR;8NXLӴ^% MNƃ$7;\5KW)Pb&b!wiGyR-<�Fppg&,fkP31_kg9Fr`@@#xOp~Uv\z ^4pO [1" ʗtdU&9Nwww6misԒdՅԐ$j`@nx 4ῂ1Ij<$Ab16>- h 95!*Uld8v3M3>=_E-$( �S29288NTRJ5jxyؐ/A@$cDP,@d:#$ #�4*:;;hZ.�9fLMP Ά >{Ǜ7qHpH]Oo;ʿﶜ3wޛZef>&$R: mv8&L`Q G@uآ8<nce/!G]ǽOpaap`ؐmqKqz�:M�Hq3n y F;L^�χ#�LAfzlLؠ g vY'C8m ^rwq ]_ۓo|QJ-o٢LR>x!GO/Y͚}{9ghhb <Ш,(X#܄9T0 be6}-85`o(gS|-{de䙱ʄ"\�u#)HeVwwٳZՠJ;G~,r y"e9TZAN .8,c/Zu)'Qǜ1%:#ۯϊfsO8pY,$|R+G֏<qzO9SN|4ȸȿ|h3 q#ɐiǀט!!gxxX(ȑ!;SE*!mVѐ2Z&]̨ѳ({&Vr$hm{fo<y=d<9njGVfS9\ѦP*iügɯ l'۶KA|2 'liW;90[C~j)wڴI]v.u1pvt�6]U/>:5Vщ#Uc<ɢ(>Y$8nйeYcM>B5PRJr!K.m6Q)cUG(!)j$*օ�Oi(YW aEl�\ҿ_x#37xc,2Msn޼ƉaLvbp<m汵cgdɣ,sӱK펺4}eWVv`mpuu yfLJ,d2 )d5 �M?4XAV\<a3%P[Q$en!BBDd;@+fU@U<; =MЂ Zvk06j}Jc&u<)fimBÖAē8qhq(ƼOf)ʜmV][PRPꢋT69Gp킰Qo)5g'</+Lt 'h'yx6~$=2kkUViskjPA&ej',r#Ӝ- +վ_|#uև~VU(.�]OGʼn7FiZp �٧aq`IqeEȶ춤~@mRHgֳs[f.t x}.QIdF_k~;Vz<O~rɶKQql3V_c;JNIjC熪[ 0_g$ssE9Hmx^f0܌^ߓJ d΃h@vcq/!|>?KU=֤ gPv2`A- w wy+[Nd>Ԉ�Wm.=;I?2Eo'CNSk֨}MuWu 7 ((* ka8 ,I M+6@=0O8> l޼^P#jd7:QfreҜL+ҥK8N9T+ O$`f_|pj\38{eA0Gۡ><MV;W/oێ^˜w>miK�l0 7Xk=;6MgvZT{g<oK_nyf~\w'OlxʇuJ]>z?T;.l6{Ёدw3DM(djíZ03�b=.Y4㊆epv5 3 1VAC% r|1`q8&I>(͂' F  eyp'Fږ݁hko3gN.{'L,BZ�W?%5d<Sq!GV?Ch@,:iZj:. g=ɒ@!Fb8@Y#· ^GUYxtÏ֟G0nj8D gplJ$wiFFL qҜ"x1 q7 !v~gd$x-` ʵ%<ZGf~SSlw^r%~ {lث3qKR.EpUc:pk&Ij9sf3 e<ydnN;NwFynkvk|4w4h;:=lOVR  k:B\B(JJ3[ dR"bC7$2 1Z >ilHց?I=B6!Dx gp`H埰!Z}ۊxgN]Ɖ!"Gh·Yq#C)8B)L?`\N]qRj}[yj۶}ҕ00Ȇ @e�P<2Aŀ�{[m5=%}WzFc"Oe Dhg:m;\~I"m'{K6MT,qtZ}8R^!Ƣr2N>py+Jr1#܇-Pn[ߖid2̌3:;;upY:i-[jFͶssgD3K칲Եwg]?\s?|;EFIzNNRŏz}}(]!fK^iU5 jo4Mv^qDx$(�l 53uJ*-Sf=&! 0c3CF"3XBl6{hR< Ҧ\%ҙ3̀ȦQAw:Ae#so?^iLJ qp$[5j)F/g4uUWIԽrY}Kۑ;"�FӎlQ�t1l@Y<hMBg)@Lx`e) Mcn#zr]7<# >߷GmF|5֗A6_Zm=kgG8{b;MhukUK1QZڠ (2"<owU$�4kQ#i�!ut%mӧO?c:::-[pSŧfd#7[77smnT!s̭?:ϝgm1ѵԌy+5z*kՀ5p]o51W]sh1޺mmQQJ CL` gH+4 Iktڐ <㈄K�@XҊ PU$ .&Pּ"F8X~LSFi!*[E\,4d1 L-1ڎdɪZƌ5te{=8rj }`tuuՙg͛+j{93аlGGGR LMa0s(T #�9?R#!-0 CQqy#. {˟8mIzH4NfL(hl:uIV�T/wg{z6o\ZXnY@6*XфPT>QiqRpH[f!7\ry6]^?TviĉuttJ%J;bŭ٭(f^_-sjsu1-}>>-vxzotTx(~Le*._}G纒K[=ee}V=m䔺nq:p2K>q®'ұifcM/~QV`$whiZ.+<x�� �IDATj:Ոҝ"ud�\7} 8vge�M| 1:FCtaidnRG.dr0F�K3'_D["5k(ʼhj3`c3BlUVĎ.jzxI$QOfZ6ϫoWܲ]4 XIC=P.-0%Z"X-Wb4M5û7ʁV2� (6O.$#j$o9s8_gފңRwi4'g!ai#ђ^nKr]f &4X% $|ށߌSi>}/^EQ[[ۦM;;i>CV8+޽Oϼ nVOW>۬hzg#flJRN6k3g4}xsR [/ƫ6_ٜsV>jZlP@ KzA uBݖxS*mh4$ .+xN9MK J,z.KD>4GA,. 4.{0)XгrA 0@ Jړ�$#1("fx{JO02Pt$ͦiHeo&7%77PJݾ퇩>0)oa\/ba .$O^U@#f|"H|ⶡvh�Mt]7KQG~*<} qh0uZ}'S;菜z3gΜ2e`^7n2rNu³tJj1- b~(MNJ=H>DTDA.OlX0Hcd{7/Sě5JaGGGt>sf]^mgwt]j/=18xLH&\~λ Knյ6XՎ{t֣O<qR GGWJOz2ךk$1(ws뺪f5߼ٿ=nBdzRTUpDž%-eTl os;`$[r],ğ?1 {V�gqOV\� o~�l"K9,3 <N /8ķM>`o?O|�#꼬jJd7Hq2Bae<ۄ+d2&c{Sv#* Ga#JS=s =*r.&5ieKC%8A2!ʦqOeAAymDGrԽy<lq ݺ[($fA O[$uC_h֙2rw\n{߭esJ9qE&ߊ 꾋UJ} m_Xe(Ѽ˪)6 x/t|y5i:uh}7ymۦ%igCnǂjl6k3BV J*^PNC l!2!ҰA�+<_]<gM ,;FP S֧w; @!v.)H/б"*z!,1_$UǭH�dJL!W�@dޢ,/1-RFGv :( W]t#ԡal%G} 7b饗^r]w̙/… KRgln2v2h{y 67/}on sDѐ9oDz/\$#<m!J7珻>=_-*D_S^kz5vk fvsôxjg++{o{΢9Je?g{갧~<qGO4z~o墳Sxc>>m.fy60Ilsiq቉1hWT*JT<Z b�j~ 8`5 /^|c$y1{:d+BG<'1!tFjFj͵MSrId20-o`-ҨXHDn5k,�i1y#IO�-񼱤HdXf_БF@dʃ>,@2,"&6H= *K.Y5=dٲ;ߗ̓gyf…}}}2Ept!$0cӵYf'O??\V^3cC hr+`&JxL}8kŃ[EFe]6wp_yU_unܭ[z.<v^}ޗ 4O*t߽_vYJweW5MM m]oGf 5u&6I.)OD/$I"zfZVZ[ 3L((q̦MȻ,I4LDб`'T<xZǂ9܃ݑ@` @V;8O7j e2cp0 �˶Ũ8\')zZl4e uaBS˴TׁϞcL<hj39EOJPk&h$C`J@E%r8)Vd 5IviZqL$I G^$*UP` =`LaRr= ԎHli>A%4;끩I(RMrAwg~><V/rTS[.?):ykE!mۗ/{(~'\_V;s[Y#>rPA/^mݝ{Wo $IusلeWy5Oaqӑ(P^ĕ6:p@ ePcs�RBLBC=|lfm �<ܫG6 K(3O ͪYf!J -?{=`!3^{W<*Kphۚ9 \LwOЦA5$#$$m [%NL#S rLe̙a4h)Foe$I^�ع݉g+T$5lOΛNlnM-kwyyofV9h*5ͼ)^B4sX�bQ)UհPvVY M}kZWu_/vkFC)uwer*ܷ^|}]5^ ֥DLINwL/_svIwy5jƳg5AAͺhEES.ST2*sJ{beRP-PՎvd2.hKEB,eOtQ�96z\"m]Ki*Qm8{<OCs&�g!12we-)9"BR3*ҴfG<](O09 >t/apC@8Nm?+T0ofkR9v*UekC/Uz` "2LaNHc#N4 S+L4eilYeo</HԺ̗MPI4TaxF\j;Tv~뽮|#۶m[x16*n_A-)B|V 05f) ՟`M(]]}_o" ф6v#:Ӗ}@Lk%?;s'י^э?Y`ݓJl؄Ǻ[*=a7֫20iPJ^߼ysT*R4MѢd2vDo 4- 4c,j�'Cg#f-ma6'ƆiJW3,2 ��蜔؏0H9V$H  f\o:t_j8F@6%1r-KH@4f9'.q4ٶ-S;By#@ 1`=*5%V]d4MNuu2/:y>VA4 ?3sfɌ8j]% n, K%dw54R*0y{yJH7;3g܅nHO{49Dŏ[(Y[m'3'g,Y"rM�̹?S Q<!y^Tq#͍_YIRX134lbٖ}}tzVۙ<d'<܂[]ձKG&=\o7wF\.yh_F#FQ+АX2h6P3Ȃ(Qh+D$x<&=8FSxJlo*UUe2ʖk,sx ev-y^$ Y,{D:,!Vo A.w$2(eW9Ʀbrfǒ}5"emp &z6*(`axDh =yefo#6h]nxAK؈gņid/*LLĽ5y|0:ǙנâW$QSoc�|;ƧI\)5$:'2kI#11BtQhH%$,I{ MH:wۧ~l9朳VgW_}L9ܲ_g>/088844n^/J0'⯻5׼yi/..:,<,91xf{3Dѫ7N1>C۶mmyJ\.*Z[(쩜q'Ŏ`2z# <l}΁n#LYx?!0l{0*=ÝkN BDN B"-8`~m APAAidCȜJVǮ)nM'T{9^{5܆L ُ@=kI͘ ?k \S3W$vt@UD5_> [h;�6w|HhvvA~� y)dʠ[ o90yR!Z/:M.$n#5 ~t $i#uʖ=?ʝF _/L#mL8:껨/|~hhV(rw4M`ύ& 5Givt'5TT;j1=?:t~kuIO?5#_9+B\h-ksdMqǎVk'xc -/}} B!(~yg4xu99iҹPa8^]LgĎV522bל"U=,yI&ЛfTRLrtBEgztܒ&^RD-On0俖o״!})- PYN5Hf἟xݷu|N{y+¿U~gr ⴛK,]CY 0&,=29C.p<7@0/& R5i򑡨MDtE vᡂB/zsg Գ}Ra'ߜ7~  OI8ht=lhgrFi;kЬ:{+V WtA^َ66g@X'm^ЍL8uNǮᓏ}c/ak]/>J#pdS*v]xEڊ@ϼ?㓃{7;v% !CfL_ؒ۶mQUUQ f,^�Q`MCdO0M '(%t.j,\\ƽ lpʨ»rP 5F235 [`WOQqxH &[/d5].JiFuqnX0AͦF(S)*Wی[cvw}/Vv5UȈlng{t?CVf7ۨI^wb󆆆J͛4m5Zi&i:}~edF$&Z-VSesr1`[9!UQeV^=<<TQt i\.wO]Kyݫ0 kG_OV^`%_xlzTvj5EM5ѷ~oZxa(Ow1/y>kr!SLRDQd7>ɾ'^[}mLzP,ikxWkڼ vlܱiӦFa4;D,.hb* $+:  h,TQP+3lqf,*X.irdɒ5kDQ. 00PuԎZpJ|I8DW=; z7Kv<bW"e0Z *ZPV ƪp [aԬnUZ`{)0ְFB92�6U# F]'VǓ$ܴXp=D�U4M(><.D`Z91OTyyc Sˎ�\O)̵UϲN\.~g{DRe(,\0~;j'Dvқ[Gxp9wSgXb+jw׆V vJe:_bc\27=}OSv>Ǟ+X{=ɭ[Zq p*ѻdǜݷgѩaf82,{X' # eP-$@R,0fyav]uBExw|pSyG'-煗-8)ב&L Y)`G.֥z3Ҕi(\5xTMvjPir%x${QU_\3gHZEUI8ݒ$VFI!ߒݞ{sJ\V^ܴ0I+I ) />0?4j8JJ-}=2a)ܔFH�mO춸??Z 4=~?,r DɈx=S z{{'uH4 /%%l{ŚW4'kf/,B[ [!/?'nOxU.UUfՃݢv}q7mX4Ǘ/_n:͗sYc_|Ą**YDd]5)- Lb4>yV39cB# S?*'Vfk8j ./h͍?u ;NLp�!SES>Փ[0Ù?|'?=+Sby#uf!۾01)*TKοlP4`:^CήJsŌTqKț43Y+�s(2--[ؚi)52ȅIIDIdqd۴7 %;nӽӉ;&9i2�)/+XW EvCƏg> u럫7pΕ]?h57JIE .lX@l6$3gN;v;q~zܸ'^T\tkMϚ텃 QZSjlol;b[uMxddĮzN_>tCI,]]?x˻Cv?#gFyo�U�� �IDATG-I:%FC 2gr[ԅW:F{@8y G\ڱcG^gZeD^48,6GOOx8w &9pRY*'{@)4_׹=UT53z@-Rd'5X  hm[Ue& a҈q:r9k4=ݾ>{e|^K6G=S]'0VWIfeES)yswuuF+oJ/.'~EI i;8[>,l~ zιWsI e:+t^yPPBQX<B*N= e(S>F4ؓk㔻Nul2>=GKh+<vۖv׎~5my Z| ccc&@Q?;jYj5i񭣣F} .4RZCӱMX d~C9ɐƩjO$IN|R.BbKݤxOyc~M3?dS�]TNWƳGy4ꘅf[</NڿuNeN>d6�Mߑy# DvCή"_;  gunF`kH*U\9䏜:dْ$)~^vO=u,3#ih4ܔP.%|´{jRkv+ $P^ܔM2ڱ5wScHȷ`%9K貞&cߴ?6"iCCC\RTJ iғwsέ>绷ꭿՊW/(O<Ǐ~h 1M\m-UFa�ZS_&iL  U3hY ,$X?+3^EBXP#bll#ι‡ $?3OC"G]a8I?-SM2Jv|n 32!&PԐ Q46 18Kox}ߞ&IyWJj4^$wLՏV~ds5/O\rh= sF2$bj:hHe+aՅv,CmtDr XtT>@q <%8QqWGE청w=w{K(:~|#>qN\|mϵ}>ףC|( 80xhh4}m>OjgIAti_TǪy:"N%Ztje ISMBlpO ωקr#EZS\L;B@V̶X[LIӆ(Mydr5"gZ߀[BNt*،[j4I,kHזd'_Wrܛ p``錌\DbqJkB5o9*^+Q+_莨({ϔ~TG5uN`J i'EX(ÖbJ%3k ev]@c:`[=@"ˀ1tʲl䪈2T^n#֫V.J>O] Fs{Ҟ55 `P/|{/^v=Gֻ?xݸG_} 3!D/@5t.?NOaRNLX$ͼg]<4гJ$ݮUYak ]3PrX)Ce 3(z*VMBO!r"N;N fI`5|7%5Fs5-c*en.'ܧ>Z-ף(iIrM~geQeAԹn8y ZmZ;A4$2[{ec[j4uˎD%K,ZoH_Y!Vl^q΅ٳg,Odp›>:t>Z^ocsF%/#Vd\/:ran%{Qy.'V-퍭7Fc>xw_ݹ{_mn'5vFamZMT*�-Dqa Rf!193zgbfNe86Oys*hMw v&�ⴹ)(μ,lhlTv(\ 0Sg21hVPZzx_M qtnI.?y!>*2;슯_xynA}0MR,>7RUZ?zL`a<]NMj�IsqYDd X3BQ_():κu1@heftz  Xr@<88h}r)@ ;4*(EbۄhLǁ{8Mhpc޽w =ᢱEk*k\xq^9WyeLtW/\ѿ7 n׫rl*6jqb՞5F~eex`�"#p,`.j-VHf4Kse۩j<TGUa֖)|T뤳ί(uF8pfna uC0Zl\hd n tK$�'*_NUP�bhszw5#9N<q/i(|;Rf'e RN8!6vjn&ʆ%.R*U1 {z"f8toܸ]ޕ~f9|&B0Ñg|Ntf8n3jQs~~61am4z뛴{åy/m Bsq%FN3{?1|;׽l9n9FH+_}.˄Q mN9 &F).Lu* hg-2:++)c O{r,A{2-zG%_`ZX* 橼N໫4iEődwٕ_ JfS8& qӎ{�.!<ωk gm֜Piw( c14&-5X'jh4A+׷�foAރZ3Ox$$ffuƸ%&&&[VRg! �Ю<WUoW\3$뷽4Vs港νn4}Gg?<<O,.ǭxg-/F*+sܜ1;P*!xzP(]LNX|{X(~Hs *5 >#vWٴͳh3#bM1eȨ2k VrII4 \rUY9h q75lKV|uB*1qf]?;/{JqB1 *l3rzL*Ņ i}LWY*+tEYjTZFM5/$%}`;g2нuPl$%,2uoڻ-dMo;7m8c"I[}}oy9VZ=/wؑk}Nǂ+"/r]=j?⃶t[͑yzF̲{#ZϏBZ' Xf�Xj@x) mm?>˺WC}ֶR=rA]'uSZvh8l+5lXAH_hCcBf@Qr3T v]fxI:lQ[>!a >c$>j, L(v BT-@>$[Eg9U]Q*j TC9zT|:cccgϞ4n2za@u~Y٧}ftB@-썘5gaJ‰#YT|swpǷֿWl \ኳgs{u8|xscϭZqg/٫{!lvͬjJ}ou8b%3ũ3a/W?xqxw�P.Yu?/^\VWXaE;1/+>H)>ej^"~Z1r.O:V*KB@N9/e8qR2$߭%a) +]:% (?3ۖniSRNx0WA$㳰nE3f;tB͏94j&43cFEP^y (*3$mkXah@( .\y}κpV:Mol;u֝;_zbR|s4sts.ͽd%_s===6j7zVAbF6:nԇD*íljzNe2ש2!{}$ p…{+֬YCpF "c! [ޤkW7y9YLK})Qck;_{~SsLˤ26dS~4qm�cf?rLՔA'VA T ~(٥:/ tI{ƔmHXrGeYr9iŌ8ͦ6MKE===ιfi92 *^e{|^9go 7^[duG?rC |m}௝׽<#VU[o43$VYuj\ ,cSt2HkK$;h0dFkjH) >3#~ʕ+/q*Y[v`+!~2x!nʆл՛H[<ZD&${ ;!G !W!`s@^d/#怙 P^= GM̠]̧A3TTy^RVf6l&H9}LUWfm@Zؔ( -qMۣ=̛= _*-}ɅBahhX,Zt:o~˙<znpccO=у/m Gqn0o,`:11a$:D:L&@ӣ1@ϣj} zۅ"o>pZjȬVj56q#ю~{(hjkL9 "+ZjZ5H~ 3&I+*6�#rSuKrvY\fн0�J,+@ONL�5c KUN:-UiU:.Ⲫg %=Ǥ $0 ;ȊŢq3ct蜒xY x`;q~L nGjb< `@ �Mej� 챫v^ Nv|ΡoxÏ~:/:'l7=<ur)I= U]zn fV]X;t'"#Q PGaC3 zL姨�S'ֆc{ ?"24d?Le~%+ۺRs _TP_"Z`'ϔJ #gg<!ذ:ڟB!r(~[L9Rg U+IQ&% {zz(@6Z1eIN:~dFzLsT*WDD(Q)"Ecx S/�@C,hSYf``:jۯj5cXiF8}. :qނlS1sݖū_R?%l FԪժ]@oo5l}ZAR1>@lM9Fa1)z#xSc'Cv\A dD׀l%҂?M`#!SWc+9h/hv DB`uϥrTi&i(2@%mYR)bأgrx_ QyeJe* :"N\f5 S2JV2$PɐL3i-5X;Njo,^&혆%ew11;2�oc) ~R 9DJr&ֹa >2Cv4ðHc=zc7f_nq+i?>7\l۲/Dv.v׌]s@ nw.T{{[֊}Yn\Xk^2v Zffј~pp0 mh>&.gi4*OBU)P[AޝLU/ge<Ც&PvJg--M5~KmA4Kk5 +hPG5a_Ķ  Cy䙒i+9Wu3)7%a E  TxꮡT`e %Ω#/Ld4ݨdٙb`7'c_iEأ6dz6!X@ vqPd0 Gmag^{R(k�]v@3j�a~lvkso:woS_T* qPᠫW̯<'smr/U ;[i ֎? 9v(o^YfxgLŋg  ަ4E*3i% .%|K4~PXngYk*' VhEHiDnN@!=À %Džd`{a=99x4'CY!Ɛ66*Qljf *[գ&QΆ1zڂӁrg:t, Ee*Yv1Žд$J#t(0amXF鄫z Vkɴl ٵm +ArF cۖ-[4]#6Q.hGZ p^}Y[гт0 ~tҶ !vLؽvA0 ujD&KZiPヮ%(7CMMtTN&6J˨3FiFVC>Uf#�?5�UꄖV@V RMAgyO{!'wv]PxذL5SWc4GU1T6u e z*Ȧ-dd7Q9zM4lYP{}qRhI `Y7n57žC4f IpyȤZ2GMCOOQ o);HUձ== .9qpݽ+~erX8b~l(' iJBXrGAVRq-:'Nk4~gR0fZbΌRi!IZƌහ̼A-Py(jK&ɫu L}Xl�ꉲZ'Dj񠊂U6x:v]F@K5i++T , g�klu>ک5yݍ*1^C˖Rkra]3M?;-=g>#XdoH7QnZj>zIFD^VejJņOOPg&vӬrڷo1)FQT&&&qOp2HhQԌ`B=jg9S{eSI䋏LӖ~ڳ3#m7ZDԱV)*d�'6;&yC% i(=*f:p)'FW҂(+ D:s>J{#ӣm.l!uűjЩp+ GZ�|숱Ҫq\%ZJ M*ѳ"  2p[%ʝjT<GsQ4� n�jQ;#fH)ɸ(>2u֢KHCQ4dt&[FXW>#7ILn3cv)֝2QFbmBb֘aLvZ iW*fϞeb-!"E0~FxjXEDbCH0z�� �IDATYsbh'LsLȐzPv;(@ A `vkj,ZUy!0x)N[Jg!gW~SJ^*Lfi`k!  -ƹhȥοwwOdahItI<y nBNX3r7.O=Nn9_A%6/H\c!MwY}XQDaS%ZjInZuA03O6VzR\՝݄e' yzfiG|1ƪQrz}yfy~$$l\R .|%mR}xTl eĩ3J0LFTnFBU7(ڴdOY<ZQ)ޮI 8n*<tkg&*b(N%EE]tbPByOYv NCA: KɸJZxwQ^rg"20ޢf'ND83cJ}kRtZ^Mib:*g7nrS@fs hZ7~w߱}4M ^{k|K~JV}lZXS*id\.711ڦ:Hh% v>"Cy\3]H54 kAb sQj|N/'Vc8 'T`aJH+? OJ'iTVRx2q)&iCn Tdw(� W:hvT;NI}GM$?vP�vG%�lQ@a2<h2S;spq6M ad|33Їjؾc= l)zhR===& 2G: WlXۨ"vZ]n[.^4j\~wOmEc{|nsyw6-=j|""rY`&'j厵s]\@XǦyo.$4Mx̼-~+Z̍2kĴp�苃Vg3&ɘ|~<4UZx狧s\TiLQ~ @bO I!'JGehU@3ᴁvغ`8rvqCb992-PN.zn?U!m쎰vp{oXZ ~ c}#E絚vBc̤i|a۶ב@v@A`y1B6մiadVfeb5r\RQ۷͚5z'%dwۺ2Vػ"limkm[գznUeO5D5rPd@gV,omRDm~ #OUiͯ 3Z6jHcΔg4 xjՒ$AI1##e% 0)rN\3{FH0c"%O:AQb8@R(+ ջCή74IZȨMT# hKsbO}? XzuV o ۧ+wTh؋+Fr=1%D6Mc� 3* i`:!dgi]wJjWȀ֢!jm 8f:[nݾ}ٍM$8\ 1lٴ󝦋=BjU>7kKn]8la?\÷m}K f8XSpEZVT츱̼^>@l1ڣTКE5{6DBS)X�htDZ�iFvۋu:NWSK׎_gFLQt-Q<2Xk0)rg{^DQ!!gP#aNt25k'tu.METqh{G[+Pg3T"bnx|)z:w1bmac- a:11a+8@]7Գ1uرc֬YsQq-׀<3h} x~1X,Λ7olllvq7ʹԛ%-L(r Iښ[Ƃ_twn} u-m °xe@ѵdLdV^JL 8 b}n?*3b ^!IL}QGT4?-3*WF6x0 HP :44"r|nJJih[cCцgE*ݞ*@J+|Ewygu%&59Xdvk ljΓ2_Ĥz$;,SX0@ˠy (Yoj8D|0#gѥW1 o'5KlАQj5@CC;vtJs궻i7zM6V*LڢL3+i3zW4m1Ci 4RA6권ىC}*]`D/r҇͘厫8bT*lI聩1kٲe>O?y暹R;С4UP?V{;*Vw4TUAw#KPTM'ifxCC.R:"zja+9->722rw`:gvKܴ6”@5G++j|X/^Xjk"ݺ=H>I ;rT Gլ2AO >pY5ml^{;}{jjV:Qݱ:|{m{\T*,XRBOHL{9:h |xm%4BoWSd W1㮊*榬2b9NAuK$M5+,u)mG<oY=8@k׎r+ttQ�΍"kJ.!Cf'f]j^B;kNdT,+[9JRW+ < 6᪰qe#xֹ4MF O.$1쬨Žys4d707{Xosp,Sp3P2҉ւ+L$ ,Ǡ|>o^ .W0Q 0d샞񵌠l(yG{d.-{[h4 Ɓh$J&x.)62gv R@@xs*iXusc˄y. VіJw$U!LR[titjթBNv]^*Sdjʝ̴Ǵ<S^up"7vxL̛pTg2jhf {M72�Fpb!;iP|̌(% +i\:!$IF]\v}s.<(~<ċ[6\y^g XðvV̊rZ\9&:DdŸP[GuhtsjlVVvOb+>c~pMD aW$V�)! Xy{y~qBoonmdd$9sļn`IPa=ٱkMpyjp(j}|>O99@I#8qf u^g2-z}dPF۹9v3[,UMJ ֧NX+R5qP)3д4e}:FJY;J|~XY*s]?x'rTLWTɒYh*iâaD69Ga՜_KNNx$:?yE$|ƝF# Sz2U2(Z 8&0*a^0)W'-25ퟜ:2gd^bbŽ E8`yeQzxIcoxK\`x{<GX~{1{l;v0߃aw7v߬YEBube  M=Jbl 7u]S2ZM< {nQ(|R|I+1�ӆf9DV`I%jfX- ]ʴVM4X ݌IjoP(ЈRPnuUrve<Bq2<hFHuWPWh󻆘B%F:Z5!|(w}e$+JFT?lYH5vљIR;iZf`R{տ6!BGV =NvK~5B3;sz�&M\O4lƹ8]^EQ__i q\V  MٽM:NpS6i*x REpTaI1ĻNz &FngLJ8* b=7E/MOCa= 9U 1 i~k;N-t~<MM/H !gYC㭢C;)v5*�N\͡rī#ԑXiQ}sPVëpMZz�QӇ+W+OՓ΂̸�p_@߫GxwV]l4"]y}m0g'_PP=) ^. ӁU=X>hOoV:ʿ`]ja>F>ģ$s6Gp  QWJSI f3$(HY*4ںùʜngyM*I磿-�By^_k>*Xhҏ&jߠSuL@jᦴo/62^8w]\X58"ye'Q0kdrqOx5k֞{zI�:M!6<MlR`2ʺџ@R;Xe) X4.LP(wUwR/M{`0ݴFa}9EwLZ⥅(6 nZrX,>e>Rٶmae\LcWMgMM[HȒT4+RC6S}^'ւO'Q CFR}9UT):dao 7@ca,B`T3f"jn:3Լ vN@q2o(A!`41ftP/C4v]X!d0ل0r*l iRCN+lw?JkeAVٺLovjM~Ȫ.N",��S.p y*i;HD=L zbE<<Q 3Fm"R]D#8ؔxը8 =UCqw])O} 6/غB\.s ^3@0= ~{.:juDRӠ 93=/Zx:豞Q"Jv;[]?`S6UbSՍUEU bW.| [լS(J0"1OÌy0dU2tw_rdh 4aPBp蕡X1OCiQM ʕ>YD s6o^R]ttΉdg:̬Bʙa>3t-ؘRP^IR yk@}_]!2X* h\tmj;MNM}Yl :݅WMی(vz^7_3܏)%%1Iof Es"!4f(i 4r3.R*N6aM9R\Ŗ"j ՉT=/e[eCxCP+%K=J,B\!S0ٳ;/J26PVvV3$ϲ݈>ҽ@gT̆ERz+} Zo.}*J3}9Y$8t^Rka"JƊC 8-2<PVlG+o)~XLB,sTI982_X|N[j5HIiAI@`c?nJ4 ,uSK*Sbb50 I3|0raʬ4E[*tXSUPK<V2 kbKT  H#VigL:=aAwkK/ux/3ZPAuJY"p/l9/ݚkLy.),S wL&ʮa �(.}ٗoZh7縎-YτMF(e4SoO2yk{i>KY*hz6l\5hЙy}}}kXS\_,*ODXXcńg)c1(.Q{S ^V�=9H+ '5QA -At�Pe=E~g3 u *t�JqO?`XO`ub�v}L5mՐaF'=;& C'p_.?|-Zkt XQ2˼Ꮲ:XnIf]˷ JQo$838'FF';p,P l$*Xi8&YCFTe_tt W~zZ;QeF8FIX0(3z$Aؾci1xxnڥk=-CI+INivXX+Rd9F,kG=7IXǁY�dKڪOD H�!MyXr-i5#aWKLjJ;ֽl GFa2R :T V]zdz57h?rZar$kݹ纅 駻r,t1Wрdj3()0"֍F`t$iR|+ȏ6" DG]n,2u'IZlxard`Ux^SEM i D蹯`v2=8"8 CA9[_u[l,|w}aFndĴJ :v�@q >V5Hh稼IJ5V@U7<Ӄp/ЃUEG2/Jqbc)%9~12ncu*.iK'SF W5j !1 4Nk(CG6wkVov :s}_vѩ4:LeX<xʙqOvەQmJ\1Un\+舃:ȲZyV:y@(U?:O�43DbqlUQs}^A=yH= eq7ұK2#N !Q2lR X ΟYq)nٲl~b_2:4<G($6ͫ}ӱu#語,xN;N�2hyJ0jtA8(b�TTΗP=0Ƽ  '\�E獴;wբs?T{ZriIYifOng{YrvNHҥ߸q샭HO²S*R-Dr-QJ= w|ST1`A8}gץ/~dPČ6|:mTرK\*Ƈg5W S*oZ:j. cg4#T)l\gC�Dh�.LApF 9 !g:-Ylkmwd|06fV2 {vm7aIݱzt aDz=w8D; k؀RُqtfTT&ʅSݶků<B=p)\@4Ph%N@TȪ16Oڊ:�Eϒj @Gq3e^4k gkɉp.3#r�� �IDAT8Q?ː߸v+_"ŋ'KܷrG!`c`p$8ZLmiT'njȕC8tO?>:pxtX^RcuF+wkRz޼mxAg0ʂ>Ӎʔ5lX7QF>N4Md|| ;*ip<ڡONW+UiST! ፃVKș  H@Ata5\0=˛ekVC $m19ךlz,ITΉ擶l&IsƪLz`"0.~X|e鸗Z;rsiNC)YP$Sx\L-�N8P(WA*rX*l=l " j%<ğ~~ wmc=~k=gv-r=~CwycTvqc|)f+ɒH%;�O!/u+>O?}6lkgǻ>+^](MS xJ{eo[3Qd0Q5e>FA6-PmT~\H !* Il@+o90vV4X�aw;ki?ISEW'o)Pfme Q+* Y_ݿ.7ϸ ﶜ45j;,ۡc0Sp\t4Uןcjv%3nVٻ)%4c]/^rt_[Z\N,z4PQFyRQWCnm4nI[!HݞYJuq3d}*٧~@Lfr~#[oug?ܝKSNq]z]~{;ݾWscqC}a=@xMJD8uږC v@C=tٲe .<C^U6լ]sjcs̱1¿j9{6;|ܹj[|gqO3 ^ZLĉ=BcJ= /snX,,Xdܝ֑43ެѱ= mS DZ�edTG�{#n^ۮ"ih=6lrfc ]'&&KZ1OIÂzlliS\. rXθ~}=|" {և[/JROOliI 'ϔ!`_ؔ⧋v .\hQ\N;k|Ao]+ "@%ϴZ¡ A.hjƉ 4) њBeU@oG U#"eh6(Ϡy)w%]9>9A/|y7\orܺwފyIjMŨi_6U a5Px:aQ򝴑vkmm<+/^qKOts;پpґ~Mszɭk׮Gϙ6CkVQP,UVsU8]'!4]n 8n|-|/˖-[tW^izP7M9r[PUJ7 :uOOV8ΐp 9Zjj>3ٳg^6mڼys2,˟{)" ?SHFG'Riome(ێp=g$ۓ nBxpbkO911a/H(~:.aqfqjTbyúK raҥzjT~a_{AUj'жl.1fUFa �H=8MوTF9ddUD�w՜1q2p844=ϐs+[/^ZWo}˽=Gw\_I긯gyA~${to훵=5=335;!o_0kÕap:q{K/]dGs>05:锓M<o|p<On ֮]y&Q T hV{$ImX܂jY-F+h:FeSM[(.m>=ܳbŊjZ*rGQ;rg7+J bjP}Bäh7hL~D:Ni&RqGy䭷޺qx;nǑ?Y'C Q. ,[8|2 FE nڴi֭6[X*tLg0!zMtT7ѡzN�Ss.N&gxF=.xD VPlke:B<zӧOyƌlS]qPfJ?}$e;wR1S97sr˗?:xMM1Q[>3_32 I0u - UQoc;#Y]ivzN9uT/;x?K]7~v֦YivNo,kYM0L(nA XRc> SS4irȮ׾G#6-|H�3ip [G D>`01Jaepo(Mchf<HZ}'UM -H5 :`צ�~խVsQI^z޶~W8x7ݑ"7j)͹x2LU8mc\]+˯8WZEQn᪂]NTqN$;qVevŀ )5Ya #<n@ ,JF cC0Ѿ h="2%5`s5u_O/_;<}Xwb888hpK!~lkZ1ydK8l|'͚S`�0>,gaG_0~''LmsΝ<6:m۶\.V<[`+vNl3Loc2}.fJTiҨ&47vO_>ܲ33|p=ɯ NˀL_Q,6C>uV~Ѹ:Rī&(z'gyZ [_5r#ivI,Fۃ35PURpi(ꖡ&@vR>b>qoFQ422裏>#ι[<#iNhT[dt/PfBve`]ƌfa͙~6^\>9\+_s^9ǭ[.xwI.5 B#,wyԥD2\Y�R&4-||^mmQwJY+=)APg;^S,Xof5QKyrqӶn{F /@[C%u]0 zA4M[i+?h꾴 ouwBxq' QeNLn ϽUoioﵼ)ijֱu~:#BWdL`Tp m#~\ a(q\㩆ikV~i{2G,jBx,+J 1G(Y~V[l+j$HBLz%gj:D>RϫO vJ`_=۝C;s;.u^dG6E>dǃEQ|T>X[V5q`f~N  Tcj(Vtȟ?2(]4o0B tNP㨥E?y] n27g۸];?uн~wR4k2 ⤤gcl鰠9icZ~&_n;΋^+W.}E+G7[y=}=e\R4RwsE(5=ꔜUB!䯻W WC\Np[Pf*FMWeRd+a? K?+M:yvșUa4MeaVYltf?d7�aؐ�qZyvRmn)yaFP. Z8IӚX;p;d`^ H;OxoQ ҸN4^/+ DўJ}zwYTeZ Ω_yy%MӤL|u"x*(\U6NL-t3|wL_'{//qbex-o`j-+AΫ6UFͪy4XFP"k$#m&W/^8*nfJrM7;ܹovι}]~{h};s[vI6lDVܧsH(bDlX!WlTgT}HV\ι7k\oxUG6 )./x#^&BPÊ F:H֝:nUUf_7;zt+}o49+=7I;.ձ (I3DzVi[N4EVkHBA)UdL4Mo>sFyRdؖ6"FvuFb/h`kHpK-f2jĢѝ@o-iO èy}w7n,1l6_ILD=#ْi=E%oIi5-p'><,8Wwµ;P 5P׀}uP!A#2 [l`㈧`a!hv;l0=G~eWQdI-MVTU}GQG㎛ wh~K=f.дqQxK1ݐ©W6-(U3|\ >w\֭[3[:#Ы;;ZMF#y&]=F0FÉ } Ĉ%MʜҜE/]~}zY8LN5/ W ">k^$֜@u*V}:3pN93)ׯ�^91sh:;@|2YS |T;g#^%׆AwRN=-ιڰwz00=R}mbNZR?SpPh8u'~=[0`gl<)ˆ]C~uV3 ަISTs]qH(еieӒadMRUٓyV3@ 潺9rs׼f;{[r/{_^|Ѫ; yo)E{d2_<!(p5`rEA\隒vL$I{V�FSI_Η}w/˅Ba֭߯o nBzA+Ӟ٘OwY:9l6Zȣ8"<睍`yu"0طT)n9^ ̜aM;*H(' M _L<sJLQa.L&I w:-0I|0 4xBu*S<yx"sn/_^Vy8-Ɗ$aQ\*OTº$q[hAф%>)9Zn0e8 -XN߅ B8UjY'"#0tr:mvქf!SsowZ-w9ĕ;a=kL?w |fkn?Ss F"V+nƍv9Ǚ\FJl,pi>MI!_? M< \.ک98sNZpmS)p&<+HkI=UXPsU K) _E:v UlUWG>ܔy+B`խT0i|Rcp\P 0 F{^- iAt64E#i:I<yk۫W}yT:íǬB<HtEA*Fg<�tj;G@D k 8L2Cb!~'Ctd OuZqb*CD>L4IZ>Aho~s}u'GzUe*Q;t ;MjO1JqHh& b:49gՉ6-Lm@#Z&ΛL'GFFlRVGGGapd^lm83{· :vu D5;R_)b3#yBCn'P-E'*m{:jΓYB @c(uBZȇLVg3{fɉPcS5pLoD}OJ04c߹rLYms;إj[ni4GÞ?L[LF/So$r80͔ FQ)ug-ۧQqUs7Tuu624c"HJ#AAF<5$# 6S4t7\{?WV?jdH~m[9{^kfxӦ懸-SiQf<k1�a|\NO_=ڂ~q✴a{^Հ&F/nlB)`Ay tN+z|ҥzҥK7mTu}Yyvu{rE_ieu!b4_*FP>k"cdj<!�L!76QB&@Úmӑ(O+ )x`e,7L@R<c< kiԿOZFmޖE^`0XruTg8vX{!,} æcݬݢhXokٮq!՘�3ajԱe~8̩S9g)O9[лVũ7W\oD$u/Gꑇ*Y RYu]G zźڄ6 r22\tS& ɴ3q;cO߲>'kZϲ'eet]TnN;\rڵ9O.K_FLj+gKg2J2Ʃ  0%R6}W P8VX7Z?='vEЉUs  ܗfE>ѿD 0[eٿUW PI"_ƚks|8ˬWZ۬E,ܯNNOz_ ~&;N}f*׸{M'1La ӥQH* 6:8|yLXTœ.U@V sņZ 8$.>E f9,i⠡�#Á/䈈sr �oH�ׄdY Bn40y%uFi{axCJؾG2~s;<ϷܹEDB',V[r||\J,8薸y■o3*"qrYX7\S(4aJ9n0)=ݓ裨EH7ጠ&l GAօQЈ!nhCD:߰*$P߰f4e'>1!ursEnkC^A A1I_'=;rHA;FlFHSNJæH%kaf KYC/y 6Qu"O<X( 2N*v1׵` ,6w�1QPNP0iA= vZĻG8k"99 ZD WХ<F^pþjݮ!ըvADTQ2irYb1M68niY/vpp�M!m :hb_]"pٵO3{_O'NGqh_=Q4dKp@Tyrep/'�� �IDAT-}ziB+׌">=IzFbh!0}� 3`LK[rw0b3 T�yzb<ܙ\C<N:F"RUC}׹ =(RT@?TfKΣ \@BD$uirNSA@  u4NOX1bp19/AX0T7V<ieÞ ZPpy5oGaX#vyxϹ^85Ӈ9;8(?ÃW>lz-qu02@Ti86"c4cZ-d<qG0t=,X 011\Tl~Xݨ!=yEh7&ը+Ƥ 6諐'ZK YaUg[!섬hi6JLz, /ح_qJ`[7nX$sGgѢ(B'FFM-!j!/@O;bU=Vњ&ll8ߣ+�vtP9<QvhzB1VuC> [;/Ldր23(#PR[P]뼖$Z֩جV?\˞{~zK *r}�K zKXO hx`N)P_%BzbDQMn웉{g\@aĨd0(yQ!L>DK"ui#/1 $.JFAKa\<[(bYp; 8@>= <ʰ5}s ,"zVaY! qC"DnCx^.)Ss둁>>4l-NϜֶ盨P˳n#~k` ӝ|!9,+)U qzE|b%D#Ir&! +DE1@€hpnbY@  Z1q2"6QR`0ȃTFNq!O8x,Ɨ)8:"b@ qx(DFbSE>5bDD|MeWTOcb0F4IiUYY69d)'c9A� H6Qx=a�Sêa!#.Ml^4:hxC;0x=7�b@X?}[9gXU_5aBbA%@ظ[|EJFtku1̛7ob%|u7<ɾy[Mfpa5#|o ϼ,H#H?: TL�xy�^Ql.+Uƫ 9722'>|6"B8j (Y! ip Z͞Yq-O)97i@0'CLCa$,!qߞyt�k<)=x"yɜ;\˔r^/n_ ;'< h—�W!@[0#+`j,84E/ 0ʯAЍj0S¹*cdOD#SGl#~*"2::.X=&, b(;N}a2IP?=V]@{*๡ISX 3dS*+p EnfZTADQY{GQ^{}###�,l-^N})2\mv ,`igG65:.` .Lb96xsADc,mƙ Pa()<,n 8&y 0}ۨ.&<ƘM6ŧ׳cGY2a@FL`9`~0E$b!)`7w46@UkѢEԯ5@o#2*`hjQE>Ne˖i ogFH!r}ꔃJ]V !ߢȉ`R4ʠكod &�.-T4naUX+tt1 f<#h#kիWoذaƍ%feކ$[e]�dYcn&YE199vw~lZTEMhId9S,t)0㜘6ȹK_*->5dZL1b>@u+1|ىxQ>^{EҥK׭[e73&5NY/m 3%b:rCZ1P&& 5!; 5#haܬ$<|& $ *xR|n+ˀ۪3 :*~sDZy~ AOF !yPxEBm(Ѐg-NN /TUfKcN&Oq B8{&bW!VPlx7mt V=pc CpxY}y!ENUWHF $j|PjB(>(_,yGRrqB;k! gr&>kCTB.D>20qMņ(.R1hp\!!b(I1j&P-]͛I,j�K2'\gnAEc]-S>0eߝɑ5p-}5Mȣ5?GySIMzx\' c2by6Vh,h=1 h w1ɄRsA )@=N�Ⱥ@СVj4xȢ<hrT}E#_cg'^r8VY{_[ҕ;_%pka-BpA?E!\ '(*(dp¶?!>4q$O-/s38M#dV~ձaغt{_V9폷Qnއ88WfW _h>owYm2�>+4<c Kʱ_h̛ 0>1 LXNZl%}pǓ%6.'Z": ȁ Cyd Y1 P�xDm3 JH(q_37(ךk 9PuY`pvдդM[ ;hɴՙ0,ot(qn(�O (cdėƲd͊ ehP gl,3ۛ+ϜzrW'oNx94y{OI9 B<g[!f@,qxD/LF$-sp0MS!~P?6_˲G=vutGw="q!$e&?Xyc_DWEc9v?XSSS:(޸FS=pr*j^fdb*sUD!B tkЁ灻,Uyx- E+`8E8^BhCNL+[0MK3et#l~nxR}>2oު(ms6FCT1ZU$FEB[ՆPidȨqa� y'2@Nw+ڐ1fe'pK a kÛɁ&y0oNd1(5NgP`z'A'(~~P^aџySC?3em!$ <RNLJ"g=t�"?7$&na'oHffEr f ZOXdBq6p0 Úf SG}-Kd孥F  `-t9_f@Ñ^W E:5 6ݾ4Ic쌏'@b渂0PZqĭ+l#PX`˹᫽QU'V~;Qt<@\c h+U�IZዧQ^kQaeaGK Y lgn( ɰ{L@~nJhF! ,;FC3[s]LuU[kk9fsT>{y n\|~,<H�- 3@ٓҠFܘFsӟa6s:b$`5Y<Ħz=Rl9TTu0ˊ_uߊ7h_�1XQxf qʒ\83Ui 67LV*< #' h!AP8z5&{xf1�46]O/pQ{1H|iR~)F#C$TE&ԠfhBzn%Q*|IV>e^xe#X-h!=#q ^�s󿁔4q|cnSEZ}4?=oc2$r.IO[RDd0~Vrg0̢ȊqB[KW]@!k;;SO8k̼٥Ӫa&.b2;6 tԀ!DU,Yuys=PUUz[Ӑ2�$k(P8$}=>TEzCmAPV/bIjEjj6:XCF`L4~xHh`ªQ}-(v7!no"[UwגYvzkZ#CPkG 0 ( Q( O&Kš`ۖmU.{[2%33<7hs9�t1py&=\Z*\s&ڪRhIl19ONN2 @T8yLC(?\v|Ck>XD80jd܃u"6;' !oĮCmL} FkJ$VXe41)0;"pƒ>MLL懐@=jA/ĉ38#!H+ WA!+")yt(}M,+[bؿ5�7Yc\I"AgHÚ0j'[qZ{#Fki@lU/G x}{v.K(5kHw+z:/ivu<f1&+.:SТȧ{LD'41g3yFsi8[33k`Ff<a >؜o] "R7=C.z͚55=Jb|FSGw7nϟQy׻O~Rms9sj\TLjh5M5#NsZ_u3Oߺ,dn�XܰhjMÊt||{ ^^v/a/w 7i)ra�7̾͛ 8pqhvLڹ 7-X 0:ЛARH 9z N1&BqJ!;_ED&oX(c{W<n>)KHkA^Q( i5c'S[گo|M7411a϶G8S]<xͣ;1bV�<Y# r rjxғwOJ,(E$Ń_ gMބ[Fv/sy^尻8.x�6$΃b[\"eJL !O췾 gߵ*;jLq6,u'k*xd1D;* d#_Xl>xebɈ"< kq3w|`vd`bN\!Fp4ӠT[F6dp$!Ń}́fEfmC|פɭ':{ctf.ds]n+izhVg8ҕiM@8FCWzԋ!}a;�/2T~ӞҗAEdHQj 0$ nט� xw<O,Ƹ.T}03)%+*"?'Wя#RgS{jȁ^<,1~ FR^B<oC19gLɞei$nT's[[]ہR"EPa=`$_ڰ r+HP\ff*;onzStU}&ֆC ,OOhaDeA|bEXq@s^oeQT \o6h-C@�džN684"e.u]»+928c B|YN_"[f*P1,sEOWb�YENC�nRҿRo* w0$IK_eQVo~~B-xAjڕ6O43;/ zMdԿN FLn:.�i[=�czˠ]@ g|aILAsW,D_*[MV(Gr?õ*.A <ȧ! x_7G?Z~l{0ABŠmƑ A[lOS !{mvӞ1F=2 !cȰW 9"JK^f)e6A )nyQxˍ#3D$XNr!U Z&`1_KHYk{^UU~9~ n:2R׵j;E]Z4#c_*xNAJ A9KZ_.D~ASr! ؤ|%|2K)O8Y;c 2640X(%U2 W.eyR(3ίdz̐ nѶ'9jX`S,ijJf;]bC#T.'I$J4 ,v?C&FQ%IF'qHm!geY%l"N BZ Gۖ5FJ Ohjx0(ABϞٹ-d]Qvz<oE\WMdNsuxb־CV{ԫ:#I4VqCFM'rʍúk⍅_u]˾#[[;i) #$F^ g.*2nI_֖K:Pz K2[3CTR\U 8ܘ) 0)lBvBΟ4:wYfYƎ K;5s++V|k_˲lƍ"RQ2)W*J'cKsB 4{ Z"3sa\IH4>" Gø5dw z`%C@xCrZe&zfӱHe,|Aq잽r$I+t1gN<C\3@SHj@&91.ʝ\ UªzS%"^ܽ.B$Ŭis|Aup@77Tprs+wJ7 GsiKAO 940>+/}m 9Z\;P,sd1Ghk )=. ~rM6 qwWzӌI-slM* 82Vi�3͸ 7lDh覰AbsHq ʱ!T 2>I�)k5ǁɐE3Qe͕":z7|RE$ k!Y%&x "`RO'D^py;xXDdj1DS0\3Y 80?cxsw;njxcYcK0w<�� �IDATR!`54TعɁ<c<w c=g94Um 9�ǥxyt9zM_B[ppkjm^YXLo}bNUȫ~tUԺXL~ 3?yBEX Dg$:8YJ01|$3&p2zl`UWwnYV-*Bߵ~63XՍ5cTJ?,P´Ίl܇a{7X뺮Lߔ,Z_-EaPGgXHx C|bֵO!Yy%"MnMD ڜ 4-@X| cJ?7>VBM~5>B":☽f6ScD +6S[IJuQu:V~c ֔m!T e"䦱LOI2p abxv\R<wczO9䛚zBoJ icPx+Ө?&q MY`Qg[ wƬXt$3?f< !-MKGY2 -xʄ57⁛F\#kgd/ 6e@ ׉Zvk; rq:#*-}[Z|v ~γv*;1"P73D+� XF@R3`0F5.zڮVmM0n{>"iAF+&˰c!qsi5Z2υY=z9q4e]^% d3o,@XǐgYVe:j5\sVx6մ#? Y6Ƕ1%xڔU5yLuE[cB. (O!`a]Yd%icLc9ArO29W?.oo}f9r66wxk"';vt(Q (?SnqƘԃD?ܕ=YVkx0 \l߬zJĉ˸_:cgx̎CDȍ@ҚQpQRڗ1OnB mA8C繟A kmp PCUyUPەi޹ Fv Kƒh`{Ʈ_60mVkmXXhm3B#r@11dgVYb “Cmj큻uH9 Rb+m8n?tp�;EjMA`@2BcB>Ǎ4tXyP2Ǵ�pR@#mfxID>e8 tt8wf;3ñB8%qtS4!9BC*p 9>>U>P`N>6�xD|mUVD֒VuLӽ`0xw][;۸+vwhMjy]*A˪5ZuKe4YkSEݨTPY#4SRA-'&DV$�ѴP" O5vLnYqZ1 "^5.NyV]uyGJ34Jjpy/%Os4>g[/ָNgy.`ޙk}5o://ȋs1[!^`oKHtjT/c_0S6yKs> aMs΅߈ G�->v Yvyg;,Ψ6?5qۇ42n⼉ xl=~2Jz iZ2q 9!~v0ʈcv]7kOk}<(ILڙ 2tDՋK*uw~f #G ,]\1=q6Sj͛>C)G󧙴c:Jo|&2(٩N]15Dw&j@J<Kfa#b $sD2ATH>  *B3Bx^G_4>F25=shkYڮe W?iٳ<ٮ'hh'b�k?1GH4މj,Q AxN*<8qfYkeMW[Qz=d0D !l ,^5,{F+ |?WiWwιv> xkm5<_%_5;v0ݹk>X]]iUզ1hu:CÙ)1$� q�ݰW2n(f:66t87Rcц-: =2i04[E׊JH]5Pza8dDD F^<6x"f]5;Cȇ$|�PLG<:bP-.x&bcCr[y$ tziDf z_#ywK]E ,mFGG~]]]CYR׷]X7g0Ib(Y@d z͋?H;Mpq cfO9Gf\ȾyډeP!l_ׯ+xccc/E 8(BL^;C}ֱFAiV3]H:DYa9!zOR0�[XNGuԹ!h3:o4MN8<PD&0ՔYOI>: q'x$dbXQ {,nݪ09eC3P0 )�P4*v�'fCAo?B~EAPC@-⸀>j=OP?]!m#6s:)!Ź?Џ}$Hޥ=Ȼ8%}va;O~^gL CU֭[`yXfBLj%cPtz`ε.̡A+`g3l c`(,󻦋0I4N|l{C#Mt;7m6�Yi܃e%`dIg8vПG ЩF`>P-X';o_t(zy]/CbPxSw8.>SR%J($EϘ'wιfjva}yg:1N8XkuD yI4u\+ �6 ccq<@xz2T:d~5@Fc'?Bz"B#Y0CIR+oKwWf(×˪Ȋnadd]hmepWqInfDc:NeL‡e8383U _rD{ $Јf$Z$SU8~]Q*oMLD֞޿-ti.7 _-U%VXT ")`֭,CZ0"aVJ`Ӵ�gֿѬ q8Iyq̦Mlْy/M>v+7ߝͫ7U~{2n1Ƹ/tm:lX) NzZR*W#ՋYi>,rʕ+'''<.T;Wf~;:U,) sCPZRШ3V(`56!)΍j`ģXT2[Qp"@5 ҐMF-<? 18ztYgu<A^<t+܃LoL"cLqXAK0an ؅~`Nbag9@ @^G)<+q@+a2c ⻜]j6NFN,Oۙ1nU.2鿸oYEQ$Nw7s6\ql>Th_Ξ>K32mq4h|Aty<Adgsen8,NNe}Yn<L~ ~A[~JR)TgqF^eRJy WqBT˲ eH.M7d^oWTuJe`p6J0@ST0$FH nAOjxACb7/Y ^|t,t2E׉bEæ3ņvVx’] m!Ԙ2 ?66W3Mt}d)*dps#dTVJOh(A&@9 j5wyEYF xxLb'Fq%U}Aa 26d 3q=h,;߿<MW9k!4Yc UU?cey4"12{H'xACcfpvOhICjOIo(" 1Gxu S=.#9);:7u?ެx2PhMp4RpAݰ&c3*D4%3==wbAf 852$fW2ĭ !jD51q(ōP7`vLa<pUIٚAд@1)]Iq,g-<?P� Rf<ۃ,\B,yV@0ΰ xx yM_RQS :, IǎPIqW`Dj؏vp@D;Gln~SrNACE3B(W`G8vC$E9k`bImwC d TseI<N\~/[l%=TG>ER%(oo~<0-cYtѧ{+/õC6#`Y  ߾* _Nbw)fC u2wZ͢f]�_{BgԠ<3=Lca]xX<tM<%Ú,�=xhLQh@Lq\m-t5Sf$W6ngm,bY/Nɂ̻ރw=88bko|eݪg% =ݢ8|q^hG<IYxi9C!?GLF˾2~xrMgAjfY655ŊA�h"]80Ra䂡F|eLWT*.|׾vw8aCv) "g{>,pnӔ 46:ڦ-kflsI69OMM*veeY2Hh�d96x<OY8Z3/ƉՈ$8E4@Mz,-B<w((j/ `S{6۠g@ؐ{N7  <x K䒛w־x/=.-gFqaCyꚧ^6v*LNNb_hsI(' h]ڋ$p 2 g+cBRX! ).(`/a{|~olni̝·@ds5+`5 9 -&Q8W(.BhѡQg2!/6UbO̖r2YX805N&կD0ǔ$(V9p6j#lB/Tv,eZkXPxH.&,cBC $ַCJq@ 3j "iݙ OcdDXsOBrfӃB*O[H !ܢuflms9˂ý8|yP{ퟶaa_g\>xbҥ &ܰak"=idL|hkAbECL@^FS!XeY߇>13zyh{_V-%I @ OF傘d0"lX!@P  !h)yГCRKqVVi4qRV=c…PÍXFn̖z5s뭵-lq`2hy|0#b)�x vA2wiA-] 5 I<,G<^fPC` inbw G?C YO!p<[ .Xr.#{$/z< =תq['UnS]d7~J~#XY|hڞi/N/XoI5nWKDʳ;; 5Xc+5-\Ϥ ŵL9sIOw4Nc]voߴiSQL Y$(pMҐhDCbRZ6d n <+:AwM0( {lҍ::Yh$3H�kl{)LPoHc#SRVoR{em}Ō+Br@2d:%,/Ef;3I..AV1lsטkjq"6b-t9f<, E9f!۟ma#_iĀ=HPTc^ <Brg>.7HX"KɢFk;~/wOEq>ۃβ:{ER B|SlTŝjn1gZ#df(ۺWMfɳ2\BD%s*Svb<$Ia d:ĮI.@(**0YcvAY2kR*Lq\:hr!wqǖM[ڗ{'q91<_No 'l f}#I YBc Й|w9x٠V?xZoD1^*҄G5 ml"</,r5(A`bQfSecHBOx?/Nr!܄#JKy&i4x,xg7)UgcC$4#,Q#|+]Wejc}T]n-Err=V9J&wY�sqB:J޻2ºIGk5-W0G+Pa0eE00q56oZAy^o;`?ٹYlVZn:ʟG?XG},? Jdy80 k3p]6@t-;"GQd"#F>SNYf%\r뭷T,'?0' `eL7 b�Lֶ>rcvhwfLgv7nDǑ�0eܼaڔQ;}@G^E! 'rEXUU^L:"Fx9Xڐ\ N_]$*a0lp@HAlTCHy,27r B gaVР*D/ \;vz\xg˗,I"Gnn\Z[Had\@'#~WŔQkV0/]rM4dhz7|>�qߏ؍̻Ǖ2[^!+68ooϚdQ5RO0ΨA@�8CWn~s$4+kpApGg˥#CnΩ` ".rlSְO5Kp*+G|n1< }'Hdh/[ y8YY)޷>1K^ Sh$zs"}wyӫ4qd97Wd@ rkzQc0-ACR,2$�3lsf9q>(@PNtYc,_s9e)_.rrYr2:*haEIQ76o\u`F ~{oR?{w=h{gbD6w8&. ( gCF'8 c̗'K1"_ٖȤ@yE�D ؇ylS?'WX,j%48̅%j̝*<FLo.8g8~[H>\wuWްaʕ+nYR3R1m16E1t V4ހ1HQ|.6fj< V!2ip;J�� �IDAT6AONN6X�7IAծ2W{/Em wsf*X6Q:͉ac ! I$~Tԛlfg\] [��ot:Y]N�*2%aJ,,+R_.fRF7Gߐ<3\puzr{. 5lذ9gGlﭽ QYkKWn1boFZ[UbLax3$1Uf?bGqΕRwh}sLLL;!4Flp~mv [08r0@sdÍ\`@l8+~DuҔVm-zŇ`#7gqa}+6]1_t˦^߯웘M:¢r J !^SDֻ(Z;͠Ð 4ȧ \2Qc5# CJcL*X.K]o.̎xO`kGIF=n*yevmC9d/.*_KS0F%,"fE!y۽U,cO|}zȁZ�h݌k > {~#ohp@ mq|k!}ɳ;xEvAv| 9C&^nFBgH.-c$�I]bq-P`N윶e;8sS2rl ڴi/,#{1_ -^.8lQ=,ɕk c[2Y< iI_.u6eYO~ӌ#nL{ '1B|w'qܢxZѫ{U]YXFts^�0l C+2\DEyt։[,eCRi4BRx|Puv3!:O~qt:4Mn h/5gZ iF”(jS* ,Zc]lҥK'''u@K=dx8vxSM+\p IAS(#4Uk:o_a=Ȋ(-[46fNլzbb!Z9җ$9g?+ )<zxWw;W췢~$-u)Jc3k39 SϞe8ú c+V;~<ktttp@I:on̔u<4fds!h7ڀsiΖ0 ,YVG| U= 蛅B8:hkl⓺guwE .[1]P@f/q16mzuF zp<(OU(SoJoS $=BxiQ\j ADn4f{zt�{Aݦ՛#,UxMvFHwK\˸Kʺ g?;˲뮻nƍצzcEfasX[BcJKIsOu׭[yfLiS}&Xt<nkc7e>/�yj<4xF0` l86&VuC&mbpTQ{9 [*ȁ׾& _hEh,:La x+2L:0x`MC¾Ye:S?v:Jq0vy�f"l,%OHp 's1!UV-_<_W;Vu[3Jgn>?ƉD )"GPe/ܣ S\eF.X`bbR|0#L\'7ze8 t?yj(pÇ\M_Ç*̎ hav*p}hj}}!$ӽ$`pVgSn q XJQ]UpPMqfWC8!*Dk Z{yza.v[AӨȵJpNV%ue*|-ZjÆ YEC+�o|]]]VQ}/H6m3 Bv|fzf\s b5E`bmj6 O5K#-`xILAj|H+/g-&<BY Cj#2LczoKFeKgvC>WDRɴ#*3>R!CeMIye0 =3˲5ky\iBvBD_VMfEOÉg 5 )dRCɍ)Ha%uqr1H?׮]|Ŋ~%6p^^'p `ΩfFɨ}CC#PqB'Nt<͘3͝Ǵ)*6#Ƙ:exy}>Zuǩ)~vyo̟7߭X/z7o6=YoL%"~`ri9SY.0_[a9ܛ},z'@<lS;=?ɷ~[ۺudofy h̀3Cy՘*+P<XADaYjXF#r8WI SW3_,{/6w˭u]³<w ~{Zeu瞲,Cj6HhzX[\kd BV$deFZ^+iYko' l -ڲBj "{I't衇>[nݲedsiJ (y<ϖgF0Ǎ x1p!G0 R4Bk֞Rx!#i Jl6�ܴԌgtFOU)|3dצuh!xxL(4MŃa`wPv_T֯>�ݮF&;UL˺_eZ\o > 6EaXne#/?⍘w]z!k,\aғ'4 P\6 VFsKRy<3nx 9Q7\%FYut}q(koq<)a�fPmyZYn_}xAu!ޮvUnC*TiK8E5Fșbqk31;%KiNQF N#7S#g K\!EQJ 7-"0gTtzPi9؍J\+`0(,l8Ͽj=4-ć L3_@hBE֖.t{|+[|[dzrAWZ@}GsKWAKUUtم'!2o m6"lƬ|PǛŻN_:wSqefd P2jR#`~(�$Ј}-9i;w(DZ 8Ӕ>D 2O5+/->xl#[xOph<Hҏu l,}Bd2DW<Q4HsŸ=i~aWyZvrK{Ok Ie8js>t`7RS> #`A6?2vKӫp}'Uf|.b7 1aCHNirWV߼[V^}7OMe/q׃OgGeִ40wzAJ֜hD(ƚ�pˎAHxq:4:EQOok AbH+y8Ak_6ů$L Y\%.P~𓻒qջ'"FTְ!SP\ UHQcd8_ 6`aL�{s!U!aʱuX}227oܞjcU*}S5 k삾2 KoOQ˖-]{Pa Sz65ˁMzm{Ӧ,$|X1k[ș2>.}pdexc_>d..Җ30 �n&@ +`AQ@lWCfBGWeO@>oT;IXD…rp[۝y#8blllŊ{䝓<LpTfk T{8z_^]w L=پ fVr7|ĒLZP8,ctQ"1Ǚg Z0B$9vTBa oغ` b\rD(zCMs!CoD7^I%Q}@m)}{e{mʱOA6I_CQf(8` з,F/E}-ny4'p3|WogN_Xh,|02$(ydpaT$``!�, ijσZq*xLNE1rɲ۽%%`i_خ>{oo>ǟ�+&+�04B+$8\wK- ŸByџl9 : ;FԞL+AVy=yߒ%K.~oQgM!Q *D;?wq OD6 Hd ^Hz 1Pl8UF; h$@J"l~f%4 `LDl,Y&�HҿIH\a@޾pWYƜn'8^fyu];e۾=nmvh\ePKSr 7*V /Yc5qfos^pue.u7[u]w}rDEQU2d2648r򌧁-[ ax<-[1 yPO<"< dcQ5?xqg>#̟ lcjW'#t{uoQllI<KQfdQ%A΋OƸ~C7(qƔL6W`0XnݢE(c)]bVG.œ.!ϥ%J'җ�@mi @8)ܦ$Q/@hsm(ʰ[+LƉY<�^>@!7Q`P'j9؞DsL᫯wi'k<pq=_UYn.޻|6lH3w.`ҁ 7øBe i"lpBMq$~zW}3]WL.9xm}|{6:og:O hA O)�k}\<ag@ LW\`I\:圞6F䤜wޟ 丝wN+rٲeO}SMvySd#Monx}Dac ;"m>cpEnX0JXud;5>FsBwaC zb®~Gs rZfŋ_]6; #PA3ZeHsk>Vtuj3˜Q[j4ٕa F<BWQ8щ=nNn!e鹮,ʣEtyF6w 9Wn-]ҋ6f)PdF^7a=#Td{S<Ijk?4]xk^sI'tA!/ap >ej,êW KDA>Ԑ6 :HkXk3@4& _YmuԥSa*ȸ#uzAvzSIo8n;kqK߬&ly"]YѭP9\PX 2rνկu]' rrrrBڠ(˗_}*K_SO}ؘ\xwy\/%?}e [h ,ZB<#|`hT 7i.:X. y0rg.}�s1ڣ*|o-#N.ŋv͚5!/&Y+->!%LE�# iШk㬬[ObEc` QoD1I_ob1\{Ă%D *"{r:3x.f8 eUg1 kis$S�qp:CýV),+1RV:H,g iϖ P;UϩزuQJY,^^.'I֢Eay#}uuaXJa孞ŞrȨQq7}tU㪓s")}N\8Z!LD+�nEjrHB*[ઠ d_7a&Zkөzj5 Ps!UdhRSEv;$XR$QU|4.+8jkBu];T~TRƩW�J)U_&[w6mڊWBxX=W .tԘQiq rjӭr}JYyhq>)7~s///W,%W}Bo٬s|82 V| 'RR3m7jͷgGPH>lme?*0"j29< d(!0g*hKpŷ (mL[`$X<r|~mom<Xw_8a&_ɝC$Issʕ+WZU,,XiӦjDZ ۇ4WhIrq)ZGJ.&2-]ܗEp7E]M"6N[ddV*e˖+ i7| 4ה,ڊm,`2h|R@FZ rnHz@jMO_W^SJRO?C]qr^1j5vYgcيWZޤ6]ԸF)n7<'Rh rkR,y[@ַ<P`U.AappJ\ Xx|Lw,\{k4cgꪩ|Oۏ۪!b9 I҇(euc 5�ǥ΄pCDO �f(f$z sTpl=0>n{@P8=pXcۥ U8EQ~|R~'x Vׯ\QFbzf ke5rghF1) DqT@H_50#X;GgaV+_?;T႑ AX!r'Hb"2jrYp3Fouuꪫ{nR矯~[˩L]u<x+~C+ϫVvi tI۷ޕkW2P.s#c(G]X{ HLd1HBWIM[y.a@9NFqBipg+kR+O9u>Lz0k@!i.�Y)*8˖Q dˣaR$&G~r.aY@,<mI`aŖ5LN㢠͊YSF J$Jt,0l ]UxPH6F|(*+-ټ`˯<wܖ=WڰQX1b> Xv`_pH -yiJ0R2@Us4N pf yܟ4"Q' !-#=I9gj<VGw:uJEo?Y]zi{}:jܸ퇱V_u{wuE[(U)b[haÆ}A!r@ dIɌh�<٩Y +)``MmxڠmfTZ%AR__?dȐ7_4M#4Rj�� �IDAT$pTHV "Eϙk98$J@L9 p|߇vwpyB]U7 a+aB."P?,qtJd(C+mM ec!\.y0^us^ٰ+aeСqDTg+$s-J|544ťKbiI6gf LHK15JWSG�ŗf89Sª 0NXV[DZ[ս .PuujuオIG!|| ֯__lQ&d G8)"�#L @/u!|~I\< hF`ji!3LG[\BJoYRISb5�.5J0#( ϐf 4y` O]O'NoTZk^p`vg_;q0ўyil1ñڿƏŎ8o8#\\5-h s}uq}օ jgD!u(!p> IH$wrfgyM6@L脂I*p)F[/ȼ'܈H4�$Es 2,,5=Esg&NTݦ ꢋT_bsoS{e@NugY^re$:o8 eNd\g&.q%;il@;9fH uų;SA%LAj\=>&>}?pժUu'Tre,`ya0+ H\6pjW\6nW89d�X>\(&ݫW/}Ǝx?@gM! `Rv6EW&kk95TUțA+�ggwxɰ_~-À "SRy|ji:a=`kgXXqǍI2βժl< ˀm^ FY6hAlfA5Lat 6 C8,r#J f \l 9)L*E))B3c i= u1ر_t4 e|H=H-MV;{2rܵl $GS寐hce,  7f^(7"(RG&8p WMp`^ IUZzi3R{'i>DR>Ί$[s CΒ4 P vns :[Tfos k6\.'&T ?g*wBpM1uFP2 #|+ݝk~ۿtKds$g& Ӎ\4iV邒oj3{_(@)р&qRI@&�X^9:_Rzչ\dYS'~|(e@qfYD厄q2*> n@c!: t,E*A(X}Q#F(o:H__WZ&%~/?oyafP*HY.Th>(8h7CG$h;QcoM2. AFlFb%(~v >MB-(92< cH2DvP*Dԉ딇 @LDZ-%Yp&0wHn+crĉ:7[[2*=PUq%f`Z3Мjrf Nuߪ}PqafdHXkp(Vc$P FAQO ر'SB $zFH=@,,o6MSF9p<blcf ]nȞeCO#KPbʃ}8r&!`HG1ލm4PrL8ڱ7j;UFRRmp6D}35 @qs*%gpJ7YtNRf.&r흩gc#Niin%ݓ;iJ /Pb#np(AfNsD8yc)FCtj q3Jj WhK~v͒a:VRUճ\,`c/J/|>4Æ޽{ 6hi:jL'#%*-MrL)/<Rp\B'%wX2E &R@wc[HP>YAQdX($B)Ei!v{ͯk$6!ʓ0 #QT9;f(bvp%Yy<w2 ok;zn/bmگ$NKgAV"TD#͊[cAk?\o+65R ^ey(Hybw-$aA'@)GE#&r�Nd #'`�p'J2,?pN+)Ȁ<co^:7O?Fg4\N}OL)Uzdmܧ$I )OI*bw215j;3ydL<+RjrrP+ ݻw_~}tDeʹjP X\6XPr/ <) T<>F31!Bk=ѲNMkEAZߗǖerZ)5B*؟P AJq  ƧSnD _ j}Ljāf$lҟKReVʅ qs[19i8v<Dg!s;bUm70 en/D6'E3UƑ^X[8b X, O�@PN:$)r9_Trgcp٧ua{}ihf~׏eV_ak{]`)O)*JnZλ317]t ބF@ZaEDjڼy~lٲ+cnG=ǎeW\zhpZڜ7apZԩYBp Urr$1 o h0-$+KrxT]Z6\DŽrf?2O,u/lcSbxMƠ{:E@"! �-VsrsvƔK<s{A+sTY)JJOarM@q<`_ 1TC%UavRPĘK\3 <!:*$`:lsЙ|0Û%޽{1SfH@w�|gkq%yv٥|RoQcư~lbR~´[l+4i4&<˿g6*#~ *Rҋʗ* .\jiKw'ď}Э<Z)Uͪ::>2?6mOB ܬbSs`AJEA<s>!S%6b8R8NC}7k}U.;~vQ,�͸3EN1Ae-?Cp0N(*-H]C<?4T^DKP6E_LϬ;a>'i5w~n{ jn.m/Òv+ "$3♻ .zKPc$S̥dTBZ~A>AH`K   |~=ѣGy#f2 d\Iɠz f忞+NҤu\޸qKVkylG7s> 6妦'lZX)뮻r![OY `(J\EC 37)WU@T*Go<IllE:�Rr-Fj=Lz%u7(O:$5Db@q1nCT 91EN(핖uS] E ڌnI2: uHS�np8H<q[M޹e<9רw.wtj U w [>VZm.2lukɶi:Kws}Eo.'40²x%O^bm=Ax.kq"�4-#9` ^.91;w3O^ǍK3d`nݺf5PT�P##%B8֩,|ۄӚmn~8ITIoQW_}3fKW-ncFX�7p:ta|7rUm;VEp5-0t\�;TjwYǘm(|IV'F864 #nY+-s'>^OP$+aZKJ(JuWuHqYt{]pe$Ɂ H*cYa:Zn[bKIrAޟϫƖN+_l9yl1PE3:0 !}PRPPݡ�dž)s\Y>IM'Cgc:fҥK- eZ.X$I,<ߟmYXeD4*AOV.cLyDBT8g�ƗL 'Bw:)Ёr]]q*JTB9;x3P 0xBMbU:48~jutk3g nym{6Wf6Ok1=ݎY{IWZeF;66qɚ= @159B$i\'C3ܪvg,NfCrqj~=L*A6}< IY B�HZVĴE=<-6 CYS=:kvȱJ$(@f m@g} +Aהku˩v;PT-yb`h0\g/Z-?~Y:z[pe9ڒ�GC<_$XdB͋ :`Lc&8 `0 3 BΊ$qkrhc*G>hs,2 5Q-Pڀ1r &! 8_[|\7ͻ' ~)8To^??qنanˣ[Qoܸqڵ][ }]<ŋϭ+HFZ&ZP2jLL!Z\rsm7hQҡ|Y;Tbװyp%xjQ ܚ SEM(si,+4M۲LqCo;k>y-LyR=1oTyZ"F18pRFZ eýCcy0~?Y-k9JK8uHDW*-0Lᗟ&3ǩiD,nVEHGbSOj였!.~��ub�t; _ mL p jf�τ+4X=EAhCC}d;v\1Ӯ#(]?<oL 9=oVMPC \W'mBYG L�3ĝrτ )JX&Ǥ[=<xP(50R.T#•)<#S�P[{$lQ&'ǣ\nSΡ"q6$gg8AH0p9g̦h@: p[l.R6;ph!s[jlqeiu)u7%0$\o8eAZ�0sHeDvg 7leJ$X,!♢QPZY}E"?d^Xk+pE5˲ժY)M8oX5r64ǞEsT-TG555A.5JMrt[ZVU+ml1-XmDV*E(Ktfr"{զ) r䈷sYx{6 RvEL7�% -̸`xyT8jAՔ:P((ė1#IYu]�6ww>ax}>4ݶV�<2/CZ H1M?P;d"i9WU< e&N eaYa~,\Zh˲J7~qrNW/j?}A|c-7:?e e`(Bp 6d_b\`b"#0%Djhhp]-@`8t�J)O;l@ƎY<gxةr<[|bbx�8xJi&}+Z>Ig*O,å䚄=jں&,K4A. udȐyB~ Nq7&J^dR7c' βԿ"5h,2nB;0`7Ī/a$L.wvTNBsq*rBwJLmw'( U4wyژo3?�6dC Ь׹sE򗖤(\VW2̌օ+?oD/P(^ig>Ps9\|X<#W)X YAjp6%ɠ92n<-5% ʪݻwիך5k䴠č/LBnĴZv$sRpw$67DiaRYJ@q=K�Ojz Ť*\MG�"y80"=zs*;r &-y8ܓXW)h?-m0잙XϒPIqFgH~DBƣ<x\7BT R ݑ!7Rqݧ ;A,jc?-^ hw(�y!هa3AR~'ϓ}rbոvM[P޹۹˹E'[ZB=Ŷ0"O<UYF``sBj|�_bvX)‘Q<7p^sqaZJML�_)al!&hrvQ s -7<JrDk%ItEYL0x,+&|r>. UBPT 0ކϋ:AhimJuBO:>%?7J֕[&R||2;$H6@c qT;Ȳ`1)&g6hME\NeY! $0#�[2Q YLf XjC{"02u rP-:)\Fu)z_$juvRS 97P)c&|@EK;oH0R0%5~IaZz[ZZ<݋$BB(Uv(Bs1OInG3aP*Rf^Pmz=+<UR<| RYi Q'$z`h*^e{>|Ȑ!q[K-` 9cl*A}3Hxu7[CIr|SM=ԥ?gw +wHF@b`D?DgqUg(׆ؿ+`ld&4eȳш i/|*V@#X�l Pg#Yf%u�xR̕g(8oFI2%nrA}'ޡ϶4:qЦ>l f"P!ft;5fb4K6]T##]BZs>exsTG q .[7A):Sx|5ļ~]H8N)ј(<?t@ E1[rJg K$F, 0 úw}ĈI,[Lk[~)x9x, G�ʇyQBԖ8q}eoF ÉQ�� �IDATcIRЙ" 2LJ[B, H}ET*2BuӾ1ςz`f`ӂJi$RgssI%Y c@gqr$qjB4 =~QS2?\bM.7z/7]r4$ zv^i[,!2 (E0 $1 (:O1U)ψ Ðn(\&UIT=slqH@401r* gE^9- +''5mvnhh%X# WjdUD@*68N"27@oKnܸ1x $NaFaMyܘXgDNUJ*bqPA#:k '6 =yJ,R2A HRj$Lup?DN!H# EDnחwz.6*�7)�p'ƁܴHC1l!�"$STzroi~f{, 4N~TpsooKDA HcJL"f15#d"n <8ʆyb|d_+ۗ$pm{fKcWPII N$<$4[Ms=o~{jw�lEZM*tͦ+}3-SIlٲO>YfMAQҚ؋lĿ,NC.M�ÂF\0W|kRgI$I2<qRm FQۤ4&�< 6\>EBPL糀>^4l1S?Bc{ ͢!Y*(6C ' gKQ三?P4D o!b\.wޅBze<Ogj9]=e~s7 ލw/-R>7Z .G+AE �#iE nY @{1&px�wPScS ]>, ŚredB)#8W -M�C.G\<C{-!T\ Իwov-ÐG/HEV@9nm ~B>L:t#[0}?槛|Ov,5:/Y~T^A0L0<* t^I`@X l ׹D1YeB@9X,E +lHq)&3 HD:!InsIjR`#X�h=U\+ejTKl*B Z[[9״�KȀ.X"UiqM]1WiN+U~/eպufw$Kw�zL &NA{h7AøI] �>$`GQ#<G�&,K %ѐ<+[xD{DIxq쒄bۏ=+W8)RU6Q$TLM!x40Tpnݦt׮[5)T7k'=ѦIֺ}jVhx/Yj x\bg-Ij _x^!NgݺEQI q#*+) NlfiNM4  ;k$ x\.'y&p^(+5)zƠO�β|% ȍ۶}; /SJĸ%<rc) )VМ-q2%G?>꾊7/ Mx0,۲Zݿ裏^͵u}QKKa, :7(RN. J -' @z/` BtX\7aO3~aT˘l#N@E-e8# ԈUHᢓ##t/ޯWKsU~%4p{ BNC!3ΪVmzCJ߽[[w붒\j1\xjoqrՅEʔ*ƾE{uPR4ˁ"bÎ_O5 E1]Фi :X!s#� <=p`>F$_#x\0|̲}>O瑣 ng 7|QbsWHO'/\jVY8ua9t&9Ss_[.]]t-[|QiDm1TGR.UPVIxΨ�A !<ƃrg'\CFhJ<�t8(?2햸6 XIp£,bRu_qiY7[L{媷U&#T}X2Y.%|F</qn(45G-"oB3[Lb9pNR̶4  C$l `蹗Y<xkxұ)v ܧաŞAC�KR4DL85̈pb r=/0u)|ϻu8Rc7i><i}Qe聰 E`#@?ta |ONudu˳[>vr#S~I~^>?g, |B>_Fe4�MAKL` qb8BڒK)�\$Ob�&FWkOVɲ߷u6lذRcmnoKr#Y89>p<| 2 aD$I^G'Ajua*:1ҟ/=eD@&59$iñ bz'yfWR5sC)G,#&bD$\BW$ h9,ܑØsJS#|$9VNǩ(Sjem0V*ohHڤE7BnHeNJ <[3"b= |rt1fw/mJh[h/(F;j }*~ j>l~MPms#(`L1Q#E"b!qQ03<㔸�_P?g4&0' C]'A$رc׬YS}@ۿѷT؈IfES.-[ncľr9yC1t[楆sUmzz-JWXF`nsaׂ3)0o +_'KCP4vʄ*"RSAD?M!sBW9kʅHW/Z[m0bøR&POį TTPE�?`I*Pyw C*[tI\8lWZ!) ʫT7% |9F : jCPƹGf돊NJG\SL}!떦$pxL!7JnDC ϯXg-J2u,}�z|hRRf!mM}',-Y$۲ʷ+'Vb?g6xD~)fۣxA47gW<>b7 Mo"OxٔEC  E:“r4 '� у}lrmjR[r%ma 840dyCRtPn-gg``<~a�o ۮ¤#@Y DP`?`-pXPb`�s΄k�3;3W(|XcQ ;q`,:ZqY>:l#ߋRl;`\MV<46?[?m4  M1L!aZ؜!SǘESCNT~b,kM n6ð%rQ0 t?ٷgFՈu PUu9D4I3LI!e`Tő2yȈ͑Á *CA=z$j B %S2H c)n>( )%/Ķ'YAps.l8-vi` g(٦g9K =e{KpcCTUn<O~N  Y%KsQF+vS/g֨| @2$?Gyżqrw6,A˱6wk.,i1cJS$GDSA* -C^)�A)HH!^mvxi\Vۭ& :(\@k=48j (ډ&[g70 #Uܵ9BEDz:i�r d`;x+c7VZŕb6\ xP +dYsϾAKir.B0xS<x*bpvF}&&tcmYւ\naV>ݎSm+[Tr;z?z!z?6Ll�לψ|#m3g8L0ˎ{%m`2qY6y0g4]!TZ 9rg5F~ 0&|8gELg9b wky\*Im liF[2x~|冊=/G^)Ar]bO7h]W9r< [=nNdr)XZ"]kjuL١~94jB&@rxs\4 Ci*C?nJzXi:�T2`O"媭D*(MNDFڃh"HMO_> EDsb0XKL}}qT+/*~Ẏ㨶𻒭bk!YW&6f4b(E`\/6\@&)NiS(ȴK^rY+:OfG oAq<>ōHr.Hab̺On0 i>SA娭Fк<JԻTIGkbO_RJ+v >C$Jx|�OPX'U~Aw`={={uR_ swP$D.�(#Jz}RjsެǢܚT-X- R<2|F8f X" M]<�92;Ykyz{oh lTBAmPZlRᔺU;5MF2$0!9.Ml $w >� �zD2H0ъr'u V '@Cۊƣ!V &B!UQQ �c 1 2@37S[Lg8BXHjø"84ifĥߗ9F<\ a+|.]4PWWwG{ɒ%6mZ:LR h7=0Eqy!.P|'(\Qw辶mapU&YBqYbWRCo.zH p*G r# T)fLt ÔÁH*"u`8SNސ܉%&N%Wb7]Yv!, "?)ra)s9]K\8 lRQ/AG :+\Si9C 08Rꗝ"s$T8`Ԟ( "48Hv.cKrY�<28埔-5O+]482?w^pR<M�~4sN"#T*of>_fM(SPy21K'F)+n`eJ{khQ:azU}zW<L0Ə?a„kZEN&aXPj f&IO*\_\yb>on)UR G(1(3\ו RZX% To@ O 8dN/Ui[<MX<8qd@EI2,)(.{$Jr`q=_.N̚k s>5j6@u ǛS"1J",@dTɺ 2�ds#e-M @{N.�ĕ^wO7hSXbflxX陌Vvd{ -L*/(n|rW'#~r:G W #jO<}-+q[K~=y{8GuԌ3/_{JP1Z.":J9I#/2#W[U)[<1GţC΂/ "nr\�3[N"'Wmq12k?*?|`Xȵ'Ěɘ8.O|jV, 7Ao-c pu]` �z}ר>y8m=,ڵ\Z,Z<)M0YAۅt)Ii[0r;Tq[ ok]n/GR^l !C 2P($IbN0d=(9-p-gie"( *FJ3Co-'5- gm~SPYO! իW{ ,3g믿|r F24dbX,l1c7D="!E#>u^z M &R͕g> Suwʝ=ؓ(Cxa*ˁ 'YZ &Dgq,ڏ CbLIzh*`JY5UtxC $$9$�"AFwn-^TIT(-LsGxP@ aDМ]1+% %@繓<]0+,xjbRϞ=GѣGzO?,KU46Pl;3Yhho6vgBۙF]xA;;]~2WzpO}$'l_\dIkmmΌ)U00 omp1VZSES.=s;7oXl*r܃W�3ۅG"\$(+Ҡc_"~ゐv5^!SyP/,kĴTp@T & ⠐c{ZRsR2ӕ<il]5jTp:0V7bxҢ8E�O! XpXYWQQ_*nSJGQp~R~k[DQ> }b7j c%Ibk;HCJ壏>r---m+GXXF $ `-g-<E1ךg- ? 82VNvZP 1|ͩVoiiY~}n{Bk: _t [Z* (WFʖ4}r&h3Vjaʨ.3fشiNPp2Z}Q Ԅ>q %8,^aH#d!wHH&y0ŕ/;%YTe`OsYM SqH?lLpB]=f.k52B7c�+ -)MDg:!% X\Qǭ7oBlZE]5nѾ 5* q!Z ,$S΀#b夐mܔ|T RzҸj TJ jfL^֙'7%03*s*f͂#Q + yvp�y {MĎюi]Y/n.ϮYWT*ZlK;@9iMk2 #pEU1} +ќR 9{M잶Y6W^TT,ˊFYb%,()`Σe3T7y01A.6@uO�|<�YB4..gxĚiНrA*p/bt9<H9T[u|Bx= JaRs1,a!y?-1d2  1<HF��,IDATa?]5'8!?Ym EmOuH4D(oD1pmFN+&WMeK;-SZO景oSxC7ܱQ> ZTeY\=N P~Ů{,+uZb-OkO,Ȍr}hB{ٍ9H(AH�Ss$UL>Fjv VyQ)o)N�č_+ <0/}e]}7ϙH)mz, I8]Z.$Y\Y OzgqLj÷J͊T^>,a4 EHF@t=Ef)%0{;O#Ai} mņ 1buyL KuE ;qEqVRʽ)#p02rf;6m�q9TĄ4\ -&cEǹsq&'r\nɇIbirP p Pq$[xr9xf6j Sl`d3po�ޣ"-F0"tb4#"|ϝlutz]*l./ՠ ׈V3W +AcpvI\1t h@O|mCS Ց2h<+4 c63('\s) 8�1ꂩEf"bEM,`8 sgIkmML4֢KwDZ2jM0ªHO1�l>1$a N!!s; Ӱ|+‹E@.7t>q)&pu9hߖ jRFC ;c͈u݉C0ȭ˅CԒaZikUz}͛B.AX^c rkÍh<;,{H5B'?a�H\*R4uu]�vI 6j`#87:V);FX.)w8.cTkpw; r[@ O9A mbAq-iʀa `q�`ba6 grK>Ԗ$ɠxV~I6գq垣K� 1(H誡%9:n%eǓdTb O gCHNGyQL]Dͩ|vJ#e-*Q8gnBlw]:MC,5[R3HK*gU$Idf;NL+Vgu0Fg9k!'Q:\jAW�咇Ju {wQS4 #4$`z=) E,s2D9g(B7Aʁ9i I13eeh|u2?380 Q[Lժ}sa;'=yvt,+OAھ;vrvyGk}J`.r {%N)5MsD 0mI:Q6`”7)!cSr[|#),SS3Hq$cqnnG݋EMpUǑ<PX.$~PS 3oB@W+;Ӝ8_WʀKN%2Eh͝kTGCC}NIъc�xs`X{2w4<Y <(RZ!V؅p,7;ˏK5F[7ݱ32 /5Ju4[Q+9pfFu+֨d.֠A/cTY׹͞|ad+[VY^ʞHlek+#F|ˉ_2^JVW[׶|elc} e^a2%y+~?|G0oWuRxݺ7^6{a.lǾ0(j9V\Nle+s9Vd+[Vle+[Vrle+[Ale+s9Vd+[Vle+[Vrle+[Vle+s9Vd+[V>xcB;,j%* xF)>7^{˲&O%~oʔ)gy/;sǸ9s{v kGz;ٖדO>;adOG%7ST۷w}w{Z0lkɒ%kvRq;ƷzR<{Vlek8[[['O} [VZVle.'[Vc-MryΜ9{R^PJ1o߾J…;)"Ohsm577O4I)5r^z)f͚x={JyMkO(<w])p߶>{&Mjnn{=P_}UiРz뭷VXѿN:I)yބ R.K/ g?bx<AtARjٲeӧOWJ}ٶmw\eСs]`ACCi&?_Eѡ{+,Y2c 7 !K7os=#k֬Y{GϞ=Rg}֫W#G*8~ꩧRGuR9s9묳^-Zd۶n;StҾ}1B)R{쮻?|A/8qbZ=. ~m9JիWJ38P((^5k 8cs)ޯ_?ٳ?nݺzbm(_vaqwu嗿+GVJ7}uԩ9s^xV^jժaÆy睛7onmm}wknݺm;vðuʔ)Çw'OyުU֭[7touCݸq?ASSܹs?m<q\裏{} 7DQktISN6mZZ]tiTknJ:mڴ\.w1ur%\"?I]ŋǏ /^|7n͚5R8p`$wuwyc۹kxVΝ;w„ ]vٲex]wݵaÆYf{r3f8ǏG vL8{3f̸ ?L>_<oŊ7no~߶!6lغu} 6o<o޼.tI\~N;t+M6uj|򦦦}[o-JobŊ?Ͼoڴ?>C|˗JٳgׯO>]vyx`ĉcǎUJJnM,iN8ɓ'Ϙ1R|a7pyb"=?<oڵ+V8R_T'Z3IgLSn%o.=zoccO,J<߮;<G /9sޖ.Kdܸqw}z̙^x!y曗\rֺT*xzZoGዔ|IɓJO?}ժU],[lԩ$9qkV~k_07mڤO+,\[Vvz뭷~_]ׯ_l)Gk}%88x{ܸq]{;-:uꡇ?KO?E;?{~hN>.$INz%<98Z-[,^/~џ}κuN=T>8/_xᅮ};}ĉG%č"~iٓO>[?s;ʦ rLenaZ_ݰaʕ+9}ܸq~5kv۹~WݭAtI�c6lO> ZbW_lw{tI^9^xqXy睷{1 㤓NkW>3.b5tPdsч~~뭷nfZn[8/>bŊwW^yew s~zi:nqN׵^{Ϝ9sR6fϞ}-|~{ɓ']wv&Nx]wۿM7ݴ͛z꩙3gΜ9'?V/F:k֬)S̙3W_ vu . 39s<s]vَ]}Guԏӧ<]tE XhQWp {VJYfɒ%®V?_-}=ҢZdf{߻/[y -RX?y…o:nqѾk=;#?qMۅ08k,uկnjֺ\./?>8z;m>ѣ~.\(7xe566^tErW_x嗓$vsSEѝwxꩧb18Ig}Vɖ-[^^~{G/tArmR<kll|衇d?^~\.k 3fLcc~+alSoGֵ^;o<c\sMccwc---r;&LH$|O?3ȟ0+oܸQ.^{G){/ˍujjj:xWWX!{?acc㥗^*{O?_6moΒLU-k~FnRߒ?oe>8[VVu;yWd+[VA+s9Vd+[VvXg Jleky+Ktq9-|f{-{FVC͢è2ibeE}Qf+[?n6z^oZ0j7J)cƌw/#/>o$I%<u+{VO&f.C)C)Ui=rO~kϵ gu[q>c^i>Vreٸd{ׯ!ӿy9?``l-VڵpgQPڸˇu?hСZ)lٲkםvw'dƾW'le+[+Sd:j/<Pvm7K}sL����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/editjmag14.png���������������������������������������������������������000644 �000765 �000000 �00000117335 11332127303 021047� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&�����mM���bKGD������ pHYs�� �� ����tIME 7Ja�� �IDATxy\uԾ%$’J2A?A2>s8pGTdDGL$N:}ꮮ}?zI:ѦTWU]>u B0r/qtC �{$iüsJI?k.AeơC>яڵ+,B}'?<}q8I?|w�dxxW߶ma\ey睟~;vPRcؾ} E1[U_i*c 5� 5ʗ�)"ź � j�vK""�(xR�x�e�`R]tܸP� M14U�� j.+�i*IV WJ�� J �`p YU5�vX e�@S$UbjRC7 / q-BQ s1Av W 5eP!Iʳ /5CH/ v !|AIS*~Q 7E]4C,CW B2IrM!U ! 4ErB:AbUe W 놱24ER zDՑl<nQwZ � b6}ō_Pe�@6$"ַq\ѣG^wu7Ǽ@TM=:7ݐh yG9xeFS L%sbﲆVGG!!7簎8zU_de}\Ul�ah'1(zdb&݁l<+{ McA93ɳT_'+x"rLXnk $72̪6.x3RCwd`eވW`d*ekC|X,U3#sFM *J-Ho811W!-a('A =2>g@6ׄ"C.dMgV/ܔoBbBYJ -H\j(Q 4)L/DΌ�n޹�婹E�$_ϖUdrhB] TMkAL"0ad$n1"%R" ^-H0*d U\�V:! ]\̖*:94jZ4r#<CF}fMH"S(/VadxH\+QQ/lA\ib> r!^2#c6Y+l 97Z/4c,vX9GOh>ɗE^�a: ŊOvӂD|ot/Cł.2!RC.mA:220 -HdjhJ^i%@8fUTmHBTs}K<˅εJD]<H}ORsssRD�xs̛;[i yN̊B>ӓ,MwܚFf2+E)=OM Vع!wE Mʢ9COt$ufb.aw2[I~'9rvސ>33LW]WDeÞx._i=1HS#sV %1.{֞\ΰՄ݆g2+̤ ؄ L\عx"u@R%Q!Or58>o'_i'Ls r7T}̄<&{y e).y&D,Mw\�Si {fRȤ`o[ Rȹc4Iu\E ;WU;7SWQOs!.2U!'}$ȮK๓#Vz<UFZSLMHwOR&sqeBL& n'9oBׄB.nC)Mt=Zc,uل{|6+7!NC ;9<kPϴ cszB �<ׄR ܶ)[ kuur[SbM^ij`,i btw@[U 'fsepK j]QBdhCBT.L$[C6Q ېt6Aw BnE3F! ,߄Ed'7Kl1S.0W _dP:7O΍?SEi$Q ;{=:9_OMdDb/Ӛ޽}J{|3#r&#tI^;.83],Kʊfskx4��$CnaMn~v6/Mfy݆@X6\(CuEWn)TDwZ^x"=i}lS3h"Q}._KpN74q <w|$ɳLWQm%]sbM;|.Kg {B.Hg&36Ղ.kk?3e/ۄ#X :11Wp1.wێ쏸>=pl,(VDsZBzL#0_ yl|CE#nxX6!r)$NȹY@2\n۱ȩ6D&d$+KjwsY7!�N.w$TA mO v[pgڐdPc>mmBNHRl>\֠~v*SkAnyy& .+9JTxE )J<]9,!}$/Kjws$tiAARub'y :Ć>5_؅bKC @=a'IRFlayy u4>ۆT;!Dl ҵ"i;t6N ېʋ!-豝KUcuedž2dT1^;rtք֗fŐ.@!,sr4%pL,\ )!/$2!Y2D@d}*لL͗9ܶC {ⴆl-قGD)#[c?>7!OKkMJw&sp.^x#%~۶_)70{Xt]􎍑O}!'P4D;o5_-L~8Ҟp@^[ieRtrBgq]ʮuQ$5Q׻sk>*3JV s]jr)h5|<fwXYR3ſt1ziLUpXX䪰SD*pa-U' Rmuڄ("NOgh8 }b5roY �L^٨ϖ49粸RǞMrJ1:W[6ӥFks3#.H9eb% .p>QƪYqr6$-toBdqXJr<w| w@&iN*ZqAr1$�)jWn]{\3!CP rQnNO&8;9&*r<[9-e,ل&\ ؒ1UC̚NnsYRBM حb,rUĩ\`ذמ)7ڐD&NOe(: }|)fr'sD] 4!|UY :;>�--&DZ*ꏺ:=eX+`/I+CNg$W/Cc{�IdkيV~`2' ij5o"- 6Xy&DjC& Cweb_bElNn $نdЄD\gBⴌϗK-ȉ4$5!!m ͛0dB" .]L%_Sb~›U͛%xvn�dJO>47q}_�4478iA� g��>}ӷnY~}V5� , vl S^pyLEnٲ<BB8n I^pwV%|U99Y@��e-DrBΕ�wwԕ-7('`m!Hovs/+ZuXX2Uj˻̮ lPB"dRM ZiTnh2ULkItv 6 ;ڈ�rpHꐵ$iq~ UolEVng]ɲ|lE/ԃNeҵl$I $Fl>9-l-ٲZ,3:WdcC̡H1tos9<v ,@t۫.6n +@N~6WWngJCE) rf%AtD.q jlN9gbM X>/:ܳpD/)Q$տ+Jʳm1*j҄ظX՝hD+nj&l6!lD.$J68HUm<kBaX*Q$D-V6Z 2órIΔB<& 6TRHXS{@d41_LkɔTr  ;UBt $Lm DȝK'^Bڪu}*]sXذGH3cɪ0GF8Vt;DeĵBt ,3k"wu@6v9d %K<K NH  ذGHR#<ۂ pH^+eAr`�xᇄ.x#o_tT^׿FNO?}9udE�4E|W|`$S֨oڙ:97o ||C;v_>bOzc^:\;>=iE�PA+'W@IV@��`�7p͎:>UU)I^eߺ*p̈$kT[iBOؼ^-ȐiKӣMyk%򍒨c󢢁˻yQgɢa'gLׅ25ɍQK. rr\^P昭Z72GS|YI䀝sZlRIQk'u;D=\AWYj2#I1b+h2SHrmȒņzm S|HjARlA.ntBdc*-q4:؄JB:9 mXY}n{Q4f`BJJ|!ц8HKu]d4Emefr,-HMO6u@HllXLH\M R|Iɔ吓T^k[ u\m%BV/@[1,ʹuېt uÄ>\aj]_hK DlZU}. @Re%U}vmeF hCe-YlC(s 階]MC` DBQA!UVSz:!cŐl]l8.bIWd 7 IV4૬,�[1Q(^h/֫WQ$OPׅ C;6�:2 �Neۯakc95l|Ԧr5$>u:έ}>nx|d6�uss_pu|W l-=7%faX^PJ�=r�Tun.9;or?���ҵl&=;)롁I/r_.oۼqzy<(/zxrFFJ]rS9Y]BdL^Ԡ tNecm(Q5^tYtM䕒uY"rrCABA2" n:檪ƸmLN6~N3@ :2WKz|L^-Z ,9S$mU% ]L^T8虼 @ZX+@u]ւ+Q3yZMH +:{cgjAlM@LA)K [cB' 2KSk.�ih(ނ Z9:iBbMRWe؂lp3y5ۂL!$+dYKVZ rJ/ ej)dڄ8'ZLHA)&\ !:!FU>@ gg j%r$mZ@L !VkCtAWA8Y Tô!,MN %HhB jz=Y@ixoBd6$܆xX rÄF"/3q.$ /tyxA)ZԵ�K #W Anr~f deV !"x^ dĄ%{�yoֽd27q[tvΛFn߳!ˣg?wpr'`D*"9$͍9XEY$i4W+H:�S*K 4�$ 6D$C` (-<rݽ}vk~&+Ur��@:<L UE7�ǐj$͑� 舦),^dKJQ1+#{rwK׍7 !ʫEdYI\jI2Ve!'r~DItxm73r5hV4fi8W*f,si(n &h (iؙE P#Y\7BvɼZWІ Siْpg/}>D15j MDry Bez8ӄxCfKkVD4K$'ɲbÄ@Z.@! ;zVu;GvV]U}%BϨ%-Н񜖭\kC( AʚaB2jQ4t9&@)2Ƌ YlBvކJvH& ؂0 hڄu ̖42ײU]`>j4U+@eMG\F+K Cj܄xhxa)dCδ!rH q-@FTUOubd22Ze $J合W쀄[%*/ LuŒdۖ@H8UPe / ^ 峒m&d2e~j$ۄL): 揧_rEMPC '󪤠&b�r4 '[tU׍E=�@Ѳ@q+>c9v=5\03kbw^jS%S>y@>>e󫟸a4w{mWxS9Toϟ/mĹ!Hр$�H��A M'?žU}}p[KÈd7s/'~]oS pcw'"U��@R]ṕu;jKjOjl6��Z �&dPtxyΕT !D'FUpNp64(! ᜑKp0e 0'dN% 2>a 0S2^SE#+" .)&p p4g442-# gRF g3.A`"߄$+F DY%iA6@NR`rEJ5-+Cvv)XGX27dn du'B ^6T}PĦ L5B)�Rr}8mBH��L N҂t 4Ϧ Q1.tL'Bv8mB : GsFND E\pdgNlBÙ!HWD&+ŐQXd55SUjݪېu^ 3!$d# nBUBz]p!" OU,ײ�(# vt՗�� �IDATQ@|2Ȗ @"x>k�3E$62F?,Q4 enBz\ ۣ"P: &$ xL,hax#颴g߻^�s'_=xxf3 M=o嘹l^js ;7h\rkIÉI9?ʲXۚ%-U=uNFHcxu|q%~Cϰs\!ք`8cF$Vǚ 筛z @5ԯM��ȪkRZj8pjg5_ɗŚh[W/$*Q}nnlҺaͰh$OhkD ѣJP 8Y4N E\f2 xuXɑ:$ xUX;d ,͡s9B5F^ù*ݥKR5XhΣHQ"xj"ϔ ѭ d5d Ukݺxji܀ 󔬁 Y4'%& qS%u@h Dې q&K(!;ڙd 1_o' q�*ɼ h稆PPuZcډ$U5!><%ˎfmY*@݀;"ڙLryP?2O[ټ2KU`g*q*M(:[ +,ErVZy*:!$Q&2!ŐFl,5 bgp"!!m@BxMtMȮvr@F~|9$'*DFlx`f)ڈ6Ԃl[ rOϊD ֭$ؙ6:@`5ni2WQe^B-@bvđ`�5^w-H,!Mm!H5"sK!,LYW7�t$,L|6Zg37꣇�j"Kv3L.[`,M҉陯<6苭��a��@�Bckg_G677��B!@!t� d2�!Aַ +H@h^:��B H�t�$_@Ȁl@lQ]Hoh<Bۮ$-1�+ ]Ǥ AG]vtCu+u ƫ4p} TUơ9@ bq �6{DeDBt`V d5.xCr*2 �*X)%t}~ !,Z@X\AhcB"�oT2H]=kJ mHМr[=}N\hHY&. 鲫Ɗ �=mKu8ӆؚBp$*ԄL⬠&D�L@cȔdhwsU Bp]D:V|)4Zd�K\ɱU`ItM~qq<�+gAxՀXVCc% Hn՟O:A YX++B2ҹ%Nu'3Bߥ(\jHV"S&$*8ׄw+GSBסb` *l`rRG 9i}Հ ׆/^ ;*J팱#M&$x�\hb z{c9}>Q,!_Kv#ޞ_h<x`\'^8�*_KS湞}`0߯( Pь~o2BG'#y7oi0 z#'_$<z֮8BZx'ڿ/@@BUrVdh¸'-ufRN@ex n))2Ƶ U{򉬕1]eim%i\t@洡@BY/TJbh¸_;t0:gHF@e)9@*W)0v'�u oiB4bvB,+J ‚lOA-$&[oB^w Cxđ_UI4 T N;ۂej9)&U?$W#tBBѨkD҄'^R&@`a f>| u\R%C6EvFિŬ2M2Oh[YԈ7L"-0pdzV^l�0U(meo Y/ &6 ƚ)^e g I#J BlgEL9r!=6 [<X(ECiA YbqIRScVTBBgo:4.ֆ u.)ӂ\Xmq,ӄ��&/)XVXe&wpF@(,i.)!%C^>;K+M_|`ZgW?3`p͚5ȹWiHg�@yHs,oF!Y5ΈM@R(7:+/B'vd! g"n ilvW^L94D"!a`SZc J]ޟt!HxX(+AT9IY=5 JkK00FI6qd%=..V pyƛ&ĸUy(md! kE&UgL9TDrwy_ b @U*lnnBHdi�ɪA~"ׄH*nAμDJirr(mBnt$kM &d̗%mhB名񜭮Z_kjA(h-&d| ⛐.iM:GLR(\PPB\ 4^(F|qĽ�: 'Ge -HdeYB(sͮʁy'VJ=[!u!eK;v@ Ԅʜ SMe@*F>I I'j&t&ť BjBCEKDi*Y -67xXtFk1d&@-ChmHBd !-¨$bi,u$r^S/ "~iMME+G꽖xZQ+f}�BSRPA( 3yR[m.drrP;V8 �4^-PPX f%'E'4*!Y8R_eEQjKp !uGv0jfdN ~khޣ!4t&!s a[X)uJb'j G/ Yk+dB躇i JŐ ;  .jABpJY�iAd]Im2Pr6 ABhC@lAj Ϸ A\œ(j T+F(Z~a mb _ QD u@&{e6J9[vP- =K sBŐ Z9ނ9Da)RYK vJ9[vRbYe)urJP=bBX�hڄJ|^,dMc/ YckB|l#M1m/ZrVN<Qp8Q3Rjݴ HYC,#y J0LHPYHm|1D/T5FklC9/ @N\ "-nIF:UTJK>oV|K7 r8Eq }<8~V]\E�lϋ>,ra�3"l�)V�VZ�`#e#N�[ 2Z��-G1Hkܐ��xhI D�/k�`u~D� ac�db�rn@Z�N>pZaѧ8,��>F_ gĉD1ĭBքiJ([mA�e0U��l&/_YӊN]AQX'd.@D �E lMVb3!CATՂĸxq-2>ׄ2b%�S{��a"2\ b%x RbO1 C6[S q ):mB6Z#OCChyi%TǗAYSm%{fBVR^r0CL Bn N[Qɫ"!U|ބximAB "3&DN5\AX߂m+i|" yB#-.eBTó2$sdxys]zw\ٳ_}xō8qtFQM.RڣkV�r,b8ovpX2t860ѯ0+ ABT*]^c###~nk,]� F8{]ںuBbPK4| p#Go~8ýfffJR)^~#pxp8p898{G]?~|V[a8{#'޽plٲ׿~.8{#lӦM?͏ϟ??::,B̏5\pfXO~;ѣS}??߿c=/|_Kpr/gnn�\q?77;vM7#ڵ 2~It=R)8{M#'u][I^{m__^bÙò~u߿ܹsxq8[\Gyn{{SV ؽ{7^bý8`Zۧ|Sz{ݽyZ cs=g~fu>px\j4Mo޼`0 �}mp83ïp8<rp8Gpxp8ᑃ�pxp8^}K4ɬn8ý2FN*:t~nrÇ%^#IEQr ^ý.qgXV9��e~?^#ý. (igp898#po(8uM ]ՁG{3q0o#L <rp8ܛ?MBySO}W9os8܊}#hF>:#T&ۿ+/~C"I/-я~tx)pv,˾#fm޼wcX?pv;E{ܫ]ΛJ />}/{ÏO|'~ ݻw޽\z_~_wz79D"/�h4jA@={كݻG}{1�>{q]VU�?@ |-?<o}kTV;ur}~x<=ɟ?3|Sƽݿ??l߾}g3;c˖-}}}�#G WͼcNw<yE$yKԏo;|衇V'o?�|ӟ1?U(m۶m۶޻m۶C~333+~[n{ޮ]:OTW|#ƽ[j��۶mg>ww:u;�p x#}�ڵ_[m* �p|ٸq㊛Uկ}k:tn뮻4M馛۷o߾o _�_Ⴓg~�8^yAd2F\.ܹfz]mjjJ￿� ՛a��4M_Fⓟb/|7E?}w~tM$AQ`4�@UUQ�z `֭\"җ455ooɼϟ?o7zwqGo+0* I|;o,ja ~>J6o0\}x<]+"̃.$]葁??Ve߾},^رm4t_A7h?;R��?rKNܳgٳgi~ų|`tt�3<0{'h4zw-j6m2n4D__u{3755uqM6#M[4Dp8p8��;w<p�Il<y W]u�dv߿ܜbٷoŝ;wG}?|_G7be�۷_{l'XkW_=55o߾g> ^7ȹ[:�pݻw۶moz;ߩiR\n�>)]c�zzz]_~y8�$�7o~׻u}C>#<}̙3g>ݶm/ؙfFl֭{2OyK_lذAQ{7$'|ϛ7hvgJ2777>>{n(&&&n{1OD<y 6��o}{1|;k׮?5! ϟ?z 0LV?.ߎ?l (i<p=^]y{^ǯVV}٧~rpoC{n �#[n7^RG;$wt7|ͯ}uawץa�GΫ.{?Rpǁ{18>O܌:Ν;:pEJRK$ _xpD=訮p#ý$i۶m+pxpmA#=nx p8Gp8ᑃpz|pap ^{-^Dý>#|E}EQ/B!MƎ=sG^� IҗeO~�q?�xG^xᅻ{�|о>rw]$7. /:ý5{Mr}B0;;~vjj3̏~]wݷ~333?Od2NQ8GΫЇ>N<YT<={vQ.O:ensáPԩSR /:ý5{M/xF}>_)o߾]Up kpx伞$O3 _ /1^Ͽ˱Z��e6n}/^^0tbv�zc0ڹsf7tz*9�b,EpfvgJ2777>>{n(8{]AQMx{ ~Oᑃp8<rp8Gpxp8ý\l x$ #uiK͓O>k.8?M7�~B^ufl$I8?}�pxp8~.XΉ'BNsթTjvv{雚֭353Lizz:˭]fM$tzNsgD0F^r^x[o{{/}39wO~={<o%{344|{{|-iϞ=۷}�� �IDAT{_ڳgσ>Bp8{/SA=ygt뭷~7?{or!qP(tu׍:uj֭bqffo�<nI3<STn6 Jҳ>kv͛78qbrrr~{j͹w\G8~pp]MADTb$&HbB LPhGc7kLTTPT@lH)ҏvps{@8??|~vggg533KHH8q+WoݺS:99O^m3O?T}Փ'O GDRy<jp[[_[[Ν;&LvF p8<@899q�$--0X\__ߧO։ҘLfqqR:t(ǻsmnn<uԚ5k ={vi[[+VTWW766 o 322?nccccc K@ h4B!JU ]K&YZZm6k׮XqDggGnݺjڴiebbbbbbtuuΜ9>rȟ9..`YΝ;` #!!!))ɓ'/^3gNZZʕ+Lfaa}o"""D"QEE)ݻwd2ݻw GGoܸqذaڹsٳg_zimm^&D"o߾p��މBrB~v5_~ʕEEE֭;wСCMWxiӦ޽aڵQQQ|MNNI&999r8-[P(+V8qǕ#]jnxxxcccLLmTTԴi޽{ΝO?̙3QQQMMM˗/x;v찲ڲeСC[y5kL>_~R5::nݺu a **2**jΜ9>[rvB#GO�|І5PXXǣP(۶mV(x*ʕ+ׯ_nݺj?;vlbHnݺZp}n!|�nݺSNYQo߾@\"qqqxBE`޴iX,~۷Ϛ5̬Y|9 �!gڵ"(&&fժU$i׮]wU=Qzsm߾I$BhіY%%%<! О}R[A�@ծ/#X,֘1cHy6k,___ǎw 2k֬!C\t)--ܦMHpE>}_|{͞=[n͞=uӧ駗.]~ڶm[{z� �ÅSN)C\)Ϟ=p۷o' #Gzjjjjttӧbq@@^UU5~Wp3fXvmCCC||qllv=}3fdffVUUyyykii%$$XdggZN<755ݳgӧOqyzz߿0((hڴiӧOoɓ'㏕񺺺 駟&LմWsZt�F000p8MMMo믜zTGGW^Ąb~Z P(\N744,++;{lttmۂzgBݶaH$2LTU +++qF$@8QUU˵.,,d'766},,,jkkE"~"JJJ BJQf͚C?VAeX&&&555 B-Hϧh"˭244lɓ$i֬Yp��I[[["dvppph�VvMLLg333zUF4ELMMMMMg[[[JHfbb`/`T[1xcs@��gd2Y[[&:`T6t?�|!g ,0"##{��9�������=LDn"Su\��9L(>yӧP!n� W|>_"Bi@C��N 9d2 �� t.@?I$v ��r46hϟ3L}}}(p��\.W!c<}B��B@  �� �����B���,GT c0x^~-_Z B$9.@ baa��BN[RSS'Lзo_gbbۻwikkk5V\_9;;tBQYYy%''6D.0!%%v;��JNN6mڤI8aÆWW+T'V {{277⦦&*ȑ#|>bѢEp8/_kBiii<6��w[`H<p�B… [nrttLII5kҥKqbX|ȑ;w5TOOo˖-ǎ_WXq¼<### +J0˗ޡ^ZtKUUm�{vw^||ԩS:sΒZhQBB¥Kݻw;;;ϟ?_KKK>v4iRNNξ}FqСq=z4==}ǎQQQ/^ ��!Ù<ymvܩeWSSSQQa}}իW;wLMMmx˖-�>rtYfiRX777Dh0��㻜QPlذ!lٲSNAa-jnn]\\.]jiiܬJe�w:u*D )**J+W>{lzz'O֮]zGWWw푑~~~SL4(]\\VX5/))Yr9s>B��rB'NT1cNNNWꪧwaXLRΝW,^800E3JmƍV!Dӯ^`0le|}}q;;;33#GjF ��ܐC$}||ԗիW^K<==--5T!D"Te-2߿?z��|T`5���r���@��� ���`"wH$555qI���BGM,gdd<z�� t"RT[[kggש_`0�r>CP E��t����w9�JHKB!T�FV0|BBj.�!�ɄBBo~^^9= Hֆr�x<^krL&. x�B{jllv�-̜9 @`2N9�]]]&(�F$t:�*ZZZt|ȩl `0 ͍,KWW�iiuuuL&ST677jiiUUUIR xr֮][\\P(^|IBǏ k>}۶mے%K�*Uףׂ ֬YbΞ=3y䜜*!ѣW^}իWs~SSSbÅBaZZqAABJ�ncƌQ=UKs<>(: 9oTZZ ௿zѢE嵵AAA+Wc0B�A*8q"22rd>{gϞ544 N8!z1Ϝ93}#G 4(**xԩd2ѣ񇑑رc3gСC�-ܺu0kkgffHnݺ^z!q`D"1??wƍd2yʕ֭[p!/�mo|04o޼$(9-M>}fffP�*88X, D |||VXWTT$H"""~嗘'>qDVV8�rrrpǥ7H$PJQ9r̙3۷?^&͛7o֭[cN<ԩSl6J�nΝ_vTTTQQÇ]]]['dX˖-g=T{h4ڥKT%{맧wAXիץK6666m*))qttk��j„ KTjpp޽ @|ӧe2ի!D"1B}AZZZꉭ�Z,T?{666C `"j���r���hI]1Hd0, �� t.CCC^�� t.B�{hll ]xB@�|jjj޽[[[ۅԁ�|2d2L9�B�I$GGGGGG( t���!��f5�@R9=@�hiLR]3_ !�B\.o{nQQ9= 7jnnnc\.d]۪mP9=O]]ݥK�h>B�r:B`XG�@dR(HE t<��lU(ɴ277oFJKK슋y[@PTTbtzUU�CUVV׫/Mc\.HP[WWP$`6r&N]]_~ŋoe7nHMM0aB}}=P޽ֶ={~z%KBsEGG?qqqQ]^zU6!!ak֬111x SUUEѠ�56|gD" Ɂʕ+CBB\]]<yRYYSqw%}Qr:tBH[[o0)))((hϞ=111ٯ^)d2 uttt:^憿ӧ>>>,ƍ!???.{}Fy3fz{Ɲ;w Offf}y!Cݸqc„ PtrNo8qB__!88xȐ!׮]۸qcttR|)BŋB<..nEEEd29""fffopgggw/rҥ/^ Ɓ !_[.***55ܹsn /_=qĘ1c7m @ H8wYf|ԩS'O!'!!B&J_~}ҥƍ۳g^;|Й3g]6w\e//={={?܎;oݻ!+;;O>iҤI'N駟;]]vvvvW\iR �n._?o޼/X~}+W<sLcc? !!iӦf*a;;X߿?88~!eee[nRO3k, bquuoׯ_^\\FFF-:|?R__EEE6m =z1�ݙL&-͘1C͛E"Ѷm۾;2o߾7n۫ŕ-\FCRǎၓM<RW#HW||<޼y٠ի;w޺uH$9nkʔ)g9P ]>}رc!qƵoԟϟ?%99>le6P\\ŋ xSQQm۶9`3g΄}gϟ?Ȁ:̌{ZDf(% 9R(SL2e _֦\~=88xL&sϞ=SLYzH$rss{Eiii2yI&߿ʔ)ӧOӧŋ7n"U<<<֮];h |W3dȐ˗N:�-[L/o߾ƒ6uݻwϟ?ʔ)Pt=455ٳgJfX555喖bX¢322 ;BҲ!doo_VV& q{300*//022*,,ljjrqqS*nnn 77=2(ݻ �*L&H$L[[Jx|ummCWWf*===˗/r9>{ܹs|>޼yPY]K[[["dB�r:r`"j��� nt��9D"Fd���r:ѣp>]��QP(mO �xZ@Ur��B�h>LVYYiddddd!@�t"Dbkk�����@@�h42[[TS9��D"(JK.r��@Ѕ/ܼy jBNOB$utt�x6*. 9V�;wH~��r:R466r�PPw���.'55UP%%%&&&HnnnCC{VVT*U-gmmsssff(..Gƌ0L�*UUUK \WW߫W/BQYY訯 @0h hsΝ9s5 \tttqqɓ',XSƍoܸ:{솆cH$ܹյ ={ ;_ܪ2\__;�]"66? [ Yڵkk֬ꫯrrrh4Ɔ"xiPrrr``렠>}$''~$3glnnv^booڔ/Diii &%%<x0&&ٳg9998?R(gϞe2l6/ ~aII/;pR:uj}}7pJ777ܸqcƌwٹs'`'� ]v̘1xWdSSӄ.:9s46̛7_~ٿ? 8p͛77nM322B'N'N9y)S͛JKKwODgg˗/gee<y2""b…o^n]TTTjjsnݺfCCCrott˗333I$ҦMU_m6?{?�tbxǎ;wnee%^xؓ'O@VVUծ>44b)STkgϞiooO$WZ%{9cƌ&$$ Uw0xڶm۶mN: H|||6oiccg.e˗g'VF" y!CH$id2ُ?xԩ�@:s̶ ;vիg}& [\x1BhÆ Pn|o|>BӧOw=j*<fIIIXXXAAz/ &gΜ OBuuuPlܹs?400ۺuѣnj"O>siӰ�� �IDATALYĉ/]1PPw+VH;v$%%1۵kWiiٳT*^5{lU0UJ]hQcc#D:{' #"" 4|𤤤w-ZT]]M <x}"JMXX<u@wzհvʕ?!۵k޽{׮]> ͞>}i|||ffo(bFYVV㜜܁N>>q+|r|kU]]=cƌ^z…ٹ)^x@7󘘘K,Rؐspw>>>~j/=:qD==~-;;wʕ cذayyyo3s3fڵ788fΜ9'OlhhZwPシ-[6n8---&Mt7oΙ3uD"p�Z֭S:::Gˋ0aBd3g mc}0 33Z###PT)RiII Qmmmcc@)JP(,//g2uuu ^z֊bW^QTcc㲲2]]]WOOB XYY bUm}}}UjX&3V@&{`�oMRy<[=LfUURT?{wr}9>u9mmmD"}uX,JU N}Bkkkg---Ub6 !ssh-Z]>}`�022Roo}P}P?{Qܣ���>I ��r:Bax���r:~ ���BοP(;�گ L�X&''w @�pRJ@�tnӧ@Z��� ������xӎ2"H \ޞ9X��BN#$#l}}G�e$I5@ pB���B·T*U3i*B!J�������B���Y!ʕ+.\9N||Ǐߘŋ/_Fǧ|<EYSSFɼSBBB||X,ng .\r`�e˖yyy/>vS>yٳgW^-^OQ.^999iiiq}ҥaaa�zﱖz]??Ҝy晘lT__ PfffBB˜1c.\ɓ'˿_`,YD*%%%11O?uww?sLIIɒ%KL@ ػwo^Νy5>00EOOАH$ݻwUNNN'NDݽ{755//#i4;oH$ �@9)))۶mKNN1bD|||~~~TTTtt4B f0! B6o믿m߾]GGGSRR***?J#LMMSRR<xuSN%%%͞=dm۶ 4sƍ"(00ʕ+?ѣG?~`~󡡡gϞU(,k666<x`aaaTTT;C֍˗/qe�@g,,,OޫWs577,k!aÆ=~8##Ç߱cȑ#d ye<ٳxq<<<_zb KK 444۵{޲e˴iӘLjf2!!!k֬066ꫯ~ᇐssgH[<{,%%=�l{n;ԩS۷rJ##;wt(I&uwwx"ѣY,˗cbbcr8ӧO_~=<<o133kqSSYfO>BG^~Q�.9aggggggoo__/^dXIN6mƌ,!###oݺɓkc gΜg͚V__oxׯaG�s5'FGGףFZn]|||{6>>~ΝM6:thΜ9ϟ?טQUƏͶ׏F=~!z3gK$lٲɓ'S(J!C7ަ?T�hZȱE=x߿Դ?߿/_nhhxҥȐ:^__jG133xbVVےݾ}[?po޼9..y#FPHMM<xD"2dHHHD*//nݺ{n3rHHS(L�� 4559$jPKD&rL&#$I** *o_T*8L&ϩT;{v+ `bSRRrssq !JU/. B\\2TeH T/!THPr9L T|>?>> �-Hd2Y\\\xxx{>H$,2 u2"HfL֘^jo+5j E"ZjQm{�n &/xO<=q4,,L__ƍPh��9}߿)7(.��@04���9���4 4W}}W4;*��!q8G@Q���N$˥Rǐ_---t��P((��߀��� ������x�`ZZZ;{rPp�dGH$+ 6x2~۹sf9=/hiiH555A9�9?ИiL<~x(�!B9�d2D<�<���rR/bdd矷СC�={dժ999׮]2dL&{Ilmm=Z[[rJD@3r6o޼uֈÇ[nMJJ�_mݺ_knz]Dp_u֭]|cǎٳ… S&LP__tR<ehh(L^jՖ-[\\\ԟ;v,-- Յ�L8q̘1n޼ /9rdLLLUUBヒػK*8qbӦM+V(..^jձcǼ'NܹsGǏGEE'$$,X@.C�ŋ?xFݻ/|ɉ'^~=x`zrnݺz竮.==<x̙3RRR\۷r fϞb YYY^^^ǏѹyR�lܸ1R;wMֺ79~~~Pn=T{D"ѰaD"B+++SS))ʀ޸ЈR(w��pAXb`4֦qҖ,Yrk׎9 �P޽]]]F(=r333ܟP$pLjJ"D"dcǎ-++χ�dbX4T*o߾|7d z!6mbbB !gbbBP8y䄄///N711a0k׮JN?xGNWWdŊ%999iii~~~N[z5 H&&&711q~~~-^=455ëWRcAAٳg{tD@p=�uxikkST׵#IyAeu-mmmD";rÇ?z:::NNNP���T:uȑ# ,ؽ{7B/��)!!t!+#"Mf��9L[[A[[�� t"RI)��� 9l�x?]8>�B�@=}ӧ mB�!�b1!@�h>\EZ B������B���ϳ@$B��1Zt#ˡ3;��"|io9UUU��D{sF"<<<lB߿?,��h4Hk>|9o9@ P���Bd2eUQQkhh"Aaam<slʠ��  ^zyzz)))i=NW*-B4���Fx=!���xOt:@ tqssCY[[#Z7v-'''uH${ʯ522kgb KK/== v1bĈ#tuu{JTiѱgU[;CQ(Pr)@,F:::, !T]][W`W^=2 v&f2=<^QQֶ3-Jsss)dbv;-SܠHĽdr{.8g$iSS rss aÆ1LRyuŲpwwɆbnݺ}%H\.`p8*ѣtX,NHHeff윙YRRyuT*o޼Zbeeꚝ]TT1BGGG.!6meepFt mmQF3ڳgBwwwcZU<xlOO{;vCCS(F|²@ݻwWUq&&&޿xxxqQQQ}}=B</)) _E&ۏL&555ݿ׋Vnnn~ToD4m̘1Ǐ]QPw=<<H$REKKgw999p8VVVl6Ν;BBddd 8ruuJKKp8৚YT#ood|:Rů^B @  <xoFB@D:ӑw98&&&޻woܸqx_LLL缽KJJ}}}(d2YWW痖~`8<zϟ'&&>}tرY__?11e:)ޤ>~WuOfhh߻woorrr=z駟LSSS\2}񦠠 11d)`x<;B_~�/g7UبgDWW7##C.w!;;o߾"!C;;W^UVVvë>}$&&R({{{|OPB=JLLLMMe282lu'&& F7+yyyΉD1cZ|5# q:tϻ "hZZZfzذaF"AOO)##YP$&&:99}LLLz Su:b2~~~O>UTG1Drwwh7nBII ~~d2U܎!Hd2X,A&-- QD% ϿqɓUb1BJ"+ \ϟ{;BP*޹s/)//>x@P(J jz\.'YD"NU+T* MzS(J|QWW׺㇇GfJFD"<$Fw3<9sfmmݻwrD"!{W7A$ubvvvd2y̘1ğBսX,H$FzP($8%; @<xpiiieeewد(==LT_=P&I$ "Ç?YMMM]]"`bbb}}=LՉ:;;[bzmO,|>_=D"㥥1#˽ m ocҥKAAA!USX%cǎ!7c 0~%{bw󂧧gQ3D\.W*Cm[P(SN-((hvʔ)gϞUo577ǟ+**xԩS\nbbbU#FvEԩS**H&_^^;R ^x1uԔ>FOIIQo;[AU)>lTTȐCєJD";\|J\ti>䓇r\2<aBtH͛ $ D"=Ǐ'!X,֠AΝ;f>}m9L=w\߾}wf>w$s1B/J?R$?g\]]^~*4ѣG wx?fffΝCsmR (JԢͭa@ 7ƹꊊȑJ"cիW}}ׯ\H$m`0J{iɵT hF===--- Òrss B}}46638 \]]KJJJ%>s\]]]D w.ijjUf``@&|>B ԯԫXPtDӵ3#???|sPWWs\mmW]NOOv痜lhh($T*ٴ3mmm.9BDdzX,---|Kz#kBhnn644׷mO :`0̨TjMM n)H$ .7\NP M*bCCCSSS :6O=9333}}}CN}}WpϙB|奫T*YU"2܌k"==޽{T/ |Qcc#>{n$"H{\n%MJJ>|8B޽{AL{qhJJ L&{A~^~]]]]YYֺd E\ȏ= 333B999θSRR�U\[[ۭB2ljj:#bSSS6]^^ޭBN]]Drss+..]qcEuu+B㥦nݻ#FhnnNKKG1vill477711X,wްa_SonnӧVC>]G=ydРA555Wu:5T* EMM ޵Bnnnϟ?oz;CmmjOa2p(jwZS?o߾'?7KH$jj}}={T^^ٿ cnxpV��6�&S +FdCennG"Hqqqd��0 wږ卍e\^[[۞l==֯`C0<�577*++;URicccccΔd2uk< 9m�G>7K&I$;[ժDCD"i;���mP( 92wxB@FOFRUL~D"tD"܎Xx5S{$J{zFTjssX,t|P>EPUFD"c7���>P�w&z-[:K޽w߽mm' nܸqm 6O< i}׮]P#& hx0 &6JDaP(""P(Tu5!t:?1[.aR)JU 򊷆DB>>> BIRP(d2ޚP(#g/qTT*h9 LDq@תAn( K,xTփd2B𬫫Sl!��:IDAT(@ux"O x.|mǎxRwhY%@ ]Nuu״i@;񑑑ȑ#-ή5jĉ[graaa^^^^^^-hv7|w^//#G28㽼|}}ooB;vصkך5kܹ#|}}&MQY0a͛7Ν:rƍlryRDFFdɒ%.]5kj9�z?o:uj*ooڵkaaaxUhhkQ<n8ooo<(Tzz… B|>ǎxz*㸪jРA^^^g~[(9O>yAff/iӦkcbb-[ƍCi~!CdfffffX t:=33˗xnʩS=z433?P9r̟~zzzy=~mݺuϟwuu4iҥKWZ ۷o^A'QQQ~~~p؀놆<PMhѢGomʔ)ǏOOO_xcǎH$|$%% ,XiӦEA kMlll^^^K,--8"Y~~~rr2n &FUV}Bh޼y3gğU}ظ\.`qqݻ=ڴi,Xb+W8]qq./_~wܩjG@�Bοrm<M{L5\x_BWB^NN0tPО={VXG%;vl[qǕJ%}Ler>.iiim'knnNNNW_W_͚5 _9O>suͪN[ذaÐ!CBx'BYYYvz`�Cnn/o3hР3gΨ/vZdd$J۷/|ŨaHHH~~>H|YDDr˃⩣ۘ>;v@P6lXVV޽{Buuuo\llllkk5kօ H$B&;wH.\w^\7ƏǏ#@l6{РA8|>ϲfhhh?,--xₗ?!WOٿ$|466 ۷!$J=<<:Ѭ* Xtmr@@joDX,ꫯB}:ƍ۷X,˖-icƌŁxZ[[[,S(˗#탂B#GT==/l6Bh͚51۬[gdɒ%xqOܹspvpSS//1bBhԩOV^ 衆 2rHX<ydGGGВ%K BHOOOt:]KKK57|-ui2w\ /Hb.J==={mzzztsh T!3r億ݻww6TjffX,۷{ KO<wJfee ~AFIF|~-f?߹Gݹsgmo32>ިh0`;̤P()>.s,kժUP �ԩS{Q!#y{{wā@WWWJ�GhĈLfee5k,>Pȡhm<],8#,gdĉm@F #gW(#T*;'d!'===##Sڨ1y%d[e$332ҭ2VJGG=7r{}%FʒJNNN=:#D"ьbgg瞞\H =7#yyy@32U-}�.Y!D"i4LV*==#x[\VрcgL&CtP(V#8t���a���9��� ����r���@���!������B����!������r��� 9xЀј jۛG& GgLPHRH$P#P#P#oT*5FpFa 9ϟ?<bXTjLFrss!#'# "//2ҭ2 Đӷon5G{hRgJfff}BFIFBaGl>3UF|9%%%5���|�E����B���9�������r���@��� ������@���!�������B��� 摤I$LٱHH$ͨU#\ڹ!Ӻ:"ՌͨfԈRԌQ(g!d~بP(r9ddD.kFFd2BihhФ(JH# ԴCN>}`nh)ں[F`S�� ������B����!������r���@���!������B���9�������#IS(:ޣ3';"ɚH rJJJBaOA$AFUFbd!Q*D32"J!#Bvbȡh GBx2 22K$d3"D"QHܻ6mggף+FbT3BR%X,td2P>|>_2P(x<^L��G���B���9����������@ B.4 B��P(ޙ B��'ߙ!��{"ol1ST]]mll!��{JDT)..6lX=���t.[RRbjjg9r���2D"ZkjjDVVVo\ڻ&?y$$" D+[B5-mճ*T jjMKǶ?ӞNz/ֈC  MHBcor4" Kdg/���CEQC6q냃L2L^pBp8DFFFD1ܿ0'IdRR҃v5Dș1cH$)d2DR) D('39Ndԩ~x"C ^xeeH$ţ9|>3a‰˅ !Irȅ|>nx>l6;55u]���px8w>(���  <;;{M ���xD6 A N>->���Y, 222 ���Cv,22r$+1bm``tB9��@:bd?g||՘Lfv\. J��`bX$Xށcɒ%C* ay<��hLfpp02ʗ9CŲ---P���<D"HҲ=wbdnIw(z# ��p8jA aA<I 79Θ1cazr) F��~zRRW/CH$ota<~!gCtT'��Ƌh9sh"pX, 8HCAAA$Im7$ ��DA7qpap8ƮjD!G((j(U_!���<A8NEQ6m, 9b8��&w(n(*B! 1v8G$9NJ$��c;P(d2>`VNssdJHH 1��g\Ьr ܹs5MeeB Έ���`v.\2lҥcʡ͞={ٵaڴil6;&&j��&1WSS#""Qi6|A_NO/rR) ��L2bhZ&>SJIȡ$YSS`0p x��`rZmmmmmmAH$xX<F5ҡ c…Nl6wuuuvvFEEAm�eoܸp8bbbN*HG7 ðd޽ɦݻ��eT <ZZZ EhhhDD8!BlC?VZEX,Dr�`Ɗb|hCQf?4GxTJQHfvÒc��`$m˰}5 ˫}dV���/!`0|wPF���|eѢESL"DEE-Z ��OЏ`<r 9t^R(#���>aX'i���9���IL`0L'U3vqhCz!b  .' 8`DAEѠ tVf5ru?yN_ 묷ðsfsvWfXxիW$#|5{8^]]f*:::>>B~f<]199 T.kI̚5+`kt:'���@���!������BO?~\T^paT[*J0i|Jh4z-///W*GpJtB=<hMөT*7onݪT*y駟z* qR !T}i4~bjZF㇣'O>ĉ&++b jh4޹sGET#G8p`h4wy~F޽{;vT{-ZHhZ9jFqv'f\._|9I?L&+,,ܿll=td ?L&/bxL$IvuuF>Omiiݸqg$?裸 >bR5k ?$> ..N.OQԹsbccry\\܉'(ɹ}6 gZֳg}s KJJWZ%Jkkk/]䩑{ o($˗r\LEQ/^vر wMsݻws\Pb֭[WWWgp̼tRee5kn7Zr ] Ze```T[8j B=gΜm۶m߾^m߾}_}աCJJJ|x0 s.kϞ=|Çz}TT̙3=***rrrV^_̙3**11A7ntuu( ^_XXxС"(rn7ǣo8AAABӵk6lذrJ^u;vYԩSMMM}}}˖-{333zmO< !g̙fN555^;[lZaիWZ ~]vmٲ%//hoot�"z!5U*UBBظWuww?h[өO(qSO-[͛eee8t:<!Mc744vD�NLLM"HRr?&!U*J okkߡd]II5I]EEck!!!o=+끃W322ٳg՞zH$rJUUUQQQ^^ڵk{=riii?ѣiiinڸqo _tĉÇ[^2cƌ^zbh4^zSO:�R2/((ʺvf@...tz^PxSueAfΜYVV^__?}t(}Ԑ+W  ՙ#G㏹cǎ577755%%%Aj:)))$$dɒ%Zm0tr ̼uZ<K={\.$IjB)fSշo.--ݵk׺uPz*{]`AJJ rxxxjj^WէN,,,hjj*--jj~۳gϴiӠǦMH,**(*>>>??_Tzj$--`0ꆆyI+Wܹ_<|vvvhhŋFZ>{h<p@TT*&w\8[,9&f 3@v34/2ccc\./r۷7449s^KJJ۹sgBBjU(/D2rӦM#uwwDFFNU`2SpbR)yK$\6sϭZ*,,ݻoVHHH|||FF7Zm__߬Y&\DŽ(aE $fj%!!d2k׮_AV_XXajMIIYbErrd2L3< Ȓ%K\.W[[Je{{db0999Vh{zz CDDD�vlv:oΜ9AAAt$&&8p5"mۖϢ(j4M&SZZZAAAHHȼyՂ҆Ď$Jƫp Iq!&:<Q p8|>p<«onnX,(KN:e˖?pCnYPPݭRFW\INN|>lIٳ]]]ׯ(1!z CyyY0yrvgIMM|>|Oo;pȯzoz /@{ljBc��6Y=B` B#6Lٷof4qY`AIIO?ҥK׮]÷��& #O瓡s|Ŋ^Kd2L&+���0I������ui4|e-//okk|VUVq5rV;h:BN]]]MMNb EW0-y~ɉ2s^#\pAb ]5PLZ0~r���L>|>oh���xB �����`rpP���פru8Q(&���F!B�7di;ebm��𸪴p O4TA }y}yv�@w`Q.+|6n3o叵y__[vGτ&B��@7<rde6&`q0A_}ѫYl>kFNܒ.u0Su���?Q22lCMH$HqN+KG w9xP�� rtӤ᝭.OTD"(}r63[pmwDu���9׻˪G2l6JC700xg?F)�� 62F>iɿUBb!"N`����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/editjmag14ds9.png������������������������������������������������������000644 �000765 �000000 �00000531147 11332127303 021470� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME ɲnS�� �IDATxwUO9LOwON0Ca *"(:QL@\QPEQ@ 09tO+-eg9ou UU{�Ab<;%5Myl#B.kpp0fwuWIII^^W\A�G߯z-"dums8] /,\a+ϗ$Iۣ<t[?00#]s5z bз0|(I_n%Rw`D|[⩬l0Px q�*l ��TxeY):)&a6$M<k?t}n5I0vZdE &"0 Uytj_UToc9!Zʹ&1C ]Cה{;%I)8i&aV#CEb.{WPqU-]UeyX*P,e<w ИroK1.+/HDbF?Pv2O?$JrǞp4  %H+r;} pgPUԲg80n  4Მ{ac+ /PDOUh"c1R?EQ3x2Oo $r۞aD[ {#wPQg4Ig< Hp5N0γHFf}QGt&LI' c��e衍)"B$ܶ(,k?`oٞxŋ|>${he CL6 cfҁaS <їJ%'9$%n4+ʣcPJ*�Y(tr·+zx4 N& ?aD{Lzl7JN*w6$Q>P(q[ 6 Sb¡ξ1Ss{_*Xl<НH$Ɣ:zHIpH Wtҩ2gぞd"1KpaDUgۺ3R{c[O2\w'OTy;P(o%X&&QBB~Vy͚I}"QSl D"L$AHDPD8>K=Db|/ pth8dQ *[t:5TONw;OTx`0qYpC"h'2х%'OTY‘NSI`ЈUd-uZ:|Zkƕ[Xq!l4+BoVlө ed"9R(^1 Hy/0CF:zL6SShv5a -=pTI'D,h#Lf*���C� }KK˄ XՎUU{(w, kN:B~QQQ,1Hݘ~(ͰbuCK� �`p ( �ӊ INd,4nqEU>J(yt4gy8>4ljrnHXihei�u.n4 M40dgK� O@, /Žl=l1; $6}\}8*h eXKsPe%I/d3Ey_)|Zug(4hw/HKXm0Y .7& Pb?M`5_(:=ز''*=q䰚u Yhb¦-Ch|/ EyLYil Y Ĩħ/ںI t s4$( E3%n; m.vwh.(5D$yv6n9dq6~*H2+TX7(̳TsOb FVQ:Y^*q`$]oC1vR5`)m> GTjd T+ͷN˞AM~)!0%2|E3I}ÉlQ]7،qE#Pd¨Ʈ`]$7Np? Mdy0}N]M ɣp:ϖzO>&��Mm#Zϫ=( 9ܸ곉ey;a>k?WZsexĴߏx+mM{(9i50 %z5{ln+Ah'Mvsjr`aGѸIS*MI.r/YZ倪"Jyӹcz|8 W6?ӗFU�hYNxl59ˑl=]a*ɷ8Vt&8QZ#)~8- uD8TqeWg@enLUru(DR|ʊJ_(]4(˳Ѕ.KCGb K-{,L++"b ð@m3ۍB6#YVtXAZ~(Ζ*^nMg&2UPpZyI &hY"=h/ #HgPe8L6a'ah3r1m s0z_On-{Bz,큄^k(\"jpi4ȦB,:&(q[}QB=h6* lY^g$[ ΐ@-= C<־`*^k"+ĘRnpZ {Ú]a<΁ ^k8\"*PpaQ.74DzS!c24_U` /)3R$q?<󮎐@[F)XB+UXYq ʔmH>Np0|ΌJm,Gtkkk%/| !mh)5A<a-5F3 ȬEv0 ^͍�7w_2S�v�Imnok|oO,#drbH A|rV|76Ze7^tʁ')$'.:]V8 [hlӞb'}B`OOɗSd\n'yno ۨIDV%8MR+/*I^a8Q.77.sVS=*c'M4Kh"JR |a&&Z !`Gy͜2NE`;H:dKE'M12@'BKLˈh/gl&ɗa0:⏲є0HC1m�n'6DM} #Emt@JRSg %`J Q^3/_(]0$KX LOZ2q54"ْ<#MDf_"B{(IeM c-4cOm&} #{l(&_%pJU@}Cm f_b \V5 4bYibe(\u9˫H8@X/0KV4vgҬ2p?g(SoD`?oɗ0a_bCUzLu v@M&\V5R!, 1„P]`f?)rHk%Fa&[{)V\fHSdI0`)u1i%\j 4{Ρ +  -ZWM )}Rɟ'|\#?ѓ^SFclk lk:8 L&wӯyb,+M[LQh�` .9)w hF=ybͤ_uF6 Mt kkJ[w󭴯#b2p J))E�8iTD&T3%O϶Θ =ө$MgN-/G9N*5*RgO)lor*ʛ3d* a0qî< u 1 WM~Fi&?/3be!+ﲐv3$9F Sa2KGK1h1|B`s1xhdeL*122dyyli8)B0V#a3`C Un~Vi�bsL T˳4v38;FԜ2KWK2(1qkPf$( 0YNS` `B(vЊ ap:40< ѴX2p"菲N3i$aCђ<%pX O)tdV6X%=V C!&0l`EL053L`2\S` PU�wYp!FU^~i&Lq!h^a"M9̠0R梛6YmHsJ ƻ$! EvUϰ<6ĥYkf8_h f4g&چE&zê~\i()Bi-a&BI'e�/GĞ\Daj #Yiz.ysiLCΧae~~�xSgs &m@@ O$z[þɅdtSQNT'`4-8|oj!P(K$qkOWͽX_&);.u)'`"T_|CUEv1}ҸB7Fp `ی?m �@@?r C;󪽆P$ƱL(0[@}è�PDp&{#B4+;VR{ÈY h G`(7 hR dPZ VVa‘<bO?×]YIP@ uzmxcPx\!'�h|p'}1!/=ny1dlc�M*aT{ <")2c4$,CSJ?fP"i0!ym8@!H6|_Ex|;+иBzO?ˊ*DŽpF.tࢢvGsЦAGj/˨�XL72F{`'敾2aF iI'v4a1^iED2@Bp :@>? bzAa^?ˈ2HH\hetsѦCރU$0Mv8#;E<fC<!7>%nFP@jҼZGV OHgTbޝThlը sC i8%q@]aBn ?ON)1yXAn폵_s_DܤCr;M` jDЇ!YVeE=b軧<֥ۻ|�~fz\�l_sz[!XU(5Ҹ( K Νѩdii J<�@*���EQQKUBY`@eP<}rmu$t~s,RUíMNGF8SbpܺS{�Iʊrj`0R6eۮ&s`�Q ((PgPV-! b(da(.!̓""<cZY'3Lba)�>LVdo@P�pSRJF=,a$\`=(wDN*P$3j U=&B#~"+2,*TjSrQ+0+\`ii41 >DVd_@@QbrUN8ͫRdQj I.gBфY="Y T8( gR;"MF |'B+|`XUV^544N&l@D`'pZ�Rh1j I.2 Z=~G""tqFJ+%V@PgDva; (Xz mp[HU3J8Q}1k$4m+lP $8pVRh n Jy8߄6}[=19 cRb!KFa@0'uWd)GQKyDG9S.xir �� >)恇dwx[pZ 9cc Xϗ$cJGt)�NjCGȘށt5<Gwa]dLS!ˋ[:ik>=0sa/&8t -a(gX7/!OEJ(�du N!jh A 1&}[ ds E (*1PtFUI+m?46O 1P8V�'C5A$ )Qa.(.u0 eiJEf!p[XqP!`Y퉫YRigA88QK-�@pGDu #ZC;*\eS5aN5ZaQR$0 Ȣ'SPQGAFjd@kX1kVjF&@XP�qf `=hDBkb CcT $8hS p8[@1B49VbQ@6"Ze BDP[XQmCҗP3a<Q-�GC& F'r246OA8 j*UơְzEKJ 8hldHVVRj "05XIN"pȀF;@RjV4dфaǨUV婁o>Zf ;j2aO>IF6o��}rٓ*GƜCKzg{(+�j˦V{WSO.9c|=c9Ǘ孼,|舨2Ve d+xUe 0F%nJV(&qQAAqؑ0B7em7JΓ`LHb8*./.UY$I~/&iԧTLd*ŕ^ޮF�GpE(!X�03p2-@]1UTd#8 qR $Q{((^%Lq-Q''"Ti<2EܴC'09V:㘤qN)B2b#61E \h%  ![q+A(-1BHcq.1 f)ѨGpX-4Jm1\<Dx'ߗ$RTa<2EܴB'И⢥8.)`o &H`M0H LB8be+t0�@?=x"0b,\l9  vRQ;aZlZ XJ-BGH>-aGIDqR&,o &q"+*e`E8be;t1Uc|!X ؅ eb(P Hو+=q ԒoNdCOaI.3 "y[~xODFV1",1J�8be't1E|s ,a"(ʐ?X ٌ+q @Y8p0'u<;{p�Iw~_6rׇ67=763'isf^؇܋NIgϚPU8Nضm[&ɔ k3, @iU85QReaۓRᰄ8 G RnKP&L0GY237)6r 1 ڕ$͘Tf*{"FQ*\_eĥE4b4!7Mp(6h#*WY(3I*(5q1h!y$ÅUY8 [aENP,t%loĈ#JϐXK zRb!HDIJRR#8|IyLTaE "r4@ rDZ@ Y<,qQV1j +Fa<)ҊI&a6(+GfzҤ@%F.!`Q-40 |iAt NPk%\ea?u�� �IDAT4�ą8,)ENV@wʵFQ)f@! dy4OjW`RY4)PKXE < 4aEAlVO>3dO 'S?6{k6L$"˗\r6GQ>}: k?Yqt@&?NSL<XY2Mܒ01Mb&Q<4ז�yiv%b^@1 Er' V\̧Q3*kQx)֟%VH3ib|a+MqA1?fC=iUX#<$+0[a1HҲ lc^YE$"}'DFI+d>!ڙmG b&*))f`ؾ4(h4nUԓ`фIno D\GTfB RyOrk`|;(@�Af"!4'9 V;R.QޜAːY -9C�4 +.6ō&LʧƘ&Jӂ L"<Q|Y* | a`&Dŵ%i4;q/YV Or8+a=mgɌLRDYMPӴ줸?~x>i ;t5; G9Gd݌NP�Td5$DGrɤ }Y gX̘L`ø @0OyJddDΌقfT̘qXqcX@Ht�tgLv3bgL!c"dr"QAc&,%H_֘wPو02` ) a T)`d1, )](ߕ1c!2~Ƙr*@VD HCΘlgDŎBd1F^EJOǿ6EdJRެщ,ufTt`lO֤p!` ) /AԄYV:f3*XP+cF Cd!#aT<S,I/!03c&Ed}R*11Jx ɔ=Yg)D̘ ެIV"25"^A'"*)1pɄ VΘ`UOr*p?kR;3&+ƛP#c&`9#mNEr ɴ=YciDLUoUL>TG?]�oEQ��$avDTN�` VFU Y�īB8,*$0 ) A*ɼn/r �Ò²   Q DQTeU$F AA!) C TAA H% ;JaHA "9a�QXTD=DF">Va0UAA $^A~0$V٪ }R㓰(J͠M{j"1L\k,"㪪ʲ裏.c-[uYutttt }ќ9s2͛%IBs_ .@/ \RPPpri*es\سgOooUUAHGGGGyCrttttt_Бz눝\rɚ5kO~I'?ݻw>z믿.I>K.�f͚:kܸq#IݺusΨQ�� _~%�?e˖>Ο??//gt: sNj6?!;WR?#m{„ gqƏiӦ믿/صk�zG|O=?]v}s̩ѣVZUTTt9B޼ys{{Eݻu+azkڅ�(j…�{TTTSvO=TUUg=W_}Aw#,ɫbqwѪw=x/h!HT__駟닋IW^7UUUA ٳg)8p@_\H;lڴ>W2ANTU5<߿? C(*w.(Z:|> 7P[?=j_|nfQfma| 6sܱcG}}jjkk[pa4ѣ=* 6,_�_G"niiaY۳gOUUO?oذoUUU---Z|}ݷdɒܝϯ^z$6s;::R__ú%O9SL9sx㏯Y&]p$,{ws9EFٳiֶ曅 .^X$_wu�GyOɍ?zSN|O>c=z7|skk$Isν:ɓ'?c]w{챗^ziǎFq'�`޼y0 yO>>{ 7X,L&˲_|ɯ,>arKKK,wޢEpyvpH+Bkkk~~p 2eKKK~8\ҥKoᆙ3g}<ϳ,{{7oiawVZZ /.w޽&L_BQH3 =wܙ3g=S`0yZZjĉW~W(,,|gcEQ|^u W\f``e]vM7!RWWa�_~ 4l6`P(W_=|rey{yM~%%%k׮e櫯:$Q]xq,K-[>ӧOA?Yf͚5k~IFAo2;w(O?b9P]n]4-))|۶mcǎO>N9sit:|͏?`0o۶ �p's=ځo~5k֬X{oowa0AشiӶmI&m۶mٲe4Ma٬mmm^zdJRׯ?MV\\ꫯnܸGo!6455mٲeϞ=t˲׮[^p_~y(:3Olٲe˖D"q9L6^�@&(j˭:x� bDQI8K&N3 +Wow]__8p7 Ƽc Zږ-[G}u<cus9G}tҤI6lذaߺuk*+WZ믯Yfٲe>'|rL'P(NF#a,ˊ("˲eeeMMMT꘺fϞ}/]c֭]tт /;o֭]w]*K_x;{3g?y嗷mV[[;<<{]tEغuW^裏vwwoٲ塇ڸq?Y;vΝsϒ%Kywy3$)Z, P-**Zr￿qŋ/]4`}~G[lnf3l۶mTS۷o߲eKWWׄ 2%O[x~?qhT{ذa-rw644>`̘1.k+Vo,޽{sN(.�[p%K?zǎ# l�? vسgO شiĉ矿}_~zgr}VU۷'ݻwfI._'Кh4nܸqofMMO?Hcc-[s555[n---o~s}͛^yw|:4Z[[޾}O8o!h{ꪪMk f̘qDVzwz!qΝvt]4 pXb~k׾fniiI"=oӺx6iE{x;vOHO&_駟ve˖͛7?txkV]]tү?{oʕ?59qgy78oK,q:Z?�\dɏ&u'=xwk</[o^{l޼ywuס"GE6m}<Ss:~5\~orgzK.moo饗nƲ%K;2$I.Y$yǏ;8qhhhк4:;;~;N:\X;Ν �x' Acǎ;kZtbv۱6#a̙5557t0f:VtԨQӧO?&Mq;mhwql2G5j̙3̙3eʔcʽp},O˦MvY__;,X`a}} ,ZSN:u)֮YX2SL4iұu {1<//oر=ղ?5k<3555 ywz'|3Ak׮GۼsM6}555&MEP[zW_}�kvwg=k, NmH}}6Ty .|H7o|q<vziT'>#V+A---<@6=CP0 (vz#P5LtS~G0 馛r; A&Ly{x<O<?~W^o曧O~\h4֖!&l${z$I(kڵk… ,83!`0d, V5j3ˬ!a˖`0XSSCQEQv]`0x-~ZGkYYٔ)Sl60[hq7F뮻ى#gyg?={~8BT*e2rfð`0NM&ϑNJ=z={xZ^/;CA[[ϗFp8L&ퟜI'={vccn�]> y晷v'|EzVu588;cƌٳgϞ=tΝ.�D"pf„ խ�&LPTTs҂f͚+<c'wߝJN:7|'u: vj}7{COW^-n?>O9v.7.TVVVWWg6ꪪ믿~�zpK.>w}7o^dɓJQ W^/>C#/#vinɤB_ <�o] -'xbII6mĉi٘1cD{'暪ϟ?_=aV(i3O>d}fY,Yr'0w ~�L<j\. ð6O6Fq̙vҦ�n&ǵ*~뭷ƍ~+V,^SO]jڵkpw\uuuNo`555/?c�?o޼s}嗋{W^y/ܸq}ݧ̘1駟~>y]uU#T/ �-Zt}i>sM237n… A�W7n\]]ݘ1c.m>Eyyy]]]aaa$kjj4dY7޸ϟ�=nܸn㸻 �N:3?~<�` m& UWW�f͚r/++ӆ/^\RRM$�`ݺu#x<uuuZ@9̘1Cy%^x!wukWsyUWWk"I|e˖p WްaC]]]~~U/_O>vP矹%:wEoܸ1ο͹*anW~4qNؾ};0ZN/رcǍ7駟Ο?ᇺKSRRrg`ƍ,ϙ3g7tοg_u"'LVZ?rtt\~6h4j׸KΝ; :ڵ똆!ű٬±Crttttt8l@6::::::?L6=t!B6mHGGGGx!d2ǴBshX.pꥣs^zdw$2eH~_A9C0^Ƭ/=!症X,EKoVC/UU B#<Ad~՞p8G.^xም]wݳ>_ꬳK3Ϡ(z5��$IV�,Z(//o* W^yem۶}Ƿzk0̭_]]}%oVB<3O>!/R2̭y|ٳg|}ݷw޿ǩSΙ3g�\p'OU7s�`ڵ�hͲ˵nVg}'9�d2#!R魷Ҷ'M4w_|nAwLR/vөR޽XɕHrV\y7viYʕ+C<3{B΢EWX裏^q+V/N8k +��ݻwѢE>k|+W{Mf׬Ylٲ'|uѢE/ɓ�/p8r!+رcGAA'-nܸ{miiYrc=VYYvzGyd͚57nk_{ꫯ>}]w[neժU/b߿|򫯾n[x_^YY? A۷ڵfrYfwyWϮ[.N!_ܱcLJ~H(J (8(0 CWZ? ð,��A4cIrm A0 ksE HKSQm\m$IAh ,k鈢 He, ,#IҾ6mڞ={$I$ a4i;5KQ Y=SO9CGjkku_:&:G:F5k,�?___;(-=)gZ$[.eL&sx㍟}-r~֭[8_Wg}v.Gy IJ&G>34/O$+VobŊh4ze]veg&7 ACCCLF?H;6y}ݳg�hz[}ц n?O3gΤikY` ۶mKR ߿O5kAMMMƍ8tJfy߷o_EEŬY֯_/;kjj&Oo~ma#3/袳>Y+V,XK.E1J]r%_}n޳:k[n}woF�竭]v~aZk|s^k!RUU$EQ EQ5l\$vʲ-zݫ5QUU[hj`†$IZW @,ZbsǎZ(+˲&RK!p�� �IDAT@(qaXUU=~xAαq\,;zcaڵ}(L&wGswB[^ver,_tԩSzI&mܸO?-**ڲe7߼|K/3غukQQe]ah]l6th4~zmW_}nݺݻwk!?1c˲죏>:{۷8n4׬YO<3ff}}}555m�[%ɝ;w7l6ϙ3'=swMMO<c:X"u%4AZ%6Xw DI"Q+7"*VPaY{~hM{>sfg~DFF;v ]vС޽{= ǎ;uprr HKK;u —Ν; !3fԩٳ;vdɒgdd,]4..ѣGg?oV(;vH$֭x) ˩afX0s\ lp;8|@A7| �_&miihHO/ x rp\t:\`In,aXa.n\7hk:פ FRVXqVXvmjjŋ;u4i$H>GŃŋWTTǷk.??Fx6lkhh?͛ !VVVw};t}^z<xp7o)>>s رc!$;;ܹs̓ 6l(6))K.III۷oٳ'!dǎ?cUU&/\p[n :tԨQUUU>|833󫯾ںu͛7_"_ِ!Cڷo?wܨFDFF399߿џ| 3)L�!_x#T�P�QF &ɓOR_bf\p=1��B6jȎIC�1 0MAǸwޭhi0l6g 9r$!dVq8A 4z̙׿ƍw9^oeevx/_+={Ǐb1.߿W^}ƍǏ@>3fرZj޽%_nFjgJEٵkWTJ~~ٳgϞ a7BH\\ܦMΜ9KfΜI9x݋̙3_?|W|?爈kkٳg={O8qe {8͆ k|fcBUj&wp0;N�36�&,A'1JL&P( 55p Z-|f}qB0Lfl6\$�Nr44<6%%eܹohCCC:r\BT*zmAAT*}Z ZNNz=z+ ۴iSZZ' wu1cB曢Lp\\\G=zjɁڵ__m6BȤI{q#G7A?{,;;ѣG|>m۶J1ry̙#^nkk+={VXXhgg'bB=<<ӃKKKԩSW^}zxxhDFFzzzvO>Q*ݻ·*j׮]Ș2eʔ)S Caa!lN=łt::Z� =0'j~`xdh `-l1Z_j�H3!(ppիWU*Byy9�T*Z":a3trvv<yNͅ=Fd}uuu%d2տTګWYfUUUI$Rjժz5 JYYcHHȯz֭?G&bx$>>>===== 9奥޽z|>̜8qb~;w 2dܹ,p8\p}k׮wiRݽ{ۮ];إݽd23??{m rJzz %++tu}Ȑ!W^MOO􌏏 D.]***1c?xtKKC"DEE!#2""X BPEEEquuݲeF9L&[|y.]4Muuu޽̙s-___.ٳgKҺ􊊊=z?F/INNNT"JJZfCe VT+�O]Hĵ�Qۆ!x>39a!8p2e ^gDZHf\.j)`0ԑԩW&Jkjj<<< j>}zYFhhhZZR<u"ܾ}Mz4ZlYf͚LwcqFpp0gUSSǏ'%%aJ sVVV0cXk(0aD]uG 1 � P8c(BxC�\6 % ܁dmmP(jdO<hQQQQQQԑ<uԸq쿲ϟFDDh4<wi^_۷AN<Oߌ3Ԡ&DPHRtz^ id6Ch4»?8S�6y0"$�8.FC/1=pL@ h4yHsQL_t@x1\.WV=bښ~f0K84ce֭[]WWG0 Zh�dva D!11;"; �hafZѝ}0R<� ip7DgΜہEd2" 9-`GdBP  6 |>PQH*L 6s҅P' 72LH I5Y"@D57tp-:Ip1z`:pDR!`0(JY!-++ҲI*ֺΝ;h#FIc22̯Lk ÜtBLef2FAe0  &h0ڙϮ&A ̩ *`0pc2 &`L9d4XLo/AqLF h4e2#A|5b2,ݝФ5r?Ӷm[zh{ŲVz:Y({$X c21LAJ3(Ix$5f`0 ppvvV(2 CpqKЖhPdb�&Bt:RV Um_a0TF֨LoA!Y1 h{m /.g]rVVV:Q.o&̔0`Q0 & 5q1X, 3 C@\,.;d2U*P 4+:i( Xf  h VQe m܊M&hdˢ 2@ēA8[,ML&ł ӓrh??xC|L.ML V@$  n:C n1-r:1m`Cefs8@7PrJ%R X[[d2,jp_"2͖$PQ۷!Cj:7/\USSvApoغܽ{ٳgaÆ6ؖ-[! ,qqqG Yx1,r Cl?CmMmX14xz{DE2 7S:8�<PEԆnrP&PA՝]\\ڶm ۈFP~}CC  ?Xr>}^|Y&$$ o8nܸߓ\.OHHyF'???!!!((hܸqƍtthӦ͌3>|xqƓ'OW0bĈ< ƍ7zw?OJJ>ښ1L N@b"Ư ހC*t 3=SYpC�zl%#ܩMb&!5FQT«@ ܏VU( C({TRHdii I'kp-Si!'===&&櫯:t ̙3|pB\`ӧOWZZk׮:DFF?{ދܹslllCC !wsΛ5F!!!!!!V*..n4t&&&G~uq ׷SN/_~<ZA^P<}h4VVVrTJJ6V\ ax6�Z2%J4ऐh4xN&ٰeB4q.(;)B8::|t4ٳg h @VWAa:`>Ci/Sݻ[XX`H*.]td2X"!!ƍ?z}ii)4M:ujΝ߬1JMM=p+Wmے;ڪ*6]ZZ�:thhhcbb^T㦍fr �%$9zV`:Fwr�H,smEEP(&x0 >K^zf-Q�T@4MM( BooGDDyʮ_&FVp٨{H۔]:(w ~qٳge2ua`` 9 TXf2F\\\bbΝ;AsӦM B}ɴ ;HAT>}͛-ZD?s5?`Q$ &Az4  07|PC&r&TL&o+O'љ8n9]p|{{{__߮]k>PJ~~~}}=rdwȁJ̻B)8KWP -$$dҤI'NDqcѻ �aÆsk׮Brss !rԩSPnݺ]v~F[ 3$P4?!֖РR %38'o6{?\gsfdd| 6 �Ai0 t2U*h4ݻwHVWTTxZp%:=*J腣h�Pu~RrZruwX'Jo?xzzB=* b^^^;vlTTuvv{sOOϒ3gnڴRB�,>??ϟêHBD"n߿%K.]t۷otЁ~hk)/PP DMM ְ(Wka�NĜ.��- ߺ=-sx.8^(g0JKKLfuuuXXتU N�`0I.@/\W�nGVE3Z6lFIKK#lذ!22RVO<922?\z5O9tо}92z+W755Q'&&~'o xzzN<]v{:~s;if#FXt#G<<<0D?|5P2�7�!"%%԰2FVcciLJOh(�hS !zL84Jtj;;z )^}5zCÈd 2zѣGW>qƗn١CF&OhN:Y_:tЗn9o<WwwwG,::~hkN/et >2 l_ G#fb :(8cȫQP]fe^ׯR>|<\@pH@v#j9^ηnJHHi92h{m |T0"0<p_PH{|Pe| \1&'*oof}P %85v!痖VUUթj$ �n.u#S�u EĐ&rBCC߬ʪ.贽AR^#7+�7Vf0BKз@7t<`{ggaPC=X uE6X d2y<RxBQJ/n+++Afkk+ _kNZ-, ^b X,P(f a � ¢N XN!d\~|&r63birQS�a ۄD!@ ZkQ%rnݺ&r+zRkij )H Ԇ�U켉$[Ss�@d2<E78 caá8x0 Z9%#"V, kk[�2!ǧuD[3#*@(DaLSIIJJ0 ĬZ`Tk\ҵn~EΤ@ �O(*5�G3 RbODPj[9m44DM_IMM=ztCCna4qi4ֹ\.7@:]***&0q]vz3XC5@޽{ol ޟ=ǃ9Q5E  Y�p�!�Zа�[  AQ)|5^$mrò|aY,Tn| [vB.0GCk013;R0u*F 6JLA5 |tj:L&4AZ6. (c QvqZrziP&77wڴim Ŵiӎ?N_7IJ5lvxX*N6ck:if\E`6šW(j b΂ |8@[}%)k.Rq:ziCăSpf\N@`8ydFFc~RJP( t8zhNNFI1NP( rꢣ=ZXXSVV'DEEݸqcΜ9]t4iҺuv޽bŊA=z~fg1n z'TKj7ObV��ӋϘLPKm6xTA3P>naX<OV=@h]áꢴ5+xǏ۷/99YTFEEM:ϯ[n#G ߴiHBbbb@Xz˖-EEEqqq={9rd׮]=zD2ذaön N<)4RqvvT(AuhV; tRt�@ Vlh@"0�[BrJF^GLY�^ 2H(K͐n(A0M[AKݻ#F8} 曊nV[[_FGG>}Zӭ]eBȅ O]R\\h"KK}C[Y@@H$"B HnpڅU X,Xܨ"Qce`NNNxfX@(N(?L# 1ĜQI)H\Q�PK//QFg#F1BR'N4?k/^|ќ9spJ9s&ܰaHF[?@NqqqEEv=jt;B.}30Z5Ԅ"=L&S7BgGf5ψ T6jQ_l=|n,%Q'[D"@#~g ޾k׮_~eDDGPPЊ+9lٲQ}`{^lٹsVA�� �IDAT^MraaC 2|BȚ5k"""j~JmMjT1 Axiax &eFS\\ l0Y>"M~L"0Kgj\&) !j<fx�$OOO𷠢^SD"腃!.c0bB\.TkТk&M ///?z(!ΎdD"GG;wd2~GB d%%%#GDM4)##C"@.O?%h4׮]߿~=h*h4~F.јz@#3(@U*P#z`3LhZFe3R LSU�- P gZN jCEAk*h:R)`!uh/IOJA -Zp._ܫW5k<x`޼y={|{֭[%4ι|ԩS.\H2˼y|||Ə_[[{eB@ Xdɶm.]tΝիW3baa1o޼nݺF?4Q[v&PK[CpppJ8c 4 3FBFMbot9XPvT)))Ck:i16lܹs_J>}!_|=/X, l*"""""ʊF"�B̠Th0�Eb.A`CO_@BcXu7o(5(w xXxFC&70P2h4Μ9sppD/9G ;2)mX6Z=x@*6`0,x> ~n׮=Ўs dְW U [$@t�$ee>9E(Jk0Xf9fV7Vo`0q/8=z("A';/m-/[YYY+~PVo &FӨ&L I*++Q]^'x`0 qlbU#f۶uɩ3`�2ۄX#VAւ�> H@X!Ŭ#35#6�-T*t}ecc t:p E}kAE5L@8<E0*<-a^cO@hdQ x%I,L۠'b-Аv hۊի/'++?0...>>>絁c��n&q$bև6r[:666rg "JpDdbK7,A,D 7l uYT䠌)TtWPrZZwh Êwyuda~mN(A6h H�(܀[6@4|+++\nV#PD#+ |6BF(i* (I C1W"4zWLZZn�BפF^nBP[;wڞ V<FҥK|>}!SՎ؈ 7loJ* &tN7|pw@ z<2'Nhkk 0ᵠ jy`b \ԁQ�J1'@ˡ|>}%= {˰Qgf0S0%i&ML&SBBFW X,...Hy---wީ-\ZQѮरpZQW MlKd2!G ^p:,<B:85�82 hI]j~}RiVV֞={!۶m]N8aÆO붢KN0d:gOO/]~WBǍGy5kfϞݣG999| !zǎ͛7߾}ƂV7شi |򀀀ׯ'&&={7^j׫Lsξ}nڴpҥ$|޽{<}#G "d6F ڴieܲHBV^cBP^0"F( H*iNVKm2,KVSc@ :t 򲵕wqrʕ7ox<6]]]p0bg@3Cm7Zl (bfFeQ<rck-9uuu)))|d….\j}Ν;>j޽v6mXYY;wnFFƣG"## !O<YdɤIf?s;{ի>,˧Mfcc|'O`Rgڴi0`36nܘVRR^ԩSSSSw=u={DGGL0{L&sٲeo^?|; +NWYY٧Oݻ*'OLR\\ !+WLHH}Ç?ϋ⺺:Hu:]bbM Í7f͚_t=22ϛ7J:d^^ޥK-ZMmR\\`QF1Ff)))SL9ydPPЛ4 F au Au:ܹƱc5Z-Cx}&|TWU*Faaa=zpvvDmڴ1󎭭;wbqUU͛7R)�RDQ8  aMr3|~ #,L|˕qa_} a|iirW8;;Ãn||BBB^e˖r~s=y$33_~{ٶm׀Wzzi  !>1btstttpp~9`{d׮][reeedؾ}˗ϟRy_ٹp\777kkkggg\nݺ+W6'>::z޼y666^^^o\]]|~NNNYY|s环'!7oYV+lmm4 GFFN:ő>|xNrrrXzƍ痔Hkv77T,m@ BdbXիy}Xko4B GFGk%w11L 6mڄbWWWhaZN,13D @F{M _a1r۾Tp{Bx< -倝9snnnT*׬Y3o޼ݻBڷoA[O?-_<""}999AAAJܹs_jՄ !'N?ݱ[nK,njtҴ%K<ŋ[ly뭷puBF%bqIIIff&A=Cvܹ)ST޹sO?jzU333<<<|˒%K:v^گ_ÇB<<<{ĉ,}ƌ΍FrJ233ѣǏmo˗//X`…3gμxӧ7nV>^/jt0`0L&2b1(Hm4_]Ɓ&3\!"Bӽ[cg;..Px`2,-wY4*#amoPSSʝj CiJRCg~b8B!&n_BxLRUP8mF,mZr;u/Bp…III޽{.]Jrk 9?իǿ#_|966vΜ97�9{ݻwΞ7o-ZDիW^!cƌϧBԩӑ#GLy'OYf֬YO4h!Ço"Q(o>zfϞ!h9))h|jjjUUҥK|rxޖ,Y2|0͛7?~R\`3g΄F9Bεk-Z4a„iӦBy睽{Q&!Z %Al NUTWWCiH{cd2M99w s'\<f6!4t$"D|>-sfm &!ꪪ*ޒ;i"RY{\ REt16[n1x: !w(9\©XĬeoFcgk6{Μ9,kĉGQ('O&_[ѣ#puu}UÇ'Np)SBF. ŋÅرc۶m@=�3 qɓ'_PSSf_Usd$۵kƿҤD<x͛B1gΜ˗WRƕl6o4zܹs||<.ihhjz̘1ӧO5kxd2{XXXmm#LjB% 0C ʘ\v,K"z… Fٳ Ʒost?o{j\.V(l<z{MݳgNNNmmjjjon0)L ga`t&aNrz=q&"$< auPp 9- 9/˝?>9rŋ_^SS:k"##M&Sqqq}}'Ote2Yaaŋ !nnn;v6lNjuuuzRŐid/$I]]]yy92ptttrr2L/^vtt,++ Ϻv0HT@�h&m^UU'ɨ}뇏n۶رUjj233sSN6111.\>}~v|~:5Hz{{�VWWiӦ8DR___\\|%Bݻw⋭[fgg47iTJH6  'qkLRYi&,#%p8ղ(llx<Jh4۷a2m۶nnn<8+++;;֭[ 4?$ Nq7YL6ˌF[E <dvRwv 2G֚XΓ'OtT-accn}Knx<ȑ#KKKe2G}:>SqXXXt; o׮Do ۷o_TTd4'L�#akk۫W/U&ޫW/kk6mAL]]] lԩSv QQF Ҷm.]}ݺu}ݩSa;uR kӧO}}}vٳgVVVgrAAAeeeRt#FUaaa/d~*++}||>3b<==`cc>#GGgϞ ٳg=v5TSTRwޥvBZ~(Lea2Y..jFios7mmmmkkۦMZAX.]tܹsUUU T�ԧi$ .W029l6m:=$ >Ho %3rssAT*�,jO>={,#444--MT:uj}vKKː,L:۷oDVb>}z oLBH޽8vܹ!Cg[;w?^y'pE`2PCsx;q{lXS<�pdX...m۶ z)((&33ST�!^&FPuQnÍ<LPBj5զG FSnϟ?͍h4VVV @RhoD5774P=TN}ƚw�RHfggB!`-b\.ZjKKK~bl\ %!P( eeemYLuĎ8ۡy"HmMdZQQQ+~D׃@kr^+6_ 1a_t޽bAHPLSvvvT*644@ �Ű i5{�BфsP" fRa\ 9-6)~9/vnI!*£"v� /6{VTBje7A&X,(}h4B8� dgaaѲ2HTXX&rKQְ6v!h0uKpw�qzُf5ooo@ڶ?yUT*,]ta05aMxT-KQ%Y{3Q�ybrJU__d2A۶mKJJ@@, B{{{JMqR)pt:7.?>c1 FG0@)6Ls#fj=Ґܖ_XXHjfkk۳gϦ>KvvkW&x71�Q\.$ZJ,=6F1X >ZV.cV-..t"loT*Ha tA {�AѠr@al@ئf2ٺ[m_7NW*=P3Lmڴymf|0x Lʘ@|b<b@ L&S�c\.Z X,FcoondrttD �А <l[B\\\`@l+pKρ4Lܩ\res.؊ɔW2fnl6d;*%W`r$5񠧧x'ՐmJJJzFuuul� łu?TiZFh=lQD-D@F5K~4Fm?e4aXÒVa%N8^ Rf� Z744d2KKK{{{TB! `cp;<)ՏW)p@4JPD4B]Ё}n]vѣGllI[Seeedd$v[jX,nlnbbb0$oD'O?S^^_ddd@@@ZZJꫯE:tPddddddnbD"Сg <<\,&iUTTm۶sΉb+~EFFve׮]ؤW^cƌJqDDDWXATQQѭ[#GEs֬Y~�C>z�Բ*lqs�wdjJ&׫T*Rh`/RVjjjkkkjkkkkk PAI sA00 ȁZr ARrd2AJ9|t]NKz9DG"ʕ+ݺustt<}o@@F9s挟JJZ&S$͙3ҪO"""ѱ(##beeտZ]__l<x葟ߥK,,,bqS… bczyy>}:&&f̘16lHHHӧ?3kǏW_}եKf͚5k֬ÇGGGgeeۗwm۶333E"ѕ+W\]]_YN:sΝ;w.]422'//СCׯ_g?Svv{O,!d2,==믿9sfnnD"!M4cǎ/_Hc taf++m644+JXmCͅu@;�� �IDATT2x"i VVVZLjgqqJrQ(r\р/de8)J @& !JPwh4�<�3@al,-' k֬^KMVܹ'|R\\<ydh(&O|ĉE$&&.^hgΜ9tŋKJJ/^\ZZ{ر9s$''7m_> `+W7l)N_/[ >O>+Wə>}+Je˖ȕ+W>y_~dcc3gΜǏn߾}ذa5iҤovʕ)))ÇCe{キo> Cyf@0cƌ}A+Vl7�s8;;q 8&bL %Q6ZzjZVR *od2oQQhWVVT*z hx|6@Rhq3"* IrpGZ r6o<xe˖}{f|AϞ=Ϟ=k4WZuرׯ/\044t̘1gΜߺuԩS)'8qΙ3'>>~"h7n3gNCCÅ -,,V^ݾ})Gmr [[899ݸq#((h„ ֭w/ڂ F_۶m;`�{{7nO?:66enݺ5jժU&MѣG}Dѡ({4ʛ1cFaamۨ^j[l_x<t>Z@UUUmv7m0xK *jA%DG^GRrl�eHdeeIRUUUUTTJRDdب㉷ vx@B nsȞm3k֬#Gܹ(p8aaaJ޽{yѣGß?"C,x4(22plz?^)<!pMkkkBʲYn݅ ~/eooA3{{p[[[} ͧ-bvvvqqqP?5䄇{zzVWW>"*ɓ'cǎ}3g5GT*` e_ѬYۈ.|>d{@&��' <OA"iz^VkZZT*RiaaBփsV#{a̙Ԟ(; 2a3b 0(d<Zrx<KՂw>sŋkZu휜Dww9s5%''رcO>]tiLLD"A~ݺu6l ~͆sss7m TVV8qB*ZXX3g\z2 ђrԩk׮5ʷ~5 D͌ [\\ &Mt̙b|L;v/ѣG腷n!5D؈�2rH^/Bh \2$E� PR`V5Z1w5>2puy%!Y�ߘĂU�ZBI4*4DY>}k}}}llaÄB bccWXq}92%%tʔ) <k׮ +SSSJp!dҤIjz+VΞ9sVMNNNNNvqq0`�!dҥ:tݬYhO>/7{lBHrrGΝ;644|go裏\]]w BCC]\\뗓qFHDvtt:uŋǎbŊ7o~ǖ.]JIIINN}kStƨZ?3:�UÈXH2`0iԠK1 jFm[@̴teFBRD^@#4 5re�Ai`h.Yd t� .]xzzXy۴i ' SRR]\\zA׬YG 7x`.΅#ioom 6mAɓ' فl{ʕr2c h7h 6qw}4WZt~>|XT4WٳY[[B'''++WWW7773)z왒 رcö2C0wZ`�JTbbɈCL6[4p8p\VI_Vc=&UЈRWScG,VAhBn%bLiknȱѣu vqq bݺu7nBCC{A`DsppppphM"y<^^�u$G {c5p6$-^^[Fl~boFϤ݋q*b?a?t Pڐn-,,d2V@)(VFQ N1hN1ak�j?liԴFNtV�DvEԄD5 TUU<x:Fm-k� 0B"'\z SŐDeh2@]g > :%:jFa kh0RPY5"U@l(؃< 6[2Zܺuˡ77o?2jK*NP \^(؀B6HGj�*B�\r ʜFk@޾+(uA< ND__iЊg4gW1ל^sj a+Ƕʠ+l-H@c�'3P8fPSDĜzӀLj:(PB;!5Z:@m$>, }ُ˗/zMd~V=uwwm@iALjggW]];J( %TyMUcvf[XX�:|#~j!� }8ZP(5�iPf0<&fn]CCN X~ZwH,7CBHTTT+VLRgg׶A|Z15"J}#WFgnUyzB�J{ �9 1B' ^ )L&a+ P HCN ,[]~L_4`.bIOO`l˜̹(BY1LNW[[1l N0# fy*,"'$0=~j5r0@8,\ 1*FM,tFF[kdM&P(4LIuHP{!j\�`rRfppG Xu0Ulll~DQ_*"6Jl=Ka7l,5Zx讠-9ǎkݱcDZc璒&Rx4LGő^^^ϟ+Vܹs޽{j 儆:88\x_~y뭷"##۷orzcǎr,:s挃txV\\ =o6oތ>SQQQppaêûv:|Ltݻ899M<<''G,Cs3-juuuJ : EqYL(P( LܐDm۶�8 vy { $`/j 9rOju1Ʉl2F ҢTY40a͔ĚPPP@)--L~(..NLL,))Q(f{B+,((ΆYťr'O<y$)S:v(H;eʔ;wرcʕ'Nq*BƏ/HRRRױcGgg/_\"tyʔ)}H$dԨQnnnM]&z nDԮ]W{_~W^d̙_~%<~<ؿ]]`{'֭[wAje˖ D2vXCb 7oٳGT >ҽX,u¼!55* @n�o`m۶k׮m5ҭA�ja)1SBN,'l6 -h+;p@q8 P@79dCй]o ˗/ϟ_`AQQ… O<?={?~ϟ?_`ܹs<xr={۷]իWwm .ܺu-[@֭[ >}p {y׮]pǏSݸqc.]@̭Ezʔ))))<۷oʼڳDGG_~…Ǐ3fL6mcǎ;wٶm@ ؽ{;W8}ϟ8q!C`#Hn\آ dU?}{ .Q_%p/(C:� !|/H4aoooj FHg– FF( Zc!GgffN8ٳ'N H$Zvɒ%qqq'NdX.\*,,9r$4$:ucĉ...'O|}n[(~g wׯ_SeK,)))m۶7nX,NII :uիݧO޳gW77qƵk.%%|'666~i&\eFgaXƍ MKKdwޭn8qbMMM\\ܟJ۷/##cΝ ?rhv3 ;28CL`fk xĜ�t&r�233KKK!q<ԇƛ%fNR6a0�0?:vmH_YY 9'~rJdddmm-V&钒.\<}gϞSݻh4:99ziaaݻw---CBBlmm?~leenݺ۷o?~Gx5ȧBlllBBBD"ǏaI^^i68:qqq'Ol"r9 quu-((7oСC 4\./\G+--mhhhVCfjW pѧd~Լ:.PA38LUzPkeePe6aD@b666TLgdd( �6�Ja 'Z#t:JLJSShy}!!666::Z"@LT^t FDDH$e˖ 6ܹs֭d&L+4??S7(++;p@AA!sر/B` ('֭2իf<x2,66޵ku=p@ffG4ހ^0"w�b=TAX�@譡4Fq۷owAyFp GU:@p>>%(1KaAf_# g̘q…I&۷s;vܴiB-Zcǎ_paҥmo޼9$$7 . xՀ 'DGG;vʕ{_+wdJVՊE**fQcہ*E5+!b $74CU}5|sƌ9qƍ7nLcܹ=X׮] !nyyy]t9<-[ƍoئ2lѢEǏOIIy7j֬ _αcΝK AƎ;iҤ!Ccƌ9yaüݻwب6` � /frvƈ6B2"33>8u(.+11k\. z!N3}o{7Eyl@<.p7/(7Ӵi}լYy洜f͢uTTT.]j׮=uT" 4xgTһwo|ڵ?N>T4hP*aUo>J0W4hPFj|@=ԩ#Xn8,XgaÆ_… Kx{?$ꫯT*7Pxzz۷ZjժU۰a9|ԩh:vo>pO?D#jR$=EoB8đOx02h  WF>04-�  ᧩~N#uxmD'i[&fUT!,'|r3gO/]TzuJU#8Ŋib&L)>Ƞ"p'nW$m ׷W i*UTF˗/%%l22c(oIL&*9y4Q؀.h I˗/?)i D$QwFN&  $\v*I<<�d�G5hh4nSAkũ_~B,^XMn*_jҤ (p7fn@= Ep ]L|KTZ,2x E}tjb,*⠹oN"|'EDQqhRLԶ0Lj!9r䈻_Nl>tУ:C)ʟ6 \J9ظ\.F=u|_t=I?=Cb\�S|x؆-M$lxloơ:� Oq?C<2t:[l!iӦNRIZA?bT+S$9ɒe�1Åס 2aS(5 P#j.+ H)zIZ) hq%U#7v[)۷Gk׮ e˖G^sUV9zC'BQ�BP6P$ "`P-NЕt[J^/x`WգFAAC3ޔCDhd2 ! ໃwِfnSԥKjժ=^ݫW֯_lT%Bjժr o)Xib<SVC_& Er ypqO$3g9Qy(AE/B фPZ(5k1r"|X~t<3r?<gŔ7<= 0`gRp� AyMQ+CJUXXr)JCn!x�BbUx5߿WZNv)7', sDe-N_$4YRg{HK\N'jIFgVԽ2*)؄6p٣ڎ*,ŔHeb@.$A3H5T*!A łm۶=vQjQ 8� 2lUaa! LT`CTZOࠠ;FDDDDDXd5lذg}6,,_}fEQ=bbb*:#GL>=((&OܩS^z{ׯ_pB˖-#""ڶmtRtҶmFDDl… =ڋ/iӦk׮R7o^3|ƍGDD4mt֭|{,[M6͛7OMM~//>&LۺukӦM#""7n|GXP\H kf �'R4T.rI li�$'t ›`NBפC'L (gxK7SD"sqM0!22RqԩO>gϞ}]-/]$hٲSO=߷iӆ<]#U֕+Wo.5322U6c SOmܸq5tJE˄VqFhhݻhѢ]vf²_~z>333++իk׮\cǼѮ4DΏ?\SN-_|ŊO?tݺuW\yͶm۶E͙3ss̙:uI6l8o<^g4o߾dy.5_�� �IDATkzyy9ro߾>>>'Nh9-11رcBuv֭,wѣ5kiӦEѹYfM4iԩ=؜9sx .o{>+Vѣѣ="AV#^ 40꟰ x2!ZDYtNF< ց䓄j`܈"4pnLӨDQQ F?eC݂D3fسgϮ]7nl0~Νc.[,66o޼y||'{q۶m}ѨQTҽ{3g 4^l֬Yf>cǎ=S_h山~n?~oǎ7=ztBB™3g"""bbbT*'L]NYf>{U*,XP_~ȑ#֭{{_~9yѣnjӾ}3f[nҤIcƌygW>~xٽ{wѪ8dooW($E&s9B&SNKY0<CPlL2\ B)ᰩT$'2\.\.+"КL.w!>=#BRs<tr&>BKޅ/"\.D}t: "MHHh֬Y IIIyk֬yС%KdddX,/.X`ƍ.]hѢN<9<<|ʔ)|'|Ǐ#9s|]tYlYzzz322_k׮z{ͻwHIISN-&O,z=cƌх ]f2fsjjjzz"$$dСiiiv튌<s̤I֭[޼y3%%eʔ)7:us"b;d+Jy;8 {>B!ƒL&8~gbTvhN&d2StfS.!HnYm6pe2A qáP*eBLP(U*"ML 窃ڡ2CbF\.xyѾ{۔ș:u*9֖-[&ؾ}{z222ƏO4iR=Ipph OJJ 4>)%ϿrJÆ O.SNjjdjTO}YnJڷo Ew}22 uwZQȝ�p:eBx䞲 BTR%9&T*I)d2%ON%Ň#pvRU݁rds8rQFNNN~~d /̩PdNe2 ^LP/Ƚ92! p: I\.Ey'ݎ5)}w8yK^{y}ttq>sΌvw26;sY?hwyڵ %&ϝ;駟&$$@àfR_111z?~ȑ#/xoߞd'IPSڝ Ajo` T㉒":"Hl|hxҴ؂W�6G\¡ f͚CyR-[L2%$$$""">>^J#Flذ!%%˗/W_ݵkZn׮]׮]vv>_LԩSm۶ӧO7Laaa[1cƌ3 T A֭۵kWbbbϞ=6l㏿Ǐ2dȹsF2rM6]pAT1|rK͛KK,Yr۷NX/Ќ3&O<dȐcǎ۷o޼yaaaG޼y3\Fm۶qeggGDD<3f̈2d.\ KѕݼyS۷o{fl6OeLh4n޼ٜQjUj"]V-Bffft:FCFݾ}bڵkf@T*C&;;i޼|2nիmHHjuV``Zv횿J^hxǏ7lǧRA򲲲j֬I.FN:4=!ĵk]i0hJeHHH n-[BV[zL|MӤII& 8/Syhǎ/r饂:N|nݺe4ITf+-rر#""VmڴqkKI۷oٳgٔx YVoo;v3F=$~~~~~~/uP%Ai #{g n~R3Mi/*Jf"^\n!DRRҠAc_'\.J*ўM$0R XDB 7|(!Naa{s7= hbɒ%Z>GEEMnrCҁ+=%SN:uz_L_ս&7E}P::txQWΝ;?}j&D`G_3tyG4ȝ 䦊(rd2#\LMnrTDڽ{{F&7M%H^^^sDZ֢Eryy Ev`Bqq:B*U5'TR*OO2nRdsrr<==DEP󩲡WjTPPp8j7eVLjZ'bj4 b+''GTfff:tK+WnѢNT\.w`>>>RDzgʼnzzz"V le;}tǎEYKN v8TԩSUTUn7TСU#~z%EnݺyfV\.WÇhBQvVZU4ӓΝh8bǯJL&SEn֙Vׯ_AXGbbbƍTR̼8;v^z<ܝ &7Mn*#r7MnrS_ٿ?v9rnݺu_6O^xQѴnԩSzK.e3;w7iҤѣիWoڴiv&J*p޹s13nV;vl6wС"?beCW\IKKرVwMJJjٲeYejlڴiС'ݻmRfygϦ !/^<x2'_^{<xѣG]Va7zzzѣGyL877םMh֬Y'N 7oޘ1c*={ֽs?cdd;wD<GFF&%%y)Sdgg\{o}W#ɓB/Μ9SRVZ%XlYbboI?rʛ7o>rHaaallԩSKv KHH7o^駟Ο?B)S>|xhhhtttݣ'L3k֬>ɓ_|EOǏƍ\//>}̛7oO?B]<x?>51bDǎϝ;7w\!N+AL&SJJJHHHժU=<<^z&MԮ]d);;{ȑwժU,Y_o޼Y:j(!ĀbBLLNۺuZ޹sgHHHn>S!ڵkKiZ.\xI!Ddd+rΝѣGW_|N[f֭[:tx+VܹSѥKI%oSBB~qFru`B cbbFcxx8Nlȑ5klР뱟%ϣ._UB<yr…&L[#zꫯ6QFƍ=}"**꥗^}رc+W,G}yW"##Nd56nggyy枞Ç|ہP1bĞ={֭ꫯRϕ$ѭ[Ծ}ZjnGA _ҥK6-99&igϞ9s_~צM&&&;vd2 oF<ĩuO?bܸq۷o֭[RRǿ[C 5kw}I&i_|1..e˖KNN~⒒Xz"ܹs+W>qD^^^fff~~~AAAfffjj'JC_\\ܼy󲲲Ξ=}I&EFF3f+VNNNZ /=w\_nݺ5..ƍ={,9裏z^{mǎ B)C//0`QϟOZ~1c ߖ^z%h k׮sNmݺuʔ)QQQ#GVX1|SNk߾}qqqӧO?uTXX h4[o}˗/=ztիЭ[Ҁ<x055h4n߾ŋz~޽W^]xŋcbb^yy8q^Ztq"ڵ_6qqqVwP۳gҥKsss zQ5OOOF#xG,KRR۷srrJsɽh2FdQŋp"""^gΚ5kُ?8jMJJ~z^^\.ꫯV^?B[ٺuuJchZN'@#F%''?~|ժUFڔjZ^흗gz;whkP˖-#d641 E``ڵke2ƍf`\l6zt&ITl6T*K\" zgz-OOϵk׶n:;;ZYf͚5<̚5kNgJJdAKFTՁ+VX~b1 *UR $]gjcƌIIIoO>>>KIIQ(IIIz$tA֭[7&&Ei SN#G|޽K >cҥVjժGmٲe˖-z}\\\tt4o\駟VT`0X,^>;6LV_e=Ioܸi<==Ki'''ׯF֭O?bŊ͛SիO6jժLpܹrɓcǎ->?AI>zС)Se@QϞ={ձc%KH.HII3fLFHХKjԨ1mڴ_25k6߼ys/u~ܹcFEE;܉ZDV A^^^'N ILL, -Z8qbffssߋO:Un]V^}ժUO>$d%&NO&&&F 0?0aB޽WZ5zhI{ҦӧO<y2:::::t'NqFjjj鍪\BYYYÆ SN)֭[׻wAM0aMѣϝ;o+11Jt)Qll,:ׯ?qDN)STu .\nLJJ>|w عsҥK4ijPݺu'NrN:??z?7oի !U*UppOBB+ҥK8sW1 ŦMƏߥKsNZ}…qM<yرZZjv^dI^VX1X<<B`??cǦwl61zJUVwnժ^7m۶Z",t:]ppwϟ5jTF>O>l6׬YSQR5j~iӦ<xjO1HjSF3g4mOժT*LF`MRjKHf>~xϞ=VX1a„iӦA7,,6؆ <==Iݣ%6;/Y ߹sgddf={v~t%//oӦMUV;vɓk׮lٲKZ,ڵkꫤ !BCCGӦMӥKuO<y֬Y o߾o3gv/H߿C[" r۷oBTRIzƍϞ=s]pA}ܸq/_Z}iԨرcqFɴe˖ 1pBhZƍ{Mvڛ7oS͛߸qʕ+k$kݺF͛_y*xUoN8AoZm*Do*${:x{{+*x]nҾ}Zha0hjl(xfs*xcǎ^xAY,ɿ}cǞz)ؼy7(Tt!*xS̼aÆO=իWGW^ݺu v1fw67M2$$$lܸRJ=Xəג[MnzAK,TWؒ ^-r&7T^zPIEō7n& ! իW+Jh4VI^㜜̲|tnn.p8*!'U*UhdddPͅ@dddqtH�l6Wpf3?E)�lڵVDNʕ}||\.hP!耀�__ 8⋨T*eH27NQ͚5j\.W*jBl 7nL+(("7 rLWʋK(00Psb7p&7AIXڻwo+Ao@)|;:r zyyUyZR l6Ҡ}/KVsRaaJNNNKK{\.Sre//5͒�RZpppv*kjeZNgzCCCe2YEz'O?d2X*]z'p\pjԨ|d^ω4u֔ȐVzvJQ^ &7Mn*+=nr䦊.rŋoݺŋVXz͛7K۷aʕ+o.9N:$''ŋv7oެȐO7nܨM~ˑnݺUKEN~~~6m7nW|饗*~\7e:u>׳>[mmKmڴ裏Ç.\x cƌyW^r@?{%~vV\955uժU۴iS5x !Dll, РAd#0nܸm۶8p`ĈeVh͚5k׮TwѢE=իW&LPo/\|>}4m4--ԩSٳ{)Sddd^::::00ٹsSqРA~~~~aϟ?_XXX62ޣ~5nToĈR޽{O~kbٳg_~С˗/'=<<9"hݺuDD?8qbС ځ(ôW^͛7r h43g_Ϝ9c2V\9`2 j+͛'O8ҴiSNw^//!Cr w!hРk׮88ܣ5jW_ͻHhڵ/_>}NZB-<y?|…ܯ:**jʕiiiBnݺu);;Ν;rуfX^kٲem7nj*|ڵ-[k*Uǎh`m۶0vр{w޻wvС{fb„ YYY+W۷oZbccy2Ѝ_@ :tԌT޽{w%hԨr?/B<**ܬl+VHOO8p`ZfϞvٳgY&<<<;;{iiiC 1L-:x`|||TTT||<okQi:=ztbbO<yС9sY ưk׮%K|&iȐ[i�� �IDAT!iii _fٳ Õ+W O81so&<<Ν;yf||Q͛Wm? 80???111**j۶mGX,/^0`ٳgoǿi&MT~{lԩW޽{-[ַoaÆ}v}Сiiiѷn MV^ Jնm۲HQQQW^ ߶m۸ql2mڴ ;#GLMM]v-xߵk~ԩ:u3gΗ_~m۶YrexxxNNA 5,Kywof̙'NqsrrW\9w܆ VZUնj/3gNN|}}:u_~=˽~ٳg_t_~.kذae;x`tttΝu:ȑ#6m:mڴ-[|֭KII!հaɓ'@/{^z!!!&Lطo߈#<~^~=>>&)>>ѣej~~~?ӆ 6m4}'|yĉѣGWT}111ۘ1cUֶmۙ3g% 2eJΝzϝ;p8ZmJJ?8x�rIժUo޼9dȐ9Qׯ_[nܸsssO>?qIJ٥>ÐTRFP\N]Oynv޽{FJIIq:4gϞ%p`oW#/((y ?zyy?f͚7oPٚ5k͛T*[_|yԩo,^)^zTl6֩S'--`0PPJu5jT\YT6iҤlVb:uȑ#˗/};wڴizx≭[B٦M7o֪Unts ZjeײG P()))t:{IMM&O\fM???ZݨQܶm6lڵkԋrSNEwv,ɓ'm֮];ܗ.] VӧCCC֭{2C'''iӦ~W\ i֬ٝ;w$ 6k֬LNNƞlԨ?~ͬ?xҥjO?EƌӲe2!CCCׯ_V7md6g͚ձcǟ~CO ׮]۬Y[ 999c7nx{{WTIgddcψ,((BDFF:ѣ7楜RR E=N&I- X, *taVѣGY6ջ[PPotqĈj%î]O>b~/u[vm@@@dd\._b,ȑ#رcϟU?jfU޽;sLߟZM+ e(RJGٺuɓ W^ U*C}ʕq) B>}zΝIV(۷YK^{2|rZ9sЮ]~i !n߾=cƌ,(7EFF>cʑBBBDD_vvg}Pdvë l6S(⏈|ÇJe~ʕ+'$$ѣDj?,Yfɒ%}s=G\mӦMBBB {OjH?fQz4e Z.\>t8| l755~x7iKQ+???˗{_aa)S<<<}_ٳ{ﯶnzeɇ޻wɓO.]mԨQBBuKKK;vlӦMG=j(;gܸqT~SLy뭷{D\_ϝ;7%%eӦMÇ_hQ9w{X["g޼yV5,,lܸqjժUӿ⋰w}w޽6l(зovEEEׯM6K.=tӧK}u@OO/b 4?7|fZ)&8aÒ ?/ @XXԩSzꩵk:ܹs111 4YzR$1`VZM2a>h޽aaa{{g=s$|ׯ]VN>t5j KHH8qb { 6BiӦyzz.Yl|kM62eJlllAAŋ_z{nѝ:u[9sfϞ=Ҹy^`Ah:Т;688f͚3g\rZ&%|uc.^XPt籱Zիׂ ܼysZ .3tƌGK<y2,,cǎG֭[tttzzc` 8~xTTիw>}߿^ܹ39sVZjjs>|y+Byk׮o߾3g|W5jw<gv.].ŢT*].T*6[VV+"+tR_\(xPVL&ST6 O SSSJeڵ{}%u< C@2dȮ]\B3gF&\.9fC! F]VJոqcjUKl n !v;=]PXvt⭱j2c.(xMiЀH4FFF;TA/p8vL&)>Ϊn*>6yؗ+JI\n=<<\.}L{xxݻ>rr(Y'QSN?xZl@a}A+>`%zSH6_;(xV3,9hplϋ?d#j((hr%-[CueC|6sY-ǙcsK>|(?2Ѹo!@P/ ?ڟqqq/_8p;ww.Y)ܜ,҃gM-YY _fSEp슸 |7FqРA*EEET Ef"j׮{I-Z~h:th"[+'>3LRᅵUV۩|"G.W|L&#n8ൄ;%x#//n!p8Y+'d4 ZmaaZqY="GVmtT|Z!f+<,Qn_t|/Qt[?!p<J/'$/}zJR-[mMnrJVt:%QMnrO?T.9#7oׯL&#/URY,J)Sr9EAE%__vڭ\211ne)|BOd2w nlZtү5O6Ml6JI�AsRR6^>Q�N'݄~K 4$ʸ?hBZg_)!h?=i2ih_Á$!BAlj~( LPh4BMzL&ЭL& o-hl4,FEHSJ'uNJ45J=,@!t7o悂d! .+ J%MWR90}BCF NSJ)FN?$04)-1&=ILhT*Uaa!9VvW.ƷBLv8o\$�p6ݟhL&RI^~n<<<uJ p艢(L_pvGcv 3BwC.͆BltR8PHAbMV5**))~e`܈/Bh{ru:‰':kGaa?|7n E\bѢ[ѕ\tQNx QD+V+˭V+ggQ :w'ɡgABs= izmTq>EF$e:DBNsBb 434t+|z__:.b@#f+9۷oT*�m�Y$K0,܃Ϲb!p%`[8 B-Gۏf E#@P6 /!ՁJѺpn٠чjZT  JCAw�WIވ>lt j<=6 RV+ >ǖ+IîE$öILےt -sl2ZP$2J̆%6qݻwrmEd2D5Ц q/Gg73@N?ᜈڗi8fǧ:)2@*o1HY� =E.Ӌ`ļUa`0 CP(<==TE3 }&07q+εEQ9ޅz Ml#nᑺ MKd4fnOcM $*8D1#Q_Ho8J*@ 0:`[b<2Ft% ] )l.M2:85"-J&t:>B9rZҫArK>\-YCZnqe#2_9C΃>D ?TCLoe8_ 3vVz] 2߾jp;= iS=BV饈c T(CRㄘe4w7XL/=36K4cp1AQIzxxIÃt6 HhJ7S{04ppi$9 4Hm$ZbHPX*X&*G)2Nr< 8_X;�<ȴ#!H1>T8!ǃDQQ(pp`AUxxinI (\`"}\CI:}%,374)OIHh47\.h4FLBvdCpSB Pp<$Pe':HDFBM!Qy("qhȷC\Mu G%Ӂd0W4Th'̀҃h<F&ƂhT &v $dKႧ# j5n5t8^^^Ed2шUT>>>n2L<¤j *9 !qy@�;pb#PE>z HZ_܍% zS<_#g6iHz+$a/aa;Qz#ڇThHffS8HEQ4x\.E] } pX+g+:2Wص.΂ (j7B|;ĸ{;7WLMC`C"kFYD7f &i#� 683!ng%�  [áIw@󗂆(:7`!"M (Toz.q4~Q!BLL+=k׮] f P<VMH}]qC@,6(vH$#>5y EuR'%CJ0eZAN,(`aV n&] n.Q!�HG)"`0'|ϜE@ï9jŖq9Hyq8f�QhcFpz/pXnk8ŀ_Kwݐ=Ǎ7bqX`\CvCm ~1^#3xqQ b�g"b 9#*a4P>FaHd+2tׯ ycB8V @GTۊiE'v i`@+=$c0@[P&vr!�e07` Cgp1] eʕu:ݵkנ]!d=ް(<Hy\IӅaR#&0;\ENyX6کEB1T$*T*l=N[ >08[_wdӮ2LtnșNhZ0o`Rr%ϸ g7}qC*-)I"X"$3Y+d|t= q[l}+#Ӭrm3x�_!#")"/#x`7B/r#Oq(`0K跘jbv4<p@ J%YTx\pJ4 VBA&5P֠/Ձߪj//k׮eee[X$Bŕ K FWag$3*>jMm{JPP@n_` ,z :�B8QL:RQՊ,05A0 7$6 kЁf uQ8%ࡼ W9)q(F%9j4##ZƁI<WZV/sd� nd619悫1qdC:)gj�»$Jq:b'Xb)ȵ~##54 p20]v Il]PfffOHFr_+t vLL3 ʐ`0Ps~EKF+' VNY#p_ǹR k &4IV\ A{rX(K4F!)G:,Hz1@8l=I!D ]/zI0`t1yUk"wK@G<N=�;&gyx3i2h5:5*!ے�ڞodqwDB5(<l-Cu^+(p|ќP�,8 jC& ; PpK &+IGfdds I~x&ރ]p2hq(,(q`8<S[ E8%PTy#&B5XmA+,| Kzxxn `�[�.I O/nX`)8OMy$\"498dA RR@d6&t`1!| $$f(yXM:jC G(V6,S w}!̎g �IvF $Ms8) 9.9JsNAAi6w#`X,l6n@#Ib2LRpҡ9 ?\|yO�zX+7@"$AOA!"PC<fy(I,x' )g(+"*8犇IyL^&oH^,$W+Eyy D>�3ܥ`6KIvy$Hhr{{{G&/ Xta""/W!<-<'l& @8F�L:)NĽ,` KyѱcZjE8X4JLc%^G 20138nHG�[ OPh`sd ļчZZ?$@:=Pjt$@=.i�`H`QGKR wF,& ˭p1TfCR"AX,py!}bLl$CvH2~'EhQ<e(x"<h  ?f>h2?hiT`i 1iS V iU߹P1 {e4a$H;`KX,sB"]qp"N2`I}?.Fly]�� �IDATZ[&Nd:�Ï!|t1ew<jK9WAC:Srѐ(ȫ<UK6U<IeC*"!JC޷"sTB:J-UWŊQ(0j⟀aCD $`C<s?�1AȨE , |@b&_- (G]K{�FrG:p+_t|s)+ p#(`(M˩w { _$jٮ^ p]Jl}TMI/fL ^V4^Lrgv qP RÍZ\“ ekuI6;BxU>lt!GfVK9,epVר EGBLf3x.m �Lj"~xx^*d*`7< b!ϛ!%j$GpUACӂ>^ 0_I/. He ̝.n~(X $0 XKbq/dmx}3j*9@X>!�aa(ꀀ�BA-J^R^D4L/8.&օRxyԾ(8d�Eb!? ّ8gtP d&oqI rԫ$Ӂwփ(1`9 :mN:N._h4>fXPR teI! p I$RxL] cNxz YӅX_qt#. Vs (ĬBؤ�ʝNG -`B(^&X$]C}i4-!%.8O㝰mh)dE'A^`_ F lcOO>((oq/Jle2Kc+cx}RbT[ UFKR,nS_%,@"3BHKIf 1ϤvRฦ)ogW׾†рV�2x^RKaI_Q61s(9僐x*$i"4u^oY,Ɨ==V+)P*YnB-EyZ;4kI$IZNmJCx c*PJ2%=iԀ B-'X$W_ 3ޝ'd2/!XXQIД0�r@lO ū.6P̜WI ȆdKJȱ}쌤3q3gΤz�5ܓLRPz x.iE8pN<%д�.h4I~ޡ\bʭyzFRSQxwq5k36)~xLXrՖFh45Fӂ٫(`)sK, sGO]7l$ܖB P*;  x|kmh|ĺ eփGi0u8փV:@|   |{U8ǿHI:Mp YZgΜ`~XdoBRw8$i'80[n!˵Z-#xc: ċp'\�^!L&/!*6@!^iAeÃxFu9/BH yIUh,DO-}ٳ3#;?XVrrʤFOOO!%\w! 7B \j@k?P*q\V1#�s(3ae xHңjb$84Z`x=l^Z>`.H-$`y')c "%N$JOZ6-z'!t:]~~>N3''V 1\�LDQ1@-D#|D4ڵk?'NHKKRS8Sd_x;`=Ѐ9`QnS='Lg?SYi\\%s$%!"ܤ(Qh!!!z mذaFFFnnLBA p"OOի7o>>>5kͽ~:7C!6tCTz(#'DqYΔTNCDN3~IHy$H.y:I%TW^^S,!uC?Jp1XA5[ejK!}%Z!HVT<C2=Ž$]ȯݼ@� (Bw#㪿ڵ2339h4yI^Ҵxp_�Vu:6/8Ʒ%=-X=IdH<P8װ0ZRe>C^d^SޮZl(Cs3j'Ơqo[3rإn7 tzdf;wJ*/^jf'@pWdy󦧧'*y*HgX 10afޚ^ܛɓBHxy;8t8rqo>G5;qMe,U+p�q Qʼu  Z8sl.j},() CoBP#zF2792(8 7X Z3AFht:ZP(N>]XXHa'*뛗|~ <2C;B+WPo%h4>>>O<^ONN#p&bz%= 9& #YBꄗ$ֆZ6ͼRcl6[aa'9q'9 AE/Ix-rA;@lr1lnxرw6q~:]*,,+1ܹË�΀3AB4ސ޹HMa$! 5>DtyIF:wqbqO:RdpPbQ �>Gmf Ԙ|۰aÀl^>6TcRB%c$a {{Kߌ*8Xr跀աٌ-$@U@ʣUFZf͚&IbbjF1Ļyfsqۈ0KNNNNNO`./ N�Ϻ0{q!sEy\{W D eE8Ph7vr* hA'rR(.Uop8d@Yp-wGI.?9 s褏4j<R֌hJI& 2 =шv2p(ä| <}VP,K$!!HJtҍ7k* #z/L;N+XB+ޑ"M ]Ƌ;4x9I_8}z X$)ϳ]!QZ 7dxȽF6C4THTjի߹sGKj$4iҲeK.>|Ľ!)9 oAm/\ �8#aSy#1P頚<C98 ׈A "" w`0<ڴTRA_[ 6ʙ;$kL&!9!Me|(Z3+?LJ1dI1f6x"oԝN#/ 0>ig#N<s|w7Yhd3áxsbf?ThC5GrA zP*q2!Zfŋyl@LJznN"zT}hZRy clh%$ Ք<nhF@gB'4�8N-B|`=țJSA\k4//UZ,Bxgy駏=& A@^‡7k 'Vwc*O;ދ{H">]\JsBqqO# n:X(JuTX:'AT6v;Bs'92dAbܞ Dr%@|,eC) `ԋ{F\yk<釃Dm$O �V HRÝrՈ� SsR y PӈRfc$LKK"ġXm@ah R @D(V C-iRR.gRFgT4 &00֭[Bb?~̙3wޅqVv@A*i\P#l !N\7hya$ D&^-Z8!h4 *ENp4p+dGy@`Q1ynbDEI-^hWكGpg{q_ &O% pU<ÆD{$h1)�4T9Ta!NA ؗ�C*p|0o �.�*T )p ~xPiTT| 76F VH�2IiiUVpph ,,,$LD= ɩKq}84HJ1G3 OG+44�:umЄ8xMi@jYvEOnnny/p{pb Mfw 1⁵A+I$(?E<{ZԻWK'*96-U{y]g.ny,8�!J7§<.r�wt:ywN [\6@]@((\!�>RۄRoĖ+ &(>(97TnVt^^^T9 LVqLi!!!999B!9! jڜLb</@qy oj��^!;l2`yI'<58 lVc̸%)]rN |WK+�ըQEN}\PYܰ ǖnx{!z񲡼="g='[q?KzK{cKL"'.tK4":HKג<m-,VA8!M>Os MPWEky/~;; .&زd`q S/("� : j{^^ju;vhfϖ lvpTNSpLSlQ|ʄ7UC:"o!RMo%Sn#*sbrm>67<E$%0\DPĢ&V(B$N(d 1FKXhJ( @"8I!9"gadk-޺ͯ䣊n}rsoQM,"f1~M by~+!,*z`08ќqi~ uxCП(zTȣ\`oGӡ3Z>N6+>E1Y`W4*l"΂aR›gg'k%#62b:CQ%<nC!ZV4ii!7m'jY\ry6! a)b0{Ѵ(.Mrm_,!`! ݮ=~a۷/xO~ׯ/ܾZ[9}Oݸ1vI}a %%ן4bfPӂ sñ=`rG=ӣ8≡Nz^{adśFt1]뇀Ĕh7~-|T!=98Z#ǽb'PXE5*,F}{ȴx.xVPrSiRZ,֤1ᘢP 5.-C`QHbP44("Of{s))xrx<(wl*,wFl t7D>nvv6'c<eC~L꘢q $ew;v;\x~M[O{o}3Ϝ{?rp8vZ*�t-..^~dK9!+A"4*"iS.^AESdB^3f]he({9bao@_c#ꗞH| P&QtN8DeA*SbDk/)FqI.s6nd}RvPزV .K JLQo>~12`N g˱cN<hй)'Nԋfx4NcV^\s׻yo ]k1CW"%Z;y Ǐ_}ԩۿk;}̇>S?˿nKȏ<}ֺN*ё#Gt顃gU2h/沓KjOdOA[@…A'z2tLK}Jgr, '* Ot^DIGyWO  >&(,QHDT� %n.X1Ur62Ѐ0ĥ`j8J]7] c+@ˀ9\:;񎅅~siAǨ=b\# GbK);R?:1sJn䴔 D<;GYXX;^W~w|ǩmSgO=u̝wvwwgVW7ڽO>ַλjT׋y�`_wm$�#i_âIW 5T96FBC$P3Q PvSSLqg!&a /~sV9Q1+ 32iEvev�F~t qdʉSd߳9mH$aW*1{ih')iUsxjE1 EA|rN&& `m7`X̭< w0#|g3,R2_h:vΉW&4[333n F^a~~G>vXYXXX\\ &vw4o[kwuwx=쬮^|SNsw ph(_7}g=t]sz6r?!Y~Cf4,jK]E%2K~9�GJ|Kgrz9C6#C:T.S)vfhW$hȣowTmKq#6w� oi\'ڪ5_#DEh,@?�T,Bsooo={65M>I,iWנ)kh,FƤw}w3τmLM:�JK%Pd{ID,7x8R(G"+%.--xk^k[Z[k/rO?֑#?ӣw|3yȑ~~z/_^^^s<yrgg",f/ S=,3 Ĭ&^5ޗ&P*ߓt AJu>4Oh}Zw|r**Mmퟀ?42ɒ+$͈Xv&g'r4$ھX@V�AI%|9tPE ;3�b33�DC$+Bv`nxJ<X#$-xdyyy楅9V\8L)1"2<yJAg.Pe 99ike /䃧_]]]YYW~>v;{?>cW^ycwvw[ZZYY*H#Z[]IXUH =eD>wvv"q}e Ztn6n}> \˼wCFQOёQEqg׊i3f 1cۅ>zB95i .xloHȷξo|{裏~򓟌Up ݚhd%PR6e?xq x ,bFLeh|"b aBDǕ2md#J s +Bͦ)M~�� �IDATp4GLfC.\rښG1O: ;LPr Xd33t"ǥKnݼyw~w~_prsvsMnn> KT,2p@̪vr6ux4!'daRX6<Z*cvdo xn5oʾ;@׭iKn8z79Rp/=Sf5ƒEۦX3X4Rg^x * iOBXԩS7>oPyHփ_2~H3_  `rF+w\ypܐ1=R&ijhp`᪗'Sfr~$9P l-4ߍL/ P.bn=Eh‚-z٩~x;www_1nXa?'0\M^BNs_^^^[[˛fEݣڈLVvPP 4O$H>c\F!о x0U1 b?4!!3I\zomm .] 9#D;r&v??я>cs%ݡm7/~x<?hB<T :9>@=E!ppG٪d | S-:u@a 9ղC(7B. dK` 煑F3m|8rFZZ I,֝N{}o~k_׼{{G?ѧz֭[[[[1M5/Ig q@&^۷"8Y"zuV -uIӈMZ<qv  i_idd2J34Z6}r X+^"<ZB,]M2Vs %=W=sBxk%W)3* .LNN޺u7jGA(dF?[euٺOdKQ8I'g/tT4M2څoqzC4@}x{v_)c3}m+Zז/43&plk@6S`b^?U"{gmm^x;2ƴt9Q\D/0�7/hXֳ@jӳYi\h~-ǢVa 8~ ?)'hq9v8-şFz%^K~Hb/4}D#* 4, -F_yY14t_v{tSe,FvƍekCaY-{nrTLNmomMloޜؐuH <ˣyR`9p]ooFNZcLP,8}v" 3TKYfXOaR3j1$UQ9==fRX^233s…۷o_|9g6ݚP"0771ef_B&HP*vpBZb&?Q$YKEngBAe9EL2!h"49Oa0K%H 3 (_\^"N'Qؓ Sn|<0\3!kѐ/SopVw[־~?{í,fvv^ɉxk+)gW''̇$!c4~. ؈yN'OOTIAk"PK(YpKSңNQLv wLp-eh#Zr%ANLM~gLLLLz YN5 fМnS7, qȘ'=aBC(Q&2쩘R7E87=/3mG=99Dc+WBe'(AuI5 �8{M d�XH2V}h*git:V3+xcc#}(<I)wz{{5=۝>=}pЁS:FAMh eUP B_&mc�~{{;Gash'9Dw)T(lXyfr0X[[;rCNCj\gҬ<u kMB׳kL -&E`w2&me"!*F"v>dQYxOHÂ)"lvoSԡ;SG@Y �yNG!C )8$ #^lV@:�5L@44??3 lml󓓿9333;}pκ[Lͩ",*ξ-O^&TEM7Y,g>/..9sfuu^hR%ϰ6 D�} v<zFt3ƢJQ}.CvAnvi@NNNT0a$6xlZYYȘ~ky췠rv4*NdepT:5H-J 0WgQGLw~�k4&IbTEablf& 'TA"&R͕+WH]uaiV&S s"{ &Z> }:RfqH2).�6&3{{95>^/N Mz$A(<�bTx)Jx" 96n.EDr-lnn_r?0GyD/R1, 'f!n}9G'<5_�a忡DcǷoFZ?Zy?HġT"o] @Ç&B:e"Ӝ8%% v!%вst]B卒%4&U!|2b z:~Crg)+F)\f‘E-'g1>E</J +A`h-\<_39u`0(Fp5Ա'~'y #m�,8X.,8 >8՝[3]:oȨ]}4* iOJhDydGP Cc)KHS@lб^�`pܹ\ZнV4@UO8}``9E&R=[|fJSyWO�r& *ޯ(h7V5PPl23q|L>|ƚa�jh49Ͷ˝u,,kA`)[Vpie*HH?!v-pklؼgW' ;wŋFN<9==o~}HVTsFuH |OZ Hp"fƭC I:}u!UMoHPIUjuV0t5 Þr˥(ںl7oL8L6[mׯ_i=|9֐$Q!xK 3XQpm_,*oG#[$sH7cE47E']/W49rH䦿`W'T=#4AV.惹35Z ;Ϛ9Z8&yH>=x͠UxEIɩ{wvNݸ| _իWo޼϶lر̙rVO2dxS,i*M XCo%i.>"(%;fL1Tu*7�5Ef8=z \8IeOJЃ1@МgT9.{ �|Pf~�bg-ɑI }`yviԎٶCQ>==E&nHϱ<)m~y`3 5g!+_Sp-C ۩q$L /S@lצ7&'pfҥؘKO{&rv֢KQA8bc%)vS$x ,89c1YL m#$f3#Ƈby<�Xw%q39s>lnn^zusssqqܟp-NPH8]g \a. ?|xRf*?rH޸v:@zt\gj>v6A>%Өв; ןەbrqFQ/yys9e$s!n:m_l _<^pNpB1s^ބ,rsh>%e[|Zk߱ٹGֲisnb67<;@ոIggZF|[pQoo5", g/HO]- {{)h &%o@o67gv2Nd [nzGMk'ȑ#sss~;o^ `eBLU"۶@tv`«1#O2ᜀ:4E`HiEP`+5!C΁T!H62bm_ІcPxll# Z\rV9[|Dsgޚzx:y7rN;bClo?|cbb33STRӤ4P@L&XcvY ŵ%dcvBb4J%mCi>cJ7K| ]XzJbM1]XX\IC<z9Mc5?ʳ)wX`ӎHoM$4Y 9E8Hx.)L5 c9O*\mr;�4$ [fX;/-`o, m�SGc3/%Qu^tPx#DJ spn.zlr6<*_2RPǩ[F_H9R1F>Lb8E1ONo 'E$2PsR`2 CT0MZ>6k!@[C `lhܾ}7Ǐ~xAd5"LF7إjy4x`*ZA6|v�kzly{!O˦[Զ̕cUDw] nܸ2sIvu^ a'7x2nAO[4TDaY؆,Q6/=`4 jyP{vNrI�iIFťr=%x!#Xg gQ)c Vp0kk6sڨI0P\AC0I(\Y-/]ǒs|gg'ƍm1 Gn)*@0YZ�򑳐cYړj~`\s;{A"86uw<k0*9Yŋ>ܯq9>h*kg"<2P/V>'L)c=oa' iwR=9#;CMqL\n>129[!GaxRT3qlRq'5 'o%Pب EE,tySӖr #P(_fGg4AQ!U'/F| YQ1|cbcvdG琌*_!>mjoЦmFnSʔ@pFJɷrL~|n8pcaۖcMMMC4:9YArll1Bpf*IGC90 Gdڮ+�:ΔP^%|&~ي[Z/ؔ:=a:~4vنɛNJͨ݋x?+xTu'&BO;n vkaM8y+M>%qZ46(RM!ѱ3k JP,{Ԛ`KC{ K3r]o7NFũ=G1:c=7 / Nh|Yq9c%m*�s�=ŝv^IN >潼8ya"e}-**)RcLɿ3"&G 8"# Z a6!|FmbsP[ɟv VI`Ӏ|vꅢxdن{ˠaVuQLZni_Q ϝt^s[Yas Ln82^-tr3B!1Bt'|B_&Pon$7~5ޏ.mM49 h/Ujf.3_;*'d ܑ5ެE>o7g pʯNSDk2qe ^ǶViŸ�)sJףPpseܟtlĻƷ ZZ&ɋ‹'b�lyʌQ(6NXep. dH|0М?Dy8fC< F:S>oipCĉq7XuJ &fsvUȭǤ Khv&a'|>0Lɢ%7B'E{> 1Ж *tSXd`K52Pd!逕+YF;%Uq41t8k_f}Xޭ`{ Հ;={/qBo{Kӱpyrtni!cz3l餽6&X]:3!O$FsS;TJ5o,ҭj[n$8J�*Շ `Sq:cjgK?yq'i BBiʮ_nmIU@97532/IhњrTkEɓn–ƛܡ1(giQ{.XGѡ%%}L7!X;|5uh0˓鮆dL4xL9<Fd'66;A(@`z^D#%=:"NFbwkKqv[ !\�́ګS,%va_�׋u`5,̓*h9 LF 4엿MYL%յE.r"U[A 6C# {UP+G?839-BCَͮ "; p8t:-n@t҄qc³#$/29A5Ù˱i= @n/s’t,qx>ρ4Vy;js ]6"D?PQqjF�%ȩMl+V}AKљ܅Z2k$9r@aƒcaK%%fˏTM0 YY 6l9Z`F͢4&["edQ}-ID-42h^)ME7n|Yf�` hgo#.LDvмO+$K箴!0 5R6RTwlh({̲g S2봳Hޑ(>wԤgP4n7]4Z>IBG Y'QTv(^:-SW$ł463M*vfy wx(뵄~%=|?i(،puDАArƒ)l _ZwSە1cǎ=O~ᇟz){ :MdiC:z3E9kiiioooee%yr}Wdfr%j˩2GƦe")wK&|op8Cր AT�,0\:#3k+Gc6hlY)2r>ghv@^|+6]cLsk$|X}Y@ŀ6=X'm9ʄ][>{ؐ a  @1{4x*[Y4C}?<Ô75Y %S`M<_ͱBkSm,e4l<r#V͡F?p OvQ<:E$ȋ%@ۮ~s # G3;䩲bW[#6>[]] ,西cdvv{{{׮]KF$/~N6 -6%qn!FD|Yo3$Iqѻ}1�� �IDATp,h&I0@�   R]`=Aܺ(?HYEɰ&+$a^*:,wS逓 piG"jЕ`uu6kEL)>Set©i\0c=Ok~É7]%lZlqF,Xg3kN/Ipd ,Y8RbG!s^0UX&~i"ÒQ,q#Gt2PSʹ3ѝa<K(ؔI"7'Wy@H3!V��#%Idqͻ0f2_-:dFJ6YlB) u𮹹9~`^֭[VϤ+"I*/Uݳ#'< Wc`@KxFq87AB`)./갍_XIۈf:)6 |(P&8ӼqUY٥ 59G#slE<1PuDYlǼ0K L-r[ P݌5Y3f0+*)`0p^ pXR׼&dVKשh>%ΐr ؓQhvv.Br;0\� )yL$g%8,fyK`}A~@ iXP 4CGh~ g.Yː\"-RVA؏R,lwfgp,Zyv eE' �8Vi>N]\p.[6HqhP5;Vpf334;1v%vل$INsR=QcwtVDF!k="SBi0Er]<@Ye+@#]d&׹f'ŭ3wP &^be[ј@ɂUx px"wQZ(Iݩ5@%4wE,# <.al;(]l`2:9�|j)^Ţd Ŋ{ '΁rvBIֽ5D=\p]fL.rψ6"/(ZREe=aof$OO૲߉7<Ǎ>Pvp>ׂfi-dntZ#qiK1OںvdV]h8{lӍtz3"I@ya Cs&gV#nd?δ)(SCC.w h?ynnt~- Ј`;8QHOaU0L#MU3iu$IN$EORd:M}<J]a&R 1"/MH#>)}74B$hX۞ZMqa )̤9TYfL&qŻ۰ Aޒ8Jj7)׏YMg*>-fU KQ1<͹d$=:IMJ]; @\H1f6H?pxRk+Hd9Cm06&Q.qDujYiK7ɮCΡ5r"ILhsX_*yDTU|| X߱U89X|%c3N�T<m[޼=8wNk?1޽oΦipo&jDH$}oӢ9[3‰X.9yM SFMw]J9'�ܜ3g,//?R K-_9޵C8Qio4g&w8j&/ÕYd3MѓeUhA҉*ك;ٿ 4acpЃvP)p8 aĔMa;9/<K*S�9(A*x$-+5EpH9q 898>+̱cǠ[otرں{bvww{=75dF-$|QqX+8, U1mN7�9|ϊZ3Gc~G~s~'$!m5k`c~JAYh#N 9{ouGS\ equ +{gcHFk'+b\M U[-l+ƜM:o#z$NI@a3DȼQ朌CkN̦Nv!õJ٢^^L�MJ0(�LW6΀z%ؘۛnW7fgѱP .)ݨljBJBheo7@Gy,�mz~~޾#AT!LEţ'No߸#|_Wzi?4y-W"Fncn X o, Lgd)�lC31BJ4N0 iy%#e[RQ!DݘRBe {JTgQrkmnn.Nj؊w88faY>w}u9/ݮ{wLw$C&bL0hYx> }0]L .->ʥ^w֭rϯ޻vsdLh#BzTBj:mdd�i'48_Vt{{{yy+_ɓ'_xsέ<°趺DI捍 OE`(i|uyA`ci?o1)5Fh5 >~H.� GL`>?Kp2[71q&6b) � <)Ps):deinn.tjuuf͡8Dq9�ho8='E԰B6 7g|MbDl,dHgܵN4c#'wv};˗$67G졒"\ws3P *BCB,� ^$?1vmЏZ*ˀgw??`pU2tP˅SN=(2JpdLŖJF'[NDI9(b9G]y5٬CV0 `i/zu 3\wAș"bCȏV|9dbPAOg(5):gfWCa9I,evuֺيpBE4#~Y4 IP^߶ :7̈ [ZZ:~ѣGG- p�3M#$ד=@ چ5߄mUif}49H-K^(۱J=+>q5;֍ 0a 47']fz<jo4>{JSNmoo_v-kL-Ɗ8 h1!l)ŧ`+3<Rq,? ?-206�KQ* qt ty`='c!<l|`pcc#pysCηhN: dez e.u7E=3H)v,#,>&{țVss?O_x矿v O}e`� *;$|<GW_t[~ung΁p@0\.8]hT<7L$Ddz1cݩL]A/R_zKMb<wRl![ 8~pxu|F\(Sdz?_4_؉DSy`S%:ZlBM/YEOovJuyor'Q8œkwk׮aMOC0[y۬,R`sa~Ϧλ$=7n}CguDo?woˆrF.t{ثEFs2$Ltl3g.\puØ;(F7'?9ց-3@B)Bb \�Eu͎\<P BV)?%mwLG‚/q^reyy9aoʸ[t4ɺr.;<Ra Z-siCS L�ރL&q0N!J&sȽ ڒ`<~6A4]Sa "#t>&J:8q+6}z9z_|sdkmV\"D&-olTgBHz 8q}{oo=c+ǜGQ Y-t7o 333^TB/Ls+>77ǐ&B Vz\4mD ~\˜2)&Y|:~-p`ɥO>, r0+qJYfZmAtt Bkr 5[ɤV�ɢ,lpA=%͘4TnZ<;FOf<HEʺ~zcڷc TӚz.oI6٢E?[�;5#/̨dž ]lWY?|vv[[oٙOMMM}f?u-bw[]wu֭0C_ j2uzc=v9O9 HpV2/neeSTfY{ PQTdV`4 [�Diض 'ebUcf Hfyx[M+/HB&ʊ*>`ޑ#G•dܣ{Dhvv,�A4rNҮ<c-P\&!UWz@)3b8f-yTVB# ^f0@bks;<c*a73{33Xcisk%m}~w}bf'w3m?_[]]>t014Rx,qPפY׮]dt A ;b ;fCMʠ)^AlplR7 7|LÈd1lYR=64rڎ�z4K=&DpyjmF<K& lZ5Fj2+7P׊QGG%S!;4&#$–(J!I|-SxP<*J -wx#re (D7hoEF}_$רEnfuZpx8+Cn-M<gmm?q`_}I-n/@&Iu9EŖBmFq'*70] ʚz2+6щ x/Q�"rӅkۍ.u( yA#Djw84*EESq&5ɍ&@T3~ )(el㡷q9y,%e%6laj1AIsZHQG]Y)\Rj�θ*' F1G$~zZ9a@gy2㠘>[:~oLXPd_ Dk6$EpӶ+eh�ckB1n  NU\M3:=9,]s A` @MT ;25t@t'%'M.h4([3KB'O42f/P0MY6c `;a%*:ʌA#y. &_N4Dl`g (G(?zeVtCк -$i=ٱHxE ܞ(z^ ITlj' 7LY'Jsƨ3 *^$upU9&gU8 m�B¹< K֕< Y9{m'd ~)vi~(ʛIp NBf3 mxΦ,!A7Y=nƢ5Mܰҙ=CN-p!0gG2O(&{4Juм!x[2*?Ok]HA=:x@Yv`ykR yx6"wOdu2_3GI /T;g:PQҼa/"u,!Spl}m] {C[Jo9ӃP`Ci6!\ͦ._6xeT+'fV˼%-2 QW6W(KÉp]|<7,bzqA�٠KEnn5}egg'?oDr�rEȊga{{;fF)lFA13?ð,2fs85`)Ww36̐3v\~6!(s@<In2~YK%qL"=$S,e|ho?"l\O=OH0C+Q`!h@PLo#;5kkk9Ywzec$UѪsI5sXfffӧO#ʭ`@ukO4o\ BBo�E1YW9oHL#c,`t1@O($IB"GmsEiq.{l\k9,lg)# k۟4 iW97h}sR(ĨZܚDXNU׹<�*<0{F.ģܼyҥKPFIYqI=0KP[0"8l5g*Z%f�F /idcT@H/ oMyW?Otbe6Øׁஒi/SSS}t~'#NjliF(7M;!0j=#i5;Yu=X!%M+Ǎ+o,N? hXqc=g g:#ݤ-Re>1ǃ)|^ZCgH ; HFk5\!_aHD�xF /"FYuiLq\lu`1*hY~3 @W[B4</Жfٯڅ:SܱmvYFĒ1iYX抆!EhTG)?{r}g0I?p- njx8U )4#˅tCrS4p⊈yFcf]w3$ƅ햸{K%̅#6)^w; 59"hj91SQBTuWÒ?P!2sBZl{7B_-Mgʀ>h 4Y'(-IJSێ˖*2Z]c^-W-3@H\fvb@r,6x J g58`000þ�?tA<2ڷnޛF,#H64B[kA{^-XIr*rfӱDM K SJkR2E)Z{ 4l?7<vO8q-|HqE~*q[q7o:@lBtn12g7Ӕ�Y ALx cd0xLdmdE}VI/ J8x I.,+begE7:ڝ?(qv.TKu:pS rP(qDM΁�f�Ƕ}+f_Ѵ{T iX۰t;>_!%8ZL7"-s'YCc h#V.i8?ryI$KOGe=ɱcdža0f<lQj&]#AqQntԽy$挕hP=n i$͝ħ@ GR@(OjIp `a1jِ) Bk)Lv*"l-BMꥌ }@Yѡ!<!c6Z͒v(rl~h6 |ȴ+\;1d;d6ɟޝ 3\Pd&Iw2!bcïrd,3YȒk,G6Ɣvbݣ*'2^z?&]b^S�� �IDAT( Ҫi�NDCQ</+a% ]sƪ&1+Oiˏp#]u$Rx$XuiazJrfQ�KkEpRM/.bՅ X2w;FF`.inLrӲӘcz L+*d,mxAa/,~/cvt,irAY" GkmgD>7ClG83.+(tpfs$SΤrdEpOe;prR1mFLhs~|ihmROz9P\̀ẃS(RFy|1#FgSb0a@s Q_ 'i.\H=Q Iݓ!|DȸIH{sFE=J̰4AB5鎟] f,H0�73Ps9Ec } ŔQ^d@Ǻ3xD0h?.쩩_6OI -21=5* TψaGNyUO:\J}@N!s7ll%ɀH_l 2[|�Mf>MC ovC ?:+!㮃Vް,8V9ێ4�󧩪9U& ?k;+Q_Ph ƥ S*3yǓ<,1SzL.wt5xb,] 쇈ֆÓ?AiOJι,ɬ©iiguVfwÊx3tbGD d28mBNIf--G5NAsFr7 BMjgħ4QH pJ?}b|F}R ?aa3sДj2I)&kn~'8A@=>US˃) qVbCWQ̼ \LRskКsx'YNrLC$ ?- F9 9MEW'Nzz&"ʖrxs9ig?n\?*sLGxcC!}]vW~&''Ak7&'__k So:wyj7w5<&țXvM%=Ɯ]M"\C֫\AJd.}0;>`%.A?�08|('}3>D-EI7 x؜inZ-9c;(,Jw 7XL$[oλq ,S-bG#0,�G&x7nܰCQ�E4agi1чb?"u%P&e~z(`97 367!ѫ0 99䓓KK ܽ؜x.\`{Gur&)ӝ$/T. QZ6nl]6Ё8\[3ba ɝGرLw 7>ca%+wΥKFes!Na_� #r,YOō0 .8rf8,8@MqYS8񒁱IիWyNJȻX"Bw%lo[j6ܽd654rD{FKOOA|(ӄxFaRCCηf^_y; gϞ}tm탽ӭ@̢0Lh�.{͝sQF�>,2ᖦ]ࣃ&IhJ;}6fb1n8~͛7nWfڌA 5\ -mh߻RA(&xg_\\|{s}c@(1_I+cV#& mQ#fO<ШM�3JvT\� `v A9Z͡X2[PWimCW (2@j̑ ^jwc VHaPq # GegHZ}%7:IKC|G;;_[\|-o/G~#y/zRLLbS ;*|ެOr`źp]YF+h8ydyӛ4??CAdȫCF07/�@+�lg6$mnz{0-hԧ666O`훐e3]8@n5 u2%-E;`g_yPy%=0ShFqlXJIOuP% Eۛ�dq1<b3^Cґ<PKmJ%: F|>8]wc?cz׻"%s jEm�U,uҠ.qႹU:)^Tfelmm={6cVz{߳xLHHw(3&n:IZ͓qEbG1Y)ŨhE8 V0e]rOJe*>FKq3Ba's KH<\Ռs2|sfc0�2 y{pO v>Bcz,&Y6dQry!znϝ:mzӧNzk_O曉j@q944&7ozS!$ {mmP2SHB<~Zsa5)wY\\sUzV >chCUH*!m(JhX, 1S*0k,%0t}FAcGgm5F. z^Z\Mh;u3Mx A_'!ɠFb`ƶiĘ (y`8 ;&c)cw6b6^\D6XئE%bR ]PE=EZr60V>O_Wxܟ>C=Կpztwvqp3ɓ'w+_yGmk FgW&z.?E09ψ&O\i"ή[q&봶Hç0![c4�.ԛ]0Ao]dsh[#pUGcU9mCk $W+ Uy"l|gijvǐI'ڬv ?vwıٽ~kpbobG:y]2@pkv .ҙe"vyWnw??zrNc!]xրF![{nrͿkKn~_ڵ&&dKR:d h `ne^~OO֐f*Rfq5 J_=CcL f.GAf͗j Q14oucxS-Uelx0;;{>}'Yfix21^TQh`b!:;v}ݺuY -!HLPf>e%=o 6Xm*-%~Ow"'&&noLNvwZWffDJ/&ŹN2q{Oh+<.Mdf?sc-{{{/^|2rY~H}\x!!־kk'{szloIvҍ,ȁ n{2,f^@@`_pkp.~;ck9ha/ A6nWĄ`C-Ti+#}h`ʘ'&5_i2Zќ:zښliu,--9s橧|m:a+h}xtBP4c;^ �mі9�` O0eb@־gw66~}ann{{EoOnùr~'+]~;zTLaʹbOjngLbpH3V8ԯSVu}Go{9d.,E0:|!HT1_%"(�SP ̦*K5ĕ M?"7%-+L7j>jp XgG`(qڵWZ@$|qYҕA͓Ca,ڎrwg^z@]yl<t7&=dh(RhEwݷ?Y ͳTO ˟ f.{g?~ׯ_>7vƭI-4w^\'8QLlU^<v˲1>O/a?~ѣ b?~%Sҋ2([,!۽|$)D?P. ZieeN3\hYUB&t*)A^P{}&aNC]'{[n% NQo;eh;�(GO3gpcqN Gl7G?殻۾zG jEel:M{ZAl }91O_zڵky_8w�S1Y͋Nբ*:}Wkk3?o~?O֭7ol<Me"_!QA RDG0١5RQQ8ӐGN-6oqq,zn7NU!,Ȧr$,tvSqdxv&_~\׀2㌛n' 4s<=K3 rU}6&p3 @+MQ`nGwRY4Ú %;@2fblL~S6mvwoz%NP+\$H/pV>cn8WXtypo/¹s"D2e+,WXWn&< n>nCƹ79s… kkkֶ=ٿhaaG̏mqwJ{=Yn{rߘ[Xoo=y"׮]+ Mrs!ڰ[ 0>2L/+쟐D})Jk#jyVwpeF[.{=tnwQ91rcAL5JμӑfBLÃ՛[9-5e79 /W�JkʠV~IjM:iXigv dlFnE~ُ9> l MH>ʊ%rE쬷W<C=3<#7o|pᙙWKA#tY&陙p~lv}QIhlR4Z<F]PY:u5r7Msaޛȑ`'X1hۡB4ArdzS lF!>'4눔ɻ+- 򳆒JsAoG%�f\ (nQ5,md)\%|-Hh[V9uW0-;Mѵ]6]qFR(pF؋%phʰO#[e8gԆypTn9�x<ŒwV:srNJ4qNu{ݝwi> m '&+WzgЇ/xi@ٍ"󸗗ctgt )_p&1GM^K T3pu0^fC2= )e vnAn6h| mf'$C8 }#1,b쁹Q3aSR3{og2?Ġ +!(oF{.k2K)ԗ1A<R"jr#|@><β&Nu.,6jS ĕmAIhȎ9o \jĄ>!$.clrek秧vr]{nkSS?tC;4k@ytXg+U]lzmetINO<Ӽ q]P htwrXsW^WV1JWBfycs(O4ٜ@υ}% B:;'|,'KT8 ye=kQ(1ʵF'w9pm6tgfԞs 0Yymb fX-&F/O隦PU훣ǜ~vn3ׯ&yb!gʊEa{{ 2 xq'j s z? #89Z{ն)kjS]LeP%] yb*)(r&cfc[ɞ* Z+ir ™fh&8~ݶH2Ԃ4gf(2zUx%2ouQu ef[3ԅC4rA-GMIcbA2lWd�oI'<Q[Tp,7a8!>ȥ3Gôr^q# (ġ̥`0W],TۦóG {8ܜ!k o+a](RS.eN JMts=W\)JTV ,"⅖br(0%֬Ajrg:Yv9<%@+x.THCؕU, dy`qLO #k"aE9PK# ZlTjFUZGڑO3D~i\zref[JGm1om݇<HDJfmrJbɣjM9sXr9jO]H:fR>L 1|[U%'[ZZZ___YYaӡ]c+"pRRil57ʛNF_g< JRZI#P 4y/8!ТG9 ġZ|h,_\llx=^N4wnlYB*mO@7ERouarAwF#_k^YMI~JF `K7M#CW}Sudp�➂Vl.#n(jqAY)esڠ`6OXrا4Ku!!*MZm<==}ȑ<۷ Oom`kmvb~x~rhtκM@j d<Vnr,6KKϳ=o:bsssEeq/ۢaͅw LGM,51ih)ScVu@$C$_ߤS*ĭsw=z�%һr!e$-l�E. @&N[%%m!3)-e(ǽ)ePƏ$A]+ [ @XZd(}p]b!g=46 XKAvXm' 7;\<78-f7G +3"&eEfuu_p8Rs#lmmu''cb~twwgwwowSS&'˝Ia5j@nr9s5xK&.D}wwxvMq9/w;r, H3Mc\u~v+zQ/{Xު@M7Šq&'-vwwϟ?W2Ν[[[s!!s8A,k s^0ɣIP!5wkH7Q憢mLQsyM% 퍍i),,e$UwyV& =%9ܼ t[ @gY^<nj-{/X+ <Kyf¼K¤H-$Ѥ겒pL4_ LNN[[vA856`\ iZ{D"lTa[\Ρ D4)>n()n<_mIq0)19m_c&`Rpa .Jb86w`pܹo~󛭵b^c|u�NJ?\>p9Q=C gQs;*\,P ..Dl ;4_b 6�� �IDAT%YdY]NP̛Py4Y<l8/_6&>3 GÆC/)jt2؏Y*@ȑ/M^|>J¾w^ 2&י ǟΈa4{#Y>p"gΜ7^n dFC<Lx !2&'"b+�U|HWS2)'*'}HY9 ŋ^jFV6'ՠR !%| zGaQ>; t vd,H@d7[Q\!|UQPGkF7ܪKP- )jaPN %~G6w/'* 4:xeReB�(O6#GzeH,8Y;ߚ~`wg~~Rpypy~wVM D} sbL*0psڇs}0 `LLtѶ eۘ6qOAٌը_o.d'-be{Bac�3`!|kX>_@&& LHSҖdtqmS�RTVd@̮k�YKPa sd?Y~dn["nW4#ks%-ih&۷nݺqʍ7ᷨ;;mG2``T2 Hsdt=T$6jcSxֶWWW/2^Ԟ 'heҚrޚu4oG7ki%囬:2)9bi%Aoi&ӘɡL?&7ۆ o5u,s>cY& b(_:n86k�mӖ il4ne+h%M Kwmpq*QDbgfD7 oy[~}s8ۛՉnCӴuFZyNO۷?gϮ>'ûvw<==5==)3Jn9B/r#Ju$u3$ϊYگ39\ݼyd 9@2/t5N34vus~8V3h׊`H ?Nj,(GdlVWW~P 7F^ӹ;*bccaXRN$~"F(u.,z� @czZPJiB ND(=9z-QZ,ydCcĘxjjj}}=9aCjDU 8@ᴆ)Ǐ;w}_W_]wIez;2>33ͻx_SO _Dәoo2oUPG< _a]30 ~rØarX<%KK70 h0%b\7PK5zA,߿2˲(Co޼DX%?vr&=3G>5??o zgh!4 �ćuqINjn}N|2p�׃G"ʄJAFqo{?5hKEPB-,g<\W( ߨGt?ҾÎ=(I_gff9$I<B(7xjo>}R~_>R#2ȇ <ieh6\ 1~!Ő[GUor1vmn駴'mQiku4i o/|'h-ngFF@ … )؝RӯzիΞ=k6Nr'N;v,DPB;s"[S,~ Eb W'v/ lW9 -|�4 ;sO8Ȳ:u껿WWW}QNp:%r�%FBMG++9ՇF^Gp6o# =y8P<m5W�ZYY fkjeDEҡB'o|`{{bbffZ'M7*Ȓ\i<;ּpFzfC8%{z)u.$_´Y:d:̥stB.l(---{'OQnRyXF$w5 r9_siΛr{r~n¦94y!_]�r-"KK[3@|*۷oz߇{ ٩IOG )#'28U$PQ>%Y%3,'Q6 B*ᄸ4%`.J`c73587E/X (ȢUIX̍VفTh V&(!09~x䃨a#$.PJF8l&jdwnoo?c=ܵkS0uɀu~76^}Иdoo/_ti|#nܸsϻWWWYՀ2Y pW= Z ;0<htB3^X>nk0СSE]P™3gVVVΝ;Gw͜LƅbzH.Psh#76}BB[2(*;+yNȤM6\ -[\xVA);رcsss~y.ʛW Ϣtj2ZpQr%GilG zq’j)D8 <uҥ7o Oo̅eq{';WMLn=;{ejw*$Amր9Aȋ=/B iJN:]ED<iM} ?u뭮kQՀNzM[Xm_Fa2Ž�6664˖kH6>o /.AD wْM&Rav9Ll.u̻L)zb,<A+Sአy$�$6 a{׻޵>iaɭ�Q@MR;fkh3~k J?9E&?*lm:!rb )Vti&=:&&^p/ÿo??̮P/L0q.``GHoB 9'0>VFr'2jOc]cOΧOu{ 0X!/JX8Q2FQZXbX E$@vN`"vp01c=}c{?\?)~_<}_u_M6p99I)jpǏ,rr�+ݔ)>ĉ {&xaa!ZŕQ5^ٸU$;8A 9>8fCl5MN93 ]�YWhX/6'aL:3a>B$Vʕ+Pw!\M\%;2 2E$1et̪it2-]΃yz2˯?{^uonlFϟY#{pғ9C!7b^;�z9|d(ƾ&D0too/:}WL=<|5UF`AC+ ](yGT*{ݲ=PR:KpqiKPͪSH�X-,Q-JArNҠW^y%^Ɛapa̳>88%91q8ޭ!lfn 0X EG9E1vW9?u=Ѣx*'x} ~Ç?2i7,MBErsG�_6mgXVXyJ8<]ޢ֭V /TCO!V>@ �6E`]A65hu\+* ͅ]W{ LB⢾̾DSm"2Y3أ&{d2S\16MqZb+WUum]Rynǻ?6 G*J-5Ϻːsar^aHRD66¸<< J{J0[NG7~7 /0g\iUn+INgu…`JKֹ42Ci"iȕ(VbcUd! #[=|xPPmftK(`SN54<r~<2О"ClCi[n#xY4dp`!Ȳ7Pi9k]>JϪ6uߑCR|bJ@ti%2v:c`:_4,EP>--4J*yq "X9\dPCi>.3W&cZv,cҎ'?ɭO|7o:� ̍SOOpeNR=-l 'Ŵ? Y6'kweHȦIing咰v[7(}i""!5jAȡIr*)Ij1'ZiHtB-g-Z�/Y�(t7y?Jè%b1bo08I( 27hhW7ZLV͵-;a84.o.X3=!XJlZWx ixBړSPFXi~w Yi??ϵkw|hw[X'SFfRU�_YjUd @g\Kwdoq=Nopƴ7GCɭ~]O, Χ3C[ 9<NKLrfŚUYnZd4Er@3`vQrL f`7/Q&HxrS>Ȓ<{OOO`1J|q�@Omg"3 d/*tR?9kףl {Ѐ%exD?qS@ig O87&_-Ja ַ^C&ݳ@-o-̔o9rܡvt#X-vֺP=� M9˛ `jPq9y@PP-v%T$B$�Yx0:]3A&`ml6}bXR342=EC+}P$(lLeZa&Rn&Ct1O�^DN_̐.ܵFW3,$oqJYK%N[ ũjI VbsVmZ`0fCLf'{,;0gff^(evfqr򾙙o;=-(�r*d\OiKXdr$$NWZZ?W%v�do{۞}/�"}_`X4P:�N#;6 \*;04. hAg[[µkמyO~;ŽQ 3IwS22'x<"Ϥ|ǐ63@pE{</PmlFOUtbHVx@rg8Af^uLuni&V+v*!12\|C A-ig1ŖD4&V|E4>DEi#}s HIFUחV noN1SM9 PQFΈLjOgI0ɦ}`Ѭ>pn _λu:~ݻzt~m@ ʙdwJ}Qө)PnI)Ř?q') ,g"؂fTB!+=:]>�3w[ 9sEc(}0-3+36Ru,q2>^يl 8vNV%.yM]smgK`8�n,랰AuC-w}-t;y[v7pWOgE㍍FࠂIIm3 zg<Z-'O&BV1a  [x4[AܵKQ{R%q&aUnȜxN-mv~"[l j% =rޣivI@yen/<H~=ㆊbp I@ \؆CT`4gf~P.r.'�O:Y=[h6zdt)_8"s)兇͙LԀ@stjP̧̩ !G|A>ZPLOal )=. 3ӵn;p_~});.Jluui{$6EN A*A2f>" p%F2DPG )?-Mғ}a'/'{#Dܽ`G{+9B`3_;c+c_,t5uzXfu)TplSA5^VEgAEUѨeȹƚv3idJnթ({م39 �S1TUlZsx </{Nh1yƄgs!MrI6`놊TV8Ї:wӃPs30;TC;aCI=荥 Kɝ+eo/E''맧FvQNOJN8(fyʪB<*4\N3̖)p%B =ҦD弁>}G9vfOct'%\s!#Piw6E >OU-U29=:N߿r.s||C"VH>2EnTrk٣vFʙcGgU{/6OwBܳ$+!h8o]XXhkkkB+Yvд`&f1k2DBmcm1ڔPIoZ$p<QϞ )㒸=ˀd29=`-<nݙLn5833a%\gKB�5$gYv ,i@14g*lB!b*e řXuOr "%syR�` S!!v^7}7=SgM 9rX Z$ߚS3ʗ$J߷'Xe[=u6 y=9H搖zĞf 𔬙ƣ͢?̓ W痗yW_}5Uͤirv8Z8e#%3ыǔGLdM< <xR?=}n2Gٻwv^G_θJoa3cGoOGG_@ HK*tHPl/U(#- hvbsEj+wvRc=ZEf urr|駟@ 90cГ2LbfhY:%OĪ"&[E1{Ŝ#Y*ʄ͍]<g"elg}vuuSF@?})07gE*j29T\nRA:�#b.i TyOfq[@`nnlm0gZ=>᷿m{>|#Y@Nf&y7-|6Y'k(LGF7RN/sx6 Z`~Vs4 [{xxjhS_Rz ƄdbhFQD FM?]e)Nw7"y[ ,{ 9vuht0c36�� �IDATU34O`- XH1W! %QHvVJx;q/~w*,D Yxr [nUx1ÏO w.TxV$)MV\;ѥlfFL> П@#Hi7Foyw|a)v;u*ea0!d򺡶R2=H [QOC<3?^r,<,)ق,fd{:ƼC(R|;s.w*8H[zQ'ݚN C-gHIKȧcm2\pq,:9)L崴sV[vxZl+Urd͌ݚ&oŔ>E2 Y"fff//nmmr18'|<dj:Ԡ}S)naC);)|=,..C(ύM&>x'|ɩg6ʄAFl z3(u/Nw.ѹ;8R0WVVZV< YK Eouc:>Ș*\.MA}vfU 0Xl&CW\UyygVtP߁"ɮ * 9oHڵk^4fUJUx&+ҋ6՜v!YR>"M1B6k$ќi_juE=wttt]3D9qc.Ξ+QCօr-)[LOFOW\mj]XXzM}ÓN~'EfؓO>rg>ܹs_O?}ݻ3<}鄱IV;=~X?8uq AUk;rw|w<˿K/qDZ;d3Z1`C/k彔K(ITI+1Sx+EiU8j6#BxsrkL7ͷm;;;iM=dZdȉƈ{ b5)�fFT#N]TQe!\9,g"Jy(r{f!AjW8~ RoәL]ASR9i D%/8<<L G zК[J $4hoo/f\yHhrJߙ[_};wݻpϷ }ȑc as⟺vHjO=[!oL{aa駟7o޼y5|L0LMMU7Siיes2?Dԓb6m$6MHEW�`0?4akvƆFnIn+/e #?j%%k/f+Ƕ2R.bW$=G|^�ȟr %lBUO�F@`. � <7gAqŵvtnlZKKK^/w{hkkk4 ~xxbHM333u?+m<k)`.}))w7oR~iaN"Gr+ =mj4L!~`&k-gz+ ?``u ς4sj&sQF2dF<3}a% !'1꓄R9S"0Ba˹HS)UdUVn*zXʞ}3 4=En2)૞߷Z$^nIh^ &XrQS+WSB4j9ly}Q`00SrV"o~*faZvVVVz^^^^^_____o6nw~~>`p||ݻ,7ˌ1]x~ySNrX iffrtton_i @HzLAJ,}]ɽTJ]Trf>Ú[p(*,�;vƴ}"j t�59VOd+]"[ 99%"U7MO#!BN췑""U`Fh9i0 Ӎ ~; YS2pò]!nV �4,PO;|<J.9=.@ p;0YW /n`HꩧG.bk<)0!?9=b#^P XURly䑥4`] z{{{ׯ__^^\Ç4$A(er�NNN]ʔ膻4`ibirٕMCmKɹ[Ȝ`:O3F �V/, Hzez22kM^^=3Z9/sTeȹ^ nЦ#o=`$),VY<6$Veu#h6 UN <;\9OiTF\-þuoo/RZ& $V=#/RnfgҧRa2?߫n?W^]\\}Vr-1X||ͧ�''o4 v_~ڵv}ڵ`k9N-..^o~~~cc#޽{)kLNv:l!WHgnFrsrX-'iDɎ蔹^NŨ3lVM袼P"Y* }j'M%2z�(ny{y晟 >,]=r#D2\ϗ&j9<6Gp8$AvS0u.K5Żu8 ' #lov[F.H WCh4C*+ ~4peŴQH\۷oNsz`/-sQ-)kрiKKKnڵkyWWWsmL.*Z֓O>_vmgg'LhNJK<P7~љ~6͵8fSL�UYmx<k%`"�+[q=JWD֫!Xqte~e=L-kh\P B`MO&?ݻ-3 M 9VT#]uIpdOwTED KsX3:cEr%1n'l^<QgN=q"**3Bуo,f mΠhkF,D 4|~/<}Nnju:^N]ZZZ__onwvv8bqNIY~h4:<<z)LǠhH�h[ڻm% [FuWMw o@ *7kV]E[%VL]R"zcڜ]j֒+!ETE9l+ɵmmm}d5X@ԴϖK尞f;Ry)Z щzEISWlT(9y+IJ܂8\\l*,+l:]"�=UBL#c\re~~8ְ }�e+ZxIl#֩kl6ӟ|4gffVWW'V+O"GM"6d3?a*~ϷK":N ؼp+D-U`F芆p8$2X>�䜩H!yY< j3 B[ꅬ."5DT;XwmGϛΜg"&z񫈣A@ݑ >ːs?CStbH8nNgBTUށ֋W'*Zw�whQtӽ|(DϻT,/k5piĹ@y̟T^L�+6 h&|FKɯ+lyGG(~nn.$'xƍW^ `2<#׮]8 M*0k֢2xx 񯬬yd g/52J9n޼Ѯi2zIk%CG LJ�ly0zQ"0q <܆y\|@D\{^d!SHQeixkZ;)2LDa`j!" - yM#֤!Ip+>b'K6ͧUM2>?o2a,%Ez\,PJa6Fʠ ;g!T>ˉm*F:瞇x!󣣣П(4Heț|3N1_o]ryfaz+W<#kkk!\reqqqiin-//MQi  No}k~_#*Rmb j)7<v/~/`00k/2͖r^+k90+ySTGA%@Ƥp-3!4ev g#nATRF1~K<M[4]r.$g+{l%$Gjk1W\X *X1P-;C? 3ǹ`*I"dbK]4[ ԢHy1+L[Pwf6pAh;*5+}Mȭ ;`~~nt:T3Dt;O>r0 գP;+Η_~9*8pFAIP=67|s66*�eBֳ|}]U%d>m:D8vȚkzzNy<P8F܃,U6H&IyPYB>wLAP.C?tRHwH0Xz&{�|^ xӎȦ;s2_pvsP!Iz蓽 c}4rvAF8|9� iZn7SU)DKt: x}LOK)޽{{{{8':t^ n8Rf^|?wˤ[Xgt)gEU1DVYu/{%?z3<m%v�ǂMS刹/%*R"UYA�a|2U:* 9 ݯ&aoCBZU-ɳ@)MHǀA r[P4 ;:*geʶ 4Crs{.9G$5̇{0 x J˜NԾpJCիv KID2{nk1RLp{�̩*O<q||r@Bd:N@ }8)cJj3DzVWWCB%kaiQd)4I=껗U-imSc KAε;_e<mmi`>[̱=٤wV|Gkf5&^ #I | R2 ńlw"D0cn (,EnXttk5~*88|ڼEn[JʑS= J$l<~s?O%S۹Z&04CJw!tzz*zN'byyB7E7t/2EWf8ঠl4y܍7OͿ4+W0иn37Iؕf0/h7ROJNseקB 6ߚ| -SBq2[|E5W5.}x᜙1ɭD^È9&읋 5[͛7!tTȗ!z9U fQlvs.IYlB$ۇY^ ( <"{vcwooԫejJ""UnXVZp�vY�ѐ9  G|�GaXZIo6٨cm�dgggoo/D^7lׯ_/lnn&dZ!G09_5KSH Y5mL}oҙPdIɮޒwVVc>"Hue86@UA;$taw25̝y:ÇK\.Ĺ 9u;2KlRl/7@jWd[oW#lF,qϜ?76|>2꫾*X>*= nb{W]74;8z$ji>ʙm� ďLd3b1}^^xy,ٹ}c?vql3y`||br ?7P vpp o7ќf E' $՘sB;6YDr9-/ZmKܢ$EYI!p DKe[Š:{W$h9m*bj^p<v *9nUS*Rj/kd6kH4~p{DlZ&3=??~g>/| vFdö́->=m0L666~zoo/É.M@r `qpinϴDhpV;O9P8P0vq:q%O�K2%&Issj_v{r~'WVͿwogQ#MC"ābp “5_ZYYA`)WkSbAnr$._`zNڪHyԩ X.es- Ws3$I@y `cHIDϛ[\M*s=Kn?zJW̃8Vu M\-}ːs?<ܫg#iNS8<3R"@t2!-'B~Y[[{MMzfT.[2ZR6 ^}U.\ fӛ1gJKRe69 p@J R'<   duuuuu5 c^=sd}iw~g':xN{o~Y$807sssKKKQlmmܔn~hыl Xɾ:`VFz,0& IPMAtc;imSRu(dQ"c<<lFdusssl}gy:o ʕ+;Ls9˩�t2-.I-t]P4Zht$p<g?�(U +䶭q/lTA+We\sl<=<y%tP9 HAl фZkZWw %oL`O4vvO}˷ 7" GXb8'WFks+1\)&Lerh0Õ7GjExF"{%2H!"UAqѷ}MV˪CoTUuyU<ή%[*ͅirGF\ fHWhHow{?g* L2;T^~@ا%{|9 ,Ov#VÀ'=UWϴfΆ33[js 3t=<c\(j*2S@J-b z;^Y^rrNVcRN__^~yBӉg ut8E$l[3h<wsKq_81=2R': MMm'rϹbϛHT<eE)+/umf^<ڙٗ.s)r=[[[:L/o.XZeqF]:fiD{)r6wY5344g~9JiKk46`cnh^ןfu|~a~~8: u9oM**KTJ-+�� �IDATsIA"BL)(L֤vw~w|G?=WVV¢ND- !( LoJR?#G ?g'[6~0ir981s(!Ւ;0??]to\Fc(ꍁ4Ɛ,ùnO0p+�<Q�ќ )KmV=:Q[VO 1b ct-MKM"D;Kop?:lF2Q}&&ːs5$ĭEoa(4v!tAa&~5^t -&We�"A h |ToQfffKy񏜜|{_;nw{ӯ::zY%Zd2{xkgҀJP6L< L[ idz! /1"x RJӉnq˱11+7޽xdz)O Fh2<(V+ h%%DťubAbHk!,ZilYxݺQFe oUR^]V#"!YCȽBvh%ɤbYm ygVTE"fdHx3RU~!~*1#?Lt޶ #u iTDX9UHkKuCdڡbE9+71aDRm4w_]'~W~Wxh4j)Jy9RB)幣g�|A{њ޺'7;1Q"@2Ӎ??MHҦ[ΐ$rxxx_J~óssÿE?Orw54cݻ[:c-᭵s 5<d$k>??qlE wi'M`1jQkV˞O{N\&Dw6oTcSv9/RPSh#!]_PY4("YuF>*Fb= `Reȹ\RGPaJ+V_İzt;NZ; uzv:[=P$ ̽k0Pc/}7Z}{lyy޽{=v<~efݙF;`<o~w3 !8Q)fq7):XY*UΝ777jp\R&YNU4mHralml̟Yٙ[_暏~gaNJxzxYx<`0H2T- 37aAN*0L8XԠNb<bcX? `Cb}m'wSҼLE lVj{#_#iY;͸<X./<S/0n+ JPV;m_ 9t5}lm 0P @@K %@LmQ4q:˄\F |;֐IL&A>|xΝpXNOsV_?={KKv{vv`wYK?$T2ÛY&ẠUyKB @LfҴ 'pcA#Kommܽ{tqq~js{>`0wߟ6?? fl4(xܤ,-M"AؙyqH꒖9YQn-؇&e</")"XP xyRT'A뭜_c_d;\!#s+XbLʙ.ꋎ~犌AN 9 9@$HSWN|ѳ2�E~ fY( s6v cv+C&.;ܷHi23Ń?drƍ~޽gI߿timOzWnN&F Ї>9$f87-V@9Q4<e D`zHbi&cyF~?;߹=s۽7f.i7r'Ngv'x"p^d$~kk+9ý.2 M 4.?Ia3`:kU"33(�m:2'ȭi4M!{1M5Osh線9&x�]A9_R+C%�y4aƈ ]՟ +ӷG0NA3zX$|ffߚ@̯_O&jݽ{ſuE6ͯ'vࠌg퐪B xl6ciw r8X߶Z 烢+2RU Fѭ[�RFdHb2ZG՗^tLgffoޜ+&O?p/Mx"CR)J!8㝜 p8,虰g{r;Z8/=r'RT=aidi('UzUm(Ɔv�_@mJ|OO{RF(3MIdT`L& x&7H�l~V.CT9<f@-|iO+Ȝ=O (2wIB�P*f'T ηH`KjOtAX%)ߛ_uxən7`dr{!q r\z00lm4 d CxNkH)? !t)[FTH|^XX޸G}tmm!٬Rxew7fggnܸqpLC33A  :r{G^eQ |)}ԣpҬQVYJ^Sڜӣr'2KgȄ{ s B.+N $8P9jTCȡ#�2\mI *\F[Bxq)[3 2 L'bx6t&͞$ESLvѨvzxzZJyp2yhO3[[F /?-33ΰKw;=Jzayjn`QjmKY5!LyGGGVp{{{8nll"%igdiE3&'''ׯ_'f`FٱsC@5F:O9ׅf8/2�3l*`16Nn11D%hk-KlV"ӶY2dW!n/�pO(\0%@OKCPq_ &pɍ| :b]k_U2NS`-]M0e )pI9�*Ky$D < ^aQsL `LgMn?߿?l۷wyxƪ59\`!`_u_w֭R?bk9mfP⏏;N̗(4'qN޾qR( @q2H㠟_YYY^^r Os8>|Çmoo'wg\~[•3h<)y=CWm+0z ^;PjeIch0Ŀ$ x HApLN Ґ6El F5wpEd:x`d& O]i&ṷ޸cHjDr2\X!0?nӡ�+6QW5rZɌ"+rzࠢ2iAKJ5 Xd.8AJƀV)? J)ff7>zYۏƾ~O��:ūO.i0sݥooogT`0ף{Yj"JrH#1 vvv".&`0<)<$  >ajO_Y6403"K~)rHXP Fv___ө=ʔUAJ_0yI0 ;w'xr.򧚝2 r"w/ ГL0H)$1ac4 *3`\25^E%v'`(bRy@XhfL&ߝ3ta~ǧBr xbBS>m zPLh`Nٍ8x2d?tN3ݻB>dB'0G+Nq޽~fVTivy$Pa`&Na|;$;m�ZS;4X5<])z15hT|zp3٪al!̑a$U|gN҈'˜2\&`DH N(NiMP)2P)NNo: 5+[i�!\V1jјҐޭODڵkh{{D"I,Hɣ]4fONNq^xgguLhSyyyyiiiiiinnnss3pï >ZRw޽{Ν;HM%L:`(`gm)[W=VH2LܒN=jSA;L8l -b9&Z 5uA`)R+{>iqJ*:rg6W~i@E].CN1Kpy+U-h?>oE`ړma➍''R(-//7-*-Պeuٖy~0,>l 4 iIKB9dKHS$'MҷOfAfnrؐ$f涴Z`k/=33#ϧx<^[[{ǟ|xguA@簈|@|ʦں{fXyv{{{yLfC"fcVrߘOhBW5!H&G?<2;:ǝh8bt,r5B>4LxBL;0A-♯jIgmFĒ38(MwͤF簚Bl=W2\=Ҫz!qڈzoes'ô ۷V4gw ^RrR[ V ~Ub WÇ޾};'8P$2+4+d^ۨIZޜ"F;8@!&irMS77g8elTWf~>p\vww{hz^Ʌe&B.D5σ666666677`0- =e5s% U]U9hkY/�XZ!Kp Mյ_7o|饗@Ck>UXIq>^skP=l[;[/oֽG^a `%mzD<OIM4J)t<WdE&b$#Va8yzΪ" z\Yw$Dv�`)_լ5\X͛7+)ד(ϸ3.9j{"7yrti0vsfsee%hWrxleee4ݿssj×_~ÇVmo{kE"nr~agg_y[Fٍ=`THk<A_$̅פv8flKQ?@dE dX,a�A ٧HhIPdq?9B~I"&\|4%u=,[$M U/ 9F#=nkkYf5Odw}}A :=D@h2d>#269Z]zVٛVq{93O3C! {>!̓Č+#Ym4=O?}`eP~\fwwwww7mK G4͌g>r9&ܹꫯۡ 8 ϣ)}Tcg9oҙW:n>wggS-d\`L; gMwoߤEstM*z:+hP<G+RP0�c<MǺc 9925 [`r> p`O+~/sԆj49M@H*y ՜rxST@ `V= Ɓw Kn” OD僺`0�%' &{]wv=Xh4j_5_ݻaE:$dNS波Mptt4 2L3( y7`0�ZSa!), +$ȩMaR !rފŀ_miiiyy�*[[Ɋfisx^I̛68"L231#0LpMV ˱ ,p9%CM"tZe]ːs1!-,^9\qທPLc{TB>]]_37tb:�(1V63|WͼJ("[g'Rf{P Ah69sG3JD47ͼb<D{+WZ61rvL`gg'=&@>88GoХؖwnM0NNN\ Fy\N)2^9Lt^%<TJͬmy,e,9~Ev8ޭ` t/C=(2H7|͋/pi'X2\pȡ v+Jhƻ` =ι(OQɯ W~{JҸe䪼{IBk a*nZ^e9jZqv2 hIYN=-iD%3 LF&2ep4w]BWI hCivNrsB@>uO2O3R b *pZeZ^�̚"q�T �d5K&2\c86~Y{ <Y¹gy@3ʙX+*#Q.BN =9؞40sarZrH]5}azO4�J/<c`Y7ҍ>�D,i"à CLr 0eIਚ Nܨv b'333^},�͹:&x.VUc(_?37y*v;a"Mh4_277n#m?'*A cnK:ip J clv@6&Aͽ꬯Xfl2�#6zsA^m;ׂ P+ou؂.óGRд !ǚ7<,%bt&Aeȹxr2P;*~AZdkQ8Ca7f!ɊX~FޜAK pg'-٢nܸt^}՜VgID 8=jʻJ8h&bҭJ4ePӴ9i{0q8rʔ8w=<<|ꩧf|[Vk6׮]3q9<B/=Yy%^' E.aݏʚw.VaRPభYamƑXKԚ)+u3|$~"b"Q)$p4BH͡4cqʀ$V<t؃vpg跳ːsZFʳL{<?ˋڶK$J r66Lg:Y!FYy}y[裏޼yP|Azd<>ni{N/$%ĶdqTcкm1]}$P)a1M@t:3(�� �IDAT'?EIKp8@c=u=~rӌ7@ҸJS+Cv 縱Y$(1S" U'F|APP{ RtE4.GǞGX,@o҄D9yI|'JvAW۳iQq{CiA2'na Ъ%no\/]ԛ5@%)?F&yV&F/͛7sH"#L^n,g|̋sSiV30ܼo8I&3P-*\x|+W2~>*Al)B}G HjĬN9 ҔȄjq+ٳ$W Ras"smyJsLEL}jAUDyw+ @Vhܮ{Q:[%f]WD  c`%zt7stXZӟ//C΅&;mWE!OWKMŀ aGEc%,OG%Ct$QȻT^ \PiB^899y7"Eۃ>_<t0-G_k䞞l6wwws֠t#4`Tԉ%�8 y9ܜs<a#Ol\FhvL&<իW]`< }h1z%y52I9 *̂j1qN0ʝ(RA۰rJΛl=ߐ铔2t(Qy) &{TUWlu?+i])%�hY&\SSaP8 Fʙ:`{vWD"=`<y˕'E1M2"cDDdm0I/GcH8C0h [ȕMr&obH}zzd OXnF|_7TF!M:'[Ѽ<\y(uLDByݏv'ãa 8O疦3B\I((zARD"+gdq.CYOX^fZHm0%" )[H6rdy|L.0e ❰A>׉Ϻ(-k\�aLqE � ,-˻z(*,0$E"9!R9ErEȞ+<ըW|T|7?4h28_ v8٪~c {j[r"_T#pHu7;lP3LD⍖ &OG!*$̵$fL&h,--V/LЇNOOw_?_o߻r}?ߺ ܢfyIs.N.\+P\"Gw٥rБ]m(%+O?Y�dW,F77 Y2nvI]X[YQYotjO7q ATsfO.z�? Lf%3òb,sKgI<.>U؊'ਝ/g"#bf޽zk@^$ !᪤!F"o lf798f^3CPʭC <HY ۦml!^e4^6*re JސHtRIϑjZ>[_nO޹s_յ7HDY[[KYa{P WZEbYtǝ;#l"@@!pqccׅw߹s(V:Pa DVa"mt g9r"jU=L \;N'Jjݬu3% 9DAE2f^ >>):Ʋ.,2$/ ijyNXJ y`?G@vl4ihy]k 5tؙ %d|~~>XpcC3s0F!FΡv�0L73o1~w/\2~o<] 8sը SR ;pLaBהج<<k̭4Tz?<#:hX&J-,,-oy{Ͽ \1{L9/ 3.͔#'U`jqG(7`Bt0,iCW=rЏ!4ːsUTXqOFIm h\Լ>O+vMy�x.Z˱"yS˵YVe-)pfmZDP!US@} {} dR,;^*ќKKK|@+HODfgg[{!q 33p@=Yhs;>g(2‚+ > =}BALcL\fS{K$V[^iZ]bmbu8H+Dfe*縋748XJO-ڷ|"E5Cη#lܹ)ur.,rl 4rI`y<A) /knwwݮ"ޝ- l[m)LHHΙq;[P,^u6iM V](~_dbônC'8yz467Yfk#/`O&~##Xr CF&sr @p.U~+CEece AˬNͪ�~s%p]j䄅[XΫ\Te�) uxUq0]?nK@P۰j0U�r?#^|Y\/A\]5qeOT#i[|AX'uګlNGd吢vjl6!)hG*t3:�ְ:$r~C!I*#·&Tifׇ!p!mdU$e4ܲs3эkߛRۍD[̶)Qd(gʒ\X\s"kr&i9A+*'w_G T4+Wð X LD$&$.zT"Z.iwyͩ?��t$v+ Tv53ꦩ)5\\g:ynFl}PC慌4DѴMɰ+OzŋN'^pPnLHM9}4_Z\\677c[ wNpVI[ˀqbj*"luu5XQIe<vƄhh'ht D+s32kvz_+Z 30VWWsn7!0 nw?a� Bm�SE3 8יC�l4�"L,Xa3,{Re{h`֐Z6 /lx+<DG`{b!]Jv"'*R*C06 "ۣf.?wj/CE7YHX _e|nQȆ7겠Gh9S6�lk P R`\)m_wPDIe@Lە&[elP *2V:L1a^Dب�e?PnSXL&줙=9}2 eg7~/N۾m`ww _$J<`1`0277q t#8 \;I V4u.j<X@c&p SR4q.n3J Y3߀=mVKg6K% C(Ib}&~Vf cmקA!X7ϗ 9"a9g jI6(;{ $g<pbR#$8a)!k3Ԍ5&C&I[tȇ=- t_>e q[A@$I]}SƆ !%N??>w||ͭ~ lʙPff SDFc�A~dN'YV*LHLqӆ1K2Q[RȵPM;GWd� ! Zs1TWEn0qׁ˔i$$s<X0Mq**mEɺ`6Xzr.㒺dz�dM]\[r4^Ӑ[OmOdrlxĞ^ثư'Y WSc d2apC<ɝ&s7\𝙙v9'Q 5R:@9c8eDB)ovO+~wwwnnwrr_|?n/W>??CGAx@?BA ]ٮr~8kbj>`NkJ}T3֙gsқG Ab!D&蚠gަQkxxkUam]S~XL;"1r[@.CǛ$; B&aMz@H90sMJ3rXD_2K9+s LX  T0+79˗ǃU@aOB"3"A%#Aw&X&&7ӕ ]| { y|`_GGG^ě2l<(7ffo{p=xј21JLt:韧~"T0gHSaU\T (b&Yj$=֑ oB0y101V<  2D?o}F#ʦ]pAY 0`DLYI%aE"Rmwr.>ٳ/.;.jeے�Mpjsd@bF a3$T<ӆ]|Pg(� 4id/c N7҃8&Cp 7?== KKKS_^' GF`0 Ӂ:77ڷ~kn7A%[YUBf0dg#CGy+# _B[V 2^/a(й4JɝJ舓A"i:ShRA@6p`3;)|fgAn9XV^bgaST$r&xr.ʁ}[7�"Ѡϙ H,UE3@JN|rc�X'ʼgg|ȁ&GL?H'()Y-) Se;D^ke6QvKZY)+3/!Xx +DdNZ-r6aA9ST J O\OR 2*hRdĈbtKmR~W Gݙ=p0U^m,RD�6~[[Zȥ0Y™nWl*2skK*6!@} y_ku2dd8qJ/"Ϧ4x=}Ia) -w7+'Vhȩg^{Ql6Sbl �Vnl=SE2C4ǘgFH~TgȈ M g=t `O'!A=_6VELTuA<W53>σ@:N lU2fXߕGkek?zErdb<U:shG{[$E=7wcrUcbФu+]D3 FQxş6qr"jg)s4e2TI63L4�$ܬPuR-Jބov3)BRl-͸yWE=UVej' ^a[VP|Na&;XZZJptttxx4a:W^B29sFLD@d:7d!`2˼E-PJ GL`FY3cKN<2]r8y4ֶ^ʝb[2Jcb^&U۶r/h4;LqB2?V)ڌzgUX2;2T{Ң zR1jYXXɑbYIk@0f*D5vt4'w`c*r%;9P'4` ];p8 8pE9i?Iaaa!@)%)#1"$`k{9j00bee%eMu[L~ k&MA9F`ww7̈< E:V3LʩEs  YR/Z��ij 1b�b2c7cVFi2"Tuv�cݕ\[]IZ)(g&Z :喺s+!U*4d6iwr.A`3,& -VWNnXq-GC #w3k2Mq$ڠQWָ£nb?;dss:0ȸe <Kh4BJX/Z[[s^ZDk <SxEa{{{oo/Vŀp<IjK {||H(@SD!_ii)2_33+<, (gDŎ D`E>BLK"IxL<b]Dz�ň0: l T0f`澹چ5 &dQ*q`Za<<c&I3jXlO q'ӗ! 0a_ܫ#6�u=s\&y\Rc^IXF5ҫ*z*fs*JoR;-d5ppSÎlOL)-^zi{{;Oի// {0t礷 ħq$�ۘ/kF[ꄿb\r <1RW 5+0_j9t1nxܷ TRXPtc:hPy4`'.@6P�5Lvf&FYcl?s(t^ 9z!1ByZ2bXQNOO||A)- b݋ND&B-; ]mYYqrЁǍၗI7GZp�bF'*A?шC3Htt/Fׯ///f'L6x˙yψܤ̴iJn{ƍonn"LxВ~.2AyT>{NoHz>YA+gs< #bN&Cdġ )x#ds=߰ � 3(]]]ގb> ^Ac% @FOT-fr7rȘ#/5 �) C (\r.' 6\adt*2M$ ~`0فt2C9(ʀr"-p'̰N "IUD_vH8x[g2̇]륔NC>&4H H"†/V3 R~n~lOm cԯ6E!Pa yBF]O͆=4-4R}pN<' A;ђ)_}w]grm`S5ʙ$]Ú\m p ۈixGΨw5q?-{^ am,i HnuZƛ33n׷iZ`yV=!JL"MjCdt} q)eL40l' \SenQ ͩWr"K$*'aP0A.A%pwN7snHnuOБ-XKLn3KO!WXz�9k3@Sul^Gn b.#[n޽{333[[[.-[dD4x 9Q{7aUnh bnNOTh`2\0=ڔG;P�� �IDATdbc>2�!�>ɞZh3jGt9`̞.$4Y3WX,@3L!T~V,1ȾRLX$LKp2wmMUr"c5~!v|||ݥ^bp8  czp懇U|;ޟ i*]RMN1:FF�c->eS �+ 6d|QYXdZv2looLj=]kgu}ۻ$!$$GBbelʘx\ '.k\cO* S?85TIIr&)<N]@ 2K:Hs{w;_ku8ZYz,;Q3'Ne|Ik44[h5<H2veI$G3[)`,bnZ8 e{kNԷ|b0.˷Д="S&{�h#5fĠ3 8R~y<WӃF3 #g7Q6U`(ggg3A/.I9q :sl-//#;\̼ Ԧyy8rB{'4^rFwyq*K!u lN")Dʜ$~ٷ{&-yQ6)v9�U%8ѫhˆo߆ns—C6S=i{-!:lCoi&ń=459XT9+!d2UN\JkӦNg{$l]ux9|0Lڕ6m|_d//p/\qusr&fW>[eIq̜pdr1d.*AZm|NK,UkGw̍ѓ\nNQz<w&%b@(4yUjq<NFI<xvs큐M,4e&z*'#=f&Y&!M;7H{l`b}9k?Mg]hxnY)L6yb'!H(?v 8$A l'b(@vsJL^! vٶdţa|bz )8+zs"5<&Z.w @AIc}I+"hI Tj9;77@k~z0Ҁi9s&/q8X.\vBa!|,.y`tig[bp_96i ɰ.!8+ֶd| bje]>E,D5mgI+A#Q`]k2EN I{90_aUX3 g1MTpsb�- Ż;#^7v&<hkT؜L;'m-iOMBLj`Ԣklw`!@àQEcl4eehlooQQ2$[6'ɜG B4##)2r&+HIM\apH;L,Zq9Vc }֌qZBd0=1 ,7[%>XxO'TLS' ՃѰ( (9Ůq q' pm & &7)Pg+Qv)*>1BG’L tх4IZD|{Lw}sܹD>:+GҥcJ nMLHN|ks>uUHLYR^dbn=6 v.1`ss3~?2@P+~痗E`8޺u 4p- G,4OvϠIB3dL$dB̃z/eڗ[ D)dI=nFfvTX3y8`4T?nU9 2\ ,;7YZv/Ȇ5B =K1vbD=QP[@ VK4 `ZƋuE+[p8,>�\Ln]ZڹI ۹~_^^q17'sa e#r3yf4<bikky)䮭%D [,#G602N!;Q(gl";!Yoa$FJ& 13iPVrh FxV, ;cFR z^xz{m0VLvȅ$�O6*(_i)s !ulFLE/)t.l+?K?KLAb`0\ 1h^g3(g GuNcI*i~ȳj=Ș+-˿sn8朂1<C!MX \R9 !tYZw˭"#2DX*B|2Z94vT>Tq"2-fNV3M+q W*"D,+C8?a[*/hmm3Hx>y\N! A"\ 㤫eG@&f5DtQ9#5j.u9}+s̲FȋFeEO `5 `BqǷoߎe 4AA28$L.iz'"A!? Q>"An ɦzgE˜_ZZ}8`=mbb7#P{777;Ȓ`_|EH&O/!0#l_m5ОhA97!BN D5h#٭pbC#xMdTK >%,Cjkrz"l>a3Ŝ aF_2sU&<`YY4 H~ Q(7"ٓ '1pW@pwJM3\ [O_ {Yf#4Y*A,jHT=wւ?s8E9^ndSJ9s& Hq> ,̍ZNV`ڇlhz isx/yb`m zZo6 5�Fk5kɠ fPN:m=_�į,?M |dB+P rfb l.n$ 'NS(L6G6?Ns(6 4S#3GQiclBHJ,kk#cb-ܦyP&PXӤa[Zˢ&80=vvv<C(b!L24J —$?p.4w2X?1 CŠ<y H1)]<ҏ& iy|`O |2@4`p 8)85H��u\,tUk nfה?xQ־?pxb~ƄC&m�"O/IF+聕6 dϚ+檲 w6i0PT8s0ɻrZTC IuXh4O!p3A3RdBm{|2 iHVq3SfMB X6aZC:IgmSlZ6KaĸR g8Kp붝ΩWNE$f8& %Zya{tĆƧiݔ"HN+"'!8p9#ֳ1Z f?Ξ;8\^^~i4G] :Lә,YpzΟ6`ʀ hb{/ޜ%"+SWk-pzwR' qY/?qxmwPryiU 2YsPv~BvLњ C:wO# Xc2&sv.E\2`~ICVX%hmV|54]><&L2Վ||;ڷjE-x' .κY3o1NBN�FF - n=ߞÌg]98G{{ =s?vvgݜ9J@7p I.uC"DV+O$sef7#½I@% XxT}b/B9ZΞZ^;:h İl[2e>-C0);?d/0vmx6(=0jټ|*ҍ8s̀Ҍk ӴNe�1.DCh[M,Y6i.dKZ.2w9H*TN0>/ə@^#OD-nGWZ/(.]'ǤDʓs<UyQD@Ɣ#N0+&gNpI: #<G-oyˣ>z_o;8xoo[„<$A5ήh>XdF{G+Vɾ~؜>"4iQ'.F!6t4a39 9˯Y|L ӟK[p K0ZD>-~q>`cp/fNO<@nJtqf=0hS<RrS:ySTAiyR4qЃ J!ȇ$1F@"� (8KBC�}h0<buvߘˏPOBq2@ҍ�vi*5z?{"v~t4WMz//<{66Gw,mn4ji2j.,4)4'b ;v9_Z{iGOMahῺ1==O#9M`[˙k)n'U]�&yXXe  k`lldvC*rxnaaa!;I :"a!,)U3�/s֩4\ln}([n1Ҟanpam)sQqf̅Mgץ35IbEE Y9AٛM/cbw5C5NOvF`> 9ͽCͤJ |tܢpj޺G{׽ugΜݾ?w|?xpxk_/{˗#T: PLo<y&.'sRS 7/t{vzYnBeO?Xr;|xx]C=r_AF/ӚdjIXԔ VWW>emooC#i BP@3&~eU$k4>}:_J./`'$RRjзNJ'xb8~ߌ <P L�@[;"f vaip4Op@H̏)\S *<J=PzWKk5 !nZ$O5Ό'mD`Nf`{i)&OO@R6+K33ݛ7ⳟ}}ч'z/__]Y[zgԇ?Ы_o~3o2Q Ӱ중R*sDG:Uaぱ3??O5tRC. *%փz5_HՀKOd -N{ fnnu{<s]t $+4C#] 38<ƃ҆ SƋI!IEs: Ź__?Z2:yeJ)]̓YM7#NLS ?yhxNbL%@hmyNL=* �(֘G8r=Ƅ5kBT9_,vNkr*q jf8_ݽ_G>K޶v7o?3͛sq=%w&E9O?GޢQT8� q|dXv!E J~vyyykkk~~~qq1)F큰=�42]fPۘ9*#6PUTq1XZZz񕕕%Dat$'Or1PEYpN[1 oxٳg_x+W*P!r)ܔdz;9C#tiAK[[[tb!k4<4 n֓&J4JP`RLbAD2G/ֈY'5�ՃV<"f=Orl$sޭaC>nl9)g]X lfff<|{W=67gO;+?ln=ˋ9;58870&<‰OAk Z8$p_v->9(m"M a/O@,et8PJ̵umoq}xⷾ-͂HuŰ=\P *yvwwY;)ڰÒ://s='`gg'MyDtIcL l}>:_wwwSׂ\1V\՝H{i$dMm:*xěː5RAZmnPl7e㺩= 9 |7oZ?`V0Sxgg'+IJ4#w 88lm-赿}oo}[kkkwFo߆Stp9.GOȱo,z�+I6Mޣl3dq"s :윷(Kp¯]�c&E,fi;\"MǛrxxx+Wt3a,fHyԀ'�dO3Nb5ɄykΩ= O˄I� `Hu_ʨG63a~g]=cv?'.x0= A:NÔb ##q)4I$olldTZxm5@{;h-,X ssO]?.|wLRVH6z9ot'1>&hkqzЬIrp/ %;57Lq:f+X{:=[kUɰd|2jCA7Qˣ @ #\0CMi}yBu̕+W>-,,<sv㝂 sZf=^xy:" fjLƐĉv 6n7)<lg&79qށa10; G :u( ޏA@5xE}rg8^p*7'%A3XW(H)%/w|'| Fƙ ]dsdDŽ@R1lz"x؀݃;Jw) 7,Ka#: 1QX^^η50Dҟ&$L`,ifq;9aSh'<lF'�p\1Ǹ+-,,~+_1׀Ԟ'EZ|fP7YdKT6M#<fZ G<[ӹyX *E6ƾ|ތGka3a>\y6#�ȶ Mt@{r' իn79z>%Н>d<LD)f to[]}n0܅6q qvWNL^/lV1^wܹZ bi9[6�/!4iwy80ntYA.OL#״w\s*|,\9-?gqh�ئs)[FhUVQ,Ky\yqr*KVg%9D'CAHfgqIEk^GӋ0P dTfPPIccn'9 ` V֔8TiVˣss9{5Y'kRlmhb EW^e?S,Asvwǯm:qk@̘D $DCM6vPG}qO�� �IDATtii_ MEã=@l_ܯ5m:^p浒h\aM5+? Ml;I$L9IĨɸkD:&>$aF]23.s#u` -& "KB z*U(ע fFy ]u08>S,V!UGG`@XE %Cyr �Gcqdpښy#jΒoEdco_ ( 挘`f, Tg+=g`~ɸ\bQ&Ս&$kf g6j6/@Vc / Y9)0&;[ɑƱ{` Sw2ȀL\,tt,=o7U*Q+W-oyh%O^�+籰=}YCӅ55\1 `(^&. Kze%&w(S0O<@(=pr &ғs[ۈq!c` sA%(3l<lj vyDLp17}W{o؃&{#);F }рu 4H M)>w܌¸dIRyTB[|'+,pցSiy #N&› 6K(`%щU5AM\4Q=w܁0R$dX얀L|EJ[furNr=S!Y~RXa/ O8/N vҢpLY0gz=S8ἣ�2i2qV[PNKO[Hm^v-Y٢0,Lw/XxIK"xTBxer{ޓBQ%f2EP|!ZΔHD<Rpo,ߔ/$8b,<gƆ@n q[XFkwvvLՅH+nRl=Э"^i f.I5 dH d4v[HPqgkTHf`g_;Ĵ&c`GO/rb&C!f`|#^'BLTIT4�XVsO?WVVhw3gt:m\d9!aĕ+Sy h{?=U;[E[:%%8,q 7]4xs3�rOݳTNxY*[x\LsUMuRV<Z\u |zUŒpd)s~!dj&oYrIa JHd٧9wiެ79 1Dğx֜uyqwK$45AI9�oZebإ-'b[!ihe -⦞8&9:΃>Wgy&55:SWfD(.\a D9Xs|eNc9. sm %G8H)3n|u)tOi5Q!͆F.)< 2fY*e*d6р0f;B/ *р~y,V-Q.̗ =9Mpӫuv8.-lL^e3PS[a@ǔP13$hE$sh&¢)jp�ka.V}^ɈMX 7_@m`PB(묋Jv&PpxΝLH0M9 8L"xjC'|ڝU|% BM*SuEĊ&nirH I-wǧі0fT嶹Ym}0js e/]w=f[pkCR#7Ɋ Zm г\&.kMV:M(h;*d;{g? 0A^1Է�u+RÚoKVO �H܅f|dxZ X]VWW066'{<e:)6u,M~Ӽ##ى[#̬_-QL^CxZBS:M�׬H8;nRˡid.Z2L1ՐiqLs%U-�fgjȚdCE ӊi Z>t m 灨94п1- G<:f56`kxsl?'_`=a:` ZRT8NfFd \G Lx8N/L| Vؽ&6nA96%M\vN]=f=hPn''DgxS)\rU0HsF0vMnRJL|T8]`ۍpBca 0b瞽F8栴]؂ŵIǏx?r>prorBBQbc@Rlnbœ4VucxfOqj>H1djxqqv2s5_ ^$`>XkON2h0n!m ;&˺j: i:qa{]w\�WK'L] xJ]I*S6Y?՚nڻ^dzlSʲ_;D0hGD?MWmmm2Ϭ1xd&R`=qezI uvȳ3EP=kn- ̹[fPq3{IuΆB!f>N/-�Ca�z0gt9~lbv%`#kn jPhʚ�:d_ ōaCʑ\=`EFфfdļX/wc2`qM<CF "m^jMH5'IY;goo"Yz<̨҂rbLJB͞Q09^-}f7j{Vqd:BIm )k+ |zxkDAZVHZ lcK߂Rٔ6,ZM/jGQ]^ğK h "&Ya"$�1 h&iG`k(8GHT]j{]wp*<(2pդihOSw-CWfԙf)=]&صV*Ԏ`bQAͅAQ*W+*x̙0[ Ɂs',?Ӝ"ǚbJh^QX^ȱBQiR|$˶7R-k'pW#9-gN$oܹs>``CR8Jb.,_v&CGL7rh&#Kެ i/}$|czR8*IȟR9̔jӆ>Cy{^pp ={4=ҧeX %) -&Ή\0ܓٳ^/ϓMn\F]XXX^^fL%ńvGyԩS5P|moxy3bP'@҄Kִ#1/X^KLG"퀮nEDn yƼ\=,[3VL:;;co%`3!�.Ƕ~tTCt:sϹsn`yPu;%ص4Eկٰv8֎?�Ԙ2u>C<o1^E�.8<lA1)ӧcbś7os=.#'*> =lW]ؘ@\Z >ҩ^aW?4QUϓwrz?`J`U{ iн̛k[]]ؠKaU 8c{Hgz %ߤ5aI)Ɣ0+2 lC2"RYv eenBX�'Vsk�sgyŋNvaNj|aÜKu;;au ?=#7^>3``llI97)z<8Kmf,:ԿG MB7G}t8>3W\x^&FXjɬ0177W )8v2*x:[$^Fi;hte'CDfff&DS Fjbke7}:$r4ZOz 8([ghYB6ewaZ\A2?Bw^�T³hY$f$}VVVm.M!o*a[&F6ԋPWQ7nLB9VѢI9f�)/]e`FIa|e,r_&8'(cׯ_4a4"e)Ys񓟆8CatѩC9=!mZ e  ɓӋ<P޴zuk�cSPeUKq0< lH ,,,lnnZoZ)C]/ XVW^P2dg8XtE+㊆<3ٍkGވ3'uJm(ႊf 4HFVA8$6hB|Burt5{jg!+ l�Vݖ7]"T,ِ[;qpN;FfT  &ZZu %uA4օPi+|c^]7'韵 oM0b RRYXlӸQv  ]@B5Cq"oY6AIfyPS:awm lݐc0OL kx&4j,6Jgp|xaRg:x=f"[/gӋpAؒD>bcT9 9ͭB,k<v0iDa4y V3l8zKNS4=j5~0lnn;-nAN.B)y,P(63!lNgˉ) /=u-c.no!{B0ҊҐ̀OhaB7ˈ+ 5�V,Β'f ˔zIq;W{7BsL 3Bfw ^k<"3. jt=E<U F4Y9'nRMAbļ{c%}V|\2? 0 l /p+<'%Wx26=n Db1Id0li~.Y `lxzΘЃ)*MFwvUC. reTwyf bN]|(N8bFIS>-57["Y}Uԭ5`y. >]=U�1WH oUEW&miWf IB}z2ueo9 9KI}6yV'(\x02&Cs>(jc{)na2`*zX(2 yJ0dvvvE=] |É ||NqgƓI]tJ>Dא $x>d9)l@UMa8�DQ|q6I #IDZ/oJ-iP"2W$!x6Q7& #l4D>`p;[i5^^^^ n*NmH`A �maa̙3# X < 9f9,P&guӀ\% OiF1F5E&iM|f{w8^r%TaBSTA "b0;GN@a H�bq󲘖 y#vԆ̊(Y8p$:Jd2.s0e"YƉ/pYx.{hwReGd�agRq@odC g<Ŋ,mXfkOXy#=zϓaM/=Ys<UwU XLcN7h"=|jzX` '>y~'n߾}ƍUwhlށЁL1 3L�79,!ͳA2Vnf8J _a Y[qIw+dCd!$fHJr` $ f!SL4ihZE4̈0RÒjkz;;; /MHDÆ<yd45We �Ź)B-* �]Bmg@ 8ΫKi04&SbtR?j(Kc&dq\+\n"iEQ"P^')X)g3Aڔ=MBt:.\ ;PN q4 -4bpK ̫>}:XmnbSt_v>çwaK!'&ȱ94)\R+Na?10y=KݎQX۰Iϟ?xǵk|}}Uݤ)YOkoGezl�*sv%f@ϙ}I!2g8&LG졆 $ginb9B2xݰvb)8@.=dˡT/=m2m(M/,,ooo{{T"`J2֎H2n qf55D� A.nJ8:Qjgdɣ GeiXC)VE#R`¸"RFpDƒM%Lͷ=IV7}{gjgg{=kvڗ鄯A@-WcY7sb>DS؋;saxy;ZtǽtNcּl՗f6f+I9ӧx[nQ0ŀkmqˇCg2$w><<? r�(_i{oPX0j_&Sg#ܾŧ8g.M  P{we38"[WlЈdlWvmdbFlE>^�MG̻%K�Ŋ^up™4<W\YYYa"M/!$C*,?٭0׭HO I/UX쌅 9^C@ᵛUoGt1cI8Nz9|M2Dr+si!E tf6;qO}'~~ҥKGtl3E^ۨm'h~UYhEwh9IW)�rQ68!#`48^" 95R =<{D~*#0Gqb3򸚤6 r5ׯ_O3;;[kKM%er$hKPlXN=1�*/K/m"[i ڛZăHɹrRXu�3lPn4m ɐr9oføV)-d6}"V!:$0璿a}L`Ƒad̥U v'[[[d|VB? : HGV-Ȋn). ގJ:Fh>z۷Xpںf/=SHpz_K<;xG>l4K`0@4>o>~;?3dpն4?@Pe7)MjǬ|~HfXpŰ ]qm 6x"=Nkv\L['&2JLyr>u*J,'+5x>4.%3RN@⠤3ؓ*xBfZU d } 8xD/^xʕ;vם0g QIɽ#gJ[O43ٖ6n+&+j \ acbbm΁,e{ t@vb 7@af啱Io rNx_a$V"2CuoBF�� �IDATUHP3Ma8Z-z+3q< ,T`ܘ6_:R@ XAh#t~0ն^'?Mz&lI/{"2+Lr] Hu/�> wWVVdČM)vTŔ9#9/$0Aܷ@i],'vGUd}]iOՊp݇ �G?{xA?@%7 [\\3Dg�rC'[zss//ԡ<%௳ >sՙ_{@Ue&/Spbwx2EE`?ۂ K-~ԩ٫W@ + pV~-i(d$iGҠ%±H+YBeq/"3trA@2ŮnG*8RI,g,ͽdO稹 Cp=('h Jv+ NEb?<7 Gn+x=2*"ܸ6%`>E r/0-LwAQ Mf4-aaM-JȎP!(ieS`w~5 zS;0 A}V|`u\%h5ߏTLVÁ"քg 6Ħy .ļi: ;Ӻ@&vBygJȜ}D;2УIs i&&ړ'1afu3ͅ4D3-?3g;Pυ.�A12Ӥ@aBw4@d % , _a˭/iF}Fx*|'M oOXvqԗ+%N-yl]4_6 ~tݚRN6Mi8]FoLz WE)J 0K,CQivtɬ"c0zHdH.& hR2 pHx}wr޺ `=-'8PCvwwwufps7|acֶ O#Erf yIIO;Wre]G2S"K yV</ r;b݁�TT >v5Oe=ʂ#ZXX@P*}:eʒ֗<H_RuͫG,AeP;:]@2*,ސ<=5 FVQ\ᱭ, @{IiӀU/9,:m8?57QNN͠fH{�;=,:(B]+ t+ k[3ct�Ձ+f^/l@kJ <iilx  á]ydn2I2`5Ư8c¬KpQ|2u<EV^0[_A^+C4DMB#E2�+Z8.L1!BrAN%BwҺRbǙP7Mh(Z7Aj &1'!H,]ejfM[x7q(ggHh~gW]/L_VpA `z_ӊeN8" SR%˥%N;M2M4cD>Ovj!dqh~A[zo#S ۸ %KS 9KQE&M+ٳggggU3MFݛ$OyP6&7HkJļW^%=@B.+g+|h4 {ڀҺ's91+ m5L({ɒ ؄K`=!Beȗ#6J0n,ݗ\oeÔ 春ԎX2`LÆpgffsΙ<Jv.@h <`k/rZx V+ O:Wzii o_tG#WAPӡgc?p"KН ܹsKKK旧YHA@2vQ sI<P %/kA؄,Oht+w3N(YEtӼVQ I$s~E43xއ~xyy <}4iGg'<rc{{6k7K%?e~6rwWai^$UnN{Μ96)'D'b<bk@$Ln2X$yړ90O^,⽽Yfz=yϽޛ[[ZZ:{,*d9?=|G  6Moٟ7 TWWWwvv ݐS b THEMTzOfMu.;[}5ҹTc"GƙQ8%CvQ�>u($J vUN?0"ŷmKKKg9$nn*#2 !zp(L 04D[9,DoɚM,S/fx-BY(N |"wrG͛7ʻH}I>O/umQJ8XYt9Y<^\ressm")g=.|:.\|'Sdmi0n7G[2!+F0't.kړ[)* ^5<g}`=EXF aĖPTGr'D@aT*ϥLalRxMy$)lvC:>@- ';@PkҸ i�V]�MJ!yN:ȕxZe9,m6m0�dfffkk+eyܱXhvvvmmɴ8mGv~\ (Ea_oD(Ho#4 o M7x-ZA(-2HՒFO> t3?fu'ϭM;c  A}2E"Oc~2נ�Bn.Y ArЍaSl,gҢ N\AGHt=&.qv4FQeLo‚ppV]>H4j Anr' =`Z;n1 M3oӉID4uwC<texLV Im=Gwȯ.3rym)"IbK e0}q)>u `!xYI<f9W�zE} �&"lO,q rm2WI*9u/٤ʻ+Nv!)3�W\> 3ȓQ Zzܬu]n*S#yK`}W;4M2 Gԋ/@@Wpq#=.HwQ/ +۝x(`\ӄ#5M)c@A]s[_Fxe9�S0Ĝs Z>-" ==P{9%CT1̓a:''!6*fR6Eh2g�iRXd/zKKK񶰒"MZ084�b4/Q'UzϘ4ϖjfmB8:G`d?)9ykr -Uk'gQu*bYXa֥͛!1۶(IKSp!E4Mu Nrł7$d(O&} JF+t<t|#56˸Lk׮e%3ٓ,}�,Fo_\\| s{2a5ymG-ýzu)p Ku!7bB\�̱yt KB`*:+&T[N2sHkI9*F (X=w?o| gz6eV #oN]ÍaRxf`Y5h6_6.omm NE;M$j(r(qR.z}0x Y60"3yrN);h{@{pS++'H=AͲ%^Xpaq(sZ4m$l'2Um"YLnb+5@/n�bt^Id !r&:qL-s<+0C /׾o޼yŰ*_6QL1A�xMze̓8Gn RlDf=5Xollǰq lop't}yK+-9h,//Ý0<"ہ\v'tn}iԔ)KѩYWެ&73[ݮt3ǺőI#¸|Adᛠ$dU@^t;&?lFAQ7a"\aydGaEmf.H+fqQ$|7 "l`Eֺ7>Oo&Ve6MԬ FXHp"CJ0),P£ȍt:mP6FR>و"%I7 $ :OxoCF<Sb΃H~3 su֕+W|;@_Q^x% \U"*|m"£s[d{((Wy#b0]RAel%j_0K#S>4B(mt}J"6Uǵ{&U٭,{dYE?}aikBI9:(EgLjX޺u =\MZE|hn|Sَg2οlr̅|׿җy @΄|:(M7vs&]'&mv*`Q~<0 ~i:JLB$hqia~v˺ufK)"4ib"R\¦f,|Xa:'#]<tmYYDpkiL5הۺ<X@N4~I+—s$Rҗs<ƼC5jȲ�&PIC>R5o|F~\7ol]ѯ5xez{{{w988قi`5.*1cV۞pc`}}sZ2VHhz衇ַ޺u_;w<6H3�a!'ҳ͓,d,-U0NK f( ٷFaZfZ<e.'9DV �sb5ď(4ޓb/�R5yXd6 +* ^rQ@=*y]=_aR,-KE-]'y=Is?+Pڔ ۞t ZfC[]?QI%'P8p8rիWNoͦejڬ2L<g�.̐Xrq3("*~''>7n܈Iervj!ӎxKٓFrqҭ`Gӧ| ].,JvyaX/=K~9z Y%|t$ [n#on ;sIc bCtg0\��k?Ν{o1_1 R4H$FcͽOwjNgqk3֝i9PC9={ڞ=m8,lZx5ak-&̚5c; n71A<vK. dufXlllK� 5$1L;yGS-EԦ(0q0xC ]+>k3?_ON#wd͜ȃnY'dGc ĕ[aZedB™aJ4/B :aNj9\>b8 )< g}}ڵk晀cϟ?y晍 "B:" } jsn<~࠵WpyymRE'QYMJc\Ҝi8q9 Lo11---y� lל;Ԃyh۞ZɎMυ"l�DFO|_җܹs Eϡ9yXn8\C.|Y5[NYO/8Hr0#z wΎ!FߣA>X3nrZy KKKG4%4Y<MjgΜ,=HS3`'F;A5>[)j aq'^w)C< 9iSK/S4U+;se&ᨦ i9/u:_vmnnn~%Z__oN! bq[! 4 :ʖJrhAM`qSY7ΌF^zhO{vi rD+IP,Rvܹ6"f[eΌDJdX4%Ef!'S|.ӥzQg |,s$`Sm`(WM\<^K00\VD)Lv?[o۟&u+VD~wߥKRʻtٱNt˴hVѰ }՛+dšLk:u*I9N�eTFӅ<6 u�4'` R@nN 濿O^ݭ7RnML3h1-_O[XRpgneV0('r fSb4w~wqp<pZ~33`{<d1ߑ; 8n 8w0,p-3:259"Fl@Nekhٳt)6@= 3iNFoiQq淋lTC J FWo~ܗYHiVl7n$&W|.Rm"]t@$K"P^c Q& �<rЍ #'!آ[%1{쏶)!c!"K]^^?8g[[}O?p4&U>h;Re 98>-pt{ܼI<Fst{{~j43gffg?zxIlF4WG`XH- B faY&Fb@UMP/Ƥt6hDra.Y 706QU"8'rB%JlTw^O'>񉕕7ܺԶ- As'\zuuu;b,H YJO PGqnS1EZi_DzZxʣp.&BGMYԠ x9;O9)m! v2fvvٞ ],}>/ K A"/ě"ZziGUos9(5y#\./.pLh4sx۝///w}Ν_t#/N"K38LYg#Ltx(BLqF0/L. ؙX Sހ{Ӕn/MóNpӀz8<m&LƋb5<NRWyfI"<VЅ OАu$]|t^|L]~8PӀ6k>q"^5SH଻/kXb ⧞jbj {SfokM)X 0]OBqV!v ,,DCI 4k"H [k_Ƌ/v\?.SHѓ8dbgM6ܿ~o&^O`M%M ˞D>߼OMoz?q�� �IDATgx~pBȇPVrjsyc<:r&&@A`C2E{46<N<µe`F(3(>hLRvo(ɲ4sӣLC ?3;`?oz#,rTm*4lZJOd'|5PʚU.{|Fh1eDihgE tdsRsFSˇazW)q=|f7;snz꩝K.qoo83s۝t :i$[lIS#`eP8<ggD?ߘř˓4[:@4\\XX8>׿/_rͫWfq�S`:]LeUi=bc̕{ XR !v7Ƙafc'|os`tI766.\`LR;dii)&ABd5۷]FU(/B5ځwySkpܹ-Ɛ l~T~VM i$ yє>tB,s̽Y.}ﹹ$fj9gKm"j;-coff~}o{?ǯ۽:Np"ji^Sk&:E37MCS٭ FM^.7oLʉ=bp{{o0X[qƽ{ƍ[nuýö]%İL63p'*<$h\9h+P8_MR.%w)3 0cJӾ?L6qWI+r @?&dipI677�LjnUohX"lEpg̎gy&ۖ fI=s` K977w)vsۥ@nSւඐ�'U1 _T�F-$.s ^dˣv|$5c?=巎F/޹ZB[, Pp2Oz-14 w9r[ٳsssg4϶_}pQ7pNOx4W ~muWrq¢Ȏ36Z/6u2R-3 (t<@XJΛe.�s~WVy AǦ�<?5k:svABtnr9ˆI㠈YJ 5]Fؤ_;JIӪ�Ne+:uG|k0MteCBJWGFQ<HIv>־WM1!&t&VA@RP[`1ڗ=kgg<lwfp<;οvw%3db OqQeA߹gΜp7OFrk,=>933s8ǟyΏ>SO= >67@|=N Z K♀Q VFK�k/Ksz\xo^ V l.i3OJ/ B*@4i~`8|hnZkN_Ϸ7 A c&y[gX킬II=-x.y3t� dzmx`�^>B1E=dg2(B0 +'I96 EnGЉqNK1>|s#tȓw=@8& wAݥpnݐ3!Ν;wu{WիWά;ɥe]0x<Fgc~`QUZAD&ol).|�pR5\!s҂r%uԞ0צ6^"㫜bKͽ`'<GffG{9۵'7, {ľlmt ҥKnkT4Fݩby,'I6h$kD)Ӧp,"ߜov:7?1 oATU(m2Ü'E!R%DF3,f^VkmpcmgY^^~`{e*mvhi#Cux<~avKK�X�D+DWaQ<�nW\pU[O'QQ ];/X,ck n7&#dž 3XCz5pB#:x<tfggrkov-oyvʕ3ϼa8̣i&"3oG =+mZ}s G9] c1Ӗ?f=O KZׂxE6_ȁ&ڡS@ 3tW cP5aeg͗qz99lQ[H..1\4?PIME SZx2=`zr"#1pc0ꙙO׮ޟɟȝ;ؤs0^QlZ<vD>`a;HaGlYk ]FS {偓! uv,s2GUkS~Aeuԙ5 joI\Kl)~0"~66~_}cw^N33AGhv`@r6C-� ]կ) Oj7Rb%{sIe7-4%{﷉),Pь-d˽ʀ_(mc f#6u}Qe[|߄QHB-2Ӌӹ7R~s݇'1l]ϠXڎSAO3MEAK>.&oJik.qNya5/*B;?,ŻұxfT=.y[~D><l7Moz]w7~ﭮ/Wc %Hň莗f+nϠDtFQzuc3Ii}6VWc bWN Ҿb4dGZx*"5k@9~` XLF�ؘ,?f.&o*l:L>@y&+ni;dTlNNg~<~`?Gpx^ JZ`\P tbcM&҉FBaȬސ40 E_":ad>gn`zx)9Ntٓ=\[&Tڀe@[+6ߒs_|1^~`0[JcKQyh@%o�K,L6zuu4ȳ/zbaP(\t fpNv>r|tm'Ϧ P, "U<@A>ɱ;I6= 9r9 H:,L~P6->fsHm[\{opJ.L\yTf ~~45Ϳ2?ߙ`>} \z/ԗt]|_N$ H|<bە [&se]M;NώBS[\zz(zL96wrZќFg?^UKկgff$!" &U i<['C(w-p$A@ ȟ1H=�#Xaq zTȫ,M`ȯy#<BY: 1'czx+O;Γ|ÜJv Θx@w\d9c Z2ٲ e$%6MnBf'yl3c�C\<a`YJB J&0g4ǟHcMA =^QF:=A$)}c~',)K(j8P0bB&M!ڣ<=Twvjsi0xն?7|xvOd0ւ@ :bD Ӛ8'͝={vfff}}ݳ)"I4tFI3̼ gȞ';B)}bk  Ȣ 5N4֎箻zᇟz)R*/kX(2@YC=W/4\STɏ�v/$p~hPq��BOrGgϞ}G_zׯrngP&d"Pmu y%Ԡz)wddǶIA'nK{ڛg_^V45ÈCLO>kL Pkqvn'/<?\kmjnUd+pu6|w )VVV|{i#J"ȋF+M5if eH &F$pg1@I:=lk#+pP~:.T$|gccPcݿ!U�WZ j[dyi31Q\n,]`Jܕ5}~&ɬ&aٝB褙)6VEY(_E3 r&HrNaYi7nN�bqoSxռ8i,-rvԆ2UMxRT5Bstӹ8?㋳N3y_9+#BfDnܭ1 X|@7c a9�M-Hd[�vRg` X"%˚ur+Da\Uǯ$F\ r{rg{{<x1A <X$5P6MPV9U`-Z׮<+-~e5$7WVV]|N;V$�7l@{1X<u6ےaFjS� ;pٳ]qRO//wntFx<ޝդωH$^NV֮:?!_![@Rje"wgg3S53 633+B e M>I2=%H<l#ӤQdqwO/xl*TivU>hh4 L{l.`0^O3vRB@QqFF8 9.tdrXfs0![Iz;+Mj@mj9&99CRw%G'JbhT ByV֒#z|K ksu~gw<Tw<n}eaaӹo4~#KK^2y&tK $֢0_IyY6%-5׽Dega&k;s)%yX{}2eZ irIsˁ7 ;"y$.k r,C ؓ ""x!& �$־+'~^%ogsJR8 96crXɱY Y6qrL#zܧI8K X%[cNi.uZg a2-آ<LgQD )A٨ٙFa �YnJ{;<>ã]yٳg/\_w (4Cy[E[+fpprrw-`pK򗘻JD=fFnW \͸OTig^ְg`ffC&㵧eeV-- Mjaoh YnXt}]]4O6�*j< 9cC#IyeSgt {9. Ȗ^ iT Wo#֢XR ha;'�8P� }֛<�} #֜.ra闈pccvvoߏWutW?͏}>w&=,榱 i웞b|ٳgᄉ7nMb`$)!rU`Oּ ^;gĦ(bȵP>`Xp|]DTp)N݉V).+ `kc2BE\Ċy \I҅/SlX$<mP_jAH%L$*I9`d#DCg-F4Dc\VOwv㽸7,U>d,Nč}s3lBvogՎ*gѓ3<"ڿa"tkRoxg~f|ͣͽ=3Y@M䶃$jx #SKh:uG~G~~쓟> Z4h\#HLWivvvyy~:&~bm^+=�)8ô 9M"1k5{t)ksl5w C) Pɩ<z8dR -ݭB #~ .t9q0QrW-@ "6&dǐ'cy=&~$<g&؀1䐰FMBh!vIHH-VuWu-]oR%ۙ3@ ?8U-~<^rvU~[̠ d*ͶBFyd}iD kghBI�V_'Lsl?1g9FX4|38*n.|=<Ct]-$v0GPtS:@dxSjqF(/Rԩ &N6n<gC̙3ٽ{o~s>nΝ;ퟛ奌(X%v^w3>QRZRٸq?n:^ʏPAa�gOZ}70=P~/b!B/b("äVЀ$. u&d+uaE'%1\N)JF)+'tS{YG ).4=;bBѡ ;ӚF#ZJp}W'f'E'ڏb@h~L 6gɢT8h?�G5w!b됁~ɈE0T UhL&pQ>HQPpxvU3pkD4n8R{n\Ti 2g)y s*:C)O_^X7^,ׯ_uV6{)js0b]ch:bi_ ^?(AyA09NU8 RU Ȯ +wBt(+Z]~l=!+âDB" ftP]:*qy5J $u(( WfucZI08vA�T3|^,[C Xد뚸ݡFWvLNA+ y7n, 2NfnM;p jqT_wwݻvG~zj֬(/_>{CCC{|Tڎ;I&=ӻwnn[96ϭr7 X�^W}l\řZyWlFd̑)bhW6KbXci9W3 u3t: (ϽDꔨ0Mv_*oT<c/jMR1 j',ԡ>�B@M"t >QM8Z ~Ѳݬ2-O\C۔hψ%/ z&Kt>ŢfTjuC+ Vk x<8* |jj5$ԣn6x}:V:qӦi_{ҥKygy۶5zJNzǯZ*v6MJT*&PqLLF4U s6BuW;JcwRS2jĮZEl_)/+PM+B<d~^$eTA Ƞ ^/$dN ;8Ԡ(~Z ȣ3d\8e PvD@,4iR>7KZkfzM2kBfF-333(ژ, GIm+eR_T h?TR*Iar5j{V+ 2GZ& h̩Ɔj^H@xqBH:]yn8FF֋C姟~z.5O�� �IDATtTl.AvЪ3J%>-f EuQ{O^Q[/괜p ,"x:jH@;O:]@ <fgWܪ)7Ķ1EQZ�;Jhe7^1t-\n;FA.Es[s Z2EU&ʒQvfF8NTU;a0,jqz)q_4E<bTT͐XpyNf(v0x>:�NC|$Zשԑ|Xo۷FF{yr ٣}% v7W/Rjgg#PҀprŠ>E,o.vk<J,E�vKx$tUuG]$i]!6t4iXqnJ^l$$U$u- xT37OP@unt\�lӔ` u*Mly m{tOesg�0?<{Zqk`}@Ց{ISOuZhRto<ɴ1dXeLm$CO9<cWA�LS*CZ)T_nP!Փ0TyMtA`s4o{kAenFНHi($zhGl֦T^;��bʧI%]ųBX 6XBNP (% ioiqa {­FA+lרdp [D.ϓ҈%: 'fp sd~b.uBcWZ@#0o4p65V5(WP/ jYLc1BԎ3lP(Q.8N|*OAgbĵD7`|}\ j~KT2mP$[ NX0EUUS̱:\ Mt yV`Ĕ>iΘPETњU!c4i|=*uL\ϕk�AƩu()#Qp9-`@M�p#k ~iR褺֋5]P\;x@ӓJC h#7gW4q ԔC K:a& ='5p6̨̐zC٩[[^Ӕ"Y0.L9E!a=O:0HeF`{S0$(*fT*˦L-8N3WĬVsBFӣЖO3*P6 {ȚQ5Ǡ}Sbv;5#`>{aT�"$1&au2r,-oj8i=wC^QN`OI*9ؤ2 UԩZR,OjV1pصR &yDZyWܒۃ硤ra?)"ot%r˜ #j+tv6 K̨dqBlFXڷǘz+)s?` Dkd(ЙQf?>S rP8QpcIR-Aԩ�+lHH%xDLkT%PZ-e5xtWN0:AhaÉȬj=xHlWGZ ^ǃC6ת:ehE#FR-)أh? @;A}BNM_Eƛ!sf�>CTFLEژۗ4i CmXcI{ W*P@<Jy\3\SՈtvv*`Ǭ3c~M(l\c& #I)kQE $Qy9!Q&1"=E!YzG6Zתga{b>Y:E[P,԰`Ācwpl|*l koJc;;cX.[}lDH$c|*eyƹ#)*z uCo�*CS GBEo,ˍVba::}tƂtac@;Jz.*!r6!ݱ3kjUe4!ƧO$ Z 4%yzqdɒ_~YXɕ儱wEcH>U4I؇!DR �g KOؕ GI �V"};www[9ԣ``{RUi(@2 q"}w*Xe84Ig|JmT*p�n'{^UfaVm{%&]>IdD<(p9Iq,84ڵZ?:jYoᣣHZl}<E*'92W›x< 3FS O-:qc, `@U(6F*cFJ?4@kZ}*O�BPSZ*J:Z3]]]}}}Gyڵk)oFj:&֜LE2ъ%y}B/;�C9z<o I] 2&QIav=:7M�@(j"jf0g)Qd|QqTM׽Q3/_(ͷ*Ŷ%: W)HȀ; ijuE2y_Gnjb.ׇG>((#w®i]]R@/Τ6�Ar݈Z|O ZeBkK?*y(F U{=L;H`<[gggooH6E|W 41si&{%f@WZvڝ;wj7nM"@y <>x?ͺy Հ(]h.sKuo=)A�S LxrOղU(R#L|PiИD0rF(#5ںSKcձ1e^T*| FIVՂ>jZTUSs=6eJ":<|ktk^ItUڒF1ZJOOp㕂4#+T)Y=/ON,aNT|0Jf(T*522Ҭ5\*zGE(~OOϧ?O<q+V 4r)@.VI<мrIT,aaE7T7~H ;R�&lu�~8 <"}=~r +f}tkzB]cΑ3W K)JZJ:԰*i ͜,QM2QYX, P5, o__駟ykZ\963ÂVp9-+mc?Vo}vtww?O=Էb_W6B7L_xCVhҼP |�  k0288APfzN8tΙjDbF_ߔ'q'O޳gϖ-[hj6&m8C[ƀ5c"0<dz<}Zh�4oyO]갋Om>U-}(dTNE!EC 'F_,aˀ JZVBjL}Q 븏$97V =b[ƀCl`Go͋2qW | >6( 5k֔J% yV(Ӳ,_{3fL>=M6^j|\J i =aVN9bg� /T1M.مq~f+0 '2uR7vp]A5A^k@񕾞8-/|V{3P43*xLް5R0:ubqPWE%VJqcr豄iqÄh>c@cvQM‹❨;Keͼ&Tt*zvQPwof>JHC 6+U/ff6Qr6f[)<R;#,M5ֽݦJO:(ߞCX'ՓEC!Aiz{$3s _|qʕQY&ַ JIL "jE%m+юmYURn<x6m+#!p9w hRPC+([ˀՑ2#mB}(&Ű5bq˖-@RrD)k ujdo5~xmS.8Pa5*ӹM>12_/UkPk/AEZ9t,7 ha hʅBm(jWkWSr&/ѐBK(r<^AD]ej4s^w@98 фDknSXsΕkED{Zuۮ]x|֭77RAlAF^EU 1gw1F^U ;k8КكvP# +84%V76޸:]@Ũ{+owwbߌϐkP>۫o *=W @UȰqh05U:;;U8u? ٝZUwy Е95&C4qA/]w-vICDj:P.Rݼ6f�,E)s@bVv=쌎D=WtT4WjkZm0N$۱bJ\E%%gQh{pjT ,7Mˣ'5Rlt*{�5N-ok`tVϠ1jBQ5<q+F3" #vh$vXb==?3VZῪVY,}[[v~`q48�TRI {֓w I<"@x3IOӌ7?Ta1:BMi$<NYX#e00wY@:H%IAuKYR06B)mV<E)`0 .?^aXKΪZtPTj&Q .4^$l3s?hk{"8V[\]\q@f4y*!Msژ:*a5h T4ÈTkDߕ }lwU\<^ 0J{ͪBoh9rܔ)S:M6###J%)&eX,Z3tu�Z=wcu9u~ţRR<7Y*Z[S9m0#drBb.kL7.`1FpmvN.3Y($eU;C \!Kcc&"BR(7μM &mEuc'@45WYorO:,m{b(_NĢFq@G21hZ~%>QCs:6AE~m1 D<N DB=!b\t`V3j(0?eCꉕK~s e(KBXP:]ȜOZ _g`rޣ.aNh@9<n wi{- ) -@M"�H�CefUi.P^{=H뢡_m75gV&IҢj�`STS掔z^i< {_F.Uc$\±X,p0"5݁�J* Ӡ`=uJ^(?&L3ܒw% j2үb,L-F,"Z5TicU_wS*u_ dY]|V_> Kr[[JpejJ;3ڝ"9LРxn^-RE=j'1Y}>ojCxVGQk[n=F<.1uBVPC'NJ-Bzݦ6fpH`GF@<@ZorU 8JPk6N"Cf,shUi傚"HEE 1z'6`VM-L'GE%/"TB:C"Q徘&V3?SǨQ8}k<7?O͒MoT*jJ]S f0 xa> fZ{G»'�:Y:BP:4|k(aV.kM.KDRj@p{2rsWeIT\ f mq* noDI(h@CFe>LF#6ܯ4m6Avb#&4>𦿽7Þ9\\=.BlKp9-FHۻTcJP%3=Q4"PbWrˆJhDluRQQs-C*<i;\�\:0ݯXZhLTՏ;H2yTh\ٹ9.;L ='ʅ iH0?thKa|NGG]ؔj5+Ϗǝs-tw{YG@c*Rd D J7*Eԫ�Dr&(\s4VqRQjAsYzx) Fx@$aT49v2㌛$ A+蠏2-xa]G}uEꮚI^NAҤ8j4ֻ&e6':FL 4c (xtg^5=VvpwZQ.zT\n&D\9=[fwLV-I&zO>#JR bZ}}(*@*STԂ(vt s@R8CYSG1cFgg%K?i,ߣh.EH?xRJeg:tOOEli o'YnEʀSf&edʒo�O =) @BgRUek$� pc<RzXsqTiHǑd6~OLiǢz4mӐ.rZPWLmT2B-RU+޲+PKӕJq9ܬrH"b7 YްU ̛Me 6D*�| |-MD#,UߘQ0@E'Wǫk Xtuk t,VȐ !G4t 'F@{zzN9d2fv֑Yb^\UrTΫ/=Ю|$Y[Or0:j3fC6*.ü5 2fjv;¬ &C pvg*XM>)*RCQN]oY畁4Q|TB vuziogB 9΃y0ʌyա}B"\0ʓe15-Mo%؅7QlY6' 1/eMDy.f=?vݖϡ O ~=g'\aNT0(YdO-K;}Qtk>D"q@oo"W<Z(9ֲSMd932BHW~9fx o۶ /3ImZJeȧO=/ϯw}83 cv Ko &S,7YQAś 0OGs#ǻavSV�sjTcP1)Bǣ&&Kx v �ʝAARzyb!j up9cNT`^{\#�ee!tʏ`6�eP`Q;)@1D@Z0�]SP[ʑcޯ^45ws'֖Ţx|{<wu]PNjZҙ8Q*h{ʯj```nBL'3f@URk|)o?#7n\"8#:&I—YFc{gI0CUY3dэ4Kʣ0G?\;䦜}_+H$mUZ1Or 5gP!$ʭi#3T1 <;7V*Z Ա;=Rl+P% 1ld١!‹S4L�� �IDATs 0�U.v_8BAIUgW Whq1do:ѓz{;;:X,nݺ i*\k!([%8ġİcjΤ<do0K"6o޼xb+=S۶mm4⪕CF;n*Z$q 3 W8qbEzkEUl,1K ^ z"(֌GUpΫ&d2�8l <>o.ָ�j(5ah۶l^D /bq9!v&eTWX?6 >bȄ3hԯU-S%uB{7`JzhN}LU[u$ RtJxjuAwywuז-[n꥾k 1L'{.l@YGtp̨"%Y\Ka-,�KZ<˶۲_W_-˯Z^W5J"0HNsb>]6"'-2S ̋bg oka 䪤JA^xjC5�e.@Zu[,Ն)`4x%iګXmp9R?azn,cF-G֩FB6Tэy'm۶YJ*']TR0as%T Δhnv|Peg7YZRSzچ]`ĦxZm]=XElvB2Ն6{JXEJ` Gк<ƿS<BLRrȮ]\{7Xb'_-/ݸ{GG..1q.�V( Z^�2L:\hQ.+˶i1co5 |>oCCC:,U e*}n[GŢ m $q"G7x5]C7ZxUZ- #dp JTi_S- P f8D+QƆ7vjK b" {jG'0<BWb b|\ )Y`@=Dm@2ym)|Z&qĀ<o::~X.m.īFQES,bK̤rǣ fS 5 p,1.20:@TX(բ\..y8?r%ˏl{+~*5^?@ʛ&]6lذeB@+ΗsW APc.ļ�ci^])LFO yײ>y8W$*spCpa�qc1d9:l J%/jKhOџP"Qgmi&46B rc%X.8-d[HW_C*si^/ړip HfAObM2?zhX,TJ?JXL>q2Uщr@nj"qI+ykBOϛky'jZTyD<NLjU*ՊKkh:.-̞n:ϐ*+6EIM/0m0B+Lġ~TG(Zu4(+^Pj@5g}rb �-!*O[~`Zuy'w(-bLr3o'#:EqDa'=CQ@9!5䰘V� xyTA97G(L+U;*VF(Wbq(뉢]9R"nx&TD{t29z3s"ev {&7[!l:=$mm+S)X�-o?FHW-z=< |kٍ#جYQb-B}L={-Oj`) _lJ2ւ'Y 9JDI&y@]~ ԩX� #G׫=xxodA#fa@_@yٿEVV_)[r:hj̔o1gV|ijnGiIy*NP8*c^Ax5:+JJ=oh�v@t웕4ZLJFujY_Ii n=? *eMTj%[=fhƁ([()K3jbR_1wbKaP�*\ X .ؓLөTʾSalQr APmZG^)vƣZ<<k2j(RoHC4Q.ň56'Ym3Y~5bf53=5 fP<,Nuރ…À2hh�R`<fd|0Aav\i5M?5-JPѩ{sAˆu�^@x0LcoXȮ,E�2+iVVeU6<"Cr۔"w nޢryЛ@['*jJhT==Jgvk<h:Ҵ׎B2Kt $%xk }z 5Pm]j7@c 0aOedTmJViRgt4X!.Tm2,JS "qf|aQ{PfOIƴfLx[[ѤK+IySB 0-jң.vָwaYR+<�3Kt5x8cGxl:̵Z s}O‹cߐѧ_,<=OGz7;f0HۄaTԾ7z̴ L<7hP3]R ;>v<e^ 㮍zfiչjcݱcǖ-[fM%d*܍4 o4lmD3Yaj` [xy'&"zB 1, s|yLsA\Օg<ͬiHOMdAy]c^1x#;'!-J$1JWD, 0F@<`a |'lu tiAbfz=|bHx0h<T*͒ںƳ�jJ6�ډ^3 ]?3O&Bipw.]@{GCޯBu{$5^X<tw) } vti~X/7҅(K&.C^I2BqI2eʅ^bŊݻwU™tD!t\ d,`2xtpkA5up-ѥ0BO2L 0~hQBϰ:ͧ Lol{G;Y*҂AcVF1mmmtPZ>T:::V@ .<U 3ͿB"zQ x-#aUe>UzDm^˓?~YL|g}vxxXa(_)#F[Q'P3-+kfԽA}U66TinPC J @OKM^t0�!(=A6Y 7(׻99:he"_;;5ъ=ؓ߰a󁁁|>o8H4U"SW9҆0A̪pO/.,�6,۪ ^Ou\ǹ5v?lj !vȇZ_ܻ .~OԛWتHFDvŽƯN\RaKDB ar`~T L2*ʒ W5Pĉ?OuQmmmo.ٞpRq35ڮfɐ(ӦD5ߦl-z{;*Are�@{l]\ʼ=jID/(t.휋vb{{V lMKBECCC###ڃLO<6d:۠b*`"$~|P$i2NB@mjGBLTLh tRsÑI _CP1c#%�$CEH�‹XQJ�BmP&3x+@-ۊ 3L煍Z�g ::,�  ٕT*5k޽{͚5BYb:ˤs0Ԭ<L&MOT޲/{KSF;ȯ&.44/m{]Mf]ÏU*{g`2YNT~Z,.Iqha q~ƝOpr"rÔT T*b);tۘPyV\f8!@+7-Mp{qQ7SEy#^'ߣ\?_wK*k^R1[ո\z37 Biq䴒kp8aKSGUO0a PA6+`A:;; b@'୪5Ll߾GI$;vr jMxX0CyƱBq 2Y{i8fICn?A'n˒6}xv[$cͰOU#_˪ul#Ҝ e)S;q Be" ~(r]bv[P^ 7YrU*yghdX(i<}_]̽mdv\njeB0s`k:4OJYQyAԹjO-*21WoQQT/G$ƴ%GfU7,Ѹ|�VvT"Ŀ*_nݺ|{%mb؜dz#~L=tdRXC/R ,=>;(`1XXY˄EOG6kp2z,!VIsz}g~[קKLO iN:V[|z�VwpIrPڵJj'y`ѓ'+<󀆤2ޘ=Z_4#<%H9Scm( o|@y{<58f`/UJ:pSP*}j)jtVZ]h*fϡԔ\.W*z8Q�v3 *cW>yD'J z5�m$J߃ڍxAg NTsu: Q uԱ]UٓwGv7468 LۀF|ΝCCCb_F%(Ţ]pGG!Z ϯ8J)|Y~oHAm_YDW:tOLbZ"Ӛ> [&W(+Ӵg!'&ɉvq</aWH _q_0lҢ i?V!0gfV/-xD?VGuAxY_ԉqUӱ,@)"@Ks4չ B&B3v*UVӺ=[)ޚܧR.mAVdmٕPEO(e/^FFFTFKFXtVZ=Tbq@pyt6�yt bl~O7n[Րb7PdB6kʐRY{m)Eiz W t* VT”<͟ENC?0au�Q"f+ۿbѫeY,l'iHZ^"ѫPNCGoYSC>Pr#- HO†n{]]][ h)}M)I1fH$=Ѓ:ȉ.ְ|)5x1{DD! b[b P[z_T S% <E{7>@݈f\X^6x_U5!֨Jc hP+zh іA QrD;PRz%iVnD7Y~ԶlGG84ѻ4 ucuad:n: +M+p.3' l XܜF>RUWąh7鶶bH%JE===0:Y<T}tK'-ZT*! u[ReUi/UABk%+U1Q"l5 IRئHcevnG[%sֶ7:at46VE{{: 54-H 3=ZNТ$4oeBV][BaΘA%_ڞRh]DC'N{Hpș&QT+;jPo;jK@U 2JڎEV",t\]t0M?څf霹=J#/4iVQŽF�jXgOEj?pVWFb;X$yRZ<$ CrGJYuwhW~q%@(r22]JyP̙w$n S@p+hSz@M&ht4rş\EOV%S~Q:F:0`%6<J}r=K6G?t j8kq"8U8w$:"@{B*RX`iӦeM6AQ ab mp N):%Jgj�{፳(VÚkp� ^)ASד UGs###Ba<N(Ldi&ƳtRmkkk7neZx mIug+F[9uce`T^fyCm2Q1-=ic%8# Dt8;;50RIoFv k8Țs JRjhPH[ M5X Srhۦ||J,/VN{MDf(o5& Ewد@jUkO']]]vv;ݨ۬4afƦvgBMНfϊb�J$A>`jL!d2Y,=MXUԒL"r)ISV|Ҫj2Ah&97~ɓ'["i: *N,l{hޞo*y9 ҄yܵ(#�jslA6PA҃TN)^d߄N#eL�v^ 22rʥeCO6$[1^ ~ȫvF:gnIG.VjڛoХZ~jp-fi~ JPn,=תl%$ KaT!hStRRDZQ 6#,ؗicP^ʞCmpn�PSƯF-9h.8Q!5jf P5:Ձ!c7Jh NSUh�a{\.kp:OfJJF @_SVxP\y\mROR)O8G/jji޾T㩕O5qMHx&FO@rl.Nj1!GM#%i/k CFAu_u}* 1O:@68:*<{͒ /ͨB8{͚PWPfG]Vs7QD67tZҘ^Ҹ23LkIGl:S] =0F(s3 VuNPPkCަ*w(_eIjhqB vw! [3@P&[AQT-B)fJ05vنN"8Phw2�VZfi*H+_K+Kg=îPP%(lG2.ֈà#x !V%WZ^#F¼2?cVף d$T~ -?q2hF�NԲrB{IRPZKRwws9eDmJkf7(a;kʼn�ܝ`{}TqY @k| #'R"ԟu\dϱDUרv\KJ###mCͫU^ϑJbP?҆.mE2{`^`:Py*NxD! 25iL65;'V15 20#*4 a>Q~3j@^ٗV&==`جY®=ԌDcv< =ﵿn(PRyfPj-/< RR NƝd2B`cFJ,n9��IDAT9gcX>h,vH=@ ѡ$<5hJH% P>< lܸ6!\G4 ԶJl%?kq"ִ\$ͯSK )q!;L_9"wTlEYAjqQg <i\ H5]5@"h`a!yCl(Z[oo 8xd)(=ztiT@A ,$oP+ 6ŞǟD(/Nt`YoR"FekG*fp&L4T+#EjMئxC]07P72=STgo��`}Ϟ= QBw3g`%8JUALi:̙ʚi(hen>R<znfڒi8 lXm5fl3lLw+ΨIY^Oȭ뛢sN="`'*j&jVJ'бP�M~L%rzPW4�J%%󶁺F +U%M+eN7='VJdDJڑF)h>+'^V<Ga?+ēI>Dê#3= X,6~rZN8ᄫ*< +t +,'{,< +5k֬Z|F?G>rc.]y;װ/\: JKs^\^›uMa?|?\4p/ +gVXaVp9aVXaVXaVXVXa\NXaVXGVXaVp9aVXaVXaVXVXa\NXaVXVXaVp9aVXaVXaVXkȏ#֭LµNe'?`-⍼*>፴X櫯z/.'H,X%~'ro}[rq/W^j_Y g_^!rg(?=Zr3B!Ͷ귿o;vξ6nxa㜫j8L&xB#\tE. +޽Ur܂ o@XaVX .' +r +ڿV}M###W>ӝs\nιYftAι{nڵƍg?k(d2SNݧУ>;s'L[rE}眛1cƔ)Ssk׮}}p<CCC{)xꩧs\pAOOsn|̙3sR顇rΝy晇zs#=|_~t:}g~_~=s6mZds _B2llٲexxxڴi/«sO|jz){ι7.[9zNdckʕGuT__sn6l0a¹뜫j<sN;#sի>Ϸ^֭[L&t;.]otAfrU*s:N?;9+Yxy?O<3::vmݺ7ss\ggs׿m&O|g1ᇝssĉs?믿{ߕHM:†M?.'xbι(˹\n…gyիϟ_*n[otIr`.[|1ۻص뮻Rr'|sY| J[ocǎiӦ|ù\nɒ%ӦM۵kl6 /L>}7wk622/wwwp_}ZrO?̙3.\hѢboc9n( \nѢEL&J..\OO7x9s'E_~ܹryΝׯ?m۶{nzn7tO~-ꮻr}zr}M6}#vܙV\9eʔR.~ٲe'Ν/'On̛7?O~o~pٲe_<I&-Y/Jv:1!:餓vϣ/R h^qƝ|ιE-\X,n޼9wq7tS>r<'ryݯ)rwo޼9?'N<[v瞻k޼yg?,Z謳Z`e oQT:믿T*8_|Ň~T*m߾+#Vn{G_|l;^ g.;gϞmdg}v>{n(^|ů~Q͘1RDQo|cŊѾUV;?qE+V7W/>3s̉(ϟ}>"(HE ,+/·zk_M6-\Ol~Mvͻ'bݻwGQ}'Xv헾%߶j-^k6mEi'9s<3.;h[n…r;΅^]ҥK/R_E]+<w(fԧZx/z}…s̹'vp(ڳggϞaΎ;?|=8w7־_~y޼yw/ɍp/lOrԧ{7FQ+\tEͿbK:硡/~ރ;to,xΝ;l}lE;c۶mn+ӧoݺn~3gδ"~>OtIx_ywuvN:sx!򁻗X,6sc9Fu}sַZӦMrٳgO>}7tӻtCnzzW\1~ XNst]}]w݊+&Md=xwygGG^,X3\{ۙ7om?>288XbŊw{+W|'W^SOY탻;찯իW?×]v]y啧vڥ^dɒ{~G\rɤI֭[j]Ygu8m۶qFCׄVXnݺ>ovmܸ>6scE7~{ڤKk׮d2LgZ^Lfr9R<˿KVۧd2+WR\s5L_hE###sjZ,ɜqRi_ٳgg2EQ]n.d2\r֭[?x^w_".Zr-Lg͚5+?jzٳ~_WGڬ]*8L&ܹs###Q~_d2\s!qcꫯ~饗l]uUL+_az^j;ɜ}!{_ڟ+W\d.b]vϟ?.od2{r|&G?Cڕfxꩧm/_U&wc{7ް,Z 7ܐd> zǢ|ÄO|ln]᜛_/VXaֻKs>VXa + + +b= 'M% +we%;ۋ>`/9 +zW/'|5e.'+tNM+҅ QVXah'b}Xsrose˖>[?{~gZ9DxaVXko6p.+ |^rMKNx m_wq_U)dvL>0< +?Ut:.ͮ/}x꤉'ƌqopK תNxXa UGOqIGr.6mZ,"ܦMoqoʉZ1< +?ܕW%gӟ>xG����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/editjmagrange.png������������������������������������������������������000644 �000765 �000000 �00000544641 11332127304 021724� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME ,"x�� �IDATxwUO9LOwON0Ca *"(:QL@\QPEQ@ 09tO+-eg9ou UU{�Ab<;%5Myl#B.kpp0fwuWIII^^W\A�G߯z-"dums8] /,\a+ϗ$Iۣ<t[?00#]s5z bз0|(I_n%Rw`D|[⩬l0Px q�*l ��TxeY):)&a6$M<k?t}n5I0vZdE &"0 Uytj_UToc9!Zʹ&1C ]Cה{;%I)8i&aV#CEb.{WPqU-]UeyX*P,e<w ИroK1.+/HDbF?Pv2O?$JrǞp4  %H+r;} pgPUԲg80n  4Მ{ac+ /PDOUh"c1R?EQ3x2Oo $r۞aD[ {#wPQg4Ig< Hp5N0γHFf}QGt&LI' c��e衍)"B$ܶ(,k?`oٞxŋ|>${he CL6 cfҁaS <їJ%'9$%n4+ʣcPJ*�Y(tr·+zx4 N& ?aD{Lzl7JN*w6$Q>P(q[ 6 Sb¡ξ1Ss{_*Xl<НH$Ɣ:zHIpH Wtҩ2gぞd"1KpaDUgۺ3R{c[O2\w'OTy;P(o%X&&QBB~Vy͚I}"QSl D"L$AHDPD8>K=Db|/ pth8dQ *[t:5TONw;OTx`0qYpC"h'2х%'OTY‘NSI`ЈUd-uZ:|Zkƕ[Xq!l4+BoVlө ed"9R(^1 Hy/0CF:zL6SShv5a -=pTI'D,h#Lf*���C� }KK˄ XՎUU{(w, kN:B~QQQ,1Hݘ~(ͰbuCK� �`p ( �ӊ INd,4nqEU>J(yt4gy8>4ljrnHXihei�u.n4 M40dgK� O@, /Žl=l1; $6}\}8*h eXKsPe%I/d3Ey_)|Zug(4hw/HKXm0Y .7& Pb?M`5_(:=ز''*=q䰚u Yhb¦-Ch|/ EyLYil Y Ĩħ/ںI t s4$( E3%n; m.vwh.(5D$yv6n9dq6~*H2+TX7(̳TsOb FVQ:Y^*q`$]oC1vR5`)m> GTjd T+ͷN˞AM~)!0%2|E3I}ÉlQ]7،qE#Pd¨Ʈ`]$7Np? Mdy0}N]M ɣp:ϖzO>&��Mm#Zϫ=( 9ܸ곉ey;a>k?WZsexĴߏx+mM{(9i50 %z5{ln+Ah'Mvsjr`aGѸIS*MI.r/YZ倪"Jyӹcz|8 W6?ӗFU�hYNxl59ˑl=]a*ɷ8Vt&8QZ#)~8- uD8TqeWg@enLUru(DR|ʊJ_(]4(˳Ѕ.KCGb K-{,L++"b ð@m3ۍB6#YVtXAZ~(Ζ*^nMg&2UPpZyI &hY"=h/ #HgPe8L6a'ah3r1m s0z_On-{Bz,큄^k(\"jpi4ȦB,:&(q[}QB=h6* lY^g$[ ΐ@-= C<־`*^k"+ĘRnpZ {Ú]a<΁ ^k8\"*PpaQ.74DzS!c24_U` /)3R$q?<󮎐@[F)XB+UXYq ʔmH>Np0|ΌJm,Gtkkk%/| !mh)5A<a-5F3 ȬEv0 ^͍�7w_2S�v�Imnok|oO,#drbH A|rV|76Ze7^tʁ')$'.:]V8 [hlӞb'}B`OOɗSd\n'yno ۨIDV%8MR+/*I^a8Q.77.sVS=*c'M4Kh"JR |a&&Z !`Gy͜2NE`;H:dKE'M12@'BKLˈh/gl&ɗa0:⏲є0HC1m�n'6DM} #Emt@JRSg %`J Q^3/_(]0$KX LOZ2q54"ْ<#MDf_"B{(IeM c-4cOm&} #{l(&_%pJU@}Cm f_b \V5 4bYibe(\u9˫H8@X/0KV4vgҬ2p?g(SoD`?oɗ0a_bCUzLu v@M&\V5R!, 1„P]`f?)rHk%Fa&[{)V\fHSdI0`)u1i%\j 4{Ρ +  -ZWM )}Rɟ'|\#?ѓ^SFclk lk:8 L&wӯyb,+M[LQh�` .9)w hF=ybͤ_uF6 Mt kkJ[w󭴯#b2p J))E�8iTD&T3%O϶Θ =ө$MgN-/G9N*5*RgO)lor*ʛ3d* a0qî< u 1 WM~Fi&?/3be!+ﲐv3$9F Sa2KGK1h1|B`s1xhdeL*122dyyli8)B0V#a3`C Un~Vi�bsL T˳4v38;FԜ2KWK2(1qkPf$( 0YNS` `B(vЊ ap:40< ѴX2p"菲N3i$aCђ<%pX O)tdV6X%=V C!&0l`EL053L`2\S` PU�wYp!FU^~i&Lq!h^a"M9̠0R梛6YmHsJ ƻ$! EvUϰ<6ĥYkf8_h f4g&چE&zê~\i()Bi-a&BI'e�/GĞ\Daj #Yiz.ysiLCΧae~~�xSgs &m@@ O$z[þɅdtSQNT'`4-8|oj!P(K$qkOWͽX_&);.u)'`"T_|CUEv1}ҸB7Fp `ی?m �@@?r C;󪽆P$ƱL(0[@}è�PDp&{#B4+;VR{ÈY h G`(7 hR dPZ VVa‘<bO?×]YIP@ uzmxcPx\!'�h|p'}1!/=ny1dlc�M*aT{ <")2c4$,CSJ?fP"i0!ym8@!H6|_Ex|;+иBzO?ˊ*DŽpF.tࢢvGsЦAGj/˨�XL72F{`'敾2aF iI'v4a1^iED2@Bp :@>? bzAa^?ˈ2HH\hetsѦCރU$0Mv8#;E<fC<!7>%nFP@jҼZGV OHgTbޝThlը sC i8%q@]aBn ?ON)1yXAn폵_s_DܤCr;M` jDЇ!YVeE=b軧<֥ۻ|�~fz\�l_sz[!XU(5Ҹ( K Νѩdii J<�@*���EQQKUBY`@eP<}rmu$t~s,RUíMNGF8SbpܺS{�Iʊrj`0R6eۮ&s`�Q ((PgPV-! b(da(.!̓""<cZY'3Lba)�>LVdo@P�pSRJF=,a$\`=(wDN*P$3j U=&B#~"+2,*TjSrQ+0+\`ii41 >DVd_@@QbrUN8ͫRdQj I.gBфY="Y T8( gR;"MF |'B+|`XUV^544N&l@D`'pZ�Rh1j I.2 Z=~G""tqFJ+%V@PgDva; (Xz mp[HU3J8Q}1k$4m+lP $8pVRh n Jy8߄6}[=19 cRb!KFa@0'uWd)GQKyDG9S.xir �� >)恇dwx[pZ 9cc Xϗ$cJGt)�NjCGȘށt5<Gwa]dLS!ˋ[:ik>=0sa/&8t -a(gX7/!OEJ(�du N!jh A 1&}[ ds E (*1PtFUI+m?46O 1P8V�'C5A$ )Qa.(.u0 eiJEf!p[XqP!`Y퉫YRigA88QK-�@pGDu #ZC;*\eS5aN5ZaQR$0 Ȣ'SPQGAFjd@kX1kVjF&@XP�qf `=hDBkb CcT $8hS p8[@1B49VbQ@6"Ze BDP[XQmCҗP3a<Q-�GC& F'r246OA8 j*UơְzEKJ 8hldHVVRj "05XIN"pȀF;@RjV4dфaǨUV婁o>Zf ;j2aO>IF6o��}rٓ*GƜCKzg{(+�j˦V{WSO.9c|=c9Ǘ孼,|舨2Ve d+xUe 0F%nJV(&qQAAqؑ0B7em7JΓ`LHb8*./.UY$I~/&iԧTLd*ŕ^ޮF�GpE(!X�03p2-@]1UTd#8 qR $Q{((^%Lq-Q''"Ti<2EܴC'09V:㘤qN)B2b#61E \h%  ![q+A(-1BHcq.1 f)ѨGpX-4Jm1\<Dx'ߗ$RTa<2EܴB'И⢥8.)`o &H`M0H LB8be+t0�@?=x"0b,\l9  vRQ;aZlZ XJ-BGH>-aGIDqR&,o &q"+*e`E8be;t1Uc|!X ؅ eb(P Hو+=q ԒoNdCOaI.3 "y[~xODFV1",1J�8be't1E|s ,a"(ʐ?X ٌ+q @Y8p0'u<;{p�Iw~_6rׇ67=763'isf^؇܋NIgϚPU8Nضm[&ɔ k3, @iU85QReaۓRᰄ8 G RnKP&L0GY237)6r 1 ڕ$͘Tf*{"FQ*\_eĥE4b4!7Mp(6h#*WY(3I*(5q1h!y$ÅUY8 [aENP,t%loĈ#JϐXK zRb!HDIJRR#8|IyLTaE "r4@ rDZ@ Y<,qQV1j +Fa<)ҊI&a6(+GfzҤ@%F.!`Q-40 |iAt NPk%\ea?u�� �IDAT4�ą8,)ENV@wʵFQ)f@! dy4OjW`RY4)PKXE < 4aEAlVO>3dO 'S?6{k6L$"˗\r6GQ>}: k?Yqt@&?NSL<XY2Mܒ01Mb&Q<4ז�yiv%b^@1 Er' V\̧Q3*kQx)֟%VH3ib|a+MqA1?fC=iUX#<$+0[a1HҲ lc^YE$"}'DFI+d>!ڙmG b&*))f`ؾ4(h4nUԓ`фIno D\GTfB RyOrk`|;(@�Af"!4'9 V;R.QޜAːY -9C�4 +.6ō&LʧƘ&Jӂ L"<Q|Y* | a`&Dŵ%i4;q/YV Or8+a=mgɌLRDYMPӴ줸?~x>i ;t5; G9Gd݌NP�Td5$DGrɤ }Y gX̘L`ø @0OyJddDΌقfT̘qXqcX@Ht�tgLv3bgL!c"dr"QAc&,%H_֘wPو02` ) a T)`d1, )](ߕ1c!2~Ƙr*@VD HCΘlgDŎBd1F^EJOǿ6EdJRެщ,ufTt`lO֤p!` ) /AԄYV:f3*XP+cF Cd!#aT<S,I/!03c&Ed}R*11Jx ɔ=Yg)D̘ ެIV"25"^A'"*)1pɄ VΘ`UOr*p?kR;3&+ƛP#c&`9#mNEr ɴ=YciDLUoUL>TG?]�oEQ��$avDTN�` VFU Y�īB8,*$0 ) A*ɼn/r �Ò²   Q DQTeU$F AA!) C TAA H% ;JaHA "9a�QXTD=DF">Va0UAA $^A~0$V٪ }R㓰(J͠M{j"1L\k,"㪪ʲ裏.c-[uYutttt }ќ9s2͛%IBs_ .@/ \RPPpri*es\سgOooUUAHGGGGyCrttttt_Бz눝\rɚ5kO~I'?ݻw>z믿.I>K.�f͚:kܸq#IݺusΨQ�� _~%�?e˖>Ο??//gt: sNj6?!;WR?#m{„ gqƏiӦ믿/صk�zG|O=?]v}s̩ѣVZUTTt9B޼ys{{Eݻu+azkڅ�(j…�{TTTSvO=TUUg=W_}Aw#,ɫbqwѪw=x/h!HT__駟닋IW^7UUUA ٳg)8p@_\H;lڴ>W2ANTU5<߿? C(*w.(Z:|> 7P[?=j_|nfQfma| 6sܱcG}}jjkk[pa4ѣ=* 6,_�_G"niiaY۳gOUUO?oذoUUU---Z|}ݷdɒܝϯ^z$6s;::R__ú%O9SL9sx㏯Y&]p$,{ws9EFٳiֶ曅 .^X$_wu�GyOɍ?zSN|O>c=z7|skk$Isν:ɓ'?c]w{챗^ziǎFq'�`޼y0 yO>>{ 7X,L&˲_|ɯ,>arKKK,wޢEpyvpH+Bkkk~~p 2eKKK~8\ҥKoᆙ3g}<ϳ,{{7oiawVZZ /.w޽&L_BQH3 =wܙ3g=S`0yZZjĉW~W(,,|gcEQ|^u W\f``e]vM7!RWWa�_~ 4l6`P(W_=|rey{yM~%%%k׮e櫯:$Q]xq,K-[>ӧOA?Yf͚5k~IFAo2;w(O?b9P]n]4-))|۶mcǎO>N9sit:|͏?`0o۶ �p's=ځo~5k֬X{oowa0AشiӶmI&m۶mٲe4Ma٬mmm^zdJRׯ?MV\\ꫯnܸGo!6455mٲeϞ=t˲׮[^p_~y(:3Olٲe˖D"q9L6^�@&(j˭:x� bDQI8K&N3 +Wow]__8p7 Ƽc Zږ-[G}u<cus9G}tҤI6lذaߺuk*+WZ믯Yfٲe>'|rL'P(NF#a,ˊ("˲eeeMMMT꘺fϞ}/]c֭]tт /;o֭]w]*K_x;{3g?y嗷mV[[;<<{]tEغuW^裏vwwoٲ塇ڸq?Y;vΝsϒ%Kywy3$)Z, P-**Zr￿qŋ/]4`}~G[lnf3l۶mTS۷o߲eKWWׄ 2%O[x~?qhT{ذa-rw644>`̘1.k+Vo,޽{sN(.�[p%K?zǎ# l�? vسgO شiĉ矿}_~zgr}VU۷'ݻwfI._'Кh4nܸqofMMO?Hcc-[s555[n---o~s}͛^yw|:4Z[[޾}O8o!h{ꪪMk f̘qDVzwz!qΝvt]4 pXb~k׾fniiI"=oӺx6iE{x;vOHO&_駟ve˖͛7?txkV]]tү?{oʕ?59qgy78oK,q:Z?�\dɏ&u'=xwk</[o^{l޼ywuס"GE6m}<Ss:~5\~orgzK.moo饗nƲ%K;2$I.Y$yǏ;8qhhhк4:;;~;N:\X;Ν �x' Acǎ;kZtbv۱6#a̙5557t0f:VtԨQӧO?&Mq;mhwql2G5j̙3̙3eʔcʽp},O˦MvY__;,X`a}} ,ZSN:u)֮YX2SL4iұu {1<//oر=ղ?5k<3555 ywz'|3Ak׮GۼsM6}555&MEP[zW_}�kvwg=k, NmH}}6Ty .|H7o|q<vziT'>#V+A---<@6=CP0 (vz#P5LtS~G0 馛r; A&Ly{x<O<?~W^o曧O~\h4֖!&l${z$I(kڵk… ,83!`0d, V5j3ˬ!a˖`0XSSCQEQv]`0x-~ZGkYYٔ)Sl60[hq7F뮻ى#gyg?={~8BT*e2rfð`0NM&ϑNJ=z={xZ^/;CA[[ϗFp8L&ퟜI'={vccn�]> y晷v'|EzVu588;cƌٳgϞ=tΝ.�D"pf„ խ�&LPTTs҂f͚+<c'wߝJN:7|'u: vj}7{COW^-n?>O9v.7.TVVVWWg6ꪪ믿~�zpK.>w}7o^dɓJQ W^/>C#/#vinɤB_ <�o] -'xbII6mĉi٘1cD{'暪ϟ?_=aV(i3O>d}fY,Yr'0w ~�L<j\. ð6O6Fq̙vҦ�n&ǵ*~뭷ƍ~+V,^SO]jڵkpw\uuuNo`555/?c�?o޼s}嗋{W^y/ܸq}ݧ̘1駟~>y]uU#T/ �-Zt}i>sM237n… A�W7n\]]ݘ1c.m>Eyyy]]]aaa$kjj4dY7޸ϟ�=nܸn㸻 �N:3?~<�` m& UWW�f͚r/++ӆ/^\RRM$�`ݺu#x<uuuZ@9̘1Cy%^x!wukWsyUWWk"I|e˖p WްaC]]]~~U/_O>vP矹%:wEoܸ1ο͹*anW~4qNؾ};0ZN/رcǍ7駟Ο?ᇺKSRRrg`ƍ,ϙ3g7tοg_u"'LVZ?rtt\~6h4j׸KΝ; :ڵ똆!ű٬±Crttttt8l@6::::::?L6=t!B6mHGGGGx!d2ǴBshX.pꥣs^zdw$2eH~_A9C0^Ƭ/=!症X,EKoVC/UU B#<Ad~՞p8G.^xም]wݳ>_ꬳK3Ϡ(z5��$IV�,Z(//o* W^yem۶}Ƿzk0̭_]]}%oVB<3O>!/R2̭y|ٳg|}ݷw޿ǩSΙ3g�\p'OU7s�`ڵ�hͲ˵nVg}'9�d2#!R魷Ҷ'M4w_|nAwLR/vөR޽XɕHrV\y7viYʕ+C<3{B΢EWX裏^q+V/N8k +��ݻwѢE>k|+W{Mf׬Ylٲ'|uѢE/ɓ�/p8r!+رcGAA'-nܸ{miiYrc=VYYvzGyd͚57nk_{ꫯ>}]w[neժU/b߿|򫯾n[x_^YY? A۷ڵfrYfwyWϮ[.N!_ܱcLJ~H(J (8(0 CWZ? ð,��A4cIrm A0 ksE HKSQm\m$IAh ,k鈢 He, ,#IҾ6mڞ={$I$ a4i;5KQ Y=SO9CGjkku_:&:G:F5k,�?___;(-=)gZ$[.eL&sx㍟}-r~֭[8_Wg}v.Gy IJ&G>34/O$+VobŊh4ze]veg&7 ACCCLF?H;6y}ݳg�hz[}ц n?O3gΤikY` ۶mKR ߿O5kAMMMƍ8tJfy߷o_EEŬY֯_/;kjj&Oo~ma#3/袳>Y+V,XK.E1J]r%_}n޳:k[n}woF�竭]v~aZk|s^k!RUU$EQ EQ5l\$vʲ-zݫ5QUU[hj`†$IZW @,ZbsǎZ(+˲&RK!p�� �IDAT@(qaXUU=~xAαq\,;zcaڵ}(L&wGswB[^ver,_tԩSzI&mܸO?-**ڲe7߼|K/3غukQQe]ah]l6th4~zmW_}nݺݻwk!?1c˲죏>:{۷8n4׬YO<3ff}}}555m�[%ɝ;w7l6ϙ3'=swMMO<c*3̓" TF%qK49KE-gŜK2sKs@32T('QQdR'wкv~}ZYwѢE;w۷vl۶m޽۷oٲ%3wA@t̙r\T>u&7o?~|֭&M ={/\0gΜuݺu,{**22ҥKj:888%%eٲe666O6$a6a2dD"RaXvH$| !7>lV(xq z@2<P(drHRF# g, :5�ӢE H ï 2\7x{~/\"xLΟ?ҥK 8"dɒYfnzH.\x֭ &i֬Y?ްaC&M0/^bEYYYUUմiV^믱o@@Mtk׮˗^ӆ ^z饞={~嗌GN: ,//oΝ+V@ ߶m 6oڴsΌ/~(**cΟ?ż}2n_QQw}矯]O}쭷j֬ٔ)SnjSk@TTTΝuǎCӰbq17%z=E,�Q@ކP({{DXb1΅;�`#. q#i@ٌe !8Oq>}|zfY,}Qhf r^y36mT'Dһw޽{3888L071bѣGM&ݒ%K[LdҤIoߎWTG=zXxs粳>|<cRay o-Zm۶ݻc7|sɵk޸qC׏3`0/Z1e˖ZI&M4 a7غuVZuᐐlqww0acl׮]t/M60aٳg~=/ytpp4iґ#G{?O?%''SG"b,XX,T BU:n�9Xi�0Vב,!'1aժT* |ݺu;wZZ ppX �FT*!_l^!ɜLRQQ&777<<oٸqT*Ud2999yxx899eggߺuKqA,##nT*5ϿsRtss۲eˡC /rrrHyzz䔕)[nݺu j !!!M4_Ϟ=~zѣ[j<t[nƍgeei4DcVWWwqɷn2LNNN𡳳JR㓚cǎwں>y8}S`0ܹ3**׷u~F1W^T*Vݲe 8~.\;vرcfÇR,6HD"`4 GH �Ci }!ChįF1NG_q�?� tF@x 0ӧOkZ£G;� iZN"9a3Lc4333nݺyyy1*++E"Q=˻t2qĢFhѢ͛7I)((pqqqss ;yŋ###.\ةS'?T={lذ!55555ݝ8]tg\1iiiF 8y˗z)SD"D"H%Ittkonz2ի8H˖-4i] {聯V[nYYY;v%,,ԩSKvvv5ֱcǷzө6l ?qDNNx>}\p!55IIIȈ&Fxaaadd$XjZV+ő999mڴӧOFFך5kz?\YY9o޼m]N<ŋ-[J7oޜ4iRyyyYYYjjǏ;uzIrwwyZmyyyfffzz`H#\lP(NNNI�tq#QkQX >#xĢXs ~l` 22/3р$R\.7 S 3ٺuk?p޽#GϜ9h<اO~c.]jѢM~6֭[''N8qĄƟ۹sڴiY<x`񔒁Q..77 :$ \^)0QD.ʺH$ĥz t/�$0gEoD �B(pAVt:*˽޽qhL<xpĈك233###z=d==:m4^}׺uֻwdeemذ= A-rMEVCbIٌb?Z3:/yB& Bl4HqF$ BB뱑xDs�o;wܹc4AxX,RT)?31O8<c~ŋ]VVɟNGh�bvQ "T1 &1eڱb8R/hQfZNѾ0 Z-! )w~mZ4@ !,S?|LT*'fY.(E1zDaI0Nn Dߌ0 H5@Y"D"P0$\'m"$H(ȥB٬hg+W6<I]|M6h5mXVV_(l6 j.WPjpn@�?B Zf]u J >L P 7QF($,VH(Ea$#0b- |(k ᫕1" ތ'S!ƍΞ,+JA#RU "8dpD$E+ -fP$Ka6EjBpaɤR%Qhb(8mfb1hkgh<H@ � rk(ҭqW^aaaCNScOnfgM*FԣP]P E a@J3nhD3@! p�b)KOZVT5�4H$HjJfjjTfsMsssVbX, q w !AS-QBD$BxPC9ۿ?yCk~ee%PL U !2F3Dcp\h\.<+J@^/ɀ"82m�6\fD"Q(yr4Thz@9qppPBq ĸ_4r㡢֭[zK͛7{йa?~<11q~%Kݛ[^|KKK5~]zCcf5;;{ݺuC 5k6JRh޽͛~7ޞQ &O+ "\NVC`"N23HmX&'7 yʕƍ߽{mcЈ<B>)`'%$$,X_ 9sfrr`#*c,$$dĈ$!̵길deeŅ1bĈ'N@F?͛7+W<p�Aݹsl6UVV1bСW^޽… :~V+zaU"oB7Õ*@Zр T3G8DdLB~/1͚hҰQlX4 ^ݽ r?AV RsKmmm!p]%?Z$KO 9cƌ;rɓ'0�BȅӧOw^|||lxG둑/̙3>_}-Z(77hܽ{c-h|=H{&M-[lݺurrrj޽{EEEY `U dJ4 4pRpz=sZ•ªU"1_mrzP+ԯ_?//////D #^ YVC:\ @QG|F/SK]{PȨ|Μ9nJJj?~\\ܹs~]vL|4M7nK/;w:u _ׯ_W_qΜ9v�}ڵk̘1Oq[y9 O[c2l1; jmc5]ԸZj5X⑃r\$Ym3 K"Ptd2T*Jf"##q^77gR h0H�M׵MmLɥ"o }{mڴyr#G=zTYY<GvvBꢱnݺݻwo޼Vݻ7K9s&55566 cP>Xz3g*$4Rޤ7D�@( $FL6( kz-jP([+3;G#)t D"...-Zhٲev4i2p@'''R***ˡ pLY tؗƫ7LqѣG5 K9z�06lXbѣGS||odQlٲ-[lܸxw&@I33ƜcUUUZ)mQ7O߬pڗ:dB!hV QR 00 cvC'SF%00ڵk999:ǤO Wb4mmmѭ�h GHt~Rrr:tm۶3gdM6eݻWRfj%}wӯ]u֝;wzzzM0aժU666WUUU`j)**1/^ѣٳO8qK.o�EGj%%%[K\ JEXMv|�H[߻M +=s! Iƙ|PX\\ܾ}E!"�0�Mrr^\+BtxAy9gΜaX"**JDEEۋ/FdGGof{:t 𿛔`Txx8clǎw.xӤI|رh?SLׯwF4hΜ9{\NTT;Vg^  d�%o!$%$Ԩ2FQciJ0NO4�T.6+)+MFٹ"--G )^``sYsӾ�WbhC` rcC:t(}+W|ȀZ?ӺuW#k߾}ԑSN~xrƆ?yեu"]FoOnWp4V"!q y ʉ ½B8,G̽~V[\\zM"UWWQ+Dp;:jo~:кxovxb\\ҥKy92x{a >y*"f8Ã�C%ZP+Ts!|ӧN F%:0 󋊊t: Z[S-zwJ y{^Ο[xx߫?b :o#jO#Q oF̨'%`JJȷ VFL& ,0t*F< C}H)_QWmC@6P(4 L&#1^jZŅm|`999)'Zk`de!K 4H$R*Pnո�`" EE"$ؔ) Q$;#5̀J�L*�QA, [S`;v1KCN]ŋ^5ò5JPn ĸ!4y3J_Λ!578m 1͌ V]AkLVLT Gl`j5Zr(JjX0V[?B<ԃhѢa[3* fhc&yPjrF&jӠ ` ոA9,,];_9Qޚj!6 >A'r *5L(tFAn_QCmC#klCN}æ$%% :n0b\z˺T*T^HcFePky $0C8\Q]vN,ә?d2,P$B> B D"aG\� -H @&B/8q)|=HxkFeXaE"*7^3UPt QQQe5[[[ VvQiIA32_cl-cy&\)T\.'78 L& h,0)m$6ũ/d2M8{feffZj̘1ڵ1j:66_USmǎ=zDGGkiӦ%K&%%߿1<ydجY***c'O琷&FaZyk5[HÀLpB!*$ׁ\"*ٿ_dZMLieV6ܠHSwp<P< lPbkF7B-vpTյc68pZVVjtػwoFF^hTՈc󖐐rʁv}֬Y?a߿DGG;wnm۶=ze˾8q?2dHii)??g�C(Cpyn G�*R(\.deԌ� !aib.e}D"L&t�yٔ5UN!G&߿ &::zܸqZС#""VZI"ؘ1c ,f//uuyڵu? qㆳsYYR999 ÇWVٳg 5_6r;"Tj8-X!eb1O,Pc#Hx( dY&#2C!5>`E�8[7Ġ)9 (%эh B!+BSky]zuРA9r_|+--O~!Ѹd~aO>JjҤɠArss7nx?Swm۶L&'fAAA1Riccd;>ᆖ]DΐH$RTzB9 52 6ʗPwwwb<DBaH(-$?CL#Ӂ1&MEύRH\qɀ[$^P[]Cߐ!CE 4hV3f ZOcƌ;ܦLs̙ӧϛ7I&r}QQQw,.o >~r'N#\2%UUUϠh-ր%Ԅs1�� �IDAT=߬Vk"jN4kτ \6J8BgZQVS1<!?3�9...ڵO###}||BCCϟgϞs>2uuܹG]x1?(_}^^^OE03Gq5(8iQx ^ͅkZ߱DlE0:)RPh3=?^*(Naoo^8JrDC4HT*jZu`m=ڻw/cY(ۻ]|vP?0ƤRiPPPeee^^W=z}իWܦO믟<y襗^rrrRTׯ_?{Ϛ5kڵkw` OjzcMIwqE&AW !< nM/  ԭZlh@:T?WUΝ;@ �8#1lllH 0FKָ*43L`%`#:\_ٳiӦ<c DܥK>ƍSNܹ+k׮MIIiڴ)$''7.66>}tʕ+vڡCK&''O:i'N|ŋ 3fppp৑l7$1M*Ɨ(FZ^^N:ůA?a8&c16d"؈xM {"һlGE<n8pt j8g+q(^?09~2eSˌ-[~'֚IddZS2c ~xM6Υ�䩰�ePSz @ )!`#O_j)70m.{ϟQQrkHx¹d2Xx#$s,˄ 6mڄYI(k*o�ƍ< Q6^.#\AM4qqq!8k1 Fj*m"!;x$rE|r?QZ#nrbXRc`uSF $$¹޽{ n5<�7_`;o &S&zqr=B~E $8mC4ĚFNAP,7n작Q 3N>. 4 �&(_NXdeWUU'Prx5r***p-[#H ϹV%/GGG4*\Fp⾵%BGB08'Z-`jzMM?Ik)%Xs'Еr(%(mC73CN]۹sjӧ_Ε+W٢EX��FPR�X>4zTWWSt >g "J ~dO5CEɘr+IYM4rL&w!,44aAk:>~W_m)Y/,Ӊ`dCM P4[萆@\.& ]FrX̔J^JA?FՂ-M|X4j*F Hj+VCZ&Zn�!~{nJq=zڞ*<ĉ"QL U;R#2Rܨ )PNd2iZ,Fq5 <2UFrrr"eZhh(<5X".׀:x{r$ p\�^o/eee>'~qy*[@e@fjQjpl6T\DH,�絵usskժUǎ[X]]qBÇw؁V/Ub1HeT7솽p: ��G 9-oFyy+Wn[~׷lO?A1ֿ4lə3gȑ#{_0'~)w-[N<ի׈#c7o&MԩS'Ȍ/1_2V^}%Xtto֭[^qFƘc/}6c.Zee͛ujժ۷oرĉ:o޼lr׮]i^=z4P[n=tО={={6f˶l˳gL֥7}*p<u!jѩ/'HD"NexT*3yzuԩWTTd2X\\\,H(bF3jtȡHDf]6PM r>}$66رc᫯ڼyw}g0^z̙7jήה)S.\p֭(ݻwgϞ=z>}iF,/\5wGYxw}W]];::&$$\~ݻT !5Dk̘1={?~|hh+_>uTZpO8+,\1VRR2}!C 4cǎBk߾}LLL;vBCC$—_~cǎϊl}ݱcc˂ .]w߽{?J*++/..>v?~x@pܹ'~';vSN-..{5sXnݬYƌtÇ3fȑ#16mJMM}~3Y7eT.}:Co4L`0&صK72d_ 49ŏ\\,ZX( '''77w޾QF5;˫teJUTTtr�F!Q8f@&H-j+B5\^} PXetTZ)žt69`xSρ5GGGaÆ5k̘1ܑ/<yR6o޼B _ƍ]tW???ӓ1֯_?L6x`F&ѭnΝgΜݻ7m֭|ɕ+W~7ؕ+WVOUUNsww/((ĈDgddkܹs .HҦMN8qҤIչσw2|S8[n~~~)))qqq%322 ˽zڼyի"""222"##_^k&|}}=<<ZrYYlF`hҤcEEUk Qچ@'DF#ʐ`plmM˒$5M%L&kLcpw̚#Ǥ$BhԨQvT*UF%tE(  R\\rmF0 /Xsl0KR$1._ G`3+͂j,0 \7!ލGÇ?xiӦPh4}ԩS;vk֬gΜILL\vmDDċy?y"##5k viӦ-ZhȑQF_ءCٳgC?ٳӦM6l؜9sΜ9iӦZ 4]viii򋯯5kd2Yrrccc'La}oqFg>~~~}Qttt@ֳ2ooo\#===gϞ<f̘ꫯꓻ?O /[ >+A[o\]]d;�\萦'u B"F2jeYBCuYoIc&TKH}ǎ&؍"M`Q,ֹJ<<.{z>vqٶZ«+"-@Pվh4>rTVZ 8J/M3Lc1V0~1&Jf-r5~@ 5[@w֭)n߫W;6klΜ9 6:uꅅ~aݺu۱cGTTԻ<sɓ'o�9m۶};vNOO:uj>}֥K-[" N[n_|qҥ3f9O .<rݻCBBdK.ݻgϞ&Mː3k,|%TTT4gΜm۶͜9s޼yxނ(k׮B)ZкuK>x૯F''/ի#0zҰZ %!6btFڃHa ¬,kF$44W\#7Buk!cUJѝ;rήB(yŎf1kQQqQQmuiiiK䭮޾*&jȘ1+ ſf@f433v FjJ8FH"ZBf;()[@NHHH^oX<ydH4jԨ={ꘘ 6 n:urss^^^Ϫ͛7G;vXHوiUUUR_~ 5k.I&[rM6Ǐ İa>'"WW^mҤҗ^z鿙&M]^xPRR{?\XXG@7ի֭[Ϟ=vuueEFFؐNe08,4TԀ9\M(c⧚#GD))Y EdBb9"Zgl277?xzzL&Nעe˖jo{wwwodjtNII#gVUL"b.HY4ꍒRdIEGaeJ2YrU"b"P'@];`5]xȩOyҤRiӄBg͚pْ77yoEEEY܊ 4x/i2*++>| hڴipppe2̙3N>hT*<l|IJJJYY٣Gcnnn>;w… BBB>c??s%%%eeeob'N`yxxTUU . :ߩS'GGg>EEEwܩO,nܸlgghh]ZZr9-[$tťe˖iiiFZ>J@@!C5jL3ٹsbVZnݺ?((7T(NNNGMOO zXQ5.q�0a/U`'p6Pє޿/-+ZHcD o) GG;Ljz}f͊322BaƍryӦMe2Ynn+W/^)D `6%W$$Dߵ (\fX6/>\^^NwEC9>\Mc4333[1""͍܀: !_YY9p>X,{qㆍM@@S@ hҤ@ -,,,,,i޼P( {5kcXFԑ@ prrҥ fU(z{{wQF8P(DlX<nܸv!1dٜ߸q9s渹8::b_LֲeK??l |*0333$$䯥k? @dڽ{Zlo-Zm۶urrԩS<xpEEEaaJ㏽CCC  0h mퟜݻh?kuk7u)I&Q4*i۷o_zed2)J,$OH["41<=EłCsn@vppprrjԨFK4DrssKKKN8q̢"W2ija7pc@!Ep]`L`(bUiPغuVZYP KJJ|||޽{G9sF<x|jN rJee%Σ]tE >tСCiii]ylѣo aGZEOqqqBBPp'&yMS$yzz6nXTzxxL&wwPGGǴ4FB|eeennn~~~YYbJGf3Y mu 7Bip[ct:) jӡCFGGiӆ%<:}{Afffdd^H}-2O/K#3L(R"5 J%V1T:SJ)A@G.FV#egg٬F:SBVӏ$tRGv?SB9/x󇖓Ӏ21Lh^ ~lcZB}Vkמ: $ AP_.߹sG(YP<~8??4??HrY, uq6<դ4(Ra*\9(7~9ω?Gr1^|Uz'E2n}(+5`Y*JʐoR$Rqby葝�!lll@-((!^M)@Wi:aSa=PY,D#�qzՏ:5B¶?yVh,m۶ QM < Uf%hbIVj33lll?H$jBPP4n8//}EU*RtqqjR88-g{i hM~%ARl$j}CN][VVÇXqƓԹs}0MR 7@T$<Ujip`X8H`Ǿ2 G6 Th0rssrbYF |6>Z!@g�- 3Aדr al| lCNlj-󽼼2c7kŬ?~ܨQY)he^T"e[je('OP( v`"??_*:88( H]\\pppZnnnQe"qyă41陓f5n \rCNĝΩSZ7X, ѱZgΜ`2˔Ŕ!wTJ`q$ad2(;)..FcL&^.++EZ�"M9UV (G?)ȕVr[QObTc_~!7x5*/F%;KZi^(if6A& "...2LTnp;:)׏AL&?z$"lzV P$4A.}.^RڵkթS3g=?9FEEQǭ?ET:va̘1bRT6mzNPT?#oZnջw˗/GEEEEE*jŊ7|:tRRRR.\Aׯ/Ra?~R֯_GUThL {QQQm۶ݲe^1mڴĉ}}}1-N^a0rϞ=Q5;qҬ j9zG>y�ܲ*jqFs� ;%v27ZUYYYVVVQQj5^^FUUU斖jP$Mҹ . 9� 0V)%VfTCzrfsEEŲeL]^틊N:աC77Cl2((H>|UV9ѹsg{{ɓ'#z!<nnn999.\`CUTTExx7nݺժU'NبTqcǎرndPda0ϟ߼ysw}wu:~ 'N8qÇr l۶m�dG۟:uٞ-Zؼy̙͛ӹsCa&?+VdffvIӧWVV.]t„ 3gΌ=:88899A�� �IDATuC᫗c 3`ήqUUU۩m(asQ% -UUUٙk VVV ͵jRYZ]]]빭zX5I ` 9!8|^_NH <t:͛|ᇹ111?c2&&槟~1cF^^ݻg͚sof֬Yyyyqqqfϟ9s}&OPǷ|򠠠iӦ-X`ҥ+Vx7lj.]:w\|Oe2ٵk,XPRRBc>Ӡ jJV^^aÆ}Y&**jwo^q(--ݴiS9wk7n\`Abb"dӶo`QF%%%]xf$zjB1~۷?^v/o�] yĈzBLuPqX)ZLD V 7-[Ɂ&JVVVvvvnnnaaV$4o4:>IbrR١ܸRKx#ARڑzիWgܹڵX,ׯ_Ν9bX-Zo߾gƆ6åk׮7nrO?$J'OaÆ{{I&\rUUUǎ۶Yxqf6lذnݺ7xyeݺuӦM_~͛{yѣGce4͢E}۷2d6nܸgϞ...h裏fΜYP hѢѣGwi):ԳgVZeddjƘJٳT*x<8p@WWXt%۽{wZZښ5ke2 P�P)++qㆫkQQmC+l*nA%#Tj�8H\rǏ&Bee%=6x-B"$hZp{[=@ĉٓyfP)#Hڷoh]cǎݻ7""Or?T*UDDL&~z޽d:t/7o޼'ok.تU\d5kq+W`ح[L&SppGr劋 \\\"""hߌ Tsvv^n ~ᇦM>'ȉD3""B*fdd@8C999\'=VKA*l0^zg}v%B\l :(Ԍ1B8NTXe2hD4ɤ Nh4>Teee?ƿ$2aM0AaFn�A?0(`M#2o92j;v0a¬Y zm]t)##cޓ'O.++KFFƾ}ݻ7gΜ1cƤ\k]lٲ+V\p!<<|7o|\j~Wq'999ܦ>}42 1 p~L+/Hks߼pBưo>t}7ڵϧ-z~߾}ׯ_hyyyn݊$/a�kDX $d&_U*h L\2$" �Ijp�п:Nt:I kr2MxݴiD"6<s]0" MI,R*DQ({𵢢b̙W* 9r̙?{lXXXn?vؤ:%K1?j (XjjjJJѣu:ϟ6Gti9sDDDA7qDlw'|ҫW;wL41p֭G/<UUUKv/s111hrʊnݺVVV7n֬YNZZϟ?{ڞ8q"111!!GjSKPV#�0FUÄXD�9 Q)�?mE+Q*x4(W˕Pm={qc۷Gq~۶m}}}ϟ1oFFFc޽[jT*===M&S޽>;w0BBB( lݶ憋|N碙tqqn[޽j$lΝ(Fb?zmFz^EsѢEϏս{N?ӷo3ƶoߎhhLLLjڴ)T(;wNLLo>''wN/Xh4 u2V!&&UsktȭA$ ; J -:1"7@#n†K9S#B1qp㴌ӳZP)ou 9vvv:un>ӞhV-[rJ݋c̸)ɞpg։h&ɨ7vVjE8k<IG|je5!dX% L:;;??j5?Ï[9cx3]UTVVReJABX,zPVv(l6 NI5@-M֤I +A &(&.4]TTk׮?`oկz=E"C .eP!y.I(CCȀt'4|9%:Cj,E5ʸhZ.Trt6WJt)F=DɣaZx+!Nŋpt:?2nK.Np \p/X(CAb�(mCre$jeE8+7 ёE-ZiR�9$(T"בxNē_\iԀgeW1LV^pi Sf2 PZ� bݑsp"?$1F@AJ O))O9rP91w!5NG:|6%u`HE~!-993h&?6x /ͧ)\\\L;I1PҏQ&)#mll%A^bLj@NaFp R 5o^5 Ɍq٬[Sֽ{QTu/1݀V5??m@)r\rJ>Em\+LG?Q >5D�K{� w#9F(AL<Z٨M5°;@)J&Q+ P p ~!  Ξ=L400䤦r(6bQL k.pcVBh4mqbA7 k:ްs)8a(FHQzt:&P$8,."L qK=?Kmy㭡WVUTZVPR nO6"�S]]h"c;`` 9::r/1r$` ՇBG= Ka7jF,5Zx<|WzTWW}5~w9//9)<Z={`&5k@@@~9]vuuu]d Er]]]?믿6o<**Yf.\~9]tquu/k&=zJYvuuEwghyzjVb&[hq}XLLrmۖOrcbb=zRP N+..j}=�o߾$jʔJ%<Z3Xoܸ1*~�68 u<F]7E9'Z]J2a""cOHr};buP?55۶m?3xDX׮]}||O8NII)))رcJJJIkРAOjիWjjjzzzhhÇ===SLb9^ti~+ovҥRGj .<G||ybbb 0vXꗳaÆ;v<2?1Bѵk״<GGǔ&M<۳]tYz͛Ν۳gc&çM߿6lܹsfsJJҥKgΜٷo_L'MqǏk4ħr\IJJ"% cAy&Vm,78y$rZt@}6Iwϭ!AOjI=诃h+6L,G~u!5hS:s`mɒ%7n4Lqqq3L?srrbcc8`2.\u֟yڴi<>})Snܸ`[LM6q/^ܡCiӦƮ]v͚5={|'Zv-/Xr@ 8ydll,a{V Ƶ[K,i߾}ll۷Oݷm۶sspp;vlbb7ʶo]g{Ç/_<66vÆ Z~clllUU?cccV/Fz뭷֯_߀PO-_I=Z[C{߿רX%L2P {ۏ9ߟk&穖�ep1k?LQF9rdԨQ)))a֭5jH$:vؕ+W>|8x`3<3j(OO8T*?㐐{,˗/={6}ݹsw}7bĈÇcE|AΝ}]|mڴ#4iBK~Gd"Ν;dȐHgk"hĈgΜd1B.?~|Ȑ!Ǐ֞j۷op͛Jg @;18#4Pfjsq<r&p@yEA`5;HKKGL#@Gq<҇e52m#  QDXgt:FDK_O:UZZܶh?vX6m>$m۶bCÇz.,,̕O%}~:::ӾwܑH$uF<GgݺuxNr@啝 FI$;w` j޼Ǐ+**hUUUjL 8 d"¡jE?n^ jt+`AG6"إT*[ligg(qY,r,@Ŏ\d2]pAV��DOĵ wFVqjt7/.TUU͜9s)))5 XdddJJܹsl\s͛7]6%%gϞ#GLOOhժǏwڕׯI(c,##}-Ce!k/^XPPd8AӧwwyڲgϞ(n=Nsδ'޳g'\Vd,FG$abO�][#iF7kl۶m{ppDN\$~Y]?D*avr9| nKPVQAfa.GT?رc%%%G޾}K/j*3f̘_N6رcsyqn{aaaƆ?~jDDDDDD0RSS;,X`ڴi/_1cc,99ʕ+;w/^ػʦlͦPBJG^b U@XB(  T JHHB e{~}AIw~pݳ<)Siڴi=ΰaݻ_pfr'N7lSLdɒ'O&&&ժU|'|Ҿ}7xF7o^`AaaO?裏N0aԩÇ7Ə#Gzyy{oQnB NQ/�^&{e'qFHBdddLš{傿^/siơςMsĜ b&SsJ,sh4n۶ҥKjպsR_~ZZZaaa333oݺդIB[aÆUT1Lfڵk7n֭m6o޼eRRN#fKJJ vFy{{?}3㓐@6nX`&Q\'))I֭[ի& P4$[neffYݾ}{`+Wع^)))OUVJhVQڵkOZ*5gJLLVZjՒSn]//k׮߸罼B$?VW^ݺu_|Kc൸Pzf!i)ɠ )$#?0N(}K16EH�K6q΁,$КlFizx ]էO>}j }#m6p@/zjJJJ׮])PXX??^OZ?V4VRJ*BZ G]nݜ9s>K.ըQ[Re{'K{IQ&f$^"[n_*{RASr+lO*UY˗u6Qt1$*L&iEpF ַP 2pe'E> j'~;4r2YP5�@ p٩T*^' �Q 7a4Z۱VAk%iB,]XMn*_j֬nfn@= Ep ]L|STY,2@HKKV5 R�8h xQ\"F84I)ax%CpB 2䡙cǎ<2GyXgs(RO?&@KѨ&Xl\.V 5cuzf¢A(d \v<ŇmҔnN†T^�u=ngNg6m<ۗ۩T*I+臌*x{{$1Y f`:4sr<]Y9,z 5DVK Q [l۷o#S# ȇ&i>FŕTWMnStAӱc2xzͱvXv^ dG EP|LA}.CNԡM#CjqR|ZVzxF;vldd$JA+ VK3^^^CDhd2 %+w!i�"{ժU{W^mРA˩ȅծ]B*/`ݦOF 1nB~ExQ\Ɔk{{(D&F)((SG7 B2tHb!hB(-:2V[=rZ;L\'OtuYnh3myȀ`FL)\CQBSJUTTr)JCn!x$ƫ~k_aa!.xSn"NX!P(t_D:u橽Ŀt2@VԽ2*)؄6p٣ڎ*,HxB2BbjBRa=#ND^�9:-9`F/Y,TСÉ'PrzD1W<C8$Xj\˰hTEEE�2@2RmsSi?тW޵kիW?gee9򩧞 ~Wn߾}wlԻwիGFFVu:ǎ5kVթ(??ڴi??߫Wׯi&44C˗/7 ˗/СChhh6mRRRJ{/^l߾}=]v/4UV;ÇnҤIhhh-vʕ+۷oڪUׯ?s=O<1y;vh"44I&~E rjZ&kf u<'RQ *DPwEs6hP(t ›`NBפC'L (gxK-!A_ȸ|k'O B9s棏>ӧ7|Ӻu낂nӦc=߶oߞ<]# ]+Wv%5ӫU6{lcm޼yԨQA*��� �IDAT5tJE˄k׮qFNKu;v4ʺzj:u*W| ///k+ uVt̙UV^'Wޚ5kRRRl6Ν;,Y2nݺ͟?ƌSNmԨ… yҠ{s&O>y뭷6lxرx{{:u_% 'N!ի׳gϲƍkٲ-[ o\^^ܹsN:cƌMΟ?GKII_ /O<ի{=n8zb<|c ! J *#B|I5I #Pd@IB50nD1HeuEuKy7`iT@(NDlnPn"tСٳg۷oϞ=M41 Fs΄ V\3ϴj*&&ԩSO?֭[wܹbŊcVRW^s1 hزe˖-['NxP/ЪU>c>iҤ^{-''g„ ~W_}uȑqƞ;w.44422rJru֝;wnQQ {_rű_矏;qI&/,,4hՂ7n;w<{7N:sO=T5&Mt:{>ZlΝ bdd.Sd rb c° )B& DV>?q86U&�˅eR\V Z`9ĐcBXj.B.w8+L].{"ph0B&42ZsQTTTlll˖-6l(__V#G,[,==b\xqś7o>t'|rҥ%K>|xڴi!!!ӧO?zoXX#<k<yqW_͟?>޽ʕ+zꕞ}={ԯ__~۶mۻwohhhbbbݺu[n=m4L֯_ٳg>|D?RRR]FU򒓓҄AAA#FHMMݳgOXXعsNZz77oLLL>}z&Mf̘9l&R)/f�E~*o[.W(dBYdC7^, d2h4vd*!ř̦h\BܲltdvCV4 R&! RZ,BDd3ͤIPBr\3sg)3c r\Rk׮맧O4x=JC5k֬d{@XPPF_PPi|RJTPPpʕF͚5KQndɤ騞<~J*u900=H:8Ns�Pv82! lvBP(xI4ɡ;(J` LISIvBr +. prYf܂+^2SPd%dá _\{ sdB t 5I\.Ey'ݎ5)}7:}K^~y}DDĉ?SΌRSSww26[ouU?hw}ڵ %&>Xhl@M6022?^~}'O;vguoΝ;S^L0 *r V3HW- lpb<"N -̇ơۈ&M-x`kZ%\>oٲe9${/ ޾}ӃBCCcbbrrrzѣģGZ _i_~eϞ=cǎ=zaO>A~!}Rn:̚5d2knٳg>|x|||7lmܸqϞ=qqq}􉍍7oK/<yrIIIcƌ 3f̖-[RRRJѣw͛7M.Zz-[f͚۷o_ٳgO6m'N%>p… Ǎm6¹3wΝ'N m޼ٳ~…8QFftn޼)b8p=3N6ۻ/l6WZzegg׮]EEEZ䍇Go߾mXrrrrssԩc6 �R$lyyyH.___^TTD;WҷAAAV֭[ڵk~~~*UzVEg~ʪUdddƺuҬb׮]#tM@@^7 4{JRRo_][jԨa2o޼i25k6u!CBz>#r:E3777''g֭[FJ*l6 Yr�+rۻ5%///$B]vӧlJu<LDV=jCR+ uQ¾#G>2wP9H:ӔdVE/2{r !ڿM\'\.J*ўM$0R XDB 7/!NQQ{s7#nzٲeĉ ,wω"w?CUJ?|Jܽ?L&/Qnr".D(.]<+pn >5nr[E"Cߏ:KO>C\FpTnrSE92!.&7Mn@"rݻ=#nrHscuD!*$-'3t:+&#UkZOTD %$~'rz}7)zS_*zzzV6MCxyyQhŤlNVu:]Ob)**jVnnR8r]˗*WܺukIr OO 80  *N]Nh^^|,{f^^G">`8ٮ] hߕΜ9p8 t3gTRvmn5:ԥKF|^ݺu͛m۶u\p=ںuk!D:uڶm[L^Oh4VV1_~By&"7LLLh4 4 #..I&UT){f^N8Q~}WNu&7E&7<xV[ǎ;V^ֺ/͍{G/^j۵kw̙ݻ�vجYr_ǏըQEsL*U y Ƹ_XnީS0'N.]TG lʕ+]vtw 333>>M6%fe˖#F*̰Q)3JLL ;|SSSK.6lX ԩSׯ_/=O? 6׮]=--<&Φk4w)ST,\p|RSSϟ?9B[ݹsOsXXX|||yZ9۶m>}zvvjڴ_/ѣGSiӦ*z/^3gBR]Vrʸ^{.pBʕmvر3f<18p 66v… 4طoh" !ON~ԨQ:uիWDDɓΝbŊӧOg|r<8iҤ7nyzz…{' ]cذaf2dEѣv횔`!Gi d2VZPPV^٬Y:u|>X3f ]je˖}۶mBtiرBSńH;vh4ݻw?Blذw9}",,_sθq>c;vBt7W^{n!D%/}bcc}||͛7BHi4CBBppƌSV nڴ Y2H<<<YYYe?H!ӧyɓ'׫Wo}}饗Fٸq'FEE={V߾}{„ 5k֔^ӣaaaFcbbp f͚7oO`\FVΓO>٪U+^?jԨ˗/ڵ ѣG۷/::^z/\yp8z<`k.ZhРAЭ<xq>B999˥Kl6[BBѣGM&Ӯ]Ο??gΜ?<::} JNN;qd _xv=B'ڵgϞ>|ܹ|N{6m 80!!瞫^zttt||!CJO$%%U\ԩS~~~N*% .:]N6~ŋ^:"""!!!::jժ>lvv ,Kttcǎ7nӧ4dŊѯ/x'N! ň#~K<xر-"KϞ={Ȑ!#GKcx?jjÇ߳gϤI3iҤ~O?v1}p رcW5jԙ3gJuYf9s&88i4_x _ߵk˗?~rݺuٳgi >l4wuŜ_zuҥK.|.\xԩg}j[BR!&NHgϞ^xh4FGG[VAm߾}˗/+,,ݻw:zVdS#%>>۹!d6&f͚K.A} WΟ??wy5o[j_~=??_.֭ۺu+;vlܸ4NBQƍN<vZpHm t:]NNN@@W~~nɹs{} ԦMH/'f+l BaLyfl0*Wl6FcNN]Ao2Je@@flJSDիW'_u^aÆveggS ׯ_'\~LLL4L4Hј|5M@@ի7mdX CJTB3IY`t:…  E^^^|||AAANNI)讃W^dd$?>f̘7x#33>5jZ^|yaajZjXX۴iӦM興R\R%`Xrrr ѧԵkב#Gj4|YOR4i2sL^_J>!!a5k,(((hϞ=իWjՊ.8%$$ԨQc̙UV-f ,O0aBqeee%$$ :T#GL>/;JӧO].[LrAbb7nL.]Tf͙3gZժUkȑwVZ,,,LHHxg?>Ӥ &[܉ZD\ ===LWJ>Zn=eʔ$bDFF3gΔ۽G5jXv>* Yd)S<qqqFqƃ'Oܯ_k׎7NҞٳOGݔ)Snܸ\z*nVVȑ#֭[Jߤ7oС'O>x zl0nܸW^yИW_}o߾qqqPKԩԠA)Sv M>hڵ{w6nt:㣢Gׯ_BBw޽|f͚ZT^)S\3gϏ?͛E+ϯFB//@J/vh4Ι3火 b˖-&M޽`ؽ{FIII8qi&LUFae˖wՋ-*ٴiӰa* 0aBZZZfѣkԨT*۶mw޶m:UE} (<<<j_~.\;vlƍ>l6תUKQR5kiӦ3g>|j1HjSfsεhWөT*LF`MRJHf>yd>}Wzɓ'Ϝ9S.GDD :t;^H-}K!!!w lҥ֭[ܽ{-[TZu„ ӦMSʕ+/_nXԩK/F,ԩxe˖w޽`ƍӦM;wB0`kv9s r!C tȑ?> �x]v !T烤CTz I&ϟSRRZ-'NxPڿƍO0aذa7o6L۷o/W(Z600Pm޼_~4{6lyf`` 5hժՍ7\BFv>|h4n۶_TUӳ ޜ:u t U4%>> TIh޽]tR(U˫|ݘwn`0 +Pl6W7?>aXN$'NxnjFcV"##9 ޠtPґ#G̓e5z֭[w_:vXիWXX??ݢMnrL7oTRӦM+H쿖"MnrL 6\l 4–gn&7Mwׯ_=TtPYqFY O HKK+/or~~~@@`0\zt~~>!Fc5(GN"pr\RUqFzz:\@zzzGrrrj6+C8 "ڍ}�N:BZXXX^"r.h4VOXET*2IBRVZF.+ j !l6[QQQM4VdrL&SE~5j(/f.�Irk&7MJzZVVKxjՊ2ʷC Ǡg~WW)ސf# RiO=*\ԇl??+WmQ,) uvرFq\Vt/>''… :udU\.?"ɌFcEn[tGyrVO(%%r5nt>4/DNѮ];q~hHQA^JJ(/pwu&77MnrSE9ŋٷn+,]z͛%X}xtʕ۷oN'h|{E^7oVdߧ7nT&Hn*%"}1117o+ >E2͘1㩧z멧zmmJEEE۷_b>9z;s Ǐ֭[fͿ@M4W^�Srk8p˖-5k|WQQQ<xpÆ ĉwyСѣGĄYS׃=zP%K<W^ʚ<yri믿NII _jU[hJsƌۻw׭[@֭ۢE(8tP__>W^.\(***R4ir*7zTRefͺ| 0Hy7m4bĈUV=jرcBvڅ)SF/:t2L۪U+WPJV;gΜ_~ܹs&i͚5.IHOO6r|…BoԩSAAA-Zؿii?aÆ/]K/shܸqbb_|Q6" 6\|y֬YUVU(tӦM駟RRR5k֤ !zggg=٭[?Y޽{L+Bmڴ)7ݹsg&M֮]kZCBB]֦M_~RJvĉ= C~۱cGp߾}ߟ٥K^zfBɓ'geeYfk׎z'@7~zll,4bĈM6Q3RJ߳gqƼO?? !7o^nV_իW 2v۰a~C�� �IDATy֯_=xÇL%K>|8&&&<<<&&(4o<7...nذaO>rׯ__cسgϲe>4|ggg_~޼yqqq111ʕ+111iii111N3gW_}rΝAݼy3&&fر .,@%iѢE~iHHHAA!CRSS RPPscǎX,/Ĥ<!!!|7cbb^}?p̙SNmРAӦMg̘{%߿ʕ 9r|bGq֭of̙ׯ^JСClWܹsĉ۷o9sfFz1c$''oذjٳO?=s̛oϟ??߹sgtt!CY&$$$77fuСEoFW_}5gΜSNܸqcȐ!!!!k֬Y`AFVڶmϟ?y7Ϝ9C?Ӟ޴iӼyBBB.]4p5rȲ>|8""[ncƌmѢ̙3onܸ111xTFMF?<h M<G>|pHHٳg r˗/LǏ}ݖ-[f͚裏 O:5nܸJ*u922_?~|j:t0gΜOޭ[ׯ'%%9NuaÆ[,IժUo޼9|9Qׯ_i׮]&M_wY??)Se.> (((99`0$&&֬YSNr<3ܪիW^Ǝt:iVϟ?Of_8p F^XX{9r֭.\Uֶm(T~ +J/_1c۷}|||||222JVʩ_>7͝:u[njj`:uRTϟYfʕJeff-˙3g;jժ۷o߹s}֭kHGٱcs=痗&p:۷yfڵvGRR`HNN]{W}-{=x`BH8Nӹo߾ofڴijh47NKKСCF]FH*W<c tgr>}zΝ;v}ҥN:UVٳ:uWŋ о} \r%((e˖wܑy睖-[ܟ ؓ7n޼͛7>˗k4g>K,?~|6m""""ԩӦM4͖-[fܹsv?tٳ>>>:uo7lвe;v<~~~cܸq˫RJ999XVyFdaaatt",,p{ǏoҤ /矗j{$JP(q2ORni0ȇbQ(T+??J7̲~W_}k׮Gh(vÆ }t}||܆ $rիe4Hǎ_&Lh"Q39gΜ ϏZM+ e(RJǎ۱cǴiӊ֭[w/U*C}ʕ'* B5kVnHV(;wU֥K^~2j*F6gΜN:L[qٳggeeQEG m޼zaaaM6XVbccCCC}}}?؊ c$?*2#"_j\\o}QR9p@rʱ{~ ֯_lٲ+V<1115kxZnNNΗ_~IGEEo>66aÆw'5m$3(=>}:-yp|GR7^㧝E|}}!WZUEEEӧOW/x}W;v|ãG߿ڴif/EEE5n866:򥦦N0Eƍ;v,K3q@*?xӧ#Fػwo\\/,Xe˖QF-Yƌoޯ-SpB<qڵk׮]{֬Y}YppowÀ:v9p/_ȑ#gϞ-wzg}6k֬ .Z諯 Z B\paȑ gBv 88xҤIu-ď=؆ Fٰau)Jn۶VYbnO?4! _yk׮խ[4iR͚5cccLҰaw} {3g˖-+Z-OUXXt駟7n?>wܾ}qV xCr9rwE0aB```Z̙fFCJh&LXt N~նm۾}.^xذaZNIIAg?~Ŋ;xhOڵ^8~xϞ=#""N8Qc8tɓ''MT~//rn09sm۶m۶^`Q.\_ʣcǎ 3gK/иqe=;vxҥ{wX,RrNRlԾjlZ(YNj_\(xs_VL&ST6 O Je:uw%u#}@>|={\B3gF&\.9f}! Fw]VJդIjUKl n !v;=]PXvt⭱j2c.(xsMiЀI4;TA/p8vL&)9Ϊn*>6ߗ+JI\nji`uZԻẉGbcr9\tr,I\͙3g F`q00)$Vh4nb48hh%O=d#j(逖(hr%\ٳ#FueC|6sY-ǙcsK>|(?2Ѹo!@PJ. ?ڟї/_2dȝ;wz%Y)ܜ,҃dM-YY _fSEq>qw/ꫯFСC/)U P-*͝;fSλKN'-YdӦMFqĈW䦊Ln#(_,O>3IrVZoF>>>p}\^2ܣv=''G|Groo#?kF#B-?/?V?n5K6jE%!DAA)_Va}$Ke.]*߶CK`0VO<K U^]@SVSTJpEm߾o߾nMnr`]kN\e&7M1y{{w7Ory3m۶d2\.\N_U*b8U].p\t\^ ر5kV&'t+D&qB1vͦN'P.`ٴZfZ@(@?W**kuz `tM跔AC+M+ ///՚Gy~N&fLu8HR([ͦhhZrp VX,0ۤgd2d2 ivނF# !hT4T z"^tT*JSb t+RPP͛7fsaa!M2BA{JR >סW |E) H`[Vޔ^Dm&j*+N;+ic[kWH;Dq7z.h� OWKM&R]D@?lj^Z( ǁ(#g~76n :#t7l( F'D$tt:ٌҨ4hP6 p ?̍XEItR 'VVLq8EEE?ٳgoܸ9pa WA�&OGnEWҦsE9YA4 G1;t:\.ZSGk|0tBޡH+77 3+B<bśR9?]`d 鬂 !<<<o߾]TTDfnEO KgrY,p4=q%?ymJe0 d {9X,غ=DqPl G@P@Hj5m?1,Ky@2Z@{Xqh]8[lPCFT* ݇~LrQRѡ;[@�+`$oDl6vH keDVTVMcKӕa׉UPda[Wt -sl2ZP$2J̆%6ɵ?<Zm2phӆm8`xď3 NAOpN$pիgiFe K4 @Stf Iз,]�u b"Eeysa$H/BOP*UdeeLB.M܊smQw7^B�ۈ[xBFbqt-:`M ڏn/$n7M A% [tR-1#j6_nt&؃O Z~Xu@F%<<<!iJY.ZCXr f >hu򆖍GX0~9 n83Fv dB.hP 29|NtBW؝:w DM:tULhLf)Μ޳ ]HRrA}ǃ|b4)a!h4R* !qBLB;wFwJ`J%1ᨤj54<HHw0 8HlC0 KDG!Áå, Z,c^h!Aa`]8i(`|aPn"^ۏ_#iTPEqVA}%q.qAso !^'wy['$CIjڒT.kZrVc!;@!)Jc8T FvPX$T|"#LPЦT""ڵ sx fLӦvQk4TW�'B[P>g�DCa62qॄh4 @["T4 f &!(^ <q$E/,,$nhvX,2h4bnU*[L&0t:CJ"FH{i5�9\acx$wzCcC$RVn-dЛAI>L3@ҋ<$6H\V&{ 3ۉĤ>BC24pA*r."Wbs$o(@je>@R$vg5t:B){x(?pPyd +b0k!VyC#b !M ϚEIV,0GaGH傜<$VAw{b0t < y ۂ e%)*�9$q90e]SAo'&if-l.**"yYN6mBPLFAjRx�5xEBܜW,KC ?6dt2pOL2 s"nj.\6\M V5jJ;WiVgFtxSS# h(E{v fnk0rrra7H>*9c+`bɀp8']$ `C`1piBhο$A ~Ƚvh ~y\.ׯX 2Zwj'BENͽ$1;'�C2ǘ{ Dq-gHH*0`R{`F%AE8;W�"Ac|S Ti,)DiigEۆhkZ` E0q1Ub{ӨǢ h�oT#!D1Ⱦkw\+WS <d~8ހ>咒Jg6F,]mO px')Pu;ʚlS"i]HÄ́µ{:*l6'VK�`:a 6Nb8(]e2_#a}չ<[FKt: TNgkrp/";Y<sG%pL*BJ\mJ(b쁏C�DV�|ri fh2 d:S s�N@ <!-Dx(ĴH~CRI" 8,WbC,$E (I$Vxzz\v-++ CO/XP[ I}Hj|$oAi#Lf<+Urn+<l=t%P(xn_!` :�Bh8h4L<! J>diÇ482Y)Pl֫`X,ڵsHuVz6=|:DcpC 8DdI.¤Z9*?B5Zkj0hEx"F�8Bnz N$<�čf38&\p]:",y _w>%5$QJiu;Ė N7%hI�ڛ#5Z-p20=z2en_Bwqbaii&_b jr>IxS>9@}(P$YiHFAQY[È$1oг{a~Dz-[V4vQT{kl rbұ'4 9DȚ%@O0)l.&4p!�Bn  (D\~6q<cݘIDs)yHGx !ے@ od)٠(܀'Fیc 8WP]�8 Ɛ Î88 ORә)3 ' &8GW‡Lwxk:IZ_@h?PXQpHıR-r*#pAX,\#H 9t·MDUVn `N[N*m6#F}T嗊,y8Cj)xj:ϓ %ҎWF JJE a6 \O \<qs{~3hajC G(V`5'OF7"iEd$f1P4Cq Wם;w IQ T4:X/< <kJ`)(((,,6 4BD+&_y XM x}u8cLW6PI [`<qGyH\_pv%Q"mp)BdPCg@�|咹\u넏23Qx><G\I?`q>f3)pAOp!l.!g:]i6|#D"9XP0:^h($ǍH3�BLB:ysH G ;dpPLDN8B%' ,X^0an5tFCzGR]vmܸ-[Ν;{+)!)�D58c}$c V&`h4bWTrjr=<Ctyq�!g[["h�� �IDATjgⴢH& u@{s/Ц}L�Ű X,d#6 YgKΈD@>ezZn9eN ߠQ< <铐kmvmvhN ~jݖo(P$aYG J4hiD3@AI҄Өx9'I{?m?T�z1fSJP(! ˓H�ˢn\b,�D;9iGBBBzz;wh#�v�HA @ HZ&JUlB}8 ch ?VÛŔ݉háC`$7 FR-"GU'l F=`8ʆ0kp aC̼v +ʁYx8{;zVP³`"8lg OW`qkЩ'w>A\1-KgcE<-^[WbPp y.xAN $oPj\X:|MfzjZZo��6Q#DpLR'!&,-Ix&xxC,RE)<`XVz;Hz?((2[9^Ux" YG%e\m6qTYHNDa 1ZpGIq-2QX(\w 솗s ֓f:s /cL$iV6 <M V_C y)|%%8f!w4q(0w{uCPdžrRq{^и��nC/nD_PjK#7(Ab2h](UkJ DzbLySG^{j³M[><Mޒ (WIԓ;8(+md:mvNkr;FcS%J!N �z1"<*)OI\T9 `pq6ҿ8]�rAp6ȰaU>h5~%f-&Uttx00V>VX`ʼ#P8&MH*hiZ٩K\p"8 *;a:Rb q^`ϡ5A1@X?3իWoܸ ![r<Z/xU(0S^B)UuI(Naix$BH?(RmD3)yT*OO|8)bU൯!n4`+ƒAXWT) y6ENy"% Ijl2q:zz^P*v6ic[P-aK9(J$P`tB|j jPM)uw nQ+PJ{`\Ar 03Q0yb! FwB[b+!=q~eo(lΫФgirM]؁KJȱ}EK #Ϫb9w\ZZZNNf�pa TI&)h({iw�_?W%DxIAhukZy g$ ?P.1 W<=Eb$uCp &s$KzV~xLXrՑFkڪ~~FBٷ8DR 2aBB{_{|a/.D 7DBnjwJGRn Z SXZ[s Xa[`yƻ..Bp}6+dCE,#G![`mp,ݐHSk9E h3VxD&fj;wDЈ|P'|!I?u \9<I7CG"Q`!W'WyH*Krx9F(+mck^q;x3,w !u 3LUh"Dw6mz .۷#X/XreRF#AENz4,j,+Xaķ\H<P*q\V1#�~18/,i\ƻ$P*=ĉļ6"HsWFj!D&ȃ8O  GE(GFDnxK%5Fk 1ɵlZ>(>GGAAN377V 1\�LDq1@-D#|D4:u4oԩSPx}_Koooqp`7�Oΐ<SYi\}I ^2L@9&uP۩SFɄ+�'5jԐ7o$ ׅkժwuJo^C8y4e!s=nn31ЙiH2iF>_R`tI5OLyE<yVSm HBPh8$5(E� `o3օ^cxZ;/ 3KѨT|C2=8?l_ سÃ:թS'+++##<==FcAAPdp_�h<<<yx1- Ao aH%C@E⑆̼h$,ג*;'"CЊgCU$Y#0U{"%̋rr:IIIUTxbVVVK=8zL&͛7z=*y*HoX Yt94,J.)}qq;ePH8r,}kw~'DˎY$vE?WPr(Qʼu Z8sl.P A}F!WnN!ϟtg(^oBh;,GNeof |n]I�%Ka VjFCQ(gϞ-**\EML�p!DBB•+WHVq7jZooGy$'''!!Aҿ7!$4؎f E^[*K+}V9OlEEEz͜xǠ$9 y6uL67o>qDfff7>((1l楨h-xEzn߹sgE\{YY,Ѐ}2򆞒:u Stѐx@x?mh¡Fggg4'@'#*9# �qj4KЋͨ#Jt(!o9~ Xڈa^ͼ>@U||| W7wtj&Ibb4V5ĻyfsIۈ0Knnnnn.O`./ ^ 9<M55x'~Wa�-:G2 Z u`(ˍ/"vPRxSjw,xC\G jZZ7lVk}z ,;#/Gc3]3xG�Йw%,ވp 2 X!g( ;7mc!@x=|aW 9 ARڎKnܸA]Sa{aځu4_ZQiR2^ҡI™&Xs؎xc`ō'I~ jħ$Ӓ;''1}f t:NWF;wP1I)JլY6m\tѣEEE%~_Զ9%%EZwIpp3axM^:v ۖ7|dmxjIMZmZ* /-r˔F9s$b$dNV!D @&S\Gyf% ;K<̋1Si$<ty!dN;vlTFg9@�KJc!DpP5^\Db �-@cE"( &9+ 6 PxcR b6/^c<:>Cp0,psQTNDZR H5iEh?vfd[n4F@gB'4�8N-B(`=țJSaz);rrrZgժU-KQQ<~O>ǏOMMʠIp,?M QE %TҟAwPzOB4}\q7Ly,Mܺr*D,GT*[xxv:?Ns:9!dV:jơhhGr%@|,eC) `ԋ/08(yrH6A"&;;gA7" &D ̀ƸI^EC!-ڀ+ord<?\jH3i@ �K+ rj<ǧJ*TJT4Ryh׷J*ztfeeeufZUY={Vi0Zm@@[b9ydQQѹs233a@#a;Pwx-TB~DWx Z^ B d �^-Z8!h4 *ENp4^r,s;{$*J mB@<[<ۋjx56Q*I8'B<.6 "(C%AEs k\nGCLIL-XOؗ�C%*p|0o �.�* )p!nkx*r@AS];LR%ܜ-X!A�$-˫vځF1 (???W/GM,޽ ^~Yy3G t焄䂂ĥ>Hs\$HZ'ˣYJTw�:6hB퇋|&4ArvEw^^^y/pw{; ۛ:'J}�NYA&@(WQE%U;8VHvS޻I~eOUWWWuOL&0!J/A@P]+,"Ded1 GQ\" "k|QAvW3rV Y)!sLtwuuWWǕO|&}<}}eM|EQ󴑏}+%4*d gWTº",crr t>LY}L>ܧ]o+Q|脀PN78NZ["<sD8yc В޽{/<x/?GK|޽yOouԓ:33va--,,8q"f;5 S`֓E,r[u٥e 6Wc 6WA [J8"ݻwޡlsQD> g|!~՘5Al-iO֤l .d*Mغ!X٪*� ]I0nFS(~]K{"{y.!D!KW!&#!_ r*JȽA}X쇌_qNO &jلU2}~AD |Yi?[vg?^(gǶKy[޲1ዾGٟ?~'>& rf?NfJz&|NwlIȣdE E]i0ae FHUK/ |R<<yriimhN)~ 766uxCП3;N\`_!_珂Cgϵ|mNíoLϱe"yaR0g8 22Ǵ?f`tJmA-hb#k[Q3 '6,Ht̼@?Wm1н(+&p)s0אYȄn?a0}g_K_j~cӧΞy+>3?s?h?>/SS~ÒT2̰?L 6 4'(6gVP'=]/T۽0yͮC@bJlV|Tfr $$i 9qاv٪F� nz'9vQzMQhbާL+솒+?"5drr#@ H*k$~]Zѡd#("Of{s)bJ:+]K֞F)S~7"v.<)S050X$;oBXOv:+C꘢q $ewٳ/w襗]v_\/B?͛oo}=?}[m6O= D?4??*[|= YAT6DZ}̎BS/e"jSȄrdֵmsLe:Ge-N6`$ym9|;Befem1G&ɪ$=cT` :UAyP)faYuj2O`;U,5�{]U p)lyPD ehZp޽Ngaa!$[4X=/~ܯ:XX @9Arh*[9(K{4-//x VVpX277޽{{^t-?ӯy5|3[OMo/[r}.˿, ]\R-eE¥m$E:җGL`)Rs/r$J8erBZ+-Ђ<S$G$yvBΖB+n *Ȼz l+&|LɒX.Ƒ�bJN |t*|6N2r␋y:&.igX77}WMW "0;2 i% sssx#>Bϥe,q48oO=; oxҟIꫛ++Dp8 9ʦX32I*xC=7kFANe1/K ;ڵknn .}mm]w_6я6oqp_ϟK/=ÇG5`jjjyy9^`zܥ?<�@@IzGRn5T96FBC$Ps0G"H�כvWVuf-xm 9<<WilI+.2;#?8ْ|qTz2@:]`~H@3?curk*p9A<5YƢ H>[9@N W;a4aO^[Vz\><+2W5Nvvȑ׿~?k<Y1#|W4fY`'Q;'ffE5ackzzB+v:tݭVkϞ=)烉]pӅţ)R%?o>o_=p8<1Ut:\pAvQRcG*> MD,?h!nS�*O#nU=),�ި*[01Rŧ~vBζ}^l#?bV3Fj*P ,h`$ v[+dH�+[Z}.m\z蚯IΞo҇AY+�JPQ.ছnzM}ٔ%EWG˭Mqcccz]:GTe1p.3SI8poٳV:�JKEK\|I$~xJnw~{S>go?So|`׮}l >O߰krZYYvǏ?wNn\O6a95{I,gKR͈:rAJs( I+t TuX CYi<!ڧuwBSY4-\V%l.Va�� �IDAT,=biݻwuuuii �;m9|6#ATUŁi J`htPj+vfMo rP,63/ ;BPI*7A!h \g_iꯞ;wjfgW~gWc UÔ!O)2?v L0{iް`+S,}>80n}]<y|ht}WWQ4^uDKsҎ8- E|L8H\?~܂.rPG'fuJ{0 3_Fŝ^L+1SH0BOrV:g񜠽&Mq[ߗ v<IOzO|�\*N4()kj?xq x ,byJYh|"bF„4tp=LJl5Yՠyk\077l6_?Wٟol4׿s9 Q`9SāYБ#GN8l̓N, _hg$K83lz%r;vl̙_Ϸ_7K)?o4,ARΝcAK0Q%9ȃKúDĀ:z8= &ʫe"AlHyk{E$`5mMGORvBv~K)3wA2]Y3XRnѣ`M]PW$ԉ(e.o}[gϞ5>A!YZ!0V|eV8;p2uL<(`+|:N2Gh :}k^_q$1.frT$"Ir gZ~!ii^N'zhi0FjJhܜ%-򼖖o\}[v5ht饥~c8/9¾}Xz< -D<Keg`?wR4+*]d,bi{/SD: +x eBٝS$P"-754r˹�Su=>KXMHcLރo?vX)!f3JvG}|>뮻xD;E&GM'JAPuO`%Q2> : F&Ψ)$uPa=g#NU4F{3>b$#ŸG!b8'{#ܵ XdU;/kW]u~߃~|o\XX 1Mܔ$j<55`Mi#Dpՙ [V_7=6+Oy"0 VWEJEdfQWi*j-Ͼr XDxUj 5je.)31oe뼤U7׏9l6xU{"'b}:8[l0*'ER.>6)Te ս"#hk6F0RQiҺl~E0cY"ons1?h][)3"y"9NVo~{{iio?z;2f~2sމ)_V�@dWbZMϖg!rALDk8S hyH8!dE턜mnJ` J8|%('pn9p>' i M# KdQk6bhܿ- EO)333$z ;ϝ;gu|(,ˠe4 ׫Accc>h:XP$YѼE)i8ЮmMM7ݮ U4 GeOS`WS1[/eAaY<aIQYV!(fgg[VIc)VP9rǏ[ADfffB9FZL"Ռ+Y� ʕ2A '} "_^J.UTSd)$3v1vBSy>G ]Rc/sy./pb'Sd38sr% L[s`T�WZ %X#w`ee%{PGVfh`fۧJw#'%VmJr|1ijX IjzmTj % 9#`~z8}Jz"YIM\|CJRYԲU4"�٥!D5썐`pejk?x'gh,//Lr4GU5͹\v2|O!Β�d'#>T*IRnT̿I^)-۷3 _fێl"јo߾'ND:NP6' *[+8e*zj5�~}h*gt: *fVZ& PxrS=7FLM]˭h<FFtuЁS:FAM *`Pa !/61�pyyϣ0F 7KȊv+[EwaAlN<=OZNU:=\68֖v吓Z''י4knnjV9`NWX7[~Izv"T}euݤ,? DU,7 ,2* )ZU;dž^;!Dԩԡ;Ѩq*:9<Aob؋# !psT8$ #^l@:�5L@44;;li`kem1mۦ`𐍍ϦHEʀoӹWgL "Ԧ,s篸~E*&7#hQ0q]=zFt3ƢJQh=cAvAnvi@6^ &�4ʒh{-.. czlA*1@T !FA=d#"ujő[# aJ{\*}</v_:L xl{` goйĉޮǍ04f+ye|KHa ]d˦Qj)3w8s$E:v666|FO n65]?ӿ鼪/K4sZr\(0Xd޻tjh ~'N0υ&Iy=v9 뉙sUkeI5Pe�a忡I G\ٳgo6ƼƳbCz^*̷ @Ç&B:e"Ӝ8%% `u-;NUCzdv;U6|2 (,u4| cSV̍[@ܢ5^+UST|+,(&!۴>.M"uIMzP.|RSS{.'~'G_{o{V9Qڀڑ6�C.p*| p})^yF/FU!/Q鴥cT bR>,d 9FEx^�8=F 4I_Ξ=Nx�^wС\ZнV4@UO8}``9㽕b Ϯ= g/TcIfU`QNDQ@V"zirs4B=b;$g6! ܣз奁sHlkNܑ JҁF Fo&e4wo\j۵g5P; C=jlV;`U9:|OZ Dv (14 W'"q_u?UiU=O4[oq;ZjqS ., 6 3g$&mOi=|9֐$Q!xK 3XQpeS,*oG#[$Tv !0q$00^@peﮏR|Ϋմr'(UP:q3;2mmb|0wF\WC!gͪ9Z8&yH>=x͠UxEIKËɓgΜy[c35.SAչLeZ7,XjRv.R|ґ)GcR !Bl9U](@M@JMwލk.i2 eMܹEz0*g=e4`p2T65>�O̯(*qؙznrd ʃ7ϳHLhԎٶ 9jErBF6<K0љ՚^XۍXU_S1cj#‰S6Ƒ3-[NU�-d}}4Zfgqʱc?[[Fǎ?1r Pˀ9fN8j$ p^lW,89c1YL*49FHL#fPGEby(�̥~y,vr>p4Wfff�"gKlX<e疏OjBʤ7n�N'<#)יϠ BEy 4*쎊JbrqӍT>Wu,Xe$s!n:eSl _<^pN'0ӪS;ӛex\ϰEIi_aRʷ onRv+;Ck@ոIggZF|[lޔkEX()9w[UA1)y~#=g9ðcOq0'[pݲ^[[[XXX^^޽{wZ;Yv횙YYY![DgyyܹsZQ1p VvkqO T€R={2Ax6x\ TQؠ)B�kDJӠ-gԄs^Fqt'lJbFFl plU^:H<Ǡ?;%;/Ճ#ȻyވX3p㧧ÏZ>x|yqxfKSTRӤ4P@L&XcvY ŵ%dc<Kᩚ|U%mCi>cJ7K| ]XzJbE1ɝ\IC<Y^^>|N|ӫXO,r"Ǵc6R&tJ8D)L5 c9O\#ژv5�h H*<cm Pxg.*2t»-`uzh,|tUITo]E/ ~<_C"%ІLZ�B69~Ҟ1 uZ(叻]PollLpF)*l$:ii<TDZV4 -ᤒ*[( TR9)Ο?ς !Siج�Ina-d#NOprYݻxAd5"LF7U9"?*"+ShTmV �&6(C̳ .MS-m 6BsU?Ýwy2;!g;$4(s5Z\5=i3~V̫a8 5+6a"K}TOI�s 0^<(J;{$4$#KCY9idT%x!#Xg gQ)c V`, Q)`>@0O`f%FQRgdb5<G80;nAf>uKQ�iT"�%D MϪ=v 5$kCZֲamZ\%B4Y__?zܜr0ʦm;)<g=ĮY/+Lh[oa' iwR=9#;CMb"}bds e�IQ Iǝ V$Ptf<ӟBaE2fMM[@x2؊Bi]7?8*RuJȚo!169*o,PX89$Wi]M\7h6#H7ΩeJB FJɷrLM~|n8pE%p%-뮛Z]]*iLu'lgS "xB&j 1q5W(P& !. 3i<l u"r)AƖ4 ,6NO_3"haff׃x?)dxcOL(ҟ<w@ui_mH68Y}keؠK5邆DNϠY$*AQk- =n6,}ȭwW߄g;Dx(LخGs(p:wB6-mS),nkJi뉓(]ע+,:Ƅ;9#½l|dڰ+6\dDU!&ͨ J؜$D']aCգG;=j"4zEюN`ewz<2ʼnLWlýe0OL:\@ߨLZni_Q ϝt^s[Yas Ln82^-tr3B!1Bt'|B/Qkon$7~%j %]ۚh'l3fT0s5E92}B9Y#Z&[:\qs �t:h]2l;jwᯚCw1.@ʜL>3'?.P'wo=J$/Nk /L{vE +3F'e(s8b-ù0<!sa@si2曱q*(LT|KO"NtTJ^01{8>Wϝ֥ad ENp|a$EKnHO D|F͋c-T&覰rjdy 99r%xJU9R@W5/|g>,VV=\Mj@Yם8=%XH<S`r:1=֙jt^kZsG '9Sc*`%Ț7Wխj[n$8J�Ϊ_Syu eC-5p )>yd*~7w3mKqZ(=ȏt~ϧϜad_ Jku|PfU ____XXƛܡ1(giQ{.XGѡ%%}L7!5j  Ud/On1R4i73Lْ@,[5H^yH@h8V8ɋݭz,o4pq�4fhFOX}\/׍]p8.t4FˡOdz4H Af vcȞH@VЀz<^.`ƊLp8x~o5Ou:}n!"3 uaAd<N'4 .@0nUǼሺ+aLNP˱i= @n/s’t,q*"}ivԞ7@?qE1t ЄrXLR+Iyz?ef>mdN Pf j⯹O0QcIYytfƃt3wV5לY`\0AJ%ÒFGM&xf,¬nj`F͢4&["edQOlYL"ghAӮ=Q]%um97=$<zz0c%�kUxF;6BDL.---[ˉBH(-Jk'lg0f0vUFVN eYv�� �IDAT�4qaL:<w8*c;fj34n7]4Z>I+.NH٪P'{L]TԦq)R#o5c}g rGY^KWғLRhpQN h2H[q | ȵWE-;1={<K>xJ/@t6҆t$`gitzOdկn,.^ox<^\\l|}3~ϿS})Rȸ V+*r Ad—|}?mv],i#ɪD\X:mpo]<dڠrLMG`@G>< umFU�j'`7ju]*orbW rR|xcAt.@N;�h^jph DXuh2\3]AMŋsZߕf(uW&s3$ YVi*E7=0`+Lc4L /7[/_Ex<n:?/ )vPU2 LgBʻaa\6�:<V@/ˇo\\\;m_Q#zv̆cN n쌒ʶ-J_eSl$l!R$g`@OލFu@U7\%vK.ǧNJ(}p Vc\$bg@oC%J�*0x@GD>2='IR1L4(pSX17R|rE ALGm2lk`ff峒$lyycԁeRp^[[&ZX33z5)w~^WI�6z3Y<UFw+R85Qp]v s 1fr서7]%lZlqF,$Xg3kN/Hpd ,Y8RbG!s^pqq'ASS7$ϵuXF8HrNi*. xX< 2IĢXԠ4q#5i& �`L;eyf [at@5W_zl&,BOM?33oBk.,,X= RԧOhUR{|_9sm_4o{ss $�}zTg CAl*6>aջˋ:l#?JE:%C5I1i`CGLpy/6&KIAj8s [/_F؊xbxeSw#g&lTJ"R� A*=diBL&Yz2CJʹW"rg!3@D5"Ւ?u*b3dcAjP?̍dB"}ۘ|B*]ⰘY.j!_ݞ5)`)iqHE͛on_+_9˦?թ2U@EI9Jm3 -&˴VBsIN/Q<}:s!tz⒆[wٲ4K% "Q)u͎jl\RXPkAtiKHKsVB<W*5vgYI'k$4d'RMCuJ znkC)j/չq%hdU+"Uyjjj??lu.z-1{Ž)[ 1+e[ј*Eav*"w>j=km9~KF @%4w%PX?"F&nU*zt`VIF-dcT;!g gcʨkR^2mb%lSK5V6-}T\7<M\@i\C. _Ằ@<\&mE,^PiI 1h=<=~'؍WN:kA�Dm+27y:-\4玆õ?u5+V]o{l#MVT04&f=FL]cjh5-7v�8g_ *j:&4yr'&@zbê0:Z7W9Hcm;Iґ]ᩀ�vp`gFQLUBǪ8p\Cj6Ȫ\`a8DUO_ܜcP mB7MZƛQ6gܸ�{sBs.;)!G WBsbvcLvN1"WnQ'&ѣ|?Ig\\~"\`&oyl>,͋47*:$.O{-MAM+K|PDNhV3˂ЕvAmz.sR\__K6E;U67r"I�)h> gh<"*@pX* UGuo#66a)eѸǗFipW6EZU)$lhc֌p$ 3mN`@n9ZO(9Y+Ν;wᕕ\j÷V{iWa$7�TffVgg̼w?y~jovzs8 RdVs[Ѣr+gz#Ugkr<:/"Ui.vC -I'BL�cdbd:0 6 Zہ|pIw*#*DtKK@@'Y21#2{Cg%DY:>q6p(rp/}W={40Ӭ7(Wy`pѸh\ʭSSj6߾DlQdI{3_(vwXd7NϊAF)Vc-,Y�@<YQKsسg'>zw 7z*7F_q̱f=mjcW̛߼[ywN *{ XßrA6PĕEZ⯯zgYs:68 cz(=)RQ7i2&_Ty*dނ W W1lyЃ vK 16NKZAI՝i|yD :$VJ٢^^LJ0(_lK6kkRƁg,ۈ،z6` ---Ԅ 7|kQB߯v?Et<cAhӳA SՆ(3U>(]x۷k7ajVC�u 0Rl_K)nn jȲ)0 ,"7`�Ed2O1dR*k;\0o쎔9or Bڍ!U(-cNjNm˱ʻQ^vw Y^~Ǧl6<"3VYu-ݠ!))bҕ^ kkkN:}Ԯ]c|?o7/>ρff~gGll\~�q ) Hx<ϑVt+3ؽGKYQ-`lݍؿɧ8)6:�&>w_|;tP`x&FD|($�hhF_F)O{Jh4kߜ_ 4;3pFP+(6fh̪n|NFT"g̞={B#Bܓ9| `\y'BCa%0FV-Y BP;1^pǧVVVXxNvN=&s]W4_n2ш=I[ 2n9JTg5Hgܵ}׀QV%prOyGvmx;?{4JI2269lo`I@i(9OVVV1Qjuu5&А �}WNg9{z+vj*=:J̳;{~3z'O$JLjOW U\1]%xh4FkVO4gǎMdܿl*S%ѧg)#-"pxb⑬ʽ0My5leUX]Z̬&v!|sh$sQEĂ4r(2M 21](3O3+w$I|dӧWVV6}~f^嫮BTʮgqsrroJ~!ɘIHSt ֿo߾{޽{2%H )2`Y?HM 8e9d*[DT΃,쨻g>s/ݫ/-EI -5WoNS|9;v}V=)7}qϓ5766O/6z8 ڐD2jF<.6 ɐNfr0�'fOIP010 JIנUHcXQA0W*>*C uPC v9T9hN: d%j<foG4|XUͅ{݃Hgӑfq~y3M; 'ސ$ qfi>GvmN~33eæ5 rv ~MeOw=VS_l Vs˝3j7>`qw<1WI#rB#{z7Ulũ&M#3 +rlukw&}IgO7~ZE.<$Hn-@ sss~WVVӧ Nq6==͈IdnU[L^p5c'K�fݯHcC 4Կ;n]6Je� ōʄpp0 E+DU0ֶ?Q8\ݥW-,ԩkY{ _ZV3=nHύ,WkMuP{|st3 7c. I Lʩw۳sss}{wn72yZT>w+9rȑk%--@7orsPZfg)b \�>ؔk⁆gS}SѢ`F'N8w\* [qw?ɒt!r8H֕uy< "S2V9\ZIJUooTk�Of61߈4t oܘ~a'l/I4]ο5׿qƦTkqw%g<<j9�TXNgfffeeD% PWe<q7 o0㥔_Ji $%0Cߘ#- !rs+[nY|ӛ}[ !^oVΜ93/Bݻ)n'0._E8Singff˂Z٫ Xޭ}K)&lݻwzZ]]eA&ue Zm&2"9͘4a�k~Y zr1ޅjhQLIAC� 񭫀j,ʕyhA|k55֜gyW_ў=O,~[ɟlE8]:ٷ5#0Ԍ2B- f-Jng;ggqiijjӛ k۲u{-,,9s o@jBi39gvkϟ=җ?OČr1m(\}蓟dojj~isk_/n>|J'@JJmE8 ;O|KS :p=pRfPjL,oB&ʊ*>`x<޵kWvӜnm+++XPrMT4MFJUB ).ƴb6 D|r0 V<L2KwBζ}yܒGEnU)LpO;OyJ:ztu,[SFW|v1'akd%1 O@1Vi,ܱ5ܰ/Sb*'b˵΅G=j+up0h?e8,lcC;ޱwOyG?:GSNes2:_AL ;Vd6xGj 6lb{&}OaPÒƟ©Lc+Ͷf 6�Jks?;=yO^/橍rl69$G_*7^`YՇX#`K4@ZMf88vutvkw?~Bݱܹwsnj+_z[RVq (t=E&}=O" :ns~ff&̫"1 ew!ɤgv8 =Wo|;�_[Bٍ#]<ݻ{]}ۨ-7 #GO̙;]k~vy{?twΞ=͌[ELpGy00B-CB nBPd݅ Q NC \š7Lcu}H"ʠ1 s_]u ֢fSL4 GR(#Z֮]% V|p:a6c*k6Ҩ K=xk~eSx !\` C+2ϓ*g汀07P錖[|0K4mC2s!RWRT5<Hހl*{/`19#R]9ҊH0!~>lf8lX`\'ͼe+GկR~gv _87@C݀fN_Et.4QLIÉ Duo[k 1F9lf<4~Fad!q<}ѡw'bt\`U&C8tM3*Nd+H1Iȴn!=B%mh0`4([ݖ"N~?ż5{)pb3TMdtX:ʦ+SszQ&;IbuLjD;tUٵVȊr#?ze)tCҸ" 6xG-sB\1dQ>ȗovGA=+Bn`N"n֧_eS{ ѣ5{d7 Lߟ&8UM,rF0;_^ 䔭yq*hp[6�t^ټAEKU;n#.YnUd<.0KeWjȚ'NHc?$ VI|p'!6N],!AYjkp_wU +=x<* S1[yaS PŻ D~+FiW" bx|џZF.$-6lqҼ~ I3gj"nޚThB$F ?՟FMoI6m;xSfgWX+"U^pNV D ^%�?1q֓nVSKں,!Q_y�>T 9i UBkl r[&Ne~rڮg%լ^l(޹["<'R2dG\5qkp}pr3I[C qtzY]|M ¯ �(8:@=:d�zЉW ɠ`P0)jRLaNMRh4===;;Fރ[V'CȫJ9qPBLJJp`FsssAqpLّrv@Ud ESͫ,xcMJ܋JXyyV-H|\f8 {p  &G077j�� �IDAT¨l:+,v;cǎ1ăxwGRzEe9u@|NٞxZ b2L"DZ:آ+Ka tMqXx](\PXssskٜ4A<=IOƀƹsfiTj}-rmnMdu:=qQц eA|8v+̙3ǎÇu5rOʲJP6hAh4j_[+8[h&['믬9S}[ `sU/x/Հ (yaMӲu"1 TN!X&W+&.[!yH?d6Ӈ܂(jb�;:Mfy8}ܩr,&:F* C { `kp"H!Exc<Tw2Y@*G8fsp3;4ԠOj\'fx0Uiƨ|+&/XU-1iJI8iss!`d(k:$\Wde7kGgT -+hL mدڅSqN y)㙖e2!<VRzm1ZD3Tifr>qXi NT?r ~NPdBc\o :7Mb\nD1JlF7N4H{t~ ́JUlNTTqaO$US'61KL )Yf!X?}0;wG} $[bЩHLѼzZ5(ëUkZz  z!O/Ȣ-\Pz@r,6x j4,0q{<3(ʦ炙 09n2‚A`" 7 pgSI̛lY^^NsJ;!g FaUଞQM c0 XUᚔUٺБj 6,5gܺ^PŌ8R\%?w`7Uq[7ޒlBtΫ9\X)Gv Y *pMB_YHEJɹmp+HH➑ ֯*14yq@#]&;XV�mvά @m{FHi3Nkb^gwսrBɣD䐏s%ju0>(;\5 5AD}Ur<8k1=N2nF=ʄKlvb}Ǐ\e �x§#ղZdϞ=c.@S)N&GgCt `uuqGlv\ iLBoDp{^98Is'8)-Q$ŦiVS 6(4\LZJ%XhZ -h`h=w*R/eT�oٜ<%3JH$:4g;FYE.z0n]yTyfc:voɟޝ 'OJ =5I2> 30ֶa{{Dθg=J0X3'f%7r^VVu@nRJ߿۲dK|jUjՔMy4b9 *V֮6ͼGat#n `һo#2c:f"ص&@# @o_<UYSP=08ZOAx3pj}}Du0E�`KKKtM5�Xc i1.06KET6} { +j/,טV = Q8]k;&BXgk@9PiD'12 o�|?m+t3?#žC;i ٔ*.Ѱi3EJѧJ=Ru2�OlELM gN�NJjo~Q*mql8˝P\Cxԗ?2=lۤأ)^=·*`y:vD\vfXdPa{lKa~]y`ƂÚqC91C uNڝ`COڥ2vR{GU>E/@#"�syJ`hlyj`h<:cj, nP<.1班T#t: a! L$Ȱ4˃3bo57ŶaRM}"*'B$ꬮ@ZYz_?(XQyB1*T<ύʿ7hZpR=%]4.]Q1OݮҘ:#3hQYz<hAysP9ByG7 Uh+dT,mvR_ң&ӞPux%w-,,,T#xXQ~*TF1�:JH)ǴwGulBy.,>.A1p^ȡ)c2hΈTfPۢ~Y&oz?PWDƛiTl4*eθkkk4 Al\uӞGמwGFS'47y1gD Ny)8+]1xޫR̼$]LRskКs+l4_YNrLC $ ?- FrT64y(_]xkkk4h<4";sގ1ooȯaSʩSej6uy3Rj}ټhb 袋.ρYQQ4ஆDyE| 'iǘS�Hkz5{NJHrIz݁V"tpyʇr27MRMvm! }ιa$hnjȹ0BCg?{o$lUY)Y zceӋ%GU5λq ,SHM#|X%kkkwyru�( 8eL۲7ZߺGDHc?IYl_t&Ijz͊U1 㕹r F۷^Jou66Fo?rHf2BHVHσ.c6)UN5IB{A2IF _q |<t 2얾0FBpΣfjÎfȕUu{ +Yu#?2~f.l8W/}i/,zcԵ$7mӲI` A\0q[,pYq.&9VKH_"q>%c%C&͓'OL1\,y!_ew%lo[j6ܽd654rD{FKOOA|(ӄxVrS&r=<޽_ymzЧ. ss;ϗ2L E``kqE7;Ne*.*b`=LW-oTv;ŐQoi\x_|{[^^r%XjGh*~*5Is*Fr4uID^U+C*!&*FQr'Lݻ'=Ix#nSj}k>Le/D&qj>UH^LHxo!668!da=*3oĒ.:4 Xh5y}5(# �{N<{EXmEmt_< l\AlFsRը,GJ(2d'lmz<N7r8T J0 X�Aܜ&A{a0k% O_5]rٳgE]<a{y XdWwHF/ǵbj*giBa3GyDU؉Lؘ}lgvuz䗿~?xCwm6l4^|s4EP{<oǺ ms b]q$XF}~e̡vTk3<<_0T¼(n=ͭ0rtOٹ_Bi٠| h.D 8D $aӄ27^${Yn;??sc1I.twHu{ OxcH z~,/{xs>i�p<n^N�NI�'N*/dell6M7ݔgc`)3fp7+eƄwMT"&Z(0d٦>VsxW_<fxU/|hD1<i 8poh<wl8FI\8.>IM' ]"0KcՖ[u".(@a\rO}-` 3)_ fɲaN"}9g'\06 8DnE]tmmn73Bi'bgbr$3gBlIYXѽ.D9R޽{r|C]j?ZmvDjW333IσX2w )4pCXI>kZ?fU cxk cm~pw>+lSǮ!{:d?fms[협u_Wo7I q1<KX%qx A_'!$b`ƶhxm [PjChl&;+6̊H1[XL 6RT"f/]ԃÇoVs(rDM%m?t7G>|dȑ./F7l"D <O=@?O/F2sǮȿdI�",dvp鰯\6Sm(||(*$spC ]dQ!Uf' ?s)e׾vjW8vG1ޘ̽Mw1u/h,-фxGBd1P}N<eF|inQ?% .TɟFчWVfFhqX)7MO?S<y]e0@RQ8`pyά!Ө;1GmWӧɓΝ~,VS;!g{VKټpر3'iu/k4dKR:d@Rm1 5z}CKKKH3URfq5FP،Mg zСj` 2duǜv"] _ ^z%|k_YfaU>7{Swn{X|"&:/x+?˾?sxGa.#4"<`F~*=@Gpbg|dD)ܝ̌?@oƥ\?5ul)F{g\14[P7+<.Mf⍹1Ζx|Ǐe[8x6vBN)|`ppz={w<~4*efIGvBqJX @)1/�&Ç%s㧚A^@d 5pkp&ŮühaM3fQnW >7-TiFlGw1 'plG w;mo&Тv޽=}]q7xjY\ؿСNcX)\@qv�7/;y$lW�=&[%>a1HR4=m33hy8ܪtwε9y6oGoꖩU[1L_YYIjI=.0đgvk\t_GO=˻vfgj76(RN8|Bt:Yul**y~nb@Qx)c �V ʹ(*" ~>(2۶ @a5<Ī'K aj;1O/f<rԩ/}K8 T"-=!N]PJC8:/h4o+yٵnɓx㕯lÍ/|,j;yHjmJ`X<߇>O}S8�GmY(�Qg3';ELJ '8>v<xp׮]n4~yf^٪vK2a`SV *u)ϖɝOR 0dQ�ٽ{E}ݻk.OqQnw=Ih7Oƻ#r S Ӓ$<F͑z`ʹQHΡN^SL˦М'{:NN u8O4obzG>i Pn&AHȯe~�n.N E_W0HWj=rM{a\d[Z=7_a{[_̓r:qV٫mee~N*}_?ySp�bxv׌Ǜբtۥ|g)K^O}Spڗ6)_!QA RDGcCkqZSI\"bE(f+vrڷ_C9 @1"6+:|E?1{..G@H)c2AmUhiy#}p1jR!XY[&}kM&V%4]c;V4?8A31вU6&)Ofoi5瑏0&X]m ͣG500.%Э1ϘҺ<ܷoСCD||ebtev4i831Vz"xxW9rdnnniiǵ M6,&E:( \vnRfgg{r߲za9> mԩS &w'՝!@[ F[@Ii<V+#*;$Q?Z ͜VwE\+*z6asbRd5#bw7ѶbG|^gR7`TNWon!Xޒ^c MhR=:s5={7<�`ZS| &9 <@.1dK lFnE~wڵl :Rr{dQpώFrG>ok=s̓NOwS [nb<#ٶgN=2lW"$E]V$]4̅yof#p&X1XͷV;!g{(mmRK&\ Uυ 0X m6m0Cqi $+C|pp0t?>'V3>)~-� ܔM%T$s樼{(Rs)ѳ^F㶟.v>5f9 kq;(zq>( (Fꖧk׮;nʼy9A�ojq]'~fnniiǗouWzm�jǻsΥ&@BT{sacEV;ӱMXs5qs!@uշr0z50!%)䥬vnAh -, L%R2۪mfV09c3KrWÎ! iDesl2S%)z yvoZQi̭6 :H E4�^9!k&N57j\XmԦ+WUM ;2DRb LR#9~m?d"&WwZrzfySJ)ONwt͚dvvjqd~VE(Fh&%2<kD2DX�� �IDATs:Y]]ݿgN.=dʶ q`x\S2rT3ļAC`.R~Wǒ;gΎũi,ɒ¾)np<^ʻg~lF (|^f>!e6/6ۺ #1Ũ=5`*]δ+F$? Xy(L<=ը=σ0gо9z([68sj\0%'ʦsXv3 2 xq'j 3zשWz_h6K)75/aM0Ze@3tA@D19e#V`*[=-] 7[ gL4"Mӹ@x׃ՁkM-ܝr Z&6/9}O{|B2?3$L 韝HG%e%-D�U0\. {�~K<AeCDز><DJn5:+d^yx xƿiD5Cc6gLG8 eJ�\DW],` E *n {̌ۙwzD׆UKNTsV+˃G`ĉG /Cn-7�LXxx!1Ƀr&4̣5Z}~<uOviB®ĭjea"s-ՂFlEB2!*娊ZxQbeU4MQe՛}=�65HGUZ9TdZs\@5Ě[dO'bH5k-"S\O >V.gt@9iOnI'E7GsCs{tAk (/VU333ɲfff۷Ȧˏ !))j4"Gւ}R獾@wy@&X:{,Ʊr-x~ [(f'Ywy"�`e,ΓFgv^]j{¸)zΖMr ׺\6u=dSYJO("#S!ns|Xli)Htq ~.,d-7O5ϸBYUSկ^  !kf>a ʹbbZӠ.eD ;2fUhL_9Zvnjڵ;;>|يSz˥K6f/,۴y^�3Mdiֹ b,+##f133SUL7Q}3Ӑdʾ `mݴ=hbOmQԈIs8F2:f.dypJ2qo_{Çz=ޕ )-&ie .IȉakⴅXlxnC<$�̨e@BԵB@ �4Bzniq)뱶+.1;Vϴ'pIiag].�59jX:-ŸsmϟWylqqsuFh4;5u/asևPjpƨHLPW0ҒE eAE‘Nٶ/w;r,[eZ8'60-bD%Sxo* ~Sge$hH=It9|}sv:thiiyUW1y'&A8T$pUڟ̝+;j.Hf-lD(�sQ }[UŷGSy^^9ST-#Xi9++2ϬEwIt!Y Q]VR@�A$1Ynpl6_1K. {SY159Ȑ&O*ReSx`R7ٌ'HVZӶae'DAtJ "@gvg9 b4, X+!;6T}9ͽ^СCwqG)e~~D/XmI9[$@J.>٨¡f{>)wN&"I8@feLWoc> Awh<K0 X t8 UpÊUCW{o'YV5]=y'aCD^&(zWQ1 P^Q&5r</ *8 HB $1BB=zy:֮V߭_OMuk/$?5 GÆ^dAeT�?\s͏ȏ>|RX2JćGGTC^d2Qx9b0 x{# ]kz lK. Ǐ/D E~bFgƒ2GBmηEŖ>Q(JNI(<C%0:uٳdT-C|J -#ϣ Q>z Mw{ӁXڑ l܈Otq>#݊¯ 6 J(>kKP-%uD-~?΅^TP UHT.PĒ?7#! !�(Gzj7V ɐGk^{hO%W^y*mn|;+&#{z-|փ:Yn!Dtq~!g'{9!Ç_s5NooN<�c"dpI]@&0nLKqBƚ="l#-b:Înfb@N @Yu K C4v+z9Qp'Ym7yf)OiKP2zqJOH嬤ѿ " }k�ZKPe#Qp{G!ؗ�y7]EpA BP|IT0Jm0@K<T4hcccmm^z8pT(lҗRTfaDҜ<YaX_</璸) U7q "!g灵hh4n&yQd89T]kErFZ& ՉL.NtsefifFVR-M4N!M `>>NO0i9˜D.|*߂9!E o77Lv� N[rHSeA^eޜJ@XQ/3ng#Sށ;x) Dk7#pװ :b?O~w/'7D"Q(z6m: !k:Zo?{hq˽޾t:N'MԊDP(p:B_F D4'?; 9;\L}sZNAGd&Ǔ7Ig:J@?<$V3hiŻ`0]C˝M@F!f>״n N r3­:̭F})O$=Tt>oѩ#N=�Z0kB1J=BGTnKғË~H6p#xGɸASTU1A!5"U 88.&rS>wyꪟЛb$aHԾL'}w:%Sw:%H$|f֎yG."~4OCfƃK}s@_TNyØa7l"HɢqHEп7Z&{MGGS!&RZǽTGh8$}VYp(:Z2R)He%j5lnnjS#xSb-!XT0 >$,ɟp-A0}{=HD4l%Vd2 tnf mS'7*D^7{ջ�̈́免S!91wc"$}n-qVAGFd2g:b.zNg2cSjFd:{s}w;e3U<7g"-Z_a ,::톜,qn) Թ"98E^G IK)Oyo [-n8]9Xv'OTy_*N9rd8s=QTV5xO%x}UTtk"_D82Ān#0VC<f6gQw Isz@'_Vdse5}ktJ�R>HVW? Һ#-_)ϫKzٌ~ c7юC`E�c۽;ouaN63΢VBţx|x(H\LCFp:RQ~zyNR+@:Y�>3yF]ǎk0HpF BD,ݐ3%kwx^n.LC\:G'4H" #C-//Q z֜.-`,nwNΝ�JhuuU9]9?>i;!g7]9*y:.oU83@|*JR>Otv %BS0;AH8FS*ʧDt=#/.'vmDiN*IUˆ nZE 5on>QmroORdחvjY//[T`xL> {"N{&Ql#D6LJȴ8b ʼnz}w91~zkQsd8WD"_磃UG9L&vhsKOG##C<ث> Z @;;ӑ:G L4{aqL0<@AĀ*J4JK.^?tלE %9#yi,G9u1`؇_/(4zKEÕ|NI$m n4£vUN7p{M#y?_Vs\_l~hP'O*'؎,t4wѯhE&@(>!K%&ĹoWVVE�W/s´O.^I$^>=}4 !ܐL~4=J}!Bԍsp&h9b!tJN: 2ByD/'_5u߳j5 I(#UN0ʶ܂0 wpiB9"axÄLxqE *Z@߇zG& a/g1Sn29{]μ 't%\pEPAŊ<S�$__"K$gW*O}SnJ<8~}f$V(&;jk{U�u(;@ 65$^T4r irHe$b:3 @І=9\$}gn"/z)p2@d4!D'գih˵Ps|vkd1[Z__ж6`0h6NgGxt|}(~ q2wA sl hǣ(DX~:{A�D} Ncm#"Z,P2�p(%gyh&ihXT]XE2 d\*ZcG=D8}x؋L~󃗽lR}ݷz/ \pd0o1Qf^kX)-//$^raĻV9;S\D3v:i#S?6.!]Н}<~SE=nϞ'N|ie ϶N䇎a ɗG'v�0|dƓk@v}p⩗NNfS:CqPbG#T*<kJR;05ɝU蕍h qKȒD^؅XiЅ'CW^:VhP)&\JqQgx% +>O (w|,0E 9YBovNp}|gšZMg~A:AųvFR >:iu7[y&<w, #C?G9E͏?`7pu֩c^=:Zu!ӿ؏}~k{LA$s?\;sv; +j>%s|vl](bVPLCV34NH.PZyA65I?p+6.ǣaqz 3rҝ+q=&gGc&I>%jҶRlqS[7*܇>0)O0hn/'p8l4>hE6'DZxkW?vCΎV] KrAj}x/@RT,q]O,�:I@4O~g>|8Lu]N'lzBot:{_G�Z̊zQtU"6Oʓ`>c^zFwa"^LXYwC"zhz:簭}UO7Ts0A [) 6 2iP-on280d;iyRDz}F9#S17ߜ Oz= Jl6{9\Glr"-X-hιД+:!g .VQ`"U 332#q'sUda|rL]AƆ3ab|i4*z7|nN3� ̍L<`a$5Yv #DhDq@xO-+8+C@6MRLs8Kh}sҗ& LH`5 ЄJO*)#'9 NwVw�#倛y?ޕ>.wK./* S: !󦱷n] GE Pka0Q⻚Mn Fҽs6솜-;wY 0m_5 =hN=vhn')[\M!$q߽{z衣OxU6mF*N_7`FsQo,( [mD[w)/;roG9 83N{`(b(y'.- Og 3"o!D9bY&thڅe &7Hh8(yL `F7́(<\ǻb,lt@Ӛ}\/�ɴR3 kUh!*\`g˰' XR/G$n)@SMun}ku+CF_@a}|kȤs:땕3 v[̔os{as &(h)wskq�7AAEhr:u|=:fCTؑ8P0 O53Z Cr&3&PJ~b=qI=Q4x.LW9i߄UMEw_xըFZ�`^D^y6yv=`+~ OKH5(b*IFBjzZCXD-`pl0lwp2{gef"x d-j|*HN&W%?0[}| `G׿"R.�[`A+-M/+%vwf?$./{뮻M#>coȎ.QyCBhA]g[FQPf{nֳgr=9C GQ 3IwS22'x<`I"mg('_Zu5،>!)3 L£<Ґ娄tg8Af^uL5yH[8%ȼ�� �IDATLDtݐ]QHP /vIDd*Eͨ@iHH<"tdT�=Ɉj_;7on6x~p6kc:/us;g_ovѦsý>=>;MI6jG+ KRѣgΜq[_;  dw/J[zFR)C�BRg@vwKZM,;I5Lp^)]PPVN>ZùOe4O73S^@&#sP1`Nʔͼ[z,R@ʭmNo;q'#/y浝k;㉪sawpEO.�"bS\օ3!dޕ'prewcҗS?v#h]_t޹m7q@e^ZF-3<Z-2O:BŮp@\&PUs+R=i)8'ٰnȜ~,MY[rh G1A@Du[Z EGO;lt`iBFp땺Qun{{*޿5kؠ.mru79߸?wwNȩvrvG�tNg0oA"1N`#L�K0]^x؜@ }:gPOS2s{wt7h$?^7i7DZPI}EoJ dӵf}); ]NۋN*9M )zP[(YvSdMD`6Hx{F2DP\O$==U_تv ]UX>�3Rwr싥;e@:=,3v PQ:v 5+2.*lU 9;XsT#"퀌QE:W�>lq&yQ$cuz7]y9DS2zozS6ɔ˽N'wdWy3*t,HLEs7UL"w\!"E$b C:3BQ)NC5t':l({`@q q~}rn6ULF2y2 gJ~Ɖ@q<lx@<Pe�\�g1ױDHqG)Qj �'FߑTj;goplP4E)2JnڭM!n$'UK̼N\.fKRXlZU7rFN iBa)rN [}Ѽ0s&^Ӣk=!g!V@CESN_}*,p9ϙ|+>iG1M ĸxW̌iz(C$Ԏ|rJ%C &PBp)u8A[ E!<S:9e"O22鋋bq0O$H|ӉD쒬F@r8@K I7]4N b+h;kh~VPD'0RYLXuO7t?s ,'!�=5v])ф/*˼+.; !gBK;XwQHS톙f{K$H7OF)#\e+l#ovkq-'wt_~Zy;ޑN%8N~y=b`0lO5x4NIg W3LZ=p>aEͤ+nC޹lDF1YU/ j, p!]LC8<^3/?sL顇V:"! x{f,{`ţ/a@f$%ow z=lU-ri]ڊ|q؀Fso'&yq!:w_51HTA\-{NwTG@+D5L=zt�nف=Y>V"s1V3M,=%WĪ"&E1 3 %.$9G`x}! 59?k^l4z_O?I?q95NBoZ^~ v۹s7օ= fmFQ f29Tܤ�3DuJS{0Ӱ Pxt:{@6io~K.?+++~` dd$ZNK#_<،5NGF7T*N_ye#3S)EA/ i/) } ƄO:B篬Q"UQMIU/|oS7!'x*]}s?hd-ES{r=>ӯӁHgN 3Z:C raRU8qlx׻:;ӅWؚÑ:JI&~s}>}I‚N۝0qV.="Nĉ�&1LƘH+;DxVIR҅BAK>)N_NwIH  !f2>\sͥ^Z>^:!ES6W4,&P)=H DiT˦-D/9 );əƁ-]c=1;=NwEJok"H24ŭzQ'7u:% o9CJ}zպq 9;u<D@JcNtig6:`N_0 $ܜv[15ʹϙqd]so^vBD"t:'S:18')n @论; oCNg�5(r_ߪQTL\,umll⍭^ R)u:(kkk^xjٜL&SQ&2br]oFŧDRFx.Ѻ;PR0 < Y.@ޏ<?酌P+hMNq 'c9:X:종@0ɮ* 9;o\GK޽{/ROJT82㙬H_|a-dlfr!KGq=8c$?ɬlQ gΜq(6'޿ fE1 S*M@Év[0AWG W(G&QFԛ1> q r9V*}ÓV~'Ef؅^x%r-kkk WeOO/>̙'?6ã/0s\ |T?8u>/Qծv;t:|W>|^HMJ]1+8 ,@_{,!DqO43LPG_Fw0솜-z|/^__tJ~0I'7.̉5}GND63j>JIᩢW<a{O牲< 桩Q wҡY}He jW>qNgr σz0M ~_\,o[TDk. \n~~^^l6ev)IG""SRߔJ}ĉgWN~3jx3 AGp*-zL)k&gWHs0fG} ^077wǏ/(f))&D{ʭ\s_ 'Es2?G 'uUlt&ayD `ݵhh۷~;hxP-DŽg:yذȮi K vi0 S$ٺڋȃ'2w?"yy p=Q- `U?8<sߵrbX,Jr9 JjFt:zT$ լVK+m8;vLE̥Ϝy!OfהJy(yD1bӦq�~ LG)�vd o9l6|nWKʮiU;~4݌Aty2Fyf•"$LBv/]4RVhM%1Z0KgT]n T zGP((mk:R›`FOتiO$UIF;BUJY`m+n7+xIv BXT*JX,Vե|>P.38ZZnFz~ٕf),WˌQ]p(~yXSVrXK`p6O DfD2E1owE$=l&AR !u &*vQ9+_ÚsPD"Z�B}MQW sQ�ZqΧDR+RKҧd+]"6䔰ynفlۑ""U`Fh9`8A(dM: q3j]�a4~ ~;|ǔKnqfw` Bf`Gѣl6{]wFp7`0qEUZVz^@l'7DGg6\ O(*fi6Sf޽`֏Jl6WVϝ;N`mmFq0IiP,ʵUDe2L&0[]>}.aw1i\+0Fib{elDG(j;4v(\J}.ޅ 6HxƑg22X0i�/#k餰KSV;E,--U*zl:)ꮅ2 N> 9;q"6yhӑ70P$wN+\<VIBՙ"`iP@GüQ~OiDF傹ֻ {.l6E-e�bՁ^L}uKJ|}bx={r'O~_a-cv><^~2wTFQgqq\.r}ݻX,ݻWؚSyp\N/T*LfeeEٳ*kLVՖJ%lsf+N7<@4xVHYnq" iQcG3:e.bnMEy0CU悃5<*RģM#yIrr` rz7J=q]vG?vgKJ+Q8 9;$A-Ͼ}#IPu.K5Ż21'r ?~$_b{ý|m!jt:ҵAz7pC.Q1 IpxpX*N>Mϟ4ÿujTh7}4`\\޻w^o߾jkc2P(\xz޽{777ń9_*h�uxpqt|~qqq4z<&:�rMxP/�]^ۈzzE49zUt2փ\>=2?e{xC[lȟw6Fm䩂-r=={V[5Ch;ӟnٱ*'1rPoh>٧AH"rm KsX3:kk\2܋3=q"*Uf"}_)Gly z^# QCu>jE"u$R^. BTT*j幹bX.STRQqHyOųbXFQJX<ř1(��Zu>veeV,a�ޅhiԹsӽׅ7L _d]{8xkP0ܬY9LwE: lbȬ7VӠKZJ`T>%,sD WkبȨE`Qӽlٵh^mNpGX*=BD:QT( z)[W)jQ2sFOq@ƹ ҳr@NgKn$q+<fr&9y$Kװ �V, Ad(i 0 O O$ KKKBGCF VdSjaQTvJUB:vG*t:<h]ft9�]Pt:D#]Џ~oErT$z}FSꅬ."k9Rqԉ|}/ك]ϛΜNE킛H깈_DB�ꎤ 9;@ЄN ig\ Y6;zq?{IBd;�whQtl6w|%by]tsFU<?n7 3y44|a6~y~!}Hh\p#.x<>p޽{)΄!i7,/q ^g#:@H~^j5痖}777Uታ2J9?]QRecN#Ο伆Q₹z!X�Gny0zQ"0q < 2:񵉘yHʓOAEKGŷ[ס? &nVݐӖFۏkZ1'Kn<O!M 5 I1\`Gs9Ce( 1rgVY[ mYbh~>d> VWWOt!oM:I<Dsr]ryfaT*,..VUs\XVj3V*ZvYkW>:U4J#GŇzHU u<MOՐBꦤFBAd\ZZѝ F-f Etvim# 0Jw)"H@q%@I$[ fpCs' X.+_S8sW)bQ"w{8t^ΓJ>}#U k1+Wp^gE ƈ":!850S8o'8{$2K]E0:v\aANM .PYzIWتqG٩ucbd2b8??_*T5`>TWBX>t{t4zCBz#6%νRR.J^1r_JXp/Fu8 ꥣǍ/jut l_Ŝ͏r7*}ʄg4^첨8}`oxC܎>= OG&5" h6H&IVPgVpo]c 2'h%r�j>N ݿh~Gyu$f,A'2y ,ç E>$zݜ/&jhH 6[<mTnO1@:|6U3Baii\.kJ~tIRI#HJ/.LB2G  Tq+'tf~ET*:H}_+^y[Xgt8fEQ1D\e{N‰n)PK\vۖ8T]vQKɴ)"UA�aYet{x70l6MjR?Ď(D\?|:yr-PJ1c<xPܖh4 ; uEKO�=fBn} "F Kl'V̉ۙ8O**PٳglE^77cce^ܟon�v>�MT .FZ j*ٺR& =5pzd8SƔ[XX n mE*l GSz[Xr|tͽ>fs)ܺ6bW9[<lݳ }a~8ҥ&}gv:cǎ#I;)H(pi�� �IDAT`,&|DecSN C:w SfQu:=:Au5~*9x&#:yMJCraccCGN0d"u5}I &TTrj;W&@ưHY.iZ RgQV2y!o+z/?tZ_^hLMAL&ݮ"z:޿?} (4jb1MĮ4ɇxV0pn`l"v H_ бǑ9peJ(NRfKQ|E yl23jwp1ɭD\W:`.0XʕJO|=sq�nٱ^N9QlvOL@'xѝQ? f퇂/ 0l5l !c^':t|ٳg/ԋ#4DBDLЋ 1rD, br p(aEPq@-fzs7Z_* k?^7 gBifT2! R}2]AGPY_ֻk<t]"A0C ae7ҙ֓[iO"Qs4y?r"Cl%J` Im/>ܝ!l3==N][[?/K\`rvNd2 lIdr8"p+-oG#l@ϓdRѿ؍)u|C`Ϗl6G>R>*= b~#:o8G]-͏0z⇂&l4˩4JJµ }j"Nzcf:{0T2җ.LonWWWEj*(޸n4[ѬQ@9qXtM;Yc"5|n-J>|;WDtE7!.Q NN&:ZD 0N<1 H8ED;noES Ԥ௅\DW�7*NAfLg2=q}c|;%E |&ӧ __7M 'zi,g@@&,. 3}l"b&zxA'a%yIv8Ḇbx\ #GnuG_L&ө&!Gcn oxp8n4/|?؟ߦΞM\~>BjjH8 X xҺK,jF]G'TCPsx7џr0)Ih]<ijwGJG kDs I dDCJ" }ᜫIŃ`3ď%Q+HA8*7r5)knUг#i)@RH� eor"zֳtCiΣʅpzR k> \̦7+Eȥlt>P  T(!z=-@zч{Q/j]0-vqaq:M&{tnwUכ\p_ruǎM++J@`0}ߤ鹹9(Ţ mܤxwQDfKHpKy:`FFz,0&r IP;7ҍlvxJjl# U}Lk뚝AY]:vl}gy:nB^x//s9;ˉ�t2] XjvwIBKjC;Fma7::GN}uu;�(U <狻(na!8ae4Glx\Z>xC U->jeYiB cR ԫ׻5vN7~Px~*ld;$77O}O?'z}|萄A(K sK ,Q1)M#da+3#/sɚyȌHmF^,f<VBsu wv]uJT9JCϽ;w* 9;̐"m`n#`^@ا%t:_4ȳH<!PCT< $Or|i0bH̆7%^(D#Pk .O}R *LϸxJя~tRYRQtקz9z^z R0~>t[x5i%ɥuץ￿tfRIj"(P d"6Bd]g>Wy%7M-an'#,uCgV#ah缐bכHpxʊ.fp8T!)Z׎Y5Ãf*ퟫDt9Lg>3[֮kQk,0.|_1@,7  {@5ādvW]Fn:Tgz 3֝0=F0cnNGy}OL^Fg:L&J1 g?7Y'I%"gr@uIB$BL)(֨^./ҫT*~p~~^,jED"2pxG:VfF_{/_w/pO&&U*`F9έz=@V@&i6F[.1IcHmK,ù"r?=πi>P W0�"rr[jU[!sq O 1b ct--@^;w;jar#7t6G4}:ݐ5$Zտc<03U<ڴ>b5Ho&We�B OcV'(DS8H$F!\:];֥СzOxQ8N9<b=L qL1^P ʆj9Ӗ|T2hn/1"x%B(J-z9@Lv|3Otzh2I :{6i<hZY !g<1zV5>LhP(dTK t։D=#耴?ߥE:/}^ިC#e 0"%@^FArW#"=!Yt- [# )ءX6diJn4)1Ym zgHT)F›( 9;ٷ3DZB2%!۞0GJSD~'YvCfXQn֊MdF~Gs\'G='~Goӟr8L&c<‰3pBXK$2 !\3\67G ]]O2o]'wvD�eteemDv*KarIuQB(_w]*"?ަH sY;moX,k۪1j& LY(9kސ>K=."jz{N\MnAPu"W7eB&J M8~d0kE9|4tu|Dj'^z�.wCN5  @M&kG$J*AY=,g@#]^\.W*agW%>!y ؗ>K|n:}Jzs{СjzOuwקRD/SH$~\N$_fW ?wg TCpRtüS^y}}}8.,,G%EeU]Q.,[F녕ӞL/-U^r]? G߿w3ll6UOu2ΝkJfz]aFF_u}0QEBt+`dkpjPOb|Ąq4`.籍G i^*"h .oYDA 9v\qyH]_@yDO A 't[QnCWMsU2bH{�DLB %NII΢@LmQ4u. r4`(` Lj:Bӧ;NNuV-e27T*m4!\BfI|4j(W5 z�OLeE."XX"jb$6简9>.hgΜٷ4KCo|}|}N~c~cyudOь*+ 7IKBdKAj N왍␸%-C朚3&S</")"׸5RQw4:PM32>7(F$tP_q<r GeЇ)BwC1 nS]Yg�,,B!<p.:n,qqRK2qIK"q_{oƻWgI߇[ssT*7xNV q2�}s>b}�B>= x.ڍvl >.f&4[1I=z[v饵pjox3?G|ȑwongϞ .@pP pIihZz}ccC:ŽfӸt+M]׹FQ:5TUa~Y0oت r4kJ }12(ھ|;VxF>uo|�= 9;N?9WJD=s40:WrX>.v ctދ+9@;fj:It:]K$nzZ(9s)ur_e|IOz5\4kZ h:.0P|^VnD.p@Z 냤+RRU zމ'�TFhHb< /\t_FDõB-/=H{/Ed(Z*RtHxTxɤnw:^`)@ {nOsח>3%_L [A N>JQQK+KC9)jԳ\Ն6pjx4uzm Nd50FiJ"Od"XAI $�~B!vCT9<f[ l.{r29*̳'cVշF $_�(_3'9oԞPa)kuO8q8&^,p81~0lnnjx<֝mcv>P痏+i 0>1gBu8Q$l6ٿ;/}5DJD~=?7OlsGǝ; ^߿yy:E h)NnP `#`rȫ\T"o|SruTIs/!!h0 qR^ 6OQy'R-nJ,!'LgXH&FxR" !/#k8FVWG5>:톜= X|8ѭ !J[s e:7PCaCgٓ@qR`ynw^aq:M!xN$nI&!\P;㍍d2zd?RH$ga/ev&>5<iwjb:ț�,Jcx&{MlF\&٩zP(ZtVVV"Xm/<7v{o:dV..t2n:LG(C^͛D"h4VVV,8fP0yz^hFU)/:ӝ-eW,F y9۩|b  :%#iYrp(ʯ$;ߙy eLJO<;*M5(hXr(qr W)L83p 6g#�R QB-8 }wĘpS�Vxi?!s3?Li|k?kt:7W<3g2̣gfVkr r~iO_uU[/{Y#Iz O|O8QjO䱊f^pM,`Vh4*J2FN`;Gh4*jSEP2R"۪Wwt%c66(V<N&.\VSOlllu[W Z@[Ia4{͍z ^;PjdIc?`2()3A ÝBí'<_( ^/4_o|$^f?9\H0aL& O]Ltqn}C@RU#!gB{c1m: |Ŧr{Ms:]Ɍ`j7ٛϔ_H 2׿N5 X{e^pP3~ͭ^:ޛ>v<j"쓧Ӄ G0N>so}t:RWGTon �zEWSWGVѠ_[[ַU4R*LKKK=Ӭvy<?Ddr8x^KAu8$<ZƆnnjfy R"wT!yL.g9}v+ �"sJ3"K~k'+Sd#ybŪ=i`dL&Ozy˿-LfiitNʾW2LGU#GfUL�/D0 ^ANwCNDQDNKkI*h(SSM"d0c4 "3`\2/kH&xM6OfNf̒..!ETuY*tT*ẀtdnMFirVFN_ݫN=?JM&§?= Z-oY[[m zΡn39I:n XSJpxZRg%l6k2q MOs8;*[lRgp`={vcchz0#Vl65|*]y:<IkR`&͝xG:"pis�^`x45|R;Rz\rfS9d2JB! ~a ? N2Gh깗29G]wW;uJ<ƔnL:AkOim'Rdl-[ }-zYpss_K[Dw%ĹsZw>1""# q2{\!Bhtp8s&qIӻ$\vY{ޓ>j_LWLJ%\FhE"dRVaTҡ FT*h9L`0(˚{{ssj\V?ST=NW9<w0ݹtpgΜ9sӧ׻ݮ>Nj~_E�},a4��EL]WHrZAYKJ{aG>E -[4.˥H,GA-HB<Pmo]w]oRġC7ktƳG1Z瓶W<ig@ͥ�Ӂ[ &Fq.m!'8Ny+E-h?>oC#RkP֮l ]r,L}[n..&ɍ+^1?Ϳ[�� �IDAT};p0t&Ӷtwz<4 #~/Rwizחn:&}xW%D"1=ѕmb8 Lȫk>4o~\bhf0j!QVBn;vL}D"qL&:Fzpqq^x<굺xvW9rg{Tj8Rvccl*hjƙ3gӳk62pəб cVc>g:H"!X@2q8:O#sGgu:$:B ^ TLxBL;fҫ^{{ztW! mr><|q1L0{ͤF0BsBKO+wC#J~@8$$6"^!rs'vT*fO<rIsQ}Q:=қOΰ&>.P|/Jl1VJvIHjBʬ Ӭ硞~k'TL.0uלLz<@AFir\VSW[e" n[^\o|rm4h*JT҅wUdZJ}ȑWWBtb|% ZՕvnub{b~_ǙRߥX#Zo Aߝ/�XZsCu} h'< Ǐ{AC|&'l1~3 ^{BkuQ *^WDc܇&×+N9ܴ]#BLJ゙z8ECWa8.y1ȡU%3%,A|ďsazl#5z=wbmoK~cɯ=9/W (.%yk4k6{{q|ڔ+/%gd%?qW|sػlƒn2C`n\.:8)T|;wݻL~c:߿V(.{ ? \3gJ!\{W;v۞=?q(?]u]'N; 67Q! Aˡϴt&b'@QI"ψEn@dwVǂ` ��}{'$<NL}Ét*Pz1|4%zn0nFHCC|Uw 9[F#}O&ˌ&:]ZZbN"&hW˼%vK>]x׻ZxG-oI_][k,6RT7ҷ+C#"{Sq|^!V!wsf\qMDb[Qɠ :':}D Л = [Ne6#W4Fб(СCG={W,_t=Blfya5FhHMt |>? :u'/7߼:fr:&N>:uV&@㄃/N?S F-t.&RFyAqQu^Tnͧ[2q� f!p:uA҈`stM"zu 0V2{fA.IB�ym:֑nǐ [}^[*?&ؕ&#{w~jC`u4Ty|M;Uf4lǎ׿>1YHM,hV5M 2l $~gd|<qFW) ҽ ɩy*v jt*޽{G^1#EP:ϝ9sF,8)RDAة]} Aܹ{`( 9uT^o@+bJ2122E &JQѿՊŀmnnZm^/0GR8YY<tÜ1gflc*cB*(બ]%jتvNhf1{@1v4Ղ*E 9;rbae#vGK3.=R!?Hv}Ϙ3/]C-oI>~<D"ٜ_U`kޣﭛg+Rj{{sC|6ϝ<=DMDX?6+ 9('bMӳg~ti4d0X<p@DZdGc9t)bZzl2MNv;rZHqOܖ9d6ԚL&^xvJj5z$ l@o8]p%<DH7\ ixnP 3t_0;߭`ҽ izzB`F05Fgx7NBy46rv,ЄT%4ǻ`; ca9㪠rd2\]|3ӭ0pQzK&nT۹.9j dВrG:m:mQ3f8 b3z cf:|^oii\.. >wd}&+/[_b|/�{dypbHϮb *pZe&Z^u,yh�@d^25n<C罍z.b|sktS3jr0ۦ|'GÞlOaya:rZrrhyh.{pbPqy�v<kBϘ#լr~FϠa6V^Cy2PhtT984!&'ta 0,X'GԜU pFEs8Q>}H$*JRX�((7oJj̍^JX|B޵Z8X|Qo{?COԋnNKDNj/UA. ?n:ip 8h `I.Nng2hyo<:S[Yd �F W FZ|h=s^m;xOC-ip{x \.cCiqF!* }OH܄":X6(ҿ 9;OV@ݹ e8ZِdGNV?#oAKp9wo%[T|J|P&Y%31<V.'1ɀàts] *PS:i{0q8-rʙLNH?鍍9RN&/Wr,Rx{U{}dP}" h6>B/={gx?Yo P%#ue KMɰp[`j9Z֤NYthJB ۯWdT^H樔(p t07|tw,p70r9yVI%8.(1(w\ac乿9p:Z!fRȑ#<~83�7 1{'3l㆝&nKMY81 h]b�HRbЫZ* G)kS%jNsJ&G>;ސɼ;iu::t5'OgO`}]r49ќױ%|zh(\EsؼLPcJO.T,A@u@iܓ<(ѱ'GX,@o҄D߉s/ [%yQSH%T{AWgWսtqoҠb(m?Y*v[G0h^wʯ۹^({Qr%(IL1(./a8/s^w?~\Gtj/25ߍal힏zwy Xܼo.9I& (CB%PNFѨVÏ?{6l>}J;HR;x`Z=LJ/-UK%MҤR) BR).J>ӣru,N9ܿ6HS"g#'FX ΞKr >'24+_o\0SZP.*8|DE](1`)npUjMH_ +ݐc!G;0h-BUh9h_q@yڰP'!:"H#/Ӕ^ \iB^L&N(>]s4l̵Hrөj57 gkP:Q#4`DԊ%�8 \NXSP(kR TlҸ4J$Ze'O^{kUُguL\4ud@HZ5<w=8xzLb=^QmLqAsYF#GTWS�J(RAaG䔬7W٤{çL%DS`Wd;]3寘Rr�M+֥}I�/))[P0'vqq*)5kJ4e uQ,Gt,CU81""ntH/GcH8C0h |+7Ǩ76|;s@te Oo:Dp'uN.y7xĊ r_RLY[/.lܻFd2) (`2tČfv|;uK7*u%|5s5x'+M% O5Un .0%" R6șN+0O4S u;]%JrV/Od8�Es.ٛwP"!ylFTäI<l솜(�  ZjH` B]ZzGGg07 0nׯp6_zd$@;Ehtժ5|;;lwMfpۙ֕÷JqYs-hL[J?sԧ(gl2 oNx/]yesy?+Oy 4yKrunkK$Hq08T.t6?Y�dW\*oHfYq\eܐ`zaR4EMN?M y {{pV2C<,WenmY4vh>t,碲s^SS.KBIG{1x0 cg^3CPʭC <*\M۱:H{Q+ب( Q+y"BZTR%>:ԮT^hd?=}W^.5ف$ .@ u`jDƣfL/e:Xt (x;S#GQkԊb Ð&wZݽe}weO,k{}y}X]nw8V?G><wno~_c?{Dcǎ90JBhR1nsvus҂2[h~e.P(\X:u!uɛnܹs_ `(Vu(DE(ڬd g9r"eZ*esBk@ImS5cY7"$F>%4�!zЇ*1z@FFc}}xƲ.,2$/ ij~NXJ< wP<G@vhв]k:wiLۆ?*y}#2M�Y|ġ=gt0!FoootS3{b33ss[;Y\|ꍏ?}뭳O<1̟>{Wٟ]j4뮀3]vYFGc SR ;pW 0<6k;S˼k̭5Tz?#n#ѰLk~Lefسf~t3h\ }K)G6-O$C\g߀N ҁ`҆^=rg<>|!瀫P[?HI=иy}V요� T]4Yh<omQe[Rڴ"Q!]S@} g} dxR,tT6@9a@+~B$K'/"ffgvl))fu8nͽF2o~ ;<n{ȑutOȈb7`G/>4j87 7m7yMF@J5ɍ$V{o=O4;IKX ;{$ (*LET}LRzb#MEo2f5޸$[�wnJMC΁U9EH#R#ld WS@8h]DV},;[fxlAe&]?>Mi4F2EXuL(ȏ>Xقg [H=4JDYYYae�hô?~<tW>yU/s=쏬\2+/RwuTn5?ر �읝 nmmϖC'ϭ#E .�ùTVދ~c5YU0KJ)1v wΩ�:UU`,< j#~-f{ɫ8y`iB{'*~qOp R tݞIh=ȕ<$i[悰Ol4jtBRTN!lS$*t04�5lɧWrZ]P~,DjH[4~)62_U%7xl}?tݽ}c#ϳfwww+Z33<_h{`0zo#C;Kra9s͉:A+*'w_GKaX\a0,b z+� 3 ÁKuC43wdz{D-��m:< \v53ꦩ)͌5^ÙNv^!F 1 +E4`rD"jVvG:\5l9e TW17KVxbV5dž%;鵠 IP9NR\+4:yљ=z4X$rWVVn< &^ѳ[[;_mѣ[WW33/{W\߻ߋaf7CﯬŽ=Lz X`BT%c?92:_:Fp.˴ɂYfeO9uٞf05V-fA ń*lO,KG ԓ)Ik$B̷hKϝi9&k}R~ɰU؃xZY]h Eg=/T2:[@INj_dݎKQ"h3=4=.c ?0^@fe &l`܋Q(S�_.6NNv`bONL-ٽ>nw5i}՝/~7gMIf3ug^F,pUfgg9qҍ4pM$+HZ\$x,& c&p SV4,U9\ n3J YgoVҙRY/Ð u`Ib&I 6*v�+ۧoCn/6 9h0 t5qY@$Dj;{ $€JH<<pbJ)C[43Ԍ5gV!mas5ȇ֖2g4u|T$NJ ߘ57Kb~~ffСC;N~^7;{~i.c h SFc�A~e'Iv棊!oV~Io�� �IDATf:ц1K2QGrȵQM;[h�(1ÇlhP]MӀUoJ$Sl0O;HLMS By,I`*Qũ}%mhJi9ҚKI1&ɾ ![r4^Ӑlʟ۞".g>bzY5pf#2c3,@f'{M 9hMi8h4z^|o\g{ƍPNVXF2"B-gΜqO+~uuuvv?Sx)e{~mnn޷7֝g=+S 24;;h5A ]Mn@T~q|QJ.2(6S=+~"=sufͲ`Nz3_C($H,h ^|mwjVvo55!,i.BV7 9o !{Lš@H9R6*7f|專drV]OdJt`VnrgA X԰']!ATTHН'  f2 RB V1mmm:tmM~3lr#P7|͹F Ogv/yUW4è73-v?OSPk0_P%7#Mm]VqS1㟛dr z 鹽<&$* 3qr<3;+ssc̬yn>`eSpY@`DLYI%aE" 7 9I~‰lEFu$ 6@`3x]! $gr`_fa0KH`(8YN3h-{3IrS (=c"]9)�ofO##Occc#o#~#~Ç{^J֡qUB4FPK_4Y^^N!GyWF@|mAχmx!@Ҍ^*Q2r&w8R+#Nj I\B3`'v05a\� 2w!,5,ٞR8xZD*UWf{*L|[;NCAV9o�H4sBy,r'KU R5߽ꤰ �DϊhrË|&%9%%!rF@'N,4מoفMFnK+3XO2Ei1f ]zwDs'Mf|FjhΔsgR4SZ!-nrHcʠ[j#":Џ3{TjY̖|>Q^x<W\;oѺ+RJ D GsL|Tl*2stUl0B9q"_"~�Mku6ɖ2|ɸyɗ ngSgSY ^G♾rn ։DHU+xA4Sj3ڽ(6)1 �V ـ{d:i,81Ϝ ep#,H*76b9eBY,{.26ؓ"D|x2d?G {ʻXXXHTwA<Wq<"NH3k⻚Z7ρ^ѫ\-(Xl{*˳YG *hl˄H¼5y3̔&#\l^"1�+1iuAXR`?,h#`elbg8?i�LpBյJh*/z٥Τcm5jrvgOU~O9lj 8tQF,..b܌Olja+ #3339{<&A& o^|B)%k^Ç y0k&}L46&O^ZZJ \k㞡^ ʓc[2eY11G/=v/h4Ow&8JpVe5X )'ڌzgU2;Ϸh: Z`,,,hX&GVg-&` Q'{rqA|*r%'('4`& ];Нfyر~љdIl6nf k$STħHD3|`.D9j00ȑ#)kҐȣR?šIS&d`zNl]'йxT=^$]`͒zі��XS3,A @L&p&qad}L4&ek+$γEhO H97!U.jhMC3<̆ EԪyUr~xNX^츌vD ІX# -&lx bꄃd"6h+{RWb>?;ŋ $)˝czaø-DˈEǎs^Zk <Sv5Zvpf9Ֆv4%8g%$Q/..fY6(VVVxY^3vLC<X$|3 ,5D/0 <e5a^ZžJ15@:~l Tj30\mÚ MU J(b]8^Za<<c&I3nXlO q'Ӑs`@zU۰¯NU2_˹;]j~~/|΃>%<Kqlk%̇eT#.lUћ<V q`&=BT6*Bj^Z95<dr?uRe]F~4Нnllt:8h4bD7בXȓqp<Go;pĹ8:9; yn mc ϥ3jV;&>|e| aUv#G@%5ܦ8A^OK3 p",<� @NdQb"`r(tNC΁w跮vr"VXlk:޵^/^pB)- b@ۉLD\  =fȑC(63 L:9@|#`3bunl94"D~x8<yyQɆg&EgԦ9(a"{W\q/bLxvqpׄtsAHq<tr oHz9Wƾs*&/pW <_TDmrov �[FȂ%ڣG.--1> ^Ac%`@OT-4my9d ȍdͧ�@Q?1F 4wz^%q3!׆+ ݞ՞NEcLSd< '>񉍍e@N'#aGQW[�aIY4YZ4HM"!0%@>F�3Ci'O,t] 6y>4??$&lRi:t(hccٳRJ~ lPΧ6[K{qb0a B$yN͆=4mfi)>z5L&|ЎiP�XI#0k{vv6BN$` ~_|ϣ�qUƮ te&krynMX`CNFNQO38rF5xCeO4k f;Hl̹dVMh~ 8|T({}gd4I>(]H~(1 L[I,WT+v[?hCbsꕜ,Ics4yFMFt'dr7szޡC8FݓiXYf �MpDrթ(Y m<Ѫ1UCb`*܎ǺWs|B2߷[^nɓO>h4.]vE:a' 2,jZ|{!ӊQ9V!Hǻv!Ѧ<ڼ :C�8j B=Zh#@FmZ]$뷚VjVXF<f6CԩYYY4`D#ϕBc70P2 |.q< =UAo M< k^Cm4=JP~?3' 777WJsw5|>pU!]RCN1t #s�GԱI?h}C+ [Fdvgggii)*E�eQ'Ͳ[v> ¤5LP-KYNH26*AS4|G頭 !X*SL7`8:6kNܷ?~j;ʗdkL nLqHGjAgh&r<_F#?L(*0:hP?0ՔĤ{{{Йca;]̼ ܦyy8rB]tiooĉ)퐛WWWC{ϤR3u)T,HXہ360E[=PKl+itຌgTvu(D #Np<*o0|՜V~cN[xrrvc¤DO v*% ]Akpbb[ioԶ~L2XǎwnnnwOg??Oڕ6 |)__&m/M˹FL̮|�@\9bb.*c!-6^>'%2p~8|W!=%dzvW 4 O/ t@Ѿp@hVޯ6AJb=iqB6_l3qXH\[f&rMB-hTgD<ǃ \ O$|VFPk^-;+3Lzr5�3I$@iP>{X5P8 X?砝9m#~^w_Oiؘ-ff{, K8�+I儮Ͳx@㛘kQ'0:�I %%7믲gJ<!-f )<r͵Z-Z;( RÇ ׮![ 2!R>h<\j0IGg[bp_9y ɰ.!8.pkшRm2}>^O5ʾ|U#҉e{Vn6埓V9FFum(h69T$|UbTk %g1eS ?�Ztni{_~^{rCA)Î8;K͉9i4GWMS?y*3=Pfd#/ E`LJh 5h4gx< f% 9DmpGLS9Yi GRjelLVL94>s!}X?!2r<<^BDK-t, <ŧVU)]Rx& ՃѰP&d3Ӄ;e|Hk7X]dT8܀0 9 ᐏ+Qv).>ޅVBK2.9DLcl"k)=kkk_[Y9~Gxٳ KyOmoC@?ל3^;7!洎5a*GM|_󑭛G2dlT"Ac-at΅kJ X[[PD.�Z13??ż`{{… vMMvZYdil IB2N^T& D#v<| 5˪E-ؐTIWGeG< ICl6_ӠF\!,;7Y_4(kl_H uk5~6H bxm:ʡ( > 7=k/NRJO~r顇666Ϋ^wk g[[;YT=C>v;^7⢩ ~v;>|oa eyJ9DVVVPـ3 '96/..Q<J7 d99c-H;=~ىBu[g.7#>}3|+xpLDJNY�?# |s9b|Y N=^x/G<=d~#`@Ъqra @:S W5++i9:6;S˪Bn¥MSa%wpIӜ).~7n}}8;ujpW~1n0ʳw|6=J}fغS!IE5yVv'vewǜSp,sH;o];@`o=Vp?kCh>9r49B뎷`ռ\dp$ZP0??3@q+R6|0ç`d M L_aNv3M;q*&D,;Ct?a[\bh$<\TAeWCB A@=7/B5OhrMn SZ?a?0)8Q;v;s̝=_iCX4uY"Z(/z �zz* $""0@8XsOHG$MAv?ToZ଴(aԗcz|8`=#*xBݰ@ATW%r ?mbJN\Isy1]؉b# ua8hB#x '拉TK >%lCjkrR >a3LXCHl6WF9p4V?M',&D{{{ o{lȩ}гxjہSF8a+ G; m'"*W _p EӈA MR]Z ytF&Iis2j:O)yt܊#EUV}~YэN U GxL644c9<10C6e =-7NwE�ct͞rZ2d (wL}G₷2�_p4`hU jY3jWr6X7k� * ]La9IAm~$8q,[oG-pjD?1췖1&IJ1"><!Fee?;M lnnskLN`R3ю0ʃXLF)aQ%#*NOg̨/4w2?1CÊ<y H1g.K¤1i6(H) ٝOfvCLD#N*wtv]m$Z5@6�gݞKi9B_"xάFm`&1pMޘYԥؘ ._3p!1 @d23h=FEٳ犹lx§E^#H*/~;y\]-!Bs:Av4up"u&hFj,P=^/Cg$S+80S&!ׅQOU, pa$ %' N5lC۱TR*H`#aIpṬmO:^av*ftv&61AHk[ v慡n{هO3qSf띰WyLCA\rFg92r f{ 0+9X!<k4Zk4~mv3bEhtxW绂9t&˄,XUr=hq'r0E`I-7gɇHJpUJY[[Pkknng8̹IpAxRR8֗# ymwPryiU ,9(;?!scc#" i·6DH,Tsc2 Mb)<v|n%64j�� �IDATdJ1\ ӇgS(~3oيmqb  tAw+ g]F7j�jӐSC^轱Q;Bŀ[۳Z1V}6K;;?*%^{ᥥ;ϝl gmME" ~3t|XqU2v6Aٍp/.h~~ { xGl<@,`3:{)rj~=rynɔPb3ϿbHݑ!4&rڕM|VVVF-œtl="Lmc &ԅY47˒eli]k=E>=g$*P'\~}ؗML /ϧxDWZ/8/]'gH9�])!`^S8AvBKaaow=ss9qx 7pw<ml„,*ήh>XdF{Ǽ+Vɾ~؜>zo~{w1x[Go*u_P%9cX3S~CoLnn.5J3cX"iN հA' c':8Xo XE KJ)))Zyi{R)r-8mЃ J!ȇ&6F@"� q*phL+C܀10)2NҎxqUi9HH93C!g+fcgG?y^-W^yܹhڷF%M xUМ`Nũ%ٽ%G}Z@-e'T1mY\o^Pspm{}hJҚ, �ٓ"TP�;F6`79z<V+ڝ渄MZU0–*g I]|*/:vT.6Qb=nu6ܹ8#sAP3ҙ$^1qԃ YuY_9&`]3t1kauZ\34*)8NLJ`[6N[􁚩p7>y;|p>]_ūsS);3vu}+U: PLo<:<S<@bv~2>bWqBg ]N1ZMw7!jwwwwqq{K_z}|~}MQ8]oH/Ӛdj%,nUrkKKKP6664!(◱_Yviix5ǭ: ʫk4-..f6v?%k4Tbռjз<-YQnE/z\sy21AuD2�eg oy<A7 fp4O3S*rO t|(@]-Yjd!nrr'I'm`Nfa{I+Y%lWF4ϟon~0s=vo_GC5W_/})o m $/8e'*FOI#UBϝ̻WFlOsamEzsG}tweec[^x۹l;j~zp] p,tߒ^2=yW^yS}QÒ Дt8(40 Pj 3 &U^/"XB&c{qϡ/~{/2et6 U@|Q'27#0AS ?yhxNbL%hmFu:󐧝Z*^4)Xcpz kV9_f*{B $ u_S[P{'EGG>r>z]W%/]G36ޙ<>$ťrt6&Sl�Р7Kjg\d0u{/뭯eD$de=Ítٷv�^%O)nn馛.]ēw5, b\L}{{{eec ^#G|_>sLW K>5KFN[`?%~^ O=z)p,qzAA 4 IT%A%`RL+BaEG/ֈYenMO/j� UZi[taT69!a63SX+vwo7}mo{C-=x{{sz>X[,/J �lЬ:9hXs*49ZfX h;p ۛ)s睃ol8=ۯ{]n^ZJ"_ X«&(@%+1gď뮻:}#<J mF+prB%ج6갤;qħ>~~?均('E29T`ж!M3ޕp裏]CD? U˧,"3Ȫ6@,Těr)\A gls*nrfO7ers{NCNa9rd~~Gp~2c?Њr 4ZLҌ%f)W4{{{qgg�<詧*n:tq랹.GO۱T I&e9$[FP| yx[ɟ[Yi3Ҳ8(f3_�c&Y$v\"MǛ{3gt3a,fHyԀ'a� 13xG̭8՘&29 J�\c\뾔Q;l4a1~衇]=O$1H]?0`[ u:9LF Hba{\!98MRiZ7|jֺKUKY[){ >^Fp՛wͽղo.}u{m]wug kkR+$ y C䗱SR!�woFt5;̽ZhVd8´t9lnnάٟ]}{#3tdr` xb٧3*tz*cd|2nCA7qˣ<husdC FZ$FN AbdhE.[333gΜ>jN:o7)`<oֲ0&54f3I pSECƓI[8v-! C<h]PZ8a@WB4FÑw]<;*_ i<{rg{{ǺIsImxc AOpzrHMSJvwh677Og/߾m ]dsdDŽ@R=c.DMFc ĉfaEW$>�L3oEb#:1QzN (9eARxMaaFpNNĉ0F#`p\1RŵZ}sڳ0ㄲI+OlJ9͇.ckLKڲvba2Vf,vBVdۃ3a>\y6#�ȶ }@B9{l nOIc)t瀏9YGt9L8;ʻqi`ggx2UXr`j x0e ݌_Gf]`/O~}sۻ?ɬfCh&S$wyhKB| Spֻe<=v2%HNw︣M<{Щ~:@sUl a9F06KydR2An0],ex~yWg89ʒyYDP8fYَ8Ѥo#E 8F3 ʨ⡦f$4iơJ]MCrd=Q[[(\sٳg|\ ;Ƒp񩧮ۻ5{H1H:g_Ήl "L<~ 7v|_]__G|C4S`nno-=45+2k^|"~s/]_ŞAwTi^+)-K.x'&Ü"ϔI&`:wHć<=Ǘ̌�gYr$% XB %MnZ*ikэR3Rhr!Ar NO`Tkm.6%P ݳ[@K5?br>@ǑQdEw-`WstVMV|Ecr<GmՊG53bYX6pt_u%>sID[24'v͝,OaDgLf)cJ0<jAz/ Y9)n?Iv2]O5:C<&Hg`QS 'w4)]<X1N`N<aI]v+^ջ;Eob$�y,lO pdaM W @KC]Vُj|0YQ6odS4("dUyO  hj=Gm߸r0n 3k:u *A9CƳVF6!]<bbɘ}Tn>ɓ'/+썴jNA*wwwO<[h`2ҍVM)<}ҊwHap%vUY*Bp{RV,pցݿƏAZ o3,>OmMNN^S&('ғ JUW]uE#rٯAn 8NCA2ʧ1]UviҬ.XInx~P¼1vHTXaï3@V8/N 3i9^DŽ'=" p?T"'}3N# /-hH�XXX(&qPNʗjeyܹdgR@8nnn6~Wv76kws_'/ؾxIK"xTBxer[I^Owr%f" (j-_g$E&l#p?'7 1t3kuuU I7τҁ8Э ^ȲF)婧?~o.GZq܅Ǭ1MUWii49@$Lzf2eH dzO[HPq ,`~eP'a4]Odz#lC4i"lhrLFͲC`x}ݷt.]D#l>|hlllh4Zw׻vWVglv|pS?ĕ+Sy x'~RU?tKG[NqohԺb�U,)=^V.-f\TSdZQp~kcӳgFY%K U,~ =ٌE S[.M? S.)L L"?b t#›&u$#)jV[W/.ALCN]ęT(óujyaz%=٢ l8*AM{[ 4~6h4ꪓ'O>Cϟ- _wzhO~rsk s�"o:@RsK9y4V?"ժ8]T-9d"\4ԾXʘd&|&*ynYJSp20f;B/*1\X8j棺0_[2<n^UM`58SG=ڎ cɫ< Vh{ nP13K0$hŇ{rI`dap�kaFUJ$@j{gG ^g_T6664*loo_x1B h4j]Of5 &qexjC5CH.*2 V(&(&VtCv,a븍d8f<nbN涄1*jOtaVk^'&.{"q-nMxgb=+7ɊՎWIxpM `h-l<D쵢Q:1M@Ѳ6=ȢA4v0r)ϒaR ^ܷ�u+RÚoKVO� 76ȰZ �*]ƖVVV*1xvuΚ%QuG iC7KS踫_t#B[͖3cx Puk٫@yJkLʁ&�kV$ԝo3RC]210VͮM*14WXb۬FyfjȚd |WU'4QsshcZ,' GAK, 0Z.ޯ~r'BHzCAK թPh@nYJ8el`wP ؽMlh6ʱ/isøl6 vpBtGDJqX_ Fxd7&4ȔLhm +Ѫ#l6bu+H>3H 'Nlnn0‰5-#X\ۑY~T/=|OGNnSPx0E&TL6WJ�<s HQq"c'&X8T%Q /,,u@ަoP�10Eb kN,§<4{ͲII myO"GƎɲNmڶN\7 j)֨/,,^EUJ|K*p8t:I*S6?՞nڻ^D= |cc(bUY 46}h:0OvL5TdZXUΞ²O=QddnBOٙ"P5loP˙f C$}4s7^Z��LcAg4<f}O%`#kn jPhʚ�;d_+"Æ#$*zπhuɈy^d8(}$�yT^6Ԃ^yUf?{͑jZOMdQ=/R09^m}f7n{vqX4t΅/ v;RV0"g r7xkDAX@ˇגZ+*ƶr>3۰4`nzQ?ՅO.@r[AѼmfĢPL `4N@7y%oM;Q涬9>rDbVn;pxP%(=0>Mݩ9x}Va%Qu!� qJie(r^zN08PʕʃG-,,>|8L!Vͅ@9y?4X憘3ڡb,h/Y'k r<Lr)r|$l4J[YM^`S9]G^uU>MIZ&+Zf"k�Q7 oj!q#MFp]k Yski,}`r%bR~9}:,k/3ZDk6\s<99;cCXaJZܤ>렍P ^Жe<9 UMzȑv&Ƿ|u|lZ^R%MT Z\\|s{!`(i}{{<�1p'@҄Kƣim@Grc^N%Q�� �IDAT\4ȷt01L7?IrZ,[3VL:;;{7%`3!3]-QeV3�-`FqĉG`B6b>gvfzX;PcF#ka)y":t-0@paǤTbσs=.#'=|Z쩺4iͱ1j$Jz ^d2$'NtWnoo?S;mvHe\*] *=P!34>V÷$V`M@, 9ŘÊLvÆ<vڎSC%i) O eenBX�'vsk>ӧp=f4K˕OXw~Rc~t/`006a}ry 'yEX0E&톰,*Í|3gDb,w#ldVe̕՛+)Q[˘`u-~If]Gc=$=_8̤(c}{HMlu\>]> s99ˬlp;rmQ]磫"0-9=<݅)1O,d^q ػ*a-ZŌ/եKm.EC*⾩^eݪjadӎ@uxw~38V/ Ǫm9 9 %K׹fرR1>ͲM^|9/I KlO<hna4"e5Wʚyg$L.:y('tR2D7M]y@dBA-h"7^l-�sJbk;.t폸ojٯo).ߗ*XvfKd$q[KX"W4d<g7cy#&؜) pf#%\P vPV9DmP)/ '/Dh"EH>!{9-P@W\PHaZ[Y `eyƹs@\^ %rs'96)!V~Nz9@mﺄ: DFBXk ?#V(2gcÈ2rbbp[6Hr?G  \!ĉmܯ & 2ʚAMݩi<iwC"ba,OL kXgD= AGUp:,A3IVKyz1:[0Vˋ"�n!Uh$cxcG j$. *F;Gx5:ΖK jгpe;On[6nZNg0;mnAN.jre.b9jNV1.!YpXN<=x:![⦲HV�PZQQ00 -0 Ly~qe&`&īḬQ)H\!s 11` 2xe$֋h\)EgTmQ41qvΉFBp /yF`(G&ˬ ۊq60+@fpymuSe U#& ۯy^6n~Lwfߙ璅QZ!b-�Q~0TFw`C. v•Te&A:bN]c}(NE1pLe:999| [jn4$`Mu6xL zWAP$Es.8lWBox;j8yK73XHR%*QBǖ\Wƛ)ITFeBz•A56GRJ!c^C *CHns5nx]R%$VLG謮or _Iu�,Qf+0c: I=C ;&Z3<if~Aծ~up6� BKMpyetD[خZ<|NgXp8B/c^5JoބD(fs@9K% R3Ʉ|jW<cjL 86|C,0w�hǏg` `qis0?D~^{eAs_MLp'[:WpW[DSf4Zv͛~N^v#gΜ_qp8s}fC;Hr*w"A$\,1f HQx80ݗY!F1/ PW020SQq%y>n`.as\etIYdnoaO z' q/5\{D%ؐ;#_z\'ˆN5Ud�&p.9y7¼G+|A9X<9:vH ˄R>*kUT9$zJX}kL ɦn+6R4;;tt_ c&@IKrL|IaJhPرvvv ǺEW_}`0o͎Fin'i TɸO<ḢhKϯ%7*5. 8I ӯFd0+]`:{�ytlɡHI'9~av㴚W87UV2k H6>:xw))[dz)x?+x嚫?ԡi&b$Ũ_ʝX 4X(˷ɴXP;+</ dxV9  _Y<2*&s! |�ΰ7/)Rζ̌ ̽L;qޭy^|sӗvXEmlSdyܒ* Y>(cw>TϨ0d]xg\D;vrV7ߛ X "$2vŴJx"G=LH篻WUΝ?ª.wìOz/mz*sJKj=QnBe >ۉG1dC "0}ЁI୔,k0 _nq\mS>{XmQh066:[o}p|ӟy+_ҹ;,~&AK&$je8i9\�H!@e=JBes*30L” icFbؕ &SFMMU!W�XP S=$+t:/7>C<@g=;{=鄯zZ<RG\=vW؟X1x^}Xt.Q ,Bs`V9 y#yT_bcGhxLT"'s+rmm… 7*XDṚajmqۇC#Όm?ܿww1jw{g0- L{ um>9Kt)!U.dOOܭv X$c\Sd1A|h (2z'OWbFE1H=U=(}%)Ѳf6p8Lw-YBv3%1X~vkk̙3.]bbM/!+,?٭0\z*LR[]Ŏ,Լv'b9ra.&`=gc xC06]M0eOecNEozӛ}я}c/^dLé3*.7c4sw}gg؏wcg\$L0PVD2h8Fc Q%"˩RGPGd n2gxtm-[KTY[҂'x"ELUKRtI>,<p84 z}]T:Hr_~766 BP&�+9qN*2+`F1*r|ް)Oy?ko0T [EB4dȁuVy">\*֐1}7H+t3 Vv>Wei-Y+Pb -EbL�z=)}3MUHGʾbNBn\^~8NJkJpI&5l&e@&]ZyS #׾Õ��A7hIO%f۷?t®@l"=N{v\L[T=<RO}e&4QYw9kq: %O6M33<ܘr8sRWo$'D0%3gD$^s 0Q՛{!f6?iciiC FS{ZWM|u`q7um7-zr͞Jdb{& 2Üh}ېLt Kr`9"*;4Cϭ#~:gFت%i2jҫ؂Q@3#$7$G;3nL/)(gaX}q:? ծ6y8<.Lv]r.O*+*S+ATV] 4,`taaVۥKlČMIe9?):#9/a&SõpS%rb{T @7P3"ɞTN޵AN{x6 Y,x.laas9| Z^hb<XfKs=iPM2y >sՙ_68 ҕYl,qGgmQVC?ۂ [^:4;;{Yd%Rʯ% }ڄp؀TҠ%±*6+7\� 1KӐs0 )vuTJZWi9Xv`n%{ʟ=ؑ0t oiNGx C"<Ȭ#7 Pucn\?wQhZ[SP+ LAXlh0j`VuMuZ餕M%u~Ր/,w  Jg+2;%x+gwPG4p25!@&@`!~[@RJ5 .ļəu6vL 2t(7yy43%ڑ!-,,X�=`O[V9ϐmRK8-Yk{sa,&8TN`TgJqfNv~01-өD0tnA<N'#\X<n�',7|"&[hFFxVVU|'Eo'l3皫WF-K0ZCl]4/̑?ݞRN6Mi8]FoLz WEUӞʷX�DYWKF']_)F~\#1 lb_5cnFDswpHx}7 9Fêi˜$/h @|dF _xp1kN#"9 …^m` ոOO D1Mq.b0Wv4l`&֎xo dYNYc3"kK#*b݁�TT >:kV$7O6Gj+#z5BqGeskbT݀yj2eVR`hWe%uސ˚�C#fǹc[$tr$`U<UJJ@qIBڶAOv@30G˶:^eӞKg8d1.!<%� Z`qܬn yMIA0'-<#"t8ܠ-XJgK L >h@HMf]: 瓩gc Q$+ QЈ7J�+Z8.�C!;iP)}4QujY]"tI?KN)40f+vǻe \263!^&L ͯvzaWR wLσ˻zIXQ 6aR.xsTh(w*xD/sI3 qbG ^Z%ie#&~Azoʳ۸  M)<=j***irдR-,,9rdvvvcc\5sXR$Y<+ݾfvYOU> 󍀮2ҚNBWIf~+ПPfxSy%9(!7{NZNu91+j}v"ʬ~R>vt؄K@\P5aQ EbSDK.ɷɿLѬgYu)(ix/\癙/ѣ&Gnh.,0hB?)bP2HLaaaV:tWw]ڠ8:z=�XmBwѣGݮzo,�r[.)m rP$YCo6vZ"w 5>Z`="}`h)lL7;kn> 9r?"HEbBB5??_^fFtT=W")E3rc{{rmn&WK~l䊝 g1bIIVCrlf;ba|ĉÇMI(5i>ZVؘ:w} {W.7zn%i3j\^Xś9f!&7 _~yn9r$!Yg2`�Aj -雾[o} ^�`9>OuiiC!d*P!!C_$T\O` wSv_͠t.uaa&@<^ŧsDz0Eik_d!-_XX[ɟ~+ȑs…J"NaO׶W&Ufhc8 S:={ed&,Q'߅w>H ZXףyJ|]>s$@W늰mQW$N ޝq 躗:Y<^9sfmmz�)EF)-FG;ѝ"H$ Zz3 cSY <O"=e@nsR3o+YXhg$*3!1= *Tc`l 5P ,:0#ӎe;)!M5͓zsn 4Nv"5q!ҖNOZIy,\%赢ږ=fVs �+);랡?5///S?0'8Ώ+APӢ(8LK E"b6BthvQ Æ/hCZ߹~Fn||5Qn|2j55) V[(g&PwG<I+VOT@,ArЍaSlli8> uAmIW,d=Ih4q)$/1 +<=iXhR$H4j Anr`|^0w/n3Ol4]K|sv@|EWodj --L\9⼶leIbK e0=yt>СC(Z#bUGcrEXyV~?S3ܜI!H4$.=TL"؞YU,rm+^_dv:،�xlRBrջVwj&KM暜^4Yi= 9Xx5cǎ^pRT[� zA5E_$&0Ačb$B'-V�� �IDATr~o*/%�<|*5Wp#O wBou|-2s1�S0Ĝs }5ZD6z(G^s5vԩS!�ITɰ} S*eUOV ȍ&حZ&X3%O&{|ivma'Lap` h$5 02Wi^Nx֘4#-*Û*G|쭭eg+Ave5ǓgQuUkWĠ0>l44K.slpAfM mbQTq7t<֚/%UcلQZ@t-셼!طªPLV6%1 R+LxF5^G Lse%IY>A�lFo_XXݢ`e`:F=aIK&[ }( rhee@ȍp !pk�*o$[eoB` c3_d.NN}r0ato٣GtM~_"|Gٹt+NHgSi ퟈x{s2vzn J=jc:4f*gɦoDה|YeӮfR'~dbÃsJa$Jh ƻǾQOi <b,DffjSvH/VVN~ϩQ~xPxl<6CXMtZm5ǎIx{dvܲߑ/vQزڒLnbPkP7m_dn�ft]=BEC(I+fjj0`821koϟ>}:,/ESQL1A�xxOOUW2OE=xH9F& k_]]5q <>>BQw,8&I3#5["\ڒ}^A&1VY*8Jkn/z8VMNᝲZ9p:)fy瞭t63Ǻőǰ¸T=I NBJWË.g~.[)h?MW<#M)\V 0#�4R_=֘2dN}y'?OoVƣ N, C[K͚@B:džaNiZ`R9*2dWH0 pZJ§$8dAۀPQo5%,(G7s0ׯ .9sGCl*WP` VZD⓯";<:~;%;A$ 8DA@Y*TvIR"d{<K׾`V+RhT|! foA>Sf%x`@V=ik,?}aIkB4_Vk]U~wf&lHgRg ǖ ȋ2<QX7>SYTd3k2OnH|?Yzg>K.q:Մ:(Eo&'͙<vq"P@TMLTSrw:p<0 >:JLC$hqka~6v˺W:@h%ZT"L)Ĥ]¦f,Ͱ|XA{ĝ֑.GDVNIDYYUPW2  =g^S nv`9'? H}}-R~_nw7ۂ6~cp uP0~rl�\EsN�CaC>YmMxI3l_x̙3L>t3mD><u*0c^@݁00g:<ruD Lko|k^`{n¦Țy=a܋ )R\|> $j % G ,Hf' v;\5V{JUfO`�/@ _=l址D!U0_ (C4nly1uyK6.N(Pi* Zd]հqI7!9: 9?/T)?QJ CD6f#_lcq8} BzVom 38,QhR[\kOl3gKI+n+~8(/(0l,Nt:-rm}۷}UW]nP�X 7\y5 WnI D5O<3mhWqIl.2p `U!6Fe0of\cs z:͏B1Avo dYb򅗨g[kJQE QfXHU4erQPѣGs>{Wʩv2g8l2hJi2[h4Z|){{M,V>Sߔ* _6R'ׂGbUӛfXUl!w�[LV4-PJ?ZhP -jp#%ġ.[s@`K;pb;Նo&e\-Y6t]Cq@T\YZP _I>؂k"D"t _^+Kʆ" p%d}: "H#]"x ]p\u Q|J>o.T)-eeeܹsh5}}EsK_=|]8E!(@ GNwnn~RqtoƝRV)k6K)/aZ0 ֛*ǨYiX ˩M؀/`31%Bf'G hrڿN0$:=#2thggg.^OU2:hsD'*vY9t\0> _vKJᜰecȝ0^`JNd5hGs:6G^5 H íVJDD j** h8Pճxܸ>[X@M¤{]f~2h'gPc (gZ(sa^oss3T dLFkBRR~kkkoz7|ws?~굯mϞ:5=[ѓ ڦD8 60wZ'JloY9vwm4n6߽5777?FLN-Ao4 H hC -cu6G:uhx7ʼ=>TU*$$!!I%AjdhE5LJAhQDD?$Ah4 C4 B0RTITJ*u{8{x?V/՘E*Ugx>ϳֺ׽{4}^NM=&p O�W1pȑpokp<kdf$FrڞlBӔ^$S|.ӥz@058‚O,6~M\<^`:)_ms=q{]w/i2#f Z4/sʪZnO8}E㛸$Ogtcfe</ځtp_{ Qʗ!g L#)(~vG̼Ӣ|n/O2U4\nE2&D&acNzk\* kd ̘_uSiBReeItgʉa4{`RvjzQ|k2?Y G1Ì^7ZQ|d˖@ M�p`sILCdxT~v[e3kaY_mΞK(68%2e. 0:f9`SJ61hW`N9;h\{!fi<诰5#{\sU }MpL/s 0C y\R'Inll� }ᐃF/ 9[v=/'?k}*ٚ)5?{[zR[\ /NL8 s=d 1,⵵ܹ'~|ou:OpRt:Nù{)@3,o4D1A&+$ݞ 7OOj9O €<~'o^׋ݵ⋓%G�`eB q+29$F(y!ĀPH lӵOp۠]ȅad]/4A=('T$UQ/3OEs QTYw$|;i`08pQ>eaj`^ &+<@l @H+woei+¹B%9Үs'O2VjtW2wT;$J;׵>֝w_z[zo~sk׮*4mv2Rm֓666N.'>|'>3֫չETmjp7WEpbIW=^N:u<#7h1TjrxP/?rϾ_0,34\_`B|A(n3bj*DY<sdA@0RO5#Mԣ&,a<l6pxQת'tң]v}CZsD8 ?0z30DHqkv޽V* Ktvv!͸sf]#BB  e,~ҍM&B9yrދXd`NⳄُ+vDy/S}SNE,q^]\L^?|+˘ST B&`ݻ޽{m"P?.1(BG 8Lg2T'nl7+}%#::iC{س<1{g>[off"FJNm6Fhqń"`ؐBAn],'/!ji$@ZhC! ~?gڝ'*hZ83J:mL[n@#hÉ~Ⱦвl3(MyzAM |F+J q_^Fq'/...--h9}gB hIkז%6OC#N2R]�&/knuU+^17{.K]7pE,1Ṽj6ڈH>|>w7v:}=T7jJ%0V'D@RK>6<0RJiƓ^ϏLǙj9ўju仐&36\FJfOssYg߿>t@Z]bsC&EwdB�lHLxϸ{ X"a6[X0Ӈs4q՚}7.j_ KD֤`t= F˕n4v|\ Qtldw|k܅u0}gB5 ǀwyE}իּ ^:9~f31$Bt 7 <).^Q7Ov i ea*d(mAr2f- 7ԏsxh8]whrdܣGsg_JQi!gCWWokue(w:ظV;PROD-ktX0t* 9FVMʿ3;Dșy"GVިVnwei>\ } J# 6d@K𰓠q"Ib.ߤKI]2OQ`L8rdI2fZ?|;S{o; .ZQdʱq(n#X'Z]]dU]Ef3['Xd6yᰨz/y馅 'Rnضg2s"陙&{4F#hyϱ֊nżӔ ~uPp[qR0 aLey4 coM۝{wYLc.‹Ay*3,9I~CS {I)T~٬T*<0h�N U .>ZJ4;K׮2}}cccGX8Vc?gyO>o}X!G',::rٱsF?mVa)]hN[J<M.Gv:"29~W]X t_443_Zj~wlM*L�[JJh<UƤu8LKv]Q']g"iVtzO[7دT/|a{ZI2 %/Y_\V 2L,� Tgzw2 aˆ, z+w??"xv,,xs5߭_ō7R @}k-N* R=3spӝNQk(1W*k&۝{!3:y Ơl6ۨvy۷o馛o]5?kkj6݅�6.qQ\Uxu㍻zv{Y&mtg e$111|qPW#(')x*c F\ `<3ɟ^'8 e=z,g~ri߲~9kgffRJ ~vf栠EzYQ[9I3cӂgxǎqm|4�7X<={,ֆBUְ_7v灗+(bL&z H32d7&Y 9[XYv[*b4Mb#e#FJKnDyΰŔ6>Y9mV*4j!qsg~<p@uyI.,eIQ(/TVVRJVWR:}<H:(<CX UX.|~EtqCQK ʕ0F\*J޸aRW4|ыh}j5}FPru?:OuΨVGH~,o!gyV5ƞdow!{:+K.쉻oa+�` %ن(Ғ2}U+҆!xX6m Dz/eٚFawȯP⤎? c`@ͮATU('f#`�0'IgxV%E<]?JZS+KKr]_OJAR CuFjQwϙ fl Zd$zFm7govk v{0Jr&⿁` ޶|dX,M52&Faz^_[kkk7~zK{~zQY^|Jj{o-3ģj&"3O =+mZ}rK1L[0yZ)}o,._M75j4!ٖ-҅L6or3#pԨegxx%YwUIіʐuWwuQ1 %Y.1\4?PIM:/cSҹ`lIgg'<PpLPc]@f=|?GhV+I-. 9Li9 |g=.Eg)h*a/{dH.Ru@Le  Pl?uԙ5ke[. p|Te�� �IDATӛzo{c׮Ν#2 9vm}/VV.|Ӟ}ᅏ}c.첏W*%֢ڬ~]a"31x:iHfkކ'SJ#Gf~7ߜٿr %#񈥥Edo.=i,Fbk ִYJ4SnДtIPь-d2l͵~Kk9YV56hcQ5&9V6ɖ-<a?iP1Yƨ 62v(m!x`ߍ>U`zŪvfoJw$in44'Qy+qH7SP r:WHc!!ipƧ̫_K/:(;Ö<fΝ~~Ѵh4f6c2a^?҅b8! RcI9tGx<;;&:FZoxg~uC)�$̙l:\h�a:381H!;8"t98^ BjրpYlN'?{˷GiƐ3$!rkf1٤J 36]l:&>^'ٴ7qن;Q=L+ʳ]LQ<ۍlvx|x{v JZ`\P tZ`:cQT!f {n0 ;Zb9=^ An+6]d*@m2 TK.Oe`9g#{~;ߩ޽{v㭅Jc^`F,1c󧟇WF}г�UR)=À2Ⱦ}m}�8Z-Yk;y6oP !�c�[RrkRzyJwŻnq梋V^UY[V P=dg4t8wEb[VTqmPǥ; f ;7_{Ϳ83S`>}2g$Is[c=࠾SdD2Ar7j"8 [&sN eM;NώB!v>ά35?[P:GOrZ9=/}C'u־}7wаb:k xq;�JReBBn\/�7by A5B^a#�Ҁ�26Wb2'D3ɍ : 1%}` )EJ#)3;{qǭ//_׾v}um&$8挈M;l#]A�B5J~ݳb9c Z2ٲ /Hizʝ1>ɛJV+�Cl)2r� iZ' .#(^MHSq܎}K&逶Mf*Aߌ`M$>aIY^!�aXQ&QтCVTu7ʯvj(|"c-TKπ/F�?yɜ/Fcǎjuyyٳ)"ITec(i 3. 8J|2aV+*f: lO  l*XitMӠ6^P_GRtlJ);wڵo,#SPZvk:\;<ᚢJ~DHM{!aC���Exrvhǎ?C?~{ﵥ<igP&dLMF|?1䉖Pz"= KI%&Ck.}'ܫϴ%ٔq0yy:{ juZV~vcj^ݷݖRZOFi28:Hmlmx׀E쉔FcqqѧQ6a.*Kyqhg`im)uhv\uۗI=q|c2U!씞;SzKJ+++ 7яݻǓ.bEyAm낝,DLlf~`G1weM߅p#I2W43bUnQF"2L3 r&HrNaYZO7@hEd&<v#i�u;#Ӏ/Z H`MUMx22k&~T\OU*{ffRQ?nhǭJ2y_qVk?I&Ӡ Xnƚ�cpo%hroH&2NQ:hEj2 ivpֈKܖ!硻I),[__{3~wux21b IMV} Iǎ2&x"ՐX�,...//P;z OJ~+Lhvk61X\XXX__g[2,b/`�Pz("586?_ヘJe8EѫV{697> `7ANV֮:xEY6  P+QU?SUVIVrEH,9~ ɇԲ1QG%Hxؘ3"g<5kvuZ;7ۢh4.$@Jt&}Ʈ1(lXPT\Qʐeq)yJ:+_Ї{Rxc7^8n0!k&Bz;l>2}}0LR> 9:U367ǁodX$ if٫Gi%)^.C͡[ά.ޛgfڏxc(RJh6*Kͱ{ "?`B[zE>(WR`g,,-5{nnʆ<Lv<H)dӵ5!/jI&4xL*"Gb-4A.Ɗ0�cOjs.<{(P{4~9^!A3ːeQ/~~ aO JȲ9 cIד>Nb3䮀U!3'DI4:-3mKgY y[ПH!A#1(6jg7a^x?[OloÝO};n[W ڒy[E[+fppr! 9#Gx/ QX<̃4j$Y+fupo&g#aV FמFwYɶD"LIR[G/bL&2R K.K ?Uz n #B[xޖ!'*7\b_І3.c H8~ۥu5ǥ٬Ea7HA68ym'EZb铯bI1o!x>Cº �>C <�}&F91]VF"Ϙw⃕z3?'_җV/Wve;AZòinPƾT,bǎ'pf10 )!cZ yAYψMC?ab�T6ӥ�?>1�*$ ɽ1=׎o<Ro$/hHyR!+!0(ʫ4N5 [ x-&aI ]ywAn1c Fnɘ"~M țl% \̺<7&ibKleDd3XL$9u E)7öo<~r:eG׿G=NxS?=oZY07M jm[K;wFH#C?eOh4o?/{~Gn:FE{XEzjWWW{ynα҇,O3ͳ5HP s%b["3') lFvLw| pf[Q\f<0C9‡;^2jQ%EPQ2%f1Q+33\0_ژK#ꭿ"GnVj(GqJbtD?M q6k W'_' 9'۬Ɓ 8~;?LNUlpGnRe.*) Wħ#n3pF'Vg6H _h4=s޽:Ygo?c~~#G+;Gn~|rwco}={�-H'[UH {ݞ={Hx9ىH3pl(O3SL�Hֽgt]HYiV؀. rſN&qzǹLF(+ihΊ))޹jd~!%G?4%{a�F#jQQlbK/G 9[),Ns-$WK|:`X//<f/Ef퉓Lqd,bF=gvP1TA?vΝ;BޯG-b,|}2͸+F3:H>nm߾=9r$'I'u/v`OT>{.(ϯ&Iƻ~ٽnN@f3:M&eg=b? `y`E5z8v{40* `jN.2eC<luAg=)T+#̣E^d>OSfupCD5v^RxKןG>bD mMmb5 HN 63U8[kZwnCf39BLzx"6 HrPs|Z lVkffT=NVNCt%`lQ's4'xII{9{kii)Zqkz`yyk=#ЎGt:+++Ng8}k殼_ OxT>s38$32h ^G�bvrD=iwj44_=p<dKG8|L|RPF}#- j8na(5~-Jr̢ FމGz۶ a"RV_xpqqo6fsKƯr*'yE2PMH"<¢I�sI7\kLf D8s :YPKt_Lz&Y!P'~ `Kxp*[VkkkGF{f-ABω5t}"R{]|#vk_ڙ`{nmMwԿ3g>ݻw/?o}k/mC3 sL Qi̟yIj��nHDu":DcMi"csOMAi"h4Z]]jxv_6Q͈g&YO2K3LDf2"/N|o\YM { 3J@]L8EA B'Rs۹sI'vw7?Yk[y9O״ ]PpgYߖ!b1Nd$WVoxM|uKd"561M.uѨ( 8J<!ChyԠh9HiǗEnv{1393;m{:5Wڇ>/}k_ڡCƧ>7ôa67Hv^^=cf.Ŝe|q"teMySztA+l’Gy^d/A 4B-DvEsɞ*yDL7!A; %,J:^|xųO{cht`Jkac>m,$0 YUpTI`sO#KF2a0NrUY6icn''0Ȏǐ[_`ܱ©҂DW*a9jїjeg933sZ=7 /m_Cwi'~W]Vٿ̗@21sY9gggpiZA"G G3&Mp"0Nz%7δe/�=uXf]qE4-#Sl(iIn ,eχ.I Cfn"uAb"/|ʿw~t4u^bck[r2Cx\~al0;h3ƚI`Sٴ͟Ùmr.Ql�S(rg;d[<I6YVg#iVt0d8F3vfqZz] lpqv{p"g^g(KK^<zWϾ=o�2xAvecP0VgK=mJwl P5h)j.|%%xM<("X =JÔxhV٣f <uBI` Rc kEF3qV<k`f�IȒh<k~1?_ٿO4Z--CΦ2Sݘ=TNZQ`"#36Dщ]_OJ9A+'daGI9:-Vg-@#1o r65VyB\'%lE9 s&fY%) n5KKKN΍`Ջ/nյG׀&#)` wۉns$~\urzV+[[$ I*^DLbj׀9D+j/r`(&y/l mllOӄ](O'IEP֓PTњO(@ƜdL J5]2DW:YDiκVSJ{f>aey>۷o\p`aUHٲ �68X4@mG''Ս\0=�ѣG؈L=vsf쀳8ӅdN+DFdD8 ,e ;y$|4kh¡F72ua\OBDB(++hBMlĆVF`y#ڙ c~ C_ܶlVj!һΈ#DN@hpfnL M3S+P%3q+TI^ӹ714 '(t2.bc2MqذhJ:\o:rYϧx2[^ZPL_^喴ߨNYSpLS5:jJ09An6{m""8V"ȉ#| ۅY%&pČv3~Ж|;b!bojo|%gXC ?}{k=@ +ߒ5#:GuS&JDZ5eox&IiH~,hInrWdB1!Nᛌ;4Mt<: 5x)ɏFɬvX<v>Ǒףu%cmNo}/~14\YY}[Rixd=Cq$&ib?D8Va(]:at7My%Cvfei2CqkbL�G/CQqF@dȠ\ uS듮 AHG$I@{Ht@xfffmmͳ~?^9r�NqGΎ0$i{>V`濰8#τVQpoKsiZ٭~><%Vt)s;3!%D] ۓ0:5R2RhSPd+!M:܀ Ii_e~)$i2l57W]5w5gەJe׿~o." ZmRYk68�Fmq1e"잤'NXca>_kHRZ]]X\\M-- zHmlƂ{0y`40U,p,BIeu�� �IDAT{- S%04333}c:묯~-c($v\7@, NyjC?1|_kS, oH) Z |cD|gƷI03]iX\"FI<z`�"El"zĎUvոi\oej$)!"Ml�F˰ 9[v>{x37tx=33{wcWj##76>hW?>s= 28r'dؓe7d<85#3nI:i%8 b0ΉF4i2BA6Q,49sĘ&�,w6 dDҁ6빹;wvivpgD)=I4MlʆMz.U'e`d3ce-$iwdL>nKCЁ'mj=,Y9| �<Kzz^߬(_+o6%%: Wmd7+!g+ͯ~u 뗵ZvW~ rz}!&dNkU3ef�z �\j,zr~�D7'mB?{ǖE1;;h4̆ <r/mח0u7fr.fJF#ݻoÇO"Py!,ŝ5Hst3]g7 X<zmgbCdi4|8iN[ CȁC33mBHxhL;qFf+)\!ܺsХq)z,&Fc$\XX kkkL9SW̽\2E Ǯ{//?ys$άfOr'MG{6\dM6! ZH0dТDR MïEמiG!lZhFc~~~۶mvqh6U>hr~~OK^3<\^o߾Ḥ!_ԑI3aB �Qt9r'o9,wGh wS�Qya"O@vWfST\0+55@܉]MCD.xl*M bB0%jLwFh4׎AA4դVeSFb*C&%�۷oғtgm8j$~H7鴬r;07{p~< Oy'>/| T>ZgҷG'89<qO!�h>;(jYZq3yw;ZF5<L,.."e$&3L Bav{<oO鸔RDx;Oo>_BnZ'|ѣGآam͸ CGF�d=|$-4Y~2ɰ  6<E y >LB5 d֠ )vm pQ_n =2 O>f7Xűb Paޚ?~G,MN[ Fp ^<Hprʉ )^syJsh4V43.$ʲ4jdZc`s~c.?l[8`ypg(-_djK~4NrxSQ]^/?43??5^/8:x="v1K1< [ Int0 Fz˸n)PvMӘb@,D>FĤQleNM߳fI b›Q/Sei6kt�ٵ8-g7eb`j8+yOc¼D5?Cݿ?Iw-:d.CsTRJNo늢VWWb42_qЊghD%-K6#ڈ4s܉"ev;c^hA<ȇ=C<4'ws|(XP_h[TW$]&py۽5"}ps"3h=c7xرR$)bH_G=[5<q1X �(\#v&+Vg=4%T,Δe9N)&#Gv?7.hp7^ӥ<7kXo LociB &`ye`-fzbw_Z=pE&[e!HCg`845hiu0péM:3`fhe{31^nvW0obW/VB3B2r۶m -oUl*wDU İ QJ7;;kV}Cq!s"}f:g~G~=]c b"ˠqV?�3`VL70 $|(CV.0Te YnƝBdfx;xV4UFZmV_՝ޟ;k}Qo$3)3S)MjBً�:lhjesH\MR2:Rݷ! #Ĺ\S<D6]Ryg#|?qڽ{WVpn-hw+~Q2g0> *;P yIxѓ;Ő&$L0p3|eo6?4qs8zL5u,L9= !d`no�j50[ʨq? X10t@"r܉.o8Cl&0eFSY&!gMZݍKKERz[Zў҆Juj ġPVqfcNG.Md A*awŠX2d,iӘaR7eN{ӮBhL駟'?[ǃA]p`sdRASvkkĐM3i5K|'u#+v앗66-ؚpZ0#dnk% |nLv/M!GF4]3Kal6!V(u" h%Ra]gގi'y_BFpd`Y_ڎV*VjmVÊZ 8L�sbahfl{4GΑ˘?@,\{#WFlvSDi3.:LbT_|d!Gbs~'OPTP_x)aCM@բwm*-a¼%It$'h3"yyB,K&+gK⸤~Me&."Lb�UbU!$Fв9gz3#]4'ON;%ɾٳN\<LdP6sO+RMNw2(gMI6533Cbm2leM63&qpRM H;ȈDN:,XuډAH35Qf-N7@ޣ_@eL,,HD*ܮT_gk66^~R.hc8d2wher'=svl|R,I7E{hN>D<09|*u#cxP1ڴ㕱"R{NaG, "O äJF}9  hq[#leznw<Nc4 y;'+TE~g}CcIޯqd*e iZv4b,ĠCfrtU44c !x:gSi<Fa)3qMBm3C?"RƗQcomgxHgl<¹?Oϒճ\Yy`0  >h:rC~ I`Ʀwd=2ZP iF>de D�Av{mm ӗl&ITƂ='m8LEш +/ԭBW 4d2Ai6ϔ #7_1lKXh\d~%A� pBC䇉l.:I�m;DUg$bG1 ӣBNMxwij`;2Ywa ;Yʐ ik6'(/$H7<\›ܵ>cY(qD̟!#NPgg e'"QcNƀIpc)]Q>z4O[Ty/P2iHc}m\掑0b<BI7bynBj<~}LRzFw|ѧz<j.D# E1@4C=~/M'+L1IMN=g�$ 0ױL)<&D4[>d-"+鲗$iJz|~([::\2 wzgL ~92Yӳg؈5QYݸ "帹ʧf?{yj2h4j^CZflO,7nBDOp]Q?j:R \<?p '`18ٯ~r|r| 3a`j2\<3vK EQtND~`�I\(x)ϚVdʒ�y=P\ ݵ]ع B@!Y,#+[B0C A۰6hfo1נzN^V^ * zP@!U1hKW eÛ(N`0�H LH89!"wʆ A0O1yֺ  ygZrT\ZzFK2(pxozMc;ґJW*u:J#ʐ0 ڇ녅7p+8R36K撞n5]<m<~#1GW*8#)ݣ6hM?dd#�؉5`">!6H&Rܴ tDM[|߇\Ȥ>b'o2GL>2/ =9, 7Ib -[b̳>mc0)@/mtm=7Ɠ8/CCM�@PfL7'Zᲁఉa1}@8鬺ʹ08b?GΉעw Q 's~~C3Ajo'k йG$E$to.}V{ضmju`Nc˓7'u!ϙ`"氱Zs=qɨkf|;_R|r_KڽsW`<<W?~3 bN Xo &C,[΃A% 0ڈ8ǃ [6 O�qq 6G|a3k8B{aɂp ?S("n 2H|RHL2$'|xba\3R[B]M(|ؚ 1漇6R9r !H:%Q~h`0`E cv�`Hf\z @4=tK9̳>~xEBM)]^ѨW*Ezo¹O[hJ>A;:U#:t(>x,x+3{ fhk_ 3SS߱SOݾ}{V;Sg*G\!kg", /ƬHNvd$QZ|6eXb$[apl$21O5m=C4ښ0@֠P8UH/@ fY>ŽL=�ч>pU2YSM<zSd;vXXXXZZZ^^^b8 qC#]Vw_Bi"IɩSgY4gFN<G�՛G^#۶ڵRٳϝ|@TpS[R`c-1]3VqmE3to{%/V*3_R۷k  _=3h$T[%c~=UdCAǦ>/СCh,?�8D;njX?NPȄR!&a"Sl>XΫa*QH@d[#1͌eteٚҹ ȣQnyT%}' 8Ӊ8 { 't]&D[T#M='p$Y,yp--x 8KPtͺ<:^r%w}7izwA 4guw!eq>EdFTC񿽋/{N*zs֍7rT~xws-KKt_Mk{N.$l)nKs%w6HQcq|\!~ hp^̝ ~L+% eNuof#؞nȡ MD!Vnת6@wLXpJ&&J_9K-GFRjuj{'WҚvqIa*("&2xHc|L&ۉUp@ΐUoYkIf-,Om=SVO﾿ۿ-biiz2 {cfm"u4]0[wtJg_m\tQqG>}Uqw7mTn._w{huc'{ظ^_Oimm-:63<㮾~럆-h�gFi2f%RV%vƲ:;;KݓdG4)^D5;N3j25x ;v8S(nX(t %kldc7v[  $i2#{Qn %NRYEP7~<aŰL ?]:ŧ]0c͓2)׷Zo߰o.b(^TG)w"zhc+=⚕<(�jRIJiE5Nvyk]|qXY)}^|Ł)Vl&x0HVW;Z -B9nB#5Y쯔R& <l6q,<wZ,gU!0À'Dy^_fԼ ɓ蠉@"]ц X)Q2lAL`d ȿ2k^H p�{-4f]8_hf]iaڬg ;GN"e̦G2aF3}x55J9*ʰR^Fci$+hI =hͩ+f.6jї\9x XmϞsFhfHǵjVV_Vl.chEc !*U�p~,Ӕo2X,0R+G&;qdfOfoѣDA՚@o.'Q О1ho(~86!(I֍>=L(bN=Ígdd4e 5<7y+fȠ\,#�Ӗ*[%hs%]q.W* EqFUZJgL".&'Wڬ銐YVٽL~EQWVڗ^u:/}iz{�kMT�X-?ILP=*a„oi ?fyfE!>GS{'-\JSGMVIfĿFeQ7M~T@`QDz=S-H<aod/m�� �IDAT!#aP_`yb+7tJVUGF۫G 񆤛,w@5c#YW,AU ]e)btx3aHw<Ƌgf.v8NOhL^]'}DB [$vCl %O: ;ÇIq\C5iFF,>83^&b;r<PcF E.7LmNU#,@aхxvlϴ6L>  רuj3^)L&[ǟ GͽAD @2l=cNvQ6#g`{N CmI3A"`'R{u2@.jCˬZuXYyЮqBQ-%qg>M!>Yo͠03{{�U%B.Ӧ|hŝ0 Sf+6_Ԇ,3aNׯ Zj(D8"9>E)3;m9H<S^!&vfA[.H"`%t�U5@kScٲfucѲQ4n#w,rdR,.e>=…f^g*Kdf,E穩̙5ƌYo4ыBO FE%4<9�_(I.ࡋk^>kf40N�<b{b9fhT{4$daFng^$v 5.}'(2qxUV J&Y (QG"$ .Y16(8o0ZJ"F58"JqQ,;w>Q:xw=4!i*<m44BϏ vy`5F$m7)2<=!!$|DB;{6LJƌ̧X,hkubO#=Y6IP`4yd^1D'pۈz=U%x Ha:Q!F"AI0PF2?x ]Zw1\>J1,btfDi&wԀx,�u_̤Kyr %'i.ĹLׁ5E a_S=y$/\@[]LKSzJuR.JVKJl&gE⌝~׿#GuaO1% ya-O&�ː7Zn=f](̜] ;Ya3�$сPWa3wO󹁙MPsNll6 4e1?qi4v;pj$U{=o#Pղ.<H3#""zgrhLeTA-bSݛ ei/O~ǎ駟~?ʊaXc+AH2$ކ +EhfԳA}c<m]N}h A5̺ܰ ̼LcA}|o0r3ƭߩՊ8{</ҾjP2[juqc;y:5D\*&8rÌjÜ:YMʐ5Wh�YVmu7s8s7igQhR<v,Ah$ig%M ݢ?s8ͦm1ێdLD+5~=qIN  j$C 7T lt;v &i[R=z'b ßڵhqx!|Ժ]Q-!Xr~~hf8Ԓ* f͘x;.Ț`{�pc27CSwG׸O^>7i)SJJhJ?]8Ec(u ]s`!ENmX!IdH *�gEeٚ+4q;w$uM&BN4†l k:aKC$t f,D-�$/nc8,ŖE <Qz�gs6:e0Y^6ghOE0Khb5 8ⶱX`0X\\9r 7t:i.XuQIh˙oW0apN43Sx_$gKFyM r#ScPuY\ҙf鉮 Ob>;|ja` q~;O!E=#@k,{jԑ_jف >6?RKKKg- 'Ri~88!*:E9:-Uv]χHXu!',B-PCl9#9F uOZ1iFv )IwA@NM $tF+a&Q+V<xpuu.f5Xgau8X̖PqDL6~p: $pҐ{ORϜj7nEƦi55@6�K4O7nanYYY/}IМfLPH郺,fYCjBL7�e`0wVbK �927gc�։C3eR0982u~I*IѺ NL+ܲ9̭š>ncs f5"9f{@̴͗0`hB>TыdYJE{iZ {NKcq⒙1% Jtzt/�ib&3{[�GGNX@e"?M4=A?kPpR{<ض񌹹/{MO'CN<hq-= I/jP~ص-(2G2lEO}nόx )e1љ/')`:6B8PъaM2 ʀ{{IqXvW}]-Ig7kT{YXg:Bŷ#钮uzw�@<Gxg򣂟@mq"qҐk6^'f l ;%7ufZ  uԱ\ɻ`TMXƙ5)B4A>vX8À}>4!qíVO{ulࣃպdCZtgSw 9[|o9t'PYi!2c4l _aU|i"HJvנ cKìِ߼/TQ%eaίfK̞7~5:RML³qDIZ`>!3 Ѡvpe1L3A;Y>x}na86>|]n!VmՕK(b EQ[|R9oqkT*j?wqڤ%*J{EvZ(\;9Ä6kQA BQ`C=Rimм|KߣDdb"Bms3 k)ڻDe{(D^!>ű1 FS!J DENhKw1aY G)l?u>%21^̞G>Nd|LGFROȘɔO9%+<g6梕#?~T<<yȏx#?$_NCj#�;yB1LBă\H+ݕʟu:g-- k66^>~Q7,(h{$@{rF|WM.Ǭ7;mee5Pi1�q;ݎ}F2H%[fځU-lmĴYe~4lE?EU͙Ixj# Vq02i ]3'lVTXݜF !nVvh4.HZ|j@(P< ,Mj&̊?zC'X-Ѩ I,AY30=,RRLvccvbE)Nj,I2YK9)l4.VxRzOf󜍍f[t \54#I =Z h*1&p:xbxۀֶTM$ *udቓ9%LJ L34[n ,^WvNd a\iBT<gOeBPş:k82g[=g�>!XПj3??a ޺b9Xg2@T]p�Iq <>Bd/n4OGQQ!1qqq=)a>&mG-e66\ybJEQ|I^M@~Îq3>XH+3ʙ{,x>2p͋2ؤ�&40+p:;q� #@*`0,8~`C8s.$9c1h2e8w܂b\pϬP:+H`}E6b92K5wrI4qH/-�$?Ei+ &Z^;`@GRJN'a"'uL? S%k4۷oJ$O_iVf^%olc{Xp4M˨ڢeb1COxbfǍY'FY)I;𯻀i&O*7) i{8)E<Φ%NrRV)_f3bkgl"*kPOLPM^@!m|iϓ8 {H4 8X^3 =IU3xV&SA J9}PU6#zv3OX;Q"jI%Q:eP4cYU PKcr#vq']YYG!欯p€g 3oZ2gvmFf8C<#Dx x}f73&=<@=9gdoBa:e@c<޸hE2leX ؓ6R{�2yu( SÒG.VFw.d NzaGY͘aF T,wO}PV,n(.ӠA!h:Y ?<mju8?nYFDx2nz o7TIԨh1"48B_Øp8\ZZt:?l4x`Oupk'4}\X~ %yND+bLߴSVDXyߏe6K:&w*3Ξ yV ]X睱SɶOx4qCQ<p'erl.'˿Δ=IwdSΪf7fj7 }},g@x%đց@f7y9-59/ǏiV!a# DC*Ij,~puu5(#~G\-:,'mvܹhu F*w5{`J7S+^^NeXq34Jmڹ<S18aFĪ15 DPkd+=p<z`*)سǼ`XdS+Q-pjP 3M]sZV.{6]0j�X5b3xD kH8d?وYX# euoȈ#q ~G&TGx>(Mrڍu"a"^kכr#0DzYͲfjI^ڝOϸxލ-9Ϧ TxT$R8$S93s!nunnnC656>*'GnVBe2<0l�q5w ;D@n&gTYc_c6j*]V1DSaaH鎺ͼj?=6q| /#? 4CW$١d(�߻3Q*^o߾}-,"n]C(dm Oic F R1,7vX'd1g74#FK2~"2E+ވV-ܧ4�&#|g<IO+mQ9g<;%&]) &g#yebҚO-,\ 3Ŗ#s"L3U d8@la@q3 x[Y\C5S|8ayß-P߶o(d.$=ZL4*t=8GR7a3%FDlx* a0*kU2 j@Q& oxkLsH`2mS`>,3E=g�Mj߿=zԤd9S=hWrKRqL~qeٲ3M`dXËǚY#m^sU̴?ds}f4mzV>gɻ-@b.gN%-~?5=M9sDdZuMlX8m1IX2*G4CQ4�IegrV]r໬~�C%fS[/u'ɽ"$'g4^ )#$y*T7(, &}'fL G<33 Jcǎ2lu9Mo*CyWy׿UjWyWyC^E)**u?HFOu?}o6/{(m|O6/`SeKO􃄜?45_y5\m)***zh2WyWyWrʫʫʫ 9U^U^U^e)**2WyWyWrGP^U^U^e)**2WyWyWy!ʫʫʐS^U^U^e)***CNyWyWy!ʫʫ؏cmE:T<$+!e/FE]|7%od? 9Z+ܒwUW/F+^w\w~_d r|?_N<'=Iqomɇt:KKK[ۿgY狢8?`o8޽{O9Fλk:W\ WyWyWy}hzWU*U^U^]e)**2WyWyU~_'>1|&t)o|v۟g_veEQwygy#[^^g?RzSzǦokl8 XUCD쉯 Qvfp:;u˴n\(ъ(()Z@5"c !7׳4evg x~={?<Iyrqss#kWu/_�srrڹs[npUU�DGGϟ?�޽T*|>�,[\\ �K.!Cܸq`0Y&((� E]]�ܹɶZ4 %<?~tt4)M&Shhh`` �JR�xIPyyؘ?Bz �gѢE�`6_�ׯ뭷�i;v찹.'''�P__ѣŋoݺ�FP(M6�@{{"hrrrժU+WP[[K�T*՝;w�`s~i``ᄅɼ�l �򋫫kTT=#aڿ:Uo�_zabqxxxSSSii)˲*?88̙3ccc 444ϼf4ܲeKCCCYY˲CCC\.7++K0 SWWrGGG/_l0juss3dzxsՎN6o<wwpe2y��&IDATt0Luu5drrѣGZ6 ##cbbaD3gUo&333>><cdwwP(###!!!Z޽{bdgg߸q ?~<??ab\\\ իGFF˗/gY… xTaP֦<xpl(G$]x… P*Ɔ{{{UTT,T*GGG+a }allՆAb$&&-X $$�$X,|Z^bӧZ-0555!!!JO< -((xVmllaD}V/ H6o\VV&J'&&>|h4Y%SĦMZZZJJJXT*VzjX>PY~Q*@t?BHHH!D"""ZmaaaVVƸeuFe2'%77cLvRSS1j Fb I<yڵk㲲cbbAB+W}7#E"QJJ {'O`;vݻw?s{njjjZZ9V(cq0555VDZouVNWWX, ZrȑgOv޽{۫=1V۶m" H qӧO/zzz3445q>RN[[H$zwȩH7n c*p۶mj(33c޾w?Om/uu,�ptz WY(3c-Rx '99>x*ʺ9d`q`멇RLNNϟvr|Ywww,YdiqppS U*:D\.,xO~96 ׅK:/<}@T={6))i…3c:&iN81'NӔ4LM(vHcccfff^^tRVVVSSsĉ;"(;;>:ut266vuL&Ɏ=HryeeFh4MMMUUUdmK'AʟFSSSIIIBB~Çi4(..ۻUۇ͛7@oo/ɮP(.ggg4h4�;?RoQb9N,Ǚ9EtJT>|wvv"Bcɔzc̲ڵkBW\1vNfBrcl4SSSB{1 cNG*Bl6/] cYz@ @D5qmm-LHH@*TX,e׮]g4LgΜAEEEY֭[B/^4~ <}Z***rrr?fbوfY6,, !t%2ƄB!0aϞ=TcWCHIIimm%c>1FC[,\PP'***y&96III??::J/--% "##.BܹslZ>p5?دT*XOBG!cÇD"!Εڱc Xc/, r D�4S( %b {oP(ʟ 9 B!BP(32&-3̙GBP(/>?B}M}?e( R)U /)qpɼx-\&t=)) s6;XM8o�A*m8Cy%|1j#mq Bym)qx C�LT|Wx N2C:mq Bym1ya fuyNe db(=-NP(-}sWLi2Lfunbߒ\� P'2͓) em.yyy.[ � ib����IENDB`�����������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/index.html�������������������������������������������������������������000644 �000765 �000000 �00000035602 11555611700 020407� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Catalogs - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Catalogs</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> DS9 provides full support for loading, displaying, filtering, and saving catalogs. DS9 allows you to overlay symbols from multiple catalogs on the current image and to create expressions to style the source symbols based on catalog properties. </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li><strong><a href="index.html#display">Displaying a Catalog</a></strong></li> <li><strong><a href="index.html#select">Selecting Sources with the Cursor</a></strong></li> <li><strong><a href="index.html#display2">Displaying Multiple Catalogs</a></strong></li> <li><strong><a href="index.html#clear">Clearing Catalog Sources</a></strong></li> <li><strong><a href="index.html#filter">Sorting and Filtering</a></strong></li> <li><strong><a href="index.html#symbol">Specifying Symbols with Conditional Expressions</a></strong></li> <li><strong><a href="index.html#save">Saving the Sources: Catalog Files and Region Files</a></strong></li> <li><strong><a href="index.html#cite">Citing a Catalog in Publication</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#2masssrc">Figure 1: 2MASS Sources for the Antennae Galaxies</a></li> <li><a href="#2masscat">Figure 2: Catalog Tool of 2MASS Sources</a></li> <li><a href="#cscsrc">Figure 3: CSC and 2MASS Sources for the Antennae Galaxies</a></li> <li><a href="#2masssort">Figure 4: 2MASS Sources Sorted by Decreasing Jmag</a></li> <li><a href="#jmag14">Figure 5: Filtering 2MASS Sources: Jmag&lt;14</a></li> <li><a href="#jmagrange">Figure 6: Filtering 2MASS Sources: Jmag&lt;14 or Jmag&gt;16.5</a></li> <li><a href="#editjmag14">Figure 7: Symbol Editing: Jmag&lt;14 Rule</a></li> <li><a href="#editjmag14ds9">Figure 8: Symbol Editing: Jmag&lt;14 Sources Displayed</a></li> <li><a href="#editjmagrange">Figure 9: Symbol Editing: Jmag&gt;16.5 Sources Added</a></li> <li><a href="#addlabels">Figure 10: Symbol Editing: Rule to Add a Label</a></li> <li><a href="#addlabelsds9">Figure 11: Symbol Editing: Jmag Labels Displayed</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="display">Displaying a Catalog</a></h2> <p> This thread uses an optical image of the Antennae Galaxies (NGC 4038/NGC 4039) from the Digital Sky Survey (DSS). It was retrieved via the "Analysis → Image Servers" menu in ds9. </p> <p> A number of the most popular catalogs are listed by wavelength in the "Analysis → Catalogs" menu. More options can be accessed via the "Search for Catalogs" option in that menu. </p> <p> First we overlay sources from 2MASS by choosing "Analysis → Catalogs → Infrared → 2MASS point sources". The source matches are displayed on the ds9 display (<a href="#2masssrc">Figure 1</a>) and listed in a "Catalog Tool" window (<a href="#2masscat">Figure 2</a>). </p> <div class="figure"> <div class="caption"><h3><a name="2masssrc">Figure 1: 2MASS Sources for the Antennae Galaxies</a></h3></div> <div><img alt="[The sources are displayed in green on the optical image.]" src="2masssrc.png"></div> </div> <p> A set area centered on the field of view is used for the first catalog search. The center and size of the search area may be adjusted in the Catalog Tool by setting the RA, Dec, height, and width fields. The "Coordinate" and "Size" menus may be used to set the units for those values (degrees/sexagesimal and degrees/arcmin/arcsec, respectively). After changing the values, click the "Retrieve" button to update the Catalog Tool. </p> <div class="figure"> <div class="caption"><h3><a name="2masscat">Figure 2: Catalog Tool of 2MASS Sources</a></h3></div> <div><img alt="[199 sources were returned for this field.]" src="2masscat.png"></div> </div> <p> Note that ds9 attempts to select the correct (RA,Dec) columns from the catalog data file in order to display the sources. In some cases, the user will have to explicitly set the column names by using the drop-down menus in the Catalog Tool. In this example, ds9 correctly chose "_RAJ2000" and "_DEJ2000". </p> <hr> </div> <div class="section"> <h2><a name="select">Selecting Sources with the Cursor</a></h2> <p> From the "Edit" menu in ds9, choose the "Catalog" cursor type. Clicking on a source in the ds9 display highlights the corresponding row in the Catalog Tool. Multiple sources may be selected by holding down the SHIFT key while clicking them. </p> <p> Similarly, highlighting a row in the Catalog Tool will blink the source region in ds9. If the "Pan to" option in the Catalog Tool "Preferences" menu is checked, the ds9 display also centers on the chosen source. Mutiple rows may be selected by holding down the SHIFT or CTRL key while selecting them. </p> <hr> </div> <div class="section"> <h2><a name="display2">Displaying Multiple Catalogs</a></h2> <p> More than one catalog can be displayed in the same frame. By default, the sources are displayed as green circle points. The color and shape can be changed in the "Symbol" menu of the Catalog Tool to distinguish between the different catalogs. </p> <p> In <a href="#cscsrc">Figure 3</a>, the Chandra Source Catalog has been added to the display (Analysis → Catalogs → High Energy → Chandra Source). The symbols for the CSC sources are set to red diamonds. </p> <div class="figure"> <div class="caption"><h3><a name="cscsrc">Figure 3: CSC and 2MASS Sources for the Antennae Galaxies</a></h3></div> <div><img alt="[The 2MASS sources are displayed as green circles and the CSC sources are displayed as red diamonds on the optical image.]" src="cscsrc.png"></div> </div> <p> To toggle the display of each catalog, use the "Show Regions" option in the Catalog Tool "Preferences" menu. </p> <hr> </div> <div class="section"> <h2><a name="clear">Clearing Catalog Sources</a></h2> <p> Simply closing the Catalog Tool will not remove the sources from the display. It is necessary to choose "Clear" from the corresponding Catalog Tool. </p> <p> To remove <em>all</em> the sources from the display, use "Analysis → Catalogs → Clear All". </p> <p> For the rest of this thread, only the 2MASS sources will be used. </p> <hr> </div> <div class="section"> <h2><a name="filter">Sorting and Filtering</a></h2> <p> The source listing is sorted on position by default. A different column for sorting may be selected from the "Sort" menu in the Catalog Tool. Related checkboxes determine whether the results are listed in increasing or decreasing order. The Catalog Tool in <a href="#2masssort">Figure 4</a> is sorted on the "Jmag" column in decreasing order. </p> <div class="figure"> <div class="caption"><h3><a name="2masssort">Figure 4: 2MASS Sources Sorted by Decreasing Jmag</a></h3></div> <div><img alt="[The sources are sorted on the Jmag column in decreasing order.]" src="2masssort.png"></div> </div> <p> The "Filter" field in the Catalog Tool is used to filter out specific rows from the source matches. A filter is conditional expression that is evaluated for each row of the catalog. The column name must be referenced with a dollar sign in the expression, e.g. "$_RAJ2000". </p> <p> To select the sources with low Jmag values, the filter "$Jmag&lt;14" is used. Click the "Filter" button to update the Catalog Tool and the ds9 display. The results are shown in <a href="#jmag14">Figure 5</a>. </p> <div class="figure"> <div class="caption"><h3><a name="jmag14">Figure 5: Filtering 2MASS Sources: Jmag&lt;14</a></h3></div> <div><img alt="[33 sources are included in the filter.]" src="jmag14.png"></div> </div> <p> TCL expression syntax can be used to construct more complex filters. The filter "$Jmag&lt;14 || $Jmag&gt;16.5" uses the logical "OR" syntax ("||") to select any source with Jmag less than 14 or greater than 16.5, as shown in <a href="#jmagrange">Figure 6</a>. </p> <div class="figure"> <div class="caption"><h3><a name="jmagrange">Figure 6: Filtering 2MASS Sources: Jmag&lt;14 or Jmag&gt;16.5</a></h3></div> <div><img alt="[70 sources are included in the filter.]" src="jmagrange.png"></div> </div> <p> The uniformity of the symbols doesn't distinguish between the low-Jmag sources and the high-Jmag sources. The advanced symbol editing in the next section improves on this display. </p> <p> Before continuing the thread, clear the filter in the Catalog Tool so that all the sources are displayed. </p> <hr> </div> <div class="section"> <h2><a name="symbol">Specifying Symbols with Conditional Expressions</a></h2> <p> The advanced symbol editing in the Catalog Tool allows you to specify the shape, size, color, and text of each symbol based on catalog column values. </p> <p> Open the "Symbol Editor" from the "Symbol → Advanced..." menu in the Catalog Tool. A conditional statement, written in the TCL expression syntax, is entered in the "If" field. The styles that should be applied are set by the other fields (shape, color, text, etc.). </p> <p> First, define a rule that sets the sources with Jmag&lt;14 to be red boxcircle points. The completed form is shown in <a href="#editjmag14">Figure 7</a>. After clicking the "Apply" button, the ds9 display is updated (<a href="#editjmag14ds9">Figure 8</a>). </p> <div class="figure"> <div class="caption"><h3><a name="editjmag14">Figure 7: Symbol Editing: Jmag&lt;14 Rule</a></h3></div> <div><img alt="[The fields are set to display sources with Jmag&lt;14 as red boxpoints.]" src="editjmag14.png"></div> </div> <div class="figure"> <div class="caption"><h3><a name="editjmag14ds9">Figure 8: Symbol Editing: Jmag&lt;14 Sources Displayed</a></h3></div> <div><img alt="[The sources with Jmag&lt;14 are displayed as red boxpoints.]" src="editjmag14ds9.png"></div> </div> <p> The "Add" button in the Symbol Editor is used to create a new, empty form. The second rule is defined such that sources with Jmag&gt;16.5 will be cyan diamonds. After clicking the "Apply" button again, the ds9 display is as shown in <a href="#editjmagrange">Figure 9</a>. </p> <div class="figure"> <div class="caption"><h3><a name="editjmagrange">Figure 9: Symbol Editing: Jmag&gt;16.5 Sources Added</a></h3></div> <div><img alt="[The sources with Jmag&gt;16.5 are displayed as cyan diamonds.]" src="editjmagrange.png"></div> </div> <p> To edit an existing rule, highlight the rule in the Symbol Editor and adjust the parameters. In <a href="#addlabels">Figure 10</a>, both rules have been updated so that the Text field is set to "$Jmag". This <a href="#addlabelsds9">displays the Jmag column value next to the symbol (Figure 11)</a>. </p> <div class="figure"> <div class="caption"><h3><a name="addlabels">Figure 10: Symbol Editing: Rule to Add a Label</a></h3></div> <div><img alt="[The fields are set to label each source with its Jmag column value.]" src="addlabels.png"></div> </div> <div class="figure"> <div class="caption"><h3><a name="addlabelsds9">Figure 11: Symbol Editing: Jmag Labels Displayed</a></h3></div> <div><img alt="[Each source is labeled with its Jmag column value.]" src="addlabelsds9.png"></div> </div> <p> The ds9 Reference Manual has <a href="../../ref/catalog.html">further examples of symbol expressions</a>. </p> <p> The set of rules may be saved from the "File" menu in the Symbol Editor. The output for these rules looks like: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> condition shape color text size size2 units angle --------- ----- ----- ---- ---- ----- ----- ----- $Jmag&lt;14 boxcircle point red $Jmag physical $Jmag&gt;16.5 diamond point cyan $Jmag physical </pre></div> <p> The file can be loaded into a later ds9 session by opening the Symbol Editor and using the "File → Load" menu item. Note that the column names in the symbol rules may have to be updated in order to use them with a different catalog. </p> <hr> </div> <div class="section"> <h2><a name="save">Saving the Sources: Catalog Files and Region Files</a></h2> <p><strong>Saving a Catalog File</strong></p> <p> The contents of the Catalog Tool may be saved from the "File → Save" menu. If any filters are applied, the filtered output is saved in the catalog file. </p> <p> ds9 supports three catalog formats: VOTable, Starbase, and tab-separated file. If the catalog file will be loaded back into ds9 in the future, any of the three formats may be chosen. </p> <p><strong>Saving the Sources in a Region File</strong></p> <p> The sources may also be converted to a ds9 region file for use in data analysis, e.g. spectra extraction or calculating sources counts. </p> <p> Select "Copy to Regions" from the Catalog Tool "File" menu. Once the sources are converted to regions, individual ones may be selected and edited or deleted, if desired. Save the regions from the "Region → Save Regions..." menu. </p> <hr> </div> <div class="section"> <h2><a name="cite">Citing a Catalog in Publication</a></h2> <p> If you wish to use the source information in a publication, refer to the "Acknowledgment" item under the "File" menu in the Catalog Tool. For instance, the 2MASS acknowledgment reads: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> Acknowledgments for CDS This research has made use of the VizieR catalogue access tool, CDS, Strasbourg, France. VizieR is a joint effort of CDS (Centre de Données astronomiques de Strasbourg) and ESA-ESRIN (Information Systems Division). </pre></div> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">08 Jan 2010</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> ������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/jmag14.png�������������������������������������������������������������000644 �000765 �000000 �00000537254 11332127304 020210� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME! iP�� �IDATxwUO9LOwON0CaUWEtwUQLq5"`WQDQt0 COι+(l0 .]><TWuηyU眮) =#<qXƯ(pe} p8C46 7Ͽrrr`0rʶGy� �k@7w]d~yWcf(Ư9sDQT;o{{{񂂂n x<?0AHODMrV 񼘟kI|4u: 8�m>�2wK$En[4$Rb@Qx Iܕcg7J NI`$iБ67PeHG`"gOż\ #Hi71$?ؾ3 rO2k3q (sX{GU7"4ڌ&s,C#Jݍ D2v9^ R&mԓ"ecU:A \D*O26Ѿ@$syG:Y)ɳqXᄎ&Vc/A`dy~ñ%\^c1K@Q(t6u ^xAwZSL&`&E(.{縪ke8LՀ@(NSn/+pcLwDQEF=e1Ҟ0ËG:擿O��˲pxpc-<A,< ~&-˲$I[,~z B> a?:A~ Nte!өwwD)7v'%CMXldG rH87S0=@,dS[O22h$Z4݀I<c@іNo:YhkJ$JuMhlXfM'&p'dr;-b#,P(oho_DB8$vx1o{{ݑx,6Ds`@ЦG!G!Lj7wֺx<>~Hg,p=@(LL7@Z<pUaTX y6*+ la}͓Hǔ:[ckw$-rp@J@zE5=dbLjWsHG,+s}~ 0 DH[eRMGK,PSg,,0wtCaL&>4*wJ<[5zԪW*6Ñ](XhNO,.3I&cJuMX|\Qe#&pLo�$vzt*|hի†:{據O2> ,< Ç0aB:Vw*�� @ cƌaYV=VQ #0~;iҤzH@Pkoj V}6H: 65 �`�-z$G<J 3(!0dq#ˊMq)VDe . م %2A 3NdIh@mްìs;[4>e}M`(2&3yvnl0Ĉ= =:2nAFWwRP^$3@a&I;`ѓ9_)|reg)7`k?NjËs{éHi0 t7- SpM` :eeD/I%y wE]Vl8o <xWE`2͗|?^ci+`Ê{z2`.G ?:aEQ?*rZai ٍtӺ9+C¯J\UbLKJGoi;ƃmFUУ##<E`0 |YAN<^O5tM:bQaomĊ"G EÚ<A.vj| PUptBe^Q+K"cJ6Q}\i7hSn l҈ ^#-H,ŕS{ g7 t}ߤ#*K{z;}Tg 3,ݟP<LZp? Z di#0u^MK?/JK`2MOj>&��MnʞZ/xٴar7}gcKruH}V}:4#:^q]w]&U{;#f= pg_e)v!E i8 ' K7%WPfospx TK8@;.E9%�bqE m8(0�@WM+-# ͱT&RJd]E=h1PEAJ\XFP%N@ Mo6ЇB6#UkБx|Qm2W6H :hDrLtT7\0 .SO0gr% Pa0uZtVEO9;L p돲N۪CG}IinF$Q6Ȕ͜tvAG4tGrLtT7DeSQ/w[RJ: 5yf0"3ah9HsRM}i /m&Pgj sML- +ens 2I΁d]oԑa.t 4Q47xLt$ŗYҜLI?5\v7m,r:CD*#ͱaFFZ{c.nI+qzc8eJ]&A:y6IO ۍtaV&#A.so '<s<T~"#=vL:(t+ HH&X<O a(׀ hKoLI'̳N/Wr~AnĉX`yS?* jhh3f#o©@'FQ@cwh\^Q׮]fG{6~�8zrgOE5�v53 � Yi(u[??I)3"1Vs`.[[Βۯ<HȒ(%g /1f8 hl끾B;}Z @gQ`_j 9n ZqXZ 2EfNLJMt;,\K.+G<i3<1Mf_BV\'Rb?c01#*=T]GX'f֓v#Gȡ4q*ߔ`0S(((ϳS -6yl8*4Sb)u�q6x}wLON ܛxd)aLɟQvȉHt4{bfi7Gz09]t;a|S2#B=XO"|?q%P&G)/”!9wZ(#M4xbz wYt A M L0e+\Ay6ZG IG8T/AHq;bS 2y4xCc @ d'F`X]1JR7 %(#\=#=\3e]6]ko"cO V2H2ޟp[i{Fp&_B\'Ď <#+=T]GX'fՓ6#00G9N7…܈SLCH'0QfImӵX9*UhRiK據O>Ye3}}W=DyWoWVc8=?L$w=,+}�@Gb>3{pJ<>klո_ L*w4w'V7iO[$`d<�p *( U{slaicc4�j.!/>}J8{*Og<KNTG_/Y{m.$^:}W׿L1aQhŕL&6(1QXk?pY.]exQ\f2 /+2zB\4%ҜpIh�CbhjeL)3yN+13 FGR_˳R 05M}$qEC=iN'{4'7 ą@/Ӓ <!Ƭ',:!©;M2Xc^[hP1 grL$Mm vD%+lbݟ30>HQmPn`$4M} ) 3724"H_he3&=a- P ޛera8iLIԡ'ڍ ErF1%<0>ʾ(2S34,dS/+H`JayrH/HUy`R6Zp5hg9A\jjeҜ4C $Dbm@am #%Xa㋍]A.*dFE8$0m4J{V&3IVt)?[)X#~Fn}U` 8_C X|R_' 6q'`6Go887~o|R>ld6:zr0 :/,��`R79YrIݠH��ؒ=4>,3qNo `Nv9]h5F ~;I;PUCW,hxŠ#蜋s(G4_FPEz̢g98 a6)XG=O��j ]3?@ͥn] ɰL %`(<2Q�4Ɉ` Th#XQ 6=f֡}C9} A轝 /*4%2JqckIn()! /}ٞehDUc9HB쏋n AP[7Pۂ2 ʧve�.{*rIOIJg1m2Ev3�_u2*]Te"=ahnH)u{X&'찏MASb_Lt[pZD-!"zoGZRQ@E.oYf7}E*dm�hl!]p""\D#À)#q,Qѻ;҂ FL"{c˂ctR`yY{ zYF�doL $|+.)#țuÈf0#:Z;Ɏ eB;cz#0<@42rS}$FF1Rd'zYvwEGթdLHyV\P{7Ѩӄk>/tF z"M=#$9;)`1enK<Zg m^? I"qE=@T2/OO��*wa˦φA� & (aL!]>O"P= ?ȺHIWc κ6����e58 Af DgM ř.<%||o>!9lZH/IE%N)ٴk_0�[(gB{y-pK@eSr XAe rOѰˈ[>@PKV)�zbr&1ȀFko$|3rc(\`#R68{r F%(a$g>* [PZ ")+" F+M7=<fq@!%0`V=Q)88 ieDk=!pD*pS|q:8ǀ~ 3!|<=$"(aFH)DPGHr`3NfȀ )P H!F)"<Qmiij :UXpI Ir P) :tÀM$oBxy ,pGHL G?)�Am!ɩ:```I ηAP2ORjEtG$֓H}U}CPa|#L`p_6+۪H)U+%"3 APkP6zgi>'O9^:]2걃LmO��AO9_6>׃{wj:ne@4qU??_z('8*}]HGzG:?Ьs [`6 V;%GL/molo󆁶KH?~oogAù p*olj68oMt~gqBY(JKk|$Q۰bbDܽϗByHO@9:VD.g9Ji2K(nDbPsP6!)IPR ̀aVR`7eHI vΨ1śQTA$SJ �n )AS@PtA+,r*̮X8V,!o\q! l:R�䞸Q9J 30+HP_RVh 8rwTI K *m ) n )29 ӪKЈś� 4®Y8VJ@!oTq! +2=q HC!FFzJ"P9([(B搂!pQ))a <R M�ᖠCC4e z3d$hdM +!3+8uCMA9[Hd9BiXM(yl&!+ZB 諭7" nqH*F"psPӐI.UXp3Vru̓i>'ȋ|b�Iu;6s=6A�L,T^^Q?=}{r).Yym$DR$ΩH63<)d p8}8H`cCPL4#}85E3`OJ|_g e0/7%(~7@QP$ 0@(8,C&8eP�6a)S()Ij( ;M`1.6 iK!vJ$3֋\&8 sQ")@&>!iI0:crh-2eC/9B0"ni$A!_1ۣR!a$EFb#EU:+z9 sq"Ce&>!iI(:cZl &عK`kY8 "F\2r{�#' }),…F!#B)JJ4*wD1 V bSa|wKpOpHɥE V:(NZlQr!5JPa,On�E d%((`k$AOaa.4 H)VXDF#4CUҋ-V=JPn",O.�"z\rke05J Oc!.0y`# |ROa;G|}Cq!g~;5ci7?�WOc=zӓp.9ɬ'Mz⁵Ϲ`LEGN;m׮]Tj(S/ w/tǗ|-TxԐOF!rmӊ Ph.�؛sHFJ1ʀeFPXG#0s!C Ęg3 g0p=N1Յu:Tnf$"3I"C&)Aˣ9 ]I‚ yz!BQœ9Q\nbⴤbC&aQͧ3�{RxIXaLcR]W4x. `H#r1ӓ"3"TϤD4bn#PЙ ̸P #v)Q(E2h.C'E !LܡBȃ( Pb`"#i<MzaL]XAr1K30(THfL,4#3TaLgdHX88$a#M�� �IDAT\Z< Xn01�Pb2XG tI}iARjQFL,UK2 ɥLoHpSMs4'H&aJ2q hCaН$ c^I'LdE|v矿P"+2{luFOڣ(:e|o3~?l?UdR8h#Iq2G3a rb%NQv3`RcLoD'HDvљ8-M,<a%ǐ2C rK\gƅ\;6Ҩ2 Q= 7zDRi&),Ke`XiOVB]Ġ$'9$HD8,!\$+0[au(.:%ΣY?GxM1 {ӔHDjNBe'iaQ/M,f"ǒdm?1PIe#z nNRQLGI :SM0IsuQ=(n:EΣ@sGQ)3B.v$ M} <IH/C VZ: .PNIiͣ83b�IFf\ KsuU۞yΣ` qbaґބ0]T9N+~ xͲ"c\2JKQEe꿭4| �K8)JGGz'5E|2)bGO~Ih?q?#f q  _ן .&T4ē2ҝ;p,ӑ2@#>VR: GPyHҖ20Έm)#N"ai +bR:^#�etЖ4RhǘnF+H!1(A;9*̨GU@𱺄 G81DфrFkO1Xq)/OKX)st'hL$zYM$!t ,G֤B$t3zNAX?GG֟ Ȅ]ig)XlKu`δAV|2"^JB*, %8,%F7\{ʈ@HyY]JJhB<YJG"cun"CJQa|[H"H{=+aTl#p_'w6-e! cI D/ x 񔟣xFF=ށ38, 7c@:ZѪ/bI:B -e0c[SFr3V}'XT X:L ܙ60FĶ>ZAA Ʉ據OB>IE2rh ��TXXh"Y�(bv\TV�7TWFU X �)@8,I $)0 2A Ik/dd�EI%F! @PR, "+K @2ɼB@!`1#c?. dRx 8UvD* �D @!OF" '2aǗ !=*l%2O&r23(*V}VOW據OAs-:EQNlOf~x<n4) 8+"IO<:[nawqh8%|G\rI*ھ}(h Nwkq]8#M9heqJ8p@WWEQxHCCCCxZhhhhh2h!GCCCCC 9ZBƿ/P|>o}ٳg[nʔ)gy?߿{ۭn曒$7>={6�`ݺu\pQrOOƍ/aÆ�jkkK�@IIe]v qǎ~3gNNN/Vdg?vѡsssF'Vw$444|G1c?<d֭]]]z?_|o>�@ee3g>|xuu?//<j]t))۷̟?;wyg̘QYY^8��͛�xڎw]YYIeVTT\xC1~0ĒL&ֈr}];::{.dMkk|pWSSS+!bMMͧ~O?),,T$^v^xh4VTT_SSs!]SSs_~YSScZ!Բu֚lKG2lnnVEswT*IAQT\A\:<mz+**P;?<jӦM|kkk.\(h뮻mv7o|JqϞ=555fy޼yp'*--u\7o޼|r�_]SS ԫe[n=c=yjVTT466bCk˖-[xqNy֮];KRQQq۹4N 555jhioo?ȑ#555 &\|j<xꩧ֭[m.rQY{/ Caƌ4M|ͼy,X |7o�?~g pʔ)_I&y<gy'|*++Gp¦&QgΜym]pǏ'odzm۶'|_޳g^�5k ӧOg֬YsmLT* /Hm6⋢:_$>0lѢE$]zq|[V&bWWMMM>o„ ....,,<J'bs|K,ۦNzrDzw}o߾iw}^+..~W^u1co(j(9sԩSKJJ}YOիǎvW_} 5k֨ Ͽ\2Q?Nook;@ð9s|>㮽ڹs窖tzܹ@oqΜ9 I<8:󊊊6l0W_}5$Q]`A$꫗.]f͚~xʔ)=sӟ4mڴiӦ\7x?t8C]#rMA3gΔe3Lv7n 'N,**x<vgϞO>sϝ:ukׯ_t]v�:x@=Z|;SQQnݺ+V{t:[nݵkSO=5nܸ]v-]iEQ6ol4/ꫯ6 DbӦMgqɓ _-[IĆ;v8p Lz^Iꕰs/k 'u&~;v.ɓ's�HR^Wq;o��ALp8,b&v=+W_~MMȑ`0rrrN*pk;v}!OΝ;'NxEqO7n͛7oz;wL$_ի|u-]GON*X,ɤ^0eYAA`Y>HT7׌3ꪚ%Kܹ+;wnCCW_}饗ܹ[nI$W_}/x=<\r/zWv5qā+l6Ν;'xcǎ>-[>{}/^߇(pd2hAAʕ+?-[,X`ɒ%|>ڱc-ܲp†׻jժ]v >jj;vhoo3fL*:$~7>O=d2pX}ؼyEZϷm۶#F8wXoQ?Js^tE@@p��.+''g޼y//={ 1�׿[և~>o֭cǎl]vݻ[[[_yg}vժUپ\,IݻcF(W\qEeeo9qħ~ZmQF_)nǎuuu~પ;ww|߶} }饗5ڦE}v3NoMRn,ɓ'gۂO?W^ۏ>hmmm޽{{=dhjkkz>c6lx뭷Fc=8DwyuEt:M4:rȟSO=s;oÆ K.5k֭:xxoQYYdɒ:ʕ59vUV['uԡC֯_o.^nn=X�v}?YguO"߯nst1;x㍒Yfw}Eыnݚx9du;;niӦMC.s9gɒ%---/^RRxd2y=g}$ŋ{ws'N!jJ[[c=vbgڙg9k^z̙3�O?q_!2rȑ#G|fN쮻:}(L:;`fڴi݊6lʔ)^zq8;%9{<u{ϗ.]v $Æ :u%\2a„ʽf|C,O֭[[SS{Ν;w\axCx ̟?Ϟ4i҉)O8qݺu';0a¸qN[oU0O7999#G|]SS?) [nժUUUU y~gy+A6lx衇ۼwޭ[UUUƍy~ٲe ٹswy77. �w޽lٲ /pڴi{<uR{;::͛i!2k֬ضm[vh49O9?l&bĉ?p:> XL&裏,`H&ӟO<ގawܑݩ3f q>`ggz駟z뮻nڵ .\p)SNI555' FR6zhQ|u8NEEOK87o޼sjðOR& EQٜNՙrd0_~eccﯪ((*_hy睧vL0b0 q^_ZZ:lذO8WZf͚?'Nܶm@ H �h0'Ipsbۇ~f8qw}Wu/z=`0?;3<32 3cƌ:ZUU�ذaCKKKMM>}]w500'x^Ynlkuuu~3f̘1cFqq޽{/�B`j̘1խ�ƌSPPw⼼L&3mڴW_}'t\D"qg_gZٙu Vl8q_}k׮yjZ]]*))6<޺`�>kنx%K-[}ŋ?!??_ͨtڵ/ң>:2X,{4 j/Daa᭷0#<�RYYyg9ɓ';f1b$38#TmڴiΜ9 ,[1 {ՒDQZy|Yg9Λo9N'x38cz^/�`fpFyESNݷo:u�pw8Vo=jԨM6Xbsի7lP]]ᨮEUWWxCTUU/ž={��=ЬYfΜ?QW^)((x_}/r˖-˖-SgN?{7ضm۬Yn!fNUW^�\{_l? O>jԨy<pB�ڵkGU]]=bĈh GOQZZZ]]-ɪ*-Y}뭷z9s��~ߎ5;d2w�`͚5&M:G �2e 0'q Օ�iӦeKJJa S> �ظqr\.WuuuT/G~ f͊/bV'f󪬬TE$/.[lҥvڵk7o\]]z˗>|:gnպ^[lɶ/RCCCbfZ_}՟L:v0.'I54/ssyw~,^xaӦM~M>^!-[Ht%l߾;@"rm߾믿bW]u՘1cի{7|SBƿ6mRzugϞ9s'dk/o߾Bƿ';?F_ '{gSCCCCB 9ZBtz hhhhhh8tzB*߅EQn:00ƩC;3JNj gpX.<Whq Q_z|w$kh0aP~_A 9߃W_ƬƯ-hh!ׇ0LhEkoQWBίEQ+B<㸾>d~՞Nװlǽ.CNOOϋ/x[ne͚5o.4UV(zM7�DQTW�̟??''g* _}]v}wyϮ_YY9{^{M] qguV_~9g< <̌3=Olٲe?~4i%\jժ~�_>~lu8��6lpa�Z,._\M;4L}'| �?q"U~mu{ܸq3g|饗2mݦ9̿T*Z^^ϻT{)idpO9+W\p5\A-|/۶m[jԐ3+V<]w݊+n+N!��?=ʕ+xɓ'[u-]gijj?/<~x�+Cllȹٓwg)Yf˖->`ccʕ+|r>֭۲e7op 7xm0̔)Sヌ~8 .Zh/ROOC=|oZ`^[^^Aݻw۷brniӦ]zWnܸ1Lj!_n߳gχ~H( ((^Ze!RY+PןaX$�� (6 K,C)˲lSE NItAPEyA$IhyIQ%N<(ðzjZ ԝ Ag A,˞s9g}vyyQ18x=j^զEQUO?ۏ(:� Bl Uջ[u'ɲ|ى|͉+g5He_ğX6lشi��/BMM|K)FϿk=){͚5fYō70|5װ,Jo>[hz;w<\xDq8#I?wuu >|b+V_bE8k3fQRRR^^ T*|FY3f��u~>hwu_S4]PPpM7͝;A]v% >|gL6 QFe2.b:8СCeeeӦM۴i$I{驪?~|${zzԅkmiiIRs̹+/ŠIVX1wٳg H$fϞ}뭷f ̙ӳs{o�x<'nذA(C믿VW8EEq"Bfښ^NInՆ7+�� �IDATLm賍> {EQ j<հ!ژ0 A(J5;٣& jjQ5zm(QUz�aEQNѣyT*_P ]ݣ^DžlidCN6,?rcV^=Q38PQ��D"~Ykkk7lg J@ skfѢE_gɒ%&MzǍe˖O?`ǎ .\|yCCW_}ܹk0LAi:N/Y$oڴIW_mܸq_~租~_̲O<1cƌݻw+ ;0") &eJᚻZ囦hiYP.)nȾ0qt3Ès7<l3ssp)))7nܴiSDDL&w^a-CϞ=igg/[nذa.]xBpƍ?ӎ;t{}>,,{۷o߷o_xxx׮]aC1 773g:tB;uVBȌ3z9{@EY… /޸q͛7҄ bqLL̥Kd2Y```ff槟~jccc۬f!R) .f0, <ťNtst:@�u`d2lmmU*4 x rp\4 `IVnAt.]X,8txN.B7ZV߆xct:Fh4"bB%Qq� ,aƪ*W(K,tRHZ*==}…=z<y2D$˖-yf wj.\XQQԡC+V͛~zBH$ꫯݻw߲eK߾}w޽f͚CԫWA}cǎPJJJvgA 蘒һw襤-[DEEA/r/+FJUUշ~z?f2e/rNΝ?uTooo bccRSS;v=wߵbI <)8w-R0cAG m0;wܽ{~/:, <;8DSt:` D��$ 3i:`c lyaÆ}W*HN.*,j$$$BlbC:t(!յ{{3gKǏ?vVDV?ђ̞=֭[)))b8pWXqܹ8p1\.w̘1ƍo۷ogs?*jԩj~ҶmیJ)gϞ={6!7n\nݑ#G773gBvܵtq̙gϞV^Z^^'coo?{G~w~~~m| LZX I68Bs0i�9 `ڵkP, fp&A(By�v\hj;wN& T`l6N�FrVy y<cZZܹsޭ).. ݳg͛\L&Zѱ["ܼySTҠޛ7o vڕ޾}[(n۶écƌ!|'EEEHyxx 7o޼yԾSSSSSS:t￟={655uӦMɓ'wmȐ! Mjgnn͛7|~ r9Á}J҈9sܼySzyy9::wrr2 6 ޱcǝ;wlmm]\\LСCO6{{j]bcc}||zrNߊbBm6]paڴiӦMt߷z[d!-)/p1A@Va{HI`kj>ӠB%FfS*/p?� xD4@>5@>yiBP^^�$BT*!Awp\-Uհsn 9(ڠ�cd*�%8s3xΖt{D+!h24^XFF'6ݧLh!eRIihh`XH$}5kVUUUff\._|yΝO5$$ɓ/^YlYdd`8~X,4hPfffRRRVVVVVrKKK |>l=iҤݻ<y/ܹsKpR)É㏬=zYF"xI׮];t�o8p VkjjSPP6gg琐SNeee PXDYM/>}:++')))((ĉEEE3fx v…,[[/;333///>>ᕕ111ʕd2l111>>>EEE={6lX^^ T*޽{T~͙3ŋ]vr7nܘ={D"ʪ‰"͍&( DV!׏@(Mb1B icH^ba aM\?< :<N#3tFy3;;;�'6r|Z&MuoOCl|xU;6dM j - MgVdDܿ)c >kx<yzooow=zz\~СaÆYK.uֻ/ƍlYf͚jaΝ;׳gOgUSSs޽`I k":: ,) `Œ$%31 _�@(hB3l7:},X,{{{LT* sOCA"`0pus|W՚+(൷r0͔J8F:Cܿi݋dM;uTaaaLLJYcǎ͛7Ϫ>`?tП ))zC1{dI- ML&H0Az1I %^^ �3 r�",Al4HሐӃ d JO"OiLKo߾}F‹^rJSn&�<4 kF9Cs+vF'fӰ24St4NZ͙D"yIY0///꯮zO,Xs, CT"�]%9Xi ==�ZX7SQ1a N@P` 48y2r#Gbd0"Yɦ L,# ~-$љXsr+r VcBP u:T|p]Tt!T$[Cf؆ `ѰZX%AT,p8 _ 6 P.R44t:\n.=>Byr劭mۓTZ۶˗/hMH7Ta0H_FӒ`U1-*LCo00:d0 `0z@֮JB!JhH3 -$ܘL&Td ,& U! `Ao05zPXLx_ z&"et1 2Ht݋w |80B !ӓ1JsmLB(Ew\XNE|#koaRMoz̙3beeqG#dB6 VePEx$ D`zIYM~b wwwLЀ)8Ha\)ajK (61Xl6Fc+rln.Uj �kp!QKHHW4`ݴRBj XiH@lbrP} Oa%T7+X2'''9 Y5 ֛>,,DQ'D(`5Q€E €X'tDaX&* C@\,.7`0 P lR6qX,#b1.,,Dt:XGӵر`00z^,q0P" B b5`zdrX,X3}|,@լ5YjX`ʴ]$J v@3*tvc`!| ka,z>eyX(QT<Pe�pj@;˕H=@lcooЀ-Z U(Bq׺ MZ=\F-V7lۂ<TT&RRR@E/R|@믿-]jjjVZ5tPny-;;GBBF`6l ̟?-,,ܸqѣCBB.\Or\ІINNq,qgѾʹX'-p(3@49b 4Ǖ+Wڷo ۈFP~}CC ZΣAMǦJϖ1mG`zۑ3b6G0Æ%- ޤ.] NLLP;wD*!$((hI&Jwܙ P v<~ǟ8q knƌ7n@Yv?7_߹s۷u:Ν;Ə?z蜜e˖X՞Xc0`4`ł"` ސ3v;\?0@f!a�j匠ht:|4iH qH}rznnn�j?jZ&1 P8dZ:Np? G$<0RZ~,䅧NzW^yeĉs9r$!WVVΟ?ݻ)))qqq۶m޽{llY^^>dȐ^z%&&666[= Y|yqq1LogrrC.]p j\\\``ٳ F׮]{葑 yVkyLvݪ*^_YY K$Tƴ4666Xǔt@d`VR"A  %JAd0kY\!DQ556$PEk@@Ý======9TG9d2A~Rb:2EϚk0(^'f@4A>2LPfk.H2}މLwk6f4'fQW^0a $ŋxLdɒ;w;wܽ{V---)ӧOի׳MOOߵkhڴiSjj_~_[[[UUEkӝ9s+w:uլĢ@B " :Mjm1;@b51FZ2 zBC `|^:O:H2k*AhoZxnBP(u)&&ZVVvY,54B>=SuM1ҙ&0DQ}EpP818U/!Uj5f0aY;f׳gO=Z^^@?ug7_7&''oݺT;׭[7tPԗ<sLVVւ $ *[ׯwjOr)Py = tb>Jr! 9v>Hd>i25]N9[% ' p8>ܥK]u^sttTJAAA}}=rpTwh@%SĻ/k{ƶ``HBBB&O<i$;;LKv6= /�$%%}gǎ RRRBH~~>!F:t?m۶m޼UڿfH4HillT(P-mFqun3LP1 O8Z�!( &6vIrfzW)ʊ TفH Dڂ`%\\.JJ4B}ReKX'< g퉉<O"lٲ~!۷O,t:f}}}!c;nܸx___{{ܫW~׻v)))9sulllUZZ*׭[{K2 ^xq-:qDNNΥKjjjwnYߊr�E`� ՀAXb*6]B4U7q'��jKC诩nl@K�`JtR&Y]]|r|;!Hd�V\:m1 Pm4yb*,ÐHfvMSa#|ʦ,̛t:u WAmBaTW n D-LjQ3bJuBg}T*L[[[ꫯX';88ٳoٻwѣ.] 8==Q;v$'' L2CoDDF߹s >~cvL/^x޽XˉussB=(  s0134%%԰tT*q4v5S �T &|8"-ɩ>;;g(HJ@B yzCÌ1V{r5BѣGkךݲ{F/M2h=z~j j++ߦ»azƎkYIF91Ӆ*jFBa8_ aMO :qLy%el>&RF3} ƍHJj�g+Ȥab fCXro>P=4X/ܹ?ʑYjOa$Ych6P1|GJc>dX,Ŷx uc2�,P_?[^<|wrrt:S«�*3(R7pi8�ӌ$ Z q́F1̓+Z4T* W+q8[Bi2 4:gNNt%3"ѧ:\ \Gn |rBCC·L^՞|3\*|3e=�\(c՟&N @2VAFx<wwAWr \Va@A;8{*c΍dx<\NxapI3l ޲d67!X�&WMhaޏ0AKf.YZYY5kgB´\ZxXeAKZ SBqU=.�0(jPX`?w.?)I;8d`uADE4�KH&X$籴 w]zJkm.^,rD"ѳUZZK S:hX )Hz 4F3@x'obt͟Pc0 t0 7H5aZ13&A @T$MMf|@-GaYsQLefJ-KiF%RlxLoVȱd]tiۤ2A'=? ?ka2nnn%%% r$`Z2){\f+/r'l2)' -*5�{#sEq"(=V#GDG/A;~d? 2Z)0+<ufgg׶+Gnll~m k^XC}%X'KEE&MڶmT Z eĐ1իW/]RsJ?!_=9Q5@ P*(�o�  ZpbBSfMYjV{hö|gD8�ۀ߶m M.0h@$34Y,Ӝ2J焔hL& KD E:%|~}}=i"G/�8 s�`РTPz<LsZo% fkn3=-D0t50LS 7% $QY!֭:ujXXn#,X0d.�� �IDATH;vdeeBP(͛/ج_>==9sB.\9sZIn =d"t/< Ȅ d26L 0$XA;\̻4jA�+pc 7H�6~ѕ݌hߘQĬ`s2L XcA 77φ43I,2(hJ9~gH4rH6]TTO?849dN' A83$K>55uڵ6mYp]=RSS'No2s͙3g…={?~;wN8wm۶mԨQ'OtrrI=3Tqhe X�Zbtٰ%FB�s\t �:A #hcWlzS 9lp\ 24I`LpBu@ذe<ocs|7r<>>~ݺuӧOBBBttu�T!SNa 6xzzmܸ1***!!!,,ֻ͛<rׯ;99 B>K/꫕r=<<֭[&MZjեKriG6\D;:::88,LVHO Rf͆�56@s`lt:}^agB)ڐA@4=sN /E 04F謣hvQo:*COin"so9e~dM@Yy><qO>f}رc>hVZe̓>}bCƍ9zy󒒒`͛7>|SK.ɤm55gvvvPhccZp$Mp:F3! ma}2Y,V&3IK./aă 4z�u! Z \渌Fc42xol6[ גZBP(oZ'F5j<ҥ믿dɒS޺u=x`~~q;w3g/rMLLt… __#Gf5;;bda p'؈ ݬ(f`> =`0!bhb6qO؛lZ!flC � mggwI'!aaa}QLL7޽{{=sq~X~{cǎXzjuCCU~Wg̘aYddK/T^^~ dddݻ:jQh4QPhĴ'D*l6ѢXA4"Mn| F$@nWJ\& f{6ԟ0$8t�$mCmBbBT*X|j'Zj[?nɓGqrrb2%%%vvv/_ưd㏄.PRRرc}]NNO<YUUիW/GGGX|ڵg:99y{{'O<y59fzJgEw4Ex`|C0Jv rt"CL@#jXR֭r9f0Bwm@ HdؠPB, ZY9V+H OB]lD# VF ک42<ig:(]iNS*J$$S<'[gzJXC' ԱcGx;p8}\ovTTԀ,?̎;ӧ/X6lF%]_~}322BCC~mGGM68q+V3f ҥKFFwޭNA~hd'iBX4=D"A7@?ah_l4<j1Q (t %":uFT4ꔔЃs4K(2D@(!d�3$[0�9#F;wW{9BH׮]?C5xF(&&&&&YjzT[[�KoBp}M$0a2* P Fl(+}Buo,0As<ˈovTcx<\#�8ld̙[lƲB,v&)vX3XjV{`c =- #:T: c@Sa6B8}b6l]\J(x' 0`B< xcPPPnn.M]۷olhL'6EX1R+Ff:[h 2"-F"L>1b4m+++kkq@Lc4L" #Jt480 @!0 t@򪬌f۷w˫3`Z(`:Cu5 S�Zl%#0{`tM=r }nf/H5ForvjG <5>mHS3?!DP`/ThU^)a "^d<-Bg8 9؋D8)7ȑC, 8`Z�$0js6lO~r\RWW0Om��F`Q7�L"M0F*7Pb988HRD<l6QB܀oA0 jĮOB (AxkA 2pit"]V,%HY<40e*gےu L_tQlr[ppp۞!@氢o%YOs2* okn@ϖi2>/R)ME<D#+ |6BJ(R B�4vѱˀl֡+DZÏ .h//ac|&"j=l>Ot6Тf~] H m׎;ƞ 6|'z'`diXnGDSC 6Apfȑ耰k0(!`|>ruu999yxxCWI1:D+nX`a )Nhp.KkY5f ޲ސٰ˸:%*ܣV ä`عs'FWt:X,...Fj qmmm]]]uѣETRQѡ;vQ*6r0 =:BS `-d< �nH|r_H$W\ !6mvڶm<#F§m[QQŋ'N8p@Bo磏>ܶmɓ' !?~<!ƍ+W={vdd$e^^'|B/~~_MLLn7|鄐:''gPNXf !dŊ'ٺаu[֭[pb;v8qDJJ %7ST'O;i_t dǎl۶m4^={GW/_~i2o8e 0kއfW@2T},JfAP( puu޽{HH˧N:<0lvuu5哦քfRJ 9؇(ČK Fy %H!Fx-�2! OZ&g r֝ir>aÆdZ/nߪꜜ3g8p]v"ܹs/\pXBȝ;w-Z4yaÆٓf/[ z=bŊoV*׮]srTp|O:uРA3fXfM>}z?zӧ H$'N 0`ٲeʱcN:uĉL&sJKK6m?ܺ7ATVV>sEsδiӊᙥKܹҥK~ ?.쪫7|sƌ ν{iuu5HU9sb2''WW+VL>W__`5_;{ 0@~_|Lay χ>%I0!_̝7NV3a۳Guu^`T @ngg׮]ĝwtt|X,:D" ( 3N1\Aj�Oky݆dJrs \x/^>&pL~`BVT{6kw7)))%%eΝ!!!6lxw***z=Sh'OT(;wnlllhh�M6]~o߾𯯯/!d</!!A.|L&wJҸ?rQPPg0E"H$*//_d{G)SX,ֈ#˜Lfǎ\nǎg͚5{lTZ\\8xwcǎ}_{>}}}333,XsNxӓ啕˗/<x֭ׯˋСCffI~walllCCC322˼<___>+W466ҒΝuI{{{{{ׯ駟}`=e2ʰlC<` 5 (A%zv ^z:y- 8@Ivs/\ә]vaaa!!!b]vP%U*dVW2�^_]]|-\Z^Tп;D?BOZ2|".Dk1 =t Ik x<f6h ̇65m:X2Y�YFʕ+jkk===7o޼gYYIa 9FWm=0-�9rȽ{:v8fX\ߎ tiѢE3gΤ}O~zcbb:uꔗhc֎;6o޼˗O82i${h"{{{BHEEEvv^ܹ3{n___7_=,,,;;~YtX,.))p8u?6o7S._|?O||<|Zݼ|~vvvQQ7XhQ``ԩSkjjެZ3\]]-Zt޽_rÆ ;wnll֭ѻL={zsB 0@pG+ ` VgyA#̜)ru11-!u_f+]\8=<*/`02sWU پ1FєA hL`'i2 BDP(KY*BKAb5~q<NY%01sF۠(tTNC%lL|pi?<y W@f'dGoĐLuLI-}?xyyG   <8""SN/&TUU%%%:uꩅqŊ߱cGlloZ{HLL3g @!FX�oBHddddddJJ_{5BȮ]BBB '!!(ʍ7N>^rY><te˖=z4999((qLLvҥ} 4hُ 9EEE .)))F_ŋo߾=11[@@�vmrfΜ 3s]tYx vڅN§0rgr .n+\CTQ]]d2a<3\OA!/=/_I*f߸e2u=z0 i$44n߶"Qgsgt:&!ꪪ*;KԲڮv]KJ^4( !@jLh5 /!L GAhXe;3r8*#ݠ[5=g5iҤ{d)S$%%"##]]] g =nܸ1iҤ L6"Rť֖.A#.I*++E"Ѽy`>W^_tq^z;١C?#BZqppwrrJNNqee%6m$ .7(JS555l6YɊ'<`Z1ᥦkGYAV,h}}^?za00ΜD//ys+qgOV*tU*dNN>;G TY[;mkjj;3 e!s`":awFrZ-B7ap7!![ P@yP];/! 9};L( v>%ɚ5kT*P(ΡvYöncj\.w޼yL&3!!a…gϞquu}9V?#66`0߹swpZ;v 1bKLL<}\.P1o?<}z}hh(!d֬Y-[eeeAAA|s zyƍt@\TTh.\�zddUUUonhh=zn߾}sDk׮DltnBYYYTTٷ0{F2 kAAEJKKϟ_]] кu6nܘoKp' !cǎ~և%LJipN={L\^ܺ:u밍prZͮg@ ppx<BQUUR:uT]]d2۷o_WW;v񊋋\{Et: qkYL6zl9!/ga;i$ ^0/;@{X4Y_aa{#F6L-[ 8DLx�B]C~YCi'}ʔ)&??b0Ѯxݻwӧ!x<CBBBiiiCCk4}]~Ʀeeeͭ H$Сܹ3 yW;uTTT'N#طo_L&+66vUUUQQQχB0::zԨQ:}/ԩS>}/әLoMM <oIԒ;�~ȑF?#{n׮][B̈́=wvػwoGG?S$~~~LHH|T'>rHOOB6=}.]|b|||^xᅨ(NNzb޽۽{POPH$[nSZP(W x`0LV:QZʆ7ҾBcvwbTZ[[[WWwĉcǎWUU*Oc4 &3yl6f"�]>nݺa"??]vHlUin1VP?Rm EiCs"t 56WiӦ{{{w=zz\~!CU;uꔭmHHȕ+W>#tR.]pVãGnll|WWWgggBg9vر_~COرcBxέ޽{ܹsSh^AN'�.5k>Y,GBVqss vppΖ@ohh(...--:,n8<)=p!!Ju 0knѣG%:`1P\.fjx<5EQ󅅅111*J$566H}�=\\\Gz&Қi?y3@ e F> BZz SlR)6X!dx�� �IDATD064i}µ@)iG.���Ja?P(ĐQvfu4kA~ c�!4jFf$d0i:Am9fS9C!w%`ii֊ZzRjfZDj!~ lcנ WwPIn A J߾}$***JKKkkkKKK%Icc#xI9|tjEu%(`83L|~ k9?~+V\#H oCdi%myqVȱğnކkVwxt?<5`8YPB>^l"�BhYYai"J)Wq X|kĕ^ 0%;{|f3''er w ߿/PڄӴ*3,I\ (5�'� #HRBQ__d2AKJJ`X, sVK8p8Glc01nP !E2("g<fbٔ�< ٞS܌vEW_zl3VPPp^}ѱ9q+ZnnSXWouؠ o(c�p\(C=>?=c `'<VR)888b>,Fcgg |6A4s} &J#:+9GPT(PC1hފf CxD535X!njtض=k-7FL>rΪ]vO-b tH(B ca +5y�@��KKK\@ `X*{{{�1 AV$ p5nI(**ŭIw 8V0IԩSG~2m81 gΜyW36%NпC$ 8w,r�86�J"j6%%%ZIRIҺ:P �S^( `AZs3B;O"j�7jxHFQQpaI K{31JS ,XP礅 ,7贜ieYrx<f`200*$#G - a0ll 466iV " BvЅ<(@ h�N^R+,, T*B�PD4BU44"I~8mt&,i9(r;ybn^!r,iy`>ٗ/^(bcc###'O4Xe/_.X O>SNX,Fiֲz+:::**wޑJo֭[lll@@3g իß{Z|={bccccc#333/\׮]`hX܊C***bMcǎbZӬU*...66w۶mkhhm2??1cH$ &DDD,YmSQQѧO؞={ݻ 3k֬ڂ�ƌ&JIm1R\3H)lUCCC]]]}}B* %˕JecccMMMqqqmmmYYYmmmmmL&4(I#WC }?JɩT*�%%a僓jnLtO?4!!UUU:uO>ڵk@@J:rHn`DTTݜ9szaBĸ]p"T*X"+447o֭ۉ'lllbqŋ/..<xpxx8Ly9|ԩSnjgܹٲe|�}7x Rz'N8;;ܹs֬Yf9rرc\jo߾i&// N:ܺG9tP.]nݺuŋfffB.\0y^z={fO#GĹDohhgΜ=sɓ322@Pc tfHԾ}z\P\ec%M\hLZccH$5РVagqqH$R(\.22L*T*zTiGx jBqT]T*� P[ Ě)lf _>BSFb=ݕ@>U ӉXS*[nzWZ5eʔ 444L2e…+W9sfFFƁ,Y2eʔ> ++O>1c:jժDe˖'/f͚E͛7/<<~Xv/غ�͛7_r%22$$IRR{aÆׯ/]Ν;3fm>裁 ;spp3gΘ1cƌӽ{w�VnM<yOKK9r$AB P(ӯ_h[~@ rڪ�*@yiw9p�x.̧A%,ә.,߇SMM м)JlvxxxVVmܹsAArH v|ⅧJϟRdCDq˦ e35< r2 7'T=&g9lذ{ocÇ:z^_|Ϟ=`1c9r?>}:):x ˝3gNRRҔ)SfϞv9s4660'f666+VԩSRRƍ[oТ KKK7lpaÆ04QF۷4hs?/ӧϨQ/_>yHhƏzj=p'O_1c7mڄc 6/2x< Z C]]]\\ FO7m0yπ?H7T&-p B*8�( ]rE"@bV"&BCC=u<0vN7`a$h vo"R+cy-<k֬{mݺ(Xp8rի;v8}ݻg b8::]vmС&>>j|}}t^zѣ222ի{ma7̕+W1ixxF&999mܸ~ǎ;!***Ν;Wڵ'KJJ |7nܽ{9Ғx޽{uuu#j{ HPeRT+Wt l`2C "�l�OTy<F: dҴZRTJR.K$d [ZZ i=8hMM VepfΜ B�'c 3U*0uY6hǧfLKFSV6OιlmmmmmͪGDD̜9s…jfm]t)///99kΜ90g߽{wSND'i} pBhhرcoܸѺsǏ_xB~ȑӧOC4Mbat'+++ $m=OsŊnڱc~rrrsȑݻw p+vJJJn޼Qx6� @&M0!Z. a4Qo<�t:PR`T*U*R1;1RQ(4M~ݲe l0jˇd >xbH�7%�-P) 5LY-3\dx FnOBW,4iͮnnP袿0O%5J~RSS#F &ʼn'&&&.Yٳ!!!OHHHKK+--6mZzzUV@yɒ%AAA-)�ܠu Zr5k ><77w̙0;uꔟߠA!/޽{tt40`P!ݻ~o߾={lBHjj͛7;?k%Ky߿B֮]kggG;v.\8nܸ%K?~„ 'NHKKKMMauh~ J^%� PQîat@2`Q0htR[y0M;i}ps+w4P(ˑ`)85;`tc66p|}}Eܪphݻ_|]vfСݺu iii^^^nnnZvС+W}6!$((f굮%''cWWW8=D``m�;t }}}AmС!!!|>ݺu h8eP!۵kTS.]*J* :t(m4i /8˗?>Ǎ ZNnnn"(--ӳcǎwR DEE0OOnc/-0%r96P4qɆt5I.UJ%c"7FtAlj8ج Є8=nN. L!G$EFF*dO?477wڵQFÝ. !......F<1O=1d$֭QOɪucDw 1;dӈk/q w &yP.y666 t䁣zJBTCNK M 4a s�j)Դ�~Maot '&$"\K*Hɑfe$G0ܙ=zfL7%g{+,,ڽ{ V]`PTE� n .P@1eh2@]gCxA 0##iP�3ؿB(=[\* l(<t-̵Xmm\x ˡ)[l#/i\^K/HS#؀;B6(êj8�EpgP E%04Ҥ* 5$gg皚ĦT$a48K^i̓x2$x'9S|Cm^}sPC 3 c�'3P8f86qJ ^`4i"t!6Iѭ8wRjJ3u$,,P2btǥ2т=Otp5}Φ(4JwF7ӆY+222<T~6<�멝r𯓓Suu5j$@LA(-jl@]<)j 8$PK 9VB!p�iPf0<俵5BfQ4lD6?}''ftFKLByk"XBp`0?=+J>D[\!l×0U~zBA#02 w0ɆcAE I(lI?j#ߚiMYϲ^ٳg[]ɴ9Ry^hp M�`d2]\\4Mmm-p'8tF## <MA &!3`ȉ*mHIHKT"73 Ĭh@Lr FX̲h65 7}ubVȱլfGf @P[[ /8( f^^*Dx ";88T rw:�zR,cHsFN@}BpvR~_?TPzVf[9k-�-,, nku6iYYY...o?@l-,))qqqiuǚqEEE7ߔH$b866Rtɒ%zׯߐ!C***8/'44_;w۩S .༜}|֝,//wqqƬ#GtVby~zy1bĈ谰y544{ aLKKKnnnSL)// BTVWW+ }=$^y777!M/B<L&3�BPk߾=tC4z pJs\ȑy^^^ЫE&dC7\nn`o�KXXXAZZZEEErrrrrrMM <(,,$¿L?CqqqrrrIIL&Kn*2x\^~SjjMwرiӦfffڴi/_/.]zs}W7x#333---...00~fff^MֿQFuaZ6@Я_l333;tкG훙9s̏>.Ŋqqq999OwMku{:.33sܸq޻dr&b@>Ztxպ ={~@`o>,, "i.Z�RD=U1dI+**c}vY5@uR̼!!⁵zhvs-kM S>ŀ[<7ᝅdzćNZ*..'99?ƍu:݋/l2D흘8~_ݷoѣG/\0iҤm۶ݾ}{ŊOɏpŊK.7o^Ϟ==ٻ*9l*[++j,12R@Mu+H5WjYZ#g@q ^?Xٹy=/tRh߾}?3gtA�0W_M8駟3gιsFĻ|g/rΝk%==={zjŊSNNЯ_~]vm͡_Sѹ]te˖uabKF!x׷lʕ zʛ/[[+W$%%kpRfFodFsuuׯ޽{](�@y‡Mlݝ % L8'͒hil̓Y#(;.\4!"eZQ^;wFDDlr߾}&i„ -P(ONII Bm۶GDDԬYs֭L:g]jղeJ�zѭ[ .\z5&&̙3]tٻw<;tжmۆkժտի/teر^^^SL)ŤAN8n߾}~J+&={bƍ{-R@+V72%<4T8�6  4pzM||<7,$sCv<Q̧Ë/n~o&=N xIet:7ݑd?:8 kfXK8y$uOOOEJU^=;wʢf7|0tk׮҇4iҨQ{eee5k,%%_}HIS^^^͚5HJJ+*,Z^z[n-jv|r/HOOΦvA5j޾};??[  دAB"?TpSp!j Pf"X,ƍS .+JiX<<<@R*^^^THX,qqqZV @\ -3P�GifYs?</؋&ʼCOL/G,'??ܸq۷o/ ~Wn_ڷoĉ{UqNիcbb.\o߾W^y%<<:%/^\z5O?ڵq={!h モO8qoݺd\{n\\\ǎ[իW}^yb@=y�L$tQjX zk0M,u._^wU*UÆ iDRq"ӐC?vȯ�� �IDATxDžk4ҁ$-q'ƺ[}$g2 ~2@6(VX(ZĘ_=$fff0`Ŋ͛7oڴ b̘1#G8?o֬=z>gϞ~};jĉ'N <uԘ1c6lأGիWڵI&<f͚SOuuŊBҫrss͛׹s/JɣGeȑĉ\e˖˗WR̚5T^}ԨQǏ4h|0rӧO2߳gϏ?D}%8K^6.41iii ,8s(tv=..vX uD3s(ѼT,iӦUV@@�miF% ܹs:u&NH(Ұa×^zJ*}1 7nX|9|*2` UdӦMhYZ~U&˗Sr5jԩS hܸZ^`vww[bÆ cܹ<J2W^_Kxdd!C_//$nwuu=p@jժUi&2ԭ[WѴo_~Փ �y2<899yyyQ7[`|(>  Vݹs'PQnB04. \@03ndZmxquu%}pTB4{nڵSN]lٕ+WjԨRʲ|*.A֪UVZ\|+Yt`MAV^cH(x$I|A`K%A䞞EwVHPR5k^z&)QXgEC.J|HSAN4(ņLz*O^% yuwh F6"@ovuu%  РpZ:Nu cTPX(B5PXؠ}0APVK(4͒dRPhsNq?P$%Y}eB RK8 O?407QBѢiܔJeNNhD/ǐ'%%X# 8hLD$(,Mw~64MPtGy<,';S"`09dŧPJ_Nj7HA /ÅwF2${"֙F3ؾ~:<7l"6x B#q@֦z91^ -Qcǰ'l6[͟Z*٩TȄ*Wd&1`DdI3�djC�rh<8YF!@!*/$琏ݻwa*#h dCASFŝ<x$Q,C°V4ԸشӢ hAb%o\%|~3R(׺r<mڴ)OXvr,;0OȢE :Pn&& 0IT*U*WNzd"Xx֫?pƌ(HCz"; #PM;Xx0U-ګMR~pыŞhUPK5rΝ;WV ^~Ae/"/HII]v# K5go6M'~Rf 3M�AQ5\C(kEn$RfΜ;4*ZMEkxJPE6c!EhA(-f( Z9/'..AeiyRWn<yt@ÀfTLd`FLs AyMQW**�)2dpS*:$77~kx;??$VΙ\ZC+_5~DžEQ/K<?]l9NK IW?x`r`�e-NcAR,3o6F1br9L%ERa`$<>%nHVQ t3C=@u2oo4 IaP f@g`5.:ΛT Lֺu'Ng`~h�I,5m@UAAhT`0'r}?9^ŋjc9H==-HRp۷ojժ=C y饗~w>fsp!ٳz3f̨hf;vlիWONN?N0C=z޽͛7/]Լy֭[/^X.^u͛7tRi˭Zڵ+5Kxww>ܤIMn߾ҥK[jt^{^ررcssso޴i&M>| f9T(=HۀB=@ dv^gpxWPHi�'t 7+( ?#O."bo2I"G9Ê^ڼo'JQ[ǰ6vؐ!ę3g˷z~h֬Y^^ޕ+W͛7~VZс{AAAk׾vΝ;pjjjjզLb6_x͛7:RvAY֭[m۶ݳgQf͚i`0Y?+++---##uԩ\'Ѯ4X֭[t̙+WZcǎ[zKf;>䓙3gvi̙'N?~|FfϞvRņ>]vz裏֯_wر~yxx:u-Ahqqq'NBԫW[ne#FxlErrrM6~'>S3g|g.]_۱cUVsĈ4'HcP#`I0 AeBșhib!M:99{, )e@8U6p" f=0eCiyDQ5hq+!`Sˊsk:tД)SۤIV;tQF-]t޼yJ@@@ttS^~[رcɒ%~a*Uw>uTVƋ??`'N _ry-[b35j_|w9rdĈ111Ν 1cF~Jرc֭;mڴGexҕʹsT|!z޽ǎ۰aý{ƌӳg {=}#Fٮ])Slذa#G|饗jԨ1fֽ{w4Wqfl΢PBZLfلLmv(`3ȐPQ {L\.Y>bZ* L$ Dr0hM&[ IO!g j m.csn*b4! o'%k1zWK YēQrgQ_,~`9M`ex5tl]3o޼aÆB,j:rȢERSSF˗ΝyC}WW\O><a„ȣGJz<ɓ' }̙3WXѹsKt=555**͛ӧ϶mXnf͚M0A&gʔ).%K.ݸqC !cccCBBΝ;7~իoذ޾};11122I&'NpႃT,SƮ]JF G>B!‰z ?Ym6Zm1f ܄LB^yJdRv!ofbe2J ~ժP*eBPBPT&QLDU+Ce\ؤQYr+vhS>'amҥB;w֯_?55u̘1D+:t駟.ڞO<}}}=OJ ]֨Qɓ' !֭띝<b>J*kϱ y"wlB;6L'VŢP(J%%^ mr J8B&SfSHVb*]  k*e6[͚5 y/̦Pd?Ne2r QLjU-м92! ܓ ֢}$~ʐ$E1@0b_Jư~8tӧ\oaaaG^|9'Fɻw;V>:~?I wqFb.\XlYLL $ j6Zl ƍ^1c󟯿~;'O;vW_u0vQ^L$ *r V9y4T_AAsprCᏁ xQ$=El/UTA' O<Q46أB q~@bQb }X|^b#rH謬b6lئM=rJh~XZݦM]>0,W_}ՠA/ԭ[u֓'O-[2eʔ)S _ 6l{뭷bbb6m3+//ɓ pe˖K.)aÆﰟy=z=zXhի޽wrSL0a AN8A[|ٳg1b۶m2|p//;v=:33388g2eJTTԠA.^8'4j_ҌےPL77;V>Ql:n۶m ԪURڵk7)--Eqqq^ݻwFVVVvvv:u @T*A&33iCnz*eX ozud2ݹsWV߸qۻRJׯ_h4_ɓ'5jQRjբ|4NWn]ZUƍ$jZZ=R_?n!s5z۷zO?=~BWWWI]v륗 j׋3;;;++ WΝ;Tcl6ˊ+aw\deejJ DI;w|뭷ʦTǓTd2ڵkȑr4 xyyyyyFC"oG,->>>>>>=LV10R=J4EG(YUXn!D||SOy{{\.YJ*N&tRTn,U}!dž>ߐ] ņ f͚-ZH՞8qb֬Y5qH਱v_8tٟ$!C:txԧzo(8S P΋/d,QWN:=85p<&PߏG.]<e VkE\�TD#ɞbp rv={+�8(ApssCӟ k͚5+@@9/0D3BAP_BXV1Q=R\ JJE`QO,/K,X,lWWW777Q~<lV+`ϷZj233xFcAAFP{GT*Ҏ9Rl>vBʕ5k"\V&VKI=<<* ɡeŐ5uuuuE"4|l6#477ٳTLl™3g|}}VQJTRvmR&CT!뽖ܹs-Zp=ڬY3!D:uZhQTWWW:w:Q[ŔX~ (I�ju *鈋kҤI*Uʞ'Nԯ_;RA�8e�8(#xBkkӦͱcիWl츸{e˖gΜܹs `~~~O?tosrrjԨѴiӊvzJ*p3q&c-K۶m+`N8a0^|ŊbA \v-99}p޽͛UZΖ-[|ݻRl2ĐÇ?>99Yp( 8u͛7~ׁ?~ƍSRR?}999lǃiӦ7 f#G+|y!n�_Zζm"##333vSO=߿uذaT~„ pS !T*՚5kK.{膋/V\y۶mǎ+((7oĉKv ={v ۷lٲ9s搟_I~Сm۶ ޽{XXرc=<<MdɒӧOXcƌuVNN[߾}gϞ=};* ʻڵ'OA+9gj:lذ_pa֬YB$@'&&WZ5//{ԩCY9|pjժ-om&h۶~( 3fpqqپ}Z޽{nݖ-[&X~})-O>- y7GA?Xeݺu۷oB|\jݻ;wt|/A[6xzz~7o&S) rƌ:.((d6|Zj5lpƍg zhhիW322~BӧOϟ?ر6lX޽{5dȐƍ=z޼ygϞBݻFW^]zM o:GGGd͚57oW_Qqi9]t puu:tիWw܉aÆ۷/**^zz+%V[n>>>QQQIII[f͜9s}]V<~8dPVVovٜpQ^sO:믿jժջロw ^Oj;є-[vQ1zԝ;wv->>_tt?hРiӦ?~|TTkռy'$$kիW(=s…ʕ+:u*777---///???---))ԩSѡ+**jϟ߹sCBBF9wUV%$$DEEUZW_̜5kh믷ou֭z4dɒ%QQQo9w'N ! ݻp?pΜ9$u !~)SDDD 2dƌ}i G&)**J 4(66v̘1o֘1c>˗m۷o ;jժC9s4º85y3g u:믿A;wz<X ׮]o>nݺF\^^Çt:Ν;/_ׯ/\p…3fx7fϞ}ԩW_}d2}GBR!FMt(;۷o999={,SÚFdS#F1>>ݻ٥sEE^z}͚5.\o?~ڴiӧOgR&)>>͛roYv֭[!l߾}Æ :...B4"jܸqBBɓ'׬Yj/^MY~~sVV{nnbJOO_͛SGz u\ w2lAz{{W\`0t,ŅJl6;J)իwwuu]~}˖-333u֭[ץKulD^O[ItIII/^K\GTվVڸqhj*UR $Wqvv9rdbbb>xxx̞=;11QPeeeadzf̘A4١CÇݣ+CurrZxq~~dZjHHǛ7o޼y󬬬0Raٲe*UjF1+++///>>}۷2dZ;_e=IoҤɤI\]]K  �� �IDAT_fͼrv_~YjU@@�e]pHHHQƤIVZg͚%O>=jԨddd$$$ 0@ɀ#GDFF>q୷z뭷͛ھ}EInHLL9rdƍI+Wj֬9iҤ2Zj 2�3???!!W_.PX| FGq#j^```ivss7n\\\)Uh֬ٸq.\@WF3̙3avڵk5֬YsI\V2lܸq=\\\Nkܸqxx_|1v>}YfĈ gϞ=}tXXXXXCƍw֭Up322 RnR&lذO> ;vc#F\p!...64wݻw\\RySAƍX,! RE˖-ϟa?o<~ѣG铐{ŋ?ӰԫWoܸqv̙3駿rkԨ!pwwST~~~111oFΝu:ԩSK\P([l3fLΝZݻjKF=a„QF9;;WV΋-ݻU̙SqƁU5jԨΝ; aÆըQCThbϞ=-Zt[.VD-d...~~~NNNB>}\x?lܸ KPV-!DJj֬Iƍ'Mta/ N͚5ϝ;״iS///gggJ%(XST:;;F(ٜyɷzzV;vIryXX؀Hi&WWW???hş,޽;$$l6O>_ܺukxxxΝssslRjQFM0N:K.]xhSN^H"Bmۖy8lٲo߾;w۰a߄ MP({;wbk4H\9r~a% ΝsN!D*U<H:DGЛ4ir_~ҥKG}`Էoƍ5j7o?si Bh4~~~Λ7oӧo߾GMnݺu5 y<l:n۶mo񆓓Syqss+ǂ7N7hJ||<h={^|EwwwBQ^o׌Y,8pYfZYƆ7...Bٵk׫b4'ݻ'Nxt:]@@3xdA#GP%5z֮]HO;v~ߵkȑ#-�<ɐyJ*=S$g_ �8I .ZR} [Ê+xuNq~w߁**n*˙& !Z+NR4NP�iiie霜jV%N.T 56J5*p:ZG, @5 ,{brH;`ԩ#0Lr*Wau:]rAxzzVDRI-Cx)0pjժVrR]M&l6T(ޤIX~~~Ef9>>>v]WQKys J{8pBIXؿ+Ak@@@�eoZJA77ߡXYf3IK1)OOϊ\PPP`0|*WCQ ) 5iӦOCVvd7>++ŋm۶dUv/$t:]En[pg}nvp%޸qcL@FڲeKq~bٙ Z,R*Wz@y9&+�868p*:˱Z/_̼s/>Xaovl wGµk޽[ltq%;;ͷo߮!nݺU#ܹs4YN^^^V7o_TѣGodž'KO޼^zok[,jjɒ%rdȑOvڵkW^o>Pcƌ޽{B;<==+Wf͚oٲf͚b޼yoذaBB=z;:4lذ蠠2}n:zеkW*'ׯ_;vli￿tRhhʕ+۴ido77'۷oϞ=k׮ AviΜ9E0`޽{/ OO)M4x"6l؁Tɓ'_zu$=;}č7<xʕ=ӱcDŽ-[ W~SN <8&&7<te; ڵkԃRL:~;w^_zuxxx,Bjj*gB㏧Noڴ DMܵkaÆ~7zꅃC=,,qƉ|MEׯzɓ]\\VP(t !<<<&L믿^t)''o ]zurr[n:t8٩SlwtttϞ=i%!|͛LwѤI5k֘L7n4o7߬Tb9qO?Dkݺ5?iӆܻw߻w_޽` B;6##c]ytR͛7cbbooܸ;J*߿?66VѸqc_ݻwg -7-o۪URRR#""j׮=}O>}ݺuAAAɃ AAAџ|ÇCCCy[>NӧO#F 8G9su` -zA333֭[7}hV{ڵ蔔SNM: JOOwo߾Ξ=49s,_<(((///"""999"""///...44tǎǎ6/_NMM ?|PP?wy/4i4hSOM8JؿҥK=dȐ?<((b <8999,,Ν;AAA?äIׯ_zuJպuAׯرc?I5jG ><))iT=66vgΜ١C3g~;v숊zꠠlZhZjY~t}ԩSO:}֭젠իWϚ5QFUVuvvnѢ_=s:xzz=s m޽{ '7n>}zPPЕ+Wdۇ R6VÇue^^^M64i??nذ!11hTF&L@޽{}]dǎ{aÆ>|8((ٳ7oތz^>~xL+(((((_~ٴiӖ-[&OsoN1bDJڵk7c P}ȑժUkݺԩS~ԩSVV͛7/\`Z}||n:p@x%zjժo4hPٜ7ofeelٲI&7o9{qʲgjk֬ٶm[\N]O^yv޽{~abbfU=<7ke0|>lȐ![nussxbZmv?WٺufϞT*![]zuĉwLKK+Z)~T`0m۶nݺZmVR?f͚+WV*O?th<s̱cV\9o޼w獵jjڵź}۷k999)))B֪U۷o׮]b\pA&%%ծ]>+㾖={ W(tfl}%%%&LUZnܸqJJJNNN֭5jt ERr';;;vhӦ +Wm۶ZjgϞm۶mz._\f ZjРktl?|QLHH�N6ng}vFF_|xbZ}َ;~'#Gl޼yXXXQm۶ݸqZ޲e`6mZ_|ٳm۶ׯ_o߾W_Ά+++֭[*UJMM-'''% Z}Ǜ4iK9}ץڻ!AR)2L&{@- 0 *tbUʈ#,?wڷo?l0 j~ɰׯ/e<==}||BBB$rUe5 ǎF5g.Q3p޽SnjZPhZl+pJ*;vl&L(((XvTxTTmkFT*+>�0L<SN$X+vժUʕ+ofKNNNJJZrZ :uj۶mv`Nwޝ2eJFFUt͛WSOU,-G111^^^_}UpppLLLE1صk2�@R>G*O+WٳgTXnݢE,Y/GGGիWܬo7o^Vbbb6lX;i# qGAdd$9-|}}ϟOV_~o;x uMJJ駟{=~9xzz {ʕWPPgv>۷اo~UţG߿„ 'OO.̛7q111ԑ/99yԨQM61bć~H20=Ϗ>|822<x={p~;k֬-[ :O>)Ç^^^}˔̞=d2=vڵkמ<y+?oڴ챡_~mڴ 1cF[jx#G={ +Xb 63gw}h2ȧ(x!C +"؁1cԭ[+ ׯ<x f̘Ѱa3f]VToѢEdd$*K,ٿ```ݻ駟m/2E7nܨ[n3fL͚5cbbƍװaO?tӦM999bҤI-*ZӦM###͛p=z#FСf}ܹ}QK Ν;wGf̘A>j(??ZjM:ujFpB*˗ϛ7E{;wh/]E{#G\d <axӧOo5,,ݺu KII9qD!--СC'O 3fL/_ܷo߃曝:u NڢE-ZϚ5kСgo(ʣM6:uj^7nw <g6m\&ѨT*vfS*fכL&ҝM&"-fQ'''_xy&I&T*LhIIIJN:}r u<$#@4hPllkhd2>`ίcUj?c4-v[U*U&MU- Xtb !, }]PXfaصY <jk@>�p||<Ɛ2 !h"Vbd2Z/vU- U~ͣNT*i%rbqrr&9P/^trrٳ{= <vrz(U͙3g FVcqhFX/?hELD3%߁ﴢZ~xWXrվ~'!%وZ-%\./G#5#!IK.={ܹCE�_ _X帒<(AtX<\,ƒW 7,$7( К<&X*M4b]ϨWFDDw]S|9Ӄ%M*}H,qtst:݀/)U -{ MF3ԩSO?%#>䓍7tK^*28X|b.]ȕ9TVѩ|,G.WELFQŒU#A|GooV?k�:B-?=*?L&?n76h4E%!D^^)_Va6}$ eX,W\)߶C ]v@'iRի !K$Ծb2Ԭn*JI\GϽ{v}pe<DlrIq�<Ѯ]?};Wd۶mddr:T*H)0vj)|n{3((M6WYbrЫL&bX,ffS5OfYјfDI�ARTT_Lӡ+!J}F/g)!DW + wwwɔCyRN VLZHR(lVմ,\.Z40BhF#m/6Y2C4HbYh$ !"M)Ul6JEijz"^ECwqq}`ϧE& Q(t@/)JZ"JZ4`Bӡb !biI)B@KBuzi4MLhT*UAA9v0+ +Д  )O|"а7DXJ%aM7NNN4{Al$ }Qz'g~7bPnzrqh5 lB_ǁBq\CQ7hРljE~#bYm'Q^F/XY!>'ZcZ ~׳g޺u )r„ +D &OG^Ewӹ颜, Ord2qrFG2`BޡH+;;3+B4lLt.2ItVA...w-(( @+CKJŧYF,) Oz\fݽ{WRiZH"$^eD`=hF.h(MC:iK@p 4 (GG+͢ckV݆;99aw ͠8b/fbtQV+JVK@/T*:f�M[&9]1taHH=0DCOT*Dæ@i9`(L\%& A'2mK7Úd Hm [Kd޽{ ċ^lji 'k8`xDH3 JA_G8%⼄: A&E<pe1+�.K7@rFH T 3M"MBpuuRJFF$Y88D8 r -t#ᑸ KKd 40fOcO$� VbHbo6&j `HxJ'%#c�;`'7+R`|_IH<:<XtC Ad...|sdrs>`\,ZC?Zn~m#2_N9ANƀ')$t!GA50T:8 x z?Do B@ qJx!X<&NCA(BZM"Ǐ=PP6ql2&=0D:t:vJc B LL 0TE'''=ix` 01-V%0pkV΍$gIth4ѼhA`8i(�qwth(W 8 z$pFH!QX !PH4^ڇYg/+1$S9q )9XNyN2DF)r\ѐP=� BpU\ p<$vX$T|"%LP) �� �IDATR:99IDvfU"GqUnQz GAu6 "=B^4 +}lJ {NϧNEìM'.h: HHOPVF^Cf4]\\d2NڪT*www;wzarvv64/oJ u �sFp`�чLOAB!DZBȠCЏ8` E^bĮ+ )C :!$`RQX- 0NuG7C#~B2FqYˁ 8?n޼yYFs7/ppBJ " . ch5$�6wr?3!nDg%�Lm T`0h`ெ,|R0E!�{J�T4T9_eM%@&7]. ?)0 DԸSN:u>|Xbe\` F*ns"Z"A]8m=,0KKBBEunRf10N%2 b1EE hN`h7 +`G-j' D@ЊVEqO` V b\]rU+-xZ9HxZyyy�8Q\BWĴp,h650AcS8|M7q� ?@b| rr3]rߌ`sg9Rx`A!g8A^%đV:<h<oDBDl6pMVK5/xw,B# *qBlŝ44 =h9$7@"HӁEw" |M_@<1QI!):=RV\ƍ2uhoz$,$邅0)q#n*bv8 t8BmD@cUT*�}P >Pr8[_(I'#G "u c: M !!P+@prW8$"">4K8c1;;;s+xlt$=Ԍ@ y p#Ӫ/B3xLC"C"X2� 9zCOM [qR{r$^T*I\r)$8xŵ  Tj BX SUnnn7ni] 1\Sag>$IfCx*v0.Vl+ ��r 9Kу^DH'j;鄥TmydK0칤999uR<Zh4D!r+:!Cc#?*"x~ h(omN_RQI.ܤ;y8-(Ɓ+Iw~5LZvdA+_bqGa<�F�Fc..qZE<a#rrOSC /[k_݁[L\(Aĝ\\ђ`3PSH FÂqh2t~~~]vJd]P䤥##$z$֙V|FQPs-#<>aC)>R m&4IVLpAE90l {I4F\!.TA#Hz1/]`-{2_ "ųs ;Ld!D\,"nX#x BnI�NtY|x6JzZsXM!sC(7ckSC ڞodqsDH5m)nC}G8P`5!a V1iB#9WiAѿtTXRRRjjjvv6SfN:MbD(?pfR`/r d x(,(s 8U[ ;X}U` Uވh4pXh-Pq丙& ⋀"P*>>pK$.ȓ*9vO< d&Z[Rx`xHTTT<jh:` A(wHH Qr%Y tԆP2$ 'l"O\H,)! nvE ��K D($.MPRbrg9aJvwwOOO'Ɇ݈4X?1|8V<F+uH8<W N&!A'1 '` : vo7O v (6YD8 =_yy r' {Kb=) )3J<:psݤ<BLV&8o_/$S+y0eȼ< ,[3ܤ`0JIvny`F4Zi===" $I:PvC XGFH5ρG g!x% j8  $K货;I>.`UdgNNN۷ ]6ͮ ЧaD$iɄ<x.1<r_olِ`B:@E,2v? ?A𢵂B# >PtA]$>P.\jC2d^3Gx6 R(v=KT@H$8hIBE@>rT པpPt>F#L^H:,< `EnS(d[ wq}XGT B4hkD+@ o4*^ip c&0At,Ҫ s;*|Dإ$H`@E%Yd焰E"?(;>ꄄtB{~l'`I}? (% Vc2ȷ $Fd: 4Cꡫat3ew<jp "i7r?HB LRrDG^ Qż!¦'lEEx5DaiHbk.Xd^@0PJpG^ [ X4J8͍C2zZ&'B]F${v�c+J?R ?YI85s6ly`/\Ľ8<"2^ڋp1Pwxrr+ p=( (M˩!N7 K5n/&cl6_~=%%.R@jR4NLjT ^V4&">+ W9yN(9)ÍZ’ mE)\ =l<G*h0|@t03m6bBuHۺD[{ ˳s[V�c2 ?y</g2r a�Ґ j}$G4pB/m}|%%x47Y@D&n8Nq/>P<LX -v^  ~x6/ٰPh`B|jB-J^V^4,/"3q:h.zRxyԾQpȜEXgFxV4lfG?Dt9J"sWyr2P_ߗGJ8#b=8yH_Nyp tR_3WW?S>UY;Y\l*<$Vo߹QEZT3~ o?i8](lŋk q"Ex7v[ص!rVw*®ũ9W}cxYk!ٯp"Ȕp,Ki CE8w!W܅C"?([>!X\VFsTj'w ˍ4HН;`9DpGOh C 6ɵ^[`bi"՟v[8$QV!<lƦR<==ex ϞXi�j1|?,\8 [7&KbZNDHK,4}mUs{?daM)f)JIO~9yrq[)$kI$lk;|,4}Tч2%=iԀ B-j'*pہPi<!36^B~ 0TN4 +{ZRRxN AtO ўW%fId:?G>s^m &} Mplz|I9;bg$rܹ,�…" j I()V/Osx D"BK$ \h( |g:?0 W<}E`x)` "5߸NIhD?GY  !dʔh3Mu!Fb"^\R>LpX&n,0AXx--bcH!G><G^Vnžx)}x:ŝ0t}aXx3^GzU>BqPx,HSj9E x7HJ&ܹs |؃Fd")MR$M<Crٙr#t(p'Lj-oC\TCU'H^iAdD*$t/BpD*CX:i5͛7饗.^o߾t6&r$t:WWWooo!%\(  {7\ \bLO=*q\V1#C 4.\PC⨀s> R #  9y}@\$ŕZ;چE&rg!N>SׂفI8ܢG[ D"4N.e-B5D1K^^(l6[vv6"0eUՒ*iG #6N:<̩S!T5s&dzh<\+ OT ҹSYi\%s@$%!,ܸ(^hLݻw۶m5jcUZ\յFrd`Ჰ_Zrrrn޼I͐kȞ.Ir<Q\cDgJ*GHj�<x)kWCtߔta~z)KAR"< VŁ.245K}%Za!HVT\ؚ CR=ş!Iؑ] yy�< ȫ u\SNFFFZZjssstyyyt^x$/i $ *\Z8ZRE~ V@FJ<\cE`5,t:c~-z!/2)oW v6!\4AV@x).-L_W޽ .TRvn`Gg6}+9* dddLCDFB.ޚ^9'p~ibP  z_4\9KG4;qMˎIwE+0�q Q4e޺g-yl.jģY pu $;>P+^@S92(8 7X Z5NFh\\\j+OOOBqقr;Q5OOl8`\r׎"!!ڵkīx7j4g}6+++!!Aҿ<-h'!IuVPKpmCV ^u^TҎ1 f͜$#\}牃<IܫS4&qZdge˖'NܻwݻV0*eFFFAA$_z΋�D@d眛Yq\ܜfnGaf(7.#E%v{?m!:j3KBCx5j㓙Ҝʇ@I5Fl%Dr^?FA(ryoiͨ#t(!_y2=h#~z6$ҀT 4A<Joɱ\V-WW״4^/Qmb&J@ _aKvvvvv6>(4JmY~={UH‹$,2` &k\!66؉5!P$Eղ%ݪ$Kev+-�[m@`a_"2`[HGhf4=~=p}TH.y &};,/䩻�#rw�By;yҮɔ_8)BZGKԗu}ٺ[{?-2 gvvvq5훌D<.|3h5W1fѬ_~768˸=8rN@F` ^X%%14 Hp˗j:{<v&|ZQK/2&8D_&sjG>y U"�+iS67Ǐ?~|yyyee%X'Z6<z^w=\~}eez7 .\?jfqm~''Y5椀oS[04wbHHM,;S9̀H]"Ҡ|%j5Yqy1T9Go8F} f3S>>6[{{s3bu^Աd%D="Ɯj#YNtg7ZUܳ E> ޥo�.Ќݯdh`sbf?T�L[ ceəc0j=䩧ro9p,Nx2bDjzkg0RHPPswє3Jע>y wy:tP$sܚ>qĩSKP|GQd景tcǎy[[[~[裏>䓥UF&p%|l֞# <BInLxIwcm$rL Mraj,Z;|Cr\Ix+;f[z|1&Iʍ0 B+ P xp8>3J$&#8j)Ω쨖74IJAXF21Cv +/7Y<@0Z 3F !-1.h^ 0)\I3H?~w133/.[;'N;btWEnp0tݳg^z5_җnܸAq6JȕSف")Ws;k1OHmqNPny|\JS 4ҫG'h P]&!hB'WUآϺ':bePmYh'{W2Vc5v0ʂC )xnxo:(F +ڰ ńUX"x4RJ’"B %XQ~#z`IvYo�yJP?\ 6o6v\ptx8<m0SNLǞDzWܹsٳ~?"d@=qU~[_ϟ?F_!>q)RLIœY'$ !U{Apubbd?&6 UY: o'N,//߾} &!CVRZ;z &GYH( f<r2ԉg8`xs2Vin[2z1~:;ƃ8eI`z&w^h{lTf!w-,,�ѳ9 c=$(N`z 7Kl+^WE=o?JM#EV^XX8v<D\|se4Uz3<s-+əq0[nݺe3xH2P P=pcSb�g)M"RhvDINe5 X*K%g\8פUx_R^4zĉW979g0@`&-/$orY +bS AeCmOZC8)LrZ~/`n%\q<92nFSS}_{iOQ`lZ ]U'K0K�� �IDATc.f^4WriPC?vX>ȀeSr~AD ܊D5{ow^z+߷Y]ng^Yڽ[�DQۄ2܋E›*mN]ӕL4)Ck>oQM,"f1~M by3a|2O׮][__G53 9aVnv<c]JyV;ޜ/MzX8Y`Pl<WE1Y`W4*l"΂aR Ԙ4cR ci#3(3C3^2&=d45mEvrs<<1ۆzɕ.(`jBY�͜"M.Dr bgt^g9ڰ�B>w?Go>/_zfhkg~rG^G곹aK''X2Դ`C<plO0Xܑx-Ψxbk\s?]f! 1%_ ն{HCNq8 9Gqاv;F� nz'9vQ67EM Q{2- 5\T<.5iL8,fH<}A е6:X' M&H\JtJ:^\=b2/baa%cfVa177?4bXNnk X%qsss9C-k2Vf%1/wy>oŏ|ީ4޿ޭ}}w�?SkkkХ?tƍ-y>e焬D`f `[p~odv ziQN!> z͘u/m. Y爅M ^zg#)@Fa=}՗L)qlv0�o(Wt. 㺓\lS@4'aebJZ5 V .3+1VF}EӔ<AilUHHgΜQYep4ܔ|EE<aFۥ3hՁ4o޼kBǭ@HN'x|o8|s=p7}:vE|бcטUM˜M`g+Nn.==m Rj՞<@1-j {*O-64LL#.tlh :nGyWO߉=g˸q$n*؃2[Ac2630ĥ`j8JS7] c+@ˀ9\:|3si?Ǩ=b\# GbK);R?:1sJ䴔 D;>vɓ'W򕏝{--Qrrowzt3~{-~o+~?.`}zܥ?L<�@HQ~/~']U$�&vSd CgxD5܌lC-W_|y20 WжRGxNBN#ǒʠK& 32iEvev�F~t qdʉSd߳9mH$pHcXb%B^Vϙdb@ l!9M,\MK`Dgyfnnn8r&s8"7.řƌ&3/}~Hrb .aj^#aaa_gff?v<yrvvYo/^<1]gowu<pOhv՘:yf|{=bSyy,?h!HPOV`[bZ0Yml %?� 椲GJ|ʟ2$ٗrdlF2U &t{H(GpJ4s�tGs"EC|ZnkSH ="ĩGeY XȟDcc@ +�Մ/KPܻϟzM=dqR eU5(hZ.Qnbf1)ٳgϞ=OmLM:�JK%Pd{ID,7x8R(G"(%AUzՃ>^>}ߧ>ٞ|vWrzzG||3_37x`gffAW^}67u̙ht CS[ϩRyхxbV1MAO.Re J4;yP(gh 8ahJ itS[v'gLv 9I3ⰱV6I*#c: v U:@P?AR _0nhpbgƢoz{`֠XlfXxuEW Okd7c3߾}楅9V\8L)1"2<yJAg.Pe 99ike C/SyͿ{3Cȥv龩:?'w.lBxu-ͣ $,kc *$2{"hWZڥs;qsP;lpashm5GrFœ^+Θ)&o@I l6d)n 粽!=#277׽}Gy$V5vk@I\k)5Ͳ3}y7> i.=W8P&+ *7m�YH-..&8YlZrG}XΔ)q`1?t~}}݋٘'/&(IO,^2Ǚ`b:Y=o}Ov~/u>Zޯ}3 q+_Wom~lkې12A^\%Մ|'#%^J`ײV8${KHpyŵP-nM[r㔿I9/{2A$x.6:Dɖ%?ʕ+`MP\PM{D2wqG$x7yW cCdঢ#`6y;QW;N2G$M�,\lj+3L9zJ?GE(dGFZ677C ûE4RSUۋ`Z__D6?? spk?wfvfq}O\gns{=:0 .Ύ&/!_yeig߾}{}}=2Ok#2bZFak@-Hs}6&N)l(HpW#r.�TG2SMЄ4<$q齳s{n8dp3˙۝n[׾{19Y6ƛ@?<a4!*ꞢuK88slUW2bNj+29jkDBNРK4-ya ly8N0nxpăւAju][[{gxS>㏯ڸ5ꐠ 8 X, TB:B䑺פiA &qv  i_idd2J34Z6> 9GE}/^yI-f&9]Z=W=sBxk%W)3*˗/OMMA(%lv{ؾ]VwDttrAGOӤ*(]67'=Dԇy&^bH:F1ӧ ܶumB0c&ons1~9&*2zC"֞|{g}}ŋW\~P]Cw4Yؘ90be�&(,lyV"Ĥb$XԊ' ǿb@C !+}nrc9NK_#G/_bjyc?$1>r|N@@F??G:dй- EO)3??$z KKK{ /pmk禰,лs^>#s=IVG`y4oQ ,G�m[`S;I ww, gNdudz) <LrfY-䃧!J=gffLKRfgg/_|֭W[ADC9FZL"Ռ+Y� JCHK�}'$kLh:(lVQ/ȶS$3v1,rMsTi^#:Q$0Yje..RdO{=i�8ƷC�C52 2FgU{e'0 7 ςkxqJ5ۻΨuv.v>RPFNKڔ2ek06bIjX I;lzmTj % 9|"`~z8}Jzԉ?˔nqdk 8�G Rf<R%W,~wNdO)6ks͔9 9nmçnX, 1Ov{:"P8&IM;dS1&y<oppMo2 z_fێzjj ƼSN---=!Ѳ� ȤDoG=Y&Vd}�kw�|+>4vn >ܤU|N{W?_ޟYYb!=[p *kVAK'!1O~ϣ0F 7K|M;X*eHzl[e3k9U@|\\\,ks|kkk}}رc9u~rIgffbs0 (5 ]cUg_hYd7)˯c1)o+Q09'{GLa$|D%J>Ί%�S,p=� 1M$ahbðqv$aR: ~oid;osah_uvw9ʀoˠӹ偗 &UjMyKKKŋTb3MndG$Ѣ`(@ݸ.Qy7]hw RPa6{^x{^SSS0L͹VWW2^iA,iTBy FA=d&uj#5(1W@(\EM3}`M"/c6;0il8 :1jyRoF]pd~%$^B֮2F9L ja 湻eioקFk^w=WڗUh.ZK% {7J>""`y777/]ϛB8e]S;W9 .=gByv< o�XcmF~?=u*4d+A=o<+f>Ș>>43^&8}\^R)mrZ-;N٥!T>(YKcrR(Ss(FѠgΨ;$wfbnte&Yrp^t˳DJ<2>� qk&ΚR֋''oGW~ʕ+QС igQ.,8 njέA7d.ξLC^\QY u'%KHٚhDydGP Cc)KHS@l֭[б~�pO Ђ?h}}=aNT<3[kR!ƒ`F@% ?e,i(|<{pZwBtC IkMq@jR0s7ۚ,wɧRt`jFfѦl[\"M#\j׳b]EO?}ʕN:s̳>>$_+9:'y\w8B 3Ȍy I:}u!VKo{$y~A*a:?]aOag{HR;w. 6 `p̈́`ٶ{ƍݳn I_e>Ghmd0/YYĢ!z4EBH0t0F\tAOS}S}"BJyUZMs4!DLn F@yu@%Q3;2M4mb(h>;S#PHYc"し ZWQ/|έ?\G?ڵk7oޜ~}s\eΔc@LnllUy2i&[Ldzb9OTQvnR|+HpA)!1c@17V9) 4˸f™N*3ޠ|Rguuj<Yw#M �dg4 E%.�;SoMLT]΃$F?58Mc@,v̶$W򙙙(2qw[(dDj]|IiY^^X95}~5U\^ikj'NEm# fZ~ٷ�Znd{{<ٻoo;?{n9*R%yP8*(ZI ^x_؏a,�&u6h3ӈԑiCQX^ �xt]Nf8B v@̿w py,<~qIM\ORL!yV0vC#:SԵ#A8/FQ<$s%O7R}~ߙZXX@1^6M27R+P@٘ '3煯MȲN<.3lQRZ6ipl~vMw[k{oۻ7_Og6h5nRfYAQ>_;mۛrʹz œs<qy 랺^ IЄM9+(}S9قkJ_^^Nk'رc;~`(̍X8+'0`anݲl J2fI&PZGb)MȞQJ7cuz}54zCs+Uq2X;*^:/H<츜FNg>-Yf,ν#y#bUPSi[C̃~tnhz4==gN;$bCjT )dq,ߙC֮w9+R^I6Y\wc,®T0Y&_ ƞVSXkBhIbD<JI_[[ˉozU^iV\F]F*QZtlf&t"ho$<xR\&ʚTbh汜'A.׈6g � -3a Ov`@驣TљߺD/ ~<C"%ІLZ�B69~/C)IPS󡄚QD:6VإHu'8i<TDZ4 -HuӂDSTvN5RPMT0yMZ>6k!@[C `lhܺu 7'N `xAd5"LF7إjz4x`*ZA6|v�kzly{!eT#bjۂPJu*;ŏ/HNBQL'Iy%hQ2Z\ܴg?�Ɔ=mAXЀvXAfac&G~ڼxHl6A9U:9%IF'_ٟNKǓ2Q_``q4-E}LXd�� �IDAT?jR$&|@rao J'p Rgdktg#Khx /q 3k {l�4gi�-g!Bӳ'yvڃDqrmHa-x֖%aUr,D;W\Y\\4Wh&!ضs#N쪜bx<@UXgB3܊6CƾTs2O(` gzrF$>%v fb&}bdsC2�fؤIOk(:3OJzap\"S |iKyU[(/u3#3ȐFA#kجp@`qsHF/i]\7h6#H7ΩeJB EZ#[xo,\h$r%?cP%NBQ:e=g6mdeLhP& 4!. 3i<l u"r)AƖ4 ,6NO3"hafl3A�1^J9E�/Uo |vCH]E؆o#AkJ!,`I@ܷV& T.hHt W>R%(=j=͆u7lyȱ/ V>hN'4C$A1ޒ69K�zv\/$|LY^O0D첾?]a)O1&俓3"&-І]]sFV-^0faa!6ttn9KI-dO؇Gvz$E0i zhG'D2€;=DD2hU.oV[z*)B{)῰Syx&RK/fJ:Iͽ*1 ,dG/+E5F*Ç_D 0ᶺw[MBk6KZ縻ʬ?`" wtpd7klEpp=͙d d\ل1vױ(& _Cw1.@ʜ)g�\b4'$�-«VIGЉqmœ}NH�6beƈ e�}Be8g2$`Nn6 4O Q&N)c"ΔO[2x�q;@< VR9*c҈t4{^\>d&dђ!R"=Byq t"5Y.R1Ir:`J88NIUM f)+ΚpYw+b5Nދ`۞{t,H<S`r:rL5[:iM9Vףqќk X v�EU5\-xKm3Z �Ye5alj{{;=nY'QVbl_l'8/$[HA(+Pkހ- (XBƹfF0 -ZS#6{(|9sf{{{ee[ osƠE`E3L`k Ud/on14i73Lْ@l5H^yH@h8V8ɋݭz,o4pq�4fhFOX}\/׍]p8nt4'2=jz$\ _~7gz2TnLs70ˉT9nQ+ X+UBfX}  ;e;6.+tGTn7kr ]4aǼሺ+aLNPt'!hr,awa@$Ü$qu3 i:$s 4rގlBF+χ&bj\$Ú9)@ rjJ_s`yƒxtfƃt3wᶖkάj.P XX%aI{#E&U <3H01#†-G ˆYyؤs`AD,``>e1UFRM? &Ӎ/U}팢mřv]__7 r$Q`[ܕ$e0f0vUFVN eYv�4qaJ&bvV;RŘ玙 bKFܢF'iQ!$<KeꊤXP!bpIŎ7eЯ''MT)\@&Ѡ34ds;<@BNx> PKbj2f{ww}'>^N#Fڐ^>mQ :uj6,B5 ؍S}i/Rȸ _<%{/e)_~sdp<H +^gd1bm(}L3m5+>XfQ z٢^n˃oƴ+bicnpßei8@9s0=ɭ@2aזϞ6$HX|81ƻz -4M'޴CmPvE2ߜ0r1kdj)`+y8Vpx t"@ Ae`MGht2>>~8yH{X0#<5~G1Th"/BblUonOB3:X2a쌒ʶ-J_@l$lQtuEl3h^:Sc.ɒ{ۈd6&&!.ޭ $ۘ*Q)q8#Ja>`:!G g̉(i{ M,(p0 <KbntQ|rE @ usf&ö>33(OȒ??][[SnJ1pҳ.hQ$Y RfH�B8s-6B,6jq]v\`q׌oI9xQg$ ϲK>h<ufX|?917L"aZ %v2& +d4-BDuXr@#e>vDNj*~x&3,'Ac)y2IĢX4q+5i& �`$,f [E^I<&M4Y(%5??OB\YYz&^Qԧ?¯+R= >{2@q5ZTg1CA*6>aʑb/(LHkbġb e#0=7~Q1՜]J RSzz42VUA}6_{G�$TJ>"R� AXCϱ? oޱ 3brnooC畈Y n(5xwj/R:ͽX !@=i~./s�cDrV"bfg ݞ5)`)A8qpZۿ 5)Ғ!kEX*ŢIygv}vq'H2gP\$q�OBQ~Ao5 A% eC4K( %l]aY z;Fŏ"wlc67Iin_;TOk؝e%5qh'vO hA|x\;PbsJȪ&f& :=|]4W=hFÆE֤>&{f4&P`"0;^]ԧVc-8JRwjM6P~1ݲr鮹_j㟈[E~Gy d .o60F`#� JǔQ/bQ^2mb=m 9V;v!B$pޚ �j.l3P&@IgDg-)~20'g'WUT(N;<kA�#|em <}\k̓.*Ul t#ݪ HP^\əُ3-vJt1JАkx'x=Zn�豛 *j:&4"<Oð0eX CyS{A`-n'!(IҁS�ISTCxfR,}Wmj -cLK>RO{J8< lI.0䶧V|@lsF=?d&k#!irӦ!h\6Bd!N(脚wl�`hM@ycyVәo8YBR{xqC:33@s.gX'))=a)6k� )a[IovM &R{� API,s&tQzVM듐sdHqx>003JU H8geN5_I xS=�U-OAh;6osʱх괹ݥi-@Aٷfz|<-ژ5#(-Ln7$@9e)tdzd=:u}KA.u8[p9ܻt'>J3M:✼M igz|B ߤ?eRc,VY`)z2b7]m9H:Ze�#{{'ׁaZ6l,7=lo�Cai �LLلR1λ2@zGҲR3_? nj$C~?~ʿFG}g9sNbΠZBo, i`2g?\1fOM𨊍!l>t:1�{VҜ9??z׻~WBwCknk`c)òF@ qs( oXß (N 3+V [XX2,68ATOV<ӛ4k h_Ty 2oA2as6鼍A;%͘~"Fs2: 9G^;0pGG8a ׶n+ezy14Y(|;c�0]8 ,0Tn;bvPoHzkGJk7uP~7??| P,Q :@^XXb48Um>SQAozӛ^ם:uG׾fjU~hZEz$1 R7`?eH` H%<$M Ed2O, Rv`HM>+)s 8 !ZJ ,[S>F8[k9vRUVQ'!( ˺T)PΞ={Ս 9/z{wLw$C&bL0hYx> >}0_t??tN:uԩ~2~ai8..4<FXq-b`t-i]fQ&|0rN~YU۷o_<sŋ~鍍"]V�<Ѽ#333̘20./ȱl,->e>Bƨ BEAIt?Nf!&;2.ݤ,u`u�7›0יB!CV&ChY#gC&s<)⤆%oȸ9k3''b{8gq'@E:u86ݻ7sgϞ-.\_իWmtȔ$#cF&(|z"=Tr^� rn AEhH�Xk5DG`9Ӯ QKenݺ;;k0r1rB.bLWO9X?,N&+ہ1[*-}zl :;%%r�g䠈xt�#wY<EfU i�KsF͏|SƮ9¾3 g|c!T˱ Ӆz:C_iqsfv$%ITRf7n` *TI3g5=LxmkzN0s[͌X�N:uĉZmRô#Tnrxp<a=@ چ5߄mUif}49H#O^(۱j=+>H,$jv`fhnOxh{J;cwwYcfj1VI@1 ؤgxD?DdK-THEx~1j w ^RR!`C[P39s 楠`#[[[qԅ}Clr!FsBa .+S7h,saL,AuH)P`a1AߛD%̭Sԕ+W.\pN3o..CUpvXHV!?ځ3=CgtloErBLK1}DBKtq<a3ڝDߥ,gM${'/ܐS>/.. o 7nWT(H.m>3MuHR:M4Ϡ'n]6YŦ9+2eP!JmT7&!h (̙v[XX~:W<w">'wl l۹g`{ſNi[ߵu8 ЍIa1yVzvQdݞ]\\{SO={x`]䞉.XZZ/_| Ø;(7'?9ց-3@B)Bb \�Eu͎\<P BV)J[‚/q>oNXa[2.V$]q>0 ek<pOTD2V9\ZD�ȟSyD. =01A<) lu<~)v$q/.%{$Fй)MWTXv`xNf=icb\cfsp3}n?';Ou_F`&dyƖKHxp(4Bӧ?:uO>N0ry ernٳ7ofgg>M^6;1V>}~~!Mq(th6n71eRM;~-<7W, r0(eiVEU)/3 ai*lU'cX$2K4cjPy84k[,>m u+]Mk5P]F Lkv%X%d#Fln\Ԍ2tw]wd[0==6x63>3???ꌐV+Eqdii鮻ZYYɁ۪?)[?c^/+3 |ӊUŭ~,K=377w%}*1jʃ ڊp\,vfHS7 5~C~[jL,oi}fP "ʹ庿رp%-/9557 ,(e&1@3? $ tE+w@ p@mHՕE̥!&bj.X NkGqK^&n1䈂)L-ؚakd%1 O,bJѹ?A30" C!d<yr0PS5;yig?nqcC&ͺ\\׳9/cŽ챘_q!&e 6V8b{dnb0"w6gAVT.M~q# FHL s<TNŶn#CrT6I]lcQZ,"0 ԵbqI9MvI<e,RH,_Ⅲlˣ,42%o Rzqz=ވ\' [Q,_677OIQa!SrHi,�� �IDAT*,qVdZ@;?x:Y>lv�5,Z<d_$+M,BrZ}-<ȃWiIUoa? l5 e<5Vl*j^�D(3 ^]P�ꂳoӨMMcčT԰&7rV Q R[i;2a~'!hp7͖3+@?<Xu'i!Ewf$'sI8ܞ( E!YiEԆf3LeA1}u !2Y)/wȒ#04D1m$ ''HmW&�mkB1  NU\M;:=9,]qULp 0 SA@![A*Xs: y:N Z' R - Ll#-zXdtXmeёp~p/\\p]"OBQs0qnsvfr~f2Hq!h]EYR4rڞXXe<͢nzsp /$rf}q6pGk' LY'Jsh? *^$upU9&gU8 m�B¹ʼ Kѕ Y9{m'd ~)vyh~(ʛMp NBf3 mxΦ,!A7Y=Ƣ1Mܰҙ=CN-p&!(gG2O(&{4Juм!x[2*?Ok]HA=:Gځy<6p֤FlD<wdu2_3GI /T;g:PQҼa/"u,!S𨩥l}m] {C[Jo9ӃP`Ci6!\ͦ._6xeT+'vV˼%-2 QW6W(KÉp]|<7,bzqA�٠KEnn5}e4erx@vg�rEȊgaww7fF)lFA13?ðqS yݚ0۔+{;tQfș;.?l K_Cscr9 $g7F{I&ko ?hZ6.ʧ'$!(SaDsP4 ](Ƒʚ<KKKѬ[__ NL`p؊t.=f]wuw#ʣ`@ukO4o\ BBo�E1YT9GoHL#c,`|1@O($IB"GmsEiq.{l\k9,lg)#k;4 iW9hssR(ĨZܚDXNU׹<�*<0{F.ģܼyÇu5rO2KJYȆg]߂a d7G'/֜hakpgpsS%o#0S@hrK̳?pnw8"XyPFql3=y8*qnO|"#c)�*E kQ-MӣhI9ZOHZNbhO AbaIqc|t2;.p桺{ +p̺LLb䳛ºE*'fx0*Z%h}~;tðd^S9;7G"J;J׿ΤQրu]`\"[XF Z >?U) -hLWFBOZX6c,#bϴ,,sEHJ[o-R6e$I禦ѷH6}1rT96$LC.+rNdBy+"ZΏ5whbnv[-QJ0p|Jtzݽv(Lc/G䄋 UiLEg Q] K�>@I*S~&lU ik Bܖ }iӓ6U۷}T=;ŖX6trpq2RePVz״02?x |. M3{;1 l9{ZD y8@a_�h pdvەOJQitβ'HaaC# 'M~.Ǫ@I!Gnoow]KԴ 0eT&e1(S-8LS:xcp3n^+++xу3ߡ-T8%42ot2؄蜗9bdn)o( *p`f3g!0&&4-_*14$ FLv� 햝Y�Eo˴vyfT]ZZ܌)SyVN(yED8W\@�3�czÕ]3hڽd*4m?:333ǏOTsUǒg-A!1~nz1 +4Y<ΦAݑjY-ra̠y2̅'Jֳ!L-AqQntԽy$挕hP=ni$͓ħ@ GR@^(ojIp `a1jِ) Bk)Lv*"7 6J<s&RF`9c1fI;h6 4kqG>ydZ٘?2vN.CV(UQ2$3A׉yW9lo`HG[d]5sb#翌mHcJR;lQvOj/ =.\~v.Bh/s׮9JjD{'C8A? {h H|* jWwӖrnt 3KLNH~ ⑬bef֥q0yV)əE/0IῸATJ S`I5 Da3nC^OcΎ-փȋ0^N�Zfsfe\\AI92gq(񮵝q!8<}{xF̸ X]^™YD{L9ʑA=y *I 0)%.ڇ_;�3GѧJ=u2@q 7Yj3N}<fKo~Q 6~ƌ8NYa%5G}u*Np#=hG-&uOiNQ<"&D"e抟W8k(YXaiB ϭjXaX3�n('fHyNr ^)iɀXugF`$~\fSSl,>["dbv{>k\ Z15Î2ȝ|:r nɭ8uc29 .CnJ| @d !3"� V }&X !@~XuVWB ]S,a/Yqs i�֕OSUsZMvV]࿠4K9^g4LYx{O0ZP޳@#TN2=çPv/&{!6rPMMڌG{O:OhjvW<Ȍg`0�Yn7vdLI։ ,#&Dd"~P14gD*w ~FH@|J4n`G!Go)63 M&SꞲjrgI)S<<X_`g+{E ۡD 5gn�9xN/5kÉZip]AA( Ga9K]~[[[~?[DDPR�b.G=mqGeiVHWrI9ʐݭ-hvgYw5g}ֹs`VkT4&1F<Ʋh-1�j^ RT'c%$t$y@+p :< C9n &j)JځMs>bn1ϙUta6_dQV๡`"%ؚ|t>%Wf`ܭx^h!=8 G^d82Y7[zk5@Mdx,-cEbX簾NHc?IYl_-ʀ"XNŒCH* C;xeNB|}^6wanNg0li{M_ei/^|93!$+xAXMJS;I^]|/$l8l;|-q`g&$ A;vcn>},reU]JVzϝ;7{qgS~y]欧FENI܈ &Ny9K0$GSjit<BT50Gd`ldhDy5ީv). ~]:j k4O/Mt p@$t|(7s0܈5L u܁Iivzmfs{Ο??>ag=z|&4�=ι(D�pKӿ^֮WNf~ $K4er[na&'Nܼys8 p9 QVnP%ӆN,.evbqؽ~G<W^?Bz<2Fj9bR@<12xF�oiTr "�Y�7[wxm4 : j5bl!zBYѦ ]!2D* 1G&{=m3lZqh ֆC]W%$!1j褲&-q4 9Gu]?3v^m?я~X:ss敃Wڛu6RXWK�a:kh% }gΜv~a kK$CB7 2Ey6ۙ 1Iḛ `A,xyl *'?ɭ-!i&.rCM ыLY M a"m0/<(Eż)TQ00;R0Fz]TiIC&@o-o:c~k\ /،8t$/RR )e2vCo4 9G533sܹ|;)z' FӣbY{5ƢE*Ⱥq{iOvp\dkf+/d*VWWwvvΟ?g+=ʉY<c&$f\ Kz^LB$rI@s~ӸO"g _җ,b "(r Sy&q²Af!0œX${.j9V~teT3X1_iC[~==S`x& Qx!1Ila=`L,;2V./DPK 'Z}ff;xk^|%LT XL(OBQ`k{{ lllܼyommZ& {}}P2SHB<qzsa5)wY\\sUzV>chCUH*!m(JhX, 1S*0k,%0tFA|bGgm5F. z^Z\Lh;u3Mx A_'!ɠFb`ƶiĘ (y`8 ;&c)cw6b6/^\D6XئE%bR ]PE{{ҥKO=EZr60Q>ʯWW~?|ʕWmg.SWh+0f -3gμ]/|ࡏ@aI`tvEۄ]_ L3%WڡȶVvܸ:-m2{)Lv>ֽMo< <folLGW6"0%&H \Uc=QXUNaL5D+Rw҅* T6P>ٌ`3x˴pez=c$VmVF׋Qdggku̵jkX.ҙfC*`€[SNR~0<Kgqdog0v<7nkn߾X,D5 Ingl.l>vc}o<8f5ܝ2NG4T0zΑ7n:LEjy3NTJ_=CcL f.GAf͗j Q14oucP-U`nnxw/ffQ d1x21?^TQh`b!:?~ܹWf%W#i2Ad1\cUgX@Gpbg;._f<݉t:[{[;?s??t߷=ԇe4\]A8)CQ7dMOfL17ٲʕW"57'!omrZkmљ{kw֏ܜھ=Ksӎ̗e*y,xk.]?e"Y ѽ(iAӁ@ 4\@=ws>9_-lEݮ >g=Gʩf12`;އvizBaQ&Mɛu8u_z6znװRi<pn:!(@~k׮p@c%iy�7$S8LX?{ޱߟmٺOw'^V1k*yrp>uoꖩU[1[ZZ \{)cI NIz&�Qw6;6R݅|Yۅ>$Iր*D`JJ04QTExIAZC!ϵqE)2FZ G4r  3_~5 葤O2c%]<y;&*`c[n?ڵkŖd㥻1$KGCB+o|k_[[_@=gs"JA`?<pͺn,//>}ƍ7oߟg3?II-4w^\'8QLlU^<v˲1>O/e8qbyy9#D\<'NdJzQFe$}EgTg%)2P ZieeN3\hYUB&t*)A^P{&anC]'?y[n% Nqo;eh;�(GO3gpcqrA殻ƆہFG jEel:V)~N|_vp�b߳ Ǜa2E1Tt޸7sgϞooԧ>+++̵9 "_!QA RDG0١5RA=Nk 4䑤S)v.G %[ZZjE1^iIs_C9 @1"6 "䏸lK<;@B/\;Ѐ2㌛n' 4s<=K3 rU|}6y&p3 @+MQ`nGwRY4Ú %;@2fblL~S6mv;poF~ j`e"=sEvŧ~(;̗)[Yfy,b4i8t;u Dٳ˗//..v^ümͻc I+1:PfZ[XX scVlb1a4\~l(49NBjJn- ?NL3Es FGcC(m~@^r^[C-k5&:Ll WT{p�� �IDATlӹEĤ>k=F8:0(9:LGG84&4<8q\`Ӓ^c`Pv @XiMO2]I' + ̎![B̝-Wȣ"c666a-)GYQyDnh4?ܿŇ~'xGo޼NXMlsӳKKK6Lؤi>x;Z,wt0潙 v*I9/-,VT`3R#HnqЦXqo3dh4de~8[gSP`'pkj(>S8!sfdVwa;ԜuQ)%Ep"3(ymg>5MhݰMYoHG;PLGY@[±czg}… ży9A�oGw>'?emooo߶85=gS]QJ5ݾ};7 ASm>ՆIYOcC09jbUӦ j7ur0zEA&[CV3JKhLl+5;!Ip%A!ōMI콝Î!MhDesl 93YBO,QP:rMnv6Auܨsa!Qi \l JM ;{X .MԈaNnoo_p!! B"BC*2zn0~>/70g駖F#GaGbfR+óF(&HE(ngΜY]]i>хLVس.'#^I9`͵b^!!͡>  fs9_<|,sX,)) |zצPckeNq~vhblA@ Q{}k(d* Ĵ+A$ş&j.7ǧ7R~-O4jե:h=S|vk\0%'ځsXPvwwQ ?Dca_Yosss?Mlmn{T/Z2`.  ' ș-S=UM/W d #3 b&MI9Zm:vSXO[kjAtw3 3hwV=I=c%2ouqu9i(\VO!0^jwa99;,@ߒOP,*80ga R̅3Gôr^u#걛̴M{!=cQ$*CK5u aXMO/gfxr%2lrv KN9YC e 7<Eci/@ɱ΢ zrXk 5)i^\dY�M~<uOviB®ĭjea&sCcfVY Ї(QZxQbU;0(&?v͌>V׎@~ qɑnn+EUaki^n};UH5k-"S\O^ >Vngt@9nO]H:fR>M ͝1܋瓓eϟ:ujcccuuMbtvxIIaTyɍCkn/ooo;@wyA&ѐFh^-qLBΑEOÏrraC;_ liekE`SrscO {ETi{¸)z-,,$ ~x6)Zہll]OdLکz0+b$ou:8 _A ))hmd4~ryfeҧԯ^  !kf>a ʹ҂LiP2&BBaUhL_9Zv^offرc~/]t֭BdVkZuZk|.�+W:ȱh,a,{dt,K^7DÊ)L-D0 6nZu4ا(jĤ9LYe 1'r@&-2VI&nh4;/]4Q*+Rf[L"zq@\�_`kⴅX_R9RrܛQe@BԵBOQ@ ELvl ҧ%rH[kᐵ]`nWpB~NxsRϺ\�jvs԰R:-b:Ȭ_&;Cۻڝ٘9K\Kޅﰃ7ʽ\NdHo%X06풗$ٗn9RcV2_*8%78, +J񚤟*ۻt}ӎ~z}}yUW1y'&A8$Y!@F;I5פm x76'Tu[1CKV, ](ȼS/K^u!K9Q%<ca>%a]di$?hRDuYI8fe&(wo#K/tP3~|ŊXA4x3 HeF۞w6.vX#G&I9ȐNqCIujLOqpac&`RpA? .򉮦fXPrO?϶֖%xs .&z~|r!7s<| &{ã|.(U܆{`'!HW}I 0ޘZ y*#ϴ%mnn *CW/$aCˡ5:GP,Scmm=Ӻ_>Cw;wn~~~W3Εl9Z~9]dC⮌ufggC4 fo$+_pXCd~gr0_hOx&<C\iz'1@E)U_E>$,ʕ+׮]3#+GϓjP)[A`M[>G=|ϣ X\(B˓no:KP; R7-nIq+W%6xk|sͭ]":03p.,,WxP.PvĆ&&�fn<vX߿}6$C |i؝ޚ>9uGGݓ厥EDlB7i\pDX1[u ܜ!Dt1%$e/vܹ~77/_�c"dpՍe+ƴC} }ftz-t!;yh/B x{̰X< N&Ə];G^�2ɦ?$71h`beF %K*? YI{Z3`f-A &~5c wBE{^׋܀ h >F"*8=== ,0@KEE /Bt1FQkmڰ)yK%*04'o}KbS(61I9z`mwwwmmEprjX*ʞ]&,m2)xdlI&+9άLJnN3XZEI[4&tyr((Xh4Lf9XfbxtL5qs1hrB&=SzYxxodH3e W@(w,XDG+ia^3n3-υ;WS=xͶ.j%;3#-,,|~w~w~_g?kZ[[t:^iN):y=__nmmma=fo̦au5h^as&҅_F "HfIĵ$qGy$ фtD49l'@;ͺ9J@?PF`IlhFIe$'NrDK5]#2`kkk Dn <@> r|w0[ ,})'N<]ZYA7+Z0D҄l P666Qzrx/Z*E+ޛٚ^ՙ_syRUݲd I%vd 4в, &Ѧ1F=A[n0 ƁMG;DXm0HٖjIFRDR֭;g3du'#g~dP\e<;{0 +Lj17q^ )& R#r߬* 5\L ~</}Ν;>!%xNj!ݼ wd$ѨzRut?yƍj7ߞo cGՋQK?_ӐU'ƃK}[ (0&i89gC,GC%K70 h0%b|^ZZ:887PK5z6X1$| ,QtzUUmnn%n²-Lzf|jقk99LB%=@p4: ?d>2iDf+pN,6baaamm[[~D*-*P%H-:V, ߨGt?ҾÎ=(wvv/,,,<qsNKrx~[pOABA{ZV?pO|/' aQ hd`P3V -RZZZB؆~!/dr|۝󝇜,q �7q4M[:G~[)mg[(ᴵ: b7?cU-ngFF@ ݍ7R.;`wKϿ/O<8ɑWVV2xO%x>G**RQ5/atȕ-6 :mv6 _H띹@'_Vd.]'8�A9#&ңAZNy�R^d/+8/q<vS8P<4k@�>/yww7&b,UUPya9~5}`zj2tˀ0xrvw#nT*Y煲"K3sosXZ q"ߛrrΦı%#;C:Y6KLtNhЅD4& f.\/^tkKB`J5`'۷on ytΝoOs~Vޜi~~hCbiP3 yK51/g:rX~®tg:Tnw{{7 zh> MLNvې2RqB;, TO{L_>Ԓ(~6 B%U‰ySˆ 6-ts=C9Y35GGGt৵iSnKb +L*uu¤Z,Ff+Qr*h VL(Ql Ć:iMkq.)L!8[W+?}_}v�tn;|>jQxg<ݻ>GGG^ooo/.] OG(# C<\UmVC4ȎNz:2'Bf/tʘWXp b@N%wժvUz3<Cw͜{9n Œ\Z0 FnNm: į nɠTyX|sB&mjhbGlUNb`<iAt'~,--z^*oލG6) 7<ؓөh fsN.9-lbQ/AXT-7$k:dolllnn O_̅4?=<<w|K\b# j㜰M:G^yRHVrbPI#z |TȥKUQ֫aͲlAˋi#0[aG�c}_WBmkH6>o /.AD PȄ`6S0,,M�8vēcfdbs]w]μ '=ŝ=*XG"x @b lv?Ї"m2TpXr+@P@G.ڌڨ#)|?9gC\MOuzyVav !*"oEn0m֤kQmfX;?Tj} XPoL0q.zܛB o%d|k5p'r \؜$Kv5c8GqptV8S}./)>ĉ {&xqq1ZŅQ1^ظ$;8A 9>8fCl5MN%ȺJGkBpܜV8>cҙ'A"am6/^؀B o־ qmm~~>!K0|JHhfQ`I3XugrZ<0wB;VU5 \XZZz.]ollKlɃ�h5 ɗJЫGfk|m`KïAY0/quP1ө^Qh qKmd D^9T` Ѕ'zA ў4dSLX %Ÿ^Xi4> PIxڬ0E+ EVa2创A駟1dX*ܢnə'<a̍[]ӺzrViư A0Ꭵ20Y ySP|ayW=^=:Z/ud]+<ww?G?O|C{nכki4P%G�_6kgXVXyJ8<]%E&^ Ed %)�CL&O}<%*mLylFkIHW\ 5 AE}}aՉ?&Ed^#gGMdbVm8^!Vں:ܴ/+8<hEm\'ZxkWu!i] K2'Yy_@86%GUC?V"uR?햗7]zjc='Iq $:q0%!PwpqQXr%Yȕ(VbcUd! #[=|γPmftK(`SN54<x<e"=UEن0"F𲼹iCeoЦsbe)|;2'FEm#x`7><h)Kdv{qqX#kW9 Kq `a M忒Jr.r6H"niN1y.PdK(da|rLˮ cÙe 7uh4[|s?}d{{o?ܛxG΋O80o`M*Ys&e'_GG#g)ٟdٜ ܕ!E &) KBm9Zg+�URs I{R_͞sxD'q֢�<e M&= VWimqè%`1bo08I( 27hh7ZLV͵-;a84oX3=!ش.…'ŧRg̿1Ld5;pz?jԟ|_sݾ}{2 ?lYN؍+:'\m+: $}c"hkWoN$ʗ VF9 zio)> [,�XT;@Og T'Bsy$Ɍ=H&z1FmaiFY+M2b< E1 dp`*fݼD s 9)O K+=>>f Ĵf+�A>n3�� �IDAT=־.ICHU]~2I@]e] pDQIL;odh.wt>9_5!}!bY tf7 9 pP;] `ri;k]{q�!Be`!<z_#d $B$�Yx0:]3A,&`mh4|bXR342=EC+}P$(lLeZa:MXLt.U#9S/fH#ދz8kd F,ȹF'v-qC98*&<aJv0pZ7Z?zx7G7Vx0�SL\OiKXdp$$NWZZ?W%v�dx+7<=�"}_`X4Pw\W�n._QyC4Ġn -$l˗/?ßnݺv3#{0g & dd^Oy@<C$HCO@j=!T(Ӊ!YQiXZZʝ! 4M l{! 3y,Bkֹ5"_1LDS ُy!  jՉ~_lIDclQA3OTdF9"9gz 2z*dĸM?hL5:r2He�;l(J( Mg_&5اdz$d>hV[c P7/+_ʛ7o;} ?I\�Y6 $/THqt>nqIjYwjRp>rsP0BVtxxxs8TZ;�9bn]@&,#WrPC%22c3o+UǒjV8G PHaEh n;q' 9v?NTayTp \�@@7uO ˺p!;>l{A­{+J㍵Zm0<{2鼹m8A2Cb2a v%lK Pn DB7m! VwRlԞGw xɰa7rdN_<{gg'֖6Ini;?z܎QrQ-wuڣivI@*gyen/<H~=ㆊ`p I� \؆CT`4gf~Pr'�O:Y=[h6zdt)_8"s 3/JөQ@12*dbsAQkAN J]1(Tp OoہS z});.Jluui{$6EN Add}DJd9,@S~V'N ^NT5G{G.s. `gw.VƾX*,jWvS(ئPj𽬊/2<#J!lkxvjcͤ1*VW `ۛe$4�lNPHj5 h9á[G<rڂg7Uwȱt$ic]7A>ԡy8^?;E1;ccC56=08كXDܹB|4:髦?;ux||<Ƈ)=lƉ@qM6SVQ AdY1�gNk,R\6%N; wd!Jmg,Fg|ظP2E>2%vgS[#R!3ciiiqqnZ*9$U'TZ!0VFSE^3W8vT,j/~c ){'= 9NrVu…x[!,;FhZ5LH B"6ɱni6@mJ R(p\,B8x('?t rʸ$.DtO28 5>Xp8x`걪u7<LQKQXI@v ,ib+hY5YT؄"B>U@]32c#7 7t? E*Kd$04...~O!s=З%Cvɷ{TՉf{KaR['X:=r#۷z7<kmbh{rލFy~g45Pnpgd4m}FiPr}=30wh&͚!ܬw.(^<U<b"k^CFxkkk{n޼y7꟪罅zo+g\!ڍ7ݧ/a f$%oA]@$(nWU(#- hvb7ߎFQֹq@Z|�Lj"Eq`;;) 1Jf utt畯|�y9,eY_d6c5ӄ@/)|l'Vm)0٢/–Ə3$p,R_&ln<1, Ef뮬 oX[[ATDZK=[&`0dBPL=Tȱ!­Kf0UޓYV2#o4c t7pG֮۾lllʯʗ壿vgXtǹV#VOeqv ş&N/sx6 Z`~s4 [ lҦ4T Ox++''8da$j'Tu;;;'y䑯|+gysr*r\ y[ ,{Ur=4\LӉa06gh` Z&b*ǙBAXK 4ҭZWҥK_W_|E=I‚NBK'HLbLƘH';:^Qvf3vK͌|@v?a{!Hi_3u-oy}5 zW[VT&{ERaBuCm!Xez�A@i~ᇏ?ϚE!ˢs!-I2lHzc;=j;d"3Bzuѭ0Dr䱄|G?Q&CGǒHiTNK;geׁU 5}XY.p cv[䭘2[&[Z!;MB\?\׷[9툌Aѓ`mv bUn{p25wpjP̿S)jaC47vR>}4~幱tz;w\vmssΝ;9Y;Ȉ Zo&SQ4n%:wxg<gX jٌ'! tI~|L'P <>ώ,b8&dkࡱ":l‚;PI Ch| Y'tRT'F<Ɋ kk&G5gg,..v:~OHdP'I4gڗZlQOF7o!͉svq[P׶.kH,gzB5bnxoP;bM QxzL*aBUJ3ڵkzի>޽{Q:7͹___|̓qS 2!LR>V&<~X?8uq AQg}6c/^|;oO>i1bRhLnVpAY{R,!n؆'S&-LT�LWiƛs Xc2 h1%$Г@fE*9`X=_8#]yé+0y,+gՉvʡY}Hevڕ at&SxTTx4"&#mnhfsiiiuu5Tp3`@IY J*/Gͅqoo<wN&v,η9mcSqlS3!l.SS7NIMg+:^\\|+_wyyׯ_GM9O$(%'>SjS|SM(ygZuf͜}2J"EBI]U0M6aV&bE�@{G@#=Üc9>trp4) s`W 6x1[`/<x۪bv <ʅEDc`.a zX1BGUs9C֮zf---]pjNh4r>88F[[[Rͥf=88J>l$KdB6L7i@k`uv,X*dqt3t:Q ᶜO?...~3zVj,lM3W/fi2et #]NL]j3VB*r"S>I-U'J\6fQh8l^T~9gi jM%1Z0KٳoFᜐf-ZC&@'~8f3 kkW*{/ \`hT )Kr!`Qt6q Yx}QV3SrV"o~*fa fjjmZ+++Fcmm,,,&[666fq 1/oZyIq{wܧ:ѩjG/mvWAfRgUU8I$R*vQəNWkkhk:Fn(D�z-|Y�ts;|FʖZZR>œtlu<6䔰*9xnz<9gr*~)"!^f&X918⇻5=%7,fѺ�@Â5h|cǃ䒳3n  s9A d2/..>cw)6h4qCloooooý=xR` pCrr&zŐGf5@!w}i\|9vs\rp FݻwiW*zךߨ;kݱ` S_+p'4`44t&`yԎCca¥-dNA f#�BqVIzaz20k%5n)`}}>sf0ݵ9SCr\fp6y%HqgB@ N&6M3ɕfP@)an!#ʕF!Qhd10\keؗrZJ˄Īo}}'W]T*L{Ze.]ZZZqV'bŗϷ| y}Z  Ngiiʕ+/_nZ/_�TR^v666nݺ&Ę\mZIOhqq1l $Ir7#YHd 99lj@"NɎFhlj%gY֜<ƽq;QJwsdGC_FrIrSr^@G�^~|vQiY0z|G^y9bPٷ9>9sX)ޭĜ)X?~$_a{Z(H>6vAj(baNR6^�cpe.QH\7nv/'+|!hy7mHYL[^^t:/_ˮ\kc2wUl6]_|ygg'LhvJK<P7~љ~6 .L&;w8fSL�UYmx<k%`"�+[p=JWD֫!Xqte~e=L-kh\PB`N&}'nݺ-3UUmnڧy9*9z/kOt7:H]DM453蘯YI8vd4턍܋GU<)G1NDVex}e49ls \p8|e!js 9s%Ut:fnw4u:zt:z8bqNIY޾{d2nX<ř i��u:pk_ڍm% [FuWMw o@  7kV]E[%VL]R"zcڜ]j֒+!4<%,s$ WkEFjY^ DM{ql9h;^mN#,GbL (Wݡ1eqOE돒$(-l@O5/0HϦr+Ȳr@̦3%I\a D8h4Cx7.qaCX�Vl68FJSj2h4_v- ILœȑx"E&b]p!`<TN|$PvaQO?0rW-@+ ~h`ws" pekt4 m=| 2R8jb1_߅>{2eJ<m?o:sHYį !�uG҂koCȶMuCZtr:C-^,߻ ^D bb�/Ѣt:P;@ w)X^lb(ӈsف\3*ȟ? du"O�4]>F#˃ׅ <#???ڃ>xK. 0N˗/S[C&OiOW5kC?<<6Ŀ-u /@6ˠ*场~G=>hcNO'9aX078@iL^F02w-pep!rg1syBʓO!E;uh`" -ۭ:vzr2pڒPd1bMT: #VDsƣҴ)XC'gM&;H%*C 6ȝYxl9$g9QH�=d>ܹCA*Ctxy烃 3 ^xpJ�/^\ZZZ^^nZ`t+++ieqyDZC,EC~_j{׈J4sv۟!BꦤL&f3d\LYŝ{{QY}i8Uō�+JXLҝ7E!}T($NXb dlL '1ܞ,@#`[V S8sW)V+7=[iڢ鼗s$<(Xc+'9RXSI\E:f ƂjaT>WI![Zi´A ug I`\ZZ|fpuca,,,ZvjnB&w!zWwvżSO^%��è 'Ar6GgFU|ۨ Yb.vYTDl`m\Q1,|.qkYVE30"$N}ZM½Mcf 2'h$rr�dE5OBW̯x47Nӌ7hr7Q>5OA<:l3'#g7 >+b!crlw%�]ofQ!c,&&u8>mfz'GU 8vF1^>+$a?,)Ru>/ɷYW$]2-y"GƒOmh’mNm AcJv)rߨ�� �IDATviUR"UYA�a|2U:*>9gU f_M Z9̓gR O䣡02Z�7+`KU3!@ƯAqDQ|GA Pǰ1ILL gJ4T.]N!D$GV J#z$ DZɜ2?d{{ӕֵ4摙q@SƔfe@JB|S@Y / zw/y[X۰7]sL8k#vڿl[ylY|ci{IF񲗽?Vc y93Χ %iYLvY$X~PX�7˱MjT$qXq&#:y+MJC;NUU[[[9p!V�홧44"oNRdj;W&@pHY.WVVBBE/nYt:A2㦝EFZm0W^E>5 Fŋ $4nooZ̍ov%p18L>,Z n⹁UU#,OӅl582Z$e4%A+*k[h]d@93c[W$YWsDM!;!ߥrk>:_o|'_@>9g)R0sόb<w%]tܞq(O*dP0~`֔<B|cϮmn'?SNFi Wb"bYh!WeDC(k%Iral6CH'd^Zd"iOӝ$nްj]r̈́L#H][["&<Gغxi]" y ]!+װ)o\:*zk XiR]-x-PbU:kΰC!I7[|؝cݻw?3,qCN)L z'Nb E`+-6v`Z,qϜ?76|>2!X>*= nb{]74;8z$ji>n�F *,gХ2}^^xy,{V?|s?q'k(y^wΝ||br ?7P 6 2d->=DsN}cXtp,XraƜ-%nQ"gh~[$KTiiвbP+`6x1 H8CD;ys7)HWURj?B[l.hTP0L6 gzaau{k_G}R"A=ߚ ;[|z`:nll/~]Lo0N`i />$$wrqaZuJ�>1e sK6'h}/~h4~Ϳ=$!@`1I/"zNtDp7OZ$._`zNڊHyԩ X.es- s3$I@y acHIDϛ[\M*s=Kn?zJW̃8Vu M\-}s?<ܫg#iNS8<3R"@t2!-'Bq…w]|||seыK¼%,SOU u@a^gͥ`6Y\s$.5^fyP  T!źxrOHϜ>rO֒0|\s4X]]Ϸ[?tC?/“'ťMB}{807QlZ-m+ܔn~h+6s}7?#Xu{- YaJM\ ;@oX v>&0QP6PEty6x$ xYBxts9g)�t2-.I-t]P4Zht$~Ν;_җ<�V|}Eܶ5F\2~&=78Y.siWMTJͶMhxuf_zy^ZBl6}caӍO/-#`O,>yyyZZeb\ANͭs,GoPsxOrF"0ɡ WalJf ˆnoz=XV 8zk4ʿُY'We~ZΈ\&JY|޾}{0$89g̐."6#Ñ4~8$TdvT5aBΣ>y';jK{a*5_ [e?GoUU5+Y$J#Pk 喧\qBITSWAL�"Vjk8v_WwȚuDx}畧h۴8::zj-~M7=ÿGʟW<~nG3䂄::ttt6ZBNdvSɍ8?81=2R': MMm'rϹbϛHT<eE) umf^<ڙה.sTR,z\持_ocA=Ϻ'qN.F{&$T'Z)9mib&`t~tj=?VAϵ(Cdx[h% gr@ÌsA`a&uCfk{t:ykwGyd<E["CQ*i8奄&翽K-_kZI+ܹs' q ܁;w#�}0CTo l1&g u~zπi+X�y͌|QH\jKM*QЊPQ)|䜃mͅ1:斦䥦azӉ7ɍli6( ^>tss^y9{dVK"}0R; 0?Tnxk:nV&We�"A i'">M~X/_sw~?Z}xk%BsoUU{A6VtvӜ@%ϐFY#27KKKpnG8؁영SWQ֧'++d:<t:}(a f!@PVOK 4K 1EσC]Yzu(6\0 ^{{{ɭGE #Ch- W٭{ ce!%KKrI)W?T@άDM/Hx3R~!~ 1#?Lt޶ #u iTDX9UHkKuCdڡbE9+71aDo~yڵ}O~666GUU~x4מ\m:N:M:WsG7IFk{z D�$766~~/6!I o^:C&G4෮֟野�K~zk|9XCH?֭[3vZJ=RcLA¾ Vdp縟ռ!}z+VfaDzUlBta#vH<6eR!E %=&?25~ʢavF!Jw:a`Tx*֓�&U395 yK0 笴hE +H,gk H~naӳJBܻC�5iwʭ[oo7G?>?V=[[B^?\:~t]W=np\0:'*E,0A+[ʹ"x<^[[ KjZ$˩*M!\8p677kx/o?5ʏ=^;M~?Q'%x<O=5f9۽^/lP~ww7a&&t}0IEBf%S25V85 Oجi>6)F i^&"hI[@e6+{#_#4;pyH]_@y$Χ_P` V@v>9grj47%*9@BaRc1!,qw(LJrlWkh1ecBE). r4`(yޞݻ/bGtxkUjvzhjߌOO4pSęͬFrT`TQ O꼀u%d &b3y xiZ%跶vvvn޼9N]vuKo~;窹_W]9U. .,,,\z=7*' 7)K"dK H'vfc^eoȜ(2Dke1ϋH`aH54Tc-Iz+ױ/j,@1R&Չ.ꋎ~炌AN9?9g@$HSWN|ѳ2�E~ fY( s6v cv+C&.;ܷHmm|듟t:z>{M1n}wFK?4]r[[>FcƟlL'6RZ.ܷXrYYxPńXM_^^|[=$L4[1<ܺ>ޏ_/t,1_57Gvd0$Ngvҥ|0p^d${{{[[[iu% t`O!6s FQʚ*u~Y0ZY: rku<%MSH^E$pF-2E{~-%<uo?ǢG!Pwԣ PhA=c1"F@b'-weЌy/V13 ;j`t3oMRr||Sw/'?t{^?2i{{[__N۽^oN\/[`F+LpdBW8]x6Nit:|//ח/MOt{>;"^r N'KPJp`@τ=ۓq}1ϔV'J Jpq+E)OrRѨgYՆjlhEX T8Ϻڦw(j`D:ӔDOd"8Рg}3A=l6z<Ac NNJp1aerU'sXDErC.I�W 5s lI.u^b6?9 - =I6K=h}XWsU%ăNhRN_W4m6O 9if!mh$lǛoR!E\ l6HG8 PwwwܹsՋ/Bchmm-:L2{^  :r{G^eQ |)}ԣpҬQYJ^Sڜӣr'2A[3dtx=I !CZ'|A:jTCȡ#�<mI *\F[Bxq)[3 2 L'`x\:fO"IOC^ǃ1?k`:yt~: qC+_gV=~ؘ)e(u.ҥK o9@ �,JM}I<&`#I6#c45~j.\PIIp)D|Lѕ+WY{(اy377c%u(d<<^:WfU !/vrA$ A[oYҍF͒! qs~{B) �}\j4AKnkHXr(q2Oka0%pb)N@ LNyUX#!JVn ΎM7c1dns??njx|UWZm;}6yWnå;s/9\`!`o|R?bku4ơhO&v!dFY fi?&IJ޾zr( @q2H_XXX]]]YYx"O߽{ݻmoo'wg\vww2x@[I-nÀ\܈[ځR cMy@&9\P'H[A +d wj\mI,bQiT3|YOi&Limr_ٕf[PB;dF$CΙ{c16zpbSu^q.eįvcENTf7-H`IZfZAu5S8?HW0;޿w8GGӣZRxjkZ-# dlThJ7\;a"疇G/:/Uiۻ 0^o<G,>ENC7XF1ˣD\`kk+L`wvv2DJdG%Ƀgt8u'W �"0LD%dČHfdJ~$O?[A(#;[A/,,~oTՌUA% <`+aw6fW?h+O<O1;Yd@D^'` L-ӽb֓=C8YB@VkChb -Xg+g>lE0<^9ˎ訶W/s Bn<1w¶E=Ys(m&b4 c0PF�<N3:uǷn^]]% k|{{;xD J8ظunL 3|*.<Jɤ5TqA)=b`d;NVps�^qzj�' PO0&A19i �6 u*X.[)e'f:sd.8'I]p,ߙ40LW A5AB$T s gE;Fo: 5+[i�!\UU5M` ['v/>M2E˗/m*IZdɟ@HB\1{tt8v>7\OvdggFN Ͱwvva*,/////onnFzg2C\ V ݛ7o޼y_ HM%L:`(`gm)[W=VH2LܒN=bSA;L8l -b9&Z 5uA`)R+{>iqJ*:rg6WLnoLDbLJ`ړma➍''Rp|(j-*-Պeuٖy~+0,oxnpYHMZ6^:HϹh$[ F"O>4o~}0 2s3rؐ$f4^Ϧ/=77w}-,,x<p<pڵxguA@簈|@|ʦںyfXyvyLfC"fcVrߘOhBW5y�� �IDAT!H&8?<2;:ǝct,p5B>4LxBL;0A-♯jIgmFĒ38DIa1fB{iy9zEo CntmDJEBb已a^/..޸q#oeIsQ=pxnUU9pD+ vq"XS#ݻwoܸIM(t_a2Em$-bOt$(fPo&w:4uss~_&*FHeye7k0vv; j?aΝ;^okkŞ29Īܜ[o Af-D=q:?kuu雮_O|*&|-&z'Bvb%`_PA{]mB^a `%mzD<OIM;7z)t<WԋL5fIFEp<ɣ3L1¡U3%,9p=gݑTHIsLu"No D֨ksaׯ_gӦ\O~Q,qT `@Qۅ̓MNl4!Fl<Ӏfۛfs}}^zݻfx˗EF_VL&{{{+++QK5<Sׯ_Fٍ=`THk<A_I IwhpdC J4w+i+wVcA=�-d:#w%A*QHRURlr5/\GSYbDC!!hy]~aq-ˌ&I3HAǃ Ͱq_,'\?pd6U"G˷+Cϣ {S8br>gɲܜp{(xbo'yгi&1HV,0ekWƍ^/4%/..^xquu5X^D"@@h41 Vo߾\_|gyCqAGS,$I )=/j괛_Gw8菺Kg^uTܝ/| %"÷dƒqpNf]8k{&4MפWX9 N, us" 0t =s9,SǐN'{^.Iz>OmJckT$A!7Y)׈7ɀ*h ۪<C^8paA2� ћ|Pzuܱr˗nNOV'>7oE=;Mϊ6h4zi ^h%CLB&ч,$� 6I5PJއgV,ln+++wzн/0GPڲMV46PNs 4B�ZZ*&cpm&&@WZ˱ ,p9~!юZ%tZe]s6!95,^8\qທPpFH|^Hwg,o t�PblfQ_7(L>k|omHCZABa<:Q&mYS('bߺukwww~~ŋ.\H%lc4iZaZW';;;4:`0GoХؖwnM0\ Fy\NNe^is<sD v1Kx(oY 4<X@Y0Cs*x-CCҽ i: fɂ7QI{z~#dRk՟394!nE xW:,qXV5'u9)> 5ca9㪐rrO \w/^|M31lT\˫:G*@-)+?iCՠ%͘dY^:ѣDLA+Nn&PZu:ܜOӌ㭭Cyv pJEV)V,/�fc�Y$+ɷ x4ν@t V;ys#t`%fT'bծDY ;`{ ,.k)"uyh RعTurΒ>͔gMs_*ODK7fc�Ll`ʞC31cU'�Sf$j 9 PNɍjZ p<}=77v.�\XΎrfe<F+MЪ1�cVYϰ֐jW\ID_^^nZ6ɟG KO~N"mpxm1XI6bd;H~uMˠxqH36e6zsA^m;ׂ P ou؂.óGRд !ǚ7 {B`|`٠K<=}`ee% X ZdkQ8Ca7f!Ɋ/X~FޜAK pg'-٢^ny晜Vg$"y5]OcH1AVpUi] 2I(i=Z8C�A9eJ4<CF#f6˗/ I8P^=Yy!^' E.aݏʚw.VaRPభY%4ی#5iS<fMI(!"EFED2RI i0Ci,:Hyμog!Qg͙aiyVI%8mH2 +llܙ[uԳd'C( zve/{י.NfuZ ;-~䶄ؖ,<bZ-ˡ*%, vrTb|=Sd(YYY:::JtCs)9xctQ,42d'аy{1tJvdو/0JcsOA1]>ѱ'w) Л 4!$7q$W>zMǓH%T;Ot4s(�OJsY gzG0h^77J`Y. WĔqrƼ�MK'|9hS{&hy7V'|̋sS(YV30ܼo֐&W'6 LOZT@" {{{+++͛/^LeVׯ\򲗽,U$R WsQR1+r7{n4p62!XJp,T\[q\4S+?ohGl ʻ[I�ڵ|Av}@ߋܢ:]buA00߼ZRۭHw3GU!5)@^ Õy9B}w H"i*Ac^6,(b d> ypʋ MY GGG/[ġh{狇9f s-43VVVN?}lB:$�dii)X39琛s'lMŋ tJ 1Ao{\p<R$6/F8I CAŹ:L&f-sDmV|1DY4 چSr<eSOLDKh0٣b;4YHWL)u@ˊO1 b%G*)<c`Ԯ:QlB5X(tPB,#bh:)XCUq\Y}<X(N�Ф9 A>�re}>F9ہRgmm-4#": U4QHSe4/8q7A"W+J)S2c(UU-//jS/\z/8U1<[ )s%F#KSHƹ e s?a{U"j!Ô0l!mșN'1M%w}\'>KX,:XDf j�0]1W`,goYC)PٌdqI%)yg99!;Pt)�^NcТHCszEg g%7 0z� qXI= ȉOCW/nr_[[ $ງ~^a6]Sv&"FKNKMrZ2:NU [)43ge_~ݷ7<_k[n[MٝܢFyIs.N.\+P\"Gw٥rБ]m(% O?Y�dW,F77Y2nvI]X[YQYotjO7q ATsfO.z�? Lf%3òb,sKgI<;Θ>U؊ߓwpJW'"#bf޽zk@^$ !*!F"o lf798f^3CPʭC <\MBfh4n7lT$@! !nH#@n6}h4{U/ WU{۞7T>esW X + KT,ٝǑ `hz%@@!pqccׅԕ+W^׾⋿˜ @*9@Id%*F.BIOmrvS.'R\+vY19tr͚X7CHX~MIsM$c#�Ock,lP"#MF:- K)!>Ȏ& -k#cY;ӲL/,,DRӼ�˾nlq(4#}f&0x9N}@ƀi9BfV]|[߿ƿog^}v6ԺWDWrJ{B7)Ld<6k;.y1Ϛ{nq6s, ψ=m$Rmgq̘=[o:- 3.͔#'`jqG(7`Btf0,iCW=rЏ!4sU(=?ēиy}요� T]4cE#VO-f.[Rٶ3k"* r ZE?8Jԗ'Ї~N L& H鱗 OdA^7MfB67~tӅڅn}goxgwyg988Ls6EFXp`q<r|٧O6yxӴl \6sT|Ī/~?< v4;KKKB shŬLATw% ct3 Nxғ|-eDQk-$[�wnJ3r�?<h"b@A}`a%y%9yЁ| Hk[ݝȊwg,d[iJ3`6)Ƣsf7BaF~w?Kg݃tCUW".ɦ779iZ__Nbqgy5 fVU;~c7^=yuUUK.\D[ nTcGQl9tr>#9htU r8*@BJe9ˆYU0KEFNXi뜪L`<`ϱ>�Ƣm)6WrvF_@ `ОXgċϫA==1H54붫&\3Ƀb$}/>$n{Q{5 RTNo@n4#sgankX\OuzC!I*#·&Tif>p!mdU$e4ܲs3aƒWW9ύ㪪rӉD[̶)QdN%D@mՉݮ(Q~3c7P]<H\ â `22?0;Z;t;QᮋjA@%6�&x �hӑ|ۭHd{p0;P1לΨHk$>ps9I@ 2b RD 6 ,G$6{/<E/--A -@XT17KKKK~?fl+ΚcCIN#;0ukP9NRTMa\3:Ꮽˀ:3<vƄVh'ht D+s??nxï[?h;s{ߥqmT=7$n.lmm-HtctX!0EXi?92:t`\I." fm4˞->uٞf05V=͂d6c Usf=.Uoe%P;SNUR*C06 "ۣf.?wjCY7YHX _a|nQȆ7겠:-(sl�٦@|n%R.۾} ʀ+M0rBA̵x:XT'2 "bF}F()/pb:d'L铁Ъ⬓#g+xpoRKoy[}P߸qvc{ͅf5(z^,^j/ҍ4pM$+HZ{pQ�<0i\0`TppQbʞqiS]:Y e@6FN3z1[Mh[>5 [`<_.<ChHB34̪&$n쁐�nxTBZd`dKKKIyk℥Jf1qfn2I";F>amL,uwq&I[A@$I]}SƆ !o}|'?_ZOq/yÔ>QCX+@びIV 7R+Ӿyܴa̻ᒌr(r-TS|+U2�{uJn0qׁ˔iTII֝By,Y`*QTUx>u64 mֱ< i%u0&ɾ !h!ooB۞".=WaO82  e`xf;yM 9hMnwnnNȞFu&gH�Ԏ:4qܸͧq=<v]w'k~O?\_[bbmHx@?B>A ]ٮq|),`N1Y g3,[+75Jr8 pkyFZC][uMa3B4OoV;9go0C 5 z12#\49(a},<]'t2a%p{t3+0S䬾8\�D {ٟD *AD451LUUzG!%!_ޢ/HaNN~Ak4u]foʰ9ZČ`gggyaǧ?S:>>L;~ѥZU,Tbfzc<-n?OD 5/`( Β.+P@M^9+Hzn#ބ]$a53b acy48dfV;5~߲Fͺ>2`@ VhJ0D9".<%} 'g_\v00\InKb4yl©͑>}4ϐ$RvA^B{Lƣ�$z0 Ӭfzk4Ғcf�q\)p1\q[^^6g2'}8>o82r7zG<Tpҗ~d@k4F*!3FPK2Iɳ�� �IDAT!ޣc-yf /0\K% \FNGj!t^ d)4V{rm ScUoss0P;)|fgAn9XV^bgaS$D<ep}wj zP+{h'{I1S�e޳3>O@#L^I'3PSZR<*’:Iwb|m:5어@ S>VN\D`)h-&Yl4v8Ek=<qۄiQjL:'&J`PJxzRpdЕQA"#F[j#"n@?ۇj+ܬxfvޟG$괵u*R&\8m Me_zڒ FG0n_IׇHl@ρ3nHvnd8qJ/"Ϧ4x%={ʹ1hY'R ZnR%NOSϼjlZxـ{d:i,81Ϝ Du/Jl<12(lZB/Iedgie~P0{ gh4E])t60,*U|MD NH3k3'wZ'ρ^Ы\-(Xly*gUKf`PYD4f$E=7crEc`Фu ]D3 ax6qr.jg)s4e2TI63L4� ܬPuR,Bބov3)mfu[qQ/+iY凋A4{9m6AE:1ԏ2byy9h4:<<~wlja+ !w>~3r]W-%R&EfEYlp�ݺk@ApѴ/i/QiKJ*d%RH-rٹϙsf/?oG/μVs<>oɜɉtoPBdy\[>5rqqǻ5>z1ͽͫo擗S.gz=ڶ=Kޭ<+)Us2ڶ{)eLp2  bJ 2S y=j"Ϊ:ev.(w1T{hlv?\=`,,,d@M,g=L Q趝=98 ؟ʲpI d' Qz׎n8ctn ']c6NS 2"!BIE V#鄍TyNJYD6;; ,@M0!s^ىZyAt�gҙ*SMs  YR/Z��ij 1b�b2c7cVFi2"Tuv�"djvxVuJ pj٦h;B<RwMsE׃fqp4!6bBjؽJw'uŊhA=bZPid_lm†@[p,v$e[*<6-C@H)D-NX=\Ұط-g;;;n6^ˊ~?X[C(z Ǔ!0Q<+ BnɓY<vherEL(ӐرYHg]>XPsI$^)<f%OX^)@1N3?`Ce <7W۰`BS$@iBENj,ʅX ؞@N! 0K۰Wl'*18ǹ;@]jzzޅ 2 grju,8Y"޷"T&fs*}P)W88FʩaGKO' 픖/pwЫchi4Нnnnƛ !@s#fNd'H%o1<g^5Ԭw8>|_İ*us2PIM`A#*(+ u(nifN\$#4$m�4k'.L|7$~Pb9c 9z!1ByZ2bXQOҍ7rNhAg^ un'2rlp5dv(nbfȑC(23S@^&Ujy>?ذT 2aF!DW^ye{{ܹsy vun>3"7):3mv@.raa=yח&H<;s kBK:FȠvQFQ=qJoHz97YAkse1'UP!L_ W <_6Y{\7l�-3 JjO> ~32x =YRI|i!cN Dn$k>6��S \6 �ΧQ r'/ 6\adtj2M$ GdrQTŀ8nKfX' _MFlw2,+V75"P6˧;w6??O>&4HөH"†/։'677/_ !ﯮGԦyki0fAj1Zd&๐O d5lؓAshM#g^ Wф1Jxv)v%S ;zg}66qU�'ʌj~nMX`CNFNQ38rF5xCܲGovrᇵA6|n Yio&Tׯ_ϔ9^ߦiAYzBXcD`H 88F@ ӎFi` mOdS-2FIQm(~І+9 %XG�i(XMFV>!>+++ߐ]XX8q@ptè{↎l�_brܟY"x r1WHr �"jL~HֽGn \F~Rly'׮]uV"G6Y1u8 ^CN 2,_@co+DwzbgHGshS-G^U `�F `'{jͨ2Q2{һid[3ū � ,Ou:lvL4?Vp3 >-G9',i[SpȘ~͹Cm8^zɓ'NHP}v<xRP`{L/.\>|gg6*% Q<XHåct)K%9c8`N)X7ڐEebiؽE�em('ͲZv> ¤5LP-KYNEj$2rФ09љcSRYv!3pL:64yo`]o)S{DL4GjAgqx_#g8?0FnlQv̠&`KibRtZXX@v byAM pR-儺ur ymm-Ի8%ސ:p_x̄zup6P"ecmm.2f߂·ExD̲FGۡMID*^=EF|#6p<*o0t՜PLkQ !v`z :g7)&衩ar\| T98s NLd+Mږ:6Lu֑eP2iW}RMvtths ˙] �o&Ź2sɓDi o9y/Wg&37FOrI|9E񬯯=a$<T,2YQ& _-(Ns=2`&ۡ kqYFVn;AmN)+eu;bzϟrYx@E^[vV) f8i�'d4A$V Cٮ]sZ29Drn13۶x4OT,C$e'tEn]ģG\厂8H"(i/YEpxBZ0)<@m9gfffhOQ0ż`e pQ "@t8HRI=Bɞo:I! ؤ'úHdR.wXێFfozuL',۫F ִ-nm?'UslFum(pσ9-r*c1r`ªdfT2b eS ?�Z+ųgΜH׍G+ښ,6'IfKse4S2ch')~g?P$0誄vT&2A>6[[[yx% 9Dm֨M`j2QP"k8HJ0iC3W֧p0DFǘB5cCP=EOLqiO: +-Ӕ.)IC`4JiJFAasH=m.C\d$BI= x s q#.E']hBXp!fc7IKoIW>̙3O^ZZbr"IMޣiR1%VBEm7&E &GT'>W9ٺy*h$SMF,Je)/{1k; v.1`}}=sssY__g�Z3==�,ƍVMM7??kO8b6f00O|{M!e$!hdbTKmgwxY5.Ӿ܂)Lt%J!Kqc6|0눷2Ӥt:֯i0??ba عf)&עN~!E6֭ j@ddlX"&ᵱwECQlA;+|X-75k/Nnٖ777Sp0AvqfBki&*gnz}aa!jM ~v;>;NC=z*|il̎S!乛 (Ӡz3P.~0lll<y2"Qܕ(a+R@rȆZf3i?d' LX$t?dߕ[h6pLd �~ZGtC}9BXQԬt¢G/#c~#LU&ra @:S WEJnr!䰎5hheU1n¥MSa%wpIӜ)H D3 !8lzḛu. c !IE5yVV'vewǜSp<&vں<70 +K5G!4q4N:E뎷`ռ\dp$ZPB([ _Q+Ҏ6|ç*.YBVD&~v ae3ҁQWEeeh�gGsC":sa2Xe8z χ `ԉ^V5$tr0<QSSR�+?q9NZ6//NiTab_CD,=RvRwRz>':P;,kh{P] VG�&Q7oFԲ`npĠ A&ac4q ʍGU( 7 dSjҢea>vhb7#P{;Ȓ`_|EH&O/!0#l_m5ОhA97!BN D5h#٭pbC#xMdTK >%,Cjkrt"l>a3ŌXcذ mX9*pi,zNYL$@w(VJ@zSF8a+ G; m%ӦUƭ'[鯀+,OU5IKkٟ9oΌIRڢF/7DRrqq1 Hq> ,̍ZNV`ڇlhz isx/yb`m zZo6 5�Fk5kɠ fPN:m=_�į,?M |dB+P rfb l.n$ Qca')&]LhBNRPC'9f܃i̩ɣ?16!$%5QBn#<(x(y,@iҰ--eQwwS_i; HD;b Dd;!O&[GKFVUNOgxTGN;xplщ NqZa?I$pT. G ƨ<d>GAJ߃fuj>ZCqE0Yv_u[wtv]m$zXkl�:s{.!8 t՚9B.鶁51^GRmf6=1U!1 @e<h=FYs\U6<&FtN|;y@.WjМ#Nscp;?SDoLЌ.9YrP^/B=C̔YBc*MVPzYਨz< -R1nH`3ÒmsS6  D5@ae^6B:}/CsifZ;j7e3h8'}.gDz#^;f0[k�WsB>iML_Yo|ggN &|W!gdq̂T%,wy-S mm@#x�,I^i0ZkaNg>H=i].,%UHe}q̴ 0ƃ mKӅoɒB27773d$T#x҆h l@B>gu#<4.sv/:7Nr*DhR)F1aJ7IvTߌqwоMW#.Bl!;!.NpQpy~69tf%#0|{C3ڦSSSSYgWfNvrqqqyyyo||gg,0LI_Hr@dwo(aelD2GPfv#:"܋K+Tr`Gu'Rz!4/֐O %SB<< #C 3iW6;88X]]El >OYzfCx\ iƵUJin'2`sP"Giɭ,Y6i.dKZ.2w9H*TN0>/ə@^#OD-nGWZ/(.]'ǤDq9*(K c'C3f'T$v쫳Gx^z'ʍM>}f&! 0pv@d B'c57{>])LuF N}<ywј4ٷNs<csΐSN 2(5ǰENs l)?X3ά'[RmDCJnJ'o*h>-W*&2.Ӗz4A):Hd gC ^h�-rƀS2NҎxq8'�$IP`w֙>RS':ރ{ݹWo+?W>Ou]ofk_jgu,}c^N)\zJL0[Ԓ#GL;H-0J-h C՝|iZ\K!u;Y �6ɓ".SP�Y;cc#Rs 333cvt!Ki3Č$*>4u* [_,6[g'9\X} \@TsaBcq`uL~8AQhAsBVrP8`&t /؝s<s xŤ!;�� �IDATWY\p(B[N[<|Cx?>_?.}yKw;N<}INRe-gzYw}qQ,=yd|bWy3Cӻjww(ϟ??77sVƠWΗ\iM]H$,jUrkP6774!(o~ee$k8<y2_J./`'$RRjзNJGyd0ˑW'Ja �(:}cQ t3aӎ:l6 z8cfJ!@1J7χRՒZ0mbևcɹљll1* UB_җ|xW^3N{x^??y/�-@Sft2TA0z64XJ%z44`sfG{/^9࠻BR5Y0C%z]w/^D:, MHWBC ,:a‚"GRH\g?MQckQann___7IL2H.jɬ̈FLr)b<4<'1  4?Visss!O;1xS0Xc׬ 9rС1X<HTMs:t7}ns'Gʣ?3Wӧ;΃NFL9O?GޢQT8� q|dXv!E J/}iaaaccczzzvv6)F큰=�42]fPۘ9*#6PaTq1~[n+($B] #%9A,_**̺U=ЩS^}K.UBR)gwr8F蒑1O%6͛7766McĎCh>yi('MRhhl+Bae*^"nMO-j� a4xE{innn<s?xOe#n ve3I9#ZemGKc_}uss}~wStwq`07R?8wʀ٩ٰЬ4y,dmlN| Zfxr,!Lvwwʕ+9GiFT�^MqPF7e\[gW^z_gJ,TW bg{{5#И :,//~R$GDIWD>ɨ!Mo~suuu{{;u-oUYTw/FȘ@VVL�Gy YC.+,mO1 vS=zxqilSNMOO_~ ܸLƇ[[[I]i$i<=y䫿7v?sA_g7oބStp9.GO;c)$Y�VF�mGf#(.Eu9oQӗ_�LX$v&$ Ĺ6ʙEb7d^tRN72hG on}l �I4[$VcL(ʘL�Zqd3^x=36nw}C }"I9@(Bߓ�'t]ӎ:=9L.p 0H;XXby,N!8fff>eTZxm5@{;h"?111qcbɏ\{/z;ϟ???y'.yE+hK]J'*;!,q6iD[ӃfM7�q^V.4ܩyf1[@'$%Z޳OgZK'6D|<꭭-�92!34֗'Y7lMNN^tӟ̋/m7)`<oc[!L9khޝ'+#`f-d OXipjv-! æ6hr *@'*v㱝S QpC]͎$ T^q!.s<?GIsI-xc#U8Jf=j(diJԯN]/ܗ?᧟~'v~OLLO`b XljR1lwXsMFc s`tx(QS4w߰/ɯ`,@Gaaa!>77f;ԣC Jt0Q4 |3ฝ)4a6Y#`A8ZPScRfffok@jCt"|>Eu(囬 r%*#<fZ G<[ӹyX *E6ƾF|ތGka3a>\y6#�ȶ +;wr' ˝N'9z>%Н>d<LD)f ??<?7wOɝC;`z x0e ݌_zӧOxԪ_\gK}dOs%ݲ�}dOӰ#/- ā@w ryzd:%HNw︣折SugD@n9f9Í06K2 Gԅ8-�`Y*/s3OPYWjA&: G2Ì0<M*Z:Ҙ^b4N(%2JKs;i��!ơJ]C1md=QK-o0\|FOY|g_}}wwwrs3úF̘D $DCM6vPϜ9Ͽko7$f 4ٳN(:lJuut:<p.`0${;UJJ q7�4 `_3Gl{0'3$E@&L'؛Op zt N̍�c%t $PDX. %luКWI\nz0-'t!Yn$NXu T]-bm%P ݳ{(ʥ'19@ ਵ5YG"% ފ.{&0pw͉ef3L033e30dܗ.]2XFUr 3t3N;/@Vc / Y9)0%;[ɑƱ{` Sw2ȀL\,tt,=o7U*Q+{w|#Y[[{']&?zxNO gQ p,^xY{4,ُbLV[lݍ"LOAVL.<1O�ASC8AJO mm#ƅq{03֋/ lгvT&إ1Mr#ϝ;wѱMFrASwA=ci"tI7@< R}>qɒإ󨼍<NIWXnD!FL A7lL'PzKDS k \r;td D^ww/--A) 2,vKQ3qRijt*meP9 J NdIqҲb2g<t8*"Rc`{9E>>`[z^88q`|yG5K4$�d(d⬶.EjڼrJWWWܳE? abs< {�M'/֋-R UyOz E]BQ@Qh:Sv iaH9=6~⿱*S<.YkkkIy&!n] `ER3|}s[[[Bq]f 7)V4hp3s$Lzf2eMxl2y-$ B5C*$3 3߯uubZ!~@E"ؑӋyfP&߈קf13=d7 �-Uhf9{幹[nHt:衹`sB¶5+9'V @b98O4{Woo<☳5XhRE<uRɛ:qe$n1Jrq3!DV5IYQp~krA1˗} 3َ̅*NmF l"햛 gr%7(!IdQ1"NzDxި_xK<ʎǜ[s%=.qik8 M3s:<İK[NE(=B 8@M{[ M=qM(sLLL}Ν{_fMEl͡U W�Qj֜>v4_gKn3`[jɑǰz@6,R F _l]0㓹f}MTsrkh7YJ) j@3?h@<Zz(pK&UjP:jk;J6AT&0ncJHs%@.:sUN$ !7EfXz%#z7aX|A ѣ.{*?I@R& $Y| &q<5x>{*P>t&�bA@@0I|>rEjڱ"blji%�UmnV}r_3 \C�:q6qKkqτt%ڐԈMiGV$<&0,l<ZND (8{fP܀hYw|C5LjPa9xtW�nEZpvBjX2ri]:� Qpcڌ Oq+! j&t/ݛL#ņ)tot#b$;qxs˱e< PukY@yJ5r � !ugMyW*p94,Ek#i<F0B^77R#i7J",|BY,:yxacZ1J!Aˇ{:<577ypGǬƆt-W?9AHz֠%ET(Inf@nyqk”m`klbst:c#Y_eԥك]n6س vpBtgJ: _*W#d<g\lrz]VLOdJo^aJt;NZLsg s0‰5-,H<~T/m>'ѕńx3GTzĖds{5-+ 35S xW,XA$SóD\s(kװ7 ~A[' {mnn,§<4kͲII my;D#cdYwPM6mY'.}r7 j)伞Q񽼋<O)q1_RsssI*S6Y?՚nڻ^dzlSʲ_;D0hGD?MWmll2Ϭ1xd&R`=qezI uvȳ3EP=kn- ̹[fPq3{IuΆB!f>N/-�Ca�zgff 6ƽ,o\ :&AJ6ʯ A5 \6%QkQdMhFF̋r7&A'3j*ypͭeϫv(i$)ؽx@$KUZPN,IIp= 8ǫFmt :T�L\("ɠ-C!em#r Oo(hB+>*0�Z>IXk2ml)w[0@*!نEKЀE5 U؋@rZA_MCĶ23kb1L `Sio Kޚv4@Aș 6s|DL%6vm�ƒ()C WMvp4u9M:+pe<0AiviehR^]m< I&\rQa Y)OY~9E:57Ĕn69Y-c3Ӥ^AHmo42[֬O&F)r|[b Ϝ.Hӧh& -q @\YL( oj!q#MFp]k Ysk:^8C1i)sK ĤrhuYY^fAiÉtマ}c{/{HlWJZ١>+}Z렍CC1$E%=ڡs" 8`=uTd[vw:�tfff*wj1!m<y}{߉'8k2H}gxO oi-@Grc^N%\4kTKE]hE0Q,'Ioe¼5cŔn|sIL8Uf�o&&&nӧOjwJJki3`_a1֎?�Ԙ2u>C<o1^E�.8<lA1)ɓ'cbK/]~Ԙ89p9QQeҤ5IN5"ɠnjZ;]w5 ^yS;mgVHe\] ʘ=PNC`>- &  KBN1Y)nؐ`j(5ш�̪[(+mBq?[#p/_pᥗ^Z^^F�v+uV� ]%Xa KX@ WFa}c3`!ܜ$/I @P73%6Fpx`p…K.e< �/w#,dVǘԛ+[;QiS<k-mvTzk4]|p8|7+ŚPuj,^0R[]sp(!;|!@anzkqȵEowwݚ>D ) R9Q2k.E"0#1mu-o[K{H!EX(foM;"ԕvT[qӢdU-99 %\ ?)Ol%_KBD e ի1B,2%k.~g(L.:y('tR2D7M]+r<a lv6y2zz`ʛV/y r sJbi;.'| [۟u*xe ܊ JLkbαe\Ѱg9Qs1qN@v#\P vPi"[62(ǗMC6B4CH>!{9-P@W\PHazr `em |ʕ+ r./LΒ 깣 紣`ofO`]P"P'Hc]kͱ!7>F|{!yrY;T@-C}6̸X6FAs:(.oƢ`!g9sF!s0PB[j` YԔN؝@Fv7$ .e4 x2= R�\=n=4^o$^DbOKƙ"t?$ae"n!Uh(cx̓ǎ&6|(&w>88ajtf-'#=BV޳v))}fP-fnnﯯ;-nAN.L)y,P(63!lNgˉ) v"�� �IDAT/=u-c.no!{B0ҊҐ̀OhaB7ˈ+ 5�V,Β'f ˔zIq;W{7BsL 3Bfw ^k<"3. jt=E<U F4Y9'nRMAb{l^]ű>X+>.ϟCLYe l`+Eރ|LMMhP7UZ$@2@64?,RbkAx0�FgrjW&g#;*x!92Y̻<I@1 'N P.Xx>ZP S1#Nq~)C薚 -XScpĬ >^*|Duɉ<Ioy*+$êv_k+~3ӌ$UBX xZ>=Npl7ތCN+qRMw< #u=\);"^sX ʦ#cCRdǪ2 28iGE3p"<SAA>&G+Q5$%An;&I4,5YN y9P2~x�F,Qrd\s|QR@K,!=L6A�•t0|@j b'(( <:saZF dk4dP@Y\\^__i1U8\F@.#8m יOr(,L> Ő:Jvq�:<,oG51r?sٳgKr:M>A &t 9E *x@Nd !F1/i PW02iGmީϬ8<70KϯTI=.2:S.noaMDSD.=2%ؐ;#^z\'ˆf9)VLC`ao8<2[,~^/$mD~))CT9MWe./6`2=W8 S~֋9ѥcs|bN'sidGykײUߡyB2(\X 3r6X9(|- g!nYl&ђQq{C'!) 2t$rfL1ѤI0O7k)f3#H KZ*N-,,lmm!4qƣrV m6 #*sd�(MYlQ7`� j#t?�bXǩp^e޲M v8.O*VC!]k39&ی<\IzwiN+ @|:QOJ9ޞ FiJ?v1+ h&[h;:W+<yd YڡNѽ~ >܅-8 b# `̯p)K89J]Ev.v;*[D<`3oh&Pfzz??|ʕ}k&Mq7 |TS~;*Sm;gPH/1z(N ɖ9L4a W<bǐe5TT`s!I3u6ۉ<ArXr-S:aoˮtp,GXL0mzfffuuussӫߣE%PQvt8Gt3I !r \r~t=T9T#<&LNm9*K ,?'LO*AKl/22c&5l*ajO<{'~'^x|;[[[Y׾|lO'| jBݕkˮ|3+N4sQ=vGLw M@7ρm\3d�70ΰ1+շ]IN<y]w߸qyXd <<,\sHl[>$ 83!~i3`D %L{‚AW�4:->9KtiryesG%=ž[^//,\zD<dFt'`ôsνy#b"# jkPxE�4 s8x3ooo,+z )O^t֭[/vSd0zHQEgzz:Us驰2aP1 Pr$'k`3v-W.&`=g׸s?�8$C$b?6\@gVi#:Wt:Gy''/^~vii *LC6*B'EU`ot]<xNUcJ$nEu& NȠ10; _Nsb=:%;{L<&M%*G-iիWStݹښGRtI3D:d", Vjxh <(,G𫯾[omnnȖ!j&Rr$Vf {C2\Λ"f80UJ 'M,U'C\7)82Ե d+++1򂬕oJgA$?Y-ep3^Q])SU1`G"_oZWeGr `~8N2k2pG Âvi{٧|Q?#?3dpն4?@Pe7G)MjǬ|nHfX` ]qm 6x"=Nkv\L['ueF4h}8T$XNVj|ir]KfAIg.B*xBfZU d } 8xD_zK.eIӽ}{�͠ޜ;Bpu;J3mikybrq ɵ�V>*6!69(nZ0J i'� IyS�tfV^)$kkk+++9 4͏6Kr`5)"*;[G&tjtό\C |8 Ws^oe&".jFKG (bt+9:(-`}DгIܤV r+O*. T0 p֭[M2bƦۈS@;*bʜhlԠhe.I;ݣ*. (jE8S #B=E< d  ifυיs3 V9`!-iPMن@/=Ī2Meg)8`; <k[Cm??qD۽|qd\�gגzynl@H2vTh Z"%Tb ."X[[[Ks< )vu;TJZWf9Xv`n%{ʟ=GeuYHtD?A[p'V"3XwU0t* DQ0=r0_QU7Ƶ)S. M{yha LΎ2lh0Ӡh!x ;>p" "V6( }?WCX= wHjfI_Ǖ[1XXNˤ(aj\|>("iMxƹ`OlJZ L= dbw(7yyigJ#CM^�=`-gH61ў< 0kim.< B@v n!q=E9[ ~̠u rL!&c0ݤ"sgO(Y8g)n:\n}I3x3rdU;oRxc~²=\^,qh!cyͶ_+ g rwڴiJ92xfSH.zHTZ@ηX~?E^e MHf3cE"$@r1F\vGߧC 8oq9^Fxg.8B _ יI)od[Y >5g<i-.%& R>R^ q>u\Na0,[[$س#bWYNXL 'ȑ҆PwPS54Qw w<lD-!Vd xeRFU9(S,G08o^M<Xf *%ePZQYg!,鱬I04 me |n#X@!Ve:̮bTPz�"_K Ҷ: D9~Z: 4N L {ض#Zg蠰c u( ҩ6CL3 l9ΌA`†V,Tz9))fE95H$Vhtْ &>h@S .EYyXn~y Er5 xSgggr<ԯPh@g0ńx9F` H HI6>gB(tjY]"1>$Xbx؎CΑ:!YIՃYgqr7jKqġ"]ev3}rXѶV .iyp~yW*B9 w8`.LeK�o/Qn3w;^p4\7ьi E}V $CМ 2?ҫ~SbMoLtP, H_O0QWO_* 79hZ)fggO:v777U3T7I֟ y7z3504|Qѡp=mLote֔:yJ23{X]<QWWpGus91+ m5L({ɒc&\% yXU-D̦Qhvc|+̬g0,vŒ c6<99yӧO<Jv6@h <`k/rZx V+ O8q=knh<j:l5NVdiS=!�>}z~~4 )Hݮ<s#J[d.p7` ?i^n%cn٩"} 1Rؘnv VQ9jqHRc9OFxٳgQcOF+ɓ^ppG#l ȉƏI\@Qw۬,M ;]bGzQ,&fWY;7o_\\LP"[k{{{cc1`fffzz5 Gg&7,<{aIgjL/VN,k{3ȉ}}ٳSNrMS3wtѸڹ@X m|࣏>?=dne<孭-H7ԂXb3}xS4UykwSv_͠t.uvv6qDeNI㐹sf]T0@bea> 2;8֎B&CZ?;;? 9$n7n(#2 !zp(L 04D[9,ڡޚ'5Y^.ZPPD} E.ja]ׯ)!w =|_02ȣ.$N ޝq 躷sRyۻt͛7ۡ?\=pUNIC>Oq 9Yw.!]1?9VsT\Ӟ 2HQPzԸq9,BM4*qLC%jB <R;  REPg~.e:dtks8٩7Glcc'zHfsF5iuȆd�.�T&h%<'u`^ ֲTl6�W`s2992żAfZR,PvWVV(JJ hvnǕriQx%H"a6Bt \1bق)CtQ-pO?󛛛af {pl{֦ItDnfapa>Xg1L?kPeEX7, N9ư)6iQjcW4otE |2M{vTӛ=UbځBPemGq|pC>/H-֎*7�[n"?6t`-Q w8]7#syAr|R[ϑˌ\q^[ HÒ@BL_\O8%92j/j6sEֺ?oR;jkk+nմ7^Q>H;˺j܂xAozNlF�d<K6)yA!lS3q]*vo �U62 r< ]X+CMLLvmnƍej4o)jiS(zqHb "n{ q߲ N>Dqte|%�<|\̚kpiBBZ e (:kzk,G=`<SxD\Edvw}^_$x QH2OuS|$P&pEJF_V^8d Ja=J" 4i!@Hgk@ad6ҼDT=c}(T[7kXG|׳~1%T͚@9 FU A`|faYh iZ6o6T ';ƌ2oۢX$}.%[LMa͒X6a=$V88:I Bސh{S<(lJ: c"W Ѕؼ:/2A\dOʲ Z o}vv6 &XÚI }3UH ԥ6,NܣWWW Qq[0u%, m<(Pm?:!x̙N"s<U"PvO>omm}FԩS{{{nr ilʬ>YGޜ 륻ä| 3d7kl,pNx:#87FLāH`;zHc)cg 2=:Ñ^L [[[ڶj[̿oE7˖x ci8ŕi(lc#8{dvvT/>Cjdt4_AB|'p�v N &k6QVfji5Cr0$# E&~򓟼~K/}Qf"I2&Po!޲=|zZy(ҭC͙7,�6 +5s68.C#.$μ|x8opE% `er|ⳐUd;2kn֭/z8͞2;e):"+rʛuffs{ەЕbXP8R=i33\7@1H,|lJWËnG=ۡ.[QvMWXf|XQۢGeم Ҋfdcwr FYQ i\v_fЊ88,`ۆI5 <N}"8cHSi�&EQJxta^MP6FR>و"%I7 $ :OxoCF<Sb΃H~3 sqƥK|;@_Q^x% \U"*|m"£s[d{((Wy#b0]RAel%j_0K#S>4B(mt}J"6Uǵ{&U٭,{dYE?}aQkB83t&5xoܸ[.&-">V4QX7>KQ)977g;Sfp:1>yꩧnݺy @΄|:(M7ãvs&]'&mv*`Qm4I~sUGef &q@sH P[贯#�� �IDAT F0[L)i]IJZOL_6]D6cE lG9irDd䙤kKt/2R/%C];j,PyM)̓D$"|W='H"%})tx7UCx`5dHRI|<3S溸ydō~+]YZZقQ`5.*1cV۞pceooouusZ2VHh7n|__ZZ �H6OѲTWd8e,yΓHTp,\d*kii5ۛ򔹜Yi4$9#?BCԃf4{Og�Haaٸ+ 3xA_nF�Cv|5I,!ty& f*83Wp+=q Jgӷh30^m2فKN=p`pҥ˗/gw۝ޚMԴY=d֙wy\!O fLQDU f'9v~+rڵt1XF@,gǻ.b1X+=i,.X &ٻ|$*<yrff& rQd}"3>X> ޫ٨(Ȑ!^.@OҰ6F 0<잞 8 6Dw  �X9}w3_1 R4H$FcͽOya0:̮6BmstG<uTf͚|NΘ xCD%~Bwzt23&''֖z뭵5xkӅAk)xj#p@Ncy}MOOG\ u\<^F!|gC'Q;fN~o7۬2 ˣKpAp-022!W0%v_DZ0'Q.UW\WnD$cY]]ry&!z .FB1 N�G pv~nobb-_xsb$iG¬J%1j.i 8ME=�gkj<R4EKomOd&BGd�"Uzjiiڵk@F90\C&ןC-sL;*p<*+ ]k̷X^q bgr'MMMMOOommbT =zt9Q{5&(EJ7333??+l)z$LSQAÁӤƽYX{ 0*g Ovj@}R"22( �E NP-Rr99nS[oS4U+;se&ᨦ ~;Zv}v4\& @ l D/X@ GA:u@+oNw?Wݩ)@e&ڡ!\)}7WX2o,--ƽqV3#$1'<MI,exT:t-^0\= !,Xn>X)JUj& Qm4:?㏿O<d5cТyʞ/sssy{.^R,gΎvħ ]^EO,ӔN_!Cͯez\ĉ)!8fS;M4\ҜI"H!g6g;c{{ڵkc2G/@%%wvIVVjOIr"b6۳5?3_[okjuj꿛"o~a�7c^Vf\TW ALCCyT~ 'tȈZ5}VYzRIxVr'N ÈطZz6]{{챩z*nas{ڟi=[cggڵkT-`E?g. /BIpwwwmm��#tmmH8[1CzX4�5fі %DS`,Yd k?lgvmz쓟<t7y[[[[[[Hz6@ClN r&NyUy?18;q'mjjYg{vew拡 F4WG`XH- B faY&Fb@UJ l_\IZM'mЈ.\0@oaP ,WEB *ERݵz{֭[_nݺf[V%zA"H5nij>{֭˗////sG �5!K J([>m @H+HOw]yEڡQciA.5%H>6d)G(4${^tݹ9<S%srg捙;O|~ٟ꫻+g';C4N1 F#]봣^/m1Te& #t֊ !=j8oΝ;w̙onՃsr#\ zdv( 7Ц)S\р) " v&74;K44O,"E9XcM6y>sHlY.$Hx#7߼z*]%W<G,v;*4͚O.o8<`$XZޔY=䢠|@S ~o>Lq9x*]hH6RÒfMD U0;`uu_kC1aYbP )IBo3&wwy^OS9'&fO"\w#{'??裯>_~ՃtE98e%6W7sq1#gbpj;�46$.SG8p1l$ /(\[j 1⃆z$%h,ɡI3ovv6*<=t> ~~kmm-9?'~drGu7*XTh8DQ#fO}ݷnZYY` Ygy@,Nc_[f>KvXT @�MF;*C5m72ߜ_> ӳ@ͼBȤ 3&pbsÕ'W>[ںxp8a~wa})R#`ePQ=><p 6I*BMɉO>7|ҥKׯ__.3o> Q1%t2!�V1æ싍C@0W Ã` #HڎZX0Ӈ9J|cc9r,)[ld ̡΃%=_[[{)Qjϧܤ;7U|ָ˨JrE];./<z*pfffN>aPT0oA@S<jBݼI!́1/x2NHsss,q9^,Tj3Nkv(j;*wFg0\.]YZ~ppj mΗ; Y[[[[uwpJ4 -Ne0ޜZɉɶf{|o,X/)n;ٙ{k׮={ڵk7ndkT]]%a&qD+Ms cIԥ$.1|1F@WbLi75<ɦ1N<|E!R, 9u?`)W  CXd13y…l[$2%~1h.Th!yϱSDnƒY̻X bHBcA,Zn9I\,ȐG3Hj~{gSr{bib_NNLNߞľeW` L^c@5]λf o2|erqqqjjjsss\XGX8x J<wlo|3{|^xCٿ; ٱsFŷgf] | y%J19r:_ @EߕUcFr)8||gum6uOeKv3o FFME$j~V:MOe']`pr&gQR7LV%u*[ĉ{_}U L09bаRp|~""RwK)&6$Ċ5hT2D ,#D;dgA{[,쏠L&SXxr{'z،^~{?я...>'{ʵ5ڋ|;y/i-^/1ls(,ggFX-�:,rUz-Xyxf?)(J9-Mdc9vG뼧3 ;ᇇݧ͌/5M<ΰ6G]Yf{Z \ f8g=5\/;ŁW[3 "C7Z#J/SDݳIv{,!0qrCαլU�\7.}=,�Lt#<NsZYl;(yG(Hx VU~>J[qdOG?g|ro'K!*/ܹ3v߷zkm61}d(* h"O7FU N>tq�j)p9jiA:[jhkS_/ PUNTCtv_}_ۙXք;۾j7]nqpNqc7 ;YFY.^FEk<Hc4۝Z/X+++rd3YFKHbH"Z8j Dz/o8#ǰ;,ٽY1axu "`BIh8IxR_'E#2i$VFJ翳ݛ[YYpիW777ww[:lg/&~si 9Ix5C1t⚅z>gQ%|Y u0b8Xcpi5q<6ܔi f.^h7n;ٛOg>؇/]Ͼ/o:0&"3oG =+mZ}s G9] c1Ӗ?f=O KZׂxE6_ȁ&ڡS@ 3tW cP5aeg͗Nĸs?(s @,b]\bh~6P#6p:ezL*D GbaՓ/wڇǶo_7~wWVVVVVw?)aV,Zgrrr;E [t}ZCmT^yd!Bm2: sTE?6uT#Pu !6YcҔ@`.j|377nҩ8}hee~~3+ҞnW!I J L傇m4_[L@5_SznRG<Q~~ZYYu떋Q7X|#HڎJڲI`Yڡ),Pь-d˽Cqbklx[e@/6ώ1cnl r`:S>TFPBo¨M$v;2 _;K͛7w~qAku=bUj;NUQ?Dk6;Y-)է2.9UyԈ<FnĶ f BJER%~Ll~Wl Ωw?裷v[|+d8.iЅB8! RcM6Jy,|&I=Ɗ0zAPLʉAWZ@k�;^Tf pTn${ P/(cbnv ¦{=nrFC%F֜vS_ؙ;o-~a/Ou')IK jܜNyD:q(6U`0dSZY\X'쐝l \/ Gé.{k˄ P {K~[zu0|xyijի+++pr0IcWhI,0CՍ+#ώeX a@ѣ 18r#w>ޙ*;9r|tm'Ϧ P, "U<@A>ɱ;I6c 9xI &\(ebͭ"Ins)i(Lr\m`z`:{P+͉M6{>).pMf pP_ҩj2w}9,<"imWS. oRX& :�BYW#P9-Jk~tN]V5yg6g~7~x3<ovՃ x9^�52'I:D!Cn7$ eW ED�� ;dգJE^emC~ZQeUp4qWAG>a@%wFbA`gLU9.ٱ-lYYӅQ2D&AAb6ѝ`Cy|?| .#(^M`h?~zf^/t EcC{ƃB% ISOXRQp+aĄ2FM CGyzD ɽWn7xϭmm=5ޛG]y޺U @- O<h_8?[lNI930-sP66b0�AdBBXTJRU|Ow=7j}֭<ySIT*j P1y+D"1jԨh4߯Z&$xʁ1VMaҴ fEg==ƊU?T: `_XTLϐҟD�A)q0DU`@`ylZUaWqc{ʔ)W& m E *`CupJ|pE{!`C@ 'yhԨQw֭[wjHwUFP`-(WTM97Z~iCj@ou꞊�SH)-0F;3]kE/^کd/χi2)*5lQV d}"<:nV2wkEDOiGYH(/A=(I3N f^7W# uBpdl &ԧö*d x?jUU-t9@OOX**m5K/m5a' u&]z]:f])n8rBl 褙aSlr%ea$£L1@g_Q�5Iy̡'ABTWk Et:](Iܫ)j^⑴ӀX�X6Yk>))e<U~yMfnlO@D]`LrF,(mjHYVjtBH"nV҄n\[)Dcl><֚;>4a;)�E(IL v,@(i W0bY7 0~^Pr|>O 8p1 Uy$jl*`>Cyqn80߉f'rT6F___ @U)uԑUaIfj5U4j1YKMk�� �IDATM)(e+p1+p؆Huk pt$qXW i@Z3f@Δk_ʐ -EBre<71>EbZ-p�NtH6uK-1p)N/yTTR[ۮSjtZ:ENI7HE@y"iSX/A��?!t9_%()K \EXfsܘ`R'LUo <Yb'l^~mS `7 ^E;) :쟸H>l~_:Y[׋^u6<őӿU׫*S*kQboFz|q\'?42Ԟ:e$XmEA<mxap;::l0p1do霕I%y(w5-=܎KK^ aJ59iˁ7 k\'ӑ8K4K gY!Y'jCsVUAtn!ry'lu,r6M' JQ.es9y3O4*!kd~ROu'i}Iϭ1'DJd.J1BqU#Q,R7?BRzqٙFafWҦw}}*5+=9s,9eɞ TGUCԈYQVfm_i7{Z0e^P[[رc={x/V́|?{t%n=܌vWa2/{Xg@f!5DW5ܑZf'$`'l!o4fjhÒ8BVP* k ]N+ �v0<7)A:"{1ZZJ 'JmQo+n#GEbZ¶c_bRg౬z[Gdbr O}0KJV^vP(~[[^\ݚx:ZP4m2}VQF?~ :M, fJ.PdgicP!W ZV080j)m#̛ﲣ(lrmR!Ѕ˃2)d j$e<-6 8OT_rA@%L$iMaMCTעJF`Qֵ<Z;BL{qpplU;{󦿝6;^G9M&DZBY ڳM _A"K9aǣFS/y)Są^s/iobbrbhZBc묳κ ϟ3XEFk*ر$kG )3Fqh)tVltBZ1/u09V6wCIިz(JNAgT*pfKLoϫA� @GLlPKK̷P N lۙ)anG֗FDP(! mr]6Ix?tioY9 L$NʬK!_Oi.f3lW6 ݔN=а'Ze uuujomSu_vo?f̘F[y]vُyĎ݋.bFܧ#JUV7n\`ux)?B =ZwxCQJItf<hsR",Zn8[A(E ٮ)LJlp8JFH+USKsrGhNFR<7]hz2v.B!JqΠDmiM#-%8Ѿt GOCew14L 6gɢT8h?�G5w!b됁~ɈE0T UhǻޯQG0b:nU1brTڳgϤIFiZ*vܙ-K|I޾̩\<}5NxbxX\~mT lvC|@sKZ2 'EA ʨF qam05EveVXC<4O] U>7f <\n% *!U7çĖҏd Q̫QLH'[UXF+D4Kņ&jfũ>d5R#N3lſ0өDh(&߉f2`e`S~bfuТ|*:;::(h hGTa/WH<eZN/4٬wsS{~)Ue˖zկDTݻP(   'O~`i:jT E[?OF C]էvu7C =p=Z!\x�:G0͈a擼LaG<ݢ~V'$j+1_}:ZD1|ZnVwz>Wm azqɡa/ŋ5!y6%HFI49TR�fh3cJy)a iG9Xg`zN>ŢfTZm[L{h4:88㨔b-BXj>`"%#פR{}… V.6+D#&ec%SN=_~l6NkHd2lcmy6d\@hE`4vD&7Dcv뷻&^Z^r"`ؾR6<U_VVyɤ={U瓴JӋd.@OP}OtqQ!S55!yThu,8q;\",lT.&h*a23J?C8xҊp�#) w,^JKx0[[#)L􎎎|>z^(e* jux'\2ʣ3ZP05VP!o#{18cuYWUG\?%K҅R*S�FthW ѫ)VoE.alwm7kWh/¬-Ű2|ZzQD fEg ǛEUC WO M �n։}pϭh{Jl{\ `3 RTW $/~K.۱c΅Po- hʢ*]$ʒV<bv ۴mNMa Tk&[Mir(FS#U3/jq)$ NW\UêᴊyCߌy[/%:;R;Ov,eNw^#(QxԴziZ͸R )\ SD6±h@k<a'Cԍ=nY (:u W!#9+ɞF^mχ&7D\R+jl{nVyIIkPI[V767@�gnrZr<Aչq9f_`U0Sidn[Lhsأ{>@/F@IfMΤx TLX蠸:r{#iNB M꟔n@_ {j1L0nP.?0>Nzj|R(U>lvb`1t*3�$ӻ(tѺc(Y+{K JW?z&* 'i/idۃd܌R;PH5QP/Y1SP!T{DA+'ztJU @lrO= ^58)2@:RJ@ J).Ņ5 7W2t Za0Fm${:..萶҈%: 'fp sd~G":#V{-z#F`hlpkj0yZ&2r(_@2070f2QiP;dB@GN/;!(5謱}BWF0LDAo)J d !HjQs*9YPWBuc<ij 0YbJFc4FvgN"�Efy l`zcx} HΟi v\6=r 8%8e$ ]NX+Ey�$f=:bMҦ=+uuu%ɽ{Rs`"))b: 3.%UT1(0C3`ˇ(S7" )E6ڳ`( ] W'!, sBp{4ubCʌ�-S0$(*f@*˦L-8N3WĬVsBFӣЖO3*P6 {Ț)pTN8uBL1c J1H!# w&0AXSciyS)M;BrZ ]N 4TM*PeLաVnӰUE7\vmdr#FѵRl+�F#C�hMZ2[XNkF*PR,'<1+V[aXbF%Se3¢׾=Գ_0z=@�YKR2 l5F}╧(aaJ{3qᆓkO< Z&S|8y"!1!Q@i쟇`tСnIx5CKTxɉ6̪ۃa|uUp.g Ph͵NY*ZfTK /(&=HA4~Ŏ!vrSkSWѶf<xe48Qqʈ"QXy>て4m2a 9tPib"5pV2OCʝF]8fkDa u6'D:C@?đ뼆 QǖI{*D1~Awmn}Jq*vwN.#RO F K<6h{w:oĶQB&yaa8"Ȟ={*+x5\d{QY$I3@PqMP'"}PQ|4>#TT \.T*}}}ZX,BuΠǟh`F5]X7ЎR8JAHwAo8@*}Cԭ .Cqm_ 'x5k( T0Vh Dz|8 0(Z*,�b)v%(i|x6H_NN+z aVj5%�HF0A} oU=P�N &I/U) UdqsYUc۞hI9|O*1Q0֤8dcƌXӶvq]EĦDlaL Ge0u-2P9QAaOJT<KL1L j׉eI�TB)0rT7Ra�Dn=&FPSZ*JhihXwtttww}k׮3" IdXs2vճ;x =ѫy-IR1J \m:uG٬UAUs4À9>O1"7\拊3goʿyMGiPVq.-aJF i1H}TZZ[;VtVr˵# Ej[O!5z:^%ۙ OS3j-dӂV?ďJ^j= *H{jwxsyX#Fl6vA/iU3 rT6D%f@_~kڵKvh:͋Vf8ZikFB+-vȜ_{MP(ƞ}6'amg“x*B*7e:7 Ցv(` A4*g2RH;u4<^KP#h1QKVT5ROaÜDBl06&MJ&=== W?^DNSЙL*{W9^Dx#+T)Y=/ONYhɋf L&|Yk T)00Q .O~ꩧ/_nn6(R\ xy7 3:bY N)Ên�n%9.Ԅ�&l⾔m,-ܯ=eC]j9Sx%O瘟٪sL ºޑF`R%RS*ŒUâOO;pKvwwy晛7o^v5c33,)o.e}}u}#}+/sϕ)5(~pB7L_xCVhҼP |�  k0APfFN9rH֨LD"pmŶ'va.Rɓݻeڼ͠I6Ж1b 㲁>"D0@:Ûeޓa:"kzr:EOw c B#b,%jQHx#/e@pg%rpr+i!G7(.Sp5B6<bk<|k^ G[YE1H UVJ% yV(隇.eYξZ*(:ǧODMkٳE\%UQOBOX,V4<d`*vޘ EX8?VYlo+u1jT: azJ_dM/7nΨ9Atۂm?[9۶mJ%PԑCYB\Y,m60k>[q*-ëk.&!Pu+1ik ENԝEF:d0*F=@E߽yAu!z043)GP53J! ڙU-glҸ$46-Vz*,XA!bOOA,  :֬}/;1իWX"UV֪ NfhJ^ ,jFuF\Ryz;S;Z g]džY.hRPC+([ˀՑ2S|>jGT,_r[6o'-[halJk*2Teq9F26E:�VS2#REM̡< QeCǢm[|v \Njq?%g )2/A` ^O �aKPnN^Ew@98 фDknB3 6a޽;n۶m``>^X=E[y!WQpƢEtެv b9: _f"Ah͇A;yW[+POoUwUz b_=`+oWJڬZmj6;mqMinĈibs0 �T%! o$k+⵷+S)Ògwj3Wݹa4@W2 wHTPU8f z!k O" P1 v10D =7e)2~H TgzM+agt%2EWȠy􅽜(7bbi6b.V*cr$;YWUΏSuP $h*2JmcѩYf�89g(mZ=w} D׀͈( qCտRO,MގM43}w' ?,DVD eHQ<e0n �TRI {֓w I<"@x3IOӌ7?h4a1:BMi$<,24/6ZYA: 1)輎`վ#8 R ӆ"3`]h Rފha L2Uu;vC꬚M1EEuf5{"]ʷ+EKDHԚ+U"O z+�� �IDAT }cTS8Q(E(UfM!f`j(A펼ʘk?`R!a_?iYUhV<hZc9s6moFb.ipCjh8Hdpp\& xht)Ӆyj@h#^\G9= /٥~Zyn8mRUr8ZaFɴ儈s])Z74 89µ9ͺRf0W-rSэVoRDH ƙBTän(晹jX5 CS.5K ⿌=VjVj$ۢQ+'\SҖ4S68a(XY8kzW^X*`Lh+Q E-SRO$aׯ={v6(EJX,*o‴F<xUnP^4: S sz؆k4ˉ<!J&*WOßաPFn ) -@M"�Uk2VC{s<z ""S͊vNhxԜY \t$I mMuntSO&;R#y'�syG t97T7$DA<VV;@@#yuډH9t�n-yW &#**bOR)UI%1vXz2^UNқf vARlI,#r9H W֬=sN) 7E"UޣvI 5-�v6?<7h}ձVرEcS'ԩaŏ� U_K9x}$ "Ǒmjcv;8*kD S =U+WFP((C4 f4X!+<ONm62؉OQ%t9\PSbbH!F�Xj䨨%\нGꐈcy/& ULb*-1jN-CAnH؟'cVq-^Wzhu`F~ }`ơwH-}ZP Z<ᩳx+A[x5NHegDdRjA1hgU)cJxU_y&]P=r-+ Za(vFO_%A =K0LTp*Ӡ8Dpp^ى%L�r,.܄{l<rqLʻ;p/i1Bޥ:Sb,9QzSFT2D@'`2kAR)'H9J�҉&$~5ҿ=EGӵ`7SMS_ڨFfD A$F<>c_M qح:*\#H6ӡ},^ hbk6R:VǣzjS 4眫.4Z{ћzt4(E&@ԠtR8�K K$gR5+L1Ic';8 Ǜ lWDIeIc'3θIPn ݂Vuԧ(PWti=HGfzפѦUP׈fLe̋򴦧*Nk#Aф(R5AGv{z.@QOޜlk>WK&]Ѯ55jP/RyOs蜋D3 2gO?(01uԮ38}Ž4xQ4"A`*N_E7-}ԸQ{M A?S I(Cpx5h5X tܵqr�Dn8VV Ak4j0B}8rچo)MXtYz҅V.**TS[*PET 8E<iJ.t:]V~8 P*!ׁd!"v ZI9TQNkcL$kP NF"hh,5WV0B#y׵=Fjw#I-,  fNcUOuUV󚸤NrcU>5nS>vJ$Yd{vWٍua60c6?dh#�+l@?2[c cj(�"o= P@ gza(5e=xfzu^HGNkj_=2:yCXd7DK!t9P@(3kV p9 p(O4؇Ϊ6`Z`ٲlNi,kzG%Sv0|^|f9; sRŅAɥ"{hYji6rRק֣.łZ|1Yv4x6Ɗ/D֞3##t|CRf?x4ݾ}>54tM_5cg4X^n?#?]~%4|pܹr]\�a fw@�ېv | &+WT:oN'?E͍s<6{ AOQẔQ RnB8خ ,glKMP(wJfNIBkP*ԡVwBzأ<!lP(W|,K} cT~W18�ʨhۣv\USbJ1*xΥ-`�B[v顶4#g_|@~�oJwz$bF+i Rՙ8Q*h{ʯjΠnBL'3f@URk|)A :ꨑ#Gb:c`` Iߢe^hPՁyVL::ot5͒Sy> 7(XAH4$i#zygfVg9 !QnMT`U_�ݹR!|Ž-1{0n�A@*⿊ U`# F!5jTWWW6*<EP1aV: <j#()?,@! V8N\<&Xz%폦;SLD"֭+˱'cKKw)1]+ $F*ā'%Ss&' T}k^j4je/1<s۷o/JI<݃0B0gڱpgT:$"80spqAۋ*Ѣު@d6 �H/T{�xkߣvC*b8jS 2Q@\EJF` ir7Kָ�j(5ah۶l^D /bq9!v&eTWp?6ѣǏ_,pEY:wdNhLQPI ީpJb+�5SN7^ Oz$;.jool"Η"UP)#/l"e6,#:]8KfnLՒ,q�J?dΫww{7[oU(*ߨ$Hhw*Ej a:v E+{LvT(k<OuSSz40/1ifJA*(}DE6O 98֬p�M0{bQYm؁ڝR fAWrfՆ.^ 'LX gv^:H~ іr3!X,}vkxXIĵJ &^I*Ƞ3%Zid_TMA֪$~ag9ĞDGw= l<ݑD#Q:fa*90R[]3�ANI }>n0LN0a@=ΛH$u%W:ԓ\3XTbpZӈ= ́ԩSnjhѢ\.W.m[ v+WS>{4r_ǃ0Z Rm+(\X:m{Z=N䈼bҍ1^DU =ըcc3}G i²ńkEc(^cQ%z`1dhH=zPM`h~X,q^:k!|" @rS4(P0 =]:Ok¤#.m?k+"ŭ7|Jۜ`ODl0b|HrX(b\4ge`.Ju2QE߹\]鯧˹r~r\;X[l]iASKTӆIv 6lٲn-y" h$'3U|j 1pb ıcE&U'`OHӼ`@tk\<+l 9B!0�ָ?Fd9:l J%/jKhOџP"Qgmi&46B r%p.8-d[HW_C*si^/ړip HfAObM2?zhC5%' 7ҕo(GvDo#(# 9Zn!'8�f<)לbj'&)8{O+Ac[hJ$n~bAd?kT1pt-D]ZX=t!UV|mx]^`0`VTC.+P4_R@QV*^kTIJB3ZBT�o(EW"# .g5QZPfOSGu0ӣ(N{rBka1<+Vym#rn8PVzvTP+_ba"+^HB)G#Rns\4UQdLAN^n8?f̜jwÞɷ.:V5N ><D{"ᡕژo-;r|^4U5+*@ c{^RH gI,Bў᫚2PIfؿZD9K"4Gh3 $#eЏOJ 0"zt:/OP�=YЈuP^jkz:%`+UVGV< A7̊ Mm5 )Qө16jGe+hF;�bEPh|U|俎AШ57+i6x"J?f! ղAz~-<{f&*I34bv@ Ǝ52(S2<f{J}`JQE.Bo<ZۇBsm2b $:`O2N'IN1BGɁk:@iE{?kl Ȩy&LJm! D9t9-F8ɚhJCg@@լ&`£fD Ꮗɰ{Z{0Zf @ LU5,&?(RŽk4F_)'_ѷE 8:uq.VQkF| kٕ0Ӄ@CfetU7͊b*ʆX5]xHn2QN: 2zhkDEM mqGn�uMGQQ�Tf NAoMO K͖hQb,&�IJ=mrURJrZ6]!.Tm</JS "qf|aQ{PfOIƴfLx"^|b 4Trie5)y@!rBCMzETuGjkp;O0,tEF�%c<1Gxl:zs}O‹cC1_4 ૔叧鈃@R�Uf' Fi8̰FGjKJaǧRx^y)6ꙥU?~Ν[l5TPp7P+|nа :,{0 ]-t<=A!v9>< f4U'& ]qnh^1x#;'!-J$1JWD, 0F@<`a |'lu tiAbfz=|bHx0h<mmmd2͒ں!gw�m�޵g:N=Sg4LFV)'4\0Lׁ5$_2`~{$5^X<tw) } vtii}B< "x,҈D#. 8s1^zcW]gJq!.6;ؓ iƯp5k.qz.aZg)D[̈u*0 }i>m`zd; ͒d<2ZI$tPgznQF*BTJiS0+$r~�)Yo1J1<qs1˖-{饗52R`Ա%Ap"Hj U<ӲvoFbiJ}v z]nPjzZj c!�>7A Ұ ΚaDDGs_ՎK=/ש=o{'aÆ~wpp:piD(7^- s 3a*U!^\rZIJ<l6x=q؍N]Q26x!R zfNh}=ns^q{ ޴JVE2b&"+5~u⒘ 0\%Do<C8Z`Q=Un`'Ʉ`Fƍ LH$y\=[#S6=fjj]@ߒ!Q7էMfkZMGS ZD1vTR!8$Y#�0^5yg{W6 WVcɛwSH ؜f!|>=Hϴs`#YL *s$!1\TOb'Y,- D 踯0x!Dzd֙PQN'57i:<36Q1[@2t_nɎ(ȍT*p*V*p m2sԲ}=Dy^بpʠS*0Z9 0Pq]IZ[j՞={VZU(e(FٮL?G[N CthIZq¤*[V{oiʨ=suStp#&Zymˢ),u9[M]Fx^Gmݞ}Wm1ha q~Ɲ,aE)*:KUSv `1.Zr9j�mwbh]Eu{qQ7SEy#^'ߣ\?_wK*k^R1[ո\z37 Biq䴒h!q`>R:ۡlVbEߵ99N [UZ3cǎ7XlΝ\N]AI+&{Ƚ4Z86R(y8nh<a)u@$ΰYҐkOP M9^ݮEE+X3Ɠ`8K$JISk82y?EvXJ1; y/,@rUUyghdX(i<}_K'̙{^:(/'M˄`lq%"2uhZ&4 */:W Vec[4]F3 4-*ĘVܣL%~;sJ=B/$X ֭KRXXgKƱ9QFN-J]Q{*fqKa ÿH-S8@}8baa`:d-^!<un8f J'AWwg>󙎎'|r۶mZ- 6n3WS]Vu:uzc9iX%u& ?Aj*ED~L).<q\I<=4$Be(Ay<k+GpyìD4+ܫieU1k#}i<Rҩ*WSUH)VJ:BS1RSr\V<=yv(d @<[MAv%X2��=IDATj6}L&�yF{\MSA':Qivz:D≲'4QnRimqZ"qb,]v}mvAG# Cb.8JM0NLK(TJ5ϪxCZtg. &%E=|C'xXJ*VAث%2Ӱe2~k1M zrb^kW{<4:{\ r`lf} -*P6Kp*csv*iiR߂'O@juTGJ4QuEW52 TO"4GZ+ da2-D=j'[O[0qh ?;1}Zځ-=�.vdE&]i _44?ă◊/b$v\N=V^I=Tbqٲe@pyt6Ū�yt blAOn3 !o%ߣo@Ρj "Smn++!-R"b7" ڛ@URą)y?Eڝ~a|% �ELhWbѫeY,l'iHZ^"ѫPNCGoYSC>Pr#- HO†n{[ h)}M)I1f&M4vX'8XXCԆ b:="pR)8].FNT|,-WuB*DM�.Pa7=F#֠ ?G"<rMYNkT4cx[= v4hK_d(yQ) 4+7N,?j[6J!CM Iӫ^76Q'T*ed:n: +M.p.3' lD XܜF>RUWąh7D"Q,]ST #R8'}I^J%6$nK3*10HHyd*&[TL PL%wր$a2K c{ iByjos s c\z덺G(rNi M~ RŒa+* 1&pUvpDtaaΰoJR9=JѺU)ĉNؑ3MVvvԖ>9dDX:zaj/]'~ a9s{&F^iaӬN9n�FПĨ~!?p++oB Z`BBg<@-uUXKrGJYUTP}t9.<(;7PF̊) aUuIP=rA sx<\뙮WKιxۍm%S~Q:F:0`%6<J}r=K6G?t j8kq"t6nh�TEt_8�#A jjQGuĴiӲM(p01p6e8bi q { 5�҇ڽYtNa58I@7_*)"MR^'J/'gA9|P@: ?S.C(,T[ȑ#-iK'ϯ8+p1). h7+@΃jiI#;D(!*/WE &vpbMgYp_AIV- ikᏽkae6Z)_-'IˋCYkqC}͢;WU `Z*|5Q󧓉`GDnmVҰQo?Q3UcSj`3{&LaNXu? gE1ZT� XXU0 5֏r</&*QBjI&A>'RZ04Im(&TꁖmbIsF<y֭[E0u\UFmϝ1YЀC=}Tr\ '>k=0 Q6 sG�Exl<�eS�** #Gʘ�9, 1e8@e ]N+ =,lPzc"B% Z.CNhqN9&j5C b6**AtDj^PW(.ASQLIIK k^Go+`_NBQFx){2*�P9_Zr4\qB^CkZ- *4@)jtCLnVw�p\C u"lLSѿf;rl USp'pvC;^pЅոv5}xS+xqk EjU2t9-/o{L:QwxS:HI˚i{?豽rh?(YR3FIgs2FGXGљgOYRӛ#UvYsjrB,kZ.&H憕T[S2Y#Ftwwiu 6gҮd#๙FC+ͺu'k(PkCަ*w(_eIjhqB vw! [3@P&[AQT-B)fJ05vنN"8Phw.e 0U,VZVf F{6]K8)P؎d\AG8&TCJ|G(ye;~ƬG3d$T~ -?q2hF�NԲrB{IRPZKRggs9eDmJkf7(հD�j]=ihsʸލ,b5>khH)EcϺ?ZSU.2XEkTR;E.إvtt|>;ԼJ-)X_* #mVo!gr1�!P%ċJR`+SFd^coskSP:/c� /=Lv7ۘꥑ}ie#8z0*CH4fJ)C^+{fR(J7o bbj: !(Dm O\.i)Fn .0Xjs6!j;bl7ZK~3Yވ6Y9[OYiPl84_�c=Ϟ7oƍluTN#r ImdY3;\'BbКk$xjiZW4%.di#GN](~8C58�Y-r l'a[{x kT-,,$o賙 Ek doLS9eguVo= /UԵ9E je^܉,mZQèrX $= I;j%wd}#H oxkx zYgp* ��WP{OOo۽{*GiY<ϜM *RVWE3 ]Nֱ;k,7\L^GA+˔5t(pÇ4+זL_`jծ6cacgv[ HTuFu=NO@-JQGګ):#vRXjVhfEt PoWdXTRU@Id6P3dtʺ){R[tJ{8Zoy3q^a$O�izJYo$➎r"eusL<ZL4:^=ӣ@D"F ]NI't7!\ Wr+\ W>,'O$\ W?�.^_|9O O p94ȟ2>~oЪ8y+?_4|A{an@ya/оa4Eap+\`Vrp+\ Wp.'\ W+\ WBp+\ ]Np+\ Wp.'\ W+\ WBp+\ ]Np+\ Wp.'\ Wu`VtlZ'^Bd'`-㍼*>i7t\N,7o^K޳>>nk뮻{Yr/| y0ag@qۋ.%7S(l~{N<C^:;; 8dn{;9ƍ88~Gd^|B+p Wpw^ry?cWp}@+t9 W+\ W~S>_rgrO=s;vsW^Yvȑ#?{ 2ԩSGO;.ѣG;VX~nkAc98c99vW^y% _87O?ǟ~ι{9~9/?~ƌιR4gg=iҤFϟO"W^f͚t:}饗gxJя~Nrmڴiι/| xe˖iӦkofWWg?Y_ZO?s7n\tsoo 4Sf2ZbŔ)Ss˖-۰aѣ/B\^ǝs'>h[orD"nݺx<n9dɒw}wرsZΞ=9wgqι7xcժUT xܹs⩧z'v*K/d9m۶?ι.9~'O>묳̘?ι;oܸqιW_}1b%\W,=3kv n_u]3̜99}\.r }+W|ꩧJҶm۶nz)u]}}}\nٲew܈#v-T\.Ϟwy˖-7o^TںuΝ;Mvw rŋO6m?pRf*c[|~͚5~Zr??cƌ .ZX,wmV(rܢE2L2l],\G?>k,"ׯ_?{rk׮ןviw_yɓ'7%K>Ovnx ^3gN\ޱcǦM>}ݻvr+V8cJO~K~򓟜={5koJ&Oۙ;wOӟ'_.]:'Nx JݻwtI?rSN9eΝ?*J__믿B'h4ȑvsnѢE .,7of'pw188^xN;={zO?ܼy૯:nܸ1cƴ<#<ܹsJ˿Xh93o޼K wyZN2[o-Jf"<իW?䓥Riǎ===z+۟Kg9Hk9so&?{<ȝwի/ApgT -_<8/7{ `__W^ /̚5+s=78Ȗ]dwy#<i7Ͽ/ 7o_7x饗nݺ`M6-\On~Mvsν馛m={AogYvz?۪/|ͷroooM "A0k֬^xspnݺ ~77/R",Y 7xַA6?{i4 .5kփ>hc'{_^/~̙6lܹK.уOOO=TkΚ5kΝ{ErO؞?OgG}o7޸+Ŗlm֜/c:bH4>y]vmٲcءQ,wӷo~ 7|g۶m[Gy3pO}Sr ;f̘#<nx>t3u3fD;ׯO&LK$1cqm۶.kBkM6egΜ9}ӧqC#FM86x===?QF样r~:!]7t-ܲ|'Z*\zWo?J}e޼y/wC̝;{{Ǘ/_|o}[=+V<+W|]GqUW]p}`kʕO>^{hq7p'>o|/xG?wtWO8qݺu^m9s?p7nhp+\nݺT*eاC`{ι7~pg\7?G&UOO7 ڵk3L&y饗 jzk&9sf\T*}d2?Ao7L&YbEjod2_~yR fϞ]C=d:Rt̙33Ղ x饗׮]k7xf2np۶m 4^/g"k]wݕd.矟d~ӟF_~d޽- {wGڬ]*:L&C={} APT.L&s7z;n_؍7ޘd/ۙ3gNѨ>`&9sC裏W?W믿>|+_߽{]SO=ef2 /^\3̏c;t]l_*{ή׿L&o~;cXhn-|ցUo}Igrܸ?Up+\ {ܝK\gCp+\ Bp+\ ]NpZkc^w+\ Wޓ=A\gj)G(\ W_-)> iQ\N$Rh|ӛW = WLdR+O \de_^x͏?FIKNO<\ Wb׼ ?lY\9Wߵ]ߎ7#w]1bQcĪޝc'p+\Zmw.g]_?uqEq7lkɍM'u xpŮ-P<V)O>uLo_=mڴHιM6ر_cbp/w%G"CǏ;ꨣsHȐ9r(����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/catalogs/jmagrange.png����������������������������������������������������������000644 �000765 �000000 �00000553726 11332127304 021062� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��&��_���ā���bKGD������ pHYs�� �� ����tIME! t�� �IDATxwUO9LOwON0CaUWEtwEQLq5"`wEEWEQA09OOιrQ\\ֻny橮~oy9]RU5 z<G}/̱,YdK@j0+qYhfa4 ZG-(( �|o%K,$Y~{ӻ}ep饗͛0P_{9sHv{' nttt<#E"[`>y[/4}X?$R~% Db(8Z춷 �FW׷��#ܭ=mHvE`&qW8>QZ VpM#I=}!*KM}W9{B ZXNf#I`ǐ|GkUAIR ]xXYc@0FX?~TE~cOUAI~N H3|ͨ Ii2Ǣ A04q\`E R82hD0)+p/ \&R\<zG1 vqF5uZgFS)sXᄎ&Vc/A`dy~%\^1 Lzd{( W:^QwZS K0V">BsBt+ZgR4c5 0<A՗819&IRBѤQOY? bgSq²>ɟ'}�ep8|lc-<A ~&(,˚[,gyf… B=a?:A~Nte!өoTvt$)7$%]XldG rH8?7S0]}@,ds{o22h$Z4݀`@.o:YhkN$Ju]hlX;fM'}p'rLړHǖ:c؈"K[7h40I~UmtS'-5uc1֞H$Z6=\w�U#ٛJ&G[ZR᦮X4V6zP`ToD u{6]6jiXU lT<  OݓHǔꚻ[c[O$-r`J@{U5-dbLfWs3~?rpM{|"[h2%s+U;{J&qo_U:zd-v<ZkF[;zHa. ,4+BVl$1%x,>\(Z2 Py7CFںL:Uo>r5aM]`8Yy|y?,gYGy92a„t:T�  �A0 gnjòvjCc!F`XvҤI?z "@:Lt+ mZ����#[8AIV�VTs$#0dq#+M)VBe >͋م %8N3;-zL((+v�vun@kG9 E}@UG"$Wggx{ FAM(Ы#)?dtE^}W Ŋ兎H3I=,/ɫɕptm / #bH7c;,ߴ(|L#4M*ɧ(RWg,`K율tG]Vl81` <xwEƞ`2-B?^ci;`Êz2`סnG ?6 Ұ܁(3N90Fiߒ tbeM}T:cS qZPG:6lȢ/x*w7{BPV`E`,?ǤS ]~~T6[acndy2dQŰfOfݶf';wy(PYOǟƘMR_8עwM5a{zi4hOrw7Ke' &tDec_WObg*p"cuӜXQŹ`0ׂx'h54az(?A8d .vY>ɟ'4$��Go2|fPgWq+ Ðk>׬3lF:#o|uyU7VILz8]k:#f= p@ _e)v!E+i8 ' ˼7WPfopx TK8@;/Gy%T�bqιE 80@L+-# ͱL)^%8EcZ TQ`g?ƉJJ1iUs Hwf sM:/qUJ(Jn3+*=dݠFO$D;Lm~,5 #R2SqF,w[  Z|QEkXd|3H`X9`m([4�菻z>uT7KoDVA<e m%̷۟ :'c V&0 .72Bے$o(U08ZtN@{'溮%Ns`"ens4%G˪]!*5PV2b́se.(]<ި#{v]0ohin!)uHJ(ϳy7*ѓ5\v7,rB=DXZ0N##m}1Ug7u5a:$L}1AR`ǸRITDMoSGv#]kͯbQ!e 3$_gN 'S$qiwq[#rMGC=dfr Ų>ɟ'A3˵}Щ8q6/XA:!Զ :"0ƌ[p*ciwQU6 תWUu֡ўM_�t|SI-a�-+ �HQa$J֖uERBJ! /DD V䎫mjb"Kra(ƶ/g �vE=`7P`WlŽ@Ԏ.2-6"qi(7xC 'ʥ5]TeW<i3<1M_BQ\'RҘb?&c0@*߮3Il썣Zw FWb8_oJr_)rqmrL@{bt)Wa6F)i ”: �޸Bh'nKH*<e є8O(;m% $m:=1ɦE}w NWoJr/.Z(h(Ϸ:Ri^Wb q0MI4WHSoi4)eѵ%D 3xBl4).2`pDHh7xb&0S;!Ź�OKcM1>*i^҅9:<qO|s0dfo %(#\=#\3e]6][_"co#ec :č40; %O&b<#+T]GX'fՓ6#00G5N7‡SLCH'0QfImӵX9*LUhҪiP�Kt'>3d'i2zr?K_soDG'?_tFI^n-e;E��:ٙdSґ9cƍ=p`R?y?L{,&;X�chUFPzLž#]c KlwKiySWyڕxl1~_rw?rxbu bn3ufI {s^^2ŸCG:W9.6(1QX�pY.]eI\f2 +2zB|4%ҼIh CbhjcD L)3yV(1# wi?Y)皈~VV"4/*JM}LGb .iYc:\I\j1 -4FHR,sAIh chjcDIXbsqF/ʻ-탌ĝfe0;a>&# 6ZQ?cV:�pi^T'}!K:Nan$>`(ZC7+ Ŧ OKÜLa(>沐}()e^e>&Uy`R 6Zp5h`TyQ\jjcҼ<B $%bm@a #%xa㋍A>+$"L>Pg^I.Jn}8%D|+Ap k#2( 4֭W q1shQk5Y㓢 oؓ0 uc7sk7>Mt׵S|uO&2MIf=y0 :/.��`R79YzYݠ �iSlvOr'?Du*񇓂juZ&Ѩ$JN}?e<H':_{B5*3|ŗmTUdg*wBl v�QE���Z{C9*: ҭ "Rʑ>CyW] 17= 'aN;$r`%;,Y6s s{AU.yOpjqcިkIn))! /}ّhDUc9HBKn AP{@0Pۂ8 GS F< '\B)Fz̪C9C@иB.FAj1N-!≈#Fp OH8B04;aG|lZ�2cۂ#$oXG:Ӳ ʧ*rIoD|.*jgH0pt݌ tm7K`l1V)I^鉈đ\GFL �JD(%$-FsɾHV\VAgP000#>ZNÝdgP2rH jOX1`F m )%0/v2Tc?Ւ"ި48y@!/"ݞδB#:MI )ϊ� &uOf} EL#A+ͽH'5DYL 8A2%Wg-ϳбmAT}eUV{ʁ e^3|gǟ��TYTM �@2MQv$B}B3 EzEatuOSIWg ֎v���P58T AfDL řo.>% }|o>ʼnH�`BL^Z}.b-@" R@ISNGBbb6_/b6  䙐^| *H%DTAODv`m42"_T`rUm0+ޘgI nrtӈ~oF ,pODN 9/`ZR^Ly ,p[@ Ҋ?XYeM4R/Z)mB(.0#A?!yFƑAN.#Z oF ,'"'xPa+&E9M 9p .!@ 3`J- *:C�ipwH7MBE6x0̊2DeIa@k%+4a}"7&8Paŕ|Ps@r`+H8߄ 8 XΐA 2@R)2#�CS[uȡ>BZՓo[Be6؟RiԊ n'o[aGE -/&G9Pa"Ɣ|#L`p_6#۪)M'"3 AP[P6z'de}2j<(*xeGû{O(wلcL2��O~ﱷ>6}M}OSx֙v.c{ Acw_sC%n" | ZЧ:t/l-kv>)^J|59*dzyGcC}_0 w\zM}}}](6gn X5^ |"fUHp(-o Dm.qň?ٵg/Xe DArt=J*\nQ 砑9ji8%T"1%HJ CpIԤ�v)f0+H @R-0 [L$h($jWTMM( Zl�BCqPt8aUT ҫ 2 W]z b$!T�&7&xhT:Œ: RԟTf 3 nUS"4ơ ‚Jr?�í!ACZQz A#ji DFU1%"4b +`$/ Z,h Zh 29P8ԫ]Q97 b,4®X8VK@VA45L+*\dVz A#sT?jԗP AALBV TU}_ D0<T �Eb!& ]z+4*G}[a3P�Vsu-d'>HF^ �OoxAĘsL �c Aie�pĒIodCαg,'蒜Uw\ f8OVYm!U杪l9ÓNpYGª?ƨ8)8T $N3 ^/(Rb? F:͇T~6R1IU@y*)$/$z*[Bp"@[Y 284�\ �f�N&# #'6b<\l"ԟBD"jW%ŭZ" 1L2c绢DRMBGӈ`t&J{0ׇA|K`$0"H @$b"d3tD1&1Bq|I,EFb#%U;z%m{DBLBG҈PtS%L !B8! ! 0pATTEl&�(3M' ),…Fb%eU:F9|Qv'%$$xd ]QD'-jr`\%"0aa^*"\J{SU07#@UHaa.4 H-VXDFڄ4CIUKW#JDPn#,O.�"z\J[S07JOc!.0 y`e}2"v OBΊ?F>3Ιg;�f\;}&N:n-O}8¹p$4}>18ݻwRLپ6?ҝ_ >PQC?(&5N*(6p! hSM9`#e2#8ykH)1r B=�(^q҈I%F.ӡp3{0'$I^ \RD,GbC֣r;QRnb㴬b(C vRn>^Xk0PKVONJ0JI8IPKIh4O+Aq@/#Dr$*sQph!ȓ"섘CKQʀJe&pXG!03!�J #RDK㹔`• 3sua)FΗ&X .s2)TLfL*4G"0#ו$E*s1 shaI6B̥(e@r3pmP�� �IDAT�స8Y}iA RnQFL*JR#ח&\絪w< ҄IEFH>껓 C..b!( z]:1z\g}2?Ov%p2F> /zx|(W_={6GQ2e k?Yvq 2)Q]4ۙxɣ0yE (;017bG $h%N+�r KD<bX1Di̸KFU\գ0pS7M$%,f":jG₍"=&;)HD#b y�GHVPQaR÷"Q]4eΣY?GM1{ӔIDnNB'5D0 (֗&"O3I g\C`=A[p!G :TvR\}DM=IQ< #+E Q4_ꦹ8-p8<֛rF΄8rTXSLAf"&y4>%9 V: .PNIi ͣ9E�$m#3.GLʥ&H҂ LB<Q<i*uӛ0IFZ An`,+>%9V[ߕ0.{dJBi&.,XIJVR<=>ɟ'v?jwڏrkCB �'�D) GqAAzzܞ2Pq)<2cuI /A d Kɘ9 ) ㍨О2$RF*6a,Qc<2 �LCB$;0zAE �GDFDMXBP>05a*�yd^FG<b*X/siR:RFQ#e`E>-cTa,1ci7 Й2X0NmI#aS~+l Ȅig)XjOuhخAQ|2^JB&, %8'FT0|Gʈ@HyY]JJhBYJGcun"CjQaB{H"H{=+cTl#"p?G YzRԞ2ɆidESETSPw +)י2#RG:ZT,)^V"R f7B[Hr.0z۪Dd?KIE҈Ԟ4G H!d'&?orh ��TXXxbEQ��$avBTF�/TFU Y�īB8,*$0 ) A*ɼo/r �Ò²   I DQTeU$F AA!) C TAA H% ;IqŽPA "a�IXTD=D">Ua0G UAA $^A~0$V٪d'OO¢(+'7'bfYkx<n43)(8*O>:nawyEe_%K,YN }e]Jv!IB]yʒ%K,+1//倣?T8˖Q,Yd9-<xC d(K,Y<ϱ=pDdɒ%C6dɒ%Klɒ%K,ِ%K,YdCN,Yd{O9{O2iy|ov7|Sq}Gg�_.5jPRݴi%\2l0�@mm_~ �())+N{!ܹȑ#s٪0LGn6;;;z}nnOHΔ俔>H3f̅^l۶{L_|�3f8g}v ߿/|5k\r%wں`Cڵn`ߞ1cFeev��(7o�oo?7eees=WQQq_GwKn2LFj{]q%%%ڴ}W]uUaax<555p$IO}555Z$ݫt֭[/Ɗ jjj<8Ĕ{zzjjj_~eMMj̈́˶mjjj2%CdEUU^#GRN;<O 2"%~^Eѻ?ѣ6oɷvѢE(ƻ{'Xb˖-[SSc6+**ZZZ͛Ruy˖-+V��|555PHY<XQQ?[l{VkEEEccX,6VX|%Kd$~_|qݺuCX,'+iM -555'455Kr4&Lp饗j駟^~}ɻ+%IbYK2. 3f4m7[p$ILJz7߼��O<Yg5)SO뮻&Mx}٧zo[eeѣ-Z,I̙3o.hO=mxoSO+{C?p��f͂ax>ڵkovɔJ^|EYo._|QTTt9,-^Q/|8=wj$I977wppM0ȑ#Ņ'^dl6v.>oҥ~ԩS/bY{.;v<4M0o+..~饗W_}С1c/(j(9sԩSKJJ{9Oޚ5kƎnݺ^{ kjNJ /Z*Q?L__뮻;Dð9s|>篿sjtzܹ@oyΜ9 ;:4 7n0W_}ulI(pH$r.[lڵ<Ȕ)S*++?z<A̙?aڴiӦMs\oƇ~p8^G fΜ(?o28 E7m'NXTTxv=?|޽|I}}?u?noذ?t555w�s9>v[obŊwyb+W}t:Am۶{~zܸqw^lMӪnٲh4fƿk`0$͛7guY'O.,,|׷nGwyd2zeYkW®]믿>ҙ|;wܹsg,K&O|ww7� Jy^Q宻J�a2$IqU6lذaÆx?ojj~.''ֽsξ>Gi2O=ڵkĉ\r O>qlٲe׻k׮D"q7Y7\~e}O>rb@ Lz XEQEeJJJ)us͘1kYti[[ۮ]s644\{_~]oD"q׾K{C=te믿/1W_}u'N|+fڵo|';;;wcmݺ>o߾|pɒ%׿uJM&A(Z>غu… .]y~衇>裝;wvm-jhhzW޽{OٳsΎ1cƤRJgٴi#<O{^̱e˖ŋw}>o#Fp8C.^reEE7|}esνKv��\.WNNμy,Y\q{b`�ϷZ<}>߶mƎkٮ={=ի3}fY={bFI7|sĉ<wFڰaCUU? ;wevU\\;vTTT/titvv677-?gϞpb|Mmmmmmm*tMdyM<9y'$f͚w}W~jkk3{iNES[[ +߸q[oe4ơ$ /;?{-iQב#G~x<__?_p7n\l٬Yϟ7xrҥ_O?}U~krرW~뭷NÇoذ7\dn:�v%K~4s9Ex@y~ٲe?`|]w%%%fͺ9D/ڶm[y睗׹ n͛7o;/[tikk+rw,Y$L{$Irɒ%`=zޛZ{M?3Ύ/|̙�gy愯9rȑ#oV|J'vwj>NZUUuw2 3mڴnE 6eʔ/|ܸq<ϟv^^6|~˖-:~aÆM:.0a)^PP`|>ÇY'e۶mw}sΝ;w.0>ÇO,XpN4'N~SL0aܸqzu: O=vc3r^xp|j555W^]UU9{~g?CqƇ~x(۶m<PUU5n8A/_.6v뮻nƥ�z={/_~O6 ðO'RSS Ujw_ggyt:=8e̚5??oߞ7#GiF~S?l61qGy$N@~QV+q= R( d2?a)?y睙: 1c<Cuuu\gy駟֭[hѢEM2T[ss^8qbII hYjF-IC=y<Kv ͛7w /P `Td2(j66Sb/lllUUUEQeZEQ/ ֒ &X,a8KKK vkB~~ի׮]<xpĉ۷oq<$ 6d2i0Nx<Uv<lv'N_jnr^q< qm'~gGQaf̘QWWgZ��7nlmmӧO?׫(6Ct3<sƌ3f(..޷o߱K��BP03fvuk#�1c۷8//iӦkO=w'>{Æ >j̬j'nذ^8O?tݺu XcZ3B%%%F?… �=f9hsO.]}\|;,Y2~oQ|-uֽˏ=bN`0hgG�s=Zh<묳Nɓǎ{JFq$ڳ:+Tm޼yΜ9 .?>aV(VWWk39y뭷i,YrYg 1w rss^�?l6;ð6O!6z~ԩצ�Nǵ*~Gy+W.\[fƍqw8vo`UUUʋ/w^�?<k֬3g}W ^x^{/ܺu˵3<7o>k֬nijSrUU}W�_ /_ /0a„ӧ5j޼y ,Z�nݺQFUWW1.ZSVWWgJJsKez뭇~xΜ9�_ףF;9�k׮4i҅^8zh�)S9L�L6-3^RR #-\H I�M8r3 Peevh?r83EQ5kV<饗2W6y5Wee&$ɗ^zi˖-;3֭[e˖5k֬Xȑ#s `斨ZuL;/744d׿5aV^ġ38cϞ= hr2̖x,[|{;>9s;Ë/y?0M>_G[ne.۱cǝwމf,K\.׎;X,v5׌3`!Y7ِ%˿7o֦zmgϞ9s'dg_d4 9Y{qs>h4fKT ̒%K,?ِ%K,Y!'K,YdCN,Yd8n@:Ydɒ%N]H廐me%K,YNryT*uJ+dɒ%K,?̱a廐#UW]-,Ydr^zbɒiHΒDŽ k,+dC1g"/lɒ 9<dRU5[Y~)|7�YdC/UU!'/QOX%Ȭf;uy0K'֮]_ꢋ.ʖ?b(r-��I�� ,ٳg Hii7ޘ9j]w3WVVΞ=o9!J<Ϭy }3f466z<:]8iҤ.l�+rq�lܸȑ#��Y]b]we2>O>$#�ǟxDj׿qfΜ/swg_G*jkk+//Oz)8peɔPrVZhѢ?;k]j ِl߾}ՇB΂ V\Op +W;38[o n��:th[ox<Vz'OlZׯ_lٲg}y�?l2!nػwo^^Yg-vڭ[>CVzꩧ˝Ns=O_~֭zoqM7|ͷ~;0SLy`0x5kּ˽?+n{…_}yy'AZ[[ٳ~rB曧Mv嗃o_=iӦd2 9jv޽{?C$UUEQ$ATUEQšEa վҚ mieY� KiS aX۟903( AZhj;%I"BTeYKGEMA,FQAeAMɓ<(I$I0 k0L۩YH~&@Ͳyw疗;*f0ϟ'0)-Lĩ1 (cljچ,ZEQ A WU590M †vZp8Nx@aÆM6 �/|/h4`뮻\ ߳׮]k6%Iڴi ]w˲Tk;>ŋ;׻k׮ /W_I' y$xwwçO^__yy,[roە+W뮻뮛1cA%%%oHRZ}XlȑΚ51c�@[裏lrwO:u*Mrܹsٽ{w"ȑ#guִi5jqv]t:ÇʦMyfY[UU5~H${=j {_ښJ̙sW_| ,\rܹgE1H̞={7/9sڵ޻;��gĉ7nF_kok2AZÄ㸢(b3Fk%I.ym,ڂnСCZ 5Fb�� �IDATAQܵ=jq A-YMֈ(wZ:@,Zbs޽Z(嫵Zբv.EQ2gðNsт T*_fq\&dBfe$)3;m} EѓCNO]I AL,7d<9:frD"'{㏼cvƍ}(T*ܽvuu-^w.]tҤIoqn駟ܹsѢE+Vhhhk/]v\wuc뛦t:tp8yfmW_}iӦh!??3m/Re|3fٳq^~ޕEYv{}aD@A1TT0ץr)%R7wP7KBET>,*%\E6هa4qfy69}ιu6m)nݺգG|.\G[555:ugϞG.//_~QΝ;BaRRO?}k׮}@۷o={ׯ{<`0<<<BBB<GB!d֬YzԜ;wnϞ=,Y'9sfҥIIIEEEꫯDsd={feeY"YNJ4xS6A. p t�u`d2lmmU*|5U Xdx<t߈\.pVpt%Z A vӁ, >  .0sc0nh4~if BZYdr8Ys<|y'Mk˩777ZG bΝ> ##cŽz6mD$nQQQwj/^\]]yΝ;]-//_jڵk.\a߿Kl=l2hР;w~'6li}6lN)((8z UTTرcڵP}:99>S7oNMMݲe?³?={b̘1'N/Cmmݻ>O?477Bl]v?~||}}}M68p`ZZ}I&[V,i'eptFT*htd ((^+b?ɼ~7Bbl8` 8h��xN΍Nљ4 @Nn Rp=F_T*#u:D-UXYjw!CL0es9rȑ# !nnn888̞=瞛2eѣGZ|</33-;;wիWSSSE"8tСCZӥo޷o_EEc\ɓ_~eV\_+v?˗/Tӧ_UPBmfRJ)));wܹs!FIJJZ~ÇCCCٳgBvҵte٧N>È;w|rΝ{ȑo6 ߟ ^qKcpq\` 2N! |@8wt�36XtK0Ƞ+F!` d<c!bZlvLLӧe2`HKK0 Opp�4 ˵BN}T<)==}MMM֔GDDڵ>r2L.kZ'''OOO''R___X\TTT*iPA+,,ooQQQqqP(twwvP(tss۶mۡC&OL *++kllEEEEEEڹs~ԩSiii6m"L6-((g0apZ͛7 |~NJJJr9Á}JyiZ'''{{7o޾}^$d27''',,lׯ_uuu5zzz<yU;v숍ի[o%u:݅ <==w- Ŷmۀw̙3f̘1Cݾ}m뺒͆ (FZ!%�eɫjpO p4 arLTp~�?��i|X( &|ɓ .Ν;;�@R(P\ȆB gbtLVC*%nx fx|>&s + Mq{4|-L9<#V,OOτFS\\ ){0J%Hbbb !b :T,4hΜ9YYYr|ʕݺuH_Ѫ*77ٳ ñcD"Ѱaò6oޜၜʀA|>˛:uj=~Ϗ=z, CR>?ի'|"y<ޅ `'ݻwܹ3|gС`+))nKxx'rrr%;;EFF=ɓ999~~~7o ?~xYY٬Y}QF9s&''/*,,GFxMMMtt4re2L&2dC]]]tt_YYYDDD޽GUXXqFJu1DlٲzJR <x޼ygϞ޽;˽rܹsbqcccNNNuupbH B,j6 wH6'''\n+�O]t& Z(m!y aM\?8N#3&y3{{{�'6r|Z&ƺ: dqq{rre@3A8Xׇ*MWK&b`xtkS`SGo cm̙MMMPS7n8r#""";;[.<xpԨQ-!ܹshZ?hIIIl6{Μ9sIKKNhN>ݻwogU__֭}bI kvvvp8M�B9Xnc\j:b � P1,E�M   Bpi,A&)J}||_w={46Coe-\c.X/ k<9孔MWOpUaΜ9SZZR@ѣ .X񵘘#G8pdrs&Njahd2XAҋLfHzXC`dݍ4epO .~L@�=.x9p-A#*{ڵk׮]h4@x\.WT5bM"=,3 PO#2,�z0GײV[N 9-X,n˿jg>>>gϞEwccb-0 Rh�dva d!1 SAzz�2OA- P`Ng ( \#! N@p9p6 i�p-vѷ9&]8*m1u_z +h%%%miٵ Gt:>(Bbn 5H""Ͱ Bda~")�JXp0AA'l֡{n-rYj?BeϷx Vv޽{4&{ *0a\3 X t:qgHef2zA/ &qtvƣ+ ak*Fs3a,3 -$ܘL&e,2 B*,0` pzb(`t@AgXjbDa\JL`O% h �I 4IVE!x>y &Nxe9kfR[LtzęOdpGT(dB6 ܜVePEx$ D`zIsmb OOOL&H0),U<%LmzE&P4hlr96<Uj �kp!QK!CHxfL 篽 S<!h 7e=rW5 HZBνլ_gi4GP2R€E €X'tDaX&g Á$Xz}cA`+B Ah\ :id2HfKKKt:AVQett)//7 sx<8.j+ 2@ēA[, L&Wȱ5f5묕,x% ` b;1rN\b! n,r:*l`C39@ @hGrrHm$ 6j.BnȦHhqMI}-/=nj%e1U߫ۃ&RSSAE-&&fJrٲeqqqsC_WX?#Gpoyyy8_p͛cǂ6ƍ !oYZZ4iҤŋË\.aRRR\gf6tC>#� ɀLu# 8�<"iz`DA =7}啟ߩSׯ eF4Ÿn"fg}5ݲj[1&_yMĄZB&si󾜶pڢX駟 KLLT[%N2% aڤRirrraaE-))INN 2eʔ)S?Sg͚uěu8p�W1ǏONNvNKNNH$SL4i҅ }T#~ €bXR 1c[p 0@f!a�js?ht:|4il8>z\K=ooo@�Z- P(|ghR{{{[[[( 8UCH#)Z~Z O>?3fk6o޼qƁrMMopƍԸm۶#66688͛wyg铘B?Y( <<<<<|ʕ0ΔGG@~С׳gϹs2ݻ+33  2ƍz^Ĩdi%hlll^)//(X,\lpP(T* "'\l!$o[ؔ@zeBBByooooooG*ȑ#|p2 4~_T*+uAX9(`Gg727BwMht崔x⫯jcc)#XtW^y%++`0,_<99?Ν;Zmee% M9sf>}olFFƎ;`@!dӦMiii_|EpppCCCmm-M �ƌsӧq[j,.�$ ;rZ-;p.�H,cm8E֢d .j0 2xaRd2�ЯAhoZxn0i& k׮p\77SNa QVFkmSz)tUΠ'VS PmW>VҘffAU+P=7kC et:hxCp?Z#GܹsG"/B̓㣖uVP\~ȑ#Q_2;;;''gѢEB_ 6VhG9ho x\B1%ԐɆenP3Lާ<Mư_g8wqq ޽{߾};w/:99A* J8@;F%SbݙTJp�r^$z-R>mڴSw1Y\b<Ah�07o^vѣGCBB?R\\L35kl۶-44>>jVL� f\B! J2!<eoa_\gcd`|h�4 � &ry냃.^XVVT*Qeb }~F\T*ꓢ.ß\j뼜r_'&&x<Xe˖~Ϗw^Hp/PPPpůjǎ^^^~~~g^~w*++e2Yss3nݺoBϳg:tɒ%Ǐp¹s{a}OE9"0G�j�'둷-X@|.!DMԠ�@mi9խhIݟ B8NWYYd2rJ|;! p\Rn@P0_C@znte[0O# Jbjx #Jz8cǪTlBڵkcccJeBBBlllCC /j*k׮ofϞ=&MZbw322 Aپ}{JJ[o_BBBΝHF? y'$$?~ҥ{ZNllZE9�98h�%=ǰ{gДhP RX!L(�>OrNpZ84Jh4:gg禦&ݹsIfj|50?(X,F4iҤIO>n:[䭄mze;5 cƌ3f-,X@wK'j2.`U?ߑY@xp|5:<5(1ecW{|rx+:WW+W O*"a!Ԯ UnP !JngϞMNN裏rdVck/~M�g _ث0]m1FFdV-ZzEz>1Qy/mB�9t:@ TUUTVV»�*3(R7pi8�ӌH? C+-42ye@_4?E5z.LfQHHõ @dvޓtY4Lӛ~ɍ�8p xpPHVz�:} �0[F<=  ^4pZRWD!^N87&r9=JaE#F5̰)6~i}j}7iVD[s.tʚصdNNNB|ݝj5* ^D% A=#�`Sb"͛Us9࿎CfJ�QDTXXB6 Ģ(4$8pxK;xpcXv'SwOfggd֬3JaIk0 I�U$[5B9(D0 ;w2ojj $`c  dt 䠚'16bc� e-E .kK[If솖—E9i+jXљkV潟[!,00c *՞t? ?ka2 r$~heb9 V ޷osr_(eR!/ Ԁ3/+3uA:;r@%~ښ[@+I- fxb=XxXX=k#r,}ǦdddL4i4qT*p\.(X'Kuu5SNݶmTM Z ŋ)li6Ꜩ"J% ��B$o@&D/^)|V&֬f5ݳa[>xXA ]Hm755m۶ # lmmr9tnb i,INU%.)!Z-p ;D>Ԅ w� 15 ;J̙(m3Ld1Œ9 JIxҙp1 zϐj̙7aBHqqO޷o_F&-Zg1邴E۾}{NN!dСBlll6lؐo>x=SP�� �IDATzX,^dɨQp:լv߹5,C!AO�KL'"lhh�aX0�o`0h3 % Odf2Jr $P�֗ijE!F E QFnb&"pԜccqy@ <?$px[ &"rOH8pnܸql6짟~zgqh"ݻgtBm�g#h֭[iӦŋ'$$ˋu:݅ ߟ|~ҥKݺuBP8P2qF�m1l#!s\t �1ɴc:/l-`葔(%p\ 44 d2bF,n)Ha!Rw߾}|MZZ\.9sfPPP'L~z�BAXzƍeeeIII0aB߾}wyܸq/_vvvnll |>_$ϿkzzofЙh4...|*Xjbv8999::,LVX Rf͆j�C [B$-AF!¼DB5@rmȠC 9 Px"{B#DWt1T'B!xO:h<`5& ~ Ǣ]paz>j544/ҡC4|`΃<y277W$h[yy1b{{{sJ$qԩBB 1]x fD"f0dXY,V/&3Ԩ%J0A1x+lynHE+f $a1Fr>m4Qț7Ѓx].+˅l6r 􆿿ĉLJ-_|W^߿dvοϟ=rȂcǎ%'''fffzǬP,88޾Ydd3A� 477cB7` -!g pX+Ff3b6t 2Q!.K;gQ'!...}}}}}oo[o=ztժUֻV% ( LBӧ#""pլ-##Ν;(4@0(4bZ JU^^ ll6ZLG� >x# y@@.Ʉl3=x OC|@ .H Ճ* b9;; BT "|]s+7qšяu*vkiӦEEEݹsg޽ggg&YQQaoovy ۙLfjj?aWHHD"0aj7ѣG^pͭyɳfz!0#77ԩSξ֛feMMM* !0%hD:: AEҙFͰz,(H fr<xڵk( LA61XsZV,x:5^Ľav|>i(4RlLRhb;F d~θMOF |;{h4[uzsb lذa]t|M9hРիW_|y2dLOts233gΜh"w~ԨQnݺT QBHxxM?~UVM<bcc`kjn1MFv&Il*ѭ#A2 +F2qNbQJDt -hԩ i}Y|jH>0gwcΟ?f+O?4!{Ifx<[MbgggV{pݻsCC V."'C* PH#Ff3}"~LB<o,yUMn.˄oqTcx<hLn(d^={-[റ,I l]>gYjO]|Y, zlaӹsgJİ&Ut4<c* &Z�@삣FS |GDA`87# '5�{BNsPa)=^Լ^P ̛E#% lmn)Pȷ=^嘟y N 9fUUUBֱ 8&4!�9N:2`L7}"5 `�l9@l6S' 1AaNͩj@6(;dX.]0PlhhP@܌E 0컿4-쮵iqeR["ɛ5ʹOkjjrwnK <5>m��!|W-&j@D`㲲2kKB fʡDMdI�X YKլvӧOl'O|r;x��F JH�1C T B(Jx0l?0:`2Ԩu]APPW Qe#s4 7؆sN A 1ZzLi93{&-f`vx|{4z+c: 2:vI|ctB1HMp Ұ1-:� QR)Mx@OFV;l6 * PJR1 Bli�cA.oY&4n7VimLYf; 9tRr~۱1֑ H ׎=ƞ |'z: 4,C#"ékt !uj F7n6Zb %d0 x>>>nnnv^^^Е<uT'''N0Q(tsaaat{,kDtAa{8 ˥ڬКXe%%%Zol؉ eE+U}9O0ib04D"Qyy9TCykkk٫YT\]ݹ۷oQ*6r�{t >8#Z@+=A@[I"5=/QtppAG+[+Z\|gbq~~W_}EٴiӥKm۶~& ;>ʖ.]k :믿=4m۶#FL2rʕիWϝ;w1<9!dÆ Ν#ǿ !lٲ|=!!!""ȑ#ʕ+H$[nY~իWm߾㩩eJKKl-[<tО={ #dz.]`{ٶmh<ug}FO!VEAw?nb <җ18Epj@2T}R*4s ąBaHH[=hF8q"77l6%5!aRBĆB12#u2[!Tcq!r o ;::B'J -eph9Q`yhѢYV[nݽ{ZpBvv}:<̟?̙3EEEׯ/YdڴiFݻ7~wȑ#Vڽ{T*蘖vҥׯcO\.J#O>lذYf]6##~'j̜93'''##cÆ cƌϷJK,ٷoYf͐!CZݻ?spM<ӑl}3f#ŊΝ۽{z1Hhoo5MJJu:ӧ̙{EFF ՁvHvvvEEdC LJJ9s /?JKK_zӧkGL-[rrr233/_ݣG'7 7NuLAf|/j!;yvC1W(*C 899oĝ?E"QmmmnnX, ( 3N1\Ajb\of ɔ~..r%\,^>&pL>O�qYSSӽd{Lky̍7z1]Pt֭Y"P½ڦM._B50h�n^^^M0A.|L&wJҸ?!׷YTzxx;>>>zikk[__ߖ?x0Tk֬Yvm{p\\\^z 111eYYY-JNNW|~aaaUU~#Flݺu„ %%%qqq H$NNN* ccc{_nݺUWW677j<==Ϟ=KyjuΝM6mڴ':2,dkXFJePGh^ok]1x]|}ŋcFS 7<<\$T*d50^_WWrU\1/j3Bc4ѩu,ڿe ]N'1 =t Ik xV.3>ҠCw>ﶔBO^zu߾}7oߚ<HQ_H+Q}BÇoݺեKPW^`Add$!k׮NOOOoO?lٲ]XG.\pʕ!dԩUwɒ%Ypɓ.] Y-[FEE!Y+Wڢخ]BCC7S.?_||I"a+++^^^K,ٳF9yd\\ݻ !111ǏϚ5sɒ%n_jjj6nؽ{W577433S*L>^Yn:th;G:s!bl @ p8Уa0aaJ^?8cٳ\.:Z%\ kl+Wh<0 UZvppqh\__hxilht&`'i2 D!;"(f|! 6?8BMi흑l>@#^-dR;x&b@sŊNzW`@5Vd~h>4-G(v[2~{  E1"22k׮K.%n޼ĉ-㏫Vپ}{ll,eff&&&Λ7 _� ,5j  .))Yp_~nqwIII9s;ƍN^R&;wn޽Æ ;w}CNYYŋTIFFFmmҥKe˖dɒq!gÆ W^ٳ�쌌ɓ'ܹK.=s̎;.\HӳW^sIzΞ7oΝ;zU%Mt%!QE]]Ʉ%%BNXXR)l+\&S׫fBDºv͞;88uy<O6Qcb1C-khhn߽RRp"צF!W !B dYa2x Fa0!DGy`08roF fc1?X 1b_[cXSNݳgL&KHHؼy3 ~mnnn Ю\2uE͘1_j]M*677s~/O,66qݺu^SSc^-STG9u$+~紴6޷O>r';w駟d$Z1Fwtt|rnn.`d2ټy-[P(p㚚6nڴ H-Yss3VBFP( aСC.!/9fPT8:rhMPƄm7KGJ*V YЦ&^``dg>>ܸǎxyyiZRؽ{wTZPP 9:;u9Tx즇ZӵKG.N 2C`iY\09g#}NCQi8 VP`< DHmq.pX <(رu!\0bTdA2r8bxڵF |GdZɏa\,мa] ܸ\… L /^pԩz77 򦦦ׯ?SOV+Hn߾/BtҳgϱcxDoo'OrHeo{ャ;wdffB333KJJܪBCCy睾}^z5##_~ݺuE^^^C7n܈#|}}uxmmk$ =>6SN-۳gO;;K.A-_^>|xϞ=]]]AgȐ!=z8q`_N82##'%%ʕ+ ,,ѣ!!!�5FgK#j6&}Gpj&/7ܼmld_H!$3jvSgS(*k׮uuuL&SN|>K.<<??ٳ 4?$t:N>qkYL6z36 Cv:b"`ܡ_v$ 2׺?EO T*洚v{K H^jժUDT0O!Bz6RK<==4Mqq1`0zԩx<GG &TVVJ$_|Ѥ}{^|Ʀ%RUUKKwaggչsgaoookk[SSSSScccӭ[7& /tڵL׿kP:b0NNN d2}|| ;a2ƍ.--e3g۷/d5&N*++;utR3`@&٫Wrq`šm)8YXƍzƍݻw+u;|ꩧn޼igg`QFUUUqƍ?ׯkll |w >|/>|̙3{vMP8w\n~=zx  X,z )ZV(EaTY{Ba0L&sgˋUWǨdiߍBGPhi(//J Ǐ?zhqqqmm--4&|�k =]fzqkh& `l ߫W ,#?b"F˘?4� 7:Cy<{C+�Œ ֭lK- aƌMMMjƍGaDDDdggډ'lmm%>swC&M|# <ѣGG 㟶:z /@uс"B0LAG+(܉*]<�pQ^b:u$ ===ZGXXc^^\.wttBD")//lll:,hB8Íu kvL9 pm:iҤ޽{CBBLYG94}|1ޟ<^a&<&,BnvQ>CnnniiittJknnտH}�'2d:!P7uZ0|4� l`2V*>&pp5ĔMMM@Up22 R^vvv06>ZQ\z�� �IDATD4iR+ #$^FbLdђ-Un�pf, -HR@. wP :: !HBﳖﱲ6D}W@DF9cdh`lE}Lb^x]7Hrp8� �|kטL?8;; ʆJX >,N� jE (|>bхni?~4Y5xZgCmi1p;`֜r(rNB\Dx�N =+ HPH$, }ܣܹcgg|�!H�q۰4JXVZ�7F!Lo  .=Ϭcc;amW{ꩧ Fppp_<5 iUfY}%2�lll�$* J hN:UTT@ǢH$ ... b,@Dza|Kxi@6A 2*2ܓ^u7/JGHK1f~980S9wݱB+))}v{ 4p>JAAcXW&ZxŸ\.[D ޟ@0Y{VR`juyy9wrr\F> > J4C7`/'pvT*ʬ(#7m$h!0PkQF]>`-++ܳt؎=km7Fcvwwlf|0p1Bj0 k &^#@�H$:88R\\\0ppp0 nnndE!faUVVF[#w 8V&ԁI'N4iң9^`60XE,`t<Wcΰx<P褮*7MEEVuqqqvvVTR-Jm`PVL{8-= g" >kLUu fkܶ.rn&}3m`.F_#_4,F9Vڿݰ0ӗwV! ]<zplxB DC66qVw[[[XB! `c;hc c�N^R+-- T*B�PD4BU4сnŏӒ3x,f!IH aK$irׂ HCI؆#Xijƈ-"ٳgE"Q߾}ccc 8mڴ{9ĭVlʕ"`R"h˖->pH$駟]P(>~= ]v_$eee9s&88/]믿QQQ"!IWD6m?=*Z4}ꩧmۆKȚAM<Y,ё˗/UWW?66w{쩪5ߜ9sJJJBBBpt[38+}p;8 g�$`#`H$MMM B.T*\.W* UUU 2 Ҡ$/$l #0PJNR ()#bNvhjXtMMMk֬0aNy=qD:Խ{Juᠠt8pyz!x Μ9C:tRljjzd˗/?~F$ǁ~۷C/СӧO<9%%eڵC?^yW^yET~ǏwqqINN3gΜ9sƍK/àzӦM&2ҏx<^ppp^^ޝ;wO8pr[nݺuҥ׮]۵k۷]]]wy7n7n87ސH$999}ٳ!ӦMٳgff&V? ?w . 0cggשS榦&\P\b%M\h^LZsshD"Q0NPp\d2TRQ=XZGx jBX3T]T*� P[ Z; :1x&:7"{hNuûALpRܺuw}[o'$$ED7|"%%eeee ޵kŋ+**/^\YYWTT̛7/-- ?䓐 X⣏>Zvs=裏~m_u֊+ _uoAAś7o3fLXXƍcccWXqu~~O3GGy۷a˖-cǎ}ܭiӦ}g+VHOO7nh;vwޭn6lf͊o`K6(]�] yʔ)#F�G}P= jUS my#Hw^VVv֭⒒BЭ[79Q�3HzϦf'hb�B~=?�m3l. +;y0|>ϧ%АtJ%r2lذaԨQo??x`68ȑ#z~ʕS-Z1yÇ744455}3g΄~.;o޼͛7'$$ϝ;wݺuknnalllVZյk͛7'%%=q$zӧ qixq͚5Fzw?ooĉgN ₟O8qʕӦM0`/N١aÆd/׷"׺mܸߐʀ_yqNZPill|kmm-d &#ap B*8�(C$??_,CbA,&D"c'^.ډppj4@7\B־iߞ3gΞ={ӷn F,p8~/兄n߾=77w޽QQQn2E"QTTǻtȑ#cccj:믿/[bΝ&((*  +,X_lٲ&ҖI3('''laa!˥svvNJJFd>C(??⺺qARPnݺ/QS(&)žJZzs]|>`|gBM�6�NЧI*<O@2iZVTjR)b۷e2Ycccuu5]&FٳpX[B0Ī8拐Rp_ %]hL`V1h`6 {EG9VN`Lֶw###gϞxb777uܹƔٳgϛ7.]ts̱8Ho]fڵkG9k֬^zi˖--2?^~=Llb|NIÇ,eggDK(fН555C yL6ڙ3g0bt钔DER8pAEEEQQQtt4FېyLpPGJR V߄BMuu5Mo^ ɵ ، x7` `".`� 8'mٲM&xBc)sjv\AK_E+!z$5w@lllQh?̕hpfrb( m^Y$4LU$>MsW{jkkϦıc W_}n!^KLL\|Scbb&L^YY9cƌvrU-|˗fdd<\N!$'''++kڴiJO>Y|yAAٳaF˷~{ĉaÆB.]ڣG(`͙3vƍ{oĈ׮];w.!$--ѣ;;w_/ᭈ//{o֭kjj H$3g\x/|W_}iii|vluh~ JXhA*j5 S200h`H""*h-5zlI^O(r4L!}[zg%K̜9߯_?hꩧ/_<fȑAAAB0==CՎ9288a׮]#b,%%77778v:Im9rdxx8_~=&$$z|ǎжb T;5k 9r$Ll:urc|޽[.9FD}Wo hӽtB?`&+m3d|7 h (;;;\ #l:=:XL,ap\.tT*4 64 wph8yͪ M#dq;BP3 pZQC݀Wpδ$d2ٚ5k ֭[EDDПDsuuuuu5}<]O&;L2&}|#[^,OMdX91g?ޯ_Xxyc ,�!p� jF F"`gґB* Q =;-- b606 gCpBm2-k0Ãi&03{SEԄDX 4,N6{piE�ȣCR{+ #ܰtGL&3 i^`<1VZZZ[[s&ZjVkoנR0�n :\(z bx d8b3 JIXu�Ѱ/(( & aTi�]KMG˺X̵4Qj-ic/訷ٳx^IA]MTZl#/i\^K I6 v# m 0eTPQ 'x&8Ht‘kxV-4skaK}}=vaS*0C8BNǶ٣*DGo9 mB{r X24sw�8aD/ k@A,cORb=3r@9 b5wRjJ3u =HyY4 y\IHS; dsP vӝ ! P6 j,8p i7Zр^CC /b5Tzr233;<T~<�籝ç11Oggg CID--&P"YP;'0H8 }"r SV B`C . eFQ SHM&L:Sjcyթ|X|W`$,4}ݖ ]*++D`^!$>>'+ Ceec;S|RX!l÷0UzBa -]9F󡰄10$O > ),&(LP2YkkQԩSdjqyrrrry9˘S!tΊdj4Z щ@ �xKc4,̀"'3~J%rhaJ'#;vJ х73ZڌNaM*:V[B<3mZ!jVw+l`cc##ph2,@a+R)A0@Pb ء#L wdlV i.�],(XbհOZ(NFq)=!N!p3P()==|[3999}_+**\]]I`0ٳdAAH$?vT*]|y>}3TWWp^NDD/ou-66k׮gΜy9 ruu;yWWWl:|Zyy9̼ ۰az=v}.\P"gKKK{ cJᑐpΝBH�*Je]]BXҘ1c<<<PKB!D02 $a�toooߩS'�455N<SPq!GI@. 0`" Tj�1*E.1[Rz}zzzuuuJJJJJJ}}=RZZJ?~򔔔 Lb*2bĈ҂^^^T=pNΘ1gϞYYY1113f8bŊ�+deeرc˖-ӧό3bbb&NإKnlߝֹs{~mРAYYYg~|u:ݻ?f͚;w3~mN/'&&r8u˗/wttꫯryGM#݋b^'}t:ͽ{ ԩS߾}y<2Kz�û4 ^'l6B!d8c%NyCüSKUni"ეV>hZ_Zʡ1AA4Bi=|A\\_JJɓ'###333駤DNϾbٻ (npԴ02!AWSp)ejI|˭eiÑRs&*D' W<45Vv?xwk??qƅww^n###͚5YfM6m۷oϻw^/Z`~}v!DTT̙3p jr(((ꫯ&Mϙ3̙3ѩ['|ҳgO*V% 0[tiLL]鄿 NII ]67Z9_|񅓓SddW^ٸq*W'2ye+oV*g dHutRjj*Qp z8Q{^ uވy h..._\(�{(Ox%777*4 z2m }wOjl6(TIďUY7RTw7X2(`].&;/uĿV!fsRRRddd&Moٮ]={ &,\022R&ڵɓ顡԰Ryf??oڴBZO._/ ~3o޼ &߭[֩S'<<QF[n޽K>lذAuŽcǎ:uj.& rҤIoV.]_odڵ;x`aaSz.]o0ePKxhp�m)@ 4pzMRR7t/$k DE3/6Jt1;HJJ$N xd'%%:KAၼD"qvvsuðVeǏSG۷oKBѤInݺYFd2}׻v 6lؕ+WK,Z>>>T4==ԩS[QFjj*]6mڴ자AS[vwwǽiii ,\I&6mrDҺuk__k׮5O>׮]3 EEE(33STyJbدAB"?TpS`0C@Υj4A&l$KV+e*E$$\ILtٜHսx,�q)@1k2z=CG\Y{wnazrYF7n\CN/.]ٳgҤI-W!X"!!a{y @~r-[fee\r۶mz ߢ$|ewBη~k?v͛Wm�� �IDAT7#Xz57nzʕ+W,,,yK+V$%%~^xdV?;4 `"J +":To Ըq%Kx/q8zBh޼9vhTܸ4$P4nqhlWW"]ƺ{"rş- }z M%@+V&6 !T*ZVP<m۵kWNN.]ڦMVZ͟? !ƌ?z]vM8O?uԢ&::'ܽ{wրܹsΝ֭[oĉcƌi޼y޽WXcǎ-[5kc=֣GK ! DO+((֭i%紴єH$;~xJJoݠAD߿~s9rY4MϞ=z)F5~=zɓ'޽~�>ڀ%k R6ksr#Iu)ʚ?Scm6[bb"m6 z!F3YLJ(csX,]@!Ԏ we9Zڷo_ h;MFNﰰnݺ5jhҤI"͛7kժշok׮-YD1p@*2pjUtvvuٷoWXI8_R͟?,Bnnn7B[ʀϝ;g^ɡCkէ_G}Tq=;u?i%_M+VYvmjδo߾:uԩS$Oƍto>Zp֭[5@e~^3b0JӓVx2 G>? d2Vݾ};'WF"5>~Exk�fFT�e舃9Bij,Ņ~BZjQRfSO^:&&/tRz EeQ=H(UL+Yz`v҃[n"vp�uX1 r;^m+}QF/_ (Ȍ!~%> F~bC yS[\|Tȧ%! ?2CEI(i'z4Г]\\ȂGG�)4nE999ݻ\jܥW끖$K%JA٨F{Z(2v!sWh<;w !,X@],�T-dgg?r fpCo G= Ew ]LU. 2  y}y5Ҩ|/Z /@"k64MPVFy8,G9S.P\\|СGu%? dTA2 29x2${"֙nC3ؾz:<7li.%C"6EÉ2<Uth 3FrZmڴykʶo߾fP(ZA?bpI@ Y f:4t;P)."DBU"^H!oo[n!F 8�) ͮeR4-A#5 KʪHGG>T۷رc%~%dž Va١Qt}B- H!ƀ—t1t$7Q9#4tK~Q*F(Xx֫T#GΘ1iB1wss$\;z4)vfCRhDL:ʆnݺթS^zYf/:/HOOoذa#JJ5go6M'~Rf 3M�AQ5\C(kEn$RfΜ;4*JEEkxJPE6qıg"l JFwmq@˩x$&&6k֬2 ;JlǏ#znh`3xK* (c5()JPe@P!E nr\6�xxhl@SF5hhHb ޔ_fr>{1ϗ¬qK{Vu?=yλ=ӼՓ߃Ld]B= XzSOKAי7L*QRpjIjބBlM*@ VQ t1C=@u2oo0J%r!0 (^�1q/FЗ&!}B"tرcF)$W<C8Rz\dQ!&Kyts9SD r_f7{0OCHٯ̇6C [n.]BBBBBB/_^ ;;{С?|PP[ou֭}d )>}ԭ[wƌ[#GL2nݺTl PPP0a„g}w޽z~ ڴiҡCEiEu!$$M6.\^x}=z� N@@@ծ[lҪU-[pXxqCBBRSS_/=رc lҪU-[<xf9T(d^RIA�OLhDIP%3B8+(tHJJB3( p$3r{#I)d<VDx;Q҇bMP5cdž !N:_}֭ /]$hӦ3<?oߞ<]#nذ+Wt;1QNSLgyfÆ Æ {+ *_&XjՍ7wMu;v,.. ξzjFj֬y1777kiӦ?:ujٲe˗/(y… &i۶m͛9sf׮]gΜ9iҤǷhbټXE'|ҩS'^OeF׮]{ȑ8q-AhǎB4i_L 5jO?qEM6~I&=c3g|'/\ᅦ+s=|>}5i * ~bLa7+'tGPr#ZXiJc6I(T駋\5Pn VWn)"(�.&#JQF^6A-[}ZxOW&H"9΂wYSNݳgϮ]Zlj vŋƾ 'NٳMmg9VZzjhO??v3<˖-/f1c}ܨ?o=tШQΜ92cƌcFDD4nxڴiEEEw}s&$$T!_=rȺuܹ3f̘>}̟?_Ѽ;ɓ'G5zN:M:uݺuhpԩѣG?3fjիC>`0tdɬDHkHlVHdRf% w1( d!J<+[,I >aHPRa)T*X$Rę=\Ad̘!&J-V@¼Dm6 wSDfžAd '(vJݛ< O7o\ᅮſAZpaFF`xܹs7lpҥK;x 'Nxa^O>{qzŃ·~;s̥KvmzȈ~]6mڷo͛7޽;$$$%%qƭ[0aD"۷ԩS<XA,.\v^/..NMMMOOB 2$--m׮]gΜ?~|ݺu׭[333SRR&NزeI&;wr)c2UMx#NPyc#_&d)z1OURM?Y֒87!(dza4U*M[F.0[,Rlbri& `B!B"Q)d\P;TuMZKU LH**_xAt@1M4 k/Bl߾iӦcƌ!t\?x$:0??!F_XXi|RAPXXxʕ-ZL2EѸqT^L9֨QSNV s=#)˧jܩwZ%B(U*MfL&x@Od'VHBeXlfP(lB8TÀV",T*ZׯWXX ^{xI$VL!p*[blq%5Α!Ʉ*ɔ,Nf➴ CG)<xTe˴ѕnNUI={&?pɓ'/]K,(--mΝ'cb|GנA عskת<wܗ_~� H~_Θ1?ʕ+6mZs9~#G^z%!ԩ/DI#Tv'/o h`é$hWD}x[;S4N%^�6G0K*~KaZGҽ kC9.dAƒǢ(+Fc"cw3= 'N[^^^ÇSRR>l2oڵKRuرG: W_5k?o7nܡC)SvM:uԩNJJ̀uڵ+117HHHx^{>w܈#Fq .ÇWx ޽{zp+VܺuN:a„;vx߾}g 5j͛)eĈ۶m y'N7xG*iѢſ]yAff](k'AɓeAL^m޼⌌ڵkS ***RNNNojuݺuoݺe0rss5jT\\L C4777Wu˗/o<==fsQQ}X,W^_F͛7}||T*յk׼jԨqU'''/-Zpww/TЂ PKVVNkܸ1*VOq5&|||\\\Z-\.+7ׯBggzeeez__L^㏏?>22oŮЎ;^y啊KZEwMNGP5L&H^yͶcǎjX} 777==}v 1FD}7xrJu<J@FFٱcѣ899q 'W uPB"t7KCG"d ;~\.ǿ`י"ÃwVUjr+_B$%% 8_~=_|JvKTF Iv E+h_ȱ᠀7d)**rB-|uq}B֭.\j;6k֬0ǚ8x pX+8pL. q>>w~́Qp, (Ν;?+gvk׮68N`9 }8EA{piR;8ՑH$G�8Ͷ{nNJ8p\]]'Z֭$EΫ6 LVPmf(E{j(.]5|BJET`PO,!0yyy...<(TյWޠh,JrssGU*gggR\ h0ݫ򬬬C]Pf֭[jUYYYp`vj8{u8yi...H0L-((8}t.]De9˄SNZ,탔.ժUaÆfZ 8йsgF|^ n޼ٶm[V í[B4jԨm۶MqqqsULŁbߨP^ %%ER5k֬Ė-[֪Uyi8vXӦMy^#pPI`9pJٿ?;9rI&eֺKLL|ꩧ.^Ԯ]SNv֭rsN__7ѣkժUD;Fkժ۷8f900: رcŝ;w+d+WҺt\wIJJjӦMYlܸqȐ!'JΝ;eQ4HII =xٳg҄ ,4hP ĉׯ_r_ tk׮U[DOOO?z( ;)M6nܸj2ٳg=XZZٳg#شiShh۷CCCRټyĉsrrl6c=w߽uT~„ wwŋ111BBj*!ŋ}]5kܼy#Gbcc'MTcطo_BBٳ5kgϞ/rΜ9BL8a#""z1vXwwiӦ}g'O\ti/njsƍ|WW~͞={=L&=z 4hʔ)s̡fÇҥ˹sf͚%P1H^OII]vaaRz;w񔔔Fz/1>׮]{…|͛#GB 0*&̘1CVoٲERܹ_/k׮e裏N<) }Wo߾=j(iҥjz͚5[lBt/n\|Ν;ݺu^mJHH6l@Sa73ft`؈#4hмyI߇]|9;;)8yG}4v&M >7|׆{i!DXXX޽oݺE7XW_ -((6l}kh߰aW_}Eƕt= eذa/_޾};"gϞ&Mksbqqq_j՜9syV?z(dPnnov%ɔ|a^}gĬ\2..}Njjjbbcz= LDSڵks !322o/&%%<mڴ~Ǐsvv~ڴi/׭[7...)))22Xιsj֬yĉBFuĉP7{gn߾}񡡡G;w#""j׮K/̚5`0ŭ\r˖-qqq7nx7*bM>쳸{_;wcǂqqq2lȐ!  0r9s%駟N9t3f|w1޽{Ƹ8''ڵk̘1oƘ1c>%Ke[l8qbXXyȑ˗6ԩSֵo߾)S:u*((^y ۾}˗=2z={x{{&WXXxTN}/ݻի ,X`3^}ٳg8q⥗^2|dh]v+:...h4j{YhQ~~FӧO\\\$ `HJJuV^^^E\yQt:^_~  >[gϞ6mӟx hLJJ~zAAT*W^i&H+[lYn]EZBrrWZjϟ?MFqvvqss+((0͹oߦ[r6mPGz;<M&SEdcd2kJ$ 6kZ//5kt\FVz\.1L&G.8EPnݻ{...k׮m׮]NN\f͚5kwf՚i+i:.55rU*ׯ_o0Zm5jժE+IU`GRfgNIIdIII$2٤I3fСA>#F{fذaJrѢEh4֮];44ѣmڴiӦMnnn\\\DDo\_֨QC @x�� �IDAT¤$iteС* $e˖'Ovqq ONN_~aaa@_|ŭ[._< .8$''׫Woɵk׮ff͒J'O*=λAvvvrr>zС'>q7x7bccºtpB RRRFO\t~'O4hРСC+P=5MrrK/D]ndɒsEEE}܈Z@T]]]Ǎ痘XA>Zn=nܸs7aƌe^|ԩ0ѣ^zVzꩧ\VdܸqO=TbbN0`>vؾ}ZjԨQv)+N>}Ɉ4Ѝ7ƍ7*qfgg:q$kMXn]߾}8v6IF:w\bb[oUfhoo&&&B SBfƍg65B0qj"Uk>ZnjMJJ>|o߾ عsEqXP+4i2n8v)ѣG駿rի'pssU( jnt:]LLL2lƍcƌ֭VݹsJpBtt ԩCn ˗/3gNEl DV!gTTTzzzn݊^^=\޶mݻwm677WuСL\W"j___R)۷G?/AB5jԯ_d___77O<Fq֭1HjS~3gδjYPH$ ֔Q$d2?~7ި[ǎ;ydT1p...$?7;/_޹sghhd>}zΝ7m4`nݺlܸvQQQ&LhԨŋ-Zd05jkD, r7nׯ_n ׭[;a„iӦdgΜ1/2 R*FFF;[nx6ȹsn߾]QV{Q-[={gϞ.\prr�˗/~GEE 4hÆ zdNNN6l۷/ڵk333}}}@@@7\B#v<xPm޼W_U*UUյ ޜ8q 8;;W)IIIT vݹsg777LVUoܪ֌Y&۷uZYƆ7jZٱcK/V ߺuرc<N 1c7(Tp!*xSļE<ի#G4mڴI&fǎGvhs(FIHHذaC5{j3q(C.\HrN-Qaҥ:8p@дiӦM:@yy奕7nTLxAzzzUY |||Zիg (BUyyyYYY|`X'J EȠ 8ȨdAnn.W;=S6ˡv#mԨh4j4b95ktwwl:Z=<<Jo\.!<NB jD 4PTRT.W֮FQa2eoٲ% LTgmz}u@z"vc5^pJZFZvv޽{+x\9Z(j;Z,2 Verץg2Hr\IyxxT "͖T*SfMWW7vرOCRl6hZ6>77󁁁:[JfۺukppD"tչoիW5͓O>iY;xpfZ̤ dX,ڵGޠlyk8:p*Kis,�8rŜ7o^Gnݺ+Wܺu^dZD㛼/gffV7nܨM~n޼Y[,}6lϫ ݻuCäIGo^?|-ڷogÇGe=zz+VԘ1czU-5kZ*<<|ƍ0`@͓wttm80|J}fzУG*;o޼={^z5;;{ر=… aaa˖-ׯ_V]]]'MgϞݻwO81##c>>>4Ȯ]Ι3O{u1e_lToU޽{LrkbtSRR֯_?dȐe˖=SJȑ#Bvڅ-?Ӊ' 8p2L|̀+WPJ''~̙3z~Ŋ EȠ6RtB~ĉ~~~ZR{uuu<x0m7 rǎB͛0ovkC=""?%%믿ڵk/_<eZ]vmLF[>a„_~… |MXX؊+҄/>qk׮>}J)Bmڴn۶e˖V2׮]kӦ믿^F |ر~֡C ~ر# 7ܻw;w:wܫWbB !رcWXѿ v޽dׯ'$$g??!C_95jݻw׮]B_~_O<DXXXi9|ۖ/_ٰaӧ]vk֬ 0`@ZZz}ppp||y<ZTq>}:5*11qРA'O<t̙3׬YS cصk… ?S^?xഴYf鉉Zʕ+&>>ĉ111~mpp۷y#GΞ="9s,Y$880222---220111,,l۶mG7 /^0`ٳg7555>>'O<~f͚=c&Mݻx:O? 6C IKKyfpp?yM֭[WPtСr),,ի۶m'OܢE>`Ĉk׮vZdɩS}g}v̙+Wܶm[\\\dd$+VѪ8PR7NocbbN8ƍȼ+V̚5Ekvvvn۶ʕ+gΜzxxN_ 'ׯ>}zppKÃm6СC+jw]#Fxzzjj??nݺQ-Z0aI ;lڴرc7|>}:22/_Gyzzoݺܸq)Szꩻ ĉFQFNf̘Jᅬ=N::t 9|`ĉ]vͽ~s,sJJצM m0.\@Ԯ];33ss_ۮ]-[^~=??^^^ƍ̞]jO?KMMj))) J^Zm^z5rȔJzY nj}ݾ}*aO>:tM\]]ϟ?ߠA͛7Uf͚ٳg{{{r/_4iҭ[<<<<<<JWiڴ)/.. lܸqZZV ٳׯY\.+g éS9lٲ[nݾ}}W.ӥOnٲ_OOOBXgff6ll6{{{siԆ ~'ײO> d)))jZ{IMM'LРAOOOJߡC-Z\vzԬYsҤIΎ>ym:vȷҥKu9}t```&M.^Xi۷oٕ֬+W~۷o9>裧~4~&'''x?|ѢE*=ܼyFݦMJ!ׯ_R6nX\\5mڴ.]lݺsΧO ֮]Ooٲ套^˃+77ƍnnn5jȨzR3"5M\\"44b|'Gmٲ%/r tP(d2YN"#Ë| LF ͨQ*-?h4ov.]YAR-vڵ_|󟌌 /=<<ڵkCCCj/J˗ !*sk9oEEE͙3~̪4ܹs'&&&++wV2Lb[] ԨQȑ#[l0aBQQի£B}h\-˫0L2k׮$XdN:5hҥKzKKKKMM]lJ ѣ9BܺukԩT6lPn{zi9v啐陓W_$$$Tc;vU P\\LR?Çpf͚ })Z k֬Ypg}ֳg~Ŋ<-777oϱ۷OHHh޼yϤ$8cƭ'N$G}D_Z,/_~曚O?s 'e˪<hĉJO>l|gϞݳgOwmٲv_>|x޽&L2ext!66?!!:򥥥EEEjjԨQ#G$I%s}}}'N{ 2d݉o5kVJJƍ 6o޼O1bć~ܷRYٳFcPPPtttÆ 6l8eʔK}{+߱cǰ3fo~ѢE:}tu.StqqYt)S7o>gΜo6((h4O/((HqC&''d^xAAAAAcƌiܸqW&~g֮];dȐs͘1y3fXz\.'1`mN8n>l޽AAAw={R$[ouڵƍ1cԯ_?(((!!aܸq͛7Ǡ?P1yd VmUV'Nh4 ,ݻwϞ=GbgΜٳg44hܹsH}!<mƌQQQ 4YbJ"!je|__ߨ j*%Kƶm7ߜ;wAh/\Х{G(E<y2((K....G}#""ӏ;V c:pƌӴiӋ/oz׮]1Șm۶mvf6lٳkرccbb^{dke=;vxҥ7 \n٬V\.7LԾh4l4(iV(J_pyFQ"( DhrQF}tu'@<x]\B+WF"l6=V! <D2UPlْZҀP7^!ld2^l6[Vv?+vsAmbM@NJJ"JP!MbfDB+Szel*?6yIрr9T*5Jf9`݁:Rӧϝ;w> <vKRz(U3%PSNyyyJj@ь4_~JVfJ;ӊ7*U^'_a/}B\Ei&JHؑŋ>}zȐ!7o$ݢr[*\ɻ K :U&}i^J޸ҳ@&1ʜTmz~]|922۽z)ݜ/+Ӄ&Mݶ* +v(zY; *Νt_RV^-L6 fhԨLF'̛7o:nȐ!UW #(_2ؽ{Gr%)_uԩdtn/_<�ˑJ?~Q"yl6VH%ڑ<(0�@{N*? h `Jhfb9NNN>>>տE%!Daa!ZVa2|$ e5͗.]ڶCU ]v@NF(MPn]!WWOM\nWk?o�8xʈXZU(�8xݽSN|+J\͛7K$l6TJ_ `Um6bl>hȽܱc+V$&&¬Lz1OQD"b4&j]5O&d2FJJrBM&MQ�[VzK 4$ʸ4l^&|3Ot;K9%OC#tZLZ=0kX$$^ɤRhYFTjXh`2`0g[ `IΒH$4z^Af3͂F# !hTiJFLj* JS| (Z,..h4Ȅ!2.=\NKU(LthjHtZRJthIN7R04͔I/g ! EQQ9v0JZhʄ'J { DtLh|L?z\NXDSM&RЕ e#p荢L?aF8;d@0LAtFišՐd&N  >$r9;;c4f͚UX,sD? !$kZ+)':Dk,KQQ/r7n ETPphѣJBz:W8]Dð�3Y*FNQ pC;ttѻ!pCytZ�̀wⱘ)U烎pB I*(BVߺuH -)= Kgf p4<q!?z-Bj! x  kn04YBQT/d`RъahFaJL l.M}dd2A/U*\.j BCAOYev3oL&]F@Cl⃧7Ra ѐ h4Ұ{4]IN$ KD h@ids*@2Z$2J̆�%2qΝ;wpiEOTz(BzB<hG4->:x8vS"X"Hkղc2L \KtfЯ,]�q l"Ji"2D@@U`0 Dd2ZjeggJB*MԊSmQL!"@7 n<D&]@Nc4:!"BA1`3v 7z}&aXI'hH�J0 6tA7&GPB$Z##)M b}*8 m Дr* 7pDg0<H! ?!X72. řNtvv�!z %lfc4oPVlWH$}<L*5SrFDAp`r1(̃P,*&E{,L&Cm:`19!ۅ:C<xiC<p LL 0TҗJdO$;`ĶE ba,  1!m18(4lܣ RВB'>M ?.� *2G?2|BQ<^$J@! K%q. qA¸CB2e7iT% J�� �IDAT$CHJ#T*urr"32{0 vUVr-@rLP8A`NtP0LFHT*DrK{9@rD\UOrTzWn@6 "B^4Vz HŁ:NhzBZ"TCO" $\t6]5TT0b Z-Ht:VP߼ySs3A$~x# @`ZxM�8\<ih G @?(p;Hsp7$6x"J%/Fh !f'B?|ŴĽKlteb1eA@'r@C3"<BC*..RQR- 0FuGC#~B2ðVZddhDA6'(i7Btĸy7+0&RrWyVĠpɈ^+@"?,lB$77IJ 7pé8LkHY;�CO*5 Xa 8=oW!"- (Doz/Q4a""K/BQBOF5jtAVs*pvt\[" ia!X2C\�(s G0S u*Aij5b1EE hN`fh7 +`G-m' ,"OZ=a~f-X5r vu˩Ruķ j b�' !!7+@V0#h 6_",6 nB&HYeb(~- t�wrre!:ȹ =>;15Y?@u88BpGZmp�OpCvD bZ_j/Rte0[q' MF899o� M]3,2V+OE4~l"r 8~CRt{eHYfMZ}5HWpxr:7l w=AWtBhds#n*bv8 t8BmDAcU(bR r@BxGTJ8a^pq<bA&ID"˾3bqt [e(;+@prW8DEE!|v 8p,]=ё@R3ڢg+p�Z M.ÍLHA2 `B"2R>q|l6lK]> yKM왆 x\.' s! $ +U@-dRS e3u^Jsڵl vX>e)}H05;6L<B`*=ʋr0h{څBA�u�%A/x"KJÝtRW*ܶ<`h4%KF\ƔJ%}OPҥz"Z`0f!Vy MK\сd qQqK@Cy.hsRM<$sLFVK;E`2 䕞ogqGa<�F�F7PLsv;1Qd8 qSNiju b q;` %L&KKf #�Jprra8\t^t:__=zx{{C}wqq!.󳲲 مy]X33$3! Vš"/A[FxGxS}ǹ#4LhvYi00°5Q<$&]HӰq bQʔ/d1Hzl6'!]"p %)r8d'&oi3t]' 2AqЊa,B]N킎8w#MϺ;q_7\z0!Y<p^z$C ڞodqsD@5m)nC}G8P`5!Y0Ć�y4ؑ+bh t]:* ,555###//SfN:2P~̤^nw0>PXnQ@p+Xv8` X9ZС Gdq3WRɻI"?\KJ̷ ,b)(61~jX`<<5I` C0ܒJn++FBB P@T/‡@xCN %w/d60b @x&"˅ĒBif]`vršĥi�JJLl 'LI^^^nnnoh4$Q ""& ONJg�he 5 Q $\18{ ?Y8鐜P�ۄ?\|yO@T <n+19H6[nDyP rD'w YW<#8]\�DJXj[z6!gNTMxq#hj!X\DJdAqAOpݡ\*<CtQ^D30`~& [L䎢^H($<Cϟ`}RjX NO 'rj}<nrdJ" ٦pq^T*tq3gp7˰+(;q 2}<}F#W Bk4eR<n]c7 C,@ALY,\8+8E2d^3Gx61pCG` 4/VQGˮz _.TS0yk`R*2pF4 O­S9py Ql6t:U;l6lSVa7DVn#!�5Oe-53@ N{? ,'I-U]+DЕ�a.&4#G 4]DII$pbK,s�k'(8322n߾MhOU LScWߏPJ`f�hb[#8&zj)]LٝKT*p&DAz<$!H "`xCMsϮ!WC-E+n թwZx`u^!"܈. z =VRtj#`=s;�Y�g'2B9.|.Nr pPȏ`܋5xi/U|5ʫXX3|MjaigZNjO BD\FoPj\�_:lMvUtt"K\}B4RĤ1AqfeW:yN(9)ÍZ’ mفӃp(`9Uc^U+P<fZekd XNxn 1͠<ˏ; @tF#Ry&#`Yܞc3X ><Ԃ1&HiV4 <wM V_R+cAM\Cq>U_P}hy"[lxr]dy}3(j*9@ fòC%)coooLFQ[D;~Ұ頹zJa`ZQpȜEXg...xV4lfG?Dta&-_d*oiN W;'7zs ~&QRWHA224|Ӯs%^6ihgOTͯki�q#M;7V\ syLnae_çB5N [bB"edH^EW [`g w*®ũ9W}cxYk!UЃ�ǕلfGs'G±.6/!aTzH'e #`Z<xWJ*p5ڮ'w 4HЕ.../o`9DpKOh C 6ɵ^[`bi"՟v]G12R7􄛐y M sScT* DPmr.lݴbHlr&BRa&odq,l,vVMnÓxE\D4h ..lkvwxA'T Mw@UPss$pWji]!= bX//!*`d'=-))aܥD(o0iC%iD�y1(.P7 BRQϗ{#gvxE[ %`8sLzzznn.V�%e5T A$M 9+8gy&7+MX<OLA\899ax)` "5߸N.;1;e=QR?T',$͌Յ4 _enf?aCy_{|Aw ƕzXşs6\,Xx^v I33݇wvW!x/c a2fľ PT^[bt^GzU>BqzPx,=HSj9"TZx-nO*3g΀!vhWp lN7J;4q V.[HRggg2QӡH &͞0!"H?𪵼=qeR Vs# Xxm^[K'p&(GjuɫLa kqԦM{}{=v͚5It*///!%\(  {70 LI .$yCO~K8Tf}~ǑC�n\k@qv 8W <@YAn@ m><qG Ů2R y':X۰D,zڅc`v` ";(0uB:xR'iPw"[V"jAk!�XVZ-ivhaĦ4j'8qDZZ*`$ݝLO<3Gu+z O<m\),Yx_.d9 vSe\  i~~~of```-222-r `ԫWO*fff 4Ͽ~:7C!{:< 2=q3$38<1ۮrQpniM] `9x810yjv70?~yT%uHG)g @Ȱuq rL)Mǒvp_R0ڐzR EAAlMx!|8/πA ӈjըQ쬬, I^?HU*JVyx1A߂ú%טa#y NGX_U=͐Ք+T; . u+ qkTqv699Ν;ΝUŋm6vΆ(mBJߣ4!''l.ѫ }s!PpoM5ָ? C2h$q8r,}!$N6QH7/;'v+W^Y@ɡpGєyM^p汹1JJ[@.Iv!bs}7h`N(#zNe<"�V)܀]$%JJ8wh0p899999jJC&>}NTrã //519!{8{UWwh.iH2A6_rĎ8'&_.Nl8!Ɨ8؉q 9 F6҈fF=]U];|ߨ/U~wg=hnG}4bvkkk{o_Bq@< IvtJ KڈQY7xMmfc攑G\{p<pګ!gv4Iɛ'ŋO>dQ^+)xO=`0 .Xq@Fy\�4ȚѵEMhLqc],5#Ȱb{N5f=fiے}3k>Sxo馣G^t iN|t 25F%)c6 T.-D|7)22o~jr-C؈q~g3K(SHc=ʡC(/B7/Gcӹ<y?~{{;+mcF2WxXgY_____NjiBSOXw�y(dV ]GSn~v@hئҚ=rPZH/Է~kkO'ﻼ=I=@f,n<f]Is&#Q;/JG>44WfѬf&D,bDv2�ʔ|(@<oK4L.Gy̙3j:{qۙNN MhE.P!cR/? }N9rI{�JGZ-ΩLʠe|C:thuuumm-j#?wʪV_g\pamm-E<xG;y_i!2>E6?'Y5椀oSGasiĐґX#wr"UtH+&p_uA*g Ǩw"Asجn=7mM*l7NcJ懃;vMX2y10΀NX6m ʦg(9$_x ͙4} Cc"Y i d!rR09s (aO6s58yۧmv!;<BT2ŊR [8#5Y`|x.{`gIy�BV8|#G-A1Di=8ѯt&7(G>rtd2  ~x7|íz]w=CYLKج=>'4HT/ƴ'tg/>6L".!+Id:6\I@.Lūݑۃ^[=&@v6 ;~gKǸak *tjf*Z8Vad~ qjo ixh4>3J$&#"$pRe:T;GdG8Yp0_(@&zFA0a?!X?'%x`M3}@j٣+F8e+i :~xHF[;>~x5ᆭ? Lӯk_5Ǿ'N;w./R-)@)Ws;k1OHmNxvvNP"\M/Z\z9dIDͨ.!gB'e+UآϺ':b٠b&eu-\{X) 1Py{A1B XזPd�M*@'E<&4<u/27W,"Άr@VCS<%nZ7pP; r\pqsNosA8rHTEm۲r 7\ĉOw;nA/u6^4_:|0U~lnnҗrqOdjg\2)&$kaNݬ t:1Lt|>&6 <*g8ԚffWUu˗/AÐĠf=cx׳\O9BCHx7'c蹵h*7㷮ím<hZ Svt grml7䮥%#z6v_CFp@ `mB[V+^W(7=@�� �IDATE2ִWziiiyy9/:N7_}=|KeVY<(t4uZz6ӋL TtܐYؔ$)R4;lL$M'Ʋhpl,jJ_q\¯WuL/">|AٟxgX: 0A˅ Ƭ$k?El*vBꋲ'`-!dL2[>3K{u-1璈AuK4ҝG3uf/)G#1hj3GxS&BANEw4X_F]+x d@LԲQp[ "H�GXZZ[Q<yڿptnnm׷vzU?R[F԰jP0ҮQ9b?6N]ӕL4)Ck>oQM,"OŐkb Fђz8,NzZf[[[hFsBNGf<#i?glQ w wǛsك~D?V=EVs"3Y`W4D4J91�|pjE<nCFZ#V;u*n)ʲz͐6,Ht̼@36C( @¶S݋E.vEyn,Gv0}w>Y{[[o?^ꃫuO~Oc<zָn^x(qQ,LjZ?pplOwJF 8+n ' ujw{F6hOk`MƯ惐}jj`�֫wBac%ksS$Zi!s3?$5d0s̊zʂo6>`@Tq⾍UVρG&s1D)|o90B%:J:+jUUהEhe,_R)°XZZBɘUX͍a1Iv,Nnk X%qa=vS64d):Way;:tW|Ϳ|/g#=WVL&o~˯)}?mPG}sss՛SvVVV.^eK9!+A"4*fH1XHx%UDt2 }he({9bN{mBξkd%ؤCn23+�`;F#˦ZzDШ_TYd'hOY;^O`;e,5k#Jvl`�thOFsԂvkkkQ9  'ifDjVcggYS !sɁdhVieDYeYpcd7X[5c~?сÇ?9ϹkNy<5~MoyǞG~Mܛuv{ x.Q- <|BZ&X#'m5 c;*l.`[ < pjpG|(V`C N `'}rRVUXsqA,<9 ogAd,ٌh( !?7Mbڸ\ L5qP`j8�8hpc8wXt5 U/8m$"/'~0Xt_u~S5fY=՛mοw7iy\G!G�x5Ƙ"ΫnD Cꫯk!-//Yz 7pw"V꽣h̼񢭓[o._|7olF1 %�Hzܥ?L<�@@IzXWRgzKqvM 4"Ak >sr٘Zʏ>�ףC!oZVjOڃs%ϕA9#EIfdҊȤ˳.G ck@~C"d:%B ͈4f%)&\2q9n8A<5,) l!84pFx.<v{4q&SLw|zY1{goQz_3IfQs0ß|O@'fPdRV`+,--uj<tP+++]uUVvYRC91S?|y<3bsT-z'W]ux< d=D9Kq`&"$4ZyȬ0pK 4,66Yibkfp7N*[nS~Bξ}^ώl#f$S qhBg6!#8J4s�tGd y4n0jqɸh;�V8(L9d-$gʐ 0ɣ�x$ =xPI,NPe*wO*,yQuݍ~ze9ގHO8qĉ|p}}l6Ғ"Pd{$I?Xnp<EiW).Z8H=ϼ替E_}dzxiz?r774>ro>y֝_|j>ٜL&p04ps._[|cǎEqECS[ϩR,cIX٬b`(O.Re  f) @@ч }Zw ?UUHe?âe%e+I#[[[`q pӶIcφG *=x0|L FipbgL6O b33�aC>1nxJ<{n ņΉШR-˗Q_Jb^_i$x+$~H͘nS}<%@.P-XsrL)˛/u{Ϳylt:jէ<s?9<2Y h:-[(*  I̞(Bܹsvvm\:ԥNhO&xw1aQEqgbeΘ)k_)'9+dg@{M&N0 ^/3-v/|}sG*p TDD#+&7i.^(خѭxg .Z0ч0!e2md#ɲ6̕Y*sE;yƧGvΝ8 Q`9SāYЙ3g|ɭ-/fc<tdfY@MmBC>@D;xgfTSs݉O<?\^K7^W.=7}G_5-`?7ʃr6temh'ࢍa]"b@#ŝ#%QmdW![B^fĂִ%7 8zwr^bFXL+<m:8y-={  LӞ:"J2Ǐ׍$x+9k~PyHփ_2~H3e<NN0\�ntl;N(`+|:N2Gh RAQbm'ʢ(R=_;nd)Du"(dii14nEE4RɄV!O~o x^[[[u:_lnΚϸL>}?v=ѣ#(A :π1%4w9x}ޏ孭xXQE, eH=2J9>HrZ|v' 6$HM-*}r.�TGإ@OTL&1a&Klvԩ'xb4)!f3Gto?}{n9Y&ƛ@?<<?фx"4tZ�Ull^q e,c�ZlѩBmLmߵ7UիӲ(S-5F4w�?T5O#/a\L'ZxFagCRN7Hk8]SJA YՈnwss7o{mmm6oӞFv(vmNB:!rKK4⠇fCV)OFl�CvH@f{JF&#kFF}2E}/yZB̺dt!kAJ z{&̩2[;/i *tz̙zڣ Whp tы-l'è`gtx4 Dkz{I FI�UUU:pJ/IEQ4j;fYQ.3IPie1Ӻl~F0c$onbOU"Cg<[[[N:{;2f~(3sމ)_f�@dWbZMϖg!rALʌDXԊ; O1\gjㄐ>wrc9NKOc0z%^K~Đ_Hr#sP! idQHla~ U`\ah?- ERX +++'O|ꩧ._luPXAv]37UYO È\EUmX[ˑ#�zԄfכեq{VjZ*'-L,h&(}v"@f詘eA4b<ٙe*!2hiilF3)X+ J:ss[ԃUN'x0H E5c|290@reH# A'9H(΄*)$3 c`#od2k:9Oa0K%fgj|1)v2E83j,w_ `sk5bxm6*ue3-�w`8fc(":N'_/R-U`vV~L݈Ēi6LZq|1iEa f$iQ%,]ESңN1c28{dk W<hfg {#\l6pej~v=Zm0D񷘐f 6`Fh9nmç<nX, 1Ov{:ć2BX4IJ!Ӎ=$G@;/3mG]בhwȑ'|2HC�JPdRIck֡1}ŀSE7fq1�x @bʙvnV3+x2d OnU^0KKմZ弜U/ժ-YbFz<GT(S׬ E eqq?vz)XBƖK{EwaAlN<=OZNU:=qd2Z^^vȉNH~  y`tu2ךgט�uZVO;M11)o+QaxgEFe=#EU+k |EDOJSh4T,Dxyb/B,@C0AAlt04 5H}|'k�5L0h;iiii0Xg)Y셳ڥZ7E1 ~mo 8jAIalIAUtr+++7xSTb3MndG$"k D_/GϨ.x|XTQZmXPmzAnzр(*`Q6.q^Ӏ^iAŭ�F#S%憸ٹgJ.SI7#5(bP*=rȐLw~�k40L^(qOtl8t$TOz7 <fM[;Pa ~5A-eg$ҮoB#xJZ:ITq~|iYzQ}s_>yk6/ӽiW&傓ЌR5CIB,n5t:O>OB"i]vs\37-_Š�ENR`0=^__GZ^Fa+8~H[]ym@M`/uDb9‘qK,DJ%hٹp:BEl1yP(SZpȌA";Fܙalʊ~ [PQJL<_(&@ҴOr\74h B9AYլᣇ_vmwug֊ZmFW1@:L�<]04TT 0S<b.}4yq6J-::F &ŇYB(Ol�JBx-dKG:3*�h裏nll+^6�tG8rf5?2<l3 U #Z+xnNK@[(iB{j }I&~&f؄0BߖΩ$3w9rgp|*J5ZHנl0ڔ-x3x/Ik|ťz= [lcWG j_\mll<gϞIk^;vl~_fe9:|OZ 8Dv (̌[#3yAtC$^1>#CY"Ukw{N%Z%믏f pxҥ͚m+++ŋAv_N5$I~e<Bk%sqrpiW,*" ~@n eđx&¡O$>^HZM!gBR6/ȫ*=#ƿa$24̝PH9Ylt@Lf*OҎW=ި}6ydky{_tYkw]L9v tpTvO<dxXTh ` 5B-KG3E,;fL1Tu*otEj2Rjxk.ԉʌ'H�l/_ؠc9Ϩr]HA� NҮ�3 BQ43J�@znrd ʃ73IL;iԎٶ89Gy E&ݖ' ڟcxR^,/w/5�kxkj2fqL-PwD8v8`/-F+d:֦ڗk U2m'O{܆oh<(G^y$nk v/^ I@f4i hCQX<�XwYTfr]}NϟN+++XXX"_t:�B8{}.c0 ?|xRfd&U~吼q+vADGJuFgP׎!By 4*쎌 iE}~%s9ˤICjtҮ x8/:`FNqLoBu|-JJ5 jvf7´QkW奲zEq2zϴp %7)L'P'S˼uOB| I7 7Rs֛3 ;VP2:\s'`0X]]N,N3I-:N ˗/֊܈S \{!.u[ :ˌW+cFɄsC(Zl!5"i3jBf CWC8zr|Eb<FF, ple^:O-\ #3bk|h[@^XgGFĪ8CM n 1UUu?1-EnB-ȷ5MT )dq,]`w2̂%dc!Hoy(T1“5KNji>cn(5�� �IDAT vQbkA$χIn'OQrEē`'UXO,22R?~F"{ &+!9N.=o+sJ).#ʚTbh汜'e\mr�4 T L2Bi+ @驣TJ$,zu_@95$R0wI V7&g/ڳ3&A5oIEc le]DY' |S6 U89’<!t8%dR]i ŔL*;NMRL2ijZB6c N\q?|p8FMA%vVxy?i5ɏȊTyhTmV �&\%M2%eT[ԶeչǪ^+++ykzie$B~L'Iy%hQl8k{rӎg-i H{q$jfllDȾm^z<$݋l6A9U:q:KHN2ҿ4$(.?.&>GYde859CmT$(P\^C0I(Rgd5c5XrE橧nAf|떢2Ө�\|XHړj~`ڃDqڐ̈́yX[~c!Lӳg}s aS]vRxzĉ]ӵ^l&<d*w_|N3Rzn6Cƾ"yRϸFkX?@'ΈO; f1rIl�ē&w2$23㙜䭤),b9e̠75m)�3tafJ躙3 S!U'?f=G2 ';:dTqY1DWiW- ڴԇ2%B FJɷ.Zp`o1+ 9 |"}ݍFc{{1ՃN6A =[d6Md٘^Fpf*"IGCq0a@� u ]WW�t4)5L㡼`KLAO2^e)uAeJ0OtbrHꍺz=S�gY9E�^,Uo |vCHY5 &y+I>%qZ46(tACcgH Ub٣,�[zclX\'[z#. v7*NM9ʼn)xP`}]͡ OP|r!o6*�s�=q='&95cz!` Ky1!'9#½l4aWglFV-^alB , 0ѣp5ILyzFzY !�9@RϦU.od&v4/Q ϝt<N!W pH1.e+[f$Bl> ӝ YB_&=א}6RIn>L�nKx?|5Ag`F{Qf縻ʬ?`" wtpdGo"77g pʯne ƕMc'xZb.:Ys.Hc  ->aL1' I6i[@G-l-&A'ƵOL{vE +3Fe(Gq**[sa x&Cć '(OG)c"ΔOƷd4pC1n</ngWjWFi9UUn'oiDhz$a'|>0LEKnHO Y]m^mQAen ,.R1d2!+Ww>2GCgM�_ೱ>,VV=\-j@Yם8=%XH<S`r:cz3lH{mjM\ϱ5tfC<0356>C;�YƢ^ʺ5\-xKXh%�geՇ `S4*o7{ܲ|FYcjgK?yq'xd*~ͬ7w3mKq(&L&7^7~w5mUU5qu[U~ٸ-.d$)!6{-S>vt:][[Öƛܡ1(giQ{.XGѡ%J|șo&B3֨3\V<9jOKҌm̔s>3mdKvbc3Ռ" { K4"]si.Xd$/vk{<�=bYblp^7vQ8<L-}B ӣ!YM d3z2TnLs7;c r VPG�9ث…X89}.|y>ڵVUώ;zlfׅBv:GT톬-?D M7vxc^pDݕ0EFN˱iz@&_洅%XHdI,>BX)oYЁCbjII{5i#sRĩMlz&5,)3Θ,`<]Yf5gVT0.P XX%%%J̖5`A> 3"lr4YQ4|<tnl:(Rj8OlYL"ghA.-˲:^Ϳqn&J7?,JQ{W͏n|X x*OC;#6BDڢ7 DZFnsWZ!g? 5RlPUjމc�<+�M\@,N;+)̘玙 2 ^q.B4Z>I3.NHګ쐱{L]dԦQAIR#o5c}geЯ'ߏ4e lFSpuDАAڬH 7)#!Seczk_{~n_hrDmHGVqfN8R3)uґ#Gh4y*k+#KKK.GMf,GKX&=J!>pdl*Hdp%7x<?9�XaH/ "FeI۠yw ӳd2,( zE8 /e6]cLsk$¶|X}Y0N!v0=Ge®-=lH q b,vZ=Irx*[O3 oY">o00M%bBq*XSEXõZSeBTYWF0ξ+ Ug# u gdO'(<:E$ȋE]B>3:8b8e8œ%*.(}]5h㳙z+`E˲ cn_{UU]p!6"}pIh .Aw+IĴ B *QVpFd  8j8tfh&I0b @^s3Xg*_d?HYna[|33(OȒ }CVkssNX)逓d.hI^a`^>Wzڽy?zMx^yOua)Yb;FFMba85|"}7,n?ƻ$0[4<]Xg3k^B&X1, ;2# VɠQӴ""41֎yzweo ۱d82l$b<q H3!V��#%Idqͻ0f2_[Mmd/K<MHP:NoB\[[z&^O/ŸDKegYwܭ=Vp>LFN3Ɵ7圧9h4j<#-8BiP! ]^ae*J<|%J_A5I1i`̇b e#0=7~Q1՜]J R#8hd[!Ҵ+ߑ ty `+h3oR� AXCϱ?,cfvS%Ny%"7pbR7PkAj?u*gI(nC02BJQ3<K`}A~@2Ұ3aAMJn7XJ@$6iNÏӿ3UթPa C}PǬRT; 6# ]8'H2g̹H$�?9|0*tOC4ܺ˖ ͤY2qhLkvTcC=lv% sq<݄p$-7m5JFYVZ& Y i'hO(:^$יRwe+@CV5bv&45_;yLj|q] &^bfʶ&151ʈޙתxv>voχRUՖRbsbMsajkng#bdĭL~Gy 6d.lA`-9M1eԋ)/6C6Ésfty!$ֽ5#z8_ua2yMFqxA%/XTأf#WU>-vZ,D$fdntZ#qiKʗ6n>ެUigiG gmzɪL&I@ya CsAMYi8b.F154r-K�tjfL!~-P@V1w ؅V`NDZF!f`'lq{r$p )z*{`!Iqg3P)h0nRO)[Ƙ@&/MH#>)}74B$hX۞ZI1 Fi )Zhe,~3MCиm؅OoB@% ?;g�k>߬u\WR?c^;VA9f<3[a5UKQ1i\ZZ9cDMJ]; ๐b* u) !Ó]S@60H3F�cc&tQzVI!g9!ILhsX_*yDA±&~'&[7Yfk*EUԿ>~x۶jj,mxhl4*$ܬ;!a@m|3z|<-g}p$ligr8yI SF"zsf#SPpsb=9ro|ӧa\h4·V{iÿ9fqSQ\kF5ZUUU|ztɲ}m↹RdVs›Ѣng:8&I J㥕d3Mѓ.vC+ -I'V0�ƈ=0؀ @6fw&`=U2 KK@@dbMa{r<K*S�9(A*x$-VjLgfcFdS dy:tʿF}ǬUj6͞5A::۩ k%d f|QvwX+8Fs;X&txTft:1�{VҜq:t蛿_=z׻>~?;F_@c2?7Xmyv/gό[E:!WM5Y?h2deSqeѲV3xt:]ZZβtD2Yz GޤYL@Qɐy dsKi6Bc&=`$DȼQ9Y=9^;0GG^ĬٞY)[ˋ B ^ѕ gz%0|j՚zr__o]j>ڤCn [OsHiFeS/:JBhގ�":l屠饥% AKSՆ(3e>(=z/} _#Gu]_җl@ia=`h?$y-Wf6Uizz%J:wYy jH`l)E (zS�+H$gb( )Tok;\0 o쎔9o2s ^Bڍ!Y(5larOIJ̔Zt:qDUm[zr3ذ> 'N;wn{{VU9|򝓔RӫP]Ӱ.D̞rQB 4 ZwV,Or6T.\.hkڑ#G92 ֊Xŕ:cǜg.4<FXZR 鴑 ZҊ]RTE7OySϵkU'48zB/|~{رcNzG3<°趺D<8' ReYVe5Ϛp8LјWss+<}l,Arj'�uɯ3o1)3k5Fh5 }!H2H1]9Y'Kf6Ŧ 2.,"iwwv?lܤfoҧ/B�k#ڛ$׌?=ojnV+ظ}kmܧ-A{t7g|IbDl,dHgܵNi7we'N|w~+^Gy~Ν;ΤdaJa#}="=T⼈n8˹0Td��+z˲,_Y~a7E1yda7[w<Y+m~R2;Fϟ'È;ptiV[7zJi}̘OJTlQiӳdKى(Q";+pFXG0byڋ.˼QlVuփZ 4qF_$&ssTf̃>x\ B~i5cAC.}У35):gfW$IsR Yŋ̖o[.2RY-zmr{鏗B2 #iFrLiomMgܠfF,C�G9|e2Ujv*cM& OXŕ E6ٷFJ}0FpN[WfQ)֧[[[w;46-t:ʔXcc#=ᾬH"hVokkNORx^f6a 47'm~`6jo4>{Ǐ.\5fcn HlҳG<DȖlL T\d ?�`/G0!-s㡠`#$u@ayr"Fs@X~j?3me# ;"͞Ze f#,>&{_Q~g{뻷.Ϟ=#\pVo0FU6҇UlwHx:iW}mEQ_(֞橞fdV]Jۙؼ[=_ucK|bх/N5ik�`8~rԂ{Nbw&JYK-%ulDysCNXUU_<ŋ=7*(`]4|d'7704_؉DSn]6YMsVxAQ&F(Rl^t;9o}8œX^z .P*SyKesȰVIzq۬,$NMr:vxdc txϟ |iuUp3QvRXL'8']@dW$0?^>Ʋx^w;YgDY:UZYYϜ9sŔRrO?- wPB-nN8[6"mlN9S`zs~|Y^FQb%�� �IDAT;Wk7f,կbSvh`FO>˗#-Qq?X.s>0 ekd]qG.;<Rar.s򡩉f?MӨ<B.MA&{`fc`NSH'ؐxSVY&!g{9t)%(bfzU'1HP2Ƞzc>wN3O4Q~�|f\cfCQ^^?s>UrUZY=LL_[.!*HăcBHzW{zoC=T=V exyɜG fv'Ntauuu0Pdf'2܊wt:3+D6YOmxq)~QeQO)z2f]>\lhpK1*Y\aB{] Lk-8Nyƒf"jV%*{2)~ xcdQfiflzJ15hxv,-6Ey2u+Y0־"kּ#ۧ܊ӓmk4pS32ˌzlґ[ܙ # 3Fc>v5: 0L)5kcNHe5\: oЗD :\oO2ewzМf/ON_ޱM .5LAyC7M>e)˲ON>|C%F "gWkQ' :JCZ՘*qA1^4 *+^UU-//W4&#Fv{8 cA)5Yik7ŀ"9&PDq艾ڐ˺z@)c. 1Uscm<nɣ"rn΄3o\-Ҟi; ^f0@bks, w X#+sPL #U #lsn3V!!.qb_uUᐪ%3U1LZQUY677?Ou]L kZ(I~*w@SﴶNq⪆?4\+6@QtP1EaǬ 'H~q4ML V,uc/Cs<YC{̃;Fͳ +Bf&8xSW`Qo*=&2l_ÝS?)mۈ|dzIҷvW>l`Xb6+7P2^H/J ©씰̩'FrV_7޾czJ{Q2rWY]P^ 4�eeҐy2xܢĤgpz\`0җSOM/- ؍^/ɵQoE9-`4 cVWh.QܐOu6?Y([$MfͶnufk}}=63o1k3!1L&E{\0bh<;Ck\X3ƀ ~x8RB˚rŠ1 s3N^The0L1ff|BR(>,G,//K/ƳUYc,J`߱%KEPՐy퀲٭,3z=c!7U~cao.J'jK.Z& \OB*MF%9K3퉂QIĢm>Z `@1LeAff[:w?Ԯ~*W_W4켽3mLA'~?(tgM=zϨo-߶<-D1m$NO�'fl6;GQۯl;0&+ 8лrbt\`e&C8t]U*VV! 09m4([ Zb=e) -[(N,z1 `;aJc((R2$v\p�]"l琼EۮsHEZs_i ڬWf)N73BAbFzfg FɎEYYzWqtۣOxUQ;I_Wenr[\F퀄* g]G912%S c|Ι0>Vck Y84h)?ߺ{m%Km{m'd ٕSpD2i$h qGBf3 mx&+YBN2fגa3{DJe¨pB~V9hd>Liye,^ߒY2/@+(хu,N׆W1Sl7oMa4!Ф~g=|N9zۨJUR3ꞪfpN۞'E6 >2^v#e^pNV D žEN'ܨsuo5앞 s "|Lwǧ-ۄ>kl ri[&Ne"i;Nc%̸^l(޹W=E�nDJR54IGќ5q:ಬAϨ$n_,2q d}_;͖�:PRqu2k/tfb,NϸHHLd`rSB 9 d#nVSVӭiS#rOzE$Nl>Cy_Cb˲.1gI(iN�U1pEu$7vλ6}i}[e?vJYy6訛s 0۬2!OvZ*~sxPaT6uVDY>w DZcO</f]BǢF\`A}0@|AٟxZ 0>pp+@O($I-ʾ"L&_gܐghkFQ@ۅd#~1cM# mJn‘o(NR?xŏjUtT((@$Qe2;UqQц e"A(^wM7]t'u5rOʲJvhAhL{}Lo0"8l>8oYfmئ'Ew4^4j_"77P6 87I^<UF%f<(8ƼNoQluFkk?!Ofk3}-"!NjL>izMŽpr'~d,&:F2 kyAwlr W[G!Exc<Tw2Y@2G8fLLg@gwbBΤB?LseZ1-ߊ VU6{D-lصl3NX @Dd�(c=ƤQ,4F1 è,,�{e~Kd -3hL mدڅSܱuY#i&<86R4'qd#)mѿE6pkq J?]׃olMw!R6$4dԺ؝g!gߪLh 1|QYs݌+ mЍ܎vKܽ%4 tzݽv(Lc/GP3DVӀ3*qaO$eS'61W]h0+Dl'Wv<=ٝf/_Qe@44;ŖX6trFu̧0ٕ{״02tUx`{{bpAId;ȱ)"j8ѰFh̰/]4psqsdv۵5DzotβwN% 2o7vA[:J?cUA GNndLr)L6U&e/g8 AkIXlچ&[;z^ >L~n8%42oн%7<؄gs ]:3My @Lګ - D nE$)_$I3DB%Ơ6&/H`d nٙu�5A(u[fqvWVVbwٽrBɣD䐏s%ju``}l[wkF+d2CV6:fСCAϪUǒ8݈(orVGZаrN>YLgV X|:R-ş:t( )[)KKKNGgCt   nf6LJAvG;.4L{)[8GQspNqS ZuHM- 3lcAV\'J&cBk)L*"> 24Z(1;%2*�7Na:4g;F\45â#<2-D2٘?b;oɟޝ P<L > 30a{{6Hgdzm&Kr3?rr^V^u@nx<~Gb?DC!Ԯ9l֪IhlP$3i0[ڠ7i=83ʟ >Ӎ躱*a.!j"PlD7U7LK# y D-deVfcf*>T s֓%g=,%v \G 5NῸATJ S`F0x I<Ϸ`kb/Ч1gCc[Li׷^AѬ8:ؼAgq(񮵝q!5@9PiD'12 o�|lz$cʙTtܓwΠ"])Y\7dk;DO[Gkkz%s�k8j[f3RwZ:qem'w8V\U}=9@oẅљ错qdN͵£9AEGS8jA5{bJ?tFdX(eW8k(YX0"ӄ D [ #;~vY0cABa�x𸡜!兺o'A' fҁjuv2$ό̋ @q�y<%A&f{e#Cq=rQqgU!8�9l0W&6G! nː6;#_@d1!^UUj_>1j\K_̾a6بZ`R>MCX B$ꬮ@ZYz_?(ñ΁vXW?S 6.><!JtҸtF1T"~LA z<,1S\@](cbc?ڊN' T9TE]g7M+0h4N<yȑzhmm-fwÊPQ Xnw8&rL{Gq$Y'A6!E[ E98eL3"*w3CC qI E>R$&>Z QɄ;Y?p>UgjLrq(4Lq"UU&7~FD Ny)8+]1x+S̼$]L =[!8oZvS61 / 04ȑڜC]ѣG'IHbHs\z\7 DilpKk/l ^1O/Ki5([S�XZZ:~e.ρYQ4ஆDyE| 'nc]I"\CWwd..`^;v|J\�\n7'MR]vm! }ιaɸƵ<To|Q|cH#aL{|ҝP7w>z�䨊gͻ.yd)݊fGWԔdfWJ2Yq'SO=e\_u�( 8eL۲7ߺGEHc?IYl_tFD՘zٛ36nBDahG̃?__*ӫRv#ڬ6/.ҏ�0ԩSgΜ!$+. mRl*%̃d">.q`g&Il$I<m;nO\YUױǰ0^X>_EQ<٬}{{;>gX)!]hM*�S₉S*gfsh)n4:!x~#^206Q24i"yyxL&V%BXJVtmXq" ]1I#Gg<ʇ- (x8D'M:9oRyt9nС'O.--=ŅbSZVq |&4�=ι(D�1ᖦ<[>^9M6d(/єUW]t1jn×.]FeYs Q}C i -Љ|le%>(&xݛ%+++oxΝ;o6ڕJ_I׋;ZGBm(1>4*xLp.B�e]/,qa `BuRCVs,-@O(WimCAg"՘#=mqEZqh ֆC]0pTvĨuʚAه3̛>c}/z|=?qjvE߶MۍG;C2V>hoOrģ\cK"Eޑ>pǎv/zыnv jېIF%@��țbEy6ۙ 1IḛjG^LoXV㋍E>k;:m/E~yi-ǵf*jץWOȔhR{dq .dypQf^Wfk#szuR0Fz.�Tw&@o-o:c~j\ ،׸Uw#3Hh61vCotrl^-׼&~zh",㹚fC\aCKȺq{iO^t$*g-*d^Tf6ؘf<@=;xLHHw9SfNXW"&r6Y(0d>/"Vwo/| ;]FlEQ7ЊpÔe棗vY*T*/%f4)bVO& ;F'E� (l+<e#Y58aşG{B.GH{L[X$ ]LO& ӆs>oFTҴ1bwiWLu!gD_`{{ҥK`2gsds"ץ]@f2>RNA<|VP0 Dإxlֺm<\^ծ:N@@ѽ5d*D*! -V 7+gwc2WK,lVYCd(;VGCN]fG&ū/Eh$#FuhooH7RJiyj&h Wp0flZ5n3 ~܇Ljd-flF\ؚ 6&CΊcEYKtπ\D6XئdJlbzɯ?}?ln.(Iu_{~r?Zr$z4;׽{>gs\q@Ò7 q|F�P$Ǣq ή[n}岉o G! n{\WSov{te#CY1]F]?Mz|{3fQ UYڱ}U=GhLY}@h4ڍ(^͞o.Kpn%;Be< T6P>ٌ`gia'HDaɟvh/vUmIueZY`Hg=+�3ܚrJY:3 C x( I�� �IDAT fnwŏ~ϟ|r<؏9 _8yl4O~r̙ɋ&͛՗ڌY wA H*0zΑ/B)t0sUa< #d zС3g&Հ; 2dch,l9/M釧HWagcCăv}u]{{"4:EGZfg$ Sы '~vciot˪<t_vܹ"ݑ?<ozˈsĂ2\J"h0"38b'vFl}(eI9}֪϶j_^~ k5i9sw!PDM2q{O@y\qi'3aL17RUٳgϝ;gE &f[;9)Լy]5'Yx\oէ6ceiWd @^ӧ=O6,f ѽ(@(kF +4L Cy:FAuˆ rn >g=[ʩ4,F8+c1&M_[[[ ؆BH#Gxs窪*"^ֻݮahW v�7W_ϟ?�mŖ9�` O0eb@j|}]UU5[| uSwtǨ+Cj a,;tb7IuԪ L˭ è\ͻ1$a'$=_Q'H*Z5 ej]i Ev E!@UB`JJ04QT<%| qe%DӏMV Y'jA-WL|P!8u fܨ8 рujq.\8H'1 Ο%2yt92WrEf񉮬s�e?~爩7RH@)u CwcI"Vt׻[c=f9 \*O ˟ fݎvZzы/^thKWOsu`8ږ (.Ƽ-.a>|xuu5F28#qK>)E6Q6 :9@ﺽYOZuEo -AV|ZYGنӌ;8<5G*!ɜa*CTt vG >HBsIns''[˘?|?lu78AH(i~�ܸ]`@@h}urX~8g9 ۍWsj{{3·:叕lloohQWW̻?5T7Z H1?_p!#zT{xb<jQ e:-eg'No%OtmmjCvjL It3=Z#d㴦ROCt*L#"[YYI)b^N}rY L.2k3çZ䀼&ij3 $4KPqf쫠rU}6&p3 @˚8f֖3ɳrJf KRW<>0D\1˜e& yo$5kL^>I{Vj-YEF5MDr Ysn1.۩S}QH|2e+Y33^@I`K][AN8o<sLڪռvE·B:66ώ/p$w\c@f^Jiii'`$]x".\6TB>jJn- ~tf(}v̱2$Q?Z<RVwE:Ll8sωI9D[0ɋpixn&hxpzs 8%_&C)qgjo/ܥDt>5ięՒtҰ@a%$reo[AȾ=l aif}+*n/,(18uo뮻.]T7 Ĵ;7{0ϲ]5O5tUwNL (MHB69rdr8l pԽRg ȵ/6E $bČĐt:=zaZ|~}[u>p5w6[Vf۴3M͇F^PY޽jC &l: 󽩍, v3v("vmA_KE*)?G"#HGr,+t2hK4=3pn84oN|r(l>N�ԇMP2F`j5uX_"}#5ȳ$tߩ"3(yu{<{--3~x$$}Wz42kщ=vF7𑎰e.H*E]tرCE[ 1=>63gkv뭷qtI:&fUWzM(jCpcDVYoㆊ"Xca5sȪMcJ=l~Y;!g~Z9d ' '/eg[v W仔ƉmQANP҇pFc0\CpD7f&J{[CшAY.x#=%?S%)cvqIPǝu>˟XerMPhnt|8R!Ʃ!b? ĕ#ۂ&NsIJ\\MR#9: B"BCU>et oֻJ7O?5Ru4<@˾T*D-Ol($! VgQL60R.(Br[>soB܇LVsw]0@v 9y-^\H 1 ާscٜ@*- >YuXc9YTRod8h/5$ d{rF'8|?H;yv[>46G9]C&߯[v3Z]˛[7T:jO<Q?%}s8#lO)|b,l[>kʊEr:Q DhbirѷF[ҽz 7/+RS{.F``9tA@D19cˎXS0{*-x2wz~!+iް)i0WX rցnI{S±2?m]S w9 Z&nhwl?4}G\H%,gD30wnNm<F@yD\䯠C0` HF U gكK�wI`OP9C>αZ\9Giy׍DL_?ilqQ$*CPv%8yVtCQv,C8L8Y'FNp](R=S.ќCQA@QwPsHʁHխxY0QbrXs\~\cyP[5e9#g/tօ6Z}>%@i>uOvN4wU+ fiqd2Ț]arTD-e(baU0Mf7gQz] 7 q?r5t=:]/\'7x*E Us 7׆XHrsw@[gmxBףWO}gtcV{rL*֧DsgxPŭr2|>k׮NSt(Fk׸/!))j4lơkn>S_K|1./I4:yOq서m:>E ?ʓ wѩ˖[+r;U}=:Ѽs㦟n'+2KEmO@o*RI�o+=g#į~r!7O_("GhBY`K;¹[=d~_/\&�'rOAkOuq 2'_}ٻlZ4'r^iotP2&BBĪpr eeW,3LR99R"'5RӍnB*P1 ˁY)X^�F\az7׃ҥR#f*Y)vz9?U+Oyfn!ipQtBQG'k5bѨLqHX D2D}epJ2q'ތF={LMM9rn<ސ2$-9 q# &N J4B<gRZP{xD2@BuH­@ɎsGԧ%rHCvt*}^BM O8ܤtMg\�jJlsFt]/5na]J-L'3}^blCgﰃj@{wr9!- &k-"]ûeGrrǻr �9巎mB䂧>^ߧ ,[E_~㰈VX$8^0'[l#G<OiÇ<!!qϯ0SP0(s"0Ȏ m ⸶76QaҟXFR%{Nc=h"z$KpQy,]\h1ǖ}/*4\gVp,Է(LzAY SDp̕ho iLPu9p7/KCgcNrH{y(RvORl'HfZom8N!lAt7nyQ&Oqh MׂKy@մ!{ltÇ;BV%x-xA@t:N=SAi{pPfoA\I>D\,P W]6|4ޡU$YHdooTZMPj;6n+V$/( PHQp4l`y5IMNTVKzWPxpEx㍯zի8_ώ17aKhyz4쐸W:lV;G,Oso$WCf` /=zH+t`f@BOEMo/(B PGQtu|uJ$DQIg.񩧞:u3t<r"1jȠ.u%[hz2ݛԎl@ԍOFnJqt+"W*((kFw.A@HEat=vsaay"Cr» 4 ! B�PfnT*fsuu! >ּ:m}0K&믺*U7|s?R.-ݫЛoa.xDXc*0pa' 9 !8pol۟g?�c"dp;ڦ/m~7}Q8_'lo!WlFj_od |h/׽'v p+ 50rr3@]bg^iPa5%a|~VhF %<1۫TJ~~.`j-A *E]'Xc_~#,eBwLoѺ/bQr^@S1&Qt:j\�-u+C+++KKKz}iiI(C:6tJY4'o,8"|֗7˹$n CՍEƒN~`m86OShKEѵvY,meѮ`^#G.NtvI`Vr:seRrs}K5>|rH((ӢLgکk2Sat"%z<3e7v� N[rHSeA^eޜJ@XQ/3ngぺS."xGT"gfDR<+xᇿzFJ"ZzZy{RW/~>hѸ{^yp,djG4bps&҅C(; i^7OY1w.qퟳrЙL&7V12M'o  ;uu~xCBgKs1gR{]̌;%1"k4VKn"_z|;'Ty?^0<_S)EV;Wthӻ% (*M.#*QӡWGER$J y 8aAbCW|#d t騘 wؐB@i 9̼E/8,.. N[^ wMP ##{Ǐeʞ$qtVd3ܸn/ۛL&SG]Dh/l.a ~Q9 c?Ē54)Y4)7<@˄qzhpJ>ĤL&S.|wjAmpG>^l652 EBX^^VK\.R)lD~zz:ͮjS#xSR-!CͩS$P3rG ?d>xd ӽ|$"ptnaςFd+nKOnUn Hw+ Qe1Br&#w!b# DI{7fAGFAu-|׵ɇf!`oB$Iƹr$Οvjȼ/ex#n*DZ4DK)#lkY ztTu= 9Y8S, sJ{r@ 9:J8m]1MZ/x y>`l,ppHIJ;~ʅ}RLs >q#MOOkJhHEDyHb@WNa!3سQh^(t;pgn ě/n+lwK]w ND@ H賊hy -<E�AuaQ/t /|&qyl2`t:C=Tׅ:2D:ZCA:ϙ(]۽0 ѰzUadurḴP|}qI^[IȒ9ou8k D^ g Odrq sb� j j0 :fHl׮]v 9]J_$+Z2X$8LN> L7Ws~s{C7T\b7 a9LK5G1Og:rX]Z>P1WZ/|Z-(|qw!ev NE(|KfD׶j Lkp漽^O%.Jঅ\D͜\3-jqx(E>D(Y/dar(ILea|mjKAA�'*!=muE*wBv6r  u|o^@sIdZ yʻ?}�t?L5}uMuBKi|#~qj4\ҫ'#Dӑ!\Uh˓Hht#f&}Pƙxa:t(xX./z~akΉp"[Nƅ‘Ba̍ܜ:0Æ_/(4zKEÕ|NI$m n4«vUN7p{q~z�OͤR&a2==[V?9Ɠ&e`~h28 өh ";!g; ]r+Zh#zq’j$q.Fe>1U9sagFj>ZL ^9h,=Gԍsp&h9b!tJt7�� �IDATN: 2ByD/'_57{fh4 &=«W:) (r "\^6 s+^#4FE!Z0 @aB&8="]-C#LOpai0DZAYw9Ll^3~3}&鉱] =={ \TP"D J>/|5Tկ~*’$fӣ�Q@MRw[7�PJ_)*wBζдt{H&Q'l~ުl{ !*"oQ`VKJb1%$t[ײ/6>G2Ĺ$'\NKb}=voX[[XwFd e ^8G.Q˵șˍ\PcTŇqS`{Fr.Vq~MG6n Ɏz' VL >8( Gblr*M0@֕r8Z#gac8:g4Y<I&I2>k<ʌ22Øtfɇ (B@7-(;Ɠv'ŧ"(I3+Zuu)Cu�W΃!~48{cǎ-,,ti'}CG| ɗ{#7qb@1ʶqY6TdmmM:CqPbGzPqOr3{EDj#u#K zQϡ+͸zzԃJDx=ipV*<(E=K֋-V-O (w|,z0E 9Y J#<: ax'xBdѤ<Iݕ2A:'Q!V̻t:F'|17u֝?n6 !c, <)(j~9î6O:p>׾~nKKK/[* z@<΋dܐ~VϫqE2BͧdaNޔOt{.ޢ"^ QKl[U<8<ݟi\M)/XWh :O\+" 5^Ar0ɸ Nqj@,с&dOqɬhz[ _*~C;a}G>JIԙym_nQ{ FXI#ϺmYaDm?'@X~RptQrT}Ǖ`o:IvSSSW\q_$Iaz -58(Fuą`RKs ) u LjP8 #;87d9V+Q="ZLXYwLFؠz΋Ռu z0yN `<OHhW"CنPBݎiyА!I 1HγWrO#Q}bզw\o9gޓVo5$roNq:{=&\+N\.wi\Glr"(.4J*AEaxrT, LDRjaLi~\BwL#O+pf9:茶Zy#<rwyGJ;r^4g0&9̲_G%G#kPS<gesxM]RibY$,-G4l0`BjަAA&}}=U)LI].䆧.4$:.Z�,�?$|CG7"~+}xF-]2"\M/* S: !h<YTc 2rA%)[#b- &J|Wյ-[aH84`l?wY #`*i]_wH#zz.>*(+ODVNiy<{t賟̑#GN>=_\ ɦzQ'/q\O0ڨ7u-Pƶw�z씗D)Qȸ>N�<Jg뉋j ә` T7Bs}qd0QNfyDQmBYƨ]XQ`r^$ȁ)6%j2  ́(<\ǻb,ld@Ӛ}\�du\[dw*�s]~eؓ,)wItq#7`n&W`zpn;TUY]]f{EY>߇2\ze օ =3|n 9 pP;z#:X-vuC?#)gPOԐic]/#1TK$�Y3y0:t(gMB)P(%|zFOGRK(pfv" ca7arS,^5#z3$޵F{fXJ ⬡%];fGvm]|#!uXS=g1}O6Z>ØMl>ɞqҗKwƅf^=3 ��]I͙ijG jTps@ݒ� Z]qhi|_ (8 ؽ0I&q_z饏>>//0hP\�Fv7p9 ЈC7] >*(΄ Cs%}ݧN {s.6Fa4&M<Nȼӟy&E$PCOq@j}B(R.g@dW)x !S ɐq ы넙<kֹ+6"_qN%d?; 9_HP ZZL.,[u( OThFyDt_g*,�{ƖJq [VXq ?tF٧g{WF&Q N RRů3LArR4 &ٴX4]pn _֧ .ɓΝ} ?k'qdA0y!Y_nrԇ�VBYOjR2eM#$uC, YU`Cs8t�:3|ȄQr`>LiZw+U%ap 3@#-m'ddP%S׼s`m<Qu;ΣS�TO tvj˺p!;>l{}{O"bS/vd.d*J/+V<ɻnt޹m7q@e^dhF-3<Z-'O2BŮp@\&PU`(R=i)8'aUȑ9Yޫt#.mcԃ<.w&%W9LoA![`3P%f8 i-YvxQ=gF}pD$@N3?s>y qF0U\/)e8D\Lj@ 9tPOS2sRTL:NM&C'o62d`$ZuJhcM0S,|?8L9txh$t9m/*:6Y'\y@nodM5AC0 ,'L\3t#`}`"G.@Vn wR䞪peGxzG]D]O]bNgPsNj)TB }*8QT 9XsgOmvsJT|P.,^>�pt*HR>]ysx <:k\;3Mt2v]K ?_l"(,aTC#鼛` ,"q3Q@!y8~ Ŝ ;TCwÆ'','\A'dth3$sGBx8L'u|*B=xDBhkrYc�zrt \!ʼnDa>}GsP휅s|±qC )~(i6 OT-E2:=|.+˥RlT9:1 ɇ2Z 8U4lZQ;G†cG0qϨo<-HR}r4i{{ 4T֏T\T*ڵKI$$Μ,N"�Giݜ&c4(C$Ԏ|reC &PBp)u8A[ u8x>է7~GqJ\>ˀcE 8v;WtW7<# W]0+HYZҌg:7l _AYz& 'T�8>Vf` ]OŜE*KI`hHY:N&yž?syr!u|^=nl|)Ɉ8.s B6r۷lAox8؃J߯j ~?@x Qnpwi~$lvzzz߾}0sfVrv7h!Y\6"ZRRa#zTW񊉬uZ-.B ҋO<y;ҍo6[ apvE7ݧG̗DxDYr<҅AaFͽZs�8FjtcIYG{:KYQxff믿 서mqГce/5c5ӄ@_RxeOڨ/aQ_-0P±s6K~S~{oNnuwpqںӗ^zޫATDZӗss,Jn&N' AerxI9g蔦 )LϤa&a ħ 2LP>ltGݏwg1wޗ___?C㷏ν-羷{q^+rqv şӑM(!ӹ_2h)Ӕre `n^X,Ҧ40.>%#;D-rt2gL,ӨQ&Umv}=#ۥyrrnp03HR4eX`[!G^9:ht0cU3T`-&p!E]3ԣTjax<Z~?7NK&t:>coKo$Ig>sݏ?'*,DA#g!n; `=d4~2PsV<(]XTR(n@:Ci !}VwE7x㳞z.gKT&„j!:X V=-˗\rd2wD/9 );əƁ-]c=1;3NOEJs5EN$n=Ǩ:!%Xlr-Mm:KN N rVvxZ0PDYK\nnh`Q;[䭘xQ^?オ:!h8?̿#OQb?JWt: zwDF?"I0u z<|+:@ ܗj"%J%]<l6vV r9Ϸm(FKKK\^^^\\\[[9Y;ȈuE^ JQDi  K)$d�R(z[{?V2B\]^69i[4�dkCcQ|FtP$"`'lOq-A"{z˾hH͢>g+QuȘg"}цuk&j'<;$U*vMH#d[Xݎ:v?ृ٣$I_MgˤR${q~Igbs[9wqI)ow"j::O~%lĭt+T#fp J%UU'IMҨ<Jj<x /wx<|rM'SH|'Nxᇿo///7K*p+_:Djt:O>N3W_}}k=GΊ&%ٌ `C/={IO  o M[ v]ċ~YF1서MzB_^^^]]uJ~0I'7*̉ݍ#ž߉ND63j>JIᩢW<a4V;O4+.Æ<CY=Aծ|/6H5^4-`z/z=r}"|lZX,RJhښ̸:%~%H�ideXw;O<p<\;N.Sp&\ آ΄⯺vHjzv4wx zع\ .x+_955uѣG7"f)&D{ʭ\s_ 7E[s2?G 'uUlt&ayD `ݱhhZwhxP-DŽg:yذȮi K th0 S$ٺڋȃc[R.bG$=zݜk~'x#10U],ڣ*ssv3Y>ߵkWT*˕JP(ũjl6JmzTӤR)լfS+m0<*`. U~ۍBaml1z90bӦq�~ LѨnG)�vd o9'_jWKʮiU;~4rt1"G<r U<3}JHBNc OzKaCBV/4RVhM%1Z0KgT]煘b1dT zGX,*mk:R‡`FOجiO$UIF;B /"UJY`Z-+n7+xItbTV333jT*MOO JfѪjVk8SN-,, 2@TWc0_^*(V ʉJl^Uh#U$xrnHzL8B8I{yL%U좒sV:][nE5#nD�MQW sQ�Zqgqީ3V+}cb- 䔰yNنlۑ""U`Fh9`8A(dM: q3j]�a4~ ~;|ǔKnqfO` Bf`3\....Fp7~q9LOOjZvbk)0!z>:}ŠWjxB`U 4SMCٷoԔ0{~tUU=:kzzәL^khŊtb) 2R{DƵl=Mlosz앍EmKɹŻ9)tޚ8L�pRF< & zdz262s `j:<jh sssjȑ#kkk`ka9SwB6r\mtM h#ɝ =4UprjXtu#9l7T9)P0o!zG+SGp`.ÞuZJ˄Ū}=czuKJ|WTzӞ{|>aC[`G| y⽒$It PTYggϞRgak:NyBZf ]NRYfb\.'t!!@4xVHYq" Gd^jCKTn�� �IDATK*�fa41w'7Hm GC_'F&fs9z�(i_|%\WWV.*-.9o2ܽr0969oΥcɲxw]&}Ua@G ClovA?" 5D^bݮNgR6^�n[V>_]]Q1 I`p`P.O8Aϟ4ÿujTh7}5`TRٳg~Κֵ1OUQ,<߳gꪘ42yn�.ϳP(ڵk8...z<&:�rMxރ@/�]^^Y hrXr@am#z*c S~>Se.\s>?!>}턜mr"O_#] &}t."&453Nqf0FA%1NȽ:sx#'"rx}ia3O<X.D if(qHzR)rZ꿪STJRRIjU9#=uJJRV[ZZnUUJbgNǠhP�hɮ].袅ZFxQ纫M^05(!vMA,rf0P(]ʞK""X$XnN.5k+!OOiP(z<'f]J^GFT*+gˎErXOl3v;Ry-E ҉zEI;4NOQ돒7$-36炏/0HϦV1;.EBGy)l</q\Æ*0H[X,Ib;R:uRIC`BAxORsss'bQ"={ڮ3ϸ{S$wEmEE]v5`nU9uN`wR]gXHv'zMz.@K vh` HΙDQ6шp*\Es` G=:B=eJ|>yT*EQ!HZ}>*;!g~vCZYTt:C^\OV$J!f"&@#ZJe2KQ� *KbFC8X-(ϫxF?t:dؐ'M^>J#Kɯ#l?<?pZBLF$>{޽w`4۷oϞ=g:Ɨu__MROnw6ytvZW0684zVsfffnnNț>GpuuU8{,sѣ>5!QFx9>Ik%.@>pw�Y05J#na~ .> N|m"f}^;d!SPQQ-uhO0)(l7}lYt'lg% cĚ4DnG &ljӢ&b 9>?oRaL%E\h-APJplܙAAO֖CB)}':@g.E4rț|SD$^>l:�<0}v5==-"|>*J`trg맿ε]ܻUWu/<?+e x*[*9*Q :ަn'jY!auSRb(2.V<pI}"l:jqZ ō�ȋJXLs;Qh8sxU cp-3!h,_S8sW)RI/"w{0t^J>}#U k1+Wp^gE ƈ":!850S:o'8{$2K]E0:v\aANM .PYݮ?I+l CT=:=1lT)˪fv0|nnGtM[KB|ꗂw\9*p:tHJXp/Fu8 ꥣǍ/jut l_Ŝ͏r7*}ʄg4^첨8}`<oxC܎>=%X=b#`ރ UќmpL>g* *޻ Md,NмO�e'�j>N ݿh~Gy$f,A'2y ,ç E>Μݜ/&jhH 6[<mTO1@:|6U3bqnnRhJ~tIrY /43_[obxg?s5on}өSp|яZtj* nӌ^|?2 /':A]HxI]}UV{/K:b�em AcMe'}L+/8Z 6X/UJwB6ckfلޯ&aoCBĵZʧs'4!>ƃ,mɏ`NȰj�PYY �LWџu٠:"AĨa>` 0@9 .s'v&N J(5Tv-J!DDGR)Kۊ}񧏞>?Y2_]5Iq<dNUQ>pX0Hl]\VH@ޚCܯ^31%3ǴfggEB%B[ES@^$xj@aY�6SLx.[Ft*g+m{V^'lX=٤B=n?䓮2;!gH| R2 . Q.$3VoP�7ӱ Sa3)ɧlRZ_ZTB+++:p!�3O"h0iD|߬O⧒S۹Z&04ERwA4LEBE/\.]LOOW*B4I!}/N?{AQB]ten $I:"z&ٻw/NS(pQhjRIsc⛈] hF) k.Z nz!5ē\ i�;ߚ|Z$eT%AKJk̷^Ԑ!3v<H$kquq 5G[V_~>zQ�Nٶ^N9QlvOL@'xѝQ$gy_@Da xk<B|ǞNڿK^SN~:25M$"CLD@,#-8j�\�! (kEJ5UâX,8zF$Nwf|ů⚙k\$;>oKwzӿ Eյ5%ժiT:묳B #uvvveep,yP1ab9u[P Y4mL};KgC0[OOn[ҧ=A+Dͱ[>"ʉ  *5hgC$IpwEkPIKKKz,q%Nȉ94ud^&˝@ծȶ?OZ]N{:!yGF.;t ғ`,vK<Ύn}}$hZ#<^o8@PPфf9uyR{&zLf0coZ)Iw]7זK/}~3_5]9_2IkBju#Fl~o\CE`'M~4+9u(GcΪo\f>\hǀ0EY,טE ("gpw7}!.Q NN&:ZD 0N<1 /p0v *g9܋ %]LI_ m%gsz Ư�n@Uz̓ęf_|E]t?=(,[5a>m0/rmmMÉ^9˙&P' Kp;EL{f.,^|IXIyҁsT*)#Wˬ$Eevgׯu]HfP[oy0sy:+t:-5R5$D,@<i]tn]}*Q!9oZ9$._vazE#̣N^rI տ5hn$ AoaT*!%>pդA0gEG^( AW ěHZm'l*YD4Otxx g@Eɀ2P7o9]v/?L9:^\*[eI"(j>|v. fӛQgKRe6s:v(*Zbxz =sKK&F2_kkk{wlrYP8w|/v- oJG_+z^zcc_Km=[!̽^O7LfjjJ=3R.B"d7i;?hу6|{wy/�^5 9L#\BCAtv>[?DA$ۈBifo(iPVd:xYގ۷1?? 7F/}K;s9ˉ�t2] XjvwIBKjC;Fma7::Gv}=,..>>�Vܸ287lTAV_IsƭO)ϥC^7<TRE(y6[.&4ؠ<֪jXdOz}ZhZƫܾ]zq׿ !4'?.y~&mo >Z裹G'Nj&*K sK z,Q1)M#da+3#/sɚyȌHmF^,f<VBsu wv]uJT9JC>}( 9̐"m`n#`^@ا%owuߏy';jWR h 3_!d:j(@qv&<"pq\H*2U@>Tg>jUfjUE^}-2KO=+wx'JOag0a4Yot7L#gOl,R@hx8cr$kj>ʣ(n)t?9=NLf:MMmGh?>D@KPVt1 Hj];Zf^|gf?TNۿWOs&b!׳o|c45m֢:|Y`\RWcYnj=)쮰1w5gSf6RtZwn9F$wAnf:N{w7Ko((Cdxλ&y.)=:̨K:'4\xM+ :ҁ~ֳuWo0̈ETDԛond9''${8s]վj>Y>_/q8Xo'IaR rVhrUd dٵF�-zc`S16%}\o?g4+y͌|TH9-5٪DAWBL#9>KPP]|iTb;3𔼣N+7rsOasA+g4-//k 9XL‸I^[%DX3y!fGG`# @1PilE(tQRp߰+߿gϞ##ZlVŅ3T*u 639Ӗ|T2hn/1"xgff$B(-z9@LvJ))͌f>2 ŤGktfdZ Kbpvfs48pҡѠX,*%I@ *.5z$FiKuZ_6.nQF6ݿ9WaDKy=4 ]>dѵ$$n<+`F#Yڐ)ѤW?Tg!yF$R[} oFJ/|'lOdb]j ?Tn{)9:VNzCd-ڡbEY+>71aω:lZ<x 7g?;׿0`IBr*BJFţ-&N:ѭyGW9[ɝݨ(@d2YXX/y t|AR.^9l~}_}9s\�/}ŧ^,eVԏ9uli걈V*TϵZ-@5Ap_l6q,[5oHlӋVfdn='&aCvב\yܔzΗ )(*47,:QDg{+lvp#bT;ҫXн# 9r<׀T4 ,5(t 3g21ghAty}_rC> N-& {`ƾ,MޟxO\wu>uTә|yxW#LɓIl:{FMړ}wpq]0@:'*EY<;I/ZX>JpT]RT"YVl\ ~l6ptO'ۓoIOt~CoUC#~mmMt^*`pVdV~^+(ވ;Hn̔sN I C<h!K_|@t-2;+5#_#\٣� G_0n+ PVw 9rjiJT&r\l }ѐ�9aS@aRh&6*D[M<Eݪ˄\0,J;!{]awt:KKK'Nhrw2J%ُΆv(Vtz/gn"8gx3_$X?1y:O`b،޻^KЯ<yr4}` /zTH5R##IW~W~X۞kO_^ewڕfKь*+ 7IKBdKAj N왍␸%-?CtItgţ L!Z_FhF+~�7$}WNc_d;\!#{#XbL†.3#2Gn p:EN4&ލtjU0"Y(?]'ԭŷq8b<1C޵(e�!$OAsWnhw;lZ× ?GYguWV;رcjSaKHs !/+#*0iZkkkSSS`$ ? udLR^ѽ+osǫڻ7wEwv&˓?ޞݻw}ٲJHK2LF٬+++j(u0 t`ƥC)l\5"T֩ "g8Ql۞* N?WIAyaxf}4OR[dPuVX%|B'�.>.zrug>J="r)*>Hxn0FdH\ae ƻb2hFy/b$| }$/$:S~{>?y亣;tu}soƹhTZm�� �IDATV*FW-0 TAP "ʨ@Heijn{1�FjT*,e*==3s}<,O'BPxnLR|>_TT 萪T* 0Vnw]KzNs{r;Z8^_ϔ J< JpqWR'\Z_YIQ6Ɔv�7Jy֫eQjJR!.짳. Nd50FiJ"Od"XAI $�~b1vB6T9f[ l.{r29*̳'cVշF $_�(_3'9P`SjOtAXuYdnϬ&nGd|GWWWk:30LB*s A<t痏+i 0>1gBu0,///,,Q$g r\)Uzڻ>\gR3!{tf_/b޽{1]4;;/VkyyyyyyuunZ-)3\<d?*ț".ܭ}գp\G|2BuJ'`NNg(J =<)}px ;@k!dvPwPۇCG�:=?=725!{Z;>_ VZX`k`9CLBf*]Y|޹t&=Iz '>z!adn49d&!;QfT<}p$?pf{(JRԈ2gd<3LRX6޽u79@ ӛX6%L؄LS9:~XzZn/,,J]vOYǓ$ 7h{4]sqvzx|YgJPW&J5z2K(΅ u(d43z^hFY)/:ӝ-eW,F y9۩|b  :%]("iYr.JM2yp"daw3Fgt(¤9f-gy 1TwǭN_Kv*)H 6!LCp*  -�Wd)(Y֖uW%$Ʉo8ØpS�~Cf0$9$oOr'!C$(y(^=<ȩ|{u7N!s 29g[?*WUӚdnS;vLk5lxy6 q(Z\.k|jjj8N#/A[T*I VݻwjjJ}MCy0u̩_5믷j~[^z<on/----- WՔhS+++z]-•g.ylކrs#`�&rނk6 o ux HApLN 0I;H҃HOW{2\^f?9\H0aL& O]Ltqn}C@RU#;!gB{c1m: |Ŧr{Ms:]Ɍ`j7ٛk TǙә§ EWFO58?H`=۹ƻs&WLx4J>Dz4Ù[{rʿ[{rt!pBO.u}xKHe5 zzViT\.uV5 {Y׿u%}#O/}:ΥgffJM>rG^}H%jVWW%.l6WVVĄt:VVj|H<< >4|N_]|0R�9LD%% ?͵)r<1bH09l6;77nt*rk4>(WK\! A~O_+Dop'lO4;e@D޽t625UN \N}qg 5$InC972tf8^0 [Ob [NUWRy@Xh83sdx<NI;l!;Qj2$N&'?8 Ɍw_=q;1tbs(L.hFaNh4ry0:uV-,,jYj2qʼn|>x#ToW|GZ7aSiaaԩS+++F^u4͵5 JsjN0d*l>u+{GyzdoǏI89�xq<Fwx>)tA$a7I%tC$.@&~ۅ8CdЂ?,s/[)e'$s ;$ w$x")'ݺt 8" ( JB@Z(Z*q_0NJ%_KzWq.Q" Dhi�{ !E`${jn s=iM%SIT._ٳj`V¤35̅3*YE@ a$Vt!.ҘӺ`P.u(iju8J+&4^]]m6�b*OOOOMMMMMe2r7sgd6K}L'ey[W.zɓ'O<qr)]H%�~} ޵Kقz I3S+(+wIiO=hڧta·vzkSaTT@w iI ^?H>HNo~䉋s}>ik)vd9؞\0`Bm*Ҷr3Y B>(| j\vtث7>9Ab=h<bPb*Ndeee8-},{M/VL,;^m6xhxF`-k^ziZ/O >NH>&ao88e3_\sY~ņD_Seyj]~fmRԾ}٬=]v8pZ{wڕNWVWF?lRRASVVVN<,֟ښL<er&=t,ǘU{OhjC$L7YDv3 mDnD('ޤP@$6aROƗ]g0^5J 䌈n٫=O:#nw`DL9`(09\6Юʝ ?H%# k#R*+(7wb?l5Nsss\(4gX d:Q�6.P|/Jl1V@pii:Ԅ"AYYlz!,'{IVCM:Iݚ!r<SKQQ\TՖn:|( bjO\&:΍w~'.?=0??t4@SV.Ljɗzj!uHR_[t:fjVVVZ ,Xcqu8w)VHBw fD}_^AT]333]vѣG{1"k>EXxus<jSz .L~lSTT_q[/o{]mB߇&×+N9<#BLJ゙z8ECWa8.y1ȡU%3%,A|ďsa49Ot:EZi_P\JDhum.Lѣ)W(q8YH2#)\.7>{<.eS3G!i=d~Ru q6S .@ϽsW/_]\,,|Ⱦ#~_TW矿gpQ'~_ O8fhINOOO?CCC=zرcg=`THBit#s9㙖Dh"*0J+=gDq7Oy ` ;LcA}�-dzFމ. " 7s[ë%f!GfYA 柆'_M.LџRPym<iwBΦH)>2㨉}A kޒ=x/ލoҘ %MRg�: 26D+C#"{Sq|^!V!wsf\;|ݝVB* &PzOUxboG�}гTf3rEc$K9ˍnjb8W`pg녓\.7???33#h4 INp2kp{~k{٧vw]O뗿k|r'>SOj5hpq8e> JDBb"et꺟aGpuZUA]]]{}Zh+%l.'x��0`; FQȭ9D 8`e}fA.IB�ym:֑Nǐ }^[*?&ؕ&#:ԆRi>Cx]9tNd|xx0y0:Æ]Æ&l 2l $dd;|<q3)<L ;T[ OތԼU*VtirRabzVjo.n~En#oOJҳyVNكSջso7rW98mۇGZ8O=T^oZ@+bJ21>|RgBNaR !3a![?}bՂR z-H9Ic!�zT-2GF2DŽ,31TfQP(0DY/0L.yHL=V.Nٞe.9<^Brݣ(ڋtoGoɼJB>/T*5n$=|O}=hudK^Yr.|!owI6@ذY Y @ʆ@֕pM e"H[OgN(stz]}|w4 0;zMEkQ5 2U: Bo.|$ %\(Q64 9s&s?pԩk&DԲex2nFym>^u96XYYI- ~ëv_ yˣ(LХؖwM0] i>y\N)2^9Lt^%<TJͬmy,e,9~Ev8ޭ` dt/C=Ѩ풫(^opH;Z!CMȴ[QB3ޕK<.VUhueF|J~XJpUHJUsO7g?3[XZ~fs53pQz%ˌ {& `kyii4%eG:m袚cI3f<b}-(h4:y`0HjZ~oPiiүo۹?/n9|O] ϟ|:Ixbyx|ʕCyw pJEVV,fB8/�IV%o i{!vgvd &K(bծDYmSȫaO'0o\ﲖ,RWM_f^\\<KU[!(LyD1GլODa6FVm~2(Y: *{`;ĔRۛmA+(�Sfbkhӧr`*"OiPNɃz p<}h4WWW�H6rv<7+1WXiV~fn ?a---n67`w}tt/+ v*m$}T $/XIS nTZ-D؊d,ND\4 oWg=s3jadp%V0m`u\ .Cma jl&;+#.!HePT^!@\jEjE ݘ͆L'+2cuysv-59r[,Vd#O<*%31{GMyW-d@@aPj!WEJ~6u=㐴=Z8C�AʝΫO8sloo/ܺ3'~s\wn~~\{F-OCo-OK0w{BAuOK/rtV^Wͺ@KX#sݲnDdXC TF08lkVd`fq$&t⊧C݌4) %Dd__Qz1̨b8{!$LPz1Neo+n^:A;3ogYq9bT-#Ys{X{՟ER Nm%% w&3pAhX!FY~뭷^O?43�7 ,y|ܰHKmɲ,uYob�HRbЛ!G%Ʒn'?E~o䆏m'{ ޵oxjTnPf<óN=qVV5qcsHPcJDhAN :46JyӸ{{@a (� r8JAR~H_*%yU RI N#Sv{v5;8M^;* nҠb(혱v?Y&ޭz}8 2Zā=7z%04 erf +AIbʏQ8w` c^�sh#<9hS{W&hy7ek{>s| BM\i ir9eH(`z:@ТI'豇>uTff̙3_}GQݾ֖VWWp8v!5<gzԹTF̪ꄜ͞ ML'=Kr >'2V4T4݂lUpZ q>E�nQ{u]%>07oT#jv=aUjM Ppe|r,䤐7yi (yx452Gm+W 8* +ay8*#B5GҔϺE}x蚣aZ2"ɝL&if,..v:5gkP:IhR *QĒ\�v,Ov3)'6N%׾swu?ZlԽk9?}b֯t~[W]b`}}/)+ xͫ)N8R,aww3UjcܡL]4DY5 چSr><eSOLu@*R8LpM~VҺ+eZڧpNNaͣBE Oph*)5k_J4e"sQ,WtM4˜z >qp8$Jc,_"@ MàHhr W6c4\z2dii)4#": U4QHSe4/8q7A"WWN^yw𯾦fcW6Fp_gO?;<=\]]ܭvOeUz=JN'[ٔNQPXDVΎ)t\y*vaJER6mL' iSVfLYx'lзun%Jra@'2S\Q *)�� �IDATe9{^J%$fD%'L*I{<vq)nTp@ѥ�xgǠE <li5:"7 0Nzp@ k͉OCW/p8\ZZ $ງ~^a6]S<v&"u9A\\K{k+|ڽ3;gg޲{ 74'OZ>vxoܛՔi#t:9m̵%q8yW]*W ՆRRAvRiČܑ5 /qCMR4ES{;|~� 366uŏu=Ne4+!h^c[=K1v􁬒V=yGm%\Ty_.i W%|1xS-f7P96M "}T |Tf畕'O2<O*R#c[ȬCsNg~~>lT$@! !戮HcnnJ`=Ͼn<}۸9ϿiҞl}_8 \_mmdsW X + K T,ٝבI l"@zPDu±B̙3x+{˿dNNsXE@)PY PyjӁˉת]VM0uN3p8(mjtf</*Iur�U! d̼MӦ2&C$Ѫ)v8a)fgg3aÇٱѤq"wQcd,ЁOcgZ6Hj`7-ny*$9FqDPZK ;M�t{}G_ٓ7zdlovٿ߽=xoi|ӓ=ww:#T!N=:n8+aSwxlv\˼k̭4Tz?#n#ѰL{K^r==Wf̞7S 37Ìopi3Ƽd6XZ# 0IC:pW7!4sU=?ēиy}V요� T]4Yh·xiU(<pmKt8YQ4Tȁh5/L9$LO9㎳h4'hewwA$K'/"fskVI9EiuFяwl={~xfSW>>~xo?}|g(22;ioK[HALC{ςڛ>sMF`.jIzyhi8wfXۅX= (ѪY9" ct3 Nxi-ڷ|#E5Cyη%sS8YX@iT +y+σS@/jnwwݮ">ޝ- l[m .)LHHΙq;[P,^u6iM V](Z&<^ɓv{?ޟRg0p;۶vrY7c{K)sk&f<1[]]͑j,Nl9t܆!#9htU r8@J"rxα2℠eV'{fU�LRJD.b5r-,Us2 k:U תz8H _A˳*gU<4I1 'ʣ9m"鄅Z~!i$NTpIyd:t)΋ HdPEdY>1it! y铭N9v&Jl+B`&TTz-A$V$"{IiG C< -prp777#*hss3Ǎo}#aiͽ͏t>ܴ{dTy蕏>6K)NwaaӧO>s̙3g|(KF:ܬ1g} ZJEc0gӺ\!S)|"IN9A":[�X+Y kƜinT�F#8 ބL6`0c>a I'O~z v!($dQU�=fbk%2/daզfa{W"v8NpPnLHYTܘyo_j0˱;k Q'5]+ԭe@M"P%)f2.<̙.--ˉL"G.{uu5o笠sN:\w߉8+GL=qsr7;yrқ||w맻?ܾw|p3y ]VWWsaKKK+ M4 c8.,p=d�sd,GYO/f8eZd׬ f+d{h`֐Z6 /l(<DG`{& T!|@DNO _#̡ 3M;H]o֧Ǐ`>Fe<nQȆ7m>%=![2$@r*RI!P‰e'+KnG%N("fڮ4=.c ?`[ bYd6E(P&\m {r?1Xyl8מ{Jcgg۟}Gor˿>j?u̹Fiܻsow[v bt:{777s flnnjN8jEJ7:pM$+HZ=I`YCc&p S̥3ͤm* یCV37eOՏia% C(樍cH̀>'="XѬ>(Rbu~s? -!n qz&0hdRٻGI0{Il tNc_{',%=dyę9Us$ip\pQeWʯ!?*5~?U:xi$I]}_uU?{To{oܻu{g?_w<|]{<;Eff SD\0$jQzNf:ц1Ks 4뼾J4C+2�"Htx 1"pZ̐R(؀a; rZ,JԦ8U޶Ϣd] uCiv,=9GCZqI]2=EI3]\8;Ӑ[Om_fprCZ^T7 WSc t92a@<ɓ&4jh4A|oTgAPN`2>4qͷ;w.jyjw\|^'7ą+kS߹?zGO͜apd8Z+3{AS$ -=2&9XSE)l*SHZl}T3֙gsқѝ0$B4`o4j "o*SȻ>XL;"1r[@CǛ$; ]",<bdGʹQ4+EzYYy0 êw=B̊pHǃU@aOB"3"A%#Aw&X&&7ӕ ]>9H9P�[)LƬ 3??O:&催r90#XYYY]lwd7Wng %f7qB~?8iJs V2gHSaU\T (b&Yj/hEdlxw8m/+ScepyXaѦTo}F#ʦ]pAY 0`DLYI%a2@9*.8%} 'g_\v00\$Z%~6ȀX|>¨P$RLvE/py = &Q�= ΅iVL5i^138I.w qHC"q<ͅs)S[ыoƉ'ρxÑI摷rvowd@ogvHUBf"i#Cߏ"59/~e$Xh =|HC~ CΥTeL4pVBG IMAB3`'V05\6;�AH!۷́qP[Չcq_^bgaST$r xrAѤr}w KqKf0a,R'KUόdN|rc�X'l3#cCb6'9%%!r,y|t'[ rjeZ2X9pK#ͅ&>_Zl4v8Uk=<qۄiQjL:'&J`PJFVfЕQA"#F[j#"Qw2Q>LW[fm3K\$ @󜛛 rZ׺|E.@ɪp4t|BGMzڒ FG0n_C$6O�`2%prb@逡oHvn`2|ɸyɗ ngSgSyHĞrn V94I%aͦAf-ϩg^{Ql6Sbl �VΎ0fN c3gV*r/Jl<2 䬇N=!D|x2d?Gfj]t:D xQWJ 3~0jVVVif#x1<2\+F^9+z%�%cw-O,τA,#/ٖ)Iy:~3SjW Pղ@{hD0CE #c΂1 V*0&{J7k(T]+TҢ7]Ly[)Yf\Լ+"͞*p5?}/n7Qn$ShKwG!O<kEB29sgffryD:L&cݼ[ `wqq(_LXq46&O^^^N \kPnuXR11G/m[` Blݝ N8\@fc=fx9Q%S9䒖q{YV3 9:h;CTp 0FZFgwrdfX&GVg=L Q趝=98 ؟ʲpI d' iz׎n8cl6p-�qk6~?(%DTħ|`.D``H90ĉ)kҐȣ:N'[X�5`.C^l]H' йx&Y9U{ht!!4KEKR� MQ!Y<F @L&p&q>M&X ղQ1Vɵ٪ڵURZyh2NPsP;&ĹJ׃fqp4C3lfÁD*?`*՗$V+.3ceC #O3k2exq$ڠQqKG_ݦ|~v˗AHS� T^r[</a;5YRl{{;x5\+`Y=ߏ@x+v4znx9Ֆvww7Q<+ Bnaa䶷WWWˁY^3v&Nd-[n5ǙYHg]>XPsI$^)<nEٌPQ7H"A k&4U@r &dQ*qQɞ^�ڊ $d8YAf6+{xk077w]w}_$<Kql«5dex‹B| \ت7y q`&=BT*Bj^Z95hdrGN>MҰCwNz:)gA.8BDyy%<1F�=rh+@݁+&%G!OmMI.@}qmUCJyC.̗Z%]@ ;9^'>m!T0rn&`3羬F<F>BXcT6P�5Lvf&FYc~bwQyq=9Gr,B csa%e򱦣L&%|;/_|ŜS Z,CۉL[v2\ Ⳳ�3ȡ�) /No*P<ČH]lllX0G#R"c=6Μ9ɞ0-ZG3#r3Ӧ9(a"u]w…˗/xvIpׄt666rA777+++ȰEG�i> %(�#bN&Cdġ )x#ds=߰ � 3(]ZZZ^^b}wJ@ P+<:9d ȍdͧ�`Jk~F 4wzǽK`gB W=5lLSAd< lnn@r:vUye@P9nKfX^hlEK:x߷Fl2,+V75"P6˧9s�XyM"[D<CHZ]]Ï MҞâ&c4*Ls!@Ȉkiqٰ'1<F ¡ϼ< c= jR(DK@py_җ-]5ʁ$]Ú\m p ۈi<xGΨO5q[#am,i HnuV.x pBQ6M :=Ϫ'A5ItCcl$΀?lp$\Az̭QRT0!9JNCx D$9@v<&h%= Vkkkkee%9;;;`~~S 8a=qCGRc�b/1 ,<\au1WHr �"jL~Hֽӏ◹rO5+W$B|\l}\^P5Dm-"+ <睞 .q9bz)#/*LQdWdN�b6vLG(_=nF39*-cW=ު=SyA 4ôNg"[h+>LB@O$Qλ '4xT+.7�!2_s~h?B,pRPhs3|;÷gRyڹ;> i*]RCN1:FF�c->eS �+ 6d|QYXdZvoooyyyyy%B$]4l; }IB0i ygS%�F5rPprBT]L7`8 e{kNԷ&s3o:fs[۟/&M#2d�E{Ƭt<A/ρb#?L(*0sV+3( ʥ41)Gd2Ag`r0PZ uʕdrԩДnkkkooog4d<b-gncclN")Dʜ$C^ٷ{&-yQrySDz&F8m6>/|9(y8T(asa9:rx�ҋUE #zhjs<r^BT98s NLd+Mږ:6LuI h4׍˛-fYZeZjmVM=Jm+"|q~xnz^5W'0g,gbv5U窙SN\LD0xF/1p)qk]1sc$ķSu]ǠI(yz X*Ь�� �IDATe<7E^hZӇQރj(XmBێX9d-F!p-67m'79-ݩJ/tټF.ا$|VBPkJ^[vV) fq9�4ʏeN$@iP>I2 eBw=-Jܨ __]`bFۿgWh˶x4# Pz )8+zs"5<&Z.w @AIc}I$~q'E C+-lݦc?=GiRtڕ2E-O/ y-cvpå{`T}$@EH|2K$N bv40{LSZYqrbjD:lMJͳM礕jE( yp"1I{90_aUX3 5b eS ?�Z}?+{Nɓi,˿*n<2L4%xXgg9fwNZ4[?+Ӧ4h E3>H [[[I1= *U48vww3e2|mfe 99.CbQz5ԑ`j2QP"k8HJ0iC3W֧p0DFǘB5cCP=EOLqiO: [)]RؓhXJP2r]@iNv V%#uEALnS89G W0RT:}bޅVBK2.9DLcl"i)=봅N<tecEY�s9C~3jN1QS+&S `_|dL5(z7.tڹpֈzY__g�Z3777 E`<_x 4>e<٘E<>4Ib)LYyPn7uy>ךeUq,Ha+Q Y|YGeg<LN.& Oٴ~UN~ba عf)"עf~!E6֭ j@ddlX"&c#ꯋ*wW Zok'4^,8+z'_?~˰fJd2~?8�9lg&$v.z|vAԈ\؍l_w |<1v{T.ؘ1ПCduus7PA$f\x<XXXȣHy$wee%'o d99c-3LX$4~?d_[1lc#%ᘙ@(+9er#<+IrV ;cFR z^xz{m0VLvȅ$�O6*(_$CֱM2M*Mtij#.�.c3ení򙲵s!i=cYBN>A5}fغ. c !IE5yVV'vewǜSp<&vں`wHa@`m=Vp?kBh>98i8qoryŹH VaB\2Z94rX>T傑%4=hEd/ Z9YN7!l2\Uu}GUA bY^yny8L z X=WEԉ^V5$tr0<Q �WCQղ~|qJ# 3":g#5j.uykkkLӝOuk4s{;g0i]Lx'AtH,8X0N8L&K.EԲ AU\dpH\ OD(7CTE|D$`M&J"Oo4eb}ۇcQQLR}jUzxYP5rؚK` W[q+9s '"ZPMwDHbv!'a8ȡ<&b2 dnۥxl�z!5\9= >a3 aF_2sUMyi:d1&�[_o6G?>*lM~cߊ2|#B 谑= |r_n7s'|wGAdZ4ʕeH/8~WTEnIx܂VY &z.gq:3&Iir& _M)n[yLոU@߅xDF-T c@+0pC644c9<10C6e =-7NwE�#Xs嚵d3 (wLF}G₶}uG/�W-?M |d6VA~2(U6{!gsu&I?=vd |)9_Irc!V6R\NށHs`BRbY[] k!2 ̃2Ÿ& \u7y7Ł5؀L#@DBy t`QJ|ddP%tGutqG�&YDVɛL@G>O=0~0i`LˣMO{Zx=lV擡:Pk`QI[ήmDk{ YG.q9B]"xάFm`&1pMG/C)`o2 ~hnvcR"l6�rJdϚ+檲 wi0Pxq@+`wa jQ q 7s$ c}nlnwww~*Wҙ]r C^>4{$S+8)&!ׅQOU, p C:IgmSٴmh9VJ L?sh, nj?*nzThMmc QEoaQ'a{tĆƧiݔ"HNثECQ\rFg9EAc0A xV'F[w.bZ퇶;?i|B+3Mg8lfEa;ڼ)6]L_{s|$NJ_lptLJv]"P'KI〳hY_3m# Htd$8 I5t><!GPeMb)\`t+sɀ r' 9ZbLuY)Քkta0ʤW9o;[ѾMW#.Bl!;!.Npᬫ;<Bqȩ!/@g潑Q;bz [Ϸgk910mz=9;;?m55 = -=}y6(]0ʇDgYEh.fZ|"#(3ťlk\o^՚c:>I;> -gO-pxp|bXn6-2@dxW2ߗfDHҶd2Y]]El >OYzfCx\ iƵUJin'2`sP"GiɭW,Y6iȖv]ds`hT@?sa9|"_6-33$G>Z܎^Ps; ]"$?ұOI9�])CT9@":21p9X949lvBKaaqw,..Ϟ={_|bݻ;_ܱ y7|!yH"k8fqb=X&asP#ho}[K)33{{{s;˿'8Ecb?dߦb8GEq:CN9k<&gggS9C8%hH-"twbwcpx܎8zb%` Q$)y>thzURZp2B+ PL$bY`'W4� ڇc)f\'iGI*q9JH93}C2TogO$4ͽ;Z֩O[wnxgJ)wjsu˻}ane�S. !``ũ%ٽGv[`ZHmH·|bX>t';?=ϙ;333sw}]��i< ,,j  k`lldvC*`0-FF;l:%ʙbF` 4u* [_YlT[n1Ҟanpam)sQqf̅;Kgj&x BS*A?'dQ ^$nR~K|Lf|YchŤCNqr|vfR >:nQZL 85oݣWys3~;x^n;kw7\wx~󳛧_p1ɲ: PLo<op.UO 1;?椦UܼKE5F+wwo~zo^V߿9�-$nW+C`.&Y.|c5e*eyYHֈЌ f\2kZtʫkwwwaa!_J./`'$RRU~áoٻ-YQ~Ǐ>j_sLDw:"�oy<n&la͢Ut~Bg~L5>%P wV#+ z↫!CD1 3IXY$|cZʥP; ͝?q~c=g7͍lxSg_8?{=|Gs@�V@Sft2*`4l<;i*XR:L᧺yn\o~6&�i*Aw=/j%'`G=K3;;nxG~iÒ Дt8(40 PjJfkkkz u0 E$ζVְ/8C{k_w{{<@L2HU)]̓YM7#0ASLĘJ4дXz=󐧝zT)Q1pz kք<rС1Xy*! :ɩ-Nὓ/6ߴ [}__/|^|{KKKf;xfԨ)SΓO"+鑷tT*sd*� �l,ipfgggcv>N7g@I!ۅ?5 tٷV kA+^Wʕ+=J<9PWeIN˟b'xuucwyĉܹs`|nYc_du SwpҥtSX:㐵ٞAa7 IT%A%`RLbAD2G/ֈY%nMO-j� UZi䋘5S;9y Ų䤜vybeFst_~}onn~]_u]=ޛn>}x<lSgve@J �lZ hV4y,dmlN| Zfxr,!<LfyvGw{oߵ֥FPHtHSKx52a p@J̵umoqٳg|I͂HuŰ=\P *yF2ktG1EvuXRz}:uSG?p&<"JIcL l}:X]]FkA~\՝H{i$dUڊ uT7/!kȥp݃ڞy3C}ݔAc릞;86'.\`pnO&YQ@NpԕFIbYf's37<?T󩝛w{wv$@O>/~qm^t FOq_�=z3Ǻ=w)r,a7 d~ҚkM&xfoCמ1*]*:Ic]jOϔRFc4zh.ad8(<}I+BI%I qrfئ?{sr`E3 <j}ses`�HLKߊ 'dBQƼ5e$�0$׺/eԎ#v?.Оq %$=i &~O(nuN9SqaJwe ##q)4I8O~^nRRk 5e ܱF Fqa 333?ȕGo]뭷?~>ϝ|Wѐл1N~9PJwB 9Xmo faf۶wo-~~g6gvgL 38|i]5򚝛|vkhR&O޺h4Ɠ쮧J&G=!(!z}:3NZU`X2D>!c[[[D.z8 ̑q.!֢a䴾<!H ͺHekffܹsЇ#<m77P08u ari_Cs<Yl3 jLƐĉv 6n7)<lg"79qށa10; G :u~j+m\d+Us4?+_ UnNKjf T�Gɬ E7M)}s~׽u}kt}o50,FUuY 9&eUl^w/=4WJٿw޿y(Q�i,/&aއ{sp4iL_X@(2 ^oee1rG)$LV(^?0 !8n''l MDE$`T<Fsv/|\R{sPi);@)_dmNN]/Q|r6R$=ٲnǸ.U YnE kޫ"&1=Õg3lJ.�ˁ?C!~PΟ?l6SX 9cNϣQ:XDb&l^/_zq}[?_;38'wv`fvKKK1ewww0~zF)es3?j~zuv+9[6�Ch&S4l kK@w ryzd:%HNw︣$@(:@jL6[فq8a m:ev qP[� k%ԴyW=`yUK2P8fYɎ8Ѥn#E (FReTfPPIccn'9 ` V֔8TiVˣss9{5Y'kRlmhb E[nϟg?Sf4ݧ'̟\Jsw5b$J }n7'j)xo?O=7$n=U.87jO?P9[GboM׼#\y@.(d *Ң,42 x;I$L9IĨɸkD:&>$aF]23eɵ:c A\j%KB z*Uڅ=58$`03 [N $B܀I)f!p58:ZV7.J,g;PKO�-q9�GGɊw=謲b7lr xvw"$1.`fzTsmv뭷&>wIDZ p}hWˍɩUm3N9/@Vc / Y9)0&;[y#c BUg$yFg`QSOXqySפVveؽs�� �IDAT{׿kkkD'P/I�IX؞A,š2 `(^=L]Vُ>(R)w72=Yfuv1yCā6o\X93k=#P *z6UbR˄�׆&cnQgΜkWE4iR&N�OC=ciJޓn ,lJIgIOff^sV8=*[<Q'V Pc% T`%щUk \r+= jx㍗/_0RI 3Ȱ-8(8ijt*mՠ4 s50A*E'+wxU{Hl,NGዓ&-C8e/c%rU@DSxZ:G<v7wT遆NQM..=mJj瞋`j{(uߍev#kkh`o(<I}I^$oJz^w{]E.L5_3e"63cs?'7ՀЕb,<gښ@n q[XTL_tp84UGZq܅mpbnUfZ� nb0Pq2`&S Ba#)pzn *yl͐ l+BVI!~@E"@d3~e&C!f`|#^'BLTIT4�Xwl/_~{ޕ+Wh7FZZ7o_ڟ 'd<՜6ݲk.f ЖH ia*'y,)-91gk!xꞥ7Euʤ q Q�UvdUST+ nWBo£\u |zyŒpþd)s~!dj"oYrIa JHd٧9wوެ79 1Df phxںzqwJ85AI9�oZebإ-'b[!ih@M{[ z~?tPh47x3g~ .\+37?tlsR&{[{Z{;T~ny0D(5kNy;]`3ǥAvNvbVjɑǰz@6,R E֍l]*a:'s4+5Q!͆FS_Cy@dͲTnˁ1C#zC%/ުe> e%C{npjP:jk;J6AT&0ncJHs%@.:!爫D 6IMQCXo �weW+л P+8=J:⸧ Ta<_|9ăfz5ýf]Jٟ7<5'|ڝU|% BE*SuabE|K7*ir* "F[˜ Pf'u:05`gtq-0؂ 6djĊMiGV$<&0,l<+"+OG&T@qrkdg? 0A^Է�u+RÚoKVe mխB 76�TH -//VYs~-򂘇7O5ҺnqWhhP2[#̬_-QL^CxZBS:M�׬H8;+ݔW%he0VͮM*4WXmzvjY,:yxƴbB]@ߘK HQx#h 0ӵ\_q9 BRד/0-)*WBIr32wTXy8N/L| V{Mll4fH֗4q9u.7�YEkr;y8!:s3DJqX_ Fx&4ȔL8av,kWUGlF810W|f@1Na-jJ[ޅ-X\ۑyܟGW.&92PC&TL6W1XI�<s Z3IŽ8y5rY2dju@ގrCY}9` b<AVz XOyh<֚ee= v"GFƎɲNmڲN\ovz+R"y=t,gb:\E8/ˣѨ^&$ WLd=DVkizQ2G(ʳOU!) F;z_$ڤiZn|cc#?<|f ; VV'SOI=y7S�yvqm󵱅!9w4x۬8rL^RPHx㴏aK ui,vmt9zlbv%`#kn jPhʚ�:d_+"Æ#$*z{p 4: Ȉy^d8(}$�yT^Ԃ^*b?{͑jZO݋w6DxQ=π_GxpIJ0t΅/ r;RV0" ChŇʰ GR<ZQ6;- M!نrj{\7I_ ZI,|SVr2f/U3sl�ӘJ|WXִ *`k0q仠vkT8J"MC8|S9M:+sss� qJie(R^FUE'XfPsaPʕʃGu:0[U Ɂs',?Ӝ"ǚbJh^QX^ȱBS^AHmo4j>"X>n%<s ykKKK7xc`CR8JbY3� Q72CFȡћ: ,x2up-,'&G#JͲ2SLNfy--o9sv`Fj|`ec䇽TW6YէeX91<KRZң8'r*'NvylrtKW7f `Uwj^җs�Ceַ!rFwH^xؚt$7T5kIcHTDՍ^t1L7?Ir0oX1jպ;70q�aca?:CLh4N:dv*6m))Ůu(~͆1vQƌF֐)yDt-0@pa ڏIbb .s=.#'=|znٮ4iͱ1j$Jz ^dcFIT?OޝnǏ=)6Wͳ_+A2o[myyymm. T՘=P!3ֱ4| xeV÷$Vv&T0, 9ŘfE\aCmPF`VBYW Y JznT3\~_ٳgQ=b4@Æ9k9}n vXw~zGnU{̰̀mB?9G<E'yEX0ЬE"톰<CuU4B}~Νx^&FXjɬ01WRonTʱ1UҖ.'6J3%>3NbLrO5|/98ݐKO>U L0Ý̓^~G-vw׭H4`KN,!06^cI_+P\5z{WE"0#1muo[K{HE7Ë£[5SM~3l( g0- EXE?CsH }:,+6O*ƧY˒/%ib!zs"2{v0 򕩲O~b E#NJ覷kx7O,[(]E^9Ջe^𜪀D/Xڎˀ _`Cgon[oZ)C]/ U0˭HKd$q֭9+V<g7cy#&X)6GpAE3EZ@Z5HFVV2Nq|Il>}Q4n#D<8q/ j 9UϖCV6X{v[x@\^ %rs9)!WcU~۷g:?i]j͌f,ﺄ: DFBXk ?^1r. qΓʁ oaŲA0" `ئqy4$9ɟ3  \!ĉeܯ & 2ʚAMݩi4iwC"bX>M30?'P1: 8í :ċH5z8s^3GHs2sj7!Uh4cx̓ǎ&|M|pq¢:[.-"NF/{H .)}*1nv{Olzo'=[G+\b7Hhہ@/thST~K8EHy,'6^<xkykwqSVvO�PZQQ00 -0 Ly~qe&jYe3zTeJt8l+佛bn9&L!~_5wAzrt=E<U FYsN\d yEK4`�#db?A`kk˖2+ne5q60rĕJރ|} V3uSe UFc޼__{Ïw>c#mol~�Ã58cSCrU)r6⼳(rF5+.l3PLÉ6 !v>֩(xR'8G?甏!tK͍cpĬ >^*|Duȉ<Ioy�1WH oUEW"miWf IB5i!89&±e?xsL.QФpePHJB=d 3kA�v(499]X[: *!яwfggiQ]Ds�,Qf+1$䄕U-RP3jlgw �P8f%~\cYi>0-%L{E #bh+UVRVx#&&zt͑W� ,=grgEW# 2a19`0@R ܝb;l%~<y@0= 5S**h~~ n8o5<zwk%*&L"̨s n9Mh(ԚL&w.ɓ'x|ܹlbRju*T*DHX" HÙp`/^!F1/i PW02iGmީϬ8Uy>n`.ast8qš_-</%&2Dp)DTr\7b;Y64Ptabx�V5'= vC0NX,q9*3%߷:l2{p:TpO1fZ/9`.t5ߒfe` '>{Ҙi,--}ݗ.]׾u?)� ;:5Frf&%Dܠ˸\b3%pBpVņqAv=]UdΎA I kYLEtbŖ>:#5,ik檌u`0)&xT @Æ<yd45We TWۖR9hvȋ ֈg@v 8Ϋ>쳶izh9M*VC!]k39&یPFd#0V`CB*D=+l{{fTdPǼ2%nOSfg뻶gwyy+_ N[j6?}iNU h&[h9<W�HVDrntҽ~ >܅=+8 g܏ X!7[k|o]�+10y sBV Ê-<`3oh&@fnn[oo{OOVWWYEnUtiMLU @eNFzs*[N ɖa4a W l{yĎ!j(pU 9EM,GQN,rTnq\-S:aoˮtp<BOq<Ənp~uuuss;H`J2VH2n(kn \r~t=T)s*30fwGwh;QY6f$rst~Ra\)#8f[cɦ$+z}k==p8^Ϛc{: ,T]yvz}&c4bܹ+vG5`A z~n^qs7s|L>BÓacVo)A-,,p /^a^3g80-2Ϥ9$-RV[gffzӻɋskF?ٞ\V!W�)`47(, �xԙo鍍 YK7C.we38"[Wl"`p̙z* &{f#EFT֠�h?洬fF%K� _� EiS?sܹ+WM!*,?sss٭0׭HO[+U_tWa3j^ Prv'b9ra.&`=gq/(M!Iϔ; ~aaN'= Nw}~~._m (3͟>=7S_wNh~9w 1%\UNJu& NȠ10Œ:/A꿜)*=O~*#0Gqb3"IGZV+[KTY[҂>ELz5@&2C^Ybr3֙vSxh <(,G?nnnȖ!j&RrT$Vf T 76g\Z>L *�V)-d6}"V!:9GrUcm(pDVTB) Ɔiîȋ``f-d9du. ejiV@c50(Rbvlʶlz�I 3H89GT1 fZO Si9/Lof50oLwfuIh`,,,o\^^訙LR˼ίU6Ba$yM6qNH} 0 3�(YsnA�b9,H@^hb0u'Dž͖~Zatb &^4LrX5�w"@pE+ٳgϝ;$^>;iPJDUhr%!Q53=`FVLV}x ɵ�^*6mr7wSײ=/z`Q /z![7U+YƀkIo rNx_a$H'CuoBFU9,&WM>c&+-+/]xִg"XSփqcHE@,KRbGT gһxv+/*"2+>"O%�L,fyvʕ"K�� �IDATraq~ST侰!`M,JW]Eb{TK `ŵP|hb)lxz@OE*"RAυu::s@|złUN" r4xKy:>=:p6~Z]UnVuH\6y ~6"$얁Tta j`[aVuyJ9J@7pV~-i(d$)Ҡ%±تmkhVn!!"XpZc8 d]]+UpUE l,;l7=6v2 :,d$:-n+Pл0t* Dl+x=2*�vܸ6%`>E r/ Y]fZ ÆFs cX9=/sMtZtʦE:jwv<a>1A<:I, rvQ k=u]&E |8PDҚ1x)euu;2 01oڳN C3SLdN>SRI^zv[8r! D{r$& ^fy&8TN`TgNqfNv~01ݰ`hEVN'!>C+kdB9KqyXrKcG^'~"7',8s+u C Nܮګ~U !oTiӦ)˨W IOD 7!uB'QՒCQirx؝`豴] C̸s[[[ЩIx}wr޺%*GC%B _Fz;:389q1kN\֭#Erf yIm>R VJt(:Hr*skGV-mk1+R' LybzEҖ ,*b@�*rY9'ˁe=ʂ#j4l`& zYoq8WģeRRve`Ѯ@jTY!yz,k sǶ>7Hrs!LVt]x4ϙ�.ɂCH8>0 @E'#ʧWITvI`bo`ܣǶ:Cl F1$;dy.!<%�6:`qܬ yMIA0'-4CC"+Vhtْ &>h@S sEYyXn%P$+ QނMtryC=! T_!~' * %/ TYMtЕ&i,1M#<lCΡ:!Y-.[@8D9%8oPD\ΊL];|N,M$H_ӊ՜;*8`tIu~RuØܩN%A EySv3yq$fZ1|D$/2ؖ^7,6nzfœ$ }irj< GUzRTQAJytN8j677U3T7I֟ y7z3504|QCzژ0.#$*a*ûva q {ڀҺw͏rYVgw1D_kWp,^M|H|@<K|2N';df7Vݗ\oe Uv,դ pgffڥ%vQHnF� vq}"<ek=F6A\<pIӱJ 'M7A7p4ru 5z6�2& [GyKKK~4 )*/�rK.)m rP$Y(ߌ5lԵN+!Dpj|Zک"} 1Rؘnv Vq9␃ i<16]{v`0>aH3?dF/H0 "aC7וmn&WK~l䊝 g1NIV&fWY6'/ZSN-..MI(5666h>vg,LgrTvBv90qu2*Ιemo1[\{~ Trz.67W;7+>m|k^w; <!ݐS zճGи�s EgwSv_͠t.0>2Μ)i2w~,JjSlea> jvX;*Qj /Bu./?O~*vEŋpbf=[&^[^CTYA-o#@oɚMެ^f:.A]ºݽpB_y3ɇ mQW$N ޝq 躗sRy;wKʁ?\=pUNYA&THқt:֝CHW`O\״'÷ RDvr9,BE8[jB <RWt:*ZYV*2fM PהCǛʁN9zXg.hERCwg5 c{ogY{}ƪBBBa38p":56vc;Mĉ3I:@l0c1 $PKBՃ3U%_}~wg=OVU\D˝ufdbI \jff��#9)r}}=ckbvj8$ڎ2|"jZ)^}$BamgDBM *|KpH]dFQ`0joocc#n|"` `�G57I[Rb %!MhظOc:S{s1L?kBn"=.Y28æX8q>}/IGĪǞEQ,//LjD?T&�=UbځBPemGq|pC>/HI3w+'�[n"?̶m6'o+{d2j\@r|R[ϑWNF_ .NqY�2ުeeY8p�YK`A~TGc:lI#&s~f9W}�zj;v:R!bև^T6dz}U稃~MJ^hP.{v\Mv_&폞,vzZ=feCEqȑΜ9Md[�Z1iڔi8$^0!7Hq]p'�"8Q2`݉g%�|\̚Kpd܄hdc@ :& t'c<Ls ρh9hY!/v_W qJQH2wuS|$ؐMV!9ɍ&X<[&xfK(@@F۠CBx[XI$-DH 9HhpکF%ꤊG%EFux6]F8 .{kkkA$Q.%CլiǓ3Aި*b0>caYh h]ڼ R!h0p{3x"pn\sSp!E$k,0R+ I Bސh{SAy2Q2Zٔt84HE;COduԑ} D'dOe'@P@(|;N̷{(`0|nOrXf0a:|ƒ i^Y蕕!_Qq`շv$򜯳-C'2s#_Lݮ!goD$[c;k_W;|l6;{+NHgZ?y4л.V-f`| 3cF߈)G'90z~?b5Kb"&5Vq(qR.vmF=a1)c,'u:OA#ZrڶjS̿7o-ǂp^SBٞfNsv*iK#� ͗�'p#� F 3;:Q0YC7ɤr2kf~}eߚՃ`(2E}WU:}C=,LEQL1A�(4$Z7 Pc f̤؜p`{ kjFЛ\3'H7[DL%yɤ)O-YvdE:[[iԔ)KѩYWެ$73[ݮt8j9-,fu #ՓF03 ;$I JB^% AiK\-(h&LX#Ef7^H+fQݐSMMoMoO?]Ϗ~f4:<jf6>'BԩS7|fiˊMҥfM0B:ƆaNTI%<:02(666 CZ�NK)Sx7f#2)I4N Yy|{P xh{3%<HvZOƥ\ꪫΜ9sqn1З)X*Hi%eB^n&e7mNu S,/!쒺၆m񼰾E=n/-C#BM>ݧty)kYEOqq+0  n tbad#p״%v5!?CCgҙ)}OFown&%5xX9s&rdo`&iqfcY& 'xVpJz=w8N>l N@7$||5<OΞ=y @΄|Y"$m7gT+d Ź!`0{�(ݣ23 ]H8H P[i累# F0[LV  w$MLD*k?3}BTBd3,h,20VeksD֑.GDVNܓ3d6RJ%-)8X?n77trEzNDe?H-}ORZM5fiVYdJ@Րe9^XM2}C!#J#Os.n$ٺFi.FlafWZ`0j] ؏Zn{1% KJ:F[f mhX!/Μ9sw,--ylf�B OD6<='f!CR]&)cɃq f(3.*kIi5ۛ򔹜!bѐ�:,_C4J=h&ITt0MD]dE0|(ͨW{`<~*N|#u0:L~7W9JZBϧC?lQ]kܺs[&!qۓQ;נt@Aˬv1}ۡ6uOqR6;zAuw2?~ĉNoͦejڬ2'r)0C"b#/7c2Ed[`vnW?S¤lrv<̡B,kfmdO�CgX &ٻ|$*<xn+*Hwqy`iHU >xD, ޫ٨(Ȑ!^].aamH7fHc bCtg0\y�k!^wޥ^}aRY<^m d$X}YSmͽOy)j?ٮ=9dw6Bflѵk)P7Y3"#4=hg~!~Bwzt2ufXezܹ뫫�3.]kH Sc@MSe D4LJ\ q &`qxGV}9f~>% Tx|#knƉ< f h% qey8f022!W0%/iAtÜXu늳g!}7J Ӆұe)'xb::SUծZw_uq~O QBB1 N�G ~t(ҹVq(O9 <Df7UTBym3N#'qv[L̢d �D3k;ԂqK1/zKl{j~&vlD8Q�nۖN:h/:khǡsL;pOʡv|Y5ƧX^q|"A]!z wfj!FߣA>>7f0hR텅8-"Ei*J"h8Pc$q:t(daD:n > f~bg+%B!3 #%`(I8j |0(!zZzګҫޖ?gmm,tI/T%>~x~g_E"]6Vv262M6%ΫW,& /sE;'ZrO$Y8譐:ʖB H(B6he㣪Y͋yyȹY[7+EJ@(h4VVV½qV3#1qhSrb CN\Ko)Li 3K'! m+EJme6A4Ƶ^{u=c&uܭ]|ŏ?x da=sv,$>UeZ4+Ӱye+dšc1Gy(y iմo?4ܤ ;N{<xV-zk\b_X|$x[̜Ne|h?}Oꪫ.ΰּϮY% ?6 ':]0Bub|L-@GWm(ᛇQ=hb%Ï|�O<H[q{o awN63mooa3[JŇN)/�ڢhXxgAJԳ;: 8pСvU7On./~W_vQٮbe*9GѩS"ꛋk_21|Qw2)YyUěॲ YQeuuH~ z].gҙצ>?FFvn[[͏4[+flqٺHE&M2z =,׭6v^/~ի^5ww}4n8Ic}g>>h;Re ; b`78$ݞ 7OOl49O €<oN o<KfU/4fϝq F4W"bA2>hJ0 $Fb@U(mI l;R4!̓ jF\0@|X,6="uݪq1)ڍ6uO<Phwq)`kuWxgϞ馛Ξ=f[M0A1fOu]gϞ=qĹsF k;J<ƴQO�CqnSbN4]FGҖQci,@aq'@`o>7  >>|u{&k'ftC2+o?-<9o7UUz=<뺎f.X /y+_ _#<2^΋t4%g"ĀL%i/zI;Uo;љ20j[+]3Oyw><={._ZZ:3jX/ӉD8tI/2A.1diK<nnFFKִG�� �IDAT "墳AL,)o=iJ7RxHMbw):iɕMKRm@(kq"rK.9yӧ;:#g ϢK$<YBCرc'OdcEGYF1{欸(uRSz\yw0dƚ8^<5SH଻/ $ z˦ZޔY="CM)  0]CΞ<>y|ۓF9YhQ&"?WVV^裏F# ۠:QlŠo=I;O9pwg[[߰|u[͓?_cO"\8gfϛ9t7/xG?=z~|x[98G\mм!]3ălG@y6$Φ(x<~de""&VFZ6!|Pu==2~2?<rqQ{Wg-ɡI3ĩ FJ[ <Pe&'`ljoz#, CF%4D6sߞ㲮X}Z^^` YVE> L%W<�hdB2#�6|S9{riM&b^�PqMr*j x%g4/-c{?>NkZ\r.ヾ_ | = Ai3g7i HeQv:+}5\sرǏ>}\un>n#phfm`.@&2q֪?vش}1p̕{ XnS !J7?ZfT켯~zMqn=d:"̫w1%J(7Jʈq*(τjеbMҤ_kUc65,/Z__7PT0OA@S<Xz a'xqP:!mz{2fyS5셳Ί%8gwX1泷"ξr t鉥i1͟7o|Q X[~|L37Z=RȤѪ~eQYj՞]7I|7 UUr0 fSN]xᅧN:sd>IeJ6>D0@ {&q>v4C$IeP8_IR.%wL?g`t%)M惒W蟍"G¸yq T~L\1G'o ڶol6 &MmPb5 V8~|xe; " Ơf3hAHc.%we-E" n ^ _ A9=6\5h杛_/7kLצet0q(TR]bg\eyagmàbd:Z,c*Ǔ⼋t$M6~nZ>\Iiccclztr$RqGX8%[x-oˎ;;|Ӥ: ٱsކ֋>B}B| yEb:s@X7~\�:|_D]Z0ad:/OԠaQa4i>\kG/ҸcC4M`V})"}]vPˆ:I IwG G AX7VUK&O<1ϧ>RS;. v F:tg=Ykkk<z INlhؘd:SWDDn$;UkQMfB٫fzCj:ɖ>uuWhsZm$DFl&�FhtϙNpZ6l.9#(,<w6ۨ0b v:tWRY nyKӵ5ڋv//GkYKUBI0ì d* be4'NUWt` BIX p@jZu!X,\?K~d.Ht2LmZV' i2Q5 wmdI:IB�i1Xx<Nu"lsXx5L-Q>;6 9en !WzQĘL=dgɍei0 \v쇜dz\�N{љ7Vl^ݾ,IJPq`UH7/:EۊUGٜn@ᰪ3Q܊#c6;믿'N T$,q Y|VyƝkHu?kƕj-T~ͩh# aMdn*`R=YJ2~ W8\ j-g4̵(;Uol[q3J˵i>_rz__}X+{ w]߸CvF%N6rJyas`™T|c|^Z̿e~Gmq;4FݩbkyyKr;@0}d2 x"6cgo~FawȯP&I\.h46Jx K</Ɗ'lDښxaN“"!p2Y4"#-uʈP7f|<+g<ɓ'766FQ=gYLKd]-EcޘSNm= c!]暅z}Beɾ {d2 etzL`Q_XK!hYk6Ucyٍ]SˍYd.]yu]?v3얳/oǏu]GtŕE}Om MDfc-|{v:H Ug1(GDW-i?f=O =M5g'I(UqY190[H2n̜>F-=? +􄆱ݽ)]&EΚ/c^^ixυ4m|Q~tɬ\4?PIMP#Omj$OuU!&w )P˲l|^/3{~pyyyyyy|<>Q)amƣ,U{6" [t}RBmlU]| Be??ꀘLVʺ#Pu !&YcҴ]Z뿳DR|4kSc{e8p녅SWɍß:}E~`-+XNm$0zZq@a0!M傇m4&tkV?mxRfwߨ(5 ʲ<ԭM_g<gϞu1Jғ6q|#5Eg)E4n,4KrK[ކHft1kX}?|_Iy(=tl:/U]A1ͱBHXkna6}i?IMlEJuSl6ֽ]-pGkǣKGKo]z' p]ݶYc[3(V%Tu5ˎtEf]L2)էl\M ~ˮ$</*Bک/f֓3-ҼYq1KffNմ&?ö>^ȑ#n>zl6V.i7Kh �O:("}>wݴ 8YN5a+NXY4 jP#s"}٬F;`# Z@k�; >S!5k@xٛ׻ӻOOϻ\EbxEM%@y86& x 7Mڭ䕱0�%'n>-$+v6èؚUU5?,F䙓ml-Ԫﮫ۪]z?§9Xiyy޸PlĬ!i`@9甄 =i ]70Wzx(9N'{Pjj4bSˣ!tu"_^^>zhxygɓ'i9)Y& ^ EJ1  IkNd8!oޛv 2eW+Xڿ&m=Ab ȝ@@n*]ɳ): H7&؝$ok^^zC7u?ҪF5<ݒZVP_tc%ah9iQ&y[YY1DnK ̵ 3lӻ f 쐼WW[Z)NJpdG> \1 pP_ҩJ2wr" i9`). 69Lt"Ʌnw9ڕ'nqLic"n[kNƯo;7=9ysmFGU}"Ny_Ȋqo Y! Mrb+"�"�0">el:GbVjgVv+\wwhP퇜occԸ!ݐRv\p_>^u/;oUU@ T2xd ;c/ΙK$\J|PDM Ս)*lt!}Ό<a`Yha&(T`pV"P78qٍ4)>0hg6nx2ҁ  *]^Nx1?%(j8PS:o0JRd=#ZpHٓW?3}WiO;U=t,TKπ/F�?y+pB<|pY+++E5MId Ɍե3JmǮl&XC{ p<!Пw"R0X,`;TJ\Yvaƾ^9rUWs=[ bKJ ά`硞`g4\STɏGmToP���Exڭ]g?_O< kɻl@b7} j-4|?1䉖Pzb6d#YH*Cv&:a7v\CQ'lL˪&sr(ɇ!Z,F?=Zv?O&:un~Y^YSVfn;5`${"e<{OsH,yeI5iF4H[&F]5:eqgͭBCkuuرcƦ:Y8>NԶ.2q{]pre&Q ]Yw!HJ6gN1*( #WeR9|$9O0ʔC):S�Uc<дS=z~�KfqoSx<8i,-rvԆ2'RDe]e M,o Ԙ7aݺ5N8@gei0PV  ٳDJcMIg�݌17d4L`@R$bP m' ,VDf\! @.'J,z*`>ߑd666ȡ7Nr*Pr"MRk BQ͉?P$f;zk]s^g$ՐX�SΞ=2 YϜI#aIp3N{C`[2,b/`�PjCu->Y<Y))InB8> `7;NV֮:xyrTHoyHLIFјNu-zƓ`r:@ec^2=J1$"�[;y?T4prU>ht: E6M)6`� 69ݛ98vج@a bҍꟍrMgg?puzjLv{A:}3p& B(qX1Qo'}-qG_1Iwۀ`kΙ0y= tT#,3"8P3y#z|Y/@N֡V +?<9<`>{`V}3O>aV^bpjǵoeq/,,PpYc sRJ4yv5-=8(Sѝ�Jˁ';"y$. k &EXq`^mq<[<F">ݣ'^%Ogs?ER9߸xWzקҧ~E1oraO JȲ9 cIד>Nb3䮀U!3'DI4[g70 B/b=BE'RH?HKғ",ܔ7~x#O;g=Yo}ޭK/_?NuCcŪn_i&6g†@9<=Gnj.`s 0e -ijLu{n]:n; (59IC&eeV--A2;;p]sN,5⎑}4ljT@ոr, _Ԩ폷i*7CqPSo!9Ld^ IT䵝iuOTo߃o!?&a|� @F!bm> #֜.ra釈p8];}kz͍#GGnzĵn?үql)MHTbX'>_|q:Mb`$R~sCht:Y+K=i=g ⥝2EFl2E fV8,v"*8dN5C'[ZMwYQ�\x#P\Iyb<-jM2-ZR S;02p~?|N^W|H4MsA͌!b :xvbPbkeu;V@Bzm4ὸ7,xOot$nDsB&dPWi{6=q /<lO;%|Vyuw^}ꪫ_޽6yd~{[Zم|>j|W ׆ 'qۡddj %/nhшq 1]/'O'c#�l%֐8ô 9�Db,}cNF_38i" Ĉ63LF%΃ d8z8dR$[y[�yIԬ42j50Figk^"`؞4L.B!y}iL~pBڤ 9  CtUzg2q:UqToL�xd75]`qxZ-#2pF'g2C]|Y?޷6#yֳ~y}w}WY?<g:sL?:v+.l|~sCg74m%>+N󈒹jG[z!^G0@g:>=PCg|(SM=;e0@ʢev0n HbL,Wa@$v"nPVڋWΔU w\5f2?̐+[d/ ^4:Nִũbe)Ysgqo|srEbd&s?1+SxN3?rc�- 6{)TOd>]HX2'{`0bELUUGY__�vRȇ9a,}2͸*F3z4 åg<NZ>< MFa&t6sݡG`xѣ'N`a Td6sd14_L4G,mwI VT!8cxtJWdJ�� �IDATLMQ])l"S<MV7znq֓Be2<*JPT�5M&4q#Y'upCDKyJݿx=)㍑VHFGhI8[kF޹q`GU1;Dl(KGn1`+Y5S8 w:+baa%`lQ'>YL<etyZ^^;O-}d] drm}[;s깿ry殾k;caaa45>b (>yYs1B Ůg!iwj拽cȗLqR�:G8w3m 'uiG n_PR#Ѣ$,?f{'Fߝ!Gиb"j輽 ,/O߯rEQ ԺPMH"<¢I�sDÞƔ l0@Ğ-<Ka$HzTfrֳ 8 ѣGWWW�[{SBYGZ5t}"+[ڻ뻝'?[h<j>ڜכsE-KzW?Ͻ;nGLvm16lG즱;LV9A&0 �zoQ5-c\|k JfښXWVój;L{<4Z|,XYf"2<`O|q+G~b΂ljkQr-" 0) ܨՑ \r%?t:mkN.Խw/)5eBׄ-T%FYǷgHg /m񆓅6•U,K|4CE떺sk2ir/,,lllmf~?T@iPɈZG3%|@3Arp 6Bn~y\?pK_zM&<)ל>oh4ԧ>u뭷>}:4vظa*7ӆ\�#Ys!{=bsƃӍΖ9,6QgOYѭ$.aǓ"{ (8u#4Z_b gr9Tw-&dA?5@t7_�\#J:^Y7^[[;yd;Oc`=lgw[2 F CEV6L%gŊgn\U|'Mg` 8'7l]__gFّr ;3P8A"Xt`;�3޻{|//4';'xjqT3)w,,}l󻝔ҹs)nF7{g|.3tD tKCNQm-,O-mr|-w˃gڲ�U:I,UeAp-(+P1D!ēvCYiȲZ$Ʌ!T7ThЖbk6;ۣ ɤxIQ<Xgtd?] sq9f_bq!9Q <ci(ؔE6tts8{B>ME# @ũp&3NNk`[0kM̝d�+ⳑ4:Hhr|܀ [ ;38X F^7=6OǖʏBwW4{K)͞=~ɪZ M,>LM-�.] fTiCC8�<%Z ?I{6S,3BO0%!z.b,Uh69k$h 0.<ΰV4mTh9h{j8YN I,]'k,o4s!gOl.LK&QNp\*a|gmWxކ0~F.!$xbA 20(:+Vg-@#1'9ޚO+<D!Ua3czB~O RXV-ٛ֩V`1zPOS50JE%Nt# &=ptLEҐEJĄ)v iNks:{ %miŚBEL[ Aˬxd8d~B&By:I*'##5k!P49 ϟe{4mll-]Qg59K*{qFozeYb5n_;9~xTT_[%2x In6jd�l$pdh3Nj'Ս\0=�8nϝ;FdR43c1.%;uZa& ='p6 #ša)�$q^Ӕ6F{E6 z"F뽭﷠AS>› -F3f}Ѕm٬Bwb|J]/Ig&n};�iyIds&nE*IC+a:B5N'(t2.bc2Mqذ˨ o:rYϷ~_5Tb9c4r?M7ˏ ?0[Ý,3fM)1agLO0*c[F nD1lZۊ@: '>#s I80 7FŸ͢XIfL�d6i1 Kh8.@}{B5y0bY]]9J 2.҂A-{=IrH;E@fAK?83w|E&dK!nBJK+0nCӖxwB/%H2˃۞6/ZvI"s9{}՗_I]׌})KClƍK-^ILf8ŊFs!$iVm>2*2F΄Cl#fSE68M4)F6|-q ހ4"1+!\a8<>}nT"nׄugc~IP'8.㶀8~L=2#벆G$efVLlzmc~8 F/;;# k)a|IF,NwC3ʹOv}yE4d\Ve}a]݃mAg62 +L?Tb3REklٳg`0@Jˉst@3駙 FjwGv A;ǐI[ZZ-߰{ֳD01;fzы^t5|_{-c($v\7X9Rk>D0(Z qf7$(#h$D,(_xŀC3 pvVڵ֋5 LOm3}PwZ6.B/Ւ!憎h;jܴ\Oejbٓ-7wIR&$[n=f /7NSϛNjBɆ#gy0�rAaOo6 y:q!jG ? &뤝^$f ;'ÞD}{ir1a�zcYNmJeSh^XX8rW\կ~83"O$M&vMf$5lug,^ۀ34/h!$I{rĖ<܇<iVaXڞvqrv<` ."<$Y=5Řr]FGRkK,Ku2oW9{Jltïv:xe|gϭ7F=ϟ͛m궞)kU3ef�z '8�D4^#oNV?-hۄXkď-/o:0u!> G0v<0phdfi#owկ~̙3!hhۇgnY҅,PI6C6;Rو!I2~{>Y�ngk  G L :nqӘv $@k+RH֝.Lc 61,d}}ۙ2pQ^~4yl}vM/ҋ_vq9(;op5qJ9ٓ->hQmOz&$AK[<4 $@tAHA:@.4Z}vz̦l6<hWglo\Ӹ ,o7 W_}5dUUB8.iudf--m2i+[Y>ʗ=ĝj< �Qya"O@v#baST^+55@\]MCD-x<*M bB0%jLwFh4׎)A4ߕ@K UX�zK_zWz=['d4trfza/g景~nz>S ~hXLDp"BM!hƛDF  H0��=fVƧ,`thtӧOÑ: |ŏ!(yk>t0zh|ٸj]r%w^SN/?=jeem1-Eutn8@OD]DwMVn9d0vI5 /amV2ސ.N<A'zYE_�:jfŠ* e՘"z/|<iX0m ̄PE7q혁hܮ1eV1~ P>%�iK̈́'B<~w<yϳYڞ(FE+hlOYZZJEwze="mF'èQ�(@SL&ʶ2 шio,n!5@vTc (-_d;hӣG+).Or]k'Nԑpq 1K3=,l-ã'$IdП']emdB` agx0:MS4mvQI6h%OVxƨnLiv+YӀ\̮ CFػ(bՁ*yn 򅣝 Qa0;vECak񰫢_o8&I[N,i%it#V=C#,nXvRq7p?v!Ǽee";>~hn8Q=`eF56٥bntk?vӭv;a0?~ܝiX#G 9' ,23bÇ0sR1Đq:֗j"%97$%8(&<lo`Pq;Q)u.P{OPAsџe9N)&#TSDК {eE'2Z8۰<> 5l:y?e9{�m>Z;|ɲ,O8:t6{!lQ (nG">o8 qF�~k@STufc &l:fWm(&čl}czZd2ooNf:zr.ɏ oR"HcVaU9~ 0TFu82 >X$P฻"]q7v!/䮻.<:i034ǀ jE:̻-D=_*Jd␕ 6?\65W>k~y2=`ڟ;x9=쇜 hx1vtsGOW΋Q~=&cx }Qo$3)3S)MjBً�:lhjestnȂi&)ک7m]@NI/>`rDxʼnLy9l4 ُΚ_j6l<ϸN>}w6oO;Kp,9QفJ�͖zLZ#??S iff'3N:q89=Bėr&:_v6܍lV7@db=R-e  *XCżC$R&I?oCl ^Tx Me<r8lޑWύ,b-4H5.ƙ]'q{<o5{je'l6$잛xĪ8mT&kb7ʐk)QJlޠP@'N&|:+;{766yj,|4-U4fCSvkk<ĐM3i5@d#2('u#+v앗v6-ؚp,MaFJb\d<Eb1Fh6+g/m3ٸ$$"dV0oE7"Kú/μM8O=�Ehn #b_g/TZԚtOn'h*ɃqXXn9ڧ,.[1͑s$`}2`7H=U[T,{28D{`&T}F* 52#E)Ž=weeeyy9.cX F(-1=ͷȆ 6oF"L'.9H\b5dd {[DGO/qf&."Lb�UbU!$]3[Zi.hw;%ɾqٳN\<LdP6 6V>ݑ45%}dNLgtx{-(*r<gҰ"] �Jc`ZںAH35Qf-J6@ޣ_@eL, "Z5T]aǩ4ͪU>}r.fظQR gFf3ZƬ pϜa/..=st'zd =G^bG"sGgKe92ol >yR, * Bf̾3$ƉngX8c_\a<Si2jW~vNV#dbc/_UC^h4L!O#2I_ũl&G'[%AL3ƽx,Bv2{1qMBm3C?"RƏQcomgxH[΅ܟ;m,,'Ii6Mf٥r:�1:Ta%~ML-{dҌ|"sg*$�z:-/`M{/h(iZC*0&\@Jw&TލrCcTm  We&ۥ(`5mg#F6#VtM2N`d҄kf" NMxwĽ`;2Ywa ;]C3Y:R&eBv$�Fl40ɕ5@<pE #*e Yq³u0^}Aآ6C?Ob;&iK:?~<{R|R|WQ}jҬ/#�@MkP@h2w<CzNv/Rs౟&w'3tmJ)MMR9twDmy ؘVsD&P�)A�xLnw4 F {IHB`c RyL-i(_}F_! v)pEpWW'ISskG!N;cbeS�,ɝeY1=k@qv팍xv}aaùFvK7Wwemɠ�_i/Own?=} ?ҵi#RZ̈Ń27O fgg z뮻~_<}3糼\fH&?6wt}zӷM&�� �IDAT;;.8&xY\߂gMn+Q2e;')Τp@<p 1FɥMﶻ;7AC'ɤsnԱ-,Ba^сHddlDbin'\sJ 90LeHU Pq`sxE2i ^כL&I!>+NG�a@l-i~Ӫžt `?^p-<So.UT4u+!B;7ҹzG,Io;k-  ǜsU̧jZx _XUw͊2͒g?KE>Smk&E_<([o7=9taAgMF6 X&#Zs! _4 5Ll0hEJ6-'Mi6b̳>\2'B0ѵIfߤ-X�4etx>!.sĉΪLK PU6;'Ey9:é: ~@gknr֣ $?$^;C} ou~3ڬLeѨuύ5l~ic\n[##D_ a<///aYO<D|>h2_:"x8w;zv'VZ||q(oy~ϼuWmo{>l�3܁CqC3.c\ґrA='`ǵqjUn pg=Z\͑)_،N?<Px^f Ă  HtbM><0bA=t9;P$EN1:6F9r !H:G u(и ٷѱFcS�0V&/�^{.= ڍoF-> % xNx^3lkT̊R]Y[hJ>A;:n2gO/�G' ,;^Q5S|k,rVRJO4WX>^GSNTOÇ_~j4_~j]AÑdqӗyNU`TquLot<؛ 6u%"pw>M/}ȼ_$G⺓x<g0kښfBFԑn p STİ.픕ڧq/'ow#4@!;=`z[۲Yegtd>pJ1fH}a -IJNL< ؽ>2ʩB.#8qNR{W]uUQ=h4j|1a33?/-EC)I1ۖHlxPrX瘮@b?>mvS_2ojO~bRve'x2~?χb͟ɟ<p^]m ܟU6X38$I[q{Eu}iz$='ƒNPȄR!&a"Sl+CpYu5s( . 2NfqFY7!sG܎"X/Jh9 NRpq?/ L8#~m(GM-${;p$Y,yp-Yxn 8KPtܠ6< /nַFHIPҖ P56,G|̨SbjHh oiA|7~:=S?qc?x~?tۆp"]"0HRJJ$7P)JrLw>N+O=9Y ΋3xJ(Hre%<#?-rh8`.HY`0 +)n8Rd }L'Msv*[;S`/Sd7n)=ch4xhd\Ikڍ 'E*MdLLZ!ެ־ZY$>m=\jeU>7|s]UUœE=ˢ!tpӚ;ArP+�arN|Hͪ�ӟ'|uwIEQ4L-[w}<AyC�uD&V,3Ad/~kkk(4P @~(V[__ɉ>fRG=J&7 'Nv=ڻ  `u+SߍoCŕ@,T3}HLޱaBq1k! B &AA2#{Q&07 P\.q:RHlfAlH c<@26tfvOH@x]~j[R]uK?Df>V<.Yˍn&Dfzôjmm _,篘7oiXVN:ֻ[bN 裍#)[]yǏGm`-7,WJ)W([c.IJ�;X4'B`OL1̨y6'A|Eb A&y!g(d&'lopH1_r@�k@~�ܣni]i֥ha;36_,r:Uj֤s4cst0}5Uof:F<*NUQm 2�[󌆙Aڜݓ}vŶO[[fOz?سtϮZ7EQ(;h4b]j(-bۘ wC,K\YT-P'�cGv #rdGfIli7QVjM7`NHhB4O[`ك_ad?B{uCvl rA >n#di"V13ʉhM6M&"_*#4[2>{`wK;%B}`Rbp+fu<\T˝t"3lvNs"NlQS!=$CPc5uѺ[O~;?hKG5mf{:I:XJxs-$M\zHdl% {p/L6v{cl~k* a8gVs; B5(jɥ2dI+hM9 RfIm k'؏lOO EL=!g_$�{ҷH 0/wuz:%p+mwGUCdxCq;LXu[ad򚱑+ESp cA ]@tJ,g{B䑡GkwhL^]'}DB [$vClaF9?{ٔR㓍K;)lkf"Ȉgd0Vl(8<rܥPcF ϢHԛL6a߇*u!,@aх^n{Z&" i Fk:`Gqs&ϣڠFd"jh ~{ mF+|ϚXCj@=4$fPH2.W':LD!kvq<̪%['lL~�Rw6Ce J�x>\WY]Z!2mڈQ\ 3= 8eVl~ٲ*]b3i-[j(D8"9E)3;m9:WHI]=$YЖ�i?=jA˴<h:ҴwG*f@h mX`lSbX@M[FE.Y&쇜|Y9]`.4㶪ph*Kdf,E穩̙5ƌYo6ыBO FE%y,s P\C=tx Yvze_qpy @ދKv5Ƹ91ӖFGC2N6lq~fEaEa>*ܽG~IFV`ԑÂKi~6z̴ J<ҥ31<Qݍzfi\9r9yΩS?54!i*<44B kҹYi\A\p{xCvNDL9, xn@`=fGzliSAzzLbe#;)b,W' 0FB2b'@ʔ'u0ti!4zp(ŰɊ hЀ<Vn///Sڦ-g@j@J<�:ɯxf%sL<9Mƅ֒`q7vN\@"0>eށK(~ tiC4fPE]4F1/bpM;+|_}/--uaO1% ya-w&�ː7? qpCgt)B0svdi�DB^&8=f6I@yG;Y^YY1FҔh)c4lzT <~ƾ BNDzsfF|ED.3 Иt-*Yw$>%$2Q0CC!믿+o/| f@`aJF�FX!ɐ4zv<3=Qqmv;UW-0rRC$0R3ыq;iS�ή0 [>sPb5 J !wGy;q`!bRT̆7ǑfT !j xraq[\=܍G).{Ɔϭ!K%fwI[…nџ9fmG2r&"$'aKD!`~-)w11˲袋nᆫl>Ä丷!|Ժ]A?!Xr~hf8Ԓ* f͘x:.Ț` �ƱK;أk\'m6'?8\0iJNQN[FlMB]+++A>sB̳ 66)&IdH *�gE!go^ɸ#A{dvpo2rl6dLX [&E�1c!z �'dn }qa)(H@!2�>+M=Mf7,;p<C+x*YBYJ&ٳgᄏU4qv8<ffO=snBtS¡pH.(mg]tYz+T<<kNY1v7>z_1S \�9C 쩁JPG>&Aȃ}l?O e?|^hyy}LbWqμRiDdL"p^ޖ*˂DP$:pRoI(!ӖF uO1iFv )Iwn7 ȩ <nl0('O?h4N:fgS3|{M0CXbq,fK(e8ik<6n~p: $p!L>3VE9QnPrd��,|>a{UvVkuu5IW_~wA͒82u?EY\2gՄ{n }#;|M&yg8N*�Йq/wc{&9 j84\&c[!ޖÈ2Y$h]WidnٜVaMs f5"9f{@̴͗0`hB>t(-=B7$YvK:rzdc39/O3ʼnKf6t({*q틿*J`{4R1řڻ*sB !\.@AETd9؎ƎGXLˤr=Sh91t`I)p 5r\!†콳/v  }w>,t;, \xde뚇(=濖,[svN=\ǎnZ]]lE2f;4s=ų  HA!g\0xg63(knc8'i ɉ�߇u"L#()p0ZE[ Yȑr%r&La!P aU4H sSq/0#$ؤ8/ ʒt2SwKqk@38/H~FNƀtpel ܌G_%lpgI\aӠH] EZy bR}Ҿ}{`ҍr{A'g5n v"ox΄k; shRwC:{Rn"(XӴ ǒ{<K(asC$Ģ\p\\\޽֑)瀑GZA舔BW,+C_G+BvVFarӢ�^�Y 9O.*rcHآ2@~U9=q9%){Y\:KEk,M@TFm,Q=f!Ύ%a䧠'Q.)E Sгv+ƹ2p>Cl\1B2LT !h'7Jx|*G`ykna㭴c"Y 8]"ItG(E!O۶>'>(-/8> "T|^\;|mrZ pg-vE13ƭ -sC_"XKFV $2 mk2R)݈"YpÈxֲ l[^b!c׏3Lؾ@|jhA*X’|"^DX#}@aU0+!G/;2 :Rz)=)vaa =͎;J* bpA6g8J_vx~&۷gϞ`.d`y05!pD ŔШ\n$rXێx]g/V#!!r O 728煥*Κi31^d xZ+^)}IܴF*,ڈ4KxQqqqhPzxFs1|އ�*l$2e&tquX EEE ts$rrwENk.>>>66 &FPŶN:AEk ?%K-`bBqi(+֎baHJ+NLYZwāIvj(F)ϢF7SvMMkE)C&v/±qc ʅZ:@ 7]ŁTBU673tZKIg@b.)DQK8%Ejfb&IL�{69%])j/W۱#t:dȹt ],3;3˄@i;Ƨ:pD,u {4'pBv]Bޭ0X IZr.pYV^ّwdS !hXl>닳�WGL.ByXWWN098ΤM,\LLL̞N:yGR11,x@)gCDNr +aCZ O_qY#?©EYبA<w~'/؝q80H ք߹TYUUblXcbA 1X-JQY"NA\=f"i�>V¤sp[49;\ wHË,�H~ &^@"ScT.SJYe��[IDAT&qaqRg%Wڄ,6vENZ@ĝie3G^ղ ;y?34꿰2a1=#*JЌCˍ5N\v [ucn@n(&n>| 3)܋B`#19J;p[|9|߾}{9&ɚPZ^A /+w v2?ѱcG`M HIhF5N -iTuF&LLQJ( \*ؾjX?!x<',w%NmnX J̤ ò|@&vRJ]&''_p<=ddk:(\eEm͜`bg!Ӄp&24Ẑæ,!�X.<?5Æ'T0d2W1;ɲ v<Fa6ɉ$8, 6 Ź &S9=c6K\ro% ={Eda ֹkN';n3_djNP=<5>(V8Db4H#Ģh7V2p9jxĜxQ` | @R$M 5~7rQ,DxpFQ"58NgSSn4%j1r?2X4澳\;2}>;7(!ǎHxJdM{ߡ ,y\iZJMSZN5!xAYX;eV#1myrV\!j19/okJ\IwhU\vjF\>a4!5 k N:D ysHb*<g0X1"n·:\.<o1,W-qpGvΝ;'&&q 5'8sMg58*]m <аk~3O~"e Q*O;w0ş<P ^'tNdV8ѝ7ԚAEe+{q *C7S=+V#-PəXLD;] aFR@ieZ"{9 KhT#@!3a1p�<6&t (9sxh?Z0- Oyh[|6\6 "®L�a+*PU-["'H/0Xu"`X^oBBs6T1,CjcY3aBy,H_3Od_>cw4HsrqMmY8A'<H1}ğy~sL<LT6,jԎ;ǻnmEG/&s{^G;qBiE*{s i`d\;U ;s$"JM4%0 RvT:�N'tT0pxȎrbo#G/E#p$ç@]O$쳃JuB_a#K=Trxs΁ rAE5].6 烧1@c#EO)%eXBl󄋣{7nFHw()IӏX&Iz$+V+-tBfwG"Ŗ0AyРAls{<v.s~$Mfq>19&qE-#,…a’玸6"ʧ. \a@IŠ{pCV|\j�WE "o&{(zm~s /UIHzKky#QKnH@E#qn]7SnhIpV\Q+ʷqVʲ*MD̠ g;@ H "9&,cx9bw`4mhe=,g`ٳV��b=_|q5& \w{I]kLunl&~pD  R-ۚqB(pda |8湖P-T)B&0WQr266zVf:}NZK^W/Y+uĭBo[DʺڼY7^33u2 &^x& <%CQ2C>7Ѹ$`Q2mi=ɊbYuB8 CU1/=&s<WH(˓5B8#$#ǥ-|5NuuX,7L\jF0♚bTTT׮]ɉ`s (ƚ]?ضcsG n#Ə 'NӚ#\-v7oEkt5˸kNODd97nMLMBUXi~sa S- Z煙9l.m_X "s30000;0&cr 100000&s 100000&cr 1000000&7o^h=}BEy2_LPq/;DhD"Dy…719{wv\?ۆ9sUXʾ7x8Ym阅Ӛe˖޽{(_}g#2&_~fƒ`vN{:ffTVV<T0ah,ڿSS_S*ۇ`0r_]19-ܵ_reeeGVJ\m۶)Ə߳gOÇ˻ts7ol۶eY)))o߾])5a„nݺ)JKK+**%f͛RF0`R111/b+۷o2dȑ#R/_޳gRjɝ:uRJ߿p+##C)zsssR}m=ٱc2yر'NO2Eg577?CUJUUU<xP)/Dv,ϟohhHMM=zoԩɓ?O@`ȑC QJUVV)~ Ahǎuuu)))e#(--8p`bbR̙3ݺu0aR* ~J'xRԩSeee/Br阘YJC={gϞǏWJѣ맔:y_za^^>|?4778p@VR/TJ=:tPJoINN3fl[nUJ7.))I)uȑ;w4iҭ+:>OqLmmĝܹswڕo~\.WAAAzzzYYٶmۼ^ouu  jժ:U\\<xΝ;}mɒ%~r޽{ܸq^… .]JMM]reCC:x`jj+W>fyѴVeo6o|)}ĉݻ/]4\{fddz<g666<xٲeMMM.вG|/_%hYQQjkk+**F]SSxP(zjyzꩧ"8 [r ѣ>ŋUUU<իkkk].Wii^~(_TTO8qv7qqqN^^G}g?ËEEEӦMKOOӧwzǕ+Wr"6lإK?477?~<F4 ͝;wڵ]t1bR;wt>C+Vhllt\1b^zԩ#G_ܹsGIJJѣGƍ׭[ꫯ*PXXO555}~K.zE=رc[nz/^t8Ç~ޱHQ5Ě/+~Ü9s֮]),K;vlccƍW\ic^u۶Gm۞>}zIIݚꫯBPvv|`vII cۗevccرcVH۶W\qFH;Se۶͛2eʅ Z( ~$pBy~#a~_zն~{׮]/Ha-ZdUUUm"eضo>,\<|>}`ȑʬYL]C~#:uɓ';{l۶N3<B+pl۾vZEE_|ff3gp.]4i$^8m٧sĉg}V@p}I gq:6mZ|m'O:ujOwr_zgg)cx sT;dEkkkϟ?cXNKKiÙ?~jD59?##C�m�O=԰a=zp̟?ݺupRRR222ڵ9ݻ=7?̙3%}o!55Ue̴+Vܞ.]{xޛ7o^׮]vpe9,^KQ,\pɒ%%%%}A+đ#G/_vڸ{},[xqy:yyyWOcOKJJJJJfϞ}ۿHKKKwPVVgɰݻׯߴi&hpPVVu9s洍cx≷z 6mG4cƌ>}>}ț~{JJa8}t\\p�֬YРPXswswlI*[oeYu۶ҥK-|m{ܲO>$ |f,*--m/ZȲW^yٶm-o `pÆ e36̴,Kjm8p@\8g˲f̘!7ܹ3 K[@ j*˲&M96~x˲>`0 ?G]ܹs͚5_G}TM^w̘1emذAXNNv۶+Xh"a⴪#Xpe-X^{MXCC '777 [5vְ6m~޼yerW\߶m\5k,˚0a=7qD˲}Yt|7سg\ᐹ_²Yf\o -[fY / pÞnFb^R*^666ڥVR+ssQ00000K0&5O€g%'b````p[p|U;&&ϋG9|ݾ˷W}W79g̭4000oa'?Ym<TTQQ^?a[> Oz(qg<;MRQJڝ3c㊷czxs҃]z^%wrs [j&C͕S$%%E7}燃PЄkܷ83=νs Qm+.^4#.z7000ѾK *}-zJzR 3x:����IENDB`������������������������������������������saods9/ds9/doc/user/binning/binmenu.png�������������������������������������������������������������000644 �000765 �000000 �00000013420 11332353404 020373� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�����5���7v���bKGD������ pHYs�� �� ����tIMEi ,��IDATxmWy\k AlZȦݴ&Z5T %(i$!xӤ j%BBPP𮑌xRZ%^dIUkB@bkI'9sۙ;d9s<w>'B׿K $҃} aXzpmyo'yG⩟g;E%:_\cf8z,KgϬ>9{UM;&زu"o̩\MfggWϜjr^x+"3T[$E߾CwEǯ¢5<56 ŧ?SBXvO~̊gϟ}gm\ߟ$.e_/n{mgsiÌ;MѢB!đcO=w~nfmmUD]>pݟ;>I-P}ɞ2mZnaЁ?pJֿ.#?MOpnߥW.~b_ͩw׋?kvnz'O7Z[`y?#xcۏ~_?Bܐl''TDs,ΕG\!x[yջ_;#xolO={xx=W>cr̾jѥϊQyjի}ߔF>wݷBaB>OʹsLƇ{xcmm}䩩kkk7ǣke??ۇZ.zymْm?~=o6kxQuXܛ_޿?Χ>zuOufc~'~66mBlϭoz:Uig&Զwyiלr^,"K_>ZGQ4YlE[zu<Vտ(lR~&宛axxoٻ g~w^/:~O"ڙK#95iJ)#.mo~;^rnqO~v׾9:ܮ闻޷pzG?|v!?tvdm0rs{3[][XO^C-]Wl_t'ч_ze7kO]c_ύx;Ņ|?k9X)m{]TH9Wlz8zmzeo�y{p֩[ܯSS*;)gpw>.{q{j۴6ߑMy頦kݛ=AjL)mworUSm-HԶ-S65Z99bD;jB3'G._I24Bϛr I+++M‚h  \,uG2p8͝d,2H\paa!~hT{F!c<x6T~P7b!#Q}PucXΆJBg‘ {P"U"QM`0EϹ`ouǻP9X? OcBGO>(OKL"ɐ'ؙ((ϴiM\aʩQ:$Xd[p?*<d"d6Z!kw汐QĊ|$T`+Z @,X @`_00lX4|x'\_9ynbH Y\Y\vl'cBBfBH#C+|%bLXLZ }oҟY\w`m$vNHH;~Y& 8'2sOv:.sBv2;Ɉͽr̰ljݹF.O [ -y,Dx_$B Z ,X @`  w91wD,b_Ҿ`!Dn ,X @`MN^aSMBI"Z(ʺN`\&kj 0#-W-^'H[@-x~P B/RZ&N93+$ %L]ά&3@` ,X @,XjW4x\}E:m8v "Z(-;:`rJ-.aq!Z�j[]"Wy8!jucQ7mʫ@YױSSv,X @`   jw:,AE,X @` ,PgԭuP~w".!M~=b$<ʭxOW^{5)8]-J,8]W?IVw'-Z^$Id4șܢPCy`~5C~zVgj\#OI2rHIr1kn$R\_)q6ɑ,X @` ,X @]E+$!(-X @` ,PXXXPP64$a3F/HT3_h ew2#}<T+2ʆ7%IB `3N\`0fvߤ?;xhH`'/D ]'42f¯H/pd"IB&c0(1DEPM-t0�L0!@`  X`L$*uPPM"drY"`nn.X|;̄g}XLQ&K9ӹ؛#D"dh,L+K:  L"idT[$F`CȄvB q.B!C$²,/4vB`L2`ID$ ,X @m/XP6T_BXk` k"do_֊E[,>,Za%TT[|ah =D·$)Q Urd[|;LF_gQ-_$&DAhX @` ,vJTE^т*`D_T7[|3]|,·2ԝr/5ZD de%; ܷX|" ` B` ,P)k< o"d~r,[u`WU|" w2jPi)g-q0SZ "X|r/ s f6D߷X|" ` B` ,P)M`_,uDvU[GP{̘2.qw*Y+[TE[,F`I_*Z N"[|%H3Dd#g 7h43;OhZ+n]TuU|FpL0!@`  X`& 3ZkEU|u UaA_f:-C-*{ah*J ,siiߑPx_ ֝[d,o!E&0$"D  ,X6`ŷSjx}![|}"dbDebjo.?rŢ-_I*D "[|Q-2Ϗr`!z ݷX|" ` B` ,P)M`/`~h*kUZP{̘2Kܱzό1Ѣ-_OEXj,ZTW>@)h9⛋</c;ZkdxP$ŗI$-.n^,%@ }@5B{,T`ID$ ,X @`/]NŐk"e.(;B`*IO"߆ 睢E,^tAiw�Izi 5.OXNEXNC":& iXX[$IYn,IL?︲i)g"I cB~I(/(^$)ɹLEEq»H% &ef$ Z )iXHXdL" A@!Z5:Bȅ:-VVV"Z'}f @,PX`jjJkԲ&eE.({aR; _IȲŷIY4,- Z,,vDjI_; %ZZ|aRbaM"X|DRV0)u;+ŷ¤F/z; /XdL" A@,X @`jX|; -Txŷs+ѡ_Ы8'"hq/k<'* ?o.7{ω|Z.g<'*3+mv(20QmF/sG@_&T2rY| w>~NT #7Ӡk뜨/XdL" A@,X @`jX|;-ykN[:"Zؘ0>TbG;t V=E33v2M#‰}Z|艅̄QVQE g^ 0&Fo&>)gboM3K &`'/ &A1s#=Q {*gr(k\SN &uK/诜3ojng%_9fؙu:ױӛޯ+!ZdČJ,_&ǘ, ,X @`ŷS֯o-20>4~&[k,2p[[#䊅__kFX2H.;B)w*LF/n+r*aB]Ly+eO"Vu7 y˿o{ނ{,ldĘן3"|E0$"D  ,X6`ŷS*oL?Gَf&-C [;: 3.dx_-]nG o/X,,W 3[zG(;52n#WT-nS7qq ~<RzG5}>SY|3z3yt d H- ,X @`ڀN*"edȂU|h>TuL[|{hGZ,v\k-ǐټ"L2܃y+iإwSN*&=3ohfTvm{PɹEI*-Ut\[[J]; ud2gw#w d H- ,X @` _;"߀EB]Pw}C  ,X @`ڡ~{"�K{15WqRv@ǛRA3XX}lfVy/ym?Z=2L{ȑO˪ "vE Ɠc|۔[4^SQHk4z!S$8# [u6jُĉUUTϯ%u9~f g7g'EBGy$cn^T'J[بD@hjGnO-ySЅh1c!!vtSS;ID~-3'%-=x$2̄����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/binpar.png��������������������������������������������������������������000644 �000765 �000000 �00000020246 11332353404 020215� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����^������bKGD������ pHYs�� �� ����tIME"1g�� �IDATx{t\}9Hz!~@M Is^f%WI.ܦvծ$m +*ѽ]4F iM1!@(`%?d%ٚkc3蜽͙T*%ظ�t?›܋E�lg6ܹm=8E�>wp7�@�x3@uڼJ4=5}졗IuuuGmj =Yz�bj215>~u<tHʫDB68yv_ֻ=Ϟy`(Ҥ93544~:&WmTd*Qb=, TU[W[+&"+?7]zg_ioCm5ut� $I|^=%'gN\ػaEyyB\?u-z_w}'eYȸU%�BA~ς|KskH,u7^'**mrcpHJ飧EpnfÁ"[@_fU3=ܐkWo9Ń[mΉ"[/f^LOi]ޟŔ"¡hsTkd[~Pϙ7]u! ~}H/RE/ACN\h͊}9a6=yn.Yv\Tb<P]k2}|fXGꆛs}sw,|^^K]h^{O<BˍM3sU5~7o:عӍmW?,}o|!c߽6SyٹYʶOh[=gF&n߰W{fUu}q 5΍K;qP`zv>=Tv-BvvxnLB^k~O_|uկ<񽟾LMm[6\=5Ŀ?6O !~}Ot@3J__OlۼY^ NL͜^ev7}Iɓfޯ<7>�e>g TU/O BeSlJ!yzin̑,}ඍ_Go}b {fRd!Rϛ7\Éɩڗ[.gS%n_Xwo|$+hVUQYpkӟɉDCoO>ivz*wxD='4DtR !5' TWݹd2k%!/rK~sSYy+^BGwwD\3JKjX׏sLJΦf%pryuM?�i^/)2z&]>Qdb(S)U5~7'IyNJoٹhfgg:ۣR*DhSS%gƚ}a?XS]}"L&IG]ge>9yةe|}GbaS(~j<y=o{|▆_xؖ[-i z-6ԇC'w>#UMۢ+ֶ=7lko9%{}w)i]btlxⱧLM$MA/{"YR$IΫWZ~޿Gp mUyʼn#g{fT5驩)1}a¢%oWg?H$5/'-hIzB;=H9O ! Sߺpƍ<sa(>95}SϽC5iV]${KEyvAkUm>y-z){5NΦGOWFfeNOMDUBexL=/oUm_UҸ@/Ju.[jb`h[>Zsu Nd֕3,ݼ_tݧ5'ґh韛9U7O\Bď;2:Tr]Ckl.LdY󋱱iuҹ9o 매R)J<e\B|$!X$4(fʊD'IvA6z+{3C>xb|,˒$% OCwkn[ ezƛQT*94B9~P|tnv&%IBY@p81RQ%???=|~aCG[״>yݥDr!.MduI/dk% CK_g#b?GHBܪ['}>X贈Mn۸ĪKdY=v%:_[G'?51+]ޜeTEJH|}m(˙,=^Ys|9"%?4<ֶC|X4\}&g^:3z)Ujj'&6 !GFb,d|"wFz){9#|"'e=uHo67ZGꗬL |T*uljgf>kk5iNel+Zs/eӍsdF5sLiρW7_['ff#L)ttjz]MlX`ltp艹޽h蚫^z)U%=41/_DY3)29>lWJ7^0oFW=6k_WQpz}=KF-bdrmsss##GC\^_& T՜8WTUȉݙ VF[Uf^ ᚚމٙׯ^o[|W%]H^eL^<{bz2!˞P8:J%/8yE%I6LWNٙH -m^?>?1>:3HԽ`]ªsCffH5,\^]`͔']'fSɤ,{pBC\sWL_%^sTẆr$<Λ9迼>BئG/. 7||%y<5꫗D T״R$!I#͋pٟkMPE)dzĩsW/m~sBUR샡H"!t*XdiqRʺE^Ox-UBdO]"pJ$)%ROxj^o-^JEU5E<r x}^ߤS NXesU4~c$b ^_@]n:|bəљDvAMN7i~ԉ֚<7,麥SzßGJr[UI6伅)[.[pyLP&&Q4+jTT72;0jNrwK 'feYM@U&"M68ذb#`tpUM?*oų'.\[xAkNzS V2dH/saYjҹʫ=;sKnU]\+F@Yy5(%Fb(�TP8Hҿ��ߕ#%�`l8fե8O�փ�J��J��J�]{h4y<Ob%Z3W̾t̞+PL U@jĜmg%Q%|0s-:kh4MWI%Jd҉(LpGnvv5j>]G2utTSuX,F%,\L,SԼ5͋*"͌Rj7S%pԳvD~sY'%b|b 8Qd’- jP8Qa "N4/+/ -k9Ctr2y9-򺊘[+좖;Y{)G$"6 g:MY4͙fVK[UL^]#u v'';;50Yǚ5l}k�p ��%���%���%���%�� 4~~�2�J -fg�M$~.�ų3���P"���P"���P"���P"��KS5hymԙ]^FYrs9z+T[dWcDd,8k)eE&`h`%'*4w7ʕDBLiBM&kq2[o3.nH>BpzzSʘ)>U !7_y|ЅMf(>=Iee!3d͌}ߡF5Lm ĆO]4;ј|/⎨ E>ٙ:M*q7)ܙ9b $ox8=x$(yV̏3&E1R`\YC&zV_qA6ܹm=NEX�*@zP8:wp/q"�p ��%���%���%���%�`vUH$2om(�DVى�O.`;%wXF7_c%3VB`ǎW�RI(]qD軺rj V2c%�A�zl4;˹לv/[LniƭFP6t ?ew(xonSRt j C驼V/8lަ-ܬ8D%gŴPt 쎰l&|"Cv~J]eM 6+6xdCɸ"C0fmG5sXS PLQsG.ZH8ц+z1C]ƒohΑ{4HidCMCaEIl$4Z֪'u �D��(�~wV,k5 J0\v b%Ioվ"JP"<R�(yD �,񸳖�wD��(�D��el}l,o lO�DsWD[FdJ(QE:ܹ,?23J%'Dv*C$1V"A^ZX<DzP"�\sS&ZLh\iX=#hN'*YQ^cOz\t i Wlew 驼Vo&jrd54nmAI,K3qvGPO{6hJ ¥T]Y&eA6ڹ׫!9pymnt*) 6qx@(颉4mheٚS'G1zv6A6ڡ%6IDf'Ҝo^�p NU"™�n©@�P"`MB9;w\xq !VB!ZIGGKb%()�<;c/�'Z:��D��D��wg�8Oxi�*E�TH$]D��D��Ji.U6za%3V(x*ҨXɌ�%* ި2`%|B�P"�fgmӻ\/kvQnQm`h%2.젦]GV H3h##%B=oJ`(CN&GZ Rwk3`J}Ts6S)$8OգBJPO3SQ k~hA4%uXD8QEf, Z~^b%*2ad׌X Diw d>̬ü}`B3b]y-3HT\LU5ϺITB+y3jfF1b͛V��D�`XH `%'VJOd1I��P"���P"���P"���P"��F d/2sU׭Vt;uw{ƈD.y =4׽؎ozbD&Lb;i\uS^]q!'4[XrU8A9Cgyg,*~DBr@4V Nd 4w7%zǷ=y�Jd#Qf Q$W7y-BAkuٙ5dSz3�J>F�@՚* q"�@��P"�@��P"�@��P"�@��P"�w#F��@EU"�&lW_D�`=(�D��(�D��B5ya |\=w�Jˎ; צ�l5 N�փ2;SB2EwRg>�HIFFS.�@JCQ+oR]4=82Ɖ40I!:b �8'R'̼2 G%Rlj*#20O*�P�O3NT*({-@8G�Z$@Us0;�@��%�( t}"Vn'ח�|(r]�'���%���%�m�z%bT�J�P"we%N�փ�J��J��J��J�}(dX6Й ZBָd3EUʣ0ia̾Go^>+}O{l%CE6IEY;ycf72]o|04h4\5S{I_%]%{ѬL&Y& {ɶC]ŭ}={\3Ma'J! eҵd̞笌Z-$s' r1w)%zRQn[!f*!7%FO3X8v9s@r}uKs:aG3(*6TkKRM&F3ݴp̓Ge40SNVe\bhy//|kPyy֞Hܶ{O 'Fb"CcoG^:˯=�ɳ3�RwgN��D��D��D�>~D歍8�J:;;1]|tuuE�lDΝ 9yJk%]vt+UJ(QEqB+fsJ%�A�zU-؟JJUel;�J�(��J�(��J�o@2a ޔJ(%C3�@��P"�'ĉʎVcMBO0̯Ya%|"( ۀ -.�>Q<gp�'�@��%�@��%�(#xE�W"^JQD4� lW_D�`=(�D��(�؁JO7 \8p1,>cՠܚ+:t?7\% O�փ�J��J� =;FBX,V}b+lעp(ѣ(LFTxh56Jݕ%`\PXX=46/U=.g f<wlcj41)DW̷&>Q |~=iOib\-$losZxF` "Х !CE7 (Q1mqӅ9 ꨜUŕΎyHa{w)vFA n8tǞv$jiM:횧3ʔ@{-GdvfEW<�9=yΌZ0Kd%l8XͿp U"}� s5 �|"���P"�\ȡ0 K0,pDx[cX,��P"�@��P"�9ʈu$(�`}q]�*@(ZO���'IDATO��T'�`R*ڸ�;9����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/binpar2.png�������������������������������������������������������������000644 �000765 �000000 �00000020550 11332353404 020275� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR����^������bKGD������ pHYs�� �� ����tIME/�� �IDATxy\}{vuwuUW-- !!h)`0&FȎcЙGA#qg<8''gr2c4 3`a2j##n--uUo{Q(^o{}{^+R)!-��Dž޴ m^,�gO<m[¥Q,�̩C&�XJF'j PAjhh;1oVD|hة~�`S3B@0dU^m%}yƩswl "-ӓKCgbuFEv�%:;;y@MUyHRJ|`"|ӵWx~|mN#_z{7hk+�X$IRހE)8Qm={}=M+-kknrk ; 6߮?-ꟇG'*J$5]-_s=},7xlzbl۾YOD!!D*%&g|=gBށ٩3'"<^o P| UBLz⹞vj߸ <_i<P?BltNyzɿ?1d |"@OM4(H,E[-\{${LopiUׯ\_O7=${"UX4e֬X߷o_=1/Lݦ#'.NLjM@ѳ3 ؁Vpsμ}?şܥrWZ1g|!ҥ7ҍ:_ۛ7Ҏ3W?,}/z,߽>}Yʎ~h[gG'o߰fUe~syc߾/\j͟vn%-|~sf0?[:H㝟]3 !y }?yg/}4Ծ~j2BDmpVs70B|O?#/?A͔*}=m[~gy}(89={f(7?32>Lo?:Cٓ'ͼ_{o}i|ȫ(_Vǟ6RC̨-!#YmُmA!=gSdԥ^!Rϛ7\#:[.gS%ݾH_hW !&F./լ.צ?'SShK=ou;yUئLqѓ:I)bל:;X[v/~3WY -W/cϼwҖ?Ax@_|tBCO>===sq͔*-O~?3/>miMw6)y??KTuR$ɔNjyIsRzuW?GBW|677Rwܴ-G[r2.}k7.F[xu+d2Lz<W>-p謹O7/{??sP]] =o?+4K"(o{jjwR>}5=/[n]%l5uwXܸ-ًyݡ7ҦuB3ǟ;=^Ļqd!K$Y;^iyv?+dhí+N$=;7||%OLOOc7/1=ĿwV_>Ou`"|99paA[BޙD2yʸp]P1pnHHF&4nًýy5?֯5L2G\ԛGwݲlCS\Jq@M}dN !|>d4\#XGdokG5um R*΅7Xw5 !GI5WD_a]9}8{N?uuD:85{-1jKÿ}^BїwBfBKnhj͇ɔ,K ~1>>N:?? wT*%RK&ښ䎶&LYQtH$I/Goqo\qvpGHLWeYY(npmVLW/xs@P~7J%BfS: fS$%I G3z)UxӋ3#65|n{M{]J$TIVBKyG[2P:}N}<"ɹى{$-N_ kͯu+X趍nHZDٹJF}QRXS%wflb3sYѾچ@mX䑽O捲ɒn!%9gJ!EG;~\k_8~Sw<vV/JW-[=r|`rjfq{bdt|4vaA2I'rgީG3bm'țnzRvHmQ_WO4.<9fS0|c=}qɪpGKROhX|hfv艁gc- &\Щzv|d㊎_<+ont|2Qg\`(B{፝W[gf#L)ttzf[MlX`llH^޽h蚫^cgz)U%},1K~/vkz~+Λet/d7#C?U^DBȁkn˾X*ط~uёږe7pO29k5u'"ռdUm8rPOų'cC5ƶ@͉9WBnortxnn?çwƶߕ?aIW5Ҽ~AL%.;93eO(_JMWԆ:E%I6LON9΁HKgOm^?>80916;HԽ`CšcgH5-\^۰`Y͔]s'ggRɤ,{pBC\WL_%^sUБr$<Λ9xo}"͌]Zx ?Jxk3W/K?>1e?X句$IC,GZCt?E[HSz>"u^ve^+zCEBT6ٳ/*$(e` -!jQ/ $ɞE$d#IRJ<G[ހK[2% *k͋d+y~I^{#%ϫ8hf'/MĂ`mŃSSS3c`zJG[jlkY?5yJ/ٙoXvuK'gz~?M4-nd YTmy 9Ra{c7x}udǷUqP3J^ǕٙYWsvvܰ[jh<9?'˲7PnljuoL%&GCGjUy3G.;/kd7==`M,M6r?1!˪ڳ3׿VSeb ꜕WC>Qb4F@e*Hh,{q� ]1"P�ե1;&c&�(݊#D�`=(�D��(�D��(�D��(�؅wpFcXT,V(<sKY 9,T[PYFvY+_Qw3עf!FQ;| XQ ܩD&2Ʉ (}fgW [ӻӥ~D+\]Q7MQa@=l^O,A._bnT52uM[Ӽ)h|/家q3U WPA=m7OT9޸]X1>u[{)7.V*0P�J&,jҠ {Ŏ֝!DU1X|Qn_S xA,*b&oZd1J34Ef, +6grܚZeg,mUV2yuf*^U*K۝\Hfkl^q1 ǯ=�3���P"���P"���P"���P"�-~El��|.�V*2�ر�@D"إ;;�xv��J��J��J��J�`)ނs24:?Kn.Goy jlH]қb|-cLH D%s3C^B2\()M^Zd =NfkqmՅiGWh>YbTOOrjY^=2gvr;kX%g]Jnn2$F1)leL*d.w )Y&kf5\\mήye*hsu` 6}މ[|7wD] g(rQ)hRVS^I\c'9} 8D#$G1ϳb~1)͎IJ+GҬL2ѫZy~@p維{zp$1[fk��uC@_}ĉ�3���P"���P"���P"���܃UA"H(Q� #�'N.`;%wXF7_c%3VB`Ν* f�X$.c}8"9+yXD�`=J ۺkg9Ӹ ؘA6DJߟBbq4f_2HzH6&+ۗTRN8ȆD gӕT[6ѮAYre .n2 ʎ@VZ.{12gP #@F펳!kla@{4HiJlh눵}Qg(\NlrMi. Slȯ=��%�@�.5X %r\ J$ܷjߎ;X+9@Hf/�'Z:��D�� q"g'1OTOQ3VFdJ(s`S`ϓP" wwwdJ!b �փ0;+%ܧ|ִbWV4SƆ(Qɍ9Vt h$a]wz0ߗrA6'g8Ub1vnvxfbY4z̼ 9ȆD�N)5lU[12gِ�rYhC5:fRR z`ӕϡj7q >;!lDĪ[ �L᾽X+DÕk !VBV۱cKb%()�<;c/�'Z:��D��D��wg�8Oxi�*E�TH$]D��D��Ji.U6za%3V(x*ҨXɌ�%* ި2`%|B�P"�fg[$ekvQXbѨG4oARӀ.`RqQ4%V"uJwb$S0c V<Ϛ)\iv@}P{d,Sh WK\A|ybmP#@f$CQQBŒ3NzRߵy;TX(0Xڡ [֩"z\c;JP^%Rljw(2d.)L eQQp-\\tzgwg�%d;Sjw|YRxZyH!Fم2!fJyz*^|I$F5ȷ͛Ikb�D��(�'Rº3X ,UY kc%'���%���%���%��jxQ?e}e-@9[�%r?Z]@\g;{i{Y r\ B_\q{&\L_4lͪ5T �rw|3(*q�%r XV-0SU @Br@4V Nd 4w7%f:AxCYdT {>B\-M^KuZ]1<#`vfͬ@uv|3yu)�%Aww7F�@$-j�B�P"���P"���P"���P"���뜋�]0 �TF]%V�P"ve%N�փ�J��J� D S� D;S�eΝDkS�g'�A�z TY@!;]�J$$#)V�D!㿨?]7inp�KDQǤu_�ݓf^Be�Qqȇ TY>>J;b@D9DgsPJ'L&6Ξ4��J�(�@IX�b__�v��P"���P"���܋3^�땈QR4*@D"ؕ8�XJ�(��J�(��J�(��J�(��J�c@g6hBk YW*¤3m~y݋.(.&Kًl⋲wE% Ucf72]o|04h4\5S{I_%]%{ѬL&Y& {ɶC]ŭ}={\3Ma'J! eҵd̞笌Z-$s' r1w)%zRQn[!f*!7%FO3X8v9 9>َ: 9v `} )ڒkI G7mcQD9g&̔SEnXkZEkދ #;T^'҆;mӃ#غ0X;GnѤױC}k�p �TݙS��D��(�D��(�D��(�G"Q<�YIWWF�OTAww7]vJy9^I+ྠD;|}1]Ν;RVB*ZD"J;*\VY)kX Jd/ك ~v=ܩ!Rq;vnJsr̜I/ LWJN^ߋfrej>XɼW۞Zn9툇 0NΔSrPZnSMu4(Ph"#{7RsprLZPt$9+N|f-?礨 SwJyrS^?Ε!49Ͼew:&^wtzʐɆ/Yu\9Ffdt;7beeaQʼc[g~ Hr+®_3fl*8ymZzL~vDnqǒ6jo3阝@�JYܹ󩧞Pfcq ~I}'9jƽDv}V�X<;caS�'�D��(�D��(�D��eDJKC�P)u�D"K�%���%�;PfS֗ '2'R{ Tް[Cc@.ga�zP"�@��P"�@��~ghTYX}b+lעp(ѣ(LFTxh56Jݕ%`\PXX=46/U=.g f<wlcj41)DW̷&>Q |~=iOib\-$losZxF` "Х !CE7 (Q1mqӅ9 ꨜUŕΎyHa{w)vFAx���IDAT n8tǞv$jiM:횧3ʔ@{-GdvfEW<�9=yΌZ0Kd%l8XͿp U"}� s5 �|"���P"�\ȡ0 K0,pDx|ǎ gO��J�QF#F�˔((�PBᨶO}�>@��R-�`==U]����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/block4.png��������������������������������������������������������������000644 �000765 �000000 �00000526125 11332353404 020127� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIME�g�� �IDATx{ty/>DI)Q-+[qlˌaFq6N'sCW+0Nz۪rlʨj-(:NGZlW#S%хЎ�đȰlzQYfc!H1�3>O.p~ `/~�|DW>I`0܉>;/~˞=ß|a0 ;kf3#> Y" p3 cN¢<?w^kX.^y͛wʕ_jMﵼVko`0n .Ղ{_d~�-պ֚G.[/{ _}kNkm[d7}cot9`0\XI] 3?Iպ֚<Filn9׶<{o|M-9?:lk`y*0 x<.<*cyM?n_##/.\ر|/]?~_{\= ||/=bi0 1wJµEX7v5pء.�geݎTP_K:.,j5:sO>?ӟ;�N 5]7xc'oo}粒�O}_nG\6vR;16:snЯ,ko`p@ʎڿyvٓQ̵,:Xv>W[pk[]<%y S߷}ر#c͹mSWyDW�na^}-�?P.ë^`о7~gOϚ"䀜"`Nkgj{Z 4`0OXSa2?z&oJo}]kcYoyqs z='}߻p[oi֜ `s.^{ۜkln>{l}f� oܼ_.X2gV'~N�~K{kj _`׾ox|kzVv45w7O -7{xڵ?Gn~ע͗\=t?7<-lW9j-9}}C[e} _?ω#GO:>;8o;w[gjzcYs\X𦎖C'x+ ܌UJoGL=binyٿ c,n^vȹWs -KǼK;.^tq˟N}XkK{CCi5_-hozCgS/׿;}᜶?;ֱS-liIC~;{Cι?m}v MgOh|zίsUsf5_|n�gO?u뮿aS[R=Ս+=V͞<ξ; 07/ <wg6}7=m�]dqǒ͝ w-=sۙ Fu,X^{#9k7׶|7�J"/d\;wZsM^8jݾ|5vww~�xyY:Ώ~z埾;ooڋs[[�\x칋.z} ^n!g_8wF}ЎO-H|{_}z[yǻ_=<g^g3g/miɢp;o3?/Z̞}G&R>pG4kN ^_#=Kgj>qJ-O546ͧoF�g9ѓo:Ds̎-t~i�䓛|9m›`0!/)\x8nؾ-Z⹖尡J{+'qy"ӹK.]x9~܅*?|pݼo,^س#Yt O<ކy=}+ϜiYO�N9{UO9}s^u�<|dܶ+F�K7<=wgY⒦#oau7}`֛?~Ύ3IFys[Qx ,{3|;޻e�ԞҾ=u.Y콳v&w5xO(UJ?$˞}4, X6TyC/{=8Wzs?:׹w_2}@ ;{n? {?H?[/߼tJSoG{׽߼s\�/8WI(W^mlnQ!ܵ߸7y|gϝܦOz^s;�\7!n8}8xԙW.r׼ >� �o56{]/k;_:y{{ gShhh~W2imzy0 F^k VAk#>hx ^r/Rx|ƅWoYywQ759z*�~CkWzϻ| s/'e/zر??폭Wyiox駇 hx9S#^Wg^X86+x%/,U7N}-/~e;F._=Ύ?\<ͷ߲T\uӒ|OqKK[ 6N9w ̞|e,;7`0&=*=UEX׊1/td01veG~1vhn9vd`\.k?wtמ|?pzo/7x^$(yT-7v/Gȝ7߰}oo̚3y<=K =?prKs#/}n \o%~5�.]o{Vt/pK?=i7I\/^w;3^OwJO<u׃lmi:sB/=iNq[5{VˉSg/}-Y ̔UdFY5S%A _Gk1呣ν -=^ak׮իWOk+g^̡׮]}W^|ܵa֜965}҅s-;Bx쩷_�>~vr>_,l_SSsk?yڵm ]p?>etŶEK :OVW.x ކVS'rkKoZ`ћG~y^;ym=Kw|M9 ]5X2k\ [?3~Vs;+.˗r׮y ͭsKg{^k5n۾yM 8}|,45M]_˳W::q8 ]+~?zPDΜϳ'#2OCõ].Ϝ9egO7oz}m^v@m6|͍-�[ކV o5^l{<^of�-mjx-Z2Oz_Cf:zx@d2kl<^_n]ι˾V6[x}Ӭ9ǓCn^y^:zsܫW|�fi_xo5-ڵ >IcS`T@2k-|,'J~bϾrn%ج޷eĹ#G/\p3ϵ̽ӾhkgMG[.ljimR]/Y6oA}M%s;y\[e| /^zqΜXzx< 9mC2J̶*`0 DWkM*['g ;rV;uk埿yV˜6/; F҅s9m29#9ZZu8rLv\2{磸oe# F]Me2?-YsUպքw=fm5fQ:uNm]kXcyD  8#,`|f -0 åعsOzƩSXL .LGXb0 Fm`0X `0c1 `0 f,`0 `0 F%'Tex4CVnC 6Wv+;`U]VM=%LQn<9.,l-V7*9krZXʡym tv=z#,Ћbɤ5!sU5ӄ[5 uRi{V;+?Q>nCc).'W1(,풌IS~tɇHؽ-n,SeA)f*ki[!WS9nQ]̲%c7qi-9Yәe,8)iW3J8 -fIn9;nj/I_1qMS4]D5dh)ghJ 6IZ^6|4d?RTv }Ʌ?!-MK4; kVF?VŸL]BߧU`h\Ω{ EUW ?7zZ/g893ky.2#s]JиM3rP+ͫWiɖ^iASxD_,ɁYKŻg˴*oLSyCStU>Ng,TםUm;ZLD854l^f|` s^ܹkjU軖]ظvh͖ry_cgX~Њy*Ӫb>sUҫlyV=ß|s<A`0X5֥j|j~ؑCgib0ՙ& 0C`0 DzZ3*cp:mf`0f,`0c1 `0 f,`0 `b0 F}b?%`0 :Ν;Y( p;c1]1 õ0[׭[Ba0 gv[X `Ԍ(!8p3ؤČ0Y ;kU0n&kb0 X Qk %2NXTY8.919|iEusnOiCiVS㤄Q#;s[ ]KJ:�rVBn198ЅlJvOJKvq QO;'VF1x<,*΁^F4'E+ӛAp]đN'[.˧7OΒTDĔ]M<vj4t"4⳴qb H3i8YKMuS7+=)JN,ë2ΖRɼTrݔuYw) ?YUTCc0cMSdLS8fM/yo9ВIUJMbKG8ߧퟎ˺o9%~/jWJ.M&r3'{iG^1eױ/u1cVH-)`Ir+Ƌp9d'+Y%a~ȡ*~,c0c9g,fbtXO(b" <M?MOv>x L8Py Q/:Q>Xܯ=60] f,\9Ӗ̦B3cZl UT Uعs' p',+024�!Seb`,+08@Rg/?3 P)h!M?B2U VX FGӕNYo`b0 "d b3 `#39=0Xp,捩&Ϯ?v%t-%xv.a<PVPpJןBHWL$Yh�"O<:dkQ IXr)B35OGIqDE C$DiB:$rd'/X*'L3LR뵫iV̬J,vDՊ,0_<&͍g0j։H;�JwPuJU7PQ nx?Ix. ~,8L7 E P|TɮخN6u널.ǰ h)=PSON7^ɧ7mX^nFlI3Uj!+CHE<(v7"BDFĐC M,dƚʢQ2/)ծn/ZߨlIa`b�BH?" t ($_3_;y*fOn<nJb['ƂEB�3OKXQ @^.<T<X!$ɮXgެu,58kZvg 密 �"H3jZ 8 $QiQ}^}C/ a~]?c yqgN&EI i<Quo�S&(a$|GaUF~)Bo(IVIJvf 竊<^zU')(lc\xA083$u !L`F&Ai%8K`Tzu(MV8z?\_SgKXla0ɣ.R{u 霴8Y6+♱,q B"LW� zȟH[Hu1zE7G=sj9Gc*;X ́p>"`8 cO+4A]t<tA@)FO<RW`*; 1Qߘ/& ǶG\h o%Kf#m.& bǣrOp',噱6عs' ֭c!0jSJJaa|[hp\!뻉q `1 :-![Ҹ 4p)5*d2 :!{H@ĥ�xxT )ED˥\._Ìœ9F( .@؜Ѐ)IU*b~$*OrG;,yd%,MtC|JŐya]JQ`0PcBHǰ>Aʫ$CV:A6=GgXZ!>V:S�&wD Q0c1 YǮ "C@@)&^9_)t]YtmR@-d1ҫm6uqUNq]OXjQܣԵZ*c"3EZ^<J)l"J`XߒE cqR@R`A"GC.~Q�:tld0fT]P4odž"ƴI~@6EĖAl,VKm)%n8%,X<fKa=T 򲋄ܦ¯iSd0 {@1 $5cqt)@F^.` ]<B$ b8�&h5SWAƒ%bN5OZSԱl~%9"Oj >tEJBc+r/p5?ňuVJ*zJNz?Z7 N8` $$E G "gH[e_1}Z�BH&&&#`w:MĔ<,ܽ _eWhj|v3 Cd?5GZ DbU}By*�� �IDAT>i8/+s)t zf0sdm8j=cS:iL*g1 BW܋Gh׃H UBMb{Lլ^1#%:e( 2"LZ^yA !Pa0DAlK %"! y�Sf�!SIݻ"4.ړ39Dc鸒"( Vt a$kW!:Nˎ409P7tU1IT 66¤cљ)"#ΡoH(ǝ4�=BF9 R܊lIg@Cx Ƽ=Xۏ][XjǓ{4+OZ,yHPz0hBB7PFb9*QpWcP`?R*JEO+lx gCgqu&k c`R0 V Ãf,4QHxs_%_c"QE{<(vx<Z1tFb = 2 Fb�[07a)qOyߢd-@w( tP֟& Շwv.S=|c(vD0 $Adz0 /'ǮQtm55;4c1 I)L!$E='-GbQAoXtCAd(\P^<B։.R2nv�Gt9M^AlǮU؟E`]:CCC,g=+:BUW wT++7v&$",DA" Q=CgQt ۉ1tbG ;p| #ً�yH$_}ZČUvpBլ 2qt"ɫGi̺=[}XDoy%j%*$#e3v'�Kmdž 2YGѵ�s~]}+q`݀jG _1c;wd!8`ݺu� <7SXi2HimA fF'ڽ]lE|AFӏ]{@F$/"0�"㫱o vǰ~pi7tUN 2cUM:um lMj, ۊcȧǒB/ # Hq  Sx#| O=c�Ǔϣ6pV݅~2 h3Uo\<@.j e)~Alғ'�¶_Q^OTA߃c #Av1t&#�PH҃XE%Cg�,t@v?bMc#E\Y+ȨpeFG%%!=:? ;f/Ǧ#5c*'l6tx�8cr�.S;m Kwb p{0$V[=+q#/uBW\NQRK$ uOv!gWj !E (c~<00Qğ##"@Dq]=e+q`#+q1<5XkkVtDMkWhŮ$ 5۝brhݪs9dSjy[([EJ� $)FoK( q)A>]]�" J(>?|=rb|'v.R@X,?�bW!Nv 䡙ڳvrUe8! yA#v^+QC^rBT\o.GA&@�tx':p<@ذjGG'Ǝb:鉏<d??4 ۅ8A1<~iY9cMjY7SRqRZs'Tݪ*Ot" _L5|v*L~#9$}�C뻲(DC6""/6Cjt `A~s�!l-|i<EV8 `Jg~tcUQ i<�8yT0lq*ԠUp D0;U4=z'5^vުL\"7aN@s혊 6OD NtKKM A0\@lx1슢{/9_cY7OQt/hY8:c!{sGГA0dmGҙˣs[EW/4yU~(ʚ&jԞ+z zScs1G{1sh;1:˹<'u Ee ֭m�dc`cY֞xuv_j�g5u z.B4DbMGre-PƸeRh&J-P@�-^B$ЄR%,H�Ϣ`$:y<'FYǽ{#qpN?ȡ58p�+'� Hp][itߍ0H-�۱V+FBEuF!Ƶ 1 69\b^(_?tn57_ЭWN#@V":ґ-ǃ{<I�_E|C Ş8x�+jۇգRxh5uat+6ubl]۱7ѽ_{(q;6LCwy%߼0:U45q'(쳪Nc ei ̮ zhB1@P!$)Q$H-qD %z$ UGل)0R~xCG&l݃YȉEQJ7?_,Ҏsbs уMp'RmǸR8Dl0ʆdi̓Ÿkn5cԄlydC7[{Mw&kuO͆AV}ܧ;HӒO#g ,x&�~ݏ1P% "@~<87}<'A |WVx" ;p8:1m㹗"8l~B9XkG@/a)*?C_ɧ;˹HOYSG S-"(X]JTUSjҮ @OR7)Oߎ$%q'vۺ0 [b|`5]\}W6Ǯx9>۟C,dF"5ZYɫeյ 2 Fq,~ �h5dCH-1i&h%x ='pF1NHcxn>`_yxn= g07,]�6:Eר`03h;Jc*B3z(|w 1E|GM3WDl$zVc_�Y裬EZل xauFFѕ@+8"Y"^}ph�X yi+SfQK[EIp?BUA U"3c\�0kɄ#� _a$+qB9Fu[tMc-AD T.:!"R:ՅQ>N�~v{~da5Mغ`eF)tp 1[l߃d1 akb0ز誕#XeWb2:oJ"'BHf X>CW˒tGA)VLaDZ! @/e8<g /}XB F &l4]BBH;1_0c vBpuxxܯfzU:LT2_"D,n)Xbq f Y~t3A, OX8 ~}7^(<HVDʎH*b~:(Vjy\>@.QBHH L3mhzV\D H̟ѩK7Iz ـ蚋3OqOqRؾ#*9{gx4=8"}Ʋpwx`ĶC홱r [�|Ad/@HeԚ C�@. ~Iiס AdS/aX9i�XȧA{z0(i߉d|  `KX :]QB+`0NLZ В Li(M$Bc?m̢"׻s�X' Td=jɝۇq(O:cXhpd !M7I ?X /Al^ g ~o'` fc5##:!Do#u-d,>U�V&̀gqe`x+6^'HLlTnعm6ag<u&<[Iʡ1VIACH&�QCHч|,NqRGНЉ*Gd 5b-BHkVO<O[�Vq/@E`9~0m4&=l�I"<b%#Q?VA9sIcO|̄,yHY,r|8.jT y*- 2"q; <,^/E@;F zX1-H{]@v9~A `A,s>bS s(#@6ƧيM ݿ;oծ8v]*Xֳ%X*~,t(0Ëj(0*cQB�1DL(zĤBc{ H&8E D dFM"  2iQvA�Nmߘ38jt(-wlRdS]>!MKpZIgBLWB H !E_ Q;w=DH/@'F3-#:ƥMd6AlۅbO�qRG8,/6m,7W"πJK*YR,&٭ ĬPU*\G$ ^�$-黀5NBHH''m�~`#$'ViݏE( @}Q# /p?֏Re$#n0N2` 0# IRŊV5/djM%eSYgI?3Q%EƗQ-n{THi2lLy=)dHE(]H~Dv?uL$"B\#d$l}H E<I[96fIͤ&kbvK Xs�~7" z#t=nIYF+cǮ0a$<.f qDE5d^HQ(8: 5fc9OO|%8 σ.|rmIGaUGi@%b 6wE `c;1pk'Al/vA -n"*/(vs]c>K0Řy,Zfw&lʷyUCu,rܟd|#Q&cPזr3ِ$t`!H{ӽ_ Qte#Fi w]'zf>aZ/2{7YOx,9GTw*FJxt-) $Xqq~zA3ajg-l4D $s?+kQzF]E) @a)t-a�TXF ؏QP~y�~LҵV:+C ~.c1&�TmDf Az\?E'Ryl`cl Kv勛P"롌@\XOnŦ=�Al.q/1cVGQn'\߽v`QO8)pB|tTҳ?IWa<afx<5XU u,!R\9,ȳxi6HId +EmB;#JЪ\1r 3,vkхm8#t,!t,B:xIA8)4@>n1zZ=R$ mtScb8 [H`pe@�=AkK;2c\Qp>E7wn'V~#RG7@FĬId@  KAd(Zل!`i0xۀqDHbGxp aƚqعs' ֭-{ |(d\YD-éO*4E#@LטN9!ɦGGO�xeC'(v bCxC�6=Bl*$Dra$cۅ3߫Wr�r ɧDzWTwXLN pJFY<j��]�h&lBۏ`-xdyFCCC.a  t,*-xKR4)zPlD R!xn qKq2%a>ގ ٝ)D~]t~?:xc0IX0nwB}Q_6,/ao]g;16-Y "# @�N 2Q"Ѓ `0& MDG!$ @S:1{$Hi$1eq� !@#d!b.LlMȤRR37:7tݭ,;*~&պG^}*xEZFc7qۏ6a+Uk{q|ȐlgntG0Wd}(^XI@Nm,x’(vUhrފ1-cL{;6' #`Hw*T1Lc|Qd# !Gt%36Oć!&GwAӬjyf D0Vt]Mkwf]8@ͪYnx)+:Hd/p�ٕ8'!r_l# Dcq,|y7OQ\&\bIhuԣٴ[y�1*�c3m"Q^f9}{ 傞p�@>F٤,3t宔 :/kbmMEflh2V<@y/1DH )iE dEBR/JH5CHGK[/Y+^Ye^ݼv8gCĨ?܁~`Lē@tAd?%, EH�DiحEI=Rn꯷^Z,*<VbT +B "=)_qrsWZd! 87*++0Q55/LMEgh s/(\PDN 2!$^=Y-^" S!7$. JPL^cNGH!,Vd?@bLvA~)aJŰ>XFAՏ]<la*GqU0`w W%ImeG^X/GZm.R<@id 8"MH}xq$:,T[ٲg`DQ"86J?"DWAd em_=0jAV@Q%+X`0?a 'c褄 �]ߍGl pHaZ)<ܢc1K1 F`FyNAlg܏�<OoŦ=XKŅb]5Uv x!d s�}1D#=d R=e*;,QVл³{ ~ܻ }�*U=e*/vBpuxx*T" *<KFv*f,^UXb-mDnj| chh%lb=)R `b0 t*h2(c좵]YDr9tg*”Үсc0\cU2H9WQ7,Ky/P5:p Fu,ʣdrpڰ_/rZL*:L]S_9|03Zǚp!h~z U*yΝbPR)Qjz [Ru+uN�� �IDATi84YJҕdA`U2 +XN3�'b?V9g2]ULՊ@f1Uбȋ LgV~sKؼbE-XnфmWPRk1Ei_d;Ǥ/yjbN݁3pɴzֱ]2S�3c1WS (-֭[ǹr `b lb0X�1 f,m<@  M`0`;wP ̷euֱx =ݶ{ZRͳkpUirYĀG1&Q"+7zW- kmmmBDUM (3nkd0 Fm`0X `0c1 caY,+jȢ=l6P1Kq|-knd=4J.7__ǓB] 1a XbnZXj3LʖhpAj]I *XfѪ5*Ojyߞ2 w1_o]Z9X]OTXavOmRYB7|opUraj$ӘehbK9GbUays_#+ѩb^I 2o~Ts)'8O&έʗ>S-QE^T,GkRWU|7.Fm #i^PGת Qs>L2Ԍd;fi븩V +)\0cTXVyRoK Mw]2p$hgi@Z-fp9`&DP@krSM+Vej)H?zg ыkW E-|!2˛#:ᐗb>Y1iUGUvfUiaMr*~OT0vɻZu8ߖ+xͰ0*ОbPY9?ejV(烕j5*-,AX-Wqb)algib0-Z 7`0J; `0TbPc1 6`0ڀUphhmْZl67e6V=ß|sm'׭[4`0 ,sV# 2 6䴒ԩS(!L}kD ~[;ܝ 3cY7Y VqfHk˚&Do w3aw*`0�3`0 `b0 LCBKSfPIbYjmZɩd^Bɳ̧nw,[^gݙg:Y|5ݗ- júe^κ3Ϥ>u,! Y)7sQ׊imy%uR\}j( */L3qUrTvuʄeKKWI*?Uܡe*U2nwGu,7cC[7U-/y**kM%Eus1jD*ˁ/r .}nPk5(]19#(@L8}|i[zC^zj?NgPWc;5E3XRU-wh+e^HݩdoFg+ڕ0‚EO$:a+1WXny"/%UEi 9Bфr8[gZd-wPlyi^vSg_D9>A`0�3`0 `b0 3`0nuP Qڻuܰ:ny[[˜[ݩxVЃiw\n8`0\}3[ǎfF|uVe0 F}X;wd0 5_s}m}?' M zf1|-~> Wų5㯚tgDդk5ƋwP.naMBHb& DBOR/ ҏC#L7BfBXȒ nIakHcJ ∱,Y2BW 1 &GP3'HRM5>Q}rKs_]'_qCX̥L4P;(ӢyҔg w4j4L&SGߋcD9͖Df0U2Y]FPSAH|i32?9;y er@p?fc5Sqx $$ Ci4fG.3 qӐqiÔi4/hVCXN+2kVd`Hʹ6_4uڬ/MMs83A)Y/7(OFLAQr{R2葊QduLʜInVx-7Mk)4ƚ/fom %^rCZBZ )tKSҰ~_SzܝBVПz 8j QGt"߀ !苣~AOIF 3CH#JBo  qe#DGCjBΡ_)t GūwX!p�Y@JnAP6mqN;a͡Vrj4Z;YT1C)$ K#%]�  b.<ۉ1-tWGF0o1\ چeH f4E*fV3!,N aٸdT5 ]s><z%(wҭbtT@464(W.d%¨_Hج`hQarjIT5_| rOO71DCUR;ƆA[]ncorۛJ ͑TL CE|噋Z_h1D4L N6!f^A ?_ pPvfBڃdJ|+4hcꮳ4ʎ@2QO,),=2Z 1lm`q1dG%,dJ,?Sn7r?jؖBoF2F0Lw!B�6a D)t&بCbGAj|2.Gd !MխiE$'!$Aդunу`S#F{ĂP ɎG\TV#($Fݮ1(%MtXLH2'n=qIcZ0;]2/�6UYN.41djR据dW.ץa`;5-Xr٘ S9K#b+e['XSo&$ԠsELz1, JĹMqj8nkT BA}֊f[d=ULzB䅬6Y+T /x \hxkI:i)^¡Ɔ(5VAw[U<K) Px !զgjLlz&Mrva45O Ukʶ-MXIϼM'`e2\uVSy6ʋ�=f6?hPE ʁٛG^r7b?S o,+fIe0ܨcYT70TQlb: MU&,R@Thm2Ťc7rSJr aEM ]pL3v/�=(a3gxd3R HH31w#.'+jF)�6`2`ƪ ]YYDLzf\F0/y63|7Y?WͲ@O'eÌXؔ,7HSS: EN韺y9Ʃ6O,&vCVr/LTjh۫-d {U '4RqjKlvCY0d,&igeG|k: '䣆_ӊ/û#S(=!Iw"@ "#{!v `Ю#ڲSaDRQSjR=4 +塇O !Q#>dNH#d #OG0L2"@B~/SBHHP, b(d�[RN A_hBqa$BH`#nHQ*yѷpĖ8)7/o i"CqGv\+M@I^Q`TcʖjwT䕬jR6X]Y˰rWW6r ]d>0Z,fj;2&-l<GRfuֵJvH5Fu=I0Y:lȵ${dַ"M2iyrX ,VUeSFT% bO1mF64e4WBcXVfbV)%`5X0eMو elmVqP2HYdT.Z%U24 a 5e5QUBt�(nG3%Jl4gġ:dg@0 ԯگdE0jiEL"qDuSmOy�62;dѷA7Ōsv"-8�A4}Qj"ں$vECoXg2әK7ZNҔ"4R#DsxnQ(j*ݜ,~>0-!J&Q,70Rl !=mDfh,(R0d#E0Qϛ0"lW*ԣևJ;8] ҭM0>%o{/'#׀o"¯^!>dbU] anB2ƛir8" -L"W LAuѭ&2:ZFůr0qSdz8Xi,؄k6OY5*iJ"4T5ņɂg sh6d]dܓm 1fQ햪M.-)B<]`ccltuYe2φjU6agYB͖ac=7, Y٩2M[J!48 IV'j Φ0jLjʀnS2@ZV5TsH/^<h+"Q WeLLHXaRM˸WߴQTiVcMl*5 yYQSVf5)RJ bY]kumڑY$rބIqSSWT5;@� W2$P8k[bRz ư!,uqukY Ea ]5c_G-XݜUpX{d"<Řj *AhM]%TV-fPkw(QyP*a#V)`ٙ8X)vlgd#ЬS3Eybʶmma4emLeavjd\4VYbȋO{QSj�[(.@]~#҆(IET0}j0ԬR H~=@lWJ=I(#XxqV$ځ2}p0J?; P'7&,eqDZ1"GT?_~I=P#M�!®8=bX$۶J0Q y~0=Űc+`h Ly~)EOR̡.AT3 LU JHircѡqa\J-^)ưR^=ՇUpjZ̪.9Evv0O~PsSQ`gZۀL!ДjLO� yi/GҪ%C-7Y߲* ;UƔ@VMgb2-;r-ZrOMbͪ9ʓgv*]j5SŔjJb=VAlԼ&k] )yYUw1rBfMS[)62$̲<M g瓉ٴUߪxENS\i*a>f/,F 0$)Lx8ZV5Zf`V!@@ٮ(õ5ca8L{jxoޗc*t5={/$m 6^=#M dB"'Ƙ4Y%\fnV+6'TrC |S.# AR˥f9E`j%dDpcyb3~H#A~ڋ%_?Gt+gjb[(J;qDJ'*%-fi1}KyGT DG9 KpFC'ӶhrGrQ(r#Q };0T Qz՝d[,{)>-CA. 2Hm5rQQAdGOm e'uF8"Z(nB>C b +e[ F9z0!$ϙm,"QI8D^pWV>5)-!X!@4=\"T5,h 'D0,%i%2'Π1JKdw" ~Svn7;H)/BLyrAaVzFI((: 0g�3hD)WQr]4D$#$#6P 1t'kz&|$37(,r" qFz~p)9Ģ'/@}$*)bmr`Q`c3O"@4OURno4L: EL&sU1,sȮWad-N,eZj`R s FXb^h)ןhRD1q XH,^e jCV&PM6N* Ih2]ʆVucղ ZF%Mf]:wTɰ&gl` ޴E2#I JtX>6mD3ιB,:s&z_ 'eSpncȥpHt~ڏ{1i͹]T #4F=$ޅ}vCy"$n7u1`0cKR˷?%5LS)]9,٥KL3VgXcª"!7yjZ*CNVn/lUB;QeBSxuYUIffd[֞,e+Ԝ.)HDxD_`p˜ Bhi:GT5ۂ !Hɤ�(ZV4"e)C,P+ZEJiM9~q,^l6ڏZ\mYnJ5ǧXYdU"5u} m3) [U~n V&bL`e(*`ɴVVꦒ}|KF,&~Z3^^<(ϧTP BYQ4UN&t*Ħ!V".,_qycU~nqcic'+1]2FS](*m:`f 1XIJ>sYUIR"hC-keh0,pfT ew+ rxu#| j3ʺNm]n`qye ;ҙaJʐ*sE9ͮ8а ZPXZh(=.{y.D¾>=L?och/%)B\Ai`JlYr0虂 Ee|վWs59Z*̮O%ei;-@I)c9tSk Tח JP`3/ )b`T=L+}PK)@D5(J@2*+EId1L.5Þ1C3yԹU  bFQ]L6@5+D-H8`鄓*ypȧAS:n08 -f;*DS=ٔ4`T*kGS|g@ݮdYI-C`3M-˫zLY M]@*%]31U4L l"׍a{-V D;.Q>M>dxTLpcmh͔8eO?Z vY m˴f(w5T h` f*/j=6&!1H7e1K CK: ChˀLiBEndGP&<o{ιԚ`0`n{y<oA.H]e,q �NzZƞ%~Ŕ0P. O? zVG.xni$oYq/xb\5̈ X0 GB7�� �IDATq CPC*9IZbmc$AP<l rba^@HKF Zޅ dD<h2!2("wor><>jn˳~p8$J)O+A]'v# (2I(RR4S 2xX33_<_nwU'yS-go=Y(rŊQ9b##„K9W6vUnr&w�Succ8a`Wv"DX!Ƌ!Qy޵xk]L{0?jf1I^{[0iI:1rsH!H9X) "\Xfۂ:Q l/ΛnWMXҏZH|N<[H^I+.A9' ޒmaKS�(3/=P$Ĭ⤆(&0@^㚷iRuN'5Df+(ևb3bE:b$p}L=q8da" ǭtǫf#=QR2Ka5{1D=Yhq4]Umn.E$hS1Ŋ$T)RU+|,nw]pVɊd/U?b y/䕬K*E.a9ǚ_/# D|#I)KDG<ZQ,n2-*߶6(-n8#1,t%215[?19hH̃n.nXhF+hc $&M?2%u}/ v.V�ROK7a_(UTBEX-ʺGEb. 3G Y_?}a&/". ϙ%$OzM.̙aBDĽ#'_b|7dPd6C|>)b'A0%HQqQbJw!Z_9]6ܤ~`1եĕ; D)y ՘Iiy9UL_r֍D}K<Y<~Gub!' ,Vb~+G$xҨ 9RukJRXU"P5%L%#* GH1ɎX35A�%B$*9 ]\Eȣt1Og(z>[sCCXxs*ׯ:>[َQaQ4bceN|nRUmvj~9\nf5gYE3_syiUi*WIe_禝X$RouOd`J[hڨ\ȽN,eYwm7fhSgTu,<ao޳rv ӷpDH{ &\于ߦ:B 4'Y7K{;':%̲3Og4BKidA=!m\׽˞UI}`n Lt.ZMl�ȩcQy]"qrZ2uoB8#P|ݰZP%͟BꜬn2V7\@B=$8$PE1={IeTd/f]qP:+?}q(W1^`EVp<qxqDD'1# h^'l[4HL5OXI7 P8)y#81QGo Ss,S KN\J8g9 &�=m o<$9Vp{1"֫(= OnYs"ŭ T Hp-h,}BRZ-\e2V?۹Q'5ꇒx- J1!p}J@;$^a5T�AV~kNif˜WY$Q[b|"7RvxjZC+ըRѯ9V:T<TrHC+X,\ӡؠR4TM½/Tͱ27 JYҷ[ JS:>349)&!QMJzJ8| sHԬdaO0vjln4FZITQ˽#z݅)i=,J[7gJYe#$b>fb}U1yU| 6+iNZ}FӊJE &UJϊGI^Oe'l%t~Ji65Ԋق_bGK_,#~%+nUf_&%r4�} 䁒{bn CۤGCK+9qi\H6x^3^ia;a X& 4f>WN> y.ڊze!u[Jz,4ͨBp{FA默E=WtS4pzk7e]d,;QzѫƄB[ݬ#myyAP$m\f늞+cS*)+pZR{@|x=@4$2&JLrgWڃ#~ o!ѥxB19Sަh؅|OJN꽒ME {pw-N;\H$x+$buX)gK zBVVӨM_L5<ʰ{HI X3HV<},Qd<$7iwN N^JW;MÎ0GĈ){`4"ָv .f(H7Йu0KpQ(k"V򞀓?􂊗 }VޑU@Ph# k$AIaT~"gK&P=#VKw*\s&3_8хE%qCNfh1EZBx(o1͑"'$IĊU)bevrI&&jEܳˊ?i :\j~%l-#%jQw !qAw|'w+@ LD]H0%]+N/!Ex!`n?\V`0*oV|.dPx%d:xYdI ÖNOu<^iqGX1 %E?Lzgzd+rP'Bi}FFjr1h?̭yA+wn|hy~AnO!R.CA6;nP1zds0 [J-g_ޏĖf7a'0>=S8{E6K6MW,ͦfړ1i$t[;$lv1\)"p'q*/ql+rǢ A].xM1VA+VE�/OW;oTimҔ eD jJuDZ0 EUT!L1$F9‹H|4bT?0&Oc#+4 yX- "cFIn{I^* R4nuXv`66f y*R”Sb1#/yD 9^gÛexE6㪸G HNӿ0z3 C:b}FCX{7Fhnbd ?cc uXL?AB,ٽY[� FWO#$f OC ^]IPdQӺpFiċd|ny2l?deNfb6rd#uEq1^#0Z )QMw]'\3徼6pB[.xB7DRI@L?}WSu:x( jὰG 1D9]\q J!mAccABNqx16Q~(x9 G mIP)4{F6yLHZ]0G =/3YYìWVڂd#csH¤m\\F@ _ 'XIo6Ä'f@ޤ@WXIl]0RC[h;tȨۅo@ȭ`y%}wuV`ןl:rLd]xOr*1ԉzNt+cLL( f�撨-ޕ!SCWoT[b(Q -t-#{ݔlQx #VHrJ Zc?DsS^TDbҹty*d|!vxע5wB‚ 01x]g{̳JW+۩Dwn<DQ厨H*e}Ǟ/b FVA?y||3u;\0 r`CZ,\0xѫ(WcaORyDBK*c<|61拦(i"*Ӵ*9Q z5Q/RbN+VȎ>Y"DduT}w|c) QD-I䅝ه$ cY 0$zӥႛ 3Koq¹_lx#+~@5<IBZyH4 }cM5]'"%S:+/܏`J.̸N=Q*HG<icE~zcf)5:q̷@L@(>2Ka8t;I*,SGXaG]`bSD\,GG/F1+K^̻S*QhJ EjM|O%q.yM9rfPc0= T-y8 EW"HrܽTm=G]v,xdKBܻޗg9T"J6tX9 Q!+H_5z yqz6P[ xnIQ he(*{ Qo_:f/+DÙ}DYP|ۗ_% aъdO+ ;OT"q]0){ Ӟ|F) aV0x"�"Ox4Nqp"<5<C',򂄷q{4ZńLBAnŒfV"*5~zJ%ѵ;G1"Lݸ}^m9p7; ;a?{1DRb~cIٽK1ahpJǏ41%5I qvC#)\OI~GQ1<lin<qƒg 8$ ;f*h,ċ!6A}%bLBG*3[¨ Sz-1 zoP9.ntž,Y7bߘ燒ax9yDӡ{J ۿe0/aI Ryxo" 5X_gM톻9S8?f<;@Z,uk[EMq .^Q&MWdBrg㢷sX Q <{4u1hCd,OYu{-,=?,nL^=yNN.9'G;"<./HeL[^6i1Zd!N Dic}$&<2"H%94n 14ú dyii ؝RprC/&"Db3{Qq } /(XzxRk)uXGW~xwA(k"+[as-+WNOY VŭyK1:hb]tҎ<}o_t@/ON}%)6feZhgSI4#xG}m1^)c7Dž\Z^قV>IfM = *<xn f"DxEvb1Ýh# UrZtɺ`Izmw<pYb&YE19uHvG7KFJEm!P Gtqȴ%aQѦ*G/U ty=UռXc%XN<�JizODUq7a91ݣSK (CX1 ǜ?8T̡?D ݆h%YEH!;.@I~m>M ɧUەfxڤBEP=U&ܿ8SFr8%YtlϊաYV0s%V-Ck$e<6k٭PM'GD.Aa@0~*ai,MBQ%fZD|q)3"LZv*NDeXQ@�)up55Irž@zN" ϱb;Hb`*9ը\zA@D4%S<H|g,ê^'aW0JVN?Y,@-/INkTv t("N7zԝV$g=VD}3Giai9(CXYSňDz wm/TRֆ<xQcXR.ٕwxV3q" ;yncoJ(!~Æ`4zG [@ǃnơ$bC A26莴vEg¾xG11Vƀ1/bU/?J Lc<,*�|.8橑?B:4<K07 w~b99.+ϔ<U@)ɇIP=O>FUѶ-b/P88HsxOg2๦^I߹ 9RSoسʷ6d~o51̢5 =z`R 0',J"CqD8bK lQ,gp;'ME@j$Z1խrYA+s&%1b1xCIn}Fu*FY6Y-eU uCn43TZ Hzw: \Fh-r}A`A-: je16jvPHlPw@>U5Ҷcl4\dJv%HFhLҐ,3SJB?'m6U &Gh(dC2B+p[sK)(\sp}]ZI}~; aVm-֦Zc[sF){~hSC,fM_MM'~0GϨ=-_~Hқ[lqMXK֡B6BkZf@ӾrjURӘeTb<nS䵸?#O^3^}-X-3�%Qy$Kx*v.?[_q N 7O<p)D;VȊFaP#[f8ZL!;oQGVwѿ^u U Sr<E=z=fRb< 7y En0OGVnQ|ANa];D)6A?lmQ!{wĒ B$Qݰj(gz[8$!Vw6lQJC#*f)ۼFXvԢ+^Ox:De(ÏXIN&/'KjszOx-Oݫ0K&3qe�NӓMƸUTjMTd!1z Ghp^Dy%dJT!zi!HD1|QW2PUw`= !b1Vr-/oŭGyXii.e9T<XfuA+j2GhrU5�E Ti2d#YBwME#C ivU:j0٠%}7<X.du]oZ -tltlr4žjBz]E- Vi7X%,i} vbYce'f*65lқނR. *F{i٬dlcI=Ć={*hUiWiuҩt M 0s̲R!7VҾijԪ--<BK8}Mh*CoAN,-"Peg>}�� �IDAT&+7 ruA-unZLS40|hZEanGn\vNU]'ka�Y6fYU\z{鷔,adŶYVuly8[ՌM eR6 %6UMNƢͲ+tu]Wܣ$L=M*Wm~v[@م+~4FHvue(,&d ЧtdfܡR>6Jnjy?d` 0 iS}DRަ<0<K#Mޙ>W"h;J9r,Чda;z-(]F[e8x gI_{)'4ˆ-4ZEMQ:T,_$x.%D'آ> \S�KsrӨ<֋U"५hJ/֧dT̲Ÿj& 9R .e] !7jJ5!* v818g4%:kp((0WtzMWg' ZBWJ"CBRiR!K ܴc6 Щѝb| s]sf"|jl0ļ0lչ.c.�'Jd}Ub|V儨# LB5kkpWtZ V)U=@QI趡/JܞrxYZɅiEx'4n(>nfx0{(h'6Iү=bB~b; Wq-t)]~ЂL7O X媛uɹ*tfDNtB;H6Zv#du<beDx-pƶ-XYPfhγ&3wxR9Ci}6U EuQ/F1rtXʦBԣ J^Pt ~Y Jw H F,p@UiA;РDRZIjI*IeݕWʖ4gX$,r8=Je)%p4נ{-i4P}[iLW4tDnxMNO: ][OV6Ϭ 7fkrDh)npNf4 i#m;@4NJE*Wtx(;(HrT|dBq萁Ӣ5*tչY˘CXgJ]Y*xv&3+)-56xYEI_YӺŨpSi<(9eU+A<q*m{_}GuV.8 (dwDŒ}F+tmD Xljg-m ۮx68 X0XXm !]*ݦڻtl)t#~|O/J65]u+g"3x*> mw)TIpCEmjK̏;aO7z1vghcWQLw- |NwWX9`xC`e=NƼpF(C :~�JEb0{%RKNifl/'{aRnta>>]Z[_)Lxƃ[j! p:TRد"rnCyB}\ 5�ͽ&nԝ1}ʎ&3n@5|즋c2[nR8`X,dEVeC-;TfB5SR.cG2СrD+|ZBg|zMe-.6}[[WgimjT,xDIGC~Z yJ2H'e-7썰W="34O21PĴhrPh)tY"+lbT $'6 ;$gJ(<R tcV812M,"O/bK=Uf -[$44.h*mjJ ZiZEo+t8ц9)^an5%PQbgxP|zRVlPKP5bױHֺrwk+<Qjr%ـDbR}F/VGydjڏ34q4h bVʔIJF(ҥVt6IYN -q+|BS:J:h@œ͡C :GՐZXi4^֪e)^ts}&XтIŪ^B6y`ZJ&c) ]2f2iP,i!;Ow6dFYp;Ti}v-7#-t:ź( Wib[ogag/]'Ͽ௒??}iq"rFWړf4 :ӕ8Rm"RCYf`e~Dta"MCE w : rzl]dM$xu(f{zA)r-C@u-KK] jSe>+tҩ&mp>p(HFnťK-x:{nIJ_%Uf5wu|cw65Ev sP(JGiΧyJnóܟgia>"\W7{346U2Pk_wuL2:N:7 mb|W^~?"˖'zaG=ta¢ &3sɖT@RvBj6bE\Z)8T]{l BSIKVe7p1;6۰349yPng;^rAcvuA)[X3!Nͅ|]wosYh'+S2>WB`ۊ"v8u Y�Nlc8VL `vxr2]aӢZ,CX/n㞋!<5IHٌu-u׷Ϩ`WRX,e !ՉҺ r\<PYG[isx\i"}.s܍8?) X塮;\Xa.wbym(+Ȥ8:#L~BKCE1LɌ `Zan&�}ж_FsS7QKU(3KHm>gfH[XqvN[~bRu|튠\z'9OjYH=کze;En!HM#+z[jtI)q/+ŗ+uj `-!>h^#Z†p5iMƪ{8]/㎛#(nMf'pi6"'%ދӌA7JuMGzH5gK&3YSiu$T1"Jr?GMfM>a ט5Ζ.sr}Ȁ8n09*tUM ilX>*g 0F~(t1h[=2WZȤL@,m]J,mFtW"Zill/6\ma6Oek3⨅> &Ĝ<Y. ꩈ() (FLn@vQ.JLH"+V \r^I]]-!eEP$PȚ:sK:VkI53mS;_ACE%L Mt9t%m,V.Šx[08/`٦:ź" |xFhmS-]eL3|�cCeldE١"GH7F+be-/FSP J\.rڭ&м& 9m L˂5h*72O\k):u#֫xk)KTιs3lٱ3!j,WTТ+ye:TzrQg&]hx˽jc[@Mt,y`ԩvq`h[HHNzx6&33z ^un3e?`X A*\>`KY'eng l9*ӭ,gh*v*rUiϳԡœzބw;`sVwYVqb|%jl=I5.V1r {Zx}鑕rf! vZޠ%Ɏ!yw /Q>Jx`*вV!"sDNO%,�+J-:č&bUL@&LufZ2]SQ(BFswC, XdЃ\U݈6U[PcWYjo`m[+wgyx6ܴt˖o`yW<9:KyV MLV埗Ycu2}p@"tgP-ÊX!*3] g ANF I8]jL53]7,}Vl}FWS^ukҞz(!l-Jiin^J)a@zrǷ$~:7&=g{DO r.qҧSM4۽S O,u8Vj#Ti3%%mjv)p˘HtZӷup;wݗyWyLA DKc9|. ז E'6cEiu*t-QqC͜b]gY+a( qBgΞ` e*�ڪ$_̎6NhNkr<o7nTt GR/QQ*_Yӊ7Ս% r)KfR{b/5M* *'.eՑ=)!)H/jtWC`#G6 ץ 15"Usu%E_R5$)VLr*)vL_ -1#Tb|;\0:xY2vL.cBQq:AY6$^ uDTO<Ʉ}2]m2QӠ~5PpK[kX٦f :_g(;.}KR ab,}%{N<8<*%kCzPII 1spDmLCz\"y>D*jRnk͒9b}=8hJvTlԮ)o?Kgv`h$E<.EȣP}\KW&^2Mvl9RO첄^~ѱKY*ғjdŸATP9Ãn qw]E2WP*WdBKyghpx{Y㞾ň<OVcWy&\gj-EXaNzrqԵWis4VʯFWdp"+CVkIb'wmN,y�n|iN;exIUrLoHvSYn8d.;G1J*m95.>=MAֱtjφ}JiEg(1J'd3TrbE/7*711 K9e$'sp(f;VzȀX ODγѿM%m0Q6Xe6㸏c' 3œ"0lR6,|:="eCE:z 6n;8[^V:4 beuiQpM +9^7]"?6Uk(p"Vv=}Z'xN!Qֿ]WەJ=R<$'Z4! @=$VNM @4>Bj;[%]7r}H92ƴ ):3JIr,%Rr)0ETV(JbkZ%?CU}GsBZ/vMm2 ҥ,աY0^qoϠ~\h#>(si.esV_vmmDV}WӬQULQYrU.t100cd9}*& >I. e!Υ78n= W7ظt8ؙqPE sKu҉:7sYݰ* T\D:7YK5nl< p4mUw]Baj+V>S&Oӕ Pm0`fbK_G <|iS]Z a0/zaڤԙ{O{+չs⭲_<xF)y*ty4KJ9ؾȚptSw7b^KUpeM]"5ӞB!b%访>@(̏=í'}ғr0bɖ9k9Y,j'\pSF74 d.FH {q)e#momX"Z_۽%~" \#ȚZEFu]Bڬ}B'UgoZjxb"kvK̻"ƪXb"kf*Ȳ{7r|%AڃenNM&)~ߑD?Gk.s[,>cy3uLt+t6Hx)LW-uE%NX;Fkl2֥,;Tjl? e3uPSNukOtmF :gQo1beT VIG #\j�*~Ij8X%*NꕠJLv_td N<JYF,ȍi ĦkJ:K'h0+'gBWi)=*rY32eHSˣBg;LG/r]ZJs s<8[bF#J5q:\1}w wCFܔ:6C>3:aQ6Dۻe 1 q7�F5V sM&_ewQȯceDeel>'cWFe>ߡ ,愔mcӬʳb<JDġJbǏ(9x]zKLk]M/<D4lMX' [вѠȺ|>5i]4LSg MGoGxkx]hYcL_HrHtJsBeC8k(2Ÿ~Ui2 =<UkD ԇ$}CUR.eU2,c3<OþM2I~!09]OKklRd9ȂF֙ZdY-*II5o1~[J @ibEe 2 y3Ӥ"(F1ɬ`6%=F.䞛SJ]eO|w6>^vK W܉i\90ڝ=&b<q\It==Fmp Kz;u!$4#D߮2z9jf|INEJ:Csy%٪WgKEcwdt//X2^}5ZgKE@DAmX}KNCyYmgh>] `R̽.eZwI0IRiIEd)^`"kf`Sqq@DZ"_]bs[dy1Ew!JQPWcegiS(@1d} I_AegNyvS8i]E߶6)5:8ƀTڈI,nyDB%,H耆4=n`6gIE*94hV0NЋj\_VcŰLY|y qht;_#7PTet'uMT\]DSPm2#S<ϧSs{}n23CKb2[\QtfM XBWջ ѿ1} 1;G\]Vz[b IP&3[o1ޡW@nBɂ+F1}U:MG%bd̟ bzŵ~HC^ڙۣ2k1%e$ɔ ~^O 4V&RUOҍOf&=Z.=ܣ+ewNХ@5BKZ|"R &IMsiH HXɌ J5wcg:`X'}D)REkPWAH zu`rC5ŶCTP&[dYrMvGmK�� �IDAT sJ$JTbqmunEPReL@:ŌT->D�CO.8r5:w.]aNRiT)F1:Tʶ'Cl]*@.f5?=N)LjH<`Gu ծĖbUY8\O]K^=%S4GZ$?I?O'IBqц@-.Aڻj:I#G̻G #Tt\Bs%|^Fļ5*)ؒ-uiY=P+3y\qH*OT=Ͳz Ȋ^|W˘l%#)JYlaƫQ}j1́^a*i2ͧq[\ͤ~M5*WW�]ҏ[мM&:T80"8W~jO$`"ϑ5+F1`) 4-''Tlr1kl0v(v[=>C䫻,R*k rz/eZMf\փ~9tf6.)as^2OY64@-Ib+* *_}OK(V-ƥB$5< q*'ܭv8~)qZLdu-^tnμfhd"[aӧ8ǽ9V8cWY~pڜMB,Զ<ƮR|O\"%qBJ'BND9ȚdӷMMz%QB\eV~(ljJ\rjA~ƀW ƿ0ʊp~&(uU7ČOWV|relS3|fZKirtUZY$8U2g灬 m)bYd5^YnH`BgYaPKQ̘ZT;ԉBVRkqБ2Z &t4D4d`? sxvuaUz Uikqi!sŠJb*-1/ƇgDBRp.c34(T siJQnSSeLLY.w{җL?=lK<ۦzgԜ\d2ghZrR^d[QBY)b㛌XYO&< Qg=] a{5]&ǍTk1jTc뻲j׎`IR{BV_RH ^ݻ8Mf eA&<G'$�(oM;Uvґ8ڦVЕ NI"'! \+KYJz/~X"P MR/9VGghҺȚ&u ѯiֺG3 x p(5,uͲO^g%*,,%>R?G Ic vgw[gJ[R5Mv ].͗03 L -~_qL˼x;\Pƶڟgٸ-k0iV!vy&jy-q<G:UmB=nu8&UD%iE -RYק5Hcǻj`:_)k:^ENcŒi,ϱ -9WP@(J+,C6=92gp#{D B")['Y>lӧH%͛cE+̉!waْ}>"_sQ%Ub6Q*Fje,-r+A'(z 6Tk#Q0#u+xV }C7eAZ*ȉd(P0{s"k+̍gK~L7Y- X u#vv'*3O2Gcשwc*ק^:\1rkJ{Ke#U6RTn"<z*ćD[aNr='~XWTbKY"~:en4kH8[nIKy{}!XmS{/Lޥk>,l z}>/y|!LnQ',\+E6Y?%֙db]yRx~G>ڸ8[G+<1}"a aٻ Ui0Rmu)?̏O{y*}BR=x5ծ8 p_>C 'YEo q1cX~nh)&TMnvтVԄ%U/sӘ)<qTg+zzvt<hU+x{KKi�:ԥJ#5Bk(`+rMqUKI~7L܅Ԝۦzz]<*m esV-5qO);eV`:74*ͲXҠ~Ȁ4/8^0 ?=K==}rqE֚Թ9KCdȶ \R%~g>ե,=&3J-b[̔BT,V]S\b^Zr "2%&3GnS9 s"V1񆡟t?J?я 2]VnMm0|DcU56fDy/sz36vU]^;fB)?݁wMNOJ|?UI Ik!Ǧ*m~~q-$__6/Ҭ~Xta]D^؉* ɞXmݎF*Kj$klO)ct²PVSsӬT}ΊqL_?GM�͕&#v=BS| Oen_NDh0) 0 )fM_e]J5VS{h�׾t+/i}gn AةД=ȏ(yNN\pǑ;a76QS*bo0\;P<㪗ءgR<ӮVrED*CER}ii] y*\v* ~Z jU]�_kܴ�W$ ؾelp%!aJ?A ;T(JpCEMeE%KQ/v ճ[OVZd)V6U9.eE]\KSXe p%8|/㘾 6ū Y3͚nVOA! ,6fhJIX}Zβn9&vbi.ƷVJ(f~wtRj6t1Bk͊z0-CkDUڋ,+yhV& t3oK`%w82".Tp3MM.A.zY_K\2`a$$qIʃ2+!-kL3%ۑ愮γ3Ζ2BiBTMseǪ9Cܕ"ˊg14y>}iu UDTR!rU ~y.5/s[XM1yPs b*� 꺡:8V,43eC fmWdMaG=x+]+ ,JGJA`){ ܘbJbk@֠>N,m3/Vb|Y^6)RM|>[md�]˞s"̈8'nQ %+j[L GViy)יRI2RӮ%>[FNl{їs׵ K)o+ynYjXDژ�zԏtʃ)*(i2]Rf<O1t)ئEVE,Io 62ϑb0t<%0~sJU pdVG]%ӽK_3]]ګy I#Z^o9+HVG #j|;#~Zʊh<$ҖR#H*C&eƩNMR+Rcx+ bMvn,3:ϒ+AuQ rVZvx"kS7|WL?Ajy#j<dͻ =) EM&n7(%u(D0Aò<K&3Kk^b^nqtWđ{&G<u9J$x(5>7H@s:rkW%R~`#s,\)|^d6pKqBzp %_Ȳp޲ӛL(|XdsܓץfRpM!�Ϛr(<t,I +M>. Jf'deS$cKٻ, oӚ̀-U/ovxaRU1YHz:"&",NA%ʐw!1vיY@!JKTzB<.ގ# k.&d œGSB ns)bm CiS<3@Sp%6Ix9?~F vFP$s"hҶ<b$s6Z"n5)Âeۧh)̽''}NpgFT,1oܺ5QJ󒁏tWˢtY`)+Lw'$z@)XИZ>²ۤTpV5LyJ&Nzr>x 't&3rԓdrP(UŽ%I]+EIZtՉTU?P 6]L0'Lͱ5#EpN ŧ88/,pML4!R�2bm5AxUt@]*p?>j)ЌR|S Ws(TiO)^qYe)tJD1uu]iT4<ǽY6$( 85H7]sMQWo<t'ΎD8i& R廻>J(%6]3redvG.Kӏ'QI< ИSklK}LJfIOj?eC!AAgDZl<)*xȀ2m껔s*bx-_Rj0`6lja[)fwcJO4 -_>C8[LI>f:ZWooSiKPBLd>4.ckLqW0Hר4Gu݉Aʳx/YU.ME/ϑ:ٺ]V3JF)q#5žnv*W7{^)>nԹitU[Xb,aetnTVtхN7nmUbP2u ]skR JNЄq3n.=]pb5N3,@̱`gUHAHڰikJ{kR^|ngtUzYV7SdU#[:_dTjS=}F ^W&_C6[r :"}Xm8["VTRRosXSP폼 _<3y^1vWS O>r_x/, |w)ͱ"QDPcLwyؕ]iZarQk"<ݷ-=`S<=]ϪLJuSlKA(ӦRv.X{3ۃA܊$zFtҡ |R8SPrqs(գr 寤fT3:SR}ϓڅ;LOœT,Sϑ0SϳdF�UDe2EɄ #5],,}e18*5=ǔInS5L6rDU�R|?G)H\J*m5=VakP9}MN~q)c_eV\gx0CWLu^U+&Q3ttL3U;ϒ�yv.xCLCT')FWz 3,+Z=W+=;T]F̘zr*(BVЩ�S\I7eK_IiO\^]eh&Oin;IiRY^NiNbwV"k⧙]!"|1ΖzgK 9)3(_%LveLG#jkbD6Q~L`/&3Rj2֨ 68^磅/sSIiN/ 9+$̓*=:uN6;|M<>w{Kr(ӽ#/]?Ã6PAn 6h2#Jr=ַ c2&_1`)m 9Q *m}Y.}CcpL̗qLWj@Ҁw8fpU}p#UP0MD$z[~eN-tpuf5'.o[N9ʅ%kьEj$5!{jQJ`%mj^oeWJ'1Ʈ7h "oJY/2k֙.pGW訂dfg/nsY Z!%5ti#t24uC! HD"nvxRc9]ہ!ː I#y3PϑQ�J_u)DT+c|zܞ!0W禬X$]({FoP 0wRA]61#-pC9^[}X(-D'4Nϯhϋj"G_u4({<`BB$lfU%+kDT_ңM, մdjSZ:8eLMZ(e*hR ]e>ݴp+5*1ʌбœ5u 3UcJ{i?HB DRߣtպ$~ȚS<ӻ-=))]3o 6b<^gJr9|>uzBxQxNk6 6x +z^aNcXY9'o7(+IRyx57*VSRQ|էxNFU*;\?x)Us4Qx9Py/̿+/ӯ|e>2?Hl$+/G478„,?o&^"o,WWFh̿Z)_xOH^Eo:|})}9| v].>uP)M|>'c~q?'7ؽ?/Gp,T;x(x[HGh;�mS}*G&?LOyߋ>  ?{l?'9]~|Ci>'D~ ?v>'??a%*c8^'f7~F73$?Ae~-y3?E~?7q,.&{yEFFy_/lpist+?WXyPD_W>?g4q~-2}/5o9?A׼E޷7/nq/~)7C1"Ng+e H}g'w'_!w'wC| ~u>tt/_Vӭ"/2a>9' 6QTN+U>g;T~?z/1Q {UrW⍧‚ANJ�`%<DH?nϯ䘣.Iv%<ܕ(uZ}csHPi1+ 0)E֦: UmR5^Uynu-;UcE 34X_I5uu򯍹~ۡ"Ns0'𖚴ԺtL0~D%_ZI&Ǔi?<vYq$ [mLV{Yq!l^$S BWz,3$wH vJlVRO[ 5x Ice$^LoA�� �IDAT+_a$,HG>o薝wT].=ϘQF(Uī^z3KLIv̾k!+ٱfs%;`t]*91:}Ol0Yǚ7EEld9I~D29YzjYB:W\Oh-kmTɎZ[|:M(yZ t,Akhn#Ú럸fzY#,SX;#<B,PZ:ܑS:3VP6lG ao6DWj:LӥBG}^.;jd$!,ݣ ,ӵ!Nv `xs(O!7gOfV @%%bJv>W @?7N2]{Qx0D+*"W"cHLt. @5z١]v~}[eAC/#>=[d;szq[Tў5.<≘w]O)բKGj^eBQSYhy\_P!:28jO䴟Iaaxax{*KVsks`t&OZΛ_6W+!xSt]Y B�۲L($Lݼ(Z,5ʋ "jue‚ G~7ܣ|n0M[͓42O? NLQ̙z\nMdx؞W]LQ'QYB*صյ2*ۙ[Zzoa v7ifIp˒aDsٷ3Sk dHgUqv,TDӯEZۤz2t9"fP2CKg ϥ9 q~R*?x[4+HF;wމ%W Xv+#sp["Fxu2LfSuJsVFmK5Xu+ԋR+j%0hFUFbk,92e_qjGAJE0ϑgIƼOv<m,aAyhj-ѼJ<{"ۄe>acv:ur@#]PK*v1mE_m;Y u2#]*#TRF*ֻs00CN,-2M4];T1[pճUZ'vņ6gCi^A@k`eZJ<C|ӭw9Ky.i>dOlܚ܆!ҏ}(A)o;B !3FSA#~jFo)ulea`y&|rz<=L=>g!!-ҏdzg{הU )M+Ն3(sE<mf\na11:y.ܠ)eqB j?3bK~aףH*QQ'�v CBPCZr".R[+StVVZ U|ȔW `-кDdǭR|k{4GT+Nn}%;^UloP\^(fujGڪW<g*X}wtZWhX~ lSO W]A Fj*79J4JJn r +U q`?zk?jYߥ"\,ݠ~sP&@brr[YPWԆ}TLMͷENh!}N1 ,ri^K#EBrI~Ԉ8p78h89{& R堒_Ɏ,:֚Xkn|OU"QeO*i ykRw E)Pl`EWmvKrZe'mV3F9`w2Q7ʀYY0 YXV/@v^.˶*]yqLT=LP㺝*'5רc)a9hࣸK Yǹm49R(>3/'ӾweHȂm&GT7^=}i"Q'Yz379^^Ѭhv/c9D'p.yғbK])?N "lDpDǦMO37kfi*(tA|+y%2m}gy"c+y.Ȍȓɉ \s!<'= MRIqGi;Nfm`6rڜ2b dqV^�4U#eCl$Em!R_^#ʊ 'Ow҂ &Q(?yqI.4H/%ztkBYZU}"'WS;( FN!Xe#Y"]ّ3a�YgHk6V_5ux @z ~P�E2%[V$c�|H :Ӭ0YJf\t:PfP+znA~YaCt՘|zج HyۮO#˝d-)"P #T; o2 &ނ9SY,ݦ?3CAq�UW{\I%F8̒QIzuߠE4fŜdGOiBBE ccu(K߽+0ܶS:H,$yWJQ%ܑns M!7?zgg5F'J3K9. 7eD@\>Ɩ r"]S-lĪ"\haѩyQT>y1y24t7*Y\ʦ.*M`mS8}jλDs&*anc &!Yjt95ʗ'Q'Iũ:q xhfH2z3KkYAbIubR|Y>%W tV9F:ݾKdyf9mz|4]ED-+ݚlSeo}5PV$S*m<_ǧt{mܬ";~%^:xsfRf}u5!QtT½RVi,mp(Q_M[ 87XA썸5 HMi^X*Nm{P-9ڍ#8:6ڡR(CQ-"aPoS%yA`?HmJ{8/?̟N潖6>ujYV*gD~;i{o0(ޢP (k)CM/9jZ'XT6WhNf԰�q^-;p|4rc|fw]}^"dTZYzL7ˌgTE-Xq<υmZq6UM4J )P2kwmP->Ȉ XtmR�"2/ԀD,njuxknx@٠%gb;I4GT)Ȳ2s3&wN-lD^aP@;t!c!5F21U4]f>Cc=K ~i V >j hBǸRnG4#6̒C?#u㼴oS-E5^kfXSpvMs\3qa&;, (jhgnnognAF܈$aznA0q[g&kGw2S27nJT?gɌl-dͅmKpo5R4sW |L`q2d-fd<1{1I"-Z-g̳pMH<ܲM씎q8̼x)[{*btuOYYo`44 nkŒVX<\|޼Bb/.v�w+JǸE|OX^|D,&r"O枭'pyTuR nb<a\!Cq4c9(ID%ضboc<`1 b aLq>+I¸R-,R/H&&lE8b:rTK*ia.[ #~ ?87Ă+Y(aw.|kBr\8ȩclRT7?|7`Xh3AV7O{_ཎ U?1is.O|"^Ķ/~<+ֹ#ED*"K3SǸc6,,"#ډ&d jXQ(!7DtΗ$$40CC ac$BAyL)M1t$]]#Ϫc&VME v ܝiP=@6{yrv38pzSB<9j5R>$}Qn 幤W &}rNgy=eiw7I0C!:Z*{)r-K<zV ]+1#JǏXoW<=`{\�iYDVӕ m$77y T.Cb럴B@o-f  .#k<ZYп܉T3-d :bL䍺 =LR1x* Y>W\+VLn[Y^hlNf֨ۦ5z؄h*‹օZdU;ʀT #NM y_z+y"%sz}E2x Ei%n 2 %E4<s, b)]Z3VͦnNq\̞ZRu\S"-C6s \ucZ8vǗhnc޶]0z6i)P+iwZ|F-RR*'S= +) )]gMXf\5bB{&vйKf4q]>ՀT;Ϙ0] sY(c}KE+b}[VͦIul Բ^N4:k>:ae'zZ܎g2!��L9ä& TR|ΓTͦ1] "Ov0 6U.}ɵ1e6R(g�V H7ئjYǫuFA嬪^q7V^X.hʏys1r[ ^7wqV;QQ2)G,W").Ls{]�s+]"e# 8JN9Kl饐X\P*QWPK3)BΊ%ꂥt2a&]L;z nʙ,%,yfT` 0OĝֵΉlZ sI9ptIٽd{dǸ6F*Mcf-eUt[mV͔&vv5 +4xJe(r jze<֨23$11-Zr4ϥm&8VhvUv<m 2ۤ:ONrڡNf0)dyڂsm ]!ϥujg>zr^u՟] ϗ@c6UΛA^:X;T9^);� M_mfhc~sYظ[5YN+anp=ыNIڭtuYwP?p55u 7mNJP,4 %^TyU#1�fn (ệIb\ۚ&EI %+$E(WiIİLhuiܥgheA^,BP pRbHǚcvp՗QjI&|% dcG{_oxcLb4?˴)W{MsX"P9󜙦K)Wx h5JSPsIDIG4%w1=FQ7Kl\q/_WvhärZX4IKYySsYUm'C]bpPHeQ4I+u4gn;zZEj[:Jn%?go1 ~ĕas\ŵ?@|eu:1Ongr_N^GӒx>>^x6V6 |=lc|}xGOq~t1%_oq |st?eN01Q?_}O6T ?˯EWa'XSg8^} x?Wr^P�o[>?E PUm狽\~f  & 9 jcߠ~_/ü�o|5>P<~Gxk.'I|/oV"fW~Sy~Wy|7'O?oW6~'3|}WwNGx+~P=ZuRncs[oMo П<wr fsz?,gsO=<<ϯ3v3cܷI,߾r_o |8kY?=KY><Fwx9ɺ ~{,w3oPyo4qv-/c=S<}(TJi?޿ *K^_r׽A:K7 fTk5ʀzWH=7ɶ�Z;Ev629]$Â$4(* XIh BHs6i9ZJhfəe2mT49.if]d"2?ARGSجNN=:3l-͔[F�wtyrv5IR9{VoS8IO/Z+o*"B\'i<[yR1-ݻomRm!B'i( Z6iKư PAMZC+CqadTJ} h+Ǹ>Sq>Gl<ޠ~=pzKQ:ޢ+xH?8~iP''XθX~:)!#}V'/h6#qޱ:֞I,mQ.gOiF{)Tti<HK#9.+fFŲҼBSQ_@gcmpCndy uj E/ї , ԰魑!w79UŶ8T|  v2&(tٽ4{/IYEDƼ 1&\B )6d[^A^Ow#Icnu?!Ld<9>T&Mh(ᛷ3x >E,\Mt2AV_Jv,.T3:վ8/9$4"UŶkm~It+I9wj&"~.\9΅Gʶz%/L�hkԅ *M]!.r$de#: 46qY@D2,1,ZYbx6%.%yM: !\5%6ٴm42x„!J' U$##uuT\vNkԩʂNN1\L5bBCWZ~ vìR$Hyicb&ݺmPc:( )зKEӖ׾6Uy.lqLָuBJ29e }^ =5)Y$d]Zls9F>ר\gl±IT3j})@9.Y wű3Gh[L�&ڷẋX"i?ſh&ڷyK/s#Ow}a*d1 /ocoor/LA E.~_|lqdr=l?S~EgYkc?Z,W> 's zF!�� �IDATiUl?˿ z~׊d6~y"\^{?+?_NfFww7>ϲ񋼸ȩQA-~/n7x 7GP>˯G|qٟWhx;?8G~o "]kd[kԮ*4_~k|*g>wE2ƿ>cg)tK4]]L<7fw1^�_vV8)Wk<$wwek|UY=l8>GxWh?WdV<_wg>e5ld(6z"srYBg+  S_wQY8 zQ^$*6w~>«qN#,8/Y|yw_6Uckww1>}/ч-QOc䥣c}wqWO\4$Wd'&V\MpGj;#]epcG $267̣umŀpm丨yqHFOJv\PoһĞ n4R@K1YBI63Z~$51Կ'tBBhʂ7xDQTw0!"%GQ T+JHInN XW.<SΫY>GDZ5Ƽfީ]*9ke(nPS5Hh,zء2q'$b'8\ ój6GP[$BAcpH/Ң(mmd .!eV *bKamp]HהXo$!F)b䎓ӝ/`. _l:i+~zvC%38}UMңBh?E;<!ؠ,ݶwlb:D ]zCX}9{s[:kh>G{ETY)*:Y gyưG|qoBR\)+G9bZq{,$b~b3Ǹ,򺦈}\+UN"cKަ>nij<SΞz"{%XøK.>\l+6PH!QZq0aJv4g XӅd|GKXd ̀*:]Y%;F\r #6ou9Q{Ӌٝ,{)^�}खMOI`qeje=Q{&l'̈́"4)-pOp/*됨 ]2ײ>IOc$a>EL9I&E1 :@Q#O~f9m5X*DTNI0baO u bKԏgxcK*l;;AFr<t*]U] +-,JJ꟣ݲu\1Q CQHƢc|~9ڭ6Yy2X+4<ó34;nϛj(P1Kw-,PKAC|[3G5UɎ+1Ce/abX,<9Brww'4q=ԲO)G9*[ ϫOȢR˕"W#Ӗe"y +};_7=d0\*▎]c=8|Ge]l65^Yi#_`QVAN*;Dïy_ߤ)hfi$=Q#o΋%`5jffp&ө`/nșV.siθ.;]tw3ȋVcK'CaQTOhfISI&kKKdp\;scvI v)e:Hw캎?Ǘha ^Bu5<iA-ҲLSV`^ey.XZ~ɤ_2\x-nq|Nf3h2jWӶ&m̿C>!VLI.Tveg] n1J/CYϑ 8/)f,j6U:#-Aonsd/ :@8<<geb?TRN5 x2űXEZ[*ٱ'ctR = P@W<!HD^2Ǹ<4 vц-^ "O!ݪ׳!)/GdsRƷB4=T䷩4Ͻor^$)$ bZqzԸަ@Bą{-ԎѿG.-5lX%#Kog7̓78I9%GI7_"-b,t2:3n�W@,,: BqN9V6oo8jǏnOQ˒nUYXGR L}w^2z+,+=|0A !}՞\<SuFiӢPQ qMFN2Y%|gYr`%rg6ֱfСH:AV >OpSyW<XבHgTՉm4d6*2k}[vpu*(7"/!󱛜xuT9mQN2(ߜ͢aJO Enj2Iy5aV3uP鬮GGPphݠF־-Zglj6MW4ѿAM5Mp͔c[RYͪ:'ڙaAeŪ}g, ΍2`Q.,lBg͑NM\e])wGLJo1A|0 9$' Im$' `¸|V�ݩ\᮴F*aHΜE{{2JUqw~blרrE=6<Ɩp6%m95+r7FǽIAvL8-/WD;YWl;svᬱbRU?Q*Yv5 p[5z)iӈDj x9.Jn [ݚl~f"+!ꭁ#q}c lg.]YN\D/*ۙs0NBJL1lJrE#1lrˑsѲ&V^qߡ f[KϭyS-;-X+yڶt\cy9N4tJG)cݣwqהۉ <II$<;39= e Wr9]* N֠�ĭic>%bsmEs MFgwK9 ,e Uv ۙkgnfE5y.YZ5F,I+*TT+V1Gmʕ&G+79<UkC h^Yg+ ϯ`®b[XtyHfa;NfԹ"O O_hgU,۲@<xokN vZH$O;P*c:|Ƕ]U,g}~[H1bYYzO@(:֚XUDŢ_>U3M-υ,QXJZ} o`ֹ0LC$59ǝ]˺&:ճZv%;* I7_eI3Yh&1Gh-p6J/:{S=<o3TTd( E2l]*clVh0.ϘT6 6O-,;mze<O8υ5&` Lc D,%+*?G{7Sv RXYC#>‹ձ*zfbdγS>,__PкJ./0%1aAMuIz: ryqBWig<CycCʽE , //,u~!Vl*rvU'jQ6CʽJoҴz*KTHY:Gjm2zij Ip1YvY ErTs #~t|ئJU;f-,@ژ5̐ZYS Izq6֩P b:63JX.c6*] n1y9u:Ya-I*԰aQRN-~aagMک 3C.`<6cW4]'ihVSfH*<mV'Ti8 K:fS~?tWL$nPd#ƞ9RY5 w~BQgF] NZ+;&=L1.73CZ>TKU _:*Ҵ5VWsJR:@SY "Lk'0̅S C.+3JףTuc+9K40*1ǹH&�P'%:2D^�*8zY:ar,WQlJ@ kaF9hfɈ8rWh6Ew?c-\#G1z:E]a arf%욆F{pXicp%PT?Jq9ڇ^\T'3 S^η)0QF`AFY][v؀ Ν;{m{CcOlq,p%5dFKz $Ta*FїKVcnvz:FKG)c :T4q=Fiۮ9D՘-ă;CoV؏U5&8+J@=tRf\W'_,~ Z{)( n)dJI";5-蒷ޞ1>֭ݞVW)C`E֨sSzDty&:0C Ξ=+Y5AvԀOkYcSdjh+vMUWoP?G<mdOt\ގIz*ٱ)7]clIxE2 -D| w1I<8N_ht;sow$\Di5Yِu^%+><tT X^.gglʸ,} J=js�k=$eubXF"sǵd &q1\4岣E2Xk0C!zVVd (mach|aPPsxV$d+@bS/YrmctM_ĪbtMp I$ţ ݢ(e5+صuK4]fhҝX/op2V)p,AjoqLYNl$nqPt3Kf&8'3­0CoTӝ̘29R M-;id9yIe#Vh8xV86MN'dr|e6n֫: Z"bj[%/XwbK'3 &W3 )7wOҰ;(G8<A/?N]ep5tAcF!eMd2K\yǼ:<}-:E*Ni HL[7[`LLj;YR~.+d;+ZXa�9A?&99|:İ[oqn \ Jc::AU ]-\d \Г9fdLYz!e5<zVWNO2!Y Ί8 D|fk>+?x,L5Ȉ׾L9EŲPl<(н 䏔,(?fzW9BXAAïI\NQWb1 uP@G`%; QJ[Op,nJmfI8G3KzJdgD鏱%:XȲ4] '8K,K,&iD$)f8AV$P\) ^溚O>kyܐma4]oV(RTԖ-i[NJ֗ iȻN~ EUQ(h$Ro8pjMJ>(e-V/qѯb{n$eHV}zK`d"Gr;<"wդ: �z )T*nFV 91ѭ{훎\ d,WXϭtxKf ?utfuKֲ@ }[V"| ?f978H. Iǃ-_5 0p6U#M`p4R iZ& U/r"T5һ=%5d3)kYogAQ3 a{Ԁ,�[u(8ʈ1[X_7(7+Xfj6HODz5Vy.ձ0Kqnf_\ug,%gy]=sRH"L*y>�XKeݢ N`_3D(+B*Xw5' AVzd;T^YwˣTU2Iak:hwv?`�<&Viy57%藑e,ޥp"Bb+ey.+r K:-\/Fjh$=M\/pVmxENף5CmAV X]ێ[-r rUc j@VA tpU0o6n3ysVN);zM'ܾV#5lԳJ+o>qi0?y}kɸA\m,^ؠF4.YV0,қ˨]<m6i{3<sԪT˺tMU[y.h/>O7IY mhV께SPsaSd MMƹnÈc_táTe$O�ī>Wqhn dtW:G VJWrYe /'br0ӽ=NDey� NP_ /M-}ؚܶ@xC)HUah^J Y䔘ʡqql|jxH8W\s7-O@6KADhw66 CK`J (qQ܍61n;~o bEW-lmY 0)+k7yֵƅ>9[ 2@<\ ϪyPR7:+(p;Az 6`h6%QE^uP@DNdC>P'(ܰe;ZɎzqt3J}+6bckPTmcl 1nMOEyhD}ꁋMpNF9EHڣENIE$jX 2'܄!TȩcM_`k6`rҀ1\uʑ[u.$zR'3Ymg.˄7GuO_ΞR "|-ZiݛojQ7C(zaӿcG~%;˪'yr=7b 0NwD~ujG#WS x<mA>c,{*=jc9qi2,ΆַRWQ53g ϥֶcZ$+pq{Np~*K[jT'bX8V M ɼr$@iQk7 2_̿'gbZ(GGm#u)DF4]=L`<8-pH@A7Nңo ׆|8,d"Co;oPOHfNU 9Arn]81sǸSJRsߦjN):qcм/x_mڰmfI$.' L8 nZ6M,3<gXTca#[ZOp*p}0o\g ]9ff@'3wS #4hQ_aMorbs+4u3pC#t{NȤJR~r*B.G/KXQqFSŶJw%-lR-ȩ^ nl;5wb^>�� �IDATV}ŢyENY'9z' VMcGryvE+}id\=[Nf;Vy.LxztG6 $י Q>*M"F1(l1rLmab=fOX!ZYܱDRQw6.gVX5+KL36l.|N_ղi&^.t䴜Ub"@/<YZ䔲,\1:֤xJ�$fz:}km_qkYY3#>qnDtL[o)h&Xw ݖٌN~7KđUlgqmUp{H#˯X/dԄEo@b9 J#dmx*U?[FStd q|* w$7*̱Izh`wAAX,Hd4x12oPs"-Lw7U9�jY_!kO^1'?RFDv$llm[5܇v`°ܰF]bKȥScЍ/sCp"oݣr|8{δ179K,*<NeڃE2mei%}>Xq(m[YpdHfv}s$2+(.$|Kzu8]d2`qH֖HT-.KRZw ԯJjܠ^d"ArYB^}\luΎ_˺5<7MM${ 0hA19%t3%@Fhd} #<s/�'?'ww\Gl>Ɩn oT;ʣ (c|xk5w-E2g)h;Y.|h_SN r i3oS^.a Jv2c[U* ES(ZIɨodHHX+װ & ;c"ϜZ$@79fz)sF&T+{qRjds.8}S}56C%ou\hֶS�깣z3~<K LӂL w=GYMY-# CC k ;pShܨ4ئ<jub{ͶOtzԺP=SBnRO\e <[ŮZ* XnC.Tu-]1K@9 ̉V$bd`xHoaQ+`or"r"ORLѽGCvd[?86UM\aX.=`SRޭ&87 1ʂq*?\$ nG$زYdkbUsT¢ OWN4a{ƿ=Cx?gkYwqF&~v#Rm+ۨ?򆋜 30MݸM?[ۣ~a&Vo.I/܆^Β<r,MZ GҲ:Sf�&|:īC.hQ,2UɎa}s*Xǚ<,W$[O\jg8/Ij�Zx1Ku-}QQKAm"$Y!"K54r"8�+9V #VxC-R4Z;^a!{&Bx)8{y\ͤ ve;14vE,mE嗻TX*Qr.F0I-fY+7*OR0ҌhMZ)L=ʥvu{}B^eH鰄lS`\፲C9;m磭۶8O cI԰‹Y)aR[JZ+ K!Iw%(}-s\LKr.XvXY>NDB?oVTkh(&1kv459I-ӡq"?tpROkiNnϋdn 6IϺ=AIzeKM(K^T;9WrJVK}gxYb\*ndUC\j /25R > ѣAF2fX5"bնzPKIO_5&պId2ac_JvyUx:έ`Xg%Y6UsƱ-I.5)ژw'$uZcgl.[V>Q7{dNޠFP?^.Opg;'jJ:KR%,-#g/=b\⾗^PB;#DWGE=$iMɺhUS$*&"Og+-gO: ֈ63hE/ UfXty-!J2,K4g){)ytң)K1>gRS\YN;#lcq^ۅЖmaqNPHI+O&'\*X٠7婇ї܊3ƢB:~G PiwH6oV9W L 7$c[2Ka=c|:'}JVwĮODnZ@})\LE(Jcb=$G-)g8F\DЩXUVf=4jT5dbc qXiC ;R3MaJۙq]LM 5r(wߨtFr"Y[Yn:<m9Ώ2PN Jy vge9)]GI9&5N_y.21JfHW+H=$R9?sBu0#o"&3O(5 r,igl^ lX$46WXL-|%8,͔YAwPǚ~i뜔b.\EkZY(y eJ#`:U%ڋteKTҚY8ڃ #uԡ.pV%\+اcV"pLpƋ vS*x/ uMQ8n:s\Ԑ[*ߠ5Xױ_YַxBP`o.i= {ag Kp:poݣ 7E8St/<I݆oSN%;[*Q4]+5TnfQhV6.J} "#4u1=H#^s<ΜJ3CP3|\,W?vnrkb;KAg Z':q%fzeehi^rc|޻/M曄Վ9-4bC2 ^Ԋ'6^*^:!PmELTlŜqo&%mdHs*sXu` ,~XQ#69} +HFWOvr6ZA.BF_Dor*u(d.e҉s&DR UtkJ.Ң^> ϐ0} Wt3zlb풵p-Q .[p ׺8:چ6UiwI-ߠ~lE7r>Ɲ6 dlM@ZFx-yvYZYDTZ.tp޾.etkpq^{ P<ƖmFXtSLMZ H'JQ %BtcJc KP~ׇ],Ftv$PC0Ci6:F?c-ˌ G 1'MWhJDO']}3fIA")kCJNjT^G| Q\#c KdgLg>sg /pZ Z!I j1!ŎuME ^AGŅIQ-Ԯg,4pEr=CBmT/ݑ;,]*:B$꿱\E QC/<6 8m aSJ89.ޫ:oYx; Z^\[6V]6sB>Vh䨖9ynVlPnn c.'8' Ꝧ_Ru2^.˄V2qf:](:c`Ѡ4]ie`[<ar_ϪclҜEfSGjuT[qh~\#=Lϛ\]UK˝,T?=V*K[\:M^WkU=G+&4 cHV$Be!9%wyr;T*h9UlS5H$Fh_YI R%{3ۢ4MbH|!}uje哦Tͣt哣K, ġ,u6;K_|zaa$|> ak[%>D_$|>D-zY}0y>>^{索O'c>~h<ΏYμ<6F=?~g;yav>«9k<66yJo5l ;- G=_}[9_j6^vj6Or1^yi`/{:>dE!f4Hf0f8;CY)DP#KJ,5c m/7b9fVD{UE*)EV&&0FA6aRi LWT2Ae8H 9˗/ yߗ}ܟ/.c?pe7/QIm8?Yg0JӜb4|ϓ}|ڵ|\(El4`Y?$g?a!}_%e?f]c~q-}[9'|5L'6xoQL|E;9x=zg}7I79st_YLJEwmx>~E~4Iw'_XNA/ޏXgYr_7r} W~@_}\af>f7ֻ?Sk~~'d|!{p'~~\(񿤬/͐SCZ^(廟姛0ueEu| 5JNT]~%Z>~ O'Y~K\}'/ep/Ry]9%VY~ '=•FZ>7rp%*ӉHZ~$!R>~~ _v_g>JFܾJs +HKH*' hH໫g|ٯ Q_°sl.MQrf@ QNt(drg,C:x"QbwTJ5\^M)fDc]!B~棋nY!U9P΁{"&]1ųb&Ix0ƿJ "UN$&dpTPd1MxKn46G%;heW+΁PE5ZudA06Kf5t1eU=H1#:NirqbMjdtϳSf?E\i_L;#4QD D_A޿d?'zT̲q s5LI?O4EA'R(]Ԉ(fcC5c=>E+FT%,H~IBM sljbk+J}e_!s)Yi*v'2pXI<HXaJˢIuT-s2 '(d;cQN>`et G|wjæUGnu {"AFZՔ`eU𥛇lhG+ڀmgl5Қ6K cǶHJ3Ea0#iOϐc=-rujmQՏZI>w{a4{G(Vâo7Ֆs4.Qzn-^p>|~+0&;$bgԎP<NaMe-ƹtUzTR^*և yƕ>ZP=PlNGFp[i~"=$PLq't;$ˮq(uWfcd0|E^*EB}ן G%f2 Nu$Y.>_q*s"U4CWَ/O(]VZ#|.4n3X{ ,hCX]% #*.`>gG#1flP˴EF&s6酌2-HnvT+#2Mn}m4"EfvL!INׅiL ؾ=?)b2lktsdPB"酌A4'3K& x`TK<esb2j i5fZ^3h8>ĂR=N8.7C&ɨCi! NFƈ1xb|JE<}8- wFo6xhp1 ";g6G_k,`Z-QpbUCfMi[E˨{yf-<0,s`~ S ZUN(ax\|LngLE3;!b9oQHMB,P̈::py>7.N\ |#2C9s%EB4$ KBsjO9Pƀ,%)G9gEKUz0|>?˜ ( dt Oo8FCs&B{e$[ oWP) A2\^冣Xy2]x>!o>Of}SY=)'&$Jz闾:Y]ĭ&[A]G^*3X0 $*||^8IOx)OΫ*@=;O*Cœ/A %W['F6W:'q;F;yF_a,AOu+|*}Chy/y+W8&j*ͳR=yTȯ 3IɃ.:i%lY<Ù3#Kv\(I92G7F_lf{z" cK\#+o 'oFIԓ6j*bIV&&L:  h<nA(*8{&//Òg$|pК[J Ca1v7a+-=^,ŃOxpwP~MP_RZPt5!N9W|eZQ6%"2Di7[q63`aI-\#̓fNC׉F vStʹ y3ƾ"s6rFZM%‡*z*3Kkx97Di GӂR KvJ-9vPM6 $9.Yj}="r9ɼdVޞY9ʒRIopv o U53lb?�/m' ?rn#ׅ3->AA5dMoy.ÃJ2"rcD-Riqr)1BWGE=Dž`ok64Xgr7CБ($3&{^1j*\9x9[c!" *ILP!%hLZ$ B]&+|ƽ0d9C!-Pƣ!g7, `5f$x!R)s 0x}yW!-j-.!<b䞽FoCDo2W&9WTx9rplg1@&Kj(&(4�&{TQc;ccD*M(av IMu&Kغ~f^1#tQW=ΛiTN<۸x='E/K7[YvO]hUNĿ/c,zzQ&cGGU<K_Nke}Č~/8KoE1 Fy\;Ӭ>*,#:KakdY% |8ցcVmMǩp7'瀗WWSl=(ɵ  �� �IDAT(yo^ʈ2fٹ$JyiɁ W:rVҿ*'wIqSO1AA3'(QL "V ly2#p Q$ ՆTEIJ}}T['A]; ( g?'DvP̜:S `7z*0\fԄ(9D߿#6؀jwi+00J>t5#K_f&̚e]A*X9:@Y%F^ᛂr4K{9}WAߜ%{\,m4FC>d+w#Hz TmCU}r*ޛtl1dOlr ;L`,BZZ,`Bu>*4q:/E^qe >=^IJ}r*F}mQNejr-ΐ3Fj3 `WyJ tN"pww$fBJKC�K<IWWVi ddZ3,SG[ST-<lSx(.օnТ7QYj[8v&6;e ]+ 0:3RQS7% J;!1d2^?DF*{sA`ɬG-QK�e_EF{r^Y_9FǓ)X^Nϒ΁Q)_ M\:Q|ϼt-4oJ:,17q$E?֝?΋l(15*3Xp~ʭŨyaJzIB:6s 8\9䉄d9G@,_1dUcF(LKmU% kꦨ;YE xa"4WSp_}E}IND .p-uүpuo[+MKɤ:˸K7jՖXZ@Mg -hvƚyG(VbNa dS2d&Ò fK~Zi0r1BT2MDcDH� VO+60;R"b4QcIV ':Dn{鶃5GV Syha(bF.,#2@(E d<k&JTϑ[6Jy",͓["js"/iiXPe"eH[ ::IvZ5lm\ [f.'zbF^*R3H#kQtP7L{&]i)8C$y'ګdNk.e 0(C?Ne5XaqZ#VRNHTBJl1D4}qú j݇2-ZH( Zih*4{mX=6 Kd̓(Z6*rpMW.C15tpLAː?jNW@L lGhj!pN 9vˬ66AA@ta,bt[ dCDZOK}:FC?sdV7jz&ɟ%YU,:[6.3۸X,/e7s!KڦLgqbFγʦUS3Mn*K'rEؑ2>AA. )q\D9rE҃2>{CѠQrϦ^J3쯤(TxG9l9%hX}Vz-0H:YbFDQE!$+J΃/-@6G'H9;@ڽ :/>*,ql[bfúk͌( Qm&$f(Nju|ut0Wsz0ưy=&(9̘0쾾URQ=T9}e1pR+xF(&n0%9o\Uvpgky{'+Uـ)? ?<7GV6yLPUxZY7+b_yLPʒ/y)q+m\Β=L~N 9LIEPMa%fAO�e9@ckz7xZ06Aqȏn,49i 9T±^*=>*!G){sL/YKsv qcKd?籖~M'IX!b++~¡$3>Ÿ׮G<dS'SD7$ X P.킦@U@(΄,;c! ݃<)axBY[Nw}W8ps<'-ʩiQqd0D)M+諦{[9Dž; q)˩sznt,殰e|&Kʄ1>L"8䜖otS75q4MW{GJ<IpA}+Yz`::5Z0@ n)zXvpM׮p )@_no0>Auooܒ]Ë< UߘR  j*Cw4If+ɖZ$y|X![E ~'oH"&+Õ5^k">KVF<@ ̐B:c&t( YTYϒt6,uPEM;SL&N/ng"HθU;Kgү?Na{9~R/ů]/<d˶ӏ3Tѳ+[WI{p-RL]Mʊf]e:ro_K!7S  y ^9XV䲙N{~=N8~Sˠn#4ؗ΢u2Oh'z]91L̒:&T3CfoA'6gz۰yt ]V&(h.jLIUw�)V)Q!, 36*v}iXB0= [�LWRWy}|#݋MskG5AAU- GE0+rEQ1Na;6,FU5B|9oHڅ]LvGdpJBƝ d1F (:["lP,?B2f84!P٤!!"m8ɔ2ˈrUs_p3zg& $?WSI_d;7^d5<lp܍\了,ߑλ<lF4.⃔nz!Ȗ*HZstQSEO>G9h|.m4Lim\'5gr!"'7_a�C:--9gسfj誢r!VS-"vO*z V1_L͍D K7bgY Yg1dG*RlŻ%M_B4QYNjI0Ώ4D+qtRRZM�fuڠVc\ ]W#Z;}̓Kr"bDc뢦@ir}ʖH*kbFJl(Kr"yja*zy#4lC0%geaMS}Β]y dl-sipJ;W<6r}'篳1|Wk1Hy.S8@YLO$(9~r,>FDa y3:8aJ9v$;9oNvD}y䵨ٌ,G9hSh0nڳaNʽ!t,ɇ弩ݕX=Džie۪@!J)QrcEP !|eprs'Zaqݧ5|"񸫯 LX f?3 Mp!0\OLr3XEUD^ӱ<vlnrUR 2G Ѻ&aԙ"tURrl,fLCރ<a9t}AHb*@Fo2%.GJ`1rQ1I|E+uŌlʫ<No92*i>fo,?aQü;Bӏtpe\!(2GgV7KvX%L0,#X+d#Hq8Z$0<I^ ]gؓi `=j|Ȑe2-9,H@@7ջ41S!ZLS wQDGLmZ Ðf/a8sz#!"!1K˦[I.;^r`)r+bsMyC3-6r(W!/@Le �۸8L\%ጯ* ; zV'oK=1,5i] # �4SI[i޶(^͖\1E*n@ b0GV91Z8g*a0ty2o^zao 7yf1h*9B"dx1ߘT_*C\ o~wyxAQ\aK=S3/zw/?+y"FmJŭ(OXsQ GK9N{`G.͌6l6v;Q gu\֚UO~`=Zdjzwr޻H6n:'(hXH5ډ~/!J.zUd44beviM( NIH'1JMuo=,ӒUЊ.{uMA͞*ze#h'(083*um#ơH2q5勤RV GhfV#K P!?\ۉp&JzWNTA%eÅ-x0P wTLiU\4% {#(=.WF1"]F{׌sd R_Nm~si6,Q 1,G!/<4JJᕳ3=T=`aז83>c9O{##Ō<>LI f0YRBm۸A]mzT,0 <m4H^@8UVOR"yJ]+Rl8uj,aX5trBë1,9&ϤaUGYj~#V"W-@QZDideG.ݣi-ssQ_i3F W.GmqZq$ncX/QI8!T[8:~;^ 2΢4*[/`"V K6+KCD0.nw W4^2f˓ lirR̞SSd)vr,ي5U0<D#^a#r!e1r�ego)nrCH=RH,J h9>+uL]qe;cZ_:$g5X1#r�T`Hzu,l|Z"Ԓu5>cCI( 3UFZyÜwP{;n֪c%+QqT e`<ӲfX|%8#ҒO&Vm1{ Ϥ֕Q3sWl 9<_<Z[)SA,MэYR4�4ތP\d:n: D ǜ$uԈkhff>BSurs1űe"z5%W82I{/x)~g6]Z~ HۼTN1>`l|4E"(tP.[Bs)DҜ$_W1#{9š {ws˖bEKLjNLK;l7w+n+ݠ d6lsd!P(;K�HB諠,Pyg5ڠR?HKZH@gZ-bq"TIJ$ IqeEdJ4Ғ? BKRtVE WDpS)twfo@=y2[i4"/4Cg0\i"Bx laJkJ1#?KsNԵp&C5[r 7^ C0÷+c,tJʊӕn7gd~?'fɎ0fJ K߾Ÿ1Eޅ;GS޹W:><Iz˹<9 g(>|7陹M)sk,?̻٨o Hy LS9'6dd:gC(TA+d\WE*))LJQ!I Z ۝R% 0+3)z'nw4®߽7$6rof�J_ShZmK@{b]yA=MJ0I08*(uÍdQNmgPžm�;/BCKOAm4.;9?i=vPVGG7j7-r; 9f,0ԕ PfٛWI(M.. :6@ɟ >;, >7~O{cdPur,Fإhd oA>fn_M)x[T?_xjY<y_'s#<UA @F nk=*#H.y"q^[)|*Kj'Y3- \b"ːSFXIv(T'!tܪ%AϞ =Jx �yŕWO̻%ce 񖮤:6B<Qڷ3 ߴr�&)<՘c%Lw], *&0-d's$ӳj-rW3χd,["_%VV5@19gأN͸VӲmUL8:cCN{ "0N~aH}#2@̆ͰWsnW]YW%N-;XRCaL{79iw< gȱbPsS?R/vˏk6,P膩M)skR߹f2X2/ i,![l7F60C6쑴XzڮxY `NS7}f/HU4>!6M<΢rP^|%7Vp@|&͊D3=-f$t,#P=QlbFqX QԝY\G3B c{{f˼PȸKNq8]}OJ+͈IRO%ŝ FrLs24RF4_Abq FT,A8Ts#4YQS D 76 )Oe_V1!Br,c a1T+!&(h;6}A'GntOMG9t3-2-6jL9~ A1Kd+ Q/q詤w#O.G7m{fk?Z7S_p8O9|a/|ĥyc_tlY~9 qSέٰ8b Gi)KzFZoLpEҫQ8N!7TI34V3ܚaٓ$)XsFZ뉅:<q!8bRَ8'u0uPl5؄b歑q <953eK|z"֊fRvWLrJʢ>Qƨ. nӝ�dm]ՙ`%|nA7O"�TYA dcCi]tRz܀Q71Lihu7 u襲{$g3CNhP@$m$χ(eTc w]([5.dy\w#?@h&V^0% Y8ν}%eӆodůJZP^NS 19\#wy?7`p.ܱ2~Rs_U.ٹ]|�� �IDAT vȩŔÓ1*%^ |ELU@:$O}W,ge-A{`|y`=ɷΓn>2!Gw!Gg=)s)^FH?~w'~g}R.z(={iwXNO>㟖ɭƸ()9Ŷťϑ%_`uF A;,..7Z:oU&s#>٦bD@W]TE~N`op`dUN+S܏Nf YS *zK7@g/_*]-Z׶Fm^bm[/#p>kyF iܾy7hׯ-1 herüCUy5IںײttL. U7S_(ls,)]ELI='{F5 ig~oOl;Mnε'Fj5cDԠBq<Tj9+u7ElኄEv z[g?7= Pn3|w+7Kʼ!lOWھT\CDYUp?VZ8vݜs9EMfWByi(U0-FZzAJfW-ΘsUUFC# b:GV>*Zi KR4\!"P@_ܗXTE1X'::vsNjE)ݭ֔(Eܾ"_�/];dqZʚGyחwU;祫e0EEYzg"u{9=M"εl"/-eY)ae hkP<OurO MR%a 6B綝 Sr9Ĩh ۸hRCq 詥YbFh 2p(rJwc{T6P5pb݁I򯰥qaVyS032A*bW$ U4ItVQrpJ[ILHQxV<9tEi"bd}j k`Î:r*v(u7uGVN9@<<%c?O H볛c/ÝT%ň#Rp/ d@+lLXbrha`S9WȸbaJTB\Qb!*C<{r`l|g9oMټfr|9__įC^L9.?ݾom. ` yymU<2醕ͬhdG1NHL(֭kM:@Y?7Qߔk&hr&cLsVOtGW!|&eL?;Fi)W=zWӽkr])YtQMw3`G1F2=0p;biS;йHW_+/++x»+b',!4X g,;^*^rJW(\H K S{5Vog0::ұ$S3 !F`foQ #~0' |w~B>**W.\}Llʩ66Kv63)Y$}oBɩ >`]30%6mA("%C_)w|,^VZ˼pٛ΢y2ϰ'n/<kyzùc6^Nq)#Rh\yT =wy8FZIb;)'sAI6~*Y}Pa&Qo-nu| KlhY #6u P-jX>i5zQ<Z7*z9<Mn}Ghdk *,d_nYjOzKMP jY!A5}EaHI$%^S ? ` !?> 󷢀zb+?t-NBSp_]dWd1WG~NrBa;c9' d,+0(&O^=KH& 5+6Q AK\9rbHݚ"Z9*ݺtS.fIJ2n{HĉLx7Rȁٴan͖'|s9s]z;9o0–2y2)$~#}dX5)˙̷s@i^gK7 a6Ab/>EdT9V�e"WѓɼQb>|C-22.{nPd!$^M�evAQFS~yZn10A~NOh$oBK<S B3-Ե/4˯lMX X9:[d`ȥ3NtK&(cUAQq˃C6s8уIv."2A;&>)q'!wO*UݼApaJ:T<uPWpG;-Xz}3 a Ü;kXK*IO0 CkG)j5irh+fdH1#:AA2?KmVQn:g:< KT&5XP˅+;X^a,E}5(bFYf6)̳:>EW޹w{;˩,b27SɅq9y1JBo()rcE ~s/1z*aZ~zMPL5!FﳛTkKZ>*"iuQ4ՠXe;A(a8 928m(ѼS䘗2C}#S1}"m;kd5P"x :8dmC3'(Zl %rڇ(s$D\L8# q=Tc6fqSiTR0#{;u ?b>*lJ4C]\*fs{8#AqZ=s{Ӹֽy>m4T+#}~L w9ƾQWX$pvl"Ҥj;cFcEy2]TAWCyY-+ePkodm2wʎ' �nWlfo_KWzE[t ]d[.K={g9oԞ+;U[d)q'qqS|:{)^{y2}0vF֔Z}A y)³DŽM,Yu L}/*i)q/_~i^Eһ6vY#RZ#~휹JV cV\DWU>#}ut$6:R2Ԁ W. D"Liݑ% Cu- :cp5t"jXw`&+S51i'jBŠp]vrh'sdUsݭ"h!ZL9l) e2yPWȸիJ%W+ w8L9NΛK/dQ֤V55w`j<͗7̱\5B6׈KuXϭmIz9%[;yds)d1jntʹ.2Ҧ9RO?aIf۔2ҍC/Kˇ(%*%<Gb.8&3۝72>c/2-!t7+ZBFyCN/!ϩjͤղVm4:WMwmM*ěJ",f-'jYI7RvrI?VߍwxI= wUDi1}o*=üH.]`<awSY°"Lp.T5Z:Y4m4s<J{P~P%ʨ 5b.s˖'ɷn#4i-aXuy22Q;dt�5W=Nu9cn:OzzuSgu0W~2uUKbUGh3MؕkZ6mۺ2-nY;>:_M-PvGE쥛fv9Fd WN.G 7 U3{K$#nؾ<Eޯ\:˩b/c@BU R"*鵶搜\Gy<y%-*unq2Nߪ ;CIHUB&^"*xEB*ω846C;ɼJtJ-H bp(/=(+!DڶIJh'FHY%/6wR5oAXA_ӛ]A s,T2/=BS>S.i Qjpbp\pWEJz5wZh 0HfAfœĸ\VDt{xmkM- %C y{rT!qs3[)Q,m00p&eYc{RˠGU.}T0|;9hQx'd-/]}s8| wP3 g3kS-Ic�:{0 ?L/Es>�ebΰgI <ٶ3Xp&wrUHd~wVUTU2 utLjCmVJ+d-عc07󪠱'[ўP�))C}&bxcR=mRSC ]U[$1'E$J�eDt :Tx-Lkg5)yÏW&PCW=0+9V/prKe>~R]VZ8aL$KU t>4~s֮^B_Fzѐ0oqbs)qfɼ=61",9^5�cGxF\;yi.=nZ#Or2YOlx%=T]aK=_e\?#of3ˏX;aJffv2LgQV闡WPS' 5^˴:gcD=\.S1NznHbzb,i�{تE>QQKgs۸Xx#/ A yڣ_GWzJs"n_h;c|q_ c_z=y+J8 _w!J-͒?a痸%I ;w]|gHxQ 3R±?�~7ʩ&>n.ϭcm1t?gy66_?Ͼl?xO.b| Wkkx{$K.sJ<]A_: %'i? .I+fU<?</)O&Rş.rĮ/?_ePGť XG\c['[37IsdRK;9!뮳_ߥ= *z>dȟ|jYe7~1n& 96܅,{>MO|ځt?f-oL^ߏ)gR:G֏C@n-.ҍ,lgߺzckas ?!?ǿKci Wf&Zy~;˯<Kg|vu| ןWGlOp\#l|!_VsmAӜ[Ôl5t}I;ǮfY7I~:YEYb=ߪT?zbwEk7r|?q)ep=BG=c9<{c"U=LnaJJL#U|~+{{_*U[:7yqX[BN+V& iZ'bԫѰdCޖ|T6VOeU1gtB%xIݺ0 ,fĚvƂiaH) I^Kp)2FHAđ::ԳMAPɼJz$ N)co))'r ::&:Kv ,E-aJ^pv z ;^_uY<V�eYL_M,Yů^gll+kR[ W ;Iw)n>-eidJ^;f"Fׄ҈2fޒPi-c Qwmܽ615ٲ9LX=MyvʲoA5I 6E?b;c5tY kfi3Xeшar<N\ &xcw` C/ cfrsB"xg!'h6bԯD4}jI*`¯oU.@mHZiT"r]pK+Ǎ `Yƀ:i9R!' AsQq1*.6OPڎ11)u 38sv-< M;jMHAyd}]86dbe{% f<um$}rHH:zG|B_oCP(Oy:sdgNjk\$<C*.jd2_XqfJU_ɲ?I,p{&aϳSHe3QHΕh|W(yp ;Z8|S6 &=6mbsI.e 4'k3U dȗ24j}u]((kQ 7U�Nฟf>I9M޿&ɖc"*@BgH}% 1E!R ijFAVXЛi1,aF|`  {<Zΐ3IXB2gRr&Mlfc dLC{"3& ΢Y&4.jR;MM@eUmTᦻbF2XaFm}肘<wy8 Lo*F4חw)>VPi& |vs,G7O!m3gK~NL+VHh3eK8AgӶx1e±%0MunVzz< [$M*k|% MQ;:m#PRPaWb"\':|9gH;J T;#!K,h5  kU(/. U``$6ʩ!JW+ ?'L$P{}>DeeqEHpž DJ8Y]1ݮr胆4\o" knKzNܐbq,uGCJ0nu!͔LB4MNjǯ7<a߯_Wu*rn@n5QFWCGM@КI7͘/K8O d&&n]TUP6#"Eq$;fCl2H</x 4p6Т[^׃l[~KSPȠ\-d![A 誤 GS%r1h)dٙҙZ!n"^c>[x@]dXN~2gw (sGίy_l,b@&6:?%GVr0nBA ה+kAT&.KPOF|2Uȷd@-e5hVZc|P:Y2j#n:X-c\TҭN}$LuPS`GOe.F"]2q zhᬣ 堡O$BNB (nE7\~K=ǚ +-_u5k񧁞~`[5&֟])i2 %7A!2j2ZºQW}ms ʚꐰXW%6+/HC2˘KؤVaʛX-X}-</@Tг9 {텥ibxMb [Fqv�� �IDAT¯v0|(n{2J˭?i+'(#3ThcɜvjU3JNu,U]<׻|"O`)dSDZ0b3IqJJJe&IJJ}me3u3>B2XQ/#TIw&(9xMa'(CV#\tsc0^͖E( LŕtwR`<TinA?EqTi,<ӯ+T;ݨ4R(+ d>:4F+J{RB46fuOh[W67d{f:'/oIݱIs]J\{X.jQ1@K;KG\Ā(QvʄBL%D*dPF" SNRaeKCVILt!)W: 衢Vibtf`r告z⨋Ah&?.<Tll&EdF@ 2RKfd* WJ4tFGQa>1`)Ut"O'MA{9aVvxI4_3R׊p?}Р Ae,ň:E 22ĭ+]pm_HD-OS/+I &%G.'X98Ҙ}#w'1 Zt<Du])`m5SO+W`6{\AOf$h/HX ڭ P>É:*lP<<S"䢫4-B>霛 a$ȧNΕFEO%TҊg1Qҫڲf(H)MTFv&Xu`O"h:(җq RF85KդVLHM̴QGըF.LAX+ *DNTK\K{;韆8Ng Q 7r}lP[g5b/Fs =NrԙFACdeeР&YgUYKcew:~#dC<ٗ٨[E)̬3W]Oi0Q&4KWAC`cir z5nKi[2M l! iQiH#R8vӲo>>2?z5Dxx CUqg L Ii> .qqOq oiUA� [J_9[|*!gG-~^:Sx3N@K9wy9{Ų[ʹp˝|c"sr'M|1I'y l5}ɭ|`.xέ^ӲK'Țǥ,㔓igp.&|8|.34Ez04KJyY.Nf1 KH?gz4i IN1H;?T<EL,JN||4DAgX:(7|3Wp|nJaD_cqi7IELLNbL>΋?T8 +=s ezļs,1_IG컍O21_Y,XQ$H~@b^p 4)ԣ9ykZ^s?#<^`IOg*'9Npci <.1H-Qw$l{q<N-g|-pq{8'ŗ']vv1pu3Ky !>gغDαt=bYRn>>C_ m4ɈbK j4˰6 .JW!1g63lלnǤV_Дv)Ԉ%\ 8N6Lw|5%b%.y]zZlibBVx kBeiHB&<@Qm}i)s&4~jAԲHhjrL.W4KgJ%8e܀p Bf6!F&Z<=G 5tq"+hYg  .c|Tti<IY[wSLcDW湉prwT{*gM�V8:4tA."V2J1J$'PP$bbdKCE<ʒ_9 Rf A>6k.9`RݹJ,.%`pE)@!a ^šB 5YY7>e4dJ0UizB%:mWncáqܱy͢E-iDvg,쪉 W6)LKsx8LpiZĵ#C"'PT{eéw+^?\qdo*jdy̋ }I,"t1"~։®s2Lq3<NXUHy̅#﯒H!bdd/N**e6)\?raUO.g &wUKL"0$Λ*X7A|mԩ$gE/a/a助*"]M_"V)H& 7QZ%bn:QrеFP4JNMg`E[L, &e+ �M(z 12&XxGkS 93I"[Ok-d}bs.̋9ļ�dMNYQ&EYUo 1vؒKby5FgT\`,wPc|-Jbm.�$4Z$BXK٭u% zY<:&QEu2mLoZ"GY] HH "&I?j:/_c V�q!r9*(ZOXQŎ%!^xgRzeL=%q~ _ mH:Srqf&7S^gu}M9:ALu9Ùd<NaegXƸr7pM!|MRꄨK7|h?`it�X UZE-l%rP9QČx1R 5Ҭ lnVCcd7S,P2e�&5RU0@7֍ [7,Ԫ+_0<=%x_e1Bi[mJqE8K. KqF *$YjdY/li9c`/̱  X;+J{9.Nb lr3+9HJz ]K|c".b'\J'E -o=ϳd%' :£*�|?}5DrxnQ.VYQci] (O'N}(?XCOyx!~zY.,bN_pYWKQ߬䭕u2hY�&#󸴋,B2~hlpa{n�m|r[2V|]IחN,mAԓwp zdgI¿[u}nxGγw,bbn*WsEjeC 3{6~ n? (Nc: ,xigJNq $\~؏jڗ |Hu,nI\YWJa_Y$~}[C$_GoFg16g9+&omGғ|>X)b7~__`A%NJc:,&$Hߣ|ĝRL3#<ly&#/k qrX)u&n�(Wc6mG4:F`hVuuUN't-v  >.o}{6FQPBl?CV~H*Ed])5̩U%#"]͊! CÅ |(l MZ%kh!֬{c2CZxa-Acw@ 2Ց+/J;)􋽔7Y>9q(Dr{ޱ"%&kĹ2觴CN~r[Oſ +b33Nb"+R&gRR̬:]! 9d6O0n*խРYJf>wf~UD?885]Z}U> YBKJ! ^ʧHW^YX<5ԌQ+#i\3.DT*2Qa%S0]Bgu;鄘fGRVw"8Be xn>n}g,n֥I].R-.. Cd6cˣtc*K�i_Ob#4hiLBi6eOZ΂(k.1(U^֠zZ]LFk,4Ql XCZT0B]O XZ<㐕l"52R ԑ~Vs*<ݢ;1۩-2%wUVlƔy&E!֤O1p#3O w2+1iK̪)g(wޝq%ٙ}y ofp4w\RlxZ"#fK,}-^GYOr˔{@Ԉ`,uQ4QTf�EM쬧U$:*d>E,J%.ivmqVsXjE\f3&[Vk3Ium5t&as]i�"* ۝Р[||~"{Rx@\| ReIK l~m}m.y.a|� f.J9MR ~Օ�Y!"  %r=W$N#xTh?`%QZ!eLeeFejSV]:~`p@}:6qغ]:uS)ٖ |dR/y\g�mxn/�7Sӗ) 2Sd)YE;M?otKgJ(ɒz)Ɉd"*ot}LI Ԛ!2M7q}r2'_4T[hKmP^ҜɕߴY ?7ӰtV2;PZ\ΚIU7j="z5ui4gKyk;bil qzc#D!RwYR=cE¯oئVI_;'7$6?!1+svejRNs dgԲFA>ҁ1azUBw4j0)]&+ף\@m\-7rn9Nkv5@&^:�S]OkmF`jTne?/\EXϰME1t*E6I5^+βw½XNڂirK3a-<G;:3]x4-e7 d11@g-dp /aP|]j:*}} բ:""b# /aݍ\T%t4ӘèX5!|kBXCaRM:lƃ?LVУp2]hH3la%VoJz$Bl27R轔"{Cl(6o2/nkJ3\_&5+-0lgf]_uZҽ=MFo:*HiU; G"NNҊ&D8vrPN?!!r"Z1\xU?S28HZ4Ub<RErG- s1l[ as>âϝ"/KB|̉\[l ޅ{p,RG! >S'f GS`'SM!5LLwSԠnP]0KX>L:D?a"qLd/)u^ji5 j!:{E QuBؿ^OiJ9zJs*6O'CyR 8 &="e62Do.7`e_ rDN*˜T[ج6k?vIE0UÔ ꇤG"FdX2[n9+@H ⵷QFFsACdѧ%~ <L:E+HI>jwT0\ÛiT4`U"+pT2fb6DU]F_FqS+tDtd,+'rzKsѶ]ҜQg]U| T*s7Mt0^-Ϟ_RA \ Ϡ >A:| "_@q$d33:p>z &ki,mTirwQG 82(T)SU_ jv5HxjIu5$! x>"&vby,~|2hk) n<"$kr;�+:#N[CG:JfLuI ìA*&*7qya`ƴ*g~Hݴ*z:m!iϒV["d\N:*?v'\=9`<(eQSSIsB N|U;g 衢Lfh5 W&AOhc(g%XNo-~v:[*]Je>CfzI~dW!5Vp=A|?Rq_tR. 2éPB5lQWN5n*9.vI8 c�,>ǙsY-)4eRZ\Tu,dq^I2Fe+N%l|c^>ո/b"P|:BG%6+rm^sbRKX#$5(/eRCOU/}@E *h Dk;ɏ:$QIwu kA>fHQsqCU,Ti b=!`)N9*H~69}+몝ilcWޔ9oĒ4QdTB~֩\ioC}d!ZjT,*9XUE,3LR04CZ=ЕkI"J> fLS{o u u?1`/1DL*ZpclhLٌ`[Fɩ'I2+Rt]d(?} ~f(.@:|mא|.^\>r| ;fJEYUyZ hWt=L c|F誡MTYcd{8XF2ƏVE7~,IAk{AiDt! xA h krzG[f3NSH$2'R|^e8-Q6c=ل�RHET[p({xFe"2OH5cd[ћ+V>7AX7KvtX](JvLM1JMd9[3ُƓTYBH[4VsvL�;ԾנɏbMNZ>iⓙFC%g3A˓d4ROhzEJʴBs9Аϰ%!͌Fp ~hkj?'b,㏧u; Q&#!b4̎aWsXI`9'D8J L(xU\8 y,_řSd}̐ʼnK90ESvS5AAEW YUAB?;pPM+RΪ E&>\ .|*WKU\ o5Xfك(9Lz p"/\*v Wsb tv]FkKXWZY&+፼R7b.^+6m6^!BnR0nȊu4nZE"ZՒf,3'-RN~*B#\(a�� �IDAT\cSX'rLν5;F*- kEXQPaqdء4,Q0ļPJ+ati<Jjb'$L4;gkYHlѧmqBԴRH6?2$F$ÊTv{!7-YrE$4cC:SU!2IF 77SϼYNoB g.NI"Sg)ߝq3udfq9FP·A Tbz>6tQdK"3NbZ()MBnp*vIU@:SӋadA(91a4Sbd+D dLT^pGz:ڴwM(]p?KϚ&NbJlqqk'7i.M_;*q^kxj !qIA$Mwq8NYqEOM6wlNWibL `qr:ۊ2rI iHE|k!6 ^_<<KXqè> Ngj " VR_fWy~WߠOE<{zW\d^GXK;•g rm|2AY/Lfj|ةlX埜Ģ|KnߩW,#,q GxN>j &Orr&SWnHyӊGx[qJpwh '˙χc %ȼ@j"xa.O1p! 9R'.0�4|zw*_nu4e/>?$?啜~D:ɗ6[%(2/OCq'qqV0z%'qyOgj6>bkq;rMs^~L,w5y;J </,S?_Slh=P\Eם|!/rLNNS/g|) r;΢Tʧr>>"C<| 3։Dot~3YL|-!C/`Һ1'H٬Mh(j舘)ip& 2MfGc% #7vh͘FDCmiҍƂeu%DmRk8d]C*HqdvQU[L:RwbD7=1'.F*b@q14)!*5vJ}LT94U¬QuPZm5ϬKp5dF5@F|E"AF<7{DCd+liNM'J}GL S>N)^Yqwg3yo3o+udf|.*^e{ O1IF5 2բ g2^D!"GY|vKwΏWa[B"]2($UE.'1?P,جfE>L0Zڻh3{O2ѹނlх6c49W^x+iQS_sK(ZKVW2ȵқyGP9#vz?C+'t$dK5tR+ baQN}V峀~;p5ZFƜ#AػK*џz/1K*< I2WU(W~?8Pa\iX)!Zy]ѦUI$:FKKEBZIJSΖur[7y%a*:>ʜAP28o!$FOƫ�iLy%3"R(f|.'BDTlT$`*S jѸ(渹y jJZ]:Zi+Mj<y)e09FEfE|D(}2HEPM!g Y\4G"jbf.Fh7ZE?}l0 n6=M)"wRAɐ ݲAnX7ZŲ|6j@2}ΘQ=L$:V2* ,i{Z҄f^;e&I_ڜJ$Ůl~dtX҅*ZChG)d<!1PB`YkoʙB((j}I#IgKX~ d2c fx5[K":~}n'ZpK)YhCy$x" RhQ^^3)Ϟ~T* 2s3sY<Ly+i5O纩l%@6c8mVQQdAbtEeuU]9z8CZxSj!#cڌ:W-: y3Iqh дCOHb1u͓pE LQK{7.Fip2NWN6"gR>6TJ>6DYC<b:kE |*?i6V^.ڕb&nHS ,/f7[mwj+吭iKPIT{[וfܚKEZ<#2?|Kslb\SCf/vh}  �;1\dY.Z3^ k|4@GC0M0<kP"d*_G6Z#Ua1jNZū6s*9zLMeUs":y8)(=l oM442Nrq%G-Zy^ʳ q-xs9ǡ7UCImA"u<ǩJ :ZzPk;LF.J$pwS).کH㼨c0‚t*(O e4t]TG*dBh"@dR>QDV]!6ETSɠyURzV,tSOk!z/{̖sHS&[t}?v /ja]i)Ur=F18F\Kf%fs]VjIZ|K{g_jeΔcV2c9vSS1zZ=|TTsԍix2^%7AMϦƸ}%H+|e AثeBwvT̘KEU S5a4(vu_0.&zT~{)֋̏Hgj?!|ҥwb6W=M̜U%޼,LFYrS:鎕l)Q$J`%~3I.v]E 8Jj�ۆx&3eL}s- .Q2d% )`O1k(oT>]I2T…s| xD}ҮG,&Y@8Z-s~Ww%�;$1DKy!|nG]]n>>}|Ixmm"aʆا] ,]0W0Fu!Yri *y) Ƭ 10@<t)1̚ FXht ,싵{8H730 [R1q^7`iul ]B%Dy2~ڏ].GzNO-qӒQGe>J2%#DCS  K:?Z4Du'y䤮a-j>t2T}fVf| =_J8&9S: cK(HTMW*ʛыPúU.eh^Y5vchI1V* ˸*.4Tf\U G:r+K;-H|?M_Ac`Al7Q\'.EHڸ%fX׬6lfYW:S鬺N64푏FNɤI>ʔ_Ov [25nqN{RǼ$V ]"Bw&v2(Il?՝TnBq.$_z]TWVvcIe ȑo̙4Ҝt&X Q[?K0tG{)pp+IA$"0:βwgYO$IL:I%U&BeMgJYy A|әҖp^P}p>zMbsZRFe-3uó0J'1''uSVNmv PMI;[hXR_G pTWX.@\1+_gsq#Xo睛v] )�;l)$g/'&˲,azڦasa ze;|ΧQ)BI.]Ti96Da;[N-F* A&`NڹcQdʖ/6#;bPK1R1w:[Jd"O=Zth%�M~vq P4Ez-!|5tDq+]2;-ᴆrH o(<:u nz8iI2d{ **q^LgJ'<G]Tme%q?I!_Ty ū*Nkb-_nA#(fE<1SSYdwYmi#h#t7ТL]*(H@"g*u#uPSB,%:Hbd+_CV6FsqT,|uK*_ lEm@>?m3mm$۲ [rw[$InjkdaiHYY[Hm"k Үv�ƖBTFacȖR J崭~ I-%i�k`[-a*JM^ l3`%=S^MSbk&tr5dxٌe" hZBK �>WAY*U0M԰G%~v-/xsqe!6SFuuN~(aGERCnkj86I )<Iubyqh]jԈ˜P;7\hCZd01J\T�6)ңUje2+^W&OHcud( K5"g3VANbȓ^<NZnƎ@K녋^bR^E^{>ʏ+{R34Dͦl\#�;┦>&+ $mw5!k#A ^RUcr(vj5BAڏ狼H1;LPNE!Fl)N/{((DB"co=INm;t2廝Z뮧Svf: s3{d*enZ@>ʺ&KX(W5E EC9O 2l=DA;dN<OM>J$NbطCdaMVҭ?Af:SMaXhYAϷn1Cl z*ʧ%G`]WsX\މX#{bR1T:M\ki͘E \%Mv>(n1 5LHs Xº2 |^dj"ݕXF+$meHmrѧ Se꒏f}q#Xi6ڒZ\8BKkmՆ{)ob^ih?g0%?x#U5W)@em̱ǬY,03N#!Z;_ib8if0mNa-uM҄ !I+ ?sq"7Q9of]gXIOrUnEH! AoRvS2xx*dPJlZyBmE)-i.FgPo Q܀<me*)b-t >rx &թ8" m#NbT'Ԟ#AYr0ҳ4H&"�E�?uQnqpdZJI4Ez5 h ^[ N2ou>իI9F"WLE0f=uhT)}̊g#GӺtEZ,W^ffKIMW[)Lo/) B@]3}-R+i"j0"z5tFp)ȎYF928fVW*Uu(jYYw$L1hk"PC5 H%#a)5RYR*lx)Hkl->n`_M,k9! ϫ]<5kg  q 񠋑FliQSD'QId[9!!@ %rH^jW%k"1 v`aTcZI*2=#؊S)2wNw7zWfIɫ25:jf3B#"eіè<)~D}0Gi%asrB/F 5*mlNTILK~v1yHG-euPB(M\r!|1IF {?l9Jp8(hy,jbc'Vf6 i*,4 4jEpm͓1Vj YHTQutLE駦?WOSk%KM 2CY01a0ҙS)CiD(!>pӊ ubϋGVvm>HJH!ʒè{ ^OKZr.d1Ha ±rT2=T=j:S>KBf092Sa�BkIL!)ꋰ6i -w5,LS;>YDVudfB”z,EȄ.?β**pg '}"A٭0kmMG;DK9 S%L7@:T7Qmd8$k%U)+xH"5aէV5N0Tje,bE4[ucck7u j6ى̦NUR{I3sWҰ\U|KkN >,ػjxV!6 PamT9ZCРll^NJmQ~ӅRi<Nb"]gDe0) & V5JN*NbmԹN 2+E n-e0<.N-"#T9E�G@hh(b❫{X^7 IQa-LEqKG͛SO)wRHRe1a^5t2<O0�DP⮡#G]d~I_h LO/(gg̙ޢ?aŗ(0Zѝf4?!6OvjDNIo^pr w ݛةuÞw9zƀˮ3߱vCr-;PXQ%Y`- dOQ ge;]DjitQL-BOcyB&MQ.~N 1RbȖѧ~ +SRWC<RG:*uAȑ>{[7,EW5̞(o&vz 2BZa 2% )Zv2mZ.5d29$z- 7jdHh<k#u10KOm4eɐB'G Zh0Bc#. [AFD2Fvq j!^E?vӈѯ 3=NzD܃fju)5$z^_ə}p~o*${*Y mjʧɞ{f4{n,5io4rӔRZI+HFe=XK륎 U C&HUgZpF^(m]Ts\!5tg+Aɐ 5=T94R{!$j7h 8릲"pH'M쬤{n*y$ &e@Ȋ \'@ŔID2IB E;K&:{4Vѵ-4(ň5t,N->7�� �IDATo&?IuW81o.g/Bt~4ʮq$N/j%'&yu,q5e˾lYO+iAf:k(O9SM]Q><rUbA&~zfUbo*R]n]J,/@7LVc63ܨ5f}q,S9l1Uztָ-۫%JU^ƹ0}>KDZR{rߋcS7EV[hA !cDTf Zb8{)3iȂhʳZH6Q&k:e3$VO&?>1WLwb&Lg20IF% xcuS [I #;*(%GJXYU}5bܩ<%ܧ"wdfU=?#TJFd8񹉎 jiqȵH>PFz [M(dPY;iZ &ɫ,zZ%RrWM-O#ت%D).ԯ;ALVdmbh>,OBi4u^[4nE GtZ}W`͸baW}6iw6aׂU,g3Jɲ@/  y[+v5܅6ˆp% y@MR1`PzlOHW &Y~[H3Rʨ<ì&_jjL*DJq�S.A9d% y˚VUzjhпrzUdz'aCjsպ)ZG9U&*_*$ CDSltBZ)P$!ďS<L~FQܝTg0NMNg󮧳va~N.QH\ R&fE*+Qkn2UM5 iϒElQN.u,6c/~B#T Ӫ9*BhA z$,_VdjT Mw1}"LؑDzY톳\E|5L dA.W(~]͖[efof0C\`-^350s e��5i jV+ֲ D\!G(Q#ͺk7ҬxU"4 Τ|:eZ q[h'2(y4r_WONNr5dCir&*l!֤L2+'5ٌiLg>5{"خ%GyC?264ڠ;L.ɳVsAG:cRC0%n+',9y^,dPSD1h Z S͜}hzUs֖ki N=#yV!͵scݶ$&/~|7<]$9;n{=qCt]8/)SyU�VuǕ5G[|,!ǹvQ_!d-ߣz9ɫ<,; zm~>R:So?d}Ә +яw +_>5D yK,?<,&X:<.iqyα4ȷGu.?oPz3/Btg3sr$s!qGp).s<9';?C_$_5<.97Y96 l '-g|5}[ -pחxs{.�Ϯ̇)x W;r�E_ -&K~E,Sky^5"_$8m .1VqVd1YJܵs_gR| g0nS}K9r!R߬F^QN}­j_s1l긜qCφ<N]`I+IK 3Ysw�EbYøRx WNrO2wTCV_p% Jۨ+Gxt=w3<ObkI/bCiǥl85=q/y.>\+ԤznN<?MϪUmԍ(KT")67ɍ/b-.\D!Du:c`\:5֚zՁ5ú,ܵ}v/>Ă({~<?<?-MS_oS?oF)rƿ-p?obޫ,g>/?O"eZq>/?G<(azdclT"5]dhIs)s=?si5[Jz|+2ON!FAuݿ.V ].Yp`=;S+ˮ>b55ÈRܖZNӦ &Ǚ/aD}Ktό|6ָ{4@RN{4zMZƯ~mF8]a=y}[yJml\~QBHLqPˡluY2/Ӈz~ʅ.r5f~B2Lw6hSMbU6!ʤ41QN Nl!f*3$Sӯ^5`5/zll|q 8VԉX/O(9hiC>iv.(lgJNn]soiM?+H*S⿰X+ٜyӠSMƕ!>!N3eUj^ &2!K[xZt'#f.DNOWtV5v!f9KqWRXCF7 b i_}IF:AR lą+WWv'\lgaMMZgb|$G0⊼Lwz?'آEVfNYlImZ_Yk{/ic^/ZU(=1I֡66 БOŮm7,ɪޢ/Pg跏bd/ /S\j3Q/^2yIu3ڦ~?щ g@;Dd|liEYd@jLQ6iu,'sVc7.t7I&zaF[}Zx>e) sޖtw^NҾIx9$k,@+AG.bW$88LQ1UJlN QjRh *9ndȬ&؃a.id7*rf/j;[MO7_&*@݃;G*I2N>og vTu ukPoQܯ^[ÂSEf t~>.\6YvXebqy9tƘfHAE sV㝔N0ni˿ /r/=w66twg<e`m/J-c|u SXd`~W/Z6 O2QO_O}o *'0FK7Ȝ6=,[ŭ7V0l{{ex"vd66yκR=1`{L.2`� |iaḌviT\H{nzXje3ORJa[}=>P{bD_lXsiUVR18kaĨ,Ȋ l&D'r3[#DKa褻wt"l4v;ۅ\٢ͯzǝN " Y%Q}>h-2}{":M츐Ѱ \7i' 9T;W%@71Jrd헚ؑ#|ͫTذZ滟}2WzѠjk^XQoJDMsu,l85S.؆ΙHF2m_5 j\%Ԣ=yWRD sK(*:fL5'bk`O½ a^! ru=,G*!]q`iqYW)t=zW#8kdJ`҄|xQ+ֱ)/bdW0)Vkт %5;SiYMjlq2FxG QiMk4WXQv@]w)L3BF- KˮzaeAz \fuR"ge7q~GhGf4cFBUq R1[ٔ,w(1킪o %Y^sfa6ª5K_JCE:*\Sқ38j^I&z_=>!sSIE0ji]?Z/mrc`V6 = 6Zٜg� M2au`7c+K0xxtrA3 ":E|a-u k\aBKcčN3K"-Z+ܭv2a_6\]:Vf=Ex\Jc}cycEc@M: Y){ I"otBfNQSV�>W"yII"g|Qz [e rɹJߦuE~mڸD"I4\/ȴ-Z)ր=r5\L54MZǘ~h 2M lYk@!Eۧtiai1a &cP\m^rhqx-m eIЯm(A�yz4!'WA�;VfM1nha66.؀`s%1,T@w<̬͚|I0 }ͫk/ܤ}2ݗӮ@̶4w8a{ff)MafsO5p@-/9?~7˗ Ͳ ź/^u"f)^ߥ1݋u2ގ#Qu]MB8"!n##^CA-B ](g&]ͳ nV*;kOڗU%mdD=rLnF)p<^V3* B̶&vƘvJȮ=FIwd4ԳLl4cyàugu> !+^OgKwt <<HآeZmu.VGyO\~G5 ] *ۼ ^y7Dc]6ޠ>-B� i~Ry/xK<b.}qP&?Ÿ 6;Ki';"3-#>kn"*Ͻ%z.![o<al5I(&1ҮTQ,!s6!XbCMS/pW0HjR;AV'ĊB)ȯq%QԤCdB6 ]Nۓ<QieMƳXIG%OiqGE| vݦ0wS31WYl"H8*(RaĺXALljd̐ +2݋ DĆ:rYf䕹DJ7S7 qY`J@qy;teF.H~Oܼ˳o2cX_/xۥߖl-g~3`8=jS.^oq\ #hۡ"OέbͲ"<C>SKZ4DĨ'^ABi#[:xCL豛+.1*!F8IH@/Kdc@N%CKL:mgݲIk xCܑ4}qb;D2E:UʘG62lt%8"SD^H{%{ls3lY&+B3.Fa ?QsN]k I9xEcZt<w<K8s ~͵)=6j}yR_Cj/D] :x$N6#̸LaQ?`SKtYF$V*Ѓ.)% </Pfv m[4OtJyr;>f~$FqKę^{J!h~vRAU\8:x+teznu@[eT&TuHm<ƬN NFZ2ܪbF&#)`347|Qd^_#xܳ-lr+Bո1'U>wAؑ,UϰP5뢿b⻑ss iAҝWZV*s}&KWK0N2 #yRӉ}5_A*[P{H 㕍 "q65r[n-&[jܥoy5=?JnwԓfЩ\t]M+v26税1=̬og}&AZ{¬YǕjaUi/QV#@ XLI8̬gqeajXQ^lYcrnhQ58\^M/&h9ȼN+1UrRө=˩RBxc<5~}DIut2_-u?+'RYb mCdA9_zI+\F8}.mn WS{K͘@uW_Z:|G//>/n ƃ&$nqηH#k[,@ TJ QT$Z0F;൰5m>Ɯ,jNMEU 9 +*&g?SG>g�+agB�k\)r[m0KyW;�-ZyxՊ ҅D~\djxTBtFK#L bza,!Tt+pKGm$JU~y G{ᆝg(`´ ܊Va0 (T'څ#sHigvU՛Ge:*Jgؤտq'z.(u*1:\2~%ХaT֭Nv\w2ᤤ;s ځ\^N*nX"/LN+:h{^M\urߦYF/>_Ͼ#1_Oy=MZǙ Q—t2u3hC%S%{U!lK@F~NW &DL0@s <C- syc ښqMݥ1up%:T6B #oP} Z' ml.ad-Zg_uV6M<e [ޱ"W=2y-l9eK4#pGՋxe:[V2>E9+<yrLxDw;Ogݼ5uuSɴdu68x$x"V[yМ$<kq@%qU:;6^E]Cm(*uڤHk _<_~.a]H4>!<܀;4g#A9FGN`~ҭ+OĎlѸoPj5rx)BV0R*&aa8/xM]س2f+ϋe5aE#wKBm-x,/C^{P_3GZ˼8OP%>wYI&.dz |7FTx:`Q{wesW+[q⨼_Iw8N<=sPd.~;1/>I/!7b n%sc~6R3 X#Sأ8^ &q= ~G_P5R %V #2L]f,%&s)t_[|ee@* \z.Sum`O._@.b8�+EpqJ2cV1j_~%%$>Qf)15nj]<5s~vy<S<"I&Qˣ;h]p8hb絗lm^Y{XRte%d:4w <mb>I=,W"*<s:0ۥi,B$r S�� �IDATr&|EuZMaȳW {̜B &EnuKo D)RYGC6 ڮ$3јg›+t9ˤb9 TZN -j^K%L2QY@+IDN$G)+=Y em~3JµN3rwC;cLoic-tAOSw.4[LrX"on&af%mWgxk6}csID7v잹qWfF N0︐CAMRBViTnK;W: oeSkofH2y:c}̯׫5/ݹU:§n%k3$م+s ;49JBt=3J*Tha NDXEn>ΔL~V]㾰5?mP7y>BG!(YNd@o4SߦmKjvx[(RQW2|rDŽQ]ω]M.1jqkN:\<:c"F^v2A=g^pJp&dGLe=/-2v}ܔ.a~Գ,CZD{treY L;od7%7Kzb<eyx~X?H~D1:v$[l>ᢼ >PQaL-dq[L"NG?P`2xVAiL.Co Jь)rΫISO?k\1HtvhM2a[XɊطŴ%ch2#(Anm o#~;t^^<-)ePd-rUEHS3H)3<naNq*k=LuRU91"ag\XQim-3VTp~Y;3bwH&b\h%D'^úY¸uǘvUwi#d=|p%Rժ yyWѠ;3vYd&5O@,Ƌ߻ȓ66"&vrXRyeٮ㠙N*,0(.݋<ð~&M&lK+prB/}5ēʟ?LSiƪBmT 2P k6e[rI鶞@Tv*ەe[crxbc:=IL^W9Z֤MZ}5ƘcLKt拈òFN[ٌBu6ֶhq!=>5'C=jNlqVGQR݈g ᣬ=JTį$5@E;Lm1|9%n(EUv3۲bҠ#rPK[iƄk,\^+%(b6Dճdvm- 5Fqe nr'Eh2m" ,Z 3):lYl=pX667Δm-j\+t:Zf"OfWwiLJTe5ԕ uy9epXl9.muZ=Z k&v&,sPaf9sRkAO{#Z!rTY~3't/e/gəΊn8j`:CJEnS`uFfZK VL <%#m:mAWgQ9bf*?w5/}`Ƨ Q@3 e c KקƆ#q7B(ZT][ǁ:P Z:ipe\r%s V r܋ha'\n;A\IɇvU $8kesIf1ףM)Vle쓮K<\GYynye\ ؄92&!8S'eKr>Lo3_jK ?6.nOPˡAÞ 'y2U=_ZˡfHyɫ ~lҪd8U!昨oaπK<c;$eË$)-GuZ%׳oid/wN*vXd@ F`5Ӟ<e;ޟdoֻYvjS14Pb q'*b$iK Ͳ)kxx9IHM 4IcnQ33JEnTBI֙{dMn y> ff~tʭ.*Tr]/ʛw ؗ㠞}Uvi!H1?1H_x2'($pVI*#̈cV:leS$ vM]٥i8s`UQ@ԙDVlxQ{|�f &Ϗ%7F!kN-ѳDªş_R=دya %j;F#̨qFav_9F\΄!`B7moCjȵ4M6Ʉ,fgE,Û.2 FϬ,K^} Con!ܣaYnMiʘS?%c^̈pHL5'LIFMBHSKjh<3HLw ;1Yq1Vj Lu  2WW8p+E"H1> ҷ&4Ĩ<L|bq䝇O]jW�x%o5cIVϵ`:REz<E? RH@:az2wL>K#89!sP2qWK޲bwq,MFa<:-Ža>wWOR'@zp2|f ]jԌƹ3^#'<4L^ sLy<c+tY?^(EV?NUN&e:>kR 1{v$5ppEQcS$G'WE[=cC RZςk*^76sDc*FTTEK|#E 췱–j D�JS%q`OxoK<\'w1&$8׼*@2V}j9t>`FI{t a$M pkesfrBz8`ĦL#mb/ 0ӌ˧Enl:Z\C|T]ev^P >{ٷ\PfW_~wӹ^=jf۠EsӌieOfֻH sXOfFM[YG#Y.Iif[tkBe(W1EX?zKd+~K8aKU.!Y'$GN{,51늗J͘O*-T׾@ދ�R~6Jv@N :A؝ rZ]>3,ɗeuqs9f wmMZz{R'U:l�ꑱLwI408޳w4d!H$<3,cq-neSzx) G|_0X*(©@3mɰM&jb'cXq<RwpvmlhT I�Po_DY>@xۼ7f]L83U8*NyOh \p;̪cs&w.1@r^*R2s2iYisɱYB&*<$:s0(X˕]5r a+Rco^"l3HWkۖ7n#=̊w2חɍMZRpKdP+| 8<ܓ*ʧG9R0:t_.ֳl.{ }>2y+'穰-6\xqcJel-i'1Ld-&KR 2ݑ".ֻ4N09Y,r�hA&݆vJc2E'FcLk7%DC?K> Wxgfd.\-{lӟ[l`o]{Xx7 oN2`Gb+i\*&:ݞEO<J3 üaoTLQ,`GA|Oo Wh|6+cD'(`Ϡ'yGgoոwVO&8VOk_{_w!Hb>ܪ;ɷ,$t3UUo^_^}|47LҺʻ!%ZGg`HAdfauX#5hXB;P8Ҙcߩ)ƛ.s]HQbRT -MZ�:� M38Sv;y{ja˲mΈ^0^a;G8]1L2Im鼏ZJR&A.zitӌ18i–6K6y䫩$t"kN36nvh : TIQNa-Ync'd>< +Y#YĨ=49c$OjL)b%#Gd*r۰H[<t+xѓDO#7]TxS4cj\9])Ddcpqߠ͕ ~=lSSMlY$S]2C̴5s@kzwe_~ȰWS_̹yio j[_d`'\h`}W5|yOG[D^ ƆJi0׾"]v.&5>gLG]wibB2ƴO~.FǵEVg@E-'CB$  XZKP,=͘H(O V^(䬇reJ-Zd[DeXI%v.%~*) &F%eZҒ:a]rbƴ% FNfEO�/_0C<"gjUV|5r.ʢM0GCK>+tI[ws/r Iϑ�BA&tZ[4w \ՠA9w02t{X*1z'`rj9Q-sm)ԟn? V7&\(u.} KxA ]C%gJ&&D崢^%)y s#̴3jAZ]vs ^熸 ^7ymlXi?v1ۘ-l1}*b'\h#[PlZ޻vJMҠ]GB'W韵<VG4B;RlS؅5AScL#~e~;Q}>T-T𯉭;aKտ(2Rp S"!PdZ.Xr]X3k>u2a%e/=ǰL|G$/0FKRz? V5ӌηK5/vK􄱅ӈBmbGkqT!_qtHr"};�R Guv_uH 8k0-1+}|(ܧN*mlhTF3Fe{2ݲY7p,%q`椣0"r%)p˶Zl5gm,BLk׼ju7Dk9źEKKD&tufWokaZtHӌq`+krH:d'[uƙrzJf<pKYc'93wbI*തY b=S̓PF%""%[.Ӷ#=vQf])Ϙ:3U{"7Y#K0#4yt o\.WJY;\(}iX)/ݲnmRrN .C{Xry} 㠆AFm9MƪiGA[L0ͽ5vhV6iaI?û Ml1xʦ9ѡ|s8MOCXTi7I>K@%fTl 0/ l/ ]Yk)4^zߊnqږcӌM3W2.DEoakf:L\mlhyieVbo<!'MvT#c/ ^L{Sy,,,2{  `մ]-GY/Hjg=Bųa ĬzD(|% a8<?K<ŔHږLJ!PzLT0N\3g@CtG>;iR#3n--gOߊFv/haynhdTw7]䶻`W;35̬A*ՖI6`7e1, ӌٶ2bYNƘQ SAFph$LR#xbS.~ x6iZAK9lU&Ò@5r6l|yUrF^mS2Myw.L6'+M\7"/L|4ĝ-=a{Ж=M83cZ:˹9?o<ks뽙/jtb&IULBY#*Ig(s= vy(Li:vlƘ%b?Xd(s5guu7 Yxn.*^&\(s][6hf6(_*H%hȮzFGp!%u4MXy)u\`E+2p] Hldw <BoHUng쪙(fy&hȓyy%^i;+O^1 Lbd :Xy$^m̯ayaN>gaǼM=n%F{, ލu.봿>mX%|ʻ7˛}W}n[&"$c$~ǼG< YWy:hn+ 5ri+q>5e;B%F]XdoeS*gEi_dĨ*4.rzϔ<�ũX6vH'"F~"ze>ڃ<La.V2} ^5Ɑ+*x`VخulȳX};Z:n١uql*ѷ=4cۢefW@{enEH8 Ioy: 8צeM(pc61S.jKz)L:Ic M}1G\'0Y1Sw *(ATzzM2_ ୑]F o3%xҀFv{w7`7K>:e{4qP%7 ܨۧe�J@BEj9&L f)p#QdT +}UK<0D{f!G|Lw' N-C\O9Ow|*-p-p+_ n^Rjᑍ2CQc2 �>WbjYep׸xL&ÚlVVg1"RcS"1D$ 6hۥQɪQ?`\ZٜgZٷEU?~8:&+sޮE*a[#'C$%]t과G9HuyC�Fm򈚪ԞCtI&fis0#hg]mgShgcI�R4KP{v,Z0ptZfȡxZxGv  i%o![nnz &?+'u7hSKLwfxKyo-Tk{9ThQ.�m7hL�62t0vi Q9za*$%+ÓwLgx.gK5En'GCJPLHi$cM<?#+VSr#**JH+)Zg3Sݘ=:\s{$7qPbtfqsp_3L09Δ~'iƙcdަA.Xه(eGÒkK 8f_K3�� �IDAT@ 50Lp%jLm=Զy X2!ճ/]wm/D \ðMQVn['j39Ÿۉ<jqÒ=/.b'qvXzXxZZG.!d3$LlFk #^0wP(2NvZ [cS/v\㊨3B.j/;&e$I8[?i_?\ҽ Q(? T\a0PkN[Ny$|?ԣԿ೓–MARO#B"z-OMaמr Ioתz1rY$A_njA{c$ x%D0;wcRbT@־zgm�ɜ?Hp,lbga+U*1֥:=T?lhذDiWS_sIy dX,^Bq›A4nT=4$С6H#>*�1n^LDJ{UX,,2Pn}I? [jN8ʛ>c?c5YDM<0T�ik\)3$YBpIxŚJF-Я۩J:qtm n`Bu"r [bPh%zFE}ʻzߕQ> YFYpB㢿L}2|5Œ~fWYjL< >L4HP%/N odi;aƸa]hvanMEPqP ST%z OFkio7b/.}%C=.@.V)~GL[ qm:.֘]إ<- 0aIkLYro1"| =,YC=$lj&w7pmsacz=ٌJpp,w.En"7ݔ#p2v/)bL^sSx , n#W!En~GiVEZaK;kdyfQf٫oa@:ĝGGb$ e3??0\noc5..?TxH )F#*̍ ګ R\Ewg\ @Rđ/^JىU" H C=/ݦYה,�6 gBo3dA$YlsMPS>vQۦwrX`1<LyܾXG .)e:Jh`lR?($ÜKEJCB嚧$0@KMLKӣO`g\!2m=O3[Ko }ćt~l^⡼ �.4ެ2kp< ;eju@Af<Zƿ,'M,dEn3y |, o3 9mvEn+ugj-Ͳ9JKɃafd)yF5~546O:(Ing]N0S"_ǁߎI&z X\(KEn*rf9O9(0!RT䅐uWnw2Zj9\>xXƆ�qY_iT-YbJ�LIYiD)pVP̼1MQy9B"#~Y,H51P_ 0&nK0ZeTn ϋt* = QaJOނ5tÖ9̊mK+sbeZ义ޣa)71bܭqSKAa\t{thccWWafFw,Enx=nfsq\zj9dvarV;Z _%yʚF]o`o&wCNmz4m Yy5le)Z vhbأL(eBOyx Qԭ;o Baɰ--63-} aI7P3a!cqH[E&Ʒ<euW0'Nݡ́\`'&CP6+[=$eVH#eqi-4K"7/S yAW,5:Q8:5 &2sI8a[ YDd}SVRJ�ֶ5XF]b+?Yv|yH<sKRoa^n{LXK=g6TlIF79.-l3"(ka+t4Èv> kܒZ*9_#}!^}K_:ĝ^M:h'ۗddy"WUbmfe<PhY _ciOs; {̌I&:Xduwrpj3}~π2gȔ׸~9秅9;\R?Ϗ4e~Wc!Es2#{Xe~%A:vRqoƕMZ;yi:P*"aq\}5{q,8X?]+ոY$B+GMx"Īmqj|Un;Jcyɰow2ױ$)&]OF!)gyΜY!)٤Հ v6hsJ4͘Lt3JJ6S%'b\뱡Y',px|/T!mNo[&q=}Z-f=, zwU@jIPЪ|!Ik(I}t�{,VV6 mI;L,bah{3ZjfަY�~7Urb֋<Q4hcL?$<0m>==sm<bENQvwm-Y#ݦYL|b 6hV+e7?U{,r]:nݯX'yZ5È1y}A} 2ō7q%:S}#Un,y;%S&<r+U$_XT]s5zg rҫjaī| N2q'Sm=h "7e 3DO-t񉌆2׿ǂgi,] <Qa s`g=Q $".]2K!(xNPH$RЙ7TJIE&d1,Vw rFP}|A`?ǯ_P7%{ƙn**_((١ς le3GJ]`aH!/yK>'R<+eR@V{|KRʁ H Sy05\_d+2OR!(<RsyOWsZJ杚]C~8q50(ʕ+dU=zHNTĤ=_hH٥ V@jY/\HEBXxzNo/vJ,`LΛg.}J9fTx:٘O}?$$"CSeI`gEZ4V[,A{ :T!_M>WX]]m6TEq:ao`]>HqW+|?%.:2NoJQ7&/JF54{gQ5R+-=,Y))lpP[OZWk##-NG3cʭbr´XhqIHG2C'3ǍhK?ԣL^sx7sGr/d^%&@$$q-e.V_3a3_-l2-?6RDށU;q ١Bg4'5qrʥl1/o)KbqUW+N LseIۤ+^^]F.0_S] 27.TrTfhk5S<*C/]SώɃOyWg]`s{L}l~ 72 [zݵzm"PdEK[j`ums^|~ōr [.gB7cWYܶY91._y6b<)5JF׃OSv,J}rOmF3aM_E$#\RFF)YQfHx/N)Az Xs<^Mλ`dap*zf\jٮT5Π?a+R<ln52?Ǡc9SN~}Qnw "ɩwT7A|GÎ ]t24Ϸ-k垕ʹ.;ӳ ;w&1tHY=tElU?:˘6d3R3ȍ3%EP.O A [-237Sdm?jn܉4<eUaf �3} 9e-Z14XRٸܐ! KhgD^f?i[ &L$^>r8p?~ p^NeQ�)g?B[)gpg-Auk!p驌odt,j@l1͘[^<Ф-"DN1o UT\F1w{k Du5q\SޕPL P9EiZ/qpL>"zE֒M2B0xXYE- Kзej*N\d9)@yS`4sg,QXeQ8u*J4=m*_z0ɄM</P{:hѡQ[H�q׽\'sf`2) {4'LksLt[|>Ab,K >iQ#v3A33ޑQi ,RO҇N62^A OH#JN+ه_0qOcyfާm�[iENƺKc1dN*ũk*W88S, 3$F # PR$k)M,+E~'f[_g66 sOƘ5kl�9z2bQ=vպY 2/1rl/.|nsQSTiLieĨ.0GU;iJo�͙"eճ_zhf(i L2Q6ŸWS/pxaf[~to?Nјgu_Y8!XwclKId.Z>DtŒ3٢l'M[Ia8浻#Iʼy}m=ܑ|AT2gFy i)Wi\ 3I fGqYy;%Fsm;ږabf-c K-"[6B1 `6i`r:ܴIx!lV0HMZ i4!ňwAF,s1je›d sUr<hb>=봻ԺrLb\|ێB@rˏvC(w@ (ų.SߠM|pwbEPz57*tf|j Rs ŜZ}f< rT\w@pha YUcƩMt#'G@pVPe.%arx|?WP T.V䵟lǝ= +cf*ѸE(1vT40Li):J9=ySK"X2}O YvZ,r0& BMȂ u2OtUJnH�zNᄤ/l5@l ~Q>l;~z' T IL y>IR g獳KߣAf|<%ڇ(} tgaC_'ȄTSǁ}8Sq,:}dKD>@ʇze>lz! #A^#^h"7Csrr'gf#'B]OPH*NTHTLtf< (pjXy9,ӷQWJp4sj[guG740"fNQe J=I ͓t*duOt!Ƀ2ɞMOJg!h8Z \1}p}0”6`֕?8~@kXgYδRRv{7?KU$2�{wT}P } UT2;":.ϭs)'yVMAj.}yc[DnbP=~?dݭ''F"L7JZ;? *<n(Eo0EV֠;&1ZaZc L.VR$�50p7eL'Y]򻔋:/p.;t�f+1q/cUQ!ڢŦS%g7D #Ȋm.Vfqw7=,, W1:Xg)cbDeIndZQ7SF;+t Qk@MZߠ͘cFv)1G5R#2U1?ǫtD֑ R Y"%F34gt:`ގоn4,\&/c,ǍZ7!dΨh}N>ɼN-Y_Jn*1 fyYU]<ܕ#,{0]`Lu{27tB0R|O|ID<N1F䩦b*O>љ,^tڀMi0n /> y oZmY&NRny(=, [@l_]BaOlT�8w[ZbDPFG;?K[\D6`NFS`U@fe;b  ?0O"DGL\kNa0@ S|N@!d=ʰ&m[r8ډi,H18<;Yja6i#žY6g%iP#(:(@ FƳ:iٌdS֓Mdy&X!uţLd&&<UM9;UjGYM<OU;z ,ZٴO^`SjT)rJ."Hk7>Hyς+իMZP"fNpnҨ}\Ywyd6N>g91v{w`Fm^Eۼ/ Z,L3&u"6wu]}[ u ;@3 s ;ʀpf9XHB+xNBwaIʦ\Id8N*bDq6\&G`r7-0˧mL1x}K/4飰L…7G1isIt[<ջ4:RMNy=Ѯ`L8̩Jm31o5z7/5reQu$9߿DzڎNODRY3q{Nj%EQ|ĜRRnvhQdqumc-ZCs dK11^z~D֢'[BB\@ }хo$>sr؝2ڌMK:$A>X:y4Œ|kvJ)qLڣau3o@L"nڊ`񓋯yEt8`;L:Ur9Enz8@;R5;ۭ%OxL/$<O|4u '<:}]IU+ K+&Xc"+-':vыđ%N"J }1PNAMTXHʡmNWv|{z4^|7š=WSEeo?>9AcLk _1u2u=(k$kȗM8H|^`|œi˝ڷ4nf^X�� �IDAT.bɬ||#;uLT Py�L.K:M^7w'c5 kR02BQ{QW_.`5pk3;`YG#˳4~bctTjrm_\ҺeTvsESwDFG #@sf^U\='tB\igH;CJi@paDݧ"R ¯9N~�](kxG*_E^#,hHWS~^eZLT*~om$JuU5 IRm,_[<q9K_DutZKFN@Gr1mhhOdD) {r=urF/F1pak 2fRCځ̈O؂fut@{'ώT)G*%2b;bBkq ?,/0G>%M^N Vs1*Wtf`j2H[=7w4cLjHbH " /[T=A:4S+b]Hfk~8G>A@DJd^g9T-G[#ծVUb÷MrT"x<GB}uS�fNuNX$t8/bD(Dx ̉NiWu/ie)¹:#aE.ݖ_d\UMnhlP]:™:U?W}ẆYȊm] vK-4UBD`' 0rնH#T,u<V^b7ZD hBę:!Jѫ-c$:̆qsU*ַ5>X-r &8ߩ0cٸ%]e^O?)4=ef3a+$]%y_ J4:-\ޢ(5oY$-k=r[M52 �ڎs~͘ �%o?dnbhPBEuh#£=}ȚE-NWwq^VT o> GDtC ;(Ǖ&x'~+=_ GRUTӀЌY\6]3"߄m9UgW|Ͼ轼7p6a3"GX=.(-0j;p\c)4L*Tf-:@avCm"-R4O>S7z<L:%gj05IHYDϙ>#jҒo8uAj/oaf4^@ :xI& 3R6 4.ifo}]֙:L/S8_}DCڱ,.hvM�G0O毬=| ]eͣD fi%M#tO/n T.{FhS<6;Qc=-uDwkFVUTU?7t/ǖ0Y4R!QTC/ty[;">A%M#wG*li.y[SbY:X&P.js^O HACc. ` BO}4esʣ &)+ΪQa`ܞg HlK.<9�8v0lU$KȯT)WUCSjTcs2h!n\AxQtAWђH}MAq?U!Ro`*k"QlDu2=�+^Pja_5?OA+eA6XOc*VxKMjpO9}[O.(t�F/Izt|'i[ޓFaRmLp4׺M$c:L7V@LU([֏sNG#rD>=JgB4uk% >Q7ƟJJz|]=:F #&to#Sg% +Bϵ6U*mk)@X pP.k08IZq9Ρ?OdO-PŦefCND -/B"F9956R AV) ljX 6%0 nFvW]-Bv K9x  ?rG5( 1�E-p8L|gK`w-^ZRt4mBݥWn�I#FbВ.(pB>țqމ; pJ7qx2%\qpI2IDYVœCfqZfW@eث-NWn)\NWLA$Æ^]_LU9`'+W >]i*e] #zUF+#g:l0xgJ(UM>c ̜kOhmD_xG?І* =;` @hdIhz H2 #a^5 G =!>5fPܽ:x[ꎆYUWyZK( b4HU%Ƅ`Ƙ6WB̀v?a[�v4[UqP4v4tqBj2c6m~^\UeӤ"OE Pj3$\i\1لM͘`e&a9t{u�PT&EUZd{=rJxPA34&I_P-ѡѝ;p|,tE"G\ Ķ1H} ،7fj&ؠy$,.hY1mtKMÆưC#`@Ѽ',B)I W[<ChExt:_NoO?]TFakp=}H >9:u)v@ϏTK=:~He-r#Q%OhmBkw4 ȇ D[z#iUCyǿџ=haaDƊ,e]cGC==C1mC3`.T%M-|QH`a@w5Ȧ=0"D=hZFp_ǹ&6RNԝbZ}YYs(7 ^4$U:TUnP'4zi] H=m6xZn g"Hlj5nȺ'LY⚟CTP~J6ZRb@3e| ,n$J Jr%Nh zۤVs{YRt$]:=ݷ8,z BݒxSK=)1E+-YcizTA"؝WėpG@<R"F"_].�Zg@! =(o'(qgZڊ=srqvU fr#7�Vvw"],p s`1I(p*N)N 1]QfW\p\ĭ[p䬊[輞U"O�Dɭ3t3W[ș-iyYt$=+jpZhk6p'vWw]wj^Os'IT}FP)mL"E[fpGjʈ[;fLE9%nUZ/+}EKUCWj_.AiV k8Ut5=AI%-CٸW(CǓ^z)j+byZK%nk$+P&Li^kHfTxh"m[qAտ |HZ.%ohIl^3@!Ӥ^*BВԊF$HCAUoFMEuyoO2ċ@: y+]ZBj|eZW 6]=^a:yզhxfS7 n5Ӳ\mVdmDUNaC&Jr0ӍC&uI*L:%͘$uća~ʰ;t^Ue*8B9ޤG'lp{zaKr< hn[ `G+c.E]I?3KZE<QbU%# <gzh -s bM;3J>3wO/8PΎ= MWRoL g׺. Fd:4 ڣՅ+kk ͞sAB8rg.ƍƻļH{ }^/DJ:L& nY¿]SCbDȵL&zE J/CR_sƵ,r=`- ڕI8ڷ;FK!1dBu a!:eKڎ-k11z~ROXng~kt:!Ћ$K  ٚKbg _ A'fB~^3{Ș6Z$ߘAO \lٚ&,XѸgZĥiQ1mLk饾ǞGǯuy$Y:}6.?*I =6P>Wy͠ԡ=ݷܟ߇'KAߪ,_#V8F˚sy]"qݹ:[w~?Vjs1IW"H5 Ȗ\ .k񊢉 UO͘ Rfj˚KFM f ?h 6i!lz^˝⌈0]v#Lli|H;UkfLꨅY43v4=NUT*U-8~,&Iֶ҄4~Ko4{6]jK^2B6N^m 2X'e#?OI<d64-R, :8qkX7qi/@V;t.YI%-#ס7թ3,1b,|G%-CBkfAB{(`[óZ@PjX|?![jUNW59]cI?Ar-;mHJK)]ta^Lamw^"_Dk9ޗL(ѱD&=q,k ≺**TՁ/gg,Kz\vaU#4SJ^TB&fֿ 4dʐKZ:$^gY,]쇹w"WmJS%悜,?ӏG>mPԼ#R ;z=:W5Y܈w5xi-)zaØjJ+ 7KOP(ZG o"2݋V\3hGv*No7UX7v]`L0/g%-#\ѣ !xrM8}pqRxy^ڶ5LޅduhFz/ӥS$6hnS&Ok +pK6]"LYz7{Rw_vL"s]:-n+A0(J ni-5KF紖(RBP{U5ʗ̅̈́ϲ?rm߫[[ͱrQtHHZPBE_hfŽfk5]yB\Un< [BڍHRͫjm:F2#1f�~q[`tV8u4M(<V%)gV>l 27':J`" ǿkW{3!==՚&V4enT=O<1̹}历XQb hsNiJ;y9_4h=Su~w+z3YцzDDbh$cPa?M �^nSgh远Ԫep5g<R2R`U;6ʫDAmR\?d~c&aMN% lI$h*wm6c#QWa. E^?,5B$7&XĺR?pb׾BG{v2c=% ~?Hz̥g>-iH,ZKK`b)MjuIa�UcsK*B0ZDq6]Zc3kdRj?Q4~Ur@KZm#ߪAf~ҙ:f4ejnǴ2ɚ&쀞Ok oNW|q ] Zr7*FEgOKYy.N fY_뇝:3lvG:1+`(nP/kDoDXZ޹AQb8eU Oi/kTu7%[\<zRƌF"lC/mG>H]:aBPF>ψ`V%-SUۭKy@ET"۱\\'zCcꩨkrGChCY0 k>D=Nх/ԾI4GJ:C{[1`KC׆CD zߊ @x_zfƵ^jL.ZHHke-FP%k^3Z_"WA}KUAѫ.9iD^:R;x`m?.;]'E NԍpF6%M-=`≆Ƴ] O_4N1kc)זg,͂fZ*ɣhEDB?rؒ>1\IBsi>:W0 (sce]0{]G.-(}c=zR& iE{Py+zTѣ=*+ ֎ @oh v]TM] Nx;]}L Ț^8-KfػB\cZKopR0{dFBb&ԥ[KV4|GiCbT۞j^I4`K*|wPy] "կ/G -bf>R!^�u'g's{+x\)iSQ�jr}yVu 1egX*ex^`.VT<T߈>uiyxW2VKku#J%lh \TN�塪QPlfn< fVڀ<rETVCPxTOj!t`4e-%STYu-4Չ S}L{ إfWtx0!S%ŁC'Ƒ?uƴAĮ_@1;: 湶󚁩" ^ $e [ j "*~0JPOH\u1\SZUmGC'ÜINiGSǴ $6mi5MAQbIP滬jyʼ>"2R-p%uu'VTnߔV؈ryߎZSp[&1#<TUIHD�2 XM{[D e_,ľѮXhFrZd5l8 djêa.bC7kBk;!be}�1\)64vm X 9Lk3\�8b\xX=KST\/t?|�X1Z/tъIkZ J`Չ@B'#JsuLjS Jdt!  oiJEtUMB Nxk/rKCH`!c='I]:ESW(B%V :vsu LlIZˠ@L+jjo=tk13?p`_4ɞdCr1RRƘ?ڡLHҶh6}KbQLQq <}c^O;2[O%ڬɗ59N4"rrWӗWU`zBF+qdRꪸ*9<DӸeT mʖ5wΈwp`FM չ: ehkKEUU&`حv] f 0<m [cLbh H$</wWz"FFz_>AU#}/2ſ|ba@=/6RrCBH_."5 eV76F5%eIr97c:�� �IDATF_쩺hݎT.خ {oȚ&F)/Έ>biDx;5MpOq7^w0v_x{MF8YX8Pp0z8xƮ@GUCyx&GN*%Q|+ezWzWd<mLCݸ|f*h,K tԱy>9@KfU74)57a[v44'̱'ޘ60c`MD�xk>VϊtyKoZp,iŎد("Itzʋ(OEc#64^ՎT1ϱEd豞TW?gUkA%U4XO_ Sg5忭V#'_&GPqeֵ ᇲW^p܃jZAǥڪ%z  m_K7QLȊEnP}Ǵ1RC1m^OО5cpbt8k"}?ޑ6߂2y=A|rXNT-ވ;˱r؉4ɴЄSU 1 u]a^Z/iQ@=Ske1:㥦S2)gUzq&!UD72Z!wfʚ}X)~=vadX${14W?Eҝ}=o>VN'!f@ kr3=ħ�1m 8KsЦSuv锿<؅'ďKUTWBUl"j/訬9r5WXHi-.QS=sg8b0<S'9OɱzzUCt-b’qvV :8Nd&5=X= :K00`h~�En [q:_,i*֩[zЯMfKC;E D90>E cFndF,cr[fg8ɛ]XAK.g!%SEL4:d}^Msșm}Tay)(lWYUvyVڴCIb(Ezv4DգcEukXDH_ކOi:49;*Ke-UŊ |7-kqD楾<0ѐvǶmf2DyϙU5 @vUM-hMB*Q#$i;dfjO;"OdI֖L%"A,W2GYsuΤ�_ ziDݴ 1jcx@>L&;Vψֱr'AKww"8%`\.V(=ykK5,TTfE$fA)"]3)#8O#$-QsNF\mrD>`>j w*I:{a{U[i$=!)wQ ig]lEShv鴠j5MtSgH<a߯]01Xxw֕,8RVѣ7ErU4qOxD N)l0{!7^Жctd#TQ[eU & S"ۘWSMY?x805ќZZc3J(SfqHǴ!4MfoKLSnf^O/ȎHPq |Z~s ~䐉wMawߘYyz,wfsV4UbY4,5sKKqL{ E8!}W3hHc@N^Qkv�IPO?S'c;hdmD^_}MyLܥ/a~k~! ,iLmf%AA$1ZNM|/iyV >}ɈYOQJ@uQ )I×PhUy͠Xy?2F*kHO<X1۷~X [:WC}IAG0{[}4fsRrr0kNhp�SgUpʌSqӇȈOiE< .Z9vlv;fIAEEï߯}Z^>Q|Gz|>yfRjɫIq!9L.}1\ϧHwU?6de_[ KڣIR(k+SȧBC0`U VV@1ά54^OPi]+Jw1sB1kܽc)GiԦ47}%X UEC :?@LklO_|k{K c@5I :X$zN|z }Ogfƾ}'>iδ0qi^zUTt�|஋DV@k(knW[V5I"=v5sAFvIɕ5g 8q0@Թϝ*uzbOz.JNmM(a�aߜ/Rm^M)zZH <sW_ͩgQ-9W *DA8B݁%锃&JDl`ܭ>3d e4W�Ў>~El1!I;bX–d^#mAIgGC_}rpCh%_'nӥՃfst,$`ulj+k jW -E CzP+}DFgeGd.lȝ%-C㛡]�a|NĜӇ/ѧ?vuES?qkə:a�r+F:f`t̲3|#J/e\<J-!)}** IrJ DN 2={c:[T&6 ~$>|GQb7cLLuA#({_Ig>n1J_5<'LYʝ--EBk1/L<F 30b,ND߯ 1=s𐟑8 04Ѧ%M{q0zoGC {Cz!0!ssW\,yKI΀}VЩ<aSxZKi)m( cu=0< up|5�&)mdAy};y  C ,hS% n/Q[M(gK[21c695̻A!?=^#@r .�hy5c8z{{pզ$4qDJu'=b Rkgc@{G*t&n5x^鎧$s)p<^rF 4hEm|)`Pv% h""ez{ ƒhpDž3`-k TGb7f! \zBr2!%! BmKj!1{WRk7ĶEEE]]:.ʒ͊~t�rn6Lb4s}IK&N٥SRV9+kř:{u`J! _,S8�X<hFB H5=Po|Dz){]!w/WZWL&j|7pAy}Rm&;li%6 0!-]-A4K:uF{mB0&&VR9JXm=l aOxRH\BdsU�oD~o?cu_��=':R~Zy&RT1@CMyig>ܡ{h8 (Đw,V�.ն3uh['ݩu332<P݁JNJ.CDRmAxd%o5yeMwjGC[8\fO��C>�eR(c ['/tPeSIc`R,xʢߙ:&[z@;Jbߋ,W#0m=Ek9p4-y�33*m |lxBkQgP1Z@܉e͡ބ6 LbK"3qY;!o HLfЌ/)J8S%U-kqP�:A˚{=:z : ݔ!$':ݠo5c9adlq`yJGpW;$շ >Xdys.\ ˻-K8d9VIE!ɹfu-'?bˊ$Tө7c"kF*aL NhmAOjsY- YSJה cڨ)Su!ԯ}B'`D-3ϫ|#Rmȿcv*跶4d_B B%zM4ڧOd# )B@N�@"dɕ/B 2b7ɪJ᧵DCyS-}wzQR D5Mv Nlˡ{B=ʩ+ }4B2+nhy͘M2/Q>$.ͅ*-3/zSL5iSq�I{YmjqVCC- 3X*iX wY- }$ǁ'B� zrC}UDM;L@x]SgV!Qjy>0+ADF_b^Oh2 UhpѦ1m^@9;zE<]$1s8z\ Yẇ0LϛѦ\*�ǿmqV 4.�I~i-:~w4HI&tjPI$G"t!2K646O7X !N<ǖf{3fL7]X&_%2k \7żdYfŚ r�Zk5oPIo7£%6[`ė;ShCSڈK7wQ*t1kfj~-z,)%0-6f9&DjѾmt,O5=v9wPX, DHw=#;ɀɻ ժ&|J8#c]8',dGC jw@6VUZ,*z:%%MEELcxà7m5Z%~ѣJ4 :b`Q%[%-/렐$**P+<T>Zvq*kRX dz? { ߣc>ftqvA밨MhEU7=k?#`Co2 eZ\AG3XsYųf!ݠo9c5K%d(, ςLVTp`RɅگX"N�ע{nE&&9nAP=Aeųʶo<kv5/ _ˢ!V>R81nw5;z\}LigH;qn8VS=fV7<<xffR0wGt\8MhMes`DI*թ3v钦4A$XG_„uA+$Py,ETņ/_sĬn^п~7Ƥ˵\V05sW|E\j1ٕڳ YZ]f<*] R1SC!WUJD\� x0M{@=WO@}?&>vN[d߄;y2,\M!l{cD2shM ?+_?ɿv[8<%w9,+DT7\͜D}dcWal sa 5z/EߛX>vme8+.B{Gp=1ZB>?{oPIѭ=UmA7 ݣ  -=Ԁ:3=0P~Rw׳`�>qGT#Su9H?iDi Ҹ8f5y3S˚MIwJ>&0Uw-#+k\<:t /wB+>Tnmu6;yP}[z/T~ q#0WWc=)82̟G#Zwݸ#I4"?<W::f*RBW  (djWQ PYѪk BAʉ!Ef.Kl&F^WEA &<  eU[  x/tE), 08VO.f=y[zNa1UAGw9R iZKnh9mqy\;1:RFa^3Y8"Zya<9P`�͚eD 2CJ~X+!yTnji X̒r|K[?֟3'?괉ȡsO i2cUJ6r|U+H+Fkr&qHZrEUje7 1FtYaQ@k^A=EP}h/SZcId;R|g_:mitQI(mb}8xz\dCKkyG F^HvnB7nv@Nx|4y= RPu\*0G鏁}@NE ANu|Ko_tG!IcY.4cرz2uWTdHv(",7U/^[:f@hyYቺVRezC2: K臸a.Е2zS]b wohm;b@12t%v]cPIs] @4XeYW5R$'Xx|>/c0Jɲj [= v-aIs_Te@A}ws_Oza31�PQVI=nYo qeȚR`GHT -\x=pb(Ur<iޑ2! Lf%@W 0|Bd˿ :Jtѧ �ѯ}�nK@[)h@{41`+Xh !c^O!l k2 GH xi-]1٥SNIEE4."l,bH >-`]#/>V.ADh猸 ` Ijd? \w$~2[kϴώ!85b쫮Җh;ҵO#Qo7(F0)<n_7*H|vbK͒ qcEXyY`ܶB213CjH:9]7oclhY,5U97ҧvJP-kΉ50 BYX41^Ь]RIէz"NuBkaҾa1EU�;RalVѤWZS=PvNAdF HWfRDRT{SMZvzN«a~#6!8+jU@}�;*7o5Őה00̤wPU<{x[2KL`h yUzuUwxh;)c4ȐS ]X6IqGG@hn FPއb-dBٖFIt+aYt1uVӓpTYYAWe.B-r25aID Y̐vCQs(I#Zjt$PӬUӇ8v뤪"B.Vc6R�L!8fG_\ĒhetBDCm`4ԭ2=k,5- ZAFdb@Tq3Tbty_4HH܃ U\4X`jDjRo2j�";`\_2gKZ++j֐Ͷ{Oj)hZKBӊn3h+tODh|>TVߨgLgZi'|P. ~_*|¾sԜ]{ۜce1ŝf-#tj5$[}>tҼBaLIͽLYNoiWa}0Y2%ѫ3uhr$3uh>E�� �IDAT><SgQUws⣒9i_s<K!{O C 1$.c\l/W?*h81+XT3rXt= =g LgM p}B&t4 qjt�иOj+zD%]yM13*n TQ9BΆAkW[rjv4rȵ<c37Z3m:Uao%4&x\%zZ =dG^fo9wK"iM W0fh`Yv`R٬- ХPV-=8U _A11TWrb|p-V-=(J$=%]{=[W / Zut$(64FΖ4P:uuMifDH/XO¦wteKf6(ݤJZcoMQ,G5LFQM4~ND(xu&P}wK>mV5 MvoK-!:_Tufv�䰙 j֊:#mdn�H :,_& όvYuoJCiAD 6/NB֜PJeˬD{4 <`;{�3Vk9P׭/o2bɧ*kQ v[Zzf۞[Z3|lR \ \т{8iOv4]?͒kA-Ỗ}βLkiJ+g:O5ޫ:r)1pF4m,Ȩ#p1e64=ݧգccJ* -hH_|^Bㅱ &%|,<`D 9_A?KˋyXڝ::Cc`1<u,Tlv@HZ]ĥڠNk ĶOfPrQʻPjԨɥpLՀ+X#l!b3*n^|@;] I%eEB 4[|ҚY&?W}*]& .fU[(H X!ȃOo5}= vϚ0"]53+g\"r#F2rӤڄ%7Q}Is~j '-kEK+WhOѐmԵ l9]:0i^O*uՆ2/d?{A~/):3ZcV ᩅSNEZUWj[WvFNivN ]^`k"%8e θƕ-9KH8Ӈ|JK;laMC-e~#ԷC5`=Lңbi2KC||:B[06X#99{j>7,tqY7ffDIczv9Q7 %RL׼/_G{{lWI˒ϒIUcNfۂtA1^Y -Q6[ܶ#ޮ 8WVjBkU|cQQ)?{(M!�EdzѧX=\t|A`suSgj zⳎI2o Y DCӰ2P$]9`YՂ `ͅi㱞JC٥/0iBaW2Nj\CE/cOZ8S̗٣cU)JB9xGtk9Ek$iұz@\8=:8OiΆ:deA4 |;̋EHK}ytB}\\*nxmȣhrybd5=|aiƬ>m"$EtΘ#:6hF,)fw(^t06!^BMx^j -hUP T>D9@ϱ_;8Hq�{IW9W;R֜Y7E4X^|l{%VǴѩUMγl]j2)`Ccwi$]|W ܼz�rz)HW"0XoX=8|0X1$F9Z93B(FÄշy3rXfAoPwݴIۖƓ\]64 KYsbµ{Sb\s~DO~M �*|z0]2+(hb4 v5v#o! &G[m<"~>uZ2ݳem=%I7I~KCǏuI HEp1ǹK,CICoq!wc>5<ՌdNc5\ҭn*MX_k@�,i[>B~2񔜎y;^k3+q=}IjRip >0_3v>Wn.wi?o7Hdr;ئſzwô$Śni>"hN7yc5{Z›Y銻UUmbz[Y2~7 pVּspCoJ^N3QAlQi-Y~"@D.23WXµQsT13>IbrJ�~k;YBJj)kѓ櫴!zCڱ|dF^(0TMѹ.Olq2,ZAy*okI'gTI46RLWjĜ#ߜE9Jv$~C}Y\|mz2߱ c2Yz s,T5EXzEozK)YR}.Ŏމ@%5 D3 3QXIk{9J:fyߢ=*㏂P8RKm$rXBfPDXHt6oeѫ-kqKET"UCdđ2e�2/#c|D(/5MAbl H=@PӈQ'0G!rxf :m_6|RˢI¦rpʚ;؏(@M$SZΡ{owJ*,UrHp(>fIոXjԴr`y*kNW neƞoSoMk ;PnsNYEo"O_aQ[#^.vXvV1+\]ˤax3'9y@I_ A0<l!IiAD.Y7ef{[ٷ@/d.~7-o]7pj5M[;u6AN;H!*PYж;t؋?^uGm@:+>&Do=ծA`EW ;uimT)ȋYN[Gx qF?:]n' Cذ";KhgISZ]${uĮ)"㩤e?7 Dj8ucP<4At9kXlQ/o!>f35Pdo_jgAu=%q^ c]2bx2٘{/U/p } nd*%-R9Fsͧ3;fnpG3DK>⍶=v"#"t~dTBl\׏|Qߍ Lu06]"tjCMyg%fZ(桶NE4Xcs'ye/E?7ƹe,kqESm(]qJf8b %2W8Gc{z@IKdSy+̨}b"A#06hBP]h_MrpzI3pdѧf<"h61)`z6;nkKFLSZU6I<*aa8SXEv0GV2VVrߴ0Bkz/=|#I խ-zYTL"% n<sv%`&KiPyI3=w-˨#Hq퇴3.}١%M㩈m ,};1ѧcѱ [15%0´6QJg<OMJH*\hD Ni?wz8T(6}=3AKpͺp.=B M C."_.NqRa#cf ̘-_e-bMb GјtLP]Iس-:J[ЊorH4QdB#Z/kT]\rZ^"$c<'!%~wrLDQ!.] t7 ,b5V.ƶ ?(Æ^ ós~;0$°/+ɷcWxtMd5gkȜ.^:zUCT]@+L{@9KA(.s]IˠoH;>; WW֦A9O'/peo0tEcZtvNpG :2W+%r*J�ެ >u=:#<Uw� ՃEIm%y�uNKF)lJ(i[!nLtζ*%L.3I"Lcf2QȻz"u16xZ2Hm7<UGD<'&u+}FY^c(Ĝه-#ng[5k7\/,~zE6}j]Z}żf^@ө.V2p(ɊWY[g$ʖƥE),liĂ#Yɑ6ɻG#'I@:T01~8>~M r|̬Nkɗ) %-S1I$yl!(|6 Clc?H>bq<f|{SZ1A: M9T%MsS"ʚ%gԄ Ub ;+O nIi V[iQ*\r0cf?-_UI (闼gi$e &)Z J U/U�F lD\]ךjENTî"5o7$*g`|:� Ϗcf&R e^:UWNC+fo I9WN џ@4O{U>OTiաTl0sk:8WGYg%79H X,=k(}5ס#0*Iek(U3i?Wo5]gwƻ:ׅڙ㡴A#sYs,L@O/3 2,9M0<dQԢ47_ZTד^ujn>rf;t3G*U`K(FCeޡ&G;!LqEr4Hf,ē$>wZ>T0嬙�rCUȌ "F�,`z9:]UJbz,ͨZ9$cG/zʬNc( !rMZ4CWPɟ :$ .ՙ2Q B%-9j-"s.?b P 4gA2Z4{T]AgйM=PPҸ @I`nP`Iw>V\IjfWIrҾa >q2{@w(�Hr[^O 4r*S^崚Frl|-=9'*Vr1|Hcʢ'd eH;ֹc לɤ@CK.o|+kg^DtE/UС˶GYhLɚa eTh lcpy+ZęX5uBpD t#zQhM=A3E2H)wD&K*kc$_mf3÷o^3D!4ˬCfkp<iVc҂f+z/!{;DMG6P;t>)$7~ E=q `5b0J!̽h<]_șg0^K0"ŽS%l8ŊYiݳX,HPFu7Glq7oc5Y,IЧMa"lDFC"d>Ƃ87h>4@ W?ZP>:x]Qv |BkP34gbtQ*|\80hf ])M륛$#Ʀphd:>%!:F8=ʖiP(Ǫ}IFm/Ÿ 8#NC/iJ6#}]]:5cKՔ)Ǘ6u|:_Jh̜ mߡC1CndG{]#�dST׷-[zR(Ǿ!䒕Pku%\5eeX)Ɓyݸ?Ho]JZueT0 .\##G t`jkQ`s0jYǶU:TQR-Qkd}[-v;0+cQ4��W؋HHhFv5ӊklƙbu!g1TuZsRc#Ra1IVUiDw5xuE$K9$`gꤿDŜx_m;W`w4TRB֒O߃ޮ<X(j3hH/i}w>Z@bHi e:~X ׅURGQї> /ȜInq>NMT@'f\_Xr-W8z`Xp;2KY0ۖ,|`a+q?XM&�,BXŔ?BzHQhЗIM"va6mV:9{s)]J N /WX2%|!΀aU`4_b(&&ѧ $JԹ4{n?iIZgT`>[+k.fI=F ێl{˜6 : fL=ua.XX `u 0ftoeld+aD.ۑ %8@v=˜LAJ4SaG\JU~(Jhmt h,\ fq ' kY=d7c{C 4,tA\BiS8C)-g-c~Wٱ`IP^<yY;'6Cel.V32}^Q¬8_;f`&CʴYDۖՠ.o%=F=kȚ]:%9ـ9I[*i9@TBV5I2E5" .G0#�- !=md'!-QCz=Svy_ >CH _/Iѱ5A<`KvbRir j@ʝ[' "*ʟ!(ߒK.~ 3{{=VsMF#-RY/l+Tq!ZDš18sBJDδ1{&5agy(s t2ܑ֥ 5.!;Z5iXi!4Em'$-4KmVjFiJ7C='1o.5(w ;QRIGGp~~ =OĢ6{t)&y֥=>CeP4/,ѫCSRIAA=_Zl}yfy<M{cu o&Jz <36bh@6Jt"w@A'{<>jVyϱ,{q ١E:֍W YP`ʢ|'M>nԢSQ@ ϒK�,vTb FM^WV9M*D(Ȧ;﵁A׿q9B8lG\  $6R  9h58qHN]4u? b(иquUu*o r!}E}Ӽ!UAd1FB;t~,�� �IDAT4LV2sjhz'siT_kjtESqj4D*YKn2xmB̲+W~0Ġ=MC0y=E8_z'՘6܄ꗴA*0B "֓)҅<j#4MwZ4d&'ߐM<[|WJWΦ(${<pL]iRLy <<00ϲIW;㨮A ϊ,/eQ@{lP$RfhչDSX_}vz* gT' "6(`.m#+Q+yD+P `#N8# zZK1TzJwvvq<Hj"=;fm2\ĠKbOPuJ<a2K>]6>TtDsz*4$wQ>{H Y Lt"cYCqdbx%+`Uu oa'񏒡b|Ch%1pߢzln$AD!3_1+Kй;8x)T¸aXe.>FcS)zX tWSX8,wztp,p ϔiܱ59fU`/vZsf,zMPQ"+uLbYNx/c# #i&<j9a~zq@82]%rVkި٣ݵWyy'Gq$k 0+ם6qwu$KWu-JgCD�*870~ @bk=igz6 q2]>c<}_bcy9ŭV:} g 1=A(1a(͋,=Ou/Ek#< #f<#Qr[#{7ō5<{1oWL&]y!3 5mo^͇�R0eH:;X8jFB8I=WXxLỳTg`�K$A?D3rK{1q tfмkӔC-]r[˭c! j^sk)n7K#Y; :?g 4`*9]Y oIp koRQ*B> i%ZLgxbb W-%Fܺ3*X;ml.cqs2QmXf5o,AxQdggdܡ` 3i"CvKલ\zӮK/*aIe,IHQRyR'Ω]�K{I5$U,1bG=M'FPKVǠvg+xȌ++&DqI(B@'ӵYJ<2KMbZXꯎ�dSp0mLLI׌/;w? Q+;E__Cu!4R ӎ Oq:͎:Y|bZ^=j.K?8B;Z  ތƦgB~gA_p}Z8sco~%jCρԯ =h{-u+gt:Tv>GǮw%M=R}ʻq"F%quw&UuwIѻ^:#+/_~O/W7d n:Ce家]&4H�`uѰxۡto$|UѤ:6?v%7yIQ?MA|}= T}T,ci queS}9_,R m4vM[lQ`Iָ|vMKͨeQYN<G2 i Cf@F,fؗp<m36ig+[}xt{ػ;D 1z#GPuvJJHOE|Ɨf#g*J3B.(U6nZq)#}d6f-udc 1#%3y˻ HAqPѧѷ7,?!S^[hXBsJ>G)11K5Xk;Ŭ4RQ`q{F`1r#8<j>qdO0B]e5P`S)ŦJ4tSKq #OJ| C1]MȼNpIl,D)&t q ӳ.cBV UиhZzE e!pkإcJri N�)fHW(|6oGx  ,;b҇#`�qk?` 38}аc�LD%F+xH-xzK&ՏӊCc89Bl;je~7 .2K PGxAy DA|Y]<tmc]:j&pj؎rES2X٨Б֋[dS~&g*(xHXޥRH(T玙s΋XZu)y$8`�~aW�~w(s:G2R `]!G%X`7h5>lFʷL/3L0Ǎ&l^-I6s ĖKfaũ :y.=&+1S16sFriC& s[`gh0q0w.#BhEEYanѕ(QGD9 \^cA Or9'zH %J$Xr%Fd*7΍IUGu_S : XVW$!jQm$_?{%MP9 qmdl8WDPU]$@L(-X'Op sx@лCQv-clis-`�?^ebk'.CF]$mϮ}R !h ]jDp-c>:?I~E7%VxL}=IRQ(,3c`厐a (9M ׎;\?_]y\fhZ"S |I6vI {l叁5J5'\0{//TǺgY]_xa( FV<#=j"x)DZmij-am;dڶu*%<4.r ;b~XaβxipemmFK8Ań1aE@>{1_ΏK c,IЈcc,XT) \DjfN&1Ȑwc=U+>m;9ؐ CN"q}on1dLNb@C.B*?,1"0mvO�96+QS;a$/귘tN2D?eI/ʬi$- @ >+v0blPGYFۖ;v?inc> ,4u"zRF(DV?a ԳCDriqA$= 0:kE[K\ @�{XZ>ٹ #-!DPs\H VB.ؘDdk5<e&r٧C|aA=-*3_>"`څlcP48Y<#*I4CS@p8~?ѿ*�O!A; ǚ%œwt4`u֍V\Uv26pz#T4 $a1֬ge0ŸǬr̐ғF0yRAuUUXn0uڭ_m,ׯT]]~i!RXWқj$zϲؗuenǔq0.0:[<40av7殟U?q |~k�ټZZuݸm"P.ўam}CzA.+[9 =a.Y DL3t|_R;v-HހsߋuaRS%ھ'ֱ<y^,/$tQj�u6aTW[M3yLd3s8y_]Kg,-pgMLE3MLmU(YI&5:uyYK_a�Y *1Y#PEaj+s�Ӷ~ |(*-]L<O WKKEO^)C&Te@,?%K҂b爞OJxϬS+B #=jxu&rjYI,P!"╹o-jrjWSϗQR JEq(d7SLSmpzC10#T]YgceP^Y75;܀L2z[eYCbő8f{a[BJw<~#8p|6RI%X{V: G 沶(zFє], fm(LѦ&Ul1j@9M1n1o<E'QS pdX;ֹ)fHWO_1)Uyؘ5ߩ=abQAC׉a2$izwo; BxC ث%P%]_>|7#G bAm|ʖA[y-5/3+8)cV MĽ<0ψ0Rn:/e;]wcprg$V# HW]Z%+1S$i"=L<k$څ,kR10s7`Fǐ CJe9ø0nN)$ QE⼰;RNkvlXg8GF*MtYZ/t)Df2><KrgLH8w1tk&u,ԞgNWYdd]BkhFN|뫬|*ئ9Boj`m@D2:*lD }~GZbtYA'$-6] 0_F o|63AQs-< >tb@H[G*<|?!nRbx5G�<uLuGe $ |/F~pRcÓ BŽJ_"0'jsJ03?><<GRyJSg fۦca@dc"8N/xLv1˒"ʹMYaVxX+qlf+|YZD+ m4 ke> ;vֶ YI8=*MtPb5"ie\P4�[TdaelʼnVFikclj]x߱ *nNM,6$߽L FL>-lX0ݬ\ͅ '� ѝ` ӄΓTw 8W|x,]s<2 dzPK(> uVr&;1ED.ָmdA[&~.5 CpN �K|DtLcذϓiєN9bk,4e2@ BSE.P;/6*&EĝA[k݂]F9CrSKʍjj1; LH$iuؗp֓hHgYk?=`OIlB'#3gDHdT{<i:(eeZf4-[˰mn<�urY/g&3_~/:Fch8$kfF(`q꿉,A&'۴g#x"u' n1=@Mgb{#Ȋ̦?% wp% ]}Y*Afe  &'_KȝנѬ nx{҃X #6 nhSiǤ-Qe3:ϪKO]mhd* ;Džo9č?xkd,|7c^qˋ/c_*.b38UzS0"zi=s2ea?D_:,qĪ!.Ǹ6^T?ÜE1 . :?sJIix3 cv+<G26؆IHxq @iv"1ō$&嘳Mq9*l㾓0d, F?\KV>ʂK^66ِ,*~ˊeOAȂNB&PE'oCګщ󐖯_t`#Z=&[=.wE}d+X?/,?EĴ@ 2H 2+F.Fm[Y|ÿxhpHɯtg"TjƒԒC':J=$э<:˅JrMǁh›&f?뾚nvݻYNJKYcO1a 7B/J,~wNuC?)SGik18FϙobK#y3ܓ.bL27|Ew+4$ค14h _6=GsRM R@ JL]M~XaQ4m+A *1e[{=g7SE0;Hc)ȏ؎ÉH:h 6G*!*]'RqH I>P,\1#ϯZHBRYFG˰) rVmOǢa 'PT^#8J6<حzp"]*Fv SxlOWCÏխ^FР`_="@DIѐF< ƆR/@ ` / Q8>y&oo�zTD"c0q7=o#ʼ2Vxʹ'+3) a.*tλX{k~YBM)A\3`I$(zI6 C4cz<qYIXc$?V%2h rƦxFF؞(ueƂ$"kBlAlRJzc>ɺDnJe2& ^a.3&-}\c‘iǘEĸ>L(q x!lia sRz+ -eEzaD|y|C  /P&;" o{-ܵv >QFϻfxF誺āeT&^mG}ʝ+ Akؽq B]c f =_JG4Mvr(0+)_1fHeFp>sߔgN1C72aCb@M6Zx:vx,io!MK!SFCS[Qg3`jHke<Jdf#a2YA( z`&X`/nmb&"}":QP@NF^'0xBZ¬W^o? BV0/цݦ?*UK$1tqnY3T$却:uǤjݯ^Qu cg'Zyxmf> TN$jVì@U:ˆbMפwB}Ǫ9䬏ƑSu#ΦOV'$MHE |bQ'w1{]9|Fzbu<=HWLa3F'dՍKKwЁ�ֱ.B1l=$Pm&N%[<'@HϛWc|dB8l\Zń}mІapn -\:;”i}r3p7"~c4A<2Vdoݔaq3'x3{>>}9ξ4K]f6uPw|uƇۥ袟hwjܵ_sM[vXz};Yt;hLB|',/XCLfe &$aP;[zҘSy3s$c~hguWz澔(\p#i50=%�� �IDAT~A>lk H}XyD¸͑ 3ȓ }i+OX&g)eUٸ͚:x:Gcä]mgjcPF #[j-v! }㛽tL`R|+Xyڰ/3L3;&^z/^9HJWzѶl:ZQuw}A<d% WKO/g)kHP=TMG�0j~RǝU(JA<38A,G=ŵ!$`$쥆>TVDXOWXL={IIu TԱ"(�PUX7";'>4qEKP'_WBGJ+lk Lge\YBca1\gӜd]S!g\{d&7c1'B`ՋgvGOFݢ,vrH+2B v8E@tϋz :bEg�rATuZc54\q$<ڀ{֍Xbr5F<.7}҆fΧq?-%m?o^"WU)]7 ÈmŚ0oX:=W #c:ZB`H8un6 J~wczdcgcIz{Tb6݆gMT!8ѨBP"hy +|ޭÝo5ݖTs\zIk8B,3AX1W vˉҗpsk+38ʏ1 cCx&QqK >{Eȋ.]uu&uZЮ 8I. VК@3?҆Fe4䟐Xr]? 8gӞJ0v3EH:e:xF0 RiU M\!eG?.ynKovQqq ^%J۫n[# gOdm餞ТMn:ZCBS´:Y42I-ϵgvLuG/S3ߺ%:RMDobLZ̀LAyB>ߞDI3-j$t":0'=t.N-#Vkx>1ri5P˸CN&cA},a~kʔ9 頄A䷱a @)?-8(`M[H538e881橕RNJ1 &ty`,aL|!""E.E-}7P9BO-KfPR e4JNATm%tY:( \Ki0NrFe6EF+IE#B/^|q ?< N0K2e.t8}Ѭ`3FIziCWbF3+zIjKeJmK#S68;Gq#.">Lay$O}\k؍T̼|RJPH2yt$&V`*i +^T K<38Zԉ4xJ 8Dg<qC,v"2dr '2qXWq~&.={G XCںb7޶6ˮbz2єV-\ BkAIS8J#3f7^gjߓr!RǺ�&*o3ޒ6T*ari">__{,:~]Tko|/+,=i$ :U +O+SUhj8>ճ`µi5oWO"4ĉ* nʼKo[e&] rY>jw+r{j۟}dJ]׶]aXv5PD!=y8Gwp#Wh>~_ 1ڨߝq>Mk |t0ϑx2Pԥ閉V6#*5CAJZ|"E|S *>}31Y״]^bS)Qeqo LV3–0^7ş$~eV֟=fu~ӓO ܯz5V*}x<+>Ĕ4`"1o: ^PQ*]uYuǫнe-D; C+-x&ږd4R!vd^Z: ߾XN8=fWR VwkRe%{rgWU^#EЭ]>1WWAJS;IeBwޠLm i|3CóV@ ',u2]aELƽ<~:օiHRui5wx$}stf5ᤩb&鼮5f^vtϔyK:M?uay7|$m)kl;ƁkPu/,4GWm ~m7H{EHH=ܔ?OzNxqQDN.`! +C+(`!c=1<a{oS7vb_yA"7X/| pPiF -Ahz_* j^TܯhKMQV#Y)% a Ob8!l>\UaQiʐ!`T^},o.qb' (H~)U>{3<D{?! < Nմǯ>hh�P =J}踫!݃\]x(6\}jJz|FR;@_q4:tֽp,Ux#l~ڂanΞJ\# fFEXs!q<v'Z`XcovSæg1V@+n2r@']eX,j Y>B NXO<,cv!>w\)MhFi7f&Óf0USR~,ʤ<qMF#N'8f"@"온9dSM$E,V=D?tG]`v{\@R<͑ӥ-K䥓ǤLc(==Cd=-{(XTcfH P֨*HR`-Z͞n62{VqL} wF\]tlkI'6OBe`Pd&cӥzN1}KP@@k3h|,p DNG_^mM [- lCj%x?tjSL)clU[rB1v}nK4:5N!8NJ `!"oz\Y07q *D/O0˞_l?_1@?vvA:qFW?us_sDՊd`xiV!57(xP8 .&Z\6 96WE.�MO`!0J[* ׫Bp z%ɇKixw,M\g N=6Tw 'y䴄fqB K(D pg>1 !ԯ J-|Z{i<V)RtcC:N =˥j�֮~;4nGJJP=5<_wp':ؚ݃uhp& Y0,s# N%36>jqmI -�YC^|\< |5,K8m38Yqkװ+�'e3ͭb;+F&a�,[8IZ'Cd3:kw]nM6."_\$]OehAiq3Xǹ4`7f,(^}3pRd<'(̝[=?s?Kn;%qwn4.iz6 8n6̘s4s[J/8tIq@5+82Ҿڱc~ژ+Q[>�R]O,n}q6̪;oPwkS/!nS^zqo{ՍE[icaXV]b6#*<Ŭ&{0z+P=az4Qb5Y#r=X[\"C݈hOLΪ)&h"#(ϥ ^:mv(IUgTCw.)w}vC ?4v_ՙπӼ�Xש"HFr# 縊hgt3L3}x~-\gf ۿKgXޏX5^`R!:H]OI>/_8ۖIA'/~ٝd%Kg}oיe=5.XfA]y GGebS8ay(o΍pq]V>SUގ \]'u'ɶgYwOfᘾG6?QM=tȄg=/w`63roj NdzFjѕ"Pl,ckco4mFnɋ~!nbm f/~=:vs\UbзPη#dV)ۻ&V Իnʈ+#ܺ+廙C0Z."X ?\BޢG]UE x\i;'=.vy,&j2תυ&{}G.aR @R:][ce2SdW>SYy;2 R\O0~Gle,oy1i&RxLj!=,{$g2c+-@l73`79PɻGīe3zFC+W.bvq5c'X Zġ:"T ? TS2Hcfk%X"0uc7셠c1@ ;q74X'2>޽5 䅵WQ6ԙ1BZ,,qY <+ρ")kji*B9+PXg޴Wn+GdxeW@2uk%<ƭ5|V O 13D)WS)bY>(E(6Ur9)e;V!$Y}`ɹCKWDU rVGz Pb{V)ajlE$(8qRp17,BG`){|Pkc2 13z3L󤤚$e`Ic|;0'x[S8_[h;%sU~_ gc^cNO;2!ȳnlр<yw`B ƭ)bUaKyVX_Em804k*=f@l lքc�K+x_doϴURM'}\w9gc5';v4ЯC9 4,^Ռ!g{ʩ,W%#_@A[l'0aJ!Tek7mTN`f00Ʀ4W98BPdzY+5خa?)QcA† 8PKg^ Ys Qsk;>:>~9P+K3M{918i 8 8f\Ŏc)YD'X[p=]!fM`ŀnۺYJ<&5f�ܨjF7ș|ք֓,ǕlrMMf'VeU(oa펁|+g^1!;|,<0+u] 8c  )&+.h7cwǐɴ D\eAXP@f k2~ӱHa*c/ܞbu]upޒ? T $`m oDApCF$ܕrck7Ԯ3nj浌,c?$L.&-`d ;o]sz,`[q wp /pE~u9<;r-N+\kcNΣRƴ)2&Od r^sՌkY;&ĀU�&Z ^dK]a-<iI]T~[~s[ f)PW�߱b-b;(!2,}ހ%#בz*ij.|Aerz+Pg3LF۳M}M rzR*G!{�_mO)#<u55gG hRc@-5$<d7ϲ||qj'd& ^31a#ܒ`wV�< XM�g{ fp<ªX2-/|k)*/eoQ, i8rnIX\UYޤR 2}ugE~yKP sli,8Y,N|Z  N|M4FOuUuVGFp^S~Lj?k㟶7#.L*cv|$>e@}??Ō!o) U^s~Aޚ/f£jzlzBx\ʽL1˜�l\^*\>a/-5h=3h\Gxp-lp={RPd�.`v nz�KOfd gc5EY,j׼#ֱ#N?q9G,7/p�Kps<9daRI[bcjS5JïƓQ4TZm_y#eV!yFE J_ZSn?ʨB`Kb*%j?+hɛm>ž:Vm4jYM~LPO&iO2s1<)zE�fZ,aQK8'Eݨ]2:uWNP%Y\yRU`i ,_3<I6k !n+6艇bƵ}OXcΏ+n2)b{*)tLJ9D4=>O ȏ;w}<Oz?GeY2yLVK1n _Crv)G ' ٿR'Xd3/y37:;,$�t tRmuZbw.R >F`Q=ƍ*[Hγz^eҒ4s5_Aϕa0!KB5M6:nq^ Ǚ YXjZEG뫶�fZeJk`GISkq[8Tv.w ${B&}mS*15kŦ{R #N"�]M7^@6>F&Jpr$�@5[6CģG0&-<=K9Mnf>(l*jۘ95BExν ' ki*1HbRgóak Wou,H>vǸ¹vҐ%W}˦eѹAxm[WG}֓6䉵z*aSa*7=_iJ/} O_g|XMHp.N c+PoCmyVU-&EPm8E}Gw#Y.%!! *Qйz m_Z2H+#:vΕP0�ͷeCwJ8xPt6$#av'4]E^1YС$B7 ]>ZB#f Sģ3L?irDh*繎0kxJ3Ls�X8UDއAR¯\x/.O, ^R-R/!vWi/bY;0ۓwh[ÀFA+5ou*9q7s8NQSmv8Q)ԛNzcAmB>fَ�� IDATD jcRά0@sqr28V|�m*Vq 6OVopxx ](֘gYVP\ nh(l*3NjẄ́Í[艰gd֒c=L|X3 Xo3$ΪyO3LDŽ)*X ғZ:[S8_vc{{8.␎}L-r^�w 5<;;eQuDuiJ+n:hER]uIW4i2FNWhU3T#8'Nr{.AkzjAbH#K=}dRX]Xdz.[a=SToG{uWJL4NѰz3Ar78]_B<FthU=o8g3=߮^2(T]a<J<=u*+*f:} 2v9`GUCǸob%օ 8-a:q&ι_.|>>Uҽ*W,P,W{k0_rJU�+PAmڒ{f.cmѹC/hQ`v딜 jSx2"J|W"ƌ((C /HczʙBP|/)I5I,QځY$ <<bƁ=鶄#8ͥ#ԺIǻ9 '@'F~M0%ۛnKfSY'M0X,kxDHH KI07}b ;"&N0Kg=a$t&w/cEWcdy8{[T[௘|9S3�ڳ)x` I8!:v8BIc$)ƾ/X{諶Z;-?i0'ߋ='اsOHboZ4N'M ei<6בf (v\ E$zRv͸"[3u ,/HZ|`-;]E^*Z`؊JIg]ƕ$ϦM7<XC(X`3ET*u�GRII?vɝbIxGYUiL$yOs*H2+7r=۸"#kv`cgOqM+O1ޚvr}cLqwW)}Ta:0) ;�o[\y,:mpa&M᜙\|8ynp[fc}A6Au~D{ , -&abti_u3Gi5մ(Fs?"lA V&/UI#fV/pk~ 4 N7[VVyXǒQWr3F!h �P}P;Xs0h,Bp0PIҙPUWwQ!n NOGʑSq'ً5(aۣ?fIH$"ѫyM̊23iS.ָ3bSŚGM#QQGjk6]3̱ă+%`}k\YaZCXO5<w� Kſ@`4_r r:>pr67Q%prk  SK{�x/_ XOeF|ЛLQτ�; VMǓ][ZW1{-|נ=X; : lRHt:8LKY5uL7'wkPKZl(\&3 __%8,C#r~u!-, <Sy+ . +:d;|j fױ s>Y4O__ĩ#Hb$ݍC]6)iUnDeӐdzPT~4qyIZen$؛PUQRC=ƭ<|[Wh:'cɟIyFŊ+V+bUXbŊ}5xbŊ+V<VbŊ+,|C)VXb_{'y,y.˿W~A^u_+ ~ ^Ku5Ow,y6K>A> w3JVXbŊ} xbŊ+V<VbŊ+V<VbŊ+XbŊ+XbŊ+XbŊUXbŊUXbŊUXbŊ*VXbŊ*VXbŊ*VXbc+VXbc+VXbc+VXⱊ+VXⱊ+VXXŊ+VWӾq_<+)T}%˗䱲.VXb^{_* 9+?yJVXbŊ}=xbŊ{eMS³C}O^ⱊ+VX+VXⱊ+VXXŊ+VXXŊ+VoGPXb^{5OR³UXbmz?oD;K +VgHbWrS/_NXŊ+Ec]LV<VbŊ]^wⴊ*VX5pUXb]}xbŊ+n/VXfg[^ R6_En՞xbŊlKW<(³`bŊzXXŊ+VxbŊ+VxbŊ+V<VbŊ+U+nP+VWľY]౲(VXbž1?Y+VXKyŊ+Vl[O1����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/cubebox.png�������������������������������������������������������������000644 �000765 �000000 �00000011265 11332353404 020372� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��u������Mb���bKGD������ pHYs�� �� ����tIME+C��BIDATx{p߾o0oc0IHȳ4 4^rwe&޴]H$\m^(=Ii.M^II$LL�ۼl01%[dI{YZɒ*~3vWo$I"=B��RiB E� UjiڿYim}Z�R֣l?(Z�R \!g$5y-+/^;|镶O).:uٮj/殼@jy.ψrٲċB&[ePTŵ+70 wu hL%<s5#m68� _\ʤTVV jm 51 8A2-~cϛiiEY^m9q#<@QE%M|XBGA+v=ڔo^<g"dPeE#Vh1s/sO&%_~g㋂E!΁"9|z BqwTKR/l{`~ɬI䒹VhNZC#gLZ+bX5('`H`G"+OowB v$2?\  8[ogi,XB:իUq7WoXXH).kx]\u?~9m\AB&!$ I ?IϔEGO|HWZJUQ U 1)Kt~T3W#t:Ϳn}Ol\˯sjݷsќF=orl ㄐ4="f.徛(~-B',,+|![_]_[wҽZ:*^sÒXg;ݵ돇c>BHTWt^!2xhĝ衧ۯ>|-W}Ny`D$GACv^E >Y573 t EVʊ*CkΡkkMͭWMma59yEO4zc~ Ƞ;`ȟ-QRps*;lpXgkC돟^6ouZX]AsXjp-7 cJQe+VI>}?5BHDo0p5 /<r؄.wN}w_Т?j:?//,)#nC-_Y\d2h}|䋳4 <&JC51Ԅkw S4,rב$]??z[n\Mw޸|n<a[ZWVZ\]nYg??`hBSS(EQ|X[ -]SMd+/q^^Sxx<;,IIyf1LԖo^V-Ve X7j=z7T4Cxd ^�)И4ݽt`.vxYB^:E2ov^}>z`.z1T.6ƉYŭmln.^;XO}H?!~ hI ѨG !܅ {g5F4EQ XQ!zq5)j<ujq+GZ2>C4cplvq>!92z-v'!gZjw}cihQMɕ}ɺP%8e{(pPTu5F/|"<q Uk<px%B<O<߹6[! !njGPKMѱ$ޑXs5U}6hД|uo: <MT-gͩ=- |i3MtYJ v˖aѠ]Q^󝏇;D6BH&)&̳>ĺXk>냉_Ò@Elhas>.yɺ|a%ys\2q$u_:a**)moQ{gp''.,-˯\zS ペ>=]hR/Y0ba-6YTl]3؟ ~LoOlz颹Km?8~x |K݊涎nYq?mzncrkoSLYRSv9Nq(%0 Ǖ7.wQܲp _}k\}jDd;_2?pj ?KmM<ZT<-W:nM38bHR<{0k|H\_3|>GcW@ 0 'uY*rkrjMĂ2.!D2>_ǫX8ܮ@ 0,+V o-n9| W35t &0X6W[+2W3rZNBOP _+w:Ů #CyZI" ja3K EJk`9>)ы,+0,ȩԱ <NEѱO(h.UZ(&D |㷁(TX!ZK3,E rPĘ_ʫ$CQD$([:!UnF,;;Ã]g]6UY Ui -W`:\*}uJqH'e0 70|I5#p*u1ףGPZH^0,3qGѱ1eB'ż&4y%^RB"R� 4zS[ۙ$15zE*P�.q*/UV>_0�Ĉ.쿸6<�0aArv؂زcw(b"T�HQ8q�IkllX � �/�|�@���/���Ȅ?ME6-'-eobt)c6| W�+_&}L?BWh(F,X'T0>[CzJZ_Bm;FlDt �L=A2T?}Y9R�((_ ݩbk |Bw#}; \"FX&b�`:ŜnKfv �YȗPG /! (|jvҝFϹE/ k6>N Gl9NcU#ȍ� _��/�|� ���/���@��� D_R �KCC�R/�H�Sc2s|����/�|�Pb@ִ�꿄� -#�� � _���|� �|nQ�/�|� ���@~~_QL 1m߾=M8K�d2`k466n߾=5�3w���� � _���|� � _��/�9? W�D%"]�\%}��37_)-����/�0EQ$mLpJZ5(ѰΗ Rx ٢(hа9/ 8}NU ̿{�|@�.|Ƣ `bЗɥ|BqnBO4,G�|�@���/���@������@�� _����� � _���|� � _��/�|/'1Lh�HK444Q�`bK}}=�d2mٱ;_̿�@ _���� 6zoQ<䜨jդ9Ԫssu JmcՓM*1'939'*[jjU�H � _���|bSXE6--$~9=fک=PmVyGG-Q0c5Dᗙ&tCy~tܰr|%i)$+Y5~ _T5Yy+F` )30&9X{C gl IKMmFyZP;bJLPR5 /[t_l /QDLHՖ=-'L@t(y I㒦fLKeφ8'{+jm̿ďdǤT`źёӒ9 <[8~巀Ҟ<Sի?3'bؖLiIg JTˆP{ 9 =ʓN('tzaҙ|<&<W]b褥d*iG@ aĵN /mt_[6΄K"Nd%kfeF#Zer:&*NA%jZ/L?�r{j 9.x)±hֈK_I@�/�|�93%W93g |%׿uK _4Ϣܪ-Unۺ\*:�ɴenAj=�����y"OL&4 �8_4N؍F)DK��R@[�@jQ$=�jڿg����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/cubeimg.png�������������������������������������������������������������000644 �000765 �000000 �00000047722 11332353404 020365� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIME^�� �IDATxil\yIIBj(^*Ytq6(MǨh `$Fu)lS?/ӨH5NVm<H"'mTn*mR$f-EE{tnsgn灑P3s=,}jٶ-x��@.yGU)W<9��~Gyi��o|U .#��gP,�pر'OFu6nܘ>577OOޚ5k.]t뭷n߾ۿ[_"U� |'O[_ꫯ !֬YյeY}Zg9x 7ٳ/R}��ƩSn֎.[_}ᬮX+W{_#͛\Rfyܹ__߰aU� XEtaibU*7x//ׯǯ|+zjaa᪫۩_|qrwAn�@ިT*](G!k#X__{뭷xJ2??Os=B<xŋ6|}=bŊk}+VPڿ˿!~=<xO߶[zq|۷oٲ%ou;p֭[}=y;vLiӦ;Ce�@1WI7~QoUn:_,:qٳg 'Ow??VV(Bgy}}}+Vt;S/?~\ʕ{ޅ ?Ϟ{G :uj߾}wwxW?n K.-,,xxO?X9 �(Bgr7Mҿk J/_GG qSN} _i+ΝT*^{Ο?ܹJ !ϝ;wСoyaa_B]V7|/>1\qw G֯_ϟ;wn͟'=GT*7n;e;ϟ={[|+rmu]BgᄏqƻG833#/׿z^OGXz ^~G?>@�0Wnz_Wo!oFn躶^A5\[V___Z=qwq˫K=:66nݺk.,,[o !֭[wرCmٲѣ.],k͚56mڴiұcfgg>{xݺuǏ߷o_ZT*',˚YfO<ʕ+O8q9!ÇlOή[niiȑ#~}]V=ŋ>А\)W\~/9s'?5\#XXXT*.]xM6ќ�^AɎ;\_].o Z522rҥe˖---E|큁O~?Ο?/ !V\cǎJoW˗_}Շ>uɓ'Ue˖ZjvvvqqQlaÆgJXjɓ'=~C?shho߾}sss/ҵ^;77'no| hzzzvvvpppժUrt?g>e˖ɇ;7^7<{;88x ̬^zxx̙38p, ۶Ϟ=O�SbP'<ƒ<w3X/ß?~ {on7tŋ:433;w}7444==-XbE^{cǎe-[̲,ƹOoĉsssrɓ'mFGG˾MSvۅ b g~[]277wС[쒿bmڴ骫:v;; }_|=ܳwjzJĚ6�H:Ɗwz[ _ޗ''QRF9###_>WW2�ۿ??׻|Y\\<tύض=99o\xW^?|A-v^{M$׷xԩJr3gHyVϒ便W_}u7nm޳m۲MlٲJryu79o```þAHXRrO'?ӧϜ93;;/s=+V_ٙ2B�^׾B9OO*R|_]j-/~T*ַ|) O= l>zї.]zפ /^\XX8{3gn_|ԩSO=ի9"Xjw|3wqqQTܸqckvĉ{O_lW_=??ĉ6lP7pZ\\|뭷tO*{dH۶|ͷzkhhR +W\lo �\D/zr깲3^OyAgϞK.}sۼyxfy}dPLAիQWcHB9rWWϞ={Y9444f͚ 6\2J8f˖-8~#G6o,8!DZԧ>nnnfffÆ r~~;wԔwM6^J!IJe>Oݻ̙3m_uUJ󆆆*5k 닋˖-۰aêU֮];44$Т� ;gAWPʕ|ʟٟ_sX_o޼S~>Fj*9 ~~)Dj:??iׯ_5lݺ^L]w͛Ν;w~^{Sfgg7nܸqe˾/;ߑp_W}Yy~ߗ{wyիRǒeYw}ᄏ$>ˉR"3]w˙2<oyqqQ^zkFF'^paiiodd䪫ںu5kΜ9s%Ї-[&�tSCٳ'Ǯ8)kw~H1֡C߿{{k??fffn ؘ\2b+V xjZ M WZUVWZeڵk׭[WTdcRYraںuҏ[n_u]wurjߺun馥%٥nݺA˲~]xQ.;{l__{>lٲf۶ ]YVnٲexx϶텅˲l"'|+Vl޼ŋ727l�H-g?u}̋I!?yתXɺu~~arK/$wo JWW\J[fwy=nF+k4…j*;׭['eippJ+WIW_}5-�+Euҹ_\TV XW~W,:vŋV\ya3B�@曣_kM26RU*n;!Tm�`.+("6lWeu-w[�B6P?N�@ bI : �� h1���r-c)~���h4\c�X��b��X��b��X���(��X���S􂑑O>-ƂY'%k4j{%/:[2W:MO$zEM1VڤSzD>$7~.KjDyVJJB722222rxA/Te^2''7?-zUS+dr&EBVu]Ե!1\P`Wޗ՟;͢ͺx]%7rs;pp׏"fNPmI9m3! MۅcHL%QE9V-ronks֩k=q~]oON ύ^;tINJgSKXpT=Z뮒dX?r)DAZT3vs~Z,IMalGJmyQ{ 9J4\KǞmE4@-4j8V\rrmKպx.Y ELIx]16 9oot ȷpe]wf$Q<WD|^M,==m(eTTv<*J;J<B]|)DYݔL%o)ɛMh*Wel/esz(Ӕ .4[VPvՄkcQ&i`]n_-RUѤBjQiUSېmhQX:̽{)mGt[=#<t[ �i2] ;vNOOٳ]� Uyb@0SxT)r�PlyK�� P,��@���P,��@���P,��� ��z,1��@cݻw)��wB�� {��1��11sX� ]J( �kQ,U�F7i"c��1�i|G+<ӧ9:vd*UQ{yȇ&ƛiQt!B} iz@z sxJm+3!>/q0Mz=wOK wWm+�D,2!C2X(B-\*BE}b}p*߯ݒ+32QovW\7E�B<3/T 1ȕ+3tEٽŅok;NAy߻>OJwzT;2x =EyPX[usKt͋%"lE|b\^ѢABeMX6E1sGQz#S/aVGSz0.DoE=Q!; nDocV]uRah7 0K'k2ۂ<ThK3-ޞEK5:]8ACXK xLPENM\. +=$BC&X,Ԑ]5Jۈ?`gc6K#DwύxjHGFQbw^(z-q5ZF]2K�eU dIr<';d9iP,(si\$+_4��el �bݻ|{XX�;΄.iX �蕐b(*vX�H�� DcüEg猟cE-]*��Q,% _]\7%q`#�d-(v B"3_ �1VDTD,X Raׇ �@Xe+jK/gPeWеP05*ct&ހh7E��E (۹ H�(BU\ڏcy'G^YЇe \#|;�c,Mj箫nUl?<iƫ�@�F5ym_"SI|J,d %XY� Ɇm ng!Y�y Z�Q&l[X+Xh4���8�P,ؽ{78��(9sL� [XqL- F9']b�@cc�@mb}o}]|8 @9B-S0r �+߿cTף���$cu�$M+H��S,u`K �� >]0jR)3�u*zg wQG��ĦXAFVW84!JZ^3Ua2[bN)j �-Zsi[d_A��HN-kJjm � wrtk¶.I+3 &N �mtZքeMv]łB�ӪDŽxR.T#=^c=k*w&B'JeM ݶR\a%-ٶȳ\(V9sJfj ze{-k)NP,|fMNԂy=i\5KbAP\L+5%DM\yQs)YuP501ۮKRR$E˲&\v]mBcYS=̪FO#G|o*|翄g{H 70L1۫! P?T%Ǯ 9OU9ڻ!m94ϵp!*,geT)W1U1֐y6}Bxf) GM\Ms'B$;T5֛sO/6E=G{ H7ym|D1)hIE+<R1,v-n Blm!X*yI[~k\K(A͏O=؊ʥj)Z`Ͳ&l[r>],!lY))\5yH&N:{\%]}kPYExU%eLiS%-TÔ|%41r!iU~oS̊cS$2MU.d@5;ϲ,oPU,vcD|!idyP~\,Rza%W?W~6iSh4LB1!tMhv%JKOK.R`ߔ :;_xVGOVsB?|$ L OZc,KrH>DDJ}yVr:F.߫F_~f%ogx\n 9xw�bkL"o;OMK3;JCv9Pñw?@6+ʵhYe=.M��lty m3X��L;{�KP[ JK CPb%Q@@d#P{n2!q @ )PiaEF#'jA开 r �r`b�` b}wkX:?PdkϾ%"捜7( :ccŲ=vg7=}v9ᵡABPyH6ԣu3Ϯk7twi&)(I%S@0�(`Dۺr~~$9B*?5 mҏO :XWr)HiCoiщ\&u�n¬4#|.v�mvӴoXB3.D S( &dy-]v-Kq8eDt$t4K;z2heo@1+ 7|aHe;44:vb>ˢڛ{2P pӎ��$*UŢ/��"h�Oh @H27+q8(Xf{n2!q N)B =K2?yA~6_^FNԂy(*d��X���ѾWEQ$\~jsۣcDc9n{js#QbP@ĶȄXzя qs`?:^$e=Jh缀;7ƒ&@Y\?SpC/ �� �IDATc&8{"HlR�̑\0 (gOQ.o*v%�‰y=VG VAyy(Q=�b S2rl\@9Io`%Ҍ-Pd;9'cr?$\,϶*cR@&X\m}-*ȲdN9ȺиPf'c ҿ�(K%XtV��@,q*�Pl|i4dPlzjb%Q@�ڡXɲ{n2!q @ )<LGhh4rP rBs#��1�@+MdFhG{Xxar, 9:ʇ|*L/ۆ\A,OS Õ7BjM:NbzjEB0sk^涡œV~K{s{yrvU׹m}ä[`i^!ɋRiR`#z5o  P3w;%v?kMVF0WW"&/ �O\u�qD| CV5:A@ŒICV *@wf 5`Y\P/CAtG> N},\Ͷ/kJp)@1EЇ:/_ #_UiM[ ΈE&X#XOZ[uB;}@8:0WKe3&[p#ӊcdClb!2>>^(@RE&�XS@�b}�Xy>q �b3�kxxL��kd ��;v*8��y`xxxzz:PDvr <ݒI Jp&ȥ2@ieHsޒUi4*vV~Rbbr?<<(yeD(ʐ%IO��`(��X���(��wi=W`;m4d4Ӗs :78Ҹv0 L(3Cc,嶏Vz{aܛ WvzR"%٢Aw %ؠdhoAx54RSV3zz*(mK-!ljʢnƱÂHoC$be7m7{#U<^JTjQSSͳ$d[A1 Om&-<OFybYTijoiutU&w5+DlD'.xK6Ld$.Qns,F㕹=դ7/pR}g~=-Wem[FFbPQm1U m9, Nun ުA(T2dEbVfVR0sZIu x:/ͤL Og%r4>'-z(E{V$z-$^YfcH+7PGVLR=Iᅛa}bڅ1aI][wĹ0ӛ ߆BzC:yM!׮a]:ӜU"3IaX2i( 1U�оG ��ٙU��+Z,%��3@�� {FiL2<<L^H0im6Z=#<t~z||�ӣ{W��̠i̙3"nWL씐u@y^'iXF:{[ҷ7afU[H9: z� P,��@���P,��(W],]6 Ų)ﭺNgK M$'<Ɯ'ϻ澎o :=6b,w)~CKKAs}C\ύ~o :7bX*;B` k}uM-r7iq[Jy޶T~[%4\Xk)m-WB< Pj)'tyS+t]\<WK'⩥\JX"zj\%-· z`ꁈuH??!6$!WУEQiDQNLoe|BR#^oR”:F$I U3w/LCRub M4#_')YN$DtQ0aW'>߶My9hI<Y幹r-"( =Wȏc zV8m)OnB:y[x=znE$LXA ��fb����b����G 6ݒm Zr:e~C=#KKKǏǑq��I�0===:::==gϞja��(6nڽ{7��9aǎ ˲h�eME6==S � F!WRU��Ō΁� �@\ FC�F4(X2I $Ix^8g8(z0Ve6FkEQ]sC;RA@(~Y @݆(� bႁ(��@0%��(�����(Vi``� X*J@0h-o �(/r78. LqD(_"lyUr勏+DK-Ɉ/yBbQ,dd|K!�, ���(V� f.˩zmDSN`,$&8P,�� P�p�Ţ5 V-Q, fTKJAaAm[ 6(� X��.b�A@n @F3+-��xR� +bTQDf(AZ'W^<[L3�fXL3X���((}� ̀)J� �@0�D@g �4)eJ�YFB{I`ʨX��(N=P|�A |ȶ%,?t^^ <%b|(T0^ P(�!K(���>d(P,l"D-�\(PR?P4P`Z�ӀbѺ��pQ,��_ �P,� DP,mCr p)D !/bQl�H&yf(�ob�@\~ �(rPU^+  %SE#RRsk7>?UJ*T)9 S(PoBBp$PhłLIM" � p$7$B@�P,\9RdcDsO5�0LT� ����(mF��clX��.g)LN38(5(@iF%4(X@l�(��H-P,! ߢBP[Eo Vh�P,��@rI:&t@k8�t9Ů�(N.��X8�8j�(� ��(Vb xc�X�@ �$�P,�$: (Duz�(TU�N,(�/XP,��t��3 ��P,��@���P,P0݈@ nTfx(� @CrY��k P= ��scڊE�y3e%1i+V2B"d3[DR CZgU'�P, 1�Sb�@N!2b`>E*&NP,�GbB�x_� XhO,(�"b�X��@HbQ��t*��b B|� ��P, jR+�FT ���F@ ��E487�b�X8��b^p�PA��PX@q��E�X��b/jRdb դ�Ţ1����N �Kf@'(}K:u}*O-ʋAu>)Tb,m ����"�����%�HX/XDз*0>1X1]txJZ彡4<fVW{ łD,շ^)R\{_<fV8:^AR]sIOCM�a hB-kʶ|B&ĔM!mOY֘m-k"D7 1V[Wl{LMTqeMv]~ec5.NU=BѴ1!v {[uR�by9f-o&T,ν5ۮ;1c[Gzg#�.r+TBXșdTI/J&0!%BM!圂QNO3bb'[!?$gֶ5!DS-r.ك &"<<G�ł V]*G 05h:S!ē&MXք#E3uJ 1n1f:NP,dt(bqmYքeì63PN٭'5IMl.=҂'ΩnF!mujEQ JU骇3KbwwհIM'D^B!n ˚VR^�(FzϺOgXNg^ __R;9_òxL\^dR"Vj\7�d+73 Lz{]R$<C7T>̓t*m.6gŖ+sQQEsR4Xj怚aYT jW?QZ-%C=- B<*hP,n)MgeՔ:5{r wqSMDsrcma]H�P,(WX)VCqLF]oZe쫚21B* L݁>@ JsZd# n.#Q-V69VMh]2IbR> [PRd{u ;ĕYS~z[3 ( MaN|ˑvZb#L*@:m[к̏K}۹tԙp!' nBɊrgB5qQ݇ НjhW5յm9f"%hCB!1g-:D.PF*7f78bPOhOUyr5n+k'xL]Bgh9G?E }>!t!k)e95R=V 5璝* ]Iv9;< f9_5h: eR'}w~).1u*_mͲLSFmګM90&92' 'B łC>L;-tXfa4ӊ'1q!m9{C'mJ0U�(pJ nZfeW݀N�t::کtwߕǗLvC]5t>M4OXœ8w[4=זK7j_An8 3BL !ARœJsd"#(V>õ ~Tqߔ<}Ufvul˚]r-kKw? = Ĥ78ˣ\-q �Põ mO9jf]CFT\S6h*]@tګ(lrd gڵcl5!s^)<僎�ˤ,%65!v�Kd Rc`z=kX9 Bת,y5Gv:$_DmơkgwlKe^pCs3]~֥[s|= 4zM&5G.OBkcBXM!&G# Ky7ƥ0S# UΓGBypK yuHgGTD5h !il;]m r8$�c%SdnRKj5MYw޿/Y3iޘLƮvݲƝIB_W$=rRvo ϹJʘw@PbS-Дi'\ \+"RQNDۜ!vZָ'DͶO:W@ !&)! :QxDk&X�(V$EgB]\|ok]{k[oƝ\+j],k\i"F KI!b K΃ /+{>0 ˵buZ<<'mfDÙZ;C(.O!إ`9AXSYԶ/S kGlf {iLp0(Vc֤!aԂzoէqP?QZMM&jNMݶI'A]BlbR K{dʾD̹2W 6X`Xwݫl k~umhzQl^Im#B-DM !/|GAJ!!/+�J=.98c[@*9?&rnoՄhN'Ғ_\|XPRu,|Xw£>(7Zɳl@MjB^d*WMǵr^bӲl{"8^Amu`W7�(vEvݶ\~+P"sؐ*dLP={| i5ퟗ6ea YݒAH�b8V#ų,w9ht|B.uDIMG]s>rEQWiiBL3PC]QTMӂ%bb,\a2ֺm>a^`5Lsyv;*+;33b96Nva$d%Ju~Fu5\ETz5'Қ \v^wcZ\%g OX֘sN풦V{]T5kn15 'TkȤ"޺-<NZ|EOw !,k<Q.HH߄ɑ'h] Nw(!ՀbYiq BXtMUP4WOwkcx1gjҶBlkl{L_y}wg�1Cb=V?U_j ph }a*vZkSڭeUDظv75d%~ "*Ӫ} )W>髀s]gޫپu('Zb 'jZhSz'�[ U 7Dw~wA}'o'|;t9W4kڮrqo}VCx&w�@9AڻV\韸VzVrMGyrܲƄ{Xk/v5PȵYoI%%}S;E&�E3]Iz=;uΈ[wWXBMUˁ-kB{5Ġ.rۉQO>8ekfj};{͕Q_aľ"-tyRR2v1ce 7Нg[yJrq)Uh]&MC{knfiN_⤚vcB<kYr9;[OE1ѷ0ڎl+O ]J* D%s#EMBa],v)O_UN F˚ OjG ͶZrzy#c�@Zx6 k񦼻iٕ%rBG&ZRFK?PM cUEv wwJ1�.ׯ, yn%k=q+x̲&sYָ\Osx׬IB[+@PqL~аOrmju}IkF߻?femwzD')m 񄖥r>r߰yn|GXv>m}4েYa֮ 2r)NwN! S@ָ¬9#;ƱjMIWBSywo {G~|N m{emwl(W�Up9OJBmPք~`cS^Rqql]n[{z,zeO·u>n2;xJ@`q]o[6tkv}Aq']oL퐫ϳP6�($|Moz$r?늄Z{ {L蝸(k1N1z�^r)ݢRjd��GIDAT#h¶7iLPeq)vCIug90\3�b,EgT,<xLns(IVM퓭¦>wo4[ߏQ7xM@H%.Zhlt-+u(֟MĶYAjr)@(BA(VZZ<"42;eC;vKTkfETʰx9�rҮ A ??*wGNރH,kJmַSڙ28麳vhdSboP}�@+Z!C_EWYPNk4)|:-kM"JS3�P,0Wv;WJlܧV"kr]\#^jFk_MmcWRD bٻ]R*ס!A1Y<rM4l뺉O3ERLR�(ViS0-*Z%}$q®g̜@TriG[;e4Vx*w߁"}Rd@ZeLm7}3NF P,(9PuMBחk'{'M=U"\.�@4!*P*Z.n d �P,XL >ZHX%|IwM} oJD-Dah*�/0PeOX9X{~JކrʵwnӃ減1H&@q 4ܖ{<zu{JI"] 1*}5\U^<P-.1ЗUnz\KԖΖ5!Z;5u<i5N"Vq+sͿvOfUg�P,5+dvuQNEW\jL32?�`A -KI)V=6-v;#@&tm߇�K�1gl3=&M k;CiU"*:EZ܍ yR"(%sm?XUM}֗xew yPJ$zԏLB.qεmTkwOݕUgw (! yJ5-}*6esҳ~Gƴo$cV'pSᅴŢ.2N~uy6TWse.Hۄ̏ gC (bAQohxDǮ}cZ{\{2M �bA,5&s1*lr9הP$Z{${ә(f<3'<|jw']O%dX@[`ٽR0=)M (޺idW2 @Pjm aq 0"dk1%)h@,e0&baYJ^}a4%)MA> b%ɳ{by栜Qy(`G��c�@���P,+/8QTQ 2/eh.b.U�% X�H2�E#8P,�P(�FXH4k,dAǔ@<"+��+�E X�a 7X��P,9P1��bWlѐU�@M�PC`�b!FT0�@ �&C9ST 63O plbȱ$Q�I  � >o !q@)5�biSR5*Yf*E U(k2(/ � rXYY-`bҐB@qk(Nq-TM~Ѻ� Fb�hi(n5 @S"P,j2;4D3^A�bCg�(Vl1X7̤P�P,bP��RR殑;4f }?ca%iv ϯmm BSɼPfVmO3%{_BL.�0�2eiE�+8@dE�+�fb�A_�G3H/6}#~L@Ӊ�}!u1+?]> |GH�X�`poĝ*]s*XQTE(VHm:_(#@�7f�(��q0 䭞NjO+rҭA9)`Vg`n3S%U Cy.2̉rZ=ԫ9P̈ +P,� "E�(��X@  87 =(�+�X >Yj+X�%U} ԸWF�a(BNM@ �57 ĩł؛1� HҌ1�(ylמo.3>8�XxxOP,��3:@���� h ��P,�B"EU�l](VRU#Tx":^<�@t @C L*X*��3" ���Kb�P,L( gZ X3j(V]4@  Yihjq+WeKb @UW8L(1W� A���P@�@̀>�� �P,�x� w(z�@pW�SC�� Pt��ft�AN6E�`b�� ��(�zu(fXnW4Q�0ݯ 3/��psӌb�.`2 E@ L(E)�(b�A�@І�P q ^ PjhPxA$(:G�@ Ӑ(UG���<��(�v "l 1 h{@~BqA����H.Q,j!�](< �@fًI�-PYvHP"1v1ұ@�J<XE}H_ $[T_O3-�W,m1�X2*~P =M�P, 3rl"Ţ @I�H9i5e(ll^E%CP,@hl^ebYѠX 5b�N{P,��"B@Xg/FF pf 0Fx\' 9]*,P,yK,(�1(�& P,(TW@� P;M��(Vɝ&|F��c0�,EB���bt]�(BE"ӠX@k5PUP, �bxPQ,�*FP H(u0ȘX&�A5���1��X���(��@׸DZ,"S�� Dͼ8'\&V QK?K?$h712DI0 S��A�����@�����@���P,��@���P,��� ��P,��� ����� �����@�����@�����'Հm!ɝ$@!AHsevb��_,`ƕ? �X��ݐyT\ >jb��1�����(�����-U�� 2\eYt}( 86+� \){Tͮo1>Zz�:ö cnDpX��zq$Y˱X��+q6]>x[z�+W>ӻX��%.Xm/Ob~ ��qHB}�`^"](PK:yOG��z 8}nwraGxe ����� ����� �� \+8::cǎi2��r訏b���cEh��9Dzm&#�� <6J ����IENDB`����������������������������������������������saods9/ds9/doc/user/binning/defaults.png������������������������������������������������������������000644 �000765 �000000 �00000213404 11332353404 020551� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIME7.�� �IDATx{ԞWuOOdYlc`n))ʤaedHc7]L#qW/6iZϒN4MҴ4 D(P�FȲu.nHw.>}{yyz}˾t]"?EFFFFFFCIGhW6#FFFFFIwv6w/12222NzNڌ 32222\ؑ <jKW,_zHo|O_rʳg~k_Cuٶ0ǏW?y A6.q]{]|e|||}G.FFFFFC'N[E?[7,oPLNϜ?}7ꖛ3疮q{[Mv:NGn]toSkUy=ڵkn| n ?믾jWn{㏽{l SI ැn?s辱7ADǞUw%; kV7t핓㇏|v艋ϥ5sˈ?k-]~س/̗ovDDrՊ n8]f}Z޿^||dک0222Ȣ@Ǝ_{??ve/+Z[|34OD94bvպO}c^swgl<=}~etMs'׭k~NL?{F"ڷS{І+pkzǏ,Y67<".Q7,?Ks_Pox?Q222RzH׾pޔGwj)+.x'׽ <3N^wԒe١_rUOnglbrzǏϮzbbrDOx՛WlXd'q'}ÿS3oz>􁿾鍷ϟ4Ѯ{kf&_3/+V.OD7ӧϞ~DtӵW{U˾3G_:#oC}dU΍~w|?}򡧞;+~Mk.ܵgw7,99׮[d__,[[ovWYꊑQ%VM{? /Uro}WkU۔JKk~C'ugfN??v5E^N~;|gs=̪q]^GDO̺5n'\wD?Ukͭ'<xڹ׼b'wm};^u{/y—GYjg/~-7qMx[?c+V,Yd}co5DtW_~W~KǛgc.={?t#~~dܸ]o~yc׽/_7GDW-fú5nX|)u<W222꽍5U'[xkJ'~?JDro(˼pwi;˦&ϡ}\~]wWZ"/RW^tfї}_[ݾ^>;CDO?1ncc㇏ZVXzıA~\擟o[?η+W|'\~돞Ȳeo}bÕ y˲%?8t_eKq+u7_zO[3dٵWWڕ?~hlby7]t n3>9׿͟''Kǟ~ŃO|?yٛDL?AW)vDXGNg,ӿ'j"ύJ,Ͼ3K\1ut~p/C^/ӷtW~xú+u &57y_zO;9OD3SK.錏SjR":rs?egVYlSKϝ$ɉ'':?o?ttҙ "z_G.V%Y{KW;Wq\>KDO>]/x+/{wn{g]f7\s/[rm?Vfddsf+u7dz?[r}o~2܄: 'M'_sDtN/NN_sGb~j[-9o7oh_:;9}Ol~˞?rlz7nD?6>S8wt3)gϝkox^s/}:΋G^"Z;53CkZѓD#Ν= Os[wť3g?۟>}5+--wW;>><N{MD_y$uK`ddd4`X+`o?[Gs^g'g'Ξm'S/k6?59?Ƨ;M׬!}s_^'O7.d_Z|?7n};ƃhkKܷ 7C>1'apnyܹɩokl˜cO]r?w,uOؓ/y ~G /Z͏}'R ޳O_}՚=ݙ~״?~mw:y5ё/=t߻Oo|յKL־WlaL$gA/SWo_k�+3돛o|gܔĊ<S_]|_qhn~ċ.?399vVp3AϜ?{+]nzjG?W7' _?ـG[&|K?S?;ong/~nɲK(Љ~?w_yͪn}?N͟$w|tOw_z;{|ϝ?ODN]o}33'fNΟ_̻w>?co扇uvf؉SSV=w]l钙'>%c Xdz~ӷ_vMm|V\5O~nsލX{9'>~̑?ᶿ>{٧kϝ;wǎ,]z̛?;wٳݱ%断^;59spcOX嫯lZ!ϟ<~{;D/gԝZb'gϟ?7v+?/ڗݼtS3sW^⊫^xǏ8bꫮ=w 8}U_s+gɣ/={wo_ϟk'&?Μ:q陕k6,Y 6.|CgϞt:N<S?8Ĺ3ϏO.[f73K疯Z;>955NQO|So{;.HGrUm{Y_=ԥX�<}f{^v[`uϯ÷xñcǺGeccsW^su:Yf MMώOugfWOLϮtijjf|jV^y̒Ng:+YyW^=1>'嫯Zb4QgfvܚCYbbrء;x[?LLu:c+^=HCcNӥxsK6ګfMOvƺsg'&hjɲUk\+֟?n||Ĕ+##>X7oF~͞[Kx^Nvtxߙ+yS?xԩSgΜ>v;Cqyb:陹NNh .Lrl՚>菼7~_Ͽ5׬u:esk%Y9=hi鋑xCA7z5^x]?vΎML/Y%3,ddd'_:9xzo.YrjfvPmysghR'f,=##EEMG&%V6o=W/zZ|n9FFF_h.]6ZH:qUEt衏|}6;FFFFFCGZe####!;w8|M`i׮]7fc222222edddddd$I,######XFFFFF&OZ*C?:T 0|wKCW+Rjxu@t |QISGi{=B ߈gzY{1I\yV3(.9TRުUVZuС*( Q |H%3$>:u}[!g&XYS$e J;elaQc:|Y~.MtBfV?U›a/89fG"eYѷc֑1q6DXDZ.y8;ybJnūIUH\[{'y/~6JL1>[xZBnοn pЭDL^$tTQ<<}VS2>6 Vզ!wIwAR꒥>Y!rZz*Zj*lƱj>Gxw1 I8g TUa{^/}c7^V̔^0o!R^E4f`-V1:J+.hKCwJ&F֒}3c}8=ҭzg}5/R2l|KXU&d-0/k82Ge>INyRՉ-yͫHVxi`r7Vk$ި4wзu �Fs>oc~ry cr gs<Bw6w';r衏|}d=̘ \W]!Ci222 Z4 �.2edd4�C&lɍ(.9,XFFFFFA&Lb222222edddddd$H=Vaddddd46Ν;mR]b22222Z[nI12222{߇>F2Hbd4d.%XF m{I,#;FFNv2mrXFFFFFfce0$2%Vӕ9CYLi" 2Do?!OAQ4̡h^-sWSYB-SPࡀlB{Aٹmٙ]n%2՗1N3Oqmf'32+<xoN yb{25M3sabL%I'2}"AwO$q (CdŖ$ Ah;roρ!OA5G^6~ߤ}7cJNEEm_]uD<ũWUEϧh;$ҢmGi~-Ϸv傭O4?$_-A>szg^.ˏ OQ̿pfLJv3FFx}c*{,"Mz}h`C.,+H,So'Z~Tbfū+|øTzK]_2|^S[㍼q%92HIǖЦ= r+uMt6mjK$AQT??Ꝁ $S7nT2=U5ܛqb:X u3L{\ BI e 2K1/J?Yh̕ο:hgHȳ1|zA"L*S!kI:+ێOO4dJ_VYJ(sIT-]TXs g|E.*>LZ%o~x6|<;|Dev sljvHVJmԀ>5-Q?)Lκ4qȑWoح݆$|E3.mc-&95>@Z!m5R$$XFU1a1 &KXd)dF O, h4r! kuEF1=i3aЅhkР.&NE}bʄ*^IAA\-%k*.3Ac�ߣW3[b@KL!Sn}| M%^#se͝3 ,###%E;0w3 y:bK!>u`SpP ~&UŬ45SaddڵkH )0q5qB)2z<Yv$]x|Շ჉&Vdqp{AXFFFFE&B(r\!S-!iʥ ދ"-+V&z`'={({=R ,{QQJZJ Cr{1'xal,iOXcOp8ghhodT׮ʲu$+zwtymřðǶhl%V_{5F~~ Ř2hnrk<x#V-QW/vQ{|uE6Vg 4( 8pFF} W+h!csq+H,509őN{uZ672(@1784_*Qb=[3KhrM,=Jyq"_ QEʦt&vAD!٧uM ߁ICeodTnN\qr:S,IoC9͸r0J)@}$o�-NW)$` CꯡAF41}ڭ{} ηM}Op4i '|D+r ȨŰonޭBu!)Qa:x=NtMR~*pr,sH3T723}׵I 7dyHxוLfo�ݿM[X2222|(L &ȄU[v۽tn{ (AM[Rj˜3FFFNar1SS/)/]{ Qr.䐲E% NҴX~{"AƤfHcve`d̯;bWa˦+.,.ʹ7.Bw1Lb #Yb#6ty:I &1: &˻iKC6}[ٌ$ְΝ;mںuMȉ0h9&,ڊbÑyM[ha};pB}|I,3II0ZA@i. "/}n})&鴉nN5to{Zslj3o˘pѮ]L ':fFZBG|2&!]!65E pjAH/-xхg HWv e6zޕ{Y yn(ܳe>U@�� �IDATOX3t,;&( rrFbH -:W]MI5҆#B.̽d^jFz6Vwݛ8b. qEz6 1tPI H˕:h\kE;WQKgjJzޢNTFb1Fkw}6Mh(k<_ ։T5nڣ|7 MLHrٽJ(dF5`E4}##E`Zս>8ZɰTZf7C枌Fۻ稇=}b{8PBK) ?ȨF9g`wq &ѻd=uWA/%Gau)2 AS39:sKg>b}k% V+HTTpz׷Ҩ O)<IƙhFFF, SI`?iTЦ6Vq^nH2׸vt9UHbe{ 3r,-##Ѣ$PB r�6޶w3)@暇ҫs<O^a(SXMnZjOI~AoeX}#y#gM8*a-0%pFȉ;Mkoވ[םHPEUѲ:+ν1 -y#r9_Ƨ{2/3]$kqE7:a"ӻ[s3:3m,###DP^TǬU*", ykXvv^z)` 6޳}aH@Hw7J¹lJH xD =o�Q^U4oLz:nϓq"$Xe ^DQ+ lڝHY~Eah]Y߅Ttjcve`d4)yQ̉b(OB%ڰinTy"v=Tz0"AX='[hdL\%R2P8y"?3ÅơIΝ;mںu@iWׄDR`{hn׮bL4u)6F$tԞ4mHw2e ö@@, ۸]O8u֪Ym䤡{i IvS;=iH^xf%* eIJ3?0fH-А/P Q=֦<`L8rӢ@Q^#Hϻw~;]JOņJ[hwkQ5boGt/pϞsԮ%4Z4d׌[W?M+o3'TVҸ5OQh V3/M]!~VSyЂ^ 7}XFkFUgS9%p σ+Fsll8&kEWƒwM-!ǹBEx:!y� 3NT,JԜKav}<pRg|b{DO=F d!9E8DwROqZci3GNBi Ⓕ fw`.z wd3k҈PSn\K4c:)F~vbG]CfmUޕ!ԡ,niKF>x+R+? qDET62x*d8n؇85:쁀 VT_tӡ{;] T@#-dndʟZk̥{`z]h-|H]�>UXݿbkTWа0s;&{zGmP'*ZX?G?Nnl ;8򞇩ᅾ&L&hxhDD\jG>ޭ+6hV91G &Nui )O]vQju=&@ /y5֌?lv/ZНa.IK"{_asw}_yw߅?ŠluS<qgT?w-j+ԬQ7Sꝧq > 1=܇S@Wq ih{{AKtk{;/8;DN?g~җFp(mc]u ؏Xn'd8~ji<v^ŪWYPpuN1=C�0 x\;Lh3ˉ.$r K0)ܟ_^lt)eف rPy6[P$_=Ǡ֥wKZݳLԩͬ(zz5{%il2/Z]^I+B A 3 CtZ%=z%\)`2E&Nqiٞ,KjP>4/{P;$50U~50ct1LՄ(V&@4$mˆb얔\v99[�OcKD uգFuc`օ>$Q=&%WY&J̗!qѥb涐N^+7�l7}X +7m wŶ q: nvj%RTe(MFFFFz vNJ&hd!6Dzk]k))>( @FC̕L՚I,#### 7/t[/}(JQy]d W΅V` +Rݻ2,1ξo#ȺqM 3OF)VK;Br@rDmxnڲH͊B#F B&@h 0mr|lxR~ Zmy6 ojv/ӵ2j~Bѿx3=dkd]nmF\>?N⣷=4eavT<6|(#dy3陱eMbvi֭[mlٖjPm[^vJt=-) OzlB7-{ mM[vms"{wn'ǻۈ�[O^0O{39X) c-А/Vcx_ʛgUV{FxR-HH5os7.~yI"z ޱwemW܁I,;]v f#~7#筟Tp4<Z`HRю"ƥiÑny%n7222JRɝvxcx8IODoн>>r.VM.vCPL./Ŵ06eddd "?VN+ʣ$U((xGUt sͷ~o`+$_2Z@JUaxYҵ=Ot.Qph$eQr"j0@2Tn_geID˼dυ^2+b]iԾZSo^i+i&#G體[_K Ϊ-#i<#LR&Q&bQ-74/Td7t{+ XYM5 xTŰ+iE~UQ@ez%DQ31BEM &8x_#xЦG.;mIdOc$yK k4$[]AbEBNh=<%,+m/ zb,e1! 칬 %6vnڲ>@{7פ7Rm{+T\s' *rR@GBgtXR)<i]I,$!z0)N{}w~zI lv<hQrSsEE!1ފE@R|(q$އaW>BkV ,#{l73fӰ|M½ϋXuh#t[s7M/"[NFuNhobK鮀G aW}Ӌ(`?ndt+/[/俍7ϳ$B(L3R] ]/kn[u+ͷy.IrzG{7\~n wQ?R4\�<^n* ʇ2;6^u ciQVJR" ya}E}[ѿ_s?3$rz1Y5 C*4(ݶ6V`g5e~xк6+v%=ML ɋei<̗ CXs,ґfY\ ۃ*~Xh]x?{ Cki! i!b Hm: }h{ʧz6 yIɼXf ]&ʣK ,I} 6 >lg~nGOD:"z=k)_Z|we*ʴ<##EIɒ/@/@viA[{F/|9= wpn҇{+;o:Dpu:;_O)6,l_'ry1ixm w`yOk\S{΃{:Ǜ6y l,/ݟAo0gck.[ hF(yy8SQģ&അ6y|#ow{6{/&_u{Jd/ EFޫmb?]O`1$ր:@|<m$i nEp!rKd9Nrr,~Mt]V}, laN3WnIΝ;mںu--H43m rC^`JepH~k 1к:8U&RAYmNֲeNsVe2}4@C@#a~mYZE^427W\+F[dt*ڿBwӖ"e۹Cu :|wXvCvia 4 4|Ì5^KK 功DhKSH/A~Br2sk}HP]G1yFFFF *B^[Hct"!Xm4DԶ Pm퍸BungEI,####uU S!VhualFD^ű'ZS;lPR'PepȜyV-[)*(hԭ+ŢmdC *ZQʆ(`R7)ذSԺJ_-Z"Z9㿲"qUiO 'Gn&> A(C4o_u<Vj`aB:^=dpTXh8i#zLT5 E~apٶ9g`O 62qUS\CHقݚ/rK׮E%hXjفHdبo`ᷴ½ahD綪bwmre%VPGX]F_b;j�M1q)n+%BXSj^F-7" 43F<>\mvCU6_HrםȶVyaNy7mh�wsR3tQOQzy%U!G[hĄ0kK&FWz6 2Z\H)q5ByЌnPՖҫ1tmUϞͧ'�(?GN\ ıiԈ7|*Pi?F6.P.;kin= v=@{�:/m"6|<5׼S܋]5wo: y$yb MMɼ!YPi3-Q5 �Toث & j`FC<@~6 1*DZfgޏ˛=H1\k|<J® IHEֽtФ3O^GWyY!!GTYrm:H`sJ@eFnmDgj-HX;g:Hx%F> 0swӖm%tWE$@6=qL vs /WFFFzRQ+k@Rȁ|.C8*W~xi~n0S]DSAʍ!YaddtH)rBG#]VK1  15\6oCD9gޣ]sK,@###2A?BE~+$SiKTOQ+jlʆB+]Qa= b8jAQEɴAi%4Ck.[ D I}&nIpp+[07.Ȫ j)]r8҇ o4$�$V]>,N( 0 N */AD zJDk3mELb vi֭[ml+}a_KbR׷}ݞۜRT&B7/h r0:I ;3>Ew玜8z莹mu7`;  jKt:XlJSitp΢a6z 趽wپZTCUh>jG2.-lLP`jcE k^F^ \E˿R1}n!%_aG> ut4222P,%l;L DsZD5O 1v[xZrXȨDN<=ا茅з|IXFFFF65/\D^A3^+E>TQ T+bD!u`^rcTV5#ooSkU@u*F~l`B#_Kmю]fj]Psr`/<{%OńBۨCNT45܊ݱМhtjLjc 'BZܲr]_= w+'-l #5ע)Ϣ߸\(w'GqQz6?RݰB%lݛRE #Z0W0hd@ a6[Xs{!}7rf = WSbET;p膞UW*X?5:%a7g.Ee@X Udq'8f*{EuEͤW00yG}od+*NRpDhPʵ 6-EaD#ea;Fk{y%H ark-T1W0LFƚƨ6QV֬qEkRDž9g̎KhmZxU6״WxMLwAVXɢPuaZ(97wcy DL9P/ve!Sܪg ]67(<#fvӖoe".7"n` t`x[5] /#zыlE1? ۗܽgJSvȩ qH8(o;h0Qvl{Fbke5ue}Pz/%r#vOOE+zo"ۢ H?OWvlC.%m$x."#k6dHFJ4I,#f9Č֭[ $QMI,jd>q[ ###XA22225d>q[ ##dFƚI12222sN####IuV####a}#IEs 61apKHFqxC5V4h5p݇mHabx]i׮]y7(o<s5rB7\;u9>lCrӒ 222222eddddddr#=JS/  O?6T}FGtެ ֢ܖ#uQ}& jxd]dpmVm_jUʴr-y8 j#yvPS_uZpZ1{Ħ]ѡÀfI-Ӡ'>-7r oeC`*ZScK=S8ȽytӋy-+Ƣckˋܻ7jUR6MZv>L<g&hrsދ<|[E?eRtDC#=H8Q=lYa]Jۣ9@6�� �IDATq ^8-D(|5jo-fG͹ɚ]XĞʀŽEeĈ!,SNQg^jULPY\K%-5c}`͇Vt<F4G+; ?NŊx~}[WҗOXOS%Fo;(\:Շ7_ul #ć/�gU3C=${yb(9e pуч П⟢kF(~Nn5ȁ|P2<@Ƃ pTddddh 2222tMBhl,#### XFFFFFAq]8>}8G2\ lv;~y9qs/nݺĸѐhHGfWz}}ȼFFFFFA#gGyAэY<T6! \n/2#_4Fni׮]3#w\Cj]a"8EmJ^% 222222eddddddr# g3!QbjD`_|Gp;&tm(IA <O+<$/b4Zh%V{ 9@0(flC ɜlUN2]_p>Ez(/]A{?s5ӇjHCs3 :*GLu_Eö&p+57s1F0^?}4T@i4CYUyz=`5Opy!EmGl0rt'Q-><S:12 :mRց1ILĎqƪOr!QyR졝+9ju[nm+/݋WAbT8(x°Dwbx;$|\V@p10;h@B|?V8o3@9ӇdHæ |`<&Fö%2 F [T'41?Q$V8+FFFFF^y{C###;GFfc222222R+k׮}|nn}wҨ"8Emx{}|ȉ{q֭&ƍ̮XS?PY FFFFFF)%Ν;mRV_gر#vmL>sO5h6ھ6!+| d#n>Kt3b fw; GF.9ѩ p&:@8 ?Vnmb.HM`۽?w'x{kPAwZz3?o4pQfGMRuP:DfJT.Qtgt[ ՖRr+ғ_5ʾ>/Th+dOHOE|s6a$q3d-ȑΚQ\-1 )J0>IBb2S.])<ѝޡU,0`HV8"ؑ*[jag3jIIAϲѽ/o 4|zA̕MSіudTFz?aV W1n(Db;(S>OXYxtM>X=.Dy(D$2+u|t{g1Sl!s Ќ''R5Eo1yĖ*TR?R6S0@bMq5Sd!U~ a 3pJ=whH5liX\|RB)t7q�Z`T張4<)ȪH #9x$LMy)]Od\ &\=I'ʝI)g^djli:@9ѕLBpsei? yYEOu*dH [ĕUw+<*Mrժz#x J9nj6Szu?0�)k]._=CVཊ)Q_1d A׀H$X)v^SFU.E"rXLThwFwSPrFb}6n㊬=|m"<<s,;!HbeuUtS3Yq{mODk)!d^b_xkª#^ªAIZT$k%GK"[= bG#C K"Il,[tW ٠m!FdHuKmW>_dpSW~%n02Vc"#!`Oݷ K6WFY+xБ7MIAy2LoJ9|onmо�d WEN fl+1_KˠՁZ4EtS%A$&ByZŌ$n0?2AoUAb P)Xabba^,lG巈_bEվHYZr P˜\.vйLNPv,,rEQ$4WK\~ѿKIa/\̪ZPHUZ@ON�-D n߂O"�bbI ~fKE4 K*x@PGXv K`7q񉁕/EˀU`?e fgnx[I WO �I/. 4jhߐH ZQn̈<H*.<jA1PHU'|D`eYCo7%bk~#8cT۴\񯛟=rIeCݝHH9q6BI<ՉhZQRWn"j2cjiRZEy趀~fe+0'󀻍0-TMW%DwJ|DR Ac\TI>. ]b).^(Pa!4u=ESi5ƣ\F3Qz4rgQbJ_ S*A Ո^Yd&:qQלtT"wQH٬# R/8KUBHVrEҫ0>l!Y]f{ xEqٴЛh@guBЦlDK.HՉ_ztpyzJcWP]7 HepTLg*LRX:-Lu[RIԵnTDN0|3pq.z>$㉩`W2'L]8J>-w* ;IUA|x{XxIa?eDf#K3EP*j`]d0�GY*.Dn.�_yAXvOSػUWKژ")2&mX:!:CJY jG+vK67<cBؘR aׇU: o 2Wh#֊D0yو"*CK]8U:1ȢHmS &;KZ@Ko(MRHuSQY-[S4.(m]&k!#)/Rj+_jo uf4qV<:^g)ۥ> }GA;T%egUk�RٺAj+]YH VΨ` 1hșH}HNPG ^0M( vD\ wsu<D)P 8<|EOHgy8FTuʷK>^č D'%`~]{hS_XUzxUa)'U ]]8Ȧc*$)-!*tBeR83ԛL"o{:pʕUaWk79Q#x؄|rٜZ_HӼ yMdl aGi.;x) 뤪pWKArH*x*U�=T[9^AL#/Q֊nMD`OXbsY)d&YEfËR-:WqX.ah i 0'.!zEX"Q4Lᒜ5 w;_^[),O'\z~fesW+C.*_-Tt%|.y8G  HJ%љb=[tiR6@#E\(t� U.7a˲S.}X]`'ji&%x5p}x�#(1W faausy H8`ĂɊU _̝#,fO/SqQ *TE\] (g_xγBs9:UED]\o0z*FHryw Te4<eV/oOBxj#ě:k P9 {1B_(l�rՍY ߅{°Q2~-B<R}tȳ,Tu S㍿hPPK,-O ҅"/zӍeY6,D F%!TKlf\I'kp(;QLP*Itv$ZfbW.=nl�Er*Y U̓Y~ÅOXKt5ROf,,%p2UC>/Y0 ٝaQn)/}N`*ie:U#x1Jvq|T> _O*[4 A=9ZFZ> )R\8R)uv݉Zu=y.DnPt1׎]XHY˫_DzGW{KwIc |* 9Q Aʊi*+] -$Q 2/}4h�Qb [yUJ=yœIݟxkvsAu2BHz< 3e6?Vag*l^wVZXuc+N@~WEGVW4*3Wma't9K0zWU,<#�"=�IQ*M rp V"6gP 1D'Q,Ee euhTٔ%)c/HaqT4 ga�Ƴ *( $LZPi׮˫8!BQ/G<v3g2X71݈fcU3JJ`tdJ<}'3aVSe KW{"kUʄ^S+@Y1,3se@ju_M �[ڌ� O"a). h PD N?*s"!SaJ!3~[e*河&HbH@'VR J\^"[SY{De!|*Z᫥@]ttCEl>𴂕fWHRP4ee՟TZ'KD mp|4%InUĩ%b,rܲ#LQ;EX6QBd=(Z!"E--mvHqwɓU>/3r7eac!3}n) R_]'fYRvPLٿBfZ$eZ}&D6mQf9j8+`k{_Q-BȊ '9Īذ?7oQcRZ/j} ^@մX!d䶨1x#Fj} Y}>-e&ɀ'I IyIf�嬤$Hagq^7h d2:RZdgy\#%@e̺vu+ j�^0+\g͚>$O)b)V9o)%֢!쳥(6BGpg3zE-_E ˗*X;RT 3 z]�ޞwQ3Y2E?*靈;].rMsue JZxuж=$`Xԙ[N÷e -&\gp H5>'|ANGTaGY<oxOf)+X=Va%̀Ehъu]fotmLf 5�~i _arhZ[xL`UJ؈):)( Fţ69H-Eo0f&d^*)ϯQl,ièPݍW}O RTh dAԘX}9+̭' Kų֌蘥,t}JV@@Sq&W*U͌HUHgV ތUG]zQꬨZM`{5XC2h؉Oҍv ULW�rVw! A_Y&˚3TZ*XȻxK񯶊4U27`zh.]Җ4ׁz+ wpR G<Q 5/P /HKA t{5gw!e9:Xs)AU&L4j+ G{ AKB(4ʩRN4u?@2M 4`/"r1pL fwE&f{^ʦTƽv=.uRG $YO5ZPc@4Foђpm)S*'R14NӶfЄ%} fzR?rFE0"E* $JD\)́{hSl ] f0%$B}@A|6~E$6ݽxηµr\_:FrC2T$}>"a[ڤJӁ0,ы{ޘz#s\aݪ"VcmTyCN`ݦ38Qy4|4 )+;qQCJK X޵%I-lZ37 W~gŊlU7K̞iJmAul. J{E~"J3,_IN gc:B$3 ~K%V-|/%}} +%~Y٣nupd*"�.AHԇY=AD{OE$c?_PM كTP/V44sFKmgRB7"ctmv#`m͈% 9#:)9LX6}2Z/@tҡ;q:ܠ*$zD|zDU4>2\-{Z R_XWEJYs`ADlN%2a3}RD'E48 N`~ 3KR@Nqpܣ c(.ȖH7q4n )w2P0yu57 k W|%ZywXENoX I+V SPJ* |G<M jS38ѨI-X1tujuBBnt)Wa#8/j9Jz`E%*1S,Sh)˵rdQ'U2(६TEm<l݈Jk]_^{xcI}ыF8ЋRV36q.)vx6|nЩASG�-D-Ŏf"=)J1zp1lj#PU<ٽĠ)pGj'"ɫj( F ^qR IX>U1%ixvFVDg!O0@GYn`ĆPVz\c&op]u{fT# 6v%&~ANĢڌ^d[1iB1\ .X T%0$x(b:0xjD$/}!yFem3﷕3/jh>H]U \+MCwgku=uumwT`aKY :0nHU f Y +c�� �IDAT6?:CeVĠ~_"RݎC.l`HHc[~u)"'gž&9[Sz [\1k^drpɼ OJyoIttq?^+C0j3VÁl@'?ESJ% *U ] V6D)A>Q)BiH}tRl0<tbqRY7*+<)8bn@,%eE bId!J<D>!r;#N.QU2)-F=H!IۯA‹%L9TT|tmx(.9YZ3BEl5'{X{oM0JK;쀞�ZmD P_X9z6Hjųu2ES;Z$^[ aVPJǠ=谊1@%rvX@ُwIv/$B܉D9ˏW?]v[$b3Y!Qs]YRѢ{+b|:E[=BQD& $hf-No{A8t_$dg"C>>Xqq_XK {"~EҎp/(G\0^Z,jEtE8o egpA 2Bk\Y+;fzЂԌ@Ixw%3.g/+9(bnܤ}y=udF!ß UkSKZh{;d{1$=ݑg[@0^ ڍZl -}QD-Rpg ƖmT#ARxYFm_L jL2a!I(t-$(u<ר&U/_JoZxGR Q6Lg~g<\*k%UWc=ExiF5A (}Y )?F RO-E8@>PLBrN<XRf2iJ.H� ]]'23S? n[!F7DlT-I+z>b MV6]'\V0 ZљM-]FʞGfwgj5ME8OU5ByS|FDb O9] %b3χԆT ULO{9D-P'Up8sbSRXr]GLO7[V">"T+X B ê+-LL @Rh|T!*: qk^*l<RT7UX)x>4ãk qVLV|"FuH: ӳ|QGiL Jn) RK$ w;0*|uk *_JC (-ZNe!\ 3“Dd Z*&LX)d?٘"c@uQpz)N.Rͷ_"k:P+dh D8".Rf:MPIF]e&' y^yJÞ�TV-r4-$c�z#EҼ il[퐕|&B *:V B_  bPBR{۝~Lɋgi<` i3/7\jR!V5҅.E+_ (]v,3!Y?lA"ʔbHMx-s&{xƥbuJ`~@_s̞&D4;PWZ EmH-V)y vLEmϥ2GpmCq(+hxT&Z#"�:K*A#CIIl҉.W~Tϒ'$SF_:A2xL ~?Mݍb@&śam&-V,T* 5yp3IgRv2űx"Ehi ;ʆANj3oڍŃYHSjE"7rfMC#u殘<AL}Mԝ]@QWY.|6,ʚL̕ !3X%U]Xb[? E(0kaCk(Apl)@H4]YENr,Pml#K6�M{nPD4-\aDvv£$Ŕ#8nje|#TdH廂xve\mRwK /);i i$,/eyp!- Yx+kJAX F<~+ymJeBY )B+WAY3vN 0"4 -K/q~CXHr] gmONW8[2 ۢ$Pz\9, ,6Z`žP˘1vw /J\hajTB䚐ǂ5`2c)z֤d)4w1, *}QL*Fb0J&6uFMa =7DG'ר  5\[azOt�DQ棏nṢG뻍~*kWBF:"5?kSG+aKEEWSȜbUz"עղv)pI(G nQ}` @Z *"ޝ3QXU [ $*&+t[gwj4j-dqX:»:$PbR/2EQQ6^(U5jϺYBO -[TU<]}IB<Fj�i׍v (s8sa75~-W2@p,`Z/-N[m&lyabL*'B[K$[wXyM3+0l")0INE@ԱGđEp"v`//\_a(`pw2#Ыr>3ëw"DVRfꊺPI[P祝  Dkytr1ni8ޣpgU DђHs0/mၯ4RzK˳>`(5[2oQ[TY胗,0H &UyW3C~f {=ġyD9 [ތlhj{a` 0%J;kI+8^$q[;Qx^eX`-48Sc`h W HD`IE\ d0y| kV*@ hX(_ZTR'+'X6:c ye];]lS(2Jtx3 Gm,5Z+#rK*8&p8T0wt2hG P ,"BTB&3c3 0-ݽqE]|H /ED&T-n$B(n:O?!JF"lf%1TMq&Hh(xf5fUD1Tk( b)=w Dj0>PoDdTuA%!yS'En: ߣv *~_3"k2J=Lт,� JzQ<,U#WȘV&nm}wԭ2aQK:<a.RHL-hڡ:GÍqD6nՃFGAlg}1J@G't Le3+^5JH zS:J *)(+˥,WRQg2szR*ʂ]ȕ.S DI WteJqwP@P6 J1TTz>nȺīwAλYj5lHC8~ 2OьG*(!=%-HAPHJrJA\l,dG R@+m3 ].bV؜WTCB07r+mDYx^Zq=`2]8j3 3~ë%0} Lfix v+J& R0%y0^DaORyY\r[('VqUN, ĊKvft@T@{lEHf <jwxVDagCUU"{P_bf6OQ b)<pg+J?E8Zc-AuX 1vĬe)_YIO.q_31�iFԒPڃ 0T1\ivUD wJ󿤩)|kx }GGPPTQA+aEmw*;)-:HBeRUFԸ/ՁJNhSRmL%uCĐU[սd BW\s熂/@D";ͳbфZ4:I"@=<׼ό(H I[R}+̸ iH:{jAv{WyqtSVw�rNu!KkD A#R[Zk_}GDzey|Mf"LSMR'zɧ  :pwTiYf0/J"Dgĭb#:| |{!I$ϰWx>)W7}(k12` c�OA٫ #Q+WE8,<JǞmjpEzkJ"nQ)\:JAtP nFI]ep3*Hàx&V:B $RKwPr耝6+j!ZGްl h&(#HivG@uIɎFcQٔN2A]8&ܧV�lk?S-.T!Y$BBRHM^*p$4X8ܼZ})WtJBÎR>(5hFTK Ra ѯ؋?qj{H;j὾l(KƤ# 0ӸPEh u<lU+Ɖ] ,mkAx1a uQ/ٔ\D6 No nNd*\`P4kmU ƛsWyDpxx-qmfa(̴*b8 eI.-pI,dO zR0r/~7TtddM.4FțjM;~ך¡{"!{xs�E2\v]2~)Ռ5m,]_0r1=q$vUj~)U_ \VdkfTT[b .id!ƴ (CW9WV6@f1ÊI'Xy5(g@2YzI[)&V׫Wdy4 Pz@ыtVNZ֤\g׵$-� bdEU/wWQ.yzo,c6ÂM?H6^ @*E5^))~UTnx=MR 4FK PLoZ�+U+b FSwIO6#j%Õ?0:tI]vٮZwVDci:>zEzd1H3БH3Խ3�;HdLa-L#a9>ؾ|Ii XAkQ T5z4)@p6P_F4gVmu@ d4Bڣ<vg]V).uUPvO[DdӗʓwY*M~N5.ԛE�S "Z_U_¹+zeJ)ul)\i6v$OEYuǷd1^PL7⹊Jl9թkR(vhVrt1F͜t+Ŋ5mtd :[yWGcm~ >~<&S.,->ZNH^K#41D` kƿujr6mxs<Fc#nt#dpK|СDi"$qanȣGd`ß,gl'GAݞ 7_cG‚&8at=F]], q=5"8>"Kǚ՝ H؍9-\ MD˔MEh5ʢiKL{R%ʻKA,lr xx6XS*FY}";+ F|M5LT 5Byd5(G�;3,vM H3&x\ƇH!e{ |ldTyۘ/;NIkW7C^2q@m\V1DDMT!dui�lmދ &Sq?!sg]FPQ)$ӕ)J)G쫈Z%ҠH(R j?`c )fc "aq0v4"oBnDp[[DWYZ`ED�_+\pY2~a!YHRS1Eq Ԣ%yaK*]E!-.Sye5+W(VqIuEM$^TRu@(i )HvƯuaw uĄB:"E'ԛ9?R hNmU>"#@-ۚ+OY*u"̂/0wv8vQIW]4B�M;fVV;0r, syޕ-||5=X\֣P.}QY֠„dԁ1|,)v�uj)M$uJ ~#ҵD6܇w5rJ)}qpco�]%=n@<(T 0s|(JHg 9( <áq7)2j>%ٴ6a<[*I(JlVHճ3Mԩg჌ϒ%z4*!T |>vj| L-*3MECADɗ�9T`/ue48AK$ڑV -U  Wʐ\<R۳9#_]U!\ЬLUCB,W NTQt /CP}b7unAoxvVRP[?\ے -fVo9YB"hO((Q@K h<O4X$ ѐ)_ɋgIjw:WjJfuH,eaD F͌.J T7(x$[*~&Q"ٿ@H-7^!wc)Tc^|P@hG2zQBs 41;p\N=Oq)p'͐BvRYUβc4fz\1q < I2ka(&QGo(μHy<yxq- l<g\d:34T B�d_2r�Z&ep66ߤ`3q�dITTQX%EԐ>ǻ=ZӪ+uQәoNWJyq;xbT !C{)VWWoJl,)& MStz Ż((צWV*wy1/d ![m4U2:* ĺd6V@WQS;5-'QI ֌=u.>+P/Z42ţx 2.vչ{FoEK,\d][$'|SZ@VD1Gi @I5r{Vd0# *҂w R[!v7 *O,)~<j:cҸ&#xQj3#]*DXPj#$ݡf6 {@5x7! 盛@%8B ?Ll2!K,�<u�� �IDATLx;5I&C1xx~Q#XO ^pʬ8:HZ=b%:7;XR[xa'CHgO`{YJFD"U*CuY�%L(j uX$)= H e,Y'RH;Tּbn-RV`pzI>!�|,ez5.:Dij%jzEOuMC:"ѸVW锅>o|ҭqK{IA lbpb"Emn𓛺mVjTYcwH@=/[b[+oDq=Ia�bِ5s\*荿T<wum&E,WSE"G+9)WF&'4d;e,U];,rnz$?:j-2Py.Ք8&8Fg+(宀g7{>CײGbGYIt&mm{βy l3-0ߚY{HHZ/}d62Z8OLMvx qu$)QJm0~VY?pȵB9¹ z@-簢!jp' Rn'拨|Es*/%&� З%@<5W:TCp7_6 r(hFD^&NZh@ڊcv|*K|Oh mK٬Fq)8<Ah\˟*,~gj?D�RT#R>U8.UbE^A45b 8І@Ad) "=qE!+ۑ72j!3GB+<I#zIGD!{Blv#US)q�mbGgpvhkk@8Q()Gj@J^SJhV1*[ x2E&k:fMm3Yagu,&j)2x})�[ @OknsxL* .Cͬ*ڲ3"+f}|BQ� xPW2ZE j*x{!RR^Malbl& W٬ڤ9xR lH S"Eפ'6YI�L! pMMpDlIMXiJ[=iy/e$s+tUn{2ijIݕjtvdMy9ȼ)H, /(xPncк{4Lo{ѐ r<X-JhUSCƝI'.kGR⇏("[Qcuba^GiP*B,<7|JOxVǺM#,Q$j:VXqrsi:u!& u<2 Am]0FFaQaNɤ5|zh yQX'Qtf@v}uu-.t,; vl(HZ[&۰a^bZbV;*((DĴr{Zss7MQ|Zk9cpk>EMs[&Bl ϶k3Q qvc=ՉrQRI׏Zx5jQӿXgą̀+ȜNU/ʶēy"W|C2y'6,]x&^'N9uB¥Ҍa4K۳u=;E–Pv&N }]#MeGVkl#Q^NGr^HHBP_Kinw(g4tmO~@ᤑ�UXm4OHrjUEB|H+H^ݩ?,+xן\=oĢNxQm1FJ`H+CeDbG馴)CtГx?0U<!YKʧpUDzd9g?ܰMxc|%EAvȎֈ\\Y*e;۳T:5*%\4emH"zK ^OBR[j?VŇ"*dTAoX7?x$-joB]тi֩"x']z*qe@C%Fp0c"7V~B"dT q+뢈-UbrrjrŸv?Z4wJGݺɁ"N~?xxYcWJ;tTtqŽNk+QGOxBnIE:͇:(A"):#-6ガr>)2ڛ<WeN#Vh)2[>ݟ\!w9`6&]ʟ>Cb Fl"FJ2=awWEō<=, 8Fz}5UNUfvni@-:7ۭt*s_+gV'v-׾iA_s^c<둥Ax ,eR<g|u?Gœ x ÜnfA n%:r\LgXi7jniyqm8NDg2o/<%\WNXi*JuhW'}W7F(\n;(ǵH$n+|�dbk2 }vpI#ٺvK�?DċR  *),,nYRIY�Wz%USQ%:nܮ&�,Rg ` 0.-c༪Crv@!SiWl޷Ar>5C߲ALO:V\R'/.IX:]vaE"ZT2t0χ-0AZa 2 \L̽n%"o?g%JTV]7hϊlLE}]u -7erMˢ8}8JC1s7ijsuvZ'7$&\m>50^ v>ɓ̗GFt" dH?3ORe'{$@J;jkA-Γ}RAPB�|W;}PcZWQ<3kgdIBvWc; ~XE^X]! Ωm\yv a:nʎRǾ(0 0^un-GMu2{ Hb֋+F]!WBJyBlD斵o4?F>e j{[? [*sX!w!Q<舔3LoRzsq CyS5= .FXEs(Lpω:awc.Y0^=bo]"I`'bVhX'iW9A;]{Ѕ56 R<ЯƥoS:hW&2i~#c'wyXVDz= ǁ6 @; 9V&zg:FFלlM<:tjثm=?wușWKy!nָTomt.~N 8<JvZtv>M[ 06 ٖlov.KcC]`814"Sy|fSq";']KۄgܥԎQ/{44b*o,ɯ{Z mY %O5 zh'B4,n"B-_Mu"XdboL=yC5[$}YjX\Z= >9 䬟 Gvhm+'%q}`$+#$%[ںā^e|!hԲgM NV2N}S$!a򰌘gP9.Lj9nf<8NBsy  9zҊ34qWusA(䞼qܚJAZ/AE+@!O5"gkHǒU;t졖5UBuw0WQH64S忴5'SmgCP:FjPƃ]KswөAtbtAp.#5Ǧ;d m#Dz4�lMKE0 6̋7 [@EݚsBK;7Wu4f2 EaZ` W&Uܵ|2^I#m'U7~fEh*_LPty IVznmL.Ed„C͋#:-stZ:/<<?P'Y'^N6)`-`"D\h$y�7`GHH',}^CwXb\Hk#b (m @=6鈑8Q^$@w!m6:!'q’mӬL31nläk/F;giNkot_8Cg5>\u~rlZ(jlc36Q0+OōjN(~DӬI>n(tY{}6Yuyj[ot:}*' hbdE1hxc&pxh?!벭�nU$R][dc=iu=Z? r(q<q]+ O#2۶ 4x2c&2;5ӚwviV"TJŸ\l(q(-Hih^|&!TK*5H!l 0;` A-т7&2?o0l +:V;�[v~*"pB;|GAOߨ*.çfm'M 3tV]W$,Qc\w Ɠ.RO4zj)8.x٪GE+YٮuH{A|3ãU$ abՖ}WP n!:<-J3!װ*:p"Ț(|;S:SSB,Wó|f@s5VIZAV.Ivgs. #AFbؖ}\|bU JXVc4@,pCq*ۂ"|ZRf4AM^E[(�iUk[̒ZHN2vjH[nt&<m[.>7<yn:WDKѕG>I<ZЪm Dl5H%)GS[H8n ϝ_e Ɖ}4kpX's]5X*>fWMuP rCp r$j bdi1QIQ :̀/qX1@}%16q m +$8rѪ>g y_OA(R3ӄ(з /zλBޤ;*ۊ"c+MBA;.QX;{Wƪk>g3$ R#0%n4[1*VKL~mH4EbU0k및5ڈnPh<k[ md$3!B]n9> "q:#wy%@|5.2kYpk;NX9GUNWO* p>=D9d Ftw-V3SG̥ƿ8R@o ʦ=G2ฌH`JYJԄAm+8)۟ T8ˀە>ur$O!Z`C=$ `Jiݵb2}zjG^V¶BZB'b0GA:}JD6ظƐc??y:ip2=﯆&Ja&{=II}#r\÷*XXD0:tIH@]J݇HpBv*\]MdtA0Op]~ RX4n9&`je-]k_vrkZ!|)yΞxxj- /:s gd"ihŦ#_<3ey}L(Gk`Y %C w0%� xͤ n0?!XOkvB2G\w>jǐP?H*\/-FmQϨVt@tX- B(wwI ]E i=  ?_3*xZKsf<#:%w + 9c},O<U}58=TUY\P,q_˵'Z03S7L!i!z!&8t QkDhi .Wp9*n ACB>'6G-Yx 2xQ2>]T>u8Go!*Nf&XxbX_uBҶGI ?\���H`Ԁ^5S\[efi1 Cfoz:ҧJ` ָh J /NC]W<[" @w=ט9<8tɕf4THV0; ]_?qŸyb[4?SJ ["e xJ>,]8wU3ḉm8A|qdzd8ZZ?ܾ5{xkZE8LŻU`ifof9`5S*Ы7E|>NR+M닧U7TQ#ș}_KO %ĭJ`ItΘ+ie`D`!HI hguB1-9qQ +#YUOˤ Y?V@#p E[dyK oo 1/\1C- R%ɂۢ89AN*@%a87B혶fGURnTH:'6YZ~0�#M疶^( {Ƅ=*E:g⒭^/ c Kn(xr:ouEm̻ڕ#*SG8Df3�+|\k yzK^gAāqN\=9`7< _+$w ^*3{7}[Cfkݞ}VWKCT7K;Jv6_$:J|~: 5'%27O8쯻Mx V yZٮN,Oz-2 '(y6K0f"r�I)}ഖ%;szU2펊_v4 R6Pa;:2S&#Vf'.luv 2k,Eq r-UOk_% &| O5yZHNI(}z;P*9 Nm=)EDW� |Է7ϽFٸBxZa e=\ e1Mpݬ!19FDK_c}za(j`y. 1˞֔܂fĖl](ʹfԍAqxL(f |n&.}C.V.CA <.AW~Ε; c( \7x7Cok>몦ƠaUdMj /h"q lb7"'"qE[`6s#2)]î8uX`9 Kq A'Tq7(>m[<j˝03UBP~},x|6ǒusT0 0Wݠ' }TR:w4..;H& K4 R <FWՖ"&챶V36.2auI$εyy]F&XXl @ȏTE\ [Lpƙ -D`ٽ6X?F 2e|F"rua8Ϗ6񤁗EYpڮQUCH)vJ{j{P,y0%j0 Ri%4yь#sh%"D7ȋlb &M5t\!܀FY3zg�� �IDAT/J9*"#5zOBVy[Ռ}ܛD@EU5 t:jECiDH]n {͓B@\O~w䵭 %ΜaB*Mb>6|;J>9 'Sz݃r6Aj11wf? *vsg=ur*<@؅FtDҏEcp5 Yobݙ5r}fyaiXo4t&+ U/> Af<G5-8^iÇшq�&m&a2LH$ &Nhv<(HR -=G( F:3AyaRf>uEnYՏ6D|]UilpFA1G7gcQ:iE1d5=g` d<tX}N[x0K{YQ8Mg dw $T N,PgYsg�Xi`e�>/iٲlZ2Lnk=b˶PK"~Vg4bE0cdijkTs*>vS UKd%C)q-buѪnGiw+s22^C b* n#) Vc>٣!$ƻz @-:rr0J*Lj ?b�W{5U"j}7oXߒۉ?wybbORpX636ӲxO]m#F{v;Zmaw[uQԭ4aԊZf3Xg E^?9P%<S*6ym}پs?pG۬§EL=w&x9*;|X.Z_ &- &l9bJ-a]N CuG@?ڒ0A(&Tkr;}'b߇|/Kw'`k>FuWoq0ne`hwi\Os [GÙ�'vr RgnmaU=4>�pd] d4Hw%aB'lYr**^|>]m$%0chJ2f^m`F m8c^HYUBj:w!kz3_l4my,wxب*\2rmfeG5RKWC8;%?͛1B}_ZOBZ~Qm~VՊZdnTLyf>!6}ݾ;#<eo0/D^ʼn~vNT3Jp JZt$q-*ե6YY^6-T/,Sc%jWnTxdw [Ekl6Kb o֐ .,l~]�jیQj|I :gz,Ꝟh2r �2cP5MΑpN{++Ak,;񮌛R:G1d kK%!bir;HT.Z!9;=EDZZj"Gڟ~e݊>+wIh~I8]L(A` Z \Nb~PxupmTDTǨ*-oAي0[ﵻD]Af]u2V 5']]#60# q'�u(f ɜ:r* c񃛋(/O] lҍ\i`LR='pZc7qMo)#ރ3 ?Y53~\aJ؅#\[0#\NA{$* ֈU+CRu h LX>$b�br(d2 4b»HGf`he"X^?wXp4T" hƛ,񷳹r{P\* xXXD]zYMmg34+Tf R 40?zیAXPW Ɛ깂A:Ŭ\^_dgH%Gc &܁FX4(~z'PBMa) Oð9{p$4ܓnBp@JZC,U6 ž\-$&>Cj WHo�L)K|<KŊ)gsn[1.y3 udLrŧUjLzPʥkWF< 5X:\K9VXbW,byuPIvZ` s.!o) Y`>- 2״M\.6FUV'o^!V'?OR^ pxO D0x<0Xnmĭ9"w ľ]aXu�BZ͞9TJp(�m [9ŪGGP URj<勇OiGuuFk ifwV}M\W1n0P ,;aNO >VT7eQE{J*{.=~h'o[r-YU܉8iu5o 9FCʃlYgŲ#&?ex{Wh?/OF|n4W[zΡ$rIݺlF\p8i6:FևͨڻMD=4 d6r\Hzpqs}>IWg"Xv35kIOm9僭qAt7W3?>EMg*J,\(` ynS\YXP+m�J&(`ڊ4W޲"vrV<A4eho07OHb/x7X2K].@;U ~3 0vRUEW0Լ͒`9"REE*mVv)+,qh�FqI=TL*+pzbi[¤ÅjF;kUNkÑ$hA00�j"etř\kjm̶zZS[%2 G-Em2i^/Y)}wI>?J#9 Q>9M_GE7(Dh/'~ nTurma''tqQjQJrg'mQ@xȸ&^_;7+Xd:,1&3'`5 ZA贑z?Y:J-yX^6WP8ߟf�"bPJf~곩=32?UM1lfdHfC|=-!`h^ŞKp^;Uřή} wηئ#m֕p SpR=iw&Q>ꤋKC40BO'ܾPHi-Se3!n58[uu2"鄸:]LHo kKL%[0L&Ǎ7rDݩ+^sbk ܡ�b"E ;0']v<@ Hk ܓ0nu=l'krء!|^ЧXdt,ĂUvϰJ)_a1QirG>щ9>lPj h6 ԓCs>qp:,J Сs9Y d"h~v3/aTu.H)J[q3skԑtX@T,k`&;Ÿ8RȖ 0aB q8 $twI򧽮mE\}\{pp-iw:|2o?F4~LOt~;+o,: 8Ѿ2Mת<sE)Ns%z''S=Y* owłe 64 CgV[c0 BFZ³�S(]W{\epBw$i)'S{Q2B\so^+㜜;<KQzrj%҄3Ԥ&0[`^Nn*%x`""Sj�� \[�7Ҥs,_T'D@sMQӞ q�o rs*K^(ۿ֕uχO3n3LTNn*vV %C""cAF k ӏ HHs#Skprɺ>CsZٸ^ǂ"v#B"պ˱.#w\<&1v507f!a|T_p8bo,\QhW:lwT՚i)@p~^wS'A]EnS–0.#hz&Gjִ8̲+P ~bd" x͸r1g+S}j*--vS #YJ`Nr2쿨u%s<VH96*֤Z-wgC|a&rϵ5n{Fs.\K%r bkY6h 0sZ}/ncp KMTͷ(=͋{u%|(k=G-`A�Ph[# ;(yk1{1q2vA5 I)^Rcvc<sQĪ`v|l VUWdDPWOcI|d h5AA@ j,..p%YDJ 94 9A@5:p]\ޞ? ]Ǔj'jr`Dqz8NΏ\+F#s<I%q]vy&�7,npKl#OuO*b0*M~]()ڕa*V/Ei! \6�@)V׃rD ODVi|;Nv50̑JTcT㺎D �!c]TFT=([ �lL `(^Lx]~ܕ6X_ӯ'`hM\e N~ )g"#Nu4$BQ)N~ZOrWͷē܃I}|q'Wv!=fGgm5p:Aԣsis͙ "`ڱhwyԂ0"nU5Ɖ%M+=ǥgOp׶mbV hN?A<nkɂ|eXk�[kh=5|NF/Yd`18:O*X5`) QhI9AxGv#Q9ns>5s#pt\GmZ-[]$?H"d\]MyAԺ ۲3,0uE-qGkO\mոe n:{Nܶ$s.YivB'a WBr?!VHU[& o pdX%� vx8|Pt>�`mϚ(mf޸sՕwDiY̪"#q&^3Yp5əߕYv :L<$4S"V+g@fKsPMXPzDE^)`@4 ?sHkφ Z'],h�I8 mE !:ݾZ(=G*4Эj5Y}ڐal 8YEk#Mf[? ۘ&DF%YjURRX87AaRT- "y)hjFbtǂ)y-m1YݓBlןի6˃YNcك%?-wAAtzǥ6i. [Hb8ݤStdڕ 60~7;kk!5% 8BQMd'*G=m]賌 =a3,B1e1.ӹaq}1;V2ۭ$u։:v+?tg->ᩒLBH>| vr6}; )RlwGǃ ^(#j6œ[i_䣕(x@ۭCq;IrpH`( G9 N�滗! pP0 /\$ڵ%yejWx 6%~T@wp7=�yBeyARC};:l|Mܘu*lQ! D|K An)!"Kh%[KtPUc `_`lq^π-,ܶC:( 5Bg< ~칍 O}^ѹ): )V9W{hjJn 桋m?AnܟX->=Ȍ2.g\Ĝ^iԺm,ډi;Ǫ's?vt##,+9iY7IZ qQgR\b>xH#rvòmCsA}$U7#޶ESJ/8rt%4j< zʼHRV,ՁrW$nTDpxY73CSɻY~3p(B"jgWSCop͇kzj#}T`y0vQ_@pw_VU䖲 &֩%m"nv˝©dgyp+A-pʝJ!'j!@j[МG?X'i6 ,O򒓝2`Rā o$.-Ě8JoWÙ%LL u9_\ͬAJDꔶ3agl .7XE! Q-v=IC[V#xJSg:UXALVݠF=W0ȑ>k!mF x@�"]!\ \\Lq7ť[X'>hIhv<['iJ<hisE.'^Iiɲ M2gLZŇcV_nq8K!# Fii,bIEjj߭R$ j5dK(q)= vxYGnD-1="$Xc6y+kBV~/' WqPqvXVйfwSZ7YVY$'Ԍ�%h8h|5Jj!.R(V-J#L=*Ma5f9,c j݉?lΗhgTCRYEk aXi|&6^Fቚ}[Q<R ΥVūyW5 k533Enә}Yەqʻ-#%)AYX UEQD2o@[dw7j {Sl\`fJ-jY "½,Q ?�WH1M{5?*1~X_UP alx&²/) gqb. o_*bzeh2P2L90Ƈ3ۥ}U<jpol,~ũf y1Ϊ]xG7(HbJhLPID%)#+|W%Z,O}U|܌IYj<k[[e`#@ܵJHnz$%lipP v$'IV3i D1Zɘ(rE OJ笤ʁ靭 ؉6eŹ۵%@_/ta~!APV!NchFYq[<¤tpbypRXR9Ҏ\` f<PAЅ߄gz�� �IDAT$' q,N0굀<09аrPd'ZX<PasB�,QWb]vO5(ġ]!Qݹ!N1@M*JvB寯%X]BP)`mwA4mz}[eqpy?sWn9f>!UOxz1A`VEU!Cg15LD_c%#=O)uOV;oN+:v0&]q n4:2 A:җfO,Uр�5b`?0: $<6uNAk(']K'9b$Į_MI#⮬(/ϲS|Sl\؜oYYf4)ĠW]yCCARkG Ǐĭq_<< hikǸЎ%];NZMc-"mK-<<>73.Td=mB̜xoE�SQI ׇSwJ]ZGRmЬPDR & Qb6o1}tMdC%Ú<h|: XtA$^" [Z<՘]DkY4ܛD)iœ9ڥ3br/?㇃Ϲ|vX7Oj@:AGt8:CoQC͋Plcr܀g9ݍ#_XXkWsXάY}ԆLz>SSmZͶedNT)DOyo"9#.]XI@l0ޖF?5Xr5y"gf4['R\}8cm}"6'~ZٷyD y;q}dxs֜C^7@$N{hI;"0"xh\c;UӀO,ݴ IM0voy$T4Q!6dOcmVW0rTJOBybsJ@ӑ !cLd-W#'{0U4JR b ًqw҇rp8^)9؊ m8<L:PJX zu0q3KAAfj}d:BuFItVp4іb{˞*Po b Xŕs!\j+tŰ ̎1�S=PaqA8U Z)U1"KR-kc |K6 pL"-A\Τ*o'NmZ#չڤr֨;;CI,xJ} iΕ')Φ:4G&@+zPf@ɆhÀ>- Zc+VX-PW]s+X&R�7Wln{YiR&*ҶC0cUcL ^U?3W>4�iBǕ\ O{؅/^_yImRn%ubż{2I4Y^gxhϳ- sȹIJ.2ޤf;ez#m<h4K'R1Q=ǒ6)dF\0-2|I˙иyOH L=#sUM< m)w]d[L~<�"a"[jFi.0༳hY;C [DGXmѕٔ3ʝ`u,&hwn"׾AU-֡b[qc`\e;qJ 2Ld-v~ 4t)1-`}#kbG,xڦ=eK@0WrbaiU0`<*d韏Y{k{B>\kHt6'$P5U=:Xdhm/*]KسaxX-.Y:|3H={@otH`-rֱgfeiQ!Nb?o h!W=2_eIxa|EFc>ORuD,8`R ЭvRaixni\B!0=o YVi HuLw\i!$%rus?\z,?R[zxϫɚO v5K`k67{֮>%r(qC!GZ]YisjG2?GЂE}+!yhW2Mq8ܣ<ۏkԓi.MЎVkcaY/V:"yN1:4ADHztl)cf8$Xɓ5Pi_Ѫ2-ƖMT;|vX͵zgR`Bk}P Ѻvډ3%r:j,doh3 ClPdWʇh`pδ!@HVm*E o̪ƻ`T78t?V]eNCˎTHLw!:"F p%GUP9veFF'Dp=8%'dhZ: ۱m@j,oNR5Vx�1aBd}х0Ӻ#b4Еz>k"V 6*S�.&SSt;R�vMM@NY~(C6gJ?8UdN%'_| Ï�O4w!h"-":?Z?k }/8 4ůI?[lUN m NG͌+{NQRrC XTX4<-f'L?4n?V=dKאbK- S 1{{ `RӁ-\4n ew(a&@ i+*OX6$ڙPQ"'o{A`3qP�_;o_ʤnh ϝ;.m%'/=Tkcta�XYd[@ !AK&h_TAIifXW,[`1E,8苻#MB.Zg|< lr4PM j *s*F}uTR$Lψjqe\@`|XN䚈 Ga4~X ?cc dZ'r<:18:Cpd`(`mlA%|M-qqD::NC. ӯv>Vʳxu%ggp'™\,r:L1֥o"ǂsSӂS'c"3y9*<7΃*8*݅@!'M�&Xָ$se2ܮ|){@[{(d'k6z%5ӬcZs2NwCQ9TxiQ,;o}<ʄ&.#nHd*Win:u+ֆ"j9/(и] S͠' D'@$$Ƈq/89{"M @oiMI&Z[\$ %AUUd�BVP,&@8] 3j7~)_ճ>+Qni˿#VO;sLҒ$ "`PĹE sD>KEnA]G 3eYE߽}?ä'.hJ@7z V};&c6>SM+~H u # \*eHDKV Z,dfvqR)ׁ>Zɷ3]skJ oscu\AEӎ| ӟTM=¬u2xFwEZ؂'L-g8^Ǿ;A2Z`đHXz b-(3vA4 >d^D:?*hlXo̅;|yV5l һw#\_ D%HHەLP~>@u*($Yse' cRJGOq/(!h2n<2-H0y,@rBA35-N ׻I$g(7[`3 V.�AL}TIOfI8Wc q;NyM!1S,u+17P_lB \#Xғ 3�y@ܾn9/-[f$7 gҕLɜŶh3qCԾ'*M)=MN / ē>Ctk@28u vOh0:~k徛/Љ50ȞTnd:-ڕe<[Gp/9]YlR$&D6}^$b'uZ"vp1uBȞL8ԵizY)r\XT`@Ёal>X>Wx^!cאr*ƭ@In }Wr3f{1/^ڂe)WVXpB{ p�Wi0}|UXy^'t Ix�o{ hWnG ҎB@F5:V ~F3-WޚMW5m#:RsBC3O zy\{~4&ȹ@tUZ:}=ёߕ`w[k p*~Th؃ 3Tg.~y5�!s lum4rB%[`ϟ4or3 03X[C)yprF%g'Eݤw9>cCt%y &˟D->8,į>9hSB"!i8~"Bw`i:R"y dو,ZB@tlT'첹H5mZ؆X+am{ķ5H%'ҏ:#Cs "-!VZUYN۶Df ;-crE: 3C8GU.zs 8 . a.dk0nvw3(ܞitۂ fĒA-<~d-y3p+-cŏkvg āΩwܰ_Le#8{'FKZ(¸ J}m W2:}m w۵-Xg3Hڸ۬³:.Z2iyxq sXq{RC}A}lVtہ3qsgX;|kfmHPt,뷰&WUkJ0U…c1%5 =gVҗ[<@/E/Ɂs5)gU :H]Kz󨠿�kHy*_Ƣ$nێ m92i!^ EI3#~̝o ?p �&9tQ"`ܕhطm&78I[ZoK: *;=ۙT:Ž5OIDdc ^?ёtHϣj!|mv/q WcXm>G¥zb"jhR߼:iC\MVNL뙐i1;9R6:٧S'%G.H_<X.U -ߥ5\B܊A)N<uU "LS!?'ڙ}k -{N\:mtbwOŤ-H_P _珥L;D2ƣEo*R&\ OO(u4CxW"yɚXołiB*lmnxH`Vׅ'峑^lD0>2] ?Z"H{ Ir =] A6{Cy(tՃ&iQ8x}Ε:z2l$f ϒuosƷÞAK5xT/S ?C*R(d?!bVmv^^@sb'{./Vh\2Ջ8ďHvA*fXI}"k:.Z-/3v^Ui#q@|m9X%{ҷLLfLΔL D|@rcWU6j9mr*yW`PM}DNjB .%$37\/ FTrݚ Fѧj-Ѕ݆%6s7�83>[)N?)Lp8?|35<\^@HWnXt%KXq0G=V@ JA�C@p xꤚW^:#/tJ7f LO|5B\v kHD`th7 ?yFvYR?xXѶYP!m yB\N%GvU힢F:ED4oZ NavSmL W$qVdlPW}Mw'V5s`d A�;X|&vj)sR 1{7iuUog |pt}{X ԆJƇ:L%ai ir-OmLg^u^`\U&6(m?��g7ix[Zi/B#4`:Z�HMlAF|aOѴrk'@ْgfG=C S%E?P)2x@`i{9q9al?V܋l7Bls-e^)G[a'BVd5foa?+'Ӣb_J=) x:ږ 4ԇB %>I*x sAVotڲ7+p?r@Tj #ݣE<{\ xm�rRjedlAз(<L Fbw+AU90@UI.ay\ LQ{"c5!uF+ 2e;3c6%r ]{.C곓d%@.6WWnPw8+Z7@^%9_' [0) W[8q}wu5yuafOY[q };Q ZM"g8A]N7&ض@*si"zD "I1n%( Þǚz(&\i7[Ħ߈ȶ>_JIE\ؾ% cs6*Yrhܱ^Y8sp@&ρ`MIb p7>dF. z.X' + IZ蜼$tUQޠΛwwV|EYunĿ`Ca0YRUT/|`IC*}A"'c#M`ʵ@;8~keh3ctI�H!Y;R)BKωi R� T%} 5`Se0u!WWSGIrtڮVPBB =(A{3;JP ىm"|8Gu99O^"f�')L+LOHҁħkR;u0;Gi. ?5Z'sG:r鐶3Uj\U]iq_ ȦcXDf^h3KX|V{qYbV0ԊI7>wŁB>M8pSo{D?u^\j{r9nO:Is*, g|ێf\Zel*f^pB("4.-!n+n[8dqAEh|ѳNfw>R]1EPz8{Rp]?1GgE�Iiŗi+讼�nD3O*'9Pl KI%j ea,(#3C &ֽ?j|nPS"cC%q?x}(V3m0MR®8v5V]RmB Z<#6B OfaKh”u<p":Gl|x#w ە[�� �IDAT� |V=X.ߥt o~5% -p(p3T 2jSKw!\3SBUiCE0&]\>9O-[MYu2 *n\Dw`5?炟c% rD*nN jRo?ږTB&**idvPJ7\ u܇ȥU<ME$Uge(+ĶqF% : +,Ж$&a2A,yS5+yF\=dTspt^׸Ap7= J={)G}\ =\ѻJinpɎU, O90ޗpHo1"Imp'h:n̘Y=CIA⸙%a{W]ua/U f[b'VhdrF|TB{kq Lc"2Tkw8o5E,  Z@2Exe*d@B ٙwKUSv![R]֎m:3\=8)n;(?~έpx&R1~RU KV{wO+h`Ne%DoDJW zxb] [:ᤄ/oSY,K-TtBD�Ss�s€wBZ]k_ʣM_gEWNءB>r׸ܾ^^+?RѼ?^/jE*U0A Ӈ ci`&uOJ%}! ٷgcX*+ZC,)?۟q4y An"5C8|O͎sSbmRLX6~.^?x^׵w`i"n!B iYxIv(=UW!~f/%mUN Z^Fo'h�Y4`vP捥xZ+h՛ieu]ڹנҚ#,Pϯm__[+@"“+]Ww3S\ /PvgVsruxcy2 Yy`<Dڒ+kgNAf &2X{PW-)wϋ{*^zחjU0ٓ Y [CwƊVci^t{56G dqMWk7& ,뱰#,Ojl-7[Eıa Atv*$H:}<Xk6~].L2J>S'`pe1F "pu0,+_CuK*jG(\F<,!\ޞckuv_ĥR6x®'n#.J廕u{>>̋M*@=b0@|EqeE]l6/~.taq=8/#ܞ ZC!!ܧAvW$p @=<G^N.CDIҗU}®4^Q5)Z?ϣۉW[UV[LYx ,IJ*M{ҨGqYOt֥[k&(`' 9`}6Z'-Uam#aV]+8J6OZhd밼P-!޵:dO]ȣm:/i22+PAKc4,<(mK0͊-O5Lr/x* @-Y-\xo>qˊFJVS7bh &M>˩ "  # ZyT'@uH[ZX2j[1Tj!Q+R%z'[j3QjVC�-j|�s|L֖Miz'USDJL9ȼhշ"tjS$‡W@*yH EXIcL㼠ErBPPǺᖡ;y"f R LWq*_DWMASf"{kmOY=HLc!}d%6ۅP|B]IA7ёOW\wNp0vx^=OUݓoMīUg9H.r-]yrٶH9(vɢ4 RMN;?Rѹ1XB^ĤJ)v !*<̘cEtVI�mIJ I+/`;Fpٳ$nIngKժ:xJOBv@Ɖ5K+(TKCmSə0)Vj/".Mj=t8 ̓h)�> q7d!MAtb>!~-a-2tÕf^euMҫt,oBYf`@k#6UU˓DN ҈\T�bt=OA�s"O[HzW9v1_vmB2u<ZXj.jYjЪ.'·na179KS1\џ ˟Zb ;b0,ZH0N1M\t9k @V[x[ v-Kqa=wP7]PC@Ƚ*tR)(Epzݑ4=O*4Ek=pLJ."f+bhCF5nZe3bPQc@PB{efY_Qt f� jVos>h[ 6*t2gi E19DO>:Q8hS9|$6t>̔c54B8]n96nrK1+S7P71Ps P].]:j$a&Bnn ku |6xBiƯxT'I0O-ѓ.=y ۖЕU)L5>4U˫Ь$yT΅Dߤ6Aѵ!,R�,6X^rۋ`ZTL Տq)+D[#nբ;Ja<ykRȥЉ apkЩkcU`s{Q bxt �ﶴ7j}noDZUm kw>Pwrۍ˱"C_*MC(u!b!IёEtcKJuD!x U)'{5|78M\"̋HٷR+s.9V @_xZ%-'cEo_C ty"N&yҔkމ\!Es|f-ԃh>Rd"{nrqr}noZY0i{W@}rJUs=I�ˆ/k2G+QX o9/쏋XiT-㿾$'p6:�97&vKE3)lE~!Dj1''fTeV5KO\F*/El@L y\"uZNi{_~՚$=êUHڊL)bE77ٳ.QCݕh-$[}-Jϯ U06[b0ާ` +iMݢ;nO+x"4NYb!Vf%^n,&~bZ\iϵ: 0KvZ3rcP:^έ \0.K͌_ujf|t('6,?{ BHZ|3%(u{!vj7TP R#$UEҿ5|ulKOݮ-[rE$ .MMDbQLٷcmdE8-^XVtNXy񣼢0No:NRզ3aYW!e[q1n'y@ 2 åT+R(f*/?F"�VSmZ\#.f;o*ܡYpwhkm�a"= d=s=aab1--Wjo0UG9PջT CTxՉ0櫠_sp'@LeUk&lQZVrZ�>^Z B wSI:>9GHî(=(l/5?+}@~mM ej !/qE4\y]~pzL儈4t &4}'�9e Eo d5Lu 7fuVRKՆ{N(:G$TdASfP0-8v?ϡ7V u Tf8E4ҫTIrBo$\BESL/NCCW.6Z"qvXoG*nB�>F.j= <0-&FmOj"FLTŞt_vPqwz/^ J}i#-�*{;z+:�p_wk[I4ԃPA]!ؾo*y+R#=[NQa]WBq|BA,_Mhos!5y={]:"p5%FBrH&T yyu{:n+h OT6{+ڏfBrb~p3Pg%]D Czi:9{ڥ$[<VYeZ7l1h;>-r?�߭,aO=k ])tBq"*T-Yͽ$m Tᇫy163S`-RL-z >>8,2Xv"ը`=bzǬ 'J+blj٧d6H`@} l~n)(_܎FZP U)B@U'['59Tn{md/l f9WAȫÖLK$۪Anw|-p4qR�KqBcKRu $+=ռ*mP"̨%0G v7`o <L2[FzX܃ry̋CZHCQ+XwEQ:tER`J( 9)V*)|~Ó œQ$2'<Z=1u-ZiV i O#"Z~U>iVIp쿥g=8W; zkx*~,*i\ P>JKB bH-6$:Bn aC*}# h,fКx4h`Ga 1pMQYuaߝD;@U8{Nہ=|oA_yrge(; ZΣkX"~f{r"$%h\ 2a[BIivc2Cx`QQATͻeWB̤g%M٠- YJ5-% Z$} tY�j%<2bwjkϙ^gG~ݮ<+$EH7Mk[]{UL'-*kUȪ 1Rtk-oO=j]*'ҤJ {?Nl垛[VxVa)]ffnǪ}#eOK̽c$_)6GYWVg~"{yJI KAELʋ\JyR`nww*\^*sӢZ q*a6jeP9ς29v$$Jc&h½V4?[RT0]rJg"loU?-0xUǨ"S1;DIl;N0'r:̥4#MŤ"_mTi?I.EnjWufL77K]wטbd]$=A ׳{C`^c҇*yW Um~x# EjT)]n)@DnXpҘvr>$V "s- 1Y dM<ydYC VJ+*LfBQ(#4 *;zAڗPC5G%ײc)/3_Op׃oF%ֵ6)ffDqߌ,N{T$ٱ2P kAMpLZ oA {x̦UJ >T &}bĽ>BJݭ,Wo D5:etn5+]1~hTr+�Y'+;RHɁ[l'xq0LҊ\iPּ֝U9jOGtm`\4.YiVKtx 尶٣3얩Y3˥ZuPV OCok&m]Z ܥjA=.k{4sW[Wi X Ig8n ݹBKɤt`@@(,mGk/\Lnj&]y*6}YI[S[ gjɨ+yE-N(Z:>>I:: 3+ZąB:�3{#:(#Pqۖ2 %R-y)$U~D>~xX:ŵ@>gky}WD;74H *T6*[J(b].ˢҘ:a"x.;&iD73!tW5W7k&*yFtY~o4B [P_FR\$Iq?kࡂF|g,gk`4:W%X.wEwV%;H[MCoB[7gyq{BU &6vE鬫؍'sfAhV= l!q8T5bQ;l?}RbWDThk<> ZՎD.!I]Tyh<XJ rM[jEJd_Hyr?B{VǾ'Pr,LHvKjPL"8 T(:oյ`י|}w?ZseWv5\mՎz "eռ3H;ʇ- j`[#_k$䁎mv&F]wJ+OwY'\CTj;_,fcoq?p Wҟ)v`Sj,}-\iׯъa =oV|sc%Oz&.R*R72=9VmK`K#GXy+}%v2ʣ=%iGYpf>9]*{V/w m3́p{o?Wz[W(_7t&�jn.OR[Xƪv"I*cYEmM ڦչ3>v!=6>;]s8$"y�w"TP45F<J\1p=5A vttkɯz}ricl/8R X$ͤ(,0N_?0m%$:IpZVToJY')bvK <"/VЄiP nupSz:o,_m۱l%G*ϒG_x_zRe;Z .WWe XWpqI7IuM̄)I"~g96c TEpPmz{n2`C cAd}[!yPcBȮD :ǝ ҜA `(j,b5>_ׯ]oTFѮ$ZYkz",R!OP+y]ןLi$®JN bR;&`2VcM56R5ѿzȂ@5k%j@3+?lkڳv&Ur[•~=1+$]bjX8{޶08/RAVwJwC[ؖ-$^BP wH;kѵaYv#9'Nk: kdr��1IDATc'KψjJ[?Si*RЏBw_{`>][K疘\FDI)Fx>3HZJp %`n\u�QnF;uYmz{:֎ ⰖH-x ?G{Q\- w%9DzIϽ)|Y'RAj@ΌLSL4E2.Ĵ(yBp˂̡1FZ{Y o+7/UIpƪJ Xn\3R諆}e;'ϊUe~g6jJ05җu 8;!uTSڔmhHQ// i_VE5-diQ<A>z!8B ebHhW o򡢪iI"Zr$$cl>X(}W۶<חxq^~4*-kk#]qEAu fB2-:<QJUH׳S[xi$F9> ϦV6>kR +@+}/&%ZShM.%Nu@˔{]D,-TFm �cT׊:=Xw] K^o^&:^>%\T+<EgvԪ_GU UdSRٕ ; divϥ5Vߛ[lͽy >!\A,\`'z_ؤ8\Qe6YNwe|?~L_ӵ%\Zh } u_ B^堮" G!Nb;~m^I*O 62X<N_;\ƍ5ݖb B-nNNgg3.(7s"!"HDi ?�Ox%)4PUk_5]5sK+˯_Gپzr?�P_T5EÞLdtֹ PD `{8tp)ˌ8K"ZG(vVY <�(+QsߟۧoϤ#2{;*:N{h}{+<ݫzO)Ӟ\nr^{Tf)ގ/LZy2^JZYCV@n:3င, z}'pɞ<?}]WPɁ4WDcays,t FxmEo2^_cX{1U` 2wrz ^Y5ƪ1)=ƖSj̮Ug8<D^ /Zv$Q\7FVjEw>KU".ILKII篿_~ Rq1Z̥yԷ05*e)w]ˬM R$+ }~Ýμ~QD9n.S}+}t&mGANG< B}6~%nl`LB(˟6 >}Hs^S-fQ)2帨nIq4dҏ/__}ABQm8,]5>JQ+urחHXҏX],[ՄuFk\k}_ ?`-M@�&v•K tLbT{:Pn!N�ꜭ(}2Q x▻H:\>?YHoI%톊՗-rc%=q{BH3"" -J ˕# {l�A_K\jۀ:5V#f:BXDVnf9߫gX?dȞ.$i7n?+DKQzCjX"xƕG(;*Fdtkh<][:/,- z6_QU~cOKpU'־볽j\U e�0BR"#b9$^NYEԩx(%9ȹ)Cl6AVNH*ڶ3W [:WҰH ’1 MD|Ui۹":^?^c$ m ;E6v(ڈ՞$QHO[_rzhyL,]I0 !b@a8T̀`,R=XsHlF&>i? &{THخ1jάMN]݉C0'+ԃu>7Ҹ`7լ~G}}SvaxJ?B~?jU#Kݷ{32WX+E=2Ƙ4l4Dg! E|9p_Ȣz sj׮rF5׶8:x.^/n\AT.̢ 8.&rY.|rHmU*_<o2[m#)T' gV0!+]l*Lj?'x?Z-Y|ksGx:' >+mUpv!fG$)ec$R BVrŢyn7_էܙ{)&ypsGCȠ|a,!"$dtZ3%6tSƿ]hAXXJx-` #a:ʀi:]AOdƾiSO.ʕN>M 1-pR;poEw+=)4gfY1K:sٓ酐y-jSJ!DT>pn/I@ 6uP`Ak~C0R &LӐIC%Uu<^A%ڭkXIۜPݧta #$\M|[}]/^ *WxMY[ 7_޿}uC.ARl>IT:aK}X �iqu/eu% *tɆO~C8y(a)9T%]GͶ�wd]&W~8SDK kr} $KWZ܈|Q *.)Zg*�p%#|>Zv^1VHea-Pa ;JCҋ&kzE uDlOשFuܜ]$FѠFriك\zUmЪΫKШOZjm_ΧZW\t#x)k~xqiv⦶Η?-~o ẇ%݄%E>REP>qR-J0 գfa򛬳@@(#%6DϤkxy.7 &7`q;M#~(4RiV#EzT|j[E+& S ]Z`^/2+6B9oj'huUU4C.OmHK�5鹖B7'%XG>'c4Y"%LgH4 + )﹗`&bQ,]0@~T̂t-3=j˛@z*^/׿/"Ϯ"ϴ[Su-EigB):H/?z;g2q@bг-V-l,%=OM9HpJU*a^:93ek5+K0ܭew%+!@]QRw3Q8>̏ߕİ/?[~)P ϕy/*ٓ #j$P27D+Uң ŬKs]EPf``gv!:tY@lg@^QRsVSlվ$p9Dލ}U Ǖ|s|-JyxM,Xu-\߸tDūxCR{QcF\%0U=XmQm0M)n$eV([U2k#o#)_"VAT]h_d˅@.~|U+q3p {T-oO4Քq:^aOyeiƅ(#~"Wi X� ]ں'FLQ\֬Z0rŪKϟ{' ۼqE*7qKhކ:TDM]K_*6K0}ofR UP,|&Y~TU,IOç)Is(VI$6O$4G@:>u>ZPW"|:Z2h3YI7ntutvA>їl}>ʳ}ON;UlZaި[\- TK5m\p%]a5Hz;w;Y' };xRm,"V:-#tp5u Z=.&jفI̠?J\4:Z#6E>_Z[K[⪦] BJX|`ﮱ$5Z$%R^ [=Dş~x_ξQNuob< B;m j#/gw'_zzzW?o8빞빞z"s=s=s=빞빞빞~<zz)\KEOs _i?g7p_?uٟY}_}.igo| ~/o܃ >s=s=Dzzz"s=s=s=빞빞X\\\Ozzzz"s=s=s=빞빞빞X\\\Ozzz'b=s=s=s=빞빞빞X\\Dzzz'b=s=s=s=빞빞빞\\\Dzzz"s=s=s=O_y:?O"y Kz}='Oݼ^*b-빞>~?C}[A빞빞z"s=s=Qn`9o?@'b=s=s=Sc=s=s=s=빞빞빞\\\Dzzz#xz]L~?\<_ Qo'b=s=sc`NHQo\\?zN}ŷxjzzRyxWzjzz&S2P빞빞n\\\'b=s=s=0/빞~׵?6zſ빞~! g-ET빞~?'b=s=s=빞빞빞\\\Ozzz)^?p7P빞빞'r?IZs=s=s=O<⹞빞~^׿A<s=s=Ooy�u����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/detimage.png������������������������������������������������������������000644 �000765 �000000 �00000410274 11332353404 020525� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIME8="�� �IDATxydWy'5ZJEIID j)aAmrcqQӞ ' /AC1ilhzi[xVцR@�!H*TEU/kǻ߽EdDdD;uDF.1�o5 '1`̮z;"@MLλ{D@ &~CQ@  Xp̩6QYqæͫ{/±._V=򃯽`SiӦK.=/Azn1v'.^򟣩@ Ο=}K_?�ֽ8ǂ Pv{[><ull|qѵcg^7M8ֹ3rKSr-~պXrFFύ7W/>6 c{6DS@ zAKX9u;y0߶m]sǭo�:6~_z̓zםo~?RQ@ ʵ9rɿU7c>>}0m8wp;�9vŃ{vں7>48pLԳ'˧t\^x;�̱oKu\|C��wƱC_ �'NolںBl#?~S@ :Ͳڿ~,j_zd,!j筯y*(+WN-mر:k 7w{׶cK&6,:yJn``�^|페]mn:tQ�g^rݯ�D_zÞ{gvmY?y!-}::{*~wXV Co޽.?~;�޹}|S�BV9hFy_zo_ӧ{uKȎ7[ @.?ܶ/GcNק6}˦u&֟p7F69{kG�շ��? ]zomزk}~Wx�|+^?[?cl*rc�`7vrtx}-}_rF.\|GO{_mbK�`ĆΗ\chp౧GO|ͯ:oW_{^vŧrӞO9ͯ4uˍ{vm{у/@+_}?|y??7njJ|4uq,g76n^wCX±\a=Y.ǎzGhN �Cӷ\ �g7vl-Fk CC'Ftɝ'_s'O%׿;?wO6&6_sۋG :;q7_-7]?qw #gOy$�=y͵oڼq졇?7?|'_Ώ uG~_taݯzZ76pđ;`ݻvlu �x0A<@ t^ʵtW{q19>%�0ؕ</T\9w l]틗_W;_�<{G; A^7:|qms06 �/=w~ǶrgwnM-;co|G|}[Ͼ_}ko|ɇG֯O?ȟhͰ|;n^ynԿ _[^n/icO~vίs;nyM/vu'OOH]9? >}ij'}s8{C>{�mrёf@ 4|r Z+r~O5vukPuNb~s.\8<\xsl,G\띛Fnq ۵cpU7 7?;nmėD`tdxݺ|0 @LlX�Μr20-=iK �{p~� ^8 K_#` �>r ;}Tm4�_b%ަ c�3G!۲#'M%W~o৷[o�8?Rgs_xial#G[^}ǭ'OaW\6@1m2V;X)=rݪ.:d,\>t7]|{O,>�pчF6edlCpwz-~kF>}/k�~}1~M\xixhr#ݰe�<G?˗/Dth. aʫ_vk_g}gEGrA8<�\S6<: AnOax�=_~/O<sEƮe�ضy|ph$܎-2.+/_8쮭ş}_Ï={dž޷w< A@Xe` i{MBM_rݕMh\x'߀ FƆ]O622<44oLxhמ]~'wo ry/ȝ~=ԯf5o|/=oݯ+oz+ vo/~<e') syx3gm[%x;-y߳k/O~bnO|'Og Mh[^p|a�p󧗞<sltΗYڲ\K3@ =or_c2XȽ⽱2p_7uq,n0|t$h n:vĞ cO=M!ЅW>7ܸg玑'O_ݸU/�>O.N5yӵy׾m7~3_z:qõr9ٯ|?MC#ypy)G~ӷ{gGG� :}Y~ў?؃_^3u�Xp˯y7ntt|6 _zq]G_{Or[FϜ[C/'.OO|~tlH>70V@ teęw[_g~N{c"b]o/^ƃX?=|ܳ_;z{g՗+W.y˗O>u_+}/^t]a >{ mڲag —�ϟzϟg'm<08<<2\<m׆-;ѷ` nZqw7n)'gO۸ysaKy\n`lٓulFO\t{|ӟžGGg\\>wʕM[wm'3K.] `/]X~/^`Wr#c7n5<?u& i5s[nҚ?/.o7m-t^qe|uaY`vCN˂+n=w7\C?9{jƛ o}ʥ� eэ[wrQ�G�Ɓc R�lھ{x49Gm{i5C��l\oF6o躍C�}g�w<Tk |w� 7i5S,\06?\ʼۮ[?80r / p~Ķkr i-;\<00?dhxxp@肈eJ-ڛ.{_#УF984b?wtG;#/^8s;M 8?۸y]ѱa+|׈ϛ 28lɓ[Ols^ky'Ϝݺ{gA008~|HFF7?m:�밢/;ZAѭڽwV#'A<zѳO^|) 7n>4]?#@XC|.zo[{7Ǐ<!W㖝6ch~}.G{aM!.7uߒ_)k5A00N@ }5~dl}݋pX:wzF@ pGv@ zoG"k @ zW8y$@ 9 E X@ "q,@ c@@ ı@X} 6{RRے2.ިz%ͰUƮ W;ɶt0Zl{ھLO-4^7PzpnmQut v[7w,t{Vk).iR{Pz]VzVB(=;b2wmz|3,JM\U-σ ^ ,%yzmwV}CG~eF?2[~uۇ,#q\-LgXeGɲMuY8::6uھ'͝ZG3%c|~ ^MN~]}cS2i՝~op% M5+kmqpծ*j[EЖc JޑSOjmijl+dZ]>6{ ]e^зLԥ4h. qvguЎ.vej:Ե29gU承㩤SWk=зk@7?gm;uytb{yЛ]si'U82FkۊQsu)-G SHL.}&ׅޡUNט5Rklfv%cazyX/٥"r5vhݼ-I ٮ%FVkh#]ڸؤ4?Fml3(û<A.,s;ʲmfyEk'λ{SN/}oAL H7IU\;'7m8v!ei"m_^`�W cU@<I<]{!'ȴW Wf E X@ "q,@ c@@ kH<V@ OD!Bs,bW@YZ}Q ?X@ Eh#ȇ@eJ8AU%EUA :4ُ ;@ H"~=ʘα6uۑbD?!qQ~J^eyK>6E|Ϣߠ{hYz.Ъ\ H[#@)Ye,Z�A*mV!>OLL;f/jI|=Ͷ,{}?oOVBA@DX=ce\ᦀZi/oыѣz榞 *-; >jӶ)?x-hX&H@'Z4$'.6A+N.S)ڪBNamc]N/v<FP=]wײ̡.y[JfEvi#lE @ťHX!qzv?ZT_<lىicSU Gc> ioWBnAkʉ^骽ͣIS-\sVH-t#:.c_Zu~Ѳ&mf_Ŋ=E+U$jn~Y*v,Dı|t+!jf$�J,F_!{3nY^75d@65$Z-гydB&":SmxIUH EX(4@ P*h@ ؿ?@MıH"=8 CT`"2(@ ı@hbj5_UB0Z_¸/_'WlMX80~m"g--B^3'2XoˮnOM7WgU:[dqҪg,0r �v\2Vꞅp[.&w{F'W]=xpU +C,ҧ)TeQʖ{v(j֮]Ǣݤ)I{LT=xPH c ӒY}xŬt;^f׮d_j&6mWrOɛ*HHI%H \Uy2΋_]Cf;TD?55"WI B!V R2~d$˼/mLO5@zQ&@ \3@E)�lQaC2>E*+aW P/d+scO!(WAe9T㘛#"}ǮM.BP�)7?;U�j�%:AX0מSV `@_�A+0hȇדFu+$7Vx3jZYLof?qcuT8@;6Poş "oFgNCsS̹Q8`3T kB oLs 0y�f,XLXᯋ%LrLjKA:-ıV'"xo>"fH!�\WzMR䧘]qgHd/!Gqy tƦ`~Ps"5XF$"%$EVɓDB a &С!E�� H��gPcX ?+Ɵ9?ߨP5<M|W*un p`a.B4I6sB�j1u)F0&*NB6 U')R{a'P,pX9?埃F*)@ `WwvA$DOܨ>xfK3""*lf)Y@PTҞ5xeT!(<(_[JQK\[ȱpSl?E�e m U+0H@ ZR@}(6]S\&fe䇒ޒ:g,Xn�]�Ms(qH'To'7&]Q6&3L*4'lQ6|z p,;Ө'(%ee`ڗu)K m1"@g9n 0@�20`ZCPL<> )qT9.HرpX+6|ɢLJ4X7{@vW`P,CJ A;8`.'oyE. wAHUTb>MPe\vx ??vp-�4Lk{°dzai0-a8Rd,O ]%"!ډjU+Äl.T'qU.Չ^r{_4)T4{UQ"̘foMacTaPPkY[c ֕l BI]!VHm<Ief?UPSlT,ȗ"J CϦwd?\KѨmZY"Ǣc;@ h-骎O3AN(K ^�88xO33Ʀp�ϑ&?TȎ5?[J@ DeI+TSyiR] -rbҝTYؤG$3)QY-/)-i|#0[UZbe,*f3BV(k4ȡ ÏS::j\6oKQV�� �IDATޙ]�2ErNR:IžAЈUK+)oIH3ZX=|$-6X*Ύ(:tb%`(tt6(,Z+8ϋ1θ,2�5:06%>@+Y,yG&#Dnu,Xu=)7vtH"= ;XJ|iFgi\N.' y6ze)&j`^T'l\{A[T^WRg()AW-"Ic%Pud=[gdB +aZR)Xh> ['\/of厘@RCE8qLZE$h [.J!O$}WuKs۶:EgVGd,@lvqvbja_�Adm,/"ER7[�* ԵJϛdfTU0b ٛ7N&)+(va @ c`H0RX] &uz`S,JPů6`XYQY JY( y!.efET q!<n'v]Uu8%bRJaő@O9P[b; 8:Ϝ+pᩦh<a̰mfO+I8B?2* p`dÇLRD7D')JPO2dg;y`Q�,b̡.דRO+{<<0_ TP2թ8V@u ~T9 ey*G4c3]`=Qm T c#c2ITG:H7(L,&XbZ,p)J�6 _ jU$qU۷_RU.FERSULJM%Xe/ZV,5"EI qW] )f0pI@IBNX$`*N<IDӨ98=QŸ%-?d,g`JYV',*,g1F448ow),&fTZTQ-^- R&ZaBh"z[��]ѕ6ظmiJL��L*2]Hb�ˍX8cQj�|f \$ZB+,cS<pι� (d;+ZL%ت*xe,$P5B%(3T?sQՁt.&jW^Mˇ+xTTn�0:,7bN8 r~̿JO!XGӸI\DcPr8a+*FhhU U#YD4׆J$K fe��wBkLN<&4Rӱ ֛Or*=3LV)C"d4jH^Yh&iL]-et罭uuxW/ P?Yg\ "4* C23$U+չ�W7P^-@9qUO!co&`�cf Po1ĖpA�jp zR+f\A* Qa"Uh.ٿ&[.{PEjLVWٞ/^>J~ĸ<66\I!${89 ```8>q9XݧfC0&yM.k*BV#l1"NK<Q ƖZsjGR^8$-z<Űipe~tF% |LO<7},V`~�S<uE^Z‚Y�ةFSIтSW 8D5:S˿C.ak:sC/ D T>+DuLS=GI+`^jp0[BE0}$N+L(�Y&M@R \9� R{aAn aZB(]( sqvQ~+{zj$֨.Clu=28 kl&Yn\|#vB`Y ifLC��Q~}S#L65kX05)6,@DdfB9"a.-p,ԦB :nxڢcݛ쪣:KUc5%fC՝ս~eUr+֕¾%ɷ8�[NI>@{2e) gp?66=]y[Vrl$Xor&KVt>n,vI  w/Q] Ķ] | B+c#[h\^winR <�eq^�=aaX^kSE�az*^k O0Ȕh⺼E^3U}i]ʸ6wstyUrwֵHr+E^.AI ,[QS�0�5`,Nx1 �0�̼ؼEKJ{�`4Q e3:a} !8R9{\KmAh%OVS44fB~ }xkam?N2T h*VXj Ud㙅 xj�tf`T!5%{ !vSi8XyN)@IՆbtfZ] sHޖ\]NrhUXқcԧ@HK.8z2}Qv_YTġNlX7[`c~�hH!w1^3'४=+r_E7OMy aE|KtwV2ޣKT0!+ӘYQ/XIbJ}*I"@`=.3v. |rar<[" B1@ UxB�s,"LTť94xcaЀXWԘMEF\ON"q~&)U(gHKϋ!{A@ WG8&ۡ$Yr}z z SXt+*Y8+.P-|CEŒqN: 8C$I'q drUaR?f q.Q K?b %<Eı:*tKDXcK</t)a"XT-p)ۙ�`Ze ϹRD:뇉߹H7-ΙӤ)e :pwV9gll,<{Xţ"PhSw^®erJO U,+YKJvڸ}9I.g$, <r' ?8$w �L&UN#j&OD`߾}4@4@z#?XhƸڈqܽlm`{N&slA;_GT;%,$DȠ!6<j RVkM TVkUXOZKJҴc goXE.Zu,ڀG?(ꉋy^l ӚՌB 57ܡ#j1af;Ek177#܂נ=PQJVb'p;" !,k}x]`^.%RLp seOy %?%QYKADTw;@ l_"Җ̶:ˎP BńՔ'CjQEE8߰몰Hd٫(AS6XKIX8K&@ x"5| ^T{2օ̐ne�Hy5YyǖB\!)1VZFRmcF_Rd%DOß%"]ƚ�Hz''Z,;m_do=c�_2`+Rѵh!$'WO0WL23ԒrY-D '&d8W54}ř,PO .9sOHMpmHu[ Ơ̞Aո7 + 4@="ii &*>gE\P39`SUF8`,rkxЕucM/ki8*%s1F19PS'ĭV%y±(36a'vC#թ+^2^f^ʶZA5*tp(9s.#ZeB37q@Pb?N%P]aVdUA+KHĪ&Qգl32 97>=*Nv5TI;mRO*Ack � KhCQrʒRtFIcP<m]㝜ߔ1+JX:QF8 LVja칝 Xa DT54vI1 Ƈ}Ʈ\wO9 5p;3*#N>T^.]׶~ϕF$}`Zy$JI&u%Jkd UU֕UNd SRcL.@j;Zl}:2ct�D,afePkaf'i(i˾˨i"[+j*˔K\H*KwiJ"eUa%:ê~g[mL۵*e `ϲ-!]S'=!R`o7 ^Er?էÌD)eJ0I"wd5Gb#`y I0 h(3Rժ lފ9_VѝN3-[%Fk fTBSҤ ey=,[O( !YzTRdh&A4gt5,􌴿jyL˕N^gcQ@U4. ؼS7[0ޤKBJ*\ʕ֣0ih?SRꥤWbxc#bRw29L%\ieA$".i'0vLRBj¬%FתZ ېu]"\+Vw3B7; vm0@= Nu.۫{67ޢ&``;bE#'%KxgJD2xQ+7L$S gC%jI"kuz?̾%Ɇ>[�=gBU,1In=)Ak6"hhL,&.3z:[]e4 vJ+Ham�/wO%+ő�3�"uq*?M'k{ů⍳ȇuA\^_%<> O7nꔌEš\hq\B/l>lF~ y?ArhY{|4ο0[6$~A2VL]ad=E1Re.Z%dbDŽw+'H)̸[BO⡉%x}ˠXUW8$ lax4@D*x 4ѭV j_ѕxy_00 PU{xlgӨ몤( HXҒ"53  +\z*(.ȇՔı:<طo  PAK!H(|] |+TR7hVk�RpEPʚ2S}2ٲ%0XQ�(&V] =UXOkW[j_"߫"٤n= �6TsR5>MG:h:7Zv'B 9$cњE"rD@X;a`{"H RPptJvFr zt= % JNs d,B@~m�tWJ-;GD 4'cGn|N={<V[^{o6VD#E tPR|S~*ZAr5{@XM+&?|ٕaG{DĬ͒,a84_,Ѫ#b c8L՚LJ @d':\1}Ɩ ָHgo4@B9-p+4:?١GZj7ǚ@X̸f5gtrm؀\nh|Jo8)+tq)@ Ǻ177GD"ı�T@ ߿}hhXt~zz 8\p @PſDj�XA:t<&gٖIG %1ЍٯC~?D*操_c%Eu;7v ޣ5 PN̯W: XP"e.?E|w(wQ.ļ`?1 Y`A^ijwdŌ+]+hgf|U{.'*t/{S]0}:pkU2t\+lG}}گӸ. hs:@]cOQMu6kK靖trJ%*tꗫ^Ӂ[bGڅ]jFoXvf!HhWE]:-\kMVDܾ.9ţ-iSYfO9Y&]B ?._v"f-b\l@]nv,B^Z"M 2u;ۧ<QgCd;EhS-^J|>+\={5,Pe{R?軫YS2M)i@Qc6eD|m P% `M!}Ϫ}a+x5=#cyw(:#*$C*]%a~te$2y|ݩqmDz9iKBG'M0J+\O.({T{ _H~YҤ74Uȹꆎ><*y\jXl ȱ,-uWšN/b%,g-9Vo)R%[3scv-oL!msW� m_m'Ǝ{^쁚)Xv_Ba`-$"*\S^v*S5 u\Y1 Ybӷjϲ+o*6޵~h3|=JmZN?Xzg?M<NQ꯼D~'xx[Xr|,+)}{;Օڶ_T_V2bO߁[ci= ʄKWI!P `XBRڋ}Q.XB@ EhH'ND cH'ND c:H'ND H lj(@~" @ zk߾}D@ :9b0ZwZҏs5xUXӪ/^k5NcnnNw;-e ~||\giJjhs5Im� ?@@ ı@ E  giB+BV!tm=Uqt"XkrZ<lmjm k4X hJ`mlv3 aK4C#۩MuI~m.aɢA܅ jv{_m+ ӬYua75L<CÝeκֳϫTolZc*dS4Rο  :6L*C^ҹs= _WB+ѩ,Ӭ)uggU\ͶCKƿ [y'j7Dk< Zݒ/ƾ`Uʕ7C}f!7c^ٮ^Z5TTZO;WΚ:F}1k{>75[h#;K:ω]J~Hh<F,KW)̖"f A={Tj<ԣC#*/@;[./Ͻ;E,Cr:JN }:Cމ΢]-Y2fУUd R٪0{}*Rͤu,o\\I]<f B~Bk?3e7 Z;m^FJ 3]eU*n,YVQ&@HhzızSO$ʹ=HR E �b�� �IDAT[6{%<D+j$Ѱܳd moO=u'Gl@ =r}?:qჇ$B`imyɓ'=v 7,cQru';) Y ʟǮ5 R/ͩNjwH+H �q,@ "8@ 6ټ-d46ڒ }TLO[nWr#Dyvm X&/}Z.AJsѼ󼯻c|ugdmXtTk/5ɵ-ݮZޏ4OL~_-+Y&=!c]&0 צSR]yMu_nw\Ae^FCS-o{׺ ]kS];ŮڮZwЁ '`k�j~`Wmd"2+\oc~wXZOifUtWD'l\_־./fjaJy?n#ٻM/XUa 9jI5\]ky[!ϋբyvsW? ZPiJ/m7޺ޕѽ5c:at;ly{ɾVD' E?@@ ı@ E X@ "p_6OcpR1>>ާ-_S˩;ԝmoO=u'Gl@ =r~?:qჇkM  c߿B fλ/>uGe|�+z}_oXh~(/vӶ.vA?D)lv,Fω_'ZB`zeE)$ '$OCl 0V@)&? >HW(ًsR1מrfǍA:Ժ*Ԩa WEPIC䰆XqbodSbPY.mںhE^Hi:+&y*vSAQbژCGdʜ؊M}S5r#爋ͨHڦؽ3W_~mmwPM;W)Jqi]bΉobr[|7YcU] nMVqJ_ʮ)W'?PgGP< ʞ yeVLJ�umENq/j�%GC80$l[ih27XAQylYMQDT!(L̝.;ƂN(dO%% J1')ɞ&q {Ww$ @4/rB`ʒr VQAv>,*K0AL ᖔR& 0Jfi|Aύbn>^|@˲I|ɗ &I=-iO~|݉Qs/^rS2lX!'+,&W_V,v!IGiQ?r%bFL1>m| qb!c3ܖsͺROa*LR0Eeq8I񹒕7 OB$EtI8qWM;aة?tw՗đr v$| +HI)(heƱ-E}|WTy},@o)"P,ޞT ¨K`Ǫ`(Dls*ym@#lSJkt>BKcsLQQ[fUiI!ƜԺ ߖI  6jQYƼp,G46.ej+SʼQM Mq,M'fԒad4?{ө8%IvLF:! G"Dz6/4eћbCd;AHj7>JcG iCBsWMAg:}F .Cت*7EUb]-NcQP%#d"R~ڝ졞5TQ(]l ]I[9vM\41@VE$*Z2Y:N5Gg\�!R֚5e!Q>*Ϟb,Ӕ <ۡ\lbjRѶ9*P9ROAdXC+#^6%iDža毛$0)<,g\PNQ79}9L ZT%~+,֦D@TIͫkr\ITz>Ч }7'VNF#E_# "">%N ފ jGx_)yP 02p\t"JȹqzK̓q[ln"%&t 9Qy)Z8tЭ`KBE<io<4jDq"LiDnh8ͳK<!+f f959.Oze.^3rFkSdػGN^:S™_JFzyRl;GI평8E™A@dVD>$T5JW6UnloJB/D*&Uf7).xBmb =˚1jb!mGAEgp0TTsEpy+t<d:ߩcOeYtM{VE_*uOSIDAͰvcRE.l.{\МT^Ove0vcS|E#\䒎}(}VkmFNFxۢqEixV3BGaM]<L9#rPwNud*[c9tsa3UfN>|-yȗa+S=8HYl*Bv�DU3Ǻ9cUR C 8"o<[$n߃ŵh*T V gBBUuI}^Oqcd�cO1~>3vcdg,d}UT;*.iUpTCM"#t1.Ŧ˜`:Y!g|sGUv֌B9"'tq1CB5D"\-S`?IXDw|GI@Dudţ*q�!ڪaLrjbGF&a"Zi"ITcd�;XJ1A(-d({Ӂ$xǕ`JgA1Eʟ*�"6s|_Ӆ h!ba�0ـ�G ]s�g��8��f'�"^ `'@#+02INdN&.5 C `߫L8X`�3 6 X4ae6({u!;SWzoL[%dSeՀ$K$2fOulVÛj*�e 1<GpQgپX e+.wxl/U.]C 'L9&ԃEP_W,*Sחg)_5j�VM:"xU Z5ԁ.-�¯=KR~,}tڪY>veTй/riPt.6A$ϥ\I"k޴3v_"KUq%DXal*~a>+vCssV` 6Ĉht0˜jB D:LJzwTs!gDׇٺ|1p!*gX(vzI\ E4plKDØW% #Œ֑"tD"y36b"J}`v `;l%=-#i֓u[Pzei½B_tK>42;8S95~3g!f*ƦpVJr}Ai]WӢcXzMs\ p"CJ$Ā >kڇB9 vH=ѻз>x%1!V2䘥{SڸDHk^ObDGfiH:^$m WZardi[}<:C; .zQ;G&+ j0ky_&5H[f 2ԒMx]kVBg іsҒ]eP K\AdE%m]'_JJd5ZZ邦bSP �S\8},9#�O �� �| n�e]EdّT j7"CJu+J-i*~}$'2q 5 0 4-),I^XIk@KG'bkJMrT[�oq. h5AJpĔ � i�4N1Ŧ q!0 A>t<�e`vJMrU`guY9*R#U{G5Si@LO/̈́vE:PRJU�VFb{5QcaEӢ oYY</<vrۻ%y6*S]vNcg׵2j8WAK[D4WJJpĜ8⁆^T@`g{{wd0VHB~Ʀ8LSVgy0�3ՐqN]Vp1ۙ0œ#,HႨFB)rZJ9*X PTi~#urtJ4zt5H'!̷51|>R܂LisD|-g:`O`$nDZi2頞2skQD6;/a6qx;ӃUK1ڋ᡹A@J,ω yaLʬl0iEU!*L@&b~+K' <>Iɓ6�x�lxa7"N%9r5?紵̹SMNٓE<Q1*P97LKRSus4<^>RN!w~qY$~f+w\<b'Y2kqh"2窎]Ao\+*;V}rNjrHbb (%Ս4/ddT/ )ethY}Aю4o[Ww(j80͟9|`\0".3vs =2dq59&斪ux긂:n-;q>3Y-*ףL*4yY%f4L.4H 7]景ؑO ,]OG` `I3�� 1�F3�K�G(,*_YW$ZX5'i>]*re7^%$+8\J#݃Y´[%i fvJA;.#f\TJ_U_âݭnikaTu[j hp>TJ2nPjm7QkMR %zwsJ4vW2EEDZKٮ-J^ռÓ%Դj|]c2d:UO^ҶV_NHtD{Q{>r~C= 61RřJH9ق]ÖQF[sS!ک;ۘdhz<5%]פd(tA7V|;#zG+ɚrbLp_�X`S���G�vܙPX�y0[ >5}cwx &SJ o$Sn'c_C6[2jt8bB4sqDPA ȺrRչ j$JY ̧W*<@8:6gj|!O*"OPW fb֊j#*y`븪@C9#dWMlnf >`Jzsx,TN%YӄˎYTwR\9FY Ӽq]Yu%zh|1U4K;KɉLb$W,*,9AR<4dڑ (՝ו5{@jF;x]2C)/8}2E؂32HC=[Վ+]A<c^Qc7-8ҋ! L6�^Eu ]p9^CJ'VnՊ4 FW Fn4] MRA A͈ci 1ȶau˜_+5#{h14Sğ!wܵqjThkX5봕=H0*IU!aZI'ͺ0vP2إ#,vhն-wՅ5l?5Co. {LѤ7s9#$+R{+LP:z�ZUKhʜp�w<wBGaQXr,;:c]"*c>^e㱲lÿf s"R8ea-kxfC&!L!ȗƮxfX4v X')|Z0W$~~MG8pff7摣3UФDk7`9@T "GLHyr+= A/x'8�cCAGw9@:@"1yz,/1SnJ˺5.dr6S17T^jfCgEǜkCtUbu:Zf,2 h�rNdqw]m/MHF8\as^~4Gjlk!?mrt !VÌX`KHԋ|H*0x"| 8 yG�Tb}z:x-�O^T�$|QNUW5=dn'Luc qVo"~J_URlI?Tu4׏ftPg`MULz.941Cj{[,i_TNMF<VIH )m˽/UOF,a˰BRƦ`P`%SKQ-)&n2Ux^,jk2&ELU)(6;%9Y:in Xγ(ꅡOt@eeͬ_{u{\Q'=B۔_Ƙv6lOtLJ0ۖCŦ=뤮 s0<ޤI�4N�,k�n �o�x#��nef ]wH׼ʭ#Gq Bkx` _Rr 2܎ ��GDAQB=Z4\j%}jLMnRwoH~VF4dÊsXe݃ ޘّia$<4z̯ptձ>"{0vՑ^$_Hz C+BU7;vB]bFũ>cd2)gN9JlUs3L�S=mZ&V1lRTe "Y/^4 -Pht*jc@[^ߍEErexpgj>PfE̘WPݽrkjL~WI>^S��7,\f1�\ %�l{`z AV`Lc6 ^`�Նuyu ? <$޹y]tu;0ro-jv`y0c6QU¡TxK�UrBuKCjkT%FPlhkQ6 _Di _fH!%ӅPy|B7d#EYmhrc<\Ddj4oBi!GxoȢklru]K* q\F22< 0 ĺ{L{}|yIlv e_׶N2YUoKu6A-=٭OEXsߤ >ƾXXs\=;},{UC140DkSj V�� �IDATV"˳#Ky#RO`s�]0W@GTLzR N7 �,+\sLMNOeEM[<9#%C<f_�ľK*d#9=U[TVk÷I_9=%&}|"fs%; HdC*iͩ$IS5?zFq%5jU^xPxDIjQvce쓌}Ru A!|21~;5Hmxpy4InVҖ#.M2t&FGBk@򇖽G 9+HZZ毨7"]{ /! X)ɵSS+U@й2! T!F@U2 p q92 4OS%%E]u1!潑uוlB,�,)?Mmr%�<f%ψΨ{t)D(up')U$, Rnvq*&O}+ wA0�C�� o�>i ��X{�*��=<GʄyMYUR%i^d$6_/7T>յpS|n/Q3 (դ%\-nS䑼E: 24ݤi >2_F#M"GQ]&Б!@o,qE$jnQœT)[SSF)WjE-iܭ[kfV 'hpWn+I/@kMT%a]02|2vH%ީ9UAb?[UjpjQO)k!Cϯ3t)[~^x#3 sM3Q/ۨ0<rb Ic:RjN=UUq�L_*$"]ݔmurcwo$=Dx%PXCZ2a. j+[R ٲ-=q55#<$T>j T|"Tt}NbHJZL~9ġ2ay3Iew 4S#bBc4PX6vV'@)*ȣwGj?Pd9)yפ@GEuP8-*șJ~?CiI`ʤҵтkz<xHJ]*̂( E6}"I"&OxֺégQɼ<"̃\`HO]Uk%0[Ԓ&*AAH<lEg!m``d5eJ" W))8uũ(i<GLCE^Kwr-ZrтpLHJ9R DnYrg� 1IXA�{gyH͘jVJLa[3hNc|& ᐎ=WF;x) )!RS-Cƞz"cGOOqhE6h2HS=^ ؐT�g 'ل"rUDV|et˶m1SFeP=_5lZBD"A}LY#먮z!JP 7G!ÅF06?k"tl-#ZuB_.U4{K1jKby^v~JB->.A&SW�V:;KQ8~d Mw;tsGN]74= >�3GG!j.)R*'ъxw*pB졜h"l :7*x&)>hwE*P_Vj+V 8+ksZ_%�ή t�9X]kA>弐qYbOJoBbuIB_� uSKfܲu2h3nS(6%zAђfṆNaWun]\@j(QmDʤ*ITyjT1|LZǎzN6ɷ('1/: )Q_R~41)/Z3jҪ&ʤsLCUרOLO)Z:=kTuLiTʚ.WgCUe@tԦܢ^¸ V-q{b(jY$26C8]A;VفHB\ET@恺 EPI ]j)iB͞a`$1(aDЇebf/6|Zn)QcDahNU+Oܩ�PY.Ȓ%yD75 \ҝiSD4 ;UmֺiflW]$m "�Z5f4TX 4*8:]Lq0]_^8%¥d_0n3)t^-0Ț.<H`ҤǺy$<t/:D.^Zij )aU1MO6 ]5rחLjl>|ƸKJsy("j9}tC% *FG9H5"YW-#M`Qj?)AA_j:[b@qaWOuu0+.3T6MYS=fgH*D깾γaVԤV#r$#*'rC vXERL#(HAPPe)s1Z'+rè+7`~%+ᕌJʼ-'CF A$iUkI %)e0 yHL]q]Ym'D&0!kjIsmV*cPԝBʪLoY QHR@6bXԱ5{ah $RC<Gdd'޵r5U|2O`hK*{NV,JЊ,ѫgev6j.&nk[U e帰 YA[f kg 󲢸C&jQQ]!rAaZGY/x1¹NH.iPerd)"e I]VUgH#]|5DO9EXKFφ,g)pQ9*[vF5HC]_}"RYf D\Qr2.+RMJ7<{t3r.I5$-d=Af;6$.6)*ҬcyZHjN vባB=j7gvS_qWy1jJTU|$#.gG,mE&Р ŲSڕ3Gǣ]5P " X!v(#|w]G[ 1tF!ߠ% hC`n;sF N  bzuZKSsK^"cܾ M(IJ<k2Q:EVYu[9djU�_X%$2! t9;)pG`B_{|FZXOQ>0$gv0) 4E7e1#`H$e C ޖ:*ac0ОXuZ2�&aD>&{GD)&j<i5K-8+C=(Ovy-DR`d80ᨐ۔3s 7`'+X`-`974t"g+@N8*9,A'4^) k|DAuS&TE#5^وqP=z<v=FGqLva+b`mBɵp'YH8/7f(# vyJdPŸ;rHhɑ*@a"Owܞ9ragOZC9 \|'7'>�/,useW"d?m 38*LV"I?;G֨=;{nb34f/6)|Z[�Wǹb(1"?Q n:O8Cq.8eD<j~G# A|s4=@ô̊yg|׈b#t\;N.4sm,yd@KU@֯ʶDV?t;$9T돶|ch,O[*1*K6ipkҰ3b=V4 뿾WoƜN@S- h<�/Hp 6F'!߈Y ugpĂȚ/E:Alg`y $nC>TܷD(_ຐg}bP.m ro0Ubع)XRPo~p%EO@]D5<ܚvi/$Q""ޱJ'#",VؓO#b� BJS4fK6 g; 7zA+ڠ4UԴՇL9 ߶ ~R4Oz\pWo<ay57{Iŵ"g q:7+U/g'ћ0-OE@Ps5o$I[;hg]ԵIpS ~T厹H,{ٳ'm/G8vTjWaV+}G_sĿUł&'֟ꩩV$J O1a.ܹa'c~jB՚T`d$P+Ͻ4rC߹OʢO} y.!*yxҾϯK2Xm$[@WS4k<0MmBD`6ПRDK;+?KMd$]i[4?S6}p\*ɯpxpԗ9"MZA',\%deBZy� RlE-1)av/6Kt2p/1 }dԏլ�9JWQ{paoV`CF@vc#~=lFjl'6s]``.|CJp<NO87qJmpe9Pc�tà1UZg^PFH md� )1*f=qDh gK<.[)cfrH1G.X`)DP]cF>۬#iK oG&r$p vWbv\FYpkٴw]�WL9hR ilkeCg;N"o@[c} |=A²y<Je-9 `8ܦ=# yHXŪSa zN;o&K.L>bbF$ v!ʵcM�{_#}FǫAh5?ީ:81cљD8]ȧ"�c$w!E cƁFc*q53u:_o|l[ dW"'jRv ~”ِ"b20{Q` r["!?E� xY�…+er^ A(cP 蚼�e08mBGFI=J{4[kjޮ0V3oL^?*Mt$cvC:"^%U9༾n-*J_NT9EL.Mc~AѦ&w!&T鰂D/o݆²2.@ަÓRisnWHh*x&$4 MD]ϫ(y]_R6]`X*UDjnVIyvDu\5al a]iM iOUrm,v+?Nmy؍Y | ϫEcA0YakΫV*DD[(׆]:OB>*w2 RtwXnU)^ņZ`5H%=$XZпG0)6(c@fcdQ&A%hT�=mz@_Cſ+ # s!`:8NZvPf^p3dh3!V˩hRY/*$V˱n.\Cx(-BNꢶ#e(&\gqkm7nnH>nFZȵ cVj^GR"/c9-odd8/L6-sW^UN-X-T]Jr^]ɓ8้  H6Sg%~޿UtCƫđO5' h$,E� i!Ć3"On3\kwMB`vun~qsNߤNBHU)7Q`51d x@I`#>(G# ? Dp3&l!lW]nVoSlaQvIxL.;!̋7icH1/cP n&CnIg�l#'Lje (u-^GAvJu`JAHvLxSWu9a7f'e pfopttj>ƪODsbtBvA]P̽m{YglP 0#MTsv5J]sՆ&ZUK[h|"&pߏ5qљ/ns?d-Łvv~.VQ<&^?2Mm6'ЮHD{gcL: Jm̕Kޢ= _fJFAs}Itl -Ep/ MKُY-E_t=9&qvnqiV˟ﷶ>kfۼPƭ|U}ZzGQQݔ-YHYʋWٱ%][h:(jyxZkwtt܋;? }iCyDyG�H:oI{*XN! KHWHN"C"Wϻ5;[IfC㮦#(ZPW5.E8"ZXpD+'ԟ̠2?(O0"(jyu52꤅D,,жD.f bV&4xԵ239k`A lt>c{DG3g/csS"3 � Jxlcq]Ϫ+]V|`W;I5nkC>cj*1$sVx΋x};P @nEh3 vyp/O_R"Hqu2m'gtul! 1RgO8-$)n>kcсh1p!s|ةw$Q^:LQ 2Ps42r)P&"s'>yPV#.gV#;wʃuMYMq0̀L0Q8I2'5ń¤͵+53�KZ6"!Y:PF3V'2s޼d :`{՛"l>b|/r( 1oP'O3 r, EA]\쮭t ɧpY-;Z fnEbet̳v-VHN#A$m=mʯRuq�^Y<H͒X>IeA$$E6bݛ5VG (*z;G<eȐlӛA0*>`7|D=!o <px8q:u!6B>nN}Fɽ[l :>ba}cG5܈"J]1‘GbT|OU5I6ihg0ł&;zo:K\ +5pb̛g(nJ?�P=q<a�d$pt;+ϫf:+xWPd,/t|,%4^a0V~ϡ"8VX&4F'=<G`> @F\D˧]>~<n|ZHa*2S) {is�O_psJ}+_~>+N A'>+x-t#GmT'ds4%k9ںJg!|NDgQRZ q9p+6)V h]%{5H@IԜxq Vbɱ0_˿.X-xΪoo$&U�� �IDAT0GKj+_@J3u}(>˳\СQʖ=Gzve}6?.;Yӧb5F\2h"EnRv` =*,vɄ^;e y|?h6ҷƉ[G[aVQ'Y9r!6 "px^iCӕ  i aS38|`W:^?uϭq-te|.m*E~^sݠ jᅝÛVH,S oΆ)A@:({ ۂ@\0Y wMG~p;` tppク9J [c1nG|#z<^_x dL;a|JhӅuпx!y ;Y:@SP<mכP)Qv1c"o4=M;JѠp⨈0cTrϝu`yKyv 0$Jd-#XA>SWC}7{-;qc'yǕO,Iao"o Ca1΀4YXc"o%`X 8(|)+Qmp\f(D@ Pҽ J+qV)RUF4=((G83f%ƥ'M&;BSP8)Ꮳ8kPi )@8.:~;Mh; 5 .3 V]c@tdxȊ)Fcd\-l9!j6W4d"21j rbk3 ܥ1^Q%Ho);[-8,j_TbO�#D@>Ch@-…j\iܝ|Ⱦ 1Dmd<Tth?'vRpP>~ hz llt=`?>9j=-}<`em( mUǫ z*)krLO#aTEAфz 3&(;Dd-}F!@(^<L<$4t%}N'[ <Q`1֖%,chF)z0Qx6M8'Y4̌dJ�buh`?Ebh3#e5; 5ܼHP]mc9E}(P1 0Z^<yFvwQ[섓'O Jɢ-82"-(?۴"c xjmo&vp*qF-ƻ7杣SC9c7Z> ^(VNCʨRչz:vZ2з0PZ]c \.T@UUʏcuU0]LWr.rFGi$U{W@�= ?|UH/h[/{BFZ8ܤr"5{&XVJ|*nd+[@JT7԰ڊQl7^V9^|keՐ"sC~^1>N λ`_.Hsl.vMbtDY+ˉ4Z(<[7m97wH>N*UeIn)p\u{^aJq,Vܧvwrsnqt]S}XV޹m#3̍Ҷ3Rcm6jtdg%mq`#6 ޔw( C W@A#܄Ny`8aV%Pٶ{}Uŝ[g_!|fƌoUP�8( F!z[uXj8 JU3JlS%5e]TNMm]&e#1k c( l|5B3K}6Y h kh 4m t {{΄HKH dsÀy{]8 JBw#sj@ROw"!·8~223�nD ųg+& PA*=hR\a5j{BgppT@.7䐠9#m@gijc5DMtCS7"1B+11[_Γ"̰aq, υCt=3{\F5m2Z򛣝&fwp9>:P@Fǃ"٭0T2:v$6qK(p<qtpž%2ZP: >?d%e _B0A2OTeŷ ؅ѽ9a{ ȽpAh iayKx"A,:Հ'cw0C{�O\ ˮ_)t!cugG4RXV@1Û؎!gtf\Ek}#BvyFc;܇oNJF,75ܻv0:ݹΆ:H%OuTKj94o0¨"j) 9^-H'Hك ,jAÎaFʇ42n{X,dcGkfod;~U@YR"7o",Hs;d_ݻ JjwzvXr6~.a/& #MA ԗx+ȸT态;!(* 6EڠbywO=3cB\Ȅ͸5݇]D4`6,wO![d$c˨ǡ>!Ŗ%^*"ۑ/KV3f-&}L¹! <l14r<#mj蛅` hSdF$#8/ˋ9E3~'p9%q`$[lwrv vvH@z~s)^j@[KxS\+sE4]x!�h 9A d3,¹\t= DL� Еٳv)CE&#+[3]r˘,I[4ƃ7UpWnMA>fG<u#fױ^}l!0iD E( NH']t `& U'F 271@ ʮ%g=C'IX9a@v(KL pe]`#aG 3jvCA x k<r+&r-nogT߅ ꉗoz3Dx(Pzl>6G}AH o#RR@2+{STYFLxނ00%gb3oѰTb=ˁ{Os�B7G pHhph(bPy=uLnrvH BPʽ<5Yara މ)`OY85̄>b2]^*ȁMPӜѷRCv`pM{A#"1Lx m$+;9)q<;d<O1g4= et׈ B *(7R~!0n{SLv><T:*28Ft4"]{CtfLA]x p9q RGu!a ۤ }LWpf[#3o:lN],TGl8{1zʼ'@]A\ŚdH6<T[G'ö&"�QMM›k@rc`�@ДaL=; O%7݄:ŰOtdu$p]12*rV;Ķ5K0z`!f4(A %=!'p4;X%n6|Ac R(?@Ӫvm? i0P "J"h]JJT/%Nҍ [$B:<U2wVV;H <bZۥb1C[ rzf຅2 =PY5:E^4~ >uRȶ1?$ xtGjDT9f,3htZ  og $ dTۇ NJk;x<Ms/ 1-ژɪQjg`d Vr,񰋅9b3,$�= jv7ӈ.L$&;6&$;(MIƏc8 ~d= vf 6$Tp^T0 VJ4s{arz| n#vsm$K@J VX1*Э/ 5V%  �!tdn?WzvcJ㥫lvшgz׍e=d<I"gbxqdqN wIO.}ADO:Q#+/5b/IU422yfAQ? J֜bzzpW4-,#Ĺh ANgx{ɿЛkCS( P^ئh!*_1}J׀ͺURF�J\xi &p “Qa}V*)g�JRvS~U8jM12M_X]R,d1~l&"c3= {F|XqіM9\E>!xfjM 4A& ` Q/re$x `Gk+A`D+9 xmB,[o%b QY M `L F4# ?c&Y  WgΚ <g>54}%ASxq;-h+`>@İ@�pcS`W !٢|A!٩>Dwo< }?4rK0+kUr.Y`a�8=i&% To a= ": #'IHx2"o0^r%kz;L %95wYmv Ccmϊ:@:q{60~f8vPFBBIu4Z{$;]0U2C͝RL X ka7;pRWuM=[5ﺂ-"K 4R-D]|y%�tPL/|XrPe 0gg [Fg&$y B"w˾sk==>ll{bg 6<lq  WzգG%=I10٧� fN8t;>~4CR֋ЕcQL^2ۓI*N`|;2p.ʁMX!QI(Ff ֯�t<[hFE:RX02: A>9%FX|bqBp6Au*8+ _2F z6F001Nd'60G=)77;!{,b93 ByJm#!7<N:. E`D.<t20zW8 `McH/b< 3,2a@`tMc= >3vvr~  ,<p}6/¨=&BȎp%- BrT;r9.EIH4Y kfxFe L`# 3rEp'd[ @y9G 4e 60I|oN:MA 3F 6uK |)͛Wt4 > ':|s{%__᳽袏d^. _9s{wk(oνQy�7.\vy#:"W:<0-iGr^׫:[˝+i9�zV8鳾?L4Z ,Jtn^P+^pɫΦ3}x*GX?XOdJ/KheU=MD7'ODO]3DW:|u:uOD7"rTD'&X.N]z麮.F/f_7XuYWDNMrM-5=8.OzT<n0f,K\ k#i,-2,/;rDNm_~+7u} u<\粨z8wOS[̣<Mt;4e=�KF7`uny#lKBa),;`-hKX T1N'jat#M8:((fGj n `oW0ejܨ66ۆOPU*-xR1vu!3ϋGTCF{tyx{t�MJh\%{wwR4 e{(|VkcvVrovmK6Oh�ֱtgR`$Ngm)aVn@刑, %[n)'~ 3JR5R$9XohR Ͻ@z :lF39|.[Q/<pTjO 9AO9dlԸc811PY챌(zx !m6{;:R-_Mmܭy�-:r~6{6c@m]R'96 �e9vzٵF}RBv0w;1oT7y [(N{hnXccOk9n8 "! a]b1GOENײ3 bNn$jaT`i22~T(�N97t:/ſ7?k{Hf0:VK{}uUBfQRq x &/.q+6گ/Mm>^e9:em~iY+a\iJp:j1sY͖Oj.^L|x8ANmYgu^+.Dr<n ^IuyPH_7O/,8f둫玉Ffi`5Ǭ֛;/˷aWqGCQnν\.'^.ywjSrZZn9ٶܢWόx?\.(a{q#_W>no?{HkH>i#;^[l[i0>yUnaT[/BȔ >@uYL'Bt5.k[^=<ܦjD=/L IywWd;$AfGH(i 4Lh !,*x1Z{)UUr堛 <U} VZf؇čhV(UW/ x4*lҏ,( M bwyH{,;CTCD=M@o0Dt3ɪ#PuE.D Qq8b=gȯ,_oFHqwAWWaFJ!ZX*1q;|/iD= "Z_D$YFN's}t{5.ִ.7cp̯a;Ŕ\nsO6(os:;p/xgƠdW恟 Nm%{iȎقf.Hf_m-x򂥭qloYu[ r+vYu >JOv_,'}ld>-]&<QoW~i%�PD'e* &}z 'T~jM* ODݳm]VքQ3]�冖3;ⱚ#* mS~3li-7͠*{V YR]V~v*^V�� �IDAT\i_Zx(˩,Ouj gqc9e}S :ˑÞA"lC xQ.٬1G00:ɧp.<" HIX&SJh2ej61*-Xz \*E0>Q -uk{MB8<e*afK\Fkl(l#˅z-P26OZcLqA?z< ,W.gT wxe U񼮁vm?]yM{&="E6D*$V[}j^ UoQ =hXɓj!+ܵ"'~ߤ6,0qW *х֤wԩe]]O}8ܖK ?-\ntӟcKHJ=Ozw#q^˫`le̐h?{ec4Mj+ShٱDθ}Ɂe  +0 6!&$sx.Xw*,C TEŒĦLDÕIR g; 8p|HJYp:lR/j!I' \Րϋ~yWgN@Qt_]?p/.́xӍ*6k$E,eZ;b&Yl#MSdA O9s(n:D=A?\^TN4=td m>$DO�D]Gw*`/lyrtaXg49vlOXcy%qȌ�9 !AȊ;Qo<Rb2E\?�G5:tlS7lڲȑ�2P ,ag;Fȁ8; o+4p]n(Ur@q# Z,IڷOzo57> Q]p�! Q̋o [gQ AK!Eӑbꟁ2.%Әi:z>asQX94U(i/1XD߷Jt]aǝ[,qL{f34Cm+00_؋˭HQ[p¢NA#fKDLp#uϱ[C,x7jpUƪ%k UcՒ‡ך"5}ևMHnj|E%pzp&7DV^?(9 h0*h2V5ERA x Qvl8ޤ%nI KqZ^a lpe-a+"TS*SzeffcH0`'čL V/JZ0B&!SOc'$aUǺ,a}6wLḋUZ_Sj#kOxp; #E*0~i;fx6m T3!vp2/r`� =7-n$T2a^h.oF0޾j=ĉIf[`nl!3Faq,Sap#2/{`~Y$ Y{d�Dld1~ Ftɭm8:6B}M`�NltebXz>f\M=px=鋼@(K)SX>渐}q4-!E$Dtlo*T{5jVkؖ L6Mqsk#߶CSW/& [_g z +2̨(Sh8²TxϺX>ۼzT5wgq`.5^bٌ[QuZzAxY a&lD\5^_=,o?HMPeeo;ܰvYz&E<| ?hūQRƓ-$*w.$!=cSP?TɪdȖ/}/rb[I@*ia" 8խJGu$?L;u5Vva1*7k#nfq? iD4%)JR*Gm!TU%CobtsDr-om#爵]lj'e G(eK}^IhXyݹr}gq,׭q |M+2?*Z*�ukrVa@<۶.vy_K�q/Oz+U1s_-OB=h�i 6`b>]}fqu$hy$]'ՆN|%'6?W>R$*Tn7nmTIS *iu%S+?7g VO~_'Z鴕I*122MMD@r~j>"yǭ[XBmql&~v\[as]e[˲[Bʡ1QCUy=*Psq}n⣊whh|Vh~[R/gx[s(6R&pZYŶyTcxt~,+ƕv]J.  US{Hڑ\姱JfEԭRL9 'JNFAzk%8 oat1~r7sm2 ٤v.QyvO� WyTl'Q#M~Ȭ@9E뛞&M 5~M>U2-Y>|}}Y'nͤ[ֶՑҡUD8Uɳ*pTݾ[yM>UB麞׵M Pj+>9"Im㛄s𮗨Xn'NZ󬚊mﻔ XHDRlZ5$Jyjʵ &iuk/We9jNVݹEƩ}ZJH#u$zTUC K!ToYz~ 75zİN[l"2ͦ-}4<>h"Q* #mxE=aPbS5f| =s� 4 ?s=ZW2l#uMQăIF,hdhHFгm7�3ӣh:#D x2x14N2l2߲[C,48sA Q8޺ߏDڬ6ҋӱL$r<A<OU (/&-1qǡpvaFy"]DjɄ6AFܣXa�[ O(c+aӃA"#f`ه Kee#cW;8Ȉ@5v)q} >qv2׏؈<6mPa=:Q->W]"N{`j_ K% LvHϮ�WӉaЁ5`>:iYM| ВQSArW~Ӈ:.OPjk�Л M`"$*oXҧ '.ԶD $а "}l#YF ?OLo$l�`c boIE!j;v&FpoŶl DxL>VFc(л$(2/ %fJ>3b ݈5#e&N֓#-Y+ېearጁN2`%QUpvXEbtXͫ?S`ˁpz"6!tـqh1&UyΡYF~~_oG"o(>Ҿ&T `䮗n;vP$XH`jTn'b7S" wrh!bD3,\~PQTQ @�|+2>Ʃg\Rv!V_$bikrc�'CfB6!/t)|BՍȠixf[#MQf\!y1pf<li.1.܎50CL.`RҥIGslgqPr}*27şUZA"@2IyVm \@]vI Qn k-P4 2flV3-*@O֡ݩUGW<aHE5<+++Z{`b_@Vϋ^1ۤj[<45BX%= ~B{áC4l~DV.fՒ_=$iVP#H=ѡm ެʚOea'vi۹|ە,^n~x9 ߷ۘՃF/] D/o֌ב^[Cem'$/㼅jA-}Z`q%]ߠOknt orp C.lQ`޼/lctX2]nl!gr(_1od: fDDjZd4砅GNg|AV堤R3 :@7ţʌ|CQeg8%q 7J*R+r#ƕm ݀0:U7R#9l�!"m<Of$$e�Ivx� �mYon1m � {Fe<lC"}0`$+ch?vw{3>JO=+Nh 8ˀdfc13iU7cGcklzoI*P>i,buEB=B#&DpґGw‘G'fcCQ3^ ˨Js)~/lNu])l>l�܆U[3 PI'ByNQ&umlt!)c?8Ƚ$ N۸h\M."s 1Q�uZ |A98Z)f>Q=#e %BQcNcr`<kg+>juRzlIS= f*02+cĨ 8k)W] *nWg<b_vLbXr.1óh/BM=t\5 _GD|LM@MFH(ΤJW*%>CQ"X׭FS$yRUhQ)r;׀ ,_~$: n'u2Or[qӟS 8WnoRdGUegYtȽhPayVL]OM[%l*}麪krm8Y9Tn\UZ(, lѬymjs,mG8}ȑFxx3E-2N{O9b ؝윶5<8Mjbn.Z~UL>rCȂՌPߠ6朂ER<1r3f~5&k2(H/�2` A ` &dO#kYϽǦ#҆\dIMnÜ_rWFoQGѶIM>6mX00�$qfkW] ~njU2)rjRԊ yU8PrQ _PyK\igQdLPmM>7 b׎ L*VY2eR܁3(ݿ&M/' "-˪JߚxWڑxeioKr$g>p8轔UxAi<cE uIoj?}{UkUCҠy]Ӣ\BOhZAIJ:ŋDJnsN %f*y",n-#_ kی޿CT+NY}t%)Yo@n`yhz$ m/lBNjMވ "Ԇ<qGS^o STbxsy9Q'(0ŘU[P!м,]TzetWsƲO8`e=b)=ɫ pb<�xM'(6H# IU5?R—b'١ZU%)_l%S#gnx*@JV\^>m gy.&QMɊǟ9 8>{?E߲цeW5~h-~ Vȼ&UM'kzJ[BI;3)d'ؚ9'|ܖ>  + smU(:UD|nu ʁ} Л aoaԘ7+*HƗ*yDjuY?5,<Y7V�YQ*C-8^K*ݪxڒh]PhZM?6MnKj!6)&UP÷&='WG+stjfZ+ZJ:+-Tr'uǟEv}:kg..oe~Cu9F,9S@{c Ag԰3[11 :|_\hgh=y0T{7՛20Cj/PЕҢK}(J�,+pK޿+Þ$[1wnF{T:]]%T7_/}i[,zK+Dkr-[`P`+8S, G¦um}I%!(@ʑĹYTB"YbMn%þTVǐŘjЬM Zf!*Q]򘧕^ĬvŰr+[%7TTj\l K8ۺJ$ru.0|E{\6Qvn"DSLk#' ~}TU|qh˧C - j=Lv4beqՒ]UѨVnʦ'|{&BVŤEFmd5Z98DSdaߥ|'ӭ\DO%r r<Nz'WJ"aտ>urs3\q~n Ńq4l.ԓu El"<nI;5?*Mf^GKq1^ g̨1^o٧7Ywdsqt?<y"|^Ka\=}mNܧF(ku+ s9-rlO볖uĶ}[Ѷ&QakhNm-5)TDkxwO鞾M,-^`M7 WD;Rw0b2!C8.̾xf (P.xui%L�ԲgFP:mpŠ8:T~+n&s3Ozd/uj%ӑU=S'RU7�㝶|8}L6qF"@]‚>Y3YrXvc! [T(n~AQ;g$Z$P 47K#Zv_Qc 6| :3 (kҾ@QeLB"c>FJCI"c2+=Wqjuq2(Ucg_:몁)[KZZ,)wY_G9qmmsBy7G<|3B07U*)ZW*~37bɾuokjG(wJTj6icmjrO[WE86imjw麏\s*V[6S3{ycwN* .]J4Lzꦛ>5 oVS[mӄky}9?"'D:pJ mҭ-y+'�7$<ZTnP'ß{$wMRfDcY)Ajdrl=53; ~~�� �IDAT8 oLkx3Z/ AJ"E.PdCB)4;t47,*Hf"U0 `Ȉ;eQuf^& 75Ҟxh`J+_"R{uۃ& xЌ˴:ftQ+SY| =au݇^_Q('TmFldÂoלAK sT`P"p:H(pB+K",aDgB]t%8QǃXi2T#h)}uیr>٥A2нgO'@PR^])CwFdʺt\݊lYwDi'١$gɡN iWѶ9ʣ-%ƐDQǰa0ή'D!P}xK' d=)e$b׌R/U9MQ:J:qN9jzc-sv \+53KuZasz cea=|�fT0~NMK2pȗG?@}{:EHWRpoU@�t8NbdAK]_:*_ysD}3c{찚v="h݀2h מl`y'H2`�ohK//WmesUD]1g�WNsp">,4>f 9sE`3 ڕ 6*aCX&QI6l6,lU} b#FvɎ7ю&<ϻ ]_axW)݃푱KFmnFI.o\%@ZN"3lM (׆j YIPF}H m1֝"ىG$  QKS;ތB-cZ r`d㺵{f (~5k8x9YBBϨ ԸINķy R4o콑vWpoM04`+ #-vh7M27Piu~|%]DW3-/ƪH2z ON H䒪5sȻE2Db;xE#`KW6S<bTЁ@vFɤGhu``0+(``< "B1&_!wZȯX:""<Ih7i wA2 L2]2UǥGeP~| ׿Uo8}' r-,./ OJ֧ ȷཛ=ZM-=r&8—ˍ.ݡVJokݖIk%Q (,[7%`9wc4L#-.M 'Ƃ~B$`P[vcgH[$񨳢�KR(2/ jDk3,++Be8=h'GW09No)r,h�W 8{dӪΏ^4sʪxݓ}!ەW^+$b-D_~kL\^Qm i Z5s6.&}mJ9p+I $; @2'Oz4PhUgf:+gvvWo,C>IGZ-&^B6cyKqi ;7F]~Ws[-]iL@IHWϽʠQF1粊4^41 Bo?N~ߪ�Jl\N:,7ǶjU^Nջ_,jhhK5"kZŸ+*A tQHpEAl޶0ҷRozVeV,n �edW6 " bxQm:܁m}evRuCE}.}3T^G,^p1J:վ*T9'>[iF2PD^v~#Rbjچ\؎KV1z@/:�YSXAڔ\}p)A 6y%`?qv f`Bf wRb/r0@2n)Cv5d"H/z(!8~ ذubGnhIf1`G Jlǟ"+:֙ F@A -Yr>3HVv^öj،G6ޏE7)`KXW?5iR q2:71+PX6a ٔAa٦zλ:S㎮YI> ).)^3i`�ṡ5VӚk^Z%sS~QΫvۼzE Do&+{lRU$1 ؏}}c^s?.]v�SS:FJkZ<X sr湔}f^17^h^ͺ{m-n=tľQ¨>v&uru2W>YHEkƫ<r[IVݶ8uY;cȴ3EZZ Gu6j87ih ><~O3@^ly8n+Vq3{/#t!{RrW�3谕)(eˠE *!O<D�;@[ 2YB9 o f}QAh]% 7A#`!JT,oWdOa s dc{",llJ90;]*2�5)8D ԗv7qq!m4h4w>mp47FKtťaupxHbp(]'QfJf@>!Njwجp+AJ@:ljHB*%,Y`DӮ-7O"C+bfYkDXecn(3Ѝh=;\%9V!�!{6I+9+wV[˖0ŭUEM ~ J:L4ʑ)AmC! {+h4rnV, #Hqީޜcvɍy5MS:`Awz>H}c/`v79 tM=�NuD@4,I-` Nhzµ $0#[9輯C T[.gI-A5HBDoQ:Qcu6NgAy~\+x Fqy:#("IcJAH"659&w/Tt 38l܊yF ЏTRNdSu ۓb˨ va/ni;N˶@]AF#nUO\(.h,A5sMEdn' IIB?伶xv4<la_տ׼*0.[U)U޽QM:K0UEA!}7%8 p5`/ \]Yu7GͱiNwnI&dc.:-oFYSF:':<OK7p__�.t}`iS];%'וݍ:+D +폨}5Rutnj^I[U.Zq]zZ:.s HBl*l[\b-lf,'DD<+lʽ*օ76c(&k\>Dp-zJkX'-BPf:/oa3ۿWoHLgue=/ɆyjGrD?VT kڡamHQ10:qp6L Fڞ}1,,bvf\[KT!s%U)LHm)AIudp)kr^_*n ݍi0nPGdYcWPs0ڗ6U''jg@/dw53#�gv!BS^R5)4d609 e �9#N5PP95m|EG/X 1,WBz3[\ d A_Ĩ\XV~p>dɾpI.;VDʲyjuᷤkZKeb.ى(W'Q̫+^*Қvr撡5ؖ8q�*UnԻ_%z�.T3v &}CWs wʑ?[Uu>ÙC9߷nIe,Bݠ$+.g{.V~0+- -˾Rʘ'_9VH೰ٕOsDu]vά*j ʗ[9* 5 qhvOn�m8Um[g'`YիsN3Q:L_FPLeuV5b~@ ,0(:V؅CxhU #"2q 'q<TMPn;{dH_>3u)B6ute'`ؓ<CS:WTqnqM]zJalEFz| tŗШ,%HW[e$D)47ci,.l풵?6l(nY tĔ7O�MqŸt11:f7ͮ1 #Ĉ琐xw`P m9p Yu^QZUƚK1A 1a%!"mأE|"Q0&BN5;=\H`moy:D7JAP~:q)Gv{Dly Z 4 7?adGp#ŸM٠ l}3 E:ư5!' q5c)![#;NSY]~Ȝ0dG |I5bջ l,<z% hYI$d. m]Pȸ|' q={Vqd ${1y}Fgyxa2JqLݮXuC`2k!Gp㢋h)~eguؘ8,ҶÌÖ&z/:!Nɘ˚X>Xy bNm$dD)}9 MvP+W?h+ i;؊zΡe"bXgz9x}+I@ Ԡ|}WG� 1w=fWq<[v_B�^=]evZ�׾nQ*!s5R;xiWWE I}^쭡rੈ$'v,RFKT\6fa!h]m82$HeubTDSc@h6ẻ.V"dh@<Axr9z<c# 8 | ,~|H?p}-2M0B$.Y{Q!ydy>,˩RT`&B5㴬/(&$[M ]VC"^J&X0r/G9*Ϯ>eg 빜{20 D [yv?$Pq|H]>ܼo oVgd#,>ޖsQ#-o6 Y 4*[,xuQכ[|h"zѕV@k+xH/z~+yEU,VW3HfS^!mBăӊz*WCe^pFY.T9j0QSakS\A_N%5Z0%>;iYj"_W\'Tg#Dѯթ2,GFJM Љ):~L[`,)c "3Vx:^H<s%YHEȔt&X`+]ke y@'v Alo`ޖzQS i-Tm Q).u j3*z q\a3hИSԴEdԓYF~9/ɱLrbkʏ z=*I59(vGjGz+hGZhё+Opw_ ɨǑ/!ۧ8f٫heғF{S. 䖟shyxdUFS#KR*`҉E$JXraGQuAʌaRaRK·&04mMά8E. Kṕd&>Ǒإ%*0-C?n͜n32Ъ޿Uz2ZV"*׭dr}<K!^V"ޱr|1kZͺ>`ʢt5vzqT?(߷z媮[$9\�DkMtRȸ"~UoYp+v{,88~¦ȉ ^\�dTƋ]J}\ KvO Ne (Cu8�O:8AP Uf@c 45n,2ncx`�fnjȘf;V mGޠ]ipDUekVi,l|;Ик\)oG)1Lz!=6lqJ{3/=7xB.` u¬& M@ g;B}nA2=A'|D({sgX`2 ]kH㛥9dCþ.0dߊs24(mt[-3]%zd:l sYD<PN�F`#ZBv/M=i=)m +X``{L;=`pdMm {ǹwWWVULA8`8Lgf?H25Izx@ďrb͎%#AC+O#Q`. *z$9ϓF\y cmD❂8sBY~9a9i:IVSLL9YN$ཹd!SyRg$b0LpeMҩ]@Z1`I[~(=XAM%z;@#ֻla#_{%%}F{=gBb z>:c>ߜQY{_!APG1Zv}s8 �]S j 1qrV1KV< yuʕV2sd)6"e#C_ٔMȼ$gP[.¨KԠ4c+ $!MA.D)Q_@AJH6}Fv\10;TcNwF� 0:mؠDUL}DR0 1tިK5 8p'-!ftY!aN�l%UnJKG(Ox5R(%#-" uP͠?ZY�GrBb&xh WILRVǼ+s7Q E20ys`Ɋvg;'3Tn-5'Dr (EF,Uêz1[&,tKg3DOsBD5_r[H&I4E[Gr<!PA$c`,pH!/A\ ]-qeLvyՇ]?QW"6!_%ܾgİ2񱈾 ـsr`"JZBH?޸39~J5q]NN.op 8CiKb/ƓllU)Uro =܂k\h*j7]0҃ge Y Q �B&@@lbdB÷ҁZq K5&'rډӏ]."lnj[A1:@"8%-e5`Zk5l:5R i9YpKθzegs,�QhܸlaJuд(jGz?1�� �IDATDZ7j2D6Hz՛HAЍ}tIgg`;)+hAfx@ Ǒ`P |`q] G9ݲGDv% ~|='w8J;CG _͡ ?d 7Ue\+δrpvۄEfe4'+HTG7㸩X[of��p*YXEC= vT`7 Ǚ`o.V_kt>I#DF{4,\۹,Dwoq$w.7_7YAPM3@xcO(pφQrw3Z cb."/2]dn^'�苴D^88RȊ]E]U%@ʐVi)1zg2F-;XfU|۪vr2U-ŲFE[h6m 3za2L iCZ [*MdlT~_EF 㾆RO:R_`ۄ͎֜]ҽFwU^*%e\~o͋}Mi$>-7P|zk2HJxɵ,:FMVy:r\'OM+ J\$oME:Gf^-LtYZlOBS絘 +ȐrQfE~E\3/e> (U%߷5nERv }Fr_Gzmyy=yJ/'z&zYRDr*JǫpmW<h/Ph)TRUVIUF֧l[n\>, Ǒ>0U&6Hw^d66ι:- ]޿rUSBՇq{npخ~u]WThn; u뮭ImXUr4YgiPxא^}12oR&EEɱ)=\>^XYtmnQ?*+K*^6Y_-[\U^v\)Ilm*W ?k\Ltd8˙ߊLZDEqs)EznQJל.cUr:gQᣏS_4tg%xt8|}&8VaG~xx"}7𴆙g:}}%dq NO7D/oEDyqAU $dC;zEYGRI(ԛoMF~+"I- WDP[Js}L>2;0Yoy2(kDaھ| %ޮf^(Ħ. EAJHvXf H@B ?l㋱Uf#رifR0ifp-wYCN,QJTd=@Q g);Y.֞Nx3V2}P] ÿ+ _@ d-^# dh_a ,mɭCzg{-h#h|'�Ry�yWo4n[p%1[@w x]+bϰ0O�OA"~QOCCbgKHs<|J69B0 hB B~% 7;N\%/̣#92@: қ3^VOa٦_DA,#,b.9*sgw<PZn;~ը{vޡF-ۇ}`uk׾6*Fx㐄NHx8DZ۲UEt?#3;%``MٍCʔyȽWrC񱄈T͠@$ڬ0)?cő:cTY`8P[zA @lGKKƃ8TFX)OJ5 8a3T$6P3aSՆd M!زk21;<Yejb! 2Z05Ph_󂷣6#E{E+AӖGua z1JBDr KP ])@s$@ ^dM\m^Ǩ9O=c祕V̌+Qm 6FV7Am3�R ̢~Kk?.m@axX 2^%Sk_3`/oIGJ1'oClzxOP!<!I z e+hLjp^i^OŢZl44kr{"LQmٍ 8#/ HN龸  lAPD§"`6HՂ ݤKШz5t>O~-0?Nt܊(Wp Q�nd >)L jض&xݶzR^q_4|bB/ˇ[iц+jqR z~?~ʹW 5qA-.ϻp.p3]u*`_oD_oM/'!?;`o˭sqy$Z 'TeSR@vfR};u\Wh �糭*~ֿqq\_myK `{`}ZN+P0[@FSod59G3BL'z_ g{""(?S��uWˎfr㖈UhV,V xW0~E]]kmY,oQy0+�oj;~^m(ZA>DކQy'av|VfB}^n[W0Wdpљב+~߷_GVo~Ӕc.q?Vro+}}Y^HrDrі:vW[ꢹ{ܗv,k\~֞#P^|%yɤMeYyc~mob[vf[G !T߇A daլ; n QIwP19AI<0QC&4E' "(!#q hIUXMβcvzp>ƓI/9?ַu{ ܩ0~e(bE 0pXcЁD /rXr}OQ쏅 >y Ra-!Zֆ�&5^G T!ol6(dז)r6Qׄ)-Q4Dۅ0llXp+g-' /V@)}Բ ZQWTem`' L"=2- .48+{N`~ǚC}hZ=n4FT ,oKBQݤ- NGm/[M$Q+vJM-fM>aw bsvk?$.ݹDE3�2QSM>BXX~?mbh{krOPWƶ";8vFt> ]3XK? .!6ci::CF*Gu-;fP'wEk.ԏND]U= m}-̘.."0 @? v8 v;y@'6Wǔz3LR%Ipo'KP|k? hnJV.2;j|!:vm\@O 6ʘw*: .˴:^}npq6�b²IMJ+<V,q[êϊ1bnSR9Z]%UAXdKeΜF pn&9E h{zK}ZSs*`Y}o%%Lw:?*X93rARy&LӫaN^ؿG\֟`>܇yj- Z�[B[7e#&;Ezoco_F8 ctוbOQmk\~K#h,<4$.s&vGW'ArpƛH 6ړlӁ/ @a86~-ףzr.BkY0wvzA%Ʒ^; swZ4%fwݣҩsQj :0z$io|Y"dq8~<88^08d<i2e1A 7brT+Gq|cŕ/)zV.+ \e�7 99MizU3W[We'q f<m>֛O9%\JcZ_ KuPRvϹm={^*A ^!PwM/"|O8R̋9bڅK fu5!6X;Ɛ8 ϫkwB^\g]wI+kQ'W#盪4X3%hv8yuR}&V15A 3 }jKAqr4<TJ\gtFwך[p5<+w o�� ?����?VohDRjӝ᭤xyX$%pwMd¯kl%gUo:ǓuZ{\V�'U,'b{n3UZ7^g.OU71'wU/j}묜e%O,$Yi"0*+,>96,9[.t~A(!_>X0'o>{Di�(-ٿ%ݲ~7LD\ƌ|:4ѪR۱^hCG[X֩Ԅ~Rr/zߎm':Bԍ" A R �4J+,r+k;WBO1 yg y$":"pѾвI0fJ~=;0XیZSfյ.eK83fXˁY^ qI}ʼnξy߂^0wUSQ!b--" 8j0CP ׅ|3B-QZ oG\14dmm+y2\2h7؞Wz?'9hM[p<q܌g·I*cBtbL`ԥvd(@qǷ|necq*u3UL{ 56'OJ(:00𥳐kW[`U!,OP E\AwO_CsefGY=V}%ڎD_1ת`4T6ZqX� UWXd. wbq|5P]B NXWwu|YH|y"`iUD޹LV䮲NSEŨZI0�xhIܭt VSz�}Ԝ˘An|$>:zO5NDϏx>�k +��g໫ XM3`G&X/<!MO|&/T0�>&E2k�o��+��O/VŊb5~Q^vDr ]ӬS lvœ֩^9Uޡ"ӽKmM'-ġL"QE[4~ vJJ֫%t}̄FY\)vV)`N� רvZ},0+&#b/ZAh NgZ+Aeyk yy~5)&SNRf]sV?^ʅ6=]%tt H/1dUO MwdOHvd=1u^Z;K1)�'[<%+++// hKG5mj72,]8nƒl_V8Y㨒=js+I`G oWρ?΀88JɆ$hˎmpԾhukr/uC{~>ų|`YRNӵ@NzJתij8eSb{݈}=VwDAw-zLwu,V)g{%2X9^: E&`ETiHqi9Ѳh <YH\a,$&*ă06|}6 ,q 1" Z8Cb)h&@+]x=qMa[Eiԛq|h;vJ B&'x./->v1!gi[5yg(ҶeJMB V-F"ԋ6F_?83#Lh-}tz(04vN9 mٶ�[Ą%i뼆#΅@seH?4M. ?iÿdՁHyj휙Mu쥦� xz<2B"jMmmHmF!CiR֥G֒�WդL 7�/\3aDbG-680Ҳ+˶K3Rb~V?\-4\e,sYBCXb|%&N<,xz(i-/ZUb%F)}"ؑ=(^kgU'd60G׆sUr`8+NQ;yD iDjd*Dx#&2S&Bpňk2]:xQmL9x\ulp2!98udC 3rBi3S.YbhV٬"B.؇ԧEYDN.gѥSx5ses[7&λPP*5Dry-"؄QPR*tʂCƐW Xf?*E{ј rj:YFO֤d;?xիjX: 3o_ͦ]VdZW|KyV2{)m q`Ip6XTr3MؘO .EZD<//Śݚc; >XvK :~/yB#|*ZVCjAeycy':O9>д5UpL3Z[PIywDU55p uAﶉ~F:o+F~5gkIF֭άh0>֥V}csmp"-o1%=!Dl6he /(>2>n}_ߠ=rTæ_4tмc;CX61`|5QTQѱr?E32#4u" 3D *Ǭfِwv׼ LB@$aov =ЁSOQKc<e5oo6DxdS*MA%/"Y|BB0 $1jL& ({芍 ꂢ) n$2* @w?2ܥI*Y>e<VIҵ^m-,Yȧ9NLq9dV7Yr.?l&eZYڷ/Q|ovN*v:S|x/5]{Ij@{#hE4SkV7ISɟbx8�}Cr>T i_utlHI/o"ڑ E ]u~7fql|duFÒV oVx%| |��6N 8W�O:',<-�|- U˪ T$Mtg'--c_ay !IymzVES�?%['W9Y0M]LRt ܐoҍ3dr7{-g Mzpz*u�� �IDATA 9y#1~1 z<}v;'rɄH\>cSa7BG / ,4:XQz'[x& ?8eTIGIpTE&geL@ƍca) 2*% 5|#GBHN`iYU:mҠ}LIBz|4 B1fz7*PR?0`ƺ4\ٔElY5kAW' 51WcAB̍GZ,9`ð.ErR*vX(_n;4|y^6:Y,.Sdq,-\hFCcE-45ah#KZqQb _JtxOH>ҥLLܨTjb׎ߖJz7iUT=J)보.7> ]4\f-| M}%;ߦU?>%oq>bzAC-c_)p-N6x~gxxduinjki�|SH�_?Toӳpi#LP*O\q}B.N>ř(L*Ϲ}}~^2[{*F㟰:EIbUW2 VG0, =4/<|Re2VI}j%gx=6]=gȰNI*пe)#5F-%%7; э4J+<e萢''Lث'S$$8L|~6ɆqYM|qd8~5%R TCK8 mK-R?%. 7"%AR|.t rJm¸D3WH�k=;|H伌{e~_<", T3O~mm;ΎjtsCN_L?&AP|D$N>n1SGO2(Dc8y|8]5[C"<f $2n R{kNWE74DꞸu>qq,\lTWT+5ەD85&RQMbȳYN<E+En Ga{𯒏 JƚQF[2R+sήD.jQ${kxTseGyĚRtKeZ.粇&|i \5oba[Z`) {#fO }2kP.GY5d&lbC)4xn=6I"L5 Dt;zަHz:َ qo@jxt NUfגťm3L)_xNh�-e o#yX$FSntAaH%4DgB5˺Kآ07ꐒg}/ ~$ߗV;oS{΍+Jj ĉ4D[><�qHnpЮW6zyK&d u=HhH*,@(y]@!DJ@QykAݯ4b_,b"GZ9[9' *sG ,mR| [[o-*]%I JD1/$A5S@ vMZEו)eߒ$aAǩJ?NyA<s[RuϹo+[F|ccXi{&n ;`#^KZ8CZNs{FRGv'>xuZSx {^, c}N)Eͺ^꧓~s{(uHJ?9﫵nA㦺Klꇜu5V,N&ďTyԞQI1╠Y ҷe<eO�>H>{|S;xn3'ӓ p6}�yZUabL*h�| |9s\%߫7d"bIdIm rGo&$;4qhc[S)SEh>ib'Ge݁EvZ4myң~}]W|_ikܥIg*垾FpΔsa3/~_Y%AGe; -0]$xySpˮ<eEAꛖV*d<#MK"Di&6йE/s3KlaZ58v'ǧ2\)ch榥) Fi0^ U 4Ti~Xcolx[rC"<TSg2:WurV`m�GAiiLT)VX)OBJթ]pq0O[zu::NcoQqyuT>ɩa^Cg�lcu #VFjC45U7:R54,svþ}EepQ^^4*aIߊXF"$Q֤lXnl>(Zep.F*GtZVh;^'_<8ɨMV}M8 6#Yk%K4M>5Vj0y^�[_~R6@H:f-*vz4{rPbRuv(V>xֲ3 ?'�݅=Sc`ðNѦa2P&WQ(Ŀ$J ܣL+Gh{9he +))e È̈́( H2#W]B, $șHjnQ/+5,g10e:jeY҄]2?K.?6_^A_㭗u`Y[?0.-8Vj)$ݫ̆'@AknPTc'ibf[gty]<Lb4L?Ŗa8!nǶBAl372jE/0׫AX[j{PΕ<Í$ZUԔ[\:WζD\-`z}ˉ7'MuL <*| l{ۧ7�J a|9*ufb:8Pt(^_?aʬٸ%gޜM&߻cS$A'M> p/5-l!IeρDeH?#?E1T[ }"~u{WLzӺԹcZbJBK~yH=[au%A ;:AQc �TUr$m-3{ձQ{Q~ юs)D*.X]#?^PuXϘ-T,^x_޹j9O˜QKoJp`N3ӡ)2*Z{cҼ1&R.9M`hp= T+ZiPQX?`#7yR`rӇ2\dF K M|ۂI!`\",޶s#NͻuB2曵GȡQezaOc-*\e&vne<ZCřԯe@w0R@_[!NMx->@C,鞆fw% ? q\$GH'iMٌQDK/&D4*6%y*ŤxUHg`.7O$0h):`[DċR9Ejsj]L &FqCWQb"Cd > j%Cp#Q(Ƿ$(rl@̐y(XlC=ZUAl|gㅷLY=0H`-ѨNh B羨;W(yT,e˗PWG^~Se.'zֈe.'ϘueET,E[šɄ=1!"mg04ZLZd6B,qk{Tҗ2RGXhi GGQgiQ<jr8:s/oe"<`F;'4Qv QEMunh|ibSlr@1ih (=JUt۲4 l!P$ r^}7IQ\WcFINX4(K#NoVTN N6ꖡiY yRvVN^,X`gԍ#J3L6jkX P~dҺ~m*8D`‚ Œ0l9?2<Q3mRhdm'8k#L~`NIʏـc&\A"S9з0/f7۳L}1:KA7xfQ *^ B, k.ꨠh0�#[�P^x==Y4qU5XaxS []N-(O4 ?Y tF+8h)wP}.. ˡ<_yi.iV-%-%SzRY`MQZF"WCWNNzܷ^"y"΋FgʤtEH"ldAfjCeaB4K- 0h()Aȉjp @=<iaہۚo)Ԃiy@19Q$f{ @t;G5S(h@\(>9؟5z3Ȉ5R&n @|2@[:Ruv%kxm;ٙ#5>cqK $kfFIFXfv cKV[]aSl#.+!pЍ(1\rG&^kUbMAzL)ɏ-!GfRN:X!xBj-ee5UD/QM(scY̺AO?>x i/oh6G^ mSG;%:e5)` pf9ilD׼-XSQB|*roK-ɅDp2IIZ%&:K?2hpI%!™\ZI=@J]qpzsW(4bщl\%33$OeXaQ$PYKj2FBc bZ|щh!oKvyFlDU맵0Qzj C|khk^N|e%k2;Z}^{Ԃ'̰vDDŽԂUhYG^PN\U*jhxU9pr% Uifir*^"cE_l&FQLW 9*HrS%AAkLJBixȑ卖7mAaV0K9:[+<vnY~ֶ t!5q?zVHYۜ7&ylV4H|H^ődЙuL: 42F&w<Aw5ߑ֤g)clhXV(\\ZGPw<V&/eǕdI"]Vd GD|x rg@&:$Jd蜱nPTF۾섥IYa~|3 Do!]Py?dIR2c׸9>lz-~K~Cz>xy"wY�ᔓFTmh�e+{m9OEH[F'(qWd�"m+͡+79,jQ4;JvacU<҂U(!J!v%3 Gb`{q6|!;5F"ӐOt~As8e0 JuY̼UR|Vaog*FZrM7N-4LK j81Kd$6pg#0@t`?8Q0tL2AE,h G :Ldb {x L%ԃnR5\kÍr7=m&oAJ{, Z/UI2Tu-#PV z ^,fHWGulgE2SUYl 7tpD8sퟅpG�;_ڱ p1m#+Œj4"ihz m.]CŢHxCTr(G$UؠWĶTK'+2o W % ·~жRdۮk#LoU!J+;=fxrQ(1/ Zu7n@?٠"l'@*{>¡SfnRS>v@-s+j0{X?GLh!w,K,fGhJ(Olެȸ e7c 33�sk~x/D &!؀=yKh%=ƛ^,NTۖї7#%E]~fƥWYv+D/s*7jjk] 6hܾKl`er;2*8 mcFSl4dȍ>�y)Wzp>w1NJt_(nIKi jw49܅($+xԉp*8ӍD^/z d[ĩ GY J\vħLʝ4*쾵`8K"p-n1i4O 7.z섡cf umWN*m+XJ1TY((^ W%Q f\7ވjT jm*C!pCÝĨ%;`CO({x|cbQ-8�3mcֳdW_�z->YQ$ ĽF˜unNէpB4iYWHڽg`46ɵqgsZ#UHx, `<9Uo$ʸ_-ʁZ)P$53"I$"ӡ*2Q9I]jC-I%e\ J72 bu1H)mo&1 ZB}qnO}HkI*Z{ c9K<NzYw[ 닶 %L[θbh짔O84ED|M�3by?~պpsl)i~OiVtlМc|}ut%}KY`&ᆴ)8U3:=^&!2k[Iv?.Th{Sa)l9B$֥ )F*B}�l,IVl$!fŴ3%04 S㥉Iy #ֱ[^K L$غK}e/ 0}p#Z',OB w2(Уc_%wmrn6U`:#aAKd̄^ؼPp(?Ŷԓq^SYT0!? hxQ˥\?YXɔ*ri^VVT JBMEhȒBֵ[7PqR~][a,-)LtQ-6�؁I^X~Mq(>zo+v1W@v8޷wa[!\4ѧI)ؒkm߭f!iOwOwiHϤrMx41> U4;=v46Y#BJ&z'Q-Jf5!x 'oRFLapL`WGK VYYQyG^VLwGJ6<fr /A\P�Gq iJ\߇^BY-g8BxqLjƢˋ;"j P=dԱkiIòN=jA6N#''T>]F)':`я{ c( ڂd pkk]j丱M6&]})&sOʚeIa�{_W".H -u-k<z_@&L[ Kc朥Z<YqYaU9:pR%$ɣḯ7#8y|ώ}Hi]l, ls,vZP-z`.|L0xĶ; HҍA\4 V'cQ�� �IDATp!ʔO>>tpԈY&OXPH4Fi:G5n�9qj.yL(+VYn X#wW{ZmIX;D^뱨 ڂz1L2|x6[{5}~G봩paYdVbUl$--8+Mr52Xhr2 L4DQA% mxli!Wgi`wWJ}Ӣ{Q /z!M 1ܦZwnmLqKzɡXwfȐl5Y"qʛq|i#WzX16[Y Qq:|_2{-XG )o_]6дOGuC^֚GyIk/Kj  Aw^8FoTA9�m˃f ]eN#u1"mM7f[t:9=ڧ2YU2 ߋXZt hvuth8 EeU]104S*yZU!w榺j/85�׫qIm[A\[xiOF{N1/Z]:\B>ZK;% Uw!a<"4.B30S@J{#}G 9;jŊ+"; gL*ڜ_d3ȡ :a:[*1 (ex&w0%bQՀ*EIRsA0X֣4r4*.�(ČZJ,*ry-v}jw˃uGVjw}?z 5VʼKJ)z kf˲e.Lo~#UhE]}뎿�",g1}Z ^\'{ґ�ȯ̯Z.':+:U[juXe.qnuD٧K>-E멷:)TL+v:)p1|w�ӟaۤr^N֦8YZGxoV+˧?-Sx>L7nu)p3,,5p]{^S lp=pplo8Npx'���;]l+,oO*c:t"1�]h+<>9-%[_��>>�~ 3<? n8_UrNk y-M'x{IڬPf:S6� )}˲?LmNZֳ|-4'T1KHYV>us.b+Tn:&SAy;Nٲo7CP'rFdZ"#!�k{_vb7G}tvt7|=ԥ"v50A7`#Aɢ1oȂO^/%lD~q0״ݧ3:ߪh Mu3ŞCzxӇGCBd<J_룺Z=_B1)ztH�#IMqD�|�O[g8|5Nwk_?JGU /p&"&ޥryƧ|�nIJS| w�W8_+x~ ;�_];/qY)"pXlLvCrpD*QG=.PO5x冼 8ߤc};eK!򹻵yTm%ܰPjo֕*@wyQdw_< 7ՒGp%)tR<h9YHNyk S73zI[2YaֱL +lWBh1+a긩> &PC=`p`QqHT V|,zZ-@* #hZ {Y3r=he3 _s?L7a^AИkRy @^1xԾ&| YTfLS<%*ϱ*٧5kh`t$][Xcy֜d~߲LQ/Hop=򻜄*Q=w|#_+2ಇÔ߻50%CPȎ=A7SB-$HOMeY-&r:<9*._݄q*쁳z8ဧ騾j ]~�oqrd*~3۷8YOjuH֍\&d#u7[y8YlJR�  #ு?ϟ?q6['< |{SEp1� ^s8G"!=~}]� :}.+]*$SXTPnP |=JW;b8n_.pkfv_F^bYp}EHH})? J2P3DJ*p!zYK0<Y䧠;ǶA�4$$\W{Eg8hrWVc&1.G[ltm|_1Dی !P�8 }МFi+lƤFTK]c<g6~6q\\Htsr8 =T) (%G7+unN,}cƚ=+˲Ԫv| ԯە[A SE"F<˿MЄVW*ɾGe)p!z %MJ6de"$US-+j)2PQnm}s<\2}{ Xh {^{$qW);Z>Wfu5$Ac{8&- ~zהۦ:3 vwL[VVo]FQL<uJ.T̯pwwTl}%x4�]*Ŧ _Neļ[Rq?UTBջOZ2='`-^y{M.JM%O#ݗ�d|| C8ϧ K\w8<EtxZdT'S:O;-ȇCzaZӭOWr1FPR59'%-`ZQ t>TWf}F ZnDuk[ c|9!qǨ& `fFFBv/flP_=ഭT!G<2L`dLMV7g">'XCS&c7nS/G1TTmSJU~hI>?ҙ a�ra=u-t; VҨ/^ݪ:K2Ko 8_O`WrMb �j^ϟgܟ A=K~ [<< RT}|+.=%J󥺪)Hq|BKl/%�?% ��?Y׉Ϗ8ٔP: eJAJCR7)3szixmrO&|drsN ۋ]F)OUUyל Šm^^QeC?/{ԑ/ =Kɭ 4m2BԪh9ns "ft'ZB1&ij_K,=A XIaf.^rۮ?AU|VtȡTtgn )#P* *Q2пP~̴8gl\^kf/eEw:OUވQj%dm?$BDr79i (mh[p`W3o|vWxJym~J˶'a[Ϧ̅~M4Vggm g? x*,E7Z58v MDd#'QĨFnehW��f Ik7+b &Ŧ'W!*U̖d˫iDnz�95GpϥVܪ)*UoS$tMlBU�aDyz8^06ŧ2tHR`ۓ2)\>/P) Qj&Sn-E]Ȩ[,bɧ.Yd;򠈶p}b >]LŰ-Nt%,^UєC &t`x#WUul:Boj4#K?W!*LN7B4^xx^Le.4aM趸/2EB6%T8 C,+LC5 y2h IpnԡQ<]fN,Ƈ+XIQ"'xXd:b-qy!f փ_/R 1m3 i&Q54 CmXZ z䉷%M2�k'a 鐸�KpSZ=*ʬ+{@rJ5b/{{wU x݋݋:S)KKwBc{,?)ݞjw9$'/2KBQrjS\Ic:OVjڄ ItTCjz>J}ܣ:Oat~Lt}X|-idC"?W8J5:F>ҭ;`v1qǧAZq _|||m"r K�~|�_| ~�'{Q:=gZ=֧TJ+͋uZ۫8Skw( {1{Z{[WjMrz},UA C{V ޑR_["T:�zKd\сCE7كjy@FME;w`ndP(|4.a )U* l 0mr퀁bЙ -jÔBR +8~$˜okOk|J=Mq0R<aVWkn,r~-Wf)ISvq۱ji!#Yƪ]n7\m9S,Y.<ϳZVkjoHFܱ8;Nq4c2"pДj"O_Ql;OoU Bέ`'"ӿT]bW&eqET9幪_sarHD!ީ|SqjL'h-r;ewq:8�wZ4NI# {>L7ջ1o*VIRMvI㟥;ˣ߻LΞfßJ�> 9+{8y /NkBKP2W֣=TawSi`X st_2)>�> C; xO{xx6]RO???VRiOZ>#u|~he\D!;>aue3[8KqHs(_WHuEVWt.-p`kZ, WaNNjQ*QzH/ktԘvj3s|aE|h#4"t+-f^S<p!0khS)8mR{g7N8}wҽ;yzW8~6otiӔ!caQjCJjL?_BTI \2IH.,{9^guc6X1 / >!-Mbxc R"|{Em ཇ,M< Dz }Xwt4p<9ary4-eHg�i)sRnֆf7l,S$6;]1OKRBN̂s 0vtRtL,l4K1nWyq5&&)a&Rx{Bf%Ǜ],6"W¾:R:s!Ǧt&Y%2x=.9m`4Ę%zlep <>K@75A+dYv׎Ԍz^Y1Ncm{Ba}iH"L_>$Bj5Oovld~vQ} ;r؃qԽFO!r%J* q;og&嚤G�جRΪV{+iqm}+ܖ՘Xdf$3%[z moͮJrlx5Ԝ^wt3EAu&#&xw&?ze f`3眹efyQ4ב' \+/c:t )'2#u۳ӕlxgH;Ma ~H3j`B{x*YLA]IblVqLjfx1 clA�KZ|Tnd.YM YL4_RY/mQl~ "mFYǸʎ A9 >4Ӡb}c˽6Yc-[H_|6ݯf>oIyAX[G1v_` w0.O}+M]�N>6�)[=Ȫhӥs Mh}k1WGVUy gֺ-±J Ϋw}SU-QHY $77!Jr!Q !.]B0^Jk[\Ԗ(@NbB:PYc a/(m@%1a^6W K;]f0=wa&X>[[/Լ͛а7|k C&C3HCO^-#0YF5l83ϹiUl BExDn�wxlwش7o�DTAܻ)z])'J¸OR�0? jF.(uՂ*sEVg'yR:ׅ>9 r:0ƊVž 'q A녔WԧE҅fSFc?}sn_0=!#)^c6GVvh0nzGN=pq^gwi7]qS˟EV5 7I!;MNHqgj4Pv$v(MNdnۺYZ0Ƽz�&34o-ډ!SVz�vB?)/.'-l}^N��~>Ks/xp�oxv�>�Β =�ܭA|$z/_bilo;|k<.M`�~|߁| Sீ ;LԯM~ǭڃ]1}]Ӏr"."InVK.{.zo>D|鼕8<C=Y%X-@:|`re%Q [2.NjPoQEH_i0!, 3jRi\#) E"q6Kv Ыn;Z҇hX)9Q ~Nbfs5hl)4yq^UOijx!⊳]fjYB >ELIY, IEؕR5ݬ! ۔87ٰRF& 췄DJVbxZGb+mJuYU0Ei `}w̒6J%2۽PAǰC4YXO,fbRyԖho^U??ޜZfLuʿvsnVLTYzv_V\VbOf ,Ihn>Ilk6Z$qTwlTߦrӖ'5M=zq~-'nAZ_+"bta"W:|3��na2}~>qS@�� �IDAT1W6s[}�<_dRH>5?~�xJ nG<?Bd":U'�gi C;PmϏjl5?w[O? A <[ [<'+:$s4O# ZL ĪөxPow:[y7u@0xgiTiEKGx"<3)_& rQ|^NLwmrhceyFlN Y v ]ʢ1W``2bB @Z˷<+ONZ% VFy%WCRguο>VkW~iƼ4ݣ:(=] 9%dC Fy8|*PQ 6$Wۃڡ*}>_N'O$p ?o5n�78Y-}Od1�'wǻM,?7UϞE T_6~N' 5΀TlӪ;]n�| o' |x~-(�tBr8-t`wk ID3&1 e)zu*oef6%I˝ؚuUZrILU߆+<*lE,i`_w=ۗ]vR^@-;۽wYTP)LA| B i^¼\ Oy{=SR[DUho*1T`rAV#*ͭVŗ &)twkU ִl~RWYըe0 ??zX}F8^sI7ݦGfۚRYjO_T*ۦԚz Wp'W/szw7-]<> p3�'<?|3WWxK<H|ZYg{nSmKv2&H88YS�dpHw{Jyt")>>J-op&SMɸυPW; &]xl{=&oeݦ܈"4MԽ7 !bU/ݷЍUK=OP])?ux_R=Gb3(yB%P-ZHbQtz?{af@k5#BLh QfS֖F>-`jF˼"-RjNZs$L:~IAUB8?VYAdPu[^.n]^ d;h\f]!EWLûV^$I; Z�p>M:h/tݻJͯC`C>mUN"Tj+~';OL/@gڅd䊍M%ސk�dAD b}☾5ydI W^vxeƺ yDHg]Yb^"<^n)U]C]HP3CJN)qY%>x nkjs O{8[T.3%?W4>\HE`g:Jµ:^(˘tZBSu! ɻ?)~~)%�&7>~*k�)!{o��klqr ||5p |{7W xUqmMVI*d$}Wl$ �_gǵ�8�_-/o x~=d||A%m*<-m˩vNxrBފ:Y{u"j/wuZـc_0yД& n3Eng4mibiߤExt5/U# Nalؐ|):*'nJݧ`X:BV}Pe:\:9%},N豟]ֲk7?He .ޤZ˖.DpyOVRX]uSx;5΀5p)?8 �x=ll B$8^Ϗ"IKO+}[WB tSP`L7&d&u<u—x~ DxQ^6�~ |s?�Oj)&<p<|.*Am4#�\_>OI'S|[<  YsM$Se;w5H}&RNضݾKL 9ȫۨ ɜ7lZ� s 0n8t/kRȼEmm`͗?!"uXu E7{;,(K8/<*ۨR&)/47!=B,pW+,qt-1R~C;hOh[+*L4bO'V_q^LV(уRƬ+:I2gDc4Zܚǵ'A-� |gF;OsKxu<}L߹Y"[D4f:@K"4kx" !�e^$gff[ZPShV֬af$;/1ġ$f*4BPow'{ʅ ֎S}ٺj{k%5T=׹u-\u+7x)3.:Xf*^ҶLVmEK�.Wȷ.\՘ȲL4e3VWu=iy~8XO!Zk? (eD@,Si;zW9S-Mً<p/6VPO}evc2e <ĐClƌm`":QqV3RFkBiJ @$K.3#Ɇ9VQ+bQǏ'eKPj#u|X 2Ah&WتJ[xM%EeWFȑ^øݯ.mK߯kdx6F\$%K6y̲^k�6~@ 8{K\jAkNoH$k</Z^|!@aLh�z�ѧwQ'!jÇfa1żlkmVQg*&l-*'"eJvSk*eh~6ʴHQKz-Jᕡ:hwwkqU\Y9i6b`*.0@K$iˤ~QuT>ko1 & 򣝁âb{_{q}K2Er#<;aN�MZfy �ѽ&4ʡ=JI'}'|EDޒΥl Nb.I JTuiufoS엔7&q[y �«zh"oP ž:>zq"0 笱R,~^eS7dE5A P ֓Me%RORq ngrjӎ-M} (2s^w:^v XxAۣ^jM/ eh&-624Ǥ�cf!Eƀ*13z%G}Y:leߐ32\$TU?CT M1oWYJ.(FEv'$1TpS ].eWn ³Qzl2VyY'sl%rH_B) I`@H8̮4` eix3p"wg_/Ԍ8gL.<;/K͆) phdڣM/elJ%6)yh؝P̰ELp٠( , ,TP9_\e^ߐgv_?I`sQ.MdcmQi%@x69)J3NRqA^gY[:XfgptR#xޭk ~f t;.K=ẼxF`XDCXh68? -4!%ikb2Ҹ|HӞzwLU,ͷ=VF~.AC/&<ܟrS&6�c`^ξvjK.axIǟ$y Q7q9?TFTenA{*-"6寫YI׵JߦGRѹocr"xp) Ε` g@�?zfSpPA=߳xb0;R8Ņ&5HiA^061hfzMhk`K�[V rܚ^ T~x3 ?GL Y-A]qkpHUd~BIw)&P6P#&y~UVXSgWF:%ޣGn{%7r+iyܰI~o1cͅ[w`Eg^49kЂUMK? :8~dgh}̭U,$cDXQ4g>YҦI^.ӵLmk hV3r}xsvdAen~DNГvI F"Ca94Zo3šM^s$<ܘRvdˠkyiU[Я1U4 2_;sbΧ)C,!SAn V blB[# ߵEǹr6A8bnI2["9,` n}e#>3_2ufkbܵ$?0LNxGW΢-"폚LlTx3-X'-3#vS ABDt ?OS!a󂌹`VM64fVR K ~c[ ag #nM/ FW}uL3 Q(c9I(FΗG 5Jd$ bGxx/^evg-EwcFs!NuW*Mjj/3t">\'x ȉr%RfmdSʶd.lDdߟ rƃ8E)?2+Fe8BߦNf'6܌M }]®'_f~#B>6?9,  4YCoS9ʫ>g *zC-"h'aV( dqPJX$jQ.rmu87뛾 vvV`W~03HwDtGLi. eTM`E>4B9&!D3yC`kI7p!˕ A:rMS A(B"MrӊF/QqyU秱+84HgD[ .Gޟ~ah=< y58ZAAf8PS4DZI!BhhՉq1 vljr<(03.ktsBtN3ǹbZ'ZxJGlàGr|&eXuЧ]1)$ 5diFls$|ps2G ;b/Qptr(wQMD}< p铿|ǜUΐX6tT$9k%q:6u?ǣ<[JT%̣Ocaq#9h2L5GlM X$ti0l$sŒx)‡.ǡVx6퓁45=JpȾT`l +cM=ImopneDVMcl+ovv?bL9daǗ1źDQȃ~8y|X6NϒwgIɄGD0[zJK&@mFFoJ` r^Oc#>j^6Bj3ul؎.=ȸZT@5ZM@3rvXp EMT9`)wT[C/r/?*i^9^AƺCYId{QlR}>%=7ajCVK9NPgUs<׻ {QMCkаH?eTCrەgzաr/l`f^ )Ga;UݛthN%OMpb6TMNeQ݈ MjMKdѾ:=JV ;D{om7PfYlgoΦ|C=:9۟NFg6f{t�f!2#!a6T^}n!6 &Wu2�'I<?W'Rdi2Ҝ?'d8(g/RɁ̱v\8={d>ᱚnhZ-L[䃚&v*> KUY3< 8.˿}{ wq\ĦˎrQ=e}CM(eʵ5̋̂%$\X>;fT2 _R^)[,|׫)N5` mU d¦xb #T$Ѫsiehi@ oQo? (fQ4+lWCڦ]u:ζ DGr䁸@XȗtsTc4,yt �VQ^;BN/ {Ks1r!K)>K<)ޗq.(B*1cƕM rTSN>6HT5kg9(ʧгpli~f͹75z#-c.]+BŰ@zS&LtV݅.NObЍ0 n$TVCj`amc_WroH061˶=f]qH#4/ O!:et&%M Gf}gbA-hQHxm=+ g]7+d` >m M\x?kRFZxsp۱}/5b#4.?xrV[3Y%l8I lLFؼrl,hE*j6Ae i nxDiMx g}E6Fy\5Z_:r|ofbfᷦو|v(ً5oA%' \Um͜m<‰~Z '0yS S9p)�0v S 4 -5a ߒm%OU6MS@Hk NiN𡈴M&ijlYDo ]7Ֆ4Q h$,Jh^%b_X,@a.Zn5;|tAK( 1ޱhI==#%q 7&~DMc{%8pnw"RQЄs8kM?fʜop fAĘ TcDv Mat~ �0hS4qP* g"`_DѮiP-�xEuΗX ev|3F57(+-3(($/SۮR4Imx^?4 ؄|NP/amԕTE_:'mTxlPRRO)mjbcXZ.i) LŃ? h��[|G IdձZ6ô,`^0pzwV_dI/qk`ܤ_%/qjhzE\lNZN (q$$VC{\;sMuE/ي|x,. GpNLxך))ބWfq ]CfSTk甕HKs;Z`?EjT9R̍Dzۇ{xhڭΣ~ky<4iȔ_aa,ԊBY o^{4Wy[lsva-y[-#yySB>n nyl \0/lY{wIeK ]#YI�� �IDATJ(b:G (�ThxMj)v[(@ I  A {,Ⱦpws[l-[�Rv`]SE/f$<$Kg#ߐ I tM<t*⠸ cLns> ,4}jA/.ok2Bjľ"wwp} Hq ߗhT:^$gLO0 ^xl0_PY2B,;mkj1;]f,+/b22{' ֽxCوK9wE`[ʣn[K FVfW_wz}  B5gWUY;R(d-!on\C';Ȕ $8v#V䋁[t(Xrt‹yGNQTJ `zcV,noAǵ_VjbtW=BWԽ2q%Ml kZC)Vev|m�rJ 鶮.hn\hΤ A)JI$@JTa] DSf&Յ08^$p掸 H9{LI(tg {A3Hf*"9']Q?z7*  )ZZ=(p~fGlX�zbm1ϣ>{WbVgVwe F醐cJgT6HE6r㨂]SJ0:۰ *Q>p]5׌_KRv$ٱ)m&=�ZoתG 6 1\? Qs /l' SN%.3#ly,Bd|C&UχҊMw1k`u|ׅ dK/: T%r,{qa‹5FU7(@6̀I -)c,qYrDB.\ybEՖOl0^�2"v8!2=ybr\=ՀL&nu iLg*-:Chg+mv˟:m*р,<]Xw\v6zMcA;-V a 2Z+B$SSD\A[xHf4AYz3I?CD+ w53GJm=v\xge#٧;o<ѰL5X KٍCL3$.?!nޤUfNO qIϓ;lZ[ӪVⳇ[>~ۣ{G=!ESe]áfb2z^ ( ^e 1fMy~<MT0}VW,i tu.̦i/&ǰ#]O ta X9W;0jXN gԺ |ʱ )Bwi,BY~wm2 )}M8Ɲ^G6զDiVe%Ӭ׌*)'{*bUq1ؙDFÒiIz舐qIj)>P4 ݧlabA ~1Lʎ@-fD@C+5 CO$`;-\ylX fdzʞ ṣ$͗(n7e[eb["cABR@5d0+e ɆU,7gpPJ�v*=V<8 3Mi�!S#O0M)aq9w02EucrtSn̡OvJeUny~.uiMBr$SsNk}MɆQ&d2aUm=D)a<Jj�Z*+K$ :u!cN)F^.O 2v@9!1(!h/y!sW Wʇ)\hjRf tb^{վ]}$| N;{be7PS co`lky<~ſhfi%;G[tQi+Ah :Y󭵓I)"ęzwFA�".2T&TP=KO"!iD׏'i*t 04@DҦ-3D߄xg=-&IME!D׮3&h\،d/P6'*yjhT浔njLт p*IPVKLU H: 23JT;RCq0KP|܌J!|3ZD5H",nCͥF0ƙڹ5, TQ2`eg&7�%P؉2%ꤼ�: dPSJĸW*+*ă!2EiLS$+؆=_D:@ ˜b(=z%\}wغu4cg]ž|0Oƣ\N O&g3}"V۫w4>8r{Ax ,ʷ\srϠO8MkvqWOg ƍ2ʲ-Jȷ-p $iY̌T}G. Y#40\M4|5tK% E>҉g gW4R2c)wN}Nig~[ Hw#O,c `G2c'T[lLifW@ŁIƓ&>x .x䈂䵣%`^bXO>~$lLvJٷY^�Z� (IYB"\Im} b횖wjA>a,3O8DDO1SO;mL:W}k+o?oVOk =2.mסD~)u�7[8}ַYK= ^I^B 睈N/~>n{zv14.  :G{eއfjt#J|:ݷ:]S>ARor)mdw:[{mg}$:xNG"}ux;Q~)t:aN(_t#ZZ?'}:JvLضG/.^zC4jƏ3BǙ~߷ڦe|HDoF^Ǘ^*&tǵ>,6Vz<Nv<|<ט:wUxMFt%qVqVXǙ{zW]z<םnDk]Zgc ~v'.K< |R֓f#e3ek@ӽM3l{oE|sdP\Gaqx l:z6~Lje@;Tbxs/' D>]ͳD]3) ʖ u922}/@LL?=;Y,U2$eT׏F@=c~(LɷcyrM"\āGć/`=ׯG ,{$BTw e [12 v(ь' n8"k+:#3T*+S,dCr1|#]JP� GV) b_B� .YkZc1PpY 4<0^r _ h�@ۉ%bmw$>a$i=o� ^]�Hq`MJ,62ǬV;s J7mT#P>gy2qtgi2l?Z9r�Dlr&e=ӽR?} "i8>+Tg#t/t[gao̙e[/M$C (%~dGRgv}{)n\?%݈4e }>:w`چfы,וqӥ!cFm}z!Z*660CgK *7x9 .6åī]+1];@V B~^{ det5Æ(m@玫}w^Ψ�#\JyqDU9L&>c Ă[=4`bt|1Gt'8"i1nl5na2ǎ4>#VXʜɱ#"ZegT9+85l\@*j}{2~YXcnvSd}GΐOrĄA@+XX>nPMKEE7,jSM$+E\$#` yI)dLf6~u~z7ɃԣQ@CLQG?ubM⏠D}4ϫĘ4-\gf-u1v(맕;<ەk7_۳L†tO';?Z:S</}} ~#}7B]ԝbwNDtI6lI8o~%^mngz޿{~H%m|,5w~jS㼥Jމ~qG'sOĶunWrG.r}Z]eK瑾LVDۖtaZ8cxWP )KXq%YGic$ ,4G&V ].=ƶ/QְA8 2H&s[ ĩ0+\̚1&lT@Uͮs@Qp@7@*Q,.?I&*+M }=X'V5$g1t(0iUep;9>5?FA>\Vsk[ecxWFLr^(#`mN_ڕ;ZEWdѺu}1.D?ڂPCYE6ݎui{F^#ySgr80.&Ba/?+TVG~!n[ڋ^ \7 0JtmMKAJ& olvs'[ qqO+~?ľ(sZZ Bט &Zx`}0}Gk2*σ9W9GP^6� ?C2f$ڷ%}cȮЫU z]=55ֺ\ÒKZEfdZ'K,16vJgR#N !2H�CB b EJ*%CCqmbx%s)x>%j,%ZWOa]DX`t z"bE}scӍ8f3</躄RL )s2T%,zqAynyh61:*@Uiڏ˗cbF[o{X(vmPNx" m/6T$77�#/\t. Mt]T՚"FW:,?M+UR4Ef "3{ȅw 7sZ:( 3vꌪm]7_8#^0c @bm\E*m(;- 82ADux 21]AIA(f( $>c 6�!zq* %HNfלPR5d1Jٜ�T(?j2J<%iK$B 0|+)^Z9&ZPLhg~iԳ GGwq? V$o^YT: %<'sIcy?07G1CE5 K`}@*CV䘔# iqU@�waiLEPP6eOX=Cw |@@E +2Fi_{ၼ^Fh3^.0YMzL// ]+owkviAw KAlW m :-^߄ǐˆArY{Cڼ}J&62A)G"1y6Ce^WE<R*W^C%G5Tm [Ѹv^=]**S~[ItiĶUfCc^Usv*e*{dENԥT|Lo|N*z<Եx<}xiJIX^7RQKv Tbh wbceD7]߬m{+ɥJF ,.=\q�AsΥ1\n_y%ѕQG#_JT6cĶK]\1%?FehDv3X7ص YOAf\vW^^FpH*oZ[͑m΅D+Cz› ^\f&Q衼+@ev~z;utVKF]i,U<{:"2 qvanܶb-38r塝wp*+AyOES]o Ƿf _MV$-f (Bms Wx@Ʒm-Amu75Lq[l$Z#ښvd TxY9qA(U6ڕqQQVޠ{E~Vu{ekmA<|:&NVSfʟ&$A.#f 9zb5A6pKͫB=0k#K>u^E)L;X\ 6OS6f7 iz!L6iw7WCiۇrjq&6lʴZ*Ryb˨7Ǚp#G<elX5f6qqb}TEy-"}Ժ*UA*mV=e-GA?X1EyCX_|W-W1|5 !JRb9s.~H[ܽ}@Lޙ=V �REE/jy@Px&gbD?|-שnsEWk_GnLQEBZ�a- A!\5n =KS;)y[ڳWaDk@:nkOʞuČhx ʐ]X|XG# 9mHUqږC&%:%Aef<iRܢ8`(1htJLG{I3AG[^qrx M='cLmzJ EcM*4F3g)?q߬<, ($ﵔфǁ]"a+Bq` d 6H"DF*+U? quk "/C秬 kABe$DP>#tA>_|j3a^YE;/ Ĵ2d"V JHL5@~H% s'i l+bk&{C7j-]>hybv_n78IR~H f/R>PtO ]>v`y2!90Gc"*Re*: /jPR^uw$`az/h9Zj%ՂwlCE6PA@1M/W"2ZDnMFeBGxd>1&-T\_$fɷ0ݥnf+?fI7Y=`HNɼyاD^Ehz܅3"[hj?nJdO$�s(DLS x")$ =iLS4̂]䞽|Y2hf,._ACz6TLh12 7ɚ7N`$z1RVUY2p<3v03AÌͮ&E+IP. j �� �IDAT7=9zg2Ϳpv"[4cbN<ނ/OY.=V7R!iT0�?*CwEmʮW2(E7KnNKi Pˠ~Vzm:q& ű ab:0qWY [B~s&#|fzoU7wڵ@8iBy caC10*"_òx6 �+ Q ܓ2̖<))!" :30̢XRubPyڝVaH�P6ƅa|QU8K)ch֟ SbY ^S$d댌tREtTc^lBrƈqc^'<95c2s k/Ea}EKq�xJ5B"p /\ Qj -狃d|u "%ob*=j 5c(a@Vs@Lm#D|* E!~4:tO|t (Ia!�td3 iuz#rgDE6+7#Uf)؜ a㝋AR%&!+v}b H=g5wn_)% {;8c%t$!cJ$*NIt?hxlRsMƭ+j€xa\*]J¬o ,L<w*LD7zonjn?GlPXtpxZSFb*>d1z}w<|˔}Cͨ@׾WI}u]b%Y<j[jYcľ;z{u6nIRk7fp!jpP:<;T{1js<̷ h{i[*mYx|m] zfB뎝j 1t?ڿo3G]+<eu}Li* I "{3|ypH;fIQ\VHviX5_NS3(!SM2F!F#i挘QzWLy!c7& j+ l|y^L|,WȗIa줣܄&�#w\3(SR 'a":̊F#0Y- Z&r9!O\lBF١mϝES\Rr [<'wK nkSמ`B_'26%#$f1$ G2ZEB+^Dn6>炭 E-`[G1tZsOʪVpI*8' ǹ ; @3J2#DN\,FyyPA2|3AX"-=q#.ʧh-`\wS)DXA]G| z Нc7M5&ĤE;<T颟eRՌٰ7v'M+ivլF5xBbܚ^a_+efEoja(PauvKvCKy6MGi8Sĺh<m|߇aRnbL46baHh®6ya „1x?FAW5٧l$Ow ]cEY*Cor֒HkS]ꑉQ#&YYLJ~6ũo+1IgM!H} XՏv̱^ IVsbR=+4_l^Mahv  \Vh|k*gnlteM[v0Q9 ƿ?"D(P*r9I QOMun-2յq%^ǣ͍.FW>t UN>v#&IOڤVc-*X\U*OaO^kmK ʾE8\Y鑽ZT1Ǚ~ǔHlѕW/S'G lJ zMUM'y᪞0>ѫ9cJp!m.3g"*md xI._c`W 򨢍)L9"z, CͪkB.w:}= =Mڴ_ ή/l2/}+|wQ2*ԌKVGC1p7�1QC҉g6.dV1$a@5F}剰@c2*Ou_8a]9Wtb(rDG<Zj�s勘o?3h"㵸#I$C|Sr^�{%=!;t'^vDL=LirwhG$dCԜ QS~$Fr <y'gP6!c 5p/AX1M߀JXAs)?XpԓFp*A /I1@OƆW0 yjN A=]ڛltíkcྂŭAS5yN ,`o1d㷐p;ژ ˺i$;G`Smfpc7\h&|Gl-Xۃ>yM2mT˃li3  -LqmQqO)~;zX4oϥႄCnUoY xE^+R:$ɪB[7𪵽GH6|A0U"^#߷_ٽ dTlnRe!}ry;77=SZ>5_1b^]ko6ʇ͌CT/8F*vaTo: N{TY:?r@5J4'-"hX{:[{pѰqcmzX_M‡5<ز15́{/r�T̺=)uewb+~Rg!,Ξ&LCўkgsDD /v_!<О! Pdߑmd/.^dReTdO P ?9@Lrh(|W&6 "FH"vi.(6]!, oi*M{0R/eaX+Ek%rLC=+fzfƙ'W`Čqu~ ڟd_Ɠk.2 06غֽ.u׀XB'0m 7ZE]/$dbDO(>^L}猥] qdEUzP.-o QRX"-‚(d_RU�"֤H4,Z䖱-ܞWN ;7]]AY^1*=Mp&a> xͱZ(wĥҡcL P7أXR%Uk)WFS5oRH2/779K[p9؅ k<pK:|]AUkPE$ES#S*'"cB^矓[P<ۗ P^Nq53Aaf&ͮb᠘$QoCP݌͙ ~}d(2"#@<UWI'1ڤ�bz3r|d J:\ݩ W %,r$Ǻv#qNh-Bz[귍w�0uUg1VI7Wx{�%`NF<2J:{֌e:_W?˿Ua[+9]J[7x{CqGhk lGgՠ0{c?4?A΂+; >t%{2.\+*G{wQ|"ֶ,n񟬟t맩q(- stW*Zp5i.a]`$+k-1ނc%:-JSڃYG#=}r/Nz3Hxճ1Tm>앵yFz{[q;}:_eYoYb}.`][P wq˳_N7.؂_9DCs? b YʭNc1ËUz݌j"{->@*r["4:y?F:ZuH&&ʞnqi]56ٵU }F+="\ ]u'5lbVc!q ZoֽK88!cA XXѬط)3ܤLDO]tAL:1d4SۄX ]ym, YY=8o :` C6P2QQҞxKY:u_Nz<D\Aq`I&p#rɘ#.W"1 %u3Y(_L9TJv A=46�9t Hp0 飅{ID%H]Yq51#V+5cRaa15KدMAKlBIcBw;Э*#7bjr)L+G`=439m<iNSr.=KK@[ߺI@eSҿ Ւud oɪV2]Gk.hScͲ8B#=! ,Yɯ]ۦ'&tHz<c-f<8/?JKS۩IzlmCU=gWrx8Z2o<{#yCtBo; &-e~~ٚY %dJk \*t> uQmx[{w�_5z[MW ۯ{솚;S_7OْW"YƄ9V<DBOlNj'gk| ymM]>:zR^g#Ui/W`So{y^E}qnyg!$YNqWcovy;22V]gbF̨<'!8`.z0;}{> `U!"*̄L}f"Ag*вX!sl>B_HaHEۃCJgvr#P0I$WȺΩۨ>LaW+c LnNDʮҹA;fl2$t!HgðT8 d[.SnsEqӝL݉\M3&\ 眈vS 0죷 H¤2ؙT [;(KZyz9V? 320e5"t} S<q,p\Ϥ9 �~oc2Mٰcc}ㇲm"Xo) t5#M 62Tm<ALsO-6npaa2q j<ۂH)ZR(L'9IeAJEm.0Źk6y@ Sadt,NA"#rzL9n\Ef"T-/bfw..0 j(+ny0�]NMjȢ4lLRtӛFqݪeî#rDnRUpB΅ޱT ؒ. � p4r1ý�&݃*Z^SrfJv�p/~mJʦN6nJVyP57 Á2x}E "J#n\[q^euUT:+n͜u8VjJӽW( 'X5nL2N5u7fxw))avoX"]C]vRM <׷"" 0*$GŶ"nmúڌT^Z7B|Kí+0R/q вj2\Pqh.s+Z]Sɖ/5=#q׼ C-D?A, QVɐm "l.3ߒch:43/ 5 FAdjQq;)7{5܈v�anMzJbj:u؝j !1x_"l!fA#Y+ +/&9̪~U& Kиjdc2"\R9xg+XK�#\H,m;yȑBJ ><(fRo~Y$*N Fu̢3 >, I<RF X0JQo20C0]=k6/�ԉqd#<]HS6H=wi&3t1! ~/cbԨJD)RX�>A=F^=*e0`4qoQ(1יL:EnSE\ ' V--M7>cMNbyr>qZx0MFtId*dL+!O&\!e P3M! ^/(ϳ tĥE[C#P*ų,?4cB Q*P�8"[:^-+nbSEI(:s|qg>أk&XNl!ۢG,wyq犐]>3!jR$EZ)NEFGΤkp%)dt]l�Swif]HPU>rB%Ă A�n3S[A#~ #~?-Kdӌ\Z <1@u"yç0Xr@͎uCwׂf,ğPk6VLB؜)n9&  q%uvflc,tP"]/5`P:»FmD8{>`q�!;&gV"W-FḪ;[ ?jY0t,&v@$8?eCFY u-DcPH)yEW=cpON]g tK'\KQ$-eD򭡚.9]YEb%t@bv z]lP>ŻW4o* 'w]r0^.eCWBL$' PT TbRF�6raPKP|dMhO )XLH#~7^s> /ѮbQԪ]l* C;^]׶F~[$r<qY>*]*Pc̝u9.~e[Iw^Uɐ,ǹ2*/ZVoL­! ݦ@weG2m5 EZ8rjZĔ)]4x[OiҘ\[< uLv3NϷ-z3Y~wˮR/\9{.u:vWmv؊2?](EJ7;/4x'"~Еeyt*o/5Ukx3:(fM" LRM D>/C,fU,rTXT>-u9KR#XFw>lKK*?O ؒQ=Ͼ_r>F֨xgj&ygndnOLw=H=x?局is-,"vt͏ċhmm>eѣ%JD qq[=ۻ_.M,+wކ�U÷9 t=f6]L6|1|/~R Зsu.B�n ۝>-u+Axiuk o_8>{oDt'")DQvt;�Tq� i3vQjrD2T1 29!N\=.K3>cTkx]lDy); &¸'4*b[M7PTm2fmk#j'!kJ6rK ~W%ŒV"_Ĥh2F2q$r׸5f#F{u+ MYNAL8@F\Fm!$&Q*.ov rS 6Je"O8{IAhW?7:~M|8�� �IDAT~Ps9T}SkĊ4EN$a uu0]**mJbz}ZuGyǺ\exÍiebJх3{65񟵽fxVKU薨ZKW[P5U?5# [@GW">U#68oP,IknKB=?bm=x6N_–x�E&H^*mUT۸m<`gڭúgT3'.;.v f9cx~2be&XDCF^XdɤBIu0jL,CƮ�JDAٰ|jpVt5'hݬdE_sO؂u$2fSZeD>t>y.{WSB>{8 GSeԺ ݣ*T%j۹`K~+xťZ&Q2rd qaw>OV4%W9k"tſ Iy6PEbmt` 8*Yd'u쥈BI0qDS 3ھm-Y27j*;v']+XV�TI{>@E̜6 V;V ޶/=?IS=縉/yuU,57\W:iQ ܪ4CE8rnŨ^P7A9 O̱̅ a^.U<MM_jܳ�,U$rWks,DߍC?bYA`mtzY] 7F) SI&pcQڴ'_Z&_K,l&K.\>@3*r z᠓T_4ye篯`2ojx'a:Øg,C-8Al$ !>Wn\=q mhQ W텑;Vf?vms^ug|%Q,Lvb,[WtmϻT Wl(_Ljx̐;8c:20dY`+)d|jG<X-a_A�dflM Y7^"! 5f x54]DRbNΊmnGUhX<A3%!E&m7A O@fOX }a6cK`Rh\<v2$(g G?+S&K) DY$^w l7d8/i~J'e]m$G͇r!<2oUPplNd\lc |jcXu @L2Mn9~psnYrEƼ˓ֹl\+]L%Ezd$ñRO,9%P9ϣ1zA<P.;۞ȸ+UA ;T)^Y:1F"dFd𜰎UA8*Maaޡz FGsU,AڐΩ4oL&z,>GqЫ>Cͪc�24nrtI՚QnW6w s!Fs wW?zknoᅁyj7WAiҠR:[:&'wjjfiBSݶW=9Fwm号1/pcM4|aťn޿:F:p<ص^{fw+{%Oyʛ)Lñ]Ìv{l:p̨2yrD:0̣I̼@<pW�7P>FX?j#A<A|b5s K`$KNIrPLcPs."d[!Kz$[AFD.^rȒ?>A-AOB ŐJhrmh`\`m0*Y3GƦP H?C29W>48ќz^FigcD=b KDIlx2w[# =�*7DhF u:N.@s(X MQ�g1OlwH9 ceE,oN"kŎ_PZ3r(RVX!ܻG-aL>kQ)ԓae?A *ptH}7%Zf#nj{!&d4mmr͹rcejXv0CM}(9o ta�NR(r^`ޏ x(o{* ;ϑehQuepk a4lj 29GoEӥ."hq}AXDjb-1s9c{hO%@a3s9֮=쇟ƃzrDh{fG*ʮlI"9m\r{_�(awnvMpt$+q*Aį|/$-*#+3 {<L,'ENVp VqNdbNYjJ:4{z8Ɉ&JU~|BJԦ8͡kIX;o�$u E�k?v9R'ٌGqKx ?ĕC8DٕFX};.[jNKǢvʄ{ Mӂ&HDp[!k"8bzs'i[15$\:A"fd mDAG"uW�댰qN?E_8dũb12D+@Gp4EaD#r?%d$P>j=fЗ=ˆ94m#%orH`a_MrVr}'bz(v$xT'M]ǺX^Ĕ+M+5f8T0<|qߞ"5L~-iu;aFXOyaK"B~~k'AziHoF$U~qU'voksTDmRk+ypߚ bKh7.%^v#d߆7 Cǯ3se` ևS돮l.h_#Zia_7;E6\ݝ:n={}nփQed<P7P!a&(Aܒ<aaaSP�̓N6,H <3NX.</(qɠ7P3D Ӣs&2fDz;a'}dҠN�42y4$(BNw@`HRq@Z8\X2/\yVtfoq�׭ Hw OǏC?Gq!ךƈP;(4wM;6ȁ}kZ>)NnD~9=9A+qKrN B � }mE#z�b kͭMz"hH�\ f 9g gGל$ !5]w~A3Oױ^iHM'3)[\YrDӗGY~se'䄜|>'xs,G yl q[4'ۂ$EkH-Q|ȈyPσ%%ӭ@2Jlō.=*+~}l;cFodlh& 1)Jt5=[IUmv֣*Misf3Dݦ!6~ R¤ љT{5q;["ǑSֻ^@`+&eaJ29\iB$^uҝV 7 x(RRYӈd5/S9ڋC6"C2b(;}y'SwPilpIu[z6]LCbB.90摯O?Nx<sc78wUDj ))BQ#ouhT۞UKG^I$uBk :` :bmOZP .;3SdXuRpqD9 k;Y{NE! #F'�"Rm1rCM?y Z'ΐsFDWC і?-+{ܷSAnrQSq\upB5T,eOwFrzt?%@oyUϛz \-*h}ZbV Zq(y[+*j7Td1*Tl!UذQld.iSSk@zJu]ms1P`L~qh+k"z'1t ||O/s+٭+~.-+3̈́CA@$>,;MW\\9UfP؃q3VI:!9Lw-oet*/QϾ@F~Ͳ /+qhi4f?,.mۚUfp$evY'C^*k1{0O%zs?4AUMz0w4|3- 3 E:z/Ue;!,(øjU6bɲc=*D RHFJ_;2AԪG]xc9X0{̞SFo+l n,𥥼TW80Tf^!KXOd,'>N$/2ٳL3VNb@uy^@Qt &col$&= 0yy<V,ܽ@PM!`anS0ȣJg) 8ABZ;$#:4dɧ[g>M+RR 7٭*e`e2&k< gJ\.W*O?OĢM38!"وx= $s(zpm&ނCMh" ](EsTHMP|\o< ެr<ILNIE^¶ ƉXeTx $GԊ ԙ(d$�La+a4is(\`,LAEFXnTk#f�S ߔ.=W࢙A/??%ױþ%ܚg#3vYnV WD;&@QvML H?N:KٻQ/xzy䏿dЌ0 V`Щۭ/zŌ l <+<+_>PBI ;f8q`Ɏ =#)[0ދnd*LK[>,qCHH4ɼP{۫eϲRDUxn ~4u }]z@W(8rA e$fDQޥ' ,ˆ{iJԘhr20. +q.kRUlnK,NB)yQC/|Cd ;EbiI Yi@a{8Ae 2e (Be` 'c.y0KRRH[XZ՞Kg*%ĮIFuYN${!nw:/VJ~v*wD*$ztiʛ7�ߘmrW{?n,7څn45jM�Yѯn."Uh]m W֭µ%JO;?v9A,FFGi6w&-]G7VsCHoDompexo^~Wmw(xǛ|^9[f>"/6REq|sXĆ R}dS8飱ⴛ^鑫t2W/.qmoemWb"9,MA{i+c&EG}٧DrG:>^ vשB]hʅ9(bvS ”ԈK\yŤG8 G8 ф TmL]Se)Fۤ2=Hj:-.&٨RW$#AHό3=(< ^<l gWU=yCa3{hvvhLumi+fG9/3NE G\^)*v4R#_nQPPʁ~^1P{)+�MG8]L}.IYIϡn2]>] cc&K(ںL uj&YJ$CDY;yRECc�um%'9Z*`CdtqAs|=,cSY A&'uu[p L:ZDAy Oap&oI\Q8-Ly,Iu?[ m`̺7!x3x^[u8c"91۵Ln0"츸�4S0G9c I.\4out֍Q4OH͚A12�>>"a4!ħ4d7azԯIU\jG:;Gj6jKy{o5tӖ O/"5m}.L1obV녮q擧WSZGy{Col1G~ӽ Ftkk;U"⥵z'}6SM}TJh|;~ u7(fY?zm|s ?oŤn{tBzX2OG"xsXoF JmNvg^ˬ֗V\X oVn /M;՞ٗ˿uR`te9 Ҿ=l/rѽjQ75p>bX"f>6XPYz[ Eh, '_w*28x^`_S5=]e9>WG2ujY97Ư].lV&"z/1[^"̔m1w~m n[ڟHK Qfܳ>Q-Iw {#W1xv:߬ib9/ Ϗs{/2+Ř7J˶kw׶^E*8L u\s7IH=/uDկ̷(-t:]8gmh5p a(,.)O?;XG 77i[&A7F+3]ۜ[l}գgnܑfCH 8#qo~)~-^>]<G8[{SЋO$0ql>D||#T%~tىj=]]%R,t!CejaJ'}nuckUwg12WA2qoz^I|K^^h`<�\?yRjZE8owKq9G$#[McJR:hN#/8,f ϳZGN ~ ~7֥h|8};Xׯ7#M_L�<fOpLW-Ŧ܏ <>hd&0?ԚZ'nEWT-SԸlF7=Ʒ:#\<fJ_O;ۖo-ShRcp;{,!sYDi 鶹ь5yQ|pp e�5V*X|q٭$ |G^?' k-&؛ !U`r3LG6EfSB7 =Vq|JFG!GDMc$#:[Fo|+*e"A u]S*�V6>a%yn [og$Ų y]uh0]S`]#skXy7 d�-b`U.~i݅malj*Q,fTǫUWu cG$QQ T!Vb}i/ r*-k='֨n^A^Hª_2a4�� �IDAT+<- :{DdLΏJ륎9VBLti9=yYZ[uM)�o '@٢ߜ.=ݏs6&=xGbӋrx s x2e@ȧƋK[PbW>٢ۨ/V`eտXq+ʱL_X6Z~|D<+P3JQ3,G` rJخ 3- Gd-5m8{] 5g(|Hn_C?O5"Vӗba~ І6S!ʸCe파$בUHMU/]ٵ]"!OXl1)Zxq")bqO';`82<:jW(͋L '9ã<J b&띿Yɠ\Ys1j4Ѹ압g>޶u3Gc5qEDžU.F^[~v3'-xoUQ C�R>3OʵRx^Gʽ_ V{ۙ{5!wSk˪]ʶX6c 2gjHCdItߣZk/kfh=SA X)f|ز>GR|Xȯ4[9- ֱ&;͊9aC:}{PL Dv7PxleOժ%$6a[~#qMdYHJa-Oy2>Ts$Sˣ(Mbzf3R%(XY?:"ʋUP7z}߳߅V10FaMoK~OjU-%,.#n *?V\H6'P#nNt9/λ2(;O_eCW,H!P8<{D^ZyRvҌXĆ]b,+B{&P2@M~7-+gi/U +&2FѢp=9MC\Sa"}v~0V1ȷ%SP#TO9xx96y50`.V-@R[LCK;T}렒:qѻO 6]emar̀m [5J(02zeY\!JJb4;1cwV [S\ev8g:qEAiX#4'K*Ĵҝ`I%aQGQRc'ڝ.vt̳N�'p0i=sŌiB%΁b I `J=:얄<-)s=g笸(`Hg]Z9WY�W K9 *]B0:=c$zB畷xxY;f#]G36["0,r'P�K,WA( CAŤm)1bj.` ⪳n\ t40ZqKV{50;T$O($O ӒOZ g֪QV^g>+vL^ԽI&)•Fp.l M5Gjan֪$}M`JX详]_+ ~ ~m Cǒ Wޘ4я3ݧa&!l YW9E:NF VZ9|IXYORnNWIVz \Υ&0qnk?uo ΅I2VElW9u}ruˏbJu[_D=RfUy10jמ`09pt@y*px+3kHtC7{5GK0:!vuxo !7J oiVͬ3FulH u3F;EE{y W ~kUS/.gZ `l<%\\' dBϚzi9YJY4p!JǑC5&5ɨI]k;: B3[3#HlC񋣨] 9O+E,M6!AHN6kaiB +zծ")FUqv-F cH3K .mT苛V0 0!ʃѳR ZL!! -ZRBb.Y3Mv.lL;\2BU+N_]R}? UL`aČa-)M\ @_)&Ŧ4_q9Ped,n )nm"d?p*@Jۺ{<U잴" @*ᢠ `ҦjW`MלrA�ˋ#NE wq/ّ1o9kW-rĥ)$&qqZJFȳadaxAy*ʼn-9sڜ8$dҹ ytgYu}*(>gC*ѦO;~8S5%nEHȲ͝h*eLL!7@DH&ѐ6;1EI>f9oH <`ҙDZ4j^P8> n3Ma? >4rYBL`.t3rW= _dq|QuL-+) GE=3\`T^Aq8>?pLi7K ۘ=#{N1[ּYLP�u$gqm@"r"Ugq0`FK#,ԍ8T[ 2E)/.dI:g#}z+ QPkz>Y?* FR)lmb_$�ak��VA .*rkL̼8=p<f=kGbïkFpx" ?ŠAgx3c1 O\j& JPW8P2Lj~־A4%&Q]ōݬQ9PA >"+jS"ZBlqwioD7lג8ɢd}# [[;o_ZC'Է1RYlϫ0?p�„s N͐h[#L^P{Ǡ('2ZD́UKQBMSM1K9%t1+ZnXGDdof֨=̝E<o;Nh�u +"`8߽M&:|E�9oNE}㭲ױHO/GBs66-e<?t]/h(lWi\904ۏɦ} ?Hb_HڭƢMq |+ @d_g׺K 0d٥sR1 q/g6G@U8ʇM@~}׫|2Aϥwu"6J$4R"%P(M).4PTM:~51hN xvL#c~ ~�h_]{irl@4�=-]GGHPX3dO/(_|@Yu sz"ry�z9X� D-.2r_z" X>,oV$.Ja6)E<צyZcQD9:5҂31@ .B`ABRP&JI<l x3'(Q@:JeB]I='=<mz*+=*iNsNZ2P)X;;En6^w**lٱô~³j-: ),XAewdJDwxّ-Htߒ ]lʬ e}PTROXK'vlw# ƞ?9|0znvyI84+8{F° 5xTkvQ]{x..d%ޮ̸8 Шe #j{wKe ˓DG{:dg@773 Dr2en ѩ1UFqѾzBj§Mi7vGXzRA0Ngb8'RSNO i;͎0vۼ o?CY zҴXS2ci}ZkA<θPx{d}U| Dpr|kym [sqpI㵾iZ~N%X˴;|K#dgŲ Gc؝}ex宴Dn#hji:Ta/^>>G{8Ƽ�qAV 5H fp)C8*cQ"O(fG*GnvQsX|,ʀ%cv!AGp |tx{z%rܬ?t Y@ildh꘎ouC.jʾsdCtv! o'hx2 ^U&H[fS'xz):GV\f@3*nңliXE>{i<,C/:-ҸO^j8Q$͂c (?I!8!0(3^f1)04`޸iRL0l�80`9v [z+Lσ(Ϋ~9?c#"=kf f돞Bh�g4J;c1R]߉u!s!Yduc_5IVn_qrkXDHY]GE<r3qP Tۏj=_rWircYmeꤰ^797nG+mm++ m8_-B:wѵVBt~5cL}M/OWZR [sSbl!bE,YۏnGWf ԭj=h]]palw,MF^ŋXkbnîcGcη)ѡ2fHo_lq!cJ1e� <6=L'p@FH2/`-I:5Hj t6 yf>=jgK@O/" Lۢ82TR&*U)8jxҶ83Ts'G CwȮ6a)�β@m1Xou x�nji{UZE;S!sxڡK`Wz&.bn.ob&�G_i% b8<nXIktЙ=POXIt:*sG+kv࣐;@ ))7W"VqE/\ 1BVtȣ,i+:)}qi(ߝqk@$hS+]=F;'#L gRtuLj$OݓqhkgB@\g `3gmd􍌇:<5 w57t5 (E <apzY\QB)bUŶ٥zbۗMR)G/ -Tж]ɸpeL@k1gEdi:20LdP u_ G lg0-$5#?[qG"њ.3#QeFu@_ܝm}w".fv`3J3Fft`39]D"=i٭x''(Jwap104c7 ,L%HŌ *#J;X De`Rհ*U1J(_Sw I$*x !hLyX2!"a[cE: ^:Eqym x8T@c=>vƹÍA?M)_17$ECYK^`{6( > RIfa5@=8[G@D=>كL?€.[F0rnC,i;g^2Vh#<NX9�EB2t#@TN e;VKR$ [yl2Q ewvVMv/hi,6ĸbzRH!1= hye'ݖ 1KLtzF㨩= &p*t9q<ɬ: x;OmL&wc۷W4a|;$2xH K 5%Zdֈz @(`~5V@bn&57DR1O h5e L}bB_�J7 gmf4c%K.|9#rH|h=Bjr z%~!^ß[+rĿNjE uPo.C1e9-_16T|z}̋tM3lhɼ:6?HE= kqsƇHĭoHsxofVa3ͥI5ja=dkP"bmRA53t4qt8-f_؄ll}OD?DDiK|?FoM1VٷӅ[ؘ?lVb}Ӷa )麰Qa%Φ Z廦MnOT?[sRZC$EmF\s FRCvlYBm: z6혧{u/Ul)0^Hkrӽ7я3Z-z6կ|vzimPlKsce}[;߫NJpnU 3$_)OwcV#<E~-(=-~qE83Vhnnn:Y6ODNI?xn7Aw]@8n< h|GeYN)"zsi*"BO)J @X$#=/&d E!%,9~Ahp&*2Eˮ&͈qd#KƁκ2;nO>'^4=E?wEcQ7d^Xԅ<!?-|jCoh㗶 ɦQ7dJ~5KֽOPnw3 1fNq9"{Uv'֢UJ\~ߔu�JG&AFh'6G#! {L#(<fJ0Sh p1o2ʚCXWȖq D>]+-*̝a޷'KWL|U/4=/|w#e8oj/ _'TĂVDe$#?h^Uͮ`o5ouAr9[ xK{q>¾{SE$d ύ(4LF&qz�;8HtH="Ź'l`!p,â"zY|9IjEPo0"H �m`JW3qﰾk}dc*h9rteᒁ.{{.ÔdGâJ8 X>X9j̋[vtI dCz層?LY\}ȧ b\ _F5^WJޕ$3F@_+30>^o%Cs<b8"V\ce&zt~?|n%1ooבdI?B!( @\⨩DmRS!�[(P\\!W$p1޹ 3 Gdcȯh?p!*^֔[�G0dVYB @O̙1SLv`'*~M Vbes 7�� �IDATʥ~Dtx;mŤ~TBWWaxB:INdC&V'%}x!q?mq!k<u+xY?.TE+mFFx;/jߩיF#lZg\}Fe6|$ ku B\6I_<^1mjuR 5�JulFq;%HB^\n16`P?ˎ@q`IYt*ɶ m铷]-D(CykODn1/Oȗ`%MxGgN&䍖/$KnB]>ŕ&`%}$ VK٪Pl3xaĩe K S q4<|B~Kv6c[z \;K.8%6ROBe8wC釤z#6"J6_ʫ>&brt<~܄7Jƌk6d]:W`QZ5PT [OK36XB{N35URJ//VUw=w)AۥyGp)vw;@Y}VGCϨ6IDz[;Fx ݉W"f#lRsNnMN>.{&lJrZ[eOPDT±4{ƾicM)-B`rSʸRKy:!PI Yu%{U)6Ah3|2>ץʤ;uieAn w;=|P R{Hw,I꯭lmIzS^eXkm_(2ͿYN P#LWwc++5Lt^{3Eń͏K;(p>J^)Lz-\=b:rs.G7w*e;qFގVgvl`ڼP%ݫke-peUZIk3{Tpj]-pinEr.C嬟=Sܾ'ʕ\D|+XjxnJZxO+]ҳ</l5Z6URS3%kaw8*9u2il)_6빲mzk~4m0_}ы2q;:kXl}K|x'M<ԕ/\3&-jLdIVz KƬIKE6_h!zAwи0k|u}ivT| pi%9#EoΆI\ϴ/s}aӦe˚2DYNk[Ş5p6(k2}s/ezO-mjdb3F`4۱n;ʔl\R[:b@N]LdW7ƭ`rsO b%JAV{b{v~ѽWx -51|sj!R\,"Q1Se6Sjc,F ce]D\d>_Kn)#?' Pˈ ,PbAAɐ4 Yeȗ$uƗKSi`¯^{y[&OԶc~�'yBZkn$ZLSN/tnuzlǮb^O o?DY4^[W.faFĥO1Rsi/56]c'v+uma^)rUo;vҕ1�YC16+SquzT3[ 'z2K9w65Ce+YQbpOb$MjX桶S7s=S~[ ݴ"'翳rk}sNRQary햪%Hlp>EY; _oēVg]jJ(jfܽmBt �B$~5hAi.IOGirɡѪҦ`VṌs]otVN(V"H(\,ςp#TC10xx|,Pa?PN0xe˔=HhD|}gIf֎UmۖV,8�6RJ>iIP7rN1^D2½\>#n9rwQF^I]3N޴߻:{uEz$]^urY*Mj ̭c/^xv&,C/yz@+HY1 V^DpOpB! Az-ƒt**'6IH^7g/7Im2pTsBL~x#\ܔG$"옣k.{z#@SMMwvn =&!K܁"Pxn p%dWG Tb �aпՒo/�`yŘ;vi$TdH[COQ{$l _oiZ?:#FS%.wo/W'+:Oӹ-=ߊ FMt8|OJ ΁Ci8H7>eʇ,e`ә[c<I"LBI•W٢=\2~,j`A;1Yt\"j}Іe{ݫC/H;C7=wS C̩N~�oiyŢ\{g6cꣂl%w-&CG4'oM 4PB)}23d-zκɧB(+iq9%g{@GKr"s<{ E@Ț$G̚-a!3NZH0K~*yzTȨ̡PL y (Yp0JQl$rt1jӓ�4+Blsv%j�w[{CFm?J6i@sMk][Xr?<Ru&fmG ;M#B 31˫ERv V$2+ӡV#L\M¼.jU7Dk�MyVf7ZX\ػȬ29r<2-q1\i65mrQX6Z&,E-<.yh:?$yxMIcSAVW{-`p�>ص~mԞ&Dz<\@Ȯ'UvyI zgr7U+{z⌕aNhw$ FWR>|ofP2(pIֱ+92 =nd=Nut9+Jr91Oҹ倅9mƔpN=̇|E;ܛf$ةfbe+F7bK5P*K �eν]Nm "Mg! ?ff◄AV㽟Y 8!Q- b]8(ɱ^1E-=#8/ ^Blxg١,ή v^ Z\Ɍ: zxvCkvl!cXD:bQrNL(-IښFHJˀp #ž*;SIx*^om so>3T:Pl=KO`d)WQm6]8l+erx3:%-G-+ؑQu|P3#rCPJ: -.&{k)1ku]Ї~[nבWC$8cM'1mFW%G^=Xni鿪Ԅ<�@ @U niSemvS F;a;Gfw; kX$ zO蒄i%. 팕w:'cx ydwK ~T0)$j)²AGܖ|-Z%a!ڹR{:| ή.iAb-~e߶ ʨ *?2*"蜲񖣬OPd+Ne |i$BOόh܏�Qtrr_ ӰtrTj"$I['.pnx3wV/&<}Z/Mӯ50Sbjĥ-/_Ax;ީf.++/jpi !9H\fX~Ȫc]7#{HV>D4&qZJeKm &gZݘD^L7dmp6^KɩAO; :L|bӵlNʔ|#j/W ~YvO$4I*%U]?YBQwLUUR4qD6$<WEWޙ"rLD`/M*H4|OWWs2܉ƳzU ! 1j`( #Ύ( { oX*` n*7JS]|C40gp& ;<L[I_{? ?M_Ƈ$ n*uX%"0>%"RZɺ2-ŽR Y})y22ƷOJmetRDk諨eF![> j+a̋AǼnG~Ş" -6#`ļZU߆(l`*le,?  8^B@g!9'RD6v -=#txH&7GJz�M]óX5wVe&8x2}m.Ij;]I]%Rz> +6y}>;1Sp7iq6*pIE99�<UH)e}ê۟K.cPO1Q{*VZDZ\J _iR 9N/U# q,xУƻH C>|)0W5LapQ{kҨ4/W7m_vڭcTM0շ#Y~?AE;Tuj8K.%2BlCvm; c6!T__;qg.Hua* 4VF\DDmWFT:U/;<R<W[t5 k*;:Y^ vGGSW\F3'BV..1rqb`/*H{=m7hGP.Gg<=vla %c+rKVK.{vNuп^t+MhֺmrUm$ |j\<zc 2*'DUų|pQ'YcD=jqm. <1=C1T3c[!,՘P\n{46C[pָ8١w4x6k]cc対XzH!Ү8oA|r^X%(~lnD Bc2w- ]u%.LJq PsUe3V".|AΣ;\A9`?UW!ӌ:�P GjjޑWȉN:Jj8?劆gMH_"N!'5)g'Mbgq ia=!#mT^P~W֍,W^ܜԖCj.+aϕ#ąsdňRJJeץpIeՙB9Go{֩"~Xw$9clޕջvVLViWW#DcR$vm熫/\Dθb?_%6,t(X1'<j9:g\%cy</nϷh&cE01._D_iuQJ85>&H]e`K0bV|@m<, y2>qhg^ ?ܾoCL�@f֡-lve'8{mtK{}6b.|]6պ u&e Аz2ZQE` ye�kHt_m>yLOF.B`T2g3ݬ{MpTx"8Y#<*>'$8+LɌjPWN17tT(vMw~k3_{d;uO?|_o)Sͬb##*! K;.Ԣni6~m2tru,7÷m2jyk Z#$<y [R[TDeOB~v܄b@?>:yy˹, z|5p ef}@:7;;VciQ?=PRW6PٙUVs:P앓n+T<s.6;i|+,&?Y.Vō߁,Kj#Q4`Q2Mhj^f>BĸjϼV($=]ԙtz}O}<Am؞u,ðN 9=X| =  dr쑷m*⫉Bֈ{gIn6g{;Bí *$g'+|/<Wm֕yz54`. ̾‰2lWI--zD$�ۊF%?n L$ #!+ jON?WU-5AY�t8oÅm_=ӺL#nB:+̵Reqf4 %9>?V mb9Ήoy+XeުûJ~1ȁ6lvЯn\D )"!<{'c{kpq]Pp<pYO/Sڡ6*mivG >?DZDm֗eOLv'WrsLݔA3nf’{ -O`[h;^$(cyJƠOBFMrsܖ^Sݩ5^O[q86pL!�KgSŌr"p+HL.BDxUDnz0nfAH"M#7FA.ml<_Xs}. zkYp%( &^߲z[gnDx1lLHb6[/Ri߇(k"ɦ=9ZO+a^w{sM@iJdBNpf`-.GPͽ ZݓKSƦ$@47M~Av/Nt{!s#=6b{f2ܓlrt́FQ`9k-[3"(m>`kE BbWR!r֍1>2f \70)4TX]d<JcˢcK{N{X'ʚIi鯾;IaJB k4Ե\Ў5}.zWi41l~{V@i^0!k�mqB %8H5.&ȦXϱE %vG5Ҳ2hkUM'ղ:ߢ <$($n 2ftI=NuK}5<yPtI zGv'y``焔IrzW%Ε Y{Fѻr.uscq3VܘQwtvQK~chxo:e2m爔1[/b3Y>؋mk P!8sX}Jzt W@u&"%'gssWFo![ "j^-ʂb1Eo@ɉy^feޗCؒدNLHwǰEf%vt$dM4TFFI>w!ܑ י~tnz(ce` "3ZJHp,Z_Z͈Zd9Sr..<8 /ITf69��IDATM3K2y|$WyWZKne΂}' Ж lL *Zr(zb̠P0VaotcwHigl>EFJOpq ]u찹Yv3O}vJnNw ΌRsl1= xmJY.k;14G$n dh?(ĊK}&g1AJ;߾k׎'H`;<aQ$eB5kND3*@O9Z27ڮHep!u!0ga(8H*I[jDv{w9 fe0;bd dDy۪'`5clSS+&[dt+)6[akQ,̒W;>;2{1ZAfcCƉ@;5wj{Dy$ë?-`-GO\@)K︳[5bZ�/J-|@/Uj2%Atn7V}d륷! wWjW!6YgzHȒ3zZWԇlS ¦KkY%LӀ& [ϸ/lZ§RQiK�U :e<1 +DEj- 8cqU_-Wn} ؅I 4ARPNޓ˜; a MtTD(kQmg u=΄H Mձ]\$ܒT;nJJ-,M:>UbQW INGc*Z>cU8ܖR.ES`JdچTtڤ~"NQܤKI.!t^$k6>Ϋŋ=9M-SjU x]F0?Q")7!U :Iqj_ĭ˪DVQUEn^`᲎| :ͤmycH?߄V m<l?ָxQ:ʓ~4EcN\{ # ~"O�R6mĉ$kؽO D]�cUM-[Wd&Piag;=<?bht?͎0طZc JLg<z.`EN<t=bp8L""Jot>ÞŵH(*cS01Nȸ׬雥^>a̧[DYW $23{~YDĊXK2|^}$PA4TYl6,sʒ51,0~�2جvaa@!m_ XNfN J()ud8}dawh4MRx 1\x,.s`'~}7pX@-'ɱQ0M?oػ}tm yFDbwzg&BDS<rd5x|'A2ΐ oHN%D%C\\i?�Iz-+OnJ ò/v@ .6 *98|Fճ{RTcn"oL$x1X:pybR4n^ r={+U2Ӕw"RMG -Xl0j@PUxFL䜀;3鳅Mۙw& txS3ë%\iDNft.ςV"Ò|!} UsЂp*-#OPAtb i4 lw:G`YJiU{�?3DU=D>ŒoC7kK9Zw *^{ UgǬ5xL!dB]GzP�0t ~s} tHJj0 .9f+33$*%޴@kaծYz ֻW6+l:ykU=قQ!4z8<*. -vDu!Ȣ1`Ӗ�B}=7/fꁽД/DXp6#Q)t%h�7-m>'W(vk{فn?2ZI`D 5c`wG$�fO 7A_3Aغ xtI2_ʞӬ9ŖיzH^AHʯ+wRqV7'U\Y>t^u pQiɭJa!|'_wi&XҼZٶ&SU;BK׏Qݬ~?_G|Щ񘛵zFoq8,WhCL|En\+?|YdrNO!.|.Q+Y rq֗Z7©0ll+Ȼ_9&QqdP~1R5,m�d(=3hsMżq5a)Lm.el\ա?υVQڮ<ښ .}UgHa_öPv[ǩIu5>/z v'a:n3%hE#7tWJ^/egmy ]gd$x/TԵIk/ *K'ڪjY2GXC̳WֺQd(zK /],ի]2WzOw)kuTGтsAkk7Wm :g{ⱒvl`fke X۵C)Sϑ'ֲ6֩yBx,ɣz[tfܳ{bM8%ߥ!$BWrrWXF>,|U.t7t7Ɩ@?V뱂LJjr BEgGF]AUDk~h.gEP<ʖT{jP-mc~>3WN+ÓjVeԼ呵^ҕEK.E*7u&\gj[yq\GH�jz3K8t$ ÌЃqƅ}Z/&<+Cx 8�"BL}hiHJT/?O}_w_Oq;"""""~+"""""oԿ)C^ƪ_-r/~?ZRf_?,_C2c.P0"cEDDDDDƊ+""""""2VDDDDDDdX"""""""cEDDDDDƊ+"""""2VDDDDDDdX"""""""cEDDDDDƊ>7D/w&s܅xH_r+wl^R9""""b0ï~o߲ 1"2VDDDķ_GeDƊ3VDDDDDDdX""""""-Aö.]+"""U o FDDDxqo{?'Xőω3VDDDDįy✑"""""t+"cEDDDD:j\+""""Nj`^DDDD ^ cz[:+"""NQ|X?vDƊ+"""""2VDDDDD+?/)IwKwq/"""""8oFDDDDD|?U ����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/filterimg.png�����������������������������������������������������������000644 �000765 �000000 �00000132270 11332353404 020725� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��B��"��� F;���bKGD������ pHYs�� �� ����tIME2B�� �IDATxy]Wy'}4<ٲmG d38%qtҤb8INt^+BBUQwV*$T*+p*P`Yc lY$KzgGGgߴ<{9᛿˲9w?匌C~ι {ǝ12222tO=ُn/9`3bdddd!z'v<m|ǎڌuL4ܿ�W{m;qX+VV\yԩ\ڛ́ǟwn`ddd9:~*%?snjz&ֵbzO^vӱ羾o'?}ҕ'h3ܺo*]ndddd 1vW_tW_#L-Yz1;WMLM?o|W^q+'eg6ZҶQ^mcK=۶=v.ݺ8w|V< ~vk{я6FFFc}8_kA؀^rʱ㻷cswx圻7#XfO͗m[<x'y?]39cofG9܊? s9W97?W=e=콟ޚOQ9*h|{ȵC5:7=s̙fV̭[y|#;v^M{mk={wϭ\vefGO鏍M8^}Ѻ s]wϽ0>1휻+f=vK7_l]=ɲt؀2:`ԯKLݗs8?;s~¹1;JFFFҹBs}}o߿K&k^OwN~gkO>:sMK}ʥk?qg^|bjҩÇϬ`||9.u=3^|uuW_d'ܽG>׿?}P3g6;vnvzro?W\Oʙ3s_/}No߹gv-:.0so{ڹez~c~w~{m;w-^ׯ}S\|f^-]2s?K|՗mXUk9s#cddEq:_zGp;ڻ?6^ K6טYj7߱Ly�yCG;qrzrz|ǮǞ|~fznll̹MW_G?[3]zfW\txew_\6v>݋篝U?*\gv]%CG/yuc-ڽwW\r՗O[>b-˖L}>p7];=~go_b_}x}o7ڝ?kǎ>%S?e钩Ç|٬k/]zLK}Y_f%+/u]u=s&Ȍ"Yc}UkMMO?+ɰ R<t3;Mrɉ>y:OqMyMqι^ﵯpC|t}nb--|3ιcO>r|ڋ񱉱_VXzO~_'\٧?lx;W_+-zq_ON/[_50^{V<-WKm~յV>ľ]v%S{qlb]WSι?k G>=r;lysn[2=u|r=U^ڦ7_?z ֚֊1Oׁ8{'̯<rĉǏ/|k_yo<r6?׭K'Ks^k}n7^ǝsSK.ccכ[93O;]c2O\|T9711~ѱ_KLLN;v>V zWq]|ẏ[3{kOXsrsgw~{u/[w~_\~sn#~~YUͬ{nמ7pof̙3.;##8gln`㵿 w}>k;}㯼Gsn/N-rN]N;|K?zw~G߸l]\tٕ]vs7o_:3/=qk.]ι~뱱ӧOOM &SO_sɭ}ճ~C=|ƻ~ۻsNNO^yk;p9~wS'Ll9w1US=_lSgϟ5+ُoz/ze3t;s_؄5.C9NŦT6/ogmcu>szmbjfbo=/OMMNLLھuڷrb>v]Y.psnΜկ9zy)i ]pޚ~yO~/vK/\ܗ_RF H O>=914o<ckW_)w%K{ڰ~ݏ94buo}Г/>=~yk~؉.0Wy{;;qs:_7/<rܰtԗwX>j'9s57s^U_j͟;%|nɿ۫mc5>kOZ/WAz廏ݰDeO?͕\'|+_z 篛سxOX\?lFֵ_޻yuW٧O<ηK/Z?6O၏ݗ,[915Cjt_^}MW_m~ǧcONOM8?nzՆ}uϜq;qw>oz^~tO<Dob`?~掛n{ ox<q~Ͻg'9/~~\6k߁x%{~nzfԒxϜFFF1M>-F\ځ ﵹ <7ߺ-xo;w8M掃ò3gNvN>/]:Ϝ9S>yԩٙ?6dUk''_؉cG\| _xz^yUϹC_<~3O.Y1tŪɩy̙ӳk/_}sn+._bvwy W>o3;|`̊Up==yؑ~lf=YvfͅZzٝ?z`S''?o:o⮝G<yș3gǧWYdSqSG;uL;vN{'O<9M,[fԒl?~Pvsk&&'i222ҧ/>瀿?t7K"GW9OgͿݷk~c%xfwuWϱzccg^s^r;wxTs r?>;3z kcSSιɩ~lrzƹlzf^?WcSιNN/כpz[`|l76[%+'M,]s빁^b|bҹOqc_zy]q#G+_q돭\{Y{c^/sgٵL,Y-?}jl|97d ˃\3gNn2199>i2(1Vo}[!Wզi_[_|^ؑ}nwz銇Cǎ;yG<d7^ȭX?'g&+ {ygV>+'&,[Sϳ/xk/?CO_k.<zekK215rjt-cdddKaZ4;5-}6p*>ޑ]];;|`S~|jɊUSK-Xedd4tؑ{~zG,[99===y֩8+V?te||�^߷A##A~~ɒe+WźDCOK.Y>khD%̲eݺF #ي%N3+*֘sG}12222J{sIf ####.і-[bqqѦ(AZXX(}b֘QĘ1######cFFFFFF&ƌL32222221fdddddTC~o߾W3VUy)è^[=.5 wnPUx؏ | =qJߨOs,B},]J ϒO,֙ onnnnnn߾}ZRaOgTчDD6||.}+qfASQ#fʷzs _L.՗->yoͥ:^% !mge-J3~4'i(u>Jeվg=vMu2A\k@ꔱ3&CzKZW;UT[%y/lPXOf[瘄>ZbK'RfLivMq'nqljˠi>�DT= , c<hXGK2e]*qSz6US*Y|%i4r+1ʼY'jwG=I$De_uQ[6ڛJ/=1D̛_*cל# S>iZ{Ȗ&5S8V3F*.8m\ P.#nq rp셴09=xV|fXeR֢LyYK|'əd5*nDžAų\Hj`5Ҩb-e\ jRj�k8[ynS{4W'?{\ лww?k}߻u6222kكA/Y1{o30*##8lkh>R�L&ƌ"N@"J2#C⋘5fdddda21fdddddbĘ1#####cFFFFFF&ƌ䨦nl�addddd=kl˖-6)FFFFFc&ÌEe͛mRwzkȨ֘#YQ<R&ƌΡ__I02Y`cFv*:I wv,6fddddd֘Zi6 Pm] dWi߾}? SH?KϛWV2I<A9'̭_N%;1@1;::U=77WbF231MO_kC㑬j&=uYl"2FOr)j[y~c7PPZ^fjM\չmJ7ad$G<)YF㟴osnc Wy4DNMsߗ>As[4742AZcs5D&98J+v:)Z9pAHmm\~$fdbĈ㝜d z*$7M9F\!SLJNj޹I<;~ju״CE4^;wQ4{~z űƊjEb<M?dYA"C_5UxBj!dJSdXzXi)OGUoRHa >^!�y5=guMh032xUvFi621fdJ%>`43'622221a2ll####c]-[$uj;Z3SȨTĘ ##(e1#####cFFFFFF1(ߘVwXԼvytЇa[7222k�7hM3\d^hB=4729�5VRK(MztN2Mܺ>ѭFZ/IyFF#M=2zakpݜsBR'6q&8x####{J$[Z&t~آ*Žvv⃯2221Ȇs ucblDG[*{G###DX-u ^jU07ٺUU(dp#:bfR�JdQ42n㐈1ל'䟏V$dA+2"722jam*ԩX Z5hUχ�89M&C(bWd30*###a,sYv?k#f1f###Qnu՚_mb̐ҡ^ Nߘ8-,,$)S8\ȴ[$$!#kgddgz=l5OH]oWĘ.mٲ&C7oI02bXzU󛗭 eX$21fXLZ\\I02bp^zIJĘq8`2HH-6Ϗ_忁HXducFFFF]n'հ;+J]L3222iv`呰҅ټsݒmC<%e,ƪЫ0ViM dad DGrR ^T7OH*h`0Wmdd2s*zW5Xu)&t*1O_FFFFcWZBAFXʖC(fA.3jY52 )[fH1f؉FFFFX*Son ^Yf܃Q4222Ȇڨ/ V^*wCx^]+0Ԍ3c$Vlu%J7g]#Z<{dFFFFM۠_Q|X.)'ն�3kLl捌g*VU.#8M?K0X}Uj+ɌR&|+G :g[ffk[Wʟ"S䊬E*ʰbWkRH)&ƌ[MRID&%M5Z&lbhM(ub|N*YW@oLlXUVA .ν  əNFFFU $k&呅kkoRL Ę,mٲ&C7o6Ch4-\i7US)4~ y2L)fH@@F(<"ՒmL&ƌK [hUj<YdFCBΨ&\y*j@?=0"&RFfbhHd3Js< rIS XC0'+B~l{2ʼnTzzaӜZZ@:%.Ya瞞Wn:v*W/~lv՗jVV1kyԞ%U-Mvڥ"�>+nw\Jsj'О[P,s7gJb)sFw <Vk޽V c@tX1ԋq�Lo^Wꃖ,hvy M.YKV/a:ez 1yEyS4AFR~阵I[cA! W_3W lERk6бf=S 1w�� �IDATmuk pjMx`٦5E=粗I9qpR TOo1\Œav)5W F@\.]RZZH-Ӯۚj7Kr~ 0$YOccc6bv!9lHʻaF KAj%Jū=xm۸q9_UYPe,1N)y-RMKSVo'>Dڴd\kj$Mӧ,ʳ|ҝ!.0MUb s-곜?*y>YE\! I )Rk%S,KV/;gE@ V/oT50電{]T,$DF@'Foe&YX.R {4h<CCyF~TGoj=<�Fɳ{g]\HzY]s�yO#C{DWTM8Dk]Ӎm7os_{ l x*JR/}T |n\WE&ƌ"!k: 6z1###$$ݲyw6=sX#5~cd-m#H4]!VDL22Bd6UL*}=\l1YڲeM6ol d djM֞afV&L-..yPشUzoU=31f -,,$"Bl_Q#/>s~HEJхe*%aFM[>d=ZdmZ V*1###$* &8IHR ^\@w;k1l;Wfkm]Z*psSaUJ:-0ꇭ#25tjAQݭZ_^ޚQ5VfA}D^ A/k ~\کk祩Τ-(Xc&QQA�Пϼ/^`t~Ujq-,zj =)Vկ叵#i\y3\ m d$Ҋ@k%JP)G6v.bgP]mJeʝ/jPU:d/ѐQeI<T~ﰭX j4?BEޤTY{tBdL ̹^msEO+t +2}7MP.\ yZO"TŕU ;" SI-\q3:Vl|Qy#soV3S1YF=?ܘζ2S,ǚn\S�U N1! :ʾȫphB،9J 'Ȩ3,@pHX6O:&ƚ7 oa;Apdw+v&ȨV =W4ȂZ<8y>luRmΒ£#aY4{432j"/\A*X >F13#zL]Yruբ;Ę2X_Ȝ;xUUyaB18LEaFFFF Zt瀴P;>‚M- ؾjlb,]ރ@FFe_#gblh˖-6 ڼy--ЈW'ټ{`WMƌLE[ [ P/z`W9T6|FcB""(2r" pPQXRÚab(]K t?̡Wlw*ZE3dNbRj ~Ul<#xVmȈ~ FKePmUN|j;Ζs*}m<QˮPSDC{iJ T7cc9ʦX5689R[M2D֡FQ`#.b5=Awu)V=8 42,B9fykgE)\^### ^W5Ye9WizMOV1fd%1tkAe{9ƪjS݂$Ebȅ~z Gv\' ʖLml�Cߵ'Ǭ |Wuwl ̑322221f#####9H0edddda16ⴰ`` ddddbdmLulb͛73Mh d dddbAhaa!b f322222AN*>;kD^柢+翁KmvG(]kl_9;վs:E~ܭFg c:]8#D1!R?/ "eSw4 /IC̹JVrL122k,Xe_�h] )VgkffYc̥D\:]4j?7)eddb,TUo##ލaXq5M"3źe(3}lSk9"2lZlW&zűbrKԯE$ j]||̵ߨulýp%1T [ȶ:O'%t9>L](< 7 d}32B4$J61fdoИ?H6olmLII2##cFd.u[ ###c&s$KHmYc6)FFFFF]c[lI12222JV5͛7%Kz߽b+)x5I4Xy,ʲ?ਪiYIBnMKg$]l>K)OWW5qv<GURNhdddda21fdddddbĘQj{(@Nj}h->XcR;oTl7gG$eN$fo|2ҙ!8o,lO\k2Š޼:YXHHxPlDvӴLi)yoNlӰE7gִutbI/%ːr"Zw=ok8QXê)4o^^Qy-SQՎmܹv(W5jo8]{AvZмbI/%ΎDQN=n/,5l)vWέ-16}kM#{ȝC-7A į~YF2.}Һx!je6ē&DbۺR]YJi0{;htwf4b'}(F,e+Ԅ@MDڵu8RB+q\G܉"E*?Ŵje D {eb,1q7/kKlm#A(\{ZwZAG_bA^ܹE04x:P>N_լ0jx 3WUmT 7T#3 :8>O}`Fedddm'cFFFF>##͸QN6FFFF~IfĚ5fdddda21fddddaw*.,,DSܧ9.J6]6NadnOgn޼dQ ẘ;xx9:L㵂N$t!pu \]Nިo"jErCF9l>ݚNh('s*uL32222221fdddddDÌ@,Y4 =K::j[nM;S6|ߨvF#cX$wh*ĺ!(oTˑZk,O[GRD_Fj6.ȕ tWPљo/ 騽xdRحRV-g4 #A2?9uwu/[3h$ [9KyvpOs&˸.joT=AibL(e]6aFt+tp-ˢ̀(ު60<SٞQOБLE}>u_U8|RLፔcˑIEIalCux߶\`|@|Gg^.#w<Wut-ǐxgu<?fu7= e DL[z:=#JF~;BGʟ:L&ƌL32222221fdddd4*TvJݝvz7ww?r`{7ol(em]wfw<m|q####Q۲eMQڴQ=1muoqۚ0sOy3'4|\UƸJBPʲ]7e*"B/0m=w(}V{[ܶ $|0M/V6\ML@zwncuhTO7ĝ~6!F$ьĆ>Y["CaDlď7NƌrY{*^;i@K_Yj&7=^DiӖ#cF#m"kn$[5=l:'?CUs.ݼp7r҈̩h,6yHWX&r?7UaQzADToh6(9" a"MF)7j]z2)ТR6`K} /żP4fMq�7єG2MRĘQ =ϞoEZK]b# ,:KLϦke4^�gc_/jt̩hwj mJ41Ht->R-UW6[t͡'s*V!$qL*W>J9b��B%?H<%Rn<MY8d>ZL+٬V.X?BcGCGEG"M߅B$VMW%kIQJԋoo-k '}PfIT4ұ~ k`IiX .sy))ͪ\Z#SH# lj}EYP._MT/j ]w 9ޟ[1#"r'98^(n7oϒ+ Δ+p~wDzA]~7&KZ1#~E?<*rV!BCZ0.IPK"tUg^@M)tpUm>j wn 4#cFznrUyW*-f=Z?ù"fS@b:<P^%YȒ: o&ƌOBTs5A0U ] yDRP'<zF툞4t%*pP.i@|Ęɔ;ZZ%eސe"r5.Dښ0=hlM{b*JaQjL+/F( ы~w\^-z*2^e* EDZ f '9pdrs=n(`ֶ kSǝ[M!7H-d[X5Ί(R97մ5y*!&q,5 qo];ANU O.:J\�_n^uuBSWjqlt]b[5̩8ViYQhĖB;:\2mTͧ0Q4Xi*,x8H{rIpH%)U YuTzzi:cm6:#p=N<AYU"oCޥԠ%(Φ21ff+*BJ9GQwd� )v+O ّ>9,�MY3Uڴr#ATg }hZvy5I!_[jg-Tw]W$.[|eNĥXKY4rlj(ȭJ=LXoE NՁ& L]Q ˚zzoÜz+=ȨJ&Ɔ,}haU%V1,GM7!@q\&p7\#DQuuU[o@CFkdNšlQ<�Yp,m�_9S?7޶tOymrRd"eC&:#҂G+[s>Ip]'h-I~\ "`&L @Jd*ht9]^5gC-c6XsEPk4!J܉bb(!wDWR;&Ovn)[Y:(u^ ~qŘxN*)74Ul=`'q<�~)^b`pR]tʷF j#`MM(Y5cAAЍ5 ;,?WS޲{ RUq/AvZVwۙѬԼp^L@oҬРKWājU%E]:=Yz5B@i 4<7-FɁjWňr`Yc&D1fDFX$�3&R4S.=UȬ1sh0nVEأ{:QD\r6wtu_x[(4jqmHǡ.8R5ZN<!=[;͵Z3k,uRy.QѣycN!b*zQspR 8J2˛QbaC) i)a;EK&n1m.`"@-8d=.CaYpڮ+ rF^O1)G^GwF4DBsLf: ϱO%'(x\2$* :;JHi]aB9̨TȒP KmVSR,\ &Bq>g/gbzXm,պt1{KɟZj :F-dX1)&^V<\Bw �Wٜ)A\{8IP?XN3䬱c\B2gyeHP(]JBTzYb!$'ISZ9l5 JXWV:-XgXO y|eK$zp~j6>!371 [+C1YԀIS\Gj$Vąn a@I 9ƐH?3]u ţ5SI!5M4yz@azyps| R,㴢@mo1.lΣ*؂PXoCC 쏨]~[h ߘTkLwÙte MD-M Gtۈ6dht"c_\l7ȡ Ѓ;7Gnr%Cu.QL2vŘ&+ͅ 5=j[P,A4E &><B)!ih`QߤYcچn '֗Ҙ Fr4s~6! 2RF},zGY1}d^N*>A+觇m!ϕ'Fk4$NlQcM ._D26aDnΙ~ONBr0н*}Q�EM{xtŻUY8] ԤRHtY~L6r9ӰOwA7(ZBrh1tX/LQ1٧Q( fkǩ0J]-ePRom-Va gIb*KK뉫`řե'ƒw!m"&v 9xݘ+k\ !PzD2}3#u\ڬD5zURفAVe\7.QNIa_JĔV*UxhŹ$�M¹&sm\%<RٚDy6JV'&~X+샒@e[JYd8>OkηhEZ4 2 l Ik}N ui{>lBEt$rҀw�� �IDAT&>2nI NS_m1u2=XIÒe:u9k*);&nՈ1bPx/z7!Bi&I;p%z-3([% n$G_dWA!"ƈ$CҝX̞f)E#*BjbhNGV΃r V^%>\fuHsoRYAR;ܪGug[%$ (̎E@|Q 6a\RKEt@!4Xdm)z2KP3:_DKW t\ff1a-d1ĩIi4bMrѤn�H/V,( E3= _;FFbLh5]*,4S/7# 䞈6r]afeYcrx@:Ɓ>,`rj6Q6mƨ0LX0e2MhdsH1mgaIg %tI,'B&ukcj(j9IW 1!DqR//ZP<z\B_iPN*Wjk4h|4�RXcΉ;|| *MqV^}Yē~oTG1=(!VGz>uՌ(4#q%[ݧ0@ttD0aGaq6t/v~jeX b`3CgGf1C ޟ1vb[I�yP*R D;!lrA1V͉L"71(oB.UM#ؠKAsJyA+jNv[CtHZ�;CXC '߷Wݻފ!XqjDӤeư/hs,.: ij jJ7hsM3�y@| IIzxz*jӂ&" Aﮠi>ל1guT <+g(X4͸XbUj� j rѣKXc "_Ň&)Y^A ^]GqplA%kJX!mDt%hDf=8R:=)e;IJL7o ]|!)z_ڟf^Ig܎;ز&E1n $iAiBu3Z"zYl {3DS ^Ebpר8N4tzB\3Z.N 8BKG6"1 .a<AjSPBs;( ?|n<˃; :IHH59S_ |&,zi+$ qlQKq`:TiRQ)//5CCveYI, 5&$B:,k~i ewImq`Nl�9m>>IX9 iG&äMhʧH-˟f"A V9x hgpNxZ] FiՒlGG扈1rQ(z #zh) X x)n.N!}ac`nmdH9Jwt|sOlLՆ/d+A͚N#>$KX?DNвk$R%&1A9>l? mD*n؃$,,~ZU!/=N`R4bLcFB%)P̤ځuϢ˰8AY  r*]# ?" l#1*Bl}J,` ,:ӴmY+\*PAMG�yz^,^EIGI%JxDz 'M/O)=b X R h ШT ~Ӵ^CV݌7k e$u/)'Xp'ł=6 Q*[f�b9/Vcr1&R8~V cWjDC2wASo*Y'%WCל)ueѤt3.2] TV+9+ℎ$%P01.v̸o.s.[I+(B! o,*+ўsv31qiT%g96DsW|m %(qb5n1J\hQue@_qKĂA -!vϱXS+ACw:\`^dϸYz1u~ [gts Z+SŦںFlʕz!*N2(B\O W!9@y (8�Tc_ҕ(~o5ωbW-GF AR><tghQS-ĂKT#7AfS`ND[Y2$.NWz$#Ԫ8:3ky=pAͩ,mPWf4G³W9bM鱓j;q,#z-eǠ?O KRМQz4QAZ q\C1鎯Ҋs8Vt JwxSG&%}1c֚F;pfB. gACw!MGCDU%4q 2vJ2$nJh[1."1&"NIњUA5 [s+=AXR̝b ^9r6!z.1gZي@%8UBZ``5(1Kc<`f14c$5,\tWA?: X!@G kI/21AfSΌmrҬ1fm3 (8aLSRxB QY kEuGrLD48ݦLji1EaQV7~zZ% tPLhrK9H ٔSb u׌6bOOw@$Vs@ND�C€d̳UѸAh#lQ�oI9)hf%gŘCL% cP,tL3.(�h?$8CDft-.Ibf/AX\9r%op˳v1FG TA%ou(R.O5�&Zz@\0u\PaUn*F؝ahBqf4?:PF7M㾭 ='aO .B-ţ^i"{fJ\OG5emW}..6ÞAʱUEmQLcsp+꠾nb�Q<@<M[k#K v �<:3Q-xfvn`EtEfCWIffgv!ȗ1SHҊka#z5FB/>t͔}Õ!^F̫BD, Mg F$ƣOւCOLNmJN vbyBŪ:LĥԽ>u*[- bRYƬ8`T aMY*5:SA<$ @鉧341GZ#O,hك(" e3z@c6!r)eX޼v?_Dh|71hYK/b2>ѤȇV"poWP4@-A\MbTbl �RVa9]וST:xD߰qOyds [H-7#``4 %ǯ,knq۸vUoW:~0t mwR>f(^[ܶbjGEd%[5Ւ}t1* ]2l:U+:*G4`[7m/๥&a GM{vmtɐ7SIID(EԄP{,<P%X^dWKE_ptѢ&uӨZ=ZqOiPĺ[ъtr5@~MW܊ʟzsRƸImXbr?PAݭ$nly_7?M5 )Q+z ^E_8r/G ՌI \NX,ooHʈM2h'1>/0y"']LRrZcC0S,FV`Yvµ"Kh#YWҚT]Dgt|ga$n-a$lKX\ن臶${H4ƍ n¾UgLGA{A0Y1 ךUƪ)MoBoBI\dYNX@MUݓOK$F# :(K@t&Gn !\7Ia-OIhZpzhWb\[!.V/6ojrHX;D̗cYRWme4eyc Qt 7t 2(6+vC-F:muczGTSk�5{U ˑk:]~i`ARID';sVoMz"lYnx_q1ܣܩyYzy}$㻣7bF\xbE@ {@ĘZ[QFKIqRV!^e<'z]tP+Pq ǞAY_WbGl:*pL^[8Yhb,Y9Zj+wõDZns̠^0ҳkqt\%Qrng&ƔVǠCPa=PӮl:׋RG \#Q ŕ1\uBD}UeTK̕/iI:sJXC1MJ#ܶO Q(;ğ˭T[@iFoԣ*,BJdR- ( %|B53dF{ڹ.4NTU>eZvֹXHG2L4+UO#}q D^Gt#+z3ADcBaF$@X\ ./&$bxޤ (\ m+h- <%T}5C{E_!sD3hu/\KĺDI8ڸ4o fqi,&p3NJ^֚+}}x8*Ա 2!|D%sC뤓JܫgT1Sp}ǡ&Y>6>J<)bꇜ% _ ,+R\|:?D(1# e1`1{/2E(7EAfjZ:DлIrKDhv\*34:X؃ZcF32Nt.\j^::_3t qyk*Iw@їC2e-W~/Mn9'xpREr5kCG dq :]g!zg:'qItKFs)3x8pvS)BSm84M[$j9tDVN^a�LI<ik Qx'1ZhHNPXؒBa/''.z+󍒊 u$"B'ӣPR ?YΑVWZ嵦 tCZcVFM?'UC4PlxZAmijU� &JKY#A&kMgߢEpR"!u~GWzQwJ( A{%"w ZP5ER0pH]h i&`oY >w8LauPrEYoW<ZsKŤ3^"oGMS қ6n'yEBX~AM$\K%U9J �Z0vY?6D|ƈ:=SC)]Sa0oX<%tsFbE`7tY=Bѻ`B"6]d7zRظ TI˨ѳ ceZÂEq !acmj77WJtW4 bi,A:\{nD%'[^3"ʥYë [cN,}@ŭ_iR*`s e?(KG0p%UXcIWjn1&8rEY86\jVM5"2RpKe!*nb1tW䘘Bɮ=Er֍w~ )K(asC %0* JYvwNܖ"]<UM &L+J:LD֖ mزGtKԢ49rn!oXGh "U@ ,ツ2$U{Qg@pFͨR UCmx(JCGȒW"_;p1Vhm\D d>LErvǯD ̯/=ބi. M"Abp{x^"jtQMBu)n\!. C`VmVX—E(X2FD.: oAٖ3DpՉm}AVQnM 9R0ӉuсX#  rPf WûԨQiV;(_<qON܉1+FCLJ`A8Et%1*J iѓ,P*gYlE)ѐpS63cpx]D&s5tKz}+peuDL8Z1ZSEVHfZ.�> x+\.x:*!@E5Zs Z=$,Xjfb HGW 9qMYruSeBe蛁'pռ3 6ȡ 5ƛk ,D,6;=& I<pL)DazWer[^0QFU}X]&ĐZ︪v,n1wB�j=/8)gIzyPKYHǥeۥ4e ͢8>#wCm=0le@tda.A+-.F+y7Zhh+k˭$C * UJ𖎉1'6#%,o`9J\ Et /~{"zDq+o x=V'w Kc.�Mg3.⢃փ?)\AX a§'D{pː?rre\h-=G7n<Qtioc4eB#Ơ ,�dp(l WJgƒJ2 Rvjyh "SAU#cZeǍ6|!f?%?EK1."g KZuN}(S#OEt"Mi%qU�ZQӭ<AVp/ 1&ׅD_=GzQ#4Vo\ !9Dɰo*HsUП0\(^bMɻ-YA' 4VӭCz tO AD,Áy 1�gAC5q+<&Tnni25r]cq^{|H00,7+9g0H! &A5XMB!s<bL"<VGƙ[B߹)ڔ'e>_4!K!Etea[@V˜S-鰀0JCyζ+\A D |mY6j.{翑ҩ9ob8ӌbEN6K7bcFWb3]D;8\Cg-.a1Ҍ#ڢ ٵXSqǷ Ojr,YkH"WދIl"% \yꚣBoC5S@g!dS(fH9 Jc(]o} �e!r@[ q0"N ťlKheMUZpzaI1S9*Ըafrιne )Ҟ />=T~j 5֤JS)el/#t΃ڰEY+0]ɲP7SwIQʥ"Dpb*] =f�� �IDAT6`- כV} օ`: |K7]vWySQG6(TK%6RmfUC%i8=ALc*hH&YHե_Rc$tܱFp2#.^G ݒdm3C'\bQh@^) W`14-B=\ދVPF#x E-f4<bCy$p+M m*t]� RR5!*q4=䑈>[|ywx!x+ -l=zL6ߞ^8om1eEcQrx=.K ,gtֱ;9&R=͢<pCH#崷ИSl ͡$z%.\:XP|R+C1zsq#!D!QtWvF\ ʑA#,nzJ# 1:f(4Tԅ}EZ\jHB(J[Ck<P@t5EUN"yXW^ZHA:@K߈6 3XǀŊpH1@01b3t6JI'Fڸ ;}+V-҂ᶮTXWȎkKspnĸҚE *u^8;aN`kL% q(gJgPC8ǎC[f0HkNk=흄ر#UFcB+rh w�FQH5kø>@bL%n~(wdyx ^܂ʅ]s( qM̃ *-у^3H?TBf!(ز2rUiREpdpTC!W垑.PA[?{%0cpE᚝24Kϟ5{jåfӧVQެlQk)w5M/";}!Q8Jv3ʼnuy5"svsrUݭu"+~j h@6; H\;E{wCS&$"wDI@()LcfĒX0&LPGU!T5@klkCh|,WUuib nn~Ihx,To@ v (8b5+(!Cv };qƨ@#v FG(fSĜ.^ЂVB{ɳ%U޸61!/hhdkn(,*1*y^BS+m1g/)*lo]-f v2pJ3d"9P Vѻ%-]1he(Jh6$L&W3N<F C &V"bcZb,HĭR="u\PBC'70%bKtyW: w}19?rQ:rrK vP:X3\d]l-]5h j6Hb8TAiBCkJj[c!bn~Hҟ�C7oW~& Áj?> lh*ox%tOs@1̃郪F#R3 g%Xt!GR(q6p|}N;%g$<(͹jkgmpj W^ݙ ,bKQL%458C[l˲ADWxٽ=5Qt&e C1 -H, ܄PutTFϵArS !wO@SܨU32l-$$�9n#4iNG$9tL4g>ZWfmDw[\-QI1mr$[ٯsп2 QK*q.xVK~uKME @qꁊ#FHQ'nA )saestM~Բgy+8ޱT"Nx0:O,=D1F-@D`pnK.(TU ({pHAn.. ~*b!?UFC Plb'i%Zƒmuc~ xH@ 3Fd7F4 롦1]aK,"B aRQU+gf.&N w?3@ʂpнQ.4QiP˶\Q-rmEm6l Ūm*Vۥ(O^B9+}7mcW=cå{Uf[4Mc'ةahXtNuMuB凧?/`, lvgC'Ӛ4 MkeƤQ<2l\UL;H@]{=/ \AN |yW؎wscaQ]P1*ʇcHA,D QKTr @R;ͫ|zb�6f-ioѮ[p}$ƴt(<m`!%{Z7V\F02lXO7&%U}S&Ztq[ථ+e$R#N\8t$p'âRCnUv!~;ONJIh:,7|d,TׂfZ:O -e G?T0P+JekW\GFw㾼%oY)@]H#6I `TP6=<Ig˛O1&p*3Xr\!N0:p1 ZJJ@X>$0bQ^+8DPk5&ށ Ywp R=~gHtF>zIWj~-$ts.o+Xbe_qUmb*pJ$Chyk�Df7) =R<T1?v(gt" _)R"Y* }c[qCNveٗE\MYw6&M3eQjBߋ ඡ p ZxWA$>_ݙ&ͻ,,{4yZ!N3i\nڝt�9.Ϙ`Ͳ%x>w֦-DĂ=eKГn@UP̀Pb5=Ek QҌ; Q:=q�e/ (PaQ3jak' ӥw"h.]%o[A�؋F`DX W1,#\ yk�g>,8 K6YY)Ucӈ=BH8a*Z`�/Jcr.Έ1ͷ|C4!7%mJ"Ī&\zNeLBjjK)LHs�A} K I:MMQXln4"AI NRI1ߣBv[7Vӂ�P:IJ.= "&y;Q1~C dr٪ܨB5 ŘKs yxQ¨Ht aN@E2{\E 10:~I=4HҵD)ˉ)Ï^BZ^{vPK5<SF?EerY&78"#S#tsq.!ڰ-bmEH7pIroJԗ)jc@1v)(sY%nٓۓbQ<@B\Nn pL1ƕȀp/p_ q"'V=:=n&^LdwYϲAk>,ݡ:!Q ئ2=%c*2vh s mm#b˲UAk!Thg%͞⺿BTIЄU Djt\B zN5DP'tι&z)rPzMm֌kZ |$68[ȶNemۅ<'0gbs$!*kvTrucHbQRG@-\hpAM+%ΛԔ+I.~ hXgp,XA&`y\O݄;,ab:Or9U Yaĥ!+f䭭D+.RN�X:*g&x egEO8>9Vp,SVaEOZ(J8NcB[<IGLJ+7ނk3bB.h ~woȈ}=bLG<u&58cT]Bu1eȓrg[ )v �vPX%Hó{ĕk%Ҵx ܂ޑQBw[ADh9),65y{t\t$G{k$<J@(= ]T_͵dP8y3ӣJگ j�u*PQ~B7یEQVr/#69d4m-%7 qyvKuUKxERYZ4( S0Z%:|0K,EUkCTqSCQ$;b }qYCGY!b`2΃cgv:٘: EM3k'&z&n9<{G{abLP˫ZA*ܩz `vI灒@F8i,\m" .,:˛@ڧF/LEv!5ݸGECaO*bCm(#MB  S3[fMf{qS1M QP <M⹠qe=XaPzp8 _PּS N5\ɮ EN2*%FuRN֖r%?A e4$1 /;SX͢7ǔGe[ΡtK19f^Hqj@]ۉ+{0nYC.W#] ?#�dϯBJWBML:65&[$Ta4V=:HMjMz&}:6%v7IRL[‡vRә/sPƝy C)ï P$Tt%d ڴ8E ]jvju;c�AL㵹K`wAt w!VeA$%ml~!)-4GP#rh]^ b#h=Zg#;Bc<K( (c`"(1ǻ kk;a3$'Ɣp.dEƫRnTI}gwĒU|(b!Cn0ȂY8TXJdɦ1sgGQ"<Mu}>:=1v(}+wkr<CXBqm�7,v}"(M'!;j#ns-1Jm2J'/hBiR2/p\, 7"kL.)=h2^tX!?H9Fqw ڸ7ΰB1 v NlPZ�TJL%"Q=^m>C.~ftV!W~ /#nCXL˲5EIϩ;RLoA 4/bwJ pqSs¹AQ-䲻]ІKh$1w P|�|Hټv>*D<eX"% !L \ lƔrA)gvl,)u=-B-^+u՗[ V+DG{3 yQ16J .Hbf%a5m;�x,(z#{ġtݲ%:;R3 'ڧM{ߓ U$Kb "]846.5y.?hG+nJs)/DECrqvA}j@4KUh+ƋN0H` )j56"1܃LVۯK7,OI2u">&3%dNEʹ%pu%FCeR Kl ?#AH<E4+/!6t<=p d5b!� 6cĞӇB$ fL\OIf. gwsI4U%OEBtk'eJv^ڍr107ێIN-G"EF/5J!oru 8qCj\pc 0v+ZGtgm]THX'rkX.9$ Pcc,93UN-TK̍&4 5=D.=TKHAU3D..CcE|wSY5N7@)MSSNXF f<g> ?IU[z(ɯ=xhDh6f~[&+(,.BjWS \ԍ^$T$fT gh3&^j|Ӥψtn!1vo¤?Q9jYjv{эW�7bO:탥(Pɉ19tڅHS]#@EC;g+&sY(I?( 4]d=VGC4 Wn(Af25r+).ag%h[OD3:Tgo}xN%56ZӊPV2P֑Y*IB",:G*uc@P�%Ra$)m> x闛8'R<+ؾ:,-k /^BuFq5Sgs%DxDB#ҔVޕb5W(-]:Iに57[8uh4Cۂ%qlBG><6nA SmwQ\'F-68N@E b`(tk5ŶQ ` %1 UhłgwYVZ4ZRA�,PY\Q9:%YH2ɢDzrXM]ؒ_vهǨ]AMLވ‚a[�agE s Ei(-C٫2r7!&(@w//֡i8۾1�c FgD/(:A^AVP:(h]!-?r"! UxV~r9hcH_mk3lezCq W%ˠt4)UOwRT[6**lԢJP<*Ȥ\''(+Qmr.>}R>5]/YEjgVF;pL( L"O.7<2Yh}D x24{Gan]j'Ãw./Z3vqu!ь2%,6:Qbc,.5}b$ t* p㲬?:]J5B,ܛ:`>lQt4IJvZUJdrMp:y1Zau;GiYW.ܓ󩬢a+4h:E-K1hF=1&L9bFчFiɫ(QR ! sCj=r4vHxBSUߣ.R@EK;&tƂ3t$KLtέXP)? Oڍ ʨ qnj@AQƳT GcEuB&^y.K Ўg\t H "LPxH:b@Ze'5y'<1&)1S%-?0".Ersb񼨱ڂ*r5M{6;TAS4f4D ~ԉ*(dzc}uTr $Fd`ւbq}-$hyŵ$fJb,}!Eק u" Xe=˞BgeewA iwWh B\:؏@"=Poཎ(óy8PFLjw@4s?zSSt\nq]'ϨvXl,k$}1x$}QiRn޵74we oj$#8 UbQʒ@`!^n<u8F:֘f>c3Ժ逻 bxoI �6os px}&r&-/,B<1&%7`h%/݀8t9t!R�� �IDAT@Qt, OȩЉNlȉ1ʂg07Bn4p1ܑ\ݶ$/Xjॐ,S?> kŇâ#.y.&emPC% j8ˈE}AH+'k +kKF%6٠T Gw%gQ05/Hg+Ԟ(50N$Qŏ RH1|-BaJI6v%Mamo奏�˕8 1hq\|bN=EKHHWP9'$AΘP>Z"~uopjWӅD++|)9WٳCuJ\\gܓcj`zrbrX ݍFQ8?r 4S B8uWଶ;Ƥ0 %s�t7r|箣meH`SY/hdJt$pکVCA&{K71[IÔ)W\̜=%^>6ǐp;ަYԻ@?~ iMj$<gʢBhTVctYB-Q4.T$Md^JD;0>6S":.pB<8 A(:yA28%yDg z S *ždڬO)VntT5Vdkg+ҩؕ3bsfwm |zEF8˫IOb)UX \b' #uٕݯ$qҴTUvVb�;F1*,zPR40*QDv@i(l5"|8jm⾬4`�%JNQ]sMȚ>J` fwYJ4omy=Z\$Ē -*T<](P4 7ʨd.oJ8C ! sfJh>GDBy4yCA hn[Vfƚ9}{uجX Pr+ʾd{hjI%hv8@e4Fo0Ɓu+(! 4p CMk7$Q9 Uqh|/^0tuS}Vn×VL $vkXQX z!獩=x+M y~Q㒧E24KT�*f["X'0ɋAU0{䱱bc]ԧπMB'ONBR,W`%,%F#Z1UfF:1RIw( >[<G g#ZnH ;)EA~q&/8ޗ]W%'Ulhī$"qhR0 _*;IX\8P5c8xhʱM?ݬ x BemD$r4�g(cʼnL=nಜ%!Ds 8DyPqBbL:&!g ӈY7 NzAxy<^%@:KOE1|q(J{^Sԩ$@#4; A 7*=.CE?h%Fm:bUnS({u%û:ШEqKp($j>U XP$4u-sȕS*1X'"lA [Q1F$1" eaV[ܖ"d}t`G9_\N ,t5]r%n Ѳn;!Qrp+7KQX6t,-ɍˏ|n⌞8+pڃ0 ('񦏱ѽ8#]Ls*u:1(Uq.+Љ0j) mGE'7̧eIbM78JՓVX@4g ue%ѼNdAGDp$ HUZ n):ɩM=x7qt$zނ fkzZ([<B�y]Uu)'.Hp1M_o^6ԋ/6wEt�J!<R'.#$ �"߀pUz1iXr]p<ÏYΆ<M +]Bat%j 1#*X% m;{b Q>Qc@ a>I=̣\188*Ha7oҊM1UL4C瞸C4.,G%!vA(#*[>f3 2yČӡs8} z 0N��݆kVbwco.WB[϶:Ïwe �ݽ޾Dp٩ QVSk7bw}QJ7 bt Dk(/eq5\nM>m6V1K# x.8/Z |x&|&ZAi~c? 6蛠s)f &Aת5'z5$=KLܰhzRc1F]L<$:>Ʊ4 $CK7>p$nz Xrori8%:Eyl):In U)ߠESs:br7ߡ03t@(yYZ;U%5"U(BVQmEY4Ð8&Q <X桔SZ wy]PegzrI(q H R~'̍ٻc:@AZc";}HDvP&4!CYpz &RjZ#)D<4@菌Fo*1_CwQ)!R  WgWi!g N1QrX!eA)[咃"baϘ!ѭLZT;u2jkG%}'Ƣ:o'{A Dk=h(B;'rxԙ( BTWHkBuf k[9Fz ` +N UmPh4Ԍ54'.eiRDcPVw3H76)$׎j2 X@Cs;HpĴI73Aswu[ gz<y+3%p _Wӆ*1X!6\˚l,4 p'縻p5ؔ#\jX}RooXs%Ϙؚ_:+I4t`+]."mňl΄ܐr>g LG?TiH򋹖&ɛ!jXp%{fJd4?sDag=d$u5׈�m wCܝ:T5إ>�=gՋhoY_u"+7; &F G<)Uj@D]J{sprl5?w9M{D<ΩlW_$Sf$<k@~vS?Nr  4\+'* QG%5eX& 2~$U<dņ4<TGf'1l×7}APzIFD.kưx(( "3)SG:EXp<!BeJғq^ZSmFW~`ykhLjMT[�K(2V3h?\ :|n_ LTEi&:04zhh<:$ *bfb¬@VLzC* &#�E(] +?E%jJe^a9넲ÖAuO ] k-W%#E! FtrpN4= Í$K(KSܤ<lƚR 4yS̘WU7%?w2nH6l&80۩39?m?9[&/TF|S. 1c}]!Qv XIsz+ Vi9MZ,gy)'n]t\ĀP9^쮨'N~2G7QBSƜ0+%Ct|`&ju>*BBξf} fz!ꮀf3ca&cWcWRME_�1�k'}ycø{ژP4,F3s/޴V:qPT"`נĘ!!P= +=3f] ؁<q̤X'ׄ)\YH:wXas֞E#wѥ͘t7 *H#NXaq:ʻE.O21bS6\It`ޢf,?5mЁ`9Bt2jƝ<u:3yV3՛#E*L2[槠Vqg2pXT[Mj :\Ȍ( 韞�e{{{$_F7aaC"7O*c(fL1aFy%Y%46QcZE{]plPmDr(ܨf�qD(u J߆U<oҞєP&SEOշuڠᴔ `\yc;KkБg@H~$ Ԇ6D$=cJ\=b,iÆ)CnXw XC XZ2+j-sF278)wKg81?,Vvœ#FaDS:Y R+%̘'iF$Е%C:ʉuB?S\F׹(+@ D FnHzF ]uQpyXh54[: P'Έ4h#k=Ed]@乻thok"/T\֫.S'7  0.5GQ!i@$}DJҰ2c w}ny+%�ɨg>I e8i0vQ *!0Q'$]牐'&R,JO yA- ൎ̯a!s�Lg?ᚽ~枊 O& &GoYV;bVhbb}<8Ś=dq (߮"&%zKEdua뚔%$LcQ3 M :~& {"N("2-Nle 23H>LRctxy@4u)$vm+mx5(d韏\p�|hX0?]OX|w\Z&WE*mvԌ˜mvNw̨] YހXc󑝑Ӛ̣tnpt!ӌPH>8vA+}0mMEi1)rsD�&? 6^犈SKx_P!cYNsQ0c*w46SoLWe/zЙ(�.Όz Fw; 1_hƲh zWmm+!Q`R$m#b!*ԱY'&ʜNlh#*q…�ޫi6!I7BP؎�<4p =IO%Wks2жQՖY d)3&A\x2lXۏ;n4o Se"ŒQܮ[EQ@ P}'@,߄@7PE/";lK^Yk?[G3W$!l!J[fW+j-q 3MêK@ۃP:=yDik8Ya S;YnG]$b~> 8=Sгz(܆.K @؝9EzXTj40ל:4?XW7I#?g<s) IK`?u=e3+^$CIʿݔ-th,Bh`܀`h͑ 5#t#XUp=e>Gc _V;9c37cvEM:eW)W `CgM#ӝwZdBIYYKoS%z"Q P|EG'Lr*|c:G?:vo=Ժ (;Ed6 VS{B<(.�<QH+``϶ :,+~gV9)T[0ΙNƀk !bgaӤ) \iZ20ȼƚ(*G%ݚYj.Hј'2@]6:nVapa`ubq3p'r�ˋ=vU1f,għy6ωGs2c&3HaA[j3+#2ߪ5'L{fD {TTDy@0C/HǍ#a+r3#%LN]j 3 _ HSt]!gbđc 2[G޾NL1+9z&�y_*)& ֧@#V+KN"4O2rV:$㛐HzXVn3eQm &N*FkxXC9?,]<xWh+hf"\%F0@UfeA-<ɬӛƦpI:ߣ XfZ}EB?O)mnʁ"Y!J1xQ< Ri2[?"230 pSg] .}G#o)V\R36%dmdc+KjMIג1Vl9#tmbnR UP.Uߡ<wM6%Ӌzv 9YkX"G6/,_9R^0+ i�ĝ H[Xk0Jj<]qH5D"t!M[W3 ;elth¦2z o(/d9%Eta~ġ3'3ke&?~9*Жΰg)xY9{Fc"Su&9X.d=v#HY2�qCz962[ ~29 N43b4.0ueuӄtP#ʛVO)I�BLQ,%:ydm9EXSC'C'ؔYvxۡ۲UĤκ'~[fHIJbG$ Ygs8CȪJvHtEhB?'LC!moqI4&Un)@K}Gef^SӞhۣ[k!^K" =aMe>y@Cۉʼnv+t.)|�T懜y �Zӈ*L:I,%QYLƤi &O]Jb6"2GE m7~MGLWĂ x᥇&f,9iW4xft(J_)'ғ yvY<-+7N>igI2_W (@#?̏KF;|8P5@5g7Ougql7~z+Й:oy<0ZL% )\(0 NOhyjdUNf!ɵfr7=}<.`zOF -l*"벾\e;\_fN|ot#0\MG,{Sg04J͹870j�y<(wo% B/aƤ(J?0Ȃ ݩUϩl|)@gbTM0WXRLJcqz$]>el <Lw_YZ+' v|7t[RϒS9a3I <v5pV0:+ve vpy蒮c!J_l|=YfC>Cj㳑;3c2y&(RuePDBX(cS_1춣k!"'=kF9L>ь |QЋk�� IDAT&Qa]g8ę^ju- | a{ON#711ʟ+4hS,`tFjHkqsJq;MOnH 4I>p ٧$q+2`Dӧ?'C*B1`$L\g(R:lG`zS�䥒�8H a"kk15xH3\}dg3EA1/C&uV뱅#fxoCS2w)2O%}cxw}bU_361w5+Jt''ɚ q荮~QjZ79鹁18pD C,Z[xĺ&+D ncl0%݂Y~M׫~n26)KcJaBMAIU% ɬǓFFDGwga oϸqg#mo#$(Y L?;r̲ Kzpd dM4`A5Owӧw$A$^oc N"l[z:8%D<Z(yGVU@YZݖGYv ~nS1?fl32ꗁ=HE(e #{ L(+H,`<"w36cyU|g&A]rsZϲNK>\(ziԙRg>K o0&K}Lxy } L*f1D@D�΂yIH쀄</' h|H1+[&.T$2=sbn3hF �ͮ�DXyEud0tEh9YZm m�[+|X�@}gF,chw(k8KxNow�n | sX@diZĬ,lhcORg],-=)CL =RrŹYhN9<,uf�n+V8SG�_6"sx tYh((D- ނdl,m<.a;{ըBZUԒYf`Mnzy i&щ^bqvo7c5aVomV4&ݰ悖M)Q�Nc(ZrX{$'.-M] ТT$ff9w̕bl 7tNGʤMxD:bLZ$ZƟcDsMC1X6N׷` J礛`ؔJ!˷sJŽ["%� Ι·8,2fi6c+z.QϝUМӶͅl5j*[B]d^T24 鸈ޛb%N3a<Ps*s!ʌğ^cӣ BL_n>WL>S:4(V2- .lƒyP1>20EY21E17erI) !W;SyhbcJ7j֥Yg5Q\t\Ͻq1p&ca%̹yEg9U`P9n oG\Sؙ^X&]hC38K: =N |m+jat7iW">|gKaKDót%/UjtT<[Q5BڟY9M9@ G|6g,H:,s/2CNy'R@L7AјtlBNFeo }XJϿ&ʪKJDK,R0h\Oҙб%�WI}2c' !]viraW8xW*[|hۨ(dzlddTn;f83R`SjDQg d(Pv^L2PҪΑLNӝDֱ!tk7t]1*32~nͳ1hȺ#)ㅨSat}4RQqӰpLNZ5Q0@4$,ypF\O όa�|@9Bc[?hdE%Bg&1GxΒ^VA4k J6G骯iyoTGcx 4fnY.165ʝh6> lIB0+_W؞s,kd%]͌-Hwd-\yegYdz.s?ViF%r򬆎?C;cn3v uز^-kYPjZ#ಟ~e5<et=q�'NK$2tptap!oLTrWVye\y 5GCG>.E'z6rN]P}2ɍBg7Dc!w~(&Arp_vN'-aNif{76RqRl-n#Ra*`ߝR;z<5*,3$rGIxY'bz1*eIdR@ZI·2qgV fRRDe1!Y<s˵",ҥ,H�[m < 容R3ؕ =N'М&>j y<˜r(Y'4R2rSfJ&qz(l +F<bu#(᳟PuqxJ~i$]XBfb6c1RpmAdr?lߢg6`Q9Ā/1GKC�D, MbIxE~53d)l,bJ7ɵLX7?1"ES3,YB3E[}KNOFmd�P@fm"YiP&-fF!C[ xrU<<8U4~}h4ꒃ4i>)g32gf(]OCdE6fy:SOmƊ̘s\=Emh _$sxL/e}VF} 8-kfLl%to N~lV[&T2CVg3ýW8l:۟_?gBB}9kܩBe++}<om}ss=_ʏ4 LYƲX5/7+HEŕ =؃̰�>yK/.HcϽ(gVyJ4Hh!s,)e¯&d!W}p %*~;jULE6c}} )\Pླ[c/!*>9|pMjfl[ĂK]Hyhܼ͛s; A*ƿyô+6c C3"4nEYX ׏ ;Gh"fli#g {V͑0cL,@9k7ؿlSLDbl3 Lc9̪3 G�f3F. <o+W$H^kwja֟c|Oeky֞Qu~ݔHǷ}byWcz^ezo;<k#h9Dc!Nռ`=V2I@wV5 l$؅踮E[n~[O{/J#]Bc*1?vb|0\;ιxc0gɼ w?\0.}B \o[:++*.2myd�D"fH'gxL :7<ġe-+DcT(6ʮl#q+zw']C]Oi@鼱1lTw6.4Q"4}v;24vٜ,i5hO\s땚O6do3rgt;s=1E09{$pg0z,= Q$HaVIMK 7cvuJ|dd\@ Sy ϬN)žԶ͘JC';<`s][ P27EaM/LǧmX?Uy,_R?r8x?0&JR&W9,WD^\ "7:3іDc8P`Gxylfjtх'*g8bQK%K*:3 d�\uA%hY/2 OKV D #4KS#[ Ӎw {oJ\-mڌĜtW3PgXL Xχ~+8k\KK*N ş Uq2:ݢLtY;p-`~` >yh."e3c&Y^-ܷkiiiiii3W/JKKKK˲׾gͽ(_/?l?ly?kU:#u#IŖH6c------mZZZZZZڌkiiiiii3fXKKKKK6c------mZZZZZڌkiiiiii3fXKKKKKK6c------:KT-> ={疖\eN|:rai3r7W#>RmZZZZZ:kiiiiii3fXKKKKKc/AKKK˥?оu}SM=Ov)-----yxUn73ct$S:҂NiL^KApٗj3rUÒ_-----6c----ז3ćT KZZZZ-c8ᅞĸTВ9/$:rai3fXKKKKKKOߐEiiiiiYY~?hiiiiiL4-----w-----?Ri*g`/����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/index.html��������������������������������������������������������������000644 �000765 �000000 �00000032363 11555611700 020237� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Binning and Filtering FITS Event Files - DS9 </title> </head> <!--THIS FILE IS CREATED AUTOMATICALLY - DO NOT EDIT MANUALLY--> <body><div class="mainbar"> <a name="maintext"></a><div align="center"><h1>Binning and Filtering FITS Event Files</h1></div> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> <hr size="5" noshade> <div> <h2>Synopsis</h2> <p> When an x-ray event file is loaded, ds9 makes a virtual image for display by binning on one or more axes. This threads describes how to adjust the binning and buffer sizes. Interactive data filtering is described, as well as binning in three dimensions. </p> <p> Note that the terms "binning" and "blocking" are used interchangeably in this thread. They both refer to combining pixels in an image. </p> <p> If you encounter any problems, please email saord @ cfa.harvard.edu. </p> </div> <hr size="5" noshade> <h2><a name="toc">Contents</a></h2> <ul> <li><strong><a href="index.html#start">Getting Started</a></strong></li> <li><strong><a href="index.html#buffer">Buffer Size</a></strong></li> <li> <strong><a href="index.html#basics">Binning Basics</a></strong><ul> <li><a href="index.html#basics.block">Changing the binning factor</a></li> <li><a href="index.html#basics.cols">Binning different columns</a></li> </ul> </li> <li><strong><a href="index.html#cube">Data Cubes: Binning in three dimensions</a></strong></li> <li><strong><a href="index.html#filtering">Filtering Data</a></strong></li> <li><strong><a href="index.html#history">History</a></strong></li> <li> <strong>Images</strong><ul> <li><a href="#defaults">Figure 1: Data loaded with default buffer and bin size</a></li> <li><a href="#binmenu">Figure 2: The Bin menu</a></li> <li><a href="#smallbuffer">Figure 3: Buffer size set to 128x128</a></li> <li><a href="#largebuffer">Figure 4: Buffer size set to 4096x4096</a></li> <li><a href="#block4">Figure 5: Data binned by a factor of 4</a></li> <li><a href="#binpar">Figure 6: The Binning Parameter dialog</a></li> <li><a href="#detimage">Figure 7: Image binned in detector coordinates</a></li> <li><a href="#binpar2">Figure 8: Binning Parameter dialog for a data cube</a></li> <li><a href="#cubebox">Figure 9: Data Cube dialog box</a></li> <li><a href="#cubeimg">Figure 10: Viewing a data cube</a></li> <li><a href="#filterimg">Figure 11: Filtering data</a></li> </ul> </li> </ul> <hr> <div class="sectionlist"> <div class="section"> <h2><a name="start">Getting Started</a></h2> <p> This thread begins with Chandra data from an observation of the Antennae Galaxies (NGC 4038/NGC 4039, ObsID 315). Open the file in ds9: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 acisf00315N002_evt2.fits &amp; </pre></div> <p> A small section of the data is visible when the file is loaded, as shown in <a href="#defaults">Figure 1</a>. The target of the observation is partially visible in the display frame. </p> <div class="figure"> <div class="caption"><h3><a name="defaults">Figure 1: Data loaded with default buffer and bin size</a></h3></div> <div><img alt="[The target sources of the observation are partially visible at the bottom of the frame.]" src="defaults.png"></div> </div> <p> By default, the buffer size is set to 1024x1024 and the binning factor is set to 1. These values will be adjusted in the following sections to illustrate how to make more of the data visible. </p> <p> The "Bin" menu, shown in <a href="#binmenu">Figure 2</a>, will be used to change the setting in the following examples. From top to bottom, this menu contains the bin function setting, blocking factor, buffer size options, and access to the binning parameters dialog box. </p> <div class="figure"> <div class="caption"><h3><a name="binmenu">Figure 2: The Bin menu</a></h3></div> <div><img alt="[The blocking factor is set to 1, the buffer size is 1024x1024, and the function is sum.]" src="binmenu.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="buffer">Buffer Size</a></h2> <p> The buffer size determines the size of the image generated by ds9. By default, a full-resolution 1024x1024 image of the data is created. If your input data file has larger dimensions, it is clipped to 1024x1024 in ds9. The buffer settings range from 128x128 to 8192x1892. </p> <p> Setting the buffer to the smallest size, 128x128, illustrates how it works. The data was centered on the sources in ds9 before the buffer size was changed, creating <a href="#smallbuffer">Figure 3</a>. </p> <div class="figure"> <div class="caption"><h3><a name="smallbuffer">Figure 3: Buffer size set to 128x128</a></h3></div> <div><img alt="[A small central portion of the data is visible.]" src="smallbuffer.png"></div> </div> <p> Setting the buffer to a large size, e.g. 4096x4096, produces <a href="#largebuffer">Figure 4</a>. The display frame is filled by the data, and the panner in the upper right indicates that more of the image is available. Clicking and dragging the viewing bounding box in the panner will display a different portion of the image. </p> <div class="figure"> <div class="caption"><h3><a name="largebuffer">Figure 4: Buffer size set to 4096x4096</a></h3></div> <div><img alt="[The frame is filled by the data, and the panner indicates more of the image is outside the field of view.]" src="largebuffer.png"></div> </div> <hr> </div> <div class="section"> <h2><a name="basics">Binning Basics</a></h2> <div class="subsectionlist"> <div class="subsection"> <h3><a name="basics.block">Changing the binning factor</a></h3> <p> While increasing the buffer size loads more of the file into ds9, binning the data makes more of it visible in the frame. Binning combines the specified number of pixels into one new pixel; the new pixel has a value equal to the sum of the original pixels. (Note that if the bin method is changed to "average", the pixel values are averaged instead of summed.) </p> <p> The binning can changed from the "Bin" menu or from the "Bin" item in the button bar. It's also possible to step through different binning values with the -/+ buttons or the "Block In"/"Block Out" menu items. </p> <p> In <a href="#block4">Figure 5</a>, the buffer size is set to 1024x1024, but the block factor has been set to 4. A larger section of the data is visible in the frame. </p> <div class="figure"> <div class="caption"><h3><a name="block4">Figure 5: Data binned by a factor of 4</a></h3></div> <div><img alt="[Five of the CCDs are visible in the binned data.]" src="block4.png"></div> </div> <hr width="80%" align="center"> </div> <div class="subsection"> <h3><a name="basics.cols">Binning different columns</a></h3> <p> ds9 has the ability to display any of the other columns stored in the event file, although it is generally only meaningful to use the spatial vector columns. Begin by opening the "Bin → Binning Parameters" dialog box, shown in <a href="#binpar">Figure 6</a>. </p> <p> The "Bin Columns" menus are used to select the columns to be binned. To create an image in detector coordinates, set the first to "detx" and the second to "dety"; the block is set to "2" for both. The "or center of data" box is checked so that the center of the data is recalculated for the new columns. </p> <div class="figure"> <div class="caption"><h3><a name="binpar">Figure 6: The Binning Parameter dialog</a></h3></div> <div><img alt="[The parameters are set to bin in detector coordinates about the center of the data.]" src="binpar.png"></div> </div> <p> Click "Apply" and the ds9 frame is updated, as shown in <a href="#detimage">Figure 7</a>. </p> <div class="figure"> <div class="caption"><h3><a name="detimage">Figure 7: Image binned in detector coordinates</a></h3></div> <div><img alt="[Some bad columns are visible in black in the detector image.]" src="detimage.png"></div> </div> <p> Alternatively, one can display an event file in specific coordinates when starting ds9 from the command line: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;"> unix% ds9 "acisf00315N002_evt2.fits[bin=detx,dety]" &amp; </pre></div> </div> </div> <hr> </div> <div class="section"> <h2><a name="cube">Data Cubes: Binning in three dimensions</a></h2> <p> It is possible to add a third column to the binning, creating a 3-dimensional image also known as a "data cube". In this example, an (x,y,time) data cube is created of a Chandra observation of Jupiter (ObsID 1463). A cube may be created from any three columns that make sense in the analysis. For instance, you may want to create a PHA or energy axis to see how the spectral characteristics of a source change over time. </p> <p> The data file is loaded into a new frame in ds9 and the "Bin → Binning Parameters" dialog box is opened again. The "time" column of the file is selected from the "Bin 3rd Column" menu. The limits of the data in that column are filled in automatically. The "depth" field determines how many intervals the column is divided into; a depth of 25 is used. The completed parameter box is shown in <a href="#binpar2">Figure 8</a>. </p> <div class="figure"> <div class="caption"><h3><a name="binpar2">Figure 8: Binning Parameter dialog for a data cube</a></h3></div> <div><img alt='[The third binning column is set to "time" with a depth of "25".]' src="binpar2.png"></div> </div> <p> After clicking "Apply", two things happen: <a href="#cubebox">the "Data Cube" dialog box (Figure 9)</a> is launched and <a href="#cubeimg">the frame is updated to show only the (x,y) image of the first time slice (Figure 10)</a>. (If the data cube dialog box doesn't launch, open it from the "Frame" menu.) </p> <div class="figure"> <div class="caption"><h3><a name="cubebox">Figure 9: Data Cube dialog box</a></h3></div> <div><img alt="[The dialog box has controls to step through each slice of the data cube.]" src="cubebox.png"></div> </div> <p> When "Play" is chosen, ds9 cycles through the bins of the time axis, essentially creating a movie of the (x,y) position of the object over time. The speed of the frame changes is controlled from the "Interval" menu of the dialog box. Any of the 25 intervals may be selected with the slider bar. </p> <div class="figure"> <div class="caption"><h3><a name="cubeimg">Figure 10: Viewing a data cube</a></h3></div> <div><img alt="[One interval of the data cube is visible at a time when displayed in ds9.]" src="cubeimg.png"></div> </div> <p> The data cube can be saved as an MPEG movie from the "File → Save Image..." menu. Select "MPEG-1 (Movie)" and click "OK"; after setting the filename, choose an MPEG Quality Factor. The Jupiter data was saved at a quality factor of 15: <a href="jupiter.mpg">jupiter.mpg</a>. </p> <hr> </div> <div class="section"> <h2><a name="filtering">Filtering Data</a></h2> <p> The "Bin Filter" field in the "Binning Parameters" dialog box is used to apply filters to the data. A filter can be applied to any of the columns present in the input file. A colon is used to indicate a range of values. Filters can also use &lt; (less than) or &gt; (greater than). </p> <p> For instance, to include only the hard-band photons (2500-8000 eV): </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;">energy=2500:8000</pre></div> <p> Clicking "Apply" updates the ds9 display and keeps the dialog open for adjusting the filters. </p> <p> Multiple filters may be specified, separated by commas: </p> <div class="screen"><pre style="background: #cccccc; white-space: pre; border: none; padding: 0.5em; overflow: auto; border: thin solid black;">energy=2500:8000, ccd_id=7</pre></div> <p> The resulting image is shown in <a href="#filterimg">Figure 11</a>. </p> <div class="figure"> <div class="caption"><h3><a name="filterimg">Figure 11: Filtering data</a></h3></div> <div><img alt="[Only the hard-band photos on CCD 7 are displayed.]" src="filterimg.png"></div> </div> <p> The filtered dataset can be saved as a FITS file for use in data analysis from the "File → Save Frame as Fits..." menu. </p> </div> </div> <hr size="5" noshade> <h2><a name="history">History</a></h2> <table class="history"> <tr> <td class="historydate">26 Jun 2009</td> <td> Original version </td> </tr> </table> <hr size="5" noshade> <p> Return to the <a href="../index.html">DS9 Users Manual</a></p> </div></body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/jupiter.mpg�������������������������������������������������������������000644 �000765 �000000 �00000517744 11222161077 020442� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@��������z)HR79]RHR)HVg7ve:WR|)WR||>߳?aOM6a'cVU3┬=o*JR""*JR"ه4Z"~z5])WR|7uwn|%{uqut)HR)HR)HR)H_ScsղWY/YW()I_)JDUw»|r=]"*^I,suuwfsw}͓q|νݾW()I_)JDUE_)JDUE_)JDUE_)JDU򕛸^Ɠ/UUE_+?fW)]}rE_)JDU'38+%RQW[KR^w)Mx͙8jpB13|,%9 pA~~L,:;n|YHr�8ҿIn`-@VtVņp3`IJN{3=3_ٕJW_~n)j@C%wo d!߷~ZRg\{%J)վId#/fWW3Ҕ)HR)HRvvW"en0gWJDUE_+3_;2Fu~͛2nٕ()8)HR3fǯjTE_>v=]ϖǞwS)HR)HR@vBԗح| tL Hշ̝͹b,7d}5%\x0rY ЀܞԄe:6Bfak]_(7p*MJIX bRRmIB] 7-n@jy>BHĕ̀Qana\�Ð!!rbŶZ@Xx$,`9:4BFJ7drJ/PI+n ۺkW#43haD|5VJ>O 55~nNdwoѓƌ|VF ~;zEYDΒf(Zwcp Ջ%ݓ~րTLG/3Rݹy%bl3^KmxpԖ`ae`†'ݹ@U!C2~VQ};Թ4JH7삱|a- Y(O'ϯ[<z!A4LN7Ӑ3m.NIo;;g> AZ %`1Ɨъ%) #PO]dM G+1YItt(,Jv~V3^ U)zUE_+?ٷ?l/퇫~#U"T36feTRvvWQWX-q/utUl{VcHV2~vRfDUE_+{c);4DU򕟳~gc?M:?vG\⯳ZlՅ2~wRF-E_gf~+?/WJN*JV2~vRfͲJ__Ww@w<ӑƸb !%j4�58,O!bob``b1oҏPДe?+%Rxo͹D4 & % Ff-;2-d4!7 !F#t n(҄>A[{n2[l_ |҂jx o;ۭy֯bnH-ft# ~6n?&zPKF+89B( 7'trbP0o -2qy7I(O ߲K) (Y<�NJs auƤ S7)_C#?44oƖ1%'m1n_&?:_C~uŀ$†#r^($` _l43w#;рfY5PXfJ yi NCdśXq07,Xa-9e(W[vD%Δp{ 9QmܒJt9yɤ²0AC eqh vW%VI]g[swesiה9l?lVO(A /I4p7- ( (b%쌟+% ܢKF2﵁@(JNLRv/?3tͯZK lM~7Sm!*Krΐp fj*bC2>͎aY-c2y[o66ݲg3Xo|ǟw0^_)JDUE_)JDUE_)JDUE_)JDUfxu;DUҔ)HV~~s_cWR|1aj%Η1A=?cWti]JU(osZj\b PkŔY'Cx݂�u ( t'b &^,T{3 M! &,,k?`FHo3y�ނ& /3d>bZre_<M;,ZA|ɩq6$H432~6 +9eLN!hBԍ8dfBC7^x1)K|~L/,'d1A%%QャE@X AI(7)(#r;m.wZ%'DԓRK) 8JB7-B[u`o 0b@`ia-j>̂!):1/@Pҋ+_3} XjMCf-B7epf9 i!Y((3=-F6LM/!$R�x݋/В^ =vaXt SX`IJ:6GpK%%%.XnOIn7+o _J߷[NT�h3 RS9e Oafp3Y\h6iN@om Wh^A|[::wR[[! YF푞._!Coog7:,<p v:f̅(rVtu!?OW*h(W}[8uF_Fvn:ޫ*4-%Wφﻯ2;N]]"*JR"g<?v|um4rYM[6nrJ*JN*J}ΧYù}\E_)JDUE_)JDUE_)JDUclq:{c);4E_]!1EԿ|v=\KE_r_( @b:P b8 謔 0hKJJGP̍PX`OS>7|ıӋbWXrwTNF| 18YIĮ7@]-UoxsKBIXn6RrZF)*GGޜHa03#JK I+bPVl^-?}10)bn5! @k$ѿ #G^N -t'!e Kvݐf=Vݖv5BI2 GұhN etW,`)ɵ$fX15)J7F(Y5() $ Úɉ%у> )6JHELᥧ' o% A[07JBrS}pY{yJpM 7EJĮ`ĒF+;by9r@M%%_2F%vB,,I&9] K@НOH��΂�t)A0|!(cZ\Y&dZ/ZPR[d~3MN~fb:߳񽟳cߏq0`fA\aIB1X11sڣ+ҏHݎf[n}Rz/ Ͷ~/+mWkb/KFl3_߻Y.jJR+{c);4긊R)HR)HRal̿WWط-q/utE_+>v=]ϖǞwS|[flu0DUmfO~@Mm_mVڮQ}])8)XٹjlruR*X|f~Ÿ89g}s;% 3pº7 F -hGҊQ΍'FҎ0w|.@�8�$b%v2A)yRI%$ӿ&'6�n%rOi $$Po +ɥnY]$ЄwV �ܲӉW%P0 Jq]2J$&6WW‰ ]8Gۖތ/Д, 8Ji&ܔdZ@uNZy 1II@O)~^L!QD<Kt~@W $t|pc�, Ier_2P_٪kXs-0a_ыOpXk2~f/1\MG~H  acЖxrSJ!0d^| ?le!ˆ�<47`Ғ1% d쒓sq#vݳ3w``(ЍCFSw풧<;wu}۷v|*Ư?߲Ϳt7swf e/?UҕݔƝV?t⯝ۯN9cx͙JVVl|)8+7s>_=Ʊq|c/le9cWWR|)WJ{kYݟ J*Yߺٔ77UE_)JDU򕍟ߛv) )HR� R @ml ׸Wm?y &GFFnVJ~RX'V%9Y`<~0f(gr#'!=9Ỡgpsw,s'v}f$ѺwΡ;od|>}ݻamE]zm9͜QM_E)J⯔"*7;-MQTU]yhš(N|]D'|;?[qN}nWoWG۩k/2+?c*JDU}ƳnM+3=Kw͏VemնLUv{daf~8Omd'|)8go1y:|+6c_=+cƱ|x7?Uo_ZoE_+{;MYΣ]]'|)Wٻwn<UtE_)JDU;0{C;먔UvVvޮR)HR)HV~[OlWHͲ6mmͪHR)HV-6luCfU]"*_n{:#~Uƹ6 SfLUR*JR"gg1q:"E_+{;MYΣ]6mٶc6+S򊾺RϷo t|>}ݻamD⯔"*JR""*JR""*JVwnn>^|DUgl~6V~"~z5]fg籜~y>QWV_ڮR+3=Kw͏Ve2~vRfE_])I_)Y9l8㲝t|υv}t'|݆vPHC-p'}8W+ґ|)W?eoa?])Wٜߺٔ77g+S򊾺RVw3ne:6a'cVUҔU~ns^vvo>Gg9{w5UҔUo_ZoR"w?>[yNRշ;ӹOcgݳl*W Ͼ Uґ|ٍ|7;~z8T⯔"*Jy/|wcI*YBKWo:;gF]YuL%QWVnZp}W8)HR~~;z6?~o8&QWJRqW>/>+| Ou_)^3~5;;n}s'|)8)HR)HRg7՝[#.|+?m߶;3YhVg7lwu:*JR"lmRґ|b߯3f̷[6eUUl{VcHR9u)o0oWWR|)WR|)WR|!콖auu~gc?(gSwvn>WJWK^wWW8gl?L}Rcՙno`\fc?l'}F/t'>/}{QJJ*JRqW͛m_mVڮ|l}ݻ>qmE3_;2FrRU3fǯjU\E_+Y7uL!ww;E^,Ͽ=/m̶w}QJDU||~gt⯕;/▮=MU"we} ;(a}}}׾}W(����H����zgǯߙ2|)WR|fvvݸ}*;=jw^eWXٻa urٕJW_~뫥'}/sGґ|)W͙JVVl룯fu=bKU⯔"*JV2ZSv=|i|u69GS)uu^ƓOߗc9󹣥}t'}^u~~3Yտ?2Ϳa}l=[E_)JN*;meo~/a-HR)HR)HRc/e)9jJE_)Y:~)J̓uq}տ"*JR"վ?ù e/?Ulz)8e}tgg1qӊ2~vRfR""*JR""*7^-{^f/7[uUo~_oV:QWJϻg۳U*JR""*^3ժ)()I_)JDUE_)JDUfxu;*">\E_)J>wN3(~zvj3풞r,VV7`Ԇ|ROr֏Z>ɟ</H|Lj>Bp%Ќ8N/ѿߵܒl[1?0\Uvg_)YYz߮dmlemW5:v_G^>]U|)TUE_)JDUݶm݄c/u|esFϻg۳J*7μputU{ @n/}~)()XJnruZ}uߝǬYe*m7E_])I_)kؠٰO7RU_7enVlοߊR`]\E_+7s>_=ƏE_)KՀĆX*nZ6'/ tr?۫.g_4 9tgiV~;n]"J&n2#e}nւ`P<i|Rq5<ҐS !+f9YP44 SMIi)w-8_J7ONdg_N-av45 O/0n+$nC K 7] j 01%�ܢӾ/Yhš;/ K lY+?}᜚y(a(4_΄dnO;s|KAxWY$%GB;!Zz3S,a縀9*w&K (7 ၼ7'n~H)-)JF6f޼He}Ɣ4i\ bNe)J%䤽H|1 ah/B y,^_v3!t�XZFƫ#Ĝ4Q3fssr*iY)(bq%!N!$t?J'$0:QZSx'!4Ԟ40Jn_>NKk!Qi%�a(~IeHacPZFta"c0fa* |ߺLOٕJW_~%$f)ga_ۍ×ʽYǫ2K_)JDUlmgն)HR;?[qFUґ}VWJDU:cԷ|f[ut+6c_=+cƏ)HR+>Wۯu{z""*Jϟ}Ϗ^}^"~V;>wnv=nVԳ ?̕>GbSqk`!!L/%#nRP7vNww׀a-?%80RQZ +Z>ٷNϯC)a,=Z֯dҰJ1X ,@Y `RPZrK>Ŕk1(bYK3dd:8FIJKᡝi[@ktۺ RZJuz%(B3baߐ�ѿTR{ϛ,|ϟM,03Sa6 ̲úۖ(Z�lPbq041҄ Bg첶|BzbRp+HԗY@7OܤR9fJm Z O ) &j bf!R'El6/,4J䡅b [f/6:Jv);74bZQEm6O+ dPOjJߔF@d(WNAiZ^N):0[JZQŖJ&n hZxI1ֱx~=M<t B &$J$5aGHnI/''كvGHb@,+gIN17?f Gزdg쫵DԆ1!#RQہ6_?ih @hJ@DrЂg,e;Ϻ[}gW3ҫ`%!%ye %}@ Qd$af~뾂Q4B2W)v!%?&r_6v%~3.9;:ϛa #Uk>o7nϜ[gWKҢ"*Y}~=[`DUE_+|h0ϕHsv9ef0`~lvgt)I_)JDUE_)Jφﻯ2;N\E_])HRlmR*JR"d+mWH׀r7'bRv=ЁkgH& (JKܢi`ƒa+~x lW_҄6壍Xb߾VveU!?ZP,fIl3Ô<ĵ_ A}= OK% A[WJ />@gn447�T FB9e[_/-$ p0_C00a[%c: =W$BPJtY\aH(t''nPKw}``qHfRC[K&gg}Ha4YEl1aYi >(0QQJnxg$bZ ?#}K 3l1:R^Hj Jf&bWIH'lV-vJ2q/׾eD0  $_O!bIA d7- Otg9+Q\ Y7h)#P-)p`/$J/Q/}N_;K A 7%n#qqMU_@nY 0Y4 7rnJRS ~w5!䆠QC #!ZI6bYx'NR~Y=\445NGJS>f,^,k|K/:_mܙ)Ӳyy;;g[۬*B&X(VW7Xi@g?%⣥o͒:גn[߿#_ сg vGdu/%Xn&P J#>pvcWm?}[j۷Knٷen{V|s^WI_)JDUE_)Jُ_c3dE_])XkߝLicDUҕ/sGUҕQe"~zt)HV}nWoW>}֭W?}])Wٳ?i;%_nֵuj߽/}ֽ_?u]*7܄aߌ%}ƍv{ OP K-)oI5ЂQ}??Ë+}dwo?+9hɹɨN rK'ѷ9}‡  &3'8g,1aEto O_o6�|XV!JBKN+F@iEb[ia΀C %%@nt-?Nϙ4n,Mb@iY) ~7&~!%vX_?c~bɛ$ !6&aHAE_Bشr Ŀ kkp-Ҏ$ Hj7N #Kt RA{epφI/Ӷ(9š| t>'B -ОBq-%bӶhO1ǣbwc[ڪNZHlPa+BR>IIJ2v'AD΂C3^Q%} BQ~n;K� XoB a(jS) %A]Ѿhجxga9(37G F sar„Np2YDҜ{iJt'BRV}Xorkt:~eu=EaEVpЁ�rI%ش|!%'9-vKc;nsP-G=NYͿJS5ٲ2Ӷ~6u33v|ٝskB an(f;c$#;lW~u7{3ίƒe:sfbs)KyU⯔"*J7*JžVfnS ~꫈)HR)YN}Ͼ^E_])YoS6lz֨-6luCfU])WR|)WR||>}ݻamE]"*?fW)]}r褘G72VZזZ6HK [fU3fs;(7_ ]$"p%.%ߧ%!0^C13$3~ Kl7  i1 B@SBFGG(0?I0PKG(%05 )N۾G d%d*s>=e^& d+ KMJJyy%Nop5 K d$Y3Y怩0rbJ,Sœ lJ xRdv�lA\45ihwB9Iw t_70UزgA7;a%!J:~-R1(% 0�XGJJ%#\�Ĕ%_,V|R#8G堮w&N~A1߱_ҐҸk0ģ_puPU_�ȆMpiL3GdF%|ׁ LHݾHJ%i/~@k 'tB!-`+V1%q+a)W՘{*r%w%A`e|2v=]ϖǞwQOF-#'~'~l6\:R_)JDUշ;ӹOE_+6mٶc6E_)XjlasUE_)JDUmmmmWJDUE_c/u|esWY?ua?rRUE_)JDUE_)Y?eoa?x3;:QWϝWs3l)J2rGvVvޙǫ2KU�ԣ{ ,jCdd't_XJ3dƆ @@jBBPZ3ZY+?^C߭o}g3'ǫ6U_4GrWOM%(Ҕ2%QAAcōyIB s#Ͷuf_(~hq;%;�*" gF+nVnn߮Ð=_Χ)JV~~s_i*m a߇Un|{W矍()8ٝef~R"svŶqtE_)JDUmնWJDU-7|u2K]{-{);0J*JRqWV-6nuCw\-ߺ)Jn=͔URۯN9cEN*Jϗc9*YͿa}l=[6?~o8&QWJRqWV~̯ߊR?]7n++()8)HV||~g'}}QWjlasg[zu.E_])I_)Jُ_c3dE_])HR)HR}WJR";gv^gڮ)HR#gm)HR}ovnr_u~E_])I_)JDUE_)JDUE_)J_Ss{2WY?i;tf篹6}3fs;(ںR""*{;MYΣ]]g*uw;U*3_;Fc nwesƟWHRUwSlz͛e*)HVw3ne:WHVmmmmWX|f~Ÿ8E_]+7s>_=ƏUE_+;meo~/a-WR}gg)󉫥"*JR""*;)MYγVU])W_Ss{2WY}~=[`E_]+6V/)~qWބd++mF#0(Vi?7SWIE_)JN*JR"b߯3f̷[6eDUҳ̯WWR|%_nֵuDUߩп}Ŵ⯔"*3e~+?a{[-;~0E_)JN*JVw3ne:WJR"cg~b*JDUE_+yen%.}^ƓWJDUE_)JDUE_)JDU[ne̸o}Oߗc9󹣪(_7enRqWR|)WVnZpU;^?fsƊUҔU}nWoW>oיf[2|ٜ?6SqFf7r8hm׏Yñݻ]|9_DU򕟱GQ1lUvVvތֽ_?u]"*JV2Z[w9\aא~9)IE_gǫ6|2LWJRqWR||>}ݻamE7}>;]_E_)JN*3_;2F披"*JR">۲8t)HR;g_ٷ"o[_Ywn<UҳέW8cfu=bK![lԥE_])Y9l8㲍UmlztE_)Y?i;q��������zc/wu)9bkE_)JDUE_)JDUmնWXJlzuR|f~Ÿ8E_])I_)JDUE_)JDUE_+;o}ou2TRQWRRfv쿳og!]"*JWF?9w()8f/7[wt)HϝWs36gojJ*JVlolgmӊ2~vRfR"||7z:ZvSv=Xau|2L(#gmR)HRvVvޟXE_])I_)Xٻa tu4zå}t'|+7^-{\\E_])HVw3~u: Ͼ U*JٕJW_~|)WR|)Wgo;g""*JR""*JR"vvW;gc;WIE_c |i1w~8UtfͶ~/+mNoZsl"'|+?ٷ?l/퇫~#DUfuRe&8bYOK2vwƪz8I]n)/ή3fӫ5+┮9OϒZsN۩SU⯳}ovnr=])WR|fuǩn̷RWWطٻa utE_c/u|esN_ۋϜCJ*JRqWR|)WR|)Wy/|wcIWRv݅a}tgSw}t"*JV^Rm~3#]FG%;}=!( @ax_63%HBze/I I/o)RR'>ґq/ƽ#0`1G w Ύ8iY0c_J 1rG RrfB1iB |RSrcJ@H`h>, 32?c&#Rr(OQ KB/tބ-!J-;|Y㙞Cɜy+A(ﲊ+>t�;!45J ~3~RCg&7ѐLoN�8 aCl] e HjJ&d+ dr'ӀZ sQ** ))(1$-�yH آHKl�䑊OGG>Gxae|YY;~7'?R҂`( 5$#|3}ń%d-%qߧU�Q/IIJ8aW7I[6GI)cn,([U [lٖu̪lz)8]@z: @ `ߺ6JQVB> _^ݲw;}ϻ˽.J*|ߺLG^Sc{2WtJf e/?UҔ+>p9uq|)WRcn*w>Uҕ7{]ײոwݾݕ}>⯔"*JVmնWJVn|wg»}te0zӪ*;=kfWuR"Hd!HB콪)IE_fuǩLٱZ>l庿q+@!N@f+L)t'/`ñCO{ :Mxjap((ҒbPhԆ!y0�%,bRPB,R2rFhщKm}�:ܖ ,j>` Pq/bg&)(HфbPI( A)] 27E_C %lҾ!=8g%2:zKEhhHh+e <aHWJ~^̄7:bbPiA݃0`C & -Cz5 @B &P#$I(7# %>PnWHh7Y7|XPыra4GaJ@eg B,Ҕ%%bSF)uɡ@j9000 &B1i+27l3tH{Xg+tiiHhBXjXܮΝI#=;6=aĒ`°gr>%B7GGlw]=bae 59:~7ݐptwAOrP0:6Nd2μ1%J ŠVBqJN1_gZ,vU_ W5? /Q0~AaPz3'_3! /*/m`cdd_O_I+Y^(3dD䠢 I!(a g% PXb~Hčnn4w9m_#;e~we1cՏWo@nNR_n͆}X2~wRF-R%_nֵuutE_)JDUE_)JDU|s^cYB{-K}uݔƝV?u]'|)WR|)WR|)WٰͶuf_뫥g*uw; Uo[_\ДW@n);bXt`²QӏœwW}K HiXjP4?'R L^r9j W(Kbi|eQ3%~&8fo;i4^ %lےɥd~d�࿃ g(1f FȞX($nj3`0RQJ%+),0^n43t m##x;![>֯рDҸae7Š7rb8GF?Vt&2ĔLJ B9cPjJwoߕ?f],(Pid! /ъB_Ҕ PA}F/ -xhi\^Fg%k䧣|웧9#xo@@jz3!$Z/BRz` &�-[b /uزGmRIy !.[-eٵɁ%0i3QXϙ ?:~=%Y ꊿx<335%nR!? Nd5IE%;Ya<5$.PV ބUX Z0a/t2pa7() &Jš Gdщ�Xh'v݋GtvJ"Ԁ`oP) -9ЮQ($J ,7%3!-_P#$ @nI2c>mO&pč+Τp1 b0brIy7:I,5AĚ ~d/IhI,Y9 xv} >m1$G~$>C)<;wרnM_)XJlzuR*JR"~͛nWHR)HRײ׿;ӱ+?ٷ?l/퇫~#O= mٶ4fQ[<F^Vc+>dmlemU"'}/Կ`.)H_ScsղWJDUH,Jؚ)d^F/1;_ѕ|eRB0ح G+ow�H&J@J KoBJ!+ vG Z@a4Q0gIxjP+a)3?^}tɡ d5d4rfB6%] Q[vr\ܴ�5> �= )Nkǜ1CjkZZ?,aD!%iH䲘 gC( ,%)&)a�._V(,]}9:pҊr pؾKԸhن$_n_lVŒo&/P~Ggw9`(-$퓋-۲1=�c' <XNN %?t?lPyP+VCCS5b8nMHŗPPj2 Ae#rCCC(~3'-\LrǨ㕸0BJ HnI{)1=(E# φb^5C@--BQƤAxFIX̎b{*JQװ2KC8 IH%dkp & ,5)# `7߆4 rZ7P܌$URHHĮ(b: hFp̌vKNKAOF#`ޗ'7#rFGwY<['nJ%pB偂F`1)))[kI(Z Fn<bz}l@[:~qt}CCϹ8W+޽_)Yݟ U|m?/e)9jJJ}3ژ;g_ٷ۷۲Ϸ8%{uqusRUE_cnwesƟWYg9{w5 |e}t'|)WR|)WR}gg)󉫥"*Yo=5E_)JDUgjz &^rSJAINg]!(hM3Ih, leIdbzR^(`A,%|dXah'|~:s@tRv% Bv Nᘙ t,/kvf<Ź9j,5!|KN)1ҜL( OVJ Y?2s[ V -rLH@JВRY<JA3,WXҊI_nGn1_zd ,`2Y7 ݻ)C#$ɀ%p3C68C~ZBgAƆZ2 ~K)KrKltJBwF0 &d|ҝl0 JZXaIjR_AyzFrH)Yh;}ML H II:IJ҄>G|ԔM%_(3B@ 0( nK%IZZ߈]PLK%QLX@#1 J~JN4QѶ͆mjqDlSdK@ha_=AM̕_N[2IMJBҝџ#fCԞɣ nCm3ͲBFn16KIC?Fol3dN 5(Bz?G|+A?gWVv3?lcRe5|l߳qOM]zvg@ܗr}RF vOK%d"*>}>?3y{RqWV-7~u2KU>}>?3y{E_])Xj۝ni*JDU3fs;)OWs3UҔUE_)_olۘ)߲ƪLfߊCE_])Y/Y8)WR|+>ϟ7SW_Џݖ_;5,KV*А@PoR6OrŻ-8'2U+޴L35oBJ/}ПgVMKi8mあpD@j bӑ`YE@܏I�1oHj$ ۍ9JClBnqVJh܄pݷb4fD: 0|JtƠkc6^\ FA+ؤ'VrZ[(yvgo;gs5LZ{_6ά=t|υvvSWRW7|^s6fw<sTRQWR~~;y_>v=]ϖǞwS>⯔f?gmhRcn*||υv;meo~/a-}t'|)W_^sǯ:}>۲8|>}ݻamE]%|+7}>;]__]g<?vt)HRn:}ouCM+Noq#*Vg[zu-Utgvo%]"*Yߺٔ77E_+3}en+q-W͛m_mVڮ|)Wٳo9[v5"*3=Jf͏_uԩB0dzRQWRVn|wg»t)HR)HRn:}ouґ}|2LWJDU%_nֵuq}te0zӪ*JR"l߳qOM7qݍ's^UҔU _?_bI9l8㲝urRUE_c |jHR֭W?|E_>Wۯu{x]])WRZlՅUҔfsvwSa>|)Wُ_c3ꫤE_)J͆m2?O\E_]+n{pBϲڢQWRVgln۾Wl[U"e79g:[-uq}ǫ2KTH~=nv~EU򕎽֦(Ye.qWR|+>p9q}t"*JR""*JR"3z8kNm׏Yñu]%|)8)HR}ovnr=\E_)JDUE_+7;-MQTU>}>?3y{E_)JN*JR";gv^gڮ)HR֭W?|E_]+{-{);0긊Rgvo%]"*JR"|fs?)WHRsvŶqq|w?>[yNDUE_z4ϳo{NRQWٳ:~)J̓]f/7[wq|)8)HR)HRw»|r=\E_)JDUE_+;=jw^e֪DUg7lwu:?a'_U⯔x7?UU}."|3?UE_gǯߙuUґ|x7?U"cg~b*JDUE_)JDUE_)JDUE_f++6[u~gc?EVfnS ~UҔUD��������zcgݳl*7n++#*JN*Yߺٔ77v|++W()I_)JDUclq:>ϟ7S()8)YN}Ͼ^E_])X|f~Ÿ8V>}?oٟ&""*JR""*JR""*JVw3~u:*J,#?lr]E)(gs6Sa:Rcfu=bKE_)JDUE_)Jo:;gF\E_]+?a'_)HR)HVlolgmt)HRۯN9cx芾6}>nnݟ8">۲8ҊϲwooϪ8)HV:nvZF^Sc{2(fxu;UqWo=5g籜~y>Rw3z<kF^Vc+>"⯕>۲8t+׸߰6Z޳*%}olmwSlz͛e)Uq|)8)HRfsNqe:*J͆m2?O]\E_+>v_-]]zE_)kۿf?tOҞyݢh (m dvj[Ptdn{7puɩWRo>|*JϲUk^w^WJR"+┮9O"![lԥuq}ۯN9cxR"vvWclq:|+>p9sR|)WV-7~u2KU\E_+>v=]ϖǞwS+┮9O*JV>}?oٟ&qWYMSnr-U""*JR"edӱ ^έ jrr tq% %bgW?ϟm7n[vwP7n'6A }%ogJ ,0F-(J bWRFnߣ!Yn G&dɉ1%@c78W$4>p)}j`--웆U0i_18gBY}}W3;J(4{y43R~&orX lY@_ Gd %Bz0bN^F\X%YdذݲUa+'t (q+!658b>`O}9@{ٟޣHi(3WI@ħn/۠7Tɼa3Vt CxK۶he$U:+gS|3glml3kV\4 d![FJ �Qh(f7gdd '}]Y7/W^Vc+>)n:}ouұվ?ùUҕ}۷v}tg?[lo}t"*YͿa}l=[u)g0o()8)HR)Yo[lz-ԵDUo[_Hy/|wcIHRcn*)HWK^wWWJDUѝӰ7_+PHxo)<3% 1#JF%6O1&'}ɼ`j0^f/ |v Gd?=p bS2Mql^$ّY ΓgesZүXܚͺK/З-R=%d&I4H 4Q}%TIH K&!,J{@-)1;7808gܖ 1.wU),a[beI\44@oД %Eq|ל'V9cᄼM )jPAXW9ƗlݮH�<oы e#Y(rPFn(XLMY̔tr%'ДM<-?N%ƒwGug7pZU-8 aJHgAIf))Ł͛Ӿ%�YY Zqe)Hf [b K%( I,2 a]xbqy 7 ,bqO&XPGmɛ% YJBTs/dL( P`KSZP0VѿQ|3JN?t~ё,,}%;7KRCO@b1�c!;K(enRK唀*5,Y%>lO";3*#v)9_ϹQz:>Џ1#F;⻄g%6W fc?lJZʯV/"f篹uU6?~o8&|)WR|)WR|+;^?:fq}t"*JR"fuǩLٱZWJR"en0gOo:;gF]]B ϗ^zP~E_ahIdLXҸh^ذ-I b`aY- `0Kjz-((7 B] C7jؖѺwBrPű,hPo+bP/eBVpJ R:#~ u_(g ΞHE8jJd7f!$wB !C%9 YY@Y1A2SX%3Db A1#$ԭ)Bv)$̟B| -())%�m t2Brؿnk_YS�֪bZFЀ0bHQ;o87@b R%%& ^8 4b6J~ I1 'nŠ;':/RM& JIX`RJ8kIdag<+*iH(f A(%%lB>0-Zv pa,)pԬ FJRt#bieMD Hn&dō|ZwNHN$:9ה), #PZҏllv74_K,L9m۔WbRS6@[C IDL+Q(dC3Š-rIN-%)JIdAɩ@Ĕv#9WI?tto3bRӲ: ~ 4~f @�ȢY|,'K+#e2K)Y?cB;7ͺ1''n*10ϰ-8oJaH-,hbQقo�HJ?B>ĭbVK Cn=yM=jo9[v5/zʯzP5]>wal*)Xlmgl⟰_)JDUn۾Õ*JV2Z[w9\a}t"*JR"ٶm*JR""*Yݲ3~3E_)JDUE_(0tJK1 ޒR�,'NWœR & ԁJG(aNIcPF,04jQb�,�)v(#9bRRMrY\# KJSw+5 k^ 6i!$2aD􆖔QiNmB\`ͻ b m&0!<) $[[<LPē )&13! 6R  G&,I $Q37 NF5^[ݝ[8,o!MA_ NOv~n^+deN�LH͆ F#t>`P33ZCwdQOZ#bؤ$ @)BPL@c  (71;Н;VkݙO1@ġ Y(-Jyt2K^Ah#m-D> gFFؤ II[w_Y,3r ,ғz[n(j>c$PēQƠɩ,i@`Z6|Sg)?ȺPSWQ5 M/퓐cd/tdb[ОtM) da C�nK%_%*߆n*ErO &(n,`ae(PP’OI7w I_3 tV KS}vtmle5@~(Yaؾ{](tm=+7s}X&%dam F rn)d;]ɃFqD3݌;lu'pG* )Yݟ ^}t"*Jv}*YN^]"*YMSnr-U"gv!E_])HfߊCR""*XJlzuRhn/z~3Yտ?2I_)JDUE_)J͆m2?O\E_9@d0Rvג3ǭwNz!G&mPj۾'wXNF�3-oܚbxwc40UWi %8Į3hdҔn-#J&wO(JCr:g0Pj/Ɉ(iCP !?'l+~K/ B >h%) &| B5y۟ǎ#m_1!)σN,5,{pbQQ_qAh ANQdk23ȼ@ RA(F( FF䲃rCxJ}1B@i01#CL/R9Ed'nZ KY{*:^S&$4YEHIe3PJp�0!P2 C~V !( %{/KGOM�bpnA4IhH ۍiit Fd#rRq]�,7!%ޞLHf}HJ[Зf،iܝ:$RC,5 Ģb _BPP̎Xč Ҟ0R C ,tᛶJz!6ےkrBq(j?%V=y9 W%v-=[qOG3cޡ凑WE_Z7NRvn5̰ס;[$c[)G)?^ϲ)J⯕d|u﹟U"q|νݾWJDU򕍟vϷۛg-)Yn)jÖE_])HV-6nuCw]]"*>q'W"*JV2Z[w9\a}tu7=GS-Uq|)WR|)WVnz<U\E_)Y?i;\E_ &pcsᮗf!8'~f}tY4Hc- AYƕW@C!Z݆+IHOG;]+qc{UUɥr`)5JP 7 B W,7t ZI'd'BQP܄`V+|80VF#0-B23oϛ|/twp<(U_#?&I t≩B0iEB6ߣLh1_nR:6~CC!w B7JԄ|13Xv?~/ǫl#]=?9<|jt R0iHG~Ϸw]/Nqs8ϗc9}M_>o7nϜ[gWJZJ϶v-E_)JDU~lvguo`\ߝǬYe*clq:*7^-{\]]fvם{|#"||7zlolgmq}۶߲۰t⯳;gv^gڮ)HRw?>[yNϗc9}\̯WJN*JR""*JR"۷۲Ϸ8'}}QW~А?út/Nqs8Ru)g0oW8)HRe6=g:[)UtE_)JDU>}?oٟ&>۲8ҊRRce=jjvם{|#QWRfv;ei_])Hϻg۳QsvŶqtUn:}ou*J͘ysI핢*JDUE_)JWc3u9矔ꈫnwesƟWYϲ7w3U7r<kWYn)jÖE_]gvo%]fm6[lf}t'|)WR|)WR|cg~iJ{k}t'}0_擱+Uґ|+{[-;~0w3ne:HRfuǩLٱZWHRվ?ù)HR)XJnruZ*ݻq]n9_q+3=Jf͏_uԪgl~6V~*j۝niғV~z8U]~Ct_lfǶҊ>}s>'|)WRcn*3fs;)W(cgݳl*8Bfs39eE)(fxu;Uס oّuQWRR)XkߝLicDUҔٜ?6SqN|7}y7r(+?ϟm7n[vW8+?7SF_^sǯ:QWYFmͶV]'|)WR~~;xR|)WR|f++6[q|+7wW-Yyr۾)WRcn*}۷v};/2kU])8)YoS6lz֥DUҔg+St)HR,#ոn=J~ډE_)JN*JR""*7^-{\]])WR}ֽ_?u])WR|cfu=bK)H:?vG]])WR|fxu;U"fsvwSa>"n۾Õ*JR"վ?ùgf~+?/()8+>o7nϜ[gWWR|)Wg9{w5g7՝[#.QWJRqWR|cfu=bK�������z)HV~[OlWHV:nvZFDU:Zv[w9xitE_)JDU~?a5tw+m:U⯔gwי_|'."E_f?gmjR""*YFmͶV]"*JR"b߫3f[7uUҔ)HR)HR)Xٻa q|eo0rHRǫ2KTE_])Y2~)JÔE_]+mws?OQ(+?7SW8)Hϗc9}])WRu)g0oWJR"e~R߇)R""*>}>?3y{R"fuǩn̷RWJۻv݄UUE_fv|++WJDUٶm*JDUE_)JDUfc?lE_)JDUdmlemUUǨ|-6mٶc6'|+:Ԭwo۷|⯔"*{-{);0WdzS[}d+m.}۷v靳/nq]mWJRqWR|g?[loq};/2kU]gwי_|'.QWRR)HR+>Wۯu{x]\E_)JDU[flu0R|cg~j*Ywn<Utgf~+?/zBh'잔9[#X/ɜJ,!*9]%n17䑛繶YU QN)ݖ^|7po!e`(1%G(7Y!i$#}t,(@% %%)B{lѳ~/%m^P@b !!VKVHbRߥ!(rSopw06mU~@ )( OBR`'dn/+/V\ HjR__/#$Fg FQ/gnv.Q0bqe!J1DoHhrVR@n ar-9Y G+/$$nfɳ;9a'Wk0se>D2i{`)p$+ J9F%KNC ݻ n/Q:;gwt~p,1j[ʯ~z5])8+7w=]~S""*J͘ysI합Ϳa}l=[QWJ ao[}^Z}ú𸊾V-6nuCw]3=Kw͏Ve#%;;?7w"*YM[6nrQo[_*Yݾu^뫤⯔f;}>{n}t"*;=kfWu2~wRF-J*ӓG۬J n!B)HWݾoߩm%)W�Ć^gO}d#t_eo% 4R3}a3g4+^B nRF `!,XҔp'nj~9G/eUInMrZPR@nۆ!-Ɨ_$ĺ;F2Y ;7J@()ƬJ 5*ͰNUBJJ 冠 /s% Pߑ?BrRӓI05% -lơ#0f%Z-9gZUa4hj\ҔG(}#2 XjrM$m!.#') KTƤj@SKJF�O(a@[jpd( @`QaK ~W�iВV}uSdU\L@h%tS'r#Cb!;0[C81(J6nM%$fJZq(fl޴IcV-=?e.VNFtqmA^N%$4!cXѣ: n%})NqDU/^`Wr&%*J~&i^OאHhiaO`rxbI\xӿR+Q+�T|LA0CCrRugI%=!8Ha `0CAeXai,19o_ħ?Q%іZ+)W0_% +JJq}$]ͽh¹x:R '|їAj|:C6u}.jJR""*JR"3┬=on7oy׾:}t'};/▮=MUґ}֦(Ye.V/onWmێWGUҔUέWHRs5LUUE_+yen%.|)WNB~GNm7B>OmM+ K`vIe)E䝲6}y0to^Xݺq'p|CJI|7q!<w+nA%@͋,fNy"�diW& 4CenQ3$+|䲐5BbK(0G O:PS (5=?{[ Ah OI5)- Nj9cqph5(H`۔FB#0߲ *_Ϛ70/"*үL!1V% Opġ$!) v']JI0~JF&>bWaJ{�¿e;z\7WNIϱ*@bh!{--cޔK%ٖ8"u}@Aer`3F $NB)()ZƤ^'XnI|RE$bp9Pa1$ݑCOnf n70Ay/}[M@ Nt0go1(ľ@j>-\:Wm"?_59ŧY ?yƤ|['6NJ5 104@tqM pA- JOΟXBBC21 E|^FO)..^,q.Pb ;Rw+$ '4$ _/ۧJt ̔v^~c�ZI3B2v7F$HѲ;$U15ؾӝ1-̽`clQ+(0g/2\ p%)[oN/ Qif׸םf,gW^?:fqu|2LWz4U⯔"*JR""*JR"g7՝[#."^u~R)HRf竱uU"gvo%E_])HCŤo;!?oԦw}\ N姁NIlR8B�ˣrSb m- Ͼ _H Rxo)d) C_K] 9lۜxh}_R t#A``%;2΍{֒ gb6%4)+.8 p35YXեRXM/6,7/%k`-yw,m^%LNA1S[od#fFs & f,>G$jY)FG#6gtҀӛ!-?s 3|ԒFb0̌0KߖߣԔ3nb6fLgW򉟆6No@NyhSKOެnIHt` /d%dM;aBѼ}(3V/ NF?ᙰdZ2 (W!F+!<drpJ67(vrWBa  XhF @h ,[ 5 AdZ9+1҄Q^l /wŠ__Ĵ)$ 0K+,OB\jJlOӀ2R+@RRWٳ^Sffqe8B &,JC; t#!אV|-( BVV%[+t''$` yt^( ))e ϷцF*J,jPPr~BMIOt>aƅ sٷ_^}|/~7r<k:2@Xil`&+uv;*~lvgtqWo=5#gmQW͙JVVl8ٝef~+6m?}[jRg+Stg?[lot~_ٛtߩ+3=Jf͏_uԩE_]fg籜~y>3fǯjU\E_)JN*JR""*iF AhBQ'|bM&PhfN0#wK%UƯIH/t%;;cWDr )&% `VB % רA1< 䆕 _|Q+aF>�fL%8JR[ N/#lm07)(e %!oiR7J1(λNv_SoW"h~Id`0Y1i 3vְš G/n!#JJ?(n̎(+xo@j~O!GJ7JЀĖNI] M( %r0iE#V)(GH@k :qHC+";HU1CC0!Pz@l7+d- cː�j6YA)a7#ӿV+�kMHzM@ cyh+X r6R%m 8gJ78Axb%'l$HKgW<oA`o %ߕBy@ WĒ0Ґġa1'eJ(MFG}IJ%mo B /tdC~9]?cI ??3F~|UlP O)R$P y&Yr]. m՝!^MFW(o$RR_%I_o>>vם{|#$p7`*Yݻm+~} oWztUE_)JDUE_)JDUE_)JfߊCR|f6ՙ'""*y6en!*w?>[yNV>}?oٟ&QWJRqWR|)WoٟX LdXkn%)!/Wvu|2L:P5}ϾR\MJ !V ҍ#T?M5)KA-$rBIE%q<30zy�(夭Ӻ6qht q9/�lr1EoPB: `7yx;a@0,RLF?2�Jx͓dBsd ʲaE/J801#KHKJA,hϝ}@_R<a=p>Y-e^tМM%ØqW@IE b`CJ)tr j3ޜZTG(7 mx`f& r6ۥmufuR8U~ŠZ6oݶ[++kJ]ފR*JR""*J͆m2?O]\E_+?fW)]}rE_)JDUvvW|)WR|+Y7uL!"v݅atföeґ|)WV~̯ߊR?WWVn{N|F^Vc+>QWy+~c >}s>e6=g:[)T[ne̺DU򕍟ߛv) UE_)Yo=5f+uv;E_+;meo~/a-Y7uL!QWJoZslqW̧Qu]"*JR"~z5])Wٳ9l8㲝utE_)JDUm?zQ%(?|z>u%|չ_wE"*JV~z8T⯮E_)JϜߗc9tE_])HR;/▮=MDUҔgg1q:|)WR|)WͿa}l=[79]RHR)HVw3ne:WR|)WR|)WR|![lԥut)HR)HR+7;-MQTU\E_)JDU9ef0gWHV}nWoWGE_+-[s-;~4DUE_)JDU򕎿Qe""*JR"wsNy:Y?i;ٝef~qWYݻ]|9_έ(vo%6V/)|]]fv|++WJV~z8T⯝/Nqs8g[zu-UtU⯔"*Ym U"}ovnr=6ά=utU6?~o8&U2ZSv=|itE_)JDUE_)JDUE_cnwesƟWJgo;g*JN*YB{-K7qݍ's^UҔUE_)JDU~g*JžVfnS ~ꈫx7?U""*>p9utE_)Y?eoa?\E_)JDU|>߳?aOLE_]f;}>{nt)HR)H[SJhu5ݶWs769芾R_)JDU9/ssX긊R)X|own۰|z-<]])Wl}v|8R""*JR"���H����z+6?~/ǫl#UUٍ|7;Uҽ>n?XτڢQWugVl˫'|fv쿳og!\E_)JDUw3~u:黏?i;]gvo%lmgն|)WRײ׿;ӱ)WR|)WRo>|v쿳og!])Wϻg۳U~[Ol()8)HR)H^Sc{2L}Rcՙnoיf[2}t'|c/wu)9bk;?[qNVl{Vc}t'}3fǯjU7}>;]_Ϸo 򊾺Vm_R|({v|}ݟ*"⯕ݔƝV?u]"*Yݲ3~3<;wrRQeqWJR""*Y Ͼ U""*JR"v݅atE_)JDUE_+6m?}[jDUolmUE_x͙3ٻ)IE_)Jy/|wcI}tg۷vvxm a߈t)Yo=5u7=GS-Ut+7^-{\]\E_c/e)9jJ!콖aurRU򕟶o`\E_)J̧QtE_])HRǟw0^+7^-{\]\E_)JDUE_)YJ)kݾN^d|u﹟Sclq:*JN*JR"9ef0gWJDUE_)Yoٟ ^Q3OK!HHdC|gӫ?݊|6_vN/9ۣ$^䲺:BەJ;7|TX4 Hħ1!%r$} 5{}sY ӫ! PVFܢA?OF\y %`ħ'!CRSj3u#[m􁞒WJ^7ZKrb@v57%*t|,f-F| Fl'�oU_4MMgWud3_VߍN/o+]^O^-$҆%?!;?RC2PH%d).5w/jI+щE[?P3)Su[n9�{Juߛv) W͆m2?O]]gs>Sa>QWYugVl˫⯿'vZӟnpOuo|u?J*Yݻ]|9_qWR|)WR|)WR|~uu/VSfڢQWRRE_]+7μpuq}|fs?)OwooϪ(g6gojrK(tOFd_eUd0 7Ѕ?rҌRXk$\?WGἬq/7ZcR%?%$ͺyIJCMnfFOAK#C e&qA78P -e-ҍ6O/!d7־h᡻%BJ/lH!3puiJC (a7Ѷf)$|+YiF]ܠԡ%>JK%|58YYlb�pbKMGHjSB#0JFtlIdg@ВQX[5w P>+€JJ ~d!ҞYe7tb:@xiEϺq)c ۏ92U| 7-8'0o Hhi}(rM-!3O, `܂e;Pa/W% %~Ϗz0ae?tW(1=qy#Or? d"g B /$/7oɉ[ƅaYP5ДkZ_#t Gk{VciH-EbɥXY'r~|2C6wK/ZFFB%?D}l}ݻ>qmE6V/)|]yO6ؒ5ՎO Sov^dz)J"*JR"#n1=+:V>>n۰"QWJRqWRέWJR"fsNqe:靳/YWIE_+?c⯔'}}""*JR""*uW#یeeY~_mVFDfodt!G',9W !ēq)IjB pKHbS҄!|Jhɜ53=-Ҕ|̄ ;5A #J %J `W OOnMrQ J2S7 A|Y[k!nqj'ej`bC%)t)3i/+rI( /e~$7}JEVFAE3ܖvoA,ўƍ0@gZQشydgn΄}?К E5?ϐ1 N#CdnroI7ܚRw ovN_b ImyhPn(0jR0=)!lFr 2CC�`2QhAEnjKJ>Pg%@ܔ~GŘ%|$ 15$( A0,g)3mPB&"g@o͐K6Js0 rWaI(P F(n%nZJFNb[td!{`0% RRrV/% ^KgʰC 8>u5) ( )nPޡf&, /t#w%j_F%K+ݻaLI1ZJ%'## Owߡ)&J+r,ryR7n3 !()8WU�tB&3) bٷI);|:+bB?/vq_Hi76wI1<J-@YCQէ/y¯omwuoSR亾e4$uWJgo;g|)WRo>|Ͼ|/>/}WJφﻯ2;N\⯳3Vw3ne:}t~:W~1mxQW2~)JÔ]f?gmjRUE_)JDUlmR"H8ܐ .~~vkk,Zr|${QW@43nŠ唜RVF}*Ő׷ @ՃFӘ{bY/laa 0 M%Aeh?$"߱4_JQA+pa0VrY3l̫SsYN<j�7 'F-?%)?$!9 EcNa5< ` wG #|#F{MN'ri) p3(7sr^bOp*)R(4=#vG +txicf)0WPt,Mߖp04 ()9!/03E$ҐĺPnQnZ>C\:K)%+'`1Ѱa1IJ>qҝI2?}vK,H]$222Hſb❾JS77!w >q̣WDB`2PbpaE jYwFNt,fv/wYA pɻRZRW )Q/*�l(5' t#$ ёXa/Yd̎t#d%FI(2%qw�_扁CS/$Xb::IxRYѾjq4]<+/6+>!(bPϋ#z%`‹V O,404j{ n=#f HFBI<w!g*HJ7 AjSf[ R &HnPf/oCp@mL9]ہB-Rw,/1,%ƧrP3lxi [fne0R羚f:/Uw»|r=]"*7}>;]_o:;gF]\'}3fǯjU])WR|e6=g:[)Utfo籼lq>|)W͙JVVlݻm+~} oW()I_)Y9l8㲝uq}ݔƝV?t6@ٛ6l0fläݾݕ}>*fJ*R3dmخQiI( ,zشa  &HJ RdMC+K$^MJ !IXi}`/ tbW;?y(9d+-*|^ғ|_ጀ΄d%Im )% gJ_[z93b(1e$W( :';%?;vJNG-cLAl,yR/I#Ƀ0' OfBRK5PcZUΒf/#90ذ@[3WBQl0Xa})- 445 ƌJP7dq%3=PL jpF$[r_-7,`ONާ %AI{J {$ 0o+ ZWח\n%sbW@!bJ?A+n%tY-.>+J+`ģt +%; ~& Y+2BYYyIC_fP݃WGrN?�w_u:B J J0h JRR~&Pؤoܴ%?֠(Xi4H(3JRV/%0dmބ!z0hca4̔7GIH%r> 0!�Iq)8FK jQf]tݥQuW@gԁ2-?x͑ ')YBKV}^Ɠ/UҖ)HRQe";gc;WJ_VsN/>QWJWc3u9矔ꫜU[fne0Vo~_oVF)HRf+JTE_]gϾ|/>/}WHWk~ّԧ_^3X}E%} gVeRqWVn|{W矍c*JoώWoW"HR8ԧL҄7 7W6_Ā貰aH@o |rYAXj A(jYd7I0V(4i,ΒB?3{9_m|)(Ӓ=sCwE g>K%%~0%A_*P�ѐMN%8IIkPIhg%^O@&a;'h3|JKZI[$c7 Bw-)bM )퓸|kZ@E :I8Q,7GB Ԟh 3�:&Y7-45K)tX<|Vgr A <W ORq](FA}'\$�%?Jw(A}?#.y|drҒhճ.ӑ{f9mٍhre %f-*%%~5Kw~K3##9h13ۻ.K _)YoS6lz֥Uʯ׶?ñNF,zy'acD'|)WR}ߝǬYe*vϷۛg-|>߳?aOL⯳̯Om a߈tU}|j?×QYFmͶVE_>v=]ϖǞwS}.}8W+ғRgǫu""*{[-;~0V}^Z}úE_?m߶;3YjVmmmmWJRqWٸݾu^SwuNyxE_])I_)JDUE_)JDU||~gtE_)JDU;/▮=MScֶlw[)JUҔUE_fsvwSa>fv;ejonWmێWGUnZp}WI_)JDU-6nuCw]])WϲUk^w^WHRcfu=bKE_)JDU(g)bsv:ZvSv=XarRUo_ZoR"1cXDUE_)JDU2ZSv=|itE_)Y1w~8Uq|cgݳl**JR""*JR"c~>q4ه4ZRfuR_)JDUE_)YͿa}l=["վ?ùC7}v5ZQWv!])8f++6[u4zê|)8)HRu4zéBKݟ U*Y}~=[aR)HRf7r8kWWVmmmmWWR|)WV||~gq|o|u?Sclq:|)8)ḨQu7qݍ's^e~R߇)j_VWW_ۋϜCN*Yg9{w5E_c/u|esM6mmͪ7μprgln۾Wl[Uҳm7RR|>}ݻamE])WV}^Z}ú𺸊:?vG]])WRշ;ӹO)WR}R['8w%|ǟv4zR)HR;/2kTE_])HR)HR+~?%|)8ce=jjE_+?m߶;3YjDUww;DU!콖aq|ǟv4zc~>q5rRUg7lwu:y6en!*QWRR)Hm{wۊKjV>}?oٟ&QWJRqWR|u4zèl}v|8E_)Jϟ}Ϗ^}^q��������z+3_;Fcqq|fsvwSa>""*JR"en0gWJͶߋҊ^Sc{2WI_)JDU7uwn"E_)JſVfnSn눫)WٹjlruRHQ}])WRέWY:~)J̓]"*Jž^fn[|˦++6[򊾺RR)HRn۾Õ*MSnr-Uґ}3fs;)WJDU w^ew𜺸R)HR)HRn+þoґ|ce~we1cՏWWV}}}׾}WWR|)W}ۊqη-6=YZ|)8)HRgwי_|'.|)WR|)WV}^Z}ú𺸊R)HR)HV~~s_c1w~8UrRwu|R՗-l3mYz*kNaUm_RmZٳsl*8W+"'|)Wٻ?i;])WR|+6g_)YYz߿)WM[6nrUґ|e6=g:[)Ut)HR)HͲ6mmͪHR)HRl߳qOM]+7wW-Yyr۾Uנ##c6eT[ɥė7~΄?mW| jWyE^ؙJ-0j28 JNnnQ- !NNO +rNТb .�fPSPͱL0H3 J?0acw^N|qHDC+'6톡ߔߔۊ ,K O<%tW,d- q1J�bLCؿ%J>uY7E-xgn^|5򝙖d**JRqWR|+3=Kw͏VeRmlz4E_])HRV/Um7R""*Y}~=[a||3?"cgݳl"*J^Sc{2WJϗc9}6ά=r͘cy㱬}]'|f+uv;7՝[#.QW_)Gl߾fDe~ݮ@~ܴ~G%{mn)p.[g@͟b^nƺ؛J ,1,Yxw)h=B&(`7R!t'r@P !#:r0nJ_8IOBYSQWRSrܢ9e`.%'ǁ{ZKd ndnQ 1i&H|R6 H PnA[|[ B@fdz.d7%PBXc)ܔoٵ;%_EC#>I{y|B�-BzS-==jIr�@w% O@a3RWh^ `6HJ(F b_ N)៍*@% d_P3~_%B1z W^ ,BBK&5 ϊӃ9I%FOhg#P7Џj:#u>_Iy, ,CޔWrRܮ!I7~JR(a-9$Š QH/c[eb ,j|{W矍cQvL,71aGqp fJ[lIW)KIU|쿛Z7}WJDUn{N|WJDU|7}y7rH_VsN/>)YN^E_])Yݟ DU-7~u2KU]fm6[lfҊRR׳s1LUE_f<?vtE_fm6[lfu;/2kU\ٍ|7;;g_ٷ"#ц~۷NGV tKHRVm'ѳTRZ�JVvn=++9X7, !TV%%pq'z$ jH( 2>dr t#Y) 4Q,1YK-oʽ)EZv O' EC@lF,'fА*M(LH ( y=(ؽɉI}  BfZRٻk'WWM@h|^AeKC#)bqEI{bH&!Q7nzFq7b[+'d�x598b tؾR2rP `f%9?J(\CY1?;F@iI)ac@a0r5!$L`RKB~ܬuKddCJ?Fh HRVLmhGHi7xji'lBP5),0=8 m|L>pMIe#1YW!ENpN{5s(K q7bRB ;d C''ޅ.}v7b  I-~J{#}XĠ J^% :O%n�j= eXn (1I<!Qmܕa,b7quQdi2 HBC G)(bZqiOC||0n۱;wZ變 ri[bW&| O( r]%쎅klV9! / V'/b~egQE_)J^ݝ_)JDUn|{W矍cHR)HR}Z׻ׅUE_)JDUE_)JDU_u~"w»|r=]"*JR""*$3k0ѠXn)̥%޼tTryjI(aYɽ} jz[;{`YI,U2 S~dri݋GAvFJCkuXWWW!%C?r4 _IcILLSκD4WC B GE0bPi(3~%JC13/RI, 冩!ḿWHjr%o],8%p1n%t3/%~߶^{0<ӉuWWyXa߈\&tR5$or5 daԓS�ܘ0K%ACJA5[0!{? %~J 2PZJAx,R|q0 KA4V+-$bnVI|7lJٚFmVuU;`Wpi7BF)ܚ1(ᘽFf R5 %84ZCS/p²zFw?_'60�4N dIPGavJ� _-q0ŧ f~Pܤg^Åf0QW (4b:J 6)rXj2ơ(-3?םn0YiПOtQ($hKI@6&QH΁ZV ,bq\40n_5 `h8ޔݾadugU5 0],XKpπH~2bR[3lW)>kB ̜`̟F,9ܮ0gFk':t 0Z~,4K 5'6(1mybj:Ό|>شJI_{;x~<;*ԯB-Oٟ=EU򱗺վ?ù⯕ݖ^?}]"*3e~+?a3}en+q-@[mV*)JU|)WjnzuZHV-7~u2KU?ٷ?l/퇫~#U*JRqWپݻq]n9_q)Hm׏Yñu]+{c);4E_>v=]ϖǞwSUg7ve:H)DR)hv)N7@l?(ـrlZJn(_p`0۠wBv(k緡g+9Emţ'3l4oG.#W'boA43@ќW.ܤѷ J Œ|A7H-4`0C�ۆJjJǷnB@a18( (>JFt H̞7!f(Y0NN9(8ܴbtOqd^گ�Õ0J rS NRy䙰B{!140oimoF 1=,%읿z BSM)(BQ1etb/JHb1Fv` $%d|BAC JBRvJ21Hh,RH ,$RII,RPJZ9]Z@H`Ԁơ9 A)#[Vqߛ~Vu^i%2xiDgII &ƣA$C@<5 LA}n(M3t~S'[N`N\�$i$0#al3tvBYeplKCrPnL%>O, :F @“J6}l  (e$41$>b'!tH�ޒX3OAPFG,k7jǷ4U IaLJ2b^nHJE`Y]58oY\0 ձat(B+dp,̝Y3Я|Fm?{rU`#E^}.k:R)HW -lsU⯕/Կ`.o`\f+JU{;MYΣ]\E_)JN*Yn)j]"*Y/nq]mWHR+?_/eX]\E_)YJ)kݾ*JWK^wWWWٝ/YWJDU`0W|K|JNO'a4'K$Y5,_bZ xj|}Z׻ׅ! FYe:6A43Jz_fy%�y]_I 0$ ``)')A!$.Y 4B6@Č>pԖ^FFO]Mk�PZzQ�-KE%+mX\"dQXa0Q/7bRW/)~w:X9jByadv H%n OII BC9y(YE%nἵ i41=A{n,%2+XıLY0m! ,7(-?dlFJRPWNi\ahd ),fS񹱌<:* JSH !#%ܬ@NJs>=v!I/pnAD^HP`'ٿaA$lOIy= qC7$m!b5{ GaeJK?enIU` #|4u_p3*푶mmmWK{:ٕJW_~J⯔'}}"gg1q:"E_)JDUE_+?m߶;3Yjn{N|W()I_gǫuѳ~?a4o|u?U*JRqWR|)WugVlˣg~j(+7swsvwSa>"~3|ے7V(f:/UҔU}nWoWG[(,:J__#,lBԞ]bٻe?ac=ê)}XVnZp}8[ne̺N*JR"}Z׻ׅw3z<kWIE_)JN*JV~lvg}tfv|++WJR"}.|+?m߶;3YhR}^u~R"V/""*JR"?>δcM:<]Efm6[lfrR9ef0gW8)HRlmRӻvVvQWJRqWR|g*uw; <?v򊾺R>wdvS${wRUE_+І쭛q?RQWRRlmRUE_)Jy+~c *;oen/>q7}>;]_E_])I_cݻ n*HRcgݳl*Wٝ/YWJDUٜ?6SqNRmlz4E_])HV^RmmmmmW(79]RYN^E_])I_)JDUE_)YuW| ˫ce~we1cՏOWs3뫔U/~<3~wcE_gs>Sa>UfsNqe:;oen/>q}t'}^u~VlοߊR`()8)HV-6luCfU]gǫu*?i;])8+HKg[TJ*JϷo sV6?~o8&vvWQWJRqWR|ٶmWR|+?lgggQW_vc>|oW;2}դu69GS)uq}XRqW2~)JÔ]g<;wrRU:ZvSv=XauQeQWRR}."E_)JDUe0zӢ*JDU3fs;)WWR|)WR|)WR|)WMSnr-Uґ|)WRm7R|)WV~z8U\E_)Jُ_c3ꈫ)WR!՛wնS(g e/? @�������z)HRf߶WJDUE_)XkߝLicUUlmR""*JR""*7;-MQTUz Gۜt'wew[}deo0r銾RE_)JDU:ZvSv=Xatٜ?6SqNE_]fͶ~/+mWI_+7qݍ's^f~+?/W()I_)Yn)jÖ\E_)JDU:ZvSv=Xagl?OٕJW_~|)8)Yݟ DUm7ϝqKWW||)8)HR)YM[6nrDUҔvn>WJ͙_s3e9Uұo[_}1cXR">]"*JR"׳s1Lґ|-Ii ĽJ>wS*4*R)Xj۝niUҔ+6c_=+cƱ'}}QWJRqWٹjlruRHRe79g:[-utE_)JDUoיf[2>o7nϜ[g(6ՙ'UۯN9cx긊V~[OlWH׎cyu])Wݻ}+qy}WJDUE_)JDU-7~u2KU])WR:cԷ|f[j)WٶBKHR)HV~3Yտ?2W?eoa?]+3=Jf͏_uԩE_])I_)JDUE_)Jm׏YñtE_;meo~/a-{[-;~0E_gu6ǭlٹRWJ^Sc{2Wgo;g9u)o0oWk%gw }(R7Rц!w@۩{y4 !(+onO+/P9h0gݽk'~oduqޙ;֜uvSv|뾓P?%%wW6A]$N{w%rAk-I5C{%rI\c;lp yBvlF1B\{}`݆y'`Ǫum4rjJW|)WR|zݶw=OO~~;yE^wf/>wY>+>}s>UE_cfu=bKgSwҊVo_Zo_)JDU~g*JDUE_)k侌?-v+t(79yZI_)Yݻq]n9_qտ~d!%y6~vK;k'rb Sd$gq[vd&AmNrwr-(IErqGgdBN| �ۧd)vO +{vͱJY4~ +nQl +)8Ay_ aY$ %I aBМEM@j@gO AaO`3$j{@)l{du5$Q,pt /rWAAOm.mۇk]U~Ɂ ( Oῆ%�e=y~L#1nie HۧJ:ɘdwCRQaҋJCS_%;J/?G%Yy*&/nVу3r& O.phI-ҏFR5vlsII SI + uH@$I,|4/}`} :yHA]aY!BpPXJ+d(+ o%5 ^B>N(WYIYE ~%EgvC!&toroԠ0r1I)nPf5%?2%wo3;ۉ>ƯJR羚"*JV>>n۰""~z5]"*7s>_=Ʊu|ߺLW(fo籼lq>R+y6en!*""*JR"'o/}ޮ""*JR"fc?l"*;=kfWurFVRY=@?u-MdK+)!oguW2So!nΞ1_e:p(9hB2zR7򆒶%c @ѩŷUvF% %-_%t _3y VƤҴ79׵ Jqa g-(^Hݿ!(0݂NpU�0IEP_)=bye5ܴrݶ$neK+r^/�YYE(@iI@c;2'RVn/oJ-о1r~ḛ�ܮJ )9!OJ ,ay<XQc:~<S̟qd#rƅW[ BC>A[b`/tr%~~_-Y 冡~5vK3d^($̄)JC2 |r4LC~޸l58^AhB +R>adỗx;gykJՒYlgJϑ߲~QJ-!rFXb:\g&tAdtk /C(o`FC%$Y ,WObd)<n_QٜPy:n&C(7 :Cvp2] z}ɏM` ! %t:x(Xii H`jSZRz~I|A d(~JZ B8v߳εJKB&Y9l')-O{N|}sUҔ*Y}~=[a0_擱+Sm7E_]+{-{);0~z8TE_])I_)JDU̯WHoZsl/Nqs8Ʃl!jb*Rf6ՙ'|g e/? )Hϳ3ҳ֧|[-jU}ovnr=z_nFnwS|zeV:w}IVR uz:Hqv3 [gC; gC#%j߾*!8Kf͏'%??%^BCh8X %1A%f_CkF{(0%b^A1KGO|iI)D;8 Lܶb=K#�)$|75%lNw@Jr[AX5R`ĥ)-$^ I-;,?]X o &! %DQhл̀VFJy`X7+b) 3}4,r H G/d7;}SЅOG~̻s2ÇZUIO@ҹI/J rQIGbvٝBbHEtb`XNgJ6NBP7+=cF4zR&PfI3rPLF&d-K$A)7 Gť*Υj{NCA ~7L@) Pi0qc,BP3a(b9cCC?d^ʬ(4 !!;8b I, $ћ,i_=z'#Yo0ħg8'׸BF0`ԣdt̳TJ/򓒀2~u e3^~�* 9i5)FKaJ#R[{RfuǩLٱZWXkߝLicJ*?i;])8l}ݻ>qmE])WR|)Wٝ/YWJDUE_gSwtE_)JDUw3ne:9[lԼffU⯔"*k _۟=Ӿ߯/oKZyhCZ_6eTUF2K/v�7)&%4!27(&dp058$ {0)()%n1*$}^10ѱAb^Iy;voxZÖ,.ү\$?%$ҐtyY83#'b8J5ē@t5) #!Obgt#ҷѐ7\1e otI_dq@f oܫ\1dFB MČ6粗9ʼnq0Yh-9$j)~RNO+N(ayLFHaeJW FqIYE07_ܼ33P y9h%K@ %JΜد<iC�H (! G9ț<0%dk`$0 YdXa0`&`Ԗ@i7!c$Ҏ#$lcj%! byd}JNO \ovW't!SbV/7 /?O nݘR|oQiZvAC2pjw !_ߍ'PL%t$#' f l8!}g&(`_{Pa4XBK+! `tbLbAero( JQA%!; `ԧmlR}~*uQ$m-3B?Q[n+clq:Ͷuf_뫾f;}>{n0~U򕟳+┮9Oal̿WJRqW1l۳9}L}RcՙnQWRRcֶlw[)J)Y1w~8Q}u۷۲Ϸ8uolm*JN*JR""*JVlNlWJR""*5%'r&RTcw8n)w&Ö^ bB%$kN));{ֲV ?Kf[fk%lU�c5!(a]<$;% Rv&6JRt Y]K&WF1%z>=b2RXFҞ)+>5)䟽I,i](J idW)(J;% c2 -$_QںZ +�tbђRKSlPn+Kܢjw) B\_-BvH"ɘj{}(F%#!~FmX!PЀѨ%X%~F#B~<p*W@MɤџKHѣ37tnB]?=A 0ѹ3'YI@hͷ A/>N?.h Y%rҀn`nP̒FHщAa''�\7;rb0alF@jFap%ţt>A9jYTeXjQv) b:])%=e0R)+:~Y0ξ=?IJW'/ͽ[ UM_)YoS6lz֥UUE_)JDU׶?ñNE_fo籼lq>)HR+7sw)HVmmmmWYo9[v5Uҕ6`⯮l߳qOLE_])HR%N{>;JIZF6ՙ'-%ݛ`QY?eoa?⯮�XP53W6x wNFHw wŤ5 KKK{od ^ݓd7'Wd !77푶mmmWKGsWR_zTw9mOwo>|v!3}en+q-RE_)JDU9/ssX긊R)HR@_Wgc9S;7SE^Qeo>|+6mٶc6UwS|zeUtJz2z߁J*)JN*JR""*6ά=t_u~ϻg۳UғRw>+3}en+q-|own۰E_]+{-{);0_)JϝWs3눫n:}ou"g۷vvx}ۊqٍ|7;*JRqWm a߈t)HVwn~߶_n[""*6V/)|]>v=]ϖǞwSϲUk^w^WJϻg۳DUҔUE_)JDUE_)JDUE_f;}>{nݾݕ}>ٝef~QWJVnz<T⯮E_)Yݻm+~} oWWR3z8kWJR""*JV:nvZFR|+?ϟm7n[vWJR"|ZVJ=K\ǫ2KU]%|)8)HϜyws HV}^Z}úDU7r<kWHR)HROnݖNW%|+7}>;]__y6en!*gf~+?/WHj_VM6mmͪ()I_+YuL%|)Wط-q/ut!콖arn|wg»t⯔go1y:";gc;WWžVfnS ~ꫤE_+yen%.|)WR|)WMSnr-Uґ}dmlemUґ|)WR|+ҽ~۫}(l}ݻ>qmE3=Jf͏_uԪRqcgq$jz"*JRqWR|)W}ۊqtu69GS)utE_gs6Sa:fvם{|#׳s1L*N^])8)HR;g_ٷ"" �������zz1?j{39~]'|)WR|)WRo|I7+;lbURUE_)X-q/uq|)WR|η)6=}RƄns+yGJ*+;=kfWuN*JR""*JR""*JR""*J_ScsղWWߒvs78)IE_go1y:3fǯjTE_]ce=jj⯳w3z<kWJDUf߶WJR"c/u|esW͙_s3e9뫬fxu;U*Y7uL!|:rM|9n|u?їվ?ùU~ߟ;e|쿛Z7}WYݾu^UҔU%{uqq}t"*6g=}͔vS6`⯱svŶqtE_)JDUg7ve:>ݿ۷|+χ+#*?c?^9t⯔c |b*JDUE_+7n++#"w3z<kWYͶuf_뫔Un|{W矍cI_)JDUE_+7wW-Yyr۾E_)Jϗc9|E_]gǫu"f:/UE_)Jo:;gF\E_]g?[lot+;=jw^e֪R>E_])H͘ysI핪HRgs6Sa:|g e/? )HRه4Z+3=Kw͏VeR)HV>>n۰"|ߺL:Xg, kg!|51WKR@0 R_$vnjo105�Z IH%Q(ic27FJB3ݽUU2~gN^-!Ҕ}38rh3fd>}<7Y-$f=*JW|̦~Z_E)I_+eĄiΧy3_;2FrR:Ԧl[JUmlz5?a'_U⯳c?"*JVn{N|WJR"NyxDU~~;z}nWoWGU⯔"*JoώWoW""*JR"clyu:e5Wǿĝ#d*vVR{mb5d#Ga; $ƙ_l0b_"swݚhx4VP J:CwOߗJ>$Abp1y?%}[wd# y(6Adi, 7R@~$(BԆ왐BFJt45t& LMB7+ؽЄ qےG!߲ZϖMܚ>MdbvJoK_C] fw`Ĥ Xh, B?%z_ D|dİfH`h (~+fN I�0L| ņf߷t䠾準iP 5$0({td+Ķ%|ݾYאMA{b  ,RzRP(ߥ)}y4'n+'` RwNtVx-Sw<}5f+uv;*JVgln۾Wl[DUҔum4rYJ)kݾ}t-; {-|vWXWJVwn~߶_n[*JDUm_RoώWoWQWRc~>q3R|)WR|'v 7?;׎UfuRN2QW͙JVVlݻ}+qy}F_ScsղWYN}Ͼ^|z-<]BK_* oo9t fN+X C14W(I)+%ъ/|3(homNN^ VAErJ(me9i'#wߵʎvuUH`TEF)yY'1(4h`ޟܼn % > Ҋd,pj{7(747J3!))>؄Z9[z,(g(pEj\Z:>۳.5cokWa C-<N(`ntd$`c#PVLF B 冥yo(7 I# =M-VJ7FA0WP{^dZ>@aI(19%d:JG, by)ߣt[?s*0Q[jr3rPj>+940-#;3#tv߸n,hha @ K 1, }RS oD Q`'$a%(,¶m!?% (ѿ%~W,gFl#3h[cs^*6B,nG_ߊۻ~.T�e B ,`` C:0Šu#?|dRPZw?|Q6u}▬9mU릯f>;=kfWuE_+6g_)YYz߿ǯߙuUU⯔"*;^?:fqtE_)JDU׳s1L"gwי_|'."Qe~ߟ;eE_g*uw; g1q:|)8)HV:Zv[w9xiuǫ2KT2?Ko,'vo֦?VtJZlqQj QH/d)~͸#ѿ{B$1.VAyJs!%x쌗?/mspTr~@R?#~g3[ZF !~3d}[:@\ dCRŌn$!? J rnCHba ';nF(k['Y&ē8fg ҄%; Q|0JIe9.1D.RF#%9#r>@d9 Թ|Ҋ- $1zQ3}X7t W >%ɡ~3d;C I[f",p}_@(K&bgI#ӲPW_&zF|C-8ĆnZ唜L/ рm))ס) \ b !7^@td(L,0-$SW0Ɂ7BRuWn<qRj1 !$4% Ie Axn ݻM)CRJKvA 7PnC5n!&QX77VBC W(5 Cf1_L KŹehdq3�)G JJR#Uq?Ӑ0HY oъ ,71$je^1!Jw4 ev ܔM $4pjqJ;r Β2]);c–!)VlolgmuNyxճ)8x3;Uґ|g?[loq|)WR|)WR|g6gojVn|{W矍c?eoa?\_7en^u~RR)HC%6 IF{1D$Hber0ߌ/da)C%:Q-ļJ{4L BCzK;t^~~uWW !N( Iy& Rwr!4%mA7#%281rQ@kԀzơ+CZ?_Ix#v�vW ;Mdd@[5 gJ7F sю0p8Qbhf)8}Z�v?OIhL KOߧmF&YDP`i{$3Jy_/ C+LZQN/ɸ[A7~߿t!5IHG9d^8RJ~=*S9X,7Z l ^GAh7}$trXn31)I,_씖ͷ@:%'u/ f+j8JFt%{j p'�_'1\nN%W GY=텁?ҫM%ZBI+Kᝊ)Zoѓa,j ၡI jPAxR`( ;V��Pbťn%p4'vf t.9@`ɛ_LJƕ) `M@@湸m[C !ɨٹi,j_!9Hlџ_p3ނR“|vۺWeWR9u)o0oz4U-6nuCw]]"*JV2ZSv=|i}t"*JR"u4zê*JR""*JWdWݻ9\(E_E)I_)JDUclyu:>Wۯu{x\w>⯳m7R"fv;ekXj Nd$`YK Ϸo _+-841/Ӑo[ђVٯ|Q $K@W& J a4Жq| ER$'e3{@* t~X6BB;].ay#X8E˴_,^&ߖ7&rai]8.hoºC\Pς8' +@NNٵ2E$:RdPϋ$ѷR ))+{x` WX|ձaJU_a %(姧)Qa8ۤ87|6^yaedGHn@A(oۓ' OtmXB ,hi %%_b-b(K5%7;\id0+`a% a\+ jxq,1]vi4wf{E_13bSx'|V (bXj6Hbn eM<P^B(;)^�'ё&4KJrS&*SmFrV'gw¹?SWm1owcE+-[s-;~4ljJo[ߋKy_])HR9ef0gWWR|Cm;)ٳ|/ɜݲ3~3U⯳w»|r=])Wf9MJ*7μput⯔"*JR"w>"*JqKV^n*yen%.3>>n۰"QWYFmͶV]zђNj3*n+þol^H|ާngVUEi&;$:\KK< �bуyY]9!FF;6ǴIL-;tJR0RFGksl%�qنr )q;>ұ*ЄfmcjRU|)8)HRgϾ|/>/}WHm׏Yñu])Wϳ3"|2LWYg9{w5Ufv;ej96sS +6V/)|]7μpq}uX|z-<]\E_)JN*JV-7~u2KTE_])HV2Z[w9\aݶm݄U⯳9u)o0oFϻg۳UQWRR|3?ґ}V/q|νݾWIE_{kd)Ov_}7W2u69GS)tvn>WHRUE_)JDUe79g:[-q|föeґ}}.)HR+>p9t'o/}QWJWۄgwOoE^~͛2nٕWJN*JR"iBlml3jRqWžVfnS ~ꫤE_)JDUE_gv!V^gOlNFS쿆rbQWV:nwZf)Vo_ZoDU򕎿Qe"eR~3Yտ?2()I_+;meo~/a-Wϻg۳U""*YBKWRo>|)WR|)WVlοߊR`O}Ϗ^}^QWWK^wWWJN*6c_=+cƱtE_)YoS6lz֥UUE_+y6en!*?߲ͿrR|ߺL8:22gH@`<󚢔U⯔"*ϔ7|QJJ*JRqWR|)WR|)WRέW}Rcՙn)HR)HVmmmmWHV}nWoWGE_)JDUײ׿;ӱKlj7W=%|)8gxu;Όe=3)()I_)JDUolmU򕟶o`\E_)JDUE_)JDU~[OlWJD@���H����zgSwt)HR)HR)Y:~)J̓E_])HRٝef~+?_/eX]\E_gǯߙuUnZp}W(c/u|esWI_+>v_-]]z_7enQWJ}ΧYw3usR)HR+>ϟ7SWWVn|{W矍c*>p9ut|>}ݻamD⯕gJ~Vy/g1|fs?)(g籜~y>fsNqe:l}v|8RR/Կ`."_7en"|{wt|ZRQWRR||7zR)HR)HR+?ϟm7n[vWWR|)WϝqKWW|WR|)WWḽ϶#g#9j⯔"*JR"~?a5tE_)J͙JVVl*6V/)|]]"*JV2Z[w9\a}udmlemSwu|R՗-E_)JN*>ݿ۷|+χ+#ҳέ(cg~j|+1$`eҊWc3u9矔ꫤ⯳9ef?]]+7n++#*JN*JVwS|zeJum4rW͘cy㱬}]"*JR""*YoS6lz֥*|)WR7r<kWJR"o|uz;t WW 峄V|~U 槜l#jVmmmmWJVͿa}l=["31%Aa奿Ξmi^շ;ӹO(RR)5;:bGO�#rh߿BJg#YZL"*m)KYUlolgm+mOo:;gF]]%}`ޥ~톳vZN.>۲8}u9/ssXN*JVmmmmWJR""*?fW)]}r"*JR""*Y?ua?]"*JV^RmV:ZvSv=XaӣJn͏BnR-[s-;~4RqWV>>n۰"XE_])I_)YugVl˟lٙ3tOo:;gF\}l9z> WettJv~*J%%rj60 BjR'%OFfҞ̂-($ĥ%tq ?]7\5"-B ’V!dӀlK3bFt#3kW҃Wp`70'b-ًF�b Ii/�47-!(Ʉ!'##'N& Q�-NJLT'7?$PWaPxax QLC >'vNBv0V;y4Thɝ }\IG^Fy` !Н ݆^;UY4ҶGFA12F:IdJl0h�M! 7 #d$ݒB!?gM_ڗX185%Д9)8'^ۭ}ɽ:oώWoݾu^/le9cW8+3}en+q-||>}ݻamE]"*YͶuf_뫤E_)JDUέWHϷo tE_)JDUE_)JDUl{VcuW| ˫7uwn>۲8}tٜ?6SqN_)JDUo>|{_Scsղ(/wu)9bkv- u7wnѻ:e~R߇)҇7on2v*b“P7! ~0VёB;|J 0\^ ICJ/dR]<nW&o|He @/V%d|zY@ϋF%, ,2^F',#;>j/{mW I5ѡآ 8J&t!һ�HJqD&b&%)<oBK ԰S%{^cUEg/dp)117}%Cs76<yIh2fx PR3!.Xnrd p*5M%t䄞LnMt6F (LpXBaa2V% c~K% %vēRnZ3I(#>ۆ FAD#|[(Kc**,-JRM6 $4t|!Dt%3)9;tuoR~ A@1IE^šҗ(Pv!BC/%tR0KHcCg~QW9u)o;U]){U}/Կ`.:Ԧl[JU?_/eX\gg)󉫥'|+6ά=q}t"*?a'_gl?W()I_)JDUE_)JDU~z8U]+?cUҔU:Zv[w9xiݗ}Ķ|>߳?aOM\⯕V/e~R߇)}ev=3}9znZp}^IK}n+vcl/~0yggZzrARoϊl cg Y Q,a;'ߍq}\d0)xCt'm--9y=)+Wx%IT0ɀ0w*zl4nPf)+%]‹ GN+?Jq/-*Gr@P!qokWhӋK @bC_&K+tg%7~$P J! )% 059nF͉_ JQ@ov׶/+|VHI[i(j�gBKe-DXN  J Hf=<3JBҖ|SǠ4,0nѲ7-?A4]Rk&BC~!d6 (ql3d$~BbiI[#Ig%2J †tm&xN{C6 Y,^ܑijdoѽfETъJomţ1\dWQeѰhfܬXb@DbJPe{ !$>PVšd(dfo} Bh1N&>HjK,%0 +vFVN$N[as;RfsNqe:櫓n:}ouґ|b/3w̷S-ľeU9/ssX긊^Sc{2Nm׏Yv7UtU⯔e0zӪ*JR""*Yg=_~5svwS~?ԺE_)J}RcՙnsRoיf[2*J}Rcՙnq}tc/e)9jJ++6[db3 BQӊrZ 73Y7 Ja-UBceWBn!JtۤjsFBK/l{C&҂ے  T[% J HΖ?\P7bR4$GS~e"@ Ʌj+(c$V}B35!r0}Q�'( B0gOu|jy,3ᝮO !1Gn偐7 l71xȓ@2-Hg,Ё7|cooЂC e܂4r  ~VOB~):6FHԿ+_cEBN�6 &JŁ0bF_�:6A\orZ;oKH6@)I4,44K(7`̔Pg)ҁI=a Z]|Zq,41%II}!D$px ܘM͐0fG-S~aB(N_ @ ߠ4cr&n cҒXk@!RJ! 7_ ObYIO%>ߵ-w1%HhJG+X3# t dJgԂ3'/? Ye{=pj`;N&C 74QE'>]0 ۔џN%4PF!\7Q &dr݃ɛ|B΄�u PWl7O+pثf~+?btn|u:{U|gxus:WJN*JV~z8TE_])_NNYo|-}'|f6ՙ'"׳s1Lґ}0_擱+Uұ1l*7}>;]⯔"*JR""*_ƍÛ|wgvn>(|>}ݻamE]b߫3f[7uU:Ԧl[JT3lJ[1[R"&1a?+w- `}+XbGNN& 4E|3p,SKRY go9M>o%/= r #bK&Bz Ҝآ-׏a.үi` b2KZR%(%!=?3sђ7Zz JJH`bF O(lH&2 ei-)Zf )GyhKn:7HftLY<ܡu᰷X?_xf̔QYI#d0W&#dն{`i0V !tFd1I -;'u~ )_Ou‰,#&$%%t`Ƨ%\jHa J>-WBRPo(3;~J6ˡaj _~7K!$Cs ]!, >m^a]H lzpg/ d%9%v8S ‰EJ;{Xg~7:3NB!�5!nYHB Kwtd_LG%2 p:W0`I0a 3l0187~ZYHo+(|\1fB V|m>mem@ ClߒS~ìWR]5|)WVw3ne:cJg?[lo[ne̺E_g e/? ++6[e79g:[-uq|ce=jjUE_)Xٻa uq|)WR|ٝef~۶߲۰rWK^wWWJN*JR""*JR"lml3kY4j$;f|}Oj_VWLU4C$I(':>G8Cއ� @`!w ,q{1)_&7~CgV竱uUܮ82K&QiŐpvC6+OF�0KdKI/t1e~_ߒbМSn\')WU`E ]쏆,~?svwS~?ԺZ|)i*R)H_ScsղWJ׎cyt⯳wsNy:;=kfWu*JRqWRal̿WJR"f߶WWφﻯ2;N]]"*JR".-ۣK\Fgo;gғRum4rY?i;⯔"*J^Sc{2WWR|)WϷo t[flu0Vl{Vc|ه4ZU9u)o;U>p9urRoיf[2|)Wgo;g"3fs;)WHR)HR+3_;FcΥU򼮞ҁ)()I_)JDUE_)JDUfuRӿg}z>׾[UmmmmWJmZٳsl)q|n+þog[z͛uJgs>S~;ֺm_Rg7ve:cj|υv(W|ﹻUw3~u:㹝k'|)WR|)WͲJ__WHRg+Sto|uzWJDUE_)JDUal̿WHoZslUu/N1gR}0_擱+UғϜߗc9u])WW !VB6[mQ()I_)JDUE_gǫuґ|,џջ7QIE_)Jϟ}Ϗ^}}t"*JR"clyu:X|own۰E_])I_)_Cd~so%|+>v=]ϖǞwSqWJVl{Vc*J:?vG\E_>o7nϜ[gWJDUE_)JDUE_)JDU1cXR ̄de+mcm(B]۳>}3:ڢ'}}cֶlw[)J]\E_)JN*JR""*JVn7oy׾:*Yݲ3u."eRR"HW^'>j۾V/nZp}W͙_s3e9뫥'�������zg۷vvz-6nuCw]\ٶm|)WR|)W1w~8Utl}ݻ>qmD⯔"*Y?eoa?]"*JR"gf~+?/WYBKݟ U*JRqWR|n:}ou"u69GS)uq|+7qݍ's^;7{gtE_+3_;2Fm?e=jjUf7r8kWJ^Sc{2Wϻg۳Sww;DU򕛾\⯔"*3_;2FtE_)JDU-6luCfU3=Kw͏Ve}RcՙnQWJRqWR}/N18Vw3~u:}u|2LWI_)JDUE_)Y?ua?\E_)JDU~5Lޭ|.QWJRqWۻv݄U""*JR";dάΐ:}E%|)8)HRV/Uҳ9u)o0oWWmZٳsl*o[_2}t'|_7en\fuǩn̷R8)WR|)WVg7lwu:lmgl⟰E_]b߫3f[7uqW1w~8UtE_)JDUE_f++6[tE_)JDUE_+{-{);0͙JVVl}u|ﹻqWR|)WR|)WoώWoWe~R߇)E_]{k S859zDU⯔4h|}xl߳~JWGϾ;GPݽ,$#t}%2U^ކ:Rq}n}ٙrlz)8]r)8yCF [ ζsRUE_)JDUE_+>p9ut)HRgwי_|'.}+┮9Oґ|)WR|)WR}1cXWۄ3}E^6`]zwNmhe}q?|ΖIpo7}VuovKd7enzvrR77]! PJHGY;Ϸ}M+`ш&K`ģ,3:`e4(ZPhgKbgJA;pēJ쒋&%t#=[ ?kB I\7 c7- 0$䆤'$C!rɄB:RKwihN}Bq{hV�W90^& J2NA3۠5 36MC 8jv|JNd[ vIHɁ;M%B21%rѲIFʶ%$4� I@cl!e FF 1AiOGw HM_Z4kfws�tH ݊BPZ:7-󔁏^цˊJKn3t#~O^@[W)uW}Rcՙn|)WR|)WR|)WR}olm2ZSv=|in+þo*JN*Xjlasq|νݾW()I_gs>Sa>)Hg;eP36lن6eaosf[ne̺bݔƝV?tonH̴|2Kvw3Y,K?v1Ju>"IfwK'mЯ=}h\aDMIer'b/jC?lK ^?gro!mϯ')7A-(B }hJ/ `*֯t촠 q5? &Z @A(C.d9X!t$4(h A/1[B!tr-|J pt/|ŲBvKGJMĢnb`œ3% C~)9#JJ#oSRK&1Ӌ@ϲRi]-,ѲJgXn)#(pQ4 9:rPgva*04)%{tIOpB7e1yRbCM@o�ӿA `p/ݍײB,&2jr9 )|R t %}hD)A/1 nG+)10Z!++rPՆ zC�) ONZWɤ/dn4ţ' BC2S\W �v*T$?'w,fC%Ѳ;\k}_)Jُ_c3*ٳ-q Tه4ZRX_])YBK*JDUE_)JDUE_)JDUE_)JDU! gfεQIE_)Y/nq]mW8 q{ۜsl>Jb%o9_CzwvMP:Bv(]N,0xc)=.!o߻g&~5Y1kSd䤣[�'s@5醀r @jQeYi@mL;%t I3�RP | /Ә%KhPM (7J)Y0J/ !0cWC@R4Yhl7rz}(OWuo0xQ/}3 I[l^<ƔXcm;q#yT NAg Hi+b7mлPaeRKAiG%b(2@o)3VJtG ADāyNXfi(7?(79܁SN&O)?q\F_d#d{a$R:Fd1~hω#w+l_U(MWrnd3pOrIf{• xoܴJҟ/Ie |#H3keqx:U@W) H ?nd~^/$NGm`M |Xk?ŤPԀ!97)^'37|S Wﻠ73.!+8i] A/3#;??c8)gcI%8aK4jovqC>o`bQEan@R $ C㖅+;^?fswE_fv|++WX|f~Ÿ8E_)Jttw"%mvvY)WRϝWs3m6[lftU}^Z}úRqWR|)WR|)Wطa/UtE_c |jHV:Zv[w9xiuH~"հҊғ@6@'Pشtfhz(0L@jIZ@G' l7kF#� M!(mMIL k~.}q;!?H1үi z@ah/QaR cwFIxߣH J(tPj C!n79V7b^)ҖF_C\:!rCCKNY %^F@jZsC[8ᤱŖ9E!(䁈KZB`0 , r-9S|Q)JAhhĥw$0ބI�TnG(ܔ%e40رn xFKAh%=K'PMIhG)%8XfIiy17'o5RLQB8:uy$S$a5,¶|QHB v!w2t /ؖPImNt?@͙y8`)rPbt3Q & pl[J@SӐbOiԯb=ʯ8?#?O.7b N΍{`AI[1DVK.Cl6RJ&%(29iO@F)H ~ajuT` Iԣ|Y03)8Cb!n8yW@LN R5�-=;;Y ܤvΔ�j > |ΦwA2 3ђV%#dNJ~AI9jY m5})>?_E)vSWRRf߶NmZٳsl*R0_擱+N*JDUݗ}Ķ#mf+mڮ|)Wſ^f͙n[lʫE_+6?~/ǫl#Qs5LU*JRqWϲwooϪWϷo FulxޥO?ky'4ԆdҗJK|r7ߵ!(`0L(4>#'U;n|o̽ -<Z~,4j>;ј33,ά0xq>R 4f �,-?`,FA|u (Ā0a(7-eZ@hA]G, ܥQd#9E'MB��4 -(F d!% ߌ(oO /fZbYAg,5K(۔0+~aA1ԯūRv$nf tLJ1l!~Sd9+z�åfmhe&1, 'fhf1=LxZv-+t#y@gź ԧ3Ry#iQ5 Ie 5ˆ|Z?R~̂"߀24YEK_~/rQ{H!&nSb3r3VIhC!Ƥf|cY _搔SRKBx@܄tT_ܱz`+w<Z FBP,5 AC�K- 6JI rb%Ҝ |sgkFFCnײ7~-wJXNbeM_ GC c?_sfTg7lwu:zu|)TU~ߟ;eDUo}WJDUE_)JDU~z5]"*{~~[7[}QJJ*Yg=_~5ݗ}Ķn+þoqWR|)WJnruZHRgxu;ґ|̖?ٝ{Ψ(Qy.}|^1%$ѕV{a5%d (``[!?b[P7]m׏YñuUюZ`Qx`iE# wHzf(xn�Xhn lK (KOrQjH|8lo[37yen%.u 0䲀-/d#$!(tX[[1ז�8& BC6%tt%)FB? Vِ%+#!Ht f SeVS%bh![lԥuuNyxТ'|gv!\E_gǫuclyu:;=jw^e֩E_{-{);0RqWR|)WR|)WR}8W+ї1lQWRROdo C橷5VIE_+7^-{\]]'|)WR:cԷ|f[j+>Wۯu{x\E_]gs6Sa:|gu7ǭN̶ZWWZoFK?$fm6[lfӊoZsl|eo0rWR|e79g:[-tgl?W()I_g;7{gtE_)YFV\E_)JDU򕛍^u~V}}}׾}WHR_7ent;?|q Q?֨'}~gc?OV_ڮ3z8k()8)YM[6nrDUҔce~we1cՏWHR)HV2ZSv=|iu;/2kTc?⯳w>#mf+mڟd|u﹟J*7w=]~SVlz)8]]f+uv;U3Ͷߋq|)8)HR)YMSnr-DUҔ)HVwn~߶_n["en0g:Sg;g۵E%|)8)HRf^Sl;/▮=MJ*6ά=t[lٖu̪V-7|u2K]]'}}۷v;^?fsη-6=YZ}u^Ɠ/UqWR}'dO3w9o-ǫ2KTݗ}ĶU:nvZFDUE_)JDUE_gwי_|'.)HR)HR+>ϟ7SWWVmmmmOqKWW|}t'|)WR|f竱uUUg[z͛uSgl6_VQIE_+?f=}Sݖ^?}\E_fv϶콻v%])8)^?e+aJ*)JN*JR""*JR"" �������z)HR֦(Ye."+┮9OUE_+Ў0v{lonWmێWGU9egݕYǰ"*JRqWٕJW_~W^Sc{2WHR)HR)HR)HR~?a5q|)WR|)WR|)WR|zPϾq%}^u~RqWR|g e/? )HRf+JTE_])HR)HR)Y?i;E_]+{[-;~0͛m_mVڮ)XkNaDUҔ)HRn:}ouґ|)WRfc?lce=jj)HRum4rHR)HR+>Wۯu{x]\E_+7}>;]_DU|쿛Z7}WJDU}}}׾}WYo9[v5U-7|u2K]]f;}>{nq|)8fvם{|#/sXE_)JN*JR""*Yݲ3~3E_ce~we1cՏWJDU򕏟gg)󉫈)HRu69GS)t#mf+mڮV}}}׾}WI_gu6ǭlٹRWJDUn{N|My/|wcI()kq?g4v[>ٶm>p9u,o}ߊ;~˔U)JU|)W}ۊqu$%n3e}^Ɠ/S7r<kWWV~z8U\⯔"*JR""*JR""*JV-6luCfTE^9~f?%:)IE_)YN^\⯔"*JR"'^o~:KzRQW̧Qu]'|um4rӟ>Ƿ}ֆA =\sXV嗾$ބ6# ̥ lvg׺ Ca43EgO>N-gO݃v;6q➪22QơKĵ'2; P4_J g=:Ii)82A!Zt;R%14hYhΌd"d0c#O!} H`HNB\?)#P5~ss? 7,5)N,ϋNa!Aa/a %)FOt\@��#dP1 e#^B](�Р7lKJ0ݐV ۡ~ϟ泓 BI + HGr6=S:i'#$ut�/1Yؤ#v$CIIuaJ1CvXW>N}п;=|�6"QW)vSWmZٳsl*0_擱+U*Y}~=[ac?)8)_/cw>|[,].sf6nofclq:*JRqWfߊC:Zv[w9xirV|7}y7r?7SWJRqWjlasұo[_}te79g:[-usR+Ƅ̬kԦ;[㍨U[fne0_]+?ϟm7n[v_C''e1{LU"hh삒'bI.zPT4z[ & PKR^!Gtoٿ% 1qDљ%tӓ ]V(e8uPP2MB)B Ło~P̟Wd�V(FHa1 J 'Z_$"a!N y~tW,dI쑈^xGŕ -!}Cx>><Z,A:Qd.Lq̑FE|R3QJ."~R2@tW%'ؤtӸgjORy1?O,!%ZP3Ia.ËniAL+ߤ4jBPJ %#2{ߘqah ) !KNn{J!hhFNJ%/ Ha!\7)Cc` N&7:J@/$4iE$Вԣ d#Z~3>jΎ_ BYx /͉rRy/ /dfIj1sNV_$77;ur[):}|jMWJ@(%0#,,1mJ&;}>{np�ί^~_ScsղĻQu6V/)|]\E_gs6Sa:6`]"*J_^sǯ:qWR|[lٖu̪DUE_)J}ۊq}t"*JR"η)6=}R*Yn)j{7;MQ]\'|+;^?fs|ǟv4z0gFΞ_۲?mmY9eVg# Ҝ}W R󣗓#g߆YY(+ٽ2P4.0&13!q-?쑥n?t!{mo/=G?~�v rjYHߔ_JzFP$qCq#WWy5 �,CK@4W_&r2~ bt Er &ԠQ0 ⒤≝(N^+!$$%$nL/J ؤḗaHNK) !񎒐M bj2z5(%t~ys偡]_)|t:::I]JF͔#Kpϲk4Xj1-t HgBKb3ވ0Z &'0&''6/DS X)bڼ�Q!YHL4G ܕ o#ԑ?WC h ៗ2RN+8aEt%7rSph,h!b �c#%w $ߧb^N;�Wxg/m%%nzgPyW\0AH,fJ PR:Qp-evfЁ+%.#daKt\op Gۓ Rx`b,_Ow))Jrzyp~ #%(PGO ݚs` 4R w^ewڳ)WR|)WR9ef0gWYo[lz-ԵU""*JR"c |b*o9[v5eo0r|um4rٹjlruR*JRqWϲUk^w^WY/nq]m(ǟw0^c~>q1{,#۱cy0p% \fJP`CwW1/nOJ%۠;,7?3bX˛3ЄLط`Qetdtm '/{W))YL_!)A 7c6Q{Ja,`7GG%}NP߲>AI)!<сBXh%%`oRr2RQH`t|_Q0W0jG&$Z !lJX0 /d+Xؾp75,4_'NJZ_Yc$gBzK+: ~rk|;lzJInYiGC3# CRRrҜbiaŞf_&bR_BCC21d0FOS511�[HGlӿ w@tWŔYeq&F|Kߙ4'b+fmٶVO.U}n۾ÕH%*V'zUe1lЌRRL>mFdhHZC9- XfB7FF$mHc2Y/He0Ġľ435%~)*&0aDldvg/ed(2/Yk4gǫuޭ}tυ*JR""*JR""*Jُ_c3꫈c/u|esWXl}v|8E_]gu6ǭlٹRWI_+?f=}S|fv|++WW1w~8UtE_)JDUoיf[2-q/urY f=toX}(P?BMlAKۖJ_ӶI_u2:ZU !dёvo̗x\MU_1aPM+\ޔ ٳ'\P CY(1j0BAdvAaţ؅0hk!Gn[e\h&B+ 7@.H+G) 7lݳ"4ɤc'_OO'$]3PFO}kWJ�?!,FWrЁaeӋbbM,u(0݂JHGH`HfjF[]``nHgF 8! % #А 15 ,ran4r:yhrK5(fX{i 4jK |_m_lms~v=]ϖǞwSC JwϊQ5|3r!~X(::R7v�g~A)!?oЖ䯿C/uP ' %5BJ 堤 SްB!&LNSVHf245 O<̄ N{a$p:J�uK+1MМY}Ѝ1%4 +f:/ۊ&b--?/mYS\ۯ.jJV2~vRfR|)WR;g_ٷ"v݅atfsvwSa>dmlemU*JVo_Zo_])HV-7|u2K]]"*JR"֭W?}]"*JV~̯ߊR?WJR""*iCJNR ~خ;Rhjv5%ww% ߣt܋/Nqs8vj�؇yh(a@: `bJ)8jK#,05%!ВoJ](ᡟdlIgBo>-( %?廷ͻfVՅZlRT1_|}cd#l^xӹWDd N@K̓Vd'xb[W@ii/ JSۣLJI=8 Rg\ŠBavyJvnqlc3[uCW�#Rpޔ~^nQdЄp3Ӗ}+6ßml]4m_RVlolgm)8gu6ǭlٹRWHRݔƝV?tE_?_/eX]]b/3w̷S-ľe*JRqWϟ}Ϗ^}^|)WR|)WR|)WWfI8sٔ{Q()I_)JDUE_g+StE_fvם{|#w>U⯳~ߟ;eR""*JV}nWoWGϾ|/>/}WJDUЄ%KnF;~JRQWN݀Weڢ)Y/nq]m8)WR|)WR|+6mٶc6)Wُ_c3ꫤE_)JDUE_)JDU5lU"ه4Z^u~E_7^-{\]])8)H͘ysI핪HRٶmHRce~we1cՏWHR+7sw)HWc3u9矔ꫥgvo%⯔f߶WWR}~͛nWJDUE_+>p9ut)HRw3z<kWWR|)WR|)WRclyu:*JDUwu|R՗-:?vG\⯳3z8kWJm{wۊKiE_6?~/ǫl#S||7zُ_c3ꈫ)8)HR?߲Ϳ}t"*JR""*YugVl˫E_gs6Sa:)YM[6nrDUo}MqKV^n|)85+)o۳NV%|)8+>ݿ۷|+χ+#UE_)JDUE_x-L~g;eQJJ*JRqWR| aqSV|s^c�������z+?c#gm)ḨQ7Ut7uwnQWJRqWJnruZ;)MYγVU\|ߺLWI_)JDUE_)Y ϾP\E_)YJ)kݾ*JR"'}}"%_nֵuuq|)WR|)WR}ݔƝV?u]g7՝[#.>۲8ҊRWzRǧ`YO}Ϗ^}}/N1gRI_)Y?i;Ya?eURwu|R՗-_)JDUo~_oVF"*Y1w~8Tföew otoLU)JU}d׺ֽp./sXJ*JRqWR|)WR|ce=jj)HR)HRvnf0`KeU2Z[w9\at⯔"*JR"ݖ^?}]"*6a'cVn|u:NmZٳsl)rmնLfߊCnZp}WWRVg7lwu:K++6[rRU'}}"c3[g9U]7s>ۿc}ݾݕ}>Sw}t'|)WV~̯ߊR?WWWfݾ?v@jQWRVwnn>^|Umն()8)HR)HRwݸ۷WYݻ]|9_QWV}}}׾}Oُ_c3ꈫ7՝[#.8W+Uҕ3fs;)8)WVg7ve:cj)HR)HRnnfng8>QWRR.#ճnNe+9)IE_d֣B)ԱU|fs?)WWRR+yen%.""*?c"*JR"o>|{wn~߶_n[QWV2~vRf֔s' *)Y9l8㲝usR+?fW)]}r~g,_ڮ0_擱+J*JN*kt7jSnum3.^yߟ *8ԣwWs׸ݹ? n3dtX6CZPfAY7 C*L@/'J$/'ӲJrog ^ʪ1t↍ɄKt]z�C̟ZqDn9(-!(}v:Rfn^\#JĽO/r@,F_7rfOYHdddo{ v]_ J}'o󷹿XJ@vB! drQi Zh @ we!$̌MZvCn8)%+7^-{\]]WV|s^c*JR""*JR"֦(Ye.|)Wݻ}+qy}WJDU'o/}"Qe֭W?|f7r8kWI_)JDUE_)JDUE_fv쿳og!;^?fsޥSc?i=Y{lϻԵz-6luCfUye c'rC磯Q;' BwBzNDlg#WoruӀ52xͰթ̒rR4ѰJμ5.aԤRBPrnܾJOX͹}'x_Nn$^&Z8΄O*Ltri59<Ko7>JP_ܖ|o<u_A03^ba` Ƀb3f-?t7x |7W<WQ]�7( ݠ!p#ߊM7#5FddK$eUYi`°܄'ng|T`7~BOBSVM)a=BH}z`b1BL%aX . fbJ]>@: /: a@ J6@ϐϒBR{!dŠ c`!( ̔!: +SX#<.U\�![rVّfICXBn7oy׾:ﷀĢ lb2 (3q+fz6Kŀ ZK)J5 IfFF#,(jJVo}zUҔ)HRm@͕7C}۶߲۰tUlmgն*JR"F;zS(Iϲ7uQWRQ~3utu4zå}t'|)WR~~;xn|wg»+WJDU:ZvSv=Xa~1|lϴ}۷v K ϛwϻjbU8ѐPIC AIum{ `8YI'|a_0^PzͲ9|# P59 ,B6+`ih&-bfZ>&CR1(l׮`)$!+ C &#a7~5)A(b;,^%%`*9HHRz �c񄲐^ OߡQX CA)(B -)%p3te*3Ү};>,X$͉c>@ E 0jR6,$fBv׎" J/ŁpHiINB)vS{.J&4Ҕ#PXF GO-�9ۖ^G@W׉( n(/Wὑa%t!ӻd'%W_!g4pFm|o?zm a߈ᜤgGC27Ce6e(To}}%_@BLBJIdLNG-6O?~p<{z: I_#t'WCoB\16ܶ?uTM ^,1<^@m“l1q'k9Ç:үE.a/|WJ7#1ճ79]RWJU|+6a'cVf/7[wq|)WR|[lٖu̪DUtHl~vͳ(uE%|gxus:WI_)JDU_u~" װm׹(ݗ}Ķ⯔"*i B>:]eǟ7UJ8uҎ~SGzkm/')%C� #د_mW Xpۡ(I1%$h̄6+!03�BJ0nA4VKw7"‹#J!'44A05 GGBrS{bCp )%qJ9l|JIh{sZUI^ΜK(W/3I,f+3-.5ȚB,43}3rX59M$u: NnjGxĆl1<@iHJ F%o߀PX #(!d#0 |p'E_ 3+%ERPW%#lJ_7OerJIe%%q%%iĭhPNܭA0R�-$0_/9:sfSn?tF6%fKķI%v _ݗ}ĶBF?+_2Ψ:COAOI}dv^^!},of&o !YI%' k%11gpf/Мp/|+AIAZIĥzCzF mJ:sOkk,u2%0ކI^ogefVn7oy׾:|own۰Ѣ~~;zU}3┬=oґ|)dg4<-?)('}}U|ߺLWWB{-Kݲ3u.R▬9mN*J_VsN/>"3z8kWHϗc9}]f e/?߫3f[7u*JN*?ϟm7n[vWJDUwݸ۷Wz!\ tnaЎ^z% '>ݾ;;eN8A01xRJB +W99[2=v4t7YYAį¿{x J!R @jKB7);%�LfFI+!<jp �^|FI4#6@iHHQWnݻ=!_x4ܽf)&H&VNJ_GF{�+A 5+G&!`љbёœ;WlL@i(3btd8·:^2Ʌ%#HC) v Fz4U_u&Rщn_#NR5J$%-SNX#3'mv=�|Q"0}Y'!C?+ҌC2weo9J=5V/Δ~Rs^%IH 51) d ]M_@b(`Kd�(%+d9T�EB3Mb&a)=דN;+]9}�WWB:҄`Д%6fAhl]dA6or!]_wn~߶_n[ґ|fuǩn̷RԺ}}}׾}()8)HR|R׻|Un|{W矍cHR)HR)HR+>}s>)YN^E_]f+uv;E_ܮgg}{ԆDM)$̀̄daoIa(N' ctu &0ttخ^`'mRB+ qI+!<ىHa( $13'lB7.l6#Rџ~РBb Ĥ}ɛt C{mO6zzo;]_Cx!?!- KJ:3tO졠x&$b35/2P߲058 (4oFĽrw7 B JIEg}%t'!{N~Exo) 0SXQiJwKCoC&%?$ Pn1MKۧmxB+҂)!-lgWlW5svŶqW4åW B Y +;e1+?a'_*JVn7oy׾:|;?[qNR"}۷vWR|)WVg[z͛uJx̳$-YK]o)(x3;UғR)HoώWoHR+{-{);0긊Vm~_mVF<?vržVfnS ~ꝒIf-wRTR"'|)WR|+3_;FcΥUұվ?ùv϶콻v%3z8kĻQ7Uq|ٶ,VڮR)HϜyws N^7w=]~SQWVm~_mVFUE_)Y/nq]mWWR||>߳?aOM]"*6g_)YYz߿e~we1cՏWIE_)JN*JVwn~߶_n[Uҳ;gv^gڟ9/ssXE_>q'W'|)WͲ6mmͪWR}olmұv݅aRR)HRc~>q5q}ugfZZη-6=YZWIE_)XٹjlruR|e6=g:[)Ut+;)MYγVU\E_)JDUE_)JDUn+þoUҔ)HR)YoS6lz֥*"V/ї1lww;E_)JN*JV2Z[w9\a}u֦(Ye.|2LW()I_)JDUη-6=YZWJR""*JVg7ve:cjf篹uUE_+-[s-;~4DUE_)JDUE_)JDUl3mYzߺٔ7ײ׿;ӱUҳclq:|)Wٜߺٔ7)YBK*^ iW_nRUE_)J g WRSuUVlοߊR`WI_fuǩn̷RԺR""*JR""*JR"���H����z)HVwS|zeJE_fo籼lq> gVe2~vRfE_)JϝqKWW|}t"*JVg[zu-Kvo%]gǫu*Yߺٔ7VnZp}WHR)HVg[zu-KE_)JDUE_)JDUE_)JDUmնWJDUE_g+Sݶm݄'|+3=Jf͏_uԥDU~?a5tE_)JDUE_)JDUE_+{c);4DU}_E_)JN*JϲUk^w^Om a߈ҊRWR;qf?ua?\~~;zRqWϝWs3뫤E_)JDUE_)JDUտ*YFmͶV]"*JR""*JVnZp}WJR""*Y?i;Hћg8mη-6=YZ(+;)MYγVT⯮ه4Z">۲8uǫ2KR|x4iݛ-ol_fsvwS~?ԺN*{[-;~09Ծnff?m۱ٜbww;U|)Wn)j])Wٳ?i;]+P/GQ]\qRV2ZSv=|itgxus:WJDUq|νݾWHWc3u9矔ꫬ7uwnQWRͲ6mmͪHVwS|zeJη-6=YZ(g?[lox7?DU~?a4ǟv4z>K7,jjUV}}}׾}MWc3u9矔꫈)I_fͶ~/btE_)JDUq|νݾF^Vc+>QWپN}Ͼ^]{⑆vtՎ?_UDE_g6gojRqWJ{kHR)Yݟ PE_]+?uq}n۾ÕHR9ef?\nmcURe~R|f/7[wq|g<;wq|)Wlmgl⟰mmmmNo[ߋKzE_)JN*J_^sǯ:"gmV?~U⯕`$#õ?(̮֮~;|-ްkoߞvS ^δ7ml|?ZؚRJPZ?=>윓[3fJW&%lXo>afX_&R!.ؕҞKOϬ)8e NA|jPђqQ3Fbg,(o/G,3^Nrb,40''+11o!by)`5Q@1(_+Y|s OGt%|7$nK|w=nxM1ac N)ބ7+^Cfa! S: iI/`ѽ0 JK iwGB|Qy;-|oۡ%%bBBT~i/JVo}LfߊCVg7ve:cj⯔"*JR"w»|r=y6en!*~gc?W()I_fo籼lq>)HRdmlemDUm~_mVFE_+6mٶc6E_gs>S~;ֺR"J[('sVe?2QWٸݾu^+uv;E_+?m߶;3Yo1y:"/N1gRdI/mos_:pܾmlz*uӀ3,0f05(ILЄ0҉IZ2BQЏd7do逦 ( A7RPAevG@bC j%`,t!Kd-`Q%9I<7^ǀ!b`gADMG_ǒ҂WIh@LJ+%|7<rYǚxZʣ@( d%$!b9}W%8(� 51af'mx38I%WFdwKcJ^41 M(pcaӋNؔW+g>U1 &G_IAK''3v,߰߀rahQIXԣfd^#'JC7ΔoG HbV\T*S/ O+Jo?d7%[eT5U`X .hAOQ3%%dd#q_3�@ncJܤ>?w{>8,e$}p0RvO,Z]R ?I-�KĢ]$ѷN [$CmKP qW'p&'oEo>|{N*JR"%_nֵuuq|)WR|+?ϟm7n[vWJR""*JϷo q|)WR|)Wۻv݄U6?~o8&QWJ4j>9{'gٿr߷Gς}u}m(@G!>f7tdcm,U_Ŗf;F}%}J)?-{}_v}} %+'$7#C Zv唄2Y󖭑sloU_ꀪ ݋!i3`d HrlW H-{� JqӃQ\hic:qEnJ]M !Ri J҉} -)& K,3mFargI+O!d<RvV8nOrfG5rspUPfIԕ&7J (I-)7 L f%C19(& bŔa G !,ZBfB[%r JRvE版1KObn&4䕑dwܬ5#RMv?`W|W)~i}? w^ewV�(`-^{U}> _B�i)=`RJn:?oCPR6Nܗ[%~߫K; 4SЀ$҂N}ѓT�B&KgAm!_?3_Jwnn>^|Uұoיf[2jY?eoa?\⯳}Z׻ׅґ|'}}|)WR}lmgն7;-MQTU\'}9/ssX̧Q7T79]R()8)HVn|{W矍c6mٶc6UҔU8v:e;:TW ͶF͑c:h:P]rBPrܒWA %ɈtJK~ZRh/Ie & ŕۥ=8rb2v{^tRF!% b);1A)/l_A{|#kJY aaE3$у0f ̂WF 3#7O))&! J/c$P+d| !�lɅ% &;p rO) 5)~jiE5%%!�cbhk  ģ–G㪫MG/ElV( %ԖCrP3Hĕ BwU7^)+7ٰB 7� 36,%l>_Fe(}|okmX鹎 }t/RZݿFA/!9'o-u!p `^䤤!%n^3#+VZu!`Bh`ğB@n1x^Od{P2@bI3gInYhf J8ە|!#6$ss|5ݺUW+YuL%h+;meo~/a-*XٹjlruR*J^SssŲWWžVfnS ~ꫤE_)JDUgln۾Wl[Uґ|fv쿳og!\E_)JDU:nvZFR"cݻ n"*kߝLicUґ}۷۲Ϸ8uoeU*k>;l)^sH ;)382X_G B11 di|S6jXa4 Ax(-qaD_N+?oTn3ԠvNB~ݲ5*K+hg @` \[d!#p֕}|L!ӐLK䕷i53��%$ш==)ە}KܴZ]k҆H{Ĥf�aIKYKGZLBQIhN }:r[,6%lgFN-/*=FmͶV]f<;wwgWRv݅a@'&j:v+'gG( % ۯk!4aiBrK't위'!=|yh?#~[m !Q7l5 akJ]2q4gCO( v[O:!#Cb%'2 ,d}ḿ9rFFq`0�M_f++6[n|u:WKYU⯱ײ׿;ӱ"*JR"z|ϟ~񲊾RR)Ywn<Q}tb+3wS)uDUҔ)HR֔Q{ NWGsIE_g?[loud׺ֽp.";g_ٷdmlemDU̯{Yhrt'1)'7#̤zu�B Phgt o _/6Of ʺ*RjzIGbzS Ahߖۦ 1!|7j5{)9]{Ԑ#gGON-ܵ&o7͵8 WW(0ӊN FAL3q۾^b@Ēk58 F㛿ݲݟs. 4YIŧ~^JhIc1LM` �bI4n|0jSĤ?BwvVf�U4aE %:w}۵I4�ܴؖVOF- IWI{um 8i p΄gn-9<1f;+4P.�z䜍B9b�YAgЀdXҺi, OI[,o׀ (#!;?J]jJV||~g/}o*͙JVVlWR|)Wo=5f++6[򊾺ž^fn[|˫⯔"*JR""*?f=}Sf:/ұ׳s1L*?i;]fͶ~/bݗ}Ķ)8)HqKV^nY7uL!QWRal̿8s>S~;ֺo_ZoͲ6mmͥ}t'}|ߺLWJDU򳺛֧|[-jU]"*JR""*JR""*JR""*JR""*Jϗc9}\E_b߯3f̷[6eUґ}n۾ÕYݾu^UҔUE_-K-3feTV}^Z}úҌz9ے>oLUR*JR"_u~"}Z׻ׅґ|)Wۻv݄U""*3}en+q-ͺ3*Ru)g;U\⯔f<?v|e0zӪHR)HR)HQ~3uuݖ^?}\vvWUE_)JDUm_Rj_VW(gxus:WYoS6lz֥*/sXoZslT'}}"'|)WV>>n۰"""*JR"ce~we1cՏWJR"o|uzWWV-6luCfU\E_)JDU򕟳~gc?WW͘ysI핪WR|)WVlolgm+mG^Sc{2(AhI!;%_uwn;vE"*JVlNl8)WR}Qe)Yo9[v5)WͶߋt)HR)HR)HR[ne̺6?~o8&y/|wcII�������zgu7ǭN̶ZW_z s70e}'|)WٝoS6lz֥U|쿛Z7}W(nߩm;+IN^]"*JRqWR|)WW,?m9o2QWRR+┮9OU|_㻘O|WY?i;;/2kU\⯳w3z<kWJDUE_)JDU򕛸^Ɠ/UUE_+;^?:fqu3Ҋ6g=}͔vSo[_*JVm_R_;=kfWuR"gg1q:"Xl{Vcݻ}+qy}W()YuW| ˜U~3Yտ?2ugVl˫Ulml3j||~g|3?UҔUlNlWXٹjlruR|Kg_l+~E_fvם{|#6`-[s-;~4V~[OlWI_)Y Ͼ UUE_+>p9tgl?W()I_)JDUn=[6_SJwTVwnn>^|J*JN*JR"d+m.fsNqe:}t'|#mf+mڮ|)WR|+;=kfWuR|NݝjV_{o~9\uDal̿WJN*JR""*J~δ7mǾϷ^gSQWjlas}ovnr=]"*?ٷ?l/퇫~#Slml3j-7~u2KU{;MYΣ\~͛2nٕWTUf|^QWYݲ3~3⯔"*JR""*JVg7lwu:*JDU{yggZzM}ۊqmvugTR|)8)HR;/▮=MDUo[_+?Zu6͕_9%|'}}R[flu0R""*6V/)|]>v_-]]zsvŶq'}}}ovnr<E_])I_)JDUE_)Yݟ UU򕟳+┮9OUE_gg1q:۶߲۰lNlWJN*6m?}[j-7|u2K]]cgݳl%|f߶WJN*?uu03f5ٍc%}2}J+j"*JWRlW e/? cfu=bK)8cnwesƟ^Y-+%way4V|z6K b wcc@:_n[30Zfn΍ݲ]>KwGgCK&(Rr?5%p߲P'&6T, q CKFbJ05#R));fFfqʮ>&tq 7[#㝽||7{a&nd1S! 7%�v[ G6/|S\%~+%38cr+Kـ2c݆pnH]7μpwCSWYoS6lz֥Sc?_)JN*JR""*JR"q|νݾWJDUE_c/le9cWJDU҄S㗑ǟw0^0_擱+S}t*R/Nqs8R|~K񛳾}v1^QWV~̯ߊR?W8e0zӪYugVl˔UvvW/Կ`.ܾ0+%'~%oʯ!%~|b veQW+-@T1 B,3fQe$eb KpS(JC>ۗ5vcp> &t$ X3 -!?B{6aT1�PRLA\e%KJ6l=}` &>~JF7 et{d7'( )qhJ_3gv+2KV-81)夒7|뻤C1+#$Mbih) KN gߝz{v YWL/&$\nΗF^{Ԗ�)eJ@vv OByhO Co+\5r[|73'9Cyx'IIok`b:23u6 olۻFNcM_\Y0 ёL%~nG#oB720%PMJ@/'`#%+#=@ndOun7kpb`cRBPX @rPXq/v4ỲUi{ގ-D( ^=_)J[J"*JͲ6mmͩn)jÖ⯳ZlՅo}Oُ_c3UҔUE_)JDU0_擱+QsvŶq1'3;5[E)W׎cyu]'|υWſ^f͙n[lʫE_+h`\uEb/3w̷S-ľe*ٻa v?Vl>ϲοߊR`zp9]'!Fd$9WrR1a7$i\3ZRܔ3;Y&LI 0Z9{j / ra//a N>VHi,$ߖZeax!B(X`jK41(,5~r`XoO58>q;l,ݖ.ޯrD0!S5)%tԫSAJ+d8ݞ1 l I,B+|3+Đ&�*ұmnC01)r'l~P �?ܧOB:IhŤ`tff=w(rʯ3!)%1%t# is Zv;{kADlOdM!fry*g[gXiV_ }E9 -!4n0f 3vǾwGdu10k K|[$5$ {%#u)|!X{״}JV|_㻘O|{6u}tgxu;Ual̿WYͿa}l=[QWJRqWR|cݻ n**Jφﻯ2;N]\E_+6g=}͔vS|)WR}olmґ|gs>Sa>ߝԦ,QeQWJRqWُ_c3ꫤE_/fQy ؿLoJSМ7':I\o%.{~3ͳ�jK_�o7@̄ l1gd|DZYU_PV )�<5%2I;, @a4mճXat:PRRLnV(5 c$ A1Xt#_T,(N&2 _p A]NGoͼņ @nOIxSRYE,LJyLЄvߦW:گD_r)ŧ ,i $y7d!8b &n_OON3tcvM2 ,gGd )b?m a/U?9 YE_�BK+ۿGr hGܴ ;􆧹/-(%nGյ< dpҀ{|RJ%ӆpO|W>�18 KOF0m0mUf:1WJR||7{բNyxR""*JR""*JVn7oy׾:*JDUE_)JDU9/ssX긊R)HR~?a4!콖arRϜߗc9uj�NHJRM& @A_t䁁OOo+/|쿛Z7}} Q$X @F%?SnZrKIh ʼq9YWW+EC2WZ@nߣwkH /1)+Q3$?bFnk}?^&PCzrF'6FI+1 G NNt3Opܗ-=yin'%uR~dcߡtm)}_)JU|Jr0ݳ6 @B`i33/Ih8 nKͳ�檾i40 ܴg)P^OJ6I+|6Igc2z~),R"10$0 Ƥ5=r!9IIᄢ6@Ns)Kբmlz5])WRm7R}?߲Ϳt%_nֵurRs5LN*Yoٟ UUE_f<;wtE_)Jُ_c3ꈫ)WV}}}׾}WWR:cԷ|f[jQS2g[z͛uUr[ӰiJd7t%?'},~>IE_@ @`Y4d¿V,4~ H2 ^w}(�c�, N ؖ1l%dz|7}y7rN@4A)<Q7'}na_v #%5_A@UɤJ%̇[lۗ2pҳw1_+/2PP_ % X@JܾJւЎ6Ĥ,aeɉB]jF%Lv`TZ @fṱ߬;lXF 33~  (LF@VQ)-(Cd0/*rĐHa 4 0@RV IDEnWḬ{/B%pY1#zwB9c>K%45%Fщ(F,K OI}ƒ]3tIJ'FH͂28)fB22möFu4zêVίwsNy:B{-KWV|7}y7r|ݶm݄l߳qOL϶v-UE_)k%9=I1nI쒊RUE_)JDUu69GS)q}tce=jj)WR|+6mٶc6)WR}d׺ֽp.gu7ǭN̶ZWHRwu|R՗-긊R+6ά=uq|)WR|_u~|'}}|)WR~?a1}t"*JR"cfu=bK)W͛m_mVڮ|o|u?U""*ҎOGh<)IE_)JN*JR""*Jvvo ~%|e6=g:[)UtUu4zâ*|f~Ÿ8g[z͛uT![lԥurR||7z||~g}tfv϶콻v%⯮E_+6?~/ǫl#U""*Yݟ U""*7}>;]_ُ_c3꫔U⯔NnήyƷ}ﺺ%|)8;?[qNR""*JR"~͛nWHRx7?Uґ|)WR}f+JU])WR|fg籜~y>""*JR"f篹uUm~_mVFE_)JDUE_)JDUn|{W矍cJ)kݾoٟ U*JRqWR}V/fv;ejJ*JRqWR|ݶm݄Ͼ|/>/}W()I_)JDUE_)JDUE_)Jy+~c *JDUm?�������z)Xlmgl⟰Rlml3h͆m2?O]]"*Xlmgl⟰DUn{N|WJ_VsN/>QWJRqWR|+c=qҊRR1l~~;yE_]f<;wtUE_)JDU򼡝ƻ]69UU⯕lmgնjlas*JVmmmm8)WR|gs>S~;ֺ͙_s3e9뫥cgݳl%||υv(WU~3Yտ?27;-MQTU\ UqWR|)WپJ)kݾHR)HR~g,_ڮ}Z׻ׅ*JRqWR}ߛv) ;?[qNE_)JN*JR""*JR""*JR"!lmnZp}WIE_g;7{gt⯔"*JR"/N1gRWٜݲ3u.)HR+┮9OUұշ;ӹO)Xٳ-q Q}uVuovDUm~_mVF"*Yo=5fu=bKUvVvޮ:?vG]])WR|)WRww;芾R֧|[-jTE_])H:?vG]])WR|)WR|f++6[q}^Ɠ/UחB~W`2/N1gR}tfͶ~/bӊ}}}׾}WJ^Vc+>QWY}~=[amlz4E_])I_gwי_|'.)HR~?a5q|f篹ulml3iE_?f=}SU9u)o;U]"*>s~^9/st'o/}QWJRqWR|)WR|g*uw; -}7Ka+ =9 㶲J*JRqWR|)W X?άc睙l̯(ξfw}]E"*JRqWRc?h['Ϸz"PSG6B?_tO뽠`gC&bW&%$ y?ܔFU8�ӷ)g7G_fAs-z_Zo큩H EX-Z%?B:Zl�9Sa,0^ 3dҞ0Û:�NbE!8h@tO%BҔ u_8(%v>=wo˦{{8C3;;˧) wϓ|=ԷZm)JN*3_;2F޵Uґ|c |iߺٔ7QWJRqWR|)WRw>_芾Vl{Vc*JR"d+m.}VuovV-7~u2KT⯕d+m.ݔƝV?u\c/u|es8+(ݷO-U^%ۍZpad04ngNC|k|{W矍c﹀5$B-XPgGG<0:333-:B/`1h,3O䴸FIENJRL@%F`PXo8b %J8RwIXfkW@/&GA]�801![3:KO*\Ą#pXJR3pb@c*;8rjh+$*S|_) X6  ~ц%>˳aC>Ļ]qyb9HF䲒ܬ͊!wCempiwP{lP A@ĤgI5 d_R~Fr2y@% &%_B ە0 ОPۣ}@nP)zr�t|Q{zRo`W(w $ДlOZv{~!h#�V3BFnHQamҒ fK{d YE֝nU0ńURu5|l}ݻ>qmE]"*JR"!콖auq|+3=Jf͏_uԥDUҔCp;7)|ZtߝԦ,Qe:cԷ|f[j\⯳~ߟ;eR"oՙw[HV~3Yտ?2ݟ P @η[-{#p#J*gٶZV"*JRqWR|u69GS)s@ߩoegk_ K+lSdN5'CE_at('rJ hퟠ;l{!$Yy?ƆQD=oO/'AiJ�‰j,`2zPr87Q3� NWR± 9#2i1,Y\&1rpRSVB2P|/[( )9) 'v%xb3}^Pl Gj Y[CfcE& !de$Jdn7KѾC5g;Uվ?ù/)HҐu@(1F̎3q?]` t_B:Vm!}FEskk3c}H4 �OBr ! 6RgMCMKxg%%JZBzkM_c/e)9jJcgݳl"*JN*JR""*JR"1lҳclyu:}u|ﹻclq:*1$`e w^ew𜺸RU>}ev^;cU[l{og+I:~)J̓>v_-]]z)8fs~fSv?֪wnn>^|Smlz4ơ(,{'3'[JnmysI핯fCId$xbdӆ3~JXe 6(7CZBP[d4o0ٻPIHђOA\ )?Z\ {RRYHdl~K%%oJy(7%nYa.Jc18̎^佃3tM+ҕ%9^HA0q紫 H!AOd.VV,bw'- ,۲q|3ƌIN%+=m@ɩ+Ҳz ICwFG% [AIH^MHAHF+e15 bj/89\UNE_/aƖB(BFCQ^+ m=/ٕJW_~切aAP/lQ/ JQm2O%ˇc[UW L)t|vfXf[ms.Ah(3d#b> kܝt1?6fm_Og)k*RFNn=sw 7URUE_)Yݻm+~} oWWR|)WR|)W?eoa?]+{;MYΣ\⯔"*?f=}Sݶm݄`rj gہ ̖JR7lb0/lw}JhJK1NWZ8knЏ8O?|>uu (ġ=О3|_$H 3lkڗXieҔP`R^/}V%8hg&tݒj8n(K |+d~|,e0&‹% ''t#_Aݲ*Qwye '!(6ġ,+ %bKBNN۽a S7B+?NĤf|�1![r@tPj_Q+(7dU+dBx W){u|+?_/eX\E_71Y%;cW".q(*BxH />)?Ԁ߹EŤ5( +#Q[.NB^pF5d XAnW^sQ,*үVv쿳og?/jί+┮9O"3R"!콖at%_nֵur͙JVVl8+>s~^9/sq|)WR|)WR|+{7;MQ\E_]+>}s>WWRen?\E_])HR w^ew𜸊)cst퐔/|ҿ>[}d%B pCp` M0ܯn_O~p9wP%-8(Z7K6[ kG kWaj ;B9h!񮂃yEB~wׇ((/g);ߖ[|bqLWoק&Bi03�/JJ2 (3O?kհɝ/B �ƣ#p/6O 8^ jr (MUi}RW -idwB%bH,7ؤ�70 bbv#4g+.j2RWB:xԔH᭓wfՀbMJI(CI[bɉ@ش2gg@�贆! t m�(�bZCI_6zNbv^ /X @SQ-Ho (&~07H%T˙;)MYγVU6mٶc6+>ϟ7SWtJ"*{7;MQ]6V/)|]]%|+wS179JhVw3~u:㹝k߯3f̷[6eDUҔU3┬=oU3fs;)L}Rcՙnr|z-<]])8f<;wtgvo%]"*JVonWmێWGܢFWζO_(WlvUEfuǩn̷RԺE_)JN*Y7uL!}.QWJRqWX)jԞ#F95ܘP`gXN ܽ}| )2NVW ߚN_ۋϜC{ί}۷vi*R)HϲUk^w^WJDUE_)Jv}*Yn)j\E_)JDU2~vRf7|e0zӪ8)HRwsNy:M[6nr.QWJRqWFV]+;meo~/a-}t'|+6a'cVg1q:|ﹻQWVwS|zeJuǩn̷RԸwnn>^|Uұ~?a1}tٝef~qW|own۰lz)8]]%|)879yZWJDU򕛻|fs?)WWRέW͘cy㱬|۶l߿3ڢRUm7DUE_)JDU򕌽ߝԦ,Qe"g e/? )WR|)WR|)WR};/2kRHRlmRU~͛nWWfߊCDU򕛻|fs?)LRcn)RRR)HRfuǩn̷RԺžVfnS ~Uҕn۾Õ}u}|Z~sZRUE_)JDUE_)JDUl߳qOLE_])HRd|u﹟DU}}}׾}WHRg6gojo_ZoE_+>Wۯu{x];^?fsޥUU-6luCfT9;5:)WV|z-<]\⯔"*7μpt|υv(WWK^wWWJN*?ٷ?l/퇫~#Uґ�������z+3_;2F޵UUm_RWK^wWW(gǯߙuU:Zv[w9xi}tg<?v󊾺R|l߳qOM]"*3_;FcΥґ|)WRclq:*Y ϾP\E_)JDU/N1gR*i 3q.7>ͷ?7Y)IE_)JN*JoZslUq|+?m߶;3Yu69GS)ut)HR~͛nWJR"vϷۛg-E_)JDUٜ?6SqNR|+yen%."E_+6g_)YYz߿o|uz(f~+?btǟv4z"ݾݕ}>UҔ)HRٝef~շ;ӹOU⯔"*JVo_ZoRcn)T#gmQW'{vNn/8Q^WB?{qQ}'}XR""*>Wۯu{x]]+6V/)|\⯳al̿WY?i;\'|)WR}+┮9OӻvvWRUE_fv|+Btn|u:(<;wu|fs?)WWVgl~6V~*?c?^9uXE_)JN*JWc3u9矔꫈)HR3긊Ϝyws ݟ P]%|)8g<?vtݶm݄c |e}t'|)Wtb:-~U⯔"*JR""*JR""*JR"1cX~~s_c|cfu=bKUR:{ֽ_?u\'|ٝef~}XV|s^c}t'}ݔƝV?u]+>p9rRRNyoZ*XkNaQ׳s1L*JN*YͶuf_뫬f߶()8υ(^ǫ2KR|79]RFϻg۳Ugln۾Wl[DUm~_mVF⯔m?g?[low0[F|}׷Kg#nkM >F8Xҿ@`{l3ZlՅ׳s1LN1Q)Ӏy@UiI`ܕIm}eX�qIIh%$ I`gw) #:甾�Bŧܯt䀠3I j2&7|(ߕvcoWǟw0^)HV|z-<]7qݍ's^U_o|vϛ)HRUE_)Yn)jÖ6V/)|\|2LWY?ua??ϟm7n[vWJž^fn[|˫UE_)JͲ6mm͢*JDU;gc;WWR|gwי_|'.|ﹻ*JN*?ϟm7n[vz*Ў5?tt%%$cnI3[#?;9 jz@vg@  A)5ɰEU_@+baA)<0~&#l^nX@^<CAEg&rK, I5GBh;!zSnB0Ґ0o Ho,J/bҎ6Xie(AjlA0�ݥ_0 30a0f Ft/o !$ �|1YX @4PKB! !AI)#(7~4VC2F_S19c=҄5;JѰ!<XϾpSW�00nrJy )(5D' CnA 1$4$#d#bX 02YX7 NBQJSwXV |׆)Nt$#[<U�Y} ~785132F 8- 5ƥj_?ϟm7n[v}ܰC9eYH&|baaw%t$5q$[nu`YCP1 |4�aBS9<%c 4kJVnZp}zu}t"*JR"շ;ӹO"*Y9l8㲝tٜ?6SqNE_f++6[t[lٖųϗc9}]g7՝[#."⯔gǫuU;g_ٷf e/?E_)^g0%]A*'o~_oVFU>}?oٟ&Vo_ZoDUE_O) (JOC'_¿$-_C|8gZpi`6A1wIx1ZY^,< 9ϓ23 ׼ad/!RPJd9i3rQ4595}{?q`a(HN^%OttrR) Mɪ03%Ʌ#~c 3 N@`G.Po+:J)nK, M@fA[�~J i�5(/PZp(kp?C 6.o> ,3[} 1;b> Br)|0#3f젎/3 )(/C]|#RW&"_)J]4 )J't|.8JP 0bwbP&lrشX(3Sed@v gQh7e uqGQ�hY03) ,}Fu_wq0 rC~/bZR0|nĿљ ?a'_2_Ss{2WKRgvo%?c?^9rRclq:|)WV~[OlWWR|)WR}|fs?)WJoώWo}tǟw0^dmlemDUҕ3fǯjR}tx3;UU @+?_րO}Wu'㗕銿݀kc>r&lJptt'7 >%4%^nRK;Xi5 i\J!!J jCvЂjRxat#%)&'�ZRRHn Ξ7OX<I;֯qh ,4L+>0KPLNΞ @/\;' G/'|B,4-%JB2?̔ 004'Z6@'|/lߒWHiX' r4n i]G o)}_)JDUM)BPKwB+?qslHM ėیB~z[nF>*Q(?& hGJ:2J%R3 r;0썺?wer}ܼߠho%WJ:WOHf]) +f{ K܇6 UWuǩn̷RԺm{wۊKjſVfnSn뫥'|ݶm݄E_cgݳl)?eoa?6V/)|]7^-{\\⯳3Y#e#}7~odU%_nֵusR|fv϶콻v%\E_gϾ|/>Bt![lԥrQ~3utU79]RWV?ua?]f e/?UҔUa�Ĥ$ܗi(1%5() 伖)I. t %`bf4?Hax[8-Ŕ\g3K! G,Q,ff6  LJ'ĢҲRKJ0F^n4LSCr>G),JF1X m7kdmlem^!?'2~O1(4H Hdo{ވ�ݨ)KR�1TXėƔ3ٓ9yoז/*uνI&�%و_o!I{ѷJW߷k2U�`bI‹nA(1]99K+V?2|vΫX`g([m7#qHߝk /3w̷S-ľeJ])HR[fne0ƶtǩ}?y?cUm7~̯ߊR?WWRVmնW^Iogg;:Ҋ6mٶc6'|)WR|+6g=}͔vS"fuRl:*%|f/7[ws͘cy㱬}])Wޔ uݜm}hW1dņ7�!?`ĺY+t.vy{nήyƷ}ﺺ}Ν_y3S(01d8ZlϯM $'sZl{/}�vhiH%p GĔA+ Ͽn_CB@vL!SaKGbJ,b?sn9<uۻv݄UY(t((hJP45 I(%(Frxd8s@BĴlYOPI (o9a*/Կ`.+┮9Oа78a/`0ZFo%)#3etÓK&x5C43$Ԓ�lݿ1_Ho �%r%{Z>bϷmN] 1i!o/>? hn<k`Pg^N- `J6 u~ZenmcX _LARtߥ]?깴uWRE_)JDUs5LU""*Y:~)J̓]"*JR""*JR"x7?UUE_z7Foieq;l7n++#wnn>^|J*Jm a߈ӊR].sF6nfoURUgl~6V~|_㻘O|W(�<(jSGK ?GW7 ~npK_I0 FؘO B�G?m�TdvKOCIlζ{J\|Fl#} ~)ɥ+yUQWٜݲ3u. UQWRR DU׶?ñNgv!⯔c |b*JDUE_+3e~+?aWR|eo0rWRvVv"E_+>v_-]]zo籼lq>QWRR+>v_-]]z)HR)HRvVvޮ"|>37/qnxRQWV2~vRf_)Yݻm+~} oWWϝqKWW|WR|)WϜߗc9u]"*?ٷ?l/퇫~#Uґ|)WR|go1y:"w>_R""*JV|z-<\E_])YͶuf_눫+3_;FcΥUҔ+l}nu>U5lUqWR|fuǩLٱZRgu6ǭlٹRw3~u:㹝kUg7lwu:K'|)WR|)W?eoa?6m?}n|u:()8)HRfuRR)HR)HRlml3j}}}׾}(++6[t⯕~͛2nٕWHV|7}y7rWR|f竱uUUE_)Jž^fn[|ˈf:/"" ���H����z)Y|<q}tݗ}Ķ)Y?eoa?E_]+YuL%""*JR""*^Gs?lwQIE_)J}ΧYù|⯮~z5]"*Jſ^f͙n[lʫ)HR+;=kfWuVm~_mVFE_+>s~^9/st)HRٍ|7;ґ|)WVn|wg»q|)WV-6luCfU\E_fvvݸ}z-6luCfU]%|+?ϟm7n[v8)W?ua?]cnwesƟW()I_)JDUE_-i-lobdr66YuW| ˦*JU|ٜ?6SqNDUE_)Yoٟ UUE_b߯3f̷[6eUґ|g;7{gݶm݄Uҕ⯮u)g0oWYFmͶV|>߳?aOL⯮E_)JDUfsNqe:6m?}[iE_])Y/Y8zsԯ[anE_cfu=bK'|%_nֵuut+?a'_Op01?%y_|2LWTUE_)JDU6}>nnݟ8")HR9ef0gWWVl{Vc*JR""*>v_-]]zϾ|/>/}WIE_)Yͺ3v7UE_)JDUE_+>v=]ϖǞwS|79yZ-q/urRUE_)X|f~Ÿ8>}?oٟ&QW׎cyu7μputgs>Sa>͘ysI함kNaQײ׿;ӱU⯳lmR~lvgrWQ==[ oWuE"*6a'cVs6Sa:|)8)HRgu6ǭlٹRW^їAj|:QWJRqWR|)WfߊCDUE_z҃J�5'|)WV~[OlMy/|wcI}to|u?U*YoS6lz֥U"~ّ򊾎oZsl a,ţPؾ K{Жxfw(Xl/'\8-U_^ I07ICQش% {w &\efw|~R|R׻|J"*JR"q|νݾWJDUE_)YFV\E_)JDUE_)JDUE_+6m?}[jDU#gm" gVeR""*3=Jf͏_uԩS>ms}f>7RQWͶߋtU:nwZf)^Rml{Vciep31H|d2RP7ouu}eqX HB6GH߲B[ٷ}H@a?dܢ�$oGތJ+ @2cy-fТ H̒OoQ7w䢒咑I IY#xB4S~!w!'īb _!d/nQ ^+$35(2JOO,%�ܔJ O9% rRK%xݝ/BA|IxH& b3m?<nt8=(0d6m#_�A&$05!dN )(\nGm[%굀IA3Bv&KPNJ7Μz/>NEff w~}K;pL8 MI}]*Ak^%nnݟ3g={P7mơ7oۦaQJ22qcKF/@m߲_bӱWDao[gs=uHMA Z>ov=ogWR_+YuL%|+7sw)WٰͶuf_뫥"*YͿa}l=[|eo0rWR|)WVnz<U7;-MQTT⯔"*Jϗc9}\E_+?f=}S}0?ۨk�U r9lQ@e9$㐀R Aid3%;N_ $Ҡ^k;GA47ay),`$,$3dBB?桾"94 Ť4,[8 ot|>?%)G@a5y/4x7,)_:R3t# 4h7e} a| ,ы,d0쒒ѓ'6]_ roF%H@%$3  QHCmFloZ[()KYUTK/'n ol>GbZ?@Z:lRN0 1 ]? 2W,~+tbԔ|>H̜ rZ6FJxc�S r9=Nmϼ K&#3׆(c٘ -+_vZf7n>w:LRcn*h)8)HRb߯3f̷[6eU""*JR""*JR";g_ٷ>]%|)8)HR)HxjP' ؾ?5Le & 0 K , !Slbyݳ_:A+d^|/#l3zB3FXp݉]!)$?&)%(yY2XVnZ: - ~4Z䋚 -(P+# d'/$+}gt0S-[r3dwO%:2d&`cRIY))%)/%$ O/%w{$⇁ LH߫lwgRgWRR`(@!eOF O$fTW�i4 ӃF'?vGv'ČIy Y(VylQ|5; oz  03%%t'>&`CQq`M_*V2~vRfس)HR+>v=]ϖǞwSQeQWYݻq]n9_qVg[zu-Uu/Nqs8E_])I_)J}ۊq}t"*JR"V/"۶߲۰uV/*Jg=on}'@S A |dݺ (䤡# :K�!;d'vבNHo6=$K!,aAݛ Pd?%Fwt*`~JKS1)AY;>,GK`oH34VBIh.^كzXW/v9䧧YץJı%(䤥(NANW @{=nk)jFݔ�iUR:*JR"&!0߳~}mR�~@/!BxFGw -MwRz?&X BK% =+mnXxԓ ,g ŠYE Iy-MI+g‰+ mcgx_^u~ֳ![lԥutE_+?c79yZ}vt?1}۷v}t*R)HR?߲Ϳ{Qu쭱;lRRUE_c/le9cWJDUlml3jDUl߳qOLE_]�H B1H IIG( VK.ϗy.پ}pd;w9*y@ 9('dpA+!##. /d b@rRIJu,jƫ?0Hy(tVc!} &r [/%)<["18U&d_g͹HBRJN-#1Z _  Cߠn7`]QWz^�p̀2S}g- b^G; F oJ6d~1qDU 77OB9c'?9}$`bi) |j>ū~8cߢ�ܚi+߁lP@`,V-Ѕw90PnƕRJFJwVߒmZ6U^0&\1+I5#Id~̍ x!#!=°aH+;̺mZٳsl*_@v;7SyNU{ng)&o籼lq>RU򕌿ֽ_?u>Wۯu{x\3fǯjU])8)HVonWmێWGE_)J͛m_mV"E_fg籜~y>XE_])YͶuf_UװwG^VޢRsvŶqn:}ouUwsNy:I_)JDUwS|zeV2YҖ'/ᤖmRW !ϲQt'rQY:@0(j f >bJWO }}}׾}WcB�6 FĬ�HO 3aiľ~td �7-<am`x>nkR`Nf[sTߥ}# R馯;/2kU]*Vo}:Y_fR?,c̨U⯔c/wu)9bk;7{gu|ߺLW()I_)JDUf:/UҔg<;wt)HVm~_mVFݶm݄Uҕ w^ew_])HR;/2kTE_YuL%+?7SWWϝqKWW|WR|)WR}ݔƝV?u]c/wu)9bkU}۷v|)W Ͼ Nvٟ7-TRQWRR)HR۶߲۰}t"*Y:~)J̓;oen/>q|)8)HRۯN9cx芾R|+3_;Fcq}t"*JV}}}׾}W^߻])(+;^?:fqsR)HR:Ԧl[J)HR)HRd+m."~5_پ|ϻ׳,w%|)8e79g:[-tݶm݄VuovͲJ__WJVgln۾Wl[N*JDUE_)JDUm~_mVFn+þoq|νݾ()8)HV-6luCfU]"*JR"B?c@JKaA,U'}֦(Ye.+6mٶc6)HR�������zVuol˫"*J_Swu5LUU򳺛cֶlw[)J]]"*JV}}}׾}WJR"fc?l[jR"9/ssX~[黹wn<RVlolgm+mW8+m ul=J*JRqWطa/UtE_)JDUE_)Xl}v|8R)HRwu|R՗ n"/sXDUE_)Jž^fn[|ˈ+>ݿ۷|+χ+#UҕvFvR~W_~ҊR֧|[-jT⯮Kte_nwrʉE_)JN*JR"vϷۛg-E_+7wW-YyWR|e6gYγVU]"*JR"u7wQTU\E_)JDU:nvZQe79yZG_VsN/>RUE_)JDUE_)YFmͶV\E_)Yo9[v5g<?~|+7sw)Wٻn)j}WJDUm7DUwsNy:WoώWo6mٶc6UҔUE_)JDU򕌽ߝԦ9bk)HR)HR)Hž^fn[|˫f;}>{n|쿛Z%MS;gv^gڮ|+7n++#*JDUnZ~!mUґ}3fǯjRHVo_ZoDU;gv^gڮ|~g,_ڮvVvQWJVo}87uwJE_)Yn)j︕7}WWR|)WR|_uBE_fm6[lfuֽ_?u\'}oeUґ|_uBE_f篹uwn~߶_n[*JRqW_VsN/>|+;meo~/a-*g9{w5"*JR"o>|{WZ7oo߯J*)JN*J}ΧYw3t[ne̹E_])I_)JDUE_c/u|esWY/YW(?Kc[/sgN|E_)tKmѓJs# Kٙ?7i FFNBvG ĿЃss6銿/R1+AEB JI vvc)~4sߩtu~JR)HV||~g/}WHRolmUҳfsNqe:o[lz-Ե.QWJ̧Q7UsVo}WHWc3u9矔ꫥ"*Jm׏Yv7Uq|)Wطٻa t!콖autU⯳}ovnr=]f竱uU*?_/eX]])8z|ϟ~UfsNqe:8)H]`>56ۯ?8x IJeO+4 ^-?@"p=rf#bԹC9A:z ,c&f X *Ri-(0;�G )<tRPFŀdCЎґ¶/ :R8BR[ JOd=V+|-2oeWgVa1j_dYai7rb]YqAYJ9a9HFb5|4Q@71 B I/!( Hc|IH6?~/ǫl#Z* `A<3w+aRq[#5CIẺ4rq,K|J0GO%COop@LL NJw|Z%}}}C@4!CPK%$ ,fHo#;ط�u)}49I/!o47,QM"쿛Z%M]Ҕ_)JDUm_RR" Fs?~QJJ*JRqWR|tٜ{ <j[&v϶콻v%\en?]]+7sw+>o7nϜ[g8)WVw3~u:㹝k)HR)HW&s~Z/JM!RSZR3!%re#]^/p†QDW@b{I'`p1INkbI`3Q42Y0&#_jE� ''H/% )Ν0I}NƓQ,䁂rKA(:hs`LBJv-,ף6Ykmmeju|)TUE_aHTP`ѥ}J,G(m^D�;!#%+JK==OvKJ(u#(N5?-JMH`$nܮ`fdkM|#+ceuZxXϳnIW)Tnuf7r8kz4Uұ~?a5uE_)Y/nq]mWWR|b+3wS)uUUE_)JDUNyoZ*>uWYn)j︕7}W(b߫3f[7uqWϷo tc/e):uRWR|)W?eoc_,3(,458VG& t}6|=; oklu+~bXk5(IxqcNRzC NN=X% t1IfRRq1#oelg,3r`YDQHr7wI(`$y.XwFOC�LR?% %7|8CsU_V/)|]]){u|)WR|YtnIWxn|%8>NɾiFV�M-%> BKd#b\1;MOGSaoˌ�dM(LܯH 2Jw? AM ԗBV_)Y?kcV_c/wu)uZYg9{w5UҔUw3z<kMWK^wWW(ǟw1+ӹu)g;U]"*7μuݾWJN*JVmնWJR"fxuczWWV-7|u2K]\E_)JDUE_+{c);4DUGps{̳q %a[=,4A)5䒿ϻ6a1{*i <bP_-GA͉|J|.L"o!5)ܮ-ѿ+'dn#t?җBrzҁPcv;G�;UeQ%d:RV$J-тz dt@MؤlVNoG /հ�u)ztUE_)JDU$̒`n/1`(-evM!ВBy(fZ�~i01by=ri)@e$2xbU1ǃ u1LImSs'dQ -ۥ B2-uY#)ΖO䐝?nsrnM_fuǩLٱZRU|gvo%\E_)JDU۷۲Ϸ8%_nֵurVwSlz͛e)KUϛν;eE%|)8)HR+>}s>)Hl{27p3=Kw͏VeQWRvVvqWo,GmgdWUs0% RRrXfB 5(!b, f#z9w(@i,1 )d |ؤBZh`GϒoĀ Ѐ0K`ωAE|05%).y.vbiWU+N|r^;ZP �5&42Q4vBF0+.a߀gOZwUZZҜPJScpB)GVeu䲘cq{yUZ H~"ն0?wC@BHON}҄!-ѿ׽;WdĔ G1H!Ā cU ,$|@AD!7}yXϑҀΌlVrFm$kb|')? B{r K2_`rx| ??}`5 ^dmlemUҗE_)JDUl{VcHVnZ~!mU~~s_c||>߳?aOM])8+6c_=+cƱq|)WͶߋtǟw1+ґ|#gm}?Ng%}6{7c+YuL%"|>߳?aOM\⯕bXA ۫Uc?jN*k,1K}ۜiIE_t\QiM&pč(堤`,2|ݼ� N_)?t1+@f-|ven?]4}UP`%%R1|%,نqL�ȇҐQ|@h?R��'' 4`$|d,P7-$nFlʸ `iGr3l36Vk:Zv[w9xi|>}ݻamE9*ٟg~cn#({l_fo籼lq>wHl1~5ѡh>PՙLE_E+>s~^9/suE_g e/? g<;^QWJRqW2~)J?WJDU||~g/}WYuWw𜺹E_)J͙JVVm_?apvtE_+)۸wճlw_C)()I_)^ΥZ-FF?ulE_E+;oen/>q|)WV2~vR3Ye*""*>uWYoS6lz֥*QWRR)YͶuf_R|)WVwSlz͛e)K)Y?ucWn|u:WH͛m_mmHR)Y1w~8Q{8= As4;QJJ*JRqWطa/UtE_)Y?eoc_ٝefJ߿"*JR"wsNy:HR)HVo_ZoDUm~_mVFf/7έPutUE_+>s~^9/st)HVl3mY'|̗?lwlݿ;RUE_)JDUq|νXut)HR)HRoՙw[*JR""*Xٻa ut)Y|<q|79yZWJf@B[~~%njRRw|F_^sǯ:QWY2~)J?G_VsN/>"'o/}ޮqWR}ۯN9oR>}>?3yυ*^r!68w'�������z)H^Sc{2MJVVl()I_f e/?"*JϲUk^w^EVfnS ~UҔUE_)JDUe79g:[-q}t"*JR""*ߌogg7}Ԗ-NJJNeF_1E%|)8)HR)HR+ҁN}'7oQ( dfq}QJRcn)Q|[ne̺RqWR|fv|+Bq|[lٖu̪7}tݶm݄UE_)Yo=5)H}RcՙnutE_+7μpuud׺ֽp.QWJRqWR|)W_^sǯ:}ݔƝV?u])WR|)WR|)WR|)WR|)WR|)WپJ)kݾHRf߶WJϟ}Ϗ^}}uf+JR8c/wu)9bkE_)^JC?wζ1Nr1}D'|7uwn|)WR}olmײ׿;ӱ+3wS)uU*JRqWR|)WR|cgݳl**JR"gg1q:"E_)Jo[ߋKxR|g?[loq|#mf+mڮ}vϷۛg-cg~e}tf6ՙ'qWJR"||7zR""*JR"gv!E_])_ [v~|ce-z}nWoWGg籜~y>|wݸ۷WI_)Y:~)J̓\E_f6ՙ'|2LWIE_b߫3f[7umնWWٻ?i;]-n 6K?s79kRen?\~ưͿm7;f\E_E)I_)X|f~Ÿ8VmնWXj۝ni*JN*_-{ٛQIE_)JN*JR"7r<kWJ_VsN/>QWJIF)osDU򕟳~gc??-w푟l?ԦZlE_E+{-{);0_)JDU򕍟vϷۛg-)HV:nvZFDUE_ce=jj"*JV2Z[w9\a}t NdJ:~3J*>ϟ7SOm a߈t+ٳ9A"*7w=]~S֭W?|E_])I_)JDUE_)JDUo}WJQ~3r7FV-,Q/19[d>ܟw`9: ~_4vNfFx 1dp) ѱI{gvޠL )!2@oJSdBgH}̟�\5-�7+biD;2PKOJjy;|ySȖ~ ,6ؚ\f%|GGHTa5ӒY(~I/Dr7dȀű01 /'А.7\1oX BwBv,V̦P:v* 8,0ZJ#shd῍Of�(m(_N2^o?dqotuJݛ`T rkPij@ѻfN %҄g )=?Z00�ʯJ->mJQ֏oQݻm+~} o}|/�UOK'%J9Aoۤo/ �v�~BA(䬑ѷ c /JVg[z͛uJ[lٖu̪DUE_)JDUE_)JDU򳺛֧|[-jU]"*JR""*JVonWmێWGυ(^|e79g:[-uu> J*Yݟ P\⯔"*JR" TRI$oP+1?3vC); 6e F)΄yN7JF|yp? JIXŧ9H(OܠXІ19wH5)�W @Ŗ]�('S99w-J<y*J-MF(5%bSJ NF&E Jv(B8fa 1 ܔeS%iAY9=)_AC]҄#мM,셧9;/??Y>U}/VV|7}y7rWM!'V/>Sϰ`f|](n %IaS%#1IH`j>GMέ$ 7rRYXhol'Gr/?v8Bں!9.d 'f9sY/|IZI3+r(I,%R:7̜J]5W|υv(WVl{VcWR|)WR|)WR|)WRwsNy:*>v=]ϖǞwS| ׳mqNmn۾Õ|)8ٝef~|ﹻQWR[i!Xl Xi@e?J=_v|ݖ_Ro %` -)aᛠcr3?-<JH‰?CN^ JILmU, �aS{%ĄQ(h96/%(9N %dkl<-DZɀ`6 Pc m,0m:ˤL+, 9*ٶ:R_)JDUMHbPNj纔%I0 x C6IIJ[<) %&{37&f+uv;M ,B#QhdĶG9yI0Ve3`Նl!?1E]_ͬv;7SyN^|u69GS)ut)HR)HR)HRc |i/nq]mW(ǟw0^UE_)Yn)jÖ>q'WUҕ|ߺL8A;'lվk))J?a(r>_KB1|504d'ۡ(O$jzFm~JH@%(!gЄ喌)6M_G, 7vX3)\ewJ ؿQ'5#IJŔRr6[mvڢ:RUE_+?cTiA%,nݩWCCKW'0a47043rS43}2&#}~sfр@_#KM/r%0~P mv~Pܯ|[l{og+\49]^oeUҗE_)JDU򱗺վ?ù79yZ(Ͼ|/>Bt⯔"*JR"b߫3f[7uUұվ?ù)HV2~wRF-DUη)6=}RWJR"o[_26a'cV[Q+ZPE_EzF$ %;w\>s~^9/sq?(DRBvBY;̎K[$w:U{x�@gD3/ba|];| Zk=J]b7(ޔWGPԥ ۥb5o[f5AEeuBS^Y/�44X4Y_%<_B0jF'rOc^�Jwb3$hR ͆ls2d-K^/0OF읒'!o)u|ﹻtҿg'7Vm, -#>C /}ub֔lq-1!% jM [e{_JJK &W1? X,~įѾ` K -93b%hg%04no6}!&Aoҏ@jzRRya %ݺ35Tq; �@G%BSn̦mp7μpuw)J⯳lml3jR"۶߲۰tv;7SyNVwn~߶_n[*?i;])8fs~fSv?֪DUonWmێWG/wu)9bk'|gg1q:"x3;Oo/흲8+*ǟv4zUE_)JDUE_+>}s>ǟw0^QW4&Z~FA/~w'OWGa5(!$#2 5m7lZYXOo|> j(`a LAY%' 5#wwY 0% Į NNhn1r҄N;)o�دp? 2_@I +dӐbPhr@tnM=%~t B@1%r_nHț>o7nϜ[gWO#_I Ay}IجoBxloyjRzjYo9[v5r)HR)Hy+~c HRgf~+?bt+?_/eX]\E_g7՝[#.)HR9/ssX芾Vg7lwu:K۷vvyE_6c_=+cƱt⯔"*JR""*JR"OKm푙%*My/|wcIݻq]n9_qQWVnz<U\⯕/Կ`.|fv|+Bq|)WR|)WR|fvם{|#"gs>S~;ָR|fsvwS~?ԺR)H}RcՙnutE_)JDUٶ,V"▬9mUґ|)WRvVv"E_)JDUn|wg»+WJDUE_)JDUfc?l[jDUE_)JDUE_cfu=bK%_nֵuurV2~vRf2Z[w9\aq|#mf+mڮVo~_oVFE_+;oen/>qoS6lz֥*QWRwu|R՗-_7s>_=ƱtE_+;=kfWunZ~3N*JR""*JR""*JVg[z͛uJu7ǭN̶ZԪV}}}׾}(f;}>{nsV>>n۰"϶v-U⯕ߝԦ,Qe�������z)HϝqKWW}ĩ-6luCfU]cݻ n%|ٜ?6SqNRqWR|n+;N]{[-;~0E_)JN*JR";?[qNRAhImIۻ:;|zm a߈rVg7lwu:K#mf+m"d+m.qWR9u)o;TE_]c/u|esWHR)HV2ZSv=|iu J*Y2~)J?W8ه5ñ+Uґ|)WR|c/le9cWW_Sfu5lU"f;}>{n}t"*JVonWmێWG)WV~lvg/WWR|)WuWw𜺺R""*JVg[zu-K+3}en+q-*YB{-K*?fW)]}H77swUoݔۛ[?OWJRqWR|)WR|NS>JپNY9jJ*7;-M{2WJN*7}>;]"*Yg=_~5E_gwי_7rHR1cX|s^cHR7uwJgǫu*JN*JV~~s_c*JDU򕛾 Smlz4۷۲Ϸ8[flu0-6luCfU>uWHRU^RmV:Zv[w9xi򊾺Ro[ߋKzR""*JR""*k5>WﳫG?Y)(1/ғR9/ssX芾R|)Wjlaso_Zolz)8\⯔"*JR"q|νXutE_)JDUE_)JDUw»|r=]"*JR"6eU"x7?UUE_)JDUE_+?ϟm7n[vWHR)HRё:By`<QWv!])8)HR)HRo|uzW^O۷k[/E_)JN*JR"'o/}ޮ"ݔƝV?u]"*Yݟ P]yE5J;E_E+?f=}SqWR;gv^g"֦=bK"*Y:~)JͰWHReRq*n""*XkNaU"gu7ǭN̶ZԨ͆m2C""*Xٳ-q Uu9/ssXE_])^ZqHgVW<;zېA]XN͆}z @Y?t$d'trt#bX soL R_ G?<1u~RR[%ܵ�`vLHo@bsJ N+H CpkJK0^ZCHAYY%~R4PV}Џ` †dNĄ# f7e}aH5 ` C/ hB�z`zx}.\3#}b)#28 !~1 IY ѻ5)FC9M7y�[L'%҄+e01[2Ѷ(#tvg:vگ*h` ,3-d22\7B:Yݯ;ݾu^~b_ FO0BӺ9I B. � pL/w3 n3cKJ:coѢ"*Yn)j}E^f͙n[lʫU򳹛u)g;U3=Jf͏_uԥUU⯔"*Yݻm+~} oWkHB vWưf~\JRqWR|)WR|_7eB۾E_)JDUE_)Y ϾP\E_zF+~-%}Wa=8 C'۹{ݰ5#I_, rC2 _D {ai@Ͳqi/l#~;t:}ň�/?rID"KH` bnRB3RP (jJ;!b: BoO32�� -=c6Hn^J 0fF%΄| )X͎=5_E)KӢ"*R ̜А|p﷾Z�!oBK FNII|pӋ/'m|Z֒VwC+qߏ_�7^{$11)$ /~P[' ـvHX nܳr %|_B Ọ nH^L }4~1JeiZ ! 5c]ĻQ7T[ne̻RٕJW_)>>n۰"RU3DU򕎽֦=bK)HR+6?~/ǫl#Q׳sٙGS)rRsvŶq}^Z}úR"|ߺLWHR)H�f0BymhB6/d|Q_ /K%b9%WP+N! A[)Xa,k}ҸAyܔ%aJ$ZC7 & tKn_?%/8((iW@@}(JP)/2pφH!)#{ } l;m^QWRDJR""*D`*# Jm2@@MB - AD"CHtHܖ0 }ц3] 7})&9_36J OY(u^wx JRh)HRu4zémX]fͶ~/bҊRRflWW͆m2C||~g/}()8)HVn7oy׾|#n۾ÕmX׳sٙGS)utUvVvޮ|+7^-{\\E_6g=}͔vS۷۲Ϸ8u3fs;)(x&݊7~A1 !??A0 ≥C  =<QnB ]8 B i4Zl̟A)W&XaC? ~ $7zSnW3 |yK8 0%$7:zF֞trn ?I1ԯw}qޗ>R_)JDUE_=|:D$Y燎XQ4*@11 lIV^t6R 0},OX̜>rkܯJnYE7%񏑮 U_m?}'o/}ޮ'|{dogo~ώ5%|+?c?^9ӊy/|wcX;]"*JR"c/le9cWJR""*KXi@dJ' IE_)JN*6V/)|]])WR|)W OduduiH)Xܠ0Y5% %#t|1�cHjk(1kqn˪ 3[=vΔfHJ{xcy㱬}ZӃ ,nA\#Q@aF5�`�40`VN-._(i[fF^)#%uiYݻq]n9_q)H]0iHtы$oYiH ܌R꾔C!Z7II !g#l(W.31\s:L&PZJ,[JRB ~ZqX gO(n1h^ȈEVloݲlvg�dL RJN)I-JKRzW4|uUWRlmRUҔ)HR^ưw;芾R|)WFV])WVg[zu-K)HR)HR)Yݲ3u."E_ a5e씬'v%|w3;@nbSNRQ(ῤ3\ߤb!7uwJ_NM,@`3I} )IiJR (&qH7%k&�~M(4`u%h%!#o3v/{X ox^P to>r _U ?S(7Q)ӆ |ZwgSFz yEt F`kI/ 7G}n^K�iG,mѾPW/; @P4ҐK6cg E_v 8Ɛ#ºYT!v^IJPoJF2Ic: #{rΌJ AGls#~1 !Å.*Rֽ_?uM_])Yݟ PE_])Y|<q|ٶ,Vڮ)Yݻm+~} oWXa/Utf/7]"*JR"|2LW^d/}'|)WR|)WR|)WR|)WV:nvZQed+m.QWJۻv݄U*JR";g_ٷe0zӪXjnFE_])Xl}v|8_])Hϟ}Ϗ^}|<uu۷۲Ϸ8ҊRRb߫3f[7u:cԷ|f[j]\3┬ [tUE_+6V/)|]]"*JV2Z[w9\a}t7u5ǁ'()8zЌy}Y_`QYJ{k}t#mf+mڮqWR|#mf+mڮ}/sXϜyws?\{?^35q}'|ه5ñ+S3E_+>ݿ۷|+χ+#qWRen?\E_])Yg=_~5g+\E_gg1q:c?jE_)YFmͶV\⯔"*XJlγfDUE_yDNٶXQJJ*?7SWJُ_c3ꈫy-߳|?fow}"*Ƅ̬a9vJmEc/e):uR*JRqW͙_s3e9띆#;ֿg%|[lٖu̪N*JR"վ?ù/le9cWIE_g?[louf+JR*J;w_2ƺu|ݶm݄竱uUU⯔" ���H����z)HV^Rm}RcՙnrRWԝ;nzJ*JVgl~6V~*ݟ P]gǫu*JRqWRal̿WXٹjlruRWR|)WR}/Կ`.^u~J*Yg=_~5⯔fv|+B}t"*;meo~/a-HRolmUvVvޮ%8NWq}c_I ϾP]%|föeqWR|go1y:""*JR"̯WYݻ}+qy}W()I_)JDUu4zâ*>v_-]]zv쿳og!\%{uqusϟ}Ϗ^}勇BK?a'_U:cԷ|f[j]]go1y:"l߳qOM\⯔"*Yݻ]|9_|)W_ScsղWYoS6lz֥*QWJRqWR|m?E_+?_/eX]]"*JV-7~u2KTE_])YJ{k*^7)J*JRqWV2~wRF-R w^ew𜸊R|)WR}nv$?8>Wۯu{x]]%|)8)HͶߋtE_+{;MYΣ]]"*J_VsN/>""*J͛m_mm*JR""*JV~̯ߊR?WJR"|υv(W"w»|r=>}s>'|)WR|)WϝWs3v!\ocKmjl~ٷ~wﲕ[lٖu̪RqWl}v|8mmmmWX|f~Ÿ8E_])I_+3e~+?a|<urRU5lU""*Yݟ P?7SW(+6a'cVUE_y\j7|׺LO)gwt~p,1jE_+6c_=+cƱ#mf+mڮ"'|䧺vZ3+lzN~o>vj%|)8[ne̺R":Ԧl[JU])WR͜Ҕ=?򊾊Vl3mYz}oeQվ?ù'|)W ϾP>}>?3y~͛2nٕWI_f篹uґ|)Wͺ3*)HR![lԥutE_fuǩLٱZR"ٜ?6SqNRe6=g:[)UtE_+7n++#ΟжV~3lsnϲwooϪI_+n}͙gηQIE_)J^Vc+>qWJR""*?f=}S۷۲Ϸ8yA(mЁl-['Kk�1  B +8Ԕ bQP /d*u,2`gN/7Fda%#UnxPG-|nǹa,p*L):�IF(3!9ɅqB3:}(lVe$JlC7)ydAz:6ĮY(j~p¾t3$ �3߀ВQ3$0gAiQAY<uP ]_KoW~6Vٝj@4(t~dIt Hݙƿє�7_niYpq�Ѻ:Q߽P�6 CܚRn%IIzRVQ3 %nYagҝ‰(Gttlb%g e/? MwHbRR\fa,/n1(g;}ٷݎw3w(7uwnέTUҔUo>|{DUBY9+n~ۜ͟ϚQWV~̯ߊR?W8+6c_=+cƱq|)WV:Zv[w9xiq|)WϲUk^w^E^fn[|˫UnZp}WJN*J/~xJ;2JQ(f<?vuoeDU:nvZFN*k m7;^,#c~^X5͒^$GXg,n}#v:u94MH`%([#(#BFRSv` _Rxn䲟+)/1(JC AEr YQPk O+_q7I})Gfk@u){vu|)WYH- FN(LZ6%^Kz Z3 }y:Yo$h c#lӋ0hhϗbdd|a䖜rfv8=>N[] ! J?(A) A_cJ;+{dΐ(1A8fGu`J(ttyk?U_-_, nsЏJRqWJoۭOWG 7uwnQWJRqWR|)WkߝLicUґ|)WR|)Wٜݲ3u.)HRfxuczWY|<urAHOm}WӈlC#h̀vl{6By_ ͒dw|ߨ@ &W%te%rI \3%FĴN$jӃCR4/a?!BS?${NyoZ`l҉a[t )=-gt;5{1>U|)vSWR|)WN^bɈ +1Sa;䗶;6W~3 {8 ~Ζ\&# ,h̔)�8fFAKe?~{毡_¹-�(OBqh@bF+%m<;wœ⯟~gc?9E d!;*E5|ه4Zϗc9}])Wj_VWHReo0rY?ua?򼢯en?]]'|)Wv}WR|!.s}֏Rͨ79]R(ٍ|7;qWſVfnSn<;wrxo%#hͷ?:7K7d+@>:FF嗀GNJJ ,5߆ O>}ncP@bC1|5$/-8dr�&2Ŏ8 WWrҌjzKJWA_i}!s/�<!|7#J{9%?'$brМ _)KR)H^<W8C'dot HKΔ9-a1KtwG $gNK5̌$UW@4I-$pVI _ lu0fF$#+Vc54AE!#Zdt,%97Cg HE_)J]E_)JDUE_)JDU||~g/}WJDUE_g;7{gtx7?J*oS6lz֥*̯WW|<tٶ,Vڮ|)8)HRB2+:\WBۿt#7ۯ^"o>|{-Wt05 0J3 `J:hIe/6OGh·t}ԍ`;hieI[<ttr I).� '1? B+#`ܮK(aݑy]PJlcm{Q{6u|)8)tHh&tdVٳݿ+uKE_Ae▗g3/ewf8g%VNHbwB [bi_̑N�;H%ErJ9I/Z KQEi+{ŠK%%> 5:ۮf#XS'Z3ߤn_T=qr)HſVfnSn뫥"*;=kfWuo[_2()I_)YFmͶV\E_+{7;MQ]]"*JV~z8TE_])HRfm6[lfu gVeE_])I_)JϝWs3눫)W�~,1 4 J{E�'+־ίad'AEbV F(X ن�[<oC$GbRߣ!$_--%7|֖� )N/; f3ߍ' mU}e�fLIc?WB IA̞#};=A@'BJ rhgw 2vVX!2ᤲӸNJIY u!)�['VZF./},jSZw' #�*d0GINЂ6 eiHJ?b'm]`1�e$ d)!}BY O0ؠP6|[t1D+Js\Vϑ6Fg|lx)0ԻG$t0 7nʼuǩLٱZluc1)KYU|2LWWR|gv!6ά=rRmZٳsl)utE_)JDU򳹛u)g;U]"*JR"clyu:HR#gm)HR)HV|쿛Z7}WYݻ]|9_QWJV2ZSv=|iӊwnn>^|U}nWoWG?[lo򊾺R_ug2{nfZ"⯔"*JR""*JR"79yZ8ܧ98>QWY|<utU2~wRF-WG[1-!}ǟw0^qWR}-gOllڢU⯔"*J^Sc{2WWR|zsV}~Dυ(^qWҏy\ cp^9ef?]\ce=jjUc?jo}W^םm۶kS8E_E)I_)^џ%b|ZUfsNqe:8)HR;>?gco} w^ew𜺺N*҇^l'ga{|ﹻ׳s1Lm7bQWV>>n۰""֧|[-jU?c?^9tU⯔v;7SyNRǫ2KR*Yݻ}+qy}Oy+~c |wݸ۷WJ͘ysI핢*>}>?3y⯳9u)o;U])W͛m_mmWV2ZSv=|iq|vn>Oj_VW()I_)JDUE_~%#wm}Eb߫3f[7u*JVlz)8\�������z)HV~̯ߊR?WHR)H#;+ufߊCE_)J_^sǯ:qW5|'|u69GS)ut+6mٶc6)HR)HR5lUU?߲Ϳq|)WR~z4E_])HRfv|++WH:?vG]])WR|)Wٜߺٔ77+uv;'|+?fW)]}r)WfߊCDUc?v!\'|)WRwu|R՗-芾Vg7lwu:o=5Uұs5LU*JddgݏQWRR)XkߝLicDUҔ)HRJP~ßg??0JM?$em'_)JoZsl)WR|)WR|~)Fk D9ef0g8Yԏ_2n}E"*JRqWVl{Vc黺n)jÖNyx_gSwtE_)JDUE_)JDUB[6J5oIo`)R*JR"clq:ٹjlruR3}en+q-}tce=jjUlolgmn+þo*J7}6`])WR|)WR}d+m.vvW֦(Ye.QWJRqWgo;g""*JVlοߊR`WJVlNlWJR"fv϶콻v%E_])HRٶmH_^sǯ:gu7ǭN̶ZWYݾu^UҔU~ߟ;eDU@͝&2߿o|LQ}])8g?[lot)HR:Ԧl[Jg6goj|z-<]\'|+?_/eX\E_>v=]ϖǞwS)HRf:/ґ|g6gojR)HR)HR)HV|쿛Z7}:zquݲֿ*QW Ͼ UғV-6luCfUyen%.?߲Ϳ򊾺Rw>UҔ)H͙_s3e9뫥go1y:QWͶߋx7?Slml3jRUclyu:W_VsN/>ޒj ,YcF3vau+ tМ1 >Vꡠyh� -<ӲJ10d2I4CB? K/:/#?@B7^s0s]_,gBJN%bRPKOrbb~ћ AI_#9cP ]+z 4xj7@c(GRxB�^H [^ENP^ٲ3\8ӫbQcF%0%U7ﻉwV RSѻ-Js䜼xh` h;KA-)%H&{S(;twN`!ђA`8Z',|U}$@YKp3BB_:'o/}߯3f̷[6eSvvW~ߟ;eyUҔUE_)YugVl˫)HRn|u?fuRſVfnSnUal̿WJN*JR"ݶm݄)HRx@/*WRWέWJN*Y9l8㲝sݲr;sZKJmoLThah4kl{elϐN!ji!7!!9h03wGB:^!;y`%!,tlVKrboBfNݮby4_,ie)9Ќ.&񁥡cz@f'5* M%t.Sa,!;|m6!|gtuO*z.�<-WuW| ˻ &m6FG!eL�WX,I|(z_lYiBqLM zPfNJ~A0C@m1I %dt-|~g !p)!Xx7}FI,!I"Iwu7w=]~S` %a-) %l= >򎿛Qe81WJRU|+YuL%"\`߾c:eD~ߟ;eRqWV6}>nnݟ8""mlz5]+-[s-;~4E_])Yͺ3v7U|쿛Z7}WHφﻯ2;N]]gu6ǭlٹRW()I_)JDUE_~N?݈2mmmm9- cp53;zbr?n%N$-V CB :'lWJB:;b|V^߷Y&#B}x9Y8 _Pj8n%'n0ϕ??gFQY[�&!$w @jF#dŤYE_XG||+q|νݾy_<Y:RgWR|)WJ;έ3}J*r1r^Ҟ#( Ё_{X Jϊ}CkQi/W!%?&Xt!$E t|6oICJ XܝvH6N+A_^4'}|̠Qzu}|ߺLWJϻg۳DUҕVuov_]f竱uSwu|R՗-E_)Xٳ-q Usϻg۳S}ovnr=]%|)8)YͶuf_눫<;wvn>WIE_z7ۘҬwwYR"e6=g:[)T_7en"fuRnz<U\E_+;oen/>q8@cIܴ1et}Jݯ=ݻ]|9_95+tϻ?sxPT|acHaJv,QZWwЎH5M6mmͯL9a`bhIAI1)+ Ht|gww;<D)zUE_)JDUE_P 5RhݹCR#evHN6+} qR Jm+ .4U)B9xf!,&_~[aKN^{̀!>BQK _toXV|υvKٳ)HR;g_ٷ"fs~fSa:"E_gǫuґ|)WR}϶v-"*JV~~s_c*JDUoՙw[WWOGhv#Q(g*uw; |j*p(_!�a8Ɠ ] %7|G�Ț5.3l[sjFa_>aD277m>o/b Ji NA0۔~ A9KB&%Y,hĨ'o= n{qٷ?l/퇫~#^UҔU|)WˤC! $ds}c>*Tc{R΀2V> ~R1- NBIcZrsosmW@F e 7e`Һ>Bܴ#_+F 53g Q $#%;R FFr_-?|w{إ:R)HV|z-<]]"*JV}}}׾}WJR""*JR"~g/nq]m()8)Y2~)JÔE_]gu6ǭlٹRWHR)HRq|νݾWWˬHHj ΣҘ@E!% Rsl�lXݓɐBXg&5 Ae~Gt$Ev~l7)9zd1+PP(%w s׆hXrDƣ: 'd[ѓ/w}^@0/! 3nWA[0 #N~㑵!\C}!pZN/]erЏ WƕPOz/ G8bS )S߶ ^�L,i)AE|J_I[$3:Ka'70zpn<4./P@B?8_!�?I |vJrCҔ?I,fA-A[^<�:C&`ܔ+~W%q7iیO^\1 R7K'%l ͵AA ̇А9*O%sgmVRE_+6g=}͔vSE_gs6Sa:f;}>{nt)HVwn~߶_n["~͛2nٕWHVn|{W矍cWN^])WR|)Wy+~c WϜyws WR}n۾ÕXٹjlruR|l}ݻ>qmE])8ه4Z~FGl[-E%|)8)HR)HV2Z[w9\at)HR+²RgczQWRR)HR|υvHϻg۳Uґ|)WVnz<U\E_)JDUE_)X|f~Ÿ8R)HR)HR)HRdmlemDUҔ)HϲUk^w^WYN}Ͼ^\~ߟ;ȩQu\E_)Yg=_~5UE_)JDUE_)XjlasUE_)JDU۶߲۰q|)WR}]g۷vvz}nWoWGUҔUﲾwGc?cJ}CTRy+~c Xj۝niUfsNqe:?c?^9fxu;DUҔ@�������zc/wu)9bkE_cfu=bK"*;meo~/a-HV~3Yտ?2WR|)WͶߋt)Y}~=[a"~?a4'}}QWj۝niғ}ΧYw3t79yZWIE_fm6[lft⯕ w^ew𜺺DUeRDUE_)JžVfnS ~ꈫ)WR}ۯN9oRHR׹DvK1Cu9'a>(ٝef~w>_긊RU;/2kR/Y(v!])8)H^SssŲWJDUE_zvW7ίvl#/e)9jJn5>mvͻzb'݇uv[}]E'|gg1q:qWR|[ne̺_Ss{2(f++6[_u~"|fs?)WJN*YͿa}l=[|+3=Kw͏VeUҔ)H۩g%N\ʊRQWRϗc9}])WRX<l()8fv|+BϿG[^=D'|!콖aut)HRٝef~)HRg+St[lٖu̪R""*J͙JVVlݟ P⯔"*JR""*JR"n+þos5LJ*JN*3_;2F޵Uґ|go1y:^u~E_]cݻ n*8+6a'cV)HR)HϝqKWW|N^]%|fg籜~y>qWR|)W^Bvu_qrmնWIE_)JN*Ѝm~{;;mYڢUn-߂(մf+JR*JRqWR|)WR|)Wٝo[lz-Ե.+{[-;~0mն(g~jYo[lz-Ե.";gv^gڮRݶm݄m?UHWVvsySS6?~/ǫl#DUGNFNgKl;o)앝f+JR*JmZٳsl)t%{uqq}u϶v-⯳lmRұ~?a2RRݶm݄m:nrRR9/ssX芾R|)WR:cԷ|f[j\E_])Yݟ PE_])HRݖ^?|E_]+7}>;]+;oen/>q*?f=}S)HVnZp}Oُ_c3꫔Um~_mVF'|+?f=}S"NyoZ*KԀ%�aA*woύ_??{rvVp�$7meV%Y7`#+yF>T3h[>uV4Xn,5VHo#,R '�441)O(h[[7)j J]?Nea�`vgv>0<pD[t'''nxxJ,7nYetXo,IbY i! KYJHI7&%83ߧ!2J/?poQq-q/uw�t�4G(ZvO&!~|' ȐZ ϸ|vvۮj)Y/nq]mWtʯclq:7}>;]gݳl%}tfo籼lq>qWJ͙_s3e9ǯߙuJ*_XII޾a濨)I_)JDUE_fm6[lf79]RWIE_)XkNaSf7r8kWm׏Yv7Tٝef~tg;gURolm*JDUw3z<kWHRײ׿;ӱ�5AN]9O^CF8ޏEv={67Ͳ}@g0&@Hԍ6|Z3> BFuUWNM&Rb{d?1lL1#,g{&f /tToYn6�P˜[2xjKBٕd|lml3kGѿR{QJ^}3fs;)_ B26ͻZ[ϲR"i�$44hJFZ5<gRLNHhߘ%OߍJZ@ CwY;bQd'QRtyLC I5Nۥdm'$^Jxa HfJK)$BBR1&PP[lSn0# f?~5_a FmͶV])zU򳺛cֶlw[)J]]"*JR"gSw|η-6=YZOُ_c3ꫬ|>}ݻamD79yZ8)WV||~g/}Oo:;gF\~͛2nٕ9%7ݝnSHJlzuR*;=kfWuғRߝǬYe*"e~R߇)m_RE_)JfߊC_]gǫu~[Ol(( SXydt!=(@ Z2[;k` RMIE8,]BP΀fJ%CL_!( G!AE])vh�Є .I(bxGy}8^9S_B1)3ogME){u|)8)HRCY`S,7䆕nϽ�2$%PK$G%B9Hd}K/:7Msﰖ�{Q0IE! +۶JJlE@d:]]k8>ү++6[[ne̻Q-$i_r[ P_G_Cmwm?+_)Jf۬$kg%x4⯔"*JV||~g/}WJR"ZlՅґ|)WR|)WR|)Wo=5"*pHdS+SjA\h@fIHIݓz`L`30bҝ?%oƾX�J!}zRJbA`6KmA0bO& /'d(H`bq`gd|Omkw[9)Kֳ)HR)HXh:lzRѸNU*X!P)&t<jRЁnoFn=k(�~Xn$ 1iIl-#eZU >IIۣJW/^]ͺSvn[2?loɽ>}|+>p9v)W}Rcՙnt[fne0E_fg籜~y>۶߲۰}t'|gs>S~;ֺR#gm)HR> DUc?jR"}ovnr=]+;)MYγVT/YsY&_Mab^`n%[fť?}Z>m;n+ry`[H+GwU_8BNnKt۱5pv@g_WA1 _WBqIFx0ғB)?$''}ff٭_ͥ)tʯ"*J] 6`tۥj:>Η_bPoFw(n?lpbx@䜶R]�M K$R8f 7 OľA{ H`hj + &'%<ԗb6%%/_#q &KJq4#|ľ52rVtJ^9`WWR;g_ٷh)WR|)WR|gf~+?b;?[qNE_7μput|>}ݻamDE_])I_)JDU79yZWJR""*JR"~ߟ;eR"z7vu,}QIE_b� GFAiH I})XH̍^(e1 H$1%J9-WKvw}>?3y)`0% 姒GC_kn8WW&�ha,5Z9KbՓnKg}(4bݜIa)U� $ћLɉFtdI䰌) Hd>4krvG0K | QWwu|R՗-VF!L4�GY! `5%  g+f=+$?^Phix407~C򒔥w!,\U9,GNܤO)?%IFߡ<unߧᡥgG g (̐?oa@ dܞZzSRLŖ1em% CFĬCavͶ5!(G�BRJwG/[%ϼF;}>{ntޚ_VsN/>w»|r=]JRqWVlolgm+mWWR|)WپJ)kݾHR)Yg=_~5)WR|n|u:WHV}}}׾}WH}ΧYw3utE_)JDUe0zӢ*y6en!*|f߶WXٹjlruRXXb 4eswgǫuҨ)Y/YWJVg7ve:cjfg籜~y>"svŶqu%8WR Z֦RJ*JRqWR}9/ssXR""*JR"vϷۛg-/u|esW()I_)X|f~Ÿ8R)HR)Xٻa q}t[fne0n7oy׾:}t'}ۯN9oRH͙_s3e9뫬wݸ۷W()I_)JDUE_)Y2~)JÔd(QoZl8tG_Ss{2WJN*6m?}gf~+?bҊwnn>^|SfuRDUmlz5]zr@\I|hWYn)j{-{);0긊RU-6nuCw]])WR|ٶ,Vڮ|)WR|)Wٳo9[v5|>}ݻamE\9ef?]])8)Hm׏Yv7Ute6=g:[)RoZslTf߶WW^SssŲWYJ{k*JN*JR"�������z{1cXБO};}Eb+3wS)uJ*1w~8UuۯN9oR*JRqW̧Q7Uu֭W?|#gmqW׎cyu3_;FcΥQWRR)HRvn>WJDUE_)JDUE_)JDU򳹛u)g;U]"*Yݻ}+qy}WYugVvE_]cfu2uR8)Hggtd+m.RU>}?oٟ&η)6=}RWY?ks^ݻ n%}t'|)WugVv2~vR3Ye*lmR*Y|<usRn۾Õ*Y ϾP6g=}͔vSQWXjnFN*JR""*JͲ6mmͪ*JR"n+;N]\E_)JDU-7|u2K]])WϲUk^w^N_ۋϜCE_)XJlγf_f6ՙzH׎cyu7μuݾWY?ks^UҔUl{VcHRcnwesƟ>o6o|qxD'|)WR|_uBv|+BrRUn7oy׾|#)HϜߗc9u])W:couH)~ϖK?ntu6fQ\⯮E_)JDUE_)_F͙Fuq{ TJ*JRqWR|+>ϟ7SWJR"gu6ǭlٹR:nvZQeߛv) UҔU}ovnr=]"*J5mx]D'|)WkNaSw3z<kWYͺ3*QWJRqWR|w?>[yNDUo|uzW̧Q7Ute0zӥ}u~͛2nٕMv}*JRqWطٻa utE_)JDUE_+;oen/>qWR|+6άWgo;gґ|tq[U⯔fuǩn̷RԸ$koW}Ψclyu:?ٷ?l/퇫~#UU~[ݾu^~wSlz͛e)Kgg1q:R)HR)HR+7}>;]vvݸ}yE_>Wۯu{x]])8)HR)Yo=5)WVo~_oVF+:3d V SRU~lvg/WJDUw?>[yNg7ve:cjgϾ|/>BҊR^Sfe1Lґ|)Wͺ3*:Ԧl[JU&m0ߥzv* P-9f~B=dz~ PItz3d'5$č |JN! Z(o '|R]nNtR϶YE5(NNt}ʓf7r8k} ;90I8W  wJwGıf'}c&�($,Lg %pČ%�ttͨgb?gmjd XPޑ$gC_5%|RlW� .>|8nbذ׻}*Rw>_껢U|fuǩLٱZR}."E_)JDUE_+7qݍ`wt)HRd+m."o[_Wٻݟ P])WVo~_oVF)HRu7wQTU])Wj_VWvvX¸FNewo3u'E_ ҂AC &)%z{GC]DLbɈ@؄^OKBH`QhCflܤ>kC  J ZCr6JSF#2w@ B oI_G}m7A�(M(Ԇ0`7d0o݆t$ovFo籼lq>?J@P1 l1fSWfB)ƣ ̎{ͺ VpҹH' ¾nKFFF=hi3/`09/0jF,( -%#vk,:Нt}ymLr`*Βo-!I@ g~/ 6tI핗:PQ\0,$- ;K #b,Mb_#YcC2~=6jҔ *Ywn<Ut)HRf+JR*JDUE_f6ՙzH_Swu5LS9ef?]]%|+?m߶;3YU|z-<]]"*JR""*JR""*}Hᥤ5=ql͒RCP|ћЭ|?XBgJra`+@c$d%Җ!(OJdF(U:1D J Nl͒Ĥ -@!쌎6׃BHH!% J9(e4}|o_)J])HRvn>},2v{'d%$5E3_0T~QIO8b=?^WBB6zItJG-/ }yk"ja%~a�9Q[}|n$pWٳo9[v5x7?Uʯ'}۷۲Ϸ8tE_)Yݻ]|9_"ǫ2KRWٝ/YW^lwö^jE_)JN*JR"#mf+mڮ""*Jgo;gUE_)JDUA_%THݖK}a4XS%$4#t$ l5jIid @b Ii`VܲP0l:_  7جa g҅eɻ0&M)4'WCN5|7O>U|)i*R)H]bf&'BpĄt3 7\B{dY(6O $ ;&'Rpf biIB v;F7 ==[V=svپg_wTKIKG AH,\n3e~+?l):Rm5|)WR}=jj"*JR"g۷vvxVn|wg»+My/|wcX;⯔"*YuL%d|u﹟Ugl~6V~*JN*Jϳ3Uo[_2?ٷ?l/퇫~#J*變1;*%4_ /9}čN ,#,w?>[yNR ̔dseWP �(c`Ҿ8?a fgϼQIš 'oGP (b , g,7%dG`y]/kiM_)JDUE_/JIG,01~YHݝR& toObݿSe@p*/` 2>eN,i_% AeeW@:f|d, A[М:Nxlmgl⟰�IF䄷@3#_rO>6ʯgu7ǭN̶ZԫU}t"*JWݛ=j5׾URUE_gT])WR|)WR|)WٝoS6lz֥*)HͶߋtE_)JDU 0A~}C~GB~GZBٯBH!B/~Ih1D !>,9y?%;E*ުP!Kqd9CJ*쒻H=9]ǶZﯠL4 M!47t:K q!@0JH] /JOd퐔>cp_:^׀P8g(-~0Z2@_p @,,1 R8? w)?~ݽ0aO)t6ϕU�43p G!e)6@gNKl^%cHF(1r_-rjZJbd`--fίM,j@i1,ѐJrXpɣ] B7{8 I+�hOἢXfJ2t))0 #ӋRK%rЗOYٱoέvͿ8/KO}C#}nmLfSY+>}>?3y))XjnF_])HR)HRf:/?O]])W:cou""*JR""*JR"3┬ [u J*JN*6apvtE_)X|f~Ÿ8ϲwooϭ 3~~f0ms)K_0fGI[G+tr-ёaE }A+^Y)jзg,uH -3@'ON[$9C %۹6>Wۯu{x]]n:*JRU}3┬ [tE_)JDUշ;ӹOE_)JDUE_)JDUE_+3e~+?aWV}}}׾}WWR}> Uҳ9ef?\⯔f<?Z"q@J_n!njf+JR|)8)Hϳ3o[_2ݻ]|9_QWϝWs3뫤⯳~z5]+;oen/>q}t'|)WR|)WR|)WV:Zv[w9xiq|ǟv5/Ul3mY'QWVO;oժ)^Fg~+V_["⯕3┬ [t)HV~3Yտ#.۶߲۰rRUE_)o/;3>cuOueG>(η-6=YZOqKWW}ĩDUwݸ۷8)WR|)WR:cԷ|f[j\E_])HRq|νXuq������������������������������saods9/ds9/doc/user/binning/largebuffer.png���������������������������������������������������������000644 �000765 �000000 �00000220163 11332353405 021227� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIMEAq�� �IDATxyԥgqX~k}_uK$@-`6,$Y82 7vxb!93bl'#uLg>MC!6 0` Aj--ջz_qWo?KկyUu{٪WUju:"!{>!"쪫7n{>ֵ7ͷ=}D\\\\\S}聝=ǎ rqqqY*rU+WocOw} [ZzS~xpz%/zdsо}) ?vთOhfvnPMk,j꟮coG?/O?zGцK ~2tȡ/\/o{fA6Zg#կ|ŋ.?{zw{{zkV2jZzU6/lxu^ry_ޗ7\zg~`^|<_+?}o|K;/h j4G ැՕu]o}v{;⫉_/Î֮[^qS}#_wȳ;okWѿ^}|7hs_WUs};h5P{pnL~s׼'^~֝t}j(\\\\z(wśr_篑ߞ䇌 Dm5Y:NDg7jna|{MWjOo[o\y|W]r~gSD 6t]uꝻ%E "ڱsc_|[oMXGXb~xTVW:Dbn~esk]?? J...WXFt4K_J/#/os>VZNLl o&n'Oe+G?gu +8swV{rjfÇϭ9orr^}D^|y׿e++ٴbO"_}WEr+>ܣvΜn!ſ_{_[?|l/WzW{?Ϝѿ]+fN:<~"d_x+-|믽SwBDVk_tᆩɉ?O?~#O^7r3??suzE+f?t˦޵l]~M^vvǞS-^k&ү_?]?]EU`ۜʾܪ5/λ?ݙk> W}c'NNO>>7011AԚ {6]s8ڹs&;_V,[1{ݵ{uW`o+~W袷xGV.{U/Zs|k/좫/WwmU+o{W,?<|뮻xjSm<xMkV}ٻMoxկz_>~{/˗~u< sśn~Ջzl?s3/}Ň:aΙ_y k7]zr"y}W.rqq齏6eW&Duu9sdL?݊k<|u/yu/!"zbρmw=uZ>wk.jc%cO>r|ú ɉm\GW-?vP|;/]矻׻?}k~U_X~֯c{fw~˯]f܃<bzيm\y=kONuoz%/_6g'f~]oًzO}b}KǏ9~;d;ucrfgN?B+ +E|n~jӿ]<wn9K]]}):S{prUGN8qq:ԡ[y~]7qlG7m8.Ï=9UW^DD_[퉯}{U:zfg/_֚h'&ZX:|iwٱk7;!?ȲSD455yщ˯~O-_6Sdz|vٵZk6^ā`57[}xC_{`s sDcOR}Φ w=g|?E^qDރw=o/~mZ=W_s:gΜ΄״j2Z ~:ǓXUyоC;|={a{N?7M3s+WN~=vκ-^|vߓ^pɋ<"u/u/~.=?|SS?uëK.t9+ߺb"pə:}zjflVHs//}cOw;v{i":uӳjo>wmu}Ǟý>u9Ӟ$Ѻ5S3-jo8繺9qMkW/ث//`bb}[LD_S2`TFsW; Lӛ*_OUgN</Q7NM;}k 33SSSO̕7?=5>G%%o~gG^ɉd_xކ]W_}}/>[rk_ij_|Z";tQ:jR݇<}n~晿qC[_Em~{͛6_螧V-<yGw_'?y5Kϯ~~ 6/9z7сOsCG=~6/_6{;v颶i%htYs|_k�+]0'77>7֮~rV=[]y>wʓSSSNᇾ:qǾxWm޸afzjſ~fv9zEDѿ׏wɣ-/?ا?]s&&;{~VYF,Vo/\w7<v=~b>l{ ߸5/;} ;q?SyW^򣳳ΎxԪɩp=~j|ݍ˺whE7sӇ>?W,<u=o=}裟vvn̲dQA,Qᆵ|keoRWݻ?oߐopn>d#O<po<߬s̩GͧO>p/_!gΜ~O<yΙN{bbيkMO>ǎ,_}5뻭=[>O?ޡU W}9sz~ݦl|_#uϻtGS'ϯ?9y[f͹O:g׃'i'V-޿9sу{O:yoU]?]_5n#G:yș3g&&&'gfWݴl.*؅z}NkZǎ<ݽǞ':gδ3s+V4=l;}s &gnrqqx/?/}*+^g}Y^Zo{c ġ=ν^:j嗵&&άȉ]|ѡC:?feϜ9բV5}&f&gWnO'&'fffhzfݞ#έ:>j']izzvbzV?zvYզVk~Wub&'ZDr͹V-LNfVί=ZU6WMNM~k[t̓?~^uمO9w_Q՞Xe:-j&ZV:݋?N̯;oznTt:+O"e+֝nO}ɩl<sd"SӓӮ\\\b^˕U2{gvdk'f._u#<ucN<qٕV٪5Offmszvn:b9<'?Y6cO|K/|ŋ/8z=>^{Vj&&V̯djfvlO+$婦/....à Ɗn` >뢂ڻd'ɝ>Sv{rf٪5fͮo{`eı#G>�twwX==;7VsR:gn^J{brvيv3\\\J;OXՠ~\A<l]\\_iͭ[1ZMhu>QᑹU Etm>:.....#o{+!m۶s2}\\\\\+'crqqqqq5k,X.....\\\\\\/,,,$?߷o_O5FN+xuK#m|w5\lੴ6jn`΍xN}S/ka/69h=]~@)9TZy}5IeUTfZ}!?LzDS$ UʼW~p9Ǣ)oyewSfMc赗Ïv#s֍O88'dzG*~d%ߎGA ؆yltiL^ͽx5i|f(9ewTvֽX$?aɈ1'h䦾4ζH[qpitun!F8w/Zj<jbJfӐGZ]ZTpu7>́whYXM>o$֣W3aaj$3u¿8Cbu5rimh7^6ws)a^C= P1as#:^+aXBջ$5Yһ}>g}=zg{jAd>O͸ l\ġa9sg6=4oD3U H㍻}$xAMM+m^f9y)}^$7`7T6>-r eߺƷw<#}=o#A XB_߿fnGvngirqq̱56à�rqq!SIr*-6%>hk,X......\\\\\\crqqqqqq2ޒc m6aX\\\\\VBTp˖->(..... o{>X. 簸 8,_U^w˰[(rqqqqqe|/!dQXݮ̱۷]7.ȐV3RMA&x<ZO%!wAQ5̦>I~[f໲D-ISP7@DXUT^XXNLCՓt<zsw)^QANIw.N "Vag e,<F7ިgw>/'Mͪk#tD#rG㱵-pqiDɼetI?hɿV잤'W}9>tʗSnLrw}?KZ5u'..-Sƭ<RԘ#\�=5ݙ}_5FJ7k,Vt)=J,ջ.t_ʰN*ݕk&=% Rϣ)HsN_2=5.KGڽKYIizr9fK}뻎 4dH?ld*C8ϻʍU%28ı!MgG&8.)?/xt|vk2ZT5..c,+2.>K$[~ah<ťW2r֐?C.\٠]\\\\c8km۶ $;0re$ف5 !(mtV})Lc,uedDfd%?&kgCû,į1KDF8dpşZ!ûT6#~qk:VY'K+]Ɩn`y\ğ ûJ_-QZKϬfB#'|/k?>˘v^pX6Ҁ*ND6`Tq#+ӌ*4YY$p|,C&*OŠ{g..(u=zWȥ\c(~3ee+^i@TQZuc`A+N 6r.7aqT&`yx]CK%<Wg r꯹ W/MW>, OjFû  Y د¿�N.\a]\FN+nl},LĻMujUÝ1 nXc98Ҭ%Yz9....Vkl]J?VeqqED4/X=oCF+uZ[m6Fl2~Ҹh)z\k,w)Apqyl[;uEr`dqqչˈ*X?i<*5/X....:gS1TǮZo vqqq\yObQ{iID@X[;+%T J{u]qz;Cnr1*jqr֗( =~ZbZ0z($ fik/'p^>Bw~h2r*HGHB4[议\\7yudtu2-tW=cǫ+v8ZB>ViO뜹e=Xy@[*][ϗE@aXtOe=q?($\r;]T|*8$^*MUI=S-� *I'v6.egeiJG# Is.Ҡ2멛%^6R4E\\\\^/*rnVWp[-vWWqb^_9`Wk_z]c0lۙ$*1ZcyFz.>..#f "E6#Xu U[~Xc(޷eݬr=YIl[*崕nHO Pe]c-!ٶm#[lq'hD=֏[6 Q]3Noh<]c5,~ QTW5G^t<a:\|+!>AC>AĻ2htt?imSk5>\A1'p鑏O+.jWm;L5�ԕ^s駏r,L"gAɾ}n7qe_*&id&%an̓S# BRܷpr{h9J[ |Co2'Jx`7ӽ;3b$ 5'bA?� teE f8t9;%jh28pTW̿cqevx_;WW<rEO8pOu#/FmG S!r ugGa0Z(坠i uVf�� �IDAT{q@Y <~AAOM)9l:`'¶0qAr ]? O;[\z"{7+D[Dg'~_N׃Xlx86J:]cyPʆVbAu5pce gqsC?@ tuU;"*띝?s{Z-ۻfkvn'j=-Fu琩Xfe8}f3VƦ饫+'RnSw~-TԢuQZ WIN<!X".v%<hU0ތt fh2Z*LpEڍl*zՐѰg_匌5X}xnחŸ0ҭՙUx`_ܬf*+Gʮ]vc6̯lWN}?bˆP]^cpMr=Vn/XVtQܿcC~ē?>K䡧`9 ̼ ISSfきȮ]%0BVv+@lՋ{mwc, tMꘛ!0n3>VA`I7t>uCS_ok)X....˅&QB}[%$]cBTBנzt/#iwsF>A.feBcUcmKx[< F!w/w-tW7 ZҲm6Fl4+d˅h۔Cv6S{ҪbXnRޱ'h'h8e;]}9 <LLښ҈Z*GGE{=?Y\\m44R9%Q÷]7Чҫ5*RI=tqqqiFp|F[.%uJ 9KjБaX....Iҡa3) XuYD Ȩ`׮pHc[- OJ<_]d@~*x7\16lWo#c5ާ}Ҕdw>Lu)&XM)H| m4l~U|諲U0wn:cD~;b٫Xr_NRJ3tl@T-} |'qKn$OjV%$yw q[Uo/@Kӡ:UJ8(�[~daVÊ=j Ɲ(ӄ"P99#aiJ#WtPh &EC8 *VA<pr갫ɺȏ[`I7o�tu252؏ ʀ6wh۽8#r?~#02(F}+}\;cJ-6dUbE|8jd_Zߥ ?NlcIRz~HO(*0J˨NJi8*]8+ױ;P {%c'8OK�4E,>vV"~T8B)Ip72_`6a-~B[ ۍp\'hUΞV}+pY 43ΐK=| **TYr R5c...KMo!! ͕(!akqȐ55+eiJy꠲!1#~]o 9W,.. U5V~Nӳ X=o2*k{Wm+wΦNm6Fl4$8OvRN/V*t%-X44*y^J ÚCPX#C-||VQR\+D6k཮zrqqqc<^XnUr`%8Dc4Yw)ؓD9&YcyQ02&RØp$i\"^Ox߀ 211VN} }q:邎 4'ۘQo衚 f| N|r-tmM0ݖub@%^0oAwaY Zt:R2+�PTbRXݝV*/an ^ށΖ˥\pLj[L+0~eaͥ_OmK^<u<ЕVEȈ2Ŧŗ֠NACe/Y<aVW..d [#!=ڴ6ut#Z>..PCC LJ6fX#[*1Krl'ȥ)0UN׉͋*kNW;mFz/ΔN;⇅]?- rk t3oƗ!pqqqNZ'YUQk,)\\\\#u wAj,P͊4wn,.. ZQ%[[ y+XC''ťzK5KBmȖ-[||\ʥpqøp[r}e}|\p1L|,..  r}5Ks"1cE?˪;ε*)䇨A,|-^ 3#:q..Cc NΖQ<q?ǕK8X~ Qd?q 6uby~RKܝ%cpluY?<a_ʥA+zX]iĈڭ;ҎWsWH..âƥ RXbKnv p|]\Io]Zj]4ŗ..=Qzu7_?�A_m߷zdkH|񞸑XZ>V WdY4tнŇ'E;]JH;qc&2m},$]z$Nťy71fe˖-ťWJ5Kc☸Ok}\\\\c 8&ҠxGG}P\\\\\F@cm۶ehdMVcmٲŇed~~m`Vcn |`yQ|$k XĄX <l'FM,..V`ӷIF???_ ЎHLoHs]\\\\FC\crqqqqqqҔKC@]\=O?m6P3y\#7mM PtYp}l_XXȹVuN^<~٪Gꏚ.i σaf=v~i+_5Mڞh] =-VYXrw)Ǩ~.N/6Mu5|[?ܻ7UR2S ZV>>MܞіwO;n^lUC4nIRj ݾ GD ΅xfsT?F=sՉ^?lc[k/>Əx1\fh$&:`׳jq79HN.t<s coUhE&S P e݇wgA|5-<F4G3; <NÌy{zO-]!S_>힎o/,ySދM^vPvqOo4@l O??ܞ;pT n!YwdN~73~ Пbk_Q(s<7jj d/`A𩜥EF\A\cNp.>....r!ue45hH\\\3 $xXC30o?y}Wݲeq!1sέZȎhdR5rS]EPXᐎb'iuV+jl6Z|5C5uu}Jtqqqq q5R4XBb%/e~N'#q'GܼGuO>fSM ~mPNcu>ү?N6O+j3XX|S׾y>y?}<^?8:oMG}G$RMj'׊vضYu* PߞW1gGFw:gk<=]C䍿ZYGoO^Sl-ΫS$'bDwDr" ؤmP!ᱤ\e uRx"7}G42޾ĄF=aPKa|7'? JljYO6\Gə'AQ<Fgf| wUc=`h0Xiħ_'fۓ/ǼOޣ̋AQ=qμ8^̗׋8mw ߢO|َ6 bX.....\\\\\\\crqqqqqFI ...6xf˖Rrr:o?y}Wݲeq!q�έZȎ=96xKm24^{['[[v?NmtG_0?}{ ]e~yCo&8׿`{'y`yw1,3pS|~rO}tBuܜƷgd^hm`Ž'(w ̽&r~e|iw'"f#;>SmƷ5VbΝxԐ3K۪qBMZOUd_կ;x.P_X!G'Z| ]"ФHvݹ7Y@Ke%Uzm#|_!>&坢_eūfMxP%w hAxx@Bb<sNoыZMPc /X>E%Q?ڐ1vOn ɭO \@3,fdU$m܅9D.�.p3Ge!5@>V@be;°Ț-#bn95s 'vfd|�Pf) )3Sbfl@j )p<G5wĥVAͪA 1M5,κc3;&ѭXɝ\('Ap$ȔqqYG mŽ:P2xCh| :T#+$WN/G%nj'ӣP lդ]vzA\SX) U'Gqd .c ? LBj8stX*Mbe ǫTਊ .A_ِ.}hrh+dGMɘQ!p{d"k+y &\p.ȧʭ$Lz3Hb}!If͗CU#9��*좜dXy4ɜ\jk)Hl# C0@r Wo!rx~j\U $aW8EEx`Z =oU!Ʀj3@ _ʛYbdQ*ۨfeic̗yɩ1$դ96#U}LmdsY]q "$Kg]) ՛g.�&k.-䚫Pekg7{j̏Wr'-jRA\'O@Q VaLN Ʌ?7dXD0 ULӹXUR/ ?>nx;>hڳ7sF |f)(ل >!sIVmhyrQe11s.EL]� B:14h8T#E=VS�47BrgG#Թ!YdF䉃Q7?tHeA-%|$p[!nw23Ĭ3vL5E@@>ƓB=fAm1X{#8>'? $dubb6#(T.$ ؐxń> KYBd3�c}35^mYHY(4VGʤ_>�|zpdE*g�9PJ|nE@j;bʏzdrDU'32 oʫ~-?*mq" ձ+_q=Mš$i@[!,lcˍL^GUrẜ“.2PO_D@|b0T ՐlA Ǡ;I/PMnr, {cTrCIO\ lxxUN-$Ij9ljFQa]3-৵*85⯖;(s`#*PAqh!t3'؈S.CԻ(d`@Eß_$UgFp0I;%0AC:x"DEs٪♳QCKL+%T|;T\l*|._uA02{ lmd/>IWbrسSLHYZY$u'@0pZ4pk7?[Ӥ~ 0ؼO0q$Vv.R~J8L)Zdi06M WOV%A-! z�C!pφ l*wPΎ/]˲s&rp-(;MMd9diMla�4-BԞk{1ٞϡU DlE6^JT1jz`[] gKƃ jTl&?zZ@|!+ E�'^b:SFJG&o̭A I()h}}1T_HٝKrjrvf<bvXT9__"0'BV#×%Z+n<AW˨$iaG/6GL )lOd\�3'"M5N8|G^ $xri2(.{[aSF j6+^ٺUX|m@3mȈ'DC$w}##RfUp*ETN$*&<W\T00;T%Y ~ƐG(_mޑEӋQ?T*֣A=@_้MLb�r?33B FX-Bb0-{d lohW+ o|2U-bH <9ٞI| �d]u׻ &\KgW #O;樝}淴S#ǐ& *1q YpUIb蕩jaꟴe*-`xUKlə1K&tň4iILEQX�^ r=/o“\1-=ԒD|ɖjd ;;d6wq ClC(U$Oe;"y_ : TZ؁Kg5=0=f5cMo^o8<DT-6eCp ٍK,~fHhJ,)KԙinM3 qGZkV�&cI:4i}kwRNchPZ)/N5҂ǷjMHPMZkk�0=*5DOq ˗A"r7;k& o*:"eI."k1mA+1qY::jt[Eڴ oxz?bxaff2BrJ<jmmϤ~7 |)MGv l2<LH;Xw]4uXncbx^.? xd]ɘ fxy^[~6sۊnC1/`T<Z(vHu:!,:1HS\fRڍ�� �IDATE+yѵpb@i2Mlk}hN4WcӬ G vl1p}C*H<ג͘ ;a jzh9E昊]gs^)_uKl!AißJTĠrO@s [=3[aFX$aLOoAjbom&YE'@<bQ'HON[V$+ЍӚq <,<(3RE̓j|PVc*<Y!G* G{6oI3T<(͆UDe,L�`yQD9i)ߢQTǙ*)gQRUgnEfp]v92_h8~lئ-w9pD)NKLj16A%f0@{C>3p<b!347Z戸A gj)vF|h $Ո!A9%6KI r*//o9}9C[xq KS>\ x/I fʵE1[qPR-7O {y+AKeT4E@+X;/D2h!+1DGDpF*:xr$C3ÍX58&DWӣEyH[r?;0AĬ[ Sy DŽю*AlbKl1@V2 VYr<j-�-ے-T%`(WD@ / fry.:p!DY!,>$Rg|Tix|;7j-A,^G,*I 1ڬU;iOB}DoH;b\yTxlPjN6DJyE6?|\Ϟ\XJ8e- X' zA?[Sy$<Ilie2$:@Ӥ 4=- "`bqRL=Um<tKu=~UK! w`ҁJ4fM-� -KԐIAXfuEHJsLTǸ<rT6o`|j\{cpp*͘ uY`V l#;U(Dn' hx* [Jl *i*2-yf?J޴~'lZLR'=HVOyi XJ@9 Vs@HIwDtsf38D\o#$26'ʛo%\0LjFC9Α<S>2�6$YnTA^APWd*3)t:A,*Q`a¨m^Z8^/VL6m-2DR 8A{dNO|.KeTTB<cةs*Q)*4-9wg QrB&"%g01Q[Le2:BdaLn5~Dl+ipZO=y )r և)r-10 VsHJVK֋]Z^">Cl�~0IqTo_i4S- p\\gӰaGxUC.'R$䴻 *Yus2nzw3$XyT7&Ƙ<Tʀ&7n|x؛?N ,g֞S`U*]|zZ{ Ӫ]Sz*/SR661r  .,U3p^}d~k C pf`6r-}zpB֣9E`?em]nnIg;" `|ئ&QÁFRXOr{'PG-*HAbV& aeh-߇AUVn\SaIPU2yBR9আ#&\qg yF]ȟW7FV,7`SΣg-xE]% =eq!]rʒ R><bx%NyNfU$X|ɪW5ߌg.f_Y*Oj`B ڟ[r+ZTR(]*'j)SW(iyP:HȡM]Cž'i"?8A-B5$F^1)6S;1 q@ZbiLތVG.Y \is4f^nK+R /[Cb[i\pS, =J; %Gɵ6cPbqqّX|z[ǯr^oWbA4 Pq }f&\]Uin/Ad v-q2�U�`SIۉGs0p4$?Ra�Um-3h3Z&!0΄#kl!xb'm�vUa sim :'񱠂8Z^pbw`Ќբ7Hp?{0REpӃZ-ɀGMGAUQNr-*B(!b) x26Kg:TVsU 6GT|T#)-�и r 11L@Ɗ7!\ %}sctU)9?oGZakUa82tm|<G-bpEL-QxS~p<z|:F/^bHݠM1dTj0xd"FO(ĴQUFbR]V!(|R (JK$c inJUtb[Z6ժkXU"D E*e�TqN*X%2li8IILer_g6?V.?fᑅU# z!z2~ )z "^?Q W ɱxp%dp}OLqL͜2n�lm%[tŘ)0m{@Rm(2%1MQWW2sX|wK,Tf8$yHj{d�q1r~Dڷ\N<>D/W5,G7 fM9ՠt=nR)g+1B}3q{xpkD I\)0(9H!-� h"I)Z0MUXC77CTeA͑[9|g\q^5xӎI_(h92^RߪX4mmhG͔\rO[h;'iX샜mh[I%L,D<A\ S"cԥ1kbnIxLG I=`/EV}uB ӄx)*~7'͉yOLғ WB-vΠCBlP20�|A q(p8ƋbEfشB8Hj#L 47T#Qh (@nh!V$#Żdinɠ;?) bRouvAFd` m0LWwP[ͥŃux%^|_mA~en̍"$hK eJ�8{ 5�'{%`ƴ&a(Z-pBՈVƃڸꁧ c11\$:HrB3uE̬b噖, 0H%8W#9+f٢Ew3>_XPV]y;;kV[ (`lx[7V291(*Xwrn".Dy#>+zLŬI9�| ~şDf@bɏEVB,L,'Dj$a͝0"2 O''.X*JS'kI:Ӹ~q4N㑛9Hew_%`LdX$6,J- є.lՕ;$ \aPڜӼ$ő$es,%FDٗl<V_:ˈT*U,O!(9u^d RYj9MhV\i dI5bl0EO.;Ʃ2X*; {pOŴQjY%l Qd[cSɺI,W[r+h.4T r3g9DpF4R Y5kCM ]|_r&YkKUe*Ъ٪jpid8T0K}s !^<-KS B2؉6K<'9ymS2h1:bHM$nm35G(eF .bMIV3є;ڲ͑CbNEqg("y =G7A Wۨ#~Qao51B Ð9ᶗv'b`ޮ؀\v]D0 aùKJ&k�E— h-2Dyb+qB%&o_<ngQʱdZa8B>bҍ4"|C5q\_97Drx &m`th`A&UNJonԔ!$c5cha#Urf%ÌQ&OO7|l+2=Wz$"@oFT:@Bzl{24;laif!U!n8V՘DdI}Ȍ89*c\`\Q N~=I6``f$u(2iQ7>vx)0(42ZGi~*YU^ͿF) &XId?ÀL:Ya7&HUOy Fh|' ^1uZ,!kl<7sU86g 14$8B~1ՄXK<>#F`_u*{zK}Z]+gY㾤!Ej`) ֻ ԀXV&}T3s3lTCEbf$\aKZȑ9M*@A #TˢK TXr 4:]f.pAPA>z! ж1~SQS)AQ!]m̉`s�*<ClBY# e� ix2 &8 sGqlsM/+z3F$%ӃNNV5V8qؼKhB\BJIUU^d Sf`o }5$ ~,7*47KU&#J[ =<?ب]lSB*&0 @fj@4G YG؉7b.}<G&C %#;1 ~� me%T˶IATX`\E!9U) Dݣ\0�}�Vd7bLXg@l{J20imVa'LSqX΄*g6epa {=^)cz1a$J27t@,/Ӡ)m0үp ayu<tpo4U p ]Rӊ蠷dV}/k5|:SDI5ah={&#+eƴ.TZ$5O-$]c`3pf oۊJxuNBbB[I2iq ƌ�2:Z)~fZ X7ۂ%x#>8|ލvadԀQ[1`yhpTՁo9# |734A(g/9@*{["@"4$p"VfIT6Kqm'}u4תܜ7FVZe[[/<ؗpjwgAlqA8OV@KEʠ˞ein 8"/i[DU;%@,в8D%6)c#Z IejQ~G潖Fsp VgG6tH%s%>A*o! DR63B�x$d)n-Ykb2ÛzD5 ^mO`n8T^Iɍ:+|\2D$ 2>Cgd!1;й1 DlmR#-8Ά~ʤ/%' 8$e63\`)7};*Ͱ ‹"E;ͮx`xw+MNZ(LP'E gkG\((JlKWh a/y R0!9)ZT ق8" DxNg:-J}:Ē:SqW<Ol<'hZp<QRh^ %U @LHH0T.6>P ߂\cg TO.'7H%XsqAq)<Ù�|n `Rr!iE]s"I}Z8J {Ւ] тDUUl00e8{[sm@1w/[,U&ކFPp6DYC٘fl� [MC(@sςeʙ T'Z$=dDi<T98U#81 "h06*D:N̩cKfI%- �xIEoCYXu\FN:>W¶ɵǟRKᚵc8j"sr �d cxy*2^Ptam.QKn6*yěPCmT MAІ(CJC̍<vfhD9mZcgb›i L~ A Ee/`$�W&BUI*i<Ŏ!hA5aTH>�<(q+Or�FNF*Pbg |\m73Y12ob#0iY$R?! kVd_( !X}%P`xS@$wn_n*q_(8/V\[pX'0^ )b5{x;ØUa�>̇ fGzh ;mΥoKLK\k0<4_%RyuKUȱx"czĖ!Rw-7aZ@7b_A:ڳ;6�%LELq7. 6ƍw~ `˱(ͨj:m=mb[niZ&=xHzLH.' uoou)I]FO@@|IDTv]4331U,DMZxwуY?q\|/1MfD"ZJh՘ w!-*CcQ Ij)Hya*1L`ܤ0FԤ=<xQ Vbc0w$;^9Zi;O6m0;<x-8/ִ@l0*eT=[D5e�3EGħݮ\AUg6#*#TVa2~TSR4 TZ2\vʝ4\Il-r<Äd֒ Y”g9DksMc$%5T;8Xacj.0'ϷPن^`&Ue${ɉ=/yG$#\ܷ^+rlZ֐^B̭,IOmLߥ&ŵ jl.42^A醢x9^^A1Ӈ$m<`’ y'[#U,HC|e/e}q0SH|a詰w˝9%gɓ;hCV8Zću!5` 311Ic s/N5gFU bV2K/ܜX^&I5x0 8;%BU|AqN2h6LxB/d0 Ϟ8@hhm!M`vžFvȦҶclyP*]=TsG<0[HkDx0r�fZ*k#ӈ>qiG)$ʝ�Ug<�� �IDATPbɦZq;AsR@nǗ/hf<W%*n&:΍.Kn(sI*U$6䊨H> 6j:3LZ:ĄjʅCI>2u  aeU&sOkͲ*p >_K10Y*Ny`BZndJxAVX끡) )R~| wf_C[Z;8ubXd*= ݂_$dbIk>;yMGbWѝ=mf׈2w;jkŀURK5B g y|7a)Z?AvMS`T<`V$Jm֏pp HTohuB^@>"E Cʫ*MTϒ0٫%bU4] Oqsl]qK2袖+eQk zj-YDnqH]E=mغK(羈bp]={�;-̨ YtDkyt:yg`a65ΈX\{-[:EM[I|B91V3|0H;N"ӓۖw$2 `I/<\1\{'̎kzckc TQՖ$J,iϋȭ(E'LU 7H-r Tf,hiY8CnQ'S k@S7uЙv*167s)3!Y|]x&`ijK3;"o r#rY'4mD|Bmm"+@ -lCJ` 8XbE!]eN&*u-3B!gc.h7YbҒW`�`$e-ȯD8S'+T} b2Uk1 {:^AܸELi CբK$SYP}E|>Z?9#kkuz&T.)2 {OP5H3#]Z5>b1lVjc;6LhwR. 8|IN؜/!>gQ\X+�a޶9H>+<HxX46T<m<xЖb[2V` bҀk�܋N4r>"Dʊ8 � FB;fg(?"5Cs2`L(ihD@N,D)'A~<wڿKlf=>q)08gkؗY<$ #Jtmb7mWd/g2<j!msqmmW==*DLh,GFDTyZ$ҺM3E!["SDh5es 񒦦V02|%<]*OY$<dʹ\ CGNAZl,x)- c1bzf+ׁd5 F2X P%_8 ڸP-S\RU-W T@QA"2#붍tUEzS.O "x\=P� ~ 2D\ s| z&YvgT!cLD bj)_5n! Ep',AFZƇɁTۍ#< C~p&OH3q1YMX@Lq=7O ApR$ ?1SO<Y0M  HICI;<ecCI<Cl#(5J2_ߟ2DhxJ c98~]Tp0]I/I Dڱ<J෉YjZ1HesO U \fe1r^Dć rA֑!zE+$e T@/Ύ3}`&AU7ꄉO$L'b�F8 \C721;0<Ы:vKp$v'rۃ.X>XPmp>>�lWpJn@ʱzhqϗ47oA04! >gKtbfդIh2̦ke!^j!2yONL>F@h$2m [Uܪ <A|t>{$>m,M9Sg:tr!TSm (N+re%R8ui159UEs;}bn$[đ1Delj<vsY %F c݊L**1`V#yA,)(b\hɄfhYؐ3)=B?Htέ|^ߑ&A9sj~6s/+q.%;;%bQ<d&HڪmO[/+,k0gH8[ȲƏoUܝiM\PF52TFF#-sa ;REi}<}08*rw}S0A=\SGhD ><)39X`[ vy8IQ`$E Є_j3qf&Һ,#BJѹ"IcJ{h媱!a鼅:&s5mc4A H,\?\ Ix2g 0�!MuD>tpc1(hhf'U)ءx ! 4ic*C k7˫y3k8}\4]Kjbߢ^T)Q v6Jh GiD8QؓN*oʔق x߀`躍zKuocž]C48՚|.">\QE B,CdcLdO R?S=L09q;(a\OC֦ѐYT9uC|%m$wY< LMIDQ6&9 $ef'Zk>lHrFOj 0 N+.i!N~<dbwM!ht{`#!FrY>1FXc E\sZF<Ѧz'\tcM"(,V!zgz.h\xN0+sT2rw)Fy$8VyBqh02]`DaxL Ր"AP@bC:#B9F+! |xYcXUn*$\krO "r"ۜϳuS-\5�U, 5b<=jUfhCJ 'i'a'u$Ndt@�i, N"%s)aN @ nc|,W%RD�LIye,$%svu]R'$h%Fwt>A?t~rx^}SF@1G*&6 M|9QŬ+]HY 'F&*Q* &~4ӤKhu6)UiY192c*U t}B꼝:ww:g:;㙵WO) Dx !<W)`J¸<@ 39nUMy<nɼ }R9! Z"sƅG\ 獊7WNL l{f68oC~1m;N;;dQZ ˀ n$ ,R>gm8DS)̡<)n{]ۣ@!CӊM<#~<^=qt53N:0ݲHQ'r|luB͝/u:k3#Lbミd8έCs#(/=Iʴp<SU1|TXڦekZ:#xQ`$[ҍސüPhPy DbZ #<*9qO꼗:R41b2uE`8sN-RYWdOZA4n}s%d,i{,_l{YA+#6gLfYAX1iS6p|!΅n(Nϸ|w!-dޮ^) @?|E̊^_6I'b6:fy!;oCk,S`p-9'yJ+^,;>\ՉPC11']4wl׫nsv}R&s?CEV`4X ]@KR;VѹV0~TJq1394!ҷӀz^դy_D*XЋE\g>ͭQ 9Tj-⏔S"iR&nu>jMI-W#Pylev$OvUS ck0 yAS-ϋi2xvm QT!=NO<<\+:%"E%4V��CϴHjA0\bb lIR[nIXw?a:B"X49ᓵq';,o]xr\hn [#` hVĻui[1̭8$dPaTT<$ax @SI^92-@/NC\OGm K6!, <I"Zy<|;ĆT:11m8 ەO#F@XGdp:w\&Ӈgb#S~̱bOr{5TK~4õEkT?-`2[]W|Fe#CSWb\UXL\/rQ.3ψ@ 9V^sS%e'U<IT=B{F'~ౢ$;Q]C;U?; K`!h؇8Hy1v7*iD ɍ-u1&?'5RP`qI$Q3A$g暭Yf^ݴ@| WZ.@]LY_' |2(n@jp<t ү >j*\{:}P@Rr"j@*Hbʱ˫SBbkf9Hvs` r N-360Z9Y0DQcoCd!8e\m PQQ><ܓ %Zg^? JpҶ7b:b*|w +QK[\o&ڗZj W0|TIxaz_Bk-B[K ƴ&R7U/H~@cgJ$3;㵥1-! 3Lb75Ȕag :b}&)UP"o3^nkZȸ۪ | ""zTV8VuӸ N49+`G-SGLTtaCѬ(6x/Dd"*#6\`\r,aLM�yy4~*B T8=n|Rm2#8GruHiMH<<yf[sehsY RHo$4ژ|b뷘WۖFIgz |\M~lyO2묐)yxQbK?>T  �*�e,Փ^$XD XcK%ts_éxzBۮPlxľlC2R;>=2/dㄗ KՄ7rAMKpIDf)␉@KLP0tإyZFLȠxR`m288B>Il2sɐK%p !` 8 Xl7ތ(,WAvz<A\bWFd [4d٩B* _d/jJ[/j Xى S61PrɘKտo_)Gx*Mf"q #i2NRsA*$2qhR4ռ;q,ڎCBh1vUDS@ 36~m?I9$%=ÉykERǓ\VADX!Ps]#"4r-N$ޫ X`KRmud_aʬFtp# + UU,Sq$FDl\̓~`?N#r/zEl_ /kr# tp?9<s8^]˛lmT)%=oΌr̞ Mm̌\7/\$܈VHhsMC>jԼ1nɩeD M5 =WF;lihP\fbOLK|S&ĕSCdh'b ϐ 8rNj ˭\M~6=` ϼ 2AX .SBpņ R@j 9*G&PݐCahK)roLjiے'oo% 1(풵 *b)EQ ex@gҩs�8� * ʧ0!V;q;)XG(%6aU\Kc#k; y@0 K&uK3sVn$SUcMĴ[ mhWo  1R/RQ;U13 Wu~Y.i Y8o]՞cm89<Iqs2&êWWIdb?H\3pߎ-@\qhTGU|6ip0(28 hːpa#&D"hLдI�VRQy)_Jܤcц͙SrKqW6cb!g pe}c<Z$$}�,a"5s4w^46ْ*sfLXL5 ";b5 _67DbلrJ4dEU?@AZa8% :'UuPyfS:zͿUʓI9 F`Fkadx0W ,`pBbtC<i ?eFHKwFH\P1bR/W@wArOb,[R.^FwuFI|/0N~XoLP2/HKb*㉕cG,Q�0&v^ \|0<y4 xY`G@5e~3D귩B|= HJz_NHnI|E~3mJS>Hsn2v45ֻAo4RDsEQLNư"hF-caLe8 NV!x"5V E˅S#kmxzҙrc!ULSo'ORygUfZ&X1tSP*0xaxeIqrbbBW]s^N.I_3IHh\+{ 6r j?nG %TL]Ænp+)YV8ۂA?5sj#Z r'd*E%L+b%u?)A:dNȒEgSTQ\SJ}vA F>G<062i󔻼WjhqВƭH>aMbC=PIwĻa%S5H>+3,v]הw2[mŨ?}ouwSq \ f=5CBJZ0'K0JOε{cJf17= *h{M1A_ ><h`WkGݠU4Z? E0f8HU5GdFi];Rbe<:XWGZ^TG̒M2�iDLW4&( Jc& $P! v#a,!1{"g 3?q+ dΞBĥ�� �IDAT,~$$6]%qpUZah_)o$fTu_g!;<<EgJTdԄ!rqz<$O&w1iH6<o`^VP }89TAi֧dP-̦ *l :n1O~<=k»͎9?-W\˸Q]K d. ˸!=P-<xάn 2\M|%2"ɕ): �lPtm|ӜestAbL>T憃)l[G0S-D`Hɶ7 %�r+Lebj\E25YU/X:E V:[{yEL& )eR, Ώs^ZһG-I&XX `gyEeWb6-Y≜IGmM+?k 5V)%)c8c\k$< &"OKzN%yٓ.f1bclJ@1 xvf#.vOu"’Ra*[3g-�ژmmi(It`ANvє�  �OSAX 35ٿ&V2X1"ZLzt5 L$7`r5v)&<;aq( 1rlg%Ҷ@*3 "Xg$b`&UHG*cI Qe*6�J[uhCK bEl1zr} gw!`uR&ZLiS9H,�Ol X/D\CdvxLi g R>D Z!Q2<sLi:TRn|mu]bǹ8 ,A^(7ڪ "ʀ{ a3AQF$٥QUG-HܯvUQ>V69?汔uNNS2ۢ|bp4I#`ڜ[ R0$,<3=C Reg8jG)N0HcaPxwsxޥ88ljwN`�UZ, fP;c *G1"WIfw&Y A~̶z;p$C1c ?4&$*fDBfc& ͼtB>5OT@DQ 6/_9 =\GlJB<FXr*v3sQu8 KcIS- 0d*%[NͯDvP~2!o(@& S4ƃ[G G*L}1egU|\VwJ9ዋV.J6zhĚ&Zǁ'Ls&şsLdɜ@\pI/D&$ +q%6v[H1xbkSHN6vkjqDU/e4e6<SIQ @.-pCsr@,y ϒwVŵ?TOe+ ?g�ϾĿ /%2׬#~ J2Ax5h$Y >m!+`3Gݮ"o\keqbVxiX*?|kum?aɂ.yyRDAEaD-K22yYԸ*u;<DI~ިsb)Lic~Lо~_Q#^瘂˜P w/n0�Oֺ2, 1r1 &S|zHi (,VqqdbaW{EI/$'VnG$"qDžؤ\C;quPB2M_GX [ElBs�w;Ҡ0J`QQ oewKKRiufi4̟< 9U& 'I"zP$Vȝ\xVTPN==]Mʅ(_\HI\эn!Z$咂V.ir69IF@)XmͽTtI.ľovb8I#0 P Agv0t0 'DECJ&A ؁@ GX`Yk~U뙾f-齿?k[UO=<j2iļyzE-g۞<>qɓX]%K~S+6:{8w.~iXsar,t#cgi%rܭrJ6fmQU7>hMrr@x ۶3́p9v=Z[B佡3YPw}I2mIBQ]?B/+ӄtyŀ]^v#wL:eN/jq!9l5.CN+ InRFYKem{\yAwx|'L\׵ǟqg|1 V (C%§fESbv mrfD7)QrNۊʀ_t՗<ç<NeL. y^i4wU65/*Q3I ,d9ؕxm;frԡ,yξ:׎O*͞ip9mEhOula/\Ӊ0s<忒HhY6G}$:s/O) o994%*9W%8u#ט+~3A32]Aǩ}|mv|cIr7r$Z\pt RWn(af'C}EZcBLOc },K@^bkMuc<yk%F>r˭f2?lkYE9 *m7a%G:k3=aScل8db;%voRxC7dPA@a`-Q=H' ׍^~?a̲2粠wY@IZDw |_" .RH[] U?z>r}9YOaʮɭ떘\FDeR4|cgP$" 4y4h302Ҏl8 }>k[%9*3ch:.dZliVh>*㛞svŪWz 'cH 3¢bό'հՇ֊^?mYY  g=Z4q[Wh*\\ W:)W܍{`əJ4!P2%8!;F*4H!_Ov|c�1̬r 7C_ǁ1a OH)p2P6di/WԦ-L߲pE4+:CqIojs\6$i&s/uU 8jo)\e#:s}> ,rg7N݄Ŏo8~vwLUiQS}SbEAw fBr}pg]֭5{ThY}=ͿH.3V=LKWC K@uX~&$,EWx4!;eJP Ijdx8*^kEcV֕'̎;8ك.*8^BW qdPHϳ>} ’$ʬ�I+5ήK+ tcUH*,y<@Lb+_D3 S l[kslpsVk|<+<bQXu|_vI0k[\YZhO^C݋=@Uj} )fHҹgEH25|l<2tǒB 2sZ gbv"av  =<fِA9[ߨl)?K81d1|k}U3wPLos[ǧWQB'6F `8߃b" '3g&ZӢg(; o$+4'}+ւ*r z<?X 0$g?rM<(M⫝̸2ҡXN8jB?KtvQ="-̂)!}8槸Ov|~%l$+ 7p@, z\ Z%WC{r+ t?vNu}ZLlniQVc&ҥ|'4!A7mwER٧:f/k)$Fb.$okgABLO^_cbҫDȋ#'P4Ʋ1)=ƖCjWbY a5xhjUĴAWaxhd]\W?oS!CWhDӎIi/_qEɸ%&ih[6dL,YˬM ,S$n)0G;>}G{iL5'Ao@NaSJ8 grvD/n2^?$kMh <! "c E{؞TAT]v}Zn|2]fbjo*3ٜ^k%;6Rg޽\xJ3ur? |뛞bm[لFk,'؊5>dWBffjrWs+),Lh ;٩ =ƺR'+ LZ^x*[ d!5b8k9-I>I~$1 /mr^ <n3}B36oE q*qaR%0l6/يm vAȘ<Q MqFzB b΃5bPKjQ*78|+X6&{5?3DRvCjX; {1^m7qn:Ϥ,m va?_[V?rY)']eV,]F�# -d@Xs}ЭY0.[ -4V?Qf0u`nG> IE1dU6ö f)Ի�.K,-$V?_er;I%dѠ�37vU/#Vԃ;˭~~%1Y& m}}٭ aH` , Z+P &sU8[)=aBخc2$vzoމ "LauhEzp_?|0n~l"uSf/M-^FDAі5\}cǷTAv_yOɰeaJqy $ ][Y9ncL V$OBhWVQ,8d8aio%%\/I(_Ji \fY>Zge5g;>q񇶂 ]EApx/&,7~ch>R`eO9 l6$<Rtg{y$E}r w_8A+HHjf4㉱pBkgs6:>[JkWAljެrCc~khƳNb< KG5\gLI|s\'~?2Z. ^D>HVv[.9F߷Zk\ 7eoܰg݄tzR9r6dXXd):EXrW΄vp4!ĴMKwට_.zѾxd̆b-,Od{qX"tu2nyXv�->7Jܢӈ. cU`+TyNh"jC]'DVUH C bZ!FXEMeds7|;TVx YAPuFו7)Li"Gt¶j{XK؍Ӌ;@8cZ]  #.qDc޳ZjVu,'׷: K 0I g!JTJsRT`b>,,\z $[W-nDu)ʁ)w%y8+gX: 銡Z!YhpB1x؛!E ҳkzЉX]w$YiwyP$'2-U|R ksۖt@Jtz\)A�7-42+BO3Nuk#d9X!Ftk<8˚[;y1xG5h5tYbnb̛G[}͐0tVQ3kZg J( ǭ,5Z7 }{WSQ=98Oj#Ӫ_tQD ,t 5Ck,Z0 %zZ`/v82'BH9P|iG겪Np"J;Xsq\'h!&=k+tsBDIUޙ.؂@f\(<$r4W{o8u$}R-]g}!aAX#'#êp[n3=gh&"Zg;7h}vF!}<8gյ126&τU:ecSI+L-eIXAJ76ljao^ΖL圼&TeW׭N Y-5ǵ5][ˎ4dklԐ�9R'>g⭬w"[;[32in{~3�njV 8:l r P ,\|`N"NF2yӅ⇷ eW)4@Y^eL;߄H-!SӀ-!;ʔ:-Z(dA^)"BsVkɜAfd嗄VETG#ʯ,Xɇ0תk+lbkӧХguDūH/Vȳub)S3,-2WD^xXZk.Vk�>ݪe0*!S|H̆tkMlœ`gF:~/7}8WoU7$klbוe,rM6 K5W-tG1-Q] B(6RTQO1 8iRT-NLC2S!Uktd񻤬&q<i$#Jd%om})sdmI3Im "J m?IOç) sKV^$/aզ0?&8RX'5,T1M(ω>}r$+A㬝;NRF `n>B}ַT=)*$vYYoü;"6|0W ViW!,Ε ԰I)?w"i_X;{9Oj9*>f}#-c=k]FE,2lt+KekV2BfZe,;h�-QN| oCbUS}XnM!=&_65Įk_܎eG9׿ٽ&[>D'uû''lb< ^MK[ Y CˇMM*rbyZn=+iB+$4 gQrrm=ZO CE{k;9uɷ2G4 mc)51[SG?D֒:"4"?XJS9CNvt#8ωyL$ȷҌs ~Ju_i]/<vL1ć yZݸ13-O/fuQ2Xώ;߂·墷Uhּ;'rnEh2T"I0gePwgNŲ^8X{0J\W7r@¯>t310܃* !Xٔn 5^$V/[*\k *H 2�pxjۗǷv8q|w*Y&&[!dyեq-s:dJBpS擋$&ya ^_�� �IDATd[-iה l&r<6ڲttwDE^ܡ.J 20Gש"<6& ׬F+w™*z^FvaO8q۴n-7|n赚n /k17-uaA~Uy7-D8<%tnƪ1Jku[}lh[Ŭ)Ф^ Kʡ]MA[Jm"σ>;6d';_*^(코xx~e@aY%dçU+RdAwk*Tx1 nJYA#۴-?1_ݪZ͈H/đRx?"֠EH`oSh "tRĈta^ml!YGX{Hކ-͉>|2L.: ϟ]1}N^~(*t:~t!}WT㻠1,oza$�vD1g6,81+{nf T 8̪1XĈEu| F tUo'ns[g+W"gd❑5LdboUw{^,723 Rn D'K3D궊KfgJ_.-wy]z!׼A[n5BCvo:B89Qʎ.,U@E.p+1 Q؎?#n>Xh)=)O'!Tlkin)>hD/٦AEK2 ]?f)ªЁj I -9]ɷj__q5dfNFgz?LLiڅcXYvn-=adMJN <ܚs8.V$yIӻ\pnLw, P')z̋S `0܂j +Wv Τt/}gg:۷[Amz߅C13:r ØZx %R!Q ޕj߄ƻv2v,`K `\B33T 6k%n /Ҽ2/`} .:Y,.Εj%#J0`i[<+kn] ۨÊWhi' HJhf֔byk952 ʬMlOﺹv92O4#䂬+$/*?G9hDj8oۨX3yNf$P� ls@;e+7۷WsH֪9.Ke2̻3pnmOOd/ܧ;7^"QT(qAga[&L_@Ռ[(ѾjddX,9>egNlq)u[ό t?#L/koopg>ivu*cu^h#9RIB$@ngl@_%bw^ c[xwg=.E(:ф5>){rU 0,2Y'ɷ\)%sĐXݘ_QP8H)W#W Muu٧me FQ}~wl1�#".ټ~tYdc![bW4z?;1h*-ØhʶD* :\ 0sR *cWe'RaU|6ڶ Q՗s*k:=F$:l¾9zS1H 2|0ŭ 9CM W2I�E_+ @�Ђ s Q<B<g'υID?BˣؖhO]7Yuj& OJ'lg⧸0Z_0 2 #b 5כVvAZ:UN䃝#gf]Ć.QG%f3ip?jChWb&Fmv~^gtKybLY0lIa^Y:0J=WސfƆϽRLH~ Ʈ/zjưV_M)u]==X3ewG.QЭur.IۺWr7Wq%vT5oDz{�q~f~b }.{9M8"aY K_kڇL4>~k/\a B|lr>Id}+6NAq1Fp/qmi L7LrU舫q+goApJGoX.uCSĵp?l'gƉ7MLξHuֆg#8LaWkyX1YDm{,ʰytT˰aYCLFDt]W#[m[v{͘뺧JV W:gdaGj=}x /s9/ف+dkQ6Y_w@khBC, C|;$ m<QϚ?UoI_AK�sg#Zȼa:H XxJVà}UR5CVNƳ9G6 '40f4-f!Cxzz 2W S;91~+&TJKL,xWO-臭hQN ߁W05[nhd9MyՃ`vu%vk ZMZf41]E7w ABXxiūUH9~m6ɮeUG;Ԏ9fa&[fˀi,Ik  YU)^4@֤pe**xք\jFۻv))<젛Pz9NF*OQVfM0Z]M~h1%@Ͼӷ1S&\XxG˴;K2z-t&X^_#rW3;n5ůppdr3F ôqnA2MAhI Qíb7rR^Tv^+3C�Sa5ȦzRYa-S2-~d:NpĉnKiݦg�DxdEkgsq=�:>d`fCz" ե�@W\i̗kO�EPc(\K^Eиx�XztPn?[LxyveM!uzzMp2C FFB!-PSZn+;K6W(^ 9O,A]8~~iFK,^pV]1@y\̧[<O<*SRǺtfchQj3 (>dIgJzxPYLeolnݛjK@}0DAu@Zl6_eѨM5DK$< 6-ﭯv�ZPu_9MV4C+EFױq;҂_+K_cHRH=q7$;-bjm^Vlv~x%^:l B؃K&]8?BW:ɞsϒEaݡ4uf[0ǗyhE𺳒2.5" :>V5"֕ܧ}_-Q0+} -7NOd{fyQnO^2÷y21׾ۀ]Pyn8.s/TԒ^މdR/q A_CP !o#nfO2pcrɉlgW`!6D6Luf*كǘκ1RFÉΙ٘~Y&lD.ہ+[-Rc,8!_3BDcYZcF�g) <Y1B0\ WEKR8TժlXr xuɯ>kxkWJ˚%[:~`W&TV-K6=[%֝>&wrSF ⑨zIg{Bch[->:',Ǔ["pK8MJSOx3( [ ? .Ʒ`o<@>AZ РgfXh 19 HjFu)tz%rcM_Ï>ipBry=,!)-4JYH�~N*N88qv#BRzʰVu=\/blAP׿Uٙe/t9*-ޫ6ގu4{6PdKq f*%>:H&-AJ+}),GJKAc}0D)[T>VwLj֋c2l`ǀDM+G`yk(qy2)VQtQrB%zJ-[>ץAay@g@R ,ޠ;sinV(V3^$\N59m;:i�$Ӡ%D \b윉YZՆ`EOp_ͥ"QY 'Lr r{aM62g̜|±w?&<pK]K" W9MT5e}kۜlxLq -<fkWrjJh s U4w]Y.aABDx &w єز5p6Rہ*i3˰H|`dx]i ,[4r$\ p崾 U[j􂔧 4$ޛ Š./r`BCw:@겛 $ϰ8wÕFS-` %+C2!26΁MKV:Z~4q\<\G; ϐ|C #S]*]qƁd `5(#]YJUU:F_WɆHD0-LjV>hv:ڈ�x9"h:CNemۗCٖ*]#`fZ`/7`mm +O %ufSp%5VyoqWYĚ> z6926^WnSYή>и`ɎmudYW\}kRhoϔ[d9H竄*달50rD:j½:S/R'IB`=w;|$`fhY2Bݠm0W:}` u=aa8o:s&z,zF}cCY܊ϛ0 OT 0Y �hBÚ,~hKtSWQ+*CH MPx1>p$~y RaٓV#- GWpɐC -F(gnĕ\)O/-s ÛsfY۝ⴎcpJ|\Θ1 ۴Vn !>_-ٔq%OV۳̦:Z%l<*@v4JɌ!kD+YjWZwېlY;{884v?ldY -pg[/(ɔŠa keBl2kPpC/nźՓd%�A4oQ$qaPPM6n25*`r..iֲ,Bi9qV“V| 1$""rljEXbJ̤:bvCPOaOZJOsB'ayN6eq]+.B%F2KJ:*[:Qiej5XD"&šO9y yeri4͔CC\*4 ɁxL5zoԺ0u\Y�EBn}8eo&~卯tznqMKKBbV .U3V9+6s֍Jr LukZHwg|v 7,|u2.m/,({8}y|㳝WR(u?C bPt6w]dr0^F=x,exWݙ⫤Td]ڪB+l# 9 RiU ;&# E6grNni'5jOFN-S9g훓!?Xg{b>,S/!_:>Ɏ_'$]= ɊEy +J^is(,$;ޏ tr:Cƀ\n 1L2.l>7P][qO:5T[ }Ba2~]% Uz=%X&Er-<]ao -#K)M:,Om=pR"K!>ll~ Nj=3#c$m1_l~؎Xee\:{6NrR ]2s^I_eK{X@ l6y1VG$WD$7:zfl"+Υ Wӏ2^=BhĔ2S֭zAZ +joFl(ǻy𒚆+`$W%U[|F%e6b!)UxqٺSk0 40+\H Qe#M)/y)%l؍$B[0ɾunR _%lJ=3d?x]+PRZ>,�DVIа{vX:VS:&G'ً'fu$A 4 0 7KI%8lxm;;!Idip5YH-S ޴<Ga/Z 0̔<t[HP?F"vxBYnF^g%lfEp夃YXmqR.ZWiXG6?c33[#Tpت(G>E:W΂(X.otspjD˧5K$C~&/KJNoXf�kĢ5ċn[ =u^BciYr,|z<h=0x^w@wg:,u%H"æ?cAC?LSΔVV%}%b8X<g'aOR]^]XnЀJ0 iJ7F"? n~E~L@'-1O]NCŻSa86! ͕-?jy >^E<a:?V鞥Y`yUuلc̿e)Xׇճ4@"÷đ<c7s8Յ®?9(c& JHKV7%UfGV8m] $΁=L} #M)vH)BґCQJVlzᐬDt}=u@P9c=s[}AWs xMtY`i!4BgŠucl},_iE5"E] IPե&0FI6,@.L]kipPRt S΀W5G*t1]tݚ!W~;ϯ#zn{i3S+3\h|*'Y{@ùWj25]EHXT;`n`#:IVėԞU[ )w]cO䣯4A�P`ˍB.ĄE�0ne[OnDW'oӕo�Ex^C.,8Ƚ۩L9Z~YXNاt=.cv�m-s<Q/uΙC({=£\B6& 웑Vvt,roza9nrQ1 3YK:.R,7<JE R,"o]4|EɹGJ/Tn7!l3߃Z{e~,CBKGex FgEnk)rŁW-Ea K(ך3=1V-$l ƨ%› /\M1'RC@k.p Ī*NZ%cO҅ةIJoQ>s/:4V1k4xY(nmq!,ˬaE$xA屾6@ņ_)7vgIpa'D /9d9T7>Dc 9!G  4{,g-fǰ%akA��� �IDATx翩3}}7k$r7۶-RzU ;fq%leyXEb$>Vy@jc{]À>,@ч_/B*v She !D/g9J*284հ/ Uւ CAH,g{ z`4om~f>dkǼ(OQ]-eR/zC W#[bA̙b<ْo 3nFě^{nװPLn")-0YLq؍R-] \fS@ImCXᩓ, zWU^vYD*"Q2 wM$-#& W{DDܢ3@7_̜B @A�Xt qJ2# 8,ejyΧ@Co"m˲~y6+yyXHXqOC-[Iu븎%ڏW>V ?kU<:ղ"$A#C;e:AG3Y�y3pE^j%` Q )_Sd_N c-�{3Җ[jF^`PWנDzϘ"8  "k_˶[ѷ2{^ ozwqM鎉%S R TX~r5 Z7̜X '}{SޔTϷ̚q`CGwCjdP9N25#[e |нߟQc *'hTQB1g81r\Z@|g_102w#Pʓ!n"4>[$LeB f3lF%O)Q=9dcz(ITjm֘*N}b5s8 \XIj ="՜uN1ruHH4~fȅN(Pim=,~ /l踢KZ�V<I<IR|}+N' B)O&:~ABn)dJr_?8`( DyUwlYZ T2hWC?<^W>k1}E'ta@Nj~X1h./fc׃<Qit_*3W,w {ǀ'Y~l^ipXk{bYtUC6yƾjv!2ڥOҸYoLͩk9>%p]DE߅|+F3bQJg$ʖ${MLd%D"f }~<$w \~Yla<ꡪ^xp%<Cӄst<A6$QWրXd ź25t˄rgJ^0ūC$*@ٝ$WWhplm=oO[dcS~ d'&V6)sb<rgfD'ջ-[ؑf^]͑*"ݲ o1sd|ZYe`cDrwQf 3rܯeVg`H"E#&!fRΐ.ga6]~; ?{߳3nशj.e ;y2űώh1+wU1-đy?r˵.Alt<YW8C£>Õg}6ҴBOCe͌Z OHf3t aȑ K41@O$WOj,fJSuJ,eL OW{2) _δ$qc %b˿iBV6U Wpo;]޿L R\pJ3B8+Q&^oXaןS"W[[N"drtNs ߅t�<BBع!YNXs}o[}JOAd r@cfH3/s‚ *\D-k F2߼hkZG4TS|#4 jF#$@0W 7o8 Ss1vߴ@H60(.foI0#9>[P䶖VQ-٭XveHb1b`+S앿M Ų+AL[$Or [2;ݪ*8w�ֹѿ[8@K3֋WچCx㓭meM#6h5 )j{Bz xNtr<BUD]JHQ8R9Z 5[}6l0bB̀T:}.ր0$~ҕGp f"|:휂j *}] tv<3ABLh-YROgtZ%ZʔqCf`3`+\RReއ)Wh^ddހFFq8<A :uYJu]ap[=䛎<BKe+Q<h &Q*ttʮRV+YD/e3`"Rtwky$dZ|uzrB+öO`O[qpW0ϑyjAp᧝¢|pvx`^N9I0mZNae֝?O<+D40~IsYZ<8fkI bq}2-@N#I+h=]87{eh+&\z@L?QɸI(^f>r Ʌ2WwZ_$B|QHvq:J]$jzV]f@~M=<*;7PSӖvYg84غ9/M1>S+fge*y20$&L-ÝWlPux6ʔBkC3 ]FD{,rBY̧d\8ׅXMjeb2l]?dt.&d=׊uXx˶KmUjZUpR=+L\}ˢbfA8]@>|o_>3dob2f;N`-Z!A&З#R:+bԞ13͔k$"2\S-tAZp "#Çę<%wЯ\-ql@nq=7t%¦Oj4yV6aR&4|bYU|݋mc^A$V9dhn´qn[94ijG1gZoV; UEǺ;Eh]  kwyly "{$aق(r>4ft1<cPQ� ևWIvt7D|ղgc`:;[S;n;!\q|Y= Acոq\}<.'W{4.VD % �~>uEy^WvFZXwZ 7g.g~Rf*k!a/p?}ܴ[;h`FՉyKÓ7Ei2nm|թڀ0(a<9!h)7lKƚhXUcZ߳  *}1Lpҋ=KN-"5hlΧ~E3.rĀե8e yd4| .ST~ztޅAf=BH@؃#Yw|BT&{D3.:n m ODy 3ٜ  Q]3ʃ6z(n!7W.Fd|GP[? 9A fПi˴I; a633[֪8HƧ7y a>'=,HGBcS#i,WNm:␈9Ն)[)^p(g?eB~GBRb+3XQ Nj}2pp-jq-B9^ZsZmXX=t+f|Vה�xZBy2yPx%e?WUUrv�n'f $*zfp|kKsqq#b|S+]+},(e &Xh hr^�C(1^RƆfMP]^ 甇*$(e�.[WgrcIˆV\8;Ao(oR7O{ YSD =UGn#P up9)f6 Ǟf-V BWar33v+FX>u63^�v}�lĔN؀V- Kcؙ)L•60,"㩕v҄Ҋ .�jr"4\$%NTmA\U&= V8{6:骯<]b}N~c!zf9g Yq?K4q ҃(s ^F&VhDǮƒ@W5K2Bmp 'BzCσٗzvhb-׶WU}%Lvu6"n=gN  aVbH2Gs[ӋUxm?>f@M̑҅E?'Jҳ(J3g8!C^(�km,;Qŋ]hW/wa)1j?Z5~vZϼx/"feZB ˈ/eY`hTMbq]hX=i̦E'&2Zb۲u69>+|ۤ<=G:4<N2gȸmf#-LHl2JNjp�޾<^6LZ41,6uLB! "lȗn| )Ft$Y-a>BA eg,fj[hݍ0%*y-X{OFeK 6fDĖDVN$ϘTz@UPX)k9>֣s壯 k;Q\W<5L+^dч)C ҷژ) S@"-%�Ϲ h&A!բѕc~X +¸]4?[KqPxlMM#e\ 5/{k;zG pZm^~<a�(2D"(gG.0ZEyzf~aQjoe vET K+Ez_tE3Ie^ B^^_˕ueH8?Q֎_TGL:y+7'¢azX°"�IcRԋӲe_!pc:LoC|nvC@ !p/{vgZfݕ'\1mS_9|?Zo O 3;> |ο\gd:Y0⍾˨Y"5HyC9 Ѣ&f@_s)Hﺮgk-Ywb&MH%GLD&j(bm+G<ZDQ]X$T 1.s`kxA pH⦳~W'"wx;[E^^aχl$4(gnV6cB'"ZvV8|a7hee^b]25a]RFpM|FG=%~<Km}< GdZo]ח䢙I.|eu(6[;2ؽ9rmC%D{#/#2Вg<{md3&gd,{T:CI1Pxdp[ʕBJ겱,)$ePZʳmO*l;f)$wAn_3>eY̝@J_ WgҥdVlբYB\J+C׫K2 7'83<1\3 ȴg#niI{"O ͒>FxnX{VfWV[o"W\3^b 7nB髭-r{Lَ_0:/~|m+̸U`44kz_gK˚;`i(O)"!?CGZDHUa& ƑDAr0B4!!0;/ _,MnZ9>5�4dPEyS7+2C5& ⡜M)+Az[N`pן_xG5vUǧ3^i[A'fcX1%Xg$n!]m@hIp~f5iDd놴 6l^uaZNg |4_AXP b JʁJ>~2a:ia^'m룭:.|6^:?–Lw5BF{I1̑پ(_(*q]%E& B.*0"J]]狷NO1EΈ }e/ (=[\eK _ޔ Pk&0x^Y^f6zI[>/բ+LIq  ['A,ijiVH>C/AD]OY%3=A5/.:ϖB3UXW[L%v톍p}!WVh<ƿQ(Y-Xеy g<|Y6Nq`Y2VٞQ"pb(߻{ZDp>IF hj&SbVMyEzoߥ\AcnOOVc[8^(Cu(X"EuF&.[f{Q6.\ Zξ:KEnbN@:^Ux9x2.KdChwl:V~T0+Yu!KZb%hΉÚxç"iZFO~{-׎G%dôCXˇ R�, ~W<:9xkv ³޾|(?eca3/miRd^~e0:ʾo+86Rvi8A*D3ݸXBet^$;OH=K qubۈ"b+ȭKgVGsnl3l9>ۗv|cu }zȡgm(_qM;r6�vxvВUe,1a+d |xI hX.=%n7ޞdI0K o6QEK;tnȚ( e$[Еj nõZ=GVA_?Nhl;kKdB#W˜$k{kOpP>7�6ݰBF .$ӤXYf4Jn"Q(7P@؉M<H Z` S Od?Hf%Z;)~q|cǟqJ@u뭝93S/>XƼ߄HcLѵ)(p| 䓀̺m]9 K@ Xk} *^,CR<󆧄MvBZ5HoB3,3$@۩zFg5fev*֎l8f\x]4{-`lۃ9 !$`M<rgJ=[DL+oj]ODB%0t `NQfkx}l\Y/,-oB5bR[s6SV?+5yqdvʎ_|(y+6;-bmPu݋rj&LM C`7J7ꮜcp5N[#VPݣiQ5P^+^Ŧ/4fj 9vT# --K, ?!N܇r'l:ѼK^'i-u5s|v|cǯ[k5K/}[H;x?⳦ZHa-u.V޶^}nrƆEEԒH6b�� �IDATZ8 xb !~^?M3T݄rsm,[M췍R2E؛/ڎ_F5GvA/dc},dKCc;mm]ξ]HQ|Fu—-8^AFCcው71tc;惟�AlfTfo> gX5}XϗUvu">َ<>`yiv%|C'leۿof `cJЬγl60t+ &ZB!h'~iVgX!7ue B|J4"C)I~Vn6 e,R=[浍.*ZcixK}\%'N!�vU3:َUilw~Ũ9e*龩}źfM. DPJ_P^cxW -#}k*Ku3&@)l=j 9 z˅ov_x^)>:[pz]7/S=ߒR7+T?z}_6]5 X`B{Tjީ Ow\a}s1]ҺOߚlyX n3<L8$/d \aW\@$.*fe⯁W޷vu_?NUCp:o#/M>ce u[} W{Kp'5T,LĎߡ,Y+J9P=avOVDvo4m&n-<z)`RĚ(%@E,݈:Oh<Aﲮydyz}I| >ۭ*1럭F3.ёۖ&QLͻ>Vwa" 4x%T1DkFz};v__? Y5-҃&|W-:iGl{ §Ks,jqх,rpe0Ir丸Ht )ՌaYYt5gc!D,^sܕu,'r4jg.vі:{|_|| ([;lǷoOB2rWtal\-p'xH,K uuhSmFxw>˻%L�HqvEV. RO;u|L3VadyرV \P'&(k8 ? N(;fIĬ~i/e7[Hd]M L+ꢧ] ѯc.VWz3#E˰K>,4:z&VKal ÅVU >, xamO-t*ԽSizyPِVV7q&qZ,9�Kv"g8CjIQz8my˟$Ea:KD+xQGȋv>B/N[c,Qf:-/dLdZhT*d{A]2-Z?vújer0n[JSrorgmXVmj P*dWdKd]u$HOcuCȕ#UXRMX Rn+Hݓ~=,Eٿ(MK^ʂdΨ0DC rd͇>\W:  gZeZ36_e \H gnflF+n]oF&Q}NV&n@2k!s<xۀ(;ZxXy<,jZG)e #cD0t6}gf'[Z؜ &BDCiAΰO.*g9spT@r"Y FJp-w񷚻SZ{·=(y</ AlFw+ǾnXy+Y`[["WA'+9m<B=*Qh$zdԎ[[L5!15ЯƌT%=A H3pt̊P]?kd,&t�1Xݵ7B9X&ƔB$!VΤ>8X^V-<W5g?PFg2K]UڬYuüWCsjk)w]hBI XˤNl0D9s[5"*WNދ>p_&)k>3`xeleaxj<In=;4a>(4-gCk9H+nZ\#I < Pr#4952Dpn51,igxSElCqHhhdҶ 3R0dwnhf"!na �JHv椂pg2~3ݓuY #RԚ"Y.3"q`kkeߚ0x:Zo .yU9؂sfdzsdzA/\>?Ax՞d ǁu} NLF$[F*yFE,7chIO}m"Qy$(IXo8D@ iC�Tha^oF3t3l K~lЬs~Y_1hoK?|L'c˗VރhA*tQ+DUwꓚ(!t޷(E.Ƈ8̀)2AQ2rIk8lSLMh S鞂JSrB$h5qI$,a,حO=ɚł't<"T(=.XZdE<u|xvtxF몷ߨYZ@ |yL@$YmC絢~=<tDgEЪ!S�46rf@L6 0Ղ $6n)j[%u-ozKfpH=CxtN0(uZγzQ}BճhBTٜ̠W=aZG{ZkyhtDceTnU48cI,O| rEZ/ѐLAU'P?BrZo֎.o 5k`##-rCO` ) ljASyVq܍n ΚkvЍ]`]l,2T|)Ф5p�JP5ll?ռ,C#V[K'q' NvvM[[ㆇSY3Ұ^a.nڽz5TEMWy<וq. oDӄwF٢7V Y/ w>͉I4 r = . �YYtg) ?ӻ1TF.e'7KKh9Q\f~]bV{YjN10t(+!q@"VDAVJ–!i^�J$Z%1(VZVD3V+},r+Zha519~n#$;[ ,KW)f T2�zV Ej1*n;j@fbĢu'Xn[crƨ0ڥq:<Ol.9 J S y ׶3fiػYU5v4ՂjWNdP2ʤ _hm>'/T-rHH7_RH.ģ#u6Ł88<[t]2!Bg0H[lw[]c΁N+GdS/EWe؝Z1lz[ă=`x~(%j3 ͉u{{-ti1gŸU*>1!W5!`SXeZcb&P00lZv�!Ty_.SW"6k 9'X6EnH ]UCעrO4l[W-_v,#^ ) t[}mf|e97’ AiNzpnA)^ j#v9Kr�e2.$Y?i aK#zk$+QZPAW sm+NL,9P$WdH{B- Dgݧ)5=sRnUO8:3X6nR+zcAX [$_9kחVI 0ז4oS\Ŀ-RZn ^IY[vhtm H ::aAt7s`]&s;wɣ|'Y Z#ʫr2`ͦƈT)-9P&W�@(Gl\lu,/ <p1&\"[2,LTl=Rk*�Ԭǒc_/[!ZlvrWz 9MZ˭Kg\<Y~T}H AS4w}ANGLMZx!(hBQ2gl5aЍ33)o BdD@FWAF-}5:y ͋ $!P 3(;ќ+>-Ƌy%ESW ^YGSg+= 9il4\S6(Ҋ(au`@~JwaB0se%8h1Ur*Bsٻ<ԉ ƗMc"@T3E$+Tf#" kz,Ϫhʍ[Ef+3:O+.Z3,s FA#"t ̾X-4B^  \M9'XBJIWl6[2 E&.C�6Lz!I<YƺQduڑU)bAV;DyATH!qڬtBy2'M&Y٢c᥀: :3x>U0I5F5ya1m@uW %ňxcwd#,HZ˾s[w]pf-KJ^ğrmѰ^],bVjd_ 9S;XصcH'^#eF[39m񛈌g /Q{"Cpwsp佌?+)1ܭ ֧ .Bd$TR!20+uB-q{dW1n)iCI!qfT@, p3AH Zq)an\I^ Jc5$2b'Zh w,['oMiE5/Ѻ'(y*@lF@ß/Y"5&\L^GM2}\gibm4q$jy@12֣B2]¿<$H* .V8D5F|:)̜DmeL6JRK4xpK/Ze-F|| r%v-~.>2?c^c!cYEKV)mB *|uKg(8]F9~x0V%]⩉|JHkX$Ysev7ƒRh(!W3 #iIO߂+1iWx[)xthm6RF)aM~\byP40 +-,a)za;Y;S-ϰAN3k!=O[N҃LQhW idH>JӖi3dG'o?63W"TvwtrC!Cv{=x?X?KxDf6#]qR>?g_>Pz[fs$nQʣ<@3^cX2|ns.BHBsD}2z#}0`}o?Ir17WWkE8ע!flkԓ5d4N#[4@h.as飥rv2K'L3Hպs͎{x4-ZQɜD q\v[X:A_�Gh6̆v b{ĠK06Ӷt 3!!|3|l0Fʰf3:eH hR o<(-}9nl oe<Og ˾Fb"ePƒYgݛztaґ>zdD[Esvv /,) f{$ psr ƑLJ5DE}&Qg^@www7PD2k䦋D,ɞ-uyIƚ=P O.h?L3Ԙ½F/K.)Of1C6a-V �zG0;v$!q@!g`' (4\*8SJ.'p:42д< -1f䃑WVQuM] CݔmݴU_zw\ߌǭ w)k.J1T> | H3Dv2.w=OtGvDBV 8[2&e6Mn#FO[M2/^sN\}5G9ː1 d a #@ߺoJ(\Unfy"'s#F'KjZ1Nsy`w x1-{%#GlBl K,C!D(:,22 ren9v2-*TWf2/Z]f8;"eh8þ8r|L@x&РC9٦]V3&136MuI,*K.[5-$¸ 0L/ih]=O DB%=!* Q=<zL[(1,쳉3K(`&m>#!lZjYC]eEw>T 63 opkx9egE= l]J+.Bu>X dXz8'(MKq&',klȅ5)ۯt2K0TVICATt}Ze?L[w9eJ% WF$4lLYw-VBHT6%]Wf yTKφ40<Ժ16p2%,,Zvɡì;%{Oj>sse-sU\xjQ.m(bV :DRk$v>heW`-|>B[)ҝ$\]n#+9 ْae#r K& gcR#=nBfE#ibwClƬ19{L%Lc弚'K6ѽN~28}ϕCA6&^^6HɱrEĦ6q-^ -lқtǰ'DF,.m[ayzw+y(ʺbrvpGZݚ̺%vSp@/Ieg{se ᶙ[(9/Q3JNȒ}2ÐNZڀC,dSQN.KR# fr(2b Hj&ڳaJNͺha8DGv!tҘ)gl>ّZ NԵ& x 6`Z<JͫsDz�FK*{K"4ai!BN~bC VtZXBaqš;4Z",V]g >K:m=rQ#{P˙p"sj1h c5\XYlwv 7m�sZղ=}HyO 3*_7"+FYa*}` 83kB!} ~6&9p"bU"b'MqC@.:b6߇N8:J��IDATA3hii[hR޷+UzA|p,쁞EiPnv帮qv8F%k9D;07+5)FN*!F!?Ö~GHm1ByAZyZ9?D*GJpkIjMwM7g8Q0=K9zՔmAddEw>{4-#6}7i 0jF|Mw!"t�uj�FO4gDY΢o25e`W<6Tgv%(jj:ͭhԑ8<([K4NޝіjPd-˸R#I0fl6tDlMD DZ <f >4peIC*<.CnЕ/M`@Ԟ6JqrN^JZw|zOqlVPg~E(%L@sgM_ d TI™!ޟ'l]MfZW^o+'3WL&7eY^.!^ bps&ITYn@断GF�9}.Y uu[]@} ~p갅x nK3ٚõѐ@h&z`c֡,Sd"& XH01+Wj9|}}/ ԋ,-Oc ][d5M: CL,gȧxkyuUxXl$-2?Ek<esPK Z@3ÖBcyhT`HgBX^qdYt!]cXpY*T X4 NW# LߐR-€W;N2*`ؖ%:N;Hc)8>Tb.BFOc#E`o?Ne&TV+o)Csv(Brj:zLľ$]=1F=";|'2 r9+ɤopRF%!?at V{-4`Uv;鑥Z8غ� |0A1Mtņ}ٞ=f gu.Z٧T.'OYoFLjƲ(GZxI𰘭4q/1Xt7+ڶ-Y*nsv|}b$ tS`ȩk,>x2MytRޕbY]DAo㥧<qs//=tZ&[Bua; ;݄RI웠eUD%bOy,K_ۇ]�YQzA稠85ubRBG rxc8WA_̅8:S,j}Fj\q]V(7 ҳL|b}?i܏klo siy2Hj5H}l!:8dKR\B⌤;뗴S~10%=[FERMZvt 4JC/h 8^j,Ma-fCsїL&-[xIvh IΓ+M'Ed?~֖Ad>u~z;8f+ݥS{)�&2uUކ)(.#4z7gZ͒f_wY`ж:\a MMπ\Y㱥QV;ˊkg:I6 $&߮bϨ>>}cpj.ҪX\QGnm0b86tحkG :5P`ܷo.i^p9K{o ][0 h$0Mȸ5,ZSI]z9-tH=y(~ΪVJ !,f5=KJC>@鱠vKiB^p RkĹs>Q 1q“2&։͠AN(yF)9kM,9к~Ӑ#ÓfhmwȒl FÓ&K"|zĪxw}ǎD o=v;O[M}@<B?3(MeL<TXj zgJYi|V{iFuvW4!A?^Tg?c} #wS 3(.Ug*HCD.#�I™-o21W'�oNH-H2,�8<(G"Y'@4]H ;o"y#ezNbB?LN0P+Zs^ذz^Y$%䧉3m%hDњJβVKQnkK#5t e#!D?PG RtC.�Orœ'I(TDY h-m)Nqb ۫$[, K#G-|xKYBI%yWWiZ6R''qnfPg[nψx.&ȕhѴlCr]wIS&d=bF$j/= e2?[يj ݖxYA+%hғdB?XfP֯m+,=r|)2Rk3d0.ó:ZAKin2 `_xi*A\RMq:x a8{SL5PԚzں\0"IA)ج R�!uG0g69]o9.2-CV6ixOe]8W++tRK҆Ho6ri"c9 U%ݹ,IקQT<$#}P@ב^F֭%ŀυLdɞBluBՆO(<CԿ5,ĸ/x/[f>jr[Ϩ|-<ngȰU&eg%IV#Tɼsa̍hy*"QaT WDTNE�iGͪA KKul!2n%ȭ;)xfu#27` ;h VVbx[pc�Q>qR*r^iYuW]!<E<ݕq&z}Ttw dL<Zk|Z ^_QEw2lpu"0H)?p͇f@i}K*Mz\ކF-Y^d\Z EY9jYc]O?k7aB:Yϻ׈@q䐋"&u$*V-|_l]HYs* qqq3XH,LbMVl"x[Ě qvn۳sVlr~褋E 9uTBe2ްUl mNݞP"k]Vdg%<H� PstK+=CIfw5VWhGI-.vaceCK?КKh=8KB`21&I]:#m:ΙYjQS\"a`pKk,kЇ"jy=:!u6m1k.A'nL:F>.\ ۶z BPn$<F ԞΚa\L›$Gx-ez�y;w180ukJGYGW.%ƒ \ QYNHM=rKIi[VJszE/ NJ4~+dftm)HĽy M˥BDJd@�FAfȌ|m]::^|W[g37[~[p[E66{W"F!I$%,HIx %ܮX-DkL^o蠢Z9Tj^ C7)sN4LRH`|]Y(APRue-z`NP9ɘq0|({l)/:2ɕ*f8Xȼ5k Nfr,j@UfG?TQ(qh'rVⷚcAq9 ursuL1a<" {<�)nhM_qzgv24p];dOqՃuT΀}t=D( mn^,SgDd](Ydw?:O ?{Ē&(jXVP6 VY <XIiʴb6[]Eq`uIO-)CnVɚ e <4f'i6~ ;<l0mԙ I= wºPXʗԳR`)*ne~P\C |z̞#K-@ Ʌ%k<~f]3 MB+EL X!|T�gُecdᣄa[Zbc\Ĺe —|Rr >ۈ'zVlO)0,Nޕ#<ut[&5[+1ۧ xYZkRAAIL6C0L$6ikw=GX`D-!Ҳm{h^bπp|jG@{VV&8)bw20Gp2�v|x#2L"Kr4]}p�~X+xZ"P6g!MS.bӱb5}JBUgDBli"DW ಇWilA4i`-WDZumD�ܲJ3 }L Z>vQGDx[LK?o-ᒖ>5QAoia\52Èݪt~�LԬb zZ'lxuA6[kw| $cUНa 8VB$IdN?& ef4/ZG#j=[\t3ȚC{,Zbʝv!5j(h؟@=%ܬ2S:uUKЕ;NA^*V<K3W\~Ui] KB nz*ݙ[uOVIgUH ,36P!m{=@FeDAS�~A"a5DSoؖmDZOFSӑexk-|vZY*?ܵۦ `5n<pDh*QU=�_( V]EKy Xkl5ԙL{R|6QMfYUck؟8TX3k+íb !|)d`vO|NM?ml: K 1 =EJx#&ƈ6b 0,pҮ+ޡ壴:^C,]iz;?ܼ/uZvy+gO9f[]cnMk[kƐ[\4}R<LΓj/'Vw#Bm%4o@/"S'sϰ֏$aNoH]X *ˁz?_sU 5އbkh4jˈ݀g3a2j_(;Е:hA˙o/J( LoA;FȨaUi( mR$s;1Z6[*yכ|r.2^>TX,+n!exzw?Z2vy9KU~۸x¶2ZHCw}p`Ĥ [czc7"Dz)J ρEt%,^XU|;Ɠ+D"UobNt%P5xld&4n% `<QZaՉwXz1H=e^_ =Md- 99WM!l^o֢k""q R9d3<Q'fП?YQ"vћxmt]<lisll[ IX3-27~FBP :0nL2*Ѷ̊H.#$eb1؊ ]LOͧ%<K^> B?V[#ZpvG:/"0 &FO.օ6~V^f_i=IXf|(|ԲN.GD1 ˾+#tT-1CN`tXP`f:leC~;Z!q?vp&Aql/ʃN&@ ).e-f<ZK'bF*{$ZXݮRR>C42c!b4{*ݞr aK6aFx U+@꡻dKv8 uʤLVZ ) 样X)7|<[:Xʝu`IAPׯj!dJC؅yRbc l|gao¼FIdǍ/(Н)?I+$ܛ$kl*I#sjm]߂eKkR|V .74Ё F8ÉXk[PA֣$%Z*(plEBcR3U*2:"T0,>3va(*BG q#=$_l9J}x"gt{cK7MrZ]UvNyH~[Т'ZvpxU- uvAÚt 'Kލ˜-wh? gX^1c("fE\`K) )C)UtY(6aSX_LMC9ފe#JK-/P =dcc|b)kk Yj>T v=p)2-g_D@Oq.ru[zO)UZ"6  Lez-y2Rt�4`a}ِj]i%]DRங~??<nN0"sJẊqe" [Y{g':)Zd <6(X5^=�w 9 Þ[]+ZPo3'Y[` !)X_|ow~~{7/oܷ~-;b}}뾞wl/)u_u_SP\fÿ+|W+?_رo^_^mů.!/~_o5wu_u_kxu_u_u_uG#}}}u_u_u_wĺ#}}}Xu_u_u_wĺ#}}}Xu_u_u_wĺ;b}}}u_u_u_Ӽ~a_a]}]}$q:/|{u_u_q^(Գ>uo?@;b}}]c}}}u_u_u_uG}}.?_<}QO|;b}}c`ÿ|boT_nT'tW8ķ1]c}}ݗ*ϊ^wu_u_u_?J:K#}}}Tӯ;b}}ճ;b}}ׯu3/~ :k/[=^v#}}O1Dc?<{ٻ߂_F#}}}Xu_u_uG{)u_u_~~D}}}k?u_u_SSр`Q0�ӯb����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/smallbuffer.png���������������������������������������������������������000644 �000765 �000000 �00000106502 11332353405 021245� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��;�����#{���bKGD������ pHYs�� �� ����tIME. �� �IDATx{Wu~T^ݲdYln ~@xGr䐈On\2(x.&L&$!aQOr;Nd<!w+d  ,ےߖR*=ZwUluk9wkq [~B@r B!ͷ1=x;s'#B=x/?"{B C" ǏQ oڸyKQ(lO~/m޼ٳzIIO/<5q{~Q A&lO/m-�Ae_+<Oov'o#[G wOz|ۯ:B)^{kַuulbyY*'k_\sÍϜ[y̯}Fι &vmٰBp<o]x[X#맶?ȳ_۶mK{_& 9oM_ze/O魯YK_doBOFV#pl[6a}9q_| �N9)|qhvܺ~UWx|lG>[E|�'of׏];<܉|Ɨ�Ԧ?g?i'{jd;~W`8'=mɂm;ֱo+_slf܍%6VDԎ^&6MLm>GvNFFs϶ OYx#S7\esGFGxv#W�߽OW�-pWz΋6}^y|u&G 10|g޲~wtį~oQ~!zq/~_Wߘ׿"+_xGǂ?xbd{WG]|ulEoFg~>FƃMSNMltl,�#_y?WƋvnXO1W䃿U}3YL?܁{?ןO<sm^oc�3?+_pƉ :{cG}c�uϽۦ6|'N</?p'⩍妗\}|l{O~gY7[_u29\۳?yͯy'*Ǐ;?s>y?}۰^km|BXؿ_ᇡ~orB"*M[_~sx˧sheb$:2rewsϟљ?<<SQ�~cw{z֩+/ݗcq}vԶ ۾G69;{gnxszjj]{zS>{7=kګ~^ߴi/M|S'Ni�?{'v\W~-&>;|/~yoZ.ﻏ4O=`+w5/=đ'SG Ohre;oy\=YX#+:=^W$r?G�XrO Gc6?~>s.Oƛ__�O?w|_ϞŗN<oڷ}׼{7NT�4pGFFGj؆͛7Ot/T׿_vO~KO7MȆ[уmذS~O~E;/ނsx͆u ۿ?W6_õ/2˯l˦G{z۰7^]}padl\.[.x؉_>yK^h |}}h?uծK?�3' Oc >I<o$آc~C3rusX% N<٣Yw&tEa"z䳗nvn>k~[n5W�׾卌~׼O\ Tu(<ojz�O:b*?yylɳ#�Ǣpqty /9W�<x[v~x۲ym xɓ_}pKo �> FF.yGO7>o=|K.<sO<sK&v^<3Ͻk_{uNϟ?xk!]:9Ut6+<n{%̽nU ͓ 's o.x|c�{Ʒou|l-zs?qѶv3%_u)oy+'*<Dt?>6ё`eW䢍�FGsΝ;7SΞ;7TFZQ!q|//wxw�.d_uV9‰E�x_豓Ξ#c�Njضerl<0t]ڙ;n}wŇFG|0;k?荎+|gHWl`ޱ/nL}mow.+xS}{ƃm~C||?|cc\uV�_ёӋV~/dÝ՟z˫-0re[|v^?㍨8F;wXyd$i8|TsۖͿ?x/b=z];ț^sOmZջni {Sᥗl#^mٷzl]c;'?;ybxKv_|<|+FVI"hO&7~nOўGwg_SՆs\86[~_^Hr.׷nME[^pGwm<3>>񣇾J:(:sop;6ڱ=ǟ;vS_ӕMeW�S?>iGM_߿+fO࣏>7x#x_m<CQ_C/lk_8o43`b{v}k|뷼ΟЌ^|U_,<탏>ѱq]O=~k\Pk'*O~+0‰yu玝]]ebxndṭWej3_fmۨBNJ\7~g׵Nlc=3~pw7y>uܹ'N<p|//=}sgΜ=u&7lW>@<~E\lJ!=o _6<uLƈuo2:Aз=䶝/w ` ^i~p6]ts?tщM[\3=H<=22:iԱ^tE?Ë'={?5WodظO<<}ѱyu7q9>œ gϞ *5O?ox6j>#D##ĆM[w# ϝ8mtu6BgLZE;_LoozI7r7c݅gKcY|nĩ>oH.FGott+8ydN񎌌M^|g=x7jl`̯lںcddtdtll<*�`bddԯL�qebx8FFFGQ?�:M^|Ye&s/tltq%6MW8Rx0bSYilzMn|ѧ}\O}kc獌nvxa</F<jNڼ.'6{##qo<wvtlnԶKGFƼVG|E;Ο?7::fN2c>˶Z_Sm艎km,_Ayg?pz릱=oe;س53ggNW6XdLl׳M[[[ƃ䶝_l󆩋/[.Im(q_aj{'=_^ {{Nzodѱ [xPTr yE_!dpXk z9Ο;;222۴`]e'!kyz㖃 D-=H7]~ؘK02=BȚ”oȺ Q:bku'm䧙EkbC0aQ,cc>'J!dp4X w|]B!û>xgk! ({;vD!Y[hcBXBXBBBbB!T,B!T,B!- 歅%'te\/f6tVy ~V۞Mvv%Jƍ\ͮnmnu7z9jsn_@TI󦦦:( WNޤt΀|s^>={X>tWTή&E|V90gcKl"âS^]7[{hr?vzVNyowYX=Kw9Ep쒄!+Jc0l+x#]}nt|L,Os7nm?r[muoig=9Wyofɽz7_^ɽby Wc%#CQW9>$}=DZUx,". :30Ǻ_ZGڃUV6 hߗEԇhz5㝿9-hE=oho>f]ꔜkmҭW5霾|No|ɮ_]p;pVݢȔn<A0V^cf ,ݞ%vZy0PVrtu>"+ɽ*SvJw{<ΌޥVwLߚ5S2hlZuj;u7ȏm`Zҟ\"7W֫c]zhe= u%VhzcBϞ% (FlsJNqy~Ek3֛V5w;zз\be콛|?}b AL1=l&]׎m4u䱃24B3lXA *! RcG"Zʹ! T,B!T,B!E!E!P!*!Mz,BhkB!X+B!ܷo;B 099ޑocB!CccBX${^v! R :sss59pBm,B6ۋ0 2.X*]wvT<}dsh=qnM6tڹJ;/RȖKW~ Vz v ndpG=Z-kcјxϗU{_r>垧h\=ӻ?[hSnIxy%/x^൐{-$WG=H#s/ی=ޗ;s"}roP6r#;Vbl5B_%@"[ɹ;u5DL,yk#mNe߈ (@k*5�oPHOTfï ~r*!MA5 ~QQ03~!"ik9Ւx buA5ͩh ɋ Po"4 w'W;gF8A56G3?׀}#]s{ehs�jQsY>)Jշ*#hnzh7{z TU™-\U2 ́浜'Eq-IKƇ ?TҞk &`6tH.݄55Rt;P}j* zD^ҕ+VF:+ڡQ;_͑+ J*V?#~1;ncp/C|1la]6|9gb]76|s1rX1 ~XW'z)z# ޜGTSHbk`PKuH/n4җ?`{3jSoN%`ǣ՘YxGw祊Wӷf)Ē)h95ȴN"^lʏg_˘- 31GF5])EM 2g0R$me^q-LWpɯ"jeRǣ rH yWj% C2%Hm21cm-Z-:0�3úSI)oqቢԢ`62-Ѻ%O\K?)Wr(EK1mꉶU;/ڶrtd<CW<H@;Ʋte̼+UbOψAPK̎9`4Tz&)&1 EPz^#5*jyPb"xes%z.l}JLZzAX0kt,YIӥ#rk'�pVQ_WSa~rՑZO~DI9+Nk)6S%݇yT5[s&/E"fZZ͆o4RSjaf ~вj59q Z:fgr{kgJ4fh#0wc%|dlC;mrorfI^2fe`eOtҺ%Wh;t$ `f;;07|( #9WG\0 5[ηL$X\bu}"̋HT 1muh{ƿ']* Q"ڴ{ !d Xn(Qs qWA&c:^2Za{h^A?q A5 J-˩y-sHPJ_3s5>:OOGz@+HD^˟VDܚt6D`^A_rzX 'Yg P>jKV8(Ռ(XT .[j Za/Ȭ NӉXT-#&p.>cR -h=q ^=ӍO&)SXd@Yc(]fV:AUl~Q:@xkfp<j_+jѕǘ 6�ǚ>Gw5X6))/I/}/zM{_FmzB04!CmfUH(Apu �ĉaR%4xA&ɂjy/vՓTjMqEf#?پ\5Kpin6NndҚ?C9L&L`HPX F+F o&W;r DȈ_#]0AFzx<m16|4WxmAXVTvekv#>'QF+Y֘q}wTF&%V6Y6J#Z5*V(IBL/dne]5rdYñN͠&D%hC†oLWkDQk5/V8u-q Ol".Fh E;i!$!Bn8>@;3PvgݚXTh1ݒӉl& Nf-WSeN$Z0R$wglO|8UaNSX}VBܒ&_K2P&]2T`FFiyZd/y`^YL~ɵDҒ '(ڦ@uӫܮ$?|d !؃Dߚ5ۄJ :;+3EZ0 4u2lOz qN%f:$Ok\$W zn'e#XPrB:R�� �IDAT99PH0Fݬ f|X==�FF0 wMRP2s pc1$2Jkސ^N8 eڥ]`I 6+s5nnc%K/k#:xBVLI-]m[H`m[ {'u"SOc0*†ͤtf"NJkS)/l/C4Z`nN"]LU 1: uL3+[G;_n'KRk1(~M;eY3RSCH3%mz^8Flfհw70ݝ,RD[XwdY%kӷf}V{qZ~3Z+WzE1r_[Iݍ PƬEMIv2v 7kDmu ktN"5'qyo{<ηޭdďkI }VIbKs9|NQV"a.܅ks;td-6бHVexBmdVa=M ٵIP;=0KlfhI"m%JZE:۬ȃNPVu`]^PkLy`+YT2R'úXq'wD^ne%fco=!2VgT)kЬj։Ѱx{=*cuhfݩ/!)=�S\$<{-mQNn驄F\ Dq4e\YJfenbc@ŻG<PӠ5_IDZBX[Z9J7(s~Hq)&:f >v;9~úՓE+&T88U# NIuGn_}9gSeŲJ4aɽ6,"OȲl,+:y-2Ve֓ M q%c[|'HLpT=)foRKtSOBϐ%Y0T$2"~lmٳIQYhL!hZn֏TɵN D,gђ[ZE/37MP}{ܐӂ'CXNlD_*T3ixCG?tbWibjt+E-)i2'\:FPbDbZ<nK%ɢ;j^cZV\YӾrtH[nblyST43//LSLw #[@OHŠkcȊ\5K)#ذ.ݖa1UP2dFJ2%>0*ە*NCLY%.Dӥ%ٕ ٲrUeJEFܾwhs(?6fOHG+7w56Բ_5&Mmo&45Ln|Z9ZmrKxBɥ7yij(-t2PXnJJlT쬀άv],," ƒ|P rf}t 4 $jiAY$ɍeXU.'W8NC8!`/8p 0`U 1eaNJGF˵RTJ^Y :g!Ît4ּe$4: >Fl0YUCA-|^ T|77ц=Z{U0nF�؍L'*uŝ0sc,ډDpdL5e߶b1&60 Ui=5ҔI=( ǘO77(UIu=;e 1 | �x`R} Ϛt-m5*P,'@,J!K X]gnn@p*HbU#Q*KȒ"R^˔g4H^@=](5ADs3󊪙)@0+Bƒxkș I#QXZmXT*P[`_Xᢂq@d{^+(5J\H!nnt(٣ح[Z8*S;FdݼFd]x8<1 0eúf}[ l 6ϒL-Hz,lŚv6/R %۷@ q! H}<Xd'5TS o).< 4i`4WIM*ix(A#-b�[o y|M@d5#lYO2[ٻisѨČb;N ڮMI&ş^q54i�Q2UkXq+ʱ8qU z�1< %�͢V=|Zz&҂N$P@mB=@ᣑ^ԭ`F+AyE [ňefZ WP\tyHy bQ>般9dٌ\%v]_X~Ic=])KH�.x"754뉓SDI(LYM w!dmK"LiuED Pa0fxt]T|#I$yuu.yiHE܃pޚw6I7 A-OӶhץFUE!:Z)ajc/†|*/ljhŜ'F""`ұlYu7Yn`7dUPLJi A_XtQt$fk]\m b7hIQ%dtiY+%ZM79f`6dp6wF؛ ܪy?JTri{(׵Њ!47 ;^bdyw7�w[|_Kr~)I*hք%SkYd$tI\/~inSי\,m,j!d f» TLA5Jy`q ,jyfo=![jP!ZzdB- jzʁ?�w�WDѦiQEթe*)s(J2^2-HIYܑha"B15Z@> a2"דr!&׀WG8cڔx663Ifq,cd,V`7.!�ĖJr5=5%b#¦uv}DB0PnγKp6 Jw:;!tݰj[CY!+c̕d2V�/�C&TrT~:]-t3_Qf2+7<0䖙ZC6h8�M3v[Vft'Ke^R @$فNgrVԯ/ˊ_UwHj+F# G#NV؂(P -QY/ d g|E0'y3~R+ $t֟Y "PlSEQ:R1I'뱤`mg2Т Vx !z2+a3*q툸\554 $IW4[١jZ+$5 8%"\VDVF4ƽֽ֚s:bcYOoM4BVR *4NsȘ %]cUųv@I�aeiDqrˆ3:LGz噔v^OBV[kA5V}(M0ɯ+֒kQ12+dQ&39%mwb>a8�BBѶv]KO5J 0diMԙ(oicKatNhz+_T}zYl\ 3FRhm,BbEGd�oMYcLhIȌ{-R6z6b;Ge&$ZݥHiLFCܣDDz.ݼjYF#|BDOhl=i4UJQ{p&)4e F"�Fmjx6 ?n75�H\^f'RQDIh&<7Za#܈lnXm,jú,ȝOL( -⦲"Tb+3ً̍<e2:#JA=UdY֘YO>[1ue|zpK3bBHtJ<{Bk>M7z3MN, u)tOo f#]L kZ ڎz6˚ QT,BY%}7M'sEb@$U-w6dQT֍,C^ZKĪ,f*)7r*W%$lnE4,) a}377N dбf H1eWnk5L n]9ic4qK[h\ oY2 gd+wkkcaBB΢ 0HdI͚i*(0†y4PIEyw()X@n.ϨZzҪ(\ ?P:ïL,4 u~^'S2ط;LgT>~vB 4ҕ,QJ \=]ՃkUXc,H> 3Ɯ1n! 3zd2knd[&953(wjz&r1> >AÊ [~EfEP͸´*WnlضHQaC+!ē/CNa2ތJ,'IdP�M蘆DQP 2M4L |nx*gnnn@ԂhPD+4A'8R@ȎȘ>u[ ~SYZ͎' ?+ʹn-Eh6IZQnA +mY6q=P`5AMD J%xknɍ߳"sg4 I!U>7liyId JL:Zˊ6C/Aq~/eݗ]f?UmA+^#$Ef19drFn9U*. f"oYeM3K]3ʓ:׭dxKeW%6X;cEXGr &juGw)z(E}h:uI;7]#[M+;hKń3H.ZE0]YGQ&G&RC:DMv 3[ג艤V&|5`N8ɟllA-2,qVX-ҙw(C_I\;oX*U4|L#`/+;x\ɩgli(B^gwlcN7Xƚ'Ph˼LɠUQZbi IHԄZ{<()R_#m$] [kLZd%uŠ_wɣ~Xd<ֲzle]>!")%< N[(gϭ 7%y$ݱ(8L3&?464㻙3MI$q")82Qmwf"/}ReVfi*9p6zCdjNKOqZ9I^)-liGm~7\K(S3Л8*sV|za, 2A,d5Y}*>w+�ij^X^Vwz6ز>K~,Co5=zzL}͒6 rvanlWam$E<S=7xz5ɧOk2X�BwFf^x�ΎZ;ev{Os�8 I/B�}KU+rK34k.g=MeUillDo$xLd' ?󽬱y0f٢<C�=0}RiSiEE+qaI\2e^] 1<ѬX5}fS=ɦ [^a|]!al, Y$akԼ32K9f]0CFEe 6kZMU}tR.KK .Z~Tѻ+V~=? "E^AI0ek]e*WDQ9+<t(5©!|ke1 ]\*# S%퍸eyIdwo\uWh9=tY{ZY'䩆Moj =R7c:)H(qwp-bfOZZ~AGD]Y &M PjWZʽ+O8NDtF |-̯%m6Kn̝d^KKNJK#3VЍ+~^+k<or@Dfm3IdnR홪?}ܕOR"D{ Z&,Ș!҄WMlŦjFnI+ar9~S t7=L:/bwcBX6q+y9&$1ylV Y4~2huT _k'n"^PPx(OYTM{DLU< ZAA*z*!,_ÚwqҚ?sƊym,mifՂgYOZl(uB0F"=1X</BrpwUs+cKn t&d5A52E(j$/9S2/RESRm�ƆZdR]:,tD  n86]ȭJH-)҉ymOr@4FV�eHZ,5ߥ`~.*a=SLb V"C=&Qn{7-Ho+FX(U/[1 _Gˉvq KH?6yr3I7�>gU~fo3߿P¾}lV V֘nB E*_b'>[DȔ/AAl+h['FrBͷ ?F؋p&¬;Zz? D}xӟ<ު7 I+ j6&Ҙz*\%inʘn[a ,m8Zrh$:"i@˻7! @dtk#K_tT,~Q >@έ/l ?nXEq$cN|88M,Z%ҰլrYdciR 4M>F8k殼FRMȸ HlV"Vz* $+%cINcKS(vIhev@vŕ^)3N* �*M.}WwT?Aq B'Wp(ۭa(T:)],:\0NL܆yg(*jl]B'Z4dC**V[Fej ;[}J`$כ-YY?/k7kcS.?jS @  ɖ²ur[Vp.EN07aX$ZɂZ&ÐDvH^% YL }[H*+n Zt>kǺZ .t$*7\//`Tƕ.4䷿NqsZ~V#}(\pZ{5GeVvݴH5н #N:qoNhLr ɴkNisʸQX-+w*+SA#u = Z62jW侒;N[#*D9'˰+=k2m:ΌL%XƞԀDdUNGaO"  tf 2++)B:bn t`:QV|K}s 9֐Qв (N'$VȻ 2-Tґa7FܝWXNQ]\)RrWP {Y`͊\'EV\Mb tur]2W~r-KH>fJey`e&pJVkzMi(I~(a-'4+MѻN˕+jjbG'mv#{P@r \0ՓOg`͸o2"o2&7rU+ci{e2 8VvZ!I~ȁ&Ǯh*5# ߫gjr#/Qb-- 3c \wNHUWɭ!Rdru%֌kt'173ɼ-R ي$j5{%3q̢�� �IDAT޾Vdmv宁!gI‡dIܴ~m12,Β $JВ  6|n֞;Je*bbn\FՒ(^'M:P'rc^%W\4+q5u;P`M\JRI-uEE~n"ykvlH:PhDu_8U4a@l97`<foc%w(}\͖t!XgƵ3HWo1Yz*2NweL50Z'4hkR� L[ RY<@vw+{;Ԣ.Fx!dnvZkww +)DUo٨3r[~9!ˈ,)KcDWbةi3QԦH"HW]Ţ/2z-*XrNwSnx,c24bٞkĘtN0FtCDk\NJS̲~KGܲaP,^"+wv-viܘ%JE"FKzY;'J>ר̙0m5:9ݹ7#c\TY$*;5%w7PDd%i&0BԒJRkI+Ky2kRjIΝ-[bV"ÅhipQ ׼@6KlhnB-̻8..lMXu~?)G4B~YpY ӲP6V?ٿ?;} ]eK2#6bF幱yy)!Њ Ѻ䞘X֘?ned%fٕX>b=Ѐ?~68/B['(X_X&ZGQ\Ԓ,{hm6Ϩ]mT-ME52ٵ��'z&'J0777 j4$lȫШن$/N3D{J ~5?8E@.;%0jpn\51+r%:B{}[䒌I!Eñ[懬.I[+[}'<H/}?1%hеlt�|lGW*Q!EDY@F" pu兀$w.*>qHT ,6dEX"0j3W 魛2r;e ؒW链jsQ՟$={u>a<o: а<{l8os˚ 1eFF+9e*#ul!,:PXr ^Un%=}eY'W iܢZz7pQSKh`SG^d7`XrS֗[lbwC2CEFd'9D�cIr/ڃJ~^P3Z,1%GE3DT 3U`ԾAn7}זN.'7{Z;]<{nR(1wiV2?d8X֯?KÆ'�u(@_|@t,e5/w-"7ct+)Iw&O5+EV{tN?60wax+WI@+U;,͸S*5~kp͟nDJ#7�Ϣ]YHIrk&Wo3Ze:ieJԁ$P ̩>c-7%V}p~R ;H_aW4C LueE%bV(P3CZDK$2,dM+I3J"s(迻ek \ d: ? \hrGdܡ#P˃5˿Vƍ˵rs�V(B:lJu䖸쑍ՎE,-K ˫3퐚?)rPߑH?K)gQ%*wb+Ivn"^^a}-vlչwm,-3iݑBAb:<%7_{lYT=dh^q-1rUekUB@\nUSNqO%Blt>r}zn|�iX) ɀe hp&=l'5P-Yr@Ir9^¹N:X岼Fl-l6|BQ"ڠ\K`ͶҴk5MؙvbtqB G܁X/i[nJv[bl Zu`\Ig5ƟQ"VP.#J}ɅlEYO B!q%2F YR,ciH)Jkyti̸Lr,QnxKKN;B.4<rPaֻE9P^LEu}SdC)ʞFHJ"J,ٳlM3E+B9%^cu9vR3R`+[(!:];NP`2Gl5i\cg0igk701XUnpa/7;w-C\bԑ^*ޚ @0N${,dg9v֘H5 %۷hЅHn VvF(6YqCa\vBj۳hO="Z T,~X^hPߘGPHȒUr]v4*U\MJj*-@F,|A55Ew.mY9pXQ >@j`ŭ؄ܲXvYIwЪ y&yu)6o Z jԭMoTy=! 23�[VBQ ]YHVIkV=' E b XƟ@B24;lpZ/ M^ɕɨLJj| 3 ӧCJbۉA/n/"  ]w}cWwe٧yS=tKz{H En>(Obֵ Q;8͌VV$4WӜL:xqӻKX PFeU wQIi!˰KnhV{-C 8XWVKlieUZ$^[X5r"cF~G*l5uٍHtr'Jo +$kv~vӵ%kxnȕoAVIWR�!ؚgqn=mf$-%ȵo:US]#Xɽ[1"c`rνXKv]Е6W~S2O]ƕ1#uj$)r#E˛r3A)\˹5r(q#&$nM5C+9eL/"v %Bʭ46jë턬F†/!Ɵ LP}[YQj(ALa,=h9>ɍ?S Pl锾u I\)k@iv˲rm !K ~ ;θˬ5LVR $uU'wy0uD ZO6'Ӷ(EZY͵JL,M-/o}nءLu`e{_oOj$u І ?3m$�j o-{µԡG䕸 d=JAJIub"Abw(LO+|k~_ ruKt-ADg#rPp5pºԒkUL j0F!7NZ*F^U&u-&XgĈ,ZA(,m-itt K|={ƫ%}l^iֆ~͹|GKmm?gq<`XP~ 5, ۢ:b1u΅8ދXS%wk齻m(yK,O(hK7pYSz8P�mzpk LX +$]XtLCt}1?n;*BX}|@*֠C8!#!ᴱ&'')B@N!20l)T}{! 9 %%ؼ%/ŅAk5~fnnN̻o NKy ?99)]4}5_ ̓$B*!*!B"r,M|1�u5diO/6PuGn֚Xݓpe~[ϯ_㠰&;\s86l*2{r% vE_ե1ݢ۠[{dݎ-jvg/: ?f|l=]z| %__S]y,XUMnovs?7&N7aeIXn~ɯܓjcN'ǯrӥL|0)om_+n|U۹hE^RrֲnA1tOm '5.Oݾ<7Ki{.F^}lWߌnkAų⑫e] C>-C4܍ @F:(L Xa}oUɤl;BWi@н=M&<4KO/hX\s>σG [W<wHW]{rD|ݸ0_n7oi(S-7{> Rg+=Ys7tA{UUVnZOW'|c/;je,osٗyN}Y]NV*fi"=ZdbBm 3 !-2]JBp@"2{ئ^}0[2sd_ovwӞw~O,0yt߾}qB!3]cbԑ Br5#>vi;հatJz�tx? l9oөYBr[.sss`\ٺ}6l<ғեa`y;ގ@ !ညE!E!P!\hټ+bi%lօ:+T+n璇 iJNCy?{;-_cʯ m,!-}y?C};nk6m,鎒%K__XE]{fv彴;r3\->_s;ˇؿk26Vmp풿S,[Y*ѱ_Xz]*5})z|:kdVh wz=k~ ~eT>!F>U~V9@G{?ݐ+oDGr/}awGa-|}>5OP#5Y<l_lyIswBχqivzۯ@(V7+G=a,<jXy~wɖܳO)ny"/{;%G 7Kb-G^>ZJvmѵ omyݘv˻Л>]·v7_ &2P!P!*!*!2 u=[Oz&''0]ʖ弝 v=x;3OXa}(B�x4u䱃ؚ!mlڿ?;BP{! 򚱂B*!*!B"B"BXBBBbB!T,B!T,B!E!P!P!*!B"B"BXBXBBbBbB!T,B!E!E!P!*!*!B"BXBXBBBbB!T,B!T,B!E!P!P!*!B"B"BXBBBbBbB!T,B!E!E!P!*!*!B"BXBXBBbBbB!T,B!T,B!E!P!P!*!B"B"BXBBBbB!T,B!T,B!E!E!P!*!*!B"BXBXBBbBbB!T,B!E!E!P!P!*!B"B"BXBBBbB!T,B!T,B!E!P!P!*!*!B"BXBXBBbBbB!T,B!E!E!P!*!*!B"B"BXBBBbB!T,B!T,B!E!P!P!*!B"B"BXBBBbBbB!T,B!E!E!P!*!*!B"BXBXBBbBbB!T,B!T,B!E!P!P!*!B"B"BXBBBb <<{ dyڼ`u6EžHu9id5#vo'yU_O FYnD?EHT55PATA% oPyj< k$3<aFa7qA526ӄ/l7-g[>�9Fq^^==ܜS) "r\, H{d790K5'PiKvk׀3˞FDj$9IT3'4rŵA-�D;O% O#"Mld\׀QK?(i7(e<ے.%EH[6e mpȋNdu}`FGk#&&V1& 멙eVyoN)m7R= WnKȟFX &EJK'q38uBFigG8Z*?-cNPDjkԢ&|c]ӴA/kxuL%EH[TtmiYSSzOk& ZՁ6G-ez* "mt:9<QZF%Zkg9E*ºԒZNB7h>M^=6#E2pgĎ,'=lbi *'Ӫ%A-1;ZdxfJ$d#jQXOkW%1JLT]̜\uksDO4Q)1jm!T,B2(kM@%Nz6cj> LQTZgv6#Qag|-25ʧl\ojƴQvsPP錱tudɼkH)f\j e2yCWvYη3CaÏkd˜*:c>jaBQߋbMZn6IKB"]K5Šdg%⮂(MtYep'f,Ti̩̬R޲$AM4ɫk�{=3X?c%^ mc? 5(m*!+3�mlYQmz,Kufd]:۲䴳.U5`{Daվ2v(k8k_Uq"Ok鞮cP_Q*!˳EQ+rz"<f dz qf 剼io&O,d,'-<ːJy5X6))/,;M%d4?}E*- ,037;|̘81Nd|},ܠAV}-IԸ H/Z[Z}m PKF{ДI>fZBX,2Ɛ h&,*Kkat)k†n/;\|q&UhAYDzIld-Ͳh(k[O)`9%ĚE#dpc4Ҝy.;-ɲ �Thbe+DE^=&W!��@ ~\zgX#kꑘbeZsJ�� �IDATlT~Ks%0q f(, E2+ˣ`ִ;K]^:CI_^OLIC2cj:ǠesJ3:3Sz<V`n']NRLuXPYfn-YX`,Ϙdf4w9+r΄dlIK$?JkEJ ]y>BX,J+Zs5ȴ VYbeB!(5jQ*W4$nЬ&䂚N=)"+uiuMLhD,UJ!7;!T,B@{  1H2A-_h sz ɂd>S'ږb@Z6b][d6$6b<emkvq.!R*CJ(<P7&9^ĵTqb5\ڽڂaup`vuG$NU3\B"d%):FN,<K6wFf=(QA5 fDZ32ZY'(SjsIԒK33?!/aE"V KLYk92NV%| NFֲZ3Tz[!J#ZiNltsY*τPYR *U#rIy=u%Cv-4<ųD$bjA5)+)%fYb&y jѪj)/,];&Fhd?EHHt_n1b'*ԹnEYm9 ?M,ڝjxZFrlZ%.^XQt-"oe\JfN<!T,BR3 scmiQږB7ɠ�܌d򲛠$*PI6l c+^=I{QtbB3I[=P~U=R,C坦-J4vB"dk\XE2o$Ar&|N }GDK GՓb&{㌏'gt.ZphIK0a/FDi (l+)l/hZn]R ySP)Cw�c9Ʋq7vO8VX_?|SLCF+nPr&ZR 콙\]H #8*qdH <CǴ]1fЯӾrtH[n"!T,B*H/lCz@b)4%񄻀Cw[t2gPO5W׫d)6ߔ<~<¨,nW; 3fQD#;Kg!])cMDZJP)-=Nr.k3moo-@6KL!:O>uW ҄F`ldhvj4DVouD#jrI/ϓ $EH[h[J *BAJ&uI&AIzkq,{Ҟ=QG76O$VB&a/8p 0`U QrB7V$B.Jޒ(qCJ b t\OǕ,g: ^c\CA-2d\zV2Pp{DfT\xu�n5`:-U++IpLNleG^xلʖfezED\ )IMFԑXt$G ZHIB5 8δI ;рꮁ6q$$5ȢAvXk}{$gǎ#o{׻~�x؊v'{Ǵ.c$WNV͸+xQZ%cz ~`Ýk{U3yW_O<Y3 ),~y5$Ps%#B(J"=w?Rz"V|1]yԄb ClPO=4O˔ ׅ`[JȌؚh̻6|0014 j k..p)!^ y{K>$j܏qMi[-!irw'yUBX& MDr2q@MERhɾ毘Ή<MjX2b,X�WO4Hަ1?!a}W!mK`KIqGm7Np/Ѝak5 keDv'mJWaVk�n+xμG�ϱQlt<؃$3Em$<L6lOvcÍ>lm?p6b:⤺ӂasix]WQ^f?}~j\fLN7 cM NT#ueu j,KkXBMna1j{EH|Ipٵ?c[0.wZ<f_Ev`qx{feGzdžڶϣNڭ_K:*�xMF1QNnrD;mAWq?w-,v'{;bgagz$yl7{ώ?>cqlP uNqWTMuC@@�>tʕOB_v<7 >VD(b=m{mkmO! iz[ų;$JN޲+?lOߌq]hB3%~Ie ` #mۈZN)""XKzswWa}q޼<޷t=]n̦^i8Ŀ=yh ;no5?1{w<~m`fwvڟYGyRվ(Ѝi*?q <6Pc\F0n]B.Muc7f6ld~ľ[fUG1muhuh653ٽmBEn_#cWnRWEf3 ôi Lb|2kL F4=Â=W{;ޮy|쿛Ib;\NiHXB"Ve5b7ϵalެ6_wU<MuȻd^WP,ai{z<) u7Z@/%T;}'O[X52%V_6A܊15{_pR6k�|jdVѦہ1IGX�WJ3?:sk=gdxEٞK3m_o|)@ayyKYxB}{;ޮ۬,IxjQ!ԛM&\b&9RrP]Tlyf-8/X3KZxd,~jNZ'UaA,Z6ÛoW~un=ޮY [hx8Pj$MT,Wk@|*cug΋ɐ�X� V1 $ 6s3ĞG? ; wСO*9bhXY\Guw _NK+�ܬ^XMSZ3l b\$Wu{hue˱mݩTO4^u z;t>Υn[{QSBT<b]_icy6577~بe _k�pǣu{R?6IЙ2{swmE=CWaJ 49;>b4W:^( ܺ%tcz@�.l1?Pɽf6,~΅(lmo=nlgn\5jcVN0}ά#] wo1VrNf|Z.f>"jw2/�*vqn Ѝ0dE9)Pg*FX!y֫ITMkJa V\I1*m|NT]"jrp$p]kQB4օ<c\ v^e}S5A&UH+i˯(˴ JmR-Dni*d7+ z&5X�WXUywSQ2_2Go0zU]WUVOUaIBۺcu0ՑjFP,{Q3 g]"40pr]^7q5?.߅—\~JKo6{Z̩sR߽Uv,Ҿ]\i @�Cm4Nv3"|nb}Bs=Rw̑+_m$.F4pF:lwJSt qM/n'KQ-c;uaP,+A5jtm4Ҧ}as q_UnE1n U(\F6ЏVw+׽—?jnrq.,@�@b쩻:^+}v<\]ZJfE?T/ 9.nvrRs7b\A(S _ǢV(U_V9 5LPmê3p8$\/hfvG[kk{b\σ`LWs]jռڍd&x^wbn!1 G%vܩl(}5eϴ{g%_*WMvײ5.C+(lv'/8b3d'p<t*jّӱ^Qa01{bM] (Sj#W{ż%˦3Rm$<ժt䃏\+5* :I4n&/ #V Px rws.vmVvMW&8[oNRm ;UUP,KlPֺ\Vw"^Vuu7fRmL]Z#ueҦJnwai'oFh(nv˩8C%Gɜz w#�P,esb N`O"nO*U#+vvy%G1]w7XHYB{ّRMۀ^h6p)}4CwFza2Nv4 >Tl'tnӾݾPv^f{Zcf6M.#]UO_KL� )h̹d},*TӸH/#妑"*c%SR +-5%b2xܲ"}[:NNjЯԂX�K$U^d$u)ʗ"J4E>ub Է IEږI=4J}itt%WqK=<-@� *]d6]U>heH\dU</=/Oޒeo vZL*-Q꾊@¤FUUkuj@�.U)ޕ1݇x<tjI>uW Q\3ɚCuɧDZNOҧ1'=9m jIMWުk/ڵkS 2C$�cuΦSkgqU{doa$ p:/)wudvɭ/j,@�:_mo:x]jѧ܏})?O@yގThI47Xw<QEe]=,&;%x:^ [M9ϛ2W<iRai'jXjZ*9~B-j7b(-*E2]ކ;)Vl&�XBk}r}KMY`JT˨ojaf1)P*vm2HO9X"Liݓ}??Xv@�A|WC~ OcXiCjEw4)z7ۖPXشƕ dj�_!S}_09y;+(unPjt6UE[abw{q(\ 48*k! r<xdW~ًv,dB@�=!QUa|rUC_iqfU?71I)nCMjss]idv6wdw[?nSf_b\!ZZs1;45F}j)_+ԦSөB8bm GXRaZK"3Xn*>ak>7Ma~5޲Fd0_gfw_̩�( ] 4f?q\-jFfR 5I/%zmuNGMUҭM9LR|θ1{V7w-^~Ͼ}Ztu�X�@RHDm1[ґV>.5L^,W AJmu=޶(bw(ʎXn2P,+n!RP!̔dֽtcLgw[j.jzUu(eݩ*fFJ덈X�Oq~\y:*ew->Dװz=s{uNuJmT �(̍ǭ 7mGtlT$]jr-XzfdyO:BuJñ.X�n8z+Z)|NzI.̪E?-|JE'd$埒/-,f"c| HVR>%η:#[$鞓dA~S{um-v -X[< fvs:ÝnIj,+k,5VhT;Bhy::& zN6h7_dFatJLa6kx 6:xhC#]�(#eְgvZ7)Zl%!c|*mpTuU©^&qi}iޡ넫mvm&r%�1} N;3KRįuGVsDx:%S-Bc.+| ]qyöH[K/�P,Kp[TWݲ`aZ~ikp*4=qqQ vEM7LŽvK_땖l=o%xXGuSnjb\K͕"&h^mU*l+xXxߐwjvԘ;u7&vTݹOm;jLHTMM Rbo&Gߒ]!Q}<MZ͛ZKЈT�Vo/[~H?W(?j]VuIUdNRU괗܌)iomTSjx69y K.sk�(e3M`:Yj`}jwŐ]sM:>P/7DN7Za'f1d/ m u :lUXsAK]{[Vm~^jFV\v*f^/lO @�.Z ]Ҥݹ9-""zi#MwT|tK{QݲL.c-B�P,X/)j8%_7#& =WFohD(4%#d3 ʔG;H\@�.AGvQBiJJJtp%6Ƒiƒ(9ą i,%vP,+D;t{dŞ\5]sKȒW5Wcx%=쫊Wy؝r[�}w{"ų8iƚL�$q'ђ.<65- վBf}6iK.�tԜh@s3[Lu]SB\FFu-?p?w*ZuʤV!Wb|4 RO~RU!ˎ* 2?2)đ*]3  ipzaWI$(E>f_YoJV-S#%cB"Q?ϧkP_后:Ǥҧ)^l�@� � oKzM4qVU])Js3!FJvabGpx PÖ[Oܱ3-s@b57"YuHKϚήN Y([P,j,Ԧ+Z*.mSy1|wQzbna؊MgtYYTa@(5\nfnҼ5(�� IDATnMw+q݊R<1p24O$*MTZx-, K�P,~5UxwKIc#l?8gӊkSWBitE1^U"|vM}}FƠdW#I\9\puUƵz]VWo%b[R]T�paM&$<!tNqRS&N"b\A]O1S̴FM['Tyk>uUݐHe+z:ts`�bH_-ysj>b[;OOH*h=ι5VU]Lwʏ P,`kժ[+/1<TJI;'R'VS Yޙ$ht7= .N,@� ;H­JnYf K婽"]aX0lJKXPnf3YVI˪�(5Oij8}GKSZf?* V52tJE+oݚIU֋? ލ9[sM&摅 �X/ �\g[[aݎPWBJmj+jpT]Y 2f,�}~;ee3׵ftM:lvFKΪ ^v$KouE-ݥQV|F8en5]0R:@euu4[T/tFHT<LŸl;e1T P,XQ^$\$J£G=d*kwi>ąŦTJjţaM/o`fn+XڌwXb< ˕]U/ɾֆZ5wv.#cꨚӈ|/~B�(55ݏyXQe=,K)n<*|^]0wuΤSR)-1u* 6*gP,+k.Pʑ:7Qũs#>Z'vH[ v+ƕ6fXZve�EF{fgܘ 8'Hmwz}5֫FzG.6V¹N_ra#�8/ٍamErgXKciLW }Jis2Н!9mH ᣕвo�b\Tc6pgmkNfTb U3bUD 7u1S""gyynJ$W- Y؍%A@�# r٫qLo.iGm ɍش5Jw,Rˣ_.do¶7g=\u0S`hEݨKNUuz>TE{LwI 8gt>Q q:bϵ`#Zb\ɻiڛ )ՙ[]7QHx=OLkҎsDTkeX�i1E:,Oz<c0ʈJ6ͷT3Ywy0-<M)N:OD ղR} Lv*EaV�P,+pj!C* CAU6OzG> c}2W8m^6*k$<UI_w r"Jb<(84=yҳxd6I0T-y6ўNeeMSb"7JpnR Y5"D )H(JJOd?f/{vܯ7s*IbEm:\ԡ.-%f{ZsT\bE\q*uWS9@�R1N9g;gcC$a[H;B[Gq6MZKTA؊eQG,!Ц)<g¼fO79gFLߚa$釛oIOa/}-t@��b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X���(�����(�����b����b��X��b��X���(��X���(��X|��b��X��b��X���(��X���(�����(�����b����b��X��b��X��b��X���(��X���(�����(�����b����b��X��b��X��b��X���(��X���(�����(�����0jŇ��ρa+s?OɧGO/c}>V6Ogu5N_OV%7x-?̟9V�5�� ����� �����@�����@���P,��@���P,��� ��P,��� ����� ����� ��yy|h!;x0,)V5��|\V1NuKdU��^P,�Ovc|',b��5�����(�����T#��$XVߺ?y#sX��S>u o$7J*�2?㺩av* �SQ^F2(��r] �\-|�@^P,��x=�IY[T`k$nsX��ȃvos*��(��X���(��X���ϑ+/o~�� v+��9X?Y��sf5 OW ��9긁����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/user/binning/thread.xml��������������������������������������������������������������000644 �000765 �000000 �00000025306 11222161077 020230� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="us-ascii" ?> <!DOCTYPE thread> <thread> <info> <name>binning</name> <version>June 2009</version> <title> <long>Binning and Filtering FITS Event Files</long> </title> <history> <entry day="26" month="June" year="9" who="liz"> Original version </entry> </history> </info> <text> <overview> <synopsis> <p> When an x-ray event file is loaded, ds9 makes a virtual image for display by binning on one or more axes. This threads describes how to adjust the binning and buffer sizes. Interactive data filtering is described, as well as binning in three dimensions. </p> <p> Note that the terms "binning" and "blocking" are used interchangeably in this thread. They both refer to combining pixels in an image. </p> </synopsis> </overview> <sectionlist> <section id="start"> <title>Getting Started</title> <p> This thread begins with Chandra data from an observation of the Antennae Galaxies (NGC 4038/NGC 4039, ObsID 315). Open the file in ds9: </p> <screen> unix% ds9 acisf00315N002_evt2.fits &amp; </screen> <p> A small section of the data is visible when the file is loaded, as shown in <figlink id="defaults"/>. The target of the observation is partially visible in the display frame. </p> <figure id="defaults"> <title>Data loaded with default buffer and bin size</title> <description>The target sources of the observation are partially visible at the bottom of the frame.</description> <bitmap format="png">defaults.png</bitmap> </figure> <p> By default, the buffer size is set to 1024x1024 and the binning factor is set to 1. These values will be adjusted in the following sections to illustrate how to make more of the data visible. </p> <p> The "Bin" menu, shown in <figlink id="binmenu"/>, will be used to change the setting in the following examples. From top to bottom, this menu contains the bin function setting, blocking factor, buffer size options, and access to the binning parameters dialog box. </p> <figure id="binmenu"> <title>The Bin menu</title> <description>The blocking factor is set to 1, the buffer size is 1024x1024, and the function is sum.</description> <bitmap format="png">binmenu.png</bitmap> </figure> </section> <section id="buffer"> <title>Buffer Size</title> <p> The buffer size determines the size of the image generated by ds9. By default, a full-resolution 1024x1024 image of the data is created. If your input data file has larger dimensions, it is clipped to 1024x1024 in ds9. The buffer settings range from 128x128 to 8192x1892. </p> <p> Setting the buffer to the smallest size, 128x128, illustrates how it works. The data was centered on the sources in ds9 before the buffer size was changed, creating <figlink id="smallbuffer"/>. </p> <figure id="smallbuffer"> <title>Buffer size set to 128x128</title> <description>A small central portion of the data is visible.</description> <bitmap format="png">smallbuffer.png</bitmap> </figure> <p> Setting the buffer to a large size, e.g. 4096x4096, produces <figlink id="largebuffer"/>. The display frame is filled by the data, and the panner in the upper right indicates that more of the image is available. Clicking and dragging the viewing bounding box in the panner will display a different portion of the image. </p> <figure id="largebuffer"> <title>Buffer size set to 4096x4096</title> <description>The frame is filled by the data, and the panner indicates more of the image is outside the field of view.</description> <bitmap format="png">largebuffer.png</bitmap> </figure> </section> <section id="basics"> <title>Binning Basics</title> <subsectionlist> <subsection id="basics.block"> <title>Changing the binning factor</title> <p> While increasing the buffer size loads more of the file into ds9, binning the data makes more of it visible in the frame. Binning combines the specified number of pixels into one new pixel; the new pixel has a value equal to the sum of the original pixels. (Note that if the bin method is changed to "average", the pixel values are averaged instead of summed.) </p> <p> The binning can changed from the "Bin" menu or from the "Bin" item in the button bar. It's also possible to step through different binning values with the -/+ buttons or the "Block In"/"Block Out" menu items. </p> <p> In <figlink id="block4"/>, the buffer size is set to 1024x1024, but the block factor has been set to 4. A larger section of the data is visible in the frame. </p> <figure id="block4"> <title>Data binned by a factor of 4</title> <description>Five of the CCDs are visible in the binned data.</description> <bitmap format="png">block4.png</bitmap> </figure> </subsection> <subsection id="basics.cols"> <title>Binning different columns</title> <p> ds9 has the ability to display any of the other columns stored in the event file, although it is generally only meaningful to use the spatial vector columns. Begin by opening the "Bin &#8594; Binning Parameters" dialog box, shown in <figlink id="binpar"/>. </p> <p> The "Bin Columns" menus are used to select the columns to be binned. To create an image in detector coordinates, set the first to "detx" and the second to "dety"; the block is set to "2" for both. The "or center of data" box is checked so that the center of the data is recalculated for the new columns. </p> <figure id="binpar"> <title>The Binning Parameter dialog</title> <description>The parameters are set to bin in detector coordinates about the center of the data.</description> <bitmap format="png">binpar.png</bitmap> </figure> <p> Click "Apply" and the ds9 frame is updated, as shown in <figlink id="detimage"/>. </p> <figure id="detimage"> <title>Image binned in detector coordinates</title> <description>Some bad columns are visible in black in the detector image.</description> <bitmap format="png">detimage.png</bitmap> </figure> <p> Alternatively, one can display an event file in specific coordinates when starting ds9 from the command line: </p> <screen> unix% ds9 "acisf00315N002_evt2.fits[bin=detx,dety]" &amp; </screen> </subsection> </subsectionlist> </section> <section id="cube"> <title>Data Cubes: Binning in three dimensions</title> <p> It is possible to add a third column to the binning, creating a 3-dimensional image also known as a "data cube". In this example, an (x,y,time) data cube is created of a Chandra observation of Jupiter (ObsID 1463). A cube may be created from any three columns that make sense in the analysis. For instance, you may want to create a PHA or energy axis to see how the spectral characteristics of a source change over time. </p> <p> The data file is loaded into a new frame in ds9 and the "Bin &#8594; Binning Parameters" dialog box is opened again. The "time" column of the file is selected from the "Bin 3rd Column" menu. The limits of the data in that column are filled in automatically. The "depth" field determines how many intervals the column is divided into; a depth of 25 is used. The completed parameter box is shown in <figlink id="binpar2"/>. </p> <figure id="binpar2"> <title>Binning Parameter dialog for a data cube</title> <description>The third binning column is set to "time" with a depth of "25".</description> <bitmap format="png">binpar2.png</bitmap> </figure> <p> After clicking "Apply", two things happen: <figlink id="cubebox">the "Data Cube" dialog box</figlink> is launched and <figlink id="cubeimg">the frame is updated to show only the (x,y) image of the first time slice</figlink>. (If the data cube dialog box doesn't launch, open it from the "Frame" menu.) </p> <figure id="cubebox"> <title>Data Cube dialog box</title> <description>The dialog box has controls to step through each slice of the data cube.</description> <bitmap format="png">cubebox.png</bitmap> </figure> <p> When "Play" is chosen, ds9 cycles through the bins of the time axis, essentially creating a movie of the (x,y) position of the object over time. The speed of the frame changes is controlled from the "Interval" menu of the dialog box. Any of the 25 intervals may be selected with the slider bar. </p> <figure id="cubeimg"> <title>Viewing a data cube</title> <description>One interval of the data cube is visible at a time when displayed in ds9.</description> <bitmap format="png">cubeimg.png</bitmap> </figure> <p> The data cube can be saved as an MPEG movie from the "File &#8594; Save Image..." menu. Select "MPEG-1 (Movie)" and click "OK"; after setting the filename, choose an MPEG Quality Factor. The Jupiter data was saved at a quality factor of 15: <a href="jupiter.mpg">jupiter.mpg</a>. </p> </section> <section id="filtering"> <title>Filtering Data</title> <p> The "Bin Filter" field in the "Binning Parameters" dialog box is used to apply filters to the data. A filter can be applied to any of the columns present in the input file. A colon is used to indicate a range of values. Filters can also use &lt; (less than) or &gt; (greater than). </p> <p> For instance, to include only the hard-band photons (2500-8000 eV): </p> <screen>energy=2500:8000</screen> <p> Clicking "Apply" updates the ds9 display and keeps the dialog open for adjusting the filters. </p> <p> Multiple filters may be specified, separated by commas: </p> <screen>energy=2500:8000, ccd_id=7</screen> <p> The resulting image is shown in <figlink id="filterimg"/>. </p> <figure id="filterimg"> <title>Filtering data</title> <description>Only the hard-band photos on CCD 7 are displayed.</description> <bitmap format="png">filterimg.png</bitmap> </figure> <p> The filtered dataset can be saved as a FITS file for use in data analysis from the "File &#8594; Save Frame as Fits..." menu. </p> </section> </sectionlist> </text> <!-- <figure id=""> <title></title> <description></description> <bitmap format="png">.png</bitmap> </figure> --> </thread> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r1.5.html��������������������������������������������������������������������000644 �000765 �000000 �00000005560 10415010755 016627� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 1.5 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 1.5 Release Notes</h3> <ul> <h4> <b>Version 1.5</b></h4> <ol> <li> <tt>Fixed problem with Windows style Open file dialog box</tt></li> <li> <tt>Now supports following coords systems:</tt></li> <ul> <li> <tt>Image (was Logical)</tt></li> <li> <tt>CCD (was Physical)</tt></li> <li> <tt>Detector (was Mosaic Physical)</tt></li> <li> <tt>Amplifier</tt></li> <li> <tt>WCS</tt></li> </ul> <li> <tt>New version of Doug Mink's WCS libs</tt></li> <li> <tt>Fixed minor problems with interactive Pan Mode</tt></li> <li> <tt>Added "Source TCL" file support</tt></li> <li> <tt>Open Mosaic Image command</tt></li> <br> <tt>Will open multiple fits files as a mosaic.</tt> <br> <tt>Supports following patterns:</tt> <br> <tt>*#.fits</tt> <br> <tt>*_#.fits</tt> <br> <tt>*.IM*.fits</tt> <li><tt>Open Mosaic Segment command</tt></li> <li> <tt>Fixed minor problem with zscale and high energy data</tt></li> <li> <tt>The Magnifier now Works!</tt></li> <br> <tt>There are two algorithms available (under Preferences)</tt> <br> <tt>Magnification can be selected via preferences</tt> <ol> <li> <tt>Fast (and less Accurate)</tt></li> <li> <tt>More Accurate (and slower)</tt></li> </ol> <li> <tt>Improvements to Dialogs</tt></li> <li> <tt>Now supports (unoffical)FITS data size -16 (unsigned short)</tt></li> <li> <tt>Support for byte swapped processors</tt></li> <li> <tt>Support large images &gt; 8k x 8k</tt></li> <li> <tt>Loading images are now 10x faster</tt></li> <li> <tt>Supports BLANK Fits keyword</tt></li> <li> <tt>&nbsp;Menu Short Cuts have been added (use Alt key, such as Alt-f for Frame menu)</tt></li> <li> <tt>Horizontal and Verticle Graphs now work in all modes (not just Crosshair)</tt></li> <li> <tt>ds9 will accept fits files via STDIN (ie. $ cat foo.fits | ds9 -file -&nbsp; )</tt></li> <li> <tt>command line argument support (ie. $ds9 -? for list)</tt></li> <li> <tt>crosshair position is more accurate</tt></li> <li> <tt>added new scales: 'ln' and 'log'.</tt></li> <ol> <li> <tt>ln --&nbsp; SAOimage natural log based algorithm</tt></li> <li> <tt>log--&nbsp; IRAF log base 10 algorithm</tt></li> </ol> <li> <tt>Support for Postscript printing (Level 1 and Level 2)</tt></li> <li> <tt>Blinking is now supported</tt></li> </ol> </ul> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r1.6.html��������������������������������������������������������������������000644 �000765 �000000 �00000001472 10415010755 016626� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 1.6 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 1.6 Release Notes</h3> <ul> <h4> <b>Version 1.6.1</b></h4> <ol> <li> <tt>fix some minor problems with odd chars in filenames</tt></li> <li> <tt>fix problems with fits image extensions</tt></li> <li> <tt>removed minimal geometry restrictions</tt></li> <li> <tt>fits file support is more robust</tt></li> </ol> </ul> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r1.7.html��������������������������������������������������������������������000644 �000765 �000000 �00000007610 10415010755 016627� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 1.7 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 1.7 Release Notes</h3> <ul> <h4> <b>Version 1.7.2</b></h4> <ol> <li> <tt>Fixes a rather nasty bug with coordinates.</tt></li> <li> <tt>XPA version 2.b32</tt></li> <br> <tt>example:</tt> <br> <tt>$ ds9&amp;</tt> <br> <tt>$ xpaget DS9 # will list all public access points</tt> <br> <tt>$ xpaset -p DS9 colormap BB # change colormap</tt> <br> <tt>$ xpaset -p DS9 file snr.fits # load a fits file</tt> <br> <tt>$ cat snr.fits | xpaset DS9 fits # load via XPA</tt> <br> <tt>$ cat snr.fits | xpaset DS9 fits foo[key=RAWX,RAWY] # load via XPA</tt> <br> <tt>Note: xpa class and name for ds9</tt> <br> <tt>-- xpa class : 'DS9'</tt> <br> <tt>-- xpa name&nbsp; : 'DS9'</tt> <br> <tt>both class and name are case sensitive</tt> <br> <tt>To specify a different xpa name for this application use the</tt> <br> <tt>-title command line option:</tt> <br> <tt>$ ds9&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # default name of 'DS9'</tt> <br> <tt>$ ds9 -title foo&amp; # name of 'foo'</tt> <br> <tt>$ xpaset -p foo colormap BB # change colormap for 'foo'</tt> <br> <tt>$ xpaset -p :foo colormap A # change colormap for 'foo'</tt> <br> <tt>$ xpaset -p DS9:foo colormap BB # change colormap for 'foo'</tt> <br> <tt>$ xpaset -p DS9: colormap I8 # change colormap for 'DS9 &amp; foo'</tt> <li><tt>fixed bug with zscale and minmax preferences</tt></li> <li> <tt>geometry command line option: $ ds9 -geometry 600x500</tt></li> <br> <tt>Note: this does not include space needed for menus.</tt> <li><tt>default wcs is 'fk5'</tt></li> </ol> <h4> <b>Version 1.7</b></h4> <ol> <li> <tt>new version of Fits I/O library</tt></li> <li> <tt>.Z, .z, and .gz files are supported</tt></li> <br> <tt>example:</tt> <br> <tt>$ ds9 snr.fits.Z</tt> <br> <tt>$ ds9 snr.fits.z</tt> <li><tt>url's are now supported</tt></li> <br> <tt>example:</tt> <br> <tt>$ ds9 ftp://legacy.gsfc.nasa.gov/rosat/data/hri/images/fits/rh100193_img.fits</tt> <br> <tt>$ ds9 http://legacy.gsfc.nasa.gov/FTP/rosat/data/cdrom/vol1/IMAGES/00h/p000s26b.img.Z</tt> <li><tt>fixed some minor problems with Mosaic Images</tt></li> <li> <tt>Support for FITS bin tables</tt></li> <br> <tt>example:</tt> <br> <tt>$ ds9 snr.fits[2] # assume 'X' or 'x' and 'Y' or 'y' column</tt> <br> <tt>$ ds9 snr.fits[EVENTS]</tt> <br> <tt>$ ds9 snr.fits # assumes EVENTS or STDEVT extension</tt> <br> <tt>$ ds9 snr.fits[key=RAWX,RAWY] # bin on RAWX/RAWY column</tt> <li><tt>Backward compatible with Einstein .xpa data for bining</tt></li> <li> <tt>Contours are now supported</tt></li> <br> <tt>You can generate contours for each frame and cut/paste them into other frames. When you paste a contour, you choose which coordinate system to translate the contour into. Obvisously, to paste via WCS, each image must have a valid WCS. Printing of image/contours also is supported.</tt> <br> <tt>The contour algorithm currently implemented is a general purpose algorithm, good for most images. However, there are some issues that make it less than optimal for sparse high energy data. Therefor, next on the list is implemention of the 'Pros Imcontour' algorithm.</tt> <li><tt>Now supports ICRS WCS</tt></li> <li> <tt>Now Uses Tcl/Tk 8.0.4 and BLT 2.4g</tt></li> <li> <tt>Now uses Doug Minks's wcssubs 2.6.</tt></li> </ol> </ul> </body> </html> ������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r1.8.html��������������������������������������������������������������������000644 �000765 �000000 �00000037634 10415010755 016641� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 1.8 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 1.8 Release Notes</h3> <ol> <h4> <b>Version 1.8.7.8</b></h4> <ol> <li> <tt>Dialog windows now use the same colormap as the parent window.</tt></li> <li> <tt>Fixed a problem with the tile xpa point.</tt></li> </ol> <h4> <b>Version 1.8.7.7</b></h4> <ol> <li> <tt>Fixed a problem with updating the Contour dialog box.</tt></li> <li> <tt>Fixed another problem with .gz, .Z, and .z</tt></li> <li> <tt>Coordinate Grids now support WCS of projection TNX.</tt></li> <li> <tt>Improved the appearance of Grids while in Internal Mode.</tt></li> </ol> <h4> <b>Version 1.8.7.6</b></h4> <ol> <li> <tt>Fixed a problem with running under linux and displaying on Solaris.</tt></li> <li> <tt>Fixed a problem with Truecolor 8 support.</tt></li> <li> <tt>Added Coordinate Grids!</tt></li> <li> <tt>Mouse coordinates may be printed by pressing the 'C' key. Which coordinates are printed may be specified via the 'Edit:Preferences:Print Coordinates' menu.</tt></li> <li> <tt>Default Region Parameters now can be specified via the Preferences menu.</tt></li> <li> <tt>Contour Dialog has been redesigned and Contour scales and limits added.</tt></li> <li> <tt>Fixed a problem with Contour scales log, squared, and sqrt.</tt></li> <li> <tt>The user can save and load contours via the Contour Parameter Dialog Box. The contours may be any supported coordinate system.</tt></li> <li> <tt>The user can save and load contour levels via the Contour Parameter Dialog Box.</tt></li> <li> <tt>Fixed a problem with file names that contain .z, .Z, .gz</tt></li> </ol> <h4> <b>Version 1.8.7.5</b></h4> <ol> <li> <tt>Fixed a problem with Truecolor 24 bit visuals under Solaris 7</tt></li> <li> <tt>Fixed a problem with selecting Ruler Regions that are horizontal or vertical.</tt></li> </ol> <h4> <b>Version 1.8.7.4</b></h4> <ol> <li> <tt>Fixed a major bug with mosaics with an amplifier that reads out in reverse and the data has been flipped before writing.</tt></li> </ol> <h4> <b>Version 1.8.7.3</b></h4> <ol> <li> <tt>New wcssubs: Fixed a problem with wcs of RA--NCP and DEC--NCP</tt></li> <li> <tt>Fixed a problem with 'Scale:User Limits'</tt></li> <li> <tt>Removed a warning message if xpa is not available</tt></li> <li> <tt>The coordinate info box is updated while editing regions</tt></li> <li> <tt>Fixed a problem with the window manager closing region dialog boxes, regions list dialog box, and analysis result dialog box</tt></li> <li> <tt>List Regions, Display Header, and the Analysis Dialog box now have options for printing, saving, and searching the contents.</tt></li> <li> <tt>Display Header now supports multiple dialogs, one for each frame.</tt></li> <li> <tt>Fixed a problem with parsing region files and the LINE region.</tt></li> <li> <tt>Fixed a problem with polygon regions and PROS region file formats.</tt></li> <li> <tt>All regions are deleted when 'Clear Frame' or 'Open' action taken.</tt></li> <li> <tt>When creating Text regions, the 'Cancel' button now works.</tt></li> <li> <tt>'Clear Frame' has been moved from 'File menu to 'Frame' menu.</tt></li> <li> <tt>shell variable DS9_ARRAY may be used to define default array parameters. Example: $export DS9_ARRAY='[dim=512,bitpix=-32]'</tt></li> <li> <tt>shell variable DS9_BINKEY may be used to define default FITS bin table cols. Example: $export DS9_BINKEY='[bin=rawx,rawy]'</tt></li> <li> <tt>new 'Open Array...' menu item has been added to the 'File' menu.</tt></li> <li> <tt>Changes to following ommand line options:</tt></li> <br> <tt>-array, -mosaicimage, -mosaicimages, -mosaicsegment, -shared</tt> </ol> <h4> <b>Version 1.8.7.2</b></h4> <ol> <li> <tt>Add the -iconify command line option.</tt></li> <li> <tt>FITS Region Binary Table Region file format is supported for input.</tt></li> </ol> <h4> <b>Version 1.8.7.1</b></h4> <ol> <li> <tt>Now using BLT 2.4l</tt></li> <li> <tt>Now using X11R6</tt></li> <li> <tt>Fixed a problem with selecting blink frames multiple times.</tt></li> <li> <tt>Fixed a problem with Line Regions always printing with arrows.</tt></li> <li> <tt>Fixed a problem when a printing error occurs.</tt></li> <li> <tt>External File support is now available.</tt></li> <li> <tt>External Analysis support is now available.</tt></li> <li> <tt>Added Frame refresh menu item.</tt></li> <li> <tt>Fixed a problem with shared memory size.</tt></li> <li> <tt>XPA frame has changed. The argument is now only a number, not a name. This clears up some problems with syntax. If the frame does not exists, the frame is created. The option 'frameno' is provided for backward compatiblity.</tt></li> <br> <tt>Example: xpaset -p ds9 frame 2 # goto frame name 'frame2'</tt> <br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xpaset -p ds9 frame frameno 4 # goto frame name 'frame4'</tt> </ol> <h4> <b>Version 1.8.7</b></h4> <ol> <li> <tt>Scale type 'Ln' has been removed.</tt></li> <li> <tt>Contour scales Log, Sqrt, and Squared have been fixed.</tt></li> <li> <tt>Contour Dialog box is now non-modal.</tt></li> <li> <tt>Fixed a problem with the FITS Header Dialog box.</tt></li> <li> <tt>Support for &gt; 256 colors in truecolor mode.</tt></li> <li> <tt>New PS level 2 drivers that support more than 256 colors.</tt></li> <li> <tt>Crosshairs will now appear in the magnifier if graphics enabled.</tt></li> <li> <tt>Improved on the gui in terms of tile and blink. Now ds9 is in one of 3 display modes: single frame, tile frames, and blink frames.</tt></li> <li> <tt>You can now Show or Hide frames, via the Frame:Show/Hide menu. When a frame is 'Hidden', it does not appear in Single, Tile, or Blink mode, and can not be selected via the Frames menu.</tt></li> <li> <tt>Added a new mode: Examine. While in examine mode, if you click, a new frame is created, loaded with the same data, and scaled about the point you clicked. If the base frame is a FITS image, it is zoomed, if the base frame is a FITS binary table, it is blocked. The file is not loaded again, but shared between frames, requiring little additional memory. When you clear or delete a base frame, all examine frames are deleted. Options as to how many frames are created and the scale factor may be specified via the preferences menu.</tt></li> </ol> <h4> <b>Version 1.8.6.9</b></h4> <ol> <li> <tt>Support for FITS Bin Table Type 'U' (unsigned short) and Type 'V' (unsigned long). Note these are not supported by the FITS standard.</tt></li> <li> <tt>Added new default colormap 'Cool'</tt></li> <li> <tt>SAOtng and PROS Regions file support: if wcs coords are used, yet no wcs system has been specified, the native wcs of the file is used.</tt></li> <li> <tt>Regions now are available in the magnifier (user prerference)</tt></li> <li> <tt>Fixed a problem with working with line regions at high zoom factors</tt></li> <li> <tt>Fixed a problem with working with polygon regions at high zoom factors</tt></li> </ol> <h4> <b>Version 1.8.6.8</b></h4> <ol> <li> <tt>Fixed again problems with FITS Tables, Binning, Physical Coords, and WCS</tt></li> </ol> <h4> <b>Version 1.8.6.7</b></h4> <ol> <li> <tt>Binning on a third column is now supported</tt></li> <li> <tt>Fixed a problem with FITS Tables and bit fields</tt></li> </ol> <h4> <b>Version 1.8.6.6</b></h4> <ol> <li> <tt>Added new 'Zoom to Fit Window' function</tt></li> <li> <tt>Added new 'Block to Fit Window' function</tt></li> <li> <tt>Added 'Block to...' function</tt></li> <li> <tt>'Mode' menu has been moved to under 'Edit' menu.</tt></li> <li> <tt>Show/Hide Panner and Magnifier via the prefs, command line, and xpa</tt></li> <li> <tt>Tear-Off menus now have window titles</tt></li> <li> <tt>minor changes to xpa options syntax (no more -options), see <a href="xpa.html">XPA</a> for more info.</tt></li> <li> <tt>xpa colormap is no longer case sensitive</tt></li> <li> <tt>fixed a problem with tables and physical coordinates</tt></li> <li> <tt>fixed a problem with interactive pan/zoom/rotate and coordinates</tt></li> </ol> <h4> <b>Version 1.8.6.5</b></h4> <ol> <li> <tt>Fixed a problem with reading IRAF Pros regions files</tt></li> </ol> <h4> <b>Version 1.8.6.4</b></h4> <ol> <li> <tt>Fixed a problem with Little Endian Machines and doubles in FITS bin tables</tt></li> </ol> <h4> <b>Version 1.8.6.3</b></h4> <ol> <li> <tt>Now supports SAOtng regions files in physical coordinates.</tt></li> </ol> <h4> <b>Version 1.8.6.2</b></h4> <ol> <li> <tt>Improved Region clipping</tt></li> <li> <tt>Fixed a problem with finding the Preferences File</tt></li> </ol> <h4> <b>Version 1.8.6.1</b></h4> <ol> <li> <tt>Fixed a rather nasty bug with rendering Circle Regions. This bug would sometimes cause the X Server to hang.</tt></li> <li> <tt>Now does a better job of creating the default size regions.</tt></li> <li> <tt>Frame buttons Prev and Next now will cycle thru all frames.</tt></li> </ol> <h4> <b>Version 1.8.6</b></h4> <ol> <li> <tt>Automatic Tile Mode with multiple files on command line</tt></li> <li> <tt>Fixed problems with HTTP and FTP access</tt></li> <li> <tt>Fixed another problem with FITS Bin tables and regions</tt></li> <li> <tt>There are now 2 modes for interactive panning-- default click to center</tt></li> <ul> <li> <tt>Click to Center (SAOimage method)</tt></li> <li> <tt>Drag to Center (Native DS9 method)</tt></li> </ul> <li> <tt>New frames use the current user scale limits and colorscale.</tt></li> <li> <tt>Added frameno option to FRAME xpa point</tt></li> <li> <tt>REGION SAVE FORMAT menu now reflects coords available</tt></li> </ol> <h4> <b>Version 1.8.5</b></h4> <ol> <li> <tt>New GUI Buttons Bar</tt></li> <li> <tt>Rearranged Menus, smaller desktop footprint</tt></li> <li> <tt>New Tiling algorithms</tt></li> <li> <tt>Truecolor 8bit support</tt></li> <br> <tt>$ds9 -visual truecolor8</tt> <li><tt>Truecolor 16bit support</tt></li> <br> <tt>$ds9 -visual truecolor16</tt> <li><tt>Truecolor 24bit enhancements</tt></li> <br> <tt>$ds9 -visual truecolor24</tt> <li><tt>Pseudocolor 8bit enhancements</tt></li> <br> <tt>$ds9 -visual pseudocolor8</tt> <li><tt>Regions Modes now intergrated into Pointer Mode</tt></li> <li> <tt>New colormaps have been added</tt></li> <li> <tt>Fixed a problem with FITS ext names</tt></li> <li> <tt>Editing RECTANGLE regions resizes about the opposite node, not the center</tt></li> <li> <tt>Polished the GUI for creating regions</tt></li> <li> <tt>list/save regions in saoimage format now outputs points</tt></li> <li> <tt>Fixed a problem with existing regions and blocking</tt></li> </ol> <h4> <b>Version 1.8.4.1</b></h4> <ol> <li> <tt>Fixed problem with rotate mode and updating menus</tt></li> </ol> <h4> <b>Version 1.8.4</b></h4> <ol> <li> <tt>24 bit color support</tt></li> <li> <tt>New Postscript drivers</tt></li> <ul> <li> <tt>CMYK support</tt></li> <li> <tt>Variable resolution</tt></li> </ul> <li> <tt>Online Documentation!</tt></li> <li> <tt>Fixed a problem with Physical Coordinates and FITS Bin Tables</tt></li> <li> <tt>Sticky file names have been implemented</tt></li> <li> <tt>Fixed a problem with standard dialogs and double/triple clicks</tt></li> <li> <tt>If Header window is open, load will display the new header</tt></li> <li> <tt>Delete Frame now asks for confirmation</tt></li> <li> <tt>Fixed a problem with arrays and xpa</tt></li> <li> <tt>Fixed a problem with FITS keyword inheritance</tt></li> <li> <tt>for FITS bin tables, the keywords BIN, BINKEY, and KEY are equivalent</tt></li> <li> <tt>Fixed a problem with regions and tiled frames</tt></li> <li> <tt>Keystroke shortcuts have been added to the GUI</tt></li> <li> <tt>Added WCS menu items to preferences saved</tt></li> <li> <tt>Added 'Clear Preferences' to preferences menu</tt></li> <li> <tt>Mouse button 2 is now bound to 'Pan' function</tt></li> <li> <tt>Minor changes to layout of Small and Large Infomation Panel</tt></li> <li> <tt>Fixed problem with pseudocolor 8 and private colormaps</tt></li> </ol> <h4> <b>Version 1.8.3</b></h4> <ol> <li> <tt>Fixed a problem with arrays and xpa</tt></li> <li> <tt>xpaget regions: you now can specify coord/coordformat/format</tt></li> <li> <tt>$ xpaget ds9 regions -format pros -coord fk4 -coordformat hms</tt></li> <li> <tt>Interactive rotation is now works!</tt></li> <li> <tt>PanZoom Dialog and Rotate Dialog now have 'Apply' buttons</tt></li> <li> <tt>Preferences have been implemented. 'Save Preferences' will save the current values of the 'Preferences' and 'View' menus in $HOME/.ds9.prefs. On startup, this values will be used.</tt></li> <li> <tt>Source user tcl file has been implemented. If $HOME/.ds9 exists, it will be sourced on start up.</tt></li> <li> <tt>New Standard Dialog box has been implemented. User now has a choice of motif, windows, or 'blue plate special' dialog boxes.</tt></li> <li> <tt>'$ xpaget ds9 file' now returns full file name</tt></li> <li> <tt>More tolerant of non-existent or bad files.</tt></li> <li> <tt>More robust checking of mosaic files</tt></li> <li> <tt>FITS keyword inheritance is now supported.</tt></li> <li> <tt>Mosaic Multiple Extension Fits files are now supported.</tt></li> <li> <tt>Coordinate name 'CCD' has been changed to 'Physical'</tt></li> </ol> <h4> <b>Version 1.8.2</b></h4> <ol> <li> <tt>Support for raw data arrays</tt></li> <br> <tt>$ ds9 "foo.arr[xdim=512,ydim=512,bitpix=-32]"</tt> <br> <tt>$ ds9 "foo.arr[xdim=512,ydim=512,bitpix=16,skip=100]"</tt> <br> <tt>$ ds9 "foo.arr[dim=1024,bitpix=8,bigendian]"</tt> <br> <tt>$ ds9 "foo.arr[dim=1024,bitpix=8,arch=littleendian]"</tt> <li><tt>xpa support for raw data arrays</tt></li> <br> <tt>$ cat foo.arr | xpaset ds9 array "[dim=512,bitpix=16]"</tt> </ol> <h4> <b>Version 1.8.1.2</b></h4> <ol> <li> <tt>fixed problem with printing</tt></li> </ol> <h4> <b>Version 1.8.1.1</b></h4> <ol> <li> <tt>fix problem with change of xpa api</tt></li> </ol> <h4> <b>Version 1.8.1</b></h4> <ol> <li> <tt>fix blockfactor,blockbuffersize, and blockfunction command line options.</tt></li> <li> <tt>fixed problem with Marker type Line Dialog box.</tt></li> <li> <tt>Added new marker type: Ruler.</tt></li> <li> <tt>fixed major problem with regions files and loading via xpa.</tt></li> <li> <tt>Added arrows to line marker.</tt></li> <li> <tt>more robust error handling.</tt></li> <li> <tt>bin table extension names and column names are no longer case sensitive.</tt></li> <li> <tt>fixed problem with printing to different page sizes</tt></li> </ol> <h4> <b>Version 1.8</b></h4> <ol> <li> <tt>Fixed a major memory leak</tt></li> <li> <tt>Fixed a XPA printing problem</tt></li> <li> <tt>Fixed problem with LOG scale</tt></li> <li> <tt>the xpa application name is now "ds9".</tt></li> <li> <tt>the xpa class name is now "DS9"</tt></li> <br> <tt>example:</tt> <br> <tt>$ xpaget ds9 version # get version number from just ds9</tt> <br> <tt>$ xpaget DS9:ds9 version # get version number from just ds9</tt> <li><tt>$ xpaget DS9: version # get version number for all DS9 apps</tt></li> <li> <tt>Markers!</tt></li> </ol> </ol> </body> </html> ����������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r1.9.html��������������������������������������������������������������������000644 �000765 �000000 �00000030127 10415010755 016630� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 1.9 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 1.9 Release Notes</h3> <ol> <h4> <b>Version 1.9.8</b></h4> <ol> <li> <tt>fixed a problem with listing regions that are very long. the size limit has been increased from 1024 to 8192</tt></li> <li> <tt>completed MS Windows port</tt></li> <li> <tt>fixed a problem with large polygons in FITS Regions bin table format</tt></li> <li> <tt>ds9 will now correctly load a FITS Extension image without a primary header</tt></li> <li> <tt>xpa wcs [reset|replace|append] function added</tt></li> <li> <tt>the default nameserver is now 'simbad-sao'</tt></li> </ol> <h4> <b>Version 1.9.7.2</b></h4> <ol> <li> <tt>fixed a problem with reading arrays via xpa and extra data an the end of the image</tt></li> <li> <tt>fixed a problem with region callbacks and actions on regions within the callback</tt></li> <li> <tt>fixed a memory leak with deleteing polygon vertices</tt></li> <li> <tt>double click on region with select=0 no longers opens a dialog</tt></li> <li> <tt>added select property to ds9 region properties list</tt></li> <li> <tt>for default annulus, ellipse annulus, box annulus, the number of annuli is now used when the user click and drags</tt></li> <li> <tt>fixed a problem with ellipse annulus and box annulus and zero inner radius</tt></li> <li> <tt>fixed a problem with box and boxannuls and updating the region dialog coords</tt></li> <li> <tt>fixed a problem with turning off/on active frames</tt></li> <li> <tt>fixed a problem with saving fits images created from a fits image extension</tt></li> <li> <tt>added new 'new' option to xpa points 'FITS' and 'ARRAY' to create a new frame before loading the new image</tt></li> <li> <tt>completed port HP-UX</tt></li> </ol> <h4> <b>Version 1.9.7.1</b></h4> <ol> <li> <tt>fixed a problem with prefs and sourcing external tcl files</tt></li> </ol> <h4> <b>Version 1.9.7</b></h4> <ol> <li> <tt>mktclapp is now used to build the application from tcl</tt></li> <li> <tt>fixed a problem with HMS and hour=0</tt></li> <li> <tt>fixed a problem with parseing old ds9 region files and 'global'</tt></li> <li> <tt>support for SAOtng Regions file format has been restored</tt></li> <li> <tt>upgraded to tcl/tk 8.3.2</tt></li> <li> <tt>upgraded to blt2.4u</tt></li> <li> <tt>minor changes made to ciao regions file format</tt></li> <li> <tt>fixed a problem with Ciao FITS regions files</tt></li> </ol> <h4> <b>Version 1.9.6</b></h4> <ol> <li> <tt>Added Truecolor Colorbar preference</tt></li> <li> <tt>Fitsy++ now supports fixed and free format keyword strings correctly</tt></li> <li> <tt>While in 'Pan' mode, the arrow keys may be used to pan the image</tt></li> <li> <tt>Custom Page Setup in mm is now supported</tt></li> <li> <tt>Region Text string can now contain both a ' and "</tt></li> <li> <tt>Region File format for text now supports the following text strings:</tt></li> <ol> <tt>text="This is a test"</tt> <br> <tt>text="This is a test of '"</tt> <br> <tt>text='This is a test of "'</tt> <br> <tt>text={This is a test of ' and "}</tt> </ol> <li> <tt>DS9 will now correctly parse a regions spec with a delim of ';'</tt></li> <li> <tt>XPA tcl command now runs in the same context frame as source and ds9</tt></li> <li> <tt>Fixed a problem with the Colorbar contrat/bias dialog and truecolor</tt></li> <li> <tt>Fixed a problem with BOX list/save format</tt></li> <li> <tt>Fixed a problem with contours in that one extra level was generated when using the low/high and number of contours controls</tt></li> <li> <tt>Updated to Doug Mink's wcssub version 2.8.1, which fixes a problem with keywords without an '='</tt></li> <li> <tt>Fixed a problem with printing Region Text with '(', ')', or '\' in it.</tt></li> <li> <tt>Region file format is now valid for both reading and writing Region files</tt></li> <li> <tt>Implemented new Regions file format, version 3</tt></li> <li> <tt>Fixed a problem with IRAF and the 'f' and 'c' keys</tt></li> <li> <tt>Images with odd length will center on pixel boundaries</tt></li> <li> <tt>The number of bins if determined from TLMIN/TLMAX will now vary, based on column type (integer or real). The bin space for integer is TLMIN-.5 to TLMAX +.5 and for real TLMIN to TLMAX.</tt></li> <li> <tt>Binning Dialog box is now non-modal</tt></li> <li> <tt>Made improvements in the resolution of coordinates</tt></li> <li> <tt>Added the -version command line option</tt></li> <li> <tt>Fixed a problem with bad name resolution and NED-SAO</tt></li> <li> <tt>Fixed a problem with -grid and -contour command line options</tt></li> <li> <tt>Add -format, -coord, -coordformat, and -delim to xpaget regions</tt></li> <li> <tt>Added FITS bin table filtering</tt></li> <li> <tt>Changed XPA BLOCK to BIN</tt></li> <li> <tt>bin factors of less than 1 but greater that 0 are now allowed</tt></li> <li> <tt>fixed a problem with ecliptic coords and FITS BIN TABLES with wcs</tt></li> <li> <tt>Fixed a problem with contours and high resolution values</tt></li> <li> <tt>Added algorithm method to contours</tt></li> <li> <tt>Fixed a problem with contours and re-binning a FITS bin table</tt></li> <li> <tt>Changes to BIN commandline options to mirror BIN xpa options</tt></li> <li> <tt>Added raise/lower command line options</tt></li> <li> <tt>Added raise/lower xpa options</tt></li> <li> <tt>Cut/Paste to/from the primary selection is now provided</tt></li> <li> <tt>Added new type of grid, Exterior Axis with interior numerics</tt></li> <li> <tt>Fixed problems with grid numerics and rotation of non-zero</tt></li> <li> <tt>Fixed a problem with graphs and no FITS loaded</tt></li> <li> <tt>Added Regions Delimiter menu</tt></li> <li> <tt>Added ANNULUS, ELLIPSE ANNULUS, and BOX ANNULUS regions</tt></li> </ol> <h4> <b>Version 1.9.5</b></h4> <ol> <li> <tt>Fixed a problem with Saving FITS images on byte swaped platforms</tt></li> <li> <tt>FITS Bin table support now uses TLMIN/TLMAX to determine binning buffersize up to the user specified limit</tt></li> <li> <tt>Fixed the XPA Regions format,coord, and coordformat calls</tt></li> <li> <tt>Changed the behavior of $xpaget ds9 regions [format|coord|coordformat]</tt></li> </ol> <h4> <b>Version 1.9.4</b></h4> <ol> <li> <tt>Added ability to save a FITS bin table as a FITS image</tt></li> <li> <tt>Added xpa point to support the above</tt></li> <li> <tt>Fixed a problem with loading arrays</tt></li> <li> <tt>Added support for the Rosat All Sky Survey</tt></li> <li> <tt>Added command line support for DSS and RASS</tt></li> <li> <tt>Fixed a problem with displaying LINEAR WCS</tt></li> <li> <tt>DS9 is now much more tolarent of FITS files in which the data segment is short in size, ie, is not a multiple of FITBLOCK (2880 bytes)</tt></li> <li> <tt>Fixed a problem with FITS files with headers with 100's or 1000's of comments or history keywords</tt></li> <li> <tt>Enhanced Preferences support</tt></li> <li> <tt>The information panel is now updated during blinking</tt></li> <li> <tt>Fixed a problem with long frame names</tt></li> <li> <tt>Added new fuctionality to the 'Frame' xpa point</tt></li> <li> <tt>Fixed a memory problem that caused problems with the Alpha port</tt></li> <li> <tt>Fixed a problem with regions in sexagesimal format and NATIVE WCS</tt></li> <li> <tt>DS9 is now much mor tolerant of sexagesimal format regions that do not map directly on top of a image</tt></li> <li> <tt>Implemented the new default region format</tt></li> <li> <tt>Fixed a problem with Polygon regions and creating/moving vertices</tt></li> <li> <tt>Added Colormap Contrast and Bias Dialog</tt></li> <li> <tt>Fixed a problem with Box regions and negative width and height</tt></li> <li> <tt>Angle has been added to the Ruler Region dialog box</tt></li> <li> <tt>Length has been added to the Line Region dialog box</tt></li> <li> <tt>Fixed a problem with Region Text and the '"' character</tt></li> <li> <tt>Added XPA point for DSS</tt></li> <li> <tt>Added XPA point for RASS</tt></li> <li> <tt>Added XPA point for Name Servers</tt></li> <li> <tt>Fixed a problem with rotated Regions and IRAF images</tt></li> <li> <tt>Added XPA point xpaget fits</tt></li> <li> <tt>Added XPA point xpaset file save &lt;filename&gt;</tt></li> <li> <tt>xpa regions may now be delimited by nl or semicolon</tt></li> </ol> <h4> <b>Version 1.9.3</b></h4> <ol> <li> <tt>Fixed a problem with preferences. The prefs file was not parsed.</tt></li> <li> <tt>Fixed a problem with xpaset ds9 fits and multiple ext fits files</tt></li> <li> <tt>Fixed some minor problems with xpa and blink,frame</tt></li> <li> <tt>Added xpaset ds9 frame [first|next|prev|last]</tt></li> <li> <tt>Added printing of pixel tables</tt></li> <li> <tt>Added Copy/Paste support for pixel tables</tt></li> <li> <tt>Fixed a problem with changing the size of pixel tables</tt></li> <li> <tt>'F' toggles Info Pannel 'freeze' mode.</tt></li> <li> <tt>Full shared memory support has been added</tt></li> <br> <tt>$xpaget ds9 shm</tt> <br> <tt>$xpaset -p ds9 shm 102 8640</tt> <br> <tt>$xpaset -p ds9 shm shmid 102 8640 foo[2]</tt> <br> <tt>$xpaset -p ds9 shm mosaicimage key 100 10240 foo</tt> <br> <tt>$xpaset -p ds9 shm mosaic key 100 10240 foo[3]</tt> <br> <tt>$xpaset -p ds9 shm array shmid 102 8640 [dim=32,bitpix=16]</tt> <p><tt>$xpaset -p ds9 update 1 100 100 200 200 # update HDU1 in image coords</tt> <br> <tt>$xpaset -p ds9 update 3 400 400 500 500 # update HDU3 in image coords</tt></p> </ol> <h4> <b>Version 1.9.2</b></h4> <ol> <li> <tt>Fixed yet another problem with contours</tt></li> <li> <tt>Fixed a problem with loading arrays with bitpix of -64</tt></li> </ol> <h4> <b>Version 1.9.1</b></h4> <ol> <li> <tt>Fixed the 'Analysis' menu item 'DSS'</tt></li> <li> <tt>provided for more backward compatibility with old preference files</tt></li> <li> <tt>Fixed a problem with IRAF support and changing buffer sizes</tt></li> <li> <tt>Fixed a problem with contours and reading incorrectly levels</tt></li> <li> <tt>Fixed a problem with printing and pan/rotation/zoom</tt></li> <li> <tt>Fixed a problem with Grid Rotated numbers and MSB/LSB cross-platform</tt></li> </ol> <h4> <b>Version 1.9</b></h4> <ol> <li> <tt>DS9 now supports IRAF!</tt></li> </ol> <ol> <li> <tt>point regions now have the include/exclude property</tt></li> <li> <tt>crosshairs will now print</tt></li> <li> <tt>fixed a problem with contours and the contour dialog is visible</tt></li> <li> <tt>fixed a problem with the wcs of FITS files with very long headers</tt></li> <li> <tt>added Pixel Table feature</tt></li> <li> <tt>contours now appear in the magnifier with graphics enabled</tt></li> <li> <tt>John Roll's Tcl Ast package has been added</tt></li> <li> <tt>DS9 is now more tolerant of 'SIMPLE = F' type FITS files</tt></li> <li> <tt>fixed a problem with render speed in single frame mode and multiple frames loaded</tt></li> <li> <tt>The Pan Zoom Rotate Dialog Box is now Non-Modal</tt></li> <li> <tt>Name Resolution support has been added</tt></li> <li> <tt>DSS support has been added</tt></li> <li> <tt>A problem with contours has been corrected. if contours levels = n, then n+1 contours are actually rendered</tt></li> <li> <tt>DEC Alphas are now supported</tt></li> <li> <tt>SGI is now supported</tt></li> <li> <tt>LINEAR WCS is now fully supported</tt></li> </ol> </ol> </body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r2.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000001766 10415010756 016630� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 2.0 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 2.0 Release Notes</h3> <ol> <h4> <b>Version 2.0</b></h4> <ol> <li> <tt>changed xpa tcl received to remove eval statement</tt></li> </ol> <ol> <li> <tt>fixed a problem clearing the magnifier in the windows version</tt></li> <li> <tt>implemented a work around for a bug in dvips version 5.55 and level 2 postscript driver</tt></li> <li> <tt>filename with a space in them will now load correctly</tt></li> <li> <tt>fixed a problem with FITS Regions Files and optional columns</tt></li> </ol> </ol> </body> </html> ����������saods9/ds9/doc/release/r2.1.html��������������������������������������������������������������������000644 �000765 �000000 �00000053351 10415010756 016626� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 2.1 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 2.1 Release Notes</h3> <ol> <h4> <b>Version 2.1</b></h4> <ol> <li> <tt>04.05.2002 fixed a problem with xpa contour load.</tt></li> <li> <tt>04.22.2002 ds9 version 2.1 released to the public.</tt></li> </ol> <h4> <b>Version 2.1b7</b></h4> <ol> <li> <tt>04.02.2002 upgrade to XPA 2.1.0e2. This fixes a problem with xpa and linux/linuxppc.</tt></li> <li> <tt>04.03.2002 fixed a problem with AST. plot.c, line 19463, change parameter 'force' from 1 to 0 in call to 'CheckLabels'. Sometimes we were seeing adj labels that where the same. This change makes sure that the labels are 'reduced' if we have this condition.</tt></li> <li> <tt>04.03.2002 ds9 will now automatically open as a bin table fits extension named EVENTS, STDEVT, and RAYEVENT.</tt></li> <li> <tt>04.03.2002 when trying to find an image to open in relax mode (ie the use did not specify an extension), ds9 will not find a valid image if the length of either axis is 0.</tt></li> <li> <tt>04.03.2002 now check for Ghostscript version 6.50 or higher when invoking Save As.</tt></li> <li> <tt>04.03.2002 add help application preference. Users can now choose between Netscape and Mozilla as the prefered help application.</tt></li> <li> <tt>04.04.2002 ds9 version 2.1b7 released to the public.</tt></li> </ol> <h4> <b>Version 2.1b6</b></h4> <ol> <li> <tt>02.04.2002 upgraded to ast version 1.8.6. Modified ast to use sscanf() for all platforms except Darwin. Darwin uses astSscanf(), which works around a problem with sscanf() on MacOSX, with format strings of the following format: sscanf(str, " %s %n", foo, &amp;nc).</tt></li> <li> <tt>02.04.2002 changed fity++ primary_/head_ header relationship. primary_ is only set if there is a primary header is available and different from head_.</tt></li> <li> <tt>02.04.2002 wsc's are init'd with both the head_ and the primary_ (if available) to handle the case where wcs keywords are spread between hdu nd primary headers in mulitiple extension files.</tt></li> <li> <tt>02.06.2002 all xpa commands are now 'catch{}' to invoke a procedure that will unwind the watch cursor stack. Hopefully, no more stuck watch cursors.</tt></li> <li> <tt>02.07.2002 add <i>color</i> and <i>width</i> parameters to contours paste command. defaults are <i>green</i> and <i>1</i></tt></li> <li> <tt>02.08.2002 fixed a problem with the FRAME menu. It was cutting off the last separator.</tt></li> <li> <tt>02.12.2002 AST grid still does not support ICRS properly. When a user sets the coordinate system to ICRS, the actually parameters sent to the AST grid code is FK5</tt></li> <li> <tt>02.13.2002 for XPA points array, fits, regions, and wcs (fillbuf=false), manually flush the buffer at the end to make sure no data is left</tt></li> <li> <tt>02.13.2002 ecliptic coords from wcssubs corrected by new version of wcs/wcscon.c</tt></li> <li> <tt>02.13.2002 AST grids, corrected the MDJ-OBS keyword generated to generate the correct EPOCH.</tt></li> <li> <tt>02.13.2002 adjusted the EQUINOX value for ECLIPTIC coords for ast grids to agree with wcssubs. Seems for ecliptic coords, wcssubs and ast use two slightly different interpretations of the EQUINOX value.</tt></li> <li> <tt>02.13.2002 fixed a problem with histogram equalization introduced in version 2.1b5.</tt></li> <li> <tt>02.14.2002 fixed a problem with titles in plot(stdin). We now take the first line, and starting from the end, pick off the dimension, x and y axis titles, and the remainder is taken as the plot title. It can contain spaces and special characters such as '[]'</tt></li> <li> <tt>02.14.2002 add 'Always create new plot' option to prefs</tt></li> <li> <tt>02.14.2002 add multiple analysis plots, unless prefs are unset</tt></li> <li> <tt>02.14.2002 change default annulus and panda to 1 annuli</tt></li> <li> <tt>02.14.2002 enable multiple array loads via blueplate dialog</tt></li> <li> <tt>02.14.2002 reset,append, and replace wcs now processes OBJECT keyword</tt></li> <li> <tt>02.15.2002 fixed a problem with grid format of degrees. Sometimes, the incorrect format would be used. This was corrected by up'ng the number of digits displayed to d.3</tt></li> <li> <tt>02.21.2002 upgraded to AST 1.8.7</tt></li> <li> <tt>02.21.2002 upgraded to WCS 3.0.7</tt></li> <li> <tt>02.22.2002 fixed a problem with Ascii Tables in fitsy++. The column offset is now calculated from TBCOLn if present.</tt></li> <li> <tt>02.22.2002 simplied columns in fitsy++. Now all columns have a value(char* ptr, int i) and str(char* ptr, int i) procedure.</tt></li> <li> <tt>02.22.2002 add support for HST WFPC2 mosaics</tt></li> <li> <tt>02.25.2002 fixed a problem with 'marker command'. The command STRING must be quoted by '\{' '\}' before being pasted to the Frame parser.</tt></li> <li> <tt>02.26.2002 add $ERROR/ERROR: support for analysis $plot(stdin) macro.</tt></li> <li> <tt>02.26.2002 analysis menus now support multiple levels of hierarchical menus</tt></li> <li> <tt>02.26.2002 multiple hierarchical menus may have the same label</tt></li> <li> <tt>02.26.2002 hierarchical menu label may have an imbedded spaces</tt></li> <li> <tt>02.26.2002 add endhmenu endparam to analysis file parser</tt></li> <li> <tt>02.26.2002 analysis file text maybe indented</tt></li> <li> <tt>02.26.2002 add help support to analysis file</tt></li> <li> <tt>02.27.2002 add $BEGINTEXT/$ENDTEXT to $plot(stdin) macro</tt></li> <li> <tt>02.27.2002 add xpa get fits [type|image|table] command</tt></li> <li> <tt>02.27.2002 minor tweak with the File:Save as menu</tt></li> <li> <tt>02.27.2002 clean up some minor memory leaks with FitsImage::initwcs()</tt></li> <li> <tt>02.27.2002 fixed a problem in dialog.tcl DialogWait and reseting errorInfo</tt></li> <li> <tt>03.01.2002 dss non-save file now uses internal gz</tt></li> <li> <tt>03.04.2002 plot windows can now support a second set of y and error values.</tt></li> <li> <tt>03.05.2002 add debug iis option</tt></li> <li> <tt>03.05.2002 filenames now always reflect fits extension name/number and filter.</tt></li> <li> <tt>03.05.2002 the last step in analysis commands now replaces all '][' with ',', building up readable filters.</tt></li> <li> <tt>03.06.2002 updated nan.C and nan.h to reflect erics new treatment of alpha</tt></li> <li> <tt>03.08.2002 add support for save fits gz</tt></li> <li> <tt>03.12.2002 keywords BSCALE/BZERO/BLANK are now ignored for FITS IEEE floating point data</tt></li> <li> <tt>03.12.2002 IEEE nan and inf are supported as valid FITS IEEE floating point data</tt></li> <li> <tt>03.13.2002 add fits.sh test suite which tests for bitpix = 8,16,32,-32,-64 and BLANK,BSCALE,BZERO keywords, and IEEE floating point data NaN and INF.</tt></li> <li> <tt>03.15.2002 add save resample support</tt></li> <li> <tt>03.18.2002 add support for Mosaic Fast Render. Only valid for IRAF mosaics. Basically, you track the current fitsimage til you have miss.</tt></li> <li> <tt>03.19.2002 upgrade XPA 2.1.0e</tt></li> <li> <tt>03.19.2002 upgrade FILTER 1.1.0e</tt></li> <li> <tt>03.19.2002 upgrade FITSY 1.1.0e</tt></li> <li> <tt>03.19.2002 fixed a problem when a user CUT a region that had a dialog box open. A CUT operation now calls the delete callback to remove any pending dialog boxes.</tt></li> <li> <tt>03.19.2002 fixed a problem with -print command line option for truecolor visuals. We need to make sure that the window is realized so that the colormap has been created.</tt></li> <li> <tt>03.20.2002 ds9 version 2.1b6 released to the public</tt></li> </ol> <h4> <b>Version 2.1b5</b></h4> <ol> <li> <tt>fixed a problem with bogus wcs data and replace wcs xpa command</tt></li> <li> <tt>add view tickmarks to grid dialog box</tt></li> <li> <tt>fixed a problem with loading a custom colormap and then printing</tt></li> <li> <tt>add command line/xpa option load colormap file</tt></li> <li> <tt>fixed problems with grid dialog box and switching between frames</tt></li> <li> <tt>add command line option pan</tt></li> <li> <tt>add command line option about</tt></li> <li> <tt>add command line option view</tt></li> <li> <tt>gzip compression is now built-in</tt></li> <li> <tt>add xpa fits [mosaic|mosaicimage]</tt></li> <li> <tt>fixed a problem with loading arrays via stdin</tt></li> <li> <tt>fixed a problem with the panda region and rotation</tt></li> <li> <tt>improved performance in plotting of large data sets</tt></li> <li> <tt>fixed a problem with xpa analysis plot stdin and ';' in the title</tt></li> <li> <tt>increased the histequ internal buffer size to 16k</tt></li> <li> <tt>enhance xpa analysis load command</tt></li> <li> <tt>add multiple preload analysis files</tt></li> <li> <tt>add hiearch analysis menus</tt></li> <li> <tt>fixed cancel support for Namesvr</tt></li> <li> <tt>fixed cancel support for DSS</tt></li> <li> <tt>add virtual observatory support</tt></li> <li> <tt>add jpeg,tiff,pgn,ppm support, via ghostscript</tt></li> <li> <tt>fix a problem with min/max and DATASEC</tt></li> <li> <tt>added 'load incr' commands</tt></li> <li> <tt>added 'load xxxxx incr' command</tt></li> <li> <tt>fixed minor memory leaks</tt></li> <li> <tt>added analysis command log</tt></li> <li> <tt>add xpa grid load/save</tt></li> <li> <tt>add command line option grid</tt></li> <li> <tt>fixed a problem with loading fits from a stream where the primary hdu contains an image</tt></li> <li> <tt>enhance xpa/command support for dss</tt></li> <li> <tt>add nameserver command line option</tt></li> <li> <tt>fix a problem with panner and magnifer preferences</tt></li> <li> <tt>fixed a issue when gz files are a few bytes short</tt></li> <li> <tt>add support for wcs mosaics</tt></li> <li> <tt>added support for wcs grids for all types of mosaics</tt></li> <li> <tt>speed up printing by factor of 5</tt></li> <li> <tt>add new grid type</tt></li> <li> <tt>updated to wcssubs 3.0.5</tt></li> <li> <tt>updated to ast 1.8.3</tt></li> <li> <tt>updated to filter 1.0b9</tt></li> <li> <tt>updated to fitsy 1.0b9</tt></li> <li> <tt>command line options -file, -mosaic, -mosaicimage, -array, -url are now modal</tt></li> <li> <tt>add -debug [options] support</tt></li> <li> <tt>fixed a problem with contours and NAN data</tt></li> <li> <tt>fixed a problem with contours and DATASEC</tt></li> <li> <tt>split the pros, saoimage, and saotng parsers</tt></li> <li> <tt>fixed a problem with text with the saotng parser</tt></li> <li> <tt>fixed a problem with saotng,saoimage, and pros regions parsers and \n terminators</tt></li> <li> <tt>add thin width contours</tt></li> <li> <tt>add thin width grids</tt></li> <li> <tt>fixed a problem with iraf mosaics</tt></li> <li> <tt>10.31.2001 Physical, Amplifier, and Detector coordinates are only displayed if keywords are present</tt></li> <li> <tt>11.1.2001 Diplay header will display primary header if requested</tt></li> <li> <tt>11.1.2001 add xpa cmap value command</tt></li> <li> <tt>11.2.2001 removed support for analysis with files with spaces cause it created a problem with filename with extensions</tt></li> <li> <tt>11.2.2001 fixed a problem with analysis regions files and special characters that was causing a problem with ellipse annlus</tt></li> <li> <tt>11.2.2001 add analysis $file[$region] macro</tt></li> <li> <tt>11.8.2001 fixed a problem with saving pixel table data</tt></li> <li> <tt>11.8.2001 add John Rolls new blueplate special stand dialog box</tt></li> <li> <tt>11.8.2001 removed 'Open Mosaic Images', since you can now do the same from the dialog box</tt></li> <li> <tt>11.8.2001 fixed a problem with printing/saving text from SimpleTextDialog</tt></li> <li> <tt>11.9.2001 load muliple files is now much faster</tt></li> <li> <tt>11.13.2001 fixed a problem with Simple List Box and windows</tt></li> <li> <tt>11.13.2001 default standard dialog box for windows is now the windows default</tt></li> <li> <tt>12.3.2001 expand update to update [now]</tt></li> <li> <tt>12.4.2001 fitsy++ now promotes all keyword finds to uppercase</tt></li> <li> <tt>12.4.2001 add 'get fits header # keyword &lt;str&gt;' command</tt></li> <li> <tt>12.4.2001 fix a problem with selecting projection region at high zoom factors</tt></li> <li> <tt>12.5.2001 fixed problems with length and orientation of projection region</tt></li> <li> <tt>12.6.2001 change 'get data values' syntax to include fits #</tt></li> <li> <tt>12.14.2001 fixed a problem with mosaics with linear wcs that caused a core</tt></li> <li> <tt>12.31.2001 supported added for regions and mosaics</tt></li> <li> <tt>1.2.2002 projection regions now support mosaics</tt></li> <li> <tt>1.3.2002 updated xparemote with proxy support</tt></li> <li> <tt>1.3.2002 add vo prefs</tt></li> <li> <tt>1.4.2002 add ciao pie region support</tt></li> <li> <tt>1.7.2002 fixed panda and wcs with rotation problem</tt></li> <li> <tt>1.9.2002 uprade ast to version 1.8.4</tt></li> <li> <tt>1.15.2002 enable Blt_ZoomStack for data plots</tt></li> <li> <tt>1.17.2002 fixed a problem with iraf mosaics with flipped segments and a round off problem</tt></li> <li> <tt>1.18.2002 add support for multiple aux contours</tt></li> <li> <tt>1.23.2002 fixed a problem with fits headers and the END keyword is not 8 chars</tt></li> <li> <tt>1.23.2002 fixed many problems with no fits loaded and user gui actions</tt></li> <li> <tt>1.24.2002 fixed a problem with looking for fits region extensions and a filter specified</tt></li> <li> <tt>1.24.2002 add regions file format and coord system to prefs menu</tt></li> <li> <tt>1.25.2002 get data values now spans mosaics and is in native coords</tt></li> <li> <tt>1.31.2002 ds9 version 2.1b5 released to the public</tt></li> </ol> <h4> <b>Version 2.1b4</b></h4> <ol> <li> <tt>fixed a problem very, very large images and int overflow</tt></li> <li> <tt>add Page Setup preferences</tt></li> <li> <tt>plot data is filtered to remove all non numeric data</tt></li> <li> <tt>fixed a problem with plotting x,y data on alpha</tt></li> <li> <tt>add manual grid layout</tt></li> <li> <tt>text regions can now be rotated</tt></li> <li> <tt>regions text now appears in the magnifier</tt></li> <li> <tt>added the PANDA region</tt></li> <li> <tt>added analysis file macro $entry</tt></li> <li> <tt>fixed a problem with multiple menu entries for analysis files with multiple file templates</tt></li> <li> <tt>default values of Analysis file parameters are now updated</tt></li> <li> <tt>fixed a problem with clear analysis commands</tt></li> <li> <tt>analysis tasks are now non-blocking</tt></li> <li> <tt>add xy regions file format</tt></li> <li> <tt>fixed problem with ps level 2 psuedocolor8 printing and inverse colormaps</tt></li> <li> <tt>in regions files, the comment char '#' comments out til a new-line char</tt></li> <li> <tt>extended $regions macro to include multiple properties and regions format</tt></li> <li> <tt>fixed a problem with loading array data on a little endian machine and the arch is not specified</tt></li> <li> <tt>fixed a problem with histogram equalization</tt></li> <li> <tt>fixed a major problem with all negative float or double data and min/max issues</tt></li> <li> <tt>fixed a problem with $regions and no wcs</tt></li> <li> <tt>fixed a problem with printing ps level 2 and fits with NAN</tt></li> <li> <tt>fixed a problem with running on a msb machine, and displaying on a lsb 24bit machine</tt></li> <li> <tt>unrolled all mosaic algorithms to cycle thru all segments for each pixel</tt></li> <li> <tt>add DATASEC for rendering and printing</tt></li> <li> <tt>upgraded to tcl/tk 8.3.3</tt></li> <li> <tt>add http and ftp macro expand to analysis</tt></li> <li> <tt>fixed a problem with contour log scale</tt></li> <li> <tt>add button 2 bindinds for panner</tt></li> <li> <tt>iraf -fifo default is now /dev/imt1</tt></li> <li> <tt>commented out error messages for bad iraf -fifo, -port, -unix</tt></li> <li> <tt>add default imtoolrc values to fb_config if no imtoolrc file is found at startup</tt></li> <li> <tt>add iis support for windows port</tt></li> <li> <tt>add command: get data coordsys x y dx dy var</tt></li> <li> <tt>add plot limits to plot tool</tt></li> <li> <tt>add PROJECTION region</tt></li> <li> <tt>add GETURL analysis macro</tt></li> <li> <tt>Fits bin table keywords TUNITx are now process if available</tt></li> <li> <tt>add $filename(root) macro</tt></li> <li> <tt>update filename on load</tt></li> <li> <tt>fixed a problem with Colormaps with a name with a single character</tt></li> <li> <tt>added iraf 'non-display' imexamine support</tt></li> </ol> <h4> <b>Version 2.1b3</b></h4> <ol> <li> <tt>fixed a problem with angles of regions specified in WCS</tt></li> <li> <tt>add xpa point 'regions save'</tt></li> <li> <tt>add xpa point 'regions load'</tt></li> <li> <tt>regions file format <i>SAOIMAGE</i> now supports annulus, ellipse annulus, and box annulus</tt></li> <li> <tt>the obsolete <i>Ftools</i> regions file format support has been removed</tt></li> <li> <tt>fixed many problems with <i>IRAF</i> regions file format</tt></li> <li> <tt>fixed many problems with <i>CIAO</i> regions file format</tt></li> <li> <tt>removed all support for Rosat All Sky Survey</tt></li> <li> <tt>all comments and global settings have been removed from regions output if delimiter is set to semicolon</tt></li> <li> <tt>fixed a problem with regions defined in WCS degrees and do not lie on an image</tt></li> <li> <tt>fixed a problem with ellipse annulus and box annulus regions in regions files that contain only one region</tt></li> <li> <tt>check for radius of length 0 for circle, annulus, ellipse, and ellipse annulus</tt></li> <li> <tt>Added Histogram Equalization colormap scale distribution</tt></li> <li> <tt>removed <i>default</i> as font option</tt></li> <li> <tt>default font is now <i>helvetica</i></tt></li> <li> <tt>changed command line option -regionfile to -region</tt></li> <li> <tt>fixed a problem with command line option -region and incorrect coordinates</tt></li> <li> <tt>Change the 'Scale:User Limits...' dialog into non-modal 'Scale Parameters...'</tt></li> <li> <tt>Added 'ZMax' Scale Limits algorithm</tt></li> <li> <tt>fixed a problem with loading regions files with full pathnames with 'fits' in them</tt></li> <li> <tt>Updated Prefs, command line options, and xpa points to reflect the new way minmax and scale options are handled</tt></li> <li> <tt>Removed 'Scan On Load' prefs</tt></li> <li> <tt>Added 'Source/Background' region property</tt></li> <li> <tt>Add support for 'Source/Background' region property to SAOtng region parser</tt></li> <li> <tt>Fixed a color problem with pseudocolor 8 frames and black/white. This showed up in new Sun hardware and Solaris 8 sofware</tt></li> <li> <tt>Fixed a problem with Postscript printing in pseudocolor 8 colormode</tt></li> <li> <tt>The magnifier now updates during blinking</tt></li> <li> <tt>Added pixel table commands to command line options and xpa</tt></li> <li> <tt>Add -single command line option</tt></li> <li> <tt>Add default region shape to preferences</tt></li> <li> <tt>New Analysis File format supported, with new macros $message, $text, $plot</tt></li> <li> <tt>Add -analysis command line option</tt></li> <li> <tt>Add subcommands to xpa <i>analysis:</i> load,clear,message,text,plot</tt></li> <li> <tt>Add Analysis File macros $data and $image</tt></li> <li> <tt>Add autoload FITS regions option</tt></li> <li> <tt>Add load FITS Region file to command line options and xpa regions</tt></li> <li> <tt>DSS servers now have limits as to size of image downloaded</tt></li> <li> <tt>Open Array now presents a dialog box if no specs are given</tt></li> <li> <tt>Now supports compression with .ftz extension</tt></li> <li> <tt>All non-modal windows raise to top when re-invoked</tt></li> <li> <tt>Added Line Width to all regions</tt></li> <li> <tt>Comments are now retained for regions files</tt></li> <li> <tt>Add Line Width to contours</tt></li> <li> <tt>Changed xpa delim to strip yes/no</tt></li> <li> <tt>Contour methods are 'Faster' and 'Better'</tt></li> <li> <tt>Add Convert Contours to polygons</tt></li> <li> <tt>Add $xpa analysis macro</tt></li> <li> <tt>Add $param analysis macros</tt></li> <li> <tt>Fixed a problem with crosshair and rebinning</tt></li> <li> <tt>Fixed a problem with pan click and drag and fits binary tables</tt></li> <li> <tt>Add undo regions</tt></li> <li> <tt>Add cut/copy/paste regions</tt></li> <li> <tt>Changed the preferences file and startup file to be consistent across platforms</tt></li> <li> <tt>Add 'Pan then Zoom' to button 2 options</tt></li> <li> <tt>Add support for FITS 3D data cubes</tt></li> <li> <tt>Add Edit button row</tt></li> <li> <tt>Add default mode to prefs</tt></li> <li> <tt>Fixed a problem with file names starting with 'file'</tt></li> <li> <tt>Add xpa regions shape/color/width</tt></li> </ol> </ol> </body> </html> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r2.2.html��������������������������������������������������������������������000644 �000765 �000000 �00000044006 10415010756 016624� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 2.2 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100">Version 2.2 Release Notes</h3> <ol> <h4> <b>Version 2.2.1</b></h4> <ol> <li> <tt>11.04.2002 fixed bin smooth buttons.</tt></li> <li> <tt>11.07.2002 remove debug statements in dss.tcl</tt></li> <li> <tt>11.07.2002 fixed a problem with pure virtual method called when frame was deleted and histequ was the active scale.</tt></li> <li> <tt>11.07.2002 fixed a problem with pasting filters that contains '\n' on the end of the string.</tt></li> <li> <tt>11.14.2002 add W3Browse to archive menu</tt></li> <li> <tt>11.14.2002 Web Display: for redirection, first use 'location' meta data parameter, then look for first 'href' in html to find the redirection url.</tt></li> <li> <tt>11.14.2002 move 'IISInit' after 'ProcessCommandLine' so that iis command line options take affect.</tt></li> <li> <tt>11.14.2002 remove menu short cut options. Too many conflicts and unable to support multiple languages.</tt></li> <li> <tt>11.18.2002 change prefs(scalemode) to prefs(scale,mode), prefs(scalescope) to prefs(scale,scope) and added prefs(scale,scope) to prefs written.</tt></li> <li> <tt>11.18.2002 change prefs(minmaxmode) to prefs(minmax,mode), prefs(minmaxsample) to prefs(minmax,sample)</tt></li> <li> <tt>11.18.2002 changes to Archive Servers preferences take effect immediately.</tt></li> <li> <tt>11.19.2002 Web Display: improved support for fits mime-types.</tt></li> <li> <tt>11.20.2002 Web Display: improved HVVerifyURL repairing urls.</tt></li> <li> <tt>11.20.2002 Archive: add IRAS MSX support.</tt></li> <li> <tt>11.22.2002 add 'update now' when a new display is received. This will allow 'movies' from iraf to display properly.</tt></li> <li> <tt>11.22.2002 ds9 version 2.2.1 released to the public.</tt></li> </ol> <h4> <b>Version 2.2</b></h4> <ol> <li> <tt>09.03.2002 add Archive Server user prefs.</tt></li> <li> <tt>09.03.2002 when HV window is unable to parse input, place a html header around it and display it as text.</tt></li> <li> <tt>09.04.2002 update FITS Bin Table WCS keywords to conform to 25 June 2002 WCS FITS Documentation.</tt></li> <li> <tt>09.04.2002 add support for FITS Bin Table Alt WCS keywords.</tt></li> <li> <tt>09.04.2002 corrected minor errors in xpa documentation.</tt></li> <li> <tt>09.04.2002 fixed a minor memory leak when frame is deleted and an image is still loaded.</tt></li> <li> <tt>09.05.2002 added IPAC NED to archive menu.</tt></li> <li> <tt>09.05.2002 add 'marker # move to canvas x y' command for CXC.</tt></li> <li> <tt>09.05.2002 add 'marker # angle' command for CXC.</tt></li> <li> <tt>09.09.2002 change ds9 regions syntax for ellipse annulus and box annulus from old saoimage to funtools syntax.</tt></li> <li> <tt>09.10.2002 undid grid WIDGETBB fix. The results where not acceptable.</tt></li> <li> <tt>09.12.2002 fixed a nasty bug with binning FITS bin tables and high bin factor values.</tt></li> <li> <tt>09.13.2002 add Match Scales to Frame menu. This matches all scale parameters across all frames.</tt></li> <li> <tt>09.16.2002 add Grid debug option.</tt></li> <li> <tt>09.17.2002 upgrade to ast 1.8.9. This corrected two problems. First, incorrect grids were generated for dss images in the southern hemisphere. Second, a problem with galactic grids that crossed 0 degrees.</tt></li> <li> <tt>09.17.2002 modify grid code to not to set attributes unless really needed. ast 1.8.9 tends to set attributes much more often than previous versions.</tt></li> <li> <tt>09.17.2002 fixed a problem with reconizing non-standard wcs in the header.</tt></li> <li> <tt>09.17.2002 add more xpa grid support for coordinate systems, grid type, and view options.</tt></li> <li> <tt>09.18.2002 fixed grid axes label and title spacing problems in publication mode.</tt></li> <li> <tt>09.18.2002 add optional grid axes label and title spacing parameters that override internal calculated values.</tt></li> <li> <tt>09.18.2002 the grid x-axis is now plotted on the bottom of publication grid.</tt></li> <li> <tt>09.18.2002 zoom to fit now makes room for labels for publication grid.</tt></li> <li> <tt>09.19.2002 fixed a problem with Clear Analysis File that deleted too much of the Analysis Menu.</tt></li> <li> <tt>09.19.2002 support new vo list syntax of a tab delimited newline terminated list of three parameters, xpa, title, and url.</tt></li> <li> <tt>09.20.2002 PHYSICAL Coordinate System: first look for WCSNAMEx='PHYSICAL', then look for LTM/LTV keywords.</tt></li> <li> <tt>09.24.2002 fixed yet another bug with binning, and TLMIN/TLMAX keywords whose values were not powers of 2.</tt></li> <li> <tt>09.24.2002 fixed a problem with cores and bad wcs grids. ds9 now checks to make sure ast generated a vaild grid.</tt></li> <li> <tt>09.24.2002 WebDisplay: plain text is now displayed using &lt;pre&gt;.</tt></li> <li> <tt>09.24.2002 WebDisplay: default method for forms is now GET.</tt></li> <li> <tt>09.24.2002 WebDisplay: default width for TEXT form elements is 20</tt></li> <li> <tt>09.24.2002 XPA nameserver: http has a error, so just clear errorInfo.</tt></li> <li> <tt>09.25.2002 fixed a bug in wcsinit.c, line 328 and line 409.</tt></li> <li> <tt>09.25.2002 add Debug Bin option.</tt></li> <li> <tt>09.26.2002 upgrade to xpa 2.1.3</tt></li> <li> <tt>09.26.2002 upgrade to wcssubs 3.1.3</tt></li> <li> <tt>09.26.2002 upgrade to filter 1.2b1</tt></li> <li> <tt>09.26.2002 upgrade to fitsy 1.2b1</tt></li> <li> <tt>10.01.2002 Web Display: more robust URL parseing</tt></li> <li> <tt>10.01.2002 Web Display: add 'Save to Fits File' option</tt></li> <li> <tt>10.01.2002 fixed 'xpaget ds9 bin cols' to return only 2 cols if bin depth is 1.</tt></li> <li> <tt>10.07.2002 Web Display: add support for new window with button click.</tt></li> <li> <tt>10.08.2002 Change in saotk Makefiles to correct a problem with Bison and Flex.</tt></li> <li> <tt>10.08.2002 Analysis Text now updates as text arrives.</tt></li> <li> <tt>10.08.2002 add xpa/command line support for MatchFrames.</tt></li> <li> <tt>10.08.2002 don't write WCS for Save Fits Resample and DSS fits.</tt></li> <li> <tt>10.10.2002 Web Display: hidden fields are not totally encoded if url is present.</tt></li> <li> <tt>10.17.2002 Fixed a problem with default fonts. Add the option of 'Default', which will not set any font options, if selected. This allows the native system to choose the best font/size combo.</tt></li> <li> <tt>10.18.2002 Add ProcessFrameCmd.</tt></li> <li> <tt>10.18.2002 Add system wide preference file support.</tt></li> <li> <tt>10.18.2002 Add Default mode. It just updates the infobox and graphs, with no regions.</tt></li> <li> <tt>10.21.2002 Fixed a problem with old prefs files and marker(system).</tt></li> <li> <tt>10.22.2002 Fixed a problem with MINMAX Sample. Sample intervals are now equal in row and columns.</tt></li> <li> <tt>10.25.2002 Fixed a problem with vo and errors that occur when connecting to the vo server.</tt></li> <li> <tt>10.25.2002 Add Match Colorbars and Match Scales xpa/command line options.</tt></li> <li> <tt>10.25.2002 Changed Analysis plot error reporting to include first line of received data.</tt></li> <li> <tt>10.25.2002 Fixed a problem with DSS and editing the dialog with another image loaded.</tt></li> <li> <tt>10.27.2002 Add filename to ds9/funtools regions file header.</tt></li> <li> <tt>10.29.2002 Add Lock Crosshairs xpa/command line options.</tt></li> <li> <tt>10.31.2002 ds9 version 2.2 released to public.</tt></li> <h4> <b>Version 2.2b2</b></h4> </ol> <ol> <li> <tt>07.31.2002 fixed a problem with hv and urls of the form foo.com/foo/bar.html#foo. Now, the html is not reloaded before the goto is executed.</tt></li> <li> <tt>08.01.2002 add adjust text size support to web browser</tt></li> <li> <tt>08.01.2002 add boxcar and tophat smooth support for binning.</tt></li> <li> <tt>08.05.2002 add -vo commandline and xpa support</tt></li> <li> <tt>08.05.2002 fixed a problem for the windows port where windows has been configured to open a fits file with ds9. In this case, the file path name passed to ds9 is actually in 'dos' format. So we used a cygwin function to convert to a posix format. This only occurs in a command line file name option.</tt></li> <li> <tt>08.06.2002 fixed a problem with smooth and depth&gt;1.</tt></li> <li> <tt>08.06.2002 fixed a problem with save fits resample.</tt></li> <li> <tt>08.07.2002 the user can now display the horz and vert graphs, even in tile or blink mode</tt></li> <li> <tt>08.07.2002 ds9 will operate in single mode, even if in tile or blink mode, if there is just one frame.</tt></li> <li> <tt>08.08.2002 add Gaussian smooth support for binning.</tt></li> <li> <tt>08.08.2002 fixed a problem with the plot tool and displaying discrete x y e1 y2 data. The correct colors are now used.</tt></li> <li> <tt>08.08.2002 the plot tool will now always update the plot title, x axis label, and y axis label when receiving new data.</tt></li> <li> <tt>08.08.2002 add xpaset -p ds9 analysis plot close support.</tt></li> <li> <tt>08.08.2002 add Know Issues Documentation</tt></li> <li> <tt>08.12.2002 add http proxy support.</tt></li> <li> <tt>08.12.2002 fixed a problem with the close box for the bin dialog box.</tt></li> <li> <tt>08.20.2002 add support for default fonts to preferences.</tt></li> <li> <tt>08.23.2002 remove timeouts for all http requests with optional cancel support.</tt></li> <li> <tt>08.23.2002 fixed a number of items with web display.</tt></li> <li> <tt>08.26.2002 reformat all documentation to remove references to Helvetica</tt></li> <li> <tt>08.26.2002 bring grid WIDGETBB in by one so that the border can be seen and printed.</tt></li> <li> <tt>08.26.2002 fixed a problem with web gifs under windows. The output channel needed an -translation binary flag.</tt></li> <li> <tt>08.26.2002 adjust font sizes for web display to more closely follow those of Netscape and IE.</tt></li> <li> <tt>08.27.2002 add 'Save as Fits', 'Save as Image', and 'Page Setup' buttons.</tt></li> <li> <tt>08.27.2002 add 'First' and 'NVSS' archive server menu items.</tt></li> <li> <tt>08.28.2002 add auto coordinate feed to HV for archive servers.</tt></li> <li> <tt>08.30.2002 ds9 version 2.2b2 released to public.</tt></li> </ol> <h4> <b>Version 2.2b1</b></h4> <ol> <li> <tt>04.05.2002 fixed a problem with xpa contour load.</tt></li> <li> <tt>04.05.2002 improved parsing of analysis menu file. In particular, keywords like 'help', 'param', and 'end' can be used more freely.</tt></li> <li> <tt>04.10.2002 add tag suppport for regions.</tt></li> <li> <tt>04.11.2002 add background marker stack. The default stack is in the foreground.</tt></li> <li> <tt>04.11.2002 fixed checks for can Edit, can Move, can Rotate, and can Delete properties thru out marker code.</tt></li> <li> <tt>04.11.2002 add HIGHLITE marker property.</tt></li> <li> <tt>04.12.2002 add $null macro to analysis support.</tt></li> <li> <tt>04.17.2002 fitsy++ now builds an keyword index to search for keywords. Previously, it would search sequentially.</tt></li> <li> <tt>04.18.2002 add a fix to ps level 2 driver to prevent a '\n%' in the image data. Seems the perl script 'assemble' does a global search/replace that results in corrupted image data. This fix includes a redesign of a previous fix that worked around an issue with old versions of dvips that will incorrectly process'\n%%'.</tt></li> <li> <tt>04.18.2002 upgrade to WCS 3.1.0</tt></li> <li> <tt>04.24.2002 start to add support for multiple wcs's.</tt></li> <li> <tt>04.25.2002 add support for multiple wcs's in infobox.</tt></li> <li> <tt>04.26.2002 improve tag support for regions. All functionality of selected regions are now available for tagged regions.</tt></li> <li> <tt>04.30.2002 add marker command var command to support regions files in tcl vars.</tt></li> <li> <tt>05.08.2002 recalc polygon center when adding or deleteing vertex.</tt></li> <li> <tt>05.13.2002 complete implementation of multiple wcs support. ds9 now supports a total of 31 coordinate systems. Furthermore, of the 27 WCS coordinate systems, both sky coordinates and linear coordinates are fully supported.</tt></li> <li> <tt>05.13.2002 complete re-implemenation of map() functions. Now all map functions are in the fits case, and only map between REF and IMAGE/PHYSICAL/AMPLIFIER/DETECTOR/WCS/WCSA... coordinate systems. This cleans up alot of code and confusion.</tt></li> <li> <tt>05.14.2002 add support for TCROT and CDn_1 WCS keywords in FITS bin tables.</tt></li> <li> <tt>05.16.2002 dramatically speed up parsing wcs keywords by substituting the fitsy++ index based keyword search routine for Doug Mink's 'ksearch' routine. With multiple wcs's in a large mosaic this can save up to a minute at load time.</tt></li> <li> <tt>05.16.2002 fixed a minor problem with xpa dss. http has a error, that carries over and is caught by xpa.</tt></li> <li> <tt>05.16.2002 analysis $text windows will not appear if there is no output, or just an &lt;cr&gt;.</tt></li> <li> <tt>05.16.2002 fixed display header to correctly display 80 chars, not 79.</tt></li> <li> <tt>05.16.2002 fixed a problem with iis and very long file names. names up to 256 chars are now allowed.</tt></li> <li> <tt>005.20.2002 AMPLIFER and DETECTOR coordinate menu entries are now an option, to be enabled via the Preferences:Misc menu option. Changes will take affect at startup.</tt></li> <li> <tt>05.23.2002 add support for 3D binning of fits bin tables.</tt></li> <li> <tt>05.24.2002 made changes to grid.C to handle the special LONG/NPOL skyframe coordinate system used by Chandra.</tt></li> <li> <tt>05.24.2002 add -xpa and xpa prefs to allow a user to enable or disable initialization of XPA at startup</tt></li> <li> <tt>05.28.2002 add -xpa [inet|local|unix|localhost] xpa point.</tt></li> <li> <tt>05.29.2002 correct 3D binning to properly reflect filter params in the filename.</tt></li> <li> <tt>06.03.2002 fixed a problem with Fits Bin Tables, odd length rows and referencing shorts.</tt></li> <li> <tt>06.04.2002 add support for multiple wcs with skyframe panner compass, along with prefs.</tt></li> <li> <tt>06.04.2002 add -xpa noxpans support.</tt></li> <li> <tt>06.04.2002 match frames wcs now uses the wcs system and wcs skyframe specified in align to wcs.</tt></li> <li> <tt>06.05.2002 upgrade to xpa 2.1.1</tt></li> <li> <tt>06.06.2002 add wcs master menu and buttons</tt></li> <li> <tt>06.06.2002 sync xpa wcs and command line wcs command.</tt></li> <li> <tt>06.10.2002 xpa wcs and commanline -wcs now uses same code to process</tt></li> <li> <tt>06.10.2002 xpa nameserver format now skyformat</tt></li> <li> <tt>06.10.2002 added support for variable args for xpa contour and -contour.</tt></li> <li> <tt>06.11.2002 add match frames physical, amplifier, detector. this does not handle rotation, nor orientation.</tt></li> <li> <tt>06.11.2002 the master wcs menu now modifies the Region:File Coordinate System menu also</tt></li> <li> <tt>06.11.2002 fixed a problem with list projection and linear wcs. the thickness parameter was not written correctly.</tt></li> <li> <tt>06.12.2002 fixed a problem with -tile and -region commandline options. The ds9 window must be realized before processing region files.</tt></li> <li> <tt>06.13.2002 fixed a problem with -pagesetup commandline option.</tt></li> <li> <tt>06.13.2002 fixed a problem with ds9parser.Y, prosparser.Y, and tngparser.Y when processing coordinates when no coordinate system has been specified.</tt></li> <li> <tt>06.13.2002 fixed a problem with -pan to command line option. The ds9 window needs to be realized (and the matrices defined) before processing.</tt></li> <li> <tt>06.13.2002 binning on a third column now invokes the data cube dialog box.</tt></li> <li> <tt>06.14.2002 add smaller buffer sizes to binning menus. We want to do this for those building large 3D binning movies.</tt></li> <li> <tt>06.19.2002 implemented new grid support. Grids now handle rotated images much better. Numerics are better positioned.</tt></li> <li> <tt>06.27.2002 updated to WCSSUBS 3.1.1. This corrects a number of TNX problems.</tt></li> <li> <tt>06.27.2002 add File:XPA info menu item.</tt></li> <li> <tt>06.27.2002 add XPA regions selected feature.</tt></li> <li> <tt>06.28.2002 Analysis $geturl macro calls are now logged.</tt></li> <li> <tt>07.01.2002 add support for limited web browser</tt></li> <li> <tt>07.01.2002 help reference manual now uses built-in brower, and is static.</tt></li> <li> <tt>07.02.2002 fixed a problem with cross-platform displays and 16 bit truecolor.</tt></li> <li> <tt>07.08.2002 fixed a problem with regions and changes in the bin factor of fits bin tables.</tt></li> <li> <tt>07.08.2002 add $xpa_method analysis macro.</tt></li> <li> <tt>07.08.2002 add @@xpa_method@@ support in hv.html</tt></li> <li> <tt>07.22.2002 fix numerous problems with internal web browser.</tt></li> <li> <tt>07.23.2002 add async support for internal web browser.</tt></li> <li> <tt>07.24.2002 changed Makefiles so that parser.C, parser.C.h, and lex.C are now archived. Therefor, builds no longer need bison and flex, unless changes have been made to the parser.Y. This gets around problems with different versions of bison.</tt></li> <li> <tt>07.25.2002 add support for the Compass region.</tt></li> <li> <tt>07.25.2002 add vo proxy and internal hv support.</tt></li> </ol> </ol> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r2.3.html��������������������������������������������������������������������000644 �000765 �000000 �00000005727 10415010756 016634� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 2.3 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <div align="right"> <div align="left"> </div> <h3 align="left"> <font size="-1"></font><img alt="" src="../sun.gif" align="middle" height="98" width="100"> Version 2.3 Release Notes</h3> </div> <ol> <ol> </ol> <h4> <b>Version 2.3b1</b></h4> <ol> <li> <tt>11.04.2002 add multi-language support structure.</tt></li> <li> <tt>12.02.2002 configure http user agent to 'ds9'. This fixes a problem with www.google.com</tt></li> <li> <tt>12.02.2002 add Help DS9 Home Page menu Item.</tt></li> <li> <tt>12.03.2002 Web Display: implemented 'Content-Encoding' and modified 'Mime-Type' to use new proposed FITS Mime-Type RFC.</tt></li> <li> <tt>12.03.2002 Web Display: when the mime-type is set to 'application/octet-stream', try to parse the url, looking for a valid fits or fits.gz image. If so, load as a fits. If not, save to disk.</tt></li> <li> <tt>12.03.2002 Web Display: reduced the size of fonts by -2 to more closely match netscape and internet explorer.</tt></li> <li> <tt>12.03.2002 Web Display: updated Archive menus to use new IRAS web interface.</tt></li> <li> <tt>12.03.2002 Web Display: add font size argument to HV. Now, web sites can have different default font sizes, based on what looks the best.</tt></li> <li> <tt>12.10.2002 Fixed a problem with calculating LTMV keywords from alt WCS keywords in the case of WCSNAME='PHYSICAL'</tt></li> <li> <tt>12.10.2002 Add support for TDMIN and TDMAX FITS bin table keywords.</tt></li> <li> <tt>12.10.2002 Add 'Delete All Frames' support.</tt></li> <li> <tt>12.10.2002 only use fits keyword inheritence if INHERIT keyword is present in the header.</tt></li> <li> <tt>12.11.2002 Fixed a problem with WCS headers and INHERIT, which resulted in duplicate keywords. This made wcssubs very confused.</tt></li> <li> <tt>12.11.2002 Add 'Delete Selected Regions' to Regions menu.</tt></li> <li> <tt>12.11.2002 Add confirmation dialog to 'Delete All Regions'.</tt></li> <li> <tt>12.12.2002 Display Header List dialog is now 40 chars wide.</tt></li> <li> <tt>12.12.2002 Web Display: add initial coordinates to ADS archive sites</tt></li> <li> <tt>12.16.2002 Add *.fit and *.fts to fits dialog box templates.</tt></li> <li> <tt>12.16.2002 Add support for GUI Groups, based on region tags.</tt></li> <li> <tt>12.17.2002 Add HSV colormap.</tt></li> <li> <tt>12.18.2002 Fixed a problem with the PANDA Region at zooms other than 1.</tt></li> <li> <tt>12.19.2002 DS9 version 2.3b1 released to the public.</tt></li> </ol> </ol> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> </body> </html> �����������������������������������������saods9/ds9/doc/release/r3.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000103440 10415010756 016621� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 3.0 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 3.0 Release Notes</h3> <ol> <h4> <b>Version 3.0</b></h4> <ol> <li> <tt>12.24.2002 TCL/TK: update to 8.4.1</tt></li> <li> <tt>12.24.2002 BLT: update to 2.4z</tt></li> <li> <tt>12.24.2002 TKIMG: update to 1.3rc</tt></li> <li> <tt>01.03.2003 XPA: fixed a problem with 'xpaget ds9 regions selected'</tt></li> <li><tt>01.28.2003 SAVEAS: now saves all slices of a data cube, if the display mode is single.</tt></li> <li><tt>01.28.2003 GUI: Add 'wm protocol . WM_DELETE_WINDOW QuitDS9' for main window so that tcl/tk 8.4 does not segv when a user double clicks on a close window icon.</tt></li> <li><tt>01.29.2003 GCC: add support for gcc 3.0/3.2</tt></li> <li><tt>01.29.2002 GCC: updated saotk/FlexLexer.h from flex 2.5.27, available at http://lex.sourceforge.net/<br> </tt></li> <li><tt>02.04.2003 WINDOWS: modify configuration files for tkimg1.3 and tkhtml to support windows.<br> </tt></li> <li><tt>02.05.2003 WCS: upgrade to 3.3.0</tt></li> <li><tt>02.06.2003 ARCHIVE: the default ADS max search size is now a radius of .1 arcmin.</tt></li> <li><tt>02.06.2003 XPA: add '-xpa tcl' command line option. By default, disable xpa tcl access since it is a major security risk.</tt></li> <li><tt>02.07.03 FITS: fixed a problem with loading fits files via the url menu or command line.<br> </tt></li> <li><tt>02.07.03 HTTP: loading images via url http processes the image based on the http header mime type and encoding, not the file name. images loaded via url ftp are still processed based on file name.</tt></li> <li><tt>02.07.03 PLOT: fixed a problem with global vars and the plot widget.</tt></li> <li><tt>02.11.03 BINNING: fixed a bug with the bin table smoothing support. If the bin factor is large enough to bin the entire image in the bin buffer, ds9 would segv by trying to read out of bounds.</tt></li> <li><tt>02.25.03 XPA: fixed a bug with loading an image from xpa stdin without a filename.</tt></li> <li><tt>02.25.03 XPA: add 'fillbuf=false' to all xpa receive commands that do not use $buf. This will speed up processing because the data socket is not opened.</tt></li> <li><tt>02.25.03 XPA: fixed a problem with appending an wcs via xpa. The appended wcs is now positioned at the end, not the beginning. also, a problem occurred when the 'END' card was not the last card of the header. This has been fixed.</tt></li> <li><tt>02.25.03 XPA: changes to xpa regions syntax. 'moveback'/'movefront' are now 'move back'/'move front', 'selectall'/'selectnone' are now 'select all'/'select none', and 'deleteall' is 'delete all'. Backward compatibility has bee maintained</tt></li> <li><tt>02.25.03 XPA: add 'select group &lt;groupname&gt;' and 'delete select' to xpa regions access point.</tt></li> <li><tt>02.26.03 HV: add support for gif,png,ppm,xbm,xpm file formats</tt></li> <li><tt>02.27.03 </tt><tt>HV: </tt><tt>fixed some problems with tkhtml uri resolver. This cleans up a lot of tcl code.</tt></li> <li><tt>03.04.03 HV: images are now scaled if the width/height args are provided in the html src.</tt></li> <li><tt>03.04.03 ARCHIVE: add chandra archive web chaser.</tt></li> <li><tt>03.12.03 COLORMAP: Fixed a problem with InitColorbar and a colormap of A or B.</tt></li> <li><tt>03.12.03 ANALYSIS: all comments after # are ignored.</tt></li> <li><tt>03.12.03 ANALYSIS: non macros can be escaped by using $$.</tt></li> <li><tt>03.31.03 COMMAND: Add -frame command line option.</tt></li> <li><tt>04.08.03 GUI: Remove Magnifier Mode option, along with Magnifier Replicate code.</tt></li> <li><tt>04.23.03 HST WFPC: Mosaic images must be loaded directly. this fixes a problem in that it was not possible to autodect a WFPC2 image in an incoming data stream, such as stdin.</tt></li> <li><tt>05.12.03 API: *** CHANGE *** Frame load syntax has changed to make it consistent across all modes and file formats. In particular, the general syntax is: &lt;frame&gt; load fits|array &lt;filename&gt; mmap|alloc|alloc gz|channel|shared|socket|var &lt;options&gt;</tt></li> <li><tt>05.12.03 API: *** CHANGE *** shared memory loads no longer require the size of the memory segment.</tt></li> <li><tt>05.20.03 WCS: update to 3.3.4</tt></li> <li><tt>05.20.03 AST: update to 2.0</tt></li> <li><tt>05.22.03 GRID: fix a problem with grid.C interface to AST. The text bounding box code was returning the coordinates in a clockwise manner. It needs to be returned in an anti-clockwise manner.</tt></li> <li><tt>05.22.03 GRID: Add support for user specified Grid Axes Numerics gap.</tt></li> <li><tt>05.27.03 GRID: Fixed a problem with the bounding box of a publication grid. it was .5 pixels off.</tt></li> <li><tt>05.28.03 GUI: Fixed a problem with 'get cursor'. Sometimes, as with loading dss images, the matrices were not updated in time, and 'get cursor' returned bogus values. Now all calls to 'get cursor' force an update.</tt></li> <li><tt>06.02.03 GUI: fixed several problems with examine mode</tt></li> <li><tt>06.02.03 ARCHIVE: add NOAO 4MASS and SIRTF and NOAO NSA to archive menu</tt></li> <li><tt>06.09.03 RGB: support is FINISHED! now, lets see how its works!</tt></li> <li><tt>06.11.03 RGB: Add Lock Channels to lock most Scale and Bin parameters between channels.</tt></li> <li><tt>06.16.03 GRID: Add numerics spacing to save/load grid configuration</tt></li> <li><tt>06.16.03 FITS: Add 3D array data cube</tt></li> <li><tt>06.17.03 FITS: Fixed a problem with an incorrect data cube dialog and wfpc2 mosaics and rgb data cubes. Basically, these two cases are not really data cubes.</tt></li> <li><tt>06.17.03 RGB: Replace RGB menu with RGB dialog.</tt></li> <li><tt>06.17.03 XPA: Fixed a problem with xpaget ds9 regions [include|exclude|source|background].</tt></li> <li><tt>06.18.03 REGION: fix a problem with non-linear physical coordinates and save/load regions.</tt></li> <li><tt>06.18.03 WCS: fix a problem with determining the rotation of a wcs coordinate system. previously, CRPIX was used as the start point. This does not work in cases where the tangent point is very far off the image. Instead, (1,1) is used.</tt></li> <li><tt>06.18.03 WCS: Remove preference Panner WCS origin. This is stupid and breaks with the previous change. Just remove it instead of trying to fix it.</tt></li> <li><tt>06.26.03 FITS: Add support 3D array data cubes.</tt></li> <li><tt>06.30.03 RGB: Add support for RGB array data cube.</tt></li> <li><tt>07.01.03 DSS: Fixed namesrv.tcl and dss.tcl to promote more robust error handling. In particular, http error codes are now checked, and the results are verified before proceeding</tt></li> <li><tt>07.01.03 XPA: fixed a problem with $ds9 -xpa tcl. The next argument was being ignored.</tt></li> <li><tt>07.02.03 DSS: fixed another problem with namesrv.tcl. SAONED and SAOSIMBAD were returning incorrect values for southern hemisphere.</tt></li> <li><tt>07.02.03 HTTP: remove http log from preferences and added http log and ftp log to debug menu</tt></li> <li><tt>07.03.03 GUI: fixed a problem with open file dialog box. if the user clicked 'cancel', an error message would result. this has been corrected.</tt></li> <li><tt>07.09.03 FITS: add Large File Support for Linux. Linux is still restricted to ~2.5Gb.</tt></li> <li><tt>07.10.03 FITS: add FLUSH parameter for fitsy++ array.</tt></li> <li><tt>07.10.03 FITS: Major change in behavior of fitsy++ streams and FLUSH. Only socket and socketgz will flush, all others will not flush the buffer after an error, or after successfull loading a fits image.</tt></li> <li><tt>07.11.03 XPA: add DATACUBE support.</tt></li> <li><tt>07.14.03 WCS: Fixed a problem with WCS XLON-TAN (NPOLE) and AST. NPOLE is a special wcs equ coord system, and has to be handed by wcs2ast().</tt></li> <li><tt>07.15.03 XPA: add xpa iis access port for control of some iis functionality.</tt></li> <li> <p><b><tt>07.17.03 RELEASE version 3.0b4</tt></b></p> </li> <li><tt>07.25.03 FITS: add MMAPINCR memory access mode. This only mmaps the data needed, not the entire file. This allows a user to view many small segements of a very large file.</tt></li> <li><tt>07.28.03 TCL/TK: upgrade to 8.4.4</tt></li> <li><tt>07.30.03 XPA: add regions fg/bg support.</tt></li> <li><tt>08.05.03 PLOT: reimplement analaysis plot widget to support unlimited number of data sets.</tt></li> <li><tt>08.07.03 ARCHIVE: add Rosat All-Sky survey</tt></li> <li><tt>08.08.03 XPA: add PLOT, which allows full control over all plot widgets via xpa.</tt></li> <li><tt>08.13.03 COLORMAP: fixed a problem with loading lut colormaps under linux. ifstream behaves differently between solaris and linux.</tt></li> <li><tt>08.14.03 XPA: changed xpaget array. Now returns the array data in the current frame.</tt></li> <li> <p><tt><b>08.15.03 RELEASE version 3.0b5</b></tt></p> </li> <li><tt>08.18.03 FITS: add Large file support for darwin and linuxppc</tt></li> <li><tt>08.18.03 LINUXPPC: fixed a problem with linking linuxppc. The copy of libX11.a that comes with Yellow Dog 3.0 is bad. So we can't links static.</tt></li> <li><tt>08.19.03 XPA: add options to xpa update so that 'update idletasks' is not run at the end of file loads. This allows the user to do several incremental loads without updating the screen.</tt></li> <li><tt>08.19.03 API: only update idletasks for horz/vert graph if graphs are on</tt></li> <li><tt>08.19.03 API: add debug idletasks support.</tt></li> <li><tt>08.29.03 GCC: gcc 3.3 is now supported. For all code, if GNUC &gt;=3, new &lt;sstream&gt; are used. For all code, GNUC &lt;3, &lt;strstream&gt; is used.</tt></li> <li><tt>08.29.03 PLOT: fixed a problem with saving plot data in x,y,ye format</tt></li> <li><tt>08.29.03 FITS: add LFS for solaris.</tt></li> <li><tt>08.29.03 COMMAND: add -analysismenu command line option at the request of CXC.</tt></li> <li><tt>08.29.03 COMMAND: fixed a problem with -pan and -pan to and other comman line options that follow.</tt></li> <li><tt>09.02.03 FITS: add LFS for alpha.</tt></li> <li><tt>09.04.03 SOLARIS: add new solaris64 port. Requires gcc 3.3 or greater.</tt></li> <li><tt>09.04.03 XPA: upgrade to 2.1.4</tt></li> <li><tt>09.04.03 FILTER: upgrade to 1.2.3b1</tt></li> <li><tt>09.04.03 FITSY: upgrade to 1.2.3b1<br> </tt></li> <li><tt>09.06.03 SOLARIS: fixed a problem with 64bit machines and truecolor displays.</tt></li> <li><tt>09.06.03 FITS: add support for multiple extension fits data cubes.</tt></li> <li><tt>09.08.03 REGION: fixed a problem with projection regions and an undefined variable.</tt></li> <li><tt>09.08.03 BINNING: fixed a problem with fits bin tables without TLMIN/TLMAX or TDMIN/TDMAX. the center was incorrectly being calculated.</tt></li> <li><tt>09.08.03 ARCHIVE: fixed a problem with the NOAO archive web display with no images loaded. The variables 'ra' and 'dec' were not defined.</tt></li> <li><tt>09.08.03 PLOT: ixed a problem with the plot widget and the preferences unique plot parameter.</tt></li> <li><tt>09.09.03 PLOT: project plot xaxis are now in coordinate system specified via the marker dialog box.</tt></li> <li><tt>09.11.03 PLOT: fixed a problem with the line, ruler, and projection regions and properly displaying wcs linear coordinates</tt></li> <li><tt>09.11.03 WCS: cleaned up a lot of code for setting/adjusting coordinate menus</tt></li> <li><tt>09.11.03 RGB: loading a new channel in a rgb image will no longer delete regions, grids, or aux contours.</tt></li> <li><tt>09.15.03 FITS: removed BITPIX32 define. using &lt;int&gt; instead since it is defined as a consistent 4 bytes across all platforms.</tt></li> <li><tt>09.18.03 RGB: split lock rgb into lock scale and lock bin.</tt></li> <li><tt>09.21.03 BINNING: frames now have 'memory' of certain bin paramenters. It is now possiable to set bin parameters before loading a bin table.</tt></li> <li><tt>09.22.03 RGB: InfoBox now displays all values for RGB images, not just the current channel value.</tt></li> <li><tt>09.22.03 API: change names of various tcl marker variables</tt></li> <li><tt>09.22.03 REGION: add prefs for regions color, width, properties, font</tt></li> <li><tt>09.22.03 GUI: add HJKL key bindings as substitute for arrow keys</tt></li> <li> <p><tt><b>09.24.03 RELEASE version 3.0b6</b></tt></p> </li> <li><tt>09.29.03 WCS: changes to getWCSRotation, getWCSOrientation to better reflect the actual rotation</tt></li> <li><tt>09.30.03 XPA: add xpa/command line options for configuration of info panel</tt></li> <li><tt>09.30.03 API: change variable 'mosaic(fast)' to 'ds9(mosaic,fast)'</tt></li> <li><tt>09.30.03 FITS: add new support for blank/Inf/NaN background color</tt></li> <li><tt>10.01.03 FITS: add support for image background color.</tt></li> <li><tt>10.01.03 RGB: add support for RGB lock colorbar</tt></li> <li><tt>10.23.03 HV: add support for VO DIS</tt></li> <li><tt>10.23.03 HV: fixed a problem with forms and encrypting field names, allow with the returned value</tt></li> <li><tt>10.23.03 GUI: Change mode 'Default' to 'None'. We can't use the term 'default' because with problems with tcl switchs and the default keyword</tt></li> <li><tt>10.24.03 WCS: add support for WCS AIPS projections via the preferences menu.</tt></li> <li><tt>10.24.03 API: add acknowledgment</tt></li> <li><tt>11.03.03 COMMAND: fixed a problem with command line options -mosaicimage, -mosaicimagewfpc2, -medatacube</tt></li> <li><tt>11.03.03 FITS: fixed a problem with multiple extension data cube with all memory models except MMAPINCR.</tt></li> <li><tt>11.03.03 COMMAND: fixed a problem with command line options -mosaicimagewcs, -mosaicimageiraf, -mosaicimagewfpc2, -medatacube and RGB frames</tt></li> <li><tt>11.05.03 WCS: remove internal wcsZoom matrix. All wcsZoom actions are now applied to the current &nbsp;zoom matrix. This fixes a number of problems with 'Match Frames to WCS'</tt></li> <li><tt>11.05.03 WCS: fixed a problem with rotated images and examine mode.</tt></li> <li><tt>11.07.03 </tt><tt>REGION: f</tt><tt>fixed a problem with regular panda regions. The code incorrectly determined a regulier panda was irregulier and output it as such.</tt></li> <li><tt>11.07.03 REGION: fixed a problem with region angles in general, where there there was a rotation in the wcs.</tt></li> <li><tt>11.07.03 HV: add Server Apache Refresh support.</tt></li> <li><tt>11.07.03 XPA: add xpaget ds9 fits size &lt;coordsys&gt; &lt;skyformat&gt;</tt></li> <li><tt>11.11.03 XPA: add regions group support.</tt></li> <li><tt>12.01.03 WCS: update to 3.5.0</tt></li> <li><tt>12.01.03 XPA: add get contour &lt;coordinate system&gt; &lt;skyframe&gt; support.</tt></li> <li><tt>12.05.03 WCS: update to 3.5.1</tt></li> <li><tt>12.05.03 XPA: upgrade to 2.1.5</tt></li> <li><tt>12.05.03 FILTER: upgrade to 1.2.3</tt></li> <li><tt>12.05.03 FITSY: upgrade to 1.2.3</tt></li> <li><tt>12.05.03 AST: upgrade to 3.0</tt></li> <li><tt>12.05.03 IIS: upgrade to 1.0</tt></li> <li><tt>12.10.03 REGION: casted all XPoint to short. There is a problem with rendering line segments at very high zoom. X11 overflows and the lines become random. We should check that screen coordinates never exceed SHRT_MAX</tt></li> <li><tt>12.10.03 ANALYSIS: geturl() macro is formated before execution.</tt></li> <li><tt>12.11.03 FITs: add mosaic image next wcs support.</tt></li> <li><tt>12.15.03 RGB: fixed a problem with wcs matching when one of the wcs is flipped in XX</tt></li> <li><tt>12.15.03 WCS: </tt><tt>fixed a problem with wcs matching when one of the wcs is flipped in XX</tt></li> <li><tt>12.15.03 REGION: load fits regions now utilitize the current region color, width, and font</tt></li> <li><tt>12.24.03 WCS: back out change #50. We have to use the projection tan point to correctly build mosaics and RGB images.</tt></li> <li><tt>01.09.04 AST: upgrade to 3.1.1</tt></li> <li><tt>01.09.04 GRID: pass PV,PROJP,PS keywords to AST<br> </tt></li> <li><tt>01.12.04 TCLLIB: add tcllib 1.4. This package contains a number of useful tcl packages<br> </tt></li> <li><tt>01.12.04 FTP: upgrade to 2.4</tt></li> <li><tt>01.13.04 TCL: upgrade to 8.4.5</tt></li> <li><tt>01.13.04 TK: upgrade to 8.4.5</tt></li> <li><tt>01.13.04 HTTP: add support for proxy authentication.</tt></li> <li><tt>01.14.04 COMMAND: fixed a problem with printing from the command line. The canvas widget was not fully realized before printing, resulting in no image.</tt></li> <li><tt>01.15.04 MKTCLAPP: made two changes to the default init script of mktclapp. The first sees that the the virtual file system is init'd before the first call to Tcl. This allows Tcl to 'see' encoding files. The second, for windows only, makes sure that the Tcl windows file system is init'd before the first call to Tcl.</tt></li> <li><tt>01.15.04 MKTCLAPP: add default encoding files to ds9.mta, now that we can use them.</tt></li> <li><tt>01.22.04 GUI: Add preference for default temporary file directory.</tt></li> <li><tt>01.23.04 XPA: add xpa imexam.</tt></li> <li><tt>01.25.04 XPA: add xpa fits header.</tt></li> <li><tt>01.25.04 XPA: add xpa fits depth.</tt></li> <li><tt>01.25.04 XPA: modified xpa fits size.</tt></li> <li><tt>01.25.04 GUI: add language support for info and error messages.</tt></li> <li><tt>02.01.04 WCS: more on #50 and #141. If wcs projection is Zenithal, use CRPIX as reference point to determine wcs rotation and oriention. Otherwise, use image center point.</tt></li> <li><tt>02.04.04 CONTOUR: modified smooth algorithm. We now SMOOTH the entire image with a gaussian kernal. Previously, we would block by 2 before smoothing with a boxcar kernal. Finally, the default method is BLOCK.</tt></li> <li><tt>02.04.04 CONTOUR:&nbsp;</tt><tt>A .5 error has been removed from the BLOCK algorithm.</tt></li> <li><tt>02.04.04 CONTOUR: </tt><tt>the number of contour levels has been inconsistant in the pass. this has been fixed. </tt><tt>If the number of levels is 1, the high cut value is used.</tt></li> <li><tt>02.04.04 CONTOUR: fixed log scale bug. it was incorrectly calculating the levels.</tt></li> <li><tt>02.05.04 SAVEAS: jpeg,tiff,png,ppm support is now internal and available to all ports. gs is no longer needed.</tt></li> <li><tt>02.10.04 REGION: add show/hide support for fg and bg regions.</tt></li> <li><tt>02.10.04 COLORMAP: fixed a problem with the -cmap value x y command. On truecolor visuals, we need to be realized before we start to manipulate the colormap.</tt></li> <li><tt>02.10.04 FITS: cleaned up smooth convolve code. same speed, easier to understand.</tt></li> <li><tt>02.11.04 GUI: Add Colorbar Parameter dialog.</tt></li> <li><tt>02.11.04 COLORBAR: add support for load/save contrast/bias.</tt></li> <li><tt>02.12.04 EXPORT: split EXPORT from SAVEAS. Currently only FITS is supported.</tt></li> <li><tt>02.17.04 CONTOUR: when update data cube slice, automatically regenerate contours.</tt></li> <li><tt>02.18.04 REGION: the marker menu is now enabled if no frame or an empty frame is available.</tt></li> <li><tt>02.20.04 SCALE: add Auto MinMax. by default, use SCAN for single and SAMPLE for Mosaic and DataCube files</tt></li> <li><tt>02.20.04 SCALE: fixed a problem with scobe being reset to LOCAL.</tt></li> <li><tt>02.23.04 CONTOUR: fixed a problem with incorrect contours for mosaics and rgb images at startup.</tt></li> <li><tt>02.23.04 XPA: add cd (current directory) command</tt></li> <li><tt>02.24.04 AST: upgrade 3.2.4</tt></li> <li><tt>02.24.04 DOC: added support for generating postscript and pdf versions of the reference manual.</tt></li> <li><tt>02.25.04 CONTOUR: convert contours to polygons will now also convert any aux contours.</tt></li> <li><tt>02.27.04 PANDA: fixed probems with GUI add angle.</tt></li> <li><tt>02.27.04 CIRCLE: new GUI edit algorithm.</tt></li> <li><tt>02.27.04 ANNULUS: new GUI edit and add annulus algorithms.</tt></li> <li><tt>02.27.04 ELLIPSE: new GU edit algorithm.</tt></li> <li><tt>02.27.04 ELLIPSE ANNULUS: new GUI edit and add annulus algorithm. This fixed a problem with 0 radius annuli. Also fixed a problem with GUI rotate after close dialog box.</tt></li> <li><tt>3.1.04 BOXANNULUS: new GUI edit and add size algorithms. This fixed a problem with 0 size annuli.</tt></li> <li><tt>03.01.04 PANDA: new GUI edit and add annulus algorithms.</tt></li> <li><tt>03.01.04 PANDA: fixed a problem with a full PANDA from 0 to 360 degrees. Previously, it was displayed as 0 to 0 degrees.</tt></li> <li><tt>03.02.04 PANDA: fixed a problem with postscript and radial lines. The zoom was incorrectly being calculated..</tt></li> <li><tt>03.02.04 PANDA: fixed a problem with render in magnifier. The wrong zoom factor was being used.</tt></li> <li><tt>03.09.04 GUI: add Tab/Shift-Tab bindings to panner.</tt></li> <li><tt>03.10.04 GRID: fixed a problem with single publication bounding box. It now takes into account DATASEC.</tt></li> <li><tt>03.10.04 AST: upgrade to 3.2.6</tt></li> <li><tt>03.12.04 GRAPH: graphs are now active for single,tile,and blink modes.</tt></li> <li><tt>03.16.04 WCS LINEAR: fixed many problems with alignment of WCS LINEAR MOSAICS</tt></li> <li><tt>03.16.04 RGB: fixed many problems with alignment of RGB WCS images</tt></li> <li><tt>03.18.04 FITS: fixed a problem with random numbers beening displayed for BLANK/NaN</tt></li> <li> <p><tt><b>03.18.04 </b><b>RELEASE version 3.0b7</b></tt></p> </li> <li><tt>03.22.04 PIXELTABLE: fixed a problem with 'unset pixelValues'.</tt></li> <li><tt>03.22.04 SAVEAS: fixed a problem with 'processSaveAs'.</tt></li> <li><tt>03.22.04 RGB: fixed a problem with turning off all loaded channels within a frame.</tt></li> <li><tt>03.31.04 IIS: fixed a problem with a old variable in DisplayCoordDialog.</tt></li> <li><tt>03.31.04 BINNING: fixed a problem with dimensions of DBL_MIN,DBL_MAX.</tt></li> <li><tt>03.31.04 IIS: turn off blinking cursor while changing colormap so we do not see a color flash due to the updating of the frame when the cursor form is changed.</tt></li> <li><tt>04.01.04 WEB DISPLAY: add options on how to load downloaded fits.</tt></li> <li><tt>04.01.04 WEB DISPLAY: fixed a problem when the image width/height contains garbage.</tt></li> <li><tt>04.02.04 TCL/TK: update to 8.4.6</tt></li> <li><tt>04.05.04 PAN: fixed yet another problem with -pan. Hopefully this time, I've got it right.</tt></li> <li><tt>04.06.04 GRID: fixed a problem with psLine and gcc 2.96.</tt></li> <li><tt>04.06.04 MAKEFILE: fixed a typo with ./configure.</tt></li> <li> <p><tt><b>04.06.04 </b><b>RELEASE version 3.0b8</b></tt></p> </li> <li><tt>04.12.04 SAVEAS: add SaveAs MPEG-1 support using tkmpeg and exmpeg.</tt></li> <li><tt>04.14.04 BINNING: 60% improvement in speed for little endian arch.</tt></li> <li><tt>04.23.04 ZLIB: upgrade to version 1.2.1<br> </tt></li> <li><tt>04.26.04 ALPHA: minor changes to make.alpha and ds9/Makefile for alpha support.</tt></li> <li><tt>04.26.04 FITS: fixed problems with trying to open regions extensions in cases where the mode was not mmap.<br> </tt></li> <li><tt>04.27.04 EXTERNAL FITS: fixed major problems with pattern matching.</tt></li> <li><tt>04.27.04 FITSY++: skip over unknow binary column types. We used to force an exit.</tt></li> <li><tt>04.28.04 FITSY++: fixed a problem with SocketGZ where if too little data had arrived, ds9 would incorrectly see this as an error.</tt></li> <li><tt>04.29.04 GUI: fixed a race condition in which ds9 'thinks' the windows have been realized, and XPA has been init'd and the user starts to delete windows that don't exists. Now XPA is not realized until the canvas window has been realized.</tt></li> <li><tt>04.29.04 LINUX: return to a full static link. Seems like the best option to support current and future versions of linux.</tt></li> <li><tt>04.29.04 PRINT: add print prefs.</tt></li> <li> <p><tt><b>05.03.04 </b><b>RELEASE version 3.0b9</b></tt></p> </li> <li><tt>05.04.04 BINNING: fixed a problem with column size double and buffer overflow on little endian machines.<br> </tt></li> <li><tt>05.04.04 PANDA: fixed a problem with postscript and gcc 2.95 compilers. This problem had already been fixed for gcc 3.x compilers.</tt></li> <li><tt>05.06.04 BINNING: add support for variable binning in x and y.</tt></li> <li><tt>05.07.04 IIS: fixed a problem with buffer overflow and determining imtool.rc file location.</tt></li> <li><tt>05.07.04 FRAMEBASE: fixed some minor memory leaks.</tt></li> <li><tt>05.10.04 BINNING: for FITS REGIONS files, when loading against a binned image, compare X and Y bin columns to regions X and Y bin columns for a match. Do not load unless they match.</tt></li> <li><tt>05.10.04 GUI: add 'option' command to control GUI appearance. Removed many -bd 2 options to clean up the interface.</tt></li> <li><tt>05.12.04 BINNING: fixed a major problem with 3D binning. Once it was turned on and then turned off, important internal parameters where not being update, resulting in segvs.</tt></li> <li><tt>05.15.04 RGB: fixed memory leak in loading RGB images.</tt></li> <li><tt>05.17.04 LINUX: ok, back to two versions: one dynamic, one static. The static version is buggy under Fedora, but is required for old versions of RH. So the default version will be dynamic linked, with an static version available for older machines.</tt></li> <li><tt>05.21.04 XPA: fixed a problem with WCS REPLACE FILE and WCS APPEND FILE.</tt></li> <li><tt>05.25.04 PANDA: fixed CIAO output so that the start angle is always less than the end angle.</tt></li> <li><tt>05.26.04 FITSY++: clean up code for strm.C, map.C, mapincr.C</tt></li> <li><tt>05.31.04 FITSY++: introduce new 'internal paging' mapince.C for binning files larger than 1Gb. Only 1Gb segments are mmap at one time, to allow binning &gt;2Gb/&gt;4Gb bin tables under a 32bit OS.</tt></li> <li><tt>05.31.04 FITSDATA: optimized swap(), getValueFloat(), getValueDouble(), and scan() in hopes of speeding up display times, especially for linux.</tt></li> <li><tt>06.13.04 WCS: upgrade to version 3.5.3</tt></li> <li><tt>06.16.04 WEB DISPLAY: increased default font by one size.</tt></li> <li><tt>06.16.04 GUI: fixed a problem with display header. Under Fedora Core 2, the default font size was too small.</tt></li> <li><tt>06.17.04 XPA: add fits header keyword support.</tt></li> <li><tt>06.17.04 PLOT: add option plot names to xpa, plot name in window title, plot data command</tt></li> <li><tt>06.17.04 PLOT: fixed a problem with closing xpa plots via xpa.</tt></li> <li><tt>06.18.04 PLOT: remove prefs 'Unique Plot'. This never worked correctly and is now obsolete.</tt></li> <li><tt>06.21.04 PANDA: radii now extend from inner annuli to outer annuli and not from the center.</tt></li> <li><tt>06.21.04 RGB: fixed a problem with 'fit to zoom' for rgb frames.</tt></li> <li><tt>06.22.04 AST: update to version 3.3-1.</tt></li> <li><tt>06.23.04 GRIDS: fixed justification (yet again!)</tt></li> <li><tt>06.24.04 REGIONS: the default GUI size is now constant, reguardless of current zoom.</tt></li> <li><tt>06.24.04 REGIONS: add support for cut/copy/paste regions across frames.</tt></li> <li><tt>06.25.04 REGIONS: add unselect, begin rotate, end rotate, begin move, end move, begin edit, end edit callback support.</tt></li> <li><tt>06.25.04 GUI: add support for multiple FITS headers for multiple extension FITS files.</tt></li> <li><tt>06.28.04 REGIONS: add support for listing WCS keywords and values as comments in region files.</tt></li> <li><tt>06.28.04 REGIONS: fixed a problem with the TEXT region handles with zooms not equal to 1.</tt></li> <li><tt>06.28.04 XPA: fixed a problem with xpaset regions color and xpaset regions width.</tt></li> <li><tt>06.29.04 FITS: add support for reload option. if reload option is set, markers and aux contours are preserved across loads.</tt></li> <li><tt>07.01.04 FITSY++: fixed a problem with binning if the image header contained more than 36 cards.</tt></li> <li><tt>07.01.04 FITSY++: added TV and TS keyword support for FITS bin tables.</tt></li> <li><tt>07.01.04 FITSY++: add TP keyword support for FITS bin tables.</tt></li> <li><tt>07.02.04 GRID: fixed a problem with a wcs with PC keywords.</tt></li> <li><tt>07.05.04 WCS: removed WCS projection option. Its no longer needed.</tt></li> <li><tt>07.05.04 GRID: fixed several problems with converting from wcs to AST. AST is very very picky as to which keywords to use and in what order. These include CDELT's, CD's, PC's, CROTA's.</tt></li> <li><tt>07.08.04 SAVEAS: reorganize save as menus.</tt></li> <li><tt>07.08.04 SAVEAS: add support for saving multiple frames as MPEG movie.</tt></li> <li><tt>07.13.04 MOSAIC: fixed a problem with mosaic image wcs with orientations of xx.</tt></li> <li><tt>07.14.04 WCS: upgrade to version 3.5.5.</tt></li> <li><tt>07.14.04 FITSY++: add support for real number format 'D'.</tt></li> <li><tt>07.14.04 FITSY: add changes to support real number format 'D'.</tt></li> <li><tt>07.15.04 ANALYSIS: stderr can now be redirected to stdout for $text with the |&amp; macro.</tt></li> <li><tt>07.15.04 ANALYSIS: shell environment vars will be expanded within the command with the env() macro.</tt></li> <li><tt>07.15.04 ANALYSIS: add support for the WEB menu item.</tt></li> <li> <p><tt><b>07.26.04 </b><b>RELEASE version 3.0<br> </b></tt></p> </li> <li><tt>07.28.04 IIS: fixed a problem with iraf iis support that would sometimes result in a blank screen.</tt></li> <li> <p><tt><b>07.28.04 </b><b>RELEASE version 3.0.1<br> </b></tt></p> </li> <li> <tt>08.02.2004 VECTOR: fixed a problem with matrix inversion with numbers smaller than DBL_EPSILON.</tt></li> <li><tt>08.02.2004 FRAME: check for negative zoom.</tt></li> <li><tt>08.06.2004 FITSIMAGE: fixed a problem with determining the length of a vector in the case of a non-wcs rotated coordinate system.</tt></li> <li><tt>08.09.2004 GRID: fixed a problem with a rotation in physical and wcs linear grids.</tt></li> <li><tt>08.10.2004 MAKEFILE: add support for emacs tags in saods9/saotk</tt></li> <li><tt>08.12.2004 PROJECTION: fixed a problem with paste projection and setup callback procs.</tt></li> <li><tt>08.12.2004 REGIONS: fixed a problem where regions properties where lost if cut/paste across frames.</tt></li> <li><tt>08.13.2004 DIALOGS: fixed an issues with some windows managers who needed a hint to bring all dialogs to the front.</tt></li> <li><tt>08.13.2004 POLYGON: change default create method to be simular to box.</tt></li> <li><tt>08.13.2004 POLYGON: add prefs default polygon size.</tt></li> <li><tt>08.13.2004 POLYGON: fixed a problem with the control handles at high zoom.</tt></li> <li><tt>08.16.2004 REGIONS: fixed a problem with updating coordinates/angles/distances when rebinning a FITS bin table.</tt></li> <li><tt>08.16.2004 REGIONS: add default system, sky, skyformat, dist system, and dist format for regions dialog to preferences.</tt></li> <li><tt>08.16.2004 FITSY++: fixed a problem with &lt;unsigned char&gt; columns. They where incorrectly cased as a &lt;char&gt;.</tt></li> <li><tt>08.18.2004 SCALE: nolonger reset scale mode from USERCLIP on load FITS.</tt></li> <li><tt>08.18.2004 AST: upgrade to version 3.4</tt></li> <li><tt>08.18.2004 GRID: minor tweaks with the default axes numerics gaps.</tt></li> <li><tt>08.18.2004 REGIONS: for RGB frames, always use the keyFits channel in mapping regions to/from reference coordinate system.</tt></li> <li><tt>08.19.2004 LINUX64: add support for Linux 64.</tt></li> <li><tt>08.24.2004 XPA: add get data support.</tt></li> <li><tt>08.25.2004 AST: fixed a bug with using free'd memory in plot.c</tt></li> <li><tt>08.25.2004 GUI: fixed two problems with the getDataValues routine. With non-symetric binning or equatorial sky coordinates, an incorrect number of values where returned.</tt></li> <li> <p><tt><b>08.27.2004 </b><b>RELEASE version 3.0.2<br> </b></tt></p> </li> <li><tt>09.01.2004 FTTYS++: add a check for mmapincr and mmap to ensure that there is at least 2880 bytes before trying to parse a header.</tt></li> <li><tt>09.02.2004 FITSY++: add new memory mode, SMMAP which allows for split fits mmap files.</tt></li> <li><tt>09.02.2004 XPA: add new support for split mmap and shared FITS files.</tt></li> <li><tt>09.03.2004 FITSY++: add new memory mode, SSHARE which allows for split fits shared memory files.</tt></li> <li><tt>09.06.2004 COMMAND: add support for split mmap and shared FITS files.</tt></li> <li><tt>09.07.2004 XPA: update to 2.1.6</tt></li> <li> <p><tt><b>09.10.2004 </b><b>RELEASE version 3.0.3<br> </b></tt></p> </li> </ol> </ol> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r4.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000063507 10643265705 016644� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 4 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 4.0 Release Notes</h3> <ol> <h4> <b>Version 4</b></h4> <ol> <li><tt>09.13.2004 AST: update to version 3.4-4</tt></li> <li><tt>09.13.2004 TCL/TK: update to version 8.4.7</tt></li> <li><tt>09.14.2004 WCSSUBS: update to version 3.5.6</tt></li> <li><tt>09.14.2004 TCLLIB: update to version 1.6.1</tt></li> <li><tt>09.15.2004 TKTABLE: installed 2.9</tt></li> <li><tt>09.20.2004 SAOTK: fixed a problem with calculating a regions rotational angle with a galactic or ecliptic wcs.</tt></li> <li><tt>09.21.2004 SAVEFITS: fixed a problem with the savefits xpa and command line options.</tt></li> <li><tt>09.21.2004 REGIONS: fixed a problem with updating region dialog boxes after a change in event file bin factor.</tt></li> <li><tt>09.23.2004 DSS: if user selects dss2red or dss2blue survey, force server to eso.</tt></li> <li><tt>09.23.2004 2MASS: add image server.</tt></li> <li><tt>10.01.2004 DSS: fixed a problem with 'Update from current Frame'.</tt></li> <li><tt>10.12.2004 MAKEFILE: add export-dynamic for linux so that external shared libs can be loaded.</tt></li> <li><tt>10.21.2004 GUI: fixed a problem if while blinking the user changes the colorbar via mouse.</tt></li> <li><tt>11.17.2004 IMAGESERVER: fixed incompatibilities between DSS and 2MASS.</tt></li> <li><tt>11.19.2004 AST: update to version 3.5</tt></li> <li><tt>11.29.2004 FUNTOOLS: update to version 1.2.4</tt></li> <li><tt>11.30.2004 SAOTK: use NaN.h from Funtools. This corrects problems with new architectures.</tt></li> <li><tt>12.03.2004 MAKEFILE: now support gcc 3.4.x</tt></li> <li><tt>12.15.2004 XPA: fixed a problem with preserve regions command.</tt></li> <li><tt>12.15.2004 HTML: fixed several problems with color matching within htmlwidget.</tt></li> <li><tt>12.16.2004 GUI: fixed a problem with saving text from SimpleTextDialog.</tt></li> <li><tt>12.16.2004 WCS: main wcs menu item now sets default marker coordinate system and skyframe.</tt></li> <li><tt>12.16.2004 COMPASS: create compass now uses current marker dialog system and skyframe.</tt></li> <li><tt>12.20.2004 POLYGON: fixed a problem with the exclude strip and rotation.</tt></li> <li><tt>12.20.2004 COMPOSITE: add support for composite region.</tt></li> <li><tt>12.22.2004 TEXT REGION: fixed a problem in which the text angle did not reflect the native coordinate system.</tt></li> <li><tt>12.29.2004 IMAGESERVER: xpa and command line options are now synchronous. The GUI is still asynchronous.</tt></li> <li><tt>12.30.2004 NAMESERVER: fixed a problem with sexigesmal from SIMBAD near the equator.</tt></li> <li><tt>12.30.2004 NAMESERVER: xpa and command line options are now synchronous. The GUI is still asynchronous.</tt></li> <li><tt>01.31.2005 VECTOR: add support for new VECTOR region.</tt></li> <li><tt>02.08.2005 REGIONS: fix varies errors with definition of angles. Position angles are now defined as from first positive coordinate axis to second positive coordinate axis except in the case of equatorial wcs, in this case it is defined as from second positive coordinate axis to first positive coordinate axis.</tt></li> <li><tt>02.16.2005 SCALE: added User menu options to clarify current scaling mode.</tt></li> <li><tt>02.17.2005 LINUX64: fixed a problem with generating postscript.</tt></li> <li><tt>02.28.2005 MOSAIC: add support for mosaic data cubes.</tt></li> <li><tt>03.01.2005 STD Dialog: fixed several problems with ds9 not remembering the current working directory.</tt></li> <li><tt>03.02.2005 WINDOWS: fixed a problem with a memory leak when rendering regions on the windows platform. We no longer try to clip against a clip region.</tt></li> <li><tt>03.02.2005 WINDOWS: fixed a problem with command line options that require the ds9 window to be visible. We have to process all events with 'update' before the windows version of ds9 is visible.</tt></li> <li><tt>03.03.2005 REGIONS: add support to all regions parsers for ms windows line terminators</tt></li> <li><tt>03.03.2005 ANALYSIS: removed extra ';' at the end of all regions substitutions.</tt></li> <li><tt>03.16.2005 FITS: increased fits file name size to 1024 chars.</tt></li> <li><tt>03.17.2005 CATALOGS: are finally implemented!</tt></li> <li><tt>03.24.2005 WINDOWS: implemented non-windows native standard dialogs. This allows uses to specify a file extension.</tt></li> <li><tt>03.29.2005 FITY++: fixed a problem with filtering large bin tables while in mmapincr mode. We now insure that enough data is mmap'd for filter to build its good array.</tt></li> <li><tt>03.29.2005 PRESERVE: fixed syntax errors with preserve regions and pan.</tt></li> <li><tt>03.30.2005 REGIONS: fixed regions parsers to accept a regions file without terminator as the last character.</tt></li> <li><tt>03.30.2005 ZOOM: all zooms are now specified in terms of x and y internally</tt></li> <li><tt>04.01.2005 GRID: fixed a problem with grid options</tt></li> <li><tt>04.28.2005 REGIONS: reimplemented basemarker,baseellipse,basebox classes.</tt></li> <li><tt>04.28.2005 ZOOM: implemented support for different x and y zoom.</tt></li> <li><tt>04.29.2005 XPA: update to version 2.1.6</tt></li> <li><tt>04.29.2005 FUNTOOLS: update to version 1.3.0b3</tt></li> <li><tt>04.29.2005 TCL/TK: update to version 8.4.9</tt></li> <li><tt>05.25.2005 REGIONS: update all regions code</tt></li> <li><tt>05.25.2005 REGIONS: add EPANDA</tt></li> <li><tt>06.07.2005 FUNTOOLS: update to version 1.3.0b6</tt></li> <li><tt>06.13.2005 SCALE: new LOG algorithm log10(i/s*1000+1)/log10(1001) where 0&lt;i&lt;s</tt></li> <li><tt>06.13.2005 MAKEFILE: add support for FreeBSD</tt></li> <li><tt>06.19.2005 FTP: all ftp opens now are in passive mode</tt></li> <li><tt>06.28.2005 BIN: fixed a problem with -bin factor</tt></li> <li><tt>06.28.2005 PAGESETUP: pagesetup command line options are no longer case sensitive</tt></li> <li><tt>07.12.2005 FUNTOOLS: update to version 1.3.0.b7</tt></li> <li><tt>07.13.2005 REGIONS: new DS9 regions 4.0 format</tt></li> <li><tt>07.13.2005 REGIONS: add copy,cut,paste,undo xpa and command line options.</tt></li> <li><tt>08.01.2005 GCC: add support for gcc 4.0. Remove backward support for gcc 2.96 or earlier.</tt></li> <li><tt>08.03.2005 REGIONS: panda,epanda,bpanda, only render start/stop angles in red/blue when selected.</tt></li> <li><tt>08.04.2005 SMOOTH: add smoothing algorithms boxcar,tophat,gaussian</tt></li> <li><tt>08.15.2005 COLORBAR: add support for printing the colorbar</tt></li> <li><tt>08.15.2005 FUNTOOLS: update to version 1.3.0b9</tt></li> <li><tt>08.15.2005 ZLIB: update to version 1.2.3</tt></li> <li><tt>08.17.2005 GUI: add View menu and prefs.</tt></li> <li><tt>08.24.2005 REGIONS: fixed a problem with ciao pie regions.</tt></li> <li><tt>08.24.2005 REGIONS: add invert selection.</tt></li> <li><tt>08.25.2005 GUI: add display image window size.</tt></li> <li><tt><b>08.30.2005 RELEASE version 4.0b6</b></tt></li> <li><tt>09.12.2005 IIS: fixed a problem with iis and cursors.</tt></li> <li><tt><b>09.12.2005 RELEASE version 4.0b7</b></tt></li> <li><tt>09.15.2005 ARRAY: fixed a problem with loading array cubes from a file and determining the correct endian.</tt></li> <li><tt>10.24.2005 BIN: if unable to find suitable cols to bin, chose the first and second column. This way, if you have table, it will always load, even if you don't know the column names.</tt></li> <li><tt>10.25.2005 BIN: binning dialog box. if number of columns is too large to display, wrap the menu.</tt></li> <li><tt>10.27.2005 CONTOUR: complete support for command line/xpa control of contour features.</tt></li> <li><tt>10.27.2005 CONTOUR: fixed a problem with convert and contours of zero length.</tt></li> <li><tt>11.01.2005 FITS: fixed a problem loading very small arrays mmapincr</tt></li> <li><tt>11.01.2005 VECTOR: small change to correct issue with gcc 4.0.1</tt></li> <li><tt>11.01.2005 WCS: fixed a problem with wcs append/replace.</tt></li> <li><tt>11.02.2005 GRID: fixed a problem with alternative linear wcs.</tt></li> <li><tt>11.02.2005 WCS: fixed a problem with alternative wcs names. All wcs names are now lower case.</tt></li> <li><tt>11.03.2005 CONTOUR: fixed a problem with contour convert after a catalog command.</tt></li> <li><tt>11.03.2005 HELP: altered tk to pass -help to us. For -help, we now display a brief message and exit and for --help, we display the reference manual command line options.</tt></li> <li><tt>11.09.2005 CATALOG: fixed a problem with starbase to trim column names of white spaces.</tt></li> <li><tt>11.09.2005 CATALOG: add user specified RA/DEC column option.</tt></li> <li><tt>11.10.2005 CATALOG: speed up catreg for large dbs</tt></li> <li><tt>11.14.2005 GUI: the meus Cut,Copy,Paste,Clear now works for all dialog boxes on all platforms.</tt></li> <li><tt>11.16.2005 REGIONS: fixed a problem with rendering arrows for line,vector,ruler, and compass with width&gt;1.</tt></li> <li><tt>11.16.2005 GUI: Modified standard dialog boxes to remember file types.</tt></li> <li><tt>11.17.2005 GUI: remove 'Use Cursors' Misc Option.</tt></li> <li><tt>11.17.2005 GUI: Modified standard dialog boxes to remember filters.</tt></li> <li><tt>11.18.2005 COMPOSITE: fixed a problem with loading composite regions with properties.</tt></li> <li><tt>12.05.2005 RGB: Fixed a problem with wcs matching rgb frames .</tt></li> <li><tt>12.08.2005 REGIONS: Fixed a problem general comment such as ## and #.</tt></li> <li><tt>12.08.2005 HELP: reset previous behavior for -help. fv uses ds9 -help to probe for ds9. Until fv is changed, we need to support the prior behavior.</tt></li> <li><tt>12.15.2005 X11: Insure that all X11 rendering is calculated in double precision until the very last, at which, the results are rounded to the nearest integer. This includes markers, contours, grids.</tt></li> <li><tt>12.17.2005 PS: set default resolution to 150, from 72.</tt></li> <li><tt>12.19.2005 GUI: add .ftz and .FTZ to default fits name filter.</tt></li> <li><tt>12.19.2005 FREEBSD: added support for freebsd.</tt></li> <li><tt>01.03.2006 FITSY++: fixed an overflow problem with mmap very large array files.</tt></li> <li><tt>01.04.2006 GUI: reinstated DETECTOR and AMPLIFIER coordinate system menu items in menus and removed the preferences.</tt></li> <li><tt>01.04.2006 GUI: reinstated ZMAX menu items in menus.</tt></li> <li><tt>01.05.2006 CATALOGS: fixed a problem with rotated or flipped images and determining image size in ra and dec</tt></li> <li><tt>01.05.2006 PROJECTION: fixed a problem move and moveto.</tt></li> <li><tt>01.12.2006 COLORBAR: added numerics to colorbar.</tt></li> <li><tt>01.18.2006 GUI: separte controls for min/max and low/high.</tt></li> <li><tt>01.24.2006 HISTOGRAM EQU: is now based on low/high, not min/max.</tt></li> <li><tt>01.27.2006 GUI: fixed a problem with updating the current colormap.</tt></li> <li><tt>01.30.2006 PANNER: under truecolor visuals, the panner is now updated with the colorbar.</tt></li> <li><tt>02.01.2006 TEMPLATE: tweak xmm templates for correct boresite.</tt></li> <li><tt>02.03.2006 GUI: fixed Shift-Tab under linux.</tt></li> <li><tt>02.03.2006 GUI: fixed a problem with loading multiple files, with -single command line option, followed by Match Frame. The frames where not realized so the coordinate systems where not valid.</tt></li> <li><tt>02.03.2006 MARKERS: added the ability to toggle marker text.</tt></li> <li><tt><b>02.08.2006 RELEASE version 4.0b8</b></tt></li> <li><tt>02.07.2006 TCL/TK: update to version 8.4.12</tt></li> <li><tt>02.08.2006 CROSSHAIR: fix a typo that caused the crosshair command-line option to fail.</tt></li> <li><tt>02.27.2006 CATALOG: fixed a problem with finding which columns contain RA and DEC.</tt></li> <li><tt>02.27.2006 XPA: fixed a problem with xpaget ds9 width.</tt></li> <li><tt>03.20.2006 DSS: add new survey options for STSCI.</tt></li> <li><tt>03.24.2006 i18n: finished implemenation of internationalization and localization code.</tt></li> <li><tt>03.29.2006 SCALE: fixed a problem with RGB frames and log/pow scales. Incorrect low/high values were being used to calculate the scale.</tt></li> <li><tt>03.29.2006 PREFS: the default prefs file is now ds9.prf. The following directories are now searched in order: ./ ~ /usr/local/lib /opt/local/lib </tt></li> <li><tt>03.29.2006 INITALIZATION: the default initalization file is now ds9.ini. The following directories are now searched in order: ./ ~ /usr/local/lib /opt/local/lib </tt></li> <li><tt>03.31.2006 GUI: fixed a problem with several dialog boxes with the Paste menu option. If the clipboard was empty, an error was generated.</tt></li> <li><tt>04.3.2006 FITS HEADER: fixed a problem displaying datacube headers.</tt></li> <li><tt>04.3.2006 PROJECTION REGION: Projection region plots can now be accessed via XPA PLOT</tt></li> <li><tt>04.5.2006 MACOSX: fix a problem with the macosx startup scripts to allow path names with a space.</tt></li> <li><tt>04.7.2006 WCS: fix a problem WCS menu and images without a wcs.</tt></li> <li><tt>04.10.2006 GRID: fixed a problem with GLACTIC wcs, AST, WCSSUBS, and defined LATPOLE/LONPOLE keywords.</tt></li> <li><tt><b>04.15.2006 RELEASE version 4.0b9</b></tt></li> <li><tt>04.18.2006 CATALOGS: fixed a problem with filter editor menu.</tt></li> <li><tt>04.18.2006 CATALOGS: fixed a problem with searching for other catalogs</tt></li> <li><tt>04.24.2006 TEMP: DS9 will now look for environment vars TEMP and TMP first for location of temp directory.</tt></li> <li><tt>04.28.2006 PREFS: Fixed a problem with writing invalid preferences.</tt></li> <li><tt>04.28.2006 PS: Fixed a problem with printing Grayscale and pure white values. They were being rounded off to 254, not 255.</tt></li> <li><tt>04.28.2006 PREFS: prefs are now written to a users home directory if available (including windows) and hidden.</tt></li> <li><tt>05.02.2006 GCC: now compiles properly under gcc 4.1</tt></li> <li><tt>05.08.2006 SCALE: more checks for illegal low/high values for log/pow scales</tt></li> <li><tt>05.10.2006 BIN: fix an issue with calculated width/height. No matter the bin factor, or the dimensions of the data, always have at least an 1x1 image.</tt></li> <li><tt>05.11.2006 DARWIN: compile under 10.4.x with no OSSPINLOCKLOCK, which is not available under 10.3.x</tt></li> <li><tt>05.16.2006 CROSSHAIR: fixed a problem with xpa/cmd option crosshair.</tt></li> <li><tt>05.16.2006 ANALYSIS: fixed a problem with loading analysis files with bindings at startup with one frame.</tt></li> <li><tt>05.22.2006 WCSSUBS: Update to version 3.6.4</tt></li> <li><tt>05.25.2006 ANALYSIS: add $xcen and $ycen macros.</tt></li> <li><tt>05.25.2006 ANALYSIS: add $vo_method macro.</tt></li> <li><tt>06.05.2006 FITSY++: fixed a problem with incorrectly detecting the beginning sequence of gz stream.</tt></li> <li><tt>06.12.2006 HV/XPA: Implemented 'xpaset' mime support.</tt></li> <li><tt>06.14.2006 FITS: Fixed a problem with displaying the header of a file in which there was an extention name in the primary header.</tt></li> <li><tt>06.21.2006 GUI: Fixed a problem -single and -blink command line optons.</tt></li> <li><tt>06.21.2006 REGIONS: Check for valid image loaded before processing load regions commands.</tt></li> <li><tt>06.21.2006 MOSAIC: fixed a problem with mosaicimage wfpc2 and display header.</tt></li> <li><tt>06.23.2006 HV: Implemented file caching.</tt></li> <li><tt>06.23.2006 HV: Implemented image caching.</tt></li> <li><tt>06.26.2006 HV: Implemented multiple mime processing.</tt></li> <li><tt>06.29.2006 TCLLIB: update to version 1.8</tt></li> <li><tt>07.11.2006 WCSSUBS: update to version 3.6.5</tt></li> <li><tt>07.11.2006 WCSSUBS: fix a problem with naxis&gt;2</tt></li> <li><tt>07.12.2006 NAME SERVER: support for HTTP redirection</tt></li> <li><tt>07.12.2006 IMAGE SERVER: support for HTTP redirection</tt></li> <li><tt>07.13.2006 CATALOGS: support for HTTP redirection</tt></li> <li><tt>07.13.2006 REGIONS: fixed a problem with cut/copy/paste regions dialog.</tt></li> <li><tt>07.25.2006 PREFS: preferences are automatically saved.</tt></li> <li><tt>07.25.2006 FITSY++: fixed a problem with large RGB arrays and streams.</tt></li> <li><tt>07.31.2006 RGB: add support for invert RGB colormap.</tt></li> <li><tt>07.31.2006 FIRST: add support for VLA FIRST image server.</tt></li> <li><tt>08.01.2006 HTTP: add timeout options to all geturl calls.</tt></li> <li><tt>08.02.2006 CATALOGS: add suppport for SDSS.</tt></li> <li><tt>08.07.2006 ANALYSIS: fixed a problem with cancel geturl tasks.</tt></li> <li><tt>08.14.2006 TKTABLE: fixed configure files for darwin intel.</tt></li> <li><tt>08.14.2006 TKIMG: fixed configure files for darwin intel.</tt></li> <li><tt>08.14.2006 AST: apply patch to plot.c at line 23207</tt></li> <li><tt>08.17.2006 BIN: fixed a problem with binning 3D and integer cols.</tt></li> <li><tt>08.17.2006 BIN: fixed a problem with binning 3D and updating the bin dialog box.</tt></li> <li><tt>08.17.2006 SCALE: changed AUTO to sample only for mosaics. </tt></li> <li><tt>08.30.2006 CATALOG: fixed a problem with filtering and column names to leading or trailing spaces. </tt></li> <li><tt>08.31.2006 CATALOG: add support for CSV catalog files with/wo header. </tt></li> <li><tt>09.06.2006 EPANDA: Fixed problems with rendering start and stop angles.</tt></li> <li><tt>09.08.2006 BPANDA: Fixed problems with rendering start and stop angles.</tt></li> <li><tt>09.11.2006 TEMPLATES: When creating templates, they were placed in the upper right corner of the frame. This has been changed to the center of the frame.</tt></li> <li><tt>09.11.2006 TEMPLATES: When templates where created via the gui, the screen was not refreshed properly. This has been corrected.</tt></li> <li><tt>09.12.2006 FITSY++: Fixed a problem with hist() and column values of 0, which was used as the default value.</tt></li> <li><tt>09.13.2006 COMPOSITE: Add complement angle.</tt></li> <li><tt>09.15.2006 CPANDA,EPANDA,BPANDA: fixed a conflict with funtools. Stop/start angles will alway increase in value.</tt></li> <li><tt>09.18.2006 MOSAIC IMAGE NEXT: removed support.</tt></li> <li><tt><b>10.01.2006 RELEASE version 4.0b10</b></tt></li> <li><tt>10.01.2006 I18N: Add Portuguese support.</tt></li> <li><tt><b>10.01.2006 RELEASE version 4.0b10.1</b></tt></li> <li><tt>10.01.2006 FITS: external support for bzip2.</tt></li> <li><tt>10.01.2006 REGIONS: fixed a problem with clipping regions in tile mode.</tt></li> <li><tt>10.03.2006 HV: add support for HTTP-EQUIV HTML Meta keyword.</tt></li> <li><tt>10.03.2006 PANDA: fixed a problem with zero length radius and printing.</tt></li> <li><tt>10.10.2006 WCSSUBS: update to version 3.6.6</tt></li> <li><tt>10.13.2006 TCL/TK: update to version 8.4.13</tt></li> <li><tt>10.13.2006 FUNTOOLS: update to version 1.3.0b22</tt></li> <li><tt>10.13.2006 TCLLIB: update to version 1.9</tt></li> <li><tt>10.23.2006 LANGUAGE: add support for following languages fr,es,de,it,pt,ru,da.</tt></li> <li><tt>10.23.2006 HTTP: increase timeout to 3 minutes.</tt></li> <li><tt>10.24.2006 GUI: add view colorbar numerics support.<br></tt></li> <li><tt>10.31.2006 CATALOGS: add full symbol support via xpa/command line.<br></tt></li> <li><tt>10.31.2006 CATALOGS: fixed a problem with the optional catalog name as a parameter.<br></tt></li> <li><tt>10.31.2006 GUI: multi column frame and active frame menu.<br></tt></li> <li><tt>10.31.2006 GUI: multi column catalog col name menus.<br></tt></li> <li><tt>11.02.2006 XPA: add xpaget ds9 fits bitpix.<br></tt></li> <li><tt>11.06.2006 GUI: add confirmation option preference.<br></tt></li> <li><tt>11.28.2006 REGIONS: add xpa/command line option get info.<br></tt></li> <li><tt>11.28.2006 REGIONS: fits regions file: first look for extension [REGIONS], then attempt to load the first extension.<br></tt></li> <li><tt>11.29.2006 FITS: fixed a overflow problem with very very large fits images > 8Gb in size.<br></tt></li> <li><tt>12.06.2006 RGB: fixed a problem with aligning very large images.<br></tt></li> <li><tt>12.07.2006 MOSAIC: fixed a problem with wcs mosaicsa and very large images.<br></tt></li> <li><tt>12.09.2006 FITS: removed a kludge for defining the wcs tangent point that only affected AIR and AZP projections.<br></tt></li> <li><tt>12.12.2006 GUI: fixed a problem with default vertical layout. The default size is now consistent with other options.<br></tt></li> <li><tt>12.13.2006 SAVEAS: fixed a problem with PHYSICAL and WCS coordinates. They were 1 pixel off.<br></tt></li> <li><tt>12.13.2006 CPANDA/EPANDA: fixed a problem with render and printing with an image flipped.<br></tt></li> <li><tt>12.20.2006 RGB: NaN are now ignored when building an RGB image.<br></tt></li> <li><tt>12.22.2006 GUI: Increased default X size so that buttons do not cause automatic resizing.<br></tt></li> <li><tt>01.08.2007 PREFS: fixed a problem with frame parser and LoadPrefs so that a preferences file from version b9 will correctly parse.<br></tt></li> <li><tt>01.23.2007 FITS: Added additional checks for valid format and values for DATASEC, DETSEC, and DETSIZE keywords.<br></tt></li> <li><tt>01.24.2007 CATALOGS: fixed a problem with redirect.<br></tt></li> <li><tt>01.24.2007 REGIONS: fixed a problem measuring WCS lengths across wcs mosacis and RGB images.<br></tt></li> <li><tt>01.25.2007 REGIONS: fixed a problem with rotated text regions.<br></tt></li> <li><tt>01.30.2007 DSS: Split DSS server into three servers.<br></tt></li> <li><tt>01.31.2007 GUI: add binning buffersize 8192 and binfactor 256.<br></tt></li> <li><tt><b>02.01.2007 RELEASE version 4.0b11</b></tt></li> <li><tt>02.02.2007 CATALOGS: add cols.<br></tt></li> <li><tt>02.02.2007 VO: default url is now http://cxc.harvard.edu/chandraed/list.txt.<br></tt></li> <li><tt>02.07.2007 PREFERENCES: if ds9 detects a newer prefs file, it will not be processed.<br></tt></li> <li><tt>02.09.2007 SKYVIEW: added support for HEASARC's skyview image cutout service.<br></tt></li> <li><tt>02.09.2007 GUI: dropped the 'b' for beta, afterall, ds9 is always beta!<br></tt></li> <li><tt>02.13.2007 CATALOGS: new non-modal search catalogs support.<br></tt></li> <li><tt>02.13.2007 CATALOGS: add show/hide support.<br></tt></li> <li><tt>02.15.2007 FIRST: fixed a problem with xpa first.<br></tt></li> <li><tt>02.15.2007 2MASS: fixed a problem with xpa 2mass.<br></tt></li> <li><tt>03.06.2007 MASK: add support for fits masks.<br></tt></li> <li><tt>03.06.2007 MOSAIC: remove support for 'fast mosaic' mode.<br></tt></li> <li><tt>03.06.2007 SCALE: added support for zscale parameter prefs.<br></tt></li> <li><tt>03.20.2007 FITSY++: add support for compressed FITS.</tt></li> <li><tt>03.27.2007 WCS: fixed support for alt wcs for bin tables.<br></tt></li> <li><tt>03.29.2007 REGIONS: add support for user specified point sizes<br></tt></li> <li><tt>04.02.2007 GRID: fixed a problem with TNX projection.<br></tt></li> <li><tt>04.03.2007 FITSY++: split code supporting FITS ASCII tables and FITS Binary Tables.<br></tt></li> <li><tt>04.03.2007 FITSY++: removed code supporting FITS Binary Tables substring arrays.<br></tt></li> <li><tt>04.03.2007 WCSSUBS: update to version 3.6.8</tt></li> <li><tt>04.03.2007 FUNTOOLS: update to version 1.3.0b30</tt></li> <li><tt>04.03.2007 XPA: update to version 2.1.7b2</tt></li> <li><tt>04.06.2007 FITSY++: add support for RICE compressed FITS.</tt></li> <li><tt>04.06.2007 SMOOTH: now implemented on a per channel basis for RGB.</tt></li> <li><tt>04.10.2007 WCSSUBS: backed out of wcscon.c to version 3.6.6 due to a bug in prec.</tt></li> <li><tt>04.12.2007 WINDOWS: fixed a problem with iis and iraf.</tt></li> <li><tt><b>04.15.2007 RELEASE version 4.12</b></tt></li> <li><tt>04.16.2007 FITSIMAGE: fixed an bug with setting file names after a reset.</tt></li> <li><tt>04.26.2007 ESO-DSS: support new survey names.</tt></li> <li><tt>05.10.2007 NSVR: fixed a problem with xpa/command line name lookup.</tt></li> <li><tt>05.10.2007 NSVR: fixed a problem redirection.</tt></li> <li><tt>05.11.2007 TCL: realize ds9 before executing any external tcl source.</tt></li> <li><tt>05.11.2007 CATALOGS: for csv files, ignore any comment lines.</tt></li> <li><tt>05.21.2007 MOSAICS: fixed several problems with constructing mosaics from both IRAF and WCS keywords.</tt></li> <li><tt>05.21.2007 IRAF MOSAICS: the image size is now defined by the actual data (just as with WCS) and not the DETSIZE keyword.</tt></li> <li><tt>05.30.2007 GRID: fixed a problem with plain font style that resulted in always using system and not the selected font.</tt></li> <li><tt>05.31.2007 ELLIPSE PANDA: fixed a problem incorrect postscript code.</tt></li> <li><tt>06.08.2007 GUI: fixed a problem with the Display Fits Header button.</tt></li> <li><tt>06.13.2007 FITS: add fits header command and xpa point.</tt></li> <li><tt>06.30.2007 RULER: fixed a problem with displaying the length text.</tt></li> <li><tt><b>07.15.2007 RELEASE version 4.13</b></tt></li> </ol> </ol> </body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r5.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000073646 11300355440 016635� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 5 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 5 Release Notes</h3> <ol> <ol> <li><tt>07.16.2007 FITSY++: fix a problem with rice compressed images and multiple tiles.</tt></li> <li><tt>07.17.2007 MOSAIC: fix a problem with bin table extensions at the end of a mosaic image wcs.</tt></li> <li><tt>07.20.2007 COLORMAP: fixed a problem with loading external colormaps.</tt></li> <li><tt>07.20.2007 COLORMAP: fixed a problem colormap menus.</tt></li> <li><tt>07.23.2007 ARCHIVES: new url for skyview.</tt></li> <li><tt>07.23.2007 I18N: add language support for Japanese. (many thanks to Masahiro Tsujimoto!).</tt></li> <li><tt>07.23.2007 PIXEL TABLE: xpaget will now return the pixel table values.</tt></li> <li><tt>07.31.2007 SOLARISx86: now supporting solarisx86.</tt></li> <li><tt>08.15.2007 PIXELTABLE: fixed a minor problem with xpaget pixeltable.</tt></li> <li><tt>08.15.2007 FUNTOOLS: update to version 1.4.0</tt></li> <li><tt>08.15.2007 IIS: fixed a problem with frame number greater than 10.</tt></li> <li><tt>08.15.2007 EXAMINE: changed frame name to 'Frame'.</tt></li> <li><tt>09.02.2007 CATALOGS: updated urls and menu titles.</tt></li> <li><tt>09.20.2007 PREFS: new prefs dialog box.</tt></li> <li><tt>09.24.2007 CATALOGS: fixed a problem with the CDS query.</tt></li> <li><tt>09.24.2007 CATALOGS: add SDSS DR6.</tt></li> <li><tt>09.24.2007 SKYVIEW: fixed default image size and updated url.</tt></li> <li><tt>09.24.2007 PROJECTION: install callbacks only after Button Release.</tt></li> <li><tt>09.25.2007 REGIONS: add xpa/command SHOW and SHOWTEXT support.</tt></li> <li><tt>09.25.2007 CONTOURS: fixed a problem with load contours from the command line.</tt></li> <li><tt>10.03.2007 MACOSX: MacOSX Aqua support is now fully implemented!</tt></li> <li><tt>10.03.2007 COLORMAP: pass colormap names thru translation tables</tt></li> <li><tt>10.03.2007 XPA: update to version 2.1.8</tt></li> <li><tt>10.05.2007 COMPOSITE: add global properties switch.</tt></li> <li><tt>10.05.2007 LINE: fixed a problem with initial displayed arrow checkboxes in dialog.</tt></li> <li><tt>10.05.2007 FOV: moved FOV menu to more visible level</tt></li> <li><tt>10.10.2007 I18N: add language support for French.</tt></li> <li><tt>10.11.2007 CATALOGS: fixed a problem with the symbol editor dialog.</tt></li> <li><tt><b>10.15.2007 RELEASE version 5.0</b></tt></li> <li><tt>10.16.2007 PROJECTION: fixed a problem with the coordinates of the projection plot.</tt></li> <li><tt>10.17.2007 RICE: fixed a problem with float and double RICE compression.</tt></li> <li><tt>10.24.2007 RICE: fixed several problems with mosaics, cubes and RICE compression.</tt></li> <li><tt>10.24.2007 GUI: added support for ds9 beta versions.</tt></li> <li><tt>10.24.2007 PREFS: added OK and Cancel buttons to all tabs.</tt></li> <li><tt>10.29.2007 CATALOGS: implemented support for new CDS catalogs search format.</tt></li> <li><tt>10.30.2007 SAOTK: implemented reentrant parsers.</tt></li> <li><tt>11.01.2007 SAOTK: now support any color for markers, contours, etc.</tt></li> <li><tt>11.02.2007 MACOSX/WINDOWS: fixed a problem with native open file dialog. If bad file name had been used, (or an extention), an error would occur.</tt></li> <li><tt>11.07.2007 TCL/TK: update to version 8.4.16.</tt></li> <li><tt>11.08.2007 PLOT: fixed a problem with xpa/command line linear/line tokens to match documentation.</tt></li> <li><tt>11.09.2007 PREFERENCES: fixed a problem with slower ppcs. use 'update idletasks' instead of 'update' to avoid possible race condition.</tt></li> <li><tt>11.21.2007 XPA: update to version 2.1.9</tt></li> <li><tt>11.21.2007 FUNTOOLS: update to version 1.4.1</tt></li> <li><tt>11.21.2007 WCSSUBS: update to version 3.7.0</tt></li> <li><tt>11.21.2007 TCLLIBS: update to version 1.10</tt></li> <li><tt>11.28.2007 TCL/TK: update to version 8.4.17 beta.</tt></li> <li><tt>11.28.2007 ANALYSIS: fix a problem with spaces in tmp file names.</tt></li> <li><tt>12.05.2007 FLEXLEXER.Y: updated version.</tt></li> <li><tt>12.06.2007 GUI: change key binding 'c' to 'r'. It conflicts with 'copy' on MacOSX and Windows platforms.</tt></li> <li><tt>12.06.2007 REGIONS: fixed a problem with pasteing regions into an empty frame.</tt></li> <li><tt>12.18.2007 ZIP: fixed a problem with the unix Makefile.</tt></li> <li><tt>12.18.2007 FUNTOOLS: update to version 1.4.2.</tt></li> <li><tt>12.18.2007 2MASS: limit size to 1024 arcsec.</tt></li> <li><tt>12.21.2007 FITSY++: add support for HCOMPRESS compressed FITS.</tt></li> <li><tt>12.28.2007 FITSY++: add support for GZIP compressed FITS.</tt></li> <li><tt>01.03.2008 FITSY++: add support for PLIO compressed FITS.</tt></li> <li><tt>01.04.2008 GUI: fixed a problem with X11 servers that return truecolor 32 bit when in fact the visual is truecolor 24bit.</tt></li> <li><tt><b>01.15.2008 RELEASE version 5.1</b></tt></li> <li><tt>01.17.2008 ANALYSIS: add the directory of any loaded analysis file to the PATH.</tt></li> <li><tt>01.22.2008 REGIONS: fixed a problem introduced with reentrant parsers. Sexagesimal values between -00 and +00 were incorrectly parsed as +00.</tt></li> <li><tt>01.23.2008 REGIONS: fixed a problem with parsing HMS/DMS coordinates.</tt></li> <li><tt>01.24.2008 GUI: fixed a problem shift rotate mode.</tt></li> <li><tt>01.24.2008 GUI: info panel 'Frame' width set to +4.</tt></li> <li><tt>01.24.2008 GUI: add new goto frame menu.</tt></li> <li><tt>01.24.2008 GUI: add support for move frames.</tt></li> <li><tt>01.24.2008 ANALYSIS: for MacOSX tiger, wrap cmds with shell and PATH.</tt></li> <li><tt>01.25.2008 CATALOGS: make sure xpa and command line retrieves are syncronous.</tt></li> <li><tt>01.28.2008 CONTOUR: fixed a problem with loading contour levels into multiple frames.</tt></li> <li><tt>01.31.2008 WINDOWS: changed how windows come into focus.</tt></li> <li><tt>01.31.2008 TCL/TK: update to version 8.4.17.</tt></li> <li><tt>02.07.2008 GUI: change default directory for standard dialog to $HOME.</tt></li> <li><tt>02.07.2008 ANALYSIS: add /sw/bin to default path for MacOSX.</tt></li> <li><tt>02.20.2008 CATALOGS: add support for editing a catalog table and regions.</tt></li> <li><tt>02.20.2008 TEXT: add enable rotation switch for text regions.</tt></li> <li><tt>02.20.2008 GUI: ds9 will now start in the users home directory for MacOSX Aqua users when invoked from a double click and the default dialog box is Motif or Windows.</tt></li> <li><tt>02.20.2008 TCL/TK: update to version 8.4.18.</tt></li> <li><tt>02.26.2008 IIS: disable most keystroke and mouse events for iis frames.</tt></li> <li><tt>02.28.2008 FITSY++: fixed a problem with save fits and smoothed images.</tt></li> <li><tt>02.29.2008 WCS: fixed a problem with calculating the size and center of complex fits images in WCS.</tt></li> <li><tt>03.05.2008 GUI: backed out change key binding 'c' to 'r'. It causes untold grief with IRAF.</tt></li> <li><tt>03.10.2008 MACOSX: fixed a problem with printing non standard colors.</tt></li> <li><tt>03.10.2008 CATALOGS: catalog dialogs are now tied to the frame. This allows multiple copies of the same catalog, one per frame.</tt></li> <li><tt>03.12.2008 GRID: added support for PC001001 formated WCS keywords.</tt></li> <li><tt>03.13.2008 IIS: make sure socket is closed on exec.</tt></li> <li><tt>03.13.2008 WINDOWS: add support for native printing.</tt></li> <li><tt>03.18.2008 CROSSHAIR: fix a problem with the line width for postscript.</tt></li> <li><tt>03.18.2008 MACOSX: restore postscript printing.</tt></li> <li><tt>03.18.2008 WINDOWS: restore postscript printing.</tt></li> <li><tt>03.19.2008 GUI: enhancements with Find/FindNext in text dialog windows.</tt></li> <li><tt>03.19.2008 GUI: add console support.</tt></li> <li><tt>03.24.2008 REGIONS: apply WCS to fits regions if present.</tt></li> <li><tt>03.25.2008 PREFS: fixed a problem with Zoom menu preferences.</tt></li> <li><tt>03.31.2008 GUI: add support for user configured button bar.</tt></li> <li><tt>04.03.2008 CATALOGS: add support for simbad.</tt></li> <li><tt>04.04.2008 MASKS: fixed a problem with mask color preference.</tt></li> <li><tt>04.07.2008 IMEXAMINE: added support for key stroke events.</tt></li> <li><tt><b>04.15.2008 RELEASE version 5.2</b></tt></li> <li><tt>04.18.2008 REGIONS: added support for centroid.</tt></li> <li><tt>04.21.2008 GUI: fixed a problem with 'c' and control-c.</tt></li> <li><tt>04.21.2008 IIS: fixed a problem key events. Now all key events are active until IIS is in cursor mode. At this point all key events are passed to IRAF except for 'TAB'.</tt></li> <li><tt>04.23.2008 MACOSX: split the binary and archive into two files, and codesign the binary, so that it will play well with leopard's new firewall.</tt></li> <li><tt>04.25.2008 FITSY++: fixed a proble with mapincr. If seek_ is at end of file, mmap will not return an error.</tt></li> <li><tt>04.28.2008 GUI: delete all frames resets the frame counter (broken in 5.2).</tt></li> <li><tt>06.02.2008 GCC: remove all references to <iostream.h> and use <iostream> instead.</iostream></iostream.h></tt></li> <li><tt>06.02.2008 GCC: support for gcc 4.2.</tt></li> <li><tt>06.02.2008 GUI: fix typo in bin.tcl menus.</tt></li> <li><tt>06.03.2008 FITSY++: changes to processing the header where ds9 will now work with illegal fits files that contains NULLs instead of SPACEs.</tt></li> <li><tt>06.03.2008 RICE: implemented compatibility with cfitsio 3.08.</tt></li> <li><tt>06.04.2008 GZIP: implemented compatibility with cfitsio 3.08.</tt></li> <li><tt>06.04.2008 HCOMPRESS: implemented compatibility with cfitsio 3.08.</tt></li> <li><tt>06.05.2008 IIS: disable scale menu with iis frame (fixed from version 5.2).</tt></li> <li><tt>06.05.2008 REGIONS: fixed FITS regions polygon support. Now determine how many points based on the repeat value of the column, but check for .</tt></li> <li><tt>06.06.2008 FITS: for saveimage fits, if non-linear WCS, don't attempt to save WCS.</tt></li> <li><tt>06.06.2008 BLINK: add xpa/command line option -blink interval.</tt></li> <li><tt>06.06.2008 REGIONS: add for DASH property.</tt></li> <li><tt>07.11.2008 REGIONS: fixed a problem with the 'delete all' button.</tt></li> <li><tt>07.16.2008 XPA: if CHECKDNS fails, set XPA_METHOD to local and initialize.</tt></li> <li><tt>07.21.2008 PROJECTION: minor change to ensure that we step over the grid in 1 pixel values.</tt></li> <li><tt>07.24.2008 IIS: add support for all 16 IIS colors.</tt></li> <li><tt>07.25.2008 BINNING: fixed a problem with smooth and 3d binning.</tt></li> <li><tt>08.04.2008 FITSY++: fixed a problem with BSCALE/BZERO and float/double data types.</tt></li> <li><tt>08.11.2008 CATALOGS: fixed a problem with catalogs retrieved via a cds search. The id returned would fail during evaluation in creating a valid header.</tt></li> <li><tt>08.11.2008 CATALOGS: add CMC to catalog menu.</tt></li> <li><tt>08.11.2008 GUI: fixed a problem with the initial directory for the standard dialog when loading from the command line.</tt></li> <li><tt>08.14.2008 VECTOR: vast improvements in optimization.</tt></li> <li><tt>08.19.2008 GUI: catch a failure to initialize window system (a problem with X11) and exit nice.</tt></li> <li><tt>08.19.2008 MACOSX: fixed the window tab problem for Aqua port.</tt></li> <li><tt>08.19.2008 MACOSX: fixed canvas background issues.</tt></li> <li><tt>08.20.2008 GUI: Add buttons to vertical layout.</tt></li> <li><tt>09.10.2008 XPA: fixed a problem with blink interval &lt; 1.</tt></li> <li><tt>09.12.2008 PREFS: add 'Preserve During Load' for scale, pan, and regions.</tt></li> <li><tt>09.12.2008 CONTOUR: add dash line option.</tt></li> <li><tt>09.17.2008 PANNER: check to see if we are at pole.</tt></li> <li><tt>09.17.2008 CATALOGS: add copy from row(s).</tt></li> <li><tt>09.17.2008 REGIONS: look for new FITS POLYGON termination conditions</tt></li> <li><tt>09.22.2008 COLORBAR: removed truecolor colorbar options. Always paint the entire image.</tt></li> <li><tt>09.25.2008 BINNING: automatically look for x,y then ra,dec, before settling for columns 1 and 2.</tt></li> <li><tt>09.25.2008 IMEXAM: added 'any' event (returns with a mouse event or key event).</tt></li> <li><tt>10.02.2008 CATALOGS: fixed a problem with size format for SIMBAD and NED. Degrees and ArcSecs were incorrectly calculated.</tt></li> <li><tt>10.03.2008 CATALOGS: Add support for CXC catalog.</tt></li> <li><tt>10.08.2008 MACOSX: add MacOSX X11 10.5 firewall port.</tt></li> <li><tt>10.10.2008 FOV: add sao/binospec.</tt></li> <li><tt><b>10.15.2008 RELEASE version 5.3</b></tt></li> <li><tt>10.17.2008 CATALOGS: removed support for Chandra Source Catalog at request of Ian Evans of CXC.</tt></li> <li><tt>10.22.2008 MASKS: add support for mask transparency.</tt></li> <li><tt>10.24.2008 MASKS: add new mask properties.</tt></li> <li><tt>10.28.2008 GRID: add grid title support.</tt></li> <li><tt><b>10.31.2008 RELEASE version 5.4</b></tt></li> <li><tt>10.31.2008 GRID: full grid support for command line and xpa.</tt></li> <li><tt>11.04.2008 FITSY: fixed a problem with header keywords that start with 'END'.</tt></li> <li><tt>11.13.2008 FITSY: fixed a problem when there was a failure to correctly parse iraf or wcs keywords.</tt></li> <li><tt>12.02.2008 FITS: for saveimage fits, fixed a problem with LTMV,DTMV, and WCS coordinates. They were off by 1 pixel in x.</tt></li> <li><tt>12.02.2008 GUI: fixed a problem with panning via click and drag.</tt></li> <li><tt>12.04.2008 MPEG: changed makefiles to compile tkmpeg code without optiminzation. -O created invalid code for MacOSX (and possible others)</tt></li> <li><tt>12.04.2008 REGIONS: fixed a problem when creating a default panda region via a mouse click.</tt></li> <li><tt>12.05.2008 POSTSCRIPT: fixed a problem with printing frames that have no image loaded.</tt></li> <li><tt>12.05.2008 CATALOGS: fixed a problem with using the arrow keys in catalog dialogs.</tt></li> <li><tt>12.10.2008 REGIONS: fixed a problem elongated rotated ellipses.</tt></li> <li><tt>12.10.2008 MACOSX: fixed several problems with processing AppleEvents OpenDocument and PrintDocument. DS9 now supports opendoc and printdoc while currently running.</tt></li> <li><tt>12.12.2008 IIS: re-enabled mouse events while in cursor mode.</tt></li> <li><tt>12.12.2008 IIS: trap arrow keys while in cursor mode, do not pass to IRAF, instead warp cursor.</tt></li> <li><tt>12.15.2008 SMOOTH: ignore NAN in smoothing convolution.</tt></li> <li><tt>12.16.2008 GUI: fixed a problem with 'get fits size' to make it behave in the regions of poles.</tt></li> <li><tt>12.29.2008 IIS: try to decode OBJECT from iisMessageCmd.</tt></li> <li><tt>12.29.2008 IIS: if frame is in cursor mode (via the imexam task), RESET FRAME, will attempt to clean up.</tt></li> <li><tt>01.05.2009 FUNTOOLS: update to version 1.4.2.2</tt></li> <li><tt>01.05.2009 WCSSUBS: update to version 3.7.6</tt></li> <li><tt>01.05.2009 GUI: add support for loading FITS multiple extension as multiple frames.</tt></li> <li><tt>01.05.2009 EXAMINE: fixed many problems. Will work not work with data loaded via stdin or xpa fits.</tt></li> <li><tt>01.15.2009 SMOOOTH: fixed a problem with BZERO and BSCALE. These keywords are reset to default values if present in the smoothed image, since the scaling has already been applied.</tt></li> <li><tt>01.15.2009 FILTER: fixed an issue when unable to build a valid filter. Previously, it would exit() the program. Now, it will issue an error message and continue.</tt></li> <li><tt>01.16.2009 MACOSX: if using the X11 port of MacOSX, increase the size of the window to make room for the size tab, similar for Aqua.</tt></li> <li><tt>01.16.2009 SAVEAS: PNG now saves without GAMMA.</tt></li> <li><tt>01.20.2009 GUI: Rearrange Frame menu and Region menu. They had grown too long and some window managers were having difficulties.</tt></li> <li><tt>01.21.2009 REGIONS: fixed a problem rendering Bezier curves.</tt></li> <li><tt><b>01.23.2009 RELEASE version 5.5</b></tt></li> <li><tt><b>01.28.2009 RELEASE version 5.5.1</b></tt></li> <li><tt>01.28.2009 GUI: fixed a problem in that the last file name loaded is incorrectly set if there are command line options that follow the file name.</tt></li> <li><tt>02.02.2009 CATALOGS: updated urls for cds mirrors.</tt></li> <li><tt>02.03.2009 CATALOGS: cleaned up tsv code. Will read comma and tab separted values, and will write tab separated values. Assumes first row is cols header unless first and second cols are numbers, then assumes ra, dec, in fk5 degrees.</tt></li> <li><tt>02.04.2009 PSEUDOCOLOR: fixed a problem with the frame not remembering its current colormap bias and contrast setting when toggling between frames.</tt></li> <li><tt>02.10.2009 BLT: fixed a problem zoombox under Aqua. XOR draws are now disabled.</tt></li> <li><tt>02.11.2009 CIAO: The ciao regions parser will now accept compound region descriptions.</tt></li> <li><tt>02.12.2009 CONTOURS: fixed a problem with command line/xpa dashed line parameter. Processing the -contour command is now a lot more robust in determining missing parameters.</tt></li> <li><tt>02.16.2009 HISTOGRAM EQU: fixed a problem with clipping low = clipping high (usually as a result of ZSCALE).</tt></li> <li><tt>02.19.2009 FITSY++: fixed a problem specifying an extension number of 0 with a multiple extension file with no primary image. It now properly fails to load.</tt></li> <li><tt>02.19.2009 GUI: FITS multiple extension multiple frame will now load a primary image if present.</tt></li> <li><tt>02.19.2009 GUI: compressed FITS multiple extension multiple frame will now load properly.</tt></li> <li><tt>02.19.2009 GUI: FITS multiple extension multiple frame will ignore any bin table extensions.</tt></li> <li><tt>02.19.2009 BLT: add support for MacOSX native printing.</tt></li> <li><tt>02.19.2009 PLOT: native printing now fully supported for MacOSX and Windows.</tt></li> <li><tt>02.24.2009 SAMP: add support for VO Simple Application Messaging Protocol (SAMP). Will process image.load.fits and table.load.votable events.</tt></li> <li><tt>02.25.2009 FITSY++: fixed a problem with saving a slice of a cube. The header had invalid keywords.</tt></li> <li><tt>02.27.2009 CATALOGS: support VOTable format.</tt></li> <li><tt>03.02.2009 MacOSX: support for the MacOSX X11 Leopard 10.5 non-firewall version has been discontinued.</tt></li> <li><tt>03.02.2009 MacOSX: fixed a problem with plot y axis titles offset.</tt></li> <li><tt>03.02.2009 MacOSX: fixed a problem fork/exec and version 10.5 New version of tclMacNotify.c now used.</tt></li> <li><tt>03.09.2009 FUNTOOLS: updated to version 1.4.3.</tt></li> <li><tt>03.10.2009 REGIONS: fixed a problem with listing irregular panda, ellipse panda, and box panda in ds9/funtools format. The conjunction has been removed.</tt></li> <li><tt>03.12.2009 GUI: If in tile mode, with only one frame, and tile mode is set to manual, tile anyway (don't drop into single mode).</tt></li> <li><tt>03.12.2009 CATALOGS: speed up rendering of catalogs for simple symbol filters.</tt></li> <li><tt>03.12.2009 REGIONS: support wildcards in filename.</tt></li> <li><tt>03.12.2009 REGIONS: add support for load into all frames.</tt></li> <li><tt>03.17.2009 GUI: Name server support now utilizies CDS Sesame.</tt></li> <li><tt>03.17.2009 SKYVIEW: fixed a problem processing the survey query.</tt></li> <li><tt>03.18.2009 HV: add support for cookies.</tt></li> <li><tt>03.18.2009 ARCHIVES: add support for NVO Montage.</tt></li> <li><tt>03.18.2009 REGIONS: fixed a problem calculating the WCS angle of a flipped WCS.</tt></li> <li><tt>03.18.2009 HV: add support for mime-type text/xml for votable.</tt></li> <li><tt>03.19.2009 CATALOGS: CDS now uses VOTABLE.</tt></li> <li><tt>03.24.2009 CATALOGS: SIMBAD now uses VOTABLE.</tt></li> <li><tt>03.24.2009 CATALOGS: NED now uses VOTABLE.</tt></li> <li><tt>03.24.2009 CATALOGS: add preferences to download in VOTABLE if available.</tt></li> <li><tt>04.01.2009 GUI: when you delete a frame, the current frame is reset to the previous frame, not the first frame.</tt></li> <li><tt>04.06.2009 RULER: use preferences default distance system.</tt></li> <li><tt>04.06.2009 GUI: fixed a problem with open other url.</tt></li> <li><tt>04.09.2009 PROJECTION: properly calculate width when rebinning.</tt></li> <li><tt><b>04.15.2009 RELEASE version 5.6</b></tt></li> <li><tt>04.16.2009 REGIONS: fixed a rather nasty bug which caused a segv when switching between modes after copy a region from a frame.</tt></li> <li><tt><b>04.16.2009 RELEASE version 5.6.1</b></tt></li> <li><tt>04.17.2009 SAMP: use xmlrpc url method in POST header.</tt></li> <li><tt>04.17.2009 CATALOGS: fixed a typo in the default SDSSR5 query.</tt></li> <li><tt>04.20.2009 HV: fixed a problem with parsing query linked to a button.</tt></li> <li><tt><b>04.20.2009 RELEASE version 5.6.2</b></tt></li> <li><tt>04.22.2009 PREFS: updated the default name server menu.</tt></li> <li><tt>04.24.2009 FIRST: removed a debug statement which was left in.</tt></li> <li><tt>04.27.2009 REGIONS: fixed a problem loading a fits file with specified extension.</tt></li> <li><tt>04.28.2009 HV: fixed again a problem with parsing url within a link with a query which contains a '?'.</tt></li> <li><tt><b>04.30.2009 RELEASE version 5.6.3</b></tt></li> <li><tt>05.01.2009 REGIONS: fixed a problem creating a text region with arcsec or arcmin char.</tt></li> <li><tt>05.01.2009 NAMESRVR: fixed a problem with simbad cfa sexagesimal.</tt></li> <li><tt>05.01.2009 CATALOGS: fixed a problem with quoting a VOTABLE FIELD DESCRIPTION string.</tt></li> <li><tt>05.01.2009 CATALOGS: add column parameters in header output.</tt></li> <li><tt>05.04.2009 SAMP: fixed a problem with select row list.</tt></li> <li><tt>05.04.2009 REGIONS: add list to xpa and command line regions option.</tt></li> <li><tt>05.21.2009 NVSS: add NVSS Image server back.</tt></li> <li><tt>05.26.2009 NAMESRVR: set default name server to cds.</tt></li> <li><tt>05.26.2009 CATALOGS: set default catalog erver to cds.</tt></li> <li><tt>05.26.2009 SAMP: fixed a proble with quoting filenames and urls for xml.</tt></li> <li><tt>05.26.2009 CATALOGS: will now try to determine the RA and DEC cols via the UCD if available.</tt></li> <li><tt>05.26.2009 GUI: fixed a problem with standard dialog boxes and MacOSX Aqua and Windows. The dialogbox would sometimes fail to rise to top.</tt></li> <li><tt>05.27.2009 GUI: WCS menu correctly updates print coordinate parameters.</tt></li> <li><tt>05.27.2009 REGIONS: autocentroid now works for move, edit, and rotate.</tt></li> <li><tt>05.27.2009 CATALOGS: CDS Search now retrieves search options from cds.</tt></li> <li><tt>05.27.2009 CATALOGS: fixed a problem with FILTER and VOTable. The votable cols params were not being properly transfered to the new filtered table.</tt></li> <li><tt>06.10.2009 REGIONS: DS9 regions syntax now supported in VOTable format.</tt></li> <li><tt>06.11.2009 CATALOGS: "No Items Found" is now displayed on status line and not as a model dialog.</tt></li> <li><tt>06.11.2009 REGIONS: fixed problem with dashed lines with rotated ellipses.</tt></li> <li><tt>06.11.2009 GUI: fixed problem with standard file dialog boxes. Now, command line options and xpa command DOES NOT CHANGE the current directory. Only the use of the dialog box will reset the current directory.</tt></li> <li><tt>06.11.2009 SAMP: don't send empty catalogs.</tt></li> <li><tt>06.11.2009 CATALOGS: don't write empty catalogs.</tt></li> <li><tt>06.11.2009 FILTER: fixed a problem with parsing filters on the command line that contain quotes.</tt></li> <li><tt>06.16.2009 SAMP: the samp port number is now automatically determined at connection time.</tt></li> <li><tt>06.17.2009 CATALOGS: for VOTables, change id to ID.</tt></li> <li><tt>06.17.2009 CATALOGS: Add ID param to CXC catalog.</tt></li> <li><tt>06.17.2009 SAMP: send unique catalog table-id for each catalog so tha multiple copies of ds9 with the same catalog loaded don't walk all over each other when connected to a hub.</tt></li> <li><tt>06.18.2009 REGIONS: Update info box, graphs, and pixel table when draging in pointer and catalog mode.</tt></li> <li><tt>06.18.2009 GUI: clean up code which enables/disables WCS menus based on current frame.</tt></li> <li><tt>06.19.2009 HV: add support for arrow keys and mouse wheel.</tt></li> <li><tt>06.19.2009 HV: add support for copy key shortcut.</tt></li> <li><tt>06.19.2009 HV: add support for Return key shortcut for Submit.</tt></li> <li><tt>06.25.2009 GUI: update crosshair, infobox, pixeltable when changing current slice in crosshair mode.</tt></li> <li><tt>06.25.2009 REGIONS: fixed a problem with create/load/save regions with mosaic. The WCS of the first mosaic segment loaded is used for all regions.</tt></li> <li><tt>06.30.2009 REGIONS: removed listwcs option for ds9 format.</tt></li> <li><tt>06.30.2009 IIS: disabled annoying 'port/addr already in use' error message.</tt></li> <li><tt>07.06.2009 BINNING: add update button to bin dialog.</tt></li> <li><tt>07.06.2009 HV: add enhancements to allow complete control over a web browser window.</tt></li> <li><tt>07.06.2009 VO: add enhancements to allow complete control over the vo dialog.</tt></li> <li><tt>07.09.2009 XPA: 'page setup' has been renamed pagesetup.</tt></li> <li><tt>07.15.2009 HV: support for sync http added.</tt></li> <li><tt>07.15.2009 VO: support for sync http added.</tt></li> <li><tt>07.15.2009 ANALYSIS: support for sync http added.</tt></li> <li><tt>07.15.2009 ANALYSIS: analysis tasks invoked via xpa or command line are now run in blocking (sync) mode.</tt></li> <li><tt>07.16.2009 XPA: added optional param to xpaget array to specify the endianness.</tt></li> <li><tt>08.05.2009 XPA: add sleep command.</tt></li> <li><tt>08.05.2009 GUI: add sleep command line option.</tt></li> <li><tt>08.10.2009 GUI: fixed command line option commands.</tt></li> <li><tt>08.10.2009 CATALOGS: for CDS catalogs, ignore the UCD at first and look for _RAJ2000 and _DEJ2000, then the UCD, then a list of common names.</tt></li> <li><tt>08.11.2009 GUI: update Magnifier in Pan mode and key arrows.</tt></li> <li><tt>08.12.2009 WINDOWS: Add support for wildcard filename expansion if invoked from DOS shell.</tt></li> <li><tt>08.12.2009 REGIONS: Add support for load template at ra dec skyframe.</tt></li> <li><tt>08.20.2009 MOSAIC: default for loading mosaics is now WCS not IRAF.</tt></li> <li><tt>08.25.2009 SAMP: implemented full XPA capabilities via SAMP.</tt></li> <li><tt>08.25.2009 I18N: make changes to fitsy++ lexer to allow non-single byte chars in filenames and paths.</tt></li> <li><tt>08.26.2009 SAMP: fixed a problem with parsing the hub.xmlrup.url.</tt></li> <li><tt>08.26.2009 XPA: update to version 2.1.10.</tt></li> <li><tt>08.27.2009 FUNTOOLS: update to version 1.4.4.</tt></li> <li><tt>09.01.2009 SAMP: fixed a problem with extra key value pairs in message.</tt></li> <li><tt>09.01.2009 CATALOGS: add default samp command.</tt></li> <li><tt>09.01.2009 CATALOGS: removed modal dialog info box calls. Messages are now updated in the status windows.</tt></li> <li><tt>09.01.2009 GUI: added new level of menu updates that are only executed when a frame is create or deleted and not everytime there is a change of state.</tt></li> <li><tt>09.03.2009 WINDOWS: disable menu updates during blinking because windows redraws the menu window each time the configuration is changed.</tt></li> <li><tt>09.03.2009 SOLARIS: removed support for Solaris<9.0. DS9 now requires libxml2 be supported by the OS.</tt></li> <li><tt>09.03.2009 GUI: added signal handling for non-windows. We now trap SIGINT and clean up before exiting.</tt></li> <li><tt>09.08.2009 I18N: fixed a problem with spaces in filename.</tt></li> <li><tt>09.08.2009 SAMP: fixed a problem using a hub that uses the Apache xmlrpc library.</tt></li> <li><tt>09.10.2009 SAMP: fixed a problem with invalid ds9.get commands.</tt></li> <li><tt>09.10.2009 GUI: cmap xpa, samp, and command line option is now much more tolerant to capitalization and spellings.</tt></li> <li><tt>09.10.2009 WINDOWS: tcc is now used for the bin filter compiler. cygwin is no longer required.</tt></li> <li><tt>09.21.2009 MACOSX: ports to Tiger (10.4), Leopard (10.5), and Snow Leopard (10.6) are now built under 10.6</tt></li> <li><tt>09.22.2009 MACOSX: fixed a problem with snowleopard. For 32bit visuals, the alpha channel is set to 0xff, not 0.</tt></li> <li><tt>09.28.2009 XPA: add XPA connect/disconnect menu options.</tt></li> <li><tt>09.29.2009 RGB: fixed a problem with displaying images with NAN.</tt></li> <li><tt>10.02.2009 MACOSX: pcc is now used for the bin filter compiler of i386 platforms if XCode is not installed./tt></li> <li><tt>10.09.2009 ANALYSIS: fixed a problem with analysis plot command to maintain backward compatibility./tt></li> <li><tt>10.12.2009 SMOOTH: fixed a problem that smooth is reset when no image is loaded. /tt></li> <li><tt><b>10.15.2009 RELEASE version 5.7</b></tt></li> </ol> </ol> </body> </html> ������������������������������������������������������������������������������������������saods9/ds9/doc/release/r6.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000042540 11556610245 016635� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 6 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 6 Release Notes</h3> <ol> <ol> <li><tt>10.20.2009 XPA: moved processing xpa command line options to first pass, and init xpa earlier in startup, so that vo and web click can be processed along with regular command line options. </tt></li> <li><tt>10.24.2009 UPDATE: fixed a problem with trying to provide support for backward compatibility.</tt></li> <li><tt>10.24.2009 IMGSVR: fixed a problem with trying to provide support for backward compatibility</tt></li> <li><tt>10.24.2009 GUI: sleep command arg is now optional</tt></li> <li><tt>10.24.2009 MOSAIC: IRAF mosaics are now layed out based on the first segment load, like WCS mosaics</tt></li> <li><tt>10.27.2009 GUI: fixed a problem if you delete all frames, some of the load commands (such as -rgbcube) are not executed until there is a new frame. Now, if there are no frames, the load command will create a new frame if needed</tt></li> <li><tt>10.28.2009 REGION: Corrected a problem with creating templates from a VAR. Uncommented old syntax which has been superceeded</tt></li> <li><tt>11.02.2009 GRID: fixed a problem with 'grid numlab gap2'</tt></li> <li><tt>11.02.2009 AST: updated to version 5.3-1 <li><tt>11.05.2009 TILE: corrected documentation for '-tile grid layout', should be column #, row #</tt></li> <li><tt>11.05.2009 DATACUBE: fixed a problem with '-wcs replace|reset|append'. The result WCS is now applied to all slices</tt></li> <li><tt>11.05.2009 XPA: fixed a problem with 'xpaset wcs replace foo.wcs'</tt></li> <li><tt>11.13.2009 RICE: updated to cfitsio 3210/tt></li> <li><tt>11.16.2009 COMPRESS: fixed a problem with compression that extends over a page boundry of 1Gb</tt></li> <li><tt>11.30.2009 GRID: fixed a problem with exterior numerics and zoomed images</tt></li> <li><tt>11.30.2009 HELP: combine FAQ and ISSUES pages</tt></li> <li><tt>12.04.2009 RGB: aux contour overlays are now displayed on a per channel basis</tt></li> <li><tt>12.07.2009 RGB: rgb images with data cubes can now set the current slice on a per channel basis</tt></li> <li><tt>12.07.2009 VO: fixed a problem with xpa keep-alive</tt></li> <li><tt>12.10.2009 TK: fixed a problem MacOSX X11 standard file dialog boxes. Borrowed code from tk8.5 to correct the problem when events are added to X11</tt></li> <li><tt>12.10.2009 GUI: fixed a problem with modal dialogs when the user closed the window via the window manager and not the OK/CANCEL button</tt></li> <li><tt>12.10.2009 XPA: update to version 2.1.11</tt></li> <li><tt>12.14.2009 RGB: fixed a problem with a incorrect WCS compass in the panner image</tt></li> <li><tt>12.15.2009 WCS: Documented the old ALIGN command and updated for XPA and SAMP</tt></li> <li><tt>12.15.2009 GUI: Values accepted for SKYFORMAT expanded to 'deg', 'degree', and 'degrees' for command line options, XPA, and SAMP</tt></li> <li><tt>12.17.2009 WCS: added code to test for bad WCS alignment issues (mainly from CAR projection, or pole problems)</tt></li> <li><tt>12.17.2009 WCS: added code for WCS alignment for CAR. If CAR, getWCScrpix() is taken from center of image, and not from CRPIX keywords</tt></li> <li><tt>12.18.2009 CATALOG: added USNO UCAC3 to the Optical list</tt></li> <li><tt>12.24.2009 DATACUBE: DS9 now supports FITS images up to 10 dimensions. Happy Holidays!</tt></li> <li><tt>12.28.2009 ANALYSIS: fixed problems with $data and $url and spaces in the tmp directory path name</tt></li> <li><tt>12.28.2009 COMM: fixed problems with spaces in file names received as argumetns via SAMP and http</tt></li> <li><tt>12.29.2009 REGION: fixed problems with XPA/SAMP and -format/-system/-sky options</tt></li> <li><tt>12.29.2009 GUI: fixed a problem with hiding the current frame</tt></li> <li><tt>12.30.2009 HV: at EXIT, close all opened HV windows so that tmp files may be deleted</tt></li> <li><tt>12.30.2009 HV: fixed a problem for MIME type 'multipart/mixed', a tmp file was not deleted</tt></li> <li><tt>12.30.2009 HV: fixed a problem for MIME type 'text/plain', a tmp file was not deleted</tt></li> <li><tt>12.30.2009 ANALYSIS: add $filedialog(open) and $filedialog(save) macros</tt></li> <li><tt>12.30.2009 GUI: allow filenames starting with a '-'</tt></li> <li><tt>01.07.2009 I18N: for X11 port, look for LC_MESSAGES, LC_ALL, LANG env vars to set langage in that order</tt></li> <li><tt>01.07.2009 I18N: update Japanese language translation</tt></li> <li><tt>01.07.2009 CONTOUR: fix muliple problems with command line contour options. Each frame will now remember contour params between frames</tt></li> <li><tt>01.08.2009 ANALYSIS: minor changes in output of get analysis commands. Now include parameters for web and bind commands</tt></li> <li><tt>01.11.2009 COLORBAR: fixed a problem with the orientation of the numerics for vertical colorbar. This problem was introduced with AST-5.3</tt></li> <li><tt>01.11.2009 RGB: fixed a memory leak for RGB frames</tt></li> <li><tt>01.11.2009 I18N: update Japanese language translation</tt></li> <li><tt>01.11.2009 MACOSX: fixed a problem with non-native standard file dialog boxes and error messages</tt></li> <li><tt>01.12.2009 AST: fixed a memory leak with colorbar grid.</tt></li> <li><tt>01.13.2009 PLOT: fixed a rare problem when the user closes a plot while in the middle of a zoom.</tt></li> <li><tt>01.13.2009 IRAF: fixed a problem for mosaic iraf images are loaded and the bounding box is incorrectly calculated.</tt></li> <li><tt><b>01.15.2010 RELEASE version 6.0</b></tt></li> <li><tt>01.27.2010 XPA: fixed a problem with reporting errors during an XPA operation. The correct error message is now passed to XPA.</tt></li> <li><tt>01.27.2010 SAMP: fixed a problem with reporting errors during an SAMP operation. The correct error message is now passed to SAMP.</tt></li> <li><tt>01.27.2010 REGION: fixed a problem with catch and XPA/SAMP. Errors are now reset when needed so as not to invoke an XPA/SAMP ERROR message.</tt></li> <li><tt>01.27.2010 XPA: update to version 2.1.12</tt></li> <li><tt>02.02.2010 CONTOURS: fixed a problem with manually entered contours values.</tt></li> <li><tt>02.12.2010 COLORBAR: add numerics equal distance option.</tt></li> <li><tt>02.12.2010 COLORBAR: add colorbar size option.</tt></li> <li><tt>02.12.2010 COLORBAR: move colorbar parameters from view menu to colorbar menu.</tt></li> <li><tt>02.18.2010 MACOSX: fixed a problem where pcc was always being installed. Now, first look for FILTER_CC (valid for X11 users only). Next, see if /usr/bin/gcc exists. Finally, install pcc if needed, and set to use it.</tt></li> <li><tt>02.25.2010 SCALE: fixed numerous problems with LOG and POW scales. Previously, the exp value of the log ratio was based on the dynamic range of the data. It is now specified by the user. This solves a number of issues with data which contains negative values. (see new documenation on scale equations).</tt></li> <li><tt>02.25.2010 CATALOG: CSC is now loaded as a VOTABLE by default.</tt></li> <li><tt>03.02.2010 CATALOG: add support for SkyBot catalog server.</tt></li> <li><tt>03.03.2010 MACOSX: printing, reduce image by 5% so colorbar end tick numerics are not cutoff.</tt></li> <li><tt>03.03.2010 WINDOWS: printing, reduce image by 5% so colorbar end tick numerics are not cutoff.</tt></li> <li><tt>03.03.2010 HV: fixed a problem with MouseWheel scrolling under X11.</tt></li> <li><tt>03.04.2010 ZOOM: added support for mouse wheel zoom.</tt></li> <li><tt>03.04.2010 HV: added support for Find and FindNext.</tt></li> <li><tt>03.10.2010 POSTSCRIPT: if colorbar and colorbar numerics are visible, reduce image by 5% so colorbar end tick numerics are not cutoff.</tt></li> <li><tt>03.10.2010 PRINT: add psprint xpa/command/samp command for postscript printing on MacOSX and Windows.</tt></li> <li><tt>03.10.2010 GRID: add support for custom numeric formats.</tt></li> <li><tt>03.17.2010 BIN: add support for Match Bin.</tt></li> <li><tt>03.23.2010 FITS: add a check tor binary tables with no rows or cols.</tt></li> <li><tt>03.24.2010 WINDOWS: fixed a problem with native printing and bitmaps that were not aligned upon a word boundary.</tt></li> <li><tt>03.24.2010 WINDOWS: fixed a problem with rendering circle point and box circle point.</tt></li> <li><tt>03.26.2010 HV: fixed a rather nasty bug. If a HV window is open when prefs are saved, the next time ds9 is started, upon exist it tried to close an non-existent window, and went into a loop.</tt></li> <li><tt>03.29.2010 SAMP: add support for table.load.fits events.</tt></li> <li><tt>04.13.2010 BACKUP: add support for backup and restore.</tt></li> <li><tt>04.14.2010 GUI: ensure all temp files in /tmp have unique names which will not conflict with other programs.</tt></li> <li><tt>04.14.2010 RGB: corrected inconsistant behavior. The creation of a RGB frame will not alter the single/tile setting.</tt></li> <li><tt>04.16.2010 TK: fixed a problem with some tk lib scripts not sourced at startup and if -cd is executed, ds9 is unable to locate the scripts.</tt></li> <li><tt>04.16.2010 CIAO: removed any conjuction operators (which are not supported).</tt></li> <li><tt>04.16.2010 COLORBAR: fixed a rather nasty memory bug which was invoked when the colorbar was re-configured.</tt></li> <li><tt>04.23.2010 BACKUP: backup save sets can be saved into on a repeat basis.</tt></li> <li><tt>04.26.2010 SCALE: fixed a problem with segv and Scale Dialog box.</tt></li> <li><tt>04.26.2010 GUI: fixed a problem matching frames while in single mode.</tt></li> <li><tt>04.29.2010 GUI: add cycle windows key shortcut.</tt></li> <li><tt>05.04.2010 WINDOWS: new windows installation procedure.</tt></li> <li><tt>05.06.2010 CATALOG: add IAU location code in preferences (for Skybot).</tt></li> <li><tt>05.10.2010 REGION: fixed a problem with projection region when one or both end points are off the image. All gaps (mosaic) or off image (non-mosaic) have a value of 0 and NaNs are ignored.</tt></li> <li><tt>05.12.2010 VOTable: add support for FIEDref and PARAMref elements.</tt></li> <li><tt><b>05.15.2010 RELEASE version 6.1</b></tt></li> <li><tt>05.18.2010 WINDOWS: change windows installation procedure back to allow user to specify destination directory.</tt></li> <li><tt>05.18.2010 SAMP: fixed an issue with DS9 being confused as to if it is currently connected and the need to shutdown SAMP at exit.</tt></li> <li><tt><b>05.18.2010 RELEASE version 6.1.1</b></tt></li> <li><tt>05.19.2010 BACKUP: fixed several major problems.</tt></li> <li><tt>05.19.2010 PSEUDOCOLOR: fixed a typo.</tt></li> <li><tt><b>05.19.2010 RELEASE version 6.1.2</b></tt></li> <li><tt>05.20.2010 MACOSX: always install pcc if gcc not available. We don't want old versions of pcc around after upgrades of the OS.</tt></li> <li><tt>05.28.2010 PLOT: added statistics window for plots.</tt></li> <li><tt>05.28.2010 PLOT: fixed some problems with menus and clear data.</tt></li> <li><tt>05.28.2010 NAMESERVER: add get option to return coords directly to calling proc.</tt></li> <li><tt>06.17.2010 CHECKDNS: update chechdns to add support for actually connect.</tt></li> <li><tt>06.17.2010 VO: use checkdns to look for active server. If none found, used hard coded list.</tt></li> <li><tt>06.21.2010 ZOOM TO FIT: center image exactly, do not round to nearest whole pixel.</tt></li> <li><tt>06.21.2010 BACKUP: don't save prefs(version) var. We want the current preference file version, not the save set version.</tt></li> <li><tt>06.21.2010 GUI: ds9 will now look for its auxiliary file using the current name of the executable.</tt></li> <li><tt>06.30.2010 WCS: add WCS Edit dialog.</tt></li> <li><tt>07.01.2010 XPA: add frame has command.</tt></li> <li><tt>07.01.2010 SAMP: add frame has command.</tt></li> <li><tt>07.09.2010 SAMP: fixed a problem with updating the connect meun item after a manual disconnect.</tt></li> <li><tt>07.09.2010 SAMP: added support for SAMP_HUB env var.</tt></li> <li><tt>07.13.2010 COLORBAR: fixed a problem with a bad default -size param. This problem only showed up with a pseudocolor8 visual.</tt></li> <li><tt>07.15.2010 GUI: implemented support for internal error message facility. Any fatal internal error event will trigger an GUI error message, hopefully leaving the user the option to save data and to exit gracefully.</tt></li> <li><tt>07.15.2010 GUI: implemented support for trapping the SIGBUS signal and routing it to the internal error message facilty. This usually occurs when a data file has been overwritten or a shared memory segment is no longer available.</tt></li> <li><tt>07.27.2010 PLOT: save font info when save configuration.</tt></li> <li><tt>08.04.2010 REGION: fixed a problem with the close button on EPANDA and BPANDA dialog boxes.</tt></li> <li><tt>08.05.2010 COLORBAR: fixed a problem when the image is all one value.</tt></li> <li><tt>08.10.2010 GUI: add Frame Match Image, Physical, Detector, Amplifier buttons.</tt></li> <li><tt>08.12.2010 MAGNIFIER: add magnifier prefs for XPA, SAMP, and the command line.</tt></li> <li><tt>08.12.2010 MAGNIFIER: add magnifier color option.</tt></li> <li><tt>08.17.2010 GRID: fixed a problem with init colors.</tt></li> <li><tt>08.17.2010 GRID: now supports colors in form #ffffff.</tt></li> <li><tt>08.18.2010 CONTOURS: fixed an issue when loading aux contours which do not end with a linefeed.</tt></li> <li><tt>08.23.2010 COLORBAR: fixed an issue when printing colorbar from the command line. The numerics are now updated before printing.</tt></li> <li><tt>08.23.2010 COLORBAR: fixed an issue when rendering numerics. Numerics are now properly positioned, regardless of colorbar orientation or font.</tt></li> <li><tt>08.25.2010 GRID: fixed a number of issues when rendering grid numerics. Numerics are now properly positioned, regardless of orientation or font.</tt></li> <li><tt>08.27.2010 POSTSCRIPT: fixed a rather nastsy prolblem with the level 2 postscript driver (Ascii85 filter) in which, sometimes, the last line of the image would not be written.</tt></li> <li><tt>08.30.2010 POSTSCRIPT: add new postscript level 3 driver, which uses Flate and Ascii85 filters.</tt></li> <li><tt>08.31.2010 COLORBAR: add support for user specified number of tickmarks to be displayed.</tt></li> <li><tt>08.31.2010 CATALOG: The user can now invoke a blank catalog tool via the command line, xpa, or samp.</tt></li> <li><tt>09.01.2010 TCL/TK: upate to version 8.5.8.</tt></li> <li><tt>09.01.2010 CATALOG: add font properties to display symbol database.</tt></li> <li><tt>09.07.2010 CATALOG: now supports image/physical coordinate systems.</tt></li> <li><tt>09.21.2010 CONTOUR: copy/paste contours no longer requires equatorial sky param.</tt></li> <li><tt>09.21.2010 REGION: copy/paste contours no longer requires equatorial sky param.</tt></li> <li><tt>09.21.2010 SAVEAS: add optional params for jpeg, mpeg and tiff command line options.</tt></li> <li><tt>09.22.2010 FOV: update Chandra Templates.</tt></li> <li><tt>09.22.2010 GUI: add open and close support for XPA, SAMP, and command line, for all dialogs.</tt></li> <li><tt>09.28.2010 COLORBAR: fixed a problem with generating colorbar values when no frame is available.</tt></li> <li><tt>09.30.2010 HV: fixed a problem with multiple cookies, which created a bad header.</tt></li> <li><tt>09.30.2010 VO: fixed a problem with 'xpaget ds9 vo connect'. Now returns only the current connections, not all possible connections.</tt></li> <li><tt>09.30.2010 REGION: added check for no frame and no image loaded for xpaset regions via stdin.</tt></li> <li><tt>09.30.2010 ANALYSIS: add 'task #|name' command.</tt></li> <li><tt>10.01.2010 ANALYSIS: fixed a problem when an analysis file was loaded after an image had been loaded. Them menu was not properly updated to reflect the template for each menu item.</tt></li> <li><tt>10.05.2010 CUBE: fixed a problem in which sometimes changing the current slice whould hang.</tt></li> <li><tt>10.05.2010 CUBE: add support for WCS in cube dialog.</tt></li> <li><tt>10.07.2010 CENTROID: add support centroid params xpa/command line.</tt></li> <li><tt>10.07.2010 CENTROID: fix some problems with an offset of .5 pixels.</tt></li> <li><tt>10.07.2010 SMOOTH: new frames inherit current smooth params.</tt></li> <li><tt>10.07.2010 RGB: fixed a problem when the first image load has a flipped wcs.</tt></li> <li><tt>10.08.2010 REGION: add CIRCLE3D region.</tt></li> <li><tt>10.11.2010 BACKUP: fixed a problem with smoothed images and contours.</tt></li> <li><tt>10.14.2010 HELP: fixed a problem with finding the help files if the CD command has changed the default directory.</tt></li> <li><tt>10.14.2010 XPA: update to version 2.1.13</tt></li> <li><tt><b>10.15.2010 RELEASE version 6.2</b></tt></li> </ol> </ol> </body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/release/r7.0.html��������������������������������������������������������������������000644 �000765 �000000 �00000130773 12634602111 016633� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>DS9 Version 7 Release Notes</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3> <img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Version 7 Release Notes</h3> <ol> <ol> <li><tt>10.18.2010 SCALE: fixed a problem preserve Scale at load.</tt></li> <li><tt>10.18.2010 REGION: add group new, group update, and select invert commands.</tt></li> <li><tt>10.20.2010 TCL/TK: update to version 8.5.9.</tt></li> <li><tt>12.01.2010 FOV: Add HEASARC/Suzaku templates for HXD, XIS, and XRS</tt></li> <li><tt>12.03.2010 CATALOG: fixed a problem when dec is specified as -00:xx:xx for CXC, SIMBAD, SKYBOT, and SKYVIEW</tt></li> <li><tt>12.07.2010 BINNING: update WCS keywords for FITS bintables</tt></li> <li><tt>12.10.2010 GUI: fixed a problem with displaying greek letters under linux.</tt></li> <li><tt>12.24.2010 MOSAIC: fixed a problem introduced with verison 6.1 with wcs mosaics when first segment is flipped.</tt></li> <li><tt>12.24.2010 MOSAIC: removed the FLT_EPSILON fudge factors in calculating mosaic segment matrices.</tt></li> <li><tt>01.04.2011 SOLARIS: fixed a major bug with color allocation.</tt></li> <li><tt>02.03.2011 POSTSCRIPT: all ports now generate identical postscript output (with a minor exception with ast grid numerics).</tt></li> <li><tt>02.03.2011 TEXT: selecting a TEXT region now handles rotated text correctly.</tt></li> <li><tt>02.18.2011 GROUPS: fixed a problem with selecting multiple regions.</tt></li> <li><tt>02.21.2011 PIXELTABLE: fixed two problems with xpa and copy commands.</tt></li> <li><tt>02.28.2011 GUI: add theme options.</tt></li> <li><tt>03.01.2011 TKTABLE: updated to version 2.10.</tt></li> <li><tt>03.03.2011 POSTSCRIPT: add new scale factor.</tt></li> <li><tt>03.02.2011 GUI: all dialogs now use the new ttk widgets (with a few exceptions).</tt></li> <li><tt>03.04.2011 PREFS: add -bg and -nan xpa/command line options.</tt></li> <li><tt>03.14.2011 MOSAIC: added patch from Frank Valdes for default DETSIZE values.</tt></li> <li><tt>03.14.2011 CMAP: add load/save xpa/command line options.</tt></li> <li><tt>03.14.2011 BACKUP: fixed a problem with saved cmaps. Pathname is now relative.</tt></li> <li><tt>03.17.2011 TKIMG: updated to version 1.4.</tt></li> <li><tt>03.17.2011 ZLIB: updated to version 1.2.5</tt></li> <li><tt>03.18.2011 WCSSUBS: updated to version 3.8.2</tt></li> <li><tt>04.05.2011 AST: updated to version 5.6-0</tt></li> <li><tt>04.05.2011 WCS: fixed/improved support for TNX, ZPN, ZPX, CAR.</tt></li> <li><tt>04.25.2011 WCS: use AST for most WCS functions.</tt></li> <li><tt>04.25.2011 SCALE: fix Scale Dialog formating issues.</tt></li> <li><tt>04.26.2011 HELP: All user manual images are now local.</tt></li> <li><tt>04.26.2011 CONTOUR: fixed problem with generating contours with BITPIX=-64.</tt></li> <li><tt>04.26.2011 SMOOTH: now generates BITPIX=-64 image.</tt></li> <li><tt>04.27.2011 SCALE: fixed a problem with setting scale user limits and then loading an image.</tt></li> <li><tt>04.28.2011 EXTERNAL FILE: fixed a problem with macro substitution $filename.</tt></li> <li><tt>04.28.2011 FUNTOOLS: updated to version 1.4.5.</tt></li> <li><tt>04.28.2011 XPA: reinstalled version 2.1.13.</tt></li> <li><tt>05.02.2011 WCS: use AST for all FITS WCS projections and DSS. Use WCSSUBS for TNX, ZPX, SIP, SCAMP, WCSDEP.</tt></li> <li><tt>05.06.2011 WCS: Added additional reverse transformation (thanks Ed Los) for calculation of Panner WCS compass.</tt></li> <li><tt>05.09.2011 GRID: add support for non-standard WCSDEP keyword.</tt></li> <li><tt>05.12.2011 IMGSVR: for all image servers (2mass,dss,first,nvss,skyview) if invoked with no argument, yet dialog has a name or coords, automatically retreive the image.</tt></li> <li><tt>05.12.2011 FITS: External File support- fixed a problem where the channel was not closed after the open pipe cmd was invoked and ds9 would run out of resources.</tt></li> <li><tt>05.13.2011 GUI: enhanced/implemented Match/Lock Crosshairs.</tt></li> <li><tt>05.13.2011 GUI: enhanced/implemented Match/Lock Frames.</tt></li> <li><tt>05.13.2011 GUI: Moved Match Scale/Bin/Colorbar to respective menus.</tt></li> <li><tt>05.16.2011 CONTOUR: fixed a problem with NAN in data.</tt></li> <li><tt>05.17.2011 CATALOG: NED fixed a problem with getURL and added support for in/out sys/sky formats.</tt></li> <li><tt>05.19.2011 CATALOG: SIMBAD added support for in/out sys/sky formats.</tt></li> <li><tt>05.19.2011 CATALOG: CDS added support for in/out sys/sky formats.</tt></li> <li><tt>05.20.2011 COMPOSITE: speed up create/delete composite region with +1000 regions.</tt></li> <li><tt>05.20.2011 WCS: implemented preferred WCS for each frame. All WCS functions use the preferred WCS (i.e. copy/paste/load/save regions, contours, align, match, lock, rgb, cube).</tt></li> <li><tt>05.25.2011 WCSSUBS: updated to version 3.8.3.</tt></li> <li><tt>05.25.2011 AST: updated to version 5.7-0.</tt></li> <li><tt>05.26.2011 WCS: use AST for TNX,ZPX,SCAMP.</tt></li> <li><tt>05.27.2011 REGIONS: if unable to copy/cut/paste in WCS, fall back upon PHYSICAL.</tt></li> <li><tt>05.27.2011 REGIONS: if unable to map coordinates correctly, do not a region.</tt></li> <li><tt>06.03.2011 WCS: added support for xLON/xLAT and xyLN xyLT WCS.</tt></li> <li><tt>06.03.2011 REGIONS: added regions properites commands to xpa,samp, and command line.</tt></li> <li><tt>06.10.2011 HEALPIX: added support for generating an image from a healpix table (both binary and ascii).</tt></li> <li><tt>06.13.2011 WCS: use AST for all WCS including TAN-SIP and WCSDEP.</tt></li> <li><tt>06.16.2011 SAMP: added code to clean up better when DS9 is unable to parse a SAMP hub file.</tt></li> <li><tt>06.16.2011 REGIONS: be sure to return template id when created.</tt></li> <li><tt>06.16.2011 ANALYSIS: added autoload support for analysis files. DS9 will search a list of known dirs for *.ds9, at which DS9 will load the analysis file, and add the path to env(PATH).</tt></li> <li><tt>06.20.2011 RGB: fixed a problem where the calculated wcs rotation between two frames was reset.</tt></li> <li><tt>06.27.2011 REGIONS: fixed a problem the ds9, ciao, and pros regions parser. The parsers will now accept arcmin and arcsec syntax which includes sciencetific notation.</tt></li> <li><tt>07.07.2011 POSTSCRIPT: generate postscipt now uses generic font names reguardless of platform and window manager.</tt></li> <li><tt>07.08.2011 BIN: split mousewheel preferences between zoom and binning. By default, a bin file is zoom'd in/out with the mouse wheel, unless the binning mouse wheel is enabled via the preferences.</tt></li> <li><tt>07.08.2011 GUI: add preference for standard dialog box for order of file types.</tt></li> <li><tt>07.21.2011 GUI: all non-modal dialogs have Edit menu.</tt></li> <li><tt>07.21.2011 CUBE: add match/lock slice commands.</tt></li> <li><tt>07.22.2011 AST: updated to version 5.7-2</tt></li> <li><tt>07.22.2011 WCS: speedup generating sexagesimal output</tt></li> <li><tt>07.25.2011 BIN: fixed a problem with the update filter function.</tt></li> <li><tt>07.29.2011 DIALOGS: fixed a problem with the motif dialogbox and selection of the initial directory. Set the code to the same as tkfmbox.tcl.</tt></li> <li><tt>08.22.2011 WCS: if CTYPE is not of known type, assume LINEAR.</tt></li> <li><tt>08.26.2011 PANNER: simplified compass prefs.</tt></li> <li><tt>09.19.2011 WCS: only use A_ and B_ keywords if CTYPE is TAN-SIP. Ignore otherwise.</tt></li> <li><tt>09.26.2011 REGIONS: use ::math::fuzzy for comparisons in basepanda, composite, and convert.</tt></li> <li><tt>09.27.2011 WCSSUBS: updated to version 3.8.4.</tt></li> <li><tt>09.30.2011 REGIONS: implemented M_PI_2, M_TWOMPI constants.</tt></li> <li><tt>09.30.2011 REGIONS: use fuzzy math for degToRad() and radToDeg()</tt></li> <li><tt>10.04.2011 WCS: pass any PV and QV keywords if present, regardless of projection.</tt></li> <li><tt>10.05.2011 AST: updated to version 5.7-3</tt></li> <li><tt>10.24.2011 REGIONS: fixed a problem with angs and PANDA, EPANDA, and BPANDA and copy/paste in FK5. This is related to the fuzzy math changes made earlier.</tt></li> <li><tt>10.25.2011 FITSY++: fixed a problem finding cols by name in bin tables. Previous 'R' would be matched by 'RA'.</tt></li> <li><tt>10.28.2011 HV: remove NED,SIMBAD,ADS,TDC,SKYVIEW,W3BROWSE from ANALYSIS:ARCHIVES menu due to lack of support from sites.</tt></li> <li><tt>10.28.2011 COLORMAP: add colormap server to colormap dialog</tt></li> <li><tt>11.01.2011 PRINT COORDINATES: now uses default skyframe and skyformat (as defined by WCS menu).</tt></li> <li><tt>11.04.2011 SCALE: add asinh() and sinh() scales.</tt></li> <li><tt>11.10.2011 CROP: add new crop commands.</tt></li> <li><tt>12.09.2011 AST: updated to version 6.0-1</tt></li> <li><tt>12.09.2011 CROSSHAIR: fixed an issue with coordinates of crosshair were .5 pixel off in Y.</tt></li> <li><tt>12.09.2011 GUI: fixed an issue with centerimage() was .5 pixel off in Y.</tt></li> <li><tt>12.15.2011 GRID: fixed an issue with text upside down.</tt></li> <li><tt>01.03.2012 BIN: fixed a problem with depth of a 3d bin'd table.</tt></li> <li><tt>01.03.2012 GRID: DSS and Linear projections use AST.</tt></li> <li><tt>01.17.2012 3D: 3D Frame is now available.</tt></li> <li><tt>01.19.2012 ANALYSIS: added $z macro.</tt></li> <li><tt>01.19.2012 CROP: add [xmin:xmax,ymin:ymax,zmin:zmax] syntax</tt></li> <li><tt>01.19.2012 CROP: check for valid crop with [] syntax.</tt></li> <li><tt>01.23.2012 3D: add current slice highlite.</tt></li> <li><tt>01.23.2012 SAVEIMAGE: fixed a problem with frame highlite during saveimage process.</tt></li> <li><tt>01.23.2012 ANALYSIS: expand $image macro to accept new params: rgb and 3d.</tt></li> <li><tt>01.27.2012 ANALYSIS: expand $filename(full) to return full filename (without cropping or filters parameters).</tt></li> <li><tt>01.27.2012 ANALYSIS: add macro $value.</tt></li> <li><tt>01.27.2012 CROP: fixed a problem when using an image subsection spec for a datacube.</tt></li> <li><tt>01.28.2012 REGIONS: clean up rendering code for X,ps,win32,macosx to reduce un-needed calls to set the graphics context.</tt></li> <li><tt>01.28.2012 CROP: all data cubes can be cropped in 3D.</tt></li> <li><tt>01.28.2012 CROP: cropping in 3D will reset currentSlice if needed.</tt></li> <li><tt>01.28.2012 REGIONS: fixed a problem if the region color was an X11 valid color, some names would get mapped to the incorrect color when printing.</tt></li> <li><tt>02.02.2012 COLORMAP: fixed a problem with SAO format colormaps that have very long lines.</tt></li> <li><tt>02.03.2012 PRINT COORDINATES: added filename to options.</tt></li> <li><tt>02.03.2012 WCS: if wcs parameters are changed or reset, all open catalogs regions are updated. Normal regions are not changed.</tt></li> <li><tt>02.07.2012 COLORMAP: remove support for old RTD and ITT colormaps</tt></li> <li><tt>02.08.2012 GUI: consolidate MATCH and LOCK items into submenus.</tt></li> <li><tt>02.08.2012 GUI: move match bin, match scale, and match colorbar to frame match menu.</tt></li> <li><tt>02.16.2012 CUBE: fixed a proble with calculating the wcs to image for axis 3.</tt></li> <li><tt>02.16.2012 FITSY++: changes required for gcc 4.7.</tt></li> <li><tt>02.16.2012 BLT: patched graph.tcl to use legendRelief instead of labelRelief.</tt></li> <li><tt>02.16.2012 RGB: added lock wcs.</tt></li> <li><tt>02.16.2012 FUNTOOLS: updated to version 1.4.5-2.</tt></li> <li><tt>02.21.2012 3D: fixed a problem with scale clip scope. Should alway be in GLOBAL.</tt></li> <li><tt>02.29.2012 HEADER: add save header command.</tt></li> <li><tt>03.01.2012 XPA: updated to version 2.1.14.</tt></li> <li><tt>03.01.2012 MINMAX: AUTOSCAN set to SAMPLE if width*height*depth &gt; 1e8.</tt></li> <li><tt>03.12.2012 IMGSVR: fixed a problem with clearing params if no image was loaded previously.</tt></li> <li><tt>03.22.2012 REGION: add ellipse3d, box3d, polygon3d, point3d regions.</tt></li> <li><tt>03.23.2012 IMGSVR: fixed a problem new frame option and rgb.</tt></li> <li><tt>03.23.2012 BIN: check for valid col names for -bin col command.</tt></li> <li><tt>03.28.2012 REGIONS: add Analysis support per region.</tt></li> <li><tt>03.28.2012 REGIONS: add Analysis Plot3d support for Circle,Ellipse,Box,Polygon,Point.</tt></li> <li><tt>03.28.2012 REGIONS: add Analysis Plot2d support for Projection,Line,Vector.</tt></li> <li><tt>03.28.2012 REGIONS: Circle3d now converted to Circle.</tt></li> <li><tt>03.28.2012 REGIONS: Plot3d saves native coordinate values.</tt></li> <li><tt>03.28.2012 SCALE: simplified scale dialog controls to allow user values.</tt></li> <li><tt>03.29.2012 WCS: fixed a problem with numaxes &gt; 3 images and editing WCS params.</tt></li> <li><tt>04.09.2012 WCS: second attempt to handle non-equatorial wcs. try to build a legal header from the wcssubs struct to feed to ast.</tt></li> <li><tt>04.10.2012 SCALE: fixed an issue with autocut, ll != hh.</tt></li> <li><tt>04.10.2012 SKYVIEW: add WISE/COBE/WMAP to skyview survey menu.</tt></li> <li><tt>04.10.2012 WCS: if CD matrix is all zero, use cdelt/pc matrix.</tt></li> <li><tt>04.11.2012 SMOOTH: fixed a problem with images with BSCALE/BZERO.</tt></li> <li><tt>04.11.2012 CATALOG: fixed a problem with d:m:s formated DEC which started with a '+'</tt></li> <li><tt>04.12.2012 CATALOG: fixed a problem with d:m:s to degree conversion. Try to maintain higher precision.</tt></li> <li><tt>04.12.2012 CATALOG: add IAU location code to dialog.</tt></li> <li><tt>04.13.2012 COLORMAP: add user contributed cmaps.</tt></li> <li><tt>04.18.2012 GUI: fixed a problem with long WCSNAME values.</tt></li> <li><tt>04.20.2012 FITSY++: added support for GZIP compresss parameter ZQUANTIZ.</tt></li> <li><tt>04.23.2012 PS: fixed a bug with definiton of 32 bit integers on 64 bit OS.</tt></li> <li><tt>04.23.2012 PREFS: add Text Dialog Font preferences menu.</tt></li> <li><tt>04.23.2012 LOCK: fixed a problem with lock frame and mouse wheel events.</tt></li> <li><tt>04.24.2012 SKYBOT: Look for EXPTIME and add 1/2 to DATE-OBS to get middle of observation.</tt></li> <li><tt>04.24.2012 LINUX64: add --hash-style=both to support old and new GNU API for hash libs.</tt></li> <li><tt>04.26.2012 PHOTO: add support for other image formats.</tt></li> <li><tt>04.26.2012 EXPORT: add support for exporting to other image formats.</tt></li> <li><tt>04.30.2012 WCS: fixed a problem with TAN-SIP and wcs append/replace.</tt></li> <li><tt>05.01.2012 TCL: check to see if packages msgcat and http have already been found before sourcing during startup.</tt></li> <li><tt>05.03.2012 MPEG: fixed a problem with the bottom of an image cut off.</tt></li> <li><tt>05.07.2012 COLORTAG: add color tags.</tt></li> <li><tt>05.10.2012 CROP: fixed a problem with backup and lock crop.</tt></li> <li><tt>05.10.2012 SCALE: fixed a problem lock scale and crop.</tt></li> <li><tt>05.10.2012 BACKUP: fixed a problem with back and -slice, -mosaic load options.</tt></li> <li><tt>05.11.2012 REGIONS: add auto plot2d and plot3d prefs.</tt></li> <li><tt>05.14.2012 GUI: add fits save.</tt></li> <li><tt>05.17.2012 MPEG: updated to ezMPEG v0.1</tt></li> <li><tt>05.17.2012 AST: updated to 7.0.3</tt></li> <li><tt>05.23.2012 WCS: is always displayed</tt></li> <li><tt>05.23.2012 CATALOG: fixed a problem with the sign of d:m:s conversion introduced on 04.12.2012.</tt></li> <li><tt>05.28.2012 MOVIE: minor tweaks on incr slice during movie.</tt></li> <li><tt>05.28.2012 WIN32: fixed a problem with 3d fillImageJoin. Statck overflow.</tt></li> <li><tt>05.29.2012 BACKUP: fixed active frames issue.</tt></li> <li><tt>05.30.2012 GUI: add threads command.</tt></li> <li><tt>05.30.2012 GUI: fixed a problem with PASTE for entries. Will now process unicode.</tt></li> <li><tt>05.31.2012 GRID: fixed a problem with parsing 6.1 and 6.2 backup save sets. New grid options parser implemented.</tt></li> <li><tt>05.31.2012 PLOT: fixed a problem in generating postscript. Now just set plot size.</tt></li> <li><tt>05.31.2012 PLOT: fixed a postscript font issue with helvetica.</tt></li> <li><tt>05.31.2012 PLOT: add axes format.</tt></li> <li><tt><b>06.06.2012 RELEASE version 7.0</b></tt></li> <li><tt>06.12.2012 BACKUP: fixed a problem with processing version 6.1 and 6.2 backup save sets.</tt></li> <li><tt><b>06.15.2012 RELEASE version 7.0.1</b></tt></li> <li><tt>06.13.2012 3D: add border graphics.</tt></li> <li><tt>06.15.2012 TCLLIB: updated to version 1.14. This fixes a problem with math::fuzzy::tlt.</tt></li> <li><tt>06.21.2012 REGION: fixed a problem with rotated images and postscript printing of circle region.</tt></li> <li><tt>06.21.2012 IMGSRV: fixed a problem loading images from dss/2mass/etc from the command line. Use the first frame if not already loaded.</tt></li> <li><tt>06.21.2012 SLA: removed from build tree. not needed since AST now has own version.</tt></li> <li><tt>06.21.2012 HELP: rm link to home page. hv can't handle the new web site.</tt></li> <li><tt>06.22.2012 SKYBOT: added -filter=0.</tt></li> <li><tt>06.22.2012 POSTSCRIPT: fixed a problem with rotated text regions affecting other regions.</tt></li> <li><tt>06.22.2012 REGIONS: fixed a problem selecting text regions at high zoom.</tt></li> <li><tt>06.22.2012 WCS: add support for SAO Polynomial Plate.</tt></li> <li><tt>06.25.2012 GUI: improved error handling. Will now properly handle a FATAL error msg from internal widgets.</tt></li> <li><tt>06.25.2012 GUI: non FATAL msgs can be supressed via preferences.</tt></li> <li><tt>06.25.2012 FRAME: trap SIGBUS while scanning for min/max.</tt></li> <li><tt>06.25.2012 WCS: use new version of AST:fitschan.c which supports SAO polynomial plate solution and checks for the case of all PV keywords=0.</tt></li> <li><tt>06.25.2012 GUI: enable hidden directory button for linux standard dialog box (windows only).</tt></li> <li><tt>06.25.2012 GUI: move About menu item to Help menu.</tt></li> <li><tt>06.27.2012 LOCK: fixed a problem with LOCK FRAME and the current skyframe.</tt></li> <li><tt>06.27.2012 PANNER: fixed a problem where the wcs compass was incorrectly set.</tt></li> <li><tt>06.29.2012 AST: updated to 7.0.5</tt></li> <li><tt>07.02.2012 HTTP: set default timeout to 1 minute.</tt></li> <li><tt><b>07.03.2012 RELEASE version 7.0.2</b></tt></li> <li><tt>07.05.2012 RGB: fixed a problem with -rgbimage and extnames.</tt></li> <li><tt>07.05.2012 GCC: fixed a problem gcc 4.5 and Pixmap typedef.</tt></li> <li><tt>07.06.2012 SCALE: fixed a problem with scale dialog and very small numbers.</tt></li> <li><tt>07.10.2012 BIN: fixed a problem with very large FITS Bin Tables.</tt></li> <li><tt>07.11.2012 FITSY++: fixed a number of problems with very large (2Gb&gt;) FITS Image and Bin Tables.</tt></li> <li><tt>07.13.2012 WINDOWS: fixed a problem with dashs on the display. Tk does not give us much flexibilty, so pick something closer to the desired length.</tt></li> <li><tt>07.17.2012 CATALOG: add sdss r7 and sdss r8 to default menu.</tt></li> <li><tt>07.17.2012 GRIDS: fixed a problem where each frame grid remembers its own configuration.</tt></li> <li><tt>07.17.2012 FITSY++: fixed a number of problems with save very large (2Gb&gt;) FITS Image and Bin Tables.</tt></li> <li><tt>07.23.2012 REGIONS: fixed a problem with PLOT3D and BOX, ELLIPSE, POLYGON. At certain angles, incorrect counts were calculated.</tt></li> <li><tt>07.27.2012 REGIONS: fixed a problem with rendering ELLIPSE PANDA X11 at angle=0.</tt></li> <li><tt>07.30.2012 PRINT: fixed a problem with printing simple text and catalog dialogs.</tt></li> <li><tt>07.30.2012 REGIONS: add default length format to preferences.</tt></li> <li><tt>07.30.2012 GUI: update infobox when moving between frames.</tt></li> <li><tt>07.30.2012 BACKUP: don't save compressed image files if not requested.</tt></li> <li><tt>08.02.2012 WCS: fixed a number of issues with the WCS parameters dialog.</tt></li> <li><tt>08.02.2012 WCS: added support for SIP and SCAMP keywords to WCS parameters dialog.</tt></li> <li><tt>08.06.2012 MAGNIFIER: be sure to update magnifier when changing slice.</tt></li> <li><tt>08.09.2012 PLOT: fixed a problem reading muliple datasets from one source.</tt></li> <li><tt>08.10.2012 AST: updated to version 7.0.6</tt></li> <li><tt>08.13.2012 3D: add z axis scaling.</tt></li> <li><tt>08.13.2012 FITSY++: accept double quoted (invalid) strings.</tt></li> <li><tt>08.21.2012 REGIONS: fixed a problem with -regions centroid command.</tt></li> <li><tt>09.05.2012 SMOOTH: add lock/match smooth.</tt></li> <li><tt>09.14.2012 PLOT: enhanced gui.</tt></li> <li><tt>09.14.2012 PLOT: add bar chart option.</tt></li> <li><tt>09.14.2012 PLOT: add scatter chart option.</tt></li> <li><tt>09.14.2012 REGIONS: add Analysis Statistics.</tt></li> <li><tt>09.14.2012 REGIONS: add Analysis Radial Profile.</tt></li> <li><tt>10.3.2012 CATALOG: add match option.</tt></li> <li><tt><b>10.15.2012 RELEASE version 7.1</b></tt></li> <li><tt>10.18.2012 GUI: update File menu.</tt></li> <li><tt>11.02.2012 GUI: add support for NRRD file format. Includes encodings: raw and gzip.</tt></li> <li><tt>11.05.2012 GUI: fixed a problem with cut/paste for contours and catalogs.</tt></li> <li><tt>11.27.2012 PLOT: fixed typo in range dialog.</tt></li> <li><tt>11.27.2012 GUI: fixed a problem with clear analysis menu item and the analysis menu.</tt></li> <li><tt>12.06.2012 SAMP: fixed a typo which disabled SAMP_HUB functionality.</tt></li> <li><tt>12.06.2012 DS9: fixed a problem on how to align an image with an odd size frame. In versions &lt;7.0, the floating point number was rounded down. This has been re-implemented.</tt></li> <li><tt>12.11.2012 GPL: upgrade license to GPL v3.</tt></li> <li><tt>12.18.2012 COLORBAR: add support for SAO format GAMMA param.</tt></li> <li><tt>12.18.2012 SAVEIMAGE: add support for EPS.</tt></li> <li><tt>12.20.2012 REGIONS: fixed a problem with updating analysis plot x/y axis titles.</tt></li> <li><tt>12.21.2012 REGIONS: fixed a problem with analysis radial profile and negative xaxis values.</tt></li> <li><tt>12.21.2012 REGIONS: fixed a problem with writing composited regions.</tt></li> <li><tt>12.21.2012 REGIONS: fixed a problem with list/save data radial annulus.</tt></li> <li><tt>12.28.2012 RGB: add photo export.</tt></li> <li><tt>01.19.2013 FITSY++: fixed a problem parsing filters</tt></li> <li><tt>01.19.2013 FITSY++: fixed a problem with incomplete variable array TFORM descriptions, used in fits compression. If no length is specified, set default to 8.<br> </tt></li> <li><tt>01.29.2013 SAVE: save fits will now save an entire cube if loaded.</tt></li> <li><tt>01.30.2013 SAVE: add support for save mecube.</tt></li> <li><tt>01.31.2013 CONTOUR: fixed a problem with loading a set of contours with a specified color.</tt></li> <li><tt>02.13.2013 FITSY++: support new fits compression float/double gzip method.</tt></li> <li><tt>02.13.2013 FITSY++: ds9 now distinguishes between BLANK/NAN/INF values.</tt></li> <li><tt>02.15.2013 REGIONS: no longer output filename in header.</tt></li> <li><tt>02.26.2013 FITSY++: use magic bytes to check for gz compressed files before load.</tt></li> <li><tt>02.28.2013 RGB: loading rgbimage, rgbcube, rgbarray into non-rgb frame will create new rgb frame for all command line, xpa, and samp commands.</tt></li> <li><tt>03.01.2013 FRAME: trap SIGBUS and SIGSEGV while scanning data.</tt></li> <li><tt>03.01.2013 FRAME: will only return error messages at levels info, warning, and error.</tt></li> <li><tt>03.10.2013 PREFS: fixed a problem with prefs zoom align.</tt></li> <li><tt>03.12.2013 BACKUP: check for sym links.</tt></li> <li><tt>03.14.2013 GUI: non-modal dialogs are now created at the center of the main ds9 window.</tt></li> <li><tt>03.25.2013 VO: default vo method is mime.</tt></li> <li><tt>03.25.2013 VO: if xpa method fails, default to mime.</tt></li> <li><tt>03.26.2013 XPA: add samp cmd to xpa.</tt></li> <li><tt>03.26.2013 SAMP: add xpa cmd to samp.</tt></li> <li><tt>04.01.2013 AST: updated to version 7.1.1</tt></li> <li><tt>04.11.2013 CATALOG: fixed cut and paste.</tt></li> <li><tt>04.11.2013 WCS: SAO_PLT is now handled directly by AST.</tt></li> <li><tt>04.12.2013 PREFS: add dialog center option.</tt></li> <li><tt>04.12.2013 PLOT: all plots (user, analysis and catalogs) are now available to the plot command.</tt></li> <li><tt><b>04.15.2013 RELEASE version 7.2</b></tt></li> <li><tt>04.16.2013 AST: updated to version 7.2</tt></li> <li><tt>04.16.2013 TCLLIB: updated to version 1.15</tt></li> <li><tt>04.26.2013 TCL: updated to version 8.6.0</tt></li> <li><tt>04.26.2013 TK: updated to version 8.6.0</tt></li> <li><tt>04.26.2013 ZVFS: updated to version 2</tt></li> <li><tt>05.15.2013 CATALOGS: add AAVSO to cat list.</tt></li> <li><tt>05.17.2013 HV: add DASCHE to Archives list.</tt></li> <li><tt>06.03.2013 IRAF: fixed a problem with imexamine coords.</tt></li> <li><tt>06.04.2013 IRAF: save/export will save wcs values, not just the color number.</tt></li> <li><tt>06.05.2013 IRAF: colorbar displays wcs values.</tt></li> <li><tt>06.05.2013 IRAF: fixed a number of issues with tvmark colors.</tt></li> <li><tt>06.11.2013 FITSY++: implemented compressed FITS SUBTRACTIVE_DITHER_1 method.</tt></li> <li><tt>06.14.2013 ENVI: add support for import/export envi format.</tt></li> <li><tt>06.14.2013 AST: updated to version 7.3.1</tt></li> <li><tt>06.18.2013 GUI: fixed a problem with blank headers being displayed.</tt></li> <li><tt>06.18.2013 ARRAY: now accepts cropping info in filename.</tt></li> <li><tt>06.18.2013 NRRD: now accepts cropping info in filename.</tt></li> <li><tt>06.18.2013 ENVI: now accepts cropping info in filename.</tt></li> <li><tt>06.21.2013 PHOTO: fixed a problem with rounding average.</tt></li> <li><tt>06.24.2013 ZVFS: zvfs.c updated from freewrap 6.6</tt></li> <li><tt>06.26.2013 SEGMENT: add new segment region.</tt></li> <li><tt>07.02.2013 ENVI: fixed a problem with calculating wcs.</tt></li> <li><tt>07.02.2013 FITSY++: changes to allow 1D image.</tt></li> <li><tt>07.03.2013 GROUPS: fixed a problem allowing multiple selection of region groups.</tt></li> <li><tt>08.14.2013 WCS: Linear WCS now goes straight to AST.</tt></li> <li><tt>09.10.2013 PSEUDOCOLOR: rm support for pseudocolor visuals.</tt></li> <li><tt>09.17.2013 REGIONS: PLOT3D dramatic improvements in speed of deep images and large regions.</tt></li> <li><tt>09.17.2013 GUI: set last file directory based on file type last loaded.</tt></li> <li><tt>09.18.2013 ENVI: minor change to hdr parser.</tt></li> <li><tt>09.18.2013 ENVI: fixed a major problem with swapbytes.</tt></li> <li><tt>09.18.2013 CATALOG: fixed a problem with selecting the correct region when arrow keys are used.</tt></li> <li><tt>09.19.2013 FITSY++: cleaned up code for dumping array,nrrd,envi in native endian.</tt></li> <li><tt>09.25.2013 AST: updated to version 7.3.2 to fix problem with SCAMP.</tt></li> <li><tt>09.25.2013 FITSY++: fixed a problem parsing filters in the command line.</tt></li> <li><tt>10.05.2013 3D: implement image cache.</tt></li> <li><tt>10.08.2013 3D: implement az and el background render.</tt></li> <li><tt>10.10.2013 COLORBAR: fixed a minor problem with specifing 'other color'.</tt></li> <li><tt>10.11.2013 REGIONS: add mouse click epsilon parameter.</tt></li> <li><tt>10.16.2013 CUBE: add lock slice wcs.</tt></li> <li><tt>10.17.2013 REGIONS: fixed a problem with ds9 regions parser and parsing hex color specification.</tt></li> <li><tt>10.18.2013 XPA: fixed a problem with "file" and backward compatability.</tt></li> <li><tt>10.18.2013 ANALYSIS: add several checks to verify analysis file before try to parse.</tt></li> <li><tt>10.22.2013 GUI: fixed a problem with preserve PAN while loading.</tt></li> <li><tt>10.22.2013 SCALE: removed PRESERVE SCALE. This has been redundant since 7.0. Setting the scale limits does the same thing.</tt></li> <li><tt>10.22.2013 CONTOUR: fixed a problem if no system is specified and, the default is normally WCS, unless no WCS is defined, then default to PHYSICAL.</tt></li> <li><tt>10.28.2013 TCL/TK: update to version 8.6.1.</tt></li> <li><tt>10.31.2013 HTML: fixed issue causeing corrupt stack with new CLANG compilers.</tt></li> <li><tt>11.10.2013 FITS: improved error handling for malformed FITS tables.</tt></li> <li><tt>11.15.2013 CUBE: fixed a problem with lock slice wcs.</tt></li> <li><tt>11.18.2013 CATALOG: add SDSS9 to optical menu.</tt></li> <li><tt>12.12.2013 WCS: add support for AST WCS def.</tt></li> <li><tt>01.28.2014 REGIONS: add auto statistics option.</tt></li> <li><tt>03.06.2014 AST: updated to version 7.3.4.</tt></li> <li><tt>03.21.2014 CATALOG: add 'Copy to Regions' from XPA/SAMP/commandline.</tt></li> <li><tt>03.26.2014 WCS: fixed a problem with wcs append/replace where the line length was 81 with newline.</tt></li> <li><tt>04.07.2014 FITSY++: expanded valid EXTNAME keywords to include '.', '-', and '_' chars.</tt></li> <li><tt>04.07.2014 FITSY++: save fits will convert BITPIX=-16 to BITPIX=32</tt></li> <li><tt>06.09.2014 CATALOG: if sort col is of type real, but contains blank values, substitue a value of 0.</tt></li> <li><tt>07.01.2014 BLT: completed upgrade to TkBLT 3.0.</tt></li> <li><tt>07.28.2014 CATALOG: add UCAC4 to optical menu.</tt></li> <li><tt>08.01.2014 MACOSX: completed new 64bit Aqua port.</tt></li> <li><tt>08.06.2014 3D: don't wipeout the cache when generating a movie.</tt></li> <li><tt>09.15.2014 ENVI: try to determine data file name from header file name.</tt></li> <li><tt>09.30.2014 GUI: default mouse mode is NONE (not POINTER).</tt></li> <li><tt>09.30.2014 GUI: change mode POINTER to REGION.</tt></li> <li><tt><b>10.01.2014 RELEASE version 7.3</b></tt></li> <li><tt>10.03.2014 GUI: Fixed problems with Control-S and Control-Z accelerators.</tt></li> <li><tt>10.03.2014 MACOSX: Removed accelerators for Print, PageSetup, and Find, as then invoke a known bug with Tk and dialogs.</tt></li> <li><tt>10.03.2014 MACOSX: Fixed a problem with coordinate display dialog.</tt></li> <li><tt>10.03.2014 MACOSX: Fixed a problem with deleting colorbar tags.</tt></li> <li><tt>10.03.2014 PREFS: Beta versions are now deemed to be of the same verison as the final release.</tt></li> <li><tt>10.03.2014 PREFS: Fixed a problem processing a newer prefs file. Now wait to notify the user after the init phase has been completed.</tt></li> <li><tt>10.03.2014 PREFS: some combinations of old prefs files were not being updated correctly.</tt></li> <li><tt>10.06.2014 FIRST: rename FIRST to VLA</tt></li> <li><tt>10.06.2014 VLA: add STRIPE82 survey.</tt></li> <li><tt>10.06.2014 HV: fixed a problem with scrolling.</tt></li> <li><tt><b>10.07.2014 RELEASE version 7.3.1</b></tt></li> <li><tt>10.08.2014 REGIONS: fixed a problem with parsing old regions file fonts.</tt></li> <li><tt><b>10.08.2014 RELEASE version 7.3.2</b></tt></li> <li><tt>10.10.2014 IEXAM: imexam has been renamed iexam.</tt></li> <li><tt>10.15.2014 WCS: fixed a problem with imflip=1.</tt></li> <li><tt>10.15.2014 AST: updated to version 8.0.0.</tt></li> <li><tt>10.20.2014 AST: updated to version 8.0.2.</tt></li> <li><tt>10.20.2014 HPX: updated compatiable wcslib-4.24.</tt></li> <li><tt>10.21.2014 CATALOG: add width property for symbols.</tt></li> <li><tt>10.22.2014 MACOSX: fixed a problem with mouse wheel zoom.</tt></li> <li><tt>10.22.2014 FITSY++: add support for SUBTRACTIVE_DITHER_2 keyword.</tt></li> <li><tt>10.22.2014 FITSY++: fixed a problem with native endian arrays. Unless specified, the array is assumed to be of the same endian-ness as the processor.</tt></li> <li><tt>11.14.2014 CUBE: fixed a problem with lock slice with no fits loaded.</tt></li> <li><tt>11.17.2014 TCL/TK: update to version 8.6.3.</tt></li> <li><tt>11.18.2014 MACOSX: preferences, fixed jumpy window size problem.</tt></li> <li><tt>11.19.2014 GUI: view horizontal/vertical now sets display size to default settings.</tt></li> <li><tt>12.03.2014 IIS: fixed a problem with open_unix().</tt></li> <li><tt>12.29.2014 BLOCK: add support for blocking.</tt></li> <li><tt>02.04.2015 HPX: fixed a problem with cropping HPX images.</tt></li> <li><tt>02.05.2015 FITS++: Fits Compression- fixed a problem with uncompressed blocks.</tt></li> <li><tt>02.05.2015 FITS++: added support for 'Q' column arrays.</tt></li> <li><tt>02.17.2015 HV: Fixed a problem when url scheme is FTP and authority included username and passwd.</tt></li> <li><tt>02.18.2015 WCS: Fixed a problem when CDELTs and PCs keywords are used, but not in the orthodox way.</tt></li> <li><tt>03.11.2015 NRRD: Fixed a problem exporting built data cube.</tt></li> <li><tt>03.11.2015 ENVI: Fixed a problem exporting built data cube.</tt></li> <li><tt>03.24.2015 MOSAIC: mecube will now skip over tables and find all images.</tt></li> <li><tt>04.08.2015 FITS++: fixed a problem with compressed fits files and static memory size. now using alloc.</tt></li> <li><tt>04.13.2015 CATALOGS: fixed a problem with deleting the frame first, before closing a catalog dialog.</tt></li> <li><tt>04.15.2015 CUBE: added support for reorder data cube axes.</tt></li> <li><tt>04.16.2015 SMOOTH: blank/NaN values are no longer replaced by 0, instead, NaN is used.</tt></li> <li><tt>04.17.2015 SMOOTH: is now threaded.</tt></li> <li><tt>04.21.2015 GUI: add UNITS keyword to infobox.</tt></li> <li><tt>04.23.2015 CUBE: reorder is now threaded.</tt></li> <li><tt>04.24.2015 IEXAM: add macro expansion string.</tt></li> <li><tt>04.27.2015 CHECKDNS: fixed a problem so that delay will activate on time (and will return promptly).</tt></li> <li><tt>04.29.2015 TCL/TK: update to version 8.6.4.</tt></li> <li><tt>04.30.2015 LAYOUT: add tile grid direction.</tt></li> <li><tt>04.30.2015 GUI: add user selected keyword to infobox.</tt></li> <li><tt>05.21.2015 SCALE: add lock/match scalelimits.</tt></li> <li><tt><b>05.29.2015 RELEASE version 7.4b1</b></tt></li> <li><tt>06.09.2015 CATALOG: fixed a problem finding correct cols to parse. Original bug introduced after 7.3.2.</tt></li> <li><tt><b>06.09.2015 RELEASE version 7.4b2</b></tt></li> <li><tt>06.15.2015 SCALE: scaling for data cubes now use clip scope (LOCAL/GLOBAL).</tt></li> <li><tt>06.18.2015 SCALE: Default scope is now GLOBAL.</tt></li> <li><tt>06.18.2015 SCALE: MinMax mode AutoScan has been deprecated.</tt></li> <li><tt>06.22.2015 GUI: fixed a font problem displaying greek symbols.</tt></li> <li><tt><b>06.22.2015 RELEASE version 7.4b3</b></tt></li> <li><tt>06.29.2015 SKYVIEW: add survey and size options.</tt></li> <li><tt><b>07.04.2015 RELEASE version 7.4b4</b></tt></li> <li><tt>07.07.2015 VO: add additional code to use default url list if unable to download list.txt for any reason.</tt></li> <li><tt>07.14.2015 FITSY++: fixed a problem with RICE compression and 4 byte INT to FLOAT conversions.</tt></li> <li><tt>07.15.2015 FITSY++: fixed a problem with GZIP lossless compression.</tt></li> <li><tt>07.15.2015 FITSY++: Add support for GZIP_2 FITS compression.</tt></li> <li><tt><b>07.20.2015 RELEASE version 7.4b5</b></tt></li> <li><tt>07.23.2015 FITSY++: fixed a problem with SAVE FITS and writing NAXIS3=1 into the header.</tt></li> <li><tt>07.23.2015 FITSY++: added check for fits table in SAVE FITS TABLE.</tt></li> <li><tt><b>07.24.2015 RELEASE version 7.4b6</b></tt></li> <li><tt>08.13.2015 REGIONS: fixed a problem with FITS CIAO PIE region.</tt></li> <li><tt>08.13.2015 REGIONS: fixed a problem with FITS CIAO ANNULUS region.</tt></li> <li><tt>08.13.2015 REGIONS: added support for FITS CIAO SECTOR and ELLIPTANNULS regions.</tt></li> <li><tt>08.16.2015 WCS: fixed a problem with reorder 3D cubes.</tt></li> <li><tt>08.25.2015 COLORBAR: added MathLab colormaps.</tt></li> <li><tt>08.25.2015 COLORBAR: added MatPlotLib colormaps.</tt></li> <li><tt>08.26.2015 COLORBAR: added H5utils colormaps.</tt></li> <li><tt>08.26.2015 COLORBAR: added GIST colormaps.</tt></li> <li><tt>08.26.2015 COLORBAR: added Topographic colormaps.</tt></li> <li><tt>08.28.2015 MOSAIC: fixed a problem introduced in 7.4b1 which failed to ignore generic tables in extensions when loading multiple extension fits.</tt></li> <li><tt>09.03.2015 PAN: fixed a problem with pan then zoom mode.</tt></li> <li><tt>09.17.2015 IIS: fixed a problem with imexam introduced in an earlier beta version.</tt></li> <li><tt>09.17.2015 IIS: fixed a problem with imexam when a former imexam frame has been delete.</tt></li> <li><tt>09.17.2015 MOSAIC: add IRAF DETSEC Align option.</tt></li> <li><tt><b>09.18.2015 RELEASE version 7.4b7</b></tt></li> <li><tt>09.21.2015 WCS: Look for old RADECSYS keyword if present.</tt></li> <li><tt>09.22.2015 CROSSHAIR: add crosshair parameters dialog.</tt></li> <li><tt>09.30.2015 TEMPLATES: fixed a problem with WCS introduced in an earlier beta version.</tt></li> <li><tt>10.02.2015 SMOOTH: smooth on load now threaded.</tt></li> <li><tt>10.02.2015 REGIONS: PLOT3D is disabled by default.</tt></li> <li><tt>10.13.2015 SAMP: fixed a issue with case of meta-data in xmlrpc.</tt></li> <li><tt>10.14.2015 GUI : fixed an issue where not all header options were offered in the case of compressed fits images.</tt></li> <li><tt>10.14.2015 BACKUP : fixed a problem when creating a backup with a file that has been compressed.</tt></li> <li><tt>10.15.2015 SAMP: fixed a issue with results with empty elements.</tt></li> <li><tt>10.16.2015 LINUX: For all key press events, calculate the current cursor position, as Ubuntu and MacOSX Aqua returns bad x,y values. </tt></li> <li><tt>10.21.2015 CATALOG: fixed a problem where a catalog had a column of the same name as a variable. </tt></li> <li><tt>10.26.2015 GUI: fixed a problem remembering the previous filename loaded for standard dialogs. </tt></li> <li><tt>10.30.2015 SAMP: fixed a issue with incorrect body length in xmlrpc messages.</tt></li> <li><tt>11.03.2015 3D: fixed a major issue introduced in the beta 7.4 series which caused a redraw everytime the current slice was changed.</tt></li> <li><tt>11.03.2015 SCALE: Default scope is back to LOCAL.</tt></li> <li><tt>11.04.2015 CONTOUR: Fixed lots of issues with interaction with contours and bin/block/smooth.</tt></li> <li><tt>11.04.2015 SCALE: remove old AUTOSCAN and SAMPLE code.</tt></li> <li><tt>11.09.2015 FITS: fixed issues with data all NAN or INF.</tt></li> <li><tt>11.09.2015 CUBE: fixed issues with selecting current slice and updating other dialog boxes while in local mode.</tt></li> <li><tt><b>11.11.2015 RELEASE version 7.4b8</b></tt></li> <li><tt>11.11.2015 FITS: fixed another issue when calculating MIN and MAX and one pixel images.</tt></li> <li><tt>11.17.2015 WCS: fixed problem with infobox/grid with xLN/xLT WCS.</tt></li> <li><tt><b>11.18.2015 RELEASE version 7.4b9</b></tt></li> <li><tt>11.30.2015 CATALOG: update CDS catalog search parameters.</tt></li> <li><tt>12.02.2015 BACKUP: fixed a problem with backup save sets generated with beta versions.</tt></li> <li><tt>12.03.2015 PREFS: fixed a problem with prefs generated with beta versions.</tt></li> <li><tt>12.07.2015 WCS: fixed a problem with replacement WCS.</tt></li> <li><tt>12.08.2015 WCS: cubes now share WCS structures (very fast).</tt></li> <li><tt>12.08.2015 ANALYSIS: fixed a problem with $z macro.</tt></li> <li><tt><b>12.10.2015 RELEASE version 7.4b10</b></tt></li> <li><tt>12.11.2015 SAVEIMAGE: fixed a problem with the colorbar not updating when used with -exit.</tt></li> <li><tt>12.17.2015 FITS: 3D displayed z coord off by .5.</tt></li> <li><tt><b>12.21.2015 RELEASE version 7.4</b></tt></li> </ol> </ol> </body> </html> �����saods9/ds9/doc/ref/3d.html��������������������������������������������������������������������������000644 �000765 �000000 �00000010243 11763203427 015605� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>3D</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> 3-D Frames<br> </h3> <blockquote> <p>Previous versions of SAOImage DS9 would allow users to load 3-D data into the traditional 2-D frames, and would allow users to step through successive z-dimension pixel slices of the data cube. To visualize the 3-D data in DS9 v. 7.0, a new module, encompassed by the new <tt>Frame 3D</tt> option, allows users to load and view data cubes in multiple dimensions.<br> </p> <p>The new module implements a simple ray-trace algorithm. For each pixel on the screen, a ray is projected back into the view volume, based on the current viewing parameters, returning a data value if the ray intersects the FITS data cube. To determine the value returned, there are 2 methods available, Maximum Intensity Projection (MIP) and Average Intensity Projection (AIP). MIP returns the maximum value encountered, AIP returns an average of all values encountered. At this point, normal DS9 operations are applied, such as scaling, clipping and applying a color map.<br> </p> <p>Rendering time is independent upon the actual data cube size. Instead, the time it takes to render is based on how many rays are needed to project the data cube upon the screen in the view volume and the current zoom factor. The new module requires no special hardware or graphical processor unit (GPU) and the rendering time is adequate for interactive GUI manipulation on most computers. The rendering engine is developed using the POSIX thread library, allowing multiple light weight processes to be spawned to complete an image in parallel. The number of threads actually generated is a user specified parameter. Since all modern hardware contain multiple CPU cores, the default value is 8 threads. For larger work stations, this number can be increase. For every doubling in the number of CPU cores available, rendering times decrease approximately 75%.<br> </p> <blockquote><tt>Example:</tt><br> <tt># create 3d frame, load fits file</tt><br> <tt> # set view angle to az 45 el 30 deg</tt><br> <tt> # set rendering method to Average Intensity Projection</tt><br> <br> <tt>% ds9 -3d mycube.fits </tt><tt>-3d vp 45 30 </tt><tt>-3d method aip</tt><br> <br> <tt>% xpaset -p ds9 3d</tt><br> <tt> % xpaset -p ds9 file mycube.fits</tt><br> <tt> % xpaset -p ds9 3d vp 45 30</tt><br> <tt> % xpaset -p ds9 3d method aip</tt></blockquote> <blockquote> </blockquote> All 2-D graphics, regions, cross hairs, contours, and coordinate grids, are applied to the current slice, which is selected by the user. When the user wishes to match or lock a 2-D image and to a 3-D data cube, the current slice is used to determine the rendering solution. The user can crop the data cube for all 3 axes via the command line or the GUI. The new module also supports FITS event files binned into a data cube.<br> <br> All printing support has been extended to the new 3-D module. The user may generate 3-D images in Postscript, JPEG, TIFF, and other formats, just as in the 2-D case. Furthermore, native printing is supported for the Windows version.<br> <br> DS9 analysis macros have been enhanced to fully support the new 3-D module, allowing the user to invoke external analysis tasks based on the current view parameters and to return results back into DS9 in the form of text, plot, 2-D image, or 3-D image. </blockquote> </body> </html> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/analysis.html��������������������������������������������������������������������000644 �000765 �000000 �00000111466 12614503526 017132� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Analysis</title> </head> <body link="#0000ee" alink="#ff0000" bgcolor="#ffffff" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" height="98" align="middle" width="100"> Analysis</h3> <blockquote> <p>Each file type known to DS9 can have user-defined analysis commands associated with it. These analysis commands are defined at start-up time , or loaded by the user, by means of an ASCII analysis description file. The analysis commands are available for execution, either via the <i>Analysis Menu </i>or the XPA point <i>Analysis</i>. In addition, commands may be <i>bound</i> to events, such as keystrokes or mouse clicks. This type of command is called a bind command.<br> </p> <p>DS9 searches for an analysis file named <tt>ds9.ans</tt> or <tt>ds9.analysis</tt> in the current directory and <tt>$HOME</tt> to be loaded at startup. In addition, DS9 will search the following directories for any analysis files to be loaded at startup in the form of <tt>*.ds9</tt>: the current directory, <tt>$HOME/bin</tt>, <tt>/usr/local/bin</tt>, <tt>/opt/local/bin</tt>, and <tt>/soft/saord/bin</tt>. Finally, the user may specify analysis files to be loaded at startup in the preferences analysis panel. The user may also load or clear current analysis commands via command line options or the <i>Analysis m</i>enu<i>.</i></p> <p>When activated, either from the menu, XPA, or bound event, an analysis command first is macro-expanded to fill in user-defined arguments and then is executed externally. Results may be displayed in a separate text window, plot window, or in a image frame. </p> <a href="#Syntax">Syntax</a> <br> <a href="#CommandType">Command Type</a> <br> <a href="#Macros">Macros</a> <br> <a href="#Help">Help</a> <br> <a href="#Web"> </a><a href="#Parameters">Parameters</a> <br> <a href="#HierarchicalMenus">Hierarchical Menus</a> <br> <a href="#Sample">Sample</a> <p><b><a name="Syntax"></a>Syntax</b></p> The analysis file that defines the known analysis commands consists of one or more file descriptors, each of which has the following format: <blockquote> <tt>Menu label to be used</tt> <br> <tt>A space separated list of file templates</tt> <br> <tt>Command type [menu | bind &lt;event&gt;]</tt> <br> <tt>The command line for the analysis program</tt> </blockquote> <p>Task names may contain space characters. All lines may be indented. Also, the '#' character is a comment character. A separator can be inserted in the menu by specifying the following sequence '---'.</p> <tt>Example:</tt> <blockquote> <tt># this will insert a menu separator</tt> <br> <tt>---</tt> </blockquote> <p><b><a name="CommandType"></a>Command Type</b></p> <p>The third line indicates the type of command. </p> <blockquote> <p><b>menu</b></p> <p>A <tt>menu</tt> command creates an menu option under the <i>Analysis </i>menu option, and can be invoked by the user via the GUI or XPA.</p> <tt>Example:</tt> <blockquote> <tt># Menu command example</tt><br> <tt>My Analysis Task</tt><br> <tt> </tt><tt>*.fits</tt> <br> <tt>menu</tt> <br> <tt>$data | doit | $text</tt> </blockquote> <p><b>bind</b></p> <p>A <tt>bind</tt> command is a command that is bound to an event. When the event occurs, the command is executed. Types of events available include all TK events, including all <i>keystrokes</i> and <i>mouse clicks.</i> If a command is bound to an event other that a <i>keystroke</i>, care must be taken to not to interfere with other internal DS9 events. </p> <p>To bind to a key stroke, use the following command type:</p> <blockquote> <tt>bind &lt;keystroke&gt; </tt><br> </blockquote> <tt>Example:</tt> <blockquote> <tt># Bind command example</tt><br> <tt>Print coordinates</tt><br> <tt>*.fits</tt><br> <tt>bind x</tt><br> <tt>echo "$x $y" | $text</tt><br> </blockquote> <p><b>web</b></p> <p>A <tt>web</tt> command allows the user to invoke the internal web browser from the analysis menu.</p> <tt>Example:</tt> <blockquote> <tt> # web command example<br> HTTP based<br> *<br> web<br> http://hea-www.harvard.edu/RD/ds9/ref/index.html<br> <br> File based<br> *<br> web<br> file:/home/joye/index.html<br> </tt> </blockquote> </blockquote> <p><b><a name="Macros"></a>Macros</b></p> <p>The following macros are macro-expanded to fill in user-defined arguments before the command is executed. Strings that contain $&lt;macroname&gt; that user does not want to be expanded may be escaped by using $$&lt;macroname&gt;. All strings that contain $&lt;string&gt; &nbsp;that are not a macro name will not be affected.</p> <p>For example:</p> <blockquote> <tt>echo "$$data $foo" | $text</tt><br> </blockquote> <p>will display a text dialog that contains "$data $foo"</p> <p><b>$width<br> $height<br> $depth</b></p> <p>Substitute the width, height, or depth of the data file in the command line. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $width</tt><br> <tt>&nbsp;&nbsp;&nbsp; $height</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "$width $height $depth" | $text</tt> <br> <p><b>$bitpix</b></p> <p>Substitute the bitpix of the data file in the command line. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $bitpix</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "$bitpix" | $text</tt> <p><b>$data</b></p> <p>Data from the current frame becomes the input data to the command string. This data is in the form of a FITS image. This macro can only used at the beginning of the command string. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $data</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $data | dosomething | $text</tt> <p><b>$entry</b></p> <p>Display an entry modal dialog. The returned string is substituted. If <tt>cancel</tt> is selected, the command line is not executed. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $entry(&lt;message&gt;)</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "$entry(Enter something here)" | $text</tt> <p><b>$env</b></p> <p>Substitute the value of a shell environment variable. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $env(&lt;shell variable&gt;)</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "$env(PATH)" | $text</tt> <p><b>$filedialog</b></p> <p>Display the standard file dialog. Substitutes the returned pathname. Argument specifies if an open file or save file dialog is invoked.</p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $filedialog([open|save])</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "$filedialog(open)" | $text</tt><br> <p><b>$filename</b></p> <p>Substitute the filename of the data file in the command line. A full filename includes any absolute or relative path. A root filename contains no path. A (2D) subsection defines a subimage from <tt>xmin,ymin</tt> to <tt>xmax,ymax</tt>. For Frame3D, a 2D subsection will also include the current slice (PLANE=) parameter if not 1. A 3D subsection defines a subimage from <tt>xmin,ymin,zmin</tt> to <tt>xmax,ymax,zmax</tt> and no PLANE parameter.<br> </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $filename # filename with extname, (2d) subsections, filters</tt><br> <tt>&nbsp;&nbsp;&nbsp; $filename(root|root,base) # root filename with </tt><tt>with extname, </tt><tt>no subsections, no filters)</tt> <br> <tt>&nbsp; &nbsp; $filename(full|full,base) # full filename </tt><tt>with extname, </tt><tt>no subsections, no filters)</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; dosomething $filename | $text</tt> <br> <tt>&nbsp;&nbsp;&nbsp; dosomething $filename(root) | $text<br> </tt><br> <b>$filename[$regions]</b> <p>Combination of <tt>$filename </tt>and <tt>$regions </tt>macros. Generates a series of filenames, each with a region. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $filename[$regions]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $filename[$regions(&lt;options&gt;)]</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; dosomething $filename[$regions] | $text</tt> <p><b>$geturl</b></p> <p>This macro differs from all other macros, including $<tt>url</tt>, in that no subprocess pipe is created. Only HTTP is supported. The contents of the url are retrieved and sent to $<tt>text</tt>, $<tt>plot</tt>, or $<tt>image.</tt> No other processing is allowed. The primary purpose of this macro is to support external analysis for the Windows platform, which has no subprocess support. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $geturl(http://&lt;hostname&gt;:&lt;port&gt;/&lt;query&gt;)</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $geturl(http://foo.bar.edu/foo.html) | $text</tt><br> <p><b>$image</b></p> <p>The resulting image data is display in a DS9 frame. This macro should be the last macro of a command line. Optional parameter indicates if a new frame and what type of frame is created for the new data. The macro is removed from the command line before execution. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $image</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $image([new|rgb|3d|current])</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; doit | $image(new)</tt> <p><b>$message</b></p> <p>Display a message dialog box, with option buttons.&nbsp; After displaying the message, the macro is removed from the command line before execution. If <tt>cancel</tt> or <tt>no</tt> is selected, the command line is not executed. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $message(&lt;message&gt;)</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $message([ok|okcancel|yesno],&lt;message&gt;)</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $message(okcancel,This is a Message)| doit | $text</tt> <p><b>$null</b></p> <p>Expect no output or results from analysis task. Note: no error message will be returned if the analysis task fails to execute correctly. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $null</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo "Hello, world" &gt; foo | $null</tt> <p><b>$pan</b></p> <p>Substitute current pan location of the particular data file are returned. The default coordinate system is <tt>physical</tt>. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $pan<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $pan(&lt;coordinate system&gt;,&lt;format&gt;)</tt> <br> <p>where:</p> <tt>&nbsp;&nbsp;&nbsp; coordinate system = [image|physical|detector|amplifier|wcs|wcsa...wcsz]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [fk4|fk5|icrs|galactic|ecliptic]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [hms|sexagesimal|degrees]</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo $pan(fk5,sexagesimal) | $text</tt><br> <p><b>$plot</b></p> <p>Display data in plot window. This macro should be the last macro of a command line. The data is read via <tt>STDIN</tt> and consist of a pair of coordinates, with option error values. (<tt>xy, xyex, xyey, xyexe</tt>y) Default dimension is <tt>xy.</tt> The macro is removed from the command line before execution. </p> <p>For <tt>$plot(stdin)</tt> only: </p> <p>The title, x axis label, and y axis label are assumed to be on the first line of input, delimited with a new-line. However, if the data starts with $<tt>BEGINTEXT</tt>, all text between $<tt>BEGINTEXT</tt> and $<tt>ENDTEXT</tt> will be removed from the data and displayed in a separate text dialog window, with the remaining data, including the title, x axis label, and y axis label, will be displayed in a plot window. Furthermore, if the data contains the string $<tt>ERROR,</tt> an error is assumed to have occurred and a text dialog window is displayed only. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $plot</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $plot(,,,)</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $plot(&lt;title&gt;,&lt;x axis label&gt;,&lt;y axis label&gt;,[xy|xyex|xyey|xyexey])</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $plot(stdin)</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; doit | $plot(This is aTitle,X Axis,Y Axis)<br> </tt> <tt>&nbsp;&nbsp;&nbsp; doit | $plot(stdin)</tt> <p><b>$regions</b></p> <p>Substitute region definition in specified region format, coordinate system, and coordinate format. The default coordinate system is <tt>physical</tt>, default coordinate format <tt>degrees</tt>, and default region format <tt>DS9</tt>. Arguments may appear in any order, as long as they are separated by ',' and no spaces. If one or&nbsp; more properties are specified, only regions with all of the specified properties will be substituted. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $regions</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $regions(&lt;options&gt;)</tt> <p>where options are one of the following: </p> <tt>&nbsp;&nbsp;&nbsp; regions format&nbsp;&nbsp;&nbsp; = [ds9|ciao|saotng|saoimage|pros|xy]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; property&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [include|exclude|source|background]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; coordinate system = [image|physical|detector|amplifier|wcs]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [fk4|fk5|icrs|galactic|ecliptic]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [sexagesimal|degrees]</tt> <p>also, the old <i>SAOTNG</i> formats are also supported: </p> <tt>&nbsp;&nbsp;&nbsp; $regions_pixels</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $regions_degrees</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $regions_hms</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $include_regions</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $include_regions_pixels</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $include_regions_degrees</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $include_regions_hms</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $exclude_regions</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $exclude_regions_pixels</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $exclude_regions_degrees</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $exclude_regions_hms<br> </tt> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; dosomething $regions | $text</tt> <br> <tt>&nbsp;&nbsp;&nbsp; dosomething $regions(pros) | $text</tt> <br> <tt>&nbsp;&nbsp;&nbsp; dosomething $regions(source,wcs,fk5) | $text</tt> <br> <tt>&nbsp;&nbsp;&nbsp; dosomething $regions(saotng,background,exclude,ecliptic,sexagesimal) | $text</tt> <p><b>$text</b></p> <p>Display text in a text dialog window. This macro should be the last macro of a command line. To display text from only STDOUT use '|' as the pipe command. To display text from both STDOUT and STDERR, use '|&amp;' as the pipe command. No parameters are required. The macro is removed from the command line before execution. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $text</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; doit | $text # stdout<br> &nbsp;&nbsp;&nbsp; doit |&amp; $text # stdout and stderr<br> </tt> <p><b>$url</b></p> <p>URLs are processed and stored in a temporary file. Only HTTP and anonymous FTP are supported. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $url(http://&lt;hostname&gt;:&lt;port&gt;/&lt;query&gt;)</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $url(ftp://&lt;hostname&gt;/&lt;filename&gt;)</tt><br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $url(http://legacy.gsfc.nasa.gov/rosat/data/p000s26b.img.Z) | uncompress | $image</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $url(ftp://legacy.gsfc.nasa.gov/rosat/data/hri/images/rh100193_img.fits) | $image<br> </tt> <p><b>$vo_method</b></p> <p>Returns the vo method. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $vo_method</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo '$vo_method' | $text</tt><br> <p><b>$value<br> </b></p> <p>Substitute the value at the location of the cursor of an bind event.<br> </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $value<br> <br> Example:<br> &nbsp;&nbsp;&nbsp; echo "$value" | $text</tt><br> <p><b>$x<br> $y<br> $z<br> </b></p> <p>Substitute coordinates of an bind event. When a bind event is triggered, the <i>x,y </i>coordinates of the mouse of the particular data file are returned. The default coordinate system is <tt>physical</tt>. This macro is only available for bind commands. For datacubes, the z coordinate is returned based on the current slice selected.<br> </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $x</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $x(&lt;coordinate system&gt;,&lt;format&gt;)</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $y</tt> <br> <tt>&nbsp;&nbsp;&nbsp; $y(&lt;coordinate system&gt;,&lt;format&gt;)<br> &nbsp;&nbsp;&nbsp; $z<br> &nbsp;&nbsp;&nbsp; $z(&lt;coordinate system&gt;)<br> </tt> <p>where:</p> <tt>&nbsp;&nbsp;&nbsp; coordinate system = [image|physical|detector|amplifier|wcs|wcsa...wcsz]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky frame&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [fk4|fk5|icrs|galactic|ecliptic]</tt> <br> <tt>&nbsp;&nbsp;&nbsp; sky format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = [hms|sexagesimal|degrees]</tt> <br> <br> <tt>Example:<br> </tt><tt>&nbsp;&nbsp;&nbsp; echo "$x $y" | $text<br> &nbsp;&nbsp;&nbsp; echo "$x $y $z" | $text<br> &nbsp;&nbsp;&nbsp; echo "$x(fk5,sexagesimal) $y(fk5,sexagesimal)" | $text<br> </tt><tt>&nbsp;&nbsp;&nbsp; echo "$x(wcs) $y(wcs) $z(wcs)" | $text</tt><br> <p><b>$xpa</b></p> <p>Returns the xpa access point name. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $xpa</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo '$xpa' | $text</tt> <p><b>$xpa_method</b></p> <p>Returns the xpa method. </p> <tt>Syntax:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; $xpa_method</tt> <br> <br> <tt>Example:<br> </tt> <tt>&nbsp;&nbsp;&nbsp; echo '$xpa_method' | $text</tt> <p><b><a name="Help"></a>Help</b></p> <p>The user may define his own <tt>HELP</tt> message. This message will be available to the user as a menu item. An optional label maybe specified. The default label is <tt>Help</tt>. When invoked, an text dialog window will appear, containing the message. Multiple <tt>HELP</tt> items maybe defined within a menu or across hierarchical menus. </p> <tt>Example:</tt> <blockquote><tt>help Main Help</tt> <br> <tt>A help message may contain</tt> <br> <tt>multiple lines of description of the tasks</tt> <br> <tt>in the menu or menus</tt> <br> <tt>endhelp</tt> </blockquote> <p><b><a name="Parameters"></a>Parameters</b></p> <p>The user may define his own macros or parameters to be evaluated before the command line is executed. To do this, the user defines a param segment that is referenced in the command line. The param definition has the follow format: </p> <blockquote> <tt>param &lt;name&gt;</tt> <br> <tt>&lt;variable&gt; &lt;entry | checkbox | menu&gt; &lt;title&gt; &lt;default&gt; &lt;{comment}&gt;</tt> <br> <tt>...</tt> <br> <tt>endparam</tt> </blockquote> <p>or </p> <blockquote> <tt>param &lt;name&gt;</tt> <br> <tt>@&lt;iraf param filename&gt;</tt> <br> <tt>end</tt> </blockquote> <p>The definition either consisted of a number of variables, one per row, or the name of a IRAF style parameter file. DS9 will look for the IRAF parameter file in: </p> <blockquote> <tt>./&lt;filename&gt;</tt> <br> <tt>$UPARM/&lt;filename&gt;</tt> <br> <tt>$HOME/iraf/&lt;filename&gt;</tt> </blockquote> <tt>Example:<br> </tt> <blockquote> <tt>param foobar</tt> <br> <tt>var1 entry {Variable 1} default {this is a entry}</tt> <br> <tt>var2 checkbox {Variable 2} 1 {this is a checkbox}</tt> <br> <tt>var3 menu {Variable 3} AAA|BBB|CCC {this is a menu}</tt> <br> <tt>endparam</tt> </blockquote> <p>To use parameters, specify the param name at the beginning of your command line: </p> <blockquote> <tt>Parameter Test</tt> <br> <tt>*</tt> <br> <tt>menu</tt> <br> <tt>$param(foobar); echo "$var1 $var2 $var3" | $text</tt> </blockquote> <p>When the menu item is selected, the user will be presented with a dialog box that contains <i>entry, checkbox, or menu </i>choices for each variable specified. If the user clicks ok, the values are substituted in the command line before execution. </p> <p><b><a name="HierarchicalMenus"></a>Hierarchical Menus</b></p> <p>The user may define hierarchical menus. Use this to organized crowded menus. To do this, frame menu entries with <tt>hmenu &lt;label&gt; </tt>and <tt>endhmenu</tt>. Hierarchical menu labels may contain spaces. Multiple levels maybe implemented. </p> <tt>Example:<br> </tt> <blockquote> <tt>hmenu Stuff</tt> <br> <tt>&nbsp;&nbsp;&nbsp; hello</tt> <br> <tt>&nbsp;&nbsp;&nbsp; *</tt> <br> <tt>&nbsp;&nbsp;&nbsp; menu</tt> <br> <tt>&nbsp;&nbsp;&nbsp; echo "Hello" | $text</tt> <p><tt>&nbsp;&nbsp;&nbsp; world</tt> <br> <tt>&nbsp;&nbsp;&nbsp; *</tt> <br> <tt>&nbsp;&nbsp;&nbsp; menu</tt> <br> <tt>&nbsp;&nbsp;&nbsp; echo "World" | $text</tt> </p> <p><tt>&nbsp;&nbsp;&nbsp; hmenu More Stuff</tt> <br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hello world</tt> <br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</tt> <br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu</tt> <br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo "Hello World" | $text</tt> <br> <tt>&nbsp;&nbsp;&nbsp; endhmenu</tt> <br> <tt>endhmenu</tt></p> </blockquote> <p>Will create an hierarchical menu with two members, <tt>hello</tt> and <tt>world</tt>. </p> <p><b><a name="Sample"></a>Sample</b></p> <tt>#<br> # Analysis command descriptions:<br> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menu label<br> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file templates<br> #&nbsp;&nbsp;&nbsp; menu/bind<br> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; analysis command line<br> <br> param foo<br> &nbsp;&nbsp;&nbsp; var1 entry entry 40 {this is a entry}<br> &nbsp;&nbsp;&nbsp; var2 checkbox checkbox 1 {this is a checkbox}<br> &nbsp;&nbsp;&nbsp; var3 menu menu AAA|BBB|CCC {this is a menu}<br> endparam<br> <br> param bar<br> &nbsp;&nbsp;&nbsp; @analysis.par<br> endparam<br> <br> param foobar<br> &nbsp;&nbsp;&nbsp; @tvdisply.par<br> endparam<br> <br> param ltc<br> &nbsp;&nbsp;&nbsp; bins entry "Enter number of [t1:t2:]bins" 0 "('0' for default number of bins)"<br> endparam<br> <br> # Help Main Help<br> <br> help Main Help<br> These menus contain a test for each possible feature<br> <br> supported by the ds9 (blank line above)<br> endhelp<br> ---<br> <br> hmenu Test Web<br> &nbsp;&nbsp;&nbsp; help Web Help<br> &nbsp;&nbsp;&nbsp; Help for web features<br> &nbsp;&nbsp;&nbsp; endhelp<br> <br> &nbsp;&nbsp;&nbsp; Web Test url<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; web<br> &nbsp;&nbsp;&nbsp; http://hea-www.harvard.edu/RD/ds9/<br> <br> &nbsp;&nbsp;&nbsp; Web Test file<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; web<br> &nbsp;&nbsp;&nbsp; file:/home/joye/saods9/ds9/tests/hv.html<br> endhmenu<br> <br> hmenu Test Basics<br> &nbsp;&nbsp;&nbsp; help Basic Help<br> &nbsp;&nbsp;&nbsp; Help for basic features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test escape char # this is a comment<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "this is not a macro $$xpa" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test pass thru # this is a comment<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "this is not a macro $foo" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $xpa # this is a comment<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $xpa | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $xpa_method<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $xpa_method | $text<br> </tt><tt><br> &nbsp;&nbsp;&nbsp; Test $vo_method<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $vo_method | $text<br> <br> </tt><tt>&nbsp;&nbsp;&nbsp; Test $filename<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $filename | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $filename(root)<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $filename(root) | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $xdim $ydim $bitpix<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$xdim $ydim $bitpix" | $text<br> <br> </tt><tt>&nbsp;&nbsp;&nbsp; Test $xcen $ycen<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$xcen $ycen" | $text<br> <br> </tt><tt>&nbsp;&nbsp;&nbsp; Test $env<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo $env(PATH) | $text<br> endhmenu<br> <br> hmenu Test Regions<br> &nbsp;&nbsp;&nbsp; help Regions Help<br> &nbsp;&nbsp;&nbsp; Help for regions features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $regions<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$regions ds9_s:$regions(ds9,source,image) ciao_b:$regions(ciao,background) saotng_i:$regions(saotng,include,wcs,fk5) pros_e:$regions(pros,exclude,wcs,fk5,sexagesimal) xy_be:$regions(xy,background,exclude,wcs,fk4,hms)" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $regions wcs<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$regions(ds9,wcs) $regions(ds9,wcs,fk5,sexagesimal) $regions(ds9,wcsa) " | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $include_regions_pixels<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "ds9_s: $source_regions ds9_b: $background_regions_pixels ds9_i: $include_regions_degrees ds9_e: $exclude_regions_hms" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $filename $regions<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$filename[$regions]" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $filename $regions()<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$filename[$regions()]" | $text<br> endhmenu<br> <br> hmenu Test Output<br> &nbsp;&nbsp;&nbsp; help Output Help<br> &nbsp;&nbsp;&nbsp; Help for output features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $null<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "This is Text" &gt; /dev/null | $null<br> <br> &nbsp;&nbsp;&nbsp; Test $text<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "This is Text" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $text stderr<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; ls foofoofoo | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $plot<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xy.dat | $plot<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(title,x,y,xyey)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xye.dat | $plot(Title,X Axis,Y Axis,xyey)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(title,x,y,xyexey)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xyee.dat | $plot(Title,X Axis,Y Axis,xyexey)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(title,x,y,4)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xyey.dat | $plot(Title,X Axis,Y Axis,4)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(title,x,y,5)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xyeye.dat | $plot(Title,X Axis,Y Axis,5)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(stdin)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xye.stdin.dat | $plot(stdin)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(stdin) text<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xye.stdin.text.dat | $plot(stdin)<br> <br> &nbsp;&nbsp;&nbsp; Test $plot(stdin) error<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat xy.stdin.error.dat | $plot(stdin)<br> <br> &nbsp;&nbsp;&nbsp; Test $data<br> &nbsp;&nbsp;&nbsp; *.fits<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $data | $image(new)<br> <br> &nbsp;&nbsp;&nbsp; Test $image<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; cat img16.fits | $image<br> endhmenu<br> <br> hmenu Test Dialogs<br> &nbsp;&nbsp;&nbsp; help Dialogs Help<br> &nbsp;&nbsp;&nbsp; Help for dialog features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $message(message)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $message(ok,This is a Message) | echo "hello" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $message(ok,message)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $message(ok,This is a Message) | echo "World" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $entry(message)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; echo "$entry(Enter Something)" | $text<br> endhmenu<br> <br> hmenu Test Params<br> &nbsp;&nbsp;&nbsp; help Param Help<br> &nbsp;&nbsp;&nbsp; Help for param features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $param<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $param(foo); echo "$var1 $var2 $var3" | $text<br> <br> &nbsp;&nbsp;&nbsp; Test $param @file<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $param(bar); echo "$var1 $var2 $var3" | $text<br> endhmenu<br> <br> hmenu Test Network<br> &nbsp;&nbsp;&nbsp; help Network Help<br> &nbsp;&nbsp;&nbsp; Help for network features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $url(http://)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $url(http://legacy.gsfc.nasa.gov/FTP/rosat/data/cdrom/vol1/IMAGES/00h/p000s26b.img.Z) | gunzip | $image<br> <br> &nbsp;&nbsp;&nbsp; Test $url(ftp://)<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $url(ftp://legacy.gsfc.nasa.gov/rosat/data/hri/images/fits/rh100193_img.fits) | $image<br> <br> &nbsp;&nbsp;&nbsp; Test $geturl $text<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $geturl(http://hea-www.harvard.edu/RD/saord-cgi/funtools?funcnts+$filename+$regions(source,,)+$regions(background,,))|$text<br> <br> &nbsp;&nbsp;&nbsp; Test $geturl $plotstd<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $param(ltc); $geturl(http://hea-www.harvard.edu/RD/saord-cgi/funtools?funhist_plot+$filename[$regions]+time+$bins)|$plot(stdin)<br> endhmenu<br> <br> hmenu Test Other<br> &nbsp;&nbsp;&nbsp; help Other Help<br> &nbsp;&nbsp;&nbsp; Help for other features<br> &nbsp;&nbsp;&nbsp; endhelp<br> &nbsp;&nbsp;&nbsp; ---<br> &nbsp;&nbsp;&nbsp; Test $param @tvdisply<br> &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; $param(foobar); echo "$frame $erase" | $text<br> <br> &nbsp;&nbsp;&nbsp; hmenu Test MultiLevel<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; test<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; menu<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; echo "Hello World" | $text<br> &nbsp;&nbsp;&nbsp; endhmenu<br> endhmenu<br> <br> $x $y<br> *.fits<br> bind x<br> echo "$x $y" | $text<br> <br> $x(fk5,hms) $y(fk5,hms)<br> *.fits<br> bind y<br> echo "$x(fk5,hms) $y(fk5,hms)" | $text<br> <br> $x(wcs,fk5,hms) $y(wcs,fk5,hms)<br> *.fits<br> bind z<br> echo "$x(wcs,fk5,hms) $y(wcs,fk5,hms)" | $text<br> </tt> </blockquote> </body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/backup.html����������������������������������������������������������������������000644 �000765 �000000 �00000005350 11763212355 016547� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Backup</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Backup and Restore</h3> <blockquote> <p>DS9 now supports Backup and Restore. When a backup is invoked, DS9 will save in a backup save set all files needed to restore DS9 to that state, including geometry, data files, colormaps, catalogs, contours, and regions.<br> </p> <p><b>Backup Save Set</b></p> <p>A backup save set consists of a text file, called a backup script, and an optional directory, which will contain auxiliary data files needed to restore DS9 to a previous state. The backup file and the auxiliary directory maybe moved across file systems, or even platforms, but must remain together in the same directory. <br> </p> <p><b>Image data files</b></p> <p>By default, all data image files are save within the backup save set. However, the user has the option, via the Preferences, to only save only an absolute pathname to the data file, and not the data file itself. This option will dramatically reduce the size of a backup save set, but will restrict the usage to a particular file system and platform.<br> </p> <p>Image files that have been loaded into DS9 via XPA, SAMP, or from URL will always be saved into the save set.<br> </p> <p><b>Caveats</b></p> <p>There are several caveats in the usage of Backup and Restore. In particular:<br> </p> <blockquote> <p> <tt>Currently, there is no support for masks.<br> External Analysis menus will not be saved.<br> Plot Tool windows will not be saved.<br> IIS frames (IRAF) will not be saved.<br> SAMP and XPA sessions will not be saved.</tt></p> </blockquote> <p>And finally, if the image data had been loaded into DS9 via XPA, SAMP, or from a URL, the following complex load operations are not supported:</p> <blockquote> <tt>Open Mosaic IRAF Image<br> Open Mosaic IRAF Segment Open Mosaic WCS Image<br> Open Mosaic WCS Segment Open Mosaic WFPC2 Open RGB Fits Image Open RGB Fits Cube Open RGB Array Open Multi Ext Data Cube Open Multi Ext Multiple Frames </tt></blockquote> </blockquote> </body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/bin.html�������������������������������������������������������������������������000644 �000765 �000000 �00000004036 12071072130 016036� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Bin</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" height="98" width="100"> Binning</h3> <blockquote> <p>To create an image from a FITS Bin Table, the user needs to specify a binning factor, binning buffer size, and the binning function.<br> </p> <p>The Binning (or Block) Factor is defined as the following: A value greater or equal to zero. This value indicates the number of pixel values that will fall into a particular bin.<br> </p> <p>The Bin Buffer Size is overall size of the image generated. This has no relation to min and max values of the columns used to create the image. <br> </p> <p>The Bin Function is defined as the following: Average - all pixel values that fall into one pixel bin are averaged. Sum - all pixel values that fall into one pixel bin are summed.<br> </p> <p>Bin to Fit Frame will calculate a bin block factor as a power of 2 that will allow the entire data space to be displayed in the current frame. </p> <p>By default, DS9 will bin about the center of the image. To determine the center of the image, DS9 will look for the following keywords in order:</p> <blockquote> <tt>TDMIN/TDMAX<br> TLMIN/TLMAX<br> TALEN<br> AXLEN</tt> </blockquote> <p>If no valid keywords are found, DS9 will define the center as the middle of the possible data space based on the coordinate data type.</p> <br> <p><br> </p> <blockquote> </blockquote> <p><br> </p> <br> </blockquote> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/catalog.html���������������������������������������������������������������������000644 �000765 �000000 �00000016616 12513552450 016720� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Catalogs</title> </head> <body link="#0000ee" alink="#ff0000" bgcolor="#ffffff" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" height="98" align="middle" width="100"> Catalogs</h3> <blockquote> <p>DS9 provides full support for loading, displaying, filtering, and saving catalogs. DS9 allows you to overlay symbols from multiple catalogs on the current image.</p> <p>Local and on-line catalog access is supported. Most major catalogs can be retrieved from online servers. Both the CDS and SDSS catalog servers are now supported. Local catalog files in starbase (rdb) or CSV (with or without header) are supported.</p> <p>On-line catalogs are available via services provided by the VizieR catalog access tool, CDS, Strasbourg, France (VizieR is a joint effort of the Centre de Donnees Astronomiques de Strasbourg and ESA-ESRIN Information Systems Division) and by the Sloan Digital Sky Survey.</p> <p>A selection of popular catalogs is provided in the Analysis menu. In addition, you can search for other catalogs based on title, keywords, mission, wavelength, and object type.</p> <p>When a catalog is overlayed on an image, each displayed catalog symbol consists of a shape, color, and text. An advanced symbol editor is available that allows you to specify the shape, size, color, and text of each symbol, based on catalog column values. These symbol expressions can be saved for future use.</p> <p>Along with the overlay display, a catalog list is provided in a separate window. It displays the column values for each catalog object. The catalog list can be sorted and filtered, and the catalog display will be automatically updated. Advanced filtering options are available. Catalogs can be loaded and saved as local files in ASCII Starbase format. Each catalog contains header information which can be displayed. The list can be printed separately from the image.</p> <p>An interactive connection between the displayed catalog symbols and the catalog list is provided. When you select one or more rows within the catalog list, the corresponding symbols are highlighted on the image display. Conversely, selecting multiple symbols on the image display will highlight the corresponding rows within the catalog list. Catalog symbols can be converted to regions for use with analysis tasks.</p> <p><b>Filter Option</b></p> <p>The catalog list can be sorted and filtered, and the catalog display will be automatically updated. A filter is conditional expression, when evaluated for each row of the catalog, if true, the row is displayed, and if false, the row is not displayed. The conditional expression can be any valid TCL expression. The value of a column may be indicated with <tt>$&lt;column name&gt;</tt>.</p> <blockquote> <tt>$_RAJ2000&gt;180. &amp;&amp; $_RAJ2000&lt;270.</tt><br> <tt>$Jmag&gt;11</tt><br> <tt>log($Kmag*10)&lt;.3<br> </tt><tt>[string equal $OTYPE_S SNR]</tt><br> </blockquote> <p><b>Advanced Symbol Editor</b></p> <p>An advanced symbol editor is available that allows you to specify the shape, size, color, and text of each symbol, based on catalog column values. For each row of the catalog, one or more conditional expressions are evaluated. For the first expression to evaluate true, a given symbol is displayed, with the specified shape, color, size and text properties. As with the filter, the value of a particular column can be indicated as <tt>$&lt;column name&gt;.</tt></p> <p>For the condition entry, the expression you type in is automatically evaluated via TCL <tt>expr</tt> after macro expansion.</p> <blockquote> <tt>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# always</tt><br> <tt>0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# never</tt><br> <tt>true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# always</tt><br> <tt>false&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# never</tt><br> <tt>$Jmag&gt;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# conditional</tt><br> <tt>sin($Jmag)&gt;.5 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # conditional</tt><br> <tt>[string equal $Class SNR]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# conditional</tt><br> <tt>[regexp {*SNR*} $Class]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# conditional</tt><br> </blockquote> <p>For the size, size2, and angle entries, the expression you type in is also automatically evaluated via TCL <tt>expr</tt> after macro expansion.</p> <blockquote> <tt>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# value of '2' is used</tt><br> <tt>$Jmag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# value of column Jmag is used</tt><br> <tt>$Jmag/2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# value of column Jmag div 2 is used</tt><br> <tt>(4+2)/3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# value of '2' is used</tt><br> </blockquote> <p>For the text portion, this is not true. It is assumed to be text, unless you explicitly use an <tt>expr </tt>operator.</p> <blockquote> <tt>foo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# will put 'foo' above the symbol</tt><br> <tt>$Jmag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# will put the value of column Jmag above the symbol</tt><br> <tt>(4+2)/3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# will put the text '(4+2)/3' above the symbol</tt><br> <tt>[expr (4+2)/3]&nbsp;&nbsp;# will put the text '2' above the symbol</tt><br> <tt>[expr $Jmag/2.]&nbsp;# will take the value of Jmag and div by 2</tt><br> </blockquote> <p>And finally, one special case for shape = text and text = empty. In this case, the row number is displayed. </p> &nbsp; </blockquote> </body> </html> ������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/colorbar.html��������������������������������������������������������������������000644 �000765 �000000 �00000007110 11763212355 017101� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Color</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Colorbar<br> </h3> <blockquote> <p><b>Color Tags</b></p> <p>The purpose of color tags are to highlight (or hide) certain values of data, regardless of the color map selected. The user creates, edits, and deletes color tags via the GUI. To create a color tag, enter the Colorbar Mode, and click once on the colorbar. This creates a default color tag. Click and drag to change the values. Click and drag on one side to increase or decrease the value. Double click to manually edit the values and color. Place the cursor over the color tag and press the delete key to delete it. From the color parameters dialog, the user can load, save, and delete all color tags for that frame.<br> </p> <p><b>Visuals</b></p> <p>DS9 supports a number of color environments. Not all color environments, or visuals, are available on most machines. In fact, you may be restricted to one or two, base on the color graphics hardware your computer has. A color visual is composed of two parts, the color model and the bit depth. Pseudo color uses a color lookup table to derive the correct color, True color uses the value directly as a RGB triplet, to derive the correct color. The follow is a list of the color visuals DS9 currently supports:</p> <blockquote> <tt>pseudo color, 8 bit<br> true color, 8 bit <br> true color, 15 bit <br> true color, 16 bit <br> true color, 24 bit</tt> </blockquote> <p> You can use the <tt>xdpyinfo</tt> command to see if one of these visual are available. NOTE: Linux Users-- if your desired visual is not available, use the Xconfigarator command (Red Hat) or similar command under other versions of linux, to configure your X window visuals.</p> <p>When DS9 is invoked, by default, it will use the default visual. You can find out what the default visual is by using the <tt>xdpyinfo</tt> command. You can also force DS9 to use another visual by command line option. If you specify a visual, and it is not available, DS9 will exit with an error message. </p> <blockquote><tt>$ds9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # default visual, default depth<br> $ds9 -visual pseudo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # pseudo color, default depth <br> $ds9 -visual pseudocolor&nbsp; # pseudo color, default depth <br> $ds9 -visual pseudocolor8 # pseudo color 8 <br> $ds9 -visual true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # true color, default depth <br> $ds9 -visual truecolor&nbsp;&nbsp;&nbsp; # true color, default depth <br> $ds9 -visual truecolor8&nbsp;&nbsp; # true color 8 <br> $ds9 -visual truecolor16&nbsp; # true color 16 <br> $ds9 -visual truecolor24&nbsp; # true color 24</tt> </blockquote> </blockquote> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/command.html���������������������������������������������������������������������000644 �000765 �000000 �00000373771 12576612220 016735� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Command Line Options</title> </head> <body alink="#ff0000" vlink="#551a8b" link="#0000ff"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Command Line Options</h3> <blockquote> <p>DS9 will process each command line option, one at a time, as the last step in the initialization process. Therefore, it is possible to use command line options as a little script. For example, the following command line option is used:</p> <tt>$ds9 -tile foo.fits -cmap Heat -zscale bar.fits -cmap I8</tt> <p>First DS9 is put in tile mode, then <tt>foo.fits</tt> is loaded. Then the colormap for <tt>foo.fits</tt> is changed to <tt>Heat</tt> and the scale changed to <tt>zscale</tt>. Next, <tt>bar.fits</tt> is loaded and the colormap for <tt>bar.fits</tt> is changed to <tt>I8.</tt> </p> <tt> <a href="#2mass">2mass</a><br> <a href="#3d">3d</a><br> <a href="#about">about</a><br> <a href="#align">align</a><br> <a href="#analysis">analysis</a><br> <a href="#array">array</a><br> <a href="#asinh">asinh</a><br> <a href="#background">background</a><br> <a href="#backup">backup</a><br> <a href="#bin">bin</a><br> <a href="#blink">blink</a><br> <a href="#block">block</a><br> <a href="#blue">blue</a><br> <a href="#catalog">catalog</a><br> <a href="#cd">cd</a><br> <a href="#cmap">cmap</a><br> <a href="#colorbar">colorbar</a><br> <a href="#console">console</a><br> <a href="#contour">contour</a><br> <a href="#crop">crop</a><br> <a href="#crosshair">crosshair</a><br> <a href="#cube">cube</a><br> <a href="#cursor">cursor</a><br> <a href="#dsssao">dsssao</a><br> <a href="#dsseso">dsseso</a><br> <a href="#dssstsci">dssstsci</a><br> <a href="#envi">envi</a><br> <a href="#exit">exit</a><br> <a href="#export">export</a><br> <a href="#fifo">fifo</a><br> <a href="#fifo_only">fifo_only</a><br> <a href="#fits">fits</a><br> <a href="#frame">frame</a><br> <a href="#geometry">geometry</a><br> <a href="#gif">gif</a><br> <a href="#green">green</a><br> <a href="#geometry">grid</a><br> <a href="#header">header</a><br> <a href="#height">height</a><br> <a href="#help">help</a><br> <a href="#histequ">histequ</a><br> <a href="#iconify">iconify</a><br> <a href="#import">import</a><br> <a href="#inet_only">inet_only</a><br> <a href="#invert">invert</a><br> <a href="#iis">iis</a><br> <a href="#jpeg">jpeg</a><br> <a href="#language">language</a><br> <a href="#linear">linear</a><br> <a href="#lock">lock</a><br> <a href="#log">log</a><br> <a href="#lower">lower</a><br> <a href="#magnifier">magnifier</a><br> <a href="#mask">mask</a><br> <a href="#match">match</a><br> <a href="#mecube">mecube</a><br> <a href="#minmax">minmax</a><br> <a href="#mode">mode</a><br> <a href="#mosaic">mosaic</a><br> <a href="#mosaicimage">mosaicimage</a><br> <a href="#movie">movie</a><br> <a href="#msg">msg</a><br> <a href="#multiframe">multiframe</a><br> <a href="#nameserver">nameserver</a><br> <a href="#nan">nan</a><br> <a href="#nrrd">nrrd</a><br> <a href="#nvss">nvss</a><br> <a href="#orient">orient</a><br> <a href="#pagesetup">pagesetup</a><br> <a href="#pan">pan</a><br> <a href="#pixeltable">pixeltable</a><br> <a href="#plot">plot</a><br> <a href="#png">png</a><br> <a href="#prefs">prefs</a><br> <a href="#preserve">preserve</a><br> <a href="#psprint">psprint</a><br> <a href="#print">print</a><br> <a href="#private">private</a><br> <a href="#port">port</a><br> <a href="#port_only">port_only</a><br> <a href="#pow">pow</a><br> <a href="#exit">quit</a><br> <a href="#raise">raise</a><br> <a href="#regions">regions</a><br> <a href="#red">red</a><br> <a href="#restore">restore</a><br> <a href="#rgb">rgb</a><br> <a href="#rgbarray">rgbarray</a><br> <a href="#rgbcube">rgbcube</a><br> <a href="#rgbimage">rgbimage</a><br> <a href="#rotate">rotate</a><br> <a href="#samp">samp</a><br> <a href="#save">save</a><br> <a href="#saveimage">saveimage</a><br> <a href="#scale">scale</a><br> <a href="#shm">shm</a><br> <a href="#single">single</a><br> <a href="#sinh">sinh</a><br> <a href="#skyview">skyview</a><br> <a href="#sleep">sleep</a><br> <a href="#slice">slice</a><br> <a href="#smooth">smooth</a><br> <a href="#squared">squared</a><br> <a href="#sqrt">sqrt</a><br> <a href="#source">source</a><br> <a href="#tcl">tcl</a><br> <a href="#threads">threads</a><br> <a href="#tiff">tiff</a><br> <a href="#tile">tile</a><br> <a href="#title">title</a><br> <a href="#unix">unix</a><br> <a href="#unix_only">unix_only</a><br> <a href="#update">update</a><br> <a href="#url">url</a><br> <a href="#version">version</a><br> <a href="#view">view</a><br> <a href="#visual">visual</a><br> <a href="#vla">vla</a><br> <a href="#vo">vo</a><br> <a href="#wcs">wcs</a><br> <a href="#web">web</a><br> <a href="#width">width</a><br> <a href="#xpa">xpa</a><br> <a href="#zmax">zmax</a><br> <a href="#zoom">zoom</a><br> <a href="#zscale">zscale</a><br> </tt> <p><b><a name="2mass"></a>2mass </b></p> <p>Support for 2MASS Digital Sky Survey.</p> <tt> Syntax: <br> -2mass []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp; &nbsp; [survey j|h|k] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -2mass<br> $ds9 -2mass m31 <br> $ds9 -2mass name m31 <br> $ds9 -2mass coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -2mass size 60 60 arcmin<br> $ds9 -2mass save yes<br> $ds9 -2mass frame current<br> $ds9 -2mass update frame<br> $ds9 -2mass survey j<br> $ds9 -2mass open<br> $ds9 -2mass close<br> </tt> <p><b><a name="3d"></a>3d </b></p> <p>Support for 3D frame.</p> <tt> Syntax: <br> </tt><tt>-3d []<br> &nbsp;&nbsp;&nbsp; [view &lt;az&gt; &lt;el&gt;]<br> &nbsp;&nbsp;&nbsp; [az &lt;az&gt;]<br> &nbsp;&nbsp;&nbsp; [el &lt;el&gt;]<br> &nbsp;&nbsp;&nbsp; [scale &lt;scale&gt;]<br> &nbsp;&nbsp;&nbsp; [method mip|aip]</tt><br> <tt><tt>&nbsp;&nbsp;&nbsp; [background none|azimuth|elevation]<br> </tt>&nbsp;</tt><tt>&nbsp;&nbsp; [border yes|no]<br> &nbsp;&nbsp;&nbsp; [border color]<br> </tt><tt>&nbsp;&nbsp;&nbsp; [highlite yes|no]<br> &nbsp;&nbsp;&nbsp; [highlite color]<br> </tt><tt>&nbsp;&nbsp;&nbsp; [open|close]<br> </tt><tt>&nbsp; <br> Example:<br> $ds9 -3d # create new 3D frame<br> $ds9 -3d view 45 30<br> $ds9 -3d az 45<br> $ds9 -3d el 30<br> $ds9 -3d scale 10<br> $ds9 -3d method mip</tt><br> <tt>$ds9 -3d background azimuth<br> </tt><tt>$ds9 -3d border yes<br> $ds9 -3d border color red<br> </tt> <tt>$ds9 -3d highlite yes<br> $ds9 -3d highlite color red<br> </tt> <tt>$ds9 -3d open<br> $ds9 -3d close</tt><br> <p><b><a name="about"></a>about</b></p> <p>Get DS9 credits.</p> <tt> Syntax: <br> -about <br> &nbsp;<br> Example: <br> $ds9 -about<br> </tt> <p><b> <a name="align"></a>align</b></p> <p>Controls the World Coordinate System alignment for the current frame.</p> <tt> Syntax: <br> -align [yes|no]<br> &nbsp;<br> Example: <br> $ds9 -align yes <br> </tt> <p><b> <a name="analysis"></a>analysis</b></p> <p>Control external analysis tasks. Tasks are numbered as they are loaded, starting with 0. Can also be used to display a message and display text in the text dialog window. </p> <tt> Syntax: <br> -analysis [&lt;task number&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [task &lt;task number&gt;|&lt;task name&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear][load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [message ok|okcancel|yesno &lt;message&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [entry &lt;message&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [text]</tt><tt><tt><tt><tt><tt><br> </tt></tt> &nbsp; </tt></tt><br> Example:<br> $ds9 -analysis 0 # invoke first analysis task<br> $ds9 -analysis task 0<br> </tt><tt>$ds9 -analysis task foobar<br> </tt><tt>$ds9 -analysis task "{foo bar}"<br> $ds9 -analysis my.ans<br> $ds9 -analysis load my.ans <br> $ds9 -analysis clear <br> $ds9 -analysis clear load my.ans<br> $ds9 -analysis message '{This is a message}'<br> $ds9 -analysis message okcancel '{This is a message}'<br> $ds9 -analysis text '{This is text}'</tt><tt><br> </tt> <p><b> <a name="array"></a>array</b></p> <p>Load raw data array into current frame.<br> </p> <tt> Syntax:<br> -array &lt;filename&gt;[[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],zdim=&lt;z&gt;,bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> $ds9 -array foo.arr[dim=512,bitpix=-32,endian=little]</tt><br> <tt>$cat foo.arr | ds9 -array -[dim=512,bitpix=-32,endian=little]</tt><tt><br> </tt> <p><b> <a name="asinh"></a></b><b>asinh</b> </p> <p>Select ASINH scale function for the current frame.</p> <tt> Syntax:<br> -asinh <br> &nbsp;<br> Example: <br> $ds9 -asinh</tt><br> <p><b><a name="background"></a>bg<br> background</b></p> <p>Set image background color. </p> <tt> Syntax: <br> -bg &lt;color&gt;<br> &nbsp;<br> Example:<br> $ds9 -background red<br> $ds9 -bg red</tt><br> <p><b> <a name="backup"></a>backup</b></p> <p>Create a backup save set. </p> <tt> Syntax: <br> -backup &lt;filename&gt;<br> &nbsp;<br> Example:<br> $ds9 -backup ds9.bck</tt><br> <p><b> <a name="bin"></a>bin</b></p> <p>Controls binning factor, binning buffer size, and&nbsp; binning function for binning FITS bin tables. </p> <tt> Syntax: <br> -bin [about &lt;x&gt; &lt;y&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [about center]<br> &nbsp;&nbsp;&nbsp;&nbsp; [buffersize &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [cols &lt;x&gt; &lt;y&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [colsz &lt;x&gt; &lt;y&gt; &lt;z&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [factor &lt;value&gt; [&lt;value&gt;]] <br> &nbsp;&nbsp;&nbsp;&nbsp; [depth &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [filter &lt;string&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [function average|sum] <br> &nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -bin about 4096 4096<br> $ds9 -bin about center<br> $ds9 -bin buffersize 512<br> $ds9 -bin cols detx dety<br> $ds9 -bin colsz detx dety time<br> $ds9 -bin factor 4<br> $ds9 -bin factor 4 2<br> $ds9 -bin depth 10<br> $ds9 -bin filter '{pha &gt; 5}'<br> $ds9 -bin filter ''<br> $ds9 -bin function sum<br> </tt><tt><tt>$ds9 -bin in<br> $ds9 -bin out<br> </tt>$ds9 -bin to fit<br> $ds9 -bin match<br> $ds9 -bin lock yes<br> $ds9 -bin open<br> $ds9 -bin close<br> </tt> <p><b> <a name="blink"></a>blink</b></p> <p>Blink mode parameters. Interval is in seconds.</p> <tt> Syntax: <br> -blink []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;]<br> &nbsp;<br> Example: <br> $ds9 -blink<br> $ds9 -blink yes<br> $ds9 -blink interval 1</tt><br> <p><b> <a name="block"></a>block</b></p> <p>Controls blocking parameters. </p> <tt> Syntax: <br> -block</tt><tt><tt> [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [out]<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> </tt><tt>$ds9 </tt><tt><tt><tt>-block</tt></tt> 4<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> 4 2<br> </tt><tt><tt><tt>$ds9 </tt><tt><tt><tt>-block</tt></tt> to 4<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> to 4 2<br> </tt>$ds9 </tt><tt><tt><tt>-block</tt></tt> in<br> </tt></tt><tt><tt><tt>$ds9 </tt><tt><tt><tt>-block</tt></tt> out<br> </tt></tt>$ds9 </tt><tt><tt><tt>-block</tt></tt> to fit<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> match<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> lock yes<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> open<br> $ds9 </tt><tt><tt><tt>-block</tt></tt> close</tt><tt><br> </tt> <b> </b> <p><b> <a name="blue"></a>blue</b></p> <p>For RGB frames, sets the current color channel to blue.</p> <tt> Syntax: <br> -blue<br> &nbsp;<br> Example: <br> $ds9 -blue foo.fits<br> </tt> <p><b> <a name="catalog"></a>catalog<br> cat</b></p> <p>Support for catalogs.</p> <tt> Syntax: <br> </tt><tt>-catalog []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ned|simbad|denis|skybot]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ascss|cmc|gsc1|gsc2|gsc3|ac|nomad|ppmx|sao|sdss5|sdss6|</tt><tt>sdss7|sdss8|</tt><tt>tycho|ua2|ub1|ucac2]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [2mass|iras]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [csc|xmm|rosat]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [first|nvss]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [chandralog|cfhtlog|esolog|stlog|xmmlog]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [cds &lt;catalogname&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cds &lt;catalogid&gt;]<br> <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [import sb|tsv &lt;filename&gt;]<br> <br> </tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [allcols]<br> </tt><tt>&nbsp;</tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [allrows]<br> &nbsp;</tt><tt>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [cancel]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [clear]<br> </tt><tt>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [close]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [coordinate &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [crosshair]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [dec &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [edit yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [export sb|tsv &lt;filename&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [header]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [hide]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [location &lt;code&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [match &lt;ref&gt; &lt;ref&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match error &lt;value&gt; degrees|arcmin|arcsec]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match function 1and2|1not2|2not1]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match return 1and2|1only|2only]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match unique yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [maxrows &lt;number&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [name &lt;object&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [panto yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [plot &lt;xcol&gt; &lt;ycol&gt; &lt;xerrcol&gt; &lt;yerrcol&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [print]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psky &lt;skyframe&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psystem &lt;coordsys&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [ra &lt;col&gt;]</tt><br> <tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [regions]</tt><br> <tt> </tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [retrieve]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp broadcast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp send &lt;application&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [save &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [server cds|sao|cadc|adac|iucaa|bejing|cambridge|ukirt]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [show]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sky &lt;skyframe&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [skyformat &lt;skyformat&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sort &lt;col&gt; incr|decr]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] condition|shape|color|text|font|fontsize|fontweight|fontslant &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] text|size|size2|units|angle &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol shape {circle point}|{box point}|{diamond point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {cross point}|{x point}|{arrow point}|{boxcircle point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; circle|ellipse|box|text]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol add| [#] remove]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol save|load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [system &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [update]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [x &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [y &lt;col&gt;]</tt><br> <tt><br> Example:<br> </tt><tt>$ds9 -catalog<br> $ds9 -catalog 2mass<br> $ds9 -catalog cds 2mass<br> $ds9 -catalog cds "I/252"<br> <br> </tt><tt>$ds9 -catalog load foo.xml<br> $ds9 -catalog import tsv foo.tsv<br> <br> </tt><tt>$ds9 -catalog allrows<br> $ds9 -catalog allcols<br> </tt><tt>$ds9 -catalog cancel<br> </tt><tt>$ds9 -catalog clear<br> </tt><tt>$ds9 -catalog close<br> </tt><tt>$ds9 -catalog coordinate 202.48 47.21 fk5<br> </tt><tt>$ds9 -catalog crosshair<br> </tt><tt>$ds9 -catalog dec DEC<br> </tt><tt>$ds9 -catalog edit yes<br> </tt><tt>$ds9 -catalog export tsv bar.tsv<br> </tt><tt>$ds9 -catalog filter </tt><tt>'\$Jmag&gt;15'</tt><tt><br> $ds9 -catalog filter load foo.flt<br> $ds9 -catalog header<br> </tt><tt>$ds9 -catalog hide<br> </tt><tt>$ds9 -catalog location 500</tt><br> <tt>$ds9 -catalog match error 2 arcsec<br> $ds9 -catalog match function 1and2<br> $ds9 -catalog match unique no<br> $ds9 -catalog match return 1only<br> $ds9 -catalog match 2mass csc<br> </tt><tt>$ds9 -catalog maxrows 2000<br> </tt><tt>$ds9 -catalog name m51<br> $ds9 -catalog panto no<br> </tt><tt>$ds9 -catalog plot </tt><tt>'\$Jmag' '\$Hmag' '\$e_Jmag' '\$e_Hmag'</tt><tt><br> </tt><tt>$ds9 -catalog print</tt><br> <tt>$ds9 -catalog psky fk5</tt><br> <tt>$ds9 -catalog psystem wcs</tt><br> <tt>$ds9 -catalog ra RA</tt><br> <tt><tt>$ds9 -catalog regions<br> </tt><tt> </tt>$ds9 -catalog retrieve<br> </tt><tt> $ds9 -catalog samp broadcast<br> $ds9 -catalog samp send aladin<br> $ds9 -catalog save foo.xml<br> </tt><tt>$ds9 -catalog server sao<br> </tt><tt>$ds9 -catalog show</tt><br> <tt> $ds9 -catalog size 1 1 degrees</tt><br> <tt>$ds9 -catalog symbol condition '\$Jmag&gt;15'<br> $ds9 -catalog symbol 2 shape "boxcircle point"<br> $ds9 -catalog symbol color red<br> $ds9 -catalog symbol font times<br> </tt><tt>$ds9 -catalog symbol fontsize 14<br> </tt><tt>$ds9 -catalog symbol fontweight bold<br> </tt><tt>$ds9 -catalog symbol fontslant italic<br> </tt><tt>$ds9 -catalog symbol add<br> $ds9 -catalog symbol 2 remove<br> $ds9 -catalog symbol load foo.sym<br> $ds9 -catalog symbol save bar.sym</tt><tt><br> $ds9 -catalog sky fk5<br> $ds9 -catalog skyformat degrees<br> </tt><tt>$ds9 -catalog sort "Jmag" incr<br> </tt><tt>$ds9 -catalog system wcs</tt><tt><br> </tt><tt>$ds9 -catalog update<br> </tt><tt>$ds9 -catalog x RA<br> $ds9 -catalog y DEC</tt><br> <p><b><a name="cd"></a>cd</b></p> <p>Sets the current working directory. </p> <tt> Syntax: <br> cd [&lt;directory&gt;] <br> &nbsp;<br> Example: <br> $ds9 -cd /home/mrbill<br> </tt> <p><b> <a name="cmap"></a>cmap</b></p> <p>Controls the colormap for the current frame. The colormap name is not case sensitive. A valid contrast value is&nbsp; from 0 to 10 and bias value from 0 to 1. </p> <tt> Syntax: <br> -cmap [&lt;colormap&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [file]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [invert yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [value &lt;contrast&gt; &lt;bias&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tag [load|save] &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tag delete]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -cmap Heat <br> $ds9 -cmap load foo.sao <br> $ds9 -cmap save bar.sao<br> $ds9 -cmap invert yes <br> $ds9 -cmap value 5 .5<br> $ds9 -cmap tag load foo.tag<br> $ds9 -cmap tag save foo.tag<br> $ds9 -cmap tag delete<br> </tt><tt>$ds9 -cmap match<br> $ds9 -cmap lock yes</tt><br> <tt> $ds9 -cmap open<br> $ds9 -cmap close<br> </tt> <p><b><a name="colorbar"></a>colorbar</b></p> <p>Controls colorbar parameters.</p> <tt> Syntax: <br> -colorbar []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [horizontal|vertical]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [orientation horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [space value|distance]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [ticks]<br> &nbsp;<br> Example: <br> $ds9 -colorbar yes<br> $ds9 -colorbar vertical<br> $ds9 -colorbar orientation vertical<br> $ds9 -colorbar numerics yes<br> $ds9 -colorbar space value<br> $ds9 -colorbar font times<br> $ds9 -colorbar fontsize 14<br> $ds9 -colorbar fontweight bold<br> $ds9 -colorbar fontslant italic<br> $ds9 -colorbar size 20<br> $ds9 -colorbar ticks 11<br> </tt> <p><b> <a name="console"></a>console</b></p> <p>Display tcl console window.</p> <tt> Syntax: <br> -console<br> &nbsp;<br> Example:<br> $ds9 -console<br> </tt> <p><b> <a name="contour"></a>contour<br> </b></p> <p>Controls contours in the current frame. </p> <tt> Syntax: <br> -contour []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [generate]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [convert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [loadlevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [savelevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [paste &lt;coordsys&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [dash yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [smooth &lt;smooth&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [method block|smooth]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [nlevels &lt;number of levels&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale linear|log|pow|squared|sqrt|asinh|sinh|histequ]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [log exp &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [limits &lt;min&gt; &lt;max&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [levels &lt;value value value...&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -contour<br> $ds9 -contour yes<br> $ds9 -contour generate<br> $ds9 -contour clear<br> $ds9 -contour load ds9.con wcs fk5 yellow 2 no<br> $ds9 -contour load ds9.con wcs fk5 red 2 yes<br> $ds9 -contour save ds9.con wcs fk5<br> $ds9 -contour convert<br> $ds9 -contour loadlevels ds9.lev<br> $ds9 -contour savelevels ds9.lev<br> $ds9 -contour copy<br> $ds9 -contour paste wcs red 2 no<br> $ds9 -contour color yellow<br> $ds9 -contour width 2<br> $ds9 -contour dash yes<br> $ds9 -contour smooth 5<br> $ds9 -contour method smooth<br> $ds9 -contour nlevels 10<br> $ds9 -contour scale sqrt<br> $ds9 -contour log exp 1000<br> $ds9 -contour mode zscale<br> $ds9 -contour limits 1 100<br> $ds9 -contour levels "1 10 100 1000"<br> $ds9 -contour open<br> $ds9 -contour close<br> </tt> <p><b><a name="crop"></a>crop</b> </p> <p>Set current image display area. </p> <tt> Syntax: <br> -crop [&lt;x&gt; &lt;y&gt; &lt;width&gt; &lt;height&gt; [&lt;coordsys&gt;][&lt;skyframe&gt;][&lt;skyformat&gt;][degrees|arcmin|arcsec]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><tt> <br> &nbsp;<br> Example: <br> $ds9 foo.fits -crop 40 30 10 20 # set crop in physical coords<br> $ds9 foo.fits -crop +104:51:06.915 +68:33:40.761&nbsp; 28.144405 22.000204 wcs galactic arcsec<br> $ds9 foo.fits -crop match wcs<br> $ds9 foo.fits -crop lock wcs<br> </tt> <p><b> <a name="crosshair"></a>crosshair</b></p> <p>Controls the current position of the crosshair in the current frame. DS9 is placed in crosshair mode when the crosshair is set. </p> <tt> Syntax: <br> -crosshair [&lt;x&gt; &lt;h&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;]]<br> &nbsp;</tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;<br> Example: <br> $ds9 -crosshair 100 100 physical # set crosshair in physical <br> $ds9 -crosshair 345 58.8 wcs fk5 # set crosshair in wcs coords <br> $ds9 -crosshair 23:01:00 +58:52:51 wcs fk5<br> $ds9 -crosshair match<br> $ds9 -crosshair lock wcs<br> </tt> <p><b><a name="cube"></a>cube<br> </b></p> <p>Controls FITS cube. </p> <tt> Syntax: <br> -cube [play|stop|next|prev|first|last]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;slice&gt; [&lt;coordsys&gt;][&lt;axis&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;numeric&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp; [axis &lt;axis&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [order 123|132|213|231|312|321]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes lock [yes|no]]<br> </tt> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -cube play<br> $ds9 -cube last<br> $ds9 -cube 3<br> $ds9 -cube 4.5 wcs 3<br> $ds9 -cube interval 2<br> $ds9 -cube axis 3<br> $ds9 -cube match wcs<br> $ds9 -cube lock wcs<br> $ds9 -cube order 123<br> $ds9 -cube axes lock yes<br> $ds9 -cube open<br> $ds9 -cube close</tt><br> <p><b> <a name="cursor"></a>cursor</b></p> <p>Move mouse pointer or crosshair in image pixels in the current frame. Note, this will move selected Regions also. </p> <tt> Syntax: <br> -cursor [&lt;x&gt; &lt;h&gt;] <br> &nbsp;<br> Example: <br> $ds9 -cursor 10 10</tt><tt><br> </tt> <p><b><a name="dsssao"></a>dsssao<br> dss<br> </b></p> <p>Support for Digital Sky Survey at SAO.</p> <tt> Syntax: <br> -dsssao []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -dsssao <br> $ds9 -dsssao m31 <br> $ds9 -dsssao name m31 <br> $ds9 -dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -dsssao size 60 60 arcmin<br> $ds9 -dsssao save yes<br> $ds9 -dsssao frame current<br> $ds9 -dsssao update frame<br> $ds9 -dsssao open<br> $ds9 -dsssao close<br> </tt> <p><b><a name="dsseso"></a>dsseso </b></p> <p>Support for Digital Sky Survey at ESO.</p> <tt> Syntax:<br> -dsseso []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [survey DSS1|DSS2-red|DSS2-blue|DSS2-infrared]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -dsseso <br> $ds9 -dsseso m31 <br> $ds9 -dsseso name m31 <br> $ds9 -dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -dsseso size 60 60 arcmin<br> $ds9 -dsseso save yes<br> $ds9 -dsseso frame current<br> $ds9 -dsseso update frame <br> $ds9 -dsseso survey DSS2-red<br> $ds9 -dsseso open<br> </tt><tt>$ds9 -dsseso close</tt><br> <p><b><a name="dssstsci"></a>dssstsci </b></p> <p>Support for Digital Sky Survey at STSCI.</p> <tt> Syntax:<br> -dssstsci []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss2ukstu_red|poss2ukstu_ir|poss2ukstu_blue] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss1_blue|poss1_red]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey all|quickv|phase2_gsc2|phase2_gsc1]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -dssstsci <br> $ds9 -dssstsci m31 <br> $ds9 -dssstsci name m31 <br> $ds9 -dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -dssstsci size 60 60 arcmin<br> $ds9 -dssstsci save yes<br> $ds9 -dssstsci frame current<br> $ds9 -dssstsci update frame <br> $ds9 -dssstsci survey all<br> $ds9 -dssstsci open<br> $ds9 -dssstsci close</tt><br> <p><b> <a name="envi"></a>envi</b></p> <p>Load an ENVI header and file. Optional parameter: array endian.<br> </p> <tt> Syntax: <br> -envi &lt;header&gt; [&lt;filename&gt;]<br> &nbsp;<br> Example:<br> </tt><tt><tt><tt><tt>$ds9 -envi foo.hdr</tt></tt><tt><tt><tt><tt><tt><tt><br> </tt></tt></tt></tt></tt></tt> <b> </b>$ds9 -envi foo.hdr foo.bsq</tt></tt><tt><tt><tt><tt><tt><tt><br> </tt></tt></tt></tt></tt></tt> <p><b> <a name="exit"></a>exit<br> quit</b></p> <p>Quits DS9. </p> <tt> Syntax: <br> -exit <br> -quit <br> &nbsp;<br> Example: <br> $ds9 -exit<br> </tt> <p><b> <a name="export"></a>export<br> </b></p> <p>Export loaded image data of current frame in specified image format, at native resolution, using current colormap and contrast/bias settings. NOTE: not scaling, rotation, or translation is applied. If no format specified, the file name extension is used to determine the output format. Optional parameters: jpeg quality (1-100) and tiff compression method.<br> </p> <tt> Syntax: <br> -export [array|nrrd|envi|gif|tiff|jpeg|png] &lt;filename&gt;</tt><tt><br> </tt><tt><tt>-export array &lt;filename&gt;</tt><tt> </tt><tt>[big|little</tt><tt>|native]<br> </tt>-export nrrd &lt;filename&gt; </tt><tt>[big|little</tt><tt>|native]</tt><br> <tt>-export envi &lt;header&gt; [&lt;filename&gt;] </tt><tt>[big|little</tt><tt>|native]</tt><tt> </tt><tt><br> </tt><tt>-export &lt;filename&gt;</tt><tt>.jpeg [1-100]<br> </tt><tt>-export &lt;filename&gt;</tt><tt>.tiff [none|jpeg|packbits|deflate]</tt><br> <tt> &nbsp;<br> Example:<br> $ds9 -export array foo.arr little<br> $ds9 -export nrrd foo.nrrd little<br> $ds9 -export envi foo.hdr little<br> </tt><tt><tt>$ds9 -export envi foo.hdr foo.bsq little<br> </tt>$ds9 -export tiff foo.tiff jpeg<br> $ds9 -export jpeg foo.jpeg 75<br> $ds9 -export png foo.png</tt><br> <p><b><a name="fifo"></a>fifo</b></p> <p>Set the name of the IRAF input and output fifos. The default is /dev/imt1. These fifos are used by IRAF to communicate with DS9. </p> <tt> Syntax: <br> -fifo name <br> &nbsp;<br> Example: <br> $ds9 -fifo /dev/imt1 </tt> <p><b> <a name="fifo_only"></a>fifo_only</b></p> <p>Only use IRAF input and output fifos. Same as -port 0 -unix none. </p> <tt> Syntax: <br> -fifo_only <br> &nbsp;<br> Example: <br> $ds9 -fifo_only<br> </tt> <p><b> <a name="fits"></a>fits</b></p> <p>Load a FITS image into the current frame.<br> </p> <tt> Syntax: <br> -fits </tt><tt><tt>&lt;filename&gt;</tt></tt><tt><br> &nbsp;<br> Example: <br> </tt><tt>$ds9 -fits foo.fits<br> $ds9 -fits bar.fits[bin=detx,dety]<br> $cat foo.fits | ds9 -fits -<br> $cat bar.fits | ds9 -fits -[bin=detx,dety]</tt><tt><br> </tt> <p><b><a name="frame"></a>frame</b></p> <p>Controls frame functions. Frames may be created, deleted, reset, and centered. While return the current frame number. If you goto a frame that does not exists, it will be created. If the frame is hidden, it will be shown. The 'frameno' option is available for backward compatibility. </p> <tt> Syntax: <br> -frame [center [#|all]]<br> &nbsp; &nbsp; &nbsp;&nbsp; [clear [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp; [new [rgb]]<br> &nbsp; &nbsp; &nbsp; &nbsp;[delete [#|all]] <br> &nbsp; &nbsp; &nbsp; &nbsp;[reset [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[refresh [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;[hide [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[show [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move first]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move forward]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move last]<br> &nbsp; &nbsp; &nbsp; &nbsp;[first]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[prev]<br> &nbsp; &nbsp; &nbsp; &nbsp;[next]<br> &nbsp; &nbsp; &nbsp; &nbsp;[last]<br> &nbsp; &nbsp; &nbsp; &nbsp;[frameno #]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[#]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;<br> Example: <br> $ds9 -frame center # center current frame<br> $ds9 -frame center 1 # center 'Frame1' <br> $ds9 -frame center all # center all frames <br> $ds9 -frame clear # clear current frame<br> $ds9 -frame new # create new frame <br> $ds9 -frame new rgb # create new rgb frame<br> $ds9 -frame delete # delete current frame <br> $ds9 -frame reset # reset current frame <br> $ds9 -frame refresh # refresh current frame <br> $ds9 -frame hide # hide current frame <br> $ds9 -frame show 1 # show frame 'Frame1'<br> $ds9 -frame move first # move frame to first in order<br> $ds9 -frame move back # move frame back in order<br> $ds9 -frame move forward # move frame forward in order<br> $ds9 -frame move last # move frame to last in order<br> $ds9 -frame first # goto first frame <br> $ds9 -frame prev # goto prev frame <br> $ds9 -frame next # goto next frame<br> $ds9 -frame last # goto last frame<br> $ds9 -frame frameno 4 # goto frame 'Frame4', create if needed<br> $ds9 -frame 3 # goto frame 'Frame3', create if needed<br> $ds9 -frame lock wcs</tt><br> <p><b> <a name="gif"></a>gif</b></p> <p>Import gif file. </p> <tt> Syntax: <br> -gif &lt;filename&gt;<br> &nbsp;<br> Example: <br> $ds9 -gif foo.gif<br> $cat foo.gif | ds9 -gif -<br> </tt> <p><b> <a name="geometry"></a>geometry</b></p> <p>Define the initial window geometry. This includes all of the ds9 window, not just the image space. see X(1). </p> <tt> Syntax: <br> -geometry value <br> &nbsp;<br> Example: <br> $ds9 -geometry 640x480 </tt> <p><b> <a name="green"></a>green</b></p> <p>For RGB frames, sets the current color channel to green.</p> <tt> Syntax: <br> -green<br> &nbsp;<br> Example: <br> $ds9 -green foo.fits </tt> <p><b> <a name="grid"></a>grid</b></p> <p>Controls coordinate grid. For grid numeric format syntax,&nbsp; click <a href="grid.html#Format">here</a>.</p> <tt> Syntax: <br> -grid []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [type analysis|publication] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sky &lt;skyframe&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat &lt;skyformat&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes type interior|exterior]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes origin lll|llu|lul|luu|ull|ulu|uul|uuu]</tt><br> <tt> &nbsp;&nbsp;&nbsp; &nbsp; [format1 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format2 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics type interior|exterior]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics vertical yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title text &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title def yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title gap &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontweight normal|bold]<br> &nbsp; &nbsp;&nbsp;&nbsp; [title fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text1 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def1 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text2 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def2 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [reset]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -grid <br> $ds9 -grid yes<br> $ds9 -grid type analysis <br> $ds9 -grid system wcs <br> $ds9 -grid sky fk5 <br> $ds9 -grid skyformat degrees<br> $ds9 -grid grid yes<br> $ds9 -grid grid color red<br> $ds9 -grid grid width 2<br> $ds9 -grid grid style 1<br> $ds9 -grid grid gap1 10<br> $ds9 -grid grid gap2 10<br> $ds9 -grid axes yes<br> $ds9 -grid axes color red<br> $ds9 -grid axes width 2<br> $ds9 -grid axes style 1<br> $ds9 -grid axes type exterior<br> $ds9 -grid axes origin lll<br> $ds9 -grid format1 d.2<br> $ds9 -grid format2 d.2<br> $ds9 -grid tickmarks yes<br> $ds9 -grid tickmarks color red<br> $ds9 -grid tickmarks width 2<br> $ds9 -grid tickmarks style 1<br> $ds9 -grid border yes<br> $ds9 -grid border color red<br> $ds9 -grid border width 2<br> $ds9 -grid border style 1<br> $ds9 -grid numerics yes<br> $ds9 -grid numerics font courier<br> $ds9 -grid numerics fontsize 12<br> $ds9 -grid numerics fontweight bold<br> $ds9 -grid numerics fontslant italic<br> $ds9 -grid numerics color red<br> $ds9 -grid numerics gap1 10<br> $ds9 -grid numerics gap2 10<br> $ds9 -grid numerics type exterior<br> $ds9 -grid numerics vertical yes<br> $ds9 -grid title yes<br> $ds9 -grid title text {Hello World}<br> $ds9 -grid title def yes<br> $ds9 -grid title gap 10<br> $ds9 -grid title font courier<br> $ds9 -grid title fontsize 12<br> $ds9 -grid title fontweight bold<br> $ds9 -grid title fontslant italic<br> $ds9 -grid title color red<br> $ds9 -grid labels yes<br> $ds9 -grid labels text1 {Hello World}<br> $ds9 -grid labels def1 yes<br> $ds9 -grid labels gap1 10<br> $ds9 -grid labels text2 {Hello World}<br> $ds9 -grid labels def2 yes<br> $ds9 -grid labels gap2 10<br> $ds9 -grid labels font courier<br> $ds9 -grid labels fontsize 12<br> $ds9 -grid labels fontweight bold<br> $ds9 -grid labels fontslant italic<br> $ds9 -grid labels color red<br> $ds9 -grid reset<br> $ds9 -grid load foo.grd <br> $ds9 -grid save foo.grd <br> $ds9 -grid open<br> $ds9 -grid close<br> </tt> <p><b> <a name="header"></a>header</b></p> <p>Display current fits header dialog. Optional extension number maybe specified.</p> <tt> Syntax: <br> -header [&lt;ext&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [close [&lt;ext&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save [&lt;ext&gt;] &lt;filename&gt;]<br> &nbsp;<br> Example:<br> $ds9 -header <br> $ds9 -header 2<br> $ds9 -header close<br> $ds9 -header save 1 foo.txt<br> </tt> <p><b> <a name="height"></a>height</b></p> <p>Set the height of the image display window. Use the <a href="command.html#geometry">geometry</a> command to set the overall width and height of the ds9 window.</p> <tt> Syntax: <br> -height [&lt;value&gt;]<br> &nbsp;<br> Example: <br> $ds9 -height 512<br> </tt> <p><b> <a name="help"></a>help</b></p> <p>Display help information. To maintain backward compatibility, -help will display a brief help message and exit. --help will display all command line options within the built-in help facility.</p> <tt> Syntax: <br> -help # Display brief help message and exit.<br> --help # Display command line options within help facility.<br> -? # Display command line options within help facility.<br> &nbsp;<br> Example: <br> $ds9 -help # Display brief help message and exit.<br> $ds9 --help # Display command line options within help facility<br> $ds9 -? # Display command line options within help facility.<br> </tt> <p><b> <a name="histequ"></a>histequ</b></p> <p>Select histogram equalization scale function for the current frame. </p> <tt> Syntax: <br> -histequ<br> &nbsp;<br> Example: <br> $ds9 -histequ<br> </tt> <p><b> <a name="iconify"></a>iconify</b></p> <p>Toggles iconification. </p> <tt> Syntax: <br> -iconify []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;<br> Example: <br> $ds9 -iconify<br> $ds9 -iconify yes</tt><br> <p><b> <a name="invert"></a>invert</b></p> <p>Invert Colormap. </p> <tt> Syntax: <br> -invert <br> &nbsp;<br> Example: <br> $ds9 -invert<br> </tt> <p><b><a name="iis"></a>iis</b></p> <p>Set IIS Filename. Optional mosaic number maybe supplied.</p> <tt> Syntax: <br> -iis [filename &lt;filename&gt; [#]]<br> &nbsp;<br> Example: <br> $ds9 -iis filename foo.fits<br> $ds9 -iis filename bar.fits 4</tt><br> <p><b> <a name="jpeg"></a>jpeg</b></p> <p>Load JPEG image into current frame.</p> <tt> Syntax:<br> -jpeg &lt;filename&gt;<br> &nbsp;<br> Example: <br> </tt><tt>$ds9 -jpeg foo.jpeg</tt><br> <tt>$cat foo.jpeg | ds9 -jpeg -</tt><br> <p><b> <a name="language"></a>language</b></p> <p>Select current language. </p> <tt> Syntax: <br> -language [locale|da|de|es|en|fr|ja|pt]<br> &nbsp;<br> Example: <br> $ds9 -language fr<br> </tt> <p><b> <a name="linear"></a>linear</b></p> <p>Select linear scale function for the current frame. </p> <tt> Syntax: <br> -linear <br> &nbsp;<br> Example: <br> $ds9 -linear </tt> <p><b> <a name="lock"></a>lock</b></p> <p>Lock all other frames to the current frame. </p> <tt> Syntax: <br> </tt><tt>-lock</tt><tt> </tt><tt>[frame &lt;coordsys&gt;|none]<br> &nbsp;&nbsp; &nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;|none] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; [crop &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;&nbsp;&nbsp; &nbsp; [slice &lt;coordsys&gt;|none]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; [bin [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [scale [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [scalelimits [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [colorbar [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [block [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [smooth [yes|no]]</tt><br> <tt><br> </tt><tt> </tt><tt>Example: </tt><tt><br> $ds9 -lock frame wcs</tt><tt><br> </tt><tt>$ds9 -lock crosshair wcs</tt><tt><br> </tt><tt>$ds9 -lock crop wcs</tt><br> <tt>$ds9 -lock slice wcs</tt><br> <tt>$ds9 -lock bin yes<br> $ds9 -lock axes yes<br> </tt><tt>$ds9 -lock scale yes<br> $ds9 -lock scalelimits yes<br> </tt><tt>$ds9 -lock colorbar yes</tt><tt><br> $ds9 -lock block yes<br> $ds9 -lock smooth yes<br> </tt> <p><b> <a name="log"></a>log</b></p> <p>Select log scale function for the current frame. <br> </p> <tt> Syntax: <br> -log <br> &nbsp;<br> Example: <br> $ds9 -log </tt> <p><b> <a name="lower"></a>lower</b></p> <p>Lower in the window stacking order. </p> <tt> Syntax: <br> -lower <br> &nbsp;<br> Example: <br> $ds9 -lower<br> </tt> <p><b> <a name="magnifier"></a>magnifier</b></p> <p>Controls the magnifier settings. </p> <tt> Syntax: <br> magnifier [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [zoom &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cursor yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [region yes|no]<br> &nbsp;<br> Example: <br> $ds9 -magnifier color yellow<br> $ds9 -magnifier zoom 2<br> $ds9 -magnifier cursor no<br> $ds9 -magnifier region no<br> </tt> <p><b> <a name="mask"></a>mask<br> nomask<br> </b></p> <p>Controls mask parameters. </p> <tt> Syntax: <br> -mask [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mark 1|0]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [transparency &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> -nomask<br> &nbsp;<br> Example: <br> $ds9 -mask color red<br> $ds9 -mask mark 0<br> $ds9 -mask transparency 50<br> $ds9 -mask clear<br> $ds9 -mask open<br> $ds9 -mask close<br> $ds9 -nomask<br> </tt> <p><b> <a name="match"></a>match</b></p> <p>Match all other frames to the current frame. </p> <tt> Syntax: <br> </tt><tt>-match </tt><tt>[frame &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crop &lt;coordsys&gt;]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [slice &lt;coordsys&gt;]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [bin]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [scalelimits]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [block]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [smooth]<br> </tt><tt>&nbsp;<br> Example: <br> </tt><tt>$ds9 -match frame wcs <br> </tt><tt>$ds9 -match crosshair wcs<br> </tt><tt>$ds9 -match crop wcs</tt><br> <tt> $ds9 -match slice wcs</tt> <br> <tt>$ds9 -match bin<br> $ds9 -match axes<br> $ds9 -match scale<br> $ds9 -match scalelimits<br> $ds9 -match colorbar<br> $ds9 -match block<br> $ds9 -match smooth<br> <br> </tt><b><a name="mecube"></a>mecube</b> <p>Load FITS multiple extension file as data cube.<br> </p> <tt> Syntax:<br> mecube &lt;filename&gt;<br> &nbsp;<br> Example: <br> $ds9 -mecube foo.fits</tt><tt><tt><br> </tt>$cat foo.fits | ds9 -mecube -</tt><br> <p><b> <a name="minmax"></a>minmax</b></p> <p>This is how DS9 determines&nbsp; the min and max data values from the data. <tt>SCAN</tt> will scan all data. <tt>SAMPLE</tt> will sample the data every n samples. <tt>DATAMIN</tt> and <tt>IRAFMIN</tt> will use the values of the keywords if present. In general, it is recommended to use <tt>SCAN</tt> unless your computer is slow or your data files are very large. Select the increment&nbsp; interval for determining the min and max data values during sampling. The larger the interval, the quicker the process. </p> <tt> Syntax: <br> -minmax [scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;] <br> &nbsp;<br> Example: <br> $ds9 -minmax scan <br> $ds9 -minmax mode scan<br> $ds9 -minmax interval 10 </tt> <p><b> <a name="mode"></a>mode</b></p> <p>Select the current mode. </p> <tt> Syntax: <br> -mode [none|region|crosshair|colorbar|pan|zoom|rotate|catalog|examine] <br> &nbsp;<br> Example: <br> $ds9 -mode crosshair</tt><br> <p><b> <a name="mosaic"></a>mosaic</b></p> <p>Load FITS mosaic segment into current frame.</p> <tt> Syntax:<br> -mosaic [wcs|wcsa...wcsz|iraf] &lt;filename&gt;<br> &nbsp;<br> Example: </tt><tt><br> $ds9 -mosaic foo.fits</tt><br> <tt><tt>$ds9 -mosaic wcs foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>$cat foo.fits | ds9 -mosaic -</tt> <br> <tt><tt>$cat foo.fits | ds9 -mosaic wcs -</tt></tt><tt><br> </tt> <p><b> <a name="mosaicimage"></a>mosaicimage</b></p> <p>Load FITS mosaic image into current frame.</p> <tt> Syntax:<br> -mosaicimage [wcs|wcsa...wcsz|iraf|wfpc2] &lt;filename&gt;<br> &nbsp;<br> Example: </tt><tt><br> $ds9 -mosaicimage foo.fits</tt><br> <tt><tt>$ds9 -mosaicimage wcs foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>$cat foo.fits | ds9 -mosaicimage</tt><br> <tt><tt>$cat foo.fits | ds9 -mosaiimage wcs</tt></tt><tt><br> </tt> <p><b><a name="movie"></a>movie<br> savempeg<br> </b></p> <p>Create mpeg1 movie from snap shots of the DS9 window. A <tt>slice</tt> movie cycles though all slices of a cube. A <tt>frame</tt> movie cycles through all active frames. A <tt>3d</tt> movie cycles through specified viewing angles. The default is <tt>frame</tt>. Optional parameters for <tt>3d</tt>: number of frames, azimuth from/to, elevation from/to, slice from/to, oscillate/repeat times.<br> </p> <tt> Syntax:<br> -movie [slice|frame|3d] &lt;filename&gt;<br> -movie 3d &lt;filename&gt; [number|azfrom|azto|elfrom|elto|slfrom|slto|oscillate|repeat &lt;#&gt;]<br> &nbsp;<br> Example:<br> $ds9 -movie slice ds9.mpg<br> $ds9 -movie 3d ds9.mpg number 10 azfrom -60 azto 60 oscillate 1</tt><br> <p><b> <a name="msg"></a>msg</b></p> <p>Specify a directory of translation tables to be loaded.</p> <tt> Syntax: <br> -msg &lt;directory&gt;<br> &nbsp;<br> Example: <br> $ds9 -msg $HOME/msgs</tt><br> <p><b> <a name="multiframe"></a>multiframe</b></p> <p>Load FITS multiple extension file as multiple images.<br> </p> <tt> Syntax:<br> multiframe &lt;filename&gt;<br> &nbsp;<br> Example: <br> $ds9 -multiframe foo.fits</tt><tt><tt><br> </tt>$cat foo.fits | ds9 -multiframe -</tt><tt><br> </tt> <p><b><a name="nameserver"></a>nameserver</b></p> <p>Support Name Server functions. Coordinates are in fk5. </p> <tt> Syntax: <br> -nameserver [&lt;object&gt;]<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [name &lt;object&gt;]<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [server ned-sao|ned-eso|simbad-sao|simbad-eso] <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pan]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -nameserver m31<br> $ds9 -nameserver name m31 <br> $ds9 -nameserver server ned-sao <br> $ds9 -nameserver skyformat sexagesimal<br> $ds9 -nameserver pan<br> $ds9 -nameserver crosshair<br> $ds9 -nameserver open<br> $ds9 -nameserver close<br> </tt> <p><b> <a name="nan"></a>nan</b></p> <p>Set image not-a-number color. </p> <tt> Syntax: <br> -nan &lt;color&gt;<br> &nbsp;<br> Example:<br> $ds9 -nan red</tt><br> <p><b> <a name="nrrd"></a>nrrd</b></p> <p>Load an NRRD (Nearly Raw Raster Data) file.<br> </p> <tt> Syntax: <br> -nrrd &lt;filename&gt;<br> &nbsp;<br> Example:<br> </tt><tt><tt>$ds9 -nrrd foo.nrrd</tt></tt><br> <tt>$cat foo.nrrd | xpaset ds9 -nrrd</tt> - <tt><br> </tt> <p><b> <a name="nvss"></a>nvss</b></p> <p>Support for NRAO VLA Sky Survey.</p> <tt> Syntax: <br> -nvss []<br> &nbsp;&nbsp;&nbsp; &nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -nvss<br> $ds9 -nvss m31 <br> $ds9 -nvss name m31 <br> $ds9 -nvss coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -nvss size 60 60 arcmin<br> $ds9 -nvss save yes<br> $ds9 -nvss frame current<br> $ds9 -nvss update frame<br> $ds9 -nvss open<br> $ds9 -nvess close<br> </tt> <p><b><a name="orient"></a>orient</b></p> <p>Controls the orientation of the current frame. </p> <tt> Syntax: <br> -orient [none|x|y|xy] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -orient xy<br> $ds9 -orient open<br> $ds9 -orient close<br> </tt> <p><b> <a name="pagesetup"></a>pagesetup</b></p> <p>Controls Page Setup options.<br> </p> <tt> Syntax: <br> -pagesetup [orient portrait|landscape] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale &lt;numberic&gt;]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size letter|legal|tabloid|poster|a4]</tt><br> <tt> &nbsp;<br> Example: <br> $ds9 -pagesetup orient portrait <br> $ds9 -pagesetup scale 50<br> $ds9 -pagesetup size poster</tt><br> <p><b> <a name="pan"></a>pan</b></p> <p>Controls the current image cursor location for the current frame. </p> <tt> Syntax: <br> -pan [&lt;x&gt; &lt;h&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [to &lt;x&gt; &lt;h&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -pan 200 200 image <br> $ds9 -pan to 400 400 physical <br> $ds9 -pan to 13:29:55 47:11:50 wcs fk5<br> $ds9 -pan open<br> $ds9 -pan close</tt><br> <p><b><a name="pixeltable"></a>pixeltable</b></p> <p>Display/Hide the pixel table. </p> <tt> Syntax: <br> -pixeltable []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|open]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [no|close]<br> &nbsp;<br> Example: <br> $ds9 -pixeltable<br> $ds9 -pixeltable yes<br> $ds9 -pixeltable open<br> $ds9 -pixeltable close<br> </tt> <p><b> <a name="plot"></a>plot</b></p> <br> <p>Display and configure data plots. All plot commands take an optional second command, the plot name. If no plot name is specified, the last plot created is assumed. Plot data is assumed to be a pair of coordinates, with optional error values. The follow are valid data descriptions:</p> <blockquote>xy &nbsp;&nbsp; &nbsp; &nbsp; x and y coordinates<br> xyex&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with x errors<br> xyey&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with y errors<br> xyexey&nbsp;&nbsp;&nbsp; x,y coordinates with&nbsp; x and y errors<br> </blockquote> <p>To create a new plot, use the plot new command.</p> <tt> Syntax: <br> # create new empty plot window<br> -plot<br> -plot [bar|scatter]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter] &lt;title&gt; &lt;xaxis label&gt; &lt;yaxis label&gt; </tt><tt>xy|xyex|xyey|xyexey</tt><tt>]<br> <br> </tt><tt><tt>-plot [&lt;plotname&gt;] load &lt;filename&gt; [xy|xyex|xyey|xyexey]<br> &nbsp;&nbsp;&nbsp; &nbsp; [&lt;plotname&gt;] save &lt;filename&gt;<br> </tt>&nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] clear<br> </tt><tt><tt><tt><tt><tt><tt>&nbsp; &nbsp; &nbsp; </tt>[&lt;plotname&gt;] duplicate<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; </tt>[&lt;plotname&gt;] stats<br> </tt></tt>&nbsp;&nbsp;&nbsp; &nbsp; </tt>[&lt;plotname&gt;] list<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>[&lt;plotname&gt;] loadconfig &lt;filename&gt;<br> &nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] saveconfig &lt;filename&gt;<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] pagesetup orient [portrait|landscape]<br> &nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] pagesetup size [letter|legal|tabloid|poster|a4]</tt><br> <tt> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] print<br> &nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] print destination [printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print command &lt;command&gt;<br> &nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print filename &lt;filename&gt;<br> &nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] print color [rgb|gray]<br> </tt>&nbsp; &nbsp; &nbsp; </tt>[&lt;plotname&gt;] close<br> <br> </tt></tt></tt><tt><tt><tt><tt><tt><tt><tt> -plot </tt>[&lt;plotname&gt;] mode [pointer|zoom]<br> <br> </tt></tt></tt></tt></tt></tt><tt># configure graph<br> -plot [&lt;plotname&gt;] axis [x|y] grid [yes|no]<br> &nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] log [yes|no]<br> </tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] flip [yes|no]</tt><br> <tt><tt>&nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] axis [x|y] auto [yes|no]<br> &nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] min &lt;value&gt;<br> </tt><tt><tt>&nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] axis [x|y] max &lt;value&gt;</tt><tt><br> </tt>&nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] axis [x|y] format &lt;string&gt;</tt><tt><br> </tt>&nbsp; &nbsp; &nbsp; </tt><tt><tt>[&lt;plotname&gt;] legend [yes|no]<br> &nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] legend position [right|left|top|bottom]</tt><br> </tt><tt><tt>&nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] font [title|labels|numbers] font [times|helvetica|courier]<br> &nbsp; &nbsp; &nbsp; [&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> size &lt;value&gt;<br> &nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> weight [normal|bold]<br> &nbsp;&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> slant [roman|italic]<br> </tt></tt><tt>&nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] title &lt;string&gt;</tt><br> <tt><tt>&nbsp; &nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] title [x|y] &lt;string&gt;</tt></tt><tt><tt><tt><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] barmode [normal|stacked|aligned|overlap]<br> <br> # configure current dataset<br> </tt>-plot [&lt;plotname&gt;] show [yes|no]<br> </tt>&nbsp; &nbsp; &nbsp; </tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape [circle|square|diamond|plus|splus|scross|triangle|arrow]</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt>&nbsp; &nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape fill [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp; &nbsp; &nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] smooth [step|linear|cubic|quadratic|catrom]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] width &lt;value&gt;<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp; &nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] dash [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp; &nbsp; &nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error width &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] name &lt;string&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><br> # select current dataset<br> </tt></tt></tt>-plot [&lt;plotname&gt;] select &lt;value&gt;<br> &nbsp; <br> Example: <br> </tt><tt><tt> </tt></tt><tt># create new empty plot window<br> $ds9 -plot<br> $ds9 -plot scatter<br> $ds9 -plot new<br> $ds9 -plot new bar<br> $ds9 -plot new name foo<br> $ds9 -plot new name foo scatter<br> </tt><tt><tt><br> $ds9 -plot load foo.dat xy # load new dataset with dimension xy<br> $ds9 -plot save bar.dat # save current dataset<br> </tt></tt><tt><tt>$ds9 -plot clear # clear all datasets<br> $ds9 -plot duplicate # duplicate current dataset<br> $ds9 -plot stats # display current dataset statistics<br> $ds9 -plot list # list current dataset<br> </tt></tt><tt><tt>$ds9 -plot loadconfig foo.plt # load plot configuration <br> $ds9 -plot saveconfig bar.plt # save current plot configuration<br> </tt></tt><tt><tt>$ds9 -plot pagesetup orient portrait<br> $ds9 -plot pagesetup size letter<br> </tt></tt><tt><tt>$ds9 -plot print<br> $ds9 -plot print destination file<br> $ds9 -plot print command "lp"<br> $ds9 -plot print filename "foo.ps"<br> $ds9 -plot print color rgb<br> </tt>$ds9 -plot close # close current plot<br> </tt><tt><tt><br> $ds9 -plot mode pointer</tt><br> </tt><tt><br> # configure plot<br> </tt><tt>$ds9 -plot axis x grid yes<br> $ds9 -plot axis x log yes</tt><br> <tt>$ds9 -plot axis x flip yes</tt><tt><br> </tt><tt><tt>$ds9 -plot axis x auto no<br> $ds9 -plot axis x min 0<br> $ds9 -plot axis x max 100<br> </tt><tt><tt>$ds9 -plot axis x format {%f}<br> </tt></tt>$ds9 -plot legend yes # show legend<br> </tt><tt>$ds9 -plot legend position left</tt><tt><tt><tt><tt><br> </tt></tt>$ds9 -plot font numbers font times<br> $ds9 -plot font numbers size 12<br> $ds9 -plot font numbers weight bold<br> $ds9 -plot font numbers slant italic<br> </tt></tt><tt>$ds9 -plot title {The Title}<br> $ds9 -plot title x {X Axis}<br> $ds9 -plot barmode aligned<br> <br> # configure current dataset<br> </tt><tt>$ds9 -plot show yes<br> $ds9 -plot shape circle<br> </tt><tt><tt>$ds9 -plot shape fill no<br> </tt></tt><tt><tt><tt>$ds9 -plot shape color cyan<br> </tt></tt></tt><tt><tt>$ds9 -plot smooth step<br> </tt>$ds9 -plot color red<br> $ds9 -plot width 2<br> $ds9 -plot dash yes<br> $ds9 -plot error yes<br> $ds9 -plot error color red</tt><br> <tt>$ds9 -plot error width 2</tt><br> <tt>$ds9 -plot name {My Data}</tt><br> <tt><br> # select current dataset<br> $ds9 -plot select 2</tt> <p><b><b><a name="png"></a></b>png</b></p> <p>Load PNG image into current frame.<br> </p> <tt> Syntax:<br> -png &lt;filename&gt;<br> &nbsp;<br> Example: </tt><br> <tt>$ds9 png foo.png</tt><tt><tt><tt><br> </tt></tt>$cat foo.png | ds9 -png -</tt><tt><br> </tt> <p><b> <a name="port"></a>port</b></p> <p>Set the IRAF port number, used by IRAF to communicate with DS9. The default is 5137, the standard IRAF port used by <i>ximtool</i>. </p> <tt> Syntax: <br> -port number <br> &nbsp;<br> Example: <br> $ds9 -port 5137 </tt> <p><b> <a name="port_only"></a>port_only<br> inet_only</b></p> <p>Only use the IRAF port number. This is the same as -fifo none -unix none. </p> <tt> Syntax: <br> -port_only <br> &nbsp;<br> Example: <br> $ds9 -port_only<br> </tt> <p><b> <a name="pow"></a>pow</b></p> <p>Select power scale function for the current frame. </p> <tt> Syntax: <br> -pow <br> &nbsp;<br> Example: <br> $ds9 -pow </tt> <p><b> <a name="prefs"></a>prefs</b></p> <p>Controls various preference settings. </p> <tt> Syntax: <br> -prefs [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [irafalign yes|no]<br> &nbsp; <br> Example: <br> $ds9 -prefs clear<br> $ds9 -prefs irafalign yes<br> </tt> <p><b><a name="preserve"></a>preserve</b> </p> <p>Preserve the follow attributes while loading a new image. </p> <tt> Syntax: <br> preserve [pan yes|no]<br> &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; [regions yes|no]<br> &nbsp;<br> Example: <br> $ds9 -preserve pan yes<br> $ds9 -preserve regions yes<br> </tt> <p><b><a name="psprint"></a>psprint</b></p> <p>For MacOSX and Windows, invokes postscript printing. For all others, same as print. Please see <a href="#print">print</a> for further details.</p> <p><b><a name="print"></a>print</b></p> <p>Controls printing. Use print option to set printing options. Use print to actually print. </p> <tt> Syntax: <br> -print [destination printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;command&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [filename &lt;filename&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color rgb|cmyk|gray] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [level 1|2] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [resolution 53|72|75|150|300|600] <br> &nbsp;<br> Example: <br> $ds9 -print <br> $ds9 -print destination file <br> $ds9 -print command 'gv -' <br> $ds9 -print filename foo.ps <br> $ds9 -print color cmyk <br> $ds9 -print level 2 <br> $ds9 -print resolution 75 </tt> <p><b> <a name="private"></a>private</b></p> <p>use private colormap, valid for pseudocolor 8 mode. </p> <tt> Syntax: <br> -private <br> &nbsp;<br> Example: <br> $ds9 -private </tt> <p><b> <a name="raise"></a>raise</b></p> <p>Raise in the window stacking order. </p> <tt> Syntax: <br> -raise <br> &nbsp;<br> Example: <br> $ds9 -raise<br> </tt> <p><b> <a name="regions"></a>regions</b></p> <p>Controls regions in the current frame. </p> <tt> Syntax: <br> -regions [&lt;filename&gt;]<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load [all] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [list [close]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [epsilon &lt;integer&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [show yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [showtext yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid auto yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid radius &lt;value&gt;|iteration &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [getinfo]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [move front] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select all]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [select none]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select invert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [delete all]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [delete select]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format ds9|xml|ciao|saotng|saoimage|pros|xy]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [system image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [sky fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [strip yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [shape &lt;shape&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color &lt;color&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [fixed|edit|rotate|delete yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [include|exclude|source|background]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [delim [nl|&lt;char&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;marker command&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [composite]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dissolve]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [template &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [template &lt;filename&gt; at &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [savetemplate &lt;filename&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group new]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; new]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; update]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; select]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; color &lt;color&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; copy] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; delete] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; font &lt;font&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; move &lt;int&gt; &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; movefront] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; moveback] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; property &lt;property&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [paste image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [undo]<br> &nbsp;<br> Example: <br> $ds9 -regions foo.reg <br> $ds9 -regions -format ciao bar.reg # load as ciao format<br> $ds9 -regions foo.fits # FITS regions files do not need a format specification<br> $ds9 -regions load foo.reg # load foo.reg into current frame<br> $ds9 -regions load all foo.reg # load foo.reg into all frames<br> $ds9 -regions load '*.reg'# expand *.reg and load into current frame<br> $ds9 -regions load all '*.reg' # expand *.reg and load into all frames<br> $ds9 -regions save foo.reg<br> $ds9 -regions list <br> $ds9 -regions list close<br> $ds9 -regions epsilon 5<br> $ds9 -regions show yes<br> $ds9 -regions showtext no<br> $ds9 -regions centroid<br> $ds9 -regions centroid auto yes<br> $ds9 -regions centroid radius 10<br> $ds9 -regions centroid iteration 20<br> $ds9 -regions getinfo<br> $ds9 -regions move back<br> $ds9 -regions move front<br> $ds9 -regions select all <br> $ds9 -regions select none<br> $ds9 -regions select invert<br> $ds9 -regions delete all<br> $ds9 -regions delete select<br> $ds9 -regions format ds9 <br> $ds9 -regions system wcs<br> $ds9 -regions sky fk5 <br> $ds9 -regions skyformat degrees <br> $ds9 -regions delim nl <br> $ds9 -regions strip yes<br> $ds9 -regions shape ellipse <br> $ds9 -regions color red <br> $ds9 -regions width 3<br> </tt><tt>$ds9 -regions edit yes<br> $ds9 -regions include<br> </tt><tt>$ds9 -regions command "circle 100 100 20 # color=red"<br> $ds9 -regions composite<br> $ds9 -regions dissolve<br> $ds9 -regions template foo.tpl<br> $ds9 -regions template foo.tpl at 13:29:55.92 +47:12:48.02 fk5<br> $ds9 -regions savetemplate foo.tpl<br> $ds9 -regions group new<br> $ds9 -regions group foo new<br> $ds9 -regions group foo update<br> $ds9 -regions group foo select<br> $ds9 -regions group foo color red<br> $ds9 -regions group foo copy<br> $ds9 -regions group foo delete<br> $ds9 -regions group foo cut<br> $ds9 -regions group foo font {times 14 bold}<br> $ds9 -regions group foo move 100 100<br> $ds9 -regions group foo movefront<br> $ds9 -regions group foo moveback<br> $ds9 -regions group foo property delete no<br> $ds9 -regions copy<br> $ds9 -regions cut<br> $ds9 -regions paste wcs<br> $ds9 -regions undo<br> </tt> <p><b><a name="red"></a>red</b></p> <p>For RGB frames, sets the current color channel to red.</p> <tt> Syntax:<br> -red<br> &nbsp;<br> Example: <br> $ds9 -red foo.fits<br> </tt> <p><b> <a name="restore"></a>restore</b></p> <p>Restore DS9 to a previous state from a backup save set. </p> <tt> Syntax: <br> -restore &lt;filename&gt;<br> &nbsp;<br> Example:<br> $ds9 -restore ds9.bck</tt><br> <p><b> <a name="rgb"></a>rgb</b></p> <p>Create RGB frame and control RGB frame parameters.</p> <tt> Syntax: <br> -rgb []<br> &nbsp;&nbsp;&nbsp; &nbsp;[red|green|blue]<br> &nbsp;&nbsp;&nbsp; &nbsp;[channel [red|green|blue]]<br> &nbsp;&nbsp; &nbsp; [view [red|green|blue] [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;[lock wcs|crop|slice|bin|scale|scalelimits|colorbar|block|smooth [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -rgb # create new rgb frame<br> $ds9 -rgb red # set current channel to red<br> $ds9 -rgb channel red # set current channel to red<br> $ds9 -rgb view blue no # turn off blue channel<br> $ds9 -rgb system wcs # set rgb coordinate system<br> </tt><tt>$ds9 -rgb lock wcs yes</tt><br> <tt>$ds9 -rgb lock crop yes</tt><br> <tt>$ds9 -rgb lock slice yes</tt><br> <tt>$ds9 -rgb lock bin yes</tt><br> <tt> $ds9 -rgb lock scale yes<br> $ds9 -rgb lock scalelimits yes<br> $ds9 -rgb lock colorbar yes<br> $ds9 -rgb lock block yes<br> $ds9 -rgb lock smooth yes<br> $ds9 -rgb open<br> $ds9 -rgb close<br> </tt><br> <p><b> <a name="rgbarray"></a>rgbarray</b></p> <p>Load raw data array cube into rgb frame.<br> </p> <tt> Syntax:<br> -rgbarray &lt;filename&gt;[[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],[zdim=3],bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> $ds9 -rgbarray foo.arr[dim=512,zdim=3,bitpix=-32,endian=little]</tt><br> <tt>$cat foo.arr | ds9 -rgbarray -[dim=512,zdim=3,bitpix=-32,endian=little]</tt><br> <p><b> <a name="rgbcube"></a>rgbcube</b></p> <p>Load FITS rgbcube into rgb frame.<br> </p> <tt> Syntax:<br> -rgbcube &lt;filename&gt;<br> &nbsp;<br> Example: <br> $ds9 -rgbcube foo.fits</tt><tt><tt><br> </tt>$cat foo.fits | ds9 -rgbcube -</tt><br> <p><b> <a name="rgbimage"></a>rgbimage</b></p> <p>Load FITS rgbimage into rgb frame.<br> </p> <tt> Syntax:<br> -rgbimage &lt;filename&gt;<br> &nbsp;<br> Example: <br> $ds9 -rgbimage foo.fits</tt><tt><tt><br> </tt>$cat foo.fits | ds9 -rgbimage -</tt> <br> <p><b> <a name="rotate"></a>rotate</b></p> <p>Controls the rotation angle (in degrees) of the current frame. </p> <tt> Syntax: <br> -rotate [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -rotate 45 <br> $ds9 -rotate to 30<br> $ds9 -rotate open<br> $ds9 -rotate close<br> </tt> <p><b><a name="samp"></a>samp</b></p> <p>Enable/Disable SAMP protocol. </p> <tt> Syntax: <br> -samp [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [broadcast [image|table]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [send [image|table] &lt;application&gt;]<br> &nbsp;<br> Example: <br> $ds9 -samp yes<br> $ds9 -samp broadcast image<br> $ds9 -samp send image aladin</tt><br> <p><b> <a name="save"></a>save<br> </b></p> <p>Save loaded image data of current frame as FITS.</p> <tt> Syntax: <br> -save </tt><tt>[fits|rgbimage|rgbcube|mecube|mosaic|mosaicimage] &lt;filename&gt; [image|table|slice]</tt> <br> <tt> &nbsp;<br> Example: <br> $ds9 -save foo.fits</tt><br> <tt>$ds9 -save fits foo.fits image</tt><br> <tt>$ds9 -save fits foo.fits table<br> $ds9 -save fits foo.fits slice</tt><br> <tt>$ds9 -save rgbimage foo.fits<br> </tt><tt>$ds9 -save rgbcube foo.fits</tt><br> <tt>$ds9 -save mecube foo.fits</tt><br> <tt>$ds9 -save mosaic foo.fits</tt><br> <tt>$ds9 -save mosaicimage foo.fits</tt><br> <p><b> <a name="saveimage"></a>saveimage</b></p> <p>Create a snap shot of the current DS9 window and save in specified image format. If no format specified, the file name extension is used to determine the output format. Optional parameters: <tt>jpeg</tt> quality (1-100) and <tt>tiff</tt> compression method. </p> <tt> Syntax: <br> -saveimage </tt><tt>[fits|eps|gif|tiff|jpeg|png] </tt><tt>&lt;filename&gt;<br> -saveimage &lt;filename&gt;.jpeg [1-100]<br> -saveimage &lt;filename&gt;.tiff [none|jpeg|packbits|deflate]<br> &nbsp;<br> Example: <br> $ds9 -saveimage ds9.tiff<br> $ds9 -saveimage jpeg ds9.jpeg 75</tt><tt><br> </tt> <p><b> <a name="scale"></a>scale</b></p> <p>Controls the limits and color scale distribution. </p> <tt> Syntax: <br> -scale [linear|log|pow|sqrt|squared|asinh|sinh|histequ]<br> &nbsp; &nbsp; &nbsp;&nbsp; [log exp &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [datasec yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [limits &lt;minvalue&gt; &lt;maxvalue&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scope local|global] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match limits]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock limits [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -scale linear<br> $ds9 -scale log exp 100<br> $ds9 -scale datasec yes <br> $ds9 -scale histequ <br> $ds9 -scale limits 1 100 <br> $ds9 -scale mode zscale <br> $ds9 -scale mode 99.5 <br> $ds9 -scale scope local<br> $ds9 -scale match<br> $ds9 -scale match limits<br> $ds9 -scale lock yes<br> $ds9 -scale lock limits yes<br> $ds9 -scale open<br> $ds9 -scale close</tt><tt><br> </tt> <p><b> <a name="shm"></a>shm</b></p> <p>Load a shared memory segment into the current frame. </p> <tt> Syntax: <br> -shm [&lt;key&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp;&nbsp; [key &lt;id&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp;&nbsp; [shmid &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [fits [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [mosaicimage [iraf|wcs|wcsa...wcsz|wfpc2] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [mosaicimagenext [wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[mosaic [iraf|wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [rgbcube [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [rgbimage [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [rgbarray [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;,zdim=3],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [array [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;<br> Example: <br> $ds9 -shm 102 <br> $ds9 -shm key 102 <br> $ds9 -shm shmid 102 foo<br> $ds9 -shm fits 100 foo<br> $ds9 -shm mosaicimage iraf key 100 foo <br> $ds9 -shm mosaicimage wcs key 100 foo <br> $ds9 -shm mosaicimage wcsa key 100 foo <br> $ds9 -shm mosaicimage wfpc2 key 100 foo <br> $ds9 -shm mosaicimagenext wcs key 100 foo <br> $ds9 -shm mosaic iraf key 100 foo<br> $ds9 -shm mosaic wcs key 100 foo<br> $ds9 -shm rgbcube key 100 foo<br> $ds9 -shm rgbimage key 100 foo<br> $ds9 -shm rgbarray shmid 102 [dim=32,zdim=3,bitpix=-32]<br> $ds9 -shm array shmid 102 [dim=32,bitpix=-32] </tt> <p><b> <a name="single"></a>single</b></p> <p>Set display mode to single. </p> <tt> Syntax: <br> -single <br> &nbsp;<br> Example: <br> $ds9 -single<br> </tt> <p><b><a name="skyview"></a>skyview </b></p> <p>Support for SkyView image server at HEASARC. </p> <tt> Syntax: <br> -skyview []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pixels &lt;width&gt; &lt;height&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [survey &lt;survey&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -skyview<br> $ds9 -skyview m31 <br> $ds9 -skyview name m31 <br> $ds9 -skyview coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -skyview size 60 60 arcmin<br> $ds9 -skyview pixels 600 600<br> $ds9 -skyview save yes<br> $ds9 -skyview frame current<br> $ds9 -skyview update frame <br> $ds9 -skyview survey sdssi<br> $ds9 -skyview open<br> $ds9 -skyview close<br> </tt> <p><b><a name="sleep"></a>sleep </b></p> <p>Delays execution for specified number of seconds. Default is 1 second.</p> <tt> Syntax: <br> -sleep [#]<br> &nbsp;<br> Example:<br> $ds9 -sleep <br> $ds9 -sleep 2<br> </tt> <p><b> <a name="slice"></a>slice<br> noslice<br> </b></p> <p>Indicates next files loaded are to treated as slices of a cube. Can be disabled with <tt>noslice</tt> command.<br> </p> <tt> Syntax: <br> -slice &lt;filename&gt;<br> -noslice<br> &nbsp;<br> Example: <br> $ds9 -slice *.fits<br> $ds9 -noslice<br> </tt> <p><b><a name="smooth"></a>smooth</b></p> <p>Smooth current image or set smooth parameters.</p> <tt> Syntax:<br> -smooth []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [function boxcar|tophat|gaussian]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [radius &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;<br> Example:<br> $ds9 -smooth<br> $ds9 -smooth yes<br> $ds9 -smooth function tophat<br> $ds9 -smooth radius 4<br> $ds9 -smooth open<br> $ds9 -smooth close<br> $ds9 -smooth match<br> $ds9 -smooth lock yes<br> </tt> <p><b> <a name="squared"></a>squared</b></p> <p>Select squared scale function for the current frame. </p> <tt> Syntax: <br> -squared <br> &nbsp;<br> Example: <br> $ds9 -squared </tt> <p><b> <a name="sqrt"></a>sqrt</b></p> <p>Select square soot scale function for the current frame. </p> <tt> Syntax: <br> -sqrt <br> &nbsp;<br> Example: <br> $ds9 -sqrt </tt> <p><b> <a name="source"></a>source</b></p> <p>Source TCL code from a file. </p> <tt> Syntax: <br> -source filename <br> &nbsp;<br> Example: <br> $ds9 -source extensions.tcl<br> </tt> <p><b> <a name="tcl"></a>tcl</b></p> <p>Enable tcl commands to be executed via XPA or SAMP. This can be a major security risk and is disabled by default. Please use with caution.</p> <tt> Syntax:<br> -tcl [yes|no] <br> &nbsp;<br> Example: <br> $ds9 -tcl yes</tt><br> <p><b> <a name="threads"></a>threads</b></p> <p>Set number of process threads for functions which are multi-threaded. </p> <tt> Syntax:<br> -threads #<br> &nbsp;<br> Example: <br> $ds9 -threads 8</tt><br> <br> <b><a name="tiff"></a>tiff</b><br> <p>Load TIFF image into current frame.<br> </p> <tt> Syntax:<br> -tiff &lt;filename&gt;<br> &nbsp;<br> Example: <br> </tt><tt>$ds9 -tiff foo.tiff</tt><tt><tt><tt><tt><br> </tt></tt> </tt></tt><tt><tt>$cat foo.fits | ds9 -tiff -</tt></tt><tt><br> </tt> <p><b> <a name="tile"></a>tile</b></p> <p>Controls the tile display mode. </p> <tt> Syntax: <br> -tile []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode grid|column|row] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid mode automatic|manual] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid direction x|y]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid layout &lt;col&gt; &lt;row&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap &lt;pixels&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [row] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [column] <br> &nbsp;<br> Example: <br> $ds9 -tile <br> $ds9 -tile yes <br> $ds9 -tile mode row <br> $ds9 -tile grid <br> $ds9 -tile grid mode manual<br> $ds9 -tile grid direction x <br> $ds9 -tile grid layout 5 5 <br> $ds9 -tile grid gap 10 <br> $ds9 -tile row <br> $ds9 -tile column </tt> <p><b> <a name="title"></a>title</b></p> <p>Changes the display window title to the specified name. </p> <tt> Syntax: <br> -title name <br> &nbsp;<br> Example: <br> $ds9 -title Voyager </tt> <p><b> <a name="unix"></a>unix</b></p> <p>Set the IRAF unix socket name, used by IRAF to communicate with DS9. The default is /tmp/.IMT%d, so that the standard IRAF unix socket is defined. </p> <tt> Syntax: <br> -unix name <br> &nbsp;<br> Example: <br> $ds9 -unix "/tmp/.IMT%d" </tt> <p><b> <a name="unix_only"></a>unix_only</b></p> <p>Only use the IRAF unix socket name. This is the same as -fifo none -port 0. </p> <tt> Syntax: <br> -unix_only <br> &nbsp;<br> Example: <br> $ds9 -unix_only<br> </tt> <p><b> <a name="update"></a>update</b></p> <p>Updates the current frame or region of frame. In the second form, the first argument is the number of the fits HDU (starting with 1) and the remaining args are a bounding box in IMAGE coordinates. By default, the screen is updated the next available idle cycle. However, you may force an immediate update by specifying the NOW option. </p> <tt> Syntax: <br> -update [] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [# x1 y1 x2 y2] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now # x1 y1 x2 y2]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [on]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; [off] <br> &nbsp;<br> Example: <br> $ds9 -update <br> $ds9 -update 1 100 100 300 400 <br> $ds9 -update now <br> $ds9 -update now 1 100 100 300 400<br> $ds9 -update off # delay refresh of the screen while loading files<br> $ds9 -update on # be sure to turn it on when you are finished loading</tt><br> <p><b> <a name="url"></a>url</b></p> <p>Load FITS from URL into the current frame</p> <tt> Syntax: <br> -url &lt;url&gt;<br> &nbsp;<br> Example: <br> $ds9 -url http://foo.bar.edu/foo.fits</tt><tt> </tt> <p><b> <a name="version"></a>version</b></p> <p>Returns the current version of DS9 and exits. </p> <tt> Syntax: <br> -version <br> &nbsp;<br> Example: <br> $ds9 -version </tt> <p><b> <a name="view"></a>view</b></p> <p>Controls the GUI and visible RGB frame color channels. </p> <tt> Syntax: <br> -view [layout horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [keyvalue &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [info yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [panner yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [magnifier yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [buttons yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [graph horizontal|vertical yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [filename yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [object yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [keyword yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [minmax yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [lowhigh yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [units yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [image|physical|wcs|wcsa...wcsz yes|no]<br> </tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame yes|no] <br> </tt></tt>&nbsp;&nbsp;&nbsp; &nbsp; [red yes|no]<br> &nbsp; &nbsp; &nbsp; [green yes|no]<br> &nbsp; &nbsp; &nbsp; [blue yes|no]</tt><tt><tt><br> &nbsp; </tt> <br> Example: <br> $ds9 -view layout vertical<br> $ds9 -view keyvalue BITPIX<br> $ds9 -view info yes<br> $ds9 -view panner yes<br> $ds9 -view magnifier yes<br> $ds9 -view buttons yes<br> $ds9 -view colorbar yes<br> $ds9 -view graph horizontal yes<br> $ds9 -view filename yes<br> $ds9 -view object yes<br> $ds9 -view keyword yes<br> $ds9 -view minmax yes<br> $ds9 -view lowhigh yes<br> $ds9 -view wcsa yes<br> </tt><tt>$ds9 -view frame yes</tt><br> <tt>$ds9 -view red yes<br> $ds9 -view green yes<br> $ds9 -view blue yes</tt><tt><br> </tt> <p><b> <a name="visual"></a>visual</b></p> <p>Force DS9 to use the specified color visual. This argument MUST be the first argument listed. Requires the visual be available. </p> <tt> Syntax: <br> -visual [pseudocolor|pseudocolor8|truecolor|truecolor8|truecolor16|truecolor24] &nbsp;<br> Example: <br> $ds9 -visual truecolor24<br> </tt> <p><b> <a name="vla"></a>vla</b></p> <p>Support for VLA Sky Survey.</p> <tt> Syntax: <br> -vla []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [survey first|stripe82]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -vla<br> $ds9 -vla m31 <br> $ds9 -vla name m31 <br> $ds9 -vla coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $ds9 -vla size 60 60 arcmin<br> $ds9 -vla save yes<br> $ds9 -vla frame current<br> $ds9 -vla update frame<br> $ds9 -vla survey stripe82<br> $ds9 -vla open<br> $ds9 -vla close</tt><br> <p><b> <a name="vo"></a>vo</b></p> <p>Invoke an connection to a Virtual Observatory site. </p> <tt> Syntax: <br> -vo [method xpa|mime]<br> &nbsp;&nbsp;&nbsp; [server &lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [internal yes|no]<br> &nbsp;&nbsp;&nbsp; [delay #]<br> &nbsp;&nbsp;&nbsp; [&lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [connect &lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [disconnect &lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> $ds9 -vo method xpa<br> $ds9 -vo server "http://foo.bar.edu/list.txt"<br> $ds9 -vo internal yes<br> $ds9 -vo delay 15 # keep-alive delay<br> $ds9 -vo chandra-ed<br> $ds9 -vo connect chandra-ed<br> $ds9 -vo disconnect chandra-ed<br> $ds9 -vo open<br> $ds9 -vo close<br> </tt> <p><b> <a name="wcs"></a>wcs</b></p> <p>Controls the World Coordinate System for the current frame. If the wcs system, skyframe, or skyformat is modified, the info panel, compass, grid, and alignment will be modified accordingly. Also, a new WCS specification can be loaded and used by the current image regardless of the WCS that was contained in the image file. Please see <a href="file.html#WCS">WCS</a> for more information. </p> <tt> Syntax: <br> -wcs [[system] wcs|wcsa...wcsz] <br> &nbsp;&nbsp;&nbsp;&nbsp; [[sky] fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp; [[skyformat] degrees|sexagesimal] <br> &nbsp;&nbsp;&nbsp;&nbsp; [align yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [reset [#]] <br> &nbsp;&nbsp;&nbsp;&nbsp; [replace [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [append [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -wcs wcs <br> $ds9 -wcs system wcs<br> </tt><tt>$ds9 -wcs fk5 <br> </tt><tt>$ds9 -wcs sky fk5 <br> </tt><tt>$ds9 -wcs sexagesimal <br> </tt><tt>$ds9 -wcs skyformat sexagesimal <br> $ds9 -wcs align yes <br> $ds9 -wcs reset <br> $ds9 -wcs reset 3<br> $ds9 -wcs replace foo.wcs <br> $ds9 -wcs replace 3 foo.wcs <br> $ds9 -wcs append foo.wcs<br> $ds9 -wcs append 3 foo.wcs<br> $ds9 -wcs open<br> $ds9 -wcs close<br> </tt> <p><b> <a name="web"></a>web</b></p> <p>Display specified URL in the web display. </p> <tt> Syntax:<br> -web [new|&lt;webname&gt;] [&lt;url&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [click back|forward|stop|reload|#]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [close]<br> &nbsp;<br> Example: <br> $ds9 -web www.cnn.com<br> $ds9 -web new www.cnn.com<br> $ds9 -web hvweb www.apple.com<br> $ds9 -web click back<br> $ds9 -web click 2<br> $ds9 -web clear<br> $ds9 -web close<br> </tt> <p><b> <a name="width"></a>width</b></p> <p>Set the width of the image display window. Use the <a href="command.html#geometry">geometry</a> command to set the overall width and height of the ds9 window.</p> <tt> Syntax: <br> -width [&lt;value&gt;]<br> &nbsp;<br> Example: <br> $ds9 -width 512<br> </tt> <p><b> <a name="xpa"></a>xpa</b></p> <p>Configure XPA at startup.</p> <tt> Syntax:<br> -xpa [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [inet|local|unix|localhost] <br> &nbsp;&nbsp;&nbsp;&nbsp; [noxpans]<br> &nbsp;<br> Example: <br> $ds9 -xpa no <br> $ds9 -xpa local <br> $ds9 -xpa noxpans<br> </tt> <p><b> <a name="zmax"></a>zmax</b></p> <p>Set Scale Limits based&nbsp; on the <i>IRAF</i> algorithm and maximum data value. </p> <tt> Syntax: <br> -zmax <br> &nbsp;<br> Example: <br> $ds9 -zmax </tt> <p><b> <a name="zscale"></a>zscale</b></p> <p>Set Scale Limits based&nbsp; on the <i>IRAF</i> algorithm. </p> <tt> Syntax: <br> -zscale []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [contrast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sample]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [line]<br> &nbsp;<br> Example: <br> $ds9 -zscale<br> $ds9 -zscale contrast .25<br> $ds9 -zscale sample 600<br> $ds9 -zscale line 120<br> </tt> <p><b> <a name="zoom"></a>zoom</b></p> <p>Controls the current zoom value for the current frame. </p> <tt> Syntax: <br> -zoom [&lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $ds9 -zoom 2<br> $ds9 -zoom 2 4<br> $ds9 -zoom to 4<br> $ds9 -zoom to 2 4 <br> $ds9 -zoom in<br> $ds9 -zoom out<br> $ds9 -zoom to fit<br> $ds9 -zoom open<br> $ds9 -zoom close<br> <br> </tt> </blockquote> </body> </html> �������saods9/ds9/doc/ref/contour.html���������������������������������������������������������������������000644 �000765 �000000 �00000005204 11426312317 016764� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Contours</title> </head> <body link="#0000ee" text="#000000" vlink="#551a8b" alink="#ff0000" bgcolor="#ffffff"> <h3><img alt="" src="../sun.gif" height="98" width="100" align="middle"> Contours</h3> <blockquote> <p>DS9 can create and display contours as an overlay on an image. The Display Contours menu is used to display contours. To create, copy, paste,&nbsp; and configure contours, use the Contour Parameters menu.</p> <p><b>Contour Parameters </b></p> <p>When creating a new contour, a dialog box appears, in which the user selects the number of contour levels, smoothness, and the distribution of the contours. </p> <p><b> Contour Levels</b></p> <p>Specifies the number of contour levels to be generated. A typical number is between 1 and 10. Note: large numbers of contours can take a long time to generate. </p> <p><b> Contour Smoothness</b></p> <p>Specifies how smooth the contours are. A smoothness level of 1 will evaluate the contour at each image pixel. A level of 2 will evaluate the contour at every other pixel. The larger the number, the quicker the contour will be generated, and the less detail will be available. </p> <p><b> Contour Scale</b></p> <p>Specifies the distribution of the contour levels. A linear distribution will have equal spacing between contours, Log and Ln will be weighted at one end. There are two ways to indicate the contour scale, Use Frame Scale (automatic) and manual </p> <blockquote> <p><b> Use Frame Scale</b></p> <p>Use the color scale that the image is currently being displayed in. Therefor there is a one-to-one match between the image color scale distribution and the contour levels. </p> <p><b>Manual</b/></p> <p>Manually indicate upper and lower levels and a distribution for the contour levels. The contours generated will not be matched to the image color scale distribution.</p> </blockquote> <p><b> Contour Method</b></p> <p>There are two methods that are available to calculate the contour lines. The first, BLOCK, blocks down the image, by the smoothness factor, before contours are calculated. As a result, the larger the smoothness, the faster the result. The second method, SMOOTH, smooths the image before calculating contours. As a result, the larger the smoothness, the slower the result. </p> </blockquote> </body> </html> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/file.html������������������������������������������������������������������������000644 �000765 �000000 �00000107263 12612461721 016224� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>File Formats</title> </head> <body link="#0000ee" alink="#ff0000" bgcolor="#ffffff" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" height="98" align="middle" width="100"> File Formats</h3> <blockquote> <a href="#FITS">FITS</a><br> <a href="#FITSImage">FITS Image</a><br> <a href="#FITSBinaryEventsTable">FITS Binary Events Table</a><br> <a href="#FITSHEALPIXTable">FITS HEALPIX Table</a><br> <a href="#FITSDataCube">FITS Data Cube</a><br> <a href="#FITSMultipleExtensionDataCube">FITS Multiple Extension Data Cube</a><br> <a href="#FITSMultipleExtensionMultipleFrames">FITS Multiple Extension Multiple Frames</a><br> <a href="#FITSMosaic">FITS Mosaic</a><br> <a href="#FITSMosaicDataCube">FITS Mosaic Data Cube</a><br> <a href="#FITSRGB">FITS RGB </a><br> <a href="#SplitFITS">Split FITS</a><br> <a href="#array">Array</a> <br> <a href="file:///Users/joye/saods9/doc/ref/file.html#nrrd">NRRD</a><br> <a href="#envi">ENVI</a><br> <a href="#gif">GIF</a><br> <a href="#tiff">TIFF</a><br> <a href="#jpeg">JPEG</a><br> <a href="#png">PNG</a><br> <a href="#ExternalFileSupport">External Format Support</a> <br> <a href="#ExternalAnalysisSupport">External Analysis Support</a> <br> <a href="#RegionFiles">Region Files</a> <br> <a href="#ColorLookupTable">Color Lookup Table</a> <br> <a href="#WCS">WCS</a> <br> <a href="#PreferenceFile">Preference File</a> <br> <a href="#StartupFile">Startup File</a> <br> <a href="#TCL">TCL</a><br> <p><b><a name="FITS"></a>FITS</b></p> DS9 supports FITS images and FITS binary tables. The following algorithm is used to locate and to load the FITS image or table if no additional information is provide: <blockquote> <ul> <li> <tt> Examine primary HDU, if IMAGE, load.<br> </tt></li> <li><tt>Examine each extension HDU</tt></li> <ul> <li><tt>If IMAGE, load.<br> </tt></li> <li><tt>If BINARY TABLE, create IMAGE if the following is true:</tt></li> <ul> <li><tt>FITS COMPRESSED: keyword ZIMAGE is T.</tt></li> <li><tt>FITS EVENTS: keyword EXTNAME is EVENTS,STDEVT, or RAYEVENT, column names X and Y are present.</tt></li> <li><tt>FITS HEALPIX: keyword PIXTYPE is HEALPIX.</tt><br> </li> </ul> </ul> <li><tt> If DS9 traverses the entire FITS file without satisfying one of the above, an error is generated.</tt> </li> </ul> </blockquote> FITS keyword inheritance is supported. All valid FITS <tt>BITPIX</tt> values are supported, along with <tt>-16,</tt> for <tt>UNSIGNED SHORT</tt>. The following FITS keywords are supported: <blockquote> <tt> OBJECT<br> UNITS<br> BSCALE / BZERO<br> BLANK<br> DATASEC<br> LTV / LTM&nbsp; for physical coords<br> DTV / DTM&nbsp; for detector coords<br> ATV / ATM&nbsp; for amplifier coords<br> WCS keywords<br> WCS# keywords </tt> </blockquote> <p><b> <a name="FITSImage"></a>FITS Image</b></p> At load time, the user may provide just a file name or a file name along with FITS extension name/number and image section specification. FITS extension names are case insensitive. When specifying an extension, be sure to quote strings correctly to pass both the shell and DS9 parser. A image section specification is used to specify the x,y limits of an image subsection. By default, x and y coordinates are in <tt>IMAGE</tt>, use a <tt>'p'</tt> as the last character to indicate <tt>PHYSICAL</tt> coordinates. A <tt>'*'</tt> indicates use the default for that axis only. Block is optional and defaults to 1.<br> <blockquote> <tt> Syntax:<br> filename<br> filename[ext]<br> filename[ext][sect]<br> filename[sect]<br> filename[ext,sect]<br> <br> where</tt><tt><br> <br> ext:<br> [extension name | extension #]<br> <br> sect:<br> [x0:x1</tt><tt>,y0:y1[p]]<br> </tt><tt><tt><tt>[x0:x1</tt></tt></tt><tt><tt><tt>,y0:y1</tt></tt></tt><tt><tt><tt><tt>,block</tt></tt></tt></tt><tt><tt><tt><tt>[p]</tt>]<br> </tt>[x0:x1</tt></tt><tt><tt>,y0:y1</tt></tt><tt><tt>,z0:z1</tt></tt><tt><tt><tt>[p]</tt>]<br> </tt></tt><tt><tt><tt>[x0:x1</tt></tt></tt><tt><tt><tt>,y0:y1</tt></tt></tt><tt><tt><tt>,block,z0:z1</tt></tt></tt><tt><tt><tt><tt>[p]</tt>]</tt></tt></tt><br> <tt><tt><tt>[*,y0:y1</tt></tt></tt><tt><tt><tt><tt>[p]</tt>]<br> </tt><tt><tt><tt>[*,y0:y1</tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>,block</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[p]</tt>]<br> </tt>[*,y0:y1</tt></tt></tt></tt><tt><tt><tt><tt>,z0:z1</tt></tt></tt></tt><tt><tt><tt><tt><tt>[p]</tt>]<br> </tt></tt><tt><tt><tt>[*,y0:y1</tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>,block,z0:z1</tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[p]</tt>]</tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt>[x0:x1</tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>,*</tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[p]</tt>]<br> </tt><tt><tt><tt>[x0:x1</tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>,*</tt></tt></tt><tt><tt><tt><tt>,block</tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt>]<br> </tt>[x0:x1</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>,*,z0:z1</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt>]<br> </tt></tt><tt><tt><tt>[x0:x1</tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>,*,block,z0:z1</tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt>]</tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[*,*</tt></tt></tt><tt><tt><tt><tt>,block</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>]<br> </tt>[*,*,z0:z1</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>]<br> </tt></tt><tt><tt><tt>[*,*,block,z0:z1</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>]</tt></tt></tt><br> <br> </tt></tt></tt></tt></tt></tt>[dim1@xcen,dim2@ycen</tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt><tt><tt><tt><tt><tt><tt>[dim1@xcen,dim2@ycen,block</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt>[dim1@xcen,dim2@ycen,dim3@zcen</tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[dim1@xcen,dim2@ycen,block,dim3@zcen</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]</tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt>[*,dim2@ycen</tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt><tt><tt><tt><tt><tt><tt>[*,dim2@ycen,block</tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt>[*,dim2@ycen,dim3@zcen</tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[*,dim2@ycen,block,dim3@zcen</tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]</tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[dim1@xcen,*</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt><tt><tt><tt><tt><tt><tt>[dim1@xcen,*,block</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt>[dim1@xcen,*,dim3@zcen</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[dim1@xcen,*,block,dim3@zcen</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[p]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>[*,*,block]<br> </tt></tt>[*,*,dim3@zcen]<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>[*,*,block,dim3@zcen]</tt></tt></tt></tt></tt></tt><br> <br> </tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt>[dim@xcen@ycen]</tt></tt><tt><tt><br> </tt></tt>[dim@xcen@ycen,block]</tt></tt><br> <tt><tt><tt><tt>[dim@xcen@ycen,zdim@zcen]</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt>[dim@xcen@ycen,block,zdim@zcen]</tt></tt></tt></tt></tt></tt></tt></tt><tt><br> <br> Example:<br> $ds9 foo.fits # default load <br> $ds9 foo.fits[1] # load first extension<br> $ds9 foo.fits[BCKGRD] # load extension named 'BCKGRD'<br> $ds9 foo.fits[10:200,40:100] # image section<br> </tt><tt><tt>$ds9 foo.fits[10:200,40:100,2] # image section, blocked by 2<br> </tt>$ds9 foo.fits[*,40:100] # only section y axis<br> $ds9 foo.fits[256@512@512] # section box at 512,512<br> $ds9 foo.fits[2][100:200,100:200] # second extension, image section<br> </tt><tt><tt>$ds9 foo.fits[2][100:200,100:200,2] # second extension, image section, blocked by 2<br> </tt>$ds9 foo.fits[10:200,40:100,5:20] # cube section<br> $ds9 foo.fits[*,40:100,5:20] # only section y and z axes<br> $ds9 foo.fits[256@512@512] # section cube at 512,512<br> $ds9 foo.fits[2][100:200,100:200,5:20] # second extension, cube section</tt><br> <tt>$ds9 foo.fits[2][100:200,100:200,2,5:20] # second extension, cube section, blocked by 2</tt> </blockquote> <b><a name="FITSBinaryEventsTable"></a>FITS Binary Events Table<br> <br> </b> At load time, the user may provide just a file name or a file name along with FITS extension name/number, image section specification, and binnng parameters. DS9 will automatically convert an FITS binary events table into a 2D image for display. FITS extension names and parameters are case insensitive. The users may specify a number of parameters on how to construct the image and how to filter data. When specifying a filter, be sure to quote strings correctly to pass both the shell and DS9 parser. </blockquote> <blockquote> <blockquote> <tt><tt><tt><tt>Syntax: <br> </tt></tt></tt></tt><tt><tt>filename<br> filename[ext]<br> filename[ext][sect]<br> filename[sect]<br> filename[ext,sect]<br> </tt><br> filename[ext][bin]<br> </tt><tt><tt><tt><tt><tt>filename[ext][bin][sect]<br> </tt></tt></tt></tt>filename[ext][sect][bin]<br> </tt><tt><tt><tt><tt>filename[bin]<br> </tt></tt></tt>filename[bin][sect]<br> </tt><tt><tt>filename[sect][bin]<br> </tt></tt><tt>filename[ext,bin]<br> <br> </tt><tt>where:<br> ext: see <a href="FITSImage">FITS Image</a><br> sect: see <a href="FITSImage">FITS Image</a><br> <br> bin:<br> [bin=colx,coly] # bin counts <br> </tt><tt><tt>[bin=colx,coly,filter] # bin counts with filter<br> </tt>[bin=colx,coly,colz] # bin on colz <br> </tt><tt><tt>[bin=colx,coly,colz,filter] # bin on colz with filter<br> </tt></tt><tt><tt>[bin=colz] # bin cols 'x', 'y', and colz <br> </tt></tt><tt><tt>[bin=colz,filter] # bin cols 'x', 'y', and colz with filter<br> </tt>[key=colx,coly] <br> [binkey=colx,coly]<br> </tt><br> (see <a href="http://hea-www.harvard.edu/saord/funtools/filters.html">Introduction to Filtering</a>)<br> <br> <tt>Example: </tt><br> <tt> $ds9 foo.fits # default load </tt><br> <tt> $ds9 foo.fits[1] # load first extension </tt><br> <tt> $ds9 foo.fits[BCKGRD] # load extension named 'BCKGRD' </tt><br> <tt> $ds9 foo.fits[bin=detx,dety] # bin on detx,dety </tt><br> <tt> $ds9 foo.fits[2][bin=rawx,rawy] # load ext 2, cols rawx,rawy </tt><br> <tt> $ds9 foo.fits[bg_events,bin=rawx,rawy] # load ext bg_events, cols rawx,rawy </tt><br> <tt> $ds9 foo.fits[bin=x,y,pha] # bin on x,y,pi </tt><br> <tt> $ds9 foo.fits[bin=pi] # bin on x,y,pi</tt><br> <tt> $ds9 'foo.fits[ccd_id==3&amp;&amp;energy&gt;4000]' # quoted filter</tt><br> <tt> $ds9 '"foo.fits[ccd_id==3 &amp;&amp; energy&gt;4000]"' # double quoted filter</tt><br> <tt> $ds9 'foo.fits[events][pha&gt;5,pi&lt;2]' # load extension 'events' and filter</tt></blockquote> </blockquote> <blockquote> <blockquote> </blockquote> <p>The shell environment variable <tt>DS9_BINKEY </tt>may be used to specify default bin cols for FITS bin tables. Example:</p> <blockquote> <tt>$ export DS9_BINKEY='[bin=rawx,rawy]'</tt> <br> <tt>$ ds9 foo.fits # load FITS bin table, bin on rawx, rawy<br> </tt></blockquote> <p><b> <a name="FITSHEALPIXTable"></a>FITS HEALPIX Table<br> </b></p> At load time, the user may provide just a file name or a file name along with FITS extension name/number, image section specification, and Healpix parameters. DS9 will automatically convert a FITS HEALPIX binary or ascii table into a 2D image for display. FITS extension names and parameters are case insensitive. The users may specify a number of parameters on how to construct the image. Any table with keyword PIXTYPE=HEALPIX or NSIDE=x will be processed as an HEALPIX image. The following FITS keywords will be used if present and not overwritten by a command line option: NSIDE, COORDSYS, ORDER.<br> <blockquote> <blockquote> </blockquote> <tt><tt><tt><tt>Syntax: <br> </tt></tt></tt></tt><tt><tt>filename<br> filename[ext]<br> filename[ext][sect]<br> filename[sect]<br> filename[ext,sect]<br> <br> </tt></tt><tt><tt><tt>filename[ext][hpx]<br> </tt><tt><tt><tt><tt><tt>filename[ext][hpx][sect]<br> </tt></tt></tt></tt>filename[ext][sect][hpx]<br> </tt><tt><tt><tt><tt>filename[hpx]<br> </tt></tt></tt>filename[hpx][sect]<br> </tt><tt><tt>filename[sect][hpx]<br> </tt></tt><tt>filename[ext,hpx]<br> <br> </tt>where:<br> </tt></tt><tt><tt><tt><tt><tt><tt><tt>ext: see <a href="file:///Users/joye/saods9/ds9/doc/ref/FITSImage">FITS Image</a><br> </tt></tt></tt></tt></tt>sect: see <a href="file:///Users/joye/saods9/ds9/doc/ref/FITSImage">FITS Image</a><br> <br> hpx:<br> </tt></tt><tt>[order=ring|nested] # default ring<br> [layout=equatorial|north|south] # default equatorial<br> [col=&lt;column number&gt;] # defaut 1<br> [quad=&lt;quadurant number&gt;] # (1-4) default 1<br> [system=equatorial|galactic|ecliptic|unknown] # default unknown</tt><br> <br> <tt>Example: </tt><tt><br> $ds9 foo.fits # default load </tt><tt><br> $ds9 foo.fits[1] # load first extension </tt><tt><br> $ds9 foo.fits[order=ring,layout=equatorial,col=1,quad=1,system=unknown]<br> </tt><tt>$ds9 foo.fits[1,order=nested] # first extension, nested order</tt><br> </blockquote> <blockquote> </blockquote> <p><b><a name="FITSDataCube"></a>FITS Cube</b></p> A FITS Cube is a FITS image which contains more than 2 axes (NAXES&gt;2). DS9 will automatically detect if a cube is present and will load all additional images. In addition, individual images can be loaded one at a time into a cube. DS9 will display the Cube dialog box which allows the user to select which 2 image to be displayed. <p><b><a name="FITSMultipleExtensionDataCube"></a>FITS Multiple Extension Cube</b></p> A FITS Multiple Extension Data Cube file is a FITS file with one or more extensions, that is to be displayed as a data cube. Each image does not have to be the same size, however, only the coordinate systems from the first extension will be used for contours and grids. <br> <blockquote><tt> Example:</tt><br> <tt> $ds9 -mecube foo.fits # load multiple extension fits file as data cube</tt></blockquote> <p><b><a name="FITSMultipleExtensionMultipleFrames"></a>FITS Multiple Extension Multiple Frames</b></p> Load a multiple extension FITS file into multiple frames. Please note that files loaded via standard-in or the xpa fits command can not be displayed using this method. <br> <blockquote><tt> Example:</tt><br> <tt> $ds9 -multiframe foo.fits # load multiple extension fits file as multiple frames</tt></blockquote> <p><b><a name="FITSMosaic"></a>FITS Mosaic</b></p> A FITS mosaic image may exist as a series of FITS files, or as one FITS file with many extensions. A FITS mosaic may be loaded all a one time, or by the segment. Once loaded, the multiple FITS images are treated as one FITS image. <br> <br> DS9 supports three forms of mosaics:&nbsp; <center> <table align="center" border="1" cellpadding="2" cellspacing="2" width="50%"> <tbody> <tr> <td valign="top"><tt>IRAF</tt><br> </td> <td valign="top"> <tt>contains the DETSEC and DETSIZE keywords.<br> See <a href="http://iraf.noao.edu/projects/ccdmosaic/imagedef/imagedef.html">NOAO IRAF Mosaic Data Structures</a></tt> <br> </td> </tr> <tr> <td align="left" valign="top"> <tt>WCS</tt><br> </td> <td align="left" valign="top"><tt>each FITS image contains a valid WCS.</tt><br> </td> </tr> <tr> <td align="left" valign="top"> <tt>HST WFPC2</tt><br> </td> <td align="left" valign="top"> <tt>valid HST WFPC2 data cube, consisting of 4 planes, along with a fits ascii table containing wcs information. </tt></td> </tr> </tbody> </table> </center> <tt></tt> <blockquote><tt>Example:</tt><br> <tt> $ds9 -mosaicimage iraf foo.fits # load mosaic iraf from one fits file with multiple exts</tt><br> <tt> $ds9 -mosaic iraf foo.fits bar.fits wow.fits # load mosaic iraf from 3 files</tt><br> <tt> $ds9 -mosaicimage wcs foo.fits # load mosaic wcs from one fits file with multiple exts</tt><br> <tt> $ds9 -mosaic wcs foo.fits bar.fits wow.fits # load mosaic wcs from 3 files</tt><br> <tt> $ds9 -mosaicimage wfpc2 bar.fits # load wfpc2 mosaic</tt><br> <tt> $ds9 -mosaic foo.fits bar.fits wow.fits # load mosaic (wcs) from 3 files</tt><br> <tt> </tt></blockquote> <p><b><a name="FITSMosaicDataCube"></a>FITS Mosaic Data Cube</b></p> A FITS Mosaic Data Cube is a FITS mosaic image which contains more than 2 axes (NAXES&gt;2). DS9 will automatically detect if a mosaic data cube is present and will load all additional images. At the same time, DS9 will display the data cube dialog box which allows the user to select which 2 image to be displayed. <p><b><a name="FITSRGB"></a>FITS RGB</b></p> A FITS RGB image may exist as three of FITS images, one FITS file with three extensions, or as a FITS 3D Data cube, with three slices, each representing the red, green, and blue channel. A FITS RGB image may be loaded all a one time, or by the channel. Once loaded, the multiple FITS images are treated as one FITS image.<br> <blockquote><tt>Example:</tt><br> <tt> $ds9 -rgbimage rgb.fits # load rgb image consisting of one fits file with 3 image exts</tt><br> <tt> $ds9 -rgbcube cube.fits # load rgb image consisting of one fits data cube</tt><br> <tt> $ds9 -rgb -red foo.fits -green bar.fits -blue wow.fits # rgb image from 3 fits images</tt><br> <tt> </tt></blockquote> <p><b><a name="SplitFITS"></a>Split FITS</b></p> A split fits is a valid fits file in which two files contain the header and data segments. <p><b><a name="array"></a>Array</b></p> Raw data arrays are supported. To load an array, the user must provide the dimensions, pixel depth, and optional header size and architecture type. <blockquote> <tt> Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename[arr]<br> </tt></tt></tt>filename[arr][sect]<br> </tt><tt><tt>filename[sect][arr]<br> &nbsp; </tt></tt></tt></tt><br> where</tt><br> <tt><tt><tt>sect: see <a href="file:///Users/joye/saods9/ds9/doc/ref/FITSImage">FITS Image</a><br> </tt></tt>arr:<br> </tt> <blockquote><tt> xdim=value </tt><br> <tt> ydim=value </tt><br> <tt> zdim=value # default is a depth of 1</tt><br> <tt> dim=value </tt><br> <tt> dims=value </tt><br> <tt> bitpix=[8|16|-16|32|64|-32|-64] </tt><br> <tt> skip=value # must be even, most must be factor of 4 </tt><br> <tt> arch|endian=[big|bigendian|little|littleendian]</tt><br> </blockquote> <tt> Example:<br> $ds9 -array bar.arr[xdim=512,ydim=512,zdim=1,bitpix=16] # load 512x512 short<br> $ds9 -array bar.arr[dim=256,bitpix=-32,skip=4] # load 256x256 float with 4 byte head<br> $ds9 -array bar.arr[dim=512,bitpix=32,arch=little] # load 512x512 long, intel<br> </tt> <p>or alternate format:</p> <tt>filename[array(&lt;type&gt;&lt;dim&gt;&lt;:skip&gt;&lt;endian&gt;)]<br> <br> where:<br> type: <blockquote> 'b' 8 -bit unsigned char<br> 's' 16-bit short int<br> 'u' 16-bit unsigned short int<br> 'i' 32-bit int<br> 'l' 64-bit int<br> 'r' 32-bit float<br> 'f' 32-bit float<br> 'd' 64-bit float </blockquote> dim: <blockquote> int&nbsp;&nbsp;&nbsp;&nbsp; # x,y dim<br> int.int # x,y dim<br> int.int.int # x,y,z dim<br> </blockquote> skip: <blockquote> int&nbsp;&nbsp;&nbsp;&nbsp; # number of bytes to skip </blockquote> endian: <blockquote> 'l' little endian<br> 'b' big endian<br> </blockquote> Example:<br> $ds9 -array bar.arr[array(s512)]&nbsp;&nbsp; # load 512x512 short<br> $ds9 -array bar.arr[array(r256:4)] # load 256x256 float with 4 byte head<br> $ds9 -array bar.arr[array(i512l)]&nbsp; # load 512x512 long, intel </tt> <p>The shell environment variable <tt>DS9_ARRAY </tt>may be used to specify default array parameters. </p> <tt> Example:<br> $export DS9_ARRAY='[dim=256,bitpix=-32]'<br> $ds9 -array foo.arr # load 256x256 float<br> </tt></blockquote> <p><b><a name="nrrd"></a>NRRD (Nearly Raw Raster Data)</b><br> </p> Images in NRRD are supported directly. Encodings supported: <tt>raw, gzip<br> </tt><br> <tt>Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt>filename[sect]<br> </tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt>where:<br> sect: see <a href="file:///Users/joye/saods9/ds9/doc/ref/FITSImage">FITS Image</a><br> </tt></tt> </tt><tt><tt><br> </tt></tt></tt></tt></tt><tt>Example:</tt><br> <tt>$ds9 -nrrd foo.nrrd<br> $ds9 -nrrd foo.nrrd[100:200,100:200] # cropped</tt><br> <p><b><a name="envi"></a>ENVI</b><br> </p> Images in ENVI are supported directly. Encodings supported: <tt>BIL, BIP, BSQ.<br> </tt><br> <tt>Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt>filename[sect]<br> <br> where:</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt>sect: see <a href="file:///Users/joye/saods9/ds9/doc/ref/FITSImage">FITS Image</a><br> </tt></tt> </tt><tt><tt><br> </tt></tt></tt></tt></tt> <tt>Example:</tt><br> <tt>$ds9 -envi foo.hdr foo.bsq<br> $ds9 -envi foo.hdr foo.bsq[100:200,100:200] # cropped<br> </tt> <p><b><a name="gif"></a>GIF</b><br> </p> Images in GIF are supported directly. For a <tt>Frame</tt>, the average of the luminosity is used. For <tt>Frame RGB</tt>, each channel is loaded directly.<br> <tt><br> Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt></tt></tt></tt></tt><br> <tt>Example:<br> </tt> <tt>$ ds9 -gif foo.gif</tt><br> <p><b><a name="tiff"></a>TIFF</b><br> </p> Images in TIFF are supported directly. For a <tt>Frame</tt>, the average of the luminosity is used. For <tt>Frame RGB</tt>, each channel is loaded directly.<br> <br> <tt>Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt></tt></tt></tt></tt><br> <tt>Example:</tt><br> <tt>$ ds9 -tiff foo.tiff</tt><br> <p><b><a name="jpeg"></a>JPEG</b><br> </p> Images in JPEG are supported directly. For a <tt>Frame</tt>, the average of the luminosity is used. For <tt>Frame RGB</tt>, each channel is loaded directly.<br> <tt><br> Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt></tt></tt></tt></tt><br> <tt>Example:</tt><br> <tt>$ ds9 -jpeg foo.jpeg</tt><br> <p><b><a name="png"></a>PNG</b><br> </p> Images in PNG are supported directly. For a <tt>Frame</tt>, the average of the luminosity is used. For <tt>Frame RGB</tt>, each channel is loaded directly.<br> <br> <tt>Syntax:<br> </tt><tt><tt><tt><tt><tt><tt><tt>filename<br> </tt></tt></tt></tt></tt></tt></tt><br> <tt>Example:</tt><br> <tt>$ ds9 -png foo.png</tt><br> <p><b> <a name="ExternalFileSupport"></a>External File Support</b></p> DS9 supports external file formats via an ASCII description file. When loading a file into DS9, these descriptions are referenced for instructions for loading the file, based on the file extension. If found, the command is executed and the result, a FITS image or FITS Binary Table, is read into DS9 via stdin. <br> At start-up, DS9 first searches for the ASCII file, named <tt>.ds9.fil</tt>in the local directory, then in the users home directory. <br> The file command first is macro-expanded to fill in user-defined arguments and then is executed externally. <br> The ASCII file that defines the known image files consists of one or more file descriptors, each of which has the following format: <blockquote> <tt> Help description<br> A space-separated list of templates<br> A space-separated list of file types (not currently used)<br> The command line for the loading this file type<br> </tt> </blockquote> Note that blank lines separate the file descriptions and should not be used as part of a description. Also, the '#' character is a comment character. <br> <br> The following macros are supported: <tt>$filename</tt><br> <blockquote><tt> For Example: </tt><br> <tt> # File access descriptions:</tt><br> <tt> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; help explanation</tt><br> <tt> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file template</tt><br> <tt> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file type</tt><br> <tt> #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access command</tt><br> <tt> IRAF IMH files</tt><br> <tt> *.imh</tt><br> <tt> IMH</tt><br> <tt> i2f -s $filename </tt></blockquote> <p><b> <a name="ExternalAnalysisSupport"></a>External Analysis Support</b></p> For more information about external analysis support files, see <a href="analysis.html">Analysis</a>. <p><b> <a name="RegionFiles"></a>Region Files</b></p> DS9 can read and write a number of region file formats. See <a href="region.html">Regions</a> documentation for more information. <blockquote> <tt> <a href="region.html#RegionDescriptions">DS9</a><br> <a href="region.html#FUNTools">FUNTools</a><br> <a href="region.html#Ciao">Ciao</a><br> <a href="region.html#SAOimage">SAOimage</a><br> <a href="region.html#IRAFPROS">IRAF PROS</a><br> <a href="region.html#FITSREGIONBinaryTable">FITS REGION Binary Table</a><br> <a href="region.html#XY">X Y</a> </tt> </blockquote> <p><b> <a name="ColorLookupTable"></a>Color Lookup Table</b></p> DS9 has a number of default colormaps available to the user. DS9 also supports reading and writing color lookup table formats from the following programs: <blockquote> <tt> <a href="http://tdc-www.harvard.edu/software/saoimage/saoimage.color.html#cmap">SAOimage</a><br> <a href="http://hea-www.harvard.edu/RD/saotng/adding_cmaps.html">SAOtng</a><br> XImtool<br> </tt> </blockquote> DS9 uses the file extension to determine the color table format: <center> <table nosave="" border="1" cellpadding="2" cellspacing="2" width="50%"> <tbody> <tr nosave=""> <td nosave=""> <center><tt>Ext</tt></center> </td> <td> <center><tt>Format</tt></center> </td> </tr> <tr> <td><tt>.lut</tt></td> <td><tt>XImtool, SAOtng</tt></td> </tr> <tr> <td><tt>.sao</tt></td> <td><tt>DS9, SAOimage</tt></td> </tr> <tr> <td><tt>any other</tt></td> <td><tt>DS9</tt></td> </tr> </tbody> </table> </center> <p><b> <a name="WCS"></a>WCS</b></p> A new WCS specification can be loaded and used by the current image regardless of the WCS that was contained in the image file. WCS specification can be sent to DS9 as an ASCII file via XPA. The format of the specification is a set of valid FITS keywords that describe a WCS. <blockquote> <tt> Example: <br> &nbsp;&nbsp;&nbsp; CRPIX1&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 257.75<br> &nbsp;&nbsp;&nbsp; CRPIX2&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 258.93<br> &nbsp;&nbsp;&nbsp; CRVAL1&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -201.94541667302 <br> &nbsp;&nbsp;&nbsp; CRVAL2&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -47.45444<br> &nbsp;&nbsp;&nbsp; CDELT1&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -2.1277777E-4 <br> &nbsp;&nbsp;&nbsp; CDELT2&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1277777E-4 <br> &nbsp;&nbsp;&nbsp; CTYPE1&nbsp; = 'RA---TAN' <br> &nbsp;&nbsp;&nbsp; CTYPE2&nbsp; = 'DEC--TAN' <br> </tt> </blockquote> Note that the WCS definitions can contain standard FITS 80 character WCS card images, as shown above, or free-form name/value pairs without the intervening "=" sign: <blockquote> <tt> &nbsp;&nbsp;&nbsp; CRPIX1&nbsp;&nbsp;&nbsp; 257.75 <br> &nbsp;&nbsp;&nbsp; CRPIX2&nbsp;&nbsp;&nbsp; 258.93 <br> &nbsp;&nbsp;&nbsp; CRVAL1&nbsp;&nbsp;&nbsp; -201.94541667302 <br> &nbsp;&nbsp;&nbsp; CRVAL2&nbsp;&nbsp;&nbsp; -47.45444 <br> &nbsp;&nbsp;&nbsp; CDELT1&nbsp;&nbsp;&nbsp; -2.1277777E-4 <br> &nbsp;&nbsp;&nbsp; CDELT2&nbsp;&nbsp;&nbsp; 2.1277777E-4 <br> &nbsp;&nbsp;&nbsp; CTYPE1&nbsp;&nbsp; 'RA---TAN' <br> &nbsp;&nbsp;&nbsp; CTYPE2&nbsp;&nbsp; 'DEC--TAN' </tt> </blockquote> <p><b> <a name="PreferenceFile"></a>Preference File</b></p> A preference file is a valid tcl script generated by DS9 to save the current preference items. See <a href="prefs.html">Preferences</a> for more information. <p><b> <a name="StartupFile"></a>Startup File</b></p> If a startup file <tt>ds9.ini</tt> is available, it is sourced as the last step in initialization. The following directories are searched in order: <tt>./, $HOME, /usr/local/lib, /opt/local/lib</tt>. <p><b> <a name="TCL"></a>TCL</b></p> TCL/TK script file. Users may customize the appearance and enhance the capabilities of DS9 by sourcing their own TCL scripts. </blockquote> </body> </html> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/grid.html������������������������������������������������������������������������000644 �000765 �000000 �00000011340 12071072130 016207� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Coordinate Grids</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" height="98" width="100"> Coordinate Grids</h3> <blockquote> <p>DS9 can create and display coordinate grids as an overlay on an image. The Display Coordinate Grid Menu is used to display grids. A coordinate grid is composed of Grid Lines, Axes, Border, and Title. Axes include tick marks, title, and numbers. The appearance of the coordinate grid is specified by parameters. These parameters may be configured via the Coordinate Grid Parameters dialog box. In addition to the axes titles and the grid title, the following menus are available. </p> <p><b><a name="Format"></a>Numeric Formats</b></p> <p>The user may specify custom numeric formats for either axes. The format specification can be empty (default) or a print function, based on the selected coordinate system:<br> </p> <blockquote> <tt>image</tt><br> <tt>physical</tt><br> <tt>detector</tt><br> <tt>amplifier</tt><br> <tt>wcs linear</tt><br> <tt>wcs equatorial</tt><br> </blockquote> <p>The format specification string to be passed to the C "printf" function (e.g. "%%1.7G") in order to format a single coordinate value.</p> <p>The Format string supplied should contain one or more of the following characters. These may occur in any order, but the following is recommended for clarity:</p> <blockquote> "": Indicates that a plus sign should be prefixed to positive values. By default, no plus sign is used.<br> "z": Indicates that leading zeros should be prefixed to the value so that the first field is of constant width, as would be required in a fixed-width table (leading zeros are always prefixed to any fields that follow). By default, no leading zeros are added.<br> "i": Use the standard ISO field separator (a colon) between fields. This is the default behaviour.<br> "b": Use a blank to separate fields.<br> "l": Use a letter ("h"/"d", "m" or "s" as appropriate) to separate fields.<br> "g": Use a letter and symbols to separate fields ("h"/"d", "m" or "s", etc, as appropriate), but include escape sequences in the formatted value so that the Plot class will draw the separators as small super-scripts.<br> "d": Include a degrees field. Expressing the angle purely in degrees is also the default if none of "h", "m", "s" or "t" are given.<br> "h": Express the angle as a time and include an hours field (where 24 hours correspond to 360 degrees). Expressing the angle purely in hours is also the default if "t" is given without either "m" or "s".<br> "m": Include a minutes field. By default this is not included.<br> "s": Include a seconds field. By default this is not included. This request is ignored if "d" or "h" is given, unless a minutes field is also included.<br> "t": Express the angle as a time (where 24 hours correspond to 360 degrees). This option is ignored if either "d" or "h" is given and is intended for use where the value is to be expressed purely in minutes and/or seconds of time (with no hours field). If "t" is given without "d", "h", "m" or "s" being present, then it is equivalent to "h".<br> ".": Indicates that decimal places are to be given for the final field in the formatted string (whichever field this is). The "." should be followed immediately by an unsigned integer which gives the number of decimal places required, or by an asterisk. If an asterisk is supplied, a default number of decimal places is used which is based on the value of the Digits attribute.<br> </blockquote> <p>All of the above format specifiers are case-insensitive. If several characters make conflicting requests (e.g. if both "i" and "b" appear), then the character occurring last takes precedence, except that "d" and "h" always override "t".</p> <p>The default formats are <tt>d.3</tt> for degrees and <tt>hms.1</tt> / <tt>dms.1</tt> / <tt>ldms.1</tt> for sexagesimal.<br> </p> </blockquote> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/how.html�������������������������������������������������������������������������000644 �000765 �000000 �00000020363 12476367314 016110� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>How</title> </head> <body link="#0000ee" alink="#ff0000" bgcolor="#ffffff" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" height="98" align="middle" width="100"> How it Works</h3> <blockquote> <p><b>Table of Contents</b></p> <a href="#How">How DS9 Renders an Image</a><br> <a href="#Scales">Scales</a><br> <a href="#Smoothing">Smoothing</a><br> <a href="#Contours">Contours</a><br> <a href="#LargeFiles">Large Files</a><br> <p><b><a name="How"></a>How DS9 renders an image</b></p> <p>Here is a short description on how DS9 decides to paint a pixel a color on the the screen, give an data value... you need a color scale, a contrast/bias pair for the colorscale, clip values for the data, a scale distribution, and finally, the value of the pixel in question.</p> <blockquote> <p>Step 1. Select a color scale. A color scale is defined as a number of colors (RGB triplets). The number of RGB triplets can vary from just a few to over 200. DS9 contains a number of predefined color scales (Gray, A, B, I8, ...) or the user may load his own color scale.</p> <p>Step 2. Apply a contrast/bias pair. This step takes the result of step 1 and creates a new array with the contrast/bias applied. The length of the new array will between 200 (for pseudocolor) and 4096 (for truecolor).</p> <p>Step 3. Calculate the data clip values (low/high data values). The min/max data values may be used or an algorithm may be used to determine the clip data values.</p> <p>Step 4. Apply the scale distribution. This involves taking the result of step 2, and creating yet another array, this time of size 16384, redistributing the colors, based on the scale algorithm selected (see <a href="Scales">Scales</a>).</p> <p>Step 5. Based on your data clip values, and the value of the pixel you have, index into the result of step 4, and you have an index into lookup table (for pseudocolor) and an RGB pair (for truecolor and postscript).</p> </blockquote> <p><b><a name="Scales"></a>Scales</b></p> <p>The <tt>log</tt> function is defined as the following:</p> <blockquote> <p><b><img src="img/log.png" alt="log equation" height="32" width="78"></b></p> </blockquote> <p>as <i>x</i> goes from 0 to 1. The user may specify an exponent <i>a</i> to change the distribution of colors within the colorbar. The default value of <i>a</i> is 1000. Typically, optical images respond well at 1000, IR images as low as 100, and high energy bin tables up to 10000. A value of 10000 closely matches the <b><tt>log</tt></b> function of SAOImage as defined as the following:</p> <blockquote> <p><b><img src="img/saolog.png" alt="SAOImage log equation" height="34" width="65"></b></p> </blockquote> <p>The <tt>pow</tt> function is defined as the following:</p> <blockquote> <p><b><img src="img/pow.png" alt="pow equation" height="30" width="51"></b></p> </blockquote> <p>as <i>x</i> goes from 0 to 1. The user may specify an exponent <i>a</i> to change the distribution of colors within the colorbar. The default value of <i>a</i> is 1000.</p> <p>The <tt>sqrt</tt> scale function is defined as the following:</p> <blockquote><img src="img/sqrt.png" alt="sqrt equation" height="21" width="42"><br> </blockquote> <p>as <i>x</i> goes from 0 to 1. </p> <p>The <tt>square</tt> scale function is defined as the following:</p> <blockquote><img src="img/square.png" alt="square equation" height="21" width="35"><br> </blockquote> <p>as <i>x</i> goes from 0 to 1.<br> </p> <p>The <tt>asinh</tt> scale function is defined as the following:</p> <blockquote><img alt="asinh" src="img/asinh.png" height="29" width="80"><br> </blockquote> <p>as <i>x</i> goes from 0 to 1. </p> <p>The <tt>sinh</tt> scale function is defined as the following:</p> <blockquote><img alt="sinh" src="img/sinh.png" height="29" width="69"><br> </blockquote> <p>as <i>x</i> goes from 0 to 1. </p> <p>The <tt>histogram equalization</tt> scale function distributes colors based on the frequency of each data value.</p> <p><b><a name="Smoothing"></a>Smoothing</b></p> <p>The user may select one of three types of smoothing kernels. The parameter, <i>r</i> or <tt>kernel radius</tt>, is defined as the following:</p> <blockquote> Boxcar function, where the width = 2<i>r</i>+1<br> Tophat function, where the radius = <i>r</i> and the diameter of kernel is 2<i>r</i>+1<br> Gaussian function, defined as: <blockquote><img src="img/gauss.png" alt="Gaussian Equation" height="38" width="173"><br> </blockquote> where the mean = 0 and sigma =<i> r</i>/2, and the diameter of kernel is 2<i>r</i>+1 </blockquote> <p><b><a name="Contours"></a>Contours</b></p> <p>The contour algorithm is from an unknown author and originally came from FV. The difference between the two modes are:<tt><br> </tt></p> <blockquote><tt>block</tt> : the image is blocked down before the contour is generated <br> <tt>smooth</tt> : the image is smoothed via a Gaussian kernel before the contour is generated. </blockquote> <p><tt>block</tt> mode is faster as the smoothing parameter increases. Inversely, <tt>smooth</tt> mode is much slower as the smoothing parameter increases.</p> <p><b><a name="LargeFiles"></a>Large Files</b></p> There are several factors that determine if DS9 will be able to load a large file.<br> <p>32 bit OS vs 64 bit OS : to address very large files, you may need to use an 64 bit OS with a 64bit version of DS9. 32bit apps can address up to 4Gb of address space. However, depending on the OS, this limit may be less. Linux for example, the limit appears to be ~3GB (the OS and shared libs eat up a lot of address space). Under 64bit Solaris, 32bit ds9 has a full 4Gb of space. MacOSX appears to have a limit ~3Gb. Under windows, ~2Gb.</p> <p>Large File Support: is the ability to sequence thru files larger than 4Gb. DS9 is compiled with LFS.</p> <p>File system: the OS file system must be able to support files larger than 4Gb. Most recent file systems fully support 4GB&gt;.</p> <p>Memory Management: There are a number of memory management techniques supported in DS9 that will greatly affect the ability and speed of loading large files:</p> <blockquote> <tt>$ ds9 foo.fits # uses mmap</tt><br> <tt>$ cat foo.fits | ds9 - # allocates memory</tt> <br> <tt>$ xpaset -p ds9 file foo.fits # uses mmap</tt> <br> <tt>$ xpaset -p ds9 fits foo.fits # allocates memory</tt><br> </blockquote> <p>Memory Map (<tt>mmap</tt>) is very fast, limit is memory address space (see above). Allocate is very slow, limit is amount of physical memory + swap partition.</p> <p>Scanning Data: DS9 needs to determine the min and max data values to correctly display your image. For large files, this can take time. You have several options available under the <tt>Scale</tt> menu:</p> <blockquote>Scan Data - reads all data<br> Sample Data - samples every x values (much faster)<br> Use FITS keyword DATAMIN/MAX or IRAFMIN/MAX - great if in the header, bad because they are always wrong.<br> </blockquote> <p>The best thing to do is to use sample data, and set the data sample between 10 and 100.</p> </blockquote> </body> </html> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/�����������������������������������������������������������������������������000755 �000765 �000000 �00000000000 12634602226 015163� 5����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/index.html�����������������������������������������������������������������������000644 �000765 �000000 �00000007560 12071072130 016402� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Reference Manual</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" height="98" width="100"> SAOImage DS9 Reference Manual</h3> <blockquote> <p>DS9 is&nbsp; the next version of the popular <a href="http://hea-www.harvard.edu/RD/saotng/">SAOtng</a> display program. It is a Tk/Tcl application which utilizes the SAOtk widget set. It also incorporates the new X Public Access (<a href="http://hea-www.harvard.edu/RD/xpa/">XPA</a>) mechanism to allow external processes to access and control its data, GUI functions, and algorithms. DS9&nbsp; supports the direct display of FITS images and binary tables, multiple frame buffers, region cursor manipulation, many scale algorithms and colormaps, and easy communication with external analysis tasks. It is highly configurable and extensible to meet the evolving needs of the astronomical community. </p> <p>DS9 supports advanced features such as multiple frame buffers, mosaic images, tiling, blinking, geometric markers, colormap manipulation, scaling, arbitrary zoom, rotation, pan, and a variety of coordinate systems (including Image, Physical, Detector, and WCS). DS9 also supports FTP and HTTP access. The GUI for DS9 is user configurable.</p> <table align="center" border="0" cellpadding="4" cellspacing="2" height="25%" width="75%"> <tbody> <tr> <td align="center" valign="middle"> <a href="how.html">How It Works</a></td> <td align="center" valign="top"><a href="backup.html">Backup and Restore</a></td> <td align="center" valign="middle"> <a href="file.html">File Formats</a></td> </tr> <tr> <td align="center" valign="middle"> <a href="keyboard.html">Mouse and Keyboard</a> </td> <td align="center" valign="top"><a href="grid.html">Coordinate Grids</a></td> <td align="center" valign="middle"> <a href="prefs.html">Preferences</a></td> </tr> <tr> <td align="center" valign="middle"> <a href="command.html">Command Line Options</a> </td> <td align="center" valign="top"><a href="catalog.html">Catalogs</a></td> <td align="center" valign="middle"> <a href="3d.html">3-D Frames</a></td> </tr> <tr> <td align="center" valign="middle"> <a href="xpa.html">XPA Access Points</a> </td> <td align="center" valign="top"><a href="colorbar.html">Colorbar</a><br> </td> <td align="center" valign="middle"> <a href="contour.html">Contours</a></td> </tr> <tr> <td align="center" valign="top"> <a href="samp.html">SAMP<br> </a> </td> <td align="center" valign="top"><a href="print.html">Printing</a></td> <td align="center" valign="top"> <a href="iraf.html">IRAF Support</a></td> </tr> <tr> <td align="center" valign="middle"> <a href="region.html">Regions</a> </td> <td align="center" valign="top"><a href="analysis.html">Analysis</a></td> <td align="center" valign="middle"> <a href="bin.html">Binning</a><br> </td> </tr> </tbody> </table> </blockquote> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/iraf.html������������������������������������������������������������������������000644 �000765 �000000 �00000016213 11426312317 016216� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>IRAF Support</title> </head> <body link="#0000ee" text="#000000" vlink="#551a8b" alink="#ff0000" bgcolor="#ffffff"> <h3><img alt="" src="../sun.gif" height="98" width="100" align="middle"> IRAF Support</h3> <blockquote> <p>DS9 is a fully functional IRAF image display server. IRAF uses the IIS protocol to communicate with a valid image display server, such as DS9, ximtool, saoimage, and saotng. With DS9, no special scripts are needed. If you have one of the above currently working, DS9 works <i>right</i> <i>out of the box.</i> And DS9 now supports IRAF's new IIS image display protocol that supports up to 16 display frames. </p> <p>All native DS9 functions may be used with images load with IRAF display except for the <tt>Scale</tt> menu items. Values displayed may the the true values, if a linear scale is specified with the <tt>display</tt> command. Otherwise, the value is a scaled value. DS9 supports IRAF in all display visuals including <tt>Truecolor</tt>. Support full postscript printing of images loaded from IRAF is provided. </p> <p><b> Command Line Arguments</b></p> <p>As with <i>ximtool</i>, the follow command line arguments may be used to specify the communication parameters: </p> <blockquote> <tt> <a href="command.html#fifo">fifo</a><br> <a href="command.html#fifo_only">fifo_only</a><br> <a href="command.html#port_only">inet_only</a><br> <a href="command.html#port">port</a><br> <a href="command.html#port_only">port_only</a><br> <a href="command.html#unix">unix</a><br> <a href="command.html#unix_only">unix_only</a> </tt> </blockquote> <p>The default parameters are: </p> <blockquote> <tt> fifo /dev/imt1<br> port 5137<br> unix /tmp/.IMT%d</tt> </blockquote> <p><b> Configuration</b></p> <p>An <i>IRAF</i> image server uses a configuration file to specify the number of available buffers and their sizes. What actually passes from IRAF is not the buffer size, but an index number into this file. </p> <p>So when an image server starts (DS9), it will attempt to locate this file as <tt>$HOME/.imtoolrc</tt> and /<tt>usr/local/lib/imtoolrc</tt>. If not found, it will look for shell environment variables <tt>IMTOOLRC</tt> and <tt>imtoolrc</tt>, that contains the name of the configuration file. </p> <p>If no configuration file is found, DS9 will assume the following default configuration: </p> <blockquote> <tt> 1 2 512 512 # imt1|imt512 <br> 2 2 800 800 # imt2|imt800 <br> 3 2 1024 1024 # imt3|imt1024 <br> 4 1 1600 1600 # imt4|imt1600 <br> 5 1 2048 2048 # imt5|imt2048 <br> 6 1 4096 4096 # imt6|imt4096 <br> 7 1 8192 8192 # imt7|imt8192 <br> 8 1 1024 4096 # imt8|imt1x4 <br> 9 2 1144 880 # imt9|imtfs full screen (1152x900 minus frame) <br> 10 2 1144 764 # imt10|imtfs35 full screen at 35mm film aspect ratio <br> 11 2 128 128 # imt11|imt128 <br> 12 2 256 256 # imt12|imt256 <br> 13 2 128 1056 # imt13|imttall128 tall &amp; narrow for spectro. <br> 14 2 256 1056 # imt14|imttall256 tall &amp; wider for spectro. <br> 15 2 1056 128 # imt15|imtwide128 wide &amp; thin for spectro. <br> 16 2 1056 256 # imt16|imtwide256 wide &amp; fatter for spectro. <br> 17 2 1008 648 # imt17|imtssy Solitaire fmt w/ imtool border <br> 18 2 1024 680 # imt18|imtssn Solitaire fmt w/out imtool border <br> 19 1 4096 1024 # imt19|imt4x1</tt> </blockquote> <p>If on the other hand, IRAF assumes a different buffer size, the image will appear corrupted and DS9 may issue a number of error messages. </p> <p>Another problem is that this file must be in sync with <tt>dev$graphcap</tt>. If your system administrator has made changes to <tt>graphcap</tt>, they must also be implemented in <tt>imtoolrc</tt>. </p> <p>Here is a note from NOAO: </p> <blockquote> <p><tt>The messages means that there is no /usr/local/lib/imtoolrc file on the machine. This is created as a symlink to dev$imtoolrc by the iraf install script but only if the /usr/local/lib dir already exists on the machine. The fix is the create the dir and rerun the install script or else make the link by hand. Users can also just copy dev$imtoolrc to $HOME/.imtoolrc and restart the server to also workaround it. Note that an existing .imtoolrc might define old frame buffer configs which might confuse things, so if the system file exists check for a private copy screwing things up.</tt></p> </blockquote> <p><b> Windows DS9 and IRAF</b></p> <p>To direct image output from IRAF to DS9 running under windows, use the <tt>IMTDEV</tt> environment variable. For example, if the windows machine is named 'foo.bar.edu', define <tt>IMTDEV</tt> to the follow value before entering IRAF. </p> <blockquote> <tt>$ setenv IMTDEV inet:5137:foo.bar.edu<br> $ cl <br> cl&gt; display dev$pix</tt> </blockquote> <p><b> Scale Menu Disabled</b></p> <p>When you display an image from <i>IRAF</i> into DS9, <i>IRAF</i> actually does the color scale distribution. In <tt>Display</tt>, use the <tt>ztrans</tt> and <tt>z1</tt>,<tt>z2</tt><tt>zscale</tt> parameter to auto determine <tt>z1,z2. Here</tt> are the <tt>DISPLAY</tt> parameters in question: parameters to set the upper/lower bounds and distribution. You can also use the </p> <blockquote> <tt> ztrans=[linear|log|none|user]<br> z1=min<br> z2=max<br> zscale=[yes|no]</tt> </blockquote> <p>What actually is sent from <i>IRAF</i> to DS9 is one byte per pixel, values 0-200, which already has applied both the upper and lower clipping bounds and the distribution. So this is why, the <tt>SCALE </tt>menu is disabled in DS9 when it receives a image from <i>IRAF</i>.</p> <p><b>MSCRED/MSCZERO<br> </b></p> <p>DS9 now supports IRAF's new IIS image display protocol. However, there is one minor problem with the <b>mscred</b> task <b>msczero.</b> Before using <b>msczero</b>, issue the following command in the cl:</p> <blockquote> <tt>cl&gt; set disable_wcs_maps=""<br> cl&gt; flpr</tt><br> </blockquote> <p><b>IMEXAMINE</b></p> <p>Due to the unique relationship between DS9 and IRAF, if you use the <b>imexamine</b> task, you can take advantage of a special feature of DS9. Instead of loading the image from IRAF with the <b>display</b> task, load the image directly into DS9. Then, from the <b>cl</b> prompt, invoke <b>imexamine</b> without a filename. IRAF will ask DS9 for the current filename and use it for analysis. This approach provides several advantages over previous methods. First, it will work with compound fits images such as mosaics, data cubes, and rgb images. Second, the image displays includes true image data and WCS information, not the approximated data from IRAF. </p> </blockquote> </body> </html> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/keyboard.html��������������������������������������������������������������������000644 �000765 �000000 �00000021645 12412610202 017070� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Mouse and Keyboard</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" height="98" width="100"> Mouse and Keyboard</h3> <blockquote> <p><b> Mouse Buttons</b></p> <p>The following table contains the event bindings for the mouse buttons. </p> <center> <table nosave="" border="1" width="75%"> <tbody> <tr> <td> <center>Mouse Button</center> </td> <td> <center>Description</center> </td> </tr> <tr> <td><font face="Courier New,Courier">Button 1</font></td> <td>Depends on current MODE, which may be selected by the EDIT menu option.<br> In Region mode, create/edit/delete regions.<br> In Crosshair mode, will move current crosshair.<br> In Colorbar mode, will change contrast and bias of colormap.<br> In Pan mode, will move or pan to clicked location.<br> In Zoom mode, will zoom about clicked location.<br> In Rotate mode, will rotate image about center.<br> In Crop mode, will select 2-D crop region. For 3-D <i>Shift-click</i> will edit front clip plane, <i>Control-click</i> will edit back clip plane.<br> In Catalog mode, will select catalog regions.<br> In examine mode, will follow IRAF examine protocol.<br> </td> </tr> <tr> <td><font face="Courier New,Courier">Button 2</font></td> <td>Pan mode: will move or pan to clicked location. Behavior depends on the PAN preference settings.</td> </tr> <tr> <td><font face="Courier New,Courier">Button 3</font></td> <td>Colorbar mode: will change the contrast and bias of the colormap.</td> </tr> </tbody> </table> </center> <p><b>Greek and other special characters.</b> </p> <p>The concept of a separate <tt>SYMBOL</tt> font is no longer implemented with the latest OS font and scripting support, especially with scalable anti-alias fonts such as Xft for Linux. Most newer fonts (if not all) now have greek characters as part of the font. The greek characters start at unicode \u0391 for 'A' and \u03b1 for 'a'. Each OS has a tool used to build and copy a string of characters. Then use the Edit:Paste menu of DS9 to insert the character string.</p> <blockquote> <p>Linux- Gnome: <b>gucharmap<br> </b>Linux- KDE: <b>kcharselect<br> </b>MacOSX: <b>Character Viewer</b> (Select <tt>Edit:Special Characters</tt>) Now click and drag the characters to a terminal window. Then select the string and select <tt>Edit:Copy</tt>.<br> Windows: <b>Character Map</b> (from <tt>Start</tt> button, select <tt>All Programs</tt>, <tt>Accessories</tt>, <tt>System Tools</tt> and then <tt>Character Map</tt>)</p> </blockquote> <p><b>Keyboard Shortcuts</b></p> <p>The following table contains the list of keyboard shortcuts and the resulting action taken.&nbsp; </p> <center> <table nosave="" border="1" width="75%"> <tbody> <tr> <td align="center"> Key Stroke </td> <td> <center>Description</center> </td> </tr> <tr> <td align="center"><tt>TAB</tt></td> <td><font face="Courier New,Courier">G</font>oto next frame</td> </tr> <tr> <td align="center" valign="top"><tt>Shift-TAB</tt><br> </td> <td valign="top">Goto previous frame<br> </td> </tr> <tr> <td align="center"><tt>DELETE</tt></td> <td>Deletes selected regions</td> </tr> <tr> <td align="center">c<br> </td> <td>Print Mouse Coordinates and Pixel value.</td> </tr> <tr> <td align="center">f<br> </td> <td>Toggles Infobox freeze</td> </tr> <tr> <td align="center">i<br> </td> <td>Set include property for region</td> </tr> <tr> <td align="center">e<br> </td> <td>Set exclude property for region</td> </tr> <tr> <td align="center">s<br> </td> <td>Set source property for region</td> </tr> <tr> <td align="center">b<br> </td> <td>Set background property for region</td> </tr> <tr> <td align="center">g<br> </td> <td>Create a new group</td> </tr> <tr> <td align="center"><tt>Shift-g</tt></td> <td>Create a new group with default name</td> </tr> <tr> <td align="center"><tt>+</tt></td> <td>Goto next 3D Fits Slice</td> </tr> <tr> <td align="center"><tt>-</tt></td> <td>Goto previous 3D Fits Slice</td> </tr> <tr> <td align="center"><tt>Up Arrow<br> k<br> </tt></td> <td>Will move selected regions up one pixel. <br> In Pointer mode, will move the cursor up one pixel. <br> In Crosshair mode, will move the crosshair up one pixel. <br> In Pan mode, will pan the image up one pixel.</td> </tr> <tr nosave=""> <td align="center"><tt>Right</tt><font face="Courier New,Courier"> </font><tt>Arrow<br> l<br> </tt></td> <td nosave="">Will move selected regions to the right one pixel. <br> In Pointer mode, will move the cursor to the right one pixel. <br> In Crosshair mode, will move the crosshair to the right one pixel. <br> In Pan mode, will pan the image to the right one pixel.</td> </tr> <tr> <td align="center"><tt>Left</tt><font face="Courier New,Courier"> </font><tt>Arrow<br> h<br> </tt></td> <td>Will move selected regions to the left one pixel. <br> In Pointer mode, will move the cursor to the left one pixel. <br> In Crosshair mode, will move the crosshair to the left one pixel. <br> In Pan mode, will pan the image to the left one pixel.</td> </tr> <tr> <td align="center"><tt>Down</tt><font face="Courier New,Courier"> </font><tt>Arrow<br> j<br> </tt></td> <td>Will move selected regions down one pixel. <br> In Pointer mode, will move the cursor up down one pixel. <br> In Crosshair mode, will also move the crosshair down one pixel. <br> In Pan mode, will pan the image down one pixel.</td> </tr> <tr> <td align="center"><tt>Shift</tt><font face="Courier New,Courier">-</font><tt>Drag</tt></td> <td>In Pointer mode, will select all regions within the indicated region.<br> In Crop mode, for 3D frame, will move front crop plane forward.<br> </td> </tr> <tr> <td align="center"><tt>Control-Drag</tt></td> <td>In Poiner mode, on selected <tt>ANNULUS</tt> Regions, will create new radii.<br> In Crop mode, for 3D frame, will move back crop plane backward.<br> </td> </tr> <tr> <td align="center" valign="top"><tt>Command-`</tt><br> </td> <td valign="top">Rotate thur all open windows<br> </td> </tr> </tbody> </table> </center> </blockquote> </body> </html> �������������������������������������������������������������������������������������������saods9/ds9/doc/ref/prefs.html�����������������������������������������������������������������������000644 �000765 �000000 �00000003145 11426312317 016414� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Preferences</title> </head> <body alink="#ff0000" bgcolor="#ffffff" link="#0000ff" text="#000000" vlink="#551a8b"> <h3><img alt="" src="../sun.gif" align="middle" height="98" width="100"> Preferences</h3> <blockquote> <p>Allows the user to customize the appearance and behavior of the GUI . Please note: some preferences take effect immediately, while others require DS9 to be restarted. Changes to the preferences can be saved by selecting the <tt>Save</tt> button<tt>. </tt>Use the <tt>Clear Preferences </tt>button to restore default settings.</p> <p>User preferences are stored in <tt>.ds9.prf</tt>. DO NOT EDIT this file, since it will be deleted or overwritten by DS9. At startup time, DS9 will search for a preferences file in the following directories, in order, <tt>./, $HOME, /usr/local/lib, /opt/local/lib</tt>. </p> <p>Users may have several different preference files. DS9 looks for a preference file with its own name. By default, if the application is named <tt>ds9</tt>, it will look for <tt>.ds9.prf.</tt> However, if the DS9 application is named <tt>foo</tt>, then DS9 will look for <tt>.foo.prf.</tt> In this manner, the user can have several predefined preference files that are activated by invoking DS9 with a different application names. </p> </blockquote> </body> </html> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/print.html�����������������������������������������������������������������������000644 �000765 �000000 �00000004120 11426312317 016423� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Printing</title> </head> <body alink="#ff0000" bgcolor="#ffffff" vlink="#551a8b" text="#000000" link="#0000ee"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Printing</h3> <blockquote> <p>DS9 provides strong Postscript printing support. This is not a screen capture method, but a full level 1 and level 2 postscript driver. The postscript images generated are detailed and accurate as possible, given the resolution of the data, and the printing resolution. </p> <p><b> Postscript Level</b></p> <blockquote> <p> Level 1-- The postscript generated consist of a color lookup table and image data, encoded in <tt>ASCIIHEX</tt>. All line graphics and text are postscript elements.</p> <p> Level 2-- The postscript generated consist of a color lookup table and image data, compressed with RLE, and encoded in <tt>ASCIIHEX85. </tt>All line graphics and text are postscript elements.</p> </blockquote> <p><b> Postscript Color Model</b></p> <p>DS9 supports three color models for level 2 postscript. All three color models generate approximately the same size files. </p> <blockquote><tt> RGB<br> CMYK<br> Grayscale<br> </tt></blockquote> <p><b> Resolution</b></p> <p>Most printers dither to achieve various levels of gray or color. So a 300 dpi printer's affective resolution may only be 53 dpi after dithering. This is fine for analysis and proofs. On the other hand, when generating images for publication, color separation is used to achieve the full resolution of the printer . A 150 dpi CMYK image will generate four 150 dpi images (one for each color). In general, select the lowest resolution possible,&nbsp; as postscript file size grows by the square of the increase.</p> </blockquote> </body> </html> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/region.html����������������������������������������������������������������������000644 �000765 �000000 �00000070677 12576340574 016613� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Regions</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> </head> <body alink="#ff0000" bgcolor="#ffffff" text="#000000" vlink="#551a8b" link="#0000ff"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Regions</h3> <blockquote> <p>Regions provide a means for marking particular areas of an image for further analysis. Regions may also be used for presentation purposes. DS9 supports a number of region descriptions, each of which may be edited, moved, rotated, displayed, saved and loaded, via the GUI and XPA.</p> <a href="#RegionDescriptions">Region Descriptions</a><br> <a href="#RegionProperties">Region Properties</a><br> <a href="#RegionFileFormat">Region File Format</a><br> <a href="#CompositeRegion">Composite Region</a><br> <a href="#TemplateRegion">Template Region</a><br> <a href="#ExternalRegionFiles">External Region Files</a><br> <p><b> <a name="RegionDescriptions"></a>Region Descriptions</b></p> <p><tt>Circle<br> Usage: circle x y radius<br> </tt></p> <p><tt>Ellipse<br> Usage: ellipse x y radius radius angle<br> </tt></p> <p><tt>Box <br> Usage: box x y width height angle<br> </tt></p> <p><tt>Polygon <br> Usage: polygon x1 y1 x2 y2 x3 y3 ...<br> </tt></p> <p><tt>Point <br> Usage: point x y # point=[circle|box|diamond|cross|x|arrow|boxcircle] [size]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; circle point x y&nbsp;</tt></p> <p><tt>Line <br> Usage: line x1 y1 x2 y2 # line=[0|1] [0|1] </tt></p> <p><tt>Vector <br> Usage: vector x1 y1 length angle # vector=[0|1] </tt></p> <p><tt>Text <br> Usage: text x y # text={Your Text Here}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text x y {Your Text Here} </tt></p> <p><tt>Ruler <br> Usage: ruler x1 y1 x2 y2 # ruler=[pixels|degrees|arcmin|arcsec]</tt></p> <p><tt>Compass <br> Usage: compass x1 y1 length # compass=&lt;coordinate system&gt; &lt;north label&gt; &lt;east label&gt; [0|1] [0|1] </tt></p> <p><tt>Projection <br> Usage: projection x1 y1 x2 y2 width</tt></p> <p><tt>Annulus <br> Usage: annulus x y inner outer n=# <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; annulus x y r1 r2 r3... </tt></p> <p><tt>Ellipse Annulus <br> Usage: ellipse x y r11 r12 r21 r22 n=# [angle]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ellipse x y r11 r12 r21 r22 r31 r32 ... [angle] </tt></p> <p><tt>Box Annulus <br> Usage: box x y w1 h1 w2 h2 [angle] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; box x y w1 h1 w2 h2 w3 h3 ... [angle] </tt></p> <p><tt>Panda <br> Usage: panda x y startangle stopangle nangle inner outer nradius</tt></p> <p><tt>Epanda <br> Usage: epanda x y startangle stopangle nangle inner outer nradius [angle]</tt></p> <p><tt>Bpanda <br> Usage: bpanda x y startangle stopangle nangle inner outer nradius [angle]</tt></p> <p><tt>Composite<br> Usage: # composite x y angle</tt></p> <p><b> <a name="RegionProperties"></a>Region Properties</b></p> <p>Each region has a number of properties associated with the region, which indicates how the region is to be rendered or manipulated. Properties are defined for a region in the comment section of the region description. The exception is the Include/Exclude property. It is set via '+' or '-' preceding the region. In addition, the Line, Point, and Ruler regions have unique properties, not shared by others. Not all properties are available via the GUI or are applicable for all regions. </p> <blockquote> <p><b> Text</b></p> <p>All regions may have text associated with them. Use the text property to set the text. Strings may be quoted with " or ' or {}. For best results, use {}. </p> <tt>Example: circle(100,100,20) # text = {This message has both a " and ' in it}</tt> <p><b> Color</b></p> <p>The color property specifies the color of the region when rendered. DS9 recognizes many symbolic color names (i.e. "red", "green", "blue", "pink", etc) along with 3, 6, and 9 digit RGB hex values (#fff, #ffffff, #fffffffff)<br> </p> <tt>Example: <br> circle(100,100,20) # color=green<br> </tt><tt>circle(100,100,20) # color=#48f</tt> <p><b>Dash List</b></p> <p>Sets dashed line parameters. This does not render the region in dashed lines.</p> <tt>Example: circle(100,100,20) # dashlist = 8 3</tt><br> <p><b>Width</b></p> <p>Sets the line width used to render the region.</p> <tt>Example: circle(100,100,20) # width = 2</tt><br> <p><b>Font</b></p> <p>The font property specifies the font family, size, weight, and slant of any text to be displayed along with the region. </p> <tt>Example: circle(100,100,20) # font="times 12 bold italic"</tt> <p><b> Can Select</b></p> <p>The Select property specifies if the user is allowed to select (hence, edit) the region via the GUI. For Regions used for catalogs and such, it is desirable that the user is unable to edit, move, or delete the region.<br> </p> <tt>Example: circle(100,100,20) # select = 1</tt><br> <p><b>Can Highlite</b></p> The Highlite property specifies if the edit handles become visible when the region is selected.<br> <tt>Example: circle(100,100,20) # hightlite = 1</tt><br> <p><b>Dash</b></p> <p>Render region using dashed lines using current <tt>dashlist</tt> value.</p> <tt>Example: circle(100,100,20) # dash = 1</tt><br> <p><b>Fixed in Size</b></p> <p>The Fixed in Size property specifies that the region does not change in size as the image magnification factor changes. This allows the user to build complex pointer type regions. </p> <tt>Example: circle(100,100,20) # fixed = 1</tt> <p><b> Can Edit</b></p> <p>The Edit property specifies if the user is allowed to edit the region via the GUI. </p> <tt>Example: circle(100,100,20) # edit = 1</tt> <p><b> Can Move</b></p> <p>The Move property specifies if the user is allowed to move the region via the GUI. </p> <tt>Example: circle(100,100,20) # move = 1</tt> <p><b> Can Rotate</b></p> <p>The Rotate property specifies if the user is allowed to rotate the region via the GUI. </p> <tt>Example: circle(100,100,20) # rotate = 1</tt> <p><b> Can Delete</b></p> <p>The Delete property specifies if the user is allowed to delete the region via the GUI. </p> <tt>Example: circle(100,100,20) # delete = 1</tt> <p><b> Include/Exclude</b></p> <p>The Include/Exclude properties flags the region with a boolean <tt>NOT </tt>for later analysis. Use '+' for include (default), '-' for exclude. </p> <tt>Example: -circle(100,100,20)<br> </tt> <p><b>Source/Background</b></p> <p>The Source/Background properties flag the region for use with other analysis applications. The default is <tt>source</tt></p> <tt>Example: circle(100,100,20) # source<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;circle(200,200,10) # background</tt><br> <p><b>Tag</b></p> <p>All regions may have zero or more tags associated with it, which may be used for grouping and searching. </p> <tt>Example:&nbsp; circle(100,100,20) # tag = {Group 1} tag = {Group 2}</tt> <p><b> Line</b></p> <p>The line region may be rendered with arrows, one at each end. To indicate arrows, use the line property. A '1' indicates an arrow, '0' indicates no arrow. </p> <tt>Example: line(100,100,200,200) # line= 1 1</tt> <p><b> Ruler</b></p> <p>The ruler region may display information in 'pixels', 'degrees', 'arcmin', or 'arcsec'. Use the ruler property to indicate which format to display distances in. </p> <tt>Example: ruler(100,100,200,200) # ruler=arcmin</tt> <p><b> Point</b></p> <p>Point regions have an associated type and size. Use the point property to set the point type. </p> <tt>Example: point(100,100) # point=diamond 31</tt> <p><b> Default Properties</b></p> <p>The default properties are: </p> <blockquote> <tt>text={}</tt> <br> <tt>color=green</tt> <br> <tt>font="helvetica 10 normal roman"</tt> <br> <tt>select=1</tt> <br> <tt>edit=1</tt> <br> <tt>move=1</tt> <br> <tt>delete=1</tt> <br> <tt>highlite=1</tt> <br> <tt>include=1</tt> <br> <tt>fixed=0</tt> </blockquote> </blockquote> <p><b><a name="RegionFileFormat"></a>Region File Format</b></p> <blockquote> <p><b> Syntax</b></p> <p>Region arguments may be separated with either a comma or space. Optional parentheses may be used a the beginning and end of a description. </p> <blockquote> <tt>circle 100 100 10</tt> <br> <tt>circle(100 100 10)</tt> <br> <tt>circle(100,100,10)</tt> </blockquote> <p><b> Comments</b></p> <p>All lines that begin with <tt>#</tt> are comments and will be ignored.</p> <blockquote> <tt># This is a comment</tt> </blockquote> <p><b> Delimiter</b></p> <p>All lines may be delimited with either a new-line or semi-colon. </p> <blockquote> <tt>circle 100 100 10</tt> <br> <tt>ellipse 200 200 20 40 ; box 300 300 20 40</tt> </blockquote> <p><b> Header</b></p> <p>A DS9 region file may start with the following optional header: </p> <blockquote> <tt># Region file format: DS9 version 4.0</tt> </blockquote> <p><b> Global Properties</b></p> <p>Global properties affect all regions unless a local property is specified. The <tt>global</tt> keyword is first, followed by a list of keyword = value pairs. Multiple global property lines may be used within a region file. </p> <blockquote> <tt>global color=green font="helvetica 10 normal roman" edit=1 move=1 delete=1 highlite=1 include=1 wcs=wcs</tt> </blockquote> <p><b> Local Properties</b></p> <p>Local properties start with a # after a region description and only affect the region it is specified with. </p> <blockquote> <tt>physical;circle(504,513,20) # color=red text={This is a Circle}</tt> </blockquote> <p><b> Coordinate Systems</b></p> <p>For each region, it is important to specify the coordinate system used to interpret the region, i.e., to set the context in which the position and size values are interpreted. For this purpose, the following keywords are recognized: </p> <blockquote> <tt>PHYSICAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # pixel coords of original file using LTM/LTV</tt> <br> <tt>IMAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # pixel coords of current file</tt> <br> <tt>FK4, B1950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sky coordinate systems</tt> <br> <tt>FK5, J2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sky coordinate systems</tt> <br> <tt>GALACTIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sky coordinate systems</tt> <br> <tt>ECLIPTIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sky coordinate systems</tt> <br> <tt>ICRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # currently same as J2000</tt> <br> <tt>LINEAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # linear wcs as defined in file</tt> <br> <tt>AMPLIFIER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mosaic coords of original file using ATM/ATV</tt> <br> <tt>DETECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mosaic coords of original file usingDTM/DTV</tt> </blockquote> <p><b> Mosaic Images</b></p> <p>While some coordinate systems are unique across mosaic images, others coordinate systems, such as <tt>image</tt>, or <tt>physical</tt> , are valid on a per segment basis. In this case, use <tt>tile</tt> to specify which header to use in all coordinate conversions. The default is the first header, or <tt>tile 1</tt>. </p> <tt>Example: tile 2;fk5;point(100,100)</tt> <p><b> Multiple WCS</b></p> <p>If an image has multiple wcs's defined, use <tt>wcs#</tt> to specify which wcs to use for all wcs references. Valid values are <tt>wcs, wcsa, wcsb, wcsc... wcsz.</tt><br> <tt>Example: wcsa;linear;point(100,100) # point=diamond</tt></p> <p><b> Specifying Positions and Sizes</b></p> <p>The arguments to region shapes can be floats or integers describing positions and sizes. They can be specified as pure numbers or using explicit formatting directives: </p> <blockquote> <p><b>position arguments</b> </p> <tt>[num]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # context-dependent (see below)</tt> <br> <tt>[num]d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # degrees</tt> <br> <tt>[num]r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # radians</tt> <br> <tt>[num]p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # physical pixels</tt> <br> <tt>[num]i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # image pixels</tt> <br> <tt>[num]:[num]:[num]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # hms for 'odd' position arguments</tt> <br> <tt>[num]:[num]:[num]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # dms for 'even' position arguments</tt> <br> <tt>[num]h[num]m[num]s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # explicit hms</tt> <br> <tt>[num]d[num]m[num]s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # explicit dms</tt> <p><b>size arguments</b> </p> <tt>[num]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # context-dependent (see below)</tt> <br> <tt>[num]"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # arc sec</tt> <br> <tt>[num]'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # arc min</tt> <br> <tt>[num]d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # degrees</tt> <br> <tt>[num]r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # radians</tt> <br> <tt>[num]p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # physical pixels</tt> <br> <tt>[num]i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # image pixels</tt> <p></p> </blockquote> <p>When a "pure number" (i.e. one without a format directive such as 'd' for 'degrees') is specified, its interpretation depends on the context defined by the 'coordsys' keyword. In general, the rule is: </p> <p><i>All pure numbers have implied units corresponding to the current coordinate system.</i> </p> <p>If no such system is explicitly specified, the default system is implicitly assumed to be <tt>PHYSICAL</tt>. In practice this means that for <tt>IMAGE</tt> and <tt>PHYSICAL</tt> systems, pure numbers are pixels. Otherwise, for all systems other than linear, pure numbers are degrees. For <tt>LINEAR</tt> systems, pure numbers are in the units of the linear system. This rule covers both positions and sizes. The input values to each shape can be specified in several coordinate systems including: </p> <blockquote> <tt>IMAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # pixel coords of current file</tt> <br> <br> <tt>LINEAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # linear wcs as defined in file</tt> <p><tt>FK4, B1950&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # sky coordinate systems</tt> <br> <tt>FK5, J2000</tt> <br> <tt>GALACTIC</tt> <br> <tt>ECLIPTIC</tt> <br> <tt>ICRS</tt> <br> <tt>PHYSICAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # pixel coords of original file using LTM/LTV</tt> <br> <tt>AMPLIFIER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mosaic coords of original file using ATM/ATV</tt> <br> <tt>DETECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mosaic coords of original file using DTM/DTV</tt><br> <br> <tt>WCS,WCSA-WCSZ&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; # specify which WCS system to be used for <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # linear and sky coordinate systems<br> </tt></p> </blockquote> <p>If no coordinate system is specified, <tt>PHYSICAL</tt> is assumed. <tt>PHYSICAL</tt> or a World Coordinate System such as <tt>J2000</tt> is preferred and most general. The coordinate system specifier should appear at the beginning of the region description, on a separate line (in a file), or followed by a new-line or semicolon; e.g., </p> <blockquote> <tt>image; circle 100 100 10</tt> <br> <tt>physical; ellipse 200 200 10 20</tt> <br> <tt>fk5; point 30 50</tt><br> <tt>wcsa; fk4; point 202 47</tt><br> <tt>wcsp; linear; point 100 100</tt><br> </blockquote> <p>The use of celestial input units automatically implies WORLD coordinates of the reference image. Thus, if the world coordinate system of the reference image is <tt>J2000</tt>, then</p> <blockquote> <tt>circle 10:10:0 20:22:0 3'</tt> </blockquote> <p>is equivalent to: <br> </p> <blockquote> <tt>j2000; circle 10:10:0 20:22:0 3'</tt> </blockquote> <p>Note that by using units as described above, you may mix coordinate systems within a region specifier; e.g., </p> <blockquote> <tt>physical; circle 6500 9320 3'<br> </tt></blockquote> <p>Note that, for regions which accept a rotation angle such as: </p> <blockquote> <tt>ellipse (x, y, r1, r2, angle)<br> box(x, y, w, h, angle)</tt> <p></p> </blockquote> <p>the angle is relative to the specified coordinate system. In particular, if the region is specified in WCS coordinates, the angle is related to the WCS system, not x/y image coordinate axis. For WCS systems with no rotation, this obviously is not an issue. However, some images do define an implicit rotation (e.g., by using a non-zero CROTA value in the WCS parameters) and for these images, the angle will be relative to the WCS axes. In such case, a region specification such as:</p> <blockquote> <tt>fk4;ellipse(22:59:43.985, +58:45:26.92,320", 160", 30)</tt> </blockquote> <p>will not, in general, be the same region specified as:</p> <blockquote> <tt>physical;ellipse(465, 578, 40, 20, 30)</tt> </blockquote> <p>even when positions and sizes match. The angle is relative to WCS axes in the first case, and relative to physical x,y axes in the second.</p> </blockquote> <p><b><a name="CompositeRegion"></a>Composite Region</b></p> <p>A Composite Region is a region which is a collection of other regions, which share common properties. A composite region is composed of a center point and a rotation angle, of which all its members are rendered in reference to. A composite region is defined by the # composite x y angle declaration followed by a number of regions who are or'd together. A composite region is manipulated as a single region within ds9. A composite region maybe created from the current selection of regions by selecting the Create Composite Region menu option. Likewise, a composite region can be dissolved by selecting the Dissolve Composite Region menu option.</p> <p><b> <a name="TemplateRegion"></a>Template Region</b></p> <p>A Template Region is a special form of a region which is saved in a special wcs coordinate system WCS0. WCS0 indicates that the ra and dec values are relative to the current WCS location, not absolute. A template region can be loaded at any location into any fits image which contains a valid wcs. For example, a user may create a series of regions, which represent an instrument template. Then, by selecting the Save As Template menu option, a template region saved. The user may now load this templated into any other fits image which contains a valid WCS. </p> <p><b> <a name="ExternalRegionFiles"></a>External Region Files</b></p> <p>DS9 can read and write a number of region file formats. Not all formats support all the functionality of DS9 regions. Therefore, the user may loose some information when writing and then reading back from a region file in a format other that DS9. On output, the regions File Format menu or the <a href="xpa.html#regions">XPA</a> regions point is used specify the output coordinate system and format. On input, the menu or xpa point is used only for the <tt>X Y </tt>format. For all other formats, the input coordinate system is specified in the regions file itself. </p> <blockquote> <p><b> <a name="FUNTools"></a><a href="http://hea-www.harvard.edu/RD/funtools/regions.html">Funtools</a></b><tt></tt><br> </p> <blockquote> <tt>TEXT is ignored<br> </tt> <tt>VECTOR is ignored</tt> <br> <tt>PROJECTION is ignored</tt><tt></tt><br> <tt>RULER is ignored</tt><br> <tt>COMPASS is ignored<br> FIELD is ignored<br> PIE is ignored<br> </tt> <tt> All properties are ignored</tt><br> </blockquote> <a name="Ciao"></a>CIAO <blockquote> <tt> All point regions are translated as POINT</tt><br> <tt>BOX is translated as ROTBOX<br> </tt> <tt>LINE is ignored</tt><br> <tt>VECTOR is ignored</tt> <br> <tt>RULER is ignored</tt><br> <tt>COMPASS is ignored</tt><br> <tt>TEXT is ignored</tt><tt></tt><br> <tt>PROJECTION is ignored</tt><tt></tt><br> <tt>ELLIPSE ANNULUS is ignored</tt><br> <tt>BOX ANNULUS is ignored</tt><br> <tt>PANDA is translated as PIE</tt><br> <tt>EPANDA is ignored</tt><br> <tt>BPANDA is ignored</tt><br> <tt> All properties are ignored</tt><br> </blockquote> <a name="SAOimage"></a><a href="http://tdc-www.harvard.edu/software/saoimage/saoimage.region.html">SAOimage</a> <blockquote> <tt> All point regions are translated as </tt><tt>POINT</tt><tt></tt><br> <tt>LINE is ignored</tt><br> <tt>VECTOR is ignored</tt> <br> <tt>TEXT is ignored</tt><br> <tt>PROJECTION ignored</tt><br> <tt>PROJECTION3D is ignored</tt><br> <tt>RULER is ignored</tt><br> <tt>COMPASS is ignored</tt><br> <tt>PANDA is ignored</tt><br> <tt>EPANDA is ignored</tt><br> <tt>BPANDA is ignored</tt><br> <tt> All properties are ignored</tt><br> </blockquote> <a name="IRAFPROS"></a>IRAF PROS <blockquote> <tt> All point regions are translated as </tt><tt>POINT</tt><tt></tt><br> <tt>LINE is ignored</tt><br> <tt>VECTOR is ignored</tt> <br> <tt>TEXT is ignored</tt><br> <tt>RULER is ignored</tt><br> <tt>COMPASS is ignored</tt><br> <tt>PROJECTION ignored</tt><br> <tt>PROJECTION3D is ignored</tt><br> <tt>PANDA is ignored</tt><br> <tt>EPANDA is ignored</tt><br> <tt>BPANDA is ignored</tt><br> <tt> All properties are ignored</tt><br> </blockquote> <a name="FITSREGIONBinaryTable"></a>FITS REGION Binary Table <blockquote> <tt> Read Only. DS9 currently can not write in this format.</tt><br> <tt>POINT is translated into BOX CIRCLE POINT</tt><br> <tt>ROTBOX is translated into BOX</tt><br> <tt>RECTANGLE is translated into BOX</tt><br> <tt>ROTRECTANGLE is translated into a BOX</tt><br> <tt>PIE is translated into PANDA</tt><br> <tt> The follow regions are not supported</tt><br> <blockquote> <tt>DIAMOND</tt><br> <tt>RHOMBUS</tt><br> <tt>ROTDIAMOND</tt><br> <tt>ROTRHOMBUS</tt><br> </blockquote> </blockquote> <a name="XY"></a>X Y <br> <p>This format consists of a number of coordinate pairs, one per line. The coordinate format for both input and output is specified via the Save Regions Parameters menu or <a href="xpa.html#regions">XPA</a> regions point. The first two coordinates are read, the rest of the line is ignored. The comment character '#' may be used at the beginning of line and the line is ignored. This format is very useful for reading in coordinates from other external analysis programs, such as IRAF. </p> <blockquote> <tt>Example:</tt> <tt># this is a comment</tt> <br> <tt>physical # this overrides the specified coordinate system</tt><br> <tt>300 300</tt> <br> <tt>400 400 # this is a comment</tt> <br> </blockquote> </blockquote> </blockquote> </body> </html> �����������������������������������������������������������������saods9/ds9/doc/ref/samp.html������������������������������������������������������������������������000644 �000765 �000000 �00000444634 12576612221 016255� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>SAMP</title> </head> <body alink="#ff0000" vlink="#551a8b" link="#0000ff"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> SAMP</h3> <blockquote> <p>SAMP is a messaging protocol that enables astronomy software tools to interoperate and communicate. Broadly speaking, SAMP is an abstract framework for loosely-coupled, asynchronous, RPC-like and/or event-based communication, based on a central service providing multi-directional publish/subscribe message brokering. The message semantics are extensible and use structured but weakly-typed data. For more information on SAMP, please click <a href="http://www.ivoa.net/Documents/latest/SAMP.html">here</a>.</p> <p>The samp implementation for DS9 is based on the <a href="xpa.html">XPA</a> model with 2 private calls:</p> <tt> ds9.get<br> &nbsp;&nbsp;&nbsp; Arguments<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmd (string) required<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; url (string) optional<br> &nbsp;&nbsp;&nbsp; Returned value<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OK (samp.result map)<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; value (string) optional<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; url (string) optional<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ERROR (samp.error map)<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; samp.errortxt (string)<br> &nbsp;<br> ds9.set<br> &nbsp;&nbsp;&nbsp; Arguments<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmd (string) required<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; url (string) optional<br> &nbsp;&nbsp;&nbsp; Returned value<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OK<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ERROR (samp.error map)<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; samp.errortxt (string)<br> </tt> <p><tt>ds9.set</tt> maybe called via notification, call and call/wait. <tt>ds9.get</tt> can only be called via call and call/wait. Most of the <tt>ds9.get</tt> calls return a value string, but a few will return a url instead.</p> <tt> <a href="#2mass">2mass</a><br> <a href="#3d">3d</a><br> <a href="#about">about</a><br> <a href="#analysis">analysis</a><br> <a href="#array">array</a><br> <a href="#background">background</a><br> <a href="#backup">backup</a><br> <a href="#bin">bin</a><br> <a href="#blink">blink</a><br> <a href="#block">block</a><br> <a href="#catalog">catalog</a><br> <a href="#cd">cd</a><br> <a href="#cmap">cmap</a><br> <a href="#colorbar">colorbar</a><br> <a href="#console">console</a><br> <a href="#contour">contour</a><br> <a href="#crop">crop</a><br> <a href="#crosshair">crosshair</a><br> <a href="#cube">cube</a><br> <a href="#cursor">cursor</a><br> <a href="#data">data</a><br> <a href="#dsssao">dsssao</a><br> <a href="#dsseso">dsseso</a><br> <a href="#dssstsci">dssstsci</a><br> <a href="#envi">envi</a><br> <a href="#exit">exit</a><br> <a href="#export">export</a><br> <a href="#file">file</a><br> <a href="#fits">fits</a><br> <a href="#frame">frame</a><br> <a href="#gif">gif</a><br> <a href="#grid">grid</a><br> <a href="#header">header</a><br> <a href="#height">height</a><br> <a href="#iconify">iconify</a><br> </tt><tt><a href="#iis"><tt></tt></a><tt><a href="#iexam">iexam</a><br> </tt><a href="#iis">iis</a><br> <a href="#image">image</a><br> <a href="#jpeg">jpeg</a><br> <a href="#lock">lock</a><br> <a href="#lower">lower</a><br> <a href="#magnifier">magnifier</a><br> <a href="#mask">mask</a><br> <a href="#match">match</a><br> <a href="#mecube">mecube</a><br> <a href="#minmax">minmax</a><br> <a href="#mode">mode</a><br> <a href="#mosaic">mosaic</a><br> <a href="#mosaicimage">mosaicimage</a><br> <a href="#movie">movie</a><br> <a href="#multiframe">multiframe</a><br> <a href="#nameserver">nameserver</a><br> <a href="#nan">nan</a><br> <a href="#nrrd">nrrd</a><br> <a href="#nvss">nvss</a><br> <a href="#orient">orient</a><br> <a href="#pagesetup">pagesetup</a><br> <a href="#pan">pan</a><br> <a href="#pixeltable">pixeltable</a><br> <a href="#plot">plot</a><br> <a href="#png">png</a><br> <a href="#prefs">prefs</a><br> <a href="#preserve">preserve</a><br> <a href="#psprint">psprint</a><br> <a href="#print">print</a><br> <a href="#exit">quit</a><br> <a href="#raise">raise</a><br> <a href="#regions">regions</a><br> <a href="#restore">restore</a><br> <a href="#rgb">rgb</a><br> <a href="#rgbarray">rgbarray</a><br> <a href="#rgbcube">rgbcube</a><br> <a href="#rgbimage">rgbimage</a><br> <a href="#rotate">rotate</a><br> <a href="#save">save</a><br> <a href="#saveimage">saveimage</a><br> <a href="#scale">scale</a><br> <a href="#shm">shm</a><br> <a href="#single">single</a><br> <a href="#skyview">skyview</a><br> <a href="#sleep">sleep</a><br> <a href="#smooth">smooth</a><br> <a href="#source">source</a><br> <a href="#threads">threads</a><br> <a href="#tcl">tcl</a><br> <a href="#tiff">tiff</a><br> <a href="#tile">tile</a><br> <a href="#update">update</a><br> <a href="#url">url</a><br> <a href="#version">version</a><br> <a href="#view">view</a><br> <a href="#vla">vla</a><br> <a href="#vo">vo</a><br> <a href="#wcs">wcs</a><br> <a href="#web">web</a><br> <a href="#width">width</a><br> <a href="#zscale">zscale</a><br> <a href="#zoom">zoom</a><br> </tt> <p><b> <a name="2mass"></a>2mass</b></p> <p>Support for 2MASS Digital Sky Survey.</p> <tt> Syntax: <br> 2mass []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp;&nbsp; [survey j|h|k]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> 2mass name <br> 2mass coord <br> 2mass size<br> 2mass save<br> 2mass frame<br> 2mass survey <br> ds9.set(string cmd)<br> 2mass<br> 2mass m31 <br> 2mass name m31 <br> 2mass coord 00:42:44.404 +41:16:08.78 sexagesimal<br> 2mass size 60 60 arcmin<br> 2mass save yes<br> 2mass frame current<br> 2mass update frame<br> 2mass survey j<br> 2mass open<br> 2mass close<br> </tt> <p><b> <a name="3d"></a>3d</b></p> <p>Support for 3D frame.</p> <tt> Syntax: <br> </tt><tt>3d []<br> &nbsp;&nbsp; [view &lt;az&gt; &lt;el&gt;]<br> &nbsp;&nbsp; [az &lt;az&gt;]<br> &nbsp;&nbsp; [el &lt;el&gt;]<br> &nbsp;&nbsp; [scale &lt;scale&gt;]<br> &nbsp;&nbsp; [method mip|aip]</tt><br> <tt><tt>&nbsp;&nbsp; [background none|azimuth|elevation]<br> </tt>&nbsp;</tt><tt>&nbsp; [border yes|no]<br> &nbsp;&nbsp; [border color &lt;color&gt;]<br> </tt><tt>&nbsp;&nbsp; [highlite yes|no]<br> &nbsp;&nbsp; [hightlite color &lt;color&gt;]<br> </tt><tt>&nbsp;&nbsp; [open|close]</tt><tt><br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> </tt><tt>3d view<br> 3d az<br> 3d el<br> 3d scale<br> 3d method</tt><br> <tt>3d background<br> </tt><tt>3d border<br> 3d border color<br> </tt> <tt> </tt><tt>3d highlite<br> 3d highlite color<br> </tt> <tt> ds9.set(string cmd)<br> </tt><tt>3d # create new 3D frame<br> 3d view 45 30<br> 3d az 45<br> 3d el 30<br> 3d scale 10<br> 3d method mip</tt><br> <tt>3d background azimuth<br> </tt><tt>3d border yes<br> 3d border color red<br> </tt><tt>3d highlite yes<br> 3d highlite color red<br> 3d open<br> 3d close</tt><br> <p><b><a name="about"></a>about</b></p> <p>Get DS9 credits.</p> <tt> Syntax: <br> about <br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd) <br> about<br> </tt> <p><b> <a name="align"></a>align</b></p> <p>Controls the World Coordinate System alignment for the current frame.</p> <tt> Syntax: <br> align []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd) <br> </tt>align<br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>align yes</tt><br> <p><b> <a name="analysis"></a>analysis</b></p> <p>Control external analysis tasks. Tasks are numbered as they are loaded, starting with 0. Can also be used to display a message and display text in the text dialog window. </p> <tt> Syntax: <br> analysis [&lt;task number&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [task &lt;task number&gt;|&lt;task name&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear][load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [message ok|okcancel|yesno &lt;message&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [entry &lt;message&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [text]</tt><tt><tt><tt><tt><tt><br> </tt></tt> &nbsp; </tt></tt> <br> Example:<br> string value = ds9.get(string cmd) <br> analysis<br> analysis task<br> analysis entry Please enter something<br> analysis entry okcancel Please enter something<br> ds9.set(string cmd)<br> analysis 0 # invoke first analysis task<br> analysis task 0<br> analysis task foobar<br> analysis task {foo bar}<br> analysis my.ans<br> analysis load my.ans <br> analysis clear <br> analysis clear load my.ans<br> analysis message ok {This is a message}<br> analysis text {this is text}</tt><tt><tt><br> </tt> ds9.set(string cmd, string url)<br> analysis load <br> analysis text</tt><b><br> </b> <p><b> <a name="array"></a>array</b></p> <p>Load raw data array into current frame.<br> </p> <tt> Syntax:<br> array [native|big|little]<br> array [new|mask] [[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],zdim=&lt;z&gt;,bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string url = ds9.get(string cmd)<br> </tt>array<br> array little<br> </tt><tt><tt>ds9.set(string command, string url)<br> </tt>array foo.arr[dim=512,bitpix=-32,endian=little]<br> array new foo.arr[dim=512,bitpix=</tt><tt>-32,endian=little]</tt><br> <tt><tt>array mask foo.arr[dim=512,bitpix=</tt></tt><tt>-32,endian=little]</tt><tt><br> </tt> <p><b> <a name="background"></a>bg<br> background</b></p> <p>Set image background color. </p> <tt> Syntax: <br> bg &lt;color&gt;<br> &nbsp;<br> Example:<br> </tt><tt>string url = ds9.get(string cmd)</tt><tt><br> bg<br> </tt><tt>ds9.set(string cmd)<br> </tt><tt>bg red</tt><tt><br> <tt>bg red</tt></tt><br> <p><b> <a name="backup"></a>backup</b></p> <p>Create a backup save set. </p> <tt> Syntax: <br> backup &lt;filename&gt;<br> &nbsp;<br> Example:<br> </tt><tt>ds9.set(string cmd)<br> </tt><tt>backup ds9.bck</tt><br> <p><b> <a name="bin"></a>bin</b></p> <p>Controls binning factor, binning buffer size, and&nbsp; binning function for binning FITS bin tables. The access point blocking is provided for backward compatibility. </p> <tt> Syntax: <br> bin [about &lt;x&gt; &lt;y&gt;]<br> &nbsp;&nbsp;&nbsp; [about center]<br> &nbsp;&nbsp;&nbsp; [buffersize &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp; [cols &lt;x&gt; &lt;y&gt;]<br> &nbsp;&nbsp;&nbsp; [colsz &lt;x&gt; &lt;y&gt; &lt;z&gt;]<br> &nbsp;&nbsp;&nbsp; [factor &lt;value&gt; [&lt;vector&gt;]]<br> &nbsp;&nbsp;&nbsp; [depth &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp; [filter &lt;string&gt;] <br> &nbsp;&nbsp;&nbsp; [function average|sum] <br> &nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd) <br> bin about<br> bin buffersize<br> bin cols<br> bin factor<br> bin depth<br> bin filter<br> bin function<br> bin smooth<br> bin smooth function<br> bin smooth radius<br> bin lock<br> ds9.set(string cmd)<br> bin about 4096 4096<br> bin about center<br> bin buffersize 512<br> bin cols detx dety<br> bin colsz detx dety time<br> bin factor 4<br> bin factor 4 2<br> bin depth 10<br> bin filter {pha &gt; 5}<br> bin filter {}<br> bin function sum<br> bin in<br> bin out<br> bin to fit<br> bin match<br> bin lock yes<br> bin open<br> bin close<br> </tt> <p><b> <a name="blink"></a>blink</b></p> <p>Blink mode parameters. Interval is in seconds. <br> </p> <tt> Syntax: <br> blink []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> blink<br> blink interval<br> ds9.set(string cmd)<br> blink<br> blink yes<br> blink interval 1</tt><br> <p><b> <a name="block"></a>block</b></p> <p>Controls blocking parameters. </p> <tt> Syntax: <br> block</tt><tt><tt> [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [out]<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>block<br> block lock<br> </tt><tt><tt>ds9.set(string cmd)<br> </tt></tt><tt><tt><tt>block</tt></tt> 4<br> </tt><tt><tt><tt>block</tt></tt> 4 2<br> </tt><tt><tt><tt><tt><tt>block</tt></tt> to 4<br> </tt><tt><tt><tt>block</tt></tt> to 4 2<br> </tt></tt><tt><tt><tt>block</tt></tt> in<br> </tt></tt><tt><tt><tt><tt><tt>block</tt></tt> out<br> </tt></tt></tt><tt><tt><tt>block</tt></tt> to fit<br> </tt><tt><tt><tt>block</tt></tt> match<br> </tt><tt><tt><tt>block</tt></tt> lock yes<br> </tt><tt><tt><tt>block</tt></tt> open<br> </tt><tt><tt><tt>block</tt></tt> close</tt><tt><br> </tt> <p><b> <a name="catalog"></a>catalog<br> cat<br> </b></p> <p>Support for catalogs. The first three commands will create a new catalog search. All other commands operated on the last search created, unless indicated otherwise.</p> <tt> Syntax:<br> </tt><tt>catalog []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ned|simbad|denis|skybot]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ascss|cmc|gsc1|gsc2|gsc3|ac|nomad|ppmx|sao|sdss5|sdss6|</tt><tt>sdss7|sdss8|</tt><tt>tycho|ua2|ub1|ucac2]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [2mass|iras]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [csc|xmm|rosat]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [first|nvss]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [chandralog|cfhtlog|esolog|stlog|xmmlog]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [cds &lt;catalogname&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cds &lt;catalogid&gt;]<br> <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [import sb|tsv &lt;filename&gt;]<br> <br> </tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [allcols]<br> </tt><tt>&nbsp;</tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [allrows]<br> &nbsp;</tt><tt>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [cancel]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [clear]<br> </tt><tt>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [close]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [coordinate &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [crosshair]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [dec &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [edit yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [export sb|tsv &lt;filename&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [header]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [hide]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [location &lt;code&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [match &lt;ref&gt; &lt;ref&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match error &lt;value&gt; degrees|arcmin|arcsec]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match function 1and2|1not2|2not1]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match return 1and2|1only|2only]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match unique yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [maxrows &lt;number&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [name &lt;object&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [panto yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [plot &lt;xcol&gt; &lt;ycol&gt; &lt;xerrcol&gt; &lt;yerrcol&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [print]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psky &lt;skyframe&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psystem &lt;coordsys&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [ra &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [regions]</tt><br> <tt> </tt><tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [retrieve]</tt><br> <tt> </tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp broadcast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp send &lt;application&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [save &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [server cds|sao|cadc|adac|iucaa|bejing|cambridge|ukirt]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [show]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sky &lt;skyframe&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [skyformat &lt;skyformat&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sort &lt;col&gt; incr|decr]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] condition|shape|color|text|font|fontsize|fontweight|fontslant &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] text|size|size2|units|angle &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol shape {circle point}|{box point}|{diamond point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {cross point}|{x point}|{arrow point}|{boxcircle point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; circle|ellipse|box|text]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol add| [#] remove]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol save|load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [system &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [update]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [x &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [y &lt;col&gt;]</tt><br> <tt> &nbsp;<br> Example:<br> string value = ds9.get(string cmd) <br> catalog<br> catalog header<br> <br> ds9.set(string cmd)<br> </tt><tt>catalog<br> catalog 2mass<br> catalog cds 2mass<br> catalog cds </tt><tt>{I/252}</tt><br> <tt> <br> </tt><tt>catalog load foo.xml<br> catalog import tsv foo.tsv<br> <br> </tt><tt>catalog allrows<br> catalog allcols<br> </tt><tt>catalog cancel<br> </tt><tt>catalog clear<br> </tt><tt>catalog close<br> </tt><tt>catalog coordinate 202.48 47.21 fk5<br> </tt><tt>catalog crosshair<br> </tt><tt>catalog dec DEC<br> </tt><tt>catalog edit yes<br> </tt><tt>catalog export tsv bar.tsv<br> </tt><tt>catalog filter {$Jmag&gt;10}<br> catalog filter load foo.flt<br> catalog header<br> </tt><tt>catalog hide<br> </tt><tt>catalog location 500</tt><br> <tt>catalog match error 2 arcsec<br> catalog match function 1and2<br> catalog match unique no<br> catalog match return 1only<br> catalog match 2mass csc<br> </tt><tt>catalog maxrows 2000<br> </tt><tt>catalog name m51<br> catalog panto no<br> </tt><tt>catalog plot </tt><tt>{$Jmag} {$Hmag} {$e_Jmag} {$e_Hmag}</tt><tt><br> </tt><tt>catalog print</tt><br> <tt>catalog psky fk5</tt><br> <tt>catalog psystem wcs</tt><br> <tt>catalog ra RA</tt><br> <tt>catalog regions<br> </tt><tt>catalog retrieve<br> </tt><tt> </tt><tt>catalog samp broadcast<br> catalog samp send aladin<br> catalog save foo.xml<br> </tt><tt>catalog server sao<br> </tt><tt>catalog show</tt><br> <tt> catalog size 1 1 degrees</tt><br> <tt>catalog symbol condition </tt><tt>{$Jmag&gt;15}</tt><br> <tt> catalog symbol 2 shape </tt><tt>{boxcircle point}</tt><br> <tt> catalog symbol color red<br> catalog symbol font times<br> </tt><tt>catalog symbol fontsize 14<br> </tt><tt>catalog symbol fontweight bold<br> </tt><tt>catalog symbol fontslant italic<br> </tt><tt>catalog symbol add<br> catalog symbol 2 remove<br> catalog symbol load foo.sym<br> catalog symbol save bar.sym</tt><tt><br> catalog sky fk5<br> catalog skyformat degrees<br> </tt><tt>catalog sort {Jmag} incr<br> </tt><tt>catalog system wcs</tt><tt><br> </tt><tt>catalog update<br> </tt><tt>catalog x RA<br> catalog y DEC</tt><br> <p><b><a name="cd"></a>cd</b></p> <p>Sets/Returns the current working directory. </p> <tt> Syntax: <br> cd [&lt;directory&gt;] <br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> cd<br> ds9.set(string cmd)<br> cd /home/mrbill<br> </tt> <p><b> <a name="cmap"></a>cmap</b></p> <p>Controls the colormap for the current frame. The colormap name is not case sensitive. A valid contrast value is&nbsp; from 0 to 10 and bias value from 0 to 1. </p> <tt> Syntax: <br> cmap [&lt;colormap&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [file]<br> &nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [invert yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [value &lt;constrast&gt; &lt;bias&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [tag [load|save] &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [tag delete]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> cmap <br> cmap file <br> cmap invert <br> cmap value <br> </tt><tt>cmap lock</tt><br> <tt> ds9.set(string cmd)<br> cmap Heat <br> cmap load foo.sao <br> cmap save bar.sao<br> cmap invert yes <br> cmap value 5 .5<br> </tt><tt>cmap tag load foo.tag<br> cmap tag save foo.tag<br> cmap tag delete</tt><br> <tt>cmap match<br> cmap lock yes</tt><br> <tt> cmap open<br> cmap close<br> </tt> <p><b><a name="colorbar"></a>colorbar</b></p> <p>Controls colorbar parameters.</p> <tt> Syntax: <br> colorbar []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [horizontal|vertical]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [orientation horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [space value|distance] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [size]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ticks]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> colorbar<br> colorbar orientation<br> colorbar numerics<br> colorbar space<br> colorbar font<br> colorbar fontsize<br> colorbar fontweight<br> colorbar fontslant<br> colorbar size<br> colorbar ticks<br> ds9.set(string cmd)<br> colorbar yes<br> colorbar vertical<br> colorbar orientation vertical<br> colorbar numerics yes<br> colorbar space value<br> colorbar font times<br> colorbar fontsize 14<br> colorbar fontwieght bold<br> colorbar fontslant italic<br> colorbar size 20<br> colorbar ticks 11<br> </tt> <p><b> <a name="console"></a>console</b></p> <p>Display tcl console window.</p> <tt> Syntax: <br> -console<br> &nbsp;<br> Example:<br> ds9.set(string cmd)<br> console<br> </tt> <p><b> <a name="contour"></a>contour</b></p> <p>Controls contours in the current frame. </p> <tt> Syntax: <br> contour []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;coordsys&gt; [&lt;skyframe&gt;]]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [generate]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [convert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [loadlevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [savelevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [paste &lt;coordsys&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [dash yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [smooth &lt;smooth&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [method block|smooth]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [nlevels &lt;number of levels&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale linear|log|pow|squared|sqrt|asinh|sinh|histequ]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ]scale log exp &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [limits &lt;min&gt; &lt;max&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [levels &lt;value value value...&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> contour<br> contour color<br> contour width<br> contour dash<br> contour smooth<br> contour method<br> contour nlevels<br> contour scale<br> contour log exp<br> contour mode<br> contour limits<br> contour levels<br> string url = ds9.get(string cmd)<br> contour wcs fk5<br> ds9.set(string cmd)<br> contour<br> contour yes<br> contour clear<br> contour generate<br> contour load ds9.con wcs fk5 yellow 2 no # solid line<br> contour load ds9.con wcs fk5 red 2 yes # dashed line<br> contour save ds9.con wcs fk5<br> contour convert<br> contour loadlevels ds9.lev<br> contour savelevels ds9.lev<br> contour copy<br> contour paste wcs red 2 no<br> contour color yellow<br> contour width 2<br> contour dash yes<br> contour smooth 5<br> contour method smooth<br> contour nlevels 10<br> contour scale sqrt<br> contour log exp 1000<br> contour mode zscale<br> contour limits 1 100<br> contour levels "{1 10 100 1000}"<br> contour open<br> contour close<br> </tt> <p><b><a name="crop"></a>crop</b> </p> <p>Set current image display area. </p> <tt> Syntax: <br> crop [&lt;x&gt; &lt;y&gt; &lt;width&gt; &lt;height&gt; [&lt;coordsys&gt;][&lt;skyframe&gt;][&lt;skyformat&gt;][degrees|arcmin|arcsec]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><tt><br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> </tt><tt>crop # get crop in physical coords <br> </tt><tt>crop wcs galactic sexagesimal arcsec<br> crop lock<br> </tt><tt>ds9.set(string cmd)</tt><br> <tt> crop 40 30 10 20 # set crop in physical coords<br> crop +104:51:06.915 +68:33:40.761&nbsp; 28.144405 22.000204 wcs galactic arcsec<br> crop match wcs<br> crop lock wcs</tt><br> <p><b> <a name="crosshair"></a>crosshair</b></p> <p>Controls the current position of the crosshair in the current frame. DS9 is placed in crosshair mode when the crosshair is set. </p> <tt> Syntax: <br> crosshair [&lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;]] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> crosshair # get crosshair in physical coords <br> crosshair wcs fk4 sexagesimal # get crosshair in wcs coords <br> crosshair lock<br> ds9.set(string cmd)<br> crosshair 100 100 physical # set crosshair in physical <br> crosshair 345 58.8 wcs fk5 # set crosshair in wcs coords <br> crosshair 23:01:00 +58:52:51 wcs fk5<br> crosshair match wcs<br> crosshair lock wcs<br> </tt> <p><b><a name="cube"></a>cube<br> </b></p> <p>Controls FITS cube. </p> <tt> Syntax: <br> cube [play|stop|next|prev|first|last]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;slice&gt; [&lt;coordsys&gt;][&lt;axis&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;numeric&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axis &lt;axis&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp; [order 123|132|213|231|312|321]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axes lock [yes|no]]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> cube<br> cube interval<br> cube lock<br> cube order<br> cube axes lock<br> ds9.set(string cmd)<br> cube play<br> cube last<br> cube 3<br> cube 4.5 wcs 3<br> cube interval 2<br> cube axis 3<br> cube match wcs<br> cube lock wcs<br> cube order 123<br> cube axes lock yes<br> cube open<br> cube close</tt><br> <p><b> <a name="cursor"></a>cursor</b></p> <p>Move mouse pointer or crosshair in image pixels in the current frame. Note, this will move selected Regions also. </p> <tt> Syntax: <br> cursor [&lt;x&gt; &lt;y&gt;] <br> &nbsp;<br> Example:<br> ds9.set(string cmd)<br> cursor 10 10<br> </tt> <p><b><a name="data"></a>data</b></p> <p>Return an array of data values given a lower left corner and a width and height in specified coordinate system. The last argument of yes indicates to strip the coordinates from the output and just list the data values. The default is yes.<br> </p> <tt> Syntax: <br> data [&lt;coordsys&gt; [&lt;skyframe&gt;] &lt;x&gt; &lt;y&gt; &lt;width&gt; &lt;height&gt; [yes|no]]<br> &nbsp;<br> Example:<br> string url = ds9.get(string cmd) <br> data image 450 520 3 3 yes<br> data physical 899 1039 6 6 no<br> data fk5 202.47091 47.196811 0.00016516669 0.00016516669 no<br> data wcs fk5 13:29:53.018 +47:11:48.52 0.00016516669 0.00016516669 no</tt><tt><br> </tt> <p><b> <a name="dsssao"></a>dsssao<br> dss<br> </b></p> <p>Support for Digital Sky Survey at SAO. </p> <tt> Syntax:<br> dsssao []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> dsssao name <br> dsssao coord <br> dsssao size<br> dsssao save<br> dsssao frame<br> ds9.set(string cmd)<br> dsssao<br> dsssao m31 <br> dsssao name m31 <br> dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal<br> dsssao size 60 60 arcmin<br> dsssao save yes<br> dsssao frame current<br> dsssao update frame<br> dsssao open<br> dsssao close<br> </tt> <p><b> <a name="dsseso"></a>dsseso</b></p> <p>Support for Digital Sky Survey at ESO. </p> <tt> Syntax:<br> dsseso []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp; &nbsp; &nbsp; [survey DSS1|DSS2-red|DSS2-blue|DSS2-infrared]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> dsseso name <br> dsseso coord <br> dsseso size<br> dsseso save<br> dsseso frame<br> dsseso survey<br> ds9.set(string cmd)<br> dsseso<br> dsseso m31 <br> dsseso name m31 <br> dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal<br> dsseso size 60 60 arcmin<br> dsseso save yes<br> dsseso frame current<br> dsseso update frame<br> dsseso survey DSS2-red <br> dsseso open<br> dsseso close<br> </tt> <p><b> <a name="dssstsci"></a>dssstsci</b></p> <p>Support for Digital Sky Survey at STSCI.</p> <tt> Syntax:<br> dssstsci []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss2ukstu_red|poss2ukstu_ir|poss2ukstu_blue] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss1_blue|poss1_red]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey all|quickv|phase2_gsc2|phase2_gsc1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> dssstsci name <br> dssstsci coord <br> dssstsci size<br> dssstsci save<br> dssstsci frame<br> dssstsci survey<br> ds9.set(string cmd)<br> dssstsci<br> dssstsci m31 <br> dssstsci name m31 <br> dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal<br> dssstsci size 60 60 arcmin<br> dssstsci save yes<br> dssstsci frame current<br> dssstsci update frame<br> dssstsci survey all<br> dssstsci open<br> dssstsci close</tt><br> <p><b> <a name="envi"></a>envi</b></p> <p>Load an ENVI header and file. Optional parameter: array endian.<br> </p> <tt> Syntax: <br> envi &lt;header&gt; [&lt;filename&gt;]<br> &nbsp;<br> Example:<br> </tt><tt><tt>envi foo.hdr</tt></tt><br> <tt><tt><tt><tt><tt><tt>envi foo.hdr foo.bsq</tt></tt><br> envi new foo.hdr foo.bsq</tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><br> </tt></tt></tt></tt></tt></tt> <p><b> <a name="exit"></a>exit<br> quit<br> </b></p> <p>Quits DS9. </p> <tt> Syntax: <br> exit<br> quit<br> &nbsp;<br> Example:<br> ds9.set(string cmd)<br> exit</tt><br> <p><b> <a name="export"></a>export<br> </b></p> <p>Export loaded image data of current frame in specified image format. Optional parameters: array endian, nrrd endian, jpeg quality (1-100) and tiff compression method.</p> <tt> Syntax: </tt><tt><br> </tt><tt> export </tt><tt>[array|nrrd|envi|gif|tiff|jpeg|png] </tt><tt>&lt;filename&gt;</tt><tt><br> </tt><tt>export array &lt;filename&gt;</tt><tt> </tt><tt>[big|little</tt><tt>|native]</tt><tt><br> </tt><tt>export nrrd &lt;filename&gt; </tt><tt>[big|little</tt><tt>|native]</tt><br> <tt>export envi &lt;header&gt; [&lt;filename&gt;] </tt><tt>[big|little</tt><tt>|native]</tt><tt><br> </tt><tt> </tt><tt>export jpeg &lt;filename&gt;</tt><tt> [1-100]</tt><tt><br> </tt><tt> </tt><tt>export tiff &lt;filename</tt><tt>&gt;</tt><tt> [none|jpeg|packbits|deflate]</tt><br> <tt> &nbsp;<br> Example: <br> </tt><tt><tt><tt>ds9.set (string cmd)<br> </tt>export array foo.arr little</tt></tt><br> <tt><tt>export nrrd foo.nrrd little<br> export envi foo.hdr little<br> export envi foo.hdr foo.bsq little<br> </tt></tt> <tt><tt><tt><tt>export tiff foo.tiff jpeg</tt></tt></tt><br> export jpeg foo.jpeg 75<br> export png foo.png</tt><br> <p><b> <a name="file"></a>file</b></p> <p>Query currently loaded file information. </p> <tt> Syntax:<br> file <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> file</tt><tt><br> </tt> <p><b> <a name="fits"></a>fits</b></p> <p>Load a FITS image into the current frame or query the currently loaded image.<br> </p> <tt> Syntax: <br> fits </tt><tt><tt>[new|mask|slice] [&lt;filename&gt;]</tt><tt><br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; [width|height|depth|bitpix|type]<br> &nbsp; &nbsp;&nbsp; [size [wcs|wcsa...wcsz] [fk4|fk5|icrs|galactic|ecliptic] [degrees|arcmin|arcsecs]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[header [&lt;ext&gt;] [keyword &lt;string&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [image|table|slice]</tt><tt><br> &nbsp;<br> Example: </tt><br> <tt><tt>string value = ds9.get(string cmd)</tt><br> fits<br> fits width<br> fits height<br> fits depth<br> fits bitpix</tt><br> <tt>fits type </tt><br> <tt><tt>fits size<br> </tt> fits size wcs fk5 arcmin<br> fits header # primary<br> fits header 2 # hdu 2<br> fits header -2 # hdu 2 with inherit<br> fits header keyword "'BITPIX'"<br> fits header 1 keyword "'BITPIX'"</tt><br> <tt><tt>fits image<br> fits table</tt></tt><tt><br> fits slice<br> ds9.set(string cmd, string url)</tt><tt><tt><br> </tt> fits foo.fits<br> fits new foo.fits<br> fits bar.fits[bin=detx,dety]<br> fits slice foo.fits<br> fits mask foo.fits<br> fits <br> fits new<br> fits -[bin=detx,dety]<br> fits slice<br> fits mask</tt> <p>Syntax: <br> </p> <tt> fits [size|width|height|depth|bitpix]<br> &nbsp; &nbsp;&nbsp; [size [wcs|wcsa...wcsz] [fk4|fk5|icrs|galactic|ecliptic] [degrees|arcmin|arcsecs]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [type]<br> &nbsp;&nbsp;&nbsp; &nbsp;[header [&lt;ext&gt;] [keyword &lt;string&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [image|table|resample] [gz] <br> &nbsp;&nbsp;&nbsp;&nbsp; [new|mask][&lt;options&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new][slice &lt;options&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;[new][mecube &lt;options&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new|mask][mosaicimage [iraf|wcs|wcsa...wcsz|wfpc2] &lt;options&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new|mask][mosaic [iraf|wcs|wcsa...wcsz] &lt;options&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new][rgbcube &lt;options&gt;]<br> &nbsp; &nbsp; &nbsp;[new][rgbimage &lt;options&gt;]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> fits size<br> fits width<br> fits height<br> fits depth<br> fits bitpix<br> fits size wcs fk5 arcmin<br> fits type <br> fits header keyword BITPIX<br> fits header 1 keyword BITPIX<br> string url = ds9.get(string cmd)<br> fits<br> fits image<br> fits image gz<br> fits table<br> fits table gz<br> fits resample<br> fits resample gz<br> fits header # primary<br> fits header 2 # hdu 2<br> fits header -2 # hdu 2 with inherit<br> ds9.set(string cmd, string url)<br> fits <br> fits [2] <br> fits new [bin=detx,dety]<br> fits slice<br> fits mecube <br> fits mosaicimage iraf<br> fits mosaicimage wcs<br> fits mosaicimage wcsa<br> fits mosaicimage wfpc2<br> fits mosaic iraf<br> fits mosaic wcs<br> fits rgbcube<br> fits rgbimage </tt> <p><b> <a name="frame"></a>frame</b></p> <p>Controls frame functions. Frames may be created, deleted, reset, and centered. While return the current frame number. If you goto a frame that does not exists, it will be created. If the frame is hidden, it will be shown. The 'frameno' option is available for backward compatibility. </p> <tt> Syntax: <br> frame [center [#|all]]<br> &nbsp; &nbsp; &nbsp; [clear [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [new [rgb|3d]]<br> &nbsp; &nbsp; &nbsp; [delete [#|all]] <br> &nbsp; &nbsp; &nbsp; [reset [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [refresh [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [hide [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [show [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move first]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move forward]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move last]<br> &nbsp; &nbsp; &nbsp; [first]<br> &nbsp;&nbsp;&nbsp; &nbsp; [prev]<br> &nbsp; &nbsp; &nbsp; [next]<br> &nbsp; &nbsp; &nbsp; [last]<br> &nbsp; &nbsp; &nbsp; [frameno #]<br> &nbsp;&nbsp;&nbsp; &nbsp; [#]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has [amplifier|datamin|datasec|detector|grid|iis|irafmin|physical|smooth]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has contour [aux]]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has fits [ |bin|cube|mosaic]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has marker [highlite|paste|select|undo]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has wcs [&lt;wcssys&gt;|equatorial &lt;wcssys&gt;|linear &lt;wcssys&gt;]]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> frame # returns the id of the current frame <br> frame frameno # returns the id of the current frame <br> frame all # returns the id of all frames <br> frame active # returns the id of all active frames<br> frame lock<br> frame has amplifier<br> frame has datamin<br> frame has datasec<br> frame has detector<br> frame has grid<br> frame has iis<br> frame has irafmin<br> frame has physical<br> frame has smooth<br> frame has contour<br> frame has contour aux<br> frame has fits<br> frame has fits bin<br> frame has fits cube<br> frame has fits mosaic<br> frame has marker highlite<br> frame has marker paste<br> frame has marker select<br> frame has marker undo<br> frame has system physical<br> frame has wcs wcsa<br> frame has wcs equatorial wcsa<br> frame has wcs linear wcsa<br> ds9.set(string cmd)<br> frame center # center current frame<br> frame center 1 # center 'Frame1' <br> frame center all # center all frames <br> frame clear # clear current frame<br> frame new # create new frame <br> frame new rgb # create new rgb frame<br> frame delete # delete current frame <br> frame reset # reset current frame <br> frame refresh # refresh current frame <br> frame hide # hide current frame <br> frame show 1 # show frame 'Frame1'<br> frame move first # move frame to first in order<br> frame move back # move frame back in order<br> frame move forward # move frame forward in order<br> frame move last # move frame to last in order<br> frame first # goto first frame <br> frame prev # goto prev frame <br> frame next # goto next frame<br> frame last # goto last frame<br> frame frameno 4 # goto frame 'Frame4', create if needed<br> frame 3 # goto frame 'Frame3', create if needed <br> frame match wcs<br> frame lock wcs</tt><br> <p><b> <a name="gif"></a>gif</b></p> <p>Load GIF image into current frame.<br> </p> <tt> Syntax:<br> gif [new|slice] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>gif</tt><br> <tt><tt>ds9.set(string cmd)<br> </tt>gif foo.gif</tt><br> <tt><tt>gif new foo.gif<br> </tt></tt><tt><tt><tt>gif slice foo.gif<br> </tt></tt>gif</tt><br> <tt><tt>gif</tt><tt> new<br> </tt>gif</tt><tt> slice</tt> <p><b> <a name="grid"></a>grid</b></p> <p> Controls coordinate grid. For grid numeric format syntax,&nbsp; click <a href="grid.html#Format">here</a>.</p> <tt> Syntax: <br> grid&nbsp; []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [type analysis|publication] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [system &lt;coordsys&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sky &lt;skyframe&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat &lt;skyformat&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes type interior|exterior]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes origin lll|llu|lul|luu|ull|ulu|uul|uuu]</tt><br> <tt> &nbsp;&nbsp;&nbsp; &nbsp; [format1 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format2 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics type interior|exterior]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics vertical yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title text &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title def yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title gap &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text1 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def1 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text2 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def2 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [reset]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> string value = ds9.get(string cmd)<br> grid <br> grid type <br> grid system <br> grid sky <br> grid skyformat <br> grid grid <br> grid grid color <br> grid grid width <br> grid grid style <br> grid grid gap1 <br> grid grid gap2 <br> grid axes <br> grid axes color <br> grid axes width <br> grid axes style <br> grid axes type <br> grid axes origin<br> grid format1<br> grid format2<br> grid tickmarks <br> grid tickmarks color <br> grid tickmarks width <br> grid tickmarks style <br> grid border <br> grid border color <br> grid border width <br> grid border style <br> grid numerics <br> grid numerics font <br> grid numerics fontsize <br> grid numerics fontweight<br> grid numerics fontslant<br> grid numerics color <br> grid numerics gap1 <br> grid numerics gap2 <br> grid numerics type <br> grid numerics vertical <br> grid title <br> grid title text<br> grid title def <br> grid title gap <br> grid title font <br> grid title fontsize <br> grid title fontweight<br> grid title fontslant<br> grid title color <br> grid labels <br> grid labels text1 <br> grid labels def1 <br> grid labels gap1 <br> grid labels text2 <br> grid labels def2 <br> grid labels gap2 <br> grid labels font <br> grid labels fontsize <br> grid labels fontweight<br> grid labels fontslant<br> grid labels color <br> ds9.set(string cmd)<br> grid <br> grid yes<br> grid type analysis <br> grid system wcs <br> grid sky fk5 <br> grid skyformat degrees<br> grid grid yes<br> grid grid color red<br> grid grid width 2<br> grid grid style 1<br> grid grid gap1 10<br> grid grid gap2 10<br> grid axes yes<br> grid axes color red<br> grid axes width 2<br> grid axes style 1<br> grid axes type exterior<br> grid axes origin lll<br> grid format1 d.2<br> grid format2 d.2<br> grid tickmarks yes<br> grid tickmarks color red<br> grid tickmarks width 2<br> grid tickmarks style 1<br> grid border yes<br> grid border color red<br> grid border width 2<br> grid border style 1<br> grid numerics yes<br> grid numerics font courier<br> grid numerics fontsize 12<br> grid numerics fontweight bold<br> grid numerics fontslant italic<br> grid numerics color red<br> grid numerics gap1 10<br> grid numerics gap2 10<br> grid numerics type exterior<br> grid numerics vertical yes<br> grid title yes<br> grid title text {Hello World}<br> grid title def yes<br> grid title gap 10<br> grid title fontsize 12<br> grid title font courier<br> grid title fontweight bold<br> grid title fontslant italic<br> grid title color red<br> grid labels yes<br> grid labels text1 {Hello World}<br> grid labels def1 yes<br> grid labels gap1 10<br> grid labels text2 {Hello World}<br> grid labels def2 yes<br> grid labels gap2 10<br> grid labels font courier<br> grid labels fontsize 12<br> grid labels fontweight bold<br> grid labels fontslant italic<br> grid labels color red<br> grid reset<br> grid load foo.grd <br> grid save foo.grd<br> grid open<br> grid close<br> </tt> <p><b> <a name="header"></a>header</b></p> <p>Display current fits header dialog. Optional extension number maybe specified. Please note, this differs from samp fits header.</p> <tt> Syntax: <br> header [&lt;ext&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [close [&lt;ext&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save [&lt;ext&gt;] &lt;filename&gt;]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> header<br> header 2<br> header close<br> </tt> <p><b> <a name="height"></a>height</b></p> <p>Set the height of the image display window. </p> <tt> Syntax: <br> height [&lt;value&gt;]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> height<br> ds9.set(string cmd)<br> height 512<br> </tt> <p><b> <a name="iconify"></a>iconify</b></p> <p>Toggles iconification. </p> <tt> Syntax: <br> iconify []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> iconify <br> ds9.set(string cmd)<br> iconify<br> iconify yes</tt><br> <p><b><a name="iexam"></a>iexam</b></p> <p>Interactive examine function. A blinking cursor will indicate to the user to click on a point on an image. The specified information will be returned at that time. The default event is <tt>button</tt>. In the last form, the following macros will be expanded if present: <tt>$width, $height, $depth, $bitpix, $filename, $regions, $filename[$regions], $env, $pan, $value, $x, $y, $z.</tt> See <a href="file:///Users/joye/saods9/doc/ref/analysis.html#macros">Analysis Macros</a> for more information.</p> <tt> Syntax: <br> iexam []<br> </tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[]|button|key|any] coordinate &lt;coordsys&gt; [&lt;skyframe&gt;] [&lt;skyformat&gt;]<br> &nbsp;&nbsp; &nbsp;&nbsp; [[]|button|key|any] data [width][height]<br> </tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; [[]|button|key|any] &lt;macro string&gt;]<br> &nbsp; </tt></tt><br> Example:<br> string value = ds9.get(string cmd)<br> </tt><tt><tt>iexam<br> </tt>iexam coordinate image<br> iexam key coordinate image # return coordinate and key event<br> iexam coordinate wcs fk5 degrees<br> iexam coordinate wcs galactic sexagesimal<br> iexam coordinate fk5<br> iexam data # return data value<br> iexam key data # return data value and key event<br> iexam data 3 3 # return all data in 3x3 box about selected point<br> iexam {Click at $x,$y in file $filename}</tt><br> <p><b><a name="iis"></a>iis</b></p> <p>Set/Get IIS Filename. Optional mosaic number maybe supplied.</p> <tt> Syntax: <br> iis [filename &lt;filename&gt; [#]]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> iis filename<br> iis filename 4<br> ds9.set(string cmd)<br> iis filename foo.fits<br> iis filename bar.fits 4</tt><br> <p><b> <a name="jpeg"></a>jpeg</b></p> <p>Load JPEG image into current frame. Optional parameters: <tt>jpeg </tt>quality (1-100) </p> <tt> Syntax:<br> jpeg [new|slice] [&lt;filename&gt;] [1-100]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>jpeg</tt><br> <tt><tt>jpeg 100</tt><br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>jpeg foo.jpeg</tt><br> <tt><tt>jpeg new foo.jpeg<br> </tt></tt><tt><tt><tt>jpeg slice foo.jpeg<br> </tt></tt>jpeg</tt><br> <tt><tt>jpeg</tt><tt> new<br> </tt>jpeg</tt><tt> slice</tt> <p><b> <a name="lock"></a>lock</b></p> <p>Lock all other frames to the current frame. </p> <tt> Syntax: <br> </tt><tt>lock</tt><tt> </tt><tt>[frame &lt;coordsys&gt;|none]<br> &nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;|none] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [crop &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp; [slice &lt;coordsys&gt;|none]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [bin [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axes [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [scale [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [scalelimits [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [colorbar [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [block [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [smooth [yes|no]]</tt><tt><br> </tt><tt>&nbsp; </tt><tt><br> Example:<br> </tt><tt>string value = ds9.get(string cmd) <br> </tt><tt>lock frame<br> lock crosshair<br> </tt><tt>lock crop</tt><br> <tt> lock slice</tt><br> <tt>lock bin<br> lock axes<br> lock scale<br> lock scalelimits<br> lock color</tt><tt>bar<br> lock block<br> lock smooth<br> </tt><tt>ds9.set(string cmd)<br> </tt><tt>lock frame wcs</tt><tt><br> </tt><tt>lock crosshair wcs<br> </tt><tt>lock crop wcs</tt><br> <tt>lock slice wcs</tt><br> <tt>lock bin yes<br> lock axes yes<br> </tt><tt>lock scale yes<br> lock scalelimits yes<br> </tt><tt>lock colorbar yes</tt><tt><br> lock block yes<br> lock smooth yes<br> <br> </tt><b><a name="lower"></a>lower</b> <p>Lower in the window stacking order. </p> <tt> Syntax: <br> lower <br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> lower</tt><tt><br> </tt> <p><b> <a name="magnifier"></a>magnifier</b></p> <p>Controls the magnifier settings. </p> <tt> Syntax: <br> magnifier [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [zoom &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cursor yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [region yes|no]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd) <br> magnifier color<br> magnifier zoom<br> magnifier cursor<br> magnifier region<br> ds9.set(string cmd)<br> magnifier color yellow<br> magnifier zoom 2<br> magnifier cursor no<br> magnifier region no<br> </tt> <p><b><a name="mask"></a>mask<br> </b></p> <p>Controls mask parameters. </p> <tt> Syntax: <br> mask [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [mark 1|0]<br> &nbsp;&nbsp;&nbsp;&nbsp; [transparency &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> mask color<br> mask mark<br> mask transparency<br> ds9.set(string cmd)<br> mask color red<br> mask mark 0<br> mask transparency 50<br> mask clear<br> mask open<br> mask close<br> </tt> <p><b> <a name="match"></a>match</b></p> <p>Match all other frames to the current frame. </p> <tt> Syntax: <br> </tt><tt>match </tt><tt>[frame &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crop &lt;coordsys&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [slice &lt;coordsys&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [bin]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scalelimits]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [block]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [smooth]</tt><tt><br> </tt><tt>&nbsp; <br> Example:<br> ds9.set(string cmd)<br> </tt><tt>match frame wcs <br> </tt><tt>match crosshair wcs<br> </tt><tt>match crop wcs</tt><br> <tt> match slice wcs<br> match bin<br> match axes<br> match scale<br> match scalelimits<br> match color</tt><tt>bar<br> match block<br> match smooth</tt><br> <p><b> <a name="mecube"></a>mecube</b></p> <p>Load FITS multiple extension file as data cube.<br> </p> <tt> Syntax:<br> mecube [new] [&lt;filename&gt;]<br> &nbsp;<br> Example: </tt><br> <tt>string value = ds9.get(string cmd)</tt><tt><tt><br> </tt>mecube<br> </tt><tt><tt><tt>ds9.set(string cmd)<br> </tt></tt>mecube foo.fits</tt><br> <tt><tt>mecube new foo.fits<br> </tt>mecube</tt><br> <tt>mecube</tt><tt> new</tt> <p><b> <a name="minmax"></a>minmax</b></p> <p>This is how DS9 determines&nbsp; the min and max data values from the data. <tt>SCAN</tt> will scan all data. <tt>SAMPLE</tt> will sample the data every n samples. <tt>DATAMIN</tt> and <tt>IRAFMIN</tt> will use the values of the keywords if present. In general, it is recommended to use <tt>SCAN</tt> unless your computer is slow or your data files are very large. Select the increment&nbsp; interval for determining the min and max data values during sampling. The larger the interval, the quicker the process. </p> <tt> Syntax: <br> minmax [scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;] <br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> minmax mode <br> minmax interval <br> ds9.set(string cmd)<br> minmax scan <br> minmax mode scan<br> minmax interval 10 </tt> <p><b> <a name="mode"></a>mode</b></p> <p>Controls the first mouse button mode. </p> <tt> Syntax: <br> mode [none|region|crosshair|colorbar|pan|zoom|rotate|catalog|examine] <br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> mode <br> ds9.set(string cmd)<br> mode crosshair</tt><br> <p><b> <a name="mosaic"></a>mosaic</b></p> <p>Load FITS mosaic segment into current frame.</p> <tt> Syntax:<br> mosaic [wcs|wcsa...wcsz|iraf] [new|mask] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>mosaic</tt><tt><br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>mosaic foo.fits</tt><br> <tt><tt>mosaic wcs foo.fits</tt></tt><br> <tt><tt>mosaic wcs new foo.fits</tt></tt><br> <tt><tt>mosaic wcs mask foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>mosaic</tt><br> <tt><tt>mosaic wcs<br> mosaic wcs</tt><tt> new<br> </tt>mosaic wcs</tt><tt> mask<br> </tt> <p><b> <a name="mosaicimage"></a>mosaicimage</b></p> <p>Load FITS mosaic image into current frame.</p> <tt> Syntax:<br> mosaicimage [wcs|wcsa...wcsz|iraf|wfpc2] [new|mask] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>mosaicimage</tt><tt><br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>mosaicimage foo.fits</tt><br> <tt><tt>mosaicimage wcs foo.fits</tt></tt><br> <tt><tt>mosaicimage wcs new foo.fits</tt></tt><br> <tt><tt>mosaicimage wcs mask foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>mosaicimage</tt><br> <tt><tt>mosaicimage wcs<br> mosaicimage wcs new</tt><tt><br> </tt>mosaicimage wcs mask</tt> <p><b><a name="movie"></a>movie</b></p> <p>Create mpeg1 movie from snap shots of the DS9 window. A <tt>slice</tt> movie cycles though all slices of a cube. A <tt>frame</tt> movie cycles through all active frames. A <tt>3d</tt> movie cycles through specified viewing angles. The default is <tt>frame</tt>. Optional parameters for <tt>3d</tt>: number of frames, azimuth from/to, elevation from/to, slice from/to, oscillate/repeat times.</p> <tt> Syntax:<br> movie </tt><tt>[slice|frame|3d] </tt><tt>&lt;filename&gt;<br> </tt><tt>movie 3d &lt;filename&gt; [number|azfrom|azto|elfrom|elto|slfrom|slto|oscillate|repeat &lt;#&gt;]</tt><br> <tt> &nbsp;<br> Example:<br> ds9.set(string cmd)<br> movie slice ds9.mpg<br> </tt><tt>movie 3d ds9.mpg number 10 azfrom -60 azto 60 oscillate 1</tt><br> <p><b> <a name="multiframe"></a>multiframe</b></p> <p>Load FITS multiple extension file as multiple images.<br> </p> <tt> Syntax:<br> multiframe [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>multiframe foo.fits</tt><tt><tt><br> </tt>multiframe</tt><br> <p><b> <a name="nameserver"></a>nameserver</b></p> <p>Support Name Server functions. Coordinates are in fk5. </p> <tt> Syntax: <br> nameserver [&lt;object&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [server ned-sao|ned-eso|simbad-sao|simbad-eso]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pan]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crosshair]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> nameserver<br> nameserver server<br> nameserver skyformat<br> nameserver m31<br> ds9.set(string cmd)<br> nameserver m31 <br> nameserver name m31 <br> nameserver server ned-sao <br> nameserver skyformat sexagesimal<br> nameserver pan<br> nameserver crosshair<br> nameserver open<br> nameserver close<br> </tt> <p><b> <a name="nan"></a>nan</b></p> <p>Set image not-a-number color. </p> <tt> Syntax: <br> nan &lt;color&gt;<br> &nbsp;<br> Example:<br> </tt><tt>string value = ds9.get(string cmd)<br> nan</tt><br> <tt>ds9.set(string cmd)<br> nan red</tt><br> <p><b> <a name="nrrd"></a>nrrd</b></p> <p>Load an NRRD (Nearly Raw Raster Data) file. Optional parameter: array endian.<br> </p> <tt> Syntax: <br> nrrd [&lt;filename&gt;] [little|big]<br> &nbsp;<br> Example:<br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>nrrd</tt><br> <tt><tt>nrrd big<br> </tt></tt><tt><tt><tt>ds9.set(string cmd</tt><tt>, string url</tt><tt>)<br> </tt>nrrd foo.nrrd</tt></tt><br> <tt><tt><tt><tt>nrrd new foo.nrrd</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt>nrrd mask foo.nrrd<br> </tt></tt></tt></tt></tt>nrrd</tt><br> <tt>nrrd</tt><tt> new<br> nrrd mask</tt><br> <p><b> <a name="nvss"></a>nvss</b></p> <p>Support for NRAO VLA Sky Survey.</p> <tt> Syntax: <br> nvss []<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> nvss name <br> nvss coord <br> nvss size<br> nvss save<br> nvss frame<br> ds9.set(string cmd)<br> nvss<br> nvss m31 <br> nvss name m31 <br> nvss coord 00:42:44.404 +41:16:08.78 sexagesimal<br> nvss size 60 60 arcmin<br> nvss save yes<br> nvss frame current<br> nvss update frame<br> nvss open<br> nvss close<br> </tt> <p><b> <a name="orient"></a>orient</b></p> <p>Controls the orientation of the current frame. </p> <tt> Syntax: <br> orient [none|x|y|xy] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> orient <br> ds9.set(string cmd)<br> orient xy<br> orient open<br> orient close<br> </tt> <p><b> <a name="pagesetup"></a>pagesetup</b></p> <p>Controls Page Setup options. </p> <tt> Syntax: <br> pagesetup [orient portrait|landscape]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale &lt;numeric&gt;]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size letter|legal|tabloid|poster|a4]</tt><br> <tt> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> pagesetup orient<br> pagesetup scale <br> pagesetup size <br> ds9.set(string cmd)<br> pagesetup orient portrait <br> pagesetup scale 50<br> pagesetup size poster<br> </tt> <p><b> <a name="pan"></a>pan</b></p> <p>Controls the current image cursor location for the current frame. </p> <tt> Syntax: <br> pan [&lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;]] <br> &nbsp;&nbsp;&nbsp; [to &lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;] <br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;&nbsp;&nbsp; [close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> pan # get current image coords <br> pan wcs fk4 sexagesimal # get current wcs coords <br> ds9.set(string cmd)<br> pan 200 200 image # pan relative <br> pan to 400 400 physical # pan to physical coords <br> pan to 13:29:55 47:11:50 wcs fk5 # pan to wcs coords<br> pan open<br> pan close<br> </tt> <p><b> <a name="pixeltable"></a>pixeltable</b></p> <p>Display/Hide the pixel table. </p> <tt> Syntax: <br> pixeltable []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [yes|open] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [no|close]<br> &nbsp;<br> Example:<br> string url = ds9.get(string cmd)<br> pixeltable <br> ds9.set(string cmd)<br> pixeltable<br> pixeltable yes<br> pixeltable open<br> pixeltable close<br> </tt> <p><b> <a name="plot"></a>plot</b></p> <p>Display and configure data plots. All plot commands take an optional second command, the plot name. If no plot name is specified, the last plot created is assumed. Plot data is assumed to be a pair of coordinates, with optional error values. The follow are valid data descriptions:</p> <blockquote>xy &nbsp;&nbsp; &nbsp; &nbsp; x and y coordinates<br> xyex&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with x errors<br> xyey&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with y errors<br> xyexey&nbsp;&nbsp;&nbsp; x,y coordinates with&nbsp; x and y errors<br> </blockquote> <p>To create a new plot, use the plot new command.</p> <tt> Syntax: <br> # create new empty plot window<br> plot<br> plot [bar|scatter]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter] &lt;title&gt; &lt;xaxis label&gt; &lt;yaxis label&gt; </tt><tt>xy|xyex|xyey|xyexey</tt><tt>]<br> <br> # create new plot with data<br> plot [new [name &lt;plotname&gt;] </tt><tt>[line|bar|scatter] </tt><tt>stdin] # title, title xaxis, title yaxis, dimension on line 1<br> &nbsp;&nbsp;&nbsp; &nbsp;[new [name &lt;plotname&gt;] [line|bar|scatter] &lt;title&gt; &lt;xaxis label&gt; &lt;yaxis label&gt; xy|xyex|xyey|xyexey]<br> <br> # load dataset into an existing plot<br> plot [&lt;plotname&gt;] [data xy|xyex|xyey|xyexey]<br> </tt><tt><tt><br> plot [&lt;plotname&gt;] load &lt;filename&gt; [xy|xyex|xyey|xyexey]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] save &lt;filename&gt;<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] clear<br> </tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] duplicate<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] stats<br> </tt></tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] list<br> &nbsp;&nbsp;&nbsp;&nbsp; </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>[&lt;plotname&gt;] loadconfig &lt;filename&gt;<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] saveconfig &lt;filename&gt;<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] pagesetup orient [portrait|landscape]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] pagesetup size [letter|legal|tabloid|poster|a4]</tt><br> <tt> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] print destination [printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print command &lt;command&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print filename &lt;filename&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print color [rgb|gray]<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] close<br> </tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><br> plot </tt>[&lt;plotname&gt;] mode [pointer|zoom]<br> </tt></tt></tt></tt></tt></tt><tt><br> # configure graph<br> plot [&lt;plotname&gt;] axis [x|y] grid [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] log [yes|no]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] flip [yes|no]</tt><br> <tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] auto [yes|no]<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] min &lt;value&gt;<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] max &lt;value&gt;</tt><tt><br> </tt><tt><tt>&nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] format &lt;string&gt;</tt><tt><br> </tt></tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt><tt>[&lt;plotname&gt;] legend [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] legend position [right|left|top|bottom]</tt><br> </tt><tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font [title|labels|numbers] font [times|helvetica|courier]<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> size &lt;value&gt;<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> weight [normal|bold]<br> &nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> slant [roman|italic]<br> </tt></tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] title &lt;string&gt;</tt><br> <tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] title [x|y] &lt;string&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] barmode [normal|stacked|aligned|overlap]<br> </tt></tt><tt><tt><tt><br> # configure current dataset<br> </tt>plot [&lt;plotname&gt;] show [yes|no]<br> </tt>&nbsp; &nbsp;&nbsp; </tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape [circle|square|diamond|plus|splus|scross|triangle|arrow]</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape fill [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] smooth [step|linear|cubic|quadratic|catrom]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] width &lt;value&gt;<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] dash [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error width &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] name &lt;string&gt;<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><br> # select current dataset<br> </tt></tt></tt>plot [&lt;plotname&gt;] select &lt;value&gt;<br> &nbsp; </tt><tt> <br> Example: <br> # return all plotnames<br> string value = ds9.get(string cmd)<br> plot<br> <br> # create new empty plot window<br> ds9.set(string cmd)<br> plot<br> plot scatter<br> plot new<br> plot new bar<br> plot new name foo<br> plot new name foo scatter<br> <br> # create new plot with data<br> ds9.set(string cmd, string url)<br> plot new stdin <br> plot new name foo stdin<br> plot new "{The Title}" "{X}" "{Y}" xy<br> plot new name foo "{The Title}" "{X}" "{Y}" xy<br> <br> # load additional dataset into an existing plot<br> ds9.set(string cmd, string url)<br> plot data xy # plot additional data<br> plot foo data xy # plot additional data<br> </tt><tt><tt><tt><tt><tt><tt><tt><br> </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt></tt></tt></tt></tt>plot stats<br> plot list<br> </tt></tt></tt>ds9.set(string cmd)<br> </tt></tt></tt></tt>plot load foo.dat xy # load new dataset with dimension xy<br> plot save bar.dat # save current dataset<br> </tt></tt><tt><tt>plot clear # clear all datasets<br> plot duplicate # duplicate current dataset<br> plot stats<br> plot list<br> </tt></tt><tt><tt>plot loadconfig foo.plt # load plot configuration <br> plot saveconfig bar.plt # save current plot configuration<br> </tt></tt><tt><tt>plot pagesetup orient portrait<br> plot pagesetup size letter<br> </tt></tt><tt><tt>plot print<br> plot print destination file<br> plot print command "lp"<br> plot print filename "foo.ps"<br> plot print color rgb<br> </tt>plot close # close current plot<br> </tt></tt><tt><tt><tt><tt><br> string value = ds9.get(string cmd)<br> </tt>plot mode<br> </tt></tt></tt><tt><tt><tt><tt>ds9.set(string cmd)<br> </tt>plot mode pointer</tt><br> </tt><tt><br> # configure plot<br> </tt></tt><tt><tt><tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt></tt></tt>plot axis x grid<br> </tt><tt><tt>plot axis x log<br> </tt></tt><tt><tt><tt>plot axis x flip</tt></tt></tt><br> </tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot axis x auto<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot axis x min<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot axis x max<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot axis x format<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>plot legend<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt>plot legend position<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>plot font numbers font<br> </tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>plot font numbers size<br> </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt>plot font numbers weight<br> </tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot font numbers slant<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot title<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot title x<br> plot barmode<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt> </tt></tt></tt></tt><tt><tt><tt>ds9.set(string cmd)<br> </tt>plot axis x grid yes<br> plot axis x log yes</tt><br> <tt>plot axis x flip yes</tt><tt><br> </tt></tt><tt><tt><tt><tt>plot axis x auto no<br> plot axis x min 0<br> plot axis x max 100<br> </tt></tt><tt><tt><tt><tt>plot axis x format {%f}<br> </tt></tt></tt></tt>plot legend yes # show legend<br> </tt><tt>plot legend position left</tt><tt><tt><tt><tt><br> </tt></tt>plot font numbers font times<br> plot font numbers size 12<br> plot font numbers weight bold<br> plot font numbers slant italic<br> </tt></tt></tt><tt><tt>plot title {The Title}<br> plot title x {X Axis}<br> plot barmode aligned<br> <br> # configure current dataset<br> </tt></tt><tt><tt><tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt></tt></tt>plot show<br> plot shape</tt> <br> <tt><tt>plot shape fill<br> </tt></tt><tt><tt><tt>plot shape color<br> </tt></tt></tt><tt><tt><tt><tt>plot smooth<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt>plot color<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>plot width<br> </tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>plot dash<br> </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot error<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot error color<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot error width<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>plot name<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt>ds9.set(string cmd)<br> </tt>plot show yes<br> plot shape circle<br> </tt><tt><tt>plot shape fill no<br> </tt></tt><tt><tt><tt>plot shape color cyan<br> </tt></tt></tt><tt><tt>plot smooth step<br> </tt>plot color red<br> plot width 2<br> plot dash yes<br> plot error yes<br> plot error color red</tt><br> <tt>plot error width 2</tt><br> <tt>plot name {My Data}</tt><br> <tt><br> # select current dataset<br> </tt></tt><tt><tt><tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt></tt></tt>plot select<br> </tt></tt><tt><tt><tt>ds9.set(string cmd)<br> </tt>plot select 2</tt><br> <br> </tt><b><b><a name="png"></a></b>png</b> <p>Load PNG image into current frame.<br> </p> <tt> Syntax:<br> png [new|slice] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>png</tt><br> <tt><tt>ds9.set(string cmd)<br> </tt>png foo.png</tt><br> <tt><tt>png new foo.png<br> </tt></tt><tt><tt><tt>png slice foo.png<br> </tt></tt>png</tt><br> <tt><tt>png</tt><tt> new<br> </tt>png</tt><tt> slice</tt><br> <p><b> <a name="prefs"></a>prefs</b></p> <p>Controls various preference settings. </p> <tt> Syntax: <br> prefs [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [irafalign yes|no]<br> &nbsp; <br> Example:<br> string value = ds9.get(string cmd)<br> prefs irafalign<br> ds9.set(string cmd)<br> prefs clear<br> prefs irafalign<br> <br> </tt><b><a name="preserve"></a>preserve</b> <p>Preserve the follow attributes while loading a new image. </p> <tt> Syntax: <br> preserve [pan yes|no]<br> &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; [regions yes|no]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd) <br> preserve pan<br> preserve regions<br> ds9.set(string cmd)<br> preserve pan yes<br> preserve regions yes<br> </tt> <p><b><a name="psprint"></a>psprint</b></p> <p>For MacOSX and Windows, invokes postscript printing. For all others, same as print. Please see <a href="command.html#print">print</a> for further details.</p> <p><b> <a name="print"></a>print</b></p> <p>Controls printing. Use print option to set printing options. Use print to actually print. </p> <tt> Syntax: <br> print [destination printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;command&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [filename &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color rgb|cmyk|gray] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [level 1|2] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [resolution 53|72|75|150|300|600] <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd) <br> print destination <br> print command <br> print filename <br> print color<br> print level <br> print resolution <br> ds9.set(string cmd)<br> print <br> print destination file <br> print command '{gv -}' <br> print filename foo.ps <br> print color cmyk <br> print level 2 <br> print resolution 75 </tt> <p><b> <a name="raise"></a>raise</b></p> <p>Raise in the window stacking order. </p> <tt> Syntax: <br> raise <br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> raise </tt> <p><b> <a name="regions"></a>regions</b></p> <p>Controls regions in the current frame. </p> <tt> Syntax: <br> regions&nbsp;[&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load [all] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [list [close]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [epsilon &lt;integer&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [show yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [showtext yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid auto yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid radius &lt;value&gt;|iteration &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [getinfo]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move front] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select all]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select none] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select invert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [delete all] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [delete select] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format ds9|xml|ciao|saotng|saoimage|pros|xy] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [system image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sky fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [strip yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [shape &lt;shape&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color &amp;ltcolor&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [fixed|edit|rotate|delete yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [include|exclude|source|background]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [delim [nl|&lt;char&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;marker command&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [composite]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dissolve]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [template &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [template &lt;filename&gt; at &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [savetemplate &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [groups] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group new]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; new]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; update]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; select]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; color &lt;color&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; copy] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; delete] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; font &lt;font&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; move &lt;int&gt; &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; movefront] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; moveback] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; property &lt;property&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [paste image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [undo]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [include|exclude|source|background|selected]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-format ds9|ciao|saotng|saoimage|pros|xy]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-system image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-sky fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-delim [nl|&lt;char&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-prop select|edit|move|rotate|delete|fixed|include|source 1|0] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-group &lt;tag&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-strip yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-wcs yes|no]<br> &nbsp;<br> Example: <br> string url = ds9.get(string cmd)<br> regions<br> regions -format ds9 -system wcs -sky fk5 -skyformat sexagesimal -prop edit 1 -group foo <br> string value = ds9.get(string cmd) <br> regions epsilon<br> regions show<br> regions showtext<br> regions centroid<br> regions centroid auto<br> regions centroid radius<br> regions centroid iteration<br> regions selected<br> regions format <br> regions system <br> regions sky <br> regions skyformat <br> regions strip<br> regions shape <br> regions color <br> regions width<br> regions delim<br> regions source <br> regions background <br> regions include <br> regions exclude <br> regions selected<br> regions groups<br> ds9.set(string cmd, string url)<br> regions -format xy -system wcs -sky fk5<br> regions -format ds9<br> ds9.set(string cmd)<br> regions foo.reg <br> regions -format ciao bar.reg # load as ciao format<br> regions foo.fits # FITS regions files do not need a format specification<br> regions load foo.reg # load foo.reg into current frame<br> regions load all foo.reg # load foo.reg into all frames<br> regions load *.reg# expand *.reg and load into current frame<br> regions load all *.reg # expand *.reg and load into all frames<br> regions save foo.reg<br> regions list <br> regions list close<br> regions epsilon 5<br> regions show yes<br> regions showtext no<br> regions centroid<br> regions centroid auto yes<br> regions centroid radius 10<br> regions centroid iteration 20<br> regions getinfo<br> regions move back <br> regions move front <br> regions select all <br> regions select none <br> regions select invert<br> regions delete all <br> regions delete select <br> regions format ds9 <br> regions system wcs<br> regions sky fk5 <br> regions skyformat degrees <br> regions delim nl <br> regions strip yes<br> regions shape ellipse <br> regions color red <br> regions width 3<br> regions edit yes<br> regions include<br> regions command "circle 100 100 20 # color=red"<br> regions composite<br> regions dissolve<br> regions template foo.tpl<br> regions template foo.tpl at 13:29:55.92 +47:12:48.02 fk5<br> regions savetemplate foo.tpl<br> regions group new<br> regions group foo new<br> regions group foo update<br> regions group foo select<br> regions group foo color red<br> regions group foo copy<br> regions group foo delete<br> regions group foo cut<br> regions group foo font 'times 14 bold'<br> regions group foo move 100 100 <br> regions group foo movefront <br> regions group foo moveback <br> regions group foo property delete no <br> regions copy<br> regions cut<br> regions paste wcs<br> regions undo<br> </tt> <p><b> <a name="restore"></a>restore</b></p> <p>Restore DS9 to a previous state from a backup save set. </p> <tt> Syntax: <br> restore &lt;filename&gt;<br> &nbsp;<br> Example:<br> restore ds9.bck</tt><br> <p><b> <a name="rgb"></a>rgb</b></p> <p>Create RGB frame and control RGB frame parameters.</p> <tt> Syntax: <br> rgb&nbsp; []<br> &nbsp;&nbsp;&nbsp; &nbsp;[red|green|blue]<br> &nbsp;&nbsp;&nbsp; &nbsp;[channel [red|green|blue]]<br> &nbsp;&nbsp; &nbsp; [view [red|green|blue] [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;[lock wcs|crop|slice|bin|scale|scalelimits|colorbar|block|smooth [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> rgb channel<br> </tt><tt>rgb lock wcs</tt><br> <tt>rgb lock crop</tt><br> <tt>rgb lock slice</tt><br> <tt> rgb lock bin<br> rgb lock scale<br> rgb lock scalelimits<br> rgb lock colorbar<br> rgb lock block<br> rgb lock smooth<br> rgb system<br> rgb view red<br> rgb view green<br> rgb view blue<br> ds9.set(string cmd)<br> rgb # create new rgb frame<br> rgb red # set current channel to red<br> rgb channel red # set current channel to red<br> rgb view blue no # turn off blue channel<br> rgb system wcs # set rgb coordinate system<br> </tt><tt>rgb lock wcs yes</tt><br> <tt>rgb lock crop yes</tt><br> <tt>rgb lock slice yes</tt><br> <tt>rgb lock bin yes</tt><br> <tt> rgb lock scale yes<br> rgb lock scalelimits yes<br> rgb lock colorbar yes<br> rgb lock block yes<br> rgb lock smooth yes<br> rgb open<br> rgb close</tt><br> <p><b> <a name="rgbarray"></a>rgbarray</b></p> <p>Load raw data array cube into rgb frame.<br> </p> <tt> Syntax:<br> rgbarray [native|big|little]<br> rgbarray [new|mask] [[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],[zdim=3],bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> </tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt>rgbarray<br> rgbarray little<br> </tt><tt><tt><tt>ds9.set(string cmd)<br> </tt></tt>rgbarray foo.arr[dim=512,zdim=3,bitpix=-32,endian=little]<br> rgbarray new foo.arr[dim=512,zdim=3,bitpix=</tt><tt>-32,endian=little]</tt><br> <p><b> <a name="rgbcube"></a>rgbcube</b></p> <p>Load FITS rgbcube into rgb frame.<br> </p> <tt> Syntax:<br> rgbcube [new] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>rgbcube<br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>rgbcube foo.fits</tt><br> <tt><tt>rgbcube new foo.fits<br> </tt>rgbcube</tt><br> <tt>rgbcube</tt><tt> new</tt><br> <p><b> <a name="rgbimage"></a>rgbimage</b></p> <p>Load FITS rgbimage into rgb frame.<br> </p> <tt> Syntax:<br> rgbimage [new] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> </tt><tt><tt><tt>string value = ds9.get(string cmd)<br> </tt></tt>rgbimage<br> </tt><tt><tt><tt>ds9.set(string cmd)<br> </tt></tt>rgbimage foo.fits</tt><br> <tt><tt>rgbimage new foo.fits<br> </tt>rgbimage</tt><br> <tt>rgbimage</tt><tt> new</tt> <p><b> <a name="rotate"></a>rotate</b></p> <p>Controls the rotation angle (in degrees) of the current frame. </p> <tt> Syntax: <br> rotate [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> rotate <br> ds9.set(string cmd)<br> rotate 45 <br> rotate to 30<br> rotate open<br> rotate close</tt><br> <p><b> <a name="save"></a>save<br> </b></p> <p>Save loaded image data of current frame as FITS.</p> <tt> Syntax: <br> save </tt><tt>[fits|rgbimage|rgbcube|mecube|mosaic|mosaicimage] &lt;filename&gt; [image|table|slice]</tt> <br> <tt> &nbsp;<br> Example: <br> </tt><tt><tt>ds9.set(string cmd) <br> </tt>save foo.fits</tt><br> <tt>save fits foo.fits image</tt><br> <tt>save fits foo.fits table<br> save fits foo.fits slice</tt><br> <tt>save rgbimage foo.fits<br> </tt><tt>save rgbcube foo.fits</tt><br> <tt>save mecube foo.fits</tt><br> <tt>save mosaic foo.fits</tt><br> <tt>save mosaicimage foo.fits</tt><br> <p><b> <a name="saveimage"></a>saveimage</b></p> <p>Create a snap shot of the current DS9 window and save in specified image format. If no format specified, the file name extension is used to determine the output format. Optional parameters: <tt>jpeg</tt> quality (1-100) and <tt>tiff</tt> compression method. </p> <tt> Syntax: <br> saveimage </tt><tt>[fits|eps|gif|tiff|jpeg|png] </tt><tt>&lt;filename&gt;<br> saveimage &lt;filename&gt;.jpeg [1-100]<br> saveimage &lt;filename&gt;.tiff [none|jpeg|packbits|deflate]<br> &nbsp;<br> Example:<br> ds9.set(string cmd) <br> saveimage ds9.tiff<br> saveimage jpeg ds9.jpeg 75</tt><br> <p><b> <a name="scale"></a>scale</b></p> <p>Controls the limits and color scale distribution. </p> <tt> Syntax: <br> scale [linear|log|pow|sqrt|squared|asinh|sinh|histequ]<br> &nbsp; &nbsp; &nbsp; [log exp &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [datasec yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [limits &lt;minvalue&gt; &lt;maxvalue&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scope local|global]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match limits]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock limits [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> scale<br> scale log exp <br> scale datasec <br> scale limits <br> scale mode <br> scale scope <br> scale lock<br> scale lock limits<br> ds9.set(string cmd)<br> scale linear<br> scale log exp 100<br> scale datasec yes <br> scale histequ <br> scale limits 1 100 <br> scale mode zscale <br> scale mode 99.5 <br> scale scope local<br> scale match<br> scale match limits<br> scale lock yes<br> scale lock limits yes<br> scale open<br> scale close<br> </tt> <p><b> <a name="shm"></a>shm</b></p> <p>Load a shared memory segment into the current frame. </p> <tt> Syntax: <br> shm [&lt;key&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [key &lt;key&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [shmid &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [fits [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaicimage [iraf|wcs|wcsa...wcsz|wfpc2] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaicimagenext [wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaic [iraf|wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [rgbcube [key|shmid] &lt;id&gt; [&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; [rgbimage [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [rgbarray [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;,zdim=3],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;&nbsp;&nbsp; [array [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;&nbsp;&nbsp; [startload|finishload]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> shm <br> ds9.set(string cmd)<br> shm 102 <br> shm key 102<br> shm shmid 102 foo<br> shm fits key 100 foo <br> shm mosaicimage iraf key 100 foo <br> shm mosaicimage wcs key 100 foo <br> shm mosaicimage wcsa key 100 foo <br> shm mosaicimage wfpc2 key 100 foo <br> shm mosaicimagenext wcs key 100 foo<br> shm mosaic iraf key 100 foo <br> shm mosaic wcs key 100 foo <br> shm rgbcube key 100 foo <br> shm rgbimage key 100 foo<br> shm rgbarray key 100 [dim=200,zdim=3,bitpix=-32]<br> shm array shmid 102 [dim=32,bitpix=-32]<br> shm startload # start a multiple load sequence without updating the display<br> shm finishload # finish multiple load sequence<br> </tt> <p><b> <a name="single"></a>single</b></p> <p>Select Single Display mode </p> <tt> Syntax: <br> single <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> single <br> ds9.set(string cmd)<br> single<br> </tt> <p><b><a name="skyview"></a>skyview </b></p> <p>Support for SkyView image server at HEASARC. </p> <p> </p> <tt> Syntax: <br> skyview []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pixels &lt;width&gt; &lt;height&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [survey &lt;survey&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> skyview name <br> skyview coord <br> skyview size<br> skyview pixels<br> skyview save<br> skyview frame<br> skyview survey<br> ds9.set(string cmd)<br> skyview<br> skyview m31 <br> skyview name m31 <br> skyview coord 00:42:44.404 +41:16:08.78 sexagesimal<br> skyview size 60 60 arcmin<br> skyview pixels 600 600<br> skyview save yes<br> skyview frame current<br> skyview update frame<br> skyview survey sdssi<br> skyview open<br> skyview close<br> </tt> <p><b><a name="sleep"></a>sleep </b></p> <p>Delays execution for specified number of seconds. Default is 1 second. </p> <p> </p> <tt> Syntax: <br> sleep [#]<br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> sleep<br> sleep 2<br> </tt> <p><b><a name="smooth"></a>smooth</b></p> <p>Smooth current image or set smooth parameters.</p> <tt> Syntax:<br> smooth []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [function boxcar|tophat|gaussian]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [radius &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> smooth<br> smooth function<br> smooth radius<br> smooth lock<br> ds9.set(string cmd)<br> smooth<br> smooth yes<br> smooth function tophat<br> smooth radius 4<br> smooth open<br> smooth close<br> smooth match<br> smooth lock yes<br> </tt> <p><b> <a name="source"></a>source</b></p> <p>Source TCL code from a file. </p> <tt> Syntax: <br> source [filename] <br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> source foo.tcl </tt> <p><b> <a name="tcl"></a>tcl</b></p> <p>Execute one tcl command. Must be enabled via the -tcl command line option.</p> <tt> Syntax: <br> tcl [&lt;tcl command&gt;] <br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> tcl puts "Hello, World"<br> ds9.set(string cmd, string url)</tt><tt><br> </tt> <p><b> <a name="threads"></a>threads</b></p> <p>Set number of process threads for functions which are multi-threaded. </p> <tt> Syntax:<br> threads #<br> &nbsp;<br> Example: <br> </tt><tt>string value = ds9.get(string cmd)<br> </tt><tt>threads</tt><br> <tt>ds9.set(string cmd)<br> </tt><tt>threads 8</tt><br> <p><b> <a name="tiff"></a>tiff</b></p> <p>Load TIFF image into current frame. Optional parameters: <tt>tiff </tt>compression method. </p> <tt> Syntax:<br> tiff [new|slice] [&lt;filename&gt;] [none|jpeg|packbits|deflate]<br> &nbsp;<br> Example: <br> </tt><tt><tt>string value = ds9.get(string cmd)<br> </tt>tiff</tt><br> <tt><tt>tiff jpeg</tt><br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>tiff foo.tiff<br> tiff new foo.tiff<br> tiff slice foo.tiff</tt><tt><tt><br> </tt>tiff<br> tiff new<br> tiff slice</tt><br> <p><b> <a name="tile"></a>tile</b></p> <p>Controls the tile display mode. </p> <tt> Syntax: <br> tile []<br> &nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [mode grid|column|row] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid mode automatic|manual]<br> &nbsp;&nbsp;&nbsp;&nbsp; [grid direction x|y]<br> &nbsp;&nbsp;&nbsp;&nbsp; [grid layout &lt;col&gt; &lt;row&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid gap &lt;pixels&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [row] <br> &nbsp;&nbsp;&nbsp;&nbsp; [column] <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> tile <br> tile mode <br> tile grid mode<br> tile grid direction <br> tile grid layout <br> tile grid gap <br> ds9.set(string cmd)<br> tile<br> tile yes <br> tile mode row <br> tile grid <br> tile grid mode manual<br> tile grid direction x <br> tile grid layout 5 5 <br> tile grid gap 10 <br> tile row <br> tile column </tt> <p><b> <a name="update"></a>update</b></p> <p>Updates the current frame or region of frame. In the second form, the first argument is the number of the fits HDU (starting with 1) and the remaining args are a bounding box in IMAGE coordinates. By default, the screen is updated the next available idle cycle. However, you may force an immediate update by specifying the NOW option. </p> <tt> Syntax: <br> update [] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [# x1 y1 x2 y2] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now # x1 y1 x2 y2]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [on]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[off] <br> &nbsp;<br> Example: <br> ds9.set(string cmd)<br> update <br> update 1 100 100 300 400 <br> update now <br> update now 1 100 100 300 400<br> update off # delay refresh of the screen while loading files<br> update on # be sure to turn it on when you are finished loading</tt><br> <p><b> <a name="url"></a>url</b></p> <p>Load FITS from URL into the current frame</p> <tt> Syntax: <br> url &lt;url&gt;<br> &nbsp;<br> Example: <br> </tt><tt><tt>ds9.set(string cmd)<br> </tt>url http://foo.bar.edu/foo.fits </tt> <p><b> <a name="version"></a>version</b></p> <p>Returns the current version of DS9. </p> <tt> Syntax: <br> version <br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> version </tt> <p><b> <a name="view"></a>view</b></p> <p>Controls the GUI. </p> <tt> Syntax: <br> view&nbsp; [layout horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [keyvalue &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [info yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [panner yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [magnifier yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [buttons yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar numerics yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [graph horizontal|vertical yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [filename yes|no[<br> &nbsp;&nbsp;&nbsp; &nbsp; [object yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [keyword yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [minmax yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [lowhigh yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [units yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [image|physical|wcs|wcsa...wcsz yes|no]<br> </tt><tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; [frame yes|no] <br> </tt>&nbsp;&nbsp;&nbsp; &nbsp; [red yes|no]<br> &nbsp; &nbsp; &nbsp; [green yes|no]<br> &nbsp; &nbsp; &nbsp; [blue yes|no]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> view layout<br> view keyvalue<br> view info <br> view panner<br> view magnifier<br> view buttons<br> view colorbar<br> view graph horizontal<br> view filename<br> view object<br> view keyword<br> view minmax<br> view lowhigh<br> view units<br> view image<br> view wcsa<br> </tt><tt><tt>view frame<br> </tt>view red<br> ds9.set(string cmd)<br> view layout vertical<br> view keyvalue BITPIX<br> view info yes<br> view panner yes<br> view magnifier yes<br> view buttons yes<br> view colorbar yes<br> view graph horizontal yes<br> view filename yes<br> view object yes<br> view keyword yes<br> view minmax yes<br> view lowhigh yes<br> view units yes<br> view wcsa yes<br> </tt><tt><tt>view frame yes <br> </tt>view red yes<br> view green yes<br> view blue yes</tt><br> <p><b> <a name="vla"></a>vla</b></p> <p>Support for VLA Sky Survey. </p> <tt> Syntax:<br> vla []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey first|stripe82]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> vla name <br> vla coord <br> vla size<br> vla save<br> vla frame<br> vla survey<br> ds9.set(string cmd)<br> vla<br> vla m31 <br> vla name m31 <br> vla coord 00:42:44.404 +41:16:08.78 sexagesimal<br> vla size 60 60 arcmin<br> vla save yes<br> vla frame current<br> vla update frame <br> vla survey stripe82<br> vla open<br> vla close</tt> <p><b> <a name="vo"></a>vo</b></p> <p>Invoke an connection to a Virtual Observatory site. </p> <tt> Syntax: <br> vo [method xpa|mime]<br> &nbsp;&nbsp; [server &lt;url&gt;]<br> &nbsp;&nbsp; [internal yes|no]<br> &nbsp;&nbsp; [delay #]<br> &nbsp;&nbsp; [&lt;url&gt;]<br> &nbsp;&nbsp; [connect &lt;url&gt;]<br> &nbsp;&nbsp; [disconnect &lt;url&gt;]<br> &nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> vo<br> vo method<br> vo server<br> vo internal<br> vo delay<br> vo connect<br> ds9.set(string cmd)<br> vo method xpa<br> vo server "http://foo.bar.edu/list.txt"<br> vo internal yes<br> vo delay 15<br> vo chandra-ed<br> vo connect chandra-ed<br> vo disconnect chandra-ed<br> vo open<br> vo close<br> </tt> <p><b> <a name="wcs"></a>wcs</b></p> <p>Controls the World Coordinate System for the current frame. If the wcs system, skyframe, or skyformat is modified, the info panel, compass, grid, and alignment will be modified accordingly. Also, using this access point, a new WCS specification can be loaded and used by the current image regardless of the WCS that was contained in the image file. WCS specification can be sent to DS9 as an ASCII file . Please see <a href="file.html#WCS">WCS</a> for more information. </p> <tt> Syntax: <br> wcs [[system] wcs|wcsa...wcsz] <br> &nbsp;&nbsp;&nbsp; [[sky] fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp; [[skyformat] degrees|sexagesimal] <br> &nbsp;&nbsp;&nbsp; [align yes|no] <br> &nbsp;&nbsp;&nbsp; [reset [#]] <br> &nbsp;&nbsp;&nbsp; [replace [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; [append [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> string value = ds9.get(string cmd)<br> wcs <br> wcs system <br> wcs sky <br> wcs skyformat <br> wcs align <br> ds9.set(string cmd)<br> wcs wcs <br> wcs system wcs<br> </tt><tt>wcs fk5<br> </tt><tt>wcs sky fk5<br> </tt><tt>wcs sexagesimal <br> </tt><tt>wcs skyformat sexagesimal <br> wcs align yes <br> wcs reset <br> wcs reset 3<br> wcs replace foo.wcs <br> wcs replace 3 foo.wcs <br> wcs append foo.wcs <br> wcs append 3 foo.wcs <br> ds9.set(string cmd, string url)<br> wcs replace <br> wcs append<br> wcs open<br> wcs close<br> </tt> <p><b> <a name="web"></a>web</b></p> <p>Display specified URL in the web display. </p> <tt> Syntax:<br> web [new|&lt;webname&gt;] [&lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [click back|forward|stop|reload|#]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [clear]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> web <br> ds9.set(string cmd)<br> web www.cnn.com<br> web new www.cnn.com<br> web hvweb www.apple.com<br> web click back<br> web click 2<br> web clear<br> web close<br> </tt> <p><b> <a name="width"></a>width</b></p> <p>Set the width of the image display window.</p> <tt> Syntax: <br> width [&lt;value&gt;]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> width<br> ds9.set(string cmd)<br> width 512<br> </tt> <p><b> <a name="zscale"></a>zscale</b></p> <p>Set Scale Limits based&nbsp; on the <i>IRAF</i> algorithm. </p> <tt> Syntax: <br> zscale []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [contrast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sample]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [line]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd)<br> zscale contrast<br> zscale sample<br> zscale line<br> ds9.set(string cmd)<br> zscale<br> zscale contrast .25<br> zscale sample 600<br> zscale line 120<br> </tt> <p><b> <a name="zoom"></a>zoom</b></p> <p>Controls the current zoom value for the current frame. </p> <tt> Syntax: <br> zoom [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example:<br> string value = ds9.get(string cmd) <br> zoom <br> ds9.set(string cmd)<br> zoom 2 <br> zoom 2 4<br> zoom to 4 <br> zoom to 2 4<br> zoom in<br> zoom out<br> zoom to fit<br> zoom open<br> zoom close<br> </tt> </blockquote> </body> </html> ����������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/vo.html��������������������������������������������������������������������������000644 �000765 �000000 �00000006320 11426327731 015725� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>Virtual Observatory</title> </head> <body alink="#ff0000" bgcolor="#ffffff" vlink="#551a8b" text="#000000" link="#0000ff"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> Virtual Observatory Reference</h3> <blockquote> <p><b>Summary</b></p> <p>Use the Web proxy connection if your firewall does not allow your computer to connect directly to external computers. In this case, you also must use DS9's internal browser.</p> <p><b>Details</b></p> <p>When you click on one of the Virtual Observatory servers in the VO list, DS9 will attempt to connect to that server and (if the internal Web display is enabled) display its Web page. The square box to the left of the server name turns yellow while the connection is being established and then green to signal success. </p> <p>A direct connection is fast and flexible. Among other things, it allows you to perform analysis on your own local data (the VO server will retrieve the image from DS9) and also allows you to use an external browser to load images. </p> <p>Some system managers configure their firewall explicitly to prevent computers in their care from making a direct connection to an external host. Instead, they only allow external access through a Web proxy<br> server (such as SOCKS). If you are using a computer behind a restricted firewall of this sort, then DS9 will not be able to connect directly to a VO server. The yellow box will not turn green and eventually DS9 will display an error message. </p> <p>In this case, you can choose to have DS9 communicate with the VO servers through your Web proxy server. DS9 will use your proxy to send its commands and retrieve its data and analysis results, rather than doing this directly. Note that the following restrictions apply:<br> </p> <blockquote> <i>The transfer of data is slower.<br> You must use the internal Web browser for loading images, etc.<br> You cannot perform analysis on local data.<br> There is a (large but finite) restriction on the number of annuli, and number of polygon points you can specify in a region, as well as the total number of regions allowed.</i><br> </blockquote> <p>If your computer and firewall have been configured to require use of a Web proxy server, you will have to tell DS9 about this server. Click the <b>Configure Web Proxy</b> button and type the relevant information into the boxes. (Your systems administrator will be able to tell you the details.) At this point, you should be able to connect to a VO server successfully. Please let us know if you have problems! </p> <blockquote> <p> <i>A final note: you may, of course, choose to use the Web proxy even if your computer and firewall are configured to allow direct connections. In this case, there is no need to configure the proxy server.<br> </i></p> </blockquote> </blockquote> </body> </html> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/xpa.html�������������������������������������������������������������������������000644 �000765 �000000 �00000464403 12576612221 016101� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]"> <title>XPA Access Points</title> </head> <body alink="#ff0000" vlink="#551a8b" link="#0000ff"> <h3><img alt="" src="../sun.gif" align="middle" width="100" height="98"> XPA Access Points</h3> <blockquote> <p>The <a href="http://hea-www.harvard.edu/RD/xpa/index.html">XPA </a> messaging system provides seamless communication between DS9 and other Unix programs, including X programs, Perl, <a href="http://space.mit.edu/cxc/software/slang/modules/xpa/"> S-Lang,</a> and Tcl/Tk. It also provides an easy way for users to communicate with DS9 by executing XPA client commands in the shell or by utilizing such commands in scripts. Because XPA works both at the programming level and the shell level, it is a powerful tool for unifying any analysis environment.</p> <tt> <a href="#2mass">2mass</a><br> <a href="#3d">3d</a><br> <a href="#about">about</a><br> <a href="#align">align</a><br> <a href="#analysis">analysis</a><br> <a href="#array">array</a><br> <a href="#background">background</a><br> <a href="#backup">backup</a><br> <a href="#bin">bin</a><br> <a href="#blink">blink</a><br> <a href="#block">block</a><br> <a href="#catalog">catalog</a><br> <a href="#cd">cd</a><br> <a href="#cmap">cmap</a><br> <a href="#colorbar">colorbar</a><br> <a href="#console">console</a><br> <a href="#contour">contour</a><br> <a href="#crop">crop</a><br> <a href="#crosshair">crosshair</a><br> <a href="#cube">cube</a><br> <a href="#cursor">cursor</a><br> <a href="#data">data</a><br> <a href="#dsssao">dsssao</a><br> <a href="#dsseso">dsseso</a><br> <a href="#dssstsci">dssstsci</a><br> <a href="#envi">envi</a><br> <a href="#exit">exit</a><br> <a href="#export">export</a><br> <a href="#file">file</a><br> <a href="#fits">fits</a><br> <a href="#frame">frame</a><br> <a href="#gif">gif</a><br> <a href="#grid">grid</a><br> <a href="#header">header</a><br> <a href="#height">height</a><br> <a href="#iconify">iconify</a><br> </tt><tt><a href="#iis"><tt></tt></a><tt><a href="#iexam">iexam</a><br> </tt><a href="#iis">iis</a><br> <a href="#image">image</a><br> <a href="#jpeg">jpeg</a><br> <a href="#lock">lock</a><br> <a href="#lower">lower</a><br> <a href="#magnifier">magnifier</a><br> <a href="#mask">mask</a><br> <a href="#match">match</a><br> <a href="#mecube">mecube</a><br> <a href="#minmax">minmax</a><br> <a href="#mode">mode</a><br> <a href="#mosaic">mosaic</a><br> <a href="#mosaicimage">mosaicimage</a><br> <a href="#movie">movie</a><br> <a href="#multiframe">multiframe</a><br> <a href="#nameserver">nameserver</a><br> <a href="#nrrd">nrrd</a><br> <a href="#nvss">nvss</a><br> <a href="#orient">orient</a><br> <a href="#pagesetup">pagesetup</a><br> <a href="#pan">pan</a><br> <a href="#pixeltable">pixeltable</a><br> <a href="#plot">plot</a><br> <a href="#png">png</a><br> <a href="#prefs">prefs</a><br> <a href="#preserve">preserve</a><br> <a href="#print">psprint</a><br> <a href="#print">print</a><br> <a href="#exit">quit</a><br> <a href="#raise">raise</a><br> <a href="#regions">regions</a><br> <a href="#restore">restore</a><br> <a href="#rgb">rgb</a><br> <a href="#rgbarray">rgbarray</a><br> <a href="#rgbcube">rgbcube</a><br> <a href="#rgbimage">rgbimage</a><br> <a href="#rotate">rotate</a><br> <a href="#save">save</a><br> <a href="#saveimage">saveimage</a><br> <a href="#scale">scale</a><br> <a href="#shm">shm</a><br> <a href="#single">single</a><br> <a href="#skyview">skyview</a><br> <a href="#sleep">sleep</a><br> <a href="#smooth">smooth</a><br> <a href="#source">source</a><br> <a href="#tcl">tcl</a><br> <a href="#threads">threads</a><br> <a href="#tile">tile</a><br> <a href="#update">update</a><br> <a href="#url">url</a><br> <a href="#version">version</a><br> <a href="#view">view</a><br> <a href="#vla">vla</a><br> <a href="#vo">vo</a><br> <a href="#wcs">wcs</a><br> <a href="#web">web</a><br> <a href="#width">width</a><br> <a href="#zscale">zscale</a><br> <a href="#zoom">zoom</a><br> </tt> <p><b> <a name="2mass"></a>2mass</b></p> <p> Support for 2MASS Digital Sky Survey.</p> <tt> Syntax: <br> 2mass []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp;&nbsp; [survey j|h|k]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> </tt><tt>&nbsp; <br> Example:<br> $xpaget ds9 2mass name <br> $xpaget ds9 2mass coord <br> $xpaget ds9 2mass size<br> $xpaget ds9 2mass save<br> $xpaget ds9 2mass frame<br> $xpaget ds9 2mass survey <br> $xpaset -p ds9 2mass<br> </tt><tt>$xpaset -p ds9 2mass m31<br> $xpaset -p ds9 2mass name m31 <br> $xpaset -p ds9 2mass coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 2mass size 60 60 arcmin<br> $xpaset -p ds9 2mass save yes<br> $xpaset -p ds9 2mass frame current<br> $xpaset -p ds9 2mass update frame<br> $xpaset -p ds9 2mass survey j<br> </tt><tt>$xpaset -p ds9 2mass open<br> $xpaset -p ds9 2mass close</tt><br> <p><b> <a name="3d"></a>3d</b></p> <p> Support for 3D frame.</p> <tt> Syntax: <br> 3d []<br> &nbsp;&nbsp; [view &lt;az&gt; &lt;el&gt;]<br> &nbsp;&nbsp; [az &lt;az&gt;]<br> &nbsp;&nbsp; [el &lt;el&gt;]<br> &nbsp;&nbsp; [scale &lt;scale&gt;]<br> &nbsp;&nbsp; [method mip|aip]</tt><br> <tt><tt>&nbsp;&nbsp; [background none|azimuth|elevation]<br> </tt>&nbsp;</tt><tt>&nbsp; [border yes|no]<br> &nbsp;&nbsp; [border color &lt;color&gt;]</tt><br> <tt> </tt><tt>&nbsp;&nbsp; [highlite yes|no]<br> &nbsp;&nbsp; [highlite color &lt;color&gt;]<br> </tt><tt>&nbsp;&nbsp; [open|close]<br> </tt><tt>&nbsp; <br> Example:<br> $xpaget ds9 3d view<br> $xpaget ds9 3d az<br> $xpaget ds9 3d el<br> $xpaget ds9 3d scale<br> $xpaget ds9 3d method<br> </tt><tt>$xpaget ds9 3d background<br> </tt><tt>$xpaget ds9 3d border<br> $xpaget ds9 3d border color</tt><br> <tt>$xpaget ds9 3d highlite<br> $xpaget ds9 3d highlite color<br> $xpaset -p ds9 3d # create new 3D frame<br> $xpaset -p ds9 3d view 45 30<br> $xpaset -p ds9 3d az 45<br> $xpaset -p ds9 3d el 30<br> $xpaset -p ds9 3d scale 10<br> $xpaset -p ds9 3d method mip</tt><br> <tt>$xpaset -p ds9 3d background azimuth<br> </tt><tt>$xpaset -p ds9 3d border yes<br> $xpaset -p ds9 3d border color red</tt><br> <tt>$xpaset -p ds9 3d highlite yes<br> $xpaset -p ds9 3d highlite color red<br> $xpaset -p ds9 3d open<br> $xpaset -p ds9 3d close<br> </tt> <p><b><a name="about"></a>about</b></p> <p>Get DS9 credits. </p> <tt> Syntax: <br> about <br> &nbsp;<br> Example: <br> $xpaget ds9 about<br> </tt> <p><b> <a name="align"></a>align</b></p> <p>Controls the World Coordinate System alignment for the current frame.</p> <tt> Syntax: <br> align []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;<br> Example: <br> $xpaget ds9 align<br> $xpaset -p ds9 align yes<br> </tt> <p><b> <a name="analysis"></a>analysis</b></p> <p>Control external analysis tasks. Tasks are numbered as they are loaded, starting with 0. Can also be used to display a message and display text in the text dialog window. </p> <tt> Syntax: <br> analysis [&lt;task number&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [task &lt;task number&gt;|&lt;task name&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [clear][load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [message ok|okcancel|yesno &lt;message&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [entry &lt;message&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [text]</tt><tt><tt><br> <br> </tt> Example: <br> $xpaget ds9 analysis<br> $xpaget ds9 analysis task<br> $xpaget ds9 analysis entry 'Please enter something'<br> $xpaget ds9 analysis entry okcancel 'Please enter something'<br> $xpaset -p ds9 analysis 0 # invoke first analysis task<br> $xpaset -p ds9 analysis task 0<br> $xpaset -p ds9 analysis task foobar<br> $xpaset -p ds9 analysis "{foo bar}"<br> $xpaset -p ds9 analysis my.ans<br> $xpaset -p ds9 analysis load my.ans <br> $xpaset -p ds9 analysis clear <br> $xpaset -p ds9 analysis clear load my.ans<br> $xpaset -p ds9 analysis message ok {This is a message}<br> $xpaset -p ds9 analysis text {this is text}<br> $cat my.ans | xpaset ds9 analysis load <br> $cat foo.txt | xpaset ds9 analysis text <br> </tt> <p><b> <a name="array"></a>array</b></p> <p>Load raw data array into current frame.<br> </p> <tt> Syntax:<br> array [native|big|little]<br> array [new|mask] [[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],zdim=&lt;z&gt;,bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> $xpaget ds9 array &gt; foo.arr<br> $xpaget ds9 array little &gt; foo.arr<br> $xpaset -p ds9 array foo.arr[dim=512,bitpix=-32,endian=little]<br> $xpaset -p ds9 array new foo.arr[dim=512,bitpix=</tt><tt>-32,endian=little]</tt><br> <tt><tt>$xpaset -p ds9 array mask foo.arr[dim=512,bitpix=</tt></tt><tt>-32,endian=little]</tt><br> <tt>$cat foo.arr | xpaset ds9 array [dim=512,bitpix=-32,endian=little]</tt><br> <tt>$cat foo.arr | xpaset ds9 array new [dim=512,bitpix=-32,endian=little]</tt><br> <tt>$cat foo.arr | xpaset ds9 array mask [dim=512,bitpix=-32,endian=little]</tt> <tt> </tt> <p><b> <a name="background"></a>bg<br> background</b></p> <p>Set image background color. </p> <tt> Syntax: <br> bg &lt;color&gt;<br> &nbsp;<br> Example:<br> $xpaget ds9 bg</tt><tt><br> <tt>$xpaset -p ds9 bg red</tt><br> </tt> <p><b> <a name="backup"></a>backup</b></p> <p>Create a backup save set. </p> <tt> Syntax: <br> backup &lt;filename&gt;<br> &nbsp;<br> Example:<br> $xpaset -p ds9 backup ds9.bck</tt><br> <p><b> <a name="bin"></a>bin</b></p> <p>Controls binning factor, binning buffer size, and&nbsp; binning function for binning FITS bin tables. The access point blocking is provided for backward compatibility. </p> <tt> Syntax: <br> bin [about &lt;x&gt; &lt;y&gt;]<br> &nbsp;&nbsp;&nbsp; [about center]<br> &nbsp;&nbsp;&nbsp; [buffersize &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp; [cols &lt;x&gt; &lt;y&gt;]<br> &nbsp;&nbsp;&nbsp; [colsz &lt;x&gt; &lt;y&gt; &lt;z&gt;]<br> &nbsp;&nbsp;&nbsp; [factor &lt;value&gt; [&lt;vector&gt;]]<br> &nbsp;&nbsp;&nbsp; [depth &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp; [filter &lt;string&gt;] <br> &nbsp;&nbsp;&nbsp; [function average|sum]<br> &nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 bin about<br> $xpaget ds9 bin buffersize<br> $xpaget ds9 bin cols<br> $xpaget ds9 bin factor<br> $xpaget ds9 bin depth<br> $xpaget ds9 bin filter<br> $xpaget ds9 bin function<br> $xpaget ds9 bin smooth<br> $xpaget ds9 bin smooth function<br> $xpaget ds9 bin smooth radius<br> $xpaget ds9 bin lock<br> $xpaset -p ds9 bin about 4096 4096<br> $xpaset -p ds9 bin about center<br> $xpaset -p ds9 bin buffersize 512<br> $xpaset -p ds9 bin cols detx dety<br> $xpaset -p ds9 bin colsz detx dety time<br> $xpaset -p ds9 bin factor 4<br> $xpaset -p ds9 bin factor 4 2<br> $xpaset -p ds9 bin depth 10<br> $xpaset -p ds9 bin filter '{pha &gt; 5}'<br> $xpaset -p ds9 bin filter ''<br> $xpaset -p ds9 bin function sum<br> $xpaset -p ds9 bin in<br> $xpaset -p ds9 bin out<br> $xpaset -p ds9 bin to fit<br> $xpaset -p ds9 bin match<br> $xpaset -p ds9 bin lock yes<br> $xpaset -p ds9 bin open<br> $xpaset -p ds9 bin close</tt><tt><br> </tt> <p><b> <a name="blink"></a>blink</b></p> <p>Blink mode parameters. Interval is in seconds. <br> </p> <tt> Syntax: <br> blink []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 blink<br> $xpaget ds9 blink interval<br> $xpaset -p ds9 blink<br> $xpaset -p ds9 blink yes<br> $xpaset -p ds9 blink interval 1</tt><br> <p><b> <a name="block"></a>block</b></p> <p>Controls blocking parameters. </p> <tt> Syntax: <br> block</tt><tt><tt> [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [out]<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 block<br> $xpaget ds9 block lock<br> </tt><tt>$xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> 4<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> 4 2<br> </tt><tt><tt><tt>$xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> to 4<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> to 4 2<br> </tt>$xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> in<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> out<br> </tt></tt>$xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> to fit<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> match<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> lock yes<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> open<br> $xpaset -p ds9 </tt><tt><tt><tt>block</tt></tt> close</tt><tt><br> </tt> <p><b> <a name="catalog"></a>catalog<br> cat<br> </b></p> <p>Support for catalogs. The first three commands will create a new catalog search. All other commands operated on the last search created, unless indicated otherwise.</p> <tt> Syntax: <br> catalog []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ned|simbad|denis|skybot]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ascss|cmc|gsc1|gsc2|gsc3|ac|nomad|ppmx|sao|sdss5|sdss6|</tt><tt>sdss7|sdss8|</tt><tt>tycho|ua2|ub1|ucac2]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [2mass|iras]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [csc|xmm|rosat]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [first|nvss]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [chandralog|cfhtlog|esolog|stlog|xmmlog]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [cds &lt;catalogname&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cds &lt;catalogid&gt;]<br> <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [import sb|tsv &lt;filename&gt;]<br> <br> </tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [allcols]<br> </tt><tt>&nbsp;</tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [allrows]<br> &nbsp;</tt><tt>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [cancel]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [clear]<br> </tt><tt>&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; [&lt;ref&gt;] [close]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [coordinate &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [crosshair]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [dec &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [edit yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [export sb|tsv &lt;filename&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [filter load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [header]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [hide]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [location &lt;code&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [match &lt;ref&gt; &lt;ref&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match error &lt;value&gt; degrees|arcmin|arcsec]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match function 1and2|1not2|2not1]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match return 1and2|1only|2only]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [match unique yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [maxrows &lt;number&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [name &lt;object&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [panto yes|no]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [plot &lt;xcol&gt; &lt;ycol&gt; &lt;xerrcol&gt; &lt;yerrcol&gt;]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [print]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psky &lt;skyframe&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [psystem &lt;coordsys&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [ra &lt;col&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [regions]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [retrieve]</tt><br> <tt> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp broadcast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [samp send &lt;application&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [save &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [server cds|sao|cadc|adac|iucaa|bejing|cambridge|ukirt]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [show]</tt><br> <tt>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [&lt;ref&gt;] [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]</tt><br> <tt> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sky &lt;skyframe&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [skyformat &lt;skyformat&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [sort &lt;col&gt; incr|decr]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] condition|shape|color|text|font|fontsize|fontweight|fontslant &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol [#] text|size|size2|units|angle &lt;value&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol shape {circle point}|{box point}|{diamond point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {cross point}|{x point}|{arrow point}|{boxcircle point}|<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; circle|ellipse|box|text]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol add| [#] remove]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [symbol save|load &lt;filename&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [system &lt;coordsys&gt;]</tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </tt><tt>[&lt;ref&gt;] [update]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [x &lt;col&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;ref&gt;] [y &lt;col&gt;]</tt><br> <tt> &nbsp;<br> Example: <br> $xpaget ds9 catalog<br> </tt><tt>$xpaget ds9 catalog header</tt><br> <tt><br> $xpaset -p ds9 catalog<br> $xpaset -p ds9 catalog 2mass<br> $xpaset -p ds9 catalog cds 2mass<br> $xpaset -p ds9 catalog cds "I/252"<br> <br> </tt><tt>$xpaset -p ds9 catalog load foo.xml<br> $xpaset -p ds9 catalog import tsv foo.tsv<br> <br> </tt><tt>$xpaset -p ds9 catalog allrows<br> $xpaset -p ds9 catalog allcols<br> </tt><tt>$xpaset -p ds9 catalog cancel<br> </tt><tt>$xpaset -p ds9 catalog clear<br> </tt><tt>$xpaset -p ds9 catalog close<br> </tt><tt>$xpaset -p ds9 catalog coordinate 202.48 47.21 fk5<br> </tt><tt>$xpaset -p ds9 catalog crosshair<br> </tt><tt>$xpaset -p ds9 catalog dec DEC<br> </tt><tt>$xpaset -p ds9 catalog edit yes<br> </tt><tt>$xpaset -p ds9 catalog export tsv bar.tsv<br> </tt><tt>$xpaset -p ds9 catalog filter '$Jmag&gt;10'<br> $xpaset -p ds9 catalog filter load foo.flt<br> $xpaset -p ds9 catalog header<br> </tt><tt>$xpaset -p ds9 catalog hide<br> </tt><tt>$xpaset -p ds9 catalog location 500</tt><br> <tt>$xpaset -p ds9 catalog match error 2 arcsec<br> $xpaset -p ds9 catalog match function 1and2<br> $xpaset -p ds9 catalog match unique no<br> $xpaset -p ds9 catalog match return 1only<br> $xpaset -p ds9 catalog match 2mass csc<br> </tt><tt>$xpaset -p ds9 catalog maxrows 2000<br> </tt><tt>$xpaset -p ds9 catalog name m51<br> $xpaset -p ds9 catalog panto no<br> </tt><tt>$xpaset -p ds9 catalog plot '$Jmag' '$Hmag' '$e_Jmag' '$e_Hmag'<br> </tt><tt>$xpaset -p ds9 catalog print</tt><br> <tt>$xpaset -p ds9 catalog psky fk5</tt><br> <tt>$xpaset -p ds9 catalog psystem wcs</tt><br> <tt>$xpaset -p ds9 catalog ra RA<br> $xpaset -p ds9 catalog regions</tt><br> <tt>$xpaset -p ds9 catalog retrieve<br> </tt><tt> $xpaset -p ds9 catalog samp broadcast<br> $xpaset -p ds9 catalog samp send aladin<br> $xpaset -p ds9 catalog save foo.xml<br> </tt><tt>$xpaset -p ds9 catalog server sao<br> </tt><tt>$xpaset -p ds9 catalog show</tt><br> <tt>$xpaset -p ds9 catalog size 1 1 degrees</tt><br> <tt>$xpaset -p ds9 catalog symbol condition '$Jmag&gt;15'<br> $xpaset -p ds9 catalog symbol 2 shape "boxcircle point"<br> $xpaset -p ds9 catalog symbol color red<br> $xpaset -p ds9 catalog symbol font times<br> </tt><tt>$xpaset -p ds9 catalog symbol fontsize 14<br> </tt><tt>$xpaset -p ds9 catalog symbol fontweight bold<br> </tt><tt>$xpaset -p ds9 catalog symbol fontslant italic<br> </tt><tt>$xpaset -p ds9 catalog symbol add<br> $xpaset -p ds9 catalog symbol 2 remove<br> $xpaset -p ds9 catalog symbol load foo.sym<br> $xpaset -p ds9 catalog symbol save bar.sym</tt><tt><br> $xpaset -p ds9 catalog sky fk5<br> $xpaset -p ds9 catalog skyformat degrees<br> </tt><tt>$xpaset -p ds9 catalog sort "Jmag" incr<br> </tt><tt>$xpaset -p ds9 catalog system wcs</tt><tt><br> </tt><tt>$xpaset -p ds9 catalog update<br> </tt><tt>$xpaset -p ds9 catalog x RA<br> $xpaset -p ds9 catalog y DEC</tt><br> <p><b> <a name="cd"></a>cd</b></p> <p>Sets/Returns the current working directory. </p> <tt> Syntax: <br> cd [&lt;directory&gt;] <br> &nbsp;<br> Example: <br> $xpaget ds9 cd<br> $xpaset -p ds9 cd /home/mrbill<br> </tt> <p><b> <a name="cmap"></a>cmap</b></p> <p>Controls the colormap for the current frame. The colormap name is not case sensitive. A valid contrast value is&nbsp; from 0 to 10 and bias value from 0 to 1. </p> <tt> Syntax: <br> cmap [&lt;colormap&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [file]<br> &nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [invert yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [value &lt;constrast&gt; &lt;bias&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [tag [load|save] &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [tag delete]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock [yes|no]]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 cmap <br> $xpaget ds9 cmap file <br> $xpaget ds9 cmap invert <br> $xpaget ds9 cmap value <br> </tt><tt>$xpaget ds9 cmap lock</tt><br> <tt> $xpaset -p ds9 cmap Heat <br> $xpaset -p ds9 cmap load foo.sao <br> </tt><tt>$xpaset -p ds9 cmap save bar.sao <br> </tt><tt>$xpaset -p ds9 cmap invert yes <br> $xpaset -p ds9 cmap value 5 .5<br> $xpaset -p ds9 cmap tag load foo.tag<br> $xpaset -p ds9 cmap tag save foo.tag<br> $xpaset -p ds9 cmap tag delete<br> </tt><tt>$xpaset -p ds9 cmap match<br> $xpaset -p ds9 cmap lock yes</tt><br> <tt> $xpaset -p ds9 cmap open<br> $xpaset -p ds9 cmap close<br> </tt> <p><b> <a name="colorbar"></a>colorbar<br> </b></p> <p>Controls colorbar parameters.</p> <tt> Syntax: <br> colorbar []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [horizontal|vertical]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; [orientation horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [space value|distance] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [size]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ticks]<br> &nbsp;<br> Example: <br> $xpaget ds9 colorbar<br> $xpaget ds9 colorbar orientation<br> $xpaget ds9 colorbar numerics<br> $xpaget ds9 colorbar space<br> $xpaget ds9 colorbar font<br> $xpaget ds9 colorbar fontsize<br> $xpaget ds9 colorbar fontweight<br> $xpaget ds9 colorbar fontslant<br> $xpaget ds9 colorbar size<br> $xpaget ds9 colorbar ticks<br> $xpaset -p ds9 colorbar yes<br> $xpaset -p ds9 colorbar vertical<br> $xpaset -p ds9 colorbar orientation vertical<br> $xpaset -p ds9 colorbar numerics yes<br> $xpaset -p ds9 colorbar space value<br> $xpaset -p ds9 colorbar font times<br> $xpaset -p ds9 colorbar fontsize 14<br> $xpaset -p ds9 colorbar fontweight bold<br> $xpaset -p ds9 colorbar fontslant italic<br> $xpaset -p ds9 colorbar size 20<br> $xpaset -p ds9 colorbar ticks 11<br> </tt> <p><b> <a name="console"></a>console</b></p> <p>Display tcl console window.</p> <tt> Syntax: <br> -console<br> &nbsp;<br> Example:<br> $xpaset -p ds9 console<br> </tt> <p><b> <a name="contour"></a>contour<br> </b></p> <p>Controls contours in the current frame. </p> <tt> Syntax: <br> contour []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [&lt;coordsys&gt; [&lt;skyframe&gt;]]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [generate]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [convert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [loadlevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [savelevels &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [paste &lt;coordsys&gt; &lt;color&gt; &lt;width&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [dash yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [smooth &lt;smooth&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [method block|smooth]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [nlevels &lt;number of levels&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale linear|log|pow|squared|sqrt|asinh|sinh|histequ]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [log exp &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [limits &lt;min&gt; &lt;max&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [levels &lt;value value value...&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 contour<br> $xpaget ds9 contour wcs fk5<br> $xpaget ds9 contour color<br> $xpaget ds9 contour width<br> $xpaget ds9 contour dash<br> $xpaget ds9 contour smooth<br> $xpaget ds9 contour method<br> $xpaget ds9 contour nlevels<br> $xpaget ds9 contour scale<br> $xpaget ds9 contour log exp<br> $xpaget ds9 contour mode<br> $xpaget ds9 contour limits<br> $xpaget ds9 contour levels<br> $xpaset -p ds9 contour<br> $xpaset -p ds9 contour yes<br> $xpaset -p ds9 contour clear<br> $xpaset -p ds9 contour generate<br> $xpaset -p ds9 contour load ds9.con wcs fk5 yellow 2 no # solid line<br> $xpaset -p ds9 contour load ds9.con wcs fk5 red 2 yes # dashed line<br> $xpaset -p ds9 contour save ds9.con wcs fk5<br> $xpaset -p ds9 contour convert<br> $xpaset -p ds9 contour loadlevels ds9.lev<br> $xpaset -p ds9 contour savelevels ds9.lev<br> $xpaset -p ds9 contour copy<br> $xpaset -p ds9 contour paste wcs red 2 no<br> $xpaset -p ds9 contour color yellow<br> $xpaset -p ds9 contour width 2<br> $xpaset -p ds9 contour dash yes<br> $xpaset -p ds9 contour smooth 5<br> $xpaset -p ds9 contour method smooth<br> $xpaset -p ds9 contour nlevels 10<br> $xpaset -p ds9 contour scale sqrt<br> $xpaset -p ds9 contour log exp 1000<br> $xpaset -p ds9 contour mode zscale<br> $xpaset -p ds9 contour limits 1 100<br> $xpaset -p ds9 contour levels "{1 10 100 1000}"<br> $xpaset -p ds9 contour open<br> $xpaset -p ds9 contour close<br> </tt> <p><b><a name="crop"></a>crop</b> </p> <p>Set current image display area. </p> <tt> Syntax: <br> crop [&lt;x&gt; &lt;y&gt; &lt;width&gt; &lt;height&gt; [&lt;coordsys&gt;][&lt;skyframe&gt;][&lt;skyformat&gt;][degrees|arcmin|arcsec] <br> &nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;<br> Example: <br> $xpaget ds9 crop # get crop in physical coords <br> $xpaget ds9 crop wcs galactic sexagesimal arcsec<br> $xpaget ds9 crop lock<br> $xpaset -p ds9 crop 40 30 10 20 # set crop in physical coords<br> $xpaset -p ds9 crop +104:51:06.915 +68:33:40.761&nbsp; 28.144405 22.000204 wcs galactic arcsec<br> $xpaset -p ds9 crop match wcs<br> $xpaset -p ds9 crop lock wcs</tt><br> <p><b> <a name="crosshair"></a>crosshair</b></p> <p>Controls the current position of the crosshair in the current frame. DS9 is placed in crosshair mode when the crosshair is set. </p> <tt> Syntax: <br> crosshair [&lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;<br> Example: <br> $xpaget ds9 crosshair # get crosshair in physical coords <br> $xpaget ds9 crosshair wcs fk4 sexagesimal # get crosshair in wcs coords <br> $xpaget ds9 crosshair lock<br> $xpaset -p ds9 crosshair 100 100 physical # set crosshair in physical <br> $xpaset -p ds9 crosshair 345 58.8 wcs fk5 # set crosshair in wcs coords <br> $xpaset -p ds9 crosshair 23:01:00 +58:52:51 wcs fk5<br> $xpaset -p ds9 crosshair match wcs<br> $xpaset -p ds9 crosshair lock wcs<br> </tt> <p><b> <a name="cube"></a>cube<br> </b></p> <p>Controls FITS cube dialog. </p> <tt> Syntax: <br> cube [play|stop|next|prev|first|last]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;slice&gt; [&lt;coordsys&gt;][&lt;axis&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;numeric&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axis &lt;axis&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]<br> &nbsp;&nbsp;&nbsp;&nbsp; [order 123|132|213|231|312|321]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axes lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $xpaget ds9 cube<br> $xpaget ds9 cube interval<br> $xpaget ds9 cube axis<br> $xpaget ds9 cube lock<br> $xpaget ds9 cube order<br> $xpaget ds9 cube axes lock<br> $xpaset -p ds9 cube play<br> $xpaset -p ds9 cube last<br> $xpaset -p ds9 cube 3<br> $xpaset -p ds9 cube 4.4 wcs 3<br> $xpaset -p ds9 cube interval 2<br> $xpaset -p ds9 cube axis 3<br> $xpaset -p ds9 cube match wcs<br> $xpaset -p ds9 cube lock wcs<br> $xpaset -p ds9 cube order 123<br> $xpaset -p ds9 cube axes lock yes<br> $xpaset -p ds9 cube open<br> $xpaset -p ds9 cube close</tt><br> <p><b> <a name="cursor"></a>cursor</b></p> <p>Move mouse pointer or crosshair in image pixels in the current frame. Note, this will move selected Regions also. </p> <tt> Syntax: <br> cursor [&lt;x&gt; &lt;y&gt;] <br> &nbsp;<br> Example: <br> $xpaset -p ds9 cursor 10 10<br> </tt> <p><b> <a name="data"></a>data</b></p> <p>Return an array of data values given a lower left corner and a width and height in specified coordinate system. The last argument of yes indicates to strip the coordinates from the output and just list the data values. The default is yes.</p> <tt> Syntax: <br> data [&lt;coordsys&gt; [&lt;skyframe&gt;] &lt;x&gt; &lt;y&gt; &lt;width&gt; &lt;height&gt; [yes|no]]<br> &nbsp;<br> Example: <br> $xpaget ds9 data image 450 520 3 3 yes<br> $xpaget ds9 data physical 899 1039 6 6 no<br> $xpaget ds9 data fk5 202.47091 47.196811 0.00016516669 0.00016516669 no<br> $xpaget ds9 data wcs fk5 13:29:53.018 +47:11:48.52 0.00016516669 0.00016516669 no</tt><tt><br> </tt> <p><b> <a name="dsssao"></a>dsssao<br> dss<br> </b></p> <p>Support for Digital Sky Survey at SAO. </p> <tt> Syntax:<br> dsssao []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $xpaget ds9 dsssao name <br> $xpaget ds9 dsssao coord <br> $xpaget ds9 dsssao size<br> $xpaget ds9 dsssao save<br> $xpaget ds9 dsssao frame<br> $xpaset -p ds9 dsssao<br> $xpaset -p ds9 dsssao m31 <br> $xpaset -p ds9 dsssao name m31 <br> $xpaset -p ds9 dsssao coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 dsssao size 60 60 arcmin<br> $xpaset -p ds9 dsssao save yes<br> $xpaset -p ds9 dsssao frame current<br> $xpaset -p ds9 dsssao update frame<br> $xpaset -p ds9 dsssao open<br> </tt><tt>$xpaset -p ds9 dsssao close</tt><br> <p><b> <a name="dsseso"></a>dsseso</b></p> <p>Support for Digital Sky Survey at ESO. </p> <tt> Syntax:<br> dsseso []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp; &nbsp; &nbsp; [survey DSS1|DSS2-red|DSS2-blue|DSS2-infrared]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 dsseso name <br> $xpaget ds9 dsseso coord <br> $xpaget ds9 dsseso size<br> $xpaget ds9 dsseso save<br> $xpaget ds9 dsseso frame<br> $xpaget ds9 dsseso survey<br> $xpaset -p ds9 dsseso<br> $xpaset -p ds9 dsseso m31 <br> $xpaset -p ds9 dsseso name m31 <br> $xpaset -p ds9 dsseso coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 dsseso size 60 60 arcmin<br> $xpaset -p ds9 dsseso save yes<br> $xpaset -p ds9 dsseso frame current<br> $xpaset -p ds9 dsseso update frame<br> $xpaset -p ds9 dsseso survey DSS2-red <br> $xpaset -p ds9 dsseso open<br> </tt><tt>$xpaset -p ds9 dsseso close</tt><br> <p><b> <a name="dssstsci"></a>dssstsci</b></p> <p>Support for Digital Sky Survey at STSCI.</p> <tt> Syntax:<br> dssstsci []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss2ukstu_red|poss2ukstu_ir|poss2ukstu_blue] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey poss1_blue|poss1_red]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [survey all|quickv|phase2_gsc2|phase2_gsc1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example:<br> $xpaget ds9 dssstsci name <br> $xpaget ds9 dssstsci coord <br> $xpaget ds9 dssstsci size<br> $xpaget ds9 dssstsci save<br> $xpaget ds9 dssstsci frame<br> $xpaget ds9 dssstsci survey<br> $xpaset -p ds9 dssstsci<br> $xpaset -p ds9 dssstsci m31 <br> $xpaset -p ds9 dssstsci name m31 <br> $xpaset -p ds9 dssstsci coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 dssstsci size 60 60 arcmin<br> $xpaset -p ds9 dssstsci save yes<br> $xpaset -p ds9 dssstsci frame current<br> $xpaset -p ds9 dssstsci update frame<br> $xpaset -p ds9 dssstsci survey all<br> $xpaset -p ds9 dssstsci open<br> $xpaset -p ds9 dssstsci close</tt><br> <p><b> <a name="envi"></a>envi</b></p> <p>Load an ENVI header and file. Optional parameter: array endian.<br> </p> <tt> Syntax: <br> envi &lt;header&gt; [&lt;filename&gt;]<br> &nbsp;<br> Example:<br> </tt><tt><tt>$xpaset -p ds9 envi foo.hdr</tt></tt><br> <tt><tt><tt><tt><tt><tt>$xpaset -p ds9 envi foo.hdr foo.bsq</tt></tt><br> $xpaset -p ds9 envi new foo.hdr foo.bsq</tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><br> </tt></tt></tt></tt></tt></tt> <p><b> <a name="exit"></a>exit<br> quit<br> </b></p> <p>Quits DS9. </p> <tt> Syntax: <br> exit<br> quit<br> &nbsp;<br> Example: <br> $xpaset -p ds9 exit<br> </tt> <p><b> <a name="export"></a>export<br> </b></p> <p>Export loaded image data of current frame in specified image format. Optional parameters: array endian, nrrd endian, jpeg quality (1-100) and tiff compression method.</p> <tt> Syntax: </tt><tt><br> </tt><tt> export </tt><tt>[array|nrrd|envi|gif|tiff|jpeg|png] </tt><tt>&lt;filename&gt;</tt><tt><br> </tt><tt>export array &lt;filename&gt;</tt><tt> </tt><tt>[big|little</tt><tt>|native]<br> </tt><tt>export nrrd &lt;filename&gt; </tt><tt>[big|little</tt><tt>|native]</tt><tt><br> export envi &lt;header&gt; [&lt;filename&gt;] </tt><tt>[big|little</tt><tt>|native]</tt><tt> </tt><tt><br> export jpeg &lt;filename&gt;</tt><tt> [1-100]</tt><tt><br> </tt><tt> </tt><tt>export tiff &lt;filename</tt><tt>&gt;</tt><tt> [none|jpeg|packbits|deflate]</tt><br> <tt> &nbsp;<br> Example: <br> </tt><tt><tt>$xpaset -p ds9 export array foo.arr little</tt></tt><br> <tt><tt>$xpaset -p ds9 export nrrd foo.nrrd little</tt></tt><br> <tt><tt><tt><tt><tt><tt>$xpaset -p ds9 export envi foo.hdr little</tt></tt><br> </tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaset -p ds9 export envi foo.hdr foo.bsq little</tt></tt><br> </tt></tt></tt></tt>$xpaset -p ds9 export tiff foo.tiff jpeg</tt></tt></tt><br> $xpaset -p ds9 export jpeg foo.jpeg 75<br> $xpaset -p ds9 export png foo.png</tt><br> <p><b> <a name="file"></a>file</b></p> <p>Query currently loaded file information. </p> <tt> Syntax:<br> file <br> &nbsp; <br> Example: <br> $xpaget ds9 file </tt><br> <p><b> <a name="fits"></a>fits</b></p> <p>Load a FITS image into the current frame or query the currently loaded image.<br> </p> <tt> Syntax: <br> fits </tt><tt><tt>[new|mask|slice] [&lt;filename&gt;]</tt><tt><br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; [width|height|depth|bitpix|type]<br> &nbsp; &nbsp;&nbsp; [size [wcs|wcsa...wcsz] [fk4|fk5|icrs|galactic|ecliptic] [degrees|arcmin|arcsecs]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[header [&lt;ext&gt;] [keyword &lt;string&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [image|table|slice]</tt><tt><br> &nbsp;<br> Example: <br> $xpaget ds9 fits &gt; foo.fits<br> $xpaget ds9 fits width<br> $xpaget ds9 fits height<br> $xpaget ds9 fits depth<br> $xpaget ds9 fits bitpix</tt><br> <tt>$xpaget ds9 fits type </tt><br> <tt><tt>$xpaget ds9 fits size<br> </tt> $xpaget ds9 fits size wcs fk5 arcmin<br> $xpaget ds9 fits header # primary<br> $xpaget ds9 fits header 2 # hdu 2<br> $xpaget ds9 fits header -2 # hdu 2 with inherit<br> $xpaget ds9 fits header keyword BITPIX<br> $xpaget ds9 fits header 1 keyword BITPIX</tt><br> <tt><tt>$xpaget ds9 fits image &gt; foo.fits<br> $xpaget ds9 fits table &gt; bar.fits<br> $xpaget ds9 fits slice &gt; foo.fits<br> </tt> $xpaset -p ds9 fits foo.fits<br> $xpaset -p ds9 fits new foo.fits<br> $xpaset -p ds9 fits bar.fits[bin=detx,dety]<br> $xpaset -p ds9 fits slice foo.fits<br> $xpaset -p ds9 fits mask foo.fits<br> $cat foo.fits | xpaset ds9 fits <br> $cat foo.fits | xpaset ds9 fits new<br> $cat bar.fits | xpaset ds9 fits -[bin=detx,dety]<br> $cat foo.fits | xpaset ds9 fits slice<br> $cat foo.fits | xpaset ds9 fits mask<br> </tt> <p><b> <a name="frame"></a>frame</b></p> <p>Controls frame functions. Frames may be created, deleted, reset, and centered. While return the current frame number. If you goto a frame that does not exists, it will be created. If the frame is hidden, it will be shown. The 'frameno' option is available for backward compatibility. </p> <tt> Syntax: <br> frame [center [#|all]]<br> &nbsp; &nbsp; &nbsp; [clear [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [new [rgb|3d]]<br> &nbsp; &nbsp; &nbsp; [delete [#|all]] <br> &nbsp; &nbsp; &nbsp; [reset [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [refresh [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [hide [#|all]]<br> &nbsp;&nbsp;&nbsp; &nbsp; [show [#|all]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move first]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move forward]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move last]<br> &nbsp; &nbsp; &nbsp; [first]<br> &nbsp;&nbsp;&nbsp; &nbsp; [prev]<br> &nbsp; &nbsp; &nbsp; [next]<br> &nbsp; &nbsp; &nbsp; [last]<br> &nbsp; &nbsp; &nbsp; [frameno #]<br> &nbsp;&nbsp;&nbsp; &nbsp; [#]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has [amplifier|datamin|datasec|detector|grid|iis|irafmin|physical|smooth]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has contour [aux]]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has fits [bin|cube|mosaic]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has marker [highlite|paste|select|undo]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [has wcs [&lt;wcssys&gt;|equatorial &lt;wcssys&gt;|linear &lt;wcssys&gt;]]<br> &nbsp;<br> Example: <br> $xpaget ds9 frame # returns the id of the current frame <br> $xpaget ds9 frame frameno # returns the id of the current frame <br> $xpaget ds9 frame all # returns the id of all frames <br> $xpaget ds9 frame active # returns the id of all active frames<br> </tt><tt>$xpaget ds9 frame lock</tt><br> <tt> $xpaget ds9 frame has amplifier<br> $xpaget ds9 frame has datamin<br> $xpaget ds9 frame has datasec<br> $xpaget ds9 frame has detector<br> $xpaget ds9 frame has grid<br> $xpaget ds9 frame has iis<br> $xpaget ds9 frame has irafmin<br> $xpaget ds9 frame has physical<br> $xpaget ds9 frame has smooth<br> $xpaget ds9 frame has contour<br> $xpaget ds9 frame has contour aux<br> $xpaget ds9 frame has fits<br> $xpaget ds9 frame has fits bin<br> $xpaget ds9 frame has fits cube<br> $xpaget ds9 frame has fits mosaic<br> $xpaget ds9 frame has marker highlite<br> $xpaget ds9 frame has marker paste<br> $xpaget ds9 frame has marker select<br> $xpaget ds9 frame has marker undo<br> $xpaget ds9 frame has system physical<br> $xpaget ds9 frame has wcs wcsa<br> $xpaget ds9 frame has wcs equatorial wcsa<br> $xpaget ds9 frame has wcs linear wcsa<br> $xpaset -p ds9 frame center # center current frame<br> $xpaset -p ds9 frame center 1 # center 'Frame1' <br> $xpaset -p ds9 frame center all # center all frames <br> $xpaset -p ds9 frame clear # clear current frame<br> $xpaset -p ds9 frame new # create new frame <br> $xpaset -p ds9 frame new rgb # create new rgb frame<br> $xpaset -p ds9 frame delete # delete current frame <br> $xpaset -p ds9 frame reset # reset current frame <br> $xpaset -p ds9 frame refresh # refresh current frame <br> $xpaset -p ds9 frame hide # hide current frame <br> $xpaset -p ds9 frame show 1 # show frame 'Frame1'<br> $xpaset -p ds9 frame move first # move frame to first in order<br> $xpaset -p ds9 frame move back # move frame back in order<br> $xpaset -p ds9 frame move forward # move frame forward in order<br> $xpaset -p ds9 frame move last # move frame to last in order<br> $xpaset -p ds9 frame first # goto first frame <br> $xpaset -p ds9 frame prev # goto prev frame <br> $xpaset -p ds9 frame next # goto next frame<br> $xpaset -p ds9 frame last # goto last frame<br> $xpaset -p ds9 frame frameno 4 # goto frame 'Frame4', create if needed<br> $xpaset -p ds9 frame 3 # goto frame 'Frame3', create if needed <br> $xpaset -p ds9 frame match wcs<br> $xpaset -p ds9 frame lock wcs</tt><br> <p><b> <a name="gif"></a>gif</b></p> <p>Load GIF image into current frame.<br> </p> <tt> Syntax:<br> gif [new|slice] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 gif &gt; foo.gif</tt><br> <tt>$xpaset -p ds9 gif foo.gif</tt><br> <tt><tt>$xpaset -p ds9 gif new foo.gif<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 gif slice foo.gif<br> </tt></tt>$cat foo.gif | xpaset ds9 gif # not available windows</tt> <br> <tt><tt>$cat foo.gif | xpaset ds9 gif</tt><tt> new # not available windows<br> </tt>$cat foo.gif | xpaset ds9 gif</tt><tt> slice</tt><tt><tt><tt> # not available windows</tt></tt></tt> <p><b> <a name="grid"></a>grid</b></p> <p> Controls coordinate grid. For grid numeric format syntax,&nbsp; click <a href="grid.html#Format">here</a>.</p> <tt> Syntax: <br> grid&nbsp; []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [type analysis|publication] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [system &lt;coordsys&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sky &lt;skyframe&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat &lt;skyformat&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [grid gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes type interior|exterior]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes origin lll|llu|lul|luu|ull|ulu|uul|uuu]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format1 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format2 &lt;format&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tickmarks style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border width &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [border style 0|1]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics type interior|exterior]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [numerics vertical yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title text &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title def yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title gap &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [title color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text1 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def1 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap1 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels text2 &lt;text&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels def2 yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels gap2 &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels font times|helvetica|courier]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontsize &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontweight normal|bold]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels fontslant roman|italic]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [labels color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [reset]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [load &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 grid <br> $xpaget ds9 grid type <br> $xpaget ds9 grid system <br> $xpaget ds9 grid sky <br> $xpaget ds9 grid skyformat <br> $xpaget ds9 grid grid <br> $xpaget ds9 grid grid color <br> $xpaget ds9 grid grid width <br> $xpaget ds9 grid grid style <br> $xpaget ds9 grid grid gap1 <br> $xpaget ds9 grid grid gap2 <br> $xpaget ds9 grid axes <br> $xpaget ds9 grid axes color <br> $xpaget ds9 grid axes width <br> $xpaget ds9 grid axes style <br> $xpaget ds9 grid axes type <br> $xpaget ds9 grid axes origin<br> $xpaget ds9 grid format1<br> $xpaget ds9 grid format2<br> $xpaget ds9 grid tickmarks <br> $xpaget ds9 grid tickmarks color <br> $xpaget ds9 grid tickmarks width <br> $xpaget ds9 grid tickmarks style <br> $xpaget ds9 grid border <br> $xpaget ds9 grid border color <br> $xpaget ds9 grid border width <br> $xpaget ds9 grid border style <br> $xpaget ds9 grid numerics <br> $xpaget ds9 grid numerics font <br> $xpaget ds9 grid numerics fontsize <br> $xpaget ds9 grid numerics fontweight<br> $xpaget ds9 grid numerics fontslant<br> $xpaget ds9 grid numerics color <br> $xpaget ds9 grid numerics gap1 <br> $xpaget ds9 grid numerics gap2 <br> $xpaget ds9 grid numerics type <br> $xpaget ds9 grid numerics vertical <br> $xpaget ds9 grid title <br> $xpaget ds9 grid title text<br> $xpaget ds9 grid title def <br> $xpaget ds9 grid title gap <br> $xpaget ds9 grid title font <br> $xpaget ds9 grid title fontsize <br> $xpaget ds9 grid title fontweight<br> $xpaget ds9 grid title fontslant<br> $xpaget ds9 grid title color <br> $xpaget ds9 grid labels <br> $xpaget ds9 grid labels text1 <br> $xpaget ds9 grid labels def1 <br> $xpaget ds9 grid labels gap1 <br> $xpaget ds9 grid labels text2 <br> $xpaget ds9 grid labels def2 <br> $xpaget ds9 grid labels gap2 <br> $xpaget ds9 grid labels font <br> $xpaget ds9 grid labels fontsize <br> $xpaget ds9 grid labels fontweight<br> $xpaget ds9 grid labels fontslant<br> $xpaget ds9 grid labels color <br> $xpaset -p ds9 grid <br> $xpaset -p ds9 grid yes<br> $xpaset -p ds9 grid type analysis <br> $xpaset -p ds9 grid system wcs <br> $xpaset -p ds9 grid sky fk5 <br> $xpaset -p ds9 grid skyformat degrees<br> $xpaset -p ds9 grid grid yes<br> $xpaset -p ds9 grid grid color red<br> $xpaset -p ds9 grid grid width 2<br> $xpaset -p ds9 grid grid style 1<br> $xpaset -p ds9 grid grid gap1 10<br> $xpaset -p ds9 grid grid gap2 10<br> $xpaset -p ds9 grid axes yes<br> $xpaset -p ds9 grid axes color red<br> $xpaset -p ds9 grid axes width 2<br> $xpaset -p ds9 grid axes style 1<br> $xpaset -p ds9 grid axes type exterior<br> $xpaset -p ds9 grid axes origin lll<br> $xpaset -p ds9 grid format1 d.2<br> $xpaset -p ds9 grid format2 d.2<br> $xpaset -p ds9 grid tickmarks yes<br> $xpaset -p ds9 grid tickmarks color red<br> $xpaset -p ds9 grid tickmarks width 2<br> $xpaset -p ds9 grid tickmarks style 1<br> $xpaset -p ds9 grid border yes<br> $xpaset -p ds9 grid border color red<br> $xpaset -p ds9 grid border width 2<br> $xpaset -p ds9 grid border style 1<br> $xpaset -p ds9 grid numerics yes<br> $xpaset -p ds9 grid numerics font courier<br> $xpaset -p ds9 grid numerics fontsize 12<br> $xpaset -p ds9 grid numerics fontweight bold<br> $xpaset -p ds9 grid numerics fontslant italic<br> $xpaset -p ds9 grid numerics color red<br> $xpaset -p ds9 grid numerics gap1 10<br> $xpaset -p ds9 grid numerics gap2 10<br> $xpaset -p ds9 grid numerics type exterior<br> $xpaset -p ds9 grid numerics vertical yes<br> $xpaset -p ds9 grid title yes<br> $xpaset -p ds9 grid title text {Hello World}<br> $xpaset -p ds9 grid title def yes<br> $xpaset -p ds9 grid title gap 10<br> $xpaset -p ds9 grid title font courier<br> $xpaset -p ds9 grid title fontsize 12<br> $xpaset -p ds9 grid title fontweight bold<br> $xpaset -p ds9 grid title fontslant italic<br> $xpaset -p ds9 grid title color red<br> $xpaset -p ds9 grid labels yes<br> $xpaset -p ds9 grid labels text1 {Hello World}<br> $xpaset -p ds9 grid labels def1 yes<br> $xpaset -p ds9 grid labels gap1 10<br> $xpaset -p ds9 grid labels text2 {Hello World}<br> $xpaset -p ds9 grid labels def2 yes<br> $xpaset -p ds9 grid labels gap2 10<br> $xpaset -p ds9 grid labels font courier<br> $xpaset -p ds9 grid labels fontsize 12<br> $xpaset -p ds9 grid labels fontweight boldj<br> $xpaset -p ds9 grid labels fontslant italic<br> $xpaset -p ds9 grid labels color red<br> $xpaset -p ds9 grid reset<br> $xpaset -p ds9 grid load foo.grd <br> $xpaset -p ds9 grid save foo.grd<br> $xpaset -p ds9 grid open<br> $xpaset -p ds9 grid close<br> </tt> <p><b> <a name="header"></a>header</b></p> <p>Display current fits header dialog. Optional extension number maybe specified. Please note, this differs from xpa fits header.</p> <tt> Syntax: <br> header [&lt;ext&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [close [&lt;ext&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save [&lt;ext&gt;] &lt;filename&gt;]<br> &nbsp;<br> Example:<br> $xpaset -p ds9 header<br> $xpaset -p ds9 header 2<br> $xpaset -p ds9 header close<br> $xpaset -p ds9 header save 1 foo.txt<br> </tt> <p><b> <a name="height"></a>height</b></p> <p>Set the height of the image display window. </p> <tt> Syntax: <br> height [&lt;value&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 height<br> $xpaset -p ds9 height 512<br> </tt> <p><b> <a name="iconify"></a>iconify</b></p> <p>Toggles iconification. </p> <tt> Syntax: <br> iconify []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;<br> Example: <br> $xpaget ds9 iconify <br> $xpaset -p ds9 iconify</tt><br> <tt> $xpaset -p ds9 iconify yes</tt><br> <p><b><a name="iexam"></a>iexam</b> </p> <p>Interactive examine function. A blinking cursor will indicate to the user to click on a point on an image. The specified information will be returned at that time. The default event is <tt>button</tt>. In the last form, the following macros will be expanded if present: <tt>$width, $height, $depth, $bitpix, $filename, $regions, $filename[$regions], $env, $pan, $value, $x, $y, $z.</tt> See <a href="analysis.html#macros">Analysis Macros</a> for more information.<br> </p> <tt> Syntax: <br> iexam []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[]|button|key|any] coordinate &lt;coordsys&gt; [&lt;skyframe&gt;] [&lt;skyformat&gt;]<br> &nbsp;&nbsp; &nbsp;&nbsp; [[]|button|key|any] data [width][height]<br> </tt><tt><tt>&nbsp;&nbsp; &nbsp;&nbsp; [[]|button|key|any] &lt;macro string&gt;]<br> &nbsp; </tt><br> Example: <br> $xpaget ds9 iexam # image coordinates<br> </tt><tt><tt>$xpaget ds9 iexam coordinate image<br> </tt>$xpaget ds9 iexam key coordinate image # return coordinate and key event<br> $xpaget ds9 iexam coordinate wcs fk5 degrees<br> $xpaget ds9 iexam coordinate wcs galactic sexagesimal<br> $xpaget ds9 iexam coordinate fk5<br> $xpaget ds9 iexam data # return data value<br> $xpaget ds9 iexam key data # return data value and key event<br> $xpaget ds9 iexam data 3 3 # return all data in 3x3 box about selected point<br> $xpaget ds9 iexam 'Click at $x,$y in file $filename'</tt><br> <p><b> <a name="iis"></a>iis</b></p> <p>Set/Get IIS Filename. Optional mosaic number maybe supplied.</p> <tt> Syntax: <br> iis [filename &lt;filename&gt; [#]]<br> &nbsp;<br> Example: <br> $xpaget ds9 iis filename<br> $xpaget ds9 iis filename 4<br> $xpaset -p ds9 iis filename foo.fits<br> $xpaset -p ds9 iis filename bar.fits 4</tt><br> <p><b> <a name="jpeg"></a>jpeg</b></p> <p>Load JPEG image into current frame. Optional parameters: <tt>jpeg </tt>quality (1-100) </p> <tt> Syntax:<br> jpeg [new|slice] [&lt;filename&gt;] [1-100]<br> &nbsp;<br> Example: <br> $xpaget ds9 jpeg &gt; foo.jpeg</tt><br> <tt><tt>$xpaget ds9 jpeg 100 &gt; foo.jpeg</tt><br> $xpaset -p ds9 jpeg foo.jpeg</tt><br> <tt><tt>$xpaset -p ds9 jpeg new foo.jpeg<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 jpeg slice foo.jpeg<br> </tt></tt>$cat foo.jpeg | xpaset ds9 jpeg </tt><tt><tt><tt> # not available windows</tt></tt></tt><br> <tt><tt>$cat foo.jpeg | xpaset ds9 jpeg</tt><tt> new</tt></tt><tt><tt><tt><tt> # not available windows</tt></tt><br> </tt>$cat foo.jpeg | xpaset ds9 jpeg</tt><tt> slice </tt><tt><tt><tt> # not available windows</tt></tt></tt> <p><b> <a name="lock"></a>lock</b></p> <p>Lock all other frames to the current frame. </p> <tt> Syntax: <br> lock</tt><tt> </tt><tt>[frame &lt;coordsys&gt;|none]<br> &nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;|none] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [crop &lt;coordsys&gt;|none]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp; [slice &lt;coordsys&gt;|none]]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [bin [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [axes [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [scale [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [scalelimites [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [colorbar [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [block [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [smooth [yes|no]]</tt><br> <tt><tt>&nbsp; </tt><br> Example:<br> $xpaget -p ds9 lock frame<br> $xpaget -p ds9 lock crosshair<br> </tt><tt>$xpaget -p ds9 lock crop</tt><br> <tt> $xpaget -p ds9 lock slice</tt><br> <tt>$xpaget -p ds9 lock bin<br> $xpaget -p ds9 lock axes<br> $xpaget -p ds9 lock scale<br> $xpaget -p ds9 lock scalelimits<br> $xpaget -p ds9 lock colorbar<br> $xpaget -p ds9 lock block <br> $xpaget -p ds9 lock smooth<br> $xpaset -p ds9 lock frame wcs</tt><tt><br> </tt><tt>$xpaset -p ds9 lock crosshair wcs<br> </tt><tt>$xpaset -p ds9 lock crop wcs</tt><br> <tt>$xpaset -p ds9 lock slice wcs</tt><br> <tt>$xpaset -p ds9 lock bin yes<br> $xpaset -p ds9 lock axes yes<br> </tt><tt>$xpaset -p ds9 lock scale yes<br> $xpaset -p ds9 lock scalelimits yes<br> </tt><tt>$xpaset -p ds9 lock colorbar yes<br> $xpaset -p ds9 lock block yes<br> $xpaset -p ds9 lock smooth yes<br> <br> </tt><b><a name="lower"></a>lower</b> <p>Lower in the window stacking order. </p> <tt> Syntax: <br> lower <br> &nbsp;<br> Example: <br> $xpaset -p ds9 lower</tt><tt><br> </tt> <p><b> <a name="magnifier"></a>magnifier</b></p> <p>Controls the magnifier settings. </p> <tt> Syntax: <br> magnifier [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [zoom &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [cursor yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [region yes|no]<br> &nbsp;<br> Example: <br> $xpaget ds9 magnifier color<br> $xpaget ds9 magnifier zoom<br> $xpaget ds9 magnifier cursor<br> $xpaget ds9 magnifier region<br> $xpaset -p ds9 magnifier color yellow<br> $xpaset -p ds9 magnifier zoom 2<br> $xpaset -p ds9 magnifier cursor no<br> $xpaset -p ds9 magnifier region no</tt><br> <p><b> <a name="mask"></a>mask<br> </b></p> <p>Controls mask parameters. </p> <tt> Syntax: <br> mask [color &lt;color&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [mark 1|0]<br> &nbsp;&nbsp;&nbsp;&nbsp; [transparency &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example:<br> $xpaget ds9 mask color<br> $xpaget ds9 mask mark<br> $xpaget ds9 mask transparency<br> $xpaset -p ds9 mask color red<br> $xpaset -p ds9 mask mark 0<br> $xpaset -p ds9 mask transparency 50<br> $xpaset -p ds9 mask clear<br> $xpaset -p ds9 mask open<br> $xpaset -p ds9 mask close<br> </tt> <p><b> <a name="match"></a>match</b></p> <p>Match all other frames to the current frame. </p> <tt> Syntax: <br> </tt><tt>match </tt><tt>[frame &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt>[crosshair &lt;coordsys&gt;] </tt><tt><br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crop &lt;coordsys&gt;]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [slice &lt;coordsys&gt;]</tt><br> <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [bin]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [axes]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scalelimits]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [block]<br> &nbsp;&nbsp;&nbsp; &nbsp; [smooth]</tt><br> <tt><tt><br> </tt> <tt> </tt> Example: <br> $xpaset -p ds9 match frame wcs <br> </tt><tt>$xpaset -p ds9 match crosshair wcs<br> </tt><tt>$xpaset -p ds9 match crop wcs</tt><br> <tt>$xpaset -p ds9 match slice</tt><tt> wcs<br> </tt><tt>$xpaset -p ds9 match bin<br> $xpaset -p ds9 match axes<br> $xpaset -p ds9 match scale<br> $xpaset -p ds9 match scalelimits<br> $xpaset -p ds9 match colorbar<br> $xpaset -p ds9 match block<br> $xpaset -p ds9 match smooth<br> <br> </tt><b><a name="mecube"></a>mecube</b> <p>Load FITS multiple extension file as data cube.<br> </p> <tt> Syntax:<br> mecube [new] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 mecube &gt; foo.fits<br> $xpaset -p ds9 mecube foo.fits</tt><br> <tt><tt>$xpaset -p ds9 mecube new foo.fits<br> </tt>$cat foo.fits | xpaset ds9 mecube</tt><br> <tt>$cat foo.fits | xpaset ds9 mecube</tt><tt> new</tt> <p><b> <a name="minmax"></a>minmax</b></p> <p>This is how DS9 determines&nbsp; the min and max data values from the data. <tt>SCAN</tt> will scan all data. <tt>SAMPLE</tt> will sample the data every n samples. <tt>DATAMIN</tt> and <tt>IRAFMIN</tt> will use the values of the keywords if present. In general, it is recommended to use <tt>SCAN</tt> unless your computer is slow or your data files are very large. Select the increment&nbsp; interval for determining the min and max data values during sampling. The larger the interval, the quicker the process. </p> <tt> Syntax: <br> minmax [scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode scan|sample|datamin|irafmin] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [interval &lt;value&gt;] <br> &nbsp;<br> Example: <br> $xpaget ds9 minmax mode <br> $xpaget ds9 minmax interval <br> $xpaset -p ds9 minmax scan <br> $xpaset -p ds9 minmax mode scan<br> $xpaset -p ds9 minmax interval 10 </tt> <p><b> <a name="mode"></a>mode</b></p> <p>Controls the first mouse button mode. </p> <tt> Syntax: <br> mode [none|region|crosshair|colorbar|pan|zoom|rotate|catalog|examine] <br> &nbsp;<br> Example: <br> $xpaget ds9 mode <br> $xpaset -p ds9 mode crosshair</tt><br> <p><b> <a name="mosaic"></a>mosaic</b></p> <p>Load FITS mosaic segment into current frame.</p> <tt> Syntax:<br> mosaic [wcs|wcsa...wcsz|iraf] [new|mask] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 mosaic &gt; foo.fits</tt><tt><br> $xpaset -p ds9 mosaic foo.fits</tt><br> <tt><tt>$xpaset -p ds9 mosaic wcs foo.fits</tt></tt><br> <tt><tt>$xpaset -p ds9 mosaic wcs new foo.fits</tt></tt><br> <tt><tt>$xpaset -p ds9 mosaic wcs mask foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>$cat foo.fits | xpaset ds9 mosaic</tt><br> <tt><tt>$cat foo.fits | xpaset ds9 mosaic wcs<br> $cat foo.fits | xpaset ds9 mosaic wcs</tt><tt> new<br> </tt>$cat foo.fits | xpaset ds9 mosaic wcs</tt><tt> mask<br> </tt> <p><b> <a name="mosaicimage"></a>mosaicimage</b></p> <p>Load FITS mosaic image into current frame.</p> <tt> Syntax:<br> mosaicimage [wcs|wcsa...wcsz|iraf|wfpc2] [new|mask] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 mosaicimage &gt; foo.fits</tt><tt><br> $xpaset -p ds9 mosaicimage foo.fits</tt><br> <tt><tt>$xpaset -p ds9 mosaicimage wcs foo.fits</tt></tt><br> <tt><tt>$xpaset -p ds9 mosaicimage wcs new foo.fits</tt></tt><br> <tt><tt>$xpaset -p ds9 mosaicimage wcs mask foo.fits</tt></tt><tt><tt><tt><br> </tt></tt>$cat foo.fits | xpaset ds9 mosaicimage</tt><br> <tt><tt>$cat foo.fits | xpaset ds9 mosaicimage wcs<br> $cat foo.fits | xpaset ds9 mosaicimage wcs new</tt><tt><br> </tt>$cat foo.fits | xpaset ds9 mosaicimage wcs mask</tt><br> <p><b> <a name="movie"></a>movie<br> savempeg<br> </b></p> <p>Create mpeg1 movie from snap shots of the DS9 window. A <tt>slice</tt> movie cycles though all slices of a cube. A <tt>frame</tt> movie cycles through all active frames. A <tt>3d</tt> movie cycles through specified viewing angles. The default is <tt>frame</tt>. Optional parameters for <tt>3d</tt>: number of frames, azimuth from/to, elevation from/to, slice from/to, oscillate/repeat times.</p> <tt> Syntax:<br> movie </tt><tt>[slice|frame|3d] </tt><tt>&lt;filename&gt;<br> </tt><tt>movie 3d &lt;filename&gt; [number|azfrom|azto|elfrom|elto|slfrom|slto|oscillate|repeat &lt;#&gt;]</tt><br> <tt> &nbsp;<br> Example:<br> $xpaset -p ds9 movie slice ds9.mpg<br> </tt><tt>$xpaset -p ds9 movie 3d ds9.mpg number 10 azfrom -60 azto 60 oscillate 1</tt><br> <p><b> <a name="multiframe"></a>multiframe</b></p> <p>Load FITS multiple extension file as multiple images.<br> </p> <tt> Syntax:<br> multiframe [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaset -p ds9 multiframe foo.fits</tt><tt><tt><br> </tt>$cat foo.fits | xpaset ds9 multiframe</tt><tt><tt><tt> # not available windows</tt></tt></tt><br> <p><b> <a name="nameserver"></a>nameserver</b></p> <p>Support Name Server functions. Coordinates are in fk5. </p> <tt> Syntax: <br> nameserver [&lt;object&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [server ned-sao|ned-eso|simbad-sao|simbad-eso]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pan]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [crosshair] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> $xpaget ds9 nameserver<br> $xpaget ds9 nameserver server<br> $xpaget ds9 nameserver skyformat<br> $xpaget ds9 nameserver m31<br> $xpaset -p ds9 nameserver m31 <br> $xpaset -p ds9 nameserver name m31 <br> $xpaset -p ds9 nameserver server ned-sao <br> $xpaset -p ds9 nameserver skyformat sexagesimal<br> $xpaset -p ds9 nameserver pan<br> $xpaset -p ds9 nameserver crosshair<br> $xpaset -p ds9 nameserver open<br> $xpaset -p ds9 nameserver close<br> </tt> <p><b> <a name="nan"></a>nan</b></p> <p>Set image not-a-number color. </p> <tt> Syntax: <br> nan &lt;color&gt;<br> &nbsp;<br> Example:<br> $xpaget ds9 nan<br> $xpaset -p ds9 nan red</tt><tt><br> </tt> <p><b> <a name="nrrd"></a>nrrd</b></p> <p>Load an NRRD (Nearly Raw Raster Data) file. Optional parameter: array endian.<br> </p> <tt> Syntax: <br> nrrd [&lt;filename&gt;] [little|big]<br> &nbsp;<br> Example:<br> $xpaget ds9 nrrd</tt><br> <tt><tt>$xpaget ds9 nrrd big<br> $xpaset -p ds9 nrrd foo.nrrd</tt></tt><br> <tt><tt><tt><tt>$xpaset -p ds9 nrrd new foo.nrrd</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt>$xpaset -p ds9 nrrd mask foo.nrrd<br> </tt></tt></tt></tt></tt>$cat foo.nrrd | xpaset ds9 nrrd</tt><br> <tt>$cat foo.nrrd | xpaset ds9 nrrd</tt><tt> new<br> $cat foo.nrrd | xpaset ds9 nrrd mask</tt> <p><b> <a name="nvss"></a>nvss</b></p> <p>Support for NRAO VLA Sky Survey.</p> <tt> Syntax: <br> nvss []<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 nvss name <br> $xpaget ds9 nvss coord <br> $xpaget ds9 nvss size<br> $xpaget ds9 nvss save<br> $xpaget ds9 nvss frame<br> $xpaset -p ds9 nvss<br> $xpaset -p ds9 nvss m31 <br> $xpaset -p ds9 nvss name m31 <br> $xpaset -p ds9 nvss coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 nvss size 60 60 arcmin<br> $xpaset -p ds9 nvss save yes<br> $xpaset -p ds9 nvss frame current<br> $xpaset -p ds9 nvss update frame<br> $xpaset -p ds9 nvss open<br> </tt><tt>$xpaset -p ds9 nvss close</tt><br> <p><b> <a name="orient"></a>orient</b></p> <p>Controls the orientation of the current frame. </p> <tt> Syntax: <br> orient [none|x|y|xy] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 orient <br> $xpaset -p ds9 orient xy<br> $xpaset -p ds9 orient open<br> $xpaset -p ds9 orient close<br> </tt> <p><b> <a name="pagesetup"></a>pagesetup</b></p> <p>Controls Page Setup options.<br> </p> <tt> Syntax: <br> pagesetup [orient portrait|landscape] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scale &lt;numberic&gt;]</tt><br> <tt> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size letter|legal|tabloid|poster|a4]</tt><br> <tt> &nbsp;<br> Example: <br> $xpaget ds9 pagesetup orient<br> $xpaget ds9 pagesetup scale <br> $xpaget ds9 pagesetup size <br> $xpaset -p ds9 pagesetup orient portrait <br> $xpaset -p ds9 pagesetup scale 50<br> $xpaset -p ds9 pagesetup size poster<br> </tt> <p><b> <a name="pan"></a>pan</b></p> <p>Controls the current image cursor location for the current frame. </p> <tt> Syntax: <br> pan [&lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;]] <br> &nbsp;&nbsp;&nbsp; [to &lt;x&gt; &lt;y&gt; &lt;coordsys&gt; [&lt;skyframe&gt;][&lt;skyformat&gt;] <br> &nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example: <br> $xpaget ds9 pan # get current image coords <br> $xpaget ds9 pan wcs fk4 sexagesimal # get current wcs coords <br> $xpaset -p ds9 pan 200 200 image # pan relative <br> $xpaset -p ds9 pan to 400 400 physical # pan to physical coords <br> $xpaset -p ds9 pan to 13:29:55 47:11:50 wcs fk5 # pan to wcs coords<br> $xpaset -p ds9 pan open<br> $xpaset -p ds9 pan close<br> </tt> <p><b> <a name="pixeltable"></a>pixeltable</b></p> <p>Display/Hide the pixel table. </p> <tt> Syntax: <br> pixeltable []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [yes|open]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [no|close]<br> &nbsp;<br> Example: <br> $xpaget ds9 pixeltable <br> $xpaset -p ds9 pixeltable<br> $xpaset -p ds9 pixeltable yes<br> $xpaset -p ds9 pixeltable open<br> $xpaset -p ds9 pixeltable close</tt><br> <p><b> <a name="plot"></a>plot</b></p> <p>Display and configure data plots. All plot commands take an optional second command, the plot name. If no plot name is specified, the last plot created is assumed. Plot data is assumed to be a pair of coordinates, with optional error values. The follow are valid data descriptions:</p> <blockquote>xy &nbsp;&nbsp; &nbsp; &nbsp; x and y coordinates<br> xyex&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with x errors<br> xyey&nbsp;&nbsp;&nbsp; &nbsp; x,y coordinates with y errors<br> xyexey&nbsp;&nbsp;&nbsp; x,y coordinates with&nbsp; x and y errors<br> </blockquote> <p>To create a new plot, use the plot new command.</p> <tt> Syntax: <br> # create new empty plot window<br> plot<br> plot [bar|scatter]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [new [name &lt;plotname&gt;] [line|bar|scatter] &lt;title&gt; &lt;xaxis label&gt; &lt;yaxis label&gt; </tt><tt>xy|xyex|xyey|xyexey</tt><tt>]<br> <br> # create new plot with data<br> plot [new [name &lt;plotname&gt;] </tt><tt>[line|bar|scatter] </tt><tt>stdin] # title, title xaxis, title yaxis, dimension on line 1<br> &nbsp;&nbsp;&nbsp; &nbsp;[new [name &lt;plotname&gt;] [line|bar|scatter] &lt;title&gt; &lt;xaxis label&gt; &lt;yaxis label&gt; xy|xyex|xyey|xyexey]<br> <br> # load dataset into an existing plot<br> plot [&lt;plotname&gt;] [data xy|xyex|xyey|xyexey]<br> </tt><tt><tt><br> plot [&lt;plotname&gt;] load &lt;filename&gt; [xy|xyex|xyey|xyexey]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] save &lt;filename&gt;<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] clear<br> </tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] duplicate<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] stats<br> </tt></tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] list<br> &nbsp;&nbsp;&nbsp;&nbsp; </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>[&lt;plotname&gt;] loadconfig &lt;filename&gt;<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] saveconfig &lt;filename&gt;<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] pagesetup orient [portrait|landscape]<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] pagesetup size [letter|legal|tabloid|poster|a4]</tt><br> <tt> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] print destination [printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print command &lt;command&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print filename &lt;filename&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] print color [rgb|gray]<br> </tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt>[&lt;plotname&gt;] close<br> </tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><br> plot </tt>[&lt;plotname&gt;] mode [pointer|zoom]<br> </tt></tt></tt></tt></tt></tt><tt><br> # configure graph<br> plot [&lt;plotname&gt;] axis [x|y] grid [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] log [yes|no]<br> </tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] flip [yes|no]</tt><br> <tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] axis [x|y] auto [yes|no]<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] min &lt;value&gt;<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] max &lt;value&gt;</tt><tt><br> </tt><tt><tt>&nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] axis [x|y] format &lt;string&gt;</tt><tt><br> </tt></tt>&nbsp;&nbsp;&nbsp;&nbsp; </tt><tt><tt>[&lt;plotname&gt;] legend [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;[&lt;plotname&gt;] legend position [right|left|top|bottom]</tt><br> </tt><tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font [title|labels|numbers] font [times|helvetica|courier]<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> size &lt;value&gt;<br> &nbsp; &nbsp; &nbsp;[&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> weight [normal|bold]<br> &nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] font </tt></tt><tt><tt><tt><tt>[title|labels|numbers]</tt></tt> slant [roman|italic]<br> </tt></tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] title &lt;string&gt;</tt><br> <tt><tt>&nbsp; &nbsp;&nbsp; [&lt;plotname&gt;] title [x|y] &lt;string&gt;<br> &nbsp;&nbsp;&nbsp;&nbsp; </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] barmode [normal|stacked|aligned|overlap]<br> <br> </tt> # configure current dataset<br> </tt>plot [&lt;plotname&gt;] show [yes|no]<br> </tt>&nbsp; &nbsp;&nbsp; <tt></tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape [circle|square|diamond|plus|splus|scross|triangle|arrow]</tt></tt></tt></tt><br> <tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape fill [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] shape color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] smooth [step|linear|cubic|quadratic|catrom]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] width &lt;value&gt;<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] dash [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error [yes|no]</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; [&lt;plotname&gt;] color &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] error width &lt;value&gt;</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>&nbsp;&nbsp;&nbsp;&nbsp; <tt> </tt></tt><tt><tt><tt><tt>[&lt;plotname&gt;] name &lt;string&gt;<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><br> # select current dataset<br> </tt></tt></tt>plot [&lt;plotname&gt;] select &lt;value&gt;<br> &nbsp; <br> Example: <br> </tt><tt><tt> </tt><tt><tt># return all plotnames<br> </tt></tt>$xpaget ds9 plot</tt><tt><tt><br> </tt><br> # create new empty plot window<br> $xpaset -p ds9 plot<br> $xpaset -p ds9 plot scatter<br> $xpaset -p ds9 plot new<br> $xpaset -p ds9 plot new bar<br> $xpaset -p ds9 plot new name foo<br> $xpaset -p ds9 plot new name foo scatter<br> <br> # create new plot with data<br> $cat foo.dat | xpaset ds9 plot new stdin <br> $cat foo.dat | xpaset ds9 plot new name foo stdin<br> $cat bar.dat | xpaset ds9 plot new "{The Title}" "{X}" "{Y}" xy<br> $cat bar.dat | xpaset ds9 plot new name foo "{The Title}" "{X}" "{Y}" xy<br> <br> # load additional dataset into an existing plot<br> $cat bar.dat | xpaset ds9 plot data xy # plot additional data<br> $cat bar.dat | xpaset ds9 plot foo data xy # plot additional data<br> </tt><tt><tt><br> </tt></tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot stats<br> </tt></tt></tt></tt></tt></tt><tt><tt><tt><tt>$xpaget ds9 plot list<br> </tt></tt>$xpaset -p ds9 plot load foo.dat xy # load new dataset with dimension xy<br> $xpaset -p ds9 plot save bar.dat # save current dataset<br> </tt></tt><tt><tt>$xpaset -p ds9 plot clear # clear all datasets<br> $xpaset -p ds9 plot duplicate # duplicate current dataset<br> </tt></tt><tt><tt><tt><tt><tt><tt>$xpaset -p ds9 plot stats<br> </tt></tt></tt></tt></tt></tt><tt><tt>$xpaset -p ds9 plot list<br> </tt></tt><tt><tt>$xpaset -p ds9 plot loadconfig foo.plt # load plot configuration <br> $xpaset -p ds9 plot saveconfig bar.plt # save current plot configuration<br> </tt></tt><tt><tt>$xpaset -p ds9 plot pagesetup orient portrait<br> $xpaset -p ds9 plot pagesetup size letter<br> </tt></tt><tt><tt>$xpaset -p ds9 plot print<br> $xpaset -p ds9 plot print destination file<br> $xpaset -p ds9 plot print command "lp"<br> $xpaset -p ds9 plot print filename "foo.ps"<br> $xpaset -p ds9 plot print color rgb<br> </tt>$xpaset -p ds9 plot close # close current plot<br> </tt><tt><tt><br> $xpaget ds9 plot mode<br> $xpaset -p ds9 plot mode pointer</tt><br> </tt><tt><br> # configure plot<br> $xpaget ds9 plot axis x grid<br> </tt><tt><tt>$xpaget ds9 plot axis x log<br> </tt></tt><tt><tt><tt>$xpaget ds9 plot axis x flip</tt></tt></tt><br> <tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot axis x auto<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot axis x min<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot axis x max<br> $xpaget ds9 plot axis x format<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>$xpaget ds9 plot legend<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt>$xpaget ds9 plot legend position<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot font numbers font<br> </tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot font numbers size<br> </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot font numbers weight<br> </tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot font numbers slant<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot title<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot title x</tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><br> $xpaget ds9 plot barmode<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt> </tt></tt>$xpaset -p ds9 plot axis x grid yes<br> $xpaset -p ds9 plot axis x log yes</tt><br> <tt>$xpaset -p ds9 plot axis x flip yes</tt><tt><br> </tt><tt><tt>$xpaset -p ds9 plot axis x auto no<br> $xpaset -p ds9 plot axis x min 0<br> $xpaset -p ds9 plot axis x max 100<br> $xpaset -p ds9 plot axis x format {%f}<br> </tt>$xpaset -p ds9 plot legend yes # show legend<br> </tt><tt>$xpaset -p ds9 plot legend position left</tt><tt><tt><tt><tt><br> </tt></tt>$xpaset -p ds9 plot font numbers font times<br> $xpaset -p ds9 plot font numbers size 12<br> $xpaset -p ds9 plot font numbers weight bold<br> $xpaset -p ds9 plot font numbers slant italic<br> </tt></tt><tt>$xpaset -p ds9 plot title {The Title}<br> $xpaset -p ds9 plot title x {X Axis}<br> $xpaset -p ds9 plot barmode aligned<br> <br> # configure current dataset<br> $xpaget ds9 plot show<br> $xpaget ds9 plot shape</tt> <br> <tt><tt>$xpaget ds9 plot shape fill<br> </tt></tt><tt><tt><tt>$xpaget ds9 plot shape color<br> </tt></tt></tt><tt><tt><tt><tt>$xpaget ds9 plot smooth<br> </tt></tt></tt></tt><tt><tt><tt><tt><tt>$xpaget ds9 plot color<br> </tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot width<br> </tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot dash<br> </tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot error<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot error color<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot error width<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt><tt>$xpaget ds9 plot name<br> </tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt></tt>$xpaset -p ds9 plot show yes<br> $xpaset -p ds9 plot shape circle<br> </tt><tt><tt>$xpaset -p ds9 plot shape fill no<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 plot shape color cyan<br> </tt></tt></tt><tt><tt>$xpaset -p ds9 plot smooth step<br> </tt>$xpaset -p ds9 plot color red<br> $xpaset -p ds9 plot width 2<br> $xpaset -p ds9 plot dash yes<br> $xpaset -p ds9 plot error yes<br> $xpaset -p ds9 plot error color red</tt><br> <tt>$xpaset -p ds9 plot error width 2</tt><br> <tt>$xpaset -p ds9 plot name {My Data}</tt><br> <tt><br> # select current dataset<br> $xpaget ds9 plot select<br> $xpaset -p ds9 plot select 2</tt><br> <p><b><b><a name="png"></a></b>png</b></p> <p>Load PNG image into current frame.<br> </p> <tt> Syntax:<br> png [new|slice] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 png &gt; foo.png</tt><br> <tt>$xpaset -p ds9 png foo.png</tt><br> <tt><tt>$xpaset -p ds9 png new foo.png<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 png slice foo.png<br> </tt></tt>$cat foo.png | xpaset ds9 png</tt><tt><tt><tt> # not available windows</tt></tt></tt><br> <tt><tt>$cat foo.png | xpaset ds9 png</tt><tt> new </tt></tt><tt><tt><tt><tt> # not available windows</tt></tt><br> </tt>$cat foo.png | xpaset ds9 png</tt><tt> slice</tt><tt><tt><tt> # not available windows</tt></tt></tt> <p><b> <a name="prefs"></a>prefs</b></p> <p>Controls various preference settings. </p> <tt> Syntax: <br> prefs [clear]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [irafalign yes|no]<br> &nbsp; <br> Example:<br> $xpaget ds9 prefs irafalign <br> $xpaset -p ds9 prefs clear<br> $xpaset -p ds9 prefs iraf yes<br> </tt> <p><b><a name="preserve"></a>preserve</b> </p> <p>Preserve the follow attributes while loading a new image. </p> <tt> Syntax: <br> preserve [pan yes|no]<br> &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; [regions yes|no]<br> &nbsp;<br> Example: <br> $xpaget ds9 preserve pan<br> $xpaget ds9 preserve regions<br> $xpaset -p ds9 preserve pan yes<br> $xpaset -p ds9 preserve regions yes<br> </tt> <p><b> <a name="psprint"></a>psprint</b></p> <p>For MacOSX and Windows, invokes postscript printing. For all others, same as print. Please see <a href="command.html#print">print</a> for further details.</p> <p><b> <a name="print"></a>print</b></p> <p>Controls printing. Use print option to set printing options. Use print to actually print. </p> <tt> Syntax: <br> print [destination printer|file] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;command&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [filename &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color rgb|cmyk|gray] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [level 1|2] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [resolution 53|72|75|150|300|600] <br> &nbsp;<br> Example: <br> $xpaget ds9 print destination <br> $xpaget ds9 print command <br> $xpaget ds9 print filename <br> $xpaget ds9 print color<br> $xpaget ds9 print level <br> $xpaget ds9 print resolution <br> $xpaset -p ds9 print <br> $xpaset -p ds9 print destination file <br> $xpaset -p ds9 print command '{gv -}' <br> $xpaset -p ds9 print filename foo.ps <br> $xpaset -p ds9 print color cmyk <br> $xpaset -p ds9 print level 2 <br> $xpaset -p ds9 print resolution 75 </tt> <p><b> <a name="raise"></a>raise</b></p> <p>Raise in the window stacking order. </p> <tt> Syntax: <br> raise <br> &nbsp;<br> Example: <br> $xpaset -p ds9 raise </tt> <p><b> <a name="regions"></a>regions</b></p> <p>Controls regions in the current frame. </p> <tt> Syntax: <br> regions&nbsp;[&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [load [all] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [list [close]]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [epsilon &lt;integer&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [show yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [showtext yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid auto yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [centroid radius &lt;value&gt;|iteration &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [getinfo]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move front] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [move back]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select all]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select none] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [select invert]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [delete all] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [delete select] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [format ds9|xml|ciao|saotng|saoimage|pros|xy] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [system image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sky fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [strip yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [shape &lt;shape&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [color &amp;ltcolor&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [width &lt;width&gt;]<br> </tt><tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [fixed|edit|rotate|delete yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [include|exclude|source|background]</tt><br> <tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [delim [nl|&lt;char&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [command &lt;marker command&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [composite]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [dissolve]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [template &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [template &lt;filename&gt; at &lt;ra&gt; &lt;dec&gt; &lt;coordsys&gt; &lt;skyframe&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [savetemplate &lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [groups] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group new]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; new]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; update]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [group &lt;tag&gt; select]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; color &amp;ltcolor&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; copy] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; delete] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; font &lt;font&gt;] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; move &lt;int&gt; &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; movefront] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; moveback] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [group &lt;tag&gt; property &lt;property&gt; yes|no] <br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [copy]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [cut]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [paste image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [undo]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-format ds9|ciao|saotng|saoimage|pros|xy]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-system image|physical|wcs|wcsa...wcsz]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-sky fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-skyformat degrees|sexagesimal]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-delim [nl|&lt;char&gt;]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-prop select|edit|move|rotate|delete|fixed|include|source 1|0] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-group &lt;tag&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-strip yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [-wcs yes|no]<br> &nbsp;<br> Example: <br> $xpaget ds9 regions<br> $xpaget ds9 regions -format ds9 -system wcs -sky fk5 -skyformat sexagesimal -prop edit 1 -group foo <br> $xpaget ds9 regions epsilon<br> $xpaget ds9 regions show<br> $xpaget ds9 regions showtext<br> $xpaget ds9 regions centroid auto<br> $xpaget ds9 regions centroid radius<br> $xpaget ds9 regions centroid iteration<br> $xpaget ds9 regions selected<br> $xpaget ds9 regions format <br> $xpaget ds9 regions system <br> $xpaget ds9 regions sky <br> $xpaget ds9 regions skyformat <br> $xpaget ds9 regions strip<br> $xpaget ds9 regions shape <br> $xpaget ds9 regions color <br> $xpaget ds9 regions width<br> $xpaget ds9 regions delim<br> $xpaget ds9 regions source <br> $xpaget ds9 regions background <br> $xpaget ds9 regions include <br> $xpaget ds9 regions exclude <br> $xpaget ds9 regions selected<br> $xpaget ds9 regions groups<br> $cat foo.reg | xpaset ds9 regions -format xy -system wcs -sky fk5<br> $cat bar.reg | xpaset ds9 regions -format ds9<br> $echo "image; circle 100 100 20" | xpaset ds9 regions <br> $echo "image; circle 100 100 20" | xpaset ds9 regions<br> $echo "fk5; circle 13:29:55 47:11:50 .5'" | xpaset ds9 regions <br> $echo "physical; ellipse 100 100 20 40" | xpaset ds9 regions <br> $echo "box 100 100 20 40 25" | xpaset ds9 regions <br> $echo "image; line 100 100 200 400" | xpaset ds9 regions <br> $echo "physical; ruler 200 300 200 400" | xpaset ds9 regions <br> $echo "image; text 100 100 # text={Hello, World}" | xpaset ds9 regions <br> $echo "fk4; boxcircle point 13:29:55 47:11:50" | xpaset ds9 regions <br> $xpaset -p ds9 regions foo.reg <br> $xpaset -p ds9 regions -format ciao bar.reg # load as ciao format<br> $xpaset -p ds9 regions foo.fits # FITS regions files do not need a format specification<br> $xpaset -p ds9 regions load foo.reg # load foo.reg into current frame<br> $xpaset -p ds9 regions load all foo.reg # load foo.reg into all frames<br> $xpaset -p ds9 regions load '*.reg'# expand *.reg and load into current frame<br> $xpaset -p ds9 regions load all '*.reg' # expand *.reg and load into all frames<br> $xpaset -p ds9 regions save foo.reg<br> $xpaset -p ds9 regions list <br> $xpaset -p ds9 regions list close<br> $xpaset -p ds9 regions epsilon 5<br> $xpaset -p ds9 regions show yes<br> $xpaset -p ds9 regions showtext no<br> $xpaset -p ds9 regions centroid<br> $xpaset -p ds9 regions centroid auto yes<br> $xpaset -p ds9 regions centroid radius 10<br> $xpaset -p ds9 regions centroid iteration 20<br> $xpaset -p ds9 regions getinfo<br> $xpaset -p ds9 regions move back <br> $xpaset -p ds9 regions move front <br> $xpaset -p ds9 regions select all <br> $xpaset -p ds9 regions select none <br> $xpaset -p ds9 regions select invert<br> $xpaset -p ds9 regions delete all <br> $xpaset -p ds9 regions delete select <br> $xpaset -p ds9 regions format ds9 <br> $xpaset -p ds9 regions system wcs<br> $xpaset -p ds9 regions sky fk5 <br> $xpaset -p ds9 regions skyformat degrees <br> $xpaset -p ds9 regions delim nl <br> $xpaset -p ds9 regions strip yes<br> $xpaset -p ds9 regions shape ellipse <br> $xpaset -p ds9 regions color red <br> $xpaset -p ds9 regions width 3<br> $xpaset -p ds9 regions edit yes<br> $xpaset -p ds9 regions include<br> $xpaset -p ds9 regions command '{circle 100 100 20 # color=red}'<br> $xpaset -p ds9 regions composite<br> $xpaset -p ds9 regions dissolve<br> $xpaset -p ds9 regions template foo.tpl<br> $xpaset -p ds9 regions template foo.tpl at 13:29:55.92 +47:12:48.02 fk5<br> $xpaset -p ds9 regions savetemplate foo.tpl<br> $xpaset -p ds9 regions group new<br> $xpaset -p ds9 regions group foo new<br> </tt><tt>$xpaset -p ds9 regions group foo update</tt><br> <tt>$xpaset -p ds9 regions group foo select</tt><br> <tt>$xpaset -p ds9 regions group foo color red<br> $xpaset -p ds9 regions group foo copy<br> $xpaset -p ds9 regions group foo delete<br> $xpaset -p ds9 regions group foo cut<br> $xpaset -p ds9 regions group foo font {times 14 bold}<br> $xpaset -p ds9 regions group foo move 100 100 <br> $xpaset -p ds9 regions group foo movefront <br> $xpaset -p ds9 regions group foo moveback <br> $xpaset -p ds9 regions group foo property delete no <br> <br> $xpaset -p ds9 regions copy<br> $xpaset -p ds9 regions cut<br> $xpaset -p ds9 regions paste wcs<br> $xpaset -p ds9 regions undo<br> </tt> <p><b> <a name="restore"></a>restore</b></p> <p>Restore DS9 to a previous state from a backup save set. </p> <tt> Syntax: <br> restore &lt;filename&gt;<br> &nbsp;<br> Example:<br> $xpaset -p ds9 restore ds9.bck</tt><br> <p><b> <a name="rgb"></a>rgb</b></p> <p>Create RGB frame and control RGB frame parameters.</p> <tt> Syntax: <br> rgb&nbsp; []<br> &nbsp;&nbsp;&nbsp; &nbsp;[red|green|blue]<br> &nbsp;&nbsp;&nbsp; &nbsp;[channel [red|green|blue]]<br> &nbsp;&nbsp; &nbsp; [view [red|green|blue] [yes|no]]<br> &nbsp;&nbsp;&nbsp; &nbsp;[system &lt;coordsys&gt;]<br> &nbsp;&nbsp;&nbsp; &nbsp;[lock wcs|crop|slice|bin|scale|scalelimits|colorbar|block|smooth [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $xpaget ds9 rgb channel<br> </tt><tt>$xpaget ds9 rgb lock wcs</tt><br> <tt>$xpaget ds9 rgb lock crop</tt><br> <tt>$xpaget ds9 rgb lock slice</tt><br> <tt> $xpaget ds9 rgb lock bin<br> $xpaget ds9 rgb lock scale<br> $xpaset ds9 rgb lock scalelimits<br> $xpaget ds9 rgb lock colorbar<br> $xpaget ds9 rgb lock block<br> $xpaget ds9 rgb lock smooth<br> $xpaget ds9 rgb system<br> $xpaget ds9 rgb view red<br> $xpaget ds9 rgb view green<br> $xpaget ds9 rgb view blue<br> $xpaset -p ds9 rgb # create new rgb frame<br> $xpaset -p ds9 rgb red # set current channel to red<br> $xpaset -p ds9 rgb channel red # set current channel to red<br> $xpaset -p ds9 rgb view blue no # turn off blue channel<br> $xpaset -p ds9 rgb system wcs # set rgb coordinate system<br> </tt><tt>$xpaset -p ds9 rgb lock wcs yes</tt><br> <tt>$xpaset -p ds9 rgb lock crop yes</tt><br> <tt>$xpaset -p ds9 rgb lock slice yes</tt><br> <tt>$xpaset -p ds9 rgb lock bin yes</tt><br> <tt> $xpaset -p ds9 rgb lock scale yes<br> $xpaset -p ds9 rgb lock scalelimits yes<br> $xpaset -p ds9 rgb lock colorbar yes<br> $xpaset -p ds9 rgb lock block yes<br> $xpaset -p ds9 rgb lock smooth yes<br> $xpaset -p ds9 rgb open<br> $xpaset -p ds9 rgb close</tt><br> <p><b> <a name="rgbarray"></a>rgbarray</b></p> <p>Load raw data array cube into rgb frame.<br> </p> <tt> Syntax:<br> rgbarray [native|big|little]<br> rgbarray [new|mask] [[xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],[zdim=3],bitpix=&lt;b&gt;,skip=&lt;s&gt;,endian=[little|big]]<br> &nbsp;<br> Example: <br> $xpaget ds9 rgbarray &gt; foo.arr<br> $xpaget ds9 rgbarray little &gt; foo.arr<br> $xpaset -p ds9 rgbarray foo.arr[dim=512,zdim=3,bitpix=-32,endian=little]<br> $xpaset -p ds9 rgbarray new foo.arr[dim=512,zdim=3,bitpix=</tt><tt>-32,endian=little]</tt><br> <tt>$cat foo.arr | xpaset ds9 rgbarray [dim=512,zdim=3,bitpix=-32,endian=little]</tt><br> <tt>$cat foo.arr | xpaset ds9 rgbarray new [dim=512,zdim=3,bitpix=-32,endian=little]</tt><br> <p><b> <a name="rgbcube"></a>rgbcube</b></p> <p>Load FITS rgbcube into rgb frame.<br> </p> <tt> Syntax:<br> rgbcube [new] [&lt;filename&gt;]<br> <br> Example: <br> $xpaget ds9 rgbcube &gt; foo.fits<br> $xpaset -p ds9 rgbcube foo.fits</tt><br> <tt><tt>$xpaset -p ds9 rgbcube new foo.fits<br> </tt>$cat foo.fits | xpaset ds9 rgbcube</tt><br> <tt>$cat foo.fits | xpaset ds9 rgbcube</tt><tt> new</tt><br> <p><b> <a name="rgbimage"></a>rgbimage</b></p> <p>Load FITS rgbimage into rgb frame.<br> </p> <tt> Syntax:<br> rgbimage [new] [&lt;filename&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 rgbimage &gt; foo.fits<br> $xpaset -p ds9 rgbimage foo.fits</tt><br> <tt><tt>$xpaset -p ds9 rgbimage new foo.fits<br> </tt>$cat foo.fits | xpaset ds9 rgbimage</tt><br> <tt>$cat foo.fits | xpaset ds9 rgbimage</tt><tt> new<br> </tt> <p><b> <a name="rotate"></a>rotate</b></p> <p>Controls the rotation angle (in degrees) of the current frame. </p> <tt> Syntax: <br> rotate [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> $xpaget ds9 rotate <br> $xpaset -p ds9 rotate 45 <br> $xpaset -p ds9 rotate to 30<br> $xpaset -p ds9 rotate open<br> $xpaset -p ds9 rotate close<br> </tt> <p><b> <a name="save"></a>save<br> </b></p> <p>Save loaded image data of current frame as FITS.</p> <tt> Syntax: <br> save </tt><tt>[fits|rgbimage|rgbcube|mecube|mosaic|mosaicimage] &lt;filename&gt; [image|table|slice]</tt> <br> <tt> &nbsp;<br> Example: <br> $xpaset -p ds9 save foo.fits</tt><br> <tt>$xpaset -p ds9 save fits foo.fits image</tt><br> <tt>$xpaset -p ds9 save fits foo.fits table<br> $xpaset -p ds9 save fits foo.fits slice</tt><br> <tt>$xpaset -p ds9 save rgbimage foo.fits<br> </tt><tt>$xpaset -p ds9 save rgbcube foo.fits</tt><br> <tt>$xpaset -p ds9 save mecube foo.fits</tt><br> <tt>$xpaset -p ds9 save mosaic foo.fits</tt><br> <tt>$xpaset -p ds9 save mosaicimage foo.fits</tt><br> <p><b> <a name="saveimage"></a>saveimage<br> </b></p> <p>Create a snap shot of the current DS9 window and save in specified image format. If no format specified, the file name extension is used to determine the output format. Optional parameters: <tt>jpeg </tt>quality (1-100) and <tt>tiff </tt>compression method. </p> <tt> Syntax: <br> saveimage </tt><tt>[fits|eps|gif|tiff|jpeg|png] </tt><tt>&lt;filename&gt;<br> saveimage &lt;filename&gt;.jpeg [1-100]<br> saveimage &lt;filename&gt;.tiff [none|jpeg|packbits|deflate]<br> &nbsp;<br> Example: <br> $xpaset -p ds9 saveimage ds9.tiff<br> $xpaset -p ds9 saveimage jpeg ds9.jpeg 75</tt><br> <p><b> <a name="scale"></a>scale</b></p> <p>Controls the limits and color scale distribution. </p> <tt> Syntax: <br> scale [linear|log|pow|sqrt|squared|asinh|sinh|histequ]<br> &nbsp; &nbsp; &nbsp; [log exp &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [datasec yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [limits &lt;minvalue&gt; &lt;maxvalue&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mode minmax|&lt;value&gt;|zscale|zmax] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [scope local|global] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [match limits]<br> &nbsp;&nbsp;&nbsp; &nbsp; [lock [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [lock limits [yes|no]]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> $xpaget ds9 scale<br> $xpaget ds9 scale log exp <br> $xpaget ds9 scale datasec <br> $xpaget ds9 scale limits <br> $xpaget ds9 scale mode <br> $xpaget ds9 scale scope <br> $xpaget ds9 scale lock<br> $xpaget ds9 scale lock limits<br> $xpaset -p ds9 scale linear<br> $xpaset -p ds9 scale log 100<br> $xpaset -p ds9 scale datasec yes <br> $xpaset -p ds9 scale histequ <br> $xpaset -p ds9 scale limits 1 100 <br> $xpaset -p ds9 scale mode zscale <br> $xpaset -p ds9 scale mode 99.5 <br> $xpaset -p ds9 scale scope local<br> $xpaset -p ds9 scale match<br> $xpaset -p ds9 scale match limits<br> $xpaset -p ds9 scale lock yes<br> $xpaset -p ds9 scale lock limits yes<br> $xpaset -p ds9 scale open<br> $xpaset -p ds9 scale close<br> </tt> <p><b> <a name="shm"></a>shm</b></p> <p>Load a shared memory segment into the current frame. </p> <tt> Syntax: <br> shm [&lt;key&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [key &lt;key&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [shmid &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [fits [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaicimage [iraf|wcs|wcsa...wcsz|wfpc2] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaicimagenext [wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [mosaic [iraf|wcs|wcsa...wcsz] [key|shmid] &lt;id&gt; [&lt;filename&gt;]] <br> &nbsp;&nbsp;&nbsp; [rgbcube [key|shmid] &lt;id&gt; [&lt;filename&gt;]<br> &nbsp;&nbsp;&nbsp; [rgbimage [key|shmid] &lt;id&gt; [&lt;filename&gt;]]<br> &nbsp;&nbsp;&nbsp; [rgbarray [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;,zdim=3],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;&nbsp;&nbsp; [array [key|shmid] &lt;id&gt; [xdim=&lt;x&gt;,ydim=&lt;y&gt;|dim=&lt;dim&gt;],bitpix=&lt;b&gt;,[skip=&lt;s&gt;]]<br> &nbsp;&nbsp;&nbsp; [startload|finishload]<br> &nbsp;<br> Example: <br> $xpaget ds9 shm <br> $xpaset -p ds9 shm 102 <br> $xpaset -p ds9 shm key 102<br> $xpaset -p ds9 shm shmid 102 foo<br> $xpaset -p ds9 shm fits key 100 foo <br> $xpaset -p ds9 shm mosaicimage iraf key 100 foo <br> $xpaset -p ds9 shm mosaicimage wcs key 100 foo <br> $xpaset -p ds9 shm mosaicimage wcsa key 100 foo <br> $xpaset -p ds9 shm mosaicimage wfpc2 key 100 foo <br> $xpaset -p ds9 shm mosaicimagenext wcs key 100 foo<br> $xpaset -p ds9 shm mosaic iraf key 100 foo <br> $xpaset -p ds9 shm mosaic wcs key 100 foo <br> $xpaset -p ds9 shm rgbcube key 100 foo <br> $xpaset -p ds9 shm rgbimage key 100 foo<br> $xpaset -p ds9 shm rgbarray key 100 [dim=200,zdim=3,bitpix=-32]<br> $xpaset -p ds9 shm array shmid 102 [dim=32,bitpix=-32]<br> $xpaset -p ds9 shm startload # start a multiple load sequence without updating the display<br> $xpaset -p ds9 shm finishload # finish multiple load sequence<br> </tt> <p><b> <a name="single"></a>single</b></p> <p>Select Single Display mode </p> <tt> Syntax: <br> single <br> &nbsp;<br> Example: <br> $xpaget ds9 single <br> $xpaset -p ds9 single<br> </tt> <p><b> <a name="skyview"></a>skyview </b></p> <p>Support for SkyView image server at HEASARC. </p> <tt> Syntax: <br> skyview []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [pixels &lt;width&gt; &lt;height&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [survey &lt;survey&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> $xpaget ds9 skyview name <br> $xpaget ds9 skyview coord <br> $xpaget ds9 skyview size<br> $xpaget ds9 skyview pixels<br> $xpaget ds9 skyview save<br> $xpaget ds9 skyview frame<br> $xpaget ds9 skyview survey<br> $xpaset -p ds9 skyview<br> $xpaset -p ds9 skyview m31 <br> $xpaset -p ds9 skyview name m31 <br> $xpaset -p ds9 skyview coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 skyview size 60 60 arcmin<br> $xpaset -p ds9 skyview pixels 600 600<br> $xpaset -p ds9 skyview save yes<br> $xpaset -p ds9 skyview frame current<br> $xpaset -p ds9 skyview update frame<br> $xpaset -p ds9 skyview survey sdssi<br> $xpaset -p ds9 skyview open<br> </tt><tt>$xpaset -p ds9 skyview close</tt><br> <p><b> <a name="sleep"></a>sleep </b></p> <p>Delays execution for specified number of seconds. Default is 1 second. <br> </p> <tt> Syntax: <br> sleep [#]<br> &nbsp;<br> Example: <br> $xpaset -p ds9 sleep<br> $xpaset -p ds9 sleep 2<br> </tt> <p><b> <a name="smooth"></a>smooth</b></p> <p>Smooth current image or set smooth parameters.</p> <tt> Syntax:<br> smooth []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [function boxcar|tophat|gaussian]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [radius &lt;int&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [match]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [lock [yes|no]]<br> <br> Example:<br> $xpaget ds9 smooth<br> $xpaget ds9 smooth function<br> $xpaget ds9 smooth radius<br> $xpaget ds9 smooth lock<br> $xpaset -p ds9 smooth<br> $xpaset -p ds9 smooth yes<br> $xpaset -p ds9 smooth function tophat<br> $xpaset -p ds9 smooth radius 4<br> $xpaset -p ds9 smooth open<br> $xpaset -p ds9 smooth close<br> $xpaset -p ds9 smooth match<br> $xpaset -p ds9 smooth lock yes<br> </tt> <p><b> <a name="source"></a>source</b></p> <p>Source TCL code from a file. </p> <tt> Syntax: <br> source [filename] <br> &nbsp;<br> Example: <br> $xpaset -p ds9 source foo.tcl </tt> <p><b> <a name="tcl"></a>tcl</b></p> <p>Execute one tcl command. Must be enabled via the -tcl command line option.</p> <tt> Syntax: <br> tcl [&lt;tcl command&gt;] <br> &nbsp;<br> Example: <br> $echo 'puts "Hello, World"' | xpaset ds9 tcl<br> $xpaset -p ds9 tcl 'puts "Hello, World"'</tt><tt><br> </tt> <p><b> <a name="threads"></a>threads</b></p> <p>Set number of process threads for functions which are multi-threaded.<br> </p> <tt> Syntax:<br> threads #<br> &nbsp;<br> Example: <br> $xpaget ds9 threads<br> $xpaset -p ds9 threads 8</tt><br> <p><b> <a name="tiff"></a>tiff</b></p> <p>Load TIFF image into current frame. Optional parameters: <tt>tiff </tt>compression method. </p> <tt> Syntax:<br> tiff [new|slice] [&lt;filename&gt;] [none|jpeg|packbits|deflate]<br> &nbsp;<br> Example: <br> $xpaget ds9 tiff &gt; foo.tiff</tt><br> <tt><tt>$xpaget ds9 tiff jpeg &gt; foo.tiff</tt><br> $xpaset -p ds9 tiff foo.tiff</tt><br> <tt><tt>$xpaset -p ds9 tiff new foo.tiff<br> </tt></tt><tt><tt><tt>$xpaset -p ds9 tiff slice foo.tiff<br> </tt></tt>$cat foo.tiff | xpaset ds9 tiff</tt><tt><tt><tt> # not available windows</tt></tt></tt><br> <tt><tt>$cat foo.tiff | xpaset ds9 tiff</tt><tt> new</tt></tt><tt><tt><tt><tt> # not available windows</tt></tt><br> </tt>$cat foo.tiff | xpaset ds9 tiff</tt><tt> slice</tt><tt><tt><tt> # not available windows</tt></tt></tt> <p><b> <a name="tile"></a>tile</b></p> <p>Controls the tile display mode. </p> <tt> Syntax: <br> tile []<br> &nbsp;&nbsp;&nbsp;&nbsp; [yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp; [mode grid|column|row] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid mode automatic|manual]<br> &nbsp;&nbsp;&nbsp;&nbsp; [grid direction x|y]<br> &nbsp;&nbsp;&nbsp;&nbsp; [grid layout &lt;col&gt; &lt;row&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [grid gap &lt;pixels&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [row] <br> &nbsp;&nbsp;&nbsp;&nbsp; [column] <br> &nbsp;<br> Example: <br> $xpaget ds9 tile <br> $xpaget ds9 tile mode <br> $xpaget ds9 tile grid mode<br> $xpaget ds9 tile grid direction <br> $xpaget ds9 tile grid layout <br> $xpaget ds9 tile grid gap <br> $xpaset -p ds9 tile<br> $xpaset -p ds9 tile yes <br> $xpaset -p ds9 tile mode row <br> $xpaset -p ds9 tile grid <br> $xpaset -p ds9 tile grid mode manual<br> $xpaset -p ds9 tile grid direction x <br> $xpaset -p ds9 tile grid layout 5 5 <br> $xpaset -p ds9 tile grid gap 10 <br> $xpaset -p ds9 tile row <br> $xpaset -p ds9 tile column </tt> <p><b> <a name="update"></a>update</b></p> <p>Updates the current frame or region of frame. In the second form, the first argument is the number of the fits HDU (starting with 1) and the remaining args are a bounding box in IMAGE coordinates. By default, the screen is updated the next available idle cycle. However, you may force an immediate update by specifying the NOW option. </p> <tt> Syntax: <br> update [] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [# x1 y1 x2 y2] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [now # x1 y1 x2 y2]<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [on]<br> &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;[off] <br> &nbsp;<br> Example: <br> $xpaset -p ds9 update <br> $xpaset -p ds9 update 1 100 100 300 400 <br> $xpaset -p ds9 update now <br> $xpaset -p ds9 update now 1 100 100 300 400<br> $xpaset -p ds9 update off # delay refresh of the screen while loading files<br> $xpaset -p ds9 update on # be sure to turn it on when you are finished loading</tt><br> <p><b> <a name="url"></a>url</b></p> <p>Load FITS from URL into the current frame</p> <tt> Syntax: <br> url &lt;url&gt;<br> &nbsp;<br> Example: <br> $xpaset -p ds9 url http://foo.bar.edu/foo.fits <br> </tt> <p><b> <a name="version"></a>version</b></p> <p>Returns the current version of DS9. </p> <tt> Syntax: <br> version <br> &nbsp;<br> Example: <br> $xpaget ds9 version </tt> <p><b> <a name="view"></a>view</b></p> <p>Controls the GUI. </p> <tt> Syntax: <br> view&nbsp; [layout horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [keyvalue &lt;string&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [info yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [panner yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [magnifier yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [buttons yes|no] <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar horizontal|vertical]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [colorbar numerics yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [graph horizontal|vertical yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [filename yes|no[<br> &nbsp;&nbsp;&nbsp; &nbsp; [object yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [keyword yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [minmax yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [lowhigh yes|no]<br> &nbsp;&nbsp;&nbsp; &nbsp; [units yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [image|physical|wcs|wcsa...wcsz yes|no]<br> </tt><tt><tt><tt>&nbsp;&nbsp;&nbsp; &nbsp; [frame yes|no] <br> </tt></tt>&nbsp;&nbsp;&nbsp; &nbsp; [red yes|no]<br> &nbsp; &nbsp; &nbsp; [green yes|no]<br> &nbsp; &nbsp; &nbsp; [blue yes|no]</tt><br> <tt><tt>&nbsp; </tt> <br> Example: <br> $xpaget ds9 view layout<br> $xpaget ds9 view keyvalue<br> $xpaget ds9 view info <br> $xpaget ds9 view panner<br> $xpaget ds9 view magnifier<br> $xpaget ds9 view buttons<br> $xpaget ds9 view colorbar<br> $xpaget ds9 view graph horizontal<br> $xpaget ds9 view filename<br> $xpaget ds9 view object<br> $xpaget ds9 view keyword<br> $xpaget ds9 view minmax<br> $xpaget ds9 view lowhigh<br> $xpaget ds9 view units<br> $xpaget ds9 view image<br> $xpaget ds9 view wcsa</tt><br> <tt>$xpaget ds9 view red<br> </tt><tt><tt><tt>$xpaget ds9 view frame<br> </tt> </tt>$xpaset -p ds9 view layout vertical<br> $xpaset -p ds9 view keyvalue BITPIX<br> $xpaset -p ds9 view info yes<br> $xpaset -p ds9 view panner yes<br> $xpaset -p ds9 view magnifier yes<br> $xpaset -p ds9 view buttons yes<br> $xpaset -p ds9 view colorbar yes<br> $xpaset -p ds9 view graph horizontal yes<br> $xpaset -p ds9 view filename yes<br> $xpaset -p ds9 view object yes<br> $xpaset -p ds9 view keyword yes<br> $xpaset -p ds9 view minmax yes<br> $xpaset -p ds9 view lowhigh yes<br> $xpaset -p ds9 view units yes<br> $xpaset -p ds9 view wcsa yes<br> </tt><tt><tt>$xpaset -p ds9 view frame yes </tt></tt><br> <b> </b><tt>$xpaset -p ds9 view red yes<br> $xpaset -p ds9 view green yes<br> $xpaset -p ds9 view blue yes</tt><br> <br> <b><a name="vla"></a>vla</b> <p>Support for VLA Sky Survey. </p> <tt> Syntax:<br> vla []<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [name &lt;object&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [coord &lt;ra&gt; &lt;dec&gt; degrees|sexagesimal] # in wcs fk5<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [size &lt;width&gt; &lt;height&gt; degrees|arcmin|arcsec]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [save yes|no]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [frame new|current]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [update frame|crosshair]<br> &nbsp;&nbsp;&nbsp; &nbsp; [survey first|stripe82]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp; <br> Example:<br> $xpaget ds9 vla name <br> $xpaget ds9 vla coord <br> $xpaget ds9 vla size<br> $xpaget ds9 vla save<br> $xpaget ds9 vla frame<br> $xpaget ds9 vla survey<br> $xpaset -p ds9 vla<br> $xpaset -p ds9 vla m31 <br> $xpaset -p ds9 vla name m31 <br> $xpaset -p ds9 vla coord 00:42:44.404 +41:16:08.78 sexagesimal<br> $xpaset -p ds9 vla size 60 60 arcmin<br> $xpaset -p ds9 vla save yes<br> $xpaset -p ds9 vla frame current<br> $xpaset -p ds9 vla update frame<br> $xpaset -p ds9 vla survey stripe82<br> $xpaset -p ds9 vla open<br> </tt><tt>$xpaset -p ds9 vla close</tt> <p><b> <a name="vo"></a>vo</b></p> <p>Invoke an connection to a Virtual Observatory site. </p> <tt> Syntax: <br> vo [method xpa|mime]<br> &nbsp;&nbsp; [server &lt;url&gt;]<br> &nbsp;&nbsp; [internal yes|no]<br> &nbsp;&nbsp; [delay #]<br> &nbsp;&nbsp; [&lt;url&gt;]<br> &nbsp;&nbsp; [connect &lt;url&gt;]<br> &nbsp;&nbsp; [disconnect &lt;url&gt;]<br> &nbsp;&nbsp; [open|close]<br> <br> Example:<br> $xpaget ds9 vo <br> $xpaget ds9 vo method<br> $xpaget ds9 vo server<br> $xpaget ds9 vo internal<br> $xpaget ds9 vo delay<br> $xpaget ds9 vo connect<br> $xpaset -p ds9 vo method xpa<br> $xpaset -p ds9 vo server "http://foo.bar.edu/list.txt"<br> $xpaset -p ds9 vo internal yes<br> $xpaset -p ds9 vo delay 15 # keep-alive delay<br> $xpaset -p ds9 vo chandra-ed<br> $xpaset -p ds9 vo connect chandra-ed<br> $xpaset -p ds9 vo disconnect chandra-ed<br> $xpaset -p ds9 vo open<br> $xpaset -p ds9 vo close<br> </tt> <p><b> <a name="wcs"></a>wcs</b></p> <p>Controls the World Coordinate System for the current frame. If the wcs system, skyframe, or skyformat is modified, the info panel, compass, grid, and alignment will be modified accordingly. Also, using this access point, a new WCS specification can be loaded and used by the current image regardless of the WCS that was contained in the image file. WCS specification can be sent to DS9 as an ASCII file . Please see <a href="file.html#WCS">WCS</a> for more information. </p> <tt> Syntax: <br> wcs [[system] wcs|wcsa...wcsz] <br> &nbsp;&nbsp;&nbsp; [[sky] fk4|fk5|icrs|galactic|ecliptic] <br> &nbsp;&nbsp;&nbsp; [[skyformat] degrees|sexagesimal] <br> &nbsp;&nbsp;&nbsp; [align yes|no] <br> &nbsp;&nbsp;&nbsp; [reset [#]] <br> &nbsp;&nbsp;&nbsp; [replace [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; [append [#] &lt;filename&gt;] <br> &nbsp;&nbsp;&nbsp; [open|close]<br> <br> Example: <br> $xpaget ds9 wcs <br> $xpaget ds9 wcs system <br> $xpaget ds9 wcs sky <br> $xpaget ds9 wcs skyformat <br> $xpaget ds9 wcs align <br> $xpaset -p ds9 wcs wcs <br> $xpaset -p ds9 wcs system wcs<br> $xpaset -p ds9 wcs fk5 <br> </tt><tt>$xpaset -p ds9 wcs sky fk5 <br> </tt><tt>$xpaset -p ds9 wcs sexagesimal <br> </tt><tt>$xpaset -p ds9 wcs skyformat sexagesimal <br> $xpaset -p ds9 wcs align yes<br> $xpaset -p ds9 wcs reset<br> $xpaset -p ds9 wcs reset 3<br> $xpaset -p ds9 wcs replace foo.wcs<br> $xpaset -p ds9 wcs replace 3 foo.wcs <br> $xpaset -p ds9 wcs append foo.wcs<br> $xpaset -p ds9 wcs append 3 foo.wcs <br> $cat foo.wcs | xpaset ds9 wcs replace <br> $cat foo.wcs | xpaset ds9 wcs append <br> $echo "OBJECT = 'foobar'" | xpaset ds9 wcs append<br> $xpaset -p ds9 open<br> $xpaset -p ds9 close<br> </tt> <p><b> <a name="web"></a>web</b></p> <p>Display specified URL in the web display. </p> <tt> Syntax:<br> web [new|&lt;webname&gt;] [&lt;url&gt;]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [click back|forward|stop|reload|#]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [clear]<br> &nbsp;&nbsp;&nbsp; [&lt;webname&gt;] [close]<br> &nbsp;<br> Example: <br> $xpaget ds9 web <br> $xpaset -p ds9 web www.cnn.com<br> $xpaset -p ds9 web new www.cnn.com<br> $xpaset -p ds9 web hvweb www.apple.com<br> $xpaset -p ds9 web click back<br> $xpaset -p ds9 web click 2<br> $xpaset -p ds9 web clear<br> $xpaset -p ds9 web close<br> </tt> <p><b> <a name="width"></a>width</b></p> <p>Set the width of the image display window.</p> <tt> Syntax: <br> width [&lt;value&gt;]<br> &nbsp;<br> Example: <br> $xpaget ds9 width<br> $xpaset -p ds9 width 512<br> </tt> <p><b> <a name="zscale"></a>zscale</b></p> <p>Set Scale Limits based&nbsp; on the <i>IRAF</i> algorithm. </p> <tt> Syntax: <br> zscale []<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; [contrast]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [sample]<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [line]<br> &nbsp;<br> Example:<br> $xpaget ds9 zscale contrast<br> $xpaget ds9 zscale sample<br> $xpaget ds9 zscale line<br> $xpaset -p ds9 zscale<br> $xpaset -p ds9 zscale contrast .25<br> $xpaset -p ds9 zscale sample 600<br> $xpaset -p ds9 zscale line 120<br> </tt> <p><b> <a name="zoom"></a>zoom</b></p> <p>Controls the current zoom value for the current frame. </p> <tt> Syntax: <br> zoom [&lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [&lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt;] <br> &nbsp;&nbsp;&nbsp;&nbsp; [to &lt;value&gt; &lt;value&gt;]<br> &nbsp;&nbsp;&nbsp;&nbsp; [in]<br> &nbsp;&nbsp;&nbsp;&nbsp; [out]<br> &nbsp;&nbsp;&nbsp;&nbsp; [to fit] <br> &nbsp;&nbsp;&nbsp;&nbsp; [open|close]<br> &nbsp;<br> Example: <br> $xpaget ds9 zoom <br> $xpaset -p ds9 zoom 2 <br> $xpaset -p ds9 zoom 2 4<br> $xpaset -p ds9 zoom to 4 <br> $xpaset -p ds9 zoom to 2 4<br> $xpaset -p ds9 zoom in<br> $xpaset -p ds9 zoom out<br> $xpaset -p ds9 zoom to fit<br> $xpaset -p ds9 zoom open<br> $xpaset -p ds9 zoom close<br> </tt> </blockquote> </body> </html> �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/asinh.png��������������������������������������������������������������������000644 �000765 �000000 �00000017336 11763207066 017012� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���P������=��iCCPICC Profile��XY83{ޛ=[($ddB( #$$"*d{y߹y%!�&EÎ4Ԁ࿶C�ھޖc'�+ Z� Pr�myB"BqȰ0}mw8x� j �~E}a94�`H^$:D?�0Tpp6> c1dzI ſײ(COs-8(<pt, 0fq.,4~am#E:@'}sx#0bimc  Pst621|?~Q11~Mdyg-= zh\= ݵ Mwwzws4-I2\>&fu@MBv4<H߶}IN2^#6A@�d < |+L'W"Ap'yGO_'Яr �bgX73DYW=+Pߝo]}һ]Y{w;u2wrUmc1FS FyY@!Ȼ�ـF2 a*Z3zȝ_Q_]*2yGk wOXR�XZ2� 1QJQ(T{>;YK �0$4{Ko)>3QFOAN^l߯OXzA � n4!/Љ IMCm_Ѐ§@ S�M9 a8p$.K2( p͠ <@x ^ 0 !Bxbx!aHR !7HP$RtTU@F W$4 }H5 A" #�AD"rňzD%b1XF$ɏF! 6ȽH$yB#MY|@#WQ#% ) ED΢.QP/P&BK5fhW/:.Cס4abT bb 071~;2eJb6X6^>`?)(x)(L(R(((*)Z((>Rp8 ;kqڔ)s()SQ.RQQ PSQSʡEI5IJ@-AmH::"# C8' # M<MM=�Z0>A,^y:!(]]#02=#< }0YJ.,1I DW3N3aD̘Rn00-030+1;3fc<da1c b9reeU՛ k5� '7[2Mlk|ﲿ@qHpq(x1ĩIL9ʅ*Zʝ{G''gWן7'>f>} G| \E=N 7R f . Y U Մ;WDDE\DD̈ƈVtĊ1j} e ?<^IddZJ]$U,5,M-/%]%=)"c) sW括^ rrArW^3ț'7WP *) *M)I*y+*(3*[)')+RQU!T̪ z1٪UTGǫ7jhDh)Y9%uU띶6AH{BOC΄..AXwJOPKL~u/rd:C #FH=FF= NƗML|ML(j60`:lmF40[0W5?bȂŔ%ٲ aena5f-lMkll2l؊چ޳}p`tpwthx񵓘SS3~ #t WY#8b:-ۻx}': zwu'x=\<*=66b²gѐMN3;7o[i倕@ $R QOPЉ0a d rY8~ ! Nr#"OENFDE<|0ah3cLbJcQ8qGzm??}lϱk) tDIN;TU"M"9q8I3ii=gLJ~"qx9s9R}R{Ϋ/Lä҆.^N.*>/39sŮ,ّٔ99 Bi.3Ȼϕ&`P2kW)/)*D||T,W9|G\UU_atZ&͔[VO=nݱ^VS]+\_X\G/;hޤTwO^y3s}[([Nl=y:ݽCׇ<xڝ]]O՞}[^ކ>~݁F/ >{iihdxĈ̫WFF_C%{55^V FSSͽ1}CGޏ3 3ͳ&}} [OL9ؗگz_\m}?ȾXԾl<#JOVV;\>nմi9J vR$>>�|/7��]6$| vi5pM@:)l+E .)L|90;7C rݍnQ�(hx3By"ŢebW$sҤde+UUAQSKU0BhMi w414b7o|k!!aAv#No߻̹.m?@Ν΃Dd ,z)6T)̉q3+jz4STI7=96ISIng%Wtu2LыYُsV..[8}H8ҖJ*7+n>knO]J}ݞ&{j[طZ={Xbldwӡg731:l3"릱+oǃ:NhNOa,ꧡ|]tm؊όխȍC[[;#3#<0)Cgy+b�y�Ο vF{}R\eU>C]<#F$.s,K5[v&8*s%qtN} 0(x_TH؆xDԪtL܊|Bb2{*P545uk44P347J57^0yiYyEeUuMerjN?]^ֺ=srpoMYDJ>{/P@x`h)8OCчD'$Ş<Rp<X񾄩˧p<I*m&'Urt̄*ss/^vZtL\yE`٪{o,dtNdښ F&{v͞Z=8ߚV~aӣ6_tjyZzw+=}9y/ 6z5id}wLѸ[Dd{iAsg:f~Jp;brJjzgZ 4@԰ȇV փ(2 ӌý\fK8з0eB1KXŲsrppGzk p l:*,+<."&:)(.!DSbC2SJJC(de5d_ʅ+L^(PQPT~YVhڧn;lp0Hq1Oy ($XX.! ~m`8t+'ƽ޿t,�]+a+W7p%0>`:5;2,n!5zpAt\X8GF?';Nu$v$=9L{Ô NK[ G׹ޜܺK}ysB˺WEqjwT5 JǪ o<p[{MbmuPfh}{-և󏙞w<ڕG=潥^ uؾz3;^;p<ْlaT�(E�[� :s�7�GuSm�Xā\Y H*j%BaG\D4!&82 EQ5Tj >a`c6v2E% QR>ҥjV+h4hZiMi{\Ik Y˘T:1e9z͑m=C..0NǼa||o,!Y$qUUےRR勞J.=OUpWTRVܮrEAHC\V'?<нwU?Y$#{ﷰ4Rᶥ:`qN ."n{ 9?0۽'?wϒg`YHb胰pՈC!FŬt,&y"Xbi3 )ɤEse^=;` [Րkxg e]F{h+|xd'S/CG9ƢG&u]5 ?79%+*?qmF L 2 ށMR ( *Zqh ވ(G##ېK( 7>`1cXl=qe\0nRQ=6{\բ  b LI,OHL8X\\k%<<U|'L%DNډH%md饗eFe*/*P$+TT55%ĵu$ue L I132oxn9nen'e\r>&7y,x=G}Y\Fx=I!ɇ["1QĨƞ{}T6Ա7 *'2N~OtHj8×v.8u*m߅}3Ys(si"\4PrTlZ{ej[wuuwG<mMoHRG{W3꽴}=xG_ev|076eizcΧy瑯: ߦylc|:6}篍$0Dpd۠ LL O(~[ !|DR%Csя1B,#6{ECKETЍg122~bjdj&ʎeŕgo(#-d(l%*%&/*Y U%,/;+VR4Q RVyΣauM{X`PdژuO;s%8V9m^!񳳕m7$<% xxy9@$Ɛ9sx[DTazyop;įS%I& 3MmJPŘ}>RqLAe+]6%eyU|κ%rƢv>XrOyԊk+}hhIBP׳ge{f0cVkx8<u=tڇَ9 ֈBj nūKKO8X1_Sg*jԚZ: _~umJl&mNonmN db|kkQ �^.6�h e'߷:<܀���� pHYs�� �� ���IDATh[HT]M-`"R()TAeR/>T"aFhdhҌB6e:xQG!:_~Z|k:keB_~?-wSSSϟgbb2vWtAAA-ؗ'1&]RS,d2Ͱ266Flld͗b!=k׮eӦM\zuAb ,f;vSSS"$$DtuuIGH1::*EnnNe^MOFK*c1ǎϟ =99)L&-CCCB! Eaa銎N\[ZZ)�4 rjx5!PTy󆺺:\fvܹCII 6f֭['\OOO%ۋ/m۶QYY d8MMMoذW^9E Ga߾}hZ_@NN鄅ݍF!77 /_ŋ͛7%l޼Or5F#2lN߿' @jNƍTWWS^^Nkkkv㗢r]4 `0C~~>2 ///Xz5xyyGJJ ҵİgٲe sZ^q8�~Q*V.fǩE_Bx說*Z-tuu777;󍐐 6I5k`g~=rvmmmTWWOqq15FQQQVgؘR9x 5f4 V!:BOOpwJcc#YYYL&J%o߾'O`Z9t?~J�mmmjz=*>|ZFR1<<JBVc0(**r9BlF&QZZʅ P*sY?Nii)޽\/_.!O {|LNN .l6 !AX6OAAhnnsj###Rnrrr~%iwƒ˗/ 366&JJJfs2!'^@k~t/ӑʘAݻٹs'?sΡ𠥥\x ѤߟlD@vv6 777ugOGGGGŊ+DYYd+((XpNY,?t^ f1ǣP(�&""G!33ÇhtG$n߾ B ;;!'NaQQV*gӧOܺu 4={޽{]27һvRI\\d7\IJJߟ8/'&&8s挋3!222DRRϕZHGEE VJ-L__HMM'OtN$\eA$;#t:^|IFF!==JG7֭[˛qINNfqQ-[R R�<xL&#OWq8F|||1/?ߧK�Zྼ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/gauss.png��������������������������������������������������������������������000644 �000765 �000000 �00000022173 11345516007 017017� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR������&���X��iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi�� IDATxEHXQ#MP""U)"U:J�R JGA*H�*m|.ޭ̛o޼6A $$g f c59 HmԩSjر*V۞={ԢEMhw~MOV/j߾ʐ!C/_ |Aռys? yIչsg>/\`/^\ȑCM<9\_L3pyW06lwʕ+nܸ]vH|~/R gՅ #Gt6kLgDK]% Z.Z([l%KqHԟ~.TwK]l_]?Sv 5j8-|n3fTիWW?\ra)SUժU47Չ'ycbg?~\UVNs =l[JqH%K9sfWd+Vr C\zMeԟi7T ܠHλxڱcڼy 믿*[M,sBD$ѦUL={V/WW}!dfΜvn&GwBDE;M6U(q({oA#b)?qlL6%8Y)&<{(y5XoTuU<EI,XJdf;v̘~'s߿)k׮T߶mU͚5Mٻk,X /ܹM!Q!.<x"QC=ض8^kk֬1W0'5j _ۧJ.m!H'Pk׮UΝ3Ժu|`EtgY�0ϔ'_-ĒqRܦMK.5 6G}TʕK[vUdh.?@ /P׷qX8pbqT*Wlϟ_]s5vzӦM#$,ģC@-JO\ ̙3zĉZ^N1/]p>>c -N-ϴSlYʫ?\?)?þӨQ#{C(>ҢdjL\A\ihM<+u.]4/b|~ ۾}])0~zܹ.K;#<9tHq'$blbWeu懻3gM.#G?C:.ō^X1#{$Zp>f&b"s1xRJ‹%#㴔Qdz*_GL'x^p8֋ѿ{ oavw… zl#M |t[*{8ph>}9zhX^\rZE#;(x 0ɓ!K $b&Pp3g+%\bС /Zz8Hw>}-ZP>l4>D wީfň8Lz%F A'x&޽:xz'ŋnԼy"gBeZ DKtQVmJ@zS"EL)S 1qbnwEp G0hyЯt M@ee˖#IDe w/_^}fѴmָ�B7eM4El޽>/_>9o"6AP jɒ%P⢌\{p .h-B!pzɼ(w8 ,K{)Y`@B & 7+1`K.hpl�3i#OT+6BZj)ӭ[&H�q#BB`EaClY~قK(aΙQ8׀" s 8=18l`{t c?qlҒꫯQ!; 0a(f'KD7N 2$䤦e> ̐  ƢѺuk42%Db)??9!q&ҍզ)v5]/p mܸѬеO>ĸ !%5YH|ހC)oeAvN:ٳ+87|ވ LT! )%r/HJ�L,j H03fUۻwoG cF {.>|~v ^qGDjV3/!`i#V 4=  $~�W_2_z%>$Q9BǙ wyM 9%:I f2hv!Q fڠ`DKrTԲXY~}+b#D-+Y g2v~nLb6rD_EH#U Qbeja(ZM8: ~ DKBH(t,L-? zҤIv^$n$E׳)heh9I< sl$"'\CKDyȴj*$�0&I 4PTX h9Ca$H[d=zhzZ߈ޅ%Z5 b◓%Z~;s6-ZwM˙7&X6P`98t萱OtY{j&�H8S @(ǮQP8@S,ԩcSؑ :8Ɂ$%@ !y5|0q)md*Z<gQNh6BL6(U0+l0<8B|5P-^D!\Gٖ(D:t'Çɛ?б�1jiaN懬l809S(> ؈9qMK)F�;*K^1Xاe7WZZy<1@9ht J "뚏I͑AXՓ P"d6q V',֫WώSE >uT;~8,"X8]wo1yB`?c% " c7 `tF G I@Ԉ5 q~cOHwE,p, vªe����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/log.png����������������������������������������������������������������������000644 �000765 �000000 �00000017234 11343041232 016447� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���N��� ���TN7��iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi��IDAThYiHT_?.-f XQJ&=+l!۴B30 ""JDCFH} 2H@MͲ2V Wl%ow]fƙ8̹۟{ιGH|u(//jg?z({pBqt=z<HHH PpUׯ_իW-Ç"&&E}vjjj$ϟoWX޼yCctѺuVZ`VϪ?NWL"##TYYiWo[\q={qi;6444700:uDǑ9XݻG4gׯ۷}4rHzo*$$Į? _[nߟGԽ{w +WаaèCy[Ⰶ?V3߷o_:qDzr&~aAK,!X3HTVV%&&ҩSh۶mSEq?X7!.UVٳggnnP]ξ}v*,,䪤$ڴi׮]Ν;s}ll,ݼyk@P�\ ͥ .pmNXbi| cǎ۷o);;Cɓw+ڵfە|}L߈B̙3ٽ^J&e˖K.t*.]pV Pv�pnݺ@;vq]z >ܥ-nS}Fn:tZZi[h!&"^9.ĉ٥ΝKHa-C ٳ"$ۛ7ov)k'p#|KpѨ(z\îkbƌqHJJ X7EAnҤIJO<ӧOrfvszˆ`H?07)Spcb2w>N<)ō7ā4n^>|y_?~𧱱Q%X2O7Z ys i [e?^TUUYּ<u0z飪W^\-np7E~瘆X9c+>~8mٲƎK%%%<֮]8H"F!O2QF-WWWGgΜ1q"ˡGnC`NMM%XKx˕r a~O~*!F5ܹS?h�˂rnEF`Y> 9r!R*uw9ce$�/_r*H# 58 6aN,(::Z72(a7 &f7G"-]A]vp#Ŭ/_Mk:kn:$@\ehŋdA$( ***t۝ZމxKnذ13N#̚8@<zmfV؉f6ʧ ͞=LKd;ޯ3gƍz},o nRjrzJqH#65kW΃-9h vjk=0)lRyڄҰh 6AAAY@%R v ڷo;v`p#ҽs(h .2T/^2glK$AO!+N*$)?uĴij׈K 1}t%Rqhm)flfAJgs;)<#Rvtใ"����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/pow.png����������������������������������������������������������������������000644 �000765 �000000 �00000015471 11343041232 016474� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���3������&��iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi��GIDATX WK;A? "(QA2X(-b "6b)"FI H@P@-m w."f|sy 8?͜zSSSX__ L&ӞUFzSȥ68 VH?22&&& 1Ѐp8 *\.Eٯ)m c# iDP^^k(++} (..dttz{{3(l---pxzzBSS077v"Hz^__`4XFo}||lss3%#}9nrroU@ GQP7zA<pzz|~~"??_RI A#<rW,u<>> S PvBlcUk,HN'ʁ!Hpyy@�b{e- b٩ZŒSQQl�yRvvvD6!<Z+'=_s2NTF^i:P!7HvA5*V,,,.a,ͅ(477 Q+S .lPUMϠ_â"A*bfcccxAɆYljʆ3t%%%'>ᘙͬ[[[3u:F'Z_ LI'UFE"x]lT՚qYhZmlUm;А 3 mض?ֺݻ0����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/saolog.png�������������������������������������������������������������������000644 �000765 �000000 �00000016633 11343045612 017162� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���A���"������iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi��IDAThY[HU]/yI3QQ*}( A $!#tAM$DBA%+%"=jT-s<ێ6k֞=kfl Ɓ`iN߿KZ,ҫW~ESm�M0aof 2;kkkƍlxxX&ORc6CZ[SSCJ.]". 5f#y-]pA&QGGٳgO#;r5`~~N<)sD7zӽ{Y'uVVVfggJB[0Bx^BPrtt$OOOdeeE^^^422H&—/_hccŋ˗/ܜLNjΎ0I~-;'lnnRZZ$a-Li>5'u߾}Vϟ?k7<b$D#*>paaAР1ДsQQQUTT-UWW"egg [>}xžȠ5-ؙ3gׯYKK %8q9m^|70&)..N z !'>}DT[[K[[[i⇉ ЛÈj᷷C$BPQcc𾸂$>55% VvpXuuuO"FS^^JիWZ bcc{`" q)�d(w1LLdrO8q>`llLJHZ45A6Mŋa$Ѓ4)KJJ)͛7tMSN*++iiirrr(55RRR(((hPr`F3}݀ߨ(WC0p8EJ6ƙa?V"wY�] _~eb*ۣ)L,Մo6R0!ƵBGGG:8EwAA,PscߧO*nTaDқ`zzZBmuh^8==]bC' T}?~E h(ЁG WHʕ+ukoo'BhV\\\(11DYaff2pGilldMMM(Ǐٵkaݻw/+ݻwΝ; ଴3J$&Qx$ZMǪW4!maaal*99YA %Js]Wl$c,g qcq4AT [nѓ'OD4c94<z ÿ'NeTL.S}qcRs8ci����IENDB`�����������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/sinh.png���������������������������������������������������������������������000644 �000765 �000000 �00000017130 11763207066 016641� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���E������P��iCCPICC Profile��XY83{ޛ=[($ddB( #$$"*d{y߹y%!�&EÎ4Ԁ࿶C�ھޖc'�+ Z� Pr�myB"BqȰ0}mw8x� j �~E}a94�`H^$:D?�0Tpp6> c1dzI ſײ(COs-8(<pt, 0fq.,4~am#E:@'}sx#0bimc  Pst621|?~Q11~Mdyg-= zh\= ݵ Mwwzws4-I2\>&fu@MBv4<H߶}IN2^#6A@�d < |+L'W"Ap'yGO_'Яr �bgX73DYW=+Pߝo]}һ]Y{w;u2wrUmc1FS FyY@!Ȼ�ـF2 a*Z3zȝ_Q_]*2yGk wOXR�XZ2� 1QJQ(T{>;YK �0$4{Ko)>3QFOAN^l߯OXzA � n4!/Љ IMCm_Ѐ§@ S�M9 a8p$.K2( p͠ <@x ^ 0 !Bxbx!aHR !7HP$RtTU@F W$4 }H5 A" #�AD"rňzD%b1XF$ɏF! 6ȽH$yB#MY|@#WQ#% ) ED΢.QP/P&BK5fhW/:.Cס4abT bb 071~;2eJb6X6^>`?)(x)(L(R(((*)Z((>Rp8 ;kqڔ)s()SQ.RQQ PSQSʡEI5IJ@-AmH::"# C8' # M<MM=�Z0>A,^y:!(]]#02=#< }0YJ.,1I DW3N3aD̘Rn00-030+1;3fc<da1c b9reeU՛ k5� '7[2Mlk|ﲿ@qHpq(x1ĩIL9ʅ*Zʝ{G''gWן7'>f>} G| \E=N 7R f . Y U Մ;WDDE\DD̈ƈVtĊ1j} e ?<^IddZJ]$U,5,M-/%]%=)"c) sW括^ rrArW^3ț'7WP *) *M)I*y+*(3*[)')+RQU!T̪ z1٪UTGǫ7jhDh)Y9%uU띶6AH{BOC΄..AXwJOPKL~u/rd:C #FH=FF= NƗML|ML(j60`:lmF40[0W5?bȂŔ%ٲ aena5f-lMkll2l؊چ޳}p`tpwthx񵓘SS3~ #t WY#8b:-ۻx}': zwu'x=\<*=66b²gѐMN3;7o[i倕@ $R QOPЉ0a d rY8~ ! Nr#"OENFDE<|0ah3cLbJcQ8qGzm??}lϱk) tDIN;TU"M"9q8I3ii=gLJ~"qx9s9R}R{Ϋ/Lä҆.^N.*>/39sŮ,ّٔ99 Bi.3Ȼϕ&`P2kW)/)*D||T,W9|G\UU_atZ&͔[VO=nݱ^VS]+\_X\G/;hޤTwO^y3s}[([Nl=y:ݽCׇ<xڝ]]O՞}[^ކ>~݁F/ >{iihdxĈ̫WFF_C%{55^V FSSͽ1}CGޏ3 3ͳ&}} [OL9ؗگz_\m}?ȾXԾl<#JOVV;\>nմi9J vR$>>�|/7��]6$| vi5pM@:)l+E .)L|90;7C rݍnQ�(hx3By"ŢebW$sҤde+UUAQSKU0BhMi w414b7o|k!!aAv#No߻̹.m?@Ν΃Dd ,z)6T)̉q3+jz4STI7=96ISIng%Wtu2LыYُsV..[8}H8ҖJ*7+n>knO]J}ݞ&{j[طZ={Xbldwӡg731:l3"릱+oǃ:NhNOa,ꧡ|]tm؊όխȍC[[;#3#<0)Cgy+b�y�Ο vF{}R\eU>C]<#F$.s,K5[v&8*s%qtN} 0(x_TH؆xDԪtL܊|Bb2{*P545uk44P347J57^0yiYyEeUuMerjN?]^ֺ=srpoMYDJ>{/P@x`h)8OCчD'$Ş<Rp<X񾄩˧p<I*m&'Urt̄*ss/^vZtL\yE`٪{o,dtNdښ F&{v͞Z=8ߚV~aӣ6_tjyZzw+=}9y/ 6z5id}wLѸ[Dd{iAsg:f~Jp;brJjzgZ 4@԰ȇV փ(2 ӌý\fK8з0eB1KXŲsrppGzk p l:*,+<."&:)(.!DSbC2SJJC(de5d_ʅ+L^(PQPT~YVhڧn;lp0Hq1Oy ($XX.! ~m`8t+'ƽ޿t,�]+a+W7p%0>`:5;2,n!5zpAt\X8GF?';Nu$v$=9L{Ô NK[ G׹ޜܺK}ysB˺WEqjwT5 JǪ o<p[{MbmuPfh}{-և󏙞w<ڕG=潥^ uؾz3;^;p<ْlaT�(E�[� :s�7�GuSm�Xā\Y H*j%BaG\D4!&82 EQ5Tj >a`c6v2E% QR>ҥjV+h4hZiMi{\Ik Y˘T:1e9z͑m=C..0NǼa||o,!Y$qUUےRR勞J.=OUpWTRVܮrEAHC\V'?<нwU?Y$#{ﷰ4Rᶥ:`qN ."n{ 9?0۽'?wϒg`YHb胰pՈC!FŬt,&y"Xbi3 )ɤEse^=;` [Րkxg e]F{h+|xd'S/CG9ƢG&u]5 ?79%+*?qmF L 2 ށMR ( *Zqh ވ(G##ېK( 7>`1cXl=qe\0nRQ=6{\բ  b LI,OHL8X\\k%<<U|'L%DNډH%md饗eFe*/*P$+TT55%ĵu$ue L I132oxn9nen'e\r>&7y,x=G}Y\Fx=I!ɇ["1QĨƞ{}T6Ա7 *'2N~OtHj8×v.8u*m߅}3Ys(si"\4PrTlZ{ej[wuuwG<mMoHRG{W3꽴}=xG_ev|076eizcΧy瑯: ߦylc|:6}篍$0Dpd۠ LL O(~[ !|DR%Csя1B,#6{ECKETЍg122~bjdj&ʎeŕgo(#-d(l%*%&/*Y U%,/;+VR4Q RVyΣauM{X`PdژuO;s%8V9m^!񳳕m7$<% xxy9@$Ɛ9sx[DTazyop;įS%I& 3MmJPŘ}>RqLAe+]6%eyU|κ%rƢv>XrOyԊk+}hhIBP׳ge{f0cVkx8<u=tڇَ9 ֈBj nūKKO8X1_Sg*jԚZ: _~umJl&mNonmN db|kkQ �^.6�h e'߷:<܀���� pHYs�� �� ����IDATX_H_ΥFH])H7ْ%HH e]Hb@aˮvEQE.f9bVfYS [wѯs s>sއ9#L188ȭ[uɓ'tttVs_|$P(4ŋSa1<<SMA~zr"n[6(,,FYYٔ:׮]`0L߼yt�|HDee%ټyfJjH]]J1C;KS;| bq9y,gɓ'EMMML{ILijjf�FFF{.�n7nWL&g߿d dGGK,P�B!mF?�VP(@ff&}}} Ewփc>}Dii)o߾%HUU�]]]ݻV\III ]륳@qq1@Q"8N'$ ra9rwjHNNDw:f!,XlhjjcccB!z{{1>>.~wC )̔bppPt:q <###`0DȴZcw <b49s HS?>>p8<AR3000a…L&�̛7!-DדՇYJKK ۷oJ__g+0#{<<7ng֭<}aYΞ={&Pȳi```'NPRRBqq1z+W044Dgg\l6IIIx<|nBvX,ܹK.144NСC~]vΟ?O}}=vcǎӧx"af3 ;=J D0G1@ ~׿7uJqB́<{ݻw3="%%)&r!`�| Ivv \kʯ&]pq:tww4fj5/_UVi&෠!I ,˅VE$f3*].<Yo|"11Q\zU:ujPID~MS)((l6?gecǎI <xQ"._ lF$۷/:4"eddBlŠ+U_Fhjjbݺu|Drr2III۷o@NN^p(5S fcL\\O^QSSSeҥD͔瓛Ç#R@�94d jPv;555t:EZFe(3!(NFiiDJ@RQVVn;m%VSc=zTQnz=6l@qYh4X,WRIȳOCC l޼Yq0))))n{Nɳ9l?@,ˤ$����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/sqrt.png���������������������������������������������������������������������000644 �000765 �000000 �00000015423 11343045612 016663� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���*������0|#��iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi��!IDATH V+Q͘"c,䫱B& Uvj`Eb|D(LL4̠{}k>yƈ[{{9{# V^A^87^G544$DtooQQQ_뮾4xzzBjjf?CTUU%$ ?Cen,//Hra~~^b9xYԱBq9szz  9annݸ1 }}}HOO X[[ VWW? X܄lDQQThnnb~ʊ:ζ'&&u7^u?>>HijjJ MNN*YpvvF$h.S]]Muuuj8L)))hjjΎH~n]Ib[[[c3xniiipW% Rtk̳r0a2ii�|>)lTGeAZ`s'^PB~&333ϗ(((�G*1OɥD777$SbsiiDhhh%Z[[illߥ.<B~_yԐh)F]]]t{{EuT-RdveffݗMS/,\ג\?rbnn.B@-߃ɉ[?-R<!>q%Od(PF����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/doc/ref/img/square.png�������������������������������������������������������������������000644 �000765 �000000 �00000015313 11343045612 017170� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���#������W��iCCPICC Profile��xZgTMM䜗a s 9%$H*($((#*;=~̳սSsk)�DK"#Ca�@XxLə{  |#ЖGmHrx.0rmGLL�d~c'D B*KDZ"�Ā]Lr{b��O @0;o콃;8'�ώK9~>�Ct|}}��� @EwOd2V9νCH�r�cP�oοdB"D/ 1?5u�!D7 noo�z @wOlTܮ.@\0�h�#AnD$@h}`,-p0A2H@>(�AE p`<k0�~upX!nHd %H҇L!k 0(J2<:UCuP tA4-Bk0 `F`EX 6m`W |6<?/£P$8J2G9PdTUjDuޡfQh4͍@+ жh/t:.EG_F Î(b 1?L &Sc0#X+݃c \l{;~ǡpL8a2 王eNpqø%  i  {`"()>PP)y)(M)=)c)((;(('(D<^o'yE'| ńB H lb5q KER ʡ:Ku"5ZZڍ: GFƞ&(M=)ZV֑6vvO'Bg@KAWMM7NEEFBD_FE2CCu7 \igpLLLaLLmLϙVٙՙ=3/02ϳгaqb9r.VVyV'5X1)eճ=f[fbef/`!aˑQ1񃓃S3&G.j.E.O<v1n,7ۙ;%GǑ' M"\H٤v;^<"13|L|:||||6i*A' lF ^q9"rKdAON4[KtNGZ,Kج8!k|y%$E%%%InJIIz&M֖n"sɹ Y&@R,A٫rbr>rɧߐ_CvϸB"VQG1EK񧒌RRGe~eO *,**E*TTMUsU԰jzjjꐺzm- [[Z@K[+]_m=CԱ)eu-}ǫW7O֏ѿaee0hHmhcxQ%ƪi&&v&&bL3#$@V5 --,[-׭Y+7|o5ҺzF&-m/;"q{ $Fo-G32'%CNϝc\\|\\Q65Knzn>+线Hx9uۛϻˇsٗշw)� t l  :<\*<;|"B%8kadu>}-Q(hOUqNq k$Ϥ6Y-<yˁ)))oSSϤn<؛Ɵ)8!:#2c$S!TFgV!Cef_Ikۚǜ7o|ÓG\:r41c\YD ֊}(T'=>qDI+ޥçTN//K)-w(?-sXXݙJʪ*Us.CgUװլ >֬yh/_X{yz L 9 웆5/\hknhͭmݸeMW+W]}ׯ ߨ)p-[ŷovSzz{zg&=q3zLݿox`P= >}X'O=5y`b3gu|beW^AyKxm;w2W&4&7{?2<9!ix:#ӟ?]wlf/sy_VK_bw?~9byk*j/_ל>'lPlݼev;o,7 cXo^o^o^o^o^o^o^o^ +k7@!gf#<�  y@!Bx 5`ҁ:aEF1$l?e+~L%MOBd8Ǹlr 4>q'_@#b{$ %cere)R8jFVg׀5f4iuj ҳW41.1cbZaoddbeWZFV؎d!)cp(dP]𵐇Ö#} Qf>1Iqu%hOKH(l̺yaۜ|a#GՎYxFeW<)2raWޯ|Fam /6%̛.min}6w!ҩꁮkoL\U7cs~}A!I4Û>?yriHֳ&/(^LyuubcwW 'BLNn|x9>}c'3_vu~혿mdw.KU?VV[8s7V; 0pD0rЂ!LGdsT4td`&YfaW[8\BJ<f$g^H8B"b$$IH;MddyrU8$ +?WSMT3QPոyDC[V3[ok n2|ktŸd9ŴUZbt(;o{=G'gv˶wi$гǫӻo_ଐE݈}73$3%ȧ4HLw Ɋ=t0pڼ#G IE{J|'(:Pjl4MJjn{QxNQ}@CncSHFpM[Z{N+Wû* ^_svhwAO[owwL:aG>yȗgWF7__^3y+9f<d"}?|~7;{~{A{1%ڟ˵+KJ6u1 Tp~.p?J uźHoCRB61*:&֋ΉޜAQi)K#k3}Γ\>k<|||3т+BD$Dދ0X,Rz-N"c' {XNDWM~uO}E?%HBYUJ*jڼa !-VN!}iW u\4u7c2{`inbfW|�[pÒcS #nBW<ӽ̼Y||W%;ȅ҆.= o83 Z2)f;v&Y|wBSbyR)Dӹ33 Ypi$?qxщc >~-YyIRSeNUTY>+Vp.:ŋI=&K[mM):|; u][|m^w.߻6Xvxȫ1ĩگnm˺;ͧ X�N,��V�> ͟ �[eZ?�dc<='A & /h?tjY 0›(!^T iۉ^Ha0͘EMFvj "nœbґϊO$ &*asԂu4R4ڴ3єS&3?s??+{-:E.nU7o(wFoŒĵ%$¥2r>{*TTfAfae'TLL-,;~^e7qwt:^Sn8w k$G>~b.G{VBCj?D󋪏^UˎMNJ?r@2%/uy/]*n<?ZV S88H2Ӭ+oWWԤՆ]x)UpM}ws8/j_ͽ}44;ucg/[x=ǯ+5MCN @H-(XDj m JD=EC*7;C|π6Cg1h&ˆŶ�n/플 [9B#QH%Guڔz&O[KK>A9c*8+\UlvDNY9:n?iRo<@`0Gnrq EI6uq~rLlYNEJeiQ{7.7iij׮iл?dph˄TL"ɲԪs-Cc_n=.zhF5O܃+BÃ"Z#ע b$Hn<w0m,C,3!k %'8V>#C 0<}JiJתYH|/R_k m4Z!ڹtZɍ[ݴ=:dXg|l1ɭw_Ff}34N75=E1CuyVh}itYueWƺ�< :HJ43p8|~¢4PQQHG=FVq/( )SSwb &wFZe:^L,l9 .pLB|QBbFuo26h ej }r:Dpcej3yŘVLyG^gISnX)/;_KL!"21qDdS>Lw͘ڟMS'ѹ"ǕO<(8<L]rsC/_״x)]u{oLgUBWܵ&7nstg|3pޡ·é&>=;a+ioμ# Oט =99cç3LחY\W֯]H #ݾcuOg2z9k_=Wv-cmc=vM-m#;]�nDhDLWo),4mșjSŌ}L+'rlE!:_ "` (k#c!ud?@] y_;U^&H FmQv@pwt>i<hΒ?r20ň|D V� Ic/?Ԅ!ez%?Bz␾h}aȈdLI`w\�2Z$!el= ?r/dE{k?;vWCn ϐ7 -EAhe@B3ف$ZFkU>e`�ָc??4"Q>zv+sVO"w`?An;@% ݈Ĩ6R5'A2 ɒe�hv|Ȝi��IDATH U=HQ~(вl2 *\'"5Z ņ)hA@D&Ezx_-}޾;{9ssF7pafc{{"f+, C@T*%NOO GGG<זbG W8#9==<t:-$lP3D|>/x^7"(5448< fn)͂000Qc]]]pݨF L.C4"Z-ǡ|xxB&VWWqyy!X,OtvvF5zzzXMyԔ8Zx<Kz^q*J{rrQ`F# W#ԞB~]SS # (""25>> &5yaaު+#Gt1"엻(U^L_YYQH2 t Q[ZZ!"qIcU0& Ce%rX^^j* \j!GN:E=qK%NҴVv)u;SpxxEH&G&LD@z—OA .~I(653鬿0`#~n����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/ch05m151008.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027632 12567376460 016317� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch05m151008 # created by cptutils 1.46 # Wed Aug 15 23:30:54 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0.011765)(0.0078,0.023529)(0.0118,0.035294)(0.0157,0.043137)(0.0196,0.054902)(0.0235,0.062745)(0.0275,0.070588)(0.0314,0.078431)(0.0353,0.086275)(0.0392,0.090196)(0.0431,0.098039)(0.0471,0.10588)(0.051,0.1098)(0.0549,0.11765)(0.0588,0.12157)(0.0627,0.12549)(0.0667,0.12941)(0.0706,0.13333)(0.0745,0.14118)(0.0784,0.14118)(0.0824,0.1451)(0.0863,0.14902)(0.0902,0.15294)(0.0941,0.15294)(0.098,0.15686)(0.102,0.16078)(0.1059,0.16078)(0.1098,0.16078)(0.1137,0.16471)(0.1176,0.16471)(0.1216,0.16471)(0.1255,0.16863)(0.1294,0.16863)(0.1333,0.16863)(0.1373,0.16863)(0.1412,0.16863)(0.1451,0.16863)(0.149,0.16863)(0.1529,0.16863)(0.1569,0.16863)(0.1608,0.16471)(0.1647,0.16471)(0.1686,0.16471)(0.1725,0.16471)(0.1765,0.16471)(0.1804,0.16471)(0.1843,0.16078)(0.1882,0.16078)(0.1922,0.16078)(0.1961,0.16078)(0.2,0.16078)(0.2039,0.16078)(0.2078,0.16078)(0.2118,0.15686)(0.2157,0.15686)(0.2196,0.15686)(0.2235,0.15686)(0.2275,0.15686)(0.2314,0.16078)(0.2353,0.16078)(0.2392,0.16078)(0.2431,0.16078)(0.2471,0.16078)(0.251,0.16471)(0.2549,0.16471)(0.2588,0.16471)(0.2627,0.16863)(0.2667,0.16863)(0.2706,0.17255)(0.2745,0.17647)(0.2784,0.18039)(0.2824,0.18039)(0.2863,0.18431)(0.2902,0.18824)(0.2941,0.19216)(0.298,0.19608)(0.302,0.20392)(0.3059,0.20784)(0.3098,0.21176)(0.3137,0.21961)(0.3176,0.22353)(0.3216,0.23137)(0.3255,0.23529)(0.3294,0.24314)(0.3333,0.25098)(0.3373,0.25882)(0.3412,0.26667)(0.3451,0.27451)(0.349,0.28235)(0.3529,0.2902)(0.3569,0.29804)(0.3608,0.30588)(0.3647,0.31765)(0.3686,0.32549)(0.3725,0.33333)(0.3765,0.3451)(0.3804,0.35294)(0.3843,0.36471)(0.3882,0.37647)(0.3922,0.38431)(0.3961,0.39608)(0.4,0.40784)(0.4039,0.41961)(0.4078,0.43137)(0.4118,0.44314)(0.4157,0.45098)(0.4196,0.46275)(0.4235,0.47451)(0.4275,0.48627)(0.4314,0.49804)(0.4353,0.5098)(0.4392,0.52157)(0.4431,0.53333)(0.4471,0.5451)(0.451,0.56078)(0.4549,0.57255)(0.4588,0.58431)(0.4627,0.59608)(0.4667,0.60392)(0.4706,0.61569)(0.4745,0.62745)(0.4784,0.63922)(0.4824,0.65098)(0.4863,0.66275)(0.4902,0.67451)(0.4941,0.68235)(0.498,0.69412)(0.502,0.70588)(0.5059,0.71373)(0.5098,0.72549)(0.5137,0.73333)(0.5176,0.7451)(0.5216,0.75294)(0.5255,0.76471)(0.5294,0.77255)(0.5333,0.78039)(0.5373,0.78824)(0.5412,0.79608)(0.5451,0.80392)(0.549,0.81176)(0.5529,0.81961)(0.5569,0.82353)(0.5608,0.83137)(0.5647,0.83922)(0.5686,0.84314)(0.5725,0.84706)(0.5765,0.8549)(0.5804,0.85882)(0.5843,0.86275)(0.5882,0.86667)(0.5922,0.87059)(0.5961,0.87451)(0.6,0.87843)(0.6039,0.87843)(0.6078,0.88235)(0.6118,0.88627)(0.6157,0.88627)(0.6196,0.88627)(0.6235,0.8902)(0.6275,0.8902)(0.6314,0.8902)(0.6353,0.8902)(0.6392,0.8902)(0.6431,0.8902)(0.6471,0.8902)(0.651,0.8902)(0.6549,0.8902)(0.6588,0.88627)(0.6627,0.88627)(0.6667,0.88235)(0.6706,0.88235)(0.6745,0.88235)(0.6784,0.87843)(0.6824,0.87451)(0.6863,0.87451)(0.6902,0.87059)(0.6941,0.86667)(0.698,0.86667)(0.702,0.86275)(0.7059,0.85882)(0.7098,0.8549)(0.7137,0.85098)(0.7176,0.85098)(0.7216,0.84706)(0.7255,0.84314)(0.7294,0.83922)(0.7333,0.83529)(0.7373,0.83137)(0.7412,0.82745)(0.7451,0.82745)(0.749,0.82353)(0.7529,0.81961)(0.7569,0.81569)(0.7608,0.81569)(0.7647,0.81176)(0.7686,0.80784)(0.7725,0.80784)(0.7765,0.80392)(0.7804,0.8)(0.7843,0.8)(0.7882,0.79608)(0.7922,0.79608)(0.7961,0.79608)(0.8,0.79216)(0.8039,0.79216)(0.8078,0.79216)(0.8118,0.79216)(0.8157,0.79216)(0.8196,0.78824)(0.8235,0.79216)(0.8275,0.79216)(0.8314,0.79216)(0.8353,0.79216)(0.8392,0.79216)(0.8431,0.79608)(0.8471,0.79608)(0.851,0.79608)(0.8549,0.8)(0.8588,0.80392)(0.8627,0.80392)(0.8667,0.80784)(0.8706,0.81176)(0.8745,0.81569)(0.8784,0.81569)(0.8824,0.81961)(0.8863,0.82353)(0.8902,0.83137)(0.8941,0.83529)(0.898,0.83922)(0.902,0.84314)(0.9059,0.84706)(0.9098,0.8549)(0.9137,0.85882)(0.9176,0.86667)(0.9216,0.87059)(0.9255,0.87843)(0.9294,0.88235)(0.9333,0.8902)(0.9373,0.89412)(0.9412,0.90196)(0.9451,0.90588)(0.949,0.91373)(0.9529,0.92157)(0.9569,0.92549)(0.9608,0.93333)(0.9647,0.94118)(0.9686,0.9451)(0.9725,0.95294)(0.9765,0.96078)(0.9804,0.96471)(0.9843,0.97255)(0.9882,0.98039)(0.9922,0.98431)(0.9961,0.99216)(1,1) GREEN: (0,0)(0.0039,0.0078431)(0.0078,0.015686)(0.0118,0.019608)(0.0157,0.027451)(0.0196,0.031373)(0.0235,0.039216)(0.0275,0.043137)(0.0314,0.047059)(0.0353,0.054902)(0.0392,0.058824)(0.0431,0.062745)(0.0471,0.066667)(0.051,0.07451)(0.0549,0.078431)(0.0588,0.082353)(0.0627,0.086275)(0.0667,0.094118)(0.0706,0.098039)(0.0745,0.10196)(0.0784,0.1098)(0.0824,0.11373)(0.0863,0.11765)(0.0902,0.12549)(0.0941,0.12941)(0.098,0.13725)(0.102,0.14118)(0.1059,0.14902)(0.1098,0.15294)(0.1137,0.16078)(0.1176,0.16471)(0.1216,0.17255)(0.1255,0.18039)(0.1294,0.18431)(0.1333,0.19216)(0.1373,0.2)(0.1412,0.20392)(0.1451,0.21176)(0.149,0.21961)(0.1529,0.22745)(0.1569,0.23137)(0.1608,0.23922)(0.1647,0.24706)(0.1686,0.2549)(0.1725,0.26275)(0.1765,0.26667)(0.1804,0.27451)(0.1843,0.28235)(0.1882,0.2902)(0.1922,0.29804)(0.1961,0.30588)(0.2,0.31373)(0.2039,0.31765)(0.2078,0.32549)(0.2118,0.33333)(0.2157,0.34118)(0.2196,0.34902)(0.2235,0.35686)(0.2275,0.36471)(0.2314,0.36863)(0.2353,0.37647)(0.2392,0.38431)(0.2431,0.39216)(0.2471,0.39608)(0.251,0.40392)(0.2549,0.41176)(0.2588,0.41961)(0.2627,0.42353)(0.2667,0.43137)(0.2706,0.43529)(0.2745,0.44314)(0.2784,0.44706)(0.2824,0.4549)(0.2863,0.45882)(0.2902,0.46667)(0.2941,0.47059)(0.298,0.47843)(0.302,0.48235)(0.3059,0.48627)(0.3098,0.4902)(0.3137,0.49804)(0.3176,0.50196)(0.3216,0.50588)(0.3255,0.5098)(0.3294,0.51373)(0.3333,0.51765)(0.3373,0.52157)(0.3412,0.52549)(0.3451,0.52549)(0.349,0.52941)(0.3529,0.53333)(0.3569,0.53725)(0.3608,0.53725)(0.3647,0.54118)(0.3686,0.54118)(0.3725,0.5451)(0.3765,0.5451)(0.3804,0.54902)(0.3843,0.54902)(0.3882,0.55294)(0.3922,0.55294)(0.3961,0.55294)(0.4,0.55294)(0.4039,0.55686)(0.4078,0.55686)(0.4118,0.55686)(0.4157,0.55686)(0.4196,0.55686)(0.4235,0.55686)(0.4275,0.55686)(0.4314,0.55686)(0.4353,0.55686)(0.4392,0.55686)(0.4431,0.55686)(0.4471,0.55686)(0.451,0.55686)(0.4549,0.55686)(0.4588,0.55686)(0.4627,0.55294)(0.4667,0.55294)(0.4706,0.55294)(0.4745,0.55294)(0.4784,0.55294)(0.4824,0.54902)(0.4863,0.54902)(0.4902,0.54902)(0.4941,0.54902)(0.498,0.54902)(0.502,0.5451)(0.5059,0.5451)(0.5098,0.5451)(0.5137,0.5451)(0.5176,0.5451)(0.5216,0.5451)(0.5255,0.5451)(0.5294,0.5451)(0.5333,0.5451)(0.5373,0.5451)(0.5412,0.5451)(0.5451,0.5451)(0.549,0.5451)(0.5529,0.5451)(0.5569,0.5451)(0.5608,0.5451)(0.5647,0.5451)(0.5686,0.5451)(0.5725,0.54902)(0.5765,0.54902)(0.5804,0.54902)(0.5843,0.54902)(0.5882,0.55294)(0.5922,0.55294)(0.5961,0.55686)(0.6,0.55686)(0.6039,0.56078)(0.6078,0.56078)(0.6118,0.56471)(0.6157,0.56863)(0.6196,0.57255)(0.6235,0.57255)(0.6275,0.57647)(0.6314,0.58039)(0.6353,0.58431)(0.6392,0.58824)(0.6431,0.59216)(0.6471,0.59608)(0.651,0.6)(0.6549,0.60392)(0.6588,0.60784)(0.6627,0.61176)(0.6667,0.61569)(0.6706,0.62353)(0.6745,0.62745)(0.6784,0.63137)(0.6824,0.63922)(0.6863,0.64314)(0.6902,0.64706)(0.6941,0.6549)(0.698,0.65882)(0.702,0.66667)(0.7059,0.67059)(0.7098,0.67843)(0.7137,0.68627)(0.7176,0.6902)(0.7216,0.69804)(0.7255,0.70196)(0.7294,0.7098)(0.7333,0.71765)(0.7373,0.72157)(0.7412,0.72941)(0.7451,0.73725)(0.749,0.74118)(0.7529,0.74902)(0.7569,0.75686)(0.7608,0.76078)(0.7647,0.76863)(0.7686,0.77647)(0.7725,0.78039)(0.7765,0.78824)(0.7804,0.79608)(0.7843,0.8)(0.7882,0.80784)(0.7922,0.81569)(0.7961,0.81961)(0.8,0.82745)(0.8039,0.83137)(0.8078,0.83922)(0.8118,0.84314)(0.8157,0.85098)(0.8196,0.8549)(0.8235,0.86275)(0.8275,0.86667)(0.8314,0.87451)(0.8353,0.87843)(0.8392,0.88235)(0.8431,0.8902)(0.8471,0.89412)(0.851,0.89804)(0.8549,0.90588)(0.8588,0.9098)(0.8627,0.91373)(0.8667,0.91765)(0.8706,0.92157)(0.8745,0.92549)(0.8784,0.92941)(0.8824,0.93333)(0.8863,0.93725)(0.8902,0.94118)(0.8941,0.9451)(0.898,0.94902)(0.902,0.94902)(0.9059,0.95294)(0.9098,0.95686)(0.9137,0.96078)(0.9176,0.96078)(0.9216,0.96471)(0.9255,0.96863)(0.9294,0.96863)(0.9333,0.97255)(0.9373,0.97255)(0.9412,0.97647)(0.9451,0.97647)(0.949,0.98039)(0.9529,0.98039)(0.9569,0.98431)(0.9608,0.98431)(0.9647,0.98431)(0.9686,0.98824)(0.9725,0.98824)(0.9765,0.98824)(0.9804,0.99216)(0.9843,0.99216)(0.9882,0.99608)(0.9922,0.99608)(0.9961,0.99608)(1,1) BLUE: (0,0)(0.0039,0.011765)(0.0078,0.023529)(0.0118,0.035294)(0.0157,0.043137)(0.0196,0.054902)(0.0235,0.062745)(0.0275,0.07451)(0.0314,0.082353)(0.0353,0.094118)(0.0392,0.10196)(0.0431,0.1098)(0.0471,0.12157)(0.051,0.12941)(0.0549,0.14118)(0.0588,0.14902)(0.0627,0.16078)(0.0667,0.16863)(0.0706,0.17647)(0.0745,0.18824)(0.0784,0.19608)(0.0824,0.20392)(0.0863,0.21569)(0.0902,0.22353)(0.0941,0.23137)(0.098,0.23922)(0.102,0.24706)(0.1059,0.25882)(0.1098,0.26667)(0.1137,0.27451)(0.1176,0.28235)(0.1216,0.28627)(0.1255,0.29412)(0.1294,0.30196)(0.1333,0.3098)(0.1373,0.31373)(0.1412,0.32157)(0.1451,0.32941)(0.149,0.33333)(0.1529,0.33725)(0.1569,0.3451)(0.1608,0.34902)(0.1647,0.35294)(0.1686,0.35686)(0.1725,0.36078)(0.1765,0.36471)(0.1804,0.36863)(0.1843,0.37255)(0.1882,0.37255)(0.1922,0.37647)(0.1961,0.37647)(0.2,0.38039)(0.2039,0.38039)(0.2078,0.38039)(0.2118,0.38431)(0.2157,0.38431)(0.2196,0.38431)(0.2235,0.38431)(0.2275,0.38431)(0.2314,0.38431)(0.2353,0.38039)(0.2392,0.38039)(0.2431,0.38039)(0.2471,0.37647)(0.251,0.37647)(0.2549,0.37255)(0.2588,0.37255)(0.2627,0.36863)(0.2667,0.36471)(0.2706,0.36078)(0.2745,0.36078)(0.2784,0.35686)(0.2824,0.35294)(0.2863,0.34902)(0.2902,0.3451)(0.2941,0.34118)(0.298,0.33725)(0.302,0.33333)(0.3059,0.32941)(0.3098,0.32549)(0.3137,0.32157)(0.3176,0.31765)(0.3216,0.31373)(0.3255,0.3098)(0.3294,0.30588)(0.3333,0.30196)(0.3373,0.29804)(0.3412,0.29804)(0.3451,0.29412)(0.349,0.2902)(0.3529,0.28627)(0.3569,0.28235)(0.3608,0.27843)(0.3647,0.27843)(0.3686,0.27451)(0.3725,0.27059)(0.3765,0.27059)(0.3804,0.26667)(0.3843,0.26667)(0.3882,0.26667)(0.3922,0.26275)(0.3961,0.26275)(0.4,0.26275)(0.4039,0.26275)(0.4078,0.26275)(0.4118,0.26275)(0.4157,0.26275)(0.4196,0.26275)(0.4235,0.26667)(0.4275,0.26667)(0.4314,0.26667)(0.4353,0.27059)(0.4392,0.27451)(0.4431,0.27451)(0.4471,0.27843)(0.451,0.28235)(0.4549,0.28627)(0.4588,0.2902)(0.4627,0.29804)(0.4667,0.30196)(0.4706,0.30588)(0.4745,0.31373)(0.4784,0.31765)(0.4824,0.32549)(0.4863,0.33333)(0.4902,0.34118)(0.4941,0.3451)(0.498,0.35294)(0.502,0.36471)(0.5059,0.37255)(0.5098,0.38039)(0.5137,0.38824)(0.5176,0.4)(0.5216,0.40784)(0.5255,0.41961)(0.5294,0.42745)(0.5333,0.43922)(0.5373,0.45098)(0.5412,0.45882)(0.5451,0.47059)(0.549,0.48235)(0.5529,0.49412)(0.5569,0.50588)(0.5608,0.51765)(0.5647,0.52941)(0.5686,0.54118)(0.5725,0.55294)(0.5765,0.56471)(0.5804,0.57647)(0.5843,0.58824)(0.5882,0.6)(0.5922,0.61176)(0.5961,0.62745)(0.6,0.63922)(0.6039,0.65098)(0.6078,0.66275)(0.6118,0.67451)(0.6157,0.68627)(0.6196,0.69804)(0.6235,0.7098)(0.6275,0.72157)(0.6314,0.73333)(0.6353,0.7451)(0.6392,0.75686)(0.6431,0.76863)(0.6471,0.78039)(0.651,0.78824)(0.6549,0.8)(0.6588,0.81176)(0.6627,0.81961)(0.6667,0.83137)(0.6706,0.83922)(0.6745,0.85098)(0.6784,0.85882)(0.6824,0.86667)(0.6863,0.87451)(0.6902,0.88627)(0.6941,0.89412)(0.698,0.90196)(0.702,0.90588)(0.7059,0.91373)(0.7098,0.92157)(0.7137,0.92941)(0.7176,0.93333)(0.7216,0.94118)(0.7255,0.9451)(0.7294,0.94902)(0.7333,0.95294)(0.7373,0.96078)(0.7412,0.96471)(0.7451,0.96863)(0.749,0.96863)(0.7529,0.97255)(0.7569,0.97647)(0.7608,0.98039)(0.7647,0.98039)(0.7686,0.98431)(0.7725,0.98431)(0.7765,0.98431)(0.7804,0.98824)(0.7843,0.98824)(0.7882,0.98824)(0.7922,0.98824)(0.7961,0.98824)(0.8,0.98824)(0.8039,0.98824)(0.8078,0.98824)(0.8118,0.98824)(0.8157,0.98824)(0.8196,0.98431)(0.8235,0.98431)(0.8275,0.98431)(0.8314,0.98039)(0.8353,0.98039)(0.8392,0.98039)(0.8431,0.97647)(0.8471,0.97647)(0.851,0.97255)(0.8549,0.97255)(0.8588,0.96863)(0.8627,0.96863)(0.8667,0.96471)(0.8706,0.96471)(0.8745,0.96078)(0.8784,0.96078)(0.8824,0.96078)(0.8863,0.95686)(0.8902,0.95686)(0.8941,0.95686)(0.898,0.95294)(0.902,0.95294)(0.9059,0.95294)(0.9098,0.95294)(0.9137,0.94902)(0.9176,0.94902)(0.9216,0.94902)(0.9255,0.94902)(0.9294,0.94902)(0.9333,0.94902)(0.9373,0.95294)(0.9412,0.95294)(0.9451,0.95294)(0.949,0.95686)(0.9529,0.95686)(0.9569,0.95686)(0.9608,0.96078)(0.9647,0.96471)(0.9686,0.96471)(0.9725,0.96863)(0.9765,0.97255)(0.9804,0.97647)(0.9843,0.98039)(0.9882,0.98431)(0.9922,0.98824)(0.9961,0.99216)(1,1) ������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/ch05m151010.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027742 12567376460 016312� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch05m151010 # created by cptutils 1.46 # Wed Aug 15 23:30:54 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0.0039216)(0.0078,0.011765)(0.0118,0.015686)(0.0157,0.023529)(0.0196,0.031373)(0.0235,0.035294)(0.0275,0.039216)(0.0314,0.047059)(0.0353,0.05098)(0.0392,0.054902)(0.0431,0.058824)(0.0471,0.066667)(0.051,0.070588)(0.0549,0.07451)(0.0588,0.078431)(0.0627,0.078431)(0.0667,0.082353)(0.0706,0.086275)(0.0745,0.090196)(0.0784,0.090196)(0.0824,0.094118)(0.0863,0.094118)(0.0902,0.098039)(0.0941,0.098039)(0.098,0.098039)(0.102,0.10196)(0.1059,0.10196)(0.1098,0.10196)(0.1137,0.10196)(0.1176,0.10196)(0.1216,0.10196)(0.1255,0.10196)(0.1294,0.10196)(0.1333,0.10196)(0.1373,0.10196)(0.1412,0.10196)(0.1451,0.098039)(0.149,0.098039)(0.1529,0.098039)(0.1569,0.098039)(0.1608,0.094118)(0.1647,0.094118)(0.1686,0.094118)(0.1725,0.090196)(0.1765,0.090196)(0.1804,0.090196)(0.1843,0.090196)(0.1882,0.086275)(0.1922,0.086275)(0.1961,0.086275)(0.2,0.082353)(0.2039,0.082353)(0.2078,0.082353)(0.2118,0.082353)(0.2157,0.082353)(0.2196,0.082353)(0.2235,0.078431)(0.2275,0.078431)(0.2314,0.078431)(0.2353,0.082353)(0.2392,0.082353)(0.2431,0.082353)(0.2471,0.082353)(0.251,0.082353)(0.2549,0.086275)(0.2588,0.086275)(0.2627,0.086275)(0.2667,0.090196)(0.2706,0.090196)(0.2745,0.094118)(0.2784,0.098039)(0.2824,0.10196)(0.2863,0.10588)(0.2902,0.10588)(0.2941,0.1098)(0.298,0.11765)(0.302,0.12157)(0.3059,0.12549)(0.3098,0.12941)(0.3137,0.13725)(0.3176,0.14118)(0.3216,0.14902)(0.3255,0.15294)(0.3294,0.16078)(0.3333,0.16863)(0.3373,0.17647)(0.3412,0.18431)(0.3451,0.19216)(0.349,0.2)(0.3529,0.20784)(0.3569,0.21569)(0.3608,0.22353)(0.3647,0.23529)(0.3686,0.24314)(0.3725,0.2549)(0.3765,0.26275)(0.3804,0.27451)(0.3843,0.28235)(0.3882,0.29412)(0.3922,0.30588)(0.3961,0.31765)(0.4,0.32549)(0.4039,0.33725)(0.4078,0.34902)(0.4118,0.36078)(0.4157,0.37255)(0.4196,0.38431)(0.4235,0.39608)(0.4275,0.40784)(0.4314,0.41961)(0.4353,0.43137)(0.4392,0.44314)(0.4431,0.4549)(0.4471,0.47059)(0.451,0.48235)(0.4549,0.49412)(0.4588,0.50588)(0.4627,0.51765)(0.4667,0.52941)(0.4706,0.54118)(0.4745,0.55294)(0.4784,0.56471)(0.4824,0.57647)(0.4863,0.58824)(0.4902,0.6)(0.4941,0.60784)(0.498,0.61961)(0.502,0.63137)(0.5059,0.64314)(0.5098,0.65098)(0.5137,0.66275)(0.5176,0.67059)(0.5216,0.68235)(0.5255,0.6902)(0.5294,0.69804)(0.5333,0.7098)(0.5373,0.71765)(0.5412,0.72549)(0.5451,0.73333)(0.549,0.74118)(0.5529,0.74902)(0.5569,0.75686)(0.5608,0.76078)(0.5647,0.76863)(0.5686,0.77647)(0.5725,0.78039)(0.5765,0.78824)(0.5804,0.79216)(0.5843,0.79608)(0.5882,0.8)(0.5922,0.80392)(0.5961,0.80784)(0.6,0.81176)(0.6039,0.81569)(0.6078,0.81961)(0.6118,0.81961)(0.6157,0.82353)(0.6196,0.82745)(0.6235,0.82745)(0.6275,0.82745)(0.6314,0.83137)(0.6353,0.83137)(0.6392,0.83137)(0.6431,0.83137)(0.6471,0.83137)(0.651,0.83137)(0.6549,0.83137)(0.6588,0.83137)(0.6627,0.82745)(0.6667,0.82745)(0.6706,0.82745)(0.6745,0.82353)(0.6784,0.82353)(0.6824,0.82353)(0.6863,0.81961)(0.6902,0.81569)(0.6941,0.81569)(0.698,0.81176)(0.702,0.81176)(0.7059,0.80784)(0.7098,0.80392)(0.7137,0.80392)(0.7176,0.8)(0.7216,0.79608)(0.7255,0.79608)(0.7294,0.79216)(0.7333,0.78824)(0.7373,0.78824)(0.7412,0.78431)(0.7451,0.78039)(0.749,0.78039)(0.7529,0.77647)(0.7569,0.77255)(0.7608,0.77255)(0.7647,0.76863)(0.7686,0.76863)(0.7725,0.76471)(0.7765,0.76471)(0.7804,0.76078)(0.7843,0.76078)(0.7882,0.76078)(0.7922,0.75686)(0.7961,0.75686)(0.8,0.75686)(0.8039,0.75686)(0.8078,0.75686)(0.8118,0.75686)(0.8157,0.75686)(0.8196,0.75686)(0.8235,0.75686)(0.8275,0.75686)(0.8314,0.76078)(0.8353,0.76078)(0.8392,0.76471)(0.8431,0.76471)(0.8471,0.76863)(0.851,0.76863)(0.8549,0.77255)(0.8588,0.77647)(0.8627,0.78039)(0.8667,0.78431)(0.8706,0.78431)(0.8745,0.79216)(0.8784,0.79608)(0.8824,0.8)(0.8863,0.80392)(0.8902,0.80784)(0.8941,0.81569)(0.898,0.81961)(0.902,0.82353)(0.9059,0.83137)(0.9098,0.83529)(0.9137,0.84314)(0.9176,0.85098)(0.9216,0.8549)(0.9255,0.86275)(0.9294,0.87059)(0.9333,0.87451)(0.9373,0.88235)(0.9412,0.8902)(0.9451,0.89804)(0.949,0.90588)(0.9529,0.9098)(0.9569,0.91765)(0.9608,0.92549)(0.9647,0.93333)(0.9686,0.94118)(0.9725,0.94902)(0.9765,0.95686)(0.9804,0.96078)(0.9843,0.96863)(0.9882,0.97647)(0.9922,0.98431)(0.9961,0.99216)(1,1) GREEN: (0,0)(0.0039,0)(0.0078,0.0039216)(0.0118,0.0039216)(0.0157,0.0078431)(0.0196,0.0078431)(0.0235,0.011765)(0.0275,0.015686)(0.0314,0.015686)(0.0353,0.019608)(0.0392,0.023529)(0.0431,0.023529)(0.0471,0.027451)(0.051,0.031373)(0.0549,0.035294)(0.0588,0.039216)(0.0627,0.043137)(0.0667,0.043137)(0.0706,0.047059)(0.0745,0.05098)(0.0784,0.054902)(0.0824,0.058824)(0.0863,0.066667)(0.0902,0.070588)(0.0941,0.07451)(0.098,0.078431)(0.102,0.082353)(0.1059,0.086275)(0.1098,0.094118)(0.1137,0.098039)(0.1176,0.10196)(0.1216,0.1098)(0.1255,0.11373)(0.1294,0.12157)(0.1333,0.12549)(0.1373,0.13333)(0.1412,0.13725)(0.1451,0.1451)(0.149,0.14902)(0.1529,0.15686)(0.1569,0.16078)(0.1608,0.16863)(0.1647,0.17647)(0.1686,0.18039)(0.1725,0.18824)(0.1765,0.19608)(0.1804,0.20392)(0.1843,0.20784)(0.1882,0.21569)(0.1922,0.22353)(0.1961,0.22745)(0.2,0.23529)(0.2039,0.24314)(0.2078,0.25098)(0.2118,0.25882)(0.2157,0.26275)(0.2196,0.27059)(0.2235,0.27843)(0.2275,0.28627)(0.2314,0.2902)(0.2353,0.29804)(0.2392,0.30588)(0.2431,0.3098)(0.2471,0.31765)(0.251,0.32549)(0.2549,0.32941)(0.2588,0.33725)(0.2627,0.3451)(0.2667,0.34902)(0.2706,0.35686)(0.2745,0.36078)(0.2784,0.36863)(0.2824,0.37255)(0.2863,0.38039)(0.2902,0.38431)(0.2941,0.38824)(0.298,0.39608)(0.302,0.4)(0.3059,0.40392)(0.3098,0.40784)(0.3137,0.41569)(0.3176,0.41961)(0.3216,0.42353)(0.3255,0.42745)(0.3294,0.43137)(0.3333,0.43529)(0.3373,0.43922)(0.3412,0.44314)(0.3451,0.44706)(0.349,0.44706)(0.3529,0.45098)(0.3569,0.4549)(0.3608,0.4549)(0.3647,0.45882)(0.3686,0.46275)(0.3725,0.46275)(0.3765,0.46667)(0.3804,0.46667)(0.3843,0.47059)(0.3882,0.47059)(0.3922,0.47059)(0.3961,0.47451)(0.4,0.47451)(0.4039,0.47451)(0.4078,0.47451)(0.4118,0.47843)(0.4157,0.47843)(0.4196,0.47843)(0.4235,0.47843)(0.4275,0.47843)(0.4314,0.47843)(0.4353,0.47843)(0.4392,0.47843)(0.4431,0.47843)(0.4471,0.47843)(0.451,0.47843)(0.4549,0.47843)(0.4588,0.47843)(0.4627,0.47843)(0.4667,0.47843)(0.4706,0.47451)(0.4745,0.47451)(0.4784,0.47451)(0.4824,0.47451)(0.4863,0.47451)(0.4902,0.47451)(0.4941,0.47451)(0.498,0.47451)(0.502,0.47451)(0.5059,0.47059)(0.5098,0.47059)(0.5137,0.47059)(0.5176,0.47059)(0.5216,0.47059)(0.5255,0.47059)(0.5294,0.47059)(0.5333,0.47059)(0.5373,0.47059)(0.5412,0.47059)(0.5451,0.47451)(0.549,0.47451)(0.5529,0.47451)(0.5569,0.47451)(0.5608,0.47451)(0.5647,0.47843)(0.5686,0.47843)(0.5725,0.47843)(0.5765,0.48235)(0.5804,0.48235)(0.5843,0.48627)(0.5882,0.48627)(0.5922,0.4902)(0.5961,0.4902)(0.6,0.49412)(0.6039,0.49804)(0.6078,0.49804)(0.6118,0.50196)(0.6157,0.50588)(0.6196,0.5098)(0.6235,0.51373)(0.6275,0.51373)(0.6314,0.51765)(0.6353,0.52157)(0.6392,0.52941)(0.6431,0.53333)(0.6471,0.53725)(0.651,0.54118)(0.6549,0.5451)(0.6588,0.54902)(0.6627,0.55686)(0.6667,0.56078)(0.6706,0.56471)(0.6745,0.57255)(0.6784,0.57647)(0.6824,0.58431)(0.6863,0.58824)(0.6902,0.59608)(0.6941,0.60392)(0.698,0.60784)(0.702,0.61569)(0.7059,0.61961)(0.7098,0.62745)(0.7137,0.63529)(0.7176,0.64314)(0.7216,0.64706)(0.7255,0.6549)(0.7294,0.66275)(0.7333,0.67059)(0.7373,0.67451)(0.7412,0.68235)(0.7451,0.6902)(0.749,0.69804)(0.7529,0.70588)(0.7569,0.71373)(0.7608,0.71765)(0.7647,0.72549)(0.7686,0.73333)(0.7725,0.74118)(0.7765,0.74902)(0.7804,0.75686)(0.7843,0.76078)(0.7882,0.76863)(0.7922,0.77647)(0.7961,0.78431)(0.8,0.79216)(0.8039,0.79608)(0.8078,0.80392)(0.8118,0.81176)(0.8157,0.81569)(0.8196,0.82353)(0.8235,0.83137)(0.8275,0.83529)(0.8314,0.84314)(0.8353,0.84706)(0.8392,0.8549)(0.8431,0.85882)(0.8471,0.86667)(0.851,0.87059)(0.8549,0.87843)(0.8588,0.88235)(0.8627,0.88627)(0.8667,0.89412)(0.8706,0.89804)(0.8745,0.90196)(0.8784,0.90588)(0.8824,0.9098)(0.8863,0.91373)(0.8902,0.92157)(0.8941,0.92549)(0.898,0.92941)(0.902,0.93333)(0.9059,0.93725)(0.9098,0.94118)(0.9137,0.94118)(0.9176,0.9451)(0.9216,0.94902)(0.9255,0.95294)(0.9294,0.95686)(0.9333,0.95686)(0.9373,0.96078)(0.9412,0.96471)(0.9451,0.96863)(0.949,0.96863)(0.9529,0.97255)(0.9569,0.97255)(0.9608,0.97647)(0.9647,0.98039)(0.9686,0.98039)(0.9725,0.98431)(0.9765,0.98431)(0.9804,0.98824)(0.9843,0.98824)(0.9882,0.99216)(0.9922,0.99216)(0.9961,0.99608)(1,1) BLUE: (0,0)(0.0039,0.0039216)(0.0078,0.011765)(0.0118,0.015686)(0.0157,0.023529)(0.0196,0.031373)(0.0235,0.035294)(0.0275,0.043137)(0.0314,0.05098)(0.0353,0.058824)(0.0392,0.066667)(0.0431,0.07451)(0.0471,0.082353)(0.051,0.090196)(0.0549,0.098039)(0.0588,0.10588)(0.0627,0.11373)(0.0667,0.12157)(0.0706,0.12941)(0.0745,0.13725)(0.0784,0.1451)(0.0824,0.15294)(0.0863,0.16078)(0.0902,0.16863)(0.0941,0.17647)(0.098,0.18431)(0.102,0.18824)(0.1059,0.19608)(0.1098,0.20392)(0.1137,0.21176)(0.1176,0.21961)(0.1216,0.22353)(0.1255,0.23137)(0.1294,0.23529)(0.1333,0.24314)(0.1373,0.24706)(0.1412,0.2549)(0.1451,0.25882)(0.149,0.26275)(0.1529,0.27059)(0.1569,0.27451)(0.1608,0.27843)(0.1647,0.28235)(0.1686,0.28627)(0.1725,0.2902)(0.1765,0.2902)(0.1804,0.29412)(0.1843,0.29804)(0.1882,0.29804)(0.1922,0.30196)(0.1961,0.30196)(0.2,0.30196)(0.2039,0.30588)(0.2078,0.30588)(0.2118,0.30588)(0.2157,0.30588)(0.2196,0.30588)(0.2235,0.30588)(0.2275,0.30588)(0.2314,0.30196)(0.2353,0.30196)(0.2392,0.30196)(0.2431,0.29804)(0.2471,0.29804)(0.251,0.29412)(0.2549,0.29412)(0.2588,0.2902)(0.2627,0.28627)(0.2667,0.28627)(0.2706,0.28235)(0.2745,0.27843)(0.2784,0.27451)(0.2824,0.27059)(0.2863,0.26667)(0.2902,0.26275)(0.2941,0.25882)(0.298,0.25882)(0.302,0.2549)(0.3059,0.25098)(0.3098,0.24706)(0.3137,0.23922)(0.3176,0.23529)(0.3216,0.23137)(0.3255,0.22745)(0.3294,0.22745)(0.3333,0.22353)(0.3373,0.21961)(0.3412,0.21569)(0.3451,0.21176)(0.349,0.20784)(0.3529,0.20392)(0.3569,0.2)(0.3608,0.2)(0.3647,0.19608)(0.3686,0.19216)(0.3725,0.19216)(0.3765,0.18824)(0.3804,0.18824)(0.3843,0.18431)(0.3882,0.18431)(0.3922,0.18431)(0.3961,0.18039)(0.4,0.18039)(0.4039,0.18039)(0.4078,0.18039)(0.4118,0.18039)(0.4157,0.18431)(0.4196,0.18431)(0.4235,0.18431)(0.4275,0.18824)(0.4314,0.18824)(0.4353,0.19216)(0.4392,0.19608)(0.4431,0.19608)(0.4471,0.2)(0.451,0.20392)(0.4549,0.20784)(0.4588,0.21569)(0.4627,0.21961)(0.4667,0.22353)(0.4706,0.23137)(0.4745,0.23529)(0.4784,0.24314)(0.4824,0.25098)(0.4863,0.2549)(0.4902,0.26275)(0.4941,0.27059)(0.498,0.27843)(0.502,0.2902)(0.5059,0.29804)(0.5098,0.30588)(0.5137,0.31765)(0.5176,0.32549)(0.5216,0.33725)(0.5255,0.3451)(0.5294,0.35686)(0.5333,0.36863)(0.5373,0.37647)(0.5412,0.38824)(0.5451,0.4)(0.549,0.41176)(0.5529,0.42353)(0.5569,0.43529)(0.5608,0.44706)(0.5647,0.45882)(0.5686,0.47059)(0.5725,0.48627)(0.5765,0.49804)(0.5804,0.5098)(0.5843,0.52157)(0.5882,0.53333)(0.5922,0.54902)(0.5961,0.56078)(0.6,0.57255)(0.6039,0.58431)(0.6078,0.6)(0.6118,0.61176)(0.6157,0.62353)(0.6196,0.63529)(0.6235,0.64706)(0.6275,0.66275)(0.6314,0.67451)(0.6353,0.68627)(0.6392,0.69804)(0.6431,0.7098)(0.6471,0.72157)(0.651,0.72941)(0.6549,0.74118)(0.6588,0.75294)(0.6627,0.76471)(0.6667,0.77255)(0.6706,0.78431)(0.6745,0.79608)(0.6784,0.80392)(0.6824,0.81176)(0.6863,0.82353)(0.6902,0.83137)(0.6941,0.83922)(0.698,0.84706)(0.702,0.8549)(0.7059,0.86275)(0.7098,0.87059)(0.7137,0.87843)(0.7176,0.88627)(0.7216,0.8902)(0.7255,0.89804)(0.7294,0.90196)(0.7333,0.90588)(0.7373,0.91373)(0.7412,0.91765)(0.7451,0.92157)(0.749,0.92549)(0.7529,0.92941)(0.7569,0.93333)(0.7608,0.93725)(0.7647,0.93725)(0.7686,0.94118)(0.7725,0.9451)(0.7765,0.9451)(0.7804,0.94902)(0.7843,0.94902)(0.7882,0.94902)(0.7922,0.95294)(0.7961,0.95294)(0.8,0.95294)(0.8039,0.95294)(0.8078,0.95294)(0.8118,0.95294)(0.8157,0.95294)(0.8196,0.95294)(0.8235,0.95294)(0.8275,0.95294)(0.8314,0.94902)(0.8353,0.94902)(0.8392,0.94902)(0.8431,0.94902)(0.8471,0.9451)(0.851,0.9451)(0.8549,0.9451)(0.8588,0.9451)(0.8627,0.94118)(0.8667,0.94118)(0.8706,0.94118)(0.8745,0.93725)(0.8784,0.93725)(0.8824,0.93725)(0.8863,0.93725)(0.8902,0.93725)(0.8941,0.93333)(0.898,0.93333)(0.902,0.93333)(0.9059,0.93333)(0.9098,0.93333)(0.9137,0.93333)(0.9176,0.93333)(0.9216,0.93333)(0.9255,0.93725)(0.9294,0.93725)(0.9333,0.93725)(0.9373,0.94118)(0.9412,0.94118)(0.9451,0.94118)(0.949,0.9451)(0.9529,0.94902)(0.9569,0.94902)(0.9608,0.95294)(0.9647,0.95686)(0.9686,0.96078)(0.9725,0.96471)(0.9765,0.96863)(0.9804,0.97255)(0.9843,0.97647)(0.9882,0.98039)(0.9922,0.98824)(0.9961,0.99216)(1,1) ������������������������������saods9/ds9/cmaps/ch05m151012.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027736 12567376460 016317� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch05m151012 # created by cptutils 1.46 # Wed Aug 15 23:30:53 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0.0039216)(0.0078,0.0078431)(0.0118,0.011765)(0.0157,0.015686)(0.0196,0.019608)(0.0235,0.023529)(0.0275,0.027451)(0.0314,0.031373)(0.0353,0.035294)(0.0392,0.039216)(0.0431,0.039216)(0.0471,0.043137)(0.051,0.047059)(0.0549,0.047059)(0.0588,0.05098)(0.0627,0.054902)(0.0667,0.054902)(0.0706,0.054902)(0.0745,0.058824)(0.0784,0.058824)(0.0824,0.058824)(0.0863,0.062745)(0.0902,0.062745)(0.0941,0.062745)(0.098,0.062745)(0.102,0.062745)(0.1059,0.062745)(0.1098,0.062745)(0.1137,0.062745)(0.1176,0.062745)(0.1216,0.058824)(0.1255,0.058824)(0.1294,0.058824)(0.1333,0.058824)(0.1373,0.054902)(0.1412,0.054902)(0.1451,0.054902)(0.149,0.05098)(0.1529,0.05098)(0.1569,0.047059)(0.1608,0.047059)(0.1647,0.043137)(0.1686,0.043137)(0.1725,0.039216)(0.1765,0.039216)(0.1804,0.039216)(0.1843,0.035294)(0.1882,0.035294)(0.1922,0.031373)(0.1961,0.031373)(0.2,0.027451)(0.2039,0.027451)(0.2078,0.027451)(0.2118,0.023529)(0.2157,0.023529)(0.2196,0.023529)(0.2235,0.023529)(0.2275,0.023529)(0.2314,0.019608)(0.2353,0.019608)(0.2392,0.019608)(0.2431,0.019608)(0.2471,0.023529)(0.251,0.023529)(0.2549,0.023529)(0.2588,0.023529)(0.2627,0.027451)(0.2667,0.027451)(0.2706,0.031373)(0.2745,0.031373)(0.2784,0.035294)(0.2824,0.039216)(0.2863,0.039216)(0.2902,0.043137)(0.2941,0.047059)(0.298,0.05098)(0.302,0.054902)(0.3059,0.062745)(0.3098,0.066667)(0.3137,0.070588)(0.3176,0.078431)(0.3216,0.082353)(0.3255,0.090196)(0.3294,0.094118)(0.3333,0.10196)(0.3373,0.1098)(0.3412,0.11765)(0.3451,0.12549)(0.349,0.13333)(0.3529,0.14118)(0.3569,0.14902)(0.3608,0.15686)(0.3647,0.16863)(0.3686,0.17647)(0.3725,0.18824)(0.3765,0.19608)(0.3804,0.20784)(0.3843,0.21569)(0.3882,0.22745)(0.3922,0.23922)(0.3961,0.25098)(0.4,0.25882)(0.4039,0.27059)(0.4078,0.28235)(0.4118,0.29412)(0.4157,0.30588)(0.4196,0.31765)(0.4235,0.32941)(0.4275,0.34118)(0.4314,0.35294)(0.4353,0.36471)(0.4392,0.37647)(0.4431,0.39216)(0.4471,0.40392)(0.451,0.41569)(0.4549,0.42745)(0.4588,0.43922)(0.4627,0.45098)(0.4667,0.46275)(0.4706,0.47451)(0.4745,0.48627)(0.4784,0.49804)(0.4824,0.5098)(0.4863,0.52157)(0.4902,0.53333)(0.4941,0.5451)(0.498,0.55686)(0.502,0.56471)(0.5059,0.57647)(0.5098,0.58824)(0.5137,0.59608)(0.5176,0.60784)(0.5216,0.61569)(0.5255,0.62745)(0.5294,0.63529)(0.5333,0.64706)(0.5373,0.6549)(0.5412,0.66275)(0.5451,0.67059)(0.549,0.67843)(0.5529,0.68627)(0.5569,0.69412)(0.5608,0.70196)(0.5647,0.7098)(0.5686,0.71373)(0.5725,0.72157)(0.5765,0.72549)(0.5804,0.73333)(0.5843,0.73725)(0.5882,0.74118)(0.5922,0.7451)(0.5961,0.74902)(0.6,0.75294)(0.6039,0.75686)(0.6078,0.76078)(0.6118,0.76471)(0.6157,0.76863)(0.6196,0.76863)(0.6235,0.77255)(0.6275,0.77255)(0.6314,0.77255)(0.6353,0.77647)(0.6392,0.77647)(0.6431,0.77647)(0.6471,0.77647)(0.651,0.77647)(0.6549,0.77647)(0.6588,0.77647)(0.6627,0.77647)(0.6667,0.77647)(0.6706,0.77647)(0.6745,0.77255)(0.6784,0.77255)(0.6824,0.77255)(0.6863,0.76863)(0.6902,0.76863)(0.6941,0.76471)(0.698,0.76471)(0.702,0.76078)(0.7059,0.76078)(0.7098,0.75686)(0.7137,0.75686)(0.7176,0.75294)(0.7216,0.75294)(0.7255,0.74902)(0.7294,0.74902)(0.7333,0.7451)(0.7373,0.74118)(0.7412,0.74118)(0.7451,0.73725)(0.749,0.73725)(0.7529,0.73333)(0.7569,0.73333)(0.7608,0.72941)(0.7647,0.72941)(0.7686,0.72941)(0.7725,0.72549)(0.7765,0.72549)(0.7804,0.72549)(0.7843,0.72157)(0.7882,0.72157)(0.7922,0.72157)(0.7961,0.72157)(0.8,0.72157)(0.8039,0.72157)(0.8078,0.72157)(0.8118,0.72157)(0.8157,0.72549)(0.8196,0.72549)(0.8235,0.72549)(0.8275,0.72941)(0.8314,0.72941)(0.8353,0.73333)(0.8392,0.73333)(0.8431,0.73725)(0.8471,0.74118)(0.851,0.74118)(0.8549,0.7451)(0.8588,0.74902)(0.8627,0.75294)(0.8667,0.75686)(0.8706,0.76078)(0.8745,0.76863)(0.8784,0.77255)(0.8824,0.77647)(0.8863,0.78431)(0.8902,0.78824)(0.8941,0.79216)(0.898,0.8)(0.902,0.80784)(0.9059,0.81176)(0.9098,0.81961)(0.9137,0.82745)(0.9176,0.83529)(0.9216,0.83922)(0.9255,0.84706)(0.9294,0.8549)(0.9333,0.86275)(0.9373,0.87059)(0.9412,0.87843)(0.9451,0.88627)(0.949,0.89412)(0.9529,0.90196)(0.9569,0.9098)(0.9608,0.91765)(0.9647,0.92549)(0.9686,0.93333)(0.9725,0.94118)(0.9765,0.94902)(0.9804,0.96078)(0.9843,0.96863)(0.9882,0.97647)(0.9922,0.98431)(0.9961,0.99216)(1,1) GREEN: (0,0)(0.0039,0)(0.0078,0)(0.0118,0)(0.0157,0)(0.0196,0)(0.0235,0)(0.0275,0)(0.0314,0)(0.0353,0.0039216)(0.0392,0.0039216)(0.0431,0.0039216)(0.0471,0.0078431)(0.051,0.0078431)(0.0549,0.011765)(0.0588,0.011765)(0.0627,0.015686)(0.0667,0.015686)(0.0706,0.019608)(0.0745,0.023529)(0.0784,0.023529)(0.0824,0.027451)(0.0863,0.031373)(0.0902,0.035294)(0.0941,0.039216)(0.098,0.043137)(0.102,0.047059)(0.1059,0.05098)(0.1098,0.054902)(0.1137,0.058824)(0.1176,0.062745)(0.1216,0.066667)(0.1255,0.070588)(0.1294,0.078431)(0.1333,0.082353)(0.1373,0.086275)(0.1412,0.090196)(0.1451,0.098039)(0.149,0.10196)(0.1529,0.1098)(0.1569,0.11373)(0.1608,0.11765)(0.1647,0.12549)(0.1686,0.13333)(0.1725,0.13725)(0.1765,0.1451)(0.1804,0.14902)(0.1843,0.15686)(0.1882,0.16078)(0.1922,0.16863)(0.1961,0.17647)(0.2,0.18039)(0.2039,0.18824)(0.2078,0.19216)(0.2118,0.2)(0.2157,0.20784)(0.2196,0.21176)(0.2235,0.21961)(0.2275,0.22745)(0.2314,0.23137)(0.2353,0.23922)(0.2392,0.24706)(0.2431,0.25098)(0.2471,0.25882)(0.251,0.26275)(0.2549,0.27059)(0.2588,0.27451)(0.2627,0.28235)(0.2667,0.28627)(0.2706,0.29412)(0.2745,0.29804)(0.2784,0.30588)(0.2824,0.3098)(0.2863,0.31373)(0.2902,0.32157)(0.2941,0.32549)(0.298,0.32941)(0.302,0.33725)(0.3059,0.34118)(0.3098,0.3451)(0.3137,0.34902)(0.3176,0.35294)(0.3216,0.35686)(0.3255,0.36078)(0.3294,0.36471)(0.3333,0.36863)(0.3373,0.37255)(0.3412,0.37647)(0.3451,0.38039)(0.349,0.38039)(0.3529,0.38431)(0.3569,0.38824)(0.3608,0.38824)(0.3647,0.39216)(0.3686,0.39608)(0.3725,0.39608)(0.3765,0.4)(0.3804,0.4)(0.3843,0.40392)(0.3882,0.40392)(0.3922,0.40392)(0.3961,0.40784)(0.4,0.40784)(0.4039,0.40784)(0.4078,0.40784)(0.4118,0.41176)(0.4157,0.41176)(0.4196,0.41176)(0.4235,0.41176)(0.4275,0.41176)(0.4314,0.41176)(0.4353,0.41176)(0.4392,0.41176)(0.4431,0.41176)(0.4471,0.41176)(0.451,0.41176)(0.4549,0.41176)(0.4588,0.41176)(0.4627,0.41176)(0.4667,0.41176)(0.4706,0.41176)(0.4745,0.41176)(0.4784,0.41176)(0.4824,0.40784)(0.4863,0.40784)(0.4902,0.40784)(0.4941,0.40784)(0.498,0.40784)(0.502,0.40784)(0.5059,0.40784)(0.5098,0.40784)(0.5137,0.40784)(0.5176,0.40784)(0.5216,0.40784)(0.5255,0.40784)(0.5294,0.40784)(0.5333,0.40784)(0.5373,0.40784)(0.5412,0.41176)(0.5451,0.41176)(0.549,0.41176)(0.5529,0.41176)(0.5569,0.41176)(0.5608,0.41569)(0.5647,0.41569)(0.5686,0.41569)(0.5725,0.41961)(0.5765,0.41961)(0.5804,0.42353)(0.5843,0.42353)(0.5882,0.42745)(0.5922,0.43137)(0.5961,0.43137)(0.6,0.43529)(0.6039,0.43922)(0.6078,0.44314)(0.6118,0.44314)(0.6157,0.44706)(0.6196,0.45098)(0.6235,0.4549)(0.6275,0.45882)(0.6314,0.46275)(0.6353,0.46667)(0.6392,0.47451)(0.6431,0.47843)(0.6471,0.48235)(0.651,0.48627)(0.6549,0.49412)(0.6588,0.49804)(0.6627,0.50196)(0.6667,0.5098)(0.6706,0.51373)(0.6745,0.52157)(0.6784,0.52549)(0.6824,0.53333)(0.6863,0.54118)(0.6902,0.5451)(0.6941,0.55294)(0.698,0.56078)(0.702,0.56863)(0.7059,0.57255)(0.7098,0.58039)(0.7137,0.58824)(0.7176,0.59608)(0.7216,0.60392)(0.7255,0.61176)(0.7294,0.61569)(0.7333,0.62353)(0.7373,0.63137)(0.7412,0.63922)(0.7451,0.64706)(0.749,0.6549)(0.7529,0.66275)(0.7569,0.67059)(0.7608,0.67843)(0.7647,0.68627)(0.7686,0.69412)(0.7725,0.70196)(0.7765,0.7098)(0.7804,0.71765)(0.7843,0.72549)(0.7882,0.73333)(0.7922,0.74118)(0.7961,0.74902)(0.8,0.75686)(0.8039,0.76078)(0.8078,0.76863)(0.8118,0.77647)(0.8157,0.78431)(0.8196,0.79216)(0.8235,0.8)(0.8275,0.80392)(0.8314,0.81176)(0.8353,0.81961)(0.8392,0.82353)(0.8431,0.83137)(0.8471,0.83922)(0.851,0.84314)(0.8549,0.85098)(0.8588,0.8549)(0.8627,0.86275)(0.8667,0.86667)(0.8706,0.87451)(0.8745,0.87843)(0.8784,0.88235)(0.8824,0.8902)(0.8863,0.89412)(0.8902,0.89804)(0.8941,0.90588)(0.898,0.9098)(0.902,0.91373)(0.9059,0.91765)(0.9098,0.92157)(0.9137,0.92549)(0.9176,0.92941)(0.9216,0.93333)(0.9255,0.93725)(0.9294,0.94118)(0.9333,0.9451)(0.9373,0.94902)(0.9412,0.95294)(0.9451,0.95686)(0.949,0.96078)(0.9529,0.96078)(0.9569,0.96471)(0.9608,0.96863)(0.9647,0.97255)(0.9686,0.97647)(0.9725,0.97647)(0.9765,0.98039)(0.9804,0.98431)(0.9843,0.98824)(0.9882,0.98824)(0.9922,0.99216)(0.9961,0.99608)(1,1) BLUE: (0,0)(0.0039,0)(0.0078,0.0039216)(0.0118,0.0078431)(0.0157,0.015686)(0.0196,0.019608)(0.0235,0.023529)(0.0275,0.031373)(0.0314,0.035294)(0.0353,0.043137)(0.0392,0.047059)(0.0431,0.054902)(0.0471,0.058824)(0.051,0.066667)(0.0549,0.07451)(0.0588,0.078431)(0.0627,0.086275)(0.0667,0.094118)(0.0706,0.098039)(0.0745,0.10588)(0.0784,0.11373)(0.0824,0.12157)(0.0863,0.12549)(0.0902,0.13333)(0.0941,0.14118)(0.098,0.1451)(0.102,0.15294)(0.1059,0.16078)(0.1098,0.16471)(0.1137,0.17255)(0.1176,0.17647)(0.1216,0.18431)(0.1255,0.18824)(0.1294,0.19216)(0.1333,0.2)(0.1373,0.20392)(0.1412,0.20784)(0.1451,0.21176)(0.149,0.21569)(0.1529,0.21961)(0.1569,0.22353)(0.1608,0.22745)(0.1647,0.23137)(0.1686,0.23529)(0.1725,0.23922)(0.1765,0.23922)(0.1804,0.24314)(0.1843,0.24314)(0.1882,0.24706)(0.1922,0.24706)(0.1961,0.24706)(0.2,0.24706)(0.2039,0.25098)(0.2078,0.25098)(0.2118,0.25098)(0.2157,0.24706)(0.2196,0.24706)(0.2235,0.24706)(0.2275,0.24706)(0.2314,0.24314)(0.2353,0.24314)(0.2392,0.24314)(0.2431,0.23922)(0.2471,0.23529)(0.251,0.23529)(0.2549,0.23137)(0.2588,0.22745)(0.2627,0.22745)(0.2667,0.22353)(0.2706,0.21961)(0.2745,0.21569)(0.2784,0.21176)(0.2824,0.20784)(0.2863,0.20392)(0.2902,0.2)(0.2941,0.19608)(0.298,0.19216)(0.302,0.18824)(0.3059,0.18431)(0.3098,0.18039)(0.3137,0.17647)(0.3176,0.17255)(0.3216,0.16863)(0.3255,0.16471)(0.3294,0.16078)(0.3333,0.15686)(0.3373,0.15294)(0.3412,0.14902)(0.3451,0.1451)(0.349,0.14118)(0.3529,0.13725)(0.3569,0.13333)(0.3608,0.13333)(0.3647,0.12941)(0.3686,0.12549)(0.3725,0.12549)(0.3765,0.12157)(0.3804,0.12157)(0.3843,0.11765)(0.3882,0.11765)(0.3922,0.11765)(0.3961,0.11373)(0.4,0.11373)(0.4039,0.11373)(0.4078,0.11373)(0.4118,0.11373)(0.4157,0.11765)(0.4196,0.11765)(0.4235,0.11765)(0.4275,0.12157)(0.4314,0.12157)(0.4353,0.12549)(0.4392,0.12941)(0.4431,0.12941)(0.4471,0.13333)(0.451,0.13725)(0.4549,0.1451)(0.4588,0.14902)(0.4627,0.15294)(0.4667,0.15686)(0.4706,0.16471)(0.4745,0.17255)(0.4784,0.17647)(0.4824,0.18431)(0.4863,0.19216)(0.4902,0.2)(0.4941,0.20784)(0.498,0.21569)(0.502,0.22353)(0.5059,0.23137)(0.5098,0.24314)(0.5137,0.25098)(0.5176,0.26275)(0.5216,0.27059)(0.5255,0.28235)(0.5294,0.29412)(0.5333,0.30588)(0.5373,0.31373)(0.5412,0.32549)(0.5451,0.33725)(0.549,0.34902)(0.5529,0.36078)(0.5569,0.37255)(0.5608,0.38824)(0.5647,0.4)(0.5686,0.41176)(0.5725,0.42353)(0.5765,0.43529)(0.5804,0.45098)(0.5843,0.46275)(0.5882,0.47451)(0.5922,0.4902)(0.5961,0.50196)(0.6,0.51373)(0.6039,0.52941)(0.6078,0.54118)(0.6118,0.55294)(0.6157,0.56863)(0.6196,0.58039)(0.6235,0.59216)(0.6275,0.60392)(0.6314,0.61569)(0.6353,0.63137)(0.6392,0.64314)(0.6431,0.6549)(0.6471,0.66667)(0.651,0.67843)(0.6549,0.6902)(0.6588,0.70196)(0.6627,0.7098)(0.6667,0.72157)(0.6706,0.73333)(0.6745,0.7451)(0.6784,0.75294)(0.6824,0.76471)(0.6863,0.77255)(0.6902,0.78039)(0.6941,0.79216)(0.698,0.8)(0.702,0.80784)(0.7059,0.81569)(0.7098,0.82353)(0.7137,0.83137)(0.7176,0.83922)(0.7216,0.84314)(0.7255,0.85098)(0.7294,0.85882)(0.7333,0.86275)(0.7373,0.87059)(0.7412,0.87451)(0.7451,0.87843)(0.749,0.88235)(0.7529,0.88627)(0.7569,0.8902)(0.7608,0.89412)(0.7647,0.89804)(0.7686,0.90196)(0.7725,0.90588)(0.7765,0.90588)(0.7804,0.9098)(0.7843,0.9098)(0.7882,0.91373)(0.7922,0.91373)(0.7961,0.91765)(0.8,0.91765)(0.8039,0.91765)(0.8078,0.91765)(0.8118,0.92157)(0.8157,0.92157)(0.8196,0.92157)(0.8235,0.92157)(0.8275,0.92157)(0.8314,0.92157)(0.8353,0.92157)(0.8392,0.92157)(0.8431,0.91765)(0.8471,0.91765)(0.851,0.91765)(0.8549,0.91765)(0.8588,0.91765)(0.8627,0.91765)(0.8667,0.91765)(0.8706,0.91765)(0.8745,0.91765)(0.8784,0.91373)(0.8824,0.91373)(0.8863,0.91373)(0.8902,0.91373)(0.8941,0.91373)(0.898,0.91373)(0.902,0.91373)(0.9059,0.91765)(0.9098,0.91765)(0.9137,0.91765)(0.9176,0.91765)(0.9216,0.92157)(0.9255,0.92157)(0.9294,0.92157)(0.9333,0.92549)(0.9373,0.92549)(0.9412,0.92941)(0.9451,0.93333)(0.949,0.93333)(0.9529,0.93725)(0.9569,0.94118)(0.9608,0.9451)(0.9647,0.94902)(0.9686,0.95294)(0.9725,0.95686)(0.9765,0.96471)(0.9804,0.96863)(0.9843,0.97255)(0.9882,0.98039)(0.9922,0.98431)(0.9961,0.99216)(1,1) ����������������������������������saods9/ds9/cmaps/ch05m151410.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027577 12567376460 016324� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch05m151410 # created by cptutils 1.46 # Wed Aug 15 23:30:53 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0.0039216)(0.0078,0.011765)(0.0118,0.019608)(0.0157,0.027451)(0.0196,0.035294)(0.0235,0.039216)(0.0275,0.047059)(0.0314,0.054902)(0.0353,0.058824)(0.0392,0.062745)(0.0431,0.066667)(0.0471,0.07451)(0.051,0.078431)(0.0549,0.082353)(0.0588,0.086275)(0.0627,0.086275)(0.0667,0.090196)(0.0706,0.094118)(0.0745,0.094118)(0.0784,0.098039)(0.0824,0.098039)(0.0863,0.098039)(0.0902,0.098039)(0.0941,0.10196)(0.098,0.10196)(0.102,0.10196)(0.1059,0.098039)(0.1098,0.098039)(0.1137,0.098039)(0.1176,0.098039)(0.1216,0.094118)(0.1255,0.094118)(0.1294,0.090196)(0.1333,0.090196)(0.1373,0.086275)(0.1412,0.086275)(0.1451,0.082353)(0.149,0.078431)(0.1529,0.07451)(0.1569,0.07451)(0.1608,0.070588)(0.1647,0.066667)(0.1686,0.062745)(0.1725,0.058824)(0.1765,0.058824)(0.1804,0.054902)(0.1843,0.05098)(0.1882,0.047059)(0.1922,0.043137)(0.1961,0.043137)(0.2,0.039216)(0.2039,0.035294)(0.2078,0.031373)(0.2118,0.031373)(0.2157,0.027451)(0.2196,0.027451)(0.2235,0.023529)(0.2275,0.023529)(0.2314,0.019608)(0.2353,0.019608)(0.2392,0.019608)(0.2431,0.015686)(0.2471,0.015686)(0.251,0.015686)(0.2549,0.015686)(0.2588,0.019608)(0.2627,0.019608)(0.2667,0.019608)(0.2706,0.019608)(0.2745,0.023529)(0.2784,0.027451)(0.2824,0.027451)(0.2863,0.031373)(0.2902,0.035294)(0.2941,0.039216)(0.298,0.043137)(0.302,0.047059)(0.3059,0.054902)(0.3098,0.058824)(0.3137,0.066667)(0.3176,0.070588)(0.3216,0.078431)(0.3255,0.086275)(0.3294,0.094118)(0.3333,0.10196)(0.3373,0.1098)(0.3412,0.12157)(0.3451,0.12941)(0.349,0.14118)(0.3529,0.14902)(0.3569,0.16078)(0.3608,0.17255)(0.3647,0.18431)(0.3686,0.19608)(0.3725,0.20784)(0.3765,0.21961)(0.3804,0.23137)(0.3843,0.24314)(0.3882,0.25882)(0.3922,0.27059)(0.3961,0.28627)(0.4,0.29804)(0.4039,0.31373)(0.4078,0.32941)(0.4118,0.34118)(0.4157,0.35686)(0.4196,0.37255)(0.4235,0.38824)(0.4275,0.4)(0.4314,0.41569)(0.4353,0.43137)(0.4392,0.44706)(0.4431,0.46275)(0.4471,0.47843)(0.451,0.49412)(0.4549,0.5098)(0.4588,0.52549)(0.4627,0.54118)(0.4667,0.55294)(0.4706,0.56863)(0.4745,0.58431)(0.4784,0.6)(0.4824,0.61176)(0.4863,0.62745)(0.4902,0.64314)(0.4941,0.6549)(0.498,0.67059)(0.502,0.68235)(0.5059,0.69804)(0.5098,0.7098)(0.5137,0.72157)(0.5176,0.73333)(0.5216,0.7451)(0.5255,0.75686)(0.5294,0.76863)(0.5333,0.78039)(0.5373,0.78824)(0.5412,0.8)(0.5451,0.80784)(0.549,0.81961)(0.5529,0.82745)(0.5569,0.83529)(0.5608,0.84314)(0.5647,0.85098)(0.5686,0.85882)(0.5725,0.86667)(0.5765,0.87059)(0.5804,0.87843)(0.5843,0.88235)(0.5882,0.88627)(0.5922,0.8902)(0.5961,0.89412)(0.6,0.89804)(0.6039,0.90196)(0.6078,0.90588)(0.6118,0.90588)(0.6157,0.90588)(0.6196,0.9098)(0.6235,0.9098)(0.6275,0.9098)(0.6314,0.9098)(0.6353,0.9098)(0.6392,0.9098)(0.6431,0.90588)(0.6471,0.90588)(0.651,0.90588)(0.6549,0.90196)(0.6588,0.89804)(0.6627,0.89804)(0.6667,0.89412)(0.6706,0.8902)(0.6745,0.88627)(0.6784,0.88235)(0.6824,0.87843)(0.6863,0.87451)(0.6902,0.87059)(0.6941,0.86275)(0.698,0.85882)(0.702,0.8549)(0.7059,0.85098)(0.7098,0.84314)(0.7137,0.83922)(0.7176,0.83529)(0.7216,0.82745)(0.7255,0.82353)(0.7294,0.81569)(0.7333,0.81176)(0.7373,0.80784)(0.7412,0.8)(0.7451,0.79608)(0.749,0.79216)(0.7529,0.78431)(0.7569,0.78039)(0.7608,0.77647)(0.7647,0.77255)(0.7686,0.76863)(0.7725,0.76471)(0.7765,0.76078)(0.7804,0.75686)(0.7843,0.75294)(0.7882,0.74902)(0.7922,0.7451)(0.7961,0.74118)(0.8,0.74118)(0.8039,0.73725)(0.8078,0.73725)(0.8118,0.73333)(0.8157,0.73333)(0.8196,0.73333)(0.8235,0.73333)(0.8275,0.73333)(0.8314,0.73333)(0.8353,0.73333)(0.8392,0.73333)(0.8431,0.73333)(0.8471,0.73725)(0.851,0.73725)(0.8549,0.74118)(0.8588,0.74118)(0.8627,0.7451)(0.8667,0.74902)(0.8706,0.75294)(0.8745,0.75686)(0.8784,0.76078)(0.8824,0.76471)(0.8863,0.77255)(0.8902,0.77647)(0.8941,0.78431)(0.898,0.78824)(0.902,0.79608)(0.9059,0.8)(0.9098,0.80784)(0.9137,0.81569)(0.9176,0.82353)(0.9216,0.83137)(0.9255,0.83922)(0.9294,0.84706)(0.9333,0.8549)(0.9373,0.86275)(0.9412,0.87059)(0.9451,0.87843)(0.949,0.88627)(0.9529,0.89412)(0.9569,0.90588)(0.9608,0.91373)(0.9647,0.92157)(0.9686,0.92941)(0.9725,0.93725)(0.9765,0.94902)(0.9804,0.95686)(0.9843,0.96471)(0.9882,0.97255)(0.9922,0.98039)(0.9961,0.98824)(1,1) GREEN: (0,0)(0.0039,0)(0.0078,0)(0.0118,0.0039216)(0.0157,0.0039216)(0.0196,0.0039216)(0.0235,0.0078431)(0.0275,0.0078431)(0.0314,0.011765)(0.0353,0.015686)(0.0392,0.015686)(0.0431,0.019608)(0.0471,0.019608)(0.051,0.023529)(0.0549,0.027451)(0.0588,0.031373)(0.0627,0.035294)(0.0667,0.035294)(0.0706,0.039216)(0.0745,0.043137)(0.0784,0.047059)(0.0824,0.05098)(0.0863,0.058824)(0.0902,0.062745)(0.0941,0.066667)(0.098,0.070588)(0.102,0.07451)(0.1059,0.082353)(0.1098,0.086275)(0.1137,0.094118)(0.1176,0.098039)(0.1216,0.10588)(0.1255,0.1098)(0.1294,0.11765)(0.1333,0.12157)(0.1373,0.12941)(0.1412,0.13725)(0.1451,0.1451)(0.149,0.14902)(0.1529,0.15686)(0.1569,0.16471)(0.1608,0.17255)(0.1647,0.18039)(0.1686,0.18824)(0.1725,0.19608)(0.1765,0.20392)(0.1804,0.21176)(0.1843,0.21961)(0.1882,0.22745)(0.1922,0.23529)(0.1961,0.24314)(0.2,0.25098)(0.2039,0.25882)(0.2078,0.26667)(0.2118,0.27451)(0.2157,0.28235)(0.2196,0.29412)(0.2235,0.30196)(0.2275,0.3098)(0.2314,0.31765)(0.2353,0.32549)(0.2392,0.33333)(0.2431,0.34118)(0.2471,0.34902)(0.251,0.35686)(0.2549,0.36078)(0.2588,0.36863)(0.2627,0.37647)(0.2667,0.38431)(0.2706,0.39216)(0.2745,0.39608)(0.2784,0.40392)(0.2824,0.41176)(0.2863,0.41569)(0.2902,0.42353)(0.2941,0.42745)(0.298,0.43529)(0.302,0.43922)(0.3059,0.44706)(0.3098,0.45098)(0.3137,0.4549)(0.3176,0.45882)(0.3216,0.46275)(0.3255,0.46667)(0.3294,0.47059)(0.3333,0.47451)(0.3373,0.47843)(0.3412,0.48235)(0.3451,0.48627)(0.349,0.4902)(0.3529,0.4902)(0.3569,0.49412)(0.3608,0.49412)(0.3647,0.49804)(0.3686,0.49804)(0.3725,0.50196)(0.3765,0.50196)(0.3804,0.50196)(0.3843,0.50196)(0.3882,0.50588)(0.3922,0.50588)(0.3961,0.50588)(0.4,0.50588)(0.4039,0.50588)(0.4078,0.50588)(0.4118,0.50196)(0.4157,0.50196)(0.4196,0.50196)(0.4235,0.50196)(0.4275,0.49804)(0.4314,0.49804)(0.4353,0.49804)(0.4392,0.49412)(0.4431,0.49412)(0.4471,0.4902)(0.451,0.4902)(0.4549,0.48627)(0.4588,0.48627)(0.4627,0.48235)(0.4667,0.48235)(0.4706,0.47843)(0.4745,0.47843)(0.4784,0.47451)(0.4824,0.47451)(0.4863,0.47059)(0.4902,0.46667)(0.4941,0.46667)(0.498,0.46275)(0.502,0.46275)(0.5059,0.45882)(0.5098,0.45882)(0.5137,0.4549)(0.5176,0.4549)(0.5216,0.45098)(0.5255,0.45098)(0.5294,0.45098)(0.5333,0.44706)(0.5373,0.44706)(0.5412,0.44706)(0.5451,0.44314)(0.549,0.44314)(0.5529,0.44314)(0.5569,0.44314)(0.5608,0.44314)(0.5647,0.44314)(0.5686,0.44314)(0.5725,0.44314)(0.5765,0.44314)(0.5804,0.44314)(0.5843,0.44706)(0.5882,0.44706)(0.5922,0.44706)(0.5961,0.45098)(0.6,0.45098)(0.6039,0.4549)(0.6078,0.4549)(0.6118,0.45882)(0.6157,0.46275)(0.6196,0.46667)(0.6235,0.46667)(0.6275,0.47059)(0.6314,0.47451)(0.6353,0.47843)(0.6392,0.48235)(0.6431,0.48627)(0.6471,0.49412)(0.651,0.49804)(0.6549,0.50196)(0.6588,0.5098)(0.6627,0.51373)(0.6667,0.52157)(0.6706,0.52549)(0.6745,0.53333)(0.6784,0.53725)(0.6824,0.5451)(0.6863,0.55294)(0.6902,0.56078)(0.6941,0.56471)(0.698,0.57255)(0.702,0.58039)(0.7059,0.58824)(0.7098,0.59608)(0.7137,0.60392)(0.7176,0.61176)(0.7216,0.61961)(0.7255,0.62745)(0.7294,0.63529)(0.7333,0.64314)(0.7373,0.65098)(0.7412,0.66275)(0.7451,0.67059)(0.749,0.67843)(0.7529,0.68627)(0.7569,0.69412)(0.7608,0.70196)(0.7647,0.71373)(0.7686,0.72157)(0.7725,0.72941)(0.7765,0.73725)(0.7804,0.7451)(0.7843,0.75294)(0.7882,0.76078)(0.7922,0.77255)(0.7961,0.78039)(0.8,0.78824)(0.8039,0.79608)(0.8078,0.80392)(0.8118,0.81176)(0.8157,0.81961)(0.8196,0.82745)(0.8235,0.83137)(0.8275,0.83922)(0.8314,0.84706)(0.8353,0.8549)(0.8392,0.86275)(0.8431,0.86667)(0.8471,0.87451)(0.851,0.87843)(0.8549,0.88627)(0.8588,0.89412)(0.8627,0.89804)(0.8667,0.90196)(0.8706,0.9098)(0.8745,0.91373)(0.8784,0.91765)(0.8824,0.92549)(0.8863,0.92941)(0.8902,0.93333)(0.8941,0.93725)(0.898,0.94118)(0.902,0.9451)(0.9059,0.94902)(0.9098,0.95294)(0.9137,0.95686)(0.9176,0.95686)(0.9216,0.96078)(0.9255,0.96471)(0.9294,0.96863)(0.9333,0.96863)(0.9373,0.97255)(0.9412,0.97255)(0.9451,0.97647)(0.949,0.97647)(0.9529,0.98039)(0.9569,0.98039)(0.9608,0.98431)(0.9647,0.98431)(0.9686,0.98824)(0.9725,0.98824)(0.9765,0.98824)(0.9804,0.99216)(0.9843,0.99216)(0.9882,0.99216)(0.9922,0.99608)(0.9961,0.99608)(1,1) BLUE: (0,0)(0.0039,0.0039216)(0.0078,0.011765)(0.0118,0.019608)(0.0157,0.027451)(0.0196,0.035294)(0.0235,0.043137)(0.0275,0.05098)(0.0314,0.058824)(0.0353,0.070588)(0.0392,0.078431)(0.0431,0.086275)(0.0471,0.098039)(0.051,0.10588)(0.0549,0.11373)(0.0588,0.12549)(0.0627,0.13333)(0.0667,0.1451)(0.0706,0.15294)(0.0745,0.16078)(0.0784,0.17255)(0.0824,0.18039)(0.0863,0.19216)(0.0902,0.2)(0.0941,0.20784)(0.098,0.21569)(0.102,0.22745)(0.1059,0.23529)(0.1098,0.24314)(0.1137,0.25098)(0.1176,0.25882)(0.1216,0.26667)(0.1255,0.27451)(0.1294,0.28235)(0.1333,0.28627)(0.1373,0.29412)(0.1412,0.29804)(0.1451,0.30588)(0.149,0.3098)(0.1529,0.31765)(0.1569,0.32157)(0.1608,0.32549)(0.1647,0.32941)(0.1686,0.33333)(0.1725,0.33725)(0.1765,0.33725)(0.1804,0.34118)(0.1843,0.34118)(0.1882,0.3451)(0.1922,0.3451)(0.1961,0.3451)(0.2,0.3451)(0.2039,0.3451)(0.2078,0.3451)(0.2118,0.3451)(0.2157,0.34118)(0.2196,0.34118)(0.2235,0.33725)(0.2275,0.33725)(0.2314,0.33333)(0.2353,0.32941)(0.2392,0.32549)(0.2431,0.32157)(0.2471,0.31765)(0.251,0.31373)(0.2549,0.3098)(0.2588,0.30588)(0.2627,0.29804)(0.2667,0.29412)(0.2706,0.28627)(0.2745,0.28235)(0.2784,0.27451)(0.2824,0.26667)(0.2863,0.26275)(0.2902,0.2549)(0.2941,0.24706)(0.298,0.24314)(0.302,0.23529)(0.3059,0.22745)(0.3098,0.21961)(0.3137,0.21176)(0.3176,0.20392)(0.3216,0.2)(0.3255,0.19216)(0.3294,0.18431)(0.3333,0.17647)(0.3373,0.17255)(0.3412,0.16471)(0.3451,0.15686)(0.349,0.15294)(0.3529,0.1451)(0.3569,0.14118)(0.3608,0.13333)(0.3647,0.12941)(0.3686,0.12549)(0.3725,0.11765)(0.3765,0.11373)(0.3804,0.1098)(0.3843,0.10588)(0.3882,0.10196)(0.3922,0.10196)(0.3961,0.098039)(0.4,0.094118)(0.4039,0.094118)(0.4078,0.090196)(0.4118,0.090196)(0.4157,0.090196)(0.4196,0.090196)(0.4235,0.090196)(0.4275,0.090196)(0.4314,0.094118)(0.4353,0.094118)(0.4392,0.098039)(0.4431,0.10196)(0.4471,0.10196)(0.451,0.10588)(0.4549,0.11373)(0.4588,0.11765)(0.4627,0.12157)(0.4667,0.12941)(0.4706,0.13333)(0.4745,0.14118)(0.4784,0.14902)(0.4824,0.15686)(0.4863,0.16471)(0.4902,0.17647)(0.4941,0.18431)(0.498,0.19216)(0.502,0.20392)(0.5059,0.21569)(0.5098,0.22745)(0.5137,0.23922)(0.5176,0.25098)(0.5216,0.26275)(0.5255,0.27451)(0.5294,0.28627)(0.5333,0.30196)(0.5373,0.31373)(0.5412,0.32941)(0.5451,0.3451)(0.549,0.35686)(0.5529,0.37255)(0.5569,0.38824)(0.5608,0.40392)(0.5647,0.41961)(0.5686,0.43529)(0.5725,0.45098)(0.5765,0.46667)(0.5804,0.48235)(0.5843,0.49804)(0.5882,0.51373)(0.5922,0.52941)(0.5961,0.54902)(0.6,0.56471)(0.6039,0.58039)(0.6078,0.59608)(0.6118,0.61176)(0.6157,0.62745)(0.6196,0.64314)(0.6235,0.65882)(0.6275,0.67451)(0.6314,0.6902)(0.6353,0.70588)(0.6392,0.72157)(0.6431,0.73725)(0.6471,0.74902)(0.651,0.76471)(0.6549,0.77647)(0.6588,0.79216)(0.6627,0.80392)(0.6667,0.81961)(0.6706,0.83137)(0.6745,0.84314)(0.6784,0.8549)(0.6824,0.86667)(0.6863,0.87843)(0.6902,0.8902)(0.6941,0.89804)(0.698,0.9098)(0.702,0.91765)(0.7059,0.92549)(0.7098,0.93725)(0.7137,0.9451)(0.7176,0.95294)(0.7216,0.96078)(0.7255,0.96471)(0.7294,0.97255)(0.7333,0.97647)(0.7373,0.98431)(0.7412,0.98824)(0.7451,0.99216)(0.749,0.99608)(0.7529,1)(0.7569,1)(0.7608,1)(0.7647,1)(0.7686,1)(0.7725,1)(0.7765,1)(0.7804,1)(0.7843,1)(0.7882,1)(0.7922,1)(0.7961,1)(0.8,1)(0.8039,1)(0.8078,1)(0.8118,1)(0.8157,1)(0.8196,1)(0.8235,1)(0.8275,1)(0.8314,1)(0.8353,0.99608)(0.8392,0.99216)(0.8431,0.99216)(0.8471,0.98824)(0.851,0.98431)(0.8549,0.98039)(0.8588,0.97647)(0.8627,0.97647)(0.8667,0.97255)(0.8706,0.96863)(0.8745,0.96471)(0.8784,0.96078)(0.8824,0.96078)(0.8863,0.95686)(0.8902,0.95294)(0.8941,0.95294)(0.898,0.94902)(0.902,0.94902)(0.9059,0.9451)(0.9098,0.9451)(0.9137,0.94118)(0.9176,0.94118)(0.9216,0.94118)(0.9255,0.94118)(0.9294,0.94118)(0.9333,0.94118)(0.9373,0.94118)(0.9412,0.94118)(0.9451,0.94118)(0.949,0.9451)(0.9529,0.9451)(0.9569,0.94902)(0.9608,0.94902)(0.9647,0.95294)(0.9686,0.95686)(0.9725,0.96078)(0.9765,0.96471)(0.9804,0.96863)(0.9843,0.97647)(0.9882,0.98039)(0.9922,0.98431)(0.9961,0.99216)(1,1) ���������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/ch05p151010.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027734 12567376460 016316� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch05p151010 # created by cptutils 1.46 # Wed Aug 15 23:30:54 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0.0039216)(0.0078,0.011765)(0.0118,0.019608)(0.0157,0.027451)(0.0196,0.035294)(0.0235,0.039216)(0.0275,0.047059)(0.0314,0.054902)(0.0353,0.062745)(0.0392,0.070588)(0.0431,0.078431)(0.0471,0.086275)(0.051,0.090196)(0.0549,0.098039)(0.0588,0.10588)(0.0627,0.11373)(0.0667,0.12157)(0.0706,0.12549)(0.0745,0.13333)(0.0784,0.14118)(0.0824,0.1451)(0.0863,0.15294)(0.0902,0.16078)(0.0941,0.16471)(0.098,0.17255)(0.102,0.17647)(0.1059,0.18039)(0.1098,0.18824)(0.1137,0.19216)(0.1176,0.19608)(0.1216,0.2)(0.1255,0.20392)(0.1294,0.21176)(0.1333,0.21176)(0.1373,0.21569)(0.1412,0.21961)(0.1451,0.22353)(0.149,0.22745)(0.1529,0.22745)(0.1569,0.23137)(0.1608,0.23137)(0.1647,0.23529)(0.1686,0.23529)(0.1725,0.23922)(0.1765,0.23922)(0.1804,0.23922)(0.1843,0.23922)(0.1882,0.23922)(0.1922,0.23922)(0.1961,0.23922)(0.2,0.23922)(0.2039,0.23922)(0.2078,0.23922)(0.2118,0.23529)(0.2157,0.23529)(0.2196,0.23529)(0.2235,0.23137)(0.2275,0.23137)(0.2314,0.22745)(0.2353,0.22745)(0.2392,0.22353)(0.2431,0.22353)(0.2471,0.21961)(0.251,0.21569)(0.2549,0.21569)(0.2588,0.21176)(0.2627,0.20784)(0.2667,0.20784)(0.2706,0.20392)(0.2745,0.2)(0.2784,0.2)(0.2824,0.19608)(0.2863,0.19216)(0.2902,0.19216)(0.2941,0.18824)(0.298,0.18431)(0.302,0.18431)(0.3059,0.18039)(0.3098,0.18039)(0.3137,0.17647)(0.3176,0.17255)(0.3216,0.17255)(0.3255,0.17255)(0.3294,0.16863)(0.3333,0.16863)(0.3373,0.16863)(0.3412,0.16471)(0.3451,0.16471)(0.349,0.16471)(0.3529,0.16471)(0.3569,0.16471)(0.3608,0.16471)(0.3647,0.16471)(0.3686,0.16471)(0.3725,0.16863)(0.3765,0.16863)(0.3804,0.16863)(0.3843,0.17255)(0.3882,0.17647)(0.3922,0.17647)(0.3961,0.18039)(0.4,0.18431)(0.4039,0.18824)(0.4078,0.19216)(0.4118,0.19608)(0.4157,0.2)(0.4196,0.20392)(0.4235,0.20784)(0.4275,0.21569)(0.4314,0.21961)(0.4353,0.22745)(0.4392,0.23529)(0.4431,0.23922)(0.4471,0.24706)(0.451,0.2549)(0.4549,0.26275)(0.4588,0.27059)(0.4627,0.27843)(0.4667,0.28627)(0.4706,0.29804)(0.4745,0.30588)(0.4784,0.31373)(0.4824,0.32549)(0.4863,0.33333)(0.4902,0.3451)(0.4941,0.35294)(0.498,0.36471)(0.502,0.37647)(0.5059,0.38824)(0.5098,0.39608)(0.5137,0.40784)(0.5176,0.41961)(0.5216,0.43137)(0.5255,0.44314)(0.5294,0.4549)(0.5333,0.46667)(0.5373,0.47843)(0.5412,0.4902)(0.5451,0.50196)(0.549,0.51373)(0.5529,0.52549)(0.5569,0.54118)(0.5608,0.55294)(0.5647,0.56471)(0.5686,0.57647)(0.5725,0.58824)(0.5765,0.6)(0.5804,0.61176)(0.5843,0.62353)(0.5882,0.63529)(0.5922,0.64706)(0.5961,0.65882)(0.6,0.67059)(0.6039,0.67843)(0.6078,0.6902)(0.6118,0.70196)(0.6157,0.71373)(0.6196,0.72157)(0.6235,0.73333)(0.6275,0.74118)(0.6314,0.75294)(0.6353,0.76078)(0.6392,0.77255)(0.6431,0.78039)(0.6471,0.78824)(0.651,0.79608)(0.6549,0.80392)(0.6588,0.81176)(0.6627,0.81961)(0.6667,0.82745)(0.6706,0.83529)(0.6745,0.84314)(0.6784,0.84706)(0.6824,0.8549)(0.6863,0.85882)(0.6902,0.86667)(0.6941,0.87059)(0.698,0.87451)(0.702,0.87843)(0.7059,0.88627)(0.7098,0.8902)(0.7137,0.8902)(0.7176,0.89412)(0.7216,0.89804)(0.7255,0.90196)(0.7294,0.90588)(0.7333,0.90588)(0.7373,0.9098)(0.7412,0.9098)(0.7451,0.9098)(0.749,0.91373)(0.7529,0.91373)(0.7569,0.91373)(0.7608,0.91373)(0.7647,0.91373)(0.7686,0.91765)(0.7725,0.91765)(0.7765,0.91765)(0.7804,0.91373)(0.7843,0.91373)(0.7882,0.91373)(0.7922,0.91373)(0.7961,0.91373)(0.8,0.91373)(0.8039,0.9098)(0.8078,0.9098)(0.8118,0.9098)(0.8157,0.90588)(0.8196,0.90588)(0.8235,0.90588)(0.8275,0.90588)(0.8314,0.90196)(0.8353,0.90196)(0.8392,0.90196)(0.8431,0.89804)(0.8471,0.89804)(0.851,0.89804)(0.8549,0.89804)(0.8588,0.89412)(0.8627,0.89412)(0.8667,0.89412)(0.8706,0.89412)(0.8745,0.89412)(0.8784,0.89412)(0.8824,0.89412)(0.8863,0.89412)(0.8902,0.89412)(0.8941,0.89412)(0.898,0.89412)(0.902,0.89804)(0.9059,0.89804)(0.9098,0.89804)(0.9137,0.90196)(0.9176,0.90196)(0.9216,0.90588)(0.9255,0.90588)(0.9294,0.9098)(0.9333,0.91373)(0.9373,0.91765)(0.9412,0.91765)(0.9451,0.92157)(0.949,0.92549)(0.9529,0.92941)(0.9569,0.93725)(0.9608,0.94118)(0.9647,0.9451)(0.9686,0.94902)(0.9725,0.95686)(0.9765,0.96078)(0.9804,0.96471)(0.9843,0.97255)(0.9882,0.98039)(0.9922,0.98431)(0.9961,0.99216)(1,1) GREEN: (0,0)(0.0039,0)(0.0078,0.0039216)(0.0118,0.0039216)(0.0157,0.0078431)(0.0196,0.0078431)(0.0235,0.011765)(0.0275,0.011765)(0.0314,0.015686)(0.0353,0.015686)(0.0392,0.019608)(0.0431,0.023529)(0.0471,0.023529)(0.051,0.027451)(0.0549,0.027451)(0.0588,0.031373)(0.0627,0.035294)(0.0667,0.039216)(0.0706,0.039216)(0.0745,0.043137)(0.0784,0.047059)(0.0824,0.05098)(0.0863,0.054902)(0.0902,0.054902)(0.0941,0.058824)(0.098,0.062745)(0.102,0.066667)(0.1059,0.070588)(0.1098,0.07451)(0.1137,0.082353)(0.1176,0.086275)(0.1216,0.090196)(0.1255,0.094118)(0.1294,0.098039)(0.1333,0.10196)(0.1373,0.1098)(0.1412,0.11373)(0.1451,0.11765)(0.149,0.12549)(0.1529,0.12941)(0.1569,0.13725)(0.1608,0.14118)(0.1647,0.14902)(0.1686,0.15294)(0.1725,0.16078)(0.1765,0.16471)(0.1804,0.17255)(0.1843,0.18039)(0.1882,0.18431)(0.1922,0.19216)(0.1961,0.2)(0.2,0.20392)(0.2039,0.21176)(0.2078,0.21961)(0.2118,0.22745)(0.2157,0.23529)(0.2196,0.23922)(0.2235,0.24706)(0.2275,0.2549)(0.2314,0.26275)(0.2353,0.27059)(0.2392,0.27843)(0.2431,0.28235)(0.2471,0.2902)(0.251,0.29804)(0.2549,0.30588)(0.2588,0.31373)(0.2627,0.32157)(0.2667,0.32549)(0.2706,0.33333)(0.2745,0.34118)(0.2784,0.34902)(0.2824,0.35294)(0.2863,0.36078)(0.2902,0.36863)(0.2941,0.37647)(0.298,0.38039)(0.302,0.38824)(0.3059,0.39216)(0.3098,0.4)(0.3137,0.40784)(0.3176,0.41176)(0.3216,0.41961)(0.3255,0.42353)(0.3294,0.43137)(0.3333,0.43529)(0.3373,0.43922)(0.3412,0.44706)(0.3451,0.45098)(0.349,0.4549)(0.3529,0.45882)(0.3569,0.46275)(0.3608,0.46667)(0.3647,0.47451)(0.3686,0.47843)(0.3725,0.48235)(0.3765,0.48235)(0.3804,0.48627)(0.3843,0.4902)(0.3882,0.49412)(0.3922,0.49804)(0.3961,0.49804)(0.4,0.50196)(0.4039,0.50588)(0.4078,0.50588)(0.4118,0.5098)(0.4157,0.5098)(0.4196,0.51373)(0.4235,0.51373)(0.4275,0.51765)(0.4314,0.51765)(0.4353,0.51765)(0.4392,0.52157)(0.4431,0.52157)(0.4471,0.52157)(0.451,0.52157)(0.4549,0.52157)(0.4588,0.52549)(0.4627,0.52549)(0.4667,0.52549)(0.4706,0.52549)(0.4745,0.52549)(0.4784,0.52549)(0.4824,0.52549)(0.4863,0.52549)(0.4902,0.52549)(0.4941,0.52549)(0.498,0.52157)(0.502,0.52157)(0.5059,0.52157)(0.5098,0.52157)(0.5137,0.52157)(0.5176,0.52157)(0.5216,0.52157)(0.5255,0.52157)(0.5294,0.52157)(0.5333,0.51765)(0.5373,0.51765)(0.5412,0.51765)(0.5451,0.51765)(0.549,0.51765)(0.5529,0.51765)(0.5569,0.51765)(0.5608,0.51765)(0.5647,0.51765)(0.5686,0.51765)(0.5725,0.51765)(0.5765,0.51765)(0.5804,0.51765)(0.5843,0.51765)(0.5882,0.51765)(0.5922,0.52157)(0.5961,0.52157)(0.6,0.52157)(0.6039,0.52157)(0.6078,0.52549)(0.6118,0.52549)(0.6157,0.52549)(0.6196,0.52941)(0.6235,0.52941)(0.6275,0.53333)(0.6314,0.53333)(0.6353,0.53725)(0.6392,0.54118)(0.6431,0.54118)(0.6471,0.5451)(0.651,0.54902)(0.6549,0.54902)(0.6588,0.55294)(0.6627,0.55686)(0.6667,0.56078)(0.6706,0.56471)(0.6745,0.56863)(0.6784,0.57255)(0.6824,0.57647)(0.6863,0.58039)(0.6902,0.58824)(0.6941,0.59216)(0.698,0.59608)(0.702,0.6)(0.7059,0.60784)(0.7098,0.61176)(0.7137,0.61569)(0.7176,0.62353)(0.7216,0.62745)(0.7255,0.63529)(0.7294,0.63922)(0.7333,0.64706)(0.7373,0.65098)(0.7412,0.65882)(0.7451,0.66667)(0.749,0.67059)(0.7529,0.67843)(0.7569,0.68627)(0.7608,0.6902)(0.7647,0.69804)(0.7686,0.70588)(0.7725,0.7098)(0.7765,0.71765)(0.7804,0.72549)(0.7843,0.73333)(0.7882,0.73725)(0.7922,0.7451)(0.7961,0.75294)(0.8,0.76078)(0.8039,0.76863)(0.8078,0.77255)(0.8118,0.78039)(0.8157,0.78824)(0.8196,0.79216)(0.8235,0.8)(0.8275,0.80784)(0.8314,0.81569)(0.8353,0.81961)(0.8392,0.82745)(0.8431,0.83529)(0.8471,0.83922)(0.851,0.84706)(0.8549,0.85098)(0.8588,0.85882)(0.8627,0.86275)(0.8667,0.87059)(0.8706,0.87451)(0.8745,0.88235)(0.8784,0.88627)(0.8824,0.89412)(0.8863,0.89804)(0.8902,0.90196)(0.8941,0.9098)(0.898,0.91373)(0.902,0.91765)(0.9059,0.92157)(0.9098,0.92549)(0.9137,0.92941)(0.9176,0.93725)(0.9216,0.94118)(0.9255,0.9451)(0.9294,0.94902)(0.9333,0.95294)(0.9373,0.95294)(0.9412,0.95686)(0.9451,0.96078)(0.949,0.96471)(0.9529,0.96863)(0.9569,0.97255)(0.9608,0.97255)(0.9647,0.97647)(0.9686,0.98039)(0.9725,0.98039)(0.9765,0.98431)(0.9804,0.98824)(0.9843,0.98824)(0.9882,0.99216)(0.9922,0.99216)(0.9961,0.99608)(1,1) BLUE: (0,0)(0.0039,0.0039216)(0.0078,0.0078431)(0.0118,0.015686)(0.0157,0.019608)(0.0196,0.023529)(0.0235,0.027451)(0.0275,0.031373)(0.0314,0.035294)(0.0353,0.039216)(0.0392,0.043137)(0.0431,0.047059)(0.0471,0.047059)(0.051,0.05098)(0.0549,0.054902)(0.0588,0.054902)(0.0627,0.054902)(0.0667,0.058824)(0.0706,0.058824)(0.0745,0.058824)(0.0784,0.062745)(0.0824,0.062745)(0.0863,0.062745)(0.0902,0.062745)(0.0941,0.062745)(0.098,0.062745)(0.102,0.062745)(0.1059,0.062745)(0.1098,0.058824)(0.1137,0.058824)(0.1176,0.058824)(0.1216,0.058824)(0.1255,0.058824)(0.1294,0.054902)(0.1333,0.054902)(0.1373,0.054902)(0.1412,0.05098)(0.1451,0.05098)(0.149,0.05098)(0.1529,0.05098)(0.1569,0.047059)(0.1608,0.047059)(0.1647,0.047059)(0.1686,0.047059)(0.1725,0.043137)(0.1765,0.043137)(0.1804,0.043137)(0.1843,0.043137)(0.1882,0.043137)(0.1922,0.043137)(0.1961,0.043137)(0.2,0.043137)(0.2039,0.043137)(0.2078,0.043137)(0.2118,0.047059)(0.2157,0.047059)(0.2196,0.047059)(0.2235,0.05098)(0.2275,0.05098)(0.2314,0.054902)(0.2353,0.058824)(0.2392,0.058824)(0.2431,0.062745)(0.2471,0.066667)(0.251,0.070588)(0.2549,0.07451)(0.2588,0.078431)(0.2627,0.082353)(0.2667,0.090196)(0.2706,0.094118)(0.2745,0.098039)(0.2784,0.10588)(0.2824,0.1098)(0.2863,0.11765)(0.2902,0.12549)(0.2941,0.13333)(0.298,0.14118)(0.302,0.14902)(0.3059,0.15686)(0.3098,0.16471)(0.3137,0.17255)(0.3176,0.18431)(0.3216,0.19216)(0.3255,0.2)(0.3294,0.21176)(0.3333,0.22353)(0.3373,0.23137)(0.3412,0.24314)(0.3451,0.2549)(0.349,0.26667)(0.3529,0.27451)(0.3569,0.28627)(0.3608,0.29804)(0.3647,0.3098)(0.3686,0.32157)(0.3725,0.33333)(0.3765,0.34902)(0.3804,0.36078)(0.3843,0.37255)(0.3882,0.38431)(0.3922,0.39608)(0.3961,0.41176)(0.4,0.42353)(0.4039,0.43529)(0.4078,0.44706)(0.4118,0.46275)(0.4157,0.47451)(0.4196,0.48627)(0.4235,0.49804)(0.4275,0.5098)(0.4314,0.52549)(0.4353,0.53725)(0.4392,0.54902)(0.4431,0.56078)(0.4471,0.57255)(0.451,0.58431)(0.4549,0.59608)(0.4588,0.60784)(0.4627,0.61961)(0.4667,0.62745)(0.4706,0.63922)(0.4745,0.65098)(0.4784,0.65882)(0.4824,0.67059)(0.4863,0.67843)(0.4902,0.6902)(0.4941,0.69804)(0.498,0.70588)(0.502,0.71765)(0.5059,0.72549)(0.5098,0.73333)(0.5137,0.74118)(0.5176,0.7451)(0.5216,0.75294)(0.5255,0.76078)(0.5294,0.76471)(0.5333,0.77255)(0.5373,0.77647)(0.5412,0.78039)(0.5451,0.78824)(0.549,0.79216)(0.5529,0.79608)(0.5569,0.8)(0.5608,0.8)(0.5647,0.80392)(0.5686,0.80784)(0.5725,0.80784)(0.5765,0.81176)(0.5804,0.81176)(0.5843,0.81176)(0.5882,0.81569)(0.5922,0.81569)(0.5961,0.81569)(0.6,0.81569)(0.6039,0.81569)(0.6078,0.81176)(0.6118,0.81176)(0.6157,0.81176)(0.6196,0.80784)(0.6235,0.80784)(0.6275,0.80392)(0.6314,0.80392)(0.6353,0.8)(0.6392,0.79608)(0.6431,0.79608)(0.6471,0.79216)(0.651,0.78824)(0.6549,0.78431)(0.6588,0.78039)(0.6627,0.77647)(0.6667,0.77255)(0.6706,0.76863)(0.6745,0.76863)(0.6784,0.76471)(0.6824,0.76078)(0.6863,0.75686)(0.6902,0.74902)(0.6941,0.7451)(0.698,0.74118)(0.702,0.73725)(0.7059,0.73725)(0.7098,0.73333)(0.7137,0.72941)(0.7176,0.72549)(0.7216,0.72157)(0.7255,0.71765)(0.7294,0.71373)(0.7333,0.7098)(0.7373,0.7098)(0.7412,0.70588)(0.7451,0.70196)(0.749,0.70196)(0.7529,0.69804)(0.7569,0.69804)(0.7608,0.69412)(0.7647,0.69412)(0.7686,0.69412)(0.7725,0.6902)(0.7765,0.6902)(0.7804,0.6902)(0.7843,0.6902)(0.7882,0.6902)(0.7922,0.6902)(0.7961,0.6902)(0.8,0.69412)(0.8039,0.69412)(0.8078,0.69412)(0.8118,0.69804)(0.8157,0.69804)(0.8196,0.70196)(0.8235,0.70588)(0.8275,0.70588)(0.8314,0.7098)(0.8353,0.71373)(0.8392,0.71765)(0.8431,0.72157)(0.8471,0.72549)(0.851,0.73333)(0.8549,0.73725)(0.8588,0.74118)(0.8627,0.74902)(0.8667,0.75294)(0.8706,0.76078)(0.8745,0.76471)(0.8784,0.77255)(0.8824,0.77647)(0.8863,0.78431)(0.8902,0.79216)(0.8941,0.8)(0.898,0.80784)(0.902,0.81176)(0.9059,0.81961)(0.9098,0.82745)(0.9137,0.83529)(0.9176,0.84314)(0.9216,0.85098)(0.9255,0.85882)(0.9294,0.86667)(0.9333,0.87451)(0.9373,0.88235)(0.9412,0.8902)(0.9451,0.89804)(0.949,0.90588)(0.9529,0.91373)(0.9569,0.92157)(0.9608,0.92941)(0.9647,0.93725)(0.9686,0.9451)(0.9725,0.95294)(0.9765,0.96078)(0.9804,0.96471)(0.9843,0.97255)(0.9882,0.98039)(0.9922,0.98431)(0.9961,0.99216)(1,1) ������������������������������������saods9/ds9/cmaps/ch20m151010.sao��������������������������������������������������������������������000644 �000765 �000000 �00000027710 12567376460 016302� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ch20m151010 # created by cptutils 1.46 # Wed Aug 15 23:30:53 2012 PSEUDOCOLOR RED: (0,0)(0.0039,0)(0.0078,0)(0.0118,0.0039216)(0.0157,0.0039216)(0.0196,0.0039216)(0.0235,0.0078431)(0.0275,0.011765)(0.0314,0.011765)(0.0353,0.015686)(0.0392,0.019608)(0.0431,0.023529)(0.0471,0.023529)(0.051,0.027451)(0.0549,0.031373)(0.0588,0.035294)(0.0627,0.043137)(0.0667,0.047059)(0.0706,0.05098)(0.0745,0.054902)(0.0784,0.062745)(0.0824,0.066667)(0.0863,0.07451)(0.0902,0.078431)(0.0941,0.086275)(0.098,0.094118)(0.102,0.098039)(0.1059,0.10588)(0.1098,0.11373)(0.1137,0.12157)(0.1176,0.12941)(0.1216,0.13725)(0.1255,0.1451)(0.1294,0.15294)(0.1333,0.16078)(0.1373,0.16863)(0.1412,0.17647)(0.1451,0.18824)(0.149,0.19608)(0.1529,0.20392)(0.1569,0.21176)(0.1608,0.22353)(0.1647,0.23137)(0.1686,0.23922)(0.1725,0.25098)(0.1765,0.25882)(0.1804,0.26667)(0.1843,0.27451)(0.1882,0.28627)(0.1922,0.29412)(0.1961,0.30196)(0.2,0.31373)(0.2039,0.32157)(0.2078,0.32941)(0.2118,0.33725)(0.2157,0.3451)(0.2196,0.35294)(0.2235,0.36471)(0.2275,0.37255)(0.2314,0.38039)(0.2353,0.38431)(0.2392,0.39216)(0.2431,0.4)(0.2471,0.40784)(0.251,0.41569)(0.2549,0.41961)(0.2588,0.42745)(0.2627,0.43529)(0.2667,0.43922)(0.2706,0.44706)(0.2745,0.45098)(0.2784,0.4549)(0.2824,0.45882)(0.2863,0.46275)(0.2902,0.47059)(0.2941,0.47451)(0.298,0.47451)(0.302,0.47843)(0.3059,0.48235)(0.3098,0.48627)(0.3137,0.48627)(0.3176,0.4902)(0.3216,0.4902)(0.3255,0.49412)(0.3294,0.49412)(0.3333,0.49412)(0.3373,0.49412)(0.3412,0.49412)(0.3451,0.49412)(0.349,0.49412)(0.3529,0.49412)(0.3569,0.49412)(0.3608,0.49412)(0.3647,0.4902)(0.3686,0.4902)(0.3725,0.48627)(0.3765,0.48627)(0.3804,0.48235)(0.3843,0.48235)(0.3882,0.47843)(0.3922,0.47451)(0.3961,0.47059)(0.4,0.47059)(0.4039,0.46667)(0.4078,0.46275)(0.4118,0.45882)(0.4157,0.4549)(0.4196,0.45098)(0.4235,0.44706)(0.4275,0.44314)(0.4314,0.43922)(0.4353,0.43529)(0.4392,0.43137)(0.4431,0.42745)(0.4471,0.41961)(0.451,0.41569)(0.4549,0.41176)(0.4588,0.40784)(0.4627,0.40392)(0.4667,0.4)(0.4706,0.39608)(0.4745,0.39216)(0.4784,0.38824)(0.4824,0.38431)(0.4863,0.38039)(0.4902,0.37647)(0.4941,0.37647)(0.498,0.37255)(0.502,0.36863)(0.5059,0.36471)(0.5098,0.36471)(0.5137,0.36078)(0.5176,0.36078)(0.5216,0.35686)(0.5255,0.35686)(0.5294,0.35686)(0.5333,0.35294)(0.5373,0.35294)(0.5412,0.35294)(0.5451,0.35294)(0.549,0.35294)(0.5529,0.35294)(0.5569,0.35294)(0.5608,0.35686)(0.5647,0.35686)(0.5686,0.35686)(0.5725,0.36078)(0.5765,0.36078)(0.5804,0.36471)(0.5843,0.36863)(0.5882,0.37255)(0.5922,0.37647)(0.5961,0.38039)(0.6,0.38431)(0.6039,0.38824)(0.6078,0.39216)(0.6118,0.4)(0.6157,0.40392)(0.6196,0.40784)(0.6235,0.41569)(0.6275,0.42353)(0.6314,0.42745)(0.6353,0.43529)(0.6392,0.44314)(0.6431,0.45098)(0.6471,0.45882)(0.651,0.46667)(0.6549,0.47451)(0.6588,0.48235)(0.6627,0.49412)(0.6667,0.50196)(0.6706,0.5098)(0.6745,0.52157)(0.6784,0.52941)(0.6824,0.53725)(0.6863,0.54902)(0.6902,0.56078)(0.6941,0.56863)(0.698,0.58039)(0.702,0.58824)(0.7059,0.6)(0.7098,0.61176)(0.7137,0.61961)(0.7176,0.63137)(0.7216,0.64314)(0.7255,0.65098)(0.7294,0.66275)(0.7333,0.67451)(0.7373,0.68235)(0.7412,0.69412)(0.7451,0.70588)(0.749,0.71373)(0.7529,0.72549)(0.7569,0.73725)(0.7608,0.7451)(0.7647,0.75686)(0.7686,0.76471)(0.7725,0.77647)(0.7765,0.78431)(0.7804,0.79608)(0.7843,0.80392)(0.7882,0.81176)(0.7922,0.82353)(0.7961,0.83137)(0.8,0.83922)(0.8039,0.84706)(0.8078,0.8549)(0.8118,0.86275)(0.8157,0.87059)(0.8196,0.87843)(0.8235,0.88627)(0.8275,0.89412)(0.8314,0.89804)(0.8353,0.90588)(0.8392,0.9098)(0.8431,0.91765)(0.8471,0.92157)(0.851,0.92941)(0.8549,0.93333)(0.8588,0.93725)(0.8627,0.94118)(0.8667,0.9451)(0.8706,0.95294)(0.8745,0.95294)(0.8784,0.95686)(0.8824,0.96078)(0.8863,0.96471)(0.8902,0.96863)(0.8941,0.96863)(0.898,0.97255)(0.902,0.97647)(0.9059,0.97647)(0.9098,0.98039)(0.9137,0.98039)(0.9176,0.98039)(0.9216,0.98431)(0.9255,0.98431)(0.9294,0.98431)(0.9333,0.98824)(0.9373,0.98824)(0.9412,0.98824)(0.9451,0.98824)(0.949,0.98824)(0.9529,0.99216)(0.9569,0.99216)(0.9608,0.99216)(0.9647,0.99216)(0.9686,0.99216)(0.9725,0.99216)(0.9765,0.99216)(0.9804,0.99608)(0.9843,0.99608)(0.9882,0.99608)(0.9922,0.99608)(0.9961,0.99608)(1,1) GREEN: (0,0)(0.0039,0.0039216)(0.0078,0.0078431)(0.0118,0.015686)(0.0157,0.019608)(0.0196,0.027451)(0.0235,0.031373)(0.0275,0.035294)(0.0314,0.043137)(0.0353,0.047059)(0.0392,0.05098)(0.0431,0.058824)(0.0471,0.062745)(0.051,0.066667)(0.0549,0.070588)(0.0588,0.07451)(0.0627,0.078431)(0.0667,0.086275)(0.0706,0.090196)(0.0745,0.094118)(0.0784,0.098039)(0.0824,0.10196)(0.0863,0.10196)(0.0902,0.10588)(0.0941,0.1098)(0.098,0.11373)(0.102,0.11765)(0.1059,0.12157)(0.1098,0.12157)(0.1137,0.12549)(0.1176,0.12941)(0.1216,0.12941)(0.1255,0.13333)(0.1294,0.13333)(0.1333,0.13725)(0.1373,0.13725)(0.1412,0.14118)(0.1451,0.14118)(0.149,0.1451)(0.1529,0.1451)(0.1569,0.14902)(0.1608,0.14902)(0.1647,0.14902)(0.1686,0.15294)(0.1725,0.15294)(0.1765,0.15294)(0.1804,0.15294)(0.1843,0.15686)(0.1882,0.15686)(0.1922,0.15686)(0.1961,0.16078)(0.2,0.16078)(0.2039,0.16078)(0.2078,0.16078)(0.2118,0.16078)(0.2157,0.16471)(0.2196,0.16471)(0.2235,0.16471)(0.2275,0.16471)(0.2314,0.16863)(0.2353,0.16863)(0.2392,0.16863)(0.2431,0.17255)(0.2471,0.17255)(0.251,0.17255)(0.2549,0.17647)(0.2588,0.17647)(0.2627,0.17647)(0.2667,0.18039)(0.2706,0.18039)(0.2745,0.18431)(0.2784,0.18431)(0.2824,0.18824)(0.2863,0.18824)(0.2902,0.19216)(0.2941,0.19608)(0.298,0.19608)(0.302,0.2)(0.3059,0.20392)(0.3098,0.20784)(0.3137,0.20784)(0.3176,0.21176)(0.3216,0.21569)(0.3255,0.21961)(0.3294,0.22353)(0.3333,0.22745)(0.3373,0.23137)(0.3412,0.23529)(0.3451,0.23922)(0.349,0.24706)(0.3529,0.25098)(0.3569,0.2549)(0.3608,0.26275)(0.3647,0.26667)(0.3686,0.27059)(0.3725,0.27843)(0.3765,0.28235)(0.3804,0.2902)(0.3843,0.29412)(0.3882,0.30196)(0.3922,0.3098)(0.3961,0.31373)(0.4,0.32157)(0.4039,0.32941)(0.4078,0.33725)(0.4118,0.34118)(0.4157,0.34902)(0.4196,0.35686)(0.4235,0.36471)(0.4275,0.37255)(0.4314,0.38039)(0.4353,0.38824)(0.4392,0.39608)(0.4431,0.40392)(0.4471,0.41176)(0.451,0.41961)(0.4549,0.42745)(0.4588,0.43529)(0.4627,0.44314)(0.4667,0.45098)(0.4706,0.46275)(0.4745,0.47059)(0.4784,0.47843)(0.4824,0.48627)(0.4863,0.49412)(0.4902,0.50196)(0.4941,0.5098)(0.498,0.51765)(0.502,0.52549)(0.5059,0.53725)(0.5098,0.5451)(0.5137,0.55294)(0.5176,0.56078)(0.5216,0.56863)(0.5255,0.57647)(0.5294,0.58431)(0.5333,0.59216)(0.5373,0.6)(0.5412,0.60784)(0.5451,0.61176)(0.549,0.61961)(0.5529,0.62745)(0.5569,0.63529)(0.5608,0.64314)(0.5647,0.64706)(0.5686,0.6549)(0.5725,0.66275)(0.5765,0.66667)(0.5804,0.67451)(0.5843,0.67843)(0.5882,0.68627)(0.5922,0.6902)(0.5961,0.69804)(0.6,0.70196)(0.6039,0.70588)(0.6078,0.71373)(0.6118,0.71765)(0.6157,0.72157)(0.6196,0.72549)(0.6235,0.72941)(0.6275,0.73725)(0.6314,0.74118)(0.6353,0.7451)(0.6392,0.7451)(0.6431,0.74902)(0.6471,0.75294)(0.651,0.75686)(0.6549,0.76078)(0.6588,0.76471)(0.6627,0.76471)(0.6667,0.76863)(0.6706,0.77255)(0.6745,0.77255)(0.6784,0.77647)(0.6824,0.77647)(0.6863,0.78039)(0.6902,0.78039)(0.6941,0.78039)(0.698,0.78431)(0.702,0.78431)(0.7059,0.78824)(0.7098,0.78824)(0.7137,0.78824)(0.7176,0.78824)(0.7216,0.79216)(0.7255,0.79216)(0.7294,0.79216)(0.7333,0.79216)(0.7373,0.79608)(0.7412,0.79608)(0.7451,0.79608)(0.749,0.79608)(0.7529,0.79608)(0.7569,0.79608)(0.7608,0.8)(0.7647,0.8)(0.7686,0.8)(0.7725,0.8)(0.7765,0.8)(0.7804,0.8)(0.7843,0.80392)(0.7882,0.80392)(0.7922,0.80392)(0.7961,0.80392)(0.8,0.80392)(0.8039,0.80784)(0.8078,0.80784)(0.8118,0.80784)(0.8157,0.81176)(0.8196,0.81176)(0.8235,0.81176)(0.8275,0.81569)(0.8314,0.81569)(0.8353,0.81961)(0.8392,0.81961)(0.8431,0.82353)(0.8471,0.82353)(0.851,0.82745)(0.8549,0.82745)(0.8588,0.83137)(0.8627,0.83529)(0.8667,0.83529)(0.8706,0.83922)(0.8745,0.84314)(0.8784,0.84706)(0.8824,0.85098)(0.8863,0.8549)(0.8902,0.8549)(0.8941,0.85882)(0.898,0.86275)(0.902,0.86667)(0.9059,0.87059)(0.9098,0.87451)(0.9137,0.88235)(0.9176,0.88627)(0.9216,0.8902)(0.9255,0.89412)(0.9294,0.89804)(0.9333,0.90588)(0.9373,0.9098)(0.9412,0.91373)(0.9451,0.91765)(0.949,0.92549)(0.9529,0.92941)(0.9569,0.93725)(0.9608,0.94118)(0.9647,0.9451)(0.9686,0.95294)(0.9725,0.95686)(0.9765,0.96471)(0.9804,0.96863)(0.9843,0.97647)(0.9882,0.98039)(0.9922,0.98824)(0.9961,0.99216)(1,1) BLUE: (0,0)(0.0039,0)(0.0078,0)(0.0118,0.0039216)(0.0157,0.0039216)(0.0196,0.0039216)(0.0235,0.0078431)(0.0275,0.0078431)(0.0314,0.0078431)(0.0353,0.0078431)(0.0392,0.0078431)(0.0431,0.0078431)(0.0471,0.0078431)(0.051,0.0078431)(0.0549,0.0078431)(0.0588,0.0078431)(0.0627,0.0078431)(0.0667,0.0078431)(0.0706,0.0078431)(0.0745,0.0078431)(0.0784,0.0078431)(0.0824,0.0078431)(0.0863,0.0078431)(0.0902,0.0078431)(0.0941,0.0078431)(0.098,0.0078431)(0.102,0.011765)(0.1059,0.011765)(0.1098,0.011765)(0.1137,0.011765)(0.1176,0.011765)(0.1216,0.015686)(0.1255,0.015686)(0.1294,0.019608)(0.1333,0.019608)(0.1373,0.023529)(0.1412,0.023529)(0.1451,0.027451)(0.149,0.031373)(0.1529,0.031373)(0.1569,0.035294)(0.1608,0.039216)(0.1647,0.043137)(0.1686,0.047059)(0.1725,0.05098)(0.1765,0.058824)(0.1804,0.062745)(0.1843,0.066667)(0.1882,0.07451)(0.1922,0.078431)(0.1961,0.086275)(0.2,0.094118)(0.2039,0.098039)(0.2078,0.10588)(0.2118,0.11373)(0.2157,0.12157)(0.2196,0.12941)(0.2235,0.13725)(0.2275,0.1451)(0.2314,0.15686)(0.2353,0.16471)(0.2392,0.17255)(0.2431,0.18431)(0.2471,0.19216)(0.251,0.20392)(0.2549,0.21176)(0.2588,0.22353)(0.2627,0.23529)(0.2667,0.24314)(0.2706,0.2549)(0.2745,0.26667)(0.2784,0.27843)(0.2824,0.2902)(0.2863,0.30196)(0.2902,0.31373)(0.2941,0.32549)(0.298,0.33333)(0.302,0.3451)(0.3059,0.35686)(0.3098,0.36863)(0.3137,0.38431)(0.3176,0.39608)(0.3216,0.40784)(0.3255,0.41961)(0.3294,0.42745)(0.3333,0.43922)(0.3373,0.45098)(0.3412,0.46275)(0.3451,0.47451)(0.349,0.48627)(0.3529,0.49804)(0.3569,0.5098)(0.3608,0.51765)(0.3647,0.52941)(0.3686,0.54118)(0.3725,0.54902)(0.3765,0.56078)(0.3804,0.56863)(0.3843,0.58039)(0.3882,0.58824)(0.3922,0.59608)(0.3961,0.60784)(0.4,0.61569)(0.4039,0.62353)(0.4078,0.63137)(0.4118,0.63922)(0.4157,0.64314)(0.4196,0.65098)(0.4235,0.65882)(0.4275,0.66275)(0.4314,0.67059)(0.4353,0.67451)(0.4392,0.67843)(0.4431,0.68627)(0.4471,0.6902)(0.451,0.69412)(0.4549,0.69804)(0.4588,0.69804)(0.4627,0.70196)(0.4667,0.70588)(0.4706,0.70588)(0.4745,0.7098)(0.4784,0.7098)(0.4824,0.7098)(0.4863,0.71373)(0.4902,0.71373)(0.4941,0.71373)(0.498,0.71373)(0.502,0.7098)(0.5059,0.7098)(0.5098,0.7098)(0.5137,0.70588)(0.5176,0.70588)(0.5216,0.70196)(0.5255,0.70196)(0.5294,0.69804)(0.5333,0.69412)(0.5373,0.69412)(0.5412,0.6902)(0.5451,0.68627)(0.549,0.68235)(0.5529,0.67843)(0.5569,0.67451)(0.5608,0.67059)(0.5647,0.66667)(0.5686,0.66275)(0.5725,0.6549)(0.5765,0.65098)(0.5804,0.64706)(0.5843,0.64314)(0.5882,0.63922)(0.5922,0.63137)(0.5961,0.62745)(0.6,0.62353)(0.6039,0.61961)(0.6078,0.61176)(0.6118,0.60784)(0.6157,0.60392)(0.6196,0.6)(0.6235,0.59608)(0.6275,0.58824)(0.6314,0.58431)(0.6353,0.58039)(0.6392,0.57647)(0.6431,0.57255)(0.6471,0.56863)(0.651,0.56863)(0.6549,0.56471)(0.6588,0.56078)(0.6627,0.55686)(0.6667,0.55686)(0.6706,0.55294)(0.6745,0.54902)(0.6784,0.54902)(0.6824,0.54902)(0.6863,0.5451)(0.6902,0.5451)(0.6941,0.5451)(0.698,0.5451)(0.702,0.5451)(0.7059,0.5451)(0.7098,0.5451)(0.7137,0.5451)(0.7176,0.5451)(0.7216,0.54902)(0.7255,0.54902)(0.7294,0.55294)(0.7333,0.55686)(0.7373,0.55686)(0.7412,0.56078)(0.7451,0.56471)(0.749,0.56863)(0.7529,0.57255)(0.7569,0.57647)(0.7608,0.58039)(0.7647,0.58824)(0.7686,0.59216)(0.7725,0.59608)(0.7765,0.60392)(0.7804,0.60784)(0.7843,0.61569)(0.7882,0.62353)(0.7922,0.62745)(0.7961,0.63529)(0.8,0.64314)(0.8039,0.65098)(0.8078,0.65882)(0.8118,0.66667)(0.8157,0.67451)(0.8196,0.68235)(0.8235,0.6902)(0.8275,0.69804)(0.8314,0.7098)(0.8353,0.71765)(0.8392,0.72549)(0.8431,0.73333)(0.8471,0.7451)(0.851,0.75294)(0.8549,0.76078)(0.8588,0.76863)(0.8627,0.78039)(0.8667,0.78824)(0.8706,0.79608)(0.8745,0.80784)(0.8784,0.81569)(0.8824,0.82353)(0.8863,0.83137)(0.8902,0.83922)(0.8941,0.85098)(0.898,0.85882)(0.902,0.86667)(0.9059,0.87451)(0.9098,0.88235)(0.9137,0.8902)(0.9176,0.89804)(0.9216,0.90588)(0.9255,0.9098)(0.9294,0.91765)(0.9333,0.92549)(0.9373,0.92941)(0.9412,0.93725)(0.9451,0.9451)(0.949,0.94902)(0.9529,0.95294)(0.9569,0.96078)(0.9608,0.96471)(0.9647,0.96863)(0.9686,0.97255)(0.9725,0.97647)(0.9765,0.98039)(0.9804,0.98431)(0.9843,0.98824)(0.9882,0.99216)(0.9922,0.99216)(0.9961,0.99608)(1,1) ��������������������������������������������������������saods9/ds9/cmaps/cubehelix0.sao���������������������������������������������������������������������000644 �000765 �000000 �00000010265 11742074507 016735� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#----------------------------------------- #cubehelixcolourschemeforsaoimage/DS9 # #start....:0.5 #rotations:-1.5 #hue......:1.0 #gamma....:1.0 # #see:Green(2011),BASI,39,289. #----------------------------------------- #DaveGreen:dag@mrao.cam.ac.uk #----------------------------------------- PSEUDOCOLOR RED: (0.00,0.00) (0.01,0.02) (0.02,0.03) (0.03,0.05) (0.04,0.06) (0.05,0.07) (0.06,0.08) (0.07,0.09) (0.08,0.09) (0.09,0.10) (0.10,0.10) (0.11,0.10) (0.12,0.10) (0.13,0.10) (0.14,0.10) (0.15,0.10) (0.16,0.10) (0.17,0.09) (0.18,0.09) (0.19,0.09) (0.20,0.09) (0.21,0.08) (0.22,0.08) (0.23,0.08) (0.24,0.08) (0.25,0.08) (0.26,0.09) (0.27,0.09) (0.28,0.10) (0.29,0.11) (0.30,0.12) (0.31,0.13) (0.32,0.15) (0.33,0.16) (0.34,0.18) (0.35,0.20) (0.36,0.23) (0.37,0.25) (0.38,0.27) (0.39,0.30) (0.40,0.33) (0.41,0.36) (0.42,0.39) (0.43,0.42) (0.44,0.45) (0.45,0.48) (0.46,0.51) (0.47,0.54) (0.48,0.57) (0.49,0.60) (0.50,0.63) (0.51,0.65) (0.52,0.68) (0.53,0.70) (0.54,0.72) (0.55,0.75) (0.56,0.76) (0.57,0.78) (0.58,0.79) (0.59,0.80) (0.60,0.81) (0.61,0.82) (0.62,0.83) (0.63,0.83) (0.64,0.83) (0.65,0.83) (0.66,0.83) (0.67,0.83) (0.68,0.82) (0.69,0.82) (0.70,0.81) (0.71,0.81) (0.72,0.80) (0.73,0.79) (0.74,0.79) (0.75,0.78) (0.76,0.77) (0.77,0.77) (0.78,0.76) (0.79,0.76) (0.80,0.76) (0.81,0.76) (0.82,0.76) (0.83,0.76) (0.84,0.77) (0.85,0.77) (0.86,0.78) (0.87,0.79) (0.88,0.80) (0.89,0.81) (0.90,0.82) (0.91,0.84) (0.92,0.85) (0.93,0.87) (0.94,0.89) (0.95,0.91) (0.96,0.93) (0.97,0.95) (0.98,0.96) (0.99,0.98) (1.00,1.00) GREEN: (0.00,0.00) (0.01,0.01) (0.02,0.01) (0.03,0.02) (0.04,0.02) (0.05,0.03) (0.06,0.04) (0.07,0.05) (0.08,0.06) (0.09,0.07) (0.10,0.08) (0.11,0.10) (0.12,0.11) (0.13,0.12) (0.14,0.14) (0.15,0.15) (0.16,0.17) (0.17,0.19) (0.18,0.20) (0.19,0.22) (0.20,0.24) (0.21,0.26) (0.22,0.27) (0.23,0.29) (0.24,0.31) (0.25,0.32) (0.26,0.34) (0.27,0.36) (0.28,0.37) (0.29,0.39) (0.30,0.40) (0.31,0.41) (0.32,0.42) (0.33,0.43) (0.34,0.44) (0.35,0.45) (0.36,0.46) (0.37,0.46) (0.38,0.47) (0.39,0.47) (0.40,0.48) (0.41,0.48) (0.42,0.48) (0.43,0.48) (0.44,0.48) (0.45,0.48) (0.46,0.48) (0.47,0.48) (0.48,0.48) (0.49,0.48) (0.50,0.47) (0.51,0.47) (0.52,0.47) (0.53,0.47) (0.54,0.47) (0.55,0.48) (0.56,0.48) (0.57,0.48) (0.58,0.48) (0.59,0.49) (0.60,0.50) (0.61,0.50) (0.62,0.51) (0.63,0.52) (0.64,0.53) (0.65,0.54) (0.66,0.55) (0.67,0.57) (0.68,0.58) (0.69,0.60) (0.70,0.61) (0.71,0.63) (0.72,0.65) (0.73,0.67) (0.74,0.68) (0.75,0.70) (0.76,0.72) (0.77,0.74) (0.78,0.76) (0.79,0.77) (0.80,0.79) (0.81,0.81) (0.82,0.83) (0.83,0.84) (0.84,0.86) (0.85,0.87) (0.86,0.89) (0.87,0.90) (0.88,0.91) (0.89,0.92) (0.90,0.93) (0.91,0.94) (0.92,0.95) (0.93,0.96) (0.94,0.97) (0.95,0.97) (0.96,0.98) (0.97,0.98) (0.98,0.99) (0.99,0.99) (1.00,1.00) BLUE: (0.00,0.00) (0.01,0.02) (0.02,0.03) (0.03,0.05) (0.04,0.07) (0.05,0.09) (0.06,0.11) (0.07,0.13) (0.08,0.15) (0.09,0.17) (0.10,0.19) (0.11,0.21) (0.12,0.22) (0.13,0.24) (0.14,0.25) (0.15,0.27) (0.16,0.28) (0.17,0.29) (0.18,0.30) (0.19,0.30) (0.20,0.31) (0.21,0.31) (0.22,0.31) (0.23,0.31) (0.24,0.30) (0.25,0.30) (0.26,0.29) (0.27,0.28) (0.28,0.28) (0.29,0.27) (0.30,0.26) (0.31,0.25) (0.32,0.24) (0.33,0.23) (0.34,0.22) (0.35,0.21) (0.36,0.20) (0.37,0.19) (0.38,0.19) (0.39,0.19) (0.40,0.18) (0.41,0.18) (0.42,0.19) (0.43,0.19) (0.44,0.20) (0.45,0.21) (0.46,0.22) (0.47,0.23) (0.48,0.25) (0.49,0.27) (0.50,0.29) (0.51,0.31) (0.52,0.33) (0.53,0.36) (0.54,0.39) (0.55,0.42) (0.56,0.45) (0.57,0.48) (0.58,0.51) (0.59,0.54) (0.60,0.58) (0.61,0.61) (0.62,0.64) (0.63,0.67) (0.64,0.70) (0.65,0.73) (0.66,0.76) (0.67,0.78) (0.68,0.81) (0.69,0.83) (0.70,0.85) (0.71,0.87) (0.72,0.89) (0.73,0.91) (0.74,0.92) (0.75,0.93) (0.76,0.94) (0.77,0.94) (0.78,0.95) (0.79,0.95) (0.80,0.95) (0.81,0.95) (0.82,0.95) (0.83,0.95) (0.84,0.95) (0.85,0.95) (0.86,0.94) (0.87,0.94) (0.88,0.94) (0.89,0.94) (0.90,0.94) (0.91,0.94) (0.92,0.94) (0.93,0.94) (0.94,0.94) (0.95,0.95) (0.96,0.95) (0.97,0.96) (0.98,0.97) (0.99,0.99) (1.00,1.00) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/cubehelix1.sao���������������������������������������������������������������������000644 �000765 �000000 �00000010316 11742074507 016733� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������#----------------------------------------- # cubehelix colour scheme for saoimage/DS9 # # start....: 0.5 # rotations: -1.5 # hue......: 2.0 # gamma....: 1.0 # # see: Green (2011), BASI, 39, 289. #----------------------------------------- # Dave Green: dag@mrao.cam.ac.uk #----------------------------------------- PSEUDOCOLOR RED: (0.00,0.00) (0.01,0.02) (0.02,0.04) (0.03,0.06) (0.04,0.08) (0.05,0.09) (0.06,0.10) (0.07,0.10) (0.08,0.11) (0.09,0.11) (0.10,0.10) (0.11,0.10) (0.12,0.09) (0.13,0.08) (0.14,0.07) (0.15,0.05) (0.16,0.04) (0.17,0.02) (0.18,0.00) (0.19,0.00) (0.20,0.00) (0.21,0.00) (0.22,0.00) (0.23,0.00) (0.24,0.00) (0.25,0.00) (0.26,0.00) (0.27,0.00) (0.28,0.00) (0.29,0.00) (0.30,0.00) (0.31,0.00) (0.32,0.00) (0.33,0.00) (0.34,0.03) (0.35,0.06) (0.36,0.09) (0.37,0.13) (0.38,0.17) (0.39,0.21) (0.40,0.26) (0.41,0.31) (0.42,0.36) (0.43,0.41) (0.44,0.46) (0.45,0.51) (0.46,0.56) (0.47,0.61) (0.48,0.66) (0.49,0.71) (0.50,0.76) (0.51,0.80) (0.52,0.84) (0.53,0.88) (0.54,0.91) (0.55,0.94) (0.56,0.97) (0.57,0.99) (0.58,1.00) (0.59,1.00) (0.60,1.00) (0.61,1.00) (0.62,1.00) (0.63,1.00) (0.64,1.00) (0.65,1.00) (0.66,1.00) (0.67,0.99) (0.68,0.97) (0.69,0.95) (0.70,0.93) (0.71,0.90) (0.72,0.88) (0.73,0.86) (0.74,0.83) (0.75,0.81) (0.76,0.79) (0.77,0.77) (0.78,0.75) (0.79,0.73) (0.80,0.72) (0.81,0.71) (0.82,0.70) (0.83,0.69) (0.84,0.69) (0.85,0.69) (0.86,0.70) (0.87,0.71) (0.88,0.72) (0.89,0.73) (0.90,0.75) (0.91,0.77) (0.92,0.79) (0.93,0.81) (0.94,0.84) (0.95,0.87) (0.96,0.89) (0.97,0.92) (0.98,0.95) (0.99,0.97) (1.00,1.00) GREEN: (0.00,0.00) (0.01,0.00) (0.02,0.00) (0.03,0.01) (0.04,0.01) (0.05,0.01) (0.06,0.02) (0.07,0.03) (0.08,0.04) (0.09,0.05) (0.10,0.07) (0.11,0.08) (0.12,0.10) (0.13,0.12) (0.14,0.14) (0.15,0.16) (0.16,0.18) (0.17,0.20) (0.18,0.23) (0.19,0.25) (0.20,0.28) (0.21,0.30) (0.22,0.33) (0.23,0.35) (0.24,0.38) (0.25,0.40) (0.26,0.42) (0.27,0.44) (0.28,0.46) (0.29,0.48) (0.30,0.50) (0.31,0.51) (0.32,0.53) (0.33,0.54) (0.34,0.55) (0.35,0.55) (0.36,0.56) (0.37,0.56) (0.38,0.56) (0.39,0.56) (0.40,0.55) (0.41,0.55) (0.42,0.54) (0.43,0.53) (0.44,0.52) (0.45,0.51) (0.46,0.50) (0.47,0.49) (0.48,0.47) (0.49,0.46) (0.50,0.45) (0.51,0.44) (0.52,0.43) (0.53,0.42) (0.54,0.41) (0.55,0.40) (0.56,0.40) (0.57,0.39) (0.58,0.39) (0.59,0.39) (0.60,0.39) (0.61,0.40) (0.62,0.40) (0.63,0.41) (0.64,0.42) (0.65,0.43) (0.66,0.45) (0.67,0.47) (0.68,0.48) (0.69,0.50) (0.70,0.53) (0.71,0.55) (0.72,0.57) (0.73,0.60) (0.74,0.63) (0.75,0.65) (0.76,0.68) (0.77,0.71) (0.78,0.73) (0.79,0.76) (0.80,0.78) (0.81,0.81) (0.82,0.83) (0.83,0.85) (0.84,0.87) (0.85,0.89) (0.86,0.91) (0.87,0.93) (0.88,0.94) (0.89,0.95) (0.90,0.96) (0.91,0.97) (0.92,0.98) (0.93,0.99) (0.94,0.99) (0.95,0.99) (0.96,1.00) (0.97,1.00) (0.98,1.00) (0.99,1.00) (1.00,1.00) BLUE: (0.00,0.00) (0.01,0.02) (0.02,0.05) (0.03,0.07) (0.04,0.10) (0.05,0.13) (0.06,0.16) (0.07,0.19) (0.08,0.22) (0.09,0.25) (0.10,0.28) (0.11,0.30) (0.12,0.33) (0.13,0.35) (0.14,0.37) (0.15,0.38) (0.16,0.40) (0.17,0.41) (0.18,0.41) (0.19,0.41) (0.20,0.41) (0.21,0.41) (0.22,0.40) (0.23,0.38) (0.24,0.37) (0.25,0.35) (0.26,0.32) (0.27,0.30) (0.28,0.27) (0.29,0.24) (0.30,0.21) (0.31,0.18) (0.32,0.15) (0.33,0.12) (0.34,0.09) (0.35,0.07) (0.36,0.04) (0.37,0.02) (0.38,0.00) (0.39,0.00) (0.40,0.00) (0.41,0.00) (0.42,0.00) (0.43,0.00) (0.44,0.00) (0.45,0.00) (0.46,0.00) (0.47,0.00) (0.48,0.01) (0.49,0.04) (0.50,0.07) (0.51,0.11) (0.52,0.15) (0.53,0.19) (0.54,0.24) (0.55,0.28) (0.56,0.33) (0.57,0.39) (0.58,0.44) (0.59,0.50) (0.60,0.55) (0.61,0.61) (0.62,0.66) (0.63,0.71) (0.64,0.76) (0.65,0.81) (0.66,0.86) (0.67,0.90) (0.68,0.94) (0.69,0.98) (0.70,1.00) (0.71,1.00) (0.72,1.00) (0.73,1.00) (0.74,1.00) (0.75,1.00) (0.76,1.00) (0.77,1.00) (0.78,1.00) (0.79,1.00) (0.80,1.00) (0.81,1.00) (0.82,1.00) (0.83,1.00) (0.84,1.00) (0.85,1.00) (0.86,1.00) (0.87,1.00) (0.88,1.00) (0.89,0.98) (0.90,0.97) (0.91,0.96) (0.92,0.95) (0.93,0.95) (0.94,0.94) (0.95,0.95) (0.96,0.95) (0.97,0.96) (0.98,0.97) (0.99,0.98) (1.00,1.00) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_earth.sao���������������������������������������������������������������������000644 �000765 �000000 �00000026127 12567377777 017067� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # earth # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,0)(0.0042,0)(0.0084,0)(0.0126,0)(0.0167,0)(0.0209,0)(0.0251,0)(0.0293,0)(0.0335,0)(0.0377,0.0039216)(0.0418,0.0078431)(0.046,0.0078431)(0.0502,0.011765)(0.0544,0.015686)(0.0586,0.019608)(0.0628,0.019608)(0.0669,0.023529)(0.0711,0.027451)(0.0753,0.031373)(0.0795,0.031373)(0.0837,0.035294)(0.0879,0.039216)(0.0921,0.043137)(0.0962,0.043137)(0.1004,0.047059)(0.1046,0.05098)(0.1088,0.054902)(0.113,0.058824)(0.1172,0.058824)(0.1213,0.062745)(0.1255,0.066667)(0.1297,0.070588)(0.1339,0.070588)(0.1381,0.07451)(0.1423,0.078431)(0.1464,0.082353)(0.1506,0.086275)(0.1548,0.086275)(0.159,0.090196)(0.1632,0.094118)(0.1674,0.098039)(0.1715,0.10196)(0.1757,0.10196)(0.1799,0.10588)(0.1841,0.1098)(0.1883,0.11373)(0.1925,0.11765)(0.1967,0.12157)(0.2008,0.12157)(0.205,0.12549)(0.2092,0.12941)(0.2134,0.13333)(0.2176,0.13725)(0.2218,0.14118)(0.2259,0.14118)(0.2301,0.1451)(0.2343,0.14902)(0.2385,0.15294)(0.2427,0.15686)(0.2469,0.16078)(0.251,0.16078)(0.2552,0.16471)(0.2594,0.16863)(0.2636,0.17255)(0.2678,0.17647)(0.272,0.18039)(0.2762,0.18431)(0.2803,0.18824)(0.2845,0.18824)(0.2887,0.18824)(0.2929,0.19216)(0.2971,0.19216)(0.3013,0.19608)(0.3054,0.19608)(0.3096,0.2)(0.3138,0.2)(0.318,0.20392)(0.3222,0.20392)(0.3264,0.20784)(0.3305,0.20784)(0.3347,0.21176)(0.3389,0.21176)(0.3431,0.21569)(0.3473,0.21569)(0.3515,0.21961)(0.3556,0.21961)(0.3598,0.22353)(0.364,0.22353)(0.3682,0.22745)(0.3724,0.22745)(0.3766,0.23137)(0.3808,0.23137)(0.3849,0.23529)(0.3891,0.23922)(0.3933,0.23922)(0.3975,0.24314)(0.4017,0.24314)(0.4059,0.24706)(0.41,0.24706)(0.4142,0.25098)(0.4184,0.25098)(0.4226,0.2549)(0.4268,0.2549)(0.431,0.25882)(0.4351,0.26275)(0.4393,0.26275)(0.4435,0.26667)(0.4477,0.26667)(0.4519,0.27059)(0.4561,0.27059)(0.4603,0.27451)(0.4644,0.27843)(0.4686,0.28627)(0.4728,0.29804)(0.477,0.30588)(0.4812,0.31765)(0.4854,0.32549)(0.4895,0.33725)(0.4937,0.3451)(0.4979,0.35686)(0.5021,0.36863)(0.5063,0.37647)(0.5105,0.38824)(0.5146,0.39608)(0.5188,0.40784)(0.523,0.41569)(0.5272,0.42745)(0.5314,0.43529)(0.5356,0.44706)(0.5397,0.45882)(0.5439,0.46667)(0.5481,0.47451)(0.5523,0.47843)(0.5565,0.48627)(0.5607,0.49412)(0.5649,0.50196)(0.569,0.50588)(0.5732,0.51373)(0.5774,0.52157)(0.5816,0.52941)(0.5858,0.53333)(0.59,0.54118)(0.5941,0.54902)(0.5983,0.55294)(0.6025,0.56078)(0.6067,0.56863)(0.6109,0.57647)(0.6151,0.58431)(0.6192,0.58824)(0.6234,0.59608)(0.6276,0.60392)(0.6318,0.61176)(0.636,0.61569)(0.6402,0.62353)(0.6444,0.63137)(0.6485,0.63922)(0.6527,0.64706)(0.6569,0.65098)(0.6611,0.65882)(0.6653,0.66667)(0.6695,0.67451)(0.6736,0.68235)(0.6778,0.68627)(0.682,0.69412)(0.6862,0.70196)(0.6904,0.7098)(0.6946,0.71765)(0.6987,0.71765)(0.7029,0.72157)(0.7071,0.72157)(0.7113,0.72549)(0.7155,0.72549)(0.7197,0.72941)(0.7238,0.72941)(0.728,0.73333)(0.7322,0.73333)(0.7364,0.73333)(0.7406,0.73725)(0.7448,0.73725)(0.749,0.74118)(0.7531,0.74118)(0.7573,0.7451)(0.7615,0.7451)(0.7657,0.7451)(0.7699,0.74902)(0.7741,0.74902)(0.7782,0.75294)(0.7824,0.75294)(0.7866,0.75686)(0.7908,0.76471)(0.795,0.76863)(0.7992,0.77255)(0.8033,0.77647)(0.8075,0.78039)(0.8117,0.78824)(0.8159,0.79216)(0.8201,0.79608)(0.8243,0.8)(0.8285,0.80392)(0.8326,0.81176)(0.8368,0.81569)(0.841,0.81961)(0.8452,0.82353)(0.8494,0.82745)(0.8536,0.83529)(0.8577,0.83922)(0.8619,0.84314)(0.8661,0.84706)(0.8703,0.85098)(0.8745,0.85882)(0.8787,0.86275)(0.8828,0.86667)(0.887,0.87059)(0.8912,0.87451)(0.8954,0.88235)(0.8996,0.88627)(0.9038,0.8902)(0.9079,0.89412)(0.9121,0.89804)(0.9163,0.90588)(0.9205,0.9098)(0.9247,0.91373)(0.9289,0.91765)(0.9331,0.92157)(0.9372,0.92941)(0.9414,0.93333)(0.9456,0.93725)(0.9498,0.94118)(0.954,0.9451)(0.9582,0.95294)(0.9623,0.95686)(0.9665,0.96078)(0.9707,0.96471)(0.9749,0.96863)(0.9791,0.97647)(0.9833,0.98039)(0.9874,0.98431)(0.9916,0.98824)(0.9958,0.99216)(1,1) GREEN: (0,0)(0.0042,0)(0.0084,0)(0.0126,0)(0.0167,0)(0.0209,0)(0.0251,0)(0.0293,0)(0.0335,0.011765)(0.0377,0.023529)(0.0418,0.031373)(0.046,0.043137)(0.0502,0.05098)(0.0544,0.062745)(0.0586,0.070588)(0.0628,0.082353)(0.0669,0.090196)(0.0711,0.10196)(0.0753,0.1098)(0.0795,0.12157)(0.0837,0.12941)(0.0879,0.14118)(0.0921,0.14902)(0.0962,0.16078)(0.1004,0.16863)(0.1046,0.17647)(0.1088,0.18824)(0.113,0.19608)(0.1172,0.20392)(0.1213,0.21569)(0.1255,0.22353)(0.1297,0.23137)(0.1339,0.23922)(0.1381,0.25098)(0.1423,0.25882)(0.1464,0.26667)(0.1506,0.27451)(0.1548,0.28235)(0.159,0.2902)(0.1632,0.30196)(0.1674,0.3098)(0.1715,0.31765)(0.1757,0.32549)(0.1799,0.33333)(0.1841,0.34118)(0.1883,0.34902)(0.1925,0.35686)(0.1967,0.36471)(0.2008,0.37255)(0.205,0.38039)(0.2092,0.38824)(0.2134,0.39216)(0.2176,0.4)(0.2218,0.40784)(0.2259,0.41569)(0.2301,0.42353)(0.2343,0.42745)(0.2385,0.43529)(0.2427,0.44314)(0.2469,0.45098)(0.251,0.4549)(0.2552,0.46275)(0.2594,0.47059)(0.2636,0.47451)(0.2678,0.48235)(0.272,0.4902)(0.2762,0.49412)(0.2803,0.50196)(0.2845,0.50196)(0.2887,0.50588)(0.2929,0.50588)(0.2971,0.5098)(0.3013,0.51373)(0.3054,0.51373)(0.3096,0.51765)(0.3138,0.52157)(0.318,0.52157)(0.3222,0.52549)(0.3264,0.52549)(0.3305,0.52941)(0.3347,0.53333)(0.3389,0.53333)(0.3431,0.53725)(0.3473,0.54118)(0.3515,0.54118)(0.3556,0.5451)(0.3598,0.54902)(0.364,0.54902)(0.3682,0.55294)(0.3724,0.55294)(0.3766,0.55686)(0.3808,0.56078)(0.3849,0.56078)(0.3891,0.56471)(0.3933,0.56863)(0.3975,0.56863)(0.4017,0.57255)(0.4059,0.57255)(0.41,0.57647)(0.4142,0.58039)(0.4184,0.58039)(0.4226,0.58431)(0.4268,0.58824)(0.431,0.58824)(0.4351,0.59216)(0.4393,0.59216)(0.4435,0.59608)(0.4477,0.6)(0.4519,0.6)(0.4561,0.60392)(0.4603,0.60784)(0.4644,0.60784)(0.4686,0.61176)(0.4728,0.61176)(0.477,0.61569)(0.4812,0.61961)(0.4854,0.61961)(0.4895,0.62353)(0.4937,0.62745)(0.4979,0.62745)(0.5021,0.63137)(0.5063,0.63137)(0.5105,0.63529)(0.5146,0.63922)(0.5188,0.63922)(0.523,0.64314)(0.5272,0.64706)(0.5314,0.64706)(0.5356,0.65098)(0.5397,0.65098)(0.5439,0.6549)(0.5481,0.65882)(0.5523,0.65882)(0.5565,0.65882)(0.5607,0.66275)(0.5649,0.66275)(0.569,0.66667)(0.5732,0.66667)(0.5774,0.67059)(0.5816,0.67059)(0.5858,0.67451)(0.59,0.67451)(0.5941,0.67451)(0.5983,0.67843)(0.6025,0.67843)(0.6067,0.68235)(0.6109,0.68235)(0.6151,0.68627)(0.6192,0.68627)(0.6234,0.68627)(0.6276,0.6902)(0.6318,0.6902)(0.636,0.69412)(0.6402,0.69412)(0.6444,0.69804)(0.6485,0.69804)(0.6527,0.70196)(0.6569,0.70196)(0.6611,0.70196)(0.6653,0.70588)(0.6695,0.70588)(0.6736,0.7098)(0.6778,0.7098)(0.682,0.71373)(0.6862,0.71373)(0.6904,0.71765)(0.6946,0.71765)(0.6987,0.71373)(0.7029,0.7098)(0.7071,0.7098)(0.7113,0.70588)(0.7155,0.70196)(0.7197,0.69804)(0.7238,0.69412)(0.728,0.6902)(0.7322,0.68627)(0.7364,0.68235)(0.7406,0.67843)(0.7448,0.67451)(0.749,0.67059)(0.7531,0.66667)(0.7573,0.66275)(0.7615,0.65882)(0.7657,0.6549)(0.7699,0.65098)(0.7741,0.64706)(0.7782,0.64314)(0.7824,0.63922)(0.7866,0.63922)(0.7908,0.64314)(0.795,0.64314)(0.7992,0.64706)(0.8033,0.64706)(0.8075,0.65098)(0.8117,0.6549)(0.8159,0.6549)(0.8201,0.65882)(0.8243,0.66275)(0.8285,0.66667)(0.8326,0.67059)(0.8368,0.67451)(0.841,0.67843)(0.8452,0.68235)(0.8494,0.68627)(0.8536,0.6902)(0.8577,0.69412)(0.8619,0.69804)(0.8661,0.70196)(0.8703,0.7098)(0.8745,0.71373)(0.8787,0.72157)(0.8828,0.72549)(0.887,0.73333)(0.8912,0.73725)(0.8954,0.7451)(0.8996,0.75294)(0.9038,0.76078)(0.9079,0.76863)(0.9121,0.77647)(0.9163,0.78431)(0.9205,0.79216)(0.9247,0.8)(0.9289,0.80784)(0.9331,0.81569)(0.9372,0.82745)(0.9414,0.83529)(0.9456,0.84314)(0.9498,0.8549)(0.954,0.86667)(0.9582,0.87451)(0.9623,0.88627)(0.9665,0.89804)(0.9707,0.9098)(0.9749,0.92157)(0.9791,0.93333)(0.9833,0.9451)(0.9874,0.95686)(0.9916,0.97255)(0.9958,0.98431)(1,1) BLUE: (0,0)(0.0042,0.18039)(0.0084,0.22745)(0.0126,0.27059)(0.0167,0.31765)(0.0209,0.36078)(0.0251,0.40784)(0.0293,0.4549)(0.0335,0.4549)(0.0377,0.4549)(0.0418,0.4549)(0.046,0.4549)(0.0502,0.45882)(0.0544,0.45882)(0.0586,0.45882)(0.0628,0.45882)(0.0669,0.45882)(0.0711,0.46275)(0.0753,0.46275)(0.0795,0.46275)(0.0837,0.46275)(0.0879,0.46275)(0.0921,0.46667)(0.0962,0.46667)(0.1004,0.46667)(0.1046,0.46667)(0.1088,0.46667)(0.113,0.47059)(0.1172,0.47059)(0.1213,0.47059)(0.1255,0.47059)(0.1297,0.47059)(0.1339,0.47451)(0.1381,0.47451)(0.1423,0.47451)(0.1464,0.47451)(0.1506,0.47451)(0.1548,0.47843)(0.159,0.47843)(0.1632,0.47843)(0.1674,0.47843)(0.1715,0.47843)(0.1757,0.48235)(0.1799,0.48235)(0.1841,0.48235)(0.1883,0.48235)(0.1925,0.48235)(0.1967,0.48627)(0.2008,0.48627)(0.205,0.48627)(0.2092,0.48627)(0.2134,0.48627)(0.2176,0.4902)(0.2218,0.4902)(0.2259,0.4902)(0.2301,0.4902)(0.2343,0.4902)(0.2385,0.49412)(0.2427,0.49412)(0.2469,0.49412)(0.251,0.49412)(0.2552,0.49412)(0.2594,0.49804)(0.2636,0.49804)(0.2678,0.49804)(0.272,0.49804)(0.2762,0.49804)(0.2803,0.50196)(0.2845,0.49412)(0.2887,0.4902)(0.2929,0.48627)(0.2971,0.48235)(0.3013,0.47843)(0.3054,0.47059)(0.3096,0.46667)(0.3138,0.46275)(0.318,0.45882)(0.3222,0.45098)(0.3264,0.44706)(0.3305,0.44314)(0.3347,0.43529)(0.3389,0.43137)(0.3431,0.42745)(0.3473,0.42353)(0.3515,0.41569)(0.3556,0.41176)(0.3598,0.40784)(0.364,0.4)(0.3682,0.39608)(0.3724,0.39216)(0.3766,0.38431)(0.3808,0.38039)(0.3849,0.37647)(0.3891,0.36863)(0.3933,0.36471)(0.3975,0.36078)(0.4017,0.35294)(0.4059,0.34902)(0.41,0.3451)(0.4142,0.33725)(0.4184,0.33333)(0.4226,0.32941)(0.4268,0.32157)(0.431,0.31765)(0.4351,0.31373)(0.4393,0.30588)(0.4435,0.30196)(0.4477,0.29804)(0.4519,0.2902)(0.4561,0.28627)(0.4603,0.27843)(0.4644,0.27451)(0.4686,0.27843)(0.4728,0.28235)(0.477,0.28235)(0.4812,0.28627)(0.4854,0.28627)(0.4895,0.2902)(0.4937,0.29412)(0.4979,0.29412)(0.5021,0.29804)(0.5063,0.29804)(0.5105,0.30196)(0.5146,0.30196)(0.5188,0.30588)(0.523,0.3098)(0.5272,0.3098)(0.5314,0.31373)(0.5356,0.31373)(0.5397,0.31765)(0.5439,0.32157)(0.5481,0.32157)(0.5523,0.32157)(0.5565,0.32549)(0.5607,0.32549)(0.5649,0.32549)(0.569,0.32941)(0.5732,0.32941)(0.5774,0.32941)(0.5816,0.33333)(0.5858,0.33333)(0.59,0.33333)(0.5941,0.33725)(0.5983,0.33725)(0.6025,0.33725)(0.6067,0.34118)(0.6109,0.34118)(0.6151,0.34118)(0.6192,0.3451)(0.6234,0.3451)(0.6276,0.3451)(0.6318,0.34902)(0.636,0.34902)(0.6402,0.34902)(0.6444,0.35294)(0.6485,0.35294)(0.6527,0.35294)(0.6569,0.35686)(0.6611,0.35686)(0.6653,0.35686)(0.6695,0.36078)(0.6736,0.36078)(0.6778,0.36078)(0.682,0.36471)(0.6862,0.36471)(0.6904,0.36471)(0.6946,0.36863)(0.6987,0.36863)(0.7029,0.36863)(0.7071,0.37255)(0.7113,0.37255)(0.7155,0.37255)(0.7197,0.37647)(0.7238,0.37647)(0.728,0.38039)(0.7322,0.38039)(0.7364,0.38039)(0.7406,0.38431)(0.7448,0.38431)(0.749,0.38431)(0.7531,0.38824)(0.7573,0.38824)(0.7615,0.38824)(0.7657,0.39216)(0.7699,0.39216)(0.7741,0.39216)(0.7782,0.39608)(0.7824,0.39608)(0.7866,0.40784)(0.7908,0.41569)(0.795,0.42353)(0.7992,0.43529)(0.8033,0.44314)(0.8075,0.4549)(0.8117,0.46275)(0.8159,0.47451)(0.8201,0.48235)(0.8243,0.49412)(0.8285,0.50588)(0.8326,0.51373)(0.8368,0.52549)(0.841,0.53725)(0.8452,0.5451)(0.8494,0.55686)(0.8536,0.56863)(0.8577,0.58039)(0.8619,0.58824)(0.8661,0.6)(0.8703,0.61176)(0.8745,0.62353)(0.8787,0.63529)(0.8828,0.64706)(0.887,0.65882)(0.8912,0.66667)(0.8954,0.67843)(0.8996,0.6902)(0.9038,0.70196)(0.9079,0.71373)(0.9121,0.72549)(0.9163,0.74118)(0.9205,0.75294)(0.9247,0.76471)(0.9289,0.77647)(0.9331,0.78824)(0.9372,0.8)(0.9414,0.81176)(0.9456,0.82745)(0.9498,0.83922)(0.954,0.85098)(0.9582,0.86275)(0.9623,0.87843)(0.9665,0.8902)(0.9707,0.90196)(0.9749,0.91765)(0.9791,0.92941)(0.9833,0.9451)(0.9874,0.95686)(0.9916,0.97255)(0.9958,0.98431)(1,1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_gray.sao����������������������������������������������������������������������000644 �000765 �000000 �00000026320 12567377777 016721� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # gray # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,0)(0.0042,0.0039216)(0.0084,0.0078431)(0.0126,0.011765)(0.0167,0.015686)(0.0209,0.019608)(0.0251,0.023529)(0.0293,0.027451)(0.0335,0.035294)(0.0377,0.039216)(0.0418,0.043137)(0.046,0.047059)(0.0502,0.05098)(0.0544,0.054902)(0.0586,0.058824)(0.0628,0.062745)(0.0669,0.066667)(0.0711,0.070588)(0.0753,0.07451)(0.0795,0.078431)(0.0837,0.082353)(0.0879,0.086275)(0.0921,0.090196)(0.0962,0.098039)(0.1004,0.10196)(0.1046,0.10588)(0.1088,0.1098)(0.113,0.11373)(0.1172,0.11765)(0.1213,0.12157)(0.1255,0.12549)(0.1297,0.12941)(0.1339,0.13333)(0.1381,0.13725)(0.1423,0.14118)(0.1464,0.1451)(0.1506,0.14902)(0.1548,0.15294)(0.159,0.16078)(0.1632,0.16471)(0.1674,0.16863)(0.1715,0.17255)(0.1757,0.17647)(0.1799,0.18039)(0.1841,0.18431)(0.1883,0.18824)(0.1925,0.19216)(0.1967,0.19608)(0.2008,0.2)(0.205,0.20392)(0.2092,0.20784)(0.2134,0.21176)(0.2176,0.21569)(0.2218,0.22353)(0.2259,0.22745)(0.2301,0.23137)(0.2343,0.23529)(0.2385,0.23922)(0.2427,0.24314)(0.2469,0.24706)(0.251,0.25098)(0.2552,0.2549)(0.2594,0.25882)(0.2636,0.26275)(0.2678,0.26667)(0.272,0.27059)(0.2762,0.27451)(0.2803,0.27843)(0.2845,0.28627)(0.2887,0.2902)(0.2929,0.29412)(0.2971,0.29804)(0.3013,0.30196)(0.3054,0.30588)(0.3096,0.3098)(0.3138,0.31373)(0.318,0.31765)(0.3222,0.32157)(0.3264,0.32549)(0.3305,0.32941)(0.3347,0.33333)(0.3389,0.33725)(0.3431,0.34118)(0.3473,0.34902)(0.3515,0.35294)(0.3556,0.35686)(0.3598,0.36078)(0.364,0.36471)(0.3682,0.36863)(0.3724,0.37255)(0.3766,0.37647)(0.3808,0.38039)(0.3849,0.38431)(0.3891,0.38824)(0.3933,0.39216)(0.3975,0.39608)(0.4017,0.4)(0.4059,0.40392)(0.41,0.41176)(0.4142,0.41569)(0.4184,0.41961)(0.4226,0.42353)(0.4268,0.42745)(0.431,0.43137)(0.4351,0.43529)(0.4393,0.43922)(0.4435,0.44314)(0.4477,0.44706)(0.4519,0.45098)(0.4561,0.4549)(0.4603,0.45882)(0.4644,0.46275)(0.4686,0.46667)(0.4728,0.47451)(0.477,0.47843)(0.4812,0.48235)(0.4854,0.48627)(0.4895,0.4902)(0.4937,0.49412)(0.4979,0.49804)(0.5021,0.50196)(0.5063,0.50588)(0.5105,0.5098)(0.5146,0.51373)(0.5188,0.51765)(0.523,0.52157)(0.5272,0.52549)(0.5314,0.52941)(0.5356,0.53725)(0.5397,0.54118)(0.5439,0.5451)(0.5481,0.54902)(0.5523,0.55294)(0.5565,0.55686)(0.5607,0.56078)(0.5649,0.56471)(0.569,0.56863)(0.5732,0.57255)(0.5774,0.57647)(0.5816,0.58039)(0.5858,0.58431)(0.59,0.58824)(0.5941,0.59216)(0.5983,0.6)(0.6025,0.60392)(0.6067,0.60784)(0.6109,0.61176)(0.6151,0.61569)(0.6192,0.61961)(0.6234,0.62353)(0.6276,0.62745)(0.6318,0.63137)(0.636,0.63529)(0.6402,0.63922)(0.6444,0.64314)(0.6485,0.64706)(0.6527,0.65098)(0.6569,0.6549)(0.6611,0.66275)(0.6653,0.66667)(0.6695,0.67059)(0.6736,0.67451)(0.6778,0.67843)(0.682,0.68235)(0.6862,0.68627)(0.6904,0.6902)(0.6946,0.69412)(0.6987,0.69804)(0.7029,0.70196)(0.7071,0.70588)(0.7113,0.7098)(0.7155,0.71373)(0.7197,0.71765)(0.7238,0.72549)(0.728,0.72941)(0.7322,0.73333)(0.7364,0.73725)(0.7406,0.74118)(0.7448,0.7451)(0.749,0.74902)(0.7531,0.75294)(0.7573,0.75686)(0.7615,0.76078)(0.7657,0.76471)(0.7699,0.76863)(0.7741,0.77255)(0.7782,0.77647)(0.7824,0.78039)(0.7866,0.78824)(0.7908,0.79216)(0.795,0.79608)(0.7992,0.8)(0.8033,0.80392)(0.8075,0.80784)(0.8117,0.81176)(0.8159,0.81569)(0.8201,0.81961)(0.8243,0.82353)(0.8285,0.82745)(0.8326,0.83137)(0.8368,0.83529)(0.841,0.83922)(0.8452,0.84314)(0.8494,0.85098)(0.8536,0.8549)(0.8577,0.85882)(0.8619,0.86275)(0.8661,0.86667)(0.8703,0.87059)(0.8745,0.87451)(0.8787,0.87843)(0.8828,0.88235)(0.887,0.88627)(0.8912,0.8902)(0.8954,0.89412)(0.8996,0.89804)(0.9038,0.90196)(0.9079,0.90588)(0.9121,0.91373)(0.9163,0.91765)(0.9205,0.92157)(0.9247,0.92549)(0.9289,0.92941)(0.9331,0.93333)(0.9372,0.93725)(0.9414,0.94118)(0.9456,0.9451)(0.9498,0.94902)(0.954,0.95294)(0.9582,0.95686)(0.9623,0.96078)(0.9665,0.96471)(0.9707,0.96863)(0.9749,0.97647)(0.9791,0.98039)(0.9833,0.98431)(0.9874,0.98824)(0.9916,0.99216)(0.9958,0.99608)(1,1) GREEN: (0,0)(0.0042,0.0039216)(0.0084,0.0078431)(0.0126,0.011765)(0.0167,0.015686)(0.0209,0.019608)(0.0251,0.023529)(0.0293,0.027451)(0.0335,0.035294)(0.0377,0.039216)(0.0418,0.043137)(0.046,0.047059)(0.0502,0.05098)(0.0544,0.054902)(0.0586,0.058824)(0.0628,0.062745)(0.0669,0.066667)(0.0711,0.070588)(0.0753,0.07451)(0.0795,0.078431)(0.0837,0.082353)(0.0879,0.086275)(0.0921,0.090196)(0.0962,0.098039)(0.1004,0.10196)(0.1046,0.10588)(0.1088,0.1098)(0.113,0.11373)(0.1172,0.11765)(0.1213,0.12157)(0.1255,0.12549)(0.1297,0.12941)(0.1339,0.13333)(0.1381,0.13725)(0.1423,0.14118)(0.1464,0.1451)(0.1506,0.14902)(0.1548,0.15294)(0.159,0.16078)(0.1632,0.16471)(0.1674,0.16863)(0.1715,0.17255)(0.1757,0.17647)(0.1799,0.18039)(0.1841,0.18431)(0.1883,0.18824)(0.1925,0.19216)(0.1967,0.19608)(0.2008,0.2)(0.205,0.20392)(0.2092,0.20784)(0.2134,0.21176)(0.2176,0.21569)(0.2218,0.22353)(0.2259,0.22745)(0.2301,0.23137)(0.2343,0.23529)(0.2385,0.23922)(0.2427,0.24314)(0.2469,0.24706)(0.251,0.25098)(0.2552,0.2549)(0.2594,0.25882)(0.2636,0.26275)(0.2678,0.26667)(0.272,0.27059)(0.2762,0.27451)(0.2803,0.27843)(0.2845,0.28627)(0.2887,0.2902)(0.2929,0.29412)(0.2971,0.29804)(0.3013,0.30196)(0.3054,0.30588)(0.3096,0.3098)(0.3138,0.31373)(0.318,0.31765)(0.3222,0.32157)(0.3264,0.32549)(0.3305,0.32941)(0.3347,0.33333)(0.3389,0.33725)(0.3431,0.34118)(0.3473,0.34902)(0.3515,0.35294)(0.3556,0.35686)(0.3598,0.36078)(0.364,0.36471)(0.3682,0.36863)(0.3724,0.37255)(0.3766,0.37647)(0.3808,0.38039)(0.3849,0.38431)(0.3891,0.38824)(0.3933,0.39216)(0.3975,0.39608)(0.4017,0.4)(0.4059,0.40392)(0.41,0.41176)(0.4142,0.41569)(0.4184,0.41961)(0.4226,0.42353)(0.4268,0.42745)(0.431,0.43137)(0.4351,0.43529)(0.4393,0.43922)(0.4435,0.44314)(0.4477,0.44706)(0.4519,0.45098)(0.4561,0.4549)(0.4603,0.45882)(0.4644,0.46275)(0.4686,0.46667)(0.4728,0.47451)(0.477,0.47843)(0.4812,0.48235)(0.4854,0.48627)(0.4895,0.4902)(0.4937,0.49412)(0.4979,0.49804)(0.5021,0.50196)(0.5063,0.50588)(0.5105,0.5098)(0.5146,0.51373)(0.5188,0.51765)(0.523,0.52157)(0.5272,0.52549)(0.5314,0.52941)(0.5356,0.53725)(0.5397,0.54118)(0.5439,0.5451)(0.5481,0.54902)(0.5523,0.55294)(0.5565,0.55686)(0.5607,0.56078)(0.5649,0.56471)(0.569,0.56863)(0.5732,0.57255)(0.5774,0.57647)(0.5816,0.58039)(0.5858,0.58431)(0.59,0.58824)(0.5941,0.59216)(0.5983,0.6)(0.6025,0.60392)(0.6067,0.60784)(0.6109,0.61176)(0.6151,0.61569)(0.6192,0.61961)(0.6234,0.62353)(0.6276,0.62745)(0.6318,0.63137)(0.636,0.63529)(0.6402,0.63922)(0.6444,0.64314)(0.6485,0.64706)(0.6527,0.65098)(0.6569,0.6549)(0.6611,0.66275)(0.6653,0.66667)(0.6695,0.67059)(0.6736,0.67451)(0.6778,0.67843)(0.682,0.68235)(0.6862,0.68627)(0.6904,0.6902)(0.6946,0.69412)(0.6987,0.69804)(0.7029,0.70196)(0.7071,0.70588)(0.7113,0.7098)(0.7155,0.71373)(0.7197,0.71765)(0.7238,0.72549)(0.728,0.72941)(0.7322,0.73333)(0.7364,0.73725)(0.7406,0.74118)(0.7448,0.7451)(0.749,0.74902)(0.7531,0.75294)(0.7573,0.75686)(0.7615,0.76078)(0.7657,0.76471)(0.7699,0.76863)(0.7741,0.77255)(0.7782,0.77647)(0.7824,0.78039)(0.7866,0.78824)(0.7908,0.79216)(0.795,0.79608)(0.7992,0.8)(0.8033,0.80392)(0.8075,0.80784)(0.8117,0.81176)(0.8159,0.81569)(0.8201,0.81961)(0.8243,0.82353)(0.8285,0.82745)(0.8326,0.83137)(0.8368,0.83529)(0.841,0.83922)(0.8452,0.84314)(0.8494,0.85098)(0.8536,0.8549)(0.8577,0.85882)(0.8619,0.86275)(0.8661,0.86667)(0.8703,0.87059)(0.8745,0.87451)(0.8787,0.87843)(0.8828,0.88235)(0.887,0.88627)(0.8912,0.8902)(0.8954,0.89412)(0.8996,0.89804)(0.9038,0.90196)(0.9079,0.90588)(0.9121,0.91373)(0.9163,0.91765)(0.9205,0.92157)(0.9247,0.92549)(0.9289,0.92941)(0.9331,0.93333)(0.9372,0.93725)(0.9414,0.94118)(0.9456,0.9451)(0.9498,0.94902)(0.954,0.95294)(0.9582,0.95686)(0.9623,0.96078)(0.9665,0.96471)(0.9707,0.96863)(0.9749,0.97647)(0.9791,0.98039)(0.9833,0.98431)(0.9874,0.98824)(0.9916,0.99216)(0.9958,0.99608)(1,1) BLUE: (0,0)(0.0042,0.0039216)(0.0084,0.0078431)(0.0126,0.011765)(0.0167,0.015686)(0.0209,0.019608)(0.0251,0.023529)(0.0293,0.027451)(0.0335,0.035294)(0.0377,0.039216)(0.0418,0.043137)(0.046,0.047059)(0.0502,0.05098)(0.0544,0.054902)(0.0586,0.058824)(0.0628,0.062745)(0.0669,0.066667)(0.0711,0.070588)(0.0753,0.07451)(0.0795,0.078431)(0.0837,0.082353)(0.0879,0.086275)(0.0921,0.090196)(0.0962,0.098039)(0.1004,0.10196)(0.1046,0.10588)(0.1088,0.1098)(0.113,0.11373)(0.1172,0.11765)(0.1213,0.12157)(0.1255,0.12549)(0.1297,0.12941)(0.1339,0.13333)(0.1381,0.13725)(0.1423,0.14118)(0.1464,0.1451)(0.1506,0.14902)(0.1548,0.15294)(0.159,0.16078)(0.1632,0.16471)(0.1674,0.16863)(0.1715,0.17255)(0.1757,0.17647)(0.1799,0.18039)(0.1841,0.18431)(0.1883,0.18824)(0.1925,0.19216)(0.1967,0.19608)(0.2008,0.2)(0.205,0.20392)(0.2092,0.20784)(0.2134,0.21176)(0.2176,0.21569)(0.2218,0.22353)(0.2259,0.22745)(0.2301,0.23137)(0.2343,0.23529)(0.2385,0.23922)(0.2427,0.24314)(0.2469,0.24706)(0.251,0.25098)(0.2552,0.2549)(0.2594,0.25882)(0.2636,0.26275)(0.2678,0.26667)(0.272,0.27059)(0.2762,0.27451)(0.2803,0.27843)(0.2845,0.28627)(0.2887,0.2902)(0.2929,0.29412)(0.2971,0.29804)(0.3013,0.30196)(0.3054,0.30588)(0.3096,0.3098)(0.3138,0.31373)(0.318,0.31765)(0.3222,0.32157)(0.3264,0.32549)(0.3305,0.32941)(0.3347,0.33333)(0.3389,0.33725)(0.3431,0.34118)(0.3473,0.34902)(0.3515,0.35294)(0.3556,0.35686)(0.3598,0.36078)(0.364,0.36471)(0.3682,0.36863)(0.3724,0.37255)(0.3766,0.37647)(0.3808,0.38039)(0.3849,0.38431)(0.3891,0.38824)(0.3933,0.39216)(0.3975,0.39608)(0.4017,0.4)(0.4059,0.40392)(0.41,0.41176)(0.4142,0.41569)(0.4184,0.41961)(0.4226,0.42353)(0.4268,0.42745)(0.431,0.43137)(0.4351,0.43529)(0.4393,0.43922)(0.4435,0.44314)(0.4477,0.44706)(0.4519,0.45098)(0.4561,0.4549)(0.4603,0.45882)(0.4644,0.46275)(0.4686,0.46667)(0.4728,0.47451)(0.477,0.47843)(0.4812,0.48235)(0.4854,0.48627)(0.4895,0.4902)(0.4937,0.49412)(0.4979,0.49804)(0.5021,0.50196)(0.5063,0.50588)(0.5105,0.5098)(0.5146,0.51373)(0.5188,0.51765)(0.523,0.52157)(0.5272,0.52549)(0.5314,0.52941)(0.5356,0.53725)(0.5397,0.54118)(0.5439,0.5451)(0.5481,0.54902)(0.5523,0.55294)(0.5565,0.55686)(0.5607,0.56078)(0.5649,0.56471)(0.569,0.56863)(0.5732,0.57255)(0.5774,0.57647)(0.5816,0.58039)(0.5858,0.58431)(0.59,0.58824)(0.5941,0.59216)(0.5983,0.6)(0.6025,0.60392)(0.6067,0.60784)(0.6109,0.61176)(0.6151,0.61569)(0.6192,0.61961)(0.6234,0.62353)(0.6276,0.62745)(0.6318,0.63137)(0.636,0.63529)(0.6402,0.63922)(0.6444,0.64314)(0.6485,0.64706)(0.6527,0.65098)(0.6569,0.6549)(0.6611,0.66275)(0.6653,0.66667)(0.6695,0.67059)(0.6736,0.67451)(0.6778,0.67843)(0.682,0.68235)(0.6862,0.68627)(0.6904,0.6902)(0.6946,0.69412)(0.6987,0.69804)(0.7029,0.70196)(0.7071,0.70588)(0.7113,0.7098)(0.7155,0.71373)(0.7197,0.71765)(0.7238,0.72549)(0.728,0.72941)(0.7322,0.73333)(0.7364,0.73725)(0.7406,0.74118)(0.7448,0.7451)(0.749,0.74902)(0.7531,0.75294)(0.7573,0.75686)(0.7615,0.76078)(0.7657,0.76471)(0.7699,0.76863)(0.7741,0.77255)(0.7782,0.77647)(0.7824,0.78039)(0.7866,0.78824)(0.7908,0.79216)(0.795,0.79608)(0.7992,0.8)(0.8033,0.80392)(0.8075,0.80784)(0.8117,0.81176)(0.8159,0.81569)(0.8201,0.81961)(0.8243,0.82353)(0.8285,0.82745)(0.8326,0.83137)(0.8368,0.83529)(0.841,0.83922)(0.8452,0.84314)(0.8494,0.85098)(0.8536,0.8549)(0.8577,0.85882)(0.8619,0.86275)(0.8661,0.86667)(0.8703,0.87059)(0.8745,0.87451)(0.8787,0.87843)(0.8828,0.88235)(0.887,0.88627)(0.8912,0.8902)(0.8954,0.89412)(0.8996,0.89804)(0.9038,0.90196)(0.9079,0.90588)(0.9121,0.91373)(0.9163,0.91765)(0.9205,0.92157)(0.9247,0.92549)(0.9289,0.92941)(0.9331,0.93333)(0.9372,0.93725)(0.9414,0.94118)(0.9456,0.9451)(0.9498,0.94902)(0.954,0.95294)(0.9582,0.95686)(0.9623,0.96078)(0.9665,0.96471)(0.9707,0.96863)(0.9749,0.97647)(0.9791,0.98039)(0.9833,0.98431)(0.9874,0.98824)(0.9916,0.99216)(0.9958,0.99608)(1,1) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_heat.sao����������������������������������������������������������������������000644 �000765 �000000 �00000022105 12567377777 016675� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # heat # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,0)(0.0042,0.0039216)(0.0084,0.0078431)(0.0126,0.015686)(0.0167,0.019608)(0.0209,0.027451)(0.0251,0.031373)(0.0293,0.039216)(0.0335,0.043137)(0.0377,0.05098)(0.0418,0.058824)(0.046,0.066667)(0.0502,0.070588)(0.0544,0.078431)(0.0586,0.082353)(0.0628,0.090196)(0.0669,0.094118)(0.0711,0.10196)(0.0753,0.10588)(0.0795,0.1098)(0.0837,0.11765)(0.0879,0.12157)(0.0921,0.12941)(0.0962,0.13333)(0.1004,0.14118)(0.1046,0.1451)(0.1088,0.15294)(0.113,0.15686)(0.1172,0.16471)(0.1213,0.16863)(0.1255,0.18039)(0.1297,0.18431)(0.1339,0.19216)(0.1381,0.19608)(0.1423,0.20392)(0.1464,0.20784)(0.1506,0.21569)(0.1548,0.21961)(0.159,0.22353)(0.1632,0.23137)(0.1674,0.23529)(0.1715,0.24314)(0.1757,0.24706)(0.1799,0.2549)(0.1841,0.25882)(0.1883,0.26667)(0.1925,0.27059)(0.1967,0.27451)(0.2008,0.28235)(0.205,0.28627)(0.2092,0.29804)(0.2134,0.30588)(0.2176,0.3098)(0.2218,0.31765)(0.2259,0.32157)(0.2301,0.32941)(0.2343,0.33333)(0.2385,0.33725)(0.2427,0.3451)(0.2469,0.34902)(0.251,0.36078)(0.2552,0.36863)(0.2594,0.37255)(0.2636,0.38039)(0.2678,0.38431)(0.272,0.38824)(0.2762,0.39608)(0.2803,0.4)(0.2845,0.40784)(0.2887,0.41176)(0.2929,0.42353)(0.2971,0.43137)(0.3013,0.43529)(0.3054,0.44314)(0.3096,0.44706)(0.3138,0.45098)(0.318,0.45882)(0.3222,0.46275)(0.3264,0.47059)(0.3305,0.47451)(0.3347,0.48235)(0.3389,0.48627)(0.3431,0.49412)(0.3473,0.49804)(0.3515,0.50196)(0.3556,0.5098)(0.3598,0.51373)(0.364,0.52157)(0.3682,0.52549)(0.3724,0.53333)(0.3766,0.5451)(0.3808,0.54902)(0.3849,0.55294)(0.3891,0.56078)(0.3933,0.56471)(0.3975,0.57255)(0.4017,0.57647)(0.4059,0.58431)(0.41,0.58824)(0.4142,0.59608)(0.4184,0.6)(0.4226,0.60784)(0.4268,0.61176)(0.431,0.61569)(0.4351,0.62353)(0.4393,0.62745)(0.4435,0.63529)(0.4477,0.63922)(0.4519,0.64706)(0.4561,0.65098)(0.4603,0.66275)(0.4644,0.66667)(0.4686,0.67451)(0.4728,0.67843)(0.477,0.68627)(0.4812,0.6902)(0.4854,0.69804)(0.4895,0.70196)(0.4937,0.7098)(0.4979,0.71373)(0.5021,0.72549)(0.5063,0.72941)(0.5105,0.73725)(0.5146,0.74118)(0.5188,0.74902)(0.523,0.75294)(0.5272,0.76078)(0.5314,0.76471)(0.5356,0.77255)(0.5397,0.77647)(0.5439,0.78824)(0.5481,0.79216)(0.5523,0.8)(0.5565,0.80392)(0.5607,0.81176)(0.5649,0.81569)(0.569,0.82353)(0.5732,0.82745)(0.5774,0.83137)(0.5816,0.83922)(0.5858,0.84314)(0.59,0.85098)(0.5941,0.8549)(0.5983,0.86275)(0.6025,0.86667)(0.6067,0.87451)(0.6109,0.87843)(0.6151,0.88627)(0.6192,0.8902)(0.6234,0.89412)(0.6276,0.90588)(0.6318,0.91373)(0.636,0.91765)(0.6402,0.92549)(0.6444,0.92941)(0.6485,0.93725)(0.6527,0.94118)(0.6569,0.9451)(0.6611,0.95294)(0.6653,0.95686)(0.6695,0.96471)(0.6736,0.96863)(0.6778,0.97647)(0.682,0.98039)(0.6862,0.98824)(0.6904,0.99216)(0.6946,1)(0.6987,1)(0.7029,1)(0.7071,1)(0.7113,1)(0.7155,1)(0.7197,1)(0.7238,1)(0.728,1)(0.7322,1)(0.7364,1)(0.7406,1)(0.7448,1)(0.749,1)(0.7531,1)(0.7573,1)(0.7615,1)(0.7657,1)(0.7699,1)(0.7741,1)(0.7782,1)(0.7824,1)(0.7866,1)(0.7908,1)(0.795,1)(0.7992,1)(0.8033,1)(0.8075,1)(0.8117,1)(0.8159,1)(0.8201,1)(0.8243,1)(0.8285,1)(0.8326,1)(0.8368,1)(0.841,1)(0.8452,1)(0.8494,1)(0.8536,1)(0.8577,1)(0.8619,1)(0.8661,1)(0.8703,1)(0.8745,1)(0.8787,1)(0.8828,1)(0.887,1)(0.8912,1)(0.8954,1)(0.8996,1)(0.9038,1)(0.9079,1)(0.9121,1)(0.9163,1)(0.9205,1)(0.9247,1)(0.9289,1)(0.9331,1)(0.9372,1)(0.9414,1)(0.9456,1)(0.9498,1)(0.954,1)(0.9582,1)(0.9623,1)(0.9665,1)(0.9707,1)(0.9749,1)(0.9791,1)(0.9833,1)(0.9874,1)(0.9916,1)(0.9958,1)(1,1) GREEN: (0,0)(0.0042,0)(0.0084,0)(0.0126,0)(0.0167,0)(0.0209,0)(0.0251,0)(0.0293,0)(0.0335,0)(0.0377,0)(0.0418,0)(0.046,0)(0.0502,0)(0.0544,0)(0.0586,0)(0.0628,0)(0.0669,0)(0.0711,0)(0.0753,0)(0.0795,0)(0.0837,0)(0.0879,0)(0.0921,0)(0.0962,0)(0.1004,0)(0.1046,0)(0.1088,0)(0.113,0)(0.1172,0)(0.1213,0)(0.1255,0)(0.1297,0)(0.1339,0)(0.1381,0)(0.1423,0)(0.1464,0)(0.1506,0)(0.1548,0)(0.159,0)(0.1632,0)(0.1674,0)(0.1715,0)(0.1757,0)(0.1799,0)(0.1841,0)(0.1883,0)(0.1925,0)(0.1967,0)(0.2008,0)(0.205,0)(0.2092,0)(0.2134,0)(0.2176,0)(0.2218,0)(0.2259,0)(0.2301,0)(0.2343,0)(0.2385,0)(0.2427,0)(0.2469,0)(0.251,0)(0.2552,0)(0.2594,0)(0.2636,0)(0.2678,0)(0.272,0)(0.2762,0)(0.2803,0)(0.2845,0)(0.2887,0)(0.2929,0)(0.2971,0)(0.3013,0)(0.3054,0)(0.3096,0)(0.3138,0)(0.318,0)(0.3222,0)(0.3264,0)(0.3305,0)(0.3347,0)(0.3389,0)(0.3431,0)(0.3473,0)(0.3515,0)(0.3556,0)(0.3598,0)(0.364,0)(0.3682,0)(0.3724,0)(0.3766,0)(0.3808,0)(0.3849,0)(0.3891,0)(0.3933,0)(0.3975,0)(0.4017,0)(0.4059,0)(0.41,0)(0.4142,0)(0.4184,0)(0.4226,0)(0.4268,0)(0.431,0)(0.4351,0)(0.4393,0)(0.4435,0)(0.4477,0)(0.4519,0)(0.4561,0)(0.4603,0)(0.4644,0)(0.4686,0)(0.4728,0)(0.477,0.0039216)(0.4812,0.011765)(0.4854,0.019608)(0.4895,0.027451)(0.4937,0.035294)(0.4979,0.043137)(0.5021,0.058824)(0.5063,0.066667)(0.5105,0.070588)(0.5146,0.078431)(0.5188,0.086275)(0.523,0.094118)(0.5272,0.10196)(0.5314,0.1098)(0.5356,0.11765)(0.5397,0.12549)(0.5439,0.13725)(0.5481,0.1451)(0.5523,0.15294)(0.5565,0.16078)(0.5607,0.16863)(0.5649,0.17647)(0.569,0.18431)(0.5732,0.19216)(0.5774,0.2)(0.5816,0.20392)(0.5858,0.21176)(0.59,0.21961)(0.5941,0.22745)(0.5983,0.23529)(0.6025,0.24314)(0.6067,0.25098)(0.6109,0.25882)(0.6151,0.26667)(0.6192,0.27059)(0.6234,0.27843)(0.6276,0.29412)(0.6318,0.30196)(0.636,0.3098)(0.6402,0.31765)(0.6444,0.32549)(0.6485,0.33333)(0.6527,0.33725)(0.6569,0.3451)(0.6611,0.35294)(0.6653,0.36078)(0.6695,0.36863)(0.6736,0.37647)(0.6778,0.38431)(0.682,0.39216)(0.6862,0.4)(0.6904,0.40392)(0.6946,0.41176)(0.6987,0.41961)(0.7029,0.42745)(0.7071,0.43529)(0.7113,0.45098)(0.7155,0.45882)(0.7197,0.46667)(0.7238,0.47059)(0.728,0.47843)(0.7322,0.48627)(0.7364,0.49412)(0.7406,0.50196)(0.7448,0.5098)(0.749,0.51765)(0.7531,0.53333)(0.7573,0.53725)(0.7615,0.5451)(0.7657,0.55294)(0.7699,0.56078)(0.7741,0.56863)(0.7782,0.57647)(0.7824,0.58431)(0.7866,0.59216)(0.7908,0.6)(0.795,0.61176)(0.7992,0.61961)(0.8033,0.62745)(0.8075,0.63529)(0.8117,0.64314)(0.8159,0.65098)(0.8201,0.65882)(0.8243,0.66667)(0.8285,0.67059)(0.8326,0.67843)(0.8368,0.68627)(0.841,0.69412)(0.8452,0.70196)(0.8494,0.7098)(0.8536,0.71765)(0.8577,0.72549)(0.8619,0.73333)(0.8661,0.73725)(0.8703,0.7451)(0.8745,0.75294)(0.8787,0.76863)(0.8828,0.77647)(0.887,0.78431)(0.8912,0.79216)(0.8954,0.8)(0.8996,0.80392)(0.9038,0.81176)(0.9079,0.81961)(0.9121,0.82745)(0.9163,0.83529)(0.9205,0.84314)(0.9247,0.85098)(0.9289,0.85882)(0.9331,0.86667)(0.9372,0.87059)(0.9414,0.87843)(0.9456,0.88627)(0.9498,0.89412)(0.954,0.90196)(0.9582,0.9098)(0.9623,0.92549)(0.9665,0.93333)(0.9707,0.93725)(0.9749,0.9451)(0.9791,0.95294)(0.9833,0.96078)(0.9874,0.96863)(0.9916,0.97647)(0.9958,0.98431)(1,0.99216) BLUE: (0,0)(0.0042,0)(0.0084,0)(0.0126,0)(0.0167,0)(0.0209,0)(0.0251,0)(0.0293,0)(0.0335,0)(0.0377,0)(0.0418,0)(0.046,0)(0.0502,0)(0.0544,0)(0.0586,0)(0.0628,0)(0.0669,0)(0.0711,0)(0.0753,0)(0.0795,0)(0.0837,0)(0.0879,0)(0.0921,0)(0.0962,0)(0.1004,0)(0.1046,0)(0.1088,0)(0.113,0)(0.1172,0)(0.1213,0)(0.1255,0)(0.1297,0)(0.1339,0)(0.1381,0)(0.1423,0)(0.1464,0)(0.1506,0)(0.1548,0)(0.159,0)(0.1632,0)(0.1674,0)(0.1715,0)(0.1757,0)(0.1799,0)(0.1841,0)(0.1883,0)(0.1925,0)(0.1967,0)(0.2008,0)(0.205,0)(0.2092,0)(0.2134,0)(0.2176,0)(0.2218,0)(0.2259,0)(0.2301,0)(0.2343,0)(0.2385,0)(0.2427,0)(0.2469,0)(0.251,0)(0.2552,0)(0.2594,0)(0.2636,0)(0.2678,0)(0.272,0)(0.2762,0)(0.2803,0)(0.2845,0)(0.2887,0)(0.2929,0)(0.2971,0)(0.3013,0)(0.3054,0)(0.3096,0)(0.3138,0)(0.318,0)(0.3222,0)(0.3264,0)(0.3305,0)(0.3347,0)(0.3389,0)(0.3431,0)(0.3473,0)(0.3515,0)(0.3556,0)(0.3598,0)(0.364,0)(0.3682,0)(0.3724,0)(0.3766,0)(0.3808,0)(0.3849,0)(0.3891,0)(0.3933,0)(0.3975,0)(0.4017,0)(0.4059,0)(0.41,0)(0.4142,0)(0.4184,0)(0.4226,0)(0.4268,0)(0.431,0)(0.4351,0)(0.4393,0)(0.4435,0)(0.4477,0)(0.4519,0)(0.4561,0)(0.4603,0)(0.4644,0)(0.4686,0)(0.4728,0)(0.477,0)(0.4812,0)(0.4854,0)(0.4895,0)(0.4937,0)(0.4979,0)(0.5021,0)(0.5063,0)(0.5105,0)(0.5146,0)(0.5188,0)(0.523,0)(0.5272,0)(0.5314,0)(0.5356,0)(0.5397,0)(0.5439,0)(0.5481,0)(0.5523,0)(0.5565,0)(0.5607,0)(0.5649,0)(0.569,0)(0.5732,0)(0.5774,0)(0.5816,0)(0.5858,0)(0.59,0)(0.5941,0)(0.5983,0)(0.6025,0)(0.6067,0)(0.6109,0)(0.6151,0)(0.6192,0)(0.6234,0)(0.6276,0)(0.6318,0)(0.636,0)(0.6402,0)(0.6444,0)(0.6485,0)(0.6527,0)(0.6569,0)(0.6611,0)(0.6653,0)(0.6695,0)(0.6736,0)(0.6778,0)(0.682,0)(0.6862,0)(0.6904,0)(0.6946,0)(0.6987,0)(0.7029,0)(0.7071,0)(0.7113,0)(0.7155,0)(0.7197,0)(0.7238,0)(0.728,0)(0.7322,0)(0.7364,0)(0.7406,0)(0.7448,0)(0.749,0)(0.7531,0.027451)(0.7573,0.043137)(0.7615,0.058824)(0.7657,0.07451)(0.7699,0.090196)(0.7741,0.10588)(0.7782,0.12157)(0.7824,0.13725)(0.7866,0.15294)(0.7908,0.16863)(0.795,0.2)(0.7992,0.21176)(0.8033,0.22745)(0.8075,0.24314)(0.8117,0.25882)(0.8159,0.27451)(0.8201,0.2902)(0.8243,0.30588)(0.8285,0.32157)(0.8326,0.33725)(0.8368,0.35294)(0.841,0.36863)(0.8452,0.38431)(0.8494,0.4)(0.8536,0.41176)(0.8577,0.42745)(0.8619,0.44314)(0.8661,0.45882)(0.8703,0.47451)(0.8745,0.4902)(0.8787,0.52157)(0.8828,0.53725)(0.887,0.55294)(0.8912,0.56863)(0.8954,0.58431)(0.8996,0.6)(0.9038,0.61176)(0.9079,0.62745)(0.9121,0.64314)(0.9163,0.65882)(0.9205,0.67451)(0.9247,0.6902)(0.9289,0.70588)(0.9331,0.72157)(0.9372,0.73725)(0.9414,0.75294)(0.9456,0.76863)(0.9498,0.78431)(0.954,0.8)(0.9582,0.81176)(0.9623,0.84314)(0.9665,0.85882)(0.9707,0.87451)(0.9749,0.8902)(0.9791,0.90588)(0.9833,0.92157)(0.9874,0.93725)(0.9916,0.95294)(0.9958,0.96863)(1,0.98431) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_ncar.sao����������������������������������������������������������������������000644 �000765 �000000 �00000020122 12567377777 016674� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # ncar # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,0)(0.005,0)(0.0101,0)(0.0151,0)(0.0201,0)(0.0251,0)(0.0302,0)(0.0352,0)(0.0402,0)(0.0452,0)(0.0503,0)(0.0553,0)(0.0603,0)(0.0653,0)(0.0704,0)(0.0754,0)(0.0804,0)(0.0854,0)(0.0905,0)(0.0955,0)(0.1005,0)(0.1055,0)(0.1106,0)(0.1156,0)(0.1206,0)(0.1256,0)(0.1307,0)(0.1357,0)(0.1407,0)(0.1457,0)(0.1508,0)(0.1558,0)(0.1608,0)(0.1658,0)(0.1709,0)(0.1759,0)(0.1809,0)(0.1859,0)(0.191,0)(0.196,0)(0.201,0)(0.206,0)(0.2111,0)(0.2161,0)(0.2211,0)(0.2261,0)(0.2312,0)(0.2362,0)(0.2412,0)(0.2462,0)(0.2513,0)(0.2563,0)(0.2613,0)(0.2663,0)(0.2714,0)(0.2764,0)(0.2814,0)(0.2864,0)(0.2915,0)(0.2965,0)(0.3015,0)(0.3065,0)(0.3116,0)(0.3166,0.0039216)(0.3216,0.043137)(0.3266,0.082353)(0.3317,0.11765)(0.3367,0.15686)(0.3417,0.19608)(0.3467,0.23137)(0.3518,0.27059)(0.3568,0.3098)(0.3618,0.34902)(0.3668,0.38431)(0.3719,0.40392)(0.3769,0.41569)(0.3819,0.42353)(0.3869,0.43137)(0.392,0.44314)(0.397,0.45098)(0.402,0.45882)(0.407,0.47059)(0.4121,0.47843)(0.4171,0.4902)(0.4221,0.50196)(0.4271,0.52549)(0.4322,0.54902)(0.4372,0.57255)(0.4422,0.6)(0.4472,0.62353)(0.4523,0.64706)(0.4573,0.67059)(0.4623,0.69412)(0.4673,0.72157)(0.4724,0.7451)(0.4774,0.76863)(0.4824,0.79216)(0.4874,0.81569)(0.4925,0.83922)(0.4975,0.86275)(0.5025,0.88627)(0.5075,0.9098)(0.5126,0.93333)(0.5176,0.95686)(0.5226,0.98039)(0.5276,1)(0.5327,1)(0.5377,1)(0.5427,1)(0.5477,1)(0.5528,1)(0.5578,1)(0.5628,1)(0.5678,1)(0.5729,1)(0.5779,1)(0.5829,1)(0.5879,1)(0.593,1)(0.598,1)(0.603,1)(0.608,1)(0.6131,1)(0.6181,1)(0.6231,1)(0.6281,1)(0.6332,1)(0.6382,1)(0.6432,1)(0.6482,1)(0.6533,1)(0.6583,1)(0.6633,1)(0.6683,1)(0.6734,1)(0.6784,1)(0.6834,1)(0.6884,1)(0.6935,1)(0.6985,1)(0.7035,1)(0.7085,1)(0.7136,1)(0.7186,1)(0.7236,1)(0.7286,1)(0.7337,1)(0.7387,1)(0.7437,1)(0.7487,1)(0.7538,1)(0.7588,1)(0.7638,1)(0.7688,1)(0.7739,1)(0.7789,1)(0.7839,1)(0.7889,1)(0.794,0.96471)(0.799,0.92549)(0.804,0.8902)(0.809,0.85098)(0.8141,0.81569)(0.8191,0.77647)(0.8241,0.74118)(0.8291,0.70196)(0.8342,0.66667)(0.8392,0.62745)(0.8442,0.61961)(0.8492,0.65098)(0.8543,0.68235)(0.8593,0.71373)(0.8643,0.7451)(0.8693,0.77255)(0.8744,0.80392)(0.8794,0.83529)(0.8844,0.86667)(0.8894,0.89804)(0.8945,0.92941)(0.8995,0.93333)(0.9045,0.93725)(0.9095,0.93725)(0.9146,0.94118)(0.9196,0.9451)(0.9246,0.9451)(0.9296,0.94902)(0.9347,0.95294)(0.9397,0.95294)(0.9447,0.95686)(0.9497,0.96078)(0.9548,0.96471)(0.9598,0.96863)(0.9648,0.97255)(0.9698,0.97647)(0.9749,0.98039)(0.9799,0.98431)(0.9849,0.98824)(0.9899,0.99216)(0.995,0.99608)(1,1) GREEN: (0,0)(0.005,0.035294)(0.0101,0.07451)(0.0151,0.1098)(0.0201,0.14902)(0.0251,0.18431)(0.0302,0.22353)(0.0352,0.25882)(0.0402,0.29804)(0.0452,0.33333)(0.0503,0.37255)(0.0553,0.36863)(0.0603,0.33333)(0.0653,0.29412)(0.0704,0.25882)(0.0754,0.21961)(0.0804,0.18431)(0.0854,0.1451)(0.0905,0.1098)(0.0955,0.070588)(0.1005,0.035294)(0.1055,0)(0.1106,0.07451)(0.1156,0.1451)(0.1206,0.21569)(0.1256,0.28627)(0.1307,0.36078)(0.1357,0.43137)(0.1407,0.50196)(0.1457,0.57255)(0.1508,0.64706)(0.1558,0.71765)(0.1608,0.76078)(0.1658,0.78431)(0.1709,0.80784)(0.1759,0.83137)(0.1809,0.8549)(0.1859,0.88235)(0.191,0.90588)(0.196,0.92941)(0.201,0.95294)(0.206,0.97647)(0.2111,0.99608)(0.2161,0.99608)(0.2211,0.99216)(0.2261,0.99216)(0.2312,0.99216)(0.2362,0.98824)(0.2412,0.98824)(0.2462,0.98431)(0.2513,0.98431)(0.2563,0.98039)(0.2613,0.98039)(0.2663,0.98039)(0.2714,0.98039)(0.2764,0.98431)(0.2814,0.98431)(0.2864,0.98824)(0.2915,0.98824)(0.2965,0.99216)(0.3015,0.99216)(0.3065,0.99608)(0.3116,0.99608)(0.3166,0.99608)(0.3216,0.97647)(0.3266,0.95686)(0.3317,0.93725)(0.3367,0.92157)(0.3417,0.90196)(0.3467,0.88235)(0.3518,0.86275)(0.3568,0.84706)(0.3618,0.82745)(0.3668,0.80784)(0.3719,0.81569)(0.3769,0.83529)(0.3819,0.85098)(0.3869,0.87059)(0.392,0.8902)(0.397,0.9098)(0.402,0.92549)(0.407,0.9451)(0.4121,0.96471)(0.4171,0.98431)(0.4221,1)(0.4271,1)(0.4322,1)(0.4372,1)(0.4422,1)(0.4472,1)(0.4523,1)(0.4573,1)(0.4623,1)(0.4673,1)(0.4724,1)(0.4774,1)(0.4824,1)(0.4874,1)(0.4925,1)(0.4975,1)(0.5025,1)(0.5075,1)(0.5126,1)(0.5176,1)(0.5226,1)(0.5276,0.99216)(0.5327,0.98039)(0.5377,0.96471)(0.5427,0.94902)(0.5477,0.93333)(0.5528,0.91765)(0.5578,0.90588)(0.5628,0.8902)(0.5678,0.87451)(0.5729,0.85882)(0.5779,0.84314)(0.5829,0.83137)(0.5879,0.81961)(0.593,0.81176)(0.598,0.8)(0.603,0.78824)(0.608,0.77647)(0.6131,0.76471)(0.6181,0.75294)(0.6231,0.74118)(0.6281,0.72941)(0.6332,0.7098)(0.6382,0.66667)(0.6432,0.62353)(0.6482,0.58039)(0.6533,0.53725)(0.6583,0.49412)(0.6633,0.45098)(0.6683,0.40392)(0.6734,0.36078)(0.6784,0.31765)(0.6834,0.27451)(0.6884,0.24706)(0.6935,0.21961)(0.6985,0.19608)(0.7035,0.16863)(0.7085,0.1451)(0.7136,0.11765)(0.7186,0.090196)(0.7236,0.066667)(0.7286,0.039216)(0.7337,0.015686)(0.7387,0)(0.7437,0)(0.7487,0)(0.7538,0)(0.7588,0)(0.7638,0)(0.7688,0)(0.7739,0)(0.7789,0)(0.7839,0)(0.7889,0)(0.794,0.015686)(0.799,0.031373)(0.804,0.05098)(0.809,0.066667)(0.8141,0.086275)(0.8191,0.10588)(0.8241,0.12157)(0.8291,0.14118)(0.8342,0.15686)(0.8392,0.17647)(0.8442,0.2)(0.8492,0.23137)(0.8543,0.25882)(0.8593,0.2902)(0.8643,0.32157)(0.8693,0.35294)(0.8744,0.38431)(0.8794,0.41569)(0.8844,0.44314)(0.8894,0.47451)(0.8945,0.50588)(0.8995,0.52941)(0.9045,0.55294)(0.9095,0.57255)(0.9146,0.59608)(0.9196,0.61961)(0.9246,0.64314)(0.9296,0.66275)(0.9347,0.68627)(0.9397,0.7098)(0.9447,0.72941)(0.9497,0.75294)(0.9548,0.78039)(0.9598,0.80392)(0.9648,0.82745)(0.9698,0.85098)(0.9749,0.87451)(0.9799,0.90196)(0.9849,0.92549)(0.9899,0.94902)(0.995,0.97255)(1,1) BLUE: (0,0.50196)(0.005,0.45098)(0.0101,0.40392)(0.0151,0.35686)(0.0201,0.3098)(0.0251,0.25882)(0.0302,0.21176)(0.0352,0.16471)(0.0402,0.11765)(0.0452,0.070588)(0.0503,0.019608)(0.0553,0.047059)(0.0603,0.1451)(0.0653,0.23922)(0.0704,0.33333)(0.0754,0.43137)(0.0804,0.52549)(0.0854,0.61961)(0.0905,0.71765)(0.0955,0.81176)(0.1005,0.90588)(0.1055,1)(0.1106,1)(0.1156,1)(0.1206,1)(0.1256,1)(0.1307,1)(0.1357,1)(0.1407,1)(0.1457,1)(0.1508,1)(0.1558,1)(0.1608,1)(0.1658,1)(0.1709,1)(0.1759,1)(0.1809,1)(0.1859,1)(0.191,1)(0.196,1)(0.201,1)(0.206,1)(0.2111,0.99216)(0.2161,0.95686)(0.2211,0.91765)(0.2261,0.88235)(0.2312,0.84314)(0.2362,0.80392)(0.2412,0.76863)(0.2462,0.72941)(0.2513,0.6902)(0.2563,0.6549)(0.2613,0.61569)(0.2663,0.56471)(0.2714,0.5098)(0.2764,0.45098)(0.2814,0.39216)(0.2864,0.33333)(0.2915,0.27843)(0.2965,0.21961)(0.3015,0.16078)(0.3065,0.10588)(0.3116,0.047059)(0.3166,0)(0.3216,0)(0.3266,0)(0.3317,0)(0.3367,0)(0.3417,0)(0.3467,0)(0.3518,0)(0.3568,0)(0.3618,0)(0.3668,0)(0.3719,0)(0.3769,0)(0.3819,0)(0.3869,0)(0.392,0)(0.397,0)(0.402,0)(0.407,0)(0.4121,0)(0.4171,0)(0.4221,0.0039216)(0.4271,0.027451)(0.4322,0.05098)(0.4372,0.07451)(0.4422,0.094118)(0.4472,0.11765)(0.4523,0.14118)(0.4573,0.16471)(0.4623,0.18824)(0.4673,0.21176)(0.4724,0.23529)(0.4774,0.22353)(0.4824,0.2)(0.4874,0.17647)(0.4925,0.15294)(0.4975,0.12941)(0.5025,0.1098)(0.5075,0.086275)(0.5126,0.062745)(0.5176,0.039216)(0.5226,0.015686)(0.5276,0)(0.5327,0)(0.5377,0)(0.5427,0)(0.5477,0)(0.5528,0)(0.5578,0)(0.5628,0)(0.5678,0)(0.5729,0)(0.5779,0)(0.5829,0.0039216)(0.5879,0.0078431)(0.593,0.011765)(0.598,0.019608)(0.603,0.023529)(0.608,0.031373)(0.6131,0.035294)(0.6181,0.043137)(0.6231,0.047059)(0.6281,0.054902)(0.6332,0.054902)(0.6382,0.05098)(0.6432,0.043137)(0.6482,0.039216)(0.6533,0.031373)(0.6583,0.027451)(0.6633,0.019608)(0.6683,0.015686)(0.6734,0.011765)(0.6784,0.0039216)(0.6834,0)(0.6884,0)(0.6935,0)(0.6985,0)(0.7035,0)(0.7085,0)(0.7136,0)(0.7186,0)(0.7236,0)(0.7286,0)(0.7337,0)(0.7387,0.031373)(0.7437,0.12941)(0.7487,0.22353)(0.7538,0.32157)(0.7588,0.41569)(0.7638,0.5098)(0.7688,0.60784)(0.7739,0.70196)(0.7789,0.79608)(0.7839,0.89412)(0.7889,0.98824)(0.794,1)(0.799,1)(0.804,1)(0.809,1)(0.8141,1)(0.8191,1)(0.8241,1)(0.8291,1)(0.8342,1)(0.8392,1)(0.8442,0.99608)(0.8492,0.98824)(0.8543,0.98431)(0.8593,0.97647)(0.8643,0.96863)(0.8693,0.96471)(0.8744,0.95686)(0.8794,0.94902)(0.8844,0.9451)(0.8894,0.93725)(0.8945,0.93333)(0.8995,0.93333)(0.9045,0.93725)(0.9095,0.93725)(0.9146,0.94118)(0.9196,0.9451)(0.9246,0.9451)(0.9296,0.94902)(0.9347,0.95294)(0.9397,0.95294)(0.9447,0.95686)(0.9497,0.96078)(0.9548,0.96471)(0.9598,0.96863)(0.9648,0.97255)(0.9698,0.97647)(0.9749,0.98039)(0.9799,0.98431)(0.9849,0.98824)(0.9899,0.99216)(0.995,0.99608)(1,1) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_rainbow.sao�������������������������������������������������������������������000644 �000765 �000000 �00000020713 12567377777 017420� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # rainbow # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,1)(0.0042,1)(0.0084,1)(0.0126,1)(0.0167,1)(0.0209,1)(0.0251,1)(0.0293,1)(0.0335,1)(0.0377,1)(0.0418,1)(0.046,1)(0.0502,1)(0.0544,1)(0.0586,1)(0.0628,1)(0.0669,1)(0.0711,1)(0.0753,1)(0.0795,1)(0.0837,1)(0.0879,1)(0.0921,1)(0.0962,1)(0.1004,1)(0.1046,1)(0.1088,1)(0.113,1)(0.1172,1)(0.1213,1)(0.1255,1)(0.1297,1)(0.1339,1)(0.1381,1)(0.1423,1)(0.1464,1)(0.1506,1)(0.1548,1)(0.159,1)(0.1632,1)(0.1674,1)(0.1715,1)(0.1757,1)(0.1799,1)(0.1841,1)(0.1883,1)(0.1925,1)(0.1967,1)(0.2008,1)(0.205,1)(0.2092,1)(0.2134,1)(0.2176,1)(0.2218,0.96078)(0.2259,0.94118)(0.2301,0.92157)(0.2343,0.89804)(0.2385,0.87843)(0.2427,0.85882)(0.2469,0.83529)(0.251,0.81569)(0.2552,0.79216)(0.2594,0.77255)(0.2636,0.75294)(0.2678,0.72941)(0.272,0.7098)(0.2762,0.68627)(0.2803,0.66667)(0.2845,0.62353)(0.2887,0.60392)(0.2929,0.58431)(0.2971,0.56078)(0.3013,0.54118)(0.3054,0.51765)(0.3096,0.49804)(0.3138,0.47843)(0.318,0.4549)(0.3222,0.43529)(0.3264,0.41569)(0.3305,0.39216)(0.3347,0.37255)(0.3389,0.34902)(0.3431,0.32941)(0.3473,0.28627)(0.3515,0.26667)(0.3556,0.24706)(0.3598,0.22353)(0.364,0.20392)(0.3682,0.18039)(0.3724,0.16078)(0.3766,0.14118)(0.3808,0.11765)(0.3849,0.098039)(0.3891,0.07451)(0.3933,0.054902)(0.3975,0.035294)(0.4017,0.011765)(0.4059,0)(0.41,0)(0.4142,0)(0.4184,0)(0.4226,0)(0.4268,0)(0.431,0)(0.4351,0)(0.4393,0)(0.4435,0)(0.4477,0)(0.4519,0)(0.4561,0)(0.4603,0)(0.4644,0)(0.4686,0)(0.4728,0)(0.477,0)(0.4812,0)(0.4854,0)(0.4895,0)(0.4937,0)(0.4979,0)(0.5021,0)(0.5063,0)(0.5105,0)(0.5146,0)(0.5188,0)(0.523,0)(0.5272,0)(0.5314,0)(0.5356,0)(0.5397,0)(0.5439,0)(0.5481,0)(0.5523,0)(0.5565,0)(0.5607,0)(0.5649,0)(0.569,0)(0.5732,0)(0.5774,0)(0.5816,0)(0.5858,0)(0.59,0)(0.5941,0)(0.5983,0)(0.6025,0)(0.6067,0)(0.6109,0)(0.6151,0)(0.6192,0)(0.6234,0)(0.6276,0)(0.6318,0)(0.636,0)(0.6402,0)(0.6444,0)(0.6485,0)(0.6527,0)(0.6569,0)(0.6611,0)(0.6653,0)(0.6695,0)(0.6736,0)(0.6778,0)(0.682,0)(0.6862,0)(0.6904,0)(0.6946,0)(0.6987,0)(0.7029,0)(0.7071,0)(0.7113,0)(0.7155,0)(0.7197,0)(0.7238,0)(0.728,0)(0.7322,0)(0.7364,0)(0.7406,0)(0.7448,0)(0.749,0)(0.7531,0)(0.7573,0)(0.7615,0)(0.7657,0)(0.7699,0)(0.7741,0)(0.7782,0.0078431)(0.7824,0.027451)(0.7866,0.070588)(0.7908,0.094118)(0.795,0.11373)(0.7992,0.13333)(0.8033,0.15686)(0.8075,0.17647)(0.8117,0.19608)(0.8159,0.21961)(0.8201,0.23922)(0.8243,0.26275)(0.8285,0.28235)(0.8326,0.30196)(0.8368,0.32549)(0.841,0.3451)(0.8452,0.36471)(0.8494,0.40784)(0.8536,0.43137)(0.8577,0.45098)(0.8619,0.47059)(0.8661,0.49412)(0.8703,0.51373)(0.8745,0.53333)(0.8787,0.55686)(0.8828,0.57647)(0.887,0.6)(0.8912,0.61961)(0.8954,0.63922)(0.8996,0.66275)(0.9038,0.68235)(0.9079,0.70588)(0.9121,0.7451)(0.9163,0.76863)(0.9205,0.78824)(0.9247,0.80784)(0.9289,0.83137)(0.9331,0.85098)(0.9372,0.87451)(0.9414,0.89412)(0.9456,0.91373)(0.9498,0.93725)(0.954,0.95686)(0.9582,0.97647)(0.9623,1)(0.9665,1)(0.9707,1)(0.9749,1)(0.9791,1)(0.9833,1)(0.9874,1)(0.9916,1)(0.9958,1)(1,1) GREEN: (0,0)(0.0042,0)(0.0084,0)(0.0126,0)(0.0167,0)(0.0209,0)(0.0251,0)(0.0293,0)(0.0335,0.019608)(0.0377,0.043137)(0.0418,0.062745)(0.046,0.086275)(0.0502,0.10588)(0.0544,0.12549)(0.0586,0.14902)(0.0628,0.16863)(0.0669,0.18824)(0.0711,0.21176)(0.0753,0.23137)(0.0795,0.2549)(0.0837,0.27451)(0.0879,0.29412)(0.0921,0.31765)(0.0962,0.35686)(0.1004,0.38039)(0.1046,0.4)(0.1088,0.42353)(0.113,0.44314)(0.1172,0.46275)(0.1213,0.48627)(0.1255,0.50588)(0.1297,0.52941)(0.1339,0.54902)(0.1381,0.56863)(0.1423,0.59216)(0.1464,0.61176)(0.1506,0.63137)(0.1548,0.6549)(0.159,0.69804)(0.1632,0.71765)(0.1674,0.73725)(0.1715,0.76078)(0.1757,0.78039)(0.1799,0.8)(0.1841,0.82353)(0.1883,0.84314)(0.1925,0.86667)(0.1967,0.88627)(0.2008,0.90588)(0.205,0.92941)(0.2092,0.94902)(0.2134,0.96863)(0.2176,0.99216)(0.2218,1)(0.2259,1)(0.2301,1)(0.2343,1)(0.2385,1)(0.2427,1)(0.2469,1)(0.251,1)(0.2552,1)(0.2594,1)(0.2636,1)(0.2678,1)(0.272,1)(0.2762,1)(0.2803,1)(0.2845,1)(0.2887,1)(0.2929,1)(0.2971,1)(0.3013,1)(0.3054,1)(0.3096,1)(0.3138,1)(0.318,1)(0.3222,1)(0.3264,1)(0.3305,1)(0.3347,1)(0.3389,1)(0.3431,1)(0.3473,1)(0.3515,1)(0.3556,1)(0.3598,1)(0.364,1)(0.3682,1)(0.3724,1)(0.3766,1)(0.3808,1)(0.3849,1)(0.3891,1)(0.3933,1)(0.3975,1)(0.4017,1)(0.4059,1)(0.41,1)(0.4142,1)(0.4184,1)(0.4226,1)(0.4268,1)(0.431,1)(0.4351,1)(0.4393,1)(0.4435,1)(0.4477,1)(0.4519,1)(0.4561,1)(0.4603,1)(0.4644,1)(0.4686,1)(0.4728,1)(0.477,1)(0.4812,1)(0.4854,1)(0.4895,1)(0.4937,1)(0.4979,1)(0.5021,1)(0.5063,1)(0.5105,1)(0.5146,1)(0.5188,1)(0.523,1)(0.5272,1)(0.5314,1)(0.5356,1)(0.5397,1)(0.5439,1)(0.5481,1)(0.5523,1)(0.5565,1)(0.5607,1)(0.5649,1)(0.569,1)(0.5732,1)(0.5774,1)(0.5816,1)(0.5858,1)(0.59,1)(0.5941,0.98039)(0.5983,0.93725)(0.6025,0.91765)(0.6067,0.89412)(0.6109,0.87451)(0.6151,0.8549)(0.6192,0.83137)(0.6234,0.81176)(0.6276,0.78824)(0.6318,0.76863)(0.636,0.74902)(0.6402,0.72549)(0.6444,0.70588)(0.6485,0.68235)(0.6527,0.66275)(0.6569,0.64314)(0.6611,0.6)(0.6653,0.58039)(0.6695,0.55686)(0.6736,0.53725)(0.6778,0.51373)(0.682,0.49412)(0.6862,0.47451)(0.6904,0.45098)(0.6946,0.43137)(0.6987,0.41176)(0.7029,0.38824)(0.7071,0.36863)(0.7113,0.3451)(0.7155,0.32549)(0.7197,0.30588)(0.7238,0.26275)(0.728,0.24314)(0.7322,0.21961)(0.7364,0.2)(0.7406,0.17647)(0.7448,0.15686)(0.749,0.13725)(0.7531,0.11373)(0.7573,0.094118)(0.7615,0.070588)(0.7657,0.05098)(0.7699,0.031373)(0.7741,0.0078431)(0.7782,0)(0.7824,0)(0.7866,0)(0.7908,0)(0.795,0)(0.7992,0)(0.8033,0)(0.8075,0)(0.8117,0)(0.8159,0)(0.8201,0)(0.8243,0)(0.8285,0)(0.8326,0)(0.8368,0)(0.841,0)(0.8452,0)(0.8494,0)(0.8536,0)(0.8577,0)(0.8619,0)(0.8661,0)(0.8703,0)(0.8745,0)(0.8787,0)(0.8828,0)(0.887,0)(0.8912,0)(0.8954,0)(0.8996,0)(0.9038,0)(0.9079,0)(0.9121,0)(0.9163,0)(0.9205,0)(0.9247,0)(0.9289,0)(0.9331,0)(0.9372,0)(0.9414,0)(0.9456,0)(0.9498,0)(0.954,0)(0.9582,0)(0.9623,0)(0.9665,0)(0.9707,0)(0.9749,0)(0.9791,0)(0.9833,0)(0.9874,0)(0.9916,0)(0.9958,0)(1,0) BLUE: (0,0.16471)(0.0042,0.14118)(0.0084,0.12157)(0.0126,0.10196)(0.0167,0.078431)(0.0209,0.058824)(0.0251,0.039216)(0.0293,0.015686)(0.0335,0)(0.0377,0)(0.0418,0)(0.046,0)(0.0502,0)(0.0544,0)(0.0586,0)(0.0628,0)(0.0669,0)(0.0711,0)(0.0753,0)(0.0795,0)(0.0837,0)(0.0879,0)(0.0921,0)(0.0962,0)(0.1004,0)(0.1046,0)(0.1088,0)(0.113,0)(0.1172,0)(0.1213,0)(0.1255,0)(0.1297,0)(0.1339,0)(0.1381,0)(0.1423,0)(0.1464,0)(0.1506,0)(0.1548,0)(0.159,0)(0.1632,0)(0.1674,0)(0.1715,0)(0.1757,0)(0.1799,0)(0.1841,0)(0.1883,0)(0.1925,0)(0.1967,0)(0.2008,0)(0.205,0)(0.2092,0)(0.2134,0)(0.2176,0)(0.2218,0)(0.2259,0)(0.2301,0)(0.2343,0)(0.2385,0)(0.2427,0)(0.2469,0)(0.251,0)(0.2552,0)(0.2594,0)(0.2636,0)(0.2678,0)(0.272,0)(0.2762,0)(0.2803,0)(0.2845,0)(0.2887,0)(0.2929,0)(0.2971,0)(0.3013,0)(0.3054,0)(0.3096,0)(0.3138,0)(0.318,0)(0.3222,0)(0.3264,0)(0.3305,0)(0.3347,0)(0.3389,0)(0.3431,0)(0.3473,0)(0.3515,0)(0.3556,0)(0.3598,0)(0.364,0)(0.3682,0)(0.3724,0)(0.3766,0)(0.3808,0)(0.3849,0)(0.3891,0)(0.3933,0)(0.3975,0)(0.4017,0)(0.4059,0.0039216)(0.41,0.047059)(0.4142,0.066667)(0.4184,0.090196)(0.4226,0.1098)(0.4268,0.12941)(0.431,0.15294)(0.4351,0.17255)(0.4393,0.19216)(0.4435,0.21569)(0.4477,0.23529)(0.4519,0.25882)(0.4561,0.27843)(0.4603,0.29804)(0.4644,0.32157)(0.4686,0.34118)(0.4728,0.38431)(0.477,0.40392)(0.4812,0.42745)(0.4854,0.44706)(0.4895,0.46667)(0.4937,0.4902)(0.4979,0.5098)(0.5021,0.52941)(0.5063,0.55294)(0.5105,0.57255)(0.5146,0.59608)(0.5188,0.61569)(0.523,0.63529)(0.5272,0.65882)(0.5314,0.67843)(0.5356,0.72157)(0.5397,0.74118)(0.5439,0.76471)(0.5481,0.78431)(0.5523,0.80392)(0.5565,0.82745)(0.5607,0.84706)(0.5649,0.87059)(0.569,0.8902)(0.5732,0.9098)(0.5774,0.93333)(0.5816,0.95294)(0.5858,0.97255)(0.59,0.99608)(0.5941,1)(0.5983,1)(0.6025,1)(0.6067,1)(0.6109,1)(0.6151,1)(0.6192,1)(0.6234,1)(0.6276,1)(0.6318,1)(0.636,1)(0.6402,1)(0.6444,1)(0.6485,1)(0.6527,1)(0.6569,1)(0.6611,1)(0.6653,1)(0.6695,1)(0.6736,1)(0.6778,1)(0.682,1)(0.6862,1)(0.6904,1)(0.6946,1)(0.6987,1)(0.7029,1)(0.7071,1)(0.7113,1)(0.7155,1)(0.7197,1)(0.7238,1)(0.728,1)(0.7322,1)(0.7364,1)(0.7406,1)(0.7448,1)(0.749,1)(0.7531,1)(0.7573,1)(0.7615,1)(0.7657,1)(0.7699,1)(0.7741,1)(0.7782,1)(0.7824,1)(0.7866,1)(0.7908,1)(0.795,1)(0.7992,1)(0.8033,1)(0.8075,1)(0.8117,1)(0.8159,1)(0.8201,1)(0.8243,1)(0.8285,1)(0.8326,1)(0.8368,1)(0.841,1)(0.8452,1)(0.8494,1)(0.8536,1)(0.8577,1)(0.8619,1)(0.8661,1)(0.8703,1)(0.8745,1)(0.8787,1)(0.8828,1)(0.887,1)(0.8912,1)(0.8954,1)(0.8996,1)(0.9038,1)(0.9079,1)(0.9121,1)(0.9163,1)(0.9205,1)(0.9247,1)(0.9289,1)(0.9331,1)(0.9372,1)(0.9414,1)(0.9456,1)(0.9498,1)(0.954,1)(0.9582,1)(0.9623,0.99608)(0.9665,0.97647)(0.9707,0.95294)(0.9749,0.91373)(0.9791,0.8902)(0.9833,0.87059)(0.9874,0.85098)(0.9916,0.82745)(0.9958,0.80784)(1,0.78824) �����������������������������������������������������saods9/ds9/cmaps/gist_stern.sao���������������������������������������������������������������������000644 �000765 �000000 �00000026274 12567377777 017122� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # stern # created by cptutils 1.46 # Wed Aug 15 23:30:59 2012 PSEUDOCOLOR RED: (0,0)(0.0042,0.070588)(0.0084,0.14118)(0.0126,0.21176)(0.0167,0.28235)(0.0209,0.35294)(0.0251,0.42353)(0.0293,0.49804)(0.0335,0.56863)(0.0377,0.63922)(0.0418,0.78039)(0.046,0.85098)(0.0502,0.92157)(0.0544,0.99608)(0.0586,0.97647)(0.0628,0.95686)(0.0669,0.93725)(0.0711,0.91765)(0.0753,0.89804)(0.0795,0.87451)(0.0837,0.8549)(0.0879,0.83529)(0.0921,0.81569)(0.0962,0.79608)(0.1004,0.77255)(0.1046,0.75294)(0.1088,0.73333)(0.113,0.71373)(0.1172,0.69412)(0.1213,0.67451)(0.1255,0.63137)(0.1297,0.61176)(0.1339,0.59216)(0.1381,0.57255)(0.1423,0.54902)(0.1464,0.52941)(0.1506,0.5098)(0.1548,0.4902)(0.159,0.47059)(0.1632,0.45098)(0.1674,0.42745)(0.1715,0.40784)(0.1757,0.38824)(0.1799,0.36863)(0.1841,0.34902)(0.1883,0.32549)(0.1925,0.30588)(0.1967,0.28627)(0.2008,0.26667)(0.205,0.24706)(0.2092,0.20392)(0.2134,0.18431)(0.2176,0.16471)(0.2218,0.1451)(0.2259,0.12549)(0.2301,0.10196)(0.2343,0.082353)(0.2385,0.062745)(0.2427,0.043137)(0.2469,0.023529)(0.251,0.25098)(0.2552,0.2549)(0.2594,0.25882)(0.2636,0.26275)(0.2678,0.26667)(0.272,0.27059)(0.2762,0.27451)(0.2803,0.27843)(0.2845,0.28235)(0.2887,0.28627)(0.2929,0.29412)(0.2971,0.29804)(0.3013,0.30196)(0.3054,0.30588)(0.3096,0.3098)(0.3138,0.31373)(0.318,0.31765)(0.3222,0.32157)(0.3264,0.32549)(0.3305,0.32941)(0.3347,0.33333)(0.3389,0.33725)(0.3431,0.34118)(0.3473,0.3451)(0.3515,0.34902)(0.3556,0.35294)(0.3598,0.35686)(0.364,0.36078)(0.3682,0.36471)(0.3724,0.36863)(0.3766,0.37647)(0.3808,0.38039)(0.3849,0.38431)(0.3891,0.38824)(0.3933,0.39216)(0.3975,0.39608)(0.4017,0.4)(0.4059,0.40392)(0.41,0.40784)(0.4142,0.41176)(0.4184,0.41569)(0.4226,0.41961)(0.4268,0.42353)(0.431,0.42745)(0.4351,0.43137)(0.4393,0.43529)(0.4435,0.43922)(0.4477,0.44314)(0.4519,0.44706)(0.4561,0.45098)(0.4603,0.45882)(0.4644,0.46275)(0.4686,0.46667)(0.4728,0.47059)(0.477,0.47451)(0.4812,0.47843)(0.4854,0.48235)(0.4895,0.48627)(0.4937,0.4902)(0.4979,0.49412)(0.5021,0.50196)(0.5063,0.50588)(0.5105,0.5098)(0.5146,0.51373)(0.5188,0.51765)(0.523,0.52157)(0.5272,0.52549)(0.5314,0.52941)(0.5356,0.53333)(0.5397,0.53725)(0.5439,0.5451)(0.5481,0.54902)(0.5523,0.55294)(0.5565,0.55686)(0.5607,0.56078)(0.5649,0.56471)(0.569,0.56863)(0.5732,0.57255)(0.5774,0.57647)(0.5816,0.58039)(0.5858,0.58431)(0.59,0.58824)(0.5941,0.59216)(0.5983,0.59608)(0.6025,0.6)(0.6067,0.60392)(0.6109,0.60784)(0.6151,0.61176)(0.6192,0.61569)(0.6234,0.61961)(0.6276,0.62745)(0.6318,0.63137)(0.636,0.63529)(0.6402,0.63922)(0.6444,0.64314)(0.6485,0.64706)(0.6527,0.65098)(0.6569,0.6549)(0.6611,0.65882)(0.6653,0.66275)(0.6695,0.66667)(0.6736,0.67059)(0.6778,0.67451)(0.682,0.67843)(0.6862,0.68235)(0.6904,0.68627)(0.6946,0.6902)(0.6987,0.69412)(0.7029,0.69804)(0.7071,0.70196)(0.7113,0.7098)(0.7155,0.71373)(0.7197,0.71765)(0.7238,0.72157)(0.728,0.72549)(0.7322,0.72941)(0.7364,0.73333)(0.7406,0.73725)(0.7448,0.74118)(0.749,0.7451)(0.7531,0.75294)(0.7573,0.75686)(0.7615,0.76078)(0.7657,0.76471)(0.7699,0.76863)(0.7741,0.77255)(0.7782,0.77647)(0.7824,0.78039)(0.7866,0.78431)(0.7908,0.78824)(0.795,0.79608)(0.7992,0.8)(0.8033,0.80392)(0.8075,0.80784)(0.8117,0.81176)(0.8159,0.81569)(0.8201,0.81961)(0.8243,0.82353)(0.8285,0.82745)(0.8326,0.83137)(0.8368,0.83529)(0.841,0.83922)(0.8452,0.84314)(0.8494,0.84706)(0.8536,0.85098)(0.8577,0.8549)(0.8619,0.85882)(0.8661,0.86275)(0.8703,0.86667)(0.8745,0.87059)(0.8787,0.87843)(0.8828,0.88235)(0.887,0.88627)(0.8912,0.8902)(0.8954,0.89412)(0.8996,0.89804)(0.9038,0.90196)(0.9079,0.90588)(0.9121,0.9098)(0.9163,0.91373)(0.9205,0.91765)(0.9247,0.92157)(0.9289,0.92549)(0.9331,0.92941)(0.9372,0.93333)(0.9414,0.93725)(0.9456,0.94118)(0.9498,0.9451)(0.954,0.94902)(0.9582,0.95294)(0.9623,0.96078)(0.9665,0.96471)(0.9707,0.96863)(0.9749,0.97255)(0.9791,0.97647)(0.9833,0.98039)(0.9874,0.98431)(0.9916,0.98824)(0.9958,0.99216)(1,0.99608) GREEN: (0,0)(0.0042,0.0039216)(0.0084,0.0078431)(0.0126,0.011765)(0.0167,0.015686)(0.0209,0.019608)(0.0251,0.023529)(0.0293,0.027451)(0.0335,0.031373)(0.0377,0.035294)(0.0418,0.043137)(0.046,0.047059)(0.0502,0.05098)(0.0544,0.054902)(0.0586,0.058824)(0.0628,0.062745)(0.0669,0.066667)(0.0711,0.070588)(0.0753,0.07451)(0.0795,0.078431)(0.0837,0.082353)(0.0879,0.086275)(0.0921,0.090196)(0.0962,0.094118)(0.1004,0.098039)(0.1046,0.10196)(0.1088,0.10588)(0.113,0.1098)(0.1172,0.11373)(0.1213,0.11765)(0.1255,0.12549)(0.1297,0.12941)(0.1339,0.13333)(0.1381,0.13725)(0.1423,0.14118)(0.1464,0.1451)(0.1506,0.14902)(0.1548,0.15294)(0.159,0.15686)(0.1632,0.16078)(0.1674,0.16471)(0.1715,0.16863)(0.1757,0.17255)(0.1799,0.17647)(0.1841,0.18039)(0.1883,0.18431)(0.1925,0.18824)(0.1967,0.19216)(0.2008,0.19608)(0.205,0.2)(0.2092,0.20784)(0.2134,0.21176)(0.2176,0.21569)(0.2218,0.21961)(0.2259,0.22353)(0.2301,0.22745)(0.2343,0.23137)(0.2385,0.23529)(0.2427,0.23922)(0.2469,0.24314)(0.251,0.25098)(0.2552,0.2549)(0.2594,0.25882)(0.2636,0.26275)(0.2678,0.26667)(0.272,0.27059)(0.2762,0.27451)(0.2803,0.27843)(0.2845,0.28235)(0.2887,0.28627)(0.2929,0.29412)(0.2971,0.29804)(0.3013,0.30196)(0.3054,0.30588)(0.3096,0.3098)(0.3138,0.31373)(0.318,0.31765)(0.3222,0.32157)(0.3264,0.32549)(0.3305,0.32941)(0.3347,0.33333)(0.3389,0.33725)(0.3431,0.34118)(0.3473,0.3451)(0.3515,0.34902)(0.3556,0.35294)(0.3598,0.35686)(0.364,0.36078)(0.3682,0.36471)(0.3724,0.36863)(0.3766,0.37647)(0.3808,0.38039)(0.3849,0.38431)(0.3891,0.38824)(0.3933,0.39216)(0.3975,0.39608)(0.4017,0.4)(0.4059,0.40392)(0.41,0.40784)(0.4142,0.41176)(0.4184,0.41569)(0.4226,0.41961)(0.4268,0.42353)(0.431,0.42745)(0.4351,0.43137)(0.4393,0.43529)(0.4435,0.43922)(0.4477,0.44314)(0.4519,0.44706)(0.4561,0.45098)(0.4603,0.45882)(0.4644,0.46275)(0.4686,0.46667)(0.4728,0.47059)(0.477,0.47451)(0.4812,0.47843)(0.4854,0.48235)(0.4895,0.48627)(0.4937,0.4902)(0.4979,0.49412)(0.5021,0.50196)(0.5063,0.50588)(0.5105,0.5098)(0.5146,0.51373)(0.5188,0.51765)(0.523,0.52157)(0.5272,0.52549)(0.5314,0.52941)(0.5356,0.53333)(0.5397,0.53725)(0.5439,0.5451)(0.5481,0.54902)(0.5523,0.55294)(0.5565,0.55686)(0.5607,0.56078)(0.5649,0.56471)(0.569,0.56863)(0.5732,0.57255)(0.5774,0.57647)(0.5816,0.58039)(0.5858,0.58431)(0.59,0.58824)(0.5941,0.59216)(0.5983,0.59608)(0.6025,0.6)(0.6067,0.60392)(0.6109,0.60784)(0.6151,0.61176)(0.6192,0.61569)(0.6234,0.61961)(0.6276,0.62745)(0.6318,0.63137)(0.636,0.63529)(0.6402,0.63922)(0.6444,0.64314)(0.6485,0.64706)(0.6527,0.65098)(0.6569,0.6549)(0.6611,0.65882)(0.6653,0.66275)(0.6695,0.66667)(0.6736,0.67059)(0.6778,0.67451)(0.682,0.67843)(0.6862,0.68235)(0.6904,0.68627)(0.6946,0.6902)(0.6987,0.69412)(0.7029,0.69804)(0.7071,0.70196)(0.7113,0.7098)(0.7155,0.71373)(0.7197,0.71765)(0.7238,0.72157)(0.728,0.72549)(0.7322,0.72941)(0.7364,0.73333)(0.7406,0.73725)(0.7448,0.74118)(0.749,0.7451)(0.7531,0.75294)(0.7573,0.75686)(0.7615,0.76078)(0.7657,0.76471)(0.7699,0.76863)(0.7741,0.77255)(0.7782,0.77647)(0.7824,0.78039)(0.7866,0.78431)(0.7908,0.78824)(0.795,0.79608)(0.7992,0.8)(0.8033,0.80392)(0.8075,0.80784)(0.8117,0.81176)(0.8159,0.81569)(0.8201,0.81961)(0.8243,0.82353)(0.8285,0.82745)(0.8326,0.83137)(0.8368,0.83529)(0.841,0.83922)(0.8452,0.84314)(0.8494,0.84706)(0.8536,0.85098)(0.8577,0.8549)(0.8619,0.85882)(0.8661,0.86275)(0.8703,0.86667)(0.8745,0.87059)(0.8787,0.87843)(0.8828,0.88235)(0.887,0.88627)(0.8912,0.8902)(0.8954,0.89412)(0.8996,0.89804)(0.9038,0.90196)(0.9079,0.90588)(0.9121,0.9098)(0.9163,0.91373)(0.9205,0.91765)(0.9247,0.92157)(0.9289,0.92549)(0.9331,0.92941)(0.9372,0.93333)(0.9414,0.93725)(0.9456,0.94118)(0.9498,0.9451)(0.954,0.94902)(0.9582,0.95294)(0.9623,0.96078)(0.9665,0.96471)(0.9707,0.96863)(0.9749,0.97255)(0.9791,0.97647)(0.9833,0.98039)(0.9874,0.98431)(0.9916,0.98824)(0.9958,0.99216)(1,0.99608) BLUE: (0,0)(0.0042,0.0039216)(0.0084,0.011765)(0.0126,0.019608)(0.0167,0.027451)(0.0209,0.035294)(0.0251,0.043137)(0.0293,0.05098)(0.0335,0.058824)(0.0377,0.066667)(0.0418,0.082353)(0.046,0.090196)(0.0502,0.098039)(0.0544,0.10588)(0.0586,0.11373)(0.0628,0.12157)(0.0669,0.12941)(0.0711,0.13725)(0.0753,0.1451)(0.0795,0.15294)(0.0837,0.16078)(0.0879,0.16863)(0.0921,0.17647)(0.0962,0.18431)(0.1004,0.19216)(0.1046,0.2)(0.1088,0.20784)(0.113,0.21569)(0.1172,0.22353)(0.1213,0.23137)(0.1255,0.24706)(0.1297,0.2549)(0.1339,0.26275)(0.1381,0.27059)(0.1423,0.27843)(0.1464,0.28627)(0.1506,0.29412)(0.1548,0.30196)(0.159,0.3098)(0.1632,0.31765)(0.1674,0.32549)(0.1715,0.33333)(0.1757,0.34118)(0.1799,0.34902)(0.1841,0.35686)(0.1883,0.36471)(0.1925,0.37255)(0.1967,0.38039)(0.2008,0.38824)(0.205,0.39608)(0.2092,0.41176)(0.2134,0.41961)(0.2176,0.42745)(0.2218,0.43529)(0.2259,0.44314)(0.2301,0.45098)(0.2343,0.45882)(0.2385,0.46667)(0.2427,0.47451)(0.2469,0.48235)(0.251,0.49804)(0.2552,0.50588)(0.2594,0.51373)(0.2636,0.52157)(0.2678,0.52941)(0.272,0.53725)(0.2762,0.5451)(0.2803,0.55294)(0.2845,0.56078)(0.2887,0.56863)(0.2929,0.58431)(0.2971,0.59216)(0.3013,0.6)(0.3054,0.60784)(0.3096,0.61569)(0.3138,0.62353)(0.318,0.63137)(0.3222,0.63922)(0.3264,0.64706)(0.3305,0.6549)(0.3347,0.66275)(0.3389,0.67059)(0.3431,0.67843)(0.3473,0.68627)(0.3515,0.69412)(0.3556,0.70196)(0.3598,0.7098)(0.364,0.71765)(0.3682,0.72549)(0.3724,0.73333)(0.3766,0.74902)(0.3808,0.75686)(0.3849,0.76471)(0.3891,0.77255)(0.3933,0.78039)(0.3975,0.78824)(0.4017,0.79608)(0.4059,0.80392)(0.41,0.81176)(0.4142,0.81961)(0.4184,0.82745)(0.4226,0.83529)(0.4268,0.84314)(0.431,0.85098)(0.4351,0.85882)(0.4393,0.86667)(0.4435,0.87451)(0.4477,0.88235)(0.4519,0.8902)(0.4561,0.89804)(0.4603,0.91373)(0.4644,0.92157)(0.4686,0.92941)(0.4728,0.93725)(0.477,0.9451)(0.4812,0.95294)(0.4854,0.96078)(0.4895,0.96863)(0.4937,0.97647)(0.4979,0.98431)(0.5021,1)(0.5063,0.98431)(0.5105,0.96863)(0.5146,0.95294)(0.5188,0.93333)(0.523,0.91765)(0.5272,0.90196)(0.5314,0.88627)(0.5356,0.86667)(0.5397,0.85098)(0.5439,0.81961)(0.5481,0.8)(0.5523,0.78431)(0.5565,0.76863)(0.5607,0.75294)(0.5649,0.73333)(0.569,0.71765)(0.5732,0.70196)(0.5774,0.68627)(0.5816,0.66667)(0.5858,0.65098)(0.59,0.63529)(0.5941,0.61961)(0.5983,0.6)(0.6025,0.58431)(0.6067,0.56863)(0.6109,0.55294)(0.6151,0.53333)(0.6192,0.51765)(0.6234,0.50196)(0.6276,0.46667)(0.6318,0.45098)(0.636,0.43529)(0.6402,0.41961)(0.6444,0.4)(0.6485,0.38431)(0.6527,0.36863)(0.6569,0.35294)(0.6611,0.33333)(0.6653,0.31765)(0.6695,0.30196)(0.6736,0.28627)(0.6778,0.26667)(0.682,0.25098)(0.6862,0.23529)(0.6904,0.21961)(0.6946,0.2)(0.6987,0.18431)(0.7029,0.16863)(0.7071,0.15294)(0.7113,0.11765)(0.7155,0.10196)(0.7197,0.086275)(0.7238,0.066667)(0.728,0.05098)(0.7322,0.035294)(0.7364,0.019608)(0.7406,0)(0.7448,0.011765)(0.749,0.027451)(0.7531,0.058824)(0.7573,0.07451)(0.7615,0.086275)(0.7657,0.10196)(0.7699,0.11765)(0.7741,0.13333)(0.7782,0.14902)(0.7824,0.16078)(0.7866,0.17647)(0.7908,0.19216)(0.795,0.22353)(0.7992,0.23529)(0.8033,0.25098)(0.8075,0.26667)(0.8117,0.28235)(0.8159,0.29804)(0.8201,0.3098)(0.8243,0.32549)(0.8285,0.34118)(0.8326,0.35686)(0.8368,0.37255)(0.841,0.38431)(0.8452,0.4)(0.8494,0.41569)(0.8536,0.43137)(0.8577,0.44706)(0.8619,0.45882)(0.8661,0.47451)(0.8703,0.4902)(0.8745,0.50588)(0.8787,0.53725)(0.8828,0.54902)(0.887,0.56471)(0.8912,0.58039)(0.8954,0.59608)(0.8996,0.61176)(0.9038,0.62353)(0.9079,0.63922)(0.9121,0.6549)(0.9163,0.67059)(0.9205,0.68627)(0.9247,0.69804)(0.9289,0.71373)(0.9331,0.72941)(0.9372,0.7451)(0.9414,0.76078)(0.9456,0.77255)(0.9498,0.78824)(0.954,0.80392)(0.9582,0.81961)(0.9623,0.84706)(0.9665,0.86275)(0.9707,0.87843)(0.9749,0.89412)(0.9791,0.9098)(0.9833,0.92157)(0.9874,0.93725)(0.9916,0.95294)(0.9958,0.96863)(1,0.98431) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/gist_yarg.sao����������������������������������������������������������������������000644 �000765 �000000 �00000026315 12567377777 016725� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # yarg # created by cptutils 1.46 # Wed Aug 15 23:30:58 2012 PSEUDOCOLOR RED: (0,1)(0.0042,0.99608)(0.0084,0.99216)(0.0126,0.98824)(0.0167,0.98431)(0.0209,0.98039)(0.0251,0.97647)(0.0293,0.97255)(0.0335,0.96471)(0.0377,0.96078)(0.0418,0.95686)(0.046,0.95294)(0.0502,0.94902)(0.0544,0.9451)(0.0586,0.94118)(0.0628,0.93725)(0.0669,0.93333)(0.0711,0.92941)(0.0753,0.92549)(0.0795,0.92157)(0.0837,0.91765)(0.0879,0.91373)(0.0921,0.9098)(0.0962,0.90196)(0.1004,0.89804)(0.1046,0.89412)(0.1088,0.8902)(0.113,0.88627)(0.1172,0.88235)(0.1213,0.87843)(0.1255,0.87451)(0.1297,0.87059)(0.1339,0.86667)(0.1381,0.86275)(0.1423,0.85882)(0.1464,0.8549)(0.1506,0.85098)(0.1548,0.84706)(0.159,0.83922)(0.1632,0.83529)(0.1674,0.83137)(0.1715,0.82745)(0.1757,0.82353)(0.1799,0.81961)(0.1841,0.81569)(0.1883,0.81176)(0.1925,0.80784)(0.1967,0.80392)(0.2008,0.8)(0.205,0.79608)(0.2092,0.79216)(0.2134,0.78824)(0.2176,0.78431)(0.2218,0.77647)(0.2259,0.77255)(0.2301,0.76863)(0.2343,0.76471)(0.2385,0.76078)(0.2427,0.75686)(0.2469,0.75294)(0.251,0.74902)(0.2552,0.7451)(0.2594,0.74118)(0.2636,0.73725)(0.2678,0.73333)(0.272,0.72941)(0.2762,0.72549)(0.2803,0.72157)(0.2845,0.71373)(0.2887,0.7098)(0.2929,0.70588)(0.2971,0.70196)(0.3013,0.69804)(0.3054,0.69412)(0.3096,0.6902)(0.3138,0.68627)(0.318,0.68235)(0.3222,0.67843)(0.3264,0.67451)(0.3305,0.67059)(0.3347,0.66667)(0.3389,0.66275)(0.3431,0.65882)(0.3473,0.65098)(0.3515,0.64706)(0.3556,0.64314)(0.3598,0.63922)(0.364,0.63529)(0.3682,0.63137)(0.3724,0.62745)(0.3766,0.62353)(0.3808,0.61961)(0.3849,0.61569)(0.3891,0.61176)(0.3933,0.60784)(0.3975,0.60392)(0.4017,0.6)(0.4059,0.59608)(0.41,0.58824)(0.4142,0.58431)(0.4184,0.58039)(0.4226,0.57647)(0.4268,0.57255)(0.431,0.56863)(0.4351,0.56471)(0.4393,0.56078)(0.4435,0.55686)(0.4477,0.55294)(0.4519,0.54902)(0.4561,0.5451)(0.4603,0.54118)(0.4644,0.53725)(0.4686,0.53333)(0.4728,0.52549)(0.477,0.52157)(0.4812,0.51765)(0.4854,0.51373)(0.4895,0.5098)(0.4937,0.50588)(0.4979,0.50196)(0.5021,0.49804)(0.5063,0.49412)(0.5105,0.4902)(0.5146,0.48627)(0.5188,0.48235)(0.523,0.47843)(0.5272,0.47451)(0.5314,0.47059)(0.5356,0.46275)(0.5397,0.45882)(0.5439,0.4549)(0.5481,0.45098)(0.5523,0.44706)(0.5565,0.44314)(0.5607,0.43922)(0.5649,0.43529)(0.569,0.43137)(0.5732,0.42745)(0.5774,0.42353)(0.5816,0.41961)(0.5858,0.41569)(0.59,0.41176)(0.5941,0.40784)(0.5983,0.4)(0.6025,0.39608)(0.6067,0.39216)(0.6109,0.38824)(0.6151,0.38431)(0.6192,0.38039)(0.6234,0.37647)(0.6276,0.37255)(0.6318,0.36863)(0.636,0.36471)(0.6402,0.36078)(0.6444,0.35686)(0.6485,0.35294)(0.6527,0.34902)(0.6569,0.3451)(0.6611,0.33725)(0.6653,0.33333)(0.6695,0.32941)(0.6736,0.32549)(0.6778,0.32157)(0.682,0.31765)(0.6862,0.31373)(0.6904,0.3098)(0.6946,0.30588)(0.6987,0.30196)(0.7029,0.29804)(0.7071,0.29412)(0.7113,0.2902)(0.7155,0.28627)(0.7197,0.28235)(0.7238,0.27451)(0.728,0.27059)(0.7322,0.26667)(0.7364,0.26275)(0.7406,0.25882)(0.7448,0.2549)(0.749,0.25098)(0.7531,0.24706)(0.7573,0.24314)(0.7615,0.23922)(0.7657,0.23529)(0.7699,0.23137)(0.7741,0.22745)(0.7782,0.22353)(0.7824,0.21961)(0.7866,0.21176)(0.7908,0.20784)(0.795,0.20392)(0.7992,0.2)(0.8033,0.19608)(0.8075,0.19216)(0.8117,0.18824)(0.8159,0.18431)(0.8201,0.18039)(0.8243,0.17647)(0.8285,0.17255)(0.8326,0.16863)(0.8368,0.16471)(0.841,0.16078)(0.8452,0.15686)(0.8494,0.14902)(0.8536,0.1451)(0.8577,0.14118)(0.8619,0.13725)(0.8661,0.13333)(0.8703,0.12941)(0.8745,0.12549)(0.8787,0.12157)(0.8828,0.11765)(0.887,0.11373)(0.8912,0.1098)(0.8954,0.10588)(0.8996,0.10196)(0.9038,0.098039)(0.9079,0.094118)(0.9121,0.086275)(0.9163,0.082353)(0.9205,0.078431)(0.9247,0.07451)(0.9289,0.070588)(0.9331,0.066667)(0.9372,0.062745)(0.9414,0.058824)(0.9456,0.054902)(0.9498,0.05098)(0.954,0.047059)(0.9582,0.043137)(0.9623,0.039216)(0.9665,0.035294)(0.9707,0.031373)(0.9749,0.023529)(0.9791,0.019608)(0.9833,0.015686)(0.9874,0.011765)(0.9916,0.0078431)(0.9958,0.0039216)(1,0) GREEN: (0,1)(0.0042,0.99608)(0.0084,0.99216)(0.0126,0.98824)(0.0167,0.98431)(0.0209,0.98039)(0.0251,0.97647)(0.0293,0.97255)(0.0335,0.96471)(0.0377,0.96078)(0.0418,0.95686)(0.046,0.95294)(0.0502,0.94902)(0.0544,0.9451)(0.0586,0.94118)(0.0628,0.93725)(0.0669,0.93333)(0.0711,0.92941)(0.0753,0.92549)(0.0795,0.92157)(0.0837,0.91765)(0.0879,0.91373)(0.0921,0.9098)(0.0962,0.90196)(0.1004,0.89804)(0.1046,0.89412)(0.1088,0.8902)(0.113,0.88627)(0.1172,0.88235)(0.1213,0.87843)(0.1255,0.87451)(0.1297,0.87059)(0.1339,0.86667)(0.1381,0.86275)(0.1423,0.85882)(0.1464,0.8549)(0.1506,0.85098)(0.1548,0.84706)(0.159,0.83922)(0.1632,0.83529)(0.1674,0.83137)(0.1715,0.82745)(0.1757,0.82353)(0.1799,0.81961)(0.1841,0.81569)(0.1883,0.81176)(0.1925,0.80784)(0.1967,0.80392)(0.2008,0.8)(0.205,0.79608)(0.2092,0.79216)(0.2134,0.78824)(0.2176,0.78431)(0.2218,0.77647)(0.2259,0.77255)(0.2301,0.76863)(0.2343,0.76471)(0.2385,0.76078)(0.2427,0.75686)(0.2469,0.75294)(0.251,0.74902)(0.2552,0.7451)(0.2594,0.74118)(0.2636,0.73725)(0.2678,0.73333)(0.272,0.72941)(0.2762,0.72549)(0.2803,0.72157)(0.2845,0.71373)(0.2887,0.7098)(0.2929,0.70588)(0.2971,0.70196)(0.3013,0.69804)(0.3054,0.69412)(0.3096,0.6902)(0.3138,0.68627)(0.318,0.68235)(0.3222,0.67843)(0.3264,0.67451)(0.3305,0.67059)(0.3347,0.66667)(0.3389,0.66275)(0.3431,0.65882)(0.3473,0.65098)(0.3515,0.64706)(0.3556,0.64314)(0.3598,0.63922)(0.364,0.63529)(0.3682,0.63137)(0.3724,0.62745)(0.3766,0.62353)(0.3808,0.61961)(0.3849,0.61569)(0.3891,0.61176)(0.3933,0.60784)(0.3975,0.60392)(0.4017,0.6)(0.4059,0.59608)(0.41,0.58824)(0.4142,0.58431)(0.4184,0.58039)(0.4226,0.57647)(0.4268,0.57255)(0.431,0.56863)(0.4351,0.56471)(0.4393,0.56078)(0.4435,0.55686)(0.4477,0.55294)(0.4519,0.54902)(0.4561,0.5451)(0.4603,0.54118)(0.4644,0.53725)(0.4686,0.53333)(0.4728,0.52549)(0.477,0.52157)(0.4812,0.51765)(0.4854,0.51373)(0.4895,0.5098)(0.4937,0.50588)(0.4979,0.50196)(0.5021,0.49804)(0.5063,0.49412)(0.5105,0.4902)(0.5146,0.48627)(0.5188,0.48235)(0.523,0.47843)(0.5272,0.47451)(0.5314,0.47059)(0.5356,0.46275)(0.5397,0.45882)(0.5439,0.4549)(0.5481,0.45098)(0.5523,0.44706)(0.5565,0.44314)(0.5607,0.43922)(0.5649,0.43529)(0.569,0.43137)(0.5732,0.42745)(0.5774,0.42353)(0.5816,0.41961)(0.5858,0.41569)(0.59,0.41176)(0.5941,0.40784)(0.5983,0.4)(0.6025,0.39608)(0.6067,0.39216)(0.6109,0.38824)(0.6151,0.38431)(0.6192,0.38039)(0.6234,0.37647)(0.6276,0.37255)(0.6318,0.36863)(0.636,0.36471)(0.6402,0.36078)(0.6444,0.35686)(0.6485,0.35294)(0.6527,0.34902)(0.6569,0.3451)(0.6611,0.33725)(0.6653,0.33333)(0.6695,0.32941)(0.6736,0.32549)(0.6778,0.32157)(0.682,0.31765)(0.6862,0.31373)(0.6904,0.3098)(0.6946,0.30588)(0.6987,0.30196)(0.7029,0.29804)(0.7071,0.29412)(0.7113,0.2902)(0.7155,0.28627)(0.7197,0.28235)(0.7238,0.27451)(0.728,0.27059)(0.7322,0.26667)(0.7364,0.26275)(0.7406,0.25882)(0.7448,0.2549)(0.749,0.25098)(0.7531,0.24706)(0.7573,0.24314)(0.7615,0.23922)(0.7657,0.23529)(0.7699,0.23137)(0.7741,0.22745)(0.7782,0.22353)(0.7824,0.21961)(0.7866,0.21176)(0.7908,0.20784)(0.795,0.20392)(0.7992,0.2)(0.8033,0.19608)(0.8075,0.19216)(0.8117,0.18824)(0.8159,0.18431)(0.8201,0.18039)(0.8243,0.17647)(0.8285,0.17255)(0.8326,0.16863)(0.8368,0.16471)(0.841,0.16078)(0.8452,0.15686)(0.8494,0.14902)(0.8536,0.1451)(0.8577,0.14118)(0.8619,0.13725)(0.8661,0.13333)(0.8703,0.12941)(0.8745,0.12549)(0.8787,0.12157)(0.8828,0.11765)(0.887,0.11373)(0.8912,0.1098)(0.8954,0.10588)(0.8996,0.10196)(0.9038,0.098039)(0.9079,0.094118)(0.9121,0.086275)(0.9163,0.082353)(0.9205,0.078431)(0.9247,0.07451)(0.9289,0.070588)(0.9331,0.066667)(0.9372,0.062745)(0.9414,0.058824)(0.9456,0.054902)(0.9498,0.05098)(0.954,0.047059)(0.9582,0.043137)(0.9623,0.039216)(0.9665,0.035294)(0.9707,0.031373)(0.9749,0.023529)(0.9791,0.019608)(0.9833,0.015686)(0.9874,0.011765)(0.9916,0.0078431)(0.9958,0.0039216)(1,0) BLUE: (0,1)(0.0042,0.99608)(0.0084,0.99216)(0.0126,0.98824)(0.0167,0.98431)(0.0209,0.98039)(0.0251,0.97647)(0.0293,0.97255)(0.0335,0.96471)(0.0377,0.96078)(0.0418,0.95686)(0.046,0.95294)(0.0502,0.94902)(0.0544,0.9451)(0.0586,0.94118)(0.0628,0.93725)(0.0669,0.93333)(0.0711,0.92941)(0.0753,0.92549)(0.0795,0.92157)(0.0837,0.91765)(0.0879,0.91373)(0.0921,0.9098)(0.0962,0.90196)(0.1004,0.89804)(0.1046,0.89412)(0.1088,0.8902)(0.113,0.88627)(0.1172,0.88235)(0.1213,0.87843)(0.1255,0.87451)(0.1297,0.87059)(0.1339,0.86667)(0.1381,0.86275)(0.1423,0.85882)(0.1464,0.8549)(0.1506,0.85098)(0.1548,0.84706)(0.159,0.83922)(0.1632,0.83529)(0.1674,0.83137)(0.1715,0.82745)(0.1757,0.82353)(0.1799,0.81961)(0.1841,0.81569)(0.1883,0.81176)(0.1925,0.80784)(0.1967,0.80392)(0.2008,0.8)(0.205,0.79608)(0.2092,0.79216)(0.2134,0.78824)(0.2176,0.78431)(0.2218,0.77647)(0.2259,0.77255)(0.2301,0.76863)(0.2343,0.76471)(0.2385,0.76078)(0.2427,0.75686)(0.2469,0.75294)(0.251,0.74902)(0.2552,0.7451)(0.2594,0.74118)(0.2636,0.73725)(0.2678,0.73333)(0.272,0.72941)(0.2762,0.72549)(0.2803,0.72157)(0.2845,0.71373)(0.2887,0.7098)(0.2929,0.70588)(0.2971,0.70196)(0.3013,0.69804)(0.3054,0.69412)(0.3096,0.6902)(0.3138,0.68627)(0.318,0.68235)(0.3222,0.67843)(0.3264,0.67451)(0.3305,0.67059)(0.3347,0.66667)(0.3389,0.66275)(0.3431,0.65882)(0.3473,0.65098)(0.3515,0.64706)(0.3556,0.64314)(0.3598,0.63922)(0.364,0.63529)(0.3682,0.63137)(0.3724,0.62745)(0.3766,0.62353)(0.3808,0.61961)(0.3849,0.61569)(0.3891,0.61176)(0.3933,0.60784)(0.3975,0.60392)(0.4017,0.6)(0.4059,0.59608)(0.41,0.58824)(0.4142,0.58431)(0.4184,0.58039)(0.4226,0.57647)(0.4268,0.57255)(0.431,0.56863)(0.4351,0.56471)(0.4393,0.56078)(0.4435,0.55686)(0.4477,0.55294)(0.4519,0.54902)(0.4561,0.5451)(0.4603,0.54118)(0.4644,0.53725)(0.4686,0.53333)(0.4728,0.52549)(0.477,0.52157)(0.4812,0.51765)(0.4854,0.51373)(0.4895,0.5098)(0.4937,0.50588)(0.4979,0.50196)(0.5021,0.49804)(0.5063,0.49412)(0.5105,0.4902)(0.5146,0.48627)(0.5188,0.48235)(0.523,0.47843)(0.5272,0.47451)(0.5314,0.47059)(0.5356,0.46275)(0.5397,0.45882)(0.5439,0.4549)(0.5481,0.45098)(0.5523,0.44706)(0.5565,0.44314)(0.5607,0.43922)(0.5649,0.43529)(0.569,0.43137)(0.5732,0.42745)(0.5774,0.42353)(0.5816,0.41961)(0.5858,0.41569)(0.59,0.41176)(0.5941,0.40784)(0.5983,0.4)(0.6025,0.39608)(0.6067,0.39216)(0.6109,0.38824)(0.6151,0.38431)(0.6192,0.38039)(0.6234,0.37647)(0.6276,0.37255)(0.6318,0.36863)(0.636,0.36471)(0.6402,0.36078)(0.6444,0.35686)(0.6485,0.35294)(0.6527,0.34902)(0.6569,0.3451)(0.6611,0.33725)(0.6653,0.33333)(0.6695,0.32941)(0.6736,0.32549)(0.6778,0.32157)(0.682,0.31765)(0.6862,0.31373)(0.6904,0.3098)(0.6946,0.30588)(0.6987,0.30196)(0.7029,0.29804)(0.7071,0.29412)(0.7113,0.2902)(0.7155,0.28627)(0.7197,0.28235)(0.7238,0.27451)(0.728,0.27059)(0.7322,0.26667)(0.7364,0.26275)(0.7406,0.25882)(0.7448,0.2549)(0.749,0.25098)(0.7531,0.24706)(0.7573,0.24314)(0.7615,0.23922)(0.7657,0.23529)(0.7699,0.23137)(0.7741,0.22745)(0.7782,0.22353)(0.7824,0.21961)(0.7866,0.21176)(0.7908,0.20784)(0.795,0.20392)(0.7992,0.2)(0.8033,0.19608)(0.8075,0.19216)(0.8117,0.18824)(0.8159,0.18431)(0.8201,0.18039)(0.8243,0.17647)(0.8285,0.17255)(0.8326,0.16863)(0.8368,0.16471)(0.841,0.16078)(0.8452,0.15686)(0.8494,0.14902)(0.8536,0.1451)(0.8577,0.14118)(0.8619,0.13725)(0.8661,0.13333)(0.8703,0.12941)(0.8745,0.12549)(0.8787,0.12157)(0.8828,0.11765)(0.887,0.11373)(0.8912,0.1098)(0.8954,0.10588)(0.8996,0.10196)(0.9038,0.098039)(0.9079,0.094118)(0.9121,0.086275)(0.9163,0.082353)(0.9205,0.078431)(0.9247,0.07451)(0.9289,0.070588)(0.9331,0.066667)(0.9372,0.062745)(0.9414,0.058824)(0.9456,0.054902)(0.9498,0.05098)(0.954,0.047059)(0.9582,0.043137)(0.9623,0.039216)(0.9665,0.035294)(0.9707,0.031373)(0.9749,0.023529)(0.9791,0.019608)(0.9833,0.015686)(0.9874,0.011765)(0.9916,0.0078431)(0.9958,0.0039216)(1,0) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_autumn.sao����������������������������������������������������������������������000644 �000765 �000000 �00000000225 12567413147 016610� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # autumn # created by cptutils 1.46 # Wed Aug 15 23:29:40 2012 PSEUDOCOLOR RED: (0,1)(1,1) GREEN: (0,0)(1,1) BLUE: (0,0)(1,0) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_bluered.sao���������������������������������������������������������������������000644 �000765 �000000 �00000000253 12567413147 016722� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # bluered # created by cptutils 1.46 # Wed Aug 15 23:29:40 2012 PSEUDOCOLOR RED: (0,0)(0.5,1)(1,1) GREEN: (0,0)(0.5,1)(1,0) BLUE: (0,1)(0.5,1)(1,0) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_bone.sao������������������������������������������������������������������������000644 �000765 �000000 �00000006051 12567413147 016225� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # bone # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0)(0.0159,0.011765)(0.0317,0.027451)(0.0476,0.039216)(0.0635,0.054902)(0.0794,0.066667)(0.0952,0.082353)(0.1111,0.094118)(0.127,0.1098)(0.1429,0.12157)(0.1587,0.13725)(0.1746,0.14902)(0.1905,0.16471)(0.2063,0.18039)(0.2222,0.19216)(0.2381,0.20784)(0.254,0.21961)(0.2698,0.23529)(0.2857,0.24706)(0.3016,0.26275)(0.3175,0.27451)(0.3333,0.2902)(0.3492,0.30196)(0.3651,0.31765)(0.381,0.32941)(0.3968,0.3451)(0.4127,0.36078)(0.4286,0.37255)(0.4444,0.38824)(0.4603,0.4)(0.4762,0.41569)(0.4921,0.42745)(0.5079,0.44314)(0.5238,0.4549)(0.5397,0.47059)(0.5556,0.48235)(0.5714,0.49804)(0.5873,0.51373)(0.6032,0.52549)(0.619,0.54118)(0.6349,0.55294)(0.6508,0.56863)(0.6667,0.58039)(0.6825,0.59608)(0.6984,0.60784)(0.7143,0.62353)(0.7302,0.63529)(0.746,0.65098)(0.7619,0.67059)(0.7778,0.69412)(0.7937,0.71765)(0.8095,0.73725)(0.8254,0.76078)(0.8413,0.78039)(0.8571,0.80392)(0.873,0.82353)(0.8889,0.84706)(0.9048,0.86667)(0.9206,0.8902)(0.9365,0.9098)(0.9524,0.93333)(0.9683,0.95294)(0.9841,0.97647)(1,1) GREEN: (0,0)(0.0159,0.011765)(0.0317,0.027451)(0.0476,0.039216)(0.0635,0.054902)(0.0794,0.066667)(0.0952,0.082353)(0.1111,0.094118)(0.127,0.1098)(0.1429,0.12157)(0.1587,0.13725)(0.1746,0.14902)(0.1905,0.16471)(0.2063,0.18039)(0.2222,0.19216)(0.2381,0.20784)(0.254,0.21961)(0.2698,0.23529)(0.2857,0.24706)(0.3016,0.26275)(0.3175,0.27451)(0.3333,0.2902)(0.3492,0.30196)(0.3651,0.31765)(0.381,0.33725)(0.3968,0.35686)(0.4127,0.37647)(0.4286,0.39216)(0.4444,0.41176)(0.4603,0.43137)(0.4762,0.45098)(0.4921,0.47059)(0.5079,0.4902)(0.5238,0.5098)(0.5397,0.52941)(0.5556,0.5451)(0.5714,0.56471)(0.5873,0.58431)(0.6032,0.60392)(0.619,0.62353)(0.6349,0.64314)(0.6508,0.66275)(0.6667,0.67843)(0.6825,0.69804)(0.6984,0.71765)(0.7143,0.73725)(0.7302,0.75686)(0.746,0.77647)(0.7619,0.78824)(0.7778,0.80392)(0.7937,0.81569)(0.8095,0.83137)(0.8254,0.84706)(0.8413,0.85882)(0.8571,0.87451)(0.873,0.88627)(0.8889,0.90196)(0.9048,0.91373)(0.9206,0.92941)(0.9365,0.94118)(0.9524,0.95686)(0.9683,0.96863)(0.9841,0.98431)(1,1) BLUE: (0,0.0039216)(0.0159,0.023529)(0.0317,0.043137)(0.0476,0.058824)(0.0635,0.078431)(0.0794,0.098039)(0.0952,0.11765)(0.1111,0.13725)(0.127,0.15686)(0.1429,0.17647)(0.1587,0.19608)(0.1746,0.21176)(0.1905,0.23137)(0.2063,0.25098)(0.2222,0.27059)(0.2381,0.2902)(0.254,0.3098)(0.2698,0.32941)(0.2857,0.3451)(0.3016,0.36471)(0.3175,0.38431)(0.3333,0.40392)(0.3492,0.42353)(0.3651,0.44314)(0.381,0.4549)(0.3968,0.47059)(0.4127,0.48235)(0.4286,0.49804)(0.4444,0.51373)(0.4603,0.52549)(0.4762,0.54118)(0.4921,0.55294)(0.5079,0.56863)(0.5238,0.58039)(0.5397,0.59608)(0.5556,0.60784)(0.5714,0.62353)(0.5873,0.63529)(0.6032,0.65098)(0.619,0.66667)(0.6349,0.67843)(0.6508,0.69412)(0.6667,0.70588)(0.6825,0.72157)(0.6984,0.73333)(0.7143,0.74902)(0.7302,0.76078)(0.746,0.77647)(0.7619,0.78824)(0.7778,0.80392)(0.7937,0.81569)(0.8095,0.83137)(0.8254,0.84706)(0.8413,0.85882)(0.8571,0.87451)(0.873,0.88627)(0.8889,0.90196)(0.9048,0.91373)(0.9206,0.92941)(0.9365,0.94118)(0.9524,0.95686)(0.9683,0.96863)(0.9841,0.98431)(1,1) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_cool.sao������������������������������������������������������������������������000644 �000765 �000000 �00000000223 12567413147 016231� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # cool # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0)(1,1) GREEN: (0,1)(1,0) BLUE: (0,1)(1,1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_copper.sao����������������������������������������������������������������������000644 �000765 �000000 �00000005756 12567413147 016605� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # copper # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0)(0.0159,0.019608)(0.0317,0.039216)(0.0476,0.058824)(0.0635,0.078431)(0.0794,0.098039)(0.0952,0.11765)(0.1111,0.13725)(0.127,0.15686)(0.1429,0.17647)(0.1587,0.19608)(0.1746,0.21569)(0.1905,0.23529)(0.2063,0.2549)(0.2222,0.27451)(0.2381,0.29412)(0.254,0.31373)(0.2698,0.33725)(0.2857,0.35686)(0.3016,0.37647)(0.3175,0.39608)(0.3333,0.41569)(0.3492,0.43529)(0.3651,0.4549)(0.381,0.47451)(0.3968,0.49412)(0.4127,0.51373)(0.4286,0.53333)(0.4444,0.55294)(0.4603,0.57255)(0.4762,0.59216)(0.4921,0.61176)(0.5079,0.63137)(0.5238,0.65098)(0.5397,0.67451)(0.5556,0.69412)(0.5714,0.71373)(0.5873,0.73333)(0.6032,0.75294)(0.619,0.77255)(0.6349,0.79216)(0.6508,0.81176)(0.6667,0.83137)(0.6825,0.85098)(0.6984,0.87059)(0.7143,0.8902)(0.7302,0.9098)(0.746,0.92941)(0.7619,0.94902)(0.7778,0.96863)(0.7937,0.98824)(0.8095,1)(0.8254,1)(0.8413,1)(0.8571,1)(0.873,1)(0.8889,1)(0.9048,1)(0.9206,1)(0.9365,1)(0.9524,1)(0.9683,1)(0.9841,1)(1,1) GREEN: (0,0)(0.0159,0.011765)(0.0317,0.023529)(0.0476,0.035294)(0.0635,0.047059)(0.0794,0.058824)(0.0952,0.070588)(0.1111,0.086275)(0.127,0.098039)(0.1429,0.1098)(0.1587,0.12157)(0.1746,0.13333)(0.1905,0.1451)(0.2063,0.16078)(0.2222,0.17255)(0.2381,0.18431)(0.254,0.19608)(0.2698,0.20784)(0.2857,0.21961)(0.3016,0.23529)(0.3175,0.24706)(0.3333,0.25882)(0.3492,0.27059)(0.3651,0.28235)(0.381,0.29412)(0.3968,0.3098)(0.4127,0.32157)(0.4286,0.33333)(0.4444,0.3451)(0.4603,0.35686)(0.4762,0.36863)(0.4921,0.38431)(0.5079,0.39608)(0.5238,0.40784)(0.5397,0.41961)(0.5556,0.43137)(0.5714,0.44314)(0.5873,0.4549)(0.6032,0.47059)(0.619,0.48235)(0.6349,0.49412)(0.6508,0.50588)(0.6667,0.51765)(0.6825,0.52941)(0.6984,0.5451)(0.7143,0.55686)(0.7302,0.56863)(0.746,0.58039)(0.7619,0.59216)(0.7778,0.60392)(0.7937,0.61961)(0.8095,0.63137)(0.8254,0.64314)(0.8413,0.6549)(0.8571,0.66667)(0.873,0.67843)(0.8889,0.69412)(0.9048,0.70588)(0.9206,0.71765)(0.9365,0.72941)(0.9524,0.74118)(0.9683,0.75294)(0.9841,0.76863)(1,0.78039) BLUE: (0,0)(0.0159,0.0078431)(0.0317,0.015686)(0.0476,0.023529)(0.0635,0.031373)(0.0794,0.039216)(0.0952,0.047059)(0.1111,0.054902)(0.127,0.062745)(0.1429,0.070588)(0.1587,0.078431)(0.1746,0.086275)(0.1905,0.094118)(0.2063,0.10196)(0.2222,0.1098)(0.2381,0.11765)(0.254,0.12549)(0.2698,0.13333)(0.2857,0.14118)(0.3016,0.14902)(0.3175,0.15686)(0.3333,0.16471)(0.3492,0.17255)(0.3651,0.18039)(0.381,0.18824)(0.3968,0.19608)(0.4127,0.20392)(0.4286,0.21176)(0.4444,0.21961)(0.4603,0.22745)(0.4762,0.23529)(0.4921,0.24314)(0.5079,0.25098)(0.5238,0.25882)(0.5397,0.26667)(0.5556,0.27451)(0.5714,0.28235)(0.5873,0.2902)(0.6032,0.29804)(0.619,0.30588)(0.6349,0.31373)(0.6508,0.32157)(0.6667,0.32941)(0.6825,0.33725)(0.6984,0.3451)(0.7143,0.35294)(0.7302,0.36078)(0.746,0.36863)(0.7619,0.37647)(0.7778,0.38431)(0.7937,0.39216)(0.8095,0.4)(0.8254,0.40784)(0.8413,0.41569)(0.8571,0.42353)(0.873,0.43137)(0.8889,0.43922)(0.9048,0.44706)(0.9206,0.4549)(0.9365,0.46275)(0.9524,0.47059)(0.9683,0.47843)(0.9841,0.48627)(1,0.49412) ������������������saods9/ds9/cmaps/h5_dkbluered.sao�������������������������������������������������������������������000644 �000765 �000000 �00000002427 12567413147 017246� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # dkbluered # created by cptutils 1.46 # Wed Aug 15 23:29:40 2012 PSEUDOCOLOR RED: (0,0.027451)(0.0333,0.066667)(0.0667,0.098039)(0.1,0.1098)(0.1333,0.098039)(0.1667,0.086275)(0.2,0.058824)(0.2333,0.0078431)(0.2667,0.078431)(0.3,0.21961)(0.3333,0.34902)(0.3667,0.47843)(0.4,0.60784)(0.4333,0.74902)(0.4667,0.87843)(0.5,1)(0.5333,1)(0.5667,1)(0.6,1)(0.6333,1)(0.6667,1)(0.7,1)(0.7333,1)(0.7667,0.96863)(0.8,0.85882)(0.8333,0.74902)(0.8667,0.63922)(0.9,0.52941)(0.9333,0.41961)(0.9667,0.3098)(1,0.20784) GREEN: (0,0)(0.0333,0)(0.0667,0)(0.1,0)(0.1333,0)(0.1667,0)(0.2,0)(0.2333,0)(0.2667,0.12941)(0.3,0.29804)(0.3333,0.45882)(0.3667,0.6)(0.4,0.72941)(0.4333,0.82745)(0.4667,0.92941)(0.5,1)(0.5333,0.92941)(0.5667,0.82745)(0.6,0.72941)(0.6333,0.6)(0.6667,0.45882)(0.7,0.29804)(0.7333,0.12941)(0.7667,0)(0.8,0)(0.8333,0)(0.8667,0)(0.9,0)(0.9333,0)(0.9667,0)(1,0) BLUE: (0,0.2)(0.0333,0.3098)(0.0667,0.41961)(0.1,0.52941)(0.1333,0.63922)(0.1667,0.74902)(0.2,0.85882)(0.2333,0.96863)(0.2667,1)(0.3,1)(0.3333,1)(0.3667,1)(0.4,1)(0.4333,1)(0.4667,1)(0.5,1)(0.5333,0.87843)(0.5667,0.74902)(0.6,0.60784)(0.6333,0.47843)(0.6667,0.34902)(0.7,0.21961)(0.7333,0.078431)(0.7667,0.0078431)(0.8,0.058824)(0.8333,0.086275)(0.8667,0.098039)(0.9,0.1098)(0.9333,0.098039)(0.9667,0.066667)(1,0.027451) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_gray.sao������������������������������������������������������������������������000644 �000765 �000000 �00000000223 12567413147 016237� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # gray # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,1)(1,0) GREEN: (0,1)(1,0) BLUE: (0,1)(1,0) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_green.sao�����������������������������������������������������������������������000644 �000765 �000000 �00000000224 12567413147 016376� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # green # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,1)(1,0) GREEN: (0,1)(1,1) BLUE: (0,1)(1,0) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_hot.sao�������������������������������������������������������������������������000644 �000765 �000000 �00000004462 12567413147 016100� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # hot # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0.039216)(0.0159,0.082353)(0.0317,0.12157)(0.0476,0.16471)(0.0635,0.20784)(0.0794,0.24706)(0.0952,0.2902)(0.1111,0.32941)(0.127,0.37255)(0.1429,0.41569)(0.1587,0.4549)(0.1746,0.49804)(0.1905,0.54118)(0.2063,0.58039)(0.2222,0.62353)(0.2381,0.66667)(0.254,0.70588)(0.2698,0.74902)(0.2857,0.78824)(0.3016,0.83137)(0.3175,0.87451)(0.3333,0.91373)(0.3492,0.95686)(0.3651,1)(0.381,1)(0.3968,1)(0.4127,1)(0.4286,1)(0.4444,1)(0.4603,1)(0.4762,1)(0.4921,1)(0.5079,1)(0.5238,1)(0.5397,1)(0.5556,1)(0.5714,1)(0.5873,1)(0.6032,1)(0.619,1)(0.6349,1)(0.6508,1)(0.6667,1)(0.6825,1)(0.6984,1)(0.7143,1)(0.7302,1)(0.746,1)(0.7619,1)(0.7778,1)(0.7937,1)(0.8095,1)(0.8254,1)(0.8413,1)(0.8571,1)(0.873,1)(0.8889,1)(0.9048,1)(0.9206,1)(0.9365,1)(0.9524,1)(0.9683,1)(0.9841,1)(1,1) GREEN: (0,0)(0.0159,0)(0.0317,0)(0.0476,0)(0.0635,0)(0.0794,0)(0.0952,0)(0.1111,0)(0.127,0)(0.1429,0)(0.1587,0)(0.1746,0)(0.1905,0)(0.2063,0)(0.2222,0)(0.2381,0)(0.254,0)(0.2698,0)(0.2857,0)(0.3016,0)(0.3175,0)(0.3333,0)(0.3492,0)(0.3651,0)(0.381,0.039216)(0.3968,0.082353)(0.4127,0.12157)(0.4286,0.16471)(0.4444,0.20784)(0.4603,0.24706)(0.4762,0.2902)(0.4921,0.32941)(0.5079,0.37255)(0.5238,0.41569)(0.5397,0.4549)(0.5556,0.49804)(0.5714,0.54118)(0.5873,0.58039)(0.6032,0.62353)(0.619,0.66667)(0.6349,0.70588)(0.6508,0.74902)(0.6667,0.78824)(0.6825,0.83137)(0.6984,0.87451)(0.7143,0.91373)(0.7302,0.95686)(0.746,1)(0.7619,1)(0.7778,1)(0.7937,1)(0.8095,1)(0.8254,1)(0.8413,1)(0.8571,1)(0.873,1)(0.8889,1)(0.9048,1)(0.9206,1)(0.9365,1)(0.9524,1)(0.9683,1)(0.9841,1)(1,1) BLUE: (0,0)(0.0159,0)(0.0317,0)(0.0476,0)(0.0635,0)(0.0794,0)(0.0952,0)(0.1111,0)(0.127,0)(0.1429,0)(0.1587,0)(0.1746,0)(0.1905,0)(0.2063,0)(0.2222,0)(0.2381,0)(0.254,0)(0.2698,0)(0.2857,0)(0.3016,0)(0.3175,0)(0.3333,0)(0.3492,0)(0.3651,0)(0.381,0)(0.3968,0)(0.4127,0)(0.4286,0)(0.4444,0)(0.4603,0)(0.4762,0)(0.4921,0)(0.5079,0)(0.5238,0)(0.5397,0)(0.5556,0)(0.5714,0)(0.5873,0)(0.6032,0)(0.619,0)(0.6349,0)(0.6508,0)(0.6667,0)(0.6825,0)(0.6984,0)(0.7143,0)(0.7302,0)(0.746,0)(0.7619,0.058824)(0.7778,0.12157)(0.7937,0.18431)(0.8095,0.24706)(0.8254,0.3098)(0.8413,0.37255)(0.8571,0.43529)(0.873,0.49804)(0.8889,0.56078)(0.9048,0.62353)(0.9206,0.68627)(0.9365,0.74902)(0.9524,0.81176)(0.9683,0.87451)(0.9841,0.93725)(1,1) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_hsv.sao�������������������������������������������������������������������������000644 �000765 �000000 �00000004472 12567413147 016107� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # hsv # created by cptutils 1.46 # Wed Aug 15 23:29:38 2012 PSEUDOCOLOR RED: (0,1)(0.0159,1)(0.0317,1)(0.0476,1)(0.0635,1)(0.0794,1)(0.0952,1)(0.1111,1)(0.127,1)(0.1429,1)(0.1587,1)(0.1746,0.96863)(0.1905,0.87451)(0.2063,0.78039)(0.2222,0.68627)(0.2381,0.59216)(0.254,0.49804)(0.2698,0.40392)(0.2857,0.3098)(0.3016,0.21569)(0.3175,0.12157)(0.3333,0.027451)(0.3492,0)(0.3651,0)(0.381,0)(0.3968,0)(0.4127,0)(0.4286,0)(0.4444,0)(0.4603,0)(0.4762,0)(0.4921,0)(0.5079,0)(0.5238,0)(0.5397,0)(0.5556,0)(0.5714,0)(0.5873,0)(0.6032,0)(0.619,0)(0.6349,0)(0.6508,0)(0.6667,0)(0.6825,0.027451)(0.6984,0.12157)(0.7143,0.21569)(0.7302,0.3098)(0.746,0.40392)(0.7619,0.49804)(0.7778,0.59216)(0.7937,0.68627)(0.8095,0.78039)(0.8254,0.87451)(0.8413,0.96863)(0.8571,1)(0.873,1)(0.8889,1)(0.9048,1)(0.9206,1)(0.9365,1)(0.9524,1)(0.9683,1)(0.9841,1)(1,1) GREEN: (0,0)(0.0159,0.090196)(0.0317,0.18431)(0.0476,0.27843)(0.0635,0.37255)(0.0794,0.46667)(0.0952,0.56078)(0.1111,0.6549)(0.127,0.74902)(0.1429,0.84314)(0.1587,0.93725)(0.1746,1)(0.1905,1)(0.2063,1)(0.2222,1)(0.2381,1)(0.254,1)(0.2698,1)(0.2857,1)(0.3016,1)(0.3175,1)(0.3333,1)(0.3492,1)(0.3651,1)(0.381,1)(0.3968,1)(0.4127,1)(0.4286,1)(0.4444,1)(0.4603,1)(0.4762,1)(0.4921,1)(0.5079,1)(0.5238,0.90588)(0.5397,0.81176)(0.5556,0.71765)(0.5714,0.62353)(0.5873,0.52941)(0.6032,0.43529)(0.619,0.34118)(0.6349,0.24706)(0.6508,0.15294)(0.6667,0.058824)(0.6825,0)(0.6984,0)(0.7143,0)(0.7302,0)(0.746,0)(0.7619,0)(0.7778,0)(0.7937,0)(0.8095,0)(0.8254,0)(0.8413,0)(0.8571,0)(0.873,0)(0.8889,0)(0.9048,0)(0.9206,0)(0.9365,0)(0.9524,0)(0.9683,0)(0.9841,0)(1,0) BLUE: (0,0)(0.0159,0)(0.0317,0)(0.0476,0)(0.0635,0)(0.0794,0)(0.0952,0)(0.1111,0)(0.127,0)(0.1429,0)(0.1587,0)(0.1746,0)(0.1905,0)(0.2063,0)(0.2222,0)(0.2381,0)(0.254,0)(0.2698,0)(0.2857,0)(0.3016,0)(0.3175,0)(0.3333,0)(0.3492,0.058824)(0.3651,0.15294)(0.381,0.24706)(0.3968,0.34118)(0.4127,0.43529)(0.4286,0.52941)(0.4444,0.62353)(0.4603,0.71765)(0.4762,0.81176)(0.4921,0.90588)(0.5079,1)(0.5238,1)(0.5397,1)(0.5556,1)(0.5714,1)(0.5873,1)(0.6032,1)(0.619,1)(0.6349,1)(0.6508,1)(0.6667,1)(0.6825,1)(0.6984,1)(0.7143,1)(0.7302,1)(0.746,1)(0.7619,1)(0.7778,1)(0.7937,1)(0.8095,1)(0.8254,1)(0.8413,1)(0.8571,0.93725)(0.873,0.84314)(0.8889,0.74902)(0.9048,0.6549)(0.9206,0.56078)(0.9365,0.46667)(0.9524,0.37255)(0.9683,0.27843)(0.9841,0.18431)(1,0.090196) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_jet.sao�������������������������������������������������������������������������000644 �000765 �000000 �00000001146 12567413147 016064� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # jet # created by cptutils 1.46 # Wed Aug 15 23:29:38 2012 PSEUDOCOLOR RED: (0,0)(0.0667,0)(0.1333,0)(0.2,0)(0.2667,0)(0.3333,0)(0.4,0.24706)(0.4667,0.49804)(0.5333,0.74902)(0.6,1)(0.6667,1)(0.7333,1)(0.8,1)(0.8667,1)(0.9333,1)(1,0.74902) GREEN: (0,0)(0.0667,0)(0.1333,0.24706)(0.2,0.49804)(0.2667,0.74902)(0.3333,1)(0.4,1)(0.4667,1)(0.5333,1)(0.6,1)(0.6667,1)(0.7333,0.74902)(0.8,0.49804)(0.8667,0.24706)(0.9333,0)(1,0) BLUE: (0,0.74902)(0.0667,1)(0.1333,1)(0.2,1)(0.2667,1)(0.3333,1)(0.4,1)(0.4667,0.74902)(0.5333,0.49804)(0.6,0.24706)(0.6667,0)(0.7333,0)(0.8,0)(0.8667,0)(0.9333,0)(1,0) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_pink.sao������������������������������������������������������������������������000644 �000765 �000000 �00000006015 12567413147 016243� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # pink # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0.11765)(0.0159,0.19216)(0.0317,0.24706)(0.0476,0.29412)(0.0635,0.33333)(0.0794,0.36863)(0.0952,0.4)(0.1111,0.42745)(0.127,0.4549)(0.1429,0.48235)(0.1587,0.50588)(0.1746,0.52941)(0.1905,0.55294)(0.2063,0.57255)(0.2222,0.59608)(0.2381,0.61569)(0.254,0.63529)(0.2698,0.6549)(0.2857,0.67059)(0.3016,0.6902)(0.3175,0.70588)(0.3333,0.72549)(0.3492,0.74118)(0.3651,0.75686)(0.381,0.76471)(0.3968,0.77255)(0.4127,0.77647)(0.4286,0.78431)(0.4444,0.79216)(0.4603,0.8)(0.4762,0.80392)(0.4921,0.81176)(0.5079,0.81961)(0.5238,0.82353)(0.5397,0.83137)(0.5556,0.83529)(0.5714,0.84314)(0.5873,0.85098)(0.6032,0.8549)(0.619,0.86275)(0.6349,0.86667)(0.6508,0.87451)(0.6667,0.87843)(0.6825,0.88627)(0.6984,0.8902)(0.7143,0.89804)(0.7302,0.90196)(0.746,0.9098)(0.7619,0.91373)(0.7778,0.92157)(0.7937,0.92549)(0.8095,0.93333)(0.8254,0.93725)(0.8413,0.9451)(0.8571,0.94902)(0.873,0.95294)(0.8889,0.96078)(0.9048,0.96471)(0.9206,0.97255)(0.9365,0.97647)(0.9524,0.98039)(0.9683,0.98824)(0.9841,0.99216)(1,1) GREEN: (0,0)(0.0159,0.10196)(0.0317,0.1451)(0.0476,0.17647)(0.0635,0.20392)(0.0794,0.22745)(0.0952,0.25098)(0.1111,0.27059)(0.127,0.2902)(0.1429,0.30588)(0.1587,0.32157)(0.1746,0.34118)(0.1905,0.35294)(0.2063,0.36863)(0.2222,0.38431)(0.2381,0.39608)(0.254,0.40784)(0.2698,0.42353)(0.2857,0.43529)(0.3016,0.44706)(0.3175,0.45882)(0.3333,0.47059)(0.3492,0.48235)(0.3651,0.4902)(0.381,0.51373)(0.3968,0.53725)(0.4127,0.56078)(0.4286,0.58039)(0.4444,0.60392)(0.4603,0.62353)(0.4762,0.64314)(0.4921,0.65882)(0.5079,0.67843)(0.5238,0.69804)(0.5397,0.71373)(0.5556,0.72941)(0.5714,0.74902)(0.5873,0.76471)(0.6032,0.78039)(0.619,0.79608)(0.6349,0.81176)(0.6508,0.82353)(0.6667,0.83922)(0.6825,0.8549)(0.6984,0.86667)(0.7143,0.88235)(0.7302,0.89412)(0.746,0.9098)(0.7619,0.91373)(0.7778,0.92157)(0.7937,0.92549)(0.8095,0.93333)(0.8254,0.93725)(0.8413,0.9451)(0.8571,0.94902)(0.873,0.95294)(0.8889,0.96078)(0.9048,0.96471)(0.9206,0.97255)(0.9365,0.97647)(0.9524,0.98039)(0.9683,0.98824)(0.9841,0.99216)(1,1) BLUE: (0,0)(0.0159,0.10196)(0.0317,0.1451)(0.0476,0.17647)(0.0635,0.20392)(0.0794,0.22745)(0.0952,0.25098)(0.1111,0.27059)(0.127,0.2902)(0.1429,0.30588)(0.1587,0.32157)(0.1746,0.34118)(0.1905,0.35294)(0.2063,0.36863)(0.2222,0.38431)(0.2381,0.39608)(0.254,0.40784)(0.2698,0.42353)(0.2857,0.43529)(0.3016,0.44706)(0.3175,0.45882)(0.3333,0.47059)(0.3492,0.48235)(0.3651,0.4902)(0.381,0.50196)(0.3968,0.51373)(0.4127,0.52157)(0.4286,0.53333)(0.4444,0.54118)(0.4603,0.55294)(0.4762,0.56078)(0.4921,0.57255)(0.5079,0.58039)(0.5238,0.58824)(0.5397,0.59608)(0.5556,0.60784)(0.5714,0.61569)(0.5873,0.62353)(0.6032,0.63137)(0.619,0.63922)(0.6349,0.64706)(0.6508,0.6549)(0.6667,0.66667)(0.6825,0.67451)(0.6984,0.68235)(0.7143,0.68627)(0.7302,0.69412)(0.746,0.70196)(0.7619,0.72549)(0.7778,0.7451)(0.7937,0.76863)(0.8095,0.78824)(0.8254,0.80784)(0.8413,0.82745)(0.8571,0.84314)(0.873,0.86275)(0.8889,0.88235)(0.9048,0.89804)(0.9206,0.91765)(0.9365,0.93333)(0.9524,0.94902)(0.9683,0.96471)(0.9841,0.98039)(1,1) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_spring.sao����������������������������������������������������������������������000644 �000765 �000000 �00000001237 12567413147 016605� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # spring # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,1)(0.0667,1)(0.1333,1)(0.2,1)(0.2667,1)(0.3333,1)(0.4,1)(0.4667,1)(0.5333,1)(0.6,1)(0.6667,1)(0.7333,1)(0.8,1)(0.8667,1)(0.9333,1)(1,1) GREEN: (0,0)(0.0667,0.066667)(0.1333,0.12941)(0.2,0.2)(0.2667,0.26667)(0.3333,0.32941)(0.4,0.4)(0.4667,0.46667)(0.5333,0.52941)(0.6,0.6)(0.6667,0.66667)(0.7333,0.72941)(0.8,0.8)(0.8667,0.86667)(0.9333,0.92941)(1,1) BLUE: (0,1)(0.0667,0.92941)(0.1333,0.86667)(0.2,0.8)(0.2667,0.72941)(0.3333,0.66667)(0.4,0.6)(0.4667,0.52941)(0.5333,0.46667)(0.6,0.4)(0.6667,0.32941)(0.7333,0.26667)(0.8,0.2)(0.8667,0.12941)(0.9333,0.066667)(1,0) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_summer.sao����������������������������������������������������������������������000644 �000765 �000000 �00000001314 12567413147 016607� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # summer # created by cptutils 1.46 # Wed Aug 15 23:29:38 2012 PSEUDOCOLOR RED: (0,0)(0.0667,0.066667)(0.1333,0.12941)(0.2,0.2)(0.2667,0.26667)(0.3333,0.32941)(0.4,0.4)(0.4667,0.46667)(0.5333,0.52941)(0.6,0.6)(0.6667,0.66667)(0.7333,0.72941)(0.8,0.8)(0.8667,0.86667)(0.9333,0.92941)(1,1) GREEN: (0,0.49804)(0.0667,0.52941)(0.1333,0.56471)(0.2,0.6)(0.2667,0.63137)(0.3333,0.66667)(0.4,0.69804)(0.4667,0.72941)(0.5333,0.76471)(0.6,0.8)(0.6667,0.83137)(0.7333,0.86667)(0.8,0.89804)(0.8667,0.92941)(0.9333,0.96471)(1,1) BLUE: (0,0.4)(0.0667,0.4)(0.1333,0.4)(0.2,0.4)(0.2667,0.4)(0.3333,0.4)(0.4,0.4)(0.4667,0.4)(0.5333,0.4)(0.6,0.4)(0.6667,0.4)(0.7333,0.4)(0.8,0.4)(0.8667,0.4)(0.9333,0.4)(1,0.4) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_winter.sao����������������������������������������������������������������������000644 �000765 �000000 �00000000233 12567413147 016606� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # winter # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,0)(1,0) GREEN: (0,0)(1,1) BLUE: (0,1)(1,0.49804) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_yarg.sao������������������������������������������������������������������������000644 �000765 �000000 �00000000223 12567413147 016237� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # yarg # created by cptutils 1.46 # Wed Aug 15 23:29:38 2012 PSEUDOCOLOR RED: (0,0)(1,1) GREEN: (0,0)(1,1) BLUE: (0,0)(1,1) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/h5_yellow.sao����������������������������������������������������������������������000644 �000765 �000000 �00000000225 12567413147 016612� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # yellow # created by cptutils 1.46 # Wed Aug 15 23:29:39 2012 PSEUDOCOLOR RED: (0,1)(1,1) GREEN: (0,1)(1,1) BLUE: (0,1)(1,0) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglarf.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001152 12567403474 016344� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglarf # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.56863)(0.0071,0.64706)(0.0286,0.69804)(0.0857,0.78824)(0.1429,0.83529)(0.2857,0.83137)(0.4286,0.83137)(0.5714,0.83529)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) GREEN: (0,0.53725)(0.0071,0.61569)(0.0286,0.65882)(0.0857,0.74118)(0.1429,0.78824)(0.2857,0.72157)(0.4286,0.75686)(0.5714,0.81961)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) BLUE: (0,0.50588)(0.0071,0.57255)(0.0286,0.61176)(0.0857,0.67451)(0.1429,0.70196)(0.2857,0.64314)(0.4286,0.71373)(0.5714,0.81176)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglarm.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001152 12567403474 016353� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglarm # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.56863)(0.0071,0.64706)(0.0286,0.69804)(0.0857,0.78824)(0.1429,0.83529)(0.2857,0.83137)(0.4286,0.83137)(0.5714,0.83529)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) GREEN: (0,0.53725)(0.0071,0.61569)(0.0286,0.65882)(0.0857,0.74118)(0.1429,0.78824)(0.2857,0.72157)(0.4286,0.75686)(0.5714,0.81961)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) BLUE: (0,0.50588)(0.0071,0.57255)(0.0286,0.61176)(0.0857,0.67451)(0.1429,0.70196)(0.2857,0.64314)(0.4286,0.71373)(0.5714,0.81176)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglhcf.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001150 12567403474 016332� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglhcf # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.43137)(0.0071,0.49804)(0.0286,0.56471)(0.0857,0.69804)(0.1429,0.82745)(0.2857,0.83137)(0.4282,0.83529)(0.5714,0.83922)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) GREEN: (0,0.56863)(0.0071,0.63529)(0.0286,0.68235)(0.0857,0.7451)(0.1429,0.78824)(0.2857,0.72157)(0.4282,0.75294)(0.5714,0.81961)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) BLUE: (0,0.54118)(0.0071,0.61569)(0.0286,0.65882)(0.0857,0.69804)(0.1429,0.70196)(0.2857,0.64314)(0.4282,0.7098)(0.5714,0.80784)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglhcm.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001150 12567403474 016341� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglhcm # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.43137)(0.0071,0.49804)(0.0286,0.56471)(0.0857,0.69804)(0.1429,0.82745)(0.2857,0.83137)(0.4286,0.83529)(0.5714,0.83922)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) GREEN: (0,0.56863)(0.0071,0.63529)(0.0286,0.68235)(0.0857,0.7451)(0.1429,0.78824)(0.2857,0.72157)(0.4286,0.75294)(0.5714,0.81961)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) BLUE: (0,0.54118)(0.0071,0.61569)(0.0286,0.65882)(0.0857,0.69804)(0.1429,0.70196)(0.2857,0.64314)(0.4286,0.7098)(0.5714,0.80784)(0.7143,0.87059)(0.8571,0.93333)(1,0.96078) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglhwf.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001147 12567403474 016364� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglhwf # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.41176)(0.0071,0.46275)(0.0286,0.51373)(0.0857,0.64706)(0.1429,0.82745)(0.2857,0.83137)(0.4282,0.83137)(0.5714,0.83922)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) GREEN: (0,0.59608)(0.0071,0.66275)(0.0286,0.7098)(0.0857,0.75294)(0.1429,0.78824)(0.2857,0.72157)(0.4282,0.75294)(0.5714,0.81961)(0.7143,0.86667)(0.8571,0.93333)(1,0.96863) BLUE: (0,0.52157)(0.0071,0.57255)(0.0286,0.60784)(0.0857,0.6549)(0.1429,0.70196)(0.2857,0.64314)(0.4282,0.7098)(0.5714,0.80784)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglhwm.sao������������������������������������������������������������������������000644 �000765 �000000 �00000001147 12567403474 016373� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglhwm # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.41176)(0.0071,0.46275)(0.0286,0.51373)(0.0857,0.64706)(0.1429,0.82745)(0.2857,0.83137)(0.4286,0.83137)(0.5714,0.83922)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) GREEN: (0,0.59608)(0.0071,0.66275)(0.0286,0.7098)(0.0857,0.75294)(0.1429,0.78824)(0.2857,0.72157)(0.4286,0.75294)(0.5714,0.81961)(0.7143,0.86667)(0.8571,0.93333)(1,0.96863) BLUE: (0,0.52157)(0.0071,0.57255)(0.0286,0.60784)(0.0857,0.6549)(0.1429,0.70196)(0.2857,0.64314)(0.4286,0.7098)(0.5714,0.80784)(0.7143,0.87059)(0.8571,0.93333)(1,0.96471) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpglpof.sao������������������������������������������������������������������������000644 �000765 �000000 �00000000675 12567403474 016371� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglpof # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.54118)(0.0125,0.63529)(0.05,0.67843)(0.15,0.72157)(0.25,0.79216)(0.5,0.85882)(0.7494,0.93725)(1,0.95686) GREEN: (0,0.61176)(0.0125,0.69412)(0.05,0.7451)(0.15,0.78431)(0.25,0.84314)(0.5,0.89804)(0.7494,0.94902)(1,0.97255) BLUE: (0,0.70196)(0.0125,0.79216)(0.05,0.83529)(0.15,0.87451)(0.25,0.9098)(0.5,0.94118)(0.7494,0.98824)(1,0.99608) �������������������������������������������������������������������saods9/ds9/cmaps/tpglpom.sao������������������������������������������������������������������������000644 �000765 �000000 �00000000667 12567403474 016401� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpglpom # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.54118)(0.0125,0.63529)(0.05,0.67843)(0.15,0.72157)(0.25,0.79216)(0.5,0.85882)(0.75,0.93725)(1,0.95686) GREEN: (0,0.61176)(0.0125,0.69412)(0.05,0.7451)(0.15,0.78431)(0.25,0.84314)(0.5,0.89804)(0.75,0.94902)(1,0.97255) BLUE: (0,0.70196)(0.0125,0.79216)(0.05,0.83529)(0.15,0.87451)(0.25,0.9098)(0.5,0.94118)(0.75,0.98824)(1,0.99608) �������������������������������������������������������������������������saods9/ds9/cmaps/tpsfhf.sao�������������������������������������������������������������������������000644 �000765 �000000 �00000002015 12567403474 016176� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpsfhf # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.17647)(0.0833,0.17647)(0.0833,0.16078)(0.1667,0.16078)(0.1667,0.21569)(0.3334,0.21569)(0.3334,0.27451)(0.5004,0.27451)(0.5004,0.37255)(0.6666,0.37255)(0.6666,0.45098)(0.8333,0.45098)(0.8333,0.56078)(0.9167,0.56078)(0.9167,0.66667)(0.9667,0.66667)(0.9667,0.77647)(0.9833,0.77647)(0.9833,0.88627)(1,0.88627) GREEN: (0,0.49804)(0.0833,0.49804)(0.0833,0.52941)(0.1667,0.52941)(0.1667,0.57255)(0.3334,0.57255)(0.3334,0.60392)(0.5004,0.60392)(0.5004,0.66275)(0.6666,0.66275)(0.6666,0.70196)(0.8333,0.70196)(0.8333,0.76471)(0.9167,0.76471)(0.9167,0.81569)(0.9667,0.81569)(0.9667,0.89804)(0.9833,0.89804)(0.9833,0.94118)(1,0.94118) BLUE: (0,0.58039)(0.0833,0.58039)(0.0833,0.63137)(0.1667,0.63137)(0.1667,0.68627)(0.3334,0.68627)(0.3334,0.7451)(0.5004,0.7451)(0.5004,0.8)(0.6666,0.8)(0.6666,0.81176)(0.8333,0.81176)(0.8333,0.85098)(0.9167,0.85098)(0.9167,0.85882)(0.9667,0.85882)(0.9667,0.90588)(0.9833,0.90588)(0.9833,0.9451)(1,0.9451) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpsfhm.sao�������������������������������������������������������������������������000644 �000765 �000000 �00000001773 12567403474 016217� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpsfhm # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.17647)(0.0833,0.17647)(0.0833,0.16078)(0.1667,0.16078)(0.1667,0.21569)(0.3333,0.21569)(0.3333,0.27451)(0.5,0.27451)(0.5,0.37255)(0.6667,0.37255)(0.6667,0.45098)(0.8333,0.45098)(0.8333,0.56078)(0.9167,0.56078)(0.9167,0.66667)(0.9667,0.66667)(0.9667,0.77647)(0.9833,0.77647)(0.9833,0.88627)(1,0.88627) GREEN: (0,0.49804)(0.0833,0.49804)(0.0833,0.52941)(0.1667,0.52941)(0.1667,0.57255)(0.3333,0.57255)(0.3333,0.60392)(0.5,0.60392)(0.5,0.66275)(0.6667,0.66275)(0.6667,0.70196)(0.8333,0.70196)(0.8333,0.76471)(0.9167,0.76471)(0.9167,0.81569)(0.9667,0.81569)(0.9667,0.89804)(0.9833,0.89804)(0.9833,0.94118)(1,0.94118) BLUE: (0,0.58039)(0.0833,0.58039)(0.0833,0.63137)(0.1667,0.63137)(0.1667,0.68627)(0.3333,0.68627)(0.3333,0.7451)(0.5,0.7451)(0.5,0.8)(0.6667,0.8)(0.6667,0.81176)(0.8333,0.81176)(0.8333,0.85098)(0.9167,0.85098)(0.9167,0.85882)(0.9667,0.85882)(0.9667,0.90588)(0.9833,0.90588)(0.9833,0.9451)(1,0.9451) �����saods9/ds9/cmaps/tpusarf.sao������������������������������������������������������������������������000644 �000765 �000000 �00000006713 12567403474 016401� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpusarf # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.61176)(0.0139,0.63922)(0.0278,0.67451)(0.0417,0.70196)(0.0556,0.71765)(0.0694,0.73333)(0.0833,0.75686)(0.0972,0.76863)(0.1111,0.78431)(0.125,0.79216)(0.1389,0.79608)(0.1528,0.80392)(0.1667,0.80784)(0.1806,0.81569)(0.1944,0.82353)(0.2083,0.82745)(0.2222,0.83529)(0.2361,0.84706)(0.25,0.85882)(0.2639,0.87059)(0.2778,0.87451)(0.2917,0.87451)(0.3056,0.87451)(0.3194,0.87059)(0.3333,0.87843)(0.3472,0.87451)(0.3611,0.87451)(0.375,0.87059)(0.3889,0.87059)(0.4028,0.87059)(0.4167,0.86667)(0.4306,0.86275)(0.4444,0.86275)(0.4583,0.8549)(0.4722,0.85882)(0.4861,0.86275)(0.5,0.85882)(0.5139,0.85882)(0.5278,0.8549)(0.5417,0.8549)(0.5556,0.8549)(0.5694,0.8549)(0.5833,0.85882)(0.5972,0.85882)(0.6111,0.85882)(0.625,0.85882)(0.6389,0.8549)(0.6528,0.8549)(0.6667,0.8549)(0.6806,0.8549)(0.6944,0.8549)(0.7083,0.8549)(0.7222,0.85098)(0.7361,0.85098)(0.75,0.84706)(0.7639,0.84314)(0.7778,0.84314)(0.7917,0.84314)(0.8056,0.84706)(0.8194,0.85098)(0.8333,0.8549)(0.8472,0.85098)(0.8611,0.8549)(0.875,0.85882)(0.8889,0.85882)(0.9028,0.86667)(0.9167,0.87451)(0.9306,0.88235)(0.9444,0.88627)(0.9583,0.8902)(0.9722,0.89412)(0.9861,0.89804)(1,0.90196) GREEN: (0,0.59608)(0.0139,0.61961)(0.0278,0.66275)(0.0417,0.69412)(0.0556,0.7098)(0.0694,0.72941)(0.0833,0.7451)(0.0972,0.76863)(0.1111,0.77647)(0.125,0.78039)(0.1389,0.78431)(0.1528,0.79216)(0.1667,0.79608)(0.1806,0.80392)(0.1944,0.80784)(0.2083,0.81569)(0.2222,0.81961)(0.2361,0.83137)(0.25,0.83529)(0.2639,0.84314)(0.2778,0.83529)(0.2917,0.83137)(0.3056,0.82745)(0.3194,0.82353)(0.3333,0.81176)(0.3472,0.8)(0.3611,0.79216)(0.375,0.78431)(0.3889,0.77255)(0.4028,0.76863)(0.4167,0.76471)(0.4306,0.76078)(0.4444,0.76078)(0.4583,0.76863)(0.4722,0.77255)(0.4861,0.77647)(0.5,0.77647)(0.5139,0.78431)(0.5278,0.79216)(0.5417,0.79608)(0.5556,0.80392)(0.5694,0.80784)(0.5833,0.81176)(0.5972,0.81176)(0.6111,0.81176)(0.625,0.81176)(0.6389,0.81569)(0.6528,0.81569)(0.6667,0.81569)(0.6806,0.81569)(0.6944,0.81569)(0.7083,0.81569)(0.7222,0.81176)(0.7361,0.80784)(0.75,0.80784)(0.7639,0.81569)(0.7778,0.81569)(0.7917,0.81961)(0.8056,0.82353)(0.8194,0.82745)(0.8333,0.83529)(0.8472,0.83922)(0.8611,0.84706)(0.875,0.8549)(0.8889,0.85882)(0.9028,0.86275)(0.9167,0.87059)(0.9306,0.87451)(0.9444,0.87843)(0.9583,0.88627)(0.9722,0.8902)(0.9861,0.89804)(1,0.90196) BLUE: (0,0.56471)(0.0139,0.59216)(0.0278,0.62353)(0.0417,0.64706)(0.0556,0.66275)(0.0694,0.68235)(0.0833,0.69804)(0.0972,0.71373)(0.1111,0.72549)(0.125,0.72941)(0.1389,0.73333)(0.1528,0.74118)(0.1667,0.7451)(0.1806,0.74902)(0.1944,0.74902)(0.2083,0.75686)(0.2222,0.76078)(0.2361,0.76471)(0.25,0.76471)(0.2639,0.76078)(0.2778,0.76471)(0.2917,0.76078)(0.3056,0.76078)(0.3194,0.75294)(0.3333,0.74118)(0.3472,0.73725)(0.3611,0.72941)(0.375,0.72157)(0.3889,0.71765)(0.4028,0.71373)(0.4167,0.7098)(0.4306,0.70588)(0.4444,0.70588)(0.4583,0.7098)(0.4722,0.71765)(0.4861,0.72941)(0.5,0.73333)(0.5139,0.74118)(0.5278,0.75686)(0.5417,0.76078)(0.5556,0.76863)(0.5694,0.77255)(0.5833,0.77647)(0.5972,0.77647)(0.6111,0.78039)(0.625,0.78431)(0.6389,0.78824)(0.6528,0.79216)(0.6667,0.79216)(0.6806,0.79216)(0.6944,0.79216)(0.7083,0.79216)(0.7222,0.79216)(0.7361,0.79608)(0.75,0.79608)(0.7639,0.8)(0.7778,0.80392)(0.7917,0.80784)(0.8056,0.81176)(0.8194,0.82353)(0.8333,0.82745)(0.8472,0.83137)(0.8611,0.83922)(0.875,0.84706)(0.8889,0.85882)(0.9028,0.8549)(0.9167,0.86275)(0.9306,0.87451)(0.9444,0.87843)(0.9583,0.88627)(0.9722,0.89412)(0.9861,0.89804)(1,0.90196) �����������������������������������������������������saods9/ds9/cmaps/tpusarm.sao������������������������������������������������������������������������000644 �000765 �000000 �00000004522 12567403475 016405� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpusarm # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.61176)(0.0208,0.65882)(0.0417,0.70196)(0.0625,0.72549)(0.0833,0.75686)(0.1042,0.77647)(0.125,0.79216)(0.1458,0.8)(0.1667,0.80784)(0.1875,0.81961)(0.2083,0.82745)(0.2292,0.84314)(0.25,0.85882)(0.2708,0.87059)(0.2917,0.87451)(0.3125,0.87059)(0.3333,0.87843)(0.3542,0.87843)(0.375,0.87059)(0.3958,0.87059)(0.4167,0.86667)(0.4375,0.86275)(0.4583,0.8549)(0.4792,0.85882)(0.5,0.85882)(0.5208,0.8549)(0.5417,0.8549)(0.5625,0.8549)(0.5833,0.85882)(0.6042,0.85882)(0.625,0.85882)(0.6458,0.8549)(0.6667,0.8549)(0.6875,0.8549)(0.7083,0.8549)(0.7292,0.85098)(0.75,0.84706)(0.7708,0.84314)(0.7917,0.84314)(0.8125,0.85098)(0.8333,0.8549)(0.8542,0.85098)(0.875,0.85882)(0.8958,0.86275)(0.9167,0.87451)(0.9375,0.88627)(0.9583,0.8902)(0.9792,0.89412)(1,0.90196) GREEN: (0,0.59608)(0.0208,0.64314)(0.0417,0.69412)(0.0625,0.72157)(0.0833,0.7451)(0.1042,0.77255)(0.125,0.78039)(0.1458,0.78824)(0.1667,0.79608)(0.1875,0.80392)(0.2083,0.81569)(0.2292,0.82745)(0.25,0.83529)(0.2708,0.84314)(0.2917,0.83137)(0.3125,0.82353)(0.3333,0.81176)(0.3542,0.79608)(0.375,0.78431)(0.3958,0.77255)(0.4167,0.76471)(0.4375,0.76078)(0.4583,0.76863)(0.4792,0.77255)(0.5,0.77647)(0.5208,0.78824)(0.5417,0.79608)(0.5625,0.80392)(0.5833,0.81176)(0.6042,0.81176)(0.625,0.81176)(0.6458,0.81569)(0.6667,0.81569)(0.6875,0.81569)(0.7083,0.81569)(0.7292,0.80784)(0.75,0.80784)(0.7708,0.81569)(0.7917,0.81961)(0.8125,0.82745)(0.8333,0.83529)(0.8542,0.84314)(0.875,0.8549)(0.8958,0.85882)(0.9167,0.87059)(0.9375,0.87843)(0.9583,0.88627)(0.9792,0.89412)(1,0.90196) BLUE: (0,0.56471)(0.0208,0.60784)(0.0417,0.64706)(0.0625,0.67451)(0.0833,0.69804)(0.1042,0.72157)(0.125,0.72941)(0.1458,0.73725)(0.1667,0.7451)(0.1875,0.74902)(0.2083,0.75686)(0.2292,0.76471)(0.25,0.76471)(0.2708,0.76078)(0.2917,0.76078)(0.3125,0.75686)(0.3333,0.74118)(0.3542,0.73333)(0.375,0.72157)(0.3958,0.71765)(0.4167,0.7098)(0.4375,0.70588)(0.4583,0.7098)(0.4792,0.72549)(0.5,0.73333)(0.5208,0.74902)(0.5417,0.76078)(0.5625,0.76863)(0.5833,0.77647)(0.6042,0.78039)(0.625,0.78431)(0.6458,0.79216)(0.6667,0.79216)(0.6875,0.79216)(0.7083,0.79216)(0.7292,0.79608)(0.75,0.79608)(0.7708,0.8)(0.7917,0.80784)(0.8125,0.81961)(0.8333,0.82745)(0.8542,0.83529)(0.875,0.84706)(0.8958,0.85882)(0.9167,0.86275)(0.9375,0.87843)(0.9583,0.88627)(0.9792,0.89412)(1,0.90196) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/tpushuf.sao������������������������������������������������������������������������000644 �000765 �000000 �00000006710 12567403475 016411� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpushuf # created by cptutils 1.46 # Wed Aug 15 23:31:06 2012 PSEUDOCOLOR RED: (0,0.55686)(0.0139,0.58824)(0.0278,0.61569)(0.0417,0.64314)(0.0556,0.66275)(0.0694,0.68235)(0.0833,0.70196)(0.0972,0.72157)(0.1111,0.73725)(0.125,0.7451)(0.1389,0.75686)(0.1528,0.76863)(0.1667,0.77647)(0.1806,0.78431)(0.1944,0.8)(0.2083,0.81569)(0.2222,0.82745)(0.2361,0.84314)(0.25,0.8549)(0.2639,0.86667)(0.2778,0.87451)(0.2917,0.87843)(0.3056,0.87451)(0.3194,0.87059)(0.3333,0.87843)(0.3472,0.87451)(0.3611,0.87451)(0.375,0.87059)(0.3889,0.87059)(0.4028,0.87059)(0.4167,0.86667)(0.4306,0.86275)(0.4444,0.86275)(0.4583,0.8549)(0.4722,0.85882)(0.4861,0.86275)(0.5,0.85882)(0.5139,0.85882)(0.5278,0.85882)(0.5417,0.8549)(0.5556,0.85098)(0.5694,0.8549)(0.5833,0.85882)(0.5972,0.85882)(0.6111,0.85882)(0.625,0.85882)(0.6389,0.8549)(0.6528,0.8549)(0.6667,0.8549)(0.6806,0.8549)(0.6944,0.8549)(0.7083,0.8549)(0.7222,0.85098)(0.7361,0.85098)(0.75,0.84706)(0.7639,0.84314)(0.7778,0.84706)(0.7917,0.84314)(0.8056,0.84706)(0.8194,0.85098)(0.8333,0.85098)(0.8472,0.84706)(0.8611,0.8549)(0.875,0.85882)(0.8889,0.85882)(0.9028,0.86667)(0.9167,0.87451)(0.9306,0.88235)(0.9444,0.88627)(0.9583,0.8902)(0.9722,0.89412)(0.9861,0.89804)(1,0.90196) GREEN: (0,0.59608)(0.0139,0.63137)(0.0278,0.67843)(0.0417,0.7098)(0.0556,0.73333)(0.0694,0.75294)(0.0833,0.77255)(0.0972,0.79608)(0.1111,0.81176)(0.125,0.81961)(0.1389,0.81961)(0.1528,0.82353)(0.1667,0.82353)(0.1806,0.83137)(0.1944,0.83529)(0.2083,0.83529)(0.2222,0.84314)(0.2361,0.84314)(0.25,0.84314)(0.2639,0.84314)(0.2778,0.83529)(0.2917,0.83137)(0.3056,0.82745)(0.3194,0.82353)(0.3333,0.81176)(0.3472,0.8)(0.3611,0.79216)(0.375,0.78431)(0.3889,0.77255)(0.4028,0.76863)(0.4167,0.76471)(0.4306,0.76078)(0.4444,0.76078)(0.4583,0.76863)(0.4722,0.77255)(0.4861,0.77647)(0.5,0.77647)(0.5139,0.78431)(0.5278,0.79216)(0.5417,0.79608)(0.5556,0.80392)(0.5694,0.80784)(0.5833,0.81176)(0.5972,0.81176)(0.6111,0.81176)(0.625,0.81176)(0.6389,0.81569)(0.6528,0.81569)(0.6667,0.81569)(0.6806,0.81569)(0.6944,0.81569)(0.7083,0.81569)(0.7222,0.81176)(0.7361,0.80784)(0.75,0.80784)(0.7639,0.81569)(0.7778,0.81961)(0.7917,0.82353)(0.8056,0.82353)(0.8194,0.82745)(0.8333,0.83529)(0.8472,0.84314)(0.8611,0.85098)(0.875,0.8549)(0.8889,0.85882)(0.9028,0.86275)(0.9167,0.87059)(0.9306,0.87451)(0.9444,0.87843)(0.9583,0.88627)(0.9722,0.8902)(0.9861,0.89804)(1,0.90196) BLUE: (0,0.56863)(0.0139,0.59608)(0.0278,0.63922)(0.0417,0.66667)(0.0556,0.68235)(0.0694,0.70196)(0.0833,0.72157)(0.0972,0.7451)(0.1111,0.76078)(0.125,0.76078)(0.1389,0.76471)(0.1528,0.76863)(0.1667,0.76471)(0.1806,0.76863)(0.1944,0.77255)(0.2083,0.77255)(0.2222,0.77255)(0.2361,0.77255)(0.25,0.76863)(0.2639,0.76471)(0.2778,0.76471)(0.2917,0.76078)(0.3056,0.76078)(0.3194,0.75294)(0.3333,0.74118)(0.3472,0.73725)(0.3611,0.72941)(0.375,0.72157)(0.3889,0.71765)(0.4028,0.71373)(0.4167,0.7098)(0.4306,0.70588)(0.4444,0.70588)(0.4583,0.7098)(0.4722,0.71765)(0.4861,0.72941)(0.5,0.73333)(0.5139,0.74118)(0.5278,0.75686)(0.5417,0.76078)(0.5556,0.76863)(0.5694,0.77255)(0.5833,0.77647)(0.5972,0.77647)(0.6111,0.78039)(0.625,0.78431)(0.6389,0.78824)(0.6528,0.79216)(0.6667,0.79216)(0.6806,0.79216)(0.6944,0.79216)(0.7083,0.79216)(0.7222,0.79216)(0.7361,0.79608)(0.75,0.79608)(0.7639,0.8)(0.7778,0.80392)(0.7917,0.80784)(0.8056,0.81176)(0.8194,0.82353)(0.8333,0.82745)(0.8472,0.83529)(0.8611,0.84314)(0.875,0.84706)(0.8889,0.85882)(0.9028,0.8549)(0.9167,0.86275)(0.9306,0.87451)(0.9444,0.87843)(0.9583,0.88627)(0.9722,0.8902)(0.9861,0.89804)(1,0.90196) ��������������������������������������������������������saods9/ds9/cmaps/tpushum.sao������������������������������������������������������������������������000644 �000765 �000000 �00000004522 12567403475 016417� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# SAOimage color table # tpushum # created by cptutils 1.46 # Wed Aug 15 23:31:07 2012 PSEUDOCOLOR RED: (0,0.55686)(0.0208,0.6)(0.0417,0.64314)(0.0625,0.67451)(0.0833,0.70196)(0.1042,0.72941)(0.125,0.7451)(0.1458,0.76078)(0.1667,0.77647)(0.1875,0.79216)(0.2083,0.81569)(0.2292,0.83529)(0.25,0.8549)(0.2708,0.87059)(0.2917,0.87843)(0.3125,0.87059)(0.3333,0.87843)(0.3542,0.87843)(0.375,0.87059)(0.3958,0.87059)(0.4167,0.86667)(0.4375,0.86275)(0.4583,0.8549)(0.4792,0.85882)(0.5,0.85882)(0.5208,0.85882)(0.5417,0.8549)(0.5625,0.85098)(0.5833,0.85882)(0.6042,0.85882)(0.625,0.85882)(0.6458,0.8549)(0.6667,0.8549)(0.6875,0.8549)(0.7083,0.8549)(0.7292,0.85098)(0.75,0.84706)(0.7708,0.84314)(0.7917,0.84314)(0.8125,0.85098)(0.8333,0.85098)(0.8542,0.85098)(0.875,0.85882)(0.8958,0.86275)(0.9167,0.87451)(0.9375,0.88627)(0.9583,0.8902)(0.9792,0.89804)(1,0.90196) GREEN: (0,0.59608)(0.0208,0.6549)(0.0417,0.7098)(0.0625,0.7451)(0.0833,0.77255)(0.1042,0.80392)(0.125,0.81961)(0.1458,0.81961)(0.1667,0.82353)(0.1875,0.83137)(0.2083,0.83529)(0.2292,0.84314)(0.25,0.84314)(0.2708,0.84314)(0.2917,0.83137)(0.3125,0.82353)(0.3333,0.81176)(0.3542,0.79608)(0.375,0.78431)(0.3958,0.77255)(0.4167,0.76471)(0.4375,0.76078)(0.4583,0.76863)(0.4792,0.77255)(0.5,0.77647)(0.5208,0.78824)(0.5417,0.79608)(0.5625,0.80784)(0.5833,0.81176)(0.6042,0.81176)(0.625,0.81176)(0.6458,0.81569)(0.6667,0.81569)(0.6875,0.81569)(0.7083,0.81569)(0.7292,0.80784)(0.75,0.80784)(0.7708,0.81569)(0.7917,0.82353)(0.8125,0.82745)(0.8333,0.83529)(0.8542,0.84706)(0.875,0.8549)(0.8958,0.85882)(0.9167,0.87059)(0.9375,0.87843)(0.9583,0.88627)(0.9792,0.89412)(1,0.90196) BLUE: (0,0.56863)(0.0208,0.61961)(0.0417,0.66667)(0.0625,0.69412)(0.0833,0.72157)(0.1042,0.75294)(0.125,0.76078)(0.1458,0.76471)(0.1667,0.76471)(0.1875,0.76863)(0.2083,0.77255)(0.2292,0.77255)(0.25,0.76863)(0.2708,0.76078)(0.2917,0.76078)(0.3125,0.75686)(0.3333,0.74118)(0.3542,0.73333)(0.375,0.72157)(0.3958,0.71765)(0.4167,0.7098)(0.4375,0.70588)(0.4583,0.7098)(0.4792,0.72549)(0.5,0.73333)(0.5208,0.74902)(0.5417,0.76078)(0.5625,0.76863)(0.5833,0.77647)(0.6042,0.78039)(0.625,0.78431)(0.6458,0.79216)(0.6667,0.79216)(0.6875,0.79216)(0.7083,0.79216)(0.7292,0.79608)(0.75,0.79608)(0.7708,0.8)(0.7917,0.80784)(0.8125,0.81961)(0.8333,0.82745)(0.8542,0.83922)(0.875,0.84706)(0.8958,0.85882)(0.9167,0.86275)(0.9375,0.87843)(0.9583,0.88627)(0.9792,0.89412)(1,0.90196) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������saods9/ds9/cmaps/viridis.lut������������������������������������������������������������������������000644 �000765 �000000 �00000020422 12567376460 016405� 0����������������������������������������������������������������������������������������������������ustar�00joye����������������������������wheel���������������������������000000 �000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������# matplotlib _cm.py 0.26700401 0.00487433 0.32941519 0.26851048 0.00960483 0.33542652 0.26994384 0.01462494 0.34137895 0.27130489 0.01994186 0.34726862 0.27259384 0.02556309 0.35309303 0.27380934 0.03149748 0.35885256 0.27495242 0.03775181 0.36454323 0.27602238 0.04416723 0.37016418 0.2770184 0.05034437 0.37571452 0.27794143 0.05632444 0.38119074 0.27879067 0.06214536 0.38659204 0.2795655 0.06783587 0.39191723 0.28026658 0.07341724 0.39716349 0.28089358 0.07890703 0.40232944 0.28144581 0.0843197 0.40741404 0.28192358 0.08966622 0.41241521 0.28232739 0.09495545 0.41733086 0.28265633 0.10019576 0.42216032 0.28291049 0.10539345 0.42690202 0.28309095 0.11055307 0.43155375 0.28319704 0.11567966 0.43611482 0.28322882 0.12077701 0.44058404 0.28318684 0.12584799 0.44496 0.283072 0.13089477 0.44924127 0.28288389 0.13592005 0.45342734 0.28262297 0.14092556 0.45751726 0.28229037 0.14591233 0.46150995 0.28188676 0.15088147 0.46540474 0.28141228 0.15583425 0.46920128 0.28086773 0.16077132 0.47289909 0.28025468 0.16569272 0.47649762 0.27957399 0.17059884 0.47999675 0.27882618 0.1754902 0.48339654 0.27801236 0.18036684 0.48669702 0.27713437 0.18522836 0.48989831 0.27619376 0.19007447 0.49300074 0.27519116 0.1949054 0.49600488 0.27412802 0.19972086 0.49891131 0.27300596 0.20452049 0.50172076 0.27182812 0.20930306 0.50443413 0.27059473 0.21406899 0.50705243 0.26930756 0.21881782 0.50957678 0.26796846 0.22354911 0.5120084 0.26657984 0.2282621 0.5143487 0.2651445 0.23295593 0.5165993 0.2636632 0.23763078 0.51876163 0.26213801 0.24228619 0.52083736 0.26057103 0.2469217 0.52282822 0.25896451 0.25153685 0.52473609 0.25732244 0.2561304 0.52656332 0.25564519 0.26070284 0.52831152 0.25393498 0.26525384 0.52998273 0.25219404 0.26978306 0.53157905 0.25042462 0.27429024 0.53310261 0.24862899 0.27877509 0.53455561 0.2468114 0.28323662 0.53594093 0.24497208 0.28767547 0.53726018 0.24311324 0.29209154 0.53851561 0.24123708 0.29648471 0.53970946 0.23934575 0.30085494 0.54084398 0.23744138 0.30520222 0.5419214 0.23552606 0.30952657 0.54294396 0.23360277 0.31382773 0.54391424 0.2316735 0.3181058 0.54483444 0.22973926 0.32236127 0.54570633 0.22780192 0.32659432 0.546532 0.2258633 0.33080515 0.54731353 0.22392515 0.334994 0.54805291 0.22198915 0.33916114 0.54875211 0.22005691 0.34330688 0.54941304 0.21812995 0.34743154 0.55003755 0.21620971 0.35153548 0.55062743 0.21429757 0.35561907 0.5511844 0.21239477 0.35968273 0.55171011 0.2105031 0.36372671 0.55220646 0.20862342 0.36775151 0.55267486 0.20675628 0.37175775 0.55311653 0.20490257 0.37574589 0.55353282 0.20306309 0.37971644 0.55392505 0.20123854 0.38366989 0.55429441 0.1994295 0.38760678 0.55464205 0.1976365 0.39152762 0.55496905 0.19585993 0.39543297 0.55527637 0.19410009 0.39932336 0.55556494 0.19235719 0.40319934 0.55583559 0.19063135 0.40706148 0.55608907 0.18892259 0.41091033 0.55632606 0.18723083 0.41474645 0.55654717 0.18555593 0.4185704 0.55675292 0.18389763 0.42238275 0.55694377 0.18225561 0.42618405 0.5571201 0.18062949 0.42997486 0.55728221 0.17901879 0.43375572 0.55743035 0.17742298 0.4375272 0.55756466 0.17584148 0.44128981 0.55768526 0.17427363 0.4450441 0.55779216 0.17271876 0.4487906 0.55788532 0.17117615 0.4525298 0.55796464 0.16964573 0.45626209 0.55803034 0.16812641 0.45998802 0.55808199 0.1666171 0.46370813 0.55811913 0.16511703 0.4674229 0.55814141 0.16362543 0.47113278 0.55814842 0.16214155 0.47483821 0.55813967 0.16066467 0.47853961 0.55811466 0.15919413 0.4822374 0.5580728 0.15772933 0.48593197 0.55801347 0.15626973 0.4896237 0.557936 0.15481488 0.49331293 0.55783967 0.15336445 0.49700003 0.55772371 0.1519182 0.50068529 0.55758733 0.15047605 0.50436904 0.55742968 0.14903918 0.50805136 0.5572505 0.14760731 0.51173263 0.55704861 0.14618026 0.51541316 0.55682271 0.14475863 0.51909319 0.55657181 0.14334327 0.52277292 0.55629491 0.14193527 0.52645254 0.55599097 0.14053599 0.53013219 0.55565893 0.13914708 0.53381201 0.55529773 0.13777048 0.53749213 0.55490625 0.1364085 0.54117264 0.55448339 0.13506561 0.54485335 0.55402906 0.13374299 0.54853458 0.55354108 0.13244401 0.55221637 0.55301828 0.13117249 0.55589872 0.55245948 0.1299327 0.55958162 0.55186354 0.12872938 0.56326503 0.55122927 0.12756771 0.56694891 0.55055551 0.12645338 0.57063316 0.5498411 0.12539383 0.57431754 0.54908564 0.12439474 0.57800205 0.5482874 0.12346281 0.58168661 0.54744498 0.12260562 0.58537105 0.54655722 0.12183122 0.58905521 0.54562298 0.12114807 0.59273889 0.54464114 0.12056501 0.59642187 0.54361058 0.12009154 0.60010387 0.54253043 0.11973756 0.60378459 0.54139999 0.11951163 0.60746388 0.54021751 0.11942341 0.61114146 0.53898192 0.11948255 0.61481702 0.53769219 0.11969858 0.61849025 0.53634733 0.12008079 0.62216081 0.53494633 0.12063824 0.62582833 0.53348834 0.12137972 0.62949242 0.53197275 0.12231244 0.63315277 0.53039808 0.12344358 0.63680899 0.52876343 0.12477953 0.64046069 0.52706792 0.12632581 0.64410744 0.52531069 0.12808703 0.64774881 0.52349092 0.13006688 0.65138436 0.52160791 0.13226797 0.65501363 0.51966086 0.13469183 0.65863619 0.5176488 0.13733921 0.66225157 0.51557101 0.14020991 0.66585927 0.5134268 0.14330291 0.66945881 0.51121549 0.1466164 0.67304968 0.50893644 0.15014782 0.67663139 0.5065889 0.15389405 0.68020343 0.50417217 0.15785146 0.68376525 0.50168574 0.16201598 0.68731632 0.49912906 0.1663832 0.69085611 0.49650163 0.1709484 0.69438405 0.49380294 0.17570671 0.6978996 0.49103252 0.18065314 0.70140222 0.48818938 0.18578266 0.70489133 0.48527326 0.19109018 0.70836635 0.48228395 0.19657063 0.71182668 0.47922108 0.20221902 0.71527175 0.47608431 0.20803045 0.71870095 0.4728733 0.21400015 0.72211371 0.46958774 0.22012381 0.72550945 0.46622638 0.2263969 0.72888753 0.46278934 0.23281498 0.73224735 0.45927675 0.2393739 0.73558828 0.45568838 0.24606968 0.73890972 0.45202405 0.25289851 0.74221104 0.44828355 0.25985676 0.74549162 0.44446673 0.26694127 0.74875084 0.44057284 0.27414922 0.75198807 0.4366009 0.28147681 0.75520266 0.43255207 0.28892102 0.75839399 0.42842626 0.29647899 0.76156142 0.42422341 0.30414796 0.76470433 0.41994346 0.31192534 0.76782207 0.41558638 0.3198086 0.77091403 0.41115215 0.3277958 0.77397953 0.40664011 0.33588539 0.7770179 0.40204917 0.34407411 0.78002855 0.39738103 0.35235985 0.78301086 0.39263579 0.36074053 0.78596419 0.38781353 0.3692142 0.78888793 0.38291438 0.37777892 0.79178146 0.3779385 0.38643282 0.79464415 0.37288606 0.39517408 0.79747541 0.36775726 0.40400101 0.80027461 0.36255223 0.4129135 0.80304099 0.35726893 0.42190813 0.80577412 0.35191009 0.43098317 0.80847343 0.34647607 0.44013691 0.81113836 0.3409673 0.44936763 0.81376835 0.33538426 0.45867362 0.81636288 0.32972749 0.46805314 0.81892143 0.32399761 0.47750446 0.82144351 0.31819529 0.4870258 0.82392862 0.31232133 0.49661536 0.82637633 0.30637661 0.5062713 0.82878621 0.30036211 0.51599182 0.83115784 0.29427888 0.52577622 0.83349064 0.2881265 0.5356211 0.83578452 0.28190832 0.5455244 0.83803918 0.27562602 0.55548397 0.84025437 0.26928147 0.5654976 0.8424299 0.26287683 0.57556297 0.84456561 0.25641457 0.58567772 0.84666139 0.24989748 0.59583934 0.84871722 0.24332878 0.60604528 0.8507331 0.23671214 0.61629283 0.85270912 0.23005179 0.62657923 0.85464543 0.22335258 0.63690157 0.85654226 0.21662012 0.64725685 0.85839991 0.20986086 0.65764197 0.86021878 0.20308229 0.66805369 0.86199932 0.19629307 0.67848868 0.86374211 0.18950326 0.68894351 0.86544779 0.18272455 0.69941463 0.86711711 0.17597055 0.70989842 0.86875092 0.16925712 0.72039115 0.87035015 0.16260273 0.73088902 0.87191584 0.15602894 0.74138803 0.87344918 0.14956101 0.75188414 0.87495143 0.14322828 0.76237342 0.87642392 0.13706449 0.77285183 0.87786808 0.13110864 0.78331535 0.87928545 0.12540538 0.79375994 0.88067763 0.12000532 0.80418159 0.88204632 0.11496505 0.81457634 0.88339329 0.11034678 0.82494028 0.88472036 0.10621724 0.83526959 0.88602943 0.1026459 0.84556056 0.88732243 0.09970219 0.8558096 0.88860134 0.09745186 0.86601325 0.88986815 0.09595277 0.87616824 0.89112487 0.09525046 0.88627146 0.89237353 0.09537439 0.89632002 0.89361614 0.09633538 0.90631121 0.89485467 0.09812496 0.91624212 0.89609127 0.1007168 0.92610579 0.89732977 0.10407067 0.93590444 0.8985704 0.10813094 0.94563626 0.899815 0.11283773 0.95529972 0.90106534 0.11812832 0.96489353 0.90232311 0.12394051 0.97441665 0.90358991 0.13021494 0.98386829 0.90486726 0.13689671 0.99324789 0.90615657 0.1439362������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������